ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmI4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJlaWdlbiIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworc3ViZGlycyA9IFsiYmxhcyJdCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmRhNjEzCi0tLSAvZGV2L251bGwKKysrIGIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1IEBACisjIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9ibGFzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4NDAwMgotLS0gL2Rldi9udWxsCisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTk2IEBACitwcm9qZWN0KEVpZ2VuMykKKworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC41KQorCisjIGd1YXJkIGFnYWluc3QgaW4tc291cmNlIGJ1aWxkcworCitpZigke0NNQUtFX1NPVVJDRV9ESVJ9IFNUUkVRVUFMICR7Q01BS0VfQklOQVJZX0RJUn0pCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkluLXNvdXJjZSBidWlsZHMgbm90IGFsbG93ZWQuIFBsZWFzZSBtYWtlIGEgbmV3IGRpcmVjdG9yeSAoY2FsbGVkIGEgYnVpbGQgZGlyZWN0b3J5KSBhbmQgcnVuIENNYWtlIGZyb20gdGhlcmUuIFlvdSBtYXkgbmVlZCB0byByZW1vdmUgQ01ha2VDYWNoZS50eHQuICIpCitlbmRpZigpCisKKyMgQWxpYXMgRWlnZW5fKl9ESVIgdG8gRWlnZW4zXypfRElSOgorCitzZXQoRWlnZW5fU09VUkNFX0RJUiAke0VpZ2VuM19TT1VSQ0VfRElSfSkKK3NldChFaWdlbl9CSU5BUllfRElSICR7RWlnZW4zX0JJTkFSWV9ESVJ9KQorCisjIGd1YXJkIGFnYWluc3QgYmFkIGJ1aWxkLXR5cGUgc3RyaW5ncworCitpZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisgIHNldChDTUFLRV9CVUlMRF9UWVBFICJSZWxlYXNlIikKK2VuZGlmKCkKKworc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQlVJTERfVFlQRX0iIGNtYWtlX2J1aWxkX3R5cGVfdG9sb3dlcikKK2lmKCAgICBOT1QgY21ha2VfYnVpbGRfdHlwZV90b2xvd2VyIFNUUkVRVUFMICJkZWJ1ZyIKKyAgIEFORCBOT1QgY21ha2VfYnVpbGRfdHlwZV90b2xvd2VyIFNUUkVRVUFMICJyZWxlYXNlIgorICAgQU5EIE5PVCBjbWFrZV9idWlsZF90eXBlX3RvbG93ZXIgU1RSRVFVQUwgInJlbHdpdGhkZWJpbmZvIikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiVW5rbm93biBidWlsZCB0eXBlIFwiJHtDTUFLRV9CVUlMRF9UWVBFfVwiLiBBbGxvd2VkIHZhbHVlcyBhcmUgRGVidWcsIFJlbGVhc2UsIFJlbFdpdGhEZWJJbmZvIChjYXNlLWluc2Vuc2l0aXZlKS4iKQorZW5kaWYoKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJldHJpZXZlIHZlcnNpb24gaW5mb21hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBhdXRvbWF0aWNhbGx5IHBhcnNlIHRoZSB2ZXJzaW9uIG51bWJlcgorZmlsZShSRUFEICIke1BST0pFQ1RfU09VUkNFX0RJUn0vRWlnZW4vc3JjL0NvcmUvdXRpbC9NYWNyb3MuaCIgX2VpZ2VuX3ZlcnNpb25faGVhZGVyKQorc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9XT1JMRF9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbl93b3JsZF92ZXJzaW9uX21hdGNoICIke19laWdlbl92ZXJzaW9uX2hlYWRlcn0iKQorc2V0KEVJR0VOX1dPUkxEX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9NQUpPUl9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbl9tYWpvcl92ZXJzaW9uX21hdGNoICIke19laWdlbl92ZXJzaW9uX2hlYWRlcn0iKQorc2V0KEVJR0VOX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9NSU5PUl9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbl9taW5vcl92ZXJzaW9uX21hdGNoICIke19laWdlbl92ZXJzaW9uX2hlYWRlcn0iKQorc2V0KEVJR0VOX01JTk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorc2V0KEVJR0VOX1ZFUlNJT05fTlVNQkVSICR7RUlHRU5fV09STERfVkVSU0lPTn0uJHtFSUdFTl9NQUpPUl9WRVJTSU9OfS4ke0VJR0VOX01JTk9SX1ZFUlNJT059KQorCisjIGlmIHRoZSBtZXJjdXJpYWwgcHJvZ3JhbSBpcyBhYnNlbnQsIHRoaXMgd2lsbCBsZWF2ZSB0aGUgRUlHRU5fSEdfQ0hBTkdFU0VUIHN0cmluZyBlbXB0eSwKKyMgYnV0IHdvbid0IHN0b3AgQ01ha2UuCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBoZyB0aXAgLVIgJHtDTUFLRV9TT1VSQ0VfRElSfSBPVVRQVVRfVkFSSUFCTEUgRUlHRU5fSEdUSVBfT1VUUFVUKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgaGcgYnJhbmNoIC1SICR7Q01BS0VfU09VUkNFX0RJUn0gT1VUUFVUX1ZBUklBQkxFIEVJR0VOX0JSQU5DSF9PVVRQVVQpCisKKyMgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCAoYWthIGRldmVsb3BtZW50KSBicmFuY2gsIGV4dHJhY3QgdGhlIG1lcmN1cmlhbCBjaGFuZ2VzZXQgbnVtYmVyIGZyb20gdGhlIGhnIHRpcCBvdXRwdXQuLi4KK2lmKEVJR0VOX0JSQU5DSF9PVVRQVVQgTUFUQ0hFUyAiZGVmYXVsdCIpCitzdHJpbmcoUkVHRVggTUFUQ0ggIl5jaGFuZ2VzZXQ6ICpbMC05XSo6KFswLTk7YS1mXSspLioiIEVJR0VOX0hHX0NIQU5HRVNFVF9NQVRDSCAiJHtFSUdFTl9IR1RJUF9PVVRQVVR9IikKK3NldChFSUdFTl9IR19DSEFOR0VTRVQgIiR7Q01BS0VfTUFUQ0hfMX0iKQorZW5kaWYoRUlHRU5fQlJBTkNIX09VVFBVVCBNQVRDSEVTICJkZWZhdWx0IikKKyMuLi5hbmQgc2hvdyBpdCBuZXh0IHRvIHRoZSB2ZXJzaW9uIG51bWJlcgoraWYoRUlHRU5fSEdfQ0hBTkdFU0VUKQorICBzZXQoRUlHRU5fVkVSU0lPTiAiJHtFSUdFTl9WRVJTSU9OX05VTUJFUn0gKG1lcmN1cmlhbCBjaGFuZ2VzZXQgJHtFSUdFTl9IR19DSEFOR0VTRVR9KSIpCitlbHNlKEVJR0VOX0hHX0NIQU5HRVNFVCkKKyAgc2V0KEVJR0VOX1ZFUlNJT04gIiR7RUlHRU5fVkVSU0lPTl9OVU1CRVJ9IikKK2VuZGlmKEVJR0VOX0hHX0NIQU5HRVNFVCkKKworCitpbmNsdWRlKENoZWNrQ1hYQ29tcGlsZXJGbGFnKQoraW5jbHVkZShHTlVJbnN0YWxsRGlycykKKworc2V0KENNQUtFX01PRFVMRV9QQVRIICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmluZCBob3cgdG8gbGluayB0byB0aGUgc3RhbmRhcmQgbGlicmFyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmaW5kX3BhY2thZ2UoU3RhbmRhcmRNYXRoTGlicmFyeSkKKworCitzZXQoRUlHRU5fVEVTVF9DVVNUT01fTElOS0VSX0ZMQUdTICAiIiBDQUNIRSBTVFJJTkcgIkFkZGl0aW9uYWwgbGlua2VyIGZsYWdzIHdoZW4gbGlua2luZyB1bml0IHRlc3RzLiIpCitzZXQoRUlHRU5fVEVTVF9DVVNUT01fQ1hYX0ZMQUdTICAgICAiIiBDQUNIRSBTVFJJTkcgIkFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3Mgd2hlbiBjb21waWxpbmcgdW5pdCB0ZXN0cy4iKQorCitzZXQoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8gIiIpCisKK2lmKE5PVCBTVEFOREFSRF9NQVRIX0xJQlJBUllfRk9VTkQpCisKKyAgbWVzc2FnZShGQVRBTF9FUlJPUgorICAgICJDYW4ndCBsaW5rIHRvIHRoZSBzdGFuZGFyZCBtYXRoIGxpYnJhcnkuIFBsZWFzZSByZXBvcnQgdG8gdGhlIEVpZ2VuIGRldmVsb3BlcnMsIHRlbGxpbmcgdGhlbSBhYm91dCB5b3VyIHBsYXRmb3JtLiIpCisKK2Vsc2UoKQorCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHNldChFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTyAiJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30gJHtTVEFOREFSRF9NQVRIX0xJQlJBUll9IikKKyAgZWxzZSgpCisgICAgc2V0KEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPICIke1NUQU5EQVJEX01BVEhfTElCUkFSWX0iKQorICBlbmRpZigpCisKK2VuZGlmKCkKKworaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgIG1lc3NhZ2UoU1RBVFVTICJTdGFuZGFyZCBsaWJyYXJpZXMgdG8gbGluayB0byBleHBsaWNpdGx5OiAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIlN0YW5kYXJkIGxpYnJhcmllcyB0byBsaW5rIHRvIGV4cGxpY2l0bHk6IG5vbmUiKQorZW5kaWYoKQorCitvcHRpb24oRUlHRU5fQlVJTERfQlRMICJCdWlsZCBiZW5jaG1hcmsgc3VpdGUiIE9GRikKKworIyBEaXNhYmxlIHBrZ2NvbmZpZyBvbmx5IGZvciBuYXRpdmUgV2luZG93cyBidWlsZHMKK2lmKE5PVCBXSU4zMiBPUiBOT1QgQ01BS0VfSE9TVF9TWVNURU1fTkFNRSBNQVRDSEVTIFdpbmRvd3MpCisgIG9wdGlvbihFSUdFTl9CVUlMRF9QS0dDT05GSUcgIkJ1aWxkIHBrZy1jb25maWcgLnBjIGZpbGUgZm9yIEVpZ2VuIiBPTikKK2VuZGlmKCkKKworc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKK29wdGlvbihFSUdFTl9TUExJVF9MQVJHRV9URVNUUyAiU3BsaXQgbGFyZ2UgdGVzdHMgaW50byBzbWFsbGVyIGV4ZWN1dGFibGVzIiBPTikKKworb3B0aW9uKEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SICJVc2Ugcm93LW1ham9yIGFzIGRlZmF1bHQgbWF0cml4IHN0b3JhZ2Ugb3JkZXIiIE9GRikKK2lmKEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IiKQorZW5kaWYoKQorCitzZXQoRUlHRU5fVEVTVF9NQVhfU0laRSAiMzIwIiBDQUNIRSBTVFJJTkcgIk1heGltYWwgbWF0cml4L3ZlY3RvciBzaXplLCBkZWZhdWx0IGlzIDMyMCIpCisKK21hY3JvKGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZyBGTEFHKQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiLSIgIiIgU0ZMQUcxICR7RkxBR30pCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXCsiICJwIiBTRkxBRyAke1NGTEFHMX0pCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCR7RkxBR30gQ09NUElMRVJfU1VQUE9SVF8ke1NGTEFHfSkKKyAgaWYoQ09NUElMRVJfU1VQUE9SVF8ke1NGTEFHfSkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gJHtGTEFHfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZykKKworaWYoTk9UIE1TVkMpCisgICMgV2UgYXNzdW1lIHRoYXQgb3RoZXIgY29tcGlsZXJzIGFyZSBwYXJ0bHkgY29tcGF0aWJsZSB3aXRoIEdOVUNDCisKKyAgIyBjbGFuZyBvdXRwdXRzIHNvbWUgd2FybmluZ3MgZm9yIHVua25vd24gZmxhZ3MgdGhhdCBhcmUgbm90IGNhdWdodCBieSBjaGVja19jeHhfY29tcGlsZXJfZmxhZworICAjIGFkZGluZyAtV2Vycm9yIHR1cm5zIHN1Y2ggd2FybmluZ3MgaW50byBlcnJvcnMKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XZXJyb3IiIENPTVBJTEVSX1NVUFBPUlRfV0VSUk9SKQorICBpZihDT01QSUxFUl9TVVBQT1JUX1dFUlJPUikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIi1XZXJyb3IiKQorICBlbmRpZigpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLXBlZGFudGljIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV2FsbCIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVdleHRyYSIpCisgICNlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XZXZlcnl0aGluZyIpICAgICAgICAgICAgICAjIGNsYW5nCisgIAorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XdW5kZWYiKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XY2FzdC1hbGlnbiIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVdjaGFyLXN1YnNjcmlwdHMiKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1Xbm9uLXZpcnR1YWwtZHRvciIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVd1bnVzZWQtbG9jYWwtdHlwZWRlZnMiKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XcG9pbnRlci1hcml0aCIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVd3cml0ZS1zdHJpbmdzIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV2Zvcm1hdC1zZWN1cml0eSIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVdzaG9ydGVuLTY0LXRvLTMyIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV2xvZ2ljYWwtb3AiKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XZW51bS1jb252ZXJzaW9uIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV2MrKzExLWV4dGVuc2lvbnMiKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XZG91YmxlLXByb21vdGlvbiIpCisjICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1XY29udmVyc2lvbiIpCisgIAorICAjIC1Xc2hhZG93IGlzIGluc2FuZWx5IHRvbyBzdHJpY3Qgd2l0aCBnY2MsIGhvcGVmdWxseSBpdCB3aWxsIGJlY29tZSB1c2FibGUgd2l0aCBnY2MgNgorICAjIGlmKE5PVCBDTUFLRV9DT01QSUxFUl9JU19HTlVDWFggT1IgKENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fR1JFQVRFUiAiNS4wLjAiKSkKKyAgaWYoTk9UIENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKKyAgICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1Xc2hhZG93IikKKyAgZW5kaWYoKQorICAKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV25vLXBzYWJpIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItV25vLXZhcmlhZGljLW1hY3JvcyIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLVduby1sb25nLWxvbmciKQorICAKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItZm5vLWNoZWNrLW5ldyIpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLWZuby1jb21tb24iKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1mc3RyaWN0LWFsaWFzaW5nIikKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItd2Q5ODEiKSAgICAgICAgICAgICAgICAgICAgIyBkaXNhYmxlIElDQydzICJvcGVyYW5kcyBhcmUgZXZhbHVhdGVkIGluIHVuc3BlY2lmaWVkIG9yZGVyIiByZW1hcmsKKyAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItd2QyMzA0IikgICAgICAgICAgICAgICAgICAgIyBkaXNhYmxlIElDQydzICJ3YXJuaW5nICMyMzA0OiBub24tZXhwbGljaXQgY29uc3RydWN0b3Igd2l0aCBzaW5nbGUgYXJndW1lbnQgbWF5IGNhdXNlIGltcGxpY2l0IHR5cGUgY29udmVyc2lvbiIgcHJvZHVjZWQgYnkgLVdub24tdmlydHVhbC1kdG9yCisgIAorICAKKyAgIyBUaGUgLWFuc2kgZmxhZyBtdXN0IGJlIGFkZGVkIGxhc3QsIG90aGVyd2lzZSBpdCBpcyBhbHNvIHVzZWQgYXMgYSBsaW5rZXIgZmxhZyBieSBjaGVja19jeHhfY29tcGlsZXJfZmxhZyBtYWtpbmcgaXQgZmFpbHMKKyAgIyBNb3Jlb3ZlciB3ZSBzaG91bGQgbm90IHNldCBib3RoIC1zdHJpY3QtYW5zaSBhbmQgLWFuc2kKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi1zdHJpY3QtYW5zaSIgQ09NUElMRVJfU1VQUE9SVF9TVFJJQ1RBTlNJKQorICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1RdW51c2VkLWFyZ3VtZW50cyIpICAgICAgICAjIGRpc2FibGUgY2xhbmcgd2FybmluZzogYXJndW1lbnQgdW51c2VkIGR1cmluZyBjb21waWxhdGlvbjogJy1hbnNpJworICAKKyAgaWYoQ09NUElMRVJfU1VQUE9SVF9TVFJJQ1RBTlNJKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RyaWN0LWFuc2kiKQorICBlbHNlKCkKKyAgICBlaV9hZGRfY3h4X2NvbXBpbGVyX2ZsYWcoIi1hbnNpIikKKyAgZW5kaWYoKQorCisgIGlmKEFORFJPSURfTkRLKQorICAgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLXBpZSIpCisgICAgZWlfYWRkX2N4eF9jb21waWxlcl9mbGFnKCItZlBJRSIpCisgIGVuZGlmKCkKKyAgCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiIikKKworICBvcHRpb24oRUlHRU5fVEVTVF9TU0UyICJFbmFibGUvRGlzYWJsZSBTU0UyIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfU1NFMikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1zc2UyIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgU1NFMiBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9TU0UzICJFbmFibGUvRGlzYWJsZSBTU0UzIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfU1NFMykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1zc2UzIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgU1NFMyBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9TU1NFMyAiRW5hYmxlL0Rpc2FibGUgU1NTRTMgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9TU1NFMykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1zc3NlMyIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIFNTU0UzIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTRTRfMSAiRW5hYmxlL0Rpc2FibGUgU1NFNC4xIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfU1NFNF8xKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbXNzZTQuMSIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIFNTRTQuMSBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9TU0U0XzIgIkVuYWJsZS9EaXNhYmxlIFNTRTQuMiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX1NTRTRfMikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1zc2U0LjIiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBTU0U0LjIgaW4gdGVzdHMvZXhhbXBsZXMiKQorICBlbmRpZigpCisKKyAgb3B0aW9uKEVJR0VOX1RFU1RfQVZYICJFbmFibGUvRGlzYWJsZSBBVlggaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9BVlgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tYXZ4IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgQVZYIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX0ZNQSAiRW5hYmxlL0Rpc2FibGUgRk1BIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfRk1BIEFORCBOT1QgRUlHRU5fVEVTVF9ORU9OKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZtYSIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIEZNQSBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9BVlg1MTIgIkVuYWJsZS9EaXNhYmxlIEFWWDUxMiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX0FWWDUxMikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1hdng1MTJmIC1mYWJpLXZlcnNpb249NiAtREVJR0VOX0VOQUJMRV9BVlg1MTIiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBBVlg1MTIgaW4gdGVzdHMvZXhhbXBsZXMiKQorICBlbmRpZigpCisKKyAgb3B0aW9uKEVJR0VOX1RFU1RfRjE2QyAiRW5hYmxlL0Rpc2FibGUgRjE2QyBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX0YxNkMpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tZjE2YyIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIEYxNkMgaW4gdGVzdHMvZXhhbXBsZXMiKQorICBlbmRpZigpCisKKyAgb3B0aW9uKEVJR0VOX1RFU1RfQUxUSVZFQyAiRW5hYmxlL0Rpc2FibGUgQWx0aVZlYyBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX0FMVElWRUMpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tYWx0aXZlYyAtbWFiaT1hbHRpdmVjIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgQWx0aVZlYyBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9WU1ggIkVuYWJsZS9EaXNhYmxlIFZTWCBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX1ZTWCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW02NCAtbXZzeCIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIFZTWCBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9ORU9OICJFbmFibGUvRGlzYWJsZSBOZW9uIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfTkVPTikKKyAgICBpZihFSUdFTl9URVNUX0ZNQSkKKyAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZwdT1uZW9uLXZmcHY0IikKKyAgICBlbHNlKCkKKyAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZwdT1uZW9uIikKKyAgICBlbmRpZigpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tZmxvYXQtYWJpPWhhcmQiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBORU9OIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX05FT042NCAiRW5hYmxlL0Rpc2FibGUgTmVvbiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX05FT042NCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBORU9OIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1pWRUNUT1IgIkVuYWJsZS9EaXNhYmxlIFMzOTBYKHpFQzEzKSBaVkVDVE9SIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfWlZFQ1RPUikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1hcmNoPXoxMyAtbXp2ZWN0b3IiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBTMzkwWCh6RUMxMykgWlZFQ1RPUiBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLWZvcGVubXAiIENPTVBJTEVSX1NVUFBPUlRfT1BFTk1QKQorICBpZihDT01QSUxFUl9TVVBQT1JUX09QRU5NUCkKKyAgICBvcHRpb24oRUlHRU5fVEVTVF9PUEVOTVAgIkVuYWJsZS9EaXNhYmxlIE9wZW5NUCBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICAgIGlmKEVJR0VOX1RFU1RfT1BFTk1QKQorICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1mb3Blbm1wIikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBPcGVuTVAgaW4gdGVzdHMvZXhhbXBsZXMiKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCitlbHNlKE5PVCBNU1ZDKQorCisgICMgQzQxMjcgLSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50CisgICMgQzQ3MTQgLSBtYXJrZWQgYXMgX19mb3JjZWlubGluZSBub3QgaW5saW5lZCAoSSBmYWlsZWQgdG8gZGVhY3RpdmF0ZSBpdCBzZWxlY3RpdmVseSkKKyAgIyAgICAgICAgIFdlIGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBpbiB0aGUgdW5pdCB0ZXN0cyBzaW5jZSBpdCBpcyBjbGVhciB0aGF0IGl0IG9jY3VycworICAjICAgICAgICAgYmVjYXVzZSB3ZSBhcmUgb2Z0ZW50aW1lcyByZXR1cm5pbmcgb2JqZWN0cyB0aGF0IGhhdmUgYSBkZXN0cnVjdG9yIG9yIG1heQorICAjICAgICAgICAgdGhyb3cgZXhjZXB0aW9ucyAtIGluIHBhcnRpY3VsYXIgaW4gdGhlIHVuaXQgdGVzdHMgd2UgYXJlIHRocm93aW5nIGV4dHJhIG1hbnkKKyAgIyAgICAgICAgIGV4Y2VwdGlvbnMgdG8gY292ZXIgaW5kZXhpbmcgZXJyb3JzLgorICAjIEM0NTA1IC0gdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKGltcG9zc2libGUgdG8gZGVhY3RpdmUgc2VsZWN0aXZlbHkpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAvRUhzYyAvd2Q0MTI3IC93ZDQ1MDUgL3dkNDcxNCIpCisKKyAgIyByZXBsYWNlIGFsbCAvV3ggYnkgL1c0CisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvV1swLTldIiAiL1c0IiBDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi9vcGVubXAiIENPTVBJTEVSX1NVUFBPUlRfT1BFTk1QKQorICBpZihDT01QSUxFUl9TVVBQT1JUX09QRU5NUCkKKyAgICBvcHRpb24oRUlHRU5fVEVTVF9PUEVOTVAgIkVuYWJsZS9EaXNhYmxlIE9wZW5NUCBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICAgIGlmKEVJR0VOX1RFU1RfT1BFTk1QKQorICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9vcGVubXAiKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIE9wZW5NUCBpbiB0ZXN0cy9leGFtcGxlcyIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgb3B0aW9uKEVJR0VOX1RFU1RfU1NFMiAiRW5hYmxlL0Rpc2FibGUgU1NFMiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX1NTRTIpCisgICAgaWYoTk9UIENNQUtFX0NMXzY0KQorICAgICAgIyBhcmNoIGlzIG5vdCBzdXBwb3J0ZWQgb24gNjQgYml0IHN5c3RlbXMsIFNTRSBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkuCisgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL2FyY2g6U1NFMiIpCisgICAgZW5kaWYoTk9UIENNQUtFX0NMXzY0KQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBTU0UyIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoRUlHRU5fVEVTVF9TU0UyKQorZW5kaWYoTk9UIE1TVkMpCisKK29wdGlvbihFSUdFTl9URVNUX05PX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gIkRpc2FibGUgZXhwbGljaXQgdmVjdG9yaXphdGlvbiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorb3B0aW9uKEVJR0VOX1RFU1RfWDg3ICJGb3JjZSB1c2luZyBYODcgaW5zdHJ1Y3Rpb25zLiBJbXBsaWVzIG5vIHZlY3Rvcml6YXRpb24uIiBPRkYpCitvcHRpb24oRUlHRU5fVEVTVF8zMkJJVCAiRm9yY2UgZ2VuZXJhdGluZyAzMmJpdCBjb2RlLiIgT0ZGKQorCitpZihFSUdFTl9URVNUX1g4NykKKyAgc2V0KEVJR0VOX1RFU1RfTk9fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBPTikKKyAgaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZwbWF0aD0zODciKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGb3JjaW5nIHVzZSBvZiB4ODcgaW5zdHJ1Y3Rpb25zIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkVJR0VOX1RFU1RfWDg3IGlnbm9yZWQgb24geW91ciBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoRUlHRU5fVEVTVF8zMkJJVCkKKyAgaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbTMyIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRm9yY2luZyBnZW5lcmF0aW9uIG9mIDMyLWJpdCBjb2RlIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkVJR0VOX1RFU1RfMzJCSVQgaWdub3JlZCBvbiB5b3VyIGNvbXBpbGVyIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCitpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04pCisgIGFkZF9kZWZpbml0aW9ucygtREVJR0VOX0RPTlRfVkVDVE9SSVpFPTEpCisgIG1lc3NhZ2UoU1RBVFVTICJEaXNhYmxpbmcgdmVjdG9yaXphdGlvbiBpbiB0ZXN0cy9leGFtcGxlcyIpCitlbmRpZigpCisKK29wdGlvbihFSUdFTl9URVNUX05PX0VYUExJQ0lUX0FMSUdOTUVOVCAiRGlzYWJsZSBleHBsaWNpdCBhbGlnbm1lbnQgKGhlbmNlIHZlY3Rvcml6YXRpb24pIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCitpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX0FMSUdOTUVOVCkKKyAgYWRkX2RlZmluaXRpb25zKC1ERUlHRU5fRE9OVF9BTElHTj0xKQorICBtZXNzYWdlKFNUQVRVUyAiRGlzYWJsaW5nIGFsaWdubWVudCBpbiB0ZXN0cy9leGFtcGxlcyIpCitlbmRpZigpCisKK29wdGlvbihFSUdFTl9URVNUX05PX0VYQ0VQVElPTlMgIkRpc2FibGVzIEMrKyBleGNlcHRpb25zIiBPRkYpCitpZihFSUdFTl9URVNUX05PX0VYQ0VQVElPTlMpCisgIGVpX2FkZF9jeHhfY29tcGlsZXJfZmxhZygiLWZuby1leGNlcHRpb25zIikKKyAgbWVzc2FnZShTVEFUVVMgIkRpc2FibGluZyBleGNlcHRpb25zIGluIHRlc3RzL2V4YW1wbGVzIikKK2VuZGlmKCkKKworb3B0aW9uKEVJR0VOX1RFU1RfQ1hYMTEgIkVuYWJsZSB0ZXN0aW5nIHdpdGggQysrMTEgYW5kIEMrKzExIGZlYXR1cmVzIChlLmcuIFRlbnNvciBtb2R1bGUpLiIgT0ZGKQorCitzZXQoRUlHRU5fQ1VEQV9DT01QVVRFX0FSQ0ggMzAgQ0FDSEUgU1RSSU5HICJUaGUgQ1VEQSBjb21wdXRlIGFyY2hpdGVjdHVyZSBsZXZlbCB0byB0YXJnZXQgd2hlbiBjb21waWxpbmcgQ1VEQSBjb2RlIikKKworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgRUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUgoraWYoRUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUikKKyAgbWVzc2FnZShXQVJOSU5HICJFSUdFTl9JTkNMVURFX0lOU1RBTExfRElSIGlzIGRlcHJlY2F0ZWQuIFVzZSBJTkNMVURFX0lOU1RBTExfRElSIGluc3RlYWQuIikKK2VuZGlmKCkKKworaWYoRUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUiBBTkQgTk9UIElOQ0xVREVfSU5TVEFMTF9ESVIpCisgIHNldChJTkNMVURFX0lOU1RBTExfRElSICR7RUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgICAgIENBQ0hFIFBBVEggIlRoZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gQ01BS0VfUFJFRklYX1BBVEggd2hlcmUgRWlnZW4gaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQiKQorZWxzZSgpCisgIHNldChJTkNMVURFX0lOU1RBTExfRElSCisgICAgICAiJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9L2VpZ2VuMyIKKyAgICAgIENBQ0hFIFBBVEggIlRoZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gQ01BS0VfUFJFRklYX1BBVEggd2hlcmUgRWlnZW4gaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQiCisgICAgICApCitlbmRpZigpCitzZXQoQ01BS0VQQUNLQUdFX0lOU1RBTExfRElSCisgICAgIiR7Q01BS0VfSU5TVEFMTF9EQVRBRElSfS9laWdlbjMvY21ha2UiCisgICAgQ0FDSEUgUEFUSCAiVGhlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byBDTUFLRV9QUkVGSVhfUEFUSCB3aGVyZSBFaWdlbjNDb25maWcuY21ha2UgaXMgaW5zdGFsbGVkIgorICAgICkKK3NldChQS0dDT05GSUdfSU5TVEFMTF9ESVIKKyAgICAiJHtDTUFLRV9JTlNUQUxMX0RBVEFESVJ9L3BrZ2NvbmZpZyIKKyAgICBDQUNIRSBQQVRIICJUaGUgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIENNQUtFX1BSRUZJWF9QQVRIIHdoZXJlIGVpZ2VuMy5wYyBpcyBpbnN0YWxsZWQiCisgICAgKQorCisKKyMgc2ltaWxhciB0byBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMgYnV0IGFwcGVuZCB0aGUgcHJvcGVydHkgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdAorbWFjcm8oZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSB0YXJnZXQgcHJvcCB2YWx1ZSkKKworICBnZXRfdGFyZ2V0X3Byb3BlcnR5KHByZXZpb3VzICR7dGFyZ2V0fSAke3Byb3B9KQorICAjIGlmIHRoZSBwcm9wZXJ0eSB3YXNuJ3QgcHJldmlvdXNseSBzZXQsICR7cHJldmlvdXN9IGlzIG5vdyAicHJldmlvdXMtTk9URk9VTkQiIHdoaWNoIGNtYWtlIGFsbG93cyBjYXRjaGluZyB3aXRoIHBsYWluIGlmKCkKKyAgaWYoTk9UIHByZXZpb3VzKQorICAgIHNldChwcmV2aW91cyAiIikKKyAgZW5kaWYoTk9UIHByZXZpb3VzKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHt0YXJnZXR9IFBST1BFUlRJRVMgJHtwcm9wfSAiJHtwcmV2aW91c30gJHt2YWx1ZX0iKQorZW5kbWFjcm8oZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSkKKworaW5zdGFsbChGSUxFUworICBzaWduYXR1cmVfb2ZfZWlnZW4zX21hdHJpeF9saWJyYXJ5CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0gQ09NUE9ORU5UIERldmVsCisgICkKKworaWYoRUlHRU5fQlVJTERfUEtHQ09ORklHKQorICAgIGNvbmZpZ3VyZV9maWxlKGVpZ2VuMy5wYy5pbiBlaWdlbjMucGMgQE9OTFkpCisgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZWlnZW4zLnBjCisgICAgICAgIERFU1RJTkFUSU9OICR7UEtHQ09ORklHX0lOU1RBTExfRElSfQorICAgICAgICApCitlbmRpZigpCisKK2FkZF9zdWJkaXJlY3RvcnkoRWlnZW4pCisKK2FkZF9zdWJkaXJlY3RvcnkoZG9jIEVYQ0xVREVfRlJPTV9BTEwpCisKK2luY2x1ZGUoRWlnZW5Db25maWd1cmVUZXN0aW5nKQorCisjIGZpeG1lLCBub3Qgc3VyZSB0aGlzIGxpbmUgaXMgc3RpbGwgbmVlZGVkOgorZW5hYmxlX3Rlc3RpbmcoKSAjIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIHJvb3QgQ01ha2VMaXN0cywgc2VlIG1hbiBwYWdlCisKKworaWYoRUlHRU5fTEVBVkVfVEVTVF9JTl9BTExfVEFSR0VUKQorICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpICMgY2FuJ3QgZG8gRVhDTFVERV9GUk9NX0FMTCBoZXJlLCBicmVha3MgQ1Rlc3QKK2Vsc2UoKQorICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QgRVhDTFVERV9GUk9NX0FMTCkKK2VuZGlmKCkKKworaWYoRUlHRU5fTEVBVkVfVEVTVF9JTl9BTExfVEFSR0VUKQorICBhZGRfc3ViZGlyZWN0b3J5KGJsYXMpCisgIGFkZF9zdWJkaXJlY3RvcnkobGFwYWNrKQorZWxzZSgpCisgIGFkZF9zdWJkaXJlY3RvcnkoYmxhcyBFWENMVURFX0ZST01fQUxMKQorICBhZGRfc3ViZGlyZWN0b3J5KGxhcGFjayBFWENMVURFX0ZST01fQUxMKQorZW5kaWYoKQorCisjIGFkZCBTWUNMCitvcHRpb24oRUlHRU5fVEVTVF9TWUNMICJBZGQgU3ljbCBzdXBwb3J0LiIgT0ZGKQoraWYoRUlHRU5fVEVTVF9TWUNMKQorICBzZXQgKENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX1JPT1R9L01vZHVsZXMiICJjbWFrZS9Nb2R1bGVzLyIgIiR7Q01BS0VfTU9EVUxFX1BBVEh9IikKKyAgaW5jbHVkZShGaW5kQ29tcHV0ZUNwcCkKK2VuZGlmKCkKKworYWRkX3N1YmRpcmVjdG9yeSh1bnN1cHBvcnRlZCkKKworYWRkX3N1YmRpcmVjdG9yeShkZW1vcyBFWENMVURFX0ZST01fQUxMKQorCisjIG11c3QgYmUgYWZ0ZXIgdGVzdCBhbmQgdW5zdXBwb3J0ZWQsIGZvciBjb25maWd1cmluZyBidWlsZHRlc3RzLmluCithZGRfc3ViZGlyZWN0b3J5KHNjcmlwdHMgRVhDTFVERV9GUk9NX0FMTCkKKworIyBUT0RPOiBjb25zaWRlciBhbHNvIHJlcGxhY2luZyBFSUdFTl9CVUlMRF9CVEwgYnkgYSBjdXN0b20gdGFyZ2V0ICJtYWtlIGJ0bCI/CitpZihFSUdFTl9CVUlMRF9CVEwpCisgIGFkZF9zdWJkaXJlY3RvcnkoYmVuY2gvYnRsIEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZihFSUdFTl9CVUlMRF9CVEwpCisKK2lmKE5PVCBXSU4zMikKKyAgYWRkX3N1YmRpcmVjdG9yeShiZW5jaC9zcGJlbmNoIEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZihOT1QgV0lOMzIpCisKK2NvbmZpZ3VyZV9maWxlKHNjcmlwdHMvY2Rhc2h0ZXN0aW5nLmNtYWtlLmluIGNkYXNodGVzdGluZy5jbWFrZSBAT05MWSkKKworZWlfdGVzdGluZ19wcmludF9zdW1tYXJ5KCkKKworbWVzc2FnZShTVEFUVVMgIiIpCittZXNzYWdlKFNUQVRVUyAiQ29uZmlndXJlZCBFaWdlbiAke0VJR0VOX1ZFUlNJT05fTlVNQkVSfSIpCittZXNzYWdlKFNUQVRVUyAiIikKKworb3B0aW9uKEVJR0VOX0ZBSUxURVNUICJFbmFibGUgZmFpbHRlc3RzLiIgT0ZGKQoraWYoRUlHRU5fRkFJTFRFU1QpCisgIGFkZF9zdWJkaXJlY3RvcnkoZmFpbHRlc3QpCitlbmRpZigpCisKK3N0cmluZyhUT0xPV0VSICIke0NNQUtFX0dFTkVSQVRPUn0iIGNtYWtlX2dlbmVyYXRvcl90b2xvd2VyKQoraWYoY21ha2VfZ2VuZXJhdG9yX3RvbG93ZXIgTUFUQ0hFUyAibWFrZWZpbGUiKQorICBtZXNzYWdlKFNUQVRVUyAiU29tZSB0aGluZ3MgeW91IGNhbiBkbyBub3c6IikKKyAgbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKyAgbWVzc2FnZShTVEFUVVMgIkNvbW1hbmQgICAgICAgfCAgIERlc2NyaXB0aW9uIikKKyAgbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKKyAgbWVzc2FnZShTVEFUVVMgIm1ha2UgaW5zdGFsbCAgfCBJbnN0YWxsIEVpZ2VuLiBIZWFkZXJzIHdpbGwgYmUgaW5zdGFsbGVkIHRvOiIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICAgIDxDTUFLRV9JTlNUQUxMX1BSRUZJWD4vPElOQ0xVREVfSU5TVEFMTF9ESVI+IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICAgIENNQUtFX0lOU1RBTExfUFJFRklYOiAke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICAgIElOQ0xVREVfSU5TVEFMTF9ESVI6ICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgIENoYW5nZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiBvZiBFaWdlbiBoZWFkZXJzIHVzaW5nOiIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICAgIGNtYWtlIC4gLURDTUFLRV9JTlNUQUxMX1BSRUZJWD15b3VycHJlZml4IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgIE9yOiIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICAgIGNtYWtlIC4gLURJTkNMVURFX0lOU1RBTExfRElSPXlvdXJkaXIiKQorICBtZXNzYWdlKFNUQVRVUyAibWFrZSBkb2MgICAgICB8IEdlbmVyYXRlIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiwgcmVxdWlyZXMgRG94eWdlbiAmIExhVGVYIikKKyAgbWVzc2FnZShTVEFUVVMgIm1ha2UgY2hlY2sgICAgfCBCdWlsZCBhbmQgcnVuIHRoZSB1bml0LXRlc3RzLiBSZWFkIHRoaXMgcGFnZToiKQorICBtZXNzYWdlKFNUQVRVUyAiICAgICAgICAgICAgICB8ICAgaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPVRlc3RzIikKKyAgbWVzc2FnZShTVEFUVVMgIm1ha2UgYmxhcyAgICAgfCBCdWlsZCBCTEFTIGxpYnJhcnkgKG5vdCB0aGUgc2FtZSB0aGluZyBhcyBFaWdlbikiKQorICBtZXNzYWdlKFNUQVRVUyAibWFrZSB1bmluc3RhbGx8IFJlbW92ZXMgZmlsZXMgaW5zdGFsbGVkIGJ5IG1ha2UgaW5zdGFsbCIpCisgIG1lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIlRvIGJ1aWxkL3J1biB0aGUgdW5pdCB0ZXN0cywgcmVhZCB0aGlzIHBhZ2U6IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPVRlc3RzIikKK2VuZGlmKCkKKworbWVzc2FnZShTVEFUVVMgIiIpCisKKworc2V0ICggRUlHRU5fVkVSU0lPTl9TVFJJTkcgJHtFSUdFTl9WRVJTSU9OX05VTUJFUn0gKQorc2V0ICggRUlHRU5fVkVSU0lPTl9NQUpPUiAgJHtFSUdFTl9XT1JMRF9WRVJTSU9OfSApCitzZXQgKCBFSUdFTl9WRVJTSU9OX01JTk9SICAke0VJR0VOX01BSk9SX1ZFUlNJT059ICkKK3NldCAoIEVJR0VOX1ZFUlNJT05fUEFUQ0ggICR7RUlHRU5fTUlOT1JfVkVSU0lPTn0gKQorc2V0ICggRUlHRU5fREVGSU5JVElPTlMgIiIpCitzZXQgKCBFSUdFTl9JTkNMVURFX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtJTkNMVURFX0lOU1RBTExfRElSfSIgKQorc2V0ICggRUlHRU5fUk9PVF9ESVIgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0gKQorCisjIEludGVyZmFjZSBsaWJyYXJpZXMgcmVxdWlyZSBhdCBsZWFzdCBDTWFrZSAzLjAKK2lmIChOT1QgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4wKQorICBpbmNsdWRlIChDTWFrZVBhY2thZ2VDb25maWdIZWxwZXJzKQorCisgICMgSW1wb3J0ZWQgdGFyZ2V0IHN1cHBvcnQKKyAgYWRkX2xpYnJhcnkgKGVpZ2VuIElOVEVSRkFDRSkKKworICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyAoZWlnZW4gSU5URVJGQUNFICR7RUlHRU5fREVGSU5JVElPTlN9KQorICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZWlnZW4gSU5URVJGQUNFCisgICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9PgorICAgICQ8SU5TVEFMTF9JTlRFUkZBQ0U6JHtJTkNMVURFX0lOU1RBTExfRElSfT4KKyAgKQorCisgICMgRXhwb3J0IGFzIHRpdGxlIGNhc2UgRWlnZW4KKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzIChlaWdlbiBQUk9QRVJUSUVTIEVYUE9SVF9OQU1FIEVpZ2VuKQorCisgIGluc3RhbGwgKFRBUkdFVFMgZWlnZW4gRVhQT1JUIEVpZ2VuM1RhcmdldHMpCisKKyAgY29uZmlndXJlX3BhY2thZ2VfY29uZmlnX2ZpbGUgKAorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS9FaWdlbjNDb25maWcuY21ha2UuaW4KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vRWlnZW4zQ29uZmlnLmNtYWtlCisgICAgUEFUSF9WQVJTIEVJR0VOX0lOQ0xVREVfRElSIEVJR0VOX1JPT1RfRElSCisgICAgSU5TVEFMTF9ERVNUSU5BVElPTiAke0NNQUtFUEFDS0FHRV9JTlNUQUxMX0RJUn0KKyAgICBOT19DSEVDS19SRVFVSVJFRF9DT01QT05FTlRTX01BQ1JPICMgRWlnZW4gZG9lcyBub3QgcHJvdmlkZSBjb21wb25lbnRzCisgICkKKyAgIyBSZW1vdmUgQ01BS0VfU0laRU9GX1ZPSURfUCBmcm9tIEVpZ2VuM0NvbmZpZ1ZlcnNpb24uY21ha2Ugc2luY2UgRWlnZW4gZG9lcworICAjIG5vdCBkZXBlbmQgb24gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHNldHRpbmdzIG9yIGxpYnJhcmllcy4gTW9yZQorICAjIHNwZWNpZmljYWxseSwgYW4gRWlnZW4zQ29uZmlnLmNtYWtlIGdlbmVyYXRlZCBmcm9tIGEgNjQgYml0IHRhcmdldCBjYW4gYmUKKyAgIyB1c2VkIGZvciAzMiBiaXQgdGFyZ2V0cyBhcyB3ZWxsIChhbmQgdmljZSB2ZXJzYSkuCisgIHNldCAoX0VpZ2VuM19DTUFLRV9TSVpFT0ZfVk9JRF9QICR7Q01BS0VfU0laRU9GX1ZPSURfUH0pCisgIHVuc2V0IChDTUFLRV9TSVpFT0ZfVk9JRF9QKQorICB3cml0ZV9iYXNpY19wYWNrYWdlX3ZlcnNpb25fZmlsZSAoRWlnZW4zQ29uZmlnVmVyc2lvbi5jbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTiAke0VJR0VOX1ZFUlNJT05fTlVNQkVSfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUEFUSUJJTElUWSBTYW1lTWFqb3JWZXJzaW9uKQorICBzZXQgKENNQUtFX1NJWkVPRl9WT0lEX1AgJHtfRWlnZW4zX0NNQUtFX1NJWkVPRl9WT0lEX1B9KQorCisgICMgVGhlIEVpZ2VuIHRhcmdldCB3aWxsIGJlIGxvY2F0ZWQgaW4gdGhlIEVpZ2VuMyBuYW1lc3BhY2UuIE90aGVyIENNYWtlCisgICMgdGFyZ2V0cyBjYW4gcmVmZXIgdG8gaXQgdXNpbmcgRWlnZW4zOjpFaWdlbi4KKyAgZXhwb3J0IChUQVJHRVRTIGVpZ2VuIE5BTUVTUEFDRSBFaWdlbjM6OiBGSUxFIEVpZ2VuM1RhcmdldHMuY21ha2UpCisgICMgRXhwb3J0IEVpZ2VuMyBwYWNrYWdlIHRvIENNYWtlIHJlZ2lzdHJ5IHN1Y2ggdGhhdCBpdCBjYW4gYmUgZWFzaWx5IGZvdW5kIGJ5CisgICMgQ01ha2UgZXZlbiBpZiBpdCBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIHRvIGEgc3RhbmRhcmQgZGlyZWN0b3J5LgorICBleHBvcnQgKFBBQ0tBR0UgRWlnZW4zKQorCisgIGluc3RhbGwgKEVYUE9SVCBFaWdlbjNUYXJnZXRzIE5BTUVTUEFDRSBFaWdlbjM6OiBERVNUSU5BVElPTiAke0NNQUtFUEFDS0FHRV9JTlNUQUxMX0RJUn0pCisKK2Vsc2UgKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCisgICMgRmFsbGJhY2sgdG8gbGVnYWN5IEVpZ2VuM0NvbmZpZy5jbWFrZSB3aXRob3V0IHRoZSBpbXBvcnRlZCB0YXJnZXQKKyAgCisgICMgSWYgQ01ha2VQYWNrYWdlQ29uZmlnSGVscGVycyBtb2R1bGUgaXMgYXZhaWxhYmxlIChDTWFrZSA+PSAyLjguOCkKKyAgIyBjcmVhdGUgYSByZWxvY2F0YWJsZSBDb25maWcgZmlsZSwgb3RoZXJ3aXNlIGxlYXZlIHRoZSBoYXJkY29kZWQgcGF0aHMgICAgICAgCisgIGluY2x1ZGUoQ01ha2VQYWNrYWdlQ29uZmlnSGVscGVycyBPUFRJT05BTCBSRVNVTFRfVkFSSUFCTEUgQ1BDSF9QQVRIKQorICAKKyAgaWYoQ1BDSF9QQVRIKQorICAgIGNvbmZpZ3VyZV9wYWNrYWdlX2NvbmZpZ19maWxlICgKKyAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS9FaWdlbjNDb25maWdMZWdhY3kuY21ha2UuaW4KKyAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9FaWdlbjNDb25maWcuY21ha2UKKyAgICAgIFBBVEhfVkFSUyBFSUdFTl9JTkNMVURFX0RJUiBFSUdFTl9ST09UX0RJUgorICAgICAgSU5TVEFMTF9ERVNUSU5BVElPTiAke0NNQUtFUEFDS0FHRV9JTlNUQUxMX0RJUn0KKyAgICAgIE5PX0NIRUNLX1JFUVVJUkVEX0NPTVBPTkVOVFNfTUFDUk8gIyBFaWdlbiBkb2VzIG5vdCBwcm92aWRlIGNvbXBvbmVudHMKKyAgICApCisgIGVsc2UoKSAKKyAgICAjIFRoZSBQQUNLQUdFXyogdmFyaWFibGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBjb25maWd1cmVfcGFja2FnZV9jb25maWdfZmlsZQorICAgICMgYnV0IHdpdGhvdXQgaXQgd2UgZGVmaW5lIHRoZW0gbWFudWFsbHkgdG8gdGhlIGhhcmRjb2RlZCBwYXRocworICAgIHNldChQQUNLQUdFX0lOSVQgIiIpCisgICAgc2V0KFBBQ0tBR0VfRUlHRU5fSU5DTFVERV9ESVIgJHtFSUdFTl9JTkNMVURFX0RJUn0pCisgICAgc2V0KFBBQ0tBR0VfRUlHRU5fUk9PVF9ESVIgJHtFSUdFTl9ST09UX0RJUn0pCisgICAgY29uZmlndXJlX2ZpbGUgKCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvRWlnZW4zQ29uZmlnTGVnYWN5LmNtYWtlLmluCisgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vRWlnZW4zQ29uZmlnLmNtYWtlCisgICAgICAgICAgICAgICAgICAgICBAT05MWSBFU0NBUEVfUVVPVEVTICkKKyAgZW5kaWYoKQorCisgIHdyaXRlX2Jhc2ljX3BhY2thZ2VfdmVyc2lvbl9maWxlKCBFaWdlbjNDb25maWdWZXJzaW9uLmNtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OICR7RUlHRU5fVkVSU0lPTl9OVU1CRVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QQVRJQklMSVRZIFNhbWVNYWpvclZlcnNpb24gKQorCitlbmRpZiAoTk9UIENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMCkKKworaW5zdGFsbCAoIEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS9Vc2VFaWdlbjMuY21ha2UKKyAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vRWlnZW4zQ29uZmlnLmNtYWtlCisgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0VpZ2VuM0NvbmZpZ1ZlcnNpb24uY21ha2UKKyAgICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFUEFDS0FHRV9JTlNUQUxMX0RJUn0gKQorCisjIEFkZCB1bmluc3RhbGwgdGFyZ2V0CithZGRfY3VzdG9tX3RhcmdldCAoIHVuaW5zdGFsbAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtUCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvRWlnZW5Vbmluc3RhbGwuY21ha2UpCmRpZmYgLS1naXQgYS9DT1BZSU5HLkJTRCBiL0NPUFlJTkcuQlNECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTcxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkJTRApAQCAtMCwwICsxLDI2IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NPUFlJTkcuR1BMIGIvQ09QWUlORy5HUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcuR1BMCkBAIC0wLDAgKzEsNjc0IEBACisgICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CisKKyBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDxodHRwOi8vZnNmLm9yZy8+CisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBhIGZyZWUsIGNvcHlsZWZ0IGxpY2Vuc2UgZm9yCitzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFuZCBvdGhlciBwcmFjdGljYWwgd29ya3MgYXJlIGRlc2lnbmVkCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBhbGwgdmVyc2lvbnMgb2YgYSBwcm9ncmFtLS10byBtYWtlIHN1cmUgaXQgcmVtYWlucyBmcmVlCitzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9zdCBvZiBvdXIgc29mdHdhcmU7IGl0IGFwcGxpZXMgYWxzbyB0bworYW55IG90aGVyIHdvcmsgcmVsZWFzZWQgdGhpcyB3YXkgYnkgaXRzIGF1dGhvcnMuICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhlbSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKK3RoZXNlIHJpZ2h0cyBvciBhc2tpbmcgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgVGhlcmVmb3JlLCB5b3UgaGF2ZQorY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmCit5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKK2ZyZWVkb21zIHRoYXQgeW91IHJlY2VpdmVkLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlCitvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKKyAgRGV2ZWxvcGVycyB0aGF0IHVzZSB0aGUgR05VIEdQTCBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOgorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKK2dpdmluZyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQuCisKKyAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCit0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBGb3IgYm90aCB1c2VycycgYW5kCithdXRob3JzJyBzYWtlLCB0aGUgR1BMIHJlcXVpcmVzIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgYmUgbWFya2VkIGFzCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KK2F1dGhvcnMgb2YgcHJldmlvdXMgdmVyc2lvbnMuCisKKyAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgorbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIHNvZnR3YXJlIGluc2lkZSB0aGVtLCBhbHRob3VnaCB0aGUgbWFudWZhY3R1cmVyCitjYW4gZG8gc28uICBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIGFpbSBvZgorcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKK3BhdHRlcm4gb2Ygc3VjaCBhYnVzZSBvY2N1cnMgaW4gdGhlIGFyZWEgb2YgcHJvZHVjdHMgZm9yIGluZGl2aWR1YWxzIHRvCit1c2UsIHdoaWNoIGlzIHByZWNpc2VseSB3aGVyZSBpdCBpcyBtb3N0IHVuYWNjZXB0YWJsZS4gIFRoZXJlZm9yZSwgd2UKK2hhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQorcHJvZHVjdHMuICBJZiBzdWNoIHByb2JsZW1zIGFyaXNlIHN1YnN0YW50aWFsbHkgaW4gb3RoZXIgZG9tYWlucywgd2UKK3N0YW5kIHJlYWR5IHRvIGV4dGVuZCB0aGlzIHByb3Zpc2lvbiB0byB0aG9zZSBkb21haW5zIGluIGZ1dHVyZSB2ZXJzaW9ucworb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCisKKyAgRmluYWxseSwgZXZlcnkgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgorc29mdHdhcmUgb24gZ2VuZXJhbC1wdXJwb3NlIGNvbXB1dGVycywgYnV0IGluIHRob3NlIHRoYXQgZG8sIHdlIHdpc2ggdG8KK2F2b2lkIHRoZSBzcGVjaWFsIGRhbmdlciB0aGF0IHBhdGVudHMgYXBwbGllZCB0byBhIGZyZWUgcHJvZ3JhbSBjb3VsZAorbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKK3BhdGVudHMgY2Fubm90IGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBwcm9ncmFtIG5vbi1mcmVlLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisgICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgMC4gRGVmaW5pdGlvbnMuCisKKyAgIlRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKK3dvcmtzLCBzdWNoIGFzIHNlbWljb25kdWN0b3IgbWFza3MuCisKKyAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCitMaWNlbnNlLiAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICAiTGljZW5zZWVzIiBhbmQKKyJyZWNpcGllbnRzIiBtYXkgYmUgaW5kaXZpZHVhbHMgb3Igb3JnYW5pemF0aW9ucy4KKworICBUbyAibW9kaWZ5IiBhIHdvcmsgbWVhbnMgdG8gY29weSBmcm9tIG9yIGFkYXB0IGFsbCBvciBwYXJ0IG9mIHRoZSB3b3JrCitpbiBhIGZhc2hpb24gcmVxdWlyaW5nIGNvcHlyaWdodCBwZXJtaXNzaW9uLCBvdGhlciB0aGFuIHRoZSBtYWtpbmcgb2YgYW4KK2V4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQorZWFybGllciB3b3JrIG9yIGEgd29yayAiYmFzZWQgb24iIHRoZSBlYXJsaWVyIHdvcmsuCisKKyAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLgorCisgIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKK3Blcm1pc3Npb24sIHdvdWxkIG1ha2UgeW91IGRpcmVjdGx5IG9yIHNlY29uZGFyaWx5IGxpYWJsZSBmb3IKK2luZnJpbmdlbWVudCB1bmRlciBhcHBsaWNhYmxlIGNvcHlyaWdodCBsYXcsIGV4Y2VwdCBleGVjdXRpbmcgaXQgb24gYQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKKyAgVG8gImNvbnZleSIgYSB3b3JrIG1lYW5zIGFueSBraW5kIG9mIHByb3BhZ2F0aW9uIHRoYXQgZW5hYmxlcyBvdGhlcgorcGFydGllcyB0byBtYWtlIG9yIHJlY2VpdmUgY29waWVzLiAgTWVyZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlciB0aHJvdWdoCithIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgorCisgIEFuIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlIGRpc3BsYXlzICJBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIgordG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQorZmVhdHVyZSB0aGF0ICgxKSBkaXNwbGF5cyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgKDIpCit0ZWxscyB0aGUgdXNlciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgd29yayAoZXhjZXB0IHRvIHRoZQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQord29yayB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYKK3RoZSBpbnRlcmZhY2UgcHJlc2VudHMgYSBsaXN0IG9mIHVzZXIgY29tbWFuZHMgb3Igb3B0aW9ucywgc3VjaCBhcyBhCittZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgorCisgIDEuIFNvdXJjZSBDb2RlLgorCisgIFRoZSAic291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCitmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICAiT2JqZWN0IGNvZGUiIG1lYW5zIGFueSBub24tc291cmNlCitmb3JtIG9mIGEgd29yay4KKworICBBICJTdGFuZGFyZCBJbnRlcmZhY2UiIG1lYW5zIGFuIGludGVyZmFjZSB0aGF0IGVpdGhlciBpcyBhbiBvZmZpY2lhbAorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgoraW50ZXJmYWNlcyBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb25lIHRoYXQKK2lzIHdpZGVseSB1c2VkIGFtb25nIGRldmVsb3BlcnMgd29ya2luZyBpbiB0aGF0IGxhbmd1YWdlLgorCisgIFRoZSAiU3lzdGVtIExpYnJhcmllcyIgb2YgYW4gZXhlY3V0YWJsZSB3b3JrIGluY2x1ZGUgYW55dGhpbmcsIG90aGVyCit0aGFuIHRoZSB3b3JrIGFzIGEgd2hvbGUsIHRoYXQgKGEpIGlzIGluY2x1ZGVkIGluIHRoZSBub3JtYWwgZm9ybSBvZgorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgorQ29tcG9uZW50LCBhbmQgKGIpIHNlcnZlcyBvbmx5IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHdvcmsgd2l0aCB0aGF0CitNYWpvciBDb21wb25lbnQsIG9yIHRvIGltcGxlbWVudCBhIFN0YW5kYXJkIEludGVyZmFjZSBmb3Igd2hpY2ggYW4KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCisiTWFqb3IgQ29tcG9uZW50IiwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBhIG1ham9yIGVzc2VudGlhbCBjb21wb25lbnQKKyhrZXJuZWwsIHdpbmRvdyBzeXN0ZW0sIGFuZCBzbyBvbikgb2YgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCitwcm9kdWNlIHRoZSB3b3JrLCBvciBhbiBvYmplY3QgY29kZSBpbnRlcnByZXRlciB1c2VkIHRvIHJ1biBpdC4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCitpbmNsdWRlcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggc291cmNlIGZpbGVzIGZvcgordGhlIHdvcmssIGFuZCB0aGUgc291cmNlIGNvZGUgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWNhbGx5CitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKK3N1Y2ggYXMgYnkgaW50aW1hdGUgZGF0YSBjb21tdW5pY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBiZXR3ZWVuIHRob3NlCitzdWJwcm9ncmFtcyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHdvcmsuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycworY2FuIHJlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nCitTb3VyY2UuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0CitzYW1lIHdvcmsuCisKKyAgMi4gQmFzaWMgUGVybWlzc2lvbnMuCisKKyAgQWxsIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBhcmUgZ3JhbnRlZCBmb3IgdGhlIHRlcm0gb2YKK2NvcHlyaWdodCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGFyZSBpcnJldm9jYWJsZSBwcm92aWRlZCB0aGUgc3RhdGVkCitjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCitwZXJtaXNzaW9uIHRvIHJ1biB0aGUgdW5tb2RpZmllZCBQcm9ncmFtLiAgVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYQorY292ZXJlZCB3b3JrIGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlIG9ubHkgaWYgdGhlIG91dHB1dCwgZ2l2ZW4gaXRzCitjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgorcmlnaHRzIG9mIGZhaXIgdXNlIG9yIG90aGVyIGVxdWl2YWxlbnQsIGFzIHByb3ZpZGVkIGJ5IGNvcHlyaWdodCBsYXcuCisKKyAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdAorY29udmV5LCB3aXRob3V0IGNvbmRpdGlvbnMgc28gbG9uZyBhcyB5b3VyIGxpY2Vuc2Ugb3RoZXJ3aXNlIHJlbWFpbnMKK2luIGZvcmNlLiAgWW91IG1heSBjb252ZXkgY292ZXJlZCB3b3JrcyB0byBvdGhlcnMgZm9yIHRoZSBzb2xlIHB1cnBvc2UKK29mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQord2l0aCBmYWNpbGl0aWVzIGZvciBydW5uaW5nIHRob3NlIHdvcmtzLCBwcm92aWRlZCB0aGF0IHlvdSBjb21wbHkgd2l0aAordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBpbiBjb252ZXlpbmcgYWxsIG1hdGVyaWFsIGZvciB3aGljaCB5b3UgZG8KK25vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKK2ZvciB5b3UgbXVzdCBkbyBzbyBleGNsdXNpdmVseSBvbiB5b3VyIGJlaGFsZiwgdW5kZXIgeW91ciBkaXJlY3Rpb24KK2FuZCBjb250cm9sLCBvbiB0ZXJtcyB0aGF0IHByb2hpYml0IHRoZW0gZnJvbSBtYWtpbmcgYW55IGNvcGllcyBvZgoreW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KKworICBDb252ZXlpbmcgdW5kZXIgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgaXMgcGVybWl0dGVkIHNvbGVseSB1bmRlcgordGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCittYWtlcyBpdCB1bm5lY2Vzc2FyeS4KKworICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgorCisgIE5vIGNvdmVyZWQgd29yayBzaGFsbCBiZSBkZWVtZWQgcGFydCBvZiBhbiBlZmZlY3RpdmUgdGVjaG5vbG9naWNhbAorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCisxMSBvZiB0aGUgV0lQTyBjb3B5cmlnaHQgdHJlYXR5IGFkb3B0ZWQgb24gMjAgRGVjZW1iZXIgMTk5Niwgb3IKK3NpbWlsYXIgbGF3cyBwcm9oaWJpdGluZyBvciByZXN0cmljdGluZyBjaXJjdW12ZW50aW9uIG9mIHN1Y2gKK21lYXN1cmVzLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgeW91IHdhaXZlIGFueSBsZWdhbCBwb3dlciB0byBmb3JiaWQKK2NpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgoraXMgZWZmZWN0ZWQgYnkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0bwordGhlIGNvdmVyZWQgd29yaywgYW5kIHlvdSBkaXNjbGFpbSBhbnkgaW50ZW50aW9uIHRvIGxpbWl0IG9wZXJhdGlvbiBvcgorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKK3VzZXJzLCB5b3VyIG9yIHRoaXJkIHBhcnRpZXMnIGxlZ2FsIHJpZ2h0cyB0byBmb3JiaWQgY2lyY3VtdmVudGlvbiBvZgordGVjaG5vbG9naWNhbCBtZWFzdXJlcy4KKworICA0LiBDb252ZXlpbmcgVmVyYmF0aW0gQ29waWVzLgorCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCisgIFlvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyAgNS4gQ29udmV5aW5nIE1vZGlmaWVkIFNvdXJjZSBWZXJzaW9ucy4KKworICBZb3UgbWF5IGNvbnZleSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIG9yIHRoZSBtb2RpZmljYXRpb25zIHRvCitwcm9kdWNlIGl0IGZyb20gdGhlIFByb2dyYW0sIGluIHRoZSBmb3JtIG9mIHNvdXJjZSBjb2RlIHVuZGVyIHRoZQordGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgbW9kaWZpZWQKKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCisKKyAgICBiKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCBpdCBpcworICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgorICAgIDcuICBUaGlzIHJlcXVpcmVtZW50IG1vZGlmaWVzIHRoZSByZXF1aXJlbWVudCBpbiBzZWN0aW9uIDQgdG8KKyAgICAia2VlcCBpbnRhY3QgYWxsIG5vdGljZXMiLgorCisgICAgYykgWW91IG11c3QgbGljZW5zZSB0aGUgZW50aXJlIHdvcmssIGFzIGEgd2hvbGUsIHVuZGVyIHRoaXMKKyAgICBMaWNlbnNlIHRvIGFueW9uZSB3aG8gY29tZXMgaW50byBwb3NzZXNzaW9uIG9mIGEgY29weS4gIFRoaXMKKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNworICAgIGFkZGl0aW9uYWwgdGVybXMsIHRvIHRoZSB3aG9sZSBvZiB0aGUgd29yaywgYW5kIGFsbCBpdHMgcGFydHMsCisgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgcGFja2FnZWQuICBUaGlzIExpY2Vuc2UgZ2l2ZXMgbm8KKyAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CisgICAgaW52YWxpZGF0ZSBzdWNoIHBlcm1pc3Npb24gaWYgeW91IGhhdmUgc2VwYXJhdGVseSByZWNlaXZlZCBpdC4KKworICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CisgICAgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlczsgaG93ZXZlciwgaWYgdGhlIFByb2dyYW0gaGFzIGludGVyYWN0aXZlCisgICAgaW50ZXJmYWNlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMsIHlvdXIKKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KKworICBBIGNvbXBpbGF0aW9uIG9mIGEgY292ZXJlZCB3b3JrIHdpdGggb3RoZXIgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50Cit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAorYW5kIHdoaWNoIGFyZSBub3QgY29tYmluZWQgd2l0aCBpdCBzdWNoIGFzIHRvIGZvcm0gYSBsYXJnZXIgcHJvZ3JhbSwKK2luIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtLCBpcyBjYWxsZWQgYW4KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAordXNlZCB0byBsaW1pdCB0aGUgYWNjZXNzIG9yIGxlZ2FsIHJpZ2h0cyBvZiB0aGUgY29tcGlsYXRpb24ncyB1c2VycworYmV5b25kIHdoYXQgdGhlIGluZGl2aWR1YWwgd29ya3MgcGVybWl0LiAgSW5jbHVzaW9uIG9mIGEgY292ZXJlZCB3b3JrCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgorcGFydHMgb2YgdGhlIGFnZ3JlZ2F0ZS4KKworICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KKworICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcworb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCittYWNoaW5lLXJlYWRhYmxlIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCitpbiBvbmUgb2YgdGhlc2Ugd2F5czoKKworICAgIGEpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IGEKKyAgICB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMgYW5kIHZhbGlkIGZvciBhcworICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAorICAgIG1vZGVsLCB0byBnaXZlIGFueW9uZSB3aG8gcG9zc2Vzc2VzIHRoZSBvYmplY3QgY29kZSBlaXRoZXIgKDEpIGEKKyAgICBjb3B5IG9mIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYWxsIHRoZSBzb2Z0d2FyZSBpbiB0aGUKKyAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAorICAgIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZSwgZm9yIGEgcHJpY2Ugbm8KKyAgICBtb3JlIHRoYW4geW91ciByZWFzb25hYmxlIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHRoaXMKKyAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZnJvbSBhIG5ldHdvcmsgc2VydmVyIGF0IG5vIGNoYXJnZS4KKworICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCisgICAgd3JpdHRlbiBvZmZlciB0byBwcm92aWRlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoaXMKKyAgICBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkgb2NjYXNpb25hbGx5IGFuZCBub25jb21tZXJjaWFsbHksIGFuZAorICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAorICAgIHdpdGggc3Vic2VjdGlvbiA2Yi4KKworICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCisgICAgcGxhY2UgKGdyYXRpcyBvciBmb3IgYSBjaGFyZ2UpLCBhbmQgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgaW4gdGhlIHNhbWUgd2F5IHRocm91Z2ggdGhlIHNhbWUgcGxhY2UgYXQgbm8KKyAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4gIElmIHRoZSBwbGFjZSB0bworICAgIGNvcHkgdGhlIG9iamVjdCBjb2RlIGlzIGEgbmV0d29yayBzZXJ2ZXIsIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQorICAgIHRoYXQgc3VwcG9ydHMgZXF1aXZhbGVudCBjb3B5aW5nIGZhY2lsaXRpZXMsIHByb3ZpZGVkIHlvdSBtYWludGFpbgorICAgIGNsZWFyIGRpcmVjdGlvbnMgbmV4dCB0byB0aGUgb2JqZWN0IGNvZGUgc2F5aW5nIHdoZXJlIHRvIGZpbmQgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLCB5b3UgcmVtYWluIG9ibGlnYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBpcworICAgIGF2YWlsYWJsZSBmb3IgYXMgbG9uZyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCisKKyAgICBlKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24sIHByb3ZpZGVkCisgICAgeW91IGluZm9ybSBvdGhlciBwZWVycyB3aGVyZSB0aGUgb2JqZWN0IGNvZGUgYW5kIENvcnJlc3BvbmRpbmcKKyAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCisgICAgY2hhcmdlIHVuZGVyIHN1YnNlY3Rpb24gNmQuCisKKyAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCitmcm9tIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBhcyBhIFN5c3RlbSBMaWJyYXJ5LCBuZWVkIG5vdCBiZQoraW5jbHVkZWQgaW4gY29udmV5aW5nIHRoZSBvYmplY3QgY29kZSB3b3JrLgorCisgIEEgIlVzZXIgUHJvZHVjdCIgaXMgZWl0aGVyICgxKSBhICJjb25zdW1lciBwcm9kdWN0Iiwgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwgZmFtaWx5LAorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgoraW50byBhIGR3ZWxsaW5nLiAgSW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0LAorZG91YnRmdWwgY2FzZXMgc2hhbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY292ZXJhZ2UuICBGb3IgYSBwYXJ0aWN1bGFyCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKK3R5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mIHByb2R1Y3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5IGluIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHVzZXIKK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAoraXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwKK2NvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3Igbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50Cit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworICAiSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIiBmb3IgYSBVc2VyIFByb2R1Y3QgbWVhbnMgYW55IG1ldGhvZHMsCitwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKK2FuZCBleGVjdXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgY292ZXJlZCB3b3JrIGluIHRoYXQgVXNlciBQcm9kdWN0IGZyb20KK2EgbW9kaWZpZWQgdmVyc2lvbiBvZiBpdHMgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGUgaW5mb3JtYXRpb24gbXVzdAorc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKK2NvZGUgaXMgaW4gbm8gY2FzZSBwcmV2ZW50ZWQgb3IgaW50ZXJmZXJlZCB3aXRoIHNvbGVseSBiZWNhdXNlCittb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZS4KKworICBJZiB5b3UgY29udmV5IGFuIG9iamVjdCBjb2RlIHdvcmsgdW5kZXIgdGhpcyBzZWN0aW9uIGluLCBvciB3aXRoLCBvcgorc3BlY2lmaWNhbGx5IGZvciB1c2UgaW4sIGEgVXNlciBQcm9kdWN0LCBhbmQgdGhlIGNvbnZleWluZyBvY2N1cnMgYXMKK3BhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQorVXNlciBQcm9kdWN0IGlzIHRyYW5zZmVycmVkIHRvIHRoZSByZWNpcGllbnQgaW4gcGVycGV0dWl0eSBvciBmb3IgYQorZml4ZWQgdGVybSAocmVnYXJkbGVzcyBvZiBob3cgdGhlIHRyYW5zYWN0aW9uIGlzIGNoYXJhY3Rlcml6ZWQpLCB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCitieSB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLiAgQnV0IHRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkKK2lmIG5laXRoZXIgeW91IG5vciBhbnkgdGhpcmQgcGFydHkgcmV0YWlucyB0aGUgYWJpbGl0eSB0byBpbnN0YWxsCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCitiZWVuIGluc3RhbGxlZCBpbiBST00pLgorCisgIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKK3JlcXVpcmVtZW50IHRvIGNvbnRpbnVlIHRvIHByb3ZpZGUgc3VwcG9ydCBzZXJ2aWNlLCB3YXJyYW50eSwgb3IgdXBkYXRlcworZm9yIGEgd29yayB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZCBieSB0aGUgcmVjaXBpZW50LCBvciBmb3IKK3RoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKK25ldHdvcmsgbWF5IGJlIGRlbmllZCB3aGVuIHRoZSBtb2RpZmljYXRpb24gaXRzZWxmIG1hdGVyaWFsbHkgYW5kCithZHZlcnNlbHkgYWZmZWN0cyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBuZXR3b3JrIG9yIHZpb2xhdGVzIHRoZSBydWxlcyBhbmQKK3Byb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCisKKyAgQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQsIGFuZCBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gcHJvdmlkZWQsCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5Citkb2N1bWVudGVkIChhbmQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbgorc291cmNlIGNvZGUgZm9ybSksIGFuZCBtdXN0IHJlcXVpcmUgbm8gc3BlY2lhbCBwYXNzd29yZCBvciBrZXkgZm9yCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KKworICA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisgICJBZGRpdGlvbmFsIHBlcm1pc3Npb25zIiBhcmUgdGVybXMgdGhhdCBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIGJ5IG1ha2luZyBleGNlcHRpb25zIGZyb20gb25lIG9yIG1vcmUgb2YgaXRzIGNvbmRpdGlvbnMuCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCitiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyBMaWNlbnNlLCB0byB0aGUgZXh0ZW50Cit0aGF0IHRoZXkgYXJlIHZhbGlkIHVuZGVyIGFwcGxpY2FibGUgbGF3LiAgSWYgYWRkaXRpb25hbCBwZXJtaXNzaW9ucworYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQordW5kZXIgdGhvc2UgcGVybWlzc2lvbnMsIGJ1dCB0aGUgZW50aXJlIFByb2dyYW0gcmVtYWlucyBnb3Zlcm5lZCBieQordGhpcyBMaWNlbnNlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvcHkgb2YgYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgYXQgeW91ciBvcHRpb24KK3JlbW92ZSBhbnkgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBmcm9tIHRoYXQgY29weSwgb3IgZnJvbSBhbnkgcGFydCBvZgoraXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgorcmVtb3ZhbCBpbiBjZXJ0YWluIGNhc2VzIHdoZW4geW91IG1vZGlmeSB0aGUgd29yay4pICBZb3UgbWF5IHBsYWNlCithZGRpdGlvbmFsIHBlcm1pc3Npb25zIG9uIG1hdGVyaWFsLCBhZGRlZCBieSB5b3UgdG8gYSBjb3ZlcmVkIHdvcmssCitmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCBmb3IgbWF0ZXJpYWwgeW91CithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCit0aGF0IG1hdGVyaWFsKSBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0ZXJtczoKKworICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQorICAgIHRlcm1zIG9mIHNlY3Rpb25zIDE1IGFuZCAxNiBvZiB0aGlzIExpY2Vuc2U7IG9yCisKKyAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKKyAgICBhdXRob3IgYXR0cmlidXRpb25zIGluIHRoYXQgbWF0ZXJpYWwgb3IgaW4gdGhlIEFwcHJvcHJpYXRlIExlZ2FsCisgICAgTm90aWNlcyBkaXNwbGF5ZWQgYnkgd29ya3MgY29udGFpbmluZyBpdDsgb3IKKworICAgIGMpIFByb2hpYml0aW5nIG1pc3JlcHJlc2VudGF0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhhdCBtYXRlcmlhbCwgb3IKKyAgICByZXF1aXJpbmcgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIG1hdGVyaWFsIGJlIG1hcmtlZCBpbgorICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKKworICAgIGQpIExpbWl0aW5nIHRoZSB1c2UgZm9yIHB1YmxpY2l0eSBwdXJwb3NlcyBvZiBuYW1lcyBvZiBsaWNlbnNvcnMgb3IKKyAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKKworICAgIGUpIERlY2xpbmluZyB0byBncmFudCByaWdodHMgdW5kZXIgdHJhZGVtYXJrIGxhdyBmb3IgdXNlIG9mIHNvbWUKKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKKworICAgIGYpIFJlcXVpcmluZyBpbmRlbW5pZmljYXRpb24gb2YgbGljZW5zb3JzIGFuZCBhdXRob3JzIG9mIHRoYXQKKyAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgorICAgIGl0KSB3aXRoIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIG9mIGxpYWJpbGl0eSB0byB0aGUgcmVjaXBpZW50LCBmb3IKKyAgICBhbnkgbGlhYmlsaXR5IHRoYXQgdGhlc2UgY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgZGlyZWN0bHkgaW1wb3NlIG9uCisgICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgorCisgIEFsbCBvdGhlciBub24tcGVybWlzc2l2ZSBhZGRpdGlvbmFsIHRlcm1zIGFyZSBjb25zaWRlcmVkICJmdXJ0aGVyCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CityZWNlaXZlZCBpdCwgb3IgYW55IHBhcnQgb2YgaXQsIGNvbnRhaW5zIGEgbm90aWNlIHN0YXRpbmcgdGhhdCBpdCBpcworZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggYSB0ZXJtIHRoYXQgaXMgYSBmdXJ0aGVyCityZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCithIGZ1cnRoZXIgcmVzdHJpY3Rpb24gYnV0IHBlcm1pdHMgcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nIHVuZGVyIHRoaXMKK0xpY2Vuc2UsIHlvdSBtYXkgYWRkIHRvIGEgY292ZXJlZCB3b3JrIG1hdGVyaWFsIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcworb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBzdXJ2aXZlIHN1Y2ggcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nLgorCisgIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKK211c3QgcGxhY2UsIGluIHRoZSByZWxldmFudCBzb3VyY2UgZmlsZXMsIGEgc3RhdGVtZW50IG9mIHRoZQorYWRkaXRpb25hbCB0ZXJtcyB0aGF0IGFwcGx5IHRvIHRob3NlIGZpbGVzLCBvciBhIG5vdGljZSBpbmRpY2F0aW5nCit3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgorCisgIEFkZGl0aW9uYWwgdGVybXMsIHBlcm1pc3NpdmUgb3Igbm9uLXBlcm1pc3NpdmUsIG1heSBiZSBzdGF0ZWQgaW4gdGhlCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwordGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcHBseSBlaXRoZXIgd2F5LgorCisgIDguIFRlcm1pbmF0aW9uLgorCisgIFlvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKKyAgSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIKK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQorcHJvdmlzaW9uYWxseSwgdW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZAorZmluYWxseSB0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodAoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKK3ByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKK3JlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQordmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0Citjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyCit5b3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworICBUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CityZWluc3RhdGVkLCB5b3UgZG8gbm90IHF1YWxpZnkgdG8gcmVjZWl2ZSBuZXcgbGljZW5zZXMgZm9yIHRoZSBzYW1lCittYXRlcmlhbCB1bmRlciBzZWN0aW9uIDEwLgorCisgIDkuIEFjY2VwdGFuY2UgTm90IFJlcXVpcmVkIGZvciBIYXZpbmcgQ29waWVzLgorCisgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgorcnVuIGEgY29weSBvZiB0aGUgUHJvZ3JhbS4gIEFuY2lsbGFyeSBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQgd29yaworb2NjdXJyaW5nIHNvbGVseSBhcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24KK3RvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCitub3RoaW5nIG90aGVyIHRoYW4gdGhpcyBMaWNlbnNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBhbnkgY292ZXJlZCB3b3JrLiAgVGhlc2UgYWN0aW9ucyBpbmZyaW5nZSBjb3B5cmlnaHQgaWYgeW91IGRvCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKK2NvdmVyZWQgd29yaywgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28uCisKKyAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgorCisgIEVhY2ggdGltZSB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkKK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoYXQgd29yaywgc3ViamVjdCB0byB0aGlzIExpY2Vuc2UuICBZb3UgYXJlIG5vdCByZXNwb25zaWJsZQorZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aCB0aGlzIExpY2Vuc2UuCisKKyAgQW4gImVudGl0eSB0cmFuc2FjdGlvbiIgaXMgYSB0cmFuc2FjdGlvbiB0cmFuc2ZlcnJpbmcgY29udHJvbCBvZiBhbgorb3JnYW5pemF0aW9uLCBvciBzdWJzdGFudGlhbGx5IGFsbCBhc3NldHMgb2Ygb25lLCBvciBzdWJkaXZpZGluZyBhbgorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKK3dvcmsgcmVzdWx0cyBmcm9tIGFuIGVudGl0eSB0cmFuc2FjdGlvbiwgZWFjaCBwYXJ0eSB0byB0aGF0Cit0cmFuc2FjdGlvbiB3aG8gcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSB3b3JrIGFsc28gcmVjZWl2ZXMgd2hhdGV2ZXIKK2xpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZAorZ2l2ZSB1bmRlciB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBwbHVzIGEgcmlnaHQgdG8gcG9zc2Vzc2lvbiBvZiB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGZyb20gdGhlIHByZWRlY2Vzc29yIGluIGludGVyZXN0LCBpZgordGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgorCisgIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKK25vdCBpbXBvc2UgYSBsaWNlbnNlIGZlZSwgcm95YWx0eSwgb3Igb3RoZXIgY2hhcmdlIGZvciBleGVyY2lzZSBvZgorcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgeW91IG1heSBub3QgaW5pdGlhdGUgbGl0aWdhdGlvbgorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKK2FueSBwYXRlbnQgY2xhaW0gaXMgaW5mcmluZ2VkIGJ5IG1ha2luZywgdXNpbmcsIHNlbGxpbmcsIG9mZmVyaW5nIGZvcgorc2FsZSwgb3IgaW1wb3J0aW5nIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LgorCisgIDExLiBQYXRlbnRzLgorCisgIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKK0xpY2Vuc2Ugb2YgdGhlIFByb2dyYW0gb3IgYSB3b3JrIG9uIHdoaWNoIHRoZSBQcm9ncmFtIGlzIGJhc2VkLiAgVGhlCit3b3JrIHRodXMgbGljZW5zZWQgaXMgY2FsbGVkIHRoZSBjb250cmlidXRvcidzICJjb250cmlidXRvciB2ZXJzaW9uIi4KKworICBBIGNvbnRyaWJ1dG9yJ3MgImVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIiBhcmUgYWxsIHBhdGVudCBjbGFpbXMKK293bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCitwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBpbmNsdWRlcyB0aGUgcmlnaHQgdG8gZ3JhbnQKK3BhdGVudCBzdWJsaWNlbnNlcyBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZgordGhpcyBMaWNlbnNlLgorCisgIEVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworICBJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiAgVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworICBJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKworICBJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgordGhlIHNjb3BlIG9mIGl0cyBjb3ZlcmFnZSwgcHJvaGliaXRzIHRoZSBleGVyY2lzZSBvZiwgb3IgaXMKK2NvbmRpdGlvbmVkIG9uIHRoZSBub24tZXhlcmNpc2Ugb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHJpZ2h0cyB0aGF0IGFyZQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAord29yayBpZiB5b3UgYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMKK2luIHRoZSBidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQKK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCit0aGUgd29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUKK3BhcnRpZXMgd2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaworY29udmV5ZWQgYnkgeW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkKK2ZvciBhbmQgaW4gY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0Citjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCitvciB0aGF0IHBhdGVudCBsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKK2FueSBpbXBsaWVkIGxpY2Vuc2Ugb3Igb3RoZXIgZGVmZW5zZXMgdG8gaW5mcmluZ2VtZW50IHRoYXQgbWF5CitvdGhlcndpc2UgYmUgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhcHBsaWNhYmxlIHBhdGVudCBsYXcuCisKKyAgMTIuIE5vIFN1cnJlbmRlciBvZiBPdGhlcnMnIEZyZWVkb20uCisKKyAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QgY29udmV5IGEKK2NvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkKK25vdCBjb252ZXkgaXQgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhZ3JlZSB0byB0ZXJtcyB0aGF0IG9ibGlnYXRlIHlvdQordG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5Cit0aGUgUHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggdGhvc2UgdGVybXMgYW5kIHRoaXMKK0xpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGNvbnZleWluZyB0aGUgUHJvZ3JhbS4KKworICAxMy4gVXNlIHdpdGggdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCitwZXJtaXNzaW9uIHRvIGxpbmsgb3IgY29tYmluZSBhbnkgY292ZXJlZCB3b3JrIHdpdGggYSB3b3JrIGxpY2Vuc2VkCit1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnRvIGEgc2luZ2xlCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIHdpbGwgY29udGludWUgdG8gYXBwbHkgdG8gdGhlIHBhcnQgd2hpY2ggaXMgdGhlIGNvdmVyZWQgd29yaywKK2J1dCB0aGUgc3BlY2lhbCByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3NlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIGFzIHN1Y2guCisKKyAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgorCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlCitQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKK29wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IG51bWJlcmVkCit2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUgd2hpY2ggZnV0dXJlCit2ZXJzaW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHVzZWQsIHRoYXQgcHJveHkncworcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQordG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlIFByb2dyYW0uCisKKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiAgSG93ZXZlciwgbm8gYWRkaXRpb25hbCBvYmxpZ2F0aW9ucyBhcmUgaW1wb3NlZCBvbiBhbnkKK2F1dGhvciBvciBjb3B5cmlnaHQgaG9sZGVyIGFzIGEgcmVzdWx0IG9mIHlvdXIgY2hvb3NpbmcgdG8gZm9sbG93IGEKK2xhdGVyIHZlcnNpb24uCisKKyAgMTUuIERpc2NsYWltZXIgb2YgV2FycmFudHkuCisKKyAgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVAorSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQorT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQorSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GCitBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LgorCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNT0RJRklFUyBBTkQvT1IgQ09OVkVZUworVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZCitHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKK1VTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YKK0RBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJECitQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKK0VWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KKworICAxNy4gSW50ZXJwcmV0YXRpb24gb2YgU2VjdGlvbnMgMTUgYW5kIDE2LgorCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5CitzdGF0ZSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKKyAgSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydAorbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgPHByb2dyYW0+ICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgeW91ciBwcm9ncmFtJ3MgY29tbWFuZHMKK21pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KKworICBZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3Igc2Nob29sLAoraWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIGFuZCBob3cgdG8gYXBwbHkgYW5kIGZvbGxvdyB0aGUgR05VIEdQTCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKK3RoZSBsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuICBCdXQgZmlyc3QsIHBsZWFzZSByZWFkCis8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+LgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5MR1BMIGIvQ09QWUlORy5MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjJiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkxHUEwKQEAgLTAsMCArMSw1MDIgQEAKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCisgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKKyB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKK2NhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKK3RoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCitzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKK2EgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKK2FsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvQ09QWUlORy5NSU5QQUNLIGIvQ09QWUlORy5NSU5QQUNLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDhhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLk1JTlBBQ0sKQEAgLTAsMCArMSw1MiBAQAorTWlucGFjayBDb3B5cmlnaHQgTm90aWNlICgxOTk5KSBVbml2ZXJzaXR5IG9mIENoaWNhZ28uICBBbGwgcmlnaHRzIHJlc2VydmVkDQorDQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcg0KK3dpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlDQorZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCisNCisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcNCitkaXNjbGFpbWVyLg0KKw0KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KK2Rpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscw0KK3Byb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisNCiszLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZQ0KK3JlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nDQorYWNrbm93bGVkZ21lbnQ6DQorDQorICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlDQorICAgVW5pdmVyc2l0eSBvZiBDaGljYWdvLCBhcyBPcGVyYXRvciBvZiBBcmdvbm5lIE5hdGlvbmFsDQorICAgTGFib3JhdG9yeS4NCisNCitBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZQ0KK2l0c2VsZiwgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzDQorbm9ybWFsbHkgYXBwZWFyLg0KKw0KKzQuIFdBUlJBTlRZIERJU0NMQUlNRVIuIFRIRSBTT0ZUV0FSRSBJUyBTVVBQTElFRCAiQVMgSVMiDQorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gVEhFIENPUFlSSUdIVCBIT0xERVIsIFRIRQ0KK1VOSVRFRCBTVEFURVMsIFRIRSBVTklURUQgU1RBVEVTIERFUEFSVE1FTlQgT0YgRU5FUkdZLCBBTkQNCitUSEVJUiBFTVBMT1lFRVM6ICgxKSBESVNDTEFJTSBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUg0KK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIElNUExJRUQgV0FSUkFOVElFUw0KK09GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFDQorT1IgTk9OLUlORlJJTkdFTUVOVCwgKDIpIERPIE5PVCBBU1NVTUUgQU5ZIExFR0FMIExJQUJJTElUWQ0KK09SIFJFU1BPTlNJQklMSVRZIEZPUiBUSEUgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywgT1INCitVU0VGVUxORVNTIE9GIFRIRSBTT0ZUV0FSRSwgKDMpIERPIE5PVCBSRVBSRVNFTlQgVEhBVCBVU0UgT0YNCitUSEUgU09GVFdBUkUgV09VTEQgTk9UIElORlJJTkdFIFBSSVZBVEVMWSBPV05FRCBSSUdIVFMsICg0KQ0KK0RPIE5PVCBXQVJSQU5UIFRIQVQgVEhFIFNPRlRXQVJFIFdJTEwgRlVOQ1RJT04NCitVTklOVEVSUlVQVEVELCBUSEFUIElUIElTIEVSUk9SLUZSRUUgT1IgVEhBVCBBTlkgRVJST1JTIFdJTEwNCitCRSBDT1JSRUNURUQuDQorDQorNS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuIElOIE5PIEVWRU5UIFdJTEwgVEhFIENPUFlSSUdIVA0KK0hPTERFUiwgVEhFIFVOSVRFRCBTVEFURVMsIFRIRSBVTklURUQgU1RBVEVTIERFUEFSVE1FTlQgT0YNCitFTkVSR1ksIE9SIFRIRUlSIEVNUExPWUVFUzogQkUgTElBQkxFIEZPUiBBTlkgSU5ESVJFQ1QsDQorSU5DSURFTlRBTCwgQ09OU0VRVUVOVElBTCwgU1BFQ0lBTCBPUiBQVU5JVElWRSBEQU1BR0VTIE9GDQorQU5ZIEtJTkQgT1IgTkFUVVJFLCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YNCitQUk9GSVRTIE9SIExPU1MgT0YgREFUQSwgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUiwgV0hFVEhFUg0KK1NVQ0ggTElBQklMSVRZIElTIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVA0KKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBTVFJJQ1QgTElBQklMSVRZKSwgT1IgT1RIRVJXSVNFLA0KK0VWRU4gSUYgQU5ZIE9GIFNBSUQgUEFSVElFUyBIQVMgQkVFTiBXQVJORUQgT0YgVEhFDQorUE9TU0lCSUxJVFkgT0YgU1VDSCBMT1NTIE9SIERBTUFHRVMuDQorDQpkaWZmIC0tZ2l0IGEvQ09QWUlORy5NUEwyIGIvQ09QWUlORy5NUEwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLk1QTDIKQEAgLTAsMCArMSwzNzMgQEAKK01vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gRGVmaW5pdGlvbnMKKy0tLS0tLS0tLS0tLS0tCisKKzEuMS4gIkNvbnRyaWJ1dG9yIgorICAgIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgdGhhdCBjcmVhdGVzLCBjb250cmlidXRlcyB0bworICAgIHRoZSBjcmVhdGlvbiBvZiwgb3Igb3ducyBDb3ZlcmVkIFNvZnR3YXJlLgorCisxLjIuICJDb250cmlidXRvciBWZXJzaW9uIgorICAgIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9ucyBvZiBvdGhlcnMgKGlmIGFueSkgdXNlZAorICAgIGJ5IGEgQ29udHJpYnV0b3IgYW5kIHRoYXQgcGFydGljdWxhciBDb250cmlidXRvcidzIENvbnRyaWJ1dGlvbi4KKworMS4zLiAiQ29udHJpYnV0aW9uIgorICAgIG1lYW5zIENvdmVyZWQgU29mdHdhcmUgb2YgYSBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorCisxLjQuICJDb3ZlcmVkIFNvZnR3YXJlIgorICAgIG1lYW5zIFNvdXJjZSBDb2RlIEZvcm0gdG8gd2hpY2ggdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgaGFzIGF0dGFjaGVkCisgICAgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEsIHRoZSBFeGVjdXRhYmxlIEZvcm0gb2Ygc3VjaCBTb3VyY2UgQ29kZQorICAgIEZvcm0sIGFuZCBNb2RpZmljYXRpb25zIG9mIHN1Y2ggU291cmNlIENvZGUgRm9ybSwgaW4gZWFjaCBjYXNlCisgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisKKzEuNS4gIkluY29tcGF0aWJsZSBXaXRoIFNlY29uZGFyeSBMaWNlbnNlcyIKKyAgICBtZWFucworCisgICAgKGEpIHRoYXQgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgaGFzIGF0dGFjaGVkIHRoZSBub3RpY2UgZGVzY3JpYmVkCisgICAgICAgIGluIEV4aGliaXQgQiB0byB0aGUgQ292ZXJlZCBTb2Z0d2FyZTsgb3IKKworICAgIChiKSB0aGF0IHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHdhcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAgICAgICAgdmVyc2lvbiAxLjEgb3IgZWFybGllciBvZiB0aGUgTGljZW5zZSwgYnV0IG5vdCBhbHNvIHVuZGVyIHRoZQorICAgICAgICB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlLgorCisxLjYuICJFeGVjdXRhYmxlIEZvcm0iCisgICAgbWVhbnMgYW55IGZvcm0gb2YgdGhlIHdvcmsgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZSBGb3JtLgorCisxLjcuICJMYXJnZXIgV29yayIKKyAgICBtZWFucyBhIHdvcmsgdGhhdCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgbWF0ZXJpYWwsIGluIAorICAgIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcywgdGhhdCBpcyBub3QgQ292ZXJlZCBTb2Z0d2FyZS4KKworMS44LiAiTGljZW5zZSIKKyAgICBtZWFucyB0aGlzIGRvY3VtZW50LgorCisxLjkuICJMaWNlbnNhYmxlIgorICAgIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwKKyAgICB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSwgYW55IGFuZAorICAgIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKworMS4xMC4gIk1vZGlmaWNhdGlvbnMiCisgICAgbWVhbnMgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAoYSkgYW55IGZpbGUgaW4gU291cmNlIENvZGUgRm9ybSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKKyAgICAgICAgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBDb3ZlcmVkCisgICAgICAgIFNvZnR3YXJlOyBvcgorCisgICAgKGIpIGFueSBuZXcgZmlsZSBpbiBTb3VyY2UgQ29kZSBGb3JtIHRoYXQgY29udGFpbnMgYW55IENvdmVyZWQKKyAgICAgICAgU29mdHdhcmUuCisKKzEuMTEuICJQYXRlbnQgQ2xhaW1zIiBvZiBhIENvbnRyaWJ1dG9yCisgICAgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLAorICAgIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgc3VjaAorICAgIENvbnRyaWJ1dG9yIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkLCBidXQgZm9yIHRoZSBncmFudCBvZiB0aGUKKyAgICBMaWNlbnNlLCBieSB0aGUgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yIHNhbGUsIGhhdmluZworICAgIG1hZGUsIGltcG9ydCwgb3IgdHJhbnNmZXIgb2YgZWl0aGVyIGl0cyBDb250cmlidXRpb25zIG9yIGl0cworICAgIENvbnRyaWJ1dG9yIFZlcnNpb24uCisKKzEuMTIuICJTZWNvbmRhcnkgTGljZW5zZSIKKyAgICBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIuMCwgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIuMSwgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbAorICAgIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDMuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRob3NlCisgICAgbGljZW5zZXMuCisKKzEuMTMuICJTb3VyY2UgQ29kZSBGb3JtIgorICAgIG1lYW5zIHRoZSBmb3JtIG9mIHRoZSB3b3JrIHByZWZlcnJlZCBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMuCisKKzEuMTQuICJZb3UiIChvciAiWW91ciIpCisgICAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzCisgICAgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5IHRoYXQKKyAgICBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvcgorICAgIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdAorICAgIG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksCisgICAgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuCisgICAgZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwKKyAgICBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzIuIExpY2Vuc2UgR3JhbnRzIGFuZCBDb25kaXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisyLjEuIEdyYW50cworCitFYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAorbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorCisoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKQorICAgIExpY2Vuc2FibGUgYnkgc3VjaCBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbWFrZSBhdmFpbGFibGUsCisgICAgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIGV4cGxvaXQgaXRzCisgICAgQ29udHJpYnV0aW9ucywgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggTW9kaWZpY2F0aW9ucywgb3IKKyAgICBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBvZiBzdWNoIENvbnRyaWJ1dG9yIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIKKyAgICBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgZWl0aGVyIGl0cworICAgIENvbnRyaWJ1dGlvbnMgb3IgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24uCisKKzIuMi4gRWZmZWN0aXZlIERhdGUKKworVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbiAyLjEgd2l0aCByZXNwZWN0IHRvIGFueSBDb250cmlidXRpb24KK2JlY29tZSBlZmZlY3RpdmUgZm9yIGVhY2ggQ29udHJpYnV0aW9uIG9uIHRoZSBkYXRlIHRoZSBDb250cmlidXRvciBmaXJzdAorZGlzdHJpYnV0ZXMgc3VjaCBDb250cmlidXRpb24uCisKKzIuMy4gTGltaXRhdGlvbnMgb24gR3JhbnQgU2NvcGUKKworVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIgYXJlIHRoZSBvbmx5IHJpZ2h0cyBncmFudGVkIHVuZGVyCit0aGlzIExpY2Vuc2UuIE5vIGFkZGl0aW9uYWwgcmlnaHRzIG9yIGxpY2Vuc2VzIHdpbGwgYmUgaW1wbGllZCBmcm9tIHRoZQorZGlzdHJpYnV0aW9uIG9yIGxpY2Vuc2luZyBvZiBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KK05vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCBieSBhCitDb250cmlidXRvcjoKKworKGEpIGZvciBhbnkgY29kZSB0aGF0IGEgQ29udHJpYnV0b3IgaGFzIHJlbW92ZWQgZnJvbSBDb3ZlcmVkIFNvZnR3YXJlOworICAgIG9yCisKKyhiKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSBZb3VyIGFuZCBhbnkgb3RoZXIgdGhpcmQgcGFydHkncworICAgIG1vZGlmaWNhdGlvbnMgb2YgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgaXRzCisgICAgQ29udHJpYnV0aW9ucyB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiBpdHMgQ29udHJpYnV0b3IKKyAgICBWZXJzaW9uKTsgb3IKKworKGMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YKKyAgICBpdHMgQ29udHJpYnV0aW9ucy4KKworVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IGFueSByaWdodHMgaW4gdGhlIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsCitvciBsb2dvcyBvZiBhbnkgQ29udHJpYnV0b3IgKGV4Y2VwdCBhcyBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvbXBseSB3aXRoCit0aGUgbm90aWNlIHJlcXVpcmVtZW50cyBpbiBTZWN0aW9uIDMuNCkuCisKKzIuNC4gU3Vic2VxdWVudCBMaWNlbnNlcworCitObyBDb250cmlidXRvciBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyBhcyBhIHJlc3VsdCBvZiBZb3VyIGNob2ljZSB0bworZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGlzCitMaWNlbnNlIChzZWUgU2VjdGlvbiAxMC4yKSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYKK3Blcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzLjMpLgorCisyLjUuIFJlcHJlc2VudGF0aW9uCisKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRoZSBDb250cmlidXRvciBiZWxpZXZlcyBpdHMKK0NvbnRyaWJ1dGlvbnMgYXJlIGl0cyBvcmlnaW5hbCBjcmVhdGlvbihzKSBvciBpdCBoYXMgc3VmZmljaWVudCByaWdodHMKK3RvIGdyYW50IHRoZSByaWdodHMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisyLjYuIEZhaXIgVXNlCisKK1RoaXMgTGljZW5zZSBpcyBub3QgaW50ZW5kZWQgdG8gbGltaXQgYW55IHJpZ2h0cyBZb3UgaGF2ZSB1bmRlcgorYXBwbGljYWJsZSBjb3B5cmlnaHQgZG9jdHJpbmVzIG9mIGZhaXIgdXNlLCBmYWlyIGRlYWxpbmcsIG9yIG90aGVyCitlcXVpdmFsZW50cy4KKworMi43LiBDb25kaXRpb25zCisKK1NlY3Rpb25zIDMuMSwgMy4yLCAzLjMsIGFuZCAzLjQgYXJlIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2VzIGdyYW50ZWQKK2luIFNlY3Rpb24gMi4xLgorCiszLiBSZXNwb25zaWJpbGl0aWVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKzMuMS4gRGlzdHJpYnV0aW9uIG9mIFNvdXJjZSBGb3JtCisKK0FsbCBkaXN0cmlidXRpb24gb2YgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBGb3JtLCBpbmNsdWRpbmcgYW55CitNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSwgbXVzdCBiZSB1bmRlcgordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgdGhhdCB0aGUgU291cmNlCitDb2RlIEZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UsIGFuZCBob3cgdGhleSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtYXkgbm90CithdHRlbXB0IHRvIGFsdGVyIG9yIHJlc3RyaWN0IHRoZSByZWNpcGllbnRzJyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlCitGb3JtLgorCiszLjIuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIEZvcm0KKworSWYgWW91IGRpc3RyaWJ1dGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIEZvcm0gdGhlbjoKKworKGEpIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUKKyAgICBGb3JtLCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjEsIGFuZCBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZgorICAgIHRoZSBFeGVjdXRhYmxlIEZvcm0gaG93IHRoZXkgY2FuIG9idGFpbiBhIGNvcHkgb2Ygc3VjaCBTb3VyY2UgQ29kZQorICAgIEZvcm0gYnkgcmVhc29uYWJsZSBtZWFucyBpbiBhIHRpbWVseSBtYW5uZXIsIGF0IGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIGRpc3RyaWJ1dGlvbiB0byB0aGUgcmVjaXBpZW50OyBhbmQKKworKGIpIFlvdSBtYXkgZGlzdHJpYnV0ZSBzdWNoIEV4ZWN1dGFibGUgRm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworICAgIExpY2Vuc2UsIG9yIHN1YmxpY2Vuc2UgaXQgdW5kZXIgZGlmZmVyZW50IHRlcm1zLCBwcm92aWRlZCB0aGF0IHRoZQorICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIEZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlcgorICAgIHRoZSByZWNpcGllbnRzJyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIEZvcm0gdW5kZXIgdGhpcyBMaWNlbnNlLgorCiszLjMuIERpc3RyaWJ1dGlvbiBvZiBhIExhcmdlciBXb3JrCisKK1lvdSBtYXkgY3JlYXRlIGFuZCBkaXN0cmlidXRlIGEgTGFyZ2VyIFdvcmsgdW5kZXIgdGVybXMgb2YgWW91ciBjaG9pY2UsCitwcm92aWRlZCB0aGF0IFlvdSBhbHNvIGNvbXBseSB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGZvcgordGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBMYXJnZXIgV29yayBpcyBhIGNvbWJpbmF0aW9uIG9mIENvdmVyZWQKK1NvZnR3YXJlIHdpdGggYSB3b3JrIGdvdmVybmVkIGJ5IG9uZSBvciBtb3JlIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kIHRoZQorQ292ZXJlZCBTb2Z0d2FyZSBpcyBub3QgSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzLCB0aGlzCitMaWNlbnNlIHBlcm1pdHMgWW91IHRvIGFkZGl0aW9uYWxseSBkaXN0cmlidXRlIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZQordW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2ggU2Vjb25kYXJ5IExpY2Vuc2UocyksIHNvIHRoYXQgdGhlIHJlY2lwaWVudCBvZgordGhlIExhcmdlciBXb3JrIG1heSwgYXQgdGhlaXIgb3B0aW9uLCBmdXJ0aGVyIGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQKK1NvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhpcyBMaWNlbnNlIG9yIHN1Y2ggU2Vjb25kYXJ5CitMaWNlbnNlKHMpLgorCiszLjQuIE5vdGljZXMKKworWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoZSBzdWJzdGFuY2Ugb2YgYW55IGxpY2Vuc2Ugbm90aWNlcworKGluY2x1ZGluZyBjb3B5cmlnaHQgbm90aWNlcywgcGF0ZW50IG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LAorb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5KSBjb250YWluZWQgd2l0aGluIHRoZSBTb3VyY2UgQ29kZSBGb3JtIG9mCit0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgZXhjZXB0IHRoYXQgWW91IG1heSBhbHRlciBhbnkgbGljZW5zZSBub3RpY2VzIHRvCit0aGUgZXh0ZW50IHJlcXVpcmVkIHRvIHJlbWVkeSBrbm93biBmYWN0dWFsIGluYWNjdXJhY2llcy4KKworMy41LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zCisKK1lvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsCitpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZAorU29mdHdhcmUuIEhvd2V2ZXIsIFlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KK2JlaGFsZiBvZiBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueQorc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5LCBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5CitZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSBldmVyeSBDb250cmlidXRvciBmb3IgYW55CitsaWFiaWxpdHkgaW5jdXJyZWQgYnkgc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwKK2luZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLiBZb3UgbWF5IGluY2x1ZGUgYWRkaXRpb25hbAorZGlzY2xhaW1lcnMgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eSBzcGVjaWZpYyB0byBhbnkKK2p1cmlzZGljdGlvbi4KKworNC4gSW5hYmlsaXR5IHRvIENvbXBseSBEdWUgdG8gU3RhdHV0ZSBvciBSZWd1bGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8gc29tZSBvciBhbGwgb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgZHVlIHRvCitzdGF0dXRlLCBqdWRpY2lhbCBvcmRlciwgb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpCitkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uIG11c3QKK2JlIHBsYWNlZCBpbiBhIHRleHQgZmlsZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBDb3ZlcmVkCitTb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHByb2hpYml0ZWQgYnkgc3RhdHV0ZQorb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYQorcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8gdW5kZXJzdGFuZCBpdC4KKworNS4gVGVybWluYXRpb24KKy0tLS0tLS0tLS0tLS0tCisKKzUuMS4gVGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5CitpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCBhbnkgb2YgaXRzIHRlcm1zLiBIb3dldmVyLCBpZiBZb3UgYmVjb21lCitjb21wbGlhbnQsIHRoZW4gdGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBmcm9tIGEgcGFydGljdWxhcgorQ29udHJpYnV0b3IgYXJlIHJlaW5zdGF0ZWQgKGEpIHByb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgc3VjaAorQ29udHJpYnV0b3IgZXhwbGljaXRseSBhbmQgZmluYWxseSB0ZXJtaW5hdGVzIFlvdXIgZ3JhbnRzLCBhbmQgKGIpIG9uIGFuCitvbmdvaW5nIGJhc2lzLCBpZiBzdWNoIENvbnRyaWJ1dG9yIGZhaWxzIHRvIG5vdGlmeSBZb3Ugb2YgdGhlCitub24tY29tcGxpYW5jZSBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMgcHJpb3IgdG8gNjAgZGF5cyBhZnRlciBZb3UgaGF2ZQorY29tZSBiYWNrIGludG8gY29tcGxpYW5jZS4gTW9yZW92ZXIsIFlvdXIgZ3JhbnRzIGZyb20gYSBwYXJ0aWN1bGFyCitDb250cmlidXRvciBhcmUgcmVpbnN0YXRlZCBvbiBhbiBvbmdvaW5nIGJhc2lzIGlmIHN1Y2ggQ29udHJpYnV0b3IKK25vdGlmaWVzIFlvdSBvZiB0aGUgbm9uLWNvbXBsaWFuY2UgYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZQorZmlyc3QgdGltZSBZb3UgaGF2ZSByZWNlaXZlZCBub3RpY2Ugb2Ygbm9uLWNvbXBsaWFuY2Ugd2l0aCB0aGlzIExpY2Vuc2UKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIFlvdSBiZWNvbWUgY29tcGxpYW50IHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK1lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCis1LjIuIElmIFlvdSBpbml0aWF0ZSBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSBieSBhc3NlcnRpbmcgYSBwYXRlbnQKK2luZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMsCitjb3VudGVyLWNsYWltcywgYW5kIGNyb3NzLWNsYWltcykgYWxsZWdpbmcgdGhhdCBhIENvbnRyaWJ1dG9yIFZlcnNpb24KK2RpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gdGhlIHJpZ2h0cyBncmFudGVkIHRvCitZb3UgYnkgYW55IGFuZCBhbGwgQ29udHJpYnV0b3JzIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciBTZWN0aW9uCisyLjEgb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZS4KKworNS4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNS4xIG9yIDUuMiBhYm92ZSwgYWxsCitlbmQgdXNlciBsaWNlbnNlIGFncmVlbWVudHMgKGV4Y2x1ZGluZyBkaXN0cmlidXRvcnMgYW5kIHJlc2VsbGVycykgd2hpY2gKK2hhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIFlvdXIgZGlzdHJpYnV0b3JzIHVuZGVyIHRoaXMgTGljZW5zZQorcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIDYuIERpc2NsYWltZXIgb2YgV2FycmFudHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIENvdmVyZWQgU29mdHdhcmUgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJhcyBpcyIgICAgICAgKgorKiAgYmFzaXMsIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQsIGltcGxpZWQsIG9yICAqCisqICBzdGF0dXRvcnksIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB3YXJyYW50aWVzIHRoYXQgdGhlICAgICAgICoKKyogIENvdmVyZWQgU29mdHdhcmUgaXMgZnJlZSBvZiBkZWZlY3RzLCBtZXJjaGFudGFibGUsIGZpdCBmb3IgYSAgICAgICAgKgorKiAgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5naW5nLiBUaGUgZW50aXJlIHJpc2sgYXMgdG8gdGhlICAgICAqCisqICBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyB3aXRoIFlvdS4gICAgICAgICoKKyogIFNob3VsZCBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBwcm92ZSBkZWZlY3RpdmUgaW4gYW55IHJlc3BlY3QsIFlvdSAgICAgKgorKiAgKG5vdCBhbnkgQ29udHJpYnV0b3IpIGFzc3VtZSB0aGUgY29zdCBvZiBhbnkgbmVjZXNzYXJ5IHNlcnZpY2luZywgICAqCisqICByZXBhaXIsIG9yIGNvcnJlY3Rpb24uIFRoaXMgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBjb25zdGl0dXRlcyBhbiAgICoKKyogIGVzc2VudGlhbCBwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8gdXNlIG9mIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGlzICAgKgorKiAgYXV0aG9yaXplZCB1bmRlciB0aGlzIExpY2Vuc2UgZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4gICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgNy4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LCB3aGV0aGVyIHRvcnQgICAgICAqCisqICAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLCBzaGFsbCBhbnkgICAgICAgICAgICoKKyogIENvbnRyaWJ1dG9yLCBvciBhbnlvbmUgd2hvIGRpc3RyaWJ1dGVzIENvdmVyZWQgU29mdHdhcmUgYXMgICAgICAgICAgKgorKiAgcGVybWl0dGVkIGFib3ZlLCBiZSBsaWFibGUgdG8gWW91IGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgICAgICAgICAqCisqICBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciAgICAgICoKKyogIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBkYW1hZ2VzIGZvciBsb3N0IHByb2ZpdHMsIGxvc3Mgb2YgICAgKgorKiAgZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSAgICAqCisqICBhbmQgYWxsIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMsIGV2ZW4gaWYgc3VjaCBwYXJ0eSAgICAgICoKKyogIHNoYWxsIGhhdmUgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLiBUaGlzICAgKgorKiAgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgICAqCisqICBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nIGZyb20gc3VjaCBwYXJ0eSdzIG5lZ2xpZ2VuY2UgdG8gdGhlICAgICAgICoKKyogIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaCBsaW1pdGF0aW9uLiBTb21lICAgICAgICAgICAgICAgKgorKiAganVyaXNkaWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mICAgICAgICAgICAqCisqICBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc28gdGhpcyBleGNsdXNpb24gYW5kICAgICAgICAgICoKKyogIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOC4gTGl0aWdhdGlvbgorLS0tLS0tLS0tLS0tLQorCitBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUKK2NvdXJ0cyBvZiBhIGp1cmlzZGljdGlvbiB3aGVyZSB0aGUgZGVmZW5kYW50IG1haW50YWlucyBpdHMgcHJpbmNpcGFsCitwbGFjZSBvZiBidXNpbmVzcyBhbmQgc3VjaCBsaXRpZ2F0aW9uIHNoYWxsIGJlIGdvdmVybmVkIGJ5IGxhd3Mgb2YgdGhhdAoranVyaXNkaWN0aW9uLCB3aXRob3V0IHJlZmVyZW5jZSB0byBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCitOb3RoaW5nIGluIHRoaXMgU2VjdGlvbiBzaGFsbCBwcmV2ZW50IGEgcGFydHkncyBhYmlsaXR5IHRvIGJyaW5nCitjcm9zcy1jbGFpbXMgb3IgY291bnRlci1jbGFpbXMuCisKKzkuIE1pc2NlbGxhbmVvdXMKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHRoZSBzdWJqZWN0CittYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCit1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQKK25lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMKK3RoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIKK3NoYWxsIG5vdCBiZSB1c2VkIHRvIGNvbnN0cnVlIHRoaXMgTGljZW5zZSBhZ2FpbnN0IGEgQ29udHJpYnV0b3IuCisKKzEwLiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEwLjEuIE5ldyBWZXJzaW9ucworCitNb3ppbGxhIEZvdW5kYXRpb24gaXMgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24KKzEwLjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgb3IKK3B1Ymxpc2ggbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQorZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuCisKKzEwLjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMKKworWW91IG1heSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbgorb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUsCitvciB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2UKK3N0ZXdhcmQuCisKKzEwLjMuIE1vZGlmaWVkIFZlcnNpb25zCisKK0lmIHlvdSBjcmVhdGUgc29mdHdhcmUgbm90IGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIHlvdSB3YW50IHRvCitjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3Igc3VjaCBzb2Z0d2FyZSwgeW91IG1heSBjcmVhdGUgYW5kIHVzZSBhCittb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiB5b3UgcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUKK2FueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQKK3N1Y2ggbW9kaWZpZWQgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKS4KKworMTAuNC4gRGlzdHJpYnV0aW5nIFNvdXJjZSBDb2RlIEZvcm0gdGhhdCBpcyBJbmNvbXBhdGlibGUgV2l0aCBTZWNvbmRhcnkKK0xpY2Vuc2VzCisKK0lmIFlvdSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSBTb3VyY2UgQ29kZSBGb3JtIHRoYXQgaXMgSW5jb21wYXRpYmxlIFdpdGgKK1NlY29uZGFyeSBMaWNlbnNlcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCB0aGUKK25vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBCIG9mIHRoaXMgTGljZW5zZSBtdXN0IGJlIGF0dGFjaGVkLgorCitFeGhpYml0IEEgLSBTb3VyY2UgQ29kZSBGb3JtIExpY2Vuc2UgTm90aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpYworICBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK0lmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCitmaWxlLCB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFCitmaWxlIGluIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vaworZm9yIHN1Y2ggYSBub3RpY2UuCisKK1lvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLgorCitFeGhpYml0IEIgLSAiSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzIiBOb3RpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyAiSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzIiwgYXMKKyAgZGVmaW5lZCBieSB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wLgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5SRUFETUUgYi9DT1BZSU5HLlJFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTViNjMyCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORy5SRUFETUUKQEAgLTAsMCArMSwxOCBAQAorRWlnZW4gaXMgcHJpbWFyaWx5IE1QTDIgbGljZW5zZWQuIFNlZSBDT1BZSU5HLk1QTDIgYW5kIHRoZXNlIGxpbmtzOgorICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8yLjAvCisgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLzIuMC9GQVEuaHRtbAorCitTb21lIGZpbGVzIGNvbnRhaW4gdGhpcmQtcGFydHkgY29kZSB1bmRlciBCU0Qgb3IgTEdQTCBsaWNlbnNlcywgd2hlbmNlIHRoZSBvdGhlcgorQ09QWUlORy4qIGZpbGVzIGhlcmUuCisKK0FsbCB0aGUgTEdQTCBjb2RlIGlzIGVpdGhlciBMR1BMIDIuMS1vbmx5LCBvciBMR1BMIDIuMS1vci1sYXRlci4KK0ZvciB0aGlzIHJlYXNvbiwgdGhlIENPUFlJTkcuTEdQTCBmaWxlIGNvbnRhaW5zIHRoZSBMR1BMIDIuMSB0ZXh0LgorCitJZiB5b3Ugd2FudCB0byBndWFyYW50ZWUgdGhhdCB0aGUgRWlnZW4gY29kZSB0aGF0IHlvdSBhcmUgI2luY2x1ZGluZyBpcyBsaWNlbnNlZAordW5kZXIgdGhlIE1QTDIgYW5kIHBvc3NpYmx5IG1vcmUgcGVybWlzc2l2ZSBsaWNlbnNlcyAobGlrZSBCU0QpLCAjZGVmaW5lIHRoaXMKK3ByZXByb2Nlc3NvciBzeW1ib2w6CisgIEVJR0VOX01QTDJfT05MWQorRm9yIGV4YW1wbGUsIHdpdGggbW9zdCBjb21waWxlcnMsIHlvdSBjb3VsZCBhZGQgdGhpcyB0byB5b3VyIHByb2plY3QgQ1hYRkxBR1M6CisgIC1ERUlHRU5fTVBMMl9PTkxZCitUaGlzIHdpbGwgY2F1c2UgYSBjb21waWxhdGlvbiBlcnJvciB0byBiZSBnZW5lcmF0ZWQgaWYgeW91ICNpbmNsdWRlIGFueSBjb2RlIHRoYXQgaXMKK0xHUEwgbGljZW5zZWQuCmRpZmYgLS1naXQgYS9DVGVzdENvbmZpZy5jbWFrZSBiL0NUZXN0Q29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWI0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9DVGVzdENvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDEzIEBACisjIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgeW91ciBwcm9qZWN0LgorIyMgVGhlbiBtb2RpZnkgdGhlIENNYWtlTGlzdHMudHh0IGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHlvdXIKKyMjIHByb2plY3QgdG8gaW5jb3Jwb3JhdGUgdGhlIHRlc3RpbmcgZGFzaGJvYXJkLgorIyMgIyBUaGUgZm9sbG93aW5nIGFyZSByZXF1aXJlZCB0byB1c2VzIERhcnQgYW5kIHRoZSBDZGFzaCBkYXNoYm9hcmQKKyMjICAgRU5BQkxFX1RFU1RJTkcoKQorIyMgICBJTkNMVURFKENUZXN0KQorc2V0KENURVNUX1BST0pFQ1RfTkFNRSAiRWlnZW4zLjMiKQorc2V0KENURVNUX05JR0hUTFlfU1RBUlRfVElNRSAiMDA6MDA6MDAgVVRDIikKKworc2V0KENURVNUX0RST1BfTUVUSE9EICJodHRwIikKK3NldChDVEVTVF9EUk9QX1NJVEUgIm1hbmFvLmlucmlhLmZyIikKK3NldChDVEVTVF9EUk9QX0xPQ0FUSU9OICIvQ0Rhc2gvc3VibWl0LnBocD9wcm9qZWN0PUVpZ2VuMy4zIikKK3NldChDVEVTVF9EUk9QX1NJVEVfQ0RBU0ggVFJVRSkKZGlmZiAtLWdpdCBhL0NUZXN0Q3VzdG9tLmNtYWtlLmluIGIvQ1Rlc3RDdXN0b20uY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZDlkMwotLS0gL2Rldi9udWxsCisrKyBiL0NUZXN0Q3VzdG9tLmNtYWtlLmluCkBAIC0wLDAgKzEsMyBAQAorCitzZXQoQ1RFU1RfQ1VTVE9NX01BWElNVU1fTlVNQkVSX09GX1dBUk5JTkdTICIyMDAwIikKK3NldChDVEVTVF9DVVNUT01fTUFYSU1VTV9OVU1CRVJfT0ZfRVJST1JTICAgIjIwMDAiKQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YmFmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKKyMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCisjIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgorIyBydW4gYmVmb3JlLgorIworIyBFLmcuOgorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQorIworIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKKyMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCisjCisjIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KKyMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KKyMKKyMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5CisjIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCisjIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91CisjIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKKyMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgRm9yIGV4YW1wbGU6CisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQorCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgVGhpcyBlbXB0eSBmaWxlIGlzIGhlcmUgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBvcHRpbWl6aW5nIHRoZSBBbmRyb2lkIGJ1aWxkCisjIFBsZWFzZSBrZWVwIGl0IHRoZXJlLCBhbmQgZW1wdHksIHRoYW5rcy4KZGlmZiAtLWdpdCBhL0VpZ2VuL0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2luY2x1ZGUoUmVnZXhVdGlscykKK3Rlc3RfZXNjYXBlX3N0cmluZ19hc19yZWdleCgpCisKK2ZpbGUoR0xPQiBFaWdlbl9kaXJlY3RvcnlfZmlsZXMgIioiKQorCitlc2NhcGVfc3RyaW5nX2FzX3JlZ2V4KEVTQ0FQRURfQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorCitmb3JlYWNoKGYgJHtFaWdlbl9kaXJlY3RvcnlfZmlsZXN9KQorICBpZihOT1QgZiBNQVRDSEVTICJcXC50eHQiIEFORCBOT1QgZiBNQVRDSEVTICIke0VTQ0FQRURfQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9bLl0uKyIgQU5EIE5PVCBmIE1BVENIRVMgIiR7RVNDQVBFRF9DTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyIpCisgICAgbGlzdChBUFBFTkQgRWlnZW5fZGlyZWN0b3J5X2ZpbGVzX3RvX2luc3RhbGwgJHtmfSkKKyAgZW5kaWYoKQorZW5kZm9yZWFjaChmICR7RWlnZW5fZGlyZWN0b3J5X2ZpbGVzfSkKKworaW5zdGFsbChGSUxFUworICAke0VpZ2VuX2RpcmVjdG9yeV9maWxlc190b19pbnN0YWxsfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuIENPTVBPTkVOVCBEZXZlbAorICApCisKK2luc3RhbGwoRElSRUNUT1JZIHNyYyBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuIENPTVBPTkVOVCBEZXZlbCBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQpkaWZmIC0tZ2l0IGEvRWlnZW4vQ2hvbGVza3kgYi9FaWdlbi9DaG9sZXNreQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlkMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vQ2hvbGVza3kKQEAgLTAsMCArMSw0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ0hPTEVTS1lfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fQ0hPTEVTS1lfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogXGRlZmdyb3VwIENob2xlc2t5X01vZHVsZSBDaG9sZXNreSBtb2R1bGUKKyAgKgorICAqCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0d28gdmFyaWFudHMgb2YgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLgorICAqIFRob3NlIGRlY29tcG9zaXRpb25zIGFyZSBhbHNvIGFjY2Vzc2libGUgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgKiAgLSBNYXRyaXhCYXNlOjpsbHQoKQorICAqICAtIE1hdHJpeEJhc2U6OmxkbHQoKQorICAqICAtIFNlbGZBZGpvaW50Vmlldzo6bGx0KCkKKyAgKiAgLSBTZWxmQWRqb2ludFZpZXc6OmxkbHQoKQorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgInNyYy9DaG9sZXNreS9MTFQuaCIKKyNpbmNsdWRlICJzcmMvQ2hvbGVza3kvTERMVC5oIgorI2lmZGVmIEVJR0VOX1VTRV9MQVBBQ0tFCisjaW5jbHVkZSAic3JjL21pc2MvbGFwYWNrZS5oIgorI2luY2x1ZGUgInNyYy9DaG9sZXNreS9MTFRfTEFQQUNLRS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0NIT0xFU0tZX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vQ2hvbG1vZFN1cHBvcnQgYi9FaWdlbi9DaG9sbW9kU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ4OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vQ2hvbG1vZFN1cHBvcnQKQEAgLTAsMCArMSw0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ0hPTE1PRFNVUFBPUlRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fQ0hPTE1PRFNVUFBPUlRfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCitleHRlcm4gIkMiIHsKKyAgI2luY2x1ZGUgPGNob2xtb2QuaD4KK30KKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUgQ2hvbG1vZFN1cHBvcnQgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIENob2xtb2QgbGlicmFyeSB3aGljaCBpcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnN1aXRlc3BhcnNlLmNvbSI+c3VpdGVzcGFyc2U8L2E+IHBhY2thZ2UuCisgICogSXQgcHJvdmlkZXMgdGhlIHR3byBmb2xsb3dpbmcgbWFpbiBmYWN0b3JpemF0aW9uIGNsYXNzZXM6CisgICogLSBjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVDogYSBzdXBlcm5vZGFsIExMVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uLgorICAqIC0gY2xhc3MgQ2hvbG1vZERlY29tcG9zaWl0b246IGEgZ2VuZXJhbCBMKEQpTFQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiB3aXRoIGF1dG9tYXRpYyBvciBleHBsaWNpdCBydW50aW1lIHNlbGVjdGlvbiBvZiB0aGUgdW5kZXJseWluZyBmYWN0b3JpemF0aW9uIG1ldGhvZCAoc3VwZXJub2RhbCBvciBzaW1wbGljaWFsKS4KKyAgKgorICAqIEZvciB0aGUgc2FrZSBvZiBjb21wbGV0ZW5lc3MsIHRoaXMgbW9kdWxlIGFsc28gcHJvcG9zZSB0aGUgdHdvIGZvbGxvd2luZyBjbGFzc2VzOgorICAqIC0gY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMTFQKKyAgKiAtIGNsYXNzIENob2xtb2RTaW1wbGljaWFsTERMVAorICAqIE5vdGUgdGhhdCB0aGVzZSBjbGFzc2VzIGRvZXMgbm90IGJyaW5nIGFueSBwYXJ0aWN1bGFyIGFkdmFudGFnZSBjb21wYXJlZCB0byB0aGUgYnVpbHQtaW4KKyAgKiBTaW1wbGljaWFsTExUIGFuZCBTaW1wbGljaWFsTERMVCBmYWN0b3JpemF0aW9uIGNsYXNzZXMuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9DaG9sbW9kU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB0aGUgY2hvbG1vZCBoZWFkZXJzIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbmNsdWRlIHBhdGhzLCBhbmQgeW91ciBiaW5hcnkgbXVzdCBiZSBsaW5rZWQgdG8gdGhlIGNob2xtb2QgbGlicmFyeSBhbmQgaXRzIGRlcGVuZGVuY2llcy4KKyAgKiBUaGUgZGVwZW5kZW5jaWVzIGRlcGVuZCBvbiBob3cgY2hvbG1vZCBoYXMgYmVlbiBjb21waWxlZC4KKyAgKiBGb3IgYSBjbWFrZSBiYXNlZCBwcm9qZWN0LCB5b3UgY2FuIHVzZSBvdXIgRmluZENob2xtb2QuY21ha2UgbW9kdWxlIHRvIGhlbHAgeW91IGluIHRoaXMgdGFzay4KKyAgKgorICAqLworCisjaW5jbHVkZSAic3JjL0Nob2xtb2RTdXBwb3J0L0Nob2xtb2RTdXBwb3J0LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0NIT0xNT0RTVVBQT1JUX01PRFVMRV9ICisKZGlmZiAtLWdpdCBhL0VpZ2VuL0NvcmUgYi9FaWdlbi9Db3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2ZhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9Db3JlCkBAIC0wLDAgKzEsNTE2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT1JFX0gKKyNkZWZpbmUgRUlHRU5fQ09SRV9ICisKKy8vIGZpcnN0IHRoaW5nIEVpZ2VuIGRvZXM6IHN0b3AgdGhlIGNvbXBpbGVyIGZyb20gY29tbWl0dGluZyBzdWljaWRlCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworLy8gSGFuZGxlIE5WQ0MvQ1VEQS9TWUNMCisjaWYgZGVmaW5lZChfX0NVREFDQ19fKSB8fCBkZWZpbmVkKF9fU1lDTF9ERVZJQ0VfT05MWV9fKQorICAvLyBEbyBub3QgdHJ5IGFzc2VydHMgb24gQ1VEQSBhbmQgU1lDTCEKKyAgI2lmbmRlZiBFSUdFTl9OT19ERUJVRworICAjZGVmaW5lIEVJR0VOX05PX0RFQlVHCisgICNlbmRpZgorCisgICNpZmRlZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyAgI3VuZGVmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORworICAjZW5kaWYKKworICAjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworICAjdW5kZWYgRUlHRU5fRVhDRVBUSU9OUworICAjZW5kaWYKKworICAvLyBBbGwgZnVuY3Rpb25zIGNhbGxhYmxlIGZyb20gQ1VEQSBjb2RlIG11c3QgYmUgcXVhbGlmaWVkIHdpdGggX19kZXZpY2VfXworICAjaWZkZWYgX19DVURBQ0NfXworICAgIC8vIERvIG5vdCB0cnkgdG8gdmVjdG9yaXplIG9uIENVREEgYW5kIFNZQ0whCisgICAgI2lmbmRlZiBFSUdFTl9ET05UX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fRE9OVF9WRUNUT1JJWkUKKyAgICAjZW5kaWYKKworICAgICNkZWZpbmUgRUlHRU5fREVWSUNFX0ZVTkMgX19ob3N0X18gX19kZXZpY2VfXworICAgIC8vIFdlIG5lZWQgbWF0aF9mdW5jdGlvbnMuaHBwIHRvIGVuc3VyZSB0aGF0IHRoYXQgRUlHRU5fVVNJTkdfU1REX01BVEggbWFjcm8KKyAgICAvLyB3b3JrcyBwcm9wZXJseSBvbiB0aGUgZGV2aWNlIHNpZGUKKyAgICAjaW5jbHVkZSA8bWF0aF9mdW5jdGlvbnMuaHBwPgorICAjZWxzZQorICAgICNkZWZpbmUgRUlHRU5fREVWSUNFX0ZVTkMKKyAgI2VuZGlmCisKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fREVWSUNFX0ZVTkMKKworI2VuZGlmCisKKy8vIFdoZW4gY29tcGlsaW5nIENVREEgZGV2aWNlIGNvZGUgd2l0aCBOVkNDLCBwdWxsIGluIG1hdGggZnVuY3Rpb25zIGZyb20gdGhlCisvLyBnbG9iYWwgbmFtZXNwYWNlLiAgSW4gaG9zdCBtb2RlLCBhbmQgd2hlbiBkZXZpY2UgZG9lZSB3aXRoIGNsYW5nLCB1c2UgdGhlCisvLyBzdGQgdmVyc2lvbnMuCisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBkZWZpbmVkKF9fTlZDQ19fKQorICAjZGVmaW5lIEVJR0VOX1VTSU5HX1NURF9NQVRIKEZVTkMpIHVzaW5nIDo6RlVOQzsKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fVVNJTkdfU1REX01BVEgoRlVOQykgdXNpbmcgc3RkOjpGVU5DOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfQ1BQVU5XSU5EKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykpICYmICFkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmICFkZWZpbmVkKEVJR0VOX0VYQ0VQVElPTlMpICYmICFkZWZpbmVkKEVJR0VOX1VTRV9TWUNMKQorICAjZGVmaW5lIEVJR0VOX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworICAjaW5jbHVkZSA8bmV3PgorI2VuZGlmCisKKy8vIHRoZW4gaW5jbHVkZSB0aGlzIGZpbGUgd2hlcmUgYWxsIG91ciBtYWNyb3MgYXJlIGRlZmluZWQuIEl0J3MgcmVhbGx5IGltcG9ydGFudCB0byBkbyBpdCBmaXJzdCBiZWNhdXNlCisvLyBpdCdzIHdoZXJlIHdlIGRvIGFsbCB0aGUgYWxpZ25tZW50IHNldHRpbmdzIChwbGF0Zm9ybSBkZXRlY3Rpb24gYW5kIGhvbm9yaW5nIHRoZSB1c2VyJ3Mgd2lsbCBpZiBoZQorLy8gZGVmaW5lZCBlLmcuIEVJR0VOX0RPTlRfQUxJR04pIHNvIGl0IG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggdmVjdG9yaXphdGlvbi4KKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL01hY3Jvcy5oIgorCisvLyBEaXNhYmxlIHRoZSBpcGEtY3AtY2xvbmUgb3B0aW1pemF0aW9uIGZsYWcgd2l0aCBNaW5HVyA2Lnggb3IgbmV3ZXIgKGVuYWJsZWQgYnkgZGVmYXVsdCB3aXRoIC1PMykKKy8vIFNlZSBodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9iei9zaG93X2J1Zy5jZ2k/aWQ9NTU2IGZvciBkZXRhaWxzLgorI2lmIEVJR0VOX0NPTVBfTUlOR1cgJiYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDYpCisgICNwcmFnbWEgR0NDIG9wdGltaXplICgiLWZuby1pcGEtY3AtY2xvbmUiKQorI2VuZGlmCisKKyNpbmNsdWRlIDxjb21wbGV4PgorCisvLyB0aGlzIGluY2x1ZGUgZmlsZSBtYW5hZ2VzIEJMQVMgYW5kIE1LTCByZWxhdGVkIG1hY3JvcworLy8gYW5kIGluY2x1c2lvbiBvZiB0aGVpciByZXNwZWN0aXZlIGhlYWRlciBmaWxlcworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworLy8gaWYgYWxpZ25tZW50IGlzIGRpc2FibGVkLCB0aGVuIGRpc2FibGUgdmVjdG9yaXphdGlvbi4gTm90ZTogRUlHRU5fTUFYX0FMSUdOX0JZVEVTIGlzIHRoZSBwcm9wZXIgY2hlY2ssIGl0IHRha2VzIGludG8KKy8vIGFjY291bnQgYm90aCB0aGUgdXNlcidzIHdpbGwgKEVJR0VOX01BWF9BTElHTl9CWVRFUyxFSUdFTl9ET05UX0FMSUdOKSBhbmQgb3VyIG93biBwbGF0Zm9ybSBjaGVja3MKKyNpZiBFSUdFTl9NQVhfQUxJR05fQllURVM9PTAKKyAgI2lmbmRlZiBFSUdFTl9ET05UX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fRE9OVF9WRUNUT1JJWkUKKyAgI2VuZGlmCisjZW5kaWYKKworI2lmIEVJR0VOX0NPTVBfTVNWQworICAjaW5jbHVkZSA8bWFsbG9jLmg+IC8vIGZvciBfYWxpZ25lZF9tYWxsb2MgLS0gbmVlZCBpdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdmVjdG9yaXphdGlvbiBpcyBlbmFibGVkCisgICNpZiAoRUlHRU5fQ09NUF9NU1ZDID49IDE1MDApIC8vIDIwMDggb3IgbGF0ZXIKKyAgICAvLyBSZW1lbWJlciB0aGF0IHVzYWdlIG9mIGRlZmluZWQoKSBpbiBhICNkZWZpbmUgaXMgdW5kZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAvLyBhIHVzZXIgcmVwb3J0ZWQgdGhhdCBpbiA2NC1iaXQgbW9kZSwgTVNWQyBkb2Vzbid0IGNhcmUgdG8gZGVmaW5lIF9NX0lYODZfRlAuCisgICAgI2lmIChkZWZpbmVkKF9NX0lYODZfRlApICYmIChfTV9JWDg2X0ZQID49IDIpKSB8fCBFSUdFTl9BUkNIX3g4Nl82NAorICAgICAgI2RlZmluZSBFSUdFTl9TU0UyX09OX01TVkNfMjAwOF9PUl9MQVRFUgorICAgICNlbmRpZgorICAjZW5kaWYKKyNlbHNlCisgIC8vIFJlbWVtYmVyIHRoYXQgdXNhZ2Ugb2YgZGVmaW5lZCgpIGluIGEgI2RlZmluZSBpcyB1bmRlZmluZWQgYnkgdGhlIHN0YW5kYXJkCisgICNpZiAoZGVmaW5lZCBfX1NTRTJfXykgJiYgKCAoIUVJR0VOX0NPTVBfR05VQykgfHwgRUlHRU5fQ09NUF9JQ0MgfHwgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDIpICkKKyAgICAjZGVmaW5lIEVJR0VOX1NTRTJfT05fTk9OX01TVkNfQlVUX05PVF9PTERfR0NDCisgICNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fRE9OVF9WRUNUT1JJWkUKKworICAjaWYgZGVmaW5lZCAoRUlHRU5fU1NFMl9PTl9OT05fTVNWQ19CVVRfTk9UX09MRF9HQ0MpIHx8IGRlZmluZWQoRUlHRU5fU1NFMl9PTl9NU1ZDXzIwMDhfT1JfTEFURVIpCisKKyAgICAvLyBEZWZpbmVzIHN5bWJvbHMgZm9yIGNvbXBpbGUtdGltZSBkZXRlY3Rpb24gb2Ygd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorICAgIC8vIHVzZWQuCisgICAgLy8gRUlHRU5fVkVDVE9SSVpFX1lZIGlzIGRlZmluZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGluc3RydWN0aW9uIHNldCBZWSBpcyB1c2VkCisgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkUKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU0UKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU0UyCisKKyAgICAvLyBEZXRlY3Qgc3NlMy9zc3NlMy9zc2U0OgorICAgIC8vIGdjYyBhbmQgaWNjIGRlZmluZXMgX19TU0UzX18sIC4uLgorICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGFib3V0IHRoaXMgb24gbXN2Yy4gWW91IGNhbiBkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRSogaWYgeW91CisgICAgLy8gd2FudCB0byBmb3JjZSB0aGUgdXNlIG9mIHRob3NlIGluc3RydWN0aW9ucyB3aXRoIG1zdmMuCisgICAgI2lmZGVmIF9fU1NFM19fCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgICAgI2VuZGlmCisgICAgI2lmZGVmIF9fU1NTRTNfXworICAgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfU1NTRTMKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX19TU0U0XzFfXworICAgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgICAgI2VuZGlmCisgICAgI2lmZGVmIF9fU1NFNF8yX18KKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMgorICAgICNlbmRpZgorICAgICNpZmRlZiBfX0FWWF9fCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9BVlgKKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTU0UzCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMgorICAgICNlbmRpZgorICAgICNpZmRlZiBfX0FWWDJfXworICAgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfQVZYMgorICAgICNlbmRpZgorICAgICNpZmRlZiBfX0ZNQV9fCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9GTUEKKyAgICAjZW5kaWYKKyAgICAjaWYgZGVmaW5lZChfX0FWWDUxMkZfXykgJiYgZGVmaW5lZChFSUdFTl9FTkFCTEVfQVZYNTEyKQorICAgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9BVlgyCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9BVlgKKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX0ZNQQorICAgICAgI2lmZGVmIF9fQVZYNTEyRFFfXworICAgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTJEUQorICAgICAgI2VuZGlmCisgICAgI2VuZGlmCisKKyAgICAvLyBpbmNsdWRlIGZpbGVzCisKKyAgICAvLyBUaGlzIGV4dGVybiAiQyIgd29ya3MgYXJvdW5kIGEgTUlOR1ctdzY0IGNvbXBpbGF0aW9uIGlzc3VlCisgICAgLy8gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTMwMTgzOTQmZ3JvdXBfaWQ9MjAyODgwJmF0aWQ9OTgzMzU0CisgICAgLy8gSW4gZXNzZW5jZSwgaW50cmluLmggaXMgaW5jbHVkZWQgYnkgd2luZG93cy5oIGFuZCBhbHNvIGRlY2xhcmVzIGludHJpbnNpY3MgKGp1c3QgYXMgZW1taW50cmluLmggZXRjLiBiZWxvdyBkbykuCisgICAgLy8gSG93ZXZlciwgaW50cmluLmggdXNlcyBhbiBleHRlcm4gIkMiIGRlY2xhcmF0aW9uLCBhbmQgZysrIHRodXMgY29tcGxhaW5zIG9mIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMKKyAgICAvLyB3aXRoIGNvbmZsaWN0aW5nIGxpbmthZ2UuICBUaGUgbGlua2FnZSBmb3IgaW50cmluc2ljcyBkb2Vzbid0IG1hdHRlciwgYnV0IGF0IHRoYXQgc3RhZ2UgdGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vdzsKKyAgICAvLyBzbywgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMgd2hlbiB3aW5kb3dzLmggaXMgaW5jbHVkZWQgYWZ0ZXIgRWlnZW4vQ29yZSwgZW5zdXJlIGludHJpbnNpY3MgYXJlIGV4dGVybiAiQyIgaGVyZSB0b28uCisgICAgLy8gbm90aWNlIHRoYXQgc2luY2UgdGhlc2UgYXJlIEMgaGVhZGVycywgdGhlIGV4dGVybiAiQyIgaXMgdGhlb3JldGljYWxseSBuZWVkZWQgYW55d2F5cy4KKyAgICBleHRlcm4gIkMiIHsKKyAgICAgIC8vIEluIHRoZW9yeSB3ZSBzaG91bGQgb25seSBpbmNsdWRlIGltbWludHJpbi5oIGFuZCBub3QgdGhlIG90aGVyICptbWludHJpbi5oIGhlYWRlciBmaWxlcyBkaXJlY3RseS4KKyAgICAgIC8vIERvaW5nIHNvIHRyaWdnZXJzIHNvbWUgaXNzdWVzIHdpdGggSUNDLiBIb3dldmVyIG9sZCBnY2MgdmVyc2lvbnMgc2VlbXMgdG8gbm90IGhhdmUgdGhpcyBmaWxlLCB0aHVzOgorICAgICAgI2lmIEVJR0VOX0NPTVBfSUNDID49IDExMTAKKyAgICAgICAgI2luY2x1ZGUgPGltbWludHJpbi5oPgorICAgICAgI2Vsc2UKKyAgICAgICAgI2luY2x1ZGUgPG1taW50cmluLmg+CisgICAgICAgICNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyAgICAgICAgI2luY2x1ZGUgPHhtbWludHJpbi5oPgorICAgICAgICAjaWZkZWYgIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgICAgICAgICNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NTRTMKKyAgICAgICAgI2luY2x1ZGUgPHRtbWludHJpbi5oPgorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgICAgICAgI2luY2x1ZGUgPHNtbWludHJpbi5oPgorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzIKKyAgICAgICAgI2luY2x1ZGUgPG5tbWludHJpbi5oPgorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX0FWWCkgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQVZYNTEyKQorICAgICAgICAjaW5jbHVkZSA8aW1taW50cmluLmg+CisgICAgICAgICNlbmRpZgorICAgICAgI2VuZGlmCisgICAgfSAvLyBlbmQgZXh0ZXJuICJDIgorICAjZWxpZiBkZWZpbmVkIF9fVlNYX18KKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1ZTWAorICAgICNpbmNsdWRlIDxhbHRpdmVjLmg+CisgICAgLy8gV2UgbmVlZCB0byAjdW5kZWYgYWxsIHRoZXNlIHVnbHkgdG9rZW5zIGRlZmluZWQgaW4gPGFsdGl2ZWMuaD4KKyAgICAvLyA9PiB1c2UgX192ZWN0b3IgaW5zdGVhZCBvZiB2ZWN0b3IKKyAgICAjdW5kZWYgYm9vbAorICAgICN1bmRlZiB2ZWN0b3IKKyAgICAjdW5kZWYgcGl4ZWwKKyAgI2VsaWYgZGVmaW5lZCBfX0FMVElWRUNfXworICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFCisgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQworICAgICNpbmNsdWRlIDxhbHRpdmVjLmg+CisgICAgLy8gV2UgbmVlZCB0byAjdW5kZWYgYWxsIHRoZXNlIHVnbHkgdG9rZW5zIGRlZmluZWQgaW4gPGFsdGl2ZWMuaD4KKyAgICAvLyA9PiB1c2UgX192ZWN0b3IgaW5zdGVhZCBvZiB2ZWN0b3IKKyAgICAjdW5kZWYgYm9vbAorICAgICN1bmRlZiB2ZWN0b3IKKyAgICAjdW5kZWYgcGl4ZWwKKyAgI2VsaWYgKGRlZmluZWQgIF9fQVJNX05FT04pIHx8IChkZWZpbmVkIF9fQVJNX05FT05fXykKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX05FT04KKyAgICAjaW5jbHVkZSA8YXJtX25lb24uaD4KKyAgI2VsaWYgKGRlZmluZWQgX19zMzkweF9fICYmIGRlZmluZWQgX19WRUNfXykKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1pWRUNUT1IKKyAgICAjaW5jbHVkZSA8dmVjaW50cmluLmg+CisgICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fRjE2Q19fKSAmJiAhZGVmaW5lZChFSUdFTl9DT01QX0NMQU5HKQorICAvLyBXZSBjYW4gdXNlIHRoZSBvcHRpbWl6ZWQgZnAxNiB0byBmbG9hdCBhbmQgZmxvYXQgdG8gZnAxNiBjb252ZXJzaW9uIHJvdXRpbmVzCisgICNkZWZpbmUgRUlHRU5fSEFTX0ZQMTZfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fQ1VEQUNDX18KKyAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfQ1VEQQorICAjaW5jbHVkZSA8dmVjdG9yX3R5cGVzLmg+CisgICNpZiBkZWZpbmVkIF9fQ1VEQUNDX1ZFUl9fICYmIF9fQ1VEQUNDX1ZFUl9fID49IDcwNTAwCisgICAgI2RlZmluZSBFSUdFTl9IQVNfQ1VEQV9GUDE2CisgICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEVJR0VOX0hBU19DVURBX0ZQMTYKKyAgI2luY2x1ZGUgPGhvc3RfZGVmaW5lcy5oPgorICAjaW5jbHVkZSA8Y3VkYV9mcDE2Lmg+CisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9PUEVOTVApICYmICghZGVmaW5lZCBFSUdFTl9ET05UX1BBUkFMTEVMSVpFKQorICAjZGVmaW5lIEVJR0VOX0hBU19PUEVOTVAKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAorI2luY2x1ZGUgPG9tcC5oPgorI2VuZGlmCisKKy8vIE1TVkMgZm9yIHdpbmRvd3MgbW9iaWxlIGRvZXMgbm90IGhhdmUgdGhlIGVycm5vLmggZmlsZQorI2lmICEoRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX09TX1dJTkNFKSAmJiAhRUlHRU5fQ09NUF9BUk0KKyNkZWZpbmUgRUlHRU5fSEFTX0VSUk5PCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX0hBU19FUlJOTworI2luY2x1ZGUgPGNlcnJubz4KKyNlbmRpZgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxjbGltaXRzPiAvLyBmb3IgQ0hBUl9CSVQKKy8vIGZvciBtaW4vbWF4OgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLy8gZm9yIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGUKKyNpZmRlZiBFSUdFTl9JTkNMVURFX1RZUEVfVFJBSVRTCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworLy8gZm9yIG91dHB1dHRpbmcgZGVidWcgaW5mbworI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0lHTgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisKKy8vIHJlcXVpcmVkIGZvciBfX2NwdWlkLCBuZWVkcyB0byBiZSBpbmNsdWRlZCBhZnRlciBjbWF0aAorI2lmIEVJR0VOX0NPTVBfTVNWQyAmJiBFSUdFTl9BUkNIX2kzODZfT1JfeDg2XzY0ICYmICFFSUdFTl9PU19XSU5DRQorICAjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKworLyoqIFxicmllZiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgc3ltYm9scyBmcm9tIHRoZSAlRWlnZW4gbGlicmFyeS4gKi8KK25hbWVzcGFjZSBFaWdlbiB7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqU2ltZEluc3RydWN0aW9uU2V0c0luVXNlKHZvaWQpIHsKKyNpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTIpCisgIHJldHVybiAiQVZYNTEyLCBGTUEsIEFWWDIsIEFWWCwgU1NFLCBTU0UyLCBTU0UzLCBTU1NFMywgU1NFNC4xLCBTU0U0LjIiOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQVZYKQorICByZXR1cm4gIkFWWCBTU0UsIFNTRTIsIFNTRTMsIFNTU0UzLCBTU0U0LjEsIFNTRTQuMiI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzIpCisgIHJldHVybiAiU1NFLCBTU0UyLCBTU0UzLCBTU1NFMywgU1NFNC4xLCBTU0U0LjIiOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFNF8xKQorICByZXR1cm4gIlNTRSwgU1NFMiwgU1NFMywgU1NTRTMsIFNTRTQuMSI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU1NFMykKKyAgcmV0dXJuICJTU0UsIFNTRTIsIFNTRTMsIFNTU0UzIjsKKyNlbGlmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX1NTRTMpCisgIHJldHVybiAiU1NFLCBTU0UyLCBTU0UzIjsKKyNlbGlmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX1NTRTIpCisgIHJldHVybiAiU1NFLCBTU0UyIjsKKyNlbGlmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX0FMVElWRUMpCisgIHJldHVybiAiQWx0aVZlYyI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9WU1gpCisgIHJldHVybiAiVlNYIjsKKyNlbGlmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX05FT04pCisgIHJldHVybiAiQVJNIE5FT04iOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfWlZFQ1RPUikKKyAgcmV0dXJuICJTMzkwWCBaVkVDVE9SIjsKKyNlbHNlCisgIHJldHVybiAiTm9uZSI7CisjZW5kaWYKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNpZiBkZWZpbmVkIEVJR0VOMl9TVVBQT1JUX1NUQUdFNDBfRlVMTF9FSUdFTjNfU1RSSUNUTkVTUyB8fCBkZWZpbmVkIEVJR0VOMl9TVVBQT1JUX1NUQUdFMzBfRlVMTF9FSUdFTjNfQVBJIHx8IGRlZmluZWQgRUlHRU4yX1NVUFBPUlRfU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMgfHwgZGVmaW5lZCBFSUdFTjJfU1VQUE9SVF9TVEFHRTEwX0ZVTExfRUlHRU4yX0FQSSB8fCBkZWZpbmVkIEVJR0VOMl9TVVBQT1JUCisvLyBUaGlzIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZToKKyNlcnJvciBFaWdlbjItc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB1cCB0byB2ZXJzaW9uIDMuMi4gUGxlYXNlIGdvIHRvICJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9pbmRleC5waHA/dGl0bGU9RWlnZW4yIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbgorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8vIHdlIHVzZSBzaXplX3QgZnJlcXVlbnRseSBhbmQgd2UnbGwgbmV2ZXIgcmVtZW1iZXIgdG8gcHJlcGVuZCBpdCB3aXRoIHN0ZDo6IGV2ZXJ5dGltZSBqdXN0IHRvCisvLyBlbnN1cmUgUU5YL1FDQyBzdXBwb3J0Cit1c2luZyBzdGQ6OnNpemVfdDsKKy8vIGdjYyA0LjYuMCB3YW50cyBzdGQ6OiBmb3IgcHRyZGlmZl90Cit1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworfQorCisvKiogXGRlZmdyb3VwIENvcmVfTW9kdWxlIENvcmUgbW9kdWxlCisgICogVGhpcyBpcyB0aGUgbWFpbiBtb2R1bGUgb2YgRWlnZW4gcHJvdmlkaW5nIGRlbnNlIG1hdHJpeCBhbmQgdmVjdG9yIHN1cHBvcnQKKyAgKiAoYm90aCBmaXhlZCBhbmQgZHluYW1pYyBzaXplKSB3aXRoIGFsbCB0aGUgZmVhdHVyZXMgY29ycmVzcG9uZGluZyB0byBhIEJMQVMgbGlicmFyeQorICAqIGFuZCBtdWNoIG1vcmUuLi4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9NZXRhLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9Gb3J3YXJkRGVjbGFyYXRpb25zLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9TdGF0aWNBc3NlcnQuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1hwckhlbHBlci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvTWVtb3J5LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS9OdW1UcmFpdHMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9NYXRoRnVuY3Rpb25zLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvR2VuZXJpY1BhY2tldE1hdGguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9NYXRoRnVuY3Rpb25zSW1wbC5oIgorCisjaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWC9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWDUxMi9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWDUxMi9NYXRoRnVuY3Rpb25zLmgiCisjZWxpZiBkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9BVlgKKyAgLy8gVXNlIEFWWCBmb3IgZmxvYXRzIGFuZCBkb3VibGVzLCBTU0UgZm9yIGludGVnZXJzCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWC9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWC9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWC9Db21wbGV4LmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FWWC9UeXBlQ2FzdGluZy5oIgorI2VsaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfU1NFCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9UeXBlQ2FzdGluZy5oIgorI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQykgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfVlNYKQorICAjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9BbHRpVmVjL1BhY2tldE1hdGguaCIKKyAgI2luY2x1ZGUgInNyYy9Db3JlL2FyY2gvQWx0aVZlYy9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FsdGlWZWMvQ29tcGxleC5oIgorI2VsaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfTkVPTgorICAjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9ORU9OL1BhY2tldE1hdGguaCIKKyAgI2luY2x1ZGUgInNyYy9Db3JlL2FyY2gvTkVPTi9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL05FT04vQ29tcGxleC5oIgorI2VsaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfWlZFQ1RPUgorICAjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9aVmVjdG9yL1BhY2tldE1hdGguaCIKKyAgI2luY2x1ZGUgInNyYy9Db3JlL2FyY2gvWlZlY3Rvci9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1pWZWN0b3IvQ29tcGxleC5oIgorI2VuZGlmCisKKy8vIEhhbGYgZmxvYXQgc3VwcG9ydAorI2luY2x1ZGUgInNyYy9Db3JlL2FyY2gvQ1VEQS9IYWxmLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9DVURBL1BhY2tldE1hdGhIYWxmLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9DVURBL1R5cGVDYXN0aW5nLmgiCisKKyNpZiBkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9DVURBCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0NVREEvUGFja2V0TWF0aC5oIgorICAjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9DVURBL01hdGhGdW5jdGlvbnMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9EZWZhdWx0L1NldHRpbmdzLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS9mdW5jdG9ycy9UZXJuYXJ5RnVuY3RvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9mdW5jdG9ycy9CaW5hcnlGdW5jdG9ycy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL2Z1bmN0b3JzL1VuYXJ5RnVuY3RvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9mdW5jdG9ycy9OdWxsYXJ5RnVuY3RvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9mdW5jdG9ycy9TdGxGdW5jdG9ycy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL2Z1bmN0b3JzL0Fzc2lnbm1lbnRGdW5jdG9ycy5oIgorCisvLyBTcGVjaWFsaXplZCBmdW5jdG9ycyB0byBlbmFibGUgdGhlIHByb2Nlc3Npbmcgb2YgY29tcGxleCBudW1iZXJzCisvLyBvbiBDVURBIGRldmljZXMKKyNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0NVREEvQ29tcGxleC5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvSU8uaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9EZW5zZUNvZWZmc0Jhc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9EZW5zZUJhc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9NYXRyaXhCYXNlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRWlnZW5CYXNlLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS9Qcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQ29yZUV2YWx1YXRvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Bc3NpZ25FdmFsdWF0b3IuaCIKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTiAvLyB3b3JrIGFyb3VuZCBEb3h5Z2VuIGJ1ZyB0cmlnZ2VyZWQgYnkgQXNzaWduLmggcjgxNDg3NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBsZWFzdCBjb25maXJtZWQgd2l0aCBEb3h5Z2VuIDEuNS41IGFuZCAxLjUuNgorICAjaW5jbHVkZSAic3JjL0NvcmUvQXNzaWduLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9Db3JlL0FycmF5QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvQmxhc1V0aWwuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9EZW5zZVN0b3JhZ2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9OZXN0QnlWYWx1ZS5oIgorCisvLyAjaW5jbHVkZSAic3JjL0NvcmUvRm9yY2VBbGlnbmVkQWNjZXNzLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS9SZXR1cm5CeVZhbHVlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvTm9BbGlhcy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1BsYWluT2JqZWN0QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL01hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0FycmF5LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQ3dpc2VUZXJuYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Dd2lzZUJpbmFyeU9wLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQ3dpc2VVbmFyeU9wLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQ3dpc2VOdWxsYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Dd2lzZVVuYXJ5Vmlldy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NlbGZDd2lzZUJpbmFyeU9wLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRG90LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvU3RhYmxlTm9ybS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1N0cmlkZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL01hcEJhc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9NYXAuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9SZWYuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9CbG9jay5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1ZlY3RvckJsb2NrLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVHJhbnNwb3NlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRGlhZ29uYWxNYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9EaWFnb25hbC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0RpYWdvbmFsUHJvZHVjdC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1JlZHV4LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVmlzaXRvci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0Z1enp5LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvU3dhcC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0NvbW1hSW5pdGlhbGl6ZXIuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9HZW5lcmFsUHJvZHVjdC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NvbHZlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvSW52ZXJzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NvbHZlckJhc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9QZXJtdXRhdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1RyYW5zcG9zaXRpb25zLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVHJpYW5ndWxhck1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NlbGZBZGpvaW50Vmlldy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxCbG9ja1BhbmVsS2VybmVsLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUHJvZHVjdEV2YWx1YXRvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4VmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NvbHZlVHJpYW5ndWxhci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhNYXRyaXhUcmlhbmd1bGFyLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhWZWN0b3IuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UHJvZHVjdC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UmFuazJVcGRhdGUuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyVmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQmFuZE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0NvcmVJdGVyYXRvcnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Db25kaXRpb25Fc3RpbWF0b3IuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL0Jvb2xlYW5SZWR1eC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NlbGVjdC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1ZlY3Rvcndpc2VPcC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1JhbmRvbS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1JlcGxpY2F0ZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1JldmVyc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9BcnJheVdyYXBwZXIuaCIKKworI2lmZGVmIEVJR0VOX1VTRV9CTEFTCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeF9CTEFTLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvcl9CTEFTLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeFRyaWFuZ3VsYXJfQkxBUy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4X0JMQVMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvcl9CTEFTLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeF9CTEFTLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeFZlY3Rvcl9CTEFTLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlck1hdHJpeF9CTEFTLmgiCisjZW5kaWYgLy8gRUlHRU5fVVNFX0JMQVMKKworI2lmZGVmIEVJR0VOX1VTRV9NS0xfVk1MCisjaW5jbHVkZSAic3JjL0NvcmUvQXNzaWduX01LTC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS9HbG9iYWxGdW5jdGlvbnMuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fQ09SRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9EZW5zZSBiL0VpZ2VuL0RlbnNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Njg5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9EZW5zZQpAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlICJDb3JlIgorI2luY2x1ZGUgIkxVIgorI2luY2x1ZGUgIkNob2xlc2t5IgorI2luY2x1ZGUgIlFSIgorI2luY2x1ZGUgIlNWRCIKKyNpbmNsdWRlICJHZW9tZXRyeSIKKyNpbmNsdWRlICJFaWdlbnZhbHVlcyIKZGlmZiAtLWdpdCBhL0VpZ2VuL0VpZ2VuIGIvRWlnZW4vRWlnZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0YzhkYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0VpZ2VuCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgIkRlbnNlIgorI2luY2x1ZGUgIlNwYXJzZSIKZGlmZiAtLWdpdCBhL0VpZ2VuL0VpZ2VudmFsdWVzIGIvRWlnZW4vRWlnZW52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5ZTUyOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0VpZ2VudmFsdWVzCkBAIC0wLDAgKzEsNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0VJR0VOVkFMVUVTX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0VJR0VOVkFMVUVTX01PRFVMRV9ICisKKyNpbmNsdWRlICJDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2luY2x1ZGUgIkNob2xlc2t5IgorI2luY2x1ZGUgIkphY29iaSIKKyNpbmNsdWRlICJIb3VzZWhvbGRlciIKKyNpbmNsdWRlICJMVSIKKyNpbmNsdWRlICJHZW9tZXRyeSIKKworLyoqIFxkZWZncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUgRWlnZW52YWx1ZXMgbW9kdWxlCisgICoKKyAgKgorICAqCisgICogVGhpcyBtb2R1bGUgbWFpbmx5IHByb3ZpZGVzIHZhcmlvdXMgZWlnZW52YWx1ZSBzb2x2ZXJzLgorICAqIFRoaXMgbW9kdWxlIGFsc28gcHJvdmlkZXMgc29tZSBNYXRyaXhCYXNlIG1ldGhvZHMsIGluY2x1ZGluZzoKKyAgKiAgLSBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpLAorICAqICAtIE1hdHJpeEJhc2U6Om9wZXJhdG9yTm9ybSgpCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL21pc2MvUmVhbFN2ZDJ4Mi5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9UcmlkaWFnb25hbGl6YXRpb24uaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvUmVhbFNjaHVyLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0VpZ2VuU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhTY2h1ci5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9Db21wbGV4RWlnZW5Tb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvUmVhbFFaLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvTWF0cml4QmFzZUVpZ2VudmFsdWVzLmgiCisjaWZkZWYgRUlHRU5fVVNFX0xBUEFDS0UKKyNpbmNsdWRlICJzcmMvbWlzYy9sYXBhY2tlLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1cl9MQVBBQ0tFLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhTY2h1cl9MQVBBQ0tFLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTEFQQUNLRS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0VJR0VOVkFMVUVTX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vR2VvbWV0cnkgYi9FaWdlbi9HZW9tZXRyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZkNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vR2VvbWV0cnkKQEAgLTAsMCArMSw2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR0VPTUVUUllfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fR0VPTUVUUllfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaW5jbHVkZSAiU1ZEIgorI2luY2x1ZGUgIkxVIgorI2luY2x1ZGUgPGxpbWl0cz4KKworLyoqIFxkZWZncm91cCBHZW9tZXRyeV9Nb2R1bGUgR2VvbWV0cnkgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvcjoKKyAgKiAgLSBmaXhlZC1zaXplIGhvbW9nZW5lb3VzIHRyYW5zZm9ybWF0aW9ucworICAqICAtIHRyYW5zbGF0aW9uLCBzY2FsaW5nLCAyRCBhbmQgM0Qgcm90YXRpb25zCisgICogIC0gXGxpbmsgUXVhdGVybmlvbiBxdWF0ZXJuaW9ucyBcZW5kbGluaworICAqICAtIGNyb3NzIHByb2R1Y3RzIChccmVmIE1hdHJpeEJhc2U6OmNyb3NzLCBccmVmIE1hdHJpeEJhc2U6OmNyb3NzMykKKyAgKiAgLSBvcnRob2duYWwgdmVjdG9yIGdlbmVyYXRpb24gKFxyZWYgTWF0cml4QmFzZTo6dW5pdE9ydGhvZ29uYWwpCisgICogIC0gc29tZSBsaW5lYXIgY29tcG9uZW50czogXGxpbmsgUGFyYW1ldHJpemVkTGluZSBwYXJhbWV0cml6ZWQtbGluZXMgXGVuZGxpbmsgYW5kIFxsaW5rIEh5cGVycGxhbmUgaHlwZXJwbGFuZXMgXGVuZGxpbmsKKyAgKiAgLSBcbGluayBBbGlnbmVkQm94IGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3hlcyBcZW5kbGluaworICAqICAtIFxsaW5rIHVtZXlhbWEgbGVhc3Qtc3F1YXJlIHRyYW5zZm9ybWF0aW9uIGZpdHRpbmcgXGVuZGxpbmsKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvT3J0aG9NZXRob2RzLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmgiCisKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvSG9tb2dlbmVvdXMuaCIKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvUm90YXRpb25CYXNlLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1JvdGF0aW9uMkQuaCIKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvUXVhdGVybmlvbi5oIgorI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9BbmdsZUF4aXMuaCIKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1RyYW5zbGF0aW9uLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1NjYWxpbmcuaCIKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvSHlwZXJwbGFuZS5oIgorI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9QYXJhbWV0cml6ZWRMaW5lLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L0FsaWduZWRCb3guaCIKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvVW1leWFtYS5oIgorCisvLyBVc2UgdGhlIFNTRSBvcHRpbWl6ZWQgdmVyc2lvbiB3aGVuZXZlciBwb3NzaWJsZS4gQXQgdGhlIG1vbWVudCB0aGUKKy8vIFNTRSB2ZXJzaW9uIGRvZXNuJ3QgY29tcGlsZSB3aGVuIEFWWCBpcyBlbmFibGVkCisjaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfU1NFICYmICFkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9BVlgKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvYXJjaC9HZW9tZXRyeV9TU0UuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9HRU9NRVRSWV9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KKwpkaWZmIC0tZ2l0IGEvRWlnZW4vSG91c2Vob2xkZXIgYi9FaWdlbi9Ib3VzZWhvbGRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNkODFiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vSG91c2Vob2xkZXIKQEAgLTAsMCArMSwzMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSE9VU0VIT0xERVJfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fSE9VU0VIT0xERVJfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogXGRlZmdyb3VwIEhvdXNlaG9sZGVyX01vZHVsZSBIb3VzZWhvbGRlciBtb2R1bGUKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9Ib3VzZWhvbGRlcj4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyLmgiCisjaW5jbHVkZSAic3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyU2VxdWVuY2UuaCIKKyNpbmNsdWRlICJzcmMvSG91c2Vob2xkZXIvQmxvY2tIb3VzZWhvbGRlci5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9IT1VTRUhPTERFUl9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL0VpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgYi9FaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1N2Q1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzCkBAIC0wLDAgKzEsNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lURVJBVElWRUxJTkVBUlNPTFZFUlNfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fSVRFUkFUSVZFTElORUFSU09MVkVSU19NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKyNpbmNsdWRlICJPcmRlcmluZ01ldGhvZHMiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogCisgICogXGRlZmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgcHJvdmlkZXMgaXRlcmF0aXZlIG1ldGhvZHMgdG8gc29sdmUgcHJvYmxlbXMgb2YgdGhlIGZvcm0gXGMgQSBcYyB4ID0gXGMgYiwgd2hlcmUgXGMgQSBpcyBhIHNxdWFyZWQgbWF0cml4LCB1c3VhbGx5IHZlcnkgbGFyZ2UgYW5kIHNwYXJzZS4KKyAgKiBUaG9zZSBzb2x2ZXJzIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisgICogIC0gQ29uanVnYXRlR3JhZGllbnQgZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLAorICAqICAtIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50IGZvciByZWN0YW5ndWxhciBsZWFzdC1zcXVhcmUgcHJvYmxlbXMsCisgICogIC0gQmlDR1NUQUIgZm9yIGdlbmVyYWwgc3F1YXJlIG1hdHJpY2VzLgorICAqCisgICogVGhlc2UgaXRlcmF0aXZlIHNvbHZlcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBzb21lIHByZWNvbmRpdGlvbmVyczoKKyAgKiAgLSBJZGVudGl0eVByZWNvbmRpdGlvbmVyIC0gbm90IHJlYWxseSB1c2VmdWwKKyAgKiAgLSBEaWFnb25hbFByZWNvbmRpdGlvbmVyIC0gYWxzbyBjYWxsZWQgSmFjb2JpIHByZWNvbmRpdGlvbmVyLCB3b3JrIHZlcnkgd2VsbCBvbiBkaWFnb25hbCBkb21pbmFudCBtYXRyaWNlcy4KKyAgKiAgLSBJbmNvbXBsZXRlTFVUIC0gaW5jb21wbGV0ZSBMVSBmYWN0b3JpemF0aW9uIHdpdGggZHVhbCB0aHJlc2hvbGRpbmcKKyAgKgorICAqIFN1Y2ggcHJvYmxlbXMgY2FuIGFsc28gYmUgc29sdmVkIHVzaW5nIHRoZSBkaXJlY3Qgc3BhcnNlIGRlY29tcG9zaXRpb24gbW9kdWxlczogU3BhcnNlQ2hvbGVza3ksIENob2xtb2RTdXBwb3J0LCBVbWZQYWNrU3VwcG9ydCwgU3VwZXJMVVN1cHBvcnQuCisgICoKKyAgICBcY29kZQorICAgICNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPgorICAgIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9Tb2x2ZVdpdGhHdWVzcy5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0l0ZXJhdGl2ZVNvbHZlckJhc2UuaCIKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CYXNpY1ByZWNvbmRpdGlvbmVycy5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0Nvbmp1Z2F0ZUdyYWRpZW50LmgiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvTGVhc3RTcXVhcmVDb25qdWdhdGVHcmFkaWVudC5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0JpQ0dTVEFCLmgiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvSW5jb21wbGV0ZUxVVC5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0luY29tcGxldGVDaG9sZXNreS5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9JVEVSQVRJVkVMSU5FQVJTT0xWRVJTX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9KYWNvYmkgYi9FaWdlbi9KYWNvYmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjMWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0phY29iaQpAQCAtMCwwICsxLDMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9KQUNPQklfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fSkFDT0JJX01PRFVMRV9ICisKKyNpbmNsdWRlICJDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworLyoqIFxkZWZncm91cCBKYWNvYmlfTW9kdWxlIEphY29iaSBtb2R1bGUKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBKYWNvYmkgYW5kIEdpdmVucyByb3RhdGlvbnMuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9KYWNvYmk+CisgICogXGVuZGNvZGUKKyAgKgorICAqIEluIGFkZGl0aW9uIHRvIGxpc3RlZCBjbGFzc2VzLCBpdCBkZWZpbmVzIHRoZSB0d28gZm9sbG93aW5nIE1hdHJpeEJhc2UgbWV0aG9kcyB0byBhcHBseSBhIEphY29iaSBvciBHaXZlbnMgcm90YXRpb246CisgICogIC0gTWF0cml4QmFzZTo6YXBwbHlPblRoZUxlZnQoKQorICAqICAtIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVSaWdodCgpLgorICAqLworCisjaW5jbHVkZSAic3JjL0phY29iaS9KYWNvYmkuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fSkFDT0JJX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLworCmRpZmYgLS1naXQgYS9FaWdlbi9MVSBiL0VpZ2VuL0xVCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmM1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9MVQpAQCAtMCwwICsxLDQ2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MVV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9MVV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcZGVmZ3JvdXAgTFVfTW9kdWxlIExVIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIGluY2x1ZGVzICVMVSBkZWNvbXBvc2l0aW9uIGFuZCByZWxhdGVkIG5vdGlvbnMgc3VjaCBhcyBtYXRyaXggaW52ZXJzaW9uIGFuZCBkZXRlcm1pbmFudC4KKyAgKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgTWF0cml4QmFzZSBtZXRob2RzOgorICAqICAtIE1hdHJpeEJhc2U6OmludmVyc2UoKQorICAqICAtIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0xVPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9LZXJuZWwuaCIKKyNpbmNsdWRlICJzcmMvbWlzYy9JbWFnZS5oIgorI2luY2x1ZGUgInNyYy9MVS9GdWxsUGl2TFUuaCIKKyNpbmNsdWRlICJzcmMvTFUvUGFydGlhbFBpdkxVLmgiCisjaWZkZWYgRUlHRU5fVVNFX0xBUEFDS0UKKyNpbmNsdWRlICJzcmMvbWlzYy9sYXBhY2tlLmgiCisjaW5jbHVkZSAic3JjL0xVL1BhcnRpYWxQaXZMVV9MQVBBQ0tFLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzcmMvTFUvRGV0ZXJtaW5hbnQuaCIKKyNpbmNsdWRlICJzcmMvTFUvSW52ZXJzZUltcGwuaCIKKworLy8gVXNlIHRoZSBTU0Ugb3B0aW1pemVkIHZlcnNpb24gd2hlbmV2ZXIgcG9zc2libGUuIEF0IHRoZSBtb21lbnQgdGhlCisvLyBTU0UgdmVyc2lvbiBkb2Vzbid0IGNvbXBpbGUgd2hlbiBBVlggaXMgZW5hYmxlZAorI2lmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX1NTRSAmJiAhZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfQVZYCisgICNpbmNsdWRlICJzcmMvTFUvYXJjaC9JbnZlcnNlX1NTRS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0xVX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vTWV0aXNTdXBwb3J0IGIvRWlnZW4vTWV0aXNTdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzQxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9NZXRpc1N1cHBvcnQKQEAgLTAsMCArMSwzNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUVUSVNTVVBQT1JUX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX01FVElTU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG1ldGlzLmg+Cit9CisKKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBNZXRpc1N1cHBvcnRfTW9kdWxlIE1ldGlzU3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL01ldGlzU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBNRVRJUyByZW9yZGVyaW5nIHBhY2thZ2UgKGh0dHA6Ly9nbGFyb3MuZHRjLnVtbi5lZHUvZ2tob21lL3ZpZXdzL21ldGlzKS4gCisgICogSXQgY2FuIGJlIHVzZWQganVzdCBhcyBhbnkgb3RoZXIgYnVpbHQtaW4gbWV0aG9kIGFzIGV4cGxhaW5lZCBpbiBcbGluayBPcmRlcmluZ01ldGhvZHNfTW9kdWxlIGhlcmUuIFxlbmRsaW5rCisgICovCisKKworI2luY2x1ZGUgInNyYy9NZXRpc1N1cHBvcnQvTWV0aXNTdXBwb3J0LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX01FVElTU1VQUE9SVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vT3JkZXJpbmdNZXRob2RzIGIvRWlnZW4vT3JkZXJpbmdNZXRob2RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZWEzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9PcmRlcmluZ01ldGhvZHMKQEAgLTAsMCArMSw3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fT1JERVJJTkdNRVRIT0RTX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX09SREVSSU5HTUVUSE9EU19NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiAKKyAgKiBcZGVmZ3JvdXAgT3JkZXJpbmdNZXRob2RzX01vZHVsZSBPcmRlcmluZ01ldGhvZHMgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgZm9yIGludGVybmFsIHVzZSBvbmx5CisgICogCisgICogSXQgZGVmaW5lcyB2YXJpb3VzIGJ1aWx0LWluIGFuZCBleHRlcm5hbCBvcmRlcmluZyBtZXRob2RzIGZvciBzcGFyc2UgbWF0cmljZXMuIAorICAqIFRoZXkgYXJlIHR5cGljYWxseSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGR1cmluZyAKKyAgKiB0aGUgc3BhcnNlIG1hdHJpeCBkZWNvbXBvc2l0aW9uIChMTFQsIExVLCBRUikuCisgICogUHJlY2lzZWx5LCBpbiBhIHByZXByb2Nlc3Npbmcgc3RlcCwgYSBwZXJtdXRhdGlvbiBtYXRyaXggUCBpcyBjb21wdXRlZCB1c2luZyAKKyAgKiB0aG9zZSBvcmRlcmluZyBtZXRob2RzIGFuZCBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXguIAorICAqIFVzaW5nIGZvciBpbnN0YW5jZSB0aGUgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24sIGl0IGlzIGV4cGVjdGVkIHRoYXQgCisgICogdGhlIG5vbnplcm9zIGVsZW1lbnRzIGluIExMVChBKlApIHdpbGwgYmUgbXVjaCBzbWFsbGVyIHRoYW4gdGhhdCBpbiBMTFQoQSkuCisgICogCisgICogCisgICogVXNhZ2UgOiAKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9PcmRlcmluZ01ldGhvZHM+CisgICogXGVuZGNvZGUKKyAgKiAKKyAgKiBBIHNpbXBsZSB1c2FnZSBpcyBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciBpbiB0aGUgc3BhcnNlIGRlY29tcG9zaXRpb24gY2xhc3NlcyA6IAorICAqIAorICAqIFxjb2RlIAorICAqIFNwYXJzZUxVPE1hdHJpeFR5cGUsIENPTEFNRE9yZGVyaW5nPGludD4gPiBzb2x2ZXI7CisgICogXGVuZGNvZGUgCisgICogCisgICogXGNvZGUgCisgICogU3BhcnNlUVI8TWF0cml4VHlwZSwgQ09MQU1ET3JkZXJpbmc8aW50PiA+IHNvbHZlcjsKKyAgKiBcZW5kY29kZQorICAqIAorICAqIEl0IGlzIHBvc3NpYmxlIGFzIHdlbGwgdG8gY2FsbCBkaXJlY3RseSBhIHBhcnRpY3VsYXIgb3JkZXJpbmcgbWV0aG9kIGZvciB5b3VyIG93biBwdXJwb3NlLCAKKyAgKiBcY29kZSAKKyAgKiBBTURPcmRlcmluZzxpbnQ+IG9yZGVyaW5nOworICAqIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIGludD4gcGVybTsKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBOyAKKyAgKiAvL0ZpbGwgdGhlIG1hdHJpeCAuLi4KKyAgKiAKKyAgKiBvcmRlcmluZyhBLCBwZXJtKTsgLy8gQ2FsbCBBTUQKKyAgKiBcZW5kY29kZQorICAqIAorICAqIFxub3RlIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyAobGlrZSBBTUQgb3IgTUVUSVMpLCBuZWVkIHRoZSBzcGFyc2l0eSBwYXR0ZXJuIAorICAqIG9mIHRoZSBpbnB1dCBtYXRyaXggdG8gYmUgc3ltbWV0cmljLiBXaGVuIHRoZSBtYXRyaXggaXMgc3RydWN0dXJhbGx5IHVuc3ltbWV0cmljLCAKKyAgKiBFaWdlbiBjb21wdXRlcyBpbnRlcm5hbGx5IHRoZSBwYXR0ZXJuIG9mIFxmJEFeVCpBXGYkIGJlZm9yZSBjYWxsaW5nIHRoZSBtZXRob2QuCisgICogSWYgeW91ciBtYXRyaXggaXMgYWxyZWFkeSBzeW1tZXRyaWMgKGF0IGxlYXQgaW4gc3RydWN0dXJlKSwgeW91IGNhbiBhdm9pZCB0aGF0CisgICogYnkgY2FsbGluZyB0aGUgbWV0aG9kIHdpdGggYSBTZWxmQWRqb2ludFZpZXcgdHlwZS4KKyAgKiAKKyAgKiBcY29kZQorICAqICAvLyBDYWxsIHRoZSBvcmRlcmluZyBvbiB0aGUgcGF0dGVybiBvZiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggQQorICAqIG9yZGVyaW5nKEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLCBwZXJtKTsKKyAgKiBcZW5kY29kZQorICAqLworCisjaWZuZGVmIEVJR0VOX01QTDJfT05MWQorI2luY2x1ZGUgInNyYy9PcmRlcmluZ01ldGhvZHMvQW1kLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9PcmRlcmluZ01ldGhvZHMvT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX09SREVSSU5HTUVUSE9EU19NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vUGFTdGlYU3VwcG9ydCBiL0VpZ2VuL1BhU3RpWFN1cHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzYTYzYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1BhU3RpWFN1cHBvcnQKQEAgLTAsMCArMSw0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFTVElYU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9QQVNUSVhTVVBQT1JUX01PRFVMRV9ICisKKyNpbmNsdWRlICJTcGFyc2VDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8cGFzdGl4X25vbXBpLmg+CisjaW5jbHVkZSA8cGFzdGl4Lmg+Cit9CisKKyNpZmRlZiBjb21wbGV4CisjdW5kZWYgY29tcGxleAorI2VuZGlmCisKKy8qKiBcaW5ncm91cCBTdXBwb3J0X21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUgUGFTdGlYU3VwcG9ydCBtb2R1bGUKKyAgKiAKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9wYXN0aXguZ2ZvcmdlLmlucmlhLmZyLyI+UGFTVGlYPC9hPiBsaWJyYXJ5LgorICAqIFBhU1RpWCBpcyBhIGdlbmVyYWwgXGIgc3VwZXJub2RhbCwgXGIgcGFyYWxsZWwgYW5kIFxiIG9wZW5zb3VyY2Ugc3BhcnNlIHNvbHZlci4KKyAgKiBJdCBwcm92aWRlcyB0aGUgdHdvIGZvbGxvd2luZyBtYWluIGZhY3Rvcml6YXRpb24gY2xhc3NlczoKKyAgKiAtIGNsYXNzIFBhc3RpeExMVCA6IGEgc3VwZXJub2RhbCwgcGFyYWxsZWwgTEx0IENob2xlc2t5IGZhY3Rvcml6YXRpb24uCisgICogLSBjbGFzcyBQYXN0aXhMRExUOiBhIHN1cGVybm9kYWwsIHBhcmFsbGVsIExETHQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbi4KKyAgKiAtIGNsYXNzIFBhc3RpeExVIDogYSBzdXBlcm5vZGFsLCBwYXJhbGxlbCBMVSBmYWN0b3JpemF0aW9uIChvcHRpbWl6ZWQgZm9yIGEgc3ltbWV0cmljIHBhdHRlcm4pLgorICAqIAorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1BhU3RpWFN1cHBvcnQ+CisgICogXGVuZGNvZGUKKyAgKgorICAqIEluIG9yZGVyIHRvIHVzZSB0aGlzIG1vZHVsZSwgdGhlIFBhU1RpWCBoZWFkZXJzIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbmNsdWRlIHBhdGhzLCBhbmQgeW91ciBiaW5hcnkgbXVzdCBiZSBsaW5rZWQgdG8gdGhlIFBhU1RpWCBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLgorICAqIFRoZSBkZXBlbmRlbmNpZXMgZGVwZW5kIG9uIGhvdyBQYVNUaVggaGFzIGJlZW4gY29tcGlsZWQuCisgICogRm9yIGEgY21ha2UgYmFzZWQgcHJvamVjdCwgeW91IGNhbiB1c2Ugb3VyIEZpbmRQYVNUaVguY21ha2UgbW9kdWxlIHRvIGhlbHAgeW91IGluIHRoaXMgdGFzay4KKyAgKgorICAqLworCisjaW5jbHVkZSAic3JjL1BhU3RpWFN1cHBvcnQvUGFTdGlYU3VwcG9ydC5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9QQVNUSVhTVVBQT1JUX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9QYXJkaXNvU3VwcG9ydCBiL0VpZ2VuL1BhcmRpc29TdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0MGVkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9QYXJkaXNvU3VwcG9ydApAQCAtMCwwICsxLDM1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQVJESVNPU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9QQVJESVNPU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDxta2xfcGFyZGlzby5oPgorCisvKiogXGluZ3JvdXAgU3VwcG9ydF9tb2R1bGVzCisgICogXGRlZmdyb3VwIFBhcmRpc29TdXBwb3J0X01vZHVsZSBQYXJkaXNvU3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGJyaW5ncyBzdXBwb3J0IGZvciB0aGUgSW50ZWwoUikgTUtMIFBBUkRJU08gZGlyZWN0IHNwYXJzZSBzb2x2ZXJzLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vUGFyZGlzb1N1cHBvcnQ+CisgICogXGVuZGNvZGUKKyAgKgorICAqIEluIG9yZGVyIHRvIHVzZSB0aGlzIG1vZHVsZSwgdGhlIE1LTCBoZWFkZXJzIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbmNsdWRlIHBhdGhzLCBhbmQgeW91ciBiaW5hcnkgbXVzdCBiZSBsaW5rZWQgdG8gdGhlIE1LTCBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLgorICAqIFNlZSB0aGlzIFxyZWYgVG9waWNVc2luZ0ludGVsTUtMICJwYWdlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBNS0wtRWlnZW4gaW50ZWdyYXRpb24uCisgICogCisgICovCisKKyNpbmNsdWRlICJzcmMvUGFyZGlzb1N1cHBvcnQvUGFyZGlzb1N1cHBvcnQuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fUEFSRElTT1NVUFBPUlRfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL1FSIGIvRWlnZW4vUVIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MzhlMwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1FSCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1FSX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1FSX01PRFVMRV9ICisKKyNpbmNsdWRlICJDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2luY2x1ZGUgIkNob2xlc2t5IgorI2luY2x1ZGUgIkphY29iaSIKKyNpbmNsdWRlICJIb3VzZWhvbGRlciIKKworLyoqIFxkZWZncm91cCBRUl9Nb2R1bGUgUVIgbW9kdWxlCisgICoKKyAgKgorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdmFyaW91cyBRUiBkZWNvbXBvc2l0aW9ucworICAqIFRoaXMgbW9kdWxlIGFsc28gcHJvdmlkZXMgc29tZSBNYXRyaXhCYXNlIG1ldGhvZHMsIGluY2x1ZGluZzoKKyAgKiAgLSBNYXRyaXhCYXNlOjpob3VzZWhvbGRlclFyKCkKKyAgKiAgLSBNYXRyaXhCYXNlOjpjb2xQaXZIb3VzZWhvbGRlclFyKCkKKyAgKiAgLSBNYXRyaXhCYXNlOjpmdWxsUGl2SG91c2Vob2xkZXJRcigpCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9RUj4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL1FSL0hvdXNlaG9sZGVyUVIuaCIKKyNpbmNsdWRlICJzcmMvUVIvRnVsbFBpdkhvdXNlaG9sZGVyUVIuaCIKKyNpbmNsdWRlICJzcmMvUVIvQ29sUGl2SG91c2Vob2xkZXJRUi5oIgorI2luY2x1ZGUgInNyYy9RUi9Db21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uLmgiCisjaWZkZWYgRUlHRU5fVVNFX0xBUEFDS0UKKyNpbmNsdWRlICJzcmMvbWlzYy9sYXBhY2tlLmgiCisjaW5jbHVkZSAic3JjL1FSL0hvdXNlaG9sZGVyUVJfTEFQQUNLRS5oIgorI2luY2x1ZGUgInNyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSX0xBUEFDS0UuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9RUl9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL0VpZ2VuL1F0QWxpZ25lZE1hbGxvYyBiL0VpZ2VuL1F0QWxpZ25lZE1hbGxvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjU3MWYxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vUXRBbGlnbmVkTWFsbG9jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1FUTUFMTE9DX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1FUTUFMTE9DX01PRFVMRV9ICisKKyNpbmNsdWRlICJDb3JlIgorCisjaWYgKCFFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVEKQorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKwordm9pZCAqcU1hbGxvYyhzdGQ6OnNpemVfdCBzaXplKQoreworICByZXR1cm4gRWlnZW46OmludGVybmFsOjphbGlnbmVkX21hbGxvYyhzaXplKTsKK30KKwordm9pZCBxRnJlZSh2b2lkICpwdHIpCit7CisgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9mcmVlKHB0cik7Cit9CisKK3ZvaWQgKnFSZWFsbG9jKHZvaWQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkKK3sKKyAgdm9pZCogbmV3UHRyID0gRWlnZW46OmludGVybmFsOjphbGlnbmVkX21hbGxvYyhzaXplKTsKKyAgbWVtY3B5KG5ld1B0ciwgcHRyLCBzaXplKTsKKyAgRWlnZW46OmludGVybmFsOjphbGlnbmVkX2ZyZWUocHRyKTsKKyAgcmV0dXJuIG5ld1B0cjsKK30KKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYKKworI2VuZGlmIC8vIEVJR0VOX1FUTUFMTE9DX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vU1BRUlN1cHBvcnQgYi9FaWdlbi9TUFFSU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAzOTBjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU1BRUlN1cHBvcnQKQEAgLTAsMCArMSwzNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BRUlNVUFBPUlRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BRUlNVUFBPUlRfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaW5jbHVkZSAiU3VpdGVTcGFyc2VRUi5ocHAiCisKKy8qKiBcaW5ncm91cCBTdXBwb3J0X21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgU1BRUlN1cHBvcnRfTW9kdWxlIFN1aXRlU3BhcnNlUVIgbW9kdWxlCisgICogCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBTUFFSIGxpYnJhcnksIHdoaWNoIGlzIHBhcnQgb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3VpdGVzcGFyc2UuY29tIj5zdWl0ZXNwYXJzZTwvYT4gcGFja2FnZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NQUVJTdXBwb3J0PgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiBvcmRlciB0byB1c2UgdGhpcyBtb2R1bGUsIHRoZSBTUFFSIGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgU1BRUiBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzIChDaG9sbW9kLCBBTUQsIENPTEFNRCwuLi4pLgorICAqIEZvciBhIGNtYWtlIGJhc2VkIHByb2plY3QsIHlvdSBjYW4gdXNlIG91ciBGaW5kU1BRUi5jbWFrZSBhbmQgRmluZENob2xtb2QuQ21ha2UgbW9kdWxlcworICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvQ2hvbG1vZFN1cHBvcnQvQ2hvbG1vZFN1cHBvcnQuaCIKKyNpbmNsdWRlICJzcmMvU1BRUlN1cHBvcnQvU3VpdGVTcGFyc2VRUlN1cHBvcnQuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9TVkQgYi9FaWdlbi9TVkQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxNDNjMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1NWRApAQCAtMCwwICsxLDQ3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVkRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1ZEX01PRFVMRV9ICisKKyNpbmNsdWRlICJRUiIKKyNpbmNsdWRlICJIb3VzZWhvbGRlciIKKyNpbmNsdWRlICJKYWNvYmkiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogXGRlZmdyb3VwIFNWRF9Nb2R1bGUgU1ZEIG1vZHVsZQorICAqCisgICoKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFNWRCBkZWNvbXBvc2l0aW9uIGZvciBtYXRyaWNlcyAoYm90aCByZWFsIGFuZCBjb21wbGV4KS4KKyAgKiBUd28gZGVjb21wb3NpdGlvbiBhbGdvcml0aG1zIGFyZSBwcm92aWRlZDoKKyAgKiAgLSBKYWNvYmlTVkQgaW1wbGVtZW50aW5nIHR3by1zaWRlZCBKYWNvYmkgaXRlcmF0aW9ucyBpcyBudW1lcmljYWxseSB2ZXJ5IGFjY3VyYXRlLCBmYXN0IGZvciBzbWFsbCBtYXRyaWNlcywgYnV0IHZlcnkgc2xvdyBmb3IgbGFyZ2VyIG9uZXMuCisgICogIC0gQkRDU1ZEIGltcGxlbWVudGluZyBhIHJlY3Vyc2l2ZSBkaXZpZGUgJiBjb25xdWVyIHN0cmF0ZWd5IG9uIHRvcCBvZiBhbiB1cHBlci1iaWRpYWdvbmFsaXphdGlvbiB3aGljaCByZW1haW5zIGZhc3QgZm9yIGxhcmdlIHByb2JsZW1zLgorICAqIFRoZXNlIGRlY29tcG9zaXRpb25zIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgcmVzcGVjdGl2ZSBjbGFzc2VzIGFuZCBmb2xsb3dpbmcgTWF0cml4QmFzZSBtZXRob2RzOgorICAqICAtIE1hdHJpeEJhc2U6OmphY29iaVN2ZCgpCisgICogIC0gTWF0cml4QmFzZTo6YmRjU3ZkKCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL21pc2MvUmVhbFN2ZDJ4Mi5oIgorI2luY2x1ZGUgInNyYy9TVkQvVXBwZXJCaWRpYWdvbmFsaXphdGlvbi5oIgorI2luY2x1ZGUgInNyYy9TVkQvU1ZEQmFzZS5oIgorI2luY2x1ZGUgInNyYy9TVkQvSmFjb2JpU1ZELmgiCisjaW5jbHVkZSAic3JjL1NWRC9CRENTVkQuaCIKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9MQVBBQ0tFKSAmJiAhZGVmaW5lZChFSUdFTl9VU0VfTEFQQUNLRV9TVFJJQ1QpCisjaW5jbHVkZSAic3JjL21pc2MvbGFwYWNrZS5oIgorI2luY2x1ZGUgInNyYy9TVkQvSmFjb2JpU1ZEX0xBUEFDS0UuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TVkRfTU9EVUxFX0gKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS9FaWdlbi9TcGFyc2UgYi9FaWdlbi9TcGFyc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2ZTY4MQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1NwYXJzZQpAQCAtMCwwICsxLDM2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX01PRFVMRV9ICisKKy8qKiBcZGVmZ3JvdXAgU3BhcnNlX01vZHVsZSBTcGFyc2UgbWV0YS1tb2R1bGUKKyAgKgorICAqIE1ldGEtbW9kdWxlIGluY2x1ZGluZyBhbGwgcmVsYXRlZCBtb2R1bGVzOgorICAqIC0gXHJlZiBTcGFyc2VDb3JlX01vZHVsZQorICAqIC0gXHJlZiBPcmRlcmluZ01ldGhvZHNfTW9kdWxlCisgICogLSBccmVmIFNwYXJzZUNob2xlc2t5X01vZHVsZQorICAqIC0gXHJlZiBTcGFyc2VMVV9Nb2R1bGUKKyAgKiAtIFxyZWYgU3BhcnNlUVJfTW9kdWxlCisgICogLSBccmVmIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICoKKyAgICBcY29kZQorICAgICNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisgICAgXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorI2lmbmRlZiBFSUdFTl9NUEwyX09OTFkKKyNpbmNsdWRlICJTcGFyc2VDaG9sZXNreSIKKyNlbmRpZgorI2luY2x1ZGUgIlNwYXJzZUxVIgorI2luY2x1ZGUgIlNwYXJzZVFSIgorI2luY2x1ZGUgIkl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMiCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfTU9EVUxFX0gKKwpkaWZmIC0tZ2l0IGEvRWlnZW4vU3BhcnNlQ2hvbGVza3kgYi9FaWdlbi9TcGFyc2VDaG9sZXNreQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmEzMjBjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU3BhcnNlQ2hvbGVza3kKQEAgLTAsMCArMSw0NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFQ0hPTEVTS1lfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFQ0hPTEVTS1lfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworLyoqIAorICAqIFxkZWZncm91cCBTcGFyc2VDaG9sZXNreV9Nb2R1bGUgU3BhcnNlQ2hvbGVza3kgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgcHJvdmlkZXMgdHdvIHZhcmlhbnRzIG9mIHRoZSBkaXJlY3Qgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLgorICAqIFRob3NlIGRlY29tcG9zaXRpb25zIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisgICogIC0gU2ltcGxpY2lhbExMdCwKKyAgKiAgLSBTaW1wbGljaWFsTERMdAorICAqCisgICogU3VjaCBwcm9ibGVtcyBjYW4gYWxzbyBiZSBzb2x2ZWQgdXNpbmcgdGhlIENvbmp1Z2F0ZUdyYWRpZW50IHNvbHZlciBmcm9tIHRoZSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzIG1vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNob2xlc2t5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpZmRlZiBFSUdFTl9NUEwyX09OTFkKKyNlcnJvciBUaGUgU3BhcnNlQ2hvbGVza3kgbW9kdWxlIGhhcyBub3RoaW5nIHRvIG9mZmVyIGluIE1QTDIgb25seSBtb2RlCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9TcGFyc2VDaG9sZXNreS9TaW1wbGljaWFsQ2hvbGVza3kuaCIKKworI2lmbmRlZiBFSUdFTl9NUEwyX09OTFkKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ2hvbGVza3kvU2ltcGxpY2lhbENob2xlc2t5X2ltcGwuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VDSE9MRVNLWV9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vU3BhcnNlQ29yZSBiL0VpZ2VuL1NwYXJzZUNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NjZjNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1NwYXJzZUNvcmUKQEAgLTAsMCArMSw2OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFQ09SRV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VDT1JFX01PRFVMRV9ICisKKyNpbmNsdWRlICJDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLyoqIAorICAqIFxkZWZncm91cCBTcGFyc2VDb3JlX01vZHVsZSBTcGFyc2VDb3JlIG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzcGFyc2UgbWF0cml4IHJlcHJlc2VudGF0aW9uLCBhbmQgYmFzaWMgYXNzb2NpYXRlZCBtYXRyaXggbWFuaXB1bGF0aW9ucworICAqIGFuZCBvcGVyYXRpb25zLgorICAqCisgICogU2VlIHRoZSBccmVmIFR1dG9yaWFsU3BhcnNlICJTcGFyc2UgdHV0b3JpYWwiCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDb3JlPgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBkZXBlbmRzIG9uOiBDb3JlLgorICAqLworCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVXRpbC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZU1hdHJpeEJhc2UuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VBc3NpZ24uaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9Db21wcmVzc2VkU3RvcmFnZS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL0FtYmlWZWN0b3IuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VDb21wcmVzc2VkQmFzZS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZU1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZU1hcC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL01hcHBlZFNwYXJzZU1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVZlY3Rvci5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVJlZi5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZUN3aXNlVW5hcnlPcC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZUN3aXNlQmluYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VUcmFuc3Bvc2UuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VCbG9jay5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZURvdC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVJlZHV4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVmlldy5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZURpYWdvbmFsUHJvZHVjdC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL0NvbnNlcnZhdGl2ZVNwYXJzZVNwYXJzZVByb2R1Y3QuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VTcGFyc2VQcm9kdWN0V2l0aFBydW5pbmcuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlRGVuc2VQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlU2VsZkFkam9pbnRWaWV3LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJpYW5ndWxhclZpZXcuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9Ucmlhbmd1bGFyU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlUGVybXV0YXRpb24uaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VGdXp6eS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVNvbHZlckJhc2UuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFQ09SRV9NT0RVTEVfSAorCmRpZmYgLS1naXQgYS9FaWdlbi9TcGFyc2VMVSBiL0VpZ2VuL1NwYXJzZUxVCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjM4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TcGFyc2VMVQpAQCAtMCwwICsxLDQ2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFTFVfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFTFVfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisKKy8qKiAKKyAgKiBcZGVmZ3JvdXAgU3BhcnNlTFVfTW9kdWxlIFNwYXJzZUxVIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBzdXBlcm5vZGFsIGZhY3Rvcml6YXRpb24gb2YgZ2VuZXJhbCBzcGFyc2UgbWF0cmljZXMuCisgICogVGhlIGNvZGUgaXMgZnVsbHkgb3B0aW1pemVkIGZvciBzdXBlcm5vZGUtcGFuZWwgdXBkYXRlcyB3aXRoIHNwZWNpYWxpemVkIGtlcm5lbHMuCisgICogUGxlYXNlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIFNwYXJzZUxVIGNsYXNzIGZvciBtb3JlIGRldGFpbHMuCisgICovCisKKy8vIE9yZGVyaW5nIGludGVyZmFjZQorI2luY2x1ZGUgIk9yZGVyaW5nTWV0aG9kcyIKKworI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9nZW1tX2tlcm5lbC5oIgorCisjaW5jbHVkZSAic3JjL1NwYXJzZUxVL1NwYXJzZUxVX1N0cnVjdHMuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlTFUvU3BhcnNlTFVfU3VwZXJub2RhbE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVUltcGwuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VDb2xFdHJlZS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9NZW1vcnkuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlTFUvU3BhcnNlTFVfaGVhcF9yZWxheF9zbm9kZS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9yZWxheF9zbm9kZS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9waXZvdEwuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlTFUvU3BhcnNlTFVfcGFuZWxfZGZzLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUxVL1NwYXJzZUxVX2tlcm5lbF9ibW9kLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUxVL1NwYXJzZUxVX3BhbmVsX2Jtb2QuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlTFUvU3BhcnNlTFVfY29sdW1uX2Rmcy5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9jb2x1bW5fYm1vZC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VMVS9TcGFyc2VMVV9jb3B5X3RvX3Vjb2wuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlTFUvU3BhcnNlTFVfcHJ1bmVMLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUxVL1NwYXJzZUxVX1V0aWxzLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUxVL1NwYXJzZUxVLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VMVV9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vU3BhcnNlUVIgYi9FaWdlbi9TcGFyc2VRUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYzYjdmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU3BhcnNlUVIKQEAgLTAsMCArMSwzNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFUVJfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFUVJfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcZGVmZ3JvdXAgU3BhcnNlUVJfTW9kdWxlIFNwYXJzZVFSIG1vZHVsZQorICAqIFxicmllZiBQcm92aWRlcyBRUiBkZWNvbXBvc2l0aW9uIGZvciBzcGFyc2UgbWF0cmljZXMKKyAgKiAKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNpbXBsaWNpYWwgdmVyc2lvbiBvZiB0aGUgbGVmdC1sb29raW5nIFNwYXJzZSBRUiBkZWNvbXBvc2l0aW9uLiAKKyAgKiBUaGUgY29sdW1ucyBvZiB0aGUgaW5wdXQgbWF0cml4IHNob3VsZCBiZSByZW9yZGVyZWQgdG8gbGltaXQgdGhlIGZpbGwtaW4gZHVyaW5nIHRoZSAKKyAgKiBkZWNvbXBvc2l0aW9uLiBCdWlsdC1pbiBtZXRob2RzIChDT0xBTUQsIEFNRCkgb3IgZXh0ZXJuYWwgIG1ldGhvZHMgKE1FVElTKSBjYW4gYmUgdXNlZCB0byB0aGlzIGVuZC4KKyAgKiBTZWUgdGhlIFxsaW5rIE9yZGVyaW5nTWV0aG9kc19Nb2R1bGUgT3JkZXJpbmdNZXRob2RzXGVuZGxpbmsgbW9kdWxlIGZvciB0aGUgbGlzdCAKKyAgKiBvZiBidWlsdC1pbiBhbmQgZXh0ZXJuYWwgb3JkZXJpbmcgbWV0aG9kcy4KKyAgKiAKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VRUj4KKyAgKiBcZW5kY29kZQorICAqIAorICAqIAorICAqLworCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZUNvbEV0cmVlLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZVFSL1NwYXJzZVFSLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9TdGREZXF1ZSBiL0VpZ2VuL1N0ZERlcXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjgzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdGREZXF1ZQpAQCAtMCwwICsxLDI3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnb29nbGVtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1REREVRVUVfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1REREVRVUVfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpZiBFSUdFTl9DT01QX01TVkMgJiYgRUlHRU5fT1NfV0lONjQgJiYgKEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM8PTE2KSAvKiBNU1ZDIGF1dG8gYWxpZ25zIHVwIHRvIDE2IGJ5dGVzIGluIDY0IGJpdCBidWlsZHMgKi8KKworI2RlZmluZSBFSUdFTl9ERUZJTkVfU1RMX0RFUVVFX1NQRUNJQUxJWkFUSU9OKC4uLikKKworI2Vsc2UKKworI2luY2x1ZGUgInNyYy9TdGxTdXBwb3J0L1N0ZERlcXVlLmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fU1REREVRVUVfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL1N0ZExpc3QgYi9FaWdlbi9TdGRMaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjI2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdGRMaXN0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdvb2dsZW1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVERMSVNUX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1NURExJU1RfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisjaW5jbHVkZSA8bGlzdD4KKworI2lmIEVJR0VOX0NPTVBfTVNWQyAmJiBFSUdFTl9PU19XSU42NCAmJiAoRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUzw9MTYpIC8qIE1TVkMgYXV0byBhbGlnbnMgdXAgdG8gMTYgYnl0ZXMgaW4gNjQgYml0IGJ1aWxkcyAqLworCisjZGVmaW5lIEVJR0VOX0RFRklORV9TVExfTElTVF9TUEVDSUFMSVpBVElPTiguLi4pCisKKyNlbHNlCisKKyNpbmNsdWRlICJzcmMvU3RsU3VwcG9ydC9TdGRMaXN0LmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fU1RETElTVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vU3RkVmVjdG9yIGIvRWlnZW4vU3RkVmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDY5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdGRWZWN0b3IKQEAgLTAsMCArMSwyNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NURFZFQ1RPUl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TVERWRUNUT1JfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWYgRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX09TX1dJTjY0ICYmIChFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPD0xNikgLyogTVNWQyBhdXRvIGFsaWducyB1cCB0byAxNiBieXRlcyBpbiA2NCBiaXQgYnVpbGRzICovCisKKyNkZWZpbmUgRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oLi4uKQorCisjZWxzZQorCisjaW5jbHVkZSAic3JjL1N0bFN1cHBvcnQvU3RkVmVjdG9yLmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fU1REVkVDVE9SX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9TdXBlckxVU3VwcG9ydCBiL0VpZ2VuL1N1cGVyTFVTdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzEyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdXBlckxVU3VwcG9ydApAQCAtMCwwICsxLDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVVBFUkxVU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TVVBFUkxVU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpZmRlZiBFTVBUWQorI2RlZmluZSBFSUdFTl9FTVBUWV9XQVNfQUxSRUFEWV9ERUZJTkVECisjZW5kaWYKKwordHlwZWRlZiBpbnQgaW50X3Q7CisjaW5jbHVkZSA8c2x1X0NuYW1lcy5oPgorI2luY2x1ZGUgPHN1cGVybWF0cml4Lmg+CisjaW5jbHVkZSA8c2x1X3V0aWwuaD4KKworLy8gc2x1X3V0aWwuaCBkZWZpbmVzIGEgcHJlcHJvY2Vzc29yIHRva2VuIG5hbWVkIEVNUFRZIHdoaWNoIGlzIHJlYWxseSBwb2xsdXRpbmcsCisvLyBzbyB3ZSByZW1vdmUgaXQgaW4gZmF2b3Igb2YgYSBTVVBFUkxVX0VNUFRZIHRva2VuLgorLy8gSWYgRU1QVFkgd2FzIGFscmVhZHkgZGVmaW5lZCB0aGVuIHdlIGRvbid0IHVuZGVmIGl0LgorCisjaWYgZGVmaW5lZChFSUdFTl9FTVBUWV9XQVNfQUxSRUFEWV9ERUZJTkVEKQorIyB1bmRlZiBFSUdFTl9FTVBUWV9XQVNfQUxSRUFEWV9ERUZJTkVECisjZWxpZiBkZWZpbmVkKEVNUFRZKQorIyB1bmRlZiBFTVBUWQorI2VuZGlmCisKKyNkZWZpbmUgU1VQRVJMVV9FTVBUWSAoLTEpCisKK25hbWVzcGFjZSBFaWdlbiB7IHN0cnVjdCBTbHVNYXRyaXg7IH0KKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBTdXBlckxVU3VwcG9ydF9Nb2R1bGUgU3VwZXJMVVN1cHBvcnQgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9jcmQtbGVnYWN5LmxibC5nb3YvfnhpYW95ZS9TdXBlckxVLyI+U3VwZXJMVTwvYT4gbGlicmFyeS4KKyAgKiBJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZhY3Rvcml6YXRpb24gY2xhc3M6CisgICogLSBjbGFzcyBTdXBlckxVOiBhIHN1cGVybm9kYWwgc2VxdWVudGlhbCBMVSBmYWN0b3JpemF0aW9uLgorICAqIC0gY2xhc3MgU3VwZXJJTFU6IGEgc3VwZXJub2RhbCBzZXF1ZW50aWFsIGluY29tcGxldGUgTFUgZmFjdG9yaXphdGlvbiAodG8gYmUgdXNlZCBhcyBhIHByZWNvbmRpdGlvbmVyIGZvciBpdGVyYXRpdmUgbWV0aG9kcykuCisgICoKKyAgKiBcd2FybmluZyBUaGlzIHdyYXBwZXIgcmVxdWlyZXMgYXQgbGVhc3QgdmVyc2lvbnMgNC4wIG9mIFN1cGVyTFUuIFRoZSAzLnggdmVyc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICoKKyAgKiBcd2FybmluZyBXaGVuIGluY2x1ZGluZyB0aGlzIG1vZHVsZSwgeW91IGhhdmUgdG8gdXNlIFNVUEVSTFVfRU1QVFkgaW5zdGVhZCBvZiBFTVBUWSB3aGljaCBpcyBubyBsb25nZXIgZGVmaW5lZCBiZWNhdXNlIGl0IGlzIHRvbyBwb2xsdXRpbmcuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB0aGUgc3VwZXJsdSBoZWFkZXJzIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbmNsdWRlIHBhdGhzLCBhbmQgeW91ciBiaW5hcnkgbXVzdCBiZSBsaW5rZWQgdG8gdGhlIHN1cGVybHUgbGlicmFyeSBhbmQgaXRzIGRlcGVuZGVuY2llcy4KKyAgKiBUaGUgZGVwZW5kZW5jaWVzIGRlcGVuZCBvbiBob3cgc3VwZXJsdSBoYXMgYmVlbiBjb21waWxlZC4KKyAgKiBGb3IgYSBjbWFrZSBiYXNlZCBwcm9qZWN0LCB5b3UgY2FuIHVzZSBvdXIgRmluZFN1cGVyTFUuY21ha2UgbW9kdWxlIHRvIGhlbHAgeW91IGluIHRoaXMgdGFzay4KKyAgKgorICAqLworCisjaW5jbHVkZSAic3JjL1N1cGVyTFVTdXBwb3J0L1N1cGVyTFVTdXBwb3J0LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX1NVUEVSTFVTVVBQT1JUX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9VbWZQYWNrU3VwcG9ydCBiL0VpZ2VuL1VtZlBhY2tTdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWVjODAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9VbWZQYWNrU3VwcG9ydApAQCAtMCwwICsxLDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9VTUZQQUNLU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9VTUZQQUNLU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPHVtZnBhY2suaD4KK30KKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBVbWZQYWNrU3VwcG9ydF9Nb2R1bGUgVW1mUGFja1N1cHBvcnQgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIFVtZlBhY2sgbGlicmFyeSB3aGljaCBpcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnN1aXRlc3BhcnNlLmNvbSI+c3VpdGVzcGFyc2U8L2E+IHBhY2thZ2UuCisgICogSXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmYWN0b3JpemF0aW9uIGNsYXNzOgorICAqIC0gY2xhc3MgVW1mUGFja0xVOiBhIG11bHRpZnJvbnRhbCBzZXF1ZW50aWFsIExVIGZhY3Rvcml6YXRpb24uCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9VbWZQYWNrU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB0aGUgdW1mcGFjayBoZWFkZXJzIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbmNsdWRlIHBhdGhzLCBhbmQgeW91ciBiaW5hcnkgbXVzdCBiZSBsaW5rZWQgdG8gdGhlIHVtZnBhY2sgbGlicmFyeSBhbmQgaXRzIGRlcGVuZGVuY2llcy4KKyAgKiBUaGUgZGVwZW5kZW5jaWVzIGRlcGVuZCBvbiBob3cgdW1mcGFjayBoYXMgYmVlbiBjb21waWxlZC4KKyAgKiBGb3IgYSBjbWFrZSBiYXNlZCBwcm9qZWN0LCB5b3UgY2FuIHVzZSBvdXIgRmluZFVtZlBhY2suY21ha2UgbW9kdWxlIHRvIGhlbHAgeW91IGluIHRoaXMgdGFzay4KKyAgKgorICAqLworCisjaW5jbHVkZSAic3JjL1VtZlBhY2tTdXBwb3J0L1VtZlBhY2tTdXBwb3J0LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX1VNRlBBQ0tTVVBQT1JUX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbGVza3kvTERMVC5oIGIvRWlnZW4vc3JjL0Nob2xlc2t5L0xETFQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VlN2IyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0Nob2xlc2t5L0xETFQuaApAQCAtMCwwICsxLDY2OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBLZWlyIE1pZXJsZSA8bWllcmxlQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaW1vdGh5IEUuIEhvbHkgPHRpbS5ob2x5QGdtYWlsLmNvbSA+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0xETFRfSAorI2RlZmluZSBFSUdFTl9MRExUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8+IHN0cnVjdCBMRExUX1RyYWl0czsKKworICAvLyBQb3NpdGl2ZVNlbWlEZWYgbWVhbnMgcG9zaXRpdmUgc2VtaS1kZWZpbml0ZSBhbmQgbm9uLXplcm87IHNhbWUgZm9yIE5lZ2F0aXZlU2VtaURlZgorICBlbnVtIFNpZ25NYXRyaXggeyBQb3NpdGl2ZVNlbWlEZWYsIE5lZ2F0aXZlU2VtaURlZiwgWmVyb1NpZ24sIEluZGVmaW5pdGUgfTsKK30KKworLyoqIFxpbmdyb3VwIENob2xlc2t5X01vZHVsZQorICAqCisgICogXGNsYXNzIExETFQKKyAgKgorICAqIFxicmllZiBSb2J1c3QgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIHBpdm90aW5nCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggdG8gY29tcHV0ZSB0aGUgTERMXlQgQ2hvbGVza3kgZGVjb21wb3NpdGlvbgorICAqIFx0cGFyYW0gX1VwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRlY29tcG9zaXRvbjogTG93ZXIgKGRlZmF1bHQpIG9yIFVwcGVyLgorICAqICAgICAgICAgICAgIFRoZSBvdGhlciB0cmlhbmd1bGFyIHBhcnQgd29uJ3QgYmUgcmVhZC4KKyAgKgorICAqIFBlcmZvcm0gYSByb2J1c3QgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBhIHBvc2l0aXZlIHNlbWlkZWZpbml0ZSBvciBuZWdhdGl2ZSBzZW1pZGVmaW5pdGUKKyAgKiBtYXRyaXggXGYkIEEgXGYkIHN1Y2ggdGhhdCBcZiQgQSA9ICBQXlRMRExeKlAgXGYkLCB3aGVyZSBQIGlzIGEgcGVybXV0YXRpb24gbWF0cml4LCBMCisgICogaXMgbG93ZXIgdHJpYW5ndWxhciB3aXRoIGEgdW5pdCBkaWFnb25hbCBhbmQgRCBpcyBhIGRpYWdvbmFsIG1hdHJpeC4KKyAgKgorICAqIFRoZSBkZWNvbXBvc2l0aW9uIHVzZXMgcGl2b3RpbmcgdG8gZW5zdXJlIHN0YWJpbGl0eSwgc28gdGhhdCBMIHdpbGwgaGF2ZQorICAqIHplcm9zIGluIHRoZSBib3R0b20gcmlnaHQgcmFuayhBKSAtIG4gc3VibWF0cml4LiBBdm9pZGluZyB0aGUgc3F1YXJlIHJvb3QKKyAgKiBvbiBEIGFsc28gc3RhYmlsaXplcyB0aGUgY29tcHV0YXRpb24uCisgICoKKyAgKiBSZW1lbWJlciB0aGF0IENob2xlc2t5IGRlY29tcG9zaXRpb25zIGFyZSBub3QgcmFuay1yZXZlYWxpbmcuIEFsc28sIGRvIG5vdCB1c2UgYSBDaG9sZXNreQorICAqIGRlY29tcG9zaXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeXN0ZW0gb2YgZXF1YXRpb25zIGhhcyBhIHNvbHV0aW9uLgorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIG1lY2hhbmlzbS4KKyAgKiAKKyAgKiBcc2EgTWF0cml4QmFzZTo6bGRsdCgpLCBTZWxmQWRqb2ludFZpZXc6OmxkbHQoKSwgY2xhc3MgTExUCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPiBjbGFzcyBMRExUCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgVXBMbyA9IF9VcExvCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCAxLCAwLCBNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gVG1wTWF0cml4VHlwZTsKKworICAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnM8Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBUcmFuc3Bvc2l0aW9uVHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25UeXBlOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6TERMVF9UcmFpdHM8TWF0cml4VHlwZSxVcExvPiBUcmFpdHM7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIExETFQ6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpLgorICAgICAgKi8KKyAgICBMRExUKCkKKyAgICAgIDogbV9tYXRyaXgoKSwKKyAgICAgICAgbV90cmFuc3Bvc2l0aW9ucygpLAorICAgICAgICBtX3NpZ24oaW50ZXJuYWw6Olplcm9TaWduKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3Igd2l0aCBtZW1vcnkgcHJlYWxsb2NhdGlvbgorICAgICAgKgorICAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGJ1dCB3aXRoIHByZWFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEKKyAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvYmxlbSBcYSBzaXplLgorICAgICAgKiBcc2EgTERMVCgpCisgICAgICAqLworICAgIGV4cGxpY2l0IExETFQoSW5kZXggc2l6ZSkKKyAgICAgIDogbV9tYXRyaXgoc2l6ZSwgc2l6ZSksCisgICAgICAgIG1fdHJhbnNwb3NpdGlvbnMoc2l6ZSksCisgICAgICAgIG1fdGVtcG9yYXJ5KHNpemUpLAorICAgICAgICBtX3NpZ24oaW50ZXJuYWw6Olplcm9TaWduKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yIHdpdGggZGVjb21wb3NpdGlvbgorICAgICAgKgorICAgICAgKiBUaGlzIGNhbGN1bGF0ZXMgdGhlIGRlY29tcG9zaXRpb24gZm9yIHRoZSBpbnB1dCBcYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxzYSBMRExUKEluZGV4IHNpemUpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBMRExUKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3RyYW5zcG9zaXRpb25zKG1hdHJpeC5yb3dzKCkpLAorICAgICAgICBtX3RlbXBvcmFyeShtYXRyaXgucm93cygpKSwKKyAgICAgICAgbV9zaWduKGludGVybmFsOjpaZXJvU2lnbiksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeC5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIExETFQgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIHdoZW4gXGMgTWF0cml4VHlwZSBpcyBhIEVpZ2VuOjpSZWYuCisgICAgICAqCisgICAgICAqIFxzYSBMRExUKGNvbnN0IEVpZ2VuQmFzZSYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBMRExUKEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeC5kZXJpdmVkKCkpLAorICAgICAgICBtX3RyYW5zcG9zaXRpb25zKG1hdHJpeC5yb3dzKCkpLAorICAgICAgICBtX3RlbXBvcmFyeShtYXRyaXgucm93cygpKSwKKyAgICAgICAgbV9zaWduKGludGVybmFsOjpaZXJvU2lnbiksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeC5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBDbGVhciBhbnkgZXhpc3RpbmcgZGVjb21wb3NpdGlvbgorICAgICAqIFxzYSByYW5rVXBkYXRlKHcsc2lnbWEpCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvKCkKKyAgICB7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2aWV3IG9mIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBVICovCisgICAgaW5saW5lIHR5cGVuYW1lIFRyYWl0czo6TWF0cml4VSBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBUcmFpdHM6OmdldFUobV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZpZXcgb2YgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IEwgKi8KKyAgICBpbmxpbmUgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhMIG1hdHJpeEwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxETFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0TChtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBtYXRyaXggUCBhcyBhIHRyYW5zcG9zaXRpb24gc2VxdWVuY2UuCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBUcmFuc3Bvc2l0aW9uVHlwZSYgdHJhbnNwb3NpdGlvbnNQKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3RyYW5zcG9zaXRpb25zOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBkaWFnb25hbCBtYXRyaXggRCAqLworICAgIGlubGluZSBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPiB2ZWN0b3JEKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeC5kaWFnb25hbCgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggaXMgcG9zaXRpdmUgKHNlbWlkZWZpbml0ZSkgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvc2l0aXZlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3NpZ24gPT0gaW50ZXJuYWw6OlBvc2l0aXZlU2VtaURlZiB8fCBtX3NpZ24gPT0gaW50ZXJuYWw6Olplcm9TaWduOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggaXMgbmVnYXRpdmUgKHNlbWlkZWZpbml0ZSkgKi8KKyAgICBpbmxpbmUgYm9vbCBpc05lZ2F0aXZlKHZvaWQpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9zaWduID09IGludGVybmFsOjpOZWdhdGl2ZVNlbWlEZWYgfHwgbV9zaWduID09IGludGVybmFsOjpaZXJvU2lnbjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBzdXBwb3J0cyBpbi1wbGFjZSBzb2x2ZXMgdXNpbmcgdGhlIHN5bnRheCA8dHQ+eCA9IGRlY29tcG9zaXRpb25PYmplY3Quc29sdmUoeCk8L3R0PiAuCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucworICAgICAgKgorICAgICAgKiBNb3JlIHByZWNpc2VseSwgdGhpcyBtZXRob2Qgc29sdmVzIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgZGVjb21wb3NpdGlvbiBcZiQgQSA9IFBeVCBMIEQgTF4qIFAgXGYkCisgICAgICAqIGJ5IHNvbHZpbmcgdGhlIHN5c3RlbXMgXGYkIFBeVCB5XzEgPSBiIFxmJCwgXGYkIEwgeV8yID0geV8xIFxmJCwgXGYkIEQgeV8zID0geV8yIFxmJCwKKyAgICAgICogXGYkIExeKiB5XzQgPSB5XzMgXGYkIGFuZCBcZiQgUCB4ID0geV80IFxmJCBpbiBzdWNjZXNzaW9uLiBJZiB0aGUgbWF0cml4IFxmJCBBIFxmJCBpcyBzaW5ndWxhciwgdGhlbgorICAgICAgKiBcZiQgRCBcZiQgd2lsbCBhbHNvIGJlIHNpbmd1bGFyIChhbGwgdGhlIG90aGVyIG1hdHJpY2VzIGFyZSBpbnZlcnRpYmxlKS4gSW4gdGhhdCBjYXNlLCB0aGUKKyAgICAgICogbGVhc3Qtc3F1YXJlIHNvbHV0aW9uIG9mIFxmJCBEIHlfMyA9IHlfMiBcZiQgaXMgY29tcHV0ZWQuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoaXMgZnVuY3Rpb24KKyAgICAgICogY29tcHV0ZXMgdGhlIGxlYXN0LXNxdWFyZSBzb2x1dGlvbiBvZiBcZiQgQSB4ID0gYiBcZiQgaXMgXGYkIEEgXGYkIGlzIHNpbmd1bGFyLgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6bGRsdCgpLCBTZWxmQWRqb2ludFZpZXc6OmxkbHQoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IFNvbHZlPExETFQsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJMRExUOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxMRExULCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBib29sIHNvbHZlSW5QbGFjZShNYXRyaXhCYXNlPERlcml2ZWQ+ICZiQW5kWCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgTERMVCYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KTsKKworICAgIC8qKiBccmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgcmVjaXByb2NhbCBjb25kaXRpb24gbnVtYmVyIG9mIHRoZSBtYXRyaXggb2YKKyAgICAgKiAgd2hpY2ggXGMgKnRoaXMgaXMgdGhlIExETFQgZGVjb21wb3NpdGlvbi4KKyAgICAgKi8KKyAgICBSZWFsU2NhbGFyIHJjb25kKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cmNvbmRfZXN0aW1hdGVfaGVscGVyKG1fbDFfbm9ybSwgKnRoaXMpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorICAgIExETFQmIHJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgdywgY29uc3QgUmVhbFNjYWxhciYgYWxwaGE9MSk7CisKKyAgICAvKiogXHJldHVybnMgdGhlIGludGVybmFsIExETFQgZGVjb21wb3NpdGlvbiBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVE9ETzogZG9jdW1lbnQgdGhlIHN0b3JhZ2UgbGF5b3V0CisgICAgICAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhMRExUKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeDsKKyAgICB9CisKKyAgICBNYXRyaXhUeXBlIHJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0aGUgYWRqb2ludCBvZiBcYyAqdGhpcywgdGhhdCBpcywgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGRlY29tcG9zaXRpb24gaXRzZWxmIGFzIHRoZSB1bmRlcmx5aW5nIG1hdHJpeCBpcyBzZWxmLWFkam9pbnQuCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbWF0cml4IGRlY29tcG9zaXRpb25zLCB0aHVzIGVuYWJsaW5nIGdlbmVyaWMgY29kZSBzdWNoIGFzOgorICAgICAgKiBcY29kZSB4ID0gZGVjb21wb3NpdGlvbi5hZGpvaW50KCkuc29sdmUoYikgXGVuZGNvZGUKKyAgICAgICovCisgICAgY29uc3QgTERMVCYgYWRqb2ludCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9OworCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorCisgICAgc3RhdGljIHZvaWQgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogVXNlZCB0byBjb21wdXRlIGFuZCBzdG9yZSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBBID0gTCBEIExeKiA9IFVeKiBEIFUuCisgICAgICAqIFRoZSBzdHJpY3QgdXBwZXIgcGFydCBpcyB1c2VkIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbiwgdGhlIHN0cmljdCBsb3dlcgorICAgICAgKiBwYXJ0IGNvcnJlc3BvbmQgdG8gdGhlIGNvZWZmaWNpZW50cyBvZiBMIChpdHMgZGlhZ29uYWwgaXMgZXF1YWwgdG8gMSBhbmQKKyAgICAgICogaXMgbm90IHN0b3JlZCksIGFuZCB0aGUgZGlhZ29uYWwgZW50cmllcyBjb3JyZXNwb25kIHRvIEQuCisgICAgICAqLworICAgIE1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgUmVhbFNjYWxhciBtX2wxX25vcm07CisgICAgVHJhbnNwb3NpdGlvblR5cGUgbV90cmFuc3Bvc2l0aW9uczsKKyAgICBUbXBNYXRyaXhUeXBlIG1fdGVtcG9yYXJ5OworICAgIGludGVybmFsOjpTaWduTWF0cml4IG1fc2lnbjsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8aW50IFVwTG8+IHN0cnVjdCBsZGx0X2lucGxhY2U7CisKK3RlbXBsYXRlPD4gc3RydWN0IGxkbHRfaW5wbGFjZTxMb3dlcj4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGUsIHR5cGVuYW1lIFdvcmtzcGFjZT4KKyAgc3RhdGljIGJvb2wgdW5ibG9ja2VkKE1hdHJpeFR5cGUmIG1hdCwgVHJhbnNwb3NpdGlvblR5cGUmIHRyYW5zcG9zaXRpb25zLCBXb3Jrc3BhY2UmIHRlbXAsIFNpZ25NYXRyaXgmIHNpZ24pCisgIHsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZTo6U3RvcmFnZUluZGV4IEluZGV4VHlwZTsKKyAgICBlaWdlbl9hc3NlcnQobWF0LnJvd3MoKT09bWF0LmNvbHMoKSk7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IG1hdC5yb3dzKCk7CisgICAgYm9vbCBmb3VuZF96ZXJvX3Bpdm90ID0gZmFsc2U7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgaWYgKHNpemUgPD0gMSkKKyAgICB7CisgICAgICB0cmFuc3Bvc2l0aW9ucy5zZXRJZGVudGl0eSgpOworICAgICAgaWYgKG51bWV4dDo6cmVhbChtYXQuY29lZmYoMCwwKSkgPiBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigwKSApIHNpZ24gPSBQb3NpdGl2ZVNlbWlEZWY7CisgICAgICBlbHNlIGlmIChudW1leHQ6OnJlYWwobWF0LmNvZWZmKDAsMCkpIDwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMCkpIHNpZ24gPSBOZWdhdGl2ZVNlbWlEZWY7CisgICAgICBlbHNlIHNpZ24gPSBaZXJvU2lnbjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgICAgeworICAgICAgLy8gRmluZCBsYXJnZXN0IGRpYWdvbmFsIGVsZW1lbnQKKyAgICAgIEluZGV4IGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgICAgbWF0LmRpYWdvbmFsKCkudGFpbChzaXplLWspLmN3aXNlQWJzKCkubWF4Q29lZmYoJmluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyKTsKKyAgICAgIGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7CisKKyAgICAgIHRyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGspID0gSW5kZXhUeXBlKGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyKTsKKyAgICAgIGlmKGsgIT0gaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpCisgICAgICB7CisgICAgICAgIC8vIGFwcGx5IHRoZSB0cmFuc3Bvc2l0aW9uIHdoaWxlIHRha2luZyBjYXJlIHRvIGNvbnNpZGVyIG9ubHkKKyAgICAgICAgLy8gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydAorICAgICAgICBJbmRleCBzID0gc2l6ZS1pbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lci0xOyAvLyB0cmFpbGluZyBzaXplIGFmdGVyIHRoZSBiaWdnZXN0IGVsZW1lbnQKKyAgICAgICAgbWF0LnJvdyhrKS5oZWFkKGspLnN3YXAobWF0LnJvdyhpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcikuaGVhZChrKSk7CisgICAgICAgIG1hdC5jb2woaykudGFpbChzKS5zd2FwKG1hdC5jb2woaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpLnRhaWwocykpOworICAgICAgICBzdGQ6OnN3YXAobWF0LmNvZWZmUmVmKGssayksbWF0LmNvZWZmUmVmKGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyLGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyKSk7CisgICAgICAgIGZvcihJbmRleCBpPWsrMTtpPGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyOysraSkKKyAgICAgICAgeworICAgICAgICAgIFNjYWxhciB0bXAgPSBtYXQuY29lZmZSZWYoaSxrKTsKKyAgICAgICAgICBtYXQuY29lZmZSZWYoaSxrKSA9IG51bWV4dDo6Y29uaihtYXQuY29lZmZSZWYoaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsaSkpOworICAgICAgICAgIG1hdC5jb2VmZlJlZihpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcixpKSA9IG51bWV4dDo6Y29uaih0bXApOworICAgICAgICB9CisgICAgICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgICAgICAgbWF0LmNvZWZmUmVmKGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyLGspID0gbnVtZXh0Ojpjb25qKG1hdC5jb2VmZihpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcixrKSk7CisgICAgICB9CisKKyAgICAgIC8vIHBhcnRpdGlvbiB0aGUgbWF0cml4OgorICAgICAgLy8gICAgICAgQTAwIHwgIC0gIHwgIC0KKyAgICAgIC8vIGx1ICA9IEExMCB8IEExMSB8ICAtCisgICAgICAvLyAgICAgICBBMjAgfCBBMjEgfCBBMjIKKyAgICAgIEluZGV4IHJzID0gc2l6ZSAtIGsgLSAxOworICAgICAgQmxvY2s8TWF0cml4VHlwZSxEeW5hbWljLDE+IEEyMShtYXQsaysxLGsscnMsMSk7CisgICAgICBCbG9jazxNYXRyaXhUeXBlLDEsRHluYW1pYz4gQTEwKG1hdCxrLDAsMSxrKTsKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYyxEeW5hbWljPiBBMjAobWF0LGsrMSwwLHJzLGspOworCisgICAgICBpZihrPjApCisgICAgICB7CisgICAgICAgIHRlbXAuaGVhZChrKSA9IG1hdC5kaWFnb25hbCgpLnJlYWwoKS5oZWFkKGspLmFzRGlhZ29uYWwoKSAqIEExMC5hZGpvaW50KCk7CisgICAgICAgIG1hdC5jb2VmZlJlZihrLGspIC09IChBMTAgKiB0ZW1wLmhlYWQoaykpLnZhbHVlKCk7CisgICAgICAgIGlmKHJzPjApCisgICAgICAgICAgQTIxLm5vYWxpYXMoKSAtPSBBMjAgKiB0ZW1wLmhlYWQoayk7CisgICAgICB9CisKKyAgICAgIC8vIEluIHNvbWUgcHJldmlvdXMgdmVyc2lvbnMgb2YgRWlnZW4gKGUuZy4sIDMuMi4xKSwgdGhlIHNjYWxpbmcgd2FzIG9taXR0ZWQgaWYgdGhlIHBpdm90CisgICAgICAvLyB3YXMgc21hbGxlciB0aGFuIHRoZSBjdXRvZmYgdmFsdWUuIEhvd2V2ZXIsIHNpbmNlIExETFQgaXMgbm90IHJhbmstcmV2ZWFsaW5nCisgICAgICAvLyB3ZSBzaG91bGQgb25seSBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgaW50cm9kdWNlIElORiBvciBOYU4gdmFsdWVzLgorICAgICAgLy8gUmVtYXJrIHRoYXQgTEFQQUNLIGFsc28gdXNlcyAwIGFzIHRoZSBjdXRvZmYgdmFsdWUuCisgICAgICBSZWFsU2NhbGFyIHJlYWxBa2sgPSBudW1leHQ6OnJlYWwobWF0LmNvZWZmUmVmKGssaykpOworICAgICAgYm9vbCBwaXZvdF9pc192YWxpZCA9IChhYnMocmVhbEFraykgPiBSZWFsU2NhbGFyKDApKTsKKworICAgICAgaWYoaz09MCAmJiAhcGl2b3RfaXNfdmFsaWQpCisgICAgICB7CisgICAgICAgIC8vIFRoZSBlbnRpcmUgZGlhZ29uYWwgaXMgemVybywgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGRvCisgICAgICAgIC8vIGV4Y2VwdCBmaWxsaW5nIHRoZSB0cmFuc3Bvc2l0aW9ucywgYW5kIGNoZWNraW5nIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyB6ZXJvLgorICAgICAgICBzaWduID0gWmVyb1NpZ247CisgICAgICAgIGZvcihJbmRleCBqID0gMDsgajxzaXplOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3Bvc2l0aW9ucy5jb2VmZlJlZihqKSA9IEluZGV4VHlwZShqKTsKKyAgICAgICAgICByZXQgPSByZXQgJiYgKG1hdC5jb2woaikudGFpbChzaXplLWotMSkuYXJyYXkoKT09U2NhbGFyKDApKS5hbGwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorCisgICAgICBpZigocnM+MCkgJiYgcGl2b3RfaXNfdmFsaWQpCisgICAgICAgIEEyMSAvPSByZWFsQWtrOworCisgICAgICBpZihmb3VuZF96ZXJvX3Bpdm90ICYmIHBpdm90X2lzX3ZhbGlkKSByZXQgPSBmYWxzZTsgLy8gZmFjdG9yaXphdGlvbiBmYWlsZWQKKyAgICAgIGVsc2UgaWYoIXBpdm90X2lzX3ZhbGlkKSBmb3VuZF96ZXJvX3Bpdm90ID0gdHJ1ZTsKKworICAgICAgaWYgKHNpZ24gPT0gUG9zaXRpdmVTZW1pRGVmKSB7CisgICAgICAgIGlmIChyZWFsQWtrIDwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMCkpIHNpZ24gPSBJbmRlZmluaXRlOworICAgICAgfSBlbHNlIGlmIChzaWduID09IE5lZ2F0aXZlU2VtaURlZikgeworICAgICAgICBpZiAocmVhbEFrayA+IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDApKSBzaWduID0gSW5kZWZpbml0ZTsKKyAgICAgIH0gZWxzZSBpZiAoc2lnbiA9PSBaZXJvU2lnbikgeworICAgICAgICBpZiAocmVhbEFrayA+IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDApKSBzaWduID0gUG9zaXRpdmVTZW1pRGVmOworICAgICAgICBlbHNlIGlmIChyZWFsQWtrIDwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMCkpIHNpZ24gPSBOZWdhdGl2ZVNlbWlEZWY7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8vIFJlZmVyZW5jZSBmb3IgdGhlIGFsZ29yaXRobTogRGF2aXMgYW5kIEhhZ2VyLCAiTXVsdGlwbGUgUmFuaworICAvLyBNb2RpZmljYXRpb25zIG9mIGEgU3BhcnNlIENob2xlc2t5IEZhY3Rvcml6YXRpb24iIChBbGdvcml0aG0gMSkKKyAgLy8gVHJpdmlhbCByZWFycmFuZ2VtZW50cyBvZiB0aGVpciBjb21wdXRhdGlvbnMgKFRpbW90aHkgRS4gSG9seSkKKyAgLy8gYWxsb3cgdGhlaXIgYWxnb3JpdGhtIHRvIHdvcmsgZm9yIHJhbmstMSB1cGRhdGVzIGV2ZW4gaWYgdGhlCisgIC8vIG9yaWdpbmFsIG1hdHJpeCBpcyBub3Qgb2YgZnVsbCByYW5rLgorICAvLyBIZXJlIG9ubHkgcmFuay0xIHVwZGF0ZXMgYXJlIGltcGxlbWVudGVkLCB0byByZWR1Y2UgdGhlCisgIC8vIHJlcXVpcmVtZW50IGZvciBpbnRlcm1lZGlhdGUgc3RvcmFnZSBhbmQgaW1wcm92ZSBhY2N1cmFjeQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBXRGVyaXZlZD4KKyAgc3RhdGljIGJvb2wgdXBkYXRlSW5QbGFjZShNYXRyaXhUeXBlJiBtYXQsIE1hdHJpeEJhc2U8V0Rlcml2ZWQ+JiB3LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBzaWdtYT0xKQorICB7CisgICAgdXNpbmcgbnVtZXh0Ojppc2Zpbml0ZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gbWF0LnJvd3MoKTsKKyAgICBlaWdlbl9hc3NlcnQobWF0LmNvbHMoKSA9PSBzaXplICYmIHcuc2l6ZSgpPT1zaXplKTsKKworICAgIFJlYWxTY2FsYXIgYWxwaGEgPSAxOworCisgICAgLy8gQXBwbHkgdGhlIHVwZGF0ZQorICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBzaXplOyBqKyspCisgICAgeworICAgICAgLy8gQ2hlY2sgZm9yIHRlcm1pbmF0aW9uIGR1ZSB0byBhbiBvcmlnaW5hbCBkZWNvbXBvc2l0aW9uIG9mIGxvdy1yYW5rCisgICAgICBpZiAoIShpc2Zpbml0ZSkoYWxwaGEpKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gVXBkYXRlIHRoZSBkaWFnb25hbCB0ZXJtcworICAgICAgUmVhbFNjYWxhciBkaiA9IG51bWV4dDo6cmVhbChtYXQuY29lZmYoaixqKSk7CisgICAgICBTY2FsYXIgd2ogPSB3LmNvZWZmKGopOworICAgICAgUmVhbFNjYWxhciBzd2oyID0gc2lnbWEqbnVtZXh0OjphYnMyKHdqKTsKKyAgICAgIFJlYWxTY2FsYXIgZ2FtbWEgPSBkaiphbHBoYSArIHN3ajI7CisKKyAgICAgIG1hdC5jb2VmZlJlZihqLGopICs9IHN3ajIvYWxwaGE7CisgICAgICBhbHBoYSArPSBzd2oyL2RqOworCisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgdGVybXMgb2YgTAorICAgICAgSW5kZXggcnMgPSBzaXplLWotMTsKKyAgICAgIHcudGFpbChycykgLT0gd2ogKiBtYXQuY29sKGopLnRhaWwocnMpOworICAgICAgaWYoZ2FtbWEgIT0gMCkKKyAgICAgICAgbWF0LmNvbChqKS50YWlsKHJzKSArPSAoc2lnbWEqbnVtZXh0Ojpjb25qKHdqKS9nYW1tYSkqdy50YWlsKHJzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZSwgdHlwZW5hbWUgV29ya3NwYWNlLCB0eXBlbmFtZSBXVHlwZT4KKyAgc3RhdGljIGJvb2wgdXBkYXRlKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVHJhbnNwb3NpdGlvblR5cGUmIHRyYW5zcG9zaXRpb25zLCBXb3Jrc3BhY2UmIHRtcCwgY29uc3QgV1R5cGUmIHcsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIHNpZ21hPTEpCisgIHsKKyAgICAvLyBBcHBseSB0aGUgcGVybXV0YXRpb24gdG8gdGhlIGlucHV0IHcKKyAgICB0bXAgPSB0cmFuc3Bvc2l0aW9ucyAqIHc7CisKKyAgICByZXR1cm4gbGRsdF9pbnBsYWNlPExvd2VyPjo6dXBkYXRlSW5QbGFjZShtYXQsdG1wLHNpZ21hKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgbGRsdF9pbnBsYWNlPFVwcGVyPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZSwgdHlwZW5hbWUgV29ya3NwYWNlPgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBib29sIHVuYmxvY2tlZChNYXRyaXhUeXBlJiBtYXQsIFRyYW5zcG9zaXRpb25UeXBlJiB0cmFuc3Bvc2l0aW9ucywgV29ya3NwYWNlJiB0ZW1wLCBTaWduTWF0cml4JiBzaWduKQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGRsdF9pbnBsYWNlPExvd2VyPjo6dW5ibG9ja2VkKG1hdHQsIHRyYW5zcG9zaXRpb25zLCB0ZW1wLCBzaWduKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBXb3Jrc3BhY2UsIHR5cGVuYW1lIFdUeXBlPgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBib29sIHVwZGF0ZShNYXRyaXhUeXBlJiBtYXQsIFRyYW5zcG9zaXRpb25UeXBlJiB0cmFuc3Bvc2l0aW9ucywgV29ya3NwYWNlJiB0bXAsIFdUeXBlJiB3LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBzaWdtYT0xKQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGRsdF9pbnBsYWNlPExvd2VyPjo6dXBkYXRlKG1hdHQsIHRyYW5zcG9zaXRpb25zLCB0bXAsIHcuY29uanVnYXRlKCksIHNpZ21hKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IExETFRfVHJhaXRzPE1hdHJpeFR5cGUsTG93ZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgTWF0cml4VHlwZSwgVW5pdExvd2VyPiBNYXRyaXhMOworICB0eXBlZGVmIGNvbnN0IFRyaWFuZ3VsYXJWaWV3PGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkFkam9pbnRSZXR1cm5UeXBlLCBVbml0VXBwZXI+IE1hdHJpeFU7CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4TCBnZXRMKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIE1hdHJpeEwobSk7IH0KKyAgc3RhdGljIGlubGluZSBNYXRyaXhVIGdldFUoY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gTWF0cml4VShtLmFkam9pbnQoKSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBMRExUX1RyYWl0czxNYXRyaXhUeXBlLFVwcGVyPgoreworICB0eXBlZGVmIGNvbnN0IFRyaWFuZ3VsYXJWaWV3PGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkFkam9pbnRSZXR1cm5UeXBlLCBVbml0TG93ZXI+IE1hdHJpeEw7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgTWF0cml4VHlwZSwgVW5pdFVwcGVyPiBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhMKG0uYWRqb2ludCgpKTsgfQorICBzdGF0aWMgaW5saW5lIE1hdHJpeFUgZ2V0VShjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhVKG0pOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIENvbXB1dGUgLyByZWNvbXB1dGUgdGhlIExETFQgZGVjb21wb3NpdGlvbiBBID0gTCBEIExeKiA9IFVeKiBEIFUgb2YgXGEgbWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgX1VwTG8+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CitMRExUPE1hdHJpeFR5cGUsX1VwTG8+JiBMRExUPE1hdHJpeFR5cGUsX1VwTG8+Ojpjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBhKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisKKyAgZWlnZW5fYXNzZXJ0KGEucm93cygpPT1hLmNvbHMoKSk7CisgIGNvbnN0IEluZGV4IHNpemUgPSBhLnJvd3MoKTsKKworICBtX21hdHJpeCA9IGEuZGVyaXZlZCgpOworCisgIC8vIENvbXB1dGUgbWF0cml4IEwxIG5vcm0gPSBtYXggYWJzIGNvbHVtbiBzdW0uCisgIG1fbDFfbm9ybSA9IFJlYWxTY2FsYXIoMCk7CisgIC8vIFRPRE8gbW92ZSB0aGlzIGNvZGUgdG8gU2VsZkFkam9pbnRWaWV3CisgIGZvciAoSW5kZXggY29sID0gMDsgY29sIDwgc2l6ZTsgKytjb2wpIHsKKyAgICBSZWFsU2NhbGFyIGFic19jb2xfc3VtOworICAgIGlmIChfVXBMbyA9PSBMb3dlcikKKyAgICAgIGFic19jb2xfc3VtID0gbV9tYXRyaXguY29sKGNvbCkudGFpbChzaXplIC0gY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKSArIG1fbWF0cml4LnJvdyhjb2wpLmhlYWQoY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKTsKKyAgICBlbHNlCisgICAgICBhYnNfY29sX3N1bSA9IG1fbWF0cml4LmNvbChjb2wpLmhlYWQoY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKSArIG1fbWF0cml4LnJvdyhjb2wpLnRhaWwoc2l6ZSAtIGNvbCkudGVtcGxhdGUgbHBOb3JtPDE+KCk7CisgICAgaWYgKGFic19jb2xfc3VtID4gbV9sMV9ub3JtKQorICAgICAgbV9sMV9ub3JtID0gYWJzX2NvbF9zdW07CisgIH0KKworICBtX3RyYW5zcG9zaXRpb25zLnJlc2l6ZShzaXplKTsKKyAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgIG1fdGVtcG9yYXJ5LnJlc2l6ZShzaXplKTsKKyAgbV9zaWduID0gaW50ZXJuYWw6Olplcm9TaWduOworCisgIG1faW5mbyA9IGludGVybmFsOjpsZGx0X2lucGxhY2U8VXBMbz46OnVuYmxvY2tlZChtX21hdHJpeCwgbV90cmFuc3Bvc2l0aW9ucywgbV90ZW1wb3JhcnksIG1fc2lnbikgPyBTdWNjZXNzIDogTnVtZXJpY2FsSXNzdWU7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogVXBkYXRlIHRoZSBMRExUIGRlY29tcG9zaXRpb246ICBnaXZlbiBBID0gTCBEIExeVCwgZWZmaWNpZW50bHkgY29tcHV0ZSB0aGUgZGVjb21wb3NpdGlvbiBvZiBBICsgc2lnbWEgdyB3XlQuCisgKiBccGFyYW0gdyBhIHZlY3RvciB0byBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgZGVjb21wb3NpdGlvbi4KKyAqIFxwYXJhbSBzaWdtYSBhIHNjYWxhciwgKzEgZm9yIHVwZGF0ZXMgYW5kIC0xIGZvciAiZG93bmRhdGVzLCIgd2hpY2ggY29ycmVzcG9uZCB0byByZW1vdmluZyBwcmV2aW91c2x5LWFkZGVkIGNvbHVtbiB2ZWN0b3JzLiBPcHRpb25hbDsgZGVmYXVsdCB2YWx1ZSBpcyArMS4KKyAqIFxzYSBzZXRaZXJvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitMRExUPE1hdHJpeFR5cGUsX1VwTG8+JiBMRExUPE1hdHJpeFR5cGUsX1VwTG8+OjpyYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHcsIGNvbnN0IHR5cGVuYW1lIExETFQ8TWF0cml4VHlwZSxfVXBMbz46OlJlYWxTY2FsYXImIHNpZ21hKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlOjpTdG9yYWdlSW5kZXggSW5kZXhUeXBlOworICBjb25zdCBJbmRleCBzaXplID0gdy5yb3dzKCk7CisgIGlmIChtX2lzSW5pdGlhbGl6ZWQpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1zaXplKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtX21hdHJpeC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgICBtX21hdHJpeC5zZXRaZXJvKCk7CisgICAgbV90cmFuc3Bvc2l0aW9ucy5yZXNpemUoc2l6ZSk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgIG1fdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBJbmRleFR5cGUoaSk7CisgICAgbV90ZW1wb3JhcnkucmVzaXplKHNpemUpOworICAgIG1fc2lnbiA9IHNpZ21hPj0wID8gaW50ZXJuYWw6OlBvc2l0aXZlU2VtaURlZiA6IGludGVybmFsOjpOZWdhdGl2ZVNlbWlEZWY7CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIGludGVybmFsOjpsZGx0X2lucGxhY2U8VXBMbz46OnVwZGF0ZShtX21hdHJpeCwgbV90cmFuc3Bvc2l0aW9ucywgbV90ZW1wb3JhcnksIHcsIHNpZ21hKTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgordm9pZCBMRExUPF9NYXRyaXhUeXBlLF9VcExvPjo6X3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyaHMucm93cygpID09IHJvd3MoKSk7CisgIC8vIGRzdCA9IFAgYgorICBkc3QgPSBtX3RyYW5zcG9zaXRpb25zICogcmhzOworCisgIC8vIGRzdCA9IExeLTEgKFAgYikKKyAgbWF0cml4TCgpLnNvbHZlSW5QbGFjZShkc3QpOworCisgIC8vIGRzdCA9IEReLTEgKExeLTEgUCBiKQorICAvLyBtb3JlIHByZWNpc2VseSwgdXNlIHBzZXVkby1pbnZlcnNlIG9mIEQgKHNlZSBidWcgMjQxKQorICB1c2luZyBzdGQ6OmFiczsKKyAgY29uc3QgdHlwZW5hbWUgRGlhZ29uYWw8Y29uc3QgTWF0cml4VHlwZT46OlJlYWxSZXR1cm5UeXBlIHZlY0QodmVjdG9yRCgpKTsKKyAgLy8gSW4gc29tZSBwcmV2aW91cyB2ZXJzaW9ucywgdG9sZXJhbmNlIHdhcyBzZXQgdG8gdGhlIG1heCBvZiAxL2hpZ2hlc3QgYW5kIHRoZSBtYXhpbWFsIGRpYWdvbmFsIGVudHJ5ICogZXBzaWxvbgorICAvLyBhcyBtb3RpdmF0ZWQgYnkgTEFQQUNLJ3MgeEdFTFNTOgorICAvLyBSZWFsU2NhbGFyIHRvbGVyYW5jZSA9IG51bWV4dDo6bWF4aSh2ZWNELmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKSAqIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpLFJlYWxTY2FsYXIoMSkgLyBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmhpZ2hlc3QoKSk7CisgIC8vIEhvd2V2ZXIsIExETFQgaXMgbm90IHJhbmsgcmV2ZWFsaW5nLCBhbmQgc28gYWRqdXN0aW5nIHRoZSB0b2xlcmFuY2Ugd3J0IHRvIHRoZSBoaWdoZXN0CisgIC8vIGRpYWdvbmFsIGVsZW1lbnQgaXMgbm90IHdlbGwganVzdGlmaWVkIGFuZCBsZWFkcyB0byBudW1lcmljYWwgaXNzdWVzIGluIHNvbWUgY2FzZXMuCisgIC8vIE1vcmVvdmVyLCBMYXBhY2sncyB4U1lUUlMgcm91dGluZXMgdXNlIDAgZm9yIHRoZSB0b2xlcmFuY2UuCisgIFJlYWxTY2FsYXIgdG9sZXJhbmNlID0gUmVhbFNjYWxhcigxKSAvIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6aGlnaGVzdCgpOworCisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCB2ZWNELnNpemUoKTsgKytpKQorICB7CisgICAgaWYoYWJzKHZlY0QoaSkpID4gdG9sZXJhbmNlKQorICAgICAgZHN0LnJvdyhpKSAvPSB2ZWNEKGkpOworICAgIGVsc2UKKyAgICAgIGRzdC5yb3coaSkuc2V0WmVybygpOworICB9CisKKyAgLy8gZHN0ID0gTF4tVCAoRF4tMSBMXi0xIFAgYikKKyAgbWF0cml4VSgpLnNvbHZlSW5QbGFjZShkc3QpOworCisgIC8vIGRzdCA9IFBeLTEgKExeLVQgRF4tMSBMXi0xIFAgYikgPSBBXi0xIGIKKyAgZHN0ID0gbV90cmFuc3Bvc2l0aW9ucy50cmFuc3Bvc2UoKSAqIGRzdDsKK30KKyNlbmRpZgorCisvKiogXGludGVybmFsIHVzZSB4ID0gbGRsdF9vYmplY3Quc29sdmUoeCk7CisgICoKKyAgKiBUaGlzIGlzIHRoZSBcZW0gaW4tcGxhY2UgdmVyc2lvbiBvZiBzb2x2ZSgpLgorICAqCisgICogXHBhcmFtIGJBbmRYIHJlcHJlc2VudHMgYm90aCB0aGUgcmlnaHQtaGFuZCBzaWRlIG1hdHJpeCBiIGFuZCByZXN1bHQgeC4KKyAgKgorICAqIFxyZXR1cm5zIHRydWUgYWx3YXlzISBJZiB5b3UgbmVlZCB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIHNvbHV0aW9ucywgdXNlIGFub3RoZXIgZGVjb21wb3NpdGlvbiBsaWtlIExVLCBRUiwgb3IgU1ZELgorICAqCisgICogVGhpcyB2ZXJzaW9uIGF2b2lkcyBhIGNvcHkgd2hlbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIGlzIG5vdAorICAqIG5lZWRlZCBhbnltb3JlLgorICAqCisgICogXHNhIExETFQ6OnNvbHZlKCksIE1hdHJpeEJhc2U6OmxkbHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgX1VwTG8+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBMRExUPE1hdHJpeFR5cGUsX1VwTG8+Ojpzb2x2ZUluUGxhY2UoTWF0cml4QmFzZTxEZXJpdmVkPiAmYkFuZFgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxETFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpID09IGJBbmRYLnJvd3MoKSk7CisKKyAgYkFuZFggPSB0aGlzLT5zb2x2ZShiQW5kWCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNvbXBvc2l0aW9uLAorICogaS5lLiwgaXQgcmV0dXJucyB0aGUgcHJvZHVjdDogUF5UIEwgRCBMXiogUC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGRlYnVnIHB1cnBvc2UuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgX1VwTG8+CitNYXRyaXhUeXBlIExETFQ8TWF0cml4VHlwZSxfVXBMbz46OnJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0cml4LnJvd3MoKTsKKyAgTWF0cml4VHlwZSByZXMoc2l6ZSxzaXplKTsKKworICAvLyBQCisgIHJlcy5zZXRJZGVudGl0eSgpOworICByZXMgPSB0cmFuc3Bvc2l0aW9uc1AoKSAqIHJlczsKKyAgLy8gTF4qIFAKKyAgcmVzID0gbWF0cml4VSgpICogcmVzOworICAvLyBEKExeKlApCisgIHJlcyA9IHZlY3RvckQoKS5yZWFsKCkuYXNEaWFnb25hbCgpICogcmVzOworICAvLyBMKERMXipQKQorICByZXMgPSBtYXRyaXhMKCkgKiByZXM7CisgIC8vIFBeVCAoTERMXipQKQorICByZXMgPSB0cmFuc3Bvc2l0aW9uc1AoKS50cmFuc3Bvc2UoKSAqIHJlczsKKworICByZXR1cm4gcmVzOworfQorCisvKiogXGNob2xlc2t5X21vZHVsZQorICAqIFxyZXR1cm5zIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIHdpdGggZnVsbCBwaXZvdGluZyB3aXRob3V0IHNxdWFyZSByb290IG9mIFxjICp0aGlzCisgICogXHNhIE1hdHJpeEJhc2U6OmxkbHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+CitpbmxpbmUgY29uc3QgTERMVDx0eXBlbmFtZSBTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSwgVXBMbz46OlBsYWluT2JqZWN0LCBVcExvPgorU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpsZGx0KCkgY29uc3QKK3sKKyAgcmV0dXJuIExETFQ8UGxhaW5PYmplY3QsVXBMbz4obV9tYXRyaXgpOworfQorCisvKiogXGNob2xlc2t5X21vZHVsZQorICAqIFxyZXR1cm5zIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIHdpdGggZnVsbCBwaXZvdGluZyB3aXRob3V0IHNxdWFyZSByb290IG9mIFxjICp0aGlzCisgICogXHNhIFNlbGZBZGpvaW50Vmlldzo6bGRsdCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IExETFQ8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpsZGx0KCkgY29uc3QKK3sKKyAgcmV0dXJuIExETFQ8UGxhaW5PYmplY3Q+KGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTERMVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbGVza3kvTExULmggYi9FaWdlbi9zcmMvQ2hvbGVza3kvTExULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjYThkNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9DaG9sZXNreS9MTFQuaApAQCAtMCwwICsxLDUzNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0xMVF9ICisjZGVmaW5lIEVJR0VOX0xMVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBVcExvPiBzdHJ1Y3QgTExUX1RyYWl0czsKK30KKworLyoqIFxpbmdyb3VwIENob2xlc2t5X01vZHVsZQorICAqCisgICogXGNsYXNzIExMVAorICAqCisgICogXGJyaWVmIFN0YW5kYXJkIENob2xlc2t5IGRlY29tcG9zaXRpb24gKExMXlQpIG9mIGEgbWF0cml4IGFuZCBhc3NvY2lhdGVkIGZlYXR1cmVzCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgTExeVCBDaG9sZXNreSBkZWNvbXBvc2l0aW9uCisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgZGVjb21wb3NpdG9uOiBMb3dlciAoZGVmYXVsdCkgb3IgVXBwZXIuCisgICogICAgICAgICAgICAgVGhlIG90aGVyIHRyaWFuZ3VsYXIgcGFydCB3b24ndCBiZSByZWFkLgorICAqCisgICogVGhpcyBjbGFzcyBwZXJmb3JtcyBhIExMXlQgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBhIHN5bW1ldHJpYywgcG9zaXRpdmUgZGVmaW5pdGUKKyAgKiBtYXRyaXggQSBzdWNoIHRoYXQgQSA9IExMXiogPSBVXipVLCB3aGVyZSBMIGlzIGxvd2VyIHRyaWFuZ3VsYXIuCisgICoKKyAgKiBXaGlsZSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIHNvbHZlIHNlbGZhZGpvaW50IHByb2JsZW1zIGxpa2UgIEReKkQgeCA9IGIsCisgICogZm9yIHRoYXQgcHVycG9zZSwgd2UgcmVjb21tZW5kIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIHdpdGhvdXQgc3F1YXJlIHJvb3Qgd2hpY2ggaXMgbW9yZSBzdGFibGUKKyAgKiBhbmQgZXZlbiBmYXN0ZXIuIE5ldmVydGhlbGVzcywgdGhpcyBzdGFuZGFyZCBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIHJlbWFpbnMgdXNlZnVsIGluIG1hbnkgb3RoZXIKKyAgKiBzaXR1YXRpb25zIGxpa2UgZ2VuZXJhbGlzZWQgZWlnZW4gcHJvYmxlbXMgd2l0aCBoZXJtaXRpYW4gbWF0cmljZXMuCisgICoKKyAgKiBSZW1lbWJlciB0aGF0IENob2xlc2t5IGRlY29tcG9zaXRpb25zIGFyZSBub3QgcmFuay1yZXZlYWxpbmcuIFRoaXMgTExUIGRlY29tcG9zaXRpb24gaXMgb25seSBzdGFibGUgb24gcG9zaXRpdmUgZGVmaW5pdGUgbWF0cmljZXMsCisgICogdXNlIExETFQgaW5zdGVhZCBmb3IgdGhlIHNlbWlkZWZpbml0ZSBjYXNlLiBBbHNvLCBkbyBub3QgdXNlIGEgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5c3RlbSBvZiBlcXVhdGlvbnMKKyAgKiBoYXMgYSBzb2x1dGlvbi4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIExMVF9leGFtcGxlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIExMVF9leGFtcGxlLm91dAorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIG1lY2hhbmlzbS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpsbHQoKSwgU2VsZkFkam9pbnRWaWV3OjpsbHQoKSwgY2xhc3MgTERMVAorICAqLworIC8qIEhFWSBUSElTIERPWCBJUyBESVNBQkxFRCBCRUNBVVNFIFRIRVJFJ3MgQSBCVUcgRUlUSEVSIEhFUkUgT1IgSU4gTERMVCBBQk9VVCBUSEFUIChPUiBCT1RIKQorICAqIE5vdGUgdGhhdCBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24sIG9ubHkgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzIGNvbnNpZGVyZWQuIFRoZXJlZm9yZSwKKyAgKiB0aGUgc3RyaWN0IGxvd2VyIHBhcnQgZG9lcyBub3QgaGF2ZSB0byBzdG9yZSBjb3JyZWN0IHZhbHVlcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+IGNsYXNzIExMVAoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKworICAgIGVudW0geworICAgICAgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgICBBbGlnbm1lbnRNYXNrID0gaW50KFBhY2tldFNpemUpLTEsCisgICAgICBVcExvID0gX1VwTG8KKyAgICB9OworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6TExUX1RyYWl0czxNYXRyaXhUeXBlLFVwTG8+IFRyYWl0czsKKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgTExUOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAgICovCisgICAgTExUKCkgOiBtX21hdHJpeCgpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3Igd2l0aCBtZW1vcnkgcHJlYWxsb2NhdGlvbgorICAgICAgKgorICAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGJ1dCB3aXRoIHByZWFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEKKyAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvYmxlbSBcYSBzaXplLgorICAgICAgKiBcc2EgTExUKCkKKyAgICAgICovCisgICAgZXhwbGljaXQgTExUKEluZGV4IHNpemUpIDogbV9tYXRyaXgoc2l6ZSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBMTFQoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeC5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIExETFQgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIHdoZW4KKyAgICAgICogXGMgTWF0cml4VHlwZSBpcyBhIEVpZ2VuOjpSZWYuCisgICAgICAqCisgICAgICAqIFxzYSBMTFQoY29uc3QgRWlnZW5CYXNlJikKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIGV4cGxpY2l0IExMVChFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICAgICAgOiBtX21hdHJpeChtYXRyaXguZGVyaXZlZCgpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmlldyBvZiB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggVSAqLworICAgIGlubGluZSB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeFUgbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBUcmFpdHM6OmdldFUobV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZpZXcgb2YgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IEwgKi8KKyAgICBpbmxpbmUgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhMIG1hdHJpeEwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gVHJhaXRzOjpnZXRMKG1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogU2luY2UgdGhpcyBMTFQgY2xhc3MgYXNzdW1lcyBhbnl3YXkgdGhhdCB0aGUgbWF0cml4IEEgaXMgaW52ZXJ0aWJsZSwgdGhlIHNvbHV0aW9uCisgICAgICAqIHRoZW9yZXRpY2FsbHkgZXhpc3RzIGFuZCBpcyB1bmlxdWUgcmVnYXJkbGVzcyBvZiBiLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBMTFRfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIExMVF9zb2x2ZS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIHNvbHZlSW5QbGFjZSgpLCBNYXRyaXhCYXNlOjpsbHQoKSwgU2VsZkFkam9pbnRWaWV3OjpsbHQoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IFNvbHZlPExMVCwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fbWF0cml4LnJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiTExUOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxMTFQsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIHZvaWQgc29sdmVJblBsYWNlKE1hdHJpeEJhc2U8RGVyaXZlZD4gJmJBbmRYKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBMTFQmIGNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCk7CisKKyAgICAvKiogXHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHJlY2lwcm9jYWwgY29uZGl0aW9uIG51bWJlciBvZiB0aGUgbWF0cml4IG9mCisgICAgICAqICB3aGljaCBcYyAqdGhpcyBpcyB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbi4KKyAgICAgICovCisgICAgUmVhbFNjYWxhciByY29uZCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2luZm8gPT0gU3VjY2VzcyAmJiAiTExUIGZhaWxlZCBiZWNhdXNlIG1hdHJpeCBhcHBlYXJzIHRvIGJlIG5lZ2F0aXZlIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnJjb25kX2VzdGltYXRlX2hlbHBlcihtX2wxX25vcm0sICp0aGlzKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIExMVCBkZWNvbXBvc2l0aW9uIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUT0RPOiBkb2N1bWVudCB0aGUgc3RvcmFnZSBsYXlvdXQKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeExMVCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeDsKKyAgICB9CisKKyAgICBNYXRyaXhUeXBlIHJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdDsKKworCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhZGpvaW50IG9mIFxjICp0aGlzLCB0aGF0IGlzLCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZGVjb21wb3NpdGlvbiBpdHNlbGYgYXMgdGhlIHVuZGVybHlpbmcgbWF0cml4IGlzIHNlbGYtYWRqb2ludC4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBtYXRyaXggZGVjb21wb3NpdGlvbnMsIHRodXMgZW5hYmxpbmcgZ2VuZXJpYyBjb2RlIHN1Y2ggYXM6CisgICAgICAqIFxjb2RlIHggPSBkZWNvbXBvc2l0aW9uLmFkam9pbnQoKS5zb2x2ZShiKSBcZW5kY29kZQorICAgICAgKi8KKyAgICBjb25zdCBMTFQmIGFkam9pbnQoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfTsKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgTExUIHJhbmtVcGRhdGUoY29uc3QgVmVjdG9yVHlwZSYgdmVjLCBjb25zdCBSZWFsU2NhbGFyJiBzaWdtYSA9IDEpOworCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFJoc1R5cGUgJnJocywgRHN0VHlwZSAmZHN0KSBjb25zdDsKKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFNjYWxhcik7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBVc2VkIHRvIGNvbXB1dGUgYW5kIHN0b3JlIEwKKyAgICAgICogVGhlIHN0cmljdCB1cHBlciBwYXJ0IGlzIG5vdCB1c2VkIGFuZCBldmVuIG5vdCBpbml0aWFsaXplZC4KKyAgICAgICovCisgICAgTWF0cml4VHlwZSBtX21hdHJpeDsKKyAgICBSZWFsU2NhbGFyIG1fbDFfbm9ybTsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgVXBMbz4gc3RydWN0IGxsdF9pbnBsYWNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgorc3RhdGljIEluZGV4IGxsdF9yYW5rX3VwZGF0ZV9sb3dlcihNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFZlY3RvclR5cGUmIHZlYywgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgc2lnbWEpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb2xYcHIgQ29sWHByOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPENvbFhwcj46OnR5cGUgQ29sWHByQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb2xYcHJDbGVhbmVkOjpTZWdtZW50UmV0dXJuVHlwZSBDb2xYcHJTZWdtZW50OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBUZW1wVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wVmVjdG9yVHlwZTo6U2VnbWVudFJldHVyblR5cGUgVGVtcFZlY1NlZ21lbnQ7CisKKyAgSW5kZXggbiA9IG1hdC5jb2xzKCk7CisgIGVpZ2VuX2Fzc2VydChtYXQucm93cygpPT1uICYmIHZlYy5zaXplKCk9PW4pOworCisgIFRlbXBWZWN0b3JUeXBlIHRlbXA7CisKKyAgaWYoc2lnbWE+MCkKKyAgeworICAgIC8vIFRoaXMgdmVyc2lvbiBpcyBiYXNlZCBvbiBHaXZlbnMgcm90YXRpb25zLgorICAgIC8vIEl0IGlzIGZhc3RlciB0aGFuIHRoZSBvdGhlciBvbmUgYmVsb3csIGJ1dCBvbmx5IHdvcmtzIGZvciB1cGRhdGVzLAorICAgIC8vIGkuZS4sIGZvciBzaWdtYSA+IDAKKyAgICB0ZW1wID0gc3FydChzaWdtYSkgKiB2ZWM7CisKKyAgICBmb3IoSW5kZXggaT0wOyBpPG47ICsraSkKKyAgICB7CisgICAgICBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+IGc7CisgICAgICBnLm1ha2VHaXZlbnMobWF0KGksaSksIC10ZW1wKGkpLCAmbWF0KGksaSkpOworCisgICAgICBJbmRleCBycyA9IG4taS0xOworICAgICAgaWYocnM+MCkKKyAgICAgIHsKKyAgICAgICAgQ29sWHByU2VnbWVudCB4KG1hdC5jb2woaSkudGFpbChycykpOworICAgICAgICBUZW1wVmVjU2VnbWVudCB5KHRlbXAudGFpbChycykpOworICAgICAgICBhcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoeCwgeSwgZyk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRlbXAgPSB2ZWM7CisgICAgUmVhbFNjYWxhciBiZXRhID0gMTsKKyAgICBmb3IoSW5kZXggaj0wOyBqPG47ICsraikKKyAgICB7CisgICAgICBSZWFsU2NhbGFyIExqaiA9IG51bWV4dDo6cmVhbChtYXQuY29lZmYoaixqKSk7CisgICAgICBSZWFsU2NhbGFyIGRqID0gbnVtZXh0OjphYnMyKExqaik7CisgICAgICBTY2FsYXIgd2ogPSB0ZW1wLmNvZWZmKGopOworICAgICAgUmVhbFNjYWxhciBzd2oyID0gc2lnbWEqbnVtZXh0OjphYnMyKHdqKTsKKyAgICAgIFJlYWxTY2FsYXIgZ2FtbWEgPSBkaipiZXRhICsgc3dqMjsKKworICAgICAgUmVhbFNjYWxhciB4ID0gZGogKyBzd2oyL2JldGE7CisgICAgICBpZiAoeDw9UmVhbFNjYWxhcigwKSkKKyAgICAgICAgcmV0dXJuIGo7CisgICAgICBSZWFsU2NhbGFyIG5MamogPSBzcXJ0KHgpOworICAgICAgbWF0LmNvZWZmUmVmKGosaikgPSBuTGpqOworICAgICAgYmV0YSArPSBzd2oyL2RqOworCisgICAgICAvLyBVcGRhdGUgdGhlIHRlcm1zIG9mIEwKKyAgICAgIEluZGV4IHJzID0gbi1qLTE7CisgICAgICBpZihycykKKyAgICAgIHsKKyAgICAgICAgdGVtcC50YWlsKHJzKSAtPSAod2ovTGpqKSAqIG1hdC5jb2woaikudGFpbChycyk7CisgICAgICAgIGlmKGdhbW1hICE9IDApCisgICAgICAgICAgbWF0LmNvbChqKS50YWlsKHJzKSA9IChuTGpqL0xqaikgKiBtYXQuY29sKGopLnRhaWwocnMpICsgKG5MamogKiBzaWdtYSpudW1leHQ6OmNvbmood2opL2dhbW1hKSp0ZW1wLnRhaWwocnMpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGxsdF9pbnBsYWNlPFNjYWxhciwgTG93ZXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgc3RhdGljIEluZGV4IHVuYmxvY2tlZChNYXRyaXhUeXBlJiBtYXQpCisgIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisKKyAgICBlaWdlbl9hc3NlcnQobWF0LnJvd3MoKT09bWF0LmNvbHMoKSk7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IG1hdC5yb3dzKCk7CisgICAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICAgIHsKKyAgICAgIEluZGV4IHJzID0gc2l6ZS1rLTE7IC8vIHJlbWFpbmluZyBzaXplCisKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYywxPiBBMjEobWF0LGsrMSxrLHJzLDEpOworICAgICAgQmxvY2s8TWF0cml4VHlwZSwxLER5bmFtaWM+IEExMChtYXQsaywwLDEsayk7CisgICAgICBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gQTIwKG1hdCxrKzEsMCxycyxrKTsKKworICAgICAgUmVhbFNjYWxhciB4ID0gbnVtZXh0OjpyZWFsKG1hdC5jb2VmZihrLGspKTsKKyAgICAgIGlmIChrPjApIHggLT0gQTEwLnNxdWFyZWROb3JtKCk7CisgICAgICBpZiAoeDw9UmVhbFNjYWxhcigwKSkKKyAgICAgICAgcmV0dXJuIGs7CisgICAgICBtYXQuY29lZmZSZWYoayxrKSA9IHggPSBzcXJ0KHgpOworICAgICAgaWYgKGs+MCAmJiBycz4wKSBBMjEubm9hbGlhcygpIC09IEEyMCAqIEExMC5hZGpvaW50KCk7CisgICAgICBpZiAocnM+MCkgQTIxIC89IHg7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBJbmRleCBibG9ja2VkKE1hdHJpeFR5cGUmIG0pCisgIHsKKyAgICBlaWdlbl9hc3NlcnQobS5yb3dzKCk9PW0uY29scygpKTsKKyAgICBJbmRleCBzaXplID0gbS5yb3dzKCk7CisgICAgaWYoc2l6ZTwzMikKKyAgICAgIHJldHVybiB1bmJsb2NrZWQobSk7CisKKyAgICBJbmRleCBibG9ja1NpemUgPSBzaXplLzg7CisgICAgYmxvY2tTaXplID0gKGJsb2NrU2l6ZS8xNikqMTY7CisgICAgYmxvY2tTaXplID0gKHN0ZDo6bWluKSgoc3RkOjptYXgpKGJsb2NrU2l6ZSxJbmRleCg4KSksIEluZGV4KDEyOCkpOworCisgICAgZm9yIChJbmRleCBrPTA7IGs8c2l6ZTsgays9YmxvY2tTaXplKQorICAgIHsKKyAgICAgIC8vIHBhcnRpdGlvbiB0aGUgbWF0cml4OgorICAgICAgLy8gICAgICAgQTAwIHwgIC0gIHwgIC0KKyAgICAgIC8vIGx1ICA9IEExMCB8IEExMSB8ICAtCisgICAgICAvLyAgICAgICBBMjAgfCBBMjEgfCBBMjIKKyAgICAgIEluZGV4IGJzID0gKHN0ZDo6bWluKShibG9ja1NpemUsIHNpemUtayk7CisgICAgICBJbmRleCBycyA9IHNpemUgLSBrIC0gYnM7CisgICAgICBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gQTExKG0saywgICBrLCAgIGJzLGJzKTsKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYyxEeW5hbWljPiBBMjEobSxrK2JzLGssICAgcnMsYnMpOworICAgICAgQmxvY2s8TWF0cml4VHlwZSxEeW5hbWljLER5bmFtaWM+IEEyMihtLGsrYnMsayticyxycyxycyk7CisKKyAgICAgIEluZGV4IHJldDsKKyAgICAgIGlmKChyZXQ9dW5ibG9ja2VkKEExMSkpPj0wKSByZXR1cm4gaytyZXQ7CisgICAgICBpZihycz4wKSBBMTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxPblRoZVJpZ2h0PihBMjEpOworICAgICAgaWYocnM+MCkgQTIyLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKEEyMSx0eXBlbmFtZSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OkxpdGVyYWwoLTEpKTsgLy8gYm90dGxlbmVjaworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgorICBzdGF0aWMgSW5kZXggcmFua1VwZGF0ZShNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFZlY3RvclR5cGUmIHZlYywgY29uc3QgUmVhbFNjYWxhciYgc2lnbWEpCisgIHsKKyAgICByZXR1cm4gRWlnZW46OmludGVybmFsOjpsbHRfcmFua191cGRhdGVfbG93ZXIobWF0LCB2ZWMsIHNpZ21hKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgbGx0X2lucGxhY2U8U2NhbGFyLCBVcHBlcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHVuYmxvY2tlZChNYXRyaXhUeXBlJiBtYXQpCisgIHsKKyAgICBUcmFuc3Bvc2U8TWF0cml4VHlwZT4gbWF0dChtYXQpOworICAgIHJldHVybiBsbHRfaW5wbGFjZTxTY2FsYXIsIExvd2VyPjo6dW5ibG9ja2VkKG1hdHQpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGJsb2NrZWQoTWF0cml4VHlwZSYgbWF0KQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGx0X2lucGxhY2U8U2NhbGFyLCBMb3dlcj46OmJsb2NrZWQobWF0dCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgc3RhdGljIEluZGV4IHJhbmtVcGRhdGUoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IFJlYWxTY2FsYXImIHNpZ21hKQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGx0X2lucGxhY2U8U2NhbGFyLCBMb3dlcj46OnJhbmtVcGRhdGUobWF0dCwgdmVjLmNvbmp1Z2F0ZSgpLCBzaWdtYSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBMTFRfVHJhaXRzPE1hdHJpeFR5cGUsTG93ZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgTWF0cml4VHlwZSwgTG93ZXI+IE1hdHJpeEw7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIFVwcGVyPiBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhMKG0pOyB9CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4VSBnZXRVKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIE1hdHJpeFUobS5hZGpvaW50KCkpOyB9CisgIHN0YXRpYyBib29sIGlucGxhY2VfZGVjb21wb3NpdGlvbihNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiBsbHRfaW5wbGFjZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIExvd2VyPjo6YmxvY2tlZChtKT09LTE7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBMTFRfVHJhaXRzPE1hdHJpeFR5cGUsVXBwZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIExvd2VyPiBNYXRyaXhMOworICB0eXBlZGVmIGNvbnN0IFRyaWFuZ3VsYXJWaWV3PGNvbnN0IE1hdHJpeFR5cGUsIFVwcGVyPiBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhMKG0uYWRqb2ludCgpKTsgfQorICBzdGF0aWMgaW5saW5lIE1hdHJpeFUgZ2V0VShjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhVKG0pOyB9CisgIHN0YXRpYyBib29sIGlucGxhY2VfZGVjb21wb3NpdGlvbihNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiBsbHRfaW5wbGFjZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIFVwcGVyPjo6YmxvY2tlZChtKT09LTE7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogQ29tcHV0ZXMgLyByZWNvbXB1dGVzIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIEEgPSBMTF4qID0gVV4qVSBvZiBcYSBtYXRyaXgKKyAgKgorICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5vdXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KK0xMVDxNYXRyaXhUeXBlLF9VcExvPiYgTExUPE1hdHJpeFR5cGUsX1VwTG8+Ojpjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBhKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisKKyAgZWlnZW5fYXNzZXJ0KGEucm93cygpPT1hLmNvbHMoKSk7CisgIGNvbnN0IEluZGV4IHNpemUgPSBhLnJvd3MoKTsKKyAgbV9tYXRyaXgucmVzaXplKHNpemUsIHNpemUpOworICBtX21hdHJpeCA9IGEuZGVyaXZlZCgpOworCisgIC8vIENvbXB1dGUgbWF0cml4IEwxIG5vcm0gPSBtYXggYWJzIGNvbHVtbiBzdW0uCisgIG1fbDFfbm9ybSA9IFJlYWxTY2FsYXIoMCk7CisgIC8vIFRPRE8gbW92ZSB0aGlzIGNvZGUgdG8gU2VsZkFkam9pbnRWaWV3CisgIGZvciAoSW5kZXggY29sID0gMDsgY29sIDwgc2l6ZTsgKytjb2wpIHsKKyAgICBSZWFsU2NhbGFyIGFic19jb2xfc3VtOworICAgIGlmIChfVXBMbyA9PSBMb3dlcikKKyAgICAgIGFic19jb2xfc3VtID0gbV9tYXRyaXguY29sKGNvbCkudGFpbChzaXplIC0gY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKSArIG1fbWF0cml4LnJvdyhjb2wpLmhlYWQoY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKTsKKyAgICBlbHNlCisgICAgICBhYnNfY29sX3N1bSA9IG1fbWF0cml4LmNvbChjb2wpLmhlYWQoY29sKS50ZW1wbGF0ZSBscE5vcm08MT4oKSArIG1fbWF0cml4LnJvdyhjb2wpLnRhaWwoc2l6ZSAtIGNvbCkudGVtcGxhdGUgbHBOb3JtPDE+KCk7CisgICAgaWYgKGFic19jb2xfc3VtID4gbV9sMV9ub3JtKQorICAgICAgbV9sMV9ub3JtID0gYWJzX2NvbF9zdW07CisgIH0KKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICBib29sIG9rID0gVHJhaXRzOjppbnBsYWNlX2RlY29tcG9zaXRpb24obV9tYXRyaXgpOworICBtX2luZm8gPSBvayA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBQZXJmb3JtcyBhIHJhbmsgb25lIHVwZGF0ZSAob3IgZG93ZGF0ZSkgb2YgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbi4KKyAgKiBJZiBBID0gTExeKiBiZWZvcmUgdGhlIHJhbmsgb25lIHVwZGF0ZSwKKyAgKiB0aGVuIGFmdGVyIGl0IHdlIGhhdmUgTExeKiA9IEEgKyBzaWdtYSAqIHYgdl4qIHdoZXJlIFxhIHYgbXVzdCBiZSBhIHZlY3RvcgorICAqIG9mIHNhbWUgZGltZW5zaW9uLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CitMTFQ8X01hdHJpeFR5cGUsX1VwTG8+IExMVDxfTWF0cml4VHlwZSxfVXBMbz46OnJhbmtVcGRhdGUoY29uc3QgVmVjdG9yVHlwZSYgdiwgY29uc3QgUmVhbFNjYWxhciYgc2lnbWEpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoVmVjdG9yVHlwZSk7CisgIGVpZ2VuX2Fzc2VydCh2LnNpemUoKT09bV9tYXRyaXguY29scygpKTsKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCk7CisgIGlmKGludGVybmFsOjpsbHRfaW5wbGFjZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIFVwTG8+OjpyYW5rVXBkYXRlKG1fbWF0cml4LHYsc2lnbWEpPj0wKQorICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICBlbHNlCisgICAgbV9pbmZvID0gU3VjY2VzczsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+Cit2b2lkIExMVDxfTWF0cml4VHlwZSxfVXBMbz46Ol9zb2x2ZV9pbXBsKGNvbnN0IFJoc1R5cGUgJnJocywgRHN0VHlwZSAmZHN0KSBjb25zdAoreworICBkc3QgPSByaHM7CisgIHNvbHZlSW5QbGFjZShkc3QpOworfQorI2VuZGlmCisKKy8qKiBcaW50ZXJuYWwgdXNlIHggPSBsbHRfb2JqZWN0LnNvbHZlKHgpOworICAqCisgICogVGhpcyBpcyB0aGUgXGVtIGluLXBsYWNlIHZlcnNpb24gb2Ygc29sdmUoKS4KKyAgKgorICAqIFxwYXJhbSBiQW5kWCByZXByZXNlbnRzIGJvdGggdGhlIHJpZ2h0LWhhbmQgc2lkZSBtYXRyaXggYiBhbmQgcmVzdWx0IHguCisgICoKKyAgKiBUaGlzIHZlcnNpb24gYXZvaWRzIGEgY29weSB3aGVuIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIgaXMgbm90IG5lZWRlZCBhbnltb3JlLgorICAqCisgICogXHNhIExMVDo6c29sdmUoKSwgTWF0cml4QmFzZTo6bGx0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIExMVDxNYXRyaXhUeXBlLF9VcExvPjo6c29sdmVJblBsYWNlKE1hdHJpeEJhc2U8RGVyaXZlZD4gJmJBbmRYKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iQW5kWC5yb3dzKCkpOworICBtYXRyaXhMKCkuc29sdmVJblBsYWNlKGJBbmRYKTsKKyAgbWF0cml4VSgpLnNvbHZlSW5QbGFjZShiQW5kWCk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNvbXBvc2l0aW9uLAorICogaS5lLiwgaXQgcmV0dXJucyB0aGUgcHJvZHVjdDogTCBMXiouCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBkZWJ1ZyBwdXJwb3NlLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IF9VcExvPgorTWF0cml4VHlwZSBMTFQ8TWF0cml4VHlwZSxfVXBMbz46OnJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICByZXR1cm4gbWF0cml4TCgpICogbWF0cml4TCgpLmFkam9pbnQoKS50b0RlbnNlTWF0cml4KCk7Cit9CisKKy8qKiBcY2hvbGVza3lfbW9kdWxlCisgICogXHJldHVybnMgdGhlIExMVCBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzCisgICogXHNhIFNlbGZBZGpvaW50Vmlldzo6bGx0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgTExUPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6bGx0KCkgY29uc3QKK3sKKyAgcmV0dXJuIExMVDxQbGFpbk9iamVjdD4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxjaG9sZXNreV9tb2R1bGUKKyAgKiBccmV0dXJucyB0aGUgTExUIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMKKyAgKiBcc2EgU2VsZkFkam9pbnRWaWV3OjpsbHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+CitpbmxpbmUgY29uc3QgTExUPHR5cGVuYW1lIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6UGxhaW5PYmplY3QsIFVwTG8+CitTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSwgVXBMbz46OmxsdCgpIGNvbnN0Cit7CisgIHJldHVybiBMTFQ8UGxhaW5PYmplY3QsVXBMbz4obV9tYXRyaXgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xMVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbGVza3kvTExUX0xBUEFDS0UuaCBiL0VpZ2VuL3NyYy9DaG9sZXNreS9MTFRfTEFQQUNLRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjQ4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ2hvbGVza3kvTExUX0xBUEFDS0UuaApAQCAtMCwwICsxLDk5IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gTEFQQUNLZQorICogICAgIExMdCBkZWNvbXBvc2l0aW9uIGJhc2VkIG9uIExBUEFDS0VfP3BvdHJmIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0xMVF9MQVBBQ0tFX0gKKyNkZWZpbmUgRUlHRU5fTExUX0xBUEFDS0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgbGFwYWNrZV9sbHQ7CisKKyNkZWZpbmUgRUlHRU5fTEFQQUNLRV9MTFQoRUlHVFlQRSwgQkxBU1RZUEUsIExBUEFDS0VfUFJFRklYKSBcCit0ZW1wbGF0ZTw+IHN0cnVjdCBsYXBhY2tlX2xsdDxFSUdUWVBFPiBcCit7IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gXAorICBzdGF0aWMgaW5saW5lIEluZGV4IHBvdHJmKE1hdHJpeFR5cGUmIG0sIGNoYXIgdXBsbykgXAorICB7IFwKKyAgICBsYXBhY2tfaW50IG1hdHJpeF9vcmRlcjsgXAorICAgIGxhcGFja19pbnQgc2l6ZSwgbGRhLCBpbmZvLCBTdG9yYWdlT3JkZXI7IFwKKyAgICBFSUdUWVBFKiBhOyBcCisgICAgZWlnZW5fYXNzZXJ0KG0ucm93cygpPT1tLmNvbHMoKSk7IFwKKyAgICAvKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgP3BvdHJmICovIFwKKyAgICBzaXplID0gY29udmVydF9pbmRleDxsYXBhY2tfaW50PihtLnJvd3MoKSk7IFwKKyAgICBTdG9yYWdlT3JkZXIgPSBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Sb3dNYWpvcjpDb2xNYWpvcjsgXAorICAgIG1hdHJpeF9vcmRlciA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBMQVBBQ0tfUk9XX01BSk9SIDogTEFQQUNLX0NPTF9NQUpPUjsgXAorICAgIGEgPSAmKG0uY29lZmZSZWYoMCwwKSk7IFwKKyAgICBsZGEgPSBjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG0ub3V0ZXJTdHJpZGUoKSk7IFwKK1wKKyAgICBpbmZvID0gTEFQQUNLRV8jI0xBUEFDS0VfUFJFRklYIyNwb3RyZiggbWF0cml4X29yZGVyLCB1cGxvLCBzaXplLCAoQkxBU1RZUEUqKWEsIGxkYSApOyBcCisgICAgaW5mbyA9IChpbmZvPT0wKSA/IC0xIDogaW5mbz4wID8gaW5mby0xIDogc2l6ZTsgXAorICAgIHJldHVybiBpbmZvOyBcCisgIH0gXAorfTsgXAordGVtcGxhdGU8PiBzdHJ1Y3QgbGx0X2lucGxhY2U8RUlHVFlQRSwgTG93ZXI+IFwKK3sgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBcCisgIHN0YXRpYyBJbmRleCBibG9ja2VkKE1hdHJpeFR5cGUmIG0pIFwKKyAgeyBcCisgICAgcmV0dXJuIGxhcGFja2VfbGx0PEVJR1RZUEU+Ojpwb3RyZihtLCAnTCcpOyBcCisgIH0gXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPiBcCisgIHN0YXRpYyBJbmRleCByYW5rVXBkYXRlKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVmVjdG9yVHlwZSYgdmVjLCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBzaWdtYSkgXAorICB7IHJldHVybiBFaWdlbjo6aW50ZXJuYWw6OmxsdF9yYW5rX3VwZGF0ZV9sb3dlcihtYXQsIHZlYywgc2lnbWEpOyB9IFwKK307IFwKK3RlbXBsYXRlPD4gc3RydWN0IGxsdF9pbnBsYWNlPEVJR1RZUEUsIFVwcGVyPiBcCit7IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gXAorICBzdGF0aWMgSW5kZXggYmxvY2tlZChNYXRyaXhUeXBlJiBtKSBcCisgIHsgXAorICAgIHJldHVybiBsYXBhY2tlX2xsdDxFSUdUWVBFPjo6cG90cmYobSwgJ1UnKTsgXAorICB9IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4gXAorICBzdGF0aWMgSW5kZXggcmFua1VwZGF0ZShNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFZlY3RvclR5cGUmIHZlYywgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgc2lnbWEpIFwKKyAgeyBcCisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsgXAorICAgIHJldHVybiBsbHRfaW5wbGFjZTxFSUdUWVBFLCBMb3dlcj46OnJhbmtVcGRhdGUobWF0dCwgdmVjLmNvbmp1Z2F0ZSgpLCBzaWdtYSk7IFwKKyAgfSBcCit9OworCitFSUdFTl9MQVBBQ0tFX0xMVChkb3VibGUsIGRvdWJsZSwgZCkKK0VJR0VOX0xBUEFDS0VfTExUKGZsb2F0LCBmbG9hdCwgcykKK0VJR0VOX0xBUEFDS0VfTExUKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIHopCitFSUdFTl9MQVBBQ0tFX0xMVChzY29tcGxleCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQsIGMpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xMVF9MQVBBQ0tFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9DaG9sbW9kU3VwcG9ydC9DaG9sbW9kU3VwcG9ydC5oIGIvRWlnZW4vc3JjL0Nob2xtb2RTdXBwb3J0L0Nob2xtb2RTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxOTcyMAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9DaG9sbW9kU3VwcG9ydC9DaG9sbW9kU3VwcG9ydC5oCkBAIC0wLDAgKzEsNjM5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DSE9MTU9EU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX0NIT0xNT0RTVVBQT1JUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGNob2xtb2RfY29uZmlndXJlX21hdHJpeDsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY2hvbG1vZF9jb25maWd1cmVfbWF0cml4PGRvdWJsZT4geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaG9sbW9kVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKENob2xtb2RUeXBlJiBtYXQpIHsKKyAgICBtYXQueHR5cGUgPSBDSE9MTU9EX1JFQUw7CisgICAgbWF0LmR0eXBlID0gQ0hPTE1PRF9ET1VCTEU7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNob2xtb2RfY29uZmlndXJlX21hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hvbG1vZFR5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihDaG9sbW9kVHlwZSYgbWF0KSB7CisgICAgbWF0Lnh0eXBlID0gQ0hPTE1PRF9DT01QTEVYOworICAgIG1hdC5kdHlwZSA9IENIT0xNT0RfRE9VQkxFOworICB9Cit9OworCisvLyBPdGhlciBzY2FsYXIgdHlwZXMgYXJlIG5vdCB5ZXQgc3VwcG90cmVkIGJ5IENob2xtb2QKKy8vIHRlbXBsYXRlPD4gc3RydWN0IGNob2xtb2RfY29uZmlndXJlX21hdHJpeDxmbG9hdD4geworLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaG9sbW9kVHlwZT4KKy8vICAgc3RhdGljIHZvaWQgcnVuKENob2xtb2RUeXBlJiBtYXQpIHsKKy8vICAgICBtYXQueHR5cGUgPSBDSE9MTU9EX1JFQUw7CisvLyAgICAgbWF0LmR0eXBlID0gQ0hPTE1PRF9TSU5HTEU7CisvLyAgIH0KKy8vIH07CisvLworLy8gdGVtcGxhdGU8PiBzdHJ1Y3QgY2hvbG1vZF9jb25maWd1cmVfbWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4gPiB7CisvLyAgIHRlbXBsYXRlPHR5cGVuYW1lIENob2xtb2RUeXBlPgorLy8gICBzdGF0aWMgdm9pZCBydW4oQ2hvbG1vZFR5cGUmIG1hdCkgeworLy8gICAgIG1hdC54dHlwZSA9IENIT0xNT0RfQ09NUExFWDsKKy8vICAgICBtYXQuZHR5cGUgPSBDSE9MTU9EX1NJTkdMRTsKKy8vICAgfQorLy8gfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFdyYXBzIHRoZSBFaWdlbiBzcGFyc2UgbWF0cml4IFxhIG1hdCBpbnRvIGEgQ2hvbG1vZCBzcGFyc2UgbWF0cml4IG9iamVjdC4KKyAgKiBOb3RlIHRoYXQgdGhlIGRhdGEgYXJlIHNoYXJlZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK2Nob2xtb2Rfc3BhcnNlIHZpZXdBc0Nob2xtb2QoUmVmPFNwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+ID4gbWF0KQoreworICBjaG9sbW9kX3NwYXJzZSByZXM7CisgIHJlcy5uem1heCAgID0gbWF0Lm5vblplcm9zKCk7CisgIHJlcy5ucm93ICAgID0gbWF0LnJvd3MoKTsKKyAgcmVzLm5jb2wgICAgPSBtYXQuY29scygpOworICByZXMucCAgICAgICA9IG1hdC5vdXRlckluZGV4UHRyKCk7CisgIHJlcy5pICAgICAgID0gbWF0LmlubmVySW5kZXhQdHIoKTsKKyAgcmVzLnggICAgICAgPSBtYXQudmFsdWVQdHIoKTsKKyAgcmVzLnogICAgICAgPSAwOworICByZXMuc29ydGVkICA9IDE7CisgIGlmKG1hdC5pc0NvbXByZXNzZWQoKSkKKyAgeworICAgIHJlcy5wYWNrZWQgID0gMTsKKyAgICByZXMubnogPSAwOworICB9CisgIGVsc2UKKyAgeworICAgIHJlcy5wYWNrZWQgID0gMDsKKyAgICByZXMubnogPSBtYXQuaW5uZXJOb25aZXJvUHRyKCk7CisgIH0KKworICByZXMuZHR5cGUgICA9IDA7CisgIHJlcy5zdHlwZSAgID0gLTE7CisgIAorICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8X1N0b3JhZ2VJbmRleCxpbnQ+Ojp2YWx1ZSkKKyAgeworICAgIHJlcy5pdHlwZSA9IENIT0xNT0RfSU5UOworICB9CisgIGVsc2UgaWYgKGludGVybmFsOjppc19zYW1lPF9TdG9yYWdlSW5kZXgsbG9uZz46OnZhbHVlKQorICB7CisgICAgcmVzLml0eXBlID0gQ0hPTE1PRF9MT05HOworICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiSW5kZXggdHlwZSBub3Qgc3VwcG9ydGVkIHlldCIpOworICB9CisKKyAgLy8gc2V0dXAgcmVzLnh0eXBlCisgIGludGVybmFsOjpjaG9sbW9kX2NvbmZpZ3VyZV9tYXRyaXg8X1NjYWxhcj46OnJ1bihyZXMpOworICAKKyAgcmVzLnN0eXBlID0gMDsKKyAgCisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgorY29uc3QgY2hvbG1vZF9zcGFyc2Ugdmlld0FzQ2hvbG1vZChjb25zdCBTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfSW5kZXg+JiBtYXQpCit7CisgIGNob2xtb2Rfc3BhcnNlIHJlcyA9IHZpZXdBc0Nob2xtb2QoUmVmPFNwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4gPihtYXQuY29uc3RfY2FzdF9kZXJpdmVkKCkpKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+Citjb25zdCBjaG9sbW9kX3NwYXJzZSB2aWV3QXNDaG9sbW9kKGNvbnN0IFNwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4mIG1hdCkKK3sKKyAgY2hvbG1vZF9zcGFyc2UgcmVzID0gdmlld0FzQ2hvbG1vZChSZWY8U3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX0luZGV4PiA+KG1hdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSkpOworICByZXR1cm4gcmVzOworfQorCisvKiogUmV0dXJucyBhIHZpZXcgb2YgdGhlIEVpZ2VuIHNwYXJzZSBtYXRyaXggXGEgbWF0IGFzIENob2xtb2Qgc3BhcnNlIG1hdHJpeC4KKyAgKiBUaGUgZGF0YSBhcmUgbm90IGNvcGllZCBidXQgc2hhcmVkLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXgsIHVuc2lnbmVkIGludCBVcExvPgorY2hvbG1vZF9zcGFyc2Ugdmlld0FzQ2hvbG1vZChjb25zdCBTcGFyc2VTZWxmQWRqb2ludFZpZXc8Y29uc3QgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX0luZGV4PiwgVXBMbz4mIG1hdCkKK3sKKyAgY2hvbG1vZF9zcGFyc2UgcmVzID0gdmlld0FzQ2hvbG1vZChSZWY8U3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX0luZGV4PiA+KG1hdC5tYXRyaXgoKS5jb25zdF9jYXN0X2Rlcml2ZWQoKSkpOworICAKKyAgaWYoVXBMbz09VXBwZXIpIHJlcy5zdHlwZSA9ICAxOworICBpZihVcExvPT1Mb3dlcikgcmVzLnN0eXBlID0gLTE7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIFJldHVybnMgYSB2aWV3IG9mIHRoZSBFaWdlbiBcYiBkZW5zZSBtYXRyaXggXGEgbWF0IGFzIENob2xtb2QgZGVuc2UgbWF0cml4LgorICAqIFRoZSBkYXRhIGFyZSBub3QgY29waWVkIGJ1dCBzaGFyZWQuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2hvbG1vZF9kZW5zZSB2aWV3QXNDaG9sbW9kKE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUyk7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKworICBjaG9sbW9kX2RlbnNlIHJlczsKKyAgcmVzLm5yb3cgICA9IG1hdC5yb3dzKCk7CisgIHJlcy5uY29sICAgPSBtYXQuY29scygpOworICByZXMubnptYXggID0gcmVzLm5yb3cgKiByZXMubmNvbDsKKyAgcmVzLmQgICAgICA9IERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSA/IG1hdC5kZXJpdmVkKCkuc2l6ZSgpIDogbWF0LmRlcml2ZWQoKS5vdXRlclN0cmlkZSgpOworICByZXMueCAgICAgID0gKHZvaWQqKShtYXQuZGVyaXZlZCgpLmRhdGEoKSk7CisgIHJlcy56ICAgICAgPSAwOworCisgIGludGVybmFsOjpjaG9sbW9kX2NvbmZpZ3VyZV9tYXRyaXg8U2NhbGFyPjo6cnVuKHJlcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIFJldHVybnMgYSB2aWV3IG9mIHRoZSBDaG9sbW9kIHNwYXJzZSBtYXRyaXggXGEgY20gYXMgYW4gRWlnZW4gc3BhcnNlIG1hdHJpeC4KKyAgKiBUaGUgZGF0YSBhcmUgbm90IGNvcGllZCBidXQgc2hhcmVkLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3MsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK01hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3MsU3RvcmFnZUluZGV4PiB2aWV3QXNFaWdlbihjaG9sbW9kX3NwYXJzZSYgY20pCit7CisgIHJldHVybiBNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzLFN0b3JhZ2VJbmRleD4KKyAgICAgICAgIChjbS5ucm93LCBjbS5uY29sLCBzdGF0aWNfY2FzdDxTdG9yYWdlSW5kZXgqPihjbS5wKVtjbS5uY29sXSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxTdG9yYWdlSW5kZXgqPihjbS5wKSwgc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oY20uaSksc3RhdGljX2Nhc3Q8U2NhbGFyKj4oY20ueCkgKTsKK30KKworZW51bSBDaG9sbW9kTW9kZSB7CisgIENob2xtb2RBdXRvLCBDaG9sbW9kU2ltcGxpY2lhbExMdCwgQ2hvbG1vZFN1cGVybm9kYWxMTHQsIENob2xtb2RMREx0Cit9OworCisKKy8qKiBcaW5ncm91cCBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgQ2hvbG1vZEJhc2UKKyAgKiBcYnJpZWYgVGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBkaXJlY3QgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBvZiBDaG9sbW9kCisgICogXHNhIGNsYXNzIENob2xtb2RTdXBlcm5vZGFsTExULCBjbGFzcyBDaG9sbW9kU2ltcGxpY2lhbExETFQsIGNsYXNzIENob2xtb2RTaW1wbGljaWFsTExUCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgQ2hvbG1vZEJhc2UgOiBwdWJsaWMgU3BhcnNlU29sdmVyQmFzZTxEZXJpdmVkPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeFR5cGUgQ2hvbE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgIHB1YmxpYzoKKworICAgIENob2xtb2RCYXNlKCkKKyAgICAgIDogbV9jaG9sbW9kRmFjdG9yKDApLCBtX2luZm8oU3VjY2VzcyksIG1fZmFjdG9yaXphdGlvbklzT2soZmFsc2UpLCBtX2FuYWx5c2lzSXNPayhmYWxzZSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxkb3VibGUsUmVhbFNjYWxhcj46OnZhbHVlKSwgQ0hPTE1PRF9TVVBQT1JUU19ET1VCTEVfUFJFQ0lTSU9OX09OTFkpOworICAgICAgbV9zaGlmdE9mZnNldFswXSA9IG1fc2hpZnRPZmZzZXRbMV0gPSAwLjA7CisgICAgICBjaG9sbW9kX3N0YXJ0KCZtX2Nob2xtb2QpOworICAgIH0KKworICAgIGV4cGxpY2l0IENob2xtb2RCYXNlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9jaG9sbW9kRmFjdG9yKDApLCBtX2luZm8oU3VjY2VzcyksIG1fZmFjdG9yaXphdGlvbklzT2soZmFsc2UpLCBtX2FuYWx5c2lzSXNPayhmYWxzZSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxkb3VibGUsUmVhbFNjYWxhcj46OnZhbHVlKSwgQ0hPTE1PRF9TVVBQT1JUU19ET1VCTEVfUFJFQ0lTSU9OX09OTFkpOworICAgICAgbV9zaGlmdE9mZnNldFswXSA9IG1fc2hpZnRPZmZzZXRbMV0gPSAwLjA7CisgICAgICBjaG9sbW9kX3N0YXJ0KCZtX2Nob2xtb2QpOworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIH5DaG9sbW9kQmFzZSgpCisgICAgeworICAgICAgaWYobV9jaG9sbW9kRmFjdG9yKQorICAgICAgICBjaG9sbW9kX2ZyZWVfZmFjdG9yKCZtX2Nob2xtb2RGYWN0b3IsICZtX2Nob2xtb2QpOworICAgICAgY2hvbG1vZF9maW5pc2goJm1fY2hvbG1vZCk7CisgICAgfQorICAgIAorICAgIGlubGluZSBTdG9yYWdlSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleCwgSW5kZXg+KG1fY2hvbG1vZEZhY3Rvci0+bik7IH0KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxTdG9yYWdlSW5kZXgsIEluZGV4PihtX2Nob2xtb2RGYWN0b3ItPm4pOyB9CisgICAgCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIC8qKiBDb21wdXRlcyB0aGUgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4ICovCisgICAgRGVyaXZlZCYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgYW5hbHl6ZVBhdHRlcm4obWF0cml4KTsKKyAgICAgIGZhY3Rvcml6ZShtYXRyaXgpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcnNpdHkgcGF0dGVybiBvZiBcYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHNvbHZpbmcgZm9yIHNldmVyYWwgcHJvYmxlbXMgaGF2aW5nIHRoZSBzYW1lIHN0cnVjdHVyZS4KKyAgICAgICogCisgICAgICAqIFxzYSBmYWN0b3JpemUoKQorICAgICAgKi8KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBpZihtX2Nob2xtb2RGYWN0b3IpCisgICAgICB7CisgICAgICAgIGNob2xtb2RfZnJlZV9mYWN0b3IoJm1fY2hvbG1vZEZhY3RvciwgJm1fY2hvbG1vZCk7CisgICAgICAgIG1fY2hvbG1vZEZhY3RvciA9IDA7CisgICAgICB9CisgICAgICBjaG9sbW9kX3NwYXJzZSBBID0gdmlld0FzQ2hvbG1vZChtYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCkpOworICAgICAgbV9jaG9sbW9kRmFjdG9yID0gY2hvbG1vZF9hbmFseXplKCZBLCAmbV9jaG9sbW9kKTsKKyAgICAgIAorICAgICAgdGhpcy0+bV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIHRoaXMtPm1faW5mbyA9IFN1Y2Nlc3M7CisgICAgICBtX2FuYWx5c2lzSXNPayA9IHRydWU7CisgICAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIG51bWVyaWMgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhlIGdpdmVuIG1hdHJpeCBtdXN0IGhhdmUgdGhlIHNhbWUgc3BhcnNpdHkgcGF0dGVybiBhcyB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiWW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgICAgICBjaG9sbW9kX3NwYXJzZSBBID0gdmlld0FzQ2hvbG1vZChtYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCkpOworICAgICAgY2hvbG1vZF9mYWN0b3JpemVfcCgmQSwgbV9zaGlmdE9mZnNldCwgMCwgMCwgbV9jaG9sbW9kRmFjdG9yLCAmbV9jaG9sbW9kKTsKKworICAgICAgLy8gSWYgdGhlIGZhY3Rvcml6YXRpb24gZmFpbGVkLCBtaW5vciBpcyB0aGUgY29sdW1uIGF0IHdoaWNoIGl0IGRpZC4gT24gc3VjY2VzcyBtaW5vciA9PSBuLgorICAgICAgdGhpcy0+bV9pbmZvID0gKG1fY2hvbG1vZEZhY3Rvci0+bWlub3IgPT0gbV9jaG9sbW9kRmFjdG9yLT5uID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlKTsKKyAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKiogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQ2hvbG1vZCdzIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHRvIGdldCBhIGZ1bGwgY29udHJvbCBvdmVyIHRoZSBwZXJmb3JtZWQgb3BlcmF0aW9ucy4KKyAgICAgKiAgU2VlIHRoZSBDaG9sbW9kIHVzZXIgZ3VpZGUgZm9yIGRldGFpbHMuICovCisgICAgY2hvbG1vZF9jb21tb24mIGNob2xtb2QoKSB7IHJldHVybiBtX2Nob2xtb2Q7IH0KKyAgICAKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBjb25zdCBJbmRleCBzaXplID0gbV9jaG9sbW9kRmFjdG9yLT5uOworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHNpemUpOworICAgICAgZWlnZW5fYXNzZXJ0KHNpemU9PWIucm93cygpKTsKKyAgICAgIAorICAgICAgLy8gQ2hvbG1vZCBuZWVkcyBjb2x1bW4tbWFqb3Igc3RvYXJnZSB3aXRob3V0IGlubmVyLXN0cmlkZSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgUmVmLgorICAgICAgUmVmPGNvbnN0IE1hdHJpeDx0eXBlbmFtZSBSaHM6OlNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+ID4gYl9yZWYoYi5kZXJpdmVkKCkpOworCisgICAgICBjaG9sbW9kX2RlbnNlIGJfY2QgPSB2aWV3QXNDaG9sbW9kKGJfcmVmKTsKKyAgICAgIGNob2xtb2RfZGVuc2UqIHhfY2QgPSBjaG9sbW9kX3NvbHZlKENIT0xNT0RfQSwgbV9jaG9sbW9kRmFjdG9yLCAmYl9jZCwgJm1fY2hvbG1vZCk7CisgICAgICBpZigheF9jZCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+bV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIFRPRE8gb3B0aW1pemUgdGhpcyBjb3B5IGJ5IHN3YXBwaW5nIHdoZW4gcG9zc2libGUgKGJlIGNhcmVmdWwgd2l0aCBhbGlnbm1lbnQsIGV0Yy4pCisgICAgICBkZXN0ID0gTWF0cml4PFNjYWxhcixEZXN0OjpSb3dzQXRDb21waWxlVGltZSxEZXN0OjpDb2xzQXRDb21waWxlVGltZT46Ok1hcChyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHhfY2QtPngpLGIucm93cygpLGIuY29scygpKTsKKyAgICAgIGNob2xtb2RfZnJlZV9kZW5zZSgmeF9jZCwgJm1fY2hvbG1vZCk7CisgICAgfQorICAgIAorICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNEZXJpdmVkLCB0eXBlbmFtZSBEZXN0RGVyaXZlZD4KKyAgICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzRGVyaXZlZD4gJmIsIFNwYXJzZU1hdHJpeEJhc2U8RGVzdERlcml2ZWQ+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBjb25zdCBJbmRleCBzaXplID0gbV9jaG9sbW9kRmFjdG9yLT5uOworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHNpemUpOworICAgICAgZWlnZW5fYXNzZXJ0KHNpemU9PWIucm93cygpKTsKKworICAgICAgLy8gbm90ZTogY3Mgc3RhbmRzIGZvciBDaG9sbW9kIFNwYXJzZQorICAgICAgUmVmPFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSaHNEZXJpdmVkOjpTY2FsYXIsQ29sTWFqb3IsdHlwZW5hbWUgUmhzRGVyaXZlZDo6U3RvcmFnZUluZGV4PiA+IGJfcmVmKGIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgICAgY2hvbG1vZF9zcGFyc2UgYl9jcyA9IHZpZXdBc0Nob2xtb2QoYl9yZWYpOworICAgICAgY2hvbG1vZF9zcGFyc2UqIHhfY3MgPSBjaG9sbW9kX3Nwc29sdmUoQ0hPTE1PRF9BLCBtX2Nob2xtb2RGYWN0b3IsICZiX2NzLCAmbV9jaG9sbW9kKTsKKyAgICAgIGlmKCF4X2NzKQorICAgICAgeworICAgICAgICB0aGlzLT5tX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gVE9ETyBvcHRpbWl6ZSB0aGlzIGNvcHkgYnkgc3dhcHBpbmcgd2hlbiBwb3NzaWJsZSAoYmUgY2FyZWZ1bCB3aXRoIGFsaWdubWVudCwgZXRjLikKKyAgICAgIGRlc3QuZGVyaXZlZCgpID0gdmlld0FzRWlnZW48dHlwZW5hbWUgRGVzdERlcml2ZWQ6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBEZXN0RGVyaXZlZDo6U3RvcmFnZUluZGV4PigqeF9jcyk7CisgICAgICBjaG9sbW9kX2ZyZWVfc3BhcnNlKCZ4X2NzLCAmbV9jaG9sbW9kKTsKKyAgICB9CisgICAgI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgCisgICAgCisgICAgLyoqIFNldHMgdGhlIHNoaWZ0IHBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50cyBkdXJpbmcgdGhlIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uLgorICAgICAgKgorICAgICAgKiBEdXJpbmcgdGhlIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uLCBhbiBvZmZzZXQgdGVybSBpcyBhZGRlZCB0byB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzOlxuCisgICAgICAqIFxjIGRfaWkgPSBcYSBvZmZzZXQgKyBcYyBkX2lpCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGlzIFxhIG9mZnNldD0wLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAgICovCisgICAgRGVyaXZlZCYgc2V0U2hpZnQoY29uc3QgUmVhbFNjYWxhciYgb2Zmc2V0KQorICAgIHsKKyAgICAgIG1fc2hpZnRPZmZzZXRbMF0gPSBkb3VibGUob2Zmc2V0KTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgIAorICAgIC8qKiBccmV0dXJucyB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIHVuZGVybHlpbmcgbWF0cml4IGZyb20gdGhlIGN1cnJlbnQgZmFjdG9yaXphdGlvbiAqLworICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjpleHA7CisgICAgICByZXR1cm4gZXhwKGxvZ0RldGVybWluYW50KCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbG9nIGRldGVybWluYW50IG9mIHRoZSB1bmRlcmx5aW5nIG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IGZhY3Rvcml6YXRpb24gKi8KKyAgICBTY2FsYXIgbG9nRGV0ZXJtaW5hbnQoKSBjb25zdAorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6bG9nOworICAgICAgdXNpbmcgbnVtZXh0OjpyZWFsOworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBzb2x2aW5nLCB5b3UgbXVzdCBmaXJzdCBjYWxsIGVpdGhlciBjb21wdXRlKCkgb3Igc3ltYm9saWMoKS9udW1lcmljKCkiKTsKKworICAgICAgUmVhbFNjYWxhciBsb2dEZXQgPSAwOworICAgICAgU2NhbGFyICp4ID0gc3RhdGljX2Nhc3Q8U2NhbGFyKj4obV9jaG9sbW9kRmFjdG9yLT54KTsKKyAgICAgIGlmIChtX2Nob2xtb2RGYWN0b3ItPmlzX3N1cGVyKQorICAgICAgeworICAgICAgICAvLyBTdXBlcm5vZGFsIGZhY3Rvcml6YXRpb24gc3RvcmVkIGFzIGEgcGFja2VkIGxpc3Qgb2YgZGVuc2UgY29sdW1uLW1ham9yIGJsb2NzLAorICAgICAgICAvLyBhcyBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgLy8gc3VwZXJba10gPT0gaW5kZXggb2YgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgai10aCBzdXBlciBub2RlCisgICAgICAgIFN0b3JhZ2VJbmRleCAqc3VwZXIgPSBzdGF0aWNfY2FzdDxTdG9yYWdlSW5kZXgqPihtX2Nob2xtb2RGYWN0b3ItPnN1cGVyKTsKKyAgICAgICAgLy8gcGlba10gPT0gb2Zmc2V0IHRvIHRoZSBkZXNjcmlwdGlvbiBvZiByb3cgaW5kaWNlcworICAgICAgICBTdG9yYWdlSW5kZXggKnBpID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4obV9jaG9sbW9kRmFjdG9yLT5waSk7CisgICAgICAgIC8vIHB4W2tdID09IG9mZnNldCB0byB0aGUgcmVzcGVjdGl2ZSBkZW5zZSBibG9jaworICAgICAgICBTdG9yYWdlSW5kZXggKnB4ID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4obV9jaG9sbW9kRmFjdG9yLT5weCk7CisKKyAgICAgICAgSW5kZXggbmJfc3VwZXJfbm9kZXMgPSBtX2Nob2xtb2RGYWN0b3ItPm5zdXBlcjsKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGsgPCBuYl9zdXBlcl9ub2RlczsgKytrKQorICAgICAgICB7CisgICAgICAgICAgU3RvcmFnZUluZGV4IG5jb2xzID0gc3VwZXJbayArIDFdIC0gc3VwZXJba107CisgICAgICAgICAgU3RvcmFnZUluZGV4IG5yb3dzID0gcGlbayArIDFdIC0gcGlba107CisKKyAgICAgICAgICBNYXA8Y29uc3QgQXJyYXk8U2NhbGFyLDEsRHluYW1pYz4sIDAsIElubmVyU3RyaWRlPD4gPiBzayh4ICsgcHhba10sIG5jb2xzLCBJbm5lclN0cmlkZTw+KG5yb3dzKzEpKTsKKyAgICAgICAgICBsb2dEZXQgKz0gc2sucmVhbCgpLmxvZygpLnN1bSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFNpbXBsaWNpYWwgZmFjdG9yaXphdGlvbiBzdG9yZWQgYXMgc3RhbmRhcmQgQ1NDIG1hdHJpeC4KKyAgICAgICAgU3RvcmFnZUluZGV4ICpwID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4obV9jaG9sbW9kRmFjdG9yLT5wKTsKKyAgICAgICAgSW5kZXggc2l6ZSA9IG1fY2hvbG1vZEZhY3Rvci0+bjsKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGs8c2l6ZTsgKytrKQorICAgICAgICAgIGxvZ0RldCArPSBsb2cocmVhbCggeFtwW2tdXSApKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX2Nob2xtb2RGYWN0b3ItPmlzX2xsKQorICAgICAgICBsb2dEZXQgKj0gMi4wOworICAgICAgcmV0dXJuIGxvZ0RldDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtPgorICAgIHZvaWQgZHVtcE1lbW9yeShTdHJlYW0mIC8qcyovKQorICAgIHt9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBtdXRhYmxlIGNob2xtb2RfY29tbW9uIG1fY2hvbG1vZDsKKyAgICBjaG9sbW9kX2ZhY3RvciogbV9jaG9sbW9kRmFjdG9yOworICAgIGRvdWJsZSBtX3NoaWZ0T2Zmc2V0WzJdOworICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBpbnQgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBpbnQgbV9hbmFseXNpc0lzT2s7Cit9OworCisvKiogXGluZ3JvdXAgQ2hvbG1vZFN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIENob2xtb2RTaW1wbGljaWFsTExUCisgICogXGJyaWVmIEEgc2ltcGxpY2lhbCBkaXJlY3QgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc2ltcGxpY2lhbCBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgQ2hvbG1vZCBsaWJyYXJ5LgorICAqIFRoaXMgc2ltcGxpY2lhbCB2YXJpYW50IGlzIGVxdWl2YWxlbnQgdG8gRWlnZW4ncyBidWlsdC1pbiBTaW1wbGljaWFsTExUIGNsYXNzLiBUaGVyZWZvcmUsIGl0IGhhcyBsaXR0bGUgcHJhY3RpY2FsIGludGVyZXN0LgorICAqIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzZWxmYWRqb2ludCBhbmQgcG9zaXRpdmUgZGVmaW5pdGUuIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIKKyAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBUaGlzIGNsYXNzIHN1cHBvcnRzIGFsbCBraW5kIG9mIFNwYXJzZU1hdHJpeDw+OiByb3cgb3IgY29sdW1uIG1ham9yOyB1cHBlciwgbG93ZXIsIG9yIGJvdGg7IGNvbXByZXNzZWQgb3Igbm9uIGNvbXByZXNzZWQuCisgICoKKyAgKiBcd2FybmluZyBPbmx5IGRvdWJsZSBwcmVjaXNpb24gcmVhbCBhbmQgY29tcGxleCBzY2FsYXIgdHlwZXMgYXJlIHN1cHBvcnRlZCBieSBDaG9sbW9kLgorICAqCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VTb2x2ZXJDb25jZXB0LCBjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVCwgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyPgorY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMTFQgOiBwdWJsaWMgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kU2ltcGxpY2lhbExMVDxfTWF0cml4VHlwZSwgX1VwTG8+ID4KK3sKKyAgICB0eXBlZGVmIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFNpbXBsaWNpYWxMTFQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9jaG9sbW9kOworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIAorICAgIENob2xtb2RTaW1wbGljaWFsTExUKCkgOiBCYXNlKCkgeyBpbml0KCk7IH0KKworICAgIENob2xtb2RTaW1wbGljaWFsTExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICB0aGlzLT5jb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgfkNob2xtb2RTaW1wbGljaWFsTExUKCkge30KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAwOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgICBtX2Nob2xtb2QuZmluYWxfbGwgPSAxOworICAgIH0KK307CisKKworLyoqIFxpbmdyb3VwIENob2xtb2RTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBDaG9sbW9kU2ltcGxpY2lhbExETFQKKyAgKiBcYnJpZWYgQSBzaW1wbGljaWFsIGRpcmVjdCBDaG9sZXNreSAoTERMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc2ltcGxpY2lhbCBMRExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIENob2xtb2QgbGlicmFyeS4KKyAgKiBUaGlzIHNpbXBsaWNpYWwgdmFyaWFudCBpcyBlcXVpdmFsZW50IHRvIEVpZ2VuJ3MgYnVpbHQtaW4gU2ltcGxpY2lhbExETFQgY2xhc3MuIFRoZXJlZm9yZSwgaXQgaGFzIGxpdHRsZSBwcmFjdGljYWwgaW50ZXJlc3QuCisgICogVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZhZGpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4gVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYWxsIGtpbmQgb2YgU3BhcnNlTWF0cml4PD46IHJvdyBvciBjb2x1bW4gbWFqb3I7IHVwcGVyLCBsb3dlciwgb3IgYm90aDsgY29tcHJlc3NlZCBvciBub24gY29tcHJlc3NlZC4KKyAgKgorICAqIFx3YXJuaW5nIE9ubHkgZG91YmxlIHByZWNpc2lvbiByZWFsIGFuZCBjb21wbGV4IHNjYWxhciB0eXBlcyBhcmUgc3VwcG9ydGVkIGJ5IENob2xtb2QuCisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIENob2xtb2RTdXBlcm5vZGFsTExULCBjbGFzcyBTaW1wbGljaWFsTERMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyPgorY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMRExUIDogcHVibGljIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFNpbXBsaWNpYWxMRExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICAgIHR5cGVkZWYgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kU2ltcGxpY2lhbExETFQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9jaG9sbW9kOworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIAorICAgIENob2xtb2RTaW1wbGljaWFsTERMVCgpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBDaG9sbW9kU2ltcGxpY2lhbExETFQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IEJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIHRoaXMtPmNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+Q2hvbG1vZFNpbXBsaWNpYWxMRExUKCkge30KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgfQorfTsKKworLyoqIFxpbmdyb3VwIENob2xtb2RTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVAorICAqIFxicmllZiBBIHN1cGVybm9kYWwgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc3VwZXJub2RhbCBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgQ2hvbG1vZCBsaWJyYXJ5LgorICAqIFRoaXMgc3VwZXJub2RhbCB2YXJpYW50IHBlcmZvcm1zIGJlc3Qgb24gZGVuc2UgZW5vdWdoIHByb2JsZW1zLCBlLmcuLCAzRCBGRU0sIG9yIHZlcnkgaGlnaCBvcmRlciAyRCBGRU0uCisgICogVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZhZGpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4gVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYWxsIGtpbmQgb2YgU3BhcnNlTWF0cml4PD46IHJvdyBvciBjb2x1bW4gbWFqb3I7IHVwcGVyLCBsb3dlciwgb3IgYm90aDsgY29tcHJlc3NlZCBvciBub24gY29tcHJlc3NlZC4KKyAgKgorICAqIFx3YXJuaW5nIE9ubHkgZG91YmxlIHByZWNpc2lvbiByZWFsIGFuZCBjb21wbGV4IHNjYWxhciB0eXBlcyBhcmUgc3VwcG9ydGVkIGJ5IENob2xtb2QuCisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8gPSBMb3dlcj4KK2NsYXNzIENob2xtb2RTdXBlcm5vZGFsTExUIDogcHVibGljIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFN1cGVybm9kYWxMTFQ8X01hdHJpeFR5cGUsIF9VcExvPiA+Cit7CisgICAgdHlwZWRlZiBDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSwgX1VwTG8sIENob2xtb2RTdXBlcm5vZGFsTExUPiBCYXNlOworICAgIHVzaW5nIEJhc2U6Om1fY2hvbG1vZDsKKyAgICAKKyAgcHVibGljOgorICAgIAorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICAKKyAgICBDaG9sbW9kU3VwZXJub2RhbExMVCgpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBDaG9sbW9kU3VwZXJub2RhbExMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgdGhpcy0+Y29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIH5DaG9sbW9kU3VwZXJub2RhbExMVCgpIHt9CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIG1fY2hvbG1vZC5maW5hbF9hc2lzID0gMTsKKyAgICAgIG1fY2hvbG1vZC5zdXBlcm5vZGFsID0gQ0hPTE1PRF9TVVBFUk5PREFMOworICAgIH0KK307CisKKy8qKiBcaW5ncm91cCBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgQ2hvbG1vZERlY29tcG9zaXRpb24KKyAgKiBcYnJpZWYgQSBnZW5lcmFsIENob2xlc2t5IGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiBDaG9sbW9kCisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhIExMXlQgb3IgTERMXlQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbgorICAqIHVzaW5nIHRoZSBDaG9sbW9kIGxpYnJhcnkuIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzZWxmYWRqb2ludCBhbmQgcG9zaXRpdmUgZGVmaW5pdGUuIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBwZXJtaXRzIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBDaG9sZXNreSBtZXRob2QgYXQgcnVudGltZS4KKyAgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgZG9lcyBub3QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZmFjdG9yaXphdGlvbi4KKyAgKiBUaGUgZGVmYXVsdCBpcyB0byBsZXQgQ2hvbG1vZCBhdXRvbWF0aWNhbGx5IGNob29zZSBiZXR3ZWVuIGEgc2ltcGxpY2lhbCBhbmQgc3VwZXJub2RhbCBmYWN0b3JpemF0aW9uLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYWxsIGtpbmQgb2YgU3BhcnNlTWF0cml4PD46IHJvdyBvciBjb2x1bW4gbWFqb3I7IHVwcGVyLCBsb3dlciwgb3IgYm90aDsgY29tcHJlc3NlZCBvciBub24gY29tcHJlc3NlZC4KKyAgKgorICAqIFx3YXJuaW5nIE9ubHkgZG91YmxlIHByZWNpc2lvbiByZWFsIGFuZCBjb21wbGV4IHNjYWxhciB0eXBlcyBhcmUgc3VwcG9ydGVkIGJ5IENob2xtb2QuCisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8gPSBMb3dlcj4KK2NsYXNzIENob2xtb2REZWNvbXBvc2l0aW9uIDogcHVibGljIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZERlY29tcG9zaXRpb248X01hdHJpeFR5cGUsIF9VcExvPiA+Cit7CisgICAgdHlwZWRlZiBDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSwgX1VwTG8sIENob2xtb2REZWNvbXBvc2l0aW9uPiBCYXNlOworICAgIHVzaW5nIEJhc2U6Om1fY2hvbG1vZDsKKyAgICAKKyAgcHVibGljOgorICAgIAorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICAKKyAgICBDaG9sbW9kRGVjb21wb3NpdGlvbigpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBDaG9sbW9kRGVjb21wb3NpdGlvbihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgdGhpcy0+Y29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIH5DaG9sbW9kRGVjb21wb3NpdGlvbigpIHt9CisgICAgCisgICAgdm9pZCBzZXRNb2RlKENob2xtb2RNb2RlIG1vZGUpCisgICAgeworICAgICAgc3dpdGNoKG1vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgQ2hvbG1vZEF1dG86CisgICAgICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgICAgIG1fY2hvbG1vZC5zdXBlcm5vZGFsID0gQ0hPTE1PRF9BVVRPOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENob2xtb2RTaW1wbGljaWFsTEx0OgorICAgICAgICAgIG1fY2hvbG1vZC5maW5hbF9hc2lzID0gMDsKKyAgICAgICAgICBtX2Nob2xtb2Quc3VwZXJub2RhbCA9IENIT0xNT0RfU0lNUExJQ0lBTDsKKyAgICAgICAgICBtX2Nob2xtb2QuZmluYWxfbGwgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENob2xtb2RTdXBlcm5vZGFsTEx0OgorICAgICAgICAgIG1fY2hvbG1vZC5maW5hbF9hc2lzID0gMTsKKyAgICAgICAgICBtX2Nob2xtb2Quc3VwZXJub2RhbCA9IENIT0xNT0RfU1VQRVJOT0RBTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDaG9sbW9kTERMdDoKKyAgICAgICAgICBtX2Nob2xtb2QuZmluYWxfYXNpcyA9IDE7CisgICAgICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX2Nob2xtb2QuZmluYWxfYXNpcyA9IDE7CisgICAgICBtX2Nob2xtb2Quc3VwZXJub2RhbCA9IENIT0xNT0RfQVVUTzsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NIT0xNT0RTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0FycmF5LmggYi9FaWdlbi9zcmMvQ29yZS9BcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9BcnJheS5oCkBAIC0wLDAgKzEsMzMxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVJSQVlfSAorI2RlZmluZSBFSUdFTl9BUlJBWV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK3N0cnVjdCB0cmFpdHM8QXJyYXk8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+IDogdHJhaXRzPE1hdHJpeDxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4KK3sKKyAgdHlwZWRlZiBBcnJheVhwciBYcHJLaW5kOworICB0eXBlZGVmIEFycmF5QmFzZTxBcnJheTxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4gWHByQmFzZTsKK307Cit9CisKKy8qKiBcY2xhc3MgQXJyYXkKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyYWwtcHVycG9zZSBhcnJheXMgd2l0aCBlYXN5IEFQSSBmb3IgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zCisgICoKKyAgKiBUaGUgJUFycmF5IGNsYXNzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgTWF0cml4IGNsYXNzLiBJdCBwcm92aWRlcworICAqIGdlbmVyYWwtcHVycG9zZSBvbmUtIGFuZCB0d28tZGltZW5zaW9uYWwgYXJyYXlzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICAqICVBcnJheSBhbmQgdGhlICVNYXRyaXggY2xhc3MgaXMgcHJpbWFyaWx5IGluIHRoZSBBUEk6IHRoZSBBUEkgZm9yIHRoZQorICAqICVBcnJheSBjbGFzcyBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMsIHdoaWxlIHRoZQorICAqIEFQSSBmb3IgdGhlICVNYXRyaXggY2xhc3MgcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gbGluZWFyLWFsZ2VicmEKKyAgKiBvcGVyYXRpb25zLgorICAqCisgICogU2VlIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgTWF0cml4IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycworICAqIHN0b3JhZ2UgbGF5b3V0LgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgcGx1Z2luIG1lY2hhbmlzbSBkZXNjcmliZWQgb24gdGhlIHBhZ2UKKyAgKiBccmVmIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucyBieSBkZWZpbmluZyB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBcYyBFSUdFTl9BUlJBWV9QTFVHSU4uCisgICoKKyAgKiBcc2EgXGJsYW5rIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzLCBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorY2xhc3MgQXJyYXkKKyAgOiBwdWJsaWMgUGxhaW5PYmplY3RCYXNlPEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFBsYWluT2JqZWN0QmFzZTxBcnJheT4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEFycmF5KQorCisgICAgZW51bSB7IE9wdGlvbnMgPSBfT3B0aW9ucyB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGJvb2wgSXNWZWN0b3I+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw7CisKKyAgICB1c2luZyBCYXNlOjptX3N0b3JhZ2U7CisKKyAgcHVibGljOgorCisgICAgdXNpbmcgQmFzZTo6YmFzZTsKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKworICAgIC8qKgorICAgICAgKiBUaGUgdXNhZ2Ugb2YKKyAgICAgICogICB1c2luZyBCYXNlOjpvcGVyYXRvcj07CisgICAgICAqIGZhaWxzIG9uIE1TVkMuIFNpbmNlIHRoZSBjb2RlIGJlbG93IGlzIHdvcmtpbmcgd2l0aCBHQ0MgYW5kIE1TVkMsIHdlIHNraXBwZWQKKyAgICAgICogdGhlIHVzYWdlIG9mICd1c2luZycuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb25seSBmb3Igb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5JiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ob3RoZXIpOworICAgIH0KKworICAgIC8qKiBTZXQgYWxsIHRoZSBlbnRyaWVzIHRvIFxhIHZhbHVlLgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjpzZXRDb25zdGFudCgpLCBEZW5zZUJhc2U6OmZpbGwoKQorICAgICAgKi8KKyAgICAvKiBUaGlzIG92ZXJsb2FkIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSB1c2FnZSBvZgorICAgICAgKiAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yPTsKKyAgICAgICogZmFpbHMgb24gTVNWQy4gU2luY2UgdGhlIGNvZGUgYmVsb3cgaXMgd29ya2luZyB3aXRoIEdDQyBhbmQgTVNWQywgd2Ugc2tpcHBlZAorICAgICAgKiB0aGUgdXNhZ2Ugb2YgJ3VzaW5nJy4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbmx5IGZvciBvcGVyYXRvcj0uCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheSYgb3BlcmF0b3I9KGNvbnN0IFNjYWxhciAmdmFsdWUpCisgICAgeworICAgICAgQmFzZTo6c2V0Q29uc3RhbnQodmFsdWUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBDb3BpZXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxhIG90aGVyIGludG8gXGMgKnRoaXMgd2l0aCBhdXRvbWF0aWMgcmVzaXppbmcuCisgICAgICAqCisgICAgICAqICp0aGlzIG1pZ2h0IGJlIHJlc2l6ZWQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgXGEgb3RoZXIuIElmICp0aGlzIHdhcyBhIG51bGwgbWF0cml4IChub3QgYWxyZWFkeSBpbml0aWFsaXplZCksCisgICAgICAqIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCBjb3B5aW5nIGEgcm93LXZlY3RvciBpbnRvIGEgdmVjdG9yIChhbmQgY29udmVyc2VseSkgaXMgYWxsb3dlZC4KKyAgICAgICogVGhlIHJlc2l6aW5nLCBpZiBhbnksIGlzIHRoZW4gZG9uZSBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5IHNvIHRoYXQgcm93LXZlY3RvcnMKKyAgICAgICogcmVtYWluIHJvdy12ZWN0b3JzIGFuZCB2ZWN0b3JzIHJlbWFpbiB2ZWN0b3JzLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5JiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpfc2V0KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQXJyYXkmIG9wZXJhdG9yPShjb25zdCBBcnJheSYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Ol9zZXQob3RoZXIpOworICAgIH0KKyAgICAKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogRm9yIGZpeGVkLXNpemUgbWF0cmljZXMsIGRvZXMgbm90aGluZy4KKyAgICAgICoKKyAgICAgICogRm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgY3JlYXRlcyBhbiBlbXB0eSBtYXRyaXggb2Ygc2l6ZSAwLiBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYXJyYXkuIFN1Y2ggYSBtYXRyaXgKKyAgICAgICogaXMgY2FsbGVkIGEgbnVsbCBtYXRyaXguIFRoaXMgY29uc3RydWN0b3IgaXMgdGhlIHVuaXF1ZSB3YXkgdG8gY3JlYXRlIG51bGwgbWF0cmljZXM6IHJlc2l6aW5nCisgICAgICAqIGEgbWF0cml4IHRvIDAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICoKKyAgICAgICogXHNhIHJlc2l6ZShJbmRleCxJbmRleCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgfQorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLy8gRklYTUUgaXMgaXQgc3RpbGwgbmVlZGVkID8/CisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQXJyYXkoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogQmFzZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKyNlbmRpZgorCisjaWYgRUlHRU5fSEFTX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBBcnJheShBcnJheSYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVF9JRihzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPFNjYWxhcj46OnZhbHVlKQorICAgICAgOiBCYXNlKHN0ZDo6bW92ZShvdGhlcikpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgaWYgKFJvd3NBdENvbXBpbGVUaW1lIT1EeW5hbWljICYmIENvbHNBdENvbXBpbGVUaW1lIT1EeW5hbWljKQorICAgICAgICBCYXNlOjpfc2V0X25vYWxpYXMob3RoZXIpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEFycmF5JiBvcGVyYXRvcj0oQXJyYXkmJiBvdGhlcikgRUlHRU5fTk9FWENFUFRfSUYoc3RkOjppc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxTY2FsYXI+Ojp2YWx1ZSkKKyAgICB7CisgICAgICBvdGhlci5zd2FwKCp0aGlzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBBcnJheShjb25zdCBUJiB4KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIF9pbml0MTxUPih4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IFQwJiB2YWwwLCBjb25zdCBUMSYgdmFsMSkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICB0aGlzLT50ZW1wbGF0ZSBfaW5pdDI8VDAsVDE+KHZhbDAsIHZhbDEpOworICAgIH0KKyAgICAjZWxzZQorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIGZpeGVkLXNpemVkIGFycmF5IGluaXRpYWxpemVkIHdpdGggY29lZmZpY2llbnRzIHN0YXJ0aW5nIGF0IFxhIGRhdGEgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBBcnJheShjb25zdCBTY2FsYXIgKmRhdGEpOworICAgIC8qKiBDb25zdHJ1Y3RzIGEgdmVjdG9yIG9yIHJvdy12ZWN0b3Igd2l0aCBnaXZlbiBkaW1lbnNpb24uIFxvbmx5X2Zvcl92ZWN0b3JzCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZnVsIGZvciBkeW5hbWljLXNpemUgdmVjdG9ycy4gRm9yIGZpeGVkLXNpemUgdmVjdG9ycywKKyAgICAgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgdGhlIGRpbWVuc2lvbiBoZXJlLCBzbyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAgKiBjb25zdHJ1Y3RvciBBcnJheSgpIGluc3RlYWQuCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBBcnJheShJbmRleCBkaW0pOworICAgIC8qKiBjb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDF4MSBBcnJheSB3aXRoIHRoZSBnaXZlbiBjb2VmZmljaWVudCAqLworICAgIEFycmF5KGNvbnN0IFNjYWxhciYgdmFsdWUpOworICAgIC8qKiBjb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgYXJyYXkgd2l0aCBcYSByb3dzIHJvd3MgYW5kIFxhIGNvbHMgY29sdW1ucy4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGR5bmFtaWMtc2l6ZSBhcnJheXMuIEZvciBmaXhlZC1zaXplIGFycmF5cywKKyAgICAgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgdGhlc2UgcGFyYW1ldGVycywgc28gb25lIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICogQXJyYXkoKSBpbnN0ZWFkLiAqLworICAgIEFycmF5KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworICAgIC8qKiBjb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDJEIHZlY3RvciB3aXRoIGdpdmVuIGNvZWZmaWNpZW50cyAqLworICAgIEFycmF5KGNvbnN0IFNjYWxhciYgdmFsMCwgY29uc3QgU2NhbGFyJiB2YWwxKTsKKyAgICAjZW5kaWYKKworICAgIC8qKiBjb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDNEIHZlY3RvciB3aXRoIGdpdmVuIGNvZWZmaWNpZW50cyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheShjb25zdCBTY2FsYXImIHZhbDAsIGNvbnN0IFNjYWxhciYgdmFsMSwgY29uc3QgU2NhbGFyJiB2YWwyKQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoQXJyYXksIDMpCisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzBdID0gdmFsMDsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMV0gPSB2YWwxOworICAgICAgbV9zdG9yYWdlLmRhdGEoKVsyXSA9IHZhbDI7CisgICAgfQorICAgIC8qKiBjb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDREIHZlY3RvciB3aXRoIGdpdmVuIGNvZWZmaWNpZW50cyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheShjb25zdCBTY2FsYXImIHZhbDAsIGNvbnN0IFNjYWxhciYgdmFsMSwgY29uc3QgU2NhbGFyJiB2YWwyLCBjb25zdCBTY2FsYXImIHZhbDMpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShBcnJheSwgNCkKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMF0gPSB2YWwwOworICAgICAgbV9zdG9yYWdlLmRhdGEoKVsxXSA9IHZhbDE7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzJdID0gdmFsMjsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbM10gPSB2YWwzOworICAgIH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IEFycmF5JiBvdGhlcikKKyAgICAgICAgICAgIDogQmFzZShvdGhlcikKKyAgICB7IH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBQcml2YXRlVHlwZSB7fTsKKyAgcHVibGljOgorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQXJyYXkoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxpbnRlcm5hbDo6aXNfY29udmVydGlibGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIsU2NhbGFyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGVUeXBlPjo6dHlwZSA9IFByaXZhdGVUeXBlKCkpCisgICAgICA6IEJhc2Uob3RoZXIuZGVyaXZlZCgpKQorICAgIHsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gMTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmlubmVyU2l6ZSgpOyB9CisKKyAgICAjaWZkZWYgRUlHRU5fQVJSQVlfUExVR0lOCisgICAgI2luY2x1ZGUgRUlHRU5fQVJSQVlfUExVR0lOCisgICAgI2VuZGlmCisKKyAgcHJpdmF0ZToKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBTd2FwUG9pbnRlcnM+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6bWF0cml4X3N3YXBfaW1wbDsKK307CisKKy8qKiBcZGVmZ3JvdXAgYXJyYXl0eXBlZGVmcyBHbG9iYWwgYXJyYXkgdHlwZWRlZnMKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogRWlnZW4gZGVmaW5lcyBzZXZlcmFsIHR5cGVkZWYgc2hvcnRjdXRzIGZvciBtb3N0IGNvbW1vbiAxRCBhbmQgMkQgYXJyYXkgdHlwZXMuCisgICoKKyAgKiBUaGUgZ2VuZXJhbCBwYXR0ZXJucyBhcmUgdGhlIGZvbGxvd2luZzoKKyAgKgorICAqIFxjIEFycmF5Um93c0NvbHNUeXBlIHdoZXJlIFxjIFJvd3MgYW5kIFxjIENvbHMgY2FuIGJlIFxjIDIsXGMgMyxcYyA0IGZvciBmaXhlZCBzaXplIHNxdWFyZSBtYXRyaWNlcyBvciBcYyBYIGZvciBkeW5hbWljIHNpemUsCisgICogYW5kIHdoZXJlIFxjIFR5cGUgY2FuIGJlIFxjIGkgZm9yIGludGVnZXIsIFxjIGYgZm9yIGZsb2F0LCBcYyBkIGZvciBkb3VibGUsIFxjIGNmIGZvciBjb21wbGV4IGZsb2F0LCBcYyBjZAorICAqIGZvciBjb21wbGV4IGRvdWJsZS4KKyAgKgorICAqIEZvciBleGFtcGxlLCBcYyBBcnJheTMzZCBpcyBhIGZpeGVkLXNpemUgM3gzIGFycmF5IHR5cGUgb2YgZG91YmxlcywgYW5kIFxjIEFycmF5WFhmIGlzIGEgZHluYW1pYy1zaXplIG1hdHJpeCBvZiBmbG9hdHMuCisgICoKKyAgKiBUaGVyZSBhcmUgYWxzbyBcYyBBcnJheVNpemVUeXBlIHdoaWNoIGFyZSBzZWxmLWV4cGxhbmF0b3J5LiBGb3IgZXhhbXBsZSwgXGMgQXJyYXk0Y2YgaXMKKyAgKiBhIGZpeGVkLXNpemUgMUQgYXJyYXkgb2YgNCBjb21wbGV4IGZsb2F0cy4KKyAgKgorICAqIFxzYSBjbGFzcyBBcnJheQorICAqLworCisjZGVmaW5lIEVJR0VOX01BS0VfQVJSQVlfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgU2l6ZSwgU2l6ZVN1ZmZpeCkgICBcCisvKiogXGluZ3JvdXAgYXJyYXl0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgQXJyYXk8VHlwZSwgU2l6ZSwgU2l6ZT4gQXJyYXkjI1NpemVTdWZmaXgjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7ICBcCisvKiogXGluZ3JvdXAgYXJyYXl0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgQXJyYXk8VHlwZSwgU2l6ZSwgMT4gICAgQXJyYXkjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fTUFLRV9BUlJBWV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBTaXplKSAgICAgICAgIFwKKy8qKiBcaW5ncm91cCBhcnJheXR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBBcnJheTxUeXBlLCBTaXplLCBEeW5hbWljPiBBcnJheSMjU2l6ZSMjWCMjVHlwZVN1ZmZpeDsgIFwKKy8qKiBcaW5ncm91cCBhcnJheXR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBBcnJheTxUeXBlLCBEeW5hbWljLCBTaXplPiBBcnJheSMjWCMjU2l6ZSMjVHlwZVN1ZmZpeDsKKworI2RlZmluZSBFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTX0FMTF9TSVpFUyhUeXBlLCBUeXBlU3VmZml4KSBcCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDIsIDIpIFwKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMywgMykgXAorRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCA0LCA0KSBcCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIER5bmFtaWMsIFgpIFwKK0VJR0VOX01BS0VfQVJSQVlfRklYRURfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMikgXAorRUlHRU5fTUFLRV9BUlJBWV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAzKSBcCitFSUdFTl9NQUtFX0FSUkFZX0ZJWEVEX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDQpCisKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKGludCwgICAgICAgICAgICAgICAgICBpKQorRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGU19BTExfU0laRVMoZmxvYXQsICAgICAgICAgICAgICAgIGYpCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTX0FMTF9TSVpFUyhkb3VibGUsICAgICAgICAgICAgICAgZCkKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxmbG9hdD4sICBjZikKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxkb3VibGU+LCBjZCkKKworI3VuZGVmIEVJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTCisjdW5kZWYgRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGUworCisjdW5kZWYgRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGU19MQVJHRQorCisjZGVmaW5lIEVJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFX0FORF9TSVpFKFR5cGVTdWZmaXgsIFNpemVTdWZmaXgpIFwKK3VzaW5nIEVpZ2VuOjpNYXRyaXgjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7IFwKK3VzaW5nIEVpZ2VuOjpWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7IFwKK3VzaW5nIEVpZ2VuOjpSb3dWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEUoVHlwZVN1ZmZpeCkgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgMikgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgMykgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgNCkgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgWCkgXAorCisjZGVmaW5lIEVJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGkpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGYpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGQpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGNmKSBcCitFSUdFTl9VU0lOR19BUlJBWV9UWVBFREVGU19GT1JfVFlQRShjZCkKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BUlJBWV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9BcnJheUJhc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL0FycmF5QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYmM3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9BcnJheUJhc2UuaApAQCAtMCwwICsxLDIyNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FSUkFZQkFTRV9ICisjZGVmaW5lIEVJR0VOX0FSUkFZQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgTWF0cml4V3JhcHBlcjsKKworLyoqIFxjbGFzcyBBcnJheUJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCAxRCBhbmQgMkQgYXJyYXksIGFuZCByZWxhdGVkIGV4cHJlc3Npb25zCisgICoKKyAgKiBBbiBhcnJheSBpcyBzaW1pbGFyIHRvIGEgZGVuc2UgdmVjdG9yIG9yIG1hdHJpeC4gV2hpbGUgbWF0cmljZXMgYXJlIG1hdGhlbWF0aWNhbAorICAqIG9iamVjdHMgd2l0aCB3ZWxsIGRlZmluZWQgbGluZWFyIGFsZ2VicmEgb3BlcmF0b3JzLCBhbiBhcnJheSBpcyBqdXN0IGEgY29sbGVjdGlvbgorICAqIG9mIHNjYWxhciB2YWx1ZXMgYXJyYW5nZWQgaW4gYSBvbmUgb3IgdHdvIGRpbWVuc2lvbm5hbCBmYXNoaW9uLiBBcyB0aGUgbWFpbiBjb25zZXF1ZW5jZSwKKyAgKiBhbGwgb3BlcmF0aW9ucyBhcHBsaWVkIHRvIGFuIGFycmF5IGFyZSBwZXJmb3JtZWQgY29lZmZpY2llbnQgd2lzZS4gRnVydGhlcm1vcmUsCisgICogYXJyYXlzIHN1cHBvcnQgc2NhbGFyIG1hdGggZnVuY3Rpb25zIG9mIHRoZSBjKysgc3RhbmRhcmQgbGlicmFyeSAoZS5nLiwgc3RkOjpzaW4oeCkpLCBhbmQgY29udmVuaWVudAorICAqIGNvbnN0cnVjdG9ycyBhbGxvd2luZyB0byBlYXNpbHkgd3JpdGUgZ2VuZXJpYyBjb2RlIHdvcmtpbmcgZm9yIGJvdGggc2NhbGFyIHZhbHVlcworICAqIGFuZCBhcnJheXMuCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIHRoYXQgaXMgaW5oZXJpdGVkIGJ5IGFsbCBhcnJheSBleHByZXNzaW9uIHR5cGVzLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4sIGFuIGFycmF5IG9yIGFuIGV4cHJlc3Npb24gdHlwZS4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fQVJSQVlCQVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBjbGFzcyBNYXRyaXhCYXNlLCBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIEFycmF5QmFzZQorICA6IHB1YmxpYyBEZW5zZUJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgYSBnaXZlbiBzdG9yYWdlIHR5cGUuICovCisgICAgdHlwZWRlZiBBcnJheUJhc2UgU3RvcmFnZUJhc2VUeXBlOworCisgICAgdHlwZWRlZiBBcnJheUJhc2UgRWlnZW5fQmFzZUNsYXNzRm9yU3BlY2lhbGl6YXRpb25PZkdsb2JhbE1hdGhGdW5jSW1wbDsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgdHlwZWRlZiBEZW5zZUJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjpSb3dzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpDb2xzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpTaXplQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhSb3dzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhDb2xzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhTaXplQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6RmxhZ3M7CisgICAgCisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpjb25zdF9jYXN0X2Rlcml2ZWQ7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisgICAgdXNpbmcgQmFzZTo6bGF6eUFzc2lnbjsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcj07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvci09OworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKj07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IvPTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKworICAgIC8qKiBcaW50ZXJuYWwgUmVwcmVzZW50cyBhIG1hdHJpeCB3aXRoIGFsbCBjb2VmZmljaWVudHMgZXF1YWwgdG8gb25lIGFub3RoZXIqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluT2JqZWN0PiBDb25zdGFudFJldHVyblR5cGU7CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNkZWZpbmUgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MgRWlnZW46OkFycmF5QmFzZQorI2RlZmluZSBFSUdFTl9ET0NfVU5BUllfQURET05TKFgsWSkKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0NvbW1vbkN3aXNlVW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL01hdHJpeEN3aXNlVW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0FycmF5Q3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQ29tbW9uQ3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL01hdHJpeEN3aXNlQmluYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9BcnJheUN3aXNlQmluYXJ5T3BzLmgiCisjICAgaWZkZWYgRUlHRU5fQVJSQVlCQVNFX1BMVUdJTgorIyAgICAgaW5jbHVkZSBFSUdFTl9BUlJBWUJBU0VfUExVR0lOCisjICAgZW5kaWYKKyN1bmRlZiBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUworI3VuZGVmIEVJR0VOX0RPQ19VTkFSWV9BRERPTlMKKworICAgIC8qKiBTcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlIG9wZXJhdG9yPSwgaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgICogZnJvbSBnZW5lcmF0aW5nIGEgZGVmYXVsdCBvcGVyYXRvcj0gKGlzc3VlIGhpdCB3aXRoIGcrKyA0LjEpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgQXJyYXlCYXNlJiBvdGhlcikKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgIAorICAgIC8qKiBTZXQgYWxsIHRoZSBlbnRyaWVzIHRvIFxhIHZhbHVlLgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjpzZXRDb25zdGFudCgpLCBEZW5zZUJhc2U6OmZpbGwoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgU2NhbGFyICZ2YWx1ZSkKKyAgICB7IEJhc2U6OnNldENvbnN0YW50KHZhbHVlKTsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgU2NhbGFyJiBzY2FsYXIpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvci09KGNvbnN0IFNjYWxhciYgc2NhbGFyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3ItPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcio9KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIERlcml2ZWQmIG9wZXJhdG9yLz0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBBcnJheUJhc2U8RGVyaXZlZD4mIGFycmF5KCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEFycmF5QmFzZTxEZXJpdmVkPiYgYXJyYXkoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgLyoqIFxyZXR1cm5zIGFuIFxsaW5rIEVpZ2VuOjpNYXRyaXhCYXNlIE1hdHJpeCBcZW5kbGluayBleHByZXNzaW9uIG9mIHRoaXMgYXJyYXkKKyAgICAgICogXHNhIE1hdHJpeEJhc2U6OmFycmF5KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIE1hdHJpeFdyYXBwZXI8RGVyaXZlZD4gbWF0cml4KCkgeyByZXR1cm4gTWF0cml4V3JhcHBlcjxEZXJpdmVkPihkZXJpdmVkKCkpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBNYXRyaXhXcmFwcGVyPGNvbnN0IERlcml2ZWQ+IG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIE1hdHJpeFdyYXBwZXI8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpKTsgfQorCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKy8vICAgICBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdCB7IGRzdCA9IG1hdHJpeCgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQXJyYXlCYXNlKCkgOiBCYXNlKCkge30KKworICBwcml2YXRlOgorICAgIGV4cGxpY2l0IEFycmF5QmFzZShJbmRleCk7CisgICAgQXJyYXlCYXNlKEluZGV4LEluZGV4KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGV4cGxpY2l0IEFycmF5QmFzZShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYpOworICBwcm90ZWN0ZWQ6CisgICAgLy8gbWl4aW5nIGFycmF5cyBhbmQgbWF0cmljZXMgaXMgbm90IGxlZ2FsCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBEZXJpdmVkJiBvcGVyYXRvcis9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgKQorICAgIHtFSUdFTl9TVEFUSUNfQVNTRVJUKHN0ZDo6cHRyZGlmZl90KHNpemVvZih0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcikpPT0tMSxZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTKTsgcmV0dXJuICp0aGlzO30KKyAgICAvLyBtaXhpbmcgYXJyYXlzIGFuZCBtYXRyaWNlcyBpcyBub3QgbGVnYWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiApCisgICAge0VJR0VOX1NUQVRJQ19BU1NFUlQoc3RkOjpwdHJkaWZmX3Qoc2l6ZW9mKHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyKSk9PS0xLFlPVV9DQU5OT1RfTUlYX0FSUkFZU19BTkRfTUFUUklDRVMpOyByZXR1cm4gKnRoaXM7fQorfTsKKworLyoqIHJlcGxhY2VzIFxjICp0aGlzIGJ5IFxjICp0aGlzIC0gXGEgb3RoZXIuCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitBcnJheUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLT0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBjYWxsX2Fzc2lnbm1lbnQoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj4oKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiByZXBsYWNlcyBcYyAqdGhpcyBieSBcYyAqdGhpcyArIFxhIG90aGVyLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcis9KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgY2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6YWRkX2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKiBcYSBvdGhlciBjb2VmZmljaWVudCB3aXNlLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcio9KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgY2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6bXVsX2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgLyBcYSBvdGhlciBjb2VmZmljaWVudCB3aXNlLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci89KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgY2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6ZGl2X2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FSUkFZQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9BcnJheVdyYXBwZXIuaCBiL0VpZ2VuL3NyYy9Db3JlL0FycmF5V3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OGFhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9BcnJheVdyYXBwZXIuaApAQCAtMCwwICsxLDIwOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVJSQVlXUkFQUEVSX0gKKyNkZWZpbmUgRUlHRU5fQVJSQVlXUkFQUEVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgQXJyYXlXcmFwcGVyCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIGEgbWF0aGVtYXRpY2FsIHZlY3RvciBvciBtYXRyaXggYXMgYW4gYXJyYXkgb2JqZWN0CisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjphcnJheSgpLCBhbmQgbW9zdCBvZiB0aGUgdGltZQorICAqIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjphcnJheSgpLCBjbGFzcyBNYXRyaXhXcmFwcGVyCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3N0cnVjdCB0cmFpdHM8QXJyYXlXcmFwcGVyPEV4cHJlc3Npb25UeXBlPiA+CisgIDogcHVibGljIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpOZXN0ZWQ+Ojp0eXBlID4KK3sKKyAgdHlwZWRlZiBBcnJheVhwciBYcHJLaW5kOworICAvLyBMZXQncyByZW1vdmUgTmVzdEJ5UmVmQml0CisgIGVudW0geworICAgIEZsYWdzMCA9IHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpOZXN0ZWQ+Ojp0eXBlID46OkZsYWdzLAorICAgIEx2YWx1ZUJpdEZsYWcgPSBpc19sdmFsdWU8RXhwcmVzc2lvblR5cGU+Ojp2YWx1ZSA/IEx2YWx1ZUJpdCA6IDAsCisgICAgRmxhZ3MgPSAoRmxhZ3MwICYgfihOZXN0QnlSZWZCaXQgfCBMdmFsdWVCaXQpKSB8IEx2YWx1ZUJpdEZsYWcKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorY2xhc3MgQXJyYXlXcmFwcGVyIDogcHVibGljIEFycmF5QmFzZTxBcnJheVdyYXBwZXI8RXhwcmVzc2lvblR5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQXJyYXlCYXNlPEFycmF5V3JhcHBlcj4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEFycmF5V3JhcHBlcikKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKEFycmF5V3JhcHBlcikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEV4cHJlc3Npb25UeXBlPjo6dHlwZSBOZXN0ZWRFeHByZXNzaW9uOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjppc19sdmFsdWU8RXhwcmVzc2lvblR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIKKyAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWZfc2VsZWN0b3I8RXhwcmVzc2lvblR5cGU+Ojpub25fY29uc3RfdHlwZSBOZXN0ZWRFeHByZXNzaW9uVHlwZTsKKworICAgIHVzaW5nIEJhc2U6OmNvZWZmUmVmOworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBleHBsaWNpdCBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5V3JhcHBlcihFeHByZXNzaW9uVHlwZSYgbWF0cml4KSA6IG1fZXhwcmVzc2lvbihtYXRyaXgpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLnJvd3MoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uY29scygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ub3V0ZXJTdHJpZGUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmlubmVyU3RyaWRlKCk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlKiBkYXRhKCkgeyByZXR1cm4gbV9leHByZXNzaW9uLmRhdGEoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5kYXRhKCk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93SWQsIEluZGV4IGNvbElkKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmZSZWYocm93SWQsIGNvbElkKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdCB7IGRzdCA9IG1fZXhwcmVzc2lvbjsgfQorCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TmVzdGVkRXhwcmVzc2lvblR5cGU+Ojp0eXBlJiAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCAKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uOworICAgIH0KKworICAgIC8qKiBGb3J3YXJkcyB0aGUgcmVzaXppbmcgcmVxdWVzdCB0byB0aGUgbmVzdGVkIGV4cHJlc3Npb24KKyAgICAgICogXHNhIERlbnNlQmFzZTo6cmVzaXplKEluZGV4KSAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgcmVzaXplKEluZGV4IG5ld1NpemUpIHsgbV9leHByZXNzaW9uLnJlc2l6ZShuZXdTaXplKTsgfQorICAgIC8qKiBGb3J3YXJkcyB0aGUgcmVzaXppbmcgcmVxdWVzdCB0byB0aGUgbmVzdGVkIGV4cHJlc3Npb24KKyAgICAgICogXHNhIERlbnNlQmFzZTo6cmVzaXplKEluZGV4LEluZGV4KSovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKSB7IG1fZXhwcmVzc2lvbi5yZXNpemUocm93cyxjb2xzKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBOZXN0ZWRFeHByZXNzaW9uVHlwZSBtX2V4cHJlc3Npb247Cit9OworCisvKiogXGNsYXNzIE1hdHJpeFdyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYW4gYXJyYXkgYXMgYSBtYXRoZW1hdGljYWwgdmVjdG9yIG9yIG1hdHJpeAorICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgQXJyYXlCYXNlOjptYXRyaXgoKSwgYW5kIG1vc3Qgb2YgdGhlIHRpbWUKKyAgKiB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2UuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bWF0cml4KCksIGNsYXNzIEFycmF5V3JhcHBlcgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitzdHJ1Y3QgdHJhaXRzPE1hdHJpeFdyYXBwZXI8RXhwcmVzc2lvblR5cGU+ID4KKyA6IHB1YmxpYyB0cmFpdHM8dHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6TmVzdGVkPjo6dHlwZSA+Cit7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7CisgIC8vIExldCdzIHJlbW92ZSBOZXN0QnlSZWZCaXQKKyAgZW51bSB7CisgICAgRmxhZ3MwID0gdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9hbGw8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6Ok5lc3RlZD46OnR5cGUgPjo6RmxhZ3MsCisgICAgTHZhbHVlQml0RmxhZyA9IGlzX2x2YWx1ZTxFeHByZXNzaW9uVHlwZT46OnZhbHVlID8gTHZhbHVlQml0IDogMCwKKyAgICBGbGFncyA9IChGbGFnczAgJiB+KE5lc3RCeVJlZkJpdCB8IEx2YWx1ZUJpdCkpIHwgTHZhbHVlQml0RmxhZworICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitjbGFzcyBNYXRyaXhXcmFwcGVyIDogcHVibGljIE1hdHJpeEJhc2U8TWF0cml4V3JhcHBlcjxFeHByZXNzaW9uVHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPE1hdHJpeFdyYXBwZXI8RXhwcmVzc2lvblR5cGU+ID4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKE1hdHJpeFdyYXBwZXIpCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhNYXRyaXhXcmFwcGVyKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RXhwcmVzc2lvblR5cGU+Ojp0eXBlIE5lc3RlZEV4cHJlc3Npb247CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2x2YWx1ZTxFeHByZXNzaW9uVHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxFeHByZXNzaW9uVHlwZT46Om5vbl9jb25zdF90eXBlIE5lc3RlZEV4cHJlc3Npb25UeXBlOworCisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBNYXRyaXhXcmFwcGVyKEV4cHJlc3Npb25UeXBlJiBtYXRyaXgpIDogbV9leHByZXNzaW9uKG1hdHJpeCkge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2xzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5vdXRlclN0cmlkZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uaW5uZXJTdHJpZGUoKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWUqIGRhdGEoKSB7IHJldHVybiBtX2V4cHJlc3Npb24uZGF0YSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmRhdGEoKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3dJZCwgSW5kZXggY29sSWQpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5kZXJpdmVkKCkuY29lZmZSZWYocm93SWQsIGNvbElkKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TmVzdGVkRXhwcmVzc2lvblR5cGU+Ojp0eXBlJiAKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICAvKiogRm9yd2FyZHMgdGhlIHJlc2l6aW5nIHJlcXVlc3QgdG8gdGhlIG5lc3RlZCBleHByZXNzaW9uCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnJlc2l6ZShJbmRleCkgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHJlc2l6ZShJbmRleCBuZXdTaXplKSB7IG1fZXhwcmVzc2lvbi5yZXNpemUobmV3U2l6ZSk7IH0KKyAgICAvKiogRm9yd2FyZHMgdGhlIHJlc2l6aW5nIHJlcXVlc3QgdG8gdGhlIG5lc3RlZCBleHByZXNzaW9uCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnJlc2l6ZShJbmRleCxJbmRleCkqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykgeyBtX2V4cHJlc3Npb24ucmVzaXplKHJvd3MsY29scyk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTmVzdGVkRXhwcmVzc2lvblR5cGUgbV9leHByZXNzaW9uOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BUlJBWVdSQVBQRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQXNzaWduLmggYi9FaWdlbi9zcmMvQ29yZS9Bc3NpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzgwNmJhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQXNzaWduLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBPbGJyaWNoIDxtaWNoYWVsLm9sYnJpY2hAZ214Lm5ldD4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BU1NJR05fSAorI2RlZmluZSBFSUdFTl9BU1NJR05fSAorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD4KKyAgOjpsYXp5QXNzaWduKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgZW51bXsKKyAgICBTYW1lVHlwZSA9IGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlCisgIH07CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFNhbWVUeXBlLFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gb3RoZXIucm93cygpICYmIGNvbHMoKSA9PSBvdGhlci5jb2xzKCkpOworICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRlcml2ZWQoKSxvdGhlci5kZXJpdmVkKCkpOworICAKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBEZW5zZUJhc2UmIG90aGVyKQoreworICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlJiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgb3RoZXIuZGVyaXZlZCgpLmV2YWxUbyhkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FTU0lHTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Bc3NpZ25FdmFsdWF0b3IuaCBiL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbkV2YWx1YXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWM3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Bc3NpZ25FdmFsdWF0b3IuaApAQCAtMCwwICsxLDkzNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FTU0lHTl9FVkFMVUFUT1JfSAorI2RlZmluZSBFSUdFTl9BU1NJR05fRVZBTFVBVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBc3NpZ24uaAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCAxIDogdGhlIGxvZ2ljIGRlY2lkaW5nIGEgc3RyYXRlZ3kgZm9yIHRyYXZlcnNhbCBhbmQgdW5yb2xsaW5nICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gY29weV91c2luZ19ldmFsdWF0b3JfdHJhaXRzIGlzIGJhc2VkIG9uIGFzc2lnbl90cmFpdHMKKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdEV2YWx1YXRvciwgdHlwZW5hbWUgU3JjRXZhbHVhdG9yLCB0eXBlbmFtZSBBc3NpZ25GdW5jPgorc3RydWN0IGNvcHlfdXNpbmdfZXZhbHVhdG9yX3RyYWl0cworeworICB0eXBlZGVmIHR5cGVuYW1lIERzdEV2YWx1YXRvcjo6WHByVHlwZSBEc3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0OjpTY2FsYXIgRHN0U2NhbGFyOworICAKKyAgZW51bSB7CisgICAgRHN0RmxhZ3MgPSBEc3RFdmFsdWF0b3I6OkZsYWdzLAorICAgIFNyY0ZsYWdzID0gU3JjRXZhbHVhdG9yOjpGbGFncworICB9OworICAKK3B1YmxpYzoKKyAgZW51bSB7CisgICAgRHN0QWxpZ25tZW50ID0gRHN0RXZhbHVhdG9yOjpBbGlnbm1lbnQsCisgICAgU3JjQWxpZ25tZW50ID0gU3JjRXZhbHVhdG9yOjpBbGlnbm1lbnQsCisgICAgRHN0SGFzRGlyZWN0QWNjZXNzID0gRHN0RmxhZ3MgJiBEaXJlY3RBY2Nlc3NCaXQsCisgICAgSm9pbnRBbGlnbm1lbnQgPSBFSUdFTl9QTEFJTl9FTlVNX01JTihEc3RBbGlnbm1lbnQsU3JjQWxpZ25tZW50KQorICB9OworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBJbm5lclNpemUgPSBpbnQoRHN0OjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KERzdDo6U2l6ZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgIDogaW50KERzdEZsYWdzKSZSb3dNYWpvckJpdCA/IGludChEc3Q6OkNvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICA6IGludChEc3Q6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBJbm5lck1heFNpemUgPSBpbnQoRHN0OjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KERzdDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgIDogaW50KERzdEZsYWdzKSZSb3dNYWpvckJpdCA/IGludChEc3Q6Ok1heENvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICA6IGludChEc3Q6Ok1heFJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBPdXRlclN0cmlkZSA9IGludChvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPERzdD46OnJldCksCisgICAgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBEc3Q6OlNpemVBdENvbXBpbGVUaW1lCisgIH07CisKKyAgLy8gVE9ETyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbmVhciB0cmF2ZXJzYWwgYW5kIGlubmVyLXRyYXZlcnNhbHMKKyAgdHlwZWRlZiB0eXBlbmFtZSBmaW5kX2Jlc3RfcGFja2V0PERzdFNjYWxhcixEc3Q6OlNpemVBdENvbXBpbGVUaW1lPjo6dHlwZSBMaW5lYXJQYWNrZXRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGZpbmRfYmVzdF9wYWNrZXQ8RHN0U2NhbGFyLElubmVyU2l6ZT46OnR5cGUgSW5uZXJQYWNrZXRUeXBlOworCisgIGVudW0geworICAgIExpbmVhclBhY2tldFNpemUgPSB1bnBhY2tldF90cmFpdHM8TGluZWFyUGFja2V0VHlwZT46OnNpemUsCisgICAgSW5uZXJQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPElubmVyUGFja2V0VHlwZT46OnNpemUKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBMaW5lYXJSZXF1aXJlZEFsaWdubWVudCA9IHVucGFja2V0X3RyYWl0czxMaW5lYXJQYWNrZXRUeXBlPjo6YWxpZ25tZW50LAorICAgIElubmVyUmVxdWlyZWRBbGlnbm1lbnQgPSB1bnBhY2tldF90cmFpdHM8SW5uZXJQYWNrZXRUeXBlPjo6YWxpZ25tZW50CisgIH07CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIERzdElzUm93TWFqb3IgPSBEc3RGbGFncyZSb3dNYWpvckJpdCwKKyAgICBTcmNJc1Jvd01ham9yID0gU3JjRmxhZ3MmUm93TWFqb3JCaXQsCisgICAgU3RvcmFnZU9yZGVyc0FncmVlID0gKGludChEc3RJc1Jvd01ham9yKSA9PSBpbnQoU3JjSXNSb3dNYWpvcikpLAorICAgIE1pZ2h0VmVjdG9yaXplID0gYm9vbChTdG9yYWdlT3JkZXJzQWdyZWUpCisgICAgICAgICAgICAgICAgICAmJiAoaW50KERzdEZsYWdzKSAmIGludChTcmNGbGFncykgJiBBY3R1YWxQYWNrZXRBY2Nlc3NCaXQpCisgICAgICAgICAgICAgICAgICAmJiBib29sKGZ1bmN0b3JfdHJhaXRzPEFzc2lnbkZ1bmM+OjpQYWNrZXRBY2Nlc3MpLAorICAgIE1heUlubmVyVmVjdG9yaXplICA9IE1pZ2h0VmVjdG9yaXplCisgICAgICAgICAgICAgICAgICAgICAgICYmIGludChJbm5lclNpemUpIT1EeW5hbWljICYmIGludChJbm5lclNpemUpJWludChJbm5lclBhY2tldFNpemUpPT0wCisgICAgICAgICAgICAgICAgICAgICAgICYmIGludChPdXRlclN0cmlkZSkhPUR5bmFtaWMgJiYgaW50KE91dGVyU3RyaWRlKSVpbnQoSW5uZXJQYWNrZXRTaXplKT09MAorICAgICAgICAgICAgICAgICAgICAgICAmJiAoRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSAgfHwgaW50KEpvaW50QWxpZ25tZW50KT49aW50KElubmVyUmVxdWlyZWRBbGlnbm1lbnQpKSwKKyAgICBNYXlMaW5lYXJpemUgPSBib29sKFN0b3JhZ2VPcmRlcnNBZ3JlZSkgJiYgKGludChEc3RGbGFncykgJiBpbnQoU3JjRmxhZ3MpICYgTGluZWFyQWNjZXNzQml0KSwKKyAgICBNYXlMaW5lYXJWZWN0b3JpemUgPSBib29sKE1pZ2h0VmVjdG9yaXplKSAmJiBNYXlMaW5lYXJpemUgJiYgRHN0SGFzRGlyZWN0QWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICYmIChFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFIHx8IChpbnQoRHN0QWxpZ25tZW50KT49aW50KExpbmVhclJlcXVpcmVkQWxpZ25tZW50KSkgfHwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyksCisgICAgICAvKiBJZiB0aGUgZGVzdGluYXRpb24gaXNuJ3QgYWxpZ25lZCwgd2UgaGF2ZSB0byBkbyBydW50aW1lIGNoZWNrcyBhbmQgd2UgZG9uJ3QgdW5yb2xsLAorICAgICAgICAgc28gaXQncyBvbmx5IGdvb2QgZm9yIGxhcmdlIGVub3VnaCBzaXplcy4gKi8KKyAgICBNYXlTbGljZVZlY3Rvcml6ZSAgPSBib29sKE1pZ2h0VmVjdG9yaXplKSAmJiBib29sKERzdEhhc0RpcmVjdEFjY2VzcykKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKGludChJbm5lck1heFNpemUpPT1EeW5hbWljIHx8IGludChJbm5lck1heFNpemUpPj0oRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRT9Jbm5lclBhY2tldFNpemU6KDMqSW5uZXJQYWNrZXRTaXplKSkpCisgICAgICAvKiBzbGljZSB2ZWN0b3JpemF0aW9uIGNhbiBiZSBzbG93LCBzbyB3ZSBvbmx5IHdhbnQgaXQgaWYgdGhlIHNsaWNlcyBhcmUgYmlnLCB3aGljaCBpcworICAgICAgICAgaW5kaWNhdGVkIGJ5IElubmVyTWF4U2l6ZSByYXRoZXIgdGhhbiBJbm5lclNpemUsIHRoaW5rIG9mIHRoZSBjYXNlIG9mIGEgZHluYW1pYyBibG9jaworICAgICAgICAgaW4gYSBmaXhlZC1zaXplIG1hdHJpeAorICAgICAgICAgSG93ZXZlciwgd2l0aCBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFIGFuZCB1bnJvbGxpbmcsIHNsaWNlIHZlY3Rvcml6YXRpb24gaXMgc3RpbGwgd29ydGggaXQgKi8KKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBUcmF2ZXJzYWwgPSBpbnQoTWF5TGluZWFyVmVjdG9yaXplKSAmJiAoTGluZWFyUGFja2V0U2l6ZT5Jbm5lclBhY2tldFNpemUpID8gaW50KExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwpCisgICAgICAgICAgICAgIDogaW50KE1heUlubmVyVmVjdG9yaXplKSAgID8gaW50KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgOiBpbnQoTWF5TGluZWFyVmVjdG9yaXplKSAgPyBpbnQoTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgOiBpbnQoTWF5U2xpY2VWZWN0b3JpemUpICAgPyBpbnQoU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICA6IGludChNYXlMaW5lYXJpemUpICAgICAgICA/IGludChMaW5lYXJUcmF2ZXJzYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KERlZmF1bHRUcmF2ZXJzYWwpLAorICAgIFZlY3Rvcml6ZWQgPSBpbnQoVHJhdmVyc2FsKSA9PSBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwKKyAgICAgICAgICAgICAgfHwgaW50KFRyYXZlcnNhbCkgPT0gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICB8fCBpbnQoVHJhdmVyc2FsKSA9PSBTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGludChUcmF2ZXJzYWwpPT1MaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBMaW5lYXJQYWNrZXRUeXBlLCBJbm5lclBhY2tldFR5cGU+Ojp0eXBlIFBhY2tldFR5cGU7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIEFjdHVhbFBhY2tldFNpemUgICAgPSBpbnQoVHJhdmVyc2FsKT09TGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA/IExpbmVhclBhY2tldFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIDogVmVjdG9yaXplZCA/IElubmVyUGFja2V0U2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgOiAxLAorICAgIFVucm9sbGluZ0xpbWl0ICAgICAgPSBFSUdFTl9VTlJPTExJTkdfTElNSVQgKiBBY3R1YWxQYWNrZXRTaXplLAorICAgIE1heVVucm9sbENvbXBsZXRlbHkgPSBpbnQoRHN0OjpTaXplQXRDb21waWxlVGltZSkgIT0gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnQoRHN0OjpTaXplQXRDb21waWxlVGltZSkgKiAoaW50KERzdEV2YWx1YXRvcjo6Q29lZmZSZWFkQ29zdCkraW50KFNyY0V2YWx1YXRvcjo6Q29lZmZSZWFkQ29zdCkpIDw9IGludChVbnJvbGxpbmdMaW1pdCksCisgICAgTWF5VW5yb2xsSW5uZXIgICAgICA9IGludChJbm5lclNpemUpICE9IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50KElubmVyU2l6ZSkgKiAoaW50KERzdEV2YWx1YXRvcjo6Q29lZmZSZWFkQ29zdCkraW50KFNyY0V2YWx1YXRvcjo6Q29lZmZSZWFkQ29zdCkpIDw9IGludChVbnJvbGxpbmdMaW1pdCkKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBVbnJvbGxpbmcgPSAoaW50KFRyYXZlcnNhbCkgPT0gaW50KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCkgfHwgaW50KFRyYXZlcnNhbCkgPT0gaW50KERlZmF1bHRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgICAgID8gKAorICAgICAgICAgICAgICAgICAgICBpbnQoTWF5VW5yb2xsQ29tcGxldGVseSkgPyBpbnQoQ29tcGxldGVVbnJvbGxpbmcpCisgICAgICAgICAgICAgICAgICA6IGludChNYXlVbnJvbGxJbm5lcikgICAgICA/IGludChJbm5lclVucm9sbGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KE5vVW5yb2xsaW5nKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICA6IGludChUcmF2ZXJzYWwpID09IGludChMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgID8gKCBib29sKE1heVVucm9sbENvbXBsZXRlbHkpICYmICggRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSB8fCAoaW50KERzdEFsaWdubWVudCk+PWludChMaW5lYXJSZXF1aXJlZEFsaWdubWVudCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludChDb21wbGV0ZVVucm9sbGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoTm9VbnJvbGxpbmcpICkKKyAgICAgICAgICAgICAgOiBpbnQoVHJhdmVyc2FsKSA9PSBpbnQoTGluZWFyVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgID8gKCBib29sKE1heVVucm9sbENvbXBsZXRlbHkpID8gaW50KENvbXBsZXRlVW5yb2xsaW5nKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChOb1Vucm9sbGluZykgKQorI2lmIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUKKyAgICAgICAgICAgICAgOiBpbnQoVHJhdmVyc2FsKSA9PSBpbnQoU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgID8gKCBib29sKE1heVVucm9sbElubmVyKSA/IGludChJbm5lclVucm9sbGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoTm9VbnJvbGxpbmcpICkKKyNlbmRpZgorICAgICAgICAgICAgICA6IGludChOb1Vucm9sbGluZykKKyAgfTsKKworI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0lHTgorICBzdGF0aWMgdm9pZCBkZWJ1ZygpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkRzdFhwcjogIiA8PCB0eXBlaWQodHlwZW5hbWUgRHN0RXZhbHVhdG9yOjpYcHJUeXBlKS5uYW1lKCkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiU3JjWHByOiAiIDw8IHR5cGVpZCh0eXBlbmFtZSBTcmNFdmFsdWF0b3I6OlhwclR5cGUpLm5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyLnNldGYoc3RkOjppb3M6OmhleCwgc3RkOjppb3M6OmJhc2VmaWVsZCk7CisgICAgc3RkOjpjZXJyIDw8ICJEc3RGbGFncyIgPDwgIiA9ICIgPDwgRHN0RmxhZ3MgPDwgIiAoIiA8PCBkZW1hbmdsZV9mbGFncyhEc3RGbGFncykgPDwgIiApIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJTcmNGbGFncyIgPDwgIiA9ICIgPDwgU3JjRmxhZ3MgPDwgIiAoIiA8PCBkZW1hbmdsZV9mbGFncyhTcmNGbGFncykgPDwgIiApIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyLnVuc2V0ZihzdGQ6Omlvczo6aGV4KTsKKyAgICBFSUdFTl9ERUJVR19WQVIoRHN0QWxpZ25tZW50KQorICAgIEVJR0VOX0RFQlVHX1ZBUihTcmNBbGlnbm1lbnQpCisgICAgRUlHRU5fREVCVUdfVkFSKExpbmVhclJlcXVpcmVkQWxpZ25tZW50KQorICAgIEVJR0VOX0RFQlVHX1ZBUihJbm5lclJlcXVpcmVkQWxpZ25tZW50KQorICAgIEVJR0VOX0RFQlVHX1ZBUihKb2ludEFsaWdubWVudCkKKyAgICBFSUdFTl9ERUJVR19WQVIoSW5uZXJTaXplKQorICAgIEVJR0VOX0RFQlVHX1ZBUihJbm5lck1heFNpemUpCisgICAgRUlHRU5fREVCVUdfVkFSKExpbmVhclBhY2tldFNpemUpCisgICAgRUlHRU5fREVCVUdfVkFSKElubmVyUGFja2V0U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoQWN0dWFsUGFja2V0U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoU3RvcmFnZU9yZGVyc0FncmVlKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNaWdodFZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5TGluZWFyaXplKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNYXlJbm5lclZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5TGluZWFyVmVjdG9yaXplKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNYXlTbGljZVZlY3Rvcml6ZSkKKyAgICBzdGQ6OmNlcnIgPDwgIlRyYXZlcnNhbCIgPDwgIiA9ICIgPDwgVHJhdmVyc2FsIDw8ICIgKCIgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKFRyYXZlcnNhbCkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICBFSUdFTl9ERUJVR19WQVIoU3JjRXZhbHVhdG9yOjpDb2VmZlJlYWRDb3N0KQorICAgIEVJR0VOX0RFQlVHX1ZBUihVbnJvbGxpbmdMaW1pdCkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5VW5yb2xsQ29tcGxldGVseSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5VW5yb2xsSW5uZXIpCisgICAgc3RkOjpjZXJyIDw8ICJVbnJvbGxpbmciIDw8ICIgPSAiIDw8IFVucm9sbGluZyA8PCAiICgiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyhVbnJvbGxpbmcpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgfQorI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgMiA6IG1ldGEtdW5yb2xsZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBEZWZhdWx0IHRyYXZlcnNhbCAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCBpbnQgSW5kZXgsIGludCBTdG9wPgorc3RydWN0IGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmcKK3sKKyAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHZlcnkgY2xlYW4sIHBlcmhhcHMgdGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbD8KKyAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OkRzdEV2YWx1YXRvclR5cGUgRHN0RXZhbHVhdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlOjpYcHJUeXBlIERzdFhwclR5cGU7CisgIAorICBlbnVtIHsKKyAgICBvdXRlciA9IEluZGV4IC8gRHN0WHByVHlwZTo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKKyAgICBpbm5lciA9IEluZGV4ICUgRHN0WHByVHlwZTo6SW5uZXJTaXplQXRDb21waWxlVGltZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAga2VybmVsLmFzc2lnbkNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBpbm5lcik7CisgICAgY29weV91c2luZ19ldmFsdWF0b3JfRGVmYXVsdFRyYXZlcnNhbF9Db21wbGV0ZVVucm9sbGluZzxLZXJuZWwsIEluZGV4KzEsIFN0b3A+OjpydW4oa2VybmVsKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCBpbnQgU3RvcD4KK3N0cnVjdCBjb3B5X3VzaW5nX2V2YWx1YXRvcl9EZWZhdWx0VHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nPEtlcm5lbCwgU3RvcCwgU3RvcD4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsJikgeyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIGludCBJbmRleF8sIGludCBTdG9wPgorc3RydWN0IGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmcKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwsIEluZGV4IG91dGVyKQorICB7CisgICAga2VybmVsLmFzc2lnbkNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBJbmRleF8pOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmc8S2VybmVsLCBJbmRleF8rMSwgU3RvcD46OnJ1bihrZXJuZWwsIG91dGVyKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCBpbnQgU3RvcD4KK3N0cnVjdCBjb3B5X3VzaW5nX2V2YWx1YXRvcl9EZWZhdWx0VHJhdmVyc2FsX0lubmVyVW5yb2xsaW5nPEtlcm5lbCwgU3RvcCwgU3RvcD4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsJiwgSW5kZXgpIHsgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqCisqKiogTGluZWFyIHRyYXZlcnNhbCAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIGludCBJbmRleCwgaW50IFN0b3A+CitzdHJ1Y3QgY29weV91c2luZ19ldmFsdWF0b3JfTGluZWFyVHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nCit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCYga2VybmVsKQorICB7CisgICAga2VybmVsLmFzc2lnbkNvZWZmKEluZGV4KTsKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcl9MaW5lYXJUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8S2VybmVsLCBJbmRleCsxLCBTdG9wPjo6cnVuKGtlcm5lbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgaW50IFN0b3A+CitzdHJ1Y3QgY29weV91c2luZ19ldmFsdWF0b3JfTGluZWFyVHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nPEtlcm5lbCwgU3RvcCwgU3RvcD4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsJikgeyB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBJbm5lciB2ZWN0b3JpemF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgaW50IEluZGV4LCBpbnQgU3RvcD4KK3N0cnVjdCBjb3B5X3VzaW5nX2V2YWx1YXRvcl9pbm5lcnZlY19Db21wbGV0ZVVucm9sbGluZworeworICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdmVyeSBjbGVhbiwgcGVyaGFwcyB0aGlzIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUga2VybmVsPworICB0eXBlZGVmIHR5cGVuYW1lIEtlcm5lbDo6RHN0RXZhbHVhdG9yVHlwZSBEc3RFdmFsdWF0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERzdEV2YWx1YXRvclR5cGU6OlhwclR5cGUgRHN0WHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKyAgCisgIGVudW0geworICAgIG91dGVyID0gSW5kZXggLyBEc3RYcHJUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgIGlubmVyID0gSW5kZXggJSBEc3RYcHJUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgIFNyY0FsaWdubWVudCA9IEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6U3JjQWxpZ25tZW50LAorICAgIERzdEFsaWdubWVudCA9IEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6RHN0QWxpZ25tZW50CisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwpCisgIHsKKyAgICBrZXJuZWwudGVtcGxhdGUgYXNzaWduUGFja2V0QnlPdXRlcklubmVyPERzdEFsaWdubWVudCwgU3JjQWxpZ25tZW50LCBQYWNrZXRUeXBlPihvdXRlciwgaW5uZXIpOworICAgIGVudW0geyBOZXh0SW5kZXggPSBJbmRleCArIHVucGFja2V0X3RyYWl0czxQYWNrZXRUeXBlPjo6c2l6ZSB9OworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX2lubmVydmVjX0NvbXBsZXRlVW5yb2xsaW5nPEtlcm5lbCwgTmV4dEluZGV4LCBTdG9wPjo6cnVuKGtlcm5lbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgaW50IFN0b3A+CitzdHJ1Y3QgY29weV91c2luZ19ldmFsdWF0b3JfaW5uZXJ2ZWNfQ29tcGxldGVVbnJvbGxpbmc8S2VybmVsLCBTdG9wLCBTdG9wPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwmKSB7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgaW50IEluZGV4XywgaW50IFN0b3AsIGludCBTcmNBbGlnbm1lbnQsIGludCBEc3RBbGlnbm1lbnQ+CitzdHJ1Y3QgY29weV91c2luZ19ldmFsdWF0b3JfaW5uZXJ2ZWNfSW5uZXJVbnJvbGxpbmcKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwsIEluZGV4IG91dGVyKQorICB7CisgICAga2VybmVsLnRlbXBsYXRlIGFzc2lnblBhY2tldEJ5T3V0ZXJJbm5lcjxEc3RBbGlnbm1lbnQsIFNyY0FsaWdubWVudCwgUGFja2V0VHlwZT4ob3V0ZXIsIEluZGV4Xyk7CisgICAgZW51bSB7IE5leHRJbmRleCA9IEluZGV4XyArIHVucGFja2V0X3RyYWl0czxQYWNrZXRUeXBlPjo6c2l6ZSB9OworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX2lubmVydmVjX0lubmVyVW5yb2xsaW5nPEtlcm5lbCwgTmV4dEluZGV4LCBTdG9wLCBTcmNBbGlnbm1lbnQsIERzdEFsaWdubWVudD46OnJ1bihrZXJuZWwsIG91dGVyKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCBpbnQgU3RvcCwgaW50IFNyY0FsaWdubWVudCwgaW50IERzdEFsaWdubWVudD4KK3N0cnVjdCBjb3B5X3VzaW5nX2V2YWx1YXRvcl9pbm5lcnZlY19Jbm5lclVucm9sbGluZzxLZXJuZWwsIFN0b3AsIFN0b3AsIFNyY0FsaWdubWVudCwgRHN0QWxpZ25tZW50PgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJiwgSW5kZXgpIHsgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQYXJ0IDMgOiBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgY2FzZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZGVuc2VfYXNzaWdubWVudF9sb29wIGlzIGJhc2VkIG9uIGFzc2lnbl9pbXBsCisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwKKyAgICAgICAgIGludCBUcmF2ZXJzYWwgPSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OlRyYXZlcnNhbCwKKyAgICAgICAgIGludCBVbnJvbGxpbmcgPSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OlVucm9sbGluZz4KK3N0cnVjdCBkZW5zZV9hc3NpZ25tZW50X2xvb3A7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBEZWZhdWx0IHRyYXZlcnNhbCAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsPgorc3RydWN0IGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIERlZmF1bHRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBFSUdFTl9TVFJPTkdfSU5MSU5FIHJ1bihLZXJuZWwgJmtlcm5lbCkKKyAgeworICAgIGZvcihJbmRleCBvdXRlciA9IDA7IG91dGVyIDwga2VybmVsLm91dGVyU2l6ZSgpOyArK291dGVyKSB7CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSAwOyBpbm5lciA8IGtlcm5lbC5pbm5lclNpemUoKTsgKytpbm5lcikgeworICAgICAgICBrZXJuZWwuYXNzaWduQ29lZmZCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbD4KK3N0cnVjdCBkZW5zZV9hc3NpZ25tZW50X2xvb3A8S2VybmVsLCBEZWZhdWx0VHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEtlcm5lbDo6RHN0RXZhbHVhdG9yVHlwZTo6WHByVHlwZSBEc3RYcHJUeXBlOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8S2VybmVsLCAwLCBEc3RYcHJUeXBlOjpTaXplQXRDb21waWxlVGltZT46OnJ1bihrZXJuZWwpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWw+CitzdHJ1Y3QgZGVuc2VfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgRGVmYXVsdFRyYXZlcnNhbCwgSW5uZXJVbnJvbGxpbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OkRzdEV2YWx1YXRvclR5cGU6OlhwclR5cGUgRHN0WHByVHlwZTsKKworICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IGtlcm5lbC5vdXRlclNpemUoKTsKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmc8S2VybmVsLCAwLCBEc3RYcHJUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lPjo6cnVuKGtlcm5lbCwgb3V0ZXIpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogTGluZWFyIHZlY3Rvcml6YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8gVGhlIGdvYWwgb2YgdW5hbGlnbmVkX2RlbnNlX2Fzc2lnbm1lbnRfbG9vcCBpcyBzaW1wbHkgdG8gZmFjdG9yaXplIHRoZSBoYW5kbGluZworLy8gb2YgdGhlIG5vbiB2ZWN0b3JpemFibGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgcGFydHMKKwordGVtcGxhdGUgPGJvb2wgSXNBbGlnbmVkID0gZmFsc2U+CitzdHJ1Y3QgdW5hbGlnbmVkX2RlbnNlX2Fzc2lnbm1lbnRfbG9vcAoreworICAvLyBpZiBJc0FsaWduZWQgPSB0cnVlLCB0aGVuIGRvIG5vdGhpbmcKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsJiwgSW5kZXgsIEluZGV4KSB7fQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCB1bmFsaWduZWRfZGVuc2VfYXNzaWdubWVudF9sb29wPGZhbHNlPgoreworICAvLyBNU1ZDIG11c3Qgbm90IGlubGluZSB0aGlzIGZ1bmN0aW9ucy4gSWYgaXQgZG9lcywgaXQgZmFpbHMgdG8gb3B0aW1pemUgdGhlCisgIC8vIHBhY2tldCBhY2Nlc3MgcGF0aC4KKyAgLy8gRklYTUUgY2hlY2sgd2hpY2ggdmVyc2lvbiBleGhpYml0cyB0aGlzIGlzc3VlCisjaWYgRUlHRU5fQ09NUF9NU1ZDCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXJuZWw+CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJmtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggZW5kKQorI2Vsc2UKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBlbmQpCisjZW5kaWYKKyAgeworICAgIGZvciAoSW5kZXggaW5kZXggPSBzdGFydDsgaW5kZXggPCBlbmQ7ICsraW5kZXgpCisgICAgICBrZXJuZWwuYXNzaWduQ29lZmYoaW5kZXgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWw+CitzdHJ1Y3QgZGVuc2VfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IGtlcm5lbC5zaXplKCk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIHJlcXVlc3RlZEFsaWdubWVudCA9IEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6TGluZWFyUmVxdWlyZWRBbGlnbm1lbnQsCisgICAgICBwYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplLAorICAgICAgZHN0SXNBbGlnbmVkID0gaW50KEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6RHN0QWxpZ25tZW50KT49aW50KHJlcXVlc3RlZEFsaWdubWVudCksCisgICAgICBkc3RBbGlnbm1lbnQgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OkFsaWduZWRPblNjYWxhciA/IGludChyZXF1ZXN0ZWRBbGlnbm1lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OkRzdEFsaWdubWVudCksCisgICAgICBzcmNBbGlnbm1lbnQgPSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OkpvaW50QWxpZ25tZW50CisgICAgfTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkU3RhcnQgPSBkc3RJc0FsaWduZWQgPyAwIDogaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQ8cmVxdWVzdGVkQWxpZ25tZW50PihrZXJuZWwuZHN0RGF0YVB0cigpLCBzaXplKTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplLWFsaWduZWRTdGFydCkvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZTsKKworICAgIHVuYWxpZ25lZF9kZW5zZV9hc3NpZ25tZW50X2xvb3A8ZHN0SXNBbGlnbmVkIT0wPjo6cnVuKGtlcm5lbCwgMCwgYWxpZ25lZFN0YXJ0KTsKKworICAgIGZvcihJbmRleCBpbmRleCA9IGFsaWduZWRTdGFydDsgaW5kZXggPCBhbGlnbmVkRW5kOyBpbmRleCArPSBwYWNrZXRTaXplKQorICAgICAga2VybmVsLnRlbXBsYXRlIGFzc2lnblBhY2tldDxkc3RBbGlnbm1lbnQsIHNyY0FsaWdubWVudCwgUGFja2V0VHlwZT4oaW5kZXgpOworCisgICAgdW5hbGlnbmVkX2RlbnNlX2Fzc2lnbm1lbnRfbG9vcDw+OjpydW4oa2VybmVsLCBhbGlnbmVkRW5kLCBzaXplKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsPgorc3RydWN0IGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJmtlcm5lbCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpEc3RFdmFsdWF0b3JUeXBlOjpYcHJUeXBlIERzdFhwclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKyAgICAKKyAgICBlbnVtIHsgc2l6ZSA9IERzdFhwclR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICBwYWNrZXRTaXplID11bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUsCisgICAgICAgICAgIGFsaWduZWRTaXplID0gKHNpemUvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZSB9OworCisgICAgY29weV91c2luZ19ldmFsdWF0b3JfaW5uZXJ2ZWNfQ29tcGxldGVVbnJvbGxpbmc8S2VybmVsLCAwLCBhbGlnbmVkU2l6ZT46OnJ1bihrZXJuZWwpOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8S2VybmVsLCBhbGlnbmVkU2l6ZSwgc2l6ZT46OnJ1bihrZXJuZWwpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBJbm5lciB2ZWN0b3JpemF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbD4KK3N0cnVjdCBkZW5zZV9hc3NpZ25tZW50X2xvb3A8S2VybmVsLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPgoreworICB0eXBlZGVmIHR5cGVuYW1lIEtlcm5lbDo6UGFja2V0VHlwZSBQYWNrZXRUeXBlOworICBlbnVtIHsKKyAgICBTcmNBbGlnbm1lbnQgPSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OlNyY0FsaWdubWVudCwKKyAgICBEc3RBbGlnbm1lbnQgPSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OkRzdEFsaWdubWVudAorICB9OworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJmtlcm5lbCkKKyAgeworICAgIGNvbnN0IEluZGV4IGlubmVyU2l6ZSA9IGtlcm5lbC5pbm5lclNpemUoKTsKKyAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBrZXJuZWwub3V0ZXJTaXplKCk7CisgICAgY29uc3QgSW5kZXggcGFja2V0U2l6ZSA9IHVucGFja2V0X3RyYWl0czxQYWNrZXRUeXBlPjo6c2l6ZTsKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICAgIGZvcihJbmRleCBpbm5lciA9IDA7IGlubmVyIDwgaW5uZXJTaXplOyBpbm5lcis9cGFja2V0U2l6ZSkKKyAgICAgICAga2VybmVsLnRlbXBsYXRlIGFzc2lnblBhY2tldEJ5T3V0ZXJJbm5lcjxEc3RBbGlnbm1lbnQsIFNyY0FsaWdubWVudCwgUGFja2V0VHlwZT4ob3V0ZXIsIGlubmVyKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsPgorc3RydWN0IGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OkRzdEV2YWx1YXRvclR5cGU6OlhwclR5cGUgRHN0WHByVHlwZTsKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcl9pbm5lcnZlY19Db21wbGV0ZVVucm9sbGluZzxLZXJuZWwsIDAsIERzdFhwclR5cGU6OlNpemVBdENvbXBpbGVUaW1lPjo6cnVuKGtlcm5lbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbD4KK3N0cnVjdCBkZW5zZV9hc3NpZ25tZW50X2xvb3A8S2VybmVsLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIElubmVyVW5yb2xsaW5nPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJmtlcm5lbCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpEc3RFdmFsdWF0b3JUeXBlOjpYcHJUeXBlIERzdFhwclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHMgVHJhaXRzOworICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IGtlcm5lbC5vdXRlclNpemUoKTsKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yX2lubmVydmVjX0lubmVyVW5yb2xsaW5nPEtlcm5lbCwgMCwgRHN0WHByVHlwZTo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0czo6U3JjQWxpZ25tZW50LCBUcmFpdHM6OkRzdEFsaWdubWVudD46OnJ1bihrZXJuZWwsIG91dGVyKTsKKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqCisqKiogTGluZWFyIHRyYXZlcnNhbCAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWw+CitzdHJ1Y3QgZGVuc2VfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgTGluZWFyVHJhdmVyc2FsLCBOb1Vucm9sbGluZz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwpCisgIHsKKyAgICBjb25zdCBJbmRleCBzaXplID0ga2VybmVsLnNpemUoKTsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICBrZXJuZWwuYXNzaWduQ29lZmYoaSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbD4KK3N0cnVjdCBkZW5zZV9hc3NpZ25tZW50X2xvb3A8S2VybmVsLCBMaW5lYXJUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihLZXJuZWwgJmtlcm5lbCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpEc3RFdmFsdWF0b3JUeXBlOjpYcHJUeXBlIERzdFhwclR5cGU7CisgICAgY29weV91c2luZ19ldmFsdWF0b3JfTGluZWFyVHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nPEtlcm5lbCwgMCwgRHN0WHByVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU+OjpydW4oa2VybmVsKTsKKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2xpY2UgdmVjdG9yaXphdGlvbiAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsPgorc3RydWN0IGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIHBhY2tldFNpemUgPSB1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUsCisgICAgICByZXF1ZXN0ZWRBbGlnbm1lbnQgPSBpbnQoS2VybmVsOjpBc3NpZ25tZW50VHJhaXRzOjpJbm5lclJlcXVpcmVkQWxpZ25tZW50KSwKKyAgICAgIGFsaWduYWJsZSA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6QWxpZ25lZE9uU2NhbGFyIHx8IGludChLZXJuZWw6OkFzc2lnbm1lbnRUcmFpdHM6OkRzdEFsaWdubWVudCk+PXNpemVvZihTY2FsYXIpLAorICAgICAgZHN0SXNBbGlnbmVkID0gaW50KEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6RHN0QWxpZ25tZW50KT49aW50KHJlcXVlc3RlZEFsaWdubWVudCksCisgICAgICBkc3RBbGlnbm1lbnQgPSBhbGlnbmFibGUgPyBpbnQocmVxdWVzdGVkQWxpZ25tZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KEtlcm5lbDo6QXNzaWdubWVudFRyYWl0czo6RHN0QWxpZ25tZW50KQorICAgIH07CisgICAgY29uc3QgU2NhbGFyICpkc3RfcHRyID0ga2VybmVsLmRzdERhdGFQdHIoKTsKKyAgICBpZigoIWJvb2woZHN0SXNBbGlnbmVkKSkgJiYgKFVJbnRQdHIoZHN0X3B0cikgJSBzaXplb2YoU2NhbGFyKSk+MCkKKyAgICB7CisgICAgICAvLyB0aGUgcG9pbnRlciBpcyBub3QgYWxpZ2VuZC1vbiBzY2FsYXIsIHNvIGFsaWdubWVudCBpcyBub3QgcG9zc2libGUKKyAgICAgIHJldHVybiBkZW5zZV9hc3NpZ25tZW50X2xvb3A8S2VybmVsLERlZmF1bHRUcmF2ZXJzYWwsTm9VbnJvbGxpbmc+OjpydW4oa2VybmVsKTsKKyAgICB9CisgICAgY29uc3QgSW5kZXggcGFja2V0QWxpZ25lZE1hc2sgPSBwYWNrZXRTaXplIC0gMTsKKyAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBrZXJuZWwuaW5uZXJTaXplKCk7CisgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0ga2VybmVsLm91dGVyU2l6ZSgpOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRTdGVwID0gYWxpZ25hYmxlID8gKHBhY2tldFNpemUgLSBrZXJuZWwub3V0ZXJTdHJpZGUoKSAlIHBhY2tldFNpemUpICYgcGFja2V0QWxpZ25lZE1hc2sgOiAwOworICAgIEluZGV4IGFsaWduZWRTdGFydCA9ICgoIWFsaWduYWJsZSkgfHwgYm9vbChkc3RJc0FsaWduZWQpKSA/IDAgOiBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZDxyZXF1ZXN0ZWRBbGlnbm1lbnQ+KGRzdF9wdHIsIGlubmVyU2l6ZSk7CisKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChpbm5lclNpemUtYWxpZ25lZFN0YXJ0KSAmIH5wYWNrZXRBbGlnbmVkTWFzayk7CisgICAgICAvLyBkbyB0aGUgbm9uLXZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSAwOyBpbm5lcjxhbGlnbmVkU3RhcnQgOyArK2lubmVyKQorICAgICAgICBrZXJuZWwuYXNzaWduQ29lZmZCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsKKworICAgICAgLy8gZG8gdGhlIHZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSBhbGlnbmVkU3RhcnQ7IGlubmVyPGFsaWduZWRFbmQ7IGlubmVyKz1wYWNrZXRTaXplKQorICAgICAgICBrZXJuZWwudGVtcGxhdGUgYXNzaWduUGFja2V0QnlPdXRlcklubmVyPGRzdEFsaWdubWVudCwgVW5hbGlnbmVkLCBQYWNrZXRUeXBlPihvdXRlciwgaW5uZXIpOworCisgICAgICAvLyBkbyB0aGUgbm9uLXZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSBhbGlnbmVkRW5kOyBpbm5lcjxpbm5lclNpemUgOyArK2lubmVyKQorICAgICAgICBrZXJuZWwuYXNzaWduQ29lZmZCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsKKworICAgICAgYWxpZ25lZFN0YXJ0ID0gbnVtZXh0OjptaW5pKChhbGlnbmVkU3RhcnQrYWxpZ25lZFN0ZXApJXBhY2tldFNpemUsIGlubmVyU2l6ZSk7CisgICAgfQorICB9Cit9OworCisjaWYgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRQordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsPgorc3RydWN0IGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwgSW5uZXJVbnJvbGxpbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLZXJuZWw6OkRzdEV2YWx1YXRvclR5cGU6OlhwclR5cGUgRHN0WHByVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEtlcm5lbDo6UGFja2V0VHlwZSBQYWNrZXRUeXBlOworCisgICAgZW51bSB7IHNpemUgPSBEc3RYcHJUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICBwYWNrZXRTaXplID11bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUsCisgICAgICAgICAgIHZlY3Rvcml6YWJsZVNpemUgPSAoc2l6ZS9wYWNrZXRTaXplKSpwYWNrZXRTaXplIH07CisKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IGtlcm5lbC5vdXRlclNpemUoKTsgKytvdXRlcikKKyAgICB7CisgICAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcl9pbm5lcnZlY19Jbm5lclVucm9sbGluZzxLZXJuZWwsIDAsIHZlY3Rvcml6YWJsZVNpemUsIDAsIDA+OjpydW4oa2VybmVsLCBvdXRlcik7CisgICAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcl9EZWZhdWx0VHJhdmVyc2FsX0lubmVyVW5yb2xsaW5nPEtlcm5lbCwgdmVjdG9yaXphYmxlU2l6ZSwgc2l6ZT46OnJ1bihrZXJuZWwsIG91dGVyKTsKKyAgICB9CisgIH0KK307CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgNCA6IEdlbmVyaWMgZGVuc2UgYXNzaWdubWVudCBrZXJuZWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gVGhpcyBjbGFzcyBnZW5lcmFsaXplIHRoZSBhc3NpZ25tZW50IG9mIGEgY29lZmZpY2llbnQgKG9yIHBhY2tldCkgZnJvbSBvbmUgZGVuc2UgZXZhbHVhdG9yCisvLyB0byBhbm90aGVyIGRlbnNlIHdyaXRhYmxlIGV2YWx1YXRvci4KKy8vIEl0IGlzIHBhcmFtZXRyaXplZCBieSB0aGUgdHdvIGV2YWx1YXRvcnMsIGFuZCB0aGUgYWN0dWFsIGFzc2lnbm1lbnQgZnVuY3Rvci4KKy8vIFRoaXMgYWJzdHJhY3Rpb24gbGV2ZWwgcGVybWl0cyB0byBrZWVwIHRoZSBldmFsdWF0aW9uIGxvb3BzIGFzIHNpbXBsZSBhbmQgYXMgZ2VuZXJpYyBhcyBwb3NzaWJsZS4KKy8vIE9uZSBjYW4gY3VzdG9taXplIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoaXMgZ2VuZXJpYyBkZW5zZV9hc3NpZ25tZW50X2tlcm5lbCB3aXRoIGRpZmZlcmVudAorLy8gZnVuY3RvcnMsIG9yIGJ5IGNvbXBsZXRlbHkgb3ZlcmxvYWRpbmcgaXQsIGJ5LXBhc3NpbmcgYSBmdW5jdG9yLgordGVtcGxhdGU8dHlwZW5hbWUgRHN0RXZhbHVhdG9yVHlwZVQsIHR5cGVuYW1lIFNyY0V2YWx1YXRvclR5cGVULCB0eXBlbmFtZSBGdW5jdG9yLCBpbnQgVmVyc2lvbiA9IFNwZWNpYWxpemVkPgorY2xhc3MgZ2VuZXJpY19kZW5zZV9hc3NpZ25tZW50X2tlcm5lbAoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIERzdEV2YWx1YXRvclR5cGVUOjpYcHJUeXBlIERzdFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3JjRXZhbHVhdG9yVHlwZVQ6OlhwclR5cGUgU3JjWHByVHlwZTsKK3B1YmxpYzoKKyAgCisgIHR5cGVkZWYgRHN0RXZhbHVhdG9yVHlwZVQgRHN0RXZhbHVhdG9yVHlwZTsKKyAgdHlwZWRlZiBTcmNFdmFsdWF0b3JUeXBlVCBTcmNFdmFsdWF0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERzdEV2YWx1YXRvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgY29weV91c2luZ19ldmFsdWF0b3JfdHJhaXRzPERzdEV2YWx1YXRvclR5cGVULCBTcmNFdmFsdWF0b3JUeXBlVCwgRnVuY3Rvcj4gQXNzaWdubWVudFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBc3NpZ25tZW50VHJhaXRzOjpQYWNrZXRUeXBlIFBhY2tldFR5cGU7CisgIAorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZ2VuZXJpY19kZW5zZV9hc3NpZ25tZW50X2tlcm5lbChEc3RFdmFsdWF0b3JUeXBlICZkc3QsIGNvbnN0IFNyY0V2YWx1YXRvclR5cGUgJnNyYywgY29uc3QgRnVuY3RvciAmZnVuYywgRHN0WHByVHlwZSYgZHN0RXhwcikKKyAgICA6IG1fZHN0KGRzdCksIG1fc3JjKHNyYyksIG1fZnVuY3RvcihmdW5jKSwgbV9kc3RFeHByKGRzdEV4cHIpCisgIHsKKyAgICAjaWZkZWYgRUlHRU5fREVCVUdfQVNTSUdOCisgICAgQXNzaWdubWVudFRyYWl0czo6ZGVidWcoKTsKKyAgICAjZW5kaWYKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggc2l6ZSgpIGNvbnN0ICAgICAgICB7IHJldHVybiBtX2RzdEV4cHIuc2l6ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0ICAgeyByZXR1cm4gbV9kc3RFeHByLmlubmVyU2l6ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0ICAgeyByZXR1cm4gbV9kc3RFeHByLm91dGVyU2l6ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCAgICAgICAgeyByZXR1cm4gbV9kc3RFeHByLnJvd3MoKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBjb2xzKCkgY29uc3QgICAgICAgIHsgcmV0dXJuIG1fZHN0RXhwci5jb2xzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2RzdEV4cHIub3V0ZXJTdHJpZGUoKTsgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRHN0RXZhbHVhdG9yVHlwZSYgZHN0RXZhbHVhdG9yKCkgeyByZXR1cm4gbV9kc3Q7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgU3JjRXZhbHVhdG9yVHlwZSYgc3JjRXZhbHVhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9zcmM7IH0KKyAgCisgIC8vLyBBc3NpZ24gc3JjKHJvdyxjb2wpIHRvIGRzdChyb3csY29sKSB0aHJvdWdoIHRoZSBhc3NpZ25tZW50IGZ1bmN0b3IuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25Db2VmZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgeworICAgIG1fZnVuY3Rvci5hc3NpZ25Db2VmZihtX2RzdC5jb2VmZlJlZihyb3csY29sKSwgbV9zcmMuY29lZmYocm93LGNvbCkpOworICB9CisgIAorICAvLy8gXHNhIGFzc2lnbkNvZWZmKEluZGV4LEluZGV4KQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduQ29lZmYoSW5kZXggaW5kZXgpCisgIHsKKyAgICBtX2Z1bmN0b3IuYXNzaWduQ29lZmYobV9kc3QuY29lZmZSZWYoaW5kZXgpLCBtX3NyYy5jb2VmZihpbmRleCkpOworICB9CisgIAorICAvLy8gXHNhIGFzc2lnbkNvZWZmKEluZGV4LEluZGV4KQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduQ29lZmZCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICB7CisgICAgSW5kZXggcm93ID0gcm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsgCisgICAgSW5kZXggY29sID0gY29sSW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsgCisgICAgYXNzaWduQ29lZmYocm93LCBjb2wpOworICB9CisgIAorICAKKyAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZSwgaW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKQorICB7CisgICAgbV9mdW5jdG9yLnRlbXBsYXRlIGFzc2lnblBhY2tldDxTdG9yZU1vZGU+KCZtX2RzdC5jb2VmZlJlZihyb3csY29sKSwgbV9zcmMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdyxjb2wpKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZSwgaW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduUGFja2V0KEluZGV4IGluZGV4KQorICB7CisgICAgbV9mdW5jdG9yLnRlbXBsYXRlIGFzc2lnblBhY2tldDxTdG9yZU1vZGU+KCZtX2RzdC5jb2VmZlJlZihpbmRleCksIG1fc3JjLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCkpOworICB9CisgIAorICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25QYWNrZXRCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICB7CisgICAgSW5kZXggcm93ID0gcm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsgCisgICAgSW5kZXggY29sID0gY29sSW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKTsKKyAgICBhc3NpZ25QYWNrZXQ8U3RvcmVNb2RlLExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdywgY29sKTsKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93SW5kZXhCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlOjpFeHByZXNzaW9uVHJhaXRzIFRyYWl0czsKKyAgICByZXR1cm4gaW50KFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUpID09IDEgPyAwCisgICAgICA6IGludChUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxID8gaW5uZXIKKyAgICAgIDogaW50KERzdEV2YWx1YXRvclR5cGU6OkZsYWdzKSZSb3dNYWpvckJpdCA/IG91dGVyCisgICAgICA6IGlubmVyOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sSW5kZXhCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlOjpFeHByZXNzaW9uVHJhaXRzIFRyYWl0czsKKyAgICByZXR1cm4gaW50KFRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWUpID09IDEgPyAwCisgICAgICA6IGludChUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxID8gaW5uZXIKKyAgICAgIDogaW50KERzdEV2YWx1YXRvclR5cGU6OkZsYWdzKSZSb3dNYWpvckJpdCA/IGlubmVyCisgICAgICA6IG91dGVyOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgU2NhbGFyKiBkc3REYXRhUHRyKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2RzdEV4cHIuZGF0YSgpOworICB9CisgIAorcHJvdGVjdGVkOgorICBEc3RFdmFsdWF0b3JUeXBlJiBtX2RzdDsKKyAgY29uc3QgU3JjRXZhbHVhdG9yVHlwZSYgbV9zcmM7CisgIGNvbnN0IEZ1bmN0b3IgJm1fZnVuY3RvcjsKKyAgLy8gVE9ETyBmaW5kIGEgd2F5IHRvIGF2b2lkIHRoZSBuZWVkcyBvZiB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbgorICBEc3RYcHJUeXBlJiBtX2RzdEV4cHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgNSA6IEVudHJ5IHBvaW50IGZvciBkZW5zZSByZWN0YW5ndWxhciBhc3NpZ25tZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsdHlwZW5hbWUgU3JjWHByVHlwZSwgdHlwZW5hbWUgRnVuY3Rvcj4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK3ZvaWQgcmVzaXplX2lmX2FsbG93ZWQoRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMsIGNvbnN0IEZ1bmN0b3IgJi8qZnVuYyovKQoreworICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGRzdCk7CisgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcoc3JjKTsKKyAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCkgPT0gc3JjLnJvd3MoKSAmJiBkc3QuY29scygpID09IHNyYy5jb2xzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK3ZvaWQgcmVzaXplX2lmX2FsbG93ZWQoRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8VDEsVDI+ICYvKmZ1bmMqLykKK3sKKyAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgIEluZGV4IGRzdENvbHMgPSBzcmMuY29scygpOworICBpZigoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkpCisgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKyAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCkgPT0gZHN0Um93cyAmJiBkc3QuY29scygpID09IGRzdENvbHMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNhbGxfZGVuc2VfYXNzaWdubWVudF9sb29wKERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjLCBjb25zdCBGdW5jdG9yICZmdW5jKQoreworICB0eXBlZGVmIGV2YWx1YXRvcjxEc3RYcHJUeXBlPiBEc3RFdmFsdWF0b3JUeXBlOworICB0eXBlZGVmIGV2YWx1YXRvcjxTcmNYcHJUeXBlPiBTcmNFdmFsdWF0b3JUeXBlOworCisgIFNyY0V2YWx1YXRvclR5cGUgc3JjRXZhbHVhdG9yKHNyYyk7CisKKyAgLy8gTk9URSBUbyBwcm9wZXJseSBoYW5kbGUgQSA9IChBKkEudHJhbnNwb3NlKCkpL3Mgd2l0aCBBIHJlY3Rhbmd1bGFyLAorICAvLyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgZGVzdGluYXRpb24gYWZ0ZXIgdGhlIHNvdXJjZSBldmFsdWF0b3IgaGFzIGJlZW4gY3JlYXRlZC4KKyAgcmVzaXplX2lmX2FsbG93ZWQoZHN0LCBzcmMsIGZ1bmMpOworCisgIERzdEV2YWx1YXRvclR5cGUgZHN0RXZhbHVhdG9yKGRzdCk7CisgICAgCisgIHR5cGVkZWYgZ2VuZXJpY19kZW5zZV9hc3NpZ25tZW50X2tlcm5lbDxEc3RFdmFsdWF0b3JUeXBlLFNyY0V2YWx1YXRvclR5cGUsRnVuY3Rvcj4gS2VybmVsOworICBLZXJuZWwga2VybmVsKGRzdEV2YWx1YXRvciwgc3JjRXZhbHVhdG9yLCBmdW5jLCBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworCisgIGRlbnNlX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWw+OjpydW4oa2VybmVsKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjYWxsX2RlbnNlX2Fzc2lnbm1lbnRfbG9vcChEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKK3sKKyAgY2FsbF9kZW5zZV9hc3NpZ25tZW50X2xvb3AoZHN0LCBzcmMsIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCA2IDogR2VuZXJpYyBhc3NpZ25tZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIEJhc2VkIG9uIHRoZSByZXNwZWN0aXZlIHNoYXBlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZSwKKy8vIHRoZSBjbGFzcyBBc3NpZ25tZW50S2luZCBkZXRlcm1pbmUgdGhlIGtpbmQgb2YgYXNzaWdubWVudCBtZWNoYW5pc20uCisvLyBBc3NpZ25tZW50S2luZCBtdXN0IGRlZmluZSBhIEtpbmQgdHlwZWRlZi4KK3RlbXBsYXRlPHR5cGVuYW1lIERzdFNoYXBlLCB0eXBlbmFtZSBTcmNTaGFwZT4gc3RydWN0IEFzc2lnbm1lbnRLaW5kOworCisvLyBBc3NpZ25lbWVudCBraW5kIGRlZmluZWQgaW4gdGhpcyBmaWxlOgorc3RydWN0IERlbnNlMkRlbnNlIHt9Oworc3RydWN0IEVpZ2VuQmFzZTJFaWdlbkJhc2Uge307CisKK3RlbXBsYXRlPHR5cGVuYW1lLHR5cGVuYW1lPiBzdHJ1Y3QgQXNzaWdubWVudEtpbmQgeyB0eXBlZGVmIEVpZ2VuQmFzZTJFaWdlbkJhc2UgS2luZDsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IEFzc2lnbm1lbnRLaW5kPERlbnNlU2hhcGUsRGVuc2VTaGFwZT4geyB0eXBlZGVmIERlbnNlMkRlbnNlIEtpbmQ7IH07CisgICAgCisvLyBUaGlzIGlzIHRoZSBtYWluIGFzc2lnbm1lbnQgY2xhc3MKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yLAorICAgICAgICAgIHR5cGVuYW1lIEtpbmQgPSB0eXBlbmFtZSBBc3NpZ25tZW50S2luZDwgdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czxEc3RYcHJUeXBlPjo6U2hhcGUgLCB0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPFNyY1hwclR5cGU+OjpTaGFwZSA+OjpLaW5kLAorICAgICAgICAgIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KK3N0cnVjdCBBc3NpZ25tZW50OworCisKKy8vIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhpcyBjYWxsX2Fzc2lnbm1lbnQoKSBmdW5jdGlvbiBpcyB0byBkZWFsIHdpdGggbm9hbGlhcygpIC8gImFzc3VtZS1hbGlhc2luZyIgYW5kIGF1dG9tYXRpYyB0cmFuc3Bvc2l0aW9uLgorLy8gSW5kZWVkLCBJIChHYWVsKSB0aGluayB0aGF0IHRoaXMgY29uY2VwdCBvZiAiYXNzdW1lLWFsaWFzaW5nIiB3YXMgYSBtaXN0YWtlLCBhbmQgaXQgbWFrZXMgdGhpbmcgcXVpdGUgY29tcGxpY2F0ZWQuCisvLyBTbyB0aGlzIGludGVybWVkaWF0ZSBmdW5jdGlvbiByZW1vdmVzIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byAiYXNzdW1lLWFsaWFzaW5nIiBzdWNoIHRoYXQgQXNzaWdubWVudAorLy8gZG9lcyBub3QgaGFzIHRvIGJvdGhlciBhYm91dCB0aGVzZSBhbm5veWluZyBkZXRhaWxzLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIFNyYz4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK3ZvaWQgY2FsbF9hc3NpZ25tZW50KERzdCYgZHN0LCBjb25zdCBTcmMmIHNyYykKK3sKKyAgY2FsbF9hc3NpZ25tZW50KGRzdCwgc3JjLCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLHR5cGVuYW1lIFNyYzo6U2NhbGFyPigpKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX2Fzc2lnbm1lbnQoY29uc3QgRHN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKQoreworICBjYWxsX2Fzc2lnbm1lbnQoZHN0LCBzcmMsIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0OjpTY2FsYXIsdHlwZW5hbWUgU3JjOjpTY2FsYXI+KCkpOworfQorICAgICAgICAgICAgICAgICAgICAgCisvLyBEZWFsIHdpdGggImFzc3VtZS1hbGlhc2luZyIKK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjLCB0eXBlbmFtZSBGdW5jPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX2Fzc2lnbm1lbnQoRHN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjLCBjb25zdCBGdW5jJiBmdW5jLCB0eXBlbmFtZSBlbmFibGVfaWY8IGV2YWx1YXRvcl9hc3N1bWVfYWxpYXNpbmc8U3JjPjo6dmFsdWUsIHZvaWQqPjo6dHlwZSA9IDApCit7CisgIHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlPFNyYz46OnR5cGUgdG1wKHNyYyk7CisgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkc3QsIHRtcCwgZnVuYyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjLCB0eXBlbmFtZSBGdW5jPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX2Fzc2lnbm1lbnQoRHN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjLCBjb25zdCBGdW5jJiBmdW5jLCB0eXBlbmFtZSBlbmFibGVfaWY8IWV2YWx1YXRvcl9hc3N1bWVfYWxpYXNpbmc8U3JjPjo6dmFsdWUsIHZvaWQqPjo6dHlwZSA9IDApCit7CisgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkc3QsIHNyYywgZnVuYyk7Cit9CisKKy8vIGJ5LXBhc3MgImFzc3VtZS1hbGlhc2luZyIKKy8vIFdoZW4gdGhlcmUgaXMgbm8gYWxpYXNpbmcsIHdlIHJlcXVpcmUgdGhhdCAnZHN0JyBoYXMgYmVlbiBwcm9wZXJseSByZXNpemVkCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UsIHR5cGVuYW1lIFNyYywgdHlwZW5hbWUgRnVuYz4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK3ZvaWQgY2FsbF9hc3NpZ25tZW50KE5vQWxpYXM8RHN0LFN0b3JhZ2VCYXNlPiYgZHN0LCBjb25zdCBTcmMmIHNyYywgY29uc3QgRnVuYyYgZnVuYykKK3sKKyAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRzdC5leHByZXNzaW9uKCksIHNyYywgZnVuYyk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmMsIHR5cGVuYW1lIEZ1bmM+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCit2b2lkIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhEc3QmIGRzdCwgY29uc3QgU3JjJiBzcmMsIGNvbnN0IEZ1bmMmIGZ1bmMpCit7CisgIGVudW0geworICAgIE5lZWRUb1RyYW5zcG9zZSA9ICggICAgKGludChEc3Q6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChTcmM6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGludChEc3Q6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChTcmM6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICkgJiYgaW50KERzdDo6U2l6ZUF0Q29tcGlsZVRpbWUpICE9IDEKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOZWVkVG9UcmFuc3Bvc2UsIFRyYW5zcG9zZTxEc3Q+LCBEc3Q+Ojp0eXBlIEFjdHVhbERzdFR5cGVDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOZWVkVG9UcmFuc3Bvc2UsIFRyYW5zcG9zZTxEc3Q+LCBEc3QmPjo6dHlwZSBBY3R1YWxEc3RUeXBlOworICBBY3R1YWxEc3RUeXBlIGFjdHVhbERzdChkc3QpOworICAKKyAgLy8gVE9ETyBjaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIHBlcmZvcm0gdGhlc2UgY2hlY2tzOgorICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShEc3QpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShBY3R1YWxEc3RUeXBlQ2xlYW5lZCxTcmMpCisgIEVJR0VOX0NIRUNLX0JJTkFSWV9DT01QQVRJQklMSVkoRnVuYyx0eXBlbmFtZSBBY3R1YWxEc3RUeXBlQ2xlYW5lZDo6U2NhbGFyLHR5cGVuYW1lIFNyYzo6U2NhbGFyKTsKKyAgCisgIEFzc2lnbm1lbnQ8QWN0dWFsRHN0VHlwZUNsZWFuZWQsU3JjLEZ1bmM+OjpydW4oYWN0dWFsRHN0LCBzcmMsIGZ1bmMpOworfQordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCit2b2lkIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhEc3QmIGRzdCwgY29uc3QgU3JjJiBzcmMpCit7CisgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkc3QsIHNyYywgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3Q6OlNjYWxhcix0eXBlbmFtZSBTcmM6OlNjYWxhcj4oKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjLCB0eXBlbmFtZSBGdW5jPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXNfbm9fdHJhbnNwb3NlKERzdCYgZHN0LCBjb25zdCBTcmMmIHNyYywgY29uc3QgRnVuYyYgZnVuYykKK3sKKyAgLy8gVE9ETyBjaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIHBlcmZvcm0gdGhlc2UgY2hlY2tzOgorICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShEc3QpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShEc3QsU3JjKQorICBFSUdFTl9DSEVDS19CSU5BUllfQ09NUEFUSUJJTElZKEZ1bmMsdHlwZW5hbWUgRHN0OjpTY2FsYXIsdHlwZW5hbWUgU3JjOjpTY2FsYXIpOworCisgIEFzc2lnbm1lbnQ8RHN0LFNyYyxGdW5jPjo6cnVuKGRzdCwgc3JjLCBmdW5jKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXNfbm9fdHJhbnNwb3NlKERzdCYgZHN0LCBjb25zdCBTcmMmIHNyYykKK3sKKyAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzX25vX3RyYW5zcG9zZShkc3QsIHNyYywgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3Q6OlNjYWxhcix0eXBlbmFtZSBTcmM6OlNjYWxhcj4oKSk7Cit9CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPiB2b2lkIGNoZWNrX2Zvcl9hbGlhc2luZyhjb25zdCBEc3QgJmRzdCwgY29uc3QgU3JjICZzcmMpOworCisvLyBHZW5lcmljIERlbnNlIHRvIERlbnNlIGFzc2lnbm1lbnQKKy8vIE5vdGUgdGhhdCB0aGUgbGFzdCB0ZW1wbGF0ZSBhcmd1bWVudCAiV2VhayIgaXMgbmVlZGVkIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcGVyZm9ybQorLy8gYm90aCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uK1NGSU5BRSB3aXRob3V0IGFtYmlndW91cyBzcGVjaWFsaXphdGlvbgordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lIFdlYWs+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTcmNYcHJUeXBlLCBGdW5jdG9yLCBEZW5zZTJEZW5zZSwgV2Vhaz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IEZ1bmN0b3IgJmZ1bmMpCisgIHsKKyNpZm5kZWYgRUlHRU5fTk9fREVCVUcKKyAgICBpbnRlcm5hbDo6Y2hlY2tfZm9yX2FsaWFzaW5nKGRzdCwgc3JjKTsKKyNlbmRpZgorICAgIAorICAgIGNhbGxfZGVuc2VfYXNzaWdubWVudF9sb29wKGRzdCwgc3JjLCBmdW5jKTsKKyAgfQorfTsKKworLy8gR2VuZXJpYyBhc3NpZ25tZW50IHRocm91Z2ggZXZhbFRvLgorLy8gVE9ETzogbm90IHN1cmUgd2UgaGF2ZSB0byBrZWVwIHRoYXQgb25lLCBidXQgaXQgaGVscHMgcG9ydGluZyBjdXJyZW50IGNvZGUgdG8gbmV3IGV2YWx1YXRvciBtZWNoYW5pc20uCisvLyBOb3RlIHRoYXQgdGhlIGxhc3QgdGVtcGxhdGUgYXJndW1lbnQgIldlYWsiIGlzIG5lZWRlZCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHBlcmZvcm0KKy8vIGJvdGggcGFydGlhbCBzcGVjaWFsaXphdGlvbitTRklOQUUgd2l0aG91dCBhbWJpZ3VvdXMgc3BlY2lhbGl6YXRpb24KK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yLCB0eXBlbmFtZSBXZWFrPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3JjWHByVHlwZSwgRnVuY3RvciwgRWlnZW5CYXNlMkVpZ2VuQmFzZSwgV2Vhaz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJi8qZnVuYyovKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisKKyAgICBlaWdlbl9hc3NlcnQoZHN0LnJvd3MoKSA9PSBzcmMucm93cygpICYmIGRzdC5jb2xzKCkgPT0gc3JjLmNvbHMoKSk7CisgICAgc3JjLmV2YWxUbyhkc3QpOworICB9CisKKyAgLy8gTk9URSBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIHRlbXBsYXRlZCB0byBhdm9pZCB0aGVpciBpbnN0YW5jaWF0aW9uIGlmIG5vdCBuZWVkZWQKKyAgLy8gICAgICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWUgZXhwcmVzc2lvbnMgc3VwcG9ydHMgZXZhbFRvIG9ubHkgYW5kL29yIGhhdmUgJ3ZvaWQnIGFzIHNjYWxhciB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcmNTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLFNyY1NjYWxhclR5cGU+ICYvKmZ1bmMqLykKKyAgeworICAgIEluZGV4IGRzdFJvd3MgPSBzcmMucm93cygpOworICAgIEluZGV4IGRzdENvbHMgPSBzcmMuY29scygpOworICAgIGlmKChkc3Qucm93cygpIT1kc3RSb3dzKSB8fCAoZHN0LmNvbHMoKSE9ZHN0Q29scykpCisgICAgICBkc3QucmVzaXplKGRzdFJvd3MsIGRzdENvbHMpOworCisgICAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCkgPT0gc3JjLnJvd3MoKSAmJiBkc3QuY29scygpID09IHNyYy5jb2xzKCkpOworICAgIHNyYy5hZGRUbyhkc3QpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU3JjU2NhbGFyVHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjpzdWJfYXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcixTcmNTY2FsYXJUeXBlPiAmLypmdW5jKi8pCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKworICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpID09IHNyYy5yb3dzKCkgJiYgZHN0LmNvbHMoKSA9PSBzcmMuY29scygpKTsKKyAgICBzcmMuc3ViVG8oZHN0KTsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BU1NJR05fRVZBTFVBVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbl9NS0wuaCBiL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbl9NS0wuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzJhYjkyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQXNzaWduX01LTC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgQ29weXJpZ2h0IChDKSAyMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorIAorIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBJbnRlbChSKSBNS0wKKyAqICAgTUtMIFZNTCBzdXBwb3J0IGZvciBjb2VmZmljaWVudC13aXNlIHVuYXJ5IEVpZ2VuIGV4cHJlc3Npb25zIGxpa2UgYT1iLnNpbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fQVNTSUdOX1ZNTF9ICisjZGVmaW5lIEVJR0VOX0FTU0lHTl9WTUxfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+CitjbGFzcyB2bWxfYXNzaWduX3RyYWl0cworeworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgRHN0SGFzRGlyZWN0QWNjZXNzID0gRHN0OjpGbGFncyAmIERpcmVjdEFjY2Vzc0JpdCwKKyAgICAgIFNyY0hhc0RpcmVjdEFjY2VzcyA9IFNyYzo6RmxhZ3MgJiBEaXJlY3RBY2Nlc3NCaXQsCisgICAgICBTdG9yYWdlT3JkZXJzQWdyZWUgPSAoaW50KERzdDo6SXNSb3dNYWpvcikgPT0gaW50KFNyYzo6SXNSb3dNYWpvcikpLAorICAgICAgSW5uZXJTaXplID0gaW50KERzdDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lKSA/IGludChEc3Q6OlNpemVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgIDogaW50KERzdDo6RmxhZ3MpJlJvd01ham9yQml0ID8gaW50KERzdDo6Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgOiBpbnQoRHN0OjpSb3dzQXRDb21waWxlVGltZSksCisgICAgICBJbm5lck1heFNpemUgID0gaW50KERzdDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lKSA/IGludChEc3Q6Ok1heFNpemVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICA6IGludChEc3Q6OkZsYWdzKSZSb3dNYWpvckJpdCA/IGludChEc3Q6Ok1heENvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICA6IGludChEc3Q6Ok1heFJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICAgIE1heFNpemVBdENvbXBpbGVUaW1lID0gRHN0OjpTaXplQXRDb21waWxlVGltZSwKKworICAgICAgTWlnaHRFbmFibGVWbWwgPSBTdG9yYWdlT3JkZXJzQWdyZWUgJiYgRHN0SGFzRGlyZWN0QWNjZXNzICYmIFNyY0hhc0RpcmVjdEFjY2VzcyAmJiBTcmM6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSAmJiBEc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSwKKyAgICAgIE1pZ2h0TGluZWFyaXplID0gTWlnaHRFbmFibGVWbWwgJiYgKGludChEc3Q6OkZsYWdzKSAmIGludChTcmM6OkZsYWdzKSAmIExpbmVhckFjY2Vzc0JpdCksCisgICAgICBWbWxTaXplID0gTWlnaHRMaW5lYXJpemUgPyBNYXhTaXplQXRDb21waWxlVGltZSA6IElubmVyTWF4U2l6ZSwKKyAgICAgIExhcmdlRW5vdWdoID0gVm1sU2l6ZT09RHluYW1pYyB8fCBWbWxTaXplPj1FSUdFTl9NS0xfVk1MX1RIUkVTSE9MRAorICAgIH07CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIEVuYWJsZVZtbCA9IE1pZ2h0RW5hYmxlVm1sICYmIExhcmdlRW5vdWdoLAorICAgICAgVHJhdmVyc2FsID0gTWlnaHRMaW5lYXJpemUgPyBMaW5lYXJUcmF2ZXJzYWwgOiBEZWZhdWx0VHJhdmVyc2FsCisgICAgfTsKK307CisKKyNkZWZpbmUgRUlHRU5fUFBfRVhQQU5EKEFSRykgQVJHCisjaWYgIWRlZmluZWQgKEVJR0VOX0ZBU1RfTUFUSCkgfHwgKEVJR0VOX0ZBU1RfTUFUSCAhPSAxKQorI2RlZmluZSBFSUdFTl9WTUxNT0RFX0VYUEFORF9MQSAsIFZNTF9IQQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fVk1MTU9ERV9FWFBBTkRfTEEgLCBWTUxfTEEKKyNlbmRpZgorCisjZGVmaW5lIEVJR0VOX1ZNTE1PREVfRVhQQU5EX18gCisKKyNkZWZpbmUgRUlHRU5fVk1MTU9ERV9QUkVGSVhfTEEgdm0KKyNkZWZpbmUgRUlHRU5fVk1MTU9ERV9QUkVGSVhfXyAgdgorI2RlZmluZSBFSUdFTl9WTUxNT0RFX1BSRUZJWChWTUxNT0RFKSBFSUdFTl9DQVQoRUlHRU5fVk1MTU9ERV9QUkVGSVhfLFZNTE1PREUpCisKKyNkZWZpbmUgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTEwoRUlHRU5PUCwgVk1MT1AsIEVJR0VOVFlQRSwgVk1MVFlQRSwgVk1MTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByTmVzdGVkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIEN3aXNlVW5hcnlPcDxzY2FsYXJfIyNFSUdFTk9QIyNfb3A8RUlHRU5UWVBFPiwgU3JjWHByTmVzdGVkPiwgYXNzaWduX29wPEVJR0VOVFlQRSxFSUdFTlRZUEU+LCAgIFwKKyAgICAgICAgICAgICAgICAgICBEZW5zZTJEZW5zZSwgdHlwZW5hbWUgZW5hYmxlX2lmPHZtbF9hc3NpZ25fdHJhaXRzPERzdFhwclR5cGUsU3JjWHByTmVzdGVkPjo6RW5hYmxlVm1sPjo6dHlwZT4geyAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPHNjYWxhcl8jI0VJR0VOT1AjI19vcDxFSUdFTlRZUEU+LCBTcmNYcHJOZXN0ZWQ+IFNyY1hwclR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBhc3NpZ25fb3A8RUlHRU5UWVBFLEVJR0VOVFlQRT4gJi8qZnVuYyovKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpID09IHNyYy5yb3dzKCkgJiYgZHN0LmNvbHMoKSA9PSBzcmMuY29scygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYodm1sX2Fzc2lnbl90cmFpdHM8RHN0WHByVHlwZSxTcmNYcHJOZXN0ZWQ+OjpUcmF2ZXJzYWw9PUxpbmVhclRyYXZlcnNhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFZNTE9QKGRzdC5zaXplKCksIChjb25zdCBWTUxUWVBFKilzcmMubmVzdGVkRXhwcmVzc2lvbigpLmRhdGEoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKFZNTFRZUEUqKWRzdC5kYXRhKCkgRUlHRU5fUFBfRVhQQU5EKEVJR0VOX1ZNTE1PREVfRVhQQU5EXyMjVk1MTU9ERSkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IGRzdC5vdXRlclNpemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKEluZGV4IG91dGVyID0gMDsgb3V0ZXIgPCBvdXRlclNpemU7ICsrb3V0ZXIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNvbnN0IEVJR0VOVFlQRSAqc3JjX3B0ciA9IHNyYy5Jc1Jvd01ham9yID8gJihzcmMubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmUmVmKG91dGVyLDApKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNyYy5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmZSZWYoMCwgb3V0ZXIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBFSUdFTlRZUEUgKmRzdF9wdHIgPSBkc3QuSXNSb3dNYWpvciA/ICYoZHN0LmNvZWZmUmVmKG91dGVyLDApKSA6ICYoZHN0LmNvZWZmUmVmKDAsIG91dGVyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFZNTE9QKCBkc3QuaW5uZXJTaXplKCksIChjb25zdCBWTUxUWVBFKilzcmNfcHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKFZNTFRZUEUqKWRzdF9wdHIgRUlHRU5fUFBfRVhQQU5EKEVJR0VOX1ZNTE1PREVfRVhQQU5EXyMjVk1MTU9ERSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisKKyNkZWZpbmUgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX1JFQUwoRUlHRU5PUCwgVk1MT1AsIFZNTE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTChFSUdFTk9QLCBFSUdFTl9DQVQoRUlHRU5fVk1MTU9ERV9QUkVGSVgoVk1MTU9ERSkscyMjVk1MT1ApLCBmbG9hdCwgZmxvYXQsIFZNTE1PREUpICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMKEVJR0VOT1AsIEVJR0VOX0NBVChFSUdFTl9WTUxNT0RFX1BSRUZJWChWTUxNT0RFKSxkIyNWTUxPUCksIGRvdWJsZSwgZG91YmxlLCBWTUxNT0RFKQorCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19DUExYKEVJR0VOT1AsIFZNTE9QLCBWTUxNT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTEwoRUlHRU5PUCwgRUlHRU5fQ0FUKEVJR0VOX1ZNTE1PREVfUFJFRklYKFZNTE1PREUpLGMjI1ZNTE9QKSwgc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgVk1MTU9ERSkgXAorICBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTChFSUdFTk9QLCBFSUdFTl9DQVQoRUlHRU5fVk1MTU9ERV9QUkVGSVgoVk1MTU9ERSkseiMjVk1MT1ApLCBkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgVk1MTU9ERSkKKyAgCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhFSUdFTk9QLCBWTUxPUCwgVk1MTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX1JFQUwoRUlHRU5PUCwgVk1MT1AsIFZNTE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfQ1BMWChFSUdFTk9QLCBWTUxPUCwgVk1MTU9ERSkKKworICAKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhzaW4sICAgU2luLCAgIExBKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTKGFzaW4sICBBc2luLCAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFMoc2luaCwgIFNpbmgsICBMQSkKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhjb3MsICAgQ29zLCAgIExBKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTKGFjb3MsICBBY29zLCAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFMoY29zaCwgIENvc2gsICBMQSkKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyh0YW4sICAgVGFuLCAgIExBKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTKGF0YW4sICBBdGFuLCAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFModGFuaCwgIFRhbmgsICBMQSkKKy8vIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhhYnMsICAgQWJzLCAgICBfKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTKGV4cCwgICBFeHAsICAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFMobG9nLCAgIExuLCAgICBMQSkKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhsb2cxMCwgTG9nMTAsIExBKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTKHNxcnQsICBTcXJ0LCAgXykKKworRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX1JFQUwoc3F1YXJlLCBTcXIsICAgXykKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19DUExYKGFyZywgQXJnLCAgICAgIF8pCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfUkVBTChyb3VuZCwgUm91bmQsICBfKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX1JFQUwoZmxvb3IsIEZsb29yLCAgXykKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19SRUFMKGNlaWwsICBDZWlsLCAgIF8pCisKKyNkZWZpbmUgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1BPV19DQUxMKEVJR0VOT1AsIFZNTE9QLCBFSUdFTlRZUEUsIFZNTFRZUEUsIFZNTE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwck5lc3RlZCwgdHlwZW5hbWUgUGxhaW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgQ3dpc2VCaW5hcnlPcDxzY2FsYXJfIyNFSUdFTk9QIyNfb3A8RUlHRU5UWVBFLEVJR0VOVFlQRT4sIFNyY1hwck5lc3RlZCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxFSUdFTlRZUEU+LFBsYWluPiA+LCBhc3NpZ25fb3A8RUlHRU5UWVBFLEVJR0VOVFlQRT4sICAgIFwKKyAgICAgICAgICAgICAgICAgICBEZW5zZTJEZW5zZSwgdHlwZW5hbWUgZW5hYmxlX2lmPHZtbF9hc3NpZ25fdHJhaXRzPERzdFhwclR5cGUsU3JjWHByTmVzdGVkPjo6RW5hYmxlVm1sPjo6dHlwZT4geyAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8c2NhbGFyXyMjRUlHRU5PUCMjX29wPEVJR0VOVFlQRSxFSUdFTlRZUEU+LCBTcmNYcHJOZXN0ZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxFSUdFTlRZUEU+LFBsYWluPiA+IFNyY1hwclR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGFzc2lnbl9vcDxFSUdFTlRZUEUsRUlHRU5UWVBFPiAmLypmdW5jKi8pIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpID09IHNyYy5yb3dzKCkgJiYgZHN0LmNvbHMoKSA9PSBzcmMuY29scygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZNTFRZUEUgZXhwb25lbnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFZNTFRZUEUmPihzcmMucmhzKCkuZnVuY3RvcigpLm1fb3RoZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKHZtbF9hc3NpZ25fdHJhaXRzPERzdFhwclR5cGUsU3JjWHByTmVzdGVkPjo6VHJhdmVyc2FsPT1MaW5lYXJUcmF2ZXJzYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVk1MT1AoIGRzdC5zaXplKCksIChjb25zdCBWTUxUWVBFKilzcmMubGhzKCkuZGF0YSgpLCBleHBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKFZNTFRZUEUqKWRzdC5kYXRhKCkgRUlHRU5fUFBfRVhQQU5EKEVJR0VOX1ZNTE1PREVfRVhQQU5EXyMjVk1MTU9ERSkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gZHN0Lm91dGVyU2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKEluZGV4IG91dGVyID0gMDsgb3V0ZXIgPCBvdXRlclNpemU7ICsrb3V0ZXIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjb25zdCBFSUdFTlRZUEUgKnNyY19wdHIgPSBzcmMuSXNSb3dNYWpvciA/ICYoc3JjLmxocygpLmNvZWZmUmVmKG91dGVyLDApKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3JjLmxocygpLmNvZWZmUmVmKDAsIG91dGVyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBFSUdFTlRZUEUgKmRzdF9wdHIgPSBkc3QuSXNSb3dNYWpvciA/ICYoZHN0LmNvZWZmUmVmKG91dGVyLDApKSA6ICYoZHN0LmNvZWZmUmVmKDAsIG91dGVyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBWTUxPUCggZHN0LmlubmVyU2l6ZSgpLCAoY29uc3QgVk1MVFlQRSopc3JjX3B0ciwgZXhwb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKFZNTFRZUEUqKWRzdF9wdHIgRUlHRU5fUFBfRVhQQU5EKEVJR0VOX1ZNTE1PREVfRVhQQU5EXyMjVk1MTU9ERSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKyAgCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bXNQb3d4LCBmbG9hdCwgICAgZmxvYXQsICAgICAgICAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bWRQb3d4LCBkb3VibGUsICAgZG91YmxlLCAgICAgICAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bWNQb3d4LCBzY29tcGxleCwgTUtMX0NvbXBsZXg4LCAgTEEpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bXpQb3d4LCBkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgTEEpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FTU0lHTl9WTUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQmFuZE1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvQmFuZE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NzhjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9CYW5kTWF0cml4LmgKQEAgLTAsMCArMSwzNTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CQU5ETUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fQkFORE1BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgQmFuZE1hdHJpeEJhc2UgOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgIHB1YmxpYzoKKworICAgIGVudW0geworICAgICAgRmxhZ3MgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncywKKyAgICAgIENvZWZmUmVhZENvc3QgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0LAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIFN1cGVycyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN1cGVycywKKyAgICAgIFN1YnMgICA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN1YnMsCisgICAgICBPcHRpb25zID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6T3B0aW9ucworICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixSb3dzQXRDb21waWxlVGltZSxDb2xzQXRDb21waWxlVGltZT4gRGVuc2VNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVuc2VNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZpY2llbnRzVHlwZSBDb2VmZmljaWVudHNUeXBlOworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisKKyAgcHJvdGVjdGVkOgorICAgIGVudW0geworICAgICAgRGF0YVJvd3NBdENvbXBpbGVUaW1lID0gKChTdXBlcnMhPUR5bmFtaWMpICYmIChTdWJzIT1EeW5hbWljKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDEgKyBTdXBlcnMgKyBTdWJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEeW5hbWljLAorICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhSb3dzQXRDb21waWxlVGltZSxDb2xzQXRDb21waWxlVGltZSkKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICAKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OnJvd3M7CisgICAgdXNpbmcgQmFzZTo6Y29sczsKKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1cGVyIGRpYWdvbmFscyAqLworICAgIGlubGluZSBJbmRleCBzdXBlcnMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuc3VwZXJzKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1YiBkaWFnb25hbHMgKi8KKyAgICBpbmxpbmUgSW5kZXggc3VicygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5zdWJzKCk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdW5kZXJseWluZyBjb2VmZmljaWVudCBtYXRyaXggKi8KKyAgICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmNvZWZmcygpOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHVuZGVybHlpbmcgY29lZmZpY2llbnQgbWF0cml4ICovCisgICAgaW5saW5lIENvZWZmaWNpZW50c1R5cGUmIGNvZWZmcygpIHsgcmV0dXJuIGRlcml2ZWQoKS5jb2VmZnMoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIFxhIGkgLXRoIGNvbHVtbiwKKyAgICAgICogb25seSB0aGUgbWVhbmluZ2Z1bCBwYXJ0IGlzIHJldHVybmVkLgorICAgICAgKiBcd2FybmluZyB0aGUgaW50ZXJuYWwgc3RvcmFnZSBtdXN0IGJlIGNvbHVtbiBtYWpvci4gKi8KKyAgICBpbmxpbmUgQmxvY2s8Q29lZmZpY2llbnRzVHlwZSxEeW5hbWljLDE+IGNvbChJbmRleCBpKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE9wdGlvbnMmUm93TWFqb3IpPT0wLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUyk7CisgICAgICBJbmRleCBzdGFydCA9IDA7CisgICAgICBJbmRleCBsZW4gPSBjb2VmZnMoKS5yb3dzKCk7CisgICAgICBpZiAoaTw9c3VwZXJzKCkpCisgICAgICB7CisgICAgICAgIHN0YXJ0ID0gc3VwZXJzKCktaTsKKyAgICAgICAgbGVuID0gKHN0ZDo6bWluKShyb3dzKCksc3RkOjptYXg8SW5kZXg+KDAsY29lZmZzKCkucm93cygpIC0gKHN1cGVycygpLWkpKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpPj1yb3dzKCktc3VicygpKQorICAgICAgICBsZW4gPSBzdGQ6Om1heDxJbmRleD4oMCxjb2VmZnMoKS5yb3dzKCkgLSAoaSArIDEgLSByb3dzKCkgKyBzdWJzKCkpKTsKKyAgICAgIHJldHVybiBCbG9jazxDb2VmZmljaWVudHNUeXBlLER5bmFtaWMsMT4oY29lZmZzKCksIHN0YXJ0LCBpLCBsZW4sIDEpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsICovCisgICAgaW5saW5lIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsMSxTaXplQXRDb21waWxlVGltZT4gZGlhZ29uYWwoKQorICAgIHsgcmV0dXJuIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsMSxTaXplQXRDb21waWxlVGltZT4oY29lZmZzKCksc3VwZXJzKCksMCwxLChzdGQ6Om1pbikocm93cygpLGNvbHMoKSkpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgbWFpbiBkaWFnb25hbCAoY29uc3QgdmVyc2lvbikgKi8KKyAgICBpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgQ29lZmZpY2llbnRzVHlwZSwxLFNpemVBdENvbXBpbGVUaW1lPiBkaWFnb25hbCgpIGNvbnN0CisgICAgeyByZXR1cm4gQmxvY2s8Y29uc3QgQ29lZmZpY2llbnRzVHlwZSwxLFNpemVBdENvbXBpbGVUaW1lPihjb2VmZnMoKSxzdXBlcnMoKSwwLDEsKHN0ZDo6bWluKShyb3dzKCksY29scygpKSk7IH0KKworICAgIHRlbXBsYXRlPGludCBJbmRleD4gc3RydWN0IERpYWdvbmFsSW50UmV0dXJuVHlwZSB7CisgICAgICBlbnVtIHsKKyAgICAgICAgUmV0dXJuT3Bwb3NpdGUgPSAoT3B0aW9ucyZTZWxmQWRqb2ludCkgJiYgKCgoSW5kZXgpPjAgJiYgU3VwZXJzPT0wKSB8fCAoKEluZGV4KTwwICYmIFN1YnM9PTApKSwKKyAgICAgICAgQ29uanVnYXRlID0gUmV0dXJuT3Bwb3NpdGUgJiYgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgICAgQWN0dWFsSW5kZXggPSBSZXR1cm5PcHBvc2l0ZSA/IC1JbmRleCA6IEluZGV4LAorICAgICAgICBEaWFnb25hbFNpemUgPSAoUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgICA/IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgIDogKEFjdHVhbEluZGV4PDAKKyAgICAgICAgICAgICAgICAgICAgID8gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMoQ29sc0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lICsgQWN0dWFsSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICA6IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSAtIEFjdHVhbEluZGV4KSkKKyAgICAgIH07CisgICAgICB0eXBlZGVmIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsMSwgRGlhZ29uYWxTaXplPiBCdWlsZFR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxDb25qdWdhdGUsCisgICAgICAgICAgICAgICAgIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LEJ1aWxkVHlwZSA+LAorICAgICAgICAgICAgICAgICBCdWlsZFR5cGU+Ojp0eXBlIFR5cGU7CisgICAgfTsKKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBcYSBOIC10aCBzdWIgb3Igc3VwZXIgZGlhZ29uYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgTj4gaW5saW5lIHR5cGVuYW1lIERpYWdvbmFsSW50UmV0dXJuVHlwZTxOPjo6VHlwZSBkaWFnb25hbCgpCisgICAgeworICAgICAgcmV0dXJuIHR5cGVuYW1lIERpYWdvbmFsSW50UmV0dXJuVHlwZTxOPjo6QnVpbGRUeXBlKGNvZWZmcygpLCBzdXBlcnMoKS1OLCAoc3RkOjptYXgpKDAsTiksIDEsIGRpYWdvbmFsTGVuZ3RoKE4pKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgXGEgTiAtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsICovCisgICAgdGVtcGxhdGU8aW50IE4+IGlubGluZSBjb25zdCB0eXBlbmFtZSBEaWFnb25hbEludFJldHVyblR5cGU8Tj46OlR5cGUgZGlhZ29uYWwoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiB0eXBlbmFtZSBEaWFnb25hbEludFJldHVyblR5cGU8Tj46OkJ1aWxkVHlwZShjb2VmZnMoKSwgc3VwZXJzKCktTiwgKHN0ZDo6bWF4KSgwLE4pLCAxLCBkaWFnb25hbExlbmd0aChOKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIFxhIGkgLXRoIHN1YiBvciBzdXBlciBkaWFnb25hbCAqLworICAgIGlubGluZSBCbG9jazxDb2VmZmljaWVudHNUeXBlLDEsRHluYW1pYz4gZGlhZ29uYWwoSW5kZXggaSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoKGk8MCAmJiAtaTw9c3VicygpKSB8fCAoaT49MCAmJiBpPD1zdXBlcnMoKSkpOworICAgICAgcmV0dXJuIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsMSxEeW5hbWljPihjb2VmZnMoKSwgc3VwZXJzKCktaSwgc3RkOjptYXg8SW5kZXg+KDAsaSksIDEsIGRpYWdvbmFsTGVuZ3RoKGkpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgXGEgaSAtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsICovCisgICAgaW5saW5lIGNvbnN0IEJsb2NrPGNvbnN0IENvZWZmaWNpZW50c1R5cGUsMSxEeW5hbWljPiBkaWFnb25hbChJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoaTwwICYmIC1pPD1zdWJzKCkpIHx8IChpPj0wICYmIGk8PXN1cGVycygpKSk7CisgICAgICByZXR1cm4gQmxvY2s8Y29uc3QgQ29lZmZpY2llbnRzVHlwZSwxLER5bmFtaWM+KGNvZWZmcygpLCBzdXBlcnMoKS1pLCBzdGQ6Om1heDxJbmRleD4oMCxpKSwgMSwgZGlhZ29uYWxMZW5ndGgoaSkpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICAgIHsKKyAgICAgIGRzdC5yZXNpemUocm93cygpLGNvbHMoKSk7CisgICAgICBkc3Quc2V0WmVybygpOworICAgICAgZHN0LmRpYWdvbmFsKCkgPSBkaWFnb25hbCgpOworICAgICAgZm9yIChJbmRleCBpPTE7IGk8PXN1cGVycygpOysraSkKKyAgICAgICAgZHN0LmRpYWdvbmFsKGkpID0gZGlhZ29uYWwoaSk7CisgICAgICBmb3IgKEluZGV4IGk9MTsgaTw9c3VicygpOysraSkKKyAgICAgICAgZHN0LmRpYWdvbmFsKC1pKSA9IGRpYWdvbmFsKC1pKTsKKyAgICB9CisKKyAgICBEZW5zZU1hdHJpeFR5cGUgdG9EZW5zZU1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgRGVuc2VNYXRyaXhUeXBlIHJlcyhyb3dzKCksY29scygpKTsKKyAgICAgIGV2YWxUbyhyZXMpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgaW5saW5lIEluZGV4IGRpYWdvbmFsTGVuZ3RoKEluZGV4IGkpIGNvbnN0CisgICAgeyByZXR1cm4gaTwwID8gKHN0ZDo6bWluKShjb2xzKCkscm93cygpK2kpIDogKHN0ZDo6bWluKShyb3dzKCksY29scygpLWkpOyB9Cit9OworCisvKioKKyAgKiBcY2xhc3MgQmFuZE1hdHJpeAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIG1hdHJpeCB3aXRoIGEgYmFuZGVkIHN0b3JhZ2UKKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciBOdW1lcmljIHR5cGUsIGkuZS4gZmxvYXQsIGRvdWJsZSwgaW50CisgICogXHRwYXJhbSBfUm93cyBOdW1iZXIgb2Ygcm93cywgb3IgXGIgRHluYW1pYworICAqIFx0cGFyYW0gX0NvbHMgTnVtYmVyIG9mIGNvbHVtbnMsIG9yIFxiIER5bmFtaWMKKyAgKiBcdHBhcmFtIF9TdXBlcnMgTnVtYmVyIG9mIHN1cGVyIGRpYWdvbmFsCisgICogXHRwYXJhbSBfU3VicyBOdW1iZXIgb2Ygc3ViIGRpYWdvbmFsCisgICogXHRwYXJhbSBfT3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIGVpdGhlciBcYiAjUm93TWFqb3Igb3IgXGIgI0NvbE1ham9yLCBhbmQgb2YgXGIgI1NlbGZBZGpvaW50CisgICogICAgICAgICAgICAgICAgICBUaGUgZm9ybWVyIGNvbnRyb2xzIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJzdG9yYWdlIG9yZGVyIiwgYW5kIGRlZmF1bHRzIHRvCisgICogICAgICAgICAgICAgICAgICBjb2x1bW4tbWFqb3IuIFRoZSBsYXR0ZXIgY29udHJvbHMgd2hldGhlciB0aGUgbWF0cml4IHJlcHJlc2VudHMgYSBzZWxmYWRqb2ludAorICAqICAgICAgICAgICAgICAgICAgbWF0cml4IGluIHdoaWNoIGNhc2UgZWl0aGVyIFN1cGVycyBvZiBTdWJzIGhhdmUgdG8gYmUgbnVsbC4KKyAgKgorICAqIFxzYSBjbGFzcyBUcmlkaWFnb25hbE1hdHJpeAorICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9TdXBlcnMsIGludCBfU3VicywgaW50IF9PcHRpb25zPgorc3RydWN0IHRyYWl0czxCYW5kTWF0cml4PF9TY2FsYXIsX1Jvd3MsX0NvbHMsX1N1cGVycyxfU3VicyxfT3B0aW9ucz4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIERlbnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBTdG9yYWdlSW5kZXg7CisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhZENvc3QsCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBfUm93cywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IF9Db2xzLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gX1Jvd3MsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfQ29scywKKyAgICBGbGFncyA9IEx2YWx1ZUJpdCwKKyAgICBTdXBlcnMgPSBfU3VwZXJzLAorICAgIFN1YnMgPSBfU3VicywKKyAgICBPcHRpb25zID0gX09wdGlvbnMsCisgICAgRGF0YVJvd3NBdENvbXBpbGVUaW1lID0gKChTdXBlcnMhPUR5bmFtaWMpICYmIChTdWJzIT1EeW5hbWljKSkgPyAxICsgU3VwZXJzICsgU3VicyA6IER5bmFtaWMKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERhdGFSb3dzQXRDb21waWxlVGltZSxDb2xzQXRDb21waWxlVGltZSxPcHRpb25zJlJvd01ham9yP1Jvd01ham9yOkNvbE1ham9yPiBDb2VmZmljaWVudHNUeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgU3VwZXJzLCBpbnQgU3VicywgaW50IE9wdGlvbnM+CitjbGFzcyBCYW5kTWF0cml4IDogcHVibGljIEJhbmRNYXRyaXhCYXNlPEJhbmRNYXRyaXg8X1NjYWxhcixSb3dzLENvbHMsU3VwZXJzLFN1YnMsT3B0aW9ucz4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QmFuZE1hdHJpeD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEJhbmRNYXRyaXg+OjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxCYW5kTWF0cml4Pjo6Q29lZmZpY2llbnRzVHlwZSBDb2VmZmljaWVudHNUeXBlOworCisgICAgZXhwbGljaXQgaW5saW5lIEJhbmRNYXRyaXgoSW5kZXggcm93cz1Sb3dzLCBJbmRleCBjb2xzPUNvbHMsIEluZGV4IHN1cGVycz1TdXBlcnMsIEluZGV4IHN1YnM9U3VicykKKyAgICAgIDogbV9jb2VmZnMoMStzdXBlcnMrc3Vicyxjb2xzKSwKKyAgICAgICAgbV9yb3dzKHJvd3MpLCBtX3N1cGVycyhzdXBlcnMpLCBtX3N1YnMoc3VicykKKyAgICB7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzLnZhbHVlKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLmNvbHMoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VwZXIgZGlhZ29uYWxzICovCisgICAgaW5saW5lIEluZGV4IHN1cGVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VwZXJzLnZhbHVlKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1YiBkaWFnb25hbHMgKi8KKyAgICBpbmxpbmUgSW5kZXggc3VicygpIGNvbnN0IHsgcmV0dXJuIG1fc3Vicy52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKyAgICBpbmxpbmUgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBDb2VmZmljaWVudHNUeXBlIG1fY29lZmZzOworICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzPiAgIG1fcm93czsKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU3VwZXJzPiBtX3N1cGVyczsKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU3Vicz4gICBtX3N1YnM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29lZmZpY2llbnRzVHlwZSxpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9TdXBlcnMsIGludCBfU3VicyxpbnQgX09wdGlvbnM+CitjbGFzcyBCYW5kTWF0cml4V3JhcHBlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGUsaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3VwZXJzLCBpbnQgX1N1YnMsaW50IF9PcHRpb25zPgorc3RydWN0IHRyYWl0czxCYW5kTWF0cml4V3JhcHBlcjxfQ29lZmZpY2llbnRzVHlwZSxfUm93cyxfQ29scyxfU3VwZXJzLF9TdWJzLF9PcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIF9Db2VmZmljaWVudHNUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gaW50ZXJuYWw6OnRyYWl0czxfQ29lZmZpY2llbnRzVHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBfUm93cywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IF9Db2xzLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gX1Jvd3MsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfQ29scywKKyAgICBGbGFncyA9IEx2YWx1ZUJpdCwKKyAgICBTdXBlcnMgPSBfU3VwZXJzLAorICAgIFN1YnMgPSBfU3VicywKKyAgICBPcHRpb25zID0gX09wdGlvbnMsCisgICAgRGF0YVJvd3NBdENvbXBpbGVUaW1lID0gKChTdXBlcnMhPUR5bmFtaWMpICYmIChTdWJzIT1EeW5hbWljKSkgPyAxICsgU3VwZXJzICsgU3VicyA6IER5bmFtaWMKKyAgfTsKKyAgdHlwZWRlZiBfQ29lZmZpY2llbnRzVHlwZSBDb2VmZmljaWVudHNUeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGUsaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3VwZXJzLCBpbnQgX1N1YnMsaW50IF9PcHRpb25zPgorY2xhc3MgQmFuZE1hdHJpeFdyYXBwZXIgOiBwdWJsaWMgQmFuZE1hdHJpeEJhc2U8QmFuZE1hdHJpeFdyYXBwZXI8X0NvZWZmaWNpZW50c1R5cGUsX1Jvd3MsX0NvbHMsX1N1cGVycyxfU3VicyxfT3B0aW9ucz4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QmFuZE1hdHJpeFdyYXBwZXI+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxCYW5kTWF0cml4V3JhcHBlcj46OkNvZWZmaWNpZW50c1R5cGUgQ29lZmZpY2llbnRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QmFuZE1hdHJpeFdyYXBwZXI+OjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworCisgICAgZXhwbGljaXQgaW5saW5lIEJhbmRNYXRyaXhXcmFwcGVyKGNvbnN0IENvZWZmaWNpZW50c1R5cGUmIGNvZWZmcywgSW5kZXggcm93cz1fUm93cywgSW5kZXggY29scz1fQ29scywgSW5kZXggc3VwZXJzPV9TdXBlcnMsIEluZGV4IHN1YnM9X1N1YnMpCisgICAgICA6IG1fY29lZmZzKGNvZWZmcyksCisgICAgICAgIG1fcm93cyhyb3dzKSwgbV9zdXBlcnMoc3VwZXJzKSwgbV9zdWJzKHN1YnMpCisgICAgeworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGNvbHMpOworICAgICAgLy9pbnRlcm5hbDo6YXNzZXJ0KGNvZWZmcy5jb2xzKCk9PWNvbHMoKSAmJiAoc3VwZXJzKCkrc3VicygpKzEpPT1jb2VmZnMucm93cygpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zICovCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3MudmFsdWUoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyAqLworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMuY29scygpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBzdXBlciBkaWFnb25hbHMgKi8KKyAgICBpbmxpbmUgSW5kZXggc3VwZXJzKCkgY29uc3QgeyByZXR1cm4gbV9zdXBlcnMudmFsdWUoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViIGRpYWdvbmFscyAqLworICAgIGlubGluZSBJbmRleCBzdWJzKCkgY29uc3QgeyByZXR1cm4gbV9zdWJzLnZhbHVlKCk7IH0KKworICAgIGlubGluZSBjb25zdCBDb2VmZmljaWVudHNUeXBlJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIGNvbnN0IENvZWZmaWNpZW50c1R5cGUmIG1fY29lZmZzOworICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBfUm93cz4gICBtX3Jvd3M7CisgICAgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIF9TdXBlcnM+IG1fc3VwZXJzOworICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBfU3Vicz4gICBtX3N1YnM7Cit9OworCisvKioKKyAgKiBcY2xhc3MgVHJpZGlhZ29uYWxNYXRyaXgKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFJlcHJlc2VudHMgYSB0cmlkaWFnb25hbCBtYXRyaXggd2l0aCBhIGNvbXBhY3QgYmFuZGVkIHN0b3JhZ2UKKyAgKgorICAqIFx0cGFyYW0gU2NhbGFyIE51bWVyaWMgdHlwZSwgaS5lLiBmbG9hdCwgZG91YmxlLCBpbnQKKyAgKiBcdHBhcmFtIFNpemUgTnVtYmVyIG9mIHJvd3MgYW5kIGNvbHMsIG9yIFxiIER5bmFtaWMKKyAgKiBcdHBhcmFtIE9wdGlvbnMgQ2FuIGJlIDAgb3IgXGIgU2VsZkFkam9pbnQKKyAgKgorICAqIFxzYSBjbGFzcyBCYW5kTWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTaXplLCBpbnQgT3B0aW9ucz4KK2NsYXNzIFRyaWRpYWdvbmFsTWF0cml4IDogcHVibGljIEJhbmRNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZSxPcHRpb25zJlNlbGZBZGpvaW50PzA6MSwxLE9wdGlvbnN8Um93TWFqb3I+Cit7CisgICAgdHlwZWRlZiBCYW5kTWF0cml4PFNjYWxhcixTaXplLFNpemUsT3B0aW9ucyZTZWxmQWRqb2ludD8wOjEsMSxPcHRpb25zfFJvd01ham9yPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFRyaWRpYWdvbmFsTWF0cml4KEluZGV4IHNpemUgPSBTaXplKSA6IEJhc2Uoc2l6ZSxzaXplLE9wdGlvbnMmU2VsZkFkam9pbnQ/MDoxLDEpIHt9CisKKyAgICBpbmxpbmUgdHlwZW5hbWUgQmFzZTo6dGVtcGxhdGUgRGlhZ29uYWxJbnRSZXR1cm5UeXBlPDE+OjpUeXBlIHN1cGVyKCkKKyAgICB7IHJldHVybiBCYXNlOjp0ZW1wbGF0ZSBkaWFnb25hbDwxPigpOyB9CisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIEJhc2U6OnRlbXBsYXRlIERpYWdvbmFsSW50UmV0dXJuVHlwZTwxPjo6VHlwZSBzdXBlcigpIGNvbnN0CisgICAgeyByZXR1cm4gQmFzZTo6dGVtcGxhdGUgZGlhZ29uYWw8MT4oKTsgfQorICAgIGlubGluZSB0eXBlbmFtZSBCYXNlOjp0ZW1wbGF0ZSBEaWFnb25hbEludFJldHVyblR5cGU8LTE+OjpUeXBlIHN1YigpCisgICAgeyByZXR1cm4gQmFzZTo6dGVtcGxhdGUgZGlhZ29uYWw8LTE+KCk7IH0KKyAgICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgQmFzZTo6dGVtcGxhdGUgRGlhZ29uYWxJbnRSZXR1cm5UeXBlPC0xPjo6VHlwZSBzdWIoKSBjb25zdAorICAgIHsgcmV0dXJuIEJhc2U6OnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpOyB9CisgIHByb3RlY3RlZDoKK307CisKKworc3RydWN0IEJhbmRTaGFwZSB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3VwZXJzLCBpbnQgX1N1YnMsIGludCBfT3B0aW9ucz4KK3N0cnVjdCBldmFsdWF0b3JfdHJhaXRzPEJhbmRNYXRyaXg8X1NjYWxhcixfUm93cyxfQ29scyxfU3VwZXJzLF9TdWJzLF9PcHRpb25zPiA+CisgIDogcHVibGljIGV2YWx1YXRvcl90cmFpdHNfYmFzZTxCYW5kTWF0cml4PF9TY2FsYXIsX1Jvd3MsX0NvbHMsX1N1cGVycyxfU3VicyxfT3B0aW9ucz4gPgoreworICB0eXBlZGVmIEJhbmRTaGFwZSBTaGFwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9Db2VmZmljaWVudHNUeXBlLGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N1cGVycywgaW50IF9TdWJzLGludCBfT3B0aW9ucz4KK3N0cnVjdCBldmFsdWF0b3JfdHJhaXRzPEJhbmRNYXRyaXhXcmFwcGVyPF9Db2VmZmljaWVudHNUeXBlLF9Sb3dzLF9Db2xzLF9TdXBlcnMsX1N1YnMsX09wdGlvbnM+ID4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yX3RyYWl0c19iYXNlPEJhbmRNYXRyaXhXcmFwcGVyPF9Db2VmZmljaWVudHNUeXBlLF9Sb3dzLF9Db2xzLF9TdXBlcnMsX1N1YnMsX09wdGlvbnM+ID4KK3sKKyAgdHlwZWRlZiBCYW5kU2hhcGUgU2hhcGU7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxEZW5zZVNoYXBlLEJhbmRTaGFwZT4geyB0eXBlZGVmIEVpZ2VuQmFzZTJFaWdlbkJhc2UgS2luZDsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkFORE1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9CbG9jay5oIGIvRWlnZW4vc3JjL0NvcmUvQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRlNDVjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQmxvY2suaApAQCAtMCwwICsxLDQ1MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkxPQ0tfSAorI2RlZmluZSBFSUdFTl9CTE9DS19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsPgorc3RydWN0IHRyYWl0czxCbG9jazxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gPiA6IHRyYWl0czxYcHJUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6WHByS2luZCBYcHJLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHJlZl9zZWxlY3RvcjxYcHJUeXBlPjo6dHlwZSBYcHJUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8WHByVHlwZU5lc3RlZD46OnR5cGUgX1hwclR5cGVOZXN0ZWQ7CisgIGVudW17CisgICAgTWF0cml4Um93cyA9IHRyYWl0czxYcHJUeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF0cml4Q29scyA9IHRyYWl0czxYcHJUeXBlPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhSb3dzID09IDAgPyAwIDogQmxvY2tSb3dzLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4Q29scyA9PSAwID8gMCA6IEJsb2NrQ29scywKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IEJsb2NrUm93cz09MCA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvd3NBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgPyBpbnQoUm93c0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQodHJhaXRzPFhwclR5cGU+OjpNYXhSb3dzQXRDb21waWxlVGltZSksCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBCbG9ja0NvbHM9PTAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xzQXRDb21waWxlVGltZSAhPSBEeW5hbWljID8gaW50KENvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KHRyYWl0czxYcHJUeXBlPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpLAorCisgICAgWHByVHlwZUlzUm93TWFqb3IgPSAoaW50KHRyYWl0czxYcHJUeXBlPjo6RmxhZ3MpJlJvd01ham9yQml0KSAhPSAwLAorICAgIElzUm93TWFqb3IgPSAoTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEmJk1heENvbHNBdENvbXBpbGVUaW1lIT0xKSA/IDEKKyAgICAgICAgICAgICAgIDogKE1heENvbHNBdENvbXBpbGVUaW1lPT0xJiZNYXhSb3dzQXRDb21waWxlVGltZSE9MSkgPyAwCisgICAgICAgICAgICAgICA6IFhwclR5cGVJc1Jvd01ham9yLAorICAgIEhhc1NhbWVTdG9yYWdlT3JkZXJBc1hwclR5cGUgPSAoSXNSb3dNYWpvciA9PSBYcHJUeXBlSXNSb3dNYWpvciksCisgICAgSW5uZXJTaXplID0gSXNSb3dNYWpvciA/IGludChDb2xzQXRDb21waWxlVGltZSkgOiBpbnQoUm93c0F0Q29tcGlsZVRpbWUpLAorICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IEhhc1NhbWVTdG9yYWdlT3JkZXJBc1hwclR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxYcHJUeXBlPjo6cmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPFhwclR5cGU+OjpyZXQpLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IEhhc1NhbWVTdG9yYWdlT3JkZXJBc1hwclR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQob3V0ZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxYcHJUeXBlPjo6cmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPFhwclR5cGU+OjpyZXQpLAorCisgICAgLy8gRklYTUUsIHRoaXMgdHJhaXRzIGlzIHJhdGhlciBzcGVjaWFsaXplZCBmb3IgZGVuc2Ugb2JqZWN0IGFuZCBpdCBuZWVkcyB0byBiZSBjbGVhbmVkIGZ1cnRoZXIKKyAgICBGbGFnc0x2YWx1ZUJpdCA9IGlzX2x2YWx1ZTxYcHJUeXBlPjo6dmFsdWUgPyBMdmFsdWVCaXQgOiAwLAorICAgIEZsYWdzUm93TWFqb3JCaXQgPSBJc1Jvd01ham9yID8gUm93TWFqb3JCaXQgOiAwLAorICAgIEZsYWdzID0gKHRyYWl0czxYcHJUeXBlPjo6RmxhZ3MgJiAoRGlyZWN0QWNjZXNzQml0IHwgKElubmVyUGFuZWw/Q29tcHJlc3NlZEFjY2Vzc0JpdDowKSkpIHwgRmxhZ3NMdmFsdWVCaXQgfCBGbGFnc1Jvd01ham9yQml0LAorICAgIC8vIEZJWE1FIERpcmVjdEFjY2Vzc0JpdCBzaG91bGQgbm90IGJlIGhhbmRsZWQgYnkgZXhwcmVzc2lvbnMKKyAgICAvLyAKKyAgICAvLyBBbGlnbm1lbnQgaXMgbmVlZGVkIGJ5IE1hcEJhc2UncyBhc3NlcnRpb25zCisgICAgLy8gV2UgY2FuIHNlZmVseSBzZXQgaXQgdG8gZmFsc2UgaGVyZS4gSW50ZXJuYWwgYWxpZ25tZW50IGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIGJ5IGFuIGVpZ2VuX2ludGVybmFsX2Fzc2VydCBpbiB0aGUgcmVzcGVjdGl2ZSBldmFsdWF0b3IKKyAgICBBbGlnbm1lbnQgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgQmxvY2tSb3dzPUR5bmFtaWMsIGludCBCbG9ja0NvbHM9RHluYW1pYywgYm9vbCBJbm5lclBhbmVsID0gZmFsc2UsCisgICAgICAgICBib29sIEhhc0RpcmVjdEFjY2VzcyA9IGludGVybmFsOjpoYXNfZGlyZWN0X2FjY2VzczxYcHJUeXBlPjo6cmV0PiBjbGFzcyBCbG9ja0ltcGxfZGVuc2U7CisgICAgICAgICAKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWwsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPiBjbGFzcyBCbG9ja0ltcGw7CisKKy8qKiBcY2xhc3MgQmxvY2sKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIG9yIGR5bmFtaWMtc2l6ZSBibG9jaworICAqCisgICogXHRwYXJhbSBYcHJUeXBlIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGluIHdoaWNoIHdlIGFyZSB0YWtpbmcgYSBibG9jaworICAqIFx0cGFyYW0gQmxvY2tSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgYmxvY2sgd2UgYXJlIHRha2luZyBhdCBjb21waWxlIHRpbWUgKG9wdGlvbmFsKQorICAqIFx0cGFyYW0gQmxvY2tDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgYmxvY2sgd2UgYXJlIHRha2luZyBhdCBjb21waWxlIHRpbWUgKG9wdGlvbmFsKQorICAqIFx0cGFyYW0gSW5uZXJQYW5lbCBpcyB0cnVlLCBpZiB0aGUgYmxvY2sgbWFwcyB0byBhIHNldCBvZiByb3dzIG9mIGEgcm93IG1ham9yIG1hdHJpeCBvcgorICAqICAgICAgICAgdG8gc2V0IG9mIGNvbHVtbnMgb2YgYSBjb2x1bW4gbWFqb3IgbWF0cml4IChvcHRpb25hbCkuIFRoZSBwYXJhbWV0ZXIgYWxsb3dzIHRvIGRldGVybWluZQorICAqICAgICAgICAgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYWxpZ25lZCBhY2Nlc3MgaXMgcG9zc2libGUgb24gdGhlIGJsb2NrIGV4cHJlc3Npb24uCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiBlaXRoZXIgYSBmaXhlZC1zaXplIG9yIGR5bmFtaWMtc2l6ZSBibG9jay4gSXQgaXMgdGhlIHJldHVybgorICAqIHR5cGUgb2YgRGVuc2VCYXNlOjpibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkgYW5kIERlbnNlQmFzZTo6YmxvY2s8aW50LGludD4oSW5kZXgsSW5kZXgpIGFuZAorICAqIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIGRpcmVjdGx5IG1hbmlwdXRhdGUgYmxvY2sgZXhwcmVzc2lvbnMsCisgICogZm9yIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gZXhwcmVzc2lvbiwgeW91CisgICogd2lsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgorICAqCisgICogSGVyZSBpcyBhbiBleGFtcGxlIGlsbHVzdHJhdGluZyB0aGUgZHluYW1pYyBjYXNlOgorICAqIFxpbmNsdWRlIGNsYXNzX0Jsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0Jsb2NrLm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhpcyBleHByZXNzaW9uIGhhcyBkeW5hbWljIHNpemUsIGluIHRoZSBjYXNlIHdoZXJlIFxhIFhwclR5cGUKKyAgKiBoYXMgZml4ZWQgc2l6ZSwgdGhpcyBleHByZXNzaW9uIGluaGVyaXRzIGEgZml4ZWQgbWF4aW1hbCBzaXplIHdoaWNoIG1lYW5zIHRoYXQgZXZhbHVhdGluZworICAqIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBpbGx1c3RyYXRpbmcgdGhlIGZpeGVkLXNpemUgY2FzZToKKyAgKiBcaW5jbHVkZSBjbGFzc19GaXhlZEJsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0ZpeGVkQmxvY2sub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCksIERlbnNlQmFzZTo6YmxvY2soSW5kZXgsSW5kZXgpLCBjbGFzcyBWZWN0b3JCbG9jaworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsPiBjbGFzcyBCbG9jaworICA6IHB1YmxpYyBCbG9ja0ltcGw8WHByVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWwsIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8WHByVHlwZT46OlN0b3JhZ2VLaW5kPgoreworICAgIHR5cGVkZWYgQmxvY2tJbXBsPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsLCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpTdG9yYWdlS2luZD4gSW1wbDsKKyAgcHVibGljOgorICAgIC8vdHlwZWRlZiB0eXBlbmFtZSBJbXBsOjpCYXNlIEJhc2U7CisgICAgdHlwZWRlZiBJbXBsIEJhc2U7CisgICAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKEJsb2NrKQorICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoQmxvY2spCisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxYcHJUeXBlPjo6dHlwZSBOZXN0ZWRFeHByZXNzaW9uOworICAKKyAgICAvKiogQ29sdW1uIG9yIFJvdyBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsIEluZGV4IGkpIDogSW1wbCh4cHIsaSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoIChpPj0wKSAmJiAoCisgICAgICAgICAgKChCbG9ja1Jvd3M9PTEpICYmIChCbG9ja0NvbHM9PVhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSAmJiBpPHhwci5yb3dzKCkpCisgICAgICAgIHx8KChCbG9ja1Jvd3M9PVhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSAmJiAoQmxvY2tDb2xzPT0xKSAmJiBpPHhwci5jb2xzKCkpKSk7CisgICAgfQorCisgICAgLyoqIEZpeGVkLXNpemUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgQmxvY2soWHByVHlwZSYgeHByLCBJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wpCisgICAgICA6IEltcGwoeHByLCBzdGFydFJvdywgc3RhcnRDb2wpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChSb3dzQXRDb21waWxlVGltZSE9RHluYW1pYyAmJiBDb2xzQXRDb21waWxlVGltZSE9RHluYW1pYyxUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9GSVhFRF9TSVpFKQorICAgICAgZWlnZW5fYXNzZXJ0KHN0YXJ0Um93ID49IDAgJiYgQmxvY2tSb3dzID49IDAgJiYgc3RhcnRSb3cgKyBCbG9ja1Jvd3MgPD0geHByLnJvd3MoKQorICAgICAgICAgICAgICYmIHN0YXJ0Q29sID49IDAgJiYgQmxvY2tDb2xzID49IDAgJiYgc3RhcnRDb2wgKyBCbG9ja0NvbHMgPD0geHByLmNvbHMoKSk7CisgICAgfQorCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsCisgICAgICAgICAgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLAorICAgICAgICAgIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQorICAgICAgOiBJbXBsKHhwciwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoKFJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljIHx8IFJvd3NBdENvbXBpbGVUaW1lPT1ibG9ja1Jvd3MpCisgICAgICAgICAgJiYgKENvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljIHx8IENvbHNBdENvbXBpbGVUaW1lPT1ibG9ja0NvbHMpKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChzdGFydFJvdyA+PSAwICYmIGJsb2NrUm93cyA+PSAwICYmIHN0YXJ0Um93ICA8PSB4cHIucm93cygpIC0gYmxvY2tSb3dzCisgICAgICAgICAgJiYgc3RhcnRDb2wgPj0gMCAmJiBibG9ja0NvbHMgPj0gMCAmJiBzdGFydENvbCA8PSB4cHIuY29scygpIC0gYmxvY2tDb2xzKTsKKyAgICB9Cit9OworICAgICAgICAgCisvLyBUaGUgZ2VuZXJpYyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBkZW5zZSBibG9jayBzaW1wbHUgZm9yd2FyZCB0byB0aGUgaW50ZXJuYWw6OkJsb2NrSW1wbF9kZW5zZQorLy8gdGhhdCBtdXN0IGJlIHNwZWNpYWxpemVkIGZvciBkaXJlY3QgYW5kIG5vbi1kaXJlY3QgYWNjZXNzLi4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWw+CitjbGFzcyBCbG9ja0ltcGw8WHByVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWwsIERlbnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6QmxvY2tJbXBsX2RlbnNlPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsPgoreworICAgIHR5cGVkZWYgaW50ZXJuYWw6OkJsb2NrSW1wbF9kZW5zZTxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gSW1wbDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEltcGwgQmFzZTsKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKEJsb2NrSW1wbCkKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQmxvY2tJbXBsKFhwclR5cGUmIHhwciwgSW5kZXggaSkgOiBJbXBsKHhwcixpKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBCbG9ja0ltcGwoWHByVHlwZSYgeHByLCBJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wpIDogSW1wbCh4cHIsIHN0YXJ0Um93LCBzdGFydENvbCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9ja0ltcGwoWHByVHlwZSYgeHByLCBJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wsIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQorICAgICAgOiBJbXBsKHhwciwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scykge30KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgZGVuc2UgQmxvY2tzIGluIHRoZSBnZW5lcmFsIGNhc2UuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWwsIGJvb2wgSGFzRGlyZWN0QWNjZXNzPiBjbGFzcyBCbG9ja0ltcGxfZGVuc2UKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPEJsb2NrPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsPiA+Ojp0eXBlCit7CisgICAgdHlwZWRlZiBCbG9jazxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gQmxvY2tUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxYcHJUeXBlPjo6bm9uX2NvbnN0X3R5cGUgWHByVHlwZU5lc3RlZDsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8QmxvY2tUeXBlPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoQmxvY2tUeXBlKQorICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoQmxvY2tJbXBsX2RlbnNlKQorCisgICAgLy8gY2xhc3MgSW5uZXJJdGVyYXRvcjsgLy8gRklYTUUgYXBwYXJlbnRseSBuZXZlciB1c2VkCisKKyAgICAvKiogQ29sdW1uIG9yIFJvdyBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9ja0ltcGxfZGVuc2UoWHByVHlwZSYgeHByLCBJbmRleCBpKQorICAgICAgOiBtX3hwcih4cHIpLAorICAgICAgICAvLyBJdCBpcyBhIHJvdyBpZiBhbmQgb25seSBpZiBCbG9ja1Jvd3M9PTEgYW5kIEJsb2NrQ29scz09WHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8vIGFuZCBpdCBpcyBhIGNvbHVtbiBpZiBhbmQgb25seSBpZiBCbG9ja1Jvd3M9PVhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIGFuZCBCbG9ja0NvbHM9PTEsCisgICAgICAgIC8vIGFsbCBvdGhlciBjYXNlcyBhcmUgaW52YWxpZC4KKyAgICAgICAgLy8gVGhlIGNhc2UgYSAxeDEgbWF0cml4IHNlZW1zIGFtYmlndW91cywgYnV0IHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYW55d2F5LgorICAgICAgICBtX3N0YXJ0Um93KCAoQmxvY2tSb3dzPT0xKSAmJiAoQmxvY2tDb2xzPT1YcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgPyBpIDogMCksCisgICAgICAgIG1fc3RhcnRDb2woIChCbG9ja1Jvd3M9PVhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSAmJiAoQmxvY2tDb2xzPT0xKSA/IGkgOiAwKSwKKyAgICAgICAgbV9ibG9ja1Jvd3MoQmxvY2tSb3dzPT0xID8gMSA6IHhwci5yb3dzKCkpLAorICAgICAgICBtX2Jsb2NrQ29scyhCbG9ja0NvbHM9PTEgPyAxIDogeHByLmNvbHMoKSkKKyAgICB7fQorCisgICAgLyoqIEZpeGVkLXNpemUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgQmxvY2tJbXBsX2RlbnNlKFhwclR5cGUmIHhwciwgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sKQorICAgICAgOiBtX3hwcih4cHIpLCBtX3N0YXJ0Um93KHN0YXJ0Um93KSwgbV9zdGFydENvbChzdGFydENvbCksCisgICAgICAgICAgICAgICAgICAgIG1fYmxvY2tSb3dzKEJsb2NrUm93cyksIG1fYmxvY2tDb2xzKEJsb2NrQ29scykKKyAgICB7fQorCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9ja0ltcGxfZGVuc2UoWHByVHlwZSYgeHByLAorICAgICAgICAgIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwKKyAgICAgICAgICBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKKyAgICAgIDogbV94cHIoeHByKSwgbV9zdGFydFJvdyhzdGFydFJvdyksIG1fc3RhcnRDb2woc3RhcnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtX2Jsb2NrUm93cyhibG9ja1Jvd3MpLCBtX2Jsb2NrQ29scyhibG9ja0NvbHMpCisgICAge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja1Jvd3MudmFsdWUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0NvbHMudmFsdWUoKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3dJZCwgSW5kZXggY29sSWQpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoWHByVHlwZSkKKyAgICAgIHJldHVybiBtX3hwci5jb2VmZlJlZihyb3dJZCArIG1fc3RhcnRSb3cudmFsdWUoKSwgY29sSWQgKyBtX3N0YXJ0Q29sLnZhbHVlKCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93SWQsIEluZGV4IGNvbElkKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3hwci5kZXJpdmVkKCkuY29lZmZSZWYocm93SWQgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbElkICsgbV9zdGFydENvbC52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvd0lkLCBJbmRleCBjb2xJZCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV94cHIuY29lZmYocm93SWQgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbElkICsgbV9zdGFydENvbC52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTFZBTFVFKFhwclR5cGUpCisgICAgICByZXR1cm4gbV94cHIuY29lZmZSZWYobV9zdGFydFJvdy52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhcnRDb2wudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV94cHIuY29lZmZSZWYobV9zdGFydFJvdy52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhcnRDb2wudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3hwci5jb2VmZihtX3N0YXJ0Um93LnZhbHVlKCkgKyAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IDAgOiBpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFydENvbC52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDApKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93SWQsIEluZGV4IGNvbElkKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3hwci50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkPihyb3dJZCArIG1fc3RhcnRSb3cudmFsdWUoKSwgY29sSWQgKyBtX3N0YXJ0Q29sLnZhbHVlKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3dJZCwgSW5kZXggY29sSWQsIGNvbnN0IFBhY2tldFNjYWxhciYgdmFsKQorICAgIHsKKyAgICAgIG1feHByLnRlbXBsYXRlIHdyaXRlUGFja2V0PFVuYWxpZ25lZD4ocm93SWQgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbElkICsgbV9zdGFydENvbC52YWx1ZSgpLCB2YWwpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV94cHIudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4KKyAgICAgICAgICAgICAgKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgIG1fc3RhcnRDb2wudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHZhbCkKKyAgICB7CisgICAgICBtX3hwci50ZW1wbGF0ZSB3cml0ZVBhY2tldDxVbmFsaWduZWQ+CisgICAgICAgICAobV9zdGFydFJvdy52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXgpLAorICAgICAgICAgIG1fc3RhcnRDb2wudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKSwgdmFsKTsKKyAgICB9CisKKyAgICAjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXHNhIE1hcEJhc2U6OmRhdGEoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdDsKKyAgICAjZW5kaWYKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8WHByVHlwZU5lc3RlZD46OnR5cGUmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdAorICAgIHsgCisgICAgICByZXR1cm4gbV94cHI7IAorICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgWHByVHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1feHByOyB9CisgICAgICAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFN0b3JhZ2VJbmRleCBzdGFydFJvdygpIGNvbnN0CisgICAgeyAKKyAgICAgIHJldHVybiBtX3N0YXJ0Um93LnZhbHVlKCk7IAorICAgIH0KKyAgICAgIAorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU3RvcmFnZUluZGV4IHN0YXJ0Q29sKCkgY29uc3QKKyAgICB7IAorICAgICAgcmV0dXJuIG1fc3RhcnRDb2wudmFsdWUoKTsgCisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIFhwclR5cGVOZXN0ZWQgbV94cHI7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8U3RvcmFnZUluZGV4LCAoWHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gMSAmJiBCbG9ja1Jvd3M9PTEpID8gMCA6IER5bmFtaWM+IG1fc3RhcnRSb3c7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8U3RvcmFnZUluZGV4LCAoWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSAmJiBCbG9ja0NvbHM9PTEpID8gMCA6IER5bmFtaWM+IG1fc3RhcnRDb2w7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8U3RvcmFnZUluZGV4LCBSb3dzQXRDb21waWxlVGltZT4gbV9ibG9ja1Jvd3M7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8U3RvcmFnZUluZGV4LCBDb2xzQXRDb21waWxlVGltZT4gbV9ibG9ja0NvbHM7Cit9OworCisvKiogXGludGVybmFsIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGRlbnNlIEJsb2NrcyBpbiB0aGUgZGlyZWN0IGFjY2VzcyBjYXNlLiovCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWw+CitjbGFzcyBCbG9ja0ltcGxfZGVuc2U8WHByVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLCBJbm5lclBhbmVsLHRydWU+CisgIDogcHVibGljIE1hcEJhc2U8QmxvY2s8WHByVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+ID4KK3sKKyAgICB0eXBlZGVmIEJsb2NrPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsPiBCbG9ja1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPFhwclR5cGU+Ojpub25fY29uc3RfdHlwZSBYcHJUeXBlTmVzdGVkOworICAgIGVudW0geworICAgICAgWHByVHlwZUlzUm93TWFqb3IgPSAoaW50KHRyYWl0czxYcHJUeXBlPjo6RmxhZ3MpJlJvd01ham9yQml0KSAhPSAwCisgICAgfTsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBNYXBCYXNlPEJsb2NrVHlwZT4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEJsb2NrVHlwZSkKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKEJsb2NrSW1wbF9kZW5zZSkKKworICAgIC8qKiBDb2x1bW4gb3IgUm93IGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEJsb2NrSW1wbF9kZW5zZShYcHJUeXBlJiB4cHIsIEluZGV4IGkpCisgICAgICA6IEJhc2UoeHByLmRhdGEoKSArIGkgKiAoICAgICgoQmxvY2tSb3dzPT0xKSAmJiAoQmxvY2tDb2xzPT1YcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgJiYgKCFYcHJUeXBlSXNSb3dNYWpvcikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKEJsb2NrUm93cz09WHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpICYmIChCbG9ja0NvbHM9PTEpICYmICggWHByVHlwZUlzUm93TWFqb3IpKSA/IHhwci5pbm5lclN0cmlkZSgpIDogeHByLm91dGVyU3RyaWRlKCkpLAorICAgICAgICAgICAgIEJsb2NrUm93cz09MSA/IDEgOiB4cHIucm93cygpLAorICAgICAgICAgICAgIEJsb2NrQ29scz09MSA/IDEgOiB4cHIuY29scygpKSwKKyAgICAgICAgbV94cHIoeHByKSwKKyAgICAgICAgbV9zdGFydFJvdyggKEJsb2NrUm93cz09MSkgJiYgKEJsb2NrQ29scz09WHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpID8gaSA6IDApLAorICAgICAgICBtX3N0YXJ0Q29sKCAoQmxvY2tSb3dzPT1YcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgJiYgKEJsb2NrQ29scz09MSkgPyBpIDogMCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqIEZpeGVkLXNpemUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgQmxvY2tJbXBsX2RlbnNlKFhwclR5cGUmIHhwciwgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sKQorICAgICAgOiBCYXNlKHhwci5kYXRhKCkreHByLmlubmVyU3RyaWRlKCkqKFhwclR5cGVJc1Jvd01ham9yP3N0YXJ0Q29sOnN0YXJ0Um93KSArIHhwci5vdXRlclN0cmlkZSgpKihYcHJUeXBlSXNSb3dNYWpvcj9zdGFydFJvdzpzdGFydENvbCkpLAorICAgICAgICBtX3hwcih4cHIpLCBtX3N0YXJ0Um93KHN0YXJ0Um93KSwgbV9zdGFydENvbChzdGFydENvbCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9ja0ltcGxfZGVuc2UoWHByVHlwZSYgeHByLAorICAgICAgICAgIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwKKyAgICAgICAgICBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKKyAgICAgIDogQmFzZSh4cHIuZGF0YSgpK3hwci5pbm5lclN0cmlkZSgpKihYcHJUeXBlSXNSb3dNYWpvcj9zdGFydENvbDpzdGFydFJvdykgKyB4cHIub3V0ZXJTdHJpZGUoKSooWHByVHlwZUlzUm93TWFqb3I/c3RhcnRSb3c6c3RhcnRDb2wpLCBibG9ja1Jvd3MsIGJsb2NrQ29scyksCisgICAgICAgIG1feHByKHhwciksIG1fc3RhcnRSb3coc3RhcnRSb3cpLCBtX3N0YXJ0Q29sKHN0YXJ0Q29sKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QKKyAgICB7IAorICAgICAgcmV0dXJuIG1feHByOyAKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFhwclR5cGUmIG5lc3RlZEV4cHJlc3Npb24oKSB7IHJldHVybiBtX3hwcjsgfQorICAgICAgCisgICAgLyoqIFxzYSBNYXBCYXNlOjppbm5lclN0cmlkZSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6dHJhaXRzPEJsb2NrVHlwZT46Okhhc1NhbWVTdG9yYWdlT3JkZXJBc1hwclR5cGUKKyAgICAgICAgICAgICA/IG1feHByLmlubmVyU3RyaWRlKCkKKyAgICAgICAgICAgICA6IG1feHByLm91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXBCYXNlOjpvdXRlclN0cmlkZSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX291dGVyU3RyaWRlOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU3RvcmFnZUluZGV4IHN0YXJ0Um93KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9zdGFydFJvdy52YWx1ZSgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU3RvcmFnZUluZGV4IHN0YXJ0Q29sKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9zdGFydENvbC52YWx1ZSgpOworICAgIH0KKworICAjaWZuZGVmIF9fU1VOUFJPX0NDCisgIC8vIEZJWE1FIHN1bnN0dWRpbyBpcyBub3QgZnJpZW5kbHkgd2l0aCB0aGUgYWJvdmUgZnJpZW5kLi4uCisgIC8vIE1FVEEtRklYTUUgdGhlcmUgaXMgbm8gJ2ZyaWVuZCcga2V5d29yZCBhcm91bmQgaGVyZS4gSXMgdGhpcyBvYnNvbGV0ZT8KKyAgcHJvdGVjdGVkOgorICAjZW5kaWYKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsIHVzZWQgYnkgYWxsb3dBbGlnbmVkKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBCbG9ja0ltcGxfZGVuc2UoWHByVHlwZSYgeHByLCBjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQorICAgICAgOiBCYXNlKGRhdGEsIGJsb2NrUm93cywgYmxvY2tDb2xzKSwgbV94cHIoeHByKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX291dGVyU3RyaWRlID0gaW50ZXJuYWw6OnRyYWl0czxCbG9ja1R5cGU+OjpIYXNTYW1lU3RvcmFnZU9yZGVyQXNYcHJUeXBlCisgICAgICAgICAgICAgICAgICAgID8gbV94cHIub3V0ZXJTdHJpZGUoKQorICAgICAgICAgICAgICAgICAgICA6IG1feHByLmlubmVyU3RyaWRlKCk7CisgICAgfQorCisgICAgWHByVHlwZU5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxTdG9yYWdlSW5kZXgsIChYcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSAxICYmIEJsb2NrUm93cz09MSkgPyAwIDogRHluYW1pYz4gbV9zdGFydFJvdzsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxTdG9yYWdlSW5kZXgsIChYcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSAxICYmIEJsb2NrQ29scz09MSkgPyAwIDogRHluYW1pYz4gbV9zdGFydENvbDsKKyAgICBJbmRleCBtX291dGVyU3RyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkxPQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQm9vbGVhblJlZHV4LmggYi9FaWdlbi9zcmMvQ29yZS9Cb29sZWFuUmVkdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA5ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQm9vbGVhblJlZHV4LmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BTExBTkRBTllfSAorI2RlZmluZSBFSUdFTl9BTExBTkRBTllfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IFVucm9sbENvdW50Pgorc3RydWN0IGFsbF91bnJvbGxlcgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkV4cHJlc3Npb25UcmFpdHMgVHJhaXRzOworICBlbnVtIHsKKyAgICBjb2wgPSAoVW5yb2xsQ291bnQtMSkgLyBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIHJvdyA9IChVbnJvbGxDb3VudC0xKSAlIFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCkKKyAgeworICAgIHJldHVybiBhbGxfdW5yb2xsZXI8RGVyaXZlZCwgVW5yb2xsQ291bnQtMT46OnJ1bihtYXQpICYmIG1hdC5jb2VmZihyb3csIGNvbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgYWxsX3Vucm9sbGVyPERlcml2ZWQsIDA+Cit7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oY29uc3QgRGVyaXZlZCAmLyptYXQqLykgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBhbGxfdW5yb2xsZXI8RGVyaXZlZCwgRHluYW1pYz4KK3sKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICYpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBpbnQgVW5yb2xsQ291bnQ+CitzdHJ1Y3QgYW55X3Vucm9sbGVyCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6RXhwcmVzc2lvblRyYWl0cyBUcmFpdHM7CisgIGVudW0geworICAgIGNvbCA9IChVbnJvbGxDb3VudC0xKSAvIFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgcm93ID0gKFVucm9sbENvdW50LTEpICUgVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZQorICB9OworICAKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICZtYXQpCisgIHsKKyAgICByZXR1cm4gYW55X3Vucm9sbGVyPERlcml2ZWQsIFVucm9sbENvdW50LTE+OjpydW4obWF0KSB8fCBtYXQuY29lZmYocm93LCBjb2wpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGFueV91bnJvbGxlcjxEZXJpdmVkLCAwPgoreworICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQgJiAvKm1hdCovKSB7IHJldHVybiBmYWxzZTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBhbnlfdW5yb2xsZXI8RGVyaXZlZCwgRHluYW1pYz4KK3sKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICYpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZXR1cm5zIHRydWUgaWYgYWxsIGNvZWZmaWNpZW50cyBhcmUgdHJ1ZQorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9hbGwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9hbGwub3V0CisgICoKKyAgKiBcc2EgYW55KCksIEN3aXNlOjpvcGVyYXRvcjwoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBib29sIERlbnNlQmFzZTxEZXJpdmVkPjo6YWxsKCkgY29uc3QKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+IEV2YWx1YXRvcjsKKyAgZW51bSB7CisgICAgdW5yb2xsID0gU2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYworICAgICAgICAgICYmIFNpemVBdENvbXBpbGVUaW1lICogKEV2YWx1YXRvcjo6Q29lZmZSZWFkQ29zdCArIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KSA8PSBFSUdFTl9VTlJPTExJTkdfTElNSVQKKyAgfTsKKyAgRXZhbHVhdG9yIGV2YWx1YXRvcihkZXJpdmVkKCkpOworICBpZih1bnJvbGwpCisgICAgcmV0dXJuIGludGVybmFsOjphbGxfdW5yb2xsZXI8RXZhbHVhdG9yLCB1bnJvbGwgPyBpbnQoU2l6ZUF0Q29tcGlsZVRpbWUpIDogRHluYW1pYz46OnJ1bihldmFsdWF0b3IpOworICBlbHNlCisgIHsKKyAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJvd3MoKTsgKytpKQorICAgICAgICBpZiAoIWV2YWx1YXRvci5jb2VmZihpLCBqKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBjb2VmZmljaWVudCBpcyB0cnVlCisgICoKKyAgKiBcc2EgYWxsKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmFueSgpIGNvbnN0Cit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPiBFdmFsdWF0b3I7CisgIGVudW0geworICAgIHVucm9sbCA9IFNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMKKyAgICAgICAgICAmJiBTaXplQXRDb21waWxlVGltZSAqIChFdmFsdWF0b3I6OkNvZWZmUmVhZENvc3QgKyBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCkgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisgIH07CisgIEV2YWx1YXRvciBldmFsdWF0b3IoZGVyaXZlZCgpKTsKKyAgaWYodW5yb2xsKQorICAgIHJldHVybiBpbnRlcm5hbDo6YW55X3Vucm9sbGVyPEV2YWx1YXRvciwgdW5yb2xsID8gaW50KFNpemVBdENvbXBpbGVUaW1lKSA6IER5bmFtaWM+OjpydW4oZXZhbHVhdG9yKTsKKyAgZWxzZQorICB7CisgICAgZm9yKEluZGV4IGogPSAwOyBqIDwgY29scygpOyArK2opCisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByb3dzKCk7ICsraSkKKyAgICAgICAgaWYgKGV2YWx1YXRvci5jb2VmZihpLCBqKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyB3aGljaCBldmFsdWF0ZSB0byB0cnVlCisgICoKKyAgKiBcc2EgYWxsKCksIGFueSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIEVpZ2VuOjpJbmRleCBEZW5zZUJhc2U8RGVyaXZlZD46OmNvdW50KCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkudGVtcGxhdGUgY2FzdDxJbmRleD4oKS5zdW0oKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaXMgXGMgKnRoaXMgY29udGFpbnMgYXQgbGVhc3Qgb25lIE5vdCBBIE51bWJlciAoTmFOKS4KKyAgKgorICAqIFxzYSBhbGxGaW5pdGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBib29sIERlbnNlQmFzZTxEZXJpdmVkPjo6aGFzTmFOKCkgY29uc3QKK3sKKyNpZiBFSUdFTl9DT01QX01TVkMgfHwgKGRlZmluZWQgX19GQVNUX01BVEhfXykKKyAgcmV0dXJuIGRlcml2ZWQoKS5hcnJheSgpLmlzTmFOKCkuYW55KCk7CisjZWxzZQorICByZXR1cm4gISgoZGVyaXZlZCgpLmFycmF5KCk9PWRlcml2ZWQoKS5hcnJheSgpKS5hbGwoKSk7CisjZW5kaWYKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgXGMgKnRoaXMgY29udGFpbnMgb25seSBmaW5pdGUgbnVtYmVycywgaS5lLiwgbm8gTmFOIGFuZCBubyArLy1JTkYgdmFsdWVzLgorICAqCisgICogXHNhIGhhc05hTigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgRGVuc2VCYXNlPERlcml2ZWQ+OjphbGxGaW5pdGUoKSBjb25zdAoreworI2lmIEVJR0VOX0NPTVBfTVNWQyB8fCAoZGVmaW5lZCBfX0ZBU1RfTUFUSF9fKQorICByZXR1cm4gZGVyaXZlZCgpLmFycmF5KCkuaXNGaW5pdGUoKS5hbGwoKTsKKyNlbHNlCisgIHJldHVybiAhKChkZXJpdmVkKCktZGVyaXZlZCgpKS5oYXNOYU4oKSk7CisjZW5kaWYKK30KKyAgICAKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQUxMQU5EQU5ZX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0NvbW1hSW5pdGlhbGl6ZXIuaCBiL0VpZ2VuL3NyYy9Db3JlL0NvbW1hSW5pdGlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjE4ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQ29tbWFJbml0aWFsaXplci5oCkBAIC0wLDAgKzEsMTYwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01NQUlOSVRJQUxJWkVSX0gKKyNkZWZpbmUgRUlHRU5fQ09NTUFJTklUSUFMSVpFUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIENvbW1hSW5pdGlhbGl6ZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBjb21tYSBpbml0aWFsaXplciBvcGVyYXRvcgorICAqCisgICogVGhpcyBjbGFzcyBpcyBpbnRlcm5hbGx5IHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjb21tYSBpbml0aWFsaXplciBmZWF0dXJlLiBJdCBpcworICAqIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpvcGVyYXRvcjw8LCBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5CisgICogd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBcc2EgXGJsYW5rIFxyZWYgTWF0cml4QmFzZUNvbW1hSW5pdFJlZiAiTWF0cml4QmFzZTo6b3BlcmF0b3I8PCIsIENvbW1hSW5pdGlhbGl6ZXI6OmZpbmlzaGVkKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgQ29tbWFJbml0aWFsaXplcgoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgaW5saW5lIENvbW1hSW5pdGlhbGl6ZXIoWHByVHlwZSYgeHByLCBjb25zdCBTY2FsYXImIHMpCisgICAgOiBtX3hwcih4cHIpLCBtX3JvdygwKSwgbV9jb2woMSksIG1fY3VycmVudEJsb2NrUm93cygxKQorICB7CisgICAgbV94cHIuY29lZmZSZWYoMCwwKSA9IHM7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBDb21tYUluaXRpYWxpemVyKFhwclR5cGUmIHhwciwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIDogbV94cHIoeHByKSwgbV9yb3coMCksIG1fY29sKG90aGVyLmNvbHMoKSksIG1fY3VycmVudEJsb2NrUm93cyhvdGhlci5yb3dzKCkpCisgIHsKKyAgICBtX3hwci5ibG9jaygwLCAwLCBvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSkgPSBvdGhlcjsKKyAgfQorCisgIC8qIENvcHkvTW92ZSBjb25zdHJ1Y3RvciB3aGljaCB0cmFuc2ZlcnMgb3duZXJzaGlwLiBUaGlzIGlzIGNydWNpYWwgaW4gCisgICAqIGFic2VuY2Ugb2YgcmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbiB0byBhdm9pZCBhc3NlcnRpb25zIGR1cmluZyBkZXN0cnVjdGlvbi4gKi8KKyAgLy8gRklYTUUgaW4gQysrMTEgbW9kZSB0aGlzIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgcHJvcGVyIFJWYWx1ZSBjb25zdHJ1Y3RvcgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgQ29tbWFJbml0aWFsaXplcihjb25zdCBDb21tYUluaXRpYWxpemVyJiBvKQorICA6IG1feHByKG8ubV94cHIpLCBtX3JvdyhvLm1fcm93KSwgbV9jb2woby5tX2NvbCksIG1fY3VycmVudEJsb2NrUm93cyhvLm1fY3VycmVudEJsb2NrUm93cykgeworICAgIC8vIE1hcmsgb3JpZ2luYWwgb2JqZWN0IGFzIGZpbmlzaGVkLiBJbiBhYnNlbmNlIG9mIFItdmFsdWUgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGNvbnN0X2Nhc3Q6CisgICAgY29uc3RfY2FzdDxDb21tYUluaXRpYWxpemVyJj4obykubV9yb3cgPSBtX3hwci5yb3dzKCk7CisgICAgY29uc3RfY2FzdDxDb21tYUluaXRpYWxpemVyJj4obykubV9jb2wgPSBtX3hwci5jb2xzKCk7CisgICAgY29uc3RfY2FzdDxDb21tYUluaXRpYWxpemVyJj4obykubV9jdXJyZW50QmxvY2tSb3dzID0gMDsKKyAgfQorCisgIC8qIGluc2VydHMgYSBzY2FsYXIgdmFsdWUgaW4gdGhlIHRhcmdldCBtYXRyaXggKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgQ29tbWFJbml0aWFsaXplciYgb3BlcmF0b3IsKGNvbnN0IFNjYWxhciYgcykKKyAgeworICAgIGlmIChtX2NvbD09bV94cHIuY29scygpKQorICAgIHsKKyAgICAgIG1fcm93Kz1tX2N1cnJlbnRCbG9ja1Jvd3M7CisgICAgICBtX2NvbCA9IDA7CisgICAgICBtX2N1cnJlbnRCbG9ja1Jvd3MgPSAxOworICAgICAgZWlnZW5fYXNzZXJ0KG1fcm93PG1feHByLnJvd3MoKQorICAgICAgICAmJiAiVG9vIG1hbnkgcm93cyBwYXNzZWQgdG8gY29tbWEgaW5pdGlhbGl6ZXIgKG9wZXJhdG9yPDwpIik7CisgICAgfQorICAgIGVpZ2VuX2Fzc2VydChtX2NvbDxtX3hwci5jb2xzKCkKKyAgICAgICYmICJUb28gbWFueSBjb2VmZmljaWVudHMgcGFzc2VkIHRvIGNvbW1hIGluaXRpYWxpemVyIChvcGVyYXRvcjw8KSIpOworICAgIGVpZ2VuX2Fzc2VydChtX2N1cnJlbnRCbG9ja1Jvd3M9PTEpOworICAgIG1feHByLmNvZWZmUmVmKG1fcm93LCBtX2NvbCsrKSA9IHM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyogaW5zZXJ0cyBhIG1hdHJpeCBleHByZXNzaW9uIGluIHRoZSB0YXJnZXQgbWF0cml4ICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgQ29tbWFJbml0aWFsaXplciYgb3BlcmF0b3IsKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgeworICAgIGlmIChtX2NvbD09bV94cHIuY29scygpICYmIChvdGhlci5jb2xzKCkhPTAgfHwgb3RoZXIucm93cygpIT1tX2N1cnJlbnRCbG9ja1Jvd3MpKQorICAgIHsKKyAgICAgIG1fcm93Kz1tX2N1cnJlbnRCbG9ja1Jvd3M7CisgICAgICBtX2NvbCA9IDA7CisgICAgICBtX2N1cnJlbnRCbG9ja1Jvd3MgPSBvdGhlci5yb3dzKCk7CisgICAgICBlaWdlbl9hc3NlcnQobV9yb3crbV9jdXJyZW50QmxvY2tSb3dzPD1tX3hwci5yb3dzKCkKKyAgICAgICAgJiYgIlRvbyBtYW55IHJvd3MgcGFzc2VkIHRvIGNvbW1hIGluaXRpYWxpemVyIChvcGVyYXRvcjw8KSIpOworICAgIH0KKyAgICBlaWdlbl9hc3NlcnQoKG1fY29sICsgb3RoZXIuY29scygpIDw9IG1feHByLmNvbHMoKSkKKyAgICAgICYmICJUb28gbWFueSBjb2VmZmljaWVudHMgcGFzc2VkIHRvIGNvbW1hIGluaXRpYWxpemVyIChvcGVyYXRvcjw8KSIpOworICAgIGVpZ2VuX2Fzc2VydChtX2N1cnJlbnRCbG9ja1Jvd3M9PW90aGVyLnJvd3MoKSk7CisgICAgbV94cHIudGVtcGxhdGUgYmxvY2s8T3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSwgT3RoZXJEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgKG1fcm93LCBtX2NvbCwgb3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpID0gb3RoZXI7CisgICAgbV9jb2wgKz0gb3RoZXIuY29scygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSB+Q29tbWFJbml0aWFsaXplcigpCisjaWYgZGVmaW5lZCBWRVJJRllfUkFJU0VTX0FTU0VSVCAmJiAoIWRlZmluZWQgRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HKSAmJiBkZWZpbmVkIEVJR0VOX0VYQ0VQVElPTlMKKyAgRUlHRU5fRVhDRVBUSU9OX1NQRUMoRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24pCisjZW5kaWYKKyAgeworICAgICAgZmluaXNoZWQoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgYnVpbHQgbWF0cml4IG9uY2UgYWxsIGl0cyBjb2VmZmljaWVudHMgaGF2ZSBiZWVuIHNldC4KKyAgICAqIENhbGxpbmcgZmluaXNoZWQgaXMgMTAwJSBvcHRpb25hbC4gSXRzIHB1cnBvc2UgaXMgdG8gd3JpdGUgZXhwcmVzc2lvbnMKKyAgICAqIGxpa2UgdGhpczoKKyAgICAqIFxjb2RlCisgICAgKiBxdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeCgoTWF0cml4M2YoKSA8PCBheGlzMCwgYXhpczEsIGF4aXMyKS5maW5pc2hlZCgpKTsKKyAgICAqIFxlbmRjb2RlCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgaW5saW5lIFhwclR5cGUmIGZpbmlzaGVkKCkgeworICAgICAgZWlnZW5fYXNzZXJ0KCgobV9yb3crbV9jdXJyZW50QmxvY2tSb3dzKSA9PSBtX3hwci5yb3dzKCkgfHwgbV94cHIuY29scygpID09IDApCisgICAgICAgICAgICYmIG1fY29sID09IG1feHByLmNvbHMoKQorICAgICAgICAgICAmJiAiVG9vIGZldyBjb2VmZmljaWVudHMgcGFzc2VkIHRvIGNvbW1hIGluaXRpYWxpemVyIChvcGVyYXRvcjw8KSIpOworICAgICAgcmV0dXJuIG1feHByOworICB9CisKKyAgWHByVHlwZSYgbV94cHI7ICAgICAgICAgICAvLyB0YXJnZXQgZXhwcmVzc2lvbgorICBJbmRleCBtX3JvdzsgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IGlkCisgIEluZGV4IG1fY29sOyAgICAgICAgICAgICAgLy8gY3VycmVudCBjb2wgaWQKKyAgSW5kZXggbV9jdXJyZW50QmxvY2tSb3dzOyAvLyBjdXJyZW50IGJsb2NrIGhlaWdodAorfTsKKworLyoqIFxhbmNob3IgTWF0cml4QmFzZUNvbW1hSW5pdFJlZgorICAqIENvbnZlbmllbnQgb3BlcmF0b3IgdG8gc2V0IHRoZSBjb2VmZmljaWVudHMgb2YgYSBtYXRyaXguCisgICoKKyAgKiBUaGUgY29lZmZpY2llbnRzIG11c3QgYmUgcHJvdmlkZWQgaW4gYSByb3cgbWFqb3Igb3JkZXIgYW5kIGV4YWN0bHkgbWF0Y2gKKyAgKiB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4LiBPdGhlcndpc2UgYW4gYXNzZXJ0aW9uIGlzIHJhaXNlZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0Lm91dAorICAqIAorICAqIFxub3RlIEFjY29yZGluZyB0aGUgYysrIHN0YW5kYXJkLCB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbnMgb2YgdGhpcyBjb21tYSBpbml0aWFsaXplciBhcmUgZXZhbHVhdGVkIGluIGFyYml0cmFyeSBvcmRlci4KKyAgKgorICAqIFxzYSBDb21tYUluaXRpYWxpemVyOjpmaW5pc2hlZCgpLCBjbGFzcyBDb21tYUluaXRpYWxpemVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIENvbW1hSW5pdGlhbGl6ZXI8RGVyaXZlZD4gRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcjw8IChjb25zdCBTY2FsYXImIHMpCit7CisgIHJldHVybiBDb21tYUluaXRpYWxpemVyPERlcml2ZWQ+KCpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyksIHMpOworfQorCisvKiogXHNhIG9wZXJhdG9yPDwoY29uc3QgU2NhbGFyJikgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgQ29tbWFJbml0aWFsaXplcjxEZXJpdmVkPgorRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcjw8KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgcmV0dXJuIENvbW1hSW5pdGlhbGl6ZXI8RGVyaXZlZD4oKnN0YXRpY19jYXN0PERlcml2ZWQgKj4odGhpcyksIG90aGVyKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT01NQUlOSVRJQUxJWkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0NvbmRpdGlvbkVzdGltYXRvci5oIGIvRWlnZW4vc3JjL0NvcmUvQ29uZGl0aW9uRXN0aW1hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3ZWZkYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0NvbmRpdGlvbkVzdGltYXRvci5oCkBAIC0wLDAgKzEsMTc1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBSYXNtdXMgTXVuayBMYXJzZW4gKHJtbGFyc2VuQGdvb2dsZS5jb20pCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTkRJVElPTkVTVElNQVRPUl9ICisjZGVmaW5lIEVJR0VOX0NPTkRJVElPTkVTVElNQVRPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3IsIHR5cGVuYW1lIFJlYWxWZWN0b3IsIGJvb2wgSXNDb21wbGV4Pgorc3RydWN0IHJjb25kX2NvbXB1dGVfc2lnbiB7CisgIHN0YXRpYyBpbmxpbmUgVmVjdG9yIHJ1bihjb25zdCBWZWN0b3ImIHYpIHsKKyAgICBjb25zdCBSZWFsVmVjdG9yIHZfYWJzID0gdi5jd2lzZUFicygpOworICAgIHJldHVybiAodl9hYnMuYXJyYXkoKSA9PSBzdGF0aWNfY2FzdDx0eXBlbmFtZSBWZWN0b3I6OlJlYWxTY2FsYXI+KDApKQorICAgICAgICAgICAgLnNlbGVjdChWZWN0b3I6Ok9uZXModi5zaXplKCkpLCB2LmN3aXNlUXVvdGllbnQodl9hYnMpKTsKKyAgfQorfTsKKworLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiB0byBhdm9pZCBlbGVtZW50d2lzZSBkaXZpc2lvbiBmb3IgcmVhbCB2ZWN0b3JzLgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3Rvcj4KK3N0cnVjdCByY29uZF9jb21wdXRlX3NpZ248VmVjdG9yLCBWZWN0b3IsIGZhbHNlPiB7CisgIHN0YXRpYyBpbmxpbmUgVmVjdG9yIHJ1bihjb25zdCBWZWN0b3ImIHYpIHsKKyAgICByZXR1cm4gKHYuYXJyYXkoKSA8IHN0YXRpY19jYXN0PHR5cGVuYW1lIFZlY3Rvcjo6UmVhbFNjYWxhcj4oMCkpCisgICAgICAgICAgIC5zZWxlY3QoLVZlY3Rvcjo6T25lcyh2LnNpemUoKSksIFZlY3Rvcjo6T25lcyh2LnNpemUoKSkpOworICB9Cit9OworCisvKioKKyAgKiBccmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB8fGludihtYXRyaXgpfHxfMSBnaXZlbiBhIGRlY29tcG9zaXRpb24gb2YKKyAgKiBcYSBtYXRyaXggdGhhdCBpbXBsZW1lbnRzIC5zb2x2ZSgpIGFuZCAuYWRqb2ludCgpLnNvbHZlKCkgbWV0aG9kcy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBBbGdvcml0aG1zIDQuMSBhbmQgNS4xIGZyb20KKyAgKiAgIGh0dHA6Ly93d3cubWF0aHMubWFuY2hlc3Rlci5hYy51ay9+aGlnaGFtL25hcmVwL25hcmVwMTM1LnBkZgorICAqIHdoaWNoIGFsc28gZm9ybXMgdGhlIGJhc2lzIGZvciB0aGUgY29uZGl0aW9uIG51bWJlciBlc3RpbWF0b3JzIGluCisgICogTEFQQUNLLiBTaW5jZSBhdCBtb3N0IDEwIGNhbGxzIHRvIHRoZSBzb2x2ZSBtZXRob2Qgb2YgZGVjIGFyZQorICAqIHBlcmZvcm1lZCwgdGhlIHRvdGFsIGNvc3QgaXMgTyhkaW1zXjIpLCBhcyBvcHBvc2VkIHRvIE8oZGltc14zKQorICAqIG5lZWRlZCB0byBjb21wdXRlIHRoZSBpbnZlcnNlIG1hdHJpeCBleHBsaWNpdGx5LgorICAqCisgICogVGhlIG1vc3QgY29tbW9uIHVzYWdlIGlzIGluIGVzdGltYXRpbmcgdGhlIGNvbmRpdGlvbiBudW1iZXIKKyAgKiB8fG1hdHJpeHx8XzEgKiB8fGludihtYXRyaXgpfHxfMS4gVGhlIGZpcnN0IHRlcm0gfHxtYXRyaXh8fF8xIGNhbiBiZQorICAqIGNvbXB1dGVkIGRpcmVjdGx5IGluIE8obl4yKSBvcGVyYXRpb25zLgorICAqCisgICogU3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkZWNvbXBvc2l0aW9uczogRnVsbFBpdkxVLCBQYXJ0aWFsUGl2TFUsIExETFQsIGFuZAorICAqIExMVC4KKyAgKgorICAqIFxzYSBGdWxsUGl2TFUsIFBhcnRpYWxQaXZMVSwgTERMVCwgTExULgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIERlY29tcG9zaXRpb24+Cit0eXBlbmFtZSBEZWNvbXBvc2l0aW9uOjpSZWFsU2NhbGFyIHJjb25kX2ludm1hdHJpeF9MMV9ub3JtX2VzdGltYXRlKGNvbnN0IERlY29tcG9zaXRpb24mIGRlYykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvbjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIFZlY3RvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29sX3R5cGU8TWF0cml4VHlwZSwgUmVhbFNjYWxhcj46OnR5cGUgUmVhbFZlY3RvcjsKKyAgY29uc3QgYm9vbCBpc19jb21wbGV4ID0gKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggIT0gMCk7CisKKyAgZWlnZW5fYXNzZXJ0KGRlYy5yb3dzKCkgPT0gZGVjLmNvbHMoKSk7CisgIGNvbnN0IEluZGV4IG4gPSBkZWMucm93cygpOworICBpZiAobiA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8vIERpc2FibGUgSW5kZXggdG8gZmxvYXQgY29udmVyc2lvbiB3YXJuaW5nCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorICAjcHJhZ21hIHdhcm5pbmcgcHVzaAorICAjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlIDogMjI1OSApCisjZW5kaWYKKyAgVmVjdG9yIHYgPSBkZWMuc29sdmUoVmVjdG9yOjpPbmVzKG4pIC8gU2NhbGFyKG4pKTsKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisgICNwcmFnbWEgd2FybmluZyBwb3AKKyNlbmRpZgorCisgIC8vIGxvd2VyX2JvdW5kIGlzIGEgbG93ZXIgYm91bmQgb24KKyAgLy8gICB8fGludihtYXRyaXgpfHxfMSAgPSBzdXBfdiB8fGludihtYXRyaXgpIHZ8fF8xIC8gfHx2fHxfMQorICAvLyBhbmQgaXMgdGhlIG9iamVjdGl2ZSBtYXhpbWl6ZWQgYnkgdGhlICgic3VwZXItIikgZ3JhZGllbnQgYXNjZW50CisgIC8vIGFsZ29yaXRobSBiZWxvdy4KKyAgUmVhbFNjYWxhciBsb3dlcl9ib3VuZCA9IHYudGVtcGxhdGUgbHBOb3JtPDE+KCk7CisgIGlmIChuID09IDEpCisgICAgcmV0dXJuIGxvd2VyX2JvdW5kOworCisgIC8vIEdyYWRpZW50IGFzY2VudCBhbGdvcml0aG0gZm9sbG93czogV2Uga25vdyB0aGF0IHRoZSBvcHRpbXVtIGlzIGFjaGlldmVkIGF0CisgIC8vIG9uZSBvZiB0aGUgc2ltcGxpY2VzIHYgPSBlX2ksIHNvIGluIGVhY2ggaXRlcmF0aW9uIHdlIGZvbGxvdyBhCisgIC8vIHN1cGVyLWdyYWRpZW50IHRvIG1vdmUgdG93YXJkcyB0aGUgb3B0aW1hbCBvbmUuCisgIFJlYWxTY2FsYXIgb2xkX2xvd2VyX2JvdW5kID0gbG93ZXJfYm91bmQ7CisgIFZlY3RvciBzaWduX3ZlY3RvcihuKTsKKyAgVmVjdG9yIG9sZF9zaWduX3ZlY3RvcjsKKyAgSW5kZXggdl9tYXhfYWJzX2luZGV4ID0gLTE7CisgIEluZGV4IG9sZF92X21heF9hYnNfaW5kZXggPSB2X21heF9hYnNfaW5kZXg7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgKytrKQorICB7CisgICAgc2lnbl92ZWN0b3IgPSBpbnRlcm5hbDo6cmNvbmRfY29tcHV0ZV9zaWduPFZlY3RvciwgUmVhbFZlY3RvciwgaXNfY29tcGxleD46OnJ1bih2KTsKKyAgICBpZiAoayA+IDAgJiYgIWlzX2NvbXBsZXggJiYgc2lnbl92ZWN0b3IgPT0gb2xkX3NpZ25fdmVjdG9yKSB7CisgICAgICAvLyBCcmVhayBpZiB0aGUgc29sdXRpb24gc3RhZ25hdGVkLgorICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIHZfbWF4X2Fic19pbmRleCA9IGFyZ21heCB8cmVhbCggaW52KG1hdHJpeCleVCAqIHNpZ25fdmVjdG9yICl8CisgICAgdiA9IGRlYy5hZGpvaW50KCkuc29sdmUoc2lnbl92ZWN0b3IpOworICAgIHYucmVhbCgpLmN3aXNlQWJzKCkubWF4Q29lZmYoJnZfbWF4X2Fic19pbmRleCk7CisgICAgaWYgKHZfbWF4X2Fic19pbmRleCA9PSBvbGRfdl9tYXhfYWJzX2luZGV4KSB7CisgICAgICAvLyBCcmVhayBpZiB0aGUgc29sdXRpb24gc3RhZ25hdGVkLgorICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIE1vdmUgdG8gdGhlIG5ldyBzaW1wbGV4IGVfaiwgd2hlcmUgaiA9IHZfbWF4X2Fic19pbmRleC4KKyAgICB2ID0gZGVjLnNvbHZlKFZlY3Rvcjo6VW5pdChuLCB2X21heF9hYnNfaW5kZXgpKTsgIC8vIHYgPSBpbnYobWF0cml4KSAqIGVfai4KKyAgICBsb3dlcl9ib3VuZCA9IHYudGVtcGxhdGUgbHBOb3JtPDE+KCk7CisgICAgaWYgKGxvd2VyX2JvdW5kIDw9IG9sZF9sb3dlcl9ib3VuZCkgeworICAgICAgLy8gQnJlYWsgaWYgdGhlIGdyYWRpZW50IHN0ZXAgZGlkIG5vdCBpbmNyZWFzZSB0aGUgbG93ZXJfYm91bmQuCisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFpc19jb21wbGV4KSB7CisgICAgICBvbGRfc2lnbl92ZWN0b3IgPSBzaWduX3ZlY3RvcjsKKyAgICB9CisgICAgb2xkX3ZfbWF4X2Fic19pbmRleCA9IHZfbWF4X2Fic19pbmRleDsKKyAgICBvbGRfbG93ZXJfYm91bmQgPSBsb3dlcl9ib3VuZDsKKyAgfQorICAvLyBUaGUgZm9sbG93aW5nIGNhbGN1bGF0ZXMgYW4gaW5kZXBlbmRlbnQgZXN0aW1hdGUgb2YgfHxtYXRyaXh8fF8xIGJ5CisgIC8vIG11bHRpcGx5aW5nIG1hdHJpeCBieSBhIHZlY3RvciB3aXRoIGVudHJpZXMgb2Ygc2xvd2x5IGluY3JlYXNpbmcKKyAgLy8gbWFnbml0dWRlIGFuZCBhbHRlcm5hdGluZyBzaWduOgorICAvLyAgIHZfaSA9ICgtMSlee2l9ICgxICsgKGkgLyAoZGltLTEpKSksIGkgPSAwLC4uLixkaW0tMS4KKyAgLy8gVGhpcyBpbXByb3ZlbWVudCB0byBIYWdlcidzIGFsZ29yaXRobSBhYm92ZSBpcyBkdWUgdG8gSGlnaGFtLiBJdCB3YXMKKyAgLy8gYWRkZWQgdG8gbWFrZSB0aGUgYWxnb3JpdGhtIG1vcmUgcm9idXN0IGluIGNlcnRhaW4gY29ybmVyIGNhc2VzIHdoZXJlCisgIC8vIGxhcmdlIGVsZW1lbnRzIGluIHRoZSBtYXRyaXggbWlnaHQgb3RoZXJ3aXNlIGVzY2FwZSBkZXRlY3Rpb24gZHVlIHRvCisgIC8vIGV4YWN0IGNhbmNlbGxhdGlvbiAoZXNwZWNpYWxseSB3aGVuIG9wIGFuZCBvcF9hZGpvaW50IGNvcnJlc3BvbmQgdG8gYQorICAvLyBzZXF1ZW5jZSBvZiBiYWNrc3Vic3RpdHV0aW9ucyBhbmQgcGVybXV0YXRpb25zKSwgd2hpY2ggY291bGQgY2F1c2UKKyAgLy8gSGFnZXIncyBhbGdvcml0aG0gdG8gdmFzdGx5IHVuZGVyZXN0aW1hdGUgfHxtYXRyaXh8fF8xLgorICBTY2FsYXIgYWx0ZXJuYXRpbmdfc2lnbihSZWFsU2NhbGFyKDEpKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IG47ICsraSkgeworICAgIC8vIFRoZSBzdGF0aWNfY2FzdCBpcyBuZWVkZWQgd2hlbiBTY2FsYXIgaXMgYSBjb21wbGV4IGFuZCBSZWFsU2NhbGFyIGltcGxlbWVudHMgZXhwcmVzc2lvbiB0ZW1wbGF0ZXMKKyAgICB2W2ldID0gYWx0ZXJuYXRpbmdfc2lnbiAqIHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KFJlYWxTY2FsYXIoMSkgKyAoUmVhbFNjYWxhcihpKSAvIChSZWFsU2NhbGFyKG4gLSAxKSkpKTsKKyAgICBhbHRlcm5hdGluZ19zaWduID0gLWFsdGVybmF0aW5nX3NpZ247CisgIH0KKyAgdiA9IGRlYy5zb2x2ZSh2KTsKKyAgY29uc3QgUmVhbFNjYWxhciBhbHRlcm5hdGVfbG93ZXJfYm91bmQgPSAoMiAqIHYudGVtcGxhdGUgbHBOb3JtPDE+KCkpIC8gKDMgKiBSZWFsU2NhbGFyKG4pKTsKKyAgcmV0dXJuIG51bWV4dDo6bWF4aShsb3dlcl9ib3VuZCwgYWx0ZXJuYXRlX2xvd2VyX2JvdW5kKTsKK30KKworLyoqIFxicmllZiBSZWNpcHJvY2FsIGNvbmRpdGlvbiBudW1iZXIgZXN0aW1hdG9yLgorICAqCisgICogQ29tcHV0aW5nIGEgZGVjb21wb3NpdGlvbiBvZiBhIGRlbnNlIG1hdHJpeCB0YWtlcyBPKG5eMykgb3BlcmF0aW9ucywgd2hpbGUKKyAgKiB0aGlzIG1ldGhvZCBlc3RpbWF0ZXMgdGhlIGNvbmRpdGlvbiBudW1iZXIgcXVpY2tseSBhbmQgcmVsaWFibHkgaW4gTyhuXjIpCisgICogb3BlcmF0aW9ucy4KKyAgKgorICAqIFxyZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSByZWNpcHJvY2FsIGNvbmRpdGlvbiBudW1iZXIKKyAgKiAoMSAvICh8fG1hdHJpeHx8XzEgKiB8fGludihtYXRyaXgpfHxfMSkpIG9mIG1hdHJpeCwgZ2l2ZW4gfHxtYXRyaXh8fF8xIGFuZAorICAqIGl0cyBkZWNvbXBvc2l0aW9uLiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGRlY29tcG9zaXRpb25zOiBGdWxsUGl2TFUsCisgICogUGFydGlhbFBpdkxVLCBMRExULCBhbmQgTExULgorICAqCisgICogXHNhIEZ1bGxQaXZMVSwgUGFydGlhbFBpdkxVLCBMRExULCBMTFQuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVjb21wb3NpdGlvbj4KK3R5cGVuYW1lIERlY29tcG9zaXRpb246OlJlYWxTY2FsYXIKK3Jjb25kX2VzdGltYXRlX2hlbHBlcih0eXBlbmFtZSBEZWNvbXBvc2l0aW9uOjpSZWFsU2NhbGFyIG1hdHJpeF9ub3JtLCBjb25zdCBEZWNvbXBvc2l0aW9uJiBkZWMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvbjo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBlaWdlbl9hc3NlcnQoZGVjLnJvd3MoKSA9PSBkZWMuY29scygpKTsKKyAgaWYgKGRlYy5yb3dzKCkgPT0gMCkgICAgICAgICAgICAgIHJldHVybiBSZWFsU2NhbGFyKDEpOworICBpZiAobWF0cml4X25vcm0gPT0gUmVhbFNjYWxhcigwKSkgcmV0dXJuIFJlYWxTY2FsYXIoMCk7CisgIGlmIChkZWMucm93cygpID09IDEpICAgICAgICAgICAgICByZXR1cm4gUmVhbFNjYWxhcigxKTsKKyAgY29uc3QgUmVhbFNjYWxhciBpbnZlcnNlX21hdHJpeF9ub3JtID0gcmNvbmRfaW52bWF0cml4X0wxX25vcm1fZXN0aW1hdGUoZGVjKTsKKyAgcmV0dXJuIChpbnZlcnNlX21hdHJpeF9ub3JtID09IFJlYWxTY2FsYXIoMCkgPyBSZWFsU2NhbGFyKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFJlYWxTY2FsYXIoMSkgLyBpbnZlcnNlX21hdHJpeF9ub3JtKSAvIG1hdHJpeF9ub3JtKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0NvcmVFdmFsdWF0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9Db3JlRXZhbHVhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzFlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Db3JlRXZhbHVhdG9ycy5oCkBAIC0wLDAgKzEsMTY3MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKyNpZm5kZWYgRUlHRU5fQ09SRUVWQUxVQVRPUlNfSAorI2RlZmluZSBFSUdFTl9DT1JFRVZBTFVBVE9SU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisgIAorbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBjbGFzcyByZXR1cm5zIHRoZSBldmFsdWF0b3Iga2luZCBmcm9tIHRoZSBleHByZXNzaW9uIHN0b3JhZ2Uga2luZC4KKy8vIERlZmF1bHQgYXNzdW1lcyBpbmRleCBiYXNlZCBhY2Nlc3NvcnMKK3RlbXBsYXRlPHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorc3RydWN0IHN0b3JhZ2Vfa2luZF90b19ldmFsdWF0b3Jfa2luZCB7CisgIHR5cGVkZWYgSW5kZXhCYXNlZCBLaW5kOworfTsKKworLy8gVGhpcyBjbGFzcyByZXR1cm5zIHRoZSBldmFsdWF0b3Igc2hhcGUgZnJvbSB0aGUgZXhwcmVzc2lvbiBzdG9yYWdlIGtpbmQuCisvLyBJdCBjYW4gYmUgRGVuc2UsIFNwYXJzZSwgVHJpYW5ndWxhciwgRGlhZ29uYWwsIFNlbGZBZGpvaW50LCBCYW5kLCBldGMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdG9yYWdlS2luZD4gc3RydWN0IHN0b3JhZ2Vfa2luZF90b19zaGFwZTsKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc3RvcmFnZV9raW5kX3RvX3NoYXBlPERlbnNlPiAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBEZW5zZVNoYXBlIFNoYXBlOyAgICAgICAgICAgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHN0b3JhZ2Vfa2luZF90b19zaGFwZTxTb2x2ZXJTdG9yYWdlPiAgICAgICAgICB7IHR5cGVkZWYgU29sdmVyU2hhcGUgU2hhcGU7ICAgICAgICAgICB9OwordGVtcGxhdGU8PiBzdHJ1Y3Qgc3RvcmFnZV9raW5kX3RvX3NoYXBlPFBlcm11dGF0aW9uU3RvcmFnZT4gICAgIHsgdHlwZWRlZiBQZXJtdXRhdGlvblNoYXBlIFNoYXBlOyAgICAgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHN0b3JhZ2Vfa2luZF90b19zaGFwZTxUcmFuc3Bvc2l0aW9uc1N0b3JhZ2U+ICB7IHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNTaGFwZSBTaGFwZTsgIH07CisKKy8vIEV2YWx1YXRvcnMgaGF2ZSB0byBiZSBzcGVjaWFsaXplZCB3aXRoIHJlc3BlY3QgdG8gdmFyaW91cyBjcml0ZXJpYSBzdWNoIGFzOgorLy8gIC0gc3RvcmFnZS9zdHJ1Y3R1cmUvc2hhcGUKKy8vICAtIHNjYWxhciB0eXBlCisvLyAgLSBldGMuCisvLyBUaGVyZWZvcmUsIHdlIG5lZWQgc3BlY2lhbGl6YXRpb24gb2YgZXZhbHVhdG9yIHByb3ZpZGluZyBhZGRpdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgZWFjaCBraW5kIG9mIGV2YWx1YXRvcnMuCisvLyBXZSBjdXJyZW50bHkgZGlzdGluZ3Vpc2ggdGhlIGZvbGxvd2luZyBraW5kIG9mIGV2YWx1YXRvcnM6CisvLyAtIHVuYXJ5X2V2YWx1YXRvciAgICBmb3IgZXhwcmVzc2lvbnMgdGFraW5nIG9ubHkgb25lIGFyZ3VtZW50cyAoQ3dpc2VVbmFyeU9wLCBDd2lzZVVuYXJ5VmlldywgVHJhbnNwb3NlLCBNYXRyaXhXcmFwcGVyLCBBcnJheVdyYXBwZXIsIFJldmVyc2UsIFJlcGxpY2F0ZSkKKy8vIC0gYmluYXJ5X2V2YWx1YXRvciAgIGZvciBleHByZXNzaW9uIHRha2luZyB0d28gYXJndW1lbnRzIChDd2lzZUJpbmFyeU9wKQorLy8gLSB0ZXJuYXJ5X2V2YWx1YXRvciAgIGZvciBleHByZXNzaW9uIHRha2luZyB0aHJlZSBhcmd1bWVudHMgKEN3aXNlVGVybmFyeU9wKQorLy8gLSBwcm9kdWN0X2V2YWx1YXRvciAgZm9yIGxpbmVhciBhbGdlYnJhIHByb2R1Y3RzIChQcm9kdWN0KTsgc3BlY2lhbCBjYXNlIG9mIGJpbmFyeV9ldmFsdWF0b3IgYmVjYXVzZSBpdCByZXF1aXJlcyBhZGRpdGlvbmFsIHRhZ3MgZm9yIGRpc3BhdGNoaW5nLgorLy8gLSBtYXBiYXNlX2V2YWx1YXRvciAgZm9yIE1hcCwgQmxvY2ssIFJlZgorLy8gLSBibG9ja19ldmFsdWF0b3IgICAgZm9yIEJsb2NrIChzcGVjaWFsIGRpc3BhdGNoaW5nIHRvIGEgbWFwYmFzZV9ldmFsdWF0b3Igb3IgdW5hcnlfZXZhbHVhdG9yKQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwKKyAgICAgICAgICB0eXBlbmFtZSBBcmcxS2luZCAgID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czx0eXBlbmFtZSBUOjpBcmcxPjo6S2luZCwKKyAgICAgICAgICB0eXBlbmFtZSBBcmcyS2luZCAgID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czx0eXBlbmFtZSBUOjpBcmcyPjo6S2luZCwKKyAgICAgICAgICB0eXBlbmFtZSBBcmczS2luZCAgID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czx0eXBlbmFtZSBUOjpBcmczPjo6S2luZCwKKyAgICAgICAgICB0eXBlbmFtZSBBcmcxU2NhbGFyID0gdHlwZW5hbWUgdHJhaXRzPHR5cGVuYW1lIFQ6OkFyZzE+OjpTY2FsYXIsCisgICAgICAgICAgdHlwZW5hbWUgQXJnMlNjYWxhciA9IHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSBUOjpBcmcyPjo6U2NhbGFyLAorICAgICAgICAgIHR5cGVuYW1lIEFyZzNTY2FsYXIgPSB0eXBlbmFtZSB0cmFpdHM8dHlwZW5hbWUgVDo6QXJnMz46OlNjYWxhcj4gc3RydWN0IHRlcm5hcnlfZXZhbHVhdG9yOworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwKKyAgICAgICAgICB0eXBlbmFtZSBMaHNLaW5kICAgPSB0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPHR5cGVuYW1lIFQ6Okxocz46OktpbmQsCisgICAgICAgICAgdHlwZW5hbWUgUmhzS2luZCAgID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czx0eXBlbmFtZSBUOjpSaHM+OjpLaW5kLAorICAgICAgICAgIHR5cGVuYW1lIExoc1NjYWxhciA9IHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSBUOjpMaHM+OjpTY2FsYXIsCisgICAgICAgICAgdHlwZW5hbWUgUmhzU2NhbGFyID0gdHlwZW5hbWUgdHJhaXRzPHR5cGVuYW1lIFQ6OlJocz46OlNjYWxhcj4gc3RydWN0IGJpbmFyeV9ldmFsdWF0b3I7CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBULAorICAgICAgICAgIHR5cGVuYW1lIEtpbmQgICA9IHR5cGVuYW1lIGV2YWx1YXRvcl90cmFpdHM8dHlwZW5hbWUgVDo6TmVzdGVkRXhwcmVzc2lvbj46OktpbmQsCisgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgVDo6U2NhbGFyPiBzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yOworICAgICAgICAgIAorLy8gZXZhbHVhdG9yX3RyYWl0czxUPiBjb250YWlucyB0cmFpdHMgZm9yIGV2YWx1YXRvcjxUPiAKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBldmFsdWF0b3JfdHJhaXRzX2Jhc2UKK3sKKyAgLy8gYnkgZGVmYXVsdCwgZ2V0IGV2YWx1YXRvciBraW5kIGFuZCBzaGFwZSBmcm9tIHN0b3JhZ2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdG9yYWdlX2tpbmRfdG9fZXZhbHVhdG9yX2tpbmQ8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTdG9yYWdlS2luZD46OktpbmQgS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdG9yYWdlX2tpbmRfdG9fc2hhcGU8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTdG9yYWdlS2luZD46OlNoYXBlIFNoYXBlOworfTsKKworLy8gRGVmYXVsdCBldmFsdWF0b3IgdHJhaXRzCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGV2YWx1YXRvcl90cmFpdHMgOiBwdWJsaWMgZXZhbHVhdG9yX3RyYWl0c19iYXNlPFQ+Cit7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTaGFwZSA9IHR5cGVuYW1lIGV2YWx1YXRvcl90cmFpdHM8VD46OlNoYXBlID4KK3N0cnVjdCBldmFsdWF0b3JfYXNzdW1lX2FsaWFzaW5nIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKKy8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIHVuYXJ5IGV4cHJlc3Npb246Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGV2YWx1YXRvciA6IHB1YmxpYyB1bmFyeV9ldmFsdWF0b3I8VD4KK3sKKyAgdHlwZWRlZiB1bmFyeV9ldmFsdWF0b3I8VD4gQmFzZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFQmIHhwcikgOiBCYXNlKHhwcikge30KK307CisKKworLy8gVE9ETzogVGhpbmsgYWJvdXQgY29uc3QtY29ycmVjdG5lc3MKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZXZhbHVhdG9yPGNvbnN0IFQ+CisgIDogZXZhbHVhdG9yPFQ+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBUJiB4cHIpIDogZXZhbHVhdG9yPFQ+KHhwcikge30KK307CisKKy8vIC0tLS0tLS0tLS0gYmFzZSBjbGFzcyBmb3IgYWxsIGV2YWx1YXRvcnMgLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3N0cnVjdCBldmFsdWF0b3JfYmFzZSA6IHB1YmxpYyBub25jb3B5YWJsZQoreworICAvLyBUT0RPIHRoYXQncyBub3QgdmVyeSBuaWNlIHRvIGhhdmUgdG8gcHJvcGFnYXRlIGFsbCB0aGVzZSB0cmFpdHMuIFRoZXkgYXJlIGN1cnJlbnRseSBvbmx5IG5lZWRlZCB0byBoYW5kbGUgb3V0ZXIsaW5uZXIgaW5kaWNlcy4KKyAgdHlwZWRlZiB0cmFpdHM8RXhwcmVzc2lvblR5cGU+IEV4cHJlc3Npb25UcmFpdHM7CisgIAorICBlbnVtIHsKKyAgICBBbGlnbm1lbnQgPSAwCisgIH07Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBNYXRyaXggYW5kIEFycmF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZXZhbHVhdG9yPFBsYWluT2JqZWN0QmFzZT4gaXMgYSBjb21tb24gYmFzZSBjbGFzcyBmb3IgdGhlCisvLyBNYXRyaXggYW5kIEFycmF5IGV2YWx1YXRvcnMuCisvLyBIZXJlIHdlIGRpcmVjdGx5IHNwZWNpYWxpemUgZXZhbHVhdG9yLiBUaGlzIGlzIG5vdCByZWFsbHkgYSB1bmFyeSBleHByZXNzaW9uLCBhbmQgaXQgaXMsIGJ5IGRlZmluaXRpb24sIGRlbnNlLAorLy8gc28gbm8gbmVlZCBmb3IgbW9yZSBzb3BoaXN0aWNhdGVkIGRpc3BhdGNoaW5nLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGV2YWx1YXRvcjxQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD4gPgorICA6IGV2YWx1YXRvcl9iYXNlPERlcml2ZWQ+Cit7CisgIHR5cGVkZWYgUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+IFBsYWluT2JqZWN0VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIGVudW0geworICAgIElzUm93TWFqb3IgPSBQbGFpbk9iamVjdFR5cGU6OklzUm93TWFqb3IsCisgICAgSXNWZWN0b3JBdENvbXBpbGVUaW1lID0gUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBQbGFpbk9iamVjdFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gUGxhaW5PYmplY3RUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIEZsYWdzID0gdHJhaXRzPERlcml2ZWQ+OjpFdmFsdWF0b3JGbGFncywKKyAgICBBbGlnbm1lbnQgPSB0cmFpdHM8RGVyaXZlZD46OkFsaWdubWVudAorICB9OworICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXZhbHVhdG9yKCkKKyAgICA6IG1fZGF0YSgwKSwKKyAgICAgIG1fb3V0ZXJTdHJpZGUoSXNWZWN0b3JBdENvbXBpbGVUaW1lICA/IDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoSXNSb3dNYWpvcikgPyBDb2xzQXRDb21waWxlVGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvd3NBdENvbXBpbGVUaW1lKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkKKyAgICA6IG1fZGF0YShtLmRhdGEoKSksIG1fb3V0ZXJTdHJpZGUoSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gMCA6IG0ub3V0ZXJTdHJpZGUoKSkgCisgIHsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBpZiAoSXNSb3dNYWpvcikKKyAgICAgIHJldHVybiBtX2RhdGFbcm93ICogbV9vdXRlclN0cmlkZS52YWx1ZSgpICsgY29sXTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbV9kYXRhW3JvdyArIGNvbCAqIG1fb3V0ZXJTdHJpZGUudmFsdWUoKV07CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICB7CisgICAgaWYgKElzUm93TWFqb3IpCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXIqPihtX2RhdGEpW3JvdyAqIG1fb3V0ZXJTdHJpZGUudmFsdWUoKSArIGNvbF07CisgICAgZWxzZQorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyKj4obV9kYXRhKVtyb3cgKyBjb2wgKiBtX291dGVyU3RyaWRlLnZhbHVlKCldOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyKj4obV9kYXRhKVtpbmRleF07CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBpZiAoSXNSb3dNYWpvcikKKyAgICAgIHJldHVybiBwbG9hZHQ8UGFja2V0VHlwZSwgTG9hZE1vZGU+KG1fZGF0YSArIHJvdyAqIG1fb3V0ZXJTdHJpZGUudmFsdWUoKSArIGNvbCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHBsb2FkdDxQYWNrZXRUeXBlLCBMb2FkTW9kZT4obV9kYXRhICsgcm93ICsgY29sICogbV9vdXRlclN0cmlkZS52YWx1ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBwbG9hZHQ8UGFja2V0VHlwZSwgTG9hZE1vZGU+KG1fZGF0YSArIGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBTdG9yZU1vZGUsdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRUeXBlJiB4KQorICB7CisgICAgaWYgKElzUm93TWFqb3IpCisgICAgICByZXR1cm4gcHN0b3JldDxTY2FsYXIsIFBhY2tldFR5cGUsIFN0b3JlTW9kZT4KKwkgICAgICAgICAgICAoY29uc3RfY2FzdDxTY2FsYXIqPihtX2RhdGEpICsgcm93ICogbV9vdXRlclN0cmlkZS52YWx1ZSgpICsgY29sLCB4KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gcHN0b3JldDxTY2FsYXIsIFBhY2tldFR5cGUsIFN0b3JlTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2Nhc3Q8U2NhbGFyKj4obV9kYXRhKSArIHJvdyArIGNvbCAqIG1fb3V0ZXJTdHJpZGUudmFsdWUoKSwgeCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IFBhY2tldFR5cGUmIHgpCisgIHsKKyAgICByZXR1cm4gcHN0b3JldDxTY2FsYXIsIFBhY2tldFR5cGUsIFN0b3JlTW9kZT4oY29uc3RfY2FzdDxTY2FsYXIqPihtX2RhdGEpICsgaW5kZXgsIHgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgU2NhbGFyICptX2RhdGE7CisKKyAgLy8gV2UgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgb3V0ZXIgc3RyaWRlIGZvciB2ZWN0b3JzCisgIHZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIElzVmVjdG9yQXRDb21waWxlVGltZSAgPyAwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KElzUm93TWFqb3IpID8gQ29sc0F0Q29tcGlsZVRpbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSb3dzQXRDb21waWxlVGltZT4gbV9vdXRlclN0cmlkZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgT3B0aW9ucywgaW50IE1heFJvd3MsIGludCBNYXhDb2xzPgorc3RydWN0IGV2YWx1YXRvcjxNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzLCBPcHRpb25zLCBNYXhSb3dzLCBNYXhDb2xzPiA+CisgIDogZXZhbHVhdG9yPFBsYWluT2JqZWN0QmFzZTxNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzLCBPcHRpb25zLCBNYXhSb3dzLCBNYXhDb2xzPiA+ID4KK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzLCBPcHRpb25zLCBNYXhSb3dzLCBNYXhDb2xzPiBYcHJUeXBlOworICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXZhbHVhdG9yKCkge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgbSkKKyAgICA6IGV2YWx1YXRvcjxQbGFpbk9iamVjdEJhc2U8WHByVHlwZT4gPihtKSAKKyAgeyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scywgaW50IE9wdGlvbnMsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scz4KK3N0cnVjdCBldmFsdWF0b3I8QXJyYXk8U2NhbGFyLCBSb3dzLCBDb2xzLCBPcHRpb25zLCBNYXhSb3dzLCBNYXhDb2xzPiA+CisgIDogZXZhbHVhdG9yPFBsYWluT2JqZWN0QmFzZTxBcnJheTxTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+ID4gPgoreworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgUm93cywgQ29scywgT3B0aW9ucywgTWF4Um93cywgTWF4Q29scz4gWHByVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBldmFsdWF0b3IoKSB7fQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG0pCisgICAgOiBldmFsdWF0b3I8UGxhaW5PYmplY3RCYXNlPFhwclR5cGU+ID4obSkgCisgIHsgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhbnNwb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPFRyYW5zcG9zZTxBcmdUeXBlPiwgSW5kZXhCYXNlZD4KKyAgOiBldmFsdWF0b3JfYmFzZTxUcmFuc3Bvc2U8QXJnVHlwZT4gPgoreworICB0eXBlZGVmIFRyYW5zcG9zZTxBcmdUeXBlPiBYcHJUeXBlOworICAKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCwgICAgCisgICAgRmxhZ3MgPSBldmFsdWF0b3I8QXJnVHlwZT46OkZsYWdzIF4gUm93TWFqb3JCaXQsCisgICAgQWxpZ25tZW50ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpBbGlnbm1lbnQKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgdCkgOiBtX2FyZ0ltcGwodC5uZXN0ZWRFeHByZXNzaW9uKCkpIHt9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKGNvbCwgcm93KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC5jb2VmZihpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgIHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmUmVmKGNvbCwgcm93KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmZSZWYoaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oY29sLCByb3cpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRUeXBlJiB4KQorICB7CisgICAgbV9hcmdJbXBsLnRlbXBsYXRlIHdyaXRlUGFja2V0PFN0b3JlTW9kZSxQYWNrZXRUeXBlPihjb2wsIHJvdywgeCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IFBhY2tldFR5cGUmIHgpCisgIHsKKyAgICBtX2FyZ0ltcGwudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlLFBhY2tldFR5cGU+KGluZGV4LCB4KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZU51bGxhcnlPcCAtLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlrZSBNYXRyaXggYW5kIEFycmF5LCB0aGlzIGlzIG5vdCByZWFsbHkgYSB1bmFyeSBleHByZXNzaW9uLCBzbyB3ZSBkaXJlY3RseSBzcGVjaWFsaXplIGV2YWx1YXRvci4KKy8vIExpa2V3aXNlLCB0aGVyZSBpcyBub3QgbmVlZCB0byBtb3JlIHNvcGhpc3RpY2F0ZWQgZGlzcGF0Y2hpbmcgaGVyZS4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIE51bGxhcnlPcCwKKyAgICAgICAgIGJvb2wgaGFzX251bGxhcnkgPSBoYXNfbnVsbGFyeV9vcGVyYXRvcjxOdWxsYXJ5T3A+Ojp2YWx1ZSwKKyAgICAgICAgIGJvb2wgaGFzX3VuYXJ5ICAgPSBoYXNfdW5hcnlfb3BlcmF0b3I8TnVsbGFyeU9wPjo6dmFsdWUsCisgICAgICAgICBib29sIGhhc19iaW5hcnkgID0gaGFzX2JpbmFyeV9vcGVyYXRvcjxOdWxsYXJ5T3A+Ojp2YWx1ZT4KK3N0cnVjdCBudWxsYXJ5X3dyYXBwZXIKK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSwgSW5kZXhUeXBlIGopIGNvbnN0IHsgcmV0dXJuIG9wKGksaik7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSkgY29uc3QgeyByZXR1cm4gb3AoaSk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXhUeXBlPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgcGFja2V0T3AoY29uc3QgTnVsbGFyeU9wJiBvcCwgSW5kZXhUeXBlIGksIEluZGV4VHlwZSBqKSBjb25zdCB7IHJldHVybiBvcC50ZW1wbGF0ZSBwYWNrZXRPcDxUPihpLGopOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmRleFR5cGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBwYWNrZXRPcChjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSkgY29uc3QgeyByZXR1cm4gb3AudGVtcGxhdGUgcGFja2V0T3A8VD4oaSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBOdWxsYXJ5T3A+CitzdHJ1Y3QgbnVsbGFyeV93cmFwcGVyPFNjYWxhcixOdWxsYXJ5T3AsdHJ1ZSxmYWxzZSxmYWxzZT4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGU9MCwgSW5kZXhUeXBlPTApIGNvbnN0IHsgcmV0dXJuIG9wKCk7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluZGV4VHlwZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIHBhY2tldE9wKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZT0wLCBJbmRleFR5cGU9MCkgY29uc3QgeyByZXR1cm4gb3AudGVtcGxhdGUgcGFja2V0T3A8VD4oKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIE51bGxhcnlPcD4KK3N0cnVjdCBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCxmYWxzZSxmYWxzZSx0cnVlPgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZSBpLCBJbmRleFR5cGUgaj0wKSBjb25zdCB7IHJldHVybiBvcChpLGopOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmRleFR5cGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBwYWNrZXRPcChjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSwgSW5kZXhUeXBlIGo9MCkgY29uc3QgeyByZXR1cm4gb3AudGVtcGxhdGUgcGFja2V0T3A8VD4oaSxqKTsgfQorfTsKKworLy8gV2UgbmVlZCB0aGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uIGZvciB2ZWN0b3Itb25seSBmdW5jdG9ycyBhc3NpZ25lZCB0byBhIHJ1bnRpbWUgdmVjdG9yLAorLy8gZm9yIGluc3RhbmNlLCB1c2luZyBsaW5zcGFjZSBhbmQgYXNzaWduaW5nIGEgUm93VmVjdG9yWGQgdG8gYSBNYXRyaXhYZCBvciBldmVuIGEgcm93IG9mIGEgTWF0cml4WGQuCisvLyBJbiB0aGlzIGNhc2UsIGk9PTAgYW5kIGogaXMgdXNlZCBmb3IgdGhlIGFjdHVhbCBpdGVyYXRpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgTnVsbGFyeU9wPgorc3RydWN0IG51bGxhcnlfd3JhcHBlcjxTY2FsYXIsTnVsbGFyeU9wLGZhbHNlLHRydWUsZmFsc2U+Cit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIG9wZXJhdG9yKCkoY29uc3QgTnVsbGFyeU9wJiBvcCwgSW5kZXhUeXBlIGksIEluZGV4VHlwZSBqKSBjb25zdCB7CisgICAgZWlnZW5fYXNzZXJ0KGk9PTAgfHwgaj09MCk7CisgICAgcmV0dXJuIG9wKGkraik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluZGV4VHlwZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIHBhY2tldE9wKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZSBpLCBJbmRleFR5cGUgaikgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChpPT0wIHx8IGo9PTApOworICAgIHJldHVybiBvcC50ZW1wbGF0ZSBwYWNrZXRPcDxUPihpK2opOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSkgY29uc3QgeyByZXR1cm4gb3AoaSk7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIHBhY2tldE9wKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZSBpKSBjb25zdCB7IHJldHVybiBvcC50ZW1wbGF0ZSBwYWNrZXRPcDxUPihpKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIE51bGxhcnlPcD4KK3N0cnVjdCBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCxmYWxzZSxmYWxzZSxmYWxzZT4ge307CisKKyNpZiAwICYmIEVJR0VOX0NPTVBfTVNWQz4wCisvLyBEaXNhYmxlIHRoaXMgdWdseSB3b3JrYXJvdW5kLiBUaGlzIGlzIG5vdyBoYW5kbGVkIGluIHRyYWl0czxSZWY+OjptYXRjaCwKKy8vIGJ1dCB0aGlzIHBpZWNlIG9mIGNvZGUgbWlnaHQgc3RpbGwgYmVjb21lIGhhbmRseSBpZiBzb21lIG90aGVyIHdlaXJkIGNvbXBpbGF0aW9uCisvLyBlcnJvcyBwb3AgdXAgYWdhaW4uCisKKy8vIE1TVkMgZXhoaWJpdHMgYSB3ZWlyZCBjb21waWxhdGlvbiBlcnJvciB3aGVuCisvLyBjb21waWxpbmc6CisvLyAgICBFaWdlbjo6TWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oMywzKTsKKy8vICAgIFJlZjxjb25zdCBNYXRyaXhYZj4gUiA9IDIuZipBOworLy8gYW5kIHRoYXQgaGFzXyphcnlfb3BlcmF0b3I8c2NhbGFyX2NvbnN0YW50X29wPGZsb2F0Pj4gaGF2ZSBub3QgYmVlbiBpbnN0YW50aWF0ZWQgeWV0LgorLy8gVGhlICJwcm9ibGVtIiBpcyB0aGF0IGV2YWx1YXRvcjwyLmYqQT4gaXMgaW5zdGFudGlhdGVkIGJ5IHRyYWl0czxSZWY+OjptYXRjaDwyLmYqQT4KKy8vIGFuZCBhdCB0aGF0IHRpbWUgaGFzXyphcnlfb3BlcmF0b3I8VD4gcmV0dXJucyB0cnVlIHJlZ2FyZGxlc3Mgb2YgVC4KKy8vIFRoZW4gbnVsbGFyeV93cmFwcGVyIGlzIGJhZGx5IGluc3RhbnRpYXRlZCBhcyBudWxsYXJ5X3dyYXBwZXI8LiwuLHRydWUsdHJ1ZSx0cnVlPi4KKy8vIFRoZSB0cmljayBpcyB0aHVzIHRvIGRlZmVyIHRoZSBwcm9wZXIgaW5zdGFudGlhdGlvbiBvZiBudWxsYXJ5X3dyYXBwZXIgd2hlbiBjb2VmZigpLAorLy8gYW5kIHBhY2tldCgpIGFyZSByZWFsbHkgaW5zdGFudGlhdGVkIGFzIGltcGxlbWVudGVkIGJlbG93OgorCisvLyBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIEluZGV4IHRvIGVuZm9yY2UgdGhlIHJlLWluc3RhbnRpYXRpb24gb2YKKy8vIGhhc18qYXJ5X29wZXJhdG9yIHdoZW4gbmVlZGVkLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IG51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmMgeworICBudWxsYXJ5X3dyYXBwZXJfd29ya2Fyb3VuZF9tc3ZjKGNvbnN0IFQmKTsKKyAgb3BlcmF0b3IgVCgpY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgTnVsbGFyeU9wPgorc3RydWN0IG51bGxhcnlfd3JhcHBlcjxTY2FsYXIsTnVsbGFyeU9wLHRydWUsdHJ1ZSx0cnVlPgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZSBpLCBJbmRleFR5cGUgaikgY29uc3QgeworICAgIHJldHVybiBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCwKKyAgICBoYXNfbnVsbGFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc191bmFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc19iaW5hcnlfb3BlcmF0b3I8TnVsbGFyeU9wLG51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmM8SW5kZXhUeXBlPiA+Ojp2YWx1ZT4oKS5vcGVyYXRvcigpKG9wLGksaik7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSkgY29uc3QgeworICAgIHJldHVybiBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCwKKyAgICBoYXNfbnVsbGFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc191bmFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc19iaW5hcnlfb3BlcmF0b3I8TnVsbGFyeU9wLG51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmM8SW5kZXhUeXBlPiA+Ojp2YWx1ZT4oKS5vcGVyYXRvcigpKG9wLGkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIHBhY2tldE9wKGNvbnN0IE51bGxhcnlPcCYgb3AsIEluZGV4VHlwZSBpLCBJbmRleFR5cGUgaikgY29uc3QgeworICAgIHJldHVybiBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCwKKyAgICBoYXNfbnVsbGFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc191bmFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc19iaW5hcnlfb3BlcmF0b3I8TnVsbGFyeU9wLG51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmM8SW5kZXhUeXBlPiA+Ojp2YWx1ZT4oKS50ZW1wbGF0ZSBwYWNrZXRPcDxUPihvcCxpLGopOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBwYWNrZXRPcChjb25zdCBOdWxsYXJ5T3AmIG9wLCBJbmRleFR5cGUgaSkgY29uc3QgeworICAgIHJldHVybiBudWxsYXJ5X3dyYXBwZXI8U2NhbGFyLE51bGxhcnlPcCwKKyAgICBoYXNfbnVsbGFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc191bmFyeV9vcGVyYXRvcjxOdWxsYXJ5T3AsbnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YzxJbmRleFR5cGU+ID46OnZhbHVlLAorICAgIGhhc19iaW5hcnlfb3BlcmF0b3I8TnVsbGFyeU9wLG51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmM8SW5kZXhUeXBlPiA+Ojp2YWx1ZT4oKS50ZW1wbGF0ZSBwYWNrZXRPcDxUPihvcCxpKTsKKyAgfQorfTsKKyNlbmRpZiAvLyBNU1ZDIHdvcmthcm91bmQKKwordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yPEN3aXNlTnVsbGFyeU9wPE51bGxhcnlPcCxQbGFpbk9iamVjdFR5cGU+ID4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsUGxhaW5PYmplY3RUeXBlPiA+Cit7CisgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8TnVsbGFyeU9wLFBsYWluT2JqZWN0VHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxQbGFpbk9iamVjdFR5cGU+Ojp0eXBlIFBsYWluT2JqZWN0VHlwZUNsZWFuZWQ7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPE51bGxhcnlPcD46OkNvc3QsCisgICAgCisgICAgRmxhZ3MgPSAoZXZhbHVhdG9yPFBsYWluT2JqZWN0VHlwZUNsZWFuZWQ+OjpGbGFncworICAgICAgICAgICYgICggIEhlcmVkaXRhcnlCaXRzCisgICAgICAgICAgICAgIHwgKGZ1bmN0b3JfaGFzX2xpbmVhcl9hY2Nlc3M8TnVsbGFyeU9wPjo6cmV0ICA/IExpbmVhckFjY2Vzc0JpdCA6IDApCisgICAgICAgICAgICAgIHwgKGZ1bmN0b3JfdHJhaXRzPE51bGxhcnlPcD46OlBhY2tldEFjY2VzcyAgICA/IFBhY2tldEFjY2Vzc0JpdCA6IDApKSkKKyAgICAgICAgICB8IChmdW5jdG9yX3RyYWl0czxOdWxsYXJ5T3A+OjpJc1JlcGVhdGFibGUgPyAwIDogRXZhbEJlZm9yZU5lc3RpbmdCaXQpLAorICAgIEFsaWdubWVudCA9IEFsaWduZWRNYXgKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgbikKKyAgICA6IG1fZnVuY3RvcihuLmZ1bmN0b3IoKSksIG1fd3JhcHBlcigpCisgIHsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4VHlwZSByb3csIEluZGV4VHlwZSBjb2wpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV93cmFwcGVyKG1fZnVuY3Rvciwgcm93LCBjb2wpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXhUeXBlIGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fd3JhcHBlcihtX2Z1bmN0b3IsaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXhUeXBlIHJvdywgSW5kZXhUeXBlIGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3dyYXBwZXIudGVtcGxhdGUgcGFja2V0T3A8UGFja2V0VHlwZT4obV9mdW5jdG9yLCByb3csIGNvbCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleFR5cGUgaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV93cmFwcGVyLnRlbXBsYXRlIHBhY2tldE9wPFBhY2tldFR5cGU+KG1fZnVuY3RvciwgaW5kZXgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgTnVsbGFyeU9wIG1fZnVuY3RvcjsKKyAgY29uc3QgaW50ZXJuYWw6Om51bGxhcnlfd3JhcHBlcjxDb2VmZlJldHVyblR5cGUsTnVsbGFyeU9wPiBtX3dyYXBwZXI7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZVVuYXJ5T3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgdHlwZW5hbWUgQXJnVHlwZT4KK3N0cnVjdCB1bmFyeV9ldmFsdWF0b3I8Q3dpc2VVbmFyeU9wPFVuYXJ5T3AsIEFyZ1R5cGU+LCBJbmRleEJhc2VkID4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgQXJnVHlwZT4gPgoreworICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBBcmdUeXBlPiBYcHJUeXBlOworICAKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCArIGZ1bmN0b3JfdHJhaXRzPFVuYXJ5T3A+OjpDb3N0LAorICAgIAorICAgIEZsYWdzID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpGbGFncworICAgICAgICAgICYgKEhlcmVkaXRhcnlCaXRzIHwgTGluZWFyQWNjZXNzQml0IHwgKGZ1bmN0b3JfdHJhaXRzPFVuYXJ5T3A+OjpQYWNrZXRBY2Nlc3MgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwKSksCisgICAgQWxpZ25tZW50ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpBbGlnbm1lbnQKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCkKKyAgICA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLCAKKyAgICAgIG1fYXJnSW1wbChvcC5uZXN0ZWRFeHByZXNzaW9uKCkpIAorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxVbmFyeU9wPjo6Q29zdCk7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Z1bmN0b3IobV9hcmdJbXBsLmNvZWZmKHJvdywgY29sKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Z1bmN0b3IobV9hcmdJbXBsLmNvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yLnBhY2tldE9wKG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsIFBhY2tldFR5cGU+KHJvdywgY29sKSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yLnBhY2tldE9wKG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsIFBhY2tldFR5cGU+KGluZGV4KSk7CisgIH0KKworcHJvdGVjdGVkOgorICBjb25zdCBVbmFyeU9wIG1fZnVuY3RvcjsKKyAgZXZhbHVhdG9yPEFyZ1R5cGU+IG1fYXJnSW1wbDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEN3aXNlVGVybmFyeU9wIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHRoaXMgaXMgYSB0ZXJuYXJ5IGV4cHJlc3Npb24KK3RlbXBsYXRlPHR5cGVuYW1lIFRlcm5hcnlPcCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMz4KK3N0cnVjdCBldmFsdWF0b3I8Q3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxLCBBcmcyLCBBcmczPiA+CisgIDogcHVibGljIHRlcm5hcnlfZXZhbHVhdG9yPEN3aXNlVGVybmFyeU9wPFRlcm5hcnlPcCwgQXJnMSwgQXJnMiwgQXJnMz4gPgoreworICB0eXBlZGVmIEN3aXNlVGVybmFyeU9wPFRlcm5hcnlPcCwgQXJnMSwgQXJnMiwgQXJnMz4gWHByVHlwZTsKKyAgdHlwZWRlZiB0ZXJuYXJ5X2V2YWx1YXRvcjxDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzEsIEFyZzIsIEFyZzM+ID4gQmFzZTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpIDogQmFzZSh4cHIpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUZXJuYXJ5T3AsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+CitzdHJ1Y3QgdGVybmFyeV9ldmFsdWF0b3I8Q3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxLCBBcmcyLCBBcmczPiwgSW5kZXhCYXNlZCwgSW5kZXhCYXNlZD4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzEsIEFyZzIsIEFyZzM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzEsIEFyZzIsIEFyZzM+IFhwclR5cGU7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZzE+OjpDb2VmZlJlYWRDb3N0ICsgZXZhbHVhdG9yPEFyZzI+OjpDb2VmZlJlYWRDb3N0ICsgZXZhbHVhdG9yPEFyZzM+OjpDb2VmZlJlYWRDb3N0ICsgZnVuY3Rvcl90cmFpdHM8VGVybmFyeU9wPjo6Q29zdCwKKyAgICAKKyAgICBBcmcxRmxhZ3MgPSBldmFsdWF0b3I8QXJnMT46OkZsYWdzLAorICAgIEFyZzJGbGFncyA9IGV2YWx1YXRvcjxBcmcyPjo6RmxhZ3MsCisgICAgQXJnM0ZsYWdzID0gZXZhbHVhdG9yPEFyZzM+OjpGbGFncywKKyAgICBTYW1lVHlwZSA9IGlzX3NhbWU8dHlwZW5hbWUgQXJnMTo6U2NhbGFyLHR5cGVuYW1lIEFyZzI6OlNjYWxhcj46OnZhbHVlICYmIGlzX3NhbWU8dHlwZW5hbWUgQXJnMTo6U2NhbGFyLHR5cGVuYW1lIEFyZzM6OlNjYWxhcj46OnZhbHVlLAorICAgIFN0b3JhZ2VPcmRlcnNBZ3JlZSA9IChpbnQoQXJnMUZsYWdzKSZSb3dNYWpvckJpdCk9PShpbnQoQXJnMkZsYWdzKSZSb3dNYWpvckJpdCkgJiYgKGludChBcmcxRmxhZ3MpJlJvd01ham9yQml0KT09KGludChBcmczRmxhZ3MpJlJvd01ham9yQml0KSwKKyAgICBGbGFnczAgPSAoaW50KEFyZzFGbGFncykgfCBpbnQoQXJnMkZsYWdzKSB8IGludChBcmczRmxhZ3MpKSAmICgKKyAgICAgICAgSGVyZWRpdGFyeUJpdHMKKyAgICAgICAgfCAoaW50KEFyZzFGbGFncykgJiBpbnQoQXJnMkZsYWdzKSAmIGludChBcmczRmxhZ3MpICYKKyAgICAgICAgICAgKCAoU3RvcmFnZU9yZGVyc0FncmVlID8gTGluZWFyQWNjZXNzQml0IDogMCkKKyAgICAgICAgICAgfCAoZnVuY3Rvcl90cmFpdHM8VGVybmFyeU9wPjo6UGFja2V0QWNjZXNzICYmIFN0b3JhZ2VPcmRlcnNBZ3JlZSAmJiBTYW1lVHlwZSA/IFBhY2tldEFjY2Vzc0JpdCA6IDApCisgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICApLAorICAgIEZsYWdzID0gKEZsYWdzMCAmIH5Sb3dNYWpvckJpdCkgfCAoQXJnMUZsYWdzICYgUm93TWFqb3JCaXQpLAorICAgIEFsaWdubWVudCA9IEVJR0VOX1BMQUlOX0VOVU1fTUlOKAorICAgICAgICBFSUdFTl9QTEFJTl9FTlVNX01JTihldmFsdWF0b3I8QXJnMT46OkFsaWdubWVudCwgZXZhbHVhdG9yPEFyZzI+OjpBbGlnbm1lbnQpLAorICAgICAgICBldmFsdWF0b3I8QXJnMz46OkFsaWdubWVudCkKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCB0ZXJuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX2Z1bmN0b3IoeHByLmZ1bmN0b3IoKSksCisgICAgICBtX2FyZzFJbXBsKHhwci5hcmcxKCkpLCAKKyAgICAgIG1fYXJnMkltcGwoeHByLmFyZzIoKSksIAorICAgICAgbV9hcmczSW1wbCh4cHIuYXJnMygpKSAgCisgIHsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKGZ1bmN0b3JfdHJhaXRzPFRlcm5hcnlPcD46OkNvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yKG1fYXJnMUltcGwuY29lZmYocm93LCBjb2wpLCBtX2FyZzJJbXBsLmNvZWZmKHJvdywgY29sKSwgbV9hcmczSW1wbC5jb2VmZihyb3csIGNvbCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yKG1fYXJnMUltcGwuY29lZmYoaW5kZXgpLCBtX2FyZzJJbXBsLmNvZWZmKGluZGV4KSwgbV9hcmczSW1wbC5jb2VmZihpbmRleCkpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3Rvci5wYWNrZXRPcChtX2FyZzFJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZzJJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZzNJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCkpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3Rvci5wYWNrZXRPcChtX2FyZzFJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZzJJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZzNJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgVGVybmFyeU9wIG1fZnVuY3RvcjsKKyAgZXZhbHVhdG9yPEFyZzE+IG1fYXJnMUltcGw7CisgIGV2YWx1YXRvcjxBcmcyPiBtX2FyZzJJbXBsOworICBldmFsdWF0b3I8QXJnMz4gbV9hcmczSW1wbDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEN3aXNlQmluYXJ5T3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdGhpcyBpcyBhIGJpbmFyeSBleHByZXNzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiA+CisgIDogcHVibGljIGJpbmFyeV9ldmFsdWF0b3I8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gWHByVHlwZTsKKyAgdHlwZWRlZiBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiA+IEJhc2U7CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKSA6IEJhc2UoeHByKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQmluYXJ5T3AsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGJpbmFyeV9ldmFsdWF0b3I8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+LCBJbmRleEJhc2VkLCBJbmRleEJhc2VkPgorICA6IGV2YWx1YXRvcl9iYXNlPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+IFhwclR5cGU7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPExocz46OkNvZWZmUmVhZENvc3QgKyBldmFsdWF0b3I8UmhzPjo6Q29lZmZSZWFkQ29zdCArIGZ1bmN0b3JfdHJhaXRzPEJpbmFyeU9wPjo6Q29zdCwKKyAgICAKKyAgICBMaHNGbGFncyA9IGV2YWx1YXRvcjxMaHM+OjpGbGFncywKKyAgICBSaHNGbGFncyA9IGV2YWx1YXRvcjxSaHM+OjpGbGFncywKKyAgICBTYW1lVHlwZSA9IGlzX3NhbWU8dHlwZW5hbWUgTGhzOjpTY2FsYXIsdHlwZW5hbWUgUmhzOjpTY2FsYXI+Ojp2YWx1ZSwKKyAgICBTdG9yYWdlT3JkZXJzQWdyZWUgPSAoaW50KExoc0ZsYWdzKSZSb3dNYWpvckJpdCk9PShpbnQoUmhzRmxhZ3MpJlJvd01ham9yQml0KSwKKyAgICBGbGFnczAgPSAoaW50KExoc0ZsYWdzKSB8IGludChSaHNGbGFncykpICYgKAorICAgICAgICBIZXJlZGl0YXJ5Qml0cworICAgICAgfCAoaW50KExoc0ZsYWdzKSAmIGludChSaHNGbGFncykgJgorICAgICAgICAgICAoIChTdG9yYWdlT3JkZXJzQWdyZWUgPyBMaW5lYXJBY2Nlc3NCaXQgOiAwKQorICAgICAgICAgICB8IChmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OlBhY2tldEFjY2VzcyAmJiBTdG9yYWdlT3JkZXJzQWdyZWUgJiYgU2FtZVR5cGUgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwKQorICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgKSwKKyAgICBGbGFncyA9IChGbGFnczAgJiB+Um93TWFqb3JCaXQpIHwgKExoc0ZsYWdzICYgUm93TWFqb3JCaXQpLAorICAgIEFsaWdubWVudCA9IEVJR0VOX1BMQUlOX0VOVU1fTUlOKGV2YWx1YXRvcjxMaHM+OjpBbGlnbm1lbnQsZXZhbHVhdG9yPFJocz46OkFsaWdubWVudCkKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IG1fZnVuY3Rvcih4cHIuZnVuY3RvcigpKSwKKyAgICAgIG1fbGhzSW1wbCh4cHIubGhzKCkpLCAKKyAgICAgIG1fcmhzSW1wbCh4cHIucmhzKCkpICAKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0KTsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3RvcihtX2xoc0ltcGwuY29lZmYocm93LCBjb2wpLCBtX3Joc0ltcGwuY29lZmYocm93LCBjb2wpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3RvcihtX2xoc0ltcGwuY29lZmYoaW5kZXgpLCBtX3Joc0ltcGwuY29lZmYoaW5kZXgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Z1bmN0b3IucGFja2V0T3AobV9saHNJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Joc0ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdywgY29sKSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yLnBhY2tldE9wKG1fbGhzSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yaHNJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgQmluYXJ5T3AgbV9mdW5jdG9yOworICBldmFsdWF0b3I8TGhzPiBtX2xoc0ltcGw7CisgIGV2YWx1YXRvcjxSaHM+IG1fcmhzSW1wbDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEN3aXNlVW5hcnlWaWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEN3aXNlVW5hcnlWaWV3PFVuYXJ5T3AsIEFyZ1R5cGU+LCBJbmRleEJhc2VkPgorICA6IGV2YWx1YXRvcl9iYXNlPEN3aXNlVW5hcnlWaWV3PFVuYXJ5T3AsIEFyZ1R5cGU+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZVVuYXJ5VmlldzxVbmFyeU9wLCBBcmdUeXBlPiBYcHJUeXBlOworICAKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCArIGZ1bmN0b3JfdHJhaXRzPFVuYXJ5T3A+OjpDb3N0LAorICAgIAorICAgIEZsYWdzID0gKGV2YWx1YXRvcjxBcmdUeXBlPjo6RmxhZ3MgJiAoSGVyZWRpdGFyeUJpdHMgfCBMaW5lYXJBY2Nlc3NCaXQgfCBEaXJlY3RBY2Nlc3NCaXQpKSwKKyAgICAKKyAgICBBbGlnbm1lbnQgPSAwIC8vIEZJWE1FIGl0IGlzIG5vdCB2ZXJ5IGNsZWFyIHdoeSBhbGlnbm1lbnQgaXMgbmVjZXNzYXJpbHkgbG9zdC4uLgorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCkKKyAgICA6IG1fdW5hcnlPcChvcC5mdW5jdG9yKCkpLCAKKyAgICAgIG1fYXJnSW1wbChvcC5uZXN0ZWRFeHByZXNzaW9uKCkpIAorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxVbmFyeU9wPjo6Q29zdCk7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fdW5hcnlPcChtX2FyZ0ltcGwuY29lZmYocm93LCBjb2wpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fdW5hcnlPcChtX2FyZ0ltcGwuY29lZmYoaW5kZXgpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgeworICAgIHJldHVybiBtX3VuYXJ5T3AobV9hcmdJbXBsLmNvZWZmUmVmKHJvdywgY29sKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICByZXR1cm4gbV91bmFyeU9wKG1fYXJnSW1wbC5jb2VmZlJlZihpbmRleCkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgVW5hcnlPcCBtX3VuYXJ5T3A7CisgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBNYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRklYTUUgcGVyaGFwcyB0aGUgUGxhaW5PYmplY3RUeXBlIGNvdWxkIGJlIHByb3ZpZGVkIGJ5IERlcml2ZWQ6OlBsYWluT2JqZWN0ID8KKy8vIGJ1dCB0aGF0IG1pZ2h0IGNvbXBsaWNhdGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBiYXNlX2V2YWx1YXRvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorc3RydWN0IG1hcGJhc2VfZXZhbHVhdG9yIDogZXZhbHVhdG9yX2Jhc2U8RGVyaXZlZD4KK3sKKyAgdHlwZWRlZiBEZXJpdmVkICBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBvaW50ZXJUeXBlIFBvaW50ZXJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgCisgIGVudW0geworICAgIElzUm93TWFqb3IgPSBYcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhZENvc3QKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBtYXBiYXNlX2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBtYXApCisgICAgOiBtX2RhdGEoY29uc3RfY2FzdDxQb2ludGVyVHlwZT4obWFwLmRhdGEoKSkpLAorICAgICAgbV9pbm5lclN0cmlkZShtYXAuaW5uZXJTdHJpZGUoKSksCisgICAgICBtX291dGVyU3RyaWRlKG1hcC5vdXRlclN0cmlkZSgpKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFSUdFTl9JTVBMSUVTKGV2YWx1YXRvcjxEZXJpdmVkPjo6RmxhZ3MmUGFja2V0QWNjZXNzQml0LCBpbnRlcm5hbDo6aW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxEZXJpdmVkPjo6cmV0PT0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tFVF9BQ0NFU1NfUkVRVUlSRVNfVE9fSEFWRV9JTk5FUl9TVFJJREVfRklYRURfVE9fMSk7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZGF0YVtjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZGF0YVtpbmRleCAqIG1faW5uZXJTdHJpZGUudmFsdWUoKV07CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgIHsKKyAgICByZXR1cm4gbV9kYXRhW2NvbCAqIGNvbFN0cmlkZSgpICsgcm93ICogcm93U3RyaWRlKCldOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7CisgICAgcmV0dXJuIG1fZGF0YVtpbmRleCAqIG1faW5uZXJTdHJpZGUudmFsdWUoKV07CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBQb2ludGVyVHlwZSBwdHIgPSBtX2RhdGEgKyByb3cgKiByb3dTdHJpZGUoKSArIGNvbCAqIGNvbFN0cmlkZSgpOworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFR5cGUsIExvYWRNb2RlPihwdHIpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8UGFja2V0VHlwZSwgTG9hZE1vZGU+KG1fZGF0YSArIGluZGV4ICogbV9pbm5lclN0cmlkZS52YWx1ZSgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBTdG9yZU1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgUGFja2V0VHlwZSYgeCkKKyAgeworICAgIFBvaW50ZXJUeXBlIHB0ciA9IG1fZGF0YSArIHJvdyAqIHJvd1N0cmlkZSgpICsgY29sICogY29sU3RyaWRlKCk7CisgICAgcmV0dXJuIGludGVybmFsOjpwc3RvcmV0PFNjYWxhciwgUGFja2V0VHlwZSwgU3RvcmVNb2RlPihwdHIsIHgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRUeXBlJiB4KQorICB7CisgICAgaW50ZXJuYWw6OnBzdG9yZXQ8U2NhbGFyLCBQYWNrZXRUeXBlLCBTdG9yZU1vZGU+KG1fZGF0YSArIGluZGV4ICogbV9pbm5lclN0cmlkZS52YWx1ZSgpLCB4KTsKKyAgfQorcHJvdGVjdGVkOgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgSW5kZXggcm93U3RyaWRlKCkgY29uc3QgeyByZXR1cm4gWHByVHlwZTo6SXNSb3dNYWpvciA/IG1fb3V0ZXJTdHJpZGUudmFsdWUoKSA6IG1faW5uZXJTdHJpZGUudmFsdWUoKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgSW5kZXggY29sU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gWHByVHlwZTo6SXNSb3dNYWpvciA/IG1faW5uZXJTdHJpZGUudmFsdWUoKSA6IG1fb3V0ZXJTdHJpZGUudmFsdWUoKTsgfQorCisgIFBvaW50ZXJUeXBlIG1fZGF0YTsKKyAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFhwclR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT4gbV9pbm5lclN0cmlkZTsKKyAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFhwclR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZT4gbV9vdXRlclN0cmlkZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE1hcE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+IAorc3RydWN0IGV2YWx1YXRvcjxNYXA8UGxhaW5PYmplY3RUeXBlLCBNYXBPcHRpb25zLCBTdHJpZGVUeXBlPiA+CisgIDogcHVibGljIG1hcGJhc2VfZXZhbHVhdG9yPE1hcDxQbGFpbk9iamVjdFR5cGUsIE1hcE9wdGlvbnMsIFN0cmlkZVR5cGU+LCBQbGFpbk9iamVjdFR5cGU+Cit7CisgIHR5cGVkZWYgTWFwPFBsYWluT2JqZWN0VHlwZSwgTWFwT3B0aW9ucywgU3RyaWRlVHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICAvLyBUT0RPOiBzaG91bGQgY2hlY2sgZm9yIHNtYWxsZXIgcGFja2V0IHR5cGVzIG9uY2Ugd2UgY2FuIGhhbmRsZSBtdWx0aS1zaXplZCBwYWNrZXQgdHlwZXMKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICAKKyAgZW51bSB7CisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoUGxhaW5PYmplY3RUeXBlOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSksCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoUGxhaW5PYmplY3RUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KFN0cmlkZVR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSksCisgICAgSGFzTm9Jbm5lclN0cmlkZSA9IElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9PSAxLAorICAgIEhhc05vT3V0ZXJTdHJpZGUgPSBTdHJpZGVUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgPT0gMCwKKyAgICBIYXNOb1N0cmlkZSA9IEhhc05vSW5uZXJTdHJpZGUgJiYgSGFzTm9PdXRlclN0cmlkZSwKKyAgICBJc0R5bmFtaWNTaXplID0gUGxhaW5PYmplY3RUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYywKKyAgICAKKyAgICBQYWNrZXRBY2Nlc3NNYXNrID0gYm9vbChIYXNOb0lubmVyU3RyaWRlKSA/IH5pbnQoMCkgOiB+aW50KFBhY2tldEFjY2Vzc0JpdCksCisgICAgTGluZWFyQWNjZXNzTWFzayA9IGJvb2woSGFzTm9TdHJpZGUpIHx8IGJvb2woUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gfmludCgwKSA6IH5pbnQoTGluZWFyQWNjZXNzQml0KSwKKyAgICBGbGFncyA9IGludCggZXZhbHVhdG9yPFBsYWluT2JqZWN0VHlwZT46OkZsYWdzKSAmIChMaW5lYXJBY2Nlc3NNYXNrJlBhY2tldEFjY2Vzc01hc2spLAorICAgIAorICAgIEFsaWdubWVudCA9IGludChNYXBPcHRpb25zKSZpbnQoQWxpZ25lZE1hc2spCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG1hcCkKKyAgICA6IG1hcGJhc2VfZXZhbHVhdG9yPFhwclR5cGUsIFBsYWluT2JqZWN0VHlwZT4obWFwKSAKKyAgeyB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgUmVmT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4gCitzdHJ1Y3QgZXZhbHVhdG9yPFJlZjxQbGFpbk9iamVjdFR5cGUsIFJlZk9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KKyAgOiBwdWJsaWMgbWFwYmFzZV9ldmFsdWF0b3I8UmVmPFBsYWluT2JqZWN0VHlwZSwgUmVmT3B0aW9ucywgU3RyaWRlVHlwZT4sIFBsYWluT2JqZWN0VHlwZT4KK3sKKyAgdHlwZWRlZiBSZWY8UGxhaW5PYmplY3RUeXBlLCBSZWZPcHRpb25zLCBTdHJpZGVUeXBlPiBYcHJUeXBlOworICAKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBldmFsdWF0b3I8TWFwPFBsYWluT2JqZWN0VHlwZSwgUmVmT3B0aW9ucywgU3RyaWRlVHlwZT4gPjo6RmxhZ3MsCisgICAgQWxpZ25tZW50ID0gZXZhbHVhdG9yPE1hcDxQbGFpbk9iamVjdFR5cGUsIFJlZk9wdGlvbnMsIFN0cmlkZVR5cGU+ID46OkFsaWdubWVudAorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiByZWYpCisgICAgOiBtYXBiYXNlX2V2YWx1YXRvcjxYcHJUeXBlLCBQbGFpbk9iamVjdFR5cGU+KHJlZikgCisgIHsgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmxvY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsLAorICAgICAgICAgYm9vbCBIYXNEaXJlY3RBY2Nlc3MgPSBpbnRlcm5hbDo6aGFzX2RpcmVjdF9hY2Nlc3M8QXJnVHlwZT46OnJldD4gc3RydWN0IGJsb2NrX2V2YWx1YXRvcjsKKyAgICAgICAgIAordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsPiAKK3N0cnVjdCBldmFsdWF0b3I8QmxvY2s8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+ID4KKyAgOiBibG9ja19ldmFsdWF0b3I8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+Cit7CisgIHR5cGVkZWYgQmxvY2s8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgLy8gVE9ETzogc2hvdWxkIGNoZWNrIGZvciBzbWFsbGVyIHBhY2tldCB0eXBlcyBvbmNlIHdlIGNhbiBoYW5kbGUgbXVsdGktc2l6ZWQgcGFja2V0IHR5cGVzCisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSB0cmFpdHM8WHByVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPFhwclR5cGU+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IHRyYWl0czxYcHJUeXBlPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSB0cmFpdHM8WHByVHlwZT46Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgIAorICAgIEFyZ1R5cGVJc1Jvd01ham9yID0gKGludChldmFsdWF0b3I8QXJnVHlwZT46OkZsYWdzKSZSb3dNYWpvckJpdCkgIT0gMCwKKyAgICBJc1Jvd01ham9yID0gKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT0xKSA/IDEKKyAgICAgICAgICAgICAgIDogKE1heENvbHNBdENvbXBpbGVUaW1lPT0xICYmIE1heFJvd3NBdENvbXBpbGVUaW1lIT0xKSA/IDAKKyAgICAgICAgICAgICAgIDogQXJnVHlwZUlzUm93TWFqb3IsCisgICAgSGFzU2FtZVN0b3JhZ2VPcmRlckFzQXJnVHlwZSA9IChJc1Jvd01ham9yID09IEFyZ1R5cGVJc1Jvd01ham9yKSwKKyAgICBJbm5lclNpemUgPSBJc1Jvd01ham9yID8gaW50KENvbHNBdENvbXBpbGVUaW1lKSA6IGludChSb3dzQXRDb21waWxlVGltZSksCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSGFzU2FtZVN0b3JhZ2VPcmRlckFzQXJnVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludChpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPEFyZ1R5cGU+OjpyZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8QXJnVHlwZT46OnJldCksCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSGFzU2FtZVN0b3JhZ2VPcmRlckFzQXJnVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludChvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPEFyZ1R5cGU+OjpyZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGlubmVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8QXJnVHlwZT46OnJldCksCisgICAgTWFza1BhY2tldEFjY2Vzc0JpdCA9IChJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPT0gMSkgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwLAorICAgIAorICAgIEZsYWdzTGluZWFyQWNjZXNzQml0ID0gKFJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gMSB8fCAoSW5uZXJQYW5lbCAmJiAoZXZhbHVhdG9yPEFyZ1R5cGU+OjpGbGFncyZMaW5lYXJBY2Nlc3NCaXQpKSkgPyBMaW5lYXJBY2Nlc3NCaXQgOiAwLCAgICAKKyAgICBGbGFnc1Jvd01ham9yQml0ID0gWHByVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQsCisgICAgRmxhZ3MwID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpGbGFncyAmICggKEhlcmVkaXRhcnlCaXRzICYgflJvd01ham9yQml0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0QWNjZXNzQml0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrUGFja2V0QWNjZXNzQml0KSwKKyAgICBGbGFncyA9IEZsYWdzMCB8IEZsYWdzTGluZWFyQWNjZXNzQml0IHwgRmxhZ3NSb3dNYWpvckJpdCwKKyAgICAKKyAgICBQYWNrZXRBbGlnbm1lbnQgPSB1bnBhY2tldF90cmFpdHM8UGFja2V0U2NhbGFyPjo6YWxpZ25tZW50LAorICAgIEFsaWdubWVudDAgPSAoSW5uZXJQYW5lbCAmJiAoT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lIT1EeW5hbWljKSAmJiAoKChPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgKiBpbnQoc2l6ZW9mKFNjYWxhcikpKSAlIGludChQYWNrZXRBbGlnbm1lbnQpKSA9PSAwKSkgPyBpbnQoUGFja2V0QWxpZ25tZW50KSA6IDAsCisgICAgQWxpZ25tZW50ID0gRUlHRU5fUExBSU5fRU5VTV9NSU4oZXZhbHVhdG9yPEFyZ1R5cGU+OjpBbGlnbm1lbnQsIEFsaWdubWVudDApCisgIH07CisgIHR5cGVkZWYgYmxvY2tfZXZhbHVhdG9yPEFyZ1R5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsPiBibG9ja19ldmFsdWF0b3JfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIGJsb2NrKSA6IGJsb2NrX2V2YWx1YXRvcl90eXBlKGJsb2NrKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorfTsKKworLy8gbm8gZGlyZWN0LWFjY2VzcyA9PiBkaXNwYXRjaCB0byBhIHVuYXJ5IGV2YWx1YXRvcgordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsPgorc3RydWN0IGJsb2NrX2V2YWx1YXRvcjxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbCwgLypIYXNEaXJlY3RBY2Nlc3MqLyBmYWxzZT4KKyAgOiB1bmFyeV9ldmFsdWF0b3I8QmxvY2s8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+ID4KK3sKKyAgdHlwZWRlZiBCbG9jazxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gWHByVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBibG9ja19ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgYmxvY2spCisgICAgOiB1bmFyeV9ldmFsdWF0b3I8WHByVHlwZT4oYmxvY2spIAorICB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scywgYm9vbCBJbm5lclBhbmVsPgorc3RydWN0IHVuYXJ5X2V2YWx1YXRvcjxCbG9jazxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4sIEluZGV4QmFzZWQ+CisgIDogZXZhbHVhdG9yX2Jhc2U8QmxvY2s8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+ID4KK3sKKyAgdHlwZWRlZiBCbG9jazxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gWHByVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgYmxvY2spCisgICAgOiBtX2FyZ0ltcGwoYmxvY2submVzdGVkRXhwcmVzc2lvbigpKSwgCisgICAgICBtX3N0YXJ0Um93KGJsb2NrLnN0YXJ0Um93KCkpLCAKKyAgICAgIG1fc3RhcnRDb2woYmxvY2suc3RhcnRDb2woKSkgCisgIHsgfQorIAorICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lCisgIH07CisgCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7IAorICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmYobV9zdGFydFJvdy52YWx1ZSgpICsgcm93LCBtX3N0YXJ0Q29sLnZhbHVlKCkgKyBjb2wpOyAKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsgCisgICAgcmV0dXJuIGNvZWZmKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXgsIFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDApOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICB7IAorICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmZSZWYobV9zdGFydFJvdy52YWx1ZSgpICsgcm93LCBtX3N0YXJ0Q29sLnZhbHVlKCkgKyBjb2wpOyAKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7IAorICAgIHJldHVybiBjb2VmZlJlZihSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4LCBSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKTsKKyAgfQorIAorICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IAorICB7IAorICAgIHJldHVybiBtX2FyZ0ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KG1fc3RhcnRSb3cudmFsdWUoKSArIHJvdywgbV9zdGFydENvbC52YWx1ZSgpICsgY29sKTsgCisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0IAorICB7IAorICAgIHJldHVybiBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IDAgOiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDApOworICB9CisgIAorICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IFBhY2tldFR5cGUmIHgpIAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGUsUGFja2V0VHlwZT4obV9zdGFydFJvdy52YWx1ZSgpICsgcm93LCBtX3N0YXJ0Q29sLnZhbHVlKCkgKyBjb2wsIHgpOyAKKyAgfQorICAKKyAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRUeXBlJiB4KSAKKyAgeworICAgIHJldHVybiB3cml0ZVBhY2tldDxTdG9yZU1vZGUsUGFja2V0VHlwZT4oUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IDAgOiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KTsKKyAgfQorIAorcHJvdGVjdGVkOgorICBldmFsdWF0b3I8QXJnVHlwZT4gbV9hcmdJbXBsOworICBjb25zdCB2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCAoQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gMSAmJiBCbG9ja1Jvd3M9PTEpID8gMCA6IER5bmFtaWM+IG1fc3RhcnRSb3c7CisgIGNvbnN0IHZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIChBcmdUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSAxICYmIEJsb2NrQ29scz09MSkgPyAwIDogRHluYW1pYz4gbV9zdGFydENvbDsKK307CisKKy8vIFRPRE86IFRoaXMgZXZhbHVhdG9yIGRvZXMgbm90IGFjdHVhbGx5IHVzZSB0aGUgY2hpbGQgZXZhbHVhdG9yOyAKKy8vIGFsbCBhY3Rpb24gaXMgdmlhIHRoZSBkYXRhKCkgYXMgcmV0dXJuZWQgYnkgdGhlIEJsb2NrIGV4cHJlc3Npb24uCisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbD4gCitzdHJ1Y3QgYmxvY2tfZXZhbHVhdG9yPEFyZ1R5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsLCAvKiBIYXNEaXJlY3RBY2Nlc3MgKi8gdHJ1ZT4KKyAgOiBtYXBiYXNlX2V2YWx1YXRvcjxCbG9jazxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4sCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQmxvY2s8QXJnVHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIElubmVyUGFuZWw+OjpQbGFpbk9iamVjdD4KK3sKKyAgdHlwZWRlZiBCbG9jazxBcmdUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGJsb2NrX2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBibG9jaykKKyAgICA6IG1hcGJhc2VfZXZhbHVhdG9yPFhwclR5cGUsIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0PihibG9jaykgCisgIHsKKyAgICAvLyBUT0RPOiBmb3IgdGhlIDMuMyByZWxlYXNlLCB0aGlzIHNob3VsZCBiZSB0dXJuZWQgdG8gYW4gaW50ZXJuYWwgYXNzZXJ0aW9uLCBidXQgbGV0J3Mga2VlcCBpdCBhcyBpcyBmb3IgdGhlIGJldGEgbGlmZXRpbWUKKyAgICBlaWdlbl9hc3NlcnQoKChpbnRlcm5hbDo6VUludFB0cihibG9jay5kYXRhKCkpICUgRUlHRU5fUExBSU5fRU5VTV9NQVgoMSxldmFsdWF0b3I8WHByVHlwZT46OkFsaWdubWVudCkpID09IDApICYmICJkYXRhIGlzIG5vdCBhbGlnbmVkIik7CisgIH0KK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VsZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOT1RFIHNoYWxsIHdlIGludHJvZHVjZSBhIHRlcm5hcnlfZXZhbHVhdG9yPworCisvLyBUT0RPIGVuYWJsZSB2ZWN0b3JpemF0aW9uIGZvciBTZWxlY3QKK3RlbXBsYXRlPHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFRoZW5NYXRyaXhUeXBlLCB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZT4KK3N0cnVjdCBldmFsdWF0b3I8U2VsZWN0PENvbmRpdGlvbk1hdHJpeFR5cGUsIFRoZW5NYXRyaXhUeXBlLCBFbHNlTWF0cml4VHlwZT4gPgorICA6IGV2YWx1YXRvcl9iYXNlPFNlbGVjdDxDb25kaXRpb25NYXRyaXhUeXBlLCBUaGVuTWF0cml4VHlwZSwgRWxzZU1hdHJpeFR5cGU+ID4KK3sKKyAgdHlwZWRlZiBTZWxlY3Q8Q29uZGl0aW9uTWF0cml4VHlwZSwgVGhlbk1hdHJpeFR5cGUsIEVsc2VNYXRyaXhUeXBlPiBYcHJUeXBlOworICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPENvbmRpdGlvbk1hdHJpeFR5cGU+OjpDb2VmZlJlYWRDb3N0CisgICAgICAgICAgICAgICAgICArIEVJR0VOX1BMQUlOX0VOVU1fTUFYKGV2YWx1YXRvcjxUaGVuTWF0cml4VHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRvcjxFbHNlTWF0cml4VHlwZT46OkNvZWZmUmVhZENvc3QpLAorCisgICAgRmxhZ3MgPSAodW5zaWduZWQgaW50KWV2YWx1YXRvcjxUaGVuTWF0cml4VHlwZT46OkZsYWdzICYgZXZhbHVhdG9yPEVsc2VNYXRyaXhUeXBlPjo6RmxhZ3MgJiBIZXJlZGl0YXJ5Qml0cywKKyAgICAKKyAgICBBbGlnbm1lbnQgPSBFSUdFTl9QTEFJTl9FTlVNX01JTihldmFsdWF0b3I8VGhlbk1hdHJpeFR5cGU+OjpBbGlnbm1lbnQsIGV2YWx1YXRvcjxFbHNlTWF0cml4VHlwZT46OkFsaWdubWVudCkKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgc2VsZWN0KQorICAgIDogbV9jb25kaXRpb25JbXBsKHNlbGVjdC5jb25kaXRpb25NYXRyaXgoKSksCisgICAgICBtX3RoZW5JbXBsKHNlbGVjdC50aGVuTWF0cml4KCkpLAorICAgICAgbV9lbHNlSW1wbChzZWxlY3QuZWxzZU1hdHJpeCgpKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorIAorICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBpZiAobV9jb25kaXRpb25JbXBsLmNvZWZmKHJvdywgY29sKSkKKyAgICAgIHJldHVybiBtX3RoZW5JbXBsLmNvZWZmKHJvdywgY29sKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbV9lbHNlSW1wbC5jb2VmZihyb3csIGNvbCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGlmIChtX2NvbmRpdGlvbkltcGwuY29lZmYoaW5kZXgpKQorICAgICAgcmV0dXJuIG1fdGhlbkltcGwuY29lZmYoaW5kZXgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2Vsc2VJbXBsLmNvZWZmKGluZGV4KTsKKyAgfQorIAorcHJvdGVjdGVkOgorICBldmFsdWF0b3I8Q29uZGl0aW9uTWF0cml4VHlwZT4gbV9jb25kaXRpb25JbXBsOworICBldmFsdWF0b3I8VGhlbk1hdHJpeFR5cGU+IG1fdGhlbkltcGw7CisgIGV2YWx1YXRvcjxFbHNlTWF0cml4VHlwZT4gbV9lbHNlSW1wbDsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVwbGljYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIGludCBSb3dGYWN0b3IsIGludCBDb2xGYWN0b3I+IAorc3RydWN0IHVuYXJ5X2V2YWx1YXRvcjxSZXBsaWNhdGU8QXJnVHlwZSwgUm93RmFjdG9yLCBDb2xGYWN0b3I+ID4KKyAgOiBldmFsdWF0b3JfYmFzZTxSZXBsaWNhdGU8QXJnVHlwZSwgUm93RmFjdG9yLCBDb2xGYWN0b3I+ID4KK3sKKyAgdHlwZWRlZiBSZXBsaWNhdGU8QXJnVHlwZSwgUm93RmFjdG9yLCBDb2xGYWN0b3I+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgZW51bSB7CisgICAgRmFjdG9yID0gKFJvd0ZhY3Rvcj09RHluYW1pYyB8fCBDb2xGYWN0b3I9PUR5bmFtaWMpID8gRHluYW1pYyA6IFJvd0ZhY3RvcipDb2xGYWN0b3IKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8QXJnVHlwZSxGYWN0b3I+Ojp0eXBlIEFyZ1R5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QXJnVHlwZU5lc3RlZD46OnR5cGUgQXJnVHlwZU5lc3RlZENsZWFuZWQ7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZ1R5cGVOZXN0ZWRDbGVhbmVkPjo6Q29lZmZSZWFkQ29zdCwKKyAgICBMaW5lYXJBY2Nlc3NNYXNrID0gWHByVHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gTGluZWFyQWNjZXNzQml0IDogMCwKKyAgICBGbGFncyA9IChldmFsdWF0b3I8QXJnVHlwZU5lc3RlZENsZWFuZWQ+OjpGbGFncyAmIChIZXJlZGl0YXJ5Qml0c3xMaW5lYXJBY2Nlc3NNYXNrKSAmIH5Sb3dNYWpvckJpdCkgfCAodHJhaXRzPFhwclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0KSwKKyAgICAKKyAgICBBbGlnbm1lbnQgPSBldmFsdWF0b3I8QXJnVHlwZU5lc3RlZENsZWFuZWQ+OjpBbGlnbm1lbnQKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgcmVwbGljYXRlKQorICAgIDogbV9hcmcocmVwbGljYXRlLm5lc3RlZEV4cHJlc3Npb24oKSksCisgICAgICBtX2FyZ0ltcGwobV9hcmcpLAorICAgICAgbV9yb3dzKHJlcGxpY2F0ZS5uZXN0ZWRFeHByZXNzaW9uKCkucm93cygpKSwKKyAgICAgIG1fY29scyhyZXBsaWNhdGUubmVzdGVkRXhwcmVzc2lvbigpLmNvbHMoKSkKKyAge30KKyAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICAvLyB0cnkgdG8gYXZvaWQgdXNpbmcgbW9kdWxvOyB0aGlzIGlzIGEgcHVyZSBvcHRpbWl6YXRpb24gc3RyYXRlZ3kKKyAgICBjb25zdCBJbmRleCBhY3R1YWxfcm93ID0gaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvd0ZhY3Rvcj09MSA/IHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3cgJSBtX3Jvd3MudmFsdWUoKTsKKyAgICBjb25zdCBJbmRleCBhY3R1YWxfY29sID0gaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6Q29sc0F0Q29tcGlsZVRpbWU9PTEgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbEZhY3Rvcj09MSA/IGNvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wgJSBtX2NvbHMudmFsdWUoKTsKKyAgICAKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKGFjdHVhbF9yb3csIGFjdHVhbF9jb2wpOworICB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIC8vIHRyeSB0byBhdm9pZCB1c2luZyBtb2R1bG87IHRoaXMgaXMgYSBwdXJlIG9wdGltaXphdGlvbiBzdHJhdGVneQorICAgIGNvbnN0IEluZGV4IGFjdHVhbF9pbmRleCA9IGludGVybmFsOjp0cmFpdHM8WHByVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lPT0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoQ29sRmFjdG9yPT0xID8gIGluZGV4IDogaW5kZXglbV9jb2xzLnZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoUm93RmFjdG9yPT0xID8gIGluZGV4IDogaW5kZXglbV9yb3dzLnZhbHVlKCkpOworICAgIAorICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmYoYWN0dWFsX2luZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIGNvbnN0IEluZGV4IGFjdHVhbF9yb3cgPSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpSb3dzQXRDb21waWxlVGltZT09MSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUm93RmFjdG9yPT0xID8gcm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvdyAlIG1fcm93cy52YWx1ZSgpOworICAgIGNvbnN0IEluZGV4IGFjdHVhbF9jb2wgPSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpDb2xzQXRDb21waWxlVGltZT09MSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sRmFjdG9yPT0xID8gY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbCAlIG1fY29scy52YWx1ZSgpOworCisgICAgcmV0dXJuIG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oYWN0dWFsX3JvdywgYWN0dWFsX2NvbCk7CisgIH0KKyAgCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGNvbnN0IEluZGV4IGFjdHVhbF9pbmRleCA9IGludGVybmFsOjp0cmFpdHM8WHByVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lPT0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoQ29sRmFjdG9yPT0xID8gIGluZGV4IDogaW5kZXglbV9jb2xzLnZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoUm93RmFjdG9yPT0xID8gIGluZGV4IDogaW5kZXglbV9yb3dzLnZhbHVlKCkpOworCisgICAgcmV0dXJuIG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oYWN0dWFsX2luZGV4KTsKKyAgfQorIAorcHJvdGVjdGVkOgorICBjb25zdCBBcmdUeXBlTmVzdGVkIG1fYXJnOworICBldmFsdWF0b3I8QXJnVHlwZU5lc3RlZENsZWFuZWQ+IG1fYXJnSW1wbDsKKyAgY29uc3QgdmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IG1fcm93czsKKyAgY29uc3QgdmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgQXJnVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IG1fY29sczsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFydGlhbFJlZHV4RXhwciAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgTWVtYmVyT3AsIGludCBEaXJlY3Rpb24+CitzdHJ1Y3QgZXZhbHVhdG9yPFBhcnRpYWxSZWR1eEV4cHI8QXJnVHlwZSwgTWVtYmVyT3AsIERpcmVjdGlvbj4gPgorICA6IGV2YWx1YXRvcl9iYXNlPFBhcnRpYWxSZWR1eEV4cHI8QXJnVHlwZSwgTWVtYmVyT3AsIERpcmVjdGlvbj4gPgoreworICB0eXBlZGVmIFBhcnRpYWxSZWR1eEV4cHI8QXJnVHlwZSwgTWVtYmVyT3AsIERpcmVjdGlvbj4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8QXJnVHlwZSwxPjo6dHlwZSBBcmdUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFyZ1R5cGVOZXN0ZWQ+Ojp0eXBlIEFyZ1R5cGVOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciBJbnB1dFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsKKyAgICBUcmF2ZXJzYWxTaXplID0gRGlyZWN0aW9uPT1pbnQoVmVydGljYWwpID8gaW50KEFyZ1R5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSA6ICBpbnQoQXJnVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWVtYmVyT3A6OnRlbXBsYXRlIENvc3Q8SW5wdXRTY2FsYXIsaW50KFRyYXZlcnNhbFNpemUpPiBDb3N0T3BUeXBlOworICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gVHJhdmVyc2FsU2l6ZT09RHluYW1pYyA/IEh1Z2VDb3N0CisgICAgICAgICAgICAgICAgICA6IFRyYXZlcnNhbFNpemUgKiBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QgKyBpbnQoQ29zdE9wVHlwZTo6dmFsdWUpLAorICAgIAorICAgIEZsYWdzID0gKHRyYWl0czxYcHJUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQpIHwgKGV2YWx1YXRvcjxBcmdUeXBlPjo6RmxhZ3MmKEhlcmVkaXRhcnlCaXRzJih+Um93TWFqb3JCaXQpKSkgfCBMaW5lYXJBY2Nlc3NCaXQsCisgICAgCisgICAgQWxpZ25tZW50ID0gMCAvLyBGSVhNRSB0aGlzIHdpbGwgbmVlZCB0byBiZSBpbXByb3ZlZCBvbmNlIFBhcnRpYWxSZWR1eEV4cHIgaXMgdmVjdG9yaXplZAorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlIHhwcikKKyAgICA6IG1fYXJnKHhwci5uZXN0ZWRFeHByZXNzaW9uKCkpLCBtX2Z1bmN0b3IoeHByLmZ1bmN0b3IoKSkKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoVHJhdmVyc2FsU2l6ZT09RHluYW1pYyA/IEh1Z2VDb3N0IDogaW50KENvc3RPcFR5cGU6OnZhbHVlKSk7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpLCBJbmRleCBqKSBjb25zdAorICB7CisgICAgaWYgKERpcmVjdGlvbj09VmVydGljYWwpCisgICAgICByZXR1cm4gbV9mdW5jdG9yKG1fYXJnLmNvbChqKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG1fZnVuY3RvcihtX2FyZy5yb3coaSkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBpZiAoRGlyZWN0aW9uPT1WZXJ0aWNhbCkKKyAgICAgIHJldHVybiBtX2Z1bmN0b3IobV9hcmcuY29sKGluZGV4KSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG1fZnVuY3RvcihtX2FyZy5yb3coaW5kZXgpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBcmdUeXBlTmVzdGVkPjo6dHlwZSBtX2FyZzsKKyAgY29uc3QgTWVtYmVyT3AgbV9mdW5jdG9yOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBNYXRyaXhXcmFwcGVyIGFuZCBBcnJheVdyYXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBldmFsdWF0b3Jfd3JhcHBlcl9iYXNlPFQ+IGlzIGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHRoZQorLy8gTWF0cml4V3JhcHBlciBhbmQgQXJyYXlXcmFwcGVyIGV2YWx1YXRvcnMuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yX3dyYXBwZXJfYmFzZQorICA6IGV2YWx1YXRvcl9iYXNlPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWRFeHByZXNzaW9uVHlwZT46OnR5cGUgQXJnVHlwZTsKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCwKKyAgICBGbGFncyA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6RmxhZ3MsCisgICAgQWxpZ25tZW50ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpBbGlnbm1lbnQKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3Jfd3JhcHBlcl9iYXNlKGNvbnN0IEFyZ1R5cGUmIGFyZykgOiBtX2FyZ0ltcGwoYXJnKSB7fQorCisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcmdUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC5jb2VmZihyb3csIGNvbCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmYoaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC5jb2VmZlJlZihyb3csIGNvbCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmUmVmKGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdywgY29sKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBTdG9yZU1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgUGFja2V0VHlwZSYgeCkKKyAgeworICAgIG1fYXJnSW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KHJvdywgY29sLCB4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBTdG9yZU1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0VHlwZSYgeCkKKyAgeworICAgIG1fYXJnSW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LCB4KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQXJnVHlwZT4KK3N0cnVjdCB1bmFyeV9ldmFsdWF0b3I8TWF0cml4V3JhcHBlcjxUQXJnVHlwZT4gPgorICA6IGV2YWx1YXRvcl93cmFwcGVyX2Jhc2U8TWF0cml4V3JhcHBlcjxUQXJnVHlwZT4gPgoreworICB0eXBlZGVmIE1hdHJpeFdyYXBwZXI8VEFyZ1R5cGU+IFhwclR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgdW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHdyYXBwZXIpCisgICAgOiBldmFsdWF0b3Jfd3JhcHBlcl9iYXNlPE1hdHJpeFdyYXBwZXI8VEFyZ1R5cGU+ID4od3JhcHBlci5uZXN0ZWRFeHByZXNzaW9uKCkpCisgIHsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEFycmF5V3JhcHBlcjxUQXJnVHlwZT4gPgorICA6IGV2YWx1YXRvcl93cmFwcGVyX2Jhc2U8QXJyYXlXcmFwcGVyPFRBcmdUeXBlPiA+Cit7CisgIHR5cGVkZWYgQXJyYXlXcmFwcGVyPFRBcmdUeXBlPiBYcHJUeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB3cmFwcGVyKQorICAgIDogZXZhbHVhdG9yX3dyYXBwZXJfYmFzZTxBcnJheVdyYXBwZXI8VEFyZ1R5cGU+ID4od3JhcHBlci5uZXN0ZWRFeHByZXNzaW9uKCkpCisgIHsgfQorfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXZlcnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGRlZmluZWQgaW4gUmV2ZXJzZS5oOgordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0VHlwZSwgYm9vbCBSZXZlcnNlUGFja2V0PiBzdHJ1Y3QgcmV2ZXJzZV9wYWNrZXRfY29uZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSwgaW50IERpcmVjdGlvbj4KK3N0cnVjdCB1bmFyeV9ldmFsdWF0b3I8UmV2ZXJzZTxBcmdUeXBlLCBEaXJlY3Rpb24+ID4KKyAgOiBldmFsdWF0b3JfYmFzZTxSZXZlcnNlPEFyZ1R5cGUsIERpcmVjdGlvbj4gPgoreworICB0eXBlZGVmIFJldmVyc2U8QXJnVHlwZSwgRGlyZWN0aW9uPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICBlbnVtIHsKKyAgICBJc1Jvd01ham9yID0gWHByVHlwZTo6SXNSb3dNYWpvciwKKyAgICBJc0NvbE1ham9yID0gIUlzUm93TWFqb3IsCisgICAgUmV2ZXJzZVJvdyA9IChEaXJlY3Rpb24gPT0gVmVydGljYWwpICAgfHwgKERpcmVjdGlvbiA9PSBCb3RoRGlyZWN0aW9ucyksCisgICAgUmV2ZXJzZUNvbCA9IChEaXJlY3Rpb24gPT0gSG9yaXpvbnRhbCkgfHwgKERpcmVjdGlvbiA9PSBCb3RoRGlyZWN0aW9ucyksCisgICAgUmV2ZXJzZVBhY2tldCA9IChEaXJlY3Rpb24gPT0gQm90aERpcmVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IFZlcnRpY2FsKSAgICYmIElzQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IEhvcml6b250YWwpICYmIElzUm93TWFqb3IpLAorICAgICAgICAgICAgICAgICAgICAKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpDb2VmZlJlYWRDb3N0LAorICAgIAorICAgIC8vIGxldCdzIGVuYWJsZSBMaW5lYXJBY2Nlc3Mgb25seSB3aXRoIHZlY3Rvcml6YXRpb24gYmVjYXVzZSBvZiB0aGUgcHJvZHVjdCBvdmVyaGVhZAorICAgIC8vIEZJWE1FIGVuYWJsZSBEaXJlY3RBY2Nlc3Mgd2l0aCBuZWdhdGl2ZSBzdHJpZGVzPworICAgIEZsYWdzMCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6RmxhZ3MsCisgICAgTGluZWFyQWNjZXNzID0gKCAoRGlyZWN0aW9uPT1Cb3RoRGlyZWN0aW9ucykgJiYgKGludChGbGFnczApJlBhY2tldEFjY2Vzc0JpdCkgKQorICAgICAgICAgICAgICAgICAgfHwgKChSZXZlcnNlUm93ICYmIFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT0xKSB8fCAoUmV2ZXJzZUNvbCAmJiBYcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZT09MSkpCisgICAgICAgICAgICAgICAgID8gTGluZWFyQWNjZXNzQml0IDogMCwKKworICAgIEZsYWdzID0gaW50KEZsYWdzMCkgJiAoSGVyZWRpdGFyeUJpdHMgfCBQYWNrZXRBY2Nlc3NCaXQgfCBMaW5lYXJBY2Nlc3MpLAorICAgIAorICAgIEFsaWdubWVudCA9IDAgLy8gRklYTUUgaW4gc29tZSByYXJlIGNhc2VzLCBBbGlnbm1lbnQgY291bGQgYmUgcHJlc2VydmVkLCBsaWtlIGEgVmVjdG9yNGYuCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgdW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHJldmVyc2UpCisgICAgOiBtX2FyZ0ltcGwocmV2ZXJzZS5uZXN0ZWRFeHByZXNzaW9uKCkpLAorICAgICAgbV9yb3dzKFJldmVyc2VSb3cgPyByZXZlcnNlLm5lc3RlZEV4cHJlc3Npb24oKS5yb3dzKCkgOiAxKSwKKyAgICAgIG1fY29scyhSZXZlcnNlQ29sID8gcmV2ZXJzZS5uZXN0ZWRFeHByZXNzaW9uKCkuY29scygpIDogMSkKKyAgeyB9CisgCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYXJnSW1wbC5jb2VmZihSZXZlcnNlUm93ID8gbV9yb3dzLnZhbHVlKCkgLSByb3cgLSAxIDogcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzZUNvbCA/IG1fY29scy52YWx1ZSgpIC0gY29sIC0gMSA6IGNvbCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmYobV9yb3dzLnZhbHVlKCkgKiBtX2NvbHMudmFsdWUoKSAtIGluZGV4IC0gMSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgIHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmUmVmKFJldmVyc2VSb3cgPyBtX3Jvd3MudmFsdWUoKSAtIHJvdyAtIDEgOiByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlQ29sID8gbV9jb2xzLnZhbHVlKCkgLSBjb2wgLSAxIDogY29sKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmZSZWYobV9yb3dzLnZhbHVlKCkgKiBtX2NvbHMudmFsdWUoKSAtIGluZGV4IC0gMSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBlbnVtIHsKKyAgICAgIFBhY2tldFNpemUgPSB1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUsCisgICAgICBPZmZzZXRSb3cgID0gUmV2ZXJzZVJvdyAmJiBJc0NvbE1ham9yID8gUGFja2V0U2l6ZSA6IDEsCisgICAgICBPZmZzZXRDb2wgID0gUmV2ZXJzZUNvbCAmJiBJc1Jvd01ham9yID8gUGFja2V0U2l6ZSA6IDEKKyAgICB9OworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnJldmVyc2VfcGFja2V0X2NvbmQ8UGFja2V0VHlwZSxSZXZlcnNlUGFja2V0PiByZXZlcnNlX3BhY2tldDsKKyAgICByZXR1cm4gcmV2ZXJzZV9wYWNrZXQ6OnJ1bihtX2FyZ0ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2VSb3cgPyBtX3Jvd3MudmFsdWUoKSAtIHJvdyAtIE9mZnNldFJvdyA6IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlQ29sID8gbV9jb2xzLnZhbHVlKCkgLSBjb2wgLSBPZmZzZXRDb2wgOiBjb2wpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRUeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGVudW0geyBQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplIH07CisgICAgcmV0dXJuIHByZXZlcnNlKG1fYXJnSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4obV9yb3dzLnZhbHVlKCkgKiBtX2NvbHMudmFsdWUoKSAtIGluZGV4IC0gUGFja2V0U2l6ZSkpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IFBhY2tldFR5cGUmIHgpCisgIHsKKyAgICAvLyBGSVhNRSB3ZSBjb3VsZCBmYWN0b3JpemUgc29tZSBjb2RlIHdpdGggcGFja2V0KGksaikKKyAgICBlbnVtIHsKKyAgICAgIFBhY2tldFNpemUgPSB1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUsCisgICAgICBPZmZzZXRSb3cgID0gUmV2ZXJzZVJvdyAmJiBJc0NvbE1ham9yID8gUGFja2V0U2l6ZSA6IDEsCisgICAgICBPZmZzZXRDb2wgID0gUmV2ZXJzZUNvbCAmJiBJc1Jvd01ham9yID8gUGFja2V0U2l6ZSA6IDEKKyAgICB9OworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnJldmVyc2VfcGFja2V0X2NvbmQ8UGFja2V0VHlwZSxSZXZlcnNlUGFja2V0PiByZXZlcnNlX3BhY2tldDsKKyAgICBtX2FyZ0ltcGwudGVtcGxhdGUgd3JpdGVQYWNrZXQ8TG9hZE1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2VSb3cgPyBtX3Jvd3MudmFsdWUoKSAtIHJvdyAtIE9mZnNldFJvdyA6IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlQ29sID8gbV9jb2xzLnZhbHVlKCkgLSBjb2wgLSBPZmZzZXRDb2wgOiBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZV9wYWNrZXQ6OnJ1bih4KSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0VHlwZSYgeCkKKyAgeworICAgIGVudW0geyBQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplIH07CisgICAgbV9hcmdJbXBsLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPgorICAgICAgKG1fcm93cy52YWx1ZSgpICogbV9jb2xzLnZhbHVlKCkgLSBpbmRleCAtIFBhY2tldFNpemUsIHByZXZlcnNlKHgpKTsKKyAgfQorIAorcHJvdGVjdGVkOgorICBldmFsdWF0b3I8QXJnVHlwZT4gbV9hcmdJbXBsOworCisgIC8vIElmIHdlIGRvIG5vdCByZXZlcnNlIHJvd3MsIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgbnVtYmVyIG9mIHJvd3M7IHNhbWUgZm9yIGNvbHVtbnMKKyAgLy8gTm9uZXRoZWxlc3MsIGluIHRoaXMgY2FzZSBpdCBpcyBpbXBvcnRhbnQgdG8gc2V0IHRvIDEgc3VjaCB0aGF0IHRoZSBjb2VmZihpbmRleCkgbWV0aG9kIHdvcmtzIGZpbmUgZm9yIHZlY3RvcnMuCisgIGNvbnN0IHZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFJldmVyc2VSb3cgPyBBcmdUeXBlOjpSb3dzQXRDb21waWxlVGltZSA6IDE+IG1fcm93czsKKyAgY29uc3QgdmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgUmV2ZXJzZUNvbCA/IEFyZ1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lIDogMT4gbV9jb2xzOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBEaWFnb25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCBpbnQgRGlhZ0luZGV4Pgorc3RydWN0IGV2YWx1YXRvcjxEaWFnb25hbDxBcmdUeXBlLCBEaWFnSW5kZXg+ID4KKyAgOiBldmFsdWF0b3JfYmFzZTxEaWFnb25hbDxBcmdUeXBlLCBEaWFnSW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBEaWFnb25hbDxBcmdUeXBlLCBEaWFnSW5kZXg+IFhwclR5cGU7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpDb2VmZlJlYWRDb3N0LAorICAgIAorICAgIEZsYWdzID0gKHVuc2lnbmVkIGludCkoZXZhbHVhdG9yPEFyZ1R5cGU+OjpGbGFncyAmIChIZXJlZGl0YXJ5Qml0cyB8IERpcmVjdEFjY2Vzc0JpdCkgJiB+Um93TWFqb3JCaXQpIHwgTGluZWFyQWNjZXNzQml0LAorICAgIAorICAgIEFsaWdubWVudCA9IDAKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgZGlhZ29uYWwpCisgICAgOiBtX2FyZ0ltcGwoZGlhZ29uYWwubmVzdGVkRXhwcmVzc2lvbigpKSwKKyAgICAgIG1faW5kZXgoZGlhZ29uYWwuaW5kZXgoKSkKKyAgeyB9CisgCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKHJvdyArIHJvd09mZnNldCgpLCByb3cgKyBjb2xPZmZzZXQoKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmYoaW5kZXggKyByb3dPZmZzZXQoKSwgaW5kZXggKyBjb2xPZmZzZXQoKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCkKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmZSZWYocm93ICsgcm93T2Zmc2V0KCksIHJvdyArIGNvbE9mZnNldCgpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgeworICAgIHJldHVybiBtX2FyZ0ltcGwuY29lZmZSZWYoaW5kZXggKyByb3dPZmZzZXQoKSwgaW5kZXggKyBjb2xPZmZzZXQoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICBldmFsdWF0b3I8QXJnVHlwZT4gbV9hcmdJbXBsOworICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pY2luZGV4PEluZGV4LCBYcHJUeXBlOjpEaWFnSW5kZXg+IG1faW5kZXg7CisKK3ByaXZhdGU6CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleC52YWx1ZSgpID4gMCA/IDAgOiAtbV9pbmRleC52YWx1ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleC52YWx1ZSgpID4gMCA/IG1faW5kZXgudmFsdWUoKSA6IDA7IH0KK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXByZWNhdGVkIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmFsVG9UZW1wIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGV4cHJlc3Npb24gY2xhc3MgZm9yIGV2YWx1YXRpbmcgbmVzdGVkIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZT4gY2xhc3MgRXZhbFRvVGVtcDsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZT4KK3N0cnVjdCB0cmFpdHM8RXZhbFRvVGVtcDxBcmdUeXBlPiA+CisgIDogcHVibGljIHRyYWl0czxBcmdUeXBlPgoreyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlPgorY2xhc3MgRXZhbFRvVGVtcAorICA6IHB1YmxpYyBkZW5zZV94cHJfYmFzZTxFdmFsVG9UZW1wPEFyZ1R5cGU+ID46OnR5cGUKK3sKKyBwdWJsaWM6CisgCisgIHR5cGVkZWYgdHlwZW5hbWUgZGVuc2VfeHByX2Jhc2U8RXZhbFRvVGVtcD46OnR5cGUgQmFzZTsKKyAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKEV2YWxUb1RlbXApCisgCisgIGV4cGxpY2l0IEV2YWxUb1RlbXAoY29uc3QgQXJnVHlwZSYgYXJnKQorICAgIDogbV9hcmcoYXJnKQorICB7IH0KKyAKKyAgY29uc3QgQXJnVHlwZSYgYXJnKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2FyZzsKKyAgfQorCisgIEluZGV4IHJvd3MoKSBjb25zdCAKKyAgeworICAgIHJldHVybiBtX2FyZy5yb3dzKCk7CisgIH0KKworICBJbmRleCBjb2xzKCkgY29uc3QgCisgIHsKKyAgICByZXR1cm4gbV9hcmcuY29scygpOworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBBcmdUeXBlJiBtX2FyZzsKK307CisgCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlPgorc3RydWN0IGV2YWx1YXRvcjxFdmFsVG9UZW1wPEFyZ1R5cGU+ID4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yPHR5cGVuYW1lIEFyZ1R5cGU6OlBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIEV2YWxUb1RlbXA8QXJnVHlwZT4gICAgICAgICAgICAgICAgICAgWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcmdUeXBlOjpQbGFpbk9iamVjdCAgICAgICAgIFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX3Jlc3VsdCh4cHIuYXJnKCkpCisgIHsKKyAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8QmFzZSo+KHRoaXMpKSBCYXNlKG1fcmVzdWx0KTsKKyAgfQorCisgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIG5lc3RpbmcgYW4gRXZhbFRvIGV2YWx1YXRvciBpbiBhbm90aGVyIGV2YWx1YXRvcgorICBFSUdFTl9ERVZJQ0VfRlVOQyBldmFsdWF0b3IoY29uc3QgQXJnVHlwZSYgYXJnKQorICAgIDogbV9yZXN1bHQoYXJnKQorICB7CisgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShtX3Jlc3VsdCk7CisgIH0KKworcHJvdGVjdGVkOgorICBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09SRUVWQUxVQVRPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQ29yZUl0ZXJhdG9ycy5oIGIvRWlnZW4vc3JjL0NvcmUvQ29yZUl0ZXJhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjQyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Db3JlSXRlcmF0b3JzLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPUkVJVEVSQVRPUlNfSAorI2RlZmluZSBFSUdFTl9DT1JFSVRFUkFUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcmVzcGVjdGl2ZSBJbm5lckl0ZXJhdG9yIGRlZmluaXRpb24gb2YgdGhlIGV4cHJlc3Npb25zIGRlZmluZWQgaW4gRWlnZW4vQ29yZQorICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIHR5cGVuYW1lIEV2YWx1YXRvcktpbmQ+CitjbGFzcyBpbm5lcl9pdGVyYXRvcl9zZWxlY3RvcjsKKworfQorCisvKiogXGNsYXNzIElubmVySXRlcmF0b3IKKyAgKiBcYnJpZWYgQW4gSW5uZXJJdGVyYXRvciBhbGxvd3MgdG8gbG9vcCBvdmVyIHRoZSBlbGVtZW50IG9mIGFueSBtYXRyaXggZXhwcmVzc2lvbi4KKyAgKiAKKyAgKiBcd2FybmluZyBUbyBiZSB1c2VkIHdpdGggY2FyZSBiZWNhdXNlIGFuIGV2YWx1YXRvciBpcyBjb25zdHJ1Y3RlZCBldmVyeSB0aW1lIGFuIElubmVySXRlcmF0b3IgaXRlcmF0b3IgaXMgY29uc3RydWN0ZWQuCisgICogCisgICogVE9ETzogYWRkIGEgdXNhZ2UgZXhhbXBsZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIElubmVySXRlcmF0b3IKK3sKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBpbnRlcm5hbDo6aW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I8WHByVHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OmV2YWx1YXRvcl90cmFpdHM8WHByVHlwZT46OktpbmQ+IEl0ZXJhdG9yVHlwZTsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6ZXZhbHVhdG9yPFhwclR5cGU+IEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKK3B1YmxpYzoKKyAgLyoqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvdmVyIHRoZSBcYSBvdXRlcklkIC10aCByb3cgb3IgY29sdW1uIG9mIFxhIHhwciAqLworICBJbm5lckl0ZXJhdG9yKGNvbnN0IFhwclR5cGUgJnhwciwgY29uc3QgSW5kZXggJm91dGVySWQpCisgICAgOiBtX2V2YWwoeHByKSwgbV9pdGVyKG1fZXZhbCwgb3V0ZXJJZCwgeHByLmlubmVyU2l6ZSgpKQorICB7fQorICAKKyAgLy8vIFxyZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBjb2VmZmljaWVudC4KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtX2l0ZXIudmFsdWUoKTsgfQorICAvKiogSW5jcmVtZW50IHRoZSBpdGVyYXRvciBcYyAqdGhpcyB0byB0aGUgbmV4dCBub24temVybyBjb2VmZmljaWVudC4KKyAgICAqIEV4cGxpY2l0IHplcm9zIGFyZSBub3Qgc2tpcHBlZCBvdmVyLiBUbyBza2lwIGV4cGxpY2l0IHplcm9zLCBzZWUgY2xhc3MgU3BhcnNlVmlldworICAgICovCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpICAgeyBtX2l0ZXIub3BlcmF0b3IrKygpOyByZXR1cm4gKnRoaXM7IH0KKyAgLy8vIFxyZXR1cm5zIHRoZSBjb2x1bW4gb3Igcm93IGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZWZmaWNpZW50LgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGluZGV4KCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIG1faXRlci5pbmRleCgpOyB9CisgIC8vLyBccmV0dXJucyB0aGUgcm93IGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZWZmaWNpZW50LgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvdygpIGNvbnN0ICAgICAgICAgICAgIHsgcmV0dXJuIG1faXRlci5yb3coKTsgfQorICAvLy8gXHJldHVybnMgdGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgY3VycmVudCBjb2VmZmljaWVudC4KKyAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2woKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiBtX2l0ZXIuY29sKCk7IH0KKyAgLy8vIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlIGl0ZXJhdG9yIFxjICp0aGlzIHN0aWxsIHJlZmVyZW5jZXMgYSB2YWxpZCBjb2VmZmljaWVudC4KKyAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgICAgICAgICB7IHJldHVybiBtX2l0ZXI7IH0KKyAgCitwcm90ZWN0ZWQ6CisgIEV2YWx1YXRvclR5cGUgbV9ldmFsOworICBJdGVyYXRvclR5cGUgbV9pdGVyOworcHJpdmF0ZToKKyAgLy8gSWYgeW91IGdldCBoZXJlLCB0aGVuIHlvdSdyZSBub3QgdXNpbmcgdGhlIHJpZ2h0IElubmVySXRlcmF0b3IgdHlwZSwgZS5nLjoKKyAgLy8gICBTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPiBBOworICAvLyAgIFNwYXJzZU1hdHJpeDxkb3VibGU+OjpJbm5lckl0ZXJhdG9yIGl0KEEsMCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IElubmVySXRlcmF0b3IoY29uc3QgRWlnZW5CYXNlPFQ+JixJbmRleCBvdXRlcik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBHZW5lcmljIGlubmVyIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBkZW5zZSBvYmplY3RzCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I8WHByVHlwZSwgSW5kZXhCYXNlZD4KK3sKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBldmFsdWF0b3I8WHByVHlwZT4gRXZhbHVhdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlNjYWxhciBTY2FsYXI7CisgIGVudW0geyBJc1Jvd01ham9yID0gKFhwclR5cGU6OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQgfTsKKyAgCitwdWJsaWM6CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3IoY29uc3QgRXZhbHVhdG9yVHlwZSAmZXZhbCwgY29uc3QgSW5kZXggJm91dGVySWQsIGNvbnN0IEluZGV4ICZpbm5lclNpemUpCisgICAgOiBtX2V2YWwoZXZhbCksIG1faW5uZXIoMCksIG1fb3V0ZXIob3V0ZXJJZCksIG1fZW5kKGlubmVyU2l6ZSkKKyAge30KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKElzUm93TWFqb3IpID8gbV9ldmFsLmNvZWZmKG1fb3V0ZXIsIG1faW5uZXIpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1fZXZhbC5jb2VmZihtX2lubmVyLCBtX291dGVyKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3ImIG9wZXJhdG9yKysoKSB7IG1faW5uZXIrKzsgcmV0dXJuICp0aGlzOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXI7IH0KKyAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogaW5kZXgoKTsgfQorICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lciA8IG1fZW5kICYmIG1faW5uZXI+PTA7IH0KKworcHJvdGVjdGVkOgorICBjb25zdCBFdmFsdWF0b3JUeXBlJiBtX2V2YWw7CisgIEluZGV4IG1faW5uZXI7CisgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKworLy8gRm9yIGl0ZXJhdG9yLWJhc2VkIGV2YWx1YXRvciwgaW5uZXItaXRlcmF0b3IgaXMgYWxyZWFkeSBpbXBsZW1lbnRlZCBhcworLy8gZXZhbHVhdG9yPD46OklubmVySXRlcmF0b3IKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBpbm5lcl9pdGVyYXRvcl9zZWxlY3RvcjxYcHJUeXBlLCBJdGVyYXRvckJhc2VkPgorIDogcHVibGljIGV2YWx1YXRvcjxYcHJUeXBlPjo6SW5uZXJJdGVyYXRvcgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxYcHJUeXBlPjo6SW5uZXJJdGVyYXRvciBCYXNlOworICB0eXBlZGVmIGV2YWx1YXRvcjxYcHJUeXBlPiBFdmFsdWF0b3JUeXBlOworICAKK3B1YmxpYzoKKyAgRUlHRU5fU1RST05HX0lOTElORSBpbm5lcl9pdGVyYXRvcl9zZWxlY3Rvcihjb25zdCBFdmFsdWF0b3JUeXBlICZldmFsLCBjb25zdCBJbmRleCAmb3V0ZXJJZCwgY29uc3QgSW5kZXggJi8qaW5uZXJTaXplKi8pCisgICAgOiBCYXNlKGV2YWwsIG91dGVySWQpCisgIHt9ICAKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPUkVJVEVSQVRPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjc2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZUJpbmFyeU9wLmgKQEAgLTAsMCArMSwxODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1dJU0VfQklOQVJZX09QX0gKKyNkZWZpbmUgRUlHRU5fQ1dJU0VfQklOQVJZX09QX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+ID4KK3sKKyAgLy8gd2UgbXVzdCBub3QgaW5oZXJpdCBmcm9tIHRyYWl0czxMaHM+IHNpbmNlIGl0IGhhcworICAvLyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIHByb2JsZW1zIHdpdGggTVNWQworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZSBBbmNlc3RvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8QW5jZXN0b3I+OjpYcHJLaW5kIFhwcktpbmQ7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gdHJhaXRzPEFuY2VzdG9yPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSB0cmFpdHM8QW5jZXN0b3I+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IHRyYWl0czxBbmNlc3Rvcj46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPEFuY2VzdG9yPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICAvLyBldmVuIHRob3VnaCB3ZSByZXF1aXJlIExocyBhbmQgUmhzIHRvIGhhdmUgdGhlIHNhbWUgc2NhbGFyIHR5cGUgKHNlZSBDd2lzZUJpbmFyeU9wIGNvbnN0cnVjdG9yKSwKKyAgLy8gd2Ugc3RpbGwgd2FudCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgZGlmZmVyZW50LgorICB0eXBlZGVmIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wKAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBMaHM6OlNjYWxhciYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIFJoczo6U2NhbGFyJgorICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgID46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGN3aXNlX3Byb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHM+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3A+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHM+OjpTdG9yYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpTdG9yYWdlSW5kZXg+Ojp0eXBlIFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6Ok5lc3RlZCBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgUmhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TGhzTmVzdGVkPjo6dHlwZSBfTGhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8UmhzTmVzdGVkPjo6dHlwZSBfUmhzTmVzdGVkOworICBlbnVtIHsKKyAgICBGbGFncyA9IGN3aXNlX3Byb21vdGVfc3RvcmFnZV9vcmRlcjx0eXBlbmFtZSB0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsdHlwZW5hbWUgdHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kLF9MaHNOZXN0ZWQ6OkZsYWdzICYgUm93TWFqb3JCaXQsX1Joc05lc3RlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdD46OnZhbHVlCisgIH07Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBDd2lzZUJpbmFyeU9wSW1wbDsKKworLyoqIFxjbGFzcyBDd2lzZUJpbmFyeU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gd2hlcmUgYSBjb2VmZmljaWVudC13aXNlIGJpbmFyeSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIHR3byBleHByZXNzaW9ucworICAqCisgICogXHRwYXJhbSBCaW5hcnlPcCB0ZW1wbGF0ZSBmdW5jdG9yIGltcGxlbWVudGluZyB0aGUgb3BlcmF0b3IKKyAgKiBcdHBhcmFtIExoc1R5cGUgdGhlIHR5cGUgb2YgdGhlIGxlZnQtaGFuZCBzaWRlCisgICogXHRwYXJhbSBSaHNUeXBlIHRoZSB0eXBlIG9mIHRoZSByaWdodC1oYW5kIHNpZGUKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uICB3aGVyZSBhIGNvZWZmaWNpZW50LXdpc2UgYmluYXJ5IG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8gdHdvIGV4cHJlc3Npb25zLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBiaW5hcnkgb3BlcmF0b3JzLCBieSB3aGljaCB3ZSBtZWFuIG9ubHkgdGhvc2UgYmluYXJ5IG9wZXJhdG9ycyB3aGVyZQorICAqIGJvdGggdGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBFaWdlbiBleHByZXNzaW9ucy4KKyAgKiBGb3IgZXhhbXBsZSwgdGhlIHJldHVybiB0eXBlIG9mIG1hdHJpeDErbWF0cml4MiBpcyBhIEN3aXNlQmluYXJ5T3AuCisgICoKKyAgKiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0aGF0IGl0IGlzIHVzZWQsIHNvIHlvdSB0eXBpY2FsbHkgZG9uJ3QgaGF2ZSB0byBuYW1lCisgICogQ3dpc2VCaW5hcnlPcCB0eXBlcyBleHBsaWNpdGx5LgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmJpbmFyeUV4cHIoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICYsY29uc3QgQ3VzdG9tQmluYXJ5T3AgJikgY29uc3QsIGNsYXNzIEN3aXNlVW5hcnlPcCwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHNUeXBlLCB0eXBlbmFtZSBSaHNUeXBlPgorY2xhc3MgQ3dpc2VCaW5hcnlPcCA6IAorICBwdWJsaWMgQ3dpc2VCaW5hcnlPcEltcGw8CisgICAgICAgICAgQmluYXJ5T3AsIExoc1R5cGUsIFJoc1R5cGUsCisgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmN3aXNlX3Byb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzVHlwZT46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJoc1R5cGU+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3A+OjpyZXQ+LAorICBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxCaW5hcnlPcD46OnR5cGUgRnVuY3RvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoc1R5cGU+Ojp0eXBlIExoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFJoc1R5cGU+Ojp0eXBlIFJoczsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VCaW5hcnlPcEltcGw8CisgICAgICAgIEJpbmFyeU9wLCBMaHNUeXBlLCBSaHNUeXBlLAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y3dpc2VfcHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxMaHNUeXBlPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3A+OjpyZXQ+OjpCYXNlIEJhc2U7CisgICAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKEN3aXNlQmluYXJ5T3ApCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWZfc2VsZWN0b3I8TGhzVHlwZT46OnR5cGUgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxSaHNUeXBlPjo6dHlwZSBSaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ3dpc2VCaW5hcnlPcChjb25zdCBMaHMmIGFMaHMsIGNvbnN0IFJocyYgYVJocywgY29uc3QgQmluYXJ5T3AmIGZ1bmMgPSBCaW5hcnlPcCgpKQorICAgICAgOiBtX2xocyhhTGhzKSwgbV9yaHMoYVJocyksIG1fZnVuY3RvcihmdW5jKQorICAgIHsKKyAgICAgIEVJR0VOX0NIRUNLX0JJTkFSWV9DT01QQVRJQklMSVkoQmluYXJ5T3AsdHlwZW5hbWUgTGhzOjpTY2FsYXIsdHlwZW5hbWUgUmhzOjpTY2FsYXIpOworICAgICAgLy8gcmVxdWlyZSB0aGUgc2l6ZXMgdG8gbWF0Y2gKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShMaHMsIFJocykKKyAgICAgIGVpZ2VuX2Fzc2VydChhTGhzLnJvd3MoKSA9PSBhUmhzLnJvd3MoKSAmJiBhTGhzLmNvbHMoKSA9PSBhUmhzLmNvbHMoKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7CisgICAgICAvLyByZXR1cm4gdGhlIGZpeGVkIHNpemUgdHlwZSBpZiBhdmFpbGFibGUgdG8gZW5hYmxlIGNvbXBpbGUgdGltZSBvcHRpbWl6YXRpb25zCisgICAgICBpZiAoaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlPjo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgICAgIHJldHVybiBtX3Jocy5yb3dzKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBtX2xocy5yb3dzKCk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeworICAgICAgLy8gcmV0dXJuIHRoZSBmaXhlZCBzaXplIHR5cGUgaWYgYXZhaWxhYmxlIHRvIGVuYWJsZSBjb21waWxlIHRpbWUgb3B0aW1pemF0aW9ucworICAgICAgaWYgKGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZT46OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgICAgICByZXR1cm4gbV9yaHMuY29scygpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9saHMuY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbGVmdCBoYW5kIHNpZGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IF9MaHNOZXN0ZWQmIGxocygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSByaWdodCBoYW5kIHNpZGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IF9SaHNOZXN0ZWQmIHJocygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBmdW5jdG9yIHJlcHJlc2VudGluZyB0aGUgYmluYXJ5IG9wZXJhdGlvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgQmluYXJ5T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzTmVzdGVkIG1fbGhzOworICAgIFJoc05lc3RlZCBtX3JoczsKKyAgICBjb25zdCBCaW5hcnlPcCBtX2Z1bmN0b3I7Cit9OworCisvLyBHZW5lcmljIEFQSSBkaXNwYXRjaGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VCaW5hcnlPcEltcGwKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+ID46OnR5cGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPjo6dHlwZSBCYXNlOworfTsKKworLyoqIHJlcGxhY2VzIFxjICp0aGlzIGJ5IFxjICp0aGlzIC0gXGEgb3RoZXIuCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIGNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OnN1Yl9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIHJlcGxhY2VzIFxjICp0aGlzIGJ5IFxjICp0aGlzICsgXGEgb3RoZXIuCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcis9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DV0lTRV9CSU5BUllfT1BfSAorCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Dd2lzZU51bGxhcnlPcC5oIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VOdWxsYXJ5T3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ2MDdlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VOdWxsYXJ5T3AuaApAQCAtMCwwICsxLDg2NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1dJU0VfTlVMTEFSWV9PUF9ICisjZGVmaW5lIEVJR0VOX0NXSVNFX05VTExBUllfT1BfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlTnVsbGFyeU9wPE51bGxhcnlPcCwgUGxhaW5PYmplY3RUeXBlPiA+IDogdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4KK3sKKyAgZW51bSB7CisgICAgRmxhZ3MgPSB0cmFpdHM8UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdAorICB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgR2VuZXJpYyBleHByZXNzaW9uIG9mIGEgbWF0cml4IHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRlZmluZWQgYnkgYSBmdW5jdG9yCisgICoKKyAgKiBcdHBhcmFtIE51bGxhcnlPcCB0ZW1wbGF0ZSBmdW5jdG9yIGltcGxlbWVudGluZyB0aGUgb3BlcmF0b3IKKyAgKiBcdHBhcmFtIFBsYWluT2JqZWN0VHlwZSB0aGUgdW5kZXJseWluZyBwbGFpbiBtYXRyaXgvYXJyYXkgdHlwZQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgYSBnZW5lcmljIG51bGxhcnkgb3BlcmF0b3IuCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBPbmVzKCksIFplcm8oKSwgQ29uc3RhbnQoKSwgSWRlbnRpdHkoKSBhbmQgUmFuZG9tKCkgbWV0aG9kcywKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBmdW5jdGlvbiByZXR1cm5pbmcgc3VjaCBhbiBleHByZXNzaW9uLCB5b3UKKyAgKiB3aWxsIG5lZWQgdG8gdXNlIHRoaXMgY2xhc3MuCisgICoKKyAgKiBUaGUgZnVuY3RvciBOdWxsYXJ5T3AgbXVzdCBleHBvc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorICAgIDx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKyAgICA8dHIgICAgICAgICAgICA+PHRkPlxjIG9wZXJhdG9yKCkoKSA8L3RkPjx0ZD5pZiB0aGUgcHJvY2VkdXJhbCBnZW5lcmF0aW9uIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29lZmZpY2llbnQgZW50cmllcyAoZS5nLiwgcmFuZG9tIG51bWJlcnMpPC90ZD48L3RyPgorICAgIDx0ciBjbGFzcz0iYWx0Ij48dGQ+XGMgb3BlcmF0b3IoKShJbmRleCBpKTwvdGQ+PHRkPmlmIHRoZSBwcm9jZWR1cmFsIGdlbmVyYXRpb24gbWFrZXMgc2Vuc2UgZm9yIHZlY3RvcnMgb25seSBhbmQgdGhhdCBpdCBkZXBlbmRzIG9uIHRoZSBjb2VmZmljaWVudCBpbmRleCBcYyBpIChlLmcuLCBsaW5zcGFjZSkgPC90ZD48L3RyPgorICAgIDx0ciAgICAgICAgICAgID48dGQ+XGMgb3BlcmF0b3IoKShJbmRleCBpLEluZGV4IGopPC90ZD48dGQ+aWYgdGhlIHByb2NlZHVyYWwgZ2VuZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSBtYXRyaXggY29vcmRpbmF0ZXMgXGMgaSwgXGMgaiAoZS5nLiwgdG8gZ2VuZXJhdGUgYSBjaGVja2VyYm9hcmQgd2l0aCAwIGFuZCAxKTwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZXhwb3NlIHRoZSBsYXN0IHR3byBvcGVyYXRvcnMgaWYgdGhlIGdlbmVyYXRpb24gbWFrZXMgc2Vuc2UgZm9yIG1hdHJpY2VzIGJ1dCBjYW4gYmUgb3B0aW1pemVkIGZvciB2ZWN0b3JzLgorICAqCisgICogU2VlIERlbnNlQmFzZTo6TnVsbGFyeUV4cHIoSW5kZXgsY29uc3QgQ3VzdG9tTnVsbGFyeU9wJikgZm9yIGFuIGV4YW1wbGUgYmluZGluZworICAqIEMrKzExIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycy4KKyAgKgorICAqIEEgbnVsbGFyeSBleHByZXNzaW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBzb3BoaXN0aWNhdGVkIG1hdHJpeCBtYW5pcHVsYXRpb25zCisgICogdGhhdCBjYW5ub3QgYmUgY292ZXJlZCBieSB0aGUgZXhpc3Rpbmcgc2V0IG9mIG5hdGl2ZWx5IHN1cHBvcnRlZCBtYXRyaXggbWFuaXB1bGF0aW9ucy4KKyAgKiBTZWUgdGhpcyBccmVmIFRvcGljQ3VzdG9taXppbmdfTnVsbGFyeUV4cHIgInBhZ2UiIGZvciBzb21lIGV4YW1wbGVzIGFuZCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucworICAqIG9uIHRoZSBiZWhhdmlvciBvZiBDd2lzZU51bGxhcnlPcC4KKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIGNsYXNzIEN3aXNlQmluYXJ5T3AsIERlbnNlQmFzZTo6TnVsbGFyeUV4cHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE51bGxhcnlPcCwgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorY2xhc3MgQ3dpc2VOdWxsYXJ5T3AgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsIFBsYWluT2JqZWN0VHlwZT4gPjo6dHlwZSwgaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8Q3dpc2VOdWxsYXJ5T3A+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShDd2lzZU51bGxhcnlPcCkKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQ3dpc2VOdWxsYXJ5T3AoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgTnVsbGFyeU9wJiBmdW5jID0gTnVsbGFyeU9wKCkpCisgICAgICA6IG1fcm93cyhyb3dzKSwgbV9jb2xzKGNvbHMpLCBtX2Z1bmN0b3IoZnVuYykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93cyA+PSAwCisgICAgICAgICAgICAmJiAoUm93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyB8fCBSb3dzQXRDb21waWxlVGltZSA9PSByb3dzKQorICAgICAgICAgICAgJiYgIGNvbHMgPj0gMAorICAgICAgICAgICAgJiYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gY29scykpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzLnZhbHVlKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29scy52YWx1ZSgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGZ1bmN0b3IgcmVwcmVzZW50aW5nIHRoZSBudWxsYXJ5IG9wZXJhdGlvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgTnVsbGFyeU9wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzQXRDb21waWxlVGltZT4gbV9yb3dzOworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBDb2xzQXRDb21waWxlVGltZT4gbV9jb2xzOworICAgIGNvbnN0IE51bGxhcnlPcCBtX2Z1bmN0b3I7Cit9OworCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgbWF0cml4IGRlZmluZWQgYnkgYSBjdXN0b20gZnVuY3RvciBcYSBmdW5jCisgICoKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgbWF0cml4IHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSByb3dzIGFuZCBcYSBjb2xzIGFzIGFyZ3VtZW50cywgc28gWmVybygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tTnVsbGFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tTnVsbGFyeU9wPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitEZW5zZUJhc2U8RGVyaXZlZD46Ok51bGxhcnlFeHByKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IEN1c3RvbU51bGxhcnlPcCYgZnVuYykKK3sKKyAgcmV0dXJuIEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+KHJvd3MsIGNvbHMsIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIG1hdHJpeCBkZWZpbmVkIGJ5IGEgY3VzdG9tIGZ1bmN0b3IgXGEgZnVuYworICAqCisgICogVGhlIHBhcmFtZXRlciBcYSBzaXplIGlzIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuCisgICogTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSB2ZWN0b3IgdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHNpemUgYXMgYXJndW1lbnQsIHNvIFplcm8oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIEN1c3RvbU51bGxhcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rvci4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSB3aXRoIEMrKzExIHJhbmRvbSBnZW5lcmF0b3JzOiBcaW5jbHVkZSByYW5kb21fY3BwMTEuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgcmFuZG9tX2NwcDExLm91dAorICAqIAorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbU51bGxhcnlPcD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8Q3VzdG9tTnVsbGFyeU9wLCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihJbmRleCBzaXplLCBjb25zdCBDdXN0b21OdWxsYXJ5T3AmIGZ1bmMpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgaWYoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSkgcmV0dXJuIEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+KDEsIHNpemUsIGZ1bmMpOworICBlbHNlIHJldHVybiBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIFBsYWluT2JqZWN0PihzaXplLCAxLCBmdW5jKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBtYXRyaXggZGVmaW5lZCBieSBhIGN1c3RvbSBmdW5jdG9yIFxhIGZ1bmMKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBvbmx5IGZvciBmaXhlZC1zaXplIERlbnNlQmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnRzIHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tTnVsbGFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tTnVsbGFyeU9wPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitEZW5zZUJhc2U8RGVyaXZlZD46Ok51bGxhcnlFeHByKGNvbnN0IEN1c3RvbU51bGxhcnlPcCYgZnVuYykKK3sKKyAgcmV0dXJuIEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+KFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgZnVuYyk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgY29uc3RhbnQgbWF0cml4IG9mIHZhbHVlIFxhIHZhbHVlCisgICoKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIERlbnNlQmFzZSB0eXBlLgorICAqCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaXggdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHJvd3MgYW5kIFxhIGNvbHMgYXMgYXJndW1lbnRzLCBzbyBaZXJvKCkgc2hvdWxkIGJlIHVzZWQKKyAgKiBpbnN0ZWFkLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21OdWxsYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RhbnRSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50KEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFNjYWxhciYgdmFsdWUpCit7CisgIHJldHVybiBEZW5zZUJhc2U8RGVyaXZlZD46Ok51bGxhcnlFeHByKHJvd3MsIGNvbHMsIGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPih2YWx1ZSkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGNvbnN0YW50IG1hdHJpeCBvZiB2YWx1ZSBcYSB2YWx1ZQorICAqCisgICogVGhlIHBhcmFtZXRlciBcYSBzaXplIGlzIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuCisgICogTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBEZW5zZUJhc2UgdHlwZS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIHZlY3RvciB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgc2l6ZSBhcyBhcmd1bWVudCwgc28gWmVybygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tTnVsbGFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIHZhbHVlKQoreworICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihzaXplLCBpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4odmFsdWUpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBjb25zdGFudCBtYXRyaXggb2YgdmFsdWUgXGEgdmFsdWUKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBvbmx5IGZvciBmaXhlZC1zaXplIERlbnNlQmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnRzIHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tTnVsbGFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudChjb25zdCBTY2FsYXImIHZhbHVlKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX0ZJWEVEX1NJWkUoRGVyaXZlZCkKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4odmFsdWUpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIGJlY2F1c2Ugb2YgYWNjdXJhY3kgbG9zcy4gSW4gRWlnZW4gMy4zLCBpdCBpcyBhbiBhbGlhcyBmb3IgTGluU3BhY2VkKEluZGV4LGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJikKKyAgKgorICAqIFxzYSBMaW5TcGFjZWQoSW5kZXgsU2NhbGFyLFNjYWxhciksIHNldExpblNwYWNlZChJbmRleCxjb25zdCBTY2FsYXImLGNvbnN0IFNjYWxhciYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbUFjY2Vzc0xpblNwYWNlZFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6TGluU3BhY2VkKFNlcXVlbnRpYWxfdCwgSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihzaXplLCBpbnRlcm5hbDo6bGluc3BhY2VkX29wPFNjYWxhcixQYWNrZXRTY2FsYXI+KGxvdyxoaWdoLHNpemUpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIGJlY2F1c2Ugb2YgYWNjdXJhY3kgbG9zcy4gSW4gRWlnZW4gMy4zLCBpdCBpcyBhbiBhbGlhcyBmb3IgTGluU3BhY2VkKGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJikKKyAgKgorICAqIFxzYSBMaW5TcGFjZWQoU2NhbGFyLFNjYWxhcikKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpMaW5TcGFjZWQoU2VxdWVudGlhbF90LCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfRklYRURfU0laRShEZXJpdmVkKQorICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSwgaW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxTY2FsYXIsUGFja2V0U2NhbGFyPihsb3csaGlnaCxEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSkpOworfQorCisvKioKKyAgKiBcYnJpZWYgU2V0cyBhIGxpbmVhcmx5IHNwYWNlZCB2ZWN0b3IuCisgICoKKyAgKiBUaGUgZnVuY3Rpb24gZ2VuZXJhdGVzICdzaXplJyBlcXVhbGx5IHNwYWNlZCB2YWx1ZXMgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBbbG93LGhpZ2hdLgorICAqIFdoZW4gc2l6ZSBpcyBzZXQgdG8gMSwgYSB2ZWN0b3Igb2YgbGVuZ3RoIDEgY29udGFpbmluZyAnaGlnaCcgaXMgcmV0dXJuZWQuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBEZW5zZUJhc2VfTGluU3BhY2VkLm91dAorICAqCisgICogRm9yIGludGVnZXIgc2NhbGFyIHR5cGVzLCBhbiBldmVuIHNwYWNpbmcgaXMgcG9zc2libGUgaWYgYW5kIG9ubHkgaWYgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UsCisgICogaS5lLiwgXGMgaGlnaC1sb3cgaXMgYSBzY2FsYXIgbXVsdGlwbGUgb2YgXGMgc2l6ZS0xLCBvciBpZiBcYyBzaXplIGlzIGEgc2NhbGFyIG11bHRpcGxlIG9mIHRoZQorICAqIG51bWJlciBvZiB2YWx1ZXMgXGMgaGlnaC1sb3crMSAobWVhbmluZyBlYWNoIHZhbHVlIGNhbiBiZSByZXBlYXRlZCB0aGUgc2FtZSBudW1iZXIgb2YgdGltZSkuCisgICogSWYgb25lIG9mIHRoZXNlIHR3byBjb25zaWRpb25zIGlzIG5vdCBzYXRpc2ZpZWQsIHRoZW4gXGMgaGlnaCBpcyBsb3dlcmVkIHRvIHRoZSBsYXJnZXN0IHZhbHVlCisgICogc2F0aXNmeWluZyBvbmUgb2YgdGhpcyBjb25zdHJhaW50LgorICAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfTGluU3BhY2VkSW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV9MaW5TcGFjZWRJbnQub3V0CisgICoKKyAgKiBcc2Egc2V0TGluU3BhY2VkKEluZGV4LGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJiksIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbUFjY2Vzc0xpblNwYWNlZFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6TGluU3BhY2VkKEluZGV4IHNpemUsIGNvbnN0IFNjYWxhciYgbG93LCBjb25zdCBTY2FsYXImIGhpZ2gpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoc2l6ZSwgaW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxTY2FsYXIsUGFja2V0U2NhbGFyPihsb3csaGlnaCxzaXplKSk7Cit9CisKKy8qKgorICAqIFxjb3B5ZG9jIERlbnNlQmFzZTo6TGluU3BhY2VkKEluZGV4LCBjb25zdCBTY2FsYXImLCBjb25zdCBTY2FsYXImKQorICAqIFNwZWNpYWwgdmVyc2lvbiBmb3IgZml4ZWQgc2l6ZSB0eXBlcyB3aGljaCBkb2VzIG5vdCByZXF1aXJlIHRoZSBzaXplIHBhcmFtZXRlci4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpMaW5TcGFjZWQoY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX0ZJWEVEX1NJWkUoRGVyaXZlZCkKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUsIGludGVybmFsOjpsaW5zcGFjZWRfb3A8U2NhbGFyLFBhY2tldFNjYWxhcj4obG93LGhpZ2gsRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUpKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIG1hdHJpeCBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSB2YWwsIHRvIHdpdGhpbiBwcmVjaXNpb24gXGEgcHJlYyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc0FwcHJveFRvQ29uc3RhbnQKKyhjb25zdCBTY2FsYXImIHZhbCwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykgY29uc3QKK3sKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMT46OnR5cGUgc2VsZihkZXJpdmVkKCkpOworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByb3dzKCk7ICsraSkKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNBcHByb3goc2VsZi5jb2VmZihpLCBqKSwgdmFsLCBwcmVjKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFRoaXMgaXMganVzdCBhbiBhbGlhcyBmb3IgaXNBcHByb3hUb0NvbnN0YW50KCkuCisgICoKKyAgKiBccmV0dXJucyB0cnVlIGlmIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBtYXRyaXggYXJlIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgdmFsdWUsIHRvIHdpdGhpbiBwcmVjaXNpb24gXGEgcHJlYyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc0NvbnN0YW50CisoY29uc3QgU2NhbGFyJiB2YWwsIGNvbnN0IFJlYWxTY2FsYXImIHByZWMpIGNvbnN0Cit7CisgIHJldHVybiBpc0FwcHJveFRvQ29uc3RhbnQodmFsLCBwcmVjKTsKK30KKworLyoqIEFsaWFzIGZvciBzZXRDb25zdGFudCgpOiBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIFxhIHZhbC4KKyAgKgorICAqIFxzYSBzZXRDb25zdGFudCgpLCBDb25zdGFudCgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBEZW5zZUJhc2U8RGVyaXZlZD46OmZpbGwoY29uc3QgU2NhbGFyJiB2YWwpCit7CisgIHNldENvbnN0YW50KHZhbCk7Cit9CisKKy8qKiBTZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHZhbHVlIFxhIHZhbC4KKyAgKgorICAqIFxzYSBmaWxsKCksIHNldENvbnN0YW50KEluZGV4LGNvbnN0IFNjYWxhciYpLCBzZXRDb25zdGFudChJbmRleCxJbmRleCxjb25zdCBTY2FsYXImKSwgc2V0WmVybygpLCBzZXRPbmVzKCksIENvbnN0YW50KCksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBzZXRaZXJvKCksIHNldE9uZXMoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpzZXRDb25zdGFudChjb25zdCBTY2FsYXImIHZhbCkKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKSA9IENvbnN0YW50KHJvd3MoKSwgY29scygpLCB2YWwpOworfQorCisvKiogUmVzaXplcyB0byB0aGUgZ2l2ZW4gXGEgc2l6ZSwgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHZhbHVlIFxhIHZhbC4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRDb25zdGFudF9pbnQub3V0CisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6c2V0Q29uc3RhbnQoY29uc3QgU2NhbGFyJiksIHNldENvbnN0YW50KEluZGV4LEluZGV4LGNvbnN0IFNjYWxhciYpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgTWF0cml4QmFzZTo6Q29uc3RhbnQoY29uc3QgU2NhbGFyJikKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldENvbnN0YW50KEluZGV4IHNpemUsIGNvbnN0IFNjYWxhciYgdmFsKQoreworICByZXNpemUoc2l6ZSk7CisgIHJldHVybiBzZXRDb25zdGFudCh2YWwpOworfQorCisvKiogUmVzaXplcyB0byB0aGUgZ2l2ZW4gc2l6ZSwgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHZhbHVlIFxhIHZhbC4KKyAgKgorICAqIFxwYXJhbSByb3dzIHRoZSBuZXcgbnVtYmVyIG9mIHJvd3MKKyAgKiBccGFyYW0gY29scyB0aGUgbmV3IG51bWJlciBvZiBjb2x1bW5zCisgICogXHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gd2hpY2ggYWxsIGNvZWZmaWNpZW50cyBhcmUgc2V0CisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzZXRDb25zdGFudChjb25zdCBTY2FsYXImKSwgc2V0Q29uc3RhbnQoSW5kZXgsY29uc3QgU2NhbGFyJiksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBNYXRyaXhCYXNlOjpDb25zdGFudChjb25zdCBTY2FsYXImKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1BsYWluT2JqZWN0QmFzZTxEZXJpdmVkPjo6c2V0Q29uc3RhbnQoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU2NhbGFyJiB2YWwpCit7CisgIHJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgcmV0dXJuIHNldENvbnN0YW50KHZhbCk7Cit9CisKKy8qKgorICAqIFxicmllZiBTZXRzIGEgbGluZWFybHkgc3BhY2VkIHZlY3Rvci4KKyAgKgorICAqIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMgJ3NpemUnIGVxdWFsbHkgc3BhY2VkIHZhbHVlcyBpbiB0aGUgY2xvc2VkIGludGVydmFsIFtsb3csaGlnaF0uCisgICogV2hlbiBzaXplIGlzIHNldCB0byAxLCBhIHZlY3RvciBvZiBsZW5ndGggMSBjb250YWluaW5nICdoaWdoJyBpcyByZXR1cm5lZC4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2Vfc2V0TGluU3BhY2VkLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV9zZXRMaW5TcGFjZWQub3V0CisgICoKKyAgKiBGb3IgaW50ZWdlciBzY2FsYXIgdHlwZXMsIGRvIG5vdCBtaXNzIHRoZSBleHBsYW5hdGlvbnMgb24gdGhlIGRlZmluaXRpb24KKyAgKiBvZiBcbGluayBMaW5TcGFjZWQoSW5kZXgsY29uc3QgU2NhbGFyJixjb25zdCBTY2FsYXImKSBldmVuIHNwYWNpbmcgXGVuZGxpbmsuCisgICoKKyAgKiBcc2EgTGluU3BhY2VkKEluZGV4LGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJiksIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46OnNldExpblNwYWNlZChJbmRleCBuZXdTaXplLCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiBkZXJpdmVkKCkgPSBEZXJpdmVkOjpOdWxsYXJ5RXhwcihuZXdTaXplLCBpbnRlcm5hbDo6bGluc3BhY2VkX29wPFNjYWxhcixQYWNrZXRTY2FsYXI+KGxvdyxoaWdoLG5ld1NpemUpKTsKK30KKworLyoqCisgICogXGJyaWVmIFNldHMgYSBsaW5lYXJseSBzcGFjZWQgdmVjdG9yLgorICAqCisgICogVGhlIGZ1bmN0aW9uIGZpbGxzIFxjICp0aGlzIHdpdGggZXF1YWxseSBzcGFjZWQgdmFsdWVzIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgW2xvdyxoaWdoXS4KKyAgKiBXaGVuIHNpemUgaXMgc2V0IHRvIDEsIGEgdmVjdG9yIG9mIGxlbmd0aCAxIGNvbnRhaW5pbmcgJ2hpZ2gnIGlzIHJldHVybmVkLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIEZvciBpbnRlZ2VyIHNjYWxhciB0eXBlcywgZG8gbm90IG1pc3MgdGhlIGV4cGxhbmF0aW9ucyBvbiB0aGUgZGVmaW5pdGlvbgorICAqIG9mIFxsaW5rIExpblNwYWNlZChJbmRleCxjb25zdCBTY2FsYXImLGNvbnN0IFNjYWxhciYpIGV2ZW4gc3BhY2luZyBcZW5kbGluay4KKyAgKgorICAqIFxzYSBMaW5TcGFjZWQoSW5kZXgsY29uc3QgU2NhbGFyJixjb25zdCBTY2FsYXImKSwgc2V0TGluU3BhY2VkKEluZGV4LCBjb25zdCBTY2FsYXImLCBjb25zdCBTY2FsYXImKSwgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6c2V0TGluU3BhY2VkKGNvbnN0IFNjYWxhciYgbG93LCBjb25zdCBTY2FsYXImIGhpZ2gpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIHNldExpblNwYWNlZChzaXplKCksIGxvdywgaGlnaCk7Cit9CisKKy8vIHplcm86CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgemVybyBtYXRyaXguCisgICoKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgbWF0cml4IHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSByb3dzIGFuZCBcYSBjb2xzIGFzIGFyZ3VtZW50cywgc28gWmVybygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfemVyb19pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfemVyb19pbnRfaW50Lm91dAorICAqCisgICogXHNhIFplcm8oKSwgWmVybyhJbmRleCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RhbnRSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46Olplcm8oSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgcmV0dXJuIENvbnN0YW50KHJvd3MsIGNvbHMsIFNjYWxhcigwKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgemVybyB2ZWN0b3IuCisgICoKKyAgKiBUaGUgcGFyYW1ldGVyIFxhIHNpemUgaXMgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgKiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIHZlY3RvciB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgc2l6ZSBhcyBhcmd1bWVudCwgc28gWmVybygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfemVyb19pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV96ZXJvX2ludC5vdXQKKyAgKgorICAqIFxzYSBaZXJvKCksIFplcm8oSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpaZXJvKEluZGV4IHNpemUpCit7CisgIHJldHVybiBDb25zdGFudChzaXplLCBTY2FsYXIoMCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgemVybyBtYXRyaXggb3IgdmVjdG9yLgorICAqCisgICogVGhpcyB2YXJpYW50IGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgTWF0cml4QmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnRzIHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfemVyby5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3plcm8ub3V0CisgICoKKyAgKiBcc2EgWmVybyhJbmRleCksIFplcm8oSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpaZXJvKCkKK3sKKyAgcmV0dXJuIENvbnN0YW50KFNjYWxhcigwKSk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIHplcm8gbWF0cml4LAorICAqICAgICAgICAgIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGdpdmVuIGJ5IFxhIHByZWMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2lzWmVyby5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2lzWmVyby5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgWmVybygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmlzWmVybyhjb25zdCBSZWFsU2NhbGFyJiBwcmVjKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwxPjo6dHlwZSBzZWxmKGRlcml2ZWQoKSk7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJvd3MoKTsgKytpKQorICAgICAgaWYoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihzZWxmLmNvZWZmKGksIGopLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpLCBwcmVjKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gemVyby4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0WmVyby5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NldFplcm8ub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIFplcm8oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpzZXRaZXJvKCkKK3sKKyAgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigwKSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBcYSBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byB6ZXJvLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeF9zZXRaZXJvX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0WmVyb19pbnQub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZXRaZXJvKCksIHNldFplcm8oSW5kZXgsSW5kZXgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgRGVuc2VCYXNlOjpaZXJvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldFplcm8oSW5kZXggbmV3U2l6ZSkKK3sKKyAgcmVzaXplKG5ld1NpemUpOworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDApKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIHNpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHplcm8uCisgICoKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldFplcm9faW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0WmVyb19pbnRfaW50Lm91dAorICAqCisgICogXHNhIERlbnNlQmFzZTo6c2V0WmVybygpLCBzZXRaZXJvKEluZGV4KSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIERlbnNlQmFzZTo6WmVybygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+OjpzZXRaZXJvKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigwKSk7Cit9CisKKy8vIG9uZXM6CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgbWF0cml4IHdoZXJlIGFsbCBjb2VmZmljaWVudHMgZXF1YWwgb25lLgorICAqCisgICogVGhlIHBhcmFtZXRlcnMgXGEgcm93cyBhbmQgXGEgY29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBvZiBjb2x1bW5zIG9mCisgICogdGhlIHJldHVybmVkIG1hdHJpeC4gTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIG1hdHJpeCB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgcm93cyBhbmQgXGEgY29scyBhcyBhcmd1bWVudHMsIHNvIE9uZXMoKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX29uZXNfaW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBPbmVzKCksIE9uZXMoSW5kZXgpLCBpc09uZXMoKSwgY2xhc3MgT25lcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6T25lcyhJbmRleCByb3dzLCBJbmRleCBjb2xzKQoreworICByZXR1cm4gQ29uc3RhbnQocm93cywgY29scywgU2NhbGFyKDEpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSB2ZWN0b3Igd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBlcXVhbCBvbmUuCisgICoKKyAgKiBUaGUgcGFyYW1ldGVyIFxhIG5ld1NpemUgaXMgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgKiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIHZlY3RvciB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgc2l6ZSBhcyBhcmd1bWVudCwgc28gT25lcygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfb25lc19pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9vbmVzX2ludC5vdXQKKyAgKgorICAqIFxzYSBPbmVzKCksIE9uZXMoSW5kZXgsSW5kZXgpLCBpc09uZXMoKSwgY2xhc3MgT25lcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6T25lcyhJbmRleCBuZXdTaXplKQoreworICByZXR1cm4gQ29uc3RhbnQobmV3U2l6ZSwgU2NhbGFyKDEpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIG1hdHJpeCBvciB2ZWN0b3Igd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBlcXVhbCBvbmUuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgb25seSBmb3IgZml4ZWQtc2l6ZSBNYXRyaXhCYXNlIHR5cGVzLiBGb3IgZHluYW1pYy1zaXplIHR5cGVzLCB5b3UKKyAgKiBuZWVkIHRvIHVzZSB0aGUgdmFyaWFudHMgdGFraW5nIHNpemUgYXJndW1lbnRzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9vbmVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfb25lcy5vdXQKKyAgKgorICAqIFxzYSBPbmVzKEluZGV4KSwgT25lcyhJbmRleCxJbmRleCksIGlzT25lcygpLCBjbGFzcyBPbmVzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpPbmVzKCkKK3sKKyAgcmV0dXJuIENvbnN0YW50KFNjYWxhcigxKSk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIG1hdHJpeCB3aGVyZSBhbGwgY29lZmZpY2llbnRzCisgICogICAgICAgICAgYXJlIGVxdWFsIHRvIDEsIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGdpdmVuIGJ5IFxhIHByZWMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2lzT25lcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2lzT25lcy5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgT25lcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmlzT25lcworKGNvbnN0IFJlYWxTY2FsYXImIHByZWMpIGNvbnN0Cit7CisgIHJldHVybiBpc0FwcHJveFRvQ29uc3RhbnQoU2NhbGFyKDEpLCBwcmVjKTsKK30KKworLyoqIFNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gb25lLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZXRPbmVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0T25lcy5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgT25lcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46OnNldE9uZXMoKQoreworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDEpKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIFxhIG5ld1NpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIG9uZS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0T25lc19pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3NldE9uZXNfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldE9uZXMoKSwgc2V0T25lcyhJbmRleCxJbmRleCksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBNYXRyaXhCYXNlOjpPbmVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldE9uZXMoSW5kZXggbmV3U2l6ZSkKK3sKKyAgcmVzaXplKG5ld1NpemUpOworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDEpKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIHNpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIG9uZS4KKyAgKgorICAqIFxwYXJhbSByb3dzIHRoZSBuZXcgbnVtYmVyIG9mIHJvd3MKKyAgKiBccGFyYW0gY29scyB0aGUgbmV3IG51bWJlciBvZiBjb2x1bW5zCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0T25lc19pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRPbmVzX2ludF9pbnQub3V0CisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6c2V0T25lcygpLCBzZXRPbmVzKEluZGV4KSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIE1hdHJpeEJhc2U6Ok9uZXMoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1BsYWluT2JqZWN0QmFzZTxEZXJpdmVkPjo6c2V0T25lcyhJbmRleCByb3dzLCBJbmRleCBjb2xzKQoreworICByZXNpemUocm93cywgY29scyk7CisgIHJldHVybiBzZXRDb25zdGFudChTY2FsYXIoMSkpOworfQorCisvLyBJZGVudGl0eToKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGlkZW50aXR5IG1hdHJpeCAobm90IG5lY2Vzc2FyaWx5IHNxdWFyZSkuCisgICoKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgbWF0cml4IHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSByb3dzIGFuZCBcYSBjb2xzIGFzIGFyZ3VtZW50cywgc28gSWRlbnRpdHkoKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2lkZW50aXR5X2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pZGVudGl0eV9pbnRfaW50Lm91dAorICAqCisgICogXHNhIElkZW50aXR5KCksIHNldElkZW50aXR5KCksIGlzSWRlbnRpdHkoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6SWRlbnRpdHlSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpJZGVudGl0eShJbmRleCByb3dzLCBJbmRleCBjb2xzKQoreworICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihyb3dzLCBjb2xzLCBpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBpZGVudGl0eSBtYXRyaXggKG5vdCBuZWNlc3NhcmlseSBzcXVhcmUpLgorICAqCisgICogVGhpcyB2YXJpYW50IGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgTWF0cml4QmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnQgdGFraW5nIHNpemUgYXJndW1lbnRzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pZGVudGl0eS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2lkZW50aXR5Lm91dAorICAqCisgICogXHNhIElkZW50aXR5KEluZGV4LEluZGV4KSwgc2V0SWRlbnRpdHkoKSwgaXNJZGVudGl0eSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpJZGVudGl0eVJldHVyblR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OklkZW50aXR5KCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9GSVhFRF9TSVpFKERlcml2ZWQpCisgIHJldHVybiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPigpKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB0aGUgaWRlbnRpdHkgbWF0cml4CisgICogICAgICAgICAgKG5vdCBuZWNlc3NhcmlseSBzcXVhcmUpLAorICAqICAgICAgICAgIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGdpdmVuIGJ5IFxhIHByZWMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2lzSWRlbnRpdHkuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pc0lkZW50aXR5Lm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBJZGVudGl0eSgpLCBJZGVudGl0eShJbmRleCxJbmRleCksIHNldElkZW50aXR5KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIE1hdHJpeEJhc2U8RGVyaXZlZD46OmlzSWRlbnRpdHkKKyhjb25zdCBSZWFsU2NhbGFyJiBwcmVjKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwxPjo6dHlwZSBzZWxmKGRlcml2ZWQoKSk7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICB7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcm93cygpOyArK2kpCisgICAgeworICAgICAgaWYoaSA9PSBqKQorICAgICAgeworICAgICAgICBpZighaW50ZXJuYWw6OmlzQXBwcm94KHNlbGYuY29lZmYoaSwgaiksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSksIHByZWMpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihzZWxmLmNvZWZmKGksIGopLCBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKSwgcHJlYykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgYm9vbCBCaWcgPSAoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU+PTE2KT4KK3N0cnVjdCBzZXRJZGVudGl0eV9pbXBsCit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIHJ1bihEZXJpdmVkJiBtKQorICB7CisgICAgcmV0dXJuIG0gPSBEZXJpdmVkOjpJZGVudGl0eShtLnJvd3MoKSwgbS5jb2xzKCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHNldElkZW50aXR5X2ltcGw8RGVyaXZlZCwgdHJ1ZT4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgcnVuKERlcml2ZWQmIG0pCisgIHsKKyAgICBtLnNldFplcm8oKTsKKyAgICBjb25zdCBJbmRleCBzaXplID0gbnVtZXh0OjptaW5pKG0ucm93cygpLCBtLmNvbHMoKSk7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBtLmNvZWZmUmVmKGksaSkgPSB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIoMSk7CisgICAgcmV0dXJuIG07CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogV3JpdGVzIHRoZSBpZGVudGl0eSBleHByZXNzaW9uIChub3QgbmVjZXNzYXJpbHkgc3F1YXJlKSBpbnRvICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZXRJZGVudGl0eS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NldElkZW50aXR5Lm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBJZGVudGl0eSgpLCBJZGVudGl0eShJbmRleCxJbmRleCksIGlzSWRlbnRpdHkoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPjo6c2V0SWRlbnRpdHkoKQoreworICByZXR1cm4gaW50ZXJuYWw6OnNldElkZW50aXR5X2ltcGw8RGVyaXZlZD46OnJ1bihkZXJpdmVkKCkpOworfQorCisvKiogXGJyaWVmIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIHNpemUsIGFuZCB3cml0ZXMgdGhlIGlkZW50aXR5IGV4cHJlc3Npb24gKG5vdCBuZWNlc3NhcmlseSBzcXVhcmUpIGludG8gKnRoaXMuCisgICoKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldElkZW50aXR5X2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3NldElkZW50aXR5X2ludF9pbnQub3V0CisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6c2V0SWRlbnRpdHkoKSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIE1hdHJpeEJhc2U6OklkZW50aXR5KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46OnNldElkZW50aXR5KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIGRlcml2ZWQoKS5yZXNpemUocm93cywgY29scyk7CisgIHJldHVybiBzZXRJZGVudGl0eSgpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaS10aCB1bml0IChiYXNpcykgdmVjdG9yLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdFgoKSwgTWF0cml4QmFzZTo6VW5pdFkoKSwgTWF0cml4QmFzZTo6VW5pdFooKSwgTWF0cml4QmFzZTo6VW5pdFcoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6QmFzaXNSZXR1cm5UeXBlIE1hdHJpeEJhc2U8RGVyaXZlZD46OlVuaXQoSW5kZXggbmV3U2l6ZSwgSW5kZXggaSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQmFzaXNSZXR1cm5UeXBlKFNxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KG5ld1NpemUsbmV3U2l6ZSksIGkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaS10aCB1bml0IChiYXNpcykgdmVjdG9yLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBmb3IgZml4ZWQtc2l6ZSB2ZWN0b3Igb25seS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4LEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdFgoKSwgTWF0cml4QmFzZTo6VW5pdFkoKSwgTWF0cml4QmFzZTo6VW5pdFooKSwgTWF0cml4QmFzZTo6VW5pdFcoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6QmFzaXNSZXR1cm5UeXBlIE1hdHJpeEJhc2U8RGVyaXZlZD46OlVuaXQoSW5kZXggaSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQmFzaXNSZXR1cm5UeXBlKFNxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KCksaSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBYIGF4aXMgdW5pdCB2ZWN0b3IgKDF7LDB9XiopCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogXHNhIE1hdHJpeEJhc2U6OlVuaXQoSW5kZXgsSW5kZXgpLCBNYXRyaXhCYXNlOjpVbml0KEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdFkoKSwgTWF0cml4QmFzZTo6VW5pdFooKSwgTWF0cml4QmFzZTo6VW5pdFcoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6QmFzaXNSZXR1cm5UeXBlIE1hdHJpeEJhc2U8RGVyaXZlZD46OlVuaXRYKCkKK3sgcmV0dXJuIERlcml2ZWQ6OlVuaXQoMCk7IH0KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIFkgYXhpcyB1bml0IHZlY3RvciAoMCwxeywwfV4qKQorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4LEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdChJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0WSgpCit7IHJldHVybiBEZXJpdmVkOjpVbml0KDEpOyB9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBaIGF4aXMgdW5pdCB2ZWN0b3IgKDAsMCwxeywwfV4qKQorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4LEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdChJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0WigpCit7IHJldHVybiBEZXJpdmVkOjpVbml0KDIpOyB9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBXIGF4aXMgdW5pdCB2ZWN0b3IgKDAsMCwwLDEpCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogXHNhIE1hdHJpeEJhc2U6OlVuaXQoSW5kZXgsSW5kZXgpLCBNYXRyaXhCYXNlOjpVbml0KEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdFkoKSwgTWF0cml4QmFzZTo6VW5pdFooKSwgTWF0cml4QmFzZTo6VW5pdFcoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6QmFzaXNSZXR1cm5UeXBlIE1hdHJpeEJhc2U8RGVyaXZlZD46OlVuaXRXKCkKK3sgcmV0dXJuIERlcml2ZWQ6OlVuaXQoMyk7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DV0lTRV9OVUxMQVJZX09QX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVGVybmFyeU9wLmggYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVRlcm5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzU3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVRlcm5hcnlPcC5oCkBAIC0wLDAgKzEsMTk3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgRXVnZW5lIEJyZXZkbyA8ZWJyZXZkb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NXSVNFX1RFUk5BUllfT1BfSAorI2RlZmluZSBFSUdFTl9DV0lTRV9URVJOQVJZX09QX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZXJuYXJ5T3AsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlVGVybmFyeU9wPFRlcm5hcnlPcCwgQXJnMSwgQXJnMiwgQXJnMz4gPiB7CisgIC8vIHdlIG11c3Qgbm90IGluaGVyaXQgZnJvbSB0cmFpdHM8QXJnMT4gc2luY2UgaXQgaGFzCisgIC8vIHRoZSBwb3RlbnRpYWwgdG8gY2F1c2UgcHJvYmxlbXMgd2l0aCBNU1ZDCisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxBcmcxPjo6dHlwZSBBbmNlc3RvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8QW5jZXN0b3I+OjpYcHJLaW5kIFhwcktpbmQ7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gdHJhaXRzPEFuY2VzdG9yPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSB0cmFpdHM8QW5jZXN0b3I+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IHRyYWl0czxBbmNlc3Rvcj46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPEFuY2VzdG9yPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICAvLyBldmVuIHRob3VnaCB3ZSByZXF1aXJlIEFyZzEsIEFyZzIsIGFuZCBBcmczIHRvIGhhdmUgdGhlIHNhbWUgc2NhbGFyIHR5cGUKKyAgLy8gKHNlZSBDd2lzZVRlcm5hcnlPcCBjb25zdHJ1Y3RvciksCisgIC8vIHdlIHN0aWxsIHdhbnQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzIGRpZmZlcmVudC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8VGVybmFyeU9wKAorICAgICAgY29uc3QgdHlwZW5hbWUgQXJnMTo6U2NhbGFyJiwgY29uc3QgdHlwZW5hbWUgQXJnMjo6U2NhbGFyJiwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIEFyZzM6OlNjYWxhciYpPjo6dHlwZSBTY2FsYXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzE+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzE+OjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworCisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnMTo6TmVzdGVkIEFyZzFOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnMjo6TmVzdGVkIEFyZzJOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnMzo6TmVzdGVkIEFyZzNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxBcmcxTmVzdGVkPjo6dHlwZSBfQXJnMU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPEFyZzJOZXN0ZWQ+Ojp0eXBlIF9BcmcyTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8QXJnM05lc3RlZD46OnR5cGUgX0FyZzNOZXN0ZWQ7CisgIGVudW0geyBGbGFncyA9IF9BcmcxTmVzdGVkOjpGbGFncyAmIFJvd01ham9yQml0IH07Cit9OworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVybmFyeU9wLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAorICAgICAgICAgIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VUZXJuYXJ5T3BJbXBsOworCisvKiogXGNsYXNzIEN3aXNlVGVybmFyeU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gd2hlcmUgYSBjb2VmZmljaWVudC13aXNlIHRlcm5hcnkgb3BlcmF0b3IgaXMKKyAqIGFwcGxpZWQgdG8gdHdvIGV4cHJlc3Npb25zCisgICoKKyAgKiBcdHBhcmFtIFRlcm5hcnlPcCB0ZW1wbGF0ZSBmdW5jdG9yIGltcGxlbWVudGluZyB0aGUgb3BlcmF0b3IKKyAgKiBcdHBhcmFtIEFyZzFUeXBlIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICAqIFx0cGFyYW0gQXJnMlR5cGUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudAorICAqIFx0cGFyYW0gQXJnM1R5cGUgdGhlIHR5cGUgb2YgdGhlIHRoaXJkIGFyZ3VtZW50CisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiB3aGVyZSBhIGNvZWZmaWNpZW50LXdpc2UgdGVybmFyeQorICogb3BlcmF0b3IgaXMgYXBwbGllZCB0byB0aHJlZSBleHByZXNzaW9ucy4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGVybmFyeSBvcGVyYXRvcnMsIGJ5IHdoaWNoIHdlIG1lYW4gb25seSB0aG9zZQorICogdGVybmFyeSBvcGVyYXRvcnMgd2hlcmUKKyAgKiBhbGwgdGhyZWUgYXJndW1lbnRzIGFyZSBFaWdlbiBleHByZXNzaW9ucy4KKyAgKiBGb3IgZXhhbXBsZSwgdGhlIHJldHVybiB0eXBlIG9mIGJldGFpbmMobWF0cml4MSwgbWF0cml4MiwgbWF0cml4MykgaXMgYQorICogQ3dpc2VUZXJuYXJ5T3AuCisgICoKKyAgKiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0aGF0IGl0IGlzIHVzZWQsIHNvIHlvdSB0eXBpY2FsbHkKKyAqIGRvbid0IGhhdmUgdG8gbmFtZQorICAqIEN3aXNlVGVybmFyeU9wIHR5cGVzIGV4cGxpY2l0bHkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6dGVybmFyeUV4cHIoY29uc3QgTWF0cml4QmFzZTxBcmd1bWVudDI+ICYsIGNvbnN0CisgKiBNYXRyaXhCYXNlPEFyZ3VtZW50Mz4gJiwgY29uc3QgQ3VzdG9tVGVybmFyeU9wICYpIGNvbnN0LCBjbGFzcyBDd2lzZUJpbmFyeU9wLAorICogY2xhc3MgQ3dpc2VVbmFyeU9wLCBjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFRlcm5hcnlPcCwgdHlwZW5hbWUgQXJnMVR5cGUsIHR5cGVuYW1lIEFyZzJUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIEFyZzNUeXBlPgorY2xhc3MgQ3dpc2VUZXJuYXJ5T3AgOiBwdWJsaWMgQ3dpc2VUZXJuYXJ5T3BJbXBsPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVybmFyeU9wLCBBcmcxVHlwZSwgQXJnMlR5cGUsIEFyZzNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxBcmcxVHlwZT46OlN0b3JhZ2VLaW5kPiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QXJnMVR5cGU+Ojp0eXBlIEFyZzE7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QXJnMlR5cGU+Ojp0eXBlIEFyZzI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QXJnM1R5cGU+Ojp0eXBlIEFyZzM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZVRlcm5hcnlPcEltcGw8CisgICAgICBUZXJuYXJ5T3AsIEFyZzFUeXBlLCBBcmcyVHlwZSwgQXJnM1R5cGUsCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzFUeXBlPjo6U3RvcmFnZUtpbmQ+OjpCYXNlIEJhc2U7CisgIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShDd2lzZVRlcm5hcnlPcCkKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWZfc2VsZWN0b3I8QXJnMVR5cGU+Ojp0eXBlIEFyZzFOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxBcmcyVHlwZT46OnR5cGUgQXJnMk5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPEFyZzNUeXBlPjo6dHlwZSBBcmczTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPEFyZzFOZXN0ZWQ+Ojp0eXBlIF9BcmcxTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPEFyZzJOZXN0ZWQ+Ojp0eXBlIF9BcmcyTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPEFyZzNOZXN0ZWQ+Ojp0eXBlIF9BcmczTmVzdGVkOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ3dpc2VUZXJuYXJ5T3AoY29uc3QgQXJnMSYgYTEsIGNvbnN0IEFyZzImIGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlcm5hcnlPcCYgZnVuYyA9IFRlcm5hcnlPcCgpKQorICAgICAgOiBtX2FyZzEoYTEpLCBtX2FyZzIoYTIpLCBtX2FyZzMoYTMpLCBtX2Z1bmN0b3IoZnVuYykgeworICAgIC8vIHJlcXVpcmUgdGhlIHNpemVzIHRvIG1hdGNoCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKEFyZzEsIEFyZzIpCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKEFyZzEsIEFyZzMpCisKKyAgICAvLyBUaGUgaW5kZXggdHlwZXMgc2hvdWxkIG1hdGNoCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8CisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxBcmcxVHlwZT46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QXJnMlR5cGU+OjpTdG9yYWdlS2luZD46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JBR0VfS0lORF9NVVNUX01BVENIKQorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QXJnMVR5cGU+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzNUeXBlPjo6U3RvcmFnZUtpbmQ+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBTVE9SQUdFX0tJTkRfTVVTVF9NQVRDSCkKKworICAgIGVpZ2VuX2Fzc2VydChhMS5yb3dzKCkgPT0gYTIucm93cygpICYmIGExLmNvbHMoKSA9PSBhMi5jb2xzKCkgJiYKKyAgICAgICAgICAgICAgICAgYTEucm93cygpID09IGEzLnJvd3MoKSAmJiBhMS5jb2xzKCkgPT0gYTMuY29scygpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsKKyAgICAvLyByZXR1cm4gdGhlIGZpeGVkIHNpemUgdHlwZSBpZiBhdmFpbGFibGUgdG8gZW5hYmxlIGNvbXBpbGUgdGltZQorICAgIC8vIG9wdGltaXphdGlvbnMKKyAgICBpZiAoaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmcxTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgJiYKKyAgICAgICAgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmcyTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgICAgICByZXR1cm4gbV9hcmczLnJvd3MoKTsKKyAgICBlbHNlIGlmIChpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFyZzFOZXN0ZWQ+Ojp0eXBlPjo6CisgICAgICAgICAgICAgICAgICAgICBSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljICYmCisgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmczTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKKyAgICAgIHJldHVybiBtX2FyZzIucm93cygpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2FyZzEucm93cygpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsKKyAgICAvLyByZXR1cm4gdGhlIGZpeGVkIHNpemUgdHlwZSBpZiBhdmFpbGFibGUgdG8gZW5hYmxlIGNvbXBpbGUgdGltZQorICAgIC8vIG9wdGltaXphdGlvbnMKKyAgICBpZiAoaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmcxTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgJiYKKyAgICAgICAgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmcyTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgICAgICByZXR1cm4gbV9hcmczLmNvbHMoKTsKKyAgICBlbHNlIGlmIChpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFyZzFOZXN0ZWQ+Ojp0eXBlPjo6CisgICAgICAgICAgICAgICAgICAgICBDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljICYmCisgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmczTmVzdGVkPjo6dHlwZT46OgorICAgICAgICAgICAgICAgICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKKyAgICAgIHJldHVybiBtX2FyZzIuY29scygpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtX2FyZzEuY29scygpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQworICBjb25zdCBfQXJnMU5lc3RlZCYgYXJnMSgpIGNvbnN0IHsgcmV0dXJuIG1fYXJnMTsgfQorICAvKiogXHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IG5lc3RlZCBleHByZXNzaW9uICovCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IF9BcmcyTmVzdGVkJiBhcmcyKCkgY29uc3QgeyByZXR1cm4gbV9hcmcyOyB9CisgIC8qKiBccmV0dXJucyB0aGUgdGhpcmQgYXJndW1lbnQgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgX0FyZzNOZXN0ZWQmIGFyZzMoKSBjb25zdCB7IHJldHVybiBtX2FyZzM7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBmdW5jdG9yIHJlcHJlc2VudGluZyB0aGUgdGVybmFyeSBvcGVyYXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgVGVybmFyeU9wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyBwcm90ZWN0ZWQ6CisgIEFyZzFOZXN0ZWQgbV9hcmcxOworICBBcmcyTmVzdGVkIG1fYXJnMjsKKyAgQXJnM05lc3RlZCBtX2FyZzM7CisgIGNvbnN0IFRlcm5hcnlPcCBtX2Z1bmN0b3I7Cit9OworCisvLyBHZW5lcmljIEFQSSBkaXNwYXRjaGVyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVybmFyeU9wLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAorICAgICAgICAgIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VUZXJuYXJ5T3BJbXBsCisgICAgOiBwdWJsaWMgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8CisgICAgICAgICAgQ3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxLCBBcmcyLCBBcmczPiA+Ojp0eXBlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8CisgICAgICBDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzEsIEFyZzIsIEFyZzM+ID46OnR5cGUgQmFzZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBFSUdFTl9DV0lTRV9URVJOQVJZX09QX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVW5hcnlPcC5oIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VVbmFyeU9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyZGQxOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVW5hcnlPcC5oCkBAIC0wLDAgKzEsMTAzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NXSVNFX1VOQVJZX09QX0gKKyNkZWZpbmUgRUlHRU5fQ1dJU0VfVU5BUllfT1BfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+CisgOiB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgICBVbmFyeU9wKGNvbnN0IHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciYpCisgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIFhwclR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxYcHJUeXBlTmVzdGVkPjo6dHlwZSBfWHByVHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBfWHByVHlwZU5lc3RlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdCAKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGUsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VVbmFyeU9wSW1wbDsKKworLyoqIFxjbGFzcyBDd2lzZVVuYXJ5T3AKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyaWMgZXhwcmVzc2lvbiB3aGVyZSBhIGNvZWZmaWNpZW50LXdpc2UgdW5hcnkgb3BlcmF0b3IgaXMgYXBwbGllZCB0byBhbiBleHByZXNzaW9uCisgICoKKyAgKiBcdHBhcmFtIFVuYXJ5T3AgdGVtcGxhdGUgZnVuY3RvciBpbXBsZW1lbnRpbmcgdGhlIG9wZXJhdG9yCisgICogXHRwYXJhbSBYcHJUeXBlIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIHRvIHdoaWNoIHdlIGFyZSBhcHBseWluZyB0aGUgdW5hcnkgb3BlcmF0b3IKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHdoZXJlIGEgdW5hcnkgb3BlcmF0b3IgaXMgYXBwbGllZCB0byBhbiBleHByZXNzaW9uLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBhbGwgb3BlcmF0aW9ucyB0YWtpbmcgZXhhY3RseSAxIGlucHV0IGV4cHJlc3Npb24sIHJlZ2FyZGxlc3Mgb2YgdGhlCisgICogcHJlc2VuY2Ugb2Ygb3RoZXIgaW5wdXRzIHN1Y2ggYXMgc2NhbGFycy4gRm9yIGV4YW1wbGUsIHRoZSBvcGVyYXRvciogaW4gdGhlIGV4cHJlc3Npb24gMyptYXRyaXgKKyAgKiBpcyBjb25zaWRlcmVkIHVuYXJ5LCBiZWNhdXNlIG9ubHkgdGhlIHJpZ2h0LWhhbmQgc2lkZSBpcyBhbiBleHByZXNzaW9uLCBhbmQgaXRzCisgICogcmV0dXJuIHR5cGUgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBDd2lzZVVuYXJ5T3AuCisgICoKKyAgKiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0aGF0IGl0IGlzIHVzZWQsIHNvIHlvdSB0eXBpY2FsbHkgZG9uJ3QgaGF2ZSB0byBuYW1lCisgICogQ3dpc2VVbmFyeU9wIHR5cGVzIGV4cGxpY2l0bHkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6dW5hcnlFeHByKGNvbnN0IEN1c3RvbVVuYXJ5T3AgJikgY29uc3QsIGNsYXNzIEN3aXNlQmluYXJ5T3AsIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeU9wIDogcHVibGljIEN3aXNlVW5hcnlPcEltcGw8VW5hcnlPcCwgWHByVHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U3RvcmFnZUtpbmQ+LCBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlVW5hcnlPcEltcGw8VW5hcnlPcCwgWHByVHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpTdG9yYWdlS2luZD46OkJhc2UgQmFzZTsKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoQ3dpc2VVbmFyeU9wKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxYcHJUeXBlPjo6dHlwZSBYcHJUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8WHByVHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBleHBsaWNpdCBDd2lzZVVuYXJ5T3AoY29uc3QgWHByVHlwZSYgeHByLCBjb25zdCBVbmFyeU9wJiBmdW5jID0gVW5hcnlPcCgpKQorICAgICAgOiBtX3hwcih4cHIpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV94cHIucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3hwci5jb2xzKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZnVuY3RvciByZXByZXNlbnRpbmcgdGhlIHVuYXJ5IG9wZXJhdGlvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBVbmFyeU9wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxYcHJUeXBlTmVzdGVkPjo6dHlwZSYKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgWHByVHlwZU5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBVbmFyeU9wIG1fZnVuY3RvcjsKK307CisKKy8vIEdlbmVyaWMgQVBJIGRpc3BhdGNoZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGUsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VVbmFyeU9wSW1wbAorICA6IHB1YmxpYyBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgWHByVHlwZT4gPjo6dHlwZQoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpnZW5lcmljX3hwcl9iYXNlPEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+Ojp0eXBlIEJhc2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NXSVNFX1VOQVJZX09QX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVW5hcnlWaWV3LmggYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5Vmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTAzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5Vmlldy5oCkBAIC0wLDAgKzEsMTI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DV0lTRV9VTkFSWV9WSUVXX0gKKyNkZWZpbmUgRUlHRU5fQ1dJU0VfVU5BUllfVklFV19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWaWV3T3AsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlVW5hcnlWaWV3PFZpZXdPcCwgTWF0cml4VHlwZT4gPgorIDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgICAgVmlld09wKGNvbnN0IHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyJikKKyAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICBlbnVtIHsKKyAgICBGbGFnc0x2YWx1ZUJpdCA9IGlzX2x2YWx1ZTxNYXRyaXhUeXBlPjo6dmFsdWUgPyBMdmFsdWVCaXQgOiAwLAorICAgIEZsYWdzID0gdHJhaXRzPF9NYXRyaXhUeXBlTmVzdGVkPjo6RmxhZ3MgJiAoUm93TWFqb3JCaXQgfCBGbGFnc0x2YWx1ZUJpdCB8IERpcmVjdEFjY2Vzc0JpdCksIC8vIEZJWE1FIERpcmVjdEFjY2Vzc0JpdCBzaG91bGQgbm90IGJlIGhhbmRsZWQgYnkgZXhwcmVzc2lvbnMKKyAgICBNYXRyaXhUeXBlSW5uZXJTdHJpZGUgPSAgaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxNYXRyaXhUeXBlPjo6cmV0LAorICAgIC8vIG5lZWQgdG8gY2FzdCB0aGUgc2l6ZW9mJ3MgZnJvbSBzaXplX3QgdG8gaW50IGV4cGxpY2l0bHksIG90aGVyd2lzZToKKyAgICAvLyAiZXJyb3I6IG5vIGludGVncmFsIHR5cGUgY2FuIHJlcHJlc2VudCBhbGwgb2YgdGhlIGVudW1lcmF0b3IgdmFsdWVzCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZUlubmVyU3RyaWRlID09IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoRHluYW1pYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoTWF0cml4VHlwZUlubmVyU3RyaWRlKSAqIGludChzaXplb2YodHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIpIC8gc2l6ZW9mKFNjYWxhcikpLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8TWF0cml4VHlwZT46OnJldCA9PSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW50KER5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3V0ZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxNYXRyaXhUeXBlPjo6cmV0ICogaW50KHNpemVvZih0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcikgLyBzaXplb2YoU2NhbGFyKSkKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgdHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBDd2lzZVVuYXJ5Vmlld0ltcGw7CisKKy8qKiBcY2xhc3MgQ3dpc2VVbmFyeVZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyaWMgbHZhbHVlIGV4cHJlc3Npb24gb2YgYSBjb2VmZmljaWVudC13aXNlIHVuYXJ5IG9wZXJhdG9yIG9mIGEgbWF0cml4IG9yIGEgdmVjdG9yCisgICoKKyAgKiBcdHBhcmFtIFZpZXdPcCB0ZW1wbGF0ZSBmdW5jdG9yIGltcGxlbWVudGluZyB0aGUgdmlldworICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IHdlIGFyZSBhcHBseWluZyB0aGUgdW5hcnkgb3BlcmF0b3IKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGx2YWx1ZSBleHByZXNzaW9uIG9mIGEgZ2VuZXJpYyB1bmFyeSB2aWV3IG9wZXJhdG9yIG9mIGEgbWF0cml4IG9yIGEgdmVjdG9yLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiByZWFsKCkgYW5kIGltYWcoKSwgYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjp1bmFyeVZpZXdFeHByKGNvbnN0IEN1c3RvbVVuYXJ5T3AgJikgY29uc3QsIGNsYXNzIEN3aXNlVW5hcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVmlld09wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeVZpZXcgOiBwdWJsaWMgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCwgTWF0cml4VHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQ+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCwgTWF0cml4VHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZD46OkJhc2UgQmFzZTsKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoQ3dpc2VVbmFyeVZpZXcpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojpub25fY29uc3RfdHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKworICAgIGV4cGxpY2l0IGlubGluZSBDd2lzZVVuYXJ5VmlldyhNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFZpZXdPcCYgZnVuYyA9IFZpZXdPcCgpKQorICAgICAgOiBtX21hdHJpeChtYXQpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoQ3dpc2VVbmFyeVZpZXcpCisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZnVuY3RvciByZXByZXNlbnRpbmcgdW5hcnkgb3BlcmF0aW9uICovCisgICAgY29uc3QgVmlld09wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUmCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUmCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIE1hdHJpeFR5cGVOZXN0ZWQgbV9tYXRyaXg7CisgICAgVmlld09wIG1fZnVuY3RvcjsKK307CisKKy8vIEdlbmVyaWMgQVBJIGRpc3BhdGNoZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgdHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBDd2lzZVVuYXJ5Vmlld0ltcGwKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLCBYcHJUeXBlPiA+Ojp0eXBlCit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLCBYcHJUeXBlPiA+Ojp0eXBlIEJhc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWaWV3T3AsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBDd2lzZVVuYXJ5Vmlld0ltcGw8Vmlld09wLE1hdHJpeFR5cGUsRGVuc2U+CisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgQ3dpc2VVbmFyeVZpZXc8Vmlld09wLCBNYXRyaXhUeXBlPiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgQ3dpc2VVbmFyeVZpZXc8Vmlld09wLCBNYXRyaXhUeXBlPiBEZXJpdmVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBDd2lzZVVuYXJ5VmlldzxWaWV3T3AsIE1hdHJpeFR5cGU+ID46OnR5cGUgQmFzZTsKKworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKEN3aXNlVW5hcnlWaWV3SW1wbCkKKyAgICAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyKiBkYXRhKCkgeyByZXR1cm4gJih0aGlzLT5jb2VmZlJlZigwKSk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gJih0aGlzLT5jb2VmZigwKSk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5uZXJTdHJpZGUoKSAqIHNpemVvZih0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIpIC8gc2l6ZW9mKFNjYWxhcik7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5vdXRlclN0cmlkZSgpICogc2l6ZW9mKHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcikgLyBzaXplb2YoU2NhbGFyKTsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NXSVNFX1VOQVJZX1ZJRVdfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGVuc2VCYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9EZW5zZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDA2NmFlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VCYXNlLmgKQEAgLTAsMCArMSw2MTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fREVOU0VCQVNFX0gKKyNkZWZpbmUgRUlHRU5fREVOU0VCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCisvLyBUaGUgaW5kZXggdHlwZSBkZWZpbmVkIGJ5IEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBtdXN0IGJlIGEgc2lnbmVkIHR5cGUuCisvLyBUaGlzIGR1bW15IGZ1bmN0aW9uIHNpbXBseSBhaW1zIGF0IGNoZWNraW5nIHRoYXQgYXQgY29tcGlsZSB0aW1lLgorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX0RlbnNlSW5kZXhfaXNfc2lnbmVkKCkgeworICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bVRyYWl0czxEZW5zZUluZGV4Pjo6SXNTaWduZWQsVEhFX0lOREVYX1RZUEVfTVVTVF9CRV9BX1NJR05FRF9UWVBFKTsgCit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorICAKKy8qKiBcY2xhc3MgRGVuc2VCYXNlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgbWF0cmljZXMsIHZlY3RvcnMsIGFuZCBhcnJheXMKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgdGhhdCBpcyBpbmhlcml0ZWQgYnkgYWxsIGRlbnNlIG9iamVjdHMgKG1hdHJpeCwgdmVjdG9yLCBhcnJheXMsCisgICogYW5kIHJlbGF0ZWQgZXhwcmVzc2lvbiB0eXBlcykuIFRoZSBjb21tb24gRWlnZW4gQVBJIGZvciBkZW5zZSBvYmplY3RzIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4sIGEgbWF0cml4IHR5cGUgb3IgYW4gZXhwcmVzc2lvbi4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fREVOU0VCQVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBcYmxhbmsgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBEZW5zZUJhc2UKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgOiBwdWJsaWMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQ+CisjZWxzZQorICA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxEaXJlY3RXcml0ZUFjY2Vzc29ycz4KKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK3sKKyAgcHVibGljOgorCisgICAgLyoqIElubmVyIGl0ZXJhdG9yIHR5cGUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBjb2VmZmljaWVudHMgb2YgYSByb3cgb3IgY29sdW1uLgorICAgICAgKiBcc2EgY2xhc3MgSW5uZXJJdGVyYXRvcgorICAgICAgKi8KKyAgICB0eXBlZGVmIEVpZ2VuOjpJbm5lckl0ZXJhdG9yPERlcml2ZWQ+IElubmVySXRlcmF0b3I7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworCisgICAgLyoqCisgICAgICAqIFxicmllZiBUaGUgdHlwZSB1c2VkIHRvIHN0b3JlIGluZGljZXMKKyAgICAgICogXGRldGFpbHMgVGhpcyB0eXBlZGVmIGlzIHJlbGV2YW50IGZvciB0eXBlcyB0aGF0IHN0b3JlIG11bHRpcGxlIGluZGljZXMgc3VjaCBhcworICAgICAgKiAgICAgICAgICBQZXJtdXRhdGlvbk1hdHJpeCBvciBUcmFuc3Bvc2l0aW9ucywgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIHRvIEVpZ2VuOjpJbmRleAorICAgICAgKiBcc2EgXGJsYW5rIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzLCBFaWdlbjo6SW5kZXgsIFNwYXJzZU1hdHJpeEJhc2UuCisgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworCisgICAgLyoqIFRoZSBudW1lcmljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24nIGNvZWZmaWNpZW50cywgZS5nLiBmbG9hdCwgZG91YmxlLCBpbnQgb3Igc3RkOjpjb21wbGV4PGZsb2F0PiwgZXRjLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICAKKyAgICAvKiogVGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbicgY29lZmZpY2llbnRzLCBlLmcuIGZsb2F0LCBkb3VibGUsIGludCBvciBzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBldGMuCisgICAgICAqCisgICAgICAqIEl0IGlzIGFuIGFsaWFzIGZvciB0aGUgU2NhbGFyIHR5cGUgKi8KKyAgICB0eXBlZGVmIFNjYWxhciB2YWx1ZV90eXBlOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkPiBCYXNlOworCisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpjb25zdF9jYXN0X2Rlcml2ZWQ7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6cm93SW5kZXhCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6Y29sSW5kZXhCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IoKTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcltdOworICAgIHVzaW5nIEJhc2U6Ong7CisgICAgdXNpbmcgQmFzZTo6eTsKKyAgICB1c2luZyBCYXNlOjp6OworICAgIHVzaW5nIEJhc2U6Onc7CisgICAgdXNpbmcgQmFzZTo6c3RyaWRlOworICAgIHVzaW5nIEJhc2U6OmlubmVyU3RyaWRlOworICAgIHVzaW5nIEJhc2U6Om91dGVyU3RyaWRlOworICAgIHVzaW5nIEJhc2U6OnJvd1N0cmlkZTsKKyAgICB1c2luZyBCYXNlOjpjb2xTdHJpZGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgICAgZW51bSB7CisKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByb3dzIGF0IGNvbXBpbGUtdGltZS4gVGhpcyBpcyBqdXN0IGEgY29weSBvZiB0aGUgdmFsdWUgcHJvdmlkZWQKKyAgICAgICAgICAqIGJ5IHRoZSBcYSBEZXJpdmVkIHR5cGUuIElmIGEgdmFsdWUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwKKyAgICAgICAgICAqIGl0IGlzIHNldCB0byB0aGUgXGEgRHluYW1pYyBjb25zdGFudC4KKyAgICAgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpyb3dzKCksIE1hdHJpeEJhc2U6OmNvbHMoKSwgQ29sc0F0Q29tcGlsZVRpbWUsIFNpemVBdENvbXBpbGVUaW1lICovCisKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBjb2x1bW5zIGF0IGNvbXBpbGUtdGltZS4gVGhpcyBpcyBqdXN0IGEgY29weSBvZiB0aGUgdmFsdWUgcHJvdmlkZWQKKyAgICAgICAgICAqIGJ5IHRoZSBcYSBEZXJpdmVkIHR5cGUuIElmIGEgdmFsdWUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwKKyAgICAgICAgICAqIGl0IGlzIHNldCB0byB0aGUgXGEgRHluYW1pYyBjb25zdGFudC4KKyAgICAgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpyb3dzKCksIE1hdHJpeEJhc2U6OmNvbHMoKSwgUm93c0F0Q29tcGlsZVRpbWUsIFNpemVBdENvbXBpbGVUaW1lICovCisKKworICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSAoaW50ZXJuYWw6OnNpemVfYXRfY29tcGlsZV90aW1lPGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQpLAorICAgICAgICAvKio8IFRoaXMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMsIGkuZS4gdGhlIG51bWJlciBvZgorICAgICAgICAgICogcm93cyB0aW1lcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMsIG9yIHRvIFxhIER5bmFtaWMgaWYgdGhpcyBpcyBub3QKKyAgICAgICAgICAqIGtub3duIGF0IGNvbXBpbGUtdGltZS4gXHNhIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSAqLworCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAvKio8IFRoaXMgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG1heGltdW0gcG9zc2libGUgbnVtYmVyIG9mIHJvd3MgdGhhdCB0aGlzIGV4cHJlc3Npb24KKyAgICAgICAgICAqIG1pZ2h0IGhhdmUuIElmIHRoaXMgZXhwcmVzc2lvbiBtaWdodCBoYXZlIGFuIGFyYml0cmFyaWx5IGhpZ2ggbnVtYmVyIG9mIHJvd3MsCisgICAgICAgICAgKiB0aGlzIHZhbHVlIGlzIHNldCB0byBcYSBEeW5hbWljLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHRvIGtub3cgd2hlbiBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24sIGluIG9yZGVyIHRvIGRldGVybWluZQorICAgICAgICAgICogd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCBkb2luZyBhIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICAgICAgKgorICAgICAgICAgICogXHNhIFJvd3NBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZSwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUKKyAgICAgICAgICAqLworCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAvKio8IFRoaXMgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG1heGltdW0gcG9zc2libGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhhdCB0aGlzIGV4cHJlc3Npb24KKyAgICAgICAgICAqIG1pZ2h0IGhhdmUuIElmIHRoaXMgZXhwcmVzc2lvbiBtaWdodCBoYXZlIGFuIGFyYml0cmFyaWx5IGhpZ2ggbnVtYmVyIG9mIGNvbHVtbnMsCisgICAgICAgICAgKiB0aGlzIHZhbHVlIGlzIHNldCB0byBcYSBEeW5hbWljLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHRvIGtub3cgd2hlbiBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24sIGluIG9yZGVyIHRvIGRldGVybWluZQorICAgICAgICAgICogd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCBkb2luZyBhIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICAgICAgKgorICAgICAgICAgICogXHNhIENvbHNBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUKKyAgICAgICAgICAqLworCisgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhDb2xzQXRDb21waWxlVGltZT46OnJldCksCisgICAgICAgIC8qKjwgVGhpcyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIHRoYXQgdGhpcyBleHByZXNzaW9uCisgICAgICAgICAgKiBtaWdodCBoYXZlLiBJZiB0aGlzIGV4cHJlc3Npb24gbWlnaHQgaGF2ZSBhbiBhcmJpdHJhcmlseSBoaWdoIG51bWJlciBvZiBjb2VmZmljaWVudHMsCisgICAgICAgICAgKiB0aGlzIHZhbHVlIGlzIHNldCB0byBcYSBEeW5hbWljLgorICAgICAgICAgICoKKyAgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHRvIGtub3cgd2hlbiBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24sIGluIG9yZGVyIHRvIGRldGVybWluZQorICAgICAgICAgICogd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCBkb2luZyBhIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICAgICAgKgorICAgICAgICAgICogXHNhIFNpemVBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICAqLworCisgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhDb2xzQXRDb21waWxlVGltZSA9PSAxLAorICAgICAgICAvKio8IFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgZWl0aGVyIHRoZSBudW1iZXIgb2Ygcm93cyBvciB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiBjb2x1bW5zIGlzIGtub3duIGF0IGNvbXBpbGUtdGltZSB0byBiZSBlcXVhbCB0byAxLiBJbmRlZWQsIGluIHRoYXQgY2FzZSwKKyAgICAgICAgICAqIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBjb2x1bW4tdmVjdG9yIChpZiB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4pIG9yIHdpdGgKKyAgICAgICAgICAqIGEgcm93LXZlY3RvciAoaWYgdGhlcmUgaXMgb25seSBvbmUgcm93KS4gKi8KKworICAgICAgRmxhZ3MgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncywKKyAgICAgICAgLyoqPCBUaGlzIHN0b3JlcyBleHByZXNzaW9uIFxyZWYgZmxhZ3MgZmxhZ3Mgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgaW5oZXJpdGVkIGJ5IG5ldyBleHByZXNzaW9ucworICAgICAgICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGlzIG9uZS4gU2VlIHRoZSBccmVmIGZsYWdzICJsaXN0IG9mIGZsYWdzIi4KKyAgICAgICAgICAqLworCisgICAgICBJc1Jvd01ham9yID0gaW50KEZsYWdzKSAmIFJvd01ham9yQml0LCAvKio8IFRydWUgaWYgdGhpcyBleHByZXNzaW9uIGhhcyByb3ctbWFqb3Igc3RvcmFnZSBvcmRlci4gKi8KKworICAgICAgSW5uZXJTaXplQXRDb21waWxlVGltZSA9IGludChJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KFNpemVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChJc1Jvd01ham9yKSA/IGludChDb2xzQXRDb21waWxlVGltZSkgOiBpbnQoUm93c0F0Q29tcGlsZVRpbWUpLAorCisgICAgICBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6aW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxEZXJpdmVkPjo6cmV0LAorICAgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6Om91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8RGVyaXZlZD46OnJldAorICAgIH07CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZmluZF9iZXN0X3BhY2tldDxTY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWU+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKworICAgIGVudW0geyBJc1BsYWluT2JqZWN0QmFzZSA9IDAgfTsKKyAgICAKKyAgICAvKiogVGhlIHBsYWluIG1hdHJpeCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHByZXNzaW9uLgorICAgICAgKiBcc2EgUGxhaW5PYmplY3QgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgQXV0b0FsaWduIHwgKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciksCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICA+IFBsYWluTWF0cml4OworICAgIAorICAgIC8qKiBUaGUgcGxhaW4gYXJyYXkgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXhwcmVzc2lvbi4KKyAgICAgICogXHNhIFBsYWluT2JqZWN0ICovCisgICAgdHlwZWRlZiBBcnJheTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgQXV0b0FsaWduIHwgKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciksCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICA+IFBsYWluQXJyYXk7CisKKyAgICAvKiogXGJyaWVmIFRoZSBwbGFpbiBtYXRyaXggb3IgYXJyYXkgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXhwcmVzc2lvbi4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgZXhhY3RseSB0aGUgcmV0dXJuIHR5cGUgb2YgZXZhbCgpLiBJbiB0aGUgY2FzZSBvZiBwbGFpbiBtYXRyaWNlcywKKyAgICAgICogdGhlIHJldHVybiB0eXBlIG9mIGV2YWwoKSBpcyBhIGNvbnN0IHJlZmVyZW5jZSB0byBhIG1hdHJpeCwgbm90IGEgbWF0cml4ISBJdCBpcyBob3dldmVyIGd1YXJhbnRlZWQKKyAgICAgICogdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgZXZhbCgpIGlzIGVpdGhlciBQbGFpbk9iamVjdCBvciBjb25zdCBQbGFpbk9iamVjdCYuCisgICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlhwcktpbmQsTWF0cml4WHByID46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhaW5NYXRyaXgsIFBsYWluQXJyYXk+Ojp0eXBlIFBsYWluT2JqZWN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgd2hpY2ggaXMgaW4gcHJhY3RpY2UgdGhlIG51bWJlcgorICAgICAgKiBvZiBzdG9yZWQgY29lZmZpY2llbnRzLiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG91dGVyIHNpemUuCisgICAgICAqCisgICAgICAqIFxub3RlIEZvciBhIHZlY3RvciwgdGhpcyByZXR1cm5zIGp1c3QgMS4gRm9yIGEgbWF0cml4IChub24tdmVjdG9yKSwgdGhpcyBpcyB0aGUgbWFqb3IgZGltZW5zaW9uCisgICAgICAqIHdpdGggcmVzcGVjdCB0byB0aGUgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgInN0b3JhZ2Ugb3JkZXIiLCBpLmUuLCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGEKKyAgICAgICogY29sdW1uLW1ham9yIG1hdHJpeCwgYW5kIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgYSByb3ctbWFqb3IgbWF0cml4LiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gMQorICAgICAgICAgICA6IGludChJc1Jvd01ham9yKSA/IHRoaXMtPnJvd3MoKSA6IHRoaXMtPmNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGlubmVyIHNpemUuCisgICAgICAqCisgICAgICAqIFxub3RlIEZvciBhIHZlY3RvciwgdGhpcyBpcyBqdXN0IHRoZSBzaXplLiBGb3IgYSBtYXRyaXggKG5vbi12ZWN0b3IpLCB0aGlzIGlzIHRoZSBtaW5vciBkaW1lbnNpb24KKyAgICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAic3RvcmFnZSBvcmRlciIsIGkuZS4sIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgYSAKKyAgICAgICogY29sdW1uLW1ham9yIG1hdHJpeCwgYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYSByb3ctbWFqb3IgbWF0cml4LiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgSW5kZXggaW5uZXJTaXplKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gdGhpcy0+c2l6ZSgpCisgICAgICAgICAgIDogaW50KElzUm93TWFqb3IpID8gdGhpcy0+Y29scygpIDogdGhpcy0+cm93cygpOworICAgIH0KKworICAgIC8qKiBPbmx5IHBsYWluIG1hdHJpY2VzL2FycmF5cywgbm90IGV4cHJlc3Npb25zLCBtYXkgYmUgcmVzaXplZDsgdGhlcmVmb3JlIHRoZSBvbmx5IHVzZWZ1bCByZXNpemUgbWV0aG9kcyBhcmUKKyAgICAgICogTWF0cml4OjpyZXNpemUoKSBhbmQgQXJyYXk6OnJlc2l6ZSgpLiBUaGUgcHJlc2VudCBtZXRob2Qgb25seSBhc3NlcnRzIHRoYXQgdGhlIG5ldyBzaXplIGVxdWFscyB0aGUgb2xkIHNpemUsIGFuZCBkb2VzCisgICAgICAqIG5vdGhpbmcgZWxzZS4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHJlc2l6ZShJbmRleCBuZXdTaXplKQorICAgIHsKKyAgICAgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcobmV3U2l6ZSk7CisgICAgICBlaWdlbl9hc3NlcnQobmV3U2l6ZSA9PSB0aGlzLT5zaXplKCkKKyAgICAgICAgICAgICAgICAmJiAiRGVuc2VCYXNlOjpyZXNpemUoKSBkb2VzIG5vdCBhY3R1YWxseSBhbGxvdyB0byByZXNpemUuIik7CisgICAgfQorICAgIC8qKiBPbmx5IHBsYWluIG1hdHJpY2VzL2FycmF5cywgbm90IGV4cHJlc3Npb25zLCBtYXkgYmUgcmVzaXplZDsgdGhlcmVmb3JlIHRoZSBvbmx5IHVzZWZ1bCByZXNpemUgbWV0aG9kcyBhcmUKKyAgICAgICogTWF0cml4OjpyZXNpemUoKSBhbmQgQXJyYXk6OnJlc2l6ZSgpLiBUaGUgcHJlc2VudCBtZXRob2Qgb25seSBhc3NlcnRzIHRoYXQgdGhlIG5ldyBzaXplIGVxdWFscyB0aGUgb2xkIHNpemUsIGFuZCBkb2VzCisgICAgICAqIG5vdGhpbmcgZWxzZS4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcocm93cyk7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbHMpOworICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MgPT0gdGhpcy0+cm93cygpICYmIGNvbHMgPT0gdGhpcy0+Y29scygpCisgICAgICAgICAgICAgICAgJiYgIkRlbnNlQmFzZTo6cmVzaXplKCkgZG9lcyBub3QgYWN0dWFsbHkgYWxsb3cgdG8gcmVzaXplLiIpOworICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBcaW50ZXJuYWwgUmVwcmVzZW50cyBhIG1hdHJpeCB3aXRoIGFsbCBjb2VmZmljaWVudHMgZXF1YWwgdG8gb25lIGFub3RoZXIqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluT2JqZWN0PiBDb25zdGFudFJldHVyblR5cGU7CisgICAgLyoqIFxpbnRlcm5hbCBcZGVwcmVjYXRlZCBSZXByZXNlbnRzIGEgdmVjdG9yIHdpdGggbGluZWFybHkgc3BhY2VkIGNvZWZmaWNpZW50cyB0aGF0IGFsbG93cyBzZXF1ZW50aWFsIGFjY2VzcyBvbmx5LiAqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxTY2FsYXIsUGFja2V0U2NhbGFyPixQbGFpbk9iamVjdD4gU2VxdWVudGlhbExpblNwYWNlZFJldHVyblR5cGU7CisgICAgLyoqIFxpbnRlcm5hbCBSZXByZXNlbnRzIGEgdmVjdG9yIHdpdGggbGluZWFybHkgc3BhY2VkIGNvZWZmaWNpZW50cyB0aGF0IGFsbG93cyByYW5kb20gYWNjZXNzLiAqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxTY2FsYXIsUGFja2V0U2NhbGFyPixQbGFpbk9iamVjdD4gUmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpICovCisgICAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlc1JldHVyblR5cGU7CisKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICAgIC8qKiBDb3BpZXMgXGEgb3RoZXIgaW50byAqdGhpcy4gXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIC8qKiBTcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlIG9wZXJhdG9yPSwgaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgY29tcGlsZXIKKyAgICAgICogZnJvbSBnZW5lcmF0aW5nIGEgZGVmYXVsdCBvcGVyYXRvcj0gKGlzc3VlIGhpdCB3aXRoIGcrKyA0LjEpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlJiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIGZ1bmMpOworCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBDb3BpZXMgXGEgb3RoZXIgaW50byAqdGhpcyB3aXRob3V0IGV2YWx1YXRpbmcgb3RoZXIuIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvICp0aGlzLgorICAgICAgKiBcZGVwcmVjYXRlZCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIGxhenlBc3NpZ24oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQ29tbWFJbml0aWFsaXplcjxEZXJpdmVkPiBvcGVyYXRvcjw8IChjb25zdCBTY2FsYXImIHMpOworCisgICAgLyoqIFxkZXByZWNhdGVkIGl0IG5vdyByZXR1cm5zIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IEFkZGVkLHVuc2lnbmVkIGludCBSZW1vdmVkPgorICAgIEVJR0VOX0RFUFJFQ0FURUQKKyAgICBjb25zdCBEZXJpdmVkJiBmbGFnZ2VkKCkgY29uc3QKKyAgICB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIENvbW1hSW5pdGlhbGl6ZXI8RGVyaXZlZD4gb3BlcmF0b3I8PCAoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHR5cGVkZWYgVHJhbnNwb3NlPERlcml2ZWQ+IFRyYW5zcG9zZVJldHVyblR5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBUcmFuc3Bvc2VSZXR1cm5UeXBlIHRyYW5zcG9zZSgpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdDxUcmFuc3Bvc2U8Y29uc3QgRGVyaXZlZD4gPjo6dHlwZSBDb25zdFRyYW5zcG9zZVJldHVyblR5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkgY29uc3Q7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHRyYW5zcG9zZUluUGxhY2UoKTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUKKyAgICBDb25zdGFudChJbmRleCByb3dzLCBJbmRleCBjb2xzLCBjb25zdCBTY2FsYXImIHZhbHVlKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlCisgICAgQ29uc3RhbnQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiB2YWx1ZSk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZQorICAgIENvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsdWUpOworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IFNlcXVlbnRpYWxMaW5TcGFjZWRSZXR1cm5UeXBlCisgICAgTGluU3BhY2VkKFNlcXVlbnRpYWxfdCwgSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IFJhbmRvbUFjY2Vzc0xpblNwYWNlZFJldHVyblR5cGUKKyAgICBMaW5TcGFjZWQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IFNlcXVlbnRpYWxMaW5TcGFjZWRSZXR1cm5UeXBlCisgICAgTGluU3BhY2VkKFNlcXVlbnRpYWxfdCwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IFJhbmRvbUFjY2Vzc0xpblNwYWNlZFJldHVyblR5cGUKKyAgICBMaW5TcGFjZWQoY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgc3RhdGljIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+CisgICAgTnVsbGFyeUV4cHIoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgc3RhdGljIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+CisgICAgTnVsbGFyeUV4cHIoSW5kZXggc2l6ZSwgY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgc3RhdGljIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgUGxhaW5PYmplY3Q+CisgICAgTnVsbGFyeUV4cHIoY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUgWmVybyhJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlIFplcm8oSW5kZXggc2l6ZSk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZSBaZXJvKCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZSBPbmVzKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUgT25lcyhJbmRleCBzaXplKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlIE9uZXMoKTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgZmlsbChjb25zdCBTY2FsYXImIHZhbHVlKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRDb25zdGFudChjb25zdCBTY2FsYXImIHZhbHVlKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRMaW5TcGFjZWQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVyaXZlZCYgc2V0TGluU3BhY2VkKGNvbnN0IFNjYWxhciYgbG93LCBjb25zdCBTY2FsYXImIGhpZ2gpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIERlcml2ZWQmIHNldFplcm8oKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRPbmVzKCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVyaXZlZCYgc2V0UmFuZG9tKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgYm9vbCBpc0FwcHJveChjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsCisgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFJlYWxTY2FsYXImIG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGJvb2wgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGlzQXBwcm94VG9Db25zdGFudChjb25zdCBTY2FsYXImIHZhbHVlLCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGlzQ29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWx1ZSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc1plcm8oY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc09uZXMoY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgCisgICAgaW5saW5lIGJvb2wgaGFzTmFOKCkgY29uc3Q7CisgICAgaW5saW5lIGJvb2wgYWxsRmluaXRlKCkgY29uc3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3IvPShjb25zdCBTY2FsYXImIG90aGVyKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlPjo6dHlwZSBFdmFsUmV0dXJuVHlwZTsKKyAgICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCBvciB2ZWN0b3Igb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGlzIGV4cHJlc3Npb24uCisgICAgICAqCisgICAgICAqIE5vdGljZSB0aGF0IGluIHRoZSBjYXNlIG9mIGEgcGxhaW4gbWF0cml4IG9yIHZlY3RvciAobm90IGFuIGV4cHJlc3Npb24pIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zCisgICAgICAqIGEgY29uc3QgcmVmZXJlbmNlLCBpbiBvcmRlciB0byBhdm9pZCBhIHVzZWxlc3MgY29weS4KKyAgICAgICogCisgICAgICAqIFx3YXJuaW5nIEJlIGNhcmVmdWxsIHdpdGggZXZhbCgpIGFuZCB0aGUgYXV0byBDKysga2V5d29yZCwgYXMgZGV0YWlsZWQgaW4gdGhpcyBcbGluayBUb3BpY1BpdGZhbGxzX2F1dG9fa2V5d29yZCBwYWdlIFxlbmRsaW5rLgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXZhbFJldHVyblR5cGUgZXZhbCgpIGNvbnN0CisgICAgeworICAgICAgLy8gRXZlbiB0aG91Z2ggTVNWQyBkb2VzIG5vdCBob25vciBzdHJvbmcgaW5saW5pbmcgd2hlbiB0aGUgcmV0dXJuIHR5cGUKKyAgICAgIC8vIGlzIGEgZHluYW1pYyBtYXRyaXgsIHdlIGRlc3BlcmF0ZWx5IG5lZWQgc3Ryb25nIGlubGluaW5nIGZvciBmaXhlZAorICAgICAgLy8gc2l6ZSB0eXBlcyBvbiBNU1ZDLgorICAgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlKGRlcml2ZWQoKSk7CisgICAgfQorICAgIAorICAgIC8qKiBzd2FwcyAqdGhpcyB3aXRoIHRoZSBleHByZXNzaW9uIFxhIG90aGVyLgorICAgICAgKgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHN3YXAoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIU90aGVyRGVyaXZlZDo6SXNQbGFpbk9iamVjdEJhc2UsVEhJU19FWFBSRVNTSU9OX0lTX05PVF9BX0xWQUxVRV9fSVRfSVNfUkVBRF9PTkxZKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PW90aGVyLnJvd3MoKSAmJiBjb2xzKCk9PW90aGVyLmNvbHMoKSk7CisgICAgICBjYWxsX2Fzc2lnbm1lbnQoZGVyaXZlZCgpLCBvdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgaW50ZXJuYWw6OnN3YXBfYXNzaWduX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgLyoqIHN3YXBzICp0aGlzIHdpdGggdGhlIG1hdHJpeCBvciBhcnJheSBcYSBvdGhlci4KKyAgICAgICoKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBzd2FwKFBsYWluT2JqZWN0QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1vdGhlci5yb3dzKCkgJiYgY29scygpPT1vdGhlci5jb2xzKCkpOworICAgICAgY2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c3dhcF9hc3NpZ25fb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgTmVzdEJ5VmFsdWU8RGVyaXZlZD4gbmVzdEJ5VmFsdWUoKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+IGZvcmNlQWxpZ25lZEFjY2VzcygpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBGb3JjZUFsaWduZWRBY2Nlc3M8RGVyaXZlZD4gZm9yY2VBbGlnbmVkQWNjZXNzKCk7CisgICAgdGVtcGxhdGU8Ym9vbCBFbmFibGU+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxFbmFibGUsRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+LERlcml2ZWQmPjo6dHlwZSBmb3JjZUFsaWduZWRBY2Nlc3NJZigpIGNvbnN0OworICAgIHRlbXBsYXRlPGJvb2wgRW5hYmxlPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8RW5hYmxlLEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPixEZXJpdmVkJj46OnR5cGUgZm9yY2VBbGlnbmVkQWNjZXNzSWYoKTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciBzdW0oKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIgbWVhbigpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciB0cmFjZSgpIGNvbnN0OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyIHByb2QoKSBjb25zdDsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtaW5Db2VmZigpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtYXhDb2VmZigpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtaW5Db2VmZihJbmRleFR5cGUqIHJvdywgSW5kZXhUeXBlKiBjb2wpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgbWF4Q29lZmYoSW5kZXhUeXBlKiByb3csIEluZGV4VHlwZSogY29sKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIG1pbkNvZWZmKEluZGV4VHlwZSogaW5kZXgpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgbWF4Q29lZmYoSW5kZXhUeXBlKiBpbmRleCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFNjYWxhciByZWR1eChjb25zdCBCaW5hcnlPcCYgZnVuYykgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWaXNpdG9yPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCB2aXNpdChWaXNpdG9yJiBmdW5jKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyBhIFdpdGhGb3JtYXQgcHJveHkgb2JqZWN0IGFsbG93aW5nIHRvIHByaW50IGEgbWF0cml4IHRoZSB3aXRoIGdpdmVuCisgICAgICAqIGZvcm1hdCBcYSBmbXQuCisgICAgICAqCisgICAgICAqIFNlZSBjbGFzcyBJT0Zvcm1hdCBmb3Igc29tZSBleGFtcGxlcy4KKyAgICAgICoKKyAgICAgICogXHNhIGNsYXNzIElPRm9ybWF0LCBjbGFzcyBXaXRoRm9ybWF0CisgICAgICAqLworICAgIGlubGluZSBjb25zdCBXaXRoRm9ybWF0PERlcml2ZWQ+IGZvcm1hdChjb25zdCBJT0Zvcm1hdCYgZm10KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBXaXRoRm9ybWF0PERlcml2ZWQ+KGRlcml2ZWQoKSwgZm10KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHVuaXF1ZSBjb2VmZmljaWVudCBvZiBhIDF4MSBleHByZXNzaW9uICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBDb2VmZlJldHVyblR5cGUgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0laRV8xeDEoRGVyaXZlZCkKKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5yb3dzKCkgPT0gMSAmJiB0aGlzLT5jb2xzKCkgPT0gMSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmNvZWZmKDAsMCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBhbGwoKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGFueSgpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IGNvdW50KCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIFZlY3Rvcndpc2VPcDxEZXJpdmVkLCBIb3Jpem9udGFsPiBSb3d3aXNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IFZlY3Rvcndpc2VPcDxjb25zdCBEZXJpdmVkLCBIb3Jpem9udGFsPiBDb25zdFJvd3dpc2VSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgVmVjdG9yd2lzZU9wPERlcml2ZWQsIFZlcnRpY2FsPiBDb2x3aXNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IFZlY3Rvcndpc2VPcDxjb25zdCBEZXJpdmVkLCBWZXJ0aWNhbD4gQ29uc3RDb2x3aXNlUmV0dXJuVHlwZTsKKworICAgIC8qKiBccmV0dXJucyBhIFZlY3Rvcndpc2VPcCB3cmFwcGVyIG9mICp0aGlzIHByb3ZpZGluZyBhZGRpdGlvbmFsIHBhcnRpYWwgcmVkdWN0aW9uIG9wZXJhdGlvbnMKKyAgICAqCisgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3Jvd3dpc2UuY3BwCisgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3Jvd3dpc2Uub3V0CisgICAgKgorICAgICogXHNhIGNvbHdpc2UoKSwgY2xhc3MgVmVjdG9yd2lzZU9wLCBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nCisgICAgKi8KKyAgICAvL0NvZGUgbW92ZWQgaGVyZSBkdWUgdG8gYSBDVURBIGNvbXBpbGVyIGJ1ZworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDb25zdFJvd3dpc2VSZXR1cm5UeXBlIHJvd3dpc2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gQ29uc3RSb3d3aXNlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBSb3d3aXNlUmV0dXJuVHlwZSByb3d3aXNlKCk7CisKKyAgICAvKiogXHJldHVybnMgYSBWZWN0b3J3aXNlT3Agd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJ0aWFsIHJlZHVjdGlvbiBvcGVyYXRpb25zCisgICAgKgorICAgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jb2x3aXNlLmNwcAorICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jb2x3aXNlLm91dAorICAgICoKKyAgICAqIFxzYSByb3d3aXNlKCksIGNsYXNzIFZlY3Rvcndpc2VPcCwgXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZworICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIENvbnN0Q29sd2lzZVJldHVyblR5cGUgY29sd2lzZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDb25zdENvbHdpc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIENvbHdpc2VSZXR1cm5UeXBlIGNvbHdpc2UoKTsKKworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9yYW5kb21fb3A8U2NhbGFyPixQbGFpbk9iamVjdD4gUmFuZG9tUmV0dXJuVHlwZTsKKyAgICBzdGF0aWMgY29uc3QgUmFuZG9tUmV0dXJuVHlwZSBSYW5kb20oSW5kZXggcm93cywgSW5kZXggY29scyk7CisgICAgc3RhdGljIGNvbnN0IFJhbmRvbVJldHVyblR5cGUgUmFuZG9tKEluZGV4IHNpemUpOworICAgIHN0YXRpYyBjb25zdCBSYW5kb21SZXR1cm5UeXBlIFJhbmRvbSgpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhlbkRlcml2ZWQsdHlwZW5hbWUgRWxzZURlcml2ZWQ+CisgICAgY29uc3QgU2VsZWN0PERlcml2ZWQsVGhlbkRlcml2ZWQsRWxzZURlcml2ZWQ+CisgICAgc2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsCisgICAgICAgICAgIGNvbnN0IERlbnNlQmFzZTxFbHNlRGVyaXZlZD4mIGVsc2VNYXRyaXgpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhlbkRlcml2ZWQ+CisgICAgaW5saW5lIGNvbnN0IFNlbGVjdDxEZXJpdmVkLFRoZW5EZXJpdmVkLCB0eXBlbmFtZSBUaGVuRGVyaXZlZDo6Q29uc3RhbnRSZXR1cm5UeXBlPgorICAgIHNlbGVjdChjb25zdCBEZW5zZUJhc2U8VGhlbkRlcml2ZWQ+JiB0aGVuTWF0cml4LCBjb25zdCB0eXBlbmFtZSBUaGVuRGVyaXZlZDo6U2NhbGFyJiBlbHNlU2NhbGFyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEVsc2VEZXJpdmVkPgorICAgIGlubGluZSBjb25zdCBTZWxlY3Q8RGVyaXZlZCwgdHlwZW5hbWUgRWxzZURlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZSwgRWxzZURlcml2ZWQgPgorICAgIHNlbGVjdChjb25zdCB0eXBlbmFtZSBFbHNlRGVyaXZlZDo6U2NhbGFyJiB0aGVuU2NhbGFyLCBjb25zdCBEZW5zZUJhc2U8RWxzZURlcml2ZWQ+JiBlbHNlTWF0cml4KSBjb25zdDsKKworICAgIHRlbXBsYXRlPGludCBwPiBSZWFsU2NhbGFyIGxwTm9ybSgpIGNvbnN0OworCisgICAgdGVtcGxhdGU8aW50IFJvd0ZhY3RvciwgaW50IENvbEZhY3Rvcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFJlcGxpY2F0ZTxEZXJpdmVkLFJvd0ZhY3RvcixDb2xGYWN0b3I+IHJlcGxpY2F0ZSgpIGNvbnN0OworICAgIC8qKgorICAgICogXHJldHVybiBhbiBleHByZXNzaW9uIG9mIHRoZSByZXBsaWNhdGlvbiBvZiBcYyAqdGhpcworICAgICoKKyAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmVwbGljYXRlX2ludF9pbnQuY3BwCisgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3JlcGxpY2F0ZV9pbnRfaW50Lm91dAorICAgICoKKyAgICAqIFxzYSBWZWN0b3J3aXNlT3A6OnJlcGxpY2F0ZSgpLCBEZW5zZUJhc2U6OnJlcGxpY2F0ZTxpbnQsaW50PigpLCBjbGFzcyBSZXBsaWNhdGUKKyAgICAqLworICAgIC8vQ29kZSBtb3ZlZCBoZXJlIGR1ZSB0byBhIENVREEgY29tcGlsZXIgYnVnCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBSZXBsaWNhdGU8RGVyaXZlZCwgRHluYW1pYywgRHluYW1pYz4gcmVwbGljYXRlKEluZGV4IHJvd0ZhY3RvciwgSW5kZXggY29sRmFjdG9yKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBSZXBsaWNhdGU8RGVyaXZlZCwgRHluYW1pYywgRHluYW1pYz4oZGVyaXZlZCgpLCByb3dGYWN0b3IsIGNvbEZhY3Rvcik7CisgICAgfQorCisgICAgdHlwZWRlZiBSZXZlcnNlPERlcml2ZWQsIEJvdGhEaXJlY3Rpb25zPiBSZXZlcnNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IFJldmVyc2U8Y29uc3QgRGVyaXZlZCwgQm90aERpcmVjdGlvbnM+IENvbnN0UmV2ZXJzZVJldHVyblR5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgUmV2ZXJzZVJldHVyblR5cGUgcmV2ZXJzZSgpOworICAgIC8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJldmVyc2UoKS4gKi8KKyAgICAvL0NvZGUgbW92ZWQgaGVyZSBkdWUgdG8gYSBDVURBIGNvbXBpbGVyIGJ1ZworICAgIEVJR0VOX0RFVklDRV9GVU5DIENvbnN0UmV2ZXJzZVJldHVyblR5cGUgcmV2ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIENvbnN0UmV2ZXJzZVJldHVyblR5cGUoZGVyaXZlZCgpKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXZlcnNlSW5QbGFjZSgpOworCisjZGVmaW5lIEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTIEVpZ2VuOjpEZW5zZUJhc2UKKyNkZWZpbmUgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKyNkZWZpbmUgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihDT05EKQorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQmxvY2tNZXRob2RzLmgiCisjICAgaWZkZWYgRUlHRU5fREVOU0VCQVNFX1BMVUdJTgorIyAgICAgaW5jbHVkZSBFSUdFTl9ERU5TRUJBU0VfUExVR0lOCisjICAgZW5kaWYKKyN1bmRlZiBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUworI3VuZGVmIEVJR0VOX0RPQ19CTE9DS19BRERPTlNfTk9UX0lOTkVSX1BBTkVMCisjdW5kZWYgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRgorCisgICAgLy8gZGlzYWJsZSB0aGUgdXNlIG9mIGV2YWxUbyBmb3IgZGVuc2Ugb2JqZWN0cyB3aXRoIGEgbmljZSBjb21waWxhdGlvbiBlcnJvcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPERlc3Qsdm9pZD46OnZhbHVlKSxUSEVfRVZBTF9FVkFMVE9fRlVOQ1RJT05fU0hPVUxEX05FVkVSX0JFX0NBTExFRF9GT1JfREVOU0VfT0JKRUNUUyk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gRG8gbm90aGluZy4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZUJhc2UoKQorICAgIHsKKyAgICAgIC8qIEp1c3QgY2hlY2tzIGZvciBzZWxmLWNvbnNpc3RlbmN5IG9mIHRoZSBmbGFncy4KKyAgICAgICAqIE9ubHkgZG8gaXQgd2hlbiBkZWJ1Z2dpbmcgRWlnZW4sIGFzIHRoaXMgYm9yZGVycyBvbiBwYXJhbm9pYWMgYW5kIGNvdWxkIHNsb3cgY29tcGlsYXRpb24gZG93bgorICAgICAgICovCisjaWZkZWYgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFSUdFTl9JTVBMSUVTKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT0xLCBpbnQoSXNSb3dNYWpvcikpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBFSUdFTl9JTVBMSUVTKE1heENvbHNBdENvbXBpbGVUaW1lPT0xICYmIE1heFJvd3NBdENvbXBpbGVUaW1lIT0xLCBpbnQoIUlzUm93TWFqb3IpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfU1RPUkFHRV9PUkRFUl9GT1JfVEhJU19WRUNUT1JfRVhQUkVTU0lPTikKKyNlbmRpZgorICAgIH0KKworICBwcml2YXRlOgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IERlbnNlQmFzZShpbnQpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlQmFzZShpbnQsaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IERlbnNlQmFzZShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERU5TRUJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGVuc2VDb2VmZnNCYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9EZW5zZUNvZWZmc0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFmNDhhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VDb2VmZnNCYXNlLmgKQEAgLTAsMCArMSw2ODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RFTlNFQ09FRkZTQkFTRV9ICisjZGVmaW5lIEVJR0VOX0RFTlNFQ09FRkZTQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfaWZfYXJpdGhtZXRpYworeworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX2FyaXRobWV0aWM8VD46OnZhbHVlLCBULCB0eXBlbmFtZSBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxUPjo6dHlwZT46OnR5cGUgdHlwZTsKK307Cit9CisKKy8qKiBcYnJpZWYgQmFzZSBjbGFzcyBwcm92aWRpbmcgcmVhZC1vbmx5IGNvZWZmaWNpZW50IGFjY2VzcyB0byBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogXHRwYXJhbSBEZXJpdmVkIFR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKiBcdHBhcmFtICNSZWFkT25seUFjY2Vzc29ycyBDb25zdGFudCBpbmRpY2F0aW5nIHJlYWQtb25seSBhY2Nlc3MKKyAgKgorICAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgXGMgb3BlcmF0b3IoKSBcYyBjb25zdCBmdW5jdGlvbiBhbmQgZnJpZW5kcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCBzcGVjaWZpYworICAqIGVudHJpZXMgb2YgYSBtYXRyaXggb3IgYXJyYXkuCisgICogCisgICogXHNhIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4sIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBEaXJlY3RBY2Nlc3NvcnM+LAorICAqICAgICBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxSZWFkT25seUFjY2Vzc29ycz4gOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworCisgICAgLy8gRXhwbGFuYXRpb24gZm9yIHRoaXMgQ29lZmZSZXR1cm5UeXBlIHR5cGVkZWYuCisgICAgLy8gLSBUaGlzIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgY29lZmYoKSBtZXRob2QuCisgICAgLy8gLSBUaGUgTHZhbHVlQml0IG1lYW5zIGV4YWN0bHkgdGhhdCB3ZSBjYW4gb2ZmZXIgYSBjb2VmZlJlZigpIG1ldGhvZCwgd2hpY2ggbWVhbnMgZXhhY3RseSB0aGF0IHdlIGNhbiBnZXQgcmVmZXJlbmNlcworICAgIC8vIHRvIGNvZWZmcywgd2hpY2ggbWVhbnMgZXhhY3RseSB0aGF0IHdlIGNhbiBoYXZlIGNvZWZmKCkgcmV0dXJuIGEgY29uc3QgcmVmZXJlbmNlIChhcyBvcHBvc2VkIHRvIHJldHVybmluZyBhIHZhbHVlKS4KKyAgICAvLyAtIFRoZSBpc19hcnRpaG1ldGljIGNoZWNrIGlzIHJlcXVpcmVkIHNpbmNlICJjb25zdCBpbnQiLCAiY29uc3QgZG91YmxlIiwgZXRjLiB3aWxsIGNhdXNlIHdhcm5pbmdzIG9uIHNvbWUgc3lzdGVtcworICAgIC8vIHdoaWxlIHRoZSBkZWNsYXJhdGlvbiBvZiAiY29uc3QgVCIsIHdoZXJlIFQgaXMgYSBub24gYXJpdGhtZXRpYyB0eXBlIGRvZXMgbm90LiBBbHdheXMgcmV0dXJuaW5nICJjb25zdCBTY2FsYXImIiBpcworICAgIC8vIG5vdCBwb3NzaWJsZSwgc2luY2UgdGhlIHVuZGVybHlpbmcgZXhwcmVzc2lvbnMgbWlnaHQgbm90IG9mZmVyIGEgdmFsaWQgYWRkcmVzcyB0aGUgcmVmZXJlbmNlIGNvdWxkIGJlIHJlZmVycmluZyB0by4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxib29sKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJkx2YWx1ZUJpdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8aW50ZXJuYWw6OmlzX2FyaXRobWV0aWM8U2NhbGFyPjo6dmFsdWUsIFNjYWxhciwgY29uc3QgU2NhbGFyPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV9pZl9hcml0aG1ldGljPAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dJbmRleEJ5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludChEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSkgPT0gMSA/IDAKKyAgICAgICAgICA6IGludChEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSkgPT0gMSA/IGlubmVyCisgICAgICAgICAgOiBpbnQoRGVyaXZlZDo6RmxhZ3MpJlJvd01ham9yQml0ID8gb3V0ZXIKKyAgICAgICAgICA6IGlubmVyOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xJbmRleEJ5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludChEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSkgPT0gMSA/IDAKKyAgICAgICAgICA6IGludChEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSkgPT0gMSA/IGlubmVyCisgICAgICAgICAgOiBpbnQoRGVyaXZlZDo6RmxhZ3MpJlJvd01ham9yQml0ID8gaW5uZXIKKyAgICAgICAgICA6IG91dGVyOworICAgIH0KKworICAgIC8qKiBTaG9ydCB2ZXJzaW9uOiBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiwgdXNlCisgICAgICAqIFxsaW5rIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIGNvbnN0IFxlbmRsaW5rIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIExvbmcgdmVyc2lvbjogdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvCisgICAgICAqIFxsaW5rIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIGNvbnN0IFxlbmRsaW5rLCBidXQgd2l0aG91dCB0aGUgYXNzZXJ0aW9uLgorICAgICAgKiBVc2UgdGhpcyBmb3IgbGltaXRpbmcgdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgZGVidWdnaW5nIGNvZGUgd2hlbiBkb2luZworICAgICAgKiByZXBlYXRlZCBjb2VmZmljaWVudCBhY2Nlc3MuIE9ubHkgdXNlIHRoaXMgd2hlbiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICAqIHBhcmFtZXRlcnMgXGEgcm93IGFuZCBcYSBjb2wgYXJlIGluIHJhbmdlLgorICAgICAgKgorICAgICAgKiBJZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcgaXMgZGVmaW5lZCwgYW4gYXNzZXJ0aW9uIHdpbGwgYmUgbWFkZSwgbWFraW5nIHRoaXMKKyAgICAgICogZnVuY3Rpb24gZXF1aXZhbGVudCB0byBcbGluayBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBjb25zdCBcZW5kbGluay4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIGNvbnN0LCBjb2VmZlJlZihJbmRleCxJbmRleCksIGNvZWZmKEluZGV4KSBjb25zdAorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyb3cgPj0gMCAmJiByb3cgPCByb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBjb2xzKCkpOworICAgICAgcmV0dXJuIGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZD4oZGVyaXZlZCgpKS5jb2VmZihyb3csY29sKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmQnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29lZmYocm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSwKKyAgICAgICAgICAgICAgICAgICBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbi4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpLCBvcGVyYXRvcltdKEluZGV4KQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIG9wZXJhdG9yKCkoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICByZXR1cm4gY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIC8qKiBTaG9ydCB2ZXJzaW9uOiBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiwgdXNlCisgICAgICAqIFxsaW5rIG9wZXJhdG9yW10oSW5kZXgpIGNvbnN0IFxlbmRsaW5rIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIExvbmcgdmVyc2lvbjogdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvCisgICAgICAqIFxsaW5rIG9wZXJhdG9yW10oSW5kZXgpIGNvbnN0IFxlbmRsaW5rLCBidXQgd2l0aG91dCB0aGUgYXNzZXJ0aW9uLgorICAgICAgKiBVc2UgdGhpcyBmb3IgbGltaXRpbmcgdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgZGVidWdnaW5nIGNvZGUgd2hlbiBkb2luZworICAgICAgKiByZXBlYXRlZCBjb2VmZmljaWVudCBhY2Nlc3MuIE9ubHkgdXNlIHRoaXMgd2hlbiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICAqIHBhcmFtZXRlciBcYSBpbmRleCBpcyBpbiByYW5nZS4KKyAgICAgICoKKyAgICAgICogSWYgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HIGlzIGRlZmluZWQsIGFuIGFzc2VydGlvbiB3aWxsIGJlIG1hZGUsIG1ha2luZyB0aGlzCisgICAgICAqIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgY29uc3QgXGVuZGxpbmsuCisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvcltdKEluZGV4KSBjb25zdCwgY29lZmZSZWYoSW5kZXgpLCBjb2VmZihJbmRleCxJbmRleCkgY29uc3QKKyAgICAgICovCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlCisgICAgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+OjpGbGFncyAmIExpbmVhckFjY2Vzc0JpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19DT0VGRklDSUVOVF9BQ0NFU1NPUl9UQUtJTkdfT05FX0FDQ0VTU19JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19BTExPV0lOR19MSU5FQVJfQUNDRVNTKQorICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZD4oZGVyaXZlZCgpKS5jb2VmZihpbmRleCk7CisgICAgfQorCisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGluZGV4LgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbGxvd2VkIG9ubHkgZm9yIHZlY3RvciBleHByZXNzaW9ucywgYW5kIGZvciBtYXRyaXggZXhwcmVzc2lvbnMgaGF2aW5nIHRoZSBMaW5lYXJBY2Nlc3NCaXQuCisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvcltdKEluZGV4KSwgb3BlcmF0b3IoKShJbmRleCxJbmRleCkgY29uc3QsIHgoKSBjb25zdCwgeSgpIGNvbnN0LAorICAgICAgKiB6KCkgY29uc3QsIHcoKSBjb25zdAorICAgICAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICBvcGVyYXRvcltdKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVfQlJBQ0tFVF9PUEVSQVRPUl9JU19PTkxZX0ZPUl9WRUNUT1JTX19VU0VfVEhFX1BBUkVOVEhFU0lTX09QRVJBVE9SX0lOU1RFQUQpCisgICAgICBlaWdlbl9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgY29lZmZpY2llbnQgYXQgZ2l2ZW4gaW5kZXguCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgc3lub255bW91cyB0byBvcGVyYXRvcltdKEluZGV4KSBjb25zdC4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgYWxsb3dlZCBvbmx5IGZvciB2ZWN0b3IgZXhwcmVzc2lvbnMsIGFuZCBmb3IgbWF0cml4IGV4cHJlc3Npb25zIGhhdmluZyB0aGUgTGluZWFyQWNjZXNzQml0LgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCksIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIGNvbnN0LCB4KCkgY29uc3QsIHkoKSBjb25zdCwKKyAgICAgICogeigpIGNvbnN0LCB3KCkgY29uc3QKKyAgICAgICovCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlCisgICAgb3BlcmF0b3IoKShJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMCkuICAqLworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZQorICAgIHgoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpWzBdOyB9CisKKyAgICAvKiogZXF1aXZhbGVudCB0byBvcGVyYXRvcltdKDEpLiAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICB5KCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPT0tMSB8fCBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT49MiwgT1VUX09GX1JBTkdFX0FDQ0VTUyk7CisgICAgICByZXR1cm4gKCp0aGlzKVsxXTsKKyAgICB9CisKKyAgICAvKiogZXF1aXZhbGVudCB0byBvcGVyYXRvcltdKDIpLiAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICB6KCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPT0tMSB8fCBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT49MywgT1VUX09GX1JBTkdFX0FDQ0VTUyk7CisgICAgICByZXR1cm4gKCp0aGlzKVsyXTsKKyAgICB9CisKKyAgICAvKiogZXF1aXZhbGVudCB0byBvcGVyYXRvcltdKDMpLiAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICB3KCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPT0tMSB8fCBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT49NCwgT1VUX09GX1JBTkdFX0FDQ0VTUyk7CisgICAgICByZXR1cm4gKCp0aGlzKVszXTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxyZXR1cm5zIHRoZSBwYWNrZXQgb2YgY29lZmZpY2llbnRzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbi4gSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eQorICAgICAgKiB0byBlbnN1cmUgdGhhdCBhIHBhY2tldCByZWFsbHkgc3RhcnRzIHRoZXJlLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBleHByZXNzaW9ucyBoYXZpbmcgdGhlCisgICAgICAqIFBhY2tldEFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogVGhlIFxhIExvYWRNb2RlIHBhcmFtZXRlciBtYXkgaGF2ZSB0aGUgdmFsdWUgXGEgI0FsaWduZWQgb3IgXGEgI1VuYWxpZ25lZC4gSXRzIGVmZmVjdCBpcyB0byBzZWxlY3QKKyAgICAgICogdGhlIGFwcHJvcHJpYXRlIHZlY3Rvcml6YXRpb24gaW5zdHJ1Y3Rpb24uIEFsaWduZWQgYWNjZXNzIGlzIGZhc3RlciwgYnV0IGlzIG9ubHkgcG9zc2libGUgZm9yIHBhY2tldHMKKyAgICAgICogc3RhcnRpbmcgYXQgYW4gYWRkcmVzcyB3aGljaCBpcyBhIG11bHRpcGxlIG9mIHRoZSBwYWNrZXQgc2l6ZS4KKyAgICAgICovCisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgRGVmYXVsdFBhY2tldFR5cGU7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPihkZXJpdmVkKCkpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxEZWZhdWx0UGFja2V0VHlwZT4ocm93LGNvbCk7CisgICAgfQorCisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBwYWNrZXQ8TG9hZE1vZGU+KHJvd0luZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxyZXR1cm5zIHRoZSBwYWNrZXQgb2YgY29lZmZpY2llbnRzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBpbmRleC4gSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eQorICAgICAgKiB0byBlbnN1cmUgdGhhdCBhIHBhY2tldCByZWFsbHkgc3RhcnRzIHRoZXJlLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBleHByZXNzaW9ucyBoYXZpbmcgdGhlCisgICAgICAqIFBhY2tldEFjY2Vzc0JpdCBhbmQgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogVGhlIFxhIExvYWRNb2RlIHBhcmFtZXRlciBtYXkgaGF2ZSB0aGUgdmFsdWUgXGEgI0FsaWduZWQgb3IgXGEgI1VuYWxpZ25lZC4gSXRzIGVmZmVjdCBpcyB0byBzZWxlY3QKKyAgICAgICogdGhlIGFwcHJvcHJpYXRlIHZlY3Rvcml6YXRpb24gaW5zdHJ1Y3Rpb24uIEFsaWduZWQgYWNjZXNzIGlzIGZhc3RlciwgYnV0IGlzIG9ubHkgcG9zc2libGUgZm9yIHBhY2tldHMKKyAgICAgICogc3RhcnRpbmcgYXQgYW4gYWRkcmVzcyB3aGljaCBpcyBhIG11bHRpcGxlIG9mIHRoZSBwYWNrZXQgc2l6ZS4KKyAgICAgICovCisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZD46OkZsYWdzICYgTGluZWFyQWNjZXNzQml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSElTX0NPRUZGSUNJRU5UX0FDQ0VTU09SX1RBS0lOR19PTkVfQUNDRVNTX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX0FMTE9XSU5HX0xJTkVBUl9BQ0NFU1MpCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgRGVmYXVsdFBhY2tldFR5cGU7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPihkZXJpdmVkKCkpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxEZWZhdWx0UGFja2V0VHlwZT4oaW5kZXgpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgLy8gZXhwbGFuYXRpb246IERlbnNlQmFzZSBpcyBkb2luZyAidXNpbmcgLi4uIiBvbiB0aGUgbWV0aG9kcyBmcm9tIERlbnNlQ29lZmZzQmFzZS4KKyAgICAvLyBCdXQgc29tZSBtZXRob2RzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgRGlyZWN0QWNjZXNzIGNhc2UuCisgICAgLy8gU28gd2UgYWRkIGR1bW15IG1ldGhvZHMgaGVyZSB3aXRoIHRoZXNlIG5hbWVzLCBzbyB0aGF0ICJ1c2luZy4uLiAiIGRvZXNuJ3QgZmFpbC4KKyAgICAvLyBJdCdzIG5vdCBwcml2YXRlIHNvIHRoYXQgdGhlIGNoaWxkIGNsYXNzIERlbnNlQmFzZSBjYW4gYWNjZXNzIHRoZW0sIGFuZCBpdCdzIG5vdCBwdWJsaWMKKyAgICAvLyBlaXRoZXIgc2luY2UgaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHNvIGhhcyB0byBiZSBwcm90ZWN0ZWQuCisgICAgdm9pZCBjb2VmZlJlZigpOworICAgIHZvaWQgY29lZmZSZWZCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIHdyaXRlUGFja2V0KCk7CisgICAgdm9pZCB3cml0ZVBhY2tldEJ5T3V0ZXJJbm5lcigpOworICAgIHZvaWQgY29weUNvZWZmKCk7CisgICAgdm9pZCBjb3B5Q29lZmZCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIGNvcHlQYWNrZXQoKTsKKyAgICB2b2lkIGNvcHlQYWNrZXRCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIHN0cmlkZSgpOworICAgIHZvaWQgaW5uZXJTdHJpZGUoKTsKKyAgICB2b2lkIG91dGVyU3RyaWRlKCk7CisgICAgdm9pZCByb3dTdHJpZGUoKTsKKyAgICB2b2lkIGNvbFN0cmlkZSgpOworfTsKKworLyoqIFxicmllZiBCYXNlIGNsYXNzIHByb3ZpZGluZyByZWFkL3dyaXRlIGNvZWZmaWNpZW50IGFjY2VzcyB0byBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogXHRwYXJhbSBEZXJpdmVkIFR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKiBcdHBhcmFtICNXcml0ZUFjY2Vzc29ycyBDb25zdGFudCBpbmRpY2F0aW5nIHJlYWQvd3JpdGUgYWNjZXNzCisgICoKKyAgKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIG5vbi1jb25zdCBcYyBvcGVyYXRvcigpIGZ1bmN0aW9uIGFuZCBmcmllbmRzLCB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSBzcGVjaWZpYworICAqIGVudHJpZXMgb2YgYSBtYXRyaXggb3IgYXJyYXkuIFRoaXMgY2xhc3MgaW5oZXJpdHMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiB3aGljaAorICAqIGRlZmluZXMgdGhlIGNvbnN0IHZhcmlhbnQgZm9yIHJlYWRpbmcgc3BlY2lmaWMgZW50cmllcy4KKyAgKiAKKyAgKiBcc2EgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIERpcmVjdEFjY2Vzc29ycz4sIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4gOiBwdWJsaWMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gQmFzZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpyb3dJbmRleEJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjpjb2xJbmRleEJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcltdOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKCk7CisgICAgdXNpbmcgQmFzZTo6eDsKKyAgICB1c2luZyBCYXNlOjp5OworICAgIHVzaW5nIEJhc2U6Ono7CisgICAgdXNpbmcgQmFzZTo6dzsKKworICAgIC8qKiBTaG9ydCB2ZXJzaW9uOiBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiwgdXNlCisgICAgICAqIFxsaW5rIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIFxlbmRsaW5rIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIExvbmcgdmVyc2lvbjogdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvCisgICAgICAqIFxsaW5rIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIFxlbmRsaW5rLCBidXQgd2l0aG91dCB0aGUgYXNzZXJ0aW9uLgorICAgICAgKiBVc2UgdGhpcyBmb3IgbGltaXRpbmcgdGhlIHBlcmZvcm1hbmNlIGNvc3Qgb2YgZGVidWdnaW5nIGNvZGUgd2hlbiBkb2luZworICAgICAgKiByZXBlYXRlZCBjb2VmZmljaWVudCBhY2Nlc3MuIE9ubHkgdXNlIHRoaXMgd2hlbiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICAqIHBhcmFtZXRlcnMgXGEgcm93IGFuZCBcYSBjb2wgYXJlIGluIHJhbmdlLgorICAgICAgKgorICAgICAgKiBJZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcgaXMgZGVmaW5lZCwgYW4gYXNzZXJ0aW9uIHdpbGwgYmUgbWFkZSwgbWFraW5nIHRoaXMKKyAgICAgICogZnVuY3Rpb24gZXF1aXZhbGVudCB0byBcbGluayBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBcZW5kbGluay4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpLCBjb2VmZihJbmRleCwgSW5kZXgpIGNvbnN0LCBjb2VmZlJlZihJbmRleCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPihkZXJpdmVkKCkpLmNvZWZmUmVmKHJvdyxjb2wpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgY29lZmZSZWZCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICAgIHsKKyAgICAgIHJldHVybiBjb2VmZlJlZihyb3dJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lcikpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29lZmZpY2llbnQgYXQgZ2l2ZW4gdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uLgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCkKKyAgICAgICovCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJgorICAgIG9wZXJhdG9yKCkoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICByZXR1cm4gY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworCisgICAgLyoqIFNob3J0IHZlcnNpb246IGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLCB1c2UKKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgXGVuZGxpbmsgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogTG9uZyB2ZXJzaW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgXGVuZGxpbmssIGJ1dCB3aXRob3V0IHRoZSBhc3NlcnRpb24uCisgICAgICAqIFVzZSB0aGlzIGZvciBsaW1pdGluZyB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBkZWJ1Z2dpbmcgY29kZSB3aGVuIGRvaW5nCisgICAgICAqIHJlcGVhdGVkIGNvZWZmaWNpZW50IGFjY2Vzcy4gT25seSB1c2UgdGhpcyB3aGVuIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgICAgICogcGFyYW1ldGVycyBcYSByb3cgYW5kIFxhIGNvbCBhcmUgaW4gcmFuZ2UuCisgICAgICAqCisgICAgICAqIElmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORyBpcyBkZWZpbmVkLCBhbiBhc3NlcnRpb24gd2lsbCBiZSBtYWRlLCBtYWtpbmcgdGhpcworICAgICAgKiBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIFxsaW5rIG9wZXJhdG9yW10oSW5kZXgpIFxlbmRsaW5rLgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCksIGNvZWZmKEluZGV4KSBjb25zdCwgY29lZmZSZWYoSW5kZXgsSW5kZXgpCisgICAgICAqLworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYKKyAgICBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZD46OkZsYWdzICYgTGluZWFyQWNjZXNzQml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSElTX0NPRUZGSUNJRU5UX0FDQ0VTU09SX1RBS0lOR19PTkVfQUNDRVNTX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX0FMTE9XSU5HX0xJTkVBUl9BQ0NFU1MpCisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPihkZXJpdmVkKCkpLmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGluZGV4LgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbGxvd2VkIG9ubHkgZm9yIHZlY3RvciBleHByZXNzaW9ucywgYW5kIGZvciBtYXRyaXggZXhwcmVzc2lvbnMgaGF2aW5nIHRoZSBMaW5lYXJBY2Nlc3NCaXQuCisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvcltdKEluZGV4KSBjb25zdCwgb3BlcmF0b3IoKShJbmRleCxJbmRleCksIHgoKSwgeSgpLCB6KCksIHcoKQorICAgICAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgb3BlcmF0b3JbXShJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFX0JSQUNLRVRfT1BFUkFUT1JfSVNfT05MWV9GT1JfVkVDVE9SU19fVVNFX1RIRV9QQVJFTlRIRVNJU19PUEVSQVRPUl9JTlNURUFEKQorICAgICAgZWlnZW5fYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGluZGV4LgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIHN5bm9ueW1vdXMgdG8gb3BlcmF0b3JbXShJbmRleCkuCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgb25seSBmb3IgdmVjdG9yIGV4cHJlc3Npb25zLCBhbmQgZm9yIG1hdHJpeCBleHByZXNzaW9ucyBoYXZpbmcgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yW10oSW5kZXgpIGNvbnN0LCBvcGVyYXRvcigpKEluZGV4LEluZGV4KSwgeCgpLCB5KCksIHooKSwgdygpCisgICAgICAqLworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYKKyAgICBvcGVyYXRvcigpKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgLyoqIGVxdWl2YWxlbnQgdG8gb3BlcmF0b3JbXSgwKS4gICovCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJgorICAgIHgoKSB7IHJldHVybiAoKnRoaXMpWzBdOyB9CisKKyAgICAvKiogZXF1aXZhbGVudCB0byBvcGVyYXRvcltdKDEpLiAgKi8KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgeSgpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT09LTEgfHwgRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU+PTIsIE9VVF9PRl9SQU5HRV9BQ0NFU1MpOworICAgICAgcmV0dXJuICgqdGhpcylbMV07CisgICAgfQorCisgICAgLyoqIGVxdWl2YWxlbnQgdG8gb3BlcmF0b3JbXSgyKS4gICovCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJgorICAgIHooKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU9PS0xIHx8IERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPj0zLCBPVVRfT0ZfUkFOR0VfQUNDRVNTKTsKKyAgICAgIHJldHVybiAoKnRoaXMpWzJdOworICAgIH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMykuICAqLworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYKKyAgICB3KCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPT0tMSB8fCBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT49NCwgT1VUX09GX1JBTkdFX0FDQ0VTUyk7CisgICAgICByZXR1cm4gKCp0aGlzKVszXTsKKyAgICB9Cit9OworCisvKiogXGJyaWVmIEJhc2UgY2xhc3MgcHJvdmlkaW5nIGRpcmVjdCByZWFkLW9ubHkgY29lZmZpY2llbnQgYWNjZXNzIHRvIG1hdHJpY2VzIGFuZCBhcnJheXMuCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKiBcdHBhcmFtIERlcml2ZWQgVHlwZSBvZiB0aGUgZGVyaXZlZCBjbGFzcworICAqIFx0cGFyYW0gI0RpcmVjdEFjY2Vzc29ycyBDb25zdGFudCBpbmRpY2F0aW5nIGRpcmVjdCBhY2Nlc3MKKyAgKgorICAqIFRoaXMgY2xhc3MgZGVmaW5lcyBmdW5jdGlvbnMgdG8gd29yayB3aXRoIHN0cmlkZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGVudHJpZXMgZGlyZWN0bHkuIFRoaXMgY2xhc3MKKyAgKiBpbmhlcml0cyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+IHdoaWNoIGRlZmluZXMgZnVuY3Rpb25zIHRvIGFjY2VzcyBlbnRyaWVzIHJlYWQtb25seSB1c2luZworICAqIFxjIG9wZXJhdG9yKCkgLgorICAqCisgICogXHNhIFxibGFuayBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgRGlyZWN0QWNjZXNzb3JzPiA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBlbGVtZW50cyB3aXRoaW4gYSBzbGljZSBpbiB0aGUgaW5uZXIgZGlyZWN0aW9uLgorICAgICAgKgorICAgICAgKiBcc2Egb3V0ZXJTdHJpZGUoKSwgcm93U3RyaWRlKCksIGNvbFN0cmlkZSgpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBpbm5lciBzbGljZXMgKGZvciBleGFtcGxlLCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zCisgICAgICAqICAgICAgICAgIGluIGEgY29sdW1uLW1ham9yIG1hdHJpeCkuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCByb3dTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkub3V0ZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRSBzaGFsbCB3ZSByZW1vdmUgaXQgPworICAgIGlubGluZSBJbmRleCBzdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyBpbm5lclN0cmlkZSgpIDogb3V0ZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIHJvd3MuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCBvdXRlclN0cmlkZSgpLCBjb2xTdHJpZGUoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCByb3dTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBEZXJpdmVkOjpJc1Jvd01ham9yID8gb3V0ZXJTdHJpZGUoKSA6IGlubmVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKSwgcm93U3RyaWRlKCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggY29sU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNSb3dNYWpvciA/IGlubmVyU3RyaWRlKCkgOiBvdXRlclN0cmlkZSgpOworICAgIH0KK307CisKKy8qKiBcYnJpZWYgQmFzZSBjbGFzcyBwcm92aWRpbmcgZGlyZWN0IHJlYWQvd3JpdGUgY29lZmZpY2llbnQgYWNjZXNzIHRvIG1hdHJpY2VzIGFuZCBhcnJheXMuCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKiBcdHBhcmFtIERlcml2ZWQgVHlwZSBvZiB0aGUgZGVyaXZlZCBjbGFzcworICAqIFx0cGFyYW0gI0RpcmVjdFdyaXRlQWNjZXNzb3JzIENvbnN0YW50IGluZGljYXRpbmcgZGlyZWN0IGFjY2VzcworICAqCisgICogVGhpcyBjbGFzcyBkZWZpbmVzIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggc3RyaWRlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZW50cmllcyBkaXJlY3RseS4gVGhpcyBjbGFzcworICAqIGluaGVyaXRzIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4gd2hpY2ggZGVmaW5lcyBmdW5jdGlvbnMgdG8gYWNjZXNzIGVudHJpZXMgcmVhZC93cml0ZSB1c2luZworICAqIFxjIG9wZXJhdG9yKCkuCisgICoKKyAgKiBcc2EgXGJsYW5rIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBEaXJlY3RXcml0ZUFjY2Vzc29ycz4KKyAgOiBwdWJsaWMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFdyaXRlQWNjZXNzb3JzPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKworICAgIC8qKiBccmV0dXJucyB0aGUgcG9pbnRlciBpbmNyZW1lbnQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZWxlbWVudHMgd2l0aGluIGEgc2xpY2UgaW4gdGhlIGlubmVyIGRpcmVjdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIG91dGVyU3RyaWRlKCksIHJvd1N0cmlkZSgpLCBjb2xTdHJpZGUoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5pbm5lclN0cmlkZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcG9pbnRlciBpbmNyZW1lbnQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgaW5uZXIgc2xpY2VzIChmb3IgZXhhbXBsZSwgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY29sdW1ucworICAgICAgKiAgICAgICAgICBpbiBhIGNvbHVtbi1tYWpvciBtYXRyaXgpLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgcm93U3RyaWRlKCksIGNvbFN0cmlkZSgpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLy8gRklYTUUgc2hhbGwgd2UgcmVtb3ZlIGl0ID8KKyAgICBpbmxpbmUgSW5kZXggc3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gaW5uZXJTdHJpZGUoKSA6IG91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSByb3dzLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggcm93U3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNSb3dNYWpvciA/IG91dGVyU3RyaWRlKCkgOiBpbm5lclN0cmlkZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcG9pbnRlciBpbmNyZW1lbnQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY29sdW1ucy4KKyAgICAgICoKKyAgICAgICogXHNhIGlubmVyU3RyaWRlKCksIG91dGVyU3RyaWRlKCksIHJvd1N0cmlkZSgpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGNvbFN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIERlcml2ZWQ6OklzUm93TWFqb3IgPyBpbm5lclN0cmlkZSgpIDogb3V0ZXJTdHJpZGUoKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgQWxpZ25tZW50LCB0eXBlbmFtZSBEZXJpdmVkLCBib29sIEp1c3RSZXR1cm5aZXJvPgorc3RydWN0IGZpcnN0X2FsaWduZWRfaW1wbAoreworICBzdGF0aWMgaW5saW5lIEluZGV4IHJ1bihjb25zdCBEZXJpdmVkJikKKyAgeyByZXR1cm4gMDsgfQorfTsKKwordGVtcGxhdGU8aW50IEFsaWdubWVudCwgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBmaXJzdF9hbGlnbmVkX2ltcGw8QWxpZ25tZW50LCBEZXJpdmVkLCBmYWxzZT4KK3sKKyAgc3RhdGljIGlubGluZSBJbmRleCBydW4oY29uc3QgRGVyaXZlZCYgbSkKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZDxBbGlnbm1lbnQ+KG0uZGF0YSgpLCBtLnNpemUoKSk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBzdG9yZWQgYnkgXGEgbSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgd2l0aCByZXNwZWN0IHRvIFxhIEFsaWdubWVudCBmb3IgdmVjdG9yaXphdGlvbi4KKyAgKgorICAqIFx0cGFyYW0gQWxpZ25tZW50IHJlcXVlc3RlZCBhbGlnbm1lbnQgaW4gQnl0ZXMuCisgICoKKyAgKiBUaGVyZSBpcyBhbHNvIHRoZSB2YXJpYW50IGZpcnN0X2FsaWduZWQoY29uc3QgU2NhbGFyKiwgSW50ZWdlcikgZGVmaW5lZCBpbiBNZW1vcnkuaC4gU2VlIGl0IGZvciBtb3JlCisgICogZG9jdW1lbnRhdGlvbi4KKyAgKi8KK3RlbXBsYXRlPGludCBBbGlnbm1lbnQsIHR5cGVuYW1lIERlcml2ZWQ+CitzdGF0aWMgaW5saW5lIEluZGV4IGZpcnN0X2FsaWduZWQoY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+JiBtKQoreworICBlbnVtIHsgUmV0dXJuWmVybyA9IChpbnQoZXZhbHVhdG9yPERlcml2ZWQ+OjpBbGlnbm1lbnQpID49IEFsaWdubWVudCkgfHwgIShEZXJpdmVkOjpGbGFncyAmIERpcmVjdEFjY2Vzc0JpdCkgfTsKKyAgcmV0dXJuIGZpcnN0X2FsaWduZWRfaW1wbDxBbGlnbm1lbnQsIERlcml2ZWQsIFJldHVyblplcm8+OjpydW4obS5kZXJpdmVkKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RhdGljIGlubGluZSBJbmRleCBmaXJzdF9kZWZhdWx0X2FsaWduZWQoY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+JiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIERlZmF1bHRQYWNrZXRUeXBlOworICByZXR1cm4gaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQ8aW50KHVucGFja2V0X3RyYWl0czxEZWZhdWx0UGFja2V0VHlwZT46OmFsaWdubWVudCksRGVyaXZlZD4obSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGJvb2wgSGFzRGlyZWN0QWNjZXNzID0gaGFzX2RpcmVjdF9hY2Nlc3M8RGVyaXZlZD46OnJldD4KK3N0cnVjdCBpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lCit7CisgIGVudW0geyByZXQgPSB0cmFpdHM8RGVyaXZlZD46OklubmVyU3RyaWRlQXRDb21waWxlVGltZSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPERlcml2ZWQsIGZhbHNlPgoreworICBlbnVtIHsgcmV0ID0gMCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgYm9vbCBIYXNEaXJlY3RBY2Nlc3MgPSBoYXNfZGlyZWN0X2FjY2VzczxEZXJpdmVkPjo6cmV0Pgorc3RydWN0IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWUKK3sKKyAgZW51bSB7IHJldCA9IHRyYWl0czxEZXJpdmVkPjo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8RGVyaXZlZCwgZmFsc2U+Cit7CisgIGVudW0geyByZXQgPSAwIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERU5TRUNPRUZGU0JBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGVuc2VTdG9yYWdlLmggYi9FaWdlbi9zcmMvQ29yZS9EZW5zZVN0b3JhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU4ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VTdG9yYWdlLmgKQEAgLTAsMCArMSw1NzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWFNUT1JBR0VfSAorI2RlZmluZSBFSUdFTl9NQVRSSVhTVE9SQUdFX0gKKworI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgI2RlZmluZSBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKFgpIFg7IEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU47CisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4oWCkKKyNlbmRpZgorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdHJ1Y3QgY29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgU2l6ZT4KK0VJR0VOX0RFVklDRV9GVU5DCit2b2lkIGNoZWNrX3N0YXRpY19hbGxvY2F0aW9uX3NpemUoKQoreworICAvLyBpZiBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIGlzIGRlZmluZWQgdG8gMCwgdGhlbiBubyBsaW1pdAorICAjaWYgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFNpemUgKiBzaXplb2YoVCkgPD0gRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCwgT0JKRUNUX0FMTE9DQVRFRF9PTl9TVEFDS19JU19UT09fQklHKTsKKyAgI2VuZGlmCit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBTdGF0aWMgYXJyYXkuIElmIHRoZSBNYXRyaXhPckFycmF5T3B0aW9ucyByZXF1aXJlIGF1dG8tYWxpZ25tZW50LCB0aGUgYXJyYXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsaWduZWQ6CisgICogdG8gMTYgYnl0ZXMgYm91bmRhcnkgaWYgdGhlIHRvdGFsIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBieXRlcy4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IE1hdHJpeE9yQXJyYXlPcHRpb25zLAorICAgICAgICAgIGludCBBbGlnbm1lbnQgPSAoTWF0cml4T3JBcnJheU9wdGlvbnMmRG9udEFsaWduKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudDxULFNpemU+Ojp2YWx1ZSA+CitzdHJ1Y3QgcGxhaW5fYXJyYXkKK3sKKyAgVCBhcnJheVtTaXplXTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBwbGFpbl9hcnJheSgpCisgIHsgCisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBwbGFpbl9hcnJheShjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpCisgIHsgCisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KK307CisKKyNpZiBkZWZpbmVkKEVJR0VOX0RJU0FCTEVfVU5BTElHTkVEX0FSUkFZX0FTU0VSVCkKKyAgI2RlZmluZSBFSUdFTl9NQUtFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQoc2l6ZW1hc2spCisjZWxpZiBFSUdFTl9HTlVDX0FUX0xFQVNUKDQsNykgCisgIC8vIEdDQyA0LjcgaXMgdG9vIGFnZ3Jlc3NpdmUgaW4gaXRzIG9wdGltaXphdGlvbnMgYW5kIHJlbW92ZSB0aGUgYWxpZ25lbWVudCB0ZXN0IGJhc2VkIG9uIHRoZSBmYWN0IHRoZSBhcnJheSBpcyBkZWNsYXJlZCB0byBiZSBhbGlnbmVkLgorICAvLyBTZWUgdGhpcyBidWcgcmVwb3J0OiBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUzOTAwCisgIC8vIEhpZGluZyB0aGUgb3JpZ2luIG9mIHRoZSBhcnJheSBwb2ludGVyIGJlaGluZCBhIGZ1bmN0aW9uIGFyZ3VtZW50IHNlZW1zIHRvIGRvIHRoZSB0cmljayBldmVuIGlmIHRoZSBmdW5jdGlvbiBpcyBpbmxpbmVkOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHJUeXBlPgorICBFSUdFTl9BTFdBWVNfSU5MSU5FIFB0clR5cGUgZWlnZW5fdW5hbGlnbmVkX2FycmF5X2Fzc2VydF93b3JrYXJvdW5kX2djYzQ3KFB0clR5cGUgYXJyYXkpIHsgcmV0dXJuIGFycmF5OyB9CisgICNkZWZpbmUgRUlHRU5fTUFLRV9VTkFMSUdORURfQVJSQVlfQVNTRVJUKHNpemVtYXNrKSBcCisgICAgZWlnZW5fYXNzZXJ0KChpbnRlcm5hbDo6VUludFB0cihlaWdlbl91bmFsaWduZWRfYXJyYXlfYXNzZXJ0X3dvcmthcm91bmRfZ2NjNDcoYXJyYXkpKSAmIChzaXplbWFzaykpID09IDAgXAorICAgICAgICAgICAgICAmJiAidGhpcyBhc3NlcnRpb24gaXMgZXhwbGFpbmVkIGhlcmU6ICIgXAorICAgICAgICAgICAgICAiaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvZG94LWRldmVsL2dyb3VwX19Ub3BpY1VuYWxpZ25lZEFycmF5QXNzZXJ0Lmh0bWwiIFwKKyAgICAgICAgICAgICAgIiAqKioqIFJFQUQgVEhJUyBXRUIgUEFHRSAhISEgKioqKiIpOworI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9NQUtFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQoc2l6ZW1hc2spIFwKKyAgICBlaWdlbl9hc3NlcnQoKGludGVybmFsOjpVSW50UHRyKGFycmF5KSAmIChzaXplbWFzaykpID09IDAgXAorICAgICAgICAgICAgICAmJiAidGhpcyBhc3NlcnRpb24gaXMgZXhwbGFpbmVkIGhlcmU6ICIgXAorICAgICAgICAgICAgICAiaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvZG94LWRldmVsL2dyb3VwX19Ub3BpY1VuYWxpZ25lZEFycmF5QXNzZXJ0Lmh0bWwiIFwKKyAgICAgICAgICAgICAgIiAqKioqIFJFQUQgVEhJUyBXRUIgUEFHRSAhISEgKioqKiIpOworI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IE1hdHJpeE9yQXJyYXlPcHRpb25zPgorc3RydWN0IHBsYWluX2FycmF5PFQsIFNpemUsIE1hdHJpeE9yQXJyYXlPcHRpb25zLCA4PgoreworICBFSUdFTl9BTElHTl9UT19CT1VOREFSWSg4KSBUIGFycmF5W1NpemVdOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHBsYWluX2FycmF5KCkgCisgIHsKKyAgICBFSUdFTl9NQUtFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQoNyk7CisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBwbGFpbl9hcnJheShjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIAorICB7IAorICAgIGNoZWNrX3N0YXRpY19hbGxvY2F0aW9uX3NpemU8VCxTaXplPigpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBNYXRyaXhPckFycmF5T3B0aW9ucz4KK3N0cnVjdCBwbGFpbl9hcnJheTxULCBTaXplLCBNYXRyaXhPckFycmF5T3B0aW9ucywgMTY+Cit7CisgIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDE2KSBUIGFycmF5W1NpemVdOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHBsYWluX2FycmF5KCkgCisgIHsgCisgICAgRUlHRU5fTUFLRV9VTkFMSUdORURfQVJSQVlfQVNTRVJUKDE1KTsKKyAgICBjaGVja19zdGF0aWNfYWxsb2NhdGlvbl9zaXplPFQsU2l6ZT4oKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHBsYWluX2FycmF5KGNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkgCisgIHsgCisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IE1hdHJpeE9yQXJyYXlPcHRpb25zPgorc3RydWN0IHBsYWluX2FycmF5PFQsIFNpemUsIE1hdHJpeE9yQXJyYXlPcHRpb25zLCAzMj4KK3sKKyAgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoMzIpIFQgYXJyYXlbU2l6ZV07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgcGxhaW5fYXJyYXkoKSAKKyAgeworICAgIEVJR0VOX01BS0VfVU5BTElHTkVEX0FSUkFZX0FTU0VSVCgzMSk7CisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBwbGFpbl9hcnJheShjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIAorICB7IAorICAgIGNoZWNrX3N0YXRpY19hbGxvY2F0aW9uX3NpemU8VCxTaXplPigpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBNYXRyaXhPckFycmF5T3B0aW9ucz4KK3N0cnVjdCBwbGFpbl9hcnJheTxULCBTaXplLCBNYXRyaXhPckFycmF5T3B0aW9ucywgNjQ+Cit7CisgIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDY0KSBUIGFycmF5W1NpemVdOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHBsYWluX2FycmF5KCkgCisgIHsgCisgICAgRUlHRU5fTUFLRV9VTkFMSUdORURfQVJSQVlfQVNTRVJUKDYzKTsKKyAgICBjaGVja19zdGF0aWNfYWxsb2NhdGlvbl9zaXplPFQsU2l6ZT4oKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHBsYWluX2FycmF5KGNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkgCisgIHsgCisgICAgY2hlY2tfc3RhdGljX2FsbG9jYXRpb25fc2l6ZTxULFNpemU+KCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTWF0cml4T3JBcnJheU9wdGlvbnMsIGludCBBbGlnbm1lbnQ+CitzdHJ1Y3QgcGxhaW5fYXJyYXk8VCwgMCwgTWF0cml4T3JBcnJheU9wdGlvbnMsIEFsaWdubWVudD4KK3sKKyAgVCBhcnJheVsxXTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgcGxhaW5fYXJyYXkoKSB7fQorICBFSUdFTl9ERVZJQ0VfRlVOQyBwbGFpbl9hcnJheShjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIERlbnNlU3RvcmFnZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3RvcmVzIHRoZSBkYXRhIG9mIGEgbWF0cml4CisgICoKKyAgKiBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgZGF0YSBvZiBmaXhlZC1zaXplLCBkeW5hbWljLXNpemUgb3IgbWl4ZWQgbWF0cmljZXMKKyAgKiBpbiBhIHdheSBhcyBjb21wYWN0IGFzIHBvc3NpYmxlLgorICAqCisgICogXHNhIE1hdHJpeAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTsKKworLy8gcHVyZWx5IGZpeGVkLXNpemUgbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlCit7CisgICAgaW50ZXJuYWw6OnBsYWluX2FycmF5PFQsU2l6ZSxfT3B0aW9ucz4gbV9kYXRhOworICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKCkgeworICAgICAgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTihJbmRleCBzaXplID0gU2l6ZSkKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBleHBsaWNpdCBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBEZW5zZVN0b3JhZ2UoY29uc3QgRGVuc2VTdG9yYWdlJiBvdGhlcikgOiBtX2RhdGEob3RoZXIubV9kYXRhKSB7CisgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKEluZGV4IHNpemUgPSBTaXplKQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBEZW5zZVN0b3JhZ2UmIG9wZXJhdG9yPShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKQorICAgIHsgCisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgIHJldHVybiAqdGhpczsgCisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShJbmRleCBzaXplLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKSB7CisgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKHt9KQorICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemU9PXJvd3MqY29scyAmJiByb3dzPT1fUm93cyAmJiBjb2xzPT1fQ29scyk7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc2l6ZSk7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocm93cyk7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoY29scyk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgc3dhcChEZW5zZVN0b3JhZ2UmIG90aGVyKSB7IHN0ZDo6c3dhcChtX2RhdGEsb3RoZXIubV9kYXRhKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBJbmRleCByb3dzKHZvaWQpIHtyZXR1cm4gX1Jvd3M7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBJbmRleCBjb2xzKHZvaWQpIHtyZXR1cm4gX0NvbHM7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4LEluZGV4LEluZGV4KSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgcmVzaXplKEluZGV4LEluZGV4LEluZGV4KSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhLmFycmF5OyB9Cit9OworCisvLyBudWxsIG1hdHJpeAordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIDAsIF9Sb3dzLCBfQ29scywgX09wdGlvbnM+Cit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IERlbnNlU3RvcmFnZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShjb25zdCBEZW5zZVN0b3JhZ2UmKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IERlbnNlU3RvcmFnZSYpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKEluZGV4LEluZGV4LEluZGV4KSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgc3dhcChEZW5zZVN0b3JhZ2UmICkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgSW5kZXggcm93cyh2b2lkKSB7cmV0dXJuIF9Sb3dzO30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgSW5kZXggY29scyh2b2lkKSB7cmV0dXJuIF9Db2xzO30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCxJbmRleCxJbmRleCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHJlc2l6ZShJbmRleCxJbmRleCxJbmRleCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIFQgKmRhdGEoKSB7IHJldHVybiAwOyB9Cit9OworCisvLyBtb3JlIHNwZWNpYWxpemF0aW9ucyBmb3IgbnVsbCBtYXRyaWNlczsgdGhlc2UgYXJlIG5lY2Vzc2FyeSB0byByZXNvbHZlIGFtYmlndWl0aWVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCAwLCBEeW5hbWljLCBEeW5hbWljLCBfT3B0aW9ucz4KKzogcHVibGljIERlbnNlU3RvcmFnZTxULCAwLCAwLCAwLCBfT3B0aW9ucz4geyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX1Jvd3MsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIDAsIF9Sb3dzLCBEeW5hbWljLCBfT3B0aW9ucz4KKzogcHVibGljIERlbnNlU3RvcmFnZTxULCAwLCAwLCAwLCBfT3B0aW9ucz4geyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIDAsIER5bmFtaWMsIF9Db2xzLCBfT3B0aW9ucz4KKzogcHVibGljIERlbnNlU3RvcmFnZTxULCAwLCAwLCAwLCBfT3B0aW9ucz4geyB9OworCisvLyBkeW5hbWljLXNpemUgbWF0cml4IHdpdGggZml4ZWQtc2l6ZSBzdG9yYWdlCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgU2l6ZSwgRHluYW1pYywgRHluYW1pYywgX09wdGlvbnM+Cit7CisgICAgaW50ZXJuYWw6OnBsYWluX2FycmF5PFQsU2l6ZSxfT3B0aW9ucz4gbV9kYXRhOworICAgIEluZGV4IG1fcm93czsKKyAgICBJbmRleCBtX2NvbHM7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoKSA6IG1fcm93cygwKSwgbV9jb2xzKDApIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpLCBtX3Jvd3MoMCksIG1fY29scygwKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKSA6IG1fZGF0YShvdGhlci5tX2RhdGEpLCBtX3Jvd3Mob3RoZXIubV9yb3dzKSwgbV9jb2xzKG90aGVyLm1fY29scykge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UmIG9wZXJhdG9yPShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKSAKKyAgICB7IAorICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgeworICAgICAgICBtX2RhdGEgPSBvdGhlci5tX2RhdGE7CisgICAgICAgIG1fcm93cyA9IG90aGVyLm1fcm93czsKKyAgICAgICAgbV9jb2xzID0gb3RoZXIubV9jb2xzOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOyAKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKEluZGV4LCBJbmRleCByb3dzLCBJbmRleCBjb2xzKSA6IG1fcm93cyhyb3dzKSwgbV9jb2xzKGNvbHMpIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBzd2FwKERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgc3RkOjpzd2FwKG1fY29scyxvdGhlci5tX2NvbHMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggcm93cygpIGNvbnN0IHtyZXR1cm4gbV9yb3dzO30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBjb2xzKCkgY29uc3Qge3JldHVybiBtX2NvbHM7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4LCBJbmRleCByb3dzLCBJbmRleCBjb2xzKSB7IG1fcm93cyA9IHJvd3M7IG1fY29scyA9IGNvbHM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHJlc2l6ZShJbmRleCwgSW5kZXggcm93cywgSW5kZXggY29scykgeyBtX3Jvd3MgPSByb3dzOyBtX2NvbHMgPSBjb2xzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5hcnJheTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIFQgKmRhdGEoKSB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KK307CisKKy8vIGR5bmFtaWMtc2l6ZSBtYXRyaXggd2l0aCBmaXhlZC1zaXplIHN0b3JhZ2UgYW5kIGZpeGVkIHdpZHRoCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IF9Db2xzLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCBTaXplLCBEeW5hbWljLCBfQ29scywgX09wdGlvbnM+Cit7CisgICAgaW50ZXJuYWw6OnBsYWluX2FycmF5PFQsU2l6ZSxfT3B0aW9ucz4gbV9kYXRhOworICAgIEluZGV4IG1fcm93czsKKyAgcHVibGljOgorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZSgpIDogbV9yb3dzKDApIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpLCBtX3Jvd3MoMCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoY29uc3QgRGVuc2VTdG9yYWdlJiBvdGhlcikgOiBtX2RhdGEob3RoZXIubV9kYXRhKSwgbV9yb3dzKG90aGVyLm1fcm93cykge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UmIG9wZXJhdG9yPShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKSAKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICB7CisgICAgICAgIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgICAgbV9yb3dzID0gb3RoZXIubV9yb3dzOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOyAKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKEluZGV4LCBJbmRleCByb3dzLCBJbmRleCkgOiBtX3Jvd3Mocm93cykge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3Modm9pZCkgY29uc3Qge3JldHVybiBtX3Jvd3M7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IGNvbHModm9pZCkgY29uc3Qge3JldHVybiBfQ29sczt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXgsIEluZGV4IHJvd3MsIEluZGV4KSB7IG1fcm93cyA9IHJvd3M7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHJlc2l6ZShJbmRleCwgSW5kZXggcm93cywgSW5kZXgpIHsgbV9yb3dzID0gcm93czsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhLmFycmF5OyB9Cit9OworCisvLyBkeW5hbWljLXNpemUgbWF0cml4IHdpdGggZml4ZWQtc2l6ZSBzdG9yYWdlIGFuZCBmaXhlZCBoZWlnaHQKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplLCBpbnQgX1Jvd3MsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIFNpemUsIF9Sb3dzLCBEeW5hbWljLCBfT3B0aW9ucz4KK3sKKyAgICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8VCxTaXplLF9PcHRpb25zPiBtX2RhdGE7CisgICAgSW5kZXggbV9jb2xzOworICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKCkgOiBtX2NvbHMoMCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSksIG1fY29scygwKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKSA6IG1fZGF0YShvdGhlci5tX2RhdGEpLCBtX2NvbHMob3RoZXIubV9jb2xzKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgeworICAgICAgICBtX2RhdGEgPSBvdGhlci5tX2RhdGE7CisgICAgICAgIG1fY29scyA9IG90aGVyLm1fY29sczsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKEluZGV4LCBJbmRleCwgSW5kZXggY29scykgOiBtX2NvbHMoY29scykge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX2NvbHMsb3RoZXIubV9jb2xzKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3Modm9pZCkgY29uc3Qge3JldHVybiBfUm93czt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fY29sczt9CisgICAgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXgsIEluZGV4LCBJbmRleCBjb2xzKSB7IG1fY29scyA9IGNvbHM7IH0KKyAgICB2b2lkIHJlc2l6ZShJbmRleCwgSW5kZXgsIEluZGV4IGNvbHMpIHsgbV9jb2xzID0gY29sczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhLmFycmF5OyB9Cit9OworCisvLyBwdXJlbHkgZHluYW1pYyBtYXRyaXguCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCBfT3B0aW9ucz4KK3sKKyAgICBUICptX2RhdGE7CisgICAgSW5kZXggbV9yb3dzOworICAgIEluZGV4IG1fY29sczsKKyAgcHVibGljOgorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZSgpIDogbV9kYXRhKDApLCBtX3Jvd3MoMCksIG1fY29scygwKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IERlbnNlU3RvcmFnZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KQorICAgICAgIDogbV9kYXRhKDApLCBtX3Jvd3MoMCksIG1fY29scygwKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShJbmRleCBzaXplLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX2RhdGEoaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oc2l6ZSkpLCBtX3Jvd3Mocm93cyksIG1fY29scyhjb2xzKQorICAgIHsKKyAgICAgIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4oe30pCisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc2l6ZT09cm93cypjb2xzICYmIHJvd3M+PTAgJiYgY29scyA+PTApOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoY29uc3QgRGVuc2VTdG9yYWdlJiBvdGhlcikKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG90aGVyLm1fcm93cypvdGhlci5tX2NvbHMpKQorICAgICAgLCBtX3Jvd3Mob3RoZXIubV9yb3dzKQorICAgICAgLCBtX2NvbHMob3RoZXIubV9jb2xzKQorICAgIHsKKyAgICAgIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4oSW5kZXggc2l6ZSA9IG1fcm93cyptX2NvbHMpCisgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX2RhdGEsIG90aGVyLm1fZGF0YStvdGhlci5tX3Jvd3Mqb3RoZXIubV9jb2xzLCBtX2RhdGEpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UmIG9wZXJhdG9yPShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKyAgICAgIHsKKyAgICAgICAgRGVuc2VTdG9yYWdlIHRtcChvdGhlcik7CisgICAgICAgIHRoaXMtPnN3YXAodG1wKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjaWYgRUlHRU5fSEFTX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZVN0b3JhZ2UoRGVuc2VTdG9yYWdlJiYgb3RoZXIpIEVJR0VOX05PRVhDRVBUCisgICAgICA6IG1fZGF0YShzdGQ6Om1vdmUob3RoZXIubV9kYXRhKSkKKyAgICAgICwgbV9yb3dzKHN0ZDo6bW92ZShvdGhlci5tX3Jvd3MpKQorICAgICAgLCBtX2NvbHMoc3RkOjptb3ZlKG90aGVyLm1fY29scykpCisgICAgeworICAgICAgb3RoZXIubV9kYXRhID0gbnVsbHB0cjsKKyAgICAgIG90aGVyLm1fcm93cyA9IDA7CisgICAgICBvdGhlci5tX2NvbHMgPSAwOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlU3RvcmFnZSYgb3BlcmF0b3I9KERlbnNlU3RvcmFnZSYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAobV9kYXRhLCBvdGhlci5tX2RhdGEpOworICAgICAgc3dhcChtX3Jvd3MsIG90aGVyLm1fcm93cyk7CisgICAgICBzd2FwKG1fY29scywgb3RoZXIubV9jb2xzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB+RGVuc2VTdG9yYWdlKCkgeyBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9kZWxldGVfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihtX2RhdGEsIG1fcm93cyptX2NvbHMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBzd2FwKERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgc3RkOjpzd2FwKG1fY29scyxvdGhlci5tX2NvbHMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggcm93cyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fcm93czt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fY29sczt9CisgICAgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggc2l6ZSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgc2l6ZSwgbV9yb3dzKm1fY29scyk7CisgICAgICBtX3Jvd3MgPSByb3dzOworICAgICAgbV9jb2xzID0gY29sczsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXNpemUoSW5kZXggc2l6ZSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBpZihzaXplICE9IG1fcm93cyptX2NvbHMpCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgbV9yb3dzKm1fY29scyk7CisgICAgICAgIGlmIChzaXplKQorICAgICAgICAgIG1fZGF0YSA9IGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KHNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgbV9kYXRhID0gMDsKKyAgICAgICAgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTih7fSkKKyAgICAgIH0KKyAgICAgIG1fcm93cyA9IHJvd3M7CisgICAgICBtX2NvbHMgPSBjb2xzOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorfTsKKworLy8gbWF0cml4IHdpdGggZHluYW1pYyB3aWR0aCBhbmQgZml4ZWQgaGVpZ2h0IChzbyB0aGF0IG1hdHJpeCBoYXMgZHluYW1pYyBzaXplKS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBfUm93cywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgRHluYW1pYywgX1Jvd3MsIER5bmFtaWMsIF9PcHRpb25zPgoreworICAgIFQgKm1fZGF0YTsKKyAgICBJbmRleCBtX2NvbHM7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoKSA6IG1fZGF0YSgwKSwgbV9jb2xzKDApIHt9CisgICAgZXhwbGljaXQgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIDogbV9kYXRhKDApLCBtX2NvbHMoMCkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZW5zZVN0b3JhZ2UoSW5kZXggc2l6ZSwgSW5kZXggcm93cywgSW5kZXggY29scykgOiBtX2RhdGEoaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oc2l6ZSkpLCBtX2NvbHMoY29scykKKyAgICB7CisgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKHt9KQorICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemU9PXJvd3MqY29scyAmJiByb3dzPT1fUm93cyAmJiBjb2xzID49MCk7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocm93cyk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZShjb25zdCBEZW5zZVN0b3JhZ2UmIG90aGVyKQorICAgICAgOiBtX2RhdGEoaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oX1Jvd3Mqb3RoZXIubV9jb2xzKSkKKyAgICAgICwgbV9jb2xzKG90aGVyLm1fY29scykKKyAgICB7CisgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKEluZGV4IHNpemUgPSBtX2NvbHMqX1Jvd3MpCisgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX2RhdGEsIG90aGVyLm1fZGF0YStfUm93cyptX2NvbHMsIG1fZGF0YSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIERlbnNlU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgICAgeworICAgICAgICBEZW5zZVN0b3JhZ2UgdG1wKG90aGVyKTsKKyAgICAgICAgdGhpcy0+c3dhcCh0bXApOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0gICAgCisjaWYgRUlHRU5fSEFTX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZVN0b3JhZ2UoRGVuc2VTdG9yYWdlJiYgb3RoZXIpIEVJR0VOX05PRVhDRVBUCisgICAgICA6IG1fZGF0YShzdGQ6Om1vdmUob3RoZXIubV9kYXRhKSkKKyAgICAgICwgbV9jb2xzKHN0ZDo6bW92ZShvdGhlci5tX2NvbHMpKQorICAgIHsKKyAgICAgIG90aGVyLm1fZGF0YSA9IG51bGxwdHI7CisgICAgICBvdGhlci5tX2NvbHMgPSAwOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlU3RvcmFnZSYgb3BlcmF0b3I9KERlbnNlU3RvcmFnZSYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAobV9kYXRhLCBvdGhlci5tX2RhdGEpOworICAgICAgc3dhcChtX2NvbHMsIG90aGVyLm1fY29scyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgfkRlbnNlU3RvcmFnZSgpIHsgaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlX2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4obV9kYXRhLCBfUm93cyptX2NvbHMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBzd2FwKERlbnNlU3RvcmFnZSYgb3RoZXIpIHsgc3RkOjpzd2FwKG1fZGF0YSxvdGhlci5tX2RhdGEpOyBzdGQ6OnN3YXAobV9jb2xzLG90aGVyLm1fY29scyk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgSW5kZXggcm93cyh2b2lkKSB7cmV0dXJuIF9Sb3dzO30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBjb2xzKHZvaWQpIGNvbnN0IHtyZXR1cm4gbV9jb2xzO30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCBzaXplLCBJbmRleCwgSW5kZXggY29scykKKyAgICB7CisgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgc2l6ZSwgX1Jvd3MqbV9jb2xzKTsKKyAgICAgIG1fY29scyA9IGNvbHM7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZXNpemUoSW5kZXggc2l6ZSwgSW5kZXgsIEluZGV4IGNvbHMpCisgICAgeworICAgICAgaWYoc2l6ZSAhPSBfUm93cyptX2NvbHMpCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgX1Jvd3MqbV9jb2xzKTsKKyAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2RhdGEgPSAwOworICAgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKHt9KQorICAgICAgfQorICAgICAgbV9jb2xzID0gY29sczsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIFQgKmRhdGEoKSB7IHJldHVybiBtX2RhdGE7IH0KK307CisKKy8vIG1hdHJpeCB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCBmaXhlZCB3aWR0aCAoc28gdGhhdCBtYXRyaXggaGFzIGR5bmFtaWMgc2l6ZSkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIER5bmFtaWMsIER5bmFtaWMsIF9Db2xzLCBfT3B0aW9ucz4KK3sKKyAgICBUICptX2RhdGE7CisgICAgSW5kZXggbV9yb3dzOworICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKCkgOiBtX2RhdGEoMCksIG1fcm93cygwKSB7fQorICAgIGV4cGxpY2l0IERlbnNlU3RvcmFnZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KSA6IG1fZGF0YSgwKSwgbV9yb3dzKDApIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKEluZGV4IHNpemUsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIDogbV9kYXRhKGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KHNpemUpKSwgbV9yb3dzKHJvd3MpCisgICAgeworICAgICAgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTih7fSkKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChzaXplPT1yb3dzKmNvbHMgJiYgcm93cz49MCAmJiBjb2xzID09IF9Db2xzKTsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShjb2xzKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlKGNvbnN0IERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihvdGhlci5tX3Jvd3MqX0NvbHMpKQorICAgICAgLCBtX3Jvd3Mob3RoZXIubV9yb3dzKQorICAgIHsKKyAgICAgIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4oSW5kZXggc2l6ZSA9IG1fcm93cypfQ29scykKKyAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG90aGVyLm1fZGF0YSwgb3RoZXIubV9kYXRhK290aGVyLm1fcm93cypfQ29scywgbV9kYXRhKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVuc2VTdG9yYWdlJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VTdG9yYWdlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgICB7CisgICAgICAgIERlbnNlU3RvcmFnZSB0bXAob3RoZXIpOworICAgICAgICB0aGlzLT5zd2FwKHRtcCk7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfSAgICAKKyNpZiBFSUdFTl9IQVNfUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlU3RvcmFnZShEZW5zZVN0b3JhZ2UmJiBvdGhlcikgRUlHRU5fTk9FWENFUFQKKyAgICAgIDogbV9kYXRhKHN0ZDo6bW92ZShvdGhlci5tX2RhdGEpKQorICAgICAgLCBtX3Jvd3Moc3RkOjptb3ZlKG90aGVyLm1fcm93cykpCisgICAgeworICAgICAgb3RoZXIubV9kYXRhID0gbnVsbHB0cjsKKyAgICAgIG90aGVyLm1fcm93cyA9IDA7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VTdG9yYWdlJiBvcGVyYXRvcj0oRGVuc2VTdG9yYWdlJiYgb3RoZXIpIEVJR0VOX05PRVhDRVBUCisgICAgeworICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgc3dhcChtX2RhdGEsIG90aGVyLm1fZGF0YSk7CisgICAgICBzd2FwKG1fcm93cywgb3RoZXIubV9yb3dzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB+RGVuc2VTdG9yYWdlKCkgeyBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9kZWxldGVfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihtX2RhdGEsIF9Db2xzKm1fcm93cyk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3Modm9pZCkgY29uc3Qge3JldHVybiBtX3Jvd3M7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBJbmRleCBjb2xzKHZvaWQpIHtyZXR1cm4gX0NvbHM7fQorICAgIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHNpemUsIEluZGV4IHJvd3MsIEluZGV4KQorICAgIHsKKyAgICAgIG1fZGF0YSA9IGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2NfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4obV9kYXRhLCBzaXplLCBtX3Jvd3MqX0NvbHMpOworICAgICAgbV9yb3dzID0gcm93czsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlc2l6ZShJbmRleCBzaXplLCBJbmRleCByb3dzLCBJbmRleCkKKyAgICB7CisgICAgICBpZihzaXplICE9IG1fcm93cypfQ29scykKKyAgICAgIHsKKyAgICAgICAgaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlX2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4obV9kYXRhLCBfQ29scyptX3Jvd3MpOworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fZGF0YSA9IDA7CisgICAgICAgIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4oe30pCisgICAgICB9CisgICAgICBtX3Jvd3MgPSByb3dzOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGlhZ29uYWwuaCBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNzExMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRElBR09OQUxfSAorI2RlZmluZSBFSUdFTl9ESUFHT05BTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIERpYWdvbmFsCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIGEgZGlhZ29uYWwvc3ViZGlhZ29uYWwvc3VwZXJkaWFnb25hbCBpbiBhIG1hdHJpeAorICAqCisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpbiB3aGljaCB3ZSBhcmUgdGFraW5nIGEgc3ViL21haW4vc3VwZXIgZGlhZ29uYWwKKyAgKiBccGFyYW0gRGlhZ0luZGV4IHRoZSBpbmRleCBvZiB0aGUgc3ViL3N1cGVyIGRpYWdvbmFsLiBUaGUgZGVmYXVsdCBpcyAwIGFuZCBpdCBtZWFucyB0aGUgbWFpbiBkaWFnb25hbC4KKyAgKiAgICAgICAgICAgICAgQSBwb3NpdGl2ZSB2YWx1ZSBtZWFucyBhIHN1cGVyZGlhZ29uYWwsIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgYSBzdWJkaWFnb25hbC4KKyAgKiAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIHVzZSBEeW5hbWljSW5kZXggc28gdGhlIGluZGV4IGNhbiBiZSBzZXQgYXQgcnVudGltZS4KKyAgKgorICAqIFRoZSBtYXRyaXggaXMgbm90IHJlcXVpcmVkIHRvIGJlIHNxdWFyZS4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsLCBvciBhbnkgc3ViL3N1cGVyIGRpYWdvbmFsCisgICogb2YgYSBzcXVhcmUgbWF0cml4LiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6ZGlhZ29uYWwoKSBhbmQgTWF0cml4QmFzZTo6ZGlhZ29uYWwoSW5kZXgpIGFuZCBtb3N0IG9mIHRoZQorICAqIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpkaWFnb25hbCgpLCBNYXRyaXhCYXNlOjpkaWFnb25hbChJbmRleCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBEaWFnSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsPE1hdHJpeFR5cGUsRGlhZ0luZGV4PiA+CisgOiB0cmFpdHM8TWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWZfc2VsZWN0b3I8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IChpbnQoRGlhZ0luZGV4KSA9PSBEeW5hbWljSW5kZXggfHwgaW50KE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lKSA9PSBEeW5hbWljKSA/IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICA6IChFSUdFTl9QTEFJTl9FTlVNX01JTihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSAtIEVJR0VOX1BMQUlOX0VOVU1fTUFYKC1EaWFnSW5kZXgsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIC0gRUlHRU5fUExBSU5fRU5VTV9NQVgoIERpYWdJbmRleCwgMCkpKSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IDEsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBpbnQoTWF0cml4VHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpID09IER5bmFtaWMgPyBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBEaWFnSW5kZXggPT0gRHluYW1pY0luZGV4ID8gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRUlHRU5fUExBSU5fRU5VTV9NSU4oTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUgLSBFSUdFTl9QTEFJTl9FTlVNX01BWCgtRGlhZ0luZGV4LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAtIEVJR0VOX1BMQUlOX0VOVU1fTUFYKCBEaWFnSW5kZXgsIDApKSksCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSAxLAorICAgIE1hc2tMdmFsdWVCaXQgPSBpc19sdmFsdWU8TWF0cml4VHlwZT46OnZhbHVlID8gTHZhbHVlQml0IDogMCwKKyAgICBGbGFncyA9ICh1bnNpZ25lZCBpbnQpX01hdHJpeFR5cGVOZXN0ZWQ6OkZsYWdzICYgKFJvd01ham9yQml0IHwgTWFza0x2YWx1ZUJpdCB8IERpcmVjdEFjY2Vzc0JpdCkgJiB+Um93TWFqb3JCaXQsIC8vIEZJWE1FIERpcmVjdEFjY2Vzc0JpdCBzaG91bGQgbm90IGJlIGhhbmRsZWQgYnkgZXhwcmVzc2lvbnMKKyAgICBNYXRyaXhUeXBlT3V0ZXJTdHJpZGUgPSBvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPE1hdHJpeFR5cGU+OjpyZXQsCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZU91dGVyU3RyaWRlID09IER5bmFtaWMgPyBEeW5hbWljIDogTWF0cml4VHlwZU91dGVyU3RyaWRlKzEsCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gMAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IF9EaWFnSW5kZXg+IGNsYXNzIERpYWdvbmFsCisgICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IERpYWdvbmFsPE1hdHJpeFR5cGUsX0RpYWdJbmRleD4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICBlbnVtIHsgRGlhZ0luZGV4ID0gX0RpYWdJbmRleCB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPERpYWdvbmFsPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGlhZ29uYWwpCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBEaWFnb25hbChNYXRyaXhUeXBlJiBtYXRyaXgsIEluZGV4IGFfaW5kZXggPSBEaWFnSW5kZXgpIDogbV9tYXRyaXgobWF0cml4KSwgbV9pbmRleChhX2luZGV4KSB7fQorCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhEaWFnb25hbCkKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2luZGV4LnZhbHVlKCk8MCA/IG51bWV4dDo6bWluaTxJbmRleD4obV9tYXRyaXguY29scygpLG1fbWF0cml4LnJvd3MoKSttX2luZGV4LnZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1leHQ6Om1pbmk8SW5kZXg+KG1fbWF0cml4LnJvd3MoKSxtX21hdHJpeC5jb2xzKCktbV9pbmRleC52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5vdXRlclN0cmlkZSgpICsgMTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjppc19sdmFsdWU8TWF0cml4VHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlKiBkYXRhKCkgeyByZXR1cm4gJihtX21hdHJpeC5jb2VmZlJlZihyb3dPZmZzZXQoKSwgY29sT2Zmc2V0KCkpKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuICYobV9tYXRyaXguY29lZmZSZWYocm93T2Zmc2V0KCksIGNvbE9mZnNldCgpKSk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShNYXRyaXhUeXBlKQorICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmUmVmKHJvdytyb3dPZmZzZXQoKSwgcm93K2NvbE9mZnNldCgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmUmVmKHJvdytyb3dPZmZzZXQoKSwgcm93K2NvbE9mZnNldCgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYocm93K3Jvd09mZnNldCgpLCByb3crY29sT2Zmc2V0KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaWR4KQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTFZBTFVFKE1hdHJpeFR5cGUpCisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmZSZWYoaWR4K3Jvd09mZnNldCgpLCBpZHgrY29sT2Zmc2V0KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaWR4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZlJlZihpZHgrcm93T2Zmc2V0KCksIGlkeCtjb2xPZmZzZXQoKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGlkeCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYoaWR4K3Jvd09mZnNldCgpLCBpZHgrY29sT2Zmc2V0KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZD46OnR5cGUmIAorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCAKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXg7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggaW5kZXgoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2luZGV4LnZhbHVlKCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojpub25fY29uc3RfdHlwZSBtX21hdHJpeDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pY2luZGV4PEluZGV4LCBEaWFnSW5kZXg+IG1faW5kZXg7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBzb21lIGNvbXBpbGVycyBtYXkgZmFpbCB0byBvcHRpbWl6ZSBzdGQ6Om1heCBldGMgaW4gY2FzZSBvZiBjb21waWxlLXRpbWUgY29uc3RhbnRzLi4uCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGFic0RpYWdJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXgudmFsdWUoKT4wID8gbV9pbmRleC52YWx1ZSgpIDogLW1faW5kZXgudmFsdWUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4LnZhbHVlKCk+MCA/IDAgOiAtbV9pbmRleC52YWx1ZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXgudmFsdWUoKT4wID8gbV9pbmRleC52YWx1ZSgpIDogMDsgfQorICAgIC8vIHRyaWdnZXIgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgc29tZW9uZSB0cnkgdG8gY2FsbCBwYWNrZXQKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4KSBjb25zdDsKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4LEluZGV4KSBjb25zdDsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgKgorICAqIFxjICp0aGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcXVhcmUuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2RpYWdvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWwub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgRGlhZ29uYWwgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RGlhZ29uYWxSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbCgpCit7CisgIHJldHVybiBEaWFnb25hbFJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgZGlhZ29uYWwoKS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6Q29uc3REaWFnb25hbFJldHVyblR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OmRpYWdvbmFsKCkgY29uc3QKK3sKKyAgcmV0dXJuIENvbnN0RGlhZ29uYWxSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBcYSBEaWFnSW5kZXgtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgKgorICAqIFxjICp0aGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcXVhcmUuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIERpYWdJbmRleCByZXByZXNlbnQgYSBzdXBlciBkaWFnb25hbCBpZiBcYSBEaWFnSW5kZXggPiAwCisgICogYW5kIGEgc3ViIGRpYWdvbmFsIG90aGVyd2lzZS4gXGEgRGlhZ0luZGV4ID09IDAgaXMgZXF1aXZhbGVudCB0byB0aGUgbWFpbiBkaWFnb25hbC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmRpYWdvbmFsKCksIGNsYXNzIERpYWdvbmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkRpYWdvbmFsRHluYW1pY0luZGV4UmV0dXJuVHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZGlhZ29uYWwoSW5kZXggaW5kZXgpCit7CisgIHJldHVybiBEaWFnb25hbER5bmFtaWNJbmRleFJldHVyblR5cGUoZGVyaXZlZCgpLCBpbmRleCk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGRpYWdvbmFsKEluZGV4KS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6Q29uc3REaWFnb25hbER5bmFtaWNJbmRleFJldHVyblR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OmRpYWdvbmFsKEluZGV4IGluZGV4KSBjb25zdAoreworICByZXR1cm4gQ29uc3REaWFnb25hbER5bmFtaWNJbmRleFJldHVyblR5cGUoZGVyaXZlZCgpLCBpbmRleCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBcYSBEaWFnSW5kZXgtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgKgorICAqIFxjICp0aGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcXVhcmUuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIERpYWdJbmRleCByZXByZXNlbnQgYSBzdXBlciBkaWFnb25hbCBpZiBcYSBEaWFnSW5kZXggPiAwCisgICogYW5kIGEgc3ViIGRpYWdvbmFsIG90aGVyd2lzZS4gXGEgRGlhZ0luZGV4ID09IDAgaXMgZXF1aXZhbGVudCB0byB0aGUgbWFpbiBkaWFnb25hbC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmRpYWdvbmFsKCksIGNsYXNzIERpYWdvbmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IEluZGV4Xz4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBEaWFnb25hbEluZGV4UmV0dXJuVHlwZTxJbmRleF8+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbCgpCit7CisgIHJldHVybiB0eXBlbmFtZSBEaWFnb25hbEluZGV4UmV0dXJuVHlwZTxJbmRleF8+OjpUeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGRpYWdvbmFsPGludD4oKS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgSW5kZXhfPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8SW5kZXhfPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZGlhZ29uYWwoKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3REaWFnb25hbEluZGV4UmV0dXJuVHlwZTxJbmRleF8+OjpUeXBlKGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRElBR09OQUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGlhZ29uYWxNYXRyaXguaCBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmZGNlOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsTWF0cml4LmgKQEAgLTAsMCArMSwzNDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RJQUdPTkFMTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fRElBR09OQUxNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIERpYWdvbmFsQmFzZSA6IHB1YmxpYyBFaWdlbkJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RGlhZ29uYWxWZWN0b3JUeXBlIERpYWdvbmFsVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworCisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSAwLAorICAgICAgRmxhZ3MgPSBOb1ByZWZlcnJlZFN0b3JhZ2VPcmRlckJpdAorICAgIH07CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgMCwgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBEZW5zZU1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBEZW5zZU1hdHJpeFR5cGUgRGVuc2VUeXBlOworICAgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLERpYWdvbmFsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsRGlhZ29uYWxWZWN0b3JUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZT4gUGxhaW5PYmplY3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlTWF0cml4VHlwZSB0b0RlbnNlTWF0cml4KCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpOyB9CisgICAgCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgRGlhZ29uYWxWZWN0b3JUeXBlJiBkaWFnb25hbCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5kaWFnb25hbCgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgRGlhZ29uYWxWZWN0b3JUeXBlJiBkaWFnb25hbCgpIHsgcmV0dXJuIGRlcml2ZWQoKS5kaWFnb25hbCgpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gZGlhZ29uYWwoKS5zaXplKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gZGlhZ29uYWwoKS5zaXplKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBQcm9kdWN0PERlcml2ZWQsTWF0cml4RGVyaXZlZCxMYXp5UHJvZHVjdD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxNYXRyaXhEZXJpdmVkPiAmbWF0cml4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBQcm9kdWN0PERlcml2ZWQsIE1hdHJpeERlcml2ZWQsIExhenlQcm9kdWN0PihkZXJpdmVkKCksbWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgdHlwZWRlZiBEaWFnb25hbFdyYXBwZXI8Y29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaW52ZXJzZV9vcDxTY2FsYXI+LCBjb25zdCBEaWFnb25hbFZlY3RvclR5cGU+ID4gSW52ZXJzZVJldHVyblR5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgSW52ZXJzZVJldHVyblR5cGUKKyAgICBpbnZlcnNlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSW52ZXJzZVJldHVyblR5cGUoZGlhZ29uYWwoKS5jd2lzZUludmVyc2UoKSk7CisgICAgfQorICAgIAorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IERpYWdvbmFsV3JhcHBlcjxjb25zdCBFSUdFTl9FWFBSX0JJTkFSWU9QX1NDQUxBUl9SRVRVUk5fVFlQRShEaWFnb25hbFZlY3RvclR5cGUsU2NhbGFyLHByb2R1Y3QpID4KKyAgICBvcGVyYXRvciooY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIERpYWdvbmFsV3JhcHBlcjxjb25zdCBFSUdFTl9FWFBSX0JJTkFSWU9QX1NDQUxBUl9SRVRVUk5fVFlQRShEaWFnb25hbFZlY3RvclR5cGUsU2NhbGFyLHByb2R1Y3QpID4oZGlhZ29uYWwoKSAqIHNjYWxhcik7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBEaWFnb25hbFdyYXBwZXI8Y29uc3QgRUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoU2NhbGFyLERpYWdvbmFsVmVjdG9yVHlwZSxwcm9kdWN0KSA+CisgICAgb3BlcmF0b3IqKGNvbnN0IFNjYWxhciYgc2NhbGFyLCBjb25zdCBEaWFnb25hbEJhc2UmIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBEaWFnb25hbFdyYXBwZXI8Y29uc3QgRUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoU2NhbGFyLERpYWdvbmFsVmVjdG9yVHlwZSxwcm9kdWN0KSA+KHNjYWxhciAqIG90aGVyLmRpYWdvbmFsKCkpOworICAgIH0KK307CisKKyNlbmRpZgorCisvKiogXGNsYXNzIERpYWdvbmFsTWF0cml4CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGggaXRzIHN0b3JhZ2UKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSB0eXBlIG9mIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBTaXplQXRDb21waWxlVGltZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXgsIG9yIER5bmFtaWMKKyAgKiBccGFyYW0gTWF4U2l6ZUF0Q29tcGlsZVRpbWUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LCBvciBEeW5hbWljLiBUaGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMKKyAgKiAgICAgICAgdG8gU2l6ZUF0Q29tcGlsZVRpbWUuIE1vc3Qgb2YgdGhlIHRpbWUsIHlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IGl0LgorICAqCisgICogXHNhIGNsYXNzIERpYWdvbmFsV3JhcHBlcgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsTWF0cml4PF9TY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWUsTWF4U2l6ZUF0Q29tcGlsZVRpbWU+ID4KKyA6IHRyYWl0czxNYXRyaXg8X1NjYWxhcixTaXplQXRDb21waWxlVGltZSxTaXplQXRDb21waWxlVGltZSwwLE1heFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lPiA+Cit7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWUsMSwwLE1heFNpemVBdENvbXBpbGVUaW1lLDE+IERpYWdvbmFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBEaWFnb25hbFNoYXBlIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBGbGFncyA9IEx2YWx1ZUJpdCB8IE5vUHJlZmVycmVkU3RvcmFnZU9yZGVyQml0CisgIH07Cit9OworfQordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWU+CitjbGFzcyBEaWFnb25hbE1hdHJpeAorICA6IHB1YmxpYyBEaWFnb25hbEJhc2U8RGlhZ29uYWxNYXRyaXg8X1NjYWxhcixTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZT4gPgoreworICBwdWJsaWM6CisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEaWFnb25hbE1hdHJpeD46OkRpYWdvbmFsVmVjdG9yVHlwZSBEaWFnb25hbFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBjb25zdCBEaWFnb25hbE1hdHJpeCYgTmVzdGVkOworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERpYWdvbmFsTWF0cml4Pjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERpYWdvbmFsTWF0cml4Pjo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisKKyAgICBEaWFnb25hbFZlY3RvclR5cGUgbV9kaWFnb25hbDsKKworICBwdWJsaWM6CisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBkaWFnb25hbCgpLiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IERpYWdvbmFsVmVjdG9yVHlwZSYgZGlhZ29uYWwoKSBjb25zdCB7IHJldHVybiBtX2RpYWdvbmFsOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgdmVjdG9yIG9mIGRpYWdvbmFsIGNvZWZmaWNpZW50cy4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBEaWFnb25hbFZlY3RvclR5cGUmIGRpYWdvbmFsKCkgeyByZXR1cm4gbV9kaWFnb25hbDsgfQorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIERpYWdvbmFsTWF0cml4KCkge30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGggZ2l2ZW4gZGltZW5zaW9uICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZXhwbGljaXQgaW5saW5lIERpYWdvbmFsTWF0cml4KEluZGV4IGRpbSkgOiBtX2RpYWdvbmFsKGRpbSkge30KKworICAgIC8qKiAyRCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBEaWFnb25hbE1hdHJpeChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkgOiBtX2RpYWdvbmFsKHgseSkge30KKworICAgIC8qKiAzRCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBEaWFnb25hbE1hdHJpeChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiB6KSA6IG1fZGlhZ29uYWwoeCx5LHopIHt9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgRGlhZ29uYWxNYXRyaXgoY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSA6IG1fZGlhZ29uYWwob3RoZXIuZGlhZ29uYWwoKSkge30KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogY29weSBjb25zdHJ1Y3Rvci4gcHJldmVudCBhIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBmcm9tIGhpZGluZyB0aGUgb3RoZXIgdGVtcGxhdGVkIGNvbnN0cnVjdG9yICovCisgICAgaW5saW5lIERpYWdvbmFsTWF0cml4KGNvbnN0IERpYWdvbmFsTWF0cml4JiBvdGhlcikgOiBtX2RpYWdvbmFsKG90aGVyLmRpYWdvbmFsKCkpIHt9CisgICAgI2VuZGlmCisKKyAgICAvKiogZ2VuZXJpYyBjb25zdHJ1Y3RvciBmcm9tIGV4cHJlc3Npb24gb2YgdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50cyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBEaWFnb25hbE1hdHJpeChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSA6IG1fZGlhZ29uYWwob3RoZXIpCisgICAge30KKworICAgIC8qKiBDb3B5IG9wZXJhdG9yLiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERpYWdvbmFsTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIG1fZGlhZ29uYWwgPSBvdGhlci5kaWFnb25hbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERpYWdvbmFsTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgRGlhZ29uYWxNYXRyaXgmIG90aGVyKQorICAgIHsKKyAgICAgIG1fZGlhZ29uYWwgPSBvdGhlci5kaWFnb25hbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBSZXNpemVzIHRvIGdpdmVuIHNpemUuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgdm9pZCByZXNpemUoSW5kZXggc2l6ZSkgeyBtX2RpYWdvbmFsLnJlc2l6ZShzaXplKTsgfQorICAgIC8qKiBTZXRzIGFsbCBjb2VmZmljaWVudHMgdG8gemVyby4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSB2b2lkIHNldFplcm8oKSB7IG1fZGlhZ29uYWwuc2V0WmVybygpOyB9CisgICAgLyoqIFJlc2l6ZXMgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyB0byB6ZXJvLiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIHZvaWQgc2V0WmVybyhJbmRleCBzaXplKSB7IG1fZGlhZ29uYWwuc2V0WmVybyhzaXplKTsgfQorICAgIC8qKiBTZXRzIHRoaXMgbWF0cml4IHRvIGJlIHRoZSBpZGVudGl0eSBtYXRyaXggb2YgdGhlIGN1cnJlbnQgc2l6ZS4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSB2b2lkIHNldElkZW50aXR5KCkgeyBtX2RpYWdvbmFsLnNldE9uZXMoKTsgfQorICAgIC8qKiBTZXRzIHRoaXMgbWF0cml4IHRvIGJlIHRoZSBpZGVudGl0eSBtYXRyaXggb2YgdGhlIGdpdmVuIHNpemUuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgdm9pZCBzZXRJZGVudGl0eShJbmRleCBzaXplKSB7IG1fZGlhZ29uYWwuc2V0T25lcyhzaXplKTsgfQorfTsKKworLyoqIFxjbGFzcyBEaWFnb25hbFdyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBfRGlhZ29uYWxWZWN0b3JUeXBlIHRoZSB0eXBlIG9mIHRoZSB2ZWN0b3Igb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIGFuIGV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXgsIGJ1dCBub3Qgc3RvcmluZyBpdHMgb3duIHZlY3RvciBvZiBkaWFnb25hbCBjb2VmZmljaWVudHMsCisgICogaW5zdGVhZCB3cmFwcGluZyBhbiBleGlzdGluZyB2ZWN0b3IgZXhwcmVzc2lvbi4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmFzRGlhZ29uYWwoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBjbGFzcyBEaWFnb25hbE1hdHJpeCwgY2xhc3MgRGlhZ29uYWxCYXNlLCBNYXRyaXhCYXNlOjphc0RpYWdvbmFsKCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9EaWFnb25hbFZlY3RvclR5cGU+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsV3JhcHBlcjxfRGlhZ29uYWxWZWN0b3JUeXBlPiA+Cit7CisgIHR5cGVkZWYgX0RpYWdvbmFsVmVjdG9yVHlwZSBEaWFnb25hbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGlhZ29uYWxWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiBEaWFnb25hbFNoYXBlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxEaWFnb25hbFZlY3RvclR5cGU+OjpYcHJLaW5kIFhwcktpbmQ7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBEaWFnb25hbFZlY3RvclR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwKKyAgICBGbGFncyA9ICAodHJhaXRzPERpYWdvbmFsVmVjdG9yVHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSB8IE5vUHJlZmVycmVkU3RvcmFnZU9yZGVyQml0CisgIH07Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRGlhZ29uYWxWZWN0b3JUeXBlPgorY2xhc3MgRGlhZ29uYWxXcmFwcGVyCisgIDogcHVibGljIERpYWdvbmFsQmFzZTxEaWFnb25hbFdyYXBwZXI8X0RpYWdvbmFsVmVjdG9yVHlwZT4gPiwgaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyAgcHVibGljOgorICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0eXBlZGVmIF9EaWFnb25hbFZlY3RvclR5cGUgRGlhZ29uYWxWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgRGlhZ29uYWxXcmFwcGVyIE5lc3RlZDsKKyAgICAjZW5kaWYKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmcm9tIGV4cHJlc3Npb24gb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzIHRvIHdyYXAuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBleHBsaWNpdCBpbmxpbmUgRGlhZ29uYWxXcmFwcGVyKERpYWdvbmFsVmVjdG9yVHlwZSYgYV9kaWFnb25hbCkgOiBtX2RpYWdvbmFsKGFfZGlhZ29uYWwpIHt9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHdyYXBwZWQgZXhwcmVzc2lvbiBvZiBkaWFnb25hbCBjb2VmZmljaWVudHMuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBEaWFnb25hbFZlY3RvclR5cGUmIGRpYWdvbmFsKCkgY29uc3QgeyByZXR1cm4gbV9kaWFnb25hbDsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBEaWFnb25hbFZlY3RvclR5cGU6Ok5lc3RlZCBtX2RpYWdvbmFsOworfTsKKworLyoqIFxyZXR1cm5zIGEgcHNldWRvLWV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXggd2l0aCAqdGhpcyBhcyB2ZWN0b3Igb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9hc0RpYWdvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfYXNEaWFnb25hbC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBEaWFnb25hbFdyYXBwZXIsIGNsYXNzIERpYWdvbmFsTWF0cml4LCBkaWFnb25hbCgpLCBpc0RpYWdvbmFsKCkKKyAgKiovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IERpYWdvbmFsV3JhcHBlcjxjb25zdCBEZXJpdmVkPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6YXNEaWFnb25hbCgpIGNvbnN0Cit7CisgIHJldHVybiBEaWFnb25hbFdyYXBwZXI8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBhIGRpYWdvbmFsIG1hdHJpeCwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNEaWFnb25hbC5vdXQKKyAgKgorICAqIFxzYSBhc0RpYWdvbmFsKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIE1hdHJpeEJhc2U8RGVyaXZlZD46OmlzRGlhZ29uYWwoY29uc3QgUmVhbFNjYWxhciYgcHJlYykgY29uc3QKK3sKKyAgaWYoY29scygpICE9IHJvd3MoKSkgcmV0dXJuIGZhbHNlOworICBSZWFsU2NhbGFyIG1heEFic09uRGlhZ29uYWwgPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigtMSk7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICB7CisgICAgUmVhbFNjYWxhciBhYnNPbkRpYWdvbmFsID0gbnVtZXh0OjphYnMoY29lZmYoaixqKSk7CisgICAgaWYoYWJzT25EaWFnb25hbCA+IG1heEFic09uRGlhZ29uYWwpIG1heEFic09uRGlhZ29uYWwgPSBhYnNPbkRpYWdvbmFsOworICB9CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gMDsgaSA8IGo7ICsraSkKKyAgICB7CisgICAgICBpZighaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGNvZWZmKGksIGopLCBtYXhBYnNPbkRpYWdvbmFsLCBwcmVjKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihjb2VmZihqLCBpKSwgbWF4QWJzT25EaWFnb25hbCwgcHJlYykpIHJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBzdG9yYWdlX2tpbmRfdG9fc2hhcGU8RGlhZ29uYWxTaGFwZT4geyB0eXBlZGVmIERpYWdvbmFsU2hhcGUgU2hhcGU7IH07CisKK3N0cnVjdCBEaWFnb25hbDJEZW5zZSB7fTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQXNzaWdubWVudEtpbmQ8RGVuc2VTaGFwZSxEaWFnb25hbFNoYXBlPiB7IHR5cGVkZWYgRGlhZ29uYWwyRGVuc2UgS2luZDsgfTsKKworLy8gRGlhZ29uYWwgbWF0cml4IHRvIERlbnNlIGFzc2lnbm1lbnQKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3JjWHByVHlwZSwgRnVuY3RvciwgRGlhZ29uYWwyRGVuc2U+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPiAmLypmdW5jKi8pCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKyAgICAKKyAgICBkc3Quc2V0WmVybygpOworICAgIGRzdC5kaWFnb25hbCgpID0gc3JjLmRpYWdvbmFsKCk7CisgIH0KKyAgCisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJi8qZnVuYyovKQorICB7IGRzdC5kaWFnb25hbCgpICs9IHNyYy5kaWFnb25hbCgpOyB9CisgIAorICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjpzdWJfYXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeyBkc3QuZGlhZ29uYWwoKSAtPSBzcmMuZGlhZ29uYWwoKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ESUFHT05BTE1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9EaWFnb25hbFByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzJiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9EaWFnb25hbFByb2R1Y3QuaApAQCAtMCwwICsxLDI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ESUFHT05BTFBST0RVQ1RfSAorI2RlZmluZSBFSUdFTl9ESUFHT05BTFBST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxyZXR1cm5zIHRoZSBkaWFnb25hbCBtYXRyaXggcHJvZHVjdCBvZiBcYyAqdGhpcyBieSB0aGUgZGlhZ29uYWwgbWF0cml4IFxhIGRpYWdvbmFsLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIERpYWdvbmFsRGVyaXZlZD4KK2lubGluZSBjb25zdCBQcm9kdWN0PERlcml2ZWQsIERpYWdvbmFsRGVyaXZlZCwgTGF6eVByb2R1Y3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvciooY29uc3QgRGlhZ29uYWxCYXNlPERpYWdvbmFsRGVyaXZlZD4gJmFfZGlhZ29uYWwpIGNvbnN0Cit7CisgIHJldHVybiBQcm9kdWN0PERlcml2ZWQsIERpYWdvbmFsRGVyaXZlZCwgTGF6eVByb2R1Y3Q+KGRlcml2ZWQoKSxhX2RpYWdvbmFsLmRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRElBR09OQUxQUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0RvdC5oIGIvRWlnZW4vc3JjL0NvcmUvRG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlZjE4YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RvdC5oCkBAIC0wLDAgKzEsMzE1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4LCAyMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ET1RfSAorI2RlZmluZSBFSUdFTl9ET1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBkb3QoKS4gVGhlIHByb2JsZW0gaXMgdGhhdCBpZiB3ZSBwdXQgdGhhdCBpbiB0aGUgYm9keSBvZiBkb3QoKSwgdGhlbiB1cG9uIGNhbGxpbmcgZG90CisvLyB3aXRoIG1pc21hdGNoZWQgdHlwZXMsIHRoZSBjb21waWxlciBlbWl0cyBlcnJvcnMgYWJvdXQgZmFpbGluZyB0byBpbnN0YW50aWF0ZSBjd2lzZVByb2R1Y3QgQkVGT1JFCisvLyBsb29raW5nIGF0IHRoZSBzdGF0aWMgYXNzZXJ0aW9ucy4gVGh1cyB0aGlzIGlzIGEgdHJpY2sgdG8gZ2V0IGJldHRlciBjb21waWxlIGVycm9ycy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsCisvLyB0aGUgTmVlZFRvVHJhbnNwb3NlIGNvbmRpdGlvbiBoZXJlIGlzIHRha2VuIHN0cmFpZ2h0IGZyb20gQXNzaWduLmgKKyAgICAgICAgIGJvb2wgTmVlZFRvVHJhbnNwb3NlID0gVDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgJiYgVTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgJiYgKChpbnQoVDo6Um93c0F0Q29tcGlsZVRpbWUpID09IDEgJiYgaW50KFU6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgIHwgIC8vIEZJWE1FIHwgaW5zdGVhZCBvZiB8fCB0byBwbGVhc2UgR0NDIDQuNC4wIHN0dXBpZCB3YXJuaW5nICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCAmJiIuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IHRvIHx8IGFzIHNvb24gYXMgbm90IG5lZWRlZCBhbnltb3JlLgorICAgICAgICAgICAgICAgICAgICAoaW50KFQ6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChVOjpSb3dzQXRDb21waWxlVGltZSkgPT0gMSkpCis+CitzdHJ1Y3QgZG90X25vY2hlY2sKK3sKKyAgdHlwZWRlZiBzY2FsYXJfY29ual9wcm9kdWN0X29wPHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLHR5cGVuYW1lIHRyYWl0czxVPjo6U2NhbGFyPiBjb25qX3Byb2Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9wcm9kOjpyZXN1bHRfdHlwZSBSZXNTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVzU2NhbGFyIHJ1bihjb25zdCBNYXRyaXhCYXNlPFQ+JiBhLCBjb25zdCBNYXRyaXhCYXNlPFU+JiBiKQorICB7CisgICAgcmV0dXJuIGEudGVtcGxhdGUgYmluYXJ5RXhwcjxjb25qX3Byb2Q+KGIpLnN1bSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGRvdF9ub2NoZWNrPFQsIFUsIHRydWU+Cit7CisgIHR5cGVkZWYgc2NhbGFyX2NvbmpfcHJvZHVjdF9vcDx0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhcix0eXBlbmFtZSB0cmFpdHM8VT46OlNjYWxhcj4gY29ual9wcm9kOworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfcHJvZDo6cmVzdWx0X3R5cGUgUmVzU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlc1NjYWxhciBydW4oY29uc3QgTWF0cml4QmFzZTxUPiYgYSwgY29uc3QgTWF0cml4QmFzZTxVPiYgYikKKyAgeworICAgIHJldHVybiBhLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGJpbmFyeUV4cHI8Y29ual9wcm9kPihiKS5zdW0oKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcZm4gTWF0cml4QmFzZTo6ZG90CisgICogXHJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mICp0aGlzIHdpdGggb3RoZXIuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogXG5vdGUgSWYgdGhlIHNjYWxhciB0eXBlIGlzIGNvbXBsZXggbnVtYmVycywgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhlcm1pdGlhbgorICAqIChzZXNxdWlsaW5lYXIpIGRvdCBwcm9kdWN0LCBjb25qdWdhdGUtbGluZWFyIGluIHRoZSBmaXJzdCB2YXJpYWJsZSBhbmQgbGluZWFyIGluIHRoZQorICAqIHNlY29uZCB2YXJpYWJsZS4KKyAgKgorICAqIFxzYSBzcXVhcmVkTm9ybSgpLCBub3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQwordHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6U2NhbGFyPjo6UmV0dXJuVHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZG90KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9WRUNUT1JfU0laRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKKyNpZiAhKGRlZmluZWQoRUlHRU5fTk9fU1RBVElDX0FTU0VSVCkgJiYgZGVmaW5lZChFSUdFTl9OT19ERUJVRykpCisgIHR5cGVkZWYgaW50ZXJuYWw6OnNjYWxhcl9jb25qX3Byb2R1Y3Rfb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPiBmdW5jOworICBFSUdFTl9DSEVDS19CSU5BUllfQ09NUEFUSUJJTElZKGZ1bmMsU2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyKTsKKyNlbmRpZgorICAKKyAgZWlnZW5fYXNzZXJ0KHNpemUoKSA9PSBvdGhlci5zaXplKCkpOworCisgIHJldHVybiBpbnRlcm5hbDo6ZG90X25vY2hlY2s8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpydW4oKnRoaXMsIG90aGVyKTsKK30KKworLy8tLS0tLS0tLS0tIGltcGxlbWVudGF0aW9uIG9mIEwyIG5vcm0gYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0KKworLyoqIFxyZXR1cm5zLCBmb3IgdmVjdG9ycywgdGhlIHNxdWFyZWQgXGVtIGwyIG5vcm0gb2YgXGMgKnRoaXMsIGFuZCBmb3IgbWF0cmljZXMgdGhlIEZyb2Jlbml1cyBub3JtLgorICAqIEluIGJvdGggY2FzZXMsIGl0IGNvbnNpc3RzIGluIHRoZSBzdW0gb2YgdGhlIHNxdWFyZSBvZiBhbGwgdGhlIG1hdHJpeCBlbnRyaWVzLgorICAqIEZvciB2ZWN0b3JzLCB0aGlzIGlzIGFsc28gZXF1YWxzIHRvIHRoZSBkb3QgcHJvZHVjdCBvZiBcYyAqdGhpcyB3aXRoIGl0c2VsZi4KKyAgKgorICAqIFxzYSBkb3QoKSwgbm9ybSgpLCBscE5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwgTWF0cml4QmFzZTxEZXJpdmVkPjo6c3F1YXJlZE5vcm0oKSBjb25zdAoreworICByZXR1cm4gbnVtZXh0OjpyZWFsKCgqdGhpcykuY3dpc2VBYnMyKCkuc3VtKCkpOworfQorCisvKiogXHJldHVybnMsIGZvciB2ZWN0b3JzLCB0aGUgXGVtIGwyIG5vcm0gb2YgXGMgKnRoaXMsIGFuZCBmb3IgbWF0cmljZXMgdGhlIEZyb2Jlbml1cyBub3JtLgorICAqIEluIGJvdGggY2FzZXMsIGl0IGNvbnNpc3RzIGluIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc3VtIG9mIHRoZSBzcXVhcmUgb2YgYWxsIHRoZSBtYXRyaXggZW50cmllcy4KKyAgKiBGb3IgdmVjdG9ycywgdGhpcyBpcyBhbHNvIGVxdWFscyB0byB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGRvdCBwcm9kdWN0IG9mIFxjICp0aGlzIHdpdGggaXRzZWxmLgorICAqCisgICogXHNhIGxwTm9ybSgpLCBkb3QoKSwgc3F1YXJlZE5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpub3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIG51bWV4dDo6c3FydChzcXVhcmVkTm9ybSgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHF1b3RpZW50IG9mIFxjICp0aGlzIGJ5IGl0cyBvd24gbm9ybS4KKyAgKgorICAqIFx3YXJuaW5nIElmIHRoZSBpbnB1dCB2ZWN0b3IgaXMgdG9vIHNtYWxsIChpLmUuLCB0aGlzLT5ub3JtKCk9PTApLAorICAqICAgICAgICAgIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY29weSBvZiB0aGUgaW5wdXQuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogXHNhIG5vcm0oKSwgbm9ybWFsaXplKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3QKK01hdHJpeEJhc2U8RGVyaXZlZD46Om5vcm1hbGl6ZWQoKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLDI+Ojp0eXBlIF9OZXN0ZWQ7CisgIF9OZXN0ZWQgbihkZXJpdmVkKCkpOworICBSZWFsU2NhbGFyIHogPSBuLnNxdWFyZWROb3JtKCk7CisgIC8vIE5PVEU6IGFmdGVyIGV4dGVuc2l2ZSBiZW5jaG1hcmtpbmcsIHRoaXMgY29uZGl0aW9uYWwgZG9lcyBub3QgaW1wYWN0IHBlcmZvcm1hbmNlLCBhdCBsZWFzdCBvbiByZWNlbnQgeDg2IENQVQorICBpZih6PlJlYWxTY2FsYXIoMCkpCisgICAgcmV0dXJuIG4gLyBudW1leHQ6OnNxcnQoeik7CisgIGVsc2UKKyAgICByZXR1cm4gbjsKK30KKworLyoqIE5vcm1hbGl6ZXMgdGhlIHZlY3RvciwgaS5lLiBkaXZpZGVzIGl0IGJ5IGl0cyBvd24gbm9ybS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBcd2FybmluZyBJZiB0aGUgaW5wdXQgdmVjdG9yIGlzIHRvbyBzbWFsbCAoaS5lLiwgdGhpcy0+bm9ybSgpPT0wKSwgdGhlbiBcYyAqdGhpcyBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAgKgorICAqIFxzYSBub3JtKCksIG5vcm1hbGl6ZWQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46Om5vcm1hbGl6ZSgpCit7CisgIFJlYWxTY2FsYXIgeiA9IHNxdWFyZWROb3JtKCk7CisgIC8vIE5PVEU6IGFmdGVyIGV4dGVuc2l2ZSBiZW5jaG1hcmtpbmcsIHRoaXMgY29uZGl0aW9uYWwgZG9lcyBub3QgaW1wYWN0IHBlcmZvcm1hbmNlLCBhdCBsZWFzdCBvbiByZWNlbnQgeDg2IENQVQorICBpZih6PlJlYWxTY2FsYXIoMCkpCisgICAgZGVyaXZlZCgpIC89IG51bWV4dDo6c3FydCh6KTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHF1b3RpZW50IG9mIFxjICp0aGlzIGJ5IGl0cyBvd24gbm9ybSB3aGlsZSBhdm9pZGluZyB1bmRlcmZsb3cgYW5kIG92ZXJmbG93LgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgbWV0aG9kIGlzIGFuYWxvZ3VlIHRvIHRoZSBub3JtYWxpemVkKCkgbWV0aG9kLCBidXQgaXQgcmVkdWNlcyB0aGUgcmlzayBvZgorICAqIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgdGhlIG5vcm0uCisgICoKKyAgKiBcd2FybmluZyBJZiB0aGUgaW5wdXQgdmVjdG9yIGlzIHRvbyBzbWFsbCAoaS5lLiwgdGhpcy0+bm9ybSgpPT0wKSwKKyAgKiAgICAgICAgICB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNvcHkgb2YgdGhlIGlucHV0LgorICAqCisgICogXHNhIHN0YWJsZU5vcm0oKSwgc3RhYmxlTm9ybWFsaXplKCksIG5vcm1hbGl6ZWQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdAorTWF0cml4QmFzZTxEZXJpdmVkPjo6c3RhYmxlTm9ybWFsaXplZCgpIGNvbnN0Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMz46OnR5cGUgX05lc3RlZDsKKyAgX05lc3RlZCBuKGRlcml2ZWQoKSk7CisgIFJlYWxTY2FsYXIgdyA9IG4uY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICBSZWFsU2NhbGFyIHogPSAobi93KS5zcXVhcmVkTm9ybSgpOworICBpZih6PlJlYWxTY2FsYXIoMCkpCisgICAgcmV0dXJuIG4gLyAobnVtZXh0OjpzcXJ0KHopKncpOworICBlbHNlCisgICAgcmV0dXJuIG47Cit9CisKKy8qKiBOb3JtYWxpemVzIHRoZSB2ZWN0b3Igd2hpbGUgYXZvaWQgdW5kZXJmbG93IGFuZCBvdmVyZmxvdworICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgbWV0aG9kIGlzIGFuYWxvZ3VlIHRvIHRoZSBub3JtYWxpemUoKSBtZXRob2QsIGJ1dCBpdCByZWR1Y2VzIHRoZSByaXNrIG9mCisgICogdW5kZXJmbG93IGFuZCBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyB0aGUgbm9ybS4KKyAgKgorICAqIFx3YXJuaW5nIElmIHRoZSBpbnB1dCB2ZWN0b3IgaXMgdG9vIHNtYWxsIChpLmUuLCB0aGlzLT5ub3JtKCk9PTApLCB0aGVuIFxjICp0aGlzIGlzIGxlZnQgdW5jaGFuZ2VkLgorICAqCisgICogXHNhIHN0YWJsZU5vcm0oKSwgc3RhYmxlTm9ybWFsaXplZCgpLCBub3JtYWxpemUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OnN0YWJsZU5vcm1hbGl6ZSgpCit7CisgIFJlYWxTY2FsYXIgdyA9IGN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgUmVhbFNjYWxhciB6ID0gKGRlcml2ZWQoKS93KS5zcXVhcmVkTm9ybSgpOworICBpZih6PlJlYWxTY2FsYXIoMCkpCisgICAgZGVyaXZlZCgpIC89IG51bWV4dDo6c3FydCh6KSp3OworfQorCisvLy0tLS0tLS0tLS0gaW1wbGVtZW50YXRpb24gb2Ygb3RoZXIgbm9ybXMgLS0tLS0tLS0tLQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBpbnQgcD4KK3N0cnVjdCBscE5vcm1fc2VsZWN0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciBydW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKKyAgeworICAgIEVJR0VOX1VTSU5HX1NURF9NQVRIKHBvdykKKyAgICByZXR1cm4gcG93KG0uY3dpc2VBYnMoKS5hcnJheSgpLnBvdyhwKS5zdW0oKSwgUmVhbFNjYWxhcigxKS9wKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBscE5vcm1fc2VsZWN0b3I8RGVyaXZlZCwgMT4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgcmV0dXJuIG0uY3dpc2VBYnMoKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBscE5vcm1fc2VsZWN0b3I8RGVyaXZlZCwgMj4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgcmV0dXJuIG0ubm9ybSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGxwTm9ybV9zZWxlY3RvcjxEZXJpdmVkLCBJbmZpbml0eT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciBydW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKKyAgeworICAgIGlmKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPT0wIHx8IChEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYyAmJiBtLnNpemUoKT09MCkpCisgICAgICByZXR1cm4gUmVhbFNjYWxhcigwKTsKKyAgICByZXR1cm4gbS5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJldHVybnMgdGhlIFxiIGNvZWZmaWNpZW50LXdpc2UgXGYkIFxlbGxecCBcZiQgbm9ybSBvZiBcYyAqdGhpcywgdGhhdCBpcywgcmV0dXJucyB0aGUgcC10aCByb290IG9mIHRoZSBzdW0gb2YgdGhlIHAtdGggcG93ZXJzIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMKKyAgKiAgICAgICAgICBvZiB0aGUgY29lZmZpY2llbnRzIG9mIFxjICp0aGlzLiBJZiBcYSBwIGlzIHRoZSBzcGVjaWFsIHZhbHVlIFxhIEVpZ2VuOjpJbmZpbml0eSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBcZiQgXGVsbF5caW5mdHkgXGYkCisgICogICAgICAgICAgbm9ybSwgdGhhdCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMuCisgICoKKyAgKiBJbiBhbGwgY2FzZXMsIGlmIFxjICp0aGlzIGlzIGVtcHR5LCB0aGVuIHRoZSB2YWx1ZSAwIGlzIHJldHVybmVkLgorICAqCisgICogXG5vdGUgRm9yIG1hdHJpY2VzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXB1dGUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJhdG9yX25vcm0iPm9wZXJhdG9yLW5vcm08L2E+LiBUaGF0IGlzLCBpZiBcYyAqdGhpcyBpcyBhIG1hdHJpeCwgdGhlbiBpdHMgY29lZmZpY2llbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhIDFEIHZlY3Rvci4gTm9uZXRoZWxlc3MsIHlvdSBjYW4gZWFzaWx5IGNvbXB1dGUgdGhlIDEtbm9ybSBhbmQgXGYkXGluZnR5XGYkLW5vcm0gbWF0cml4IG9wZXJhdG9yIG5vcm1zIHVzaW5nIFxsaW5rIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9uc05vcm0gcGFydGlhbCByZWR1Y3Rpb25zIFxlbmRsaW5rLgorICAqCisgICogXHNhIG5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGludCBwPgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgoraW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsCisjZWxzZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6UmVhbFNjYWxhcgorI2VuZGlmCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpscE5vcm0oKSBjb25zdAoreworICByZXR1cm4gaW50ZXJuYWw6OmxwTm9ybV9zZWxlY3RvcjxEZXJpdmVkLCBwPjo6cnVuKCp0aGlzKTsKK30KKworLy8tLS0tLS0tLS0tIGltcGxlbWVudGF0aW9uIG9mIGlzT3J0aG9nb25hbCAvIGlzVW5pdGFyeSAtLS0tLS0tLS0tCisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgb3J0aG9nb25hbCB0byBcYSBvdGhlciwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc09ydGhvZ29uYWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pc09ydGhvZ29uYWwub3V0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorYm9vbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc09ydGhvZ29uYWwKKyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwyPjo6dHlwZSBuZXN0ZWQoZGVyaXZlZCgpKTsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPE90aGVyRGVyaXZlZCwyPjo6dHlwZSBvdGhlck5lc3RlZChvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gbnVtZXh0OjphYnMyKG5lc3RlZC5kb3Qob3RoZXJOZXN0ZWQpKSA8PSBwcmVjICogcHJlYyAqIG5lc3RlZC5zcXVhcmVkTm9ybSgpICogb3RoZXJOZXN0ZWQuc3F1YXJlZE5vcm0oKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBhbiB1bml0YXJ5IG1hdHJpeCwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgXGEgU2NhbGFyCisgICogICAgICAgICAgdHlwZSBpcyByZWFsIG51bWJlcnMsIGEgdW5pdGFyeSBtYXRyaXggaXMgYW4gb3J0aG9nb25hbCBtYXRyaXgsIHdoZW5jZSB0aGUgbmFtZS4KKyAgKgorICAqIFxub3RlIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIGZhbWlseSBvZiB2ZWN0b3JzIGZvcm1zIGFuIG9ydGhvbm9ybWFsIGJhc2lzLgorICAqICAgICAgIEluZGVlZCwgXGMgbS5pc1VuaXRhcnkoKSByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGNvbHVtbnMgKGVxdWl2YWxlbnRseSwgdGhlIHJvd3MpIG9mIG0gZm9ybSBhbgorICAqICAgICAgIG9ydGhvbm9ybWFsIGJhc2lzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc1VuaXRhcnkuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pc1VuaXRhcnkub3V0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc1VuaXRhcnkoY29uc3QgUmVhbFNjYWxhciYgcHJlYykgY29uc3QKK3sKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMT46OnR5cGUgc2VsZihkZXJpdmVkKCkpOworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBjb2xzKCk7ICsraSkKKyAgeworICAgIGlmKCFpbnRlcm5hbDo6aXNBcHByb3goc2VsZi5jb2woaSkuc3F1YXJlZE5vcm0oKSwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSksIHByZWMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGk7ICsraikKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oc2VsZi5jb2woaSkuZG90KHNlbGYuY29sKGopKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSwgcHJlYykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ET1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRWlnZW5CYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9FaWdlbkJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTk1NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRWlnZW5CYXNlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FSUdFTkJBU0VfSAorI2RlZmluZSBFSUdFTl9FSUdFTkJBU0VfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIEVpZ2VuQmFzZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogCisgICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBjbGFzc2VzIFQgc3VjaCB0aGF0IE1hdHJpeEJhc2UgaGFzIGFuIG9wZXJhdG9yPShUKSBhbmQgYSBjb25zdHJ1Y3RvciBNYXRyaXhCYXNlKFQpLgorICAqCisgICogSW4gb3RoZXIgd29yZHMsIGFuIEVpZ2VuQmFzZSBvYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNvcGllZCBpbnRvIGEgTWF0cml4QmFzZS4KKyAgKgorICAqIEJlc2lkZXMgTWF0cml4QmFzZS1kZXJpdmVkIGNsYXNzZXMsIHRoaXMgYWxzbyBpbmNsdWRlcyBzcGVjaWFsIG1hdHJpeCBjbGFzc2VzIHN1Y2ggYXMgZGlhZ29uYWwgbWF0cmljZXMsIGV0Yy4KKyAgKgorICAqIE5vdGljZSB0aGF0IHRoaXMgY2xhc3MgaXMgdHJpdmlhbCwgaXQgaXMgb25seSB1c2VkIHRvIGRpc2FtYmlndWF0ZSBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KKyAgKgorICAqIFxzYSBcYmxhbmsgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgRWlnZW5CYXNlCit7CisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPERlcml2ZWQ+Ojp0eXBlIFBsYWluT2JqZWN0OworICAKKyAgLyoqIFxicmllZiBUaGUgaW50ZXJmYWNlIHR5cGUgb2YgaW5kaWNlcworICAgICogXGRldGFpbHMgVG8gY2hhbmdlIHRoaXMsIFxjIFwjZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRS4KKyAgICAqIFxkZXByZWNhdGVkIFNpbmNlIEVpZ2VuIDMuMywgaXRzIHVzYWdlIGlzIGRlcHJlY2F0ZWQuIFVzZSBFaWdlbjo6SW5kZXggaW5zdGVhZC4KKyAgICAqIFxzYSBTdG9yYWdlSW5kZXgsIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzLgorICAgICovCisgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OworCisgIC8vIEZJWE1FIGlzIGl0IG5lZWRlZD8KKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKworICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGRlcml2ZWQgb2JqZWN0ICovCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgIC8qKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZGVyaXZlZCBvYmplY3QgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgRGVyaXZlZCYgY29uc3RfY2FzdF9kZXJpdmVkKCkgY29uc3QKKyAgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPihjb25zdF9jYXN0PEVpZ2VuQmFzZSo+KHRoaXMpKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgY29uc3RfZGVyaXZlZCgpIGNvbnN0CisgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKworICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzLiBcc2EgY29scygpLCBSb3dzQXRDb21waWxlVGltZSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5yb3dzKCk7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gXHNhIHJvd3MoKSwgQ29sc0F0Q29tcGlsZVRpbWUqLworICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5jb2xzKCk7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCB3aGljaCBpcyByb3dzKCkqY29scygpLgorICAgICogXHNhIHJvd3MoKSwgY29scygpLCBTaXplQXRDb21waWxlVGltZS4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgaW5saW5lIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiByb3dzKCkgKiBjb2xzKCk7IH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgPSAqdGhpczsgXGVuZGNvZGUgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeyBkZXJpdmVkKCkuZXZhbFRvKGRzdCk7IH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgKz0gKnRoaXM7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSB2b2lkIGFkZFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sCisgICAgLy8gZGVyaXZlZCBjbGFzcyBjYW4gcmVpbXBsZW1lbnQgaXQgaW4gYSBtb3JlIG9wdGltaXplZCB3YXkuCisgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgcmVzKHJvd3MoKSxjb2xzKCkpOworICAgIGV2YWxUbyhyZXMpOworICAgIGRzdCArPSByZXM7CisgIH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgLT0gKnRoaXM7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSB2b2lkIHN1YlRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sCisgICAgLy8gZGVyaXZlZCBjbGFzcyBjYW4gcmVpbXBsZW1lbnQgaXQgaW4gYSBtb3JlIG9wdGltaXplZCB3YXkuCisgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgcmVzKHJvd3MoKSxjb2xzKCkpOworICAgIGV2YWxUbyhyZXMpOworICAgIGRzdCAtPSByZXM7CisgIH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QuYXBwbHlPblRoZVJpZ2h0KCp0aGlzKTsgXGVuZGNvZGUgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVSaWdodChEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLAorICAgIC8vIGRlcml2ZWQgY2xhc3MgY2FuIHJlaW1wbGVtZW50IGl0IGluIGEgbW9yZSBvcHRpbWl6ZWQgd2F5LgorICAgIGRzdCA9IGRzdCAqIHRoaXMtPmRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBcaW50ZXJuYWwgRG9uJ3QgdXNlIGl0LCBidXQgZG8gdGhlIGVxdWl2YWxlbnQ6IFxjb2RlIGRzdC5hcHBseU9uVGhlTGVmdCgqdGhpcyk7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIGFwcGx5VGhpc09uVGhlTGVmdChEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLAorICAgIC8vIGRlcml2ZWQgY2xhc3MgY2FuIHJlaW1wbGVtZW50IGl0IGluIGEgbW9yZSBvcHRpbWl6ZWQgd2F5LgorICAgIGRzdCA9IHRoaXMtPmRlcml2ZWQoKSAqIGRzdDsKKyAgfQorCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIG1hdHJpeCBiYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxicmllZiBDb3BpZXMgdGhlIGdlbmVyaWMgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvICp0aGlzLgorICAqCisgICogXGRldGFpbHMgVGhlIGV4cHJlc3Npb24gbXVzdCBwcm92aWRlIGEgKHRlbXBsYXRlZCkgZXZhbFRvKERlcml2ZWQmIGRzdCkgY29uc3QKKyAgKiBmdW5jdGlvbiB3aGljaCBkb2VzIHRoZSBhY3R1YWwgam9iLiBJbiBwcmFjdGljZSwgdGhpcyBhbGxvd3MgYW55IHVzZXIgdG8gd3JpdGUKKyAgKiBpdHMgb3duIHNwZWNpYWwgbWF0cml4IHdpdGhvdXQgaGF2aW5nIHRvIG1vZGlmeSBNYXRyaXhCYXNlCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byAqdGhpcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBjYWxsX2Fzc2lnbm1lbnQoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK0Rlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IrPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIGNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLT0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBjYWxsX2Fzc2lnbm1lbnQoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj4oKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRUlHRU5CQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0ZvcmNlQWxpZ25lZEFjY2Vzcy5oIGIvRWlnZW4vc3JjL0NvcmUvRm9yY2VBbGlnbmVkQWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwOGI0NQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0ZvcmNlQWxpZ25lZEFjY2Vzcy5oCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GT1JDRUFMSUdORURBQ0NFU1NfSAorI2RlZmluZSBFSUdFTl9GT1JDRUFMSUdORURBQ0NFU1NfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIEZvcmNlQWxpZ25lZEFjY2VzcworICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRW5mb3JjZSBhbGlnbmVkIHBhY2tldCBsb2FkcyBhbmQgc3RvcmVzIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyByZXF1ZXN0ZWQKKyAgKgorICAqIFxwYXJhbSBFeHByZXNzaW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9mIHdoaWNoIHdlIGFyZSBmb3JjaW5nIGFsaWduZWQgcGFja2V0IGFjY2VzcworICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6Zm9yY2VBbGlnbmVkQWNjZXNzKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmZvcmNlQWxpZ25lZEFjY2VzcygpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3N0cnVjdCB0cmFpdHM8Rm9yY2VBbGlnbmVkQWNjZXNzPEV4cHJlc3Npb25UeXBlPiA+IDogcHVibGljIHRyYWl0czxFeHByZXNzaW9uVHlwZT4KK3t9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgRm9yY2VBbGlnbmVkQWNjZXNzCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgRm9yY2VBbGlnbmVkQWNjZXNzPEV4cHJlc3Npb25UeXBlPiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPEZvcmNlQWxpZ25lZEFjY2Vzcz46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEZvcmNlQWxpZ25lZEFjY2VzcykKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGlubGluZSBGb3JjZUFsaWduZWRBY2Nlc3MoY29uc3QgRXhwcmVzc2lvblR5cGUmIG1hdHJpeCkgOiBtX2V4cHJlc3Npb24obWF0cml4KSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uY29scygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLm91dGVyU3RyaWRlKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uaW5uZXJTdHJpZGUoKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvZWZmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLnRlbXBsYXRlIHBhY2tldDxBbGlnbmVkPihyb3csIGNvbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PEFsaWduZWQ+KHJvdywgY29sLCB4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIGNvbnN0IFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi50ZW1wbGF0ZSBwYWNrZXQ8QWxpZ25lZD4oaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxBbGlnbmVkPihpbmRleCwgeCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgb3BlcmF0b3IgY29uc3QgRXhwcmVzc2lvblR5cGUmKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlJiBtX2V4cHJlc3Npb247CisKKyAgcHJpdmF0ZToKKyAgICBGb3JjZUFsaWduZWRBY2Nlc3MmIG9wZXJhdG9yPShjb25zdCBGb3JjZUFsaWduZWRBY2Nlc3MmKTsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mICp0aGlzIHdpdGggZm9yY2VkIGFsaWduZWQgYWNjZXNzCisgICogXHNhIGZvcmNlQWxpZ25lZEFjY2Vzc0lmKCksY2xhc3MgRm9yY2VBbGlnbmVkQWNjZXNzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6Zm9yY2VBbGlnbmVkQWNjZXNzKCkgY29uc3QKK3sKKyAgcmV0dXJuIEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPihkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiAqdGhpcyB3aXRoIGZvcmNlZCBhbGlnbmVkIGFjY2VzcworICAqIFxzYSBmb3JjZUFsaWduZWRBY2Nlc3NJZigpLCBjbGFzcyBGb3JjZUFsaWduZWRBY2Nlc3MKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpmb3JjZUFsaWduZWRBY2Nlc3MoKQoreworICByZXR1cm4gRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+KGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mICp0aGlzIHdpdGggZm9yY2VkIGFsaWduZWQgYWNjZXNzIGlmIFxhIEVuYWJsZSBpcyB0cnVlLgorICAqIFxzYSBmb3JjZUFsaWduZWRBY2Nlc3MoKSwgY2xhc3MgRm9yY2VBbGlnbmVkQWNjZXNzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8Ym9vbCBFbmFibGU+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxFbmFibGUsRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+LERlcml2ZWQmPjo6dHlwZT46OnR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OmZvcmNlQWxpZ25lZEFjY2Vzc0lmKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsgIC8vIEZJWE1FIFRoaXMgc2hvdWxkIG5vdCB3b3JrIGJ1dCBhcHBhcmVudGx5IGlzIG5ldmVyIHVzZWQKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgKnRoaXMgd2l0aCBmb3JjZWQgYWxpZ25lZCBhY2Nlc3MgaWYgXGEgRW5hYmxlIGlzIHRydWUuCisgICogXHNhIGZvcmNlQWxpZ25lZEFjY2VzcygpLCBjbGFzcyBGb3JjZUFsaWduZWRBY2Nlc3MKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxib29sIEVuYWJsZT4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8RW5hYmxlLEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPixEZXJpdmVkJj46OnR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OmZvcmNlQWxpZ25lZEFjY2Vzc0lmKCkKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsgIC8vIEZJWE1FIFRoaXMgc2hvdWxkIG5vdCB3b3JrIGJ1dCBhcHBhcmVudGx5IGlzIG5ldmVyIHVzZWQKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9GT1JDRUFMSUdORURBQ0NFU1NfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRnV6enkuaCBiL0VpZ2VuL3NyYy9Db3JlL0Z1enp5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MDNhMAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0Z1enp5LmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0ZVWlpZX0gKKyNkZWZpbmUgRUlHRU5fRlVaWllfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsCit7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBpc19pbnRlZ2VyID0gTnVtVHJhaXRzPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj46OklzSW50ZWdlcj4KK3N0cnVjdCBpc0FwcHJveF9zZWxlY3RvcgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgT3RoZXJEZXJpdmVkJiB5LCBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyJiBwcmVjKQorICB7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMj46OnR5cGUgbmVzdGVkKHgpOworICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxPdGhlckRlcml2ZWQsMj46OnR5cGUgb3RoZXJOZXN0ZWQoeSk7CisgICAgcmV0dXJuIChuZXN0ZWQgLSBvdGhlck5lc3RlZCkuY3dpc2VBYnMyKCkuc3VtKCkgPD0gcHJlYyAqIHByZWMgKiBudW1leHQ6Om1pbmkobmVzdGVkLmN3aXNlQWJzMigpLnN1bSgpLCBvdGhlck5lc3RlZC5jd2lzZUFiczIoKS5zdW0oKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3N0cnVjdCBpc0FwcHJveF9zZWxlY3RvcjxEZXJpdmVkLCBPdGhlckRlcml2ZWQsIHRydWU+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBEZXJpdmVkJiB4LCBjb25zdCBPdGhlckRlcml2ZWQmIHksIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHgubWF0cml4KCkgPT0geS5tYXRyaXgoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBib29sIGlzX2ludGVnZXIgPSBOdW1UcmFpdHM8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPjo6SXNJbnRlZ2VyPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX29iamVjdF9zZWxlY3RvcgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgT3RoZXJEZXJpdmVkJiB5LCBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyJiBwcmVjKQorICB7CisgICAgcmV0dXJuIHguY3dpc2VBYnMyKCkuc3VtKCkgPD0gbnVtZXh0OjphYnMyKHByZWMpICogeS5jd2lzZUFiczIoKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX29iamVjdF9zZWxlY3RvcjxEZXJpdmVkLCBPdGhlckRlcml2ZWQsIHRydWU+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBEZXJpdmVkJiB4LCBjb25zdCBPdGhlckRlcml2ZWQmLCBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyJikKKyAgeworICAgIHJldHVybiB4Lm1hdHJpeCgpID09IERlcml2ZWQ6Olplcm8oeC5yb3dzKCksIHguY29scygpKS5tYXRyaXgoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgYm9vbCBpc19pbnRlZ2VyID0gTnVtVHJhaXRzPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj46OklzSW50ZWdlcj4KK3N0cnVjdCBpc011Y2hTbWFsbGVyVGhhbl9zY2FsYXJfc2VsZWN0b3IKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQmIHgsIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXImIHksIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXImIHByZWMpCisgIHsKKyAgICByZXR1cm4geC5jd2lzZUFiczIoKS5zdW0oKSA8PSBudW1leHQ6OmFiczIocHJlYyAqIHkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX3NjYWxhcl9zZWxlY3RvcjxEZXJpdmVkLCB0cnVlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciYsIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHgubWF0cml4KCkgPT0gRGVyaXZlZDo6WmVybyh4LnJvd3MoKSwgeC5jb2xzKCkpLm1hdHJpeCgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgKgorICAqIFxub3RlIFRoZSBmdXp6eSBjb21wYXJlcyBhcmUgZG9uZSBtdWx0aXBsaWNhdGl2ZWx5LiBUd28gdmVjdG9ycyBcZiQgdiBcZiQgYW5kIFxmJCB3IFxmJAorICAqIGFyZSBjb25zaWRlcmVkIHRvIGJlIGFwcHJveGltYXRlbHkgZXF1YWwgd2l0aGluIHByZWNpc2lvbiBcZiQgcCBcZiQgaWYKKyAgKiBcZlsgXFZlcnQgdiAtIHcgXFZlcnQgXGxlcXNsYW50IHBcLFxtaW4oXFZlcnQgdlxWZXJ0LCBcVmVydCB3XFZlcnQpLiBcZl0KKyAgKiBGb3IgbWF0cmljZXMsIHRoZSBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgdGhlIEhpbGJlcnQtU2NobWlkdCBub3JtIChha2EgRnJvYmVuaXVzIG5vcm0KKyAgKiBMMiBub3JtKS4KKyAgKgorICAqIFxub3RlIEJlY2F1c2Ugb2YgdGhlIG11bHRpcGxpY2F0aXZlbmVzcyBvZiB0aGlzIGNvbXBhcmlzb24sIG9uZSBjYW4ndCB1c2UgdGhpcyBmdW5jdGlvbgorICAqIHRvIGNoZWNrIHdoZXRoZXIgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB0aGUgemVybyBtYXRyaXggb3IgdmVjdG9yLgorICAqIEluZGVlZCwgXGMgaXNBcHByb3goemVybykgcmV0dXJucyBmYWxzZSB1bmxlc3MgXGMgKnRoaXMgaXRzZWxmIGlzIGV4YWN0bHkgdGhlIHplcm8gbWF0cml4CisgICogb3IgdmVjdG9yLiBJZiB5b3Ugd2FudCB0byB0ZXN0IHdoZXRoZXIgXGMgKnRoaXMgaXMgemVybywgdXNlIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihjb25zdAorICAqIFJlYWxTY2FsYXImLCBSZWFsU2NhbGFyKSBpbnN0ZWFkLgorICAqCisgICogXHNhIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihjb25zdCBSZWFsU2NhbGFyJiwgUmVhbFNjYWxhcikgY29uc3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Citib29sIERlbnNlQmFzZTxEZXJpdmVkPjo6aXNBcHByb3goCisgIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwKKyAgY29uc3QgUmVhbFNjYWxhciYgcHJlYworKSBjb25zdAoreworICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94X3NlbGVjdG9yPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgcHJlYyk7Cit9CisKKy8qKiBccmV0dXJucyBcYyB0cnVlIGlmIHRoZSBub3JtIG9mIFxjICp0aGlzIGlzIG11Y2ggc21hbGxlciB0aGFuIFxhIG90aGVyLAorICAqIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgKgorICAqIFxub3RlIFRoZSBmdXp6eSBjb21wYXJlcyBhcmUgZG9uZSBtdWx0aXBsaWNhdGl2ZWx5LiBBIHZlY3RvciBcZiQgdiBcZiQgaXMKKyAgKiBjb25zaWRlcmVkIHRvIGJlIG11Y2ggc21hbGxlciB0aGFuIFxmJCB4IFxmJCB3aXRoaW4gcHJlY2lzaW9uIFxmJCBwIFxmJCBpZgorICAqIFxmWyBcVmVydCB2IFxWZXJ0IFxsZXFzbGFudCBwXCxcdmVydCB4XHZlcnQuIFxmXQorICAqCisgICogRm9yIG1hdHJpY2VzLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIHVzaW5nIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybS4gRm9yIHRoaXMgcmVhc29uLAorICAqIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNjYWxhciBcYSBvdGhlciBzaG91bGQgY29tZSBmcm9tIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybQorICAqIG9mIGEgcmVmZXJlbmNlIG1hdHJpeCBvZiBzYW1lIGRpbWVuc2lvbnMuCisgICoKKyAgKiBcc2EgaXNBcHByb3goKSwgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mLCBSZWFsU2NhbGFyKSBjb25zdAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc011Y2hTbWFsbGVyVGhhbigKKyAgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIG90aGVyLAorICBjb25zdCBSZWFsU2NhbGFyJiBwcmVjCispIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW5fc2NhbGFyX3NlbGVjdG9yPERlcml2ZWQ+OjpydW4oZGVyaXZlZCgpLCBvdGhlciwgcHJlYyk7Cit9CisKKy8qKiBccmV0dXJucyBcYyB0cnVlIGlmIHRoZSBub3JtIG9mIFxjICp0aGlzIGlzIG11Y2ggc21hbGxlciB0aGFuIHRoZSBub3JtIG9mIFxhIG90aGVyLAorICAqIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgKgorICAqIFxub3RlIFRoZSBmdXp6eSBjb21wYXJlcyBhcmUgZG9uZSBtdWx0aXBsaWNhdGl2ZWx5LiBBIHZlY3RvciBcZiQgdiBcZiQgaXMKKyAgKiBjb25zaWRlcmVkIHRvIGJlIG11Y2ggc21hbGxlciB0aGFuIGEgdmVjdG9yIFxmJCB3IFxmJCB3aXRoaW4gcHJlY2lzaW9uIFxmJCBwIFxmJCBpZgorICAqIFxmWyBcVmVydCB2IFxWZXJ0IFxsZXFzbGFudCBwXCxcVmVydCB3XFZlcnQuIFxmXQorICAqIEZvciBtYXRyaWNlcywgdGhlIGNvbXBhcmlzb24gaXMgZG9uZSB1c2luZyB0aGUgSGlsYmVydC1TY2htaWR0IG5vcm0uCisgICoKKyAgKiBcc2EgaXNBcHByb3goKSwgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgUmVhbFNjYWxhciYsIFJlYWxTY2FsYXIpIGNvbnN0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmlzTXVjaFNtYWxsZXJUaGFuKAorICBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsCisgIGNvbnN0IFJlYWxTY2FsYXImIHByZWMKKykgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbl9vYmplY3Rfc2VsZWN0b3I8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBwcmVjKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9GVVpaWV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9HZW5lcmFsUHJvZHVjdC5oIGIvRWlnZW4vc3JjL0NvcmUvR2VuZXJhbFByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE2Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvR2VuZXJhbFByb2R1Y3QuaApAQCAtMCwwICsxLDQ1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUkFMX1BST0RVQ1RfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX1BST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geworCitlbnVtIHsKKyAgTGFyZ2UgPSAyLAorICBTbWFsbCA9IDMKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPGludCBSb3dzLCBpbnQgQ29scywgaW50IERlcHRoPiBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yOworCit0ZW1wbGF0ZTxpbnQgU2l6ZSwgaW50IE1heFNpemU+IHN0cnVjdCBwcm9kdWN0X3NpemVfY2F0ZWdvcnkKK3sKKyAgZW51bSB7IGlzX2xhcmdlID0gTWF4U2l6ZSA9PSBEeW5hbWljIHx8CisgICAgICAgICAgICAgICAgICAgIFNpemUgPj0gRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCB8fAorICAgICAgICAgICAgICAgICAgICAoU2l6ZT09RHluYW1pYyAmJiBNYXhTaXplPj1FSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xEKSwKKyAgICAgICAgIHZhbHVlID0gaXNfbGFyZ2UgID8gTGFyZ2UKKyAgICAgICAgICAgICAgIDogU2l6ZSA9PSAxID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTbWFsbAorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBwcm9kdWN0X3R5cGUKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGUgX0xoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFJocz46OnR5cGUgX1JoczsKKyAgZW51bSB7CisgICAgTWF4Um93cyA9IHRyYWl0czxfTGhzPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgUm93cyAgICA9IHRyYWl0czxfTGhzPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29scyA9IHRyYWl0czxfUmhzPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgQ29scyAgICA9IHRyYWl0czxfUmhzPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4RGVwdGggPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQodHJhaXRzPF9MaHM+OjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHM8X1Jocz46Ok1heFJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBEZXB0aCA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRCh0cmFpdHM8X0xocz46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0czxfUmhzPjo6Um93c0F0Q29tcGlsZVRpbWUpCisgIH07CisKKyAgLy8gdGhlIHNwbGl0dGluZyBpbnRvIGRpZmZlcmVudCBsaW5lcyBvZiBjb2RlIGhlcmUsIGludHJvZHVjaW5nIHRoZSBfc2VsZWN0IGVudW1zIGFuZCB0aGUgdHlwZWRlZiBiZWxvdywKKyAgLy8gaXMgdG8gd29yayBhcm91bmQgYW4gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igd2l0aCBnY2MgNC4xIGFuZCA0LjIuCitwcml2YXRlOgorICBlbnVtIHsKKyAgICByb3dzX3NlbGVjdCA9IHByb2R1Y3Rfc2l6ZV9jYXRlZ29yeTxSb3dzLE1heFJvd3M+Ojp2YWx1ZSwKKyAgICBjb2xzX3NlbGVjdCA9IHByb2R1Y3Rfc2l6ZV9jYXRlZ29yeTxDb2xzLE1heENvbHM+Ojp2YWx1ZSwKKyAgICBkZXB0aF9zZWxlY3QgPSBwcm9kdWN0X3NpemVfY2F0ZWdvcnk8RGVwdGgsTWF4RGVwdGg+Ojp2YWx1ZQorICB9OworICB0eXBlZGVmIHByb2R1Y3RfdHlwZV9zZWxlY3Rvcjxyb3dzX3NlbGVjdCwgY29sc19zZWxlY3QsIGRlcHRoX3NlbGVjdD4gc2VsZWN0b3I7CisKK3B1YmxpYzoKKyAgZW51bSB7CisgICAgdmFsdWUgPSBzZWxlY3Rvcjo6cmV0LAorICAgIHJldCA9IHNlbGVjdG9yOjpyZXQKKyAgfTsKKyNpZmRlZiBFSUdFTl9ERUJVR19QUk9EVUNUCisgIHN0YXRpYyB2b2lkIGRlYnVnKCkKKyAgeworICAgICAgRUlHRU5fREVCVUdfVkFSKFJvd3MpOworICAgICAgRUlHRU5fREVCVUdfVkFSKENvbHMpOworICAgICAgRUlHRU5fREVCVUdfVkFSKERlcHRoKTsKKyAgICAgIEVJR0VOX0RFQlVHX1ZBUihyb3dzX3NlbGVjdCk7CisgICAgICBFSUdFTl9ERUJVR19WQVIoY29sc19zZWxlY3QpOworICAgICAgRUlHRU5fREVCVUdfVkFSKGRlcHRoX3NlbGVjdCk7CisgICAgICBFSUdFTl9ERUJVR19WQVIodmFsdWUpOworICB9CisjZW5kaWYKK307CisKKy8qIFRoZSBmb2xsb3dpbmcgYWxsb3dzIHRvIHNlbGVjdCB0aGUga2luZCBvZiBwcm9kdWN0IGF0IGNvbXBpbGUgdGltZQorICogYmFzZWQgb24gdGhlIHRocmVlIGRpbWVuc2lvbnMgb2YgdGhlIHByb2R1Y3QuCisgKiBUaGlzIGlzIGEgY29tcGlsZSB0aW1lIG1hcHBpbmcgZnJvbSB7MSxTbWFsbCxMYXJnZX1eMyAtPiB7cHJvZHVjdCB0eXBlc30gKi8KKy8vIEZJWE1FIEknbSBub3Qgc3VyZSB0aGUgY3VycmVudCBtYXBwaW5nIGlzIHRoZSBpZGVhbCBvbmUuCit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4+ICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPE0sTiwxPiAgICAgICAgICAgICAgeyBlbnVtIHsgcmV0ID0gT3V0ZXJQcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTxpbnQgTT4gICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPE0sIDEsIDE+ICAgICAgICAgICAgeyBlbnVtIHsgcmV0ID0gTGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8aW50IE4+ICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjwxLCBOLCAxPiAgICAgICAgICAgIHsgZW51bSB7IHJldCA9IExhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPGludCBEZXB0aD4gICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgMSwgICAgRGVwdGg+ICB7IGVudW0geyByZXQgPSBJbm5lclByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgMSwgICAgMT4gICAgICB7IGVudW0geyByZXQgPSBJbm5lclByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsMSwgICAgU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsIFNtYWxsLCAxPiAgICB7IGVudW0geyByZXQgPSBMYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlIH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLCBMYXJnZSwgMT4gICAgeyBlbnVtIHsgcmV0ID0gTGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwgU21hbGwsIDE+ICAgIHsgZW51bSB7IHJldCA9IExhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgTGFyZ2UsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgTGFyZ2UsTGFyZ2U+ICB7IGVudW0geyByZXQgPSBHZW12UHJvZHVjdCB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjwxLCAgICBTbWFsbCxMYXJnZT4gIHsgZW51bSB7IHJldCA9IENvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwxLCAgICBTbWFsbD4gIHsgZW51bSB7IHJldCA9IENvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwxLCAgICBMYXJnZT4gIHsgZW51bSB7IHJldCA9IEdlbXZQcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLDEsICAgIExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gQ29lZmZCYXNlZFByb2R1Y3RNb2RlIH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLFNtYWxsLExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gR2VtbVByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TGFyZ2UsU21hbGwsTGFyZ2U+ICB7IGVudW0geyByZXQgPSBHZW1tUHJvZHVjdCB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxTbWFsbCxMYXJnZSxMYXJnZT4gIHsgZW51bSB7IHJldCA9IEdlbW1Qcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPExhcmdlLExhcmdlLExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gR2VtbVByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TGFyZ2UsU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsTGFyZ2UsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TGFyZ2UsTGFyZ2UsU21hbGw+ICB7IGVudW0geyByZXQgPSBHZW1tUHJvZHVjdCB9OyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbXBsZW1lbnRhdGlvbiBvZiBJbm5lciBWZWN0b3IgVmVjdG9yIFByb2R1Y3QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBGSVhNRSA6IG1heWJlIHRoZSAiaW5uZXIgcHJvZHVjdCIgY291bGQgcmV0dXJuIGEgU2NhbGFyCisvLyBpbnN0ZWFkIG9mIGEgMXgxIG1hdHJpeCA/PworLy8gUHJvOiBtb3JlIG5hdHVyYWwgZm9yIHRoZSB1c2VyCisvLyBDb25zOiB0aGlzIGNvdWxkIGJlIGEgcHJvYmxlbSBpZiBpbiBhIG1ldGEgdW5yb2xsZWQgYWxnb3JpdGhtIGEgbWF0cml4LW1hdHJpeAorLy8gcHJvZHVjdCBlbmRzIHVwIHRvIGEgcm93LXZlY3RvciB0aW1lcyBjb2wtdmVjdG9yIHByb2R1Y3QuLi4gVG8gdGFja2xlIHRoaXMgdXNlCisvLyBjYXNlLCB3ZSBjb3VsZCBoYXZlIGEgc3BlY2lhbGl6YXRpb24gZm9yIEJsb2NrPE1hdHJpeFR5cGUsMSwxPiB3aXRoOiBvcGVyYXRvcj0oU2NhbGFyIHgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEltcGxlbWVudGF0aW9uIG9mIE91dGVyIFZlY3RvciBWZWN0b3IgUHJvZHVjdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW1wbGVtZW50YXRpb24gb2YgR2VuZXJhbCBNYXRyaXggVmVjdG9yIFByb2R1Y3QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgQWNjb3JkaW5nIHRvIHRoZSBzaGFwZS9mbGFncyBvZiB0aGUgbWF0cml4IHdlIGhhdmUgdG8gZGlzdGluZ2hpc2ggMyBkaWZmZXJlbnQgY2FzZXM6CisgKiAgIDEgLSB0aGUgbWF0cml4IGlzIGNvbC1tYWpvciwgQkxBUyBjb21wYXRpYmxlIGFuZCBNIGlzIGxhcmdlID0+IGNhbGwgZmFzdCBCTEFTLWxpa2UgY29sbWFqb3Igcm91dGluZQorICogICAyIC0gdGhlIG1hdHJpeCBpcyByb3ctbWFqb3IsIEJMQVMgY29tcGF0aWJsZSBhbmQgTiBpcyBsYXJnZSA9PiBjYWxsIGZhc3QgQkxBUy1saWtlIHJvd21ham9yIHJvdXRpbmUKKyAqICAgMyAtIGFsbCBvdGhlciBjYXNlcyBhcmUgaGFuZGxlZCB1c2luZyBhIHNpbXBsZSBsb29wIGFsb25nIHRoZSBvdXRlci1zdG9yYWdlIGRpcmVjdGlvbi4KKyAqICBUaGVyZWZvcmUgd2UgbmVlZCBhIGxvd2VyIGxldmVsIG1ldGEgc2VsZWN0b3IuCisgKiAgRnVydGhlcm1vcmUsIGlmIHRoZSBtYXRyaXggaXMgdGhlIHJocywgdGhlbiB0aGUgcHJvZHVjdCBoYXMgdG8gYmUgdHJhbnNwb3NlZC4KKyAqLworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8aW50IFNpZGUsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQmxhc0NvbXBhdGlibGU+CitzdHJ1Y3QgZ2Vtdl9kZW5zZV9zZWxlY3RvcjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZSxpbnQgTWF4U2l6ZSxib29sIENvbmQ+IHN0cnVjdCBnZW12X3N0YXRpY192ZWN0b3JfaWY7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZSxpbnQgTWF4U2l6ZT4KK3N0cnVjdCBnZW12X3N0YXRpY192ZWN0b3JfaWY8U2NhbGFyLFNpemUsTWF4U2l6ZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSAgU2NhbGFyKiBkYXRhKCkgeyBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoZmFsc2UgJiYgInNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgcmV0dXJuIDA7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZT4KK3N0cnVjdCBnZW12X3N0YXRpY192ZWN0b3JfaWY8U2NhbGFyLFNpemUsRHluYW1pYyx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogZGF0YSgpIHsgcmV0dXJuIDA7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZSxpbnQgTWF4U2l6ZT4KK3N0cnVjdCBnZW12X3N0YXRpY192ZWN0b3JfaWY8U2NhbGFyLFNpemUsTWF4U2l6ZSx0cnVlPgoreworICBlbnVtIHsKKyAgICBGb3JjZUFsaWdubWVudCAgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUsCisgICAgUGFja2V0U2l6ZSAgICAgID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZQorICB9OworICAjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyE9MAorICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8U2NhbGFyLEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChTaXplLE1heFNpemUpLDAsRUlHRU5fUExBSU5fRU5VTV9NSU4oQWxpZ25lZE1heCxQYWNrZXRTaXplKT4gbV9kYXRhOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogZGF0YSgpIHsgcmV0dXJuIG1fZGF0YS5hcnJheTsgfQorICAjZWxzZQorICAvLyBTb21lIGFyY2hpdGVjdHVyZXMgY2Fubm90IGFsaWduIG9uIHRoZSBzdGFjaywKKyAgLy8gPT4gbGV0J3MgbWFudWFsbHkgZW5mb3JjZSBhbGlnbm1lbnQgYnkgYWxsb2NhdGluZyBtb3JlIGRhdGEgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYWxpZ25lZCBlbGVtZW50LgorICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8U2NhbGFyLEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChTaXplLE1heFNpemUpKyhGb3JjZUFsaWdubWVudD9FSUdFTl9NQVhfQUxJR05fQllURVM6MCksMD4gbV9kYXRhOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogZGF0YSgpIHsKKyAgICByZXR1cm4gRm9yY2VBbGlnbm1lbnQKKyAgICAgICAgICAgID8gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPigoaW50ZXJuYWw6OlVJbnRQdHIobV9kYXRhLmFycmF5KSAmIH4oc3RkOjpzaXplX3QoRUlHRU5fTUFYX0FMSUdOX0JZVEVTLTEpKSkgKyBFSUdFTl9NQVhfQUxJR05fQllURVMpCisgICAgICAgICAgICA6IG1fZGF0YS5hcnJheTsKKyAgfQorICAjZW5kaWYKK307CisKKy8vIFRoZSB2ZWN0b3IgaXMgb24gdGhlIGxlZnQgPT4gdHJhbnNwb3NpdGlvbgordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlciwgYm9vbCBCbGFzQ29tcGF0aWJsZT4KK3N0cnVjdCBnZW12X2RlbnNlX3NlbGVjdG9yPE9uVGhlTGVmdCxTdG9yYWdlT3JkZXIsQmxhc0NvbXBhdGlibGU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBEZXN0JiBkZXN0LCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgVHJhbnNwb3NlPERlc3Q+IGRlc3RUKGRlc3QpOworICAgIGVudW0geyBPdGhlclN0b3JhZ2VPcmRlciA9IFN0b3JhZ2VPcmRlciA9PSBSb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IgfTsKKyAgICBnZW12X2RlbnNlX3NlbGVjdG9yPE9uVGhlUmlnaHQsT3RoZXJTdG9yYWdlT3JkZXIsQmxhc0NvbXBhdGlibGU+CisgICAgICA6OnJ1bihyaHMudHJhbnNwb3NlKCksIGxocy50cmFuc3Bvc2UoKSwgZGVzdFQsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2Vtdl9kZW5zZV9zZWxlY3RvcjxPblRoZVJpZ2h0LENvbE1ham9yLHRydWU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IExocyAmbGhzLCBjb25zdCBSaHMgJnJocywgRGVzdCYgZGVzdCwgY29uc3QgdHlwZW5hbWUgRGVzdDo6U2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpTY2FsYXIgICBMaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciAgIFJoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlNjYWxhciAgUmVzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6UmVhbFNjYWxhciAgUmVhbFNjYWxhcjsKKyAgICAKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxMaHM+IExoc0JsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8UmhzPiBSaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxSaHNUeXBlOworICAKKyAgICB0eXBlZGVmIE1hcDxNYXRyaXg8UmVzU2NhbGFyLER5bmFtaWMsMT4sIEVJR0VOX1BMQUlOX0VOVU1fTUlOKEFsaWduZWRNYXgsaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSk+IE1hcHBlZERlc3Q7CisKKyAgICBBY3R1YWxMaHNUeXBlIGFjdHVhbExocyA9IExoc0JsYXNUcmFpdHM6OmV4dHJhY3QobGhzKTsKKyAgICBBY3R1YWxSaHNUeXBlIGFjdHVhbFJocyA9IFJoc0JsYXNUcmFpdHM6OmV4dHJhY3QocmhzKTsKKworICAgIFJlc1NjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihsaHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKHJocyk7CisKKyAgICAvLyBtYWtlIHN1cmUgRGVzdCBpcyBhIGNvbXBpbGUtdGltZSB2ZWN0b3IgdHlwZSAoYnVnIDExNjYpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxEZXN0OjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIERlc3QsIHR5cGVuYW1lIERlc3Q6OkNvbFhwcj46OnR5cGUgQWN0dWFsRGVzdDsKKworICAgIGVudW0geworICAgICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhbGxvdyBhbiBpbm5lciBzdHJpZGUgb24gdGhlIHJlc3VsdCBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKyAgICAgIC8vIG9uLCB0aGUgb3RoZXIgaGFuZCBpdCBpcyBnb29kIGZvciB0aGUgY2FjaGUgdG8gcGFjayB0aGUgdmVjdG9yIGFueXdheXMuLi4KKyAgICAgIEV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lID0gKEFjdHVhbERlc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSksCisgICAgICBDb21wbGV4QnlSZWFsID0gKE51bVRyYWl0czxMaHNTY2FsYXI+OjpJc0NvbXBsZXgpICYmICghTnVtVHJhaXRzPFJoc1NjYWxhcj46OklzQ29tcGxleCksCisgICAgICBNaWdodENhbm5vdFVzZURlc3QgPSAoIUV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lKSB8fCBDb21wbGV4QnlSZWFsCisgICAgfTsKKworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxMaHNTY2FsYXIsSW5kZXgsQ29sTWFqb3I+IExoc01hcHBlcjsKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8UmhzU2NhbGFyLEluZGV4LFJvd01ham9yPiBSaHNNYXBwZXI7CisgICAgUmhzU2NhbGFyIGNvbXBhdGlibGVBbHBoYSA9IGdldF9mYWN0b3I8UmVzU2NhbGFyLFJoc1NjYWxhcj46OnJ1bihhY3R1YWxBbHBoYSk7CisKKyAgICBpZighTWlnaHRDYW5ub3RVc2VEZXN0KQorICAgIHsKKyAgICAgIC8vIHNob3J0Y3V0IGlmIHdlIGFyZSBzdXJlIHRvIGJlIGFibGUgdG8gdXNlIGRlc3QgZGlyZWN0bHksCisgICAgICAvLyB0aGlzIGVhc2UgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGNsZWFuZXIgYW5kIG1vcmUgb3B0aW16aXplZCBjb2RlIGZvciBtb3N0IGNvbW1vbiBjYXNlcworICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QKKyAgICAgICAgICA8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixDb2xNYWpvcixMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsUmhzU2NhbGFyLFJoc01hcHBlcixSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGU+OjpydW4oCisgICAgICAgICAgYWN0dWFsTGhzLnJvd3MoKSwgYWN0dWFsTGhzLmNvbHMoKSwKKyAgICAgICAgICBMaHNNYXBwZXIoYWN0dWFsTGhzLmRhdGEoKSwgYWN0dWFsTGhzLm91dGVyU3RyaWRlKCkpLAorICAgICAgICAgIFJoc01hcHBlcihhY3R1YWxSaHMuZGF0YSgpLCBhY3R1YWxSaHMuaW5uZXJTdHJpZGUoKSksCisgICAgICAgICAgZGVzdC5kYXRhKCksIDEsCisgICAgICAgICAgY29tcGF0aWJsZUFscGhhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxSZXNTY2FsYXIsQWN0dWFsRGVzdDo6U2l6ZUF0Q29tcGlsZVRpbWUsQWN0dWFsRGVzdDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsTWlnaHRDYW5ub3RVc2VEZXN0PiBzdGF0aWNfZGVzdDsKKworICAgICAgY29uc3QgYm9vbCBhbHBoYUlzQ29tcGF0aWJsZSA9ICghQ29tcGxleEJ5UmVhbCkgfHwgKG51bWV4dDo6aW1hZyhhY3R1YWxBbHBoYSk9PVJlYWxTY2FsYXIoMCkpOworICAgICAgY29uc3QgYm9vbCBldmFsVG9EZXN0ID0gRXZhbFRvRGVzdEF0Q29tcGlsZVRpbWUgJiYgYWxwaGFJc0NvbXBhdGlibGU7CisKKyAgICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSZXNTY2FsYXIsYWN0dWFsRGVzdFB0cixkZXN0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsVG9EZXN0ID8gZGVzdC5kYXRhKCkgOiBzdGF0aWNfZGVzdC5kYXRhKCkpOworCisgICAgICBpZighZXZhbFRvRGVzdCkKKyAgICAgIHsKKyAgICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgICAgSW5kZXggc2l6ZSA9IGRlc3Quc2l6ZSgpOworICAgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAgICNlbmRpZgorICAgICAgICBpZighYWxwaGFJc0NvbXBhdGlibGUpCisgICAgICAgIHsKKyAgICAgICAgICBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKS5zZXRaZXJvKCk7CisgICAgICAgICAgY29tcGF0aWJsZUFscGhhID0gUmhzU2NhbGFyKDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKSA9IGRlc3Q7CisgICAgICB9CisKKyAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICAgICAgPEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsQ29sTWFqb3IsTGhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLFJoc1NjYWxhcixSaHNNYXBwZXIsUmhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlPjo6cnVuKAorICAgICAgICAgIGFjdHVhbExocy5yb3dzKCksIGFjdHVhbExocy5jb2xzKCksCisgICAgICAgICAgTGhzTWFwcGVyKGFjdHVhbExocy5kYXRhKCksIGFjdHVhbExocy5vdXRlclN0cmlkZSgpKSwKKyAgICAgICAgICBSaHNNYXBwZXIoYWN0dWFsUmhzLmRhdGEoKSwgYWN0dWFsUmhzLmlubmVyU3RyaWRlKCkpLAorICAgICAgICAgIGFjdHVhbERlc3RQdHIsIDEsCisgICAgICAgICAgY29tcGF0aWJsZUFscGhhKTsKKworICAgICAgaWYgKCFldmFsVG9EZXN0KQorICAgICAgeworICAgICAgICBpZighYWxwaGFJc0NvbXBhdGlibGUpCisgICAgICAgICAgZGVzdC5tYXRyaXgoKSArPSBhY3R1YWxBbHBoYSAqIE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgZGVzdCA9IE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2Vtdl9kZW5zZV9zZWxlY3RvcjxPblRoZVJpZ2h0LFJvd01ham9yLHRydWU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBEZXN0JiBkZXN0LCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OlNjYWxhciAgIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyICAgUmhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyICBSZXNTY2FsYXI7CisgICAgCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHNUeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPFJocz4gUmhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsUmhzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJoc1R5cGU+Ojp0eXBlIEFjdHVhbFJoc1R5cGVDbGVhbmVkOworCisgICAgdHlwZW5hbWUgYWRkX2NvbnN0PEFjdHVhbExoc1R5cGU+Ojp0eXBlIGFjdHVhbExocyA9IExoc0JsYXNUcmFpdHM6OmV4dHJhY3QobGhzKTsKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsUmhzVHlwZT46OnR5cGUgYWN0dWFsUmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChyaHMpOworCisgICAgUmVzU2NhbGFyIGFjdHVhbEFscGhhID0gYWxwaGEgKiBMaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKGxocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IocmhzKTsKKworICAgIGVudW0geworICAgICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhbGxvdyBhbiBpbm5lciBzdHJpZGUgb24gdGhlIHJlc3VsdCBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKyAgICAgIC8vIG9uLCB0aGUgb3RoZXIgaGFuZCBpdCBpcyBnb29kIGZvciB0aGUgY2FjaGUgdG8gcGFjayB0aGUgdmVjdG9yIGFueXdheXMuLi4KKyAgICAgIERpcmVjdGx5VXNlUmhzID0gQWN0dWFsUmhzVHlwZUNsZWFuZWQ6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MQorICAgIH07CisKKyAgICBnZW12X3N0YXRpY192ZWN0b3JfaWY8UmhzU2NhbGFyLEFjdHVhbFJoc1R5cGVDbGVhbmVkOjpTaXplQXRDb21waWxlVGltZSxBY3R1YWxSaHNUeXBlQ2xlYW5lZDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsIURpcmVjdGx5VXNlUmhzPiBzdGF0aWNfcmhzOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJoc1NjYWxhcixhY3R1YWxSaHNQdHIsYWN0dWFsUmhzLnNpemUoKSwKKyAgICAgICAgRGlyZWN0bHlVc2VSaHMgPyBjb25zdF9jYXN0PFJoc1NjYWxhcio+KGFjdHVhbFJocy5kYXRhKCkpIDogc3RhdGljX3Jocy5kYXRhKCkpOworCisgICAgaWYoIURpcmVjdGx5VXNlUmhzKQorICAgIHsKKyAgICAgICNpZmRlZiBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICBJbmRleCBzaXplID0gYWN0dWFsUmhzLnNpemUoKTsKKyAgICAgIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgICNlbmRpZgorICAgICAgTWFwPHR5cGVuYW1lIEFjdHVhbFJoc1R5cGVDbGVhbmVkOjpQbGFpbk9iamVjdD4oYWN0dWFsUmhzUHRyLCBhY3R1YWxSaHMuc2l6ZSgpKSA9IGFjdHVhbFJoczsKKyAgICB9CisKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8TGhzU2NhbGFyLEluZGV4LFJvd01ham9yPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFJoc1NjYWxhcixJbmRleCxDb2xNYWpvcj4gUmhzTWFwcGVyOworICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICAgIDxJbmRleCxMaHNTY2FsYXIsTGhzTWFwcGVyLFJvd01ham9yLExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSxSaHNTY2FsYXIsUmhzTWFwcGVyLFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZT46OnJ1bigKKyAgICAgICAgYWN0dWFsTGhzLnJvd3MoKSwgYWN0dWFsTGhzLmNvbHMoKSwKKyAgICAgICAgTGhzTWFwcGVyKGFjdHVhbExocy5kYXRhKCksIGFjdHVhbExocy5vdXRlclN0cmlkZSgpKSwKKyAgICAgICAgUmhzTWFwcGVyKGFjdHVhbFJoc1B0ciwgMSksCisgICAgICAgIGRlc3QuZGF0YSgpLCBkZXN0LmNvbCgwKS5pbm5lclN0cmlkZSgpLCAvL05PVEUgIGlmIGRlc3QgaXMgbm90IGEgdmVjdG9yIGF0IGNvbXBpbGUtdGltZSwgdGhlbiBkZXN0LmlubmVyU3RyaWRlKCkgbWlnaHQgYmUgd3JvbmcuIChidWcgMTE2NikKKyAgICAgICAgYWN0dWFsQWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZW12X2RlbnNlX3NlbGVjdG9yPE9uVGhlUmlnaHQsQ29sTWFqb3IsZmFsc2U+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBEZXN0JiBkZXN0LCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoIW5lc3RlZF9ldmFsPExocywxPjo6RXZhbHVhdGUpLEVJR0VOX0lOVEVSTkFMX0NPTVBJTEFUSU9OX0VSUk9SX09SX1lPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgLy8gVE9ETyBpZiByaHMgaXMgbGFyZ2UgZW5vdWdoIGl0IG1pZ2h0IGJlIGJlbmVmaWNpYWwgdG8gbWFrZSBzdXJlIHRoYXQgZGVzdCBpcyBzZXF1ZW50aWFsbHkgc3RvcmVkIGluIG1lbW9yeSwgb3RoZXJ3aXNlIHVzZSBhIHRlbXAKKyAgICB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxSaHMsMT46OnR5cGUgYWN0dWFsX3JocyhyaHMpOworICAgIGNvbnN0IEluZGV4IHNpemUgPSByaHMucm93cygpOworICAgIGZvcihJbmRleCBrPTA7IGs8c2l6ZTsgKytrKQorICAgICAgZGVzdCArPSAoYWxwaGEqYWN0dWFsX3Jocy5jb2VmZihrKSkgKiBsaHMuY29sKGspOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZW12X2RlbnNlX3NlbGVjdG9yPE9uVGhlUmlnaHQsUm93TWFqb3IsZmFsc2U+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBEZXN0JiBkZXN0LCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoIW5lc3RlZF9ldmFsPExocywxPjo6RXZhbHVhdGUpLEVJR0VOX0lOVEVSTkFMX0NPTVBJTEFUSU9OX0VSUk9SX09SX1lPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgdHlwZW5hbWUgbmVzdGVkX2V2YWw8UmhzLExoczo6Um93c0F0Q29tcGlsZVRpbWU+Ojp0eXBlIGFjdHVhbF9yaHMocmhzKTsKKyAgICBjb25zdCBJbmRleCByb3dzID0gZGVzdC5yb3dzKCk7CisgICAgZm9yKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpCisgICAgICBkZXN0LmNvZWZmUmVmKGkpICs9IGFscGhhICogKGxocy5yb3coaSkuY3dpc2VQcm9kdWN0KGFjdHVhbF9yaHMudHJhbnNwb3NlKCkpKS5zdW0oKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgbWF0cml4IGJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCBwcm9kdWN0IG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlci4KKyAgKgorICAqIFxub3RlIElmIGluc3RlYWQgb2YgdGhlIG1hdHJpeCBwcm9kdWN0IHlvdSB3YW50IHRoZSBjb2VmZmljaWVudC13aXNlIHByb2R1Y3QsIHNlZSBDd2lzZTo6b3BlcmF0b3IqKCkuCisgICoKKyAgKiBcc2EgbGF6eVByb2R1Y3QoKSwgb3BlcmF0b3IqPShjb25zdCBNYXRyaXhCYXNlJiksIEN3aXNlOjpvcGVyYXRvciooKQorICAqLworI2lmbmRlZiBfX0NVREFDQ19fCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgUHJvZHVjdDxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgLy8gQSBub3RlIHJlZ2FyZGluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb246IEluIE1TVkMsIHRoaXMgZnVuY3Rpb24gd2lsbCBzb21ldGltZXMKKyAgLy8gbm90IGJlIGlubGluZWQgc2luY2UgRGVuc2VTdG9yYWdlIGlzIGFuIHVud2luZGFibGUgb2JqZWN0IGZvciBkeW5hbWljCisgIC8vIG1hdHJpY2VzIGFuZCBwcm9kdWN0IHR5cGVzIGFyZSBob2xkaW5nIGEgbWVtYmVyIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgIC8vIFRodXMgaXQgZG9lcyBub3QgaGVscCB0YWdnaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBFSUdFTl9TVFJPTkdfSU5MSU5FLgorICBlbnVtIHsKKyAgICBQcm9kdWN0SXNWYWxpZCA9ICBEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYworICAgICAgICAgICAgICAgICAgIHx8IE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICB8fCBpbnQoRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWUpPT1pbnQoT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSksCisgICAgQXJlVmVjdG9ycyA9IERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSwKKyAgICBTYW1lU2l6ZXMgPSBFSUdFTl9QUkVESUNBVEVfU0FNRV9NQVRSSVhfU0laRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKKyAgfTsKKyAgLy8gbm90ZSB0byB0aGUgbG9zdCB1c2VyOgorICAvLyAgICAqIGZvciBhIGRvdCBwcm9kdWN0IHVzZTogdjEuZG90KHYyKQorICAvLyAgICAqIGZvciBhIGNvZWZmLXdpc2UgcHJvZHVjdCB1c2U6IHYxLmN3aXNlUHJvZHVjdCh2MikKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChQcm9kdWN0SXNWYWxpZCB8fCAhKEFyZVZlY3RvcnMgJiYgU2FtZVNpemVzKSwKKyAgICBJTlZBTElEX1ZFQ1RPUl9WRUNUT1JfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0RPVF9PUl9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTlMpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoUHJvZHVjdElzVmFsaWQgfHwgIShTYW1lU2l6ZXMgJiYgIUFyZVZlY3RvcnMpLAorICAgIElOVkFMSURfTUFUUklYX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTikKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChQcm9kdWN0SXNWYWxpZCB8fCBTYW1lU2l6ZXMsIElOVkFMSURfTUFUUklYX1BST0RVQ1QpCisjaWZkZWYgRUlHRU5fREVCVUdfUFJPRFVDVAorICBpbnRlcm5hbDo6cHJvZHVjdF90eXBlPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6ZGVidWcoKTsKKyNlbmRpZgorCisgIHJldHVybiBQcm9kdWN0PERlcml2ZWQsIE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisjZW5kaWYgLy8gX19DVURBQ0NfXworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbWF0cml4IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyIHdpdGhvdXQgaW1wbGljaXQgZXZhbHVhdGlvbi4KKyAgKgorICAqIFRoZSByZXR1cm5lZCBwcm9kdWN0IHdpbGwgYmVoYXZlIGxpa2UgYW55IG90aGVyIGV4cHJlc3Npb25zOiB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcm9kdWN0IHdpbGwgYmUKKyAgKiBjb21wdXRlZCBvbmNlIGF0IGEgdGltZSBhcyByZXF1ZXN0ZWQuIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGluIHNvbWUgZXh0cmVtZWx5IHJhcmUgY2FzZXMgd2hlbiBvbmx5CisgICogYSBzbWFsbCBhbmQgbm8gY29oZXJlbnQgZnJhY3Rpb24gb2YgdGhlIHJlc3VsdCdzIGNvZWZmaWNpZW50cyBoYXZlIHRvIGJlIGNvbXB1dGVkLgorICAqCisgICogXHdhcm5pbmcgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYXRyaXggcHJvZHVjdCBjYW4gYmUgbXVjaCBtdWNoIHNsb3dlci4gU28gdXNlIGl0IG9ubHkgaWYgeW91IGtub3cKKyAgKiB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIHRoYXQgeW91IG1lYXN1cmVkIGEgdHJ1ZSBzcGVlZCBpbXByb3ZlbWVudC4KKyAgKgorICAqIFxzYSBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZSYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorY29uc3QgUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZCxMYXp5UHJvZHVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmxhenlQcm9kdWN0KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIGVudW0geworICAgIFByb2R1Y3RJc1ZhbGlkID0gIERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgfHwgT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYworICAgICAgICAgICAgICAgICAgIHx8IGludChEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSk9PWludChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBBcmVWZWN0b3JzID0gRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lICYmIE90aGVyRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lLAorICAgIFNhbWVTaXplcyA9IEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICB9OworICAvLyBub3RlIHRvIHRoZSBsb3N0IHVzZXI6CisgIC8vICAgICogZm9yIGEgZG90IHByb2R1Y3QgdXNlOiB2MS5kb3QodjIpCisgIC8vICAgICogZm9yIGEgY29lZmYtd2lzZSBwcm9kdWN0IHVzZTogdjEuY3dpc2VQcm9kdWN0KHYyKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8ICEoQXJlVmVjdG9ycyAmJiBTYW1lU2l6ZXMpLAorICAgIElOVkFMSURfVkVDVE9SX1ZFQ1RPUl9QUk9EVUNUX19JRl9ZT1VfV0FOVEVEX0FfRE9UX09SX0NPRUZGX1dJU0VfUFJPRFVDVF9ZT1VfTVVTVF9VU0VfVEhFX0VYUExJQ0lUX0ZVTkNUSU9OUykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChQcm9kdWN0SXNWYWxpZCB8fCAhKFNhbWVTaXplcyAmJiAhQXJlVmVjdG9ycyksCisgICAgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0NPRUZGX1dJU0VfUFJPRFVDVF9ZT1VfTVVTVF9VU0VfVEhFX0VYUExJQ0lUX0ZVTkNUSU9OKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8IFNhbWVTaXplcywgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVCkKKworICByZXR1cm4gUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZCxMYXp5UHJvZHVjdD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BST0RVQ1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvR2VuZXJpY1BhY2tldE1hdGguaCBiL0VpZ2VuL3NyYy9Db3JlL0dlbmVyaWNQYWNrZXRNYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZjhhYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0dlbmVyaWNQYWNrZXRNYXRoLmgKQEAgLTAsMCArMSw1OTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSSUNfUEFDS0VUX01BVEhfSAorI2RlZmluZSBFSUdFTl9HRU5FUklDX1BBQ0tFVF9NQVRIX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIFxmaWxlIEdlbmVyaWNQYWNrZXRNYXRoLmgKKyAgKgorICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlY3Rvcml6YXRpb24uCisgICogSW4gcHJhY3RpY2UgdGhlc2UgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBtYWtlIGVhc2llciB0aGUgd3JpdGluZworICAqIG9mIGdlbmVyaWMgdmVjdG9yaXplZCBjb2RlLgorICAqLworCisjaWZuZGVmIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRAorI2RlZmluZSBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FECisjZGVmaW5lIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FECisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisjZGVmaW5lIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRQorI2RlZmluZSBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUKKyNlbmRpZgorCitzdHJ1Y3QgZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIGVudW0geworICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAxLAorICAgIEhhc0FyZyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMSwKKyAgICBIYXNNaW4gICAgPSAxLAorICAgIEhhc01heCAgICA9IDEsCisgICAgSGFzQ29uaiAgID0gMSwKKyAgICBIYXNTZXRMaW5lYXIgPSAxLAorICAgIEhhc0JsZW5kICA9IDAsCisKKyAgICBIYXNEaXYgICAgPSAwLAorICAgIEhhc1NxcnQgICA9IDAsCisgICAgSGFzUnNxcnQgID0gMCwKKyAgICBIYXNFeHAgICAgPSAwLAorICAgIEhhc0xvZyAgICA9IDAsCisgICAgSGFzTG9nMXAgID0gMCwKKyAgICBIYXNMb2cxMCAgPSAwLAorICAgIEhhc1BvdyAgICA9IDAsCisKKyAgICBIYXNTaW4gICAgPSAwLAorICAgIEhhc0NvcyAgICA9IDAsCisgICAgSGFzVGFuICAgID0gMCwKKyAgICBIYXNBU2luICAgPSAwLAorICAgIEhhc0FDb3MgICA9IDAsCisgICAgSGFzQVRhbiAgID0gMCwKKyAgICBIYXNTaW5oICAgPSAwLAorICAgIEhhc0Nvc2ggICA9IDAsCisgICAgSGFzVGFuaCAgID0gMCwKKyAgICBIYXNMR2FtbWEgPSAwLAorICAgIEhhc0RpR2FtbWEgPSAwLAorICAgIEhhc1pldGEgPSAwLAorICAgIEhhc1BvbHlnYW1tYSA9IDAsCisgICAgSGFzRXJmID0gMCwKKyAgICBIYXNFcmZjID0gMCwKKyAgICBIYXNJR2FtbWEgPSAwLAorICAgIEhhc0lHYW1tYWMgPSAwLAorICAgIEhhc0JldGFJbmMgPSAwLAorCisgICAgSGFzUm91bmQgID0gMCwKKyAgICBIYXNGbG9vciAgPSAwLAorICAgIEhhc0NlaWwgICA9IDAsCisKKyAgICBIYXNTaWduICAgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcGFja2V0X3RyYWl0cyA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFQgdHlwZTsKKyAgdHlwZWRlZiBUIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDAsCisgICAgc2l6ZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMCwKKyAgICBIYXNIYWxmUGFja2V0ID0gMAorICB9OworICBlbnVtIHsKKyAgICBIYXNBZGQgICAgPSAwLAorICAgIEhhc1N1YiAgICA9IDAsCisgICAgSGFzTXVsICAgID0gMCwKKyAgICBIYXNOZWdhdGUgPSAwLAorICAgIEhhc0FicyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAwLAorICAgIEhhc01heCAgICA9IDAsCisgICAgSGFzQ29uaiAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxjb25zdCBUPiA6IHBhY2tldF90cmFpdHM8VD4geyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjLCB0eXBlbmFtZSBUZ3Q+IHN0cnVjdCB0eXBlX2Nhc3RpbmdfdHJhaXRzIHsKKyAgZW51bSB7CisgICAgVmVjdG9yaXplZENhc3QgPSAwLAorICAgIFNyY0NvZWZmUmF0aW8gPSAxLAorICAgIFRndENvZWZmUmF0aW8gPSAxCisgIH07Cit9OworCisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgc3RhdGljX2Nhc3Q8VGd0VHlwZT4oYSkgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjUGFja2V0LCB0eXBlbmFtZSBUZ3RQYWNrZXQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVGd0UGFja2V0CitwY2FzdChjb25zdCBTcmNQYWNrZXQmIGEpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRndFBhY2tldD4oYSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjUGFja2V0LCB0eXBlbmFtZSBUZ3RQYWNrZXQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVGd0UGFja2V0CitwY2FzdChjb25zdCBTcmNQYWNrZXQmIGEsIGNvbnN0IFNyY1BhY2tldCYgLypiKi8pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRndFBhY2tldD4oYSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNQYWNrZXQsIHR5cGVuYW1lIFRndFBhY2tldD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUZ3RQYWNrZXQKK3BjYXN0KGNvbnN0IFNyY1BhY2tldCYgYSwgY29uc3QgU3JjUGFja2V0JiAvKmIqLywgY29uc3QgU3JjUGFja2V0JiAvKmMqLywgY29uc3QgU3JjUGFja2V0JiAvKmQqLykgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8VGd0UGFja2V0PihhKTsKK30KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhICsgYiAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGFkZChjb25zdCBQYWNrZXQmIGEsCisgICAgICAgIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYStiOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSAtIGIgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3BzdWIoY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEtYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIC1hIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbmVnYXRlKGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gLWE7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBjb25qKGEpIChjb2VmZi13aXNlKSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3Bjb25qKGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gbnVtZXh0Ojpjb25qKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSAqIGIgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3BtdWwoY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEqYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgLyBiIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwZGl2KGNvbnN0IFBhY2tldCYgYSwKKyAgICAgICAgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBhL2I7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgbWluIG9mIFxhIGEgYW5kIFxhIGIgIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbWluKGNvbnN0IFBhY2tldCYgYSwKKyAgICAgICAgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBudW1leHQ6Om1pbmkoYSwgYik7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgbWF4IG9mIFxhIGEgYW5kIFxhIGIgIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbWF4KGNvbnN0IFBhY2tldCYgYSwKKyAgICAgICAgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBudW1leHQ6Om1heGkoYSwgYik7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgXGEgYSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwYWJzKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OmFiczsgcmV0dXJuIGFicyhhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBwaGFzZSBhbmdsZSBvZiBcYSBhICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3BhcmcoY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIG51bWV4dDo6YXJnOyByZXR1cm4gYXJnKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGJpdHdpc2UgYW5kIG9mIFxhIGEgYW5kIFxhIGIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGFuZChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYSAmIGI7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYml0d2lzZSBvciBvZiBcYSBhIGFuZCBcYSBiICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3Bvcihjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYSB8IGI7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYml0d2lzZSB4b3Igb2YgXGEgYSBhbmQgXGEgYiAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitweG9yKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBhIF4gYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBiaXR3aXNlIGFuZG5vdCBvZiBcYSBhIGFuZCBcYSBiICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQKK3BhbmRub3QoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEgJiAoIWIpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSBwYWNrZXQgdmVyc2lvbiBvZiBcYSAqZnJvbSwgZnJvbSBtdXN0IGJlIDE2IGJ5dGVzIGFsaWduZWQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGxvYWQoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIGZyb20pIHsgcmV0dXJuICpmcm9tOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSBwYWNrZXQgdmVyc2lvbiBvZiBcYSAqZnJvbSwgKHVuLWFsaWduZWQgbG9hZCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGxvYWR1KGNvbnN0IHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlKiBmcm9tKSB7IHJldHVybiAqZnJvbTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgcGFja2V0IHdpdGggY29uc3RhbnQgY29lZmZpY2llbnRzIFxhIGEsIGUuZy46IChhLGEsYSxhKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0Citwc2V0MShjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSYgYSkgeyByZXR1cm4gYTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgcGFja2V0IHdpdGggY29uc3RhbnQgY29lZmZpY2llbnRzIFxhIGFbMF0sIGUuZy46IChhWzBdLGFbMF0sYVswXSxhWzBdKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbG9hZDEoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUgICphKSB7IHJldHVybiBwc2V0MTxQYWNrZXQ+KCphKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgcGFja2V0IHdpdGggZWxlbWVudHMgb2YgXGEgKmZyb20gZHVwbGljYXRlZC4KKyAgKiBGb3IgaW5zdGFuY2UsIGZvciBhIHBhY2tldCBvZiA4IGVsZW1lbnRzLCA0IHNjYWxhcnMgd2lsbCBiZSByZWFkIGZyb20gXGEgKmZyb20gYW5kCisgICogZHVwbGljYXRlZCB0byBmb3JtOiB7ZnJvbVswXSxmcm9tWzBdLGZyb21bMV0sZnJvbVsxXSxmcm9tWzJdLGZyb21bMl0sZnJvbVszXSxmcm9tWzNdfQorICAqIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIHNjYWxhciAqIGNvbXBsZXggcHJvZHVjdHMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0CitwbG9hZGR1cChjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSogZnJvbSkgeyByZXR1cm4gKmZyb207IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHBhY2tldCB3aXRoIGVsZW1lbnRzIG9mIFxhICpmcm9tIHF1YWRydXBsZWQuCisgICogRm9yIGluc3RhbmNlLCBmb3IgYSBwYWNrZXQgb2YgOCBlbGVtZW50cywgMiBzY2FsYXJzIHdpbGwgYmUgcmVhZCBmcm9tIFxhICpmcm9tIGFuZAorICAqIHJlcGxpY2F0ZWQgdG8gZm9ybToge2Zyb21bMF0sZnJvbVswXSxmcm9tWzBdLGZyb21bMF0sZnJvbVsxXSxmcm9tWzFdLGZyb21bMV0sZnJvbVsxXX0KKyAgKiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGluIG1hdHJpeCBwcm9kdWN0cy4KKyAgKiBGb3IgcGFja2V0LXNpemUgc21hbGxlciBvciBlcXVhbCB0byA0LCB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gcGxvYWQxIAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbG9hZHF1YWQoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIGZyb20pCit7IHJldHVybiBwbG9hZDE8UGFja2V0Pihmcm9tKTsgfQorCisvKiogXGludGVybmFsIGVxdWl2YWxlbnQgdG8KKyAgKiBcY29kZQorICAqIGEwID0gcGxvYWQxKGErMCk7CisgICogYTEgPSBwbG9hZDEoYSsxKTsKKyAgKiBhMiA9IHBsb2FkMShhKzIpOworICAqIGEzID0gcGxvYWQxKGErMyk7CisgICogXGVuZGNvZGUKKyAgKiBcc2EgcHNldDEsIHBsb2FkMSwgcGxvYWRkdXAsIHBicm9hZGNhc3QyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdm9pZCBwYnJvYWRjYXN0NChjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldCYgYTAsIFBhY2tldCYgYTEsIFBhY2tldCYgYTIsIFBhY2tldCYgYTMpCit7CisgIGEwID0gcGxvYWQxPFBhY2tldD4oYSswKTsKKyAgYTEgPSBwbG9hZDE8UGFja2V0PihhKzEpOworICBhMiA9IHBsb2FkMTxQYWNrZXQ+KGErMik7CisgIGEzID0gcGxvYWQxPFBhY2tldD4oYSszKTsKK30KKworLyoqIFxpbnRlcm5hbCBlcXVpdmFsZW50IHRvCisgICogXGNvZGUKKyAgKiBhMCA9IHBsb2FkMShhKzApOworICAqIGExID0gcGxvYWQxKGErMSk7CisgICogXGVuZGNvZGUKKyAgKiBcc2EgcHNldDEsIHBsb2FkMSwgcGxvYWRkdXAsIHBicm9hZGNhc3Q0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdm9pZCBwYnJvYWRjYXN0Mihjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldCYgYTAsIFBhY2tldCYgYTEpCit7CisgIGEwID0gcGxvYWQxPFBhY2tldD4oYSswKTsKKyAgYTEgPSBwbG9hZDE8UGFja2V0PihhKzEpOworfQorCisvKiogXGludGVybmFsIFxicmllZiBSZXR1cm5zIGEgcGFja2V0IHdpdGggY29lZmZpY2llbnRzIChhLGErMSwuLi4sYStwYWNrZXRfc2l6ZS0xKS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQKK3Bsc2V0KGNvbnN0IHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlJiBhKSB7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgY29weSB0aGUgcGFja2V0IFxhIGZyb20gdG8gXGEgKnRvLCBcYSB0byBtdXN0IGJlIDE2IGJ5dGVzIGFsaWduZWQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBwc3RvcmUoU2NhbGFyKiB0bywgY29uc3QgUGFja2V0JiBmcm9tKQoreyAoKnRvKSA9IGZyb207IH0KKworLyoqIFxpbnRlcm5hbCBjb3B5IHRoZSBwYWNrZXQgXGEgZnJvbSB0byBcYSAqdG8sICh1bi1hbGlnbmVkIHN0b3JlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzdG9yZXUoU2NhbGFyKiB0bywgY29uc3QgUGFja2V0JiBmcm9tKQoreyAgKCp0bykgPSBmcm9tOyB9CisKKyB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwZ2F0aGVyKGNvbnN0IFNjYWxhciogZnJvbSwgSW5kZXggLypzdHJpZGUqLykKKyB7IHJldHVybiBwbG9hZHU8UGFja2V0Pihmcm9tKTsgfQorCisgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyKFNjYWxhciogdG8sIGNvbnN0IFBhY2tldCYgZnJvbSwgSW5kZXggLypzdHJpZGUqLykKKyB7IHBzdG9yZSh0bywgZnJvbSk7IH0KKworLyoqIFxpbnRlcm5hbCB0cmllcyB0byBkbyBjYWNoZSBwcmVmZXRjaGluZyBvZiBcYSBhZGRyICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IFNjYWxhciogYWRkcikKK3sKKyNpZmRlZiBfX0NVREFfQVJDSF9fCisjaWYgZGVmaW5lZChfX0xQNjRfXykKKyAgLy8gNjQtYml0IHBvaW50ZXIgb3BlcmFuZCBjb25zdHJhaW50IGZvciBpbmxpbmVkIGFzbQorICBhc20oIiBwcmVmZXRjaC5MMSBbICUxIF07IiA6ICI9bCIoYWRkcikgOiAibCIoYWRkcikpOworI2Vsc2UKKyAgLy8gMzItYml0IHBvaW50ZXIgb3BlcmFuZCBjb25zdHJhaW50IGZvciBpbmxpbmVkIGFzbQorICBhc20oIiBwcmVmZXRjaC5MMSBbICUxIF07IiA6ICI9ciIoYWRkcikgOiAiciIoYWRkcikpOworI2VuZGlmCisjZWxpZiAoIUVJR0VOX0NPTVBfTVNWQykgJiYgKEVJR0VOX0NPTVBfR05VQyB8fCBFSUdFTl9DT01QX0NMQU5HIHx8IEVJR0VOX0NPTVBfSUNDKQorICBfX2J1aWx0aW5fcHJlZmV0Y2goYWRkcik7CisjZW5kaWYKK30KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHBhY2tldCAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUgcGZpcnN0KGNvbnN0IFBhY2tldCYgYSkKK3sgcmV0dXJuIGE7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHBhY2tldCB3aGVyZSB0aGUgZWxlbWVudCBpIGNvbnRhaW5zIHRoZSBzdW0gb2YgdGhlIHBhY2tldCBvZiBcYSB2ZWNbaV0gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcHJlZHV4cChjb25zdCBQYWNrZXQqIHZlY3MpIHsgcmV0dXJuIHZlY3NbMF07IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgc3VtIG9mIHRoZSBlbGVtZW50cyBvZiBcYSBhKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlIHByZWR1eChjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgb2YgXGEgYSBieSBibG9jayBvZiA0IGVsZW1lbnRzLgorICAqIEZvciBhIHBhY2tldCB7YTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3fSwgaXQgcmV0dXJucyBhIGhhbGYgcGFja2V0IHthMCthNCwgYTErYTUsIGEyK2E2LCBhMythN30KKyAgKiBGb3IgcGFja2V0LXNpemUgc21hbGxlciBvciBlcXVhbCB0byA0LCB0aGlzIGJvaWxzIGRvd24gdG8gYSBub29wLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUKK3R5cGVuYW1lIGNvbmRpdGlvbmFsPCh1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZSU4KT09MCx0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6aGFsZixQYWNrZXQ+Ojp0eXBlCitwcmVkdXhfZG93bnRvNChjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIGVsZW1lbnRzIG9mIFxhIGEqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUgcHJlZHV4X211bChjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIG1pbiBvZiB0aGUgZWxlbWVudHMgb2YgXGEgYSovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBwcmVkdXhfbWluKGNvbnN0IFBhY2tldCYgYSkKK3sgcmV0dXJuIGE7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgbWF4IG9mIHRoZSBlbGVtZW50cyBvZiBcYSBhKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlIHByZWR1eF9tYXgoY29uc3QgUGFja2V0JiBhKQoreyByZXR1cm4gYTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSByZXZlcnNlZCBlbGVtZW50cyBvZiBcYSBhKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwcmV2ZXJzZShjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgXGEgYSB3aXRoIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0IGZsaXBwZWQgKGZvciBjb21wbGV4IHR5cGUgb25seSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwY3BseGZsaXAoY29uc3QgUGFja2V0JiBhKQoreworICAvLyBGSVhNRTogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaW4gY2FzZSB3ZSBkcm9wIHRoZSBpbnRlcm5hbCBpbWFnIGFuZCByZWFsIGZ1bmN0aW9ucy4KKy8vICAgdXNpbmcgc3RkOjppbWFnOworLy8gICB1c2luZyBzdGQ6OnJlYWw7CisgIHJldHVybiBQYWNrZXQoaW1hZyhhKSxyZWFsKGEpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNwZWNpYWwgbWF0aCBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgc2luZSBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcHNpbihjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgc3RkOjpzaW47IHJldHVybiBzaW4oYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgY29zaW5lIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwY29zKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OmNvczsgcmV0dXJuIGNvcyhhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSB0YW4gb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHB0YW4oY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIHN0ZDo6dGFuOyByZXR1cm4gdGFuKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGFyYyBzaW5lIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwYXNpbihjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgc3RkOjphc2luOyByZXR1cm4gYXNpbihhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBhcmMgY29zaW5lIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwYWNvcyhjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgc3RkOjphY29zOyByZXR1cm4gYWNvcyhhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBhcmMgdGFuZ2VudCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGF0YW4oY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIHN0ZDo6YXRhbjsgcmV0dXJuIGF0YW4oYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwc2luaChjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgc3RkOjpzaW5oOyByZXR1cm4gc2luaChhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGNvc2goY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIHN0ZDo6Y29zaDsgcmV0dXJuIGNvc2goYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgaHlwZXJib2xpYyB0YW4gb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHB0YW5oKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OnRhbmg7IHJldHVybiB0YW5oKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGV4cCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGV4cChjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgc3RkOjpleHA7IHJldHVybiBleHAoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgbG9nIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwbG9nKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OmxvZzsgcmV0dXJuIGxvZyhhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBsb2cxcCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGxvZzFwKGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gbnVtZXh0Ojpsb2cxcChhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBsb2cxMCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGxvZzEwKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OmxvZzEwOyByZXR1cm4gbG9nMTAoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgc3F1YXJlLXJvb3Qgb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBzcXJ0KGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBzdGQ6OnNxcnQ7IHJldHVybiBzcXJ0KGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIHJlY2lwcm9jYWwgc3F1YXJlLXJvb3Qgb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHByc3FydChjb25zdCBQYWNrZXQmIGEpIHsKKyAgcmV0dXJuIHBkaXYocHNldDE8UGFja2V0PigxKSwgcHNxcnQoYSkpOworfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSByb3VuZGVkIHZhbHVlIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwcm91bmQoY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIG51bWV4dDo6cm91bmQ7IHJldHVybiByb3VuZChhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBmbG9vciBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGZsb29yKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBudW1leHQ6OmZsb29yOyByZXR1cm4gZmxvb3IoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgY2VpbCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGNlaWwoY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIG51bWV4dDo6Y2VpbDsgcmV0dXJuIGNlaWwoYSk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtaWdodCBub3QgaGF2ZSB0byBiZSBvdmVyd3JpdHRlbiBmb3IgdmVjdG9yaXplZCB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGludGVybmFsIGNvcHkgYSBwYWNrZXQgd2l0aCBjb25zdGFudCBjb2VmaWNpZW50IFxhIGEgKGUuZy4sIFthLGEsYSxhXSkgdG8gXGEgKnRvLiBcYSB0byBtdXN0IGJlIDE2IGJ5dGVzIGFsaWduZWQgKi8KKy8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gbXVzdCByZWFsbHkgYmUgdGVtcGxhdGVkIG9uIHRoZSBwYWNrZXQgdHlwZSAodGhpbmsgYWJvdXQgZGlmZmVyZW50IHBhY2tldCB0eXBlcyBmb3IgdGhlIHNhbWUgc2NhbGFyIHR5cGUpCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CitpbmxpbmUgdm9pZCBwc3RvcmUxKHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlKiB0bywgY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUmIGEpCit7CisgIHBzdG9yZSh0bywgcHNldDE8UGFja2V0PihhKSk7Cit9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSAqIGIgKyBjIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwbWFkZChjb25zdCBQYWNrZXQmICBhLAorICAgICAgICAgY29uc3QgUGFja2V0JiAgYiwKKyAgICAgICAgIGNvbnN0IFBhY2tldCYgIGMpCit7IHJldHVybiBwYWRkKHBtdWwoYSwgYiksYyk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHBhY2tldCB2ZXJzaW9uIG9mIFxhICpmcm9tLgorICAqIFRoZSBwb2ludGVyIFxhIGZyb20gbXVzdCBiZSBhbGlnbmVkIG9uIGEgXGEgQWxpZ25tZW50IGJ5dGVzIGJvdW5kYXJ5LiAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0LCBpbnQgQWxpZ25tZW50PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBQYWNrZXQgcGxvYWR0KGNvbnN0IHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlKiBmcm9tKQoreworICBpZihBbGlnbm1lbnQgPj0gdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OmFsaWdubWVudCkKKyAgICByZXR1cm4gcGxvYWQ8UGFja2V0Pihmcm9tKTsKKyAgZWxzZQorICAgIHJldHVybiBwbG9hZHU8UGFja2V0Pihmcm9tKTsKK30KKworLyoqIFxpbnRlcm5hbCBjb3B5IHRoZSBwYWNrZXQgXGEgZnJvbSB0byBcYSAqdG8uCisgICogVGhlIHBvaW50ZXIgXGEgZnJvbSBtdXN0IGJlIGFsaWduZWQgb24gYSBcYSBBbGlnbm1lbnQgYnl0ZXMgYm91bmRhcnkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldCwgaW50IEFsaWdubWVudD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdm9pZCBwc3RvcmV0KFNjYWxhciogdG8sIGNvbnN0IFBhY2tldCYgZnJvbSkKK3sKKyAgaWYoQWxpZ25tZW50ID49IHVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjphbGlnbm1lbnQpCisgICAgcHN0b3JlKHRvLCBmcm9tKTsKKyAgZWxzZQorICAgIHBzdG9yZXUodG8sIGZyb20pOworfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgcGFja2V0IHZlcnNpb24gb2YgXGEgKmZyb20uCisgICogVW5saWtlIHBsb2FkdCwgcGxvYWR0X3JvIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgcmVhZC1vbmx5IG1lbW9yeSBwYXRoIG9uIHRoZQorICAqIGhhcmR3YXJlIGlmIGF2YWlsYWJsZSB0byBzcGVlZHVwIHRoZSBsb2FkaW5nIG9mIGRhdGEgdGhhdCB3b24ndCBiZSBtb2RpZmllZAorICAqIGJ5IHRoZSBjdXJyZW50IGNvbXB1dGF0aW9uLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFBhY2tldCBwbG9hZHRfcm8oY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIGZyb20pCit7CisgIHJldHVybiBwbG9hZHQ8UGFja2V0LCBMb2FkTW9kZT4oZnJvbSk7Cit9CisKKy8qKiBcaW50ZXJuYWwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBwYWxpZ24oKSBhbGxvd2luZyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uICovCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0LHR5cGVuYW1lIFBhY2tldFR5cGU+CitzdHJ1Y3QgcGFsaWduX2ltcGwKK3sKKyAgLy8gYnkgZGVmYXVsdCBkYXRhIGFyZSBhbGlnbmVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgOikKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihQYWNrZXRUeXBlJiwgY29uc3QgUGFja2V0VHlwZSYpIHt9Cit9OworCisvKiogXGludGVybmFsIHVwZGF0ZSBcYSBmaXJzdCB1c2luZyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgcGFja2V0X3NpemUgbWludXMgXGEgT2Zmc2V0IGxhc3QgZWxlbWVudHMKKyAgKiBvZiBcYSBmaXJzdCBhbmQgXGEgT2Zmc2V0IGZpcnN0IGVsZW1lbnRzIG9mIFxhIHNlY29uZC4KKyAgKiAKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgdG8gb3B0aW1pemUgbWF0cml4LXZlY3RvciBwcm9kdWN0cyBvbiB1bmxpZ25lZCBtYXRyaWNlcy4KKyAgKiBJdCB0YWtlcyAyIHBhY2tldHMgdGhhdCByZXByZXNlbnQgYSBjb250aWd1b3VzIG1lbW9yeSBhcnJheSwgYW5kIHJldHVybnMgYSBwYWNrZXQgc3RhcnRpbmcKKyAgKiBhdCB0aGUgcG9zaXRpb24gXGEgT2Zmc2V0LiBGb3IgaW5zdGFuY2UsIGZvciBwYWNrZXRzIG9mIDQgZWxlbWVudHMsIHdlIGhhdmU6CisgICogIElucHV0OgorICAqICAtIGZpcnN0ID0ge2YwLGYxLGYyLGYzfQorICAqICAtIHNlY29uZCA9IHtzMCxzMSxzMixzM30KKyAgKiBPdXRwdXQ6IAorICAqICAgLSBpZiBPZmZzZXQ9PTAgdGhlbiB7ZjAsZjEsZjIsZjN9CisgICogICAtIGlmIE9mZnNldD09MSB0aGVuIHtmMSxmMixmMyxzMH0KKyAgKiAgIC0gaWYgT2Zmc2V0PT0yIHRoZW4ge2YyLGYzLHMwLHMxfQorICAqICAgLSBpZiBPZmZzZXQ9PTMgdGhlbiB7ZjMsczAsczEsczN9CisgICovCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0LHR5cGVuYW1lIFBhY2tldFR5cGU+CitpbmxpbmUgdm9pZCBwYWxpZ24oUGFja2V0VHlwZSYgZmlyc3QsIGNvbnN0IFBhY2tldFR5cGUmIHNlY29uZCkKK3sKKyAgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldFR5cGU+OjpydW4oZmlyc3Qsc2Vjb25kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGYXN0IGNvbXBsZXggcHJvZHVjdHMgKEdDQyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiBjYWxsIHdoaWNoIGlzIHZlcnkgc2xvdykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRWlnZW4rQ1VEQSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBsZXhlcy4KKyNpZm5kZWYgX19DVURBQ0NfXworCit0ZW1wbGF0ZTw+IGlubGluZSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHBtdWwoY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIHN0ZDo6Y29tcGxleDxmbG9hdD4ocmVhbChhKSpyZWFsKGIpIC0gaW1hZyhhKSppbWFnKGIpLCBpbWFnKGEpKnJlYWwoYikgKyByZWFsKGEpKmltYWcoYikpOyB9CisKK3RlbXBsYXRlPD4gaW5saW5lIHN0ZDo6Y29tcGxleDxkb3VibGU+IHBtdWwoY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBiKQoreyByZXR1cm4gc3RkOjpjb21wbGV4PGRvdWJsZT4ocmVhbChhKSpyZWFsKGIpIC0gaW1hZyhhKSppbWFnKGIpLCBpbWFnKGEpKnJlYWwoYikgKyByZWFsKGEpKmltYWcoYikpOyB9CisKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBhY2tldEJsb2NrLCB0aGF0IGlzIGEgY29sbGVjdGlvbiBvZiBOIHBhY2tldHMgd2hlcmUgdGhlIG51bWJlciBvZiB3b3JkcworICogaW4gdGhlIHBhY2tldCBpcyBhIG11bHRpcGxlIG9mIE4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0LGludCBOPXVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjpzaXplPiBzdHJ1Y3QgUGFja2V0QmxvY2sgeworICBQYWNrZXQgcGFja2V0W05dOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQsMT4mIC8qa2VybmVsKi8pIHsKKyAgLy8gTm90aGluZyB0byBkbyBpbiB0aGUgc2NhbGFyIGNhc2UsIGkuZS4gYSAxeDEgbWF0cml4LgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZWxlY3RvciwgaS5lLiB2ZWN0b3Igb2YgTiBib29sZWFuIHZhbHVlcyB1c2VkIHRvIHNlbGVjdCAoaS5lLiBibGVuZCkKKyAqIHdvcmRzIGZyb20gMiBwYWNrZXRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordGVtcGxhdGUgPHNpemVfdCBOPiBzdHJ1Y3QgU2VsZWN0b3IgeworICBib29sIHNlbGVjdFtOXTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGJsZW5kKGNvbnN0IFNlbGVjdG9yPHVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjpzaXplPiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldCYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0JiBlbHNlUGFja2V0KSB7CisgIHJldHVybiBpZlBhY2tldC5zZWxlY3RbMF0gPyB0aGVuUGFja2V0IDogZWxzZVBhY2tldDsKK30KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBcYSBhIHdpdGggdGhlIGZpcnN0IGNvZWZmaWNpZW50IHJlcGxhY2VkIGJ5IHRoZSBzY2FsYXIgYiAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0CitwaW5zZXJ0Zmlyc3QoY29uc3QgUGFja2V0JiBhLCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBiKQoreworICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHBibGVuZC4KKyAgLy8gSXQgbXVzdCBiZSBzcGVjaWFsaXplZCBmb3IgaGlnaGVyIHBlcmZvcm1hbmNlLgorICBTZWxlY3Rvcjx1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZT4gbWFzazsKKyAgbWFzay5zZWxlY3RbMF0gPSB0cnVlOworICAvLyBUaGlzIGZvciBsb29wIHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSBieSB0aGUgY29tcGlsZXIuCisgIGZvcihJbmRleCBpPTE7IGk8dW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemU7ICsraSkKKyAgICBtYXNrLnNlbGVjdFtpXSA9IGZhbHNlOworICByZXR1cm4gcGJsZW5kKG1hc2ssIHBzZXQxPFBhY2tldD4oYiksIGEpOworfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIFxhIGEgd2l0aCB0aGUgbGFzdCBjb2VmZmljaWVudCByZXBsYWNlZCBieSB0aGUgc2NhbGFyIGIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldAorcGluc2VydGxhc3QoY29uc3QgUGFja2V0JiBhLCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBiKQoreworICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHBibGVuZC4KKyAgLy8gSXQgbXVzdCBiZSBzcGVjaWFsaXplZCBmb3IgaGlnaGVyIHBlcmZvcm1hbmNlLgorICBTZWxlY3Rvcjx1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZT4gbWFzazsKKyAgLy8gVGhpcyBmb3IgbG9vcCBzaG91bGQgYmUgb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyLgorICBmb3IoSW5kZXggaT0wOyBpPHVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjpzaXplLTE7ICsraSkKKyAgICBtYXNrLnNlbGVjdFtpXSA9IGZhbHNlOworICBtYXNrLnNlbGVjdFt1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZS0xXSA9IHRydWU7CisgIHJldHVybiBwYmxlbmQobWFzaywgcHNldDE8UGFja2V0PihiKSwgYSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSSUNfUEFDS0VUX01BVEhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvR2xvYmFsRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9HbG9iYWxGdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjlkYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvR2xvYmFsRnVuY3Rpb25zLmgKQEAgLTAsMCArMSwxODcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dMT0JBTF9GVU5DVElPTlNfSAorI2RlZmluZSBFSUdFTl9HTE9CQUxfRlVOQ1RJT05TX0gKKworI2lmZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNkZWZpbmUgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoTkFNRSxGVU5DVE9SLERPQ19PUCxET0NfREVUQUlMUykgXAorICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBET0NfT1Agb2YgXGEgeAorCisgICAgRE9DX0RFVEFJTFMKKworICAgIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfIyNOQU1FIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGNsYXNzIEN3aXNlVW5hcnlPcAorICAgICovIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gXAorICBpbmxpbmUgY29uc3QgRWlnZW46OkN3aXNlVW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OkZVTkNUT1I8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gXAorICBOQU1FKGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIHgpOworCisjZWxzZQorCisjZGVmaW5lIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKE5BTUUsRlVOQ1RPUixET0NfT1AsRE9DX0RFVEFJTFMpIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gXAorICBpbmxpbmUgY29uc3QgRWlnZW46OkN3aXNlVW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OkZVTkNUT1I8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gXAorICAoTkFNRSkoY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgeCkgeyBcCisgICAgcmV0dXJuIEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpGVU5DVE9SPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+KHguZGVyaXZlZCgpKTsgXAorICB9CisKKyNlbmRpZiAvLyBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisjZGVmaW5lIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKE5BTUUsRlVOQ1RPUikgXAorICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IFwKKyAgc3RydWN0IE5BTUUjI19yZXR2YWw8QXJyYXlCYXNlPERlcml2ZWQ+ID4gXAorICB7IFwKKyAgICB0eXBlZGVmIGNvbnN0IEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpGVU5DVE9SPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IHR5cGU7IFwKKyAgfTsgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBcCisgIHN0cnVjdCBOQU1FIyNfaW1wbDxBcnJheUJhc2U8RGVyaXZlZD4gPiBcCisgIHsgXAorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgTkFNRSMjX3JldHZhbDxBcnJheUJhc2U8RGVyaXZlZD4gPjo6dHlwZSBydW4oY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgeCkgXAorICAgIHsgXAorICAgICAgcmV0dXJuIHR5cGVuYW1lIE5BTUUjI19yZXR2YWw8QXJyYXlCYXNlPERlcml2ZWQ+ID46OnR5cGUoeC5kZXJpdmVkKCkpOyBcCisgICAgfSBcCisgIH07CisKK25hbWVzcGFjZSBFaWdlbgoreworICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShyZWFsLHNjYWxhcl9yZWFsX29wLHJlYWwgcGFydCxcc2EgQXJyYXlCYXNlOjpyZWFsKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShpbWFnLHNjYWxhcl9pbWFnX29wLGltYWdpbmFyeSBwYXJ0LFxzYSBBcnJheUJhc2U6OmltYWcpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGNvbmosc2NhbGFyX2Nvbmp1Z2F0ZV9vcCxjb21wbGV4IGNvbmp1Z2F0ZSxcc2EgQXJyYXlCYXNlOjpjb25qdWdhdGUpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGludmVyc2Usc2NhbGFyX2ludmVyc2Vfb3AsaW52ZXJzZSxcc2EgQXJyYXlCYXNlOjppbnZlcnNlKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShzaW4sc2NhbGFyX3Npbl9vcCxzaW5lLFxzYSBBcnJheUJhc2U6OnNpbikKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoY29zLHNjYWxhcl9jb3Nfb3AsY29zaW5lLFxzYSBBcnJheUJhc2U6OmNvcykKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkodGFuLHNjYWxhcl90YW5fb3AsdGFuZ2VudCxcc2EgQXJyYXlCYXNlOjp0YW4pCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGF0YW4sc2NhbGFyX2F0YW5fb3AsYXJjLXRhbmdlbnQsXHNhIEFycmF5QmFzZTo6YXRhbikKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoYXNpbixzY2FsYXJfYXNpbl9vcCxhcmMtc2luZSxcc2EgQXJyYXlCYXNlOjphc2luKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShhY29zLHNjYWxhcl9hY29zX29wLGFyYy1jb25zaW5lLFxzYSBBcnJheUJhc2U6OmFjb3MpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKHNpbmgsc2NhbGFyX3Npbmhfb3AsaHlwZXJib2xpYyBzaW5lLFxzYSBBcnJheUJhc2U6OnNpbmgpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGNvc2gsc2NhbGFyX2Nvc2hfb3AsaHlwZXJib2xpYyBjb3NpbmUsXHNhIEFycmF5QmFzZTo6Y29zaCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkodGFuaCxzY2FsYXJfdGFuaF9vcCxoeXBlcmJvbGljIHRhbmdlbnQsXHNhIEFycmF5QmFzZTo6dGFuaCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkobGdhbW1hLHNjYWxhcl9sZ2FtbWFfb3AsbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLFxzYSBBcnJheUJhc2U6OmxnYW1tYSkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoZGlnYW1tYSxzY2FsYXJfZGlnYW1tYV9vcCxkZXJpdmF0aXZlIG9mIGxnYW1tYSxcc2EgQXJyYXlCYXNlOjpkaWdhbW1hKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShlcmYsc2NhbGFyX2VyZl9vcCxlcnJvciBmdW5jdGlvbixcc2EgQXJyYXlCYXNlOjplcmYpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGVyZmMsc2NhbGFyX2VyZmNfb3AsY29tcGxlbWVudCBlcnJvciBmdW5jdGlvbixcc2EgQXJyYXlCYXNlOjplcmZjKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShleHAsc2NhbGFyX2V4cF9vcCxleHBvbmVudGlhbCxcc2EgQXJyYXlCYXNlOjpleHApCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGxvZyxzY2FsYXJfbG9nX29wLG5hdHVyYWwgbG9nYXJpdGhtLFxzYSBFaWdlbjo6bG9nMTAgRE9YQ09NTUEgQXJyYXlCYXNlOjpsb2cpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGxvZzFwLHNjYWxhcl9sb2cxcF9vcCxuYXR1cmFsIGxvZ2FyaXRobSBvZiAxIHBsdXMgdGhlIHZhbHVlLFxzYSBBcnJheUJhc2U6OmxvZzFwKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShsb2cxMCxzY2FsYXJfbG9nMTBfb3AsYmFzZSAxMCBsb2dhcml0aG0sXHNhIEVpZ2VuOjpsb2cgRE9YQ09NTUEgQXJyYXlCYXNlOjpsb2cpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGFicyxzY2FsYXJfYWJzX29wLGFic29sdXRlIHZhbHVlLFxzYSBBcnJheUJhc2U6OmFicyBET1hDT01NQSBNYXRyaXhCYXNlOjpjd2lzZUFicykKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoYWJzMixzY2FsYXJfYWJzMl9vcCxzcXVhcmVkIGFic29sdXRlIHZhbHVlLFxzYSBBcnJheUJhc2U6OmFiczIgRE9YQ09NTUEgTWF0cml4QmFzZTo6Y3dpc2VBYnMyKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShhcmcsc2NhbGFyX2FyZ19vcCxjb21wbGV4IGFyZ3VtZW50LFxzYSBBcnJheUJhc2U6OmFyZykKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoc3FydCxzY2FsYXJfc3FydF9vcCxzcXVhcmUgcm9vdCxcc2EgQXJyYXlCYXNlOjpzcXJ0IERPWENPTU1BIE1hdHJpeEJhc2U6OmN3aXNlU3FydCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkocnNxcnQsc2NhbGFyX3JzcXJ0X29wLHJlY2lwcm9jYWwgc3F1YXJlIHJvb3QsXHNhIEFycmF5QmFzZTo6cnNxcnQpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKHNxdWFyZSxzY2FsYXJfc3F1YXJlX29wLHNxdWFyZSAocG93ZXIgMiksXHNhIEVpZ2VuOjphYnMyIERPWENPTU1BIEVpZ2VuOjpwb3cgRE9YQ09NTUEgQXJyYXlCYXNlOjpzcXVhcmUpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGN1YmUsc2NhbGFyX2N1YmVfb3AsY3ViZSAocG93ZXIgMyksXHNhIEVpZ2VuOjpwb3cgRE9YQ09NTUEgQXJyYXlCYXNlOjpjdWJlKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShyb3VuZCxzY2FsYXJfcm91bmRfb3AsbmVhcmVzdCBpbnRlZ2VyLFxzYSBFaWdlbjo6Zmxvb3IgRE9YQ09NTUEgRWlnZW46OmNlaWwgRE9YQ09NTUEgQXJyYXlCYXNlOjpyb3VuZCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoZmxvb3Isc2NhbGFyX2Zsb29yX29wLG5lYXJlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIHRoZSBnaWJlbiB2YWx1ZSxcc2EgRWlnZW46OmNlaWwgRE9YQ09NTUEgQXJyYXlCYXNlOjpmbG9vcikKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoY2VpbCxzY2FsYXJfY2VpbF9vcCxuZWFyZXN0IGludGVnZXIgbm90IGxlc3MgdGhhbiB0aGUgZ2liZW4gdmFsdWUsXHNhIEVpZ2VuOjpmbG9vciBET1hDT01NQSBBcnJheUJhc2U6OmNlaWwpCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGlzbmFuLHNjYWxhcl9pc25hbl9vcCxub3QtYS1udW1iZXIgdGVzdCxcc2EgRWlnZW46OmlzaW5mIERPWENPTU1BIEVpZ2VuOjppc2Zpbml0ZSBET1hDT01NQSBBcnJheUJhc2U6OmlzbmFuKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShpc2luZixzY2FsYXJfaXNpbmZfb3AsaW5maW5pdGUgdmFsdWUgdGVzdCxcc2EgRWlnZW46OmlzbmFuIERPWENPTU1BIEVpZ2VuOjppc2Zpbml0ZSBET1hDT01NQSBBcnJheUJhc2U6OmlzaW5mKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9VTkFSWShpc2Zpbml0ZSxzY2FsYXJfaXNmaW5pdGVfb3AsZmluaXRlIHZhbHVlIHRlc3QsXHNhIEVpZ2VuOjppc2luZiBET1hDT01NQSBFaWdlbjo6aXNuYW4gRE9YQ09NTUEgQXJyYXlCYXNlOjppc2Zpbml0ZSkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfVU5BUlkoc2lnbixzY2FsYXJfc2lnbl9vcCxzaWduIChvciAwKSxcc2EgQXJyYXlCYXNlOjpzaWduKQorICAKKyAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgcG93ZXIgb2YgXGEgeCB0byB0aGUgZ2l2ZW4gY29uc3RhbnQgXGEgZXhwb25lbnQuCisgICAgKgorICAgICogXHRwYXJhbSBTY2FsYXJFeHBvbmVudCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgZXhwb25lbnQuIEl0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiAoXGMgRGVyaXZlZDo6U2NhbGFyKS4KKyAgICAqCisgICAgKiBcc2EgQXJyYXlCYXNlOjpwb3coKQorICAgICoKKyAgICAqIFxyZWxhdGVzIEFycmF5QmFzZQorICAgICovCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCx0eXBlbmFtZSBTY2FsYXJFeHBvbmVudD4KKyAgaW5saW5lIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wb3dfb3A8RGVyaXZlZDo6U2NhbGFyLFNjYWxhckV4cG9uZW50PixEZXJpdmVkLENvbnN0YW50PFNjYWxhckV4cG9uZW50PiA+CisgIHBvdyhjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiB4LCBjb25zdCBTY2FsYXJFeHBvbmVudCYgZXhwb25lbnQpOworI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCx0eXBlbmFtZSBTY2FsYXJFeHBvbmVudD4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8ICAgIShpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsU2NhbGFyRXhwb25lbnQ+Ojp2YWx1ZSkgJiYgRUlHRU5fU0NBTEFSX0JJTkFSWV9TVVBQT1JURUQocG93LHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcixTY2FsYXJFeHBvbmVudCksCisgICAgICAgICAgY29uc3QgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyaXZlZCxTY2FsYXJFeHBvbmVudCxwb3cpID46OnR5cGUKKyAgcG93KGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIHgsIGNvbnN0IFNjYWxhckV4cG9uZW50JiBleHBvbmVudCkgeworICAgIHJldHVybiB4LmRlcml2ZWQoKS5wb3coZXhwb25lbnQpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIGNvbnN0IEVJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKERlcml2ZWQsdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLHBvdykKKyAgcG93KGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIHgsIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciYgZXhwb25lbnQpIHsKKyAgICByZXR1cm4geC5kZXJpdmVkKCkucG93KGV4cG9uZW50KTsKKyAgfQorI2VuZGlmCisKKyAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgcG93ZXIgb2YgXGEgeCB0byB0aGUgZ2l2ZW4gYXJyYXkgb2YgXGEgZXhwb25lbnRzLgorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgcG93ZXIuCisgICAgKgorICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYXJyYXlfcG93ZXJfYXJyYXkuY3BwCisgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9hcnJheV9wb3dlcl9hcnJheS5vdXQKKyAgICAqIAorICAgICogXHNhIEFycmF5QmFzZTo6cG93KCkKKyAgICAqCisgICAgKiBccmVsYXRlcyBBcnJheUJhc2UKKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIEV4cG9uZW50RGVyaXZlZD4KKyAgaW5saW5lIGNvbnN0IEVpZ2VuOjpDd2lzZUJpbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX3Bvd19vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsIHR5cGVuYW1lIEV4cG9uZW50RGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgRXhwb25lbnREZXJpdmVkPgorICBwb3coY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgeCwgY29uc3QgRWlnZW46OkFycmF5QmFzZTxFeHBvbmVudERlcml2ZWQ+JiBleHBvbmVudHMpIAorICB7CisgICAgcmV0dXJuIEVpZ2VuOjpDd2lzZUJpbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX3Bvd19vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsIHR5cGVuYW1lIEV4cG9uZW50RGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgRXhwb25lbnREZXJpdmVkPigKKyAgICAgIHguZGVyaXZlZCgpLAorICAgICAgZXhwb25lbnRzLmRlcml2ZWQoKQorICAgICk7CisgIH0KKyAgCisgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHBvd2VyIG9mIHRoZSBzY2FsYXIgXGEgeCB0byB0aGUgZ2l2ZW4gYXJyYXkgb2YgXGEgZXhwb25lbnRzLgorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgcG93ZXIgYmV0d2VlbiBhIHNjYWxhciBhbmQgYW4gYXJyYXkgb2YgZXhwb25lbnRzLgorICAgICoKKyAgICAqIFx0cGFyYW0gU2NhbGFyIGlzIHRoZSBzY2FsYXIgdHlwZSBvZiBcYSB4LiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGFycmF5IGV4cHJlc3Npb24gKFxjIERlcml2ZWQ6OlNjYWxhcikuCisgICAgKgorICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfc2NhbGFyX3Bvd2VyX2FycmF5LmNwcAorICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2Vfc2NhbGFyX3Bvd2VyX2FycmF5Lm91dAorICAgICogCisgICAgKiBcc2EgQXJyYXlCYXNlOjpwb3coKQorICAgICoKKyAgICAqIFxyZWxhdGVzIEFycmF5QmFzZQorICAgICovCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcG93X29wPFNjYWxhcixEZXJpdmVkOjpTY2FsYXI+LENvbnN0YW50PFNjYWxhcj4sRGVyaXZlZD4KKyAgcG93KGNvbnN0IFNjYWxhciYgeCxjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiB4KTsKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8ICAgIShpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsU2NhbGFyPjo6dmFsdWUpICYmIEVJR0VOX1NDQUxBUl9CSU5BUllfU1VQUE9SVEVEKHBvdyxTY2FsYXIsdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyKSwKKyAgICAgICAgICBjb25zdCBFSUdFTl9TQ0FMQVJfQklOQVJZT1BfRVhQUl9SRVRVUk5fVFlQRShTY2FsYXIsRGVyaXZlZCxwb3cpID46OnR5cGUKKyAgcG93KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgZXhwb25lbnRzKQorICB7CisgICAgcmV0dXJuIEVJR0VOX1NDQUxBUl9CSU5BUllPUF9FWFBSX1JFVFVSTl9UWVBFKFNjYWxhcixEZXJpdmVkLHBvdykoCisgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29uc3RhbnRfdHlwZTxEZXJpdmVkLFNjYWxhcj46OnR5cGUoZXhwb25lbnRzLnJvd3MoKSwgZXhwb25lbnRzLmNvbHMoKSwgeCksIGV4cG9uZW50cy5kZXJpdmVkKCkgKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBjb25zdCBFSUdFTl9TQ0FMQVJfQklOQVJZT1BfRVhQUl9SRVRVUk5fVFlQRSh0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsRGVyaXZlZCxwb3cpCisgIHBvdyhjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXImIHgsIGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIGV4cG9uZW50cykKKyAgeworICAgIHJldHVybiBFSUdFTl9TQ0FMQVJfQklOQVJZT1BfRVhQUl9SRVRVUk5fVFlQRSh0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsRGVyaXZlZCxwb3cpKAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbnN0YW50X3R5cGU8RGVyaXZlZCx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+Ojp0eXBlKGV4cG9uZW50cy5yb3dzKCksIGV4cG9uZW50cy5jb2xzKCksIHgpLCBleHBvbmVudHMuZGVyaXZlZCgpICk7CisgIH0KKyNlbmRpZgorCisKKyAgbmFtZXNwYWNlIGludGVybmFsCisgIHsKKyAgICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9FSUdFTl9VTkFSWShyZWFsLHNjYWxhcl9yZWFsX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGltYWcsc2NhbGFyX2ltYWdfb3ApCisgICAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfRUlHRU5fVU5BUlkoYWJzMixzY2FsYXJfYWJzMl9vcCkKKyAgfQorfQorCisvLyBUT0RPOiBjbGVhbmx5IGRpc2FibGUgdGhvc2UgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgb24gQXJyYXkgKG51bWV4dDo6cmVhbF9yZWYsIGludGVybmFsOjpyYW5kb20sIGludGVybmFsOjppc0FwcHJveC4uLikKKworI2VuZGlmIC8vIEVJR0VOX0dMT0JBTF9GVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvSU8uaCBiL0VpZ2VuL3NyYy9Db3JlL0lPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3ZmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0lPLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lPX0gKKyNkZWZpbmUgRUlHRU5fSU9fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworZW51bSB7IERvbnRBbGlnbkNvbHMgPSAxIH07CitlbnVtIHsgU3RyZWFtUHJlY2lzaW9uID0gLTEsCisgICAgICAgRnVsbFByZWNpc2lvbiA9IC0yIH07CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RkOjpvc3RyZWFtICYgcHJpbnRfbWF0cml4KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IERlcml2ZWQmIF9tLCBjb25zdCBJT0Zvcm1hdCYgZm10KTsKK30KKworLyoqIFxjbGFzcyBJT0Zvcm1hdAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3RvcmVzIGEgc2V0IG9mIHBhcmFtZXRlcnMgY29udHJvbGxpbmcgdGhlIHdheSBtYXRyaWNlcyBhcmUgcHJpbnRlZAorICAqCisgICogTGlzdCBvZiBhdmFpbGFibGUgcGFyYW1ldGVyczoKKyAgKiAgLSBcYiBwcmVjaXNpb24gbnVtYmVyIG9mIGRpZ2l0cyBmb3IgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCBvciBvbmUgb2YgdGhlIHNwZWNpYWwgY29uc3RhbnRzIFxjIFN0cmVhbVByZWNpc2lvbiBhbmQgXGMgRnVsbFByZWNpc2lvbi4KKyAgKiAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdGhlIHNwZWNpYWwgdmFsdWUgXGMgU3RyZWFtUHJlY2lzaW9uIHdoaWNoIG1lYW5zIHRvIHVzZSB0aGUKKyAgKiAgICAgICAgICAgICAgICAgc3RyZWFtJ3Mgb3duIHByZWNpc2lvbiBzZXR0aW5nLCBhcyBzZXQgZm9yIGluc3RhbmNlIHVzaW5nIFxjIGNvdXQucHJlY2lzaW9uKDMpLiBUaGUgb3RoZXIgc3BlY2lhbCB2YWx1ZQorICAqICAgICAgICAgICAgICAgICBcYyBGdWxsUHJlY2lzaW9uIG1lYW5zIHRoYXQgdGhlIG51bWJlciBvZiBkaWdpdHMgd2lsbCBiZSBjb21wdXRlZCB0byBtYXRjaCB0aGUgZnVsbCBwcmVjaXNpb24gb2YgZWFjaCBmbG9hdGluZy1wb2ludAorICAqICAgICAgICAgICAgICAgICB0eXBlLgorICAqICAtIFxiIGZsYWdzIGFuIE9SLWVkIGNvbWJpbmF0aW9uIG9mIGZsYWdzLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCB0aGUgb25seSBjdXJyZW50bHkgYXZhaWxhYmxlIGZsYWcgaXMgXGMgRG9udEFsaWduQ29scyB3aGljaAorICAqICAgICAgICAgICAgIGFsbG93cyB0byBkaXNhYmxlIHRoZSBhbGlnbm1lbnQgb2YgY29sdW1ucywgcmVzdWx0aW5nIGluIGZhc3RlciBjb2RlLgorICAqICAtIFxiIGNvZWZmU2VwYXJhdG9yIHN0cmluZyBwcmludGVkIGJldHdlZW4gdHdvIGNvZWZmaWNpZW50cyBvZiB0aGUgc2FtZSByb3cKKyAgKiAgLSBcYiByb3dTZXBhcmF0b3Igc3RyaW5nIHByaW50ZWQgYmV0d2VlbiB0d28gcm93cworICAqICAtIFxiIHJvd1ByZWZpeCBzdHJpbmcgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcm93CisgICogIC0gXGIgcm93U3VmZml4IHN0cmluZyBwcmludGVkIGF0IHRoZSBlbmQgb2YgZWFjaCByb3cKKyAgKiAgLSBcYiBtYXRQcmVmaXggc3RyaW5nIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWF0cml4CisgICogIC0gXGIgbWF0U3VmZml4IHN0cmluZyBwcmludGVkIGF0IHRoZSBlbmQgb2YgdGhlIG1hdHJpeAorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgSU9Gb3JtYXQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSU9Gb3JtYXQub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpmb3JtYXQoKSwgY2xhc3MgV2l0aEZvcm1hdAorICAqLworc3RydWN0IElPRm9ybWF0Cit7CisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBzZWUgY2xhc3MgSU9Gb3JtYXQgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSBwYXJhbWV0ZXJzICovCisgIElPRm9ybWF0KGludCBfcHJlY2lzaW9uID0gU3RyZWFtUHJlY2lzaW9uLCBpbnQgX2ZsYWdzID0gMCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgX2NvZWZmU2VwYXJhdG9yID0gIiAiLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcm93U2VwYXJhdG9yID0gIlxuIiwgY29uc3Qgc3RkOjpzdHJpbmcmIF9yb3dQcmVmaXg9IiIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcm93U3VmZml4PSIiLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbWF0UHJlZml4PSIiLCBjb25zdCBzdGQ6OnN0cmluZyYgX21hdFN1ZmZpeD0iIikKKyAgOiBtYXRQcmVmaXgoX21hdFByZWZpeCksIG1hdFN1ZmZpeChfbWF0U3VmZml4KSwgcm93UHJlZml4KF9yb3dQcmVmaXgpLCByb3dTdWZmaXgoX3Jvd1N1ZmZpeCksIHJvd1NlcGFyYXRvcihfcm93U2VwYXJhdG9yKSwKKyAgICByb3dTcGFjZXIoIiIpLCBjb2VmZlNlcGFyYXRvcihfY29lZmZTZXBhcmF0b3IpLCBwcmVjaXNpb24oX3ByZWNpc2lvbiksIGZsYWdzKF9mbGFncykKKyAgeworICAgIC8vIFRPRE8gY2hlY2sgaWYgcm93UHJlZml4LCByb3dTdWZmaXggb3Igcm93U2VwYXJhdG9yIGNvbnRhaW5zIGEgbmV3bGluZQorICAgIC8vIGRvbid0IGFkZCByb3dTcGFjZXIgaWYgY29sdW1ucyBhcmUgbm90IHRvIGJlIGFsaWduZWQKKyAgICBpZigoZmxhZ3MgJiBEb250QWxpZ25Db2xzKSkKKyAgICAgIHJldHVybjsKKyAgICBpbnQgaSA9IGludChtYXRTdWZmaXgubGVuZ3RoKCkpLTE7CisgICAgd2hpbGUgKGk+PTAgJiYgbWF0U3VmZml4W2ldIT0nXG4nKQorICAgIHsKKyAgICAgIHJvd1NwYWNlciArPSAnICc7CisgICAgICBpLS07CisgICAgfQorICB9CisgIHN0ZDo6c3RyaW5nIG1hdFByZWZpeCwgbWF0U3VmZml4OworICBzdGQ6OnN0cmluZyByb3dQcmVmaXgsIHJvd1N1ZmZpeCwgcm93U2VwYXJhdG9yLCByb3dTcGFjZXI7CisgIHN0ZDo6c3RyaW5nIGNvZWZmU2VwYXJhdG9yOworICBpbnQgcHJlY2lzaW9uOworICBpbnQgZmxhZ3M7Cit9OworCisvKiogXGNsYXNzIFdpdGhGb3JtYXQKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHByb3ZpZGluZyBtYXRyaXggb3V0cHV0IHdpdGggZ2l2ZW4gZm9ybWF0CisgICoKKyAgKiBcdHBhcmFtIEV4cHJlc3Npb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb24gd2hpY2ggSU8gc3RyZWFtIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZAorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gd2l0aCBzdHJlYW0gb3BlcmF0b3JzIGNvbnRyb2xsZWQgYnkgYSBnaXZlbiBJT0Zvcm1hdC4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgRGVuc2VCYXNlOjpmb3JtYXQoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBTZWUgY2xhc3MgSU9Gb3JtYXQgZm9yIHNvbWUgZXhhbXBsZXMuCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpmb3JtYXQoKSwgY2xhc3MgSU9Gb3JtYXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorY2xhc3MgV2l0aEZvcm1hdAoreworICBwdWJsaWM6CisKKyAgICBXaXRoRm9ybWF0KGNvbnN0IEV4cHJlc3Npb25UeXBlJiBtYXRyaXgsIGNvbnN0IElPRm9ybWF0JiBmb3JtYXQpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeCksIG1fZm9ybWF0KGZvcm1hdCkKKyAgICB7fQorCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBXaXRoRm9ybWF0JiB3ZikKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnByaW50X21hdHJpeChzLCB3Zi5tX21hdHJpeC5ldmFsKCksIHdmLm1fZm9ybWF0KTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpOZXN0ZWQgbV9tYXRyaXg7CisgICAgSU9Gb3JtYXQgbV9mb3JtYXQ7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBOT1RFOiBUaGlzIGhlbHBlciBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY29kZSBzcGVjaWFsaXppbmcKKy8vICAgICAgIHRoaXMgaW50ZXJuYWw6OnNpZ25pZmljYW50X2RlY2ltYWxzX2ltcGwgc3RydWN0dXJlLiBJbiB0aGUgZnV0dXJlIHdlIHNob3VsZCBkaXJlY3RseQorLy8gICAgICAgY2FsbCBkaWdpdHMxMCgpIHdoaWNoIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gSnVseSAyMDE2IGluIDMuMy4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzaWduaWZpY2FudF9kZWNpbWFsc19pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgaW50IHJ1bigpCisgIHsKKyAgICByZXR1cm4gTnVtVHJhaXRzPFNjYWxhcj46OmRpZ2l0czEwKCk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBwcmludCB0aGUgbWF0cml4IFxhIF9tIHRvIHRoZSBvdXRwdXQgc3RyZWFtIFxhIHMgdXNpbmcgdGhlIG91dHB1dCBmb3JtYXQgXGEgZm10ICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RkOjpvc3RyZWFtICYgcHJpbnRfbWF0cml4KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IERlcml2ZWQmIF9tLCBjb25zdCBJT0Zvcm1hdCYgZm10KQoreworICBpZihfbS5zaXplKCkgPT0gMCkKKyAgeworICAgIHMgPDwgZm10Lm1hdFByZWZpeCA8PCBmbXQubWF0U3VmZml4OworICAgIHJldHVybiBzOworICB9CisgIAorICB0eXBlbmFtZSBEZXJpdmVkOjpOZXN0ZWQgbSA9IF9tOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggd2lkdGggPSAwOworCisgIHN0ZDo6c3RyZWFtc2l6ZSBleHBsaWNpdF9wcmVjaXNpb247CisgIGlmKGZtdC5wcmVjaXNpb24gPT0gU3RyZWFtUHJlY2lzaW9uKQorICB7CisgICAgZXhwbGljaXRfcHJlY2lzaW9uID0gMDsKKyAgfQorICBlbHNlIGlmKGZtdC5wcmVjaXNpb24gPT0gRnVsbFByZWNpc2lvbikKKyAgeworICAgIGlmIChOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQorICAgIHsKKyAgICAgIGV4cGxpY2l0X3ByZWNpc2lvbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBleHBsaWNpdF9wcmVjaXNpb24gPSBzaWduaWZpY2FudF9kZWNpbWFsc19pbXBsPFNjYWxhcj46OnJ1bigpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBleHBsaWNpdF9wcmVjaXNpb24gPSBmbXQucHJlY2lzaW9uOworICB9CisKKyAgc3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSAwOworICBpZihleHBsaWNpdF9wcmVjaXNpb24pIG9sZF9wcmVjaXNpb24gPSBzLnByZWNpc2lvbihleHBsaWNpdF9wcmVjaXNpb24pOworCisgIGJvb2wgYWxpZ25fY29scyA9ICEoZm10LmZsYWdzICYgRG9udEFsaWduQ29scyk7CisgIGlmKGFsaWduX2NvbHMpCisgIHsKKyAgICAvLyBjb21wdXRlIHRoZSBsYXJnZXN0IHdpZHRoCisgICAgZm9yKEluZGV4IGogPSAwOyBqIDwgbS5jb2xzKCk7ICsraikKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG0ucm93cygpOyArK2kpCisgICAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHI7CisgICAgICAgIHNzdHIuY29weWZtdChzKTsKKyAgICAgICAgc3N0ciA8PCBtLmNvZWZmKGksaik7CisgICAgICAgIHdpZHRoID0gc3RkOjptYXg8SW5kZXg+KHdpZHRoLCBJbmRleChzc3RyLnN0cigpLmxlbmd0aCgpKSk7CisgICAgICB9CisgIH0KKyAgcyA8PCBmbXQubWF0UHJlZml4OworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtLnJvd3MoKTsgKytpKQorICB7CisgICAgaWYgKGkpCisgICAgICBzIDw8IGZtdC5yb3dTcGFjZXI7CisgICAgcyA8PCBmbXQucm93UHJlZml4OworICAgIGlmKHdpZHRoKSBzLndpZHRoKHdpZHRoKTsKKyAgICBzIDw8IG0uY29lZmYoaSwgMCk7CisgICAgZm9yKEluZGV4IGogPSAxOyBqIDwgbS5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBzIDw8IGZtdC5jb2VmZlNlcGFyYXRvcjsKKyAgICAgIGlmICh3aWR0aCkgcy53aWR0aCh3aWR0aCk7CisgICAgICBzIDw8IG0uY29lZmYoaSwgaik7CisgICAgfQorICAgIHMgPDwgZm10LnJvd1N1ZmZpeDsKKyAgICBpZiggaSA8IG0ucm93cygpIC0gMSkKKyAgICAgIHMgPDwgZm10LnJvd1NlcGFyYXRvcjsKKyAgfQorICBzIDw8IGZtdC5tYXRTdWZmaXg7CisgIGlmKGV4cGxpY2l0X3ByZWNpc2lvbikgcy5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7CisgIHJldHVybiBzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZWxhdGVzIERlbnNlQmFzZQorICAqCisgICogT3V0cHV0cyB0aGUgbWF0cml4LCB0byB0aGUgZ2l2ZW4gc3RyZWFtLgorICAqCisgICogSWYgeW91IHdpc2ggdG8gcHJpbnQgdGhlIG1hdHJpeCB3aXRoIGEgZm9ybWF0IGRpZmZlcmVudCB0aGFuIHRoZSBkZWZhdWx0LCB1c2UgRGVuc2VCYXNlOjpmb3JtYXQoKS4KKyAgKgorICAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGZvcm1hdCBieSBkZWZpbmluZyBFSUdFTl9ERUZBVUxUX0lPX0ZPUk1BVCBiZWZvcmUgaW5jbHVkaW5nIEVpZ2VuIGhlYWRlcnMuCisgICogSWYgbm90IGRlZmluZWQsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlZmluZWQgdG8gRWlnZW46OklPRm9ybWF0KCksIHRoYXQgaXMgdGhlIEVpZ2VuOjpJT0Zvcm1hdCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycy4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OmZvcm1hdCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwKKyhzdGQ6Om9zdHJlYW0gJiBzLAorIGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkPiAmIG0pCit7CisgIHJldHVybiBpbnRlcm5hbDo6cHJpbnRfbWF0cml4KHMsIG0uZXZhbCgpLCBFSUdFTl9ERUZBVUxUX0lPX0ZPUk1BVCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSU9fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvSW52ZXJzZS5oIGIvRWlnZW4vc3JjL0NvcmUvSW52ZXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NmYwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9JbnZlcnNlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JTlZFUlNFX0gKKyNkZWZpbmUgRUlHRU5fSU5WRVJTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLHR5cGVuYW1lIFN0b3JhZ2VLaW5kPiBjbGFzcyBJbnZlcnNlSW1wbDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCB0cmFpdHM8SW52ZXJzZTxYcHJUeXBlPiA+CisgIDogdHJhaXRzPHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICB0eXBlZGVmIHRyYWl0czxQbGFpbk9iamVjdD4gQmFzZVRyYWl0czsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBCYXNlVHJhaXRzOjpGbGFncyAmIFJvd01ham9yQml0CisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxjbGFzcyBJbnZlcnNlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiB0aGUgaW52ZXJzZSBvZiBhbm90aGVyIGV4cHJlc3Npb24KKyAgKgorICAqIFx0cGFyYW0gWHByVHlwZSB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiB3ZSBhcmUgdGFraW5nIHRoZSBpbnZlcnNlCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZXhwcmVzc2lvbiBvZiBBLmludmVyc2UoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBJbnZlcnNlIDogcHVibGljIEludmVyc2VJbXBsPFhwclR5cGUsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U3RvcmFnZUtpbmQ+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpQbGFpbk9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPFhwclR5cGU+Ojp0eXBlICAgICAgWHByVHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxYcHJUeXBlTmVzdGVkPjo6dHlwZSAgWHByVHlwZU5lc3RlZENsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxJbnZlcnNlPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8WHByVHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKyAgCisgIGV4cGxpY2l0IEVJR0VOX0RFVklDRV9GVU5DIEludmVyc2UoY29uc3QgWHByVHlwZSAmeHByKQorICAgIDogbV94cHIoeHByKQorICB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3hwci5yb3dzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1feHByLmNvbHMoKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFhwclR5cGVOZXN0ZWRDbGVhbmVkJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworcHJvdGVjdGVkOgorICBYcHJUeXBlTmVzdGVkIG1feHByOworfTsKKworLy8gR2VuZXJpYyBBUEkgZGlzcGF0Y2hlcgordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBJbnZlcnNlSW1wbAorICA6IHB1YmxpYyBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxJbnZlcnNlPFhwclR5cGU+ID46OnR5cGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxJbnZlcnNlPFhwclR5cGU+ID46OnR5cGUgQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworcHJpdmF0ZToKKworICBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0OworICBTY2FsYXIgY29lZmYoSW5kZXggaSkgY29uc3Q7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIERlZmF1bHQgZXZhbHVhdG9yIGZvciBJbnZlcnNlIGV4cHJlc3Npb24uCisgICogCisgICogVGhpcyBkZWZhdWx0IGV2YWx1YXRvciBmb3IgSW52ZXJzZSBleHByZXNzaW9uIHNpbXBseSBldmFsdWF0ZSB0aGUgaW52ZXJzZSBpbnRvIGEgdGVtcG9yYXJ5CisgICogYnkgYSBjYWxsIHRvIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMuCisgICogVGhlcmVmb3JlLCBpbnZlcnNlIGltcGxlbWVudGVycyBvbmx5IGhhdmUgdG8gc3BlY2lhbGl6ZSBBc3NpZ25tZW50PERzdCxJbnZlcnNlPC4uLj4sIC4uLj4gZm9yCisgICogdGhlcmUgb3duIG5lc3RlZCBleHByZXNzaW9uLgorICAqCisgICogXHNhIGNsYXNzIEludmVyc2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEludmVyc2U8QXJnVHlwZT4gPgorICA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgSW52ZXJzZTxBcmdUeXBlPjo6UGxhaW5PYmplY3Q+Cit7CisgIHR5cGVkZWYgSW52ZXJzZTxBcmdUeXBlPiBJbnZlcnNlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbnZlcnNlVHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFBsYWluT2JqZWN0PiBCYXNlOworICAKKyAgZW51bSB7IEZsYWdzID0gQmFzZTo6RmxhZ3MgfCBFdmFsQmVmb3JlTmVzdGluZ0JpdCB9OworCisgIHVuYXJ5X2V2YWx1YXRvcihjb25zdCBJbnZlcnNlVHlwZSYgaW52X3hwcikKKyAgICA6IG1fcmVzdWx0KGludl94cHIucm93cygpLCBpbnZfeHByLmNvbHMoKSkKKyAgeworICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UobV9yZXN1bHQpOworICAgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMobV9yZXN1bHQsIGludl94cHIpOworICB9CisgIAorcHJvdGVjdGVkOgorICBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSU5WRVJTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9NYXAuaCBiL0VpZ2VuL3NyYy9Db3JlL01hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDE5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9NYXAuaApAQCAtMCwwICsxLDE2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFQX0gKKyNkZWZpbmUgRUlHRU5fTUFQX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsIGludCBNYXBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorc3RydWN0IHRyYWl0czxNYXA8UGxhaW5PYmplY3RUeXBlLCBNYXBPcHRpb25zLCBTdHJpZGVUeXBlPiA+CisgIDogcHVibGljIHRyYWl0czxQbGFpbk9iamVjdFR5cGU+Cit7CisgIHR5cGVkZWYgdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4gVHJhaXRzQmFzZTsKKyAgZW51bSB7CisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoUGxhaW5PYmplY3RUeXBlOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSksCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoUGxhaW5PYmplY3RUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KFN0cmlkZVR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSksCisgICAgQWxpZ25tZW50ID0gaW50KE1hcE9wdGlvbnMpJmludChBbGlnbmVkTWFzayksCisgICAgRmxhZ3MwID0gVHJhaXRzQmFzZTo6RmxhZ3MgJiAofk5lc3RCeVJlZkJpdCksCisgICAgRmxhZ3MgPSBpc19sdmFsdWU8UGxhaW5PYmplY3RUeXBlPjo6dmFsdWUgPyBpbnQoRmxhZ3MwKSA6IChpbnQoRmxhZ3MwKSAmIH5MdmFsdWVCaXQpCisgIH07Citwcml2YXRlOgorICBlbnVtIHsgT3B0aW9ucyB9OyAvLyBFeHByZXNzaW9ucyBkb24ndCBoYXZlIE9wdGlvbnMKK307Cit9CisKKy8qKiBcY2xhc3MgTWFwCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBBIG1hdHJpeCBvciB2ZWN0b3IgZXhwcmVzc2lvbiBtYXBwaW5nIGFuIGV4aXN0aW5nIGFycmF5IG9mIGRhdGEuCisgICoKKyAgKiBcdHBhcmFtIFBsYWluT2JqZWN0VHlwZSB0aGUgZXF1aXZhbGVudCBtYXRyaXggdHlwZSBvZiB0aGUgbWFwcGVkIGRhdGEKKyAgKiBcdHBhcmFtIE1hcE9wdGlvbnMgc3BlY2lmaWVzIHRoZSBwb2ludGVyIGFsaWdubWVudCBpbiBieXRlcy4gSXQgY2FuIGJlOiBcYyAjQWxpZ25lZDEyOCwgLCBcYyAjQWxpZ25lZDY0LCBcYyAjQWxpZ25lZDMyLCBcYyAjQWxpZ25lZDE2LCBcYyAjQWxpZ25lZDggb3IgXGMgI1VuYWxpZ25lZC4KKyAgKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBcYyAjVW5hbGlnbmVkLgorICAqIFx0cGFyYW0gU3RyaWRlVHlwZSBvcHRpb25hbGx5IHNwZWNpZmllcyBzdHJpZGVzLiBCeSBkZWZhdWx0LCBNYXAgYXNzdW1lcyB0aGUgbWVtb3J5IGxheW91dAorICAqICAgICAgICAgICAgICAgICAgIG9mIGFuIG9yZGluYXJ5LCBjb250aWd1b3VzIGFycmF5LiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWNpZnlpbmcgc3RyaWRlcy4KKyAgKiAgICAgICAgICAgICAgICAgICBUaGUgdHlwZSBwYXNzZWQgaGVyZSBtdXN0IGJlIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlIFN0cmlkZSB0ZW1wbGF0ZSwgc2VlIGV4YW1wbGVzIGJlbG93LgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbWF0cml4IG9yIHZlY3RvciBleHByZXNzaW9uIG1hcHBpbmcgYW4gZXhpc3RpbmcgYXJyYXkgb2YgZGF0YS4KKyAgKiBJdCBjYW4gYmUgdXNlZCB0byBsZXQgRWlnZW4gaW50ZXJmYWNlIHdpdGhvdXQgYW55IG92ZXJoZWFkIHdpdGggbm9uLUVpZ2VuIGRhdGEgc3RydWN0dXJlcywKKyAgKiBzdWNoIGFzIHBsYWluIEMgYXJyYXlzIG9yIHN0cnVjdHVyZXMgZnJvbSBvdGhlciBsaWJyYXJpZXMuIEJ5IGRlZmF1bHQsIGl0IGFzc3VtZXMgdGhhdCB0aGUKKyAgKiBkYXRhIGlzIGxhaWQgb3V0IGNvbnRpZ3VvdXNseSBpbiBtZW1vcnkuIFlvdSBjYW4gaG93ZXZlciBvdmVycmlkZSB0aGlzIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZworICAqIGlubmVyIGFuZCBvdXRlciBzdHJpZGVzLgorICAqCisgICogSGVyZSdzIGFuIGV4YW1wbGUgb2Ygc2ltcGx5IG1hcHBpbmcgYSBjb250aWd1b3VzIGFycmF5IGFzIGEgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgImNvbHVtbi1tYWpvciIgbWF0cml4OgorICAqIFxpbmNsdWRlIE1hcF9zaW1wbGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWFwX3NpbXBsZS5vdXQKKyAgKgorICAqIElmIHlvdSBuZWVkIHRvIG1hcCBub24tY29udGlndW91cyBhcnJheXMsIHlvdSBjYW4gZG8gc28gYnkgc3BlY2lmeWluZyBzdHJpZGVzOgorICAqCisgICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgbWFwcGluZyBhbiBhcnJheSBhcyBhIHZlY3Rvciwgc3BlY2lmeWluZyBhbiBpbm5lciBzdHJpZGUsIHRoYXQgaXMsIHRoZSBwb2ludGVyCisgICogaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGNvZWZmaWNpZW50cy4gSGVyZSwgd2UncmUgc3BlY2lmeWluZyB0aGUgaW5uZXIgc3RyaWRlIGFzIGEgY29tcGlsZS10aW1lCisgICogZml4ZWQgdmFsdWUuCisgICogXGluY2x1ZGUgTWFwX2lubmVyX3N0cmlkZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXBfaW5uZXJfc3RyaWRlLm91dAorICAqCisgICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgbWFwcGluZyBhbiBhcnJheSB3aGlsZSBzcGVjaWZ5aW5nIGFuIG91dGVyIHN0cmlkZS4gSGVyZSwgc2luY2Ugd2UncmUgbWFwcGluZworICAqIGFzIGEgY29sdW1uLW1ham9yIG1hdHJpeCwgJ291dGVyIHN0cmlkZScgbWVhbnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGNvbHVtbnMuCisgICogSGVyZSwgd2UncmUgc3BlY2lmeWluZyB0aGUgb3V0ZXIgc3RyaWRlIGFzIGEgcnVudGltZSBwYXJhbWV0ZXIuIE5vdGUgdGhhdCBoZXJlIFxjIE91dGVyU3RyaWRlPD4gaXMKKyAgKiBhIHNob3J0IHZlcnNpb24gb2YgXGMgT3V0ZXJTdHJpZGU8RHluYW1pYz4gYmVjYXVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgT3V0ZXJTdHJpZGUKKyAgKiBpcyAgXGMgRHluYW1pYworICAqIFxpbmNsdWRlIE1hcF9vdXRlcl9zdHJpZGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWFwX291dGVyX3N0cmlkZS5vdXQKKyAgKgorICAqIEZvciBtb3JlIGRldGFpbHMgYW5kIGZvciBhbiBleGFtcGxlIG9mIHNwZWNpZnlpbmcgYm90aCBhbiBpbm5lciBhbmQgYW4gb3V0ZXIgc3RyaWRlLCBzZWUgY2xhc3MgU3RyaWRlLgorICAqCisgICogXGIgVGlwOiB0byBjaGFuZ2UgdGhlIGFycmF5IG9mIGRhdGEgbWFwcGVkIGJ5IGEgTWFwIG9iamVjdCwgeW91IGNhbiB1c2UgdGhlIEMrKworICAqIHBsYWNlbWVudCBuZXcgc3ludGF4OgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWFwX3BsYWNlbWVudF9uZXcuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWFwX3BsYWNlbWVudF9uZXcub3V0CisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIHRoZSByZXR1cm4gdHlwZSBvZiBQbGFpbk9iamVjdEJhc2U6Ok1hcCgpIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5LgorICAqCisgICogXHNhIFBsYWluT2JqZWN0QmFzZTo6TWFwKCksIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsIGludCBNYXBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPiBjbGFzcyBNYXAKKyAgOiBwdWJsaWMgTWFwQmFzZTxNYXA8UGxhaW5PYmplY3RUeXBlLCBNYXBPcHRpb25zLCBTdHJpZGVUeXBlPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWFwQmFzZTxNYXA+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShNYXApCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBvaW50ZXJUeXBlIFBvaW50ZXJUeXBlOworICAgIHR5cGVkZWYgUG9pbnRlclR5cGUgUG9pbnRlckFyZ1R5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgUG9pbnRlclR5cGUgY2FzdF90b19wb2ludGVyX3R5cGUoUG9pbnRlckFyZ1R5cGUgcHRyKSB7IHJldHVybiBwdHI7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IDAgPyBtX3N0cmlkZS5pbm5lcigpIDogMTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFN0cmlkZVR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSAhPSAwID8gbV9zdHJpZGUub3V0ZXIoKQorICAgICAgICAgICA6IElzVmVjdG9yQXRDb21waWxlVGltZSA/IHRoaXMtPnNpemUoKQorICAgICAgICAgICA6IGludChGbGFncykmUm93TWFqb3JCaXQgPyB0aGlzLT5jb2xzKCkKKyAgICAgICAgICAgOiB0aGlzLT5yb3dzKCk7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdG9yIGluIHRoZSBmaXhlZC1zaXplIGNhc2UuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBkYXRhUHRyIHBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIG1hcAorICAgICAgKiBccGFyYW0gc3RyaWRlIG9wdGlvbmFsIFN0cmlkZSBvYmplY3QsIHBhc3NpbmcgdGhlIHN0cmlkZXMuCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZXhwbGljaXQgaW5saW5lIE1hcChQb2ludGVyQXJnVHlwZSBkYXRhUHRyLCBjb25zdCBTdHJpZGVUeXBlJiBzdHJpZGUgPSBTdHJpZGVUeXBlKCkpCisgICAgICA6IEJhc2UoY2FzdF90b19wb2ludGVyX3R5cGUoZGF0YVB0cikpLCBtX3N0cmlkZShzdHJpZGUpCisgICAgeworICAgICAgUGxhaW5PYmplY3RUeXBlOjpCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdG9yIGluIHRoZSBkeW5hbWljLXNpemUgdmVjdG9yIGNhc2UuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBkYXRhUHRyIHBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIG1hcAorICAgICAgKiBccGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yIGV4cHJlc3Npb24KKyAgICAgICogXHBhcmFtIHN0cmlkZSBvcHRpb25hbCBTdHJpZGUgb2JqZWN0LCBwYXNzaW5nIHRoZSBzdHJpZGVzLgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBNYXAoUG9pbnRlckFyZ1R5cGUgZGF0YVB0ciwgSW5kZXggc2l6ZSwgY29uc3QgU3RyaWRlVHlwZSYgc3RyaWRlID0gU3RyaWRlVHlwZSgpKQorICAgICAgOiBCYXNlKGNhc3RfdG9fcG9pbnRlcl90eXBlKGRhdGFQdHIpLCBzaXplKSwgbV9zdHJpZGUoc3RyaWRlKQorICAgIHsKKyAgICAgIFBsYWluT2JqZWN0VHlwZTo6QmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RvciBpbiB0aGUgZHluYW1pYy1zaXplIG1hdHJpeCBjYXNlLgorICAgICAgKgorICAgICAgKiBccGFyYW0gZGF0YVB0ciBwb2ludGVyIHRvIHRoZSBhcnJheSB0byBtYXAKKyAgICAgICogXHBhcmFtIHJvd3MgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBtYXRyaXggZXhwcmVzc2lvbgorICAgICAgKiBccGFyYW0gY29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBleHByZXNzaW9uCisgICAgICAqIFxwYXJhbSBzdHJpZGUgb3B0aW9uYWwgU3RyaWRlIG9iamVjdCwgcGFzc2luZyB0aGUgc3RyaWRlcy4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFN0cmlkZVR5cGUmIHN0cmlkZSA9IFN0cmlkZVR5cGUoKSkKKyAgICAgIDogQmFzZShjYXN0X3RvX3BvaW50ZXJfdHlwZShkYXRhUHRyKSwgcm93cywgY29scyksIG1fc3RyaWRlKHN0cmlkZSkKKyAgICB7CisgICAgICBQbGFpbk9iamVjdFR5cGU6OkJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICB9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKE1hcCkKKworICBwcm90ZWN0ZWQ6CisgICAgU3RyaWRlVHlwZSBtX3N0cmlkZTsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVBfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTWFwQmFzZS5oIGIvRWlnZW4vc3JjL0NvcmUvTWFwQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGY5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9NYXBCYXNlLmgKQEAgLTAsMCArMSwyOTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BUEJBU0VfSAorI2RlZmluZSBFSUdFTl9NQVBCQVNFX0gKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKSBcCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnQoaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPjo6RmxhZ3MpICYgTGluZWFyQWNjZXNzQml0KSB8fCBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWU9VX0FSRV9UUllJTkdfVE9fVVNFX0FOX0lOREVYX0JBU0VEX0FDQ0VTU09SX09OX0FOX0VYUFJFU1NJT05fVEhBVF9ET0VTX05PVF9TVVBQT1JUX1RIQVQpCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBkZW5zZSBNYXAgYW5kIEJsb2NrIGV4cHJlc3Npb24gd2l0aCBkaXJlY3QgYWNjZXNzCisgICoKKyAgKiBUaGlzIGJhc2UgY2xhc3MgcHJvdmlkZXMgdGhlIGNvbnN0IGxvdy1sZXZlbCBhY2Nlc3NvcnMgKGUuZy4gY29lZmYsIGNvZWZmUmVmKSBvZiBkZW5zZQorICAqIE1hcCBhbmQgQmxvY2sgb2JqZWN0cyB3aXRoIGRpcmVjdCBhY2Nlc3MuCisgICogVHlwaWNhbCB1c2VycyBkbyBub3QgaGF2ZSB0byBkaXJlY3RseSBkZWFsIHdpdGggdGhpcyBjbGFzcy4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIGJ5IHRocm91Z2ggdGhlIG1hY3JvIHBsdWdpbiBcYyBFSUdFTl9NQVBCQVNFX1BMVUdJTi4KKyAgKiBTZWUgXGxpbmsgVG9waWNDdXN0b21pemluZ19QbHVnaW5zIGN1c3RvbWl6aW5nIEVpZ2VuIFxlbmRsaW5rIGZvciBkZXRhaWxzLgorICAqCisgICogVGhlIFxjIERlcml2ZWQgY2xhc3MgaGFzIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBkZXNjcmliaW5nIHRoZSBtZW1vcnkgbGF5b3V0OgorICAqICBcY29kZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0OyBcZW5kY29kZQorICAqICBcY29kZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0OyBcZW5kY29kZQorICAqCisgICogXHNhIGNsYXNzIE1hcCwgY2xhc3MgQmxvY2sKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hcEJhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+CisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZSBCYXNlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IEJhc2U6OlNpemVBdENvbXBpbGVUaW1lCisgICAgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2woaW50ZXJuYWw6OmlzX2x2YWx1ZTxEZXJpdmVkPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciAqPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworLy8gICAgdXNpbmcgQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU7CisvLyAgICB1c2luZyBCYXNlOjpDb2xzQXRDb21waWxlVGltZTsKKy8vICAgIHVzaW5nIEJhc2U6OlNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFJvd3NBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heENvbHNBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpGbGFnczsKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworCisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisgICAgdXNpbmcgQmFzZTo6bGF6eUFzc2lnbjsKKyAgICB1c2luZyBCYXNlOjpldmFsOworCisgICAgdXNpbmcgQmFzZTo6aW5uZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6b3V0ZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6cm93U3RyaWRlOworICAgIHVzaW5nIEJhc2U6OmNvbFN0cmlkZTsKKworICAgIC8vIGJ1ZyAyMTcgLSBjb21waWxlIGVycm9yIG9uIElDQyAxMS4xCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgICAgLyoqIFxjb3B5ZG9jIERlbnNlQmFzZTo6cm93cygpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3MudmFsdWUoKTsgfQorICAgIC8qKiBcY29weWRvYyBEZW5zZUJhc2U6OmNvbHMoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzLnZhbHVlKCk7IH0KKworICAgIC8qKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29lZmZpY2llbnQgb2YgdGhlIG1hdHJpeCBvciB2ZWN0b3IuCisgICAgICAqCisgICAgICAqIFxub3RlIFdoZW4gYWRkcmVzc2luZyB0aGlzIGRhdGEsIG1ha2Ugc3VyZSB0byBob25vciB0aGUgc3RyaWRlcyByZXR1cm5lZCBieSBpbm5lclN0cmlkZSgpIGFuZCBvdXRlclN0cmlkZSgpLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICAvKiogXGNvcHlkb2MgUGxhaW5PYmplY3RCYXNlOjpjb2VmZihJbmRleCxJbmRleCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IHJvd0lkLCBJbmRleCBjb2xJZCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9kYXRhW2NvbElkICogY29sU3RyaWRlKCkgKyByb3dJZCAqIHJvd1N0cmlkZSgpXTsKKyAgICB9CisKKyAgICAvKiogXGNvcHlkb2MgUGxhaW5PYmplY3RCYXNlOjpjb2VmZihJbmRleCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfSU5ERVhfQkFTRURfQUNDRVNTKERlcml2ZWQpCisgICAgICByZXR1cm4gbV9kYXRhW2luZGV4ICogaW5uZXJTdHJpZGUoKV07CisgICAgfQorCisgICAgLyoqIFxjb3B5ZG9jIFBsYWluT2JqZWN0QmFzZTo6Y29lZmZSZWYoSW5kZXgsSW5kZXgpIGNvbnN0ICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3dJZCwgSW5kZXggY29sSWQpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtjb2xJZCAqIGNvbFN0cmlkZSgpICsgcm93SWQgKiByb3dTdHJpZGUoKV07CisgICAgfQorCisgICAgLyoqIFxjb3B5ZG9jIFBsYWluT2JqZWN0QmFzZTo6Y29lZmZSZWYoSW5kZXgpIGNvbnN0ICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKQorICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtpbmRleCAqIGlubmVyU3RyaWRlKCldOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93SWQsIEluZGV4IGNvbElkKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFNjYWxhciwgTG9hZE1vZGU+CisgICAgICAgICAgICAgICAobV9kYXRhICsgKGNvbElkICogY29sU3RyaWRlKCkgKyByb3dJZCAqIHJvd1N0cmlkZSgpKSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKQorICAgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8UGFja2V0U2NhbGFyLCBMb2FkTW9kZT4obV9kYXRhICsgaW5kZXggKiBpbm5lclN0cmlkZSgpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIENvbnN0cnVjdG9yIGZvciBmaXhlZCBzaXplIG1hdHJpY2VzIG9yIHZlY3RvcnMgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGFQdHIpIDogbV9kYXRhKGRhdGFQdHIpLCBtX3Jvd3MoUm93c0F0Q29tcGlsZVRpbWUpLCBtX2NvbHMoQ29sc0F0Q29tcGlsZVRpbWUpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9GSVhFRF9TSVpFKERlcml2ZWQpCisgICAgICBjaGVja1Nhbml0eTxEZXJpdmVkPigpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgQ29uc3RydWN0b3IgZm9yIGR5bmFtaWNhbGx5IHNpemVkIHZlY3RvcnMgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGFQdHIsIEluZGV4IHZlY1NpemUpCisgICAgICAgICAgICA6IG1fZGF0YShkYXRhUHRyKSwKKyAgICAgICAgICAgICAgbV9yb3dzKFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyB2ZWNTaXplIDogSW5kZXgoUm93c0F0Q29tcGlsZVRpbWUpKSwKKyAgICAgICAgICAgICAgbV9jb2xzKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyB2ZWNTaXplIDogSW5kZXgoQ29sc0F0Q29tcGlsZVRpbWUpKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgICAgIGVpZ2VuX2Fzc2VydCh2ZWNTaXplID49IDApOworICAgICAgZWlnZW5fYXNzZXJ0KGRhdGFQdHIgPT0gMCB8fCBTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IFNpemVBdENvbXBpbGVUaW1lID09IHZlY1NpemUpOworICAgICAgY2hlY2tTYW5pdHk8RGVyaXZlZD4oKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIENvbnN0cnVjdG9yIGZvciBkeW5hbWljYWxseSBzaXplZCBtYXRyaWNlcyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIE1hcEJhc2UoUG9pbnRlclR5cGUgZGF0YVB0ciwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICAgICAgICAgIDogbV9kYXRhKGRhdGFQdHIpLCBtX3Jvd3Mocm93cyksIG1fY29scyhjb2xzKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCggKGRhdGFQdHIgPT0gMCkKKyAgICAgICAgICAgICAgfHwgKCAgIHJvd3MgPj0gMCAmJiAoUm93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyB8fCBSb3dzQXRDb21waWxlVGltZSA9PSByb3dzKQorICAgICAgICAgICAgICAgICAgJiYgY29scyA+PSAwICYmIChDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IENvbHNBdENvbXBpbGVUaW1lID09IGNvbHMpKSk7CisgICAgICBjaGVja1Nhbml0eTxEZXJpdmVkPigpOworICAgIH0KKworICAgICNpZmRlZiBFSUdFTl9NQVBCQVNFX1BMVUdJTgorICAgICNpbmNsdWRlIEVJR0VOX01BUEJBU0VfUExVR0lOCisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgY2hlY2tTYW5pdHkodHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwoaW50ZXJuYWw6OnRyYWl0czxUPjo6QWxpZ25tZW50PjApLHZvaWQqPjo6dHlwZSA9IDApIGNvbnN0CisgICAgeworI2lmIEVJR0VOX01BWF9BTElHTl9CWVRFUz4wCisgICAgICBlaWdlbl9hc3NlcnQoKCAgICgoaW50ZXJuYWw6OlVJbnRQdHIobV9kYXRhKSAlIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkFsaWdubWVudCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNvbHMoKSAqIHJvd3MoKSAqIGlubmVyU3RyaWRlKCkgKiBzaXplb2YoU2NhbGFyKSkgPCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpBbGlnbm1lbnQgKSAmJiAiZGF0YSBpcyBub3QgYWxpZ25lZCIpOworI2VuZGlmCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgY2hlY2tTYW5pdHkodHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxpbnRlcm5hbDo6dHJhaXRzPFQ+OjpBbGlnbm1lbnQ9PTAsdm9pZCo+Ojp0eXBlID0gMCkgY29uc3QKKyAgICB7fQorCisgICAgUG9pbnRlclR5cGUgbV9kYXRhOworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzQXRDb21waWxlVGltZT4gbV9yb3dzOworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBDb2xzQXRDb21waWxlVGltZT4gbV9jb2xzOworfTsKKworLyoqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQmFzZSBjbGFzcyBmb3Igbm9uLWNvbnN0IGRlbnNlIE1hcCBhbmQgQmxvY2sgZXhwcmVzc2lvbiB3aXRoIGRpcmVjdCBhY2Nlc3MKKyAgKgorICAqIFRoaXMgYmFzZSBjbGFzcyBwcm92aWRlcyB0aGUgbm9uLWNvbnN0IGxvdy1sZXZlbCBhY2Nlc3NvcnMgKGUuZy4gY29lZmYgYW5kIGNvZWZmUmVmKSBvZgorICAqIGRlbnNlIE1hcCBhbmQgQmxvY2sgb2JqZWN0cyB3aXRoIGRpcmVjdCBhY2Nlc3MuCisgICogSXQgaW5oZXJpdHMgTWFwQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gd2hpY2ggZGVmaW5lcyB0aGUgY29uc3QgdmFyaWFudCBmb3IgcmVhZGluZyBzcGVjaWZpYyBlbnRyaWVzLgorICAqCisgICogXHNhIGNsYXNzIE1hcCwgY2xhc3MgQmxvY2sKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hcEJhc2U8RGVyaXZlZCwgV3JpdGVBY2Nlc3NvcnM+CisgIDogcHVibGljIE1hcEJhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgICAgdHlwZWRlZiBNYXBCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiBSZWFkT25seU1hcEJhc2U7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWFwQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gQmFzZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBhY2tldFNjYWxhciBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UG9pbnRlclR5cGUgUG9pbnRlclR5cGU7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OnJvd3M7CisgICAgdXNpbmcgQmFzZTo6Y29sczsKKyAgICB1c2luZyBCYXNlOjpzaXplOworICAgIHVzaW5nIEJhc2U6OmNvZWZmOworICAgIHVzaW5nIEJhc2U6OmNvZWZmUmVmOworCisgICAgdXNpbmcgQmFzZTo6aW5uZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6b3V0ZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6cm93U3RyaWRlOworICAgIHVzaW5nIEJhc2U6OmNvbFN0cmlkZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aXNfbHZhbHVlPERlcml2ZWQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgU2NhbGFyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIKKyAgICAgICAgICAgICAgICAgID46OnR5cGUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWU7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiB0aGlzLT5tX2RhdGE7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSogZGF0YSgpIHsgcmV0dXJuIHRoaXMtPm1fZGF0YTsgfSAvLyBubyBjb25zdC1jYXN0IGhlcmUgc28gbm9uLWNvbnN0LWNvcnJlY3QgY29kZSB3aWxsIGdpdmUgYSBjb21waWxlIGVycm9yCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpXTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9JTkRFWF9CQVNFRF9BQ0NFU1MoRGVyaXZlZCkKKyAgICAgIHJldHVybiB0aGlzLT5tX2RhdGFbaW5kZXggKiBpbm5lclN0cmlkZSgpXTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHZhbCkKKyAgICB7CisgICAgICBpbnRlcm5hbDo6cHN0b3JldDxTY2FsYXIsIFBhY2tldFNjYWxhciwgU3RvcmVNb2RlPgorICAgICAgICAgICAgICAgKHRoaXMtPm1fZGF0YSArIChjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpKSwgdmFsKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHZhbCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKQorICAgICAgaW50ZXJuYWw6OnBzdG9yZXQ8U2NhbGFyLCBQYWNrZXRTY2FsYXIsIFN0b3JlTW9kZT4KKyAgICAgICAgICAgICAgICAodGhpcy0+bV9kYXRhICsgaW5kZXggKiBpbm5lclN0cmlkZSgpLCB2YWwpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGFQdHIpIDogQmFzZShkYXRhUHRyKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGFQdHIsIEluZGV4IHZlY1NpemUpIDogQmFzZShkYXRhUHRyLCB2ZWNTaXplKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGFQdHIsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIDogQmFzZShkYXRhUHRyLCByb3dzLCBjb2xzKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgTWFwQmFzZSYgb3RoZXIpCisgICAgeworICAgICAgUmVhZE9ubHlNYXBCYXNlOjpCYXNlOjpvcGVyYXRvcj0ob3RoZXIpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvLyBJbiB0aGVvcnkgd2UgY291bGQgc2ltcGx5IHJlZmVyIHRvIEJhc2U6QmFzZTo6b3BlcmF0b3I9LCBidXQgTVNWQyBkb2VzIG5vdCBsaWtlIEJhc2U6OkJhc2UsCisgICAgLy8gc2VlIGJ1Z3MgODIxIGFuZCA5MjAuCisgICAgdXNpbmcgUmVhZE9ubHlNYXBCYXNlOjpCYXNlOjpvcGVyYXRvcj07Cit9OworCisjdW5kZWYgRUlHRU5fU1RBVElDX0FTU0VSVF9JTkRFWF9CQVNFRF9BQ0NFU1MKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVBCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL01hdGhGdW5jdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL01hdGhGdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQ4YWEwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTWF0aEZ1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMTQzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUSEZVTkNUSU9OU19ICisjZGVmaW5lIEVJR0VOX01BVEhGVU5DVElPTlNfSAorCisvLyBzb3VyY2U6IGh0dHA6Ly93d3cuZ2VvbS51aXVjLmVkdS9+aHViZXJ0eS9tYXRoNTMzNy9ncm91cGUvZGlnaXRzLmh0bWwKKy8vIFRPRE8gdGhpcyBzaG91bGQgYmV0dGVyIGJlIG1vdmVkIHRvIE51bVRyYWl0cworI2RlZmluZSBFSUdFTl9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDU5MjMwNzgxNjQwNkwKKworCituYW1lc3BhY2UgRWlnZW4geworCisvLyBPbiBXSU5DRSwgc3RkOjphYnMgaXMgZGVmaW5lZCBmb3IgaW50IG9ubHksIHNvIGxldCdzIGRlZmluZWQgb3VyIG93biBvdmVybG9hZHM6CisvLyBUaGlzIGlzc3VlIGhhcyBiZWVuIGNvbmZpcm1lZCB3aXRoIE1TVkMgMjAwOCBvbmx5LCBidXQgdGhlIGlzc3VlIG1pZ2h0IGV4aXN0IGZvciBtb3JlIHJlY2VudCB2ZXJzaW9ucyB0b28uCisjaWYgRUlHRU5fT1NfV0lOQ0UgJiYgRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX0NPTVBfTVNWQzw9MTUwMAorbG9uZyAgICAgICAgYWJzKGxvbmcgICAgICAgIHgpIHsgcmV0dXJuIChsYWJzKHgpKTsgIH0KK2RvdWJsZSAgICAgIGFicyhkb3VibGUgICAgICB4KSB7IHJldHVybiAoZmFicyh4KSk7ICB9CitmbG9hdCAgICAgICBhYnMoZmxvYXQgICAgICAgeCkgeyByZXR1cm4gKGZhYnNmKHgpKTsgfQorbG9uZyBkb3VibGUgYWJzKGxvbmcgZG91YmxlIHgpIHsgcmV0dXJuIChmYWJzbCh4KSk7IH0KKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFxjbGFzcyBnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2UKKyAgKgorICAqIFdoYXQgaXQgZG9lczoKKyAgKiBEZWZpbmVzIGEgdHlwZWRlZiAndHlwZScgYXMgZm9sbG93czoKKyAgKiAtIGlmIHR5cGUgVCBoYXMgYSBtZW1iZXIgdHlwZWRlZiBFaWdlbl9CYXNlQ2xhc3NGb3JTcGVjaWFsaXphdGlvbk9mR2xvYmFsTWF0aEZ1bmNJbXBsLCB0aGVuCisgICogICBnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8VD46OnR5cGUgaXMgYSB0eXBlZGVmIGZvciBpdC4KKyAgKiAtIG90aGVyd2lzZSwgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPFQ+Ojp0eXBlIGlzIGEgdHlwZWRlZiBmb3IgVC4KKyAgKgorICAqIEhvdyBpdCdzIHVzZWQ6CisgICogVG8gYWxsb3cgdG8gZGVmaW5lZCB0aGUgZ2xvYmFsIG1hdGggZnVuY3Rpb25zIChsaWtlIHNpbi4uLikgaW4gY2VydGFpbiBjYXNlcywgbGlrZSB0aGUgQXJyYXkgZXhwcmVzc2lvbnMuCisgICogV2hlbiB5b3UgZG8gc2luKGFycmF5MSthcnJheTIpLCB0aGUgb2JqZWN0IGFycmF5MSthcnJheTIgaGFzIGEgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbiB0eXBlLCBhbGwgd2hhdCB5b3Ugd2FudCB0byBrbm93CisgICogaXMgdGhhdCBpdCBpbmhlcml0cyBBcnJheUJhc2UuIFNvIHdlIGltcGxlbWVudCBhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2Ygc2luX2ltcGwgZm9yIEFycmF5QmFzZTxEZXJpdmVkPi4KKyAgKiBTbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0byB1c2Ugc2luX2ltcGw8QXJyYXlCYXNlPERlcml2ZWQ+ID4gYW5kIG5vdCBzaW5faW1wbDxEZXJpdmVkPiwgb3RoZXJ3aXNlIG91ciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCisgICogd29uJ3QgYmUgdXNlZC4gSG93IGRvZXMgc2luIGtub3cgdGhhdD8gVGhhdCdzIGV4YWN0bHkgd2hhdCBnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2UgdGVsbHMgaXQuCisgICoKKyAgKiBIb3cgaXQncyBpbXBsZW1lbnRlZDoKKyAgKiBTRklOQUUgaW4gdGhlIHN0eWxlIG9mIGVuYWJsZV9pZi4gSGlnaGx5IHN1c2NlcHRpYmxlIG9mIGJyZWFraW5nIGNvbXBpbGVycy4gV2l0aCBHQ0MsIGl0IHN1cmUgZG9lcyB3b3JrLCBidXQgaWYgeW91IHJlcGxhY2UKKyAgKiB0aGUgdHlwZW5hbWUgZHVtbXkgYnkgYW4gaW50ZWdlciB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGl0IGRvZXNuJ3Qgd29yayBhbnltb3JlIQorICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBkdW1teSA9IHZvaWQ+CitzdHJ1Y3QgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlCit7CisgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGFsd2F5c192b2lkIHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlCisgIDxULAorICAgdHlwZW5hbWUgYWx3YXlzX3ZvaWQ8dHlwZW5hbWUgVDo6RWlnZW5fQmFzZUNsYXNzRm9yU3BlY2lhbGl6YXRpb25PZkdsb2JhbE1hdGhGdW5jSW1wbD46OnR5cGUKKyAgPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFQ6OkVpZ2VuX0Jhc2VDbGFzc0ZvclNwZWNpYWxpemF0aW9uT2ZHbG9iYWxNYXRoRnVuY0ltcGwgdHlwZTsKK307CisKKyNkZWZpbmUgRUlHRU5fTUFUSEZVTkNfSU1QTChmdW5jLCBzY2FsYXIpIEVpZ2VuOjppbnRlcm5hbDo6ZnVuYyMjX2ltcGw8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8c2NhbGFyPjo6dHlwZT4KKyNkZWZpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGZ1bmMsIHNjYWxhcikgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpmdW5jIyNfcmV0dmFsPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPHNjYWxhcj46OnR5cGU+Ojp0eXBlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIHJlYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgcmVhbF9kZWZhdWx0X2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiB4OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcmVhbF9kZWZhdWx0X2ltcGw8U2NhbGFyLHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICB1c2luZyBzdGQ6OnJlYWw7CisgICAgcmV0dXJuIHJlYWwoeCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHJlYWxfaW1wbCA6IHJlYWxfZGVmYXVsdF9pbXBsPFNjYWxhcj4ge307CisKKyNpZmRlZiBfX0NVREFfQVJDSF9fCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHJlYWxfaW1wbDxzdGQ6OmNvbXBsZXg8VD4gPgoreworICB0eXBlZGVmIFQgUmVhbFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBUIHJ1bihjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIHgpCisgIHsKKyAgICByZXR1cm4geC5yZWFsKCk7CisgIH0KK307CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJlYWxfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGltYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgaW1hZ19kZWZhdWx0X2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYpCisgIHsKKyAgICByZXR1cm4gUmVhbFNjYWxhcigwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGltYWdfZGVmYXVsdF9pbXBsPFNjYWxhcix0cnVlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4KQorICB7CisgICAgdXNpbmcgc3RkOjppbWFnOworICAgIHJldHVybiBpbWFnKHgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBpbWFnX2ltcGwgOiBpbWFnX2RlZmF1bHRfaW1wbDxTY2FsYXI+IHt9OworCisjaWZkZWYgX19DVURBX0FSQ0hfXwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbWFnX2ltcGw8c3RkOjpjb21wbGV4PFQ+ID4KK3sKKyAgdHlwZWRlZiBUIFJlYWxTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgVCBydW4oY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiB4KQorICB7CisgICAgcmV0dXJuIHguaW1hZygpOworICB9Cit9OworI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbWFnX3JldHZhbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHR5cGU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiByZWFsX3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCByZWFsX3JlZl9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyJiBydW4oU2NhbGFyJiB4KQorICB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVhbFNjYWxhcio+KCZ4KVswXTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZWFsU2NhbGFyKj4oJngpWzBdOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcmVhbF9yZWZfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgJiB0eXBlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgaW1hZ19yZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgSXNDb21wbGV4Pgorc3RydWN0IGltYWdfcmVmX2RlZmF1bHRfaW1wbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciYgcnVuKFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlYWxTY2FsYXIqPigmeClbMV07CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBjb25zdCBSZWFsU2NhbGFyJiBydW4oY29uc3QgU2NhbGFyJiB4KQorICB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVhbFNjYWxhcio+KCZ4KVsxXTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGltYWdfcmVmX2RlZmF1bHRfaW1wbDxTY2FsYXIsIGZhbHNlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oU2NhbGFyJikKKyAgeworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBjb25zdCBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYpCisgIHsKKyAgICByZXR1cm4gU2NhbGFyKDApOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgaW1hZ19yZWZfaW1wbCA6IGltYWdfcmVmX2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgaW1hZ19yZWZfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgJiB0eXBlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgY29uaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgSXNDb21wbGV4ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD4KK3N0cnVjdCBjb25qX2ltcGwKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiB4OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgY29ual9pbXBsPFNjYWxhcix0cnVlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4KQorICB7CisgICAgdXNpbmcgc3RkOjpjb25qOworICAgIHJldHVybiBjb25qKHgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgY29ual9yZXR2YWwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGFiczIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGJvb2wgSXNDb21wbGV4Pgorc3RydWN0IGFiczJfaW1wbF9kZWZhdWx0Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4geCp4OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgYWJzMl9pbXBsX2RlZmF1bHQ8U2NhbGFyLCB0cnVlPiAvLyBJc0NvbXBsZXgKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiByZWFsKHgpKnJlYWwoeCkgKyBpbWFnKHgpKmltYWcoeCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBhYnMyX2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiBhYnMyX2ltcGxfZGVmYXVsdDxTY2FsYXIsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD46OnJ1bih4KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGFiczJfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIG5vcm0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzQ29tcGxleD4KK3N0cnVjdCBub3JtMV9kZWZhdWx0X2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGFicyk7CisgICAgcmV0dXJuIGFicyhyZWFsKHgpKSArIGFicyhpbWFnKHgpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IG5vcm0xX2RlZmF1bHRfaW1wbDxTY2FsYXIsIGZhbHNlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4KQorICB7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoYWJzKTsKKyAgICByZXR1cm4gYWJzKHgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgbm9ybTFfaW1wbCA6IG5vcm0xX2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgbm9ybTFfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGh5cG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGh5cG90X2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQorICB7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoYWJzKTsKKyAgICBFSUdFTl9VU0lOR19TVERfTUFUSChzcXJ0KTsKKyAgICBSZWFsU2NhbGFyIF94ID0gYWJzKHgpOworICAgIFJlYWxTY2FsYXIgX3kgPSBhYnMoeSk7CisgICAgU2NhbGFyIHAsIHFwOworICAgIGlmKF94Pl95KQorICAgIHsKKyAgICAgIHAgPSBfeDsKKyAgICAgIHFwID0gX3kgLyBwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcCA9IF95OworICAgICAgcXAgPSBfeCAvIHA7CisgICAgfQorICAgIGlmKHA9PVJlYWxTY2FsYXIoMCkpIHJldHVybiBSZWFsU2NhbGFyKDApOworICAgIHJldHVybiBwICogc3FydChSZWFsU2NhbGFyKDEpICsgcXAqcXApOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgaHlwb3RfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGNhc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgT2xkVHlwZSwgdHlwZW5hbWUgTmV3VHlwZT4KK3N0cnVjdCBjYXN0X2ltcGwKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBOZXdUeXBlIHJ1bihjb25zdCBPbGRUeXBlJiB4KQorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE5ld1R5cGU+KHgpOworICB9Cit9OworCisvLyBoZXJlLCBmb3Igb25jZSwgd2UncmUgcGxhaW5seSByZXR1cm5pbmcgTmV3VHlwZTogd2UgZG9uJ3Qgd2FudCBjYXN0IHRvIGRvIHdlaXJkIHRoaW5ncy4KKwordGVtcGxhdGU8dHlwZW5hbWUgT2xkVHlwZSwgdHlwZW5hbWUgTmV3VHlwZT4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgTmV3VHlwZSBjYXN0KGNvbnN0IE9sZFR5cGUmIHgpCit7CisgIHJldHVybiBjYXN0X2ltcGw8T2xkVHlwZSwgTmV3VHlwZT46OnJ1bih4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2Ygcm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgRUlHRU5fSEFTX0NYWDExX01BVEgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICBzdHJ1Y3Qgcm91bmRfaW1wbCB7CisgICAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCksIE5VTUVSSUNfVFlQRV9NVVNUX0JFX1JFQUwpCisgICAgICB1c2luZyBzdGQ6OnJvdW5kOworICAgICAgcmV0dXJuIHJvdW5kKHgpOworICAgIH0KKyAgfTsKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KKyAgc3RydWN0IHJvdW5kX2ltcGwKKyAgeworICAgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpLCBOVU1FUklDX1RZUEVfTVVTVF9CRV9SRUFMKQorICAgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoZmxvb3IpOworICAgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoY2VpbCk7CisgICAgICByZXR1cm4gKHggPiBTY2FsYXIoMCkpID8gZmxvb3IoeCArIFNjYWxhcigwLjUpKSA6IGNlaWwoeCAtIFNjYWxhcigwLjUpKTsKKyAgICB9CisgIH07CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJvdW5kX3JldHZhbAoreworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgYXJnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgRUlHRU5fSEFTX0NYWDExX01BVEgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICBzdHJ1Y3QgYXJnX2ltcGwgeworICAgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgICAgeworICAgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoYXJnKTsKKyAgICAgIHJldHVybiBhcmcoeCk7CisgICAgfQorICB9OworI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+CisgIHN0cnVjdCBhcmdfZGVmYXVsdF9pbXBsCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgICB7CisgICAgICByZXR1cm4gKHggPCBTY2FsYXIoMCkpID8gU2NhbGFyKEVJR0VOX1BJKSA6IFNjYWxhcigwKTsgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KKyAgc3RydWN0IGFyZ19kZWZhdWx0X2ltcGw8U2NhbGFyLHRydWU+CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgICB7CisgICAgICBFSUdFTl9VU0lOR19TVERfTUFUSChhcmcpOworICAgICAgcmV0dXJuIGFyZyh4KTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgYXJnX2ltcGwgOiBhcmdfZGVmYXVsdF9pbXBsPFNjYWxhcj4ge307CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGFyZ19yZXR2YWwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCB0eXBlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgbG9nMXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2Ugc3RkX2ZhbGxiYWNrIHsKKyAgLy8gZmFsbGJhY2sgbG9nMXAgaW1wbGVtZW50YXRpb24gaW4gY2FzZSB0aGVyZSBpcyBubyBsb2cxcChTY2FsYXIpIGZ1bmN0aW9uIGluIG5hbWVzcGFjZSBvZiBTY2FsYXIsCisgIC8vIG9yIHRoYXQgdGhlcmUgaXMgbm8gc3VpdGFibGUgc3RkOjpsb2cxcCBmdW5jdGlvbiBhdmFpbGFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIGxvZzFwKGNvbnN0IFNjYWxhciYgeCkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICBFSUdFTl9VU0lOR19TVERfTUFUSChsb2cpOworICAgIFNjYWxhciB4MXAgPSBSZWFsU2NhbGFyKDEpICsgeDsKKyAgICByZXR1cm4gKCB4MXAgPT0gU2NhbGFyKDEpICkgPyB4IDogeCAqICggbG9nKHgxcCkgLyAoeDFwIC0gUmVhbFNjYWxhcigxKSkgKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgbG9nMXBfaW1wbCB7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFNjYWxhcikKKyAgICAjaWYgRUlHRU5fSEFTX0NYWDExX01BVEgKKyAgICB1c2luZyBzdGQ6OmxvZzFwOworICAgICNlbmRpZgorICAgIHVzaW5nIHN0ZF9mYWxsYmFjazo6bG9nMXA7CisgICAgcmV0dXJuIGxvZzFwKHgpOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBsb2cxcF9yZXR2YWwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIHBvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyWCx0eXBlbmFtZSBTY2FsYXJZLCBib29sIElzSW50ZWdlciA9IE51bVRyYWl0czxTY2FsYXJYPjo6SXNJbnRlZ2VyJiZOdW1UcmFpdHM8U2NhbGFyWT46OklzSW50ZWdlcj4KK3N0cnVjdCBwb3dfaW1wbAoreworICAvL3R5cGVkZWYgU2NhbGFyIHJldHZhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czxTY2FsYXJYLFNjYWxhclksaW50ZXJuYWw6OnNjYWxhcl9wb3dfb3A8U2NhbGFyWCxTY2FsYXJZPiA+OjpSZXR1cm5UeXBlIHJlc3VsdF90eXBlOworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHJlc3VsdF90eXBlIHJ1bihjb25zdCBTY2FsYXJYJiB4LCBjb25zdCBTY2FsYXJZJiB5KQorICB7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgocG93KTsKKyAgICByZXR1cm4gcG93KHgsIHkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJYLHR5cGVuYW1lIFNjYWxhclk+CitzdHJ1Y3QgcG93X2ltcGw8U2NhbGFyWCxTY2FsYXJZLCB0cnVlPgoreworICB0eXBlZGVmIFNjYWxhclggcmVzdWx0X3R5cGU7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyWCBydW4oU2NhbGFyWCB4LCBTY2FsYXJZIHkpCisgIHsKKyAgICBTY2FsYXJYIHJlcygxKTsKKyAgICBlaWdlbl9hc3NlcnQoIU51bVRyYWl0czxTY2FsYXJZPjo6SXNTaWduZWQgfHwgeSA+PSAwKTsKKyAgICBpZih5ICYgMSkgcmVzICo9IHg7CisgICAgeSA+Pj0gMTsKKyAgICB3aGlsZSh5KQorICAgIHsKKyAgICAgIHggKj0geDsKKyAgICAgIGlmKHkmMSkgcmVzICo9IHg7CisgICAgICB5ID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiByYW5kb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwKKyAgICAgICAgIGJvb2wgSXNDb21wbGV4LAorICAgICAgICAgYm9vbCBJc0ludGVnZXI+CitzdHJ1Y3QgcmFuZG9tX2RlZmF1bHRfaW1wbCB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9pbXBsIDogcmFuZG9tX2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcmFuZG9tX3JldHZhbAoreworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJhbmRvbSwgU2NhbGFyKSByYW5kb20oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJhbmRvbSwgU2NhbGFyKSByYW5kb20oKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBmYWxzZSwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkKKyAgeworICAgIHJldHVybiB4ICsgKHkteCkgKiBTY2FsYXIoc3RkOjpyYW5kKCkpIC8gU2NhbGFyKFJBTkRfTUFYKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oKQorICB7CisgICAgcmV0dXJuIHJ1bihTY2FsYXIoTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkID8gLTEgOiAwKSwgU2NhbGFyKDEpKTsKKyAgfQorfTsKKworZW51bSB7CisgIG1ldGFfZmxvb3JfbG9nMl90ZXJtaW5hdGUsCisgIG1ldGFfZmxvb3JfbG9nMl9tb3ZlX3VwLAorICBtZXRhX2Zsb29yX2xvZzJfbW92ZV9kb3duLAorICBtZXRhX2Zsb29yX2xvZzJfYm9ndXMKK307CisKK3RlbXBsYXRlPHVuc2lnbmVkIGludCBuLCBpbnQgbG93ZXIsIGludCB1cHBlcj4gc3RydWN0IG1ldGFfZmxvb3JfbG9nMl9zZWxlY3RvcgoreworICBlbnVtIHsgbWlkZGxlID0gKGxvd2VyICsgdXBwZXIpIC8gMiwKKyAgICAgICAgIHZhbHVlID0gKHVwcGVyIDw9IGxvd2VyICsgMSkgPyBpbnQobWV0YV9mbG9vcl9sb2cyX3Rlcm1pbmF0ZSkKKyAgICAgICAgICAgICAgIDogKG4gPCAoMSA8PCBtaWRkbGUpKSA/IGludChtZXRhX2Zsb29yX2xvZzJfbW92ZV9kb3duKQorICAgICAgICAgICAgICAgOiAobj09MCkgPyBpbnQobWV0YV9mbG9vcl9sb2cyX2JvZ3VzKQorICAgICAgICAgICAgICAgOiBpbnQobWV0YV9mbG9vcl9sb2cyX21vdmVfdXApCisgIH07Cit9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgbiwKKyAgICAgICAgIGludCBsb3dlciA9IDAsCisgICAgICAgICBpbnQgdXBwZXIgPSBzaXplb2YodW5zaWduZWQgaW50KSAqIENIQVJfQklUIC0gMSwKKyAgICAgICAgIGludCBzZWxlY3RvciA9IG1ldGFfZmxvb3JfbG9nMl9zZWxlY3RvcjxuLCBsb3dlciwgdXBwZXI+Ojp2YWx1ZT4KK3N0cnVjdCBtZXRhX2Zsb29yX2xvZzIge307CisKK3RlbXBsYXRlPHVuc2lnbmVkIGludCBuLCBpbnQgbG93ZXIsIGludCB1cHBlcj4KK3N0cnVjdCBtZXRhX2Zsb29yX2xvZzI8biwgbG93ZXIsIHVwcGVyLCBtZXRhX2Zsb29yX2xvZzJfbW92ZV9kb3duPgoreworICBlbnVtIHsgdmFsdWUgPSBtZXRhX2Zsb29yX2xvZzI8biwgbG93ZXIsIG1ldGFfZmxvb3JfbG9nMl9zZWxlY3RvcjxuLCBsb3dlciwgdXBwZXI+OjptaWRkbGU+Ojp2YWx1ZSB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgaW50IG4sIGludCBsb3dlciwgaW50IHVwcGVyPgorc3RydWN0IG1ldGFfZmxvb3JfbG9nMjxuLCBsb3dlciwgdXBwZXIsIG1ldGFfZmxvb3JfbG9nMl9tb3ZlX3VwPgoreworICBlbnVtIHsgdmFsdWUgPSBtZXRhX2Zsb29yX2xvZzI8biwgbWV0YV9mbG9vcl9sb2cyX3NlbGVjdG9yPG4sIGxvd2VyLCB1cHBlcj46Om1pZGRsZSwgdXBwZXI+Ojp2YWx1ZSB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgaW50IG4sIGludCBsb3dlciwgaW50IHVwcGVyPgorc3RydWN0IG1ldGFfZmxvb3JfbG9nMjxuLCBsb3dlciwgdXBwZXIsIG1ldGFfZmxvb3JfbG9nMl90ZXJtaW5hdGU+Cit7CisgIGVudW0geyB2YWx1ZSA9IChuID49ICgodW5zaWduZWQgaW50KSgxKSA8PCAobG93ZXIrMSkpKSA/IGxvd2VyKzEgOiBsb3dlciB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgaW50IG4sIGludCBsb3dlciwgaW50IHVwcGVyPgorc3RydWN0IG1ldGFfZmxvb3JfbG9nMjxuLCBsb3dlciwgdXBwZXIsIG1ldGFfZmxvb3JfbG9nMl9ib2d1cz4KK3sKKyAgLy8gbm8gdmFsdWUsIGVycm9yIGF0IGNvbXBpbGUgdGltZQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBmYWxzZSwgdHJ1ZT4KK3sKKyAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQorICB7IAorICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkLHN0ZDo6cHRyZGlmZl90LHN0ZDo6c2l6ZV90Pjo6dHlwZSBTY2FsYXJYOworICAgIGlmKHk8eCkKKyAgICAgIHJldHVybiB4OworICAgIC8vIHRoZSBmb2xsb3dpbmcgZGlmZmVyZW5jZSBtaWdodCBvdmVyZmxvdyBvbiBhIDMyIGJpdHMgc3lzdGVtLAorICAgIC8vIGJ1dCBzaW5jZSB5Pj14IHRoZSByZXN1bHQgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGxvbmcgaXMgc3RpbGwgY29ycmVjdC4KKyAgICBzdGQ6OnNpemVfdCByYW5nZSA9IFNjYWxhclgoeSktU2NhbGFyWCh4KTsKKyAgICBzdGQ6OnNpemVfdCBvZmZzZXQgPSAwOworICAgIC8vIHJlamVjdGlvbiBzYW1wbGluZworICAgIHN0ZDo6c2l6ZV90IGRpdmlzb3IgPSAxOworICAgIHN0ZDo6c2l6ZV90IG11bHRpcGxpZXIgPSAxOworICAgIGlmKHJhbmdlPFJBTkRfTUFYKSBkaXZpc29yID0gKHN0ZDo6c2l6ZV90KFJBTkRfTUFYKSsxKS8ocmFuZ2UrMSk7CisgICAgZWxzZSAgICAgICAgICAgICAgIG11bHRpcGxpZXIgPSAxICsgcmFuZ2UvKHN0ZDo6c2l6ZV90KFJBTkRfTUFYKSsxKTsKKyAgICBkbyB7CisgICAgICBvZmZzZXQgPSAoc3RkOjpzaXplX3Qoc3RkOjpyYW5kKCkpICogbXVsdGlwbGllcikgLyBkaXZpc29yOworICAgIH0gd2hpbGUgKG9mZnNldCA+IHJhbmdlKTsKKyAgICByZXR1cm4gU2NhbGFyKFNjYWxhclgoeCkgKyBvZmZzZXQpOworICB9CisKKyAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKCkKKyAgeworI2lmZGVmIEVJR0VOX01BS0lOR19ET0NTCisgICAgcmV0dXJuIHJ1bihTY2FsYXIoTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkID8gLTEwIDogMCksIFNjYWxhcigxMCkpOworI2Vsc2UKKyAgICBlbnVtIHsgcmFuZF9iaXRzID0gbWV0YV9mbG9vcl9sb2cyPCh1bnNpZ25lZCBpbnQpKFJBTkRfTUFYKSsxPjo6dmFsdWUsCisgICAgICAgICAgIHNjYWxhcl9iaXRzID0gc2l6ZW9mKFNjYWxhcikgKiBDSEFSX0JJVCwKKyAgICAgICAgICAgc2hpZnQgPSBFSUdFTl9QTEFJTl9FTlVNX01BWCgwLCBpbnQocmFuZF9iaXRzKSAtIGludChzY2FsYXJfYml0cykpLAorICAgICAgICAgICBvZmZzZXQgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNTaWduZWQgPyAoMSA8PCAoRUlHRU5fUExBSU5fRU5VTV9NSU4ocmFuZF9iaXRzLHNjYWxhcl9iaXRzKS0xKSkgOiAwCisgICAgfTsKKyAgICByZXR1cm4gU2NhbGFyKChzdGQ6OnJhbmQoKSA+PiBzaGlmdCkgLSBvZmZzZXQpOworI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCByYW5kb21fZGVmYXVsdF9pbXBsPFNjYWxhciwgdHJ1ZSwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkKKyAgeworICAgIHJldHVybiBTY2FsYXIocmFuZG9tKHJlYWwoeCksIHJlYWwoeSkpLAorICAgICAgICAgICAgICAgICAgcmFuZG9tKGltYWcoeCksIGltYWcoeSkpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHJldHVybiBTY2FsYXIocmFuZG9tPFJlYWxTY2FsYXI+KCksIHJhbmRvbTxSZWFsU2NhbGFyPigpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChyYW5kb20sIFNjYWxhcikgcmFuZG9tKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChyYW5kb20sIFNjYWxhcik6OnJ1bih4LCB5KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChyYW5kb20sIFNjYWxhcikgcmFuZG9tKCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwocmFuZG9tLCBTY2FsYXIpOjpydW4oKTsKK30KKworLy8gSW1wbGVtZW50YXRpbiBvZiBpcyogZnVuY3Rpb25zCisKKy8vIHN0ZDo6aXMqIGRvIG5vdCB3b3JrIHdpdGggZmFzdC1tYXRoIGFuZCBnY2MsIHN0ZDo6aXMqIGFyZSBhdmFpbGFibGUgb24gTVNWQyAyMDEzIGFuZCBuZXdlciwgYXMgd2VsbCBhcyBpbiBjbGFuZy4KKyNpZiAoRUlHRU5fSEFTX0NYWDExX01BVEggJiYgIShFSUdFTl9DT01QX0dOVUNfU1RSSUNUICYmIF9fRklOSVRFX01BVEhfT05MWV9fKSkgfHwgKEVJR0VOX0NPTVBfTVNWQz49MTgwMCkgfHwgKEVJR0VOX0NPTVBfQ0xBTkcpCisjZGVmaW5lIEVJR0VOX1VTRV9TVERfRlBDTEFTU0lGWSAxCisjZWxzZQorI2RlZmluZSBFSUdFTl9VU0VfU1REX0ZQQ0xBU1NJRlkgMAorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQwordHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxpbnRlcm5hbDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLGJvb2w+Ojp0eXBlCitpc25hbl9pbXBsKGNvbnN0IFQmKSB7IHJldHVybiBmYWxzZTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMKK3R5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8aW50ZXJuYWw6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSxib29sPjo6dHlwZQoraXNpbmZfaW1wbChjb25zdCBUJikgeyByZXR1cm4gZmFsc2U7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DCit0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPGludGVybmFsOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsYm9vbD46OnR5cGUKK2lzZmluaXRlX2ltcGwoY29uc3QgVCYpIHsgcmV0dXJuIHRydWU7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DCit0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCghaW50ZXJuYWw6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkmJighTnVtVHJhaXRzPFQ+OjpJc0NvbXBsZXgpLGJvb2w+Ojp0eXBlCitpc2Zpbml0ZV9pbXBsKGNvbnN0IFQmIHgpCit7CisgICNpZmRlZiBfX0NVREFfQVJDSF9fCisgICAgcmV0dXJuICg6OmlzZmluaXRlKSh4KTsKKyAgI2VsaWYgRUlHRU5fVVNFX1NURF9GUENMQVNTSUZZCisgICAgdXNpbmcgc3RkOjppc2Zpbml0ZTsKKyAgICByZXR1cm4gaXNmaW5pdGUgRUlHRU5fTk9UX0FfTUFDUk8gKHgpOworICAjZWxzZQorICAgIHJldHVybiB4PD1OdW1UcmFpdHM8VD46OmhpZ2hlc3QoKSAmJiB4Pj1OdW1UcmFpdHM8VD46Omxvd2VzdCgpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DCit0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCghaW50ZXJuYWw6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkmJighTnVtVHJhaXRzPFQ+OjpJc0NvbXBsZXgpLGJvb2w+Ojp0eXBlCitpc2luZl9pbXBsKGNvbnN0IFQmIHgpCit7CisgICNpZmRlZiBfX0NVREFfQVJDSF9fCisgICAgcmV0dXJuICg6OmlzaW5mKSh4KTsKKyAgI2VsaWYgRUlHRU5fVVNFX1NURF9GUENMQVNTSUZZCisgICAgdXNpbmcgc3RkOjppc2luZjsKKyAgICByZXR1cm4gaXNpbmYgRUlHRU5fTk9UX0FfTUFDUk8gKHgpOworICAjZWxzZQorICAgIHJldHVybiB4Pk51bVRyYWl0czxUPjo6aGlnaGVzdCgpIHx8IHg8TnVtVHJhaXRzPFQ+Ojpsb3dlc3QoKTsKKyAgI2VuZGlmCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQwordHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwoIWludGVybmFsOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpJiYoIU51bVRyYWl0czxUPjo6SXNDb21wbGV4KSxib29sPjo6dHlwZQoraXNuYW5faW1wbChjb25zdCBUJiB4KQoreworICAjaWZkZWYgX19DVURBX0FSQ0hfXworICAgIHJldHVybiAoOjppc25hbikoeCk7CisgICNlbGlmIEVJR0VOX1VTRV9TVERfRlBDTEFTU0lGWQorICAgIHVzaW5nIHN0ZDo6aXNuYW47CisgICAgcmV0dXJuIGlzbmFuIEVJR0VOX05PVF9BX01BQ1JPICh4KTsKKyAgI2Vsc2UKKyAgICByZXR1cm4geCAhPSB4OworICAjZW5kaWYKK30KKworI2lmICghRUlHRU5fVVNFX1NURF9GUENMQVNTSUZZKQorCisjaWYgRUlHRU5fQ09NUF9NU1ZDCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNpbmZfbXN2Y19oZWxwZXIoVCB4KQoreworICByZXR1cm4gX2ZwY2xhc3MoeCk9PV9GUENMQVNTX05JTkYgfHwgX2ZwY2xhc3MoeCk9PV9GUENMQVNTX1BJTkY7Cit9CisKKy8vTVNWQyBkZWZpbmVzIGEgX2lzbmFuIGJ1aWx0aW4gZnVuY3Rpb24sIGJ1dCBmb3IgZG91YmxlIG9ubHkKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBib29sIGlzbmFuX2ltcGwoY29uc3QgbG9uZyBkb3VibGUmIHgpIHsgcmV0dXJuIF9pc25hbih4KSE9MDsgfQorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgaXNuYW5faW1wbChjb25zdCBkb3VibGUmIHgpICAgICAgeyByZXR1cm4gX2lzbmFuKHgpIT0wOyB9CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBpc25hbl9pbXBsKGNvbnN0IGZsb2F0JiB4KSAgICAgICB7IHJldHVybiBfaXNuYW4oeCkhPTA7IH0KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgaXNpbmZfaW1wbChjb25zdCBsb25nIGRvdWJsZSYgeCkgeyByZXR1cm4gaXNpbmZfbXN2Y19oZWxwZXIoeCk7IH0KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBib29sIGlzaW5mX2ltcGwoY29uc3QgZG91YmxlJiB4KSAgICAgIHsgcmV0dXJuIGlzaW5mX21zdmNfaGVscGVyKHgpOyB9CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBpc2luZl9pbXBsKGNvbnN0IGZsb2F0JiB4KSAgICAgICB7IHJldHVybiBpc2luZl9tc3ZjX2hlbHBlcih4KTsgfQorCisjZWxpZiAoZGVmaW5lZCBfX0ZJTklURV9NQVRIX09OTFlfXyAmJiBfX0ZJTklURV9NQVRIX09OTFlfXyAmJiBFSUdFTl9DT01QX0dOVUMpCisKKyNpZiBFSUdFTl9HTlVDX0FUX0xFQVNUKDUsMCkKKyAgI2RlZmluZSBFSUdFTl9UTVBfTk9PUFRfQVRUUklCIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBfX2F0dHJpYnV0ZV9fKChvcHRpbWl6ZSgibm8tZmluaXRlLW1hdGgtb25seSIpKSkKKyNlbHNlCisgIC8vIE5PVEUgdGhlIGlubGluZSBxdWFsaWZpZXIgYW5kIG5vaW5saW5lIGF0dHJpYnV0ZSBhcmUgYm90aCBuZWVkZWQ6IHRoZSBmb3JtZXIgaXMgdG8gYXZvaWQgbGlua2luZyBpc3N1ZSAoZHVwbGljYXRlIHN5bWJvbCksCisgIC8vICAgICAgd2hpbGUgdGhlIHNlY29uZCBwcmV2ZW50IHRvbyBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbnMgaW4gZmFzdC1tYXRoIG1vZGU6CisgICNkZWZpbmUgRUlHRU5fVE1QX05PT1BUX0FUVFJJQiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUsb3B0aW1pemUoIm5vLWZpbml0ZS1tYXRoLW9ubHkiKSkpCisjZW5kaWYKKwordGVtcGxhdGU8PiBFSUdFTl9UTVBfTk9PUFRfQVRUUklCIGJvb2wgaXNuYW5faW1wbChjb25zdCBsb25nIGRvdWJsZSYgeCkgeyByZXR1cm4gX19idWlsdGluX2lzbmFuKHgpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1RNUF9OT09QVF9BVFRSSUIgYm9vbCBpc25hbl9pbXBsKGNvbnN0IGRvdWJsZSYgeCkgICAgICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oeCk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fVE1QX05PT1BUX0FUVFJJQiBib29sIGlzbmFuX2ltcGwoY29uc3QgZmxvYXQmIHgpICAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbih4KTsgfQordGVtcGxhdGU8PiBFSUdFTl9UTVBfTk9PUFRfQVRUUklCIGJvb2wgaXNpbmZfaW1wbChjb25zdCBkb3VibGUmIHgpICAgICAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKHgpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1RNUF9OT09QVF9BVFRSSUIgYm9vbCBpc2luZl9pbXBsKGNvbnN0IGZsb2F0JiB4KSAgICAgICB7IHJldHVybiBfX2J1aWx0aW5faXNpbmYoeCk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fVE1QX05PT1BUX0FUVFJJQiBib29sIGlzaW5mX2ltcGwoY29uc3QgbG9uZyBkb3VibGUmIHgpIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2luZih4KTsgfQorCisjdW5kZWYgRUlHRU5fVE1QX05PT1BUX0FUVFJJQgorCisjZW5kaWYKKworI2VuZGlmCisKKy8vIFRoZSBmb2xsb3dpbmcgb3ZlcmxvYWQgYXJlIGRlZmluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNmaW5pdGVfaW1wbChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIHgpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc25hbl9pbXBsKGNvbnN0IHN0ZDo6Y29tcGxleDxUPiYgeCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGlzaW5mX2ltcGwoY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiB4KTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBnZW5lcmljX2Zhc3RfdGFuaF9mbG9hdChjb25zdCBUJiBhX3gpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogR2VuZXJpYyBtYXRoIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgbnVtZXh0IHsKKworI2lmbmRlZiBfX0NVREFfQVJDSF9fCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX0FMV0FZU19JTkxJTkUgVCBtaW5pKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpCit7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKG1pbik7CisgIHJldHVybiBtaW4gRUlHRU5fTk9UX0FfTUFDUk8gKHgseSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fQUxXQVlTX0lOTElORSBUIG1heGkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkKK3sKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgobWF4KTsKKyAgcmV0dXJuIG1heCBFSUdFTl9OT1RfQV9NQUNSTyAoeCx5KTsKK30KKyNlbHNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX0FMV0FZU19JTkxJTkUgVCBtaW5pKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpCit7CisgIHJldHVybiB5IDwgeCA/IHkgOiB4OworfQordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX0FMV0FZU19JTkxJTkUgZmxvYXQgbWluaShjb25zdCBmbG9hdCYgeCwgY29uc3QgZmxvYXQmIHkpCit7CisgIHJldHVybiBmbWluZih4LCB5KTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fQUxXQVlTX0lOTElORSBUIG1heGkoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkKK3sKKyAgcmV0dXJuIHggPCB5ID8geSA6IHg7Cit9Cit0ZW1wbGF0ZTw+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fQUxXQVlTX0lOTElORSBmbG9hdCBtYXhpKGNvbnN0IGZsb2F0JiB4LCBjb25zdCBmbG9hdCYgeSkKK3sKKyAgcmV0dXJuIGZtYXhmKHgsIHkpOworfQorI2VuZGlmCisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwocmVhbCwgU2NhbGFyKSByZWFsKGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwocmVhbCwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTwgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJlYWxfcmVmLCBTY2FsYXIpID46OnR5cGUgcmVhbF9yZWYoY29uc3QgU2NhbGFyJiB4KQoreworICByZXR1cm4gaW50ZXJuYWw6OnJlYWxfcmVmX2ltcGw8U2NhbGFyPjo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChyZWFsX3JlZiwgU2NhbGFyKSByZWFsX3JlZihTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKHJlYWxfcmVmLCBTY2FsYXIpOjpydW4oeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGltYWcsIFNjYWxhcikgaW1hZyhjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGltYWcsIFNjYWxhcik6OnJ1bih4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoYXJnLCBTY2FsYXIpIGFyZyhjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGFyZywgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTwgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGltYWdfcmVmLCBTY2FsYXIpID46OnR5cGUgaW1hZ19yZWYoY29uc3QgU2NhbGFyJiB4KQoreworICByZXR1cm4gaW50ZXJuYWw6OmltYWdfcmVmX2ltcGw8U2NhbGFyPjo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChpbWFnX3JlZiwgU2NhbGFyKSBpbWFnX3JlZihTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGltYWdfcmVmLCBTY2FsYXIpOjpydW4oeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGNvbmosIFNjYWxhcikgY29uaihjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGNvbmosIFNjYWxhcik6OnJ1bih4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoYWJzMiwgU2NhbGFyKSBhYnMyKGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoYWJzMiwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChub3JtMSwgU2NhbGFyKSBub3JtMShjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKG5vcm0xLCBTY2FsYXIpOjpydW4oeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGh5cG90LCBTY2FsYXIpIGh5cG90KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChoeXBvdCwgU2NhbGFyKTo6cnVuKHgsIHkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChsb2cxcCwgU2NhbGFyKSBsb2cxcChjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGxvZzFwLCBTY2FsYXIpOjpydW4oeCk7Cit9CisKKyNpZmRlZiBfX0NVREFDQ19fCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Zsb2F0IGxvZzFwKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OmxvZzFwZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBsb2cxcChjb25zdCBkb3VibGUgJngpIHsgcmV0dXJuIDo6bG9nMXAoeCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJYLHR5cGVuYW1lIFNjYWxhclk+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpwb3dfaW1wbDxTY2FsYXJYLFNjYWxhclk+OjpyZXN1bHRfdHlwZSBwb3coY29uc3QgU2NhbGFyWCYgeCwgY29uc3QgU2NhbGFyWSYgeSkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpwb3dfaW1wbDxTY2FsYXJYLFNjYWxhclk+OjpydW4oeCwgeSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgKGlzbmFuKSAgIChjb25zdCBUICZ4KSB7IHJldHVybiBpbnRlcm5hbDo6aXNuYW5faW1wbCh4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCAoaXNpbmYpICAgKGNvbnN0IFQgJngpIHsgcmV0dXJuIGludGVybmFsOjppc2luZl9pbXBsKHgpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIChpc2Zpbml0ZSkoY29uc3QgVCAmeCkgeyByZXR1cm4gaW50ZXJuYWw6OmlzZmluaXRlX2ltcGwoeCk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwocm91bmQsIFNjYWxhcikgcm91bmQoY29uc3QgU2NhbGFyJiB4KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChyb3VuZCwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMKK1QgKGZsb29yKShjb25zdCBUJiB4KQoreworICBFSUdFTl9VU0lOR19TVERfTUFUSChmbG9vcik7CisgIHJldHVybiBmbG9vcih4KTsKK30KKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgZmxvb3IoY29uc3QgZmxvYXQgJngpIHsgcmV0dXJuIDo6Zmxvb3JmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGZsb29yKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjpmbG9vcih4KTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQworVCAoY2VpbCkoY29uc3QgVCYgeCkKK3sKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoY2VpbCk7CisgIHJldHVybiBjZWlsKHgpOworfQorCisjaWZkZWYgX19DVURBQ0NfXwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBjZWlsKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OmNlaWxmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGNlaWwoY29uc3QgZG91YmxlICZ4KSB7IHJldHVybiA6OmNlaWwoeCk7IH0KKyNlbmRpZgorCisKKy8qKiBMb2cgYmFzZSAyIGZvciAzMiBiaXRzIHBvc2l0aXZlIGludGVnZXJzLgorICAqIENvbnZlbmllbnRseSByZXR1cm5zIDAgZm9yIHg9PTAuICovCitpbmxpbmUgaW50IGxvZzIoaW50IHgpCit7CisgIGVpZ2VuX2Fzc2VydCh4Pj0wKTsKKyAgdW5zaWduZWQgaW50IHYoeCk7CisgIHN0YXRpYyBjb25zdCBpbnQgdGFibGVbMzJdID0geyAwLCA5LCAxLCAxMCwgMTMsIDIxLCAyLCAyOSwgMTEsIDE0LCAxNiwgMTgsIDIyLCAyNSwgMywgMzAsIDgsIDEyLCAyMCwgMjgsIDE1LCAxNywgMjQsIDcsIDE5LCAyNywgMjMsIDYsIDI2LCA1LCA0LCAzMSB9OworICB2IHw9IHYgPj4gMTsKKyAgdiB8PSB2ID4+IDI7CisgIHYgfD0gdiA+PiA0OworICB2IHw9IHYgPj4gODsKKyAgdiB8PSB2ID4+IDE2OworICByZXR1cm4gdGFibGVbKHYgKiAweDA3QzRBQ0REVSkgPj4gMjddOworfQorCisvKiogXHJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIFxhIHguCisgICoKKyAgKiBJdCBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIFxjb2RlIHVzaW5nIHN0ZDo6c3FydDsgcmV0dXJuIHNxcnQoeCk7IFxlbmRjb2RlLAorICAqIGJ1dCBzbGlnaHRseSBmYXN0ZXIgZm9yIGZsb2F0L2RvdWJsZSBhbmQgc29tZSBjb21waWxlcnMgKGUuZy4sIGdjYyksIHRoYW5rcyB0bworICAqIHNwZWNpYWxpemF0aW9ucyB3aGVuIFNTRSBpcyBlbmFibGVkLgorICAqCisgICogSXQncyB1c2FnZSBpcyBqdXN0aWZpZWQgaW4gcGVyZm9ybWFuY2UgY3JpdGljYWwgZnVuY3Rpb25zLCBsaWtlIG5vcm0vbm9ybWFsaXplLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1Qgc3FydChjb25zdCBUICZ4KQoreworICBFSUdFTl9VU0lOR19TVERfTUFUSChzcXJ0KTsKKyAgcmV0dXJuIHNxcnQoeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitUIGxvZyhjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGxvZyk7CisgIHJldHVybiBsb2coeCk7Cit9CisKKyNpZmRlZiBfX0NVREFDQ19fCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Zsb2F0IGxvZyhjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjpsb2dmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGxvZyhjb25zdCBkb3VibGUgJngpIHsgcmV0dXJuIDo6bG9nKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK3R5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8TnVtVHJhaXRzPFQ+OjpJc1NpZ25lZCB8fCBOdW1UcmFpdHM8VD46OklzQ29tcGxleCx0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWw+Ojp0eXBlCithYnMoY29uc3QgVCAmeCkgeworICBFSUdFTl9VU0lOR19TVERfTUFUSChhYnMpOworICByZXR1cm4gYWJzKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQordHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwhKE51bVRyYWl0czxUPjo6SXNTaWduZWQgfHwgTnVtVHJhaXRzPFQ+OjpJc0NvbXBsZXgpLHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbD46OnR5cGUKK2Ficyhjb25zdCBUICZ4KSB7CisgIHJldHVybiB4OworfQorCisjaWYgZGVmaW5lZChfX1NZQ0xfREVWSUNFX09OTFlfXykKK0VJR0VOX0FMV0FZU19JTkxJTkUgZmxvYXQgICBhYnMoZmxvYXQgeCkgeyByZXR1cm4gY2w6OnN5Y2w6OmZhYnMoeCk7IH0KK0VJR0VOX0FMV0FZU19JTkxJTkUgZG91YmxlICBhYnMoZG91YmxlIHgpIHsgcmV0dXJuIGNsOjpzeWNsOjpmYWJzKHgpOyB9CisjZW5kaWYgLy8gZGVmaW5lZChfX1NZQ0xfREVWSUNFX09OTFlfXykKKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgYWJzKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OmZhYnNmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGFicyhjb25zdCBkb3VibGUgJngpIHsgcmV0dXJuIDo6ZmFicyh4KTsgfQorCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBhYnMoY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgeCkgeworICByZXR1cm4gOjpoeXBvdGYoeC5yZWFsKCksIHguaW1hZygpKTsKK30KKwordGVtcGxhdGUgPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGFicyhjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgeCkgeworICByZXR1cm4gOjpoeXBvdCh4LnJlYWwoKSwgeC5pbWFnKCkpOworfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitUIGV4cChjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGV4cCk7CisgIHJldHVybiBleHAoeCk7Cit9CisKKyNpZmRlZiBfX0NVREFDQ19fCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Zsb2F0IGV4cChjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjpleHBmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGV4cChjb25zdCBkb3VibGUgJngpIHsgcmV0dXJuIDo6ZXhwKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1QgY29zKGNvbnN0IFQgJngpIHsKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoY29zKTsKKyAgcmV0dXJuIGNvcyh4KTsKK30KKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgY29zKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OmNvc2YoeCk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitkb3VibGUgY29zKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjpjb3MoeCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVCBzaW4oY29uc3QgVCAmeCkgeworICBFSUdFTl9VU0lOR19TVERfTUFUSChzaW4pOworICByZXR1cm4gc2luKHgpOworfQorCisjaWZkZWYgX19DVURBQ0NfXwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBzaW4oY29uc3QgZmxvYXQgJngpIHsgcmV0dXJuIDo6c2luZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBzaW4oY29uc3QgZG91YmxlICZ4KSB7IHJldHVybiA6OnNpbih4KTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitUIHRhbihjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKHRhbik7CisgIHJldHVybiB0YW4oeCk7Cit9CisKKyNpZmRlZiBfX0NVREFDQ19fCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Zsb2F0IHRhbihjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjp0YW5mKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIHRhbihjb25zdCBkb3VibGUgJngpIHsgcmV0dXJuIDo6dGFuKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1QgYWNvcyhjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGFjb3MpOworICByZXR1cm4gYWNvcyh4KTsKK30KKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgYWNvcyhjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjphY29zZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBhY29zKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjphY29zKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1QgYXNpbihjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGFzaW4pOworICByZXR1cm4gYXNpbih4KTsKK30KKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgYXNpbihjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjphc2luZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBhc2luKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjphc2luKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1QgYXRhbihjb25zdCBUICZ4KSB7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGF0YW4pOworICByZXR1cm4gYXRhbih4KTsKK30KKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgYXRhbihjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjphdGFuZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBhdGFuKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjphdGFuKHgpOyB9CisjZW5kaWYKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVCBjb3NoKGNvbnN0IFQgJngpIHsKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoY29zaCk7CisgIHJldHVybiBjb3NoKHgpOworfQorCisjaWZkZWYgX19DVURBQ0NfXwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBjb3NoKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OmNvc2hmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGNvc2goY29uc3QgZG91YmxlICZ4KSB7IHJldHVybiA6OmNvc2goeCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVCBzaW5oKGNvbnN0IFQgJngpIHsKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoc2luaCk7CisgIHJldHVybiBzaW5oKHgpOworfQorCisjaWZkZWYgX19DVURBQ0NfXwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBzaW5oKGNvbnN0IGZsb2F0ICZ4KSB7IHJldHVybiA6OnNpbmhmKHgpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIHNpbmgoY29uc3QgZG91YmxlICZ4KSB7IHJldHVybiA6OnNpbmgoeCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVCB0YW5oKGNvbnN0IFQgJngpIHsKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgodGFuaCk7CisgIHJldHVybiB0YW5oKHgpOworfQorCisjaWYgKCFkZWZpbmVkKF9fQ1VEQUNDX18pKSAmJiBFSUdFTl9GQVNUX01BVEgKK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Zsb2F0IHRhbmgoZmxvYXQgeCkgeyByZXR1cm4gaW50ZXJuYWw6OmdlbmVyaWNfZmFzdF90YW5oX2Zsb2F0KHgpOyB9CisjZW5kaWYKKworI2lmZGVmIF9fQ1VEQUNDX18KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgdGFuaChjb25zdCBmbG9hdCAmeCkgeyByZXR1cm4gOjp0YW5oZih4KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSB0YW5oKGNvbnN0IGRvdWJsZSAmeCkgeyByZXR1cm4gOjp0YW5oKHgpOyB9CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitUIGZtb2QoY29uc3QgVCYgYSwgY29uc3QgVCYgYikgeworICBFSUdFTl9VU0lOR19TVERfTUFUSChmbW9kKTsKKyAgcmV0dXJuIGZtb2QoYSwgYik7Cit9CisKKyNpZmRlZiBfX0NVREFDQ19fCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgZm1vZChjb25zdCBmbG9hdCYgYSwgY29uc3QgZmxvYXQmIGIpIHsKKyAgcmV0dXJuIDo6Zm1vZGYoYSwgYik7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitkb3VibGUgZm1vZChjb25zdCBkb3VibGUmIGEsIGNvbnN0IGRvdWJsZSYgYikgeworICByZXR1cm4gOjpmbW9kKGEsIGIpOworfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBudW1leHQKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNmaW5pdGVfaW1wbChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIHgpCit7CisgIHJldHVybiAobnVtZXh0Ojppc2Zpbml0ZSkobnVtZXh0OjpyZWFsKHgpKSAmJiAobnVtZXh0Ojppc2Zpbml0ZSkobnVtZXh0OjppbWFnKHgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNuYW5faW1wbChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIHgpCit7CisgIHJldHVybiAobnVtZXh0Ojppc25hbikobnVtZXh0OjpyZWFsKHgpKSB8fCAobnVtZXh0Ojppc25hbikobnVtZXh0OjppbWFnKHgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNpbmZfaW1wbChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIHgpCit7CisgIHJldHVybiAoKG51bWV4dDo6aXNpbmYpKG51bWV4dDo6cmVhbCh4KSkgfHwgKG51bWV4dDo6aXNpbmYpKG51bWV4dDo6aW1hZyh4KSkpICYmICghKG51bWV4dDo6aXNuYW4pKHgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgZnV6enkgY29tcGFyaXNvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsCisgICAgICAgICBib29sIElzQ29tcGxleCwKKyAgICAgICAgIGJvb2wgSXNJbnRlZ2VyPgorc3RydWN0IHNjYWxhcl9mdXp6eV9kZWZhdWx0X2ltcGwge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZnV6enlfZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2UsIGZhbHNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyPiBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBPdGhlclNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykKKyAgeworICAgIHJldHVybiBudW1leHQ6OmFicyh4KSA8PSBudW1leHQ6OmFicyh5KSAqIHByZWM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjKQorICB7CisgICAgcmV0dXJuIG51bWV4dDo6YWJzKHggLSB5KSA8PSBudW1leHQ6Om1pbmkobnVtZXh0OjphYnMoeCksIG51bWV4dDo6YWJzKHkpKSAqIHByZWM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94T3JMZXNzVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykKKyAgeworICAgIHJldHVybiB4IDw9IHkgfHwgaXNBcHByb3goeCwgeSwgcHJlYyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZnV6enlfZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2UsIHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXI+IEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc011Y2hTbWFsbGVyVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYsIGNvbnN0IFJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHggPT0gU2NhbGFyKDApOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYpCisgIHsKKyAgICByZXR1cm4geCA9PSB5OworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHggPD0geTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9mdXp6eV9kZWZhdWx0X2ltcGw8U2NhbGFyLCB0cnVlLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgT3RoZXJTY2FsYXImIHksIGNvbnN0IFJlYWxTY2FsYXImIHByZWMpCisgIHsKKyAgICByZXR1cm4gbnVtZXh0OjphYnMyKHgpIDw9IG51bWV4dDo6YWJzMih5KSAqIHByZWMgKiBwcmVjOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykKKyAgeworICAgIHJldHVybiBudW1leHQ6OmFiczIoeCAtIHkpIDw9IG51bWV4dDo6bWluaShudW1leHQ6OmFiczIoeCksIG51bWV4dDo6YWJzMih5KSkgKiBwcmVjICogcHJlYzsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9mdXp6eV9pbXBsIDogc2NhbGFyX2Z1enp5X2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE90aGVyU2NhbGFyPiBFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGJvb2wgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBPdGhlclNjYWxhciYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsICZwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCit7CisgIHJldHVybiBzY2FsYXJfZnV6enlfaW1wbDxTY2FsYXI+Ojp0ZW1wbGF0ZSBpc011Y2hTbWFsbGVyVGhhbjxPdGhlclNjYWxhcj4oeCwgeSwgcHJlY2lzaW9uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGJvb2wgaXNBcHByb3goY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCAmcHJlY2lzaW9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQoreworICByZXR1cm4gc2NhbGFyX2Z1enp5X2ltcGw8U2NhbGFyPjo6aXNBcHByb3goeCwgeSwgcHJlY2lzaW9uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGJvb2wgaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsICZwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCit7CisgIHJldHVybiBzY2FsYXJfZnV6enlfaW1wbDxTY2FsYXI+Ojppc0FwcHJveE9yTGVzc1RoYW4oeCwgeSwgcHJlY2lzaW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqICBUaGUgc3BlY2lhbCBjYXNlIG9mIHRoZSAgYm9vbCB0eXBlICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTw+IHN0cnVjdCByYW5kb21faW1wbDxib29sPgoreworICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKCkKKyAgeworICAgIHJldHVybiByYW5kb208aW50PigwLDEpPT0wID8gZmFsc2UgOiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBzY2FsYXJfZnV6enlfaW1wbDxib29sPgoreworICB0eXBlZGVmIGJvb2wgUmVhbFNjYWxhcjsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyPiBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgYm9vbCYgeCwgY29uc3QgYm9vbCYsIGNvbnN0IGJvb2wmKQorICB7CisgICAgcmV0dXJuICF4OworICB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNBcHByb3goYm9vbCB4LCBib29sIHksIGJvb2wpCisgIHsKKyAgICByZXR1cm4geCA9PSB5OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94T3JMZXNzVGhhbihjb25zdCBib29sJiB4LCBjb25zdCBib29sJiB5LCBjb25zdCBib29sJikKKyAgeworICAgIHJldHVybiAoIXgpIHx8IHk7CisgIH0KKyAgCit9OworCisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUSEZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9NYXRoRnVuY3Rpb25zSW1wbC5oIGIvRWlnZW4vc3JjL0NvcmUvTWF0aEZ1bmN0aW9uc0ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzllZjIyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTWF0aEZ1bmN0aW9uc0ltcGwuaApAQCAtMCwwICsxLDc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBQZWRybyBHb25uZXQgKHBlZHJvLmdvbm5ldEBnbWFpbC5jb20pCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVEhGVU5DVElPTlNJTVBMX0gKKyNkZWZpbmUgRUlHRU5fTUFUSEZVTkNUSU9OU0lNUExfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBoeXBlcmJvbGljIHRhbiBvZiBcYSBhIChjb2VmZi13aXNlKQorICAgIERvZXNuJ3QgZG8gYW55dGhpbmcgZmFuY3ksIGp1c3QgYSAxMy82LWRlZ3JlZSByYXRpb25hbCBpbnRlcnBvbGFudCB3aGljaAorICAgIGlzIGFjY3VyYXRlIHVwIHRvIGEgY291cGxlIG9mIHVscCBpbiB0aGUgcmFuZ2UgWy05LCA5XSwgb3V0c2lkZSBvZiB3aGljaAorICAgIHRoZSB0YW5oKHgpID0gKy8tMS4KKworICAgIFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3Mgb24gYm90aCBzY2FsYXJzIGFuZCBwYWNrZXRzLgorKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIGdlbmVyaWNfZmFzdF90YW5oX2Zsb2F0KGNvbnN0IFQmIGFfeCkKK3sKKyAgLy8gQ2xhbXAgdGhlIGlucHV0cyB0byB0aGUgcmFuZ2UgWy05LCA5XSBzaW5jZSBhbnl0aGluZyBvdXRzaWRlCisgIC8vIHRoaXMgcmFuZ2UgaXMgKy8tMS4wZiBpbiBzaW5nbGUtcHJlY2lzaW9uLgorICBjb25zdCBUIHBsdXNfOSA9IHBzZXQxPFQ+KDkuZik7CisgIGNvbnN0IFQgbWludXNfOSA9IHBzZXQxPFQ+KC05LmYpOworICAvLyBOT1RFIEdDQyBwcmlvciB0byA2LjMgbWlnaHQgaW1wcm9wZXJseSBvcHRpbWl6ZSB0aGlzIG1heC9taW4KKyAgLy8gICAgICBzdGVwIHN1Y2ggdGhhdCBpZiBhX3ggaXMgbmFuLCB4IHdpbGwgYmUgZWl0aGVyIDkgb3IgLTksCisgIC8vICAgICAgYW5kIHRhbmggd2lsbCByZXR1cm4gMSBvciAtMSBpbnN0ZWFkIG9mIG5hbi4KKyAgLy8gICAgICBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGZpeGVkIGluIGdjYzYuMywKKyAgLy8gICAgICBzZWU6IGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTcyODY3CisgIGNvbnN0IFQgeCA9IHBtYXgobWludXNfOSxwbWluKHBsdXNfOSxhX3gpKTsKKyAgLy8gVGhlIG1vbm9taWFsIGNvZWZmaWNpZW50cyBvZiB0aGUgbnVtZXJhdG9yIHBvbHlub21pYWwgKG9kZCkuCisgIGNvbnN0IFQgYWxwaGFfMSA9IHBzZXQxPFQ+KDQuODkzNTI0NTU4OTE3ODZlLTAzZik7CisgIGNvbnN0IFQgYWxwaGFfMyA9IHBzZXQxPFQ+KDYuMzcyNjE5Mjg4NzU0MzZlLTA0Zik7CisgIGNvbnN0IFQgYWxwaGFfNSA9IHBzZXQxPFQ+KDEuNDg1NzIyMzU3MTc5NzllLTA1Zik7CisgIGNvbnN0IFQgYWxwaGFfNyA9IHBzZXQxPFQ+KDUuMTIyMjk3MDkwMzcxMTRlLTA4Zik7CisgIGNvbnN0IFQgYWxwaGFfOSA9IHBzZXQxPFQ+KC04LjYwNDY3MTUyMjEzNzM1ZS0xMWYpOworICBjb25zdCBUIGFscGhhXzExID0gcHNldDE8VD4oMi4wMDAxODc5MDQ4MjQ3N2UtMTNmKTsKKyAgY29uc3QgVCBhbHBoYV8xMyA9IHBzZXQxPFQ+KC0yLjc2MDc2ODQ3NzQyMzU1ZS0xNmYpOworCisgIC8vIFRoZSBtb25vbWlhbCBjb2VmZmljaWVudHMgb2YgdGhlIGRlbm9taW5hdG9yIHBvbHlub21pYWwgKGV2ZW4pLgorICBjb25zdCBUIGJldGFfMCA9IHBzZXQxPFQ+KDQuODkzNTI1MTg1NTQzODVlLTAzZik7CisgIGNvbnN0IFQgYmV0YV8yID0gcHNldDE8VD4oMi4yNjg0MzQ2MzI0MzkwMGUtMDNmKTsKKyAgY29uc3QgVCBiZXRhXzQgPSBwc2V0MTxUPigxLjE4NTM0NzA1Njg2NjU0ZS0wNGYpOworICBjb25zdCBUIGJldGFfNiA9IHBzZXQxPFQ+KDEuMTk4MjU4Mzk0NjY3MDJlLTA2Zik7CisKKyAgLy8gU2luY2UgdGhlIHBvbHlub21pYWxzIGFyZSBvZGQvZXZlbiwgd2UgbmVlZCB4XjIuCisgIGNvbnN0IFQgeDIgPSBwbXVsKHgsIHgpOworCisgIC8vIEV2YWx1YXRlIHRoZSBudW1lcmF0b3IgcG9seW5vbWlhbCBwLgorICBUIHAgPSBwbWFkZCh4MiwgYWxwaGFfMTMsIGFscGhhXzExKTsKKyAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV85KTsKKyAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV83KTsKKyAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV81KTsKKyAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV8zKTsKKyAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV8xKTsKKyAgcCA9IHBtdWwoeCwgcCk7CisKKyAgLy8gRXZhbHVhdGUgdGhlIGRlbm9taW5hdG9yIHBvbHlub21pYWwgcC4KKyAgVCBxID0gcG1hZGQoeDIsIGJldGFfNiwgYmV0YV80KTsKKyAgcSA9IHBtYWRkKHgyLCBxLCBiZXRhXzIpOworICBxID0gcG1hZGQoeDIsIHEsIGJldGFfMCk7CisKKyAgLy8gRGl2aWRlIHRoZSBudW1lcmF0b3IgYnkgdGhlIGRlbm9taW5hdG9yLgorICByZXR1cm4gcGRpdihwLCBxKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUSEZVTkNUSU9OU0lNUExfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9NYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMzMzZkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTWF0cml4LmgKQEAgLTAsMCArMSw0NjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorc3RydWN0IHRyYWl0czxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7Citwcml2YXRlOgorICBlbnVtIHsgc2l6ZSA9IGludGVybmFsOjpzaXplX2F0X2NvbXBpbGVfdGltZTxfUm93cyxfQ29scz46OnJldCB9OworICB0eXBlZGVmIHR5cGVuYW1lIGZpbmRfYmVzdF9wYWNrZXQ8X1NjYWxhcixzaXplPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgIGVudW0geworICAgICAgcm93X21ham9yX2JpdCA9IF9PcHRpb25zJlJvd01ham9yID8gUm93TWFqb3JCaXQgOiAwLAorICAgICAgaXNfZHluYW1pY19zaXplX3N0b3JhZ2UgPSBfTWF4Um93cz09RHluYW1pYyB8fCBfTWF4Q29scz09RHluYW1pYywKKyAgICAgIG1heF9zaXplID0gaXNfZHluYW1pY19zaXplX3N0b3JhZ2UgPyBEeW5hbWljIDogX01heFJvd3MqX01heENvbHMsCisgICAgICBkZWZhdWx0X2FsaWdubWVudCA9IGNvbXB1dGVfZGVmYXVsdF9hbGlnbm1lbnQ8X1NjYWxhcixtYXhfc2l6ZT46OnZhbHVlLAorICAgICAgYWN0dWFsX2FsaWdubWVudCA9ICgoX09wdGlvbnMmRG9udEFsaWduKT09MCkgPyBkZWZhdWx0X2FsaWdubWVudCA6IDAsCisgICAgICByZXF1aXJlZF9hbGlnbm1lbnQgPSB1bnBhY2tldF90cmFpdHM8UGFja2V0U2NhbGFyPjo6YWxpZ25tZW50LAorICAgICAgcGFja2V0X2FjY2Vzc19iaXQgPSAocGFja2V0X3RyYWl0czxfU2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIChFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFIHx8IChhY3R1YWxfYWxpZ25tZW50Pj1yZXF1aXJlZF9hbGlnbm1lbnQpKSkgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwCisgICAgfTsKKyAgICAKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBEZW5zZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IF9Sb3dzLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gX0NvbHMsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBfTWF4Um93cywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IF9NYXhDb2xzLAorICAgIEZsYWdzID0gY29tcHV0ZV9tYXRyaXhfZmxhZ3M8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPjo6cmV0LAorICAgIE9wdGlvbnMgPSBfT3B0aW9ucywKKyAgICBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPSAxLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IChPcHRpb25zJlJvd01ham9yKSA/IENvbHNBdENvbXBpbGVUaW1lIDogUm93c0F0Q29tcGlsZVRpbWUsCisgICAgCisgICAgLy8gRklYTUUsIHRoZSBmb2xsb3dpbmcgZmxhZyBpbiBvbmx5IHVzZWQgdG8gZGVmaW5lIE5lZWRzVG9BbGlnbiBpbiBQbGFpbk9iamVjdEJhc2UKKyAgICBFdmFsdWF0b3JGbGFncyA9IExpbmVhckFjY2Vzc0JpdCB8IERpcmVjdEFjY2Vzc0JpdCB8IHBhY2tldF9hY2Nlc3NfYml0IHwgcm93X21ham9yX2JpdCwKKyAgICBBbGlnbm1lbnQgPSBhY3R1YWxfYWxpZ25tZW50CisgIH07Cit9OworfQorCisvKiogXGNsYXNzIE1hdHJpeAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGhlIG1hdHJpeCBjbGFzcywgYWxzbyB1c2VkIGZvciB2ZWN0b3JzIGFuZCByb3ctdmVjdG9ycworICAqCisgICogVGhlICVNYXRyaXggY2xhc3MgaXMgdGhlIHdvcmstaG9yc2UgZm9yIGFsbCBcZW0gZGVuc2UgKFxyZWYgZGVuc2UgIm5vdGUiKSBtYXRyaWNlcyBhbmQgdmVjdG9ycyB3aXRoaW4gRWlnZW4uCisgICogVmVjdG9ycyBhcmUgbWF0cmljZXMgd2l0aCBvbmUgY29sdW1uLCBhbmQgcm93LXZlY3RvcnMgYXJlIG1hdHJpY2VzIHdpdGggb25lIHJvdy4KKyAgKgorICAqIFRoZSAlTWF0cml4IGNsYXNzIGVuY29tcGFzc2VzIFxlbSBib3RoIGZpeGVkLXNpemUgYW5kIGR5bmFtaWMtc2l6ZSBvYmplY3RzIChccmVmIGZpeGVkc2l6ZSAibm90ZSIpLgorICAqCisgICogVGhlIGZpcnN0IHRocmVlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkOgorICAqIFx0cGFyYW0gX1NjYWxhciBOdW1lcmljIHR5cGUsIGUuZy4gZmxvYXQsIGRvdWJsZSwgaW50IG9yIHN0ZDo6Y29tcGxleDxmbG9hdD4uCisgICogICAgICAgICAgICAgICAgIFVzZXIgZGVmaW5lZCBzY2FsYXIgdHlwZXMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsIChzZWUgXHJlZiB1c2VyX2RlZmluZWRfc2NhbGFycyAiaGVyZSIpLgorICAqIFx0cGFyYW0gX1Jvd3MgTnVtYmVyIG9mIHJvd3MsIG9yIFxiIER5bmFtaWMKKyAgKiBcdHBhcmFtIF9Db2xzIE51bWJlciBvZiBjb2x1bW5zLCBvciBcYiBEeW5hbWljCisgICoKKyAgKiBUaGUgcmVtYWluaW5nIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIC0tIGluIG1vc3QgY2FzZXMgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4KKyAgKiBcdHBhcmFtIF9PcHRpb25zIEEgY29tYmluYXRpb24gb2YgZWl0aGVyIFxiICNSb3dNYWpvciBvciBcYiAjQ29sTWFqb3IsIGFuZCBvZiBlaXRoZXIKKyAgKiAgICAgICAgICAgICAgICAgXGIgI0F1dG9BbGlnbiBvciBcYiAjRG9udEFsaWduLgorICAqICAgICAgICAgICAgICAgICBUaGUgZm9ybWVyIGNvbnRyb2xzIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJzdG9yYWdlIG9yZGVyIiwgYW5kIGRlZmF1bHRzIHRvIGNvbHVtbi1tYWpvci4gVGhlIGxhdHRlciBjb250cm9scyBhbGlnbm1lbnQsIHdoaWNoIGlzIHJlcXVpcmVkCisgICogICAgICAgICAgICAgICAgIGZvciB2ZWN0b3JpemF0aW9uLiBJdCBkZWZhdWx0cyB0byBhbGlnbmluZyBtYXRyaWNlcyBleGNlcHQgZm9yIGZpeGVkIHNpemVzIHRoYXQgYXJlbid0IGEgbXVsdGlwbGUgb2YgdGhlIHBhY2tldCBzaXplLgorICAqIFx0cGFyYW0gX01heFJvd3MgTWF4aW11bSBudW1iZXIgb2Ygcm93cy4gRGVmYXVsdHMgdG8gXGEgX1Jvd3MgKFxyZWYgbWF4cm93cyAibm90ZSIpLgorICAqIFx0cGFyYW0gX01heENvbHMgTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gXGEgX0NvbHMgKFxyZWYgbWF4cm93cyAibm90ZSIpLgorICAqCisgICogRWlnZW4gcHJvdmlkZXMgYSBudW1iZXIgb2YgdHlwZWRlZnMgY292ZXJpbmcgdGhlIHVzdWFsIGNhc2VzLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAqCisgICogXGxpIFxjIE1hdHJpeDJkIGlzIGEgMngyIHNxdWFyZSBtYXRyaXggb2YgZG91YmxlcyAoXGMgTWF0cml4PGRvdWJsZSwgMiwgMj4pCisgICogXGxpIFxjIFZlY3RvcjRmIGlzIGEgdmVjdG9yIG9mIDQgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIDQsIDE+KQorICAqIFxsaSBcYyBSb3dWZWN0b3IzaSBpcyBhIHJvdy12ZWN0b3Igb2YgMyBpbnRzIChcYyBNYXRyaXg8aW50LCAxLCAzPikKKyAgKgorICAqIFxsaSBcYyBNYXRyaXhYZiBpcyBhIGR5bmFtaWMtc2l6ZSBtYXRyaXggb2YgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWM+KQorICAqIFxsaSBcYyBWZWN0b3JYZiBpcyBhIGR5bmFtaWMtc2l6ZSB2ZWN0b3Igb2YgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDE+KQorICAqCisgICogXGxpIFxjIE1hdHJpeDJYZiBpcyBhIHBhcnRpYWxseSBmaXhlZC1zaXplIChkeW5hbWljLXNpemUpIG1hdHJpeCBvZiBmbG9hdHMgKFxjIE1hdHJpeDxmbG9hdCwgMiwgRHluYW1pYz4pCisgICogXGxpIFxjIE1hdHJpeFgzZCBpcyBhIHBhcnRpYWxseSBkeW5hbWljLXNpemUgKGZpeGVkLXNpemUpIG1hdHJpeCBvZiBkb3VibGUgKFxjIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIDM+KQorICAqCisgICogU2VlIFxsaW5rIG1hdHJpeHR5cGVkZWZzIHRoaXMgcGFnZSBcZW5kbGluayBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHByZWRlZmluZWQgXGVtICVNYXRyaXggYW5kIFxlbSBWZWN0b3IgdHlwZWRlZnMuCisgICoKKyAgKiBZb3UgY2FuIGFjY2VzcyBlbGVtZW50cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlcyB1c2luZyBub3JtYWwgc3Vic2NyaXB0aW5nOgorICAqCisgICogXGNvZGUKKyAgKiBFaWdlbjo6VmVjdG9yWGQgdigxMCk7CisgICogdlswXSA9IDAuMTsKKyAgKiB2WzFdID0gMC4yOworICAqIHYoMCkgPSAwLjM7CisgICogdigxKSA9IDAuNDsKKyAgKgorICAqIEVpZ2VuOjpNYXRyaXhYaSBtKDEwLCAxMCk7CisgICogbSgwLCAxKSA9IDE7CisgICogbSgwLCAyKSA9IDI7CisgICogbSgwLCAzKSA9IDM7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fTUFUUklYX1BMVUdJTi4KKyAgKgorICAqIDxpPjxiPlNvbWUgbm90ZXM6PC9iPjwvaT4KKyAgKgorICAqIDxkbD4KKyAgKiA8ZHQ+PGI+XGFuY2hvciBkZW5zZSBEZW5zZSB2ZXJzdXMgc3BhcnNlOjwvYj48L2R0PgorICAqIDxkZD5UaGlzICVNYXRyaXggY2xhc3MgaGFuZGxlcyBkZW5zZSwgbm90IHNwYXJzZSBtYXRyaWNlcyBhbmQgdmVjdG9ycy4gRm9yIHNwYXJzZSBtYXRyaWNlcyBhbmQgdmVjdG9ycywgc2VlIHRoZSBTcGFyc2UgbW9kdWxlLgorICAqCisgICogRGVuc2UgbWF0cmljZXMgYW5kIHZlY3RvcnMgYXJlIHBsYWluIHVzdWFsIGFycmF5cyBvZiBjb2VmZmljaWVudHMuIEFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQsIGluIGFuIG9yZGluYXJ5IGNvbnRpZ3VvdXMgYXJyYXkuCisgICogVGhpcyBpcyB1bmxpa2UgU3BhcnNlIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIHdoZXJlIHRoZSBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyBhIGxpc3Qgb2Ygbm9uemVybyBjb2VmZmljaWVudHMuPC9kZD4KKyAgKgorICAqIDxkdD48Yj5cYW5jaG9yIGZpeGVkc2l6ZSBGaXhlZC1zaXplIHZlcnN1cyBkeW5hbWljLXNpemU6PC9iPjwvZHQ+CisgICogPGRkPkZpeGVkLXNpemUgbWVhbnMgdGhhdCB0aGUgbnVtYmVycyBvZiByb3dzIGFuZCBjb2x1bW5zIGFyZSBrbm93biBhcmUgY29tcGlsZS10aW1lLiBJbiB0aGlzIGNhc2UsIEVpZ2VuIGFsbG9jYXRlcyB0aGUgYXJyYXkKKyAgKiBvZiBjb2VmZmljaWVudHMgYXMgYSBmaXhlZC1zaXplIGFycmF5LCBhcyBhIGNsYXNzIG1lbWJlci4gVGhpcyBtYWtlcyBzZW5zZSBmb3IgdmVyeSBzbWFsbCBtYXRyaWNlcywgdHlwaWNhbGx5IHVwIHRvIDR4NCwgc29tZXRpbWVzIHVwCisgICogdG8gMTZ4MTYuIExhcmdlciBtYXRyaWNlcyBzaG91bGQgYmUgZGVjbGFyZWQgYXMgZHluYW1pYy1zaXplIGV2ZW4gaWYgb25lIGhhcHBlbnMgdG8ga25vdyB0aGVpciBzaXplIGF0IGNvbXBpbGUtdGltZS4KKyAgKgorICAqIER5bmFtaWMtc2l6ZSBtZWFucyB0aGF0IHRoZSBudW1iZXJzIG9mIHJvd3Mgb3IgY29sdW1ucyBhcmUgbm90IG5lY2Vzc2FyaWx5IGtub3duIGF0IGNvbXBpbGUtdGltZS4gSW4gdGhpcyBjYXNlIHRoZXkgYXJlIHJ1bnRpbWUKKyAgKiB2YXJpYWJsZXMsIGFuZCB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBvbiB0aGUgaGVhcC4KKyAgKgorICAqIE5vdGUgdGhhdCBcZW0gZGVuc2UgbWF0cmljZXMsIGJlIHRoZXkgRml4ZWQtc2l6ZSBvciBEeW5hbWljLXNpemUsIDxlbT5kbyBub3Q8L2VtPiBleHBhbmQgZHluYW1pY2FsbHkgaW4gdGhlIHNlbnNlIG9mIGEgc3RkOjptYXAuCisgICogSWYgeW91IHdhbnQgdGhpcyBiZWhhdmlvciwgc2VlIHRoZSBTcGFyc2UgbW9kdWxlLjwvZGQ+CisgICoKKyAgKiA8ZHQ+PGI+XGFuY2hvciBtYXhyb3dzIF9NYXhSb3dzIGFuZCBfTWF4Q29sczo8L2I+PC9kdD4KKyAgKiA8ZGQ+SW4gbW9zdCBjYXNlcywgb25lIGp1c3QgbGVhdmVzIHRoZXNlIHBhcmFtZXRlcnMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgorICAqIFRoZXNlIHBhcmFtZXRlcnMgbWVhbiB0aGUgbWF4aW11bSBzaXplIG9mIHJvd3MgYW5kIGNvbHVtbnMgdGhhdCB0aGUgbWF0cml4IG1heSBoYXZlLiBUaGV5IGFyZSB1c2VmdWwgaW4gY2FzZXMKKyAgKiB3aGVuIHRoZSBleGFjdCBudW1iZXJzIG9mIHJvd3MgYW5kIGNvbHVtbnMgYXJlIG5vdCBrbm93biBhcmUgY29tcGlsZS10aW1lLCBidXQgaXQgaXMga25vd24gYXQgY29tcGlsZS10aW1lIHRoYXQgdGhleSBjYW5ub3QKKyAgKiBleGNlZWQgYSBjZXJ0YWluIHZhbHVlLiBUaGlzIGhhcHBlbnMgd2hlbiB0YWtpbmcgZHluYW1pYy1zaXplIGJsb2NrcyBpbnNpZGUgZml4ZWQtc2l6ZSBtYXRyaWNlczogaW4gdGhpcyBjYXNlIF9NYXhSb3dzIGFuZCBfTWF4Q29scworICAqIGFyZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4LCB3aGlsZSBfUm93cyBhbmQgX0NvbHMgYXJlIER5bmFtaWMuPC9kZD4KKyAgKiA8L2RsPgorICAqCisgICogPGk+PGI+QUJJIGFuZCBzdG9yYWdlIGxheW91dDwvYj48L2k+CisgICoKKyAgKiBUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcyB0aGUgQUJJIG9mIHNvbWUgcG9zc2libGUgTWF0cml4IGluc3RhbmNlcyB3aGljaCBpcyBmaXhlZCB0aG9yb3VnaCB0aGUgbGlmZXRpbWUgb2YgRWlnZW4gMy4KKyAgKiA8dGFibGUgIGNsYXNzPSJtYW51YWwiPgorICAqIDx0cj48dGg+TWF0cml4IHR5cGU8L3RoPjx0aD5FcXVpdmFsZW50IEMgc3RydWN0dXJlPC90aD48L3RyPgorICAqIDx0cj48dGQ+XGNvZGUgTWF0cml4PFQsRHluYW1pYyxEeW5hbWljPiBcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCisgICogc3RydWN0IHsKKyAgKiAgIFQgKmRhdGE7ICAgICAgICAgICAgICAgICAgLy8gd2l0aCAoc2l6ZV90KGRhdGEpJUVJR0VOX01BWF9BTElHTl9CWVRFUyk9PTAKKyAgKiAgIEVpZ2VuOjpJbmRleCByb3dzLCBjb2xzOworICAqICB9OworICAqIFxlbmRjb2RlPC90ZD48L3RyPgorICAqIDx0ciBjbGFzcz0iYWx0Ij48dGQ+XGNvZGUKKyAgKiBNYXRyaXg8VCxEeW5hbWljLDE+CisgICogTWF0cml4PFQsMSxEeW5hbWljPiBcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCisgICogc3RydWN0IHsKKyAgKiAgIFQgKmRhdGE7ICAgICAgICAgICAgICAgICAgLy8gd2l0aCAoc2l6ZV90KGRhdGEpJUVJR0VOX01BWF9BTElHTl9CWVRFUyk9PTAKKyAgKiAgIEVpZ2VuOjpJbmRleCBzaXplOworICAqICB9OworICAqIFxlbmRjb2RlPC90ZD48L3RyPgorICAqIDx0cj48dGQ+XGNvZGUgTWF0cml4PFQsUm93cyxDb2xzPiBcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCisgICogc3RydWN0IHsKKyAgKiAgIFQgZGF0YVtSb3dzKkNvbHNdOyAgICAgICAgLy8gd2l0aCAoc2l6ZV90KGRhdGEpJUEoUm93cypDb2xzKnNpemVvZihUKSkpPT0wCisgICogIH07CisgICogXGVuZGNvZGU8L3RkPjwvdHI+CisgICogPHRyIGNsYXNzPSJhbHQiPjx0ZD5cY29kZSBNYXRyaXg8VCxEeW5hbWljLER5bmFtaWMsMCxNYXhSb3dzLE1heENvbHM+IFxlbmRjb2RlPC90ZD48dGQ+XGNvZGUKKyAgKiBzdHJ1Y3QgeworICAqICAgVCBkYXRhW01heFJvd3MqTWF4Q29sc107ICAvLyB3aXRoIChzaXplX3QoZGF0YSklQShNYXhSb3dzKk1heENvbHMqc2l6ZW9mKFQpKSk9PTAKKyAgKiAgIEVpZ2VuOjpJbmRleCByb3dzLCBjb2xzOworICAqICB9OworICAqIFxlbmRjb2RlPC90ZD48L3RyPgorICAqIDwvdGFibGU+CisgICogTm90ZSB0aGF0IGluIHRoaXMgdGFibGUgUm93cywgQ29scywgTWF4Um93cyBhbmQgTWF4Q29scyBhcmUgYWxsIHBvc2l0aXZlIGludGVnZXJzLiBBKFMpIGlzIGRlZmluZWQgdG8gdGhlIGxhcmdlc3QgcG9zc2libGUgcG93ZXItb2YtdHdvCisgICogc21hbGxlciB0byBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTLgorICAqCisgICogXHNlZSBNYXRyaXhCYXNlIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIEFQSSBtZXRob2RzIGZvciBtYXRyaWNlcywgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5LAorICAqIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzCisgICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorY2xhc3MgTWF0cml4CisgIDogcHVibGljIFBsYWluT2JqZWN0QmFzZTxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7CisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgQmFzZSBjbGFzcyB0eXBlZGVmLgorICAgICAgKiBcc2EgUGxhaW5PYmplY3RCYXNlCisgICAgICAqLworICAgIHR5cGVkZWYgUGxhaW5PYmplY3RCYXNlPE1hdHJpeD4gQmFzZTsKKworICAgIGVudW0geyBPcHRpb25zID0gX09wdGlvbnMgfTsKKworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoTWF0cml4KQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKworICAgIHVzaW5nIEJhc2U6OmJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisKKyAgICAvKioKKyAgICAgICogXGJyaWVmIEFzc2lnbnMgbWF0cmljZXMgdG8gZWFjaCBvdGhlci4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMKKyAgICAgICogdG8gcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKgorICAgICAgKiBcY2FsbGdyYXBoCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgmIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpfc2V0KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxicmllZiBDb3BpZXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxhIG90aGVyIGludG8gXGMgKnRoaXMgd2l0aCBhdXRvbWF0aWMgcmVzaXppbmcuCisgICAgICAqCisgICAgICAqICp0aGlzIG1pZ2h0IGJlIHJlc2l6ZWQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgXGEgb3RoZXIuIElmICp0aGlzIHdhcyBhIG51bGwgbWF0cml4IChub3QgYWxyZWFkeSBpbml0aWFsaXplZCksCisgICAgICAqIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCBjb3B5aW5nIGEgcm93LXZlY3RvciBpbnRvIGEgdmVjdG9yIChhbmQgY29udmVyc2VseSkgaXMgYWxsb3dlZC4KKyAgICAgICogVGhlIHJlc2l6aW5nLCBpZiBhbnksIGlzIHRoZW4gZG9uZSBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5IHNvIHRoYXQgcm93LXZlY3RvcnMKKyAgICAgICogcmVtYWluIHJvdy12ZWN0b3JzIGFuZCB2ZWN0b3JzIHJlbWFpbiB2ZWN0b3JzLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6X3NldChvdGhlcik7CisgICAgfQorCisgICAgLyogSGVyZSwgZG94eWdlbiBmYWlsZWQgdG8gY29weSB0aGUgYnJpZWYgaW5mb3JtYXRpb24gd2hlbiB1c2luZyBcY29weWRvYyAqLworCisgICAgLyoqCisgICAgICAqIFxicmllZiBDb3BpZXMgdGhlIGdlbmVyaWMgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvICp0aGlzLgorICAgICAgKiBcY29weWRldGFpbHMgRGVuc2VCYXNlOjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgZnVuYykKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KGZ1bmMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogRm9yIGZpeGVkLXNpemUgbWF0cmljZXMsIGRvZXMgbm90aGluZy4KKyAgICAgICoKKyAgICAgICogRm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgY3JlYXRlcyBhbiBlbXB0eSBtYXRyaXggb2Ygc2l6ZSAwLiBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYXJyYXkuIFN1Y2ggYSBtYXRyaXgKKyAgICAgICogaXMgY2FsbGVkIGEgbnVsbCBtYXRyaXguIFRoaXMgY29uc3RydWN0b3IgaXMgdGhlIHVuaXF1ZSB3YXkgdG8gY3JlYXRlIG51bGwgbWF0cmljZXM6IHJlc2l6aW5nCisgICAgICAqIGEgbWF0cml4IHRvIDAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICoKKyAgICAgICogXHNhIHJlc2l6ZShJbmRleCxJbmRleCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeCgpIDogQmFzZSgpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKworICAgIC8vIEZJWE1FIGlzIGl0IHN0aWxsIG5lZWRlZAorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZXhwbGljaXQgTWF0cml4KGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpCisgICAgICA6IEJhc2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCgpKQorICAgIHsgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOyBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVEIH0KKworI2lmIEVJR0VOX0hBU19SVkFMVUVfUkVGRVJFTkNFUworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgTWF0cml4KE1hdHJpeCYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVF9JRihzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPFNjYWxhcj46OnZhbHVlKQorICAgICAgOiBCYXNlKHN0ZDo6bW92ZShvdGhlcikpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgaWYgKFJvd3NBdENvbXBpbGVUaW1lIT1EeW5hbWljICYmIENvbHNBdENvbXBpbGVUaW1lIT1EeW5hbWljKQorICAgICAgICBCYXNlOjpfc2V0X25vYWxpYXMob3RoZXIpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIE1hdHJpeCYgb3BlcmF0b3I9KE1hdHJpeCYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVF9JRihzdGQ6OmlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPFNjYWxhcj46OnZhbHVlKQorICAgIHsKKyAgICAgIG90aGVyLnN3YXAoKnRoaXMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgYm90aCAxeDEgbWF0cmljZXMgYW5kIGR5bmFtaWMgdmVjdG9ycworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IE1hdHJpeChjb25zdCBUJiB4KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIF9pbml0MTxUPih4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeChjb25zdCBUMCYgeCwgY29uc3QgVDEmIHkpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgQmFzZTo6dGVtcGxhdGUgX2luaXQyPFQwLFQxPih4LCB5KTsKKyAgICB9CisgICAgI2Vsc2UKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYSBmaXhlZC1zaXplZCBtYXRyaXggaW5pdGlhbGl6ZWQgd2l0aCBjb2VmZmljaWVudHMgc3RhcnRpbmcgYXQgXGEgZGF0YSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZXhwbGljaXQgTWF0cml4KGNvbnN0IFNjYWxhciAqZGF0YSk7CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYSB2ZWN0b3Igb3Igcm93LXZlY3RvciB3aXRoIGdpdmVuIGRpbWVuc2lvbi4gXG9ubHlfZm9yX3ZlY3RvcnMKKyAgICAgICoKKyAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGR5bmFtaWMtc2l6ZSB2ZWN0b3JzLiBGb3IgZml4ZWQtc2l6ZSB2ZWN0b3JzLAorICAgICAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyB0aGVzZSBwYXJhbWV0ZXJzLCBzbyBvbmUgc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgKiBNYXRyaXgoKSBpbnN0ZWFkLgorICAgICAgKiAKKyAgICAgICogXHdhcm5pbmcgVGhpcyBjb25zdHJ1Y3RvciBpcyBkaXNhYmxlZCBmb3IgZml4ZWQtc2l6ZSBcYyAxeDEgbWF0cmljZXMuIEZvciBpbnN0YW5jZSwKKyAgICAgICogY2FsbGluZyBNYXRyaXg8ZG91YmxlLDEsMT4oMSkgd2lsbCBjYWxsIHRoZSBpbml0aWFsaXphdGlvbiBjb25zdHJ1Y3RvcjogTWF0cml4KGNvbnN0IFNjYWxhciYpLgorICAgICAgKiBGb3IgZml4ZWQtc2l6ZSBcYyAxeDEgbWF0cmljZXMgaXQgaXMgdGhlcmVmb3JlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAgKiBjb25zdHJ1Y3RvciBNYXRyaXgoKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IHdoZW4gdXNpbmcgb25lIG9mIHRoZSBub24gc3RhbmRhcmQKKyAgICAgICogXGMgRUlHRU5fSU5JVElBTElaRV9NQVRSSUNFU19CWV97WkVSTyxcYyBOQU59IG1hY3JvcyAoc2VlIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzKS4KKyAgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBNYXRyaXgoSW5kZXggZGltKTsKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYW4gaW5pdGlhbGl6ZWQgMXgxIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBjb2VmZmljaWVudCAqLworICAgIE1hdHJpeChjb25zdCBTY2FsYXImIHgpOworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIG1hdHJpeCB3aXRoIFxhIHJvd3Mgcm93cyBhbmQgXGEgY29scyBjb2x1bW5zLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLiBGb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcywKKyAgICAgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgdGhlc2UgcGFyYW1ldGVycywgc28gb25lIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICogTWF0cml4KCkgaW5zdGVhZC4KKyAgICAgICogCisgICAgICAqIFx3YXJuaW5nIFRoaXMgY29uc3RydWN0b3IgaXMgZGlzYWJsZWQgZm9yIGZpeGVkLXNpemUgXGMgMXgyIGFuZCBcYyAyeDEgdmVjdG9ycy4gRm9yIGluc3RhbmNlLAorICAgICAgKiBjYWxsaW5nIE1hdHJpeDJmKDIsMSkgd2lsbCBjYWxsIHRoZSBpbml0aWFsaXphdGlvbiBjb25zdHJ1Y3RvcjogTWF0cml4KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KS4KKyAgICAgICogRm9yIGZpeGVkLXNpemUgXGMgMXgyIG9yIFxjIDJ4MSB2ZWN0b3JzIGl0IGlzIHRoZXJlZm9yZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRlZmF1bHQKKyAgICAgICogY29uc3RydWN0b3IgTWF0cml4KCkgaW5zdGVhZCwgZXNwZWNpYWxseSB3aGVuIHVzaW5nIG9uZSBvZiB0aGUgbm9uIHN0YW5kYXJkCisgICAgICAqIFxjIEVJR0VOX0lOSVRJQUxJWkVfTUFUUklDRVNfQllfe1pFUk8sXGMgTkFOfSBtYWNyb3MgKHNlZSBccmVmIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlcykuCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgTWF0cml4KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworICAgIAorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhbiBpbml0aWFsaXplZCAyRCB2ZWN0b3Igd2l0aCBnaXZlbiBjb2VmZmljaWVudHMgKi8KKyAgICBNYXRyaXgoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpOworICAgICNlbmRpZgorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDNEIHZlY3RvciB3aXRoIGdpdmVuIGNvZWZmaWNpZW50cyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgeikKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE1hdHJpeCwgMykKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMF0gPSB4OworICAgICAgbV9zdG9yYWdlLmRhdGEoKVsxXSA9IHk7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzJdID0gejsKKyAgICB9CisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIDREIHZlY3RvciB3aXRoIGdpdmVuIGNvZWZmaWNpZW50cyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgeiwgY29uc3QgU2NhbGFyJiB3KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoTWF0cml4LCA0KQorICAgICAgbV9zdG9yYWdlLmRhdGEoKVswXSA9IHg7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzFdID0geTsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMl0gPSB6OworICAgICAgbV9zdG9yYWdlLmRhdGEoKVszXSA9IHc7CisgICAgfQorCisKKyAgICAvKiogXGJyaWVmIENvcHkgY29uc3RydWN0b3IgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IE1hdHJpeCYgb3RoZXIpIDogQmFzZShvdGhlcikKKyAgICB7IH0KKworICAgIC8qKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciBmb3IgZ2VuZXJpYyBleHByZXNzaW9ucy4KKyAgICAgICogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKKyAgICAgIDogQmFzZShvdGhlci5kZXJpdmVkKCkpCisgICAgeyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiAxOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+aW5uZXJTaXplKCk7IH0KKworICAgIC8vLy8vLy8vLy8vIEdlb21ldHJ5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgZXhwbGljaXQgTWF0cml4KGNvbnN0IFJvdGF0aW9uQmFzZTxPdGhlckRlcml2ZWQsQ29sc0F0Q29tcGlsZVRpbWU+JiByKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBSb3RhdGlvbkJhc2U8T3RoZXJEZXJpdmVkLENvbHNBdENvbXBpbGVUaW1lPiYgcik7CisKKyAgICAvLyBhbGxvdyB0byBleHRlbmQgTWF0cml4IG91dHNpZGUgRWlnZW4KKyAgICAjaWZkZWYgRUlHRU5fTUFUUklYX1BMVUdJTgorICAgICNpbmNsdWRlIEVJR0VOX01BVFJJWF9QTFVHSU4KKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBJc1ZlY3Rvcj4KKyAgICBmcmllbmQgc3RydWN0IGludGVybmFsOjpjb25zZXJ2YXRpdmVfcmVzaXplX2xpa2VfaW1wbDsKKworICAgIHVzaW5nIEJhc2U6Om1fc3RvcmFnZTsKK307CisKKy8qKiBcZGVmZ3JvdXAgbWF0cml4dHlwZWRlZnMgR2xvYmFsIG1hdHJpeCB0eXBlZGVmcworICAqCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIEVpZ2VuIGRlZmluZXMgc2V2ZXJhbCB0eXBlZGVmIHNob3J0Y3V0cyBmb3IgbW9zdCBjb21tb24gbWF0cml4IGFuZCB2ZWN0b3IgdHlwZXMuCisgICoKKyAgKiBUaGUgZ2VuZXJhbCBwYXR0ZXJucyBhcmUgdGhlIGZvbGxvd2luZzoKKyAgKgorICAqIFxjIE1hdHJpeFNpemVUeXBlIHdoZXJlIFxjIFNpemUgY2FuIGJlIFxjIDIsXGMgMyxcYyA0IGZvciBmaXhlZCBzaXplIHNxdWFyZSBtYXRyaWNlcyBvciBcYyBYIGZvciBkeW5hbWljIHNpemUsCisgICogYW5kIHdoZXJlIFxjIFR5cGUgY2FuIGJlIFxjIGkgZm9yIGludGVnZXIsIFxjIGYgZm9yIGZsb2F0LCBcYyBkIGZvciBkb3VibGUsIFxjIGNmIGZvciBjb21wbGV4IGZsb2F0LCBcYyBjZAorICAqIGZvciBjb21wbGV4IGRvdWJsZS4KKyAgKgorICAqIEZvciBleGFtcGxlLCBcYyBNYXRyaXgzZCBpcyBhIGZpeGVkLXNpemUgM3gzIG1hdHJpeCB0eXBlIG9mIGRvdWJsZXMsIGFuZCBcYyBNYXRyaXhYZiBpcyBhIGR5bmFtaWMtc2l6ZSBtYXRyaXggb2YgZmxvYXRzLgorICAqCisgICogVGhlcmUgYXJlIGFsc28gXGMgVmVjdG9yU2l6ZVR5cGUgYW5kIFxjIFJvd1ZlY3RvclNpemVUeXBlIHdoaWNoIGFyZSBzZWxmLWV4cGxhbmF0b3J5LiBGb3IgZXhhbXBsZSwgXGMgVmVjdG9yNGNmIGlzCisgICogYSBmaXhlZC1zaXplIHZlY3RvciBvZiA0IGNvbXBsZXggZmxvYXRzLgorICAqCisgICogXHNhIGNsYXNzIE1hdHJpeAorICAqLworCisjZGVmaW5lIEVJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgU2l6ZSwgU2l6ZVN1ZmZpeCkgICBcCisvKiogXGluZ3JvdXAgbWF0cml4dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIE1hdHJpeDxUeXBlLCBTaXplLCBTaXplPiBNYXRyaXgjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7ICBcCisvKiogXGluZ3JvdXAgbWF0cml4dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIE1hdHJpeDxUeXBlLCBTaXplLCAxPiAgICBWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7ICBcCisvKiogXGluZ3JvdXAgbWF0cml4dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIE1hdHJpeDxUeXBlLCAxLCBTaXplPiAgICBSb3dWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fTUFLRV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBTaXplKSAgICAgICAgIFwKKy8qKiBcaW5ncm91cCBtYXRyaXh0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgTWF0cml4PFR5cGUsIFNpemUsIER5bmFtaWM+IE1hdHJpeCMjU2l6ZSMjWCMjVHlwZVN1ZmZpeDsgIFwKKy8qKiBcaW5ncm91cCBtYXRyaXh0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgTWF0cml4PFR5cGUsIER5bmFtaWMsIFNpemU+IE1hdHJpeCMjWCMjU2l6ZSMjVHlwZVN1ZmZpeDsKKworI2RlZmluZSBFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhUeXBlLCBUeXBlU3VmZml4KSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDIsIDIpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMywgMykgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCA0LCA0KSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIER5bmFtaWMsIFgpIFwKK0VJR0VOX01BS0VfRklYRURfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMikgXAorRUlHRU5fTUFLRV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAzKSBcCitFSUdFTl9NQUtFX0ZJWEVEX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDQpCisKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKGludCwgICAgICAgICAgICAgICAgICBpKQorRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMoZmxvYXQsICAgICAgICAgICAgICAgIGYpCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhkb3VibGUsICAgICAgICAgICAgICAgZCkKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxmbG9hdD4sICBjZikKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxkb3VibGU+LCBjZCkKKworI3VuZGVmIEVJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTCisjdW5kZWYgRUlHRU5fTUFLRV9UWVBFREVGUworI3VuZGVmIEVJR0VOX01BS0VfRklYRURfVFlQRURFRlMKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTWF0cml4QmFzZS5oIGIvRWlnZW4vc3JjL0NvcmUvTWF0cml4QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDEyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9NYXRyaXhCYXNlLmgKQEAgLTAsMCArMSw1MzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWEJBU0VfSAorI2RlZmluZSBFSUdFTl9NQVRSSVhCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBNYXRyaXhCYXNlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgbWF0cmljZXMsIHZlY3RvcnMsIGFuZCBleHByZXNzaW9ucworICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSB0aGF0IGlzIGluaGVyaXRlZCBieSBhbGwgbWF0cml4LCB2ZWN0b3IsIGFuZCByZWxhdGVkIGV4cHJlc3Npb24KKyAgKiB0eXBlcy4gTW9zdCBvZiB0aGUgRWlnZW4gQVBJIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLCBhbmQgaXRzIGJhc2UgY2xhc3Nlcy4gT3RoZXIgaW1wb3J0YW50CisgICogY2xhc3NlcyBmb3IgdGhlIEVpZ2VuIEFQSSBhcmUgTWF0cml4LCBhbmQgVmVjdG9yd2lzZU9wLgorICAqCisgICogTm90ZSB0aGF0IHNvbWUgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiBvdGhlciBtb2R1bGVzIHN1Y2ggYXMgdGhlIFxyZWYgTFVfTW9kdWxlIExVIG1vZHVsZQorICAqIGZvciBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWF0cml4IGludmVyc2lvbnMuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgaXMgdGhlIGRlcml2ZWQgdHlwZSwgZS5nLiBhIG1hdHJpeCB0eXBlLCBvciBhbiBleHByZXNzaW9uLCBldGMuCisgICoKKyAgKiBXaGVuIHdyaXRpbmcgYSBmdW5jdGlvbiB0YWtpbmcgRWlnZW4gb2JqZWN0cyBhcyBhcmd1bWVudCwgaWYgeW91IHdhbnQgeW91ciBmdW5jdGlvbgorICAqIHRvIHRha2UgYXMgYXJndW1lbnQgYW55IG1hdHJpeCwgdmVjdG9yLCBvciBleHByZXNzaW9uLCBqdXN0IGxldCBpdCB0YWtlIGEKKyAgKiBNYXRyaXhCYXNlIGFyZ3VtZW50LiBBcyBhbiBleGFtcGxlLCBoZXJlIGlzIGEgZnVuY3Rpb24gcHJpbnRGaXJzdFJvdyB3aGljaCwgZ2l2ZW4KKyAgKiBhIG1hdHJpeCwgdmVjdG9yLCBvciBleHByZXNzaW9uIFxhIHgsIHByaW50cyB0aGUgZmlyc3Qgcm93IG9mIFxhIHguCisgICoKKyAgKiBcY29kZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgdm9pZCBwcmludEZpcnN0Um93KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiB4KQorICAgIHsKKyAgICAgIGNvdXQgPDwgeC5yb3coMCkgPDwgZW5kbDsKKyAgICB9CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fTUFUUklYQkFTRV9QTFVHSU4uCisgICoKKyAgKiBcc2EgXGJsYW5rIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4QmFzZQorICA6IHB1YmxpYyBEZW5zZUJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHR5cGVkZWYgTWF0cml4QmFzZSBTdG9yYWdlQmFzZVR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgdHlwZWRlZiBEZW5zZUJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjpSb3dzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpDb2xzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpTaXplQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhSb3dzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhDb2xzQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpNYXhTaXplQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6RmxhZ3M7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OmNvbnN0X2Nhc3RfZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKyAgICB1c2luZyBCYXNlOjpsYXp5QXNzaWduOworICAgIHVzaW5nIEJhc2U6OmV2YWw7CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvci09OworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKj07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IvPTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZSBDb25zdFRyYW5zcG9zZVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpSb3dYcHIgUm93WHByOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29sWHByIENvbFhwcjsKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogdHlwZSBvZiB0aGUgZXF1aXZhbGVudCBzcXVhcmUgbWF0cml4ICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fU0laRV9NQVgoUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWUpPiBTcXVhcmVNYXRyaXhUeXBlOworI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtYWluIGRpYWdvbmFsLCB3aGljaCBpcyBtaW4ocm93cygpLGNvbHMoKSkuCisgICAgICAqIFxzYSByb3dzKCksIGNvbHMoKSwgU2l6ZUF0Q29tcGlsZVRpbWUuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggZGlhZ29uYWxTaXplKCkgY29uc3QgeyByZXR1cm4gKG51bWV4dDo6bWluaSkocm93cygpLGNvbHMoKSk7IH0KKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsIFJlcHJlc2VudHMgYSBtYXRyaXggd2l0aCBhbGwgY29lZmZpY2llbnRzIGVxdWFsIHRvIG9uZSBhbm90aGVyKi8KKyAgICB0eXBlZGVmIEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixQbGFpbk9iamVjdD4gQ29uc3RhbnRSZXR1cm5UeXBlOworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmFkam9pbnQoKSAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8U2NhbGFyPiwgQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBBZGpvaW50UmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIFJldHVybiB0eXBlIG9mIGVpZ2VudmFsdWVzKCkgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCAxLCBDb2xNYWpvcj4gRWlnZW52YWx1ZXNSZXR1cm5UeXBlOworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIGlkZW50aXR5ICovCisgICAgdHlwZWRlZiBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPFNjYWxhcj4sUGxhaW5PYmplY3Q+IElkZW50aXR5UmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiB1bml0IHZlY3RvcnMgKi8KKyAgICB0eXBlZGVmIEJsb2NrPGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPiwgU3F1YXJlTWF0cml4VHlwZT4sCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lPiBCYXNpc1JldHVyblR5cGU7CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNkZWZpbmUgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MgRWlnZW46Ok1hdHJpeEJhc2UKKyNkZWZpbmUgRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhYLFkpCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9Db21tb25Dd2lzZVVuYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9Db21tb25Dd2lzZUJpbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpZmRlZiBFSUdFTl9NQVRSSVhCQVNFX1BMVUdJTgorIyAgICAgaW5jbHVkZSBFSUdFTl9NQVRSSVhCQVNFX1BMVUdJTgorIyAgIGVuZGlmCisjdW5kZWYgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MKKyN1bmRlZiBFSUdFTl9ET0NfVU5BUllfQURET05TCisKKyAgICAvKiogU3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZSBvcGVyYXRvcj0sIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgICAgICAqIGZyb20gZ2VuZXJhdGluZyBhIGRlZmF1bHQgb3BlcmF0b3I9IChpc3N1ZSBoaXQgd2l0aCBnKysgNC4xKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2UmIG90aGVyKTsKKworICAgIC8vIFdlIGNhbm5vdCBpbmhlcml0IGhlcmUgdmlhIEJhc2U6Om9wZXJhdG9yPSBzaW5jZSBpdCBpcyBjYXVzaW5nCisgICAgLy8gdHJvdWJsZSB3aXRoIE1TVkMuCisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyNpZmRlZiBfX0NVREFDQ19fCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZCxMYXp5UHJvZHVjdD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5sYXp5UHJvZHVjdChvdGhlcik7IH0KKyNlbHNlCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZCxMYXp5UHJvZHVjdD4KKyAgICBsYXp5UHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcio9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdm9pZCBhcHBseU9uVGhlTGVmdChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgYXBwbHlPblRoZVJpZ2h0KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbERlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBQcm9kdWN0PERlcml2ZWQsIERpYWdvbmFsRGVyaXZlZCwgTGF6eVByb2R1Y3Q+CisgICAgb3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsQmFzZTxEaWFnb25hbERlcml2ZWQ+ICZkaWFnb25hbCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpTY2FsYXI+OjpSZXR1cm5UeXBlCisgICAgZG90KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgUmVhbFNjYWxhciBzcXVhcmVkTm9ybSgpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIFJlYWxTY2FsYXIgbm9ybSgpIGNvbnN0OworICAgIFJlYWxTY2FsYXIgc3RhYmxlTm9ybSgpIGNvbnN0OworICAgIFJlYWxTY2FsYXIgYmx1ZU5vcm0oKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIGh5cG90Tm9ybSgpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFBsYWluT2JqZWN0IG5vcm1hbGl6ZWQoKSBjb25zdDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBQbGFpbk9iamVjdCBzdGFibGVOb3JtYWxpemVkKCkgY29uc3Q7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBub3JtYWxpemUoKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHN0YWJsZU5vcm1hbGl6ZSgpOworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgQWRqb2ludFJldHVyblR5cGUgYWRqb2ludCgpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgYWRqb2ludEluUGxhY2UoKTsKKworICAgIHR5cGVkZWYgRGlhZ29uYWw8RGVyaXZlZD4gRGlhZ29uYWxSZXR1cm5UeXBlOworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCk7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Q8RGlhZ29uYWw8Y29uc3QgRGVyaXZlZD4gPjo6dHlwZSBDb25zdERpYWdvbmFsUmV0dXJuVHlwZTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIENvbnN0RGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+IHN0cnVjdCBEaWFnb25hbEluZGV4UmV0dXJuVHlwZSB7IHR5cGVkZWYgRGlhZ29uYWw8RGVyaXZlZCxJbmRleD4gVHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+IHN0cnVjdCBDb25zdERpYWdvbmFsSW5kZXhSZXR1cm5UeXBlIHsgdHlwZWRlZiBjb25zdCBEaWFnb25hbDxjb25zdCBEZXJpdmVkLEluZGV4PiBUeXBlOyB9OworCisgICAgdGVtcGxhdGU8aW50IEluZGV4PgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgRGlhZ29uYWxJbmRleFJldHVyblR5cGU8SW5kZXg+OjpUeXBlIGRpYWdvbmFsKCk7CisKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBDb25zdERpYWdvbmFsSW5kZXhSZXR1cm5UeXBlPEluZGV4Pjo6VHlwZSBkaWFnb25hbCgpIGNvbnN0OworCisgICAgdHlwZWRlZiBEaWFnb25hbDxEZXJpdmVkLER5bmFtaWNJbmRleD4gRGlhZ29uYWxEeW5hbWljSW5kZXhSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdDxEaWFnb25hbDxjb25zdCBEZXJpdmVkLER5bmFtaWNJbmRleD4gPjo6dHlwZSBDb25zdERpYWdvbmFsRHluYW1pY0luZGV4UmV0dXJuVHlwZTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGlhZ29uYWxEeW5hbWljSW5kZXhSZXR1cm5UeXBlIGRpYWdvbmFsKEluZGV4IGluZGV4KTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIENvbnN0RGlhZ29uYWxEeW5hbWljSW5kZXhSZXR1cm5UeXBlIGRpYWdvbmFsKEluZGV4IGluZGV4KSBjb25zdDsKKworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPiBzdHJ1Y3QgVHJpYW5ndWxhclZpZXdSZXR1cm5UeXBlIHsgdHlwZWRlZiBUcmlhbmd1bGFyVmlldzxEZXJpdmVkLCBNb2RlPiBUeXBlOyB9OworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPiBzdHJ1Y3QgQ29uc3RUcmlhbmd1bGFyVmlld1JldHVyblR5cGUgeyB0eXBlZGVmIGNvbnN0IFRyaWFuZ3VsYXJWaWV3PGNvbnN0IERlcml2ZWQsIE1vZGU+IFR5cGU7IH07CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgTW9kZT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZTxNb2RlPjo6VHlwZSB0cmlhbmd1bGFyVmlldygpOworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgQ29uc3RUcmlhbmd1bGFyVmlld1JldHVyblR5cGU8TW9kZT46OlR5cGUgdHJpYW5ndWxhclZpZXcoKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPiBzdHJ1Y3QgU2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZSB7IHR5cGVkZWYgU2VsZkFkam9pbnRWaWV3PERlcml2ZWQsIFVwTG8+IFR5cGU7IH07CisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+IHN0cnVjdCBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGUgeyB0eXBlZGVmIGNvbnN0IFNlbGZBZGpvaW50Vmlldzxjb25zdCBEZXJpdmVkLCBVcExvPiBUeXBlOyB9OworCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlIHNlbGZhZGpvaW50VmlldygpOworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgQ29uc3RTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlIHNlbGZhZGpvaW50VmlldygpIGNvbnN0OworCisgICAgY29uc3QgU3BhcnNlVmlldzxEZXJpdmVkPiBzcGFyc2VWaWV3KGNvbnN0IFNjYWxhciYgbV9yZWZlcmVuY2UgPSBTY2FsYXIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsJiBtX2Vwc2lsb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBJZGVudGl0eVJldHVyblR5cGUgSWRlbnRpdHkoKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgSWRlbnRpdHlSZXR1cm5UeXBlIElkZW50aXR5KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBCYXNpc1JldHVyblR5cGUgVW5pdChJbmRleCBzaXplLCBJbmRleCBpKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgQmFzaXNSZXR1cm5UeXBlIFVuaXQoSW5kZXggaSk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IEJhc2lzUmV0dXJuVHlwZSBVbml0WCgpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCBCYXNpc1JldHVyblR5cGUgVW5pdFkoKTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgQmFzaXNSZXR1cm5UeXBlIFVuaXRaKCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0IEJhc2lzUmV0dXJuVHlwZSBVbml0VygpOworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBEaWFnb25hbFdyYXBwZXI8Y29uc3QgRGVyaXZlZD4gYXNEaWFnb25hbCgpIGNvbnN0OworICAgIGNvbnN0IFBlcm11dGF0aW9uV3JhcHBlcjxjb25zdCBEZXJpdmVkPiBhc1Blcm11dGF0aW9uKCkgY29uc3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlcml2ZWQmIHNldElkZW50aXR5KCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZXJpdmVkJiBzZXRJZGVudGl0eShJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKworICAgIGJvb2wgaXNJZGVudGl0eShjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBib29sIGlzRGlhZ29uYWwoY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisKKyAgICBib29sIGlzVXBwZXJUcmlhbmd1bGFyKGNvbnN0IFJlYWxTY2FsYXImIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0OworICAgIGJvb2wgaXNMb3dlclRyaWFuZ3VsYXIoY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgYm9vbCBpc09ydGhvZ29uYWwoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBib29sIGlzVW5pdGFyeShjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIGVhY2ggY29lZmZpY2llbnRzIG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlciBhcmUgYWxsIGV4YWN0bHkgZXF1YWwuCisgICAgICAqIFx3YXJuaW5nIFdoZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQgc2NhbGFyIHZhbHVlcyB5b3UgcHJvYmFibHkgc2hvdWxkIHJhdGhlciB1c2UgYQorICAgICAgKiAgICAgICAgICBmdXp6eSBjb21wYXJpc29uIHN1Y2ggYXMgaXNBcHByb3goKQorICAgICAgKiBcc2EgaXNBcHByb3goKSwgb3BlcmF0b3IhPSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY3dpc2VFcXVhbChvdGhlcikuYWxsKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBwYWlyIG9mIGNvZWZmaWNpZW50cyBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgYXJlIG5vdCBleGFjdGx5IGVxdWFsIHRvIGVhY2ggb3RoZXIuCisgICAgICAqIFx3YXJuaW5nIFdoZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQgc2NhbGFyIHZhbHVlcyB5b3UgcHJvYmFibHkgc2hvdWxkIHJhdGhlciB1c2UgYQorICAgICAgKiAgICAgICAgICBmdXp6eSBjb21wYXJpc29uIHN1Y2ggYXMgaXNBcHByb3goKQorICAgICAgKiBcc2EgaXNBcHByb3goKSwgb3BlcmF0b3I9PSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY3dpc2VOb3RFcXVhbChvdGhlcikuYW55KCk7IH0KKworICAgIE5vQWxpYXM8RGVyaXZlZCxFaWdlbjo6TWF0cml4QmFzZSA+IG5vYWxpYXMoKTsKKworICAgIC8vIFRPRE8gZm9yY2VBbGlnbmVkQWNjZXNzIGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkCisgICAgLy8gTmVlZCB0byBmaW5kIGEgbmljZXIgd29ya2Fyb3VuZC4KKyAgICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZm9yY2VBbGlnbmVkQWNjZXNzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGZvcmNlQWxpZ25lZEFjY2VzcygpIHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorICAgIHRlbXBsYXRlPGJvb2wgRW5hYmxlPiBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZm9yY2VBbGlnbmVkQWNjZXNzSWYoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKyAgICB0ZW1wbGF0ZTxib29sIEVuYWJsZT4gaW5saW5lIERlcml2ZWQmIGZvcmNlQWxpZ25lZEFjY2Vzc0lmKCkgeyByZXR1cm4gZGVyaXZlZCgpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIgdHJhY2UoKSBjb25zdDsKKworICAgIHRlbXBsYXRlPGludCBwPiBFSUdFTl9ERVZJQ0VfRlVOQyBSZWFsU2NhbGFyIGxwTm9ybSgpIGNvbnN0OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4KCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXRyaXgoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgLyoqIFxyZXR1cm5zIGFuIFxsaW5rIEVpZ2VuOjpBcnJheUJhc2UgQXJyYXkgXGVuZGxpbmsgZXhwcmVzc2lvbiBvZiB0aGlzIG1hdHJpeAorICAgICAgKiBcc2EgQXJyYXlCYXNlOjptYXRyaXgoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQXJyYXlXcmFwcGVyPERlcml2ZWQ+IGFycmF5KCkgeyByZXR1cm4gQXJyYXlXcmFwcGVyPERlcml2ZWQ+KGRlcml2ZWQoKSk7IH0KKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBcbGluayBFaWdlbjo6QXJyYXlCYXNlIEFycmF5IFxlbmRsaW5rIGV4cHJlc3Npb24gb2YgdGhpcyBtYXRyaXgKKyAgICAgICogXHNhIEFycmF5QmFzZTo6bWF0cml4KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEFycmF5V3JhcHBlcjxjb25zdCBEZXJpdmVkPiBhcnJheSgpIGNvbnN0IHsgcmV0dXJuIEFycmF5V3JhcHBlcjxjb25zdCBEZXJpdmVkPihkZXJpdmVkKCkpOyB9CisKKy8vLy8vLy8vLy8vIExVIG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgaW5saW5lIGNvbnN0IEZ1bGxQaXZMVTxQbGFpbk9iamVjdD4gZnVsbFBpdkx1KCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IFBhcnRpYWxQaXZMVTxQbGFpbk9iamVjdD4gcGFydGlhbFBpdkx1KCkgY29uc3Q7CisKKyAgICBpbmxpbmUgY29uc3QgUGFydGlhbFBpdkxVPFBsYWluT2JqZWN0PiBsdSgpIGNvbnN0OworCisgICAgaW5saW5lIGNvbnN0IEludmVyc2U8RGVyaXZlZD4gaW52ZXJzZSgpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICBpbmxpbmUgdm9pZCBjb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjaygKKyAgICAgIFJlc3VsdFR5cGUmIGludmVyc2UsCisgICAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgICAgYm9vbCYgaW52ZXJ0aWJsZSwKKyAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpCisgICAgKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGlubGluZSB2b2lkIGNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKAorICAgICAgUmVzdWx0VHlwZSYgaW52ZXJzZSwKKyAgICAgIGJvb2wmIGludmVydGlibGUsCisgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKQorICAgICkgY29uc3Q7CisgICAgU2NhbGFyIGRldGVybWluYW50KCkgY29uc3Q7CisKKy8vLy8vLy8vLy8vIENob2xlc2t5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgaW5saW5lIGNvbnN0IExMVDxQbGFpbk9iamVjdD4gIGxsdCgpIGNvbnN0OworICAgIGlubGluZSBjb25zdCBMRExUPFBsYWluT2JqZWN0PiBsZGx0KCkgY29uc3Q7CisKKy8vLy8vLy8vLy8vIFFSIG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgaW5saW5lIGNvbnN0IEhvdXNlaG9sZGVyUVI8UGxhaW5PYmplY3Q+IGhvdXNlaG9sZGVyUXIoKSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgQ29sUGl2SG91c2Vob2xkZXJRUjxQbGFpbk9iamVjdD4gY29sUGl2SG91c2Vob2xkZXJRcigpIGNvbnN0OworICAgIGlubGluZSBjb25zdCBGdWxsUGl2SG91c2Vob2xkZXJRUjxQbGFpbk9iamVjdD4gZnVsbFBpdkhvdXNlaG9sZGVyUXIoKSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxQbGFpbk9iamVjdD4gY29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbigpIGNvbnN0OworCisvLy8vLy8vLy8vLyBFaWdlbnZhbHVlcyBtb2R1bGUgLy8vLy8vLy8vLy8KKworICAgIGlubGluZSBFaWdlbnZhbHVlc1JldHVyblR5cGUgZWlnZW52YWx1ZXMoKSBjb25zdDsKKyAgICBpbmxpbmUgUmVhbFNjYWxhciBvcGVyYXRvck5vcm0oKSBjb25zdDsKKworLy8vLy8vLy8vLy8gU1ZEIG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgaW5saW5lIEphY29iaVNWRDxQbGFpbk9iamVjdD4gamFjb2JpU3ZkKHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMgPSAwKSBjb25zdDsKKyAgICBpbmxpbmUgQkRDU1ZEPFBsYWluT2JqZWN0PiAgICBiZGNTdmQodW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyA9IDApIGNvbnN0OworCisvLy8vLy8vLy8vLyBHZW9tZXRyeSBtb2R1bGUgLy8vLy8vLy8vLy8KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvLy8gXGludGVybmFsIGhlbHBlciBzdHJ1Y3QgdG8gZm9ybSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGNyb3NzIHByb2R1Y3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHN0cnVjdCBjcm9zc19wcm9kdWN0X3JldHVybl90eXBlIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6U2NhbGFyPjo6UmV0dXJuVHlwZSBTY2FsYXI7CisgICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsTWF0cml4QmFzZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4QmFzZTo6Q29sc0F0Q29tcGlsZVRpbWU+IHR5cGU7CisgICAgfTsKKyAgICAjZW5kaWYgLy8gRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICBpbmxpbmUgdHlwZW5hbWUgY3Jvc3NfcHJvZHVjdF9yZXR1cm5fdHlwZTxPdGhlckRlcml2ZWQ+Ojp0eXBlCisjZWxzZQorICAgIGlubGluZSBQbGFpbk9iamVjdAorI2VuZGlmCisgICAgY3Jvc3MoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgUGxhaW5PYmplY3QgY3Jvc3MzKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgUGxhaW5PYmplY3QgdW5pdE9ydGhvZ29uYWwodm9pZCkgY29uc3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBNYXRyaXg8U2NhbGFyLDMsMT4gZXVsZXJBbmdsZXMoSW5kZXggYTAsIEluZGV4IGExLCBJbmRleCBhMikgY29uc3Q7CisKKyAgICAvLyBwdXQgdGhpcyBhcyBzZXBhcmF0ZSBlbnVtIHZhbHVlIHRvIHdvcmsgYXJvdW5kIHBvc3NpYmxlIEdDQyA0LjMgYnVnICg/KQorICAgIGVudW0geyBIb21vZ2VuZW91c1JldHVyblR5cGVEaXJlY3Rpb24gPSBDb2xzQXRDb21waWxlVGltZT09MSYmUm93c0F0Q29tcGlsZVRpbWU9PTEgPyAoKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQgPyBIb3Jpem9udGFsIDogVmVydGljYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbHNBdENvbXBpbGVUaW1lPT0xID8gVmVydGljYWwgOiBIb3Jpem9udGFsIH07CisgICAgdHlwZWRlZiBIb21vZ2VuZW91czxEZXJpdmVkLCBIb21vZ2VuZW91c1JldHVyblR5cGVEaXJlY3Rpb24+IEhvbW9nZW5lb3VzUmV0dXJuVHlwZTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBIb21vZ2VuZW91c1JldHVyblR5cGUgaG9tb2dlbmVvdXMoKSBjb25zdDsKKworICAgIGVudW0geworICAgICAgU2l6ZU1pbnVzT25lID0gU2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBEeW5hbWljIDogU2l6ZUF0Q29tcGlsZVRpbWUtMQorICAgIH07CisgICAgdHlwZWRlZiBCbG9jazxjb25zdCBEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWU9PTEgPyBTaXplTWludXNPbmUgOiAxLAorICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWU9PTEgPyAxIDogU2l6ZU1pbnVzT25lPiBDb25zdFN0YXJ0TWludXNPbmU7CisgICAgdHlwZWRlZiBFSUdFTl9FWFBSX0JJTkFSWU9QX1NDQUxBUl9SRVRVUk5fVFlQRShDb25zdFN0YXJ0TWludXNPbmUsU2NhbGFyLHF1b3RpZW50KSBITm9ybWFsaXplZFJldHVyblR5cGU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgSE5vcm1hbGl6ZWRSZXR1cm5UeXBlIGhub3JtYWxpemVkKCkgY29uc3Q7CisKKy8vLy8vLy8vLy8gSG91c2Vob2xkZXIgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICB2b2lkIG1ha2VIb3VzZWhvbGRlckluUGxhY2UoU2NhbGFyJiB0YXUsIFJlYWxTY2FsYXImIGJldGEpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEVzc2VudGlhbFBhcnQ+CisgICAgdm9pZCBtYWtlSG91c2Vob2xkZXIoRXNzZW50aWFsUGFydCYgZXNzZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciYgdGF1LCBSZWFsU2NhbGFyJiBiZXRhKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFc3NlbnRpYWxQYXJ0PgorICAgIHZvaWQgYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChjb25zdCBFc3NlbnRpYWxQYXJ0JiBlc3NlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciYgdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIqIHdvcmtzcGFjZSk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRXNzZW50aWFsUGFydD4KKyAgICB2b2lkIGFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGNvbnN0IEVzc2VudGlhbFBhcnQmIGVzc2VudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciYgdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyKiB3b3Jrc3BhY2UpOworCisvLy8vLy8vLy8gSmFjb2JpIG1vZHVsZSAvLy8vLy8vLy8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyPgorICAgIHZvaWQgYXBwbHlPblRoZUxlZnQoSW5kZXggcCwgSW5kZXggcSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4KKyAgICB2b2lkIGFwcGx5T25UaGVSaWdodChJbmRleCBwLCBJbmRleCBxLCBjb25zdCBKYWNvYmlSb3RhdGlvbjxPdGhlclNjYWxhcj4mIGopOworCisvLy8vLy8vLy8gU3BhcnNlQ29yZSBtb2R1bGUgLy8vLy8vLy8vCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD46OnRlbXBsYXRlIEN3aXNlUHJvZHVjdERlbnNlUmV0dXJuVHlwZTxEZXJpdmVkPjo6VHlwZQorICAgIGN3aXNlUHJvZHVjdChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBvdGhlci5jd2lzZVByb2R1Y3QoZGVyaXZlZCgpKTsKKyAgICB9CisKKy8vLy8vLy8vLyBNYXRyaXhGdW5jdGlvbnMgbW9kdWxlIC8vLy8vLy8vLworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjxTY2FsYXI+Ojp0eXBlIFN0ZW1GdW5jdGlvbjsKKyAgICBjb25zdCBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlPERlcml2ZWQ+IGV4cCgpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gbWF0cml4RnVuY3Rpb24oU3RlbUZ1bmN0aW9uIGYpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gY29zaCgpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gc2luaCgpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gY29zKCkgY29uc3Q7CisgICAgY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBzaW4oKSBjb25zdDsKKyAgICBjb25zdCBNYXRyaXhTcXVhcmVSb290UmV0dXJuVmFsdWU8RGVyaXZlZD4gc3FydCgpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+IGxvZygpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeFBvd2VyUmV0dXJuVmFsdWU8RGVyaXZlZD4gcG93KGNvbnN0IFJlYWxTY2FsYXImIHApIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeENvbXBsZXhQb3dlclJldHVyblZhbHVlPERlcml2ZWQ+IHBvdyhjb25zdCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4mIHApIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBNYXRyaXhCYXNlKCkgOiBCYXNlKCkge30KKworICBwcml2YXRlOgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IE1hdHJpeEJhc2UoaW50KTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBNYXRyaXhCYXNlKGludCxpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgTWF0cml4QmFzZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mKTsKKyAgcHJvdGVjdGVkOgorICAgIC8vIG1peGluZyBhcnJheXMgYW5kIG1hdHJpY2VzIGlzIG5vdCBsZWdhbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgKQorICAgIHtFSUdFTl9TVEFUSUNfQVNTRVJUKHN0ZDo6cHRyZGlmZl90KHNpemVvZih0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcikpPT0tMSxZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTKTsgcmV0dXJuICp0aGlzO30KKyAgICAvLyBtaXhpbmcgYXJyYXlzIGFuZCBtYXRyaWNlcyBpcyBub3QgbGVnYWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mICkKKyAgICB7RUlHRU5fU1RBVElDX0FTU0VSVChzdGQ6OnB0cmRpZmZfdChzaXplb2YodHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIpKT09LTEsWU9VX0NBTk5PVF9NSVhfQVJSQVlTX0FORF9NQVRSSUNFUyk7IHJldHVybiAqdGhpczt9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgbWF0cml4IGJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKiBcYSBvdGhlci4KKyAgKgorICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5vdXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgRGVyaXZlZCYKK01hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBvdGhlci5kZXJpdmVkKCkuYXBwbHlUaGlzT25UaGVSaWdodChkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKiBcYSBvdGhlci4gSXQgaXMgZXF1aXZhbGVudCB0byBNYXRyaXhCYXNlOjpvcGVyYXRvcio9KCkuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5vdXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseU9uVGhlUmlnaHQoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBvdGhlci5kZXJpdmVkKCkuYXBwbHlUaGlzT25UaGVSaWdodChkZXJpdmVkKCkpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGEgb3RoZXIgKiBcYyAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfYXBwbHlPblRoZUxlZnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9hcHBseU9uVGhlTGVmdC5vdXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseU9uVGhlTGVmdChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5hcHBseVRoaXNPblRoZUxlZnQoZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL05lc3RCeVZhbHVlLmggYi9FaWdlbi9zcmMvQ29yZS9OZXN0QnlWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYWRmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9OZXN0QnlWYWx1ZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ORVNUQllWQUxVRV9ICisjZGVmaW5lIEVJR0VOX05FU1RCWVZBTFVFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorc3RydWN0IHRyYWl0czxOZXN0QnlWYWx1ZTxFeHByZXNzaW9uVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8RXhwcmVzc2lvblR5cGU+Cit7fTsKK30KKworLyoqIFxjbGFzcyBOZXN0QnlWYWx1ZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiB3aGljaCBtdXN0IGJlIG5lc3RlZCBieSB2YWx1ZQorICAqCisgICogXHRwYXJhbSBFeHByZXNzaW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9mIHdoaWNoIHdlIGFyZSByZXF1aXJpbmcgbmVzdGluZy1ieS12YWx1ZQorICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6bmVzdEJ5VmFsdWUoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bmVzdEJ5VmFsdWUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIE5lc3RCeVZhbHVlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgTmVzdEJ5VmFsdWU8RXhwcmVzc2lvblR5cGU+ID46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8TmVzdEJ5VmFsdWU+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShOZXN0QnlWYWx1ZSkKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGlubGluZSBOZXN0QnlWYWx1ZShjb25zdCBFeHByZXNzaW9uVHlwZSYgbWF0cml4KSA6IG1fZXhwcmVzc2lvbihtYXRyaXgpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5yb3dzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2xzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ub3V0ZXJTdHJpZGUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5pbm5lclN0cmlkZSgpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2VmZihpbmRleCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihyb3csIGNvbCwgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihpbmRleCwgeCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgb3BlcmF0b3IgY29uc3QgRXhwcmVzc2lvblR5cGUmKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlIG1fZXhwcmVzc2lvbjsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSB0ZW1wb3JhcnkgdmVyc2lvbiBvZiAqdGhpcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgTmVzdEJ5VmFsdWU8RGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6bmVzdEJ5VmFsdWUoKSBjb25zdAoreworICByZXR1cm4gTmVzdEJ5VmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ORVNUQllWQUxVRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Ob0FsaWFzLmggYi9FaWdlbi9zcmMvQ29yZS9Ob0FsaWFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5MDgwMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL05vQWxpYXMuaApAQCAtMCwwICsxLDEwOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05PQUxJQVNfSAorI2RlZmluZSBFSUdFTl9OT0FMSUFTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBOb0FsaWFzCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQc2V1ZG8gZXhwcmVzc2lvbiBwcm92aWRpbmcgYW4gb3BlcmF0b3IgPSBhc3N1bWluZyBubyBhbGlhc2luZworICAqCisgICogXHRwYXJhbSBFeHByZXNzaW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRvIGRvIHRoZSBsYXp5IGFzc2lnbm1lbnQKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHdpdGggc3BlY2lhbCBhc3NpZ25tZW50IG9wZXJhdG9ycworICAqIGFzc3VtaW5nIG5vIGFsaWFzaW5nIGJldHdlZW4gdGhlIHRhcmdldCBleHByZXNzaW9uIGFuZCB0aGUgc291cmNlIGV4cHJlc3Npb24uCisgICogTW9yZSBwcmVjaXNlbHkgaXQgYWxsb2FzIHRvIGJ5cGFzcyB0aGUgRXZhbEJlZm9yZUFzc2lnbkJpdCBmbGFnIG9mIHRoZSBzb3VyY2UgZXhwcmVzc2lvbi4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6bm9hbGlhcygpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpub2FsaWFzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFN0b3JhZ2VCYXNlPgorY2xhc3MgTm9BbGlhcworeworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICAKKyAgICBleHBsaWNpdCBOb0FsaWFzKEV4cHJlc3Npb25UeXBlJiBleHByZXNzaW9uKSA6IG1fZXhwcmVzc2lvbihleHByZXNzaW9uKSB7fQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yPShjb25zdCBTdG9yYWdlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMobV9leHByZXNzaW9uLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKz0oY29uc3QgU3RvcmFnZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKG1fZXhwcmVzc2lvbiwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6YWRkX2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3ItPShjb25zdCBTdG9yYWdlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMobV9leHByZXNzaW9uLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj4oKSk7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRXhwcmVzc2lvblR5cGUmIGV4cHJlc3Npb24oKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBFeHByZXNzaW9uVHlwZSYgbV9leHByZXNzaW9uOworfTsKKworLyoqIFxyZXR1cm5zIGEgcHNldWRvIGV4cHJlc3Npb24gb2YgXGMgKnRoaXMgd2l0aCBhbiBvcGVyYXRvcj0gYXNzdW1pbmcKKyAgKiBubyBhbGlhc2luZyBiZXR3ZWVuIFxjICp0aGlzIGFuZCB0aGUgc291cmNlIGV4cHJlc3Npb24uCisgICoKKyAgKiBNb3JlIHByZWNpc2VseSwgbm9hbGlhcygpIGFsbG93cyB0byBieXBhc3MgdGhlIEV2YWxCZWZvcmVBc3NpZ25CaXQgZmxhZy4KKyAgKiBDdXJyZW50bHksIGV2ZW4gdGhvdWdoIHNldmVyYWwgZXhwcmVzc2lvbnMgbWF5IGFsaWFzLCBvbmx5IHByb2R1Y3QKKyAgKiBleHByZXNzaW9ucyBoYXZlIHRoaXMgZmxhZy4gVGhlcmVmb3JlLCBub2FsaWFzKCkgaXMgb25seSB1c2VmdWxsIHdoZW4KKyAgKiB0aGUgc291cmNlIGV4cHJlc3Npb24gY29udGFpbnMgYSBtYXRyaXggcHJvZHVjdC4KKyAgKgorICAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgd2hlcmUgbm9hbGlhcyBpcyB1c2VmdWxsOgorICAqIFxjb2RlCisgICogRC5ub2FsaWFzKCkgID0gQSAqIEI7CisgICogRC5ub2FsaWFzKCkgKz0gQS50cmFuc3Bvc2UoKSAqIEI7CisgICogRC5ub2FsaWFzKCkgLT0gMiAqIEEgKiBCLmFkam9pbnQoKTsKKyAgKiBcZW5kY29kZQorICAqCisgICogT24gdGhlIG90aGVyIGhhbmQgdGhlIGZvbGxvd2luZyBleGFtcGxlIHdpbGwgbGVhZCB0byBhIFxiIHdyb25nIHJlc3VsdDoKKyAgKiBcY29kZQorICAqIEEubm9hbGlhcygpID0gQSAqIEI7CisgICogXGVuZGNvZGUKKyAgKiBiZWNhdXNlIHRoZSByZXN1bHQgbWF0cml4IEEgaXMgYWxzbyBhbiBvcGVyYW5kIG9mIHRoZSBtYXRyaXggcHJvZHVjdC4gVGhlcmVmb3JlLAorICAqIHRoZXJlIGlzIG5vIGFsdGVybmF0aXZlIHRoYW4gZXZhbHVhdGluZyBBICogQiBpbiBhIHRlbXBvcmFyeSwgdGhhdCBpcyB0aGUgZGVmYXVsdAorICAqIGJlaGF2aW9yIHdoZW4geW91IHdyaXRlOgorICAqIFxjb2RlCisgICogQSA9IEEgKiBCOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBcc2EgY2xhc3MgTm9BbGlhcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK05vQWxpYXM8RGVyaXZlZCxNYXRyaXhCYXNlPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpub2FsaWFzKCkKK3sKKyAgcmV0dXJuIE5vQWxpYXM8RGVyaXZlZCwgRWlnZW46Ok1hdHJpeEJhc2UgPihkZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX05PQUxJQVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTnVtVHJhaXRzLmggYi9FaWdlbi9zcmMvQ29yZS9OdW1UcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY0ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTnVtVHJhaXRzLmgKQEAgLTAsMCArMSwyNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05VTVRSQUlUU19ICisjZGVmaW5lIEVJR0VOX05VTVRSQUlUU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZGlnaXRzMTAoKSwgYmFzZWQgb24gbnVtZXJpY19saW1pdHMgaWYgc3BlY2lhbGl6ZWQsCisvLyAwIGZvciBpbnRlZ2VyIHR5cGVzLCBhbmQgbG9nMTAoZXBzaWxvbigpKSBvdGhlcndpc2UuCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwKKyAgICAgICAgICBib29sIHVzZV9udW1lcmljX2xpbWl0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NwZWNpYWxpemVkLAorICAgICAgICAgIGJvb2wgaXNfaW50ZWdlciA9IE51bVRyYWl0czxUPjo6SXNJbnRlZ2VyPgorc3RydWN0IGRlZmF1bHRfZGlnaXRzMTBfaW1wbAoreworICBzdGF0aWMgaW50IHJ1bigpIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGRlZmF1bHRfZGlnaXRzMTBfaW1wbDxULGZhbHNlLGZhbHNlPiAvLyBGbG9hdGluZyBwb2ludAoreworICBzdGF0aWMgaW50IHJ1bigpIHsKKyAgICB1c2luZyBzdGQ6OmxvZzEwOworICAgIHVzaW5nIHN0ZDo6Y2VpbDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBSZWFsOworICAgIHJldHVybiBpbnQoY2VpbCgtbG9nMTAoTnVtVHJhaXRzPFJlYWw+OjplcHNpbG9uKCkpKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZGVmYXVsdF9kaWdpdHMxMF9pbXBsPFQsZmFsc2UsdHJ1ZT4gLy8gSW50ZWdlcgoreworICBzdGF0aWMgaW50IHJ1bigpIHsgcmV0dXJuIDA7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGNsYXNzIE51bVRyYWl0cworICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhcmlvdXMgbnVtZXJpYyAoaS5lLiBzY2FsYXIpIHR5cGVzIGFsbG93ZWQgYnkgRWlnZW4uCisgICoKKyAgKiBcdHBhcmFtIFQgdGhlIG51bWVyaWMgdHlwZSBhdCBoYW5kCisgICoKKyAgKiBUaGlzIGNsYXNzIHN0b3JlcyBlbnVtcywgdHlwZWRlZnMgYW5kIHN0YXRpYyBtZXRob2RzIGdpdmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIG51bWVyaWMgdHlwZS4KKyAgKgorICAqIFRoZSBwcm92aWRlZCBkYXRhIGNvbnNpc3RzIG9mOgorICAqIFxsaSBBIHR5cGVkZWYgXGMgUmVhbCwgZ2l2aW5nIHRoZSAicmVhbCBwYXJ0IiB0eXBlIG9mIFxhIFQuIElmIFxhIFQgaXMgYWxyZWFkeSByZWFsLAorICAqICAgICB0aGVuIFxjIFJlYWwgaXMganVzdCBhIHR5cGVkZWYgdG8gXGEgVC4gSWYgXGEgVCBpcyBcYyBzdGQ6OmNvbXBsZXg8VT4gdGhlbiBcYyBSZWFsCisgICogICAgIGlzIGEgdHlwZWRlZiB0byBcYSBVLgorICAqIFxsaSBBIHR5cGVkZWYgXGMgTm9uSW50ZWdlciwgZ2l2aW5nIHRoZSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIG9wZXJhdGlvbnMgcHJvZHVjaW5nIG5vbi1pbnRlZ3JhbCB2YWx1ZXMsCisgICogICAgIHN1Y2ggYXMgcXVvdGllbnRzLCBzcXVhcmUgcm9vdHMsIGV0Yy4gSWYgXGEgVCBpcyBhIGZsb2F0aW5nLXBvaW50IHR5cGUsIHRoZW4gdGhpcyB0eXBlZGVmIGp1c3QgZ2l2ZXMKKyAgKiAgICAgXGEgVCBhZ2Fpbi4gTm90ZSBob3dldmVyIHRoYXQgbWFueSBFaWdlbiBmdW5jdGlvbnMgc3VjaCBhcyBpbnRlcm5hbDo6c3FydCBzaW1wbHkgcmVmdXNlIHRvCisgICogICAgIHRha2UgaW50ZWdlcnMuIE91dHNpZGUgb2YgYSBmZXcgY2FzZXMsIEVpZ2VuIGRvZXNuJ3QgZG8gYXV0b21hdGljIHR5cGUgcHJvbW90aW9uLiBUaHVzLCB0aGlzIHR5cGVkZWYgaXMKKyAgKiAgICAgb25seSBpbnRlbmRlZCBhcyBhIGhlbHBlciBmb3IgY29kZSB0aGF0IG5lZWRzIHRvIGV4cGxpY2l0bHkgcHJvbW90ZSB0eXBlcy4KKyAgKiBcbGkgQSB0eXBlZGVmIFxjIExpdGVyYWwgZ2l2aW5nIHRoZSB0eXBlIHRvIHVzZSBmb3IgbnVtZXJpYyBsaXRlcmFscyBzdWNoIGFzICIyIiBvciAiMC41Ii4gRm9yIGluc3RhbmNlLCBmb3IgXGMgc3RkOjpjb21wbGV4PFU+LCBMaXRlcmFsIGlzIGRlZmluZWQgYXMgXGMgVS4KKyAgKiAgICAgT2YgY291cnNlLCB0aGlzIHR5cGUgbXVzdCBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggXGEgVC4gSW4gZG91YnQsIGp1c3QgdXNlIFxhIFQgaGVyZS4KKyAgKiBcbGkgQSB0eXBlZGVmIFxhIE5lc3RlZCBnaXZpbmcgdGhlIHR5cGUgdG8gdXNlIHRvIG5lc3QgYSB2YWx1ZSBpbnNpZGUgb2YgdGhlIGV4cHJlc3Npb24gdHJlZS4gSWYgeW91IGRvbid0IGtub3cgd2hhdAorICAqICAgICB0aGlzIG1lYW5zLCBqdXN0IHVzZSBcYSBUIGhlcmUuCisgICogXGxpIEFuIGVudW0gdmFsdWUgXGEgSXNDb21wbGV4LiBJdCBpcyBlcXVhbCB0byAxIGlmIFxhIFQgaXMgYSBcYyBzdGQ6OmNvbXBsZXgKKyAgKiAgICAgdHlwZSwgYW5kIHRvIDAgb3RoZXJ3aXNlLgorICAqIFxsaSBBbiBlbnVtIHZhbHVlIFxhIElzSW50ZWdlci4gSXQgaXMgZXF1YWwgdG8gXGMgMSBpZiBcYSBUIGlzIGFuIGludGVnZXIgdHlwZSBzdWNoIGFzIFxjIGludCwKKyAgKiAgICAgYW5kIHRvIFxjIDAgb3RoZXJ3aXNlLgorICAqIFxsaSBFbnVtIHZhbHVlcyBSZWFkQ29zdCwgQWRkQ29zdCBhbmQgTXVsQ29zdCByZXByZXNlbnRpbmcgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIENQVSBjeWNsZXMgbmVlZGVkCisgICogICAgIHRvIGJ5IG1vdmUgLyBhZGQgLyBtdWwgaW5zdHJ1Y3Rpb25zIHJlc3BlY3RpdmVseSwgYXNzdW1pbmcgdGhlIGRhdGEgaXMgYWxyZWFkeSBzdG9yZWQgaW4gQ1BVIHJlZ2lzdGVycy4KKyAgKiAgICAgU3RheSB2YWd1ZSBoZXJlLiBObyBuZWVkIHRvIGRvIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzdHVmZi4KKyAgKiBcbGkgQW4gZW51bSB2YWx1ZSBcYSBJc1NpZ25lZC4gSXQgaXMgZXF1YWwgdG8gXGMgMSBpZiBcYSBUIGlzIGEgc2lnbmVkIHR5cGUgYW5kIHRvIDAgaWYgXGEgVCBpcyB1bnNpZ25lZC4KKyAgKiBcbGkgQW4gZW51bSB2YWx1ZSBcYSBSZXF1aXJlSW5pdGlhbGl6YXRpb24uIEl0IGlzIGVxdWFsIHRvIFxjIDEgaWYgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBudW1lcmljIHR5cGUgXGEgVCBtdXN0CisgICogICAgIGJlIGNhbGxlZCwgYW5kIHRvIDAgaWYgaXQgaXMgc2FmZSBub3QgdG8gY2FsbCBpdC4gRGVmYXVsdCBpcyAwIGlmIFxhIFQgaXMgYW4gYXJpdGhtZXRpYyB0eXBlLCBhbmQgMSBvdGhlcndpc2UuCisgICogXGxpIEFuIGVwc2lsb24oKSBmdW5jdGlvbiB3aGljaCwgdW5saWtlIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3R5cGVzL251bWVyaWNfbGltaXRzL2Vwc2lsb24iPnN0ZDo6bnVtZXJpY19saW1pdHM6OmVwc2lsb24oKTwvYT4sCisgICogICAgIGl0IHJldHVybnMgYSBcYSBSZWFsIGluc3RlYWQgb2YgYSBcYSBULgorICAqIFxsaSBBIGR1bW15X3ByZWNpc2lvbigpIGZ1bmN0aW9uIHJldHVybmluZyBhIHdlYWsgZXBzaWxvbiB2YWx1ZS4gSXQgaXMgbWFpbmx5IHVzZWQgYXMgYSBkZWZhdWx0CisgICogICAgIHZhbHVlIGJ5IHRoZSBmdXp6eSBjb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgKiBcbGkgaGlnaGVzdCgpIGFuZCBsb3dlc3QoKSBmdW5jdGlvbnMgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgcG9zc2libGUgdmFsdWVzIHJlc3BlY3RpdmVseS4KKyAgKiBcbGkgZGlnaXRzMTAoKSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCB3aXRob3V0IGNoYW5nZS4gVGhpcyBpcworICAqICAgICB0aGUgYW5hbG9ndWUgb2YgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvdHlwZXMvbnVtZXJpY19saW1pdHMvZGlnaXRzMTAiPnN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwPC9hPgorICAqICAgICB3aGljaCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlmIHNwZWNpYWxpemVkLgorICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgR2VuZXJpY051bVRyYWl0cworeworICBlbnVtIHsKKyAgICBJc0ludGVnZXIgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyLAorICAgIElzU2lnbmVkID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAorICAgIElzQ29tcGxleCA9IDAsCisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gaW50ZXJuYWw6OmlzX2FyaXRobWV0aWM8VD46OnZhbHVlID8gMCA6IDEsCisgICAgUmVhZENvc3QgPSAxLAorICAgIEFkZENvc3QgPSAxLAorICAgIE11bENvc3QgPSAxCisgIH07CisKKyAgdHlwZWRlZiBUIFJlYWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgSXNJbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPHNpemVvZihUKTw9MiwgZmxvYXQsIGRvdWJsZT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICBUCisgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBOb25JbnRlZ2VyOworICB0eXBlZGVmIFQgTmVzdGVkOworICB0eXBlZGVmIFQgTGl0ZXJhbDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWwgZXBzaWxvbigpCisgIHsKKyAgICByZXR1cm4gbnVtZXh0OjpudW1lcmljX2xpbWl0czxUPjo6ZXBzaWxvbigpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBpbnQgZGlnaXRzMTAoKQorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpkZWZhdWx0X2RpZ2l0czEwX2ltcGw8VD46OnJ1bigpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsIGR1bW15X3ByZWNpc2lvbigpCisgIHsKKyAgICAvLyBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUgdGhpcyBmb3IgZmxvYXRpbmctcG9pbnQgdHlwZXMKKyAgICByZXR1cm4gUmVhbCgwKTsKKyAgfQorCisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBUIGhpZ2hlc3QoKSB7CisgICAgcmV0dXJuIChudW1leHQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgpKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFQgbG93ZXN0KCkgIHsKKyAgICByZXR1cm4gSXNJbnRlZ2VyID8gKG51bWV4dDo6bnVtZXJpY19saW1pdHM8VD46Om1pbikoKSA6ICgtKG51bWV4dDo6bnVtZXJpY19saW1pdHM8VD46Om1heCkoKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFQgaW5maW5pdHkoKSB7CisgICAgcmV0dXJuIG51bWV4dDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFQgcXVpZXRfTmFOKCkgeworICAgIHJldHVybiBudW1leHQ6Om51bWVyaWNfbGltaXRzPFQ+OjpxdWlldF9OYU4oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IE51bVRyYWl0cyA6IEdlbmVyaWNOdW1UcmFpdHM8VD4KK3t9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8ZmxvYXQ+CisgIDogR2VuZXJpY051bVRyYWl0czxmbG9hdD4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBmbG9hdCBkdW1teV9wcmVjaXNpb24oKSB7IHJldHVybiAxZS01ZjsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPGRvdWJsZT4gOiBHZW5lcmljTnVtVHJhaXRzPGRvdWJsZT4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBkb3VibGUgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gMWUtMTI7IH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IE51bVRyYWl0czxsb25nIGRvdWJsZT4KKyAgOiBHZW5lcmljTnVtVHJhaXRzPGxvbmcgZG91YmxlPgoreworICBzdGF0aWMgaW5saW5lIGxvbmcgZG91YmxlIGR1bW15X3ByZWNpc2lvbigpIHsgcmV0dXJuIDFlLTE1bDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1JlYWw+IHN0cnVjdCBOdW1UcmFpdHM8c3RkOjpjb21wbGV4PF9SZWFsPiA+CisgIDogR2VuZXJpY051bVRyYWl0czxzdGQ6OmNvbXBsZXg8X1JlYWw+ID4KK3sKKyAgdHlwZWRlZiBfUmVhbCBSZWFsOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxfUmVhbD46OkxpdGVyYWwgTGl0ZXJhbDsKKyAgZW51bSB7CisgICAgSXNDb21wbGV4ID0gMSwKKyAgICBSZXF1aXJlSW5pdGlhbGl6YXRpb24gPSBOdW1UcmFpdHM8X1JlYWw+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24sCisgICAgUmVhZENvc3QgPSAyICogTnVtVHJhaXRzPF9SZWFsPjo6UmVhZENvc3QsCisgICAgQWRkQ29zdCA9IDIgKiBOdW1UcmFpdHM8UmVhbD46OkFkZENvc3QsCisgICAgTXVsQ29zdCA9IDQgKiBOdW1UcmFpdHM8UmVhbD46Ok11bENvc3QgKyAyICogTnVtVHJhaXRzPFJlYWw+OjpBZGRDb3N0CisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsIGVwc2lsb24oKSB7IHJldHVybiBOdW1UcmFpdHM8UmVhbD46OmVwc2lsb24oKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gTnVtVHJhaXRzPFJlYWw+OjpkdW1teV9wcmVjaXNpb24oKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGludCBkaWdpdHMxMCgpIHsgcmV0dXJuIE51bVRyYWl0czxSZWFsPjo6ZGlnaXRzMTAoKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHMsIGludCBPcHRpb25zLCBpbnQgTWF4Um93cywgaW50IE1heENvbHM+CitzdHJ1Y3QgTnVtVHJhaXRzPEFycmF5PFNjYWxhciwgUm93cywgQ29scywgT3B0aW9ucywgTWF4Um93cywgTWF4Q29scz4gPgoreworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgUm93cywgQ29scywgT3B0aW9ucywgTWF4Um93cywgTWF4Q29scz4gQXJyYXlUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgQXJyYXk8UmVhbFNjYWxhciwgUm93cywgQ29scywgT3B0aW9ucywgTWF4Um93cywgTWF4Q29scz4gUmVhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6Tm9uSW50ZWdlciBOb25JbnRlZ2VyU2NhbGFyOworICB0eXBlZGVmIEFycmF5PE5vbkludGVnZXJTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+IE5vbkludGVnZXI7CisgIHR5cGVkZWYgQXJyYXlUeXBlICYgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpMaXRlcmFsIExpdGVyYWw7CisKKyAgZW51bSB7CisgICAgSXNDb21wbGV4ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICBJc0ludGVnZXIgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLAorICAgIElzU2lnbmVkICA9IE51bVRyYWl0czxTY2FsYXI+OjpJc1NpZ25lZCwKKyAgICBSZXF1aXJlSW5pdGlhbGl6YXRpb24gPSAxLAorICAgIFJlYWRDb3N0ID0gQXJyYXlUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYyA/IEh1Z2VDb3N0IDogQXJyYXlUeXBlOjpTaXplQXRDb21waWxlVGltZSAqIE51bVRyYWl0czxTY2FsYXI+OjpSZWFkQ29zdCwKKyAgICBBZGRDb3N0ICA9IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBIdWdlQ29zdCA6IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBNdWxDb3N0ICA9IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBIdWdlQ29zdCA6IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdAorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciBlcHNpbG9uKCkgeyByZXR1cm4gTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIGR1bW15X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KKworICBzdGF0aWMgaW5saW5lIGludCBkaWdpdHMxMCgpIHsgcmV0dXJuIE51bVRyYWl0czxTY2FsYXI+OjpkaWdpdHMxMCgpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8c3RkOjpzdHJpbmc+CisgIDogR2VuZXJpY051bVRyYWl0czxzdGQ6OnN0cmluZz4KK3sKKyAgZW51bSB7CisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gMSwKKyAgICBSZWFkQ29zdCA9IEh1Z2VDb3N0LAorICAgIEFkZENvc3QgID0gSHVnZUNvc3QsCisgICAgTXVsQ29zdCAgPSBIdWdlQ29zdAorICB9OworCisgIHN0YXRpYyBpbmxpbmUgaW50IGRpZ2l0czEwKCkgeyByZXR1cm4gMDsgfQorCitwcml2YXRlOgorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIGVwc2lsb24oKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBkdW1teV9wcmVjaXNpb24oKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBsb3dlc3QoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBoaWdoZXN0KCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgaW5maW5pdHkoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBxdWlldF9OYU4oKTsKK307CisKKy8vIEVtcHR5IHNwZWNpYWxpemF0aW9uIGZvciB2b2lkIHRvIGFsbG93IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGJhc2VkIG9uIE51bVRyYWl0czxUPjo6UmVhbCB3aXRoIFQ9PXZvaWQgYW5kIFNGSU5BRS4KK3RlbXBsYXRlPD4gc3RydWN0IE51bVRyYWl0czx2b2lkPiB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9OVU1UUkFJVFNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvUGVybXV0YXRpb25NYXRyaXguaCBiL0VpZ2VuL3NyYy9Db3JlL1Blcm11dGF0aW9uTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmYjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1Blcm11dGF0aW9uTWF0cml4LmgKQEAgLTAsMCArMSw2MzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BFUk1VVEFUSU9OTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fUEVSTVVUQVRJT05NQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworZW51bSBQZXJtUGVybVByb2R1Y3RfdCB7UGVybVBlcm1Qcm9kdWN0fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcY2xhc3MgUGVybXV0YXRpb25CYXNlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBwZXJtdXRhdGlvbnMKKyAgKgorICAqIFx0cGFyYW0gRGVyaXZlZCB0aGUgZGVyaXZlZCBjbGFzcworICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGV4cHJlc3Npb25zIHJlcHJlc2VudGluZyBhIHBlcm11dGF0aW9uIG1hdHJpeCwKKyAgKiBpbnRlcm5hbGx5IHN0b3JlZCBhcyBhIHZlY3RvciBvZiBpbnRlZ2Vycy4KKyAgKiBUaGUgY29udmVudGlvbiBmb2xsb3dlZCBoZXJlIGlzIHRoYXQgaWYgXGYkIFxzaWdtYSBcZiQgaXMgYSBwZXJtdXRhdGlvbiwgdGhlIGNvcnJlc3BvbmRpbmcgcGVybXV0YXRpb24gbWF0cml4CisgICogXGYkIFBfXHNpZ21hIFxmJCBpcyBzdWNoIHRoYXQgaWYgXGYkIChlXzEsXGxkb3RzLGVfcCkgXGYkIGlzIHRoZSBjYW5vbmljYWwgYmFzaXMsIHdlIGhhdmU6CisgICogIFxmWyBQX1xzaWdtYShlX2kpID0gZV97XHNpZ21hKGkpfS4gXGZdCisgICogVGhpcyBjb252ZW50aW9uIGVuc3VyZXMgdGhhdCBmb3IgYW55IHR3byBwZXJtdXRhdGlvbnMgXGYkIFxzaWdtYSwgXHRhdSBcZiQsIHdlIGhhdmU6CisgICogIFxmWyBQX3tcc2lnbWFcY2lyY1x0YXV9ID0gUF9cc2lnbWEgUF9cdGF1LiBcZl0KKyAgKgorICAqIFBlcm11dGF0aW9uIG1hdHJpY2VzIGFyZSBzcXVhcmUgYW5kIGludmVydGlibGUuCisgICoKKyAgKiBOb3RpY2UgdGhhdCBpbiBhZGRpdGlvbiB0byB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzIGxpc3RlZCBoZXJlLCB0aGVyZSBhbHNvIGFyZSBub24tbWVtYmVyCisgICogb3BlcmF0b3IqIHRvIG11bHRpcGx5IGFueSBraW5kIG9mIHBlcm11dGF0aW9uIG9iamVjdCB3aXRoIGFueSBraW5kIG9mIG1hdHJpeCBleHByZXNzaW9uIChNYXRyaXhCYXNlKQorICAqIG9uIGVpdGhlciBzaWRlLgorICAqCisgICogXHNhIGNsYXNzIFBlcm11dGF0aW9uTWF0cml4LCBjbGFzcyBQZXJtdXRhdGlvbldyYXBwZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBQZXJtdXRhdGlvbkJhc2UgOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+IFRyYWl0czsKKyAgICB0eXBlZGVmIEVpZ2VuQmFzZTxEZXJpdmVkPiBCYXNlOworICBwdWJsaWM6CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIGVudW0geworICAgICAgRmxhZ3MgPSBUcmFpdHM6OkZsYWdzLAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWUsMCxNYXhSb3dzQXRDb21waWxlVGltZSxNYXhDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgIERlbnNlTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PEluZGljZXNUeXBlOjpTaXplQXRDb21waWxlVGltZSxJbmRpY2VzVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsU3RvcmFnZUluZGV4PgorICAgICAgICAgICAgUGxhaW5QZXJtdXRhdGlvblR5cGU7CisgICAgdHlwZWRlZiBQbGFpblBlcm11dGF0aW9uVHlwZSBQbGFpbk9iamVjdDsKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHR5cGVkZWYgSW52ZXJzZTxEZXJpdmVkPiBJbnZlcnNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHZvaWQgU2NhbGFyOworICAgICNlbmRpZgorCisgICAgLyoqIENvcGllcyB0aGUgb3RoZXIgcGVybXV0YXRpb24gaW50byAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUGVybXV0YXRpb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGluZGljZXMoKSA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIEFzc2lnbm1lbnQgZnJvbSB0aGUgVHJhbnNwb3NpdGlvbnMgXGEgdHIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiB0cikKKyAgICB7CisgICAgICBzZXRJZGVudGl0eSh0ci5zaXplKCkpOworICAgICAgZm9yKEluZGV4IGs9c2l6ZSgpLTE7IGs+PTA7IC0taykKKyAgICAgICAgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChrLHRyLmNvZWZmKGspKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LiBJdHMgcHVycG9zZSBpcyB0bworICAgICAgKiBwcmV2ZW50IGEgZGVmYXVsdCBvcGVyYXRvcj0gZnJvbSBoaWRpbmcgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uCisgICAgICAqLworICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBQZXJtdXRhdGlvbkJhc2UmIG90aGVyKQorICAgIHsKKyAgICAgIGluZGljZXMoKSA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gSW5kZXgoaW5kaWNlcygpLnNpemUoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIEluZGV4KGluZGljZXMoKS5zaXplKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHNpemUgb2YgYSBzaWRlIG9mIHRoZSByZXNwZWN0aXZlIHNxdWFyZSBtYXRyaXgsIGkuZS4sIHRoZSBudW1iZXIgb2YgaW5kaWNlcyAqLworICAgIGlubGluZSBJbmRleCBzaXplKCkgY29uc3QgeyByZXR1cm4gSW5kZXgoaW5kaWNlcygpLnNpemUoKSk7IH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+CisgICAgdm9pZCBldmFsVG8oTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBvdGhlci5zZXRaZXJvKCk7CisgICAgICBmb3IgKEluZGV4IGk9MDsgaTxyb3dzKCk7ICsraSkKKyAgICAgICAgb3RoZXIuY29lZmZSZWYoaW5kaWNlcygpLmNvZWZmKGkpLGkpID0gdHlwZW5hbWUgRGVuc2VEZXJpdmVkOjpTY2FsYXIoMSk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIFxyZXR1cm5zIGEgTWF0cml4IG9iamVjdCBpbml0aWFsaXplZCBmcm9tIHRoaXMgcGVybXV0YXRpb24gbWF0cml4LiBOb3RpY2UgdGhhdCBpdAorICAgICAgKiBpcyBpbmVmZmljaWVudCB0byByZXR1cm4gdGhpcyBNYXRyaXggb2JqZWN0IGJ5IHZhbHVlLiBGb3IgZWZmaWNpZW5jeSwgZmF2b3IgdXNpbmcKKyAgICAgICogdGhlIE1hdHJpeCBjb25zdHJ1Y3RvciB0YWtpbmcgRWlnZW5CYXNlIG9iamVjdHMuCisgICAgICAqLworICAgIERlbnNlTWF0cml4VHlwZSB0b0RlbnNlTWF0cml4KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgIC8qKiBjb25zdCB2ZXJzaW9uIG9mIGluZGljZXMoKS4gKi8KKyAgICBjb25zdCBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5pbmRpY2VzKCk7IH0KKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHBlcm11dGF0aW9uLiAqLworICAgIEluZGljZXNUeXBlJiBpbmRpY2VzKCkgeyByZXR1cm4gZGVyaXZlZCgpLmluZGljZXMoKTsgfQorCisgICAgLyoqIFJlc2l6ZXMgdG8gZ2l2ZW4gc2l6ZS4KKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgcmVzaXplKEluZGV4IG5ld1NpemUpCisgICAgeworICAgICAgaW5kaWNlcygpLnJlc2l6ZShuZXdTaXplKTsKKyAgICB9CisKKyAgICAvKiogU2V0cyAqdGhpcyB0byBiZSB0aGUgaWRlbnRpdHkgcGVybXV0YXRpb24gbWF0cml4ICovCisgICAgdm9pZCBzZXRJZGVudGl0eSgpCisgICAgeworICAgICAgU3RvcmFnZUluZGV4IG4gPSBTdG9yYWdlSW5kZXgoc2l6ZSgpKTsKKyAgICAgIGZvcihTdG9yYWdlSW5kZXggaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIGluZGljZXMoKS5jb2VmZlJlZihpKSA9IGk7CisgICAgfQorCisgICAgLyoqIFNldHMgKnRoaXMgdG8gYmUgdGhlIGlkZW50aXR5IHBlcm11dGF0aW9uIG1hdHJpeCBvZiBnaXZlbiBzaXplLgorICAgICAgKi8KKyAgICB2b2lkIHNldElkZW50aXR5KEluZGV4IG5ld1NpemUpCisgICAgeworICAgICAgcmVzaXplKG5ld1NpemUpOworICAgICAgc2V0SWRlbnRpdHkoKTsKKyAgICB9CisKKyAgICAvKiogTXVsdGlwbGllcyAqdGhpcyBieSB0aGUgdHJhbnNwb3NpdGlvbiBcZiQoaWopXGYkIG9uIHRoZSBsZWZ0LgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byAqdGhpcy4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgVGhpcyBpcyBtdWNoIHNsb3dlciB0aGFuIGFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoSW5kZXgsSW5kZXgpOgorICAgICAgKiB0aGlzIGhhcyBsaW5lYXIgY29tcGxleGl0eSBhbmQgcmVxdWlyZXMgYSBsb3Qgb2YgYnJhbmNoaW5nLgorICAgICAgKgorICAgICAgKiBcc2EgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChJbmRleCxJbmRleCkKKyAgICAgICovCisgICAgRGVyaXZlZCYgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVMZWZ0KEluZGV4IGksIEluZGV4IGopCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGk+PTAgJiYgaj49MCAmJiBpPHNpemUoKSAmJiBqPHNpemUoKSk7CisgICAgICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplKCk7ICsraykKKyAgICAgIHsKKyAgICAgICAgaWYoaW5kaWNlcygpLmNvZWZmKGspID09IGkpIGluZGljZXMoKS5jb2VmZlJlZihrKSA9IFN0b3JhZ2VJbmRleChqKTsKKyAgICAgICAgZWxzZSBpZihpbmRpY2VzKCkuY29lZmYoaykgPT0gaikgaW5kaWNlcygpLmNvZWZmUmVmKGspID0gU3RvcmFnZUluZGV4KGkpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogTXVsdGlwbGllcyAqdGhpcyBieSB0aGUgdHJhbnNwb3NpdGlvbiBcZiQoaWopXGYkIG9uIHRoZSByaWdodC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBmYXN0IG9wZXJhdGlvbiwgaXQgb25seSBjb25zaXN0cyBpbiBzd2FwcGluZyB0d28gaW5kaWNlcy4KKyAgICAgICoKKyAgICAgICogXHNhIGFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlTGVmdChJbmRleCxJbmRleCkKKyAgICAgICovCisgICAgRGVyaXZlZCYgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChJbmRleCBpLCBJbmRleCBqKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpPj0wICYmIGo+PTAgJiYgaTxzaXplKCkgJiYgajxzaXplKCkpOworICAgICAgc3RkOjpzd2FwKGluZGljZXMoKS5jb2VmZlJlZihpKSwgaW5kaWNlcygpLmNvZWZmUmVmKGopKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgXGJsYW5rIFxub3RlX3RyeV90b19oZWxwX3J2bworICAgICAgKi8KKyAgICBpbmxpbmUgSW52ZXJzZVJldHVyblR5cGUgaW52ZXJzZSgpIGNvbnN0CisgICAgeyByZXR1cm4gSW52ZXJzZVJldHVyblR5cGUoZGVyaXZlZCgpKTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgdHJhbnBvc2UgcGVybXV0YXRpb24gbWF0cml4LgorICAgICAgKgorICAgICAgKiBcbm90ZSBcYmxhbmsgXG5vdGVfdHJ5X3RvX2hlbHBfcnZvCisgICAgICAqLworICAgIGlubGluZSBJbnZlcnNlUmV0dXJuVHlwZSB0cmFuc3Bvc2UoKSBjb25zdAorICAgIHsgcmV0dXJuIEludmVyc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworICAgIC8qKioqIG11bHRpcGxpY2F0aW9uIGhlbHBlcnMgdG8gaG9wZWZ1bGx5IGdldCBSVk8gKioqKi8KKworICAKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGFzc2lnblRyYW5zcG9zZShjb25zdCBQZXJtdXRhdGlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgZm9yIChJbmRleCBpPTA7IGk8cm93cygpOysraSkgaW5kaWNlcygpLmNvZWZmUmVmKG90aGVyLmluZGljZXMoKS5jb2VmZihpKSkgPSBpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsdHlwZW5hbWUgUmhzPgorICAgIHZvaWQgYXNzaWduUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGxocy5jb2xzKCkgPT0gcmhzLnJvd3MoKSk7CisgICAgICBmb3IgKEluZGV4IGk9MDsgaTxyb3dzKCk7KytpKSBpbmRpY2VzKCkuY29lZmZSZWYoaSkgPSBsaHMuaW5kaWNlcygpLmNvZWZmKHJocy5pbmRpY2VzKCkuY29lZmYoaSkpOworICAgIH0KKyNlbmRpZgorCisgIHB1YmxpYzoKKworICAgIC8qKiBccmV0dXJucyB0aGUgcHJvZHVjdCBwZXJtdXRhdGlvbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxub3RlIFxibGFuayBcbm90ZV90cnlfdG9faGVscF9ydm8KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgaW5saW5lIFBsYWluUGVybXV0YXRpb25UeXBlIG9wZXJhdG9yKihjb25zdCBQZXJtdXRhdGlvbkJhc2U8T3RoZXI+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBQbGFpblBlcm11dGF0aW9uVHlwZShpbnRlcm5hbDo6UGVybVBlcm1Qcm9kdWN0LCBkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcHJvZHVjdCBvZiBhIHBlcm11dGF0aW9uIHdpdGggYW5vdGhlciBpbnZlcnNlIHBlcm11dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBcYmxhbmsgXG5vdGVfdHJ5X3RvX2hlbHBfcnZvCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIGlubGluZSBQbGFpblBlcm11dGF0aW9uVHlwZSBvcGVyYXRvciooY29uc3QgSW52ZXJzZUltcGw8T3RoZXIsUGVybXV0YXRpb25TdG9yYWdlPiYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gUGxhaW5QZXJtdXRhdGlvblR5cGUoaW50ZXJuYWw6OlBlcm1QZXJtUHJvZHVjdCwgKnRoaXMsIG90aGVyLmV2YWwoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcHJvZHVjdCBvZiBhbiBpbnZlcnNlIHBlcm11dGF0aW9uIHdpdGggYW5vdGhlciBwZXJtdXRhdGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgXGJsYW5rIFxub3RlX3RyeV90b19oZWxwX3J2bworICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gZnJpZW5kCisgICAgaW5saW5lIFBsYWluUGVybXV0YXRpb25UeXBlIG9wZXJhdG9yKihjb25zdCBJbnZlcnNlSW1wbDxPdGhlciwgUGVybXV0YXRpb25TdG9yYWdlPiYgb3RoZXIsIGNvbnN0IFBlcm11dGF0aW9uQmFzZSYgcGVybSkKKyAgICB7IHJldHVybiBQbGFpblBlcm11dGF0aW9uVHlwZShpbnRlcm5hbDo6UGVybVBlcm1Qcm9kdWN0LCBvdGhlci5ldmFsKCksIHBlcm0pOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgcGVybXV0YXRpb24gbWF0cml4LCB3aGljaCBpcyBlaXRoZXIgMSBvciAtMSBkZXBlbmRpbmcgb24gdGhlIHBhcml0eSBvZiB0aGUgcGVybXV0YXRpb24uCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgTyhcYyBuKSBwcm9jZWR1cmUgYWxsb2NhdGluZyBhIGJ1ZmZlciBvZiBcYyBuIGJvb2xlYW5zLgorICAgICAgKi8KKyAgICBJbmRleCBkZXRlcm1pbmFudCgpIGNvbnN0CisgICAgeworICAgICAgSW5kZXggcmVzID0gMTsKKyAgICAgIEluZGV4IG4gPSBzaXplKCk7CisgICAgICBNYXRyaXg8Ym9vbCxSb3dzQXRDb21waWxlVGltZSwxLDAsTWF4Um93c0F0Q29tcGlsZVRpbWU+IG1hc2sobik7CisgICAgICBtYXNrLmZpbGwoZmFsc2UpOworICAgICAgSW5kZXggciA9IDA7CisgICAgICB3aGlsZShyIDwgbikKKyAgICAgIHsKKyAgICAgICAgLy8gc2VhcmNoIGZvciB0aGUgbmV4dCBzZWVkCisgICAgICAgIHdoaWxlKHI8biAmJiBtYXNrW3JdKSByKys7CisgICAgICAgIGlmKHI+PW4pCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIHdlIGdvdCBvbmUsIGxldCdzIGZvbGxvdyBpdCB1bnRpbCB3ZSBhcmUgYmFjayB0byB0aGUgc2VlZAorICAgICAgICBJbmRleCBrMCA9IHIrKzsKKyAgICAgICAgbWFzay5jb2VmZlJlZihrMCkgPSB0cnVlOworICAgICAgICBmb3IoSW5kZXggaz1pbmRpY2VzKCkuY29lZmYoazApOyBrIT1rMDsgaz1pbmRpY2VzKCkuY29lZmYoaykpCisgICAgICAgIHsKKyAgICAgICAgICBtYXNrLmNvZWZmUmVmKGspID0gdHJ1ZTsKKyAgICAgICAgICByZXMgPSAtcmVzOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZSwgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3N0cnVjdCB0cmFpdHM8UGVybXV0YXRpb25NYXRyaXg8U2l6ZUF0Q29tcGlsZVRpbWUsIE1heFNpemVBdENvbXBpbGVUaW1lLCBfU3RvcmFnZUluZGV4PiA+CisgOiB0cmFpdHM8TWF0cml4PF9TdG9yYWdlSW5kZXgsU2l6ZUF0Q29tcGlsZVRpbWUsU2l6ZUF0Q29tcGlsZVRpbWUsMCxNYXhTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZT4gPgoreworICB0eXBlZGVmIFBlcm11dGF0aW9uU3RvcmFnZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBNYXRyaXg8X1N0b3JhZ2VJbmRleCwgU2l6ZUF0Q29tcGlsZVRpbWUsIDEsIDAsIE1heFNpemVBdENvbXBpbGVUaW1lLCAxPiBJbmRpY2VzVHlwZTsKKyAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB2b2lkIFNjYWxhcjsKK307Cit9CisKKy8qKiBcY2xhc3MgUGVybXV0YXRpb25NYXRyaXgKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFBlcm11dGF0aW9uIG1hdHJpeAorICAqCisgICogXHRwYXJhbSBTaXplQXRDb21waWxlVGltZSB0aGUgbnVtYmVyIG9mIHJvd3MvY29scywgb3IgRHluYW1pYworICAqIFx0cGFyYW0gTWF4U2l6ZUF0Q29tcGlsZVRpbWUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MvY29scywgb3IgRHluYW1pYy4gVGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgZGVmYXVsdHMgdG8gU2l6ZUF0Q29tcGlsZVRpbWUuIE1vc3Qgb2YgdGhlIHRpbWUsIHlvdSBzaG91bGQgbm90IGhhdmUgdG8gc3BlY2lmeSBpdC4KKyAgKiBcdHBhcmFtIF9TdG9yYWdlSW5kZXggdGhlIGludGVnZXIgdHlwZSBvZiB0aGUgaW5kaWNlcworICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcGVybXV0YXRpb24gbWF0cml4LCBpbnRlcm5hbGx5IHN0b3JlZCBhcyBhIHZlY3RvciBvZiBpbnRlZ2Vycy4KKyAgKgorICAqIFxzYSBjbGFzcyBQZXJtdXRhdGlvbkJhc2UsIGNsYXNzIFBlcm11dGF0aW9uV3JhcHBlciwgY2xhc3MgRGlhZ29uYWxNYXRyaXgKKyAgKi8KK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorY2xhc3MgUGVybXV0YXRpb25NYXRyaXggOiBwdWJsaWMgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uTWF0cml4PFNpemVBdENvbXBpbGVUaW1lLCBNYXhTaXplQXRDb21waWxlVGltZSwgX1N0b3JhZ2VJbmRleD4gPgoreworICAgIHR5cGVkZWYgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uTWF0cml4PiBCYXNlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxQZXJtdXRhdGlvbk1hdHJpeD4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIGNvbnN0IFBlcm11dGF0aW9uTWF0cml4JiBOZXN0ZWQ7CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgICNlbmRpZgorCisgICAgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KCkKKyAgICB7fQorCisgICAgLyoqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBwZXJtdXRhdGlvbiBtYXRyaXggb2YgZ2l2ZW4gc2l6ZS4KKyAgICAgICovCisgICAgZXhwbGljaXQgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KEluZGV4IHNpemUpIDogbV9pbmRpY2VzKHNpemUpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemUgPD0gTnVtVHJhaXRzPFN0b3JhZ2VJbmRleD46OmhpZ2hlc3QoKSk7CisgICAgfQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBQZXJtdXRhdGlvbk1hdHJpeChjb25zdCBQZXJtdXRhdGlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1faW5kaWNlcyhvdGhlci5pbmRpY2VzKCkpIHt9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFN0YW5kYXJkIGNvcHkgY29uc3RydWN0b3IuIERlZmluZWQgb25seSB0byBwcmV2ZW50IGEgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAqIGZyb20gaGlkaW5nIHRoZSBvdGhlciB0ZW1wbGF0ZWQgY29uc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgUGVybXV0YXRpb25NYXRyaXgoY29uc3QgUGVybXV0YXRpb25NYXRyaXgmIG90aGVyKSA6IG1faW5kaWNlcyhvdGhlci5pbmRpY2VzKCkpIHt9CisgICAgI2VuZGlmCisKKyAgICAvKiogR2VuZXJpYyBjb25zdHJ1Y3RvciBmcm9tIGV4cHJlc3Npb24gb2YgdGhlIGluZGljZXMuIFRoZSBpbmRpY2VzCisgICAgICAqIGFycmF5IGhhcyB0aGUgbWVhbmluZyB0aGF0IHRoZSBwZXJtdXRhdGlvbnMgc2VuZHMgZWFjaCBpbnRlZ2VyIGkgdG8gaW5kaWNlc1tpXS4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBjaGVjayB0aGF0IHRoZSBpbmRpY2VzIGFycmF5IHRoYXQgeW91IHBhc3NlcyBhY3R1YWxseQorICAgICAgKiBkZXNjcmliZXMgYSBwZXJtdXRhdGlvbiwgaS5lLiwgZWFjaCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIG4tMSBvY2N1cnMgZXhhY3RseSBvbmNlLCB3aGVyZSBuIGlzIHRoZQorICAgICAgKiBhcnJheSdzIHNpemUuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIGV4cGxpY2l0IGlubGluZSBQZXJtdXRhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPE90aGVyPiYgaW5kaWNlcykgOiBtX2luZGljZXMoaW5kaWNlcykKKyAgICB7fQorCisgICAgLyoqIENvbnZlcnQgdGhlIFRyYW5zcG9zaXRpb25zIFxhIHRyIHRvIGEgcGVybXV0YXRpb24gbWF0cml4ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgZXhwbGljaXQgUGVybXV0YXRpb25NYXRyaXgoY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPE90aGVyPiYgdHIpCisgICAgICA6IG1faW5kaWNlcyh0ci5zaXplKCkpCisgICAgeworICAgICAgKnRoaXMgPSB0cjsKKyAgICB9CisKKyAgICAvKiogQ29waWVzIHRoZSBvdGhlciBwZXJtdXRhdGlvbiBpbnRvICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgUGVybXV0YXRpb25NYXRyaXgmIG9wZXJhdG9yPShjb25zdCBQZXJtdXRhdGlvbkJhc2U8T3RoZXI+JiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5pbmRpY2VzKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIEFzc2lnbm1lbnQgZnJvbSB0aGUgVHJhbnNwb3NpdGlvbnMgXGEgdHIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBQZXJtdXRhdGlvbk1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlcj4mIHRyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0odHIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgUGVybXV0YXRpb25NYXRyaXgmIG9wZXJhdG9yPShjb25zdCBQZXJtdXRhdGlvbk1hdHJpeCYgb3RoZXIpCisgICAgeworICAgICAgbV9pbmRpY2VzID0gb3RoZXIubV9pbmRpY2VzOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBjb25zdCB2ZXJzaW9uIG9mIGluZGljZXMoKS4gKi8KKyAgICBjb25zdCBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIG1faW5kaWNlczsgfQorICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGVybXV0YXRpb24uICovCisgICAgSW5kaWNlc1R5cGUmIGluZGljZXMoKSB7IHJldHVybiBtX2luZGljZXM7IH0KKworCisgICAgLyoqKiogbXVsdGlwbGljYXRpb24gaGVscGVycyB0byBob3BlZnVsbHkgZ2V0IFJWTyAqKioqLworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgUGVybXV0YXRpb25NYXRyaXgoY29uc3QgSW52ZXJzZUltcGw8T3RoZXIsUGVybXV0YXRpb25TdG9yYWdlPiYgb3RoZXIpCisgICAgICA6IG1faW5kaWNlcyhvdGhlci5kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLnNpemUoKSkKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQobV9pbmRpY2VzLnNpemUoKSA8PSBOdW1UcmFpdHM8U3RvcmFnZUluZGV4Pjo6aGlnaGVzdCgpKTsKKyAgICAgIFN0b3JhZ2VJbmRleCBlbmQgPSBTdG9yYWdlSW5kZXgobV9pbmRpY2VzLnNpemUoKSk7CisgICAgICBmb3IgKFN0b3JhZ2VJbmRleCBpPTA7IGk8ZW5kOysraSkKKyAgICAgICAgbV9pbmRpY2VzLmNvZWZmUmVmKG90aGVyLmRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5kaWNlcygpLmNvZWZmKGkpKSA9IGk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CisgICAgUGVybXV0YXRpb25NYXRyaXgoaW50ZXJuYWw6OlBlcm1QZXJtUHJvZHVjdF90LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgICAgICA6IG1faW5kaWNlcyhsaHMuaW5kaWNlcygpLnNpemUoKSkKKyAgICB7CisgICAgICBCYXNlOjphc3NpZ25Qcm9kdWN0KGxocyxyaHMpOworICAgIH0KKyNlbmRpZgorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4LCBpbnQgX1BhY2tldEFjY2Vzcz4KK3N0cnVjdCB0cmFpdHM8TWFwPFBlcm11dGF0aW9uTWF0cml4PFNpemVBdENvbXBpbGVUaW1lLCBNYXhTaXplQXRDb21waWxlVGltZSwgX1N0b3JhZ2VJbmRleD4sX1BhY2tldEFjY2Vzcz4gPgorIDogdHJhaXRzPE1hdHJpeDxfU3RvcmFnZUluZGV4LFNpemVBdENvbXBpbGVUaW1lLFNpemVBdENvbXBpbGVUaW1lLDAsTWF4U2l6ZUF0Q29tcGlsZVRpbWUsTWF4U2l6ZUF0Q29tcGlsZVRpbWU+ID4KK3sKKyAgdHlwZWRlZiBQZXJtdXRhdGlvblN0b3JhZ2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxfU3RvcmFnZUluZGV4LCBTaXplQXRDb21waWxlVGltZSwgMSwgMCwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIDE+LCBfUGFja2V0QWNjZXNzPiBJbmRpY2VzVHlwZTsKKyAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB2b2lkIFNjYWxhcjsKK307Cit9CisKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4LCBpbnQgX1BhY2tldEFjY2Vzcz4KK2NsYXNzIE1hcDxQZXJtdXRhdGlvbk1hdHJpeDxTaXplQXRDb21waWxlVGltZSwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIF9TdG9yYWdlSW5kZXg+LF9QYWNrZXRBY2Nlc3M+CisgIDogcHVibGljIFBlcm11dGF0aW9uQmFzZTxNYXA8UGVybXV0YXRpb25NYXRyaXg8U2l6ZUF0Q29tcGlsZVRpbWUsIE1heFNpemVBdENvbXBpbGVUaW1lLCBfU3RvcmFnZUluZGV4PixfUGFja2V0QWNjZXNzPiA+Cit7CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbkJhc2U8TWFwPiBCYXNlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxNYXA+IFRyYWl0czsKKyAgcHVibGljOgorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpJbmRpY2VzVHlwZSBJbmRpY2VzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEluZGljZXNUeXBlOjpTY2FsYXIgU3RvcmFnZUluZGV4OworICAgICNlbmRpZgorCisgICAgaW5saW5lIE1hcChjb25zdCBTdG9yYWdlSW5kZXgqIGluZGljZXNQdHIpCisgICAgICA6IG1faW5kaWNlcyhpbmRpY2VzUHRyKQorICAgIHt9CisKKyAgICBpbmxpbmUgTWFwKGNvbnN0IFN0b3JhZ2VJbmRleCogaW5kaWNlc1B0ciwgSW5kZXggc2l6ZSkKKyAgICAgIDogbV9pbmRpY2VzKGluZGljZXNQdHIsc2l6ZSkKKyAgICB7fQorCisgICAgLyoqIENvcGllcyB0aGUgb3RoZXIgcGVybXV0YXRpb24gaW50byAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIE1hcCYgb3BlcmF0b3I9KGNvbnN0IFBlcm11dGF0aW9uQmFzZTxPdGhlcj4mIG90aGVyKQorICAgIHsgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOyB9CisKKyAgICAvKiogQXNzaWdubWVudCBmcm9tIHRoZSBUcmFuc3Bvc2l0aW9ucyBcYSB0ciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIE1hcCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlcj4mIHRyKQorICAgIHsgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPSh0ci5kZXJpdmVkKCkpOyB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgTWFwJiBvcGVyYXRvcj0oY29uc3QgTWFwJiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5tX2luZGljZXM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBwZXJtdXRhdGlvbi4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9JbmRpY2VzVHlwZT4gY2xhc3MgVHJhbnNwb3NpdGlvbnNXcmFwcGVyOworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9JbmRpY2VzVHlwZT4KK3N0cnVjdCB0cmFpdHM8UGVybXV0YXRpb25XcmFwcGVyPF9JbmRpY2VzVHlwZT4gPgoreworICB0eXBlZGVmIFBlcm11dGF0aW9uU3RvcmFnZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB2b2lkIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSW5kaWNlc1R5cGU6OlNjYWxhciBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgX0luZGljZXNUeXBlIEluZGljZXNUeXBlOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IF9JbmRpY2VzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBfSW5kaWNlc1R5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gSW5kaWNlc1R5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gSW5kaWNlc1R5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gMAorICB9OworfTsKK30KKworLyoqIFxjbGFzcyBQZXJtdXRhdGlvbldyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIENsYXNzIHRvIHZpZXcgYSB2ZWN0b3Igb2YgaW50ZWdlcnMgYXMgYSBwZXJtdXRhdGlvbiBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX0luZGljZXNUeXBlIHRoZSB0eXBlIG9mIHRoZSB2ZWN0b3Igb2YgaW50ZWdlciAoY2FuIGJlIGFueSBjb21wYXRpYmxlIGV4cHJlc3Npb24pCisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byB2aWV3IGFueSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiBpbnRlZ2VycyBhcyBhIHBlcm11dGF0aW9uIG1hdHJpeC4KKyAgKgorICAqIFxzYSBjbGFzcyBQZXJtdXRhdGlvbkJhc2UsIGNsYXNzIFBlcm11dGF0aW9uTWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5kaWNlc1R5cGU+CitjbGFzcyBQZXJtdXRhdGlvbldyYXBwZXIgOiBwdWJsaWMgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uV3JhcHBlcjxfSW5kaWNlc1R5cGU+ID4KK3sKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uQmFzZTxQZXJtdXRhdGlvbldyYXBwZXI+IEJhc2U7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFBlcm11dGF0aW9uV3JhcHBlcj4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgICNlbmRpZgorCisgICAgaW5saW5lIFBlcm11dGF0aW9uV3JhcHBlcihjb25zdCBJbmRpY2VzVHlwZSYgaW5kaWNlcykKKyAgICAgIDogbV9pbmRpY2VzKGluZGljZXMpCisgICAge30KKworICAgIC8qKiBjb25zdCB2ZXJzaW9uIG9mIGluZGljZXMoKS4gKi8KKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBJbmRpY2VzVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZW5hbWUgSW5kaWNlc1R5cGU6Ok5lc3RlZCBtX2luZGljZXM7Cit9OworCisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIGNvbHVtbnMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhEZXJpdmVkLCB0eXBlbmFtZSBQZXJtdXRhdGlvbkRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworY29uc3QgUHJvZHVjdDxNYXRyaXhEZXJpdmVkLCBQZXJtdXRhdGlvbkRlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CitvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxNYXRyaXhEZXJpdmVkPiAmbWF0cml4LAorICAgICAgICAgIGNvbnN0IFBlcm11dGF0aW9uQmFzZTxQZXJtdXRhdGlvbkRlcml2ZWQ+JiBwZXJtdXRhdGlvbikKK3sKKyAgcmV0dXJuIFByb2R1Y3Q8TWF0cml4RGVyaXZlZCwgUGVybXV0YXRpb25EZXJpdmVkLCBBbGlhc0ZyZWVQcm9kdWN0PgorICAgICAgICAgICAgKG1hdHJpeC5kZXJpdmVkKCksIHBlcm11dGF0aW9uLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIHJvd3MuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvbkRlcml2ZWQsIHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworY29uc3QgUHJvZHVjdDxQZXJtdXRhdGlvbkRlcml2ZWQsIE1hdHJpeERlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CitvcGVyYXRvciooY29uc3QgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uRGVyaXZlZD4gJnBlcm11dGF0aW9uLAorICAgICAgICAgIGNvbnN0IE1hdHJpeEJhc2U8TWF0cml4RGVyaXZlZD4mIG1hdHJpeCkKK3sKKyAgcmV0dXJuIFByb2R1Y3Q8UGVybXV0YXRpb25EZXJpdmVkLCBNYXRyaXhEZXJpdmVkLCBBbGlhc0ZyZWVQcm9kdWN0PgorICAgICAgICAgICAgKHBlcm11dGF0aW9uLmRlcml2ZWQoKSwgbWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgUGVybXV0YXRpb25UeXBlPgorY2xhc3MgSW52ZXJzZUltcGw8UGVybXV0YXRpb25UeXBlLCBQZXJtdXRhdGlvblN0b3JhZ2U+CisgIDogcHVibGljIEVpZ2VuQmFzZTxJbnZlcnNlPFBlcm11dGF0aW9uVHlwZT4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgUGVybXV0YXRpb25UeXBlOjpQbGFpblBlcm11dGF0aW9uVHlwZSBQbGFpblBlcm11dGF0aW9uVHlwZTsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8UGVybXV0YXRpb25UeXBlPiBQZXJtVHJhaXRzOworICBwcm90ZWN0ZWQ6CisgICAgSW52ZXJzZUltcGwoKSB7fQorICBwdWJsaWM6CisgICAgdHlwZWRlZiBJbnZlcnNlPFBlcm11dGF0aW9uVHlwZT4gSW52ZXJzZVR5cGU7CisgICAgdXNpbmcgRWlnZW5CYXNlPEludmVyc2U8UGVybXV0YXRpb25UeXBlPiA+OjpkZXJpdmVkOworCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHR5cGVkZWYgdHlwZW5hbWUgUGVybXV0YXRpb25UeXBlOjpEZW5zZU1hdHJpeFR5cGUgRGVuc2VNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBQZXJtVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gUGVybVRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IFBlcm1UcmFpdHM6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBQZXJtVHJhaXRzOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgI2VuZGlmCisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorICAgIHZvaWQgZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgb3RoZXIuc2V0WmVybygpOworICAgICAgZm9yIChJbmRleCBpPTA7IGk8ZGVyaXZlZCgpLnJvd3MoKTsrK2kpCisgICAgICAgIG90aGVyLmNvZWZmUmVmKGksIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5kaWNlcygpLmNvZWZmKGkpKSA9IHR5cGVuYW1lIERlbnNlRGVyaXZlZDo6U2NhbGFyKDEpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJuIHRoZSBlcXVpdmFsZW50IHBlcm11dGF0aW9uIG1hdHJpeCAqLworICAgIFBsYWluUGVybXV0YXRpb25UeXBlIGV2YWwoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworICAgIERlbnNlTWF0cml4VHlwZSB0b0RlbnNlTWF0cml4KCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIGNvbHVtbnMuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgY29uc3QgUHJvZHVjdDxPdGhlckRlcml2ZWQsIEludmVyc2VUeXBlLCBBbGlhc0ZyZWVQcm9kdWN0PgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG1hdHJpeCwgY29uc3QgSW52ZXJzZVR5cGUmIHRyUGVybSkKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxPdGhlckRlcml2ZWQsIEludmVyc2VUeXBlLCBBbGlhc0ZyZWVQcm9kdWN0PihtYXRyaXguZGVyaXZlZCgpLCB0clBlcm0uZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIHJvd3MuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBQcm9kdWN0PEludmVyc2VUeXBlLCBPdGhlckRlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgbWF0cml4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBQcm9kdWN0PEludmVyc2VUeXBlLCBPdGhlckRlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+KGRlcml2ZWQoKSwgbWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IFBlcm11dGF0aW9uV3JhcHBlcjxjb25zdCBEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojphc1Blcm11dGF0aW9uKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQXNzaWdubWVudEtpbmQ8RGVuc2VTaGFwZSxQZXJtdXRhdGlvblNoYXBlPiB7IHR5cGVkZWYgRWlnZW5CYXNlMkVpZ2VuQmFzZSBLaW5kOyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QRVJNVVRBVElPTk1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9QbGFpbk9iamVjdEJhc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL1BsYWluT2JqZWN0QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjRmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9QbGFpbk9iamVjdEJhc2UuaApAQCAtMCwwICsxLDEwMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fREVOU0VTVE9SQUdFQkFTRV9ICisjZGVmaW5lIEVJR0VOX0RFTlNFU1RPUkFHRUJBU0VfSAorCisjaWYgZGVmaW5lZChFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8pCisjIGRlZmluZSBFSUdFTl9JTklUSUFMSVpFX0NPRUZGUworIyBkZWZpbmUgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRCBmb3IoaW50IGk9MDtpPGJhc2UoKS5zaXplKCk7KytpKSBjb2VmZlJlZihpKT1TY2FsYXIoMCk7CisjZWxpZiBkZWZpbmVkKEVJR0VOX0lOSVRJQUxJWkVfTUFUUklDRVNfQllfTkFOKQorIyBkZWZpbmUgRUlHRU5fSU5JVElBTElaRV9DT0VGRlMKKyMgZGVmaW5lIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQgZm9yKGludCBpPTA7aTxiYXNlKCkuc2l6ZSgpOysraSkgY29lZmZSZWYoaSk9c3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyNlbHNlCisjIHVuZGVmIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTCisjIGRlZmluZSBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8aW50IE1heFNpemVBdENvbXBpbGVUaW1lPiBzdHJ1Y3QgY2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdyB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIHJ1bihJbmRleCwgSW5kZXgpCisgIHsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdzxEeW5hbWljPiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICB7CisgICAgLy8gaHR0cDovL2hnLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9maWxlLzZjOGE5MDk5NzdkMy94cGNvbS9kcy9DaGVja2VkSW50LmgjbDI0MgorICAgIC8vIHdlIGFzc3VtZSBJbmRleCBpcyBzaWduZWQKKyAgICBJbmRleCBtYXhfaW5kZXggPSAoc3RkOjpzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC0gMSkpIC0gMTsgLy8gYXNzdW1lIEluZGV4IGlzIHNpZ25lZAorICAgIGJvb2wgZXJyb3IgPSAocm93cyA9PSAwIHx8IGNvbHMgPT0gMCkgPyBmYWxzZQorICAgICAgICAgICAgICAgOiAocm93cyA+IG1heF9pbmRleCAvIGNvbHMpOworICAgIGlmIChlcnJvcikKKyAgICAgIHRocm93X3N0ZF9iYWRfYWxsb2MoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsCisgICAgICAgICAgdHlwZW5hbWUgT3RoZXJEZXJpdmVkID0gRGVyaXZlZCwKKyAgICAgICAgICBib29sIElzVmVjdG9yID0gYm9vbChEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpICYmIGJvb2woT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlQSwgdHlwZW5hbWUgTWF0cml4VHlwZUIsIGJvb2wgU3dhcFBvaW50ZXJzPiBzdHJ1Y3QgbWF0cml4X3N3YXBfaW1wbDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNpZmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorbmFtZXNwYWNlIGRveHlnZW4geworCisvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBkb3h5Z2VuIG5vdCBiZWluZyBhYmxlIHRvIHVuZGVyc3RhbmQgdGhlIGluaGVyaXRhbmNlIGxvZ2ljCisvLyB3aGVuIGl0IGlzIGhpZGRlbiBieSB0aGUgZGVuc2VfeHByX2Jhc2UgaGVscGVyIHN0cnVjdC4KKy8vIE1vcmVvdmVyLCBkb3h5Z2VuIGZhaWxzIHRvIGluY2x1ZGUgbWVtYmVycyB0aGF0IGFyZSBub3QgZG9jdW1lbnRlZCBpbiB0aGUgZGVjbGFyYXRpb24gYm9keSBvZgorLy8gTWF0cml4QmFzZSBpZiB3ZSBpbmhlcml0cyBNYXRyaXhCYXNlPE1hdHJpeDxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4sCisvLyB0aGlzIGlzIHdoeSB3ZSBzaW1wbHkgaW5oZXJpdHMgTWF0cml4QmFzZSwgdGhvdWdoIHRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZS4KKworLyoqIFRoaXMgY2xhc3MgaXMganVzdCBhIHdvcmthcm91bmQgZm9yIERveHlnZW4gYW5kIGl0IGRvZXMgbm90IG5vdCBhY3R1YWxseSBleGlzdC4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBkZW5zZV94cHJfYmFzZV9kaXNwYXRjaGVyOworLyoqIFRoaXMgY2xhc3MgaXMganVzdCBhIHdvcmthcm91bmQgZm9yIERveHlnZW4gYW5kIGl0IGRvZXMgbm90IG5vdCBhY3R1YWxseSBleGlzdC4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorc3RydWN0IGRlbnNlX3hwcl9iYXNlX2Rpc3BhdGNoZXI8TWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgorICAgIDogcHVibGljIE1hdHJpeEJhc2Uge307CisvKiogVGhpcyBjbGFzcyBpcyBqdXN0IGEgd29ya2Fyb3VuZCBmb3IgRG94eWdlbiBhbmQgaXQgZG9lcyBub3Qgbm90IGFjdHVhbGx5IGV4aXN0LiAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3QgZGVuc2VfeHByX2Jhc2VfZGlzcGF0Y2hlcjxBcnJheTxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4KKyAgICA6IHB1YmxpYyBBcnJheUJhc2Uge307CisKK30gLy8gbmFtZXNwYWNlIGRveHlnZW4KKworLyoqIFxjbGFzcyBQbGFpbk9iamVjdEJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqIFxicmllZiAlRGVuc2Ugc3RvcmFnZSBiYXNlIGNsYXNzIGZvciBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgcGx1Z2luIG1lY2hhbmlzbSBkZXNjcmliZWQgb24gdGhlIHBhZ2UKKyAgKiBccmVmIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucyBieSBkZWZpbmluZyB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBcYyBFSUdFTl9QTEFJTk9CSkVDVEJBU0VfUExVR0lOLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4sIGEgTWF0cml4IG9yIEFycmF5CisgICoKKyAgKiBcc2EgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgUGxhaW5PYmplY3RCYXNlIDogcHVibGljIGRveHlnZW46OmRlbnNlX3hwcl9iYXNlX2Rpc3BhdGNoZXI8RGVyaXZlZD4KKyNlbHNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgUGxhaW5PYmplY3RCYXNlIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZQorI2VuZGlmCit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgT3B0aW9ucyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok9wdGlvbnMgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZSBCYXNlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBEZXJpdmVkIERlbnNlVHlwZTsKKworICAgIHVzaW5nIEJhc2U6OlJvd3NBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OkNvbHNBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OlNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFJvd3NBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heENvbHNBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpGbGFnczsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE1hcE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+IGZyaWVuZCBjbGFzcyBFaWdlbjo6TWFwOworICAgIGZyaWVuZCAgY2xhc3MgRWlnZW46Ok1hcDxEZXJpdmVkLCBVbmFsaWduZWQ+OworICAgIHR5cGVkZWYgRWlnZW46Ok1hcDxEZXJpdmVkLCBVbmFsaWduZWQ+ICBNYXBUeXBlOworICAgIGZyaWVuZCAgY2xhc3MgRWlnZW46Ok1hcDxjb25zdCBEZXJpdmVkLCBVbmFsaWduZWQ+OworICAgIHR5cGVkZWYgY29uc3QgRWlnZW46Ok1hcDxjb25zdCBEZXJpdmVkLCBVbmFsaWduZWQ+IENvbnN0TWFwVHlwZTsKKyNpZiBFSUdFTl9NQVhfQUxJR05fQllURVM+MAorICAgIC8vIGZvciBFSUdFTl9NQVhfQUxJR05fQllURVM9PTAsIEFsaWduZWRNYXg9PVVuYWxpZ25lZCwgYW5kIG1hbnkgY29tcGlsZXJzIGdlbmVyYXRlIHdhcm5pbmdzIGZvciBmcmllbmQtaW5nIGEgY2xhc3MgdHdpY2UuCisgICAgZnJpZW5kICBjbGFzcyBFaWdlbjo6TWFwPERlcml2ZWQsIEFsaWduZWRNYXg+OworICAgIGZyaWVuZCAgY2xhc3MgRWlnZW46Ok1hcDxjb25zdCBEZXJpdmVkLCBBbGlnbmVkTWF4PjsKKyNlbmRpZgorICAgIHR5cGVkZWYgRWlnZW46Ok1hcDxEZXJpdmVkLCBBbGlnbmVkTWF4PiBBbGlnbmVkTWFwVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IEVpZ2VuOjpNYXA8Y29uc3QgRGVyaXZlZCwgQWxpZ25lZE1heD4gQ29uc3RBbGlnbmVkTWFwVHlwZTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVUeXBlPiBzdHJ1Y3QgU3RyaWRlZE1hcFR5cGUgeyB0eXBlZGVmIEVpZ2VuOjpNYXA8RGVyaXZlZCwgVW5hbGlnbmVkLCBTdHJpZGVUeXBlPiB0eXBlOyB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZVR5cGU+IHN0cnVjdCBTdHJpZGVkQ29uc3RNYXBUeXBlIHsgdHlwZWRlZiBFaWdlbjo6TWFwPGNvbnN0IERlcml2ZWQsIFVuYWxpZ25lZCwgU3RyaWRlVHlwZT4gdHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVUeXBlPiBzdHJ1Y3QgU3RyaWRlZEFsaWduZWRNYXBUeXBlIHsgdHlwZWRlZiBFaWdlbjo6TWFwPERlcml2ZWQsIEFsaWduZWRNYXgsIFN0cmlkZVR5cGU+IHR5cGU7IH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlVHlwZT4gc3RydWN0IFN0cmlkZWRDb25zdEFsaWduZWRNYXBUeXBlIHsgdHlwZWRlZiBFaWdlbjo6TWFwPGNvbnN0IERlcml2ZWQsIEFsaWduZWRNYXgsIFN0cmlkZVR5cGU+IHR5cGU7IH07CisKKyAgcHJvdGVjdGVkOgorICAgIERlbnNlU3RvcmFnZTxTY2FsYXIsIEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lLCBCYXNlOjpSb3dzQXRDb21waWxlVGltZSwgQmFzZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE9wdGlvbnM+IG1fc3RvcmFnZTsKKworICBwdWJsaWM6CisgICAgZW51bSB7IE5lZWRzVG9BbGlnbiA9IChTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljKSAmJiAoaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6QWxpZ25tZW50PjApIH07CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihOZWVkc1RvQWxpZ24pCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEJhc2UmIGJhc2UoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8QmFzZSo+KHRoaXMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBCYXNlJiBiYXNlKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IEJhc2UqPih0aGlzKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2Uucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2UuY29scygpOyB9CisKKyAgICAvKiogVGhpcyBpcyBhbiBvdmVybG9hZGVkIHZlcnNpb24gb2YgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsUmVhZE9ubHlBY2Nlc3NvcnM+Ojpjb2VmZihJbmRleCxJbmRleCkgY29uc3QKKyAgICAgICogcHJvdmlkZWQgdG8gYnktcGFzcyB0aGUgY3JlYXRpb24gb2YgYW4gZXZhbHVhdG9yIG9mIHRoZSBleHByZXNzaW9uLCB0aHVzIHNhdmluZyBjb21waWxhdGlvbiBlZmZvcnRzLgorICAgICAgKgorICAgICAgKiBTZWUgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsUmVhZE9ubHlBY2Nlc3NvcnM+Ojpjb2VmZihJbmRleCkgY29uc3QgZm9yIGRldGFpbHMuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggcm93SWQsIEluZGV4IGNvbElkKSBjb25zdAorICAgIHsKKyAgICAgIGlmKEZsYWdzICYgUm93TWFqb3JCaXQpCisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2NvbElkICsgcm93SWQgKiBtX3N0b3JhZ2UuY29scygpXTsKKyAgICAgIGVsc2UgLy8gY29sdW1uLW1ham9yCisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW3Jvd0lkICsgY29sSWQgKiBtX3N0b3JhZ2Uucm93cygpXTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBpcyBhbiBvdmVybG9hZGVkIHZlcnNpb24gb2YgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsUmVhZE9ubHlBY2Nlc3NvcnM+Ojpjb2VmZihJbmRleCkgY29uc3QKKyAgICAgICogcHJvdmlkZWQgdG8gYnktcGFzcyB0aGUgY3JlYXRpb24gb2YgYW4gZXZhbHVhdG9yIG9mIHRoZSBleHByZXNzaW9uLCB0aHVzIHNhdmluZyBjb21waWxhdGlvbiBlZmZvcnRzLgorICAgICAgKgorICAgICAgKiBTZWUgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsUmVhZE9ubHlBY2Nlc3NvcnM+Ojpjb2VmZihJbmRleCkgY29uc3QgZm9yIGRldGFpbHMuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgIH0KKworICAgIC8qKiBUaGlzIGlzIGFuIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz46OmNvZWZmUmVmKEluZGV4LEluZGV4KSBjb25zdAorICAgICAgKiBwcm92aWRlZCB0byBieS1wYXNzIHRoZSBjcmVhdGlvbiBvZiBhbiBldmFsdWF0b3Igb2YgdGhlIGV4cHJlc3Npb24sIHRodXMgc2F2aW5nIGNvbXBpbGF0aW9uIGVmZm9ydHMuCisgICAgICAqCisgICAgICAqIFNlZSBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz46OmNvZWZmUmVmKEluZGV4LEluZGV4KSBjb25zdCBmb3IgZGV0YWlscy4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3dJZCwgSW5kZXggY29sSWQpCisgICAgeworICAgICAgaWYoRmxhZ3MgJiBSb3dNYWpvckJpdCkKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbY29sSWQgKyByb3dJZCAqIG1fc3RvcmFnZS5jb2xzKCldOworICAgICAgZWxzZSAvLyBjb2x1bW4tbWFqb3IKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbcm93SWQgKyBjb2xJZCAqIG1fc3RvcmFnZS5yb3dzKCldOworICAgIH0KKworICAgIC8qKiBUaGlzIGlzIGFuIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz46OmNvZWZmUmVmKEluZGV4KSBjb25zdAorICAgICAgKiBwcm92aWRlZCB0byBieS1wYXNzIHRoZSBjcmVhdGlvbiBvZiBhbiBldmFsdWF0b3Igb2YgdGhlIGV4cHJlc3Npb24sIHRodXMgc2F2aW5nIGNvbXBpbGF0aW9uIGVmZm9ydHMuCisgICAgICAqCisgICAgICAqIFNlZSBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz46OmNvZWZmUmVmKEluZGV4KSBjb25zdCBmb3IgZGV0YWlscy4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgfQorCisgICAgLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgY29lZmZSZWYoSW5kZXgsSW5kZXgpIHdoaWNoIGlzIHRodXMgc3lub255bSBvZiBjb2VmZihJbmRleCxJbmRleCkuCisgICAgICAqIEl0IGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3dJZCwgSW5kZXggY29sSWQpIGNvbnN0CisgICAgeworICAgICAgaWYoRmxhZ3MgJiBSb3dNYWpvckJpdCkKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbY29sSWQgKyByb3dJZCAqIG1fc3RvcmFnZS5jb2xzKCldOworICAgICAgZWxzZSAvLyBjb2x1bW4tbWFqb3IKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbcm93SWQgKyBjb2xJZCAqIG1fc3RvcmFnZS5yb3dzKCldOworICAgIH0KKworICAgIC8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGNvZWZmUmVmKEluZGV4KSB3aGljaCBpcyB0aHVzIHN5bm9ueW0gb2YgY29lZmYoSW5kZXgpLgorICAgICAgKiBJdCBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvd0lkLCBJbmRleCBjb2xJZCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRTY2FsYXIsIExvYWRNb2RlPgorICAgICAgICAgICAgICAgKG1fc3RvcmFnZS5kYXRhKCkgKyAoRmxhZ3MgJiBSb3dNYWpvckJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbElkICsgcm93SWQgKiBtX3N0b3JhZ2UuY29scygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93SWQgKyBjb2xJZCAqIG1fc3RvcmFnZS5yb3dzKCkpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRTY2FsYXIsIExvYWRNb2RlPihtX3N0b3JhZ2UuZGF0YSgpICsgaW5kZXgpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3dJZCwgSW5kZXggY29sSWQsIGNvbnN0IFBhY2tldFNjYWxhciYgdmFsKQorICAgIHsKKyAgICAgIGludGVybmFsOjpwc3RvcmV0PFNjYWxhciwgUGFja2V0U2NhbGFyLCBTdG9yZU1vZGU+CisgICAgICAgICAgICAgIChtX3N0b3JhZ2UuZGF0YSgpICsgKEZsYWdzICYgUm93TWFqb3JCaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2xJZCArIHJvd0lkICogbV9zdG9yYWdlLmNvbHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvd0lkICsgY29sSWQgKiBtX3N0b3JhZ2Uucm93cygpKSwgdmFsKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZT4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IFBhY2tldFNjYWxhciYgdmFsKQorICAgIHsKKyAgICAgIGludGVybmFsOjpwc3RvcmV0PFNjYWxhciwgUGFja2V0U2NhbGFyLCBTdG9yZU1vZGU+KG1fc3RvcmFnZS5kYXRhKCkgKyBpbmRleCwgdmFsKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBkYXRhIGFycmF5IG9mIHRoaXMgbWF0cml4ICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgKmRhdGEoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJyYXkgb2YgdGhpcyBtYXRyaXggKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciAqZGF0YSgpCisgICAgeyByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKTsgfQorCisgICAgLyoqIFJlc2l6ZXMgXGMgKnRoaXMgdG8gYSBcYSByb3dzIHggXGEgY29scyBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBkeW5hbWljLXNpemUgbWF0cmljZXMsIGFsdGhvdWdoIGl0IGlzIGxlZ2FsIHRvIGNhbGwgaXQgb24gYW55CisgICAgICAqIG1hdHJpeCBhcyBsb25nIGFzIGZpeGVkIGRpbWVuc2lvbnMgYXJlIGxlZnQgdW5jaGFuZ2VkLiBJZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSB0aGUgbnVtYmVyCisgICAgICAqIG9mIHJvd3MgYW5kL29yIG9mIGNvbHVtbnMsIHlvdSBjYW4gdXNlIHJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCksIHJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkuCisgICAgICAqCisgICAgICAqIElmIHRoZSBjdXJyZW50IG51bWJlciBvZiBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMgZXhhY3RseSBtYXRjaGVzIHRoZQorICAgICAgKiBwcm9kdWN0IFxhIHJvd3MgKiBcYSBjb2xzLCB0aGVuIG5vIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCBhbmQKKyAgICAgICogdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4gSW4gYWxsIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcKKyAgICAgICogc2hyaW5raW5nLCB0aGUgZGF0YSBpcyByZWFsbG9jYXRlZCBhbmQgYWxsIHByZXZpb3VzIHZhbHVlcyBhcmUgbG9zdC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfcmVzaXplX2ludF9pbnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgpIGZvciB2ZWN0b3JzLCByZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXgpLCByZXNpemUoSW5kZXgsIE5vQ2hhbmdlX3QpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCggICBFSUdFTl9JTVBMSUVTKFJvd3NBdENvbXBpbGVUaW1lIT1EeW5hbWljLHJvd3M9PVJvd3NBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICYmIEVJR0VOX0lNUExJRVMoQ29sc0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMsY29scz09Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgJiYgRUlHRU5fSU1QTElFUyhSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyAmJiBNYXhSb3dzQXRDb21waWxlVGltZSE9RHluYW1pYyxyb3dzPD1NYXhSb3dzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAmJiBFSUdFTl9JTVBMSUVTKENvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT1EeW5hbWljLGNvbHM8PU1heENvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICYmIHJvd3M+PTAgJiYgY29scz49MCAmJiAiSW52YWxpZCBzaXplcyB3aGVuIHJlc2l6aW5nIGEgbWF0cml4IG9yIGFycmF5LiIpOworICAgICAgaW50ZXJuYWw6OmNoZWNrX3Jvd3NfY29sc19mb3Jfb3ZlcmZsb3c8TWF4U2l6ZUF0Q29tcGlsZVRpbWU+OjpydW4ocm93cywgY29scyk7CisgICAgICAjaWZkZWYgRUlHRU5fSU5JVElBTElaRV9DT0VGRlMKKyAgICAgICAgSW5kZXggc2l6ZSA9IHJvd3MqY29sczsKKyAgICAgICAgYm9vbCBzaXplX2NoYW5nZWQgPSBzaXplICE9IHRoaXMtPnNpemUoKTsKKyAgICAgICAgbV9zdG9yYWdlLnJlc2l6ZShzaXplLCByb3dzLCBjb2xzKTsKKyAgICAgICAgaWYoc2l6ZV9jaGFuZ2VkKSBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgICAjZWxzZQorICAgICAgICBtX3N0b3JhZ2UucmVzaXplKHJvd3MqY29scywgcm93cywgY29scyk7CisgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICAvKiogUmVzaXplcyBcYyAqdGhpcyB0byBhIHZlY3RvciBvZiBsZW5ndGggXGEgc2l6ZQorICAgICAgKgorICAgICAgKiBcb25seV9mb3JfdmVjdG9ycy4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBmb3IKKyAgICAgICogcGFydGlhbGx5IGR5bmFtaWMgbWF0cmljZXMgd2hlbiB0aGUgc3RhdGljIGRpbWVuc2lvbiBpcyBhbnl0aGluZyBvdGhlcgorICAgICAgKiB0aGFuIDEuIEZvciBleGFtcGxlIGl0IHdpbGwgbm90IHdvcmsgd2l0aCBNYXRyaXg8ZG91YmxlLCAyLCBEeW5hbWljPi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9pbnQuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9yZXNpemVfaW50Lm91dAorICAgICAgKgorICAgICAgKiBcc2EgcmVzaXplKEluZGV4LEluZGV4KSwgcmVzaXplKE5vQ2hhbmdlX3QsIEluZGV4KSwgcmVzaXplKEluZGV4LCBOb0NoYW5nZV90KQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSB2b2lkIHJlc2l6ZShJbmRleCBzaXplKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoUGxhaW5PYmplY3RCYXNlKQorICAgICAgZWlnZW5fYXNzZXJ0KCgoU2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyAmJiAoTWF4U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgfHwgc2l6ZTw9TWF4U2l6ZUF0Q29tcGlsZVRpbWUpKSB8fCBTaXplQXRDb21waWxlVGltZSA9PSBzaXplKSAmJiBzaXplPj0wKTsKKyAgICAgICNpZmRlZiBFSUdFTl9JTklUSUFMSVpFX0NPRUZGUworICAgICAgICBib29sIHNpemVfY2hhbmdlZCA9IHNpemUgIT0gdGhpcy0+c2l6ZSgpOworICAgICAgI2VuZGlmCisgICAgICBpZihSb3dzQXRDb21waWxlVGltZSA9PSAxKQorICAgICAgICBtX3N0b3JhZ2UucmVzaXplKHNpemUsIDEsIHNpemUpOworICAgICAgZWxzZQorICAgICAgICBtX3N0b3JhZ2UucmVzaXplKHNpemUsIHNpemUsIDEpOworICAgICAgI2lmZGVmIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTCisgICAgICAgIGlmKHNpemVfY2hhbmdlZCkgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgICAgI2VuZGlmCisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCwgY2hhbmdpbmcgb25seSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuIEZvciB0aGUgcGFyYW1ldGVyIG9mIHR5cGUgTm9DaGFuZ2VfdCwganVzdCBwYXNzIHRoZSBzcGVjaWFsIHZhbHVlIFxjIE5vQ2hhbmdlCisgICAgICAqIGFzIGluIHRoZSBleGFtcGxlIGJlbG93LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9Ob0NoYW5nZV9pbnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgsSW5kZXgpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIHZvaWQgcmVzaXplKE5vQ2hhbmdlX3QsIEluZGV4IGNvbHMpCisgICAgeworICAgICAgcmVzaXplKHJvd3MoKSwgY29scyk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCwgY2hhbmdpbmcgb25seSB0aGUgbnVtYmVyIG9mIHJvd3MuIEZvciB0aGUgcGFyYW1ldGVyIG9mIHR5cGUgTm9DaGFuZ2VfdCwganVzdCBwYXNzIHRoZSBzcGVjaWFsIHZhbHVlIFxjIE5vQ2hhbmdlCisgICAgICAqIGFzIGluIHRoZSBleGFtcGxlIGJlbG93LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfcmVzaXplX2ludF9Ob0NoYW5nZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9pbnRfTm9DaGFuZ2Uub3V0CisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgsSW5kZXgpCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIHZvaWQgcmVzaXplKEluZGV4IHJvd3MsIE5vQ2hhbmdlX3QpCisgICAgeworICAgICAgcmVzaXplKHJvd3MsIGNvbHMoKSk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgXGMgKnRoaXMgdG8gaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIFxhIG90aGVyLgorICAgICAgKiBUYWtlcyBjYXJlIG9mIGRvaW5nIGFsbCB0aGUgY2hlY2tpbmcgdGhhdCdzIG5lZWRlZC4KKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IGNvcHlpbmcgYSByb3ctdmVjdG9yIGludG8gYSB2ZWN0b3IgKGFuZCBjb252ZXJzZWx5KSBpcyBhbGxvd2VkLgorICAgICAgKiBUaGUgcmVzaXppbmcsIGlmIGFueSwgaXMgdGhlbiBkb25lIGluIHRoZSBhcHByb3ByaWF0ZSB3YXkgc28gdGhhdCByb3ctdmVjdG9ycworICAgICAgKiByZW1haW4gcm93LXZlY3RvcnMgYW5kIHZlY3RvcnMgcmVtYWluIHZlY3RvcnMuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVzaXplTGlrZShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgX290aGVyKQorICAgIHsKKyAgICAgIGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIgPSBfb3RoZXIuZGVyaXZlZCgpOworICAgICAgaW50ZXJuYWw6OmNoZWNrX3Jvd3NfY29sc19mb3Jfb3ZlcmZsb3c8TWF4U2l6ZUF0Q29tcGlsZVRpbWU+OjpydW4ob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgICAgY29uc3QgSW5kZXggb3RoZXJzaXplID0gb3RoZXIucm93cygpKm90aGVyLmNvbHMoKTsKKyAgICAgIGlmKFJvd3NBdENvbXBpbGVUaW1lID09IDEpCisgICAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChvdGhlci5yb3dzKCkgPT0gMSB8fCBvdGhlci5jb2xzKCkgPT0gMSk7CisgICAgICAgIHJlc2l6ZSgxLCBvdGhlcnNpemUpOworICAgICAgfQorICAgICAgZWxzZSBpZihDb2xzQXRDb21waWxlVGltZSA9PSAxKQorICAgICAgeworICAgICAgICBlaWdlbl9hc3NlcnQob3RoZXIucm93cygpID09IDEgfHwgb3RoZXIuY29scygpID09IDEpOworICAgICAgICByZXNpemUob3RoZXJzaXplLCAxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICB9CisKKyAgICAvKiogUmVzaXplcyB0aGUgbWF0cml4IHRvIFxhIHJvd3MgeCBcYSBjb2xzIHdoaWxlIGxlYXZpbmcgb2xkIHZhbHVlcyB1bnRvdWNoZWQuCisgICAgICAqCisgICAgICAqIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIG1hdHJpY2VzIG9mIGR5bmFtaWMgc2l6ZS4gSWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgdGhlIG51bWJlcgorICAgICAgKiBvZiByb3dzIGFuZC9vciBvZiBjb2x1bW5zLCB5b3UgY2FuIHVzZSBjb25zZXJ2YXRpdmVSZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXgpIG9yCisgICAgICAqIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkuCisgICAgICAqCisgICAgICAqIE1hdHJpY2VzIGFyZSByZXNpemVkIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBlbGVtZW50LiBJbiBjYXNlIHZhbHVlcyBuZWVkIHRvIGJlIAorICAgICAgKiBhcHBlbmRlZCB0byB0aGUgbWF0cml4IHRoZXkgd2lsbCBiZSB1bmluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw8RGVyaXZlZD46OnJ1bigqdGhpcywgcm93cywgY29scyk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBcYSByb3dzIHggXGEgY29scyB3aGlsZSBsZWF2aW5nIG9sZCB2YWx1ZXMgdW50b3VjaGVkLgorICAgICAgKgorICAgICAgKiBBcyBvcHBvc2VkIHRvIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKSwgdGhpcyB2ZXJzaW9uIGxlYXZlcworICAgICAgKiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdW5jaGFuZ2VkLgorICAgICAgKgorICAgICAgKiBJbiBjYXNlIHRoZSBtYXRyaXggaXMgZ3Jvd2luZywgbmV3IHJvd3Mgd2lsbCBiZSB1bmluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggcm93cywgTm9DaGFuZ2VfdCkKKyAgICB7CisgICAgICAvLyBOb3RlOiBzZWUgdGhlIGNvbW1lbnQgaW4gY29uc2VydmF0aXZlUmVzaXplKEluZGV4LEluZGV4KQorICAgICAgY29uc2VydmF0aXZlUmVzaXplKHJvd3MsIGNvbHMoKSk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBcYSByb3dzIHggXGEgY29scyB3aGlsZSBsZWF2aW5nIG9sZCB2YWx1ZXMgdW50b3VjaGVkLgorICAgICAgKgorICAgICAgKiBBcyBvcHBvc2VkIHRvIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKSwgdGhpcyB2ZXJzaW9uIGxlYXZlcworICAgICAgKiB0aGUgbnVtYmVyIG9mIHJvd3MgdW5jaGFuZ2VkLgorICAgICAgKgorICAgICAgKiBJbiBjYXNlIHRoZSBtYXRyaXggaXMgZ3Jvd2luZywgbmV3IGNvbHVtbnMgd2lsbCBiZSB1bmluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXggY29scykKKyAgICB7CisgICAgICAvLyBOb3RlOiBzZWUgdGhlIGNvbW1lbnQgaW4gY29uc2VydmF0aXZlUmVzaXplKEluZGV4LEluZGV4KQorICAgICAgY29uc2VydmF0aXZlUmVzaXplKHJvd3MoKSwgY29scyk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIHZlY3RvciB0byBcYSBzaXplIHdoaWxlIHJldGFpbmluZyBvbGQgdmFsdWVzLgorICAgICAgKgorICAgICAgKiBcb25seV9mb3JfdmVjdG9ycy4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBmb3IKKyAgICAgICogcGFydGlhbGx5IGR5bmFtaWMgbWF0cmljZXMgd2hlbiB0aGUgc3RhdGljIGRpbWVuc2lvbiBpcyBhbnl0aGluZyBvdGhlcgorICAgICAgKiB0aGFuIDEuIEZvciBleGFtcGxlIGl0IHdpbGwgbm90IHdvcmsgd2l0aCBNYXRyaXg8ZG91YmxlLCAyLCBEeW5hbWljPi4KKyAgICAgICoKKyAgICAgICogV2hlbiB2YWx1ZXMgYXJlIGFwcGVuZGVkLCB0aGV5IHdpbGwgYmUgdW5pbml0aWFsaXplZC4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHNpemUpCisgICAgeworICAgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsPERlcml2ZWQ+OjpydW4oKnRoaXMsIHNpemUpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXggdG8gXGEgcm93cyB4IFxhIGNvbHMgb2YgXGMgb3RoZXIsIHdoaWxlIGxlYXZpbmcgb2xkIHZhbHVlcyB1bnRvdWNoZWQuCisgICAgICAqCisgICAgICAqIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIG1hdHJpY2VzIG9mIGR5bmFtaWMgc2l6ZS4gSWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgdGhlIG51bWJlcgorICAgICAgKiBvZiByb3dzIGFuZC9vciBvZiBjb2x1bW5zLCB5b3UgY2FuIHVzZSBjb25zZXJ2YXRpdmVSZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXgpIG9yCisgICAgICAqIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkuCisgICAgICAqCisgICAgICAqIE1hdHJpY2VzIGFyZSByZXNpemVkIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBlbGVtZW50LiBJbiBjYXNlIHZhbHVlcyBuZWVkIHRvIGJlIAorICAgICAgKiBhcHBlbmRlZCB0byB0aGUgbWF0cml4IHRoZXkgd2lsbCBjb3BpZWQgZnJvbSBcYyBvdGhlci4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZUxpa2UoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfcmVzaXplX2xpa2VfaW1wbDxEZXJpdmVkLE90aGVyRGVyaXZlZD46OnJ1bigqdGhpcywgb3RoZXIpOworICAgIH0KKworICAgIC8qKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LiBJdHMgcHVycG9zZSBpcyB0bworICAgICAgKiBwcmV2ZW50IGEgZGVmYXVsdCBvcGVyYXRvcj0gZnJvbSBoaWRpbmcgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uCisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUGxhaW5PYmplY3RCYXNlJiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gX3NldChvdGhlcik7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpsYXp5QXNzaWduKCkgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIGxhenlBc3NpZ24oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIF9yZXNpemVfdG9fbWF0Y2gob3RoZXIpOworICAgICAgcmV0dXJuIEJhc2U6OmxhenlBc3NpZ24ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIGZ1bmMpCisgICAgeworICAgICAgcmVzaXplKGZ1bmMucm93cygpLCBmdW5jLmNvbHMoKSk7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KGZ1bmMpOworICAgIH0KKworICAgIC8vIFByZXZlbnQgdXNlciBmcm9tIHRyeWluZyB0byBpbnN0YW50aWF0ZSBQbGFpbk9iamVjdEJhc2Ugb2JqZWN0cworICAgIC8vIGJ5IG1ha2luZyBhbGwgaXRzIGNvbnN0cnVjdG9yIHByb3RlY3RlZC4gU2VlIGJ1ZyAxMDc0LgorICBwcm90ZWN0ZWQ6CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGxhaW5PYmplY3RCYXNlKCkgOiBtX3N0b3JhZ2UoKQorICAgIHsKKy8vICAgICAgIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKy8vICAgICAgIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvLyBGSVhNRSBpcyBpdCBzdGlsbCBuZWVkZWQgPworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IFBsYWluT2JqZWN0QmFzZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KQorICAgICAgOiBtX3N0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCgpKQorICAgIHsKKy8vICAgICAgIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKyNlbmRpZgorCisjaWYgRUlHRU5fSEFTX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBQbGFpbk9iamVjdEJhc2UoUGxhaW5PYmplY3RCYXNlJiYgb3RoZXIpIEVJR0VOX05PRVhDRVBUCisgICAgICA6IG1fc3RvcmFnZSggc3RkOjptb3ZlKG90aGVyLm1fc3RvcmFnZSkgKQorICAgIHsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFBsYWluT2JqZWN0QmFzZSYgb3BlcmF0b3I9KFBsYWluT2JqZWN0QmFzZSYmIG90aGVyKSBFSUdFTl9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAobV9zdG9yYWdlLCBvdGhlci5tX3N0b3JhZ2UpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGxhaW5PYmplY3RCYXNlKGNvbnN0IFBsYWluT2JqZWN0QmFzZSYgb3RoZXIpCisgICAgICA6IEJhc2UoKSwgbV9zdG9yYWdlKG90aGVyLm1fc3RvcmFnZSkgeyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBsYWluT2JqZWN0QmFzZShJbmRleCBzaXplLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX3N0b3JhZ2Uoc2l6ZSwgcm93cywgY29scykKKyAgICB7CisvLyAgICAgICBfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisvLyAgICAgICBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgfQorCisgICAgLyoqIFxzYSBQbGFpbk9iamVjdEJhc2U6Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYpICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBQbGFpbk9iamVjdEJhc2UoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQorICAgICAgOiBtX3N0b3JhZ2UoKQorICAgIHsKKyAgICAgIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIHJlc2l6ZUxpa2Uob3RoZXIpOworICAgICAgX3NldF9ub2FsaWFzKG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogXHNhIFBsYWluT2JqZWN0QmFzZTo6b3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JikgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBsYWluT2JqZWN0QmFzZShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgICA6IG1fc3RvcmFnZSgpCisgICAgeworICAgICAgX2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgcmVzaXplTGlrZShvdGhlcik7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisgICAgLyoqIFxicmllZiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggaW4tcGxhY2UgZXZhbHVhdGlvbiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGxhaW5PYmplY3RCYXNlKGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgX2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgLy8gRklYTUUgdGhpcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHRyYW5zcG9zZSB2ZWN0b3JzIGlmIG5lY2Vzc2FyeQorICAgICAgcmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICAgIG90aGVyLmV2YWxUbyh0aGlzLT5kZXJpdmVkKCkpOworICAgIH0KKworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIENvcGllcyB0aGUgZ2VuZXJpYyBleHByZXNzaW9uIFxhIG90aGVyIGludG8gKnRoaXMuCisgICAgICAqIFxjb3B5ZGV0YWlscyBEZW5zZUJhc2U6Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgeworICAgICAgX3Jlc2l6ZV90b19tYXRjaChvdGhlcik7CisgICAgICBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIHJldHVybiB0aGlzLT5kZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxuYW1lIE1hcAorICAgICAgKiBUaGVzZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHJldHVybmluZyBNYXAgb2JqZWN0cy4gVGhlIE1hcCgpIHN0YXRpYyBmdW5jdGlvbnMgcmV0dXJuIHVuYWxpZ25lZCBNYXAgb2JqZWN0cywKKyAgICAgICogd2hpbGUgdGhlIEFsaWduZWRNYXAoKSBmdW5jdGlvbnMgcmV0dXJuIGFsaWduZWQgTWFwIG9iamVjdHMgYW5kIHRodXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdpdGggMTYtYnl0ZS1hbGlnbmVkCisgICAgICAqIFxhIGRhdGEgcG9pbnRlcnMuCisgICAgICAqCisgICAgICAqIFxzZWUgY2xhc3MgTWFwCisgICAgICAqLworICAgIC8vQHsKKyAgICBzdGF0aWMgaW5saW5lIENvbnN0TWFwVHlwZSBNYXAoY29uc3QgU2NhbGFyKiBkYXRhKQorICAgIHsgcmV0dXJuIENvbnN0TWFwVHlwZShkYXRhKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgTWFwVHlwZSBNYXAoU2NhbGFyKiBkYXRhKQorICAgIHsgcmV0dXJuIE1hcFR5cGUoZGF0YSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIENvbnN0TWFwVHlwZSBNYXAoY29uc3QgU2NhbGFyKiBkYXRhLCBJbmRleCBzaXplKQorICAgIHsgcmV0dXJuIENvbnN0TWFwVHlwZShkYXRhLCBzaXplKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgTWFwVHlwZSBNYXAoU2NhbGFyKiBkYXRhLCBJbmRleCBzaXplKQorICAgIHsgcmV0dXJuIE1hcFR5cGUoZGF0YSwgc2l6ZSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIENvbnN0TWFwVHlwZSBNYXAoY29uc3QgU2NhbGFyKiBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsgcmV0dXJuIENvbnN0TWFwVHlwZShkYXRhLCByb3dzLCBjb2xzKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgTWFwVHlwZSBNYXAoU2NhbGFyKiBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsgcmV0dXJuIE1hcFR5cGUoZGF0YSwgcm93cywgY29scyk7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgQ29uc3RBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKGNvbnN0IFNjYWxhciogZGF0YSkKKyAgICB7IHJldHVybiBDb25zdEFsaWduZWRNYXBUeXBlKGRhdGEpOyB9CisgICAgc3RhdGljIGlubGluZSBBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKFNjYWxhciogZGF0YSkKKyAgICB7IHJldHVybiBBbGlnbmVkTWFwVHlwZShkYXRhKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgQ29uc3RBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSkKKyAgICB7IHJldHVybiBDb25zdEFsaWduZWRNYXBUeXBlKGRhdGEsIHNpemUpOyB9CisgICAgc3RhdGljIGlubGluZSBBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSkKKyAgICB7IHJldHVybiBBbGlnbmVkTWFwVHlwZShkYXRhLCBzaXplKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgQ29uc3RBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7IHJldHVybiBDb25zdEFsaWduZWRNYXBUeXBlKGRhdGEsIHJvd3MsIGNvbHMpOyB9CisgICAgc3RhdGljIGlubGluZSBBbGlnbmVkTWFwVHlwZSBNYXBBbGlnbmVkKFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7IHJldHVybiBBbGlnbmVkTWFwVHlwZShkYXRhLCByb3dzLCBjb2xzKTsgfQorCisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQ29uc3RNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwKGNvbnN0IFNjYWxhciogZGF0YSwgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQ29uc3RNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXAoU2NhbGFyKiBkYXRhLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZENvbnN0TWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcChjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IHNpemUsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZENvbnN0TWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHNpemUsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwKFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSwgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHNpemUsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRDb25zdE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXAoY29uc3QgU2NhbGFyKiBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRDb25zdE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCByb3dzLCBjb2xzLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcChTY2FsYXIqIGRhdGEsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCByb3dzLCBjb2xzLCBzdHJpZGUpOyB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRDb25zdEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwQWxpZ25lZChjb25zdCBTY2FsYXIqIGRhdGEsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZENvbnN0QWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXBBbGlnbmVkKFNjYWxhciogZGF0YSwgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQ29uc3RBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcEFsaWduZWQoY29uc3QgU2NhbGFyKiBkYXRhLCBJbmRleCBzaXplLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRDb25zdEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc2l6ZSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwQWxpZ25lZChTY2FsYXIqIGRhdGEsIEluZGV4IHNpemUsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc2l6ZSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZENvbnN0QWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXBBbGlnbmVkKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQ29uc3RBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHJvd3MsIGNvbHMsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcEFsaWduZWQoU2NhbGFyKiBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHJvd3MsIGNvbHMsIHN0cmlkZSk7IH0KKyAgICAvL0B9CisKKyAgICB1c2luZyBCYXNlOjpzZXRDb25zdGFudDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRDb25zdGFudChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIHZhbCk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVyaXZlZCYgc2V0Q29uc3RhbnQoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU2NhbGFyJiB2YWwpOworCisgICAgdXNpbmcgQmFzZTo6c2V0WmVybzsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRaZXJvKEluZGV4IHNpemUpOworICAgIEVJR0VOX0RFVklDRV9GVU5DIERlcml2ZWQmIHNldFplcm8oSW5kZXggcm93cywgSW5kZXggY29scyk7CisKKyAgICB1c2luZyBCYXNlOjpzZXRPbmVzOworICAgIEVJR0VOX0RFVklDRV9GVU5DIERlcml2ZWQmIHNldE9uZXMoSW5kZXggc2l6ZSk7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRGVyaXZlZCYgc2V0T25lcyhJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKworICAgIHVzaW5nIEJhc2U6OnNldFJhbmRvbTsKKyAgICBEZXJpdmVkJiBzZXRSYW5kb20oSW5kZXggc2l6ZSk7CisgICAgRGVyaXZlZCYgc2V0UmFuZG9tKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworCisgICAgI2lmZGVmIEVJR0VOX1BMQUlOT0JKRUNUQkFTRV9QTFVHSU4KKyAgICAjaW5jbHVkZSBFSUdFTl9QTEFJTk9CSkVDVEJBU0VfUExVR0lOCisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIC8qKiBcaW50ZXJuYWwgUmVzaXplcyAqdGhpcyBpbiBwcmVwYXJhdGlvbiBmb3IgYXNzaWduaW5nIFxhIG90aGVyIHRvIGl0LgorICAgICAgKiBUYWtlcyBjYXJlIG9mIGRvaW5nIGFsbCB0aGUgY2hlY2tpbmcgdGhhdCdzIG5lZWRlZC4KKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IGNvcHlpbmcgYSByb3ctdmVjdG9yIGludG8gYSB2ZWN0b3IgKGFuZCBjb252ZXJzZWx5KSBpcyBhbGxvd2VkLgorICAgICAgKiBUaGUgcmVzaXppbmcsIGlmIGFueSwgaXMgdGhlbiBkb25lIGluIHRoZSBhcHByb3ByaWF0ZSB3YXkgc28gdGhhdCByb3ctdmVjdG9ycworICAgICAgKiByZW1haW4gcm93LXZlY3RvcnMgYW5kIHZlY3RvcnMgcmVtYWluIHZlY3RvcnMuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgX3Jlc2l6ZV90b19tYXRjaChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX05PX0FVVE9NQVRJQ19SRVNJWklORworICAgICAgZWlnZW5fYXNzZXJ0KCh0aGlzLT5zaXplKCk9PTAgfHwgKElzVmVjdG9yQXRDb21waWxlVGltZSA/ICh0aGlzLT5zaXplKCkgPT0gb3RoZXIuc2l6ZSgpKQorICAgICAgICAgICAgICAgICA6IChyb3dzKCkgPT0gb3RoZXIucm93cygpICYmIGNvbHMoKSA9PSBvdGhlci5jb2xzKCkpKSkKKyAgICAgICAgJiYgIlNpemUgbWlzbWF0Y2guIEF1dG9tYXRpYyByZXNpemluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIEVJR0VOX05PX0FVVE9NQVRJQ19SRVNJWklORyBpcyBkZWZpbmVkIik7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKG90aGVyKTsKKyAgICAgICNlbHNlCisgICAgICByZXNpemVMaWtlKG90aGVyKTsKKyAgICAgICNlbmRpZgorICAgIH0KKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgQ29waWVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvIFxjICp0aGlzIHdpdGggYXV0b21hdGljIHJlc2l6aW5nLgorICAgICAgKgorICAgICAgKiAqdGhpcyBtaWdodCBiZSByZXNpemVkIHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mIFxhIG90aGVyLiBJZiAqdGhpcyB3YXMgYSBudWxsIG1hdHJpeCAobm90IGFscmVhZHkgaW5pdGlhbGl6ZWQpLAorICAgICAgKiBpdCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIHZlY3RvciAoYW5kIGNvbnZlcnNlbHkpIGlzIGFsbG93ZWQuCisgICAgICAqIFRoZSByZXNpemluZywgaWYgYW55LCBpcyB0aGVuIGRvbmUgaW4gdGhlIGFwcHJvcHJpYXRlIHdheSBzbyB0aGF0IHJvdy12ZWN0b3JzCisgICAgICAqIHJlbWFpbiByb3ctdmVjdG9ycyBhbmQgdmVjdG9ycyByZW1haW4gdmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mKSwgX3NldF9ub2FsaWFzKCkKKyAgICAgICoKKyAgICAgICogXGludGVybmFsCisgICAgICAqLworICAgIC8vIGFsaWFzaW5nIGlzIGRlYWx0IG9uY2UgaW4gaW50ZXJuYWxsOjpjYWxsX2Fzc2lnbm1lbnQKKyAgICAvLyBzbyBhdCB0aGlzIHN0YWdlIHdlIGhhdmUgdG8gYXNzdW1lIGFsaWFzaW5nLi4uIGFuZCByZXNpc2luZyBoYXMgdG8gYmUgZG9uZSBsYXRlci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBfc2V0KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50KHRoaXMtPmRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIHJldHVybiB0aGlzLT5kZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCBMaWtlIF9zZXQoKSBidXQgYWRkaXRpb25hbGx5IG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm8gYWxpYXNpbmcgZWZmZWN0IGNhbiBoYXBwZW4gKHdoaWNoCisgICAgICAqIGlzIHRoZSBjYXNlIHdoZW4gY3JlYXRpbmcgYSBuZXcgbWF0cml4KSBzbyBvbmUgY2FuIGVuZm9yY2UgbGF6eSBldmFsdWF0aW9uLgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYpLCBfc2V0KCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgX3NldF9ub2FsaWFzKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICAvLyBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhpcyByZXNpemUgY2FsbCBzaW5jZSB0aGUgbGF6eUFzc2lnbiB3aWxsIGFueXdheXMgcmVzaXplCisgICAgICAvLyBhbmQgbGF6eUFzc2lnbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgYXNzaWduIHNlbGVjdG9yLgorICAgICAgLy9fcmVzaXplX3RvX21hdGNoKG90aGVyKTsKKyAgICAgIC8vIHRoZSAnZmFsc2UnIGJlbG93IG1lYW5zIHRvIGVuZm9yY2UgbGF6eSBldmFsdWF0aW9uLiBXZSBkb24ndCB1c2UgbGF6eUFzc2lnbigpIGJlY2F1c2UKKyAgICAgIC8vIGl0IHdvdWxkbid0IGFsbG93IHRvIGNvcHkgYSByb3ctdmVjdG9yIGludG8gYSBjb2x1bW4tdmVjdG9yLgorICAgICAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudF9ub19hbGlhcyh0aGlzLT5kZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICAgICAgcmV0dXJuIHRoaXMtPmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgX2luaXQyKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8QmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPTIsVDA+Ojp0eXBlKiA9IDApCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChib29sKE51bVRyYWl0czxUMD46OklzSW50ZWdlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbChOdW1UcmFpdHM8VDE+OjpJc0ludGVnZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVElOR19QT0lOVF9BUkdVTUVOVF9QQVNTRURfX0lOVEVHRVJfV0FTX0VYUEVDVEVEKQorICAgICAgcmVzaXplKHJvd3MsY29scyk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgX2luaXQyKGNvbnN0IFQwJiB2YWwwLCBjb25zdCBUMSYgdmFsMSwgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxCYXNlOjpTaXplQXRDb21waWxlVGltZT09MixUMD46OnR5cGUqID0gMCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKFBsYWluT2JqZWN0QmFzZSwgMikKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMF0gPSBTY2FsYXIodmFsMCk7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzFdID0gU2NhbGFyKHZhbDEpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0Mihjb25zdCBJbmRleCYgdmFsMCwgY29uc3QgSW5kZXgmIHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCAgICAoIWludGVybmFsOjppc19zYW1lPEluZGV4LFNjYWxhcj46OnZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGludGVybmFsOjppc19zYW1lPFQwLEluZGV4Pjo6dmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoaW50ZXJuYWw6OmlzX3NhbWU8VDEsSW5kZXg+Ojp2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJhc2U6OlNpemVBdENvbXBpbGVUaW1lPT0yLFQxPjo6dHlwZSogPSAwKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoUGxhaW5PYmplY3RCYXNlLCAyKQorICAgICAgbV9zdG9yYWdlLmRhdGEoKVswXSA9IFNjYWxhcih2YWwwKTsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMV0gPSBTY2FsYXIodmFsMSk7CisgICAgfQorCisgICAgLy8gVGhlIGFyZ3VtZW50IGlzIGNvbnZlcnRpYmxlIHRvIHRoZSBJbmRleCB0eXBlIGFuZCB3ZSBlaXRoZXIgaGF2ZSBhIG5vbiAxeDEgTWF0cml4LCBvciBhIGR5bmFtaWMtc2l6ZWQgQXJyYXksCisgICAgLy8gdGhlbiB0aGUgYXJndW1lbnQgaXMgbWVhbnQgdG8gYmUgdGhlIHNpemUgb2YgdGhlIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShJbmRleCBzaXplLCB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCAgICAoQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPTEgfHwgIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxULCBTY2FsYXI+Ojp2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlhwcktpbmQsQXJyYXlYcHI+Ojp2YWx1ZSB8fCBCYXNlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYykpLFQ+Ojp0eXBlKiA9IDApCisgICAgeworICAgICAgLy8gTk9URSBNU1ZDIDIwMDggY29tcGxhaW5zIGlmIHdlIGRpcmVjdGx5IHB1dCBib29sKE51bVRyYWl0czxUPjo6SXNJbnRlZ2VyKSBhcyB0aGUgRUlHRU5fU1RBVElDX0FTU0VSVCBhcmd1bWVudC4KKyAgICAgIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IE51bVRyYWl0czxUPjo6SXNJbnRlZ2VyOworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGlzX2ludGVnZXIpOworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChpc19pbnRlZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVElOR19QT0lOVF9BUkdVTUVOVF9QQVNTRURfX0lOVEVHRVJfV0FTX0VYUEVDVEVEKQorICAgICAgcmVzaXplKHNpemUpOworICAgIH0KKyAgICAKKyAgICAvLyBXZSBoYXZlIGEgMXgxIG1hdHJpeC9hcnJheSA9PiB0aGUgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSB1bmlxdWUgY29lZmZpY2llbnQgKGNhc2Ugd2hlcmUgc2NhbGFyIHR5cGUgY2FuIGJlIGltcGxpY2l0ZWx5IGNvbnZlcnRlZCkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBTY2FsYXImIHZhbDAsIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8QmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PTEgJiYgaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPFQsIFNjYWxhcj46OnZhbHVlLFQ+Ojp0eXBlKiA9IDApCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShQbGFpbk9iamVjdEJhc2UsIDEpCisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzBdID0gdmFsMDsKKyAgICB9CisgICAgCisgICAgLy8gV2UgaGF2ZSBhIDF4MSBtYXRyaXgvYXJyYXkgPT4gdGhlIGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgdW5pcXVlIGNvZWZmaWNpZW50IChjYXNlIHdoZXJlIHNjYWxhciB0eXBlIG1hdGNoIHRoZSBpbmRleCB0eXBlKQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgX2luaXQxKGNvbnN0IEluZGV4JiB2YWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwgICAgKCFpbnRlcm5hbDo6aXNfc2FtZTxJbmRleCxTY2FsYXI+Ojp2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbnRlcm5hbDo6aXNfc2FtZTxJbmRleCxUPjo6dmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBCYXNlOjpTaXplQXRDb21waWxlVGltZT09MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPFQsIFNjYWxhcj46OnZhbHVlLFQqPjo6dHlwZSogPSAwKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoUGxhaW5PYmplY3RCYXNlLCAxKQorICAgICAgbV9zdG9yYWdlLmRhdGEoKVswXSA9IFNjYWxhcih2YWwwKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGEgZml4ZWQgc2l6ZSBtYXRyaXggZnJvbSBhIHBvaW50ZXIgdG8gcmF3IGRhdGEKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBTY2FsYXIqIGRhdGEpeworICAgICAgdGhpcy0+X3NldF9ub2FsaWFzKENvbnN0TWFwVHlwZShkYXRhKSk7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBhbiBhcmJpdHJhcnkgbWF0cml4IGZyb20gYSBkZW5zZSBleHByZXNzaW9uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpeworICAgICAgdGhpcy0+X3NldF9ub2FsaWFzKG90aGVyKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGFuIGFyYml0cmFyeSBtYXRyaXggZnJvbSBhbiBvYmplY3QgY29udmVydGlibGUgdG8gdGhlIERlcml2ZWQgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBEZXJpdmVkJiBvdGhlcil7CisgICAgICB0aGlzLT5fc2V0X25vYWxpYXMob3RoZXIpOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgYW4gYXJiaXRyYXJ5IG1hdHJpeCBmcm9tIGEgZ2VuZXJpYyBFaWdlbiBleHByZXNzaW9uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpeworICAgICAgdGhpcy0+ZGVyaXZlZCgpID0gb3RoZXI7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIHJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICBvdGhlci5ldmFsVG8odGhpcy0+ZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGludCBDb2xzQXRDb21waWxlVGltZT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfaW5pdDEoY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCisgICAgeworICAgICAgdGhpcy0+ZGVyaXZlZCgpID0gcjsKKyAgICB9CisgICAgCisgICAgLy8gRm9yIGZpeGVkLXNpemUgQXJyYXk8U2NhbGFyLC4uLj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBTY2FsYXImIHZhbDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCAgICBCYXNlOjpTaXplQXRDb21waWxlVGltZSE9RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxULCBTY2FsYXI+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6WHByS2luZCxBcnJheVhwcj46OnZhbHVlLFQ+Ojp0eXBlKiA9IDApCisgICAgeworICAgICAgQmFzZTo6c2V0Q29uc3RhbnQodmFsMCk7CisgICAgfQorICAgIAorICAgIC8vIEZvciBmaXhlZC1zaXplIEFycmF5PEluZGV4LC4uLj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MShjb25zdCBJbmRleCYgdmFsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8ICAgICghaW50ZXJuYWw6OmlzX3NhbWU8SW5kZXgsU2NhbGFyPjo6dmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoaW50ZXJuYWw6OmlzX3NhbWU8SW5kZXgsVD46OnZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJhc2U6OlNpemVBdENvbXBpbGVUaW1lIT0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8VCwgU2NhbGFyPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlhwcktpbmQsQXJyYXlYcHI+Ojp2YWx1ZSxUKj46OnR5cGUqID0gMCkKKyAgICB7CisgICAgICBCYXNlOjpzZXRDb25zdGFudCh2YWwwKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZUEsIHR5cGVuYW1lIE1hdHJpeFR5cGVCLCBib29sIFN3YXBQb2ludGVycz4KKyAgICBmcmllbmQgc3RydWN0IGludGVybmFsOjptYXRyaXhfc3dhcF9pbXBsOworCisgIHB1YmxpYzoKKyAgICAKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxicmllZiBPdmVycmlkZSBEZW5zZUJhc2U6OnN3YXAoKSBzaW5jZSBmb3IgZHluYW1pYy1zaXplZCBtYXRyaWNlcworICAgICAgKiBvZiBzYW1lIHR5cGUgaXQgaXMgZW5vdWdoIHRvIHN3YXAgdGhlIGRhdGEgcG9pbnRlcnMuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgc3dhcChEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiAmIG90aGVyKQorICAgIHsKKyAgICAgIGVudW0geyBTd2FwUG9pbnRlcnMgPSBpbnRlcm5hbDo6aXNfc2FtZTxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+Ojp2YWx1ZSAmJiBCYXNlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYyB9OworICAgICAgaW50ZXJuYWw6Om1hdHJpeF9zd2FwX2ltcGw8RGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBib29sKFN3YXBQb2ludGVycyk+OjpydW4odGhpcy0+ZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxicmllZiBjb25zdCB2ZXJzaW9uIGZvcndhcmRlZCB0byBEZW5zZUJhc2U6OnN3YXAKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBzd2FwKERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+IGNvbnN0ICYgb3RoZXIpCisgICAgeyBCYXNlOjpzd2FwKG90aGVyLmRlcml2ZWQoKSk7IH0KKyAgICAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyAKKyAgICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVJR0VOX0lNUExJRVMoTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEgJiYgTWF4Q29sc0F0Q29tcGlsZVRpbWUhPTEsIChPcHRpb25zJlJvd01ham9yKT09Um93TWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBFSUdFTl9JTVBMSUVTKE1heENvbHNBdENvbXBpbGVUaW1lPT0xICYmIE1heFJvd3NBdENvbXBpbGVUaW1lIT0xLCAoT3B0aW9ucyZSb3dNYWpvcik9PTApCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHx8IChSb3dzQXRDb21waWxlVGltZSA+PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgoQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgfHwgKENvbHNBdENvbXBpbGVUaW1lID49IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChNYXhSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB8fCAoTWF4Um93c0F0Q29tcGlsZVRpbWUgPj0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKE1heENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHx8IChNYXhDb2xzQXRDb21waWxlVGltZSA+PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChNYXhSb3dzQXRDb21waWxlVGltZSA9PSBSb3dzQXRDb21waWxlVGltZSB8fCBSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChNYXhDb2xzQXRDb21waWxlVGltZSA9PSBDb2xzQXRDb21waWxlVGltZSB8fCBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChPcHRpb25zICYgKERvbnRBbGlnbnxSb3dNYWpvcikpID09IE9wdGlvbnMpLAorICAgICAgICBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTKQorICAgIH0KKworICAgIGVudW0geyBJc1BsYWluT2JqZWN0QmFzZSA9IDEgfTsKKyNlbmRpZgorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBJc1ZlY3Rvcj4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfcmVzaXplX2xpa2VfaW1wbAoreworICBzdGF0aWMgdm9pZCBydW4oRGVuc2VCYXNlPERlcml2ZWQ+JiBfdGhpcywgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgeworICAgIGlmIChfdGhpcy5yb3dzKCkgPT0gcm93cyAmJiBfdGhpcy5jb2xzKCkgPT0gY29scykgcmV0dXJuOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfRFlOQU1JQ19TSVpFKERlcml2ZWQpCisKKyAgICBpZiAoICggRGVyaXZlZDo6SXNSb3dNYWpvciAmJiBfdGhpcy5jb2xzKCkgPT0gY29scykgfHwgLy8gcm93LW1ham9yIGFuZCB3ZSBjaGFuZ2Ugb25seSB0aGUgbnVtYmVyIG9mIHJvd3MKKyAgICAgICAgICghRGVyaXZlZDo6SXNSb3dNYWpvciAmJiBfdGhpcy5yb3dzKCkgPT0gcm93cykgKSAgLy8gY29sdW1uLW1ham9yIGFuZCB3ZSBjaGFuZ2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdzxEZXJpdmVkOjpNYXhTaXplQXRDb21waWxlVGltZT46OnJ1bihyb3dzLCBjb2xzKTsKKyAgICAgIF90aGlzLmRlcml2ZWQoKS5tX3N0b3JhZ2UuY29uc2VydmF0aXZlUmVzaXplKHJvd3MqY29scyxyb3dzLGNvbHMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gVGhlIHN0b3JhZ2Ugb3JkZXIgZG9lcyBub3QgYWxsb3cgdXMgdG8gdXNlIHJlYWxsb2NhdGlvbi4KKyAgICAgIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IHRtcChyb3dzLGNvbHMpOworICAgICAgY29uc3QgSW5kZXggY29tbW9uX3Jvd3MgPSBudW1leHQ6Om1pbmkocm93cywgX3RoaXMucm93cygpKTsKKyAgICAgIGNvbnN0IEluZGV4IGNvbW1vbl9jb2xzID0gbnVtZXh0OjptaW5pKGNvbHMsIF90aGlzLmNvbHMoKSk7CisgICAgICB0bXAuYmxvY2soMCwwLGNvbW1vbl9yb3dzLGNvbW1vbl9jb2xzKSA9IF90aGlzLmJsb2NrKDAsMCxjb21tb25fcm93cyxjb21tb25fY29scyk7CisgICAgICBfdGhpcy5kZXJpdmVkKCkuc3dhcCh0bXApOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHJ1bihEZW5zZUJhc2U8RGVyaXZlZD4mIF90aGlzLCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgIHsKKyAgICBpZiAoX3RoaXMucm93cygpID09IG90aGVyLnJvd3MoKSAmJiBfdGhpcy5jb2xzKCkgPT0gb3RoZXIuY29scygpKSByZXR1cm47CisKKyAgICAvLyBOb3RlOiBIZXJlIGlzIHNwYWNlIGZvciBpbXByb3ZlbWVudC4gQmFzaWNhbGx5LCBmb3IgY29uc2VydmF0aXZlUmVzaXplKEluZGV4LEluZGV4KSwKKyAgICAvLyBuZWl0aGVyIFJvd3NBdENvbXBpbGVUaW1lIG9yIENvbHNBdENvbXBpbGVUaW1lIG11c3QgYmUgRHluYW1pYy4gSWYgb25seSBvbmUgb2YgdGhlCisgICAgLy8gZGltZW5zaW9ucyBpcyBkeW5hbWljLCBvbmUgY291bGQgdXNlIGVpdGhlciBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggcm93cywgTm9DaGFuZ2VfdCkgb3IKKyAgICAvLyBjb25zZXJ2YXRpdmVSZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXggY29scykuIEZvciB0aGVzZSBtZXRob2RzIG5ldyBzdGF0aWMgYXNzZXJ0cyBsaWtlCisgICAgLy8gRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1JPV1MgYW5kIEVJR0VOX1NUQVRJQ19BU1NFUlRfRFlOQU1JQ19DT0xTIHdvdWxkIGJlIGdvb2QuCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1NJWkUoRGVyaXZlZCkKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0RZTkFNSUNfU0laRShPdGhlckRlcml2ZWQpCisKKyAgICBpZiAoICggRGVyaXZlZDo6SXNSb3dNYWpvciAmJiBfdGhpcy5jb2xzKCkgPT0gb3RoZXIuY29scygpKSB8fCAvLyByb3ctbWFqb3IgYW5kIHdlIGNoYW5nZSBvbmx5IHRoZSBudW1iZXIgb2Ygcm93cworICAgICAgICAgKCFEZXJpdmVkOjpJc1Jvd01ham9yICYmIF90aGlzLnJvd3MoKSA9PSBvdGhlci5yb3dzKCkpICkgIC8vIGNvbHVtbi1tYWpvciBhbmQgd2UgY2hhbmdlIG9ubHkgdGhlIG51bWJlciBvZiBjb2x1bW5zCisgICAgeworICAgICAgY29uc3QgSW5kZXggbmV3X3Jvd3MgPSBvdGhlci5yb3dzKCkgLSBfdGhpcy5yb3dzKCk7CisgICAgICBjb25zdCBJbmRleCBuZXdfY29scyA9IG90aGVyLmNvbHMoKSAtIF90aGlzLmNvbHMoKTsKKyAgICAgIF90aGlzLmRlcml2ZWQoKS5tX3N0b3JhZ2UuY29uc2VydmF0aXZlUmVzaXplKG90aGVyLnNpemUoKSxvdGhlci5yb3dzKCksb3RoZXIuY29scygpKTsKKyAgICAgIGlmIChuZXdfcm93cz4wKQorICAgICAgICBfdGhpcy5ib3R0b21SaWdodENvcm5lcihuZXdfcm93cywgb3RoZXIuY29scygpKSA9IG90aGVyLmJvdHRvbVJvd3MobmV3X3Jvd3MpOworICAgICAgZWxzZSBpZiAobmV3X2NvbHM+MCkKKyAgICAgICAgX3RoaXMuYm90dG9tUmlnaHRDb3JuZXIob3RoZXIucm93cygpLCBuZXdfY29scykgPSBvdGhlci5yaWdodENvbHMobmV3X2NvbHMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gVGhlIHN0b3JhZ2Ugb3JkZXIgZG9lcyBub3QgYWxsb3cgdXMgdG8gdXNlIHJlYWxsb2NhdGlvbi4KKyAgICAgIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IHRtcChvdGhlcik7CisgICAgICBjb25zdCBJbmRleCBjb21tb25fcm93cyA9IG51bWV4dDo6bWluaSh0bXAucm93cygpLCBfdGhpcy5yb3dzKCkpOworICAgICAgY29uc3QgSW5kZXggY29tbW9uX2NvbHMgPSBudW1leHQ6Om1pbmkodG1wLmNvbHMoKSwgX3RoaXMuY29scygpKTsKKyAgICAgIHRtcC5ibG9jaygwLDAsY29tbW9uX3Jvd3MsY29tbW9uX2NvbHMpID0gX3RoaXMuYmxvY2soMCwwLGNvbW1vbl9yb3dzLGNvbW1vbl9jb2xzKTsKKyAgICAgIF90aGlzLmRlcml2ZWQoKS5zd2FwKHRtcCk7CisgICAgfQorICB9Cit9OworCisvLyBIZXJlLCB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIHZlY3RvcnMgaW5oZXJpdHMgZnJvbSB0aGUgZ2VuZXJhbCBtYXRyaXggY2FzZQorLy8gdG8gYWxsb3cgY2FsbGluZyAuY29uc2VydmF0aXZlUmVzaXplKHJvd3MsY29scykgb24gdmVjdG9ycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw8RGVyaXZlZCxPdGhlckRlcml2ZWQsdHJ1ZT4KKyAgOiBjb25zZXJ2YXRpdmVfcmVzaXplX2xpa2VfaW1wbDxEZXJpdmVkLE90aGVyRGVyaXZlZCxmYWxzZT4KK3sKKyAgdXNpbmcgY29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw8RGVyaXZlZCxPdGhlckRlcml2ZWQsZmFsc2U+OjpydW47CisgIAorICBzdGF0aWMgdm9pZCBydW4oRGVuc2VCYXNlPERlcml2ZWQ+JiBfdGhpcywgSW5kZXggc2l6ZSkKKyAgeworICAgIGNvbnN0IEluZGV4IG5ld19yb3dzID0gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyAxIDogc2l6ZTsKKyAgICBjb25zdCBJbmRleCBuZXdfY29scyA9IERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lPT0xID8gc2l6ZSA6IDE7CisgICAgX3RoaXMuZGVyaXZlZCgpLm1fc3RvcmFnZS5jb25zZXJ2YXRpdmVSZXNpemUoc2l6ZSxuZXdfcm93cyxuZXdfY29scyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBydW4oRGVuc2VCYXNlPERlcml2ZWQ+JiBfdGhpcywgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgaWYgKF90aGlzLnJvd3MoKSA9PSBvdGhlci5yb3dzKCkgJiYgX3RoaXMuY29scygpID09IG90aGVyLmNvbHMoKSkgcmV0dXJuOworCisgICAgY29uc3QgSW5kZXggbnVtX25ld19lbGVtZW50cyA9IG90aGVyLnNpemUoKSAtIF90aGlzLnNpemUoKTsKKworICAgIGNvbnN0IEluZGV4IG5ld19yb3dzID0gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyAxIDogb3RoZXIucm93cygpOworICAgIGNvbnN0IEluZGV4IG5ld19jb2xzID0gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyBvdGhlci5jb2xzKCkgOiAxOworICAgIF90aGlzLmRlcml2ZWQoKS5tX3N0b3JhZ2UuY29uc2VydmF0aXZlUmVzaXplKG90aGVyLnNpemUoKSxuZXdfcm93cyxuZXdfY29scyk7CisKKyAgICBpZiAobnVtX25ld19lbGVtZW50cyA+IDApCisgICAgICBfdGhpcy50YWlsKG51bV9uZXdfZWxlbWVudHMpID0gb3RoZXIudGFpbChudW1fbmV3X2VsZW1lbnRzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZUEsIHR5cGVuYW1lIE1hdHJpeFR5cGVCLCBib29sIFN3YXBQb2ludGVycz4KK3N0cnVjdCBtYXRyaXhfc3dhcF9pbXBsCit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oTWF0cml4VHlwZUEmIGEsIE1hdHJpeFR5cGVCJiBiKQorICB7CisgICAgYS5iYXNlKCkuc3dhcChiKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZUEsIHR5cGVuYW1lIE1hdHJpeFR5cGVCPgorc3RydWN0IG1hdHJpeF9zd2FwX2ltcGw8TWF0cml4VHlwZUEsIE1hdHJpeFR5cGVCLCB0cnVlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKE1hdHJpeFR5cGVBJiBhLCBNYXRyaXhUeXBlQiYgYikKKyAgeworICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIE1hdHJpeFR5cGVBOjpCYXNlJj4oYSkubV9zdG9yYWdlLnN3YXAoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgTWF0cml4VHlwZUI6OkJhc2UmPihiKS5tX3N0b3JhZ2UpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERU5TRVNUT1JBR0VCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1Byb2R1Y3QuaCBiL0VpZ2VuL3NyYy9Db3JlL1Byb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBjOTRiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvUHJvZHVjdC5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9uLCB0eXBlbmFtZSBTdG9yYWdlS2luZD4gY2xhc3MgUHJvZHVjdEltcGw7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9uPgorc3RydWN0IHRyYWl0czxQcm9kdWN0PExocywgUmhzLCBPcHRpb24+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGUgTGhzQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFJocz46OnR5cGUgUmhzQ2xlYW5lZDsKKyAgdHlwZWRlZiB0cmFpdHM8TGhzQ2xlYW5lZD4gTGhzVHJhaXRzOworICB0eXBlZGVmIHRyYWl0czxSaHNDbGVhbmVkPiBSaHNUcmFpdHM7CisgIAorICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czx0eXBlbmFtZSB0cmFpdHM8TGhzQ2xlYW5lZD46OlNjYWxhciwgdHlwZW5hbWUgdHJhaXRzPFJoc0NsZWFuZWQ+OjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIExoc1RyYWl0czo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNUcmFpdHM6OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnByb2R1Y3RfdHlwZTxMaHMsUmhzPjo6cmV0Pjo6cmV0IFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTx0eXBlbmFtZSBMaHNUcmFpdHM6OlN0b3JhZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmhzVHJhaXRzOjpTdG9yYWdlSW5kZXg+Ojp0eXBlIFN0b3JhZ2VJbmRleDsKKyAgCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lICAgID0gTGhzVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSAgICA9IFJoc1RyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBMaHNUcmFpdHM6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gUmhzVHJhaXRzOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICAKKyAgICAvLyBGSVhNRTogb25seSBuZWVkZWQgYnkgR2VuZXJhbE1hdHJpeE1hdHJpeFRyaWFuZ3VsYXIKKyAgICBJbm5lclNpemUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTGhzVHJhaXRzOjpDb2xzQXRDb21waWxlVGltZSwgUmhzVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZSksCisgICAgCisgICAgLy8gVGhlIHN0b3JhZ2Ugb3JkZXIgaXMgc29tZXdoYXQgYXJiaXRyYXJ5IGhlcmUuIFRoZSBjb3JyZWN0IG9uZSB3aWxsIGJlIGRldGVybWluZWQgdGhyb3VnaCB0aGUgZXZhbHVhdG9yLgorICAgIEZsYWdzID0gKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT0xKSA/IFJvd01ham9yQml0CisgICAgICAgICAgOiAoTWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEgJiYgTWF4Um93c0F0Q29tcGlsZVRpbWUhPTEpID8gMAorICAgICAgICAgIDogKCAgICgoTGhzVHJhaXRzOjpGbGFncyZOb1ByZWZlcnJlZFN0b3JhZ2VPcmRlckJpdCkgJiYgKFJoc1RyYWl0czo6RmxhZ3MmUm93TWFqb3JCaXQpKQorICAgICAgICAgICAgIHx8ICgoUmhzVHJhaXRzOjpGbGFncyZOb1ByZWZlcnJlZFN0b3JhZ2VPcmRlckJpdCkgJiYgKExoc1RyYWl0czo6RmxhZ3MmUm93TWFqb3JCaXQpKSApID8gUm93TWFqb3JCaXQKKyAgICAgICAgICA6IE5vUHJlZmVycmVkU3RvcmFnZU9yZGVyQml0CisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxjbGFzcyBQcm9kdWN0CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIHRoZSBwcm9kdWN0IG9mIHR3byBhcmJpdHJhcnkgbWF0cmljZXMgb3IgdmVjdG9ycworICAqCisgICogXHRwYXJhbSBfTGhzIHRoZSB0eXBlIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZSBleHByZXNzaW9uCisgICogXHRwYXJhbSBfUmhzIHRoZSB0eXBlIG9mIHRoZSByaWdodC1oYW5kIHNpZGUgZXhwcmVzc2lvbgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgdGhlIHByb2R1Y3Qgb2YgdHdvIGFyYml0cmFyeSBtYXRyaWNlcy4KKyAgKgorICAqIFRoZSBvdGhlciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZToKKyAgKiBcdHBhcmFtIE9wdGlvbiAgICAgY2FuIGJlIERlZmF1bHRQcm9kdWN0LCBBbGlhc0ZyZWVQcm9kdWN0LCBvciBMYXp5UHJvZHVjdAorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzLCB0eXBlbmFtZSBfUmhzLCBpbnQgT3B0aW9uPgorY2xhc3MgUHJvZHVjdCA6IHB1YmxpYyBQcm9kdWN0SW1wbDxfTGhzLF9SaHMsT3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPF9MaHM+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxfUmhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwcm9kdWN0X3R5cGU8X0xocyxfUmhzPjo6cmV0Pjo6cmV0PgoreworICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTGhzIExoczsKKyAgICB0eXBlZGVmIF9SaHMgUmhzOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdEltcGw8CisgICAgICAgIExocywgUmhzLCBPcHRpb24sCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UmhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwcm9kdWN0X3R5cGU8TGhzLFJocz46OnJldD46OnJldD46OkJhc2UgQmFzZTsKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoUHJvZHVjdCkKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxMaHM+Ojp0eXBlIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWZfc2VsZWN0b3I8UmhzPjo6dHlwZSBSaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlIExoc05lc3RlZENsZWFuZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxSaHNOZXN0ZWQ+Ojp0eXBlIFJoc05lc3RlZENsZWFuZWQ7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBtX2xocyhsaHMpLCBtX3JocyhyaHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGxocy5jb2xzKCkgPT0gcmhzLnJvd3MoKQorICAgICAgICAmJiAiaW52YWxpZCBtYXRyaXggcHJvZHVjdCIKKyAgICAgICAgJiYgImlmIHlvdSB3YW50ZWQgYSBjb2VmZi13aXNlIG9yIGEgZG90IHByb2R1Y3QgdXNlIHRoZSByZXNwZWN0aXZlIGV4cGxpY2l0IGZ1bmN0aW9ucyIpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9saHMucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IExoc05lc3RlZENsZWFuZWQmIGxocygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgUmhzTmVzdGVkQ2xlYW5lZCYgcmhzKCkgY29uc3QgeyByZXR1cm4gbV9yaHM7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBMaHNOZXN0ZWQgbV9saHM7CisgICAgUmhzTmVzdGVkIG1fcmhzOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbiwgaW50IFByb2R1Y3RUYWcgPSBpbnRlcm5hbDo6cHJvZHVjdF90eXBlPExocyxSaHM+OjpyZXQ+CitjbGFzcyBkZW5zZV9wcm9kdWN0X2Jhc2UKKyA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UHJvZHVjdDxMaHMsUmhzLE9wdGlvbj4gPjo6dHlwZQore307CisKKy8qKiBDb252ZXJ0aW9uIHRvIHNjYWxhciBmb3IgaW5uZXItcHJvZHVjdHMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9uPgorY2xhc3MgZGVuc2VfcHJvZHVjdF9iYXNlPExocywgUmhzLCBPcHRpb24sIElubmVyUHJvZHVjdD4KKyA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UHJvZHVjdDxMaHMsUmhzLE9wdGlvbj4gPjo6dHlwZQoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLFJocyxPcHRpb24+IFByb2R1Y3RYcHI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPFByb2R1Y3RYcHI+Ojp0eXBlIEJhc2U7CitwdWJsaWM6CisgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIG9wZXJhdG9yIGNvbnN0IFNjYWxhcigpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmV2YWx1YXRvcjxQcm9kdWN0WHByPihkZXJpdmVkKCkpLmNvZWZmKDAsMCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEdlbmVyaWMgQVBJIGRpc3BhdGNoZXIKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9uLCB0eXBlbmFtZSBTdG9yYWdlS2luZD4KK2NsYXNzIFByb2R1Y3RJbXBsIDogcHVibGljIGludGVybmFsOjpnZW5lcmljX3hwcl9iYXNlPFByb2R1Y3Q8TGhzLFJocyxPcHRpb24+LCBNYXRyaXhYcHIsIFN0b3JhZ2VLaW5kPjo6dHlwZQoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxQcm9kdWN0PExocyxSaHMsT3B0aW9uPiwgTWF0cml4WHByLCBTdG9yYWdlS2luZD46OnR5cGUgQmFzZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9uPgorY2xhc3MgUHJvZHVjdEltcGw8TGhzLFJocyxPcHRpb24sRGVuc2U+CisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV9wcm9kdWN0X2Jhc2U8TGhzLFJocyxPcHRpb24+Cit7CisgICAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBPcHRpb24+IERlcml2ZWQ7CisgICAgCisgIHB1YmxpYzoKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV9wcm9kdWN0X2Jhc2U8TGhzLCBSaHMsIE9wdGlvbj4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisgIHByb3RlY3RlZDoKKyAgICBlbnVtIHsKKyAgICAgIElzT25lQnlPbmUgPSAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoQ29sc0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSwKKyAgICAgIEVuYWJsZUNvZWZmID0gSXNPbmVCeU9uZSB8fCBPcHRpb249PUxhenlQcm9kdWN0CisgICAgfTsKKyAgICAKKyAgcHVibGljOgorICAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFbmFibGVDb2VmZiwgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfSU5ORVJfT1JfTEFaWV9QUk9EVUNUUyk7CisgICAgICBlaWdlbl9hc3NlcnQoIChPcHRpb249PUxhenlQcm9kdWN0KSB8fCAodGhpcy0+cm93cygpID09IDEgJiYgdGhpcy0+Y29scygpID09IDEpICk7CisgICAgICAKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+KGRlcml2ZWQoKSkuY29lZmYocm93LGNvbCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyIGNvZWZmKEluZGV4IGkpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFbmFibGVDb2VmZiwgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfSU5ORVJfT1JfTEFaWV9QUk9EVUNUUyk7CisgICAgICBlaWdlbl9hc3NlcnQoIChPcHRpb249PUxhenlQcm9kdWN0KSB8fCAodGhpcy0+cm93cygpID09IDEgJiYgdGhpcy0+Y29scygpID09IDEpICk7CisgICAgICAKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+KGRlcml2ZWQoKSkuY29lZmYoaSk7CisgICAgfQorICAgIAorICAKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Qcm9kdWN0RXZhbHVhdG9ycy5oIGIvRWlnZW4vc3JjL0NvcmUvUHJvZHVjdEV2YWx1YXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI3MjVkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvUHJvZHVjdEV2YWx1YXRvcnMuaApAQCAtMCwwICsxLDExMDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMSBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjaWZuZGVmIEVJR0VOX1BST0RVQ1RFVkFMVUFUT1JTX0gKKyNkZWZpbmUgRUlHRU5fUFJPRFVDVEVWQUxVQVRPUlNfSAorCituYW1lc3BhY2UgRWlnZW4geworICAKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBFdmFsdWF0b3Igb2YgYSBwcm9kdWN0IGV4cHJlc3Npb24uCisgICogU2luY2UgcHJvZHVjdHMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudHMgdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBjYXNlcywKKyAgKiB3ZSBzaW1wbHkgZGVmZmVyIHRoZSBldmFsdWF0aW9uIGxvZ2ljIHRvIGEgcHJvZHVjdF9ldmFsdWF0b3IgY2xhc3MKKyAgKiB3aGljaCBvZmZlcnMgbW9yZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHBvc3NpYmlsaXRpZXMuCisgICogCisgICogXHNhIGNsYXNzIHByb2R1Y3RfZXZhbHVhdG9yCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbnM+CitzdHJ1Y3QgZXZhbHVhdG9yPFByb2R1Y3Q8TGhzLCBSaHMsIE9wdGlvbnM+ID4gCisgOiBwdWJsaWMgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgT3B0aW9ucz4gPgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLCBSaHMsIE9wdGlvbnM+IFhwclR5cGU7CisgIHR5cGVkZWYgcHJvZHVjdF9ldmFsdWF0b3I8WHByVHlwZT4gQmFzZTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpIDogQmFzZSh4cHIpIHt9Cit9OworIAorLy8gQ2F0Y2ggInNjYWxhciAqICggQSAqIEIgKSIgYW5kIHRyYW5zZm9ybSBpdCB0byAiKEEqc2NhbGFyKSAqIEIiCisvLyBUT0RPIHdlIHNob3VsZCBhcHBseSB0aGF0IHJ1bGUgb25seSBpZiB0aGF0J3MgcmVhbGx5IGhlbHBmdWwKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBTY2FsYXIxLCB0eXBlbmFtZSBTY2FsYXIyLCB0eXBlbmFtZSBQbGFpbjE+CitzdHJ1Y3QgZXZhbHVhdG9yX2Fzc3VtZV9hbGlhc2luZzxDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXIxLFNjYWxhcjI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcjE+LCBQbGFpbjE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9kdWN0PExocywgUmhzLCBEZWZhdWx0UHJvZHVjdD4gPiA+Cit7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU2NhbGFyMSwgdHlwZW5hbWUgU2NhbGFyMiwgdHlwZW5hbWUgUGxhaW4xPgorc3RydWN0IGV2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXIxLFNjYWxhcjI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyMT4sIFBsYWluMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+ID4gPgorIDogcHVibGljIGV2YWx1YXRvcjxQcm9kdWN0PEVJR0VOX1NDQUxBUl9CSU5BUllPUF9FWFBSX1JFVFVSTl9UWVBFKFNjYWxhcjEsTGhzLHByb2R1Y3QpLCBSaHMsIERlZmF1bHRQcm9kdWN0PiA+Cit7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyMSxTY2FsYXIyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcjE+LCBQbGFpbjE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2R1Y3Q8TGhzLCBSaHMsIERlZmF1bHRQcm9kdWN0PiA+IFhwclR5cGU7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFByb2R1Y3Q8RUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoU2NhbGFyMSxMaHMscHJvZHVjdCksIFJocywgRGVmYXVsdFByb2R1Y3Q+ID4gQmFzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogQmFzZSh4cHIubGhzKCkuZnVuY3RvcigpLm1fb3RoZXIgKiB4cHIucmhzKCkubGhzKCkgKiB4cHIucmhzKCkucmhzKCkpCisgIHt9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgRGlhZ0luZGV4Pgorc3RydWN0IGV2YWx1YXRvcjxEaWFnb25hbDxjb25zdCBQcm9kdWN0PExocywgUmhzLCBEZWZhdWx0UHJvZHVjdD4sIERpYWdJbmRleD4gPiAKKyA6IHB1YmxpYyBldmFsdWF0b3I8RGlhZ29uYWw8Y29uc3QgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+LCBEaWFnSW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBEaWFnb25hbDxjb25zdCBQcm9kdWN0PExocywgUmhzLCBEZWZhdWx0UHJvZHVjdD4sIERpYWdJbmRleD4gWHByVHlwZTsKKyAgdHlwZWRlZiBldmFsdWF0b3I8RGlhZ29uYWw8Y29uc3QgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+LCBEaWFnSW5kZXg+ID4gQmFzZTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBCYXNlKERpYWdvbmFsPGNvbnN0IFByb2R1Y3Q8TGhzLCBSaHMsIExhenlQcm9kdWN0PiwgRGlhZ0luZGV4PigKKyAgICAgICAgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+KHhwci5uZXN0ZWRFeHByZXNzaW9uKCkubGhzKCksIHhwci5uZXN0ZWRFeHByZXNzaW9uKCkucmhzKCkpLAorICAgICAgICB4cHIuaW5kZXgoKSApKQorICB7fQorfTsKKworCisvLyBIZWxwZXIgY2xhc3MgdG8gcGVyZm9ybSBhIG1hdHJpeCBwcm9kdWN0IHdpdGggdGhlIGRlc3RpbmF0aW9uIGF0IGhhbmQuCisvLyBEZXBlbmRpbmcgb24gdGhlIHNpemVzIG9mIHRoZSBmYWN0b3JzLCB0aGVyZSBhcmUgZGlmZmVyZW50IGV2YWx1YXRpb24gc3RyYXRlZ2llcworLy8gYXMgY29udHJvbGxlZCBieSBpbnRlcm5hbDo6cHJvZHVjdF90eXBlLgordGVtcGxhdGU8IHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLAorICAgICAgICAgIHR5cGVuYW1lIExoc1NoYXBlID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czxMaHM+OjpTaGFwZSwKKyAgICAgICAgICB0eXBlbmFtZSBSaHNTaGFwZSA9IHR5cGVuYW1lIGV2YWx1YXRvcl90cmFpdHM8UmhzPjo6U2hhcGUsCisgICAgICAgICAgaW50IFByb2R1Y3RUeXBlID0gaW50ZXJuYWw6OnByb2R1Y3RfdHlwZTxMaHMsUmhzPjo6dmFsdWU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGV2YWx1YXRvcl9hc3N1bWVfYWxpYXNpbmc8UHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+ID4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGV2YWx1YXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgcHJvZHVjdHM6CisvLyBJdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IGFuZCBjYWxsIGdlbmVyaWNfcHJvZHVjdF9pbXBsCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbnMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBMaHNTaGFwZSwgdHlwZW5hbWUgUmhzU2hhcGU+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgT3B0aW9ucz4sIFByb2R1Y3RUYWcsIExoc1NoYXBlLCBSaHNTaGFwZT4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yPHR5cGVuYW1lIFByb2R1Y3Q8TGhzLCBSaHMsIE9wdGlvbnM+OjpQbGFpbk9iamVjdD4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBPcHRpb25zPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBCYXNlOjpGbGFncyB8IEV2YWxCZWZvcmVOZXN0aW5nQml0CisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX3Jlc3VsdCh4cHIucm93cygpLCB4cHIuY29scygpKQorICB7CisgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShtX3Jlc3VsdCk7CisgICAgCisvLyBGSVhNRSBzaGFsbCB3ZSBoYW5kbGUgbmVzdGVkX2V2YWwgaGVyZT8sCisvLyBpZiBzbywgdGhlbiB3ZSBtdXN0IHRha2UgY2FyZSBhdCByZW1vdmluZyB0aGUgY2FsbCB0byBuZXN0ZWRfZXZhbCBpbiB0aGUgc3BlY2lhbGl6YXRpb25zIChlLmcuLCBpbiBwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdCwgdHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdCwgZXRjLikKKy8vICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxMaHMsUmhzOjpDb2xzQXRDb21waWxlVGltZT46OnR5cGUgTGhzTmVzdGVkOworLy8gICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFJocyxMaHM6OlJvd3NBdENvbXBpbGVUaW1lPjo6dHlwZSBSaHNOZXN0ZWQ7CisvLyAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlIExoc05lc3RlZENsZWFuZWQ7CisvLyAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxSaHNOZXN0ZWQ+Ojp0eXBlIFJoc05lc3RlZENsZWFuZWQ7CisvLyAgICAgCisvLyAgICAgY29uc3QgTGhzTmVzdGVkIGxocyh4cHIubGhzKCkpOworLy8gICAgIGNvbnN0IFJoc05lc3RlZCByaHMoeHByLnJocygpKTsKKy8vICAgCisvLyAgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzTmVzdGVkQ2xlYW5lZCwgUmhzTmVzdGVkQ2xlYW5lZD46OmV2YWxUbyhtX3Jlc3VsdCwgbGhzLCByaHMpOworCisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIExoc1NoYXBlLCBSaHNTaGFwZSwgUHJvZHVjdFRhZz46OmV2YWxUbyhtX3Jlc3VsdCwgeHByLmxocygpLCB4cHIucmhzKCkpOworICB9CisgIAorcHJvdGVjdGVkOiAgCisgIFBsYWluT2JqZWN0IG1fcmVzdWx0OworfTsKKworLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBzaG9ydGN1dHMgYXJlIGVuYWJsZWQgb25seSBpZiB0aGUgc2NhbGFyIHR5cGVzIG1hdGNoIGV4Y2F0bHkuCisvLyBUT0RPOiB3ZSBjb3VsZCBlbmFibGUgdGhlbSBmb3IgZGlmZmVyZW50IHNjYWxhciB0eXBlcyB3aGVuIHRoZSBwcm9kdWN0IGlzIG5vdCB2ZWN0b3JpemVkLgorCisvLyBEZW5zZSA9IFByb2R1Y3QKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFByb2R1Y3Q8TGhzLFJocyxPcHRpb25zPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiwgRGVuc2UyRGVuc2UsCisgIHR5cGVuYW1lIGVuYWJsZV9pZjwoT3B0aW9ucz09RGVmYXVsdFByb2R1Y3QgfHwgT3B0aW9ucz09QWxpYXNGcmVlUHJvZHVjdCk+Ojp0eXBlPgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLFJocyxPcHRpb25zPiBTcmNYcHJUeXBlOworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiAmKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisgICAgLy8gRklYTUUgc2hhbGwgd2UgaGFuZGxlIG5lc3RlZF9ldmFsIGhlcmU/CisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHM+OjpldmFsVG8oZHN0LCBzcmMubGhzKCksIHNyYy5yaHMoKSk7CisgIH0KK307CisKKy8vIERlbnNlICs9IFByb2R1Y3QKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFByb2R1Y3Q8TGhzLFJocyxPcHRpb25zPiwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4sIERlbnNlMkRlbnNlLAorICB0eXBlbmFtZSBlbmFibGVfaWY8KE9wdGlvbnM9PURlZmF1bHRQcm9kdWN0IHx8IE9wdGlvbnM9PUFsaWFzRnJlZVByb2R1Y3QpPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocyxSaHMsT3B0aW9ucz4gU3JjWHByVHlwZTsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphZGRfYXNzaWduX29wPFNjYWxhcixTY2FsYXI+ICYpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoZHN0LnJvd3MoKSA9PSBzcmMucm93cygpICYmIGRzdC5jb2xzKCkgPT0gc3JjLmNvbHMoKSk7CisgICAgLy8gRklYTUUgc2hhbGwgd2UgaGFuZGxlIG5lc3RlZF9ldmFsIGhlcmU/CisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHM+OjphZGRUbyhkc3QsIHNyYy5saHMoKSwgc3JjLnJocygpKTsKKyAgfQorfTsKKworLy8gRGVuc2UgLT0gUHJvZHVjdAordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgUHJvZHVjdDxMaHMsUmhzLE9wdGlvbnM+LCBpbnRlcm5hbDo6c3ViX2Fzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiwgRGVuc2UyRGVuc2UsCisgIHR5cGVuYW1lIGVuYWJsZV9pZjwoT3B0aW9ucz09RGVmYXVsdFByb2R1Y3QgfHwgT3B0aW9ucz09QWxpYXNGcmVlUHJvZHVjdCk+Ojp0eXBlPgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLFJocyxPcHRpb25zPiBTcmNYcHJUeXBlOworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OnN1Yl9hc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4gJikKKyAgeworICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpID09IHNyYy5yb3dzKCkgJiYgZHN0LmNvbHMoKSA9PSBzcmMuY29scygpKTsKKyAgICAvLyBGSVhNRSBzaGFsbCB3ZSBoYW5kbGUgbmVzdGVkX2V2YWwgaGVyZT8KKyAgICBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocz46OnN1YlRvKGRzdCwgc3JjLmxocygpLCBzcmMucmhzKCkpOworICB9Cit9OworCisKKy8vIERlbnNlID89IHNjYWxhciAqIFByb2R1Y3QKKy8vIFRPRE8gd2Ugc2hvdWxkIGFwcGx5IHRoYXQgcnVsZSBpZiB0aGF0J3MgcmVhbGx5IGhlbHBmdWwKKy8vIGZvciBpbnN0YW5jZSwgdGhpcyBpcyBub3QgZ29vZCBmb3IgaW5uZXIgcHJvZHVjdHMKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgQXNzaWduRnVuYywgdHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTY2FsYXJCaXMsIHR5cGVuYW1lIFBsYWluPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyQmlzLFNjYWxhcj4sIGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyQmlzPixQbGFpbj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0PiA+LCBBc3NpZ25GdW5jLCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXJCaXMsU2NhbGFyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyQmlzPixQbGFpbj4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9kdWN0PExocyxSaHMsRGVmYXVsdFByb2R1Y3Q+ID4gU3JjWHByVHlwZTsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IEFzc2lnbkZ1bmMmIGZ1bmMpCisgIHsKKyAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZHN0LCAoc3JjLmxocygpLmZ1bmN0b3IoKS5tX290aGVyICogc3JjLnJocygpLmxocygpKSpzcmMucmhzKCkucmhzKCksIGZ1bmMpOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENhdGNoICJEZW5zZSA/PSB4cHIgKyBQcm9kdWN0PD4iIGV4cHJlc3Npb24gdG8gc2F2ZSBvbmUgdGVtcG9yYXJ5CisvLyBGSVhNRSB3ZSBjb3VsZCBwcm9iYWJseSBlbmFibGUgdGhlc2UgcnVsZXMgZm9yIGFueSBwcm9kdWN0LCBpLmUuLCBub3Qgb25seSBEZW5zZSBhbmQgRGVmYXVsdFByb2R1Y3QKKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJYcHIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGV2YWx1YXRvcl9hc3N1bWVfYWxpYXNpbmc8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBPdGhlclhwcjo6U2NhbGFyLHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocyxEZWZhdWx0UHJvZHVjdD46OlNjYWxhcj4sIGNvbnN0IE90aGVyWHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9kdWN0PExocyxSaHMsRGVmYXVsdFByb2R1Y3Q+ID4sIERlbnNlU2hhcGUgPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyWHByLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBldmFsdWF0b3JfYXNzdW1lX2FsaWFzaW5nPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPHR5cGVuYW1lIE90aGVyWHByOjpTY2FsYXIsdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0Pjo6U2NhbGFyPiwgY29uc3QgT3RoZXJYcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2R1Y3Q8TGhzLFJocyxEZWZhdWx0UHJvZHVjdD4gPiwgRGVuc2VTaGFwZSA+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgT3RoZXJYcHIsIHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBGdW5jMSwgdHlwZW5hbWUgRnVuYzI+CitzdHJ1Y3QgYXNzaWdubWVudF9mcm9tX3hwcl9vcF9wcm9kdWN0Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEluaXRpYWxGdW5jPgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgSW5pdGlhbEZ1bmMmIC8qZnVuYyovKQorICB7CisgICAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRzdCwgc3JjLmxocygpLCBGdW5jMSgpKTsKKyAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZHN0LCBzcmMucmhzKCksIEZ1bmMyKCkpOworICB9Cit9OworCisjZGVmaW5lIEVJR0VOX0NBVENIX0FTU0lHTl9YUFJfT1BfUFJPRFVDVChBU1NJR05fT1AsQklOT1AsQVNTSUdOX09QMikgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgT3RoZXJYcHIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEc3RTY2FsYXIsIHR5cGVuYW1lIFNyY1NjYWxhciwgdHlwZW5hbWUgT3RoZXJTY2FsYXIsdHlwZW5hbWUgUHJvZFNjYWxhcj4gXAorICBzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpCSU5PUDxPdGhlclNjYWxhcixQcm9kU2NhbGFyPiwgY29uc3QgT3RoZXJYcHIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0PiA+LCBpbnRlcm5hbDo6QVNTSUdOX09QPERzdFNjYWxhcixTcmNTY2FsYXI+LCBEZW5zZTJEZW5zZT4gXAorICAgIDogYXNzaWdubWVudF9mcm9tX3hwcl9vcF9wcm9kdWN0PERzdFhwclR5cGUsIE90aGVyWHByLCBQcm9kdWN0PExocyxSaHMsRGVmYXVsdFByb2R1Y3Q+LCBpbnRlcm5hbDo6QVNTSUdOX09QPERzdFNjYWxhcixPdGhlclNjYWxhcj4sIGludGVybmFsOjpBU1NJR05fT1AyPERzdFNjYWxhcixQcm9kU2NhbGFyPiA+IFwKKyAge30KKworRUlHRU5fQ0FUQ0hfQVNTSUdOX1hQUl9PUF9QUk9EVUNUKGFzc2lnbl9vcCwgICAgc2NhbGFyX3N1bV9vcCxhZGRfYXNzaWduX29wKTsKK0VJR0VOX0NBVENIX0FTU0lHTl9YUFJfT1BfUFJPRFVDVChhZGRfYXNzaWduX29wLHNjYWxhcl9zdW1fb3AsYWRkX2Fzc2lnbl9vcCk7CitFSUdFTl9DQVRDSF9BU1NJR05fWFBSX09QX1BST0RVQ1Qoc3ViX2Fzc2lnbl9vcCxzY2FsYXJfc3VtX29wLHN1Yl9hc3NpZ25fb3ApOworCitFSUdFTl9DQVRDSF9BU1NJR05fWFBSX09QX1BST0RVQ1QoYXNzaWduX29wLCAgICBzY2FsYXJfZGlmZmVyZW5jZV9vcCxzdWJfYXNzaWduX29wKTsKK0VJR0VOX0NBVENIX0FTU0lHTl9YUFJfT1BfUFJPRFVDVChhZGRfYXNzaWduX29wLHNjYWxhcl9kaWZmZXJlbmNlX29wLHN1Yl9hc3NpZ25fb3ApOworRUlHRU5fQ0FUQ0hfQVNTSUdOX1hQUl9PUF9QUk9EVUNUKHN1Yl9hc3NpZ25fb3Asc2NhbGFyX2RpZmZlcmVuY2Vfb3AsYWRkX2Fzc2lnbl9vcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxJbm5lclByb2R1Y3Q+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERzdD4KKyAgc3RhdGljIGlubGluZSB2b2lkIGV2YWxUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgZHN0LmNvZWZmUmVmKDAsMCkgPSAobGhzLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChyaHMpKS5zdW0oKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0PgorICBzdGF0aWMgaW5saW5lIHZvaWQgYWRkVG8oRHN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIGRzdC5jb2VmZlJlZigwLDApICs9IChsaHMudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KHJocykpLnN1bSgpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyB2b2lkIHN1YlRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsgZHN0LmNvZWZmUmVmKDAsMCkgLT0gKGxocy50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QocmhzKSkuc3VtKCk7IH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbXBsZW1lbnRhdGlvbiBvZiBvdXRlciBkZW5zZSAqIGRlbnNlIHZlY3RvciBwcm9kdWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gQ29sdW1uIG1ham9yIHJlc3VsdAordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRnVuYz4KK3ZvaWQgb3V0ZXJfcHJvZHVjdF9zZWxlY3Rvcl9ydW4oRHN0JiBkc3QsIGNvbnN0IExocyAmbGhzLCBjb25zdCBSaHMgJnJocywgY29uc3QgRnVuYyYgZnVuYywgY29uc3QgZmFsc2VfdHlwZSYpCit7CisgIGV2YWx1YXRvcjxSaHM+IHJoc0V2YWwocmhzKTsKKyAgdHlwZW5hbWUgbmVzdGVkX2V2YWw8TGhzLFJoczo6U2l6ZUF0Q29tcGlsZVRpbWU+Ojp0eXBlIGFjdHVhbF9saHMobGhzKTsKKyAgLy8gRklYTUUgaWYgY29scyBpcyBsYXJnZSBlbm91Z2gsIHRoZW4gaXQgbWlnaHQgYmUgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IGxocyBpcyBzZXF1ZW50aWFsbHkgc3RvcmVkCisgIC8vIEZJWE1FIG5vdCB2ZXJ5IGdvb2QgaWYgcmhzIGlzIHJlYWwgYW5kIGxocyBjb21wbGV4IHdoaWxlIGFscGhhIGlzIHJlYWwgdG9vCisgIGNvbnN0IEluZGV4IGNvbHMgPSBkc3QuY29scygpOworICBmb3IgKEluZGV4IGo9MDsgajxjb2xzOyArK2opCisgICAgZnVuYyhkc3QuY29sKGopLCByaHNFdmFsLmNvZWZmKEluZGV4KDApLGopICogYWN0dWFsX2xocyk7Cit9CisKKy8vIFJvdyBtYWpvciByZXN1bHQKK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIEZ1bmM+Cit2b2lkIG91dGVyX3Byb2R1Y3Rfc2VsZWN0b3JfcnVuKERzdCYgZHN0LCBjb25zdCBMaHMgJmxocywgY29uc3QgUmhzICZyaHMsIGNvbnN0IEZ1bmMmIGZ1bmMsIGNvbnN0IHRydWVfdHlwZSYpCit7CisgIGV2YWx1YXRvcjxMaHM+IGxoc0V2YWwobGhzKTsKKyAgdHlwZW5hbWUgbmVzdGVkX2V2YWw8UmhzLExoczo6U2l6ZUF0Q29tcGlsZVRpbWU+Ojp0eXBlIGFjdHVhbF9yaHMocmhzKTsKKyAgLy8gRklYTUUgaWYgcm93cyBpcyBsYXJnZSBlbm91Z2gsIHRoZW4gaXQgbWlnaHQgYmUgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IHJocyBpcyBzZXF1ZW50aWFsbHkgc3RvcmVkCisgIC8vIEZJWE1FIG5vdCB2ZXJ5IGdvb2QgaWYgbGhzIGlzIHJlYWwgYW5kIHJocyBjb21wbGV4IHdoaWxlIGFscGhhIGlzIHJlYWwgdG9vCisgIGNvbnN0IEluZGV4IHJvd3MgPSBkc3Qucm93cygpOworICBmb3IgKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpCisgICAgZnVuYyhkc3Qucm93KGkpLCBsaHNFdmFsLmNvZWZmKGksSW5kZXgoMCkpICogYWN0dWFsX3Jocyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxEZW5zZVNoYXBlLE91dGVyUHJvZHVjdD4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3Jvd19tYWpvciA6IGludGVybmFsOjpjb25kaXRpb25hbDwoaW50KFQ6OkZsYWdzKSZSb3dNYWpvckJpdCksIGludGVybmFsOjp0cnVlX3R5cGUsIGludGVybmFsOjpmYWxzZV90eXBlPjo6dHlwZSB7fTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICAKKyAgLy8gVE9ETyBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUgdG8gZXhwbG9pdCBvdXIgKl9hc3NpZ25fb3AgZnVuY3RvcnMgZm9yIHRoYXQgcHVycG9zZQorICBzdHJ1Y3Qgc2V0ICB7IHRlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPiB2b2lkIG9wZXJhdG9yKCkoY29uc3QgRHN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKSBjb25zdCB7IGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSAgPSBzcmM7IH0gfTsKKyAgc3RydWN0IGFkZCAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIFNyYz4gdm9pZCBvcGVyYXRvcigpKGNvbnN0IERzdCYgZHN0LCBjb25zdCBTcmMmIHNyYykgY29uc3QgeyBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkgKz0gc3JjOyB9IH07CisgIHN0cnVjdCBzdWIgIHsgdGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+IHZvaWQgb3BlcmF0b3IoKShjb25zdCBEc3QmIGRzdCwgY29uc3QgU3JjJiBzcmMpIGNvbnN0IHsgZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpIC09IHNyYzsgfSB9OworICBzdHJ1Y3QgYWRkcyB7CisgICAgU2NhbGFyIG1fc2NhbGU7CisgICAgZXhwbGljaXQgYWRkcyhjb25zdCBTY2FsYXImIHMpIDogbV9zY2FsZShzKSB7fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPiB2b2lkIG9wZXJhdG9yKCkoY29uc3QgRHN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKSBjb25zdCB7CisgICAgICBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkgKz0gbV9zY2FsZSAqIHNyYzsKKyAgICB9CisgIH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBldmFsVG8oRHN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIGludGVybmFsOjpvdXRlcl9wcm9kdWN0X3NlbGVjdG9yX3J1bihkc3QsIGxocywgcmhzLCBzZXQoKSwgaXNfcm93X21ham9yPERzdD4oKSk7CisgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIERzdD4KKyAgc3RhdGljIGlubGluZSB2b2lkIGFkZFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICBpbnRlcm5hbDo6b3V0ZXJfcHJvZHVjdF9zZWxlY3Rvcl9ydW4oZHN0LCBsaHMsIHJocywgYWRkKCksIGlzX3Jvd19tYWpvcjxEc3Q+KCkpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzdWJUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgaW50ZXJuYWw6Om91dGVyX3Byb2R1Y3Rfc2VsZWN0b3JfcnVuKGRzdCwgbGhzLCByaHMsIHN1YigpLCBpc19yb3dfbWFqb3I8RHN0PigpKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0PgorICBzdGF0aWMgaW5saW5lIHZvaWQgc2NhbGVBbmRBZGRUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgaW50ZXJuYWw6Om91dGVyX3Byb2R1Y3Rfc2VsZWN0b3JfcnVuKGRzdCwgbGhzLCByaHMsIGFkZHMoYWxwaGEpLCBpc19yb3dfbWFqb3I8RHN0PigpKTsKKyAgfQorICAKK307CisKKworLy8gVGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBldmFsVG8sIGFkZFRvLCBzdWJUbywgaW4gdGVybXMgb2Ygc2NhbGVBbmRBZGRUbwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZQoreworICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocz46OlNjYWxhciBTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZXZhbFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsgZHN0LnNldFplcm8oKTsgc2NhbGVBbmRBZGRUbyhkc3QsIGxocywgcmhzLCBTY2FsYXIoMSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0PgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFkZFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsgc2NhbGVBbmRBZGRUbyhkc3QsbGhzLCByaHMsIFNjYWxhcigxKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgc3ViVG8oRHN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeyBzY2FsZUFuZEFkZFRvKGRzdCwgbGhzLCByaHMsIFNjYWxhcigtMSkpOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgc2NhbGVBbmRBZGRUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7IERlcml2ZWQ6OnNjYWxlQW5kQWRkVG8oZHN0LGxocyxyaHMsYWxwaGEpOyB9CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxEZW5zZVNoYXBlLEdlbXZQcm9kdWN0PgorICA6IGdlbmVyaWNfcHJvZHVjdF9pbXBsX2Jhc2U8TGhzLFJocyxnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxHZW12UHJvZHVjdD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPExocywxPjo6dHlwZSBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8UmhzLDE+Ojp0eXBlIFJoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsgU2lkZSA9IExoczo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gT25UaGVMZWZ0IDogT25UaGVSaWdodCB9OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxpbnQoU2lkZSk9PU9uVGhlUmlnaHQsTGhzTmVzdGVkLFJoc05lc3RlZD46OnR5cGU+Ojp0eXBlIE1hdHJpeFR5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgTGhzTmVzdGVkIGFjdHVhbF9saHMobGhzKTsKKyAgICBSaHNOZXN0ZWQgYWN0dWFsX3JocyhyaHMpOworICAgIGludGVybmFsOjpnZW12X2RlbnNlX3NlbGVjdG9yPFNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludChNYXRyaXhUeXBlOjpGbGFncykmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKGludGVybmFsOjpibGFzX3RyYWl0czxNYXRyaXhUeXBlPjo6SGFzVXNhYmxlRGlyZWN0QWNjZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6cnVuKGFjdHVhbF9saHMsIGFjdHVhbF9yaHMsIGRzdCwgYWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxDb2VmZkJhc2VkUHJvZHVjdE1vZGU+IAoreworICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocz46OlNjYWxhciBTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZXZhbFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICAvLyBTYW1lIGFzOiBkc3Qubm9hbGlhcygpID0gbGhzLmxhenlQcm9kdWN0KHJocyk7CisgICAgLy8gYnV0IGVhc2llciBvbiB0aGUgY29tcGlsZXIgc2lkZQorICAgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkc3QsIGxocy5sYXp5UHJvZHVjdChyaHMpLCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLFNjYWxhcj4oKSk7CisgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIERzdD4KKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhZGRUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgLy8gZHN0Lm5vYWxpYXMoKSArPSBsaHMubGF6eVByb2R1Y3QocmhzKTsKKyAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZHN0LCBsaHMubGF6eVByb2R1Y3QocmhzKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0OjpTY2FsYXIsU2NhbGFyPigpKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0PgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHN1YlRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICAvLyBkc3Qubm9hbGlhcygpIC09IGxocy5sYXp5UHJvZHVjdChyaHMpOworICAgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkc3QsIGxocy5sYXp5UHJvZHVjdChyaHMpLCBpbnRlcm5hbDo6c3ViX2Fzc2lnbl9vcDx0eXBlbmFtZSBEc3Q6OlNjYWxhcixTY2FsYXI+KCkpOworICB9CisgIAorLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2FsZUFuZEFkZFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpCisvLyAgIHsgZHN0Lm5vYWxpYXMoKSArPSBhbHBoYSAqIGxocy5sYXp5UHJvZHVjdChyaHMpOyB9Cit9OworCisvLyBUaGlzIHNwZWNpYWxpemF0aW9uIGVuZm9yY2VzIHRoZSB1c2Ugb2YgYSBjb2VmZmljaWVudC1iYXNlZCBldmFsdWF0aW9uIHN0cmF0ZWd5Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxMYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlPgorICA6IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxEZW5zZVNoYXBlLENvZWZmQmFzZWRQcm9kdWN0TW9kZT4ge307CisKKy8vIENhc2UgMjogRXZhbHVhdGUgY29lZmYgYnkgY29lZmYKKy8vCisvLyBUaGlzIGlzIG1vc3RseSB0YWtlbiBmcm9tIENvZWZmQmFzZWRQcm9kdWN0LmgKKy8vIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBhZGQgYW4gZXh0cmEgYXJndW1lbnQgdG8gdGhlIGV0b3JfcHJvZHVjdF8qX2ltcGw6OnJ1bigpIGZ1bmN0aW9uCisvLyBmb3IgdGhlIGlubmVyIGRpbWVuc2lvbiBvZiB0aGUgcHJvZHVjdCwgYmVjYXVzZSBldmFsdWF0b3Igb2JqZWN0IGRvIG5vdCBrbm93IHRoZWlyIHNpemUuCisKK3RlbXBsYXRlPGludCBUcmF2ZXJzYWwsIGludCBVbnJvbGxpbmdJbmRleCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJldFNjYWxhcj4KK3N0cnVjdCBldG9yX3Byb2R1Y3RfY29lZmZfaW1wbDsKKwordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlciwgaW50IFVucm9sbGluZ0luZGV4LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgZXRvcl9wcm9kdWN0X3BhY2tldF9pbXBsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+LCBQcm9kdWN0VGFnLCBEZW5zZVNoYXBlLCBEZW5zZVNoYXBlPgorICAgIDogZXZhbHVhdG9yX2Jhc2U8UHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+ID4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBMYXp5UHJvZHVjdD4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX2xocyh4cHIubGhzKCkpLAorICAgICAgbV9yaHMoeHByLnJocygpKSwKKyAgICAgIG1fbGhzSW1wbChtX2xocyksICAgICAvLyBGSVhNRSB0aGUgY3JlYXRpb24gb2YgdGhlIGV2YWx1YXRvciBvYmplY3RzIHNob3VsZCByZXN1bHQgaW4gYSBuby1vcCwgYnV0IGNoZWNrIHRoYXQhCisgICAgICBtX3Joc0ltcGwobV9yaHMpLCAgICAgLy8gICAgICAgTW9yZW92ZXIsIHRoZXkgYXJlIG9ubHkgdXNlZnVsIGZvciB0aGUgcGFja2V0IHBhdGgsIHNvIHdlIGNvdWxkIGNvbXBsZXRlbHkgZGlzYWJsZSB0aGVtIHdoZW4gbm90IG5lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvciBwZXJoYXBzIGRlY2xhcmUgdGhlbSBvbiB0aGUgZmx5IG9uIHRoZSBwYWNrZXQgbWV0aG9kLi4uIFdlIGhhdmUgZXhwZXJpbWVudCB0byBjaGVjayB3aGF0J3MgYmVzdC4KKyAgICAgIG1faW5uZXJEaW0oeHByLmxocygpLmNvbHMoKSkKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisjaWYgMAorICAgIHN0ZDo6Y2VyciA8PCAiTGhzT3V0ZXJTdHJpZGVCeXRlcz0gICIgPDwgTGhzT3V0ZXJTdHJpZGVCeXRlcyA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiUmhzT3V0ZXJTdHJpZGVCeXRlcz0gICIgPDwgUmhzT3V0ZXJTdHJpZGVCeXRlcyA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiTGhzQWxpZ25tZW50PSAgICAgICAgICIgPDwgTGhzQWxpZ25tZW50IDw8ICJcbiI7CisgICAgc3RkOjpjZXJyIDw8ICJSaHNBbGlnbm1lbnQ9ICAgICAgICAgIiA8PCBSaHNBbGlnbm1lbnQgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIkNhblZlY3Rvcml6ZUxocz0gICAgICAiIDw8IENhblZlY3Rvcml6ZUxocyA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiQ2FuVmVjdG9yaXplUmhzPSAgICAgICIgPDwgQ2FuVmVjdG9yaXplUmhzIDw8ICJcbiI7CisgICAgc3RkOjpjZXJyIDw8ICJDYW5WZWN0b3JpemVJbm5lcj0gICAgIiA8PCBDYW5WZWN0b3JpemVJbm5lciA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiRXZhbFRvUm93TWFqb3I9ICAgICAgICIgPDwgRXZhbFRvUm93TWFqb3IgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIkFsaWdubWVudD0gICAgICAgICAgICAiIDw8IEFsaWdubWVudCA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiRmxhZ3M9ICAgICAgICAgICAgICAgICIgPDwgRmxhZ3MgPDwgIlxuIjsKKyNlbmRpZgorICB9CisKKyAgLy8gRXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIHRha2VuIGZyb20gQ29lZmZCYXNlZFByb2R1Y3QuaAorCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPExocyxSaHM6OkNvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFJocyxMaHM6OlJvd3NBdENvbXBpbGVUaW1lPjo6dHlwZSBSaHNOZXN0ZWQ7CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGUgTGhzTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxSaHNOZXN0ZWQ+Ojp0eXBlIFJoc05lc3RlZENsZWFuZWQ7CisKKyAgdHlwZWRlZiBldmFsdWF0b3I8TGhzTmVzdGVkQ2xlYW5lZD4gTGhzRXRvclR5cGU7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFJoc05lc3RlZENsZWFuZWQ+IFJoc0V0b3JUeXBlOworCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTGhzTmVzdGVkQ2xlYW5lZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBSaHNOZXN0ZWRDbGVhbmVkOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBJbm5lclNpemUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTGhzTmVzdGVkQ2xlYW5lZDo6Q29sc0F0Q29tcGlsZVRpbWUsIFJoc05lc3RlZENsZWFuZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IExoc05lc3RlZENsZWFuZWQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gUmhzTmVzdGVkQ2xlYW5lZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGZpbmRfYmVzdF9wYWNrZXQ8U2NhbGFyLFJvd3NBdENvbXBpbGVUaW1lPjo6dHlwZSBMaHNWZWNQYWNrZXRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGZpbmRfYmVzdF9wYWNrZXQ8U2NhbGFyLENvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBSaHNWZWNQYWNrZXRUeXBlOworCisgIGVudW0geworICAgICAgCisgICAgTGhzQ29lZmZSZWFkQ29zdCA9IExoc0V0b3JUeXBlOjpDb2VmZlJlYWRDb3N0LAorICAgIFJoc0NvZWZmUmVhZENvc3QgPSBSaHNFdG9yVHlwZTo6Q29lZmZSZWFkQ29zdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gSW5uZXJTaXplPT0wID8gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0CisgICAgICAgICAgICAgICAgICA6IElubmVyU2l6ZSA9PSBEeW5hbWljID8gSHVnZUNvc3QKKyAgICAgICAgICAgICAgICAgIDogSW5uZXJTaXplICogKE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgTGhzQ29lZmZSZWFkQ29zdCArIFJoc0NvZWZmUmVhZENvc3QpCisgICAgICAgICAgICAgICAgICAgICsgKElubmVyU2l6ZSAtIDEpICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsCisKKyAgICBVbnJvbGwgPSBDb2VmZlJlYWRDb3N0IDw9IEVJR0VOX1VOUk9MTElOR19MSU1JVCwKKyAgICAKKyAgICBMaHNGbGFncyA9IExoc0V0b3JUeXBlOjpGbGFncywKKyAgICBSaHNGbGFncyA9IFJoc0V0b3JUeXBlOjpGbGFncywKKyAgICAKKyAgICBMaHNSb3dNYWpvciA9IExoc0ZsYWdzICYgUm93TWFqb3JCaXQsCisgICAgUmhzUm93TWFqb3IgPSBSaHNGbGFncyAmIFJvd01ham9yQml0LAorCisgICAgTGhzVmVjUGFja2V0U2l6ZSA9IHVucGFja2V0X3RyYWl0czxMaHNWZWNQYWNrZXRUeXBlPjo6c2l6ZSwKKyAgICBSaHNWZWNQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPFJoc1ZlY1BhY2tldFR5cGU+OjpzaXplLAorCisgICAgLy8gSGVyZSwgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbGlnbm1lbnQgbGFyZ2VyIHRoYW4gdGhlIHVzYWJsZSBwYWNrZXQgc2l6ZS4KKyAgICBMaHNBbGlnbm1lbnQgPSBFSUdFTl9QTEFJTl9FTlVNX01JTihMaHNFdG9yVHlwZTo6QWxpZ25tZW50LExoc1ZlY1BhY2tldFNpemUqaW50KHNpemVvZih0eXBlbmFtZSBMaHNOZXN0ZWRDbGVhbmVkOjpTY2FsYXIpKSksCisgICAgUmhzQWxpZ25tZW50ID0gRUlHRU5fUExBSU5fRU5VTV9NSU4oUmhzRXRvclR5cGU6OkFsaWdubWVudCxSaHNWZWNQYWNrZXRTaXplKmludChzaXplb2YodHlwZW5hbWUgUmhzTmVzdGVkQ2xlYW5lZDo6U2NhbGFyKSkpLAorICAgICAgCisgICAgU2FtZVR5cGUgPSBpc19zYW1lPHR5cGVuYW1lIExoc05lc3RlZENsZWFuZWQ6OlNjYWxhcix0eXBlbmFtZSBSaHNOZXN0ZWRDbGVhbmVkOjpTY2FsYXI+Ojp2YWx1ZSwKKworICAgIENhblZlY3Rvcml6ZVJocyA9IGJvb2woUmhzUm93TWFqb3IpICYmIChSaHNGbGFncyAmIFBhY2tldEFjY2Vzc0JpdCkgJiYgKENvbHNBdENvbXBpbGVUaW1lIT0xKSwKKyAgICBDYW5WZWN0b3JpemVMaHMgPSAoIUxoc1Jvd01ham9yKSAmJiAoTGhzRmxhZ3MgJiBQYWNrZXRBY2Nlc3NCaXQpICYmIChSb3dzQXRDb21waWxlVGltZSE9MSksCisKKyAgICBFdmFsVG9Sb3dNYWpvciA9IChNYXhSb3dzQXRDb21waWxlVGltZT09MSYmTWF4Q29sc0F0Q29tcGlsZVRpbWUhPTEpID8gMQorICAgICAgICAgICAgICAgICAgICA6IChNYXhDb2xzQXRDb21waWxlVGltZT09MSYmTWF4Um93c0F0Q29tcGlsZVRpbWUhPTEpID8gMAorICAgICAgICAgICAgICAgICAgICA6IChib29sKFJoc1Jvd01ham9yKSAmJiAhQ2FuVmVjdG9yaXplTGhzKSwKKworICAgIEZsYWdzID0gKCh1bnNpZ25lZCBpbnQpKExoc0ZsYWdzIHwgUmhzRmxhZ3MpICYgSGVyZWRpdGFyeUJpdHMgJiB+Um93TWFqb3JCaXQpCisgICAgICAgICAgfCAoRXZhbFRvUm93TWFqb3IgPyBSb3dNYWpvckJpdCA6IDApCisgICAgICAgICAgLy8gVE9ETyBlbmFibGUgdmVjdG9yaXphdGlvbiBmb3IgbWl4ZWQgdHlwZXMKKyAgICAgICAgICB8IChTYW1lVHlwZSAmJiAoQ2FuVmVjdG9yaXplTGhzIHx8IENhblZlY3Rvcml6ZVJocykgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwKQorICAgICAgICAgIHwgKFhwclR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSA/IExpbmVhckFjY2Vzc0JpdCA6IDApLAorICAgICAgICAgIAorICAgIExoc091dGVyU3RyaWRlQnl0ZXMgPSBpbnQoTGhzTmVzdGVkQ2xlYW5lZDo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lKSAqIGludChzaXplb2YodHlwZW5hbWUgTGhzTmVzdGVkQ2xlYW5lZDo6U2NhbGFyKSksCisgICAgUmhzT3V0ZXJTdHJpZGVCeXRlcyA9IGludChSaHNOZXN0ZWRDbGVhbmVkOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpICogaW50KHNpemVvZih0eXBlbmFtZSBSaHNOZXN0ZWRDbGVhbmVkOjpTY2FsYXIpKSwKKworICAgIEFsaWdubWVudCA9IGJvb2woQ2FuVmVjdG9yaXplTGhzKSA/IChMaHNPdXRlclN0cmlkZUJ5dGVzPD0wIHx8IChpbnQoTGhzT3V0ZXJTdHJpZGVCeXRlcykgJSBFSUdFTl9QTEFJTl9FTlVNX01BWCgxLExoc0FsaWdubWVudCkpIT0wID8gMCA6IExoc0FsaWdubWVudCkKKyAgICAgICAgICAgICAgOiBib29sKENhblZlY3Rvcml6ZVJocykgPyAoUmhzT3V0ZXJTdHJpZGVCeXRlczw9MCB8fCAoaW50KFJoc091dGVyU3RyaWRlQnl0ZXMpICUgRUlHRU5fUExBSU5fRU5VTV9NQVgoMSxSaHNBbGlnbm1lbnQpKSE9MCA/IDAgOiBSaHNBbGlnbm1lbnQpCisgICAgICAgICAgICAgIDogMCwKKworICAgIC8qIENhblZlY3Rvcml6ZUlubmVyIGRlc2VydmVzIHNwZWNpYWwgZXhwbGFuYXRpb24uIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJvZHVjdCBmbGFncy4gSXQgaXMgbm90IHVzZWQgb3V0c2lkZQorICAgICAqIG9mIFByb2R1Y3QuIElmIHRoZSBQcm9kdWN0IGl0c2VsZiBpcyBub3QgYSBwYWNrZXQtYWNjZXNzIGV4cHJlc3Npb24sIHRoZXJlIGlzIHN0aWxsIGEgY2hhbmNlIHRoYXQgdGhlIGlubmVyCisgICAgICogbG9vcCBvZiB0aGUgcHJvZHVjdCBtaWdodCBiZSB2ZWN0b3JpemVkLiBUaGlzIGlzIHRoZSBtZWFuaW5nIG9mIENhblZlY3Rvcml6ZUlubmVyLiBTaW5jZSBpdCBkb2Vzbid0IGFmZmVjdAorICAgICAqIHRoZSBGbGFncywgaXQgaXMgc2FmZSB0byBtYWtlIHRoaXMgdmFsdWUgZGVwZW5kIG9uIEFjdHVhbFBhY2tldEFjY2Vzc0JpdCwgdGhhdCBkb2Vzbid0IGFmZmVjdCB0aGUgQUJJLgorICAgICAqLworICAgIENhblZlY3Rvcml6ZUlubmVyID0gICAgU2FtZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIExoc1Jvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIVJoc1Jvd01ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKExoc0ZsYWdzICYgUmhzRmxhZ3MgJiBBY3R1YWxQYWNrZXRBY2Nlc3NCaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoSW5uZXJTaXplICUgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplID09IDApCisgIH07CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiAobV9saHMucm93KHJvdykudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KCBtX3Jocy5jb2woY29sKSApKS5zdW0oKTsKKyAgfQorCisgIC8qIEFsbG93IGluZGV4LWJhc2VkIG5vbi1wYWNrZXQgYWNjZXNzLiBJdCBpcyBpbXBvc3NpYmxlIHRob3VnaCB0byBhbGxvdyBpbmRleC1iYXNlZCBwYWNrZWQgYWNjZXNzLAorICAgKiB3aGljaCBpcyB3aHkgd2UgZG9uJ3Qgc2V0IHRoZSBMaW5lYXJBY2Nlc3NCaXQuCisgICAqIFRPRE86IHRoaXMgc2VlbXMgcG9zc2libGUgd2hlbiB0aGUgcmVzdWx0IGlzIGEgdmVjdG9yCisgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBjb25zdCBJbmRleCByb3cgPSAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBNYXhSb3dzQXRDb21waWxlVGltZT09MSkgPyAwIDogaW5kZXg7CisgICAgY29uc3QgSW5kZXggY29sID0gKFJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEpID8gaW5kZXggOiAwOworICAgIHJldHVybiAobV9saHMucm93KHJvdykudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KCBtX3Jocy5jb2woY29sKSApKS5zdW0oKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgY29uc3QgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBQYWNrZXRUeXBlIHJlczsKKyAgICB0eXBlZGVmIGV0b3JfcHJvZHVjdF9wYWNrZXRfaW1wbDxib29sKGludChGbGFncykmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJvbGwgPyBpbnQoSW5uZXJTaXplKSA6IER5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGhzRXRvclR5cGUsIFJoc0V0b3JUeXBlLCBQYWNrZXRUeXBlLCBMb2FkTW9kZT4gUGFja2V0SW1wbDsKKyAgICBQYWNrZXRJbXBsOjpydW4ocm93LCBjb2wsIG1fbGhzSW1wbCwgbV9yaHNJbXBsLCBtX2lubmVyRGltLCByZXMpOworICAgIHJldHVybiByZXM7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIGNvbnN0IFBhY2tldFR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgY29uc3QgSW5kZXggcm93ID0gKFJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEpID8gMCA6IGluZGV4OworICAgIGNvbnN0IEluZGV4IGNvbCA9IChSb3dzQXRDb21waWxlVGltZSA9PSAxIHx8IE1heFJvd3NBdENvbXBpbGVUaW1lPT0xKSA/IGluZGV4IDogMDsKKyAgICByZXR1cm4gcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdyxjb2wpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPExoc05lc3RlZD46OnR5cGUgbV9saHM7CisgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxSaHNOZXN0ZWQ+Ojp0eXBlIG1fcmhzOworICAKKyAgTGhzRXRvclR5cGUgbV9saHNJbXBsOworICBSaHNFdG9yVHlwZSBtX3Joc0ltcGw7CisKKyAgLy8gVE9ETzogR2V0IHJpZCBvZiBtX2lubmVyRGltIGlmIGtub3duIGF0IGNvbXBpbGUgdGltZQorICBJbmRleCBtX2lubmVyRGltOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+LCBMYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlLCBEZW5zZVNoYXBlLCBEZW5zZVNoYXBlPgorICA6IHByb2R1Y3RfZXZhbHVhdG9yPFByb2R1Y3Q8TGhzLCBSaHMsIExhenlQcm9kdWN0PiwgQ29lZmZCYXNlZFByb2R1Y3RNb2RlLCBEZW5zZVNoYXBlLCBEZW5zZVNoYXBlPgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLCBSaHMsIERlZmF1bHRQcm9kdWN0PiBYcHJUeXBlOworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLCBSaHMsIExhenlQcm9kdWN0PiBCYXNlUHJvZHVjdDsKKyAgdHlwZWRlZiBwcm9kdWN0X2V2YWx1YXRvcjxCYXNlUHJvZHVjdCwgQ29lZmZCYXNlZFByb2R1Y3RNb2RlLCBEZW5zZVNoYXBlLCBEZW5zZVNoYXBlPiBCYXNlOworICBlbnVtIHsKKyAgICBGbGFncyA9IEJhc2U6OkZsYWdzIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQKKyAgfTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgcHJvZHVjdF9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogQmFzZShCYXNlUHJvZHVjdCh4cHIubGhzKCkseHByLnJocygpKSkKKyAge30KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogQ29lZmYgYmFzZWQgcHJvZHVjdCwgUGFja2V0IHBhdGggICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8aW50IFVucm9sbGluZ0luZGV4LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgZXRvcl9wcm9kdWN0X3BhY2tldF9pbXBsPFJvd01ham9yLCBVbnJvbGxpbmdJbmRleCwgTGhzLCBSaHMsIFBhY2tldCwgTG9hZE1vZGU+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIEluZGV4IGlubmVyRGltLCBQYWNrZXQgJnJlcykKKyAgeworICAgIGV0b3JfcHJvZHVjdF9wYWNrZXRfaW1wbDxSb3dNYWpvciwgVW5yb2xsaW5nSW5kZXgtMSwgTGhzLCBSaHMsIFBhY2tldCwgTG9hZE1vZGU+OjpydW4ocm93LCBjb2wsIGxocywgcmhzLCBpbm5lckRpbSwgcmVzKTsKKyAgICByZXMgPSAgcG1hZGQocHNldDE8UGFja2V0PihsaHMuY29lZmYocm93LCBJbmRleChVbnJvbGxpbmdJbmRleC0xKSkpLCByaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldD4oSW5kZXgoVW5yb2xsaW5nSW5kZXgtMSksIGNvbCksIHJlcyk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBVbnJvbGxpbmdJbmRleCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgorc3RydWN0IGV0b3JfcHJvZHVjdF9wYWNrZXRfaW1wbDxDb2xNYWpvciwgVW5yb2xsaW5nSW5kZXgsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBJbmRleCBpbm5lckRpbSwgUGFja2V0ICZyZXMpCisgIHsKKyAgICBldG9yX3Byb2R1Y3RfcGFja2V0X2ltcGw8Q29sTWFqb3IsIFVucm9sbGluZ0luZGV4LTEsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPjo6cnVuKHJvdywgY29sLCBsaHMsIHJocywgaW5uZXJEaW0sIHJlcyk7CisgICAgcmVzID0gIHBtYWRkKGxocy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0Pihyb3csIEluZGV4KFVucm9sbGluZ0luZGV4LTEpKSwgcHNldDE8UGFja2V0PihyaHMuY29lZmYoSW5kZXgoVW5yb2xsaW5nSW5kZXgtMSksIGNvbCkpLCByZXMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgZXRvcl9wcm9kdWN0X3BhY2tldF9pbXBsPFJvd01ham9yLCAxLCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgSW5kZXggLyppbm5lckRpbSovLCBQYWNrZXQgJnJlcykKKyAgeworICAgIHJlcyA9IHBtdWwocHNldDE8UGFja2V0PihsaHMuY29lZmYocm93LCBJbmRleCgwKSkpLHJocy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0PihJbmRleCgwKSwgY29sKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK3N0cnVjdCBldG9yX3Byb2R1Y3RfcGFja2V0X2ltcGw8Q29sTWFqb3IsIDEsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBJbmRleCAvKmlubmVyRGltKi8sIFBhY2tldCAmcmVzKQorICB7CisgICAgcmVzID0gcG11bChsaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldD4ocm93LCBJbmRleCgwKSksIHBzZXQxPFBhY2tldD4ocmhzLmNvZWZmKEluZGV4KDApLCBjb2wpKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK3N0cnVjdCBldG9yX3Byb2R1Y3RfcGFja2V0X2ltcGw8Um93TWFqb3IsIDAsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCAvKnJvdyovLCBJbmRleCAvKmNvbCovLCBjb25zdCBMaHMmIC8qbGhzKi8sIGNvbnN0IFJocyYgLypyaHMqLywgSW5kZXggLyppbm5lckRpbSovLCBQYWNrZXQgJnJlcykKKyAgeworICAgIHJlcyA9IHBzZXQxPFBhY2tldD4odHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUoMCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgZXRvcl9wcm9kdWN0X3BhY2tldF9pbXBsPENvbE1ham9yLCAwLCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggLypyb3cqLywgSW5kZXggLypjb2wqLywgY29uc3QgTGhzJiAvKmxocyovLCBjb25zdCBSaHMmIC8qcmhzKi8sIEluZGV4IC8qaW5uZXJEaW0qLywgUGFja2V0ICZyZXMpCisgIHsKKyAgICByZXMgPSBwc2V0MTxQYWNrZXQ+KHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlKDApKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgorc3RydWN0IGV0b3JfcHJvZHVjdF9wYWNrZXRfaW1wbDxSb3dNYWpvciwgRHluYW1pYywgTGhzLCBSaHMsIFBhY2tldCwgTG9hZE1vZGU+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIEluZGV4IGlubmVyRGltLCBQYWNrZXQmIHJlcykKKyAgeworICAgIHJlcyA9IHBzZXQxPFBhY2tldD4odHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUoMCkpOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IGlubmVyRGltOyArK2kpCisgICAgICByZXMgPSAgcG1hZGQocHNldDE8UGFja2V0PihsaHMuY29lZmYocm93LCBpKSksIHJocy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0PihpLCBjb2wpLCByZXMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgZXRvcl9wcm9kdWN0X3BhY2tldF9pbXBsPENvbE1ham9yLCBEeW5hbWljLCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgSW5kZXggaW5uZXJEaW0sIFBhY2tldCYgcmVzKQorICB7CisgICAgcmVzID0gcHNldDE8UGFja2V0Pih0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSgwKSk7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgaW5uZXJEaW07ICsraSkKKyAgICAgIHJlcyA9ICBwbWFkZChsaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldD4ocm93LCBpKSwgcHNldDE8UGFja2V0PihyaHMuY29lZmYoaSwgY29sKSksIHJlcyk7CisgIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUcmlhbmd1bGFyIHByb2R1Y3RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsCisgICAgICAgICB0eXBlbmFtZSBMaHMsIGJvb2wgTGhzSXNWZWN0b3IsCisgICAgICAgICB0eXBlbmFtZSBSaHMsIGJvb2wgUmhzSXNWZWN0b3I+CitzdHJ1Y3QgdHJpYW5ndWxhcl9wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLFRyaWFuZ3VsYXJTaGFwZSxEZW5zZVNoYXBlLFByb2R1Y3RUYWc+CisgIDogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxMaHMsUmhzLGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsVHJpYW5ndWxhclNoYXBlLERlbnNlU2hhcGUsUHJvZHVjdFRhZz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocz46OlNjYWxhciBTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgdHJpYW5ndWxhcl9wcm9kdWN0X2ltcGw8TGhzOjpNb2RlLHRydWUsdHlwZW5hbWUgTGhzOjpNYXRyaXhUeXBlLGZhbHNlLFJocywgUmhzOjpDb2xzQXRDb21waWxlVGltZT09MT4KKyAgICAgICAgOjpydW4oZHN0LCBsaHMubmVzdGVkRXhwcmVzc2lvbigpLCByaHMsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxUcmlhbmd1bGFyU2hhcGUsUHJvZHVjdFRhZz4KKzogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxMaHMsUmhzLGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxUcmlhbmd1bGFyU2hhcGUsUHJvZHVjdFRhZz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocz46OlNjYWxhciBTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgdHJpYW5ndWxhcl9wcm9kdWN0X2ltcGw8UmhzOjpNb2RlLGZhbHNlLExocyxMaHM6OlJvd3NBdENvbXBpbGVUaW1lPT0xLCB0eXBlbmFtZSBSaHM6Ok1hdHJpeFR5cGUsIGZhbHNlPjo6cnVuKGRzdCwgbGhzLCByaHMubmVzdGVkRXhwcmVzc2lvbigpLCBhbHBoYSk7CisgIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTZWxmQWRqb2ludCBwcm9kdWN0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordGVtcGxhdGUgPHR5cGVuYW1lIExocywgaW50IExoc01vZGUsIGJvb2wgTGhzSXNWZWN0b3IsCisgICAgICAgICAgdHlwZW5hbWUgUmhzLCBpbnQgUmhzTW9kZSwgYm9vbCBSaHNJc1ZlY3Rvcj4KK3N0cnVjdCBzZWxmYWRqb2ludF9wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLFNlbGZBZGpvaW50U2hhcGUsRGVuc2VTaGFwZSxQcm9kdWN0VGFnPgorICA6IGdlbmVyaWNfcHJvZHVjdF9pbXBsX2Jhc2U8TGhzLFJocyxnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLFNlbGZBZGpvaW50U2hhcGUsRGVuc2VTaGFwZSxQcm9kdWN0VGFnPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzPjo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpCisgIHsKKyAgICBzZWxmYWRqb2ludF9wcm9kdWN0X2ltcGw8dHlwZW5hbWUgTGhzOjpNYXRyaXhUeXBlLExoczo6TW9kZSxmYWxzZSxSaHMsMCxSaHM6OklzVmVjdG9yQXRDb21waWxlVGltZT46OnJ1bihkc3QsIGxocy5uZXN0ZWRFeHByZXNzaW9uKCksIHJocywgYWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLFJocyxEZW5zZVNoYXBlLFNlbGZBZGpvaW50U2hhcGUsUHJvZHVjdFRhZz4KKzogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxMaHMsUmhzLGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxTZWxmQWRqb2ludFNoYXBlLFByb2R1Y3RUYWc+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHNlbGZhZGpvaW50X3Byb2R1Y3RfaW1wbDxMaHMsMCxMaHM6OklzVmVjdG9yQXRDb21waWxlVGltZSx0eXBlbmFtZSBSaHM6Ok1hdHJpeFR5cGUsUmhzOjpNb2RlLGZhbHNlPjo6cnVuKGRzdCwgbGhzLCByaHMubmVzdGVkRXhwcmVzc2lvbigpLCBhbHBoYSk7CisgIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEaWFnb25hbCBwcm9kdWN0cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERpYWdvbmFsVHlwZSwgdHlwZW5hbWUgRGVyaXZlZCwgaW50IFByb2R1Y3RPcmRlcj4KK3N0cnVjdCBkaWFnb25hbF9wcm9kdWN0X2V2YWx1YXRvcl9iYXNlCisgIDogZXZhbHVhdG9yX2Jhc2U8RGVyaXZlZD4KK3sKKyAgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCB0eXBlbmFtZSBEaWFnb25hbFR5cGU6OlNjYWxhcj46OlJldHVyblR5cGUgU2NhbGFyOworcHVibGljOgorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKyBldmFsdWF0b3I8TWF0cml4VHlwZT46OkNvZWZmUmVhZENvc3QgKyBldmFsdWF0b3I8RGlhZ29uYWxUeXBlPjo6Q29lZmZSZWFkQ29zdCwKKyAgICAKKyAgICBNYXRyaXhGbGFncyA9IGV2YWx1YXRvcjxNYXRyaXhUeXBlPjo6RmxhZ3MsCisgICAgRGlhZ0ZsYWdzID0gZXZhbHVhdG9yPERpYWdvbmFsVHlwZT46OkZsYWdzLAorICAgIF9TdG9yYWdlT3JkZXIgPSBNYXRyaXhGbGFncyAmIFJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICBfU2NhbGFyQWNjZXNzT25EaWFnID0gICEoKGludChfU3RvcmFnZU9yZGVyKSA9PSBDb2xNYWpvciAmJiBpbnQoUHJvZHVjdE9yZGVyKSA9PSBPblRoZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fChpbnQoX1N0b3JhZ2VPcmRlcikgPT0gUm93TWFqb3IgJiYgaW50KFByb2R1Y3RPcmRlcikgPT0gT25UaGVSaWdodCkpLAorICAgIF9TYW1lVHlwZXMgPSBpc19zYW1lPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgdHlwZW5hbWUgRGlhZ29uYWxUeXBlOjpTY2FsYXI+Ojp2YWx1ZSwKKyAgICAvLyBGSVhNRSBjdXJyZW50bHkgd2UgbmVlZCBzYW1lIHR5cGVzLCBidXQgaW4gdGhlIGZ1dHVyZSB0aGUgbmV4dCBydWxlIHNob3VsZCBiZSB0aGUgb25lCisgICAgLy9fVmVjdG9yaXphYmxlID0gYm9vbChpbnQoTWF0cml4RmxhZ3MpJlBhY2tldEFjY2Vzc0JpdCkgJiYgKCghX1BhY2tldE9uRGlhZykgfHwgKF9TYW1lVHlwZXMgJiYgYm9vbChpbnQoRGlhZ0ZsYWdzKSZQYWNrZXRBY2Nlc3NCaXQpKSksCisgICAgX1ZlY3Rvcml6YWJsZSA9IGJvb2woaW50KE1hdHJpeEZsYWdzKSZQYWNrZXRBY2Nlc3NCaXQpICYmIF9TYW1lVHlwZXMgJiYgKF9TY2FsYXJBY2Nlc3NPbkRpYWcgfHwgKGJvb2woaW50KERpYWdGbGFncykmUGFja2V0QWNjZXNzQml0KSkpLAorICAgIF9MaW5lYXJBY2Nlc3NNYXNrID0gKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT0xIHx8IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT0xKSA/IExpbmVhckFjY2Vzc0JpdCA6IDAsCisgICAgRmxhZ3MgPSAoKEhlcmVkaXRhcnlCaXRzfF9MaW5lYXJBY2Nlc3NNYXNrKSAmICh1bnNpZ25lZCBpbnQpKE1hdHJpeEZsYWdzKSkgfCAoX1ZlY3Rvcml6YWJsZSA/IFBhY2tldEFjY2Vzc0JpdCA6IDApLAorICAgIEFsaWdubWVudCA9IGV2YWx1YXRvcjxNYXRyaXhUeXBlPjo6QWxpZ25tZW50CisgIH07CisgIAorICBkaWFnb25hbF9wcm9kdWN0X2V2YWx1YXRvcl9iYXNlKGNvbnN0IE1hdHJpeFR5cGUgJm1hdCwgY29uc3QgRGlhZ29uYWxUeXBlICZkaWFnKQorICAgIDogbV9kaWFnSW1wbChkaWFnKSwgbV9tYXRJbXBsKG1hdCkKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGlkeCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2RpYWdJbXBsLmNvZWZmKGlkeCkgKiBtX21hdEltcGwuY29lZmYoaWR4KTsKKyAgfQorICAKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0VHlwZSBwYWNrZXRfaW1wbChJbmRleCByb3csIEluZGV4IGNvbCwgSW5kZXggaWQsIGludGVybmFsOjp0cnVlX3R5cGUpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwobV9tYXRJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwc2V0MTxQYWNrZXRUeXBlPihtX2RpYWdJbXBsLmNvZWZmKGlkKSkpOworICB9CisgIAorICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRUeXBlIHBhY2tldF9pbXBsKEluZGV4IHJvdywgSW5kZXggY29sLCBJbmRleCBpZCwgaW50ZXJuYWw6OmZhbHNlX3R5cGUpIGNvbnN0CisgIHsKKyAgICBlbnVtIHsKKyAgICAgIElubmVyU2l6ZSA9IChNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSA/IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBEaWFnb25hbFBhY2tldExvYWRNb2RlID0gRUlHRU5fUExBSU5fRU5VTV9NSU4oTG9hZE1vZGUsKChJbm5lclNpemUlMTYpID09IDApID8gaW50KEFsaWduZWQxNikgOiBpbnQoZXZhbHVhdG9yPERpYWdvbmFsVHlwZT46OkFsaWdubWVudCkpIC8vIEZJWE1FIGhhcmRjb2RlZCAxNiEhCisgICAgfTsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwobV9tYXRJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGlhZ0ltcGwudGVtcGxhdGUgcGFja2V0PERpYWdvbmFsUGFja2V0TG9hZE1vZGUsUGFja2V0VHlwZT4oaWQpKTsKKyAgfQorICAKKyAgZXZhbHVhdG9yPERpYWdvbmFsVHlwZT4gbV9kaWFnSW1wbDsKKyAgZXZhbHVhdG9yPE1hdHJpeFR5cGU+ICAgbV9tYXRJbXBsOworfTsKKworLy8gZGlhZ29uYWwgKiBkZW5zZQordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0S2luZCwgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgUHJvZHVjdEtpbmQ+LCBQcm9kdWN0VGFnLCBEaWFnb25hbFNoYXBlLCBEZW5zZVNoYXBlPgorICA6IGRpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yX2Jhc2U8UmhzLCB0eXBlbmFtZSBMaHM6OkRpYWdvbmFsVmVjdG9yVHlwZSwgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+LCBPblRoZUxlZnQ+Cit7CisgIHR5cGVkZWYgZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3JfYmFzZTxSaHMsIHR5cGVuYW1lIExoczo6RGlhZ29uYWxWZWN0b3JUeXBlLCBQcm9kdWN0PExocywgUmhzLCBMYXp5UHJvZHVjdD4sIE9uVGhlTGVmdD4gQmFzZTsKKyAgdXNpbmcgQmFzZTo6bV9kaWFnSW1wbDsKKyAgdXNpbmcgQmFzZTo6bV9tYXRJbXBsOworICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBQcm9kdWN0S2luZD4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgCisgIGVudW0geworICAgIFN0b3JhZ2VPcmRlciA9IGludChSaHM6OkZsYWdzKSAmIFJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvcgorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IHByb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IEJhc2UoeHByLnJocygpLCB4cHIubGhzKCkuZGlhZ29uYWwoKSkKKyAgeworICB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2RpYWdJbXBsLmNvZWZmKHJvdykgKiBtX21hdEltcGwuY29lZmYocm93LCBjb2wpOworICB9CisgIAorI2lmbmRlZiBfX0NVREFDQ19fCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSx0eXBlbmFtZSBQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgLy8gRklYTUU6IE5WQ0MgdXNlZCB0byBjb21wbGFpbiBhYm91dCB0aGUgdGVtcGxhdGUga2V5d29yZCwgYnV0IHdlIGhhdmUgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIHN0aWxsIHRoZSBjYXNlLgorICAgIC8vIFNlZSBhbHNvIHNpbWlsYXIgY2FsbHMgYmVsb3cuCisgICAgcmV0dXJuIHRoaXMtPnRlbXBsYXRlIHBhY2tldF9pbXBsPExvYWRNb2RlLFBhY2tldFR5cGU+KHJvdyxjb2wsIHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxpbnQoU3RvcmFnZU9yZGVyKT09Um93TWFqb3IsIGludGVybmFsOjp0cnVlX3R5cGUsIGludGVybmFsOjpmYWxzZV90eXBlPjo6dHlwZSgpKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggaWR4KSBjb25zdAorICB7CisgICAgcmV0dXJuIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbnQoU3RvcmFnZU9yZGVyKT09Q29sTWFqb3I/aWR4OjAsaW50KFN0b3JhZ2VPcmRlcik9PUNvbE1ham9yPzA6aWR4KTsKKyAgfQorI2VuZGlmCit9OworCisvLyBkZW5zZSAqIGRpYWdvbmFsCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RLaW5kLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExocywgUmhzLCBQcm9kdWN0S2luZD4sIFByb2R1Y3RUYWcsIERlbnNlU2hhcGUsIERpYWdvbmFsU2hhcGU+CisgIDogZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3JfYmFzZTxMaHMsIHR5cGVuYW1lIFJoczo6RGlhZ29uYWxWZWN0b3JUeXBlLCBQcm9kdWN0PExocywgUmhzLCBMYXp5UHJvZHVjdD4sIE9uVGhlUmlnaHQ+Cit7CisgIHR5cGVkZWYgZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3JfYmFzZTxMaHMsIHR5cGVuYW1lIFJoczo6RGlhZ29uYWxWZWN0b3JUeXBlLCBQcm9kdWN0PExocywgUmhzLCBMYXp5UHJvZHVjdD4sIE9uVGhlUmlnaHQ+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1fZGlhZ0ltcGw7CisgIHVzaW5nIEJhc2U6Om1fbWF0SW1wbDsKKyAgdXNpbmcgQmFzZTo6Y29lZmY7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJocywgUHJvZHVjdEtpbmQ+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIAorICBlbnVtIHsgU3RvcmFnZU9yZGVyID0gaW50KExoczo6RmxhZ3MpICYgUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgcHJvZHVjdF9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogQmFzZSh4cHIubGhzKCksIHhwci5yaHMoKS5kaWFnb25hbCgpKQorICB7CisgIH0KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbWF0SW1wbC5jb2VmZihyb3csIGNvbCkgKiBtX2RpYWdJbXBsLmNvZWZmKGNvbCk7CisgIH0KKyAgCisjaWZuZGVmIF9fQ1VEQUNDX18KKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gdGhpcy0+dGVtcGxhdGUgcGFja2V0X2ltcGw8TG9hZE1vZGUsUGFja2V0VHlwZT4ocm93LGNvbCwgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGludChTdG9yYWdlT3JkZXIpPT1Db2xNYWpvciwgaW50ZXJuYWw6OnRydWVfdHlwZSwgaW50ZXJuYWw6OmZhbHNlX3R5cGU+Ojp0eXBlKCkpOworICB9CisgIAorICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRUeXBlIHBhY2tldChJbmRleCBpZHgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KGludChTdG9yYWdlT3JkZXIpPT1Db2xNYWpvcj9pZHg6MCxpbnQoU3RvcmFnZU9yZGVyKT09Q29sTWFqb3I/MDppZHgpOworICB9CisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvZHVjdHMgd2l0aCBwZXJtdXRhdGlvbiBtYXRyaWNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGludGVybmFsCisgICogXGNsYXNzIHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0CisgICogSW50ZXJuYWwgaGVscGVyIGNsYXNzIGltcGxlbWVudGluZyB0aGUgcHJvZHVjdCBiZXR3ZWVuIGEgcGVybXV0YXRpb24gbWF0cml4IGFuZCBhIG1hdHJpeC4KKyAgKiBUaGlzIGNsYXNzIGlzIHNwZWNpYWxpemVkIGZvciBEZW5zZVNoYXBlIGJlbG93IGFuZCBmb3IgU3BhcnNlU2hhcGUgaW4gU3BhcnNlQ29yZS9TcGFyc2VQZXJtdXRhdGlvbi5oCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZCwgdHlwZW5hbWUgRXhwcmVzc2lvblNoYXBlPgorc3RydWN0IHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD4KK3N0cnVjdCBwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxFeHByZXNzaW9uVHlwZSwgU2lkZSwgVHJhbnNwb3NlZCwgRGVuc2VTaGFwZT4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPEV4cHJlc3Npb25UeXBlLCAxPjo6dHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlQ2xlYW5lZDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZT4KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlc3QmIGRzdCwgY29uc3QgUGVybXV0YXRpb25UeXBlJiBwZXJtLCBjb25zdCBFeHByZXNzaW9uVHlwZSYgeHByKQorICAgIHsKKyAgICAgIE1hdHJpeFR5cGUgbWF0KHhwcik7CisgICAgICBjb25zdCBJbmRleCBuID0gU2lkZT09T25UaGVMZWZ0ID8gbWF0LnJvd3MoKSA6IG1hdC5jb2xzKCk7CisgICAgICAvLyBGSVhNRSB3ZSBuZWVkIGFuIGlzX3NhbWUgZm9yIGV4cHJlc3Npb24gdGhhdCBpcyBub3Qgc2Vuc2l0aXZlIHRvIGNvbnN0bmVzcy4gRm9yIGluc3RhbmNlCisgICAgICAvLyBpc19zYW1lX3hwcjxCbG9jazxjb25zdCBNYXRyaXg+LCBCbG9jazxNYXRyaXg+ID46OnZhbHVlIHNob3VsZCBiZSB0cnVlLgorICAgICAgLy9pZihpc19zYW1lPE1hdHJpeFR5cGVDbGVhbmVkLERlc3Q+Ojp2YWx1ZSAmJiBleHRyYWN0X2RhdGEoZHN0KSA9PSBleHRyYWN0X2RhdGEobWF0KSkKKyAgICAgIGlmKGlzX3NhbWVfZGVuc2UoZHN0LCBtYXQpKQorICAgICAgeworICAgICAgICAvLyBhcHBseSB0aGUgcGVybXV0YXRpb24gaW5wbGFjZQorICAgICAgICBNYXRyaXg8Ym9vbCxQZXJtdXRhdGlvblR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLDEsMCxQZXJtdXRhdGlvblR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lPiBtYXNrKHBlcm0uc2l6ZSgpKTsKKyAgICAgICAgbWFzay5maWxsKGZhbHNlKTsKKyAgICAgICAgSW5kZXggciA9IDA7CisgICAgICAgIHdoaWxlKHIgPCBwZXJtLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIHNlYXJjaCBmb3IgdGhlIG5leHQgc2VlZAorICAgICAgICAgIHdoaWxlKHI8cGVybS5zaXplKCkgJiYgbWFza1tyXSkgcisrOworICAgICAgICAgIGlmKHI+PXBlcm0uc2l6ZSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgLy8gd2UgZ290IG9uZSwgbGV0J3MgZm9sbG93IGl0IHVudGlsIHdlIGFyZSBiYWNrIHRvIHRoZSBzZWVkCisgICAgICAgICAgSW5kZXggazAgPSByKys7CisgICAgICAgICAgSW5kZXgga1ByZXYgPSBrMDsKKyAgICAgICAgICBtYXNrLmNvZWZmUmVmKGswKSA9IHRydWU7CisgICAgICAgICAgZm9yKEluZGV4IGs9cGVybS5pbmRpY2VzKCkuY29lZmYoazApOyBrIT1rMDsgaz1wZXJtLmluZGljZXMoKS5jb2VmZihrKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBCbG9jazxEZXN0LCBTaWRlPT1PblRoZUxlZnQgPyAxIDogRGVzdDo6Um93c0F0Q29tcGlsZVRpbWUsIFNpZGU9PU9uVGhlUmlnaHQgPyAxIDogRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWU+KGRzdCwgaykKKyAgICAgICAgICAgIC5zd2FwKEJsb2NrPERlc3QsIFNpZGU9PU9uVGhlTGVmdCA/IDEgOiBEZXN0OjpSb3dzQXRDb21waWxlVGltZSwgU2lkZT09T25UaGVSaWdodCA/IDEgOiBEZXN0OjpDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgKGRzdCwoKFNpZGU9PU9uVGhlTGVmdCkgXiBUcmFuc3Bvc2VkKSA/IGswIDoga1ByZXYpKTsKKworICAgICAgICAgICAgbWFzay5jb2VmZlJlZihrKSA9IHRydWU7CisgICAgICAgICAgICBrUHJldiA9IGs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgeworICAgICAgICAgIEJsb2NrPERlc3QsIFNpZGU9PU9uVGhlTGVmdCA/IDEgOiBEZXN0OjpSb3dzQXRDb21waWxlVGltZSwgU2lkZT09T25UaGVSaWdodCA/IDEgOiBEZXN0OjpDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgIChkc3QsICgoU2lkZT09T25UaGVMZWZ0KSBeIFRyYW5zcG9zZWQpID8gcGVybS5pbmRpY2VzKCkuY29lZmYoaSkgOiBpKQorCisgICAgICAgICAgPQorCisgICAgICAgICAgQmxvY2s8Y29uc3QgTWF0cml4VHlwZUNsZWFuZWQsU2lkZT09T25UaGVMZWZ0ID8gMSA6IE1hdHJpeFR5cGVDbGVhbmVkOjpSb3dzQXRDb21waWxlVGltZSxTaWRlPT1PblRoZVJpZ2h0ID8gMSA6IE1hdHJpeFR5cGVDbGVhbmVkOjpDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgIChtYXQsICgoU2lkZT09T25UaGVSaWdodCkgXiBUcmFuc3Bvc2VkKSA/IHBlcm0uaW5kaWNlcygpLmNvZWZmKGkpIDogaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWcsIHR5cGVuYW1lIE1hdHJpeFNoYXBlPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzLCBQZXJtdXRhdGlvblNoYXBlLCBNYXRyaXhTaGFwZSwgUHJvZHVjdFRhZz4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgcGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8UmhzLCBPblRoZUxlZnQsIGZhbHNlLCBNYXRyaXhTaGFwZT46OnJ1bihkc3QsIGxocywgcmhzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBNYXRyaXhTaGFwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgTWF0cml4U2hhcGUsIFBlcm11dGF0aW9uU2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0PExocywgT25UaGVSaWdodCwgZmFsc2UsIE1hdHJpeFNoYXBlPjo6cnVuKGRzdCwgcmhzLCBsaHMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWcsIHR5cGVuYW1lIE1hdHJpeFNoYXBlPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPEludmVyc2U8TGhzPiwgUmhzLCBQZXJtdXRhdGlvblNoYXBlLCBNYXRyaXhTaGFwZSwgUHJvZHVjdFRhZz4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgY29uc3QgSW52ZXJzZTxMaHM+JiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgcGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8UmhzLCBPblRoZUxlZnQsIHRydWUsIE1hdHJpeFNoYXBlPjo6cnVuKGRzdCwgbGhzLm5lc3RlZEV4cHJlc3Npb24oKSwgcmhzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBNYXRyaXhTaGFwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIEludmVyc2U8UmhzPiwgTWF0cml4U2hhcGUsIFBlcm11dGF0aW9uU2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBJbnZlcnNlPFJocz4mIHJocykKKyAgeworICAgIHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0PExocywgT25UaGVSaWdodCwgdHJ1ZSwgTWF0cml4U2hhcGU+OjpydW4oZHN0LCByaHMubmVzdGVkRXhwcmVzc2lvbigpLCBsaHMpOworICB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvZHVjdHMgd2l0aCB0cmFuc3Bvc2l0aW9ucyBtYXRyaWNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBGSVhNRSBjb3VsZCB3ZSB1bmlmeSBUcmFuc3Bvc2l0aW9ucyBhbmQgUGVybXV0YXRpb24gaW50byBhIHNpbmdsZSAic2hhcGUiPz8KKworLyoqIFxpbnRlcm5hbAorICAqIFxjbGFzcyB0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0CisgICogSW50ZXJuYWwgaGVscGVyIGNsYXNzIGltcGxlbWVudGluZyB0aGUgcHJvZHVjdCBiZXR3ZWVuIGEgcGVybXV0YXRpb24gbWF0cml4IGFuZCBhIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkLCB0eXBlbmFtZSBFeHByZXNzaW9uU2hhcGU+CitzdHJ1Y3QgdHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdAoreworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPEV4cHJlc3Npb25UeXBlLCAxPjo6dHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZUNsZWFuZWQ7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZT4KKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXN0JiBkc3QsIGNvbnN0IFRyYW5zcG9zaXRpb25UeXBlJiB0ciwgY29uc3QgRXhwcmVzc2lvblR5cGUmIHhwcikKKyAgeworICAgIE1hdHJpeFR5cGUgbWF0KHhwcik7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICBjb25zdCBJbmRleCBzaXplID0gdHIuc2l6ZSgpOworICAgIFN0b3JhZ2VJbmRleCBqID0gMDsKKworICAgIGlmKCFpc19zYW1lX2RlbnNlKGRzdCxtYXQpKQorICAgICAgZHN0ID0gbWF0OworCisgICAgZm9yKEluZGV4IGs9KFRyYW5zcG9zZWQ/c2l6ZS0xOjApIDsgVHJhbnNwb3NlZD9rPj0wOms8c2l6ZSA7IFRyYW5zcG9zZWQ/LS1rOisraykKKyAgICAgIGlmKEluZGV4KGo9dHIuY29lZmYoaykpIT1rKQorICAgICAgeworICAgICAgICBpZihTaWRlPT1PblRoZUxlZnQpICAgICAgICBkc3Qucm93KGspLnN3YXAoZHN0LnJvdyhqKSk7CisgICAgICAgIGVsc2UgaWYoU2lkZT09T25UaGVSaWdodCkgIGRzdC5jb2woaykuc3dhcChkc3QuY29sKGopKTsKKyAgICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBNYXRyaXhTaGFwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgVHJhbnNwb3NpdGlvbnNTaGFwZSwgTWF0cml4U2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIHRyYW5zcG9zaXRpb25fbWF0cml4X3Byb2R1Y3Q8UmhzLCBPblRoZUxlZnQsIGZhbHNlLCBNYXRyaXhTaGFwZT46OnJ1bihkc3QsIGxocywgcmhzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBNYXRyaXhTaGFwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgTWF0cml4U2hhcGUsIFRyYW5zcG9zaXRpb25zU2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIHRyYW5zcG9zaXRpb25fbWF0cml4X3Byb2R1Y3Q8TGhzLCBPblRoZVJpZ2h0LCBmYWxzZSwgTWF0cml4U2hhcGU+OjpydW4oZHN0LCByaHMsIGxocyk7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnLCB0eXBlbmFtZSBNYXRyaXhTaGFwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxUcmFuc3Bvc2U8TGhzPiwgUmhzLCBUcmFuc3Bvc2l0aW9uc1NoYXBlLCBNYXRyaXhTaGFwZSwgUHJvZHVjdFRhZz4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgY29uc3QgVHJhbnNwb3NlPExocz4mIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICB0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0PFJocywgT25UaGVMZWZ0LCB0cnVlLCBNYXRyaXhTaGFwZT46OnJ1bihkc3QsIGxocy5uZXN0ZWRFeHByZXNzaW9uKCksIHJocyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZywgdHlwZW5hbWUgTWF0cml4U2hhcGU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBUcmFuc3Bvc2U8UmhzPiwgTWF0cml4U2hhcGUsIFRyYW5zcG9zaXRpb25zU2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBUcmFuc3Bvc2U8UmhzPiYgcmhzKQorICB7CisgICAgdHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdDxMaHMsIE9uVGhlUmlnaHQsIHRydWUsIE1hdHJpeFNoYXBlPjo6cnVuKGRzdCwgcmhzLm5lc3RlZEV4cHJlc3Npb24oKSwgbGhzKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUFJPRFVDVF9FVkFMVUFUT1JTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1JhbmRvbS5oIGIvRWlnZW4vc3JjL0NvcmUvUmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhZjc4OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1JhbmRvbS5oCkBAIC0wLDAgKzEsMTgyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkFORE9NX0gKKyNkZWZpbmUgRUlHRU5fUkFORE9NX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9yYW5kb21fb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfcmFuZG9tX29wKQorICBpbmxpbmUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKCkgY29uc3QgeyByZXR1cm4gcmFuZG9tPFNjYWxhcj4oKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9yYW5kb21fb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSwgSXNSZXBlYXRhYmxlID0gZmFsc2UgfTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyBhIHJhbmRvbSBtYXRyaXggZXhwcmVzc2lvbgorICAqCisgICogTnVtYmVycyBhcmUgdW5pZm9ybWx5IHNwcmVhZCB0aHJvdWdoIHRoZWlyIHdob2xlIGRlZmluaXRpb24gcmFuZ2UgZm9yIGludGVnZXIgdHlwZXMsCisgICogYW5kIGluIHRoZSBbLTE6MV0gcmFuZ2UgZm9yIGZsb2F0aW5nIHBvaW50IHNjYWxhciB0eXBlcy4KKyAgKiAKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFxub3RfcmVlbnRyYW50CisgICogCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaXggdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHJvd3MgYW5kIFxhIGNvbHMgYXMgYXJndW1lbnRzLCBzbyBSYW5kb20oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICogCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3JhbmRvbV9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tX2ludF9pbnQub3V0CisgICoKKyAgKiBUaGlzIGV4cHJlc3Npb24gaGFzIHRoZSAiZXZhbHVhdGUgYmVmb3JlIG5lc3RpbmciIGZsYWcgc28gdGhhdCBpdCB3aWxsIGJlIGV2YWx1YXRlZCBpbnRvCisgICogYSB0ZW1wb3JhcnkgbWF0cml4IHdoZW5ldmVyIGl0IGlzIG5lc3RlZCBpbiBhIGxhcmdlciBleHByZXNzaW9uLiBUaGlzIHByZXZlbnRzIHVuZXhwZWN0ZWQKKyAgKiBiZWhhdmlvciB3aXRoIGV4cHJlc3Npb25zIGludm9sdmluZyByYW5kb20gbWF0cmljZXMuCisgICogCisgICogU2VlIERlbnNlQmFzZTo6TnVsbGFyeUV4cHIoSW5kZXgsIGNvbnN0IEN1c3RvbU51bGxhcnlPcCYpIGZvciBhbiBleGFtcGxlIHVzaW5nIEMrKzExIHJhbmRvbSBnZW5lcmF0b3JzLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6c2V0UmFuZG9tKCksIERlbnNlQmFzZTo6UmFuZG9tKEluZGV4KSwgRGVuc2VCYXNlOjpSYW5kb20oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbVJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJldHVybiBOdWxsYXJ5RXhwcihyb3dzLCBjb2xzLCBpbnRlcm5hbDo6c2NhbGFyX3JhbmRvbV9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgYSByYW5kb20gdmVjdG9yIGV4cHJlc3Npb24KKyAgKgorICAqIE51bWJlcnMgYXJlIHVuaWZvcm1seSBzcHJlYWQgdGhyb3VnaCB0aGVpciB3aG9sZSBkZWZpbml0aW9uIHJhbmdlIGZvciBpbnRlZ2VyIHR5cGVzLAorICAqIGFuZCBpbiB0aGUgWy0xOjFdIHJhbmdlIGZvciBmbG9hdGluZyBwb2ludCBzY2FsYXIgdHlwZXMuCisgICoKKyAgKiBUaGUgcGFyYW1ldGVyIFxhIHNpemUgaXMgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgKiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICogXG5vdF9yZWVudHJhbnQKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgdmVjdG9yIHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSBzaXplIGFzIGFyZ3VtZW50LCBzbyBSYW5kb20oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3JhbmRvbV9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9yYW5kb21faW50Lm91dAorICAqCisgICogVGhpcyBleHByZXNzaW9uIGhhcyB0aGUgImV2YWx1YXRlIGJlZm9yZSBuZXN0aW5nIiBmbGFnIHNvIHRoYXQgaXQgd2lsbCBiZSBldmFsdWF0ZWQgaW50bworICAqIGEgdGVtcG9yYXJ5IHZlY3RvciB3aGVuZXZlciBpdCBpcyBuZXN0ZWQgaW4gYSBsYXJnZXIgZXhwcmVzc2lvbi4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkCisgICogYmVoYXZpb3Igd2l0aCBleHByZXNzaW9ucyBpbnZvbHZpbmcgcmFuZG9tIG1hdHJpY2VzLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6c2V0UmFuZG9tKCksIERlbnNlQmFzZTo6UmFuZG9tKEluZGV4LEluZGV4KSwgRGVuc2VCYXNlOjpSYW5kb20oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbVJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tKEluZGV4IHNpemUpCit7CisgIHJldHVybiBOdWxsYXJ5RXhwcihzaXplLCBpbnRlcm5hbDo6c2NhbGFyX3JhbmRvbV9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgYSBmaXhlZC1zaXplIHJhbmRvbSBtYXRyaXggb3IgdmVjdG9yIGV4cHJlc3Npb24KKyAgKgorICAqIE51bWJlcnMgYXJlIHVuaWZvcm1seSBzcHJlYWQgdGhyb3VnaCB0aGVpciB3aG9sZSBkZWZpbml0aW9uIHJhbmdlIGZvciBpbnRlZ2VyIHR5cGVzLAorICAqIGFuZCBpbiB0aGUgWy0xOjFdIHJhbmdlIGZvciBmbG9hdGluZyBwb2ludCBzY2FsYXIgdHlwZXMuCisgICogCisgICogVGhpcyB2YXJpYW50IGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgTWF0cml4QmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnRzIHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tLm91dAorICAqCisgICogVGhpcyBleHByZXNzaW9uIGhhcyB0aGUgImV2YWx1YXRlIGJlZm9yZSBuZXN0aW5nIiBmbGFnIHNvIHRoYXQgaXQgd2lsbCBiZSBldmFsdWF0ZWQgaW50bworICAqIGEgdGVtcG9yYXJ5IG1hdHJpeCB3aGVuZXZlciBpdCBpcyBuZXN0ZWQgaW4gYSBsYXJnZXIgZXhwcmVzc2lvbi4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkCisgICogYmVoYXZpb3Igd2l0aCBleHByZXNzaW9ucyBpbnZvbHZpbmcgcmFuZG9tIG1hdHJpY2VzLgorICAqIAorICAqIFxub3RfcmVlbnRyYW50CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZXRSYW5kb20oKSwgRGVuc2VCYXNlOjpSYW5kb20oSW5kZXgsSW5kZXgpLCBEZW5zZUJhc2U6OlJhbmRvbShJbmRleCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpSYW5kb21SZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbSgpCit7CisgIHJldHVybiBOdWxsYXJ5RXhwcihSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIGludGVybmFsOjpzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBTZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHJhbmRvbSB2YWx1ZXMuCisgICoKKyAgKiBOdW1iZXJzIGFyZSB1bmlmb3JtbHkgc3ByZWFkIHRocm91Z2ggdGhlaXIgd2hvbGUgZGVmaW5pdGlvbiByYW5nZSBmb3IgaW50ZWdlciB0eXBlcywKKyAgKiBhbmQgaW4gdGhlIFstMToxXSByYW5nZSBmb3IgZmxvYXRpbmcgcG9pbnQgc2NhbGFyIHR5cGVzLgorICAqIAorICAqIFxub3RfcmVlbnRyYW50CisgICogCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZXRSYW5kb20uY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9zZXRSYW5kb20ub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIHNldFJhbmRvbShJbmRleCksIHNldFJhbmRvbShJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpzZXRSYW5kb20oKQoreworICByZXR1cm4gKnRoaXMgPSBSYW5kb20ocm93cygpLCBjb2xzKCkpOworfQorCisvKiogUmVzaXplcyB0byB0aGUgZ2l2ZW4gXGEgbmV3U2l6ZSwgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gcmFuZG9tIHZhbHVlcy4KKyAgKgorICAqIE51bWJlcnMgYXJlIHVuaWZvcm1seSBzcHJlYWQgdGhyb3VnaCB0aGVpciB3aG9sZSBkZWZpbml0aW9uIHJhbmdlIGZvciBpbnRlZ2VyIHR5cGVzLAorICAqIGFuZCBpbiB0aGUgWy0xOjFdIHJhbmdlIGZvciBmbG9hdGluZyBwb2ludCBzY2FsYXIgdHlwZXMuCisgICogCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKiBcbm90X3JlZW50cmFudAorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldFJhbmRvbV9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3NldFJhbmRvbV9pbnQub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZXRSYW5kb20oKSwgc2V0UmFuZG9tKEluZGV4LEluZGV4KSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIERlbnNlQmFzZTo6UmFuZG9tKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldFJhbmRvbShJbmRleCBuZXdTaXplKQoreworICByZXNpemUobmV3U2l6ZSk7CisgIHJldHVybiBzZXRSYW5kb20oKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIHNpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHJhbmRvbSB2YWx1ZXMuCisgICoKKyAgKiBOdW1iZXJzIGFyZSB1bmlmb3JtbHkgc3ByZWFkIHRocm91Z2ggdGhlaXIgd2hvbGUgZGVmaW5pdGlvbiByYW5nZSBmb3IgaW50ZWdlciB0eXBlcywKKyAgKiBhbmQgaW4gdGhlIFstMToxXSByYW5nZSBmb3IgZmxvYXRpbmcgcG9pbnQgc2NhbGFyIHR5cGVzLgorICAqCisgICogXG5vdF9yZWVudHJhbnQKKyAgKiAKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldFJhbmRvbV9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRSYW5kb21faW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnNldFJhbmRvbSgpLCBzZXRSYW5kb20oSW5kZXgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgRGVuc2VCYXNlOjpSYW5kb20oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1BsYWluT2JqZWN0QmFzZTxEZXJpdmVkPjo6c2V0UmFuZG9tKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgcmV0dXJuIHNldFJhbmRvbSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JBTkRPTV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9SZWR1eC5oIGIvRWlnZW4vc3JjL0NvcmUvUmVkdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU4Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvUmVkdXguaApAQCAtMCwwICsxLDUwNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVEVVhfSAorI2RlZmluZSBFSUdFTl9SRURVWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUT0RPCisvLyAgKiBpbXBsZW1lbnQgb3RoZXIga2luZCBvZiB2ZWN0b3JpemF0aW9uCisvLyAgKiBmYWN0b3JpemUgY29kZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgMSA6IHRoZSBsb2dpYyBkZWNpZGluZyBhIHN0cmF0ZWd5IGZvciB2ZWN0b3JpemF0aW9uIGFuZCB1bnJvbGxpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF90cmFpdHMKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGZpbmRfYmVzdF9wYWNrZXQ8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPjo6dHlwZSBQYWNrZXRUeXBlOworICBlbnVtIHsKKyAgICBQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplLAorICAgIElubmVyTWF4U2l6ZSA9IGludChEZXJpdmVkOjpJc1Jvd01ham9yKQorICAgICAgICAgICAgICAgICA/IERlcml2ZWQ6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgIDogRGVyaXZlZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBlbnVtIHsKKyAgICBNaWdodFZlY3Rvcml6ZSA9IChpbnQoRGVyaXZlZDo6RmxhZ3MpJkFjdHVhbFBhY2tldEFjY2Vzc0JpdCkKKyAgICAgICAgICAgICAgICAgICYmIChmdW5jdG9yX3RyYWl0czxGdW5jPjo6UGFja2V0QWNjZXNzKSwKKyAgICBNYXlMaW5lYXJWZWN0b3JpemUgPSBib29sKE1pZ2h0VmVjdG9yaXplKSAmJiAoaW50KERlcml2ZWQ6OkZsYWdzKSZMaW5lYXJBY2Nlc3NCaXQpLAorICAgIE1heVNsaWNlVmVjdG9yaXplICA9IGJvb2woTWlnaHRWZWN0b3JpemUpICYmIGludChJbm5lck1heFNpemUpPj0zKlBhY2tldFNpemUKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBUcmF2ZXJzYWwgPSBpbnQoTWF5TGluZWFyVmVjdG9yaXplKSA/IGludChMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICA6IGludChNYXlTbGljZVZlY3Rvcml6ZSkgID8gaW50KFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChEZWZhdWx0VHJhdmVyc2FsKQorICB9OworCitwdWJsaWM6CisgIGVudW0geworICAgIENvc3QgPSBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gSHVnZUNvc3QKKyAgICAgICAgIDogRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUgKiBEZXJpdmVkOjpDb2VmZlJlYWRDb3N0ICsgKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lLTEpICogZnVuY3Rvcl90cmFpdHM8RnVuYz46OkNvc3QsCisgICAgVW5yb2xsaW5nTGltaXQgPSBFSUdFTl9VTlJPTExJTkdfTElNSVQgKiAoaW50KFRyYXZlcnNhbCkgPT0gaW50KERlZmF1bHRUcmF2ZXJzYWwpID8gMSA6IGludChQYWNrZXRTaXplKSkKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBVbnJvbGxpbmcgPSBDb3N0IDw9IFVucm9sbGluZ0xpbWl0ID8gQ29tcGxldGVVbnJvbGxpbmcgOiBOb1Vucm9sbGluZworICB9OworICAKKyNpZmRlZiBFSUdFTl9ERUJVR19BU1NJR04KKyAgc3RhdGljIHZvaWQgZGVidWcoKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJYcHI6ICIgPDwgdHlwZWlkKHR5cGVuYW1lIERlcml2ZWQ6OlhwclR5cGUpLm5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyLnNldGYoc3RkOjppb3M6OmhleCwgc3RkOjppb3M6OmJhc2VmaWVsZCk7CisgICAgRUlHRU5fREVCVUdfVkFSKERlcml2ZWQ6OkZsYWdzKQorICAgIHN0ZDo6Y2Vyci51bnNldGYoc3RkOjppb3M6OmhleCk7CisgICAgRUlHRU5fREVCVUdfVkFSKElubmVyTWF4U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoUGFja2V0U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWlnaHRWZWN0b3JpemUpCisgICAgRUlHRU5fREVCVUdfVkFSKE1heUxpbmVhclZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5U2xpY2VWZWN0b3JpemUpCisgICAgRUlHRU5fREVCVUdfVkFSKFRyYXZlcnNhbCkKKyAgICBFSUdFTl9ERUJVR19WQVIoVW5yb2xsaW5nTGltaXQpCisgICAgRUlHRU5fREVCVUdfVkFSKFVucm9sbGluZykKKyAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworICB9CisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCAyIDogdW5yb2xsZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogbm8gdmVjdG9yaXphdGlvbiAqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIERlcml2ZWQsIGludCBTdGFydCwgaW50IExlbmd0aD4KK3N0cnVjdCByZWR1eF9ub3ZlY191bnJvbGxlcgoreworICBlbnVtIHsKKyAgICBIYWxmTGVuZ3RoID0gTGVuZ3RoLzIKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkICZtYXQsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgIHsKKyAgICByZXR1cm4gZnVuYyhyZWR1eF9ub3ZlY191bnJvbGxlcjxGdW5jLCBEZXJpdmVkLCBTdGFydCwgSGFsZkxlbmd0aD46OnJ1bihtYXQsZnVuYyksCisgICAgICAgICAgICAgICAgcmVkdXhfbm92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQrSGFsZkxlbmd0aCwgTGVuZ3RoLUhhbGZMZW5ndGg+OjpydW4obWF0LGZ1bmMpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZCwgaW50IFN0YXJ0Pgorc3RydWN0IHJlZHV4X25vdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFN0YXJ0LCAxPgoreworICBlbnVtIHsKKyAgICBvdXRlciA9IFN0YXJ0IC8gRGVyaXZlZDo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKKyAgICBpbm5lciA9IFN0YXJ0ICUgRGVyaXZlZDo6SW5uZXJTaXplQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCwgY29uc3QgRnVuYyYpCisgIHsKKyAgICByZXR1cm4gbWF0LmNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBpbm5lcik7CisgIH0KK307CisKKy8vIFRoaXMgaXMgYWN0dWFsbHkgZGVhZCBjb2RlIGFuZCB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gSXQgaXMgcmVxdWlyZWQKKy8vIHRvIHByZXZlbnQgZmFsc2Ugd2FybmluZ3MgcmVnYXJkaW5nIGZhaWxlZCBpbmxpbmluZyB0aG91Z2gKKy8vIGZvciAwIGxlbmd0aCBydW4oKSB3aWxsIG5ldmVyIGJlIGNhbGxlZCBhdCBhbGwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLCBpbnQgU3RhcnQ+CitzdHJ1Y3QgcmVkdXhfbm92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQsIDA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oY29uc3QgRGVyaXZlZCYsIGNvbnN0IEZ1bmMmKSB7IHJldHVybiBTY2FsYXIoKTsgfQorfTsKKworLyoqKiB2ZWN0b3JpemF0aW9uICoqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZCwgaW50IFN0YXJ0LCBpbnQgTGVuZ3RoPgorc3RydWN0IHJlZHV4X3ZlY191bnJvbGxlcgoreworICBlbnVtIHsKKyAgICBQYWNrZXRTaXplID0gcmVkdXhfdHJhaXRzPEZ1bmMsIERlcml2ZWQ+OjpQYWNrZXRTaXplLAorICAgIEhhbGZMZW5ndGggPSBMZW5ndGgvMgorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlBhY2tldFR5cGUgUGFja2V0U2NhbGFyOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBjb25zdCBGdW5jJiBmdW5jKQorICB7CisgICAgcmV0dXJuIGZ1bmMucGFja2V0T3AoCisgICAgICAgICAgICByZWR1eF92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQsIEhhbGZMZW5ndGg+OjpydW4obWF0LGZ1bmMpLAorICAgICAgICAgICAgcmVkdXhfdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFN0YXJ0K0hhbGZMZW5ndGgsIExlbmd0aC1IYWxmTGVuZ3RoPjo6cnVuKG1hdCxmdW5jKSApOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLCBpbnQgU3RhcnQ+CitzdHJ1Y3QgcmVkdXhfdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFN0YXJ0LCAxPgoreworICBlbnVtIHsKKyAgICBpbmRleCA9IFN0YXJ0ICogcmVkdXhfdHJhaXRzPEZ1bmMsIERlcml2ZWQ+OjpQYWNrZXRTaXplLAorICAgIG91dGVyID0gaW5kZXggLyBpbnQoRGVyaXZlZDo6SW5uZXJTaXplQXRDb21waWxlVGltZSksCisgICAgaW5uZXIgPSBpbmRleCAlIGludChEZXJpdmVkOjpJbm5lclNpemVBdENvbXBpbGVUaW1lKSwKKyAgICBhbGlnbm1lbnQgPSBEZXJpdmVkOjpBbGlnbm1lbnQKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVkdXhfdHJhaXRzPEZ1bmMsIERlcml2ZWQ+OjpQYWNrZXRUeXBlIFBhY2tldFNjYWxhcjsKKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCwgY29uc3QgRnVuYyYpCisgIHsKKyAgICByZXR1cm4gbWF0LnRlbXBsYXRlIHBhY2tldEJ5T3V0ZXJJbm5lcjxhbGlnbm1lbnQsUGFja2V0U2NhbGFyPihvdXRlciwgaW5uZXIpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgMyA6IGltcGxlbWVudGF0aW9uIG9mIGFsbCBjYXNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLAorICAgICAgICAgaW50IFRyYXZlcnNhbCA9IHJlZHV4X3RyYWl0czxGdW5jLCBEZXJpdmVkPjo6VHJhdmVyc2FsLAorICAgICAgICAgaW50IFVucm9sbGluZyA9IHJlZHV4X3RyYWl0czxGdW5jLCBEZXJpdmVkPjo6VW5yb2xsaW5nCis+CitzdHJ1Y3QgcmVkdXhfaW1wbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIERlZmF1bHRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBjb25zdCBGdW5jJiBmdW5jKQorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1hdC5yb3dzKCk+MCAmJiBtYXQuY29scygpPjAgJiYgInlvdSBhcmUgdXNpbmcgYW4gZW1wdHkgbWF0cml4Iik7CisgICAgU2NhbGFyIHJlczsKKyAgICByZXMgPSBtYXQuY29lZmZCeU91dGVySW5uZXIoMCwgMCk7CisgICAgZm9yKEluZGV4IGkgPSAxOyBpIDwgbWF0LmlubmVyU2l6ZSgpOyArK2kpCisgICAgICByZXMgPSBmdW5jKHJlcywgbWF0LmNvZWZmQnlPdXRlcklubmVyKDAsIGkpKTsKKyAgICBmb3IoSW5kZXggaSA9IDE7IGkgPCBtYXQub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgIGZvcihJbmRleCBqID0gMDsgaiA8IG1hdC5pbm5lclNpemUoKTsgKytqKQorICAgICAgICByZXMgPSBmdW5jKHJlcywgbWF0LmNvZWZmQnlPdXRlcklubmVyKGksIGopKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHJlZHV4X2ltcGw8RnVuYyxEZXJpdmVkLCBEZWZhdWx0VHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZz4KKyAgOiBwdWJsaWMgcmVkdXhfbm92ZWNfdW5yb2xsZXI8RnVuYyxEZXJpdmVkLCAwLCBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZT4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHJlZHV4X2ltcGw8RnVuYywgRGVyaXZlZCwgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmc+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlBhY2tldFR5cGUgUGFja2V0U2NhbGFyOworCisgIHN0YXRpYyBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCwgY29uc3QgRnVuYyYgZnVuYykKKyAgeworICAgIGNvbnN0IEluZGV4IHNpemUgPSBtYXQuc2l6ZSgpOworICAgIAorICAgIGNvbnN0IEluZGV4IHBhY2tldFNpemUgPSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlBhY2tldFNpemU7CisgICAgY29uc3QgaW50IHBhY2tldEFsaWdubWVudCA9IHVucGFja2V0X3RyYWl0czxQYWNrZXRTY2FsYXI+OjphbGlnbm1lbnQ7CisgICAgZW51bSB7CisgICAgICBhbGlnbm1lbnQwID0gKGJvb2woRGVyaXZlZDo6RmxhZ3MgJiBEaXJlY3RBY2Nlc3NCaXQpICYmIGJvb2wocGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXIpKSA/IGludChwYWNrZXRBbGlnbm1lbnQpIDogaW50KFVuYWxpZ25lZCksCisgICAgICBhbGlnbm1lbnQgPSBFSUdFTl9QTEFJTl9FTlVNX01BWChhbGlnbm1lbnQwLCBEZXJpdmVkOjpBbGlnbm1lbnQpCisgICAgfTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkU3RhcnQgPSBpbnRlcm5hbDo6Zmlyc3RfZGVmYXVsdF9hbGlnbmVkKG1hdC5uZXN0ZWRFeHByZXNzaW9uKCkpOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRTaXplMiA9ICgoc2l6ZS1hbGlnbmVkU3RhcnQpLygyKnBhY2tldFNpemUpKSooMipwYWNrZXRTaXplKTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkU2l6ZSA9ICgoc2l6ZS1hbGlnbmVkU3RhcnQpLyhwYWNrZXRTaXplKSkqKHBhY2tldFNpemUpOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRFbmQyID0gYWxpZ25lZFN0YXJ0ICsgYWxpZ25lZFNpemUyOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRFbmQgID0gYWxpZ25lZFN0YXJ0ICsgYWxpZ25lZFNpemU7CisgICAgU2NhbGFyIHJlczsKKyAgICBpZihhbGlnbmVkU2l6ZSkKKyAgICB7CisgICAgICBQYWNrZXRTY2FsYXIgcGFja2V0X3JlczAgPSBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudCxQYWNrZXRTY2FsYXI+KGFsaWduZWRTdGFydCk7CisgICAgICBpZihhbGlnbmVkU2l6ZT5wYWNrZXRTaXplKSAvLyB3ZSBoYXZlIGF0IGxlYXN0IHR3byBwYWNrZXRzIHRvIHBhcnRseSB1bnJvbGwgdGhlIGxvb3AKKyAgICAgIHsKKyAgICAgICAgUGFja2V0U2NhbGFyIHBhY2tldF9yZXMxID0gbWF0LnRlbXBsYXRlIHBhY2tldDxhbGlnbm1lbnQsUGFja2V0U2NhbGFyPihhbGlnbmVkU3RhcnQrcGFja2V0U2l6ZSk7CisgICAgICAgIGZvcihJbmRleCBpbmRleCA9IGFsaWduZWRTdGFydCArIDIqcGFja2V0U2l6ZTsgaW5kZXggPCBhbGlnbmVkRW5kMjsgaW5kZXggKz0gMipwYWNrZXRTaXplKQorICAgICAgICB7CisgICAgICAgICAgcGFja2V0X3JlczAgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMwLCBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudCxQYWNrZXRTY2FsYXI+KGluZGV4KSk7CisgICAgICAgICAgcGFja2V0X3JlczEgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMxLCBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudCxQYWNrZXRTY2FsYXI+KGluZGV4K3BhY2tldFNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhY2tldF9yZXMwID0gZnVuYy5wYWNrZXRPcChwYWNrZXRfcmVzMCxwYWNrZXRfcmVzMSk7CisgICAgICAgIGlmKGFsaWduZWRFbmQ+YWxpZ25lZEVuZDIpCisgICAgICAgICAgcGFja2V0X3JlczAgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMwLCBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudCxQYWNrZXRTY2FsYXI+KGFsaWduZWRFbmQyKSk7CisgICAgICB9CisgICAgICByZXMgPSBmdW5jLnByZWR1eChwYWNrZXRfcmVzMCk7CisKKyAgICAgIGZvcihJbmRleCBpbmRleCA9IDA7IGluZGV4IDwgYWxpZ25lZFN0YXJ0OyArK2luZGV4KQorICAgICAgICByZXMgPSBmdW5jKHJlcyxtYXQuY29lZmYoaW5kZXgpKTsKKworICAgICAgZm9yKEluZGV4IGluZGV4ID0gYWxpZ25lZEVuZDsgaW5kZXggPCBzaXplOyArK2luZGV4KQorICAgICAgICByZXMgPSBmdW5jKHJlcyxtYXQuY29lZmYoaW5kZXgpKTsKKyAgICB9CisgICAgZWxzZSAvLyB0b28gc21hbGwgdG8gdmVjdG9yaXplIGFueXRoaW5nLgorICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBkeW5hbWljLXNpemUgaGVuY2UgaW5lZmZpY2llbnQgYW55d2F5IGZvciBzdWNoIHNtYWxsIHNpemVzLCBkb24ndCB0cnkgdG8gb3B0aW1pemUuCisgICAgeworICAgICAgcmVzID0gbWF0LmNvZWZmKDApOworICAgICAgZm9yKEluZGV4IGluZGV4ID0gMTsgaW5kZXggPCBzaXplOyArK2luZGV4KQorICAgICAgICByZXMgPSBmdW5jKHJlcyxtYXQuY29lZmYoaW5kZXgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCisvLyBOT1RFOiBmb3IgU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsIHdlIHNpbXBseSBieXBhc3MgdW5yb2xsaW5nCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLCBpbnQgVW5yb2xsaW5nPgorc3RydWN0IHJlZHV4X2ltcGw8RnVuYywgRGVyaXZlZCwgU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsLCBVbnJvbGxpbmc+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlBhY2tldFR5cGUgUGFja2V0VHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgU2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkICZtYXQsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQobWF0LnJvd3MoKT4wICYmIG1hdC5jb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhbiBlbXB0eSBtYXRyaXgiKTsKKyAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBtYXQuaW5uZXJTaXplKCk7CisgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gbWF0Lm91dGVyU2l6ZSgpOworICAgIGVudW0geworICAgICAgcGFja2V0U2l6ZSA9IHJlZHV4X3RyYWl0czxGdW5jLCBEZXJpdmVkPjo6UGFja2V0U2l6ZQorICAgIH07CisgICAgY29uc3QgSW5kZXggcGFja2V0ZWRJbm5lclNpemUgPSAoKGlubmVyU2l6ZSkvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZTsKKyAgICBTY2FsYXIgcmVzOworICAgIGlmKHBhY2tldGVkSW5uZXJTaXplKQorICAgIHsKKyAgICAgIFBhY2tldFR5cGUgcGFja2V0X3JlcyA9IG1hdC50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkLFBhY2tldFR5cGU+KDAsMCk7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG91dGVyU2l6ZTsgKytqKQorICAgICAgICBmb3IoSW5kZXggaT0oaj09MD9wYWNrZXRTaXplOjApOyBpPHBhY2tldGVkSW5uZXJTaXplOyBpKz1JbmRleChwYWNrZXRTaXplKSkKKyAgICAgICAgICBwYWNrZXRfcmVzID0gZnVuYy5wYWNrZXRPcChwYWNrZXRfcmVzLCBtYXQudGVtcGxhdGUgcGFja2V0QnlPdXRlcklubmVyPFVuYWxpZ25lZCxQYWNrZXRUeXBlPihqLGkpKTsKKworICAgICAgcmVzID0gZnVuYy5wcmVkdXgocGFja2V0X3Jlcyk7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG91dGVyU2l6ZTsgKytqKQorICAgICAgICBmb3IoSW5kZXggaT1wYWNrZXRlZElubmVyU2l6ZTsgaTxpbm5lclNpemU7ICsraSkKKyAgICAgICAgICByZXMgPSBmdW5jKHJlcywgbWF0LmNvZWZmQnlPdXRlcklubmVyKGosaSkpOworICAgIH0KKyAgICBlbHNlIC8vIHRvbyBzbWFsbCB0byB2ZWN0b3JpemUgYW55dGhpbmcuCisgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGR5bmFtaWMtc2l6ZSBoZW5jZSBpbmVmZmljaWVudCBhbnl3YXkgZm9yIHN1Y2ggc21hbGwgc2l6ZXMsIGRvbid0IHRyeSB0byBvcHRpbWl6ZS4KKyAgICB7CisgICAgICByZXMgPSByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIERlZmF1bHRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPjo6cnVuKG1hdCwgZnVuYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlBhY2tldFR5cGUgUGFja2V0U2NhbGFyOworICBlbnVtIHsKKyAgICBQYWNrZXRTaXplID0gcmVkdXhfdHJhaXRzPEZ1bmMsIERlcml2ZWQ+OjpQYWNrZXRTaXplLAorICAgIFNpemUgPSBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSwKKyAgICBWZWN0b3JpemVkU2l6ZSA9IChTaXplIC8gUGFja2V0U2l6ZSkgKiBQYWNrZXRTaXplCisgIH07CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBjb25zdCBGdW5jJiBmdW5jKQorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1hdC5yb3dzKCk+MCAmJiBtYXQuY29scygpPjAgJiYgInlvdSBhcmUgdXNpbmcgYW4gZW1wdHkgbWF0cml4Iik7CisgICAgaWYgKFZlY3Rvcml6ZWRTaXplID4gMCkgeworICAgICAgU2NhbGFyIHJlcyA9IGZ1bmMucHJlZHV4KHJlZHV4X3ZlY191bnJvbGxlcjxGdW5jLCBEZXJpdmVkLCAwLCBTaXplIC8gUGFja2V0U2l6ZT46OnJ1bihtYXQsZnVuYykpOworICAgICAgaWYgKFZlY3Rvcml6ZWRTaXplICE9IFNpemUpCisgICAgICAgIHJlcyA9IGZ1bmMocmVzLHJlZHV4X25vdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFZlY3Rvcml6ZWRTaXplLCBTaXplLVZlY3Rvcml6ZWRTaXplPjo6cnVuKG1hdCxmdW5jKSk7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiByZWR1eF9ub3ZlY191bnJvbGxlcjxGdW5jLCBEZXJpdmVkLCAwLCBTaXplPjo6cnVuKG1hdCxmdW5jKTsKKyAgICB9CisgIH0KK307CisKKy8vIGV2YWx1YXRvciBhZGFwdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBfWHByVHlwZT4KK2NsYXNzIHJlZHV4X2V2YWx1YXRvcgoreworcHVibGljOgorICB0eXBlZGVmIF9YcHJUeXBlIFhwclR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IHJlZHV4X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlICZ4cHIpIDogbV9ldmFsdWF0b3IoeHByKSwgbV94cHIoeHByKSB7fQorICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6UGFja2V0U2NhbGFyIFBhY2tldFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpQYWNrZXRSZXR1cm5UeXBlIFBhY2tldFJldHVyblR5cGU7CisgIAorICBlbnVtIHsKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IFhwclR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gWHByVHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgLy8gVE9ETyB3ZSBzaG91bGQgbm90IHJlbW92ZSBEaXJlY3RBY2Nlc3NCaXQgYW5kIHJhdGhlciBmaW5kIGFuIGVsZWdhbnQgd2F5IHRvIHF1ZXJ5IHRoZSBhbGlnbm1lbnQgb2Zmc2V0IGF0IHJ1bnRpbWUgZnJvbSB0aGUgZXZhbHVhdG9yCisgICAgRmxhZ3MgPSBldmFsdWF0b3I8WHByVHlwZT46OkZsYWdzICYgfkRpcmVjdEFjY2Vzc0JpdCwKKyAgICBJc1Jvd01ham9yID0gWHByVHlwZTo6SXNSb3dNYWpvciwKKyAgICBTaXplQXRDb21waWxlVGltZSA9IFhwclR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgIElubmVyU2l6ZUF0Q29tcGlsZVRpbWUgPSBYcHJUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8WHByVHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgQWxpZ25tZW50ID0gZXZhbHVhdG9yPFhwclR5cGU+OjpBbGlnbm1lbnQKKyAgfTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3hwci5yb3dzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1feHByLmNvbHMoKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV94cHIuc2l6ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1feHByLmlubmVyU2l6ZSgpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1feHByLm91dGVyU2l6ZSgpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7IHJldHVybiBtX2V2YWx1YXRvci5jb2VmZihyb3csIGNvbCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsgcmV0dXJuIG1fZXZhbHVhdG9yLmNvZWZmKGluZGV4KTsgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgUGFja2V0VHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsgcmV0dXJuIG1fZXZhbHVhdG9yLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCk7IH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIFBhY2tldFR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7IHJldHVybiBtX2V2YWx1YXRvci50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4oaW5kZXgpOyB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQworICBDb2VmZlJldHVyblR5cGUgY29lZmZCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKSBjb25zdAorICB7IHJldHVybiBtX2V2YWx1YXRvci5jb2VmZihJc1Jvd01ham9yID8gb3V0ZXIgOiBpbm5lciwgSXNSb3dNYWpvciA/IGlubmVyIDogb3V0ZXIpOyB9CisgIAorICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIFBhY2tldFR5cGUgcGFja2V0QnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikgY29uc3QKKyAgeyByZXR1cm4gbV9ldmFsdWF0b3IudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlLFBhY2tldFR5cGU+KElzUm93TWFqb3IgPyBvdXRlciA6IGlubmVyLCBJc1Jvd01ham9yID8gaW5uZXIgOiBvdXRlcik7IH0KKyAgCisgIGNvbnN0IFhwclR5cGUgJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKyAgCitwcm90ZWN0ZWQ6CisgIGludGVybmFsOjpldmFsdWF0b3I8WHByVHlwZT4gbV9ldmFsdWF0b3I7CisgIGNvbnN0IFhwclR5cGUgJm1feHByOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCA0IDogcHVibGljIEFQSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKiBccmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgZnVsbCByZWR1eCBvcGVyYXRpb24gb24gdGhlIHdob2xlIG1hdHJpeCBvciB2ZWN0b3IgdXNpbmcgXGEgZnVuYworICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBCaW5hcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3RvciBcYSBmdW5jIHdoaWNoIG11c3QgYmUKKyAgKiBhbiBhc3NvY2lhdGl2ZSBvcGVyYXRvci4gQm90aCBjdXJyZW50IEMrKzk4IGFuZCBDKysxMSBmdW5jdG9yIHN0eWxlcyBhcmUgaGFuZGxlZC4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnN1bSgpLCBEZW5zZUJhc2U6Om1pbkNvZWZmKCksIERlbnNlQmFzZTo6bWF4Q29lZmYoKSwgTWF0cml4QmFzZTo6Y29sd2lzZSgpLCBNYXRyaXhCYXNlOjpyb3d3aXNlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46OnJlZHV4KGNvbnN0IEZ1bmMmIGZ1bmMpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydCh0aGlzLT5yb3dzKCk+MCAmJiB0aGlzLT5jb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhbiBlbXB0eSBtYXRyaXgiKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWR1eF9ldmFsdWF0b3I8RGVyaXZlZD4gVGhpc0V2YWx1YXRvcjsKKyAgVGhpc0V2YWx1YXRvciB0aGlzRXZhbChkZXJpdmVkKCkpOworICAKKyAgcmV0dXJuIGludGVybmFsOjpyZWR1eF9pbXBsPEZ1bmMsIFRoaXNFdmFsdWF0b3I+OjpydW4odGhpc0V2YWwsIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgdGhlIG1pbmltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiBcYyAqdGhpcy4KKyAgKiBcd2FybmluZyB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBcYyAqdGhpcyBjb250YWlucyBOYU4uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6bWluQ29lZmYoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpLnJlZHV4KEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXIsU2NhbGFyPigpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBtYXhpbXVtIG9mIGFsbCBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMuCisgICogXHdhcm5pbmcgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgXGMgKnRoaXMgY29udGFpbnMgTmFOLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1heENvZWZmKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKS5yZWR1eChFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9tYXhfb3A8U2NhbGFyLFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgc3VtIG9mIGFsbCBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMKKyAgKgorICAqIElmIFxjICp0aGlzIGlzIGVtcHR5LCB0aGVuIHRoZSB2YWx1ZSAwIGlzIHJldHVybmVkLgorICAqCisgICogXHNhIHRyYWNlKCksIHByb2QoKSwgbWVhbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6c3VtKCkgY29uc3QKK3sKKyAgaWYoU2l6ZUF0Q29tcGlsZVRpbWU9PTAgfHwgKFNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljICYmIHNpemUoKT09MCkpCisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgcmV0dXJuIGRlcml2ZWQoKS5yZWR1eChFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWVhbiBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzCisqCisqIFxzYSB0cmFjZSgpLCBwcm9kKCksIHN1bSgpCisqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1lYW4oKSBjb25zdAoreworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyAgI3ByYWdtYSB3YXJuaW5nIHB1c2gKKyAgI3ByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDIyNTkgKQorI2VuZGlmCisgIHJldHVybiBTY2FsYXIoZGVyaXZlZCgpLnJlZHV4KEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPigpKSkgLyBTY2FsYXIodGhpcy0+c2l6ZSgpKTsKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisgICNwcmFnbWEgd2FybmluZyBwb3AKKyNlbmRpZgorfQorCisvKiogXHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9wcm9kLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcHJvZC5vdXQKKyAgKgorICAqIFxzYSBzdW0oKSwgbWVhbigpLCB0cmFjZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6cHJvZCgpIGNvbnN0Cit7CisgIGlmKFNpemVBdENvbXBpbGVUaW1lPT0wIHx8IChTaXplQXRDb21waWxlVGltZT09RHluYW1pYyAmJiBzaXplKCk9PTApKQorICAgIHJldHVybiBTY2FsYXIoMSk7CisgIHJldHVybiBkZXJpdmVkKCkucmVkdXgoRWlnZW46OmludGVybmFsOjpzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgdGhlIHRyYWNlIG9mIFxjICp0aGlzLCBpLmUuIHRoZSBzdW0gb2YgdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgbWFpbiBkaWFnb25hbC4KKyAgKgorICAqIFxjICp0aGlzIGNhbiBiZSBhbnkgbWF0cml4LCBub3QgbmVjZXNzYXJpbHkgc3F1YXJlLgorICAqCisgICogXHNhIGRpYWdvbmFsKCksIHN1bSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK01hdHJpeEJhc2U8RGVyaXZlZD46OnRyYWNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKS5kaWFnb25hbCgpLnN1bSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFRFVYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1JlZi5oIGIvRWlnZW4vc3JjL0NvcmUvUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMjRmNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1JlZi5oCkBAIC0wLDAgKzEsMjgxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVGX0gKKyNkZWZpbmUgRUlHRU5fUkVGX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9QbGFpbk9iamVjdFR5cGUsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0cmlkZVR5cGU+CitzdHJ1Y3QgdHJhaXRzPFJlZjxfUGxhaW5PYmplY3RUeXBlLCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPE1hcDxfUGxhaW5PYmplY3RUeXBlLCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KK3sKKyAgdHlwZWRlZiBfUGxhaW5PYmplY3RUeXBlIFBsYWluT2JqZWN0VHlwZTsKKyAgdHlwZWRlZiBfU3RyaWRlVHlwZSBTdHJpZGVUeXBlOworICBlbnVtIHsKKyAgICBPcHRpb25zID0gX09wdGlvbnMsCisgICAgRmxhZ3MgPSB0cmFpdHM8TWFwPF9QbGFpbk9iamVjdFR5cGUsIF9PcHRpb25zLCBfU3RyaWRlVHlwZT4gPjo6RmxhZ3MgfCBOZXN0QnlSZWZCaXQsCisgICAgQWxpZ25tZW50ID0gdHJhaXRzPE1hcDxfUGxhaW5PYmplY3RUeXBlLCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID46OkFsaWdubWVudAorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBtYXRjaCB7CisgICAgZW51bSB7CisgICAgICBIYXNEaXJlY3RBY2Nlc3MgPSBpbnRlcm5hbDo6aGFzX2RpcmVjdF9hY2Nlc3M8RGVyaXZlZD46OnJldCwKKyAgICAgIFN0b3JhZ2VPcmRlck1hdGNoID0gUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgfHwgRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lIHx8ICgoUGxhaW5PYmplY3RUeXBlOjpGbGFncyZSb3dNYWpvckJpdCk9PShEZXJpdmVkOjpGbGFncyZSb3dNYWpvckJpdCkpLAorICAgICAgSW5uZXJTdHJpZGVNYXRjaCA9IGludChTdHJpZGVUeXBlOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpPT1pbnQoRHluYW1pYykKKyAgICAgICAgICAgICAgICAgICAgICB8fCBpbnQoU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKT09aW50KERlcml2ZWQ6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoaW50KFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSk9PTAgJiYgaW50KERlcml2ZWQ6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSk9PTEpLAorICAgICAgT3V0ZXJTdHJpZGVNYXRjaCA9IERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICAgICAgIHx8IGludChTdHJpZGVUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpPT1pbnQoRHluYW1pYykgfHwgaW50KFN0cmlkZVR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSk9PWludChEZXJpdmVkOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpLAorICAgICAgLy8gTk9URSwgdGhpcyBpbmRpcmVjdGlvbiBvZiBldmFsdWF0b3I8RGVyaXZlZD46OkFsaWdubWVudCBpcyBuZWVkZWQKKyAgICAgIC8vIHRvIHdvcmthcm91bmQgYSB2ZXJ5IHN0cmFuZ2UgYnVnIGluIE1TVkMgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbgorICAgICAgLy8gb2YgaGFzXyphcnlfb3BlcmF0b3IgaW4gZXZhbHVhdG9yPEN3aXNlTnVsbGFyeU9wPi4KKyAgICAgIC8vIFRoaXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgdmVyeSBzZW5zaXRpdmUuIEZvciBpbnN0YW5jZSwgc2ltcGx5IGFkZGluZyBwYXJlbnRoZXNpcworICAgICAgLy8gYXMgIkRlcml2ZWRBbGlnbm1lbnQgPSAoaW50KGV2YWx1YXRvcjxEZXJpdmVkPjo6QWxpZ25tZW50KSksIiB3aWxsIG1ha2UgTVNWQyBmYWlsLi4uCisgICAgICBEZXJpdmVkQWxpZ25tZW50ID0gaW50KGV2YWx1YXRvcjxEZXJpdmVkPjo6QWxpZ25tZW50KSwKKyAgICAgIEFsaWdubWVudE1hdGNoID0gKGludCh0cmFpdHM8UGxhaW5PYmplY3RUeXBlPjo6QWxpZ25tZW50KT09aW50KFVuYWxpZ25lZCkpIHx8IChEZXJpdmVkQWxpZ25tZW50ID49IGludChBbGlnbm1lbnQpKSwgLy8gRklYTUUgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdmVyeSBjbGVhciwgaXQgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQKKyAgICAgIFNjYWxhclR5cGVNYXRjaCA9IGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZTo6U2NhbGFyLCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSwKKyAgICAgIE1hdGNoQXRDb21waWxlVGltZSA9IEhhc0RpcmVjdEFjY2VzcyAmJiBTdG9yYWdlT3JkZXJNYXRjaCAmJiBJbm5lclN0cmlkZU1hdGNoICYmIE91dGVyU3RyaWRlTWF0Y2ggJiYgQWxpZ25tZW50TWF0Y2ggJiYgU2NhbGFyVHlwZU1hdGNoCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxNYXRjaEF0Q29tcGlsZVRpbWUsaW50ZXJuYWw6OnRydWVfdHlwZSxpbnRlcm5hbDo6ZmFsc2VfdHlwZT46OnR5cGUgdHlwZTsKKyAgfTsKKyAgCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxSZWZCYXNlPERlcml2ZWQ+ID4gOiBwdWJsaWMgdHJhaXRzPERlcml2ZWQ+IHt9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFJlZkJhc2UKKyA6IHB1YmxpYyBNYXBCYXNlPERlcml2ZWQ+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UGxhaW5PYmplY3RUeXBlIFBsYWluT2JqZWN0VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdHJpZGVUeXBlIFN0cmlkZVR5cGU7CisKK3B1YmxpYzoKKworICB0eXBlZGVmIE1hcEJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShSZWZCYXNlKQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IDAgPyBtX3N0cmlkZS5pbm5lcigpIDogMTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IDAgPyBtX3N0cmlkZS5vdXRlcigpCisgICAgICAgICA6IElzVmVjdG9yQXRDb21waWxlVGltZSA/IHRoaXMtPnNpemUoKQorICAgICAgICAgOiBpbnQoRmxhZ3MpJlJvd01ham9yQml0ID8gdGhpcy0+Y29scygpCisgICAgICAgICA6IHRoaXMtPnJvd3MoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFJlZkJhc2UoKQorICAgIDogQmFzZSgwLFJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljPzA6Um93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWM/MDpDb2xzQXRDb21waWxlVGltZSksCisgICAgICAvLyBTdHJpZGU8PiBkb2VzIG5vdCBhbGxvdyBkZWZhdWx0IGN0b3IgZm9yIER5bmFtaWMgc3RyaWRlcywgc28gbGV0JyBpbml0aWFsaXplIGl0IHdpdGggZHVtbXkgdmFsdWVzOgorICAgICAgbV9zdHJpZGUoU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPT1EeW5hbWljPzA6U3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT1EeW5hbWljPzA6U3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKQorICB7fQorICAKKyAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhSZWZCYXNlKQorCitwcm90ZWN0ZWQ6CisKKyAgdHlwZWRlZiBTdHJpZGU8U3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT4gU3RyaWRlQmFzZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uPgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnN0cnVjdChFeHByZXNzaW9uJiBleHByKQorICB7CisgICAgaWYoUGxhaW5PYmplY3RUeXBlOjpSb3dzQXRDb21waWxlVGltZT09MSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZXhwci5yb3dzKCk9PTEgfHwgZXhwci5jb2xzKCk9PTEpOworICAgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShleHByLmRhdGEoKSwgMSwgZXhwci5zaXplKCkpOworICAgIH0KKyAgICBlbHNlIGlmKFBsYWluT2JqZWN0VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PTEpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGV4cHIucm93cygpPT0xIHx8IGV4cHIuY29scygpPT0xKTsKKyAgICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UoZXhwci5kYXRhKCksIGV4cHIuc2l6ZSgpLCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShleHByLmRhdGEoKSwgZXhwci5yb3dzKCksIGV4cHIuY29scygpKTsKKyAgICAKKyAgICBpZihFeHByZXNzaW9uOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgKCFQbGFpbk9iamVjdFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSkgJiYgKChFeHByZXNzaW9uOjpGbGFncyZSb3dNYWpvckJpdCkhPShQbGFpbk9iamVjdFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSkpCisgICAgICA6Om5ldyAoJm1fc3RyaWRlKSBTdHJpZGVCYXNlKGV4cHIuaW5uZXJTdHJpZGUoKSwgU3RyaWRlVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0wPzA6MSk7CisgICAgZWxzZQorICAgICAgOjpuZXcgKCZtX3N0cmlkZSkgU3RyaWRlQmFzZShTdHJpZGVUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWU9PTA/MDpleHByLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MD8wOmV4cHIuaW5uZXJTdHJpZGUoKSk7ICAgIAorICB9CisKKyAgU3RyaWRlQmFzZSBtX3N0cmlkZTsKK307CisKKy8qKiBcY2xhc3MgUmVmCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBBIG1hdHJpeCBvciB2ZWN0b3IgZXhwcmVzc2lvbiBtYXBwaW5nIGFuIGV4aXN0aW5nIGV4cHJlc3Npb24KKyAgKgorICAqIFx0cGFyYW0gUGxhaW5PYmplY3RUeXBlIHRoZSBlcXVpdmFsZW50IG1hdHJpeCB0eXBlIG9mIHRoZSBtYXBwZWQgZGF0YQorICAqIFx0cGFyYW0gT3B0aW9ucyBzcGVjaWZpZXMgdGhlIHBvaW50ZXIgYWxpZ25tZW50IGluIGJ5dGVzLiBJdCBjYW4gYmU6IFxjICNBbGlnbmVkMTI4LCAsIFxjICNBbGlnbmVkNjQsIFxjICNBbGlnbmVkMzIsIFxjICNBbGlnbmVkMTYsIFxjICNBbGlnbmVkOCBvciBcYyAjVW5hbGlnbmVkLgorICAqICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBcYyAjVW5hbGlnbmVkLgorICAqIFx0cGFyYW0gU3RyaWRlVHlwZSBvcHRpb25hbGx5IHNwZWNpZmllcyBzdHJpZGVzLiBCeSBkZWZhdWx0LCBSZWYgaW1wbGllcyBhIGNvbnRpZ3VvdXMgc3RvcmFnZSBhbG9uZyB0aGUgaW5uZXIgZGltZW5zaW9uIChpbm5lciBzdHJpZGU9PTEpLAorICAqICAgICAgICAgICAgICAgICAgIGJ1dCBhY2NlcHRzIGEgdmFyaWFibGUgb3V0ZXIgc3RyaWRlIChsZWFkaW5nIGRpbWVuc2lvbikuCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIHN0cmlkZXMuCisgICogICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgcGFzc2VkIGhlcmUgbXVzdCBiZSBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBTdHJpZGUgdGVtcGxhdGUsIHNlZSBleGFtcGxlcyBiZWxvdy4KKyAgKgorICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3YXkgdG8gd3JpdGUgbm9uLXRlbXBsYXRlIGZ1bmN0aW9ucyB0YWtpbmcgRWlnZW4gb2JqZWN0cyBhcyBwYXJhbWV0ZXJzIHdoaWxlIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgY29waWVzLgorICAqIEEgUmVmPD4gb2JqZWN0IGNhbiByZXByZXNlbnQgZWl0aGVyIGEgY29uc3QgZXhwcmVzc2lvbiBvciBhIGwtdmFsdWU6CisgICogXGNvZGUKKyAgKiAvLyBpbi1vdXQgYXJndW1lbnQ6CisgICogdm9pZCBmb28xKFJlZjxWZWN0b3JYZj4geCk7CisgICoKKyAgKiAvLyByZWFkLW9ubHkgY29uc3QgYXJndW1lbnQ6CisgICogdm9pZCBmb28yKGNvbnN0IFJlZjxjb25zdCBWZWN0b3JYZj4mIHgpOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiB0aGUgaW4tb3V0IGNhc2UsIHRoZSBpbnB1dCBhcmd1bWVudCBtdXN0IHNhdGlzZnkgdGhlIGNvbnN0cmFpbnRzIG9mIHRoZSBhY3R1YWwgUmVmPD4gdHlwZSwgb3RoZXJ3aXNlIGEgY29tcGlsYXRpb24gaXNzdWUgd2lsbCBiZSB0cmlnZ2VyZWQuCisgICogQnkgZGVmYXVsdCwgYSBSZWY8VmVjdG9yWGY+IGNhbiByZWZlcmVuY2UgYW55IGRlbnNlIHZlY3RvciBleHByZXNzaW9uIG9mIGZsb2F0IGhhdmluZyBhIGNvbnRpZ3VvdXMgbWVtb3J5IGxheW91dC4KKyAgKiBMaWtld2lzZSwgYSBSZWY8TWF0cml4WGY+IGNhbiByZWZlcmVuY2UgYW55IGNvbHVtbi1tYWpvciBkZW5zZSBtYXRyaXggZXhwcmVzc2lvbiBvZiBmbG9hdCB3aG9zZSBjb2x1bW4ncyBlbGVtZW50cyBhcmUgY29udGlndW91c2x5IHN0b3JlZCB3aXRoCisgICogdGhlIHBvc3NpYmlsaXR5IHRvIGhhdmUgYSBjb25zdGFudCBzcGFjZSBpbi1iZXR3ZWVuIGVhY2ggY29sdW1uLCBpLmUuIHRoZSBpbm5lciBzdHJpZGUgbXVzdCBiZSBlcXVhbCB0byAxLCBidXQgdGhlIG91dGVyIHN0cmlkZSAob3IgbGVhZGluZyBkaW1lbnNpb24pCisgICogY2FuIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHJvd3MuCisgICoKKyAgKiBJbiB0aGUgY29uc3QgY2FzZSwgaWYgdGhlIGlucHV0IGV4cHJlc3Npb24gZG9lcyBub3QgbWF0Y2ggdGhlIGFib3ZlIHJlcXVpcmVtZW50LCB0aGVuIGl0IGlzIGV2YWx1YXRlZCBpbnRvIGEgdGVtcG9yYXJ5IGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisgICogXGNvZGUKKyAgKiBNYXRyaXhYZiBBOworICAqIFZlY3RvclhmIGE7CisgICogZm9vMShhLmhlYWQoKSk7ICAgICAgICAgICAgIC8vIE9LCisgICogZm9vMShBLmNvbCgpKTsgICAgICAgICAgICAgIC8vIE9LCisgICogZm9vMShBLnJvdygpKTsgICAgICAgICAgICAgIC8vIENvbXBpbGF0aW9uIGVycm9yIGJlY2F1c2UgaGVyZSBpbm5lcnN0cmlkZSE9MQorICAqIGZvbzIoQS5yb3coKSk7ICAgICAgICAgICAgICAvLyBDb21waWxhdGlvbiBlcnJvciBiZWNhdXNlIEEucm93KCkgaXMgYSAxeE4gb2JqZWN0IHdoaWxlIGZvbzIgaXMgZXhwZWN0aW5nIGEgTngxIG9iamVjdAorICAqIGZvbzIoQS5yb3coKS50cmFuc3Bvc2UoKSk7ICAvLyBUaGUgcm93IGlzIGNvcGllZCBpbnRvIGEgY29udGlndW91cyB0ZW1wb3JhcnkKKyAgKiBmb28yKDIqYSk7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkKKyAgKiBmb28yKEEuY29sKCkuc2VnbWVudCgyLDQpKTsgLy8gTm8gdGVtcG9yYXJ5CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoZSByYW5nZSBvZiBpbnB1dHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCB3aXRob3V0IHRlbXBvcmFyeSBjYW4gYmUgZW5sYXJnZWQgdXNpbmcgdGhlIGxhc3QgdHdvIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICogSGVyZSBpcyBhbiBleGFtcGxlIGFjY2VwdGluZyBhbiBpbm5lcnN0cmlkZSE9MToKKyAgKiBcY29kZQorICAqIC8vIGluLW91dCBhcmd1bWVudDoKKyAgKiB2b2lkIGZvbzMoUmVmPFZlY3RvclhmLDAsSW5uZXJTdHJpZGU8PiA+IHgpOworICAqIGZvbzMoQS5yb3coKSk7ICAgICAgICAgICAgICAvLyBPSworICAqIFxlbmRjb2RlCisgICogVGhlIGRvd25zaWRlIGhlcmUgaXMgdGhhdCB0aGUgZnVuY3Rpb24gZm9vMyBtaWdodCBiZSBzaWduaWZpY2FudGx5IHNsb3dlciB0aGFuIGZvbzEgYmVjYXVzZSBpdCB3b24ndCBiZSBhYmxlIHRvIGV4cGxvaXQgdmVjdG9yaXphdGlvbiwgYW5kIHdpbGwgaW52b2x2ZSBtb3JlCisgICogZXhwZW5zaXZlIGFkZHJlc3MgY29tcHV0YXRpb25zIGV2ZW4gaWYgdGhlIGlucHV0IGlzIGNvbnRpZ3VvdXNseSBzdG9yZWQgaW4gbWVtb3J5LiBUbyBvdmVyY29tZSB0aGlzIGlzc3VlLCBvbmUgbWlnaHQgcHJvcG9zZSB0byBvdmVybG9hZCBpbnRlcm5hbGx5IGNhbGxpbmcgYQorICAqIHRlbXBsYXRlIGZ1bmN0aW9uLCBlLmcuOgorICAqIFxjb2RlCisgICogLy8gaW4gdGhlIC5oOgorICAqIHZvaWQgZm9vKGNvbnN0IFJlZjxNYXRyaXhYZj4mIEEpOworICAqIHZvaWQgZm9vKGNvbnN0IFJlZjxNYXRyaXhYZiwwLFN0cmlkZTw+ID4mIEEpOworICAqCisgICogLy8gaW4gdGhlIC5jcHA6CisgICogdGVtcGxhdGU8dHlwZW5hbWUgVHlwZU9mQT4gdm9pZCBmb29faW1wbChjb25zdCBUeXBlT2ZBJiBBKSB7CisgICogICAgIC4uLiAvLyBjcmF6eSBjb2RlIGdvZXMgaGVyZQorICAqIH0KKyAgKiB2b2lkIGZvbyhjb25zdCBSZWY8TWF0cml4WGY+JiBBKSB7IGZvb19pbXBsKEEpOyB9CisgICogdm9pZCBmb28oY29uc3QgUmVmPE1hdHJpeFhmLDAsU3RyaWRlPD4gPiYgQSkgeyBmb29faW1wbChBKTsgfQorICAqIFxlbmRjb2RlCisgICoKKyAgKgorICAqIFxzYSBQbGFpbk9iamVjdEJhc2U6Ok1hcCgpLCBccmVmIFRvcGljU3RvcmFnZU9yZGVycworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4gY2xhc3MgUmVmCisgIDogcHVibGljIFJlZkJhc2U8UmVmPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgoreworICBwcml2YXRlOgorICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxSZWY+IFRyYWl0czsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSZWYoY29uc3QgUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+JiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxib29sKFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8RGVyaXZlZD46Ok1hdGNoQXRDb21waWxlVGltZSksRGVyaXZlZD46OnR5cGUqID0gMCk7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgUmVmQmFzZTxSZWY+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShSZWYpCisKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSZWYoUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+JiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxib29sKFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8RGVyaXZlZD46Ok1hdGNoQXRDb21waWxlVGltZSksRGVyaXZlZD46OnR5cGUqID0gMCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGJvb2woVHJhaXRzOjp0ZW1wbGF0ZSBtYXRjaDxEZXJpdmVkPjo6TWF0Y2hBdENvbXBpbGVUaW1lKSwgU1RPUkFHRV9MQVlPVVRfRE9FU19OT1RfTUFUQ0gpOworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIuZGVyaXZlZCgpKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUmVmKGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkPiYgZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8Ym9vbChUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPERlcml2ZWQ+OjpNYXRjaEF0Q29tcGlsZVRpbWUpLERlcml2ZWQ+Ojp0eXBlKiA9IDApCisgICAgI2Vsc2UKKyAgICAvKiogSW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBhbnkgZGVuc2UgZXhwcmVzc2lvbiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgaW5saW5lIFJlZihEZW5zZUJhc2U8RGVyaXZlZD4mIGV4cHIpCisgICAgI2VuZGlmCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChib29sKGludGVybmFsOjppc19sdmFsdWU8RGVyaXZlZD46OnZhbHVlKSwgVEhJU19FWFBSRVNTSU9OX0lTX05PVF9BX0xWQUxVRV9fSVRfSVNfUkVBRF9PTkxZKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPERlcml2ZWQ+OjpNYXRjaEF0Q29tcGlsZVRpbWUpLCBTVE9SQUdFX0xBWU9VVF9ET0VTX05PVF9NQVRDSCk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFEZXJpdmVkOjpJc1BsYWluT2JqZWN0QmFzZSxUSElTX0VYUFJFU1NJT05fSVNfTk9UX0FfTFZBTFVFX19JVF9JU19SRUFEX09OTFkpOworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgIH0KKworICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoUmVmKQorCit9OworCisvLyB0aGlzIGlzIHRoZSBjb25zdCByZWYgdmVyc2lvbgordGVtcGxhdGU8dHlwZW5hbWUgVFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+IGNsYXNzIFJlZjxjb25zdCBUUGxhaW5PYmplY3RUeXBlLCBPcHRpb25zLCBTdHJpZGVUeXBlPgorICA6IHB1YmxpYyBSZWZCYXNlPFJlZjxjb25zdCBUUGxhaW5PYmplY3RUeXBlLCBPcHRpb25zLCBTdHJpZGVUeXBlPiA+Cit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFJlZj4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFJlZkJhc2U8UmVmPiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoUmVmKQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUmVmKGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkPiYgZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8Ym9vbChUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPERlcml2ZWQ+OjpTY2FsYXJUeXBlTWF0Y2gpLERlcml2ZWQ+Ojp0eXBlKiA9IDApCisgICAgeworLy8gICAgICBzdGQ6OmNvdXQgPDwgbWF0Y2hfaGVscGVyPERlcml2ZWQ+OjpIYXNEaXJlY3RBY2Nlc3MgPDwgIiwiIDw8IG1hdGNoX2hlbHBlcjxEZXJpdmVkPjo6T3V0ZXJTdHJpZGVNYXRjaCA8PCAiLCIgPDwgbWF0Y2hfaGVscGVyPERlcml2ZWQ+OjpJbm5lclN0cmlkZU1hdGNoIDw8ICJcbiI7CisvLyAgICAgIHN0ZDo6Y291dCA8PCBpbnQoU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lKSA8PCAiIC0gIiA8PCBpbnQoRGVyaXZlZDo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lKSA8PCAiXG4iOworLy8gICAgICBzdGQ6OmNvdXQgPDwgaW50KFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSkgPDwgIiAtICIgPDwgaW50KERlcml2ZWQ6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSkgPDwgIlxuIjsKKyAgICAgIGNvbnN0cnVjdChleHByLmRlcml2ZWQoKSwgdHlwZW5hbWUgVHJhaXRzOjp0ZW1wbGF0ZSBtYXRjaDxEZXJpdmVkPjo6dHlwZSgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUmVmKGNvbnN0IFJlZiYgb3RoZXIpIDogQmFzZShvdGhlcikgeworICAgICAgLy8gY29weSBjb25zdHJ1Y3RvciBzaGFsbCBub3QgY29weSB0aGUgbV9vYmplY3QsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IG1hbGxvYyBhbmQgY29weQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyUmVmPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSZWYoY29uc3QgUmVmQmFzZTxPdGhlclJlZj4mIG90aGVyKSB7CisgICAgICBjb25zdHJ1Y3Qob3RoZXIuZGVyaXZlZCgpLCB0eXBlbmFtZSBUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPE90aGVyUmVmPjo6dHlwZSgpKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvbj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnN0cnVjdChjb25zdCBFeHByZXNzaW9uJiBleHByLGludGVybmFsOjp0cnVlX3R5cGUpCisgICAgeworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb24+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBjb25zdHJ1Y3QoY29uc3QgRXhwcmVzc2lvbiYgZXhwciwgaW50ZXJuYWw6OmZhbHNlX3R5cGUpCisgICAgeworICAgICAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhtX29iamVjdCxleHByLGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4oKSk7CisgICAgICBCYXNlOjpjb25zdHJ1Y3QobV9vYmplY3QpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgVFBsYWluT2JqZWN0VHlwZSBtX29iamVjdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUkVGX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1JlcGxpY2F0ZS5oIGIvRWlnZW4vc3JjL0NvcmUvUmVwbGljYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MGVmOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1JlcGxpY2F0ZS5oCkBAIC0wLDAgKzEsMTQyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SRVBMSUNBVEVfSAorI2RlZmluZSBFSUdFTl9SRVBMSUNBVEVfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IFJvd0ZhY3RvcixpbnQgQ29sRmFjdG9yPgorc3RydWN0IHRyYWl0czxSZXBsaWNhdGU8TWF0cml4VHlwZSxSb3dGYWN0b3IsQ29sRmFjdG9yPiA+CisgOiB0cmFpdHM8TWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpYcHJLaW5kIFhwcktpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBSb3dGYWN0b3I9PUR5bmFtaWMgfHwgaW50KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKT09RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgIDogUm93RmFjdG9yICogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBDb2xGYWN0b3I9PUR5bmFtaWMgfHwgaW50KE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKT09RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgIDogQ29sRmFjdG9yICogTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAvL0ZJWE1FIHdlIGRvbid0IHByb3BhZ2F0ZSB0aGUgbWF4IHNpemVzICEhIQorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBDb2xzQXRDb21waWxlVGltZSwKKyAgICBJc1Jvd01ham9yID0gTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEgJiYgTWF4Q29sc0F0Q29tcGlsZVRpbWUhPTEgPyAxCisgICAgICAgICAgICAgICA6IE1heENvbHNBdENvbXBpbGVUaW1lPT0xICYmIE1heFJvd3NBdENvbXBpbGVUaW1lIT0xID8gMAorICAgICAgICAgICAgICAgOiAoTWF0cml4VHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyAxIDogMCwKKyAgICAKKyAgICAvLyBGSVhNRSBlbmFibGUgRGlyZWN0QWNjZXNzIHdpdGggbmVnYXRpdmUgc3RyaWRlcz8KKyAgICBGbGFncyA9IElzUm93TWFqb3IgPyBSb3dNYWpvckJpdCA6IDAKKyAgfTsKK307Cit9CisKKy8qKgorICAqIFxjbGFzcyBSZXBsaWNhdGUKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgdGhlIG11bHRpcGxlIHJlcGxpY2F0aW9uIG9mIGEgbWF0cml4IG9yIHZlY3RvcgorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgd2UgYXJlIHJlcGxpY2F0aW5nCisgICogXHRwYXJhbSBSb3dGYWN0b3IgbnVtYmVyIG9mIHJlcGV0aXRpb25zIGF0IGNvbXBpbGUgdGltZSBhbG9uZyB0aGUgdmVydGljYWwgZGlyZWN0aW9uLCBjYW4gYmUgRHluYW1pYy4KKyAgKiBcdHBhcmFtIENvbEZhY3RvciBudW1iZXIgb2YgcmVwZXRpdGlvbnMgYXQgY29tcGlsZSB0aW1lIGFsb25nIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiwgY2FuIGJlIER5bmFtaWMuCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbXVsdGlwbGUgcmVwbGljYXRpb24gb2YgYSBtYXRyaXggb3IgdmVjdG9yLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBEZW5zZUJhc2U6OnJlcGxpY2F0ZSgpIGFuZCBtb3N0IG9mIHRoZSB0aW1lCisgICogdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnJlcGxpY2F0ZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBSb3dGYWN0b3IsaW50IENvbEZhY3Rvcj4gY2xhc3MgUmVwbGljYXRlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgUmVwbGljYXRlPE1hdHJpeFR5cGUsUm93RmFjdG9yLENvbEZhY3Rvcj4gPjo6dHlwZQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxSZXBsaWNhdGU+OjpNYXRyaXhUeXBlTmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJlcGxpY2F0ZT46Ol9NYXRyaXhUeXBlTmVzdGVkIF9NYXRyaXhUeXBlTmVzdGVkOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxSZXBsaWNhdGU+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShSZXBsaWNhdGUpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlPjo6dHlwZSBOZXN0ZWRFeHByZXNzaW9uOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3JpZ2luYWxNYXRyaXhUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGV4cGxpY2l0IFJlcGxpY2F0ZShjb25zdCBPcmlnaW5hbE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9yb3dGYWN0b3IoUm93RmFjdG9yKSwgbV9jb2xGYWN0b3IoQ29sRmFjdG9yKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8TWF0cml4VHlwZT46OnR5cGUsT3JpZ2luYWxNYXRyaXhUeXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVfTUFUUklYX09SX0VYUFJFU1NJT05fVEhBVF9ZT1VfUEFTU0VEX0RPRVNfTk9UX0hBVkVfVEhFX0VYUEVDVEVEX1RZUEUpCisgICAgICBlaWdlbl9hc3NlcnQoUm93RmFjdG9yIT1EeW5hbWljICYmIENvbEZhY3RvciE9RHluYW1pYyk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3JpZ2luYWxNYXRyaXhUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFJlcGxpY2F0ZShjb25zdCBPcmlnaW5hbE1hdHJpeFR5cGUmIG1hdHJpeCwgSW5kZXggcm93RmFjdG9yLCBJbmRleCBjb2xGYWN0b3IpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeCksIG1fcm93RmFjdG9yKHJvd0ZhY3RvciksIG1fY29sRmFjdG9yKGNvbEZhY3RvcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PE1hdHJpeFR5cGU+Ojp0eXBlLE9yaWdpbmFsTWF0cml4VHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFX01BVFJJWF9PUl9FWFBSRVNTSU9OX1RIQVRfWU9VX1BBU1NFRF9ET0VTX05PVF9IQVZFX1RIRV9FWFBFQ1RFRF9UWVBFKQorICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCkgKiBtX3Jvd0ZhY3Rvci52YWx1ZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKSAqIG1fY29sRmFjdG9yLnZhbHVlKCk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgX01hdHJpeFR5cGVOZXN0ZWQmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdAorICAgIHsgCisgICAgICByZXR1cm4gbV9tYXRyaXg7IAorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgUm93RmFjdG9yPiBtX3Jvd0ZhY3RvcjsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgQ29sRmFjdG9yPiBtX2NvbEZhY3RvcjsKK307CisKKy8qKgorICAqIFxyZXR1cm4gYW4gZXhwcmVzc2lvbiBvZiB0aGUgcmVwbGljYXRpb24gb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmVwbGljYXRlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmVwbGljYXRlLm91dAorICAqCisgICogXHNhIFZlY3Rvcndpc2VPcDo6cmVwbGljYXRlKCksIERlbnNlQmFzZTo6cmVwbGljYXRlKEluZGV4LEluZGV4KSwgY2xhc3MgUmVwbGljYXRlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IFJvd0ZhY3RvciwgaW50IENvbEZhY3Rvcj4KK2NvbnN0IFJlcGxpY2F0ZTxEZXJpdmVkLFJvd0ZhY3RvcixDb2xGYWN0b3I+CitEZW5zZUJhc2U8RGVyaXZlZD46OnJlcGxpY2F0ZSgpIGNvbnN0Cit7CisgIHJldHVybiBSZXBsaWNhdGU8RGVyaXZlZCxSb3dGYWN0b3IsQ29sRmFjdG9yPihkZXJpdmVkKCkpOworfQorCisvKioKKyAgKiBccmV0dXJuIGFuIGV4cHJlc3Npb24gb2YgdGhlIHJlcGxpY2F0aW9uIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIFxjICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZV9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGVfaW50Lm91dAorICAqCisgICogXHNhIFZlY3Rvcndpc2VPcDo6cmVwbGljYXRlKCksIERlbnNlQmFzZTo6cmVwbGljYXRlKCksIGNsYXNzIFJlcGxpY2F0ZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIGludCBEaXJlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6UmVwbGljYXRlUmV0dXJuVHlwZQorVmVjdG9yd2lzZU9wPEV4cHJlc3Npb25UeXBlLERpcmVjdGlvbj46OnJlcGxpY2F0ZShJbmRleCBmYWN0b3IpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6UmVwbGljYXRlUmV0dXJuVHlwZQorICAgICAgICAgIChfZXhwcmVzc2lvbigpLERpcmVjdGlvbj09VmVydGljYWw/ZmFjdG9yOjEsRGlyZWN0aW9uPT1Ib3Jpem9udGFsP2ZhY3RvcjoxKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9SRVBMSUNBVEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvUmV0dXJuQnlWYWx1ZS5oIGIvRWlnZW4vc3JjL0NvcmUvUmV0dXJuQnlWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGI3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9SZXR1cm5CeVZhbHVlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVUVVJOQllWQUxVRV9ICisjZGVmaW5lIEVJR0VOX1JFVFVSTkJZVkFMVUVfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxSZXR1cm5CeVZhbHVlPERlcml2ZWQ+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZT4KK3sKKyAgZW51bSB7CisgICAgLy8gV2UncmUgZGlzYWJsaW5nIHRoZSBEaXJlY3RBY2Nlc3MgYmVjYXVzZSBlLmcuIHRoZSBjb25zdHJ1Y3RvciBvZgorICAgIC8vIHRoZSBCbG9jay13aXRoLURpcmVjdEFjY2VzcyBleHByZXNzaW9uIHJlcXVpcmVzIHRvIGhhdmUgYSBjb2VmZlJlZiBtZXRob2QuCisgICAgLy8gQWxzbywgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RyaWRlIHN0dWZmLgorICAgIEZsYWdzID0gKHRyYWl0czx0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlJldHVyblR5cGU+OjpGbGFncworICAgICAgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQpICYgfkRpcmVjdEFjY2Vzc0JpdAorICB9OworfTsKKworLyogVGhlIFJldHVybkJ5VmFsdWUgb2JqZWN0IGRvZXNuJ3QgZXZlbiBoYXZlIGEgY29lZmYoKSBtZXRob2QuCisgKiBTbyB0aGUgb25seSB3YXkgdGhhdCBuZXN0aW5nIGl0IGluIGFuIGV4cHJlc3Npb24gY2FuIHdvcmssIGlzIGJ5IGV2YWx1YXRpbmcgaXQgaW50byBhIHBsYWluIG1hdHJpeC4KKyAqIFNvIGludGVybmFsOjpuZXN0ZWQgYWx3YXlzIGdpdmVzIHRoZSBwbGFpbiByZXR1cm4gbWF0cml4IHR5cGUuCisgKgorICogRklYTUU6IEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgd2UgbmVlZCB0aGlzIHNwZWNpYWxpemF0aW9uOiBpc24ndCB0aGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIEV2YWxCZWZvcmVOZXN0aW5nQml0ID8/CisgKiBBbnN3ZXI6IEV2YWxCZWZvcmVOZXN0aW5nQml0IHNob3VsZCBiZSBkZXByZWNhdGVkIHNpbmNlIHdlIGhhdmUgdGhlIGV2YWx1YXRvcnMKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCxpbnQgbix0eXBlbmFtZSBQbGFpbk9iamVjdD4KK3N0cnVjdCBuZXN0ZWRfZXZhbDxSZXR1cm5CeVZhbHVlPERlcml2ZWQ+LCBuLCBQbGFpbk9iamVjdD4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlJldHVyblR5cGUgdHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGNsYXNzIFJldHVybkJ5VmFsdWUKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBSZXR1cm5CeVZhbHVlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgUmV0dXJuQnlWYWx1ZTxEZXJpdmVkPiA+Ojp0eXBlLCBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSZXR1cm5UeXBlIFJldHVyblR5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxSZXR1cm5CeVZhbHVlPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoUmV0dXJuQnlWYWx1ZSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICAgIHsgc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLT5ldmFsVG8oZHN0KTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLT5yb3dzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKS0+Y29scygpOyB9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyNkZWZpbmUgVW51c2FibGUgWU9VX0FSRV9UUllJTkdfVE9fQUNDRVNTX0FfU0lOR0xFX0NPRUZGSUNJRU5UX0lOX0FfU1BFQ0lBTF9FWFBSRVNTSU9OX1dIRVJFX1RIQVRfSVNfTk9UX0FMTE9XRURfQkVDQVVTRV9USEFUX1dPVUxEX0JFX0lORUZGSUNJRU5UCisgICAgY2xhc3MgVW51c2FibGV7CisgICAgICBVbnVzYWJsZShjb25zdCBVbnVzYWJsZSYpIHt9CisgICAgICBVbnVzYWJsZSYgb3BlcmF0b3I9KGNvbnN0IFVudXNhYmxlJikge3JldHVybiAqdGhpczt9CisgICAgfTsKKyAgICBjb25zdCBVbnVzYWJsZSYgY29lZmYoSW5kZXgpIGNvbnN0IHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFVudXNhYmxlKj4odGhpcyk7IH0KKyAgICBjb25zdCBVbnVzYWJsZSYgY29lZmYoSW5kZXgsSW5kZXgpIGNvbnN0IHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFVudXNhYmxlKj4odGhpcyk7IH0KKyAgICBVbnVzYWJsZSYgY29lZmZSZWYoSW5kZXgpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFVudXNhYmxlKj4odGhpcyk7IH0KKyAgICBVbnVzYWJsZSYgY29lZmZSZWYoSW5kZXgsSW5kZXgpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFVudXNhYmxlKj4odGhpcyk7IH0KKyN1bmRlZiBVbnVzYWJsZQorI2VuZGlmCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgb3RoZXIuZXZhbFRvKGRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIGEgdGVtcG9yYXJ5OyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFzc2lnbm1lbnQgaXMgYnlwYXNzZWQgc28gdGhhdAorLy8gd2hlbiBhIFJldHVybkJ5VmFsdWUgZXhwcmVzc2lvbiBpcyBhc3NpZ25lZCwgdGhlIGV2YWx1YXRvciBpcyBub3QgY29uc3RydWN0ZWQuCisvLyBUT0RPOiBGaW5hbGl6ZSBwb3J0IHRvIG5ldyByZWdpbWU7IFJldHVybkJ5VmFsdWUgc2hvdWxkIG5vdCBleGlzdCBpbiB0aGUgZXhwcmVzc2lvbiB3b3JsZAorICAKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZXZhbHVhdG9yPFJldHVybkJ5VmFsdWU8RGVyaXZlZD4gPgorICA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZT4KK3sKKyAgdHlwZWRlZiBSZXR1cm5CeVZhbHVlPERlcml2ZWQ+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZSBQbGFpbk9iamVjdDsKKyAgdHlwZWRlZiBldmFsdWF0b3I8UGxhaW5PYmplY3Q+IEJhc2U7CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogbV9yZXN1bHQoeHByLnJvd3MoKSwgeHByLmNvbHMoKSkKKyAgeworICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UobV9yZXN1bHQpOworICAgIHhwci5ldmFsVG8obV9yZXN1bHQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgUGxhaW5PYmplY3QgbV9yZXN1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9SRVRVUk5CWVZBTFVFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1JldmVyc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL1JldmVyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQwY2RhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvUmV2ZXJzZS5oCkBAIC0wLDAgKzEsMjExIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFJpY2FyZCBNYXJ4ZXIgPGVtYWlsQHJpY2FyZG1hcnhlci5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVWRVJTRV9ICisjZGVmaW5lIEVJR0VOX1JFVkVSU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IERpcmVjdGlvbj4KK3N0cnVjdCB0cmFpdHM8UmV2ZXJzZTxNYXRyaXhUeXBlLCBEaXJlY3Rpb24+ID4KKyA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlhwcktpbmQgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWZfc2VsZWN0b3I8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gX01hdHJpeFR5cGVOZXN0ZWQ6OkZsYWdzICYgKFJvd01ham9yQml0IHwgTHZhbHVlQml0KQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0VHlwZSwgYm9vbCBSZXZlcnNlUGFja2V0PiBzdHJ1Y3QgcmV2ZXJzZV9wYWNrZXRfY29uZAoreworICBzdGF0aWMgaW5saW5lIFBhY2tldFR5cGUgcnVuKGNvbnN0IFBhY2tldFR5cGUmIHgpIHsgcmV0dXJuIHByZXZlcnNlKHgpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXRUeXBlPiBzdHJ1Y3QgcmV2ZXJzZV9wYWNrZXRfY29uZDxQYWNrZXRUeXBlLGZhbHNlPgoreworICBzdGF0aWMgaW5saW5lIFBhY2tldFR5cGUgcnVuKGNvbnN0IFBhY2tldFR5cGUmIHgpIHsgcmV0dXJuIHg7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbCAKKworLyoqIFxjbGFzcyBSZXZlcnNlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIHRoZSByZXZlcnNlIG9mIGEgdmVjdG9yIG9yIG1hdHJpeAorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb2Ygd2hpY2ggd2UgYXJlIHRha2luZyB0aGUgcmV2ZXJzZQorICAqIFx0cGFyYW0gRGlyZWN0aW9uIGRlZmluZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcmV2ZXJzZSBvcGVyYXRpb24sIGNhbiBiZSBWZXJ0aWNhbCwgSG9yaXpvbnRhbCwgb3IgQm90aERpcmVjdGlvbnMKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSByZXZlcnNlIG9mIGEgdmVjdG9yLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpyZXZlcnNlKCkgYW5kIFZlY3Rvcndpc2VPcDo6cmV2ZXJzZSgpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpyZXZlcnNlKCksIFZlY3Rvcndpc2VPcDo6cmV2ZXJzZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgRGlyZWN0aW9uPiBjbGFzcyBSZXZlcnNlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgUmV2ZXJzZTxNYXRyaXhUeXBlLCBEaXJlY3Rpb24+ID46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UmV2ZXJzZT46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFJldmVyc2UpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlPjo6dHlwZSBOZXN0ZWRFeHByZXNzaW9uOworICAgIHVzaW5nIEJhc2U6OklzUm93TWFqb3I7CisKKyAgcHJvdGVjdGVkOgorICAgIGVudW0geworICAgICAgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgICBJc0NvbE1ham9yID0gIUlzUm93TWFqb3IsCisgICAgICBSZXZlcnNlUm93ID0gKERpcmVjdGlvbiA9PSBWZXJ0aWNhbCkgICB8fCAoRGlyZWN0aW9uID09IEJvdGhEaXJlY3Rpb25zKSwKKyAgICAgIFJldmVyc2VDb2wgPSAoRGlyZWN0aW9uID09IEhvcml6b250YWwpIHx8IChEaXJlY3Rpb24gPT0gQm90aERpcmVjdGlvbnMpLAorICAgICAgT2Zmc2V0Um93ICA9IFJldmVyc2VSb3cgJiYgSXNDb2xNYWpvciA/IFBhY2tldFNpemUgOiAxLAorICAgICAgT2Zmc2V0Q29sICA9IFJldmVyc2VDb2wgJiYgSXNSb3dNYWpvciA/IFBhY2tldFNpemUgOiAxLAorICAgICAgUmV2ZXJzZVBhY2tldCA9IChEaXJlY3Rpb24gPT0gQm90aERpcmVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IFZlcnRpY2FsKSAgICYmIElzQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IEhvcml6b250YWwpICYmIElzUm93TWFqb3IpCisgICAgfTsKKyAgICB0eXBlZGVmIGludGVybmFsOjpyZXZlcnNlX3BhY2tldF9jb25kPFBhY2tldFNjYWxhcixSZXZlcnNlUGFja2V0PiByZXZlcnNlX3BhY2tldDsKKyAgcHVibGljOgorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgaW5saW5lIFJldmVyc2UoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkgeyB9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKFJldmVyc2UpCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAtbV9tYXRyaXguaW5uZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCAKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXg7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7Cit9OworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgcmV2ZXJzZSBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmV2ZXJzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3JldmVyc2Uub3V0CisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpSZXZlcnNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpyZXZlcnNlKCkKK3sKKyAgcmV0dXJuIFJldmVyc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKworLy9yZXZlcnNlIGNvbnN0IG92ZXJsb2FkIG1vdmVkIERlbnNlQmFzZS5oIGR1ZSB0byBhIENVREEgY29tcGlsZXIgYnVnCisKKy8qKiBUaGlzIGlzIHRoZSAiaW4gcGxhY2UiIHZlcnNpb24gb2YgcmV2ZXJzZTogaXQgcmV2ZXJzZXMgXGMgKnRoaXMuCisgICoKKyAgKiBJbiBtb3N0IGNhc2VzIGl0IGlzIHByb2JhYmx5IGJldHRlciB0byBzaW1wbHkgdXNlIHRoZSByZXZlcnNlZCBleHByZXNzaW9uCisgICogb2YgYSBtYXRyaXguIEhvd2V2ZXIsIHdoZW4gcmV2ZXJzaW5nIHRoZSBtYXRyaXggZGF0YSBpdHNlbGYgaXMgcmVhbGx5IG5lZWRlZCwKKyAgKiB0aGVuIHRoaXMgImluLXBsYWNlIiB2ZXJzaW9uIGlzIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UgYmVjYXVzZSBpdCBwcm92aWRlcworICAqIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBiZW5lZml0czoKKyAgKiAgLSBsZXNzIGVycm9yIHByb25lOiBkb2luZyB0aGUgc2FtZSBvcGVyYXRpb24gd2l0aCAucmV2ZXJzZSgpIHJlcXVpcmVzIHNwZWNpYWwgY2FyZToKKyAgKiAgICBcY29kZSBtID0gbS5yZXZlcnNlKCkuZXZhbCgpOyBcZW5kY29kZQorICAqICAtIHRoaXMgQVBJIGVuYWJsZXMgcmV2ZXJzZSBvcGVyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5CisgICogIC0gaXQgYWxsb3dzIGZ1dHVyZSBvcHRpbWl6YXRpb25zIChjYWNoZSBmcmllbmRsaW5lc3MsIGV0Yy4pCisgICoKKyAgKiBcc2EgVmVjdG9yd2lzZU9wOjpyZXZlcnNlSW5QbGFjZSgpLCByZXZlcnNlKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdm9pZCBEZW5zZUJhc2U8RGVyaXZlZD46OnJldmVyc2VJblBsYWNlKCkKK3sKKyAgaWYoY29scygpPnJvd3MoKSkKKyAgeworICAgIEluZGV4IGhhbGYgPSBjb2xzKCkvMjsKKyAgICBsZWZ0Q29scyhoYWxmKS5zd2FwKHJpZ2h0Q29scyhoYWxmKS5yZXZlcnNlKCkpOworICAgIGlmKChjb2xzKCklMik9PTEpCisgICAgeworICAgICAgSW5kZXggaGFsZjIgPSByb3dzKCkvMjsKKyAgICAgIGNvbChoYWxmKS5oZWFkKGhhbGYyKS5zd2FwKGNvbChoYWxmKS50YWlsKGhhbGYyKS5yZXZlcnNlKCkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBJbmRleCBoYWxmID0gcm93cygpLzI7CisgICAgdG9wUm93cyhoYWxmKS5zd2FwKGJvdHRvbVJvd3MoaGFsZikucmV2ZXJzZSgpKTsKKyAgICBpZigocm93cygpJTIpPT0xKQorICAgIHsKKyAgICAgIEluZGV4IGhhbGYyID0gY29scygpLzI7CisgICAgICByb3coaGFsZikuaGVhZChoYWxmMikuc3dhcChyb3coaGFsZikudGFpbChoYWxmMikucmV2ZXJzZSgpKTsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTxpbnQgRGlyZWN0aW9uPgorc3RydWN0IHZlY3Rvcndpc2VfcmV2ZXJzZV9pbnBsYWNlX2ltcGw7CisKK3RlbXBsYXRlPD4KK3N0cnVjdCB2ZWN0b3J3aXNlX3JldmVyc2VfaW5wbGFjZV9pbXBsPFZlcnRpY2FsPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKEV4cHJlc3Npb25UeXBlICZ4cHIpCisgIHsKKyAgICBJbmRleCBoYWxmID0geHByLnJvd3MoKS8yOworICAgIHhwci50b3BSb3dzKGhhbGYpLnN3YXAoeHByLmJvdHRvbVJvd3MoaGFsZikuY29sd2lzZSgpLnJldmVyc2UoKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCB2ZWN0b3J3aXNlX3JldmVyc2VfaW5wbGFjZV9pbXBsPEhvcml6b250YWw+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorICBzdGF0aWMgdm9pZCBydW4oRXhwcmVzc2lvblR5cGUgJnhwcikKKyAgeworICAgIEluZGV4IGhhbGYgPSB4cHIuY29scygpLzI7CisgICAgeHByLmxlZnRDb2xzKGhhbGYpLnN3YXAoeHByLnJpZ2h0Q29scyhoYWxmKS5yb3d3aXNlKCkucmV2ZXJzZSgpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBUaGlzIGlzIHRoZSAiaW4gcGxhY2UiIHZlcnNpb24gb2YgVmVjdG9yd2lzZU9wOjpyZXZlcnNlOiBpdCByZXZlcnNlcyBlYWNoIGNvbHVtbiBvciByb3cgb2YgXGMgKnRoaXMuCisgICoKKyAgKiBJbiBtb3N0IGNhc2VzIGl0IGlzIHByb2JhYmx5IGJldHRlciB0byBzaW1wbHkgdXNlIHRoZSByZXZlcnNlZCBleHByZXNzaW9uCisgICogb2YgYSBtYXRyaXguIEhvd2V2ZXIsIHdoZW4gcmV2ZXJzaW5nIHRoZSBtYXRyaXggZGF0YSBpdHNlbGYgaXMgcmVhbGx5IG5lZWRlZCwKKyAgKiB0aGVuIHRoaXMgImluLXBsYWNlIiB2ZXJzaW9uIGlzIHByb2JhYmx5IHRoZSByaWdodCBjaG9pY2UgYmVjYXVzZSBpdCBwcm92aWRlcworICAqIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBiZW5lZml0czoKKyAgKiAgLSBsZXNzIGVycm9yIHByb25lOiBkb2luZyB0aGUgc2FtZSBvcGVyYXRpb24gd2l0aCAucmV2ZXJzZSgpIHJlcXVpcmVzIHNwZWNpYWwgY2FyZToKKyAgKiAgICBcY29kZSBtID0gbS5yZXZlcnNlKCkuZXZhbCgpOyBcZW5kY29kZQorICAqICAtIHRoaXMgQVBJIGVuYWJsZXMgcmV2ZXJzZSBvcGVyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpyZXZlcnNlSW5QbGFjZSgpLCByZXZlcnNlKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPgordm9pZCBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6cmV2ZXJzZUluUGxhY2UoKQoreworICBpbnRlcm5hbDo6dmVjdG9yd2lzZV9yZXZlcnNlX2lucGxhY2VfaW1wbDxEaXJlY3Rpb24+OjpydW4oX2V4cHJlc3Npb24oKS5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUkVWRVJTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9TZWxlY3QuaCBiL0VpZ2VuL3NyYy9Db3JlL1NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWVjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9TZWxlY3QuaApAQCAtMCwwICsxLDE2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0VMRUNUX0gKKyNkZWZpbmUgRUlHRU5fU0VMRUNUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgU2VsZWN0CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIGEgY29lZmZpY2llbnQgd2lzZSB2ZXJzaW9uIG9mIHRoZSBDKysgdGVybmFyeSBvcGVyYXRvciA/OgorICAqCisgICogXHBhcmFtIENvbmRpdGlvbk1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIFxlbSBjb25kaXRpb24gZXhwcmVzc2lvbiB3aGljaCBtdXN0IGJlIGEgYm9vbGVhbiBtYXRyaXgKKyAgKiBccGFyYW0gVGhlbk1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIFxlbSB0aGVuIGV4cHJlc3Npb24KKyAgKiBccGFyYW0gRWxzZU1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIFxlbSBlbHNlIGV4cHJlc3Npb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIGEgY29lZmZpY2llbnQgd2lzZSB2ZXJzaW9uIG9mIHRoZSBDKysgdGVybmFyeSBvcGVyYXRvciA/Oi4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgRGVuc2VCYXNlOjpzZWxlY3QoKSBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mLCBjb25zdCBEZW5zZUJhc2U8RWxzZURlcml2ZWQ+JikgY29uc3QKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFRoZW5NYXRyaXhUeXBlLCB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZT4KK3N0cnVjdCB0cmFpdHM8U2VsZWN0PENvbmRpdGlvbk1hdHJpeFR5cGUsIFRoZW5NYXRyaXhUeXBlLCBFbHNlTWF0cml4VHlwZT4gPgorIDogdHJhaXRzPFRoZW5NYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUaGVuTWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFRoZW5NYXRyaXhUeXBlPjo6WHByS2luZCBYcHJLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGU6Ok5lc3RlZCBDb25kaXRpb25NYXRyaXhOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGhlbk1hdHJpeFR5cGU6Ok5lc3RlZCBUaGVuTWF0cml4TmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVsc2VNYXRyaXhUeXBlOjpOZXN0ZWQgRWxzZU1hdHJpeE5lc3RlZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBDb25kaXRpb25NYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IENvbmRpdGlvbk1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gQ29uZGl0aW9uTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBDb25kaXRpb25NYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICBGbGFncyA9ICh1bnNpZ25lZCBpbnQpVGhlbk1hdHJpeFR5cGU6OkZsYWdzICYgRWxzZU1hdHJpeFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFRoZW5NYXRyaXhUeXBlLCB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZT4KK2NsYXNzIFNlbGVjdCA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IFNlbGVjdDxDb25kaXRpb25NYXRyaXhUeXBlLCBUaGVuTWF0cml4VHlwZSwgRWxzZU1hdHJpeFR5cGU+ID46OnR5cGUsCisgICAgICAgICAgICAgICBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxTZWxlY3Q+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShTZWxlY3QpCisKKyAgICBpbmxpbmUgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBTZWxlY3QoY29uc3QgQ29uZGl0aW9uTWF0cml4VHlwZSYgYV9jb25kaXRpb25NYXRyaXgsCisgICAgICAgICAgIGNvbnN0IFRoZW5NYXRyaXhUeXBlJiBhX3RoZW5NYXRyaXgsCisgICAgICAgICAgIGNvbnN0IEVsc2VNYXRyaXhUeXBlJiBhX2Vsc2VNYXRyaXgpCisgICAgICA6IG1fY29uZGl0aW9uKGFfY29uZGl0aW9uTWF0cml4KSwgbV90aGVuKGFfdGhlbk1hdHJpeCksIG1fZWxzZShhX2Vsc2VNYXRyaXgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fY29uZGl0aW9uLnJvd3MoKSA9PSBtX3RoZW4ucm93cygpICYmIG1fY29uZGl0aW9uLnJvd3MoKSA9PSBtX2Vsc2Uucm93cygpKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2NvbmRpdGlvbi5jb2xzKCkgPT0gbV90aGVuLmNvbHMoKSAmJiBtX2NvbmRpdGlvbi5jb2xzKCkgPT0gbV9lbHNlLmNvbHMoKSk7CisgICAgfQorCisgICAgaW5saW5lIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2NvbmRpdGlvbi5yb3dzKCk7IH0KKyAgICBpbmxpbmUgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29uZGl0aW9uLmNvbHMoKTsgfQorCisgICAgaW5saW5lIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGksIEluZGV4IGopIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fY29uZGl0aW9uLmNvZWZmKGksaikpCisgICAgICAgIHJldHVybiBtX3RoZW4uY29lZmYoaSxqKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fZWxzZS5jb2VmZihpLGopOworICAgIH0KKworICAgIGlubGluZSBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2NvbmRpdGlvbi5jb2VmZihpKSkKKyAgICAgICAgcmV0dXJuIG1fdGhlbi5jb2VmZihpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fZWxzZS5jb2VmZihpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgQ29uZGl0aW9uTWF0cml4VHlwZSYgY29uZGl0aW9uTWF0cml4KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9jb25kaXRpb247CisgICAgfQorCisgICAgaW5saW5lIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFRoZW5NYXRyaXhUeXBlJiB0aGVuTWF0cml4KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV90aGVuOworICAgIH0KKworICAgIGlubGluZSBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBFbHNlTWF0cml4VHlwZSYgZWxzZU1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZWxzZTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGU6Ok5lc3RlZCBtX2NvbmRpdGlvbjsKKyAgICB0eXBlbmFtZSBUaGVuTWF0cml4VHlwZTo6TmVzdGVkIG1fdGhlbjsKKyAgICB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZTo6TmVzdGVkIG1fZWxzZTsKK307CisKKworLyoqIFxyZXR1cm5zIGEgbWF0cml4IHdoZXJlIGVhY2ggY29lZmZpY2llbnQgKGksaikgaXMgZXF1YWwgdG8gXGEgdGhlbk1hdHJpeChpLGopCisgICogaWYgXGMgKnRoaXMoaSxqKSwgYW5kIFxhIGVsc2VNYXRyaXgoaSxqKSBvdGhlcndpc2UuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3NlbGVjdC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NlbGVjdC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBTZWxlY3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZCx0eXBlbmFtZSBFbHNlRGVyaXZlZD4KK2lubGluZSBjb25zdCBTZWxlY3Q8RGVyaXZlZCxUaGVuRGVyaXZlZCxFbHNlRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYgZWxzZU1hdHJpeCkgY29uc3QKK3sKKyAgcmV0dXJuIFNlbGVjdDxEZXJpdmVkLFRoZW5EZXJpdmVkLEVsc2VEZXJpdmVkPihkZXJpdmVkKCksIHRoZW5NYXRyaXguZGVyaXZlZCgpLCBlbHNlTWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKy8qKiBWZXJzaW9uIG9mIERlbnNlQmFzZTo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZSYsIGNvbnN0IERlbnNlQmFzZSYpIHdpdGgKKyAgKiB0aGUgXGVtIGVsc2UgZXhwcmVzc2lvbiBiZWluZyBhIHNjYWxhciB2YWx1ZS4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnNlbGVjdChjb25zdCBEZW5zZUJhc2U8VGhlbkRlcml2ZWQ+JiwgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYpIGNvbnN0LCBjbGFzcyBTZWxlY3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZD4KK2lubGluZSBjb25zdCBTZWxlY3Q8RGVyaXZlZCxUaGVuRGVyaXZlZCwgdHlwZW5hbWUgVGhlbkRlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZT4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBUaGVuRGVyaXZlZDo6U2NhbGFyJiBlbHNlU2NhbGFyKSBjb25zdAoreworICByZXR1cm4gU2VsZWN0PERlcml2ZWQsVGhlbkRlcml2ZWQsdHlwZW5hbWUgVGhlbkRlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZT4oCisgICAgZGVyaXZlZCgpLCB0aGVuTWF0cml4LmRlcml2ZWQoKSwgVGhlbkRlcml2ZWQ6OkNvbnN0YW50KHJvd3MoKSxjb2xzKCksZWxzZVNjYWxhcikpOworfQorCisvKiogVmVyc2lvbiBvZiBEZW5zZUJhc2U6OnNlbGVjdChjb25zdCBEZW5zZUJhc2UmLCBjb25zdCBEZW5zZUJhc2UmKSB3aXRoCisgICogdGhlIFxlbSB0aGVuIGV4cHJlc3Npb24gYmVpbmcgYSBzY2FsYXIgdmFsdWUuCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZWxlY3QoY29uc3QgRGVuc2VCYXNlPFRoZW5EZXJpdmVkPiYsIGNvbnN0IERlbnNlQmFzZTxFbHNlRGVyaXZlZD4mKSBjb25zdCwgY2xhc3MgU2VsZWN0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgRWxzZURlcml2ZWQ+CitpbmxpbmUgY29uc3QgU2VsZWN0PERlcml2ZWQsIHR5cGVuYW1lIEVsc2VEZXJpdmVkOjpDb25zdGFudFJldHVyblR5cGUsIEVsc2VEZXJpdmVkID4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KGNvbnN0IHR5cGVuYW1lIEVsc2VEZXJpdmVkOjpTY2FsYXImIHRoZW5TY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZUJhc2U8RWxzZURlcml2ZWQ+JiBlbHNlTWF0cml4KSBjb25zdAoreworICByZXR1cm4gU2VsZWN0PERlcml2ZWQsdHlwZW5hbWUgRWxzZURlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZSxFbHNlRGVyaXZlZD4oCisgICAgZGVyaXZlZCgpLCBFbHNlRGVyaXZlZDo6Q29uc3RhbnQocm93cygpLGNvbHMoKSx0aGVuU2NhbGFyKSwgZWxzZU1hdHJpeC5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9TZWxmQWRqb2ludFZpZXcuaCBiL0VpZ2VuL3NyYy9Db3JlL1NlbGZBZGpvaW50Vmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGM5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9TZWxmQWRqb2ludFZpZXcuaApAQCAtMCwwICsxLDM1MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEZBREpPSU5UTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBTZWxmQWRqb2ludFZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBhIHNlbGZhZGpvaW50IG1hdHJpeCBmcm9tIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgZGVuc2UgbWF0cml4CisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgZGVuc2UgbWF0cml4IHN0b3JpbmcgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBUcmlhbmd1bGFyUGFydCBjYW4gYmUgZWl0aGVyIFxjICNMb3dlciBvciBcYyAjVXBwZXIKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgYW4gZXhwcmVzc2lvbiBvZiBhIHNlZmxhZGpvaW50IG1hdHJpeCBmcm9tIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgbWF0cml4CisgICogd2l0aCBnaXZlbiBkZW5zZSBzdG9yYWdlIG9mIHRoZSBjb2VmZmljaWVudHMuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpzZWxmYWRqb2ludFZpZXcoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBjbGFzcyBUcmlhbmd1bGFyQmFzZSwgTWF0cml4QmFzZTo6c2VsZmFkam9pbnRWaWV3KCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgorc3RydWN0IHRyYWl0czxTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSwgVXBMbz4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlZl9zZWxlY3RvcjxNYXRyaXhUeXBlPjo6bm9uX2NvbnN0X3R5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIE1hdHJpeFR5cGUgRXhwcmVzc2lvblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgRnVsbE1hdHJpeFR5cGU7CisgIGVudW0geworICAgIE1vZGUgPSBVcExvIHwgU2VsZkFkam9pbnQsCisgICAgRmxhZ3NMdmFsdWVCaXQgPSBpc19sdmFsdWU8TWF0cml4VHlwZT46OnZhbHVlID8gTHZhbHVlQml0IDogMCwKKyAgICBGbGFncyA9ICBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6RmxhZ3MgJiAoSGVyZWRpdGFyeUJpdHN8RmxhZ3NMdmFsdWVCaXQpCisgICAgICAgICAgICYgKH4oUGFja2V0QWNjZXNzQml0IHwgRGlyZWN0QWNjZXNzQml0IHwgTGluZWFyQWNjZXNzQml0KSkgLy8gRklYTUUgdGhlc2UgZmxhZ3Mgc2hvdWxkIGJlIHByZXNlcnZlZAorICB9OworfTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+IGNsYXNzIFNlbGZBZGpvaW50VmlldworICA6IHB1YmxpYyBUcmlhbmd1bGFyQmFzZTxTZWxmQWRqb2ludFZpZXc8X01hdHJpeFR5cGUsIFVwTG8+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgVHJpYW5ndWxhckJhc2U8U2VsZkFkam9pbnRWaWV3PiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTZWxmQWRqb2ludFZpZXc+OjpNYXRyaXhUeXBlTmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNlbGZBZGpvaW50Vmlldz46Ok1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworICAgIHR5cGVkZWYgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQgTmVzdGVkRXhwcmVzc2lvbjsKKworICAgIC8qKiBcYnJpZWYgVGhlIHR5cGUgb2YgY29lZmZpY2llbnRzIGluIHRoaXMgbWF0cml4ICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNlbGZBZGpvaW50Vmlldz46OlNjYWxhciBTY2FsYXI7IAorICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlIE1hdHJpeENvbmp1Z2F0ZVJldHVyblR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIE1vZGUgPSBpbnRlcm5hbDo6dHJhaXRzPFNlbGZBZGpvaW50Vmlldz46Ok1vZGUsCisgICAgICBGbGFncyA9IGludGVybmFsOjp0cmFpdHM8U2VsZkFkam9pbnRWaWV3Pjo6RmxhZ3MsCisgICAgICBUcmFuc3Bvc2VNb2RlID0gKChNb2RlICYgVXBwZXIpID8gTG93ZXIgOiAwKSB8ICgoTW9kZSAmIExvd2VyKSA/IFVwcGVyIDogMCkKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBTZWxmQWRqb2ludFZpZXcoTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkKKyAgICB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4Lm91dGVyU3RyaWRlKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmlubmVyU3RyaWRlKCk7IH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29lZmYoKQorICAgICAgKiBcd2FybmluZyB0aGUgY29vcmRpbmF0ZXMgbXVzdCBmaXQgaW50byB0aGUgcmVmZXJlbmNlZCB0cmlhbmd1bGFyIHBhcnQKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIEJhc2U6OmNoZWNrX2Nvb3JkaW5hdGVzX2ludGVybmFsKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpjb2VmZlJlZigpCisgICAgICAqIFx3YXJuaW5nIHRoZSBjb29yZGluYXRlcyBtdXN0IGZpdCBpbnRvIHRoZSByZWZlcmVuY2VkIHRyaWFuZ3VsYXIgcGFydAorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTFZBTFVFKFNlbGZBZGpvaW50Vmlldyk7CisgICAgICBCYXNlOjpjaGVja19jb29yZGluYXRlc19pbnRlcm5hbChyb3csIGNvbCk7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkJiBfZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkJiBuZXN0ZWRFeHByZXNzaW9uKCkgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIC8qKiBFZmZpY2llbnQgdHJpYW5ndWxhciBtYXRyaXggdGltZXMgdmVjdG9yL21hdHJpeCBwcm9kdWN0ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZHVjdDxTZWxmQWRqb2ludFZpZXcsT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIHJocykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxTZWxmQWRqb2ludFZpZXcsT3RoZXJEZXJpdmVkPigqdGhpcywgcmhzLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIEVmZmljaWVudCB2ZWN0b3IvbWF0cml4IHRpbWVzIHRyaWFuZ3VsYXIgbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZHVjdDxPdGhlckRlcml2ZWQsU2VsZkFkam9pbnRWaWV3PgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGxocywgY29uc3QgU2VsZkFkam9pbnRWaWV3JiByaHMpCisgICAgeworICAgICAgcmV0dXJuIFByb2R1Y3Q8T3RoZXJEZXJpdmVkLFNlbGZBZGpvaW50Vmlldz4obGhzLmRlcml2ZWQoKSxyaHMpOworICAgIH0KKyAgICAKKyAgICBmcmllbmQgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBTZWxmQWRqb2ludFZpZXc8Y29uc3QgRUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoU2NhbGFyLE1hdHJpeFR5cGUscHJvZHVjdCksVXBMbz4KKyAgICBvcGVyYXRvciooY29uc3QgU2NhbGFyJiBzLCBjb25zdCBTZWxmQWRqb2ludFZpZXcmIG1hdCkKKyAgICB7CisgICAgICByZXR1cm4gKHMqbWF0Lm5lc3RlZEV4cHJlc3Npb24oKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm0gYSBzeW1tZXRyaWMgcmFuayAyIHVwZGF0ZSBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IFxjICp0aGlzOgorICAgICAgKiBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgdSB2XiogKyBjb25qKFxhbHBoYSkgdiB1XiogXGYkCisgICAgICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoZSB2ZWN0b3JzIFxhIHUgYW5kIFxjIHYgXGIgbXVzdCBiZSBjb2x1bW4gdmVjdG9ycywgaG93ZXZlciB0aGV5IGNhbiBiZQorICAgICAgKiBhIGFkam9pbnQgZXhwcmVzc2lvbiB3aXRob3V0IGFueSBvdmVyaGVhZC4gT25seSB0aGUgbWVhbmluZ2Z1bCB0cmlhbmd1bGFyCisgICAgICAqIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyB1cGRhdGVkLCB0aGUgcmVzdCBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAgICAgICoKKyAgICAgICogXHNhIHJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVT4mLCBTY2FsYXIpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRVLCB0eXBlbmFtZSBEZXJpdmVkVj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFNlbGZBZGpvaW50VmlldyYgcmFua1VwZGF0ZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWRVPiYgdSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVj4mIHYsIGNvbnN0IFNjYWxhciYgYWxwaGEgPSBTY2FsYXIoMSkpOworCisgICAgLyoqIFBlcmZvcm0gYSBzeW1tZXRyaWMgcmFuayBLIHVwZGF0ZSBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IFxjICp0aGlzOgorICAgICAgKiBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgKCB1IHVeKiApIFxmJCB3aGVyZSBcYSB1IGlzIGEgdmVjdG9yIG9yIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IHRvIHBlcmZvcm0gXGYkIHRoaXMgPSB0aGlzICsgXGFscGhhICggdV4qIHUgKSBcZiQgeW91IGNhbiBzaW1wbHkKKyAgICAgICogY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdS5hZGpvaW50KCkuCisgICAgICAqCisgICAgICAqIFxzYSByYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFU+JiwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVj4mLCBTY2FsYXIpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRVPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2VsZkFkam9pbnRWaWV3JiByYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFU+JiB1LCBjb25zdCBTY2FsYXImIGFscGhhID0gU2NhbGFyKDEpKTsKKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgdHJpYW5ndWxhciB2aWV3IGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50IHNlbGZhZGpvaW50IHZpZXcgb2YgYSBnaXZlbiB0cmlhbmd1bGFyIHBhcnQKKyAgICAgICoKKyAgICAgICogVGhlIHBhcmFtZXRlciBcYSBUcmlNb2RlIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBcYyAjVXBwZXIsIFxjICNTdHJpY3RseVVwcGVyLCBcYyAjVW5pdFVwcGVyLAorICAgICAgKiBcYyAjTG93ZXIsIFxjICNTdHJpY3RseUxvd2VyLCBcYyAjVW5pdExvd2VyLgorICAgICAgKgorICAgICAgKiBJZiBcYyBUcmlNb2RlIHJlZmVyZW5jZXMgdGhlIHNhbWUgdHJpYW5ndWxhciBwYXJ0IHRoYW4gXGMgKnRoaXMsIHRoZW4gdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybiBhIFxjIFRyaWFuZ3VsYXJWaWV3IG9mIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiwKKyAgICAgICogb3RoZXJ3aXNlLCB0aGUgbmVzdGVkIGV4cHJlc3Npb24gaXMgZmlyc3QgdHJhbnNwb3NlZCwgdGh1cyByZXR1cm5pbmcgYSBcYyBUcmlhbmd1bGFyVmlldzxUcmFuc3Bvc2U8TWF0cml4VHlwZT4+IG9iamVjdC4KKyAgICAgICoKKyAgICAgICogXHNhIE1hdHJpeEJhc2U6OnRyaWFuZ3VsYXJWaWV3KCksIGNsYXNzIFRyaWFuZ3VsYXJWaWV3CisgICAgICAqLworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBUcmlNb2RlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPChUcmlNb2RlJihVcHBlcnxMb3dlcikpPT0oVXBMbyYoVXBwZXJ8TG93ZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSxUcmlNb2RlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYW5ndWxhclZpZXc8dHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsVHJpTW9kZT4gPjo6dHlwZQorICAgIHRyaWFuZ3VsYXJWaWV3KCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8KFRyaU1vZGUmKFVwcGVyfExvd2VyKSk9PShVcExvJihVcHBlcnxMb3dlcikpLCBNYXRyaXhUeXBlJiwgdHlwZW5hbWUgTWF0cml4VHlwZTo6Q29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlPjo6dHlwZSB0bXAxKG1fbWF0cml4KTsKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwoVHJpTW9kZSYoVXBwZXJ8TG93ZXIpKT09KFVwTG8mKFVwcGVyfExvd2VyKSksIE1hdHJpeFR5cGUmLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZT46OnR5cGUgdG1wMih0bXAxKTsKKyAgICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8KFRyaU1vZGUmKFVwcGVyfExvd2VyKSk9PShVcExvJihVcHBlcnxMb3dlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLFRyaU1vZGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlhbmd1bGFyVmlldzx0eXBlbmFtZSBNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZSxUcmlNb2RlPiA+Ojp0eXBlKHRtcDIpOworICAgIH0KKworICAgIHR5cGVkZWYgU2VsZkFkam9pbnRWaWV3PGNvbnN0IE1hdHJpeENvbmp1Z2F0ZVJldHVyblR5cGUsTW9kZT4gQ29uanVnYXRlUmV0dXJuVHlwZTsKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmNvbmp1Z2F0ZSgpIGNvbnN0ICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgQ29uanVnYXRlUmV0dXJuVHlwZSBjb25qdWdhdGUoKSBjb25zdAorICAgIHsgcmV0dXJuIENvbmp1Z2F0ZVJldHVyblR5cGUobV9tYXRyaXguY29uanVnYXRlKCkpOyB9CisKKyAgICB0eXBlZGVmIFNlbGZBZGpvaW50Vmlldzxjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZSxUcmFuc3Bvc2VNb2RlPiBBZGpvaW50UmV0dXJuVHlwZTsKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmFkam9pbnQoKSBjb25zdCAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IEFkam9pbnRSZXR1cm5UeXBlIGFkam9pbnQoKSBjb25zdAorICAgIHsgcmV0dXJuIEFkam9pbnRSZXR1cm5UeXBlKG1fbWF0cml4LmFkam9pbnQoKSk7IH0KKworICAgIHR5cGVkZWYgU2VsZkFkam9pbnRWaWV3PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlRyYW5zcG9zZVJldHVyblR5cGUsVHJhbnNwb3NlTW9kZT4gVHJhbnNwb3NlUmV0dXJuVHlwZTsKKyAgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjp0cmFuc3Bvc2UoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShNYXRyaXhUeXBlKQorICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6VHJhbnNwb3NlUmV0dXJuVHlwZSB0bXAobV9tYXRyaXgpOworICAgICAgcmV0dXJuIFRyYW5zcG9zZVJldHVyblR5cGUodG1wKTsKKyAgICB9CisKKyAgICB0eXBlZGVmIFNlbGZBZGpvaW50Vmlldzxjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb25zdFRyYW5zcG9zZVJldHVyblR5cGUsVHJhbnNwb3NlTW9kZT4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlOworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6dHJhbnNwb3NlKCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlKG1fbWF0cml4LnRyYW5zcG9zZSgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGRpYWdvbmFsIG9mIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiwgdGh1cyBieS1wYXNzaW5nIHRoZSBTZWxmQWRqb2ludFZpZXcgZGVjb3JhdG9yLgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6ZGlhZ29uYWwoKSwgY2xhc3MgRGlhZ29uYWwgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkNvbnN0RGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gdHlwZW5hbWUgTWF0cml4VHlwZTo6Q29uc3REaWFnb25hbFJldHVyblR5cGUobV9tYXRyaXgpOworICAgIH0KKworLy8vLy8vLy8vLy8gQ2hvbGVza3kgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICBjb25zdCBMTFQ8UGxhaW5PYmplY3QsIFVwTG8+IGxsdCgpIGNvbnN0OworICAgIGNvbnN0IExETFQ8UGxhaW5PYmplY3QsIFVwTG8+IGxkbHQoKSBjb25zdDsKKworLy8vLy8vLy8vLy8gRWlnZW52YWx1ZSBtb2R1bGUgLy8vLy8vLy8vLy8KKworICAgIC8qKiBSZWFsIHBhcnQgb2YgI1NjYWxhciAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICAvKiogUmV0dXJuIHR5cGUgb2YgZWlnZW52YWx1ZXMoKSAqLworICAgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlc1JldHVyblR5cGU7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVpZ2VudmFsdWVzUmV0dXJuVHlwZSBlaWdlbnZhbHVlcygpIGNvbnN0OworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgUmVhbFNjYWxhciBvcGVyYXRvck5vcm0oKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKK307CisKKworLy8gdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KKy8vIGludGVybmFsOjpzZWxmYWRqb2ludF9tYXRyaXhfcHJvZHVjdF9yZXR1cm50eXBlPE90aGVyRGVyaXZlZCxTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxVcExvPiA+CisvLyBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBsaHMsIGNvbnN0IFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+JiByaHMpCisvLyB7CisvLyAgIHJldHVybiBpbnRlcm5hbDo6bWF0cml4X3NlbGZhZGpvaW50X3Byb2R1Y3RfcmV0dXJudHlwZTxPdGhlckRlcml2ZWQsU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4gPihsaHMuZGVyaXZlZCgpLHJocyk7CisvLyB9CisKKy8vIHNlbGZhZGpvaW50IHRvIGRlbnNlIG1hdHJpeAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUT0RPIGN1cnJlbnRseSBhIHNlbGZhZGpvaW50IGV4cHJlc3Npb24gaGFzIHRoZSBmb3JtIFNlbGZBZGpvaW50VmlldzwuLC4+CisvLyAgICAgIGluIHRoZSBmdXR1cmUgc2VsZmFkam9pbnQtbmVzcyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgZXhwcmVzc2lvbiB0cmFpdHMKKy8vICAgICAgc3VjaCB0aGF0IFRyYW5zcG9zZTxTZWxmQWRqb2ludFZpZXc8LiwuPiA+IGlzIHZhbGlkLiAoY3VycmVudGx5IFRyaWFuZ3VsYXJCYXNlOjp0cmFuc3Bvc2UoKSBpcyBvdmVybG9hZGVkIHRvIG1ha2UgaXQgd29yaykKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgorc3RydWN0IGV2YWx1YXRvcl90cmFpdHM8U2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsTW9kZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHN0b3JhZ2Vfa2luZF90b19ldmFsdWF0b3Jfa2luZDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlS2luZD46OktpbmQgS2luZDsKKyAgdHlwZWRlZiBTZWxmQWRqb2ludFNoYXBlIFNoYXBlOworfTsKKwordGVtcGxhdGU8aW50IFVwTG8sIGludCBTZXRPcHBvc2l0ZSwgdHlwZW5hbWUgRHN0RXZhbHVhdG9yVHlwZVQsIHR5cGVuYW1lIFNyY0V2YWx1YXRvclR5cGVULCB0eXBlbmFtZSBGdW5jdG9yLCBpbnQgVmVyc2lvbj4KK2NsYXNzIHRyaWFuZ3VsYXJfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8VXBMbyxTZWxmQWRqb2ludCxTZXRPcHBvc2l0ZSxEc3RFdmFsdWF0b3JUeXBlVCxTcmNFdmFsdWF0b3JUeXBlVCxGdW5jdG9yLFZlcnNpb24+CisgIDogcHVibGljIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBGdW5jdG9yLCBWZXJzaW9uPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBGdW5jdG9yLCBWZXJzaW9uPiBCYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkRzdFhwclR5cGUgRHN0WHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTcmNYcHJUeXBlIFNyY1hwclR5cGU7CisgIHVzaW5nIEJhc2U6Om1fZHN0OworICB1c2luZyBCYXNlOjptX3NyYzsKKyAgdXNpbmcgQmFzZTo6bV9mdW5jdG9yOworcHVibGljOgorICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpEc3RFdmFsdWF0b3JUeXBlIERzdEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U3JjRXZhbHVhdG9yVHlwZSBTcmNFdmFsdWF0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6QXNzaWdubWVudFRyYWl0cyBBc3NpZ25tZW50VHJhaXRzOworICAKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIHRyaWFuZ3VsYXJfZGVuc2VfYXNzaWdubWVudF9rZXJuZWwoRHN0RXZhbHVhdG9yVHlwZSAmZHN0LCBjb25zdCBTcmNFdmFsdWF0b3JUeXBlICZzcmMsIGNvbnN0IEZ1bmN0b3IgJmZ1bmMsIERzdFhwclR5cGUmIGRzdEV4cHIpCisgICAgOiBCYXNlKGRzdCwgc3JjLCBmdW5jLCBkc3RFeHByKQorICB7fQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBhc3NpZ25Db2VmZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyb3chPWNvbCk7CisgICAgU2NhbGFyIHRtcCA9IG1fc3JjLmNvZWZmKHJvdyxjb2wpOworICAgIG1fZnVuY3Rvci5hc3NpZ25Db2VmZihtX2RzdC5jb2VmZlJlZihyb3csY29sKSwgdG1wKTsKKyAgICBtX2Z1bmN0b3IuYXNzaWduQ29lZmYobV9kc3QuY29lZmZSZWYoY29sLHJvdyksIG51bWV4dDo6Y29uaih0bXApKTsKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBhc3NpZ25EaWFnb25hbENvZWZmKEluZGV4IGlkKQorICB7CisgICAgQmFzZTo6YXNzaWduQ29lZmYoaWQsaWQpOworICB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGFzc2lnbk9wcG9zaXRlQ29lZmYoSW5kZXgsIEluZGV4KQorICB7IGVpZ2VuX2ludGVybmFsX2Fzc2VydChmYWxzZSAmJiAic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBNYXRyaXhCYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgTWF0cml4QmFzZTo6c2VsZmFkam9pbnRWaWV3KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgVXBMbz4KK3R5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIENvbnN0U2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZTxVcExvPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6c2VsZmFkam9pbnRWaWV3KCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0U2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZTxVcExvPjo6VHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIHN5bW1ldHJpYy9zZWxmLWFkam9pbnQgdmlldyBleHRyYWN0ZWQgZnJvbSB0aGUgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBjdXJyZW50IG1hdHJpeAorICAqCisgICogVGhlIHBhcmFtZXRlciBcYSBVcExvIGNhbiBiZSBlaXRoZXIgXGMgI1VwcGVyIG9yIFxjICNMb3dlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZWxmYWRqb2ludFZpZXcuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9zZWxmYWRqb2ludFZpZXcub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgU2VsZkFkam9pbnRWaWV3CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+Cit0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpzZWxmYWRqb2ludFZpZXcoKQoreworICByZXR1cm4gdHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZTxVcExvPjo6VHlwZShkZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1NlbGZDd2lzZUJpbmFyeU9wLmggYi9FaWdlbi9zcmMvQ29yZS9TZWxmQ3dpc2VCaW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDk5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9TZWxmQ3dpc2VCaW5hcnlPcC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEZDV0lTRUJJTkFSWU9QX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkNXSVNFQklOQVJZT1BfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLy8gVE9ETyBnZW5lcmFsaXplIHRoZSBzY2FsYXIgdHlwZSBvZiAnb3RoZXInCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50KHRoaXMtPmRlcml2ZWQoKSwgUGxhaW5PYmplY3Q6OkNvbnN0YW50KHJvd3MoKSxjb2xzKCksb3RoZXIpLCBpbnRlcm5hbDo6bXVsX2Fzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcis9KGNvbnN0IFNjYWxhciYgb3RoZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnQodGhpcy0+ZGVyaXZlZCgpLCBQbGFpbk9iamVjdDo6Q29uc3RhbnQocm93cygpLGNvbHMoKSxvdGhlciksIGludGVybmFsOjphZGRfYXNzaWduX29wPFNjYWxhcixTY2FsYXI+KCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBBcnJheUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLT0oY29uc3QgU2NhbGFyJiBvdGhlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudCh0aGlzLT5kZXJpdmVkKCksIFBsYWluT2JqZWN0OjpDb25zdGFudChyb3dzKCksY29scygpLG90aGVyKSwgaW50ZXJuYWw6OnN1Yl9hc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4oKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IvPShjb25zdCBTY2FsYXImIG90aGVyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50KHRoaXMtPmRlcml2ZWQoKSwgUGxhaW5PYmplY3Q6OkNvbnN0YW50KHJvd3MoKSxjb2xzKCksb3RoZXIpLCBpbnRlcm5hbDo6ZGl2X2Fzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQ1dJU0VCSU5BUllPUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Tb2x2ZS5oIGIvRWlnZW4vc3JjL0NvcmUvU29sdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRhZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvU29sdmUuaApAQCAtMCwwICsxLDE4OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NPTFZFX0gKKyNkZWZpbmUgRUlHRU5fU09MVkVfSAorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBTdG9yYWdlS2luZD4gY2xhc3MgU29sdmVJbXBsOworICAKKy8qKiBcY2xhc3MgU29sdmUKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIHNvbHZpbmcgb3BlcmF0aW9uCisgICoKKyAgKiBcdHBhcmFtIERlY29tcG9zaXRpb24gdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvciBkZWNvbXBvc2lvbiBvYmplY3QKKyAgKiBcdHBhcmFtIFJoc3R5cGUgdGhlIHR5cGUgb2YgdGhlIHJpZ2h0LWhhbmQgc2lkZQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgQS5zb2x2ZShCKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHRoaXMgc29sdmVfdHJhaXRzIGNsYXNzIHBlcm1pdHMgdG8gZGV0ZXJtaW5lIHRoZSBldmFsdWF0aW9uIHR5cGUgd2l0aCByZXNwZWN0IHRvIHN0b3JhZ2Uga2luZCAoRGVuc2UgdnMgU3BhcnNlKQordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzVHlwZSx0eXBlbmFtZSBTdG9yYWdlS2luZD4gc3RydWN0IHNvbHZlX3RyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzVHlwZT4KK3N0cnVjdCBzb2x2ZV90cmFpdHM8RGVjb21wb3NpdGlvbixSaHNUeXBlLERlbnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIG1ha2VfcHJvcGVyX21hdHJpeF90eXBlPHR5cGVuYW1lIFJoc1R5cGU6OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgRGVjb21wb3NpdGlvbjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoc1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBSaHNUeXBlOjpQbGFpbk9iamVjdDo6T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgRGVjb21wb3NpdGlvbjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoc1R5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBQbGFpbk9iamVjdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb24sIHR5cGVuYW1lIFJoc1R5cGU+CitzdHJ1Y3QgdHJhaXRzPFNvbHZlPERlY29tcG9zaXRpb24sIFJoc1R5cGU+ID4KKyAgOiB0cmFpdHM8dHlwZW5hbWUgc29sdmVfdHJhaXRzPERlY29tcG9zaXRpb24sUmhzVHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJoc1R5cGU+OjpTdG9yYWdlS2luZD46OlBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIHR5cGVuYW1lIHNvbHZlX3RyYWl0czxEZWNvbXBvc2l0aW9uLFJoc1R5cGUsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxSaHNUeXBlPjo6U3RvcmFnZUtpbmQ+OjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbjo6U3RvcmFnZUluZGV4LCB0eXBlbmFtZSBSaHNUeXBlOjpTdG9yYWdlSW5kZXg+Ojp0eXBlIFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0cmFpdHM8UGxhaW5PYmplY3Q+IEJhc2VUcmFpdHM7CisgIGVudW0geworICAgIEZsYWdzID0gQmFzZVRyYWl0czo6RmxhZ3MgJiBSb3dNYWpvckJpdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gSHVnZUNvc3QKKyAgfTsKK307CisKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHNUeXBlPgorY2xhc3MgU29sdmUgOiBwdWJsaWMgU29sdmVJbXBsPERlY29tcG9zaXRpb24sUmhzVHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJoc1R5cGU+OjpTdG9yYWdlS2luZD4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNvbHZlPjo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTb2x2ZT46OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIAorICBTb2x2ZShjb25zdCBEZWNvbXBvc2l0aW9uICZkZWMsIGNvbnN0IFJoc1R5cGUgJnJocykKKyAgICA6IG1fZGVjKGRlYyksIG1fcmhzKHJocykKKyAge30KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2RlYy5jb2xzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IERlY29tcG9zaXRpb24mIGRlYygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFJoc1R5cGUmICAgICAgIHJocygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgRGVjb21wb3NpdGlvbiAmbV9kZWM7CisgIGNvbnN0IFJoc1R5cGUgICAgICAgJm1fcmhzOworfTsKKworCisvLyBTcGVjaWFsaXphdGlvbiBvZiB0aGUgU29sdmUgZXhwcmVzc2lvbiBmb3IgZGVuc2UgcmVzdWx0cwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzVHlwZT4KK2NsYXNzIFNvbHZlSW1wbDxEZWNvbXBvc2l0aW9uLFJoc1R5cGUsRGVuc2U+CisgIDogcHVibGljIE1hdHJpeEJhc2U8U29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPiA+Cit7CisgIHR5cGVkZWYgU29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPiBEZXJpdmVkOworICAKK3B1YmxpYzoKKyAgCisgIHR5cGVkZWYgTWF0cml4QmFzZTxTb2x2ZTxEZWNvbXBvc2l0aW9uLFJoc1R5cGU+ID4gQmFzZTsKKyAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShEZXJpdmVkKQorCitwcml2YXRlOgorICAKKyAgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdDsKKyAgU2NhbGFyIGNvZWZmKEluZGV4IGkpIGNvbnN0OworfTsKKworLy8gR2VuZXJpYyBBUEkgZGlzcGF0Y2hlcgordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBTb2x2ZUltcGwgOiBwdWJsaWMgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8U29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPiwgTWF0cml4WHByLCBTdG9yYWdlS2luZD46OnR5cGUKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8U29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPiwgTWF0cml4WHByLCBTdG9yYWdlS2luZD46OnR5cGUgQmFzZTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEV2YWx1YXRvciBvZiBTb2x2ZSAtPiBldmFsIGludG8gYSB0ZW1wb3JhcnkKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb24sIHR5cGVuYW1lIFJoc1R5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yPFNvbHZlPERlY29tcG9zaXRpb24sUmhzVHlwZT4gPgorICA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgU29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPjo6UGxhaW5PYmplY3Q+Cit7CisgIHR5cGVkZWYgU29sdmU8RGVjb21wb3NpdGlvbixSaHNUeXBlPiBTb2x2ZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVUeXBlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgdHlwZWRlZiBldmFsdWF0b3I8UGxhaW5PYmplY3Q+IEJhc2U7CisKKyAgZW51bSB7IEZsYWdzID0gQmFzZTo6RmxhZ3MgfCBFdmFsQmVmb3JlTmVzdGluZ0JpdCB9OworICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFNvbHZlVHlwZSYgc29sdmUpCisgICAgOiBtX3Jlc3VsdChzb2x2ZS5yb3dzKCksIHNvbHZlLmNvbHMoKSkKKyAgeworICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UobV9yZXN1bHQpOworICAgIHNvbHZlLmRlYygpLl9zb2x2ZV9pbXBsKHNvbHZlLnJocygpLCBtX3Jlc3VsdCk7CisgIH0KKyAgCitwcm90ZWN0ZWQ6ICAKKyAgUGxhaW5PYmplY3QgbV9yZXN1bHQ7Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgImRzdCA9IGRlYy5zb2x2ZShyaHMpIgorLy8gTk9URSB3ZSBuZWVkIHRvIHNwZWNpYWxpemUgaXQgZm9yIERlbnNlMkRlbnNlIHRvIGF2b2lkIGFtYmlndW91cyBzcGVjaWFsaXphdGlvbiBlcnJvciBhbmQgYSBTcGFyc2UyU3BhcnNlIHNwZWNpYWxpemF0aW9uIG11c3QgZXhpc3Qgc29tZXdoZXJlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBEZWNUeXBlLCB0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTb2x2ZTxEZWNUeXBlLFJoc1R5cGU+LCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+LCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBTb2x2ZTxEZWNUeXBlLFJoc1R5cGU+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiAmKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisKKyAgICBzcmMuZGVjKCkuX3NvbHZlX2ltcGwoc3JjLnJocygpLCBkc3QpOworICB9Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgImRzdCA9IGRlYy50cmFuc3Bvc2UoKS5zb2x2ZShyaHMpIgordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgRGVjVHlwZSwgdHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU29sdmU8VHJhbnNwb3NlPGNvbnN0IERlY1R5cGU+LFJoc1R5cGU+LCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+LCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBTb2x2ZTxUcmFuc3Bvc2U8Y29uc3QgRGVjVHlwZT4sUmhzVHlwZT4gU3JjWHByVHlwZTsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+ICYpCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKworICAgIHNyYy5kZWMoKS5uZXN0ZWRFeHByZXNzaW9uKCkudGVtcGxhdGUgX3NvbHZlX2ltcGxfdHJhbnNwb3NlZDxmYWxzZT4oc3JjLnJocygpLCBkc3QpOworICB9Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgImRzdCA9IGRlYy5hZGpvaW50KCkuc29sdmUocmhzKSIKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIERlY1R5cGUsIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFNvbHZlPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDx0eXBlbmFtZSBEZWNUeXBlOjpTY2FsYXI+LCBjb25zdCBUcmFuc3Bvc2U8Y29uc3QgRGVjVHlwZT4gPixSaHNUeXBlPiwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4sIERlbnNlMkRlbnNlPgoreworICB0eXBlZGVmIFNvbHZlPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDx0eXBlbmFtZSBEZWNUeXBlOjpTY2FsYXI+LCBjb25zdCBUcmFuc3Bvc2U8Y29uc3QgRGVjVHlwZT4gPixSaHNUeXBlPiBTcmNYcHJUeXBlOworICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLFNjYWxhcj4gJikKKyAgeworICAgIEluZGV4IGRzdFJvd3MgPSBzcmMucm93cygpOworICAgIEluZGV4IGRzdENvbHMgPSBzcmMuY29scygpOworICAgIGlmKChkc3Qucm93cygpIT1kc3RSb3dzKSB8fCAoZHN0LmNvbHMoKSE9ZHN0Q29scykpCisgICAgICBkc3QucmVzaXplKGRzdFJvd3MsIGRzdENvbHMpOworICAgIAorICAgIHNyYy5kZWMoKS5uZXN0ZWRFeHByZXNzaW9uKCkubmVzdGVkRXhwcmVzc2lvbigpLnRlbXBsYXRlIF9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQ8dHJ1ZT4oc3JjLnJocygpLCBkc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lcHNhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TT0xWRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Tb2x2ZVRyaWFuZ3VsYXIuaCBiL0VpZ2VuL3NyYy9Db3JlL1NvbHZlVHJpYW5ndWxhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTg5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Tb2x2ZVRyaWFuZ3VsYXIuaApAQCAtMCwwICsxLDIzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU09MVkVUUklBTkdVTEFSX0gKKyNkZWZpbmUgRUlHRU5fU09MVkVUUklBTkdVTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zOgorLy8gVGhlIGZvbGxvd2luZyB0d28gcm91dGluZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBwcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyKi5oIGZpbGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTaWRlLCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU2lkZSwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgVHJpU3RvcmFnZU9yZGVyLCBpbnQgT3RoZXJTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg7CisKKy8vIHNtYWxsIGhlbHBlciBzdHJ1Y3QgZXh0cmFjdGluZyBzb21lIHRyYWl0cyBvbiB0aGUgdW5kZXJseWluZyBzb2x2ZXIgb3BlcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFNpZGU+CitjbGFzcyB0cnNvbHZlX3RyYWl0cworeworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgUmhzSXNWZWN0b3JBdENvbXBpbGVUaW1lID0gKFNpZGU9PU9uVGhlTGVmdCA/IFJoczo6Q29sc0F0Q29tcGlsZVRpbWUgOiBSaHM6OlJvd3NBdENvbXBpbGVUaW1lKT09MQorICAgIH07CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIFVucm9sbGluZyAgID0gKFJoc0lzVmVjdG9yQXRDb21waWxlVGltZSAmJiBSaHM6OlNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYgUmhzOjpTaXplQXRDb21waWxlVGltZSA8PSA4KQorICAgICAgICAgICAgICAgICAgPyBDb21wbGV0ZVVucm9sbGluZyA6IE5vVW5yb2xsaW5nLAorICAgICAgUmhzVmVjdG9ycyAgPSBSaHNJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyAxIDogRHluYW1pYworICAgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywKKyAgaW50IFNpZGUsIC8vIGNhbiBiZSBPblRoZUxlZnQvT25UaGVSaWdodAorICBpbnQgTW9kZSwgLy8gY2FuIGJlIFVwcGVyL0xvd2VyIHwgVW5pdERpYWcKKyAgaW50IFVucm9sbGluZyA9IHRyc29sdmVfdHJhaXRzPExocyxSaHMsU2lkZT46OlVucm9sbGluZywKKyAgaW50IFJoc1ZlY3RvcnMgPSB0cnNvbHZlX3RyYWl0czxMaHMsUmhzLFNpZGU+OjpSaHNWZWN0b3JzCisgID4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBTaWRlLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjxMaHMsUmhzLFNpZGUsTW9kZSxOb1Vucm9sbGluZywxPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6U2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBSaHNTY2FsYXI7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TGhzPiBMaHNQcm9kdWN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIExoc1Byb2R1Y3RUcmFpdHM6OkV4dHJhY3RUeXBlIEFjdHVhbExoc1R5cGU7CisgIHR5cGVkZWYgTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiwgQWxpZ25lZD4gTWFwcGVkUmhzOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgcmhzKQorICB7CisgICAgQWN0dWFsTGhzVHlwZSBhY3R1YWxMaHMgPSBMaHNQcm9kdWN0VHJhaXRzOjpleHRyYWN0KGxocyk7CisKKyAgICAvLyBGSVhNRSBmaW5kIGEgd2F5IHRvIGFsbG93IGFuIGlubmVyIHN0cmlkZSBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKworICAgIGJvb2wgdXNlUmhzRGlyZWN0bHkgPSBSaHM6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSB8fCByaHMuaW5uZXJTdHJpZGUoKT09MTsKKworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsYWN0dWFsUmhzLHJocy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VSaHNEaXJlY3RseSA/IHJocy5kYXRhKCkgOiAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCF1c2VSaHNEaXJlY3RseSkKKyAgICAgIE1hcHBlZFJocyhhY3R1YWxSaHMscmhzLnNpemUoKSkgPSByaHM7CisKKyAgICB0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIFNpZGUsIE1vZGUsIExoc1Byb2R1Y3RUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KExoczo6RmxhZ3MpICYgUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKGFjdHVhbExocy5jb2xzKCksIGFjdHVhbExocy5kYXRhKCksIGFjdHVhbExocy5vdXRlclN0cmlkZSgpLCBhY3R1YWxSaHMpOworCisgICAgaWYoIXVzZVJoc0RpcmVjdGx5KQorICAgICAgcmhzID0gTWFwcGVkUmhzKGFjdHVhbFJocywgcmhzLnNpemUoKSk7CisgIH0KK307CisKKy8vIHRoZSByaHMgaXMgYSBtYXRyaXgKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgU2lkZSwgaW50IE1vZGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfc2VsZWN0b3I8TGhzLFJocyxTaWRlLE1vZGUsTm9VbnJvbGxpbmcsRHluYW1pYz4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TGhzPiBMaHNQcm9kdWN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIExoc1Byb2R1Y3RUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsTGhzVHlwZTsKKworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgcmhzKQorICB7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbExoc1R5cGU+Ojp0eXBlIGFjdHVhbExocyA9IExoc1Byb2R1Y3RUcmFpdHM6OmV4dHJhY3QobGhzKTsKKworICAgIGNvbnN0IEluZGV4IHNpemUgPSBsaHMucm93cygpOworICAgIGNvbnN0IEluZGV4IG90aGVyc2l6ZSA9IFNpZGU9PU9uVGhlTGVmdD8gcmhzLmNvbHMoKSA6IHJocy5yb3dzKCk7CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPChSaHM6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsU2NhbGFyLFNjYWxhciwKKyAgICAgICAgICAgICAgUmhzOjpNYXhSb3dzQXRDb21waWxlVGltZSwgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZSwgTGhzOjpNYXhSb3dzQXRDb21waWxlVGltZSw0PiBCbG9ja2luZ1R5cGU7CisKKyAgICBCbG9ja2luZ1R5cGUgYmxvY2tpbmcocmhzLnJvd3MoKSwgcmhzLmNvbHMoKSwgc2l6ZSwgMSwgZmFsc2UpOworCisgICAgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLEluZGV4LFNpZGUsTW9kZSxMaHNQcm9kdWN0VHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsKGludChMaHM6OkZsYWdzKSAmIFJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJoczo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKHNpemUsIG90aGVyc2l6ZSwgJmFjdHVhbExocy5jb2VmZlJlZigwLDApLCBhY3R1YWxMaHMub3V0ZXJTdHJpZGUoKSwgJnJocy5jb2VmZlJlZigwLDApLCByaHMub3V0ZXJTdHJpZGUoKSwgYmxvY2tpbmcpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1ldGEtdW5yb2xsaW5nIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwgaW50IExvb3BJbmRleCwgaW50IFNpemUsCisgICAgICAgICBib29sIFN0b3AgPSBMb29wSW5kZXg9PVNpemU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfdW5yb2xsZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwgaW50IExvb3BJbmRleCwgaW50IFNpemU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfdW5yb2xsZXI8TGhzLFJocyxNb2RlLExvb3BJbmRleCxTaXplLGZhbHNlPiB7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoKE1vZGUmTG93ZXIpPT1Mb3dlciksCisgICAgRGlhZ0luZGV4ICA9IElzTG93ZXIgPyBMb29wSW5kZXggOiBTaXplIC0gTG9vcEluZGV4IC0gMSwKKyAgICBTdGFydEluZGV4ID0gSXNMb3dlciA/IDAgICAgICAgICA6IERpYWdJbmRleCsxCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiByaHMpCisgIHsKKyAgICBpZiAoTG9vcEluZGV4PjApCisgICAgICByaHMuY29lZmZSZWYoRGlhZ0luZGV4KSAtPSBsaHMucm93KERpYWdJbmRleCkudGVtcGxhdGUgc2VnbWVudDxMb29wSW5kZXg+KFN0YXJ0SW5kZXgpLnRyYW5zcG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jd2lzZVByb2R1Y3QocmhzLnRlbXBsYXRlIHNlZ21lbnQ8TG9vcEluZGV4PihTdGFydEluZGV4KSkuc3VtKCk7CisKKyAgICBpZighKE1vZGUgJiBVbml0RGlhZykpCisgICAgICByaHMuY29lZmZSZWYoRGlhZ0luZGV4KSAvPSBsaHMuY29lZmYoRGlhZ0luZGV4LERpYWdJbmRleCk7CisKKyAgICB0cmlhbmd1bGFyX3NvbHZlcl91bnJvbGxlcjxMaHMsUmhzLE1vZGUsTG9vcEluZGV4KzEsU2l6ZT46OnJ1bihsaHMscmhzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLCBpbnQgTG9vcEluZGV4LCBpbnQgU2l6ZT4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl91bnJvbGxlcjxMaHMsUmhzLE1vZGUsTG9vcEluZGV4LFNpemUsdHJ1ZT4geworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiwgUmhzJikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjxMaHMsUmhzLE9uVGhlTGVmdCxNb2RlLENvbXBsZXRlVW5yb2xsaW5nLDE+IHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIHJocykKKyAgeyB0cmlhbmd1bGFyX3NvbHZlcl91bnJvbGxlcjxMaHMsUmhzLE1vZGUsMCxSaHM6OlNpemVBdENvbXBpbGVUaW1lPjo6cnVuKGxocyxyaHMpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfc2VsZWN0b3I8TGhzLFJocyxPblRoZVJpZ2h0LE1vZGUsQ29tcGxldGVVbnJvbGxpbmcsMT4geworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgcmhzKQorICB7CisgICAgVHJhbnNwb3NlPGNvbnN0IExocz4gdHJMaHMobGhzKTsKKyAgICBUcmFuc3Bvc2U8UmhzPiB0clJocyhyaHMpOworICAgIAorICAgIHRyaWFuZ3VsYXJfc29sdmVyX3Vucm9sbGVyPFRyYW5zcG9zZTxjb25zdCBMaHM+LFRyYW5zcG9zZTxSaHM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNb2RlJlVwcGVyKT09VXBwZXIgPyBMb3dlciA6IFVwcGVyKSB8IChNb2RlJlVuaXREaWFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsUmhzOjpTaXplQXRDb21waWxlVGltZT46OnJ1bih0ckxocyx0clJocyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRyaWFuZ3VsYXJWaWV3IG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+Cit0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBUcmlhbmd1bGFyVmlld0ltcGw8TWF0cml4VHlwZSxNb2RlLERlbnNlPjo6c29sdmVJblBsYWNlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgX290aGVyKSBjb25zdAoreworICBPdGhlckRlcml2ZWQmIG90aGVyID0gX290aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworICBlaWdlbl9hc3NlcnQoIGRlcml2ZWQoKS5jb2xzKCkgPT0gZGVyaXZlZCgpLnJvd3MoKSAmJiAoKFNpZGU9PU9uVGhlTGVmdCAmJiBkZXJpdmVkKCkuY29scygpID09IG90aGVyLnJvd3MoKSkgfHwgKFNpZGU9PU9uVGhlUmlnaHQgJiYgZGVyaXZlZCgpLmNvbHMoKSA9PSBvdGhlci5jb2xzKCkpKSApOworICBlaWdlbl9hc3NlcnQoKCEoTW9kZSAmIFplcm9EaWFnKSkgJiYgYm9vbChNb2RlICYgKFVwcGVyfExvd2VyKSkpOworCisgIGVudW0geyBjb3B5ID0gKGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgICYmIE90aGVyRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lICYmIE90aGVyRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUhPTF9OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxjb3B5LAorICAgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8T3RoZXJEZXJpdmVkPjo6dHlwZSwgT3RoZXJEZXJpdmVkJj46OnR5cGUgT3RoZXJDb3B5OworICBPdGhlckNvcHkgb3RoZXJDb3B5KG90aGVyKTsKKworICBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZXJfc2VsZWN0b3I8TWF0cml4VHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8T3RoZXJDb3B5Pjo6dHlwZSwKKyAgICBTaWRlLCBNb2RlPjo6cnVuKGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCksIG90aGVyQ29weSk7CisKKyAgaWYgKGNvcHkpCisgICAgb3RoZXIgPSBvdGhlckNvcHk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8aW50IFNpZGUsIHR5cGVuYW1lIE90aGVyPgorY29uc3QgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsPFNpZGUsVHJpYW5ndWxhclZpZXc8RGVyaXZlZCxNb2RlPixPdGhlcj4KK1RyaWFuZ3VsYXJWaWV3SW1wbDxEZXJpdmVkLE1vZGUsRGVuc2U+Ojpzb2x2ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyPiYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9yZXR2YWw8U2lkZSxUcmlhbmd1bGFyVmlld1R5cGUsT3RoZXI+KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKK3RlbXBsYXRlPGludCBTaWRlLCB0eXBlbmFtZSBUcmlhbmd1bGFyVHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czx0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDxTaWRlLCBUcmlhbmd1bGFyVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxSaHM+Ojp0eXBlIFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgVHJpYW5ndWxhclR5cGUsIHR5cGVuYW1lIFJocz4gc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTx0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDxTaWRlLCBUcmlhbmd1bGFyVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHM6Ok5lc3RlZD46OnR5cGUgUmhzTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiBSZXR1cm5CeVZhbHVlPHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsPiBCYXNlOworCisgIHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsKGNvbnN0IFRyaWFuZ3VsYXJUeXBlJiB0cmksIGNvbnN0IFJocyYgcmhzKQorICAgIDogbV90cmlhbmd1bGFyTWF0cml4KHRyaSksIG1fcmhzKHJocykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLnJvd3MoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBpZighaXNfc2FtZV9kZW5zZShkc3QsbV9yaHMpKQorICAgICAgZHN0ID0gbV9yaHM7CisgICAgbV90cmlhbmd1bGFyTWF0cml4LnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxTaWRlPihkc3QpOworICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFRyaWFuZ3VsYXJUeXBlJiBtX3RyaWFuZ3VsYXJNYXRyaXg7CisgICAgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgbV9yaHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NPTFZFVFJJQU5HVUxBUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Tb2x2ZXJCYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9Tb2x2ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0YWRjMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1NvbHZlckJhc2UuaApAQCAtMCwwICsxLDEzMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NPTFZFUkJBU0VfSAorI2RlZmluZSBFSUdFTl9TT0xWRVJCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGNsYXNzIFNvbHZlckJhc2UKKyAgKiBcYnJpZWYgQSBiYXNlIGNsYXNzIGZvciBtYXRyaXggZGVjb21wb3NpdGlvbiBhbmQgc29sdmVycworICAqCisgICogXHRwYXJhbSBEZXJpdmVkIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZGVjb21wb3NpdGlvbi9zb2x2ZXIuCisgICoKKyAgKiBBbnkgbWF0cml4IGRlY29tcG9zaXRpb24gaW5oZXJpdGluZyB0aGlzIGJhc2UgY2xhc3MgcHJvdmlkZSB0aGUgZm9sbG93aW5nIEFQSToKKyAgKgorICAqIFxjb2RlCisgICogTWF0cml4VHlwZSBBLCBiLCB4OworICAqIERlY29tcG9zaXRpb25UeXBlIGRlYyhBKTsKKyAgKiB4ID0gZGVjLnNvbHZlKGIpOyAgICAgICAgICAgICAvLyBzb2x2ZSBBICAgKiB4ID0gYgorICAqIHggPSBkZWMudHJhbnNwb3NlKCkuc29sdmUoYik7IC8vIHNvbHZlIEFeVCAqIHggPSBiCisgICogeCA9IGRlYy5hZGpvaW50KCkuc29sdmUoYik7ICAgLy8gc29sdmUgQScgICogeCA9IGIKKyAgKiBcZW5kY29kZQorICAqCisgICogXHdhcm5pbmcgQ3VycmVudGx5LCBhbnkgb3RoZXIgdXNhZ2Ugb2YgdHJhbnNwb3NlKCkgYW5kIGFkam9pbnQoKSBhcmUgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBwcm9kdWNlIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgKgorICAqIFxzYSBjbGFzcyBQYXJ0aWFsUGl2TFUsIGNsYXNzIEZ1bGxQaXZMVQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNvbHZlckJhc2UgOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgU2NhbGFyIENvZWZmUmV0dXJuVHlwZTsKKworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQpLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQpLAorICAgICAgSXNWZWN0b3JBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUgPT0gMQorICAgIH07CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLworICAgIFNvbHZlckJhc2UoKQorICAgIHt9CisKKyAgICB+U29sdmVyQmFzZSgpCisgICAge30KKworICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IFNvbHZlPERlcml2ZWQsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGRlcml2ZWQoKS5yb3dzKCk9PWIucm93cygpICYmICJzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxEZXJpdmVkLCBSaHM+KGRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIHRyYW5zcG9zZSgpICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0PFRyYW5zcG9zZTxjb25zdCBEZXJpdmVkPiA+Ojp0eXBlIENvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZTsKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNwb3NlZCBvZiB0aGUgZmFjdG9yZWQgbWF0cml4LgorICAgICAgKgorICAgICAgKiBBIHR5cGljYWwgdXNhZ2UgaXMgdG8gc29sdmUgZm9yIHRoZSB0cmFuc3Bvc2VkIHByb2JsZW0gQV5UIHggPSBiOgorICAgICAgKiBcY29kZSB4ID0gZGVjLnRyYW5zcG9zZSgpLnNvbHZlKGIpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBcc2EgYWRqb2ludCgpLCBzb2x2ZSgpCisgICAgICAqLworICAgIGlubGluZSBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCB0aGUgcmV0dXJuIHR5cGUgb2YgYWRqb2ludCgpICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LCBDb25zdFRyYW5zcG9zZVJldHVyblR5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIEFkam9pbnRSZXR1cm5UeXBlOworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBhZGpvaW50IG9mIHRoZSBmYWN0b3JlZCBtYXRyaXgKKyAgICAgICoKKyAgICAgICogQSB0eXBpY2FsIHVzYWdlIGlzIHRvIHNvbHZlIGZvciB0aGUgYWRqb2ludCBwcm9ibGVtIEEnIHggPSBiOgorICAgICAgKiBcY29kZSB4ID0gZGVjLmFkam9pbnQoKS5zb2x2ZShiKTsgXGVuZGNvZGUKKyAgICAgICoKKyAgICAgICogRm9yIHJlYWwgc2NhbGFyIHR5cGVzLCB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdHJhbnNwb3NlKCkuCisgICAgICAqCisgICAgICAqIFxzYSB0cmFuc3Bvc2UoKSwgc29sdmUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgQWRqb2ludFJldHVyblR5cGUgYWRqb2ludCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIEFkam9pbnRSZXR1cm5UeXBlKGRlcml2ZWQoKS50cmFuc3Bvc2UoKSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZ2VuZXJpY194cHJfYmFzZTxEZXJpdmVkLCBNYXRyaXhYcHIsIFNvbHZlclN0b3JhZ2U+Cit7CisgIHR5cGVkZWYgU29sdmVyQmFzZTxEZXJpdmVkPiB0eXBlOworCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TT0xWRVJCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1N0YWJsZU5vcm0uaCBiL0VpZ2VuL3NyYy9Db3JlL1N0YWJsZU5vcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA0ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvU3RhYmxlTm9ybS5oCkBAIC0wLDAgKzEsMjIxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RBQkxFTk9STV9ICisjZGVmaW5lIEVJR0VOX1NUQUJMRU5PUk1fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSB2b2lkIHN0YWJsZV9ub3JtX2tlcm5lbChjb25zdCBFeHByZXNzaW9uVHlwZSYgYmwsIFNjYWxhciYgc3NxLCBTY2FsYXImIHNjYWxlLCBTY2FsYXImIGludlNjYWxlKQoreworICBTY2FsYXIgbWF4Q29lZmYgPSBibC5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIAorICBpZihtYXhDb2VmZj5zY2FsZSkKKyAgeworICAgIHNzcSA9IHNzcSAqIG51bWV4dDo6YWJzMihzY2FsZS9tYXhDb2VmZik7CisgICAgU2NhbGFyIHRtcCA9IFNjYWxhcigxKS9tYXhDb2VmZjsKKyAgICBpZih0bXAgPiBOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpKQorICAgIHsKKyAgICAgIGludlNjYWxlID0gTnVtVHJhaXRzPFNjYWxhcj46OmhpZ2hlc3QoKTsKKyAgICAgIHNjYWxlID0gU2NhbGFyKDEpL2ludlNjYWxlOworICAgIH0KKyAgICBlbHNlIGlmKG1heENvZWZmPk51bVRyYWl0czxTY2FsYXI+OjpoaWdoZXN0KCkpIC8vIHdlIGdvdCBhIElORgorICAgIHsKKyAgICAgIGludlNjYWxlID0gU2NhbGFyKDEpOworICAgICAgc2NhbGUgPSBtYXhDb2VmZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNjYWxlID0gbWF4Q29lZmY7CisgICAgICBpbnZTY2FsZSA9IHRtcDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihtYXhDb2VmZiE9bWF4Q29lZmYpIC8vIHdlIGdvdCBhIE5hTgorICB7CisgICAgc2NhbGUgPSBtYXhDb2VmZjsKKyAgfQorICAKKyAgLy8gVE9ETyBpZiB0aGUgbWF4Q29lZmYgaXMgbXVjaCBtdWNoIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzY2FsZSwKKyAgLy8gdGhlbiB3ZSBjYW4gbmVnbGVjdCB0aGlzIHN1YiB2ZWN0b3IKKyAgaWYoc2NhbGU+U2NhbGFyKDApKSAvLyBpZiBzY2FsZT09MCwgdGhlbiBibCBpcyAwIAorICAgIHNzcSArPSAoYmwqaW52U2NhbGUpLnNxdWFyZWROb3JtKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorYmx1ZU5vcm1faW1wbChjb25zdCBFaWdlbkJhc2U8RGVyaXZlZD4mIF92ZWMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyAgCisgIHVzaW5nIHN0ZDo6cG93OworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICBjb25zdCBEZXJpdmVkJiB2ZWMoX3ZlYy5kZXJpdmVkKCkpOworICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICBzdGF0aWMgUmVhbFNjYWxhciBiMSwgYjIsIHMxbSwgczJtLCByYmlnLCByZWxlcnI7CisgIGlmKCFpbml0aWFsaXplZCkKKyAgeworICAgIGludCBpYmV0YSwgaXQsIGllbWluLCBpZW1heCwgaWV4cDsKKyAgICBSZWFsU2NhbGFyIGVwczsKKyAgICAvLyBUaGlzIHByb2dyYW0gY2FsY3VsYXRlcyB0aGUgbWFjaGluZS1kZXBlbmRlbnQgY29uc3RhbnRzCisgICAgLy8gYmwsIGIyLCBzbG0sIHMybSwgcmVsZXJyIG92ZXJmbAorICAgIC8vIGZyb20gdGhlICJiYXNpYyIgbWFjaGluZS1kZXBlbmRlbnQgbnVtYmVycworICAgIC8vIG5iaWcsIGliZXRhLCBpdCwgaWVtaW4sIGllbWF4LCByYmlnLgorICAgIC8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBiYXNpYyBtYWNoaW5lLWRlcGVuZGVudCBjb25zdGFudHMuCisgICAgLy8gRm9yIHBvcnRhYmlsaXR5LCB0aGUgUE9SVCBzdWJwcm9ncmFtcyAiaWxtYWVoIiBhbmQgInJsbWFjaCIKKyAgICAvLyBhcmUgdXNlZC4gRm9yIGFueSBzcGVjaWZpYyBjb21wdXRlciwgZWFjaCBvZiB0aGUgYXNzaWdubWVudAorICAgIC8vIHN0YXRlbWVudHMgY2FuIGJlIHJlcGxhY2VkCisgICAgaWJldGEgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpyYWRpeDsgICAgICAgICAgICAgICAgIC8vIGJhc2UgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMKKyAgICBpdCAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czsgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhc2UtYmV0YSBkaWdpdHMgaW4gbWFudGlzc2EKKyAgICBpZW1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbl9leHBvbmVudDsgICAgICAgICAgLy8gbWluaW11bSBleHBvbmVudAorICAgIGllbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4X2V4cG9uZW50OyAgICAgICAgICAvLyBtYXhpbXVtIGV4cG9uZW50CisgICAgcmJpZyAgPSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4KSgpOyAgICAgICAgICAgICAgIC8vIGxhcmdlc3QgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisKKyAgICBpZXhwICA9IC0oKDEtaWVtaW4pLzIpOworICAgIGIxICAgID0gUmVhbFNjYWxhcihwb3coUmVhbFNjYWxhcihpYmV0YSksUmVhbFNjYWxhcihpZXhwKSkpOyAgICAvLyBsb3dlciBib3VuZGFyeSBvZiBtaWRyYW5nZQorICAgIGlleHAgID0gKGllbWF4ICsgMSAtIGl0KS8yOworICAgIGIyICAgID0gUmVhbFNjYWxhcihwb3coUmVhbFNjYWxhcihpYmV0YSksUmVhbFNjYWxhcihpZXhwKSkpOyAgICAvLyB1cHBlciBib3VuZGFyeSBvZiBtaWRyYW5nZQorCisgICAgaWV4cCAgPSAoMi1pZW1pbikvMjsKKyAgICBzMW0gICA9IFJlYWxTY2FsYXIocG93KFJlYWxTY2FsYXIoaWJldGEpLFJlYWxTY2FsYXIoaWV4cCkpKTsgICAgLy8gc2NhbGluZyBmYWN0b3IgZm9yIGxvd2VyIHJhbmdlCisgICAgaWV4cCAgPSAtICgoaWVtYXgraXQpLzIpOworICAgIHMybSAgID0gUmVhbFNjYWxhcihwb3coUmVhbFNjYWxhcihpYmV0YSksUmVhbFNjYWxhcihpZXhwKSkpOyAgICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgdXBwZXIgcmFuZ2UKKworICAgIGVwcyAgICAgPSBSZWFsU2NhbGFyKHBvdyhkb3VibGUoaWJldGEpLCAxLWl0KSk7CisgICAgcmVsZXJyICA9IHNxcnQoZXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbGVyYW5jZSBmb3IgbmVnbGVjdGluZyBhc21sCisgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisgIEluZGV4IG4gPSB2ZWMuc2l6ZSgpOworICBSZWFsU2NhbGFyIGFiMiA9IGIyIC8gUmVhbFNjYWxhcihuKTsKKyAgUmVhbFNjYWxhciBhc21sID0gUmVhbFNjYWxhcigwKTsKKyAgUmVhbFNjYWxhciBhbWVkID0gUmVhbFNjYWxhcigwKTsKKyAgUmVhbFNjYWxhciBhYmlnID0gUmVhbFNjYWxhcigwKTsKKyAgZm9yKHR5cGVuYW1lIERlcml2ZWQ6OklubmVySXRlcmF0b3IgaXQodmVjLCAwKTsgaXQ7ICsraXQpCisgIHsKKyAgICBSZWFsU2NhbGFyIGF4ID0gYWJzKGl0LnZhbHVlKCkpOworICAgIGlmKGF4ID4gYWIyKSAgICAgYWJpZyArPSBudW1leHQ6OmFiczIoYXgqczJtKTsKKyAgICBlbHNlIGlmKGF4IDwgYjEpIGFzbWwgKz0gbnVtZXh0OjphYnMyKGF4KnMxbSk7CisgICAgZWxzZSAgICAgICAgICAgICBhbWVkICs9IG51bWV4dDo6YWJzMihheCk7CisgIH0KKyAgaWYoYW1lZCE9YW1lZCkKKyAgICByZXR1cm4gYW1lZDsgIC8vIHdlIGdvdCBhIE5hTgorICBpZihhYmlnID4gUmVhbFNjYWxhcigwKSkKKyAgeworICAgIGFiaWcgPSBzcXJ0KGFiaWcpOworICAgIGlmKGFiaWcgPiByYmlnKSAvLyBvdmVyZmxvdywgb3IgKnRoaXMgY29udGFpbnMgSU5GIHZhbHVlcworICAgICAgcmV0dXJuIGFiaWc7ICAvLyByZXR1cm4gSU5GCisgICAgaWYoYW1lZCA+IFJlYWxTY2FsYXIoMCkpCisgICAgeworICAgICAgYWJpZyA9IGFiaWcvczJtOworICAgICAgYW1lZCA9IHNxcnQoYW1lZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBhYmlnL3MybTsKKyAgfQorICBlbHNlIGlmKGFzbWwgPiBSZWFsU2NhbGFyKDApKQorICB7CisgICAgaWYgKGFtZWQgPiBSZWFsU2NhbGFyKDApKQorICAgIHsKKyAgICAgIGFiaWcgPSBzcXJ0KGFtZWQpOworICAgICAgYW1lZCA9IHNxcnQoYXNtbCkgLyBzMW07CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBzcXJ0KGFzbWwpL3MxbTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHNxcnQoYW1lZCk7CisgIGFzbWwgPSBudW1leHQ6Om1pbmkoYWJpZywgYW1lZCk7CisgIGFiaWcgPSBudW1leHQ6Om1heGkoYWJpZywgYW1lZCk7CisgIGlmKGFzbWwgPD0gYWJpZypyZWxlcnIpCisgICAgcmV0dXJuIGFiaWc7CisgIGVsc2UKKyAgICByZXR1cm4gYWJpZyAqIHNxcnQoUmVhbFNjYWxhcigxKSArIG51bWV4dDo6YWJzMihhc21sL2FiaWcpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyB0aGUgXGVtIGwyIG5vcm0gb2YgXGMgKnRoaXMgYXZvaWRpbmcgdW5kZXJmbG93IGFuZCBvdmVyZmxvdy4KKyAgKiBUaGlzIHZlcnNpb24gdXNlIGEgYmxvY2t3aXNlIHR3byBwYXNzZXMgYWxnb3JpdGhtOgorICAqICAxIC0gZmluZCB0aGUgYWJzb2x1dGUgbGFyZ2VzdCBjb2VmZmljaWVudCBcYyBzCisgICogIDIgLSBjb21wdXRlIFxmJCBzIFxWZXJ0IFxmcmFjeyp0aGlzfXtzfSBcVmVydCBcZiQgaW4gYSBzdGFuZGFyZCB3YXkKKyAgKgorICAqIEZvciBhcmNoaXRlY3R1cmUvc2NhbGFyIHR5cGVzIHN1cHBvcnRpbmcgdmVjdG9yaXphdGlvbiwgdGhpcyB2ZXJzaW9uCisgICogaXMgZmFzdGVyIHRoYW4gYmx1ZU5vcm0oKS4gT3RoZXJ3aXNlIHRoZSBibHVlTm9ybSgpIGlzIG11Y2ggZmFzdGVyLgorICAqCisgICogXHNhIG5vcm0oKSwgYmx1ZU5vcm0oKSwgaHlwb3ROb3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwKK01hdHJpeEJhc2U8RGVyaXZlZD46OnN0YWJsZU5vcm0oKSBjb25zdAoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICBjb25zdCBJbmRleCBibG9ja1NpemUgPSA0MDk2OworICBSZWFsU2NhbGFyIHNjYWxlKDApOworICBSZWFsU2NhbGFyIGludlNjYWxlKDEpOworICBSZWFsU2NhbGFyIHNzcSgwKTsgLy8gc3VtIG9mIHNxdWFyZQorICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwyPjo6dHlwZSBEZXJpdmVkQ29weTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJpdmVkQ29weT46OnR5cGUgRGVyaXZlZENvcHlDbGVhbjsKKyAgRGVyaXZlZENvcHkgY29weShkZXJpdmVkKCkpOworICAKKyAgZW51bSB7CisgICAgQ2FuQWxpZ24gPSAoICAgKGludChEZXJpdmVkQ29weUNsZWFuOjpGbGFncykmRGlyZWN0QWNjZXNzQml0KQorICAgICAgICAgICAgICAgIHx8IChpbnQoaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkQ29weUNsZWFuPjo6QWxpZ25tZW50KT4wKSAvLyBGSVhNRSBBbGlnbm1lbnQpPjAgbWlnaHQgbm90IGJlIGVub3VnaAorICAgICAgICAgICAgICAgKSAmJiAoYmxvY2tTaXplKnNpemVvZihTY2FsYXIpKjI8RUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCkKKyAgICAgICAgICAgICAgICAgJiYgKEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM+MCkgLy8gaWYgd2UgY2Fubm90IGFsbG9jYXRlIG9uIHRoZSBzdGFjaywgdGhlbiBsZXQncyBub3QgYm90aGVyIGFib3V0IHRoaXMgb3B0aW1pemF0aW9uCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPENhbkFsaWduLCBSZWY8Y29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDEsMCxibG9ja1NpemUsMT4sIGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZENvcHlDbGVhbj46OkFsaWdubWVudD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBEZXJpdmVkQ29weUNsZWFuOjpDb25zdFNlZ21lbnRSZXR1cm5UeXBlPjo6dHlwZSBTZWdtZW50V3JhcHBlcjsKKyAgSW5kZXggbiA9IHNpemUoKTsKKyAgCisgIGlmKG49PTEpCisgICAgcmV0dXJuIGFicyh0aGlzLT5jb2VmZigwKSk7CisgIAorICBJbmRleCBiaSA9IGludGVybmFsOjpmaXJzdF9kZWZhdWx0X2FsaWduZWQoY29weSk7CisgIGlmIChiaT4wKQorICAgIGludGVybmFsOjpzdGFibGVfbm9ybV9rZXJuZWwoY29weS5oZWFkKGJpKSwgc3NxLCBzY2FsZSwgaW52U2NhbGUpOworICBmb3IgKDsgYmk8bjsgYmkrPWJsb2NrU2l6ZSkKKyAgICBpbnRlcm5hbDo6c3RhYmxlX25vcm1fa2VybmVsKFNlZ21lbnRXcmFwcGVyKGNvcHkuc2VnbWVudChiaSxudW1leHQ6Om1pbmkoYmxvY2tTaXplLCBuIC0gYmkpKSksIHNzcSwgc2NhbGUsIGludlNjYWxlKTsKKyAgcmV0dXJuIHNjYWxlICogc3FydChzc3EpOworfQorCisvKiogXHJldHVybnMgdGhlIFxlbSBsMiBub3JtIG9mIFxjICp0aGlzIHVzaW5nIHRoZSBCbHVlJ3MgYWxnb3JpdGhtLgorICAqIEEgUG9ydGFibGUgRm9ydHJhbiBQcm9ncmFtIHRvIEZpbmQgdGhlIEV1Y2xpZGVhbiBOb3JtIG9mIGEgVmVjdG9yLAorICAqIEFDTSBUT01TLCBWb2wgNCwgSXNzdWUgMSwgMTk3OC4KKyAgKgorICAqIEZvciBhcmNoaXRlY3R1cmUvc2NhbGFyIHR5cGVzIHdpdGhvdXQgdmVjdG9yaXphdGlvbiwgdGhpcyB2ZXJzaW9uCisgICogaXMgbXVjaCBmYXN0ZXIgdGhhbiBzdGFibGVOb3JtKCkuIE90aGVyd2lzZSB0aGUgc3RhYmxlTm9ybSgpIGlzIGZhc3Rlci4KKyAgKgorICAqIFxzYSBub3JtKCksIHN0YWJsZU5vcm0oKSwgaHlwb3ROb3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwKK01hdHJpeEJhc2U8RGVyaXZlZD46OmJsdWVOb3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjpibHVlTm9ybV9pbXBsKCp0aGlzKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBcZW0gbDIgbm9ybSBvZiBcYyAqdGhpcyBhdm9pZGluZyB1bmRlZmxvdyBhbmQgb3ZlcmZsb3cuCisgICogVGhpcyB2ZXJzaW9uIHVzZSBhIGNvbmNhdGVuYXRpb24gb2YgaHlwb3QoKSBjYWxscywgYW5kIGl0IGlzIHZlcnkgc2xvdy4KKyAgKgorICAqIFxzYSBub3JtKCksIHN0YWJsZU5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorTWF0cml4QmFzZTxEZXJpdmVkPjo6aHlwb3ROb3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIHRoaXMtPmN3aXNlQWJzKCkucmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9oeXBvdF9vcDxSZWFsU2NhbGFyPigpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TVEFCTEVOT1JNX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1N0cmlkZS5oIGIvRWlnZW4vc3JjL0NvcmUvU3RyaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNzQyZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1N0cmlkZS5oCkBAIC0wLDAgKzEsMTExIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RSSURFX0gKKyNkZWZpbmUgRUlHRU5fU1RSSURFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgU3RyaWRlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBIb2xkcyBzdHJpZGVzIGluZm9ybWF0aW9uIGZvciBNYXAKKyAgKgorICAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHN0cmlkZXMgaW5mb3JtYXRpb24gZm9yIG1hcHBpbmcgYXJyYXlzIHdpdGggc3RyaWRlcyB3aXRoIGNsYXNzIE1hcC4KKyAgKgorICAqIEl0IGhvbGRzIHR3byB2YWx1ZXM6IHRoZSBpbm5lciBzdHJpZGUgYW5kIHRoZSBvdXRlciBzdHJpZGUuCisgICoKKyAgKiBUaGUgaW5uZXIgc3RyaWRlIGlzIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBlbnRyaWVzIHdpdGhpbiBhIGdpdmVuIHJvdyBvZiBhCisgICogcm93LW1ham9yIG1hdHJpeCBvciB3aXRoaW4gYSBnaXZlbiBjb2x1bW4gb2YgYSBjb2x1bW4tbWFqb3IgbWF0cml4LgorICAqCisgICogVGhlIG91dGVyIHN0cmlkZSBpcyB0aGUgcG9pbnRlciBpbmNyZW1lbnQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgcm93cyBvZiBhIHJvdy1tYWpvciBtYXRyaXggb3IKKyAgKiBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zIG9mIGEgY29sdW1uLW1ham9yIG1hdHJpeC4KKyAgKgorICAqIFRoZXNlIHR3byB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBlaXRoZXIgYXQgY29tcGlsZS10aW1lIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMsIG9yIGF0IHJ1bnRpbWUgYXMKKyAgKiBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAqCisgICogSW5kZWVkLCB0aGlzIGNsYXNzIHRha2VzIHR3byB0ZW1wbGF0ZSBwYXJhbWV0ZXJzOgorICAqICBcdHBhcmFtIF9PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgdGhlIG91dGVyIHN0cmlkZSwgb3IgRHluYW1pYyBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGl0IGF0IHJ1bnRpbWUuCisgICogIFx0cGFyYW0gX0lubmVyU3RyaWRlQXRDb21waWxlVGltZSB0aGUgaW5uZXIgc3RyaWRlLCBvciBEeW5hbWljIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgaXQgYXQgcnVudGltZS4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgKiBcaW5jbHVkZSBNYXBfZ2VuZXJhbF9zdHJpZGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWFwX2dlbmVyYWxfc3RyaWRlLm91dAorICAqCisgICogXHNhIGNsYXNzIElubmVyU3RyaWRlLCBjbGFzcyBPdXRlclN0cmlkZSwgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMKKyAgKi8KK3RlbXBsYXRlPGludCBfT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBpbnQgX0lubmVyU3RyaWRlQXRDb21waWxlVGltZT4KK2NsYXNzIFN0cmlkZQoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisgICAgZW51bSB7CisgICAgICBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPSBfSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLAorICAgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gX091dGVyU3RyaWRlQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciwgZm9yIHVzZSB3aGVuIHN0cmlkZXMgYXJlIGZpeGVkIGF0IGNvbXBpbGUgdGltZSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU3RyaWRlKCkKKyAgICAgIDogbV9vdXRlcihPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpLCBtX2lubmVyKElubmVyU3RyaWRlQXRDb21waWxlVGltZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RvciBhbGxvd2luZyB0byBwYXNzIHRoZSBzdHJpZGVzIGF0IHJ1bnRpbWUgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFN0cmlkZShJbmRleCBvdXRlclN0cmlkZSwgSW5kZXggaW5uZXJTdHJpZGUpCisgICAgICA6IG1fb3V0ZXIob3V0ZXJTdHJpZGUpLCBtX2lubmVyKGlubmVyU3RyaWRlKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbm5lclN0cmlkZT49MCAmJiBvdXRlclN0cmlkZT49MCk7CisgICAgfQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFN0cmlkZShjb25zdCBTdHJpZGUmIG90aGVyKQorICAgICAgOiBtX291dGVyKG90aGVyLm91dGVyKCkpLCBtX2lubmVyKG90aGVyLmlubmVyKCkpCisgICAge30KKworICAgIC8qKiBccmV0dXJucyB0aGUgb3V0ZXIgc3RyaWRlICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggb3V0ZXIoKSBjb25zdCB7IHJldHVybiBtX291dGVyLnZhbHVlKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIGlubmVyIHN0cmlkZSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGlubmVyKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lci52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWU+IG1fb3V0ZXI7CisgICAgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIElubmVyU3RyaWRlQXRDb21waWxlVGltZT4gbV9pbm5lcjsKK307CisKKy8qKiBcYnJpZWYgQ29udmVuaWVuY2Ugc3BlY2lhbGl6YXRpb24gb2YgU3RyaWRlIHRvIHNwZWNpZnkgb25seSBhbiBpbm5lciBzdHJpZGUKKyAgKiBTZWUgY2xhc3MgTWFwIGZvciBzb21lIGV4YW1wbGVzICovCit0ZW1wbGF0ZTxpbnQgVmFsdWU+CitjbGFzcyBJbm5lclN0cmlkZSA6IHB1YmxpYyBTdHJpZGU8MCwgVmFsdWU+Cit7CisgICAgdHlwZWRlZiBTdHJpZGU8MCwgVmFsdWU+IEJhc2U7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBJbm5lclN0cmlkZSgpIDogQmFzZSgpIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgSW5uZXJTdHJpZGUoSW5kZXggdikgOiBCYXNlKDAsIHYpIHt9IC8vIEZJWE1FIG1ha2luZyB0aGlzIGV4cGxpY2l0IGNvdWxkIGJyZWFrIHZhbGlkIGNvZGUKK307CisKKy8qKiBcYnJpZWYgQ29udmVuaWVuY2Ugc3BlY2lhbGl6YXRpb24gb2YgU3RyaWRlIHRvIHNwZWNpZnkgb25seSBhbiBvdXRlciBzdHJpZGUKKyAgKiBTZWUgY2xhc3MgTWFwIGZvciBzb21lIGV4YW1wbGVzICovCit0ZW1wbGF0ZTxpbnQgVmFsdWU+CitjbGFzcyBPdXRlclN0cmlkZSA6IHB1YmxpYyBTdHJpZGU8VmFsdWUsIDA+Cit7CisgICAgdHlwZWRlZiBTdHJpZGU8VmFsdWUsIDA+IEJhc2U7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBPdXRlclN0cmlkZSgpIDogQmFzZSgpIHt9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgT3V0ZXJTdHJpZGUoSW5kZXggdikgOiBCYXNlKHYsMCkge30gLy8gRklYTUUgbWFraW5nIHRoaXMgZXhwbGljaXQgY291bGQgYnJlYWsgdmFsaWQgY29kZQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TVFJJREVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvU3dhcC5oIGIvRWlnZW4vc3JjL0NvcmUvU3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDIwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Td2FwLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1dBUF9ICisjZGVmaW5lIEVJR0VOX1NXQVBfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gT3ZlcmxvYWQgZGVmYXVsdCBhc3NpZ25QYWNrZXQgYmVoYXZpb3IgZm9yIHN3YXBwaW5nIHRoZW0KK3RlbXBsYXRlPHR5cGVuYW1lIERzdEV2YWx1YXRvclR5cGVULCB0eXBlbmFtZSBTcmNFdmFsdWF0b3JUeXBlVD4KK2NsYXNzIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBzd2FwX2Fzc2lnbl9vcDx0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlVDo6U2NhbGFyPiwgU3BlY2lhbGl6ZWQ+CisgOiBwdWJsaWMgZ2VuZXJpY19kZW5zZV9hc3NpZ25tZW50X2tlcm5lbDxEc3RFdmFsdWF0b3JUeXBlVCwgU3JjRXZhbHVhdG9yVHlwZVQsIHN3YXBfYXNzaWduX29wPHR5cGVuYW1lIERzdEV2YWx1YXRvclR5cGVUOjpTY2FsYXI+LCBCdWlsdEluPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBzd2FwX2Fzc2lnbl9vcDx0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlVDo6U2NhbGFyPiwgQnVpbHRJbj4gQmFzZTsKKyAgdXNpbmcgQmFzZTo6bV9kc3Q7CisgIHVzaW5nIEJhc2U6Om1fc3JjOworICB1c2luZyBCYXNlOjptX2Z1bmN0b3I7CisgIAorcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6RHN0WHByVHlwZSBEc3RYcHJUeXBlOworICB0eXBlZGVmIHN3YXBfYXNzaWduX29wPFNjYWxhcj4gRnVuY3RvcjsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWwoRHN0RXZhbHVhdG9yVHlwZVQgJmRzdCwgY29uc3QgU3JjRXZhbHVhdG9yVHlwZVQgJnNyYywgY29uc3QgRnVuY3RvciAmZnVuYywgRHN0WHByVHlwZSYgZHN0RXhwcikKKyAgICA6IEJhc2UoZHN0LCBzcmMsIGZ1bmMsIGRzdEV4cHIpCisgIHt9CisgIAorICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIHZvaWQgYXNzaWduUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKQorICB7CisgICAgUGFja2V0VHlwZSB0bXAgPSBtX3NyYy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGUsUGFja2V0VHlwZT4ocm93LGNvbCk7CisgICAgY29uc3RfY2FzdDxTcmNFdmFsdWF0b3JUeXBlVCY+KG1fc3JjKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxMb2FkTW9kZT4ocm93LGNvbCwgbV9kc3QudGVtcGxhdGUgcGFja2V0PFN0b3JlTW9kZSxQYWNrZXRUeXBlPihyb3csY29sKSk7CisgICAgbV9kc3QudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihyb3csY29sLHRtcCk7CisgIH0KKyAgCisgIHRlbXBsYXRlPGludCBTdG9yZU1vZGUsIGludCBMb2FkTW9kZSwgdHlwZW5hbWUgUGFja2V0VHlwZT4KKyAgdm9pZCBhc3NpZ25QYWNrZXQoSW5kZXggaW5kZXgpCisgIHsKKyAgICBQYWNrZXRUeXBlIHRtcCA9IG1fc3JjLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZSxQYWNrZXRUeXBlPihpbmRleCk7CisgICAgY29uc3RfY2FzdDxTcmNFdmFsdWF0b3JUeXBlVCY+KG1fc3JjKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxMb2FkTW9kZT4oaW5kZXgsIG1fZHN0LnRlbXBsYXRlIHBhY2tldDxTdG9yZU1vZGUsUGFja2V0VHlwZT4oaW5kZXgpKTsKKyAgICBtX2RzdC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LHRtcCk7CisgIH0KKyAgCisgIC8vIFRPRE8gZmluZCBhIHNpbXBsZSB3YXkgbm90IHRvIGhhdmUgdG8gY29weS9wYXN0ZSB0aGlzIGZ1bmN0aW9uIGZyb20gZ2VuZXJpY19kZW5zZV9hc3NpZ25tZW50X2tlcm5lbCwgYnkgc2ltcGxlIEkgbWVhbiBubyBDUlRQIChHYWVsKQorICB0ZW1wbGF0ZTxpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGUsIHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIHZvaWQgYXNzaWduUGFja2V0QnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikKKyAgeworICAgIEluZGV4IHJvdyA9IEJhc2U6OnJvd0luZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lcik7IAorICAgIEluZGV4IGNvbCA9IEJhc2U6OmNvbEluZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lcik7CisgICAgYXNzaWduUGFja2V0PFN0b3JlTW9kZSxMb2FkTW9kZSxQYWNrZXRUeXBlPihyb3csIGNvbCk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1dBUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9UcmFuc3Bvc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Yjc2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9UcmFuc3Bvc2UuaApAQCAtMCwwICsxLDQwMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUkFOU1BPU0VfSAorI2RlZmluZSBFSUdFTl9UUkFOU1BPU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zZTxNYXRyaXhUeXBlPiA+IDogcHVibGljIHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlZl9zZWxlY3RvcjxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZFBsYWluOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzTHZhbHVlQml0ID0gaXNfbHZhbHVlPE1hdHJpeFR5cGU+Ojp2YWx1ZSA/IEx2YWx1ZUJpdCA6IDAsCisgICAgRmxhZ3MwID0gdHJhaXRzPE1hdHJpeFR5cGVOZXN0ZWRQbGFpbj46OkZsYWdzICYgfihMdmFsdWVCaXQgfCBOZXN0QnlSZWZCaXQpLAorICAgIEZsYWdzMSA9IEZsYWdzMCB8IEZsYWdzTHZhbHVlQml0LAorICAgIEZsYWdzID0gRmxhZ3MxIF4gUm93TWFqb3JCaXQsCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxNYXRyaXhUeXBlPjo6cmV0LAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8TWF0cml4VHlwZT46OnJldAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+IGNsYXNzIFRyYW5zcG9zZUltcGw7CisKKy8qKiBcY2xhc3MgVHJhbnNwb3NlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIHRoZSB0cmFuc3Bvc2Ugb2YgYSBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9mIHdoaWNoIHdlIGFyZSB0YWtpbmcgdGhlIHRyYW5zcG9zZQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zcG9zZSBvZiBhIG1hdHJpeC4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6dHJhbnNwb3NlKCkgYW5kIE1hdHJpeEJhc2U6OmFkam9pbnQoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6dHJhbnNwb3NlKCksIE1hdHJpeEJhc2U6OmFkam9pbnQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgVHJhbnNwb3NlCisgIDogcHVibGljIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZD4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojpub25fY29uc3RfdHlwZSBNYXRyaXhUeXBlTmVzdGVkOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQ+OjpCYXNlIEJhc2U7CisgICAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKFRyYW5zcG9zZSkKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE1hdHJpeFR5cGU+Ojp0eXBlIE5lc3RlZEV4cHJlc3Npb247CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBUcmFuc3Bvc2UoTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkge30KKworICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoVHJhbnNwb3NlKQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUmCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSYKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB2b2lkIHJlc2l6ZShJbmRleCBucm93cywgSW5kZXggbmNvbHMpIHsKKyAgICAgIG1fbWF0cml4LnJlc2l6ZShuY29scyxucm93cyk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojpub25fY29uc3RfdHlwZSBtX21hdHJpeDsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSGFzRGlyZWN0QWNjZXNzID0gaGFzX2RpcmVjdF9hY2Nlc3M8TWF0cml4VHlwZT46OnJldD4KK3N0cnVjdCBUcmFuc3Bvc2VJbXBsX2Jhc2UKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBkZW5zZV94cHJfYmFzZTxUcmFuc3Bvc2U8TWF0cml4VHlwZT4gPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBUcmFuc3Bvc2VJbXBsX2Jhc2U8TWF0cml4VHlwZSwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgZGVuc2VfeHByX2Jhc2U8VHJhbnNwb3NlPE1hdHJpeFR5cGU+ID46OnR5cGUgdHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBHZW5lcmljIEFQSSBkaXNwYXRjaGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0eXBlbmFtZSBTdG9yYWdlS2luZD4KK2NsYXNzIFRyYW5zcG9zZUltcGwKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8VHJhbnNwb3NlPFhwclR5cGU+ID46OnR5cGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxUcmFuc3Bvc2U8WHByVHlwZT4gPjo6dHlwZSBCYXNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgVHJhbnNwb3NlSW1wbDxNYXRyaXhUeXBlLERlbnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6VHJhbnNwb3NlSW1wbF9iYXNlPE1hdHJpeFR5cGU+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlRyYW5zcG9zZUltcGxfYmFzZTxNYXRyaXhUeXBlPjo6dHlwZSBCYXNlOworICAgIHVzaW5nIEJhc2U6OmNvZWZmUmVmOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoVHJhbnNwb3NlPE1hdHJpeFR5cGU+KQorICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoVHJhbnNwb3NlSW1wbCkKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5uZXJTdHJpZGUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkub3V0ZXJTdHJpZGUoKTsgfQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjppc19sdmFsdWU8TWF0cml4VHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSogZGF0YSgpIHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuZGF0YSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuZGF0YSgpOyB9CisKKyAgICAvLyBGSVhNRTogc2hhbGwgd2Uga2VlcCB0aGUgY29uc3QgdmVyc2lvbiBvZiBjb2VmZlJlZj8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvd0lkLCBJbmRleCBjb2xJZCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5jb2VmZlJlZihjb2xJZCwgcm93SWQpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSB0cmFuc3Bvc2Ugb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RyYW5zcG9zZS5vdXQKKyAgKgorICAqIFx3YXJuaW5nIElmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSBtYXRyaXggYnkgaXRzIG93biB0cmFuc3Bvc2UsIGRvIFxiIE5PVCBkbyB0aGlzOgorICAqIFxjb2RlCisgICogbSA9IG0udHJhbnNwb3NlKCk7IC8vIGJ1ZyEhISBjYXVzZWQgYnkgYWxpYXNpbmcgZWZmZWN0CisgICogXGVuZGNvZGUKKyAgKiBJbnN0ZWFkLCB1c2UgdGhlIHRyYW5zcG9zZUluUGxhY2UoKSBtZXRob2Q6CisgICogXGNvZGUKKyAgKiBtLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgKiBcZW5kY29kZQorICAqIHdoaWNoIGdpdmVzIEVpZ2VuIGdvb2Qgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLCBvciBhbHRlcm5hdGl2ZWx5IHlvdSBjYW4gYWxzbyBkbzoKKyAgKiBcY29kZQorICAqIG0gPSBtLnRyYW5zcG9zZSgpLmV2YWwoKTsKKyAgKiBcZW5kY29kZQorICAqCisgICogXHNhIHRyYW5zcG9zZUluUGxhY2UoKSwgYWRqb2ludCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIFRyYW5zcG9zZTxEZXJpdmVkPgorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0cmFuc3Bvc2UoKQoreworICByZXR1cm4gVHJhbnNwb3NlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0cmFuc3Bvc2UoKS4KKyAgKgorICAqIE1ha2Ugc3VyZSB5b3UgcmVhZCB0aGUgd2FybmluZyBmb3IgdHJhbnNwb3NlKCkgIQorICAqCisgICogXHNhIHRyYW5zcG9zZUluUGxhY2UoKSwgYWRqb2ludCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OnRyYW5zcG9zZSgpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGFkam9pbnQgKGkuZS4gY29uanVnYXRlIHRyYW5zcG9zZSkgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2Fkam9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9hZGpvaW50Lm91dAorICAqCisgICogXHdhcm5pbmcgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhIG1hdHJpeCBieSBpdHMgb3duIGFkam9pbnQsIGRvIFxiIE5PVCBkbyB0aGlzOgorICAqIFxjb2RlCisgICogbSA9IG0uYWRqb2ludCgpOyAvLyBidWchISEgY2F1c2VkIGJ5IGFsaWFzaW5nIGVmZmVjdAorICAqIFxlbmRjb2RlCisgICogSW5zdGVhZCwgdXNlIHRoZSBhZGpvaW50SW5QbGFjZSgpIG1ldGhvZDoKKyAgKiBcY29kZQorICAqIG0uYWRqb2ludEluUGxhY2UoKTsKKyAgKiBcZW5kY29kZQorICAqIHdoaWNoIGdpdmVzIEVpZ2VuIGdvb2Qgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLCBvciBhbHRlcm5hdGl2ZWx5IHlvdSBjYW4gYWxzbyBkbzoKKyAgKiBcY29kZQorICAqIG0gPSBtLmFkam9pbnQoKS5ldmFsKCk7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxzYSBhZGpvaW50SW5QbGFjZSgpLCB0cmFuc3Bvc2UoKSwgY29uanVnYXRlKCksIGNsYXNzIFRyYW5zcG9zZSwgY2xhc3MgaW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3AgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6QWRqb2ludFJldHVyblR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OmFkam9pbnQoKSBjb25zdAoreworICByZXR1cm4gQWRqb2ludFJldHVyblR5cGUodGhpcy0+dHJhbnNwb3NlKCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICJpbiBwbGFjZSIgdHJhbnNwb3NlIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgIGJvb2wgSXNTcXVhcmUgPSAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpICYmIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIT1EeW5hbWljLAorICBib29sIE1hdGNoUGFja2V0U2l6ZSA9CisgICAgICAgIChpbnQoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpID09IGludChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpzaXplKSkKKyAgICAmJiAgKGludGVybmFsOjpldmFsdWF0b3I8TWF0cml4VHlwZT46OkZsYWdzJlBhY2tldEFjY2Vzc0JpdCkgPgorc3RydWN0IGlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IGlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yPE1hdHJpeFR5cGUsdHJ1ZSxmYWxzZT4geyAvLyBzcXVhcmUgbWF0cml4CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtKSB7CisgICAgbS5tYXRyaXgoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnN3YXAobS5tYXRyaXgoKS50cmFuc3Bvc2UoKSk7CisgIH0KK307CisKKy8vIFRPRE86IHZlY3Rvcml6ZWQgcGF0aCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byBMYXJnZXN0UGFja2V0U2l6ZSB4IExhcmdlc3RQYWNrZXRTaXplIGNhc2VzIG9ubHkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IGlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yPE1hdHJpeFR5cGUsdHJ1ZSx0cnVlPiB7IC8vIFBhY2tldFNpemUgeCBQYWNrZXRTaXplCisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgICAgY29uc3QgSW5kZXggUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgICAgY29uc3QgSW5kZXggQWxpZ25tZW50ID0gaW50ZXJuYWw6OmV2YWx1YXRvcjxNYXRyaXhUeXBlPjo6QWxpZ25tZW50OworICAgIFBhY2tldEJsb2NrPFBhY2tldD4gQTsKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICBBLnBhY2tldFtpXSA9IG0udGVtcGxhdGUgcGFja2V0QnlPdXRlcklubmVyPEFsaWdubWVudD4oaSwwKTsKKyAgICBpbnRlcm5hbDo6cHRyYW5zcG9zZShBKTsKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICBtLnRlbXBsYXRlIHdyaXRlUGFja2V0PEFsaWdubWVudD4obS5yb3dJbmRleEJ5T3V0ZXJJbm5lcihpLDApLCBtLmNvbEluZGV4QnlPdXRlcklubmVyKGksMCksIEEucGFja2V0W2ldKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSxib29sIE1hdGNoUGFja2V0U2l6ZT4KK3N0cnVjdCBpbnBsYWNlX3RyYW5zcG9zZV9zZWxlY3RvcjxNYXRyaXhUeXBlLGZhbHNlLE1hdGNoUGFja2V0U2l6ZT4geyAvLyBub24gc3F1YXJlIG1hdHJpeAorICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbSkgeworICAgIGlmIChtLnJvd3MoKT09bS5jb2xzKCkpCisgICAgICBtLm1hdHJpeCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc3dhcChtLm1hdHJpeCgpLnRyYW5zcG9zZSgpKTsKKyAgICBlbHNlCisgICAgICBtID0gbS50cmFuc3Bvc2UoKS5ldmFsKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogVGhpcyBpcyB0aGUgImluIHBsYWNlIiB2ZXJzaW9uIG9mIHRyYW5zcG9zZSgpOiBpdCByZXBsYWNlcyBcYyAqdGhpcyBieSBpdHMgb3duIHRyYW5zcG9zZS4KKyAgKiBUaHVzLCBkb2luZworICAqIFxjb2RlCisgICogbS50cmFuc3Bvc2VJblBsYWNlKCk7CisgICogXGVuZGNvZGUKKyAgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IG9uIG0gYXMgZG9pbmcKKyAgKiBcY29kZQorICAqIG0gPSBtLnRyYW5zcG9zZSgpLmV2YWwoKTsKKyAgKiBcZW5kY29kZQorICAqIGFuZCBpcyBmYXN0ZXIgYW5kIGFsc28gc2FmZXIgYmVjYXVzZSBpbiB0aGUgbGF0dGVyIGxpbmUgb2YgY29kZSwgZm9yZ2V0dGluZyB0aGUgZXZhbCgpIHJlc3VsdHMKKyAgKiBpbiBhIGJ1ZyBjYXVzZWQgYnkgXHJlZiBUb3BpY0FsaWFzaW5nICJhbGlhc2luZyIuCisgICoKKyAgKiBOb3RpY2UgaG93ZXZlciB0aGF0IHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSBtYXRyaXggYnkgaXRzIG93biB0cmFuc3Bvc2UuCisgICogSWYgeW91IGp1c3QgbmVlZCB0aGUgdHJhbnNwb3NlIG9mIGEgbWF0cml4LCB1c2UgdHJhbnNwb3NlKCkuCisgICoKKyAgKiBcbm90ZSBpZiB0aGUgbWF0cml4IGlzIG5vdCBzcXVhcmUsIHRoZW4gXGMgKnRoaXMgbXVzdCBiZSBhIHJlc2l6YWJsZSBtYXRyaXguIAorICAqIFRoaXMgZXhjbHVkZXMgKG5vbi1zcXVhcmUpIGZpeGVkLXNpemUgbWF0cmljZXMsIGJsb2NrLWV4cHJlc3Npb25zIGFuZCBtYXBzLgorICAqCisgICogXHNhIHRyYW5zcG9zZSgpLCBhZGpvaW50KCksIGFkam9pbnRJblBsYWNlKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdm9pZCBEZW5zZUJhc2U8RGVyaXZlZD46OnRyYW5zcG9zZUluUGxhY2UoKQoreworICBlaWdlbl9hc3NlcnQoKHJvd3MoKSA9PSBjb2xzKCkgfHwgKFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgJiYgQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykpCisgICAgICAgICAgICAgICAmJiAidHJhbnNwb3NlSW5QbGFjZSgpIGNhbGxlZCBvbiBhIG5vbi1zcXVhcmUgbm9uLXJlc2l6YWJsZSBtYXRyaXgiKTsKKyAgaW50ZXJuYWw6OmlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yPERlcml2ZWQ+OjpydW4oZGVyaXZlZCgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAiaW4gcGxhY2UiIGFkam9pbnQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFRoaXMgaXMgdGhlICJpbiBwbGFjZSIgdmVyc2lvbiBvZiBhZGpvaW50KCk6IGl0IHJlcGxhY2VzIFxjICp0aGlzIGJ5IGl0cyBvd24gdHJhbnNwb3NlLgorICAqIFRodXMsIGRvaW5nCisgICogXGNvZGUKKyAgKiBtLmFkam9pbnRJblBsYWNlKCk7CisgICogXGVuZGNvZGUKKyAgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IG9uIG0gYXMgZG9pbmcKKyAgKiBcY29kZQorICAqIG0gPSBtLmFkam9pbnQoKS5ldmFsKCk7CisgICogXGVuZGNvZGUKKyAgKiBhbmQgaXMgZmFzdGVyIGFuZCBhbHNvIHNhZmVyIGJlY2F1c2UgaW4gdGhlIGxhdHRlciBsaW5lIG9mIGNvZGUsIGZvcmdldHRpbmcgdGhlIGV2YWwoKSByZXN1bHRzCisgICogaW4gYSBidWcgY2F1c2VkIGJ5IGFsaWFzaW5nLgorICAqCisgICogTm90aWNlIGhvd2V2ZXIgdGhhdCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgbWF0cml4IGJ5IGl0cyBvd24gYWRqb2ludC4KKyAgKiBJZiB5b3UganVzdCBuZWVkIHRoZSBhZGpvaW50IG9mIGEgbWF0cml4LCB1c2UgYWRqb2ludCgpLgorICAqCisgICogXG5vdGUgaWYgdGhlIG1hdHJpeCBpcyBub3Qgc3F1YXJlLCB0aGVuIFxjICp0aGlzIG11c3QgYmUgYSByZXNpemFibGUgbWF0cml4LgorICAqIFRoaXMgZXhjbHVkZXMgKG5vbi1zcXVhcmUpIGZpeGVkLXNpemUgbWF0cmljZXMsIGJsb2NrLWV4cHJlc3Npb25zIGFuZCBtYXBzLgorICAqCisgICogXHNhIHRyYW5zcG9zZSgpLCBhZGpvaW50KCksIHRyYW5zcG9zZUluUGxhY2UoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmFkam9pbnRJblBsYWNlKCkKK3sKKyAgZGVyaXZlZCgpID0gYWRqb2ludCgpLmV2YWwoKTsKK30KKworI2lmbmRlZiBFSUdFTl9OT19ERUJVRworCisvLyBUaGUgZm9sbG93aW5nIGlzIHRvIGRldGVjdCBhbGlhc2luZyBwcm9ibGVtcyBpbiBtb3N0IGNvbW1vbiBjYXNlcy4KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8Ym9vbCBEZXN0SXNUcmFuc3Bvc2VkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgY2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX2NvbXBpbGVfdGltZV9zZWxlY3RvcgoreworICBlbnVtIHsgcmV0ID0gYm9vbChibGFzX3RyYWl0czxPdGhlckRlcml2ZWQ+OjpJc1RyYW5zcG9zZWQpICE9IERlc3RJc1RyYW5zcG9zZWQgfTsKK307CisKK3RlbXBsYXRlPGJvb2wgRGVzdElzVHJhbnNwb3NlZCwgdHlwZW5hbWUgQmluT3AsIHR5cGVuYW1lIERlcml2ZWRBLCB0eXBlbmFtZSBEZXJpdmVkQj4KK3N0cnVjdCBjaGVja190cmFuc3Bvc2VfYWxpYXNpbmdfY29tcGlsZV90aW1lX3NlbGVjdG9yPERlc3RJc1RyYW5zcG9zZWQsQ3dpc2VCaW5hcnlPcDxCaW5PcCxEZXJpdmVkQSxEZXJpdmVkQj4gPgoreworICBlbnVtIHsgcmV0ID0gICAgYm9vbChibGFzX3RyYWl0czxEZXJpdmVkQT46OklzVHJhbnNwb3NlZCkgIT0gRGVzdElzVHJhbnNwb3NlZAorICAgICAgICAgICAgICAgfHwgYm9vbChibGFzX3RyYWl0czxEZXJpdmVkQj46OklzVHJhbnNwb3NlZCkgIT0gRGVzdElzVHJhbnNwb3NlZAorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIERlc3RJc1RyYW5zcG9zZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3N0cnVjdCBjaGVja190cmFuc3Bvc2VfYWxpYXNpbmdfcnVuX3RpbWVfc2VsZWN0b3IKK3sKKyAgc3RhdGljIGJvb2wgcnVuKGNvbnN0IFNjYWxhciogZGVzdCwgY29uc3QgT3RoZXJEZXJpdmVkJiBzcmMpCisgIHsKKyAgICByZXR1cm4gKGJvb2woYmxhc190cmFpdHM8T3RoZXJEZXJpdmVkPjo6SXNUcmFuc3Bvc2VkKSAhPSBEZXN0SXNUcmFuc3Bvc2VkKSAmJiAoZGVzdCE9MCAmJiBkZXN0PT0oY29uc3QgU2NhbGFyKilleHRyYWN0X2RhdGEoc3JjKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBEZXN0SXNUcmFuc3Bvc2VkLCB0eXBlbmFtZSBCaW5PcCwgdHlwZW5hbWUgRGVyaXZlZEEsIHR5cGVuYW1lIERlcml2ZWRCPgorc3RydWN0IGNoZWNrX3RyYW5zcG9zZV9hbGlhc2luZ19ydW5fdGltZV9zZWxlY3RvcjxTY2FsYXIsRGVzdElzVHJhbnNwb3NlZCxDd2lzZUJpbmFyeU9wPEJpbk9wLERlcml2ZWRBLERlcml2ZWRCPiA+Cit7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTY2FsYXIqIGRlc3QsIGNvbnN0IEN3aXNlQmluYXJ5T3A8QmluT3AsRGVyaXZlZEEsRGVyaXZlZEI+JiBzcmMpCisgIHsKKyAgICByZXR1cm4gKChibGFzX3RyYWl0czxEZXJpdmVkQT46OklzVHJhbnNwb3NlZCAhPSBEZXN0SXNUcmFuc3Bvc2VkKSAmJiAoZGVzdCE9MCAmJiBkZXN0PT0oY29uc3QgU2NhbGFyKilleHRyYWN0X2RhdGEoc3JjLmxocygpKSkpCisgICAgICAgIHx8ICgoYmxhc190cmFpdHM8RGVyaXZlZEI+OjpJc1RyYW5zcG9zZWQgIT0gRGVzdElzVHJhbnNwb3NlZCkgJiYgKGRlc3QhPTAgJiYgZGVzdD09KGNvbnN0IFNjYWxhciopZXh0cmFjdF9kYXRhKHNyYy5yaHMoKSkpKTsKKyAgfQorfTsKKworLy8gdGhlIGZvbGxvd2luZyBzZWxlY3RvciwgY2hlY2tUcmFuc3Bvc2VBbGlhc2luZ19pbXBsLCBiYXNlZCBvbiBNaWdodEhhdmVUcmFuc3Bvc2VBbGlhc2luZywKKy8vIGlzIGJlY2F1c2Ugd2hlbiB0aGUgY29uZGl0aW9uIGNvbnRyb2xsaW5nIHRoZSBhc3NlcnQgaXMga25vd24gYXQgY29tcGlsZSB0aW1lLCBJQ0MgZW1pdHMgYSB3YXJuaW5nLgorLy8gVGhpcyBpcyBhY3R1YWxseSBhIGdvb2Qgd2FybmluZzogaW4gZXhwcmVzc2lvbnMgdGhhdCBkb24ndCBoYXZlIGFueSB0cmFuc3Bvc2luZywgdGhlIGNvbmRpdGlvbiBpcworLy8ga25vd24gYXQgY29tcGlsZSB0aW1lIHRvIGJlIGZhbHNlLCBhbmQgdXNpbmcgdGhhdCwgd2UgY2FuIGF2b2lkIGdlbmVyYXRpbmcgdGhlIGNvZGUgb2YgdGhlIGFzc2VydCBhZ2FpbgorLy8gYW5kIGFnYWluIGZvciBhbGwgdGhlc2UgZXhwcmVzc2lvbnMgdGhhdCBkb24ndCBuZWVkIGl0LgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsCisgICAgICAgICBib29sIE1pZ2h0SGF2ZVRyYW5zcG9zZUFsaWFzaW5nCisgICAgICAgICAgICAgICAgID0gY2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX2NvbXBpbGVfdGltZV9zZWxlY3RvcgorICAgICAgICAgICAgICAgICAgICAgPGJsYXNfdHJhaXRzPERlcml2ZWQ+OjpJc1RyYW5zcG9zZWQsT3RoZXJEZXJpdmVkPjo6cmV0CisgICAgICAgID4KK3N0cnVjdCBjaGVja1RyYW5zcG9zZUFsaWFzaW5nX2ltcGwKK3sKKyAgICBzdGF0aWMgdm9pZCBydW4oY29uc3QgRGVyaXZlZCYgZHN0LCBjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KCghY2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX3J1bl90aW1lX3NlbGVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcixibGFzX3RyYWl0czxEZXJpdmVkPjo6SXNUcmFuc3Bvc2VkLE90aGVyRGVyaXZlZD4KKyAgICAgICAgICAgICAgICAgICAgICA6OnJ1bihleHRyYWN0X2RhdGEoZHN0KSwgb3RoZXIpKQorICAgICAgICAgICYmICJhbGlhc2luZyBkZXRlY3RlZCBkdXJpbmcgdHJhbnNwb3NpdGlvbiwgdXNlIHRyYW5zcG9zZUluUGxhY2UoKSAiCisgICAgICAgICAgICAgIm9yIGV2YWx1YXRlIHRoZSByaHMgaW50byBhIHRlbXBvcmFyeSB1c2luZyAuZXZhbCgpIik7CisKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgY2hlY2tUcmFuc3Bvc2VBbGlhc2luZ19pbXBsPERlcml2ZWQsIE90aGVyRGVyaXZlZCwgZmFsc2U+Cit7CisgICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmLCBjb25zdCBPdGhlckRlcml2ZWQmKQorICAgIHsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIFNyYz4KK3ZvaWQgY2hlY2tfZm9yX2FsaWFzaW5nKGNvbnN0IERzdCAmZHN0LCBjb25zdCBTcmMgJnNyYykKK3sKKyAgaW50ZXJuYWw6OmNoZWNrVHJhbnNwb3NlQWxpYXNpbmdfaW1wbDxEc3QsIFNyYz46OnJ1bihkc3QsIHNyYyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgLy8gRUlHRU5fTk9fREVCVUcKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUkFOU1BPU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVHJhbnNwb3NpdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zaXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljMTdiYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zaXRpb25zLmgKQEAgLTAsMCArMSw0MDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSQU5TUE9TSVRJT05TX0gKKyNkZWZpbmUgRUlHRU5fVFJBTlNQT1NJVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFRyYW5zcG9zaXRpb25zQmFzZQoreworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPiBUcmFpdHM7CisgICAgCisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpJbmRpY2VzVHlwZSBJbmRpY2VzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEluZGljZXNUeXBlOjpTY2FsYXIgU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworCisgICAgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorCisgICAgLyoqIENvcGllcyB0aGUgXGEgb3RoZXIgdHJhbnNwb3NpdGlvbnMgaW50byBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGluZGljZXMoKSA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgIAorICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlJiBvdGhlcikKKyAgICB7CisgICAgICBpbmRpY2VzKCkgPSBvdGhlci5pbmRpY2VzKCk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyYW5zcG9zaXRpb25zICovCisgICAgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGljZXMoKS5zaXplKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBlcXVpdmFsZW50IHBlcm11dGF0aW9uIG1hdHJpeCAqLworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBpbmRpY2VzKCkuc2l6ZSgpOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgZXF1aXZhbGVudCBwZXJtdXRhdGlvbiBtYXRyaXggKi8KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gaW5kaWNlcygpLnNpemUoKTsgfQorCisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCYgY29lZmYoSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaW5kaWNlcygpLmNvZWZmKGkpOyB9CisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCYgY29lZmZSZWYoSW5kZXggaSkgeyByZXR1cm4gaW5kaWNlcygpLmNvZWZmUmVmKGkpOyB9CisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCYgb3BlcmF0b3IoKShJbmRleCBpKSBjb25zdCB7IHJldHVybiBpbmRpY2VzKCkoaSk7IH0KKyAgICAvKiogRGlyZWN0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbmRleCB2ZWN0b3IgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4JiBvcGVyYXRvcigpKEluZGV4IGkpIHsgcmV0dXJuIGluZGljZXMoKShpKTsgfQorICAgIC8qKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGluZGV4IHZlY3RvciAqLworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgmIG9wZXJhdG9yW10oSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaW5kaWNlcygpKGkpOyB9CisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCYgb3BlcmF0b3JbXShJbmRleCBpKSB7IHJldHVybiBpbmRpY2VzKCkoaSk7IH0KKworICAgIC8qKiBjb25zdCB2ZXJzaW9uIG9mIGluZGljZXMoKS4gKi8KKyAgICBjb25zdCBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5pbmRpY2VzKCk7IH0KKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHRyYW5zcG9zaXRpb25zLiAqLworICAgIEluZGljZXNUeXBlJiBpbmRpY2VzKCkgeyByZXR1cm4gZGVyaXZlZCgpLmluZGljZXMoKTsgfQorCisgICAgLyoqIFJlc2l6ZXMgdG8gZ2l2ZW4gc2l6ZS4gKi8KKyAgICBpbmxpbmUgdm9pZCByZXNpemUoSW5kZXggbmV3U2l6ZSkKKyAgICB7CisgICAgICBpbmRpY2VzKCkucmVzaXplKG5ld1NpemUpOworICAgIH0KKworICAgIC8qKiBTZXRzIFxjICp0aGlzIHRvIHJlcHJlc2VudHMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gKi8KKyAgICB2b2lkIHNldElkZW50aXR5KCkKKyAgICB7CisgICAgICBmb3IoU3RvcmFnZUluZGV4IGkgPSAwOyBpIDwgaW5kaWNlcygpLnNpemUoKTsgKytpKQorICAgICAgICBjb2VmZlJlZihpKSA9IGk7CisgICAgfQorCisgICAgLy8gRklYTUU6IGRvIHdlIHdhbnQgc3VjaCBtZXRob2RzID8KKyAgICAvLyBtaWdodCBiZSB1c2VmdWxsIHdoZW4gdGhlIHRhcmdldCBtYXRyaXggZXhwcmVzc2lvbiBpcyBjb21wbGV4LCBlLmcuOgorICAgIC8vIG9iamVjdC5tYXRyaXgoKS5ibG9jayguLiwuLiwuLiwuLikgPSB0cmFucyAqIG9iamVjdC5tYXRyaXgoKS5ibG9jayguLiwuLiwuLiwuLik7CisgICAgLyoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgYXBwbHlGb3J3YXJkVG9Sb3dzKE1hdHJpeFR5cGUmIG1hdCkgY29uc3QKKyAgICB7CisgICAgICBmb3IoSW5kZXggaz0wIDsgazxzaXplKCkgOyArK2spCisgICAgICAgIGlmKG1faW5kaWNlcyhrKSE9aykKKyAgICAgICAgICBtYXQucm93KGspLnN3YXAobWF0LnJvdyhtX2luZGljZXMoaykpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgYXBwbHlCYWNrd2FyZFRvUm93cyhNYXRyaXhUeXBlJiBtYXQpIGNvbnN0CisgICAgeworICAgICAgZm9yKEluZGV4IGs9c2l6ZSgpLTEgOyBrPj0wIDsgLS1rKQorICAgICAgICBpZihtX2luZGljZXMoaykhPWspCisgICAgICAgICAgbWF0LnJvdyhrKS5zd2FwKG1hdC5yb3cobV9pbmRpY2VzKGspKSk7CisgICAgfQorICAgICovCisKKyAgICAvKiogXHJldHVybnMgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBpbmxpbmUgVHJhbnNwb3NlPFRyYW5zcG9zaXRpb25zQmFzZT4gaW52ZXJzZSgpIGNvbnN0CisgICAgeyByZXR1cm4gVHJhbnNwb3NlPFRyYW5zcG9zaXRpb25zQmFzZT4oZGVyaXZlZCgpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSB0cmFucG9zZSB0cmFuc2Zvcm1hdGlvbiAqLworICAgIGlubGluZSBUcmFuc3Bvc2U8VHJhbnNwb3NpdGlvbnNCYXNlPiB0cmFuc3Bvc2UoKSBjb25zdAorICAgIHsgcmV0dXJuIFRyYW5zcG9zZTxUcmFuc3Bvc2l0aW9uc0Jhc2U+KGRlcml2ZWQoKSk7IH0KKworICBwcm90ZWN0ZWQ6Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zaXRpb25zPFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lLF9TdG9yYWdlSW5kZXg+ID4KKyA6IHRyYWl0czxQZXJtdXRhdGlvbk1hdHJpeDxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxfU3RvcmFnZUluZGV4PiA+Cit7CisgIHR5cGVkZWYgTWF0cml4PF9TdG9yYWdlSW5kZXgsIFNpemVBdENvbXBpbGVUaW1lLCAxLCAwLCBNYXhTaXplQXRDb21waWxlVGltZSwgMT4gSW5kaWNlc1R5cGU7CisgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNTdG9yYWdlIFN0b3JhZ2VLaW5kOworfTsKK30KKworLyoqIFxjbGFzcyBUcmFuc3Bvc2l0aW9ucworICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRyYW5zcG9zaXRpb25zIChyb3cvY29sdW1uIGludGVyY2hhbmdlKQorICAqCisgICogXHRwYXJhbSBTaXplQXRDb21waWxlVGltZSB0aGUgbnVtYmVyIG9mIHRyYW5zcG9zaXRpb25zLCBvciBEeW5hbWljCisgICogXHRwYXJhbSBNYXhTaXplQXRDb21waWxlVGltZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNwb3NpdGlvbnMsIG9yIER5bmFtaWMuIFRoaXMgb3B0aW9uYWwgcGFyYW1ldGVyIGRlZmF1bHRzIHRvIFNpemVBdENvbXBpbGVUaW1lLiBNb3N0IG9mIHRoZSB0aW1lLCB5b3Ugc2hvdWxkIG5vdCBoYXZlIHRvIHNwZWNpZnkgaXQuCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwZXJtdXRhdGlvbiB0cmFuc2Zvcm1hdGlvbiBhcyBhIHNlcXVlbmNlIG9mIFxlbSBuIHRyYW5zcG9zaXRpb25zCisgICogXGYkW1Rfe24tMX0gXGxkb3RzIFRfe2l9IFxsZG90cyBUX3swfV1cZiQuIEl0IGlzIGludGVybmFsbHkgc3RvcmVkIGFzIGEgdmVjdG9yIG9mIGludGVnZXJzIFxjIGluZGljZXMuCisgICogRWFjaCB0cmFuc3Bvc2l0aW9uIFxmJCBUX3tpfSBcZiQgYXBwbGllZCBvbiB0aGUgbGVmdCBvZiBhIG1hdHJpeCAoXGYkIFRfe2l9IE1cZiQpIGludGVyY2hhbmdlcworICAqIHRoZSByb3dzIFxjIGkgYW5kIFxjIGluZGljZXNbaV0gb2YgdGhlIG1hdHJpeCBcYyBNLgorICAqIEEgdHJhbnNwb3NpdGlvbiBhcHBsaWVkIG9uIHRoZSByaWdodCAoZS5nLiwgXGYkIE0gVF97aX1cZiQpIHlpZWxkcyBhIGNvbHVtbiBpbnRlcmNoYW5nZS4KKyAgKgorICAqIENvbXBhcmVkIHRvIHRoZSBjbGFzcyBQZXJtdXRhdGlvbk1hdHJpeCwgc3VjaCBhIHNlcXVlbmNlIG9mIHRyYW5zcG9zaXRpb25zIGlzIHdoYXQgaXMKKyAgKiBjb21wdXRlZCBkdXJpbmcgYSBkZWNvbXBvc2l0aW9uIHdpdGggcGl2b3RpbmcsIGFuZCBpdCBpcyBmYXN0ZXIgd2hlbiBhcHBseWluZyB0aGUgcGVybXV0YXRpb24gaW4tcGxhY2UuCisgICoKKyAgKiBUbyBhcHBseSBhIHNlcXVlbmNlIG9mIHRyYW5zcG9zaXRpb25zIHRvIGEgbWF0cml4LCBzaW1wbHkgdXNlIHRoZSBvcGVyYXRvciAqIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgKiBcY29kZQorICAqIFRyYW5zcG9zaXRpb25zIHRyOworICAqIE1hdHJpeFhmIG1hdDsKKyAgKiBtYXQgPSB0ciAqIG1hdDsKKyAgKiBcZW5kY29kZQorICAqIEluIHRoaXMgZXhhbXBsZSwgd2UgZGV0ZWN0IHRoYXQgdGhlIG1hdHJpeCBhcHBlYXJzIG9uIGJvdGggc2lkZSwgYW5kIHNvIHRoZSB0cmFuc3Bvc2l0aW9ucworICAqIGFyZSBhcHBsaWVkIGluLXBsYWNlIHdpdGhvdXQgYW55IHRlbXBvcmFyeSBvciBleHRyYSBjb3B5LgorICAqCisgICogXHNhIGNsYXNzIFBlcm11dGF0aW9uTWF0cml4CisgICovCisKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorY2xhc3MgVHJhbnNwb3NpdGlvbnMgOiBwdWJsaWMgVHJhbnNwb3NpdGlvbnNCYXNlPFRyYW5zcG9zaXRpb25zPFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lLF9TdG9yYWdlSW5kZXg+ID4KK3sKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8VHJhbnNwb3NpdGlvbnM+IFRyYWl0czsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnM+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5kaWNlc1R5cGU6OlNjYWxhciBTdG9yYWdlSW5kZXg7CisKKyAgICBpbmxpbmUgVHJhbnNwb3NpdGlvbnMoKSB7fQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBUcmFuc3Bvc2l0aW9ucyhjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1faW5kaWNlcyhvdGhlci5pbmRpY2VzKCkpIHt9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFN0YW5kYXJkIGNvcHkgY29uc3RydWN0b3IuIERlZmluZWQgb25seSB0byBwcmV2ZW50IGEgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAqIGZyb20gaGlkaW5nIHRoZSBvdGhlciB0ZW1wbGF0ZWQgY29uc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgVHJhbnNwb3NpdGlvbnMoY29uc3QgVHJhbnNwb3NpdGlvbnMmIG90aGVyKSA6IG1faW5kaWNlcyhvdGhlci5pbmRpY2VzKCkpIHt9CisgICAgI2VuZGlmCisKKyAgICAvKiogR2VuZXJpYyBjb25zdHJ1Y3RvciBmcm9tIGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zcG9zaXRpb24gaW5kaWNlcy4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBleHBsaWNpdCBpbmxpbmUgVHJhbnNwb3NpdGlvbnMoY29uc3QgTWF0cml4QmFzZTxPdGhlcj4mIGluZGljZXMpIDogbV9pbmRpY2VzKGluZGljZXMpCisgICAge30KKworICAgIC8qKiBDb3BpZXMgdGhlIFxhIG90aGVyIHRyYW5zcG9zaXRpb25zIGludG8gXGMgKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgVHJhbnNwb3NpdGlvbnMmIG9wZXJhdG9yPShjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LiBJdHMgcHVycG9zZSBpcyB0bworICAgICAgKiBwcmV2ZW50IGEgZGVmYXVsdCBvcGVyYXRvcj0gZnJvbSBoaWRpbmcgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uCisgICAgICAqLworICAgIFRyYW5zcG9zaXRpb25zJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnMmIG90aGVyKQorICAgIHsKKyAgICAgIG1faW5kaWNlcyA9IG90aGVyLm1faW5kaWNlczsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvKiogQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIHBlcm11dGF0aW9uIG1hdHJpeCBvZiBnaXZlbiBzaXplLgorICAgICAgKi8KKyAgICBpbmxpbmUgVHJhbnNwb3NpdGlvbnMoSW5kZXggc2l6ZSkgOiBtX2luZGljZXMoc2l6ZSkKKyAgICB7fQorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3Bvc2l0aW9ucy4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4LCBpbnQgX1BhY2tldEFjY2Vzcz4KK3N0cnVjdCB0cmFpdHM8TWFwPFRyYW5zcG9zaXRpb25zPFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lLF9TdG9yYWdlSW5kZXg+LF9QYWNrZXRBY2Nlc3M+ID4KKyA6IHRyYWl0czxQZXJtdXRhdGlvbk1hdHJpeDxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxfU3RvcmFnZUluZGV4PiA+Cit7CisgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxfU3RvcmFnZUluZGV4LFNpemVBdENvbXBpbGVUaW1lLDEsMCxNYXhTaXplQXRDb21waWxlVGltZSwxPiwgX1BhY2tldEFjY2Vzcz4gSW5kaWNlc1R5cGU7CisgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNTdG9yYWdlIFN0b3JhZ2VLaW5kOworfTsKK30KKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXgsIGludCBQYWNrZXRBY2Nlc3M+CitjbGFzcyBNYXA8VHJhbnNwb3NpdGlvbnM8U2l6ZUF0Q29tcGlsZVRpbWUsTWF4U2l6ZUF0Q29tcGlsZVRpbWUsX1N0b3JhZ2VJbmRleD4sUGFja2V0QWNjZXNzPgorIDogcHVibGljIFRyYW5zcG9zaXRpb25zQmFzZTxNYXA8VHJhbnNwb3NpdGlvbnM8U2l6ZUF0Q29tcGlsZVRpbWUsTWF4U2l6ZUF0Q29tcGlsZVRpbWUsX1N0b3JhZ2VJbmRleD4sUGFja2V0QWNjZXNzPiA+Cit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE1hcD4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFRyYW5zcG9zaXRpb25zQmFzZTxNYXA+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5kaWNlc1R5cGU6OlNjYWxhciBTdG9yYWdlSW5kZXg7CisKKyAgICBleHBsaWNpdCBpbmxpbmUgTWFwKGNvbnN0IFN0b3JhZ2VJbmRleCogaW5kaWNlc1B0cikKKyAgICAgIDogbV9pbmRpY2VzKGluZGljZXNQdHIpCisgICAge30KKworICAgIGlubGluZSBNYXAoY29uc3QgU3RvcmFnZUluZGV4KiBpbmRpY2VzUHRyLCBJbmRleCBzaXplKQorICAgICAgOiBtX2luZGljZXMoaW5kaWNlc1B0cixzaXplKQorICAgIHt9CisKKyAgICAvKiogQ29waWVzIHRoZSBcYSBvdGhlciB0cmFuc3Bvc2l0aW9ucyBpbnRvIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIE1hcCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgTWFwJiBvcGVyYXRvcj0oY29uc3QgTWFwJiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5tX2luZGljZXM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3Bvc2l0aW9ucy4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5kaWNlc1R5cGU+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zaXRpb25zV3JhcHBlcjxfSW5kaWNlc1R5cGU+ID4KKyA6IHRyYWl0czxQZXJtdXRhdGlvbldyYXBwZXI8X0luZGljZXNUeXBlPiA+Cit7CisgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNTdG9yYWdlIFN0b3JhZ2VLaW5kOworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX0luZGljZXNUeXBlPgorY2xhc3MgVHJhbnNwb3NpdGlvbnNXcmFwcGVyCisgOiBwdWJsaWMgVHJhbnNwb3NpdGlvbnNCYXNlPFRyYW5zcG9zaXRpb25zV3JhcHBlcjxfSW5kaWNlc1R5cGU+ID4KK3sKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8VHJhbnNwb3NpdGlvbnNXcmFwcGVyPiBUcmFpdHM7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNCYXNlPFRyYW5zcG9zaXRpb25zV3JhcHBlcj4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6SW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJbmRpY2VzVHlwZTo6U2NhbGFyIFN0b3JhZ2VJbmRleDsKKworICAgIGV4cGxpY2l0IGlubGluZSBUcmFuc3Bvc2l0aW9uc1dyYXBwZXIoSW5kaWNlc1R5cGUmIGluZGljZXMpCisgICAgICA6IG1faW5kaWNlcyhpbmRpY2VzKQorICAgIHt9CisKKyAgICAvKiogQ29waWVzIHRoZSBcYSBvdGhlciB0cmFuc3Bvc2l0aW9ucyBpbnRvIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIFRyYW5zcG9zaXRpb25zV3JhcHBlciYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgVHJhbnNwb3NpdGlvbnNXcmFwcGVyJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNXcmFwcGVyJiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5tX2luZGljZXM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHRyYW5zcG9zaXRpb25zLiAqLworICAgIEluZGljZXNUeXBlJiBpbmRpY2VzKCkgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZW5hbWUgSW5kaWNlc1R5cGU6Ok5lc3RlZCBtX2luZGljZXM7Cit9OworCisKKworLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgXGEgdHJhbnNwb3NpdGlvbnMgYXBwbGllZCB0byB0aGUgY29sdW1ucy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25zRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitjb25zdCBQcm9kdWN0PE1hdHJpeERlcml2ZWQsIFRyYW5zcG9zaXRpb25zRGVyaXZlZCwgQWxpYXNGcmVlUHJvZHVjdD4KK29wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE1hdHJpeERlcml2ZWQ+ICZtYXRyaXgsCisgICAgICAgICAgY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPFRyYW5zcG9zaXRpb25zRGVyaXZlZD4mIHRyYW5zcG9zaXRpb25zKQoreworICByZXR1cm4gUHJvZHVjdDxNYXRyaXhEZXJpdmVkLCBUcmFuc3Bvc2l0aW9uc0Rlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CisgICAgICAgICAgICAobWF0cml4LmRlcml2ZWQoKSwgdHJhbnNwb3NpdGlvbnMuZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgXGEgdHJhbnNwb3NpdGlvbnMgYXBwbGllZCB0byB0aGUgcm93cy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zcG9zaXRpb25zRGVyaXZlZCwgdHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitjb25zdCBQcm9kdWN0PFRyYW5zcG9zaXRpb25zRGVyaXZlZCwgTWF0cml4RGVyaXZlZCwgQWxpYXNGcmVlUHJvZHVjdD4KK29wZXJhdG9yKihjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnNEZXJpdmVkPiAmdHJhbnNwb3NpdGlvbnMsCisgICAgICAgICAgY29uc3QgTWF0cml4QmFzZTxNYXRyaXhEZXJpdmVkPiYgbWF0cml4KQoreworICByZXR1cm4gUHJvZHVjdDxUcmFuc3Bvc2l0aW9uc0Rlcml2ZWQsIE1hdHJpeERlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CisgICAgICAgICAgICAodHJhbnNwb3NpdGlvbnMuZGVyaXZlZCgpLCBtYXRyaXguZGVyaXZlZCgpKTsKK30KKworLy8gVGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdHJhbnNwb3NlZC9pbnZlcnNlIHRyYW5zcG9zaXRpb25zCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zZTxUcmFuc3Bvc2l0aW9uc0Jhc2U8RGVyaXZlZD4gPiA+CisgOiB0cmFpdHM8RGVyaXZlZD4KK3t9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNwb3NpdGlvbnNEZXJpdmVkPgorY2xhc3MgVHJhbnNwb3NlPFRyYW5zcG9zaXRpb25zQmFzZTxUcmFuc3Bvc2l0aW9uc0Rlcml2ZWQ+ID4KK3sKKyAgICB0eXBlZGVmIFRyYW5zcG9zaXRpb25zRGVyaXZlZCBUcmFuc3Bvc2l0aW9uVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlOjpJbmRpY2VzVHlwZSBJbmRpY2VzVHlwZTsKKyAgcHVibGljOgorCisgICAgZXhwbGljaXQgVHJhbnNwb3NlKGNvbnN0IFRyYW5zcG9zaXRpb25UeXBlJiB0KSA6IG1fdHJhbnNwb3NpdGlvbnModCkge30KKworICAgIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zcG9zaXRpb25zLnNpemUoKTsgfQorICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zcG9zaXRpb25zLnNpemUoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zcG9zaXRpb25zLnNpemUoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSB0cmFuc3Bvc2l0aW9ucyBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIGNvbnN0IFByb2R1Y3Q8T3RoZXJEZXJpdmVkLCBUcmFuc3Bvc2UsIEFsaWFzRnJlZVByb2R1Y3Q+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgbWF0cml4LCBjb25zdCBUcmFuc3Bvc2UmIHRydCkKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxPdGhlckRlcml2ZWQsIFRyYW5zcG9zZSwgQWxpYXNGcmVlUHJvZHVjdD4obWF0cml4LmRlcml2ZWQoKSwgdHJ0LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSB0cmFuc3Bvc2l0aW9ucyBhcHBsaWVkIHRvIHRoZSByb3dzLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgUHJvZHVjdDxUcmFuc3Bvc2UsIE90aGVyRGVyaXZlZCwgQWxpYXNGcmVlUHJvZHVjdD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBtYXRyaXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFByb2R1Y3Q8VHJhbnNwb3NlLCBPdGhlckRlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+KCp0aGlzLCBtYXRyaXguZGVyaXZlZCgpKTsKKyAgICB9CisgICAgCisgICAgY29uc3QgVHJhbnNwb3NpdGlvblR5cGUmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zcG9zaXRpb25zOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFRyYW5zcG9zaXRpb25UeXBlJiBtX3RyYW5zcG9zaXRpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUkFOU1BPU0lUSU9OU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Ucmlhbmd1bGFyTWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9Ucmlhbmd1bGFyTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZWYwOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1RyaWFuZ3VsYXJNYXRyaXguaApAQCAtMCwwICsxLDk4MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUk1BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1RSSUFOR1VMQVJNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgVHJpYW5ndWxhclR5cGUsIHR5cGVuYW1lIFJocz4gc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsOworICAKK30KKworLyoqIFxjbGFzcyBUcmlhbmd1bGFyQmFzZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgdHJpYW5ndWxhciBwYXJ0IGluIGEgbWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBUcmlhbmd1bGFyQmFzZSA6IHB1YmxpYyBFaWdlbkJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorCisgICAgZW51bSB7CisgICAgICBNb2RlID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TW9kZSwKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAKKyAgICAgIFNpemVBdENvbXBpbGVUaW1lID0gKGludGVybmFsOjpzaXplX2F0X2NvbXBpbGVfdGltZTxpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lPjo6cmV0KSwKKyAgICAgIC8qKjwgVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgaS5lLiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiByb3dzIHRpbWVzIHRoZSBudW1iZXIgb2YgY29sdW1ucywgb3IgdG8gXGEgRHluYW1pYyBpZiB0aGlzIGlzIG5vdAorICAgICAgICAgICoga25vd24gYXQgY29tcGlsZS10aW1lLiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lICovCisgICAgICAKKyAgICAgIE1heFNpemVBdENvbXBpbGVUaW1lID0gKGludGVybmFsOjpzaXplX2F0X2NvbXBpbGVfdGltZTxpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heENvbHNBdENvbXBpbGVUaW1lPjo6cmV0KQorICAgICAgICAKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZ1bGxNYXRyaXhUeXBlIERlbnNlTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIERlbnNlTWF0cml4VHlwZSBEZW5zZVR5cGU7CisgICAgdHlwZWRlZiBEZXJpdmVkIGNvbnN0JiBOZXN0ZWQ7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBUcmlhbmd1bGFyQmFzZSgpIHsgZWlnZW5fYXNzZXJ0KCEoKE1vZGUmVW5pdERpYWcpICYmIChNb2RlJlplcm9EaWFnKSkpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLnJvd3MoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuY29scygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkub3V0ZXJTdHJpZGUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7IH0KKyAgICAKKyAgICAvLyBkdW1teSByZXNpemUgZnVuY3Rpb24KKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShyb3dzKTsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShjb2xzKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzPT10aGlzLT5yb3dzKCkgJiYgY29scz09dGhpcy0+Y29scygpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0ICB7IHJldHVybiBkZXJpdmVkKCkuY29lZmYocm93LGNvbCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKSB7IHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYocm93LGNvbCk7IH0KKworICAgIC8qKiBcc2VlIE1hdHJpeEJhc2U6OmNvcHlDb2VmZihyb3csY29sKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb3B5Q29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wsIE90aGVyJiBvdGhlcikKKyAgICB7CisgICAgICBkZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpID0gb3RoZXIuY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGNoZWNrX2Nvb3JkaW5hdGVzKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBjb2VmZihyb3csY29sKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGNoZWNrX2Nvb3JkaW5hdGVzKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihyb3csY29sKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBEZXJpdmVkJiBkZXJpdmVkKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKTsgfQorICAgICNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiAmb3RoZXIpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgZXZhbFRvTGF6eShNYXRyaXhCYXNlPERlbnNlRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VNYXRyaXhUeXBlIHRvRGVuc2VNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIERlbnNlTWF0cml4VHlwZSByZXMocm93cygpLCBjb2xzKCkpOworICAgICAgZXZhbFRvTGF6eShyZXMpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdm9pZCBjaGVja19jb29yZGluYXRlcyhJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHJvdyk7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbCk7CisgICAgICBlaWdlbl9hc3NlcnQoY29sPj0wICYmIGNvbDxjb2xzKCkgJiYgcm93Pj0wICYmIHJvdzxyb3dzKCkpOworICAgICAgY29uc3QgaW50IG1vZGUgPSBpbnQoTW9kZSkgJiB+U2VsZkFkam9pbnQ7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKG1vZGUpOworICAgICAgZWlnZW5fYXNzZXJ0KChtb2RlPT1VcHBlciAmJiBjb2w+PXJvdykKKyAgICAgICAgICAgICAgICB8fCAobW9kZT09TG93ZXIgJiYgY29sPD1yb3cpCisgICAgICAgICAgICAgICAgfHwgKChtb2RlPT1TdHJpY3RseVVwcGVyIHx8IG1vZGU9PVVuaXRVcHBlcikgJiYgY29sPnJvdykKKyAgICAgICAgICAgICAgICB8fCAoKG1vZGU9PVN0cmljdGx5TG93ZXIgfHwgbW9kZT09VW5pdExvd2VyKSAmJiBjb2w8cm93KSk7CisgICAgfQorCisgICAgI2lmZGVmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORworICAgIHZvaWQgY2hlY2tfY29vcmRpbmF0ZXNfaW50ZXJuYWwoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgY2hlY2tfY29vcmRpbmF0ZXMocm93LCBjb2wpOworICAgIH0KKyAgICAjZWxzZQorICAgIHZvaWQgY2hlY2tfY29vcmRpbmF0ZXNfaW50ZXJuYWwoSW5kZXggLCBJbmRleCApIGNvbnN0IHt9CisgICAgI2VuZGlmCisKK307CisKKy8qKiBcY2xhc3MgVHJpYW5ndWxhclZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSB0cmlhbmd1bGFyIHBhcnQgaW4gYSBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgYXJlIHRha2luZyB0aGUgdHJpYW5ndWxhciBwYXJ0CisgICogXHBhcmFtIE1vZGUgdGhlIGtpbmQgb2YgdHJpYW5ndWxhciBtYXRyaXggZXhwcmVzc2lvbiB0byBjb25zdHJ1Y3QuIENhbiBiZSAjVXBwZXIsCisgICogICAgICAgICAgICAgI0xvd2VyLCAjVW5pdFVwcGVyLCAjVW5pdExvd2VyLCAjU3RyaWN0bHlVcHBlciwgb3IgI1N0cmljdGx5TG93ZXIuCisgICogICAgICAgICAgICAgVGhpcyBpcyBpbiBmYWN0IGEgYml0IGZpZWxkOyBpdCBtdXN0IGhhdmUgZWl0aGVyICNVcHBlciBvciAjTG93ZXIsIAorICAqICAgICAgICAgICAgIGFuZCBhZGRpdGlvbmFsbHkgaXQgbWF5IGhhdmUgI1VuaXREaWFnIG9yICNaZXJvRGlhZyBvciBuZWl0aGVyLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgbWF0cml4LCBub3QgbmVjZXNzYXJpbHkgc3F1YXJlLiBTdHJpY3RseSBzcGVha2luZywgZm9yIHJlY3Rhbmd1bGFyCisgICogbWF0cmljZXMgb25lIHNob3VsZCBzcGVhayBvZiAidHJhcGV6b2lkIiBwYXJ0cy4gVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUKKyAgKiBvZiBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpIGFuZCBTcGFyc2VNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpLCBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnRyaWFuZ3VsYXJWaWV3KCkKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgX01vZGU+CitzdHJ1Y3QgdHJhaXRzPFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsIF9Nb2RlPiA+IDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojpub25fY29uc3RfdHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZE5vblJlZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IEZ1bGxNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeFR5cGUgRXhwcmVzc2lvblR5cGU7CisgIGVudW0geworICAgIE1vZGUgPSBfTW9kZSwKKyAgICBGbGFnc0x2YWx1ZUJpdCA9IGlzX2x2YWx1ZTxNYXRyaXhUeXBlPjo6dmFsdWUgPyBMdmFsdWVCaXQgOiAwLAorICAgIEZsYWdzID0gKE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpGbGFncyAmIChIZXJlZGl0YXJ5Qml0cyB8IEZsYWdzTHZhbHVlQml0KSAmICh+KFBhY2tldEFjY2Vzc0JpdCB8IERpcmVjdEFjY2Vzc0JpdCB8IExpbmVhckFjY2Vzc0JpdCkpKQorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBfTW9kZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+IGNsYXNzIFRyaWFuZ3VsYXJWaWV3SW1wbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBfTW9kZT4gY2xhc3MgVHJpYW5ndWxhclZpZXcKKyAgOiBwdWJsaWMgVHJpYW5ndWxhclZpZXdJbXBsPF9NYXRyaXhUeXBlLCBfTW9kZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxfTWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBUcmlhbmd1bGFyVmlld0ltcGw8X01hdHJpeFR5cGUsIF9Nb2RlLCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPF9NYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQgPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUcmlhbmd1bGFyVmlldz46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXc+OjpNYXRyaXhUeXBlTmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRyaWFuZ3VsYXJWaWV3Pjo6TWF0cml4VHlwZU5lc3RlZE5vblJlZiBNYXRyaXhUeXBlTmVzdGVkTm9uUmVmOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb25qdWdhdGVSZXR1cm5UeXBlPjo6dHlwZSBNYXRyaXhDb25qdWdhdGVSZXR1cm5UeXBlOworICAgIAorICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXc+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXc+OjpNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCBOZXN0ZWRFeHByZXNzaW9uOworCisgICAgZW51bSB7CisgICAgICBNb2RlID0gX01vZGUsCisgICAgICBGbGFncyA9IGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXc+OjpGbGFncywKKyAgICAgIFRyYW5zcG9zZU1vZGUgPSAoTW9kZSAmIFVwcGVyID8gTG93ZXIgOiAwKQorICAgICAgICAgICAgICAgICAgICB8IChNb2RlICYgTG93ZXIgPyBVcHBlciA6IDApCisgICAgICAgICAgICAgICAgICAgIHwgKE1vZGUgJiAoVW5pdERpYWcpKQorICAgICAgICAgICAgICAgICAgICB8IChNb2RlICYgKFplcm9EaWFnKSksCisgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSBmYWxzZQorICAgIH07CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBUcmlhbmd1bGFyVmlldyhNYXRyaXhUeXBlJiBtYXRyaXgpIDogbV9tYXRyaXgobWF0cml4KQorICAgIHt9CisgICAgCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworICAgIFRyaWFuZ3VsYXJWaWV3JiBvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhclZpZXcgJm90aGVyKQorICAgIHsgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7IH0KKworICAgIC8qKiBcY29weWRvYyBFaWdlbkJhc2U6OnJvd3MoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICAvKiogXGNvcHlkb2MgRWlnZW5CYXNlOjpjb2xzKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBOZXN0ZWRFeHByZXNzaW9uJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIE5lc3RlZEV4cHJlc3Npb24mIG5lc3RlZEV4cHJlc3Npb24oKSB7IHJldHVybiBtX21hdHJpeDsgfQorICAgIAorICAgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8Y29uc3QgTWF0cml4Q29uanVnYXRlUmV0dXJuVHlwZSxNb2RlPiBDb25qdWdhdGVSZXR1cm5UeXBlOworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29uanVnYXRlKCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBDb25qdWdhdGVSZXR1cm5UeXBlIGNvbmp1Z2F0ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gQ29uanVnYXRlUmV0dXJuVHlwZShtX21hdHJpeC5jb25qdWdhdGUoKSk7IH0KKworICAgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsVHJhbnNwb3NlTW9kZT4gQWRqb2ludFJldHVyblR5cGU7CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjphZGpvaW50KCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBBZGpvaW50UmV0dXJuVHlwZSBhZGpvaW50KCkgY29uc3QKKyAgICB7IHJldHVybiBBZGpvaW50UmV0dXJuVHlwZShtX21hdHJpeC5hZGpvaW50KCkpOyB9CisKKyAgICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlRyYW5zcG9zZVJldHVyblR5cGUsVHJhbnNwb3NlTW9kZT4gVHJhbnNwb3NlUmV0dXJuVHlwZTsKKyAgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjp0cmFuc3Bvc2UoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShNYXRyaXhUeXBlKQorICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6VHJhbnNwb3NlUmV0dXJuVHlwZSB0bXAobV9tYXRyaXgpOworICAgICAgcmV0dXJuIFRyYW5zcG9zZVJldHVyblR5cGUodG1wKTsKKyAgICB9CisgICAgCisgICAgdHlwZWRlZiBUcmlhbmd1bGFyVmlldzxjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb25zdFRyYW5zcG9zZVJldHVyblR5cGUsVHJhbnNwb3NlTW9kZT4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlOworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6dHJhbnNwb3NlKCkgY29uc3QgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlKG1fbWF0cml4LnRyYW5zcG9zZSgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBTb2x2ZTxUcmlhbmd1bGFyVmlldywgT3RoZXI+IAorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXI+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBTb2x2ZTxUcmlhbmd1bGFyVmlldywgT3RoZXI+KCp0aGlzLCBvdGhlci5kZXJpdmVkKCkpOyB9CisgICAgCisgIC8vIHdvcmthcm91bmQgTVNWQyBJQ0UKKyAgI2lmIEVJR0VOX0NPTVBfTVNWQworICAgIHRlbXBsYXRlPGludCBTaWRlLCB0eXBlbmFtZSBPdGhlcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9yZXR2YWw8U2lkZSxUcmlhbmd1bGFyVmlldywgT3RoZXI+CisgICAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlcj4mIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIEJhc2U6OnRlbXBsYXRlIHNvbHZlPFNpZGU+KG90aGVyKTsgfQorICAjZWxzZQorICAgIHVzaW5nIEJhc2U6OnNvbHZlOworICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJucyBhIHNlbGZhZGpvaW50IHZpZXcgb2YgdGhlIHJlZmVyZW5jZWQgdHJpYW5ndWxhciBwYXJ0IHdoaWNoIG11c3QgYmUgZWl0aGVyIFxjICNVcHBlciBvciBcYyAjTG93ZXIuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgXGNvZGUgdGhpcy0+bmVzdGVkRXhwcmVzc2lvbigpLnNlbGZhZGpvaW50VmlldzwoKnRoaXMpOjpNb2RlPigpIFxlbmRjb2RlCisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpzZWxmYWRqb2ludFZpZXcoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGVOZXN0ZWROb25SZWYsTW9kZT4gc2VsZmFkam9pbnRWaWV3KCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChNb2RlJihVbml0RGlhZ3xaZXJvRGlhZykpPT0wLFBST0dSQU1NSU5HX0VSUk9SKTsKKyAgICAgIHJldHVybiBTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZU5lc3RlZE5vblJlZixNb2RlPihtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2Ygc2VsZmFkam9pbnRWaWV3KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlTmVzdGVkTm9uUmVmLE1vZGU+IHNlbGZhZGpvaW50VmlldygpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTW9kZSYoVW5pdERpYWd8WmVyb0RpYWcpKT09MCxQUk9HUkFNTUlOR19FUlJPUik7CisgICAgICByZXR1cm4gU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGVOZXN0ZWROb25SZWYsTW9kZT4obV9tYXRyaXgpOworICAgIH0KKworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgdHJpYW5ndWxhciBtYXRyaXgKKyAgICAgICogXHNhIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0CisgICAgeworICAgICAgaWYgKE1vZGUgJiBVbml0RGlhZykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBlbHNlIGlmIChNb2RlICYgWmVyb0RpYWcpCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9tYXRyaXguZGlhZ29uYWwoKS5wcm9kKCk7CisgICAgfQorICAgICAgCisgIHByb3RlY3RlZDoKKworICAgIE1hdHJpeFR5cGVOZXN0ZWQgbV9tYXRyaXg7Cit9OworCisvKiogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBhIHRyaWFuZ3VsYXIgcGFydCBpbiBhIFxiIGRlbnNlIG1hdHJpeAorICAqCisgICogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGNsYXNzIFRyaWFuZ3VsYXJWaWV3LCBhbmQgb2JqZWN0cyBvZiB0eXBlIFRyaWFuZ3VsYXJWaWV3SW1wbCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAqIEl0IGV4dGVuZHMgY2xhc3MgVHJpYW5ndWxhclZpZXcgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgd2hpY2ggYXZhaWxhYmxlIGZvciBkZW5zZSBleHByZXNzaW9ucyBvbmx5LgorICAqCisgICogXHNhIGNsYXNzIFRyaWFuZ3VsYXJWaWV3LCBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IF9Nb2RlPiBjbGFzcyBUcmlhbmd1bGFyVmlld0ltcGw8X01hdHJpeFR5cGUsX01vZGUsRGVuc2U+CisgIDogcHVibGljIFRyaWFuZ3VsYXJCYXNlPFRyaWFuZ3VsYXJWaWV3PF9NYXRyaXhUeXBlLCBfTW9kZT4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PF9NYXRyaXhUeXBlLCBfTW9kZT4gVHJpYW5ndWxhclZpZXdUeXBlOworICAgIHR5cGVkZWYgVHJpYW5ndWxhckJhc2U8VHJpYW5ndWxhclZpZXdUeXBlPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUcmlhbmd1bGFyVmlld1R5cGU+OjpTY2FsYXIgU2NhbGFyOworCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgRGVuc2VNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgRGVuc2VNYXRyaXhUeXBlIFBsYWluT2JqZWN0OworCisgIHB1YmxpYzoKKyAgICB1c2luZyBCYXNlOjpldmFsVG9MYXp5OworICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXdUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisKKyAgICBlbnVtIHsKKyAgICAgIE1vZGUgPSBfTW9kZSwKKyAgICAgIEZsYWdzID0gaW50ZXJuYWw6OnRyYWl0czxUcmlhbmd1bGFyVmlld1R5cGU+OjpGbGFncworICAgIH07CisKKyAgICAvKiogXHJldHVybnMgdGhlIG91dGVyLXN0cmlkZSBvZiB0aGUgdW5kZXJseWluZyBkZW5zZSBtYXRyaXgKKyAgICAgICogXHNhIERlbnNlQ29lZmZzQmFzZTo6b3V0ZXJTdHJpZGUoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5vdXRlclN0cmlkZSgpOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbm5lci1zdHJpZGUgb2YgdGhlIHVuZGVybHlpbmcgZGVuc2UgbWF0cml4CisgICAgICAqIFxzYSBEZW5zZUNvZWZmc0Jhc2U6OmlubmVyU3RyaWRlKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5uZXJTdHJpZGUoKTsgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcis9KCkgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFRyaWFuZ3VsYXJWaWV3VHlwZSYgIG9wZXJhdG9yKz0oY29uc3QgRGVuc2VCYXNlPE90aGVyPiYgb3RoZXIpIHsKKyAgICAgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjphZGRfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBPdGhlcjo6U2NhbGFyPigpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6b3BlcmF0b3ItPSgpICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBUcmlhbmd1bGFyVmlld1R5cGUmICBvcGVyYXRvci09KGNvbnN0IERlbnNlQmFzZTxPdGhlcj4mIG90aGVyKSB7CisgICAgICBpbnRlcm5hbDo6Y2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c3ViX2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXI6OlNjYWxhcj4oKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKyAgICAKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yKj0oKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgVHJpYW5ndWxhclZpZXdUeXBlJiAgb3BlcmF0b3IqPShjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXImIG90aGVyKSB7IHJldHVybiAqdGhpcyA9IGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkgKiBvdGhlcjsgfQorICAgIC8qKiBcc2EgRGVuc2VCYXNlOjpvcGVyYXRvci89KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFRyaWFuZ3VsYXJWaWV3VHlwZSYgIG9wZXJhdG9yLz0oY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyJiBvdGhlcikgeyByZXR1cm4gKnRoaXMgPSBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpIC8gb3RoZXI7IH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6ZmlsbCgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIGZpbGwoY29uc3QgU2NhbGFyJiB2YWx1ZSkgeyBzZXRDb25zdGFudCh2YWx1ZSk7IH0KKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OnNldENvbnN0YW50KCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFRyaWFuZ3VsYXJWaWV3VHlwZSYgc2V0Q29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWx1ZSkKKyAgICB7IHJldHVybiAqdGhpcyA9IE1hdHJpeFR5cGU6OkNvbnN0YW50KGRlcml2ZWQoKS5yb3dzKCksIGRlcml2ZWQoKS5jb2xzKCksIHZhbHVlKTsgfQorICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6c2V0WmVybygpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBUcmlhbmd1bGFyVmlld1R5cGUmIHNldFplcm8oKSB7IHJldHVybiBzZXRDb25zdGFudChTY2FsYXIoMCkpOyB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpzZXRPbmVzKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFRyaWFuZ3VsYXJWaWV3VHlwZSYgc2V0T25lcygpIHsgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigxKSk7IH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29lZmYoKQorICAgICAgKiBcd2FybmluZyB0aGUgY29vcmRpbmF0ZXMgbXVzdCBmaXQgaW50byB0aGUgcmVmZXJlbmNlZCB0cmlhbmd1bGFyIHBhcnQKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIEJhc2U6OmNoZWNrX2Nvb3JkaW5hdGVzX2ludGVybmFsKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmNvZWZmUmVmKCkKKyAgICAgICogXHdhcm5pbmcgdGhlIGNvb3JkaW5hdGVzIG11c3QgZml0IGludG8gdGhlIHJlZmVyZW5jZWQgdHJpYW5ndWxhciBwYXJ0CisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoVHJpYW5ndWxhclZpZXdUeXBlKTsKKyAgICAgIEJhc2U6OmNoZWNrX2Nvb3JkaW5hdGVzX2ludGVybmFsKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICAvKiogQXNzaWducyBhIHRyaWFuZ3VsYXIgbWF0cml4IHRvIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgZGVuc2UgbWF0cml4ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgVHJpYW5ndWxhclZpZXdUeXBlJiBvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhckJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgLyoqIFNob3J0Y3V0IGZvclxjb2RlICp0aGlzID0gb3RoZXIub3RoZXIudHJpYW5ndWxhclZpZXc8KCp0aGlzKTo6TW9kZT4oKSBcZW5kY29kZSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFRyaWFuZ3VsYXJWaWV3VHlwZSYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBUcmlhbmd1bGFyVmlld1R5cGUmIG9wZXJhdG9yPShjb25zdCBUcmlhbmd1bGFyVmlld0ltcGwmIG90aGVyKQorICAgIHsgcmV0dXJuICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKTsgfQorCisgICAgLyoqIFxkZXByZWNhdGVkICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBsYXp5QXNzaWduKGNvbnN0IFRyaWFuZ3VsYXJCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIC8qKiBcZGVwcmVjYXRlZCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgbGF6eUFzc2lnbihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKyNlbmRpZgorCisgICAgLyoqIEVmZmljaWVudCB0cmlhbmd1bGFyIG1hdHJpeCB0aW1lcyB2ZWN0b3IvbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBQcm9kdWN0PFRyaWFuZ3VsYXJWaWV3VHlwZSxPdGhlckRlcml2ZWQ+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBQcm9kdWN0PFRyaWFuZ3VsYXJWaWV3VHlwZSxPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSwgcmhzLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIEVmZmljaWVudCB2ZWN0b3IvbWF0cml4IHRpbWVzIHRyaWFuZ3VsYXIgbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZHVjdDxPdGhlckRlcml2ZWQsVHJpYW5ndWxhclZpZXdUeXBlPgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGxocywgY29uc3QgVHJpYW5ndWxhclZpZXdJbXBsJiByaHMpCisgICAgeworICAgICAgcmV0dXJuIFByb2R1Y3Q8T3RoZXJEZXJpdmVkLFRyaWFuZ3VsYXJWaWV3VHlwZT4obGhzLmRlcml2ZWQoKSxyaHMuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIGludmVyc2Ugb2YgXGMgKnRoaXMgd2l0aCBcYSBvdGhlciwgXGEgKnRoaXMgYmVpbmcgdHJpYW5ndWxhci4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgaW52ZXJzZS1tYXRyaXggbWF0cml4IHByb2R1Y3QgaW52ZXJzZShcYyAqdGhpcykgKiBcYSBvdGhlciBpZgorICAgICAgKiBcYSBTaWRlPT1PblRoZUxlZnQgKHRoZSBkZWZhdWx0KSwgb3IgdGhlIHJpZ2h0LWludmVyc2UtbXVsdGlwbHkgIFxhIG90aGVyICogaW52ZXJzZShcYyAqdGhpcykgaWYKKyAgICAgICogXGEgU2lkZT09T25UaGVSaWdodC4KKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGMgU2lkZSBjYW4gYmUgb21taXR0ZWQsIGluIHdoaWNoIGNhc2UgXGMgU2lkZT09T25UaGVMZWZ0CisgICAgICAqCisgICAgICAqIFRoZSBtYXRyaXggXGMgKnRoaXMgbXVzdCBiZSB0cmlhbmd1bGFyIGFuZCBpbnZlcnRpYmxlIChpLmUuLCBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUKKyAgICAgICogZGlhZ29uYWwgbXVzdCBiZSBub24gemVybykuIEl0IHdvcmtzIGFzIGEgZm9yd2FyZCAocmVzcC4gYmFja3dhcmQpIHN1YnN0aXR1dGlvbiBpZiBcYyAqdGhpcworICAgICAgKiBpcyBhbiB1cHBlciAocmVzcC4gbG93ZXIpIHRyaWFuZ3VsYXIgbWF0cml4LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUcmlhbmd1bGFyX3NvbHZlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBUcmlhbmd1bGFyX3NvbHZlLm91dAorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaW52ZXJzZS1tdWx0aXBseSBhbmQgY2FuIHdvcmtzIGluLXBsYWNlIGlmIGl0IGlzIGFzc2lnbmVkCisgICAgICAqIHRvIHRoZSBzYW1lIG1hdHJpeCBvciB2ZWN0b3IgXGEgb3RoZXIuCisgICAgICAqCisgICAgICAqIEZvciB1c2VycyBjb21pbmcgZnJvbSBCTEFTLCB0aGlzIGZ1bmN0aW9uIChhbmQgbW9yZSBzcGVjaWZpY2FsbHkgc29sdmVJblBsYWNlKCkpIG9mZmVyCisgICAgICAqIGFsbCB0aGUgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIFxjICpUUlNWIGFuZCBcYyAqVFJTTSBCTEFTIHJvdXRpbmVzLgorICAgICAgKgorICAgICAgKiBcc2EgVHJpYW5ndWxhclZpZXc6OnNvbHZlSW5QbGFjZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPGludCBTaWRlLCB0eXBlbmFtZSBPdGhlcj4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9yZXR2YWw8U2lkZSxUcmlhbmd1bGFyVmlld1R5cGUsIE90aGVyPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXI+JiBvdGhlcikgY29uc3Q7CisKKyAgICAvKiogImluLXBsYWNlIiB2ZXJzaW9uIG9mIFRyaWFuZ3VsYXJWaWV3Ojpzb2x2ZSgpIHdoZXJlIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbiBcYSBvdGhlcgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBUaGUgcGFyYW1ldGVyIGlzIG9ubHkgbWFya2VkICdjb25zdCcgdG8gbWFrZSB0aGUgQysrIGNvbXBpbGVyIGFjY2VwdCBhIHRlbXBvcmFyeSBleHByZXNzaW9uIGhlcmUuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25zdF9jYXN0IGl0LCBzbyBjb25zdG5lc3MgaXNuJ3QgaG9ub3JlZCBoZXJlLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYyBTaWRlIGNhbiBiZSBvbW1pdHRlZCwgaW4gd2hpY2ggY2FzZSBcYyBTaWRlPT1PblRoZUxlZnQKKyAgICAgICoKKyAgICAgICogU2VlIFRyaWFuZ3VsYXJWaWV3OnNvbHZlKCkgZm9yIHRoZSBkZXRhaWxzLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBzb2x2ZUluUGxhY2UoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHNvbHZlSW5QbGFjZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIHNvbHZlSW5QbGFjZTxPblRoZUxlZnQ+KG90aGVyKTsgfQorCisgICAgLyoqIFN3YXBzIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIGNvbW1vbiB0cmlhbmd1bGFyIHBhcnRzIG9mIHR3byBtYXRyaWNlcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworI2lmZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdm9pZCBzd2FwKFRyaWFuZ3VsYXJCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQorI2Vsc2UKKyAgICB2b2lkIHN3YXAoVHJpYW5ndWxhckJhc2U8T3RoZXJEZXJpdmVkPiBjb25zdCAmIG90aGVyKQorI2VuZGlmCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoT3RoZXJEZXJpdmVkKTsKKyAgICAgIGNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBpbnRlcm5hbDo6c3dhcF9hc3NpZ25fb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQKKyAgICAgICogU2hvcnRjdXQgZm9yIFxjb2RlICgqdGhpcykuc3dhcChvdGhlci50cmlhbmd1bGFyVmlldzwoKnRoaXMpOjpNb2RlPigpKSBcZW5kY29kZSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgc3dhcChNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gY29uc3QgJiBvdGhlcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShPdGhlckRlcml2ZWQpOworICAgICAgY2FsbF9hc3NpZ25tZW50KGRlcml2ZWQoKSwgb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCksIGludGVybmFsOjpzd2FwX2Fzc2lnbl9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0IHsKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNfc2FtZV9kZW5zZShkc3QscmhzKSkKKyAgICAgICAgZHN0ID0gcmhzOworICAgICAgdGhpcy0+c29sdmVJblBsYWNlKGRzdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdFR5cGU+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRyaWFuZ3VsYXJWaWV3VHlwZSYgX2Fzc2lnblByb2R1Y3QoY29uc3QgUHJvZHVjdFR5cGUmIHByb2QsIGNvbnN0IFNjYWxhciYgYWxwaGEsIGJvb2wgYmV0YSk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIHRyaWFuZ3VsYXIgZXZhbHVhdGlvbi9hc3NpZ25tZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKy8vIEZJWE1FIHNob3VsZCB3ZSBrZWVwIHRoYXQgcG9zc2liaWxpdHkKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsIE1vZGU+JgorVHJpYW5ndWxhclZpZXdJbXBsPE1hdHJpeFR5cGUsIE1vZGUsIERlbnNlPjo6b3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLy8gRklYTUUgc2hvdWxkIHdlIGtlZXAgdGhhdCBwb3NzaWJpbGl0eQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIFRyaWFuZ3VsYXJWaWV3SW1wbDxNYXRyaXhUeXBlLCBNb2RlLCBEZW5zZT46OmxhenlBc3NpZ24oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkZXJpdmVkKCksIG90aGVyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkpOworfQorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSwgTW9kZT4mCitUcmlhbmd1bGFyVmlld0ltcGw8TWF0cml4VHlwZSwgTW9kZSwgRGVuc2U+OjpvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhckJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGVpZ2VuX2Fzc2VydChNb2RlID09IGludChPdGhlckRlcml2ZWQ6Ok1vZGUpKTsKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBUcmlhbmd1bGFyVmlld0ltcGw8TWF0cml4VHlwZSwgTW9kZSwgRGVuc2U+OjpsYXp5QXNzaWduKGNvbnN0IFRyaWFuZ3VsYXJCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBlaWdlbl9hc3NlcnQoTW9kZSA9PSBpbnQoT3RoZXJEZXJpdmVkOjpNb2RlKSk7CisgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgVHJpYW5ndWxhckJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQXNzaWducyBhIHRyaWFuZ3VsYXIgb3Igc2VsZmFkam9pbnQgbWF0cml4IHRvIGEgZGVuc2UgbWF0cml4LgorICAqIElmIHRoZSBtYXRyaXggaXMgdHJpYW5ndWxhciwgdGhlIG9wcG9zaXRlIHBhcnQgaXMgc2V0IHRvIHplcm8uICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgordm9pZCBUcmlhbmd1bGFyQmFzZTxEZXJpdmVkPjo6ZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIGV2YWxUb0xhenkob3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBUcmlhbmd1bGFyVmlldyBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgTWF0cml4QmFzZSBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSB0cmlhbmd1bGFyIHZpZXcgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQgbWF0cml4CisgICoKKyAgKiBUaGUgcGFyYW1ldGVyIFxhIE1vZGUgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFxjICNVcHBlciwgXGMgI1N0cmljdGx5VXBwZXIsIFxjICNVbml0VXBwZXIsCisgICogXGMgI0xvd2VyLCBcYyAjU3RyaWN0bHlMb3dlciwgXGMgI1VuaXRMb3dlci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdHJpYW5ndWxhclZpZXcuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90cmlhbmd1bGFyVmlldy5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBUcmlhbmd1bGFyVmlldworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPgordHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgVHJpYW5ndWxhclZpZXdSZXR1cm5UeXBlPE1vZGU+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0cmlhbmd1bGFyVmlldygpCit7CisgIHJldHVybiB0eXBlbmFtZSBUcmlhbmd1bGFyVmlld1JldHVyblR5cGU8TW9kZT46OlR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgTWF0cml4QmFzZTo6dHJpYW5ndWxhclZpZXcoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPgordHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgQ29uc3RUcmlhbmd1bGFyVmlld1JldHVyblR5cGU8TW9kZT46OlR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46OnRyaWFuZ3VsYXJWaWV3KCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0VHJpYW5ndWxhclZpZXdSZXR1cm5UeXBlPE1vZGU+OjpUeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXgsCisgICogICAgICAgICAgd2l0aGluIHRoZSBwcmVjaXNpb24gZ2l2ZW4gYnkgXGEgcHJlYy4KKyAgKgorICAqIFxzYSBpc0xvd2VyVHJpYW5ndWxhcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc1VwcGVyVHJpYW5ndWxhcihjb25zdCBSZWFsU2NhbGFyJiBwcmVjKSBjb25zdAoreworICBSZWFsU2NhbGFyIG1heEFic09uVXBwZXJQYXJ0ID0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oLTEpOworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgeworICAgIEluZGV4IG1heGkgPSBudW1leHQ6Om1pbmkoaiwgcm93cygpLTEpOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8PSBtYXhpOyArK2kpCisgICAgeworICAgICAgUmVhbFNjYWxhciBhYnNWYWx1ZSA9IG51bWV4dDo6YWJzKGNvZWZmKGksaikpOworICAgICAgaWYoYWJzVmFsdWUgPiBtYXhBYnNPblVwcGVyUGFydCkgbWF4QWJzT25VcHBlclBhcnQgPSBhYnNWYWx1ZTsKKyAgICB9CisgIH0KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSBtYXhBYnNPblVwcGVyUGFydCAqIHByZWM7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gaisxOyBpIDwgcm93cygpOyArK2kpCisgICAgICBpZihudW1leHQ6OmFicyhjb2VmZihpLCBqKSkgPiB0aHJlc2hvbGQpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gYSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogXHNhIGlzVXBwZXJUcmlhbmd1bGFyKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIE1hdHJpeEJhc2U8RGVyaXZlZD46OmlzTG93ZXJUcmlhbmd1bGFyKGNvbnN0IFJlYWxTY2FsYXImIHByZWMpIGNvbnN0Cit7CisgIFJlYWxTY2FsYXIgbWF4QWJzT25Mb3dlclBhcnQgPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigtMSk7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gajsgaSA8IHJvd3MoKTsgKytpKQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgYWJzVmFsdWUgPSBudW1leHQ6OmFicyhjb2VmZihpLGopKTsKKyAgICAgIGlmKGFic1ZhbHVlID4gbWF4QWJzT25Mb3dlclBhcnQpIG1heEFic09uTG93ZXJQYXJ0ID0gYWJzVmFsdWU7CisgICAgfQorICBSZWFsU2NhbGFyIHRocmVzaG9sZCA9IG1heEFic09uTG93ZXJQYXJ0ICogcHJlYzsKKyAgZm9yKEluZGV4IGogPSAxOyBqIDwgY29scygpOyArK2opCisgIHsKKyAgICBJbmRleCBtYXhpID0gbnVtZXh0OjptaW5pKGosIHJvd3MoKS0xKTsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtYXhpOyArK2kpCisgICAgICBpZihudW1leHQ6OmFicyhjb2VmZihpLCBqKSkgPiB0aHJlc2hvbGQpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEV2YWx1YXRvcnMgYW5kIEFzc2lnbm1lbnQgb2YgdHJpYW5ndWxhciBleHByZXNzaW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgCisvLyBUT0RPIGN1cnJlbnRseSBhIHRyaWFuZ3VsYXIgZXhwcmVzc2lvbiBoYXMgdGhlIGZvcm0gVHJpYW5ndWxhclZpZXc8LiwuPgorLy8gICAgICBpbiB0aGUgZnV0dXJlIHRyaWFuZ3VsYXItbmVzcyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgZXhwcmVzc2lvbiB0cmFpdHMKKy8vICAgICAgc3VjaCB0aGF0IFRyYW5zcG9zZTxUcmlhbmd1bGFyVmlldzwuLC4+ID4gaXMgdmFsaWQuIChjdXJyZW50bHkgVHJpYW5ndWxhckJhc2U6OnRyYW5zcG9zZSgpIGlzIG92ZXJsb2FkZWQgdG8gbWFrZSBpdCB3b3JrKQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+CitzdHJ1Y3QgZXZhbHVhdG9yX3RyYWl0czxUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdG9yYWdlX2tpbmRfdG9fZXZhbHVhdG9yX2tpbmQ8dHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUtpbmQ+OjpLaW5kIEtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ2x1ZV9zaGFwZXM8dHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czxNYXRyaXhUeXBlPjo6U2hhcGUsIFRyaWFuZ3VsYXJTaGFwZT46OnR5cGUgU2hhcGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4KK3N0cnVjdCB1bmFyeV9ldmFsdWF0b3I8VHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSxNb2RlPiwgSW5kZXhCYXNlZD4KKyA6IGV2YWx1YXRvcjx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+IFhwclR5cGU7CisgIHR5cGVkZWYgZXZhbHVhdG9yPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE1hdHJpeFR5cGU+Ojp0eXBlPiBCYXNlOworICB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSAmeHByKSA6IEJhc2UoeHByLm5lc3RlZEV4cHJlc3Npb24oKSkge30KK307CisKKy8vIEFkZGl0aW9uYWwgYXNzaWdubWVudCBraW5kczoKK3N0cnVjdCBUcmlhbmd1bGFyMlRyaWFuZ3VsYXIgICAge307CitzdHJ1Y3QgVHJpYW5ndWxhcjJEZW5zZSAgICAgICAgIHt9Oworc3RydWN0IERlbnNlMlRyaWFuZ3VsYXIgICAgICAgICB7fTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHVuc2lnbmVkIGludCBNb2RlLCBpbnQgVW5yb2xsQ291bnQsIGJvb2wgQ2xlYXJPcHBvc2l0ZT4gc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wOworCisgCisvKiogXGludGVybmFsIFNwZWNpYWxpemF0aW9uIG9mIHRoZSBkZW5zZSBhc3NpZ25tZW50IGtlcm5lbCBmb3IgdHJpYW5ndWxhciBtYXRyaWNlcy4KKyAgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHRyaWFuZ3VsYXIsIGRpYWdvbmFsLCBhbmQgb3Bwb3NpdGUgcGFydHMgYXJlIHByb2Nlc3NlZCB0aHJvdWdoIHRocmVlIGRpZmZlcmVudCBmdW5jdGlvbnMuCisgICogXHRwYXJhbSBVcExvIG11c3QgYmUgZWl0aGVyIExvd2VyIG9yIFVwcGVyCisgICogXHRwYXJhbSBNb2RlIG11c3QgYmUgZWl0aGVyIDAsIFVuaXREaWFnLCBaZXJvRGlhZywgb3IgU2VsZkFkam9pbnQKKyAgKi8KK3RlbXBsYXRlPGludCBVcExvLCBpbnQgTW9kZSwgaW50IFNldE9wcG9zaXRlLCB0eXBlbmFtZSBEc3RFdmFsdWF0b3JUeXBlVCwgdHlwZW5hbWUgU3JjRXZhbHVhdG9yVHlwZVQsIHR5cGVuYW1lIEZ1bmN0b3IsIGludCBWZXJzaW9uID0gU3BlY2lhbGl6ZWQ+CitjbGFzcyB0cmlhbmd1bGFyX2RlbnNlX2Fzc2lnbm1lbnRfa2VybmVsIDogcHVibGljIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBGdW5jdG9yLCBWZXJzaW9uPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIGdlbmVyaWNfZGVuc2VfYXNzaWdubWVudF9rZXJuZWw8RHN0RXZhbHVhdG9yVHlwZVQsIFNyY0V2YWx1YXRvclR5cGVULCBGdW5jdG9yLCBWZXJzaW9uPiBCYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkRzdFhwclR5cGUgRHN0WHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTcmNYcHJUeXBlIFNyY1hwclR5cGU7CisgIHVzaW5nIEJhc2U6Om1fZHN0OworICB1c2luZyBCYXNlOjptX3NyYzsKKyAgdXNpbmcgQmFzZTo6bV9mdW5jdG9yOworcHVibGljOgorICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpEc3RFdmFsdWF0b3JUeXBlIERzdEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U3JjRXZhbHVhdG9yVHlwZSBTcmNFdmFsdWF0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6QXNzaWdubWVudFRyYWl0cyBBc3NpZ25tZW50VHJhaXRzOworICAKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIHRyaWFuZ3VsYXJfZGVuc2VfYXNzaWdubWVudF9rZXJuZWwoRHN0RXZhbHVhdG9yVHlwZSAmZHN0LCBjb25zdCBTcmNFdmFsdWF0b3JUeXBlICZzcmMsIGNvbnN0IEZ1bmN0b3IgJmZ1bmMsIERzdFhwclR5cGUmIGRzdEV4cHIpCisgICAgOiBCYXNlKGRzdCwgc3JjLCBmdW5jLCBkc3RFeHByKQorICB7fQorICAKKyNpZmRlZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBhc3NpZ25Db2VmZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyb3chPWNvbCk7CisgICAgQmFzZTo6YXNzaWduQ29lZmYocm93LGNvbCk7CisgIH0KKyNlbHNlCisgIHVzaW5nIEJhc2U6OmFzc2lnbkNvZWZmOworI2VuZGlmCisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGFzc2lnbkRpYWdvbmFsQ29lZmYoSW5kZXggaWQpCisgIHsKKyAgICAgICAgIGlmKE1vZGU9PVVuaXREaWFnICYmIFNldE9wcG9zaXRlKSBtX2Z1bmN0b3IuYXNzaWduQ29lZmYobV9kc3QuY29lZmZSZWYoaWQsaWQpLCBTY2FsYXIoMSkpOworICAgIGVsc2UgaWYoTW9kZT09WmVyb0RpYWcgJiYgU2V0T3Bwb3NpdGUpIG1fZnVuY3Rvci5hc3NpZ25Db2VmZihtX2RzdC5jb2VmZlJlZihpZCxpZCksIFNjYWxhcigwKSk7CisgICAgZWxzZSBpZihNb2RlPT0wKSAgICAgICAgICAgICAgICAgICAgICAgQmFzZTo6YXNzaWduQ29lZmYoaWQsaWQpOworICB9CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGFzc2lnbk9wcG9zaXRlQ29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgIHsgCisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyE9Y29sKTsKKyAgICBpZihTZXRPcHBvc2l0ZSkKKyAgICAgIG1fZnVuY3Rvci5hc3NpZ25Db2VmZihtX2RzdC5jb2VmZlJlZihyb3csY29sKSwgU2NhbGFyKDApKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE1vZGUsIGJvb2wgU2V0T3Bwb3NpdGUsIHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCit2b2lkIGNhbGxfdHJpYW5ndWxhcl9hc3NpZ25tZW50X2xvb3AoRHN0WHByVHlwZSYgZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMsIGNvbnN0IEZ1bmN0b3IgJmZ1bmMpCit7CisgIHR5cGVkZWYgZXZhbHVhdG9yPERzdFhwclR5cGU+IERzdEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFNyY1hwclR5cGU+IFNyY0V2YWx1YXRvclR5cGU7CisKKyAgU3JjRXZhbHVhdG9yVHlwZSBzcmNFdmFsdWF0b3Ioc3JjKTsKKworICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgIGlmKChkc3Qucm93cygpIT1kc3RSb3dzKSB8fCAoZHN0LmNvbHMoKSE9ZHN0Q29scykpCisgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKyAgRHN0RXZhbHVhdG9yVHlwZSBkc3RFdmFsdWF0b3IoZHN0KTsKKyAgICAKKyAgdHlwZWRlZiB0cmlhbmd1bGFyX2RlbnNlX2Fzc2lnbm1lbnRfa2VybmVsPCBNb2RlJihMb3dlcnxVcHBlciksTW9kZSYoVW5pdERpYWd8WmVyb0RpYWd8U2VsZkFkam9pbnQpLFNldE9wcG9zaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdEV2YWx1YXRvclR5cGUsU3JjRXZhbHVhdG9yVHlwZSxGdW5jdG9yPiBLZXJuZWw7CisgIEtlcm5lbCBrZXJuZWwoZHN0RXZhbHVhdG9yLCBzcmNFdmFsdWF0b3IsIGZ1bmMsIGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7CisgIAorICBlbnVtIHsKKyAgICAgIHVucm9sbCA9IERzdFhwclR5cGU6OlNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMKKyAgICAgICAgICAgICYmIFNyY0V2YWx1YXRvclR5cGU6OkNvZWZmUmVhZENvc3QgPCBIdWdlQ29zdAorICAgICAgICAgICAgJiYgRHN0WHByVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgKiAoRHN0RXZhbHVhdG9yVHlwZTo6Q29lZmZSZWFkQ29zdCtTcmNFdmFsdWF0b3JUeXBlOjpDb2VmZlJlYWRDb3N0KSAvIDIgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisgICAgfTsKKyAgCisgIHRyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgTW9kZSwgdW5yb2xsID8gaW50KERzdFhwclR5cGU6OlNpemVBdENvbXBpbGVUaW1lKSA6IER5bmFtaWMsIFNldE9wcG9zaXRlPjo6cnVuKGtlcm5lbCk7Cit9CisKK3RlbXBsYXRlPGludCBNb2RlLCBib29sIFNldE9wcG9zaXRlLCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQordm9pZCBjYWxsX3RyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wKERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKQoreworICBjYWxsX3RyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPE1vZGUsU2V0T3Bwb3NpdGU+KGRzdCwgc3JjLCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworfQorCit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxUcmlhbmd1bGFyU2hhcGUsVHJpYW5ndWxhclNoYXBlPiB7IHR5cGVkZWYgVHJpYW5ndWxhcjJUcmlhbmd1bGFyIEtpbmQ7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxEZW5zZVNoYXBlLFRyaWFuZ3VsYXJTaGFwZT4gICAgICB7IHR5cGVkZWYgVHJpYW5ndWxhcjJEZW5zZSAgICAgIEtpbmQ7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxUcmlhbmd1bGFyU2hhcGUsRGVuc2VTaGFwZT4gICAgICB7IHR5cGVkZWYgRGVuc2UyVHJpYW5ndWxhciAgICAgIEtpbmQ7IH07CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTcmNYcHJUeXBlLCBGdW5jdG9yLCBUcmlhbmd1bGFyMlRyaWFuZ3VsYXI+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgRnVuY3RvciAmZnVuYykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChpbnQoRHN0WHByVHlwZTo6TW9kZSkgPT0gaW50KFNyY1hwclR5cGU6Ok1vZGUpKTsKKyAgICAKKyAgICBjYWxsX3RyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPERzdFhwclR5cGU6Ok1vZGUsIGZhbHNlPihkc3QsIHNyYywgZnVuYyk7ICAKKyAgfQorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTcmNYcHJUeXBlLCBGdW5jdG9yLCBUcmlhbmd1bGFyMkRlbnNlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IEZ1bmN0b3IgJmZ1bmMpCisgIHsKKyAgICBjYWxsX3RyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPFNyY1hwclR5cGU6Ok1vZGUsIChTcmNYcHJUeXBlOjpNb2RlJlNlbGZBZGpvaW50KT09MD4oZHN0LCBzcmMsIGZ1bmMpOyAgCisgIH0KK307CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3JjWHByVHlwZSwgRnVuY3RvciwgRGVuc2UyVHJpYW5ndWxhcj4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBGdW5jdG9yICZmdW5jKQorICB7CisgICAgY2FsbF90cmlhbmd1bGFyX2Fzc2lnbm1lbnRfbG9vcDxEc3RYcHJUeXBlOjpNb2RlLCBmYWxzZT4oZHN0LCBzcmMsIGZ1bmMpOyAgCisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB1bnNpZ25lZCBpbnQgTW9kZSwgaW50IFVucm9sbENvdW50LCBib29sIFNldE9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wCit7CisgIC8vIEZJWE1FOiB0aGlzIGlzIG5vdCB2ZXJ5IGNsZWFuLCBwZXJoYXBzIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWw/CisgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpEc3RFdmFsdWF0b3JUeXBlIERzdEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0RXZhbHVhdG9yVHlwZTo6WHByVHlwZSBEc3RYcHJUeXBlOworICAKKyAgZW51bSB7CisgICAgY29sID0gKFVucm9sbENvdW50LTEpIC8gRHN0WHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgcm93ID0gKFVucm9sbENvdW50LTEpICUgRHN0WHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpTY2FsYXIgU2NhbGFyOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oS2VybmVsICZrZXJuZWwpCisgIHsKKyAgICB0cmlhbmd1bGFyX2Fzc2lnbm1lbnRfbG9vcDxLZXJuZWwsIE1vZGUsIFVucm9sbENvdW50LTEsIFNldE9wcG9zaXRlPjo6cnVuKGtlcm5lbCk7CisgICAgCisgICAgaWYocm93PT1jb2wpCisgICAgICBrZXJuZWwuYXNzaWduRGlhZ29uYWxDb2VmZihyb3cpOworICAgIGVsc2UgaWYoICgoTW9kZSZMb3dlcikgJiYgcm93PmNvbCkgfHwgKChNb2RlJlVwcGVyKSAmJiByb3c8Y29sKSApCisgICAgICBrZXJuZWwuYXNzaWduQ29lZmYocm93LGNvbCk7CisgICAgZWxzZSBpZihTZXRPcHBvc2l0ZSkKKyAgICAgIGtlcm5lbC5hc3NpZ25PcHBvc2l0ZUNvZWZmKHJvdyxjb2wpOworICB9Cit9OworCisvLyBwcmV2ZW50IGJ1Z2d5IHVzZXIgY29kZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgcmVjdXJzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHVuc2lnbmVkIGludCBNb2RlLCBib29sIFNldE9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgTW9kZSwgMCwgU2V0T3Bwb3NpdGU+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oS2VybmVsICYpIHt9Cit9OworCisKKworLy8gVE9ETzogZXhwZXJpbWVudCB3aXRoIGEgcmVjdXJzaXZlIGFzc2lnbm1lbnQgcHJvY2VkdXJlIHNwbGl0dGluZyB0aGUgY3VycmVudAorLy8gICAgICAgdHJpYW5ndWxhciBwYXJ0IGludG8gb25lIHJlY3Rhbmd1bGFyIGFuZCB0d28gdHJpYW5ndWxhciBwYXJ0cy4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHVuc2lnbmVkIGludCBNb2RlLCBib29sIFNldE9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPEtlcm5lbCwgTW9kZSwgRHluYW1pYywgU2V0T3Bwb3NpdGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgS2VybmVsOjpTY2FsYXIgU2NhbGFyOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKEtlcm5lbCAma2VybmVsKQorICB7CisgICAgZm9yKEluZGV4IGogPSAwOyBqIDwga2VybmVsLmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIEluZGV4IG1heGkgPSBudW1leHQ6Om1pbmkoaiwga2VybmVsLnJvd3MoKSk7CisgICAgICBJbmRleCBpID0gMDsKKyAgICAgIGlmICgoKE1vZGUmTG93ZXIpICYmIFNldE9wcG9zaXRlKSB8fCAoTW9kZSZVcHBlcikpCisgICAgICB7CisgICAgICAgIGZvcig7IGkgPCBtYXhpOyArK2kpCisgICAgICAgICAgaWYoTW9kZSZVcHBlcikga2VybmVsLmFzc2lnbkNvZWZmKGksIGopOworICAgICAgICAgIGVsc2UgICAgICAgICAgIGtlcm5lbC5hc3NpZ25PcHBvc2l0ZUNvZWZmKGksIGopOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBpID0gbWF4aTsKKyAgICAgIAorICAgICAgaWYoaTxrZXJuZWwucm93cygpKSAvLyB0aGVuIGk9PWoKKyAgICAgICAga2VybmVsLmFzc2lnbkRpYWdvbmFsQ29lZmYoaSsrKTsKKyAgICAgIAorICAgICAgaWYgKCgoTW9kZSZVcHBlcikgJiYgU2V0T3Bwb3NpdGUpIHx8IChNb2RlJkxvd2VyKSkKKyAgICAgIHsKKyAgICAgICAgZm9yKDsgaSA8IGtlcm5lbC5yb3dzKCk7ICsraSkKKyAgICAgICAgICBpZihNb2RlJkxvd2VyKSBrZXJuZWwuYXNzaWduQ29lZmYoaSwgaik7CisgICAgICAgICAgZWxzZSAgICAgICAgICAga2VybmVsLmFzc2lnbk9wcG9zaXRlQ29lZmYoaSwgaik7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIEFzc2lnbnMgYSB0cmlhbmd1bGFyIG9yIHNlbGZhZGpvaW50IG1hdHJpeCB0byBhIGRlbnNlIG1hdHJpeC4KKyAgKiBJZiB0aGUgbWF0cml4IGlzIHRyaWFuZ3VsYXIsIHRoZSBvcHBvc2l0ZSBwYXJ0IGlzIHNldCB0byB6ZXJvLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KK3ZvaWQgVHJpYW5ndWxhckJhc2U8RGVyaXZlZD46OmV2YWxUb0xhenkoTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgb3RoZXIuZGVyaXZlZCgpLnJlc2l6ZSh0aGlzLT5yb3dzKCksIHRoaXMtPmNvbHMoKSk7CisgIGludGVybmFsOjpjYWxsX3RyaWFuZ3VsYXJfYXNzaWdubWVudF9sb29wPERlcml2ZWQ6Ok1vZGUsKERlcml2ZWQ6Ok1vZGUmU2VsZkFkam9pbnQpPT0wIC8qIFNldE9wcG9zaXRlICovPihvdGhlci5kZXJpdmVkKCksIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKKy8vIFRyaWFuZ3VsYXIgPSBQcm9kdWN0Cit0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFByb2R1Y3Q8TGhzLFJocyxEZWZhdWx0UHJvZHVjdD4sIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocyxEZWZhdWx0UHJvZHVjdD46OlNjYWxhcj4sIERlbnNlMlRyaWFuZ3VsYXI+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0PiBTcmNYcHJUeXBlOworICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIEluZGV4IGRzdFJvd3MgPSBzcmMucm93cygpOworICAgIEluZGV4IGRzdENvbHMgPSBzcmMuY29scygpOworICAgIGlmKChkc3Qucm93cygpIT1kc3RSb3dzKSB8fCAoZHN0LmNvbHMoKSE9ZHN0Q29scykpCisgICAgICBkc3QucmVzaXplKGRzdFJvd3MsIGRzdENvbHMpOworCisgICAgZHN0Ll9hc3NpZ25Qcm9kdWN0KHNyYywgMSwgMCk7CisgIH0KK307CisKKy8vIFRyaWFuZ3VsYXIgKz0gUHJvZHVjdAordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBQcm9kdWN0PExocyxSaHMsRGVmYXVsdFByb2R1Y3Q+LCBpbnRlcm5hbDo6YWRkX2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0Pjo6U2NhbGFyPiwgRGVuc2UyVHJpYW5ndWxhcj4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocyxSaHMsRGVmYXVsdFByb2R1Y3Q+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIGRzdC5fYXNzaWduUHJvZHVjdChzcmMsIDEsIDEpOworICB9Cit9OworCisvLyBUcmlhbmd1bGFyIC09IFByb2R1Y3QKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0PiwgaW50ZXJuYWw6OnN1Yl9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocyxEZWZhdWx0UHJvZHVjdD46OlNjYWxhcj4sIERlbnNlMlRyaWFuZ3VsYXI+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsUmhzLERlZmF1bHRQcm9kdWN0PiBTcmNYcHJUeXBlOworICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+ICYpCisgIHsKKyAgICBkc3QuX2Fzc2lnblByb2R1Y3Qoc3JjLCAtMSwgMSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1RSSUFOR1VMQVJNQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVmVjdG9yQmxvY2suaCBiL0VpZ2VuL3NyYy9Db3JlL1ZlY3RvckJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyZmJmNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1ZlY3RvckJsb2NrLmgKQEAgLTAsMCArMSw5NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9WRUNUT1JCTE9DS19ICisjZGVmaW5lIEVJR0VOX1ZFQ1RPUkJMT0NLX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLCBpbnQgU2l6ZT4KK3N0cnVjdCB0cmFpdHM8VmVjdG9yQmxvY2s8VmVjdG9yVHlwZSwgU2l6ZT4gPgorICA6IHB1YmxpYyB0cmFpdHM8QmxvY2s8VmVjdG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHRyYWl0czxWZWN0b3JUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IDEgOiBTaXplLAorICAgICAgICAgICAgICAgICAgICAgdHJhaXRzPFZlY3RvclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0ID8gU2l6ZSA6IDE+ID4KK3sKK307Cit9CisKKy8qKiBcY2xhc3MgVmVjdG9yQmxvY2sKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIG9yIGR5bmFtaWMtc2l6ZSBzdWItdmVjdG9yCisgICoKKyAgKiBcdHBhcmFtIFZlY3RvclR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpbiB3aGljaCB3ZSBhcmUgdGFraW5nIGEgc3ViLXZlY3RvcgorICAqIFx0cGFyYW0gU2l6ZSBzaXplIG9mIHRoZSBzdWItdmVjdG9yIHdlIGFyZSB0YWtpbmcgYXQgY29tcGlsZSB0aW1lIChvcHRpb25hbCkKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIGVpdGhlciBhIGZpeGVkLXNpemUgb3IgZHluYW1pYy1zaXplIHN1Yi12ZWN0b3IuCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCkgYW5kIERlbnNlQmFzZTo6c2VnbWVudDxpbnQ+KEluZGV4KSBhbmQKKyAgKiBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBkaXJlY3RseSBtYW5pcHV0YXRlIHN1Yi12ZWN0b3IgZXhwcmVzc2lvbnMsCisgICogZm9yIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gZXhwcmVzc2lvbiwgeW91CisgICogd2lsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgorICAqCisgICogSGVyZSBpcyBhbiBleGFtcGxlIGlsbHVzdHJhdGluZyB0aGUgZHluYW1pYyBjYXNlOgorICAqIFxpbmNsdWRlIGNsYXNzX1ZlY3RvckJsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX1ZlY3RvckJsb2NrLm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhpcyBleHByZXNzaW9uIGhhcyBkeW5hbWljIHNpemUsIGluIHRoZSBjYXNlIHdoZXJlIFxhIFZlY3RvclR5cGUKKyAgKiBoYXMgZml4ZWQgc2l6ZSwgdGhpcyBleHByZXNzaW9uIGluaGVyaXRzIGEgZml4ZWQgbWF4aW1hbCBzaXplIHdoaWNoIG1lYW5zIHRoYXQgZXZhbHVhdGluZworICAqIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBpbGx1c3RyYXRpbmcgdGhlIGZpeGVkLXNpemUgY2FzZToKKyAgKiBcaW5jbHVkZSBjbGFzc19GaXhlZFZlY3RvckJsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0ZpeGVkVmVjdG9yQmxvY2sub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCxJbmRleCxJbmRleCksIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGUsIGludCBTaXplPiBjbGFzcyBWZWN0b3JCbG9jaworICA6IHB1YmxpYyBCbG9jazxWZWN0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxWZWN0b3JUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IDEgOiBTaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxWZWN0b3JUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IFNpemUgOiAxPgoreworICAgIHR5cGVkZWYgQmxvY2s8VmVjdG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8VmVjdG9yVHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQgPyAxIDogU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8VmVjdG9yVHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQgPyBTaXplIDogMT4gQmFzZTsKKyAgICBlbnVtIHsKKyAgICAgIElzQ29sVmVjdG9yID0gIShpbnRlcm5hbDo6dHJhaXRzPFZlY3RvclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0KQorICAgIH07CisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFZlY3RvckJsb2NrKQorCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGlubGluZSBWZWN0b3JCbG9jayhWZWN0b3JUeXBlJiB2ZWN0b3IsIEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKQorICAgICAgOiBCYXNlKHZlY3RvciwKKyAgICAgICAgICAgICBJc0NvbFZlY3RvciA/IHN0YXJ0IDogMCwgSXNDb2xWZWN0b3IgPyAwIDogc3RhcnQsCisgICAgICAgICAgICAgSXNDb2xWZWN0b3IgPyBzaXplICA6IDEsIElzQ29sVmVjdG9yID8gMSA6IHNpemUpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShWZWN0b3JCbG9jayk7CisgICAgfQorCisgICAgLyoqIEZpeGVkLXNpemUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgVmVjdG9yQmxvY2soVmVjdG9yVHlwZSYgdmVjdG9yLCBJbmRleCBzdGFydCkKKyAgICAgIDogQmFzZSh2ZWN0b3IsIElzQ29sVmVjdG9yID8gc3RhcnQgOiAwLCBJc0NvbFZlY3RvciA/IDAgOiBzdGFydCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKFZlY3RvckJsb2NrKTsKKyAgICB9Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVkVDVE9SQkxPQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVmVjdG9yd2lzZU9wLmggYi9FaWdlbi9zcmMvQ29yZS9WZWN0b3J3aXNlT3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUyNjdlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvVmVjdG9yd2lzZU9wLmgKQEAgLTAsMCArMSw2OTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFSVElBTF9SRURVWF9ICisjZGVmaW5lIEVJR0VOX1BBUlRJQUxfUkVEVVhfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFBhcnRpYWxSZWR1eEV4cHIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyaWMgZXhwcmVzc2lvbiBvZiBhIHBhcnRpYWxseSByZWR1eGVkIG1hdHJpeAorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggd2UgYXJlIGFwcGx5aW5nIHRoZSByZWR1eCBvcGVyYXRpb24KKyAgKiBcdHBhcmFtIE1lbWJlck9wIHR5cGUgb2YgdGhlIG1lbWJlciBmdW5jdG9yCisgICogXHRwYXJhbSBEaXJlY3Rpb24gaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJlZHV4ICgjVmVydGljYWwgb3IgI0hvcml6b250YWwpCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiBhIHBhcnRpYWwgcmVkdXggb3BlcmF0b3Igb2YgYSBtYXRyaXguCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIHNvbWUgVmVjdG9yd2lzZU9wIGZ1bmN0aW9ucywKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIGNsYXNzIFZlY3Rvcndpc2VPcAorICAqLworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgTWVtYmVyT3AsIGludCBEaXJlY3Rpb24+CitjbGFzcyBQYXJ0aWFsUmVkdXhFeHByOworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgTWVtYmVyT3AsIGludCBEaXJlY3Rpb24+CitzdHJ1Y3QgdHJhaXRzPFBhcnRpYWxSZWR1eEV4cHI8TWF0cml4VHlwZSwgTWVtYmVyT3AsIERpcmVjdGlvbj4gPgorIDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWVtYmVyT3A6OnJlc3VsdF90eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6WHByS2luZCBYcHJLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBJbnB1dFNjYWxhcjsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyAxIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyAxIDogTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MgPSBSb3dzQXRDb21waWxlVGltZSA9PSAxID8gUm93TWFqb3JCaXQgOiAwLAorICAgIFRyYXZlcnNhbFNpemUgPSBEaXJlY3Rpb249PVZlcnRpY2FsID8gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgOiAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBNZW1iZXJPcCwgaW50IERpcmVjdGlvbj4KK2NsYXNzIFBhcnRpYWxSZWR1eEV4cHIgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBQYXJ0aWFsUmVkdXhFeHByPE1hdHJpeFR5cGUsIE1lbWJlck9wLCBEaXJlY3Rpb24+ID46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UGFydGlhbFJlZHV4RXhwcj46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFBhcnRpYWxSZWR1eEV4cHIpCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IFBhcnRpYWxSZWR1eEV4cHIoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBNZW1iZXJPcCYgZnVuYyA9IE1lbWJlck9wKCkpCisgICAgICA6IG1fbWF0cml4KG1hdCksIG1fZnVuY3RvcihmdW5jKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gKERpcmVjdGlvbj09VmVydGljYWwgICA/IDEgOiBtX21hdHJpeC5yb3dzKCkpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gKERpcmVjdGlvbj09SG9yaXpvbnRhbCA/IDEgOiBtX21hdHJpeC5jb2xzKCkpOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgTWVtYmVyT3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworICAgIGNvbnN0IE1lbWJlck9wIG1fZnVuY3RvcjsKK307CisKKyNkZWZpbmUgRUlHRU5fTUVNQkVSX0ZVTkNUT1IoTUVNQkVSLENPU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IG1lbWJlcl8jI01FTUJFUiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihtZW1iZXJfIyNNRU1CRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFJlc3VsdFR5cGUgcmVzdWx0X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTaXplPiBzdHJ1Y3QgQ29zdCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IGVudW0geyB2YWx1ZSA9IENPU1QgfTsgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXN1bHRUeXBlIG9wZXJhdG9yKCkoY29uc3QgWHByVHlwZSYgbWF0KSBjb25zdCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHJldHVybiBtYXQuTUVNQkVSKCk7IH0gXAorICB9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0VJR0VOX01FTUJFUl9GVU5DVE9SKHNxdWFyZWROb3JtLCBTaXplICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKyAoU2l6ZS0xKSpOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihub3JtLCAoU2l6ZSs1KSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1Ioc3RhYmxlTm9ybSwgKFNpemUrNSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKGJsdWVOb3JtLCAoU2l6ZSs1KSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IoaHlwb3ROb3JtLCAoU2l6ZS0xKSAqIGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9oeXBvdF9vcDxTY2FsYXI+ID46OkNvc3QgKTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKHN1bSwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IobWVhbiwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKyBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihtaW5Db2VmZiwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IobWF4Q29lZmYsIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKGFsbCwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IoYW55LCAoU2l6ZS0xKSpOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihjb3VudCwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IocHJvZCwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QpOworCit0ZW1wbGF0ZSA8aW50IHAsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgbWVtYmVyX2xwbm9ybSB7CisgIHR5cGVkZWYgUmVzdWx0VHlwZSByZXN1bHRfdHlwZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZT4gc3RydWN0IENvc3QKKyAgeyBlbnVtIHsgdmFsdWUgPSAoU2l6ZSs1KSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgfTsgfTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgbWVtYmVyX2xwbm9ybSgpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSZXN1bHRUeXBlIG9wZXJhdG9yKCkoY29uc3QgWHByVHlwZSYgbWF0KSBjb25zdAorICB7IHJldHVybiBtYXQudGVtcGxhdGUgbHBOb3JtPHA+KCk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IG1lbWJlcl9yZWR1eCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3AoY29uc3QgU2NhbGFyJixjb25zdCBTY2FsYXImKQorICAgICAgICAgICAgICAgICAgID46OnR5cGUgIHJlc3VsdF90eXBlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgU2l6ZT4gc3RydWN0IENvc3QKKyAgeyBlbnVtIHsgdmFsdWUgPSAoU2l6ZS0xKSAqIGZ1bmN0b3JfdHJhaXRzPEJpbmFyeU9wPjo6Q29zdCB9OyB9OworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBtZW1iZXJfcmVkdXgoY29uc3QgQmluYXJ5T3AgZnVuYykgOiBtX2Z1bmN0b3IoZnVuYykge30KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+JiBtYXQpIGNvbnN0CisgIHsgcmV0dXJuIG1hdC5yZWR1eChtX2Z1bmN0b3IpOyB9CisgIGNvbnN0IEJpbmFyeU9wIG1fZnVuY3RvcjsKK307Cit9CisKKy8qKiBcY2xhc3MgVmVjdG9yd2lzZU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQc2V1ZG8gZXhwcmVzc2lvbiBwcm92aWRpbmcgcGFydGlhbCByZWR1Y3Rpb24gb3BlcmF0aW9ucworICAqCisgICogXHRwYXJhbSBFeHByZXNzaW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRvIGRvIHBhcnRpYWwgcmVkdWN0aW9ucworICAqIFx0cGFyYW0gRGlyZWN0aW9uIGluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSByZWR1eCAoI1ZlcnRpY2FsIG9yICNIb3Jpem9udGFsKQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHNldWRvIGV4cHJlc3Npb24gd2l0aCBwYXJ0aWFsIHJlZHVjdGlvbiBmZWF0dXJlcy4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgRGVuc2VCYXNlOjpjb2x3aXNlKCkgYW5kIERlbnNlQmFzZTo6cm93d2lzZSgpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY29sd2lzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2NvbHdpc2Uub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpjb2x3aXNlKCksIERlbnNlQmFzZTo6cm93d2lzZSgpLCBjbGFzcyBQYXJ0aWFsUmVkdXhFeHByCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IERpcmVjdGlvbj4gY2xhc3MgVmVjdG9yd2lzZU9wCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxFeHByZXNzaW9uVHlwZT46Om5vbl9jb25zdF90eXBlIEV4cHJlc3Npb25UeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RXhwcmVzc2lvblR5cGVOZXN0ZWQ+Ojp0eXBlIEV4cHJlc3Npb25UeXBlTmVzdGVkQ2xlYW5lZDsKKworICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IGNsYXNzIEZ1bmN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyXz1TY2FsYXI+IHN0cnVjdCBSZXR1cm5UeXBlCisgICAgeworICAgICAgdHlwZWRlZiBQYXJ0aWFsUmVkdXhFeHByPEV4cHJlc3Npb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0b3I8U2NhbGFyXz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IFR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wPiBzdHJ1Y3QgUmVkdXhSZXR1cm5UeXBlCisgICAgeworICAgICAgdHlwZWRlZiBQYXJ0aWFsUmVkdXhFeHByPEV4cHJlc3Npb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjptZW1iZXJfcmVkdXg8QmluYXJ5T3AsU2NhbGFyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gVHlwZTsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICBpc1ZlcnRpY2FsICAgPSAoRGlyZWN0aW9uPT1WZXJ0aWNhbCkgPyAxIDogMCwKKyAgICAgIGlzSG9yaXpvbnRhbCA9IChEaXJlY3Rpb249PUhvcml6b250YWwpID8gMSA6IDAKKyAgICB9OworCisgIHByb3RlY3RlZDoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGlzVmVydGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OkNvbFhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6Um93WHByPjo6dHlwZSBTdWJWZWN0b3I7CisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBccmV0dXJucyB0aGUgaS10aCBzdWJ2ZWN0b3IgYWNjb3JkaW5nIHRvIHRoZSBcYyBEaXJlY3Rpb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIFN1YlZlY3RvciBzdWJWZWN0b3IoSW5kZXggaSkKKyAgICB7CisgICAgICByZXR1cm4gU3ViVmVjdG9yKG1fbWF0cml4LmRlcml2ZWQoKSxpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VidmVjdG9ycyBpbiB0aGUgZGlyZWN0aW9uIFxjIERpcmVjdGlvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgSW5kZXggc3ViVmVjdG9ycygpIGNvbnN0CisgICAgeyByZXR1cm4gaXNWZXJ0aWNhbD9tX21hdHJpeC5jb2xzKCk6bV9tYXRyaXgucm93cygpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHN0cnVjdCBFeHRlbmRlZFR5cGUgeworICAgICAgdHlwZWRlZiBSZXBsaWNhdGU8T3RoZXJEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCAgID8gMSA6IEV4cHJlc3Npb25UeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IDEgOiBFeHByZXNzaW9uVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFR5cGU7CisgICAgfTsKKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogUmVwbGljYXRlcyBhIHZlY3RvciB0byBtYXRjaCB0aGUgc2l6ZSBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIEV4dGVuZGVkVHlwZTxPdGhlckRlcml2ZWQ+OjpUeXBlCisgICAgZXh0ZW5kZWRUbyhjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFSUdFTl9JTVBMSUVTKGlzVmVydGljYWwsIE90aGVyRGVyaXZlZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBZT1VfUEFTU0VEX0FfUk9XX1ZFQ1RPUl9CVVRfQV9DT0xVTU5fVkVDVE9SX1dBU19FWFBFQ1RFRCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhpc0hvcml6b250YWwsIE90aGVyRGVyaXZlZDo6TWF4Um93c0F0Q29tcGlsZVRpbWU9PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBZT1VfUEFTU0VEX0FfQ09MVU1OX1ZFQ1RPUl9CVVRfQV9ST1dfVkVDVE9SX1dBU19FWFBFQ1RFRCkKKyAgICAgIHJldHVybiB0eXBlbmFtZSBFeHRlbmRlZFR5cGU8T3RoZXJEZXJpdmVkPjo6VHlwZQorICAgICAgICAgICAgICAgICAgICAgIChvdGhlci5kZXJpdmVkKCksCisgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwgICA/IDEgOiBtX21hdHJpeC5yb3dzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IDEgOiBtX21hdHJpeC5jb2xzKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gc3RydWN0IE9wcG9zaXRlRXh0ZW5kZWRUeXBlIHsKKyAgICAgIHR5cGVkZWYgUmVwbGljYXRlPE90aGVyRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbCA/IDEgOiBFeHByZXNzaW9uVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsICAgPyAxIDogRXhwcmVzc2lvblR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBUeXBlOworICAgIH07CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFJlcGxpY2F0ZXMgYSB2ZWN0b3IgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiB0byBtYXRjaCB0aGUgc2l6ZSBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHR5cGVuYW1lIE9wcG9zaXRlRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICBleHRlbmRlZFRvT3Bwb3NpdGUoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhpc0hvcml6b250YWwsIE90aGVyRGVyaXZlZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBZT1VfUEFTU0VEX0FfUk9XX1ZFQ1RPUl9CVVRfQV9DT0xVTU5fVkVDVE9SX1dBU19FWFBFQ1RFRCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhpc1ZlcnRpY2FsLCBPdGhlckRlcml2ZWQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lPT0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWU9VX1BBU1NFRF9BX0NPTFVNTl9WRUNUT1JfQlVUX0FfUk9XX1ZFQ1RPUl9XQVNfRVhQRUNURUQpCisgICAgICByZXR1cm4gdHlwZW5hbWUgT3Bwb3NpdGVFeHRlbmRlZFR5cGU8T3RoZXJEZXJpdmVkPjo6VHlwZQorICAgICAgICAgICAgICAgICAgICAgIChvdGhlci5kZXJpdmVkKCksCisgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXpvbnRhbCAgPyAxIDogbV9tYXRyaXgucm93cygpLAorICAgICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsICAgID8gMSA6IG1fbWF0cml4LmNvbHMoKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IGlubGluZSBWZWN0b3J3aXNlT3AoRXhwcmVzc2lvblR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpIHt9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBpbmxpbmUgY29uc3QgRXhwcmVzc2lvblR5cGUmIF9leHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyBvciBjb2x1bW4gdmVjdG9yIGV4cHJlc3Npb24gb2YgXGMgKnRoaXMgcmVkdXhlZCBieSBcYSBmdW5jCisgICAgICAqCisgICAgICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQmluYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IKKyAgICAgICogb2YgdGhlIGN1c3RvbSByZWR1eCBvcGVyYXRvci4gTm90ZSB0aGF0IGZ1bmMgbXVzdCBiZSBhbiBhc3NvY2lhdGl2ZSBvcGVyYXRvci4KKyAgICAgICoKKyAgICAgICogXHNhIGNsYXNzIFZlY3Rvcndpc2VPcCwgRGVuc2VCYXNlOjpjb2x3aXNlKCksIERlbnNlQmFzZTo6cm93d2lzZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgUmVkdXhSZXR1cm5UeXBlPEJpbmFyeU9wPjo6VHlwZQorICAgIHJlZHV4KGNvbnN0IEJpbmFyeU9wJiBmdW5jID0gQmluYXJ5T3AoKSkgY29uc3QKKyAgICB7IHJldHVybiB0eXBlbmFtZSBSZWR1eFJldHVyblR5cGU8QmluYXJ5T3A+OjpUeXBlKF9leHByZXNzaW9uKCksIGludGVybmFsOjptZW1iZXJfcmVkdXg8QmluYXJ5T3AsU2NhbGFyPihmdW5jKSk7IH0KKworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmV0dXJuVHlwZTxpbnRlcm5hbDo6bWVtYmVyX21pbkNvZWZmPjo6VHlwZSBNaW5Db2VmZlJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbWF4Q29lZmY+OjpUeXBlIE1heENvZWZmUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9zcXVhcmVkTm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBTcXVhcmVkTm9ybVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBOb3JtUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9ibHVlTm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBCbHVlTm9ybVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfc3RhYmxlTm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBTdGFibGVOb3JtUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9oeXBvdE5vcm0sUmVhbFNjYWxhcj46OlR5cGUgSHlwb3ROb3JtUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9zdW0+OjpUeXBlIFN1bVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbWVhbj46OlR5cGUgTWVhblJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfYWxsPjo6VHlwZSBBbGxSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmV0dXJuVHlwZTxpbnRlcm5hbDo6bWVtYmVyX2FueT46OlR5cGUgQW55UmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIFBhcnRpYWxSZWR1eEV4cHI8RXhwcmVzc2lvblR5cGUsIGludGVybmFsOjptZW1iZXJfY291bnQ8SW5kZXg+LCBEaXJlY3Rpb24+IENvdW50UmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9wcm9kPjo6VHlwZSBQcm9kUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIFJldmVyc2U8Y29uc3QgRXhwcmVzc2lvblR5cGUsIERpcmVjdGlvbj4gQ29uc3RSZXZlcnNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIFJldmVyc2U8RXhwcmVzc2lvblR5cGUsIERpcmVjdGlvbj4gUmV2ZXJzZVJldHVyblR5cGU7CisKKyAgICB0ZW1wbGF0ZTxpbnQgcD4gc3RydWN0IExwTm9ybVJldHVyblR5cGUgeworICAgICAgdHlwZWRlZiBQYXJ0aWFsUmVkdXhFeHByPEV4cHJlc3Npb25UeXBlLCBpbnRlcm5hbDo6bWVtYmVyX2xwbm9ybTxwLFJlYWxTY2FsYXI+LERpcmVjdGlvbj4gVHlwZTsKKyAgICB9OworCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBzbWFsbGVzdCBjb2VmZmljaWVudAorICAgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBcYyAqdGhpcyBjb250YWlucyBOYU4uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxSZWR1eF9taW5Db2VmZi5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X21pbkNvZWZmLm91dAorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZigpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBNaW5Db2VmZlJldHVyblR5cGUgbWluQ29lZmYoKSBjb25zdAorICAgIHsgcmV0dXJuIE1pbkNvZWZmUmV0dXJuVHlwZShfZXhwcmVzc2lvbigpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBsYXJnZXN0IGNvZWZmaWNpZW50CisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24uCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIFxjICp0aGlzIGNvbnRhaW5zIE5hTi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUGFydGlhbFJlZHV4X21heENvZWZmLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbWF4Q29lZmYub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6Om1heENvZWZmKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IE1heENvZWZmUmV0dXJuVHlwZSBtYXhDb2VmZigpIGNvbnN0CisgICAgeyByZXR1cm4gTWF4Q29lZmZSZXR1cm5UeXBlKF9leHByZXNzaW9uKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIHNxdWFyZWQgbm9ybQorICAgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICAgKiBUaGlzIGlzIGEgdmVjdG9yIHdpdGggcmVhbCBlbnRyaWVzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBtYXRyaXggaGFzIGNvbXBsZXggZW50cmllcy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUGFydGlhbFJlZHV4X3NxdWFyZWROb3JtLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfc3F1YXJlZE5vcm0ub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnNxdWFyZWROb3JtKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFNxdWFyZWROb3JtUmV0dXJuVHlwZSBzcXVhcmVkTm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gU3F1YXJlZE5vcm1SZXR1cm5UeXBlKF9leHByZXNzaW9uKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG5vcm0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbi4KKyAgICAgICogVGhpcyBpcyBhIHZlY3RvciB3aXRoIHJlYWwgZW50cmllcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgbWF0cml4IGhhcyBjb21wbGV4IGVudHJpZXMuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxSZWR1eF9ub3JtLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbm9ybS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6bm9ybSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBOb3JtUmV0dXJuVHlwZSBub3JtKCkgY29uc3QKKyAgICB7IHJldHVybiBOb3JtUmV0dXJuVHlwZShfZXhwcmVzc2lvbigpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBub3JtCisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24uCisgICAgICAqIFRoaXMgaXMgYSB2ZWN0b3Igd2l0aCByZWFsIGVudHJpZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG1hdHJpeCBoYXMgY29tcGxleCBlbnRyaWVzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbm9ybS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X25vcm0ub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6Om5vcm0oKSAqLworICAgIHRlbXBsYXRlPGludCBwPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgTHBOb3JtUmV0dXJuVHlwZTxwPjo6VHlwZSBscE5vcm0oKSBjb25zdAorICAgIHsgcmV0dXJuIHR5cGVuYW1lIExwTm9ybVJldHVyblR5cGU8cD46OlR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBub3JtCisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24sIHVzaW5nCisgICAgICAqIEJsdWUncyBhbGdvcml0aG0uCisgICAgICAqIFRoaXMgaXMgYSB2ZWN0b3Igd2l0aCByZWFsIGVudHJpZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG1hdHJpeCBoYXMgY29tcGxleCBlbnRyaWVzLgorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjpibHVlTm9ybSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBCbHVlTm9ybVJldHVyblR5cGUgYmx1ZU5vcm0oKSBjb25zdAorICAgIHsgcmV0dXJuIEJsdWVOb3JtUmV0dXJuVHlwZShfZXhwcmVzc2lvbigpKTsgfQorCisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG5vcm0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbiwgYXZvaWRpbmcKKyAgICAgICogdW5kZXJmbG93IGFuZCBvdmVyZmxvdy4KKyAgICAgICogVGhpcyBpcyBhIHZlY3RvciB3aXRoIHJlYWwgZW50cmllcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgbWF0cml4IGhhcyBjb21wbGV4IGVudHJpZXMuCisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnN0YWJsZU5vcm0oKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU3RhYmxlTm9ybVJldHVyblR5cGUgc3RhYmxlTm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gU3RhYmxlTm9ybVJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBub3JtCisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24sIGF2b2lkaW5nCisgICAgICAqIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgdXNpbmcgYSBjb25jYXRlbmF0aW9uIG9mIGh5cG90KCkgY2FsbHMuCisgICAgICAqIFRoaXMgaXMgYSB2ZWN0b3Igd2l0aCByZWFsIGVudHJpZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG1hdHJpeCBoYXMgY29tcGxleCBlbnRyaWVzLgorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjpoeXBvdE5vcm0oKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgSHlwb3ROb3JtUmV0dXJuVHlwZSBoeXBvdE5vcm0oKSBjb25zdAorICAgIHsgcmV0dXJuIEh5cG90Tm9ybVJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgc3VtCisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxSZWR1eF9zdW0uY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFBhcnRpYWxSZWR1eF9zdW0ub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnN1bSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBTdW1SZXR1cm5UeXBlIHN1bSgpIGNvbnN0CisgICAgeyByZXR1cm4gU3VtUmV0dXJuVHlwZShfZXhwcmVzc2lvbigpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBtZWFuCisgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICoKKyAgICAqIFxzYSBEZW5zZUJhc2U6Om1lYW4oKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgTWVhblJldHVyblR5cGUgbWVhbigpIGNvbnN0CisgICAgeyByZXR1cm4gTWVhblJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcKKyAgICAgICogd2hldGhlciBcYiBhbGwgY29lZmZpY2llbnRzIG9mIGVhY2ggcmVzcGVjdGl2ZSBjb2x1bW4gKG9yIHJvdykgYXJlIFxjIHRydWUuCisgICAgICAqIFRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgYXNzaWduZWQgdG8gYSB2ZWN0b3Igd2l0aCBlbnRyaWVzIG9mIHR5cGUgXGMgYm9vbC4KKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6YWxsKCkgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEFsbFJldHVyblR5cGUgYWxsKCkgY29uc3QKKyAgICB7IHJldHVybiBBbGxSZXR1cm5UeXBlKF9leHByZXNzaW9uKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nCisgICAgICAqIHdoZXRoZXIgXGIgYXQgXGIgbGVhc3Qgb25lIGNvZWZmaWNpZW50IG9mIGVhY2ggcmVzcGVjdGl2ZSBjb2x1bW4gKG9yIHJvdykgaXMgXGMgdHJ1ZS4KKyAgICAgICogVGhpcyBleHByZXNzaW9uIGNhbiBiZSBhc3NpZ25lZCB0byBhIHZlY3RvciB3aXRoIGVudHJpZXMgb2YgdHlwZSBcYyBib29sLgorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjphbnkoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgQW55UmV0dXJuVHlwZSBhbnkoKSBjb25zdAorICAgIHsgcmV0dXJuIEFueVJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcKKyAgICAgICogdGhlIG51bWJlciBvZiBcYyB0cnVlIGNvZWZmaWNpZW50cyBvZiBlYWNoIHJlc3BlY3RpdmUgY29sdW1uIChvciByb3cpLgorICAgICAgKiBUaGlzIGV4cHJlc3Npb24gY2FuIGJlIGFzc2lnbmVkIHRvIGEgdmVjdG9yIHdob3NlIGVudHJpZXMgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGlzIHVzZWQgdG8KKyAgICAgICogaW5kZXggZW50cmllcyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4OyBmb3IgZGVuc2UgbWF0cmljZXMsIHRoaXMgaXMgXGMgc3RkOjpwdHJkaWZmX3QgLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUmVkdXhfY291bnQuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFBhcnRpYWxSZWR1eF9jb3VudC5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6Y291bnQoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgQ291bnRSZXR1cm5UeXBlIGNvdW50KCkgY29uc3QKKyAgICB7IHJldHVybiBDb3VudFJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgcHJvZHVjdAorICAgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUmVkdXhfcHJvZC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X3Byb2Qub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnByb2QoKSAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUHJvZFJldHVyblR5cGUgcHJvZCgpIGNvbnN0CisgICAgeyByZXR1cm4gUHJvZFJldHVyblR5cGUoX2V4cHJlc3Npb24oKSk7IH0KKworCisgICAgLyoqIFxyZXR1cm5zIGEgbWF0cml4IGV4cHJlc3Npb24KKyAgICAgICogd2hlcmUgZWFjaCBjb2x1bW4gKG9yIHJvdykgYXJlIHJldmVyc2VkLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBWZWN0b3J3aXNlX3JldmVyc2UuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFZlY3Rvcndpc2VfcmV2ZXJzZS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6cmV2ZXJzZSgpICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBDb25zdFJldmVyc2VSZXR1cm5UeXBlIHJldmVyc2UoKSBjb25zdAorICAgIHsgcmV0dXJuIENvbnN0UmV2ZXJzZVJldHVyblR5cGUoIF9leHByZXNzaW9uKCkgKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgd3JpdGFibGUgbWF0cml4IGV4cHJlc3Npb24KKyAgICAgICogd2hlcmUgZWFjaCBjb2x1bW4gKG9yIHJvdykgYXJlIHJldmVyc2VkLgorICAgICAgKgorICAgICAgKiBcc2EgcmV2ZXJzZSgpIGNvbnN0ICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBSZXZlcnNlUmV0dXJuVHlwZSByZXZlcnNlKCkKKyAgICB7IHJldHVybiBSZXZlcnNlUmV0dXJuVHlwZSggX2V4cHJlc3Npb24oKSApOyB9CisKKyAgICB0eXBlZGVmIFJlcGxpY2F0ZTxFeHByZXNzaW9uVHlwZSwoaXNWZXJ0aWNhbD9EeW5hbWljOjEpLChpc0hvcml6b250YWw/RHluYW1pYzoxKT4gUmVwbGljYXRlUmV0dXJuVHlwZTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFJlcGxpY2F0ZVJldHVyblR5cGUgcmVwbGljYXRlKEluZGV4IGZhY3RvcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgICogXHJldHVybiBhbiBleHByZXNzaW9uIG9mIHRoZSByZXBsaWNhdGlvbiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUub3V0CisgICAgICAqCisgICAgICAqIFxzYSBWZWN0b3J3aXNlT3A6OnJlcGxpY2F0ZShJbmRleCksIERlbnNlQmFzZTo6cmVwbGljYXRlKCksIGNsYXNzIFJlcGxpY2F0ZQorICAgICAgKi8KKyAgICAvLyBOT1RFIGltcGxlbWVudGVkIGhlcmUgYmVjYXVzZSBvZiBzdW5zdHVkaW8ncyBjb21waWxhdGlvbiBlcnJvcnMKKyAgICAvLyBpc1ZlcnRpY2FsKkZhY3Rvcitpc0hvcml6b250YWwgaW5zdGVhZCBvZiAoaXNWZXJ0aWNhbD9GYWN0b3I6MSkgdG8gaGFuZGxlIENVREEgYnVnIHdpdGggdGVybmFyeSBvcGVyYXRvcgorICAgIHRlbXBsYXRlPGludCBGYWN0b3I+IGNvbnN0IFJlcGxpY2F0ZTxFeHByZXNzaW9uVHlwZSxpc1ZlcnRpY2FsKkZhY3Rvcitpc0hvcml6b250YWwsaXNIb3Jpem9udGFsKkZhY3Rvcitpc1ZlcnRpY2FsPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgcmVwbGljYXRlKEluZGV4IGZhY3RvciA9IEZhY3RvcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gUmVwbGljYXRlPEV4cHJlc3Npb25UeXBlLChpc1ZlcnRpY2FsP0ZhY3RvcjoxKSwoaXNIb3Jpem9udGFsP0ZhY3RvcjoxKT4KKyAgICAgICAgICAoX2V4cHJlc3Npb24oKSxpc1ZlcnRpY2FsP2ZhY3RvcjoxLGlzSG9yaXpvbnRhbD9mYWN0b3I6MSk7CisgICAgfQorCisvLy8vLy8vLy8vLyBBcnRpdGhtZXRpYyBvcGVyYXRvcnMgLy8vLy8vLy8vLy8KKworICAgIC8qKiBDb3BpZXMgdGhlIHZlY3RvciBcYSBvdGhlciB0byBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEV4cHJlc3Npb25UeXBlJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICAvL2VpZ2VuX2Fzc2VydCgobV9tYXRyaXguaXNOdWxsKCkpID09IChvdGhlci5pc051bGwoKSkpOyBGSVhNRQorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcmVzc2lvblR5cGUmPihtX21hdHJpeCA9IGV4dGVuZGVkVG8ob3RoZXIuZGVyaXZlZCgpKSk7CisgICAgfQorCisgICAgLyoqIEFkZHMgdGhlIHZlY3RvciBcYSBvdGhlciB0byBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEV4cHJlc3Npb25UeXBlJiBvcGVyYXRvcis9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcmVzc2lvblR5cGUmPihtX21hdHJpeCArPSBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSkpOworICAgIH0KKworICAgIC8qKiBTdWJzdHJhY3RzIHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gZWFjaCBzdWJ2ZWN0b3Igb2YgXGMgKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3ItPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfWFBSX0tJTkQoRXhwcmVzc2lvblR5cGUsIE90aGVyRGVyaXZlZCkKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHJlc3Npb25UeXBlJj4obV9tYXRyaXggLT0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpKTsKKyAgICB9CisKKyAgICAvKiogTXVsdGlwbGVzIGVhY2ggc3VidmVjdG9yIG9mIFxjICp0aGlzIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3IqPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0FSUkFZWFBSKEV4cHJlc3Npb25UeXBlKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICBtX21hdHJpeCAqPSBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSk7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByZXNzaW9uVHlwZSY+KG1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogRGl2aWRlcyBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyBieSB0aGUgdmVjdG9yIFxhIG90aGVyICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yLz0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9BUlJBWVhQUihFeHByZXNzaW9uVHlwZSkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgbV9tYXRyaXggLz0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcmVzc2lvblR5cGUmPihtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhlIHN1bSBvZiB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIGVhY2ggc3VidmVjdG9yIG9mIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgY29uc3QgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGU+CisgICAgb3BlcmF0b3IrKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgcmV0dXJuIG1fbWF0cml4ICsgZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZWFjaCBzdWJ2ZWN0b3Igb2YgXGMgKnRoaXMgYW5kIHRoZSB2ZWN0b3IgXGEgb3RoZXIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgY29uc3QgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGU+CisgICAgb3BlcmF0b3ItKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgcmV0dXJuIG1fbWF0cml4IC0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHdoZXJlIGVhY2ggc3VidmVjdG9yIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSB2ZWN0b3IgXGEgb3RoZXIKKyAgICAgICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgc3VidmVjdG9yIG9mIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DCisgICAgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlTmVzdGVkQ2xlYW5lZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEV4dGVuZGVkVHlwZTxPdGhlckRlcml2ZWQ+OjpUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgb3BlcmF0b3IqKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfQVJSQVlYUFIoRXhwcmVzc2lvblR5cGUpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfWFBSX0tJTkQoRXhwcmVzc2lvblR5cGUsIE90aGVyRGVyaXZlZCkKKyAgICAgIHJldHVybiBtX21hdHJpeCAqIGV4dGVuZGVkVG8ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB3aGVyZSBlYWNoIHN1YnZlY3RvciBpcyB0aGUgcXVvdGllbnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICogc3VidmVjdG9yIG9mIFxjICp0aGlzIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyPiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlTmVzdGVkQ2xlYW5lZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEV4dGVuZGVkVHlwZTxPdGhlckRlcml2ZWQ+OjpUeXBlPgorICAgIG9wZXJhdG9yLyhjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0FSUkFZWFBSKEV4cHJlc3Npb25UeXBlKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICByZXR1cm4gbV9tYXRyaXggLyBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gd2hlcmUgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgbWF0cml4IGFyZSBub3JtYWxpemVkLgorICAgICAgKiBUaGUgcmVmZXJlbmNlZCBtYXRyaXggaXMgXGIgbm90IG1vZGlmaWVkLgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6bm9ybWFsaXplZCgpLCBub3JtYWxpemUoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgY29uc3QgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgT3Bwb3NpdGVFeHRlbmRlZFR5cGU8dHlwZW5hbWUgUmV0dXJuVHlwZTxpbnRlcm5hbDo6bWVtYmVyX25vcm0sUmVhbFNjYWxhcj46OlR5cGU+OjpUeXBlPgorICAgIG5vcm1hbGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jd2lzZVF1b3RpZW50KGV4dGVuZGVkVG9PcHBvc2l0ZSh0aGlzLT5ub3JtKCkpKTsgfQorCisKKyAgICAvKiogTm9ybWFsaXplIGluLXBsYWNlIGVhY2ggcm93IG9yIGNvbHVtbnMgb2YgdGhlIHJlZmVyZW5jZWQgbWF0cml4LgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6bm9ybWFsaXplKCksIG5vcm1hbGl6ZWQoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG5vcm1hbGl6ZSgpIHsKKyAgICAgIG1fbWF0cml4ID0gdGhpcy0+bm9ybWFsaXplZCgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHJldmVyc2VJblBsYWNlKCk7CisKKy8vLy8vLy8vLy8vIEdlb21ldHJ5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgdHlwZWRlZiBIb21vZ2VuZW91czxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+IEhvbW9nZW5lb3VzUmV0dXJuVHlwZTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEhvbW9nZW5lb3VzUmV0dXJuVHlwZSBob21vZ2VuZW91cygpIGNvbnN0OworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6UGxhaW5PYmplY3QgQ3Jvc3NSZXR1cm5UeXBlOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IENyb3NzUmV0dXJuVHlwZSBjcm9zcyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIGVudW0geworICAgICAgSE5vcm1hbGl6ZWRfU2l6ZSA9IERpcmVjdGlvbj09VmVydGljYWwgPyBpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50ZXJuYWw6OnRyYWl0czxFeHByZXNzaW9uVHlwZT46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lID0gSE5vcm1hbGl6ZWRfU2l6ZT09RHluYW1pYyA/IER5bmFtaWMgOiBITm9ybWFsaXplZF9TaXplLTEKKyAgICB9OworICAgIHR5cGVkZWYgQmxvY2s8Y29uc3QgRXhwcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyBpbnQoSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpSb3dzQXRDb21waWxlVGltZSksCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyBpbnQoSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpDb2xzQXRDb21waWxlVGltZSk+CisgICAgICAgICAgICBITm9ybWFsaXplZF9CbG9jazsKKyAgICB0eXBlZGVmIEJsb2NrPGNvbnN0IEV4cHJlc3Npb25UeXBlLAorICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1WZXJ0aWNhbCAgID8gMSA6IGludChpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUpLAorICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsID8gMSA6IGludChpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Q29sc0F0Q29tcGlsZVRpbWUpPgorICAgICAgICAgICAgSE5vcm1hbGl6ZWRfRmFjdG9yczsKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6U2NhbGFyPiwKKyAgICAgICAgICAgICAgICBjb25zdCBITm9ybWFsaXplZF9CbG9jaywKKyAgICAgICAgICAgICAgICBjb25zdCBSZXBsaWNhdGU8SE5vcm1hbGl6ZWRfRmFjdG9ycywKKyAgICAgICAgICAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IEhOb3JtYWxpemVkX1NpemVNaW51c09uZSA6IDEsCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyBITm9ybWFsaXplZF9TaXplTWludXNPbmUgOiAxPiA+CisgICAgICAgICAgICBITm9ybWFsaXplZFJldHVyblR5cGU7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEhOb3JtYWxpemVkUmV0dXJuVHlwZSBobm9ybWFsaXplZCgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBFeHByZXNzaW9uVHlwZU5lc3RlZCBtX21hdHJpeDsKK307CisKKy8vY29uc3QgY29sd2lzZSBtb3ZlZCB0byBEZW5zZUJhc2UuaCBkdWUgdG8gQ1VEQSBjb21waWxlciBidWcKKworCisvKiogXHJldHVybnMgYSB3cml0YWJsZSBWZWN0b3J3aXNlT3Agd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJ0aWFsIHJlZHVjdGlvbiBvcGVyYXRpb25zCisgICoKKyAgKiBcc2Egcm93d2lzZSgpLCBjbGFzcyBWZWN0b3J3aXNlT3AsIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb2x3aXNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojpjb2x3aXNlKCkKK3sKKyAgcmV0dXJuIENvbHdpc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8vY29uc3Qgcm93d2lzZSBtb3ZlZCB0byBEZW5zZUJhc2UuaCBkdWUgdG8gQ1VEQSBjb21waWxlciBidWcKKworCisvKiogXHJldHVybnMgYSB3cml0YWJsZSBWZWN0b3J3aXNlT3Agd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJ0aWFsIHJlZHVjdGlvbiBvcGVyYXRpb25zCisgICoKKyAgKiBcc2EgY29sd2lzZSgpLCBjbGFzcyBWZWN0b3J3aXNlT3AsIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpSb3d3aXNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojpyb3d3aXNlKCkKK3sKKyAgcmV0dXJuIFJvd3dpc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFSVElBTF9SRURVWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9WaXNpdG9yLmggYi9FaWdlbi9zcmMvQ29yZS9WaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjMTg4MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1Zpc2l0b3IuaApAQCAtMCwwICsxLDI3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1ZJU0lUT1JfSAorI2RlZmluZSBFSUdFTl9WSVNJVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZpc2l0b3IsIHR5cGVuYW1lIERlcml2ZWQsIGludCBVbnJvbGxDb3VudD4KK3N0cnVjdCB2aXNpdG9yX2ltcGwKK3sKKyAgZW51bSB7CisgICAgY29sID0gKFVucm9sbENvdW50LTEpIC8gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgcm93ID0gKFVucm9sbENvdW50LTEpICUgRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCwgVmlzaXRvciYgdmlzaXRvcikKKyAgeworICAgIHZpc2l0b3JfaW1wbDxWaXNpdG9yLCBEZXJpdmVkLCBVbnJvbGxDb3VudC0xPjo6cnVuKG1hdCwgdmlzaXRvcik7CisgICAgdmlzaXRvcihtYXQuY29lZmYocm93LCBjb2wpLCByb3csIGNvbCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZpc2l0b3IsIHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdmlzaXRvcl9pbXBsPFZpc2l0b3IsIERlcml2ZWQsIDE+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBWaXNpdG9yJiB2aXNpdG9yKQorICB7CisgICAgcmV0dXJuIHZpc2l0b3IuaW5pdChtYXQuY29lZmYoMCwgMCksIDAsIDApOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWaXNpdG9yLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHZpc2l0b3JfaW1wbDxWaXNpdG9yLCBEZXJpdmVkLCBEeW5hbWljPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmIG1hdCwgVmlzaXRvciYgdmlzaXRvcikKKyAgeworICAgIHZpc2l0b3IuaW5pdChtYXQuY29lZmYoMCwwKSwgMCwgMCk7CisgICAgZm9yKEluZGV4IGkgPSAxOyBpIDwgbWF0LnJvd3MoKTsgKytpKQorICAgICAgdmlzaXRvcihtYXQuY29lZmYoaSwgMCksIGksIDApOworICAgIGZvcihJbmRleCBqID0gMTsgaiA8IG1hdC5jb2xzKCk7ICsraikKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1hdC5yb3dzKCk7ICsraSkKKyAgICAgICAgdmlzaXRvcihtYXQuY29lZmYoaSwgaiksIGksIGopOworICB9Cit9OworCisvLyBldmFsdWF0b3IgYWRhcHRvcgordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIHZpc2l0b3JfZXZhbHVhdG9yCit7CitwdWJsaWM6CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGV4cGxpY2l0IHZpc2l0b3JfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUgJnhwcikgOiBtX2V2YWx1YXRvcih4cHIpLCBtX3hwcih4cHIpIHt9CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gWHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29lZmZSZWFkQ29zdCA9IGludGVybmFsOjpldmFsdWF0b3I8WHByVHlwZT46OkNvZWZmUmVhZENvc3QKKyAgfTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3hwci5yb3dzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1feHByLmNvbHMoKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV94cHIuc2l6ZSgpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7IHJldHVybiBtX2V2YWx1YXRvci5jb2VmZihyb3csIGNvbCk7IH0KKyAgCitwcm90ZWN0ZWQ6CisgIGludGVybmFsOjpldmFsdWF0b3I8WHByVHlwZT4gbV9ldmFsdWF0b3I7CisgIGNvbnN0IFhwclR5cGUgJm1feHByOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogQXBwbGllcyB0aGUgdmlzaXRvciBcYSB2aXNpdG9yIHRvIHRoZSB3aG9sZSBjb2VmZmljaWVudHMgb2YgdGhlIG1hdHJpeCBvciB2ZWN0b3IuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIFZpc2l0b3IgaXMgdGhlIHR5cGUgb2YgdGhlIHZpc2l0b3IgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorICAqIFxjb2RlCisgICogc3RydWN0IE15VmlzaXRvciB7CisgICogICAvLyBjYWxsZWQgZm9yIHRoZSBmaXJzdCBjb2VmZmljaWVudAorICAqICAgdm9pZCBpbml0KGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopOworICAqICAgLy8gY2FsbGVkIGZvciBhbGwgb3RoZXIgY29lZmZpY2llbnRzCisgICogICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopOworICAqIH07CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxub3RlIGNvbXBhcmVkIHRvIG9uZSBvciB0d28gXGVtIGZvciBcZW0gbG9vcHMsIHZpc2l0b3JzIG9mZmVyIGF1dG9tYXRpYworICAqIHVucm9sbGluZyBmb3Igc21hbGwgZml4ZWQgc2l6ZSBtYXRyaXguCisgICoKKyAgKiBcc2EgbWluQ29lZmYoSW5kZXgqLEluZGV4KiksIG1heENvZWZmKEluZGV4KixJbmRleCopLCBEZW5zZUJhc2U6OnJlZHV4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWaXNpdG9yPgorRUlHRU5fREVWSUNFX0ZVTkMKK3ZvaWQgRGVuc2VCYXNlPERlcml2ZWQ+Ojp2aXNpdChWaXNpdG9yJiB2aXNpdG9yKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp2aXNpdG9yX2V2YWx1YXRvcjxEZXJpdmVkPiBUaGlzRXZhbHVhdG9yOworICBUaGlzRXZhbHVhdG9yIHRoaXNFdmFsKGRlcml2ZWQoKSk7CisgIAorICBlbnVtIHsKKyAgICB1bnJvbGwgPSAgU2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYworICAgICAgICAgICAmJiBTaXplQXRDb21waWxlVGltZSAqIFRoaXNFdmFsdWF0b3I6OkNvZWZmUmVhZENvc3QgKyAoU2l6ZUF0Q29tcGlsZVRpbWUtMSkgKiBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8VmlzaXRvcj46OkNvc3QgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisgIH07CisgIHJldHVybiBpbnRlcm5hbDo6dmlzaXRvcl9pbXBsPFZpc2l0b3IsIFRoaXNFdmFsdWF0b3IsIHVucm9sbCA/IGludChTaXplQXRDb21waWxlVGltZSkgOiBEeW5hbWljPjo6cnVuKHRoaXNFdmFsLCB2aXNpdG9yKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBCYXNlIGNsYXNzIHRvIGltcGxlbWVudCBtaW4gYW5kIG1heCB2aXNpdG9ycworICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgY29lZmZfdmlzaXRvcgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIEluZGV4IHJvdywgY29sOworICBTY2FsYXIgcmVzOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgdm9pZCBpbml0KGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopCisgIHsKKyAgICByZXMgPSB2YWx1ZTsKKyAgICByb3cgPSBpOworICAgIGNvbCA9IGo7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVmlzaXRvciBjb21wdXRpbmcgdGhlIG1pbiBjb2VmZmljaWVudCB3aXRoIGl0cyB2YWx1ZSBhbmQgY29vcmRpbmF0ZXMKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6Om1pbkNvZWZmKEluZGV4KiwgSW5kZXgqKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgbWluX2NvZWZmX3Zpc2l0b3IgOiBjb2VmZl92aXNpdG9yPERlcml2ZWQ+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIHZhbHVlLCBJbmRleCBpLCBJbmRleCBqKQorICB7CisgICAgaWYodmFsdWUgPCB0aGlzLT5yZXMpCisgICAgeworICAgICAgdGhpcy0+cmVzID0gdmFsdWU7CisgICAgICB0aGlzLT5yb3cgPSBpOworICAgICAgdGhpcy0+Y29sID0gajsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxtaW5fY29lZmZfdmlzaXRvcjxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVmlzaXRvciBjb21wdXRpbmcgdGhlIG1heCBjb2VmZmljaWVudCB3aXRoIGl0cyB2YWx1ZSBhbmQgY29vcmRpbmF0ZXMKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4KiwgSW5kZXgqKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgbWF4X2NvZWZmX3Zpc2l0b3IgOiBjb2VmZl92aXNpdG9yPERlcml2ZWQ+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsgCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiB2YWx1ZSwgSW5kZXggaSwgSW5kZXggaikKKyAgeworICAgIGlmKHZhbHVlID4gdGhpcy0+cmVzKQorICAgIHsKKyAgICAgIHRoaXMtPnJlcyA9IHZhbHVlOworICAgICAgdGhpcy0+cm93ID0gaTsKKyAgICAgIHRoaXMtPmNvbCA9IGo7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8bWF4X2NvZWZmX3Zpc2l0b3I8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0CisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxmbiBEZW5zZUJhc2U8RGVyaXZlZD46Om1pbkNvZWZmKEluZGV4VHlwZSogcm93SWQsIEluZGV4VHlwZSogY29sSWQpIGNvbnN0CisgICogXHJldHVybnMgdGhlIG1pbmltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcyBhbmQgcHV0cyBpbiAqcm93IGFuZCAqY29sIGl0cyBsb2NhdGlvbi4KKyAgKiBcd2FybmluZyB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBcYyAqdGhpcyBjb250YWlucyBOYU4uCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleCopLCBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4KixJbmRleCopLCBEZW5zZUJhc2U6OnZpc2l0KCksIERlbnNlQmFzZTo6bWluQ29lZmYoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KK0VJR0VOX0RFVklDRV9GVU5DCit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6bWluQ29lZmYoSW5kZXhUeXBlKiByb3dJZCwgSW5kZXhUeXBlKiBjb2xJZCkgY29uc3QKK3sKKyAgaW50ZXJuYWw6Om1pbl9jb2VmZl92aXNpdG9yPERlcml2ZWQ+IG1pblZpc2l0b3I7CisgIHRoaXMtPnZpc2l0KG1pblZpc2l0b3IpOworICAqcm93SWQgPSBtaW5WaXNpdG9yLnJvdzsKKyAgaWYgKGNvbElkKSAqY29sSWQgPSBtaW5WaXNpdG9yLmNvbDsKKyAgcmV0dXJuIG1pblZpc2l0b3IucmVzOworfQorCisvKiogXHJldHVybnMgdGhlIG1pbmltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcyBhbmQgcHV0cyBpbiAqaW5kZXggaXRzIGxvY2F0aW9uLgorICAqIFx3YXJuaW5nIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIFxjICp0aGlzIGNvbnRhaW5zIE5hTi4gCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4VHlwZSosSW5kZXhUeXBlKiksIERlbnNlQmFzZTo6dmlzaXQoKSwgRGVuc2VCYXNlOjptaW5Db2VmZigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMKK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorRGVuc2VCYXNlPERlcml2ZWQ+OjptaW5Db2VmZihJbmRleFR5cGUqIGluZGV4KSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIGludGVybmFsOjptaW5fY29lZmZfdmlzaXRvcjxEZXJpdmVkPiBtaW5WaXNpdG9yOworICB0aGlzLT52aXNpdChtaW5WaXNpdG9yKTsKKyAgKmluZGV4ID0gSW5kZXhUeXBlKChSb3dzQXRDb21waWxlVGltZT09MSkgPyBtaW5WaXNpdG9yLmNvbCA6IG1pblZpc2l0b3Iucm93KTsKKyAgcmV0dXJuIG1pblZpc2l0b3IucmVzOworfQorCisvKiogXGZuIERlbnNlQmFzZTxEZXJpdmVkPjo6bWF4Q29lZmYoSW5kZXhUeXBlKiByb3dJZCwgSW5kZXhUeXBlKiBjb2xJZCkgY29uc3QKKyAgKiBccmV0dXJucyB0aGUgbWF4aW11bSBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzIGFuZCBwdXRzIGluICpyb3cgYW5kICpjb2wgaXRzIGxvY2F0aW9uLgorICAqIFx3YXJuaW5nIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIFxjICp0aGlzIGNvbnRhaW5zIE5hTi4gCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6OnZpc2l0KCksIERlbnNlQmFzZTo6bWF4Q29lZmYoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KK0VJR0VOX0RFVklDRV9GVU5DCit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6bWF4Q29lZmYoSW5kZXhUeXBlKiByb3dQdHIsIEluZGV4VHlwZSogY29sUHRyKSBjb25zdAoreworICBpbnRlcm5hbDo6bWF4X2NvZWZmX3Zpc2l0b3I8RGVyaXZlZD4gbWF4VmlzaXRvcjsKKyAgdGhpcy0+dmlzaXQobWF4VmlzaXRvcik7CisgICpyb3dQdHIgPSBtYXhWaXNpdG9yLnJvdzsKKyAgaWYgKGNvbFB0cikgKmNvbFB0ciA9IG1heFZpc2l0b3IuY29sOworICByZXR1cm4gbWF4VmlzaXRvci5yZXM7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF4aW11bSBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzIGFuZCBwdXRzIGluICppbmRleCBpdHMgbG9jYXRpb24uCisgICogXHdhcm5pbmcgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgXGMgKnRoaXMgY29udGFpbnMgTmFOLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6bWF4Q29lZmYoSW5kZXhUeXBlKixJbmRleFR5cGUqKSwgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6OnZpc2l0b3IoKSwgRGVuc2VCYXNlOjptYXhDb2VmZigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMKK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorRGVuc2VCYXNlPERlcml2ZWQ+OjptYXhDb2VmZihJbmRleFR5cGUqIGluZGV4KSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIGludGVybmFsOjptYXhfY29lZmZfdmlzaXRvcjxEZXJpdmVkPiBtYXhWaXNpdG9yOworICB0aGlzLT52aXNpdChtYXhWaXNpdG9yKTsKKyAgKmluZGV4ID0gKFJvd3NBdENvbXBpbGVUaW1lPT0xKSA/IG1heFZpc2l0b3IuY29sIDogbWF4VmlzaXRvci5yb3c7CisgIHJldHVybiBtYXhWaXNpdG9yLnJlczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9WSVNJVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL0NvbXBsZXguaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL0NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQzOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlgvQ29tcGxleC5oCkBAIC0wLDAgKzEsNDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciAoYmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20pCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfQVZYX0gKKyNkZWZpbmUgRUlHRU5fQ09NUExFWF9BVlhfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLy0tLS0tLS0tLS0gZmxvYXQgLS0tLS0tLS0tLQorc3RydWN0IFBhY2tldDRjZgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZigpIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0NGNmKGNvbnN0IF9fbTI1NiYgYSkgOiB2KGEpIHt9CisgIF9fbTI1NiAgdjsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PGZsb2F0PiA+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRjZiB0eXBlOworICB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDQsCisgICAgSGFzSGFsZlBhY2tldCA9IDEsCisKKyAgICBIYXNBZGQgICAgPSAxLAorICAgIEhhc1N1YiAgICA9IDEsCisgICAgSGFzTXVsICAgID0gMSwKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc05lZ2F0ZSA9IDEsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGNmPiB7IHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMzJ9OyB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBhZGQ8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEsIGNvbnN0IFBhY2tldDRjZiYgYikgeyByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9hZGRfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBzdWI8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEsIGNvbnN0IFBhY2tldDRjZiYgYikgeyByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9zdWJfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBuZWdhdGUoY29uc3QgUGFja2V0NGNmJiBhKQoreworICByZXR1cm4gUGFja2V0NGNmKHBuZWdhdGUoYS52KSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBjb25qKGNvbnN0IFBhY2tldDRjZiYgYSkKK3sKKyAgY29uc3QgX19tMjU2IG1hc2sgPSBfbW0yNTZfY2FzdHNpMjU2X3BzKF9tbTI1Nl9zZXRyX2VwaTMyKDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl94b3JfcHMoYS52LG1hc2spKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwbXVsPFBhY2tldDRjZj4oY29uc3QgUGFja2V0NGNmJiBhLCBjb25zdCBQYWNrZXQ0Y2YmIGIpCit7CisgIF9fbTI1NiB0bXAxID0gX21tMjU2X211bF9wcyhfbW0yNTZfbW92ZWxkdXBfcHMoYS52KSwgYi52KTsKKyAgX19tMjU2IHRtcDIgPSBfbW0yNTZfbXVsX3BzKF9tbTI1Nl9tb3ZlaGR1cF9wcyhhLnYpLCBfbW0yNTZfcGVybXV0ZV9wcyhiLnYsIF9NTV9TSFVGRkxFKDIsMywwLDEpKSk7CisgIF9fbTI1NiByZXN1bHQgPSBfbW0yNTZfYWRkc3ViX3BzKHRtcDEsIHRtcDIpOworICByZXR1cm4gUGFja2V0NGNmKHJlc3VsdCk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcGFuZCAgIDxQYWNrZXQ0Y2Y+KGNvbnN0IFBhY2tldDRjZiYgYSwgY29uc3QgUGFja2V0NGNmJiBiKSB7IHJldHVybiBQYWNrZXQ0Y2YoX21tMjU2X2FuZF9wcyhhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcG9yICAgIDxQYWNrZXQ0Y2Y+KGNvbnN0IFBhY2tldDRjZiYgYSwgY29uc3QgUGFja2V0NGNmJiBiKSB7IHJldHVybiBQYWNrZXQ0Y2YoX21tMjU2X29yX3BzKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBweG9yICAgPFBhY2tldDRjZj4oY29uc3QgUGFja2V0NGNmJiBhLCBjb25zdCBQYWNrZXQ0Y2YmIGIpIHsgcmV0dXJuIFBhY2tldDRjZihfbW0yNTZfeG9yX3BzKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwYW5kbm90PFBhY2tldDRjZj4oY29uc3QgUGFja2V0NGNmJiBhLCBjb25zdCBQYWNrZXQ0Y2YmIGIpIHsgcmV0dXJuIFBhY2tldDRjZihfbW0yNTZfYW5kbm90X3BzKGEudixiLnYpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBsb2FkIDxQYWNrZXQ0Y2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQ0Y2YocGxvYWQ8UGFja2V0OGY+KCZudW1leHQ6OnJlYWxfcmVmKCpmcm9tKSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBsb2FkdTxQYWNrZXQ0Y2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDRjZihwbG9hZHU8UGFja2V0OGY+KCZudW1leHQ6OnJlYWxfcmVmKCpmcm9tKSkpOyB9CisKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwc2V0MTxQYWNrZXQ0Y2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4mIGZyb20pCit7CisgIHJldHVybiBQYWNrZXQ0Y2YoX21tMjU2X2Nhc3RwZF9wcyhfbW0yNTZfYnJvYWRjYXN0X3NkKChjb25zdCBkb3VibGUqKShjb25zdCB2b2lkKikmZnJvbSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwbG9hZGR1cDxQYWNrZXQ0Y2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pCit7CisgIC8vIEZJWE1FIFRoZSBmb2xsb3dpbmcgbWlnaHQgYmUgb3B0aW1pemVkIHVzaW5nIF9tbTI1Nl9tb3ZlZHVwX3BkCisgIFBhY2tldDJjZiBhID0gcGxvYWRkdXA8UGFja2V0MmNmPihmcm9tKTsKKyAgUGFja2V0MmNmIGIgPSBwbG9hZGR1cDxQYWNrZXQyY2Y+KGZyb20rMSk7CisgIHJldHVybiAgUGFja2V0NGNmKF9tbTI1Nl9pbnNlcnRmMTI4X3BzKF9tbTI1Nl9jYXN0cHMxMjhfcHMyNTYoYS52KSwgYi52LCAxKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4qIHRvLCBjb25zdCBQYWNrZXQ0Y2YmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBwc3RvcmUoJm51bWV4dDo6cmVhbF9yZWYoKnRvKSwgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiogdG8sIGNvbnN0IFBhY2tldDRjZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgcHN0b3JldSgmbnVtZXh0OjpyZWFsX3JlZigqdG8pLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDRjZiBwZ2F0aGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDRjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9zZXRfcHMoc3RkOjppbWFnKGZyb21bMypzdHJpZGVdKSwgc3RkOjpyZWFsKGZyb21bMypzdHJpZGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW1hZyhmcm9tWzIqc3RyaWRlXSksIHN0ZDo6cmVhbChmcm9tWzIqc3RyaWRlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmltYWcoZnJvbVsxKnN0cmlkZV0pLCBzdGQ6OnJlYWwoZnJvbVsxKnN0cmlkZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbWFnKGZyb21bMCpzdHJpZGVdKSwgc3RkOjpyZWFsKGZyb21bMCpzdHJpZGVdKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDRjZj4oc3RkOjpjb21wbGV4PGZsb2F0PiogdG8sIGNvbnN0IFBhY2tldDRjZiYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBfX20xMjggbG93ID0gX21tMjU2X2V4dHJhY3RmMTI4X3BzKGZyb20udiwgMCk7CisgIHRvW3N0cmlkZSowXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhsb3csIGxvdywgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMobG93LCBsb3csIDEpKSk7CisgIHRvW3N0cmlkZSoxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhsb3csIGxvdywgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMobG93LCBsb3csIDMpKSk7CisKKyAgX19tMTI4IGhpZ2ggPSBfbW0yNTZfZXh0cmFjdGYxMjhfcHMoZnJvbS52LCAxKTsKKyAgdG9bc3RyaWRlKjJdID0gc3RkOjpjb21wbGV4PGZsb2F0PihfbW1fY3Z0c3NfZjMyKF9tbV9zaHVmZmxlX3BzKGhpZ2gsIGhpZ2gsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fY3Z0c3NfZjMyKF9tbV9zaHVmZmxlX3BzKGhpZ2gsIGhpZ2gsIDEpKSk7CisgIHRvW3N0cmlkZSozXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhoaWdoLCBoaWdoLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhoaWdoLCBoaWdoLCAzKSkpOworCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICBwZmlyc3Q8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEpCit7CisgIHJldHVybiBwZmlyc3QoUGFja2V0MmNmKF9tbTI1Nl9jYXN0cHMyNTZfcHMxMjgoYS52KSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHByZXZlcnNlKGNvbnN0IFBhY2tldDRjZiYgYSkgeworICBfX20xMjggbG93ICA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhhLnYsIDApOworICBfX20xMjggaGlnaCA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhhLnYsIDEpOworICBfX20xMjhkIGxvd2QgID0gX21tX2Nhc3Rwc19wZChsb3cpOworICBfX20xMjhkIGhpZ2hkID0gX21tX2Nhc3Rwc19wZChoaWdoKTsKKyAgbG93ICA9IF9tbV9jYXN0cGRfcHMoX21tX3NodWZmbGVfcGQobG93ZCxsb3dkLDB4MSkpOworICBoaWdoID0gX21tX2Nhc3RwZF9wcyhfbW1fc2h1ZmZsZV9wZChoaWdoZCxoaWdoZCwweDEpKTsKKyAgX19tMjU2IHJlc3VsdCA9IF9tbTI1Nl9zZXR6ZXJvX3BzKCk7CisgIHJlc3VsdCA9IF9tbTI1Nl9pbnNlcnRmMTI4X3BzKHJlc3VsdCwgbG93LCAxKTsKKyAgcmVzdWx0ID0gX21tMjU2X2luc2VydGYxMjhfcHMocmVzdWx0LCBoaWdoLCAwKTsKKyAgcmV0dXJuIFBhY2tldDRjZihyZXN1bHQpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiBwcmVkdXg8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEpCit7CisgIHJldHVybiBwcmVkdXgocGFkZChQYWNrZXQyY2YoX21tMjU2X2V4dHJhY3RmMTI4X3BzKGEudiwwKSksCisgICAgICAgICAgICAgICAgICAgICBQYWNrZXQyY2YoX21tMjU2X2V4dHJhY3RmMTI4X3BzKGEudiwxKSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwcmVkdXhwPFBhY2tldDRjZj4oY29uc3QgUGFja2V0NGNmKiB2ZWNzKQoreworICBQYWNrZXQ4ZiB0MCA9IF9tbTI1Nl9zaHVmZmxlX3BzKHZlY3NbMF0udiwgdmVjc1swXS52LCBfTU1fU0hVRkZMRSgzLCAxLCAyICwwKSk7CisgIFBhY2tldDhmIHQxID0gX21tMjU2X3NodWZmbGVfcHModmVjc1sxXS52LCB2ZWNzWzFdLnYsIF9NTV9TSFVGRkxFKDMsIDEsIDIgLDApKTsKKyAgdDAgPSBfbW0yNTZfaGFkZF9wcyh0MCx0MSk7CisgIFBhY2tldDhmIHQyID0gX21tMjU2X3NodWZmbGVfcHModmVjc1syXS52LCB2ZWNzWzJdLnYsIF9NTV9TSFVGRkxFKDMsIDEsIDIgLDApKTsKKyAgUGFja2V0OGYgdDMgPSBfbW0yNTZfc2h1ZmZsZV9wcyh2ZWNzWzNdLnYsIHZlY3NbM10udiwgX01NX1NIVUZGTEUoMywgMSwgMiAsMCkpOworICB0MiA9IF9tbTI1Nl9oYWRkX3BzKHQyLHQzKTsKKyAgCisgIHQxID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyh0MCx0MiwgMCArICgyPDw0KSk7CisgIHQzID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyh0MCx0MiwgMSArICgzPDw0KSk7CisKKyAgcmV0dXJuIFBhY2tldDRjZihfbW0yNTZfYWRkX3BzKHQxLHQzKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eF9tdWw8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEpCit7CisgIHJldHVybiBwcmVkdXhfbXVsKHBtdWwoUGFja2V0MmNmKF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhhLnYsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQyY2YoX21tMjU2X2V4dHJhY3RmMTI4X3BzKGEudiwgMSkpKSk7Cit9CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRjZj4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGNmJiBmaXJzdCwgY29uc3QgUGFja2V0NGNmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0wKSByZXR1cm47CisgICAgcGFsaWduX2ltcGw8T2Zmc2V0KjIsUGFja2V0OGY+OjpydW4oZmlyc3Qudiwgc2Vjb25kLnYpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQ0Y2YsIFBhY2tldDRjZiwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcG1hZGQoY29uc3QgUGFja2V0NGNmJiB4LCBjb25zdCBQYWNrZXQ0Y2YmIHksIGNvbnN0IFBhY2tldDRjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwbXVsKGNvbnN0IFBhY2tldDRjZiYgYSwgY29uc3QgUGFja2V0NGNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0NGNmLCBQYWNrZXQ0Y2YsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBtYWRkKGNvbnN0IFBhY2tldDRjZiYgeCwgY29uc3QgUGFja2V0NGNmJiB5LCBjb25zdCBQYWNrZXQ0Y2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcG11bChjb25zdCBQYWNrZXQ0Y2YmIGEsIGNvbnN0IFBhY2tldDRjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDRjZiwgUGFja2V0NGNmLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBtYWRkKGNvbnN0IFBhY2tldDRjZiYgeCwgY29uc3QgUGFja2V0NGNmJiB5LCBjb25zdCBQYWNrZXQ0Y2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcG11bChjb25zdCBQYWNrZXQ0Y2YmIGEsIGNvbnN0IFBhY2tldDRjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDhmLCBQYWNrZXQ0Y2YsIGZhbHNlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRjZiBwbWFkZChjb25zdCBQYWNrZXQ4ZiYgeCwgY29uc3QgUGFja2V0NGNmJiB5LCBjb25zdCBQYWNrZXQ0Y2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBtdWwoY29uc3QgUGFja2V0OGYmIHgsIGNvbnN0IFBhY2tldDRjZiYgeSkgY29uc3QKKyAgeyByZXR1cm4gUGFja2V0NGNmKEVpZ2VuOjppbnRlcm5hbDo6cG11bCh4LCB5LnYpKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0NGNmLCBQYWNrZXQ4ZiwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBtYWRkKGNvbnN0IFBhY2tldDRjZiYgeCwgY29uc3QgUGFja2V0OGYmIHksIGNvbnN0IFBhY2tldDRjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcG11bChjb25zdCBQYWNrZXQ0Y2YmIHgsIGNvbnN0IFBhY2tldDhmJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQ0Y2YoRWlnZW46OmludGVybmFsOjpwbXVsKHgudiwgeSkpOyB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBkaXY8UGFja2V0NGNmPihjb25zdCBQYWNrZXQ0Y2YmIGEsIGNvbnN0IFBhY2tldDRjZiYgYikKK3sKKyAgUGFja2V0NGNmIG51bSA9IHBtdWwoYSwgcGNvbmooYikpOworICBfX20yNTYgdG1wID0gX21tMjU2X211bF9wcyhiLnYsIGIudik7CisgIF9fbTI1NiB0bXAyICAgID0gX21tMjU2X3NodWZmbGVfcHModG1wLHRtcCwweEIxKTsKKyAgX19tMjU2IGRlbm9tID0gX21tMjU2X2FkZF9wcyh0bXAsIHRtcDIpOworICByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9kaXZfcHMobnVtLnYsIGRlbm9tKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0Y2YgcGNwbHhmbGlwPFBhY2tldDRjZj4oY29uc3QgUGFja2V0NGNmJiB4KQoreworICByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9zaHVmZmxlX3BzKHgudiwgeC52LCBfTU1fU0hVRkZMRSgyLCAzLCAwICwxKSkpOworfQorCisvLy0tLS0tLS0tLS0gZG91YmxlIC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQyY2QKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDJjZChjb25zdCBfX20yNTZkJiBhKSA6IHYoYSkge30KKyAgX19tMjU2ZCAgdjsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPiAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQyY2QgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQxY2QgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAwLAorICAgIHNpemUgPSAyLAorICAgIEhhc0hhbGZQYWNrZXQgPSAxLAorCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzRGl2ICAgID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0FicyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAwLAorICAgIEhhc01heCAgICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMAorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDJjZD4geyB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGU7IGVudW0ge3NpemU9MiwgYWxpZ25tZW50PUFsaWduZWQzMn07IHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcGFkZDxQYWNrZXQyY2Q+KGNvbnN0IFBhY2tldDJjZCYgYSwgY29uc3QgUGFja2V0MmNkJiBiKSB7IHJldHVybiBQYWNrZXQyY2QoX21tMjU2X2FkZF9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcHN1YjxQYWNrZXQyY2Q+KGNvbnN0IFBhY2tldDJjZCYgYSwgY29uc3QgUGFja2V0MmNkJiBiKSB7IHJldHVybiBQYWNrZXQyY2QoX21tMjU2X3N1Yl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcG5lZ2F0ZShjb25zdCBQYWNrZXQyY2QmIGEpIHsgcmV0dXJuIFBhY2tldDJjZChwbmVnYXRlKGEudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBjb25qKGNvbnN0IFBhY2tldDJjZCYgYSkKK3sKKyAgY29uc3QgX19tMjU2ZCBtYXNrID0gX21tMjU2X2Nhc3RzaTI1Nl9wZChfbW0yNTZfc2V0X2VwaTMyKDB4ODAwMDAwMDAsMHgwLDB4MCwweDAsMHg4MDAwMDAwMCwweDAsMHgwLDB4MCkpOworICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl94b3JfcGQoYS52LG1hc2spKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwbXVsPFBhY2tldDJjZD4oY29uc3QgUGFja2V0MmNkJiBhLCBjb25zdCBQYWNrZXQyY2QmIGIpCit7CisgIF9fbTI1NmQgdG1wMSA9IF9tbTI1Nl9zaHVmZmxlX3BkKGEudixhLnYsMHgwKTsKKyAgX19tMjU2ZCBldmVuID0gX21tMjU2X211bF9wZCh0bXAxLCBiLnYpOworICBfX20yNTZkIHRtcDIgPSBfbW0yNTZfc2h1ZmZsZV9wZChhLnYsYS52LDB4Rik7CisgIF9fbTI1NmQgdG1wMyA9IF9tbTI1Nl9zaHVmZmxlX3BkKGIudixiLnYsMHg1KTsKKyAgX19tMjU2ZCBvZGQgID0gX21tMjU2X211bF9wZCh0bXAyLCB0bXAzKTsKKyAgcmV0dXJuIFBhY2tldDJjZChfbW0yNTZfYWRkc3ViX3BkKGV2ZW4sIG9kZCkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBhbmQgICA8UGFja2V0MmNkPihjb25zdCBQYWNrZXQyY2QmIGEsIGNvbnN0IFBhY2tldDJjZCYgYikgeyByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9hbmRfcGQoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBvciAgICA8UGFja2V0MmNkPihjb25zdCBQYWNrZXQyY2QmIGEsIGNvbnN0IFBhY2tldDJjZCYgYikgeyByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9vcl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcHhvciAgIDxQYWNrZXQyY2Q+KGNvbnN0IFBhY2tldDJjZCYgYSwgY29uc3QgUGFja2V0MmNkJiBiKSB7IHJldHVybiBQYWNrZXQyY2QoX21tMjU2X3hvcl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcGFuZG5vdDxQYWNrZXQyY2Q+KGNvbnN0IFBhY2tldDJjZCYgYSwgY29uc3QgUGFja2V0MmNkJiBiKSB7IHJldHVybiBQYWNrZXQyY2QoX21tMjU2X2FuZG5vdF9wZChhLnYsYi52KSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwbG9hZCA8UGFja2V0MmNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSkKK3sgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQyY2QocGxvYWQ8UGFja2V0NGQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwbG9hZHU8UGFja2V0MmNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSkKK3sgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZChwbG9hZHU8UGFja2V0NGQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBzZXQxPFBhY2tldDJjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGZyb20pCit7CisgIC8vIGluIGNhc2UgY2FzdGluZyB0byBhIF9fbTEyOGQqIGlzIHJlYWxseSBub3Qgc2FmZSwgdGhlbiB3ZSBjYW4gc3RpbGwgZmFsbGJhY2sgdG8gdGhpcyB2ZXJzaW9uOiAobXVjaCBzbG93ZXIgdGhvdWdoKQorLy8gICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9sb2FkdTJfbTEyOGQoKGNvbnN0IGRvdWJsZSopJmZyb20sKGNvbnN0IGRvdWJsZSopJmZyb20pKTsKKyAgICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9icm9hZGNhc3RfcGQoKGNvbnN0IF9fbTEyOGQqKShjb25zdCB2b2lkKikmZnJvbSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBsb2FkZHVwPFBhY2tldDJjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDJjZD4oKmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqICAgdG8sIGNvbnN0IFBhY2tldDJjZCYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHBzdG9yZSgoZG91YmxlKil0bywgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICB0bywgY29uc3QgUGFja2V0MmNkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KChkb3VibGUqKXRvLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDJjZCBwZ2F0aGVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBQYWNrZXQyY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHJldHVybiBQYWNrZXQyY2QoX21tMjU2X3NldF9wZChzdGQ6OmltYWcoZnJvbVsxKnN0cmlkZV0pLCBzdGQ6OnJlYWwoZnJvbVsxKnN0cmlkZV0pLAorCQkJCSBzdGQ6OmltYWcoZnJvbVswKnN0cmlkZV0pLCBzdGQ6OnJlYWwoZnJvbVswKnN0cmlkZV0pKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFBhY2tldDJjZD4oc3RkOjpjb21wbGV4PGRvdWJsZT4qIHRvLCBjb25zdCBQYWNrZXQyY2QmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgX19tMTI4ZCBsb3cgPSBfbW0yNTZfZXh0cmFjdGYxMjhfcGQoZnJvbS52LCAwKTsKKyAgdG9bc3RyaWRlKjBdID0gc3RkOjpjb21wbGV4PGRvdWJsZT4oX21tX2N2dHNkX2Y2NChsb3cpLCBfbW1fY3Z0c2RfZjY0KF9tbV9zaHVmZmxlX3BkKGxvdywgbG93LCAxKSkpOworICBfX20xMjhkIGhpZ2ggPSBfbW0yNTZfZXh0cmFjdGYxMjhfcGQoZnJvbS52LCAxKTsKKyAgdG9bc3RyaWRlKjFdID0gc3RkOjpjb21wbGV4PGRvdWJsZT4oX21tX2N2dHNkX2Y2NChoaWdoKSwgX21tX2N2dHNkX2Y2NChfbW1fc2h1ZmZsZV9wZChoaWdoLCBoaWdoLCAxKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcGZpcnN0PFBhY2tldDJjZD4oY29uc3QgUGFja2V0MmNkJiBhKQoreworICBfX20xMjhkIGxvdyA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLnYsIDApOworICBFSUdFTl9BTElHTjE2IGRvdWJsZSByZXNbMl07CisgIF9tbV9zdG9yZV9wZChyZXMsIGxvdyk7CisgIHJldHVybiBzdGQ6OmNvbXBsZXg8ZG91YmxlPihyZXNbMF0scmVzWzFdKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQyY2QmIGEpIHsKKyAgX19tMjU2ZCByZXN1bHQgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKGEudiwgYS52LCAxKTsKKyAgcmV0dXJuIFBhY2tldDJjZChyZXN1bHQpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4PFBhY2tldDJjZD4oY29uc3QgUGFja2V0MmNkJiBhKQoreworICByZXR1cm4gcHJlZHV4KHBhZGQoUGFja2V0MWNkKF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLnYsMCkpLAorICAgICAgICAgICAgICAgICAgICAgUGFja2V0MWNkKF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLnYsMSkpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcHJlZHV4cDxQYWNrZXQyY2Q+KGNvbnN0IFBhY2tldDJjZCogdmVjcykKK3sKKyAgUGFja2V0NGQgdDAgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHZlY3NbMF0udix2ZWNzWzFdLnYsIDAgKyAoMjw8NCkpOworICBQYWNrZXQ0ZCB0MSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodmVjc1swXS52LHZlY3NbMV0udiwgMSArICgzPDw0KSk7CisKKyAgcmV0dXJuIFBhY2tldDJjZChfbW0yNTZfYWRkX3BkKHQwLHQxKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBwcmVkdXhfbXVsPFBhY2tldDJjZD4oY29uc3QgUGFja2V0MmNkJiBhKQoreworICByZXR1cm4gcHJlZHV4KHBtdWwoUGFja2V0MWNkKF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLnYsMCkpLAorICAgICAgICAgICAgICAgICAgICAgUGFja2V0MWNkKF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLnYsMSkpKSk7Cit9CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDJjZD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0MmNkJiBmaXJzdCwgY29uc3QgUGFja2V0MmNkJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0wKSByZXR1cm47CisgICAgcGFsaWduX2ltcGw8T2Zmc2V0KjIsUGFja2V0NGQ+OjpydW4oZmlyc3Qudiwgc2Vjb25kLnYpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2QsIFBhY2tldDJjZCwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcG1hZGQoY29uc3QgUGFja2V0MmNkJiB4LCBjb25zdCBQYWNrZXQyY2QmIHksIGNvbnN0IFBhY2tldDJjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwbXVsKGNvbnN0IFBhY2tldDJjZCYgYSwgY29uc3QgUGFja2V0MmNkJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNkLCBQYWNrZXQyY2QsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBtYWRkKGNvbnN0IFBhY2tldDJjZCYgeCwgY29uc3QgUGFja2V0MmNkJiB5LCBjb25zdCBQYWNrZXQyY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcG11bChjb25zdCBQYWNrZXQyY2QmIGEsIGNvbnN0IFBhY2tldDJjZCYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZCwgUGFja2V0MmNkLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBtYWRkKGNvbnN0IFBhY2tldDJjZCYgeCwgY29uc3QgUGFja2V0MmNkJiB5LCBjb25zdCBQYWNrZXQyY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcG11bChjb25zdCBQYWNrZXQyY2QmIGEsIGNvbnN0IFBhY2tldDJjZCYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDRkLCBQYWNrZXQyY2QsIGZhbHNlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwbWFkZChjb25zdCBQYWNrZXQ0ZCYgeCwgY29uc3QgUGFja2V0MmNkJiB5LCBjb25zdCBQYWNrZXQyY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBtdWwoY29uc3QgUGFja2V0NGQmIHgsIGNvbnN0IFBhY2tldDJjZCYgeSkgY29uc3QKKyAgeyByZXR1cm4gUGFja2V0MmNkKEVpZ2VuOjppbnRlcm5hbDo6cG11bCh4LCB5LnYpKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNkLCBQYWNrZXQ0ZCwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBtYWRkKGNvbnN0IFBhY2tldDJjZCYgeCwgY29uc3QgUGFja2V0NGQmIHksIGNvbnN0IFBhY2tldDJjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcG11bChjb25zdCBQYWNrZXQyY2QmIHgsIGNvbnN0IFBhY2tldDRkJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQyY2QoRWlnZW46OmludGVybmFsOjpwbXVsKHgudiwgeSkpOyB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNkIHBkaXY8UGFja2V0MmNkPihjb25zdCBQYWNrZXQyY2QmIGEsIGNvbnN0IFBhY2tldDJjZCYgYikKK3sKKyAgUGFja2V0MmNkIG51bSA9IHBtdWwoYSwgcGNvbmooYikpOworICBfX20yNTZkIHRtcCA9IF9tbTI1Nl9tdWxfcGQoYi52LCBiLnYpOworICBfX20yNTZkIGRlbm9tID0gX21tMjU2X2hhZGRfcGQodG1wLCB0bXApOworICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9kaXZfcGQobnVtLnYsIGRlbm9tKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2QgcGNwbHhmbGlwPFBhY2tldDJjZD4oY29uc3QgUGFja2V0MmNkJiB4KQoreworICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9zaHVmZmxlX3BkKHgudiwgeC52LCAweDUpKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0NGNmLDQ+JiBrZXJuZWwpIHsKKyAgX19tMjU2ZCBQMCA9IF9tbTI1Nl9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFswXS52KTsKKyAgX19tMjU2ZCBQMSA9IF9tbTI1Nl9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFsxXS52KTsKKyAgX19tMjU2ZCBQMiA9IF9tbTI1Nl9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFsyXS52KTsKKyAgX19tMjU2ZCBQMyA9IF9tbTI1Nl9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFszXS52KTsKKworICBfX20yNTZkIFQwID0gX21tMjU2X3NodWZmbGVfcGQoUDAsIFAxLCAxNSk7CisgIF9fbTI1NmQgVDEgPSBfbW0yNTZfc2h1ZmZsZV9wZChQMCwgUDEsIDApOworICBfX20yNTZkIFQyID0gX21tMjU2X3NodWZmbGVfcGQoUDIsIFAzLCAxNSk7CisgIF9fbTI1NmQgVDMgPSBfbW0yNTZfc2h1ZmZsZV9wZChQMiwgUDMsIDApOworCisgIGtlcm5lbC5wYWNrZXRbMV0udiA9IF9tbTI1Nl9jYXN0cGRfcHMoX21tMjU2X3Blcm11dGUyZjEyOF9wZChUMCwgVDIsIDMyKSk7CisgIGtlcm5lbC5wYWNrZXRbM10udiA9IF9tbTI1Nl9jYXN0cGRfcHMoX21tMjU2X3Blcm11dGUyZjEyOF9wZChUMCwgVDIsIDQ5KSk7CisgIGtlcm5lbC5wYWNrZXRbMF0udiA9IF9tbTI1Nl9jYXN0cGRfcHMoX21tMjU2X3Blcm11dGUyZjEyOF9wZChUMSwgVDMsIDMyKSk7CisgIGtlcm5lbC5wYWNrZXRbMl0udiA9IF9tbTI1Nl9jYXN0cGRfcHMoX21tMjU2X3Blcm11dGUyZjEyOF9wZChUMSwgVDMsIDQ5KSk7Cit9CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDJjZCwyPiYga2VybmVsKSB7CisgIF9fbTI1NmQgdG1wID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChrZXJuZWwucGFja2V0WzBdLnYsIGtlcm5lbC5wYWNrZXRbMV0udiwgMCsoMjw8NCkpOworICBrZXJuZWwucGFja2V0WzFdLnYgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKGtlcm5lbC5wYWNrZXRbMF0udiwga2VybmVsLnBhY2tldFsxXS52LCAxKygzPDw0KSk7Cisga2VybmVsLnBhY2tldFswXS52ID0gdG1wOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBpbnNlcnRmaXJzdChjb25zdCBQYWNrZXQ0Y2YmIGEsIHN0ZDo6Y29tcGxleDxmbG9hdD4gYikKK3sKKyAgcmV0dXJuIFBhY2tldDRjZihfbW0yNTZfYmxlbmRfcHMoYS52LHBzZXQxPFBhY2tldDRjZj4oYikudiwxfDIpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwaW5zZXJ0Zmlyc3QoY29uc3QgUGFja2V0MmNkJiBhLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBiKQoreworICByZXR1cm4gUGFja2V0MmNkKF9tbTI1Nl9ibGVuZF9wZChhLnYscHNldDE8UGFja2V0MmNkPihiKS52LDF8MikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGNmIHBpbnNlcnRsYXN0KGNvbnN0IFBhY2tldDRjZiYgYSwgc3RkOjpjb21wbGV4PGZsb2F0PiBiKQoreworICByZXR1cm4gUGFja2V0NGNmKF9tbTI1Nl9ibGVuZF9wcyhhLnYscHNldDE8UGFja2V0NGNmPihiKS52LCgxPDw3KXwoMTw8NikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZCBwaW5zZXJ0bGFzdChjb25zdCBQYWNrZXQyY2QmIGEsIHN0ZDo6Y29tcGxleDxkb3VibGU+IGIpCit7CisgIHJldHVybiBQYWNrZXQyY2QoX21tMjU2X2JsZW5kX3BkKGEudixwc2V0MTxQYWNrZXQyY2Q+KGIpLnYsKDE8PDMpfCgxPDwyKSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT01QTEVYX0FWWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWC9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWC9NYXRoRnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmNjdjZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL01hdGhGdW5jdGlvbnMuaApAQCAtMCwwICsxLDQzOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgUGVkcm8gR29ubmV0IChwZWRyby5nb25uZXRAZ21haWwuY29tKQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRIX0ZVTkNUSU9OU19BVlhfSAorI2RlZmluZSBFSUdFTl9NQVRIX0ZVTkNUSU9OU19BVlhfSAorCisvKiBUaGUgc2luLCBjb3MsIGV4cCwgYW5kIGxvZyBmdW5jdGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBsb29zZWx5IGRlcml2ZWQgZnJvbQorICogSnVsaWVuIFBvbW1pZXIncyBzc2UgbWF0aCBsaWJyYXJ5OiBodHRwOi8vZ3J1bnR0aGVwZW9uLmZyZWUuZnIvc3NlbWF0aC8KKyAqLworCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitpbmxpbmUgUGFja2V0OGkgcHNoaWZ0bGVmdChQYWNrZXQ4aSB2LCBpbnQgbikKK3sKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYMgorICByZXR1cm4gX21tMjU2X3NsbGlfZXBpMzIodiwgbik7CisjZWxzZQorICBfX20xMjhpIGxvID0gX21tX3NsbGlfZXBpMzIoX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2KHYsIDApLCBuKTsKKyAgX19tMTI4aSBoaSA9IF9tbV9zbGxpX2VwaTMyKF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1Nih2LCAxKSwgbik7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NihfbW0yNTZfY2FzdHNpMTI4X3NpMjU2KGxvKSwgKGhpKSwgMSk7CisjZW5kaWYKK30KKworaW5saW5lIFBhY2tldDhmIHBzaGlmdHJpZ2h0KFBhY2tldDhmIHYsIGludCBuKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlgyCisgIHJldHVybiBfbW0yNTZfY3Z0ZXBpMzJfcHMoX21tMjU2X3NybGlfZXBpMzIoX21tMjU2X2Nhc3Rwc19zaTI1Nih2KSwgbikpOworI2Vsc2UKKyAgX19tMTI4aSBsbyA9IF9tbV9zcmxpX2VwaTMyKF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NihfbW0yNTZfY2FzdHBzX3NpMjU2KHYpLCAwKSwgbik7CisgIF9fbTEyOGkgaGkgPSBfbW1fc3JsaV9lcGkzMihfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYoX21tMjU2X2Nhc3Rwc19zaTI1Nih2KSwgMSksIG4pOworICByZXR1cm4gX21tMjU2X2N2dGVwaTMyX3BzKF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2KF9tbTI1Nl9jYXN0c2kxMjhfc2kyNTYobG8pLCAoaGkpLCAxKSk7CisjZW5kaWYKK30KKworLy8gU2luZSBmdW5jdGlvbgorLy8gQ29tcHV0ZXMgc2luKHgpIGJ5IHdyYXBwaW5nIHggdG8gdGhlIGludGVydmFsIFstUGkvNCwzKlBpLzRdIGFuZAorLy8gZXZhbHVhdGluZyBpbnRlcnBvbGFudHMgaW4gWy1QaS80LFBpLzRdIG9yIFtQaS80LDMqUGkvNF0uIFRoZSBpbnRlcnBvbGFudHMKKy8vIGFyZSAoYW50aS0pc3ltbWV0cmljIGFuZCB0aHVzIGhhdmUgb25seSBvZGQvZXZlbiBjb2VmZmljaWVudHMKK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDhmCitwc2luPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgX3gpIHsKKyAgUGFja2V0OGYgeCA9IF94OworCisgIC8vIFNvbWUgdXNlZnVsIHZhbHVlcy4KKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGkob25lLCAxKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYob25lLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYodHdvLCAyLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYob25lX292ZXJfZm91ciwgMC4yNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihvbmVfb3Zlcl9waSwgMy4xODMwOTg4NjE4Mzc5MDdlLTAxZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKG5lZ19waV9maXJzdCwgLTMuMTQwNjI1MDAwMDAwMDAwZSswMGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihuZWdfcGlfc2Vjb25kLCAtOS42NzAyNTc1NjgzNTkzNzVlLTA0Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKG5lZ19waV90aGlyZCwgLTYuMjc4MzI5NTcxNzg0OTgwZS0wN2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zihmb3VyX292ZXJfcGksIDEuMjczMjM5NTQ0NzM1MTYzZSswMGYpOworCisgIC8vIE1hcCB4IGZyb20gWy1QaS80LDMqUGkvNF0gdG8geiBpbiBbLTEsM10gYW5kIHN1YnRyYWN0IHRoZSBzaGlmdGVkIHBlcmlvZC4KKyAgUGFja2V0OGYgeiA9IHBtdWwoeCwgcDhmX29uZV9vdmVyX3BpKTsKKyAgUGFja2V0OGYgc2hpZnQgPSBfbW0yNTZfZmxvb3JfcHMocGFkZCh6LCBwOGZfb25lX292ZXJfZm91cikpOworICB4ID0gcG1hZGQoc2hpZnQsIHA4Zl9uZWdfcGlfZmlyc3QsIHgpOworICB4ID0gcG1hZGQoc2hpZnQsIHA4Zl9uZWdfcGlfc2Vjb25kLCB4KTsKKyAgeCA9IHBtYWRkKHNoaWZ0LCBwOGZfbmVnX3BpX3RoaXJkLCB4KTsKKyAgeiA9IHBtdWwoeCwgcDhmX2ZvdXJfb3Zlcl9waSk7CisKKyAgLy8gTWFrZSBhIG1hc2sgZm9yIHRoZSBlbnRyaWVzIHRoYXQgbmVlZCBmbGlwcGluZywgaS5lLiB3aGVyZXZlciB0aGUgc2hpZnQKKyAgLy8gaXMgb2RkLgorICBQYWNrZXQ4aSBzaGlmdF9pbnRzID0gX21tMjU2X2N2dHBzX2VwaTMyKHNoaWZ0KTsKKyAgUGFja2V0OGkgc2hpZnRfaXNvZGQgPSBfbW0yNTZfY2FzdHBzX3NpMjU2KF9tbTI1Nl9hbmRfcHMoX21tMjU2X2Nhc3RzaTI1Nl9wcyhzaGlmdF9pbnRzKSwgX21tMjU2X2Nhc3RzaTI1Nl9wcyhwOGlfb25lKSkpOworICBQYWNrZXQ4aSBzaWduX2ZsaXBfbWFzayA9IHBzaGlmdGxlZnQoc2hpZnRfaXNvZGQsIDMxKTsKKworICAvLyBDcmVhdGUgYSBtYXNrIGZvciB3aGljaCBpbnRlcnBvbGFudCB0byB1c2UsIGkuZS4gaWYgeiA+IDEsIHRoZW4gdGhlIG1hc2sKKyAgLy8gaXMgc2V0IHRvIG9uZXMgZm9yIHRoYXQgZW50cnkuCisgIFBhY2tldDhmIGl2YWxfbWFzayA9IF9tbTI1Nl9jbXBfcHMoeiwgcDhmX29uZSwgX0NNUF9HVF9PUSk7CisKKyAgLy8gRXZhbHVhdGUgdGhlIHBvbHlub21pYWwgZm9yIHRoZSBpbnRlcnZhbCBbMSwzXSBpbiB6LgorICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zihjb2VmZl9yaWdodF8wLCA5Ljk5OTk5OTcyNDIzMzIzMmUtMDFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY29lZmZfcmlnaHRfMiwgLTMuMDg0MjQyNTM1NjE5OTI4ZS0wMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zihjb2VmZl9yaWdodF80LCAxLjU4NDk5MTUyNTcwMDMyNGUtMDJmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY29lZmZfcmlnaHRfNiwgLTMuMTg4ODA1MDg0NjMxMzQyZS0wNGYpOworICBQYWNrZXQ4ZiB6X21pbnVzX3R3byA9IHBzdWIoeiwgcDhmX3R3byk7CisgIFBhY2tldDhmIHpfbWludXNfdHdvMiA9IHBtdWwoel9taW51c190d28sIHpfbWludXNfdHdvKTsKKyAgUGFja2V0OGYgcmlnaHQgPSBwbWFkZChwOGZfY29lZmZfcmlnaHRfNiwgel9taW51c190d28yLCBwOGZfY29lZmZfcmlnaHRfNCk7CisgIHJpZ2h0ID0gcG1hZGQocmlnaHQsIHpfbWludXNfdHdvMiwgcDhmX2NvZWZmX3JpZ2h0XzIpOworICByaWdodCA9IHBtYWRkKHJpZ2h0LCB6X21pbnVzX3R3bzIsIHA4Zl9jb2VmZl9yaWdodF8wKTsKKworICAvLyBFdmFsdWF0ZSB0aGUgcG9seW5vbWlhbCBmb3IgdGhlIGludGVydmFsIFstMSwxXSBpbiB6LgorICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zihjb2VmZl9sZWZ0XzEsIDcuODUzOTgxNTI1NDI3Mjk1ZS0wMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zihjb2VmZl9sZWZ0XzMsIC04LjA3NDUzNjcyNzA5MjM1MmUtMDJmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY29lZmZfbGVmdF81LCAyLjQ4OTg3MTk2NzgyNzAxOGUtMDNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY29lZmZfbGVmdF83LCAtMy41ODc3MjU4NDEyMTQyNTFlLTA1Zik7CisgIFBhY2tldDhmIHoyID0gcG11bCh6LCB6KTsKKyAgUGFja2V0OGYgbGVmdCA9IHBtYWRkKHA4Zl9jb2VmZl9sZWZ0XzcsIHoyLCBwOGZfY29lZmZfbGVmdF81KTsKKyAgbGVmdCA9IHBtYWRkKGxlZnQsIHoyLCBwOGZfY29lZmZfbGVmdF8zKTsKKyAgbGVmdCA9IHBtYWRkKGxlZnQsIHoyLCBwOGZfY29lZmZfbGVmdF8xKTsKKyAgbGVmdCA9IHBtdWwobGVmdCwgeik7CisKKyAgLy8gQXNzZW1ibGUgdGhlIHJlc3VsdHMsIGkuZS4gc2VsZWN0IHRoZSBsZWZ0IGFuZCByaWdodCBwb2x5bm9taWFscy4KKyAgbGVmdCA9IF9tbTI1Nl9hbmRub3RfcHMoaXZhbF9tYXNrLCBsZWZ0KTsKKyAgcmlnaHQgPSBfbW0yNTZfYW5kX3BzKGl2YWxfbWFzaywgcmlnaHQpOworICBQYWNrZXQ4ZiByZXMgPSBfbW0yNTZfb3JfcHMobGVmdCwgcmlnaHQpOworCisgIC8vIEZsaXAgdGhlIHNpZ24gb24gdGhlIG9kZCBpbnRlcnZhbHMgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICByZXMgPSBfbW0yNTZfeG9yX3BzKHJlcywgX21tMjU2X2Nhc3RzaTI1Nl9wcyhzaWduX2ZsaXBfbWFzaykpOworICByZXR1cm4gcmVzOworfQorCisvLyBOYXR1cmFsIGxvZ2FyaXRobQorLy8gQ29tcHV0ZXMgbG9nKHgpIGFzIGxvZygyXmUgKiBtKSA9IEMqZSArIGxvZyhtKSwgd2hlcmUgdGhlIGNvbnN0YW50IEMgPWxvZygyKQorLy8gYW5kIG0gaXMgaW4gdGhlIHJhbmdlIFtzcXJ0KDEvMiksc3FydCgyKSkuIEluIHRoaXMgcmFuZ2UsIHRoZSBsb2dhcml0aG0gY2FuCisvLyBiZSBlYXNpbHkgYXBwcm94aW1hdGVkIGJ5IGEgcG9seW5vbWlhbCBjZW50ZXJlZCBvbiBtPTEgZm9yIHN0YWJpbGl0eS4KKy8vIFRPRE8oZ29ubmV0KTogRnVydGhlciByZWR1Y2UgdGhlIGludGVydmFsIGFsbG93aW5nIGZvciBsb3dlci1kZWdyZWUKKy8vICAgICAgICAgICAgICAgcG9seW5vbWlhbCBpbnRlcnBvbGFudHMgLT4gLi4uIC0+IHByb2ZpdCEKK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDhmCitwbG9nPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgX3gpIHsKKyAgUGFja2V0OGYgeCA9IF94OworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZigxLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKDEyNmYsIDEyNi4wZik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGZfRlJPTV9JTlQoaW52X21hbnRfbWFzaywgfjB4N2Y4MDAwMDApOworCisgIC8vIFRoZSBzbWFsbGVzdCBub24gZGVub3JtYWxpemVkIGZsb2F0IG51bWJlci4KKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGZfRlJPTV9JTlQobWluX25vcm1fcG9zLCAweDAwODAwMDAwKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGZfRlJPTV9JTlQobWludXNfaW5mLCAweGZmODAwMDAwKTsKKworICAvLyBQb2x5bm9taWFsIGNvZWZmaWNpZW50cy4KKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX1NRUlRIRiwgMC43MDcxMDY3ODExODY1NDc1MjRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2xvZ19wMCwgNy4wMzc2ODM2MjkyRS0yZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19sb2dfcDEsIC0xLjE1MTQ2MTAzMTBFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2xvZ19wMiwgMS4xNjc2OTk4NzQwRS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19sb2dfcDMsIC0xLjI0MjAxNDA4NDZFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2xvZ19wNCwgKzEuNDI0OTMyMjc4N0UtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfbG9nX3A1LCAtMS42NjY4MDU3NjY1RS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19sb2dfcDYsICsyLjAwMDA3MTQ3NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2xvZ19wNywgLTIuNDk5OTk5Mzk5M0UtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfbG9nX3A4LCArMy4zMzMzMzMxMTc0RS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19sb2dfcTEsIC0yLjEyMTk0NDQwZS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19sb2dfcTIsIDAuNjkzMzU5Mzc1Zik7CisKKyAgUGFja2V0OGYgaW52YWxpZF9tYXNrID0gX21tMjU2X2NtcF9wcyh4LCBfbW0yNTZfc2V0emVyb19wcygpLCBfQ01QX05HRV9VUSk7IC8vIG5vdCBncmVhdGVyIGVxdWFsIGlzIHRydWUgaWYgeCBpcyBOYU4KKyAgUGFja2V0OGYgaXN6ZXJvX21hc2sgPSBfbW0yNTZfY21wX3BzKHgsIF9tbTI1Nl9zZXR6ZXJvX3BzKCksIF9DTVBfRVFfT1EpOworCisgIC8vIFRydW5jYXRlIGlucHV0IHZhbHVlcyB0byB0aGUgbWluaW11bSBwb3NpdGl2ZSBub3JtYWwuCisgIHggPSBwbWF4KHgsIHA4Zl9taW5fbm9ybV9wb3MpOworCisgIFBhY2tldDhmIGVtbTAgPSBwc2hpZnRyaWdodCh4LDIzKTsKKyAgUGFja2V0OGYgZSA9IF9tbTI1Nl9zdWJfcHMoZW1tMCwgcDhmXzEyNmYpOworCisgIC8vIFNldCB0aGUgZXhwb25lbnRzIHRvIC0xLCBpLmUuIHggYXJlIGluIHRoZSByYW5nZSBbMC41LDEpLgorICB4ID0gX21tMjU2X2FuZF9wcyh4LCBwOGZfaW52X21hbnRfbWFzayk7CisgIHggPSBfbW0yNTZfb3JfcHMoeCwgcDhmX2hhbGYpOworCisgIC8vIHBhcnQyOiBTaGlmdCB0aGUgaW5wdXRzIGZyb20gdGhlIHJhbmdlIFswLjUsMSkgdG8gW3NxcnQoMS8yKSxzcXJ0KDIpKQorICAvLyBhbmQgc2hpZnQgYnkgLTEuIFRoZSB2YWx1ZXMgYXJlIHRoZW4gY2VudGVyZWQgYXJvdW5kIDAsIHdoaWNoIGltcHJvdmVzCisgIC8vIHRoZSBzdGFiaWxpdHkgb2YgdGhlIHBvbHlub21pYWwgZXZhbHVhdGlvbi4KKyAgLy8gICBpZiggeCA8IFNRUlRIRiApIHsKKyAgLy8gICAgIGUgLT0gMTsKKyAgLy8gICAgIHggPSB4ICsgeCAtIDEuMDsKKyAgLy8gICB9IGVsc2UgeyB4ID0geCAtIDEuMDsgfQorICBQYWNrZXQ4ZiBtYXNrID0gX21tMjU2X2NtcF9wcyh4LCBwOGZfY2VwaGVzX1NRUlRIRiwgX0NNUF9MVF9PUSk7CisgIFBhY2tldDhmIHRtcCA9IF9tbTI1Nl9hbmRfcHMoeCwgbWFzayk7CisgIHggPSBwc3ViKHgsIHA4Zl8xKTsKKyAgZSA9IHBzdWIoZSwgX21tMjU2X2FuZF9wcyhwOGZfMSwgbWFzaykpOworICB4ID0gcGFkZCh4LCB0bXApOworCisgIFBhY2tldDhmIHgyID0gcG11bCh4LCB4KTsKKyAgUGFja2V0OGYgeDMgPSBwbXVsKHgyLCB4KTsKKworICAvLyBFdmFsdWF0ZSB0aGUgcG9seW5vbWlhbCBhcHByb3hpbWFudCBvZiBkZWdyZWUgOCBpbiB0aHJlZSBwYXJ0cywgcHJvYmFibHkKKyAgLy8gdG8gaW1wcm92ZSBpbnN0cnVjdGlvbi1sZXZlbCBwYXJhbGxlbGlzbS4KKyAgUGFja2V0OGYgeSwgeTEsIHkyOworICB5ID0gcG1hZGQocDhmX2NlcGhlc19sb2dfcDAsIHgsIHA4Zl9jZXBoZXNfbG9nX3AxKTsKKyAgeTEgPSBwbWFkZChwOGZfY2VwaGVzX2xvZ19wMywgeCwgcDhmX2NlcGhlc19sb2dfcDQpOworICB5MiA9IHBtYWRkKHA4Zl9jZXBoZXNfbG9nX3A2LCB4LCBwOGZfY2VwaGVzX2xvZ19wNyk7CisgIHkgPSBwbWFkZCh5LCB4LCBwOGZfY2VwaGVzX2xvZ19wMik7CisgIHkxID0gcG1hZGQoeTEsIHgsIHA4Zl9jZXBoZXNfbG9nX3A1KTsKKyAgeTIgPSBwbWFkZCh5MiwgeCwgcDhmX2NlcGhlc19sb2dfcDgpOworICB5ID0gcG1hZGQoeSwgeDMsIHkxKTsKKyAgeSA9IHBtYWRkKHksIHgzLCB5Mik7CisgIHkgPSBwbXVsKHksIHgzKTsKKworICAvLyBBZGQgdGhlIGxvZ2FyaXRobSBvZiB0aGUgZXhwb25lbnQgYmFjayB0byB0aGUgcmVzdWx0IG9mIHRoZSBpbnRlcnBvbGF0aW9uLgorICB5MSA9IHBtdWwoZSwgcDhmX2NlcGhlc19sb2dfcTEpOworICB0bXAgPSBwbXVsKHgyLCBwOGZfaGFsZik7CisgIHkgPSBwYWRkKHksIHkxKTsKKyAgeCA9IHBzdWIoeCwgdG1wKTsKKyAgeTIgPSBwbXVsKGUsIHA4Zl9jZXBoZXNfbG9nX3EyKTsKKyAgeCA9IHBhZGQoeCwgeSk7CisgIHggPSBwYWRkKHgsIHkyKTsKKworICAvLyBGaWx0ZXIgb3V0IGludmFsaWQgaW5wdXRzLCBpLmUuIG5lZ2F0aXZlIGFyZyB3aWxsIGJlIE5BTiwgMCB3aWxsIGJlIC1JTkYuCisgIHJldHVybiBfbW0yNTZfb3JfcHMoCisgICAgICBfbW0yNTZfYW5kbm90X3BzKGlzemVyb19tYXNrLCBfbW0yNTZfb3JfcHMoeCwgaW52YWxpZF9tYXNrKSksCisgICAgICBfbW0yNTZfYW5kX3BzKGlzemVyb19tYXNrLCBwOGZfbWludXNfaW5mKSk7Cit9CisKKy8vIEV4cG9uZW50aWFsIGZ1bmN0aW9uLiBXb3JrcyBieSB3cml0aW5nICJ4ID0gbSpsb2coMikgKyByIiB3aGVyZQorLy8gIm0gPSBmbG9vcih4L2xvZygyKSsxLzIpIiBhbmQgInIiIGlzIHRoZSByZW1haW5kZXIuIFRoZSByZXN1bHQgaXMgdGhlbgorLy8gImV4cCh4KSA9IDJebSpleHAocikiIHdoZXJlIGV4cChyKSBpcyBpbiB0aGUgcmFuZ2UgWy0xLDEpLgordGVtcGxhdGUgPD4KK0VJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQgUGFja2V0OGYKK3BleHA8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBfeCkgeworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZigxLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKDEyNywgMTI3LjBmKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihleHBfaGksIDg4LjM3NjI2MjY2NDc5NTBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoZXhwX2xvLCAtODguMzc2MjYyNjY0Nzk0OWYpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19MT0cyRUYsIDEuNDQyNjk1MDQwODg4OTYzNDFmKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfZXhwX3AwLCAxLjk4NzU2OTE1MDBFLTRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2V4cF9wMSwgMS4zOTgxOTk5NTA3RS0zZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19leHBfcDIsIDguMzMzNDUxOTA3M0UtM2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfZXhwX3AzLCA0LjE2NjU3OTU4OTRFLTJmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGYoY2VwaGVzX2V4cF9wNCwgMS42NjY2NjY1NDU5RS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKGNlcGhlc19leHBfcDUsIDUuMDAwMDAwMTIwMUUtMWYpOworCisgIC8vIENsYW1wIHguCisgIFBhY2tldDhmIHggPSBwbWF4KHBtaW4oX3gsIHA4Zl9leHBfaGkpLCBwOGZfZXhwX2xvKTsKKworICAvLyBFeHByZXNzIGV4cCh4KSBhcyBleHAobSpsbigyKSArIHIpLCBzdGFydCBieSBleHRyYWN0aW5nCisgIC8vIG0gPSBmbG9vcih4L2xuKDIpICsgMC41KS4KKyAgUGFja2V0OGYgbSA9IF9tbTI1Nl9mbG9vcl9wcyhwbWFkZCh4LCBwOGZfY2VwaGVzX0xPRzJFRiwgcDhmX2hhbGYpKTsKKworLy8gR2V0IHIgPSB4IC0gbSpsbigyKS4gSWYgbm8gRk1BIGluc3RydWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBtKmxuKDIpIGlzCisvLyBzdWJ0cmFjdGVkIG91dCBpbiB0d28gcGFydHMsIG0qQzErbSpDMiA9IG0qbG4oMiksIHRvIGF2b2lkIGFjY3VtdWxhdGluZworLy8gdHJ1bmNhdGlvbiBlcnJvcnMuIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlICJwbWFkZCIgZnVuY3Rpb24gaGVyZSB0bworLy8gZW5zdXJlIHRoYXQgYSBwcmVjaXNpb24tcHJlc2VydmluZyBGTUEgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4KKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfRk1BCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKG5sbjIsIC0wLjY5MzE0NzE4MDU1OTk0NTNmKTsKKyAgUGFja2V0OGYgciA9IF9tbTI1Nl9mbWFkZF9wcyhtLCBwOGZfbmxuMiwgeCk7CisjZWxzZQorICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfZXhwX0MxLCAwLjY5MzM1OTM3NWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihjZXBoZXNfZXhwX0MyLCAtMi4xMjE5NDQ0MGUtNGYpOworICBQYWNrZXQ4ZiByID0gcHN1Yih4LCBwbXVsKG0sIHA4Zl9jZXBoZXNfZXhwX0MxKSk7CisgIHIgPSBwc3ViKHIsIHBtdWwobSwgcDhmX2NlcGhlc19leHBfQzIpKTsKKyNlbmRpZgorCisgIFBhY2tldDhmIHIyID0gcG11bChyLCByKTsKKworICAvLyBUT0RPKGdvbm5ldCk6IFNwbGl0IGludG8gb2RkL2V2ZW4gcG9seW5vbWlhbHMgYW5kIHRyeSB0byBleHBsb2l0CisgIC8vICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCisgIFBhY2tldDhmIHkgPSBwOGZfY2VwaGVzX2V4cF9wMDsKKyAgeSA9IHBtYWRkKHksIHIsIHA4Zl9jZXBoZXNfZXhwX3AxKTsKKyAgeSA9IHBtYWRkKHksIHIsIHA4Zl9jZXBoZXNfZXhwX3AyKTsKKyAgeSA9IHBtYWRkKHksIHIsIHA4Zl9jZXBoZXNfZXhwX3AzKTsKKyAgeSA9IHBtYWRkKHksIHIsIHA4Zl9jZXBoZXNfZXhwX3A0KTsKKyAgeSA9IHBtYWRkKHksIHIsIHA4Zl9jZXBoZXNfZXhwX3A1KTsKKyAgeSA9IHBtYWRkKHksIHIyLCByKTsKKyAgeSA9IHBhZGQoeSwgcDhmXzEpOworCisgIC8vIEJ1aWxkIGVtbTAgPSAyXm0uCisgIFBhY2tldDhpIGVtbTAgPSBfbW0yNTZfY3Z0dHBzX2VwaTMyKHBhZGQobSwgcDhmXzEyNykpOworICBlbW0wID0gcHNoaWZ0bGVmdChlbW0wLCAyMyk7CisKKyAgLy8gUmV0dXJuIDJebSAqIGV4cChyKS4KKyAgcmV0dXJuIHBtYXgocG11bCh5LCBfbW0yNTZfY2FzdHNpMjU2X3BzKGVtbTApKSwgX3gpOworfQorCisvLyBIeXBlcmJvbGljIFRhbmdlbnQgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRCBQYWNrZXQ4ZgorcHRhbmg8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiB4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Z2VuZXJpY19mYXN0X3RhbmhfZmxvYXQoeCk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDRkCitwZXhwPFBhY2tldDRkPihjb25zdCBQYWNrZXQ0ZCYgX3gpIHsKKyAgUGFja2V0NGQgeCA9IF94OworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKDEsIDEuMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKDIsIDIuMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKGhhbGYsIDAuNSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoZXhwX2hpLCA3MDkuNDM3KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoZXhwX2xvLCAtNzA5LjQzNjEzOTMwMyk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoY2VwaGVzX0xPRzJFRiwgMS40NDI2OTUwNDA4ODg5NjM0MDczNTk5KTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZChjZXBoZXNfZXhwX3AwLCAxLjI2MTc3MTkzMDc0ODEwNTkwODc4ZS00KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoY2VwaGVzX2V4cF9wMSwgMy4wMjk5NDQwNzcwNzQ0MTk2MTMwMGUtMik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKGNlcGhlc19leHBfcDIsIDkuOTk5OTk5OTk5OTk5OTk5OTk5MTBlLTEpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKGNlcGhlc19leHBfcTAsIDMuMDAxOTg1MDUxMzg2NjQ0NTUwNDJlLTYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZChjZXBoZXNfZXhwX3ExLCAyLjUyNDQ4MzQwMzQ5Njg0MTA0MTkyZS0zKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoY2VwaGVzX2V4cF9xMiwgMi4yNzI2NTU0ODIwODE1NTAyODc2NmUtMSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKGNlcGhlc19leHBfcTMsIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDllMCk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoY2VwaGVzX2V4cF9DMSwgMC42OTMxNDU3NTE5NTMxMjUpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZChjZXBoZXNfZXhwX0MyLCAxLjQyODYwNjgyMDMwOTQxNzIzMjEyZS02KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoMTAyMywgMTAyMyk7CisKKyAgUGFja2V0NGQgdG1wLCBmeDsKKworICAvLyBjbGFtcCB4CisgIHggPSBwbWF4KHBtaW4oeCwgcDRkX2V4cF9oaSksIHA0ZF9leHBfbG8pOworICAvLyBFeHByZXNzIGV4cCh4KSBhcyBleHAoZyArIG4qbG9nKDIpKS4KKyAgZnggPSBwbWFkZChwNGRfY2VwaGVzX0xPRzJFRiwgeCwgcDRkX2hhbGYpOworCisgIC8vIEdldCB0aGUgaW50ZWdlciBtb2R1bHVzIG9mIGxvZygyKSwgaS5lLiB0aGUgIm4iIGRlc2NyaWJlZCBhYm92ZS4KKyAgZnggPSBfbW0yNTZfZmxvb3JfcGQoZngpOworCisgIC8vIEdldCB0aGUgcmVtYWluZGVyIG1vZHVsbyBsb2coMiksIGkuZS4gdGhlICJnIiBkZXNjcmliZWQgYWJvdmUuIFN1YnRyYWN0CisgIC8vIG4qbG9nKDIpIG91dCBpbiB0d28gc3RlcHMsIGkuZS4gbipDMSArIG4qQzIsIEMxK0MyPWxvZzIgdG8gZ2V0IHRoZSBsYXN0CisgIC8vIGRpZ2l0cyByaWdodC4KKyAgdG1wID0gcG11bChmeCwgcDRkX2NlcGhlc19leHBfQzEpOworICBQYWNrZXQ0ZCB6ID0gcG11bChmeCwgcDRkX2NlcGhlc19leHBfQzIpOworICB4ID0gcHN1Yih4LCB0bXApOworICB4ID0gcHN1Yih4LCB6KTsKKworICBQYWNrZXQ0ZCB4MiA9IHBtdWwoeCwgeCk7CisKKyAgLy8gRXZhbHVhdGUgdGhlIG51bWVyYXRvciBwb2x5bm9taWFsIG9mIHRoZSByYXRpb25hbCBpbnRlcnBvbGFudC4KKyAgUGFja2V0NGQgcHggPSBwNGRfY2VwaGVzX2V4cF9wMDsKKyAgcHggPSBwbWFkZChweCwgeDIsIHA0ZF9jZXBoZXNfZXhwX3AxKTsKKyAgcHggPSBwbWFkZChweCwgeDIsIHA0ZF9jZXBoZXNfZXhwX3AyKTsKKyAgcHggPSBwbXVsKHB4LCB4KTsKKworICAvLyBFdmFsdWF0ZSB0aGUgZGVub21pbmF0b3IgcG9seW5vbWlhbCBvZiB0aGUgcmF0aW9uYWwgaW50ZXJwb2xhbnQuCisgIFBhY2tldDRkIHF4ID0gcDRkX2NlcGhlc19leHBfcTA7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwNGRfY2VwaGVzX2V4cF9xMSk7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwNGRfY2VwaGVzX2V4cF9xMik7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwNGRfY2VwaGVzX2V4cF9xMyk7CisKKyAgLy8gSSBkb24ndCByZWFsbHkgZ2V0IHRoaXMgYml0LCBjb3BpZWQgZnJvbSB0aGUgU1NFMiByb3V0aW5lcywgc28uLi4KKyAgLy8gVE9ETyhnb25uZXQpOiBGaWd1cmUgb3V0IHdoYXQgaXMgZ29pbmcgb24gaGVyZSwgcGVyaGFwcyBmaW5kIGEgYmV0dGVyCisgIC8vIHJhdGlvbmFsIGludGVycG9sYW50PworICB4ID0gX21tMjU2X2Rpdl9wZChweCwgcHN1YihxeCwgcHgpKTsKKyAgeCA9IHBtYWRkKHA0ZF8yLCB4LCBwNGRfMSk7CisKKyAgLy8gQnVpbGQgZT0yXm4gYnkgY29uc3RydWN0aW5nIHRoZSBleHBvbmVudHMgaW4gYSAxMjgtYml0IHZlY3RvciBhbmQKKyAgLy8gc2hpZnRpbmcgdGhlbSB0byB3aGVyZSB0aGV5IGJlbG9uZyBpbiBkb3VibGUtcHJlY2lzaW9uIHZhbHVlcy4KKyAgX19tMTI4aSBlbW0wID0gX21tMjU2X2N2dHBkX2VwaTMyKGZ4KTsKKyAgZW1tMCA9IF9tbV9hZGRfZXBpMzIoZW1tMCwgcDRpXzEwMjMpOworICBlbW0wID0gX21tX3NodWZmbGVfZXBpMzIoZW1tMCwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkpOworICBfX20xMjhpIGxvID0gX21tX3NsbGlfZXBpNjQoZW1tMCwgNTIpOworICBfX20xMjhpIGhpID0gX21tX3NsbGlfZXBpNjQoX21tX3NybGlfZXBpNjQoZW1tMCwgMzIpLCA1Mik7CisgIF9fbTI1NmkgZSA9IF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2KF9tbTI1Nl9zZXR6ZXJvX3NpMjU2KCksIGxvLCAwKTsKKyAgZSA9IF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2KGUsIGhpLCAxKTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIHJlc3VsdCAyXm4gKiBleHAoZykgPSBlICogeC4gVGhlIG1heCBpcyB1c2VkIHRvIGNhdGNoCisgIC8vIG5vbi1maW5pdGUgdmFsdWVzIGluIHRoZSBpbnB1dC4KKyAgcmV0dXJuIHBtYXgocG11bCh4LCBfbW0yNTZfY2FzdHNpMjU2X3BkKGUpKSwgX3gpOworfQorCisvLyBGdW5jdGlvbnMgZm9yIHNxcnQuCisvLyBUaGUgRUlHRU5fRkFTVF9NQVRIIHZlcnNpb24gdXNlcyB0aGUgX21tX3JzcXJ0X3BzIGFwcHJveGltYXRpb24gYW5kIG9uZSBzdGVwCisvLyBvZiBOZXd0b24ncyBtZXRob2QsIGF0IGEgY29zdCBvZiAxLTIgYml0cyBvZiBwcmVjaXNpb24gYXMgb3Bwb3NlZCB0byB0aGUKKy8vIGV4YWN0IHNvbHV0aW9uLiBJdCBkb2VzIG5vdCBoYW5kbGUgK2luZiwgb3IgZGVub3JtYWxpemVkIG51bWJlcnMgY29ycmVjdGx5LgorLy8gVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgbm90IGp1c3Qgc3BlZWQsIGJ1dCBhbHNvIHRoZSBmYWN0IHRoYXQKKy8vIGl0IGNhbiBiZSBpbmxpbmVkIGFuZCBwaXBlbGluZWQgd2l0aCBvdGhlciBjb21wdXRhdGlvbnMsIGZ1cnRoZXIgcmVkdWNpbmcgaXRzCisvLyBlZmZlY3RpdmUgbGF0ZW5jeS4gVGhpcyBpcyBzaW1pbGFyIHRvIFF1YWtlMydzIGZhc3QgaW52ZXJzZSBzcXVhcmUgcm9vdC4KKy8vIEZvciBkZXRhaWwgc2VlIGhlcmU6IGh0dHA6Ly93d3cuYmV5b25kM2QuY29tL2NvbnRlbnQvYXJ0aWNsZXMvOC8KKyNpZiBFSUdFTl9GQVNUX01BVEgKK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDhmCitwc3FydDxQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGYmIF94KSB7CisgIFBhY2tldDhmIGhhbGYgPSBwbXVsKF94LCBwc2V0MTxQYWNrZXQ4Zj4oLjVmKSk7CisgIFBhY2tldDhmIGRlbm9ybWFsX21hc2sgPSBfbW0yNTZfYW5kX3BzKAorICAgICAgX21tMjU2X2NtcF9wcyhfeCwgcHNldDE8UGFja2V0OGY+KChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKSgpKSwKKyAgICAgICAgICAgICAgICAgICAgX0NNUF9MVF9PUSksCisgICAgICBfbW0yNTZfY21wX3BzKF94LCBfbW0yNTZfc2V0emVyb19wcygpLCBfQ01QX0dFX09RKSk7CisKKyAgLy8gQ29tcHV0ZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FsIHNxcnQuCisgIFBhY2tldDhmIHggPSBfbW0yNTZfcnNxcnRfcHMoX3gpOworICAvLyBEbyBhIHNpbmdsZSBzdGVwIG9mIE5ld3RvbidzIGl0ZXJhdGlvbi4KKyAgeCA9IHBtdWwoeCwgcHN1Yihwc2V0MTxQYWNrZXQ4Zj4oMS41ZiksIHBtdWwoaGFsZiwgcG11bCh4LHgpKSkpOworICAvLyBGbHVzaCByZXN1bHRzIGZvciBkZW5vcm1hbHMgdG8gemVyby4KKyAgcmV0dXJuIF9tbTI1Nl9hbmRub3RfcHMoZGVub3JtYWxfbWFzaywgcG11bChfeCx4KSk7Cit9CisjZWxzZQordGVtcGxhdGUgPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0OGYgcHNxcnQ8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiB4KSB7CisgIHJldHVybiBfbW0yNTZfc3FydF9wcyh4KTsKK30KKyNlbmRpZgordGVtcGxhdGUgPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGQgcHNxcnQ8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiB4KSB7CisgIHJldHVybiBfbW0yNTZfc3FydF9wZCh4KTsKK30KKyNpZiBFSUdFTl9GQVNUX01BVEgKKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ4ZiBwcnNxcnQ8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBfeCkgeworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zl9GUk9NX0lOVChpbmYsIDB4N2Y4MDAwMDApOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zl9GUk9NX0lOVChuYW4sIDB4N2ZjMDAwMDApOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZihvbmVfcG9pbnRfZml2ZSwgMS41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKG1pbnVzX2hhbGYsIC0wLjVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGZfRlJPTV9JTlQoZmx0X21pbiwgMHgwMDgwMDAwMCk7CisKKyAgUGFja2V0OGYgbmVnX2hhbGYgPSBwbXVsKF94LCBwOGZfbWludXNfaGFsZik7CisKKyAgLy8gc2VsZWN0IG9ubHkgdGhlIGludmVyc2Ugc3FydCBvZiBwb3NpdGl2ZSBub3JtYWwgaW5wdXRzIChkZW5vcm1hbHMgYXJlCisgIC8vIGZsdXNoZWQgdG8gemVybyBhbmQgY2F1c2UgaW5mcyBhcyB3ZWxsKS4KKyAgUGFja2V0OGYgbGVfemVyb19tYXNrID0gX21tMjU2X2NtcF9wcyhfeCwgcDhmX2ZsdF9taW4sIF9DTVBfTFRfT1EpOworICBQYWNrZXQ4ZiB4ID0gX21tMjU2X2FuZG5vdF9wcyhsZV96ZXJvX21hc2ssIF9tbTI1Nl9yc3FydF9wcyhfeCkpOworCisgIC8vIEZpbGwgaW4gTmFOcyBhbmQgSW5mcyBmb3IgdGhlIG5lZ2F0aXZlL3plcm8gZW50cmllcy4KKyAgUGFja2V0OGYgbmVnX21hc2sgPSBfbW0yNTZfY21wX3BzKF94LCBfbW0yNTZfc2V0emVyb19wcygpLCBfQ01QX0xUX09RKTsKKyAgUGFja2V0OGYgemVyb19tYXNrID0gX21tMjU2X2FuZG5vdF9wcyhuZWdfbWFzaywgbGVfemVyb19tYXNrKTsKKyAgUGFja2V0OGYgaW5mc19hbmRfbmFucyA9IF9tbTI1Nl9vcl9wcyhfbW0yNTZfYW5kX3BzKG5lZ19tYXNrLCBwOGZfbmFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW0yNTZfYW5kX3BzKHplcm9fbWFzaywgcDhmX2luZikpOworCisgIC8vIERvIGEgc2luZ2xlIHN0ZXAgb2YgTmV3dG9uJ3MgaXRlcmF0aW9uLgorICB4ID0gcG11bCh4LCBwbWFkZChuZWdfaGFsZiwgcG11bCh4LCB4KSwgcDhmX29uZV9wb2ludF9maXZlKSk7CisKKyAgLy8gSW5zZXJ0IE5hTnMgYW5kIEluZnMgaW4gYWxsIHRoZSByaWdodCBwbGFjZXMuCisgIHJldHVybiBfbW0yNTZfb3JfcHMoeCwgaW5mc19hbmRfbmFucyk7Cit9CisKKyNlbHNlCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ4ZiBwcnNxcnQ8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiB4KSB7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKG9uZSwgMS4wZik7CisgIHJldHVybiBfbW0yNTZfZGl2X3BzKHA4Zl9vbmUsIF9tbTI1Nl9zcXJ0X3BzKHgpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZCBwcnNxcnQ8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiB4KSB7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRkKG9uZSwgMS4wKTsKKyAgcmV0dXJuIF9tbTI1Nl9kaXZfcGQocDRkX29uZSwgX21tMjU2X3NxcnRfcGQoeCkpOworfQorCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX01BVEhfRlVOQ1RJT05TX0FWWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWC9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWC9QYWNrZXRNYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1ZDQwZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL1BhY2tldE1hdGguaApAQCAtMCwwICsxLDYzMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgKGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tKQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQUNLRVRfTUFUSF9BVlhfSAorI2RlZmluZSBFSUdFTl9QQUNLRVRfTUFUSF9BVlhfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyNkZWZpbmUgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCA4CisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUworI2RlZmluZSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUyAoMipzaXplb2Yodm9pZCopKQorI2VuZGlmCisKKyNpZmRlZiBfX0ZNQV9fCisjaWZuZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorI2RlZmluZSBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgX19tMjU2ICBQYWNrZXQ4ZjsKK3R5cGVkZWYgX19tMjU2aSBQYWNrZXQ4aTsKK3R5cGVkZWYgX19tMjU2ZCBQYWNrZXQ0ZDsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxfX20yNTY+ICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8X19tMjU2aT4geyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPF9fbTI1NmQ+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhmKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ4ZiBwOGZfIyNOQU1FID0gcHNldDE8UGFja2V0OGY+KFgpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGQoTkFNRSxYKSBcCisgIGNvbnN0IFBhY2tldDRkIHA0ZF8jI05BTUUgPSBwc2V0MTxQYWNrZXQ0ZD4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4Zl9GUk9NX0lOVChOQU1FLFgpIFwKKyAgY29uc3QgUGFja2V0OGYgcDhmXyMjTkFNRSA9IF9tbTI1Nl9jYXN0c2kyNTZfcHMocHNldDE8UGFja2V0OGk+KFgpKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhpKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ4aSBwOGlfIyNOQU1FID0gcHNldDE8UGFja2V0OGk+KFgpCisKKy8vIFVzZSB0aGUgcGFja2V0X3RyYWl0cyBkZWZpbmVkIGluIEFWWDUxMi9QYWNrZXRNYXRoLmggaW5zdGVhZCBpZiB3ZSdyZSBnb2luZworLy8gdG8gbGV2ZXJhZ2UgQVZYNTEyIGluc3RydWN0aW9ucy4KKyNpZm5kZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMgordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0OGYgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQ0ZiBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT04LAorICAgIEhhc0hhbGZQYWNrZXQgPSAxLAorCisgICAgSGFzRGl2ICA9IDEsCisgICAgSGFzU2luICA9IEVJR0VOX0ZBU1RfTUFUSCwKKyAgICBIYXNDb3MgID0gMCwKKyAgICBIYXNMb2cgID0gMSwKKyAgICBIYXNFeHAgID0gMSwKKyAgICBIYXNTcXJ0ID0gMSwKKyAgICBIYXNSc3FydCA9IDEsCisgICAgSGFzVGFuaCAgPSBFSUdFTl9GQVNUX01BVEgsCisgICAgSGFzQmxlbmQgPSAxLAorICAgIEhhc1JvdW5kID0gMSwKKyAgICBIYXNGbG9vciA9IDEsCisgICAgSGFzQ2VpbCA9IDEKKyAgfTsKK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPGRvdWJsZT4gOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ0ZCB0eXBlOworICB0eXBlZGVmIFBhY2tldDJkIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQsCisgICAgSGFzSGFsZlBhY2tldCA9IDEsCisKKyAgICBIYXNEaXYgID0gMSwKKyAgICBIYXNFeHAgID0gMSwKKyAgICBIYXNTcXJ0ID0gMSwKKyAgICBIYXNSc3FydCA9IDEsCisgICAgSGFzQmxlbmQgPSAxLAorICAgIEhhc1JvdW5kID0gMSwKKyAgICBIYXNGbG9vciA9IDEsCisgICAgSGFzQ2VpbCA9IDEKKyAgfTsKK307CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2NhbGFyX2Rpdl9jb3N0PGZsb2F0LHRydWU+IHsgZW51bSB7IHZhbHVlID0gMTQgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHNjYWxhcl9kaXZfY29zdDxkb3VibGUsdHJ1ZT4geyBlbnVtIHsgdmFsdWUgPSAxNiB9OyB9OworCisvKiBQcm9wZXIgc3VwcG9ydCBmb3IgaW50ZWdlcnMgaXMgb25seSBwcm92aWRlZCBieSBBVlgyLiBJbiB0aGUgbWVhbnRpbWUsIHdlJ2xsCisgICB1c2UgU1NFIGluc3RydWN0aW9ucyBhbmQgcGFja2V0cyB0byBkZWFsIHdpdGggaW50ZWdlcnMuCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPGludD4gICAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ4aSB0eXBlOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT04CisgIH07Cit9OworKi8KKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDhmPiB7IHR5cGVkZWYgZmxvYXQgIHR5cGU7IHR5cGVkZWYgUGFja2V0NGYgaGFsZjsgZW51bSB7c2l6ZT04LCBhbGlnbm1lbnQ9QWxpZ25lZDMyfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0ZD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyB0eXBlZGVmIFBhY2tldDJkIGhhbGY7IGVudW0ge3NpemU9NCwgYWxpZ25tZW50PUFsaWduZWQzMn07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0OGk+IHsgdHlwZWRlZiBpbnQgICAgdHlwZTsgdHlwZWRlZiBQYWNrZXQ0aSBoYWxmOyBlbnVtIHtzaXplPTgsIGFsaWdubWVudD1BbGlnbmVkMzJ9OyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcHNldDE8UGFja2V0OGY+KGNvbnN0IGZsb2F0JiAgZnJvbSkgeyByZXR1cm4gX21tMjU2X3NldDFfcHMoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwc2V0MTxQYWNrZXQ0ZD4oY29uc3QgZG91YmxlJiBmcm9tKSB7IHJldHVybiBfbW0yNTZfc2V0MV9wZChmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhpIHBzZXQxPFBhY2tldDhpPihjb25zdCBpbnQmICAgIGZyb20pIHsgcmV0dXJuIF9tbTI1Nl9zZXQxX2VwaTMyKGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbG9hZDE8UGFja2V0OGY+KGNvbnN0IGZsb2F0KiAgZnJvbSkgeyByZXR1cm4gX21tMjU2X2Jyb2FkY2FzdF9zcyhmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBsb2FkMTxQYWNrZXQ0ZD4oY29uc3QgZG91YmxlKiBmcm9tKSB7IHJldHVybiBfbW0yNTZfYnJvYWRjYXN0X3NkKGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbHNldDxQYWNrZXQ4Zj4oY29uc3QgZmxvYXQmIGEpIHsgcmV0dXJuIF9tbTI1Nl9hZGRfcHMoX21tMjU2X3NldDFfcHMoYSksIF9tbTI1Nl9zZXRfcHMoNy4wLDYuMCw1LjAsNC4wLDMuMCwyLjAsMS4wLDAuMCkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGxzZXQ8UGFja2V0NGQ+KGNvbnN0IGRvdWJsZSYgYSkgeyByZXR1cm4gX21tMjU2X2FkZF9wZChfbW0yNTZfc2V0MV9wZChhKSwgX21tMjU2X3NldF9wZCgzLjAsMi4wLDEuMCwwLjApKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcGFkZDxQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGYmIGEsIGNvbnN0IFBhY2tldDhmJiBiKSB7IHJldHVybiBfbW0yNTZfYWRkX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwYWRkPFBhY2tldDRkPihjb25zdCBQYWNrZXQ0ZCYgYSwgY29uc3QgUGFja2V0NGQmIGIpIHsgcmV0dXJuIF9tbTI1Nl9hZGRfcGQoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcHN1YjxQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGYmIGEsIGNvbnN0IFBhY2tldDhmJiBiKSB7IHJldHVybiBfbW0yNTZfc3ViX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwc3ViPFBhY2tldDRkPihjb25zdCBQYWNrZXQ0ZCYgYSwgY29uc3QgUGFja2V0NGQmIGIpIHsgcmV0dXJuIF9tbTI1Nl9zdWJfcGQoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcG5lZ2F0ZShjb25zdCBQYWNrZXQ4ZiYgYSkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zdWJfcHMoX21tMjU2X3NldDFfcHMoMC4wKSxhKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwbmVnYXRlKGNvbnN0IFBhY2tldDRkJiBhKQoreworICByZXR1cm4gX21tMjU2X3N1Yl9wZChfbW0yNTZfc2V0MV9wZCgwLjApLGEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcGNvbmooY29uc3QgUGFja2V0OGYmIGEpIHsgcmV0dXJuIGE7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwY29uaihjb25zdCBQYWNrZXQ0ZCYgYSkgeyByZXR1cm4gYTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhpIHBjb25qKGNvbnN0IFBhY2tldDhpJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbXVsPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSwgY29uc3QgUGFja2V0OGYmIGIpIHsgcmV0dXJuIF9tbTI1Nl9tdWxfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBtdWw8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYikgeyByZXR1cm4gX21tMjU2X211bF9wZChhLGIpOyB9CisKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBkaXY8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhLCBjb25zdCBQYWNrZXQ4ZiYgYikgeyByZXR1cm4gX21tMjU2X2Rpdl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGRpdjxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEsIGNvbnN0IFBhY2tldDRkJiBiKSB7IHJldHVybiBfbW0yNTZfZGl2X3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aSBwZGl2PFBhY2tldDhpPihjb25zdCBQYWNrZXQ4aSYgLyphKi8sIGNvbnN0IFBhY2tldDhpJiAvKmIqLykKK3sgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJwYWNrZXQgaW50ZWdlciBkaXZpc2lvbiBhcmUgbm90IHN1cHBvcnRlZCBieSBBVlgiKTsKKyAgcmV0dXJuIHBzZXQxPFBhY2tldDhpPigwKTsKK30KKworI2lmZGVmIF9fRk1BX18KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbWFkZChjb25zdCBQYWNrZXQ4ZiYgYSwgY29uc3QgUGFja2V0OGYmIGIsIGNvbnN0IFBhY2tldDhmJiBjKSB7CisjaWYgKCBFSUdFTl9DT01QX0dOVUNfU1RSSUNUIHx8IChFSUdFTl9DT01QX0NMQU5HICYmIChFSUdFTl9DT01QX0NMQU5HPDMwOCkpICkKKyAgLy8gY2xhbmcgc3R1cGlkbHkgZ2VuZXJhdGVzIGEgdmZtYWRkMjEzcHMgaW5zdHJ1Y3Rpb24gcGx1cyBzb21lIHZtb3ZhcHMgb24gcmVnaXN0ZXJzLAorICAvLyBhbmQgZ2NjIHN0dXBpZGx5IGdlbmVyYXRlcyBhIHZmbWFkZDEzMnBzIGluc3RydWN0aW9uLAorICAvLyBzbyBsZXQncyBlbmZvcmNlIGl0IHRvIGdlbmVyYXRlIGEgdmZtYWRkMjMxcHMgaW5zdHJ1Y3Rpb24gc2luY2UgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlIGlzIHRvIGFjY3VtdWxhdGUKKyAgLy8gdGhlIHJlc3VsdCBvZiB0aGUgcHJvZHVjdC4KKyAgUGFja2V0OGYgcmVzID0gYzsKKyAgX19hc21fXygidmZtYWRkMjMxcHMgJVthXSwgJVtiXSwgJVtjXSIgOiBbY10gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbYl0gIngiIChiKSk7CisgIHJldHVybiByZXM7CisjZWxzZQorICByZXR1cm4gX21tMjU2X2ZtYWRkX3BzKGEsYixjKTsKKyNlbmRpZgorfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBtYWRkKGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYiwgY29uc3QgUGFja2V0NGQmIGMpIHsKKyNpZiAoIEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgfHwgKEVJR0VOX0NPTVBfQ0xBTkcgJiYgKEVJR0VOX0NPTVBfQ0xBTkc8MzA4KSkgKQorICAvLyBzZWUgYWJvdmUKKyAgUGFja2V0NGQgcmVzID0gYzsKKyAgX19hc21fXygidmZtYWRkMjMxcGQgJVthXSwgJVtiXSwgJVtjXSIgOiBbY10gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbYl0gIngiIChiKSk7CisgIHJldHVybiByZXM7CisjZWxzZQorICByZXR1cm4gX21tMjU2X2ZtYWRkX3BkKGEsYixjKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbWluPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSwgY29uc3QgUGFja2V0OGYmIGIpIHsgcmV0dXJuIF9tbTI1Nl9taW5fcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBtaW48UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYikgeyByZXR1cm4gX21tMjU2X21pbl9wZChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbWF4PFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSwgY29uc3QgUGFja2V0OGYmIGIpIHsgcmV0dXJuIF9tbTI1Nl9tYXhfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBtYXg8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYikgeyByZXR1cm4gX21tMjU2X21heF9wZChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwcm91bmQ8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhKSB7IHJldHVybiBfbW0yNTZfcm91bmRfcHMoYSwgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHByb3VuZDxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEpIHsgcmV0dXJuIF9tbTI1Nl9yb3VuZF9wZChhLCBfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwY2VpbDxQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGYmIGEpIHsgcmV0dXJuIF9tbTI1Nl9jZWlsX3BzKGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGNlaWw8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhKSB7IHJldHVybiBfbW0yNTZfY2VpbF9wZChhKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcGZsb29yPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSkgeyByZXR1cm4gX21tMjU2X2Zsb29yX3BzKGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGZsb29yPFBhY2tldDRkPihjb25zdCBQYWNrZXQ0ZCYgYSkgeyByZXR1cm4gX21tMjU2X2Zsb29yX3BkKGEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwYW5kPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSwgY29uc3QgUGFja2V0OGYmIGIpIHsgcmV0dXJuIF9tbTI1Nl9hbmRfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBhbmQ8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYikgeyByZXR1cm4gX21tMjU2X2FuZF9wZChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwb3I8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhLCBjb25zdCBQYWNrZXQ4ZiYgYikgeyByZXR1cm4gX21tMjU2X29yX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwb3I8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhLCBjb25zdCBQYWNrZXQ0ZCYgYikgeyByZXR1cm4gX21tMjU2X29yX3BkKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHB4b3I8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhLCBjb25zdCBQYWNrZXQ4ZiYgYikgeyByZXR1cm4gX21tMjU2X3hvcl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcHhvcjxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEsIGNvbnN0IFBhY2tldDRkJiBiKSB7IHJldHVybiBfbW0yNTZfeG9yX3BkKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBhbmRub3Q8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhLCBjb25zdCBQYWNrZXQ4ZiYgYikgeyByZXR1cm4gX21tMjU2X2FuZG5vdF9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGFuZG5vdDxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEsIGNvbnN0IFBhY2tldDRkJiBiKSB7IHJldHVybiBfbW0yNTZfYW5kbm90X3BkKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBsb2FkPFBhY2tldDhmPihjb25zdCBmbG9hdCogICBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gX21tMjU2X2xvYWRfcHMoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwbG9hZDxQYWNrZXQ0ZD4oY29uc3QgZG91YmxlKiAgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIF9tbTI1Nl9sb2FkX3BkKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGkgcGxvYWQ8UGFja2V0OGk+KGNvbnN0IGludCogICAgIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBfbW0yNTZfbG9hZF9zaTI1NihyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTI1NmkqPihmcm9tKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBsb2FkdTxQYWNrZXQ4Zj4oY29uc3QgZmxvYXQqIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIF9tbTI1Nl9sb2FkdV9wcyhmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBsb2FkdTxQYWNrZXQ0ZD4oY29uc3QgZG91YmxlKiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBfbW0yNTZfbG9hZHVfcGQoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aSBwbG9hZHU8UGFja2V0OGk+KGNvbnN0IGludCogZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gX21tMjU2X2xvYWR1X3NpMjU2KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMjU2aSo+KGZyb20pKTsgfQorCisvLyBMb2FkcyA0IGZsb2F0cyBmcm9tIG1lbW9yeSBhIHJldHVybnMgdGhlIHBhY2tldCB7YTAsIGEwICBhMSwgYTEsIGEyLCBhMiwgYTMsIGEzfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBsb2FkZHVwPFBhY2tldDhmPihjb25zdCBmbG9hdCogZnJvbSkKK3sKKyAgLy8gVE9ETyB0cnkgdG8gZmluZCBhIHdheSB0byBhdm9pZCB0aGUgbmVlZCBvZiBhIHRlbXBvcmFyeSByZWdpc3RlcgorLy8gICBQYWNrZXQ4ZiB0bXAgID0gX21tMjU2X2Nhc3RwczEyOF9wczI1NihfbW1fbG9hZHVfcHMoZnJvbSkpOworLy8gICB0bXAgPSBfbW0yNTZfaW5zZXJ0ZjEyOF9wcyh0bXAsIF9tbV9tb3ZlaGxfcHMoX21tMjU2X2Nhc3RwczI1Nl9wczEyOCh0bXApLF9tbTI1Nl9jYXN0cHMyNTZfcHMxMjgodG1wKSksIDEpOworLy8gICByZXR1cm4gX21tMjU2X3VucGFja2xvX3BzKHRtcCx0bXApOworICAKKyAgLy8gX21tMjU2X2luc2VydGYxMjhfcHMgaXMgdmVyeSBzbG93IG9uIEhhc3dlbGwsIHRodXM6CisgIFBhY2tldDhmIHRtcCA9IF9tbTI1Nl9icm9hZGNhc3RfcHMoKGNvbnN0IF9fbTEyOCopKGNvbnN0IHZvaWQqKWZyb20pOworICAvLyBtaW1pYyBhbiAiaW5wbGFjZSIgcGVybXV0YXRpb24gb2YgdGhlIGxvd2VyIDEyOGJpdHMgdXNpbmcgYSBibGVuZAorICB0bXAgPSBfbW0yNTZfYmxlbmRfcHModG1wLF9tbTI1Nl9jYXN0cHMxMjhfcHMyNTYoX21tX3Blcm11dGVfcHMoIF9tbTI1Nl9jYXN0cHMyNTZfcHMxMjgodG1wKSwgX01NX1NIVUZGTEUoMSwwLDEsMCkpKSwgMTUpOworICAvLyB0aGVuIHdlIGNhbiBwZXJmb3JtIGEgY29uc2lzdGVudCBwZXJtdXRhdGlvbiBvbiB0aGUgZ2xvYmFsIHJlZ2lzdGVyIHRvIGdldCBldmVyeXRoaW5nIGluIHNoYXBlOgorICByZXR1cm4gIF9tbTI1Nl9wZXJtdXRlX3BzKHRtcCwgX01NX1NIVUZGTEUoMywzLDIsMikpOworfQorLy8gTG9hZHMgMiBkb3VibGVzIGZyb20gbWVtb3J5IGEgcmV0dXJucyB0aGUgcGFja2V0IHthMCwgYTAgIGExLCBhMX0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwbG9hZGR1cDxQYWNrZXQ0ZD4oY29uc3QgZG91YmxlKiBmcm9tKQoreworICBQYWNrZXQ0ZCB0bXAgPSBfbW0yNTZfYnJvYWRjYXN0X3BkKChjb25zdCBfX20xMjhkKikoY29uc3Qgdm9pZCopZnJvbSk7CisgIHJldHVybiAgX21tMjU2X3Blcm11dGVfcGQodG1wLCAzPDwyKTsKK30KKworLy8gTG9hZHMgMiBmbG9hdHMgZnJvbSBtZW1vcnkgYSByZXR1cm5zIHRoZSBwYWNrZXQge2EwLCBhMCAgYTAsIGEwLCBhMSwgYTEsIGExLCBhMX0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwbG9hZHF1YWQ8UGFja2V0OGY+KGNvbnN0IGZsb2F0KiBmcm9tKQoreworICBQYWNrZXQ4ZiB0bXAgPSBfbW0yNTZfY2FzdHBzMTI4X3BzMjU2KF9tbV9icm9hZGNhc3Rfc3MoZnJvbSkpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfcHModG1wLCBfbW1fYnJvYWRjYXN0X3NzKGZyb20rMSksIDEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8ZmxvYXQ+KGZsb2F0KiAgIHRvLCBjb25zdCBQYWNrZXQ4ZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIF9tbTI1Nl9zdG9yZV9wcyh0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxkb3VibGU+KGRvdWJsZSogdG8sIGNvbnN0IFBhY2tldDRkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgX21tMjU2X3N0b3JlX3BkKHRvLCBmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGludD4oaW50KiAgICAgICB0bywgY29uc3QgUGFja2V0OGkmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBfbW0yNTZfc3RvcmV1X3NpMjU2KHJlaW50ZXJwcmV0X2Nhc3Q8X19tMjU2aSo+KHRvKSwgZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxmbG9hdD4oZmxvYXQqICAgdG8sIGNvbnN0IFBhY2tldDhmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBfbW0yNTZfc3RvcmV1X3BzKHRvLCBmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxkb3VibGU+KGRvdWJsZSogdG8sIGNvbnN0IFBhY2tldDRkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBfbW0yNTZfc3RvcmV1X3BkKHRvLCBmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxpbnQ+KGludCogICAgICAgdG8sIGNvbnN0IFBhY2tldDhpJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBfbW0yNTZfc3RvcmV1X3NpMjU2KHJlaW50ZXJwcmV0X2Nhc3Q8X19tMjU2aSo+KHRvKSwgZnJvbSk7IH0KKworLy8gTk9URTogbGV2ZXJhZ2UgX21tMjU2X2kzMmdhdGhlcl9wcyBhbmQgX21tMjU2X2kzMmdhdGhlcl9wZCBpZiBBVlgyIGluc3RydWN0aW9ucyBhcmUgYXZhaWxhYmxlCisvLyBOT1RFOiBmb3IgdGhlIHJlY29yZCB0aGUgZm9sbG93aW5nIHNlZW1zIHRvIGJlIHNsb3dlcjogcmV0dXJuIF9tbTI1Nl9pMzJnYXRoZXJfcHMoZnJvbSwgX21tMjU2X3NldDFfZXBpMzIoc3RyaWRlKSwgNCk7Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQ4ZiBwZ2F0aGVyPGZsb2F0LCBQYWNrZXQ4Zj4oY29uc3QgZmxvYXQqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfcHMoZnJvbVs3KnN0cmlkZV0sIGZyb21bNipzdHJpZGVdLCBmcm9tWzUqc3RyaWRlXSwgZnJvbVs0KnN0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgIGZyb21bMypzdHJpZGVdLCBmcm9tWzIqc3RyaWRlXSwgZnJvbVsxKnN0cmlkZV0sIGZyb21bMCpzdHJpZGVdKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDRkIHBnYXRoZXI8ZG91YmxlLCBQYWNrZXQ0ZD4oY29uc3QgZG91YmxlKiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X3BkKGZyb21bMypzdHJpZGVdLCBmcm9tWzIqc3RyaWRlXSwgZnJvbVsxKnN0cmlkZV0sIGZyb21bMCpzdHJpZGVdKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBwc2NhdHRlcjxmbG9hdCwgUGFja2V0OGY+KGZsb2F0KiB0bywgY29uc3QgUGFja2V0OGYmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgX19tMTI4IGxvdyA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhmcm9tLCAwKTsKKyAgdG9bc3RyaWRlKjBdID0gX21tX2N2dHNzX2YzMihsb3cpOworICB0b1tzdHJpZGUqMV0gPSBfbW1fY3Z0c3NfZjMyKF9tbV9zaHVmZmxlX3BzKGxvdywgbG93LCAxKSk7CisgIHRvW3N0cmlkZSoyXSA9IF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMobG93LCBsb3csIDIpKTsKKyAgdG9bc3RyaWRlKjNdID0gX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhsb3csIGxvdywgMykpOworCisgIF9fbTEyOCBoaWdoID0gX21tMjU2X2V4dHJhY3RmMTI4X3BzKGZyb20sIDEpOworICB0b1tzdHJpZGUqNF0gPSBfbW1fY3Z0c3NfZjMyKGhpZ2gpOworICB0b1tzdHJpZGUqNV0gPSBfbW1fY3Z0c3NfZjMyKF9tbV9zaHVmZmxlX3BzKGhpZ2gsIGhpZ2gsIDEpKTsKKyAgdG9bc3RyaWRlKjZdID0gX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhoaWdoLCBoaWdoLCAyKSk7CisgIHRvW3N0cmlkZSo3XSA9IF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMoaGlnaCwgaGlnaCwgMykpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBwc2NhdHRlcjxkb3VibGUsIFBhY2tldDRkPihkb3VibGUqIHRvLCBjb25zdCBQYWNrZXQ0ZCYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBfX20xMjhkIGxvdyA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChmcm9tLCAwKTsKKyAgdG9bc3RyaWRlKjBdID0gX21tX2N2dHNkX2Y2NChsb3cpOworICB0b1tzdHJpZGUqMV0gPSBfbW1fY3Z0c2RfZjY0KF9tbV9zaHVmZmxlX3BkKGxvdywgbG93LCAxKSk7CisgIF9fbTEyOGQgaGlnaCA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChmcm9tLCAxKTsKKyAgdG9bc3RyaWRlKjJdID0gX21tX2N2dHNkX2Y2NChoaWdoKTsKKyAgdG9bc3RyaWRlKjNdID0gX21tX2N2dHNkX2Y2NChfbW1fc2h1ZmZsZV9wZChoaWdoLCBoaWdoLCAxKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0OGY+KGZsb2F0KiB0bywgY29uc3QgZmxvYXQmIGEpCit7CisgIFBhY2tldDhmIHBhID0gcHNldDE8UGFja2V0OGY+KGEpOworICBwc3RvcmUodG8sIHBhKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0NGQ+KGRvdWJsZSogdG8sIGNvbnN0IGRvdWJsZSYgYSkKK3sKKyAgUGFja2V0NGQgcGEgPSBwc2V0MTxQYWNrZXQ0ZD4oYSk7CisgIHBzdG9yZSh0bywgcGEpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlMTxQYWNrZXQ4aT4oaW50KiB0bywgY29uc3QgaW50JiBhKQoreworICBQYWNrZXQ4aSBwYSA9IHBzZXQxPFBhY2tldDhpPihhKTsKKyAgcHN0b3JlKHRvLCBwYSk7Cit9CisKKyNpZm5kZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8ZmxvYXQ+KGNvbnN0IGZsb2F0KiAgIGFkZHIpIHsgX21tX3ByZWZldGNoKChjb25zdCBjaGFyKikoYWRkciksIF9NTV9ISU5UX1QwKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8ZG91YmxlPihjb25zdCBkb3VibGUqIGFkZHIpIHsgX21tX3ByZWZldGNoKChjb25zdCBjaGFyKikoYWRkciksIF9NTV9ISU5UX1QwKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8aW50Pihjb25zdCBpbnQqICAgICAgIGFkZHIpIHsgX21tX3ByZWZldGNoKChjb25zdCBjaGFyKikoYWRkciksIF9NTV9ISU5UX1QwKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSkgeworICByZXR1cm4gX21tX2N2dHNzX2YzMihfbW0yNTZfY2FzdHBzMjU2X3BzMTI4KGEpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcGZpcnN0PFBhY2tldDRkPihjb25zdCBQYWNrZXQ0ZCYgYSkgeworICByZXR1cm4gX21tX2N2dHNkX2Y2NChfbW0yNTZfY2FzdHBkMjU2X3BkMTI4KGEpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgICAgcGZpcnN0PFBhY2tldDhpPihjb25zdCBQYWNrZXQ4aSYgYSkgeworICByZXR1cm4gX21tX2N2dHNpMTI4X3NpMzIoX21tMjU2X2Nhc3RzaTI1Nl9zaTEyOChhKSk7Cit9CisKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHByZXZlcnNlKGNvbnN0IFBhY2tldDhmJiBhKQoreworICBfX20yNTYgdG1wID0gX21tMjU2X3NodWZmbGVfcHMoYSxhLDB4MWIpOworICByZXR1cm4gX21tMjU2X3Blcm11dGUyZjEyOF9wcyh0bXAsIHRtcCwgMSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcHJldmVyc2UoY29uc3QgUGFja2V0NGQmIGEpCit7CisgICBfX20yNTZkIHRtcCA9IF9tbTI1Nl9zaHVmZmxlX3BkKGEsYSw1KTsKKyAgcmV0dXJuIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodG1wLCB0bXAsIDEpOworCisgIF9fbTI1NmQgc3dhcF9oYWx2ZXMgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKGEsYSwxKTsKKyAgICByZXR1cm4gX21tMjU2X3Blcm11dGVfcGQoc3dhcF9oYWx2ZXMsNSk7Cit9CisKKy8vIHBhYnMgc2hvdWxkIGJlIG9rCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcGFicyhjb25zdCBQYWNrZXQ4ZiYgYSkKK3sKKyAgY29uc3QgUGFja2V0OGYgbWFzayA9IF9tbTI1Nl9jYXN0c2kyNTZfcHMoX21tMjU2X3NldHJfZXBpMzIoMHg3RkZGRkZGRiwweDdGRkZGRkZGLDB4N0ZGRkZGRkYsMHg3RkZGRkZGRiwweDdGRkZGRkZGLDB4N0ZGRkZGRkYsMHg3RkZGRkZGRiwweDdGRkZGRkZGKSk7CisgIHJldHVybiBfbW0yNTZfYW5kX3BzKGEsbWFzayk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcGFicyhjb25zdCBQYWNrZXQ0ZCYgYSkKK3sKKyAgY29uc3QgUGFja2V0NGQgbWFzayA9IF9tbTI1Nl9jYXN0c2kyNTZfcGQoX21tMjU2X3NldHJfZXBpMzIoMHhGRkZGRkZGRiwweDdGRkZGRkZGLDB4RkZGRkZGRkYsMHg3RkZGRkZGRiwweEZGRkZGRkZGLDB4N0ZGRkZGRkYsMHhGRkZGRkZGRiwweDdGRkZGRkZGKSk7CisgIHJldHVybiBfbW0yNTZfYW5kX3BkKGEsbWFzayk7Cit9CisKKy8vIHByZWR1eHAgc2hvdWxkIGJlIG9rCisvLyBGSVhNRTogd2h5IGlzIHRoaXMgb2s/IHdoeSBpc24ndCB0aGUgc2ltcGx5IGltcGxlbWVudGF0aW9uIHdvcmtpbmcgYXMgZXhwZWN0ZWQ/Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcHJlZHV4cDxQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGYqIHZlY3MpCit7CisgICAgX19tMjU2IGhzdW0xID0gX21tMjU2X2hhZGRfcHModmVjc1swXSwgdmVjc1sxXSk7CisgICAgX19tMjU2IGhzdW0yID0gX21tMjU2X2hhZGRfcHModmVjc1syXSwgdmVjc1szXSk7CisgICAgX19tMjU2IGhzdW0zID0gX21tMjU2X2hhZGRfcHModmVjc1s0XSwgdmVjc1s1XSk7CisgICAgX19tMjU2IGhzdW00ID0gX21tMjU2X2hhZGRfcHModmVjc1s2XSwgdmVjc1s3XSk7CisKKyAgICBfX20yNTYgaHN1bTUgPSBfbW0yNTZfaGFkZF9wcyhoc3VtMSwgaHN1bTEpOworICAgIF9fbTI1NiBoc3VtNiA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0yLCBoc3VtMik7CisgICAgX19tMjU2IGhzdW03ID0gX21tMjU2X2hhZGRfcHMoaHN1bTMsIGhzdW0zKTsKKyAgICBfX20yNTYgaHN1bTggPSBfbW0yNTZfaGFkZF9wcyhoc3VtNCwgaHN1bTQpOworCisgICAgX19tMjU2IHBlcm0xID0gIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTUsIGhzdW01LCAweDIzKTsKKyAgICBfX20yNTYgcGVybTIgPSAgX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtNiwgaHN1bTYsIDB4MjMpOworICAgIF9fbTI1NiBwZXJtMyA9ICBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW03LCBoc3VtNywgMHgyMyk7CisgICAgX19tMjU2IHBlcm00ID0gIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTgsIGhzdW04LCAweDIzKTsKKworICAgIF9fbTI1NiBzdW0xID0gX21tMjU2X2FkZF9wcyhwZXJtMSwgaHN1bTUpOworICAgIF9fbTI1NiBzdW0yID0gX21tMjU2X2FkZF9wcyhwZXJtMiwgaHN1bTYpOworICAgIF9fbTI1NiBzdW0zID0gX21tMjU2X2FkZF9wcyhwZXJtMywgaHN1bTcpOworICAgIF9fbTI1NiBzdW00ID0gX21tMjU2X2FkZF9wcyhwZXJtNCwgaHN1bTgpOworCisgICAgX19tMjU2IGJsZW5kMSA9IF9tbTI1Nl9ibGVuZF9wcyhzdW0xLCBzdW0yLCAweGNjKTsKKyAgICBfX20yNTYgYmxlbmQyID0gX21tMjU2X2JsZW5kX3BzKHN1bTMsIHN1bTQsIDB4Y2MpOworCisgICAgX19tMjU2IGZpbmFsID0gX21tMjU2X2JsZW5kX3BzKGJsZW5kMSwgYmxlbmQyLCAweGYwKTsKKyAgICByZXR1cm4gZmluYWw7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGQgcHJlZHV4cDxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQqIHZlY3MpCit7CisgUGFja2V0NGQgdG1wMCwgdG1wMTsKKworICB0bXAwID0gX21tMjU2X2hhZGRfcGQodmVjc1swXSwgdmVjc1sxXSk7CisgIHRtcDAgPSBfbW0yNTZfYWRkX3BkKHRtcDAsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodG1wMCwgdG1wMCwgMSkpOworCisgIHRtcDEgPSBfbW0yNTZfaGFkZF9wZCh2ZWNzWzJdLCB2ZWNzWzNdKTsKKyAgdG1wMSA9IF9tbTI1Nl9hZGRfcGQodG1wMSwgX21tMjU2X3Blcm11dGUyZjEyOF9wZCh0bXAxLCB0bXAxLCAxKSk7CisKKyAgcmV0dXJuIF9tbTI1Nl9ibGVuZF9wZCh0bXAwLCB0bXAxLCAweEMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4PFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSkKK3sKKyAgcmV0dXJuIHByZWR1eChQYWNrZXQ0ZihfbW1fYWRkX3BzKF9tbTI1Nl9jYXN0cHMyNTZfcHMxMjgoYSksX21tMjU2X2V4dHJhY3RmMTI4X3BzKGEsMSkpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eDxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEpCit7CisgIHJldHVybiBwcmVkdXgoUGFja2V0MmQoX21tX2FkZF9wZChfbW0yNTZfY2FzdHBkMjU2X3BkMTI4KGEpLF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChhLDEpKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJlZHV4X2Rvd250bzQ8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhKQoreworICByZXR1cm4gX21tX2FkZF9wcyhfbW0yNTZfY2FzdHBzMjU2X3BzMTI4KGEpLF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhhLDEpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tdWw8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhKQoreworICBQYWNrZXQ4ZiB0bXA7CisgIHRtcCA9IF9tbTI1Nl9tdWxfcHMoYSwgX21tMjU2X3Blcm11dGUyZjEyOF9wcyhhLGEsMSkpOworICB0bXAgPSBfbW0yNTZfbXVsX3BzKHRtcCwgX21tMjU2X3NodWZmbGVfcHModG1wLHRtcCxfTU1fU0hVRkZMRSgxLDAsMywyKSkpOworICByZXR1cm4gcGZpcnN0KF9tbTI1Nl9tdWxfcHModG1wLCBfbW0yNTZfc2h1ZmZsZV9wcyh0bXAsdG1wLDEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tdWw8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhKQoreworICBQYWNrZXQ0ZCB0bXA7CisgIHRtcCA9IF9tbTI1Nl9tdWxfcGQoYSwgX21tMjU2X3Blcm11dGUyZjEyOF9wZChhLGEsMSkpOworICByZXR1cm4gcGZpcnN0KF9tbTI1Nl9tdWxfcGQodG1wLCBfbW0yNTZfc2h1ZmZsZV9wZCh0bXAsdG1wLDEpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbWluPFBhY2tldDhmPihjb25zdCBQYWNrZXQ4ZiYgYSkKK3sKKyAgUGFja2V0OGYgdG1wID0gX21tMjU2X21pbl9wcyhhLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGEsYSwxKSk7CisgIHRtcCA9IF9tbTI1Nl9taW5fcHModG1wLCBfbW0yNTZfc2h1ZmZsZV9wcyh0bXAsdG1wLF9NTV9TSFVGRkxFKDEsMCwzLDIpKSk7CisgIHJldHVybiBwZmlyc3QoX21tMjU2X21pbl9wcyh0bXAsIF9tbTI1Nl9zaHVmZmxlX3BzKHRtcCx0bXAsMSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X21pbjxQYWNrZXQ0ZD4oY29uc3QgUGFja2V0NGQmIGEpCit7CisgIFBhY2tldDRkIHRtcCA9IF9tbTI1Nl9taW5fcGQoYSwgX21tMjU2X3Blcm11dGUyZjEyOF9wZChhLGEsMSkpOworICByZXR1cm4gcGZpcnN0KF9tbTI1Nl9taW5fcGQodG1wLCBfbW0yNTZfc2h1ZmZsZV9wZCh0bXAsIHRtcCwgMSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tYXg8UGFja2V0OGY+KGNvbnN0IFBhY2tldDhmJiBhKQoreworICBQYWNrZXQ4ZiB0bXAgPSBfbW0yNTZfbWF4X3BzKGEsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoYSxhLDEpKTsKKyAgdG1wID0gX21tMjU2X21heF9wcyh0bXAsIF9tbTI1Nl9zaHVmZmxlX3BzKHRtcCx0bXAsX01NX1NIVUZGTEUoMSwwLDMsMikpKTsKKyAgcmV0dXJuIHBmaXJzdChfbW0yNTZfbWF4X3BzKHRtcCwgX21tMjU2X3NodWZmbGVfcHModG1wLHRtcCwxKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tYXg8UGFja2V0NGQ+KGNvbnN0IFBhY2tldDRkJiBhKQoreworICBQYWNrZXQ0ZCB0bXAgPSBfbW0yNTZfbWF4X3BkKGEsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoYSxhLDEpKTsKKyAgcmV0dXJuIHBmaXJzdChfbW0yNTZfbWF4X3BkKHRtcCwgX21tMjU2X3NodWZmbGVfcGQodG1wLCB0bXAsIDEpKSk7Cit9CisKKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0OGY+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDhmJiBmaXJzdCwgY29uc3QgUGFja2V0OGYmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQ9PTEpCisgICAgeworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcHMoZmlyc3QsIHNlY29uZCwgMSk7CisgICAgICBQYWNrZXQ4ZiB0bXAxID0gX21tMjU2X3Blcm11dGVfcHMgKGZpcnN0LCBfTU1fU0hVRkZMRSgwLDMsMiwxKSk7CisgICAgICBQYWNrZXQ4ZiB0bXAyID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyAodG1wMSwgdG1wMSwgMSk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9ibGVuZF9wcyh0bXAxLCB0bXAyLCAweDg4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoT2Zmc2V0PT0yKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BzKGZpcnN0LCBzZWNvbmQsIDMpOworICAgICAgUGFja2V0OGYgdG1wMSA9IF9tbTI1Nl9wZXJtdXRlX3BzIChmaXJzdCwgX01NX1NIVUZGTEUoMSwwLDMsMikpOworICAgICAgUGFja2V0OGYgdG1wMiA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMgKHRtcDEsIHRtcDEsIDEpOworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcHModG1wMSwgdG1wMiwgMHhjYyk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MykKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9ibGVuZF9wcyhmaXJzdCwgc2Vjb25kLCA3KTsKKyAgICAgIFBhY2tldDhmIHRtcDEgPSBfbW0yNTZfcGVybXV0ZV9wcyAoZmlyc3QsIF9NTV9TSFVGRkxFKDIsMSwwLDMpKTsKKyAgICAgIFBhY2tldDhmIHRtcDIgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzICh0bXAxLCB0bXAxLCAxKTsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BzKHRtcDEsIHRtcDIsIDB4ZWUpOworICAgIH0KKyAgICBlbHNlIGlmIChPZmZzZXQ9PTQpCisgICAgeworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcHMoZmlyc3QsIHNlY29uZCwgMTUpOworICAgICAgUGFja2V0OGYgdG1wMSA9IF9tbTI1Nl9wZXJtdXRlX3BzIChmaXJzdCwgX01NX1NIVUZGTEUoMywyLDEsMCkpOworICAgICAgUGFja2V0OGYgdG1wMiA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMgKHRtcDEsIHRtcDEsIDEpOworICAgICAgZmlyc3QgPSBfbW0yNTZfcGVybXV0ZV9wcyh0bXAyLCBfTU1fU0hVRkZMRSgzLDIsMSwwKSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09NSkKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9ibGVuZF9wcyhmaXJzdCwgc2Vjb25kLCAzMSk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoZmlyc3QsIGZpcnN0LCAxKTsKKyAgICAgIFBhY2tldDhmIHRtcCA9IF9tbTI1Nl9wZXJtdXRlX3BzIChmaXJzdCwgX01NX1NIVUZGTEUoMCwzLDIsMSkpOworICAgICAgZmlyc3QgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKHRtcCwgdG1wLCAxKTsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BzKHRtcCwgZmlyc3QsIDB4ODgpOworICAgIH0KKyAgICBlbHNlIGlmIChPZmZzZXQ9PTYpCisgICAgeworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcHMoZmlyc3QsIHNlY29uZCwgNjMpOworICAgICAgZmlyc3QgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGZpcnN0LCBmaXJzdCwgMSk7CisgICAgICBQYWNrZXQ4ZiB0bXAgPSBfbW0yNTZfcGVybXV0ZV9wcyAoZmlyc3QsIF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsKKyAgICAgIGZpcnN0ID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyh0bXAsIHRtcCwgMSk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9ibGVuZF9wcyh0bXAsIGZpcnN0LCAweGNjKTsKKyAgICB9CisgICAgZWxzZSBpZiAoT2Zmc2V0PT03KQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BzKGZpcnN0LCBzZWNvbmQsIDEyNyk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoZmlyc3QsIGZpcnN0LCAxKTsKKyAgICAgIFBhY2tldDhmIHRtcCA9IF9tbTI1Nl9wZXJtdXRlX3BzIChmaXJzdCwgX01NX1NIVUZGTEUoMiwxLDAsMykpOworICAgICAgZmlyc3QgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKHRtcCwgdG1wLCAxKTsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BzKHRtcCwgZmlyc3QsIDB4ZWUpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0NGQ+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDRkJiBmaXJzdCwgY29uc3QgUGFja2V0NGQmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQ9PTEpCisgICAgeworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcGQoZmlyc3QsIHNlY29uZCwgMSk7CisgICAgICBfX20yNTZkIHRtcCA9IF9tbTI1Nl9wZXJtdXRlX3BkKGZpcnN0LCA1KTsKKyAgICAgIGZpcnN0ID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZCh0bXAsIHRtcCwgMSk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9ibGVuZF9wZCh0bXAsIGZpcnN0LCAweEEpOworICAgIH0KKyAgICBlbHNlIGlmIChPZmZzZXQ9PTIpCisgICAgeworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcGQoZmlyc3QsIHNlY29uZCwgMyk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoZmlyc3QsIGZpcnN0LCAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoT2Zmc2V0PT0zKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tMjU2X2JsZW5kX3BkKGZpcnN0LCBzZWNvbmQsIDcpOworICAgICAgX19tMjU2ZCB0bXAgPSBfbW0yNTZfcGVybXV0ZV9wZChmaXJzdCwgNSk7CisgICAgICBmaXJzdCA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodG1wLCB0bXAsIDEpOworICAgICAgZmlyc3QgPSBfbW0yNTZfYmxlbmRfcGQodG1wLCBmaXJzdCwgNSk7CisgICAgfQorICB9Cit9OworCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ4Ziw4PiYga2VybmVsKSB7CisgIF9fbTI1NiBUMCA9IF9tbTI1Nl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgX19tMjU2IFQxID0gX21tMjU2X3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX20yNTYgVDIgPSBfbW0yNTZfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSk7CisgIF9fbTI1NiBUMyA9IF9tbTI1Nl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzJdLCBrZXJuZWwucGFja2V0WzNdKTsKKyAgX19tMjU2IFQ0ID0gX21tMjU2X3VucGFja2xvX3BzKGtlcm5lbC5wYWNrZXRbNF0sIGtlcm5lbC5wYWNrZXRbNV0pOworICBfX20yNTYgVDUgPSBfbW0yNTZfdW5wYWNraGlfcHMoa2VybmVsLnBhY2tldFs0XSwga2VybmVsLnBhY2tldFs1XSk7CisgIF9fbTI1NiBUNiA9IF9tbTI1Nl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzZdLCBrZXJuZWwucGFja2V0WzddKTsKKyAgX19tMjU2IFQ3ID0gX21tMjU2X3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbNl0sIGtlcm5lbC5wYWNrZXRbN10pOworICBfX20yNTYgUzAgPSBfbW0yNTZfc2h1ZmZsZV9wcyhUMCxUMixfTU1fU0hVRkZMRSgxLDAsMSwwKSk7CisgIF9fbTI1NiBTMSA9IF9tbTI1Nl9zaHVmZmxlX3BzKFQwLFQyLF9NTV9TSFVGRkxFKDMsMiwzLDIpKTsKKyAgX19tMjU2IFMyID0gX21tMjU2X3NodWZmbGVfcHMoVDEsVDMsX01NX1NIVUZGTEUoMSwwLDEsMCkpOworICBfX20yNTYgUzMgPSBfbW0yNTZfc2h1ZmZsZV9wcyhUMSxUMyxfTU1fU0hVRkZMRSgzLDIsMywyKSk7CisgIF9fbTI1NiBTNCA9IF9tbTI1Nl9zaHVmZmxlX3BzKFQ0LFQ2LF9NTV9TSFVGRkxFKDEsMCwxLDApKTsKKyAgX19tMjU2IFM1ID0gX21tMjU2X3NodWZmbGVfcHMoVDQsVDYsX01NX1NIVUZGTEUoMywyLDMsMikpOworICBfX20yNTYgUzYgPSBfbW0yNTZfc2h1ZmZsZV9wcyhUNSxUNyxfTU1fU0hVRkZMRSgxLDAsMSwwKSk7CisgIF9fbTI1NiBTNyA9IF9tbTI1Nl9zaHVmZmxlX3BzKFQ1LFQ3LF9NTV9TSFVGRkxFKDMsMiwzLDIpKTsKKyAga2VybmVsLnBhY2tldFswXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzAsIFM0LCAweDIwKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzEsIFM1LCAweDIwKTsKKyAga2VybmVsLnBhY2tldFsyXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzIsIFM2LCAweDIwKTsKKyAga2VybmVsLnBhY2tldFszXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzMsIFM3LCAweDIwKTsKKyAga2VybmVsLnBhY2tldFs0XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzAsIFM0LCAweDMxKTsKKyAga2VybmVsLnBhY2tldFs1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzEsIFM1LCAweDMxKTsKKyAga2VybmVsLnBhY2tldFs2XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzIsIFM2LCAweDMxKTsKKyAga2VybmVsLnBhY2tldFs3XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzMsIFM3LCAweDMxKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0OGYsND4mIGtlcm5lbCkgeworICBfX20yNTYgVDAgPSBfbW0yNTZfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsxXSk7CisgIF9fbTI1NiBUMSA9IF9tbTI1Nl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgX19tMjU2IFQyID0gX21tMjU2X3VucGFja2xvX3BzKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10pOworICBfX20yNTYgVDMgPSBfbW0yNTZfdW5wYWNraGlfcHMoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSk7CisKKyAgX19tMjU2IFMwID0gX21tMjU2X3NodWZmbGVfcHMoVDAsVDIsX01NX1NIVUZGTEUoMSwwLDEsMCkpOworICBfX20yNTYgUzEgPSBfbW0yNTZfc2h1ZmZsZV9wcyhUMCxUMixfTU1fU0hVRkZMRSgzLDIsMywyKSk7CisgIF9fbTI1NiBTMiA9IF9tbTI1Nl9zaHVmZmxlX3BzKFQxLFQzLF9NTV9TSFVGRkxFKDEsMCwxLDApKTsKKyAgX19tMjU2IFMzID0gX21tMjU2X3NodWZmbGVfcHMoVDEsVDMsX01NX1NIVUZGTEUoMywyLDMsMikpOworCisgIGtlcm5lbC5wYWNrZXRbMF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMwLCBTMSwgMHgyMCk7CisgIGtlcm5lbC5wYWNrZXRbMV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMyLCBTMywgMHgyMCk7CisgIGtlcm5lbC5wYWNrZXRbMl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMwLCBTMSwgMHgzMSk7CisgIGtlcm5lbC5wYWNrZXRbM10gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMyLCBTMywgMHgzMSk7Cit9CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDRkLDQ+JiBrZXJuZWwpIHsKKyAgX19tMjU2ZCBUMCA9IF9tbTI1Nl9zaHVmZmxlX3BkKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0sIDE1KTsKKyAgX19tMjU2ZCBUMSA9IF9tbTI1Nl9zaHVmZmxlX3BkKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0sIDApOworICBfX20yNTZkIFQyID0gX21tMjU2X3NodWZmbGVfcGQoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSwgMTUpOworICBfX20yNTZkIFQzID0gX21tMjU2X3NodWZmbGVfcGQoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSwgMCk7CisKKyAga2VybmVsLnBhY2tldFsxXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoVDAsIFQyLCAzMik7CisgIGtlcm5lbC5wYWNrZXRbM10gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKFQwLCBUMiwgNDkpOworICBrZXJuZWwucGFja2V0WzBdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChUMSwgVDMsIDMyKTsKKyAga2VybmVsLnBhY2tldFsyXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoVDEsIFQzLCA0OSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwYmxlbmQoY29uc3QgU2VsZWN0b3I8OD4mIGlmUGFja2V0LCBjb25zdCBQYWNrZXQ4ZiYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0OGYmIGVsc2VQYWNrZXQpIHsKKyAgY29uc3QgX19tMjU2IHplcm8gPSBfbW0yNTZfc2V0emVyb19wcygpOworICBjb25zdCBfX20yNTYgc2VsZWN0ID0gX21tMjU2X3NldF9wcyhpZlBhY2tldC5zZWxlY3RbN10sIGlmUGFja2V0LnNlbGVjdFs2XSwgaWZQYWNrZXQuc2VsZWN0WzVdLCBpZlBhY2tldC5zZWxlY3RbNF0sIGlmUGFja2V0LnNlbGVjdFszXSwgaWZQYWNrZXQuc2VsZWN0WzJdLCBpZlBhY2tldC5zZWxlY3RbMV0sIGlmUGFja2V0LnNlbGVjdFswXSk7CisgIF9fbTI1NiBmYWxzZV9tYXNrID0gX21tMjU2X2NtcF9wcyhzZWxlY3QsIHplcm8sIF9DTVBfRVFfVVEpOworICByZXR1cm4gX21tMjU2X2JsZW5kdl9wcyh0aGVuUGFja2V0LCBlbHNlUGFja2V0LCBmYWxzZV9tYXNrKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwYmxlbmQoY29uc3QgU2VsZWN0b3I8ND4mIGlmUGFja2V0LCBjb25zdCBQYWNrZXQ0ZCYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0NGQmIGVsc2VQYWNrZXQpIHsKKyAgY29uc3QgX19tMjU2ZCB6ZXJvID0gX21tMjU2X3NldHplcm9fcGQoKTsKKyAgY29uc3QgX19tMjU2ZCBzZWxlY3QgPSBfbW0yNTZfc2V0X3BkKGlmUGFja2V0LnNlbGVjdFszXSwgaWZQYWNrZXQuc2VsZWN0WzJdLCBpZlBhY2tldC5zZWxlY3RbMV0sIGlmUGFja2V0LnNlbGVjdFswXSk7CisgIF9fbTI1NmQgZmFsc2VfbWFzayA9IF9tbTI1Nl9jbXBfcGQoc2VsZWN0LCB6ZXJvLCBfQ01QX0VRX1VRKTsKKyAgcmV0dXJuIF9tbTI1Nl9ibGVuZHZfcGQodGhlblBhY2tldCwgZWxzZVBhY2tldCwgZmFsc2VfbWFzayk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwaW5zZXJ0Zmlyc3QoY29uc3QgUGFja2V0OGYmIGEsIGZsb2F0IGIpCit7CisgIHJldHVybiBfbW0yNTZfYmxlbmRfcHMoYSxwc2V0MTxQYWNrZXQ4Zj4oYiksMSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZCBwaW5zZXJ0Zmlyc3QoY29uc3QgUGFja2V0NGQmIGEsIGRvdWJsZSBiKQoreworICByZXR1cm4gX21tMjU2X2JsZW5kX3BkKGEscHNldDE8UGFja2V0NGQ+KGIpLDEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgcGluc2VydGxhc3QoY29uc3QgUGFja2V0OGYmIGEsIGZsb2F0IGIpCit7CisgIHJldHVybiBfbW0yNTZfYmxlbmRfcHMoYSxwc2V0MTxQYWNrZXQ4Zj4oYiksKDE8PDcpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHBpbnNlcnRsYXN0KGNvbnN0IFBhY2tldDRkJiBhLCBkb3VibGUgYikKK3sKKyAgcmV0dXJuIF9tbTI1Nl9ibGVuZF9wZChhLHBzZXQxPFBhY2tldDRkPihiKSwoMTw8MykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRVRfTUFUSF9BVlhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlgvVHlwZUNhc3RpbmcuaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL1R5cGVDYXN0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiZmRjNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQVZYL1R5cGVDYXN0aW5nLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UWVBFX0NBU1RJTkdfQVZYX0gKKyNkZWZpbmUgRUlHRU5fVFlQRV9DQVNUSU5HX0FWWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZvciBub3cgd2UgdXNlIFNTRSB0byBoYW5kbGUgaW50ZWdlcnMsIHNvIHdlIGNhbid0IHVzZSBBVlggaW5zdHJ1Y3Rpb25zIHRvIGNhc3QKKy8vIGZyb20gaW50IHRvIGZsb2F0Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IHR5cGVfY2FzdGluZ190cmFpdHM8ZmxvYXQsIGludD4geworICBlbnVtIHsKKyAgICBWZWN0b3JpemVkQ2FzdCA9IDAsCisgICAgU3JjQ29lZmZSYXRpbyA9IDEsCisgICAgVGd0Q29lZmZSYXRpbyA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdHlwZV9jYXN0aW5nX3RyYWl0czxpbnQsIGZsb2F0PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMCwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKworCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aSBwY2FzdDxQYWNrZXQ4ZiwgUGFja2V0OGk+KGNvbnN0IFBhY2tldDhmJiBhKSB7CisgIHJldHVybiBfbW0yNTZfY3Z0cHNfZXBpMzIoYSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZiBwY2FzdDxQYWNrZXQ4aSwgUGFja2V0OGY+KGNvbnN0IFBhY2tldDhpJiBhKSB7CisgIHJldHVybiBfbW0yNTZfY3Z0ZXBpMzJfcHMoYSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1RZUEVfQ0FTVElOR19BVlhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlg1MTIvTWF0aEZ1bmN0aW9ucy5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlg1MTIvTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWDUxMi9NYXRoRnVuY3Rpb25zLmgKQEAgLTAsMCArMSwzOTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IFBlZHJvIEdvbm5ldCAocGVkcm8uZ29ubmV0QGdtYWlsLmNvbSkKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgVEhJUkRfUEFSVFlfRUlHRU4zX0VJR0VOX1NSQ19DT1JFX0FSQ0hfQVZYNTEyX01BVEhGVU5DVElPTlNfSF8KKyNkZWZpbmUgVEhJUkRfUEFSVFlfRUlHRU4zX0VJR0VOX1NSQ19DT1JFX0FSQ0hfQVZYNTEyX01BVEhGVU5DVElPTlNfSF8KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRGlzYWJsZSB0aGUgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtYW55IG9mIHRoZSByZXF1aXJlZCBhdng1MTIgaW5zdHJpbnNpY3MuCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg1LCAzKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihOQU1FLCBYKSBcCisgIGNvbnN0IFBhY2tldDE2ZiBwMTZmXyMjTkFNRSA9IHBzZXQxPFBhY2tldDE2Zj4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmZfRlJPTV9JTlQoTkFNRSwgWCkgXAorICBjb25zdCBQYWNrZXQxNmYgcDE2Zl8jI05BTUUgPSAoX19tNTEyKXBzZXQxPFBhY2tldDE2aT4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChOQU1FLCBYKSBcCisgIGNvbnN0IFBhY2tldDhkIHA4ZF8jI05BTUUgPSBwc2V0MTxQYWNrZXQ4ZD4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZF9GUk9NX0lOVDY0KE5BTUUsIFgpIFwKKyAgY29uc3QgUGFja2V0OGQgcDhkXyMjTkFNRSA9IF9tbTUxMl9jYXN0c2k1MTJfcGQoX21tNTEyX3NldDFfZXBpNjQoWCkpCisKKy8vIE5hdHVyYWwgbG9nYXJpdGhtCisvLyBDb21wdXRlcyBsb2coeCkgYXMgbG9nKDJeZSAqIG0pID0gQyplICsgbG9nKG0pLCB3aGVyZSB0aGUgY29uc3RhbnQgQyA9bG9nKDIpCisvLyBhbmQgbSBpcyBpbiB0aGUgcmFuZ2UgW3NxcnQoMS8yKSxzcXJ0KDIpKS4gSW4gdGhpcyByYW5nZSwgdGhlIGxvZ2FyaXRobSBjYW4KKy8vIGJlIGVhc2lseSBhcHByb3hpbWF0ZWQgYnkgYSBwb2x5bm9taWFsIGNlbnRlcmVkIG9uIG09MSBmb3Igc3RhYmlsaXR5LgorI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRKQordGVtcGxhdGUgPD4KK0VJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQgUGFja2V0MTZmCitwbG9nPFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBfeCkgeworICBQYWNrZXQxNmYgeCA9IF94OworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoMSwgMS4wZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihoYWxmLCAwLjVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKDEyNmYsIDEyNi4wZik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmX0ZST01fSU5UKGludl9tYW50X21hc2ssIH4weDdmODAwMDAwKTsKKworICAvLyBUaGUgc21hbGxlc3Qgbm9uIGRlbm9ybWFsaXplZCBmbG9hdCBudW1iZXIuCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2Zl9GUk9NX0lOVChtaW5fbm9ybV9wb3MsIDB4MDA4MDAwMDApOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmZfRlJPTV9JTlQobWludXNfaW5mLCAweGZmODAwMDAwKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmX0ZST01fSU5UKG5hbiwgMHg3ZmMwMDAwMCk7CisKKyAgLy8gUG9seW5vbWlhbCBjb2VmZmljaWVudHMuCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfU1FSVEhGLCAwLjcwNzEwNjc4MTE4NjU0NzUyNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoY2VwaGVzX2xvZ19wMCwgNy4wMzc2ODM2MjkyRS0yZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfbG9nX3AxLCAtMS4xNTE0NjEwMzEwRS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfbG9nX3AyLCAxLjE2NzY5OTg3NDBFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDMsIC0xLjI0MjAxNDA4NDZFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDQsICsxLjQyNDkzMjI3ODdFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDUsIC0xLjY2NjgwNTc2NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDYsICsyLjAwMDA3MTQ3NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDcsIC0yLjQ5OTk5OTM5OTNFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcDgsICszLjMzMzMzMzExNzRFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19sb2dfcTEsIC0yLjEyMTk0NDQwZS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfbG9nX3EyLCAwLjY5MzM1OTM3NWYpOworCisgIC8vIGludmFsaWRfbWFzayBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHggaXMgTmFOCisgIF9fbW1hc2sxNiBpbnZhbGlkX21hc2sgPQorICAgICAgX21tNTEyX2NtcF9wc19tYXNrKHgsIF9tbTUxMl9zZXR6ZXJvX3BzKCksIF9DTVBfTkdFX1VRKTsKKyAgX19tbWFzazE2IGlzemVyb19tYXNrID0KKyAgICAgIF9tbTUxMl9jbXBfcHNfbWFzayh4LCBfbW01MTJfc2V0emVyb19wcygpLCBfQ01QX0VRX1VRKTsKKworICAvLyBUcnVuY2F0ZSBpbnB1dCB2YWx1ZXMgdG8gdGhlIG1pbmltdW0gcG9zaXRpdmUgbm9ybWFsLgorICB4ID0gcG1heCh4LCBwMTZmX21pbl9ub3JtX3Bvcyk7CisKKyAgLy8gRXh0cmFjdCB0aGUgc2hpZnRlZCBleHBvbmVudHMuCisgIFBhY2tldDE2ZiBlbW0wID0gX21tNTEyX2N2dGVwaTMyX3BzKF9tbTUxMl9zcmxpX2VwaTMyKChfX201MTJpKXgsIDIzKSk7CisgIFBhY2tldDE2ZiBlID0gX21tNTEyX3N1Yl9wcyhlbW0wLCBwMTZmXzEyNmYpOworCisgIC8vIFNldCB0aGUgZXhwb25lbnRzIHRvIC0xLCBpLmUuIHggYXJlIGluIHRoZSByYW5nZSBbMC41LDEpLgorICB4ID0gX21tNTEyX2FuZF9wcyh4LCBwMTZmX2ludl9tYW50X21hc2spOworICB4ID0gX21tNTEyX29yX3BzKHgsIHAxNmZfaGFsZik7CisKKyAgLy8gcGFydDI6IFNoaWZ0IHRoZSBpbnB1dHMgZnJvbSB0aGUgcmFuZ2UgWzAuNSwxKSB0byBbc3FydCgxLzIpLHNxcnQoMikpCisgIC8vIGFuZCBzaGlmdCBieSAtMS4gVGhlIHZhbHVlcyBhcmUgdGhlbiBjZW50ZXJlZCBhcm91bmQgMCwgd2hpY2ggaW1wcm92ZXMKKyAgLy8gdGhlIHN0YWJpbGl0eSBvZiB0aGUgcG9seW5vbWlhbCBldmFsdWF0aW9uLgorICAvLyAgIGlmKCB4IDwgU1FSVEhGICkgeworICAvLyAgICAgZSAtPSAxOworICAvLyAgICAgeCA9IHggKyB4IC0gMS4wOworICAvLyAgIH0gZWxzZSB7IHggPSB4IC0gMS4wOyB9CisgIF9fbW1hc2sxNiBtYXNrID0gX21tNTEyX2NtcF9wc19tYXNrKHgsIHAxNmZfY2VwaGVzX1NRUlRIRiwgX0NNUF9MVF9PUSk7CisgIFBhY2tldDE2ZiB0bXAgPSBfbW01MTJfbWFza19ibGVuZF9wcyhtYXNrLCB4LCBfbW01MTJfc2V0emVyb19wcygpKTsKKyAgeCA9IHBzdWIoeCwgcDE2Zl8xKTsKKyAgZSA9IHBzdWIoZSwgX21tNTEyX21hc2tfYmxlbmRfcHMobWFzaywgcDE2Zl8xLCBfbW01MTJfc2V0emVyb19wcygpKSk7CisgIHggPSBwYWRkKHgsIHRtcCk7CisKKyAgUGFja2V0MTZmIHgyID0gcG11bCh4LCB4KTsKKyAgUGFja2V0MTZmIHgzID0gcG11bCh4MiwgeCk7CisKKyAgLy8gRXZhbHVhdGUgdGhlIHBvbHlub21pYWwgYXBwcm94aW1hbnQgb2YgZGVncmVlIDggaW4gdGhyZWUgcGFydHMsIHByb2JhYmx5CisgIC8vIHRvIGltcHJvdmUgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCisgIFBhY2tldDE2ZiB5LCB5MSwgeTI7CisgIHkgPSBwbWFkZChwMTZmX2NlcGhlc19sb2dfcDAsIHgsIHAxNmZfY2VwaGVzX2xvZ19wMSk7CisgIHkxID0gcG1hZGQocDE2Zl9jZXBoZXNfbG9nX3AzLCB4LCBwMTZmX2NlcGhlc19sb2dfcDQpOworICB5MiA9IHBtYWRkKHAxNmZfY2VwaGVzX2xvZ19wNiwgeCwgcDE2Zl9jZXBoZXNfbG9nX3A3KTsKKyAgeSA9IHBtYWRkKHksIHgsIHAxNmZfY2VwaGVzX2xvZ19wMik7CisgIHkxID0gcG1hZGQoeTEsIHgsIHAxNmZfY2VwaGVzX2xvZ19wNSk7CisgIHkyID0gcG1hZGQoeTIsIHgsIHAxNmZfY2VwaGVzX2xvZ19wOCk7CisgIHkgPSBwbWFkZCh5LCB4MywgeTEpOworICB5ID0gcG1hZGQoeSwgeDMsIHkyKTsKKyAgeSA9IHBtdWwoeSwgeDMpOworCisgIC8vIEFkZCB0aGUgbG9nYXJpdGhtIG9mIHRoZSBleHBvbmVudCBiYWNrIHRvIHRoZSByZXN1bHQgb2YgdGhlIGludGVycG9sYXRpb24uCisgIHkxID0gcG11bChlLCBwMTZmX2NlcGhlc19sb2dfcTEpOworICB0bXAgPSBwbXVsKHgyLCBwMTZmX2hhbGYpOworICB5ID0gcGFkZCh5LCB5MSk7CisgIHggPSBwc3ViKHgsIHRtcCk7CisgIHkyID0gcG11bChlLCBwMTZmX2NlcGhlc19sb2dfcTIpOworICB4ID0gcGFkZCh4LCB5KTsKKyAgeCA9IHBhZGQoeCwgeTIpOworCisgIC8vIEZpbHRlciBvdXQgaW52YWxpZCBpbnB1dHMsIGkuZS4gbmVnYXRpdmUgYXJnIHdpbGwgYmUgTkFOLCAwIHdpbGwgYmUgLUlORi4KKyAgcmV0dXJuIF9tbTUxMl9tYXNrX2JsZW5kX3BzKGlzemVyb19tYXNrLCBwMTZmX21pbnVzX2luZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9tYXNrX2JsZW5kX3BzKGludmFsaWRfbWFzaywgcDE2Zl9uYW4sIHgpKTsKK30KKyNlbmRpZgorCisvLyBFeHBvbmVudGlhbCBmdW5jdGlvbi4gV29ya3MgYnkgd3JpdGluZyAieCA9IG0qbG9nKDIpICsgciIgd2hlcmUKKy8vICJtID0gZmxvb3IoeC9sb2coMikrMS8yKSIgYW5kICJyIiBpcyB0aGUgcmVtYWluZGVyLiBUaGUgcmVzdWx0IGlzIHRoZW4KKy8vICJleHAoeCkgPSAyXm0qZXhwKHIpIiB3aGVyZSBleHAocikgaXMgaW4gdGhlIHJhbmdlIFstMSwxKS4KK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDE2ZgorcGV4cDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgX3gpIHsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKDEsIDEuMGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZigxMjcsIDEyNy4wZik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGV4cF9oaSwgODguMzc2MjYyNjY0Nzk1MGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoZXhwX2xvLCAtODguMzc2MjYyNjY0Nzk0OWYpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfTE9HMkVGLCAxLjQ0MjY5NTA0MDg4ODk2MzQxZik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19leHBfcDAsIDEuOTg3NTY5MTUwMEUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoY2VwaGVzX2V4cF9wMSwgMS4zOTgxOTk5NTA3RS0zZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfZXhwX3AyLCA4LjMzMzQ1MTkwNzNFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKGNlcGhlc19leHBfcDMsIDQuMTY2NTc5NTg5NEUtMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYoY2VwaGVzX2V4cF9wNCwgMS42NjY2NjY1NDU5RS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2ZihjZXBoZXNfZXhwX3A1LCA1LjAwMDAwMDEyMDFFLTFmKTsKKworICAvLyBDbGFtcCB4LgorICBQYWNrZXQxNmYgeCA9IHBtYXgocG1pbihfeCwgcDE2Zl9leHBfaGkpLCBwMTZmX2V4cF9sbyk7CisKKyAgLy8gRXhwcmVzcyBleHAoeCkgYXMgZXhwKG0qbG4oMikgKyByKSwgc3RhcnQgYnkgZXh0cmFjdGluZworICAvLyBtID0gZmxvb3IoeC9sbigyKSArIDAuNSkuCisgIFBhY2tldDE2ZiBtID0gX21tNTEyX2Zsb29yX3BzKHBtYWRkKHgsIHAxNmZfY2VwaGVzX0xPRzJFRiwgcDE2Zl9oYWxmKSk7CisKKyAgLy8gR2V0IHIgPSB4IC0gbSpsbigyKS4gTm90ZSB0aGF0IHdlIGNhbiBkbyB0aGlzIHdpdGhvdXQgbG9zaW5nIG1vcmUgdGhhbiBvbmUKKyAgLy8gdWxwIHByZWNpc2lvbiBkdWUgdG8gdGhlIEZNQSBpbnN0cnVjdGlvbi4KKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmKG5sbjIsIC0wLjY5MzE0NzE4MDU1OTk0NTNmKTsKKyAgUGFja2V0MTZmIHIgPSBfbW01MTJfZm1hZGRfcHMobSwgcDE2Zl9ubG4yLCB4KTsKKyAgUGFja2V0MTZmIHIyID0gcG11bChyLCByKTsKKworICAvLyBUT0RPKGdvbm5ldCk6IFNwbGl0IGludG8gb2RkL2V2ZW4gcG9seW5vbWlhbHMgYW5kIHRyeSB0byBleHBsb2l0CisgIC8vICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCisgIFBhY2tldDE2ZiB5ID0gcDE2Zl9jZXBoZXNfZXhwX3AwOworICB5ID0gcG1hZGQoeSwgciwgcDE2Zl9jZXBoZXNfZXhwX3AxKTsKKyAgeSA9IHBtYWRkKHksIHIsIHAxNmZfY2VwaGVzX2V4cF9wMik7CisgIHkgPSBwbWFkZCh5LCByLCBwMTZmX2NlcGhlc19leHBfcDMpOworICB5ID0gcG1hZGQoeSwgciwgcDE2Zl9jZXBoZXNfZXhwX3A0KTsKKyAgeSA9IHBtYWRkKHksIHIsIHAxNmZfY2VwaGVzX2V4cF9wNSk7CisgIHkgPSBwbWFkZCh5LCByMiwgcik7CisgIHkgPSBwYWRkKHksIHAxNmZfMSk7CisKKyAgLy8gQnVpbGQgZW1tMCA9IDJebS4KKyAgUGFja2V0MTZpIGVtbTAgPSBfbW01MTJfY3Z0dHBzX2VwaTMyKHBhZGQobSwgcDE2Zl8xMjcpKTsKKyAgZW1tMCA9IF9tbTUxMl9zbGxpX2VwaTMyKGVtbTAsIDIzKTsKKworICAvLyBSZXR1cm4gMl5tICogZXhwKHIpLgorICByZXR1cm4gcG1heChwbXVsKHksIF9tbTUxMl9jYXN0c2k1MTJfcHMoZW1tMCkpLCBfeCk7Cit9CisKKy8qdGVtcGxhdGUgPD4KK0VJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQgUGFja2V0OGQKK3BleHA8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBfeCkgeworICBQYWNrZXQ4ZCB4ID0gX3g7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQoMSwgMS4wKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQoMiwgMi4wKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChleHBfaGksIDcwOS40MzcpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChleHBfbG8sIC03MDkuNDM2MTM5MzAzKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChjZXBoZXNfTE9HMkVGLCAxLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhkKGNlcGhlc19leHBfcDAsIDEuMjYxNzcxOTMwNzQ4MTA1OTA4NzhlLTQpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChjZXBoZXNfZXhwX3AxLCAzLjAyOTk0NDA3NzA3NDQxOTYxMzAwZS0yKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQoY2VwaGVzX2V4cF9wMiwgOS45OTk5OTk5OTk5OTk5OTk5OTkxMGUtMSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQoY2VwaGVzX2V4cF9xMCwgMy4wMDE5ODUwNTEzODY2NDQ1NTA0MmUtNik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhkKGNlcGhlc19leHBfcTEsIDIuNTI0NDgzNDAzNDk2ODQxMDQxOTJlLTMpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChjZXBoZXNfZXhwX3EyLCAyLjI3MjY1NTQ4MjA4MTU1MDI4NzY2ZS0xKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQoY2VwaGVzX2V4cF9xMywgMi4wMDAwMDAwMDAwMDAwMDAwMDAwOWUwKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChjZXBoZXNfZXhwX0MxLCAwLjY5MzE0NTc1MTk1MzEyNSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhkKGNlcGhlc19leHBfQzIsIDEuNDI4NjA2ODIwMzA5NDE3MjMyMTJlLTYpOworCisgIC8vIGNsYW1wIHgKKyAgeCA9IHBtYXgocG1pbih4LCBwOGRfZXhwX2hpKSwgcDhkX2V4cF9sbyk7CisKKyAgLy8gRXhwcmVzcyBleHAoeCkgYXMgZXhwKGcgKyBuKmxvZygyKSkuCisgIGNvbnN0IFBhY2tldDhkIG4gPQorICAgICAgX21tNTEyX211bF9yb3VuZF9wZChwOGRfY2VwaGVzX0xPRzJFRiwgeCwgX01NX0ZST1VORF9UT19ORUFSRVNUX0lOVCk7CisKKyAgLy8gR2V0IHRoZSByZW1haW5kZXIgbW9kdWxvIGxvZygyKSwgaS5lLiB0aGUgImciIGRlc2NyaWJlZCBhYm92ZS4gU3VidHJhY3QKKyAgLy8gbipsb2coMikgb3V0IGluIHR3byBzdGVwcywgaS5lLiBuKkMxICsgbipDMiwgQzErQzI9bG9nMiB0byBnZXQgdGhlIGxhc3QKKyAgLy8gZGlnaXRzIHJpZ2h0LgorICBjb25zdCBQYWNrZXQ4ZCBuQzEgPSBwbXVsKG4sIHA4ZF9jZXBoZXNfZXhwX0MxKTsKKyAgY29uc3QgUGFja2V0OGQgbkMyID0gcG11bChuLCBwOGRfY2VwaGVzX2V4cF9DMik7CisgIHggPSBwc3ViKHgsIG5DMSk7CisgIHggPSBwc3ViKHgsIG5DMik7CisKKyAgY29uc3QgUGFja2V0OGQgeDIgPSBwbXVsKHgsIHgpOworCisgIC8vIEV2YWx1YXRlIHRoZSBudW1lcmF0b3IgcG9seW5vbWlhbCBvZiB0aGUgcmF0aW9uYWwgaW50ZXJwb2xhbnQuCisgIFBhY2tldDhkIHB4ID0gcDhkX2NlcGhlc19leHBfcDA7CisgIHB4ID0gcG1hZGQocHgsIHgyLCBwOGRfY2VwaGVzX2V4cF9wMSk7CisgIHB4ID0gcG1hZGQocHgsIHgyLCBwOGRfY2VwaGVzX2V4cF9wMik7CisgIHB4ID0gcG11bChweCwgeCk7CisKKyAgLy8gRXZhbHVhdGUgdGhlIGRlbm9taW5hdG9yIHBvbHlub21pYWwgb2YgdGhlIHJhdGlvbmFsIGludGVycG9sYW50LgorICBQYWNrZXQ4ZCBxeCA9IHA4ZF9jZXBoZXNfZXhwX3EwOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDhkX2NlcGhlc19leHBfcTEpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDhkX2NlcGhlc19leHBfcTIpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDhkX2NlcGhlc19leHBfcTMpOworCisgIC8vIEkgZG9uJ3QgcmVhbGx5IGdldCB0aGlzIGJpdCwgY29waWVkIGZyb20gdGhlIFNTRTIgcm91dGluZXMsIHNvLi4uCisgIC8vIFRPRE8oZ29ubmV0KTogRmlndXJlIG91dCB3aGF0IGlzIGdvaW5nIG9uIGhlcmUsIHBlcmhhcHMgZmluZCBhIGJldHRlcgorICAvLyByYXRpb25hbCBpbnRlcnBvbGFudD8KKyAgeCA9IF9tbTUxMl9kaXZfcGQocHgsIHBzdWIocXgsIHB4KSk7CisgIHggPSBwbWFkZChwOGRfMiwgeCwgcDhkXzEpOworCisgIC8vIEJ1aWxkIGU9Ml5uLgorICBjb25zdCBQYWNrZXQ4ZCBlID0gX21tNTEyX2Nhc3RzaTUxMl9wZChfbW01MTJfc2xsaV9lcGk2NCgKKyAgICAgIF9tbTUxMl9hZGRfZXBpNjQoX21tNTEyX2N2dHBkX2VwaTY0KG4pLCBfbW01MTJfc2V0MV9lcGk2NCgxMDIzKSksIDUyKSk7CisKKyAgLy8gQ29uc3RydWN0IHRoZSByZXN1bHQgMl5uICogZXhwKGcpID0gZSAqIHguIFRoZSBtYXggaXMgdXNlZCB0byBjYXRjaAorICAvLyBub24tZmluaXRlIHZhbHVlcyBpbiB0aGUgaW5wdXQuCisgIHJldHVybiBwbWF4KHBtdWwoeCwgZSksIF94KTsKKyAgfSovCisKKy8vIEZ1bmN0aW9ucyBmb3Igc3FydC4KKy8vIFRoZSBFSUdFTl9GQVNUX01BVEggdmVyc2lvbiB1c2VzIHRoZSBfbW1fcnNxcnRfcHMgYXBwcm94aW1hdGlvbiBhbmQgb25lIHN0ZXAKKy8vIG9mIE5ld3RvbidzIG1ldGhvZCwgYXQgYSBjb3N0IG9mIDEtMiBiaXRzIG9mIHByZWNpc2lvbiBhcyBvcHBvc2VkIHRvIHRoZQorLy8gZXhhY3Qgc29sdXRpb24uIFRoZSBtYWluIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIG5vdCBqdXN0IHNwZWVkLCBidXQKKy8vIGFsc28gdGhlIGZhY3QgdGhhdCBpdCBjYW4gYmUgaW5saW5lZCBhbmQgcGlwZWxpbmVkIHdpdGggb3RoZXIgY29tcHV0YXRpb25zLAorLy8gZnVydGhlciByZWR1Y2luZyBpdHMgZWZmZWN0aXZlIGxhdGVuY3kuCisjaWYgRUlHRU5fRkFTVF9NQVRICit0ZW1wbGF0ZSA8PgorRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRCBQYWNrZXQxNmYKK3BzcXJ0PFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBfeCkgeworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYob25lX3BvaW50X2ZpdmUsIDEuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYobWludXNfaGFsZiwgLTAuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmZfRlJPTV9JTlQoZmx0X21pbiwgMHgwMDgwMDAwMCk7CisKKyAgUGFja2V0MTZmIG5lZ19oYWxmID0gcG11bChfeCwgcDE2Zl9taW51c19oYWxmKTsKKworICAvLyBzZWxlY3Qgb25seSB0aGUgaW52ZXJzZSBzcXJ0IG9mIHBvc2l0aXZlIG5vcm1hbCBpbnB1dHMgKGRlbm9ybWFscyBhcmUKKyAgLy8gZmx1c2hlZCB0byB6ZXJvIGFuZCBjYXVzZSBpbmZzIGFzIHdlbGwpLgorICBfX21tYXNrMTYgbm9uX3plcm9fbWFzayA9IF9tbTUxMl9jbXBfcHNfbWFzayhfeCwgcDE2Zl9mbHRfbWluLCBfQ01QX0dFX09RKTsKKyAgUGFja2V0MTZmIHggPSBfbW01MTJfbWFza19ibGVuZF9wcyhub25femVyb19tYXNrLCBfbW01MTJfcnNxcnQxNF9wcyhfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldHplcm9fcHMoKSk7CisKKyAgLy8gRG8gYSBzaW5nbGUgc3RlcCBvZiBOZXd0b24ncyBpdGVyYXRpb24uCisgIHggPSBwbXVsKHgsIHBtYWRkKG5lZ19oYWxmLCBwbXVsKHgsIHgpLCBwMTZmX29uZV9wb2ludF9maXZlKSk7CisKKyAgLy8gTXVsdGlwbHkgdGhlIG9yaWdpbmFsIF94IGJ5IGl0J3MgcmVjaXByb2NhbCBzcXVhcmUgcm9vdCB0byBleHRyYWN0IHRoZQorICAvLyBzcXVhcmUgcm9vdC4KKyAgcmV0dXJuIHBtdWwoX3gsIHgpOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRCBQYWNrZXQ4ZAorcHNxcnQ8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBfeCkgeworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChvbmVfcG9pbnRfZml2ZSwgMS41KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQobWludXNfaGFsZiwgLTAuNSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhkX0ZST01fSU5UNjQoZGJsX21pbiwgMHgwMDEwMDAwMDAwMDAwMDAwTEwpOworCisgIFBhY2tldDhkIG5lZ19oYWxmID0gcG11bChfeCwgcDhkX21pbnVzX2hhbGYpOworCisgIC8vIHNlbGVjdCBvbmx5IHRoZSBpbnZlcnNlIHNxcnQgb2YgcG9zaXRpdmUgbm9ybWFsIGlucHV0cyAoZGVub3JtYWxzIGFyZQorICAvLyBmbHVzaGVkIHRvIHplcm8gYW5kIGNhdXNlIGluZnMgYXMgd2VsbCkuCisgIF9fbW1hc2s4IG5vbl96ZXJvX21hc2sgPSBfbW01MTJfY21wX3BkX21hc2soX3gsIHA4ZF9kYmxfbWluLCBfQ01QX0dFX09RKTsKKyAgUGFja2V0OGQgeCA9IF9tbTUxMl9tYXNrX2JsZW5kX3BkKG5vbl96ZXJvX21hc2ssIF9tbTUxMl9yc3FydDE0X3BkKF94KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9zZXR6ZXJvX3BkKCkpOworCisgIC8vIERvIGEgZmlyc3Qgc3RlcCBvZiBOZXd0b24ncyBpdGVyYXRpb24uCisgIHggPSBwbXVsKHgsIHBtYWRkKG5lZ19oYWxmLCBwbXVsKHgsIHgpLCBwOGRfb25lX3BvaW50X2ZpdmUpKTsKKworICAvLyBEbyBhIHNlY29uZCBzdGVwIG9mIE5ld3RvbidzIGl0ZXJhdGlvbi4KKyAgeCA9IHBtdWwoeCwgcG1hZGQobmVnX2hhbGYsIHBtdWwoeCwgeCksIHA4ZF9vbmVfcG9pbnRfZml2ZSkpOworCisgIC8vIE11bHRpcGx5IHRoZSBvcmlnaW5hbCBfeCBieSBpdCdzIHJlY2lwcm9jYWwgc3F1YXJlIHJvb3QgdG8gZXh0cmFjdCB0aGUKKyAgLy8gc3F1YXJlIHJvb3QuCisgIHJldHVybiBwbXVsKF94LCB4KTsKK30KKyNlbHNlCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcHNxcnQ8UGFja2V0MTZmPihjb25zdCBQYWNrZXQxNmYmIHgpIHsKKyAgcmV0dXJuIF9tbTUxMl9zcXJ0X3BzKHgpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcHNxcnQ8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiB4KSB7CisgIHJldHVybiBfbW01MTJfc3FydF9wZCh4KTsKK30KKyNlbmRpZgorCisvLyBGdW5jdGlvbnMgZm9yIHJzcXJ0LgorLy8gQWxtb3N0IGlkZW50aWNhbCB0byB0aGUgc3FydCByb3V0aW5lLCBqdXN0IGxlYXZlIG91dCB0aGUgbGFzdCBtdWx0aXBsaWNhdGlvbgorLy8gYW5kIGZpbGwgaW4gTmFOL0luZiB3aGVyZSBuZWVkZWQuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIGFzIGFuCisvLyBpdGVyYXRpdmUgdmVyc2lvbiBmb3IgZG91YmxlcyBzaW5jZSB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiBmb3IgZGlyZXRseQorLy8gY29tcHV0aW5nIHRoZSByZWNpcHJvY2FsIHNxdWFyZSByb290IGluIEFWWC01MTIuCisjaWZkZWYgRUlHRU5fRkFTVF9NQVRICit0ZW1wbGF0ZSA8PgorRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRCBQYWNrZXQxNmYKK3Byc3FydDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgX3gpIHsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MTZmX0ZST01fSU5UKGluZiwgMHg3ZjgwMDAwMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDE2Zl9GUk9NX0lOVChuYW4sIDB4N2ZjMDAwMDApOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYob25lX3BvaW50X2ZpdmUsIDEuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmYobWludXNfaGFsZiwgLTAuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQxNmZfRlJPTV9JTlQoZmx0X21pbiwgMHgwMDgwMDAwMCk7CisKKyAgUGFja2V0MTZmIG5lZ19oYWxmID0gcG11bChfeCwgcDE2Zl9taW51c19oYWxmKTsKKworICAvLyBzZWxlY3Qgb25seSB0aGUgaW52ZXJzZSBzcXJ0IG9mIHBvc2l0aXZlIG5vcm1hbCBpbnB1dHMgKGRlbm9ybWFscyBhcmUKKyAgLy8gZmx1c2hlZCB0byB6ZXJvIGFuZCBjYXVzZSBpbmZzIGFzIHdlbGwpLgorICBfX21tYXNrMTYgbGVfemVyb19tYXNrID0gX21tNTEyX2NtcF9wc19tYXNrKF94LCBwMTZmX2ZsdF9taW4sIF9DTVBfTFRfT1EpOworICBQYWNrZXQxNmYgeCA9IF9tbTUxMl9tYXNrX2JsZW5kX3BzKGxlX3plcm9fbWFzaywgX21tNTEyX3NldHplcm9fcHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfcnNxcnQxNF9wcyhfeCkpOworCisgIC8vIEZpbGwgaW4gTmFOcyBhbmQgSW5mcyBmb3IgdGhlIG5lZ2F0aXZlL3plcm8gZW50cmllcy4KKyAgX19tbWFzazE2IG5lZ19tYXNrID0gX21tNTEyX2NtcF9wc19tYXNrKF94LCBfbW01MTJfc2V0emVyb19wcygpLCBfQ01QX0xUX09RKTsKKyAgUGFja2V0MTZmIGluZnNfYW5kX25hbnMgPSBfbW01MTJfbWFza19ibGVuZF9wcygKKyAgICAgIG5lZ19tYXNrLCBwMTZmX25hbiwKKyAgICAgIF9tbTUxMl9tYXNrX2JsZW5kX3BzKGxlX3plcm9fbWFzaywgcDE2Zl9pbmYsIF9tbTUxMl9zZXR6ZXJvX3BzKCkpKTsKKworICAvLyBEbyBhIHNpbmdsZSBzdGVwIG9mIE5ld3RvbidzIGl0ZXJhdGlvbi4KKyAgeCA9IHBtdWwoeCwgcG1hZGQobmVnX2hhbGYsIHBtdWwoeCwgeCksIHAxNmZfb25lX3BvaW50X2ZpdmUpKTsKKworICAvLyBJbnNlcnQgTmFOcyBhbmQgSW5mcyBpbiBhbGwgdGhlIHJpZ2h0IHBsYWNlcy4KKyAgcmV0dXJuIF9tbTUxMl9tYXNrX2JsZW5kX3BzKGxlX3plcm9fbWFzaywgaW5mc19hbmRfbmFucywgeCk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VEIFBhY2tldDhkCitwcnNxcnQ8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBfeCkgeworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZF9GUk9NX0lOVDY0KGluZiwgMHg3ZmYwMDAwMDAwMDAwMDAwTEwpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZF9GUk9NX0lOVDY0KG5hbiwgMHg3ZmYxMDAwMDAwMDAwMDAwTEwpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ4ZChvbmVfcG9pbnRfZml2ZSwgMS41KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0OGQobWludXNfaGFsZiwgLTAuNSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDhkX0ZST01fSU5UNjQoZGJsX21pbiwgMHgwMDEwMDAwMDAwMDAwMDAwTEwpOworCisgIFBhY2tldDhkIG5lZ19oYWxmID0gcG11bChfeCwgcDhkX21pbnVzX2hhbGYpOworCisgIC8vIHNlbGVjdCBvbmx5IHRoZSBpbnZlcnNlIHNxcnQgb2YgcG9zaXRpdmUgbm9ybWFsIGlucHV0cyAoZGVub3JtYWxzIGFyZQorICAvLyBmbHVzaGVkIHRvIHplcm8gYW5kIGNhdXNlIGluZnMgYXMgd2VsbCkuCisgIF9fbW1hc2s4IGxlX3plcm9fbWFzayA9IF9tbTUxMl9jbXBfcGRfbWFzayhfeCwgcDhkX2RibF9taW4sIF9DTVBfTFRfT1EpOworICBQYWNrZXQ4ZCB4ID0gX21tNTEyX21hc2tfYmxlbmRfcGQobGVfemVyb19tYXNrLCBfbW01MTJfc2V0emVyb19wZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3JzcXJ0MTRfcGQoX3gpKTsKKworICAvLyBGaWxsIGluIE5hTnMgYW5kIEluZnMgZm9yIHRoZSBuZWdhdGl2ZS96ZXJvIGVudHJpZXMuCisgIF9fbW1hc2s4IG5lZ19tYXNrID0gX21tNTEyX2NtcF9wZF9tYXNrKF94LCBfbW01MTJfc2V0emVyb19wZCgpLCBfQ01QX0xUX09RKTsKKyAgUGFja2V0OGQgaW5mc19hbmRfbmFucyA9IF9tbTUxMl9tYXNrX2JsZW5kX3BkKAorICAgICAgbmVnX21hc2ssIHA4ZF9uYW4sCisgICAgICBfbW01MTJfbWFza19ibGVuZF9wZChsZV96ZXJvX21hc2ssIHA4ZF9pbmYsIF9tbTUxMl9zZXR6ZXJvX3BkKCkpKTsKKworICAvLyBEbyBhIGZpcnN0IHN0ZXAgb2YgTmV3dG9uJ3MgaXRlcmF0aW9uLgorICB4ID0gcG11bCh4LCBwbWFkZChuZWdfaGFsZiwgcG11bCh4LCB4KSwgcDhkX29uZV9wb2ludF9maXZlKSk7CisKKyAgLy8gRG8gYSBzZWNvbmQgc3RlcCBvZiBOZXd0b24ncyBpdGVyYXRpb24uCisgIHggPSBwbXVsKHgsIHBtYWRkKG5lZ19oYWxmLCBwbXVsKHgsIHgpLCBwOGRfb25lX3BvaW50X2ZpdmUpKTsKKworICAvLyBJbnNlcnQgTmFOcyBhbmQgSW5mcyBpbiBhbGwgdGhlIHJpZ2h0IHBsYWNlcy4KKyAgcmV0dXJuIF9tbTUxMl9tYXNrX2JsZW5kX3BkKGxlX3plcm9fbWFzaywgaW5mc19hbmRfbmFucywgeCk7Cit9CisjZWxzZQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHByc3FydDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgeCkgeworICByZXR1cm4gX21tNTEyX3JzcXJ0MjhfcHMoeCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBUSElSRF9QQVJUWV9FSUdFTjNfRUlHRU5fU1JDX0NPUkVfQVJDSF9BVlg1MTJfTUFUSEZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlg1MTIvUGFja2V0TWF0aC5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9BVlg1MTIvUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTAwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FWWDUxMi9QYWNrZXRNYXRoLmgKQEAgLTAsMCArMSwxMzE2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciAoYmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20pCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBQ0tFVF9NQVRIX0FWWDUxMl9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFVF9NQVRIX0FWWDUxMl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZm5kZWYgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRAorI2RlZmluZSBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xEIDgKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTCisjZGVmaW5lIEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTICgyKnNpemVvZih2b2lkKikpCisjZW5kaWYKKworI2lmZGVmIF9fRk1BX18KKyNpZm5kZWYgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9NQURECisjZGVmaW5lIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiBfX201MTIgUGFja2V0MTZmOwordHlwZWRlZiBfX201MTJpIFBhY2tldDE2aTsKK3R5cGVkZWYgX19tNTEyZCBQYWNrZXQ4ZDsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19hcml0aG1ldGljPF9fbTUxMj4geworICBlbnVtIHsgdmFsdWUgPSB0cnVlIH07Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBpc19hcml0aG1ldGljPF9fbTUxMmk+IHsKKyAgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxfX201MTJkPiB7CisgIGVudW0geyB2YWx1ZSA9IHRydWUgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZmxvYXQ+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDE2ZiB0eXBlOworICB0eXBlZGVmIFBhY2tldDhmIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMTYsCisgICAgSGFzSGFsZlBhY2tldCA9IDEsCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg1LCAzKQorI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTJEUQorICAgIEhhc0xvZyA9IDEsCisjZW5kaWYKKyAgICBIYXNFeHAgPSAxLAorICAgIEhhc1NxcnQgPSAxLAorICAgIEhhc1JzcXJ0ID0gMSwKKyNlbmRpZgorICAgIEhhc0RpdiA9IDEKKyAgfTsKKyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxkb3VibGU+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0OGQgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQ0ZCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDgsCisgICAgSGFzSGFsZlBhY2tldCA9IDEsCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg1LCAzKQorICAgIEhhc1NxcnQgPSAxLAorICAgIEhhc1JzcXJ0ID0gRUlHRU5fRkFTVF9NQVRILAorI2VuZGlmCisgICAgSGFzRGl2ID0gMQorICB9OworfTsKKworLyogVE9ETyBJbXBsZW1lbnQgQVZYNTEyIGZvciBpbnRlZ2VycwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxpbnQ+ICAgIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MTZpIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTgKKyAgfTsKK307CisqLworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQxNmY+IHsKKyAgdHlwZWRlZiBmbG9hdCB0eXBlOworICB0eXBlZGVmIFBhY2tldDhmIGhhbGY7CisgIGVudW0geyBzaXplID0gMTYsIGFsaWdubWVudD1BbGlnbmVkNjQgfTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ4ZD4geworICB0eXBlZGVmIGRvdWJsZSB0eXBlOworICB0eXBlZGVmIFBhY2tldDRkIGhhbGY7CisgIGVudW0geyBzaXplID0gOCwgYWxpZ25tZW50PUFsaWduZWQ2NCB9OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDE2aT4geworICB0eXBlZGVmIGludCB0eXBlOworICB0eXBlZGVmIFBhY2tldDhpIGhhbGY7CisgIGVudW0geyBzaXplID0gMTYsIGFsaWdubWVudD1BbGlnbmVkNjQgfTsKK307CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwc2V0MTxQYWNrZXQxNmY+KGNvbnN0IGZsb2F0JiBmcm9tKSB7CisgIHJldHVybiBfbW01MTJfc2V0MV9wcyhmcm9tKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBzZXQxPFBhY2tldDhkPihjb25zdCBkb3VibGUmIGZyb20pIHsKKyAgcmV0dXJuIF9tbTUxMl9zZXQxX3BkKGZyb20pOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZpIHBzZXQxPFBhY2tldDE2aT4oY29uc3QgaW50JiBmcm9tKSB7CisgIHJldHVybiBfbW01MTJfc2V0MV9lcGkzMihmcm9tKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBsb2FkMTxQYWNrZXQxNmY+KGNvbnN0IGZsb2F0KiBmcm9tKSB7CisgIHJldHVybiBfbW01MTJfYnJvYWRjYXN0c3NfcHMoX21tX2xvYWRfcHMxKGZyb20pKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBsb2FkMTxQYWNrZXQ4ZD4oY29uc3QgZG91YmxlKiBmcm9tKSB7CisgIHJldHVybiBfbW01MTJfYnJvYWRjYXN0c2RfcGQoX21tX2xvYWRfcGQxKGZyb20pKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBsc2V0PFBhY2tldDE2Zj4oY29uc3QgZmxvYXQmIGEpIHsKKyAgcmV0dXJuIF9tbTUxMl9hZGRfcHMoCisgICAgICBfbW01MTJfc2V0MV9wcyhhKSwKKyAgICAgIF9tbTUxMl9zZXRfcHMoMTUuMGYsIDE0LjBmLCAxMy4wZiwgMTIuMGYsIDExLjBmLCAxMC4wZiwgOS4wZiwgOC4wZiwgNy4wZiwgNi4wZiwgNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgNC4wZiwgMy4wZiwgMi4wZiwgMS4wZiwgMC4wZikpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcGxzZXQ8UGFja2V0OGQ+KGNvbnN0IGRvdWJsZSYgYSkgeworICByZXR1cm4gX21tNTEyX2FkZF9wZChfbW01MTJfc2V0MV9wZChhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX3NldF9wZCg3LjAsIDYuMCwgNS4wLCA0LjAsIDMuMCwgMi4wLCAxLjAsIDAuMCkpOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcGFkZDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9hZGRfcHMoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwYWRkPFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9hZGRfcGQoYSwgYik7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwc3ViPFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDE2ZiYgYikgeworICByZXR1cm4gX21tNTEyX3N1Yl9wcyhhLCBiKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBzdWI8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQ4ZCYgYikgeworICByZXR1cm4gX21tNTEyX3N1Yl9wZChhLCBiKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBuZWdhdGUoY29uc3QgUGFja2V0MTZmJiBhKSB7CisgIHJldHVybiBfbW01MTJfc3ViX3BzKF9tbTUxMl9zZXQxX3BzKDAuMCksIGEpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcG5lZ2F0ZShjb25zdCBQYWNrZXQ4ZCYgYSkgeworICByZXR1cm4gX21tNTEyX3N1Yl9wZChfbW01MTJfc2V0MV9wZCgwLjApLCBhKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBjb25qKGNvbnN0IFBhY2tldDE2ZiYgYSkgeworICByZXR1cm4gYTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBjb25qKGNvbnN0IFBhY2tldDhkJiBhKSB7CisgIHJldHVybiBhOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZpIHBjb25qKGNvbnN0IFBhY2tldDE2aSYgYSkgeworICByZXR1cm4gYTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBtdWw8UGFja2V0MTZmPihjb25zdCBQYWNrZXQxNmYmIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0MTZmJiBiKSB7CisgIHJldHVybiBfbW01MTJfbXVsX3BzKGEsIGIpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcG11bDxQYWNrZXQ4ZD4oY29uc3QgUGFja2V0OGQmIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDhkJiBiKSB7CisgIHJldHVybiBfbW01MTJfbXVsX3BkKGEsIGIpOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcGRpdjxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9kaXZfcHMoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwZGl2PFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9kaXZfcGQoYSwgYik7Cit9CisKKyNpZmRlZiBfX0ZNQV9fCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcG1hZGQoY29uc3QgUGFja2V0MTZmJiBhLCBjb25zdCBQYWNrZXQxNmYmIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIGMpIHsKKyAgcmV0dXJuIF9tbTUxMl9mbWFkZF9wcyhhLCBiLCBjKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBtYWRkKGNvbnN0IFBhY2tldDhkJiBhLCBjb25zdCBQYWNrZXQ4ZCYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGMpIHsKKyAgcmV0dXJuIF9tbTUxMl9mbWFkZF9wZChhLCBiLCBjKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcG1pbjxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9taW5fcHMoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwbWluPFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGIpIHsKKyAgcmV0dXJuIF9tbTUxMl9taW5fcGQoYSwgYik7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwbWF4PFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDE2ZiYgYikgeworICByZXR1cm4gX21tNTEyX21heF9wcyhhLCBiKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBtYXg8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQ4ZCYgYikgeworICByZXR1cm4gX21tNTEyX21heF9wZChhLCBiKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBhbmQ8UGFja2V0MTZmPihjb25zdCBQYWNrZXQxNmYmIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0MTZmJiBiKSB7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIHJldHVybiBfbW01MTJfYW5kX3BzKGEsIGIpOworI2Vsc2UKKyAgUGFja2V0MTZmIHJlcyA9IF9tbTUxMl91bmRlZmluZWRfcHMoKTsKKyAgUGFja2V0NGYgbGFuZTBfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMCk7CisgIFBhY2tldDRmIGxhbmUwX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDApOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1fYW5kX3BzKGxhbmUwX2EsIGxhbmUwX2IpLCAwKTsKKworICBQYWNrZXQ0ZiBsYW5lMV9hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAxKTsKKyAgUGFja2V0NGYgbGFuZTFfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMSk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV9hbmRfcHMobGFuZTFfYSwgbGFuZTFfYiksIDEpOworCisgIFBhY2tldDRmIGxhbmUyX2EgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDIpOworICBQYWNrZXQ0ZiBsYW5lMl9iID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhiLCAyKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGYzMng0KHJlcywgX21tX2FuZF9wcyhsYW5lMl9hLCBsYW5lMl9iKSwgMik7CisKKyAgUGFja2V0NGYgbGFuZTNfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMyk7CisgIFBhY2tldDRmIGxhbmUzX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDMpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1fYW5kX3BzKGxhbmUzX2EsIGxhbmUzX2IpLCAzKTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwYW5kPFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGIpIHsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyAgcmV0dXJuIF9tbTUxMl9hbmRfcGQoYSwgYik7CisjZWxzZQorICBQYWNrZXQ4ZCByZXMgPSBfbW01MTJfdW5kZWZpbmVkX3BkKCk7CisgIFBhY2tldDRkIGxhbmUwX2EgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDApOworICBQYWNrZXQ0ZCBsYW5lMF9iID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChiLCAwKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGY2NHg0KHJlcywgX21tMjU2X2FuZF9wZChsYW5lMF9hLCBsYW5lMF9iKSwgMCk7CisKKyAgUGFja2V0NGQgbGFuZTFfYSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMSk7CisgIFBhY2tldDRkIGxhbmUxX2IgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGIsIDEpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjY0eDQocmVzLCBfbW0yNTZfYW5kX3BkKGxhbmUxX2EsIGxhbmUxX2IpLCAxKTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcG9yPFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0MTZmJiBiKSB7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIHJldHVybiBfbW01MTJfb3JfcHMoYSwgYik7CisjZWxzZQorICBQYWNrZXQxNmYgcmVzID0gX21tNTEyX3VuZGVmaW5lZF9wcygpOworICBQYWNrZXQ0ZiBsYW5lMF9hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAwKTsKKyAgUGFja2V0NGYgbGFuZTBfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMCk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV9vcl9wcyhsYW5lMF9hLCBsYW5lMF9iKSwgMCk7CisKKyAgUGFja2V0NGYgbGFuZTFfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMSk7CisgIFBhY2tldDRmIGxhbmUxX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDEpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1fb3JfcHMobGFuZTFfYSwgbGFuZTFfYiksIDEpOworCisgIFBhY2tldDRmIGxhbmUyX2EgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDIpOworICBQYWNrZXQ0ZiBsYW5lMl9iID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhiLCAyKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGYzMng0KHJlcywgX21tX29yX3BzKGxhbmUyX2EsIGxhbmUyX2IpLCAyKTsKKworICBQYWNrZXQ0ZiBsYW5lM19hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAzKTsKKyAgUGFja2V0NGYgbGFuZTNfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMyk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV9vcl9wcyhsYW5lM19hLCBsYW5lM19iKSwgMyk7CisKKyAgcmV0dXJuIHJlczsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwb3I8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDhkJiBiKSB7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIHJldHVybiBfbW01MTJfb3JfcGQoYSwgYik7CisjZWxzZQorICBQYWNrZXQ4ZCByZXMgPSBfbW01MTJfdW5kZWZpbmVkX3BkKCk7CisgIFBhY2tldDRkIGxhbmUwX2EgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDApOworICBQYWNrZXQ0ZCBsYW5lMF9iID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChiLCAwKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGY2NHg0KHJlcywgX21tMjU2X29yX3BkKGxhbmUwX2EsIGxhbmUwX2IpLCAwKTsKKworICBQYWNrZXQ0ZCBsYW5lMV9hID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAxKTsKKyAgUGFja2V0NGQgbGFuZTFfYiA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYiwgMSk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmNjR4NChyZXMsIF9tbTI1Nl9vcl9wZChsYW5lMV9hLCBsYW5lMV9iKSwgMSk7CisKKyAgcmV0dXJuIHJlczsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcHhvcjxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIGIpIHsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyAgcmV0dXJuIF9tbTUxMl94b3JfcHMoYSwgYik7CisjZWxzZQorICBQYWNrZXQxNmYgcmVzID0gX21tNTEyX3VuZGVmaW5lZF9wcygpOworICBQYWNrZXQ0ZiBsYW5lMF9hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAwKTsKKyAgUGFja2V0NGYgbGFuZTBfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMCk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV94b3JfcHMobGFuZTBfYSwgbGFuZTBfYiksIDApOworCisgIFBhY2tldDRmIGxhbmUxX2EgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDEpOworICBQYWNrZXQ0ZiBsYW5lMV9iID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhiLCAxKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGYzMng0KHJlcywgX21tX3hvcl9wcyhsYW5lMV9hLCBsYW5lMV9iKSwgMSk7CisKKyAgUGFja2V0NGYgbGFuZTJfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMik7CisgIFBhY2tldDRmIGxhbmUyX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDIpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1feG9yX3BzKGxhbmUyX2EsIGxhbmUyX2IpLCAyKTsKKworICBQYWNrZXQ0ZiBsYW5lM19hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAzKTsKKyAgUGFja2V0NGYgbGFuZTNfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMyk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV94b3JfcHMobGFuZTNfYSwgbGFuZTNfYiksIDMpOworCisgIHJldHVybiByZXM7CisjZW5kaWYKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHB4b3I8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQ4ZCYgYikgeworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTJEUQorICByZXR1cm4gX21tNTEyX3hvcl9wZChhLCBiKTsKKyNlbHNlCisgIFBhY2tldDhkIHJlcyA9IF9tbTUxMl91bmRlZmluZWRfcGQoKTsKKyAgUGFja2V0NGQgbGFuZTBfYSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMCk7CisgIFBhY2tldDRkIGxhbmUwX2IgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGIsIDApOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjY0eDQocmVzLCBfbW0yNTZfeG9yX3BkKGxhbmUwX2EsIGxhbmUwX2IpLCAwKTsKKworICBQYWNrZXQ0ZCBsYW5lMV9hID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAxKTsKKyAgUGFja2V0NGQgbGFuZTFfYiA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYiwgMSk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmNjR4NChyZXMsIF9tbTI1Nl94b3JfcGQobGFuZTFfYSwgbGFuZTFfYiksIDEpOworCisgIHJldHVybiByZXM7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBhbmRub3Q8UGFja2V0MTZmPihjb25zdCBQYWNrZXQxNmYmIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0MTZmJiBiKSB7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIHJldHVybiBfbW01MTJfYW5kbm90X3BzKGEsIGIpOworI2Vsc2UKKyAgUGFja2V0MTZmIHJlcyA9IF9tbTUxMl91bmRlZmluZWRfcHMoKTsKKyAgUGFja2V0NGYgbGFuZTBfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMCk7CisgIFBhY2tldDRmIGxhbmUwX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDApOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1fYW5kbm90X3BzKGxhbmUwX2EsIGxhbmUwX2IpLCAwKTsKKworICBQYWNrZXQ0ZiBsYW5lMV9hID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAxKTsKKyAgUGFja2V0NGYgbGFuZTFfYiA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYiwgMSk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbV9hbmRub3RfcHMobGFuZTFfYSwgbGFuZTFfYiksIDEpOworCisgIFBhY2tldDRmIGxhbmUyX2EgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDIpOworICBQYWNrZXQ0ZiBsYW5lMl9iID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhiLCAyKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGYzMng0KHJlcywgX21tX2FuZG5vdF9wcyhsYW5lMl9hLCBsYW5lMl9iKSwgMik7CisKKyAgUGFja2V0NGYgbGFuZTNfYSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMyk7CisgIFBhY2tldDRmIGxhbmUzX2IgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGIsIDMpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW1fYW5kbm90X3BzKGxhbmUzX2EsIGxhbmUzX2IpLCAzKTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwYW5kbm90PFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0OGQmIGIpIHsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyAgcmV0dXJuIF9tbTUxMl9hbmRub3RfcGQoYSwgYik7CisjZWxzZQorICBQYWNrZXQ4ZCByZXMgPSBfbW01MTJfdW5kZWZpbmVkX3BkKCk7CisgIFBhY2tldDRkIGxhbmUwX2EgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDApOworICBQYWNrZXQ0ZCBsYW5lMF9iID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChiLCAwKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGY2NHg0KHJlcywgX21tMjU2X2FuZG5vdF9wZChsYW5lMF9hLCBsYW5lMF9iKSwgMCk7CisKKyAgUGFja2V0NGQgbGFuZTFfYSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMSk7CisgIFBhY2tldDRkIGxhbmUxX2IgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGIsIDEpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjY0eDQocmVzLCBfbW0yNTZfYW5kbm90X3BkKGxhbmUxX2EsIGxhbmUxX2IpLCAxKTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwbG9hZDxQYWNrZXQxNmY+KGNvbnN0IGZsb2F0KiBmcm9tKSB7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gX21tNTEyX2xvYWRfcHMoZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwbG9hZDxQYWNrZXQ4ZD4oY29uc3QgZG91YmxlKiBmcm9tKSB7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gX21tNTEyX2xvYWRfcGQoZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmkgcGxvYWQ8UGFja2V0MTZpPihjb25zdCBpbnQqIGZyb20pIHsKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBfbW01MTJfbG9hZF9zaTUxMigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tNTEyaSo+KGZyb20pKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBsb2FkdTxQYWNrZXQxNmY+KGNvbnN0IGZsb2F0KiBmcm9tKSB7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBfbW01MTJfbG9hZHVfcHMoZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwbG9hZHU8UGFja2V0OGQ+KGNvbnN0IGRvdWJsZSogZnJvbSkgeworICBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gX21tNTEyX2xvYWR1X3BkKGZyb20pOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZpIHBsb2FkdTxQYWNrZXQxNmk+KGNvbnN0IGludCogZnJvbSkgeworICBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gX21tNTEyX2xvYWR1X3NpNTEyKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX201MTJpKj4oZnJvbSkpOworfQorCisvLyBMb2FkcyA4IGZsb2F0cyBmcm9tIG1lbW9yeSBhIHJldHVybnMgdGhlIHBhY2tldAorLy8ge2EwLCBhMCAgYTEsIGExLCBhMiwgYTIsIGEzLCBhMywgYTQsIGE0LCBhNSwgYTUsIGE2LCBhNiwgYTcsIGE3fQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBsb2FkZHVwPFBhY2tldDE2Zj4oY29uc3QgZmxvYXQqIGZyb20pIHsKKyAgUGFja2V0OGYgbGFuZTAgPSBfbW0yNTZfYnJvYWRjYXN0X3BzKChjb25zdCBfX20xMjgqKShjb25zdCB2b2lkKilmcm9tKTsKKyAgLy8gbWltaWMgYW4gImlucGxhY2UiIHBlcm11dGF0aW9uIG9mIHRoZSBsb3dlciAxMjhiaXRzIHVzaW5nIGEgYmxlbmQKKyAgbGFuZTAgPSBfbW0yNTZfYmxlbmRfcHMoCisgICAgICBsYW5lMCwgX21tMjU2X2Nhc3RwczEyOF9wczI1NihfbW1fcGVybXV0ZV9wcygKKyAgICAgICAgICAgICAgICAgX21tMjU2X2Nhc3RwczI1Nl9wczEyOChsYW5lMCksIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKSksCisgICAgICAxNSk7CisgIC8vIHRoZW4gd2UgY2FuIHBlcmZvcm0gYSBjb25zaXN0ZW50IHBlcm11dGF0aW9uIG9uIHRoZSBnbG9iYWwgcmVnaXN0ZXIgdG8gZ2V0CisgIC8vIGV2ZXJ5dGhpbmcgaW4gc2hhcGU6CisgIGxhbmUwID0gX21tMjU2X3Blcm11dGVfcHMobGFuZTAsIF9NTV9TSFVGRkxFKDMsIDMsIDIsIDIpKTsKKworICBQYWNrZXQ4ZiBsYW5lMSA9IF9tbTI1Nl9icm9hZGNhc3RfcHMoKGNvbnN0IF9fbTEyOCopKGNvbnN0IHZvaWQqKShmcm9tICsgNCkpOworICAvLyBtaW1pYyBhbiAiaW5wbGFjZSIgcGVybXV0YXRpb24gb2YgdGhlIGxvd2VyIDEyOGJpdHMgdXNpbmcgYSBibGVuZAorICBsYW5lMSA9IF9tbTI1Nl9ibGVuZF9wcygKKyAgICAgIGxhbmUxLCBfbW0yNTZfY2FzdHBzMTI4X3BzMjU2KF9tbV9wZXJtdXRlX3BzKAorICAgICAgICAgICAgICAgICBfbW0yNTZfY2FzdHBzMjU2X3BzMTI4KGxhbmUxKSwgX01NX1NIVUZGTEUoMSwgMCwgMSwgMCkpKSwKKyAgICAgIDE1KTsKKyAgLy8gdGhlbiB3ZSBjYW4gcGVyZm9ybSBhIGNvbnNpc3RlbnQgcGVybXV0YXRpb24gb24gdGhlIGdsb2JhbCByZWdpc3RlciB0byBnZXQKKyAgLy8gZXZlcnl0aGluZyBpbiBzaGFwZToKKyAgbGFuZTEgPSBfbW0yNTZfcGVybXV0ZV9wcyhsYW5lMSwgX01NX1NIVUZGTEUoMywgMywgMiwgMikpOworCisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIFBhY2tldDE2ZiByZXMgPSBfbW01MTJfdW5kZWZpbmVkX3BzKCk7CisgIHJldHVybiBfbW01MTJfaW5zZXJ0ZjMyeDgocmVzLCBsYW5lMCwgMCk7CisgIHJldHVybiBfbW01MTJfaW5zZXJ0ZjMyeDgocmVzLCBsYW5lMSwgMSk7CisgIHJldHVybiByZXM7CisjZWxzZQorICBQYWNrZXQxNmYgcmVzID0gX21tNTEyX3VuZGVmaW5lZF9wcygpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW0yNTZfZXh0cmFjdGYxMjhfcHMobGFuZTAsIDApLCAwKTsKKyAgcmVzID0gX21tNTEyX2luc2VydGYzMng0KHJlcywgX21tMjU2X2V4dHJhY3RmMTI4X3BzKGxhbmUwLCAxKSwgMSk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmMzJ4NChyZXMsIF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhsYW5lMSwgMCksIDIpOworICByZXMgPSBfbW01MTJfaW5zZXJ0ZjMyeDQocmVzLCBfbW0yNTZfZXh0cmFjdGYxMjhfcHMobGFuZTEsIDEpLCAzKTsKKyAgcmV0dXJuIHJlczsKKyNlbmRpZgorfQorLy8gTG9hZHMgNCBkb3VibGVzIGZyb20gbWVtb3J5IGEgcmV0dXJucyB0aGUgcGFja2V0IHthMCwgYTAgIGExLCBhMSwgYTIsIGEyLCBhMywKKy8vIGEzfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcGxvYWRkdXA8UGFja2V0OGQ+KGNvbnN0IGRvdWJsZSogZnJvbSkgeworICBQYWNrZXQ0ZCBsYW5lMCA9IF9tbTI1Nl9icm9hZGNhc3RfcGQoKGNvbnN0IF9fbTEyOGQqKShjb25zdCB2b2lkKilmcm9tKTsKKyAgbGFuZTAgPSBfbW0yNTZfcGVybXV0ZV9wZChsYW5lMCwgMyA8PCAyKTsKKworICBQYWNrZXQ0ZCBsYW5lMSA9IF9tbTI1Nl9icm9hZGNhc3RfcGQoKGNvbnN0IF9fbTEyOGQqKShjb25zdCB2b2lkKikoZnJvbSArIDIpKTsKKyAgbGFuZTEgPSBfbW0yNTZfcGVybXV0ZV9wZChsYW5lMSwgMyA8PCAyKTsKKworICBQYWNrZXQ4ZCByZXMgPSBfbW01MTJfdW5kZWZpbmVkX3BkKCk7CisgIHJlcyA9IF9tbTUxMl9pbnNlcnRmNjR4NChyZXMsIGxhbmUwLCAwKTsKKyAgcmV0dXJuIF9tbTUxMl9pbnNlcnRmNjR4NChyZXMsIGxhbmUxLCAxKTsKK30KKworLy8gTG9hZHMgNCBmbG9hdHMgZnJvbSBtZW1vcnkgYSByZXR1cm5zIHRoZSBwYWNrZXQKKy8vIHthMCwgYTAgIGEwLCBhMCwgYTEsIGExLCBhMSwgYTEsIGEyLCBhMiwgYTIsIGEyLCBhMywgYTMsIGEzLCBhM30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwbG9hZHF1YWQ8UGFja2V0MTZmPihjb25zdCBmbG9hdCogZnJvbSkgeworICBQYWNrZXQxNmYgdG1wID0gX21tNTEyX3VuZGVmaW5lZF9wcygpOworICB0bXAgPSBfbW01MTJfaW5zZXJ0ZjMyeDQodG1wLCBfbW1fbG9hZF9wczEoZnJvbSksIDApOworICB0bXAgPSBfbW01MTJfaW5zZXJ0ZjMyeDQodG1wLCBfbW1fbG9hZF9wczEoZnJvbSArIDEpLCAxKTsKKyAgdG1wID0gX21tNTEyX2luc2VydGYzMng0KHRtcCwgX21tX2xvYWRfcHMxKGZyb20gKyAyKSwgMik7CisgIHRtcCA9IF9tbTUxMl9pbnNlcnRmMzJ4NCh0bXAsIF9tbV9sb2FkX3BzMShmcm9tICsgMyksIDMpOworICByZXR1cm4gdG1wOworfQorLy8gTG9hZHMgMiBkb3VibGVzIGZyb20gbWVtb3J5IGEgcmV0dXJucyB0aGUgcGFja2V0CisvLyB7YTAsIGEwICBhMCwgYTAsIGExLCBhMSwgYTEsIGExfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGQgcGxvYWRxdWFkPFBhY2tldDhkPihjb25zdCBkb3VibGUqIGZyb20pIHsKKyAgUGFja2V0OGQgdG1wID0gX21tNTEyX3VuZGVmaW5lZF9wZCgpOworICBQYWNrZXQyZCB0bXAwID0gX21tX2xvYWRfcGQxKGZyb20pOworICBQYWNrZXQyZCB0bXAxID0gX21tX2xvYWRfcGQxKGZyb20gKyAxKTsKKyAgUGFja2V0NGQgbGFuZTAgPSBfbW0yNTZfYnJvYWRjYXN0c2RfcGQodG1wMCk7CisgIFBhY2tldDRkIGxhbmUxID0gX21tMjU2X2Jyb2FkY2FzdHNkX3BkKHRtcDEpOworICB0bXAgPSBfbW01MTJfaW5zZXJ0ZjY0eDQodG1wLCBsYW5lMCwgMCk7CisgIHJldHVybiBfbW01MTJfaW5zZXJ0ZjY0eDQodG1wLCBsYW5lMSwgMSk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGZsb2F0PihmbG9hdCogdG8sIGNvbnN0IFBhY2tldDE2ZiYgZnJvbSkgeworICBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIF9tbTUxMl9zdG9yZV9wcyh0bywgZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxkb3VibGU+KGRvdWJsZSogdG8sIGNvbnN0IFBhY2tldDhkJiBmcm9tKSB7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgX21tNTEyX3N0b3JlX3BkKHRvLCBmcm9tKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGludD4oaW50KiB0bywgY29uc3QgUGFja2V0MTZpJiBmcm9tKSB7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgX21tNTEyX3N0b3JldV9zaTUxMihyZWludGVycHJldF9jYXN0PF9fbTUxMmkqPih0byksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGZsb2F0PihmbG9hdCogdG8sIGNvbnN0IFBhY2tldDE2ZiYgZnJvbSkgeworICBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgX21tNTEyX3N0b3JldV9wcyh0bywgZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZG91YmxlPihkb3VibGUqIHRvLCBjb25zdCBQYWNrZXQ4ZCYgZnJvbSkgeworICBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgX21tNTEyX3N0b3JldV9wZCh0bywgZnJvbSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8aW50PihpbnQqIHRvLCBjb25zdCBQYWNrZXQxNmkmIGZyb20pIHsKKyAgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIF9tbTUxMl9zdG9yZXVfc2k1MTIoCisgICAgICByZWludGVycHJldF9jYXN0PF9fbTUxMmkqPih0byksIGZyb20pOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDE2ZiBwZ2F0aGVyPGZsb2F0LCBQYWNrZXQxNmY+KGNvbnN0IGZsb2F0KiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IHN0cmlkZSkgeworICBQYWNrZXQxNmkgc3RyaWRlX3ZlY3RvciA9IF9tbTUxMl9zZXQxX2VwaTMyKHN0cmlkZSk7CisgIFBhY2tldDE2aSBzdHJpZGVfbXVsdGlwbGllciA9CisgICAgICBfbW01MTJfc2V0X2VwaTMyKDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApOworICBQYWNrZXQxNmkgaW5kaWNlcyA9IF9tbTUxMl9tdWxsb19lcGkzMihzdHJpZGVfdmVjdG9yLCBzdHJpZGVfbXVsdGlwbGllcik7CisKKyAgcmV0dXJuIF9tbTUxMl9pMzJnYXRoZXJfcHMoaW5kaWNlcywgZnJvbSwgNCk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDhkIHBnYXRoZXI8ZG91YmxlLCBQYWNrZXQ4ZD4oY29uc3QgZG91YmxlKiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggc3RyaWRlKSB7CisgIFBhY2tldDhpIHN0cmlkZV92ZWN0b3IgPSBfbW0yNTZfc2V0MV9lcGkzMihzdHJpZGUpOworICBQYWNrZXQ4aSBzdHJpZGVfbXVsdGlwbGllciA9IF9tbTI1Nl9zZXRfZXBpMzIoNywgNiwgNSwgNCwgMywgMiwgMSwgMCk7CisgIFBhY2tldDhpIGluZGljZXMgPSBfbW0yNTZfbXVsbG9fZXBpMzIoc3RyaWRlX3ZlY3Rvciwgc3RyaWRlX211bHRpcGxpZXIpOworCisgIHJldHVybiBfbW01MTJfaTMyZ2F0aGVyX3BkKGluZGljZXMsIGZyb20sIDgpOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZmxvYXQsIFBhY2tldDE2Zj4oZmxvYXQqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFja2V0MTZmJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggc3RyaWRlKSB7CisgIFBhY2tldDE2aSBzdHJpZGVfdmVjdG9yID0gX21tNTEyX3NldDFfZXBpMzIoc3RyaWRlKTsKKyAgUGFja2V0MTZpIHN0cmlkZV9tdWx0aXBsaWVyID0KKyAgICAgIF9tbTUxMl9zZXRfZXBpMzIoMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCk7CisgIFBhY2tldDE2aSBpbmRpY2VzID0gX21tNTEyX211bGxvX2VwaTMyKHN0cmlkZV92ZWN0b3IsIHN0cmlkZV9tdWx0aXBsaWVyKTsKKyAgX21tNTEyX2kzMnNjYXR0ZXJfcHModG8sIGluZGljZXMsIGZyb20sIDQpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGRvdWJsZSwgUGFja2V0OGQ+KGRvdWJsZSogdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQ4ZCYgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IHN0cmlkZSkgeworICBQYWNrZXQ4aSBzdHJpZGVfdmVjdG9yID0gX21tMjU2X3NldDFfZXBpMzIoc3RyaWRlKTsKKyAgUGFja2V0OGkgc3RyaWRlX211bHRpcGxpZXIgPSBfbW0yNTZfc2V0X2VwaTMyKDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApOworICBQYWNrZXQ4aSBpbmRpY2VzID0gX21tMjU2X211bGxvX2VwaTMyKHN0cmlkZV92ZWN0b3IsIHN0cmlkZV9tdWx0aXBsaWVyKTsKKyAgX21tNTEyX2kzMnNjYXR0ZXJfcGQodG8sIGluZGljZXMsIGZyb20sIDgpOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0MTZmPihmbG9hdCogdG8sIGNvbnN0IGZsb2F0JiBhKSB7CisgIFBhY2tldDE2ZiBwYSA9IHBzZXQxPFBhY2tldDE2Zj4oYSk7CisgIHBzdG9yZSh0bywgcGEpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmUxPFBhY2tldDhkPihkb3VibGUqIHRvLCBjb25zdCBkb3VibGUmIGEpIHsKKyAgUGFja2V0OGQgcGEgPSBwc2V0MTxQYWNrZXQ4ZD4oYSk7CisgIHBzdG9yZSh0bywgcGEpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmUxPFBhY2tldDE2aT4oaW50KiB0bywgY29uc3QgaW50JiBhKSB7CisgIFBhY2tldDE2aSBwYSA9IHBzZXQxPFBhY2tldDE2aT4oYSk7CisgIHBzdG9yZSh0bywgcGEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxmbG9hdD4oY29uc3QgZmxvYXQqICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxkb3VibGU+KGNvbnN0IGRvdWJsZSogYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxpbnQ+KGNvbnN0IGludCogICAgICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHBmaXJzdDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSkgeworICByZXR1cm4gX21tX2N2dHNzX2YzMihfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDApKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhKSB7CisgIHJldHVybiBfbW1fY3Z0c2RfZjY0KF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDApLCAwKSk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBpbnQgcGZpcnN0PFBhY2tldDE2aT4oY29uc3QgUGFja2V0MTZpJiBhKSB7CisgIHJldHVybiBfbW1fZXh0cmFjdF9lcGkzMihfbW01MTJfZXh0cmFjdGkzMng0X2VwaTMyKGEsIDApLCAwKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwcmV2ZXJzZShjb25zdCBQYWNrZXQxNmYmIGEpCit7CisgIHJldHVybiBfbW01MTJfcGVybXV0ZXh2YXJfcHMoX21tNTEyX3NldF9lcGkzMigwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1KSwgYSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQ4ZCYgYSkKK3sKKyAgcmV0dXJuIF9tbTUxMl9wZXJtdXRleHZhcl9wZChfbW01MTJfc2V0X2VwaTMyKDAsIDAsIDAsIDEsIDAsIDIsIDAsIDMsIDAsIDQsIDAsIDUsIDAsIDYsIDAsIDcpLCBhKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwYWJzKGNvbnN0IFBhY2tldDE2ZiYgYSkKK3sKKyAgLy8gX21tNTEyX2Fic19wcyBpbnRyaW5zaWMgbm90IGZvdW5kLCBzbyBoYWNrIGFyb3VuZCBpdAorICByZXR1cm4gKF9fbTUxMilfbW01MTJfYW5kX3NpNTEyKChfX201MTJpKWEsIF9tbTUxMl9zZXQxX2VwaTMyKDB4N2ZmZmZmZmYpKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHBhYnMoY29uc3QgUGFja2V0OGQmIGEpIHsKKyAgLy8gX21tNTEyX2Fic19wcyBpbnRyaW5zaWMgbm90IGZvdW5kLCBzbyBoYWNrIGFyb3VuZCBpdAorICByZXR1cm4gKF9fbTUxMmQpX21tNTEyX2FuZF9zaTUxMigoX19tNTEyaSlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfc2V0MV9lcGk2NCgweDdmZmZmZmZmZmZmZmZmZmYpKTsKK30KKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTJEUQorLy8gQVZYNTEyRiBkb2VzIG5vdCBkZWZpbmUgX21tNTEyX2V4dHJhY3RmMzJ4OF9wcyB0byBleHRyYWN0IF9tMjU2IGZyb20gX201MTIKKyNkZWZpbmUgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihJTlBVVCwgT1VUUFVUKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19tMjU2IE9VVFBVVCMjXzAgPSBfbW01MTJfZXh0cmFjdGYzMng4X3BzKElOUFVULCAwKSBfX20yNTYgT1VUUFVUIyNfMSA9IFwKKyAgICAgIF9tbTUxMl9leHRyYWN0ZjMyeDhfcHMoSU5QVVQsIDEpCisjZWxzZQorI2RlZmluZSBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKElOUFVULCBPVVRQVVQpICAgICAgICAgICAgICAgIFwKKyAgX19tMjU2IE9VVFBVVCMjXzAgPSBfbW0yNTZfaW5zZXJ0ZjEyOF9wcyggICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfbW0yNTZfY2FzdHBzMTI4X3BzMjU2KF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoSU5QVVQsIDApKSwgXAorICAgICAgX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhJTlBVVCwgMSksIDEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19tMjU2IE9VVFBVVCMjXzEgPSBfbW0yNTZfaW5zZXJ0ZjEyOF9wcyggICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfbW0yNTZfY2FzdHBzMTI4X3BzMjU2KF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoSU5QVVQsIDIpKSwgXAorICAgICAgX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhJTlBVVCwgMyksIDEpOworI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyNkZWZpbmUgRUlHRU5fSU5TRVJUXzhmX0lOVE9fMTZmKE9VVFBVVCwgSU5QVVRBLCBJTlBVVEIpIFwKKyAgT1VUUFVUID0gX21tNTEyX2luc2VydGYzMng4KE9VVFBVVCwgSU5QVVRBLCAwKTsgICAgICAgIFwKKyAgT1VUUFVUID0gX21tNTEyX2luc2VydGYzMng4KE9VVFBVVCwgSU5QVVRCLCAxKTsKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0lOU0VSVF84Zl9JTlRPXzE2ZihPVVRQVVQsIElOUFVUQSwgSU5QVVRCKSAgICAgICAgICAgICAgICAgICAgXAorICBPVVRQVVQgPSBfbW01MTJfaW5zZXJ0ZjMyeDQoT1VUUFVULCBfbW0yNTZfZXh0cmFjdGYxMjhfcHMoSU5QVVRBLCAwKSwgMCk7IFwKKyAgT1VUUFVUID0gX21tNTEyX2luc2VydGYzMng0KE9VVFBVVCwgX21tMjU2X2V4dHJhY3RmMTI4X3BzKElOUFVUQSwgMSksIDEpOyBcCisgIE9VVFBVVCA9IF9tbTUxMl9pbnNlcnRmMzJ4NChPVVRQVVQsIF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhJTlBVVEIsIDApLCAyKTsgXAorICBPVVRQVVQgPSBfbW01MTJfaW5zZXJ0ZjMyeDQoT1VUUFVULCBfbW0yNTZfZXh0cmFjdGYxMjhfcHMoSU5QVVRCLCAxKSwgMyk7CisjZW5kaWYKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmYgcHJlZHV4cDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZioKK3ZlY3MpCit7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYodmVjc1swXSwgdmVjczApOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMV0sIHZlY3MxKTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2Zih2ZWNzWzJdLCB2ZWNzMik7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYodmVjc1szXSwgdmVjczMpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbNF0sIHZlY3M0KTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2Zih2ZWNzWzVdLCB2ZWNzNSk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYodmVjc1s2XSwgdmVjczYpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbN10sIHZlY3M3KTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2Zih2ZWNzWzhdLCB2ZWNzOCk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYodmVjc1s5XSwgdmVjczkpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTBdLCB2ZWNzMTApOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTFdLCB2ZWNzMTEpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTJdLCB2ZWNzMTIpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTNdLCB2ZWNzMTMpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTRdLCB2ZWNzMTQpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKHZlY3NbMTVdLCB2ZWNzMTUpOworCisgIF9fbTI1NiBoc3VtMSA9IF9tbTI1Nl9oYWRkX3BzKHZlY3MwXzAsIHZlY3MxXzApOworICBfX20yNTYgaHN1bTIgPSBfbW0yNTZfaGFkZF9wcyh2ZWNzMl8wLCB2ZWNzM18wKTsKKyAgX19tMjU2IGhzdW0zID0gX21tMjU2X2hhZGRfcHModmVjczRfMCwgdmVjczVfMCk7CisgIF9fbTI1NiBoc3VtNCA9IF9tbTI1Nl9oYWRkX3BzKHZlY3M2XzAsIHZlY3M3XzApOworCisgIF9fbTI1NiBoc3VtNSA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0xLCBoc3VtMSk7CisgIF9fbTI1NiBoc3VtNiA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0yLCBoc3VtMik7CisgIF9fbTI1NiBoc3VtNyA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0zLCBoc3VtMyk7CisgIF9fbTI1NiBoc3VtOCA9IF9tbTI1Nl9oYWRkX3BzKGhzdW00LCBoc3VtNCk7CisKKyAgX19tMjU2IHBlcm0xID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtNSwgaHN1bTUsIDB4MjMpOworICBfX20yNTYgcGVybTIgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW02LCBoc3VtNiwgMHgyMyk7CisgIF9fbTI1NiBwZXJtMyA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTcsIGhzdW03LCAweDIzKTsKKyAgX19tMjU2IHBlcm00ID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtOCwgaHN1bTgsIDB4MjMpOworCisgIF9fbTI1NiBzdW0xID0gX21tMjU2X2FkZF9wcyhwZXJtMSwgaHN1bTUpOworICBfX20yNTYgc3VtMiA9IF9tbTI1Nl9hZGRfcHMocGVybTIsIGhzdW02KTsKKyAgX19tMjU2IHN1bTMgPSBfbW0yNTZfYWRkX3BzKHBlcm0zLCBoc3VtNyk7CisgIF9fbTI1NiBzdW00ID0gX21tMjU2X2FkZF9wcyhwZXJtNCwgaHN1bTgpOworCisgIF9fbTI1NiBibGVuZDEgPSBfbW0yNTZfYmxlbmRfcHMoc3VtMSwgc3VtMiwgMHhjYyk7CisgIF9fbTI1NiBibGVuZDIgPSBfbW0yNTZfYmxlbmRfcHMoc3VtMywgc3VtNCwgMHhjYyk7CisKKyAgX19tMjU2IGZpbmFsID0gX21tMjU2X2JsZW5kX3BzKGJsZW5kMSwgYmxlbmQyLCAweGYwKTsKKworICBoc3VtMSA9IF9tbTI1Nl9oYWRkX3BzKHZlY3MwXzEsIHZlY3MxXzEpOworICBoc3VtMiA9IF9tbTI1Nl9oYWRkX3BzKHZlY3MyXzEsIHZlY3MzXzEpOworICBoc3VtMyA9IF9tbTI1Nl9oYWRkX3BzKHZlY3M0XzEsIHZlY3M1XzEpOworICBoc3VtNCA9IF9tbTI1Nl9oYWRkX3BzKHZlY3M2XzEsIHZlY3M3XzEpOworCisgIGhzdW01ID0gX21tMjU2X2hhZGRfcHMoaHN1bTEsIGhzdW0xKTsKKyAgaHN1bTYgPSBfbW0yNTZfaGFkZF9wcyhoc3VtMiwgaHN1bTIpOworICBoc3VtNyA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0zLCBoc3VtMyk7CisgIGhzdW04ID0gX21tMjU2X2hhZGRfcHMoaHN1bTQsIGhzdW00KTsKKworICBwZXJtMSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTUsIGhzdW01LCAweDIzKTsKKyAgcGVybTIgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW02LCBoc3VtNiwgMHgyMyk7CisgIHBlcm0zID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtNywgaHN1bTcsIDB4MjMpOworICBwZXJtNCA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTgsIGhzdW04LCAweDIzKTsKKworICBzdW0xID0gX21tMjU2X2FkZF9wcyhwZXJtMSwgaHN1bTUpOworICBzdW0yID0gX21tMjU2X2FkZF9wcyhwZXJtMiwgaHN1bTYpOworICBzdW0zID0gX21tMjU2X2FkZF9wcyhwZXJtMywgaHN1bTcpOworICBzdW00ID0gX21tMjU2X2FkZF9wcyhwZXJtNCwgaHN1bTgpOworCisgIGJsZW5kMSA9IF9tbTI1Nl9ibGVuZF9wcyhzdW0xLCBzdW0yLCAweGNjKTsKKyAgYmxlbmQyID0gX21tMjU2X2JsZW5kX3BzKHN1bTMsIHN1bTQsIDB4Y2MpOworCisgIGZpbmFsID0gcGFkZChmaW5hbCwgX21tMjU2X2JsZW5kX3BzKGJsZW5kMSwgYmxlbmQyLCAweGYwKSk7CisKKyAgaHN1bTEgPSBfbW0yNTZfaGFkZF9wcyh2ZWNzOF8wLCB2ZWNzOV8wKTsKKyAgaHN1bTIgPSBfbW0yNTZfaGFkZF9wcyh2ZWNzMTBfMCwgdmVjczExXzApOworICBoc3VtMyA9IF9tbTI1Nl9oYWRkX3BzKHZlY3MxMl8wLCB2ZWNzMTNfMCk7CisgIGhzdW00ID0gX21tMjU2X2hhZGRfcHModmVjczE0XzAsIHZlY3MxNV8wKTsKKworICBoc3VtNSA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0xLCBoc3VtMSk7CisgIGhzdW02ID0gX21tMjU2X2hhZGRfcHMoaHN1bTIsIGhzdW0yKTsKKyAgaHN1bTcgPSBfbW0yNTZfaGFkZF9wcyhoc3VtMywgaHN1bTMpOworICBoc3VtOCA9IF9tbTI1Nl9oYWRkX3BzKGhzdW00LCBoc3VtNCk7CisKKyAgcGVybTEgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW01LCBoc3VtNSwgMHgyMyk7CisgIHBlcm0yID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtNiwgaHN1bTYsIDB4MjMpOworICBwZXJtMyA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTcsIGhzdW03LCAweDIzKTsKKyAgcGVybTQgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW04LCBoc3VtOCwgMHgyMyk7CisKKyAgc3VtMSA9IF9tbTI1Nl9hZGRfcHMocGVybTEsIGhzdW01KTsKKyAgc3VtMiA9IF9tbTI1Nl9hZGRfcHMocGVybTIsIGhzdW02KTsKKyAgc3VtMyA9IF9tbTI1Nl9hZGRfcHMocGVybTMsIGhzdW03KTsKKyAgc3VtNCA9IF9tbTI1Nl9hZGRfcHMocGVybTQsIGhzdW04KTsKKworICBibGVuZDEgPSBfbW0yNTZfYmxlbmRfcHMoc3VtMSwgc3VtMiwgMHhjYyk7CisgIGJsZW5kMiA9IF9tbTI1Nl9ibGVuZF9wcyhzdW0zLCBzdW00LCAweGNjKTsKKworICBfX20yNTYgZmluYWxfMSA9IF9tbTI1Nl9ibGVuZF9wcyhibGVuZDEsIGJsZW5kMiwgMHhmMCk7CisKKyAgaHN1bTEgPSBfbW0yNTZfaGFkZF9wcyh2ZWNzOF8xLCB2ZWNzOV8xKTsKKyAgaHN1bTIgPSBfbW0yNTZfaGFkZF9wcyh2ZWNzMTBfMSwgdmVjczExXzEpOworICBoc3VtMyA9IF9tbTI1Nl9oYWRkX3BzKHZlY3MxMl8xLCB2ZWNzMTNfMSk7CisgIGhzdW00ID0gX21tMjU2X2hhZGRfcHModmVjczE0XzEsIHZlY3MxNV8xKTsKKworICBoc3VtNSA9IF9tbTI1Nl9oYWRkX3BzKGhzdW0xLCBoc3VtMSk7CisgIGhzdW02ID0gX21tMjU2X2hhZGRfcHMoaHN1bTIsIGhzdW0yKTsKKyAgaHN1bTcgPSBfbW0yNTZfaGFkZF9wcyhoc3VtMywgaHN1bTMpOworICBoc3VtOCA9IF9tbTI1Nl9oYWRkX3BzKGhzdW00LCBoc3VtNCk7CisKKyAgcGVybTEgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW01LCBoc3VtNSwgMHgyMyk7CisgIHBlcm0yID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhoc3VtNiwgaHN1bTYsIDB4MjMpOworICBwZXJtMyA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoaHN1bTcsIGhzdW03LCAweDIzKTsKKyAgcGVybTQgPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKGhzdW04LCBoc3VtOCwgMHgyMyk7CisKKyAgc3VtMSA9IF9tbTI1Nl9hZGRfcHMocGVybTEsIGhzdW01KTsKKyAgc3VtMiA9IF9tbTI1Nl9hZGRfcHMocGVybTIsIGhzdW02KTsKKyAgc3VtMyA9IF9tbTI1Nl9hZGRfcHMocGVybTMsIGhzdW03KTsKKyAgc3VtNCA9IF9tbTI1Nl9hZGRfcHMocGVybTQsIGhzdW04KTsKKworICBibGVuZDEgPSBfbW0yNTZfYmxlbmRfcHMoc3VtMSwgc3VtMiwgMHhjYyk7CisgIGJsZW5kMiA9IF9tbTI1Nl9ibGVuZF9wcyhzdW0zLCBzdW00LCAweGNjKTsKKworICBmaW5hbF8xID0gcGFkZChmaW5hbF8xLCBfbW0yNTZfYmxlbmRfcHMoYmxlbmQxLCBibGVuZDIsIDB4ZjApKTsKKworICBfX201MTIgZmluYWxfb3V0cHV0OworCisgIEVJR0VOX0lOU0VSVF84Zl9JTlRPXzE2ZihmaW5hbF9vdXRwdXQsIGZpbmFsLCBmaW5hbF8xKTsKKyAgcmV0dXJuIGZpbmFsX291dHB1dDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhkIHByZWR1eHA8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkKiB2ZWNzKQoreworICBQYWNrZXQ0ZCB2ZWNzMF8wID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZCh2ZWNzWzBdLCAwKTsKKyAgUGFja2V0NGQgdmVjczBfMSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1swXSwgMSk7CisKKyAgUGFja2V0NGQgdmVjczFfMCA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1sxXSwgMCk7CisgIFBhY2tldDRkIHZlY3MxXzEgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKHZlY3NbMV0sIDEpOworCisgIFBhY2tldDRkIHZlY3MyXzAgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKHZlY3NbMl0sIDApOworICBQYWNrZXQ0ZCB2ZWNzMl8xID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZCh2ZWNzWzJdLCAxKTsKKworICBQYWNrZXQ0ZCB2ZWNzM18wID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZCh2ZWNzWzNdLCAwKTsKKyAgUGFja2V0NGQgdmVjczNfMSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1szXSwgMSk7CisKKyAgUGFja2V0NGQgdmVjczRfMCA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1s0XSwgMCk7CisgIFBhY2tldDRkIHZlY3M0XzEgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKHZlY3NbNF0sIDEpOworCisgIFBhY2tldDRkIHZlY3M1XzAgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKHZlY3NbNV0sIDApOworICBQYWNrZXQ0ZCB2ZWNzNV8xID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZCh2ZWNzWzVdLCAxKTsKKworICBQYWNrZXQ0ZCB2ZWNzNl8wID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZCh2ZWNzWzZdLCAwKTsKKyAgUGFja2V0NGQgdmVjczZfMSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1s2XSwgMSk7CisKKyAgUGFja2V0NGQgdmVjczdfMCA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQodmVjc1s3XSwgMCk7CisgIFBhY2tldDRkIHZlY3M3XzEgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKHZlY3NbN10sIDEpOworCisgIFBhY2tldDRkIHRtcDAsIHRtcDE7CisKKyAgdG1wMCA9IF9tbTI1Nl9oYWRkX3BkKHZlY3MwXzAsIHZlY3MxXzApOworICB0bXAwID0gX21tMjU2X2FkZF9wZCh0bXAwLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHRtcDAsIHRtcDAsIDEpKTsKKworICB0bXAxID0gX21tMjU2X2hhZGRfcGQodmVjczJfMCwgdmVjczNfMCk7CisgIHRtcDEgPSBfbW0yNTZfYWRkX3BkKHRtcDEsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodG1wMSwgdG1wMSwgMSkpOworCisgIF9fbTI1NmQgZmluYWxfMCA9IF9tbTI1Nl9ibGVuZF9wZCh0bXAwLCB0bXAxLCAweEMpOworCisgIHRtcDAgPSBfbW0yNTZfaGFkZF9wZCh2ZWNzMF8xLCB2ZWNzMV8xKTsKKyAgdG1wMCA9IF9tbTI1Nl9hZGRfcGQodG1wMCwgX21tMjU2X3Blcm11dGUyZjEyOF9wZCh0bXAwLCB0bXAwLCAxKSk7CisKKyAgdG1wMSA9IF9tbTI1Nl9oYWRkX3BkKHZlY3MyXzEsIHZlY3MzXzEpOworICB0bXAxID0gX21tMjU2X2FkZF9wZCh0bXAxLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHRtcDEsIHRtcDEsIDEpKTsKKworICBmaW5hbF8wID0gcGFkZChmaW5hbF8wLCBfbW0yNTZfYmxlbmRfcGQodG1wMCwgdG1wMSwgMHhDKSk7CisKKyAgdG1wMCA9IF9tbTI1Nl9oYWRkX3BkKHZlY3M0XzAsIHZlY3M1XzApOworICB0bXAwID0gX21tMjU2X2FkZF9wZCh0bXAwLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHRtcDAsIHRtcDAsIDEpKTsKKworICB0bXAxID0gX21tMjU2X2hhZGRfcGQodmVjczZfMCwgdmVjczdfMCk7CisgIHRtcDEgPSBfbW0yNTZfYWRkX3BkKHRtcDEsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQodG1wMSwgdG1wMSwgMSkpOworCisgIF9fbTI1NmQgZmluYWxfMSA9IF9tbTI1Nl9ibGVuZF9wZCh0bXAwLCB0bXAxLCAweEMpOworCisgIHRtcDAgPSBfbW0yNTZfaGFkZF9wZCh2ZWNzNF8xLCB2ZWNzNV8xKTsKKyAgdG1wMCA9IF9tbTI1Nl9hZGRfcGQodG1wMCwgX21tMjU2X3Blcm11dGUyZjEyOF9wZCh0bXAwLCB0bXAwLCAxKSk7CisKKyAgdG1wMSA9IF9tbTI1Nl9oYWRkX3BkKHZlY3M2XzEsIHZlY3M3XzEpOworICB0bXAxID0gX21tMjU2X2FkZF9wZCh0bXAxLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHRtcDEsIHRtcDEsIDEpKTsKKworICBmaW5hbF8xID0gcGFkZChmaW5hbF8xLCBfbW0yNTZfYmxlbmRfcGQodG1wMCwgdG1wMSwgMHhDKSk7CisKKyAgX19tNTEyZCBmaW5hbF9vdXRwdXQgPSBfbW01MTJfaW5zZXJ0ZjY0eDQoZmluYWxfb3V0cHV0LCBmaW5hbF8wLCAwKTsKKworICByZXR1cm4gX21tNTEyX2luc2VydGY2NHg0KGZpbmFsX291dHB1dCwgZmluYWxfMSwgMSk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSkgeworICAvLyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyNpZiAwCisgIFBhY2tldDhmIGxhbmUwID0gX21tNTEyX2V4dHJhY3RmMzJ4OF9wcyhhLCAwKTsKKyAgUGFja2V0OGYgbGFuZTEgPSBfbW01MTJfZXh0cmFjdGYzMng4X3BzKGEsIDEpOworICBQYWNrZXQ4ZiBzdW0gPSBwYWRkKGxhbmUwLCBsYW5lMSk7CisgIFBhY2tldDhmIHRtcDAgPSBfbW0yNTZfaGFkZF9wcyhzdW0sIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoYSwgYSwgMSkpOworICB0bXAwID0gX21tMjU2X2hhZGRfcHModG1wMCwgdG1wMCk7CisgIHJldHVybiBwZmlyc3QoX21tMjU2X2hhZGRfcHModG1wMCwgdG1wMCkpOworI2Vsc2UKKyAgUGFja2V0NGYgbGFuZTAgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDApOworICBQYWNrZXQ0ZiBsYW5lMSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMSk7CisgIFBhY2tldDRmIGxhbmUyID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAyKTsKKyAgUGFja2V0NGYgbGFuZTMgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDMpOworICBQYWNrZXQ0ZiBzdW0gPSBwYWRkKHBhZGQobGFuZTAsIGxhbmUxKSwgcGFkZChsYW5lMiwgbGFuZTMpKTsKKyAgc3VtID0gX21tX2hhZGRfcHMoc3VtLCBzdW0pOworICBzdW0gPSBfbW1faGFkZF9wcyhzdW0sIF9tbV9wZXJtdXRlX3BzKHN1bSwgMSkpOworICByZXR1cm4gcGZpcnN0KHN1bSk7CisjZW5kaWYKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXg8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhKSB7CisgIFBhY2tldDRkIGxhbmUwID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAwKTsKKyAgUGFja2V0NGQgbGFuZTEgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDEpOworICBQYWNrZXQ0ZCBzdW0gPSBwYWRkKGxhbmUwLCBsYW5lMSk7CisgIFBhY2tldDRkIHRtcDAgPSBfbW0yNTZfaGFkZF9wZChzdW0sIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoc3VtLCBzdW0sIDEpKTsKKyAgcmV0dXJuIHBmaXJzdChfbW0yNTZfaGFkZF9wZCh0bXAwLCB0bXAwKSk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHByZWR1eF9kb3dudG80PFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBhKSB7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMkRRCisgIFBhY2tldDhmIGxhbmUwID0gX21tNTEyX2V4dHJhY3RmMzJ4OF9wcyhhLCAwKTsKKyAgUGFja2V0OGYgbGFuZTEgPSBfbW01MTJfZXh0cmFjdGYzMng4X3BzKGEsIDEpOworICByZXR1cm4gcGFkZChsYW5lMCwgbGFuZTEpOworI2Vsc2UKKyAgUGFja2V0NGYgbGFuZTAgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDApOworICBQYWNrZXQ0ZiBsYW5lMSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMSk7CisgIFBhY2tldDRmIGxhbmUyID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAyKTsKKyAgUGFja2V0NGYgbGFuZTMgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDMpOworICBQYWNrZXQ0ZiBzdW0wID0gcGFkZChsYW5lMCwgbGFuZTIpOworICBQYWNrZXQ0ZiBzdW0xID0gcGFkZChsYW5lMSwgbGFuZTMpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfcHMoX21tMjU2X2Nhc3RwczEyOF9wczI1NihzdW0wKSwgc3VtMSwgMSk7CisjZW5kaWYKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRkIHByZWR1eF9kb3dudG80PFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSkgeworICBQYWNrZXQ0ZCBsYW5lMCA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMCk7CisgIFBhY2tldDRkIGxhbmUxID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAxKTsKKyAgUGFja2V0NGQgcmVzID0gcGFkZChsYW5lMCwgbGFuZTEpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbXVsPFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZmJiBhKSB7CisvLyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYNTEyRFEKKyNpZiAwCisgIFBhY2tldDhmIGxhbmUwID0gX21tNTEyX2V4dHJhY3RmMzJ4OF9wcyhhLCAwKTsKKyAgUGFja2V0OGYgbGFuZTEgPSBfbW01MTJfZXh0cmFjdGYzMng4X3BzKGEsIDEpOworICBQYWNrZXQ4ZiByZXMgPSBwbXVsKGxhbmUwLCBsYW5lMSk7CisgIHJlcyA9IHBtdWwocmVzLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKHJlcywgcmVzLCAxKSk7CisgIHJlcyA9IHBtdWwocmVzLCBfbW1fcGVybXV0ZV9wcyhyZXMsIF9NTV9TSFVGRkxFKDAsIDAsIDMsIDIpKSk7CisgIHJldHVybiBwZmlyc3QocG11bChyZXMsIF9tbV9wZXJtdXRlX3BzKHJlcywgX01NX1NIVUZGTEUoMCwgMCwgMCwgMSkpKSk7CisjZWxzZQorICBQYWNrZXQ0ZiBsYW5lMCA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMCk7CisgIFBhY2tldDRmIGxhbmUxID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAxKTsKKyAgUGFja2V0NGYgbGFuZTIgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDIpOworICBQYWNrZXQ0ZiBsYW5lMyA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMyk7CisgIFBhY2tldDRmIHJlcyA9IHBtdWwocG11bChsYW5lMCwgbGFuZTEpLCBwbXVsKGxhbmUyLCBsYW5lMykpOworICByZXMgPSBwbXVsKHJlcywgX21tX3Blcm11dGVfcHMocmVzLCBfTU1fU0hVRkZMRSgwLCAwLCAzLCAyKSkpOworICByZXR1cm4gcGZpcnN0KHBtdWwocmVzLCBfbW1fcGVybXV0ZV9wcyhyZXMsIF9NTV9TSFVGRkxFKDAsIDAsIDAsIDEpKSkpOworI2VuZGlmCit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X211bDxQYWNrZXQ4ZD4oY29uc3QgUGFja2V0OGQmIGEpIHsKKyAgUGFja2V0NGQgbGFuZTAgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDApOworICBQYWNrZXQ0ZCBsYW5lMSA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMSk7CisgIFBhY2tldDRkIHJlcyA9IHBtdWwobGFuZTAsIGxhbmUxKTsKKyAgcmVzID0gcG11bChyZXMsIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQocmVzLCByZXMsIDEpKTsKKyAgcmV0dXJuIHBmaXJzdChwbXVsKHJlcywgX21tMjU2X3NodWZmbGVfcGQocmVzLCByZXMsIDEpKSk7Cit9CisKK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0MTZmPihjb25zdCBQYWNrZXQxNmYmIGEpIHsKKyAgUGFja2V0NGYgbGFuZTAgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDApOworICBQYWNrZXQ0ZiBsYW5lMSA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMSk7CisgIFBhY2tldDRmIGxhbmUyID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAyKTsKKyAgUGFja2V0NGYgbGFuZTMgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDMpOworICBQYWNrZXQ0ZiByZXMgPSBfbW1fbWluX3BzKF9tbV9taW5fcHMobGFuZTAsIGxhbmUxKSwgX21tX21pbl9wcyhsYW5lMiwgbGFuZTMpKTsKKyAgcmVzID0gX21tX21pbl9wcyhyZXMsIF9tbV9wZXJtdXRlX3BzKHJlcywgX01NX1NIVUZGTEUoMCwgMCwgMywgMikpKTsKKyAgcmV0dXJuIHBmaXJzdChfbW1fbWluX3BzKHJlcywgX21tX3Blcm11dGVfcHMocmVzLCBfTU1fU0hVRkZMRSgwLCAwLCAwLCAxKSkpKTsKK30KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXhfbWluPFBhY2tldDhkPihjb25zdCBQYWNrZXQ4ZCYgYSkgeworICBQYWNrZXQ0ZCBsYW5lMCA9IF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoYSwgMCk7CisgIFBhY2tldDRkIGxhbmUxID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAxKTsKKyAgUGFja2V0NGQgcmVzID0gX21tMjU2X21pbl9wZChsYW5lMCwgbGFuZTEpOworICByZXMgPSBfbW0yNTZfbWluX3BkKHJlcywgX21tMjU2X3Blcm11dGUyZjEyOF9wZChyZXMsIHJlcywgMSkpOworICByZXR1cm4gcGZpcnN0KF9tbTI1Nl9taW5fcGQocmVzLCBfbW0yNTZfc2h1ZmZsZV9wZChyZXMsIHJlcywgMSkpKTsKK30KKwordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X21heDxQYWNrZXQxNmY+KGNvbnN0IFBhY2tldDE2ZiYgYSkgeworICBQYWNrZXQ0ZiBsYW5lMCA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMCk7CisgIFBhY2tldDRmIGxhbmUxID0gX21tNTEyX2V4dHJhY3RmMzJ4NF9wcyhhLCAxKTsKKyAgUGFja2V0NGYgbGFuZTIgPSBfbW01MTJfZXh0cmFjdGYzMng0X3BzKGEsIDIpOworICBQYWNrZXQ0ZiBsYW5lMyA9IF9tbTUxMl9leHRyYWN0ZjMyeDRfcHMoYSwgMyk7CisgIFBhY2tldDRmIHJlcyA9IF9tbV9tYXhfcHMoX21tX21heF9wcyhsYW5lMCwgbGFuZTEpLCBfbW1fbWF4X3BzKGxhbmUyLCBsYW5lMykpOworICByZXMgPSBfbW1fbWF4X3BzKHJlcywgX21tX3Blcm11dGVfcHMocmVzLCBfTU1fU0hVRkZMRSgwLCAwLCAzLCAyKSkpOworICByZXR1cm4gcGZpcnN0KF9tbV9tYXhfcHMocmVzLCBfbW1fcGVybXV0ZV9wcyhyZXMsIF9NTV9TSFVGRkxFKDAsIDAsIDAsIDEpKSkpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tYXg8UGFja2V0OGQ+KGNvbnN0IFBhY2tldDhkJiBhKSB7CisgIFBhY2tldDRkIGxhbmUwID0gX21tNTEyX2V4dHJhY3RmNjR4NF9wZChhLCAwKTsKKyAgUGFja2V0NGQgbGFuZTEgPSBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKGEsIDEpOworICBQYWNrZXQ0ZCByZXMgPSBfbW0yNTZfbWF4X3BkKGxhbmUwLCBsYW5lMSk7CisgIHJlcyA9IF9tbTI1Nl9tYXhfcGQocmVzLCBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKHJlcywgcmVzLCAxKSk7CisgIHJldHVybiBwZmlyc3QoX21tMjU2X21heF9wZChyZXMsIF9tbTI1Nl9zaHVmZmxlX3BkKHJlcywgcmVzLCAxKSkpOworfQorCit0ZW1wbGF0ZSA8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsIFBhY2tldDE2Zj4geworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQxNmYmIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIHNlY29uZCkgeworICAgIGlmIChPZmZzZXQgIT0gMCkgeworICAgICAgX19tNTEyaSBmaXJzdF9pZHggPSBfbW01MTJfc2V0X2VwaTMyKAorICAgICAgICAgIE9mZnNldCArIDE1LCBPZmZzZXQgKyAxNCwgT2Zmc2V0ICsgMTMsIE9mZnNldCArIDEyLCBPZmZzZXQgKyAxMSwKKyAgICAgICAgICBPZmZzZXQgKyAxMCwgT2Zmc2V0ICsgOSwgT2Zmc2V0ICsgOCwgT2Zmc2V0ICsgNywgT2Zmc2V0ICsgNiwKKyAgICAgICAgICBPZmZzZXQgKyA1LCBPZmZzZXQgKyA0LCBPZmZzZXQgKyAzLCBPZmZzZXQgKyAyLCBPZmZzZXQgKyAxLCBPZmZzZXQpOworCisgICAgICBfX201MTJpIHNlY29uZF9pZHggPQorICAgICAgICAgIF9tbTUxMl9zZXRfZXBpMzIoT2Zmc2V0IC0gMSwgT2Zmc2V0IC0gMiwgT2Zmc2V0IC0gMywgT2Zmc2V0IC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCAtIDUsIE9mZnNldCAtIDYsIE9mZnNldCAtIDcsIE9mZnNldCAtIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgLSA5LCBPZmZzZXQgLSAxMCwgT2Zmc2V0IC0gMTEsIE9mZnNldCAtIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0IC0gMTMsIE9mZnNldCAtIDE0LCBPZmZzZXQgLSAxNSwgT2Zmc2V0IC0gMTYpOworCisgICAgICB1bnNpZ25lZCBzaG9ydCBtYXNrID0gMHhGRkZGOworICAgICAgbWFzayA8PD0gKDE2IC0gT2Zmc2V0KTsKKworICAgICAgZmlyc3QgPSBfbW01MTJfcGVybXV0ZXh2YXJfcHMoZmlyc3RfaWR4LCBmaXJzdCk7CisgICAgICBQYWNrZXQxNmYgdG1wID0gX21tNTEyX3Blcm11dGV4dmFyX3BzKHNlY29uZF9pZHgsIHNlY29uZCk7CisgICAgICBmaXJzdCA9IF9tbTUxMl9tYXNrX2JsZW5kX3BzKG1hc2ssIGZpcnN0LCB0bXApOworICAgIH0KKyAgfQorfTsKK3RlbXBsYXRlIDxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCwgUGFja2V0OGQ+IHsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0OGQmIGZpcnN0LCBjb25zdCBQYWNrZXQ4ZCYgc2Vjb25kKSB7CisgICAgaWYgKE9mZnNldCAhPSAwKSB7CisgICAgICBfX201MTJpIGZpcnN0X2lkeCA9IF9tbTUxMl9zZXRfZXBpMzIoCisgICAgICAgICAgMCwgT2Zmc2V0ICsgNywgMCwgT2Zmc2V0ICsgNiwgMCwgT2Zmc2V0ICsgNSwgMCwgT2Zmc2V0ICsgNCwgMCwKKyAgICAgICAgICBPZmZzZXQgKyAzLCAwLCBPZmZzZXQgKyAyLCAwLCBPZmZzZXQgKyAxLCAwLCBPZmZzZXQpOworCisgICAgICBfX201MTJpIHNlY29uZF9pZHggPSBfbW01MTJfc2V0X2VwaTMyKAorICAgICAgICAgIDAsIE9mZnNldCAtIDEsIDAsIE9mZnNldCAtIDIsIDAsIE9mZnNldCAtIDMsIDAsIE9mZnNldCAtIDQsIDAsCisgICAgICAgICAgT2Zmc2V0IC0gNSwgMCwgT2Zmc2V0IC0gNiwgMCwgT2Zmc2V0IC0gNywgMCwgT2Zmc2V0IC0gOCk7CisKKyAgICAgIHVuc2lnbmVkIGNoYXIgbWFzayA9IDB4RkY7CisgICAgICBtYXNrIDw8PSAoOCAtIE9mZnNldCk7CisKKyAgICAgIGZpcnN0ID0gX21tNTEyX3Blcm11dGV4dmFyX3BkKGZpcnN0X2lkeCwgZmlyc3QpOworICAgICAgUGFja2V0OGQgdG1wID0gX21tNTEyX3Blcm11dGV4dmFyX3BkKHNlY29uZF9pZHgsIHNlY29uZCk7CisgICAgICBmaXJzdCA9IF9tbTUxMl9tYXNrX2JsZW5kX3BkKG1hc2ssIGZpcnN0LCB0bXApOworICAgIH0KKyAgfQorfTsKKworCisjZGVmaW5lIFBBQ0tfT1VUUFVUKE9VVFBVVCwgSU5QVVQsIElOREVYLCBTVFJJREUpIFwKKyAgRUlHRU5fSU5TRVJUXzhmX0lOVE9fMTZmKE9VVFBVVFtJTkRFWF0sIElOUFVUW0lOREVYXSwgSU5QVVRbSU5ERVggKyBTVFJJREVdKTsKKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQxNmYsIDE2PiYga2VybmVsKSB7CisgIF9fbTUxMiBUMCA9IF9tbTUxMl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgX19tNTEyIFQxID0gX21tNTEyX3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX201MTIgVDIgPSBfbW01MTJfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSk7CisgIF9fbTUxMiBUMyA9IF9tbTUxMl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzJdLCBrZXJuZWwucGFja2V0WzNdKTsKKyAgX19tNTEyIFQ0ID0gX21tNTEyX3VucGFja2xvX3BzKGtlcm5lbC5wYWNrZXRbNF0sIGtlcm5lbC5wYWNrZXRbNV0pOworICBfX201MTIgVDUgPSBfbW01MTJfdW5wYWNraGlfcHMoa2VybmVsLnBhY2tldFs0XSwga2VybmVsLnBhY2tldFs1XSk7CisgIF9fbTUxMiBUNiA9IF9tbTUxMl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzZdLCBrZXJuZWwucGFja2V0WzddKTsKKyAgX19tNTEyIFQ3ID0gX21tNTEyX3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbNl0sIGtlcm5lbC5wYWNrZXRbN10pOworICBfX201MTIgVDggPSBfbW01MTJfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFs4XSwga2VybmVsLnBhY2tldFs5XSk7CisgIF9fbTUxMiBUOSA9IF9tbTUxMl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzhdLCBrZXJuZWwucGFja2V0WzldKTsKKyAgX19tNTEyIFQxMCA9IF9tbTUxMl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzEwXSwga2VybmVsLnBhY2tldFsxMV0pOworICBfX201MTIgVDExID0gX21tNTEyX3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbMTBdLCBrZXJuZWwucGFja2V0WzExXSk7CisgIF9fbTUxMiBUMTIgPSBfbW01MTJfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFsxMl0sIGtlcm5lbC5wYWNrZXRbMTNdKTsKKyAgX19tNTEyIFQxMyA9IF9tbTUxMl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzEyXSwga2VybmVsLnBhY2tldFsxM10pOworICBfX201MTIgVDE0ID0gX21tNTEyX3VucGFja2xvX3BzKGtlcm5lbC5wYWNrZXRbMTRdLCBrZXJuZWwucGFja2V0WzE1XSk7CisgIF9fbTUxMiBUMTUgPSBfbW01MTJfdW5wYWNraGlfcHMoa2VybmVsLnBhY2tldFsxNF0sIGtlcm5lbC5wYWNrZXRbMTVdKTsKKyAgX19tNTEyIFMwID0gX21tNTEyX3NodWZmbGVfcHMoVDAsIFQyLCBfTU1fU0hVRkZMRSgxLCAwLCAxLCAwKSk7CisgIF9fbTUxMiBTMSA9IF9tbTUxMl9zaHVmZmxlX3BzKFQwLCBUMiwgX01NX1NIVUZGTEUoMywgMiwgMywgMikpOworICBfX201MTIgUzIgPSBfbW01MTJfc2h1ZmZsZV9wcyhUMSwgVDMsIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKyAgX19tNTEyIFMzID0gX21tNTEyX3NodWZmbGVfcHMoVDEsIFQzLCBfTU1fU0hVRkZMRSgzLCAyLCAzLCAyKSk7CisgIF9fbTUxMiBTNCA9IF9tbTUxMl9zaHVmZmxlX3BzKFQ0LCBUNiwgX01NX1NIVUZGTEUoMSwgMCwgMSwgMCkpOworICBfX201MTIgUzUgPSBfbW01MTJfc2h1ZmZsZV9wcyhUNCwgVDYsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDIpKTsKKyAgX19tNTEyIFM2ID0gX21tNTEyX3NodWZmbGVfcHMoVDUsIFQ3LCBfTU1fU0hVRkZMRSgxLCAwLCAxLCAwKSk7CisgIF9fbTUxMiBTNyA9IF9tbTUxMl9zaHVmZmxlX3BzKFQ1LCBUNywgX01NX1NIVUZGTEUoMywgMiwgMywgMikpOworICBfX201MTIgUzggPSBfbW01MTJfc2h1ZmZsZV9wcyhUOCwgVDEwLCBfTU1fU0hVRkZMRSgxLCAwLCAxLCAwKSk7CisgIF9fbTUxMiBTOSA9IF9tbTUxMl9zaHVmZmxlX3BzKFQ4LCBUMTAsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDIpKTsKKyAgX19tNTEyIFMxMCA9IF9tbTUxMl9zaHVmZmxlX3BzKFQ5LCBUMTEsIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKyAgX19tNTEyIFMxMSA9IF9tbTUxMl9zaHVmZmxlX3BzKFQ5LCBUMTEsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDIpKTsKKyAgX19tNTEyIFMxMiA9IF9tbTUxMl9zaHVmZmxlX3BzKFQxMiwgVDE0LCBfTU1fU0hVRkZMRSgxLCAwLCAxLCAwKSk7CisgIF9fbTUxMiBTMTMgPSBfbW01MTJfc2h1ZmZsZV9wcyhUMTIsIFQxNCwgX01NX1NIVUZGTEUoMywgMiwgMywgMikpOworICBfX201MTIgUzE0ID0gX21tNTEyX3NodWZmbGVfcHMoVDEzLCBUMTUsIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKyAgX19tNTEyIFMxNSA9IF9tbTUxMl9zaHVmZmxlX3BzKFQxMywgVDE1LCBfTU1fU0hVRkZMRSgzLCAyLCAzLCAyKSk7CisKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTMCwgUzApOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFMxLCBTMSk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzIsIFMyKTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTMywgUzMpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFM0LCBTNCk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzUsIFM1KTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTNiwgUzYpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFM3LCBTNyk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzgsIFM4KTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTOSwgUzkpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFMxMCwgUzEwKTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTMTEsIFMxMSk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzEyLCBTMTIpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFMxMywgUzEzKTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTMTQsIFMxNCk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzE1LCBTMTUpOworCisgIFBhY2tldEJsb2NrPFBhY2tldDhmLCAzMj4gdG1wOworCisgIHRtcC5wYWNrZXRbMF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMwXzAsIFM0XzAsIDB4MjApOworICB0bXAucGFja2V0WzFdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMV8wLCBTNV8wLCAweDIwKTsKKyAgdG1wLnBhY2tldFsyXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzJfMCwgUzZfMCwgMHgyMCk7CisgIHRtcC5wYWNrZXRbM10gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMzXzAsIFM3XzAsIDB4MjApOworICB0bXAucGFja2V0WzRdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMF8wLCBTNF8wLCAweDMxKTsKKyAgdG1wLnBhY2tldFs1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzFfMCwgUzVfMCwgMHgzMSk7CisgIHRtcC5wYWNrZXRbNl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMyXzAsIFM2XzAsIDB4MzEpOworICB0bXAucGFja2V0WzddID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTM18wLCBTN18wLCAweDMxKTsKKworICB0bXAucGFja2V0WzhdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMF8xLCBTNF8xLCAweDIwKTsKKyAgdG1wLnBhY2tldFs5XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzFfMSwgUzVfMSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMTBdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMl8xLCBTNl8xLCAweDIwKTsKKyAgdG1wLnBhY2tldFsxMV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMzXzEsIFM3XzEsIDB4MjApOworICB0bXAucGFja2V0WzEyXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzBfMSwgUzRfMSwgMHgzMSk7CisgIHRtcC5wYWNrZXRbMTNdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMV8xLCBTNV8xLCAweDMxKTsKKyAgdG1wLnBhY2tldFsxNF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMyXzEsIFM2XzEsIDB4MzEpOworICB0bXAucGFja2V0WzE1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzNfMSwgUzdfMSwgMHgzMSk7CisKKyAgLy8gU2Vjb25kIHNldCBvZiBfbTI1NiBvdXRwdXRzCisgIHRtcC5wYWNrZXRbMTZdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTOF8wLCBTMTJfMCwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMTddID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTOV8wLCBTMTNfMCwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMThdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMTBfMCwgUzE0XzAsIDB4MjApOworICB0bXAucGFja2V0WzE5XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzExXzAsIFMxNV8wLCAweDIwKTsKKyAgdG1wLnBhY2tldFsyMF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFM4XzAsIFMxMl8wLCAweDMxKTsKKyAgdG1wLnBhY2tldFsyMV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFM5XzAsIFMxM18wLCAweDMxKTsKKyAgdG1wLnBhY2tldFsyMl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMxMF8wLCBTMTRfMCwgMHgzMSk7CisgIHRtcC5wYWNrZXRbMjNdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMTFfMCwgUzE1XzAsIDB4MzEpOworCisgIHRtcC5wYWNrZXRbMjRdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTOF8xLCBTMTJfMSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMjVdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTOV8xLCBTMTNfMSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMjZdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMTBfMSwgUzE0XzEsIDB4MjApOworICB0bXAucGFja2V0WzI3XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzExXzEsIFMxNV8xLCAweDIwKTsKKyAgdG1wLnBhY2tldFsyOF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFM4XzEsIFMxMl8xLCAweDMxKTsKKyAgdG1wLnBhY2tldFsyOV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFM5XzEsIFMxM18xLCAweDMxKTsKKyAgdG1wLnBhY2tldFszMF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMxMF8xLCBTMTRfMSwgMHgzMSk7CisgIHRtcC5wYWNrZXRbMzFdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMTFfMSwgUzE1XzEsIDB4MzEpOworCisgIC8vIFBhY2sgdGhlbSBpbnRvIHRoZSBvdXRwdXQKKyAgUEFDS19PVVRQVVQoa2VybmVsLnBhY2tldCwgdG1wLnBhY2tldCwgMCwgMTYpOworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxLCAxNik7CisgIFBBQ0tfT1VUUFVUKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDIsIDE2KTsKKyAgUEFDS19PVVRQVVQoa2VybmVsLnBhY2tldCwgdG1wLnBhY2tldCwgMywgMTYpOworCisgIFBBQ0tfT1VUUFVUKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDQsIDE2KTsKKyAgUEFDS19PVVRQVVQoa2VybmVsLnBhY2tldCwgdG1wLnBhY2tldCwgNSwgMTYpOworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCA2LCAxNik7CisgIFBBQ0tfT1VUUFVUKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDcsIDE2KTsKKworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCA4LCAxNik7CisgIFBBQ0tfT1VUUFVUKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDksIDE2KTsKKyAgUEFDS19PVVRQVVQoa2VybmVsLnBhY2tldCwgdG1wLnBhY2tldCwgMTAsIDE2KTsKKyAgUEFDS19PVVRQVVQoa2VybmVsLnBhY2tldCwgdG1wLnBhY2tldCwgMTEsIDE2KTsKKworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxMiwgMTYpOworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxMywgMTYpOworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxNCwgMTYpOworICBQQUNLX09VVFBVVChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxNSwgMTYpOworfQorI2RlZmluZSBQQUNLX09VVFBVVF8yKE9VVFBVVCwgSU5QVVQsIElOREVYLCBTVFJJREUpICAgICAgICAgXAorICBFSUdFTl9JTlNFUlRfOGZfSU5UT18xNmYoT1VUUFVUW0lOREVYXSwgSU5QVVRbMiAqIElOREVYXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5QVVRbMiAqIElOREVYICsgU1RSSURFXSk7CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHB0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0MTZmLCA0PiYga2VybmVsKSB7CisgIF9fbTUxMiBUMCA9IF9tbTUxMl91bnBhY2tsb19wcyhrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgX19tNTEyIFQxID0gX21tNTEyX3VucGFja2hpX3BzKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX201MTIgVDIgPSBfbW01MTJfdW5wYWNrbG9fcHMoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSk7CisgIF9fbTUxMiBUMyA9IF9tbTUxMl91bnBhY2toaV9wcyhrZXJuZWwucGFja2V0WzJdLCBrZXJuZWwucGFja2V0WzNdKTsKKworICBfX201MTIgUzAgPSBfbW01MTJfc2h1ZmZsZV9wcyhUMCwgVDIsIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKyAgX19tNTEyIFMxID0gX21tNTEyX3NodWZmbGVfcHMoVDAsIFQyLCBfTU1fU0hVRkZMRSgzLCAyLCAzLCAyKSk7CisgIF9fbTUxMiBTMiA9IF9tbTUxMl9zaHVmZmxlX3BzKFQxLCBUMywgX01NX1NIVUZGTEUoMSwgMCwgMSwgMCkpOworICBfX201MTIgUzMgPSBfbW01MTJfc2h1ZmZsZV9wcyhUMSwgVDMsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDIpKTsKKworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFMwLCBTMCk7CisgIEVJR0VOX0VYVFJBQ1RfOGZfRlJPTV8xNmYoUzEsIFMxKTsKKyAgRUlHRU5fRVhUUkFDVF84Zl9GUk9NXzE2ZihTMiwgUzIpOworICBFSUdFTl9FWFRSQUNUXzhmX0ZST01fMTZmKFMzLCBTMyk7CisKKyAgUGFja2V0QmxvY2s8UGFja2V0OGYsIDg+IHRtcDsKKworICB0bXAucGFja2V0WzBdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMF8wLCBTMV8wLCAweDIwKTsKKyAgdG1wLnBhY2tldFsxXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzJfMCwgUzNfMCwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMwXzAsIFMxXzAsIDB4MzEpOworICB0bXAucGFja2V0WzNdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMl8wLCBTM18wLCAweDMxKTsKKworICB0bXAucGFja2V0WzRdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMF8xLCBTMV8xLCAweDIwKTsKKyAgdG1wLnBhY2tldFs1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoUzJfMSwgUzNfMSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbNl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BzKFMwXzEsIFMxXzEsIDB4MzEpOworICB0bXAucGFja2V0WzddID0gX21tMjU2X3Blcm11dGUyZjEyOF9wcyhTMl8xLCBTM18xLCAweDMxKTsKKworICBQQUNLX09VVFBVVF8yKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDAsIDEpOworICBQQUNLX09VVFBVVF8yKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDEsIDEpOworICBQQUNLX09VVFBVVF8yKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDIsIDEpOworICBQQUNLX09VVFBVVF8yKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDMsIDEpOworfQorCisjZGVmaW5lIFBBQ0tfT1VUUFVUX1NRX0QoT1VUUFVULCBJTlBVVCwgSU5ERVgsIFNUUklERSkgICAgICAgICAgICAgICAgXAorICBPVVRQVVRbSU5ERVhdID0gX21tNTEyX2luc2VydGY2NHg0KE9VVFBVVFtJTkRFWF0sIElOUFVUW0lOREVYXSwgMCk7IFwKKyAgT1VUUFVUW0lOREVYXSA9IF9tbTUxMl9pbnNlcnRmNjR4NChPVVRQVVRbSU5ERVhdLCBJTlBVVFtJTkRFWCArIFNUUklERV0sIDEpOworCisjZGVmaW5lIFBBQ0tfT1VUUFVUX0QoT1VUUFVULCBJTlBVVCwgSU5ERVgsIFNUUklERSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPVVRQVVRbSU5ERVhdID0gX21tNTEyX2luc2VydGY2NHg0KE9VVFBVVFtJTkRFWF0sIElOUFVUWygyICogSU5ERVgpXSwgMCk7IFwKKyAgT1VUUFVUW0lOREVYXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfbW01MTJfaW5zZXJ0ZjY0eDQoT1VUUFVUW0lOREVYXSwgSU5QVVRbKDIgKiBJTkRFWCkgKyBTVFJJREVdLCAxKTsKKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ4ZCwgND4mIGtlcm5lbCkgeworICBfX201MTJkIFQwID0gX21tNTEyX3NodWZmbGVfcGQoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsxXSwgMCk7CisgIF9fbTUxMmQgVDEgPSBfbW01MTJfc2h1ZmZsZV9wZChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdLCAweGZmKTsKKyAgX19tNTEyZCBUMiA9IF9tbTUxMl9zaHVmZmxlX3BkKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10sIDApOworICBfX201MTJkIFQzID0gX21tNTEyX3NodWZmbGVfcGQoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSwgMHhmZik7CisKKyAgUGFja2V0QmxvY2s8UGFja2V0NGQsIDg+IHRtcDsKKworICB0bXAucGFja2V0WzBdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMiwgMCksIDB4MjApOworICB0bXAucGFja2V0WzFdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQxLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMywgMCksIDB4MjApOworICB0bXAucGFja2V0WzJdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMiwgMCksIDB4MzEpOworICB0bXAucGFja2V0WzNdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQxLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMywgMCksIDB4MzEpOworCisgIHRtcC5wYWNrZXRbNF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQyLCAxKSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbNV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQzLCAxKSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbNl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQyLCAxKSwgMHgzMSk7CisgIHRtcC5wYWNrZXRbN10gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQzLCAxKSwgMHgzMSk7CisKKyAgUEFDS19PVVRQVVRfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAwLCAxKTsKKyAgUEFDS19PVVRQVVRfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxLCAxKTsKKyAgUEFDS19PVVRQVVRfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAyLCAxKTsKKyAgUEFDS19PVVRQVVRfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAzLCAxKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ4ZCwgOD4mIGtlcm5lbCkgeworICBfX201MTJkIFQwID0gX21tNTEyX3VucGFja2xvX3BkKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX201MTJkIFQxID0gX21tNTEyX3VucGFja2hpX3BkKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX201MTJkIFQyID0gX21tNTEyX3VucGFja2xvX3BkKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10pOworICBfX201MTJkIFQzID0gX21tNTEyX3VucGFja2hpX3BkKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10pOworICBfX201MTJkIFQ0ID0gX21tNTEyX3VucGFja2xvX3BkKGtlcm5lbC5wYWNrZXRbNF0sIGtlcm5lbC5wYWNrZXRbNV0pOworICBfX201MTJkIFQ1ID0gX21tNTEyX3VucGFja2hpX3BkKGtlcm5lbC5wYWNrZXRbNF0sIGtlcm5lbC5wYWNrZXRbNV0pOworICBfX201MTJkIFQ2ID0gX21tNTEyX3VucGFja2xvX3BkKGtlcm5lbC5wYWNrZXRbNl0sIGtlcm5lbC5wYWNrZXRbN10pOworICBfX201MTJkIFQ3ID0gX21tNTEyX3VucGFja2hpX3BkKGtlcm5lbC5wYWNrZXRbNl0sIGtlcm5lbC5wYWNrZXRbN10pOworCisgIFBhY2tldEJsb2NrPFBhY2tldDRkLCAxNj4gdG1wOworCisgIHRtcC5wYWNrZXRbMF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQyLCAwKSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMV0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQzLCAwKSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMl0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQyLCAwKSwgMHgzMSk7CisgIHRtcC5wYWNrZXRbM10gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQzLCAwKSwgMHgzMSk7CisKKyAgdG1wLnBhY2tldFs0XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDIsIDEpLCAweDIwKTsKKyAgdG1wLnBhY2tldFs1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDMsIDEpLCAweDIwKTsKKyAgdG1wLnBhY2tldFs2XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDIsIDEpLCAweDMxKTsKKyAgdG1wLnBhY2tldFs3XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDMsIDEpLCAweDMxKTsKKworICB0bXAucGFja2V0WzhdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ0LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNiwgMCksIDB4MjApOworICB0bXAucGFja2V0WzldID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ1LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNywgMCksIDB4MjApOworICB0bXAucGFja2V0WzEwXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ2LCAwKSwgMHgzMSk7CisgIHRtcC5wYWNrZXRbMTFdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ1LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDcsIDApLCAweDMxKTsKKworICB0bXAucGFja2V0WzEyXSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ2LCAxKSwgMHgyMCk7CisgIHRtcC5wYWNrZXRbMTNdID0gX21tMjU2X3Blcm11dGUyZjEyOF9wZChfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ1LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDcsIDEpLCAweDIwKTsKKyAgdG1wLnBhY2tldFsxNF0gPSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKF9tbTUxMl9leHRyYWN0ZjY0eDRfcGQoVDQsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNiwgMSksIDB4MzEpOworICB0bXAucGFja2V0WzE1XSA9IF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoX21tNTEyX2V4dHJhY3RmNjR4NF9wZChUNSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW01MTJfZXh0cmFjdGY2NHg0X3BkKFQ3LCAxKSwgMHgzMSk7CisKKyAgUEFDS19PVVRQVVRfU1FfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAwLCA4KTsKKyAgUEFDS19PVVRQVVRfU1FfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAxLCA4KTsKKyAgUEFDS19PVVRQVVRfU1FfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAyLCA4KTsKKyAgUEFDS19PVVRQVVRfU1FfRChrZXJuZWwucGFja2V0LCB0bXAucGFja2V0LCAzLCA4KTsKKworICBQQUNLX09VVFBVVF9TUV9EKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDQsIDgpOworICBQQUNLX09VVFBVVF9TUV9EKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDUsIDgpOworICBQQUNLX09VVFBVVF9TUV9EKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDYsIDgpOworICBQQUNLX09VVFBVVF9TUV9EKGtlcm5lbC5wYWNrZXQsIHRtcC5wYWNrZXQsIDcsIDgpOworfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZmIHBibGVuZChjb25zdCBTZWxlY3RvcjwxNj4mIC8qaWZQYWNrZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWNrZXQxNmYmIC8qdGhlblBhY2tldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDE2ZiYgLyplbHNlUGFja2V0Ki8pIHsKKyAgYXNzZXJ0KGZhbHNlICYmICJUbyBiZSBpbXBsZW1lbnRlZCIpOworICByZXR1cm4gUGFja2V0MTZmKCk7Cit9Cit0ZW1wbGF0ZSA8PgorRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4ZCBwYmxlbmQoY29uc3QgU2VsZWN0b3I8OD4mIC8qaWZQYWNrZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDhkJiAvKnRoZW5QYWNrZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhY2tldDhkJiAvKmVsc2VQYWNrZXQqLykgeworICBhc3NlcnQoZmFsc2UgJiYgIlRvIGJlIGltcGxlbWVudGVkIik7CisgIHJldHVybiBQYWNrZXQ4ZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRVRfTUFUSF9BVlg1MTJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9BbHRpVmVjL0NvbXBsZXguaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9Db21wbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYjJmOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9Db21wbGV4LmgKQEAgLTAsMCArMSw0NjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTYgS29uc3RhbnRpbm9zIE1hcmdhcml0aXMgPG1hcmtvc0BmcmVldmVjLm9yZz4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09NUExFWDMyX0FMVElWRUNfSAorI2RlZmluZSBFSUdFTl9DT01QTEVYMzJfQUxUSVZFQ19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0YXRpYyBQYWNrZXQ0dWkgIHA0dWlfQ09OSl9YT1IgPSB2ZWNfbWVyZ2VoKChQYWNrZXQ0dWkpcDRpX1pFUk8sIChQYWNrZXQ0dWkpcDRmX01aRVJPKTsvL3sgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCB9OworI2lmZGVmIF9fVlNYX18KKyNpZiBkZWZpbmVkKF9CSUdfRU5ESUFOKQorc3RhdGljIFBhY2tldDJ1bCAgcDJ1bF9DT05KX1hPUjEgPSAoUGFja2V0MnVsKSB2ZWNfc2xkKChQYWNrZXQ0dWkpIHAyZF9NWkVSTywgKFBhY2tldDR1aSkgcDJsX1pFUk8sIDgpOy8veyAweDgwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCB9Oworc3RhdGljIFBhY2tldDJ1bCAgcDJ1bF9DT05KX1hPUjIgPSAoUGFja2V0MnVsKSB2ZWNfc2xkKChQYWNrZXQ0dWkpIHAybF9aRVJPLCAgKFBhY2tldDR1aSkgcDJkX01aRVJPLCA4KTsvL3sgMHg4MDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDAgfTsKKyNlbHNlCitzdGF0aWMgUGFja2V0MnVsICBwMnVsX0NPTkpfWE9SMSA9IChQYWNrZXQydWwpIHZlY19zbGQoKFBhY2tldDR1aSkgcDJsX1pFUk8sICAoUGFja2V0NHVpKSBwMmRfTVpFUk8sIDgpOy8veyAweDgwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCB9Oworc3RhdGljIFBhY2tldDJ1bCAgcDJ1bF9DT05KX1hPUjIgPSAoUGFja2V0MnVsKSB2ZWNfc2xkKChQYWNrZXQ0dWkpIHAyZF9NWkVSTywgKFBhY2tldDR1aSkgcDJsX1pFUk8sIDgpOy8veyAweDgwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCB9OworI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tIGZsb2F0IC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQyY2YKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBQYWNrZXQyY2YoKSA6IHYocDRmX1pFUk8pIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0MmNmKGNvbnN0IFBhY2tldDRmJiBhKSA6IHYoYSkge30KKyAgUGFja2V0NGYgIHY7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPiAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQyY2YgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQyY2YgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSAyLAorICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzRGl2ICAgID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0FicyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAwLAorICAgIEhhc01heCAgICA9IDAsCisjaWZkZWYgX19WU1hfXworICAgIEhhc0JsZW5kICA9IDEsCisjZW5kaWYKKyAgICBIYXNTZXRMaW5lYXIgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MmNmPiB7IHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiB0eXBlOyBlbnVtIHtzaXplPTIsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzZXQxPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgIGZyb20pCit7CisgIFBhY2tldDJjZiByZXM7CisgIGlmKChzdGQ6OnB0cmRpZmZfdCgmZnJvbSkgJSAxNikgPT0gMCkKKyAgICByZXMudiA9IHBsb2FkPFBhY2tldDRmPigoY29uc3QgZmxvYXQgKikmZnJvbSk7CisgIGVsc2UKKyAgICByZXMudiA9IHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0ICopJmZyb20pOworICByZXMudiA9IHZlY19wZXJtKHJlcy52LCByZXMudiwgcDE2dWNfUFNFVDY0X0hJKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZDxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qICAgICAgICBmcm9tKSB7IHJldHVybiBQYWNrZXQyY2YocGxvYWQ8UGFja2V0NGY+KChjb25zdCBmbG9hdCAqKSBmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWR1PFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogICAgICAgZnJvbSkgeyByZXR1cm4gUGFja2V0MmNmKHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0KikgZnJvbSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkZHVwPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogICAgIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDJjZj4oKmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgcHN0b3JlKChmbG9hdCopdG8sIGZyb20udik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgcHN0b3JldSgoZmxvYXQqKXRvLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDJjZiBwZ2F0aGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIGFmWzBdID0gZnJvbVswKnN0cmlkZV07CisgIGFmWzFdID0gZnJvbVsxKnN0cmlkZV07CisgIHJldHVybiBwbG9hZDxQYWNrZXQyY2Y+KGFmKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8c3RkOjpjb21wbGV4PGZsb2F0PiwgUGFja2V0MmNmPihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gRUlHRU5fQUxJR04xNiBhZlsyXTsKKyAgcHN0b3JlPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigoc3RkOjpjb21wbGV4PGZsb2F0PiAqKSBhZiwgZnJvbSk7CisgIHRvWzAqc3RyaWRlXSA9IGFmWzBdOworICB0b1sxKnN0cmlkZV0gPSBhZlsxXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYWRkPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihhLnYgKyBiLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzdWI8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKGEudiAtIGIudik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG5lZ2F0ZShjb25zdCBQYWNrZXQyY2YmIGEpIHsgcmV0dXJuIFBhY2tldDJjZihwbmVnYXRlKGEudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBjb25qKGNvbnN0IFBhY2tldDJjZiYgYSkgeyByZXR1cm4gUGFja2V0MmNmKHB4b3I8UGFja2V0NGY+KGEudiwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4ocDR1aV9DT05KX1hPUikpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWw8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgUGFja2V0NGYgdjEsIHYyOworCisgIC8vIFBlcm11dGUgYW5kIG11bHRpcGx5IHRoZSByZWFsIHBhcnRzIG9mIGEgYW5kIGIKKyAgdjEgPSB2ZWNfcGVybShhLnYsIGEudiwgcDE2dWNfUFNFVDMyX1dPREQpOworICAvLyBHZXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiBhCisgIHYyID0gdmVjX3Blcm0oYS52LCBhLnYsIHAxNnVjX1BTRVQzMl9XRVZFTik7CisgIC8vIG11bHRpcGx5IGFfcmUgKiBiIAorICB2MSA9IHZlY19tYWRkKHYxLCBiLnYsIHA0Zl9aRVJPKTsKKyAgLy8gbXVsdGlwbHkgYV9pbSAqIGIgYW5kIGdldCB0aGUgY29uanVnYXRlIHJlc3VsdAorICB2MiA9IHZlY19tYWRkKHYyLCBiLnYsIHA0Zl9aRVJPKTsKKyAgdjIgPSByZWludGVycHJldF9jYXN0PFBhY2tldDRmPihweG9yKHYyLCByZWludGVycHJldF9jYXN0PFBhY2tldDRmPihwNHVpX0NPTkpfWE9SKSkpOworICAvLyBwZXJtdXRlIGJhY2sgdG8gYSBwcm9wZXIgb3JkZXIKKyAgdjIgPSB2ZWNfcGVybSh2MiwgdjIsIHAxNnVjX0NPTVBMRVgzMl9SRVYpOworICAKKyAgcmV0dXJuIFBhY2tldDJjZihwYWRkPFBhY2tldDRmPih2MSwgdjIpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYW5kICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihwYW5kPFBhY2tldDRmPihhLnYsIGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBvciAgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBvcjxQYWNrZXQ0Zj4oYS52LCBiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBweG9yICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihweG9yPFBhY2tldDRmPihhLnYsIGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBhbmRub3Q8UGFja2V0NGY+KGEudiwgYi52KSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8c3RkOjpjb21wbGV4PGZsb2F0PiA+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4gKiBhZGRyKSAgICB7IEVJR0VOX1BQQ19QUkVGRVRDSChhZGRyKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiAgcGZpcnN0PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IEVJR0VOX0FMSUdOMTYgcmVzWzJdOworICBwc3RvcmUoKGZsb2F0ICopJnJlcywgYS52KTsKKworICByZXR1cm4gcmVzWzBdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHByZXZlcnNlKGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgUGFja2V0NGYgcmV2X2E7CisgIHJldl9hID0gdmVjX3Blcm0oYS52LCBhLnYsIHAxNnVjX0NPTVBMRVgzMl9SRVYyKTsKKyAgcmV0dXJuIFBhY2tldDJjZihyZXZfYSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgUGFja2V0NGYgYjsKKyAgYiA9IHZlY19zbGQoYS52LCBhLnYsIDgpOworICBiID0gcGFkZDxQYWNrZXQ0Zj4oYS52LCBiKTsKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQyY2Y+KFBhY2tldDJjZihiKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJlZHV4cDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiogdmVjcykKK3sKKyAgUGFja2V0NGYgYjEsIGIyOworI2lmZGVmIF9CSUdfRU5ESUFOICAKKyAgYjEgPSB2ZWNfc2xkKHZlY3NbMF0udiwgdmVjc1sxXS52LCA4KTsKKyAgYjIgPSB2ZWNfc2xkKHZlY3NbMV0udiwgdmVjc1swXS52LCA4KTsKKyNlbHNlCisgIGIxID0gdmVjX3NsZCh2ZWNzWzFdLnYsIHZlY3NbMF0udiwgOCk7CisgIGIyID0gdmVjX3NsZCh2ZWNzWzBdLnYsIHZlY3NbMV0udiwgOCk7CisjZW5kaWYKKyAgYjIgPSB2ZWNfc2xkKGIyLCBiMiwgOCk7CisgIGIyID0gcGFkZDxQYWNrZXQ0Zj4oYjEsIGIyKTsKKworICByZXR1cm4gUGFja2V0MmNmKGIyKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gcHJlZHV4X211bDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgUGFja2V0NGYgYjsKKyAgUGFja2V0MmNmIHByb2Q7CisgIGIgPSB2ZWNfc2xkKGEudiwgYS52LCA4KTsKKyAgcHJvZCA9IHBtdWw8UGFja2V0MmNmPihhLCBQYWNrZXQyY2YoYikpOworCisgIHJldHVybiBwZmlyc3Q8UGFja2V0MmNmPihwcm9kKTsKK30KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MmNmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQyY2YmIGZpcnN0LCBjb25zdCBQYWNrZXQyY2YmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQ9PTEpCisgICAgeworI2lmZGVmIF9CSUdfRU5ESUFOCisgICAgICBmaXJzdC52ID0gdmVjX3NsZChmaXJzdC52LCBzZWNvbmQudiwgOCk7CisjZWxzZQorICAgICAgZmlyc3QudiA9IHZlY19zbGQoc2Vjb25kLnYsIGZpcnN0LnYsIDgpOworI2VuZGlmCisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDRmLCBQYWNrZXQyY2YsIGZhbHNlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQ0ZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0NGYmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSkgY29uc3QKKyAgeyByZXR1cm4gUGFja2V0MmNmKGludGVybmFsOjpwbXVsPFBhY2tldDRmPih4LCB5LnYpKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQ0ZiwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0NGYmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDRmJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQyY2YoaW50ZXJuYWw6OnBtdWw8UGFja2V0NGY+KHgudiwgeSkpOyB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBkaXY8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgLy8gVE9ETyBvcHRpbWl6ZSBpdCBmb3IgQWx0aVZlYworICBQYWNrZXQyY2YgcmVzID0gY29ual9oZWxwZXI8UGFja2V0MmNmLFBhY2tldDJjZixmYWxzZSx0cnVlPigpLnBtdWwoYSwgYik7CisgIFBhY2tldDRmIHMgPSBwbXVsPFBhY2tldDRmPihiLnYsIGIudik7CisgIHJldHVybiBQYWNrZXQyY2YocGRpdihyZXMudiwgcGFkZDxQYWNrZXQ0Zj4ocywgdmVjX3Blcm0ocywgcywgcDE2dWNfQ09NUExFWDMyX1JFVikpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNwbHhmbGlwPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiB4KQoreworICByZXR1cm4gUGFja2V0MmNmKHZlY19wZXJtKHgudiwgeC52LCBwMTZ1Y19DT01QTEVYMzJfUkVWKSk7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDJjZiwyPiYga2VybmVsKQoreworICBQYWNrZXQ0ZiB0bXAgPSB2ZWNfcGVybShrZXJuZWwucGFja2V0WzBdLnYsIGtlcm5lbC5wYWNrZXRbMV0udiwgcDE2dWNfVFJBTlNQT1NFNjRfSEkpOworICBrZXJuZWwucGFja2V0WzFdLnYgPSB2ZWNfcGVybShrZXJuZWwucGFja2V0WzBdLnYsIGtlcm5lbC5wYWNrZXRbMV0udiwgcDE2dWNfVFJBTlNQT1NFNjRfTE8pOworICBrZXJuZWwucGFja2V0WzBdLnYgPSB0bXA7Cit9CisKKyNpZmRlZiBfX1ZTWF9fCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBibGVuZChjb25zdCBTZWxlY3RvcjwyPiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDJjZiYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0MmNmJiBlbHNlUGFja2V0KSB7CisgIFBhY2tldDJjZiByZXN1bHQ7CisgIHJlc3VsdC52ID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4ocGJsZW5kPFBhY2tldDJkPihpZlBhY2tldCwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odGhlblBhY2tldC52KSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oZWxzZVBhY2tldC52KSkpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLSBkb3VibGUgLS0tLS0tLS0tLQorI2lmZGVmIF9fVlNYX18KK3N0cnVjdCBQYWNrZXQxY2QKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDFjZChjb25zdCBQYWNrZXQyZCYgYSkgOiB2KGEpIHt9CisgIFBhY2tldDJkIHY7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MWNkIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMCwKKyAgICBzaXplID0gMSwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQxY2Q+IHsgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZG91YmxlPiB0eXBlOyBlbnVtIHtzaXplPTEsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDFjZCBoYWxmOyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkIDxQYWNrZXQxY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tKSB7IHJldHVybiBQYWNrZXQxY2QocGxvYWQ8UGFja2V0MmQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbG9hZHU8UGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSkgeyByZXR1cm4gUGFja2V0MWNkKHBsb2FkdTxQYWNrZXQyZD4oKGNvbnN0IGRvdWJsZSopZnJvbSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmUgPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oc3RkOjpjb21wbGV4PGRvdWJsZT4gKiAgIHRvLCBjb25zdCBQYWNrZXQxY2QmIGZyb20pIHsgcHN0b3JlKChkb3VibGUqKXRvLCBmcm9tLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oc3RkOjpjb21wbGV4PGRvdWJsZT4gKiAgIHRvLCBjb25zdCBQYWNrZXQxY2QmIGZyb20pIHsgcHN0b3JldSgoZG91YmxlKil0bywgZnJvbS52KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBzZXQxPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mICBmcm9tKQoreyAvKiBoZXJlIHdlIHJlYWxseSBoYXZlIHRvIHVzZSB1bmFsaWduZWQgbG9hZHMgOiggKi8gcmV0dXJuIHBsb2FkdTxQYWNrZXQxY2Q+KCZmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQxY2QgcGdhdGhlcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgUGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBFSUdFTl9BTElHTjE2IGFmWzJdOworICBhZlswXSA9IGZyb21bMCpzdHJpZGVdOworICBhZlsxXSA9IGZyb21bMSpzdHJpZGVdOworICByZXR1cm4gcGxvYWQ8UGFja2V0MWNkPihhZik7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBQYWNrZXQxY2Q+KHN0ZDo6Y29tcGxleDxkb3VibGU+KiB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHN0ZDo6Y29tcGxleDxkb3VibGU+IEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIHBzdG9yZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KGFmLCBmcm9tKTsKKyAgdG9bMCpzdHJpZGVdID0gYWZbMF07CisgIHRvWzEqc3RyaWRlXSA9IGFmWzFdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBhZGQ8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKGEudiArIGIudik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHN1YjxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoYS52IC0gYi52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbmVnYXRlKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gUGFja2V0MWNkKHBuZWdhdGUoUGFja2V0MmQoYS52KSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBjb25qKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gUGFja2V0MWNkKHB4b3IoYS52LCByZWludGVycHJldF9jYXN0PFBhY2tldDJkPihwMnVsX0NPTkpfWE9SMikpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWw8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgUGFja2V0MmQgYV9yZSwgYV9pbSwgdjEsIHYyOworCisgIC8vIFBlcm11dGUgYW5kIG11bHRpcGx5IHRoZSByZWFsIHBhcnRzIG9mIGEgYW5kIGIKKyAgYV9yZSA9IHZlY19wZXJtKGEudiwgYS52LCBwMTZ1Y19QU0VUNjRfSEkpOworICAvLyBHZXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiBhCisgIGFfaW0gPSB2ZWNfcGVybShhLnYsIGEudiwgcDE2dWNfUFNFVDY0X0xPKTsKKyAgLy8gbXVsdGlwbHkgYV9yZSAqIGIKKyAgdjEgPSB2ZWNfbWFkZChhX3JlLCBiLnYsIHAyZF9aRVJPKTsKKyAgLy8gbXVsdGlwbHkgYV9pbSAqIGIgYW5kIGdldCB0aGUgY29uanVnYXRlIHJlc3VsdAorICB2MiA9IHZlY19tYWRkKGFfaW0sIGIudiwgcDJkX1pFUk8pOworICB2MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHYyKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHYyKSwgOCkpOworICB2MiA9IHB4b3IodjIsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHAydWxfQ09OSl9YT1IxKSk7CisKKyAgcmV0dXJuIFBhY2tldDFjZChwYWRkPFBhY2tldDJkPih2MSwgdjIpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwYW5kICAgPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChwYW5kKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwb3IgICAgPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChwb3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHB4b3IgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKHB4b3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBhbmRub3Q8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKHBhbmRub3QoYS52LCBiLnYpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkZHVwPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qICAgICBmcm9tKSAgeyByZXR1cm4gcHNldDE8UGFja2V0MWNkPigqZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqIGFkZHIpICAgIHsgRUlHRU5fUFBDX1BSRUZFVENIKGFkZHIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiAgcGZpcnN0PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKQoreworICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBFSUdFTl9BTElHTjE2IHJlc1syXTsKKyAgcHN0b3JlPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4ocmVzLCBhKTsKKworICByZXR1cm4gcmVzWzBdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHByZXZlcnNlKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gYTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKSB7IHJldHVybiBwZmlyc3QoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHJlZHV4cDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCogdmVjcykgICAgICAgIHsgcmV0dXJuIHZlY3NbMF07IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxkb3VibGU+IHByZWR1eF9tdWw8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIHBmaXJzdChhKTsgfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQxY2Q+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDFjZCYgLypmaXJzdCovLCBjb25zdCBQYWNrZXQxY2QmIC8qc2Vjb25kKi8pCisgIHsKKyAgICAvLyBGSVhNRSBpcyBpdCBzdXJlIHdlIG5ldmVyIGhhdmUgdG8gYWxpZ24gYSBQYWNrZXQxY2Q/CisgICAgLy8gRXZlbiB0aG91Z2ggYSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBoYXMgMTYgYnl0ZXMsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSBhbGlnbmVkIG9uIGEgMTYgYnl0ZXMgYm91bmRhcnkuLi4KKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIGZhbHNlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChhLCBwY29uaihiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDFjZCwgUGFja2V0MWNkLCB0cnVlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbWFkZChjb25zdCBQYWNrZXQxY2QmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWwoY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwocGNvbmooYSksIGIpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDFjZCwgdHJ1ZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbWFkZChjb25zdCBQYWNrZXQxY2QmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWwoY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gcGNvbmooaW50ZXJuYWw6OnBtdWwoYSwgYikpOworICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmQsIFBhY2tldDFjZCwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDJkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQyZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQxY2QoaW50ZXJuYWw6OnBtdWw8UGFja2V0MmQ+KHgsIHkudikpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDJkLCBmYWxzZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQyZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MmQmIHkpIGNvbnN0CisgIHsgcmV0dXJuIFBhY2tldDFjZChpbnRlcm5hbDo6cG11bDxQYWNrZXQyZD4oeC52LCB5KSk7IH0KK307CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGRpdjxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKQoreworICAvLyBUT0RPIG9wdGltaXplIGl0IGZvciBBbHRpVmVjCisgIFBhY2tldDFjZCByZXMgPSBjb25qX2hlbHBlcjxQYWNrZXQxY2QsUGFja2V0MWNkLGZhbHNlLHRydWU+KCkucG11bChhLGIpOworICBQYWNrZXQyZCBzID0gcG11bDxQYWNrZXQyZD4oYi52LCBiLnYpOworICByZXR1cm4gUGFja2V0MWNkKHBkaXYocmVzLnYsIHBhZGQ8UGFja2V0MmQ+KHMsIHZlY19wZXJtKHMsIHMsIHAxNnVjX1JFVkVSU0U2NCkpKSk7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBjcGx4ZmxpcC8qPFBhY2tldDFjZD4qLyhjb25zdCBQYWNrZXQxY2QmIHgpCit7CisgIHJldHVybiBQYWNrZXQxY2QocHJldmVyc2UoUGFja2V0MmQoeC52KSkpOworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQxY2QsMj4mIGtlcm5lbCkKK3sKKyAgUGFja2V0MmQgdG1wID0gdmVjX3Blcm0oa2VybmVsLnBhY2tldFswXS52LCBrZXJuZWwucGFja2V0WzFdLnYsIHAxNnVjX1RSQU5TUE9TRTY0X0hJKTsKKyAga2VybmVsLnBhY2tldFsxXS52ID0gdmVjX3Blcm0oa2VybmVsLnBhY2tldFswXS52LCBrZXJuZWwucGFja2V0WzFdLnYsIHAxNnVjX1RSQU5TUE9TRTY0X0xPKTsKKyAga2VybmVsLnBhY2tldFswXS52ID0gdG1wOworfQorI2VuZGlmIC8vIF9fVlNYX18KK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBMRVgzMl9BTFRJVkVDX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTRiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvTWF0aEZ1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMzIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNyBKdWxpZW4gUG9tbWllcgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDE2IEtvbnN0YW50aW5vcyBNYXJnYXJpdGlzIDxtYXJrb3NAZnJlZXZlYy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiBUaGUgc2luLCBjb3MsIGV4cCwgYW5kIGxvZyBmdW5jdGlvbnMgb2YgdGhpcyBmaWxlIGNvbWUgZnJvbQorICogSnVsaWVuIFBvbW1pZXIncyBzc2UgbWF0aCBsaWJyYXJ5OiBodHRwOi8vZ3J1bnR0aGVwZW9uLmZyZWUuZnIvc3NlbWF0aC8KKyAqLworCisjaWZuZGVmIEVJR0VOX01BVEhfRlVOQ1RJT05TX0FMVElWRUNfSAorI2RlZmluZSBFSUdFTl9NQVRIX0ZVTkNUSU9OU19BTFRJVkVDX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKDEgLCAxLjBmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihoYWxmLCAwLjVmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgweDdmLCAweDdmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgyMywgMjMpOworCitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQoaW52X21hbnRfbWFzaywgfjB4N2Y4MDAwMDApOworCisvKiB0aGUgc21hbGxlc3Qgbm9uIGRlbm9ybWFsaXplZCBmbG9hdCBudW1iZXIgKi8KK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChtaW5fbm9ybV9wb3MsICAweDAwODAwMDAwKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChtaW51c19pbmYsICAgICAweGZmODAwMDAwKTsgLy8gLTEuZi8wLmYKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChtaW51c19uYW4sICAgICAweGZmZmZmZmZmKTsKKyAgCisvKiBuYXR1cmFsIGxvZ2FyaXRobSBjb21wdXRlZCBmb3IgNCBzaW11bHRhbmVvdXMgZmxvYXQKKyAgcmV0dXJuIE5hTiBmb3IgeCA8PSAwCisqLworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19TUVJUSEYsIDAuNzA3MTA2NzgxMTg2NTQ3NTI0Zik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wMCwgNy4wMzc2ODM2MjkyRS0yZik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wMSwgLSAxLjE1MTQ2MTAzMTBFLTFmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AyLCAxLjE2NzY5OTg3NDBFLTFmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AzLCAtIDEuMjQyMDE0MDg0NkUtMWYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19sb2dfcDQsICsgMS40MjQ5MzIyNzg3RS0xZik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNSwgLSAxLjY2NjgwNTc2NjVFLTFmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3A2LCArIDIuMDAwMDcxNDc2NUUtMWYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19sb2dfcDcsIC0gMi40OTk5OTkzOTkzRS0xZik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wOCwgKyAzLjMzMzMzMzExNzRFLTFmKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3ExLCAtMi4xMjE5NDQ0MGUtNGYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19sb2dfcTIsIDAuNjkzMzU5Mzc1Zik7CisKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihleHBfaGksICA4OC4zNzYyNjI2NjQ3OTUwZik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoZXhwX2xvLCAtODguMzc2MjYyNjY0Nzk0OWYpOworCitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX0xPRzJFRiwgMS40NDI2OTUwNDA4ODg5NjM0MWYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfQzEsIDAuNjkzMzU5Mzc1Zik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9DMiwgLTIuMTIxOTQ0NDBlLTRmKTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDAsIDEuOTg3NTY5MTUwMEUtNGYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDEsIDEuMzk4MTk5OTUwN0UtM2YpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDIsIDguMzMzNDUxOTA3M0UtM2YpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDMsIDQuMTY2NTc5NTg5NEUtMmYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDQsIDEuNjY2NjY2NTQ1OUUtMWYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDUsIDUuMDAwMDAwMTIwMUUtMWYpOworCisjaWZkZWYgX19WU1hfXworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKDEgLCAxLjApOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKDIgLCAyLjApOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGhhbGYsIDAuNSk7CisKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChleHBfaGksICA3MDkuNDM3KTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChleHBfbG8sIC03MDkuNDM2MTM5MzAzKTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19MT0cyRUYsIDEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OSk7CisKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3AwLCAxLjI2MTc3MTkzMDc0ODEwNTkwODc4ZS00KTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3AxLCAzLjAyOTk0NDA3NzA3NDQxOTYxMzAwZS0yKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3AyLCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTEwZS0xKTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcTAsIDMuMDAxOTg1MDUxMzg2NjQ0NTUwNDJlLTYpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcTEsIDIuNTI0NDgzNDAzNDk2ODQxMDQxOTJlLTMpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcTIsIDIuMjcyNjU1NDgyMDgxNTUwMjg3NjZlLTEpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcTMsIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDllMCk7CisKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX0MxLCAwLjY5MzE0NTc1MTk1MzEyNSk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9DMiwgMS40Mjg2MDY4MjAzMDk0MTcyMzIxMmUtNik7CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXworc3RhdGljIFBhY2tldDJsIHAybF8xMDIzID0geyAxMDIzLCAxMDIzIH07CitzdGF0aWMgUGFja2V0MnVsIHAydWxfNTIgPSB7IDUyLCA1MiB9OworI2VuZGlmCisKKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHBsb2c8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBfeCkKK3sKKyAgUGFja2V0NGYgeCA9IF94OworCisgIFBhY2tldDRpIGVtbTA7CisKKyAgLyogaXN2YWxpZF9tYXNrIGlzIDAgaWYgeCA8IDAgb3IgeCBpcyBOYU4uICovCisgIFBhY2tldDR1aSBpc3ZhbGlkX21hc2sgPSByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4odmVjX2NtcGdlKHgsIHA0Zl9aRVJPKSk7CisgIFBhY2tldDR1aSBpc3plcm9fbWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPih2ZWNfY21wZXEoeCwgcDRmX1pFUk8pKTsKKworICB4ID0gcG1heCh4LCBwNGZfbWluX25vcm1fcG9zKTsgIC8qIGN1dCBvZmYgZGVub3JtYWxpemVkIHN0dWZmICovCisgIGVtbTAgPSB2ZWNfc3IocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oeCksCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHA0aV8yMykpOworCisgIC8qIGtlZXAgb25seSB0aGUgZnJhY3Rpb25hbCBwYXJ0ICovCisgIHggPSBwYW5kKHgsIHA0Zl9pbnZfbWFudF9tYXNrKTsKKyAgeCA9IHBvcih4LCBwNGZfaGFsZik7CisKKyAgZW1tMCA9IHBzdWIoZW1tMCwgcDRpXzB4N2YpOworICBQYWNrZXQ0ZiBlID0gcGFkZCh2ZWNfY3RmKGVtbTAsIDApLCBwNGZfMSk7CisKKyAgLyogcGFydDI6CisgICAgIGlmKCB4IDwgU1FSVEhGICkgeworICAgICAgIGUgLT0gMTsKKyAgICAgICB4ID0geCArIHggLSAxLjA7CisgICAgIH0gZWxzZSB7IHggPSB4IC0gMS4wOyB9CisgICovCisgIFBhY2tldDRmIG1hc2sgPSByZWludGVycHJldF9jYXN0PFBhY2tldDRmPih2ZWNfY21wbHQoeCwgcDRmX2NlcGhlc19TUVJUSEYpKTsKKyAgUGFja2V0NGYgdG1wID0gcGFuZCh4LCBtYXNrKTsKKyAgeCA9IHBzdWIoeCwgcDRmXzEpOworICBlID0gcHN1YihlLCBwYW5kKHA0Zl8xLCBtYXNrKSk7CisgIHggPSBwYWRkKHgsIHRtcCk7CisKKyAgUGFja2V0NGYgeDIgPSBwbXVsKHgseCk7CisgIFBhY2tldDRmIHgzID0gcG11bCh4Mix4KTsKKworICBQYWNrZXQ0ZiB5LCB5MSwgeTI7CisgIHkgID0gcG1hZGQocDRmX2NlcGhlc19sb2dfcDAsIHgsIHA0Zl9jZXBoZXNfbG9nX3AxKTsKKyAgeTEgPSBwbWFkZChwNGZfY2VwaGVzX2xvZ19wMywgeCwgcDRmX2NlcGhlc19sb2dfcDQpOworICB5MiA9IHBtYWRkKHA0Zl9jZXBoZXNfbG9nX3A2LCB4LCBwNGZfY2VwaGVzX2xvZ19wNyk7CisgIHkgID0gcG1hZGQoeSAsIHgsIHA0Zl9jZXBoZXNfbG9nX3AyKTsKKyAgeTEgPSBwbWFkZCh5MSwgeCwgcDRmX2NlcGhlc19sb2dfcDUpOworICB5MiA9IHBtYWRkKHkyLCB4LCBwNGZfY2VwaGVzX2xvZ19wOCk7CisgIHkgPSBwbWFkZCh5LCB4MywgeTEpOworICB5ID0gcG1hZGQoeSwgeDMsIHkyKTsKKyAgeSA9IHBtdWwoeSwgeDMpOworCisgIHkxID0gcG11bChlLCBwNGZfY2VwaGVzX2xvZ19xMSk7CisgIHRtcCA9IHBtdWwoeDIsIHA0Zl9oYWxmKTsKKyAgeSA9IHBhZGQoeSwgeTEpOworICB4ID0gcHN1Yih4LCB0bXApOworICB5MiA9IHBtdWwoZSwgcDRmX2NlcGhlc19sb2dfcTIpOworICB4ID0gcGFkZCh4LCB5KTsKKyAgeCA9IHBhZGQoeCwgeTIpOworICAvLyBuZWdhdGl2ZSBhcmcgd2lsbCBiZSBOQU4sIDAgd2lsbCBiZSAtSU5GCisgIHggPSB2ZWNfc2VsKHgsIHA0Zl9taW51c19pbmYsIGlzemVyb19tYXNrKTsKKyAgeCA9IHZlY19zZWwocDRmX21pbnVzX25hbiwgeCwgaXN2YWxpZF9tYXNrKTsKKyAgcmV0dXJuIHg7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcGV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiB4ID0gX3g7CisKKyAgUGFja2V0NGYgdG1wLCBmeDsKKyAgUGFja2V0NGkgZW1tMDsKKworICAvLyBjbGFtcCB4CisgIHggPSBwbWF4KHBtaW4oeCwgcDRmX2V4cF9oaSksIHA0Zl9leHBfbG8pOworCisgIC8vIGV4cHJlc3MgZXhwKHgpIGFzIGV4cChnICsgbipsb2coMikpCisgIGZ4ID0gcG1hZGQoeCwgcDRmX2NlcGhlc19MT0cyRUYsIHA0Zl9oYWxmKTsKKworICBmeCA9IHBmbG9vcihmeCk7CisKKyAgdG1wID0gcG11bChmeCwgcDRmX2NlcGhlc19leHBfQzEpOworICBQYWNrZXQ0ZiB6ID0gcG11bChmeCwgcDRmX2NlcGhlc19leHBfQzIpOworICB4ID0gcHN1Yih4LCB0bXApOworICB4ID0gcHN1Yih4LCB6KTsKKworICB6ID0gcG11bCh4LHgpOworCisgIFBhY2tldDRmIHkgPSBwNGZfY2VwaGVzX2V4cF9wMDsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AxKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AyKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AzKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3A0KTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3A1KTsKKyAgeSA9IHBtYWRkKHksIHosIHgpOworICB5ID0gcGFkZCh5LCBwNGZfMSk7CisKKyAgLy8gYnVpbGQgMl5uCisgIGVtbTAgPSB2ZWNfY3RzKGZ4LCAwKTsKKyAgZW1tMCA9IHZlY19hZGQoZW1tMCwgcDRpXzB4N2YpOworICBlbW0wID0gdmVjX3NsKGVtbTAsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPihwNGlfMjMpKTsKKworICAvLyBBbHRpdmVjJ3MgbWF4ICYgbWluIG9wZXJhdG9ycyBqdXN0IGRyb3Agc2lsZW50IE5hTnMuIENoZWNrIE5hTnMgaW4gCisgIC8vIGlucHV0cyBhbmQgcmV0dXJuIHRoZW0gdW5tb2RpZmllZC4KKyAgUGFja2V0NHVpIGlzbnVtYmVyX21hc2sgPSByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4odmVjX2NtcGVxKF94LCBfeCkpOworICByZXR1cm4gdmVjX3NlbChfeCwgcG1heChwbXVsKHksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KGVtbTApKSwgX3gpLAorICAgICAgICAgICAgICAgICBpc251bWJlcl9tYXNrKTsKK30KKworI2lmbmRlZiBFSUdFTl9DT01QX0NMQU5HCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHByc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIHgpCit7CisgIHJldHVybiAgdmVjX3JzcXJ0KHgpOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1ZTWF9fCisjaWZuZGVmIEVJR0VOX0NPTVBfQ0xBTkcKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0MmQgcHJzcXJ0PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgeCkKK3sKKyAgcmV0dXJuICB2ZWNfcnNxcnQoeCk7Cit9CisjZW5kaWYKKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIHgpCit7CisgIHJldHVybiAgdmVjX3NxcnQoeCk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0MmQgcHNxcnQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiB4KQoreworICByZXR1cm4gIHZlY19zcXJ0KHgpOworfQorCisvLyBWU1ggc3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQgY29tcGlsZXJzIGFuZCBldmVuIGRpZmZlcmVudAorLy8gdmVyc2lvbnMgb2YgdGhlIHNhbWUgY29tcGlsZXIuICBGb3IgZ2NjIHZlcnNpb24gPj0gNC45LjMsIHdlIGNhbiB1c2UKKy8vIHZlY19jdHMgdG8gZWZmaWNpZW50bHkgY29udmVydCBQYWNrZXQyZCB0byBQYWNrZXQybC4gIE90aGVyd2lzZSwgdXNlCisvLyBhIHNsb3cgdmVyc2lvbiB0aGF0IHdvcmtzIHdpdGggb2xkZXIgY29tcGlsZXJzLiAKKy8vIFVwZGF0ZTogYXBwYXJlbnRseSB2ZWNfY3RzL3ZlY19jdGYgaW50cmluc2ljcyBmb3IgNjQtYml0IGRvdWJsZXMKKy8vIGFyZSBidWdneSwgaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NzA5NjMKK3N0YXRpYyBpbmxpbmUgUGFja2V0MmwgQ29udmVydFRvUGFja2V0MmwoY29uc3QgUGFja2V0MmQmIHgpIHsKKyNpZiBFSUdFTl9HTlVDX0FUX0xFQVNUKDUsIDQpIHx8IFwKKyAgICAoRUlHRU5fR05VQ19BVCg2LCAxKSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fID49IDEpCisgIHJldHVybiB2ZWNfY3RzKHgsIDApOyAgICAvLyBUT0RPOiBjaGVjayBjbGFuZyB2ZXJzaW9uLgorI2Vsc2UKKyAgZG91YmxlIHRtcFsyXTsKKyAgbWVtY3B5KHRtcCwgJngsIHNpemVvZih0bXApKTsKKyAgUGFja2V0MmwgbCA9IHsgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0bXBbMF0pLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRtcFsxXSkgfTsKKyAgcmV0dXJuIGw7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQyZCBwZXhwPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgX3gpCit7CisgIFBhY2tldDJkIHggPSBfeDsKKworICBQYWNrZXQyZCB0bXAsIGZ4OworICBQYWNrZXQybCBlbW0wOworCisgIC8vIGNsYW1wIHgKKyAgeCA9IHBtYXgocG1pbih4LCBwMmRfZXhwX2hpKSwgcDJkX2V4cF9sbyk7CisKKyAgLyogZXhwcmVzcyBleHAoeCkgYXMgZXhwKGcgKyBuKmxvZygyKSkgKi8KKyAgZnggPSBwbWFkZCh4LCBwMmRfY2VwaGVzX0xPRzJFRiwgcDJkX2hhbGYpOworCisgIGZ4ID0gcGZsb29yKGZ4KTsKKworICB0bXAgPSBwbXVsKGZ4LCBwMmRfY2VwaGVzX2V4cF9DMSk7CisgIFBhY2tldDJkIHogPSBwbXVsKGZ4LCBwMmRfY2VwaGVzX2V4cF9DMik7CisgIHggPSBwc3ViKHgsIHRtcCk7CisgIHggPSBwc3ViKHgsIHopOworCisgIFBhY2tldDJkIHgyID0gcG11bCh4LHgpOworCisgIFBhY2tldDJkIHB4ID0gcDJkX2NlcGhlc19leHBfcDA7CisgIHB4ID0gcG1hZGQocHgsIHgyLCBwMmRfY2VwaGVzX2V4cF9wMSk7CisgIHB4ID0gcG1hZGQocHgsIHgyLCBwMmRfY2VwaGVzX2V4cF9wMik7CisgIHB4ID0gcG11bCAocHgsIHgpOworCisgIFBhY2tldDJkIHF4ID0gcDJkX2NlcGhlc19leHBfcTA7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwMmRfY2VwaGVzX2V4cF9xMSk7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwMmRfY2VwaGVzX2V4cF9xMik7CisgIHF4ID0gcG1hZGQocXgsIHgyLCBwMmRfY2VwaGVzX2V4cF9xMyk7CisKKyAgeCA9IHBkaXYocHgscHN1YihxeCxweCkpOworICB4ID0gcG1hZGQocDJkXzIseCxwMmRfMSk7CisKKyAgLy8gYnVpbGQgMl5uCisgIGVtbTAgPSBDb252ZXJ0VG9QYWNrZXQybChmeCk7CisKKyNpZmRlZiBfX1BPV0VSOF9WRUNUT1JfXyAKKyAgZW1tMCA9IHZlY19hZGQoZW1tMCwgcDJsXzEwMjMpOworICBlbW0wID0gdmVjX3NsKGVtbTAsIHAydWxfNTIpOworI2Vsc2UKKyAgLy8gQ29kZSBpcyBhIGJpdCBjb21wbGV4IGZvciBQT1dFUjcuICBUaGVyZSBpcyBhY3R1YWxseSBhCisgIC8vIHZlY194eHNsZGkgaW50cmluc2ljIGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHNvbWUgZ2NjIHZlcnNpb25zLgorICAvLyBTbyB3ZSBzaGlmdCAoNTItMzIpIGJpdHMgYW5kIGRvIGEgd29yZCBzd2FwIHdpdGggemVyb3MuCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDEwMjMsIDEwMjMpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgyMCwgMjApOyAgICAvLyA1MiAtIDMyCisKKyAgUGFja2V0NGkgZW1tMDRpID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oZW1tMCk7CisgIGVtbTA0aSA9IHZlY19hZGQoZW1tMDRpLCBwNGlfMTAyMyk7CisgIGVtbTA0aSA9IHZlY19zbChlbW0wNGksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPihwNGlfMjApKTsKKyAgc3RhdGljIGNvbnN0IFBhY2tldDE2dWMgcGVybSA9IHsKKyAgICAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAKKyAgICAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDA4LCAweDA5LCAweDBhLCAweDBiIH07CisjaWZkZWYgIF9CSUdfRU5ESUFOCisgIGVtbTAgPSByZWludGVycHJldF9jYXN0PFBhY2tldDJsPih2ZWNfcGVybShwNGlfWkVSTywgZW1tMDRpLCBwZXJtKSk7CisjZWxzZQorICBlbW0wID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQybD4odmVjX3Blcm0oZW1tMDRpLCBwNGlfWkVSTywgcGVybSkpOworI2VuZGlmCisKKyNlbmRpZgorCisgIC8vIEFsdGl2ZWMncyBtYXggJiBtaW4gb3BlcmF0b3JzIGp1c3QgZHJvcCBzaWxlbnQgTmFOcy4gQ2hlY2sgTmFOcyBpbiAKKyAgLy8gaW5wdXRzIGFuZCByZXR1cm4gdGhlbSB1bm1vZGlmaWVkLgorICBQYWNrZXQydWwgaXNudW1iZXJfbWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MnVsPih2ZWNfY21wZXEoX3gsIF94KSk7CisgIHJldHVybiB2ZWNfc2VsKF94LCBwbWF4KHBtdWwoeCwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oZW1tMCkpLCBfeCksCisgICAgICAgICAgICAgICAgIGlzbnVtYmVyX21hc2spOworfQorI2VuZGlmCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX01BVEhfRlVOQ1RJT05TX0FMVElWRUNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9BbHRpVmVjL1BhY2tldE1hdGguaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9QYWNrZXRNYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjNmMWVhMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9QYWNrZXRNYXRoLmgKQEAgLTAsMCArMSwxMDMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE2IEtvbnN0YW50aW5vcyBNYXJnYXJpdGlzIDxtYXJrb3NAZnJlZXZlYy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBQ0tFVF9NQVRIX0FMVElWRUNfSAorI2RlZmluZSBFSUdFTl9QQUNLRVRfTUFUSF9BTFRJVkVDX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xECisjZGVmaW5lIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQgNAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9NQURECisjZGVmaW5lIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9DSk1BREQKKyNkZWZpbmUgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9DSk1BREQKKyNlbmRpZgorCisvLyBOT1RFIEFsdGl2ZWMgaGFzIDMyIHJlZ2lzdGVycywgYnV0IEVpZ2VuIG9ubHkgYWNjZXB0cyBhIHZhbHVlIG9mIDggb3IgMTYKKyNpZm5kZWYgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMKKyNkZWZpbmUgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMgIDMyCisjZW5kaWYKKwordHlwZWRlZiBfX3ZlY3RvciBmbG9hdCAgICAgICAgICBQYWNrZXQ0ZjsKK3R5cGVkZWYgX192ZWN0b3IgaW50ICAgICAgICAgICAgUGFja2V0NGk7Cit0eXBlZGVmIF9fdmVjdG9yIHVuc2lnbmVkIGludCAgIFBhY2tldDR1aTsKK3R5cGVkZWYgX192ZWN0b3IgX19ib29sIGludCAgICAgUGFja2V0NGJpOwordHlwZWRlZiBfX3ZlY3RvciBzaG9ydCBpbnQgICAgICBQYWNrZXQ4aTsKK3R5cGVkZWYgX192ZWN0b3IgdW5zaWduZWQgY2hhciAgUGFja2V0MTZ1YzsKKworLy8gV2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgc2FtZSBjb2RlIGFsbCB0aGUgdGltZSwgYnV0IHdlIG5lZWQgdG8gcmV1c2UgdGhlIGNvbnN0YW50cworLy8gYW5kIGl0IGRvZXNuJ3QgcmVhbGx5IHdvcmsgdG8gZGVjbGFyZSB0aGVtIGdsb2JhbCwgc28gd2UgZGVmaW5lIG1hY3JvcyBpbnN0ZWFkCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0ZihOQU1FLFgpIFwKKyAgUGFja2V0NGYgcDRmXyMjTkFNRSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KHZlY19zcGxhdF9zMzIoWCkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShOQU1FLFgpIFwKKyAgUGFja2V0NGkgcDRpXyMjTkFNRSA9IHZlY19zcGxhdF9zMzIoWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihOQU1FLFgpIFwKKyAgUGFja2V0NGYgcDRmXyMjTkFNRSA9IHBzZXQxPFBhY2tldDRmPihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKE5BTUUsWCkgXAorICBQYWNrZXQ0aSBwNGlfIyNOQU1FID0gcHNldDE8UGFja2V0NGk+KFgpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoTkFNRSxYKSBcCisgIFBhY2tldDJkIHAyZF8jI05BTUUgPSBwc2V0MTxQYWNrZXQyZD4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQybChOQU1FLFgpIFwKKyAgUGFja2V0MmwgcDJsXyMjTkFNRSA9IHBzZXQxPFBhY2tldDJsPihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0ZiBwNGZfIyNOQU1FID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4ocHNldDE8UGFja2V0NGk+KFgpKQorCisjZGVmaW5lIERTVF9DSEFOIDEKKyNkZWZpbmUgRFNUX0NUUkwoc2l6ZSwgY291bnQsIHN0cmlkZSkgKCgoc2l6ZSkgPDwgMjQpIHwgKChjb3VudCkgPDwgMTYpIHwgKHN0cmlkZSkpCisKKworLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBlbmRpYW4tYWdub3N0aWMKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDRmKFpFUk8sIDApOyAvL3sgMC4wLCAwLjAsIDAuMCwgMC4wfQorc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX0ZBU1RfUGFja2V0NGkoWkVSTywgMCk7IC8veyAwLCAwLCAwLCAwLH0KK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDRpKE9ORSwxKTsgLy97IDEsIDEsIDEsIDF9CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShNSU5VUzE2LC0xNik7IC8veyAtMTYsIC0xNiwgLTE2LCAtMTZ9CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShNSU5VUzEsLTEpOyAvL3sgLTEsIC0xLCAtMSwgLTF9CitzdGF0aWMgUGFja2V0NGYgcDRmX01aRVJPID0gKFBhY2tldDRmKSB2ZWNfc2woKFBhY2tldDR1aSlwNGlfTUlOVVMxLCAoUGFja2V0NHVpKXA0aV9NSU5VUzEpOyAvL3sgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMH0KKyNpZm5kZWYgX19WU1hfXworc3RhdGljIFBhY2tldDRmIHA0Zl9PTkUgPSB2ZWNfY3RmKHA0aV9PTkUsIDApOyAvL3sgMS4wLCAxLjAsIDEuMCwgMS4wfQorI2VuZGlmCisKK3N0YXRpYyBQYWNrZXQ0ZiBwNGZfQ09VTlRET1dOID0geyAwLjAsIDEuMCwgMi4wLCAzLjAgfTsKK3N0YXRpYyBQYWNrZXQ0aSBwNGlfQ09VTlRET1dOID0geyAwLCAxLCAyLCAzIH07CisKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX1JFVkVSU0UzMiA9IHsgMTIsMTMsMTQsMTUsIDgsOSwxMCwxMSwgNCw1LDYsNywgMCwxLDIsMyB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfRFVQTElDQVRFMzJfSEkgPSB7IDAsMSwyLDMsIDAsMSwyLDMsIDQsNSw2LDcsIDQsNSw2LDcgfTsKKworLy8gTWFzayBhbGlnbm1lbnQKKyNpZmRlZiBfX1BQQzY0X18KKyNkZWZpbmUgX0VJR0VOX01BU0tfQUxJR05NRU5UCTB4ZmZmZmZmZmZmZmZmZmZmMAorI2Vsc2UKKyNkZWZpbmUgX0VJR0VOX01BU0tfQUxJR05NRU5UCTB4ZmZmZmZmZjAKKyNlbmRpZgorCisjZGVmaW5lIF9FSUdFTl9BTElHTkVEX1BUUih4KQkoKHN0ZDo6cHRyZGlmZl90KSh4KSAmIF9FSUdFTl9NQVNLX0FMSUdOTUVOVCkKKworLy8gSGFuZGxlIGVuZGlhbm5lc3MgcHJvcGVybHkgd2hpbGUgbG9hZGluZyBjb25zdGFudHMKKy8vIERlZmluZSBnbG9iYWwgc3RhdGljIGNvbnN0YW50czoKKyNpZmRlZiBfQklHX0VORElBTgorc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfRk9SV0FSRCA9IHZlY19sdnNsKDAsIChmbG9hdCopMCk7CisjaWZkZWYgX19WU1hfXworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUkVWRVJTRTY0ID0geyA4LDksMTAsMTEsIDEyLDEzLDE0LDE1LCAwLDEsMiwzLCA0LDUsNiw3IH07CisjZW5kaWYKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX1BTRVQzMl9XT0REICAgPSB2ZWNfc2xkKChQYWNrZXQxNnVjKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAwKSwgKFBhY2tldDE2dWMpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDIpLCA4KTsvL3sgMCwxLDIsMywgMCwxLDIsMywgOCw5LDEwLDExLCA4LDksMTAsMTEgfTsKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX1BTRVQzMl9XRVZFTiAgPSB2ZWNfc2xkKHAxNnVjX0RVUExJQ0FURTMyX0hJLCAoUGFja2V0MTZ1YykgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMyksIDgpOy8veyA0LDUsNiw3LCA0LDUsNiw3LCAxMiwxMywxNCwxNSwgMTIsMTMsMTQsMTUgfTsKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0hBTEY2NF8wXzE2ID0gdmVjX3NsZCgoUGFja2V0MTZ1YylwNGlfWkVSTywgdmVjX3NwbGF0KChQYWNrZXQxNnVjKSB2ZWNfYWJzKHA0aV9NSU5VUzE2KSwgMyksIDgpOyAgICAgIC8veyAwLDAsMCwwLCAwLDAsMCwwLCAxNiwxNiwxNiwxNiwgMTYsMTYsMTYsMTZ9OworI2Vsc2UKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0ZPUldBUkQgPSBwMTZ1Y19SRVZFUlNFMzI7IAorc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUkVWRVJTRTY0ID0geyA4LDksMTAsMTEsIDEyLDEzLDE0LDE1LCAwLDEsMiwzLCA0LDUsNiw3IH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19QU0VUMzJfV09ERCA9IHZlY19zbGQoKFBhY2tldDE2dWMpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDEpLCAoUGFja2V0MTZ1YykgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMyksIDgpOy8veyAwLDEsMiwzLCAwLDEsMiwzLCA4LDksMTAsMTEsIDgsOSwxMCwxMSB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDMyX1dFVkVOID0gdmVjX3NsZCgoUGFja2V0MTZ1YykgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMCksIChQYWNrZXQxNnVjKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAyKSwgOCk7Ly97IDQsNSw2LDcsIDQsNSw2LDcsIDEyLDEzLDE0LDE1LCAxMiwxMywxNCwxNSB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfSEFMRjY0XzBfMTYgPSB2ZWNfc2xkKHZlY19zcGxhdCgoUGFja2V0MTZ1YykgdmVjX2FicyhwNGlfTUlOVVMxNiksIDApLCAoUGFja2V0MTZ1YylwNGlfWkVSTywgOCk7ICAgICAgLy97IDAsMCwwLDAsIDAsMCwwLDAsIDE2LDE2LDE2LDE2LCAxNiwxNiwxNiwxNn07CisjZW5kaWYgLy8gX0JJR19FTkRJQU4KKworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDY0X0hJID0gKFBhY2tldDE2dWMpIHZlY19tZXJnZWgoKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV09ERCwgKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV0VWRU4pOyAgICAgLy97IDAsMSwyLDMsIDQsNSw2LDcsIDAsMSwyLDMsIDQsNSw2LDcgfTsKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX1BTRVQ2NF9MTyA9IChQYWNrZXQxNnVjKSB2ZWNfbWVyZ2VsKChQYWNrZXQ0dWkpcDE2dWNfUFNFVDMyX1dPREQsIChQYWNrZXQ0dWkpcDE2dWNfUFNFVDMyX1dFVkVOKTsgICAgIC8veyA4LDksMTAsMTEsIDEyLDEzLDE0LDE1LCA4LDksMTAsMTEsIDEyLDEzLDE0LDE1IH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19UUkFOU1BPU0U2NF9ISSA9IHAxNnVjX1BTRVQ2NF9ISSArIHAxNnVjX0hBTEY2NF8wXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97IDAsMSwyLDMsIDQsNSw2LDcsIDE2LDE3LDE4LDE5LCAyMCwyMSwyMiwyM307CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19UUkFOU1BPU0U2NF9MTyA9IHAxNnVjX1BTRVQ2NF9MTyArIHAxNnVjX0hBTEY2NF8wXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDI0LDI1LDI2LDI3LCAyOCwyOSwzMCwzMX07CisKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0NPTVBMRVgzMl9SRVYgPSB2ZWNfc2xkKHAxNnVjX1JFVkVSU0UzMiwgcDE2dWNfUkVWRVJTRTMyLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8veyA0LDUsNiw3LCAwLDEsMiwzLCAxMiwxMywxNCwxNSwgOCw5LDEwLDExIH07CisKKyNpZmRlZiBfQklHX0VORElBTgorc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfQ09NUExFWDMyX1JFVjIgPSB2ZWNfc2xkKHAxNnVjX0ZPUldBUkQsIHAxNnVjX0ZPUldBUkQsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDAsMSwyLDMsIDQsNSw2LDcgfTsKKyNlbHNlCitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19DT01QTEVYMzJfUkVWMiA9IHZlY19zbGQocDE2dWNfUFNFVDY0X0hJLCBwMTZ1Y19QU0VUNjRfTE8sIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDAsMSwyLDMsIDQsNSw2LDcgfTsKKyNlbmRpZiAvLyBfQklHX0VORElBTgorCisjaWYgRUlHRU5fSEFTX0JVSUxUSU4oX19idWlsdGluX3ByZWZldGNoKSB8fCBFSUdFTl9DT01QX0dOVUMKKyAgI2RlZmluZSBFSUdFTl9QUENfUFJFRkVUQ0goQUREUikgX19idWlsdGluX3ByZWZldGNoKEFERFIpOworI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9QUENfUFJFRkVUQ0goQUREUikgYXNtKCAiICAgZGNidCBbJVthZGRyXV1cbiIgOjogW2FkZHJdICJyIiAoQUREUikgOiAiY2MiICk7CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0NGYgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQ0ZiBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT00LAorICAgIEhhc0hhbGZQYWNrZXQgPSAxLAorCisgICAgSGFzQWRkICA9IDEsCisgICAgSGFzU3ViICA9IDEsCisgICAgSGFzTXVsICA9IDEsCisgICAgSGFzRGl2ICA9IDEsCisgICAgSGFzTWluICA9IDEsCisgICAgSGFzTWF4ICA9IDEsCisgICAgSGFzQWJzICA9IDEsCisgICAgSGFzU2luICA9IDAsCisgICAgSGFzQ29zICA9IDAsCisgICAgSGFzTG9nICA9IDAsCisgICAgSGFzRXhwICA9IDEsCisjaWZkZWYgX19WU1hfXworICAgIEhhc1NxcnQgPSAxLAorI2lmICFFSUdFTl9DT01QX0NMQU5HCisgICAgSGFzUnNxcnQgPSAxLAorI2Vsc2UKKyAgICBIYXNSc3FydCA9IDAsCisjZW5kaWYKKyNlbHNlCisgICAgSGFzU3FydCA9IDAsCisgICAgSGFzUnNxcnQgPSAwLAorI2VuZGlmCisgICAgSGFzUm91bmQgPSAxLAorICAgIEhhc0Zsb29yID0gMSwKKyAgICBIYXNDZWlsID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0JsZW5kID0gMQorICB9OworfTsKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8aW50PiAgICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRpIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0NGkgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSA0LAorICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorCisgICAgSGFzQWRkICA9IDEsCisgICAgSGFzU3ViICA9IDEsCisgICAgSGFzTXVsICA9IDEsCisgICAgSGFzRGl2ICA9IDAsCisgICAgSGFzQmxlbmQgPSAxCisgIH07Cit9OworCisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0Zj4geyB0eXBlZGVmIGZsb2F0ICB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDRmIGhhbGY7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGk+IHsgdHlwZWRlZiBpbnQgICAgdHlwZTsgZW51bSB7c2l6ZT00LCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBQYWNrZXQ0aSBoYWxmOyB9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgUGFja2V0MTZ1YyAmIHYpCit7CisgIHVuaW9uIHsKKyAgICBQYWNrZXQxNnVjICAgdjsKKyAgICB1bnNpZ25lZCBjaGFyIG5bMTZdOworICB9IHZ0OworICB2dC52ID0gdjsKKyAgZm9yIChpbnQgaT0wOyBpPCAxNjsgaSsrKQorICAgIHMgPDwgKGludCl2dC5uW2ldIDw8ICIsICI7CisgIHJldHVybiBzOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgUGFja2V0NGYgJiB2KQoreworICB1bmlvbiB7CisgICAgUGFja2V0NGYgICB2OworICAgIGZsb2F0IG5bNF07CisgIH0gdnQ7CisgIHZ0LnYgPSB2OworICBzIDw8IHZ0Lm5bMF0gPDwgIiwgIiA8PCB2dC5uWzFdIDw8ICIsICIgPDwgdnQublsyXSA8PCAiLCAiIDw8IHZ0Lm5bM107CisgIHJldHVybiBzOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgUGFja2V0NGkgJiB2KQoreworICB1bmlvbiB7CisgICAgUGFja2V0NGkgICB2OworICAgIGludCBuWzRdOworICB9IHZ0OworICB2dC52ID0gdjsKKyAgcyA8PCB2dC5uWzBdIDw8ICIsICIgPDwgdnQublsxXSA8PCAiLCAiIDw8IHZ0Lm5bMl0gPDwgIiwgIiA8PCB2dC5uWzNdOworICByZXR1cm4gczsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFBhY2tldDR1aSAmIHYpCit7CisgIHVuaW9uIHsKKyAgICBQYWNrZXQ0dWkgICB2OworICAgIHVuc2lnbmVkIGludCBuWzRdOworICB9IHZ0OworICB2dC52ID0gdjsKKyAgcyA8PCB2dC5uWzBdIDw8ICIsICIgPDwgdnQublsxXSA8PCAiLCAiIDw8IHZ0Lm5bMl0gPDwgIiwgIiA8PCB2dC5uWzNdOworICByZXR1cm4gczsKK30KKworLy8gTmVlZCB0byBkZWZpbmUgdGhlbSBmaXJzdCBvciB3ZSBnZXQgc3BlY2lhbGl6YXRpb24gYWZ0ZXIgaW5zdGFudGlhdGlvbiBlcnJvcnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRAorI2lmZGVmIF9fVlNYX18KKyAgcmV0dXJuIHZlY192c3hfbGQoMCwgZnJvbSk7CisjZWxzZQorICByZXR1cm4gdmVjX2xkKDAsIGZyb20pOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FECisjaWZkZWYgX19WU1hfXworICByZXR1cm4gdmVjX3ZzeF9sZCgwLCBmcm9tKTsKKyNlbHNlCisgIHJldHVybiB2ZWNfbGQoMCwgZnJvbSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGZsb2F0PihmbG9hdCogICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUKKyNpZmRlZiBfX1ZTWF9fCisgIHZlY192c3hfc3QoZnJvbSwgMCwgdG8pOworI2Vsc2UKKyAgdmVjX3N0KGZyb20sIDAsIHRvKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8aW50PihpbnQqICAgICAgIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRQorI2lmZGVmIF9fVlNYX18KKyAgdmVjX3ZzeF9zdChmcm9tLCAwLCB0byk7CisjZWxzZQorICB2ZWNfc3QoZnJvbSwgMCwgdG8pOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwc2V0MTxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQmICBmcm9tKSB7CisgIFBhY2tldDRmIHYgPSB7ZnJvbSwgZnJvbSwgZnJvbSwgZnJvbX07CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHNldDE8UGFja2V0NGk+KGNvbnN0IGludCYgICAgZnJvbSkgICB7CisgIFBhY2tldDRpIHYgPSB7ZnJvbSwgZnJvbSwgZnJvbSwgZnJvbX07CisgIHJldHVybiB2OworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK3Bicm9hZGNhc3Q0PFBhY2tldDRmPihjb25zdCBmbG9hdCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ0ZiYgYTAsIFBhY2tldDRmJiBhMSwgUGFja2V0NGYmIGEyLCBQYWNrZXQ0ZiYgYTMpCit7CisgIGEzID0gcGxvYWQ8UGFja2V0NGY+KGEpOworICBhMCA9IHZlY19zcGxhdChhMywgMCk7CisgIGExID0gdmVjX3NwbGF0KGEzLCAxKTsKKyAgYTIgPSB2ZWNfc3BsYXQoYTMsIDIpOworICBhMyA9IHZlY19zcGxhdChhMywgMyk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcGJyb2FkY2FzdDQ8UGFja2V0NGk+KGNvbnN0IGludCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ0aSYgYTAsIFBhY2tldDRpJiBhMSwgUGFja2V0NGkmIGEyLCBQYWNrZXQ0aSYgYTMpCit7CisgIGEzID0gcGxvYWQ8UGFja2V0NGk+KGEpOworICBhMCA9IHZlY19zcGxhdChhMywgMCk7CisgIGExID0gdmVjX3NwbGF0KGEzLCAxKTsKKyAgYTIgPSB2ZWNfc3BsYXQoYTMsIDIpOworICBhMyA9IHZlY19zcGxhdChhMywgMyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDRmIHBnYXRoZXI8ZmxvYXQsIFBhY2tldDRmPihjb25zdCBmbG9hdCogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBmbG9hdCBFSUdFTl9BTElHTjE2IGFmWzRdOworICBhZlswXSA9IGZyb21bMCpzdHJpZGVdOworICBhZlsxXSA9IGZyb21bMSpzdHJpZGVdOworICBhZlsyXSA9IGZyb21bMipzdHJpZGVdOworICBhZlszXSA9IGZyb21bMypzdHJpZGVdOworIHJldHVybiBwbG9hZDxQYWNrZXQ0Zj4oYWYpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0NGkgcGdhdGhlcjxpbnQsIFBhY2tldDRpPihjb25zdCBpbnQqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgaW50IEVJR0VOX0FMSUdOMTYgYWlbNF07CisgIGFpWzBdID0gZnJvbVswKnN0cmlkZV07CisgIGFpWzFdID0gZnJvbVsxKnN0cmlkZV07CisgIGFpWzJdID0gZnJvbVsyKnN0cmlkZV07CisgIGFpWzNdID0gZnJvbVszKnN0cmlkZV07CisgcmV0dXJuIHBsb2FkPFBhY2tldDRpPihhaSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGZsb2F0LCBQYWNrZXQ0Zj4oZmxvYXQqIHRvLCBjb25zdCBQYWNrZXQ0ZiYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBmbG9hdCBFSUdFTl9BTElHTjE2IGFmWzRdOworICBwc3RvcmU8ZmxvYXQ+KGFmLCBmcm9tKTsKKyAgdG9bMCpzdHJpZGVdID0gYWZbMF07CisgIHRvWzEqc3RyaWRlXSA9IGFmWzFdOworICB0b1syKnN0cmlkZV0gPSBhZlsyXTsKKyAgdG9bMypzdHJpZGVdID0gYWZbM107Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGludCwgUGFja2V0NGk+KGludCogdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIGludCBFSUdFTl9BTElHTjE2IGFpWzRdOworICBwc3RvcmU8aW50PigoaW50ICopYWksIGZyb20pOworICB0b1swKnN0cmlkZV0gPSBhaVswXTsKKyAgdG9bMSpzdHJpZGVdID0gYWlbMV07CisgIHRvWzIqc3RyaWRlXSA9IGFpWzJdOworICB0b1szKnN0cmlkZV0gPSBhaVszXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsc2V0PFBhY2tldDRmPihjb25zdCBmbG9hdCYgYSkgeyByZXR1cm4gcHNldDE8UGFja2V0NGY+KGEpICsgcDRmX0NPVU5URE9XTjsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsc2V0PFBhY2tldDRpPihjb25zdCBpbnQmIGEpICAgeyByZXR1cm4gcHNldDE8UGFja2V0NGk+KGEpICsgcDRpX0NPVU5URE9XTjsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFkZDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBhICsgYjsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhZGQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gYSArIGI7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzdWI8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gYSAtIGI7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc3ViPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIGEgLSBiOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbmVnYXRlKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBwNGZfWkVSTyAtIGE7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbmVnYXRlKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiBwNGlfWkVSTyAtIGE7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBjb25qKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBhOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGNvbmooY29uc3QgUGFja2V0NGkmIGEpIHsgcmV0dXJuIGE7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmVjX21hZGQoYSxiLCBwNGZfTVpFUk8pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG11bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiBhICogYjsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGRpdjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworI2lmbmRlZiBfX1ZTWF9fICAvLyBWU1ggYWN0dWFsbHkgcHJvdmlkZXMgYSBkaXYgaW5zdHJ1Y3Rpb24KKyAgUGFja2V0NGYgdCwgeV8wLCB5XzE7CisKKyAgLy8gQWx0aXZlYyBkb2VzIG5vdCBvZmZlciBhIGRpdmlkZSBpbnN0cnVjdGlvbiwgd2UgaGF2ZSB0byBkbyBhIHJlY2lwcm9jYWwgYXBwcm94aW1hdGlvbgorICB5XzAgPSB2ZWNfcmUoYik7CisKKyAgLy8gRG8gb25lIE5ld3Rvbi1SYXBoc29uIGl0ZXJhdGlvbiB0byBnZXQgdGhlIG5lZWRlZCBhY2N1cmFjeQorICB0ICAgPSB2ZWNfbm1zdWIoeV8wLCBiLCBwNGZfT05FKTsKKyAgeV8xID0gdmVjX21hZGQoeV8wLCB0LCB5XzApOworCisgIHJldHVybiB2ZWNfbWFkZChhLCB5XzEsIHA0Zl9NWkVSTyk7CisjZWxzZQorICByZXR1cm4gdmVjX2RpdihhLCBiKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGRpdjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIC8qYSovLCBjb25zdCBQYWNrZXQ0aSYgLypiKi8pCit7IGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAicGFja2V0IGludGVnZXIgZGl2aXNpb24gYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQWx0aVZlYyIpOworICByZXR1cm4gcHNldDE8UGFja2V0NGk+KDApOworfQorCisvLyBmb3Igc29tZSB3ZWlyZCByYWlzb25zLCBpdCBoYXMgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgcGFja2V0IG9mIGludGVnZXJzCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1hZGQoY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiLCBjb25zdCBQYWNrZXQ0ZiYgYykgeyByZXR1cm4gdmVjX21hZGQoYSxiLGMpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1hZGQoY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiLCBjb25zdCBQYWNrZXQ0aSYgYykgeyByZXR1cm4gYSpiICsgYzsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1pbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWF4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhbmQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmVjX2FuZChhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX2FuZChhLCBiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG9yPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19vcihhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBvcjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfb3IoYSwgYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHB4b3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmVjX3hvcihhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHB4b3I8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX3hvcihhLCBiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFuZG5vdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2ZWNfYW5kKGEsIHZlY19ub3IoYiwgYikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFuZG5vdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfYW5kKGEsIHZlY19ub3IoYiwgYikpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcm91bmQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiB2ZWNfcm91bmQoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwY2VpbDxQYWNrZXQ0Zj4oY29uc3QgIFBhY2tldDRmJiBhKSB7IHJldHVybiB2ZWNfY2VpbChhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBmbG9vcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIHZlY19mbG9vcihhKTsgfQorCisjaWZkZWYgX0JJR19FTkRJQU4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZHU8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiBmcm9tKQoreworICBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyAgUGFja2V0MTZ1YyBNU1EsIExTUTsKKyAgUGFja2V0MTZ1YyBtYXNrOworICBNU1EgPSB2ZWNfbGQoMCwgKHVuc2lnbmVkIGNoYXIgKilmcm9tKTsgICAgICAgICAgLy8gbW9zdCBzaWduaWZpY2FudCBxdWFkd29yZAorICBMU1EgPSB2ZWNfbGQoMTUsICh1bnNpZ25lZCBjaGFyICopZnJvbSk7ICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgcXVhZHdvcmQKKyAgbWFzayA9IHZlY19sdnNsKDAsIGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGVybXV0ZSBtYXNrCisgIHJldHVybiAoUGFja2V0NGYpIHZlY19wZXJtKE1TUSwgTFNRLCBtYXNrKTsgICAgICAgICAgIC8vIGFsaWduIHRoZSBkYXRhCisKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZHU8UGFja2V0NGk+KGNvbnN0IGludCogZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FECisgIC8vIFRha2VuIGZyb20gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vaGFyZHdhcmVkcml2ZXJzL3ZlL2FsaWdubWVudC5odG1sCisgIFBhY2tldDE2dWMgTVNRLCBMU1E7CisgIFBhY2tldDE2dWMgbWFzazsKKyAgTVNRID0gdmVjX2xkKDAsICh1bnNpZ25lZCBjaGFyICopZnJvbSk7ICAgICAgICAgIC8vIG1vc3Qgc2lnbmlmaWNhbnQgcXVhZHdvcmQKKyAgTFNRID0gdmVjX2xkKDE1LCAodW5zaWduZWQgY2hhciAqKWZyb20pOyAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIG1hc2sgPSB2ZWNfbHZzbCgwLCBmcm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHBlcm11dGUgbWFzaworICByZXR1cm4gKFBhY2tldDRpKSB2ZWNfcGVybShNU1EsIExTUSwgbWFzayk7ICAgIC8vIGFsaWduIHRoZSBkYXRhCit9CisjZWxzZQorLy8gV2UgYWxzbyBuZWVkIG90IHJlZGVmaW5lIGxpdHRsZSBlbmRpYW4gbG9hZGluZyBvZiBQYWNrZXQ0aS9QYWNrZXQ0ZiB1c2luZyBWU1gKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZHU8UGFja2V0NGk+KGNvbnN0IGludCogZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQKKyAgcmV0dXJuIChQYWNrZXQ0aSkgdmVjX3ZzeF9sZCgobG9uZylmcm9tICYgMTUsIChjb25zdCBpbnQqKSBfRUlHRU5fQUxJR05FRF9QVFIoZnJvbSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkdTxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FECisgIHJldHVybiAoUGFja2V0NGYpIHZlY192c3hfbGQoKGxvbmcpZnJvbSAmIDE1LCAoY29uc3QgZmxvYXQqKSBfRUlHRU5fQUxJR05FRF9QVFIoZnJvbSkpOworfQorI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZGR1cDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqICAgZnJvbSkKK3sKKyAgUGFja2V0NGYgcDsKKyAgaWYoKHN0ZDo6cHRyZGlmZl90KGZyb20pICUgMTYpID09IDApICBwID0gcGxvYWQ8UGFja2V0NGY+KGZyb20pOworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwbG9hZHU8UGFja2V0NGY+KGZyb20pOworICByZXR1cm4gdmVjX3Blcm0ocCwgcCwgcDE2dWNfRFVQTElDQVRFMzJfSEkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkZHVwPFBhY2tldDRpPihjb25zdCBpbnQqICAgICBmcm9tKQoreworICBQYWNrZXQ0aSBwOworICBpZigoc3RkOjpwdHJkaWZmX3QoZnJvbSkgJSAxNikgPT0gMCkgIHAgPSBwbG9hZDxQYWNrZXQ0aT4oZnJvbSk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHBsb2FkdTxQYWNrZXQ0aT4oZnJvbSk7CisgIHJldHVybiB2ZWNfcGVybShwLCBwLCBwMTZ1Y19EVVBMSUNBVEUzMl9ISSk7Cit9CisKKyNpZmRlZiBfQklHX0VORElBTgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxmbG9hdD4oZmxvYXQqICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRQorICAvLyBUYWtlbiBmcm9tIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2hhcmR3YXJlZHJpdmVycy92ZS9hbGlnbm1lbnQuaHRtbAorICAvLyBXYXJuaW5nOiBub3QgdGhyZWFkIHNhZmUhCisgIFBhY2tldDE2dWMgTVNRLCBMU1EsIGVkZ2VzOworICBQYWNrZXQxNnVjIGVkZ2VBbGlnbiwgYWxpZ247CisKKyAgTVNRID0gdmVjX2xkKDAsICh1bnNpZ25lZCBjaGFyICopdG8pOyAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3Qgc2lnbmlmaWNhbnQgcXVhZHdvcmQKKyAgTFNRID0gdmVjX2xkKDE1LCAodW5zaWduZWQgY2hhciAqKXRvKTsgICAgICAgICAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIGVkZ2VBbGlnbiA9IHZlY19sdnNsKDAsIHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJtdXRlIG1hcCB0byBleHRyYWN0IGVkZ2VzCisgIGVkZ2VzPXZlY19wZXJtKExTUSxNU1EsZWRnZUFsaWduKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBlZGdlcworICBhbGlnbiA9IHZlY19sdnNyKCAwLCB0byApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybXV0ZSBtYXAgdG8gbWlzYWxpZ24gZGF0YQorICBNU1EgPSB2ZWNfcGVybShlZGdlcywoUGFja2V0MTZ1Yylmcm9tLGFsaWduKTsgICAgICAgICAgICAgLy8gbWlzYWxpZ24gdGhlIGRhdGEgKE1TUSkKKyAgTFNRID0gdmVjX3Blcm0oKFBhY2tldDE2dWMpZnJvbSxlZGdlcyxhbGlnbik7ICAgICAgICAgICAgIC8vIG1pc2FsaWduIHRoZSBkYXRhIChMU1EpCisgIHZlY19zdCggTFNRLCAxNSwgKHVuc2lnbmVkIGNoYXIgKil0byApOyAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgTFNRIHBhcnQgZmlyc3QKKyAgdmVjX3N0KCBNU1EsIDAsICh1bnNpZ25lZCBjaGFyICopdG8gKTsgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBNU1EgcGFydAorfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxpbnQ+KGludCogICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRQorICAvLyBUYWtlbiBmcm9tIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2hhcmR3YXJlZHJpdmVycy92ZS9hbGlnbm1lbnQuaHRtbAorICAvLyBXYXJuaW5nOiBub3QgdGhyZWFkIHNhZmUhCisgIFBhY2tldDE2dWMgTVNRLCBMU1EsIGVkZ2VzOworICBQYWNrZXQxNnVjIGVkZ2VBbGlnbiwgYWxpZ247CisKKyAgTVNRID0gdmVjX2xkKDAsICh1bnNpZ25lZCBjaGFyICopdG8pOyAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3Qgc2lnbmlmaWNhbnQgcXVhZHdvcmQKKyAgTFNRID0gdmVjX2xkKDE1LCAodW5zaWduZWQgY2hhciAqKXRvKTsgICAgICAgICAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIGVkZ2VBbGlnbiA9IHZlY19sdnNsKDAsIHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJtdXRlIG1hcCB0byBleHRyYWN0IGVkZ2VzCisgIGVkZ2VzPXZlY19wZXJtKExTUSwgTVNRLCBlZGdlQWxpZ24pOyAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBlZGdlcworICBhbGlnbiA9IHZlY19sdnNyKCAwLCB0byApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybXV0ZSBtYXAgdG8gbWlzYWxpZ24gZGF0YQorICBNU1EgPSB2ZWNfcGVybShlZGdlcywgKFBhY2tldDE2dWMpIGZyb20sIGFsaWduKTsgICAgICAgICAgLy8gbWlzYWxpZ24gdGhlIGRhdGEgKE1TUSkKKyAgTFNRID0gdmVjX3Blcm0oKFBhY2tldDE2dWMpIGZyb20sIGVkZ2VzLCBhbGlnbik7ICAgICAgICAgIC8vIG1pc2FsaWduIHRoZSBkYXRhIChMU1EpCisgIHZlY19zdCggTFNRLCAxNSwgKHVuc2lnbmVkIGNoYXIgKil0byApOyAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgTFNRIHBhcnQgZmlyc3QKKyAgdmVjX3N0KCBNU1EsIDAsICh1bnNpZ25lZCBjaGFyICopdG8gKTsgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBNU1EgcGFydAorfQorI2Vsc2UKKy8vIFdlIGFsc28gbmVlZCBvdCByZWRlZmluZSBsaXR0bGUgZW5kaWFuIGxvYWRpbmcgb2YgUGFja2V0NGkvUGFja2V0NGYgdXNpbmcgVlNYCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGludD4oaW50KiAgICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUKKyAgdmVjX3ZzeF9zdChmcm9tLCAobG9uZyl0byAmIDE1LCAoaW50KikgX0VJR0VOX0FMSUdORURfUFRSKHRvKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGZsb2F0PihmbG9hdCogICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUKKyAgdmVjX3ZzeF9zdChmcm9tLCAobG9uZyl0byAmIDE1LCAoZmxvYXQqKSBfRUlHRU5fQUxJR05FRF9QVFIodG8pKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxmbG9hdD4oY29uc3QgZmxvYXQqIGFkZHIpICAgIHsgRUlHRU5fUFBDX1BSRUZFVENIKGFkZHIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxpbnQ+KGNvbnN0IGludCogICAgIGFkZHIpICAgIHsgRUlHRU5fUFBDX1BSRUZFVENIKGFkZHIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkgeyBmbG9hdCBFSUdFTl9BTElHTjE2IHg7IHZlY19zdGUoYSwgMCwgJngpOyByZXR1cm4geDsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCAgIEVJR0VOX0FMSUdOMTYgeDsgdmVjX3N0ZShhLCAwLCAmeCk7IHJldHVybiB4OyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcmV2ZXJzZShjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KHZlY19wZXJtKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHAxNnVjX1JFVkVSU0UzMikpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZXZlcnNlKGNvbnN0IFBhY2tldDRpJiBhKQoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4odmVjX3Blcm0ocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQxNnVjPihhKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQxNnVjPihhKSwgcDE2dWNfUkVWRVJTRTMyKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhYnMoY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIHZlY19hYnMoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWJzKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiB2ZWNfYWJzKGEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiBiLCBzdW07CisgIGIgICA9IHZlY19zbGQoYSwgYSwgOCk7CisgIHN1bSA9IGEgKyBiOworICBiICAgPSB2ZWNfc2xkKHN1bSwgc3VtLCA0KTsKKyAgc3VtICs9IGI7CisgIHJldHVybiBwZmlyc3Qoc3VtKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHByZWR1eHA8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmKiB2ZWNzKQoreworICBQYWNrZXQ0ZiB2WzRdLCBzdW1bNF07CisKKyAgLy8gSXQncyBlYXNpZXIgYW5kIGZhc3RlciB0byB0cmFuc3Bvc2UgdGhlbiBhZGQgYXMgY29sdW1ucworICAvLyBDaGVjazogaHR0cDovL3d3dy5mcmVldmVjLm9yZy9mdW5jdGlvbi9tYXRyaXhfNHg0X3RyYW5zcG9zZV9mbG9hdHMgZm9yIGV4cGxhbmF0aW9uCisgIC8vIERvIHRoZSB0cmFuc3Bvc2UsIGZpcnN0IHNldCBvZiBtb3ZlcworICB2WzBdID0gdmVjX21lcmdlaCh2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdlsxXSA9IHZlY19tZXJnZWwodmVjc1swXSwgdmVjc1syXSk7CisgIHZbMl0gPSB2ZWNfbWVyZ2VoKHZlY3NbMV0sIHZlY3NbM10pOworICB2WzNdID0gdmVjX21lcmdlbCh2ZWNzWzFdLCB2ZWNzWzNdKTsKKyAgLy8gR2V0IHRoZSByZXN1bHRpbmcgdmVjdG9ycworICBzdW1bMF0gPSB2ZWNfbWVyZ2VoKHZbMF0sIHZbMl0pOworICBzdW1bMV0gPSB2ZWNfbWVyZ2VsKHZbMF0sIHZbMl0pOworICBzdW1bMl0gPSB2ZWNfbWVyZ2VoKHZbMV0sIHZbM10pOworICBzdW1bM10gPSB2ZWNfbWVyZ2VsKHZbMV0sIHZbM10pOworCisgIC8vIE5vdyBkbyB0aGUgc3VtbWF0aW9uOgorICAvLyBMaW5lcyAwKzEKKyAgc3VtWzBdID0gc3VtWzBdICsgc3VtWzFdOworICAvLyBMaW5lcyAyKzMKKyAgc3VtWzFdID0gc3VtWzJdICsgc3VtWzNdOworICAvLyBBZGQgdGhlIHJlc3VsdHMKKyAgc3VtWzBdID0gc3VtWzBdICsgc3VtWzFdOworCisgIHJldHVybiBzdW1bMF07Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgUGFja2V0NGkgc3VtOworICBzdW0gPSB2ZWNfc3VtcyhhLCBwNGlfWkVSTyk7CisjaWZkZWYgX0JJR19FTkRJQU4KKyAgc3VtID0gdmVjX3NsZChzdW0sIHA0aV9aRVJPLCAxMik7CisjZWxzZQorICBzdW0gPSB2ZWNfc2xkKHA0aV9aRVJPLCBzdW0sIDQpOworI2VuZGlmCisgIHJldHVybiBwZmlyc3Qoc3VtKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZWR1eHA8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpKiB2ZWNzKQoreworICBQYWNrZXQ0aSB2WzRdLCBzdW1bNF07CisKKyAgLy8gSXQncyBlYXNpZXIgYW5kIGZhc3RlciB0byB0cmFuc3Bvc2UgdGhlbiBhZGQgYXMgY29sdW1ucworICAvLyBDaGVjazogaHR0cDovL3d3dy5mcmVldmVjLm9yZy9mdW5jdGlvbi9tYXRyaXhfNHg0X3RyYW5zcG9zZV9mbG9hdHMgZm9yIGV4cGxhbmF0aW9uCisgIC8vIERvIHRoZSB0cmFuc3Bvc2UsIGZpcnN0IHNldCBvZiBtb3ZlcworICB2WzBdID0gdmVjX21lcmdlaCh2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdlsxXSA9IHZlY19tZXJnZWwodmVjc1swXSwgdmVjc1syXSk7CisgIHZbMl0gPSB2ZWNfbWVyZ2VoKHZlY3NbMV0sIHZlY3NbM10pOworICB2WzNdID0gdmVjX21lcmdlbCh2ZWNzWzFdLCB2ZWNzWzNdKTsKKyAgLy8gR2V0IHRoZSByZXN1bHRpbmcgdmVjdG9ycworICBzdW1bMF0gPSB2ZWNfbWVyZ2VoKHZbMF0sIHZbMl0pOworICBzdW1bMV0gPSB2ZWNfbWVyZ2VsKHZbMF0sIHZbMl0pOworICBzdW1bMl0gPSB2ZWNfbWVyZ2VoKHZbMV0sIHZbM10pOworICBzdW1bM10gPSB2ZWNfbWVyZ2VsKHZbMV0sIHZbM10pOworCisgIC8vIE5vdyBkbyB0aGUgc3VtbWF0aW9uOgorICAvLyBMaW5lcyAwKzEKKyAgc3VtWzBdID0gc3VtWzBdICsgc3VtWzFdOworICAvLyBMaW5lcyAyKzMKKyAgc3VtWzFdID0gc3VtWzJdICsgc3VtWzNdOworICAvLyBBZGQgdGhlIHJlc3VsdHMKKyAgc3VtWzBdID0gc3VtWzBdICsgc3VtWzFdOworCisgIHJldHVybiBzdW1bMF07Cit9CisKKy8vIE90aGVyIHJlZHVjdGlvbiBmdW5jdGlvbnM6CisvLyBtdWwKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbXVsPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgUGFja2V0NGYgcHJvZDsKKyAgcHJvZCA9IHBtdWwoYSwgdmVjX3NsZChhLCBhLCA4KSk7CisgIHJldHVybiBwZmlyc3QocG11bChwcm9kLCB2ZWNfc2xkKHByb2QsIHByb2QsIDQpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X211bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIEVJR0VOX0FMSUdOMTYgaW50IGF1eFs0XTsKKyAgcHN0b3JlKGF1eCwgYSk7CisgIHJldHVybiBhdXhbMF0gKiBhdXhbMV0gKiBhdXhbMl0gKiBhdXhbM107Cit9CisKKy8vIG1pbgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiBiLCByZXM7CisgIGIgPSB2ZWNfbWluKGEsIHZlY19zbGQoYSwgYSwgOCkpOworICByZXMgPSB2ZWNfbWluKGIsIHZlY19zbGQoYiwgYiwgNCkpOworICByZXR1cm4gcGZpcnN0KHJlcyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X21pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIFBhY2tldDRpIGIsIHJlczsKKyAgYiA9IHZlY19taW4oYSwgdmVjX3NsZChhLCBhLCA4KSk7CisgIHJlcyA9IHZlY19taW4oYiwgdmVjX3NsZChiLCBiLCA0KSk7CisgIHJldHVybiBwZmlyc3QocmVzKTsKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X21heDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDRmIGIsIHJlczsKKyAgYiA9IHZlY19tYXgoYSwgdmVjX3NsZChhLCBhLCA4KSk7CisgIHJlcyA9IHZlY19tYXgoYiwgdmVjX3NsZChiLCBiLCA0KSk7CisgIHJldHVybiBwZmlyc3QocmVzKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXhfbWF4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgUGFja2V0NGkgYiwgcmVzOworICBiID0gdmVjX21heChhLCB2ZWNfc2xkKGEsIGEsIDgpKTsKKyAgcmVzID0gdmVjX21heChiLCB2ZWNfc2xkKGIsIGIsIDQpKTsKKyAgcmV0dXJuIHBmaXJzdChyZXMpOworfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0Zj4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGYmIGZpcnN0LCBjb25zdCBQYWNrZXQ0ZiYgc2Vjb25kKQorICB7CisjaWZkZWYgX0JJR19FTkRJQU4KKyAgICBzd2l0Y2ggKE9mZnNldCAlIDQpIHsKKyAgICBjYXNlIDE6CisgICAgICBmaXJzdCA9IHZlY19zbGQoZmlyc3QsIHNlY29uZCwgNCk7IGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChmaXJzdCwgc2Vjb25kLCA4KTsgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZmlyc3QgPSB2ZWNfc2xkKGZpcnN0LCBzZWNvbmQsIDEyKTsgYnJlYWs7CisgICAgfQorI2Vsc2UKKyAgICBzd2l0Y2ggKE9mZnNldCAlIDQpIHsKKyAgICBjYXNlIDE6CisgICAgICBmaXJzdCA9IHZlY19zbGQoc2Vjb25kLCBmaXJzdCwgMTIpOyBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmaXJzdCA9IHZlY19zbGQoc2Vjb25kLCBmaXJzdCwgOCk7IGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChzZWNvbmQsIGZpcnN0LCA0KTsgYnJlYWs7CisgICAgfQorI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRpPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0aSYgZmlyc3QsIGNvbnN0IFBhY2tldDRpJiBzZWNvbmQpCisgIHsKKyNpZmRlZiBfQklHX0VORElBTgorICAgIHN3aXRjaCAoT2Zmc2V0ICUgNCkgeworICAgIGNhc2UgMToKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChmaXJzdCwgc2Vjb25kLCA0KTsgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZmlyc3QgPSB2ZWNfc2xkKGZpcnN0LCBzZWNvbmQsIDgpOyBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBmaXJzdCA9IHZlY19zbGQoZmlyc3QsIHNlY29uZCwgMTIpOyBicmVhazsKKyAgICB9CisjZWxzZQorICAgIHN3aXRjaCAoT2Zmc2V0ICUgNCkgeworICAgIGNhc2UgMToKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChzZWNvbmQsIGZpcnN0LCAxMik7IGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChzZWNvbmQsIGZpcnN0LCA4KTsgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZmlyc3QgPSB2ZWNfc2xkKHNlY29uZCwgZmlyc3QsIDQpOyBicmVhazsKKyAgICB9CisjZW5kaWYKKyAgfQorfTsKKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0NGYsND4mIGtlcm5lbCkgeworICBQYWNrZXQ0ZiB0MCwgdDEsIHQyLCB0MzsKKyAgdDAgPSB2ZWNfbWVyZ2VoKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMl0pOworICB0MSA9IHZlY19tZXJnZWwoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsyXSk7CisgIHQyID0gdmVjX21lcmdlaChrZXJuZWwucGFja2V0WzFdLCBrZXJuZWwucGFja2V0WzNdKTsKKyAgdDMgPSB2ZWNfbWVyZ2VsKGtlcm5lbC5wYWNrZXRbMV0sIGtlcm5lbC5wYWNrZXRbM10pOworICBrZXJuZWwucGFja2V0WzBdID0gdmVjX21lcmdlaCh0MCwgdDIpOworICBrZXJuZWwucGFja2V0WzFdID0gdmVjX21lcmdlbCh0MCwgdDIpOworICBrZXJuZWwucGFja2V0WzJdID0gdmVjX21lcmdlaCh0MSwgdDMpOworICBrZXJuZWwucGFja2V0WzNdID0gdmVjX21lcmdlbCh0MSwgdDMpOworfQorCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ0aSw0PiYga2VybmVsKSB7CisgIFBhY2tldDRpIHQwLCB0MSwgdDIsIHQzOworICB0MCA9IHZlY19tZXJnZWgoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsyXSk7CisgIHQxID0gdmVjX21lcmdlbChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzJdKTsKKyAgdDIgPSB2ZWNfbWVyZ2VoKGtlcm5lbC5wYWNrZXRbMV0sIGtlcm5lbC5wYWNrZXRbM10pOworICB0MyA9IHZlY19tZXJnZWwoa2VybmVsLnBhY2tldFsxXSwga2VybmVsLnBhY2tldFszXSk7CisgIGtlcm5lbC5wYWNrZXRbMF0gPSB2ZWNfbWVyZ2VoKHQwLCB0Mik7CisgIGtlcm5lbC5wYWNrZXRbMV0gPSB2ZWNfbWVyZ2VsKHQwLCB0Mik7CisgIGtlcm5lbC5wYWNrZXRbMl0gPSB2ZWNfbWVyZ2VoKHQxLCB0Myk7CisgIGtlcm5lbC5wYWNrZXRbM10gPSB2ZWNfbWVyZ2VsKHQxLCB0Myk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYmxlbmQoY29uc3QgU2VsZWN0b3I8ND4mIGlmUGFja2V0LCBjb25zdCBQYWNrZXQ0aSYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0NGkmIGVsc2VQYWNrZXQpIHsKKyAgUGFja2V0NHVpIHNlbGVjdCA9IHsgaWZQYWNrZXQuc2VsZWN0WzBdLCBpZlBhY2tldC5zZWxlY3RbMV0sIGlmUGFja2V0LnNlbGVjdFsyXSwgaWZQYWNrZXQuc2VsZWN0WzNdIH07CisgIFBhY2tldDR1aSBtYXNrID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHZlY19jbXBlcShyZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oc2VsZWN0KSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHA0aV9PTkUpKSk7CisgIHJldHVybiB2ZWNfc2VsKGVsc2VQYWNrZXQsIHRoZW5QYWNrZXQsIG1hc2spOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGJsZW5kKGNvbnN0IFNlbGVjdG9yPDQ+JiBpZlBhY2tldCwgY29uc3QgUGFja2V0NGYmIHRoZW5QYWNrZXQsIGNvbnN0IFBhY2tldDRmJiBlbHNlUGFja2V0KSB7CisgIFBhY2tldDR1aSBzZWxlY3QgPSB7IGlmUGFja2V0LnNlbGVjdFswXSwgaWZQYWNrZXQuc2VsZWN0WzFdLCBpZlBhY2tldC5zZWxlY3RbMl0sIGlmUGFja2V0LnNlbGVjdFszXSB9OworICBQYWNrZXQ0dWkgbWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPih2ZWNfY21wZXEocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHNlbGVjdCksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPihwNGlfT05FKSkpOworICByZXR1cm4gdmVjX3NlbChlbHNlUGFja2V0LCB0aGVuUGFja2V0LCBtYXNrKTsKK30KKworCisvLy0tLS0tLS0tLS0gZG91YmxlIC0tLS0tLS0tLS0KKyNpZmRlZiBfX1ZTWF9fCit0eXBlZGVmIF9fdmVjdG9yIGRvdWJsZSAgICAgICAgICAgICAgUGFja2V0MmQ7Cit0eXBlZGVmIF9fdmVjdG9yIHVuc2lnbmVkIGxvbmcgbG9uZyAgUGFja2V0MnVsOwordHlwZWRlZiBfX3ZlY3RvciBsb25nIGxvbmcgICAgICAgICAgIFBhY2tldDJsOworI2lmIEVJR0VOX0NPTVBfQ0xBTkcKK3R5cGVkZWYgUGFja2V0MnVsICAgICAgICAgICAgICAgICAgICBQYWNrZXQyYmw7CisjZWxzZQordHlwZWRlZiBfX3ZlY3RvciBfX2Jvb2wgbG9uZyAgICAgICAgIFBhY2tldDJibDsKKyNlbmRpZgorCitzdGF0aWMgUGFja2V0MmwgIHAybF9PTkUgID0geyAxLCAxIH07CitzdGF0aWMgUGFja2V0MmwgIHAybF9aRVJPID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQybD4ocDRpX1pFUk8pOworc3RhdGljIFBhY2tldDJkICBwMmRfT05FICA9IHsgMS4wLCAxLjAgfTsgCitzdGF0aWMgUGFja2V0MmQgIHAyZF9aRVJPID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4ocDRmX1pFUk8pOworc3RhdGljIFBhY2tldDJkICBwMmRfTVpFUk8gPSB7IC0wLjAsIC0wLjAgfTsKKworI2lmZGVmIF9CSUdfRU5ESUFOCitzdGF0aWMgUGFja2V0MmQgcDJkX0NPVU5URE9XTiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4ocDJkX1pFUk8pLCByZWludGVycHJldF9jYXN0PFBhY2tldDRmPihwMmRfT05FKSwgOCkpOworI2Vsc2UKK3N0YXRpYyBQYWNrZXQyZCBwMmRfQ09VTlRET1dOID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDRmPihwMmRfT05FKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4ocDJkX1pFUk8pLCA4KSk7CisjZW5kaWYKKwordGVtcGxhdGU8aW50IGluZGV4PiBQYWNrZXQyZCB2ZWNfc3BsYXRfZGJsKFBhY2tldDJkJiBhKTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHZlY19zcGxhdF9kYmw8MD4oUGFja2V0MmQmIGEpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFBhY2tldDJkPih2ZWNfcGVybShhLCBhLCBwMTZ1Y19QU0VUNjRfSEkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHZlY19zcGxhdF9kYmw8MT4oUGFja2V0MmQmIGEpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFBhY2tldDJkPih2ZWNfcGVybShhLCBhLCBwMTZ1Y19QU0VUNjRfTE8pKTsKK30KKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxkb3VibGU+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MmQgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQyZCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT0yLAorICAgIEhhc0hhbGZQYWNrZXQgPSAxLAorCisgICAgSGFzQWRkICA9IDEsCisgICAgSGFzU3ViICA9IDEsCisgICAgSGFzTXVsICA9IDEsCisgICAgSGFzRGl2ICA9IDEsCisgICAgSGFzTWluICA9IDEsCisgICAgSGFzTWF4ICA9IDEsCisgICAgSGFzQWJzICA9IDEsCisgICAgSGFzU2luICA9IDAsCisgICAgSGFzQ29zICA9IDAsCisgICAgSGFzTG9nICA9IDAsCisgICAgSGFzRXhwICA9IDEsCisgICAgSGFzU3FydCA9IDEsCisgICAgSGFzUnNxcnQgPSAxLAorICAgIEhhc1JvdW5kID0gMSwKKyAgICBIYXNGbG9vciA9IDEsCisgICAgSGFzQ2VpbCA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNCbGVuZCA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQyZD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyBlbnVtIHtzaXplPTIsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDJkIGhhbGY7IH07CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXQybCAmIHYpCit7CisgIHVuaW9uIHsKKyAgICBQYWNrZXQybCAgIHY7CisgICAgaW50NjRfdCBuWzJdOworICB9IHZ0OworICB2dC52ID0gdjsKKyAgcyA8PCB2dC5uWzBdIDw8ICIsICIgPDwgdnQublsxXTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXQyZCAmIHYpCit7CisgIHVuaW9uIHsKKyAgICBQYWNrZXQyZCAgIHY7CisgICAgZG91YmxlIG5bMl07CisgIH0gdnQ7CisgIHZ0LnYgPSB2OworICBzIDw8IHZ0Lm5bMF0gPDwgIiwgIiA8PCB2dC5uWzFdOworICByZXR1cm4gczsKK30KKworLy8gTmVlZCB0byBkZWZpbmUgdGhlbSBmaXJzdCBvciB3ZSBnZXQgc3BlY2lhbGl6YXRpb24gYWZ0ZXIgaW5zdGFudGlhdGlvbiBlcnJvcnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbG9hZDxQYWNrZXQyZD4oY29uc3QgZG91YmxlKiBmcm9tKQoreworICBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyNpZmRlZiBfX1ZTWF9fCisgIHJldHVybiB2ZWNfdnN4X2xkKDAsIGZyb20pOworI2Vsc2UKKyAgcmV0dXJuIHZlY19sZCgwLCBmcm9tKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8ZG91YmxlPihkb3VibGUqICAgdG8sIGNvbnN0IFBhY2tldDJkJiBmcm9tKQoreworICBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisjaWZkZWYgX19WU1hfXworICB2ZWNfdnN4X3N0KGZyb20sIDAsIHRvKTsKKyNlbHNlCisgIHZlY19zdChmcm9tLCAwLCB0byk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBzZXQxPFBhY2tldDJkPihjb25zdCBkb3VibGUmICBmcm9tKSB7CisgIFBhY2tldDJkIHYgPSB7ZnJvbSwgZnJvbX07CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcGJyb2FkY2FzdDQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQyZCYgYTAsIFBhY2tldDJkJiBhMSwgUGFja2V0MmQmIGEyLCBQYWNrZXQyZCYgYTMpCit7CisgIGExID0gcGxvYWQ8UGFja2V0MmQ+KGEpOworICBhMCA9IHZlY19zcGxhdF9kYmw8MD4oYTEpOworICBhMSA9IHZlY19zcGxhdF9kYmw8MT4oYTEpOworICBhMyA9IHBsb2FkPFBhY2tldDJkPihhKzIpOworICBhMiA9IHZlY19zcGxhdF9kYmw8MD4oYTMpOworICBhMyA9IHZlY19zcGxhdF9kYmw8MT4oYTMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQyZCBwZ2F0aGVyPGRvdWJsZSwgUGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBkb3VibGUgRUlHRU5fQUxJR04xNiBhZlsyXTsKKyAgYWZbMF0gPSBmcm9tWzAqc3RyaWRlXTsKKyAgYWZbMV0gPSBmcm9tWzEqc3RyaWRlXTsKKyByZXR1cm4gcGxvYWQ8UGFja2V0MmQ+KGFmKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZG91YmxlLCBQYWNrZXQyZD4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgZG91YmxlIEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIHBzdG9yZTxkb3VibGU+KGFmLCBmcm9tKTsKKyAgdG9bMCpzdHJpZGVdID0gYWZbMF07CisgIHRvWzEqc3RyaWRlXSA9IGFmWzFdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxzZXQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSYgYSkgeyByZXR1cm4gcHNldDE8UGFja2V0MmQ+KGEpICsgcDJkX0NPVU5URE9XTjsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFkZDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBhICsgYjsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHN1YjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBhIC0gYjsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG5lZ2F0ZShjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gcDJkX1pFUk8gLSBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwY29uaihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gYTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG11bDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfbWFkZChhLGIscDJkX01aRVJPKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBkaXY8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gdmVjX2RpdihhLGIpOyB9CisKKy8vIGZvciBzb21lIHdlaXJkIHJhaXNvbnMsIGl0IGhhcyB0byBiZSBvdmVybG9hZGVkIGZvciBwYWNrZXQgb2YgaW50ZWdlcnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWFkZChjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIsIGNvbnN0IFBhY2tldDJkJiBjKSB7IHJldHVybiB2ZWNfbWFkZChhLCBiLCBjKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG1pbjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWF4PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhbmQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gdmVjX2FuZChhLCBiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG9yPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZlY19vcihhLCBiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHhvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfeG9yKGEsIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYW5kbm90PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZlY19hbmQoYSwgdmVjX25vcihiLCBiKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHByb3VuZDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZlY19yb3VuZChhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBjZWlsPFBhY2tldDJkPihjb25zdCAgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZlY19jZWlsKGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGZsb29yPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gdmVjX2Zsb29yKGEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbG9hZHU8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FECisgIHJldHVybiAoUGFja2V0MmQpIHZlY192c3hfbGQoKGxvbmcpZnJvbSAmIDE1LCAoY29uc3QgZG91YmxlKikgX0VJR0VOX0FMSUdORURfUFRSKGZyb20pKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBsb2FkZHVwPFBhY2tldDJkPihjb25zdCBkb3VibGUqICAgZnJvbSkKK3sKKyAgUGFja2V0MmQgcDsKKyAgaWYoKHN0ZDo6cHRyZGlmZl90KGZyb20pICUgMTYpID09IDApICBwID0gcGxvYWQ8UGFja2V0MmQ+KGZyb20pOworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwbG9hZHU8UGFja2V0MmQ+KGZyb20pOworICByZXR1cm4gdmVjX3NwbGF0X2RibDwwPihwKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxkb3VibGU+KGRvdWJsZSogIHRvLCBjb25zdCBQYWNrZXQyZCYgZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRQorICB2ZWNfdnN4X3N0KChQYWNrZXQ0Zilmcm9tLCAobG9uZyl0byAmIDE1LCAoZmxvYXQqKSBfRUlHRU5fQUxJR05FRF9QVFIodG8pKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8ZG91YmxlPihjb25zdCBkb3VibGUqIGFkZHIpIHsgRUlHRU5fUFBDX1BSRUZFVENIKGFkZHIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgIHBmaXJzdDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgZG91YmxlIEVJR0VOX0FMSUdOMTYgeFsyXTsgcHN0b3JlPGRvdWJsZT4oeCwgYSk7IHJldHVybiB4WzBdOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19wZXJtKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHAxNnVjX1JFVkVSU0U2NCkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhYnMoY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZlY19hYnMoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICBQYWNrZXQyZCBiLCBzdW07CisgIGIgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KGEpLCA4KSk7CisgIHN1bSA9IGEgKyBiOworICByZXR1cm4gcGZpcnN0PFBhY2tldDJkPihzdW0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJlZHV4cDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQqIHZlY3MpCit7CisgIFBhY2tldDJkIHZbMl0sIHN1bTsKKyAgdlswXSA9IHZlY3NbMF0gKyByZWludGVycHJldF9jYXN0PFBhY2tldDJkPih2ZWNfc2xkKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KHZlY3NbMF0pLCByZWludGVycHJldF9jYXN0PFBhY2tldDRmPih2ZWNzWzBdKSwgOCkpOworICB2WzFdID0gdmVjc1sxXSArIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4odmVjc1sxXSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KHZlY3NbMV0pLCA4KSk7CisgCisjaWZkZWYgX0JJR19FTkRJQU4KKyAgc3VtID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDRmPih2WzBdKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4odlsxXSksIDgpKTsKKyNlbHNlCisgIHN1bSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0Zj4odlsxXSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGY+KHZbMF0pLCA4KSk7CisjZW5kaWYKKworICByZXR1cm4gc3VtOworfQorLy8gT3RoZXIgcmVkdWN0aW9uIGZ1bmN0aW9uczoKKy8vIG11bAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXhfbXVsPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdChwbXVsKGEsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KGEpLCByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oYSksIDgpKSkpOworfQorCisvLyBtaW4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X21pbjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpCit7CisgIHJldHVybiBwZmlyc3QocG1pbihhLCByZWludGVycHJldF9jYXN0PFBhY2tldDJkPih2ZWNfc2xkKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPihhKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KGEpLCA4KSkpKTsKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tYXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0KHBtYXgoYSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPihhKSwgOCkpKSk7Cit9CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDJkPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQyZCYgZmlyc3QsIGNvbnN0IFBhY2tldDJkJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0ID09IDEpCisjaWZkZWYgX0JJR19FTkRJQU4KKyAgICAgIGZpcnN0ID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oZmlyc3QpLCByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oc2Vjb25kKSwgOCkpOworI2Vsc2UKKyAgICAgIGZpcnN0ID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4oc2Vjb25kKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KGZpcnN0KSwgOCkpOworI2VuZGlmCisgIH0KK307CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDJkLDI+JiBrZXJuZWwpIHsKKyAgUGFja2V0MmQgdDAsIHQxOworICB0MCA9IHZlY19wZXJtKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0sIHAxNnVjX1RSQU5TUE9TRTY0X0hJKTsKKyAgdDEgPSB2ZWNfcGVybShrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdLCBwMTZ1Y19UUkFOU1BPU0U2NF9MTyk7CisgIGtlcm5lbC5wYWNrZXRbMF0gPSB0MDsKKyAga2VybmVsLnBhY2tldFsxXSA9IHQxOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGJsZW5kKGNvbnN0IFNlbGVjdG9yPDI+JiBpZlBhY2tldCwgY29uc3QgUGFja2V0MmQmIHRoZW5QYWNrZXQsIGNvbnN0IFBhY2tldDJkJiBlbHNlUGFja2V0KSB7CisgIFBhY2tldDJsIHNlbGVjdCA9IHsgaWZQYWNrZXQuc2VsZWN0WzBdLCBpZlBhY2tldC5zZWxlY3RbMV0gfTsKKyAgUGFja2V0MmJsIG1hc2sgPSB2ZWNfY21wZXEocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oc2VsZWN0KSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4ocDJsX09ORSkpOworICByZXR1cm4gdmVjX3NlbChlbHNlUGFja2V0LCB0aGVuUGFja2V0LCBtYXNrKTsKK30KKyNlbmRpZiAvLyBfX1ZTWF9fCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRVRfTUFUSF9BTFRJVkVDX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ1VEQS9Db21wbGV4LmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvQ29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjUzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvQ29tcGxleC5oCkBAIC0wLDAgKzEsMTAzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfQ1VEQV9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfQ1VEQV9ICisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmIGRlZmluZWQoX19DVURBQ0NfXykgJiYgZGVmaW5lZChFSUdFTl9VU0VfR1BVKQorCisvLyBNYW55IHN0ZDo6Y29tcGxleCBtZXRob2RzIHN1Y2ggYXMgb3BlcmF0b3IrLCBvcGVyYXRvci0sIG9wZXJhdG9yKiBhbmQKKy8vIG9wZXJhdG9yLyBhcmUgbm90IGNvbnN0ZXhwci4gRHVlIHRvIHRoaXMsIGNsYW5nIGRvZXMgbm90IHRyZWF0IHRoZW0gYXMgZGV2aWNlCisvLyBmdW5jdGlvbnMgYW5kIHRodXMgRWlnZW4gZnVuY3RvcnMgbWFraW5nIHVzZSBvZiB0aGVzZSBvcGVyYXRvcnMgZmFpbCB0bworLy8gY29tcGlsZS4gSGVyZSwgd2UgbWFudWFsbHkgc3BlY2lhbGl6ZSB0aGVzZSBmdW5jdG9ycyBmb3IgY29tcGxleCB0eXBlcyB3aGVuCisvLyBidWlsZGluZyBmb3IgQ1VEQSB0byBhdm9pZCBub24tY29uc3RleHByIG1ldGhvZHMuCisKKy8vIFN1bQordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNjYWxhcl9zdW1fb3A8Y29uc3Qgc3RkOjpjb21wbGV4PFQ+LCBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gPiA6IGJpbmFyeV9vcF9iYXNlPGNvbnN0IHN0ZDo6Y29tcGxleDxUPiwgY29uc3Qgc3RkOjpjb21wbGV4PFQ+ID4geworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxUPiByZXN1bHRfdHlwZTsKKworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfc3VtX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxUPiBvcGVyYXRvcigpIChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiYgYikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8VD4obnVtZXh0OjpyZWFsKGEpICsgbnVtZXh0OjpyZWFsKGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXh0OjppbWFnKGEpICsgbnVtZXh0OjppbWFnKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNjYWxhcl9zdW1fb3A8c3RkOjpjb21wbGV4PFQ+LCBzdGQ6OmNvbXBsZXg8VD4gPiA6IHNjYWxhcl9zdW1fb3A8Y29uc3Qgc3RkOjpjb21wbGV4PFQ+LCBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gPiB7fTsKKworCisvLyBEaWZmZXJlbmNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2NhbGFyX2RpZmZlcmVuY2Vfb3A8Y29uc3Qgc3RkOjpjb21wbGV4PFQ+LCBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gPiAgOiBiaW5hcnlfb3BfYmFzZTxjb25zdCBzdGQ6OmNvbXBsZXg8VD4sIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8VD4gcmVzdWx0X3R5cGU7CisKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2RpZmZlcmVuY2Vfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PFQ+IG9wZXJhdG9yKCkgKGNvbnN0IHN0ZDo6Y29tcGxleDxUPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiBiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxUPihudW1leHQ6OnJlYWwoYSkgLSBudW1leHQ6OnJlYWwoYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1leHQ6OmltYWcoYSkgLSBudW1leHQ6OmltYWcoYikpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2NhbGFyX2RpZmZlcmVuY2Vfb3A8c3RkOjpjb21wbGV4PFQ+LCBzdGQ6OmNvbXBsZXg8VD4gPiA6IHNjYWxhcl9kaWZmZXJlbmNlX29wPGNvbnN0IHN0ZDo6Y29tcGxleDxUPiwgY29uc3Qgc3RkOjpjb21wbGV4PFQ+ID4ge307CisKKworLy8gUHJvZHVjdAordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNjYWxhcl9wcm9kdWN0X29wPGNvbnN0IHN0ZDo6Y29tcGxleDxUPiwgY29uc3Qgc3RkOjpjb21wbGV4PFQ+ID4gIDogYmluYXJ5X29wX2Jhc2U8Y29uc3Qgc3RkOjpjb21wbGV4PFQ+LCBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gPiB7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PFQ+Pjo6SGFzTXVsCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PFQ+IHJlc3VsdF90eXBlOworCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9wcm9kdWN0X29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxUPiBvcGVyYXRvcigpIChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiYgYikgY29uc3QgeworICAgIGNvbnN0IFQgYV9yZWFsID0gbnVtZXh0OjpyZWFsKGEpOworICAgIGNvbnN0IFQgYV9pbWFnID0gbnVtZXh0OjppbWFnKGEpOworICAgIGNvbnN0IFQgYl9yZWFsID0gbnVtZXh0OjpyZWFsKGIpOworICAgIGNvbnN0IFQgYl9pbWFnID0gbnVtZXh0OjppbWFnKGIpOworICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8VD4oYV9yZWFsICogYl9yZWFsIC0gYV9pbWFnICogYl9pbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYV9yZWFsICogYl9pbWFnICsgYV9pbWFnICogYl9yZWFsKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNjYWxhcl9wcm9kdWN0X29wPHN0ZDo6Y29tcGxleDxUPiwgc3RkOjpjb21wbGV4PFQ+ID4gOiBzY2FsYXJfcHJvZHVjdF9vcDxjb25zdCBzdGQ6OmNvbXBsZXg8VD4sIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiA+IHt9OworCisKKy8vIFF1b3RpZW50Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50X29wPGNvbnN0IHN0ZDo6Y29tcGxleDxUPiwgY29uc3Qgc3RkOjpjb21wbGV4PFQ+ID4gOiBiaW5hcnlfb3BfYmFzZTxjb25zdCBzdGQ6OmNvbXBsZXg8VD4sIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiA+IHsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gcGFja2V0X3RyYWl0czxzdGQ6OmNvbXBsZXg8VD4+OjpIYXNEaXYKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8VD4gcmVzdWx0X3R5cGU7CisKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3F1b3RpZW50X29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxUPiBvcGVyYXRvcigpIChjb25zdCBzdGQ6OmNvbXBsZXg8VD4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiYgYikgY29uc3QgeworICAgIGNvbnN0IFQgYV9yZWFsID0gbnVtZXh0OjpyZWFsKGEpOworICAgIGNvbnN0IFQgYV9pbWFnID0gbnVtZXh0OjppbWFnKGEpOworICAgIGNvbnN0IFQgYl9yZWFsID0gbnVtZXh0OjpyZWFsKGIpOworICAgIGNvbnN0IFQgYl9pbWFnID0gbnVtZXh0OjppbWFnKGIpOworICAgIGNvbnN0IFQgbm9ybSA9IFQoMSkgLyAoYl9yZWFsICogYl9yZWFsICsgYl9pbWFnICogYl9pbWFnKTsKKyAgICByZXR1cm4gc3RkOjpjb21wbGV4PFQ+KChhX3JlYWwgKiBiX3JlYWwgKyBhX2ltYWcgKiBiX2ltYWcpICogbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChhX2ltYWcgKiBiX3JlYWwgLSBhX3JlYWwgKiBiX2ltYWcpICogbm9ybSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBzY2FsYXJfcXVvdGllbnRfb3A8c3RkOjpjb21wbGV4PFQ+LCBzdGQ6OmNvbXBsZXg8VD4gPiA6IHNjYWxhcl9xdW90aWVudF9vcDxjb25zdCBzdGQ6OmNvbXBsZXg8VD4sIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiA+IHt9OworCisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9DVURBX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ1VEQS9IYWxmLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvSGFsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGM1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvSGFsZi5oCkBAIC0wLDAgKzEsNjM1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKy8vCisvLyBUaGUgY29udmVyc2lvbiByb3V0aW5lcyBhcmUgQ29weXJpZ2h0IChjKSBGYWJpYW4gR2llc2VuLCAyMDE2LgorLy8gVGhlIG9yaWdpbmFsIGxpY2Vuc2UgZm9sbG93czoKKy8vCisvLyBDb3B5cmlnaHQgKGMpIEZhYmlhbiBHaWVzZW4sIDIwMTYKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZC4KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKy8vIFN0YW5kYXJkIDE2LWJpdCBmbG9hdCB0eXBlLCBtb3N0bHkgdXNlZnVsIGZvciBHUFVzLiBEZWZpbmVzIGEgbmV3CisvLyB0eXBlIEVpZ2VuOjpoYWxmIChpbmhlcml0aW5nIGZyb20gQ1VEQSdzIF9faGFsZiBzdHJ1Y3QpIHdpdGgKKy8vIG9wZXJhdG9yIG92ZXJsb2FkcyBzdWNoIHRoYXQgaXQgYmVoYXZlcyBiYXNpY2FsbHkgYXMgYW4gYXJpdGhtZXRpYworLy8gdHlwZS4gSXQgd2lsbCBiZSBxdWl0ZSBzbG93IG9uIENQVXMgKHNvIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXkKKy8vIGluIGZwMzIgZm9yIENQVXMsIGV4Y2VwdCBmb3Igc2ltcGxlIHBhcmFtZXRlciBjb252ZXJzaW9ucywgSS9PCisvLyB0byBkaXNrIGFuZCB0aGUgbGlrZXMpLCBidXQgZmFzdCBvbiBHUFVzLgorCisKKyNpZm5kZWYgRUlHRU5fSEFMRl9DVURBX0gKKyNkZWZpbmUgRUlHRU5fSEFMRl9DVURBX0gKKworI2lmIF9fY3BsdXNwbHVzID4gMTk5NzExTAorI2RlZmluZSBFSUdFTl9FWFBMSUNJVF9DQVNUKHRndF90eXBlKSBleHBsaWNpdCBvcGVyYXRvciB0Z3RfdHlwZSgpCisjZWxzZQorI2RlZmluZSBFSUdFTl9FWFBMSUNJVF9DQVNUKHRndF90eXBlKSBvcGVyYXRvciB0Z3RfdHlwZSgpCisjZW5kaWYKKworCituYW1lc3BhY2UgRWlnZW4geworCitzdHJ1Y3QgaGFsZjsKKworbmFtZXNwYWNlIGhhbGZfaW1wbCB7CisKKyNpZiAhZGVmaW5lZChFSUdFTl9IQVNfQ1VEQV9GUDE2KQorCisvLyBNYWtlIG91ciBvd24gX19oYWxmIGRlZmluaXRpb24gdGhhdCBpcyBzaW1pbGFyIHRvIENVREEncy4KK3N0cnVjdCBfX2hhbGYgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBfX2hhbGYoKSB7fQorICBleHBsaWNpdCBFSUdFTl9ERVZJQ0VfRlVOQyBfX2hhbGYodW5zaWduZWQgc2hvcnQgcmF3KSA6IHgocmF3KSB7fQorICB1bnNpZ25lZCBzaG9ydCB4OworfTsKKworI2VuZGlmCisKK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgX19oYWxmIHJhd191aW50MTZfdG9faGFsZih1bnNpZ25lZCBzaG9ydCB4KTsKK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgX19oYWxmIGZsb2F0X3RvX2hhbGZfcnRuZShmbG9hdCBmZik7CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGZsb2F0IGhhbGZfdG9fZmxvYXQoX19oYWxmIGgpOworCitzdHJ1Y3QgaGFsZl9iYXNlIDogcHVibGljIF9faGFsZiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGZfYmFzZSgpIHt9CisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGZfYmFzZShjb25zdCBoYWxmX2Jhc2UmIGgpIDogX19oYWxmKGgpIHt9CisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGZfYmFzZShjb25zdCBfX2hhbGYmIGgpIDogX19oYWxmKGgpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZSBoYWxmX2ltcGwKKworLy8gQ2xhc3MgZGVmaW5pdGlvbi4KK3N0cnVjdCBoYWxmIDogcHVibGljIGhhbGZfaW1wbDo6aGFsZl9iYXNlIHsKKyAgI2lmICFkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpCisgICAgdHlwZWRlZiBoYWxmX2ltcGw6Ol9faGFsZiBfX2hhbGY7CisgICNlbmRpZgorCisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoY29uc3QgX19oYWxmJiBoKSA6IGhhbGZfaW1wbDo6aGFsZl9iYXNlKGgpIHt9CisgIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoY29uc3QgaGFsZiYgaCkgOiBoYWxmX2ltcGw6OmhhbGZfYmFzZShoKSB7fQorCisgIGV4cGxpY2l0IEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoYm9vbCBiKQorICAgICAgOiBoYWxmX2ltcGw6OmhhbGZfYmFzZShoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihiID8gMHgzYzAwIDogMCkpIHt9CisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIGV4cGxpY2l0IEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoY29uc3QgVCYgdmFsKQorICAgICAgOiBoYWxmX2ltcGw6OmhhbGZfYmFzZShoYWxmX2ltcGw6OmZsb2F0X3RvX2hhbGZfcnRuZShzdGF0aWNfY2FzdDxmbG9hdD4odmFsKSkpIHt9CisgIGV4cGxpY2l0IEVJR0VOX0RFVklDRV9GVU5DIGhhbGYoZmxvYXQgZikKKyAgICAgIDogaGFsZl9pbXBsOjpoYWxmX2Jhc2UoaGFsZl9pbXBsOjpmbG9hdF90b19oYWxmX3J0bmUoZikpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fRVhQTElDSVRfQ0FTVChib29sKSBjb25zdCB7CisgICAgLy8gKzAuMCBhbmQgLTAuMCBiZWNvbWUgZmFsc2UsIGV2ZXJ5dGhpbmcgZWxzZSBiZWNvbWVzIHRydWUuCisgICAgcmV0dXJuICh4ICYgMHg3ZmZmKSAhPSAwOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1Qoc2lnbmVkIGNoYXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KGhhbGZfaW1wbDo6aGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1QodW5zaWduZWQgY2hhcikgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihoYWxmX2ltcGw6OmhhbGZfdG9fZmxvYXQoKnRoaXMpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9FWFBMSUNJVF9DQVNUKHNob3J0KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNob3J0PihoYWxmX2ltcGw6OmhhbGZfdG9fZmxvYXQoKnRoaXMpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9FWFBMSUNJVF9DQVNUKHVuc2lnbmVkIHNob3J0KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihoYWxmX2ltcGw6OmhhbGZfdG9fZmxvYXQoKnRoaXMpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9FWFBMSUNJVF9DQVNUKGludCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGhhbGZfaW1wbDo6aGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1QodW5zaWduZWQgaW50KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaGFsZl9pbXBsOjpoYWxmX3RvX2Zsb2F0KCp0aGlzKSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fRVhQTElDSVRfQ0FTVChsb25nKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KGhhbGZfaW1wbDo6aGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1QodW5zaWduZWQgbG9uZykgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihoYWxmX2ltcGw6OmhhbGZfdG9fZmxvYXQoKnRoaXMpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9FWFBMSUNJVF9DQVNUKGxvbmcgbG9uZykgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGhhbGZfaW1wbDo6aGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1QodW5zaWduZWQgbG9uZyBsb25nKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0VYUExJQ0lUX0NBU1QoZmxvYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFsZl9pbXBsOjpoYWxmX3RvX2Zsb2F0KCp0aGlzKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9FWFBMSUNJVF9DQVNUKGRvdWJsZSkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGhhbGZfaW1wbDo6aGFsZl90b19mbG9hdCgqdGhpcykpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiYgb3BlcmF0b3I9KGNvbnN0IGhhbGYmIG90aGVyKSB7CisgICAgeCA9IG90aGVyLng7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCituYW1lc3BhY2UgaGFsZl9pbXBsIHsKKworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0NVREFfRlAxNikgJiYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDUzMAorCisvLyBJbnRyaW5zaWNzIGZvciBuYXRpdmUgZnAxNiBzdXBwb3J0LiBOb3RlIHRoYXQgb24gY3VycmVudCBoYXJkd2FyZSwKKy8vIHRoZXNlIGFyZSBubyBmYXN0ZXIgdGhhbiBmcDMyIGFyaXRobWV0aWMgKHlvdSBuZWVkIHRvIHVzZSB0aGUgaGFsZjIKKy8vIHZlcnNpb25zIHRvIGdldCB0aGUgQUxVIHNwZWVkIGluY3JlYXNlZCksIGJ1dCB5b3UgZG8gc2F2ZSB0aGUKKy8vIGNvbnZlcnNpb24gc3RlcHMgYmFjayBhbmQgZm9ydGguCisKK19fZGV2aWNlX18gaGFsZiBvcGVyYXRvciArIChjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIHJldHVybiBfX2hhZGQoYSwgYik7Cit9CitfX2RldmljZV9fIGhhbGYgb3BlcmF0b3IgKiAoY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gX19obXVsKGEsIGIpOworfQorX19kZXZpY2VfXyBoYWxmIG9wZXJhdG9yIC0gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIF9faHN1YihhLCBiKTsKK30KK19fZGV2aWNlX18gaGFsZiBvcGVyYXRvciAvIChjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIGZsb2F0IG51bSA9IF9faGFsZjJmbG9hdChhKTsKKyAgZmxvYXQgZGVub20gPSBfX2hhbGYyZmxvYXQoYik7CisgIHJldHVybiBfX2Zsb2F0MmhhbGYobnVtIC8gZGVub20pOworfQorX19kZXZpY2VfXyBoYWxmIG9wZXJhdG9yIC0gKGNvbnN0IGhhbGYmIGEpIHsKKyAgcmV0dXJuIF9faG5lZyhhKTsKK30KK19fZGV2aWNlX18gaGFsZiYgb3BlcmF0b3IgKz0gKGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgYSA9IGEgKyBiOworICByZXR1cm4gYTsKK30KK19fZGV2aWNlX18gaGFsZiYgb3BlcmF0b3IgKj0gKGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgYSA9IGEgKiBiOworICByZXR1cm4gYTsKK30KK19fZGV2aWNlX18gaGFsZiYgb3BlcmF0b3IgLT0gKGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgYSA9IGEgLSBiOworICByZXR1cm4gYTsKK30KK19fZGV2aWNlX18gaGFsZiYgb3BlcmF0b3IgLz0gKGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgYSA9IGEgLyBiOworICByZXR1cm4gYTsKK30KK19fZGV2aWNlX18gYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gX19oZXEoYSwgYik7Cit9CitfX2RldmljZV9fIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIF9faG5lKGEsIGIpOworfQorX19kZXZpY2VfXyBib29sIG9wZXJhdG9yIDwgKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIF9faGx0KGEsIGIpOworfQorX19kZXZpY2VfXyBib29sIG9wZXJhdG9yIDw9IChjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIHJldHVybiBfX2hsZShhLCBiKTsKK30KK19fZGV2aWNlX18gYm9vbCBvcGVyYXRvciA+IChjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIHJldHVybiBfX2hndChhLCBiKTsKK30KK19fZGV2aWNlX18gYm9vbCBvcGVyYXRvciA+PSAoY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gX19oZ2UoYSwgYik7Cit9CisKKyNlbHNlICAvLyBFbXVsYXRlIHN1cHBvcnQgZm9yIGhhbGYgZmxvYXRzCisKKy8vIERlZmluaXRpb25zIGZvciBDUFVzIGFuZCBvbGRlciBDVURBLCBtb3N0bHkgd29ya2luZyB0aHJvdWdoIGNvbnZlcnNpb24KKy8vIHRvL2Zyb20gZnAzMi4KKworRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBoYWxmIG9wZXJhdG9yICsgKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGhhbGYoZmxvYXQoYSkgKyBmbG9hdChiKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgb3BlcmF0b3IgKiAoY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gaGFsZihmbG9hdChhKSAqIGZsb2F0KGIpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBvcGVyYXRvciAtIChjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIHJldHVybiBoYWxmKGZsb2F0KGEpIC0gZmxvYXQoYikpOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBoYWxmIG9wZXJhdG9yIC8gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGhhbGYoZmxvYXQoYSkgLyBmbG9hdChiKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgb3BlcmF0b3IgLSAoY29uc3QgaGFsZiYgYSkgeworICBoYWxmIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBhLnggXiAweDgwMDA7CisgIHJldHVybiByZXN1bHQ7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYmIG9wZXJhdG9yICs9IChoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIGEgPSBoYWxmKGZsb2F0KGEpICsgZmxvYXQoYikpOworICByZXR1cm4gYTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiYgb3BlcmF0b3IgKj0gKGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgYSA9IGhhbGYoZmxvYXQoYSkgKiBmbG9hdChiKSk7CisgIHJldHVybiBhOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBoYWxmJiBvcGVyYXRvciAtPSAoaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICBhID0gaGFsZihmbG9hdChhKSAtIGZsb2F0KGIpKTsKKyAgcmV0dXJuIGE7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYmIG9wZXJhdG9yIC89IChoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisgIGEgPSBoYWxmKGZsb2F0KGEpIC8gZmxvYXQoYikpOworICByZXR1cm4gYTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gZmxvYXQoYSkgPT0gZmxvYXQoYik7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGZsb2F0KGEpICE9IGZsb2F0KGIpOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIG9wZXJhdG9yIDwgKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGZsb2F0KGEpIDwgZmxvYXQoYik7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3IgPD0gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGZsb2F0KGEpIDw9IGZsb2F0KGIpOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIG9wZXJhdG9yID4gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGZsb2F0KGEpID4gZmxvYXQoYik7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyAgcmV0dXJuIGZsb2F0KGEpID49IGZsb2F0KGIpOworfQorCisjZW5kaWYgIC8vIEVtdWxhdGUgc3VwcG9ydCBmb3IgaGFsZiBmbG9hdHMKKworLy8gRGl2aXNpb24gYnkgYW4gaW5kZXguIERvIGl0IGluIGZ1bGwgZmxvYXQgcHJlY2lzaW9uIHRvIGF2b2lkIGFjY3VyYWN5CisvLyBpc3N1ZXMgaW4gY29udmVydGluZyB0aGUgZGVub21pbmF0b3IgdG8gaGFsZi4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBvcGVyYXRvciAvIChjb25zdCBoYWxmJiBhLCBJbmRleCBiKSB7CisgIHJldHVybiBoYWxmKHN0YXRpY19jYXN0PGZsb2F0PihhKSAvIHN0YXRpY19jYXN0PGZsb2F0PihiKSk7Cit9CisKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGluY2x1ZGluZyBmYWxsYmFja3MgZm9yIHRoZSBob3N0IG9yIG9sZGVyIENVREEuCisvLyBOb3RlIHRoYXQgbmV3ZXIgSW50ZWwgQ1BVcyAoSGFzd2VsbCBvciBuZXdlcikgaGF2ZSB2ZWN0b3JpemVkIHZlcnNpb25zIG9mCisvLyB0aGVzZSBpbiBoYXJkd2FyZS4gSWYgd2UgbmVlZCBtb3JlIHBlcmZvcm1hbmNlIG9uIG9sZGVyL290aGVyIENQVXMsIHRoZXkgYXJlCisvLyBhbHNvIHBvc3NpYmxlIHRvIHZlY3Rvcml6ZSBkaXJlY3RseS4KKworRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBfX2hhbGYgcmF3X3VpbnQxNl90b19oYWxmKHVuc2lnbmVkIHNob3J0IHgpIHsKKyAgX19oYWxmIGg7CisgIGgueCA9IHg7CisgIHJldHVybiBoOworfQorCit1bmlvbiBGUDMyIHsKKyAgdW5zaWduZWQgaW50IHU7CisgIGZsb2F0IGY7Cit9OworCitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIF9faGFsZiBmbG9hdF90b19oYWxmX3J0bmUoZmxvYXQgZmYpIHsKKyNpZiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpICYmIGRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgX19DVURBX0FSQ0hfXyA+PSAzMDAKKyAgcmV0dXJuIF9fZmxvYXQyaGFsZihmZik7CisKKyNlbGlmIGRlZmluZWQoRUlHRU5fSEFTX0ZQMTZfQykKKyAgX19oYWxmIGg7CisgIGgueCA9IF9jdnRzc19zaChmZiwgMCk7CisgIHJldHVybiBoOworCisjZWxzZQorICBGUDMyIGY7IGYuZiA9IGZmOworCisgIGNvbnN0IEZQMzIgZjMyaW5mdHkgPSB7IDI1NSA8PCAyMyB9OworICBjb25zdCBGUDMyIGYxNm1heCA9IHsgKDEyNyArIDE2KSA8PCAyMyB9OworICBjb25zdCBGUDMyIGRlbm9ybV9tYWdpYyA9IHsgKCgxMjcgLSAxNSkgKyAoMjMgLSAxMCkgKyAxKSA8PCAyMyB9OworICB1bnNpZ25lZCBpbnQgc2lnbl9tYXNrID0gMHg4MDAwMDAwMHU7CisgIF9faGFsZiBvOworICBvLnggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMHgwdSk7CisKKyAgdW5zaWduZWQgaW50IHNpZ24gPSBmLnUgJiBzaWduX21hc2s7CisgIGYudSBePSBzaWduOworCisgIC8vIE5PVEUgYWxsIHRoZSBpbnRlZ2VyIGNvbXBhcmVzIGluIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHNhZmVseQorICAvLyBjb21waWxlZCBpbnRvIHNpZ25lZCBjb21wYXJlcyBzaW5jZSBhbGwgb3BlcmFuZHMgYXJlIGJlbG93CisgIC8vIDB4ODAwMDAwMDAuIEltcG9ydGFudCBpZiB5b3Ugd2FudCBmYXN0IHN0cmFpZ2h0IFNTRTIgY29kZQorICAvLyAoc2luY2UgdGhlcmUncyBubyB1bnNpZ25lZCBQQ01QR1REKS4KKworICBpZiAoZi51ID49IGYxNm1heC51KSB7ICAvLyByZXN1bHQgaXMgSW5mIG9yIE5hTiAoYWxsIGV4cG9uZW50IGJpdHMgc2V0KQorICAgIG8ueCA9IChmLnUgPiBmMzJpbmZ0eS51KSA/IDB4N2UwMCA6IDB4N2MwMDsgLy8gTmFOLT5xTmFOIGFuZCBJbmYtPkluZgorICB9IGVsc2UgeyAgLy8gKERlKW5vcm1hbGl6ZWQgbnVtYmVyIG9yIHplcm8KKyAgICBpZiAoZi51IDwgKDExMyA8PCAyMykpIHsgIC8vIHJlc3VsdGluZyBGUDE2IGlzIHN1Ym5vcm1hbCBvciB6ZXJvCisgICAgICAvLyB1c2UgYSBtYWdpYyB2YWx1ZSB0byBhbGlnbiBvdXIgMTAgbWFudGlzc2EgYml0cyBhdCB0aGUgYm90dG9tIG9mCisgICAgICAvLyB0aGUgZmxvYXQuIGFzIGxvbmcgYXMgRlAgYWRkaXRpb24gaXMgcm91bmQtdG8tbmVhcmVzdC1ldmVuIHRoaXMKKyAgICAgIC8vIGp1c3Qgd29ya3MuCisgICAgICBmLmYgKz0gZGVub3JtX21hZ2ljLmY7CisKKyAgICAgIC8vIGFuZCBvbmUgaW50ZWdlciBzdWJ0cmFjdCBvZiB0aGUgYmlhcyBsYXRlciwgd2UgaGF2ZSBvdXIgZmluYWwgZmxvYXQhCisgICAgICBvLnggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oZi51IC0gZGVub3JtX21hZ2ljLnUpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBpbnQgbWFudF9vZGQgPSAoZi51ID4+IDEzKSAmIDE7IC8vIHJlc3VsdGluZyBtYW50aXNzYSBpcyBvZGQKKworICAgICAgLy8gdXBkYXRlIGV4cG9uZW50LCByb3VuZGluZyBiaWFzIHBhcnQgMQorICAgICAgZi51ICs9ICgodW5zaWduZWQgaW50KSgxNSAtIDEyNykgPDwgMjMpICsgMHhmZmY7CisgICAgICAvLyByb3VuZGluZyBiaWFzIHBhcnQgMgorICAgICAgZi51ICs9IG1hbnRfb2RkOworICAgICAgLy8gdGFrZSB0aGUgYml0cyEKKyAgICAgIG8ueCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihmLnUgPj4gMTMpOworICAgIH0KKyAgfQorCisgIG8ueCB8PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oc2lnbiA+PiAxNik7CisgIHJldHVybiBvOworI2VuZGlmCit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgZmxvYXQgaGFsZl90b19mbG9hdChfX2hhbGYgaCkgeworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0NVREFfRlAxNikgJiYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDMwMAorICByZXR1cm4gX19oYWxmMmZsb2F0KGgpOworCisjZWxpZiBkZWZpbmVkKEVJR0VOX0hBU19GUDE2X0MpCisgIHJldHVybiBfY3Z0c2hfc3MoaC54KTsKKworI2Vsc2UKKyAgY29uc3QgRlAzMiBtYWdpYyA9IHsgMTEzIDw8IDIzIH07CisgIGNvbnN0IHVuc2lnbmVkIGludCBzaGlmdGVkX2V4cCA9IDB4N2MwMCA8PCAxMzsgLy8gZXhwb25lbnQgbWFzayBhZnRlciBzaGlmdAorICBGUDMyIG87CisKKyAgby51ID0gKGgueCAmIDB4N2ZmZikgPDwgMTM7ICAgICAgICAgICAgIC8vIGV4cG9uZW50L21hbnRpc3NhIGJpdHMKKyAgdW5zaWduZWQgaW50IGV4cCA9IHNoaWZ0ZWRfZXhwICYgby51OyAgIC8vIGp1c3QgdGhlIGV4cG9uZW50CisgIG8udSArPSAoMTI3IC0gMTUpIDw8IDIzOyAgICAgICAgICAgICAgICAvLyBleHBvbmVudCBhZGp1c3QKKworICAvLyBoYW5kbGUgZXhwb25lbnQgc3BlY2lhbCBjYXNlcworICBpZiAoZXhwID09IHNoaWZ0ZWRfZXhwKSB7ICAgICAvLyBJbmYvTmFOPworICAgIG8udSArPSAoMTI4IC0gMTYpIDw8IDIzOyAgICAvLyBleHRyYSBleHAgYWRqdXN0CisgIH0gZWxzZSBpZiAoZXhwID09IDApIHsgICAgICAgIC8vIFplcm8vRGVub3JtYWw/CisgICAgby51ICs9IDEgPDwgMjM7ICAgICAgICAgICAgIC8vIGV4dHJhIGV4cCBhZGp1c3QKKyAgICBvLmYgLT0gbWFnaWMuZjsgICAgICAgICAgICAgLy8gcmVub3JtYWxpemUKKyAgfQorCisgIG8udSB8PSAoaC54ICYgMHg4MDAwKSA8PCAxNjsgICAgLy8gc2lnbiBiaXQKKyAgcmV0dXJuIG8uZjsKKyNlbmRpZgorfQorCisvLyAtLS0gc3RhbmRhcmQgZnVuY3Rpb25zIC0tLQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgKGlzaW5mKShjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiAoYS54ICYgMHg3ZmZmKSA9PSAweDdjMDA7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgKGlzbmFuKShjb25zdCBoYWxmJiBhKSB7CisjaWYgZGVmaW5lZChFSUdFTl9IQVNfQ1VEQV9GUDE2KSAmJiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIHJldHVybiBfX2hpc25hbihhKTsKKyNlbHNlCisgIHJldHVybiAoYS54ICYgMHg3ZmZmKSA+IDB4N2MwMDsKKyNlbmRpZgorfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIChpc2Zpbml0ZSkoY29uc3QgaGFsZiYgYSkgeworICByZXR1cm4gIShpc2luZiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkpICYmICEoaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBoYWxmIGFicyhjb25zdCBoYWxmJiBhKSB7CisgIGhhbGYgcmVzdWx0OworICByZXN1bHQueCA9IGEueCAmIDB4N0ZGRjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBleHAoY29uc3QgaGFsZiYgYSkgeworICByZXR1cm4gaGFsZig6OmV4cGYoZmxvYXQoYSkpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBsb2coY29uc3QgaGFsZiYgYSkgeworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0NVREFfRlAxNikgJiYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA4MDAwMCAmJiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIHJldHVybiBFaWdlbjo6aGFsZig6Omhsb2coYSkpOworI2Vsc2UKKyAgcmV0dXJuIGhhbGYoOjpsb2dmKGZsb2F0KGEpKSk7CisjZW5kaWYKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBsb2cxcChjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKG51bWV4dDo6bG9nMXAoZmxvYXQoYSkpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBsb2cxMChjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKDo6bG9nMTBmKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgc3FydChjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKDo6c3FydGYoZmxvYXQoYSkpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBwb3coY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikgeworICByZXR1cm4gaGFsZig6OnBvd2YoZmxvYXQoYSksIGZsb2F0KGIpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgc2luKGNvbnN0IGhhbGYmIGEpIHsKKyAgcmV0dXJuIGhhbGYoOjpzaW5mKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgY29zKGNvbnN0IGhhbGYmIGEpIHsKKyAgcmV0dXJuIGhhbGYoOjpjb3NmKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgdGFuKGNvbnN0IGhhbGYmIGEpIHsKKyAgcmV0dXJuIGhhbGYoOjp0YW5mKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgdGFuaChjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKDo6dGFuaGYoZmxvYXQoYSkpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiBmbG9vcihjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKDo6Zmxvb3JmKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGhhbGYgY2VpbChjb25zdCBoYWxmJiBhKSB7CisgIHJldHVybiBoYWxmKDo6Y2VpbGYoZmxvYXQoYSkpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBoYWxmIChtaW4pKGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpIHsKKyNpZiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpICYmIGRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgX19DVURBX0FSQ0hfXyA+PSA1MzAKKyAgcmV0dXJuIF9faGx0KGIsIGEpID8gYiA6IGE7CisjZWxzZQorICBjb25zdCBmbG9hdCBmMSA9IHN0YXRpY19jYXN0PGZsb2F0PihhKTsKKyAgY29uc3QgZmxvYXQgZjIgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYik7CisgIHJldHVybiBmMiA8IGYxID8gYiA6IGE7CisjZW5kaWYKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgaGFsZiAobWF4KShjb25zdCBoYWxmJiBhLCBjb25zdCBoYWxmJiBiKSB7CisjaWYgZGVmaW5lZChFSUdFTl9IQVNfQ1VEQV9GUDE2KSAmJiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIHJldHVybiBfX2hsdChhLCBiKSA/IGIgOiBhOworI2Vsc2UKKyAgY29uc3QgZmxvYXQgZjEgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYSk7CisgIGNvbnN0IGZsb2F0IGYyID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpOworICByZXR1cm4gZjEgPCBmMiA/IGIgOiBhOworI2VuZGlmCit9CisKK0VJR0VOX0FMV0FZU19JTkxJTkUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgaGFsZiYgdikgeworICBvcyA8PCBzdGF0aWNfY2FzdDxmbG9hdD4odik7CisgIHJldHVybiBvczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGhhbGZfaW1wbAorCisvLyBpbXBvcnQgRWlnZW46OmhhbGZfaW1wbDo6aGFsZiBpbnRvIEVpZ2VuIG5hbWVzcGFjZQorLy8gdXNpbmcgaGFsZl9pbXBsOjpoYWxmOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgcmFuZG9tX2RlZmF1bHRfaW1wbDxoYWxmLCBmYWxzZSwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgaGFsZiBydW4oY29uc3QgaGFsZiYgeCwgY29uc3QgaGFsZiYgeSkKKyAgeworICAgIHJldHVybiB4ICsgKHkteCkgKiBoYWxmKGZsb2F0KHN0ZDo6cmFuZCgpKSAvIGZsb2F0KFJBTkRfTUFYKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBoYWxmIHJ1bigpCisgIHsKKyAgICByZXR1cm4gcnVuKGhhbGYoLTEuZiksIGhhbGYoMS5mKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8aGFsZj4geyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGU8Pgorc3RydWN0IG51bWVyaWNfbGltaXRzPEVpZ2VuOjpoYWxmPiB7CisgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSB0cnVlOworICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gdHJ1ZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSB0cnVlOworICBzdGF0aWMgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fcHJlc2VudDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisgIHN0YXRpYyBjb25zdCBzdGQ6OmZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gc3RkOjpyb3VuZF90b19uZWFyZXN0OworICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IGZhbHNlOworICBzdGF0aWMgY29uc3QgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKyAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSAxMTsKKyAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDI7CisgIC8vc3RhdGljIGNvbnN0IGludCBtYXhfZGlnaXRzMTAgPSA7CisgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOworICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCA9IC0xMzsKKyAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQxMCA9IC00OworICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDE2OworICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudDEwID0gNDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSB0cnVlOworICBzdGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKworICBzdGF0aWMgRWlnZW46OmhhbGYgKG1pbikoKSB7IHJldHVybiBFaWdlbjo6aGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHg0MDApOyB9CisgIHN0YXRpYyBFaWdlbjo6aGFsZiBsb3dlc3QoKSB7IHJldHVybiBFaWdlbjo6aGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHhmYmZmKTsgfQorICBzdGF0aWMgRWlnZW46OmhhbGYgKG1heCkoKSB7IHJldHVybiBFaWdlbjo6aGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHg3YmZmKTsgfQorICBzdGF0aWMgRWlnZW46OmhhbGYgZXBzaWxvbigpIHsgcmV0dXJuIEVpZ2VuOjpoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZigweDA4MDApOyB9CisgIHN0YXRpYyBFaWdlbjo6aGFsZiByb3VuZF9lcnJvcigpIHsgcmV0dXJuIEVpZ2VuOjpoYWxmKDAuNSk7IH0KKyAgc3RhdGljIEVpZ2VuOjpoYWxmIGluZmluaXR5KCkgeyByZXR1cm4gRWlnZW46OmhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKDB4N2MwMCk7IH0KKyAgc3RhdGljIEVpZ2VuOjpoYWxmIHF1aWV0X05hTigpIHsgcmV0dXJuIEVpZ2VuOjpoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZigweDdlMDApOyB9CisgIHN0YXRpYyBFaWdlbjo6aGFsZiBzaWduYWxpbmdfTmFOKCkgeyByZXR1cm4gRWlnZW46OmhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKDB4N2UwMCk7IH0KKyAgc3RhdGljIEVpZ2VuOjpoYWxmIGRlbm9ybV9taW4oKSB7IHJldHVybiBFaWdlbjo6aGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHgxKTsgfQorfTsKK30KKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPEVpZ2VuOjpoYWxmPgorICAgIDogR2VuZXJpY051bVRyYWl0czxFaWdlbjo6aGFsZj4KK3sKKyAgZW51bSB7CisgICAgSXNTaWduZWQgPSB0cnVlLAorICAgIElzSW50ZWdlciA9IGZhbHNlLAorICAgIElzQ29tcGxleCA9IGZhbHNlLAorICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgZXBzaWxvbigpIHsKKyAgICByZXR1cm4gaGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHgwODAwKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBkdW1teV9wcmVjaXNpb24oKSB7IHJldHVybiBFaWdlbjo6aGFsZigxZS0yZik7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgaGlnaGVzdCgpIHsKKyAgICByZXR1cm4gaGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoMHg3YmZmKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBsb3dlc3QoKSB7CisgICAgcmV0dXJuIGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKDB4ZmJmZik7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgaW5maW5pdHkoKSB7CisgICAgcmV0dXJuIGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKDB4N2MwMCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgcXVpZXRfTmFOKCkgeworICAgIHJldHVybiBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZigweDdjMDEpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworLy8gQy1saWtlIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgYW5kIHRyYW5jZW5kZW50YWxzLgorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBmYWJzaChjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworICBFaWdlbjo6aGFsZiByZXN1bHQ7CisgIHJlc3VsdC54ID0gYS54ICYgMHg3RkZGOworICByZXR1cm4gcmVzdWx0OworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBleHBoKGNvbnN0IEVpZ2VuOjpoYWxmJiBhKSB7CisgIHJldHVybiBFaWdlbjo6aGFsZig6OmV4cGYoZmxvYXQoYSkpKTsKK30KK0VJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgRWlnZW46OmhhbGYgbG9naChjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworI2lmIGRlZmluZWQgX19DVURBQ0NfVkVSX18gJiYgX19DVURBQ0NfVkVSX18gPj0gODAwMDAgJiYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDUzMAorICByZXR1cm4gRWlnZW46OmhhbGYoOjpobG9nKGEpKTsKKyNlbHNlCisgIHJldHVybiBFaWdlbjo6aGFsZig6OmxvZ2YoZmxvYXQoYSkpKTsKKyNlbmRpZgorfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBzcXJ0aChjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworICByZXR1cm4gRWlnZW46OmhhbGYoOjpzcXJ0ZihmbG9hdChhKSkpOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBwb3doKGNvbnN0IEVpZ2VuOjpoYWxmJiBhLCBjb25zdCBFaWdlbjo6aGFsZiYgYikgeworICByZXR1cm4gRWlnZW46OmhhbGYoOjpwb3dmKGZsb2F0KGEpLCBmbG9hdChiKSkpOworfQorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBmbG9vcmgoY29uc3QgRWlnZW46OmhhbGYmIGEpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKDo6Zmxvb3JmKGZsb2F0KGEpKSk7Cit9CitFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEVpZ2VuOjpoYWxmIGNlaWxoKGNvbnN0IEVpZ2VuOjpoYWxmJiBhKSB7CisgIHJldHVybiBFaWdlbjo6aGFsZig6OmNlaWxmKGZsb2F0KGEpKSk7Cit9CisKK25hbWVzcGFjZSBzdGQgeworCisjaWYgX19jcGx1c3BsdXMgPiAxOTk3MTFMCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8RWlnZW46OmhhbGY+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEVpZ2VuOjpoYWxmJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihhLngpOworICB9Cit9OworI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdGQKKworCisvLyBBZGQgdGhlIG1pc3Npbmcgc2hmbF94b3IgaW50cmluc2ljCisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDMwMAorX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIF9fc2hmbF94b3IoRWlnZW46OmhhbGYgdmFyLCBpbnQgbGFuZU1hc2ssIGludCB3aWR0aD13YXJwU2l6ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8RWlnZW46OmhhbGY+KF9fc2hmbF94b3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhciksIGxhbmVNYXNrLCB3aWR0aCkpOworfQorI2VuZGlmCisKKy8vIGxkZygpIGhhcyBhbiBvdmVybG9hZCBmb3IgX19oYWxmLCBidXQgd2UgYWxzbyBuZWVkIG9uZSBmb3IgRWlnZW46OmhhbGYuCisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDM1MAorRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBfX2xkZyhjb25zdCBFaWdlbjo6aGFsZiogcHRyKSB7CisgIHJldHVybiBFaWdlbjo6aGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoCisgICAgICBfX2xkZyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4ocHRyKSkpOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoX19DVURBX0FSQ0hfXykKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgbnVtZXh0IHsKKwordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorYm9vbCAoaXNuYW4pKGNvbnN0IEVpZ2VuOjpoYWxmJiBoKSB7CisgIHJldHVybiAoaGFsZl9pbXBsOjppc25hbikoaCk7Cit9CisKK3RlbXBsYXRlPD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Jvb2wgKGlzaW5mKShjb25zdCBFaWdlbjo6aGFsZiYgaCkgeworICByZXR1cm4gKGhhbGZfaW1wbDo6aXNpbmYpKGgpOworfQorCit0ZW1wbGF0ZTw+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitib29sIChpc2Zpbml0ZSkoY29uc3QgRWlnZW46OmhhbGYmIGgpIHsKKyAgcmV0dXJuIChoYWxmX2ltcGw6OmlzZmluaXRlKShoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgRWlnZW4KK30gIC8vIG5hbWVzcGFjZSBudW1leHQKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fSEFMRl9DVURBX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ1VEQS9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDhiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvTWF0aEZ1bmN0aW9ucy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUSF9GVU5DVElPTlNfQ1VEQV9ICisjZGVmaW5lIEVJR0VOX01BVEhfRlVOQ1RJT05TX0NVREFfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBNYWtlIHN1cmUgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBhIEdQVTogd2UgZG9uJ3Qgd2FudCB0bworLy8gaW50cm9kdWNlIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZXNlIHBhY2tldF90cmFpdHMgZGVmaW5pdGlvbnMgYW5kIHRoZSBvbmVzCisvLyB3ZSdsbCB1c2Ugb24gdGhlIGhvc3Qgc2lkZSAoU1NFLCBBVlgsIC4uLikKKyNpZiBkZWZpbmVkKF9fQ1VEQUNDX18pICYmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZmxvYXQ0IHBsb2c8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEpCit7CisgIHJldHVybiBtYWtlX2Zsb2F0NChsb2dmKGEueCksIGxvZ2YoYS55KSwgbG9nZihhLnopLCBsb2dmKGEudykpOworfQorCit0ZW1wbGF0ZTw+ICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBsb2c8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSkKK3sKKyAgdXNpbmcgOjpsb2c7CisgIHJldHVybiBtYWtlX2RvdWJsZTIobG9nKGEueCksIGxvZyhhLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcGxvZzFwPGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKQoreworICByZXR1cm4gbWFrZV9mbG9hdDQobG9nMXBmKGEueCksIGxvZzFwZihhLnkpLCBsb2cxcGYoYS56KSwgbG9nMXBmKGEudykpOworfQorCit0ZW1wbGF0ZTw+ICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBsb2cxcDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhKQoreworICByZXR1cm4gbWFrZV9kb3VibGUyKGxvZzFwKGEueCksIGxvZzFwKGEueSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2Zsb2F0NCBwZXhwPGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKQoreworICByZXR1cm4gbWFrZV9mbG9hdDQoZXhwZihhLngpLCBleHBmKGEueSksIGV4cGYoYS56KSwgZXhwZihhLncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBleHA8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSkKK3sKKyAgdXNpbmcgOjpleHA7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZXhwKGEueCksIGV4cChhLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcHNxcnQ8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEpCit7CisgIHJldHVybiBtYWtlX2Zsb2F0NChzcXJ0ZihhLngpLCBzcXJ0ZihhLnkpLCBzcXJ0ZihhLnopLCBzcXJ0ZihhLncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBzcXJ0PGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEpCit7CisgIHVzaW5nIDo6c3FydDsKKyAgcmV0dXJuIG1ha2VfZG91YmxlMihzcXJ0KGEueCksIHNxcnQoYS55KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZmxvYXQ0IHByc3FydDxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSkKK3sKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KHJzcXJ0ZihhLngpLCByc3FydGYoYS55KSwgcnNxcnRmKGEueiksIHJzcXJ0ZihhLncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHByc3FydDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhKQoreworICByZXR1cm4gbWFrZV9kb3VibGUyKHJzcXJ0KGEueCksIHJzcXJ0KGEueSkpOworfQorCisKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRIX0ZVTkNUSU9OU19DVURBX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ1VEQS9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGE2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsMzMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBQ0tFVF9NQVRIX0NVREFfSAorI2RlZmluZSBFSUdFTl9QQUNLRVRfTUFUSF9DVURBX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gTWFrZSBzdXJlIHRoaXMgaXMgb25seSBhdmFpbGFibGUgd2hlbiB0YXJnZXRpbmcgYSBHUFU6IHdlIGRvbid0IHdhbnQgdG8KKy8vIGludHJvZHVjZSBjb25mbGljdHMgYmV0d2VlbiB0aGVzZSBwYWNrZXRfdHJhaXRzIGRlZmluaXRpb25zIGFuZCB0aGUgb25lcworLy8gd2UnbGwgdXNlIG9uIHRoZSBob3N0IHNpZGUgKFNTRSwgQVZYLCAuLi4pCisjaWYgZGVmaW5lZChfX0NVREFDQ19fKSAmJiBkZWZpbmVkKEVJR0VOX1VTRV9HUFUpCit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPGZsb2F0ND4gIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxkb3VibGUyPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBmbG9hdDQgdHlwZTsKKyAgdHlwZWRlZiBmbG9hdDQgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemU9NCwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0RpdiAgPSAxLAorICAgIEhhc1NpbiAgPSAwLAorICAgIEhhc0NvcyAgPSAwLAorICAgIEhhc0xvZyAgPSAxLAorICAgIEhhc0V4cCAgPSAxLAorICAgIEhhc1NxcnQgPSAxLAorICAgIEhhc1JzcXJ0ID0gMSwKKyAgICBIYXNMR2FtbWEgPSAxLAorICAgIEhhc0RpR2FtbWEgPSAxLAorICAgIEhhc1pldGEgPSAxLAorICAgIEhhc1BvbHlnYW1tYSA9IDEsCisgICAgSGFzRXJmID0gMSwKKyAgICBIYXNFcmZjID0gMSwKKyAgICBIYXNJR2FtbWEgPSAxLAorICAgIEhhc0lHYW1tYWMgPSAxLAorICAgIEhhc0JldGFJbmMgPSAxLAorCisgICAgSGFzQmxlbmQgPSAwLAorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxkb3VibGU+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgZG91YmxlMiB0eXBlOworICB0eXBlZGVmIGRvdWJsZTIgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemU9MiwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0RpdiAgPSAxLAorICAgIEhhc0xvZyAgPSAxLAorICAgIEhhc0V4cCAgPSAxLAorICAgIEhhc1NxcnQgPSAxLAorICAgIEhhc1JzcXJ0ID0gMSwKKyAgICBIYXNMR2FtbWEgPSAxLAorICAgIEhhc0RpR2FtbWEgPSAxLAorICAgIEhhc1pldGEgPSAxLAorICAgIEhhc1BvbHlnYW1tYSA9IDEsCisgICAgSGFzRXJmID0gMSwKKyAgICBIYXNFcmZjID0gMSwKKyAgICBIYXNJR2FtbWEgPSAxLAorICAgIEhhc0lHYW1tYWMgPSAxLAorICAgIEhhc0JldGFJbmMgPSAxLAorCisgICAgSGFzQmxlbmQgPSAwLAorICB9OworfTsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8ZmxvYXQ0PiAgeyB0eXBlZGVmIGZsb2F0ICB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIGZsb2F0NCBoYWxmOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPGRvdWJsZTI+IHsgdHlwZWRlZiBkb3VibGUgdHlwZTsgZW51bSB7c2l6ZT0yLCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBkb3VibGUyIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcHNldDE8ZmxvYXQ0Pihjb25zdCBmbG9hdCYgIGZyb20pIHsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGZyb20sIGZyb20sIGZyb20sIGZyb20pOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZTIgcHNldDE8ZG91YmxlMj4oY29uc3QgZG91YmxlJiBmcm9tKSB7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZnJvbSwgZnJvbSk7Cit9CisKKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0NCBwbHNldDxmbG9hdDQ+KGNvbnN0IGZsb2F0JiBhKSB7CisgIHJldHVybiBtYWtlX2Zsb2F0NChhLCBhKzEsIGErMiwgYSszKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUyIHBsc2V0PGRvdWJsZTI+KGNvbnN0IGRvdWJsZSYgYSkgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGEsIGErMSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcGFkZDxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSwgY29uc3QgZmxvYXQ0JiBiKSB7CisgIHJldHVybiBtYWtlX2Zsb2F0NChhLngrYi54LCBhLnkrYi55LCBhLnorYi56LCBhLncrYi53KTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUyIHBhZGQ8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSwgY29uc3QgZG91YmxlMiYgYikgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGEueCtiLngsIGEueStiLnkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQ0IHBzdWI8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEsIGNvbnN0IGZsb2F0NCYgYikgeworICByZXR1cm4gbWFrZV9mbG9hdDQoYS54LWIueCwgYS55LWIueSwgYS56LWIueiwgYS53LWIudyk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlMiBwc3ViPGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEsIGNvbnN0IGRvdWJsZTImIGIpIHsKKyAgcmV0dXJuIG1ha2VfZG91YmxlMihhLngtYi54LCBhLnktYi55KTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0NCBwbmVnYXRlKGNvbnN0IGZsb2F0NCYgYSkgeworICByZXR1cm4gbWFrZV9mbG9hdDQoLWEueCwgLWEueSwgLWEueiwgLWEudyk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlMiBwbmVnYXRlKGNvbnN0IGRvdWJsZTImIGEpIHsKKyAgcmV0dXJuIG1ha2VfZG91YmxlMigtYS54LCAtYS55KTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0NCBwY29uaihjb25zdCBmbG9hdDQmIGEpIHsgcmV0dXJuIGE7IH0KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUyIHBjb25qKGNvbnN0IGRvdWJsZTImIGEpIHsgcmV0dXJuIGE7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0NCBwbXVsPGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhLCBjb25zdCBmbG9hdDQmIGIpIHsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGEueCpiLngsIGEueSpiLnksIGEueipiLnosIGEudypiLncpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZTIgcG11bDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhLCBjb25zdCBkb3VibGUyJiBiKSB7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoYS54KmIueCwgYS55KmIueSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcGRpdjxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSwgY29uc3QgZmxvYXQ0JiBiKSB7CisgIHJldHVybiBtYWtlX2Zsb2F0NChhLngvYi54LCBhLnkvYi55LCBhLnovYi56LCBhLncvYi53KTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUyIHBkaXY8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSwgY29uc3QgZG91YmxlMiYgYikgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGEueC9iLngsIGEueS9iLnkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQ0IHBtaW48ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEsIGNvbnN0IGZsb2F0NCYgYikgeworICByZXR1cm4gbWFrZV9mbG9hdDQoZm1pbmYoYS54LCBiLngpLCBmbWluZihhLnksIGIueSksIGZtaW5mKGEueiwgYi56KSwgZm1pbmYoYS53LCBiLncpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUyIHBtaW48ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSwgY29uc3QgZG91YmxlMiYgYikgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGZtaW4oYS54LCBiLngpLCBmbWluKGEueSwgYi55KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcG1heDxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSwgY29uc3QgZmxvYXQ0JiBiKSB7CisgIHJldHVybiBtYWtlX2Zsb2F0NChmbWF4ZihhLngsIGIueCksIGZtYXhmKGEueSwgYi55KSwgZm1heGYoYS56LCBiLnopLCBmbWF4ZihhLncsIGIudykpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZTIgcG1heDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhLCBjb25zdCBkb3VibGUyJiBiKSB7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZm1heChhLngsIGIueCksIGZtYXgoYS55LCBiLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0NCBwbG9hZDxmbG9hdDQ+KGNvbnN0IGZsb2F0KiBmcm9tKSB7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDQqPihmcm9tKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZTIgcGxvYWQ8ZG91YmxlMj4oY29uc3QgZG91YmxlKiBmcm9tKSB7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBkb3VibGUyKj4oZnJvbSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcGxvYWR1PGZsb2F0ND4oY29uc3QgZmxvYXQqIGZyb20pIHsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGZyb21bMF0sIGZyb21bMV0sIGZyb21bMl0sIGZyb21bM10pOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZTIgcGxvYWR1PGRvdWJsZTI+KGNvbnN0IGRvdWJsZSogZnJvbSkgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGZyb21bMF0sIGZyb21bMV0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQ0IHBsb2FkZHVwPGZsb2F0ND4oY29uc3QgZmxvYXQqICAgZnJvbSkgeworICByZXR1cm4gbWFrZV9mbG9hdDQoZnJvbVswXSwgZnJvbVswXSwgZnJvbVsxXSwgZnJvbVsxXSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlMiBwbG9hZGR1cDxkb3VibGUyPihjb25zdCBkb3VibGUqICBmcm9tKSB7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZnJvbVswXSwgZnJvbVswXSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxmbG9hdD4oZmxvYXQqICAgdG8sIGNvbnN0IGZsb2F0NCYgZnJvbSkgeworICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQqPih0bykgPSBmcm9tOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8ZG91YmxlPihkb3VibGUqIHRvLCBjb25zdCBkb3VibGUyJiBmcm9tKSB7CisgICpyZWludGVycHJldF9jYXN0PGRvdWJsZTIqPih0bykgPSBmcm9tOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGZsb2F0PihmbG9hdCogIHRvLCBjb25zdCBmbG9hdDQmIGZyb20pIHsKKyAgdG9bMF0gPSBmcm9tLng7CisgIHRvWzFdID0gZnJvbS55OworICB0b1syXSA9IGZyb20uejsKKyAgdG9bM10gPSBmcm9tLnc7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZG91YmxlPihkb3VibGUqIHRvLCBjb25zdCBkb3VibGUyJiBmcm9tKSB7CisgIHRvWzBdID0gZnJvbS54OworICB0b1sxXSA9IGZyb20ueTsKK30KKwordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBmbG9hdDQgcGxvYWR0X3JvPGZsb2F0NCwgQWxpZ25lZD4oY29uc3QgZmxvYXQqIGZyb20pIHsKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gMzUwCisgIHJldHVybiBfX2xkZygoY29uc3QgZmxvYXQ0Kilmcm9tKTsKKyNlbHNlCisgIHJldHVybiBtYWtlX2Zsb2F0NChmcm9tWzBdLCBmcm9tWzFdLCBmcm9tWzJdLCBmcm9tWzNdKTsKKyNlbmRpZgorfQordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBkb3VibGUyIHBsb2FkdF9ybzxkb3VibGUyLCBBbGlnbmVkPihjb25zdCBkb3VibGUqIGZyb20pIHsKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gMzUwCisgIHJldHVybiBfX2xkZygoY29uc3QgZG91YmxlMiopZnJvbSk7CisjZWxzZQorICByZXR1cm4gbWFrZV9kb3VibGUyKGZyb21bMF0sIGZyb21bMV0pOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgZmxvYXQ0IHBsb2FkdF9ybzxmbG9hdDQsIFVuYWxpZ25lZD4oY29uc3QgZmxvYXQqIGZyb20pIHsKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gMzUwCisgIHJldHVybiBtYWtlX2Zsb2F0NChfX2xkZyhmcm9tKzApLCBfX2xkZyhmcm9tKzEpLCBfX2xkZyhmcm9tKzIpLCBfX2xkZyhmcm9tKzMpKTsKKyNlbHNlCisgIHJldHVybiBtYWtlX2Zsb2F0NChmcm9tWzBdLCBmcm9tWzFdLCBmcm9tWzJdLCBmcm9tWzNdKTsKKyNlbmRpZgorfQordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBkb3VibGUyIHBsb2FkdF9ybzxkb3VibGUyLCBVbmFsaWduZWQ+KGNvbnN0IGRvdWJsZSogZnJvbSkgeworI2lmIGRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgX19DVURBX0FSQ0hfXyA+PSAzNTAKKyAgcmV0dXJuIG1ha2VfZG91YmxlMihfX2xkZyhmcm9tKzApLCBfX2xkZyhmcm9tKzEpKTsKKyNlbHNlCisgIHJldHVybiBtYWtlX2RvdWJsZTIoZnJvbVswXSwgZnJvbVsxXSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZmxvYXQ0IHBnYXRoZXI8ZmxvYXQsIGZsb2F0ND4oY29uc3QgZmxvYXQqIGZyb20sIEluZGV4IHN0cmlkZSkgeworICByZXR1cm4gbWFrZV9mbG9hdDQoZnJvbVswKnN0cmlkZV0sIGZyb21bMSpzdHJpZGVdLCBmcm9tWzIqc3RyaWRlXSwgZnJvbVszKnN0cmlkZV0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBkb3VibGUyIHBnYXRoZXI8ZG91YmxlLCBkb3VibGUyPihjb25zdCBkb3VibGUqIGZyb20sIEluZGV4IHN0cmlkZSkgeworICByZXR1cm4gbWFrZV9kb3VibGUyKGZyb21bMCpzdHJpZGVdLCBmcm9tWzEqc3RyaWRlXSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZmxvYXQsIGZsb2F0ND4oZmxvYXQqIHRvLCBjb25zdCBmbG9hdDQmIGZyb20sIEluZGV4IHN0cmlkZSkgeworICB0b1tzdHJpZGUqMF0gPSBmcm9tLng7CisgIHRvW3N0cmlkZSoxXSA9IGZyb20ueTsKKyAgdG9bc3RyaWRlKjJdID0gZnJvbS56OworICB0b1tzdHJpZGUqM10gPSBmcm9tLnc7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGRvdWJsZSwgZG91YmxlMj4oZG91YmxlKiB0bywgY29uc3QgZG91YmxlMiYgZnJvbSwgSW5kZXggc3RyaWRlKSB7CisgIHRvW3N0cmlkZSowXSA9IGZyb20ueDsKKyAgdG9bc3RyaWRlKjFdID0gZnJvbS55OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBmbG9hdCAgcGZpcnN0PGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKSB7CisgIHJldHVybiBhLng7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBkb3VibGUgcGZpcnN0PGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEpIHsKKyAgcmV0dXJuIGEueDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZmxvYXQgIHByZWR1eDxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSkgeworICByZXR1cm4gYS54ICsgYS55ICsgYS56ICsgYS53OworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZG91YmxlIHByZWR1eDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhKSB7CisgIHJldHVybiBhLnggKyBhLnk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGZsb2F0ICBwcmVkdXhfbWF4PGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKSB7CisgIHJldHVybiBmbWF4ZihmbWF4ZihhLngsIGEueSksIGZtYXhmKGEueiwgYS53KSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBkb3VibGUgcHJlZHV4X21heDxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhKSB7CisgIHJldHVybiBmbWF4KGEueCwgYS55KTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZmxvYXQgIHByZWR1eF9taW48ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEpIHsKKyAgcmV0dXJuIGZtaW5mKGZtaW5mKGEueCwgYS55KSwgZm1pbmYoYS56LCBhLncpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGRvdWJsZSBwcmVkdXhfbWluPGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEpIHsKKyAgcmV0dXJuIGZtaW4oYS54LCBhLnkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBmbG9hdCAgcHJlZHV4X211bDxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSkgeworICByZXR1cm4gYS54ICogYS55ICogYS56ICogYS53OworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZG91YmxlIHByZWR1eF9tdWw8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSkgeworICByZXR1cm4gYS54ICogYS55OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBmbG9hdDQgIHBhYnM8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEpIHsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGZhYnNmKGEueCksIGZhYnNmKGEueSksIGZhYnNmKGEueiksIGZhYnNmKGEudykpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZG91YmxlMiBwYWJzPGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEpIHsKKyAgcmV0dXJuIG1ha2VfZG91YmxlMihmYWJzKGEueCksIGZhYnMoYS55KSk7Cit9CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPGZsb2F0NCw0PiYga2VybmVsKSB7CisgIGZsb2F0IHRtcCA9IGtlcm5lbC5wYWNrZXRbMF0ueTsKKyAga2VybmVsLnBhY2tldFswXS55ID0ga2VybmVsLnBhY2tldFsxXS54OworICBrZXJuZWwucGFja2V0WzFdLnggPSB0bXA7CisKKyAgdG1wID0ga2VybmVsLnBhY2tldFswXS56OworICBrZXJuZWwucGFja2V0WzBdLnogPSBrZXJuZWwucGFja2V0WzJdLng7CisgIGtlcm5lbC5wYWNrZXRbMl0ueCA9IHRtcDsKKworICB0bXAgPSBrZXJuZWwucGFja2V0WzBdLnc7CisgIGtlcm5lbC5wYWNrZXRbMF0udyA9IGtlcm5lbC5wYWNrZXRbM10ueDsKKyAga2VybmVsLnBhY2tldFszXS54ID0gdG1wOworCisgIHRtcCA9IGtlcm5lbC5wYWNrZXRbMV0uejsKKyAga2VybmVsLnBhY2tldFsxXS56ID0ga2VybmVsLnBhY2tldFsyXS55OworICBrZXJuZWwucGFja2V0WzJdLnkgPSB0bXA7CisKKyAgdG1wID0ga2VybmVsLnBhY2tldFsxXS53OworICBrZXJuZWwucGFja2V0WzFdLncgPSBrZXJuZWwucGFja2V0WzNdLnk7CisgIGtlcm5lbC5wYWNrZXRbM10ueSA9IHRtcDsKKworICB0bXAgPSBrZXJuZWwucGFja2V0WzJdLnc7CisgIGtlcm5lbC5wYWNrZXRbMl0udyA9IGtlcm5lbC5wYWNrZXRbM10uejsKKyAga2VybmVsLnBhY2tldFszXS56ID0gdG1wOworfQorCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxkb3VibGUyLDI+JiBrZXJuZWwpIHsKKyAgZG91YmxlIHRtcCA9IGtlcm5lbC5wYWNrZXRbMF0ueTsKKyAga2VybmVsLnBhY2tldFswXS55ID0ga2VybmVsLnBhY2tldFsxXS54OworICBrZXJuZWwucGFja2V0WzFdLnggPSB0bXA7Cit9CisKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKworI2VuZGlmIC8vIEVJR0VOX1BBQ0tFVF9NQVRIX0NVREFfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9DVURBL1BhY2tldE1hdGhIYWxmLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvUGFja2V0TWF0aEhhbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU0MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9DVURBL1BhY2tldE1hdGhIYWxmLmgKQEAgLTAsMCArMSwxMTIzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBQ0tFVF9NQVRIX0hBTEZfQ1VEQV9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFVF9NQVRIX0hBTEZfQ1VEQV9ICisKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHJlcXVpcmUgYXJjaCA+PSAzLjAKKyNpZiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpICYmIGRlZmluZWQoX19DVURBQ0NfXykgJiYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDMwMAorCit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPGhhbGYyPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxFaWdlbjo6aGFsZj4gOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBoYWxmMiB0eXBlOworICB0eXBlZGVmIGhhbGYyIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTIsCisgICAgSGFzSGFsZlBhY2tldCA9IDAsCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzU3FydCAgID0gMSwKKyAgICBIYXNSc3FydCAgPSAxLAorICAgIEhhc0V4cCAgICA9IDEsCisgICAgSGFzTG9nICAgID0gMSwKKyAgICBIYXNMb2cxcCAgPSAxCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8aGFsZjI+IHsgdHlwZWRlZiBFaWdlbjo6aGFsZiB0eXBlOyBlbnVtIHtzaXplPTIsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIGhhbGYyIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBzZXQxPGhhbGYyPihjb25zdCBFaWdlbjo6aGFsZiYgZnJvbSkgeworICByZXR1cm4gX19oYWxmMmhhbGYyKGZyb20pOworfQorCit0ZW1wbGF0ZTw+IF9fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSBoYWxmMiBwbG9hZDxoYWxmMj4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IGhhbGYyKj4oZnJvbSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBsb2FkdTxoYWxmMj4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgcmV0dXJuIF9faGFsdmVzMmhhbGYyKGZyb21bMF0sIGZyb21bMV0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcGxvYWRkdXA8aGFsZjI+KGNvbnN0IEVpZ2VuOjpoYWxmKiAgZnJvbSkgeworICByZXR1cm4gX19oYWx2ZXMyaGFsZjIoZnJvbVswXSwgZnJvbVswXSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPEVpZ2VuOjpoYWxmPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IGhhbGYyJiBmcm9tKSB7CisgICpyZWludGVycHJldF9jYXN0PGhhbGYyKj4odG8pID0gZnJvbTsKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PEVpZ2VuOjpoYWxmPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IGhhbGYyJiBmcm9tKSB7CisgIHRvWzBdID0gX19sb3cyaGFsZihmcm9tKTsKKyAgdG9bMV0gPSBfX2hpZ2gyaGFsZihmcm9tKTsKK30KKwordGVtcGxhdGU8PgorIF9fZGV2aWNlX18gRUlHRU5fQUxXQVlTX0lOTElORSBoYWxmMiBwbG9hZHRfcm88aGFsZjIsIEFsaWduZWQ+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tKSB7CisjaWYgX19DVURBX0FSQ0hfXyA+PSAzNTAKKyAgIHJldHVybiBfX2xkZygoY29uc3QgaGFsZjIqKWZyb20pOworI2Vsc2UKKyAgcmV0dXJuIF9faGFsdmVzMmhhbGYyKCooZnJvbSswKSwgKihmcm9tKzEpKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+CitfX2RldmljZV9fIEVJR0VOX0FMV0FZU19JTkxJTkUgaGFsZjIgcGxvYWR0X3JvPGhhbGYyLCBVbmFsaWduZWQ+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tKSB7CisjaWYgX19DVURBX0FSQ0hfXyA+PSAzNTAKKyAgIHJldHVybiBfX2hhbHZlczJoYWxmMihfX2xkZyhmcm9tKzApLCBfX2xkZyhmcm9tKzEpKTsKKyNlbHNlCisgIHJldHVybiBfX2hhbHZlczJoYWxmMigqKGZyb20rMCksICooZnJvbSsxKSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcGdhdGhlcjxFaWdlbjo6aGFsZiwgaGFsZjI+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tLCBJbmRleCBzdHJpZGUpIHsKKyAgcmV0dXJuIF9faGFsdmVzMmhhbGYyKGZyb21bMCpzdHJpZGVdLCBmcm9tWzEqc3RyaWRlXSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHNjYXR0ZXI8RWlnZW46OmhhbGYsIGhhbGYyPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IGhhbGYyJiBmcm9tLCBJbmRleCBzdHJpZGUpIHsKKyAgdG9bc3RyaWRlKjBdID0gX19sb3cyaGFsZihmcm9tKTsKKyAgdG9bc3RyaWRlKjFdID0gX19oaWdoMmhhbGYoZnJvbSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIHBmaXJzdDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgcmV0dXJuIF9fbG93MmhhbGYoYSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBhYnM8aGFsZjI+KGNvbnN0IGhhbGYyJiBhKSB7CisgIGhhbGYyIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBhLnggJiAweDdGRkY3RkZGOworICByZXR1cm4gcmVzdWx0OworfQorCisKK19fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPGhhbGYyLDI+JiBrZXJuZWwpIHsKKyAgX19oYWxmIGExID0gX19sb3cyaGFsZihrZXJuZWwucGFja2V0WzBdKTsKKyAgX19oYWxmIGEyID0gX19oaWdoMmhhbGYoa2VybmVsLnBhY2tldFswXSk7CisgIF9faGFsZiBiMSA9IF9fbG93MmhhbGYoa2VybmVsLnBhY2tldFsxXSk7CisgIF9faGFsZiBiMiA9IF9faGlnaDJoYWxmKGtlcm5lbC5wYWNrZXRbMV0pOworICBrZXJuZWwucGFja2V0WzBdID0gX19oYWx2ZXMyaGFsZjIoYTEsIGIxKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IF9faGFsdmVzMmhhbGYyKGEyLCBiMik7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBsc2V0PGhhbGYyPihjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworI2lmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIHJldHVybiBfX2hhbHZlczJoYWxmMihhLCBfX2hhZGQoYSwgX19mbG9hdDJoYWxmKDEuMGYpKSk7CisjZWxzZQorICBmbG9hdCBmID0gX19oYWxmMmZsb2F0KGEpICsgMS4wZjsKKyAgcmV0dXJuIF9faGFsdmVzMmhhbGYyKGEsIF9fZmxvYXQyaGFsZihmKSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcGFkZDxoYWxmMj4oY29uc3QgaGFsZjImIGEsIGNvbnN0IGhhbGYyJiBiKSB7CisjaWYgX19DVURBX0FSQ0hfXyA+PSA1MzAKKyAgcmV0dXJuIF9faGFkZDIoYSwgYik7CisjZWxzZQorICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgZmxvYXQgYjEgPSBfX2xvdzJmbG9hdChiKTsKKyAgZmxvYXQgYjIgPSBfX2hpZ2gyZmxvYXQoYik7CisgIGZsb2F0IHIxID0gYTEgKyBiMTsKKyAgZmxvYXQgcjIgPSBhMiArIGIyOworICByZXR1cm4gX19mbG9hdHMyaGFsZjJfcm4ocjEsIHIyKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IF9fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSBoYWxmMiBwc3ViPGhhbGYyPihjb25zdCBoYWxmMiYgYSwgY29uc3QgaGFsZjImIGIpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDUzMAorICByZXR1cm4gX19oc3ViMihhLCBiKTsKKyNlbHNlCisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICBmbG9hdCBiMSA9IF9fbG93MmZsb2F0KGIpOworICBmbG9hdCBiMiA9IF9faGlnaDJmbG9hdChiKTsKKyAgZmxvYXQgcjEgPSBhMSAtIGIxOworICBmbG9hdCByMiA9IGEyIC0gYjI7CisgIHJldHVybiBfX2Zsb2F0czJoYWxmMl9ybihyMSwgcjIpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBuZWdhdGUoY29uc3QgaGFsZjImIGEpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDUzMAorICByZXR1cm4gX19obmVnMihhKTsKKyNlbHNlCisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICByZXR1cm4gX19mbG9hdHMyaGFsZjJfcm4oLWExLCAtYTIpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBjb25qKGNvbnN0IGhhbGYyJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBtdWw8aGFsZjI+KGNvbnN0IGhhbGYyJiBhLCBjb25zdCBoYWxmMiYgYikgeworI2lmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIHJldHVybiBfX2htdWwyKGEsIGIpOworI2Vsc2UKKyAgZmxvYXQgYTEgPSBfX2xvdzJmbG9hdChhKTsKKyAgZmxvYXQgYTIgPSBfX2hpZ2gyZmxvYXQoYSk7CisgIGZsb2F0IGIxID0gX19sb3cyZmxvYXQoYik7CisgIGZsb2F0IGIyID0gX19oaWdoMmZsb2F0KGIpOworICBmbG9hdCByMSA9IGExICogYjE7CisgIGZsb2F0IHIyID0gYTIgKiBiMjsKKyAgcmV0dXJuIF9fZmxvYXRzMmhhbGYyX3JuKHIxLCByMik7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcG1hZGQ8aGFsZjI+KGNvbnN0IGhhbGYyJiBhLCBjb25zdCBoYWxmMiYgYiwgY29uc3QgaGFsZjImIGMpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDUzMAorICAgcmV0dXJuIF9faGZtYTIoYSwgYiwgYyk7CisjZWxzZQorICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgZmxvYXQgYjEgPSBfX2xvdzJmbG9hdChiKTsKKyAgZmxvYXQgYjIgPSBfX2hpZ2gyZmxvYXQoYik7CisgIGZsb2F0IGMxID0gX19sb3cyZmxvYXQoYyk7CisgIGZsb2F0IGMyID0gX19oaWdoMmZsb2F0KGMpOworICBmbG9hdCByMSA9IGExICogYjEgKyBjMTsKKyAgZmxvYXQgcjIgPSBhMiAqIGIyICsgYzI7CisgIHJldHVybiBfX2Zsb2F0czJoYWxmMl9ybihyMSwgcjIpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBkaXY8aGFsZjI+KGNvbnN0IGhhbGYyJiBhLCBjb25zdCBoYWxmMiYgYikgeworICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgZmxvYXQgYjEgPSBfX2xvdzJmbG9hdChiKTsKKyAgZmxvYXQgYjIgPSBfX2hpZ2gyZmxvYXQoYik7CisgIGZsb2F0IHIxID0gYTEgLyBiMTsKKyAgZmxvYXQgcjIgPSBhMiAvIGIyOworICByZXR1cm4gX19mbG9hdHMyaGFsZjJfcm4ocjEsIHIyKTsKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcG1pbjxoYWxmMj4oY29uc3QgaGFsZjImIGEsIGNvbnN0IGhhbGYyJiBiKSB7CisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICBmbG9hdCBiMSA9IF9fbG93MmZsb2F0KGIpOworICBmbG9hdCBiMiA9IF9faGlnaDJmbG9hdChiKTsKKyAgX19oYWxmIHIxID0gYTEgPCBiMSA/IF9fbG93MmhhbGYoYSkgOiBfX2xvdzJoYWxmKGIpOworICBfX2hhbGYgcjIgPSBhMiA8IGIyID8gX19oaWdoMmhhbGYoYSkgOiBfX2hpZ2gyaGFsZihiKTsKKyAgcmV0dXJuIF9faGFsdmVzMmhhbGYyKHIxLCByMik7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBtYXg8aGFsZjI+KGNvbnN0IGhhbGYyJiBhLCBjb25zdCBoYWxmMiYgYikgeworICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgZmxvYXQgYjEgPSBfX2xvdzJmbG9hdChiKTsKKyAgZmxvYXQgYjIgPSBfX2hpZ2gyZmxvYXQoYik7CisgIF9faGFsZiByMSA9IGExID4gYjEgPyBfX2xvdzJoYWxmKGEpIDogX19sb3cyaGFsZihiKTsKKyAgX19oYWxmIHIyID0gYTIgPiBiMiA/IF9faGlnaDJoYWxmKGEpIDogX19oaWdoMmhhbGYoYik7CisgIHJldHVybiBfX2hhbHZlczJoYWxmMihyMSwgcjIpOworfQorCit0ZW1wbGF0ZTw+IF9fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBwcmVkdXg8aGFsZjI+KGNvbnN0IGhhbGYyJiBhKSB7CisjaWYgX19DVURBX0FSQ0hfXyA+PSA1MzAKKyAgcmV0dXJuIF9faGFkZChfX2xvdzJoYWxmKGEpLCBfX2hpZ2gyaGFsZihhKSk7CisjZWxzZQorICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKF9fZmxvYXQyaGFsZl9ybihhMSArIGEyKSkpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIHByZWR1eF9tYXg8aGFsZjI+KGNvbnN0IGhhbGYyJiBhKSB7CisjaWYgX19DVURBX0FSQ0hfXyA+PSA1MzAKKyAgX19oYWxmIGZpcnN0ID0gX19sb3cyaGFsZihhKTsKKyAgX19oYWxmIHNlY29uZCA9IF9faGlnaDJoYWxmKGEpOworICByZXR1cm4gX19oZ3QoZmlyc3QsIHNlY29uZCkgPyBmaXJzdCA6IHNlY29uZDsKKyNlbHNlCisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICByZXR1cm4gYTEgPiBhMiA/IF9fbG93MmhhbGYoYSkgOiBfX2hpZ2gyaGFsZihhKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IF9fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBwcmVkdXhfbWluPGhhbGYyPihjb25zdCBoYWxmMiYgYSkgeworI2lmIF9fQ1VEQV9BUkNIX18gPj0gNTMwCisgIF9faGFsZiBmaXJzdCA9IF9fbG93MmhhbGYoYSk7CisgIF9faGFsZiBzZWNvbmQgPSBfX2hpZ2gyaGFsZihhKTsKKyAgcmV0dXJuIF9faGx0KGZpcnN0LCBzZWNvbmQpID8gZmlyc3QgOiBzZWNvbmQ7CisjZWxzZQorICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgcmV0dXJuIGExIDwgYTIgPyBfX2xvdzJoYWxmKGEpIDogX19oaWdoMmhhbGYoYSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgcHJlZHV4X211bDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDUzMAorICByZXR1cm4gX19obXVsKF9fbG93MmhhbGYoYSksIF9faGlnaDJoYWxmKGEpKTsKKyNlbHNlCisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICByZXR1cm4gRWlnZW46OmhhbGYoaGFsZl9pbXBsOjpyYXdfdWludDE2X3RvX2hhbGYoX19mbG9hdDJoYWxmX3JuKGExICogYTIpKSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcGxvZzFwPGhhbGYyPihjb25zdCBoYWxmMiYgYSkgeworICBmbG9hdCBhMSA9IF9fbG93MmZsb2F0KGEpOworICBmbG9hdCBhMiA9IF9faGlnaDJmbG9hdChhKTsKKyAgZmxvYXQgcjEgPSBsb2cxcGYoYTEpOworICBmbG9hdCByMiA9IGxvZzFwZihhMik7CisgIHJldHVybiBfX2Zsb2F0czJoYWxmMl9ybihyMSwgcjIpOworfQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA4MDAwMCAmJiBkZWZpbmVkIF9fQ1VEQV9BUkNIX18gJiYgX19DVURBX0FSQ0hfXyA+PSA1MzAKKwordGVtcGxhdGU8PiAgX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FCitoYWxmMiBwbG9nPGhhbGYyPihjb25zdCBoYWxmMiYgYSkgeworICByZXR1cm4gaDJsb2coYSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FCitoYWxmMiBwZXhwPGhhbGYyPihjb25zdCBoYWxmMiYgYSkgeworICByZXR1cm4gaDJleHAoYSk7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FCitoYWxmMiBwc3FydDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgcmV0dXJuIGgyc3FydChhKTsKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUKK2hhbGYyIHByc3FydDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgcmV0dXJuIGgycnNxcnQoYSk7Cit9CisKKyNlbHNlCisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBsb2c8aGFsZjI+KGNvbnN0IGhhbGYyJiBhKSB7CisgIGZsb2F0IGExID0gX19sb3cyZmxvYXQoYSk7CisgIGZsb2F0IGEyID0gX19oaWdoMmZsb2F0KGEpOworICBmbG9hdCByMSA9IGxvZ2YoYTEpOworICBmbG9hdCByMiA9IGxvZ2YoYTIpOworICByZXR1cm4gX19mbG9hdHMyaGFsZjJfcm4ocjEsIHIyKTsKK30KKwordGVtcGxhdGU8PiBfX2RldmljZV9fIEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZjIgcGV4cDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgZmxvYXQgYTEgPSBfX2xvdzJmbG9hdChhKTsKKyAgZmxvYXQgYTIgPSBfX2hpZ2gyZmxvYXQoYSk7CisgIGZsb2F0IHIxID0gZXhwZihhMSk7CisgIGZsb2F0IHIyID0gZXhwZihhMik7CisgIHJldHVybiBfX2Zsb2F0czJoYWxmMl9ybihyMSwgcjIpOworfQorCit0ZW1wbGF0ZTw+IF9fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSBoYWxmMiBwc3FydDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgZmxvYXQgYTEgPSBfX2xvdzJmbG9hdChhKTsKKyAgZmxvYXQgYTIgPSBfX2hpZ2gyZmxvYXQoYSk7CisgIGZsb2F0IHIxID0gc3FydGYoYTEpOworICBmbG9hdCByMiA9IHNxcnRmKGEyKTsKKyAgcmV0dXJuIF9fZmxvYXRzMmhhbGYyX3JuKHIxLCByMik7Cit9CisKK3RlbXBsYXRlPD4gX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHByc3FydDxoYWxmMj4oY29uc3QgaGFsZjImIGEpIHsKKyAgZmxvYXQgYTEgPSBfX2xvdzJmbG9hdChhKTsKKyAgZmxvYXQgYTIgPSBfX2hpZ2gyZmxvYXQoYSk7CisgIGZsb2F0IHIxID0gcnNxcnRmKGExKTsKKyAgZmxvYXQgcjIgPSByc3FydGYoYTIpOworICByZXR1cm4gX19mbG9hdHMyaGFsZjJfcm4ocjEsIHIyKTsKK30KKworI2VuZGlmCisKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgIF9fbTI1NmkgeDsKK30gUGFja2V0MTZoOworCisKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8UGFja2V0MTZoPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBwYWNrZXRfdHJhaXRzPGhhbGY+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzIHsKKyAgdHlwZWRlZiBQYWNrZXQxNmggdHlwZTsKKyAgLy8gVGhlcmUgaXMgbm8gaGFsZi1zaXplIHBhY2tldCBmb3IgUGFja2V0MTZoLgorICB0eXBlZGVmIFBhY2tldDE2aCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDE2LAorICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorICAgIEhhc0FkZCAgICA9IDAsCisgICAgSGFzU3ViICAgID0gMCwKKyAgICBIYXNNdWwgICAgPSAwLAorICAgIEhhc05lZ2F0ZSA9IDAsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNDb25qICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAsCisgICAgSGFzRGl2ID0gMCwKKyAgICBIYXNTcXJ0ID0gMCwKKyAgICBIYXNSc3FydCA9IDAsCisgICAgSGFzRXhwID0gMCwKKyAgICBIYXNMb2cgPSAwLAorICAgIEhhc0JsZW5kID0gMAorICB9OworfTsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MTZoPiB7IHR5cGVkZWYgRWlnZW46OmhhbGYgdHlwZTsgZW51bSB7c2l6ZT0xNiwgYWxpZ25tZW50PUFsaWduZWQzMn07IHR5cGVkZWYgUGFja2V0MTZoIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmggcHNldDE8UGFja2V0MTZoPihjb25zdCBFaWdlbjo6aGFsZiYgZnJvbSkgeworICBQYWNrZXQxNmggcmVzdWx0OworICByZXN1bHQueCA9IF9tbTI1Nl9zZXQxX2VwaTE2KGZyb20ueCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBwZmlyc3Q8UGFja2V0MTZoPihjb25zdCBQYWNrZXQxNmgmIGZyb20pIHsKKyAgcmV0dXJuIGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfbW0yNTZfZXh0cmFjdF9lcGkxNihmcm9tLngsIDApKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmggcGxvYWQ8UGFja2V0MTZoPihjb25zdCBFaWdlbjo6aGFsZiogZnJvbSkgeworICBQYWNrZXQxNmggcmVzdWx0OworICByZXN1bHQueCA9IF9tbTI1Nl9sb2FkX3NpMjU2KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMjU2aSo+KGZyb20pKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2aCBwbG9hZHU8UGFja2V0MTZoPihjb25zdCBFaWdlbjo6aGFsZiogZnJvbSkgeworICBQYWNrZXQxNmggcmVzdWx0OworICByZXN1bHQueCA9IF9tbTI1Nl9sb2FkdV9zaTI1NihyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTI1NmkqPihmcm9tKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxoYWxmPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IFBhY2tldDE2aCYgZnJvbSkgeworICBfbW0yNTZfc3RvcmVfc2kyNTYoKF9fbTI1NmkqKXRvLCBmcm9tLngpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGhhbGY+KEVpZ2VuOjpoYWxmKiB0bywgY29uc3QgUGFja2V0MTZoJiBmcm9tKSB7CisgIF9tbTI1Nl9zdG9yZXVfc2kyNTYoKF9fbTI1NmkqKXRvLCBmcm9tLngpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZoCitwbG9hZHF1YWQoY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgUGFja2V0MTZoIHJlc3VsdDsKKyAgdW5zaWduZWQgc2hvcnQgYSA9IGZyb21bMF0ueDsKKyAgdW5zaWduZWQgc2hvcnQgYiA9IGZyb21bMV0ueDsKKyAgdW5zaWduZWQgc2hvcnQgYyA9IGZyb21bMl0ueDsKKyAgdW5zaWduZWQgc2hvcnQgZCA9IGZyb21bM10ueDsKKyAgcmVzdWx0LnggPSBfbW0yNTZfc2V0X2VwaTE2KGQsIGQsIGQsIGQsIGMsIGMsIGMsIGMsIGIsIGIsIGIsIGIsIGEsIGEsIGEsIGEpOworICByZXR1cm4gcmVzdWx0OworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBoYWxmMmZsb2F0KGNvbnN0IFBhY2tldDE2aCYgYSkgeworI2lmZGVmIEVJR0VOX0hBU19GUDE2X0MKKyAgcmV0dXJuIF9tbTUxMl9jdnRwaF9wcyhhLngpOworI2Vsc2UKKyAgRUlHRU5fQUxJR042NCBoYWxmIGF1eFsxNl07CisgIHBzdG9yZShhdXgsIGEpOworICBmbG9hdCBmMChhdXhbMF0pOworICBmbG9hdCBmMShhdXhbMV0pOworICBmbG9hdCBmMihhdXhbMl0pOworICBmbG9hdCBmMyhhdXhbM10pOworICBmbG9hdCBmNChhdXhbNF0pOworICBmbG9hdCBmNShhdXhbNV0pOworICBmbG9hdCBmNihhdXhbNl0pOworICBmbG9hdCBmNyhhdXhbN10pOworICBmbG9hdCBmOChhdXhbOF0pOworICBmbG9hdCBmOShhdXhbOV0pOworICBmbG9hdCBmYShhdXhbMTBdKTsKKyAgZmxvYXQgZmIoYXV4WzExXSk7CisgIGZsb2F0IGZjKGF1eFsxMl0pOworICBmbG9hdCBmZChhdXhbMTNdKTsKKyAgZmxvYXQgZmUoYXV4WzE0XSk7CisgIGZsb2F0IGZmKGF1eFsxNV0pOworCisgIHJldHVybiBfbW01MTJfc2V0X3BzKAorICAgICAgZmYsIGZlLCBmZCwgZmMsIGZiLCBmYSwgZjksIGY4LCBmNywgZjYsIGY1LCBmNCwgZjMsIGYyLCBmMSwgZjApOworI2VuZGlmCit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZoIGZsb2F0MmhhbGYoY29uc3QgUGFja2V0MTZmJiBhKSB7CisjaWZkZWYgRUlHRU5fSEFTX0ZQMTZfQworICBQYWNrZXQxNmggcmVzdWx0OworICByZXN1bHQueCA9IF9tbTUxMl9jdnRwc19waChhLCBfTU1fRlJPVU5EX1RPX05FQVJFU1RfSU5UfF9NTV9GUk9VTkRfTk9fRVhDKTsKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgIEVJR0VOX0FMSUdONjQgZmxvYXQgYXV4WzE2XTsKKyAgcHN0b3JlKGF1eCwgYSk7CisgIGhhbGYgaDAoYXV4WzBdKTsKKyAgaGFsZiBoMShhdXhbMV0pOworICBoYWxmIGgyKGF1eFsyXSk7CisgIGhhbGYgaDMoYXV4WzNdKTsKKyAgaGFsZiBoNChhdXhbNF0pOworICBoYWxmIGg1KGF1eFs1XSk7CisgIGhhbGYgaDYoYXV4WzZdKTsKKyAgaGFsZiBoNyhhdXhbN10pOworICBoYWxmIGg4KGF1eFs4XSk7CisgIGhhbGYgaDkoYXV4WzldKTsKKyAgaGFsZiBoYShhdXhbMTBdKTsKKyAgaGFsZiBoYihhdXhbMTFdKTsKKyAgaGFsZiBoYyhhdXhbMTJdKTsKKyAgaGFsZiBoZChhdXhbMTNdKTsKKyAgaGFsZiBoZShhdXhbMTRdKTsKKyAgaGFsZiBoZihhdXhbMTVdKTsKKworICBQYWNrZXQxNmggcmVzdWx0OworICByZXN1bHQueCA9IF9tbTI1Nl9zZXRfZXBpMTYoCisgICAgICBoZi54LCBoZS54LCBoZC54LCBoYy54LCBoYi54LCBoYS54LCBoOS54LCBoOC54LAorICAgICAgaDcueCwgaDYueCwgaDUueCwgaDQueCwgaDMueCwgaDIueCwgaDEueCwgaDAueCk7CisgIHJldHVybiByZXN1bHQ7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2aCBwYWRkPFBhY2tldDE2aD4oY29uc3QgUGFja2V0MTZoJiBhLCBjb25zdCBQYWNrZXQxNmgmIGIpIHsKKyAgUGFja2V0MTZmIGFmID0gaGFsZjJmbG9hdChhKTsKKyAgUGFja2V0MTZmIGJmID0gaGFsZjJmbG9hdChiKTsKKyAgUGFja2V0MTZmIHJmID0gcGFkZChhZiwgYmYpOworICByZXR1cm4gZmxvYXQyaGFsZihyZik7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxNmggcG11bDxQYWNrZXQxNmg+KGNvbnN0IFBhY2tldDE2aCYgYSwgY29uc3QgUGFja2V0MTZoJiBiKSB7CisgIFBhY2tldDE2ZiBhZiA9IGhhbGYyZmxvYXQoYSk7CisgIFBhY2tldDE2ZiBiZiA9IGhhbGYyZmxvYXQoYik7CisgIFBhY2tldDE2ZiByZiA9IHBtdWwoYWYsIGJmKTsKKyAgcmV0dXJuIGZsb2F0MmhhbGYocmYpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaGFsZiBwcmVkdXg8UGFja2V0MTZoPihjb25zdCBQYWNrZXQxNmgmIGZyb20pIHsKKyAgUGFja2V0MTZmIGZyb21fZmxvYXQgPSBoYWxmMmZsb2F0KGZyb20pOworICByZXR1cm4gaGFsZihwcmVkdXgoZnJvbV9mbG9hdCkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZoIHBnYXRoZXI8RWlnZW46OmhhbGYsIFBhY2tldDE2aD4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgUGFja2V0MTZoIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBfbW0yNTZfc2V0X2VwaTE2KAorICAgICAgZnJvbVsxNSpzdHJpZGVdLngsIGZyb21bMTQqc3RyaWRlXS54LCBmcm9tWzEzKnN0cmlkZV0ueCwgZnJvbVsxMipzdHJpZGVdLngsCisgICAgICBmcm9tWzExKnN0cmlkZV0ueCwgZnJvbVsxMCpzdHJpZGVdLngsIGZyb21bOSpzdHJpZGVdLngsIGZyb21bOCpzdHJpZGVdLngsCisgICAgICBmcm9tWzcqc3RyaWRlXS54LCBmcm9tWzYqc3RyaWRlXS54LCBmcm9tWzUqc3RyaWRlXS54LCBmcm9tWzQqc3RyaWRlXS54LAorICAgICAgZnJvbVszKnN0cmlkZV0ueCwgZnJvbVsyKnN0cmlkZV0ueCwgZnJvbVsxKnN0cmlkZV0ueCwgZnJvbVswKnN0cmlkZV0ueCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzY2F0dGVyPGhhbGYsIFBhY2tldDE2aD4oaGFsZiogdG8sIGNvbnN0IFBhY2tldDE2aCYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBFSUdFTl9BTElHTjY0IGhhbGYgYXV4WzE2XTsKKyAgcHN0b3JlKGF1eCwgZnJvbSk7CisgIHRvW3N0cmlkZSowXS54ID0gYXV4WzBdLng7CisgIHRvW3N0cmlkZSoxXS54ID0gYXV4WzFdLng7CisgIHRvW3N0cmlkZSoyXS54ID0gYXV4WzJdLng7CisgIHRvW3N0cmlkZSozXS54ID0gYXV4WzNdLng7CisgIHRvW3N0cmlkZSo0XS54ID0gYXV4WzRdLng7CisgIHRvW3N0cmlkZSo1XS54ID0gYXV4WzVdLng7CisgIHRvW3N0cmlkZSo2XS54ID0gYXV4WzZdLng7CisgIHRvW3N0cmlkZSo3XS54ID0gYXV4WzddLng7CisgIHRvW3N0cmlkZSo4XS54ID0gYXV4WzhdLng7CisgIHRvW3N0cmlkZSo5XS54ID0gYXV4WzldLng7CisgIHRvW3N0cmlkZSoxMF0ueCA9IGF1eFsxMF0ueDsKKyAgdG9bc3RyaWRlKjExXS54ID0gYXV4WzExXS54OworICB0b1tzdHJpZGUqMTJdLnggPSBhdXhbMTJdLng7CisgIHRvW3N0cmlkZSoxM10ueCA9IGF1eFsxM10ueDsKKyAgdG9bc3RyaWRlKjE0XS54ID0gYXV4WzE0XS54OworICB0b1tzdHJpZGUqMTVdLnggPSBhdXhbMTVdLng7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQxNmgsMTY+JiBrZXJuZWwpIHsKKyAgX19tMjU2aSBhID0ga2VybmVsLnBhY2tldFswXS54OworICBfX20yNTZpIGIgPSBrZXJuZWwucGFja2V0WzFdLng7CisgIF9fbTI1NmkgYyA9IGtlcm5lbC5wYWNrZXRbMl0ueDsKKyAgX19tMjU2aSBkID0ga2VybmVsLnBhY2tldFszXS54OworICBfX20yNTZpIGUgPSBrZXJuZWwucGFja2V0WzRdLng7CisgIF9fbTI1NmkgZiA9IGtlcm5lbC5wYWNrZXRbNV0ueDsKKyAgX19tMjU2aSBnID0ga2VybmVsLnBhY2tldFs2XS54OworICBfX20yNTZpIGggPSBrZXJuZWwucGFja2V0WzddLng7CisgIF9fbTI1NmkgaSA9IGtlcm5lbC5wYWNrZXRbOF0ueDsKKyAgX19tMjU2aSBqID0ga2VybmVsLnBhY2tldFs5XS54OworICBfX20yNTZpIGsgPSBrZXJuZWwucGFja2V0WzEwXS54OworICBfX20yNTZpIGwgPSBrZXJuZWwucGFja2V0WzExXS54OworICBfX20yNTZpIG0gPSBrZXJuZWwucGFja2V0WzEyXS54OworICBfX20yNTZpIG4gPSBrZXJuZWwucGFja2V0WzEzXS54OworICBfX20yNTZpIG8gPSBrZXJuZWwucGFja2V0WzE0XS54OworICBfX20yNTZpIHAgPSBrZXJuZWwucGFja2V0WzE1XS54OworCisgIF9fbTI1NmkgYWJfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoYSwgYik7CisgIF9fbTI1NmkgY2RfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoYywgZCk7CisgIF9fbTI1NmkgZWZfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoZSwgZik7CisgIF9fbTI1NmkgZ2hfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoZywgaCk7CisgIF9fbTI1NmkgaWpfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoaSwgaik7CisgIF9fbTI1Nmkga2xfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYoaywgbCk7CisgIF9fbTI1NmkgbW5fMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYobSwgbik7CisgIF9fbTI1Nmkgb3BfMDcgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMTYobywgcCk7CisKKyAgX19tMjU2aSBhYl84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihhLCBiKTsKKyAgX19tMjU2aSBjZF84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihjLCBkKTsKKyAgX19tMjU2aSBlZl84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihlLCBmKTsKKyAgX19tMjU2aSBnaF84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihnLCBoKTsKKyAgX19tMjU2aSBpal84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihpLCBqKTsKKyAgX19tMjU2aSBrbF84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihrLCBsKTsKKyAgX19tMjU2aSBtbl84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihtLCBuKTsKKyAgX19tMjU2aSBvcF84ZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkxNihvLCBwKTsKKworICBfX20yNTZpIGFiY2RfMDMgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMzIoYWJfMDcsIGNkXzA3KTsKKyAgX19tMjU2aSBhYmNkXzQ3ID0gX21tMjU2X3VucGFja2hpX2VwaTMyKGFiXzA3LCBjZF8wNyk7CisgIF9fbTI1NmkgZWZnaF8wMyA9IF9tbTI1Nl91bnBhY2tsb19lcGkzMihlZl8wNywgZ2hfMDcpOworICBfX20yNTZpIGVmZ2hfNDcgPSBfbW0yNTZfdW5wYWNraGlfZXBpMzIoZWZfMDcsIGdoXzA3KTsKKyAgX19tMjU2aSBpamtsXzAzID0gX21tMjU2X3VucGFja2xvX2VwaTMyKGlqXzA3LCBrbF8wNyk7CisgIF9fbTI1NmkgaWprbF80NyA9IF9tbTI1Nl91bnBhY2toaV9lcGkzMihpal8wNywga2xfMDcpOworICBfX20yNTZpIG1ub3BfMDMgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMzIobW5fMDcsIG9wXzA3KTsKKyAgX19tMjU2aSBtbm9wXzQ3ID0gX21tMjU2X3VucGFja2hpX2VwaTMyKG1uXzA3LCBvcF8wNyk7CisKKyAgX19tMjU2aSBhYmNkXzhiID0gX21tMjU2X3VucGFja2xvX2VwaTMyKGFiXzhmLCBjZF84Zik7CisgIF9fbTI1NmkgYWJjZF9jZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkzMihhYl84ZiwgY2RfOGYpOworICBfX20yNTZpIGVmZ2hfOGIgPSBfbW0yNTZfdW5wYWNrbG9fZXBpMzIoZWZfOGYsIGdoXzhmKTsKKyAgX19tMjU2aSBlZmdoX2NmID0gX21tMjU2X3VucGFja2hpX2VwaTMyKGVmXzhmLCBnaF84Zik7CisgIF9fbTI1NmkgaWprbF84YiA9IF9tbTI1Nl91bnBhY2tsb19lcGkzMihpal84Ziwga2xfOGYpOworICBfX20yNTZpIGlqa2xfY2YgPSBfbW0yNTZfdW5wYWNraGlfZXBpMzIoaWpfOGYsIGtsXzhmKTsKKyAgX19tMjU2aSBtbm9wXzhiID0gX21tMjU2X3VucGFja2xvX2VwaTMyKG1uXzhmLCBvcF84Zik7CisgIF9fbTI1NmkgbW5vcF9jZiA9IF9tbTI1Nl91bnBhY2toaV9lcGkzMihtbl84Ziwgb3BfOGYpOworCisgIF9fbTI1NmkgYWJjZGVmZ2hfMDEgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoYWJjZF8wMywgZWZnaF8wMyk7CisgIF9fbTI1NmkgYWJjZGVmZ2hfMjMgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoYWJjZF8wMywgZWZnaF8wMyk7CisgIF9fbTI1NmkgaWprbG1ub3BfMDEgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoaWprbF8wMywgbW5vcF8wMyk7CisgIF9fbTI1NmkgaWprbG1ub3BfMjMgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoaWprbF8wMywgbW5vcF8wMyk7CisgIF9fbTI1NmkgYWJjZGVmZ2hfNDUgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoYWJjZF80NywgZWZnaF80Nyk7CisgIF9fbTI1NmkgYWJjZGVmZ2hfNjcgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoYWJjZF80NywgZWZnaF80Nyk7CisgIF9fbTI1NmkgaWprbG1ub3BfNDUgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoaWprbF80NywgbW5vcF80Nyk7CisgIF9fbTI1NmkgaWprbG1ub3BfNjcgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoaWprbF80NywgbW5vcF80Nyk7CisgIF9fbTI1NmkgYWJjZGVmZ2hfODkgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoYWJjZF84YiwgZWZnaF84Yik7CisgIF9fbTI1NmkgYWJjZGVmZ2hfYWIgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoYWJjZF84YiwgZWZnaF84Yik7CisgIF9fbTI1NmkgaWprbG1ub3BfODkgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoaWprbF84YiwgbW5vcF84Yik7CisgIF9fbTI1NmkgaWprbG1ub3BfYWIgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoaWprbF84YiwgbW5vcF84Yik7CisgIF9fbTI1NmkgYWJjZGVmZ2hfY2QgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoYWJjZF9jZiwgZWZnaF9jZik7CisgIF9fbTI1NmkgYWJjZGVmZ2hfZWYgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoYWJjZF9jZiwgZWZnaF9jZik7CisgIF9fbTI1NmkgaWprbG1ub3BfY2QgPSBfbW0yNTZfdW5wYWNrbG9fZXBpNjQoaWprbF9jZiwgbW5vcF9jZik7CisgIF9fbTI1NmkgaWprbG1ub3BfZWYgPSBfbW0yNTZfdW5wYWNraGlfZXBpNjQoaWprbF9jZiwgbW5vcF9jZik7CisKKyAgLy8gTk9URTogbm8gdW5wYWNrbG8vaGkgaW5zdHIgaW4gdGhpcyBjYXNlLCBzbyB1c2luZyBwZXJtdXRlIGluc3RyLgorICBfX20yNTZpIGFfcF8wID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF8wMSwgaWprbG1ub3BfMDEsIDB4MjApOworICBfX20yNTZpIGFfcF8xID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF8wMSwgaWprbG1ub3BfMDEsIDB4MzEpOworICBfX20yNTZpIGFfcF8yID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF8yMywgaWprbG1ub3BfMjMsIDB4MjApOworICBfX20yNTZpIGFfcF8zID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF8yMywgaWprbG1ub3BfMjMsIDB4MzEpOworICBfX20yNTZpIGFfcF80ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF80NSwgaWprbG1ub3BfNDUsIDB4MjApOworICBfX20yNTZpIGFfcF81ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF80NSwgaWprbG1ub3BfNDUsIDB4MzEpOworICBfX20yNTZpIGFfcF82ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF82NywgaWprbG1ub3BfNjcsIDB4MjApOworICBfX20yNTZpIGFfcF83ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF82NywgaWprbG1ub3BfNjcsIDB4MzEpOworICBfX20yNTZpIGFfcF84ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF84OSwgaWprbG1ub3BfODksIDB4MjApOworICBfX20yNTZpIGFfcF85ID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF84OSwgaWprbG1ub3BfODksIDB4MzEpOworICBfX20yNTZpIGFfcF9hID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9hYiwgaWprbG1ub3BfYWIsIDB4MjApOworICBfX20yNTZpIGFfcF9iID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9hYiwgaWprbG1ub3BfYWIsIDB4MzEpOworICBfX20yNTZpIGFfcF9jID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9jZCwgaWprbG1ub3BfY2QsIDB4MjApOworICBfX20yNTZpIGFfcF9kID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9jZCwgaWprbG1ub3BfY2QsIDB4MzEpOworICBfX20yNTZpIGFfcF9lID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9lZiwgaWprbG1ub3BfZWYsIDB4MjApOworICBfX20yNTZpIGFfcF9mID0gX21tMjU2X3Blcm11dGUyeDEyOF9zaTI1NihhYmNkZWZnaF9lZiwgaWprbG1ub3BfZWYsIDB4MzEpOworCisgIGtlcm5lbC5wYWNrZXRbMF0ueCA9IGFfcF8wOworICBrZXJuZWwucGFja2V0WzFdLnggPSBhX3BfMTsKKyAga2VybmVsLnBhY2tldFsyXS54ID0gYV9wXzI7CisgIGtlcm5lbC5wYWNrZXRbM10ueCA9IGFfcF8zOworICBrZXJuZWwucGFja2V0WzRdLnggPSBhX3BfNDsKKyAga2VybmVsLnBhY2tldFs1XS54ID0gYV9wXzU7CisgIGtlcm5lbC5wYWNrZXRbNl0ueCA9IGFfcF82OworICBrZXJuZWwucGFja2V0WzddLnggPSBhX3BfNzsKKyAga2VybmVsLnBhY2tldFs4XS54ID0gYV9wXzg7CisgIGtlcm5lbC5wYWNrZXRbOV0ueCA9IGFfcF85OworICBrZXJuZWwucGFja2V0WzEwXS54ID0gYV9wX2E7CisgIGtlcm5lbC5wYWNrZXRbMTFdLnggPSBhX3BfYjsKKyAga2VybmVsLnBhY2tldFsxMl0ueCA9IGFfcF9jOworICBrZXJuZWwucGFja2V0WzEzXS54ID0gYV9wX2Q7CisgIGtlcm5lbC5wYWNrZXRbMTRdLnggPSBhX3BfZTsKKyAga2VybmVsLnBhY2tldFsxNV0ueCA9IGFfcF9mOworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0MTZoLDg+JiBrZXJuZWwpIHsKKyAgRUlHRU5fQUxJR042NCBoYWxmIGluWzhdWzE2XTsKKyAgcHN0b3JlPGhhbGY+KGluWzBdLCBrZXJuZWwucGFja2V0WzBdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzFdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzJdLCBrZXJuZWwucGFja2V0WzJdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzNdLCBrZXJuZWwucGFja2V0WzNdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzRdLCBrZXJuZWwucGFja2V0WzRdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzVdLCBrZXJuZWwucGFja2V0WzVdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzZdLCBrZXJuZWwucGFja2V0WzZdKTsKKyAgcHN0b3JlPGhhbGY+KGluWzddLCBrZXJuZWwucGFja2V0WzddKTsKKworICBFSUdFTl9BTElHTjY0IGhhbGYgb3V0WzhdWzE2XTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICBvdXRbaV1bal0gPSBpbltqXVsyKmldOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7ICsraikgeworICAgICAgb3V0W2ldW2orOF0gPSBpbltqXVsyKmkrMV07CisgICAgfQorICB9CisKKyAga2VybmVsLnBhY2tldFswXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzBdKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzFdKTsKKyAga2VybmVsLnBhY2tldFsyXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzJdKTsKKyAga2VybmVsLnBhY2tldFszXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzNdKTsKKyAga2VybmVsLnBhY2tldFs0XSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzRdKTsKKyAga2VybmVsLnBhY2tldFs1XSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzVdKTsKKyAga2VybmVsLnBhY2tldFs2XSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzZdKTsKKyAga2VybmVsLnBhY2tldFs3XSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzddKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDE2aCw0PiYga2VybmVsKSB7CisgIEVJR0VOX0FMSUdONjQgaGFsZiBpbls0XVsxNl07CisgIHBzdG9yZTxoYWxmPihpblswXSwga2VybmVsLnBhY2tldFswXSk7CisgIHBzdG9yZTxoYWxmPihpblsxXSwga2VybmVsLnBhY2tldFsxXSk7CisgIHBzdG9yZTxoYWxmPihpblsyXSwga2VybmVsLnBhY2tldFsyXSk7CisgIHBzdG9yZTxoYWxmPihpblszXSwga2VybmVsLnBhY2tldFszXSk7CisKKyAgRUlHRU5fQUxJR042NCBoYWxmIG91dFs0XVsxNl07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgb3V0W2ldW2pdID0gaW5bal1bNCppXTsKKyAgICB9CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgIG91dFtpXVtqKzRdID0gaW5bal1bNCppKzFdOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgb3V0W2ldW2orOF0gPSBpbltqXVs0KmkrMl07CisgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICBvdXRbaV1baisxMl0gPSBpbltqXVs0KmkrM107CisgICAgfQorICB9CisKKyAga2VybmVsLnBhY2tldFswXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzBdKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzFdKTsKKyAga2VybmVsLnBhY2tldFsyXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzJdKTsKKyAga2VybmVsLnBhY2tldFszXSA9IHBsb2FkPFBhY2tldDE2aD4ob3V0WzNdKTsKK30KKworCisjZWxpZiBkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9BVlgKKwordHlwZWRlZiBzdHJ1Y3QgeworICBfX20xMjhpIHg7Cit9IFBhY2tldDhoOworCisKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8UGFja2V0OGg+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHBhY2tldF90cmFpdHM8RWlnZW46OmhhbGY+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzIHsKKyAgdHlwZWRlZiBQYWNrZXQ4aCB0eXBlOworICAvLyBUaGVyZSBpcyBubyBoYWxmLXNpemUgcGFja2V0IGZvciBQYWNrZXQ4aC4KKyAgdHlwZWRlZiBQYWNrZXQ4aCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDgsCisgICAgSGFzSGFsZlBhY2tldCA9IDAsCisgICAgSGFzQWRkICAgID0gMCwKKyAgICBIYXNTdWIgICAgPSAwLAorICAgIEhhc011bCAgICA9IDAsCisgICAgSGFzTmVnYXRlID0gMCwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc0NvbmogICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMCwKKyAgICBIYXNEaXYgPSAwLAorICAgIEhhc1NxcnQgPSAwLAorICAgIEhhc1JzcXJ0ID0gMCwKKyAgICBIYXNFeHAgPSAwLAorICAgIEhhc0xvZyA9IDAsCisgICAgSGFzQmxlbmQgPSAwCisgIH07Cit9OworCisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ4aD4geyB0eXBlZGVmIEVpZ2VuOjpoYWxmIHR5cGU7IGVudW0ge3NpemU9OCwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0OGggaGFsZjsgfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhoIHBzZXQxPFBhY2tldDhoPihjb25zdCBFaWdlbjo6aGFsZiYgZnJvbSkgeworICBQYWNrZXQ4aCByZXN1bHQ7CisgIHJlc3VsdC54ID0gX21tX3NldDFfZXBpMTYoZnJvbS54KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIHBmaXJzdDxQYWNrZXQ4aD4oY29uc3QgUGFja2V0OGgmIGZyb20pIHsKKyAgcmV0dXJuIGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfbW1fZXh0cmFjdF9lcGkxNihmcm9tLngsIDApKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aCBwbG9hZDxQYWNrZXQ4aD4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgUGFja2V0OGggcmVzdWx0OworICByZXN1bHQueCA9IF9tbV9sb2FkX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KGZyb20pKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhoIHBsb2FkdTxQYWNrZXQ4aD4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgUGFja2V0OGggcmVzdWx0OworICByZXN1bHQueCA9IF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihmcm9tKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxFaWdlbjo6aGFsZj4oRWlnZW46OmhhbGYqIHRvLCBjb25zdCBQYWNrZXQ4aCYgZnJvbSkgeworICBfbW1fc3RvcmVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4odG8pLCBmcm9tLngpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PEVpZ2VuOjpoYWxmPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IFBhY2tldDhoJiBmcm9tKSB7CisgIF9tbV9zdG9yZXVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4odG8pLCBmcm9tLngpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGgKK3Bsb2FkcXVhZDxQYWNrZXQ4aD4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgUGFja2V0OGggcmVzdWx0OworICB1bnNpZ25lZCBzaG9ydCBhID0gZnJvbVswXS54OworICB1bnNpZ25lZCBzaG9ydCBiID0gZnJvbVsxXS54OworICByZXN1bHQueCA9IF9tbV9zZXRfZXBpMTYoYiwgYiwgYiwgYiwgYSwgYSwgYSwgYSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGYgaGFsZjJmbG9hdChjb25zdCBQYWNrZXQ4aCYgYSkgeworI2lmZGVmIEVJR0VOX0hBU19GUDE2X0MKKyAgcmV0dXJuIF9tbTI1Nl9jdnRwaF9wcyhhLngpOworI2Vsc2UKKyAgRUlHRU5fQUxJR04zMiBFaWdlbjo6aGFsZiBhdXhbOF07CisgIHBzdG9yZShhdXgsIGEpOworICBmbG9hdCBmMChhdXhbMF0pOworICBmbG9hdCBmMShhdXhbMV0pOworICBmbG9hdCBmMihhdXhbMl0pOworICBmbG9hdCBmMyhhdXhbM10pOworICBmbG9hdCBmNChhdXhbNF0pOworICBmbG9hdCBmNShhdXhbNV0pOworICBmbG9hdCBmNihhdXhbNl0pOworICBmbG9hdCBmNyhhdXhbN10pOworCisgIHJldHVybiBfbW0yNTZfc2V0X3BzKGY3LCBmNiwgZjUsIGY0LCBmMywgZjIsIGYxLCBmMCk7CisjZW5kaWYKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aCBmbG9hdDJoYWxmKGNvbnN0IFBhY2tldDhmJiBhKSB7CisjaWZkZWYgRUlHRU5fSEFTX0ZQMTZfQworICBQYWNrZXQ4aCByZXN1bHQ7CisgIHJlc3VsdC54ID0gX21tMjU2X2N2dHBzX3BoKGEsIF9NTV9GUk9VTkRfVE9fTkVBUkVTVF9JTlR8X01NX0ZST1VORF9OT19FWEMpOworICByZXR1cm4gcmVzdWx0OworI2Vsc2UKKyAgRUlHRU5fQUxJR04zMiBmbG9hdCBhdXhbOF07CisgIHBzdG9yZShhdXgsIGEpOworICBFaWdlbjo6aGFsZiBoMChhdXhbMF0pOworICBFaWdlbjo6aGFsZiBoMShhdXhbMV0pOworICBFaWdlbjo6aGFsZiBoMihhdXhbMl0pOworICBFaWdlbjo6aGFsZiBoMyhhdXhbM10pOworICBFaWdlbjo6aGFsZiBoNChhdXhbNF0pOworICBFaWdlbjo6aGFsZiBoNShhdXhbNV0pOworICBFaWdlbjo6aGFsZiBoNihhdXhbNl0pOworICBFaWdlbjo6aGFsZiBoNyhhdXhbN10pOworCisgIFBhY2tldDhoIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBfbW1fc2V0X2VwaTE2KGg3LngsIGg2LngsIGg1LngsIGg0LngsIGgzLngsIGgyLngsIGgxLngsIGgwLngpOworICByZXR1cm4gcmVzdWx0OworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ4aCBwY29uaihjb25zdCBQYWNrZXQ4aCYgYSkgeyByZXR1cm4gYTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGggcGFkZDxQYWNrZXQ4aD4oY29uc3QgUGFja2V0OGgmIGEsIGNvbnN0IFBhY2tldDhoJiBiKSB7CisgIFBhY2tldDhmIGFmID0gaGFsZjJmbG9hdChhKTsKKyAgUGFja2V0OGYgYmYgPSBoYWxmMmZsb2F0KGIpOworICBQYWNrZXQ4ZiByZiA9IHBhZGQoYWYsIGJmKTsKKyAgcmV0dXJuIGZsb2F0MmhhbGYocmYpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGggcG11bDxQYWNrZXQ4aD4oY29uc3QgUGFja2V0OGgmIGEsIGNvbnN0IFBhY2tldDhoJiBiKSB7CisgIFBhY2tldDhmIGFmID0gaGFsZjJmbG9hdChhKTsKKyAgUGFja2V0OGYgYmYgPSBoYWxmMmZsb2F0KGIpOworICBQYWNrZXQ4ZiByZiA9IHBtdWwoYWYsIGJmKTsKKyAgcmV0dXJuIGZsb2F0MmhhbGYocmYpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGggcGdhdGhlcjxFaWdlbjo6aGFsZiwgUGFja2V0OGg+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIFBhY2tldDhoIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBfbW1fc2V0X2VwaTE2KGZyb21bNypzdHJpZGVdLngsIGZyb21bNipzdHJpZGVdLngsIGZyb21bNSpzdHJpZGVdLngsIGZyb21bNCpzdHJpZGVdLngsIGZyb21bMypzdHJpZGVdLngsIGZyb21bMipzdHJpZGVdLngsIGZyb21bMSpzdHJpZGVdLngsIGZyb21bMCpzdHJpZGVdLngpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc2NhdHRlcjxFaWdlbjo6aGFsZiwgUGFja2V0OGg+KEVpZ2VuOjpoYWxmKiB0bywgY29uc3QgUGFja2V0OGgmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgRUlHRU5fQUxJR04zMiBFaWdlbjo6aGFsZiBhdXhbOF07CisgIHBzdG9yZShhdXgsIGZyb20pOworICB0b1tzdHJpZGUqMF0ueCA9IGF1eFswXS54OworICB0b1tzdHJpZGUqMV0ueCA9IGF1eFsxXS54OworICB0b1tzdHJpZGUqMl0ueCA9IGF1eFsyXS54OworICB0b1tzdHJpZGUqM10ueCA9IGF1eFszXS54OworICB0b1tzdHJpZGUqNF0ueCA9IGF1eFs0XS54OworICB0b1tzdHJpZGUqNV0ueCA9IGF1eFs1XS54OworICB0b1tzdHJpZGUqNl0ueCA9IGF1eFs2XS54OworICB0b1tzdHJpZGUqN10ueCA9IGF1eFs3XS54OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgcHJlZHV4PFBhY2tldDhoPihjb25zdCBQYWNrZXQ4aCYgYSkgeworICBQYWNrZXQ4ZiBhZiA9IGhhbGYyZmxvYXQoYSk7CisgIGZsb2F0IHJlZHVjZWQgPSBwcmVkdXg8UGFja2V0OGY+KGFmKTsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKHJlZHVjZWQpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgcHJlZHV4X21heDxQYWNrZXQ4aD4oY29uc3QgUGFja2V0OGgmIGEpIHsKKyAgUGFja2V0OGYgYWYgPSBoYWxmMmZsb2F0KGEpOworICBmbG9hdCByZWR1Y2VkID0gcHJlZHV4X21heDxQYWNrZXQ4Zj4oYWYpOworICByZXR1cm4gRWlnZW46OmhhbGYocmVkdWNlZCk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBwcmVkdXhfbWluPFBhY2tldDhoPihjb25zdCBQYWNrZXQ4aCYgYSkgeworICBQYWNrZXQ4ZiBhZiA9IGhhbGYyZmxvYXQoYSk7CisgIGZsb2F0IHJlZHVjZWQgPSBwcmVkdXhfbWluPFBhY2tldDhmPihhZik7CisgIHJldHVybiBFaWdlbjo6aGFsZihyZWR1Y2VkKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIHByZWR1eF9tdWw8UGFja2V0OGg+KGNvbnN0IFBhY2tldDhoJiBhKSB7CisgIFBhY2tldDhmIGFmID0gaGFsZjJmbG9hdChhKTsKKyAgZmxvYXQgcmVkdWNlZCA9IHByZWR1eF9tdWw8UGFja2V0OGY+KGFmKTsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKHJlZHVjZWQpOworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0OGgsOD4mIGtlcm5lbCkgeworICBfX20xMjhpIGEgPSBrZXJuZWwucGFja2V0WzBdLng7CisgIF9fbTEyOGkgYiA9IGtlcm5lbC5wYWNrZXRbMV0ueDsKKyAgX19tMTI4aSBjID0ga2VybmVsLnBhY2tldFsyXS54OworICBfX20xMjhpIGQgPSBrZXJuZWwucGFja2V0WzNdLng7CisgIF9fbTEyOGkgZSA9IGtlcm5lbC5wYWNrZXRbNF0ueDsKKyAgX19tMTI4aSBmID0ga2VybmVsLnBhY2tldFs1XS54OworICBfX20xMjhpIGcgPSBrZXJuZWwucGFja2V0WzZdLng7CisgIF9fbTEyOGkgaCA9IGtlcm5lbC5wYWNrZXRbN10ueDsKKworICBfX20xMjhpIGEwM2IwMyA9IF9tbV91bnBhY2tsb19lcGkxNihhLCBiKTsKKyAgX19tMTI4aSBjMDNkMDMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYywgZCk7CisgIF9fbTEyOGkgZTAzZjAzID0gX21tX3VucGFja2xvX2VwaTE2KGUsIGYpOworICBfX20xMjhpIGcwM2gwMyA9IF9tbV91bnBhY2tsb19lcGkxNihnLCBoKTsKKyAgX19tMTI4aSBhNDdiNDcgPSBfbW1fdW5wYWNraGlfZXBpMTYoYSwgYik7CisgIF9fbTEyOGkgYzQ3ZDQ3ID0gX21tX3VucGFja2hpX2VwaTE2KGMsIGQpOworICBfX20xMjhpIGU0N2Y0NyA9IF9tbV91bnBhY2toaV9lcGkxNihlLCBmKTsKKyAgX19tMTI4aSBnNDdoNDcgPSBfbW1fdW5wYWNraGlfZXBpMTYoZywgaCk7CisKKyAgX19tMTI4aSBhMDFiMDFjMDFkMDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoYTAzYjAzLCBjMDNkMDMpOworICBfX20xMjhpIGEyM2IyM2MyM2QyMyA9IF9tbV91bnBhY2toaV9lcGkzMihhMDNiMDMsIGMwM2QwMyk7CisgIF9fbTEyOGkgZTAxZjAxZzAxaDAxID0gX21tX3VucGFja2xvX2VwaTMyKGUwM2YwMywgZzAzaDAzKTsKKyAgX19tMTI4aSBlMjNmMjNnMjNoMjMgPSBfbW1fdW5wYWNraGlfZXBpMzIoZTAzZjAzLCBnMDNoMDMpOworICBfX20xMjhpIGE0NWI0NWM0NWQ0NSA9IF9tbV91bnBhY2tsb19lcGkzMihhNDdiNDcsIGM0N2Q0Nyk7CisgIF9fbTEyOGkgYTY3YjY3YzY3ZDY3ID0gX21tX3VucGFja2hpX2VwaTMyKGE0N2I0NywgYzQ3ZDQ3KTsKKyAgX19tMTI4aSBlNDVmNDVnNDVoNDUgPSBfbW1fdW5wYWNrbG9fZXBpMzIoZTQ3ZjQ3LCBnNDdoNDcpOworICBfX20xMjhpIGU2N2Y2N2c2N2g2NyA9IF9tbV91bnBhY2toaV9lcGkzMihlNDdmNDcsIGc0N2g0Nyk7CisKKyAgX19tMTI4aSBhMGIwYzBkMGUwZjBnMGgwID0gX21tX3VucGFja2xvX2VwaTY0KGEwMWIwMWMwMWQwMSwgZTAxZjAxZzAxaDAxKTsKKyAgX19tMTI4aSBhMWIxYzFkMWUxZjFnMWgxID0gX21tX3VucGFja2hpX2VwaTY0KGEwMWIwMWMwMWQwMSwgZTAxZjAxZzAxaDAxKTsKKyAgX19tMTI4aSBhMmIyYzJkMmUyZjJnMmgyID0gX21tX3VucGFja2xvX2VwaTY0KGEyM2IyM2MyM2QyMywgZTIzZjIzZzIzaDIzKTsKKyAgX19tMTI4aSBhM2IzYzNkM2UzZjNnM2gzID0gX21tX3VucGFja2hpX2VwaTY0KGEyM2IyM2MyM2QyMywgZTIzZjIzZzIzaDIzKTsKKyAgX19tMTI4aSBhNGI0YzRkNGU0ZjRnNGg0ID0gX21tX3VucGFja2xvX2VwaTY0KGE0NWI0NWM0NWQ0NSwgZTQ1ZjQ1ZzQ1aDQ1KTsKKyAgX19tMTI4aSBhNWI1YzVkNWU1ZjVnNWg1ID0gX21tX3VucGFja2hpX2VwaTY0KGE0NWI0NWM0NWQ0NSwgZTQ1ZjQ1ZzQ1aDQ1KTsKKyAgX19tMTI4aSBhNmI2YzZkNmU2ZjZnNmg2ID0gX21tX3VucGFja2xvX2VwaTY0KGE2N2I2N2M2N2Q2NywgZTY3ZjY3ZzY3aDY3KTsKKyAgX19tMTI4aSBhN2I3YzdkN2U3ZjdnN2g3ID0gX21tX3VucGFja2hpX2VwaTY0KGE2N2I2N2M2N2Q2NywgZTY3ZjY3ZzY3aDY3KTsKKworICBrZXJuZWwucGFja2V0WzBdLnggPSBhMGIwYzBkMGUwZjBnMGgwOworICBrZXJuZWwucGFja2V0WzFdLnggPSBhMWIxYzFkMWUxZjFnMWgxOworICBrZXJuZWwucGFja2V0WzJdLnggPSBhMmIyYzJkMmUyZjJnMmgyOworICBrZXJuZWwucGFja2V0WzNdLnggPSBhM2IzYzNkM2UzZjNnM2gzOworICBrZXJuZWwucGFja2V0WzRdLnggPSBhNGI0YzRkNGU0ZjRnNGg0OworICBrZXJuZWwucGFja2V0WzVdLnggPSBhNWI1YzVkNWU1ZjVnNWg1OworICBrZXJuZWwucGFja2V0WzZdLnggPSBhNmI2YzZkNmU2ZjZnNmg2OworICBrZXJuZWwucGFja2V0WzddLnggPSBhN2I3YzdkN2U3ZjdnN2g3OworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0OGgsND4mIGtlcm5lbCkgeworICBFSUdFTl9BTElHTjMyIEVpZ2VuOjpoYWxmIGluWzRdWzhdOworICBwc3RvcmU8RWlnZW46OmhhbGY+KGluWzBdLCBrZXJuZWwucGFja2V0WzBdKTsKKyAgcHN0b3JlPEVpZ2VuOjpoYWxmPihpblsxXSwga2VybmVsLnBhY2tldFsxXSk7CisgIHBzdG9yZTxFaWdlbjo6aGFsZj4oaW5bMl0sIGtlcm5lbC5wYWNrZXRbMl0pOworICBwc3RvcmU8RWlnZW46OmhhbGY+KGluWzNdLCBrZXJuZWwucGFja2V0WzNdKTsKKworICBFSUdFTl9BTElHTjMyIEVpZ2VuOjpoYWxmIG91dFs0XVs4XTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICBvdXRbaV1bal0gPSBpbltqXVsyKmldOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgb3V0W2ldW2orNF0gPSBpbltqXVsyKmkrMV07CisgICAgfQorICB9CisKKyAga2VybmVsLnBhY2tldFswXSA9IHBsb2FkPFBhY2tldDhoPihvdXRbMF0pOworICBrZXJuZWwucGFja2V0WzFdID0gcGxvYWQ8UGFja2V0OGg+KG91dFsxXSk7CisgIGtlcm5lbC5wYWNrZXRbMl0gPSBwbG9hZDxQYWNrZXQ4aD4ob3V0WzJdKTsKKyAga2VybmVsLnBhY2tldFszXSA9IHBsb2FkPFBhY2tldDhoPihvdXRbM10pOworfQorCisKKy8vIERpc2FibGUgdGhlIGZvbGxvd2luZyBjb2RlIHNpbmNlIGl0J3MgYnJva2VuIG9uIHRvbyBtYW55IHBsYXRmb3JtcyAvIGNvbXBpbGVycy4KKy8vI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKSAmJiAoIUVJR0VOX0FSQ0hfeDg2XzY0KSAmJiAoIUVJR0VOX0NPTVBfTVNWQykKKyNlbGlmIDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICBfX202NCB4OworfSBQYWNrZXQ0aDsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPFBhY2tldDRoPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBwYWNrZXRfdHJhaXRzPEVpZ2VuOjpoYWxmPiA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cyB7CisgIHR5cGVkZWYgUGFja2V0NGggdHlwZTsKKyAgLy8gVGhlcmUgaXMgbm8gaGFsZi1zaXplIHBhY2tldCBmb3IgUGFja2V0NGguCisgIHR5cGVkZWYgUGFja2V0NGggaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSA0LAorICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorICAgIEhhc0FkZCAgICA9IDAsCisgICAgSGFzU3ViICAgID0gMCwKKyAgICBIYXNNdWwgICAgPSAwLAorICAgIEhhc05lZ2F0ZSA9IDAsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNDb25qICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAsCisgICAgSGFzRGl2ID0gMCwKKyAgICBIYXNTcXJ0ID0gMCwKKyAgICBIYXNSc3FydCA9IDAsCisgICAgSGFzRXhwID0gMCwKKyAgICBIYXNMb2cgPSAwLAorICAgIEhhc0JsZW5kID0gMAorICB9OworfTsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGg+IHsgdHlwZWRlZiBFaWdlbjo6aGFsZiB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDRoIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwc2V0MTxQYWNrZXQ0aD4oY29uc3QgRWlnZW46OmhhbGYmIGZyb20pIHsKKyAgUGFja2V0NGggcmVzdWx0OworICByZXN1bHQueCA9IF9tbV9zZXQxX3BpMTYoZnJvbS54KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVpZ2VuOjpoYWxmIHBmaXJzdDxQYWNrZXQ0aD4oY29uc3QgUGFja2V0NGgmIGZyb20pIHsKKyAgcmV0dXJuIGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfbW1fY3Z0c2k2NF9zaTMyKGZyb20ueCkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRoIHBjb25qKGNvbnN0IFBhY2tldDRoJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwYWRkPFBhY2tldDRoPihjb25zdCBQYWNrZXQ0aCYgYSwgY29uc3QgUGFja2V0NGgmIGIpIHsKKyAgX19pbnQ2NF90IGE2NCA9IF9tbV9jdnRtNjRfc2k2NChhLngpOworICBfX2ludDY0X3QgYjY0ID0gX21tX2N2dG02NF9zaTY0KGIueCk7CisKKyAgRWlnZW46OmhhbGYgaFs0XTsKKworICBFaWdlbjo6aGFsZiBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQpKTsKKyAgRWlnZW46OmhhbGYgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0KSk7CisgIGhbMF0gPSBoYSArIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gMTYpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDE2KSk7CisgIGhbMV0gPSBoYSArIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gMzIpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDMyKSk7CisgIGhbMl0gPSBoYSArIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gNDgpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDQ4KSk7CisgIGhbM10gPSBoYSArIGhiOworICBQYWNrZXQ0aCByZXN1bHQ7CisgIHJlc3VsdC54ID0gX21tX3NldF9waTE2KGhbM10ueCwgaFsyXS54LCBoWzFdLngsIGhbMF0ueCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwbXVsPFBhY2tldDRoPihjb25zdCBQYWNrZXQ0aCYgYSwgY29uc3QgUGFja2V0NGgmIGIpIHsKKyAgX19pbnQ2NF90IGE2NCA9IF9tbV9jdnRtNjRfc2k2NChhLngpOworICBfX2ludDY0X3QgYjY0ID0gX21tX2N2dG02NF9zaTY0KGIueCk7CisKKyAgRWlnZW46OmhhbGYgaFs0XTsKKworICBFaWdlbjo6aGFsZiBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQpKTsKKyAgRWlnZW46OmhhbGYgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0KSk7CisgIGhbMF0gPSBoYSAqIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gMTYpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDE2KSk7CisgIGhbMV0gPSBoYSAqIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gMzIpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDMyKSk7CisgIGhbMl0gPSBoYSAqIGhiOworICBoYSA9IGhhbGZfaW1wbDo6cmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gNDgpKTsKKyAgaGIgPSBoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYjY0ID4+IDQ4KSk7CisgIGhbM10gPSBoYSAqIGhiOworICBQYWNrZXQ0aCByZXN1bHQ7CisgIHJlc3VsdC54ID0gX21tX3NldF9waTE2KGhbM10ueCwgaFsyXS54LCBoWzFdLngsIGhbMF0ueCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwbG9hZDxQYWNrZXQ0aD4oY29uc3QgRWlnZW46OmhhbGYqIGZyb20pIHsKKyAgUGFja2V0NGggcmVzdWx0OworICByZXN1bHQueCA9IF9tbV9jdnRzaTY0X202NCgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX2ludDY0X3QqPihmcm9tKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwbG9hZHU8UGFja2V0NGg+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tKSB7CisgIFBhY2tldDRoIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBfbW1fY3Z0c2k2NF9tNjQoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19pbnQ2NF90Kj4oZnJvbSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8RWlnZW46OmhhbGY+KEVpZ2VuOjpoYWxmKiB0bywgY29uc3QgUGFja2V0NGgmIGZyb20pIHsKKyAgX19pbnQ2NF90IHIgPSBfbW1fY3Z0bTY0X3NpNjQoZnJvbS54KTsKKyAgKihyZWludGVycHJldF9jYXN0PF9faW50NjRfdCo+KHRvKSkgPSByOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PEVpZ2VuOjpoYWxmPihFaWdlbjo6aGFsZiogdG8sIGNvbnN0IFBhY2tldDRoJiBmcm9tKSB7CisgIF9faW50NjRfdCByID0gX21tX2N2dG02NF9zaTY0KGZyb20ueCk7CisgICoocmVpbnRlcnByZXRfY2FzdDxfX2ludDY0X3QqPih0bykpID0gcjsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRoCitwbG9hZHF1YWQ8UGFja2V0NGg+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tKSB7CisgIHJldHVybiBwc2V0MTxQYWNrZXQ0aD4oKmZyb20pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGggcGdhdGhlcjxFaWdlbjo6aGFsZiwgUGFja2V0NGg+KGNvbnN0IEVpZ2VuOjpoYWxmKiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIFBhY2tldDRoIHJlc3VsdDsKKyAgcmVzdWx0LnggPSBfbW1fc2V0X3BpMTYoZnJvbVszKnN0cmlkZV0ueCwgZnJvbVsyKnN0cmlkZV0ueCwgZnJvbVsxKnN0cmlkZV0ueCwgZnJvbVswKnN0cmlkZV0ueCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzY2F0dGVyPEVpZ2VuOjpoYWxmLCBQYWNrZXQ0aD4oRWlnZW46OmhhbGYqIHRvLCBjb25zdCBQYWNrZXQ0aCYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBfX2ludDY0X3QgYSA9IF9tbV9jdnRtNjRfc2k2NChmcm9tLngpOworICB0b1tzdHJpZGUqMF0ueCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhKTsKKyAgdG9bc3RyaWRlKjFdLnggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYSA+PiAxNik7CisgIHRvW3N0cmlkZSoyXS54ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KGEgPj4gMzIpOworICB0b1tzdHJpZGUqM10ueCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhID4+IDQ4KTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDRoLDQ+JiBrZXJuZWwpIHsKKyAgX19tNjQgVDAgPSBfbW1fdW5wYWNrbG9fcGkxNihrZXJuZWwucGFja2V0WzBdLngsIGtlcm5lbC5wYWNrZXRbMV0ueCk7CisgIF9fbTY0IFQxID0gX21tX3VucGFja2xvX3BpMTYoa2VybmVsLnBhY2tldFsyXS54LCBrZXJuZWwucGFja2V0WzNdLngpOworICBfX202NCBUMiA9IF9tbV91bnBhY2toaV9waTE2KGtlcm5lbC5wYWNrZXRbMF0ueCwga2VybmVsLnBhY2tldFsxXS54KTsKKyAgX19tNjQgVDMgPSBfbW1fdW5wYWNraGlfcGkxNihrZXJuZWwucGFja2V0WzJdLngsIGtlcm5lbC5wYWNrZXRbM10ueCk7CisKKyAga2VybmVsLnBhY2tldFswXS54ID0gX21tX3VucGFja2xvX3BpMzIoVDAsIFQxKTsKKyAga2VybmVsLnBhY2tldFsxXS54ID0gX21tX3VucGFja2hpX3BpMzIoVDAsIFQxKTsKKyAga2VybmVsLnBhY2tldFsyXS54ID0gX21tX3VucGFja2xvX3BpMzIoVDIsIFQzKTsKKyAga2VybmVsLnBhY2tldFszXS54ID0gX21tX3VucGFja2hpX3BpMzIoVDIsIFQzKTsKK30KKworI2VuZGlmCisKK30KK30KKworI2VuZGlmIC8vIEVJR0VOX1BBQ0tFVF9NQVRIX0hBTEZfQ1VEQV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvVHlwZUNhc3RpbmcuaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ1VEQS9UeXBlQ2FzdGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvVHlwZUNhc3RpbmcuaApAQCAtMCwwICsxLDIxMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UWVBFX0NBU1RJTkdfQ1VEQV9ICisjZGVmaW5lIEVJR0VOX1RZUEVfQ0FTVElOR19DVURBX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8Pgorc3RydWN0IHNjYWxhcl9jYXN0X29wPGZsb2F0LCBFaWdlbjo6aGFsZj4geworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY2FzdF9vcCkKKyAgdHlwZWRlZiBFaWdlbjo6aGFsZiByZXN1bHRfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBFaWdlbjo6aGFsZiBvcGVyYXRvcigpIChjb25zdCBmbG9hdCYgYSkgY29uc3QgeworICAgICNpZiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpICYmIGRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgX19DVURBX0FSQ0hfXyA+PSAzMDAKKyAgICAgIHJldHVybiBfX2Zsb2F0MmhhbGYoYSk7CisgICAgI2Vsc2UKKyAgICAgIHJldHVybiBFaWdlbjo6aGFsZihhKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jYXN0X29wPGZsb2F0LCBFaWdlbjo6aGFsZj4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxmbG9hdD46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKKwordGVtcGxhdGU8Pgorc3RydWN0IHNjYWxhcl9jYXN0X29wPGludCwgRWlnZW46OmhhbGY+IHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Nhc3Rfb3ApCisgIHR5cGVkZWYgRWlnZW46OmhhbGYgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRWlnZW46OmhhbGYgb3BlcmF0b3IoKSAoY29uc3QgaW50JiBhKSBjb25zdCB7CisgICAgI2lmIGRlZmluZWQoRUlHRU5fSEFTX0NVREFfRlAxNikgJiYgZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiBfX0NVREFfQVJDSF9fID49IDMwMAorICAgICAgcmV0dXJuIF9fZmxvYXQyaGFsZihzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOworICAgICNlbHNlCisgICAgICByZXR1cm4gRWlnZW46OmhhbGYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jYXN0X29wPGludCwgRWlnZW46OmhhbGY+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8ZmxvYXQ+OjpBZGRDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisKK3RlbXBsYXRlPD4KK3N0cnVjdCBzY2FsYXJfY2FzdF9vcDxFaWdlbjo6aGFsZiwgZmxvYXQ+IHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Nhc3Rfb3ApCisgIHR5cGVkZWYgZmxvYXQgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgb3BlcmF0b3IoKSAoY29uc3QgRWlnZW46OmhhbGYmIGEpIGNvbnN0IHsKKyAgICAjaWYgZGVmaW5lZChFSUdFTl9IQVNfQ1VEQV9GUDE2KSAmJiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gMzAwCisgICAgICByZXR1cm4gX19oYWxmMmZsb2F0KGEpOworICAgICNlbHNlCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Nhc3Rfb3A8RWlnZW46OmhhbGYsIGZsb2F0PiA+Cit7IGVudW0geyBDb3N0ID0gTnVtVHJhaXRzPGZsb2F0Pjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworCisKKyNpZiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpICYmIGRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgX19DVURBX0FSQ0hfXyA+PSAzMDAKKwordGVtcGxhdGUgPD4KK3N0cnVjdCB0eXBlX2Nhc3RpbmdfdHJhaXRzPEVpZ2VuOjpoYWxmLCBmbG9hdD4geworICBlbnVtIHsKKyAgICBWZWN0b3JpemVkQ2FzdCA9IDEsCisgICAgU3JjQ29lZmZSYXRpbyA9IDIsCisgICAgVGd0Q29lZmZSYXRpbyA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDQgcGNhc3Q8aGFsZjIsIGZsb2F0ND4oY29uc3QgaGFsZjImIGEsIGNvbnN0IGhhbGYyJiBiKSB7CisgIGZsb2F0MiByMSA9IF9faGFsZjIyZmxvYXQyKGEpOworICBmbG9hdDIgcjIgPSBfX2hhbGYyMmZsb2F0MihiKTsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KHIxLngsIHIxLnksIHIyLngsIHIyLnkpOworfQorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHR5cGVfY2FzdGluZ190cmFpdHM8ZmxvYXQsIEVpZ2VuOjpoYWxmPiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMgorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGhhbGYyIHBjYXN0PGZsb2F0NCwgaGFsZjI+KGNvbnN0IGZsb2F0NCYgYSkgeworICAvLyBTaW1wbHkgZGlzY2FyZCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGlucHV0CisgIHJldHVybiBfX2Zsb2F0czJoYWxmMl9ybihhLngsIGEueSk7Cit9CisKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX0FWWDUxMgordGVtcGxhdGUgPD4KK3N0cnVjdCB0eXBlX2Nhc3RpbmdfdHJhaXRzPGhhbGYsIGZsb2F0PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDE2ZiBwY2FzdDxQYWNrZXQxNmgsIFBhY2tldDE2Zj4oY29uc3QgUGFja2V0MTZoJiBhKSB7CisgIHJldHVybiBoYWxmMmZsb2F0KGEpOworfQorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHR5cGVfY2FzdGluZ190cmFpdHM8ZmxvYXQsIGhhbGY+IHsKKyAgZW51bSB7CisgICAgVmVjdG9yaXplZENhc3QgPSAxLAorICAgIFNyY0NvZWZmUmF0aW8gPSAxLAorICAgIFRndENvZWZmUmF0aW8gPSAxCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MTZoIHBjYXN0PFBhY2tldDE2ZiwgUGFja2V0MTZoPihjb25zdCBQYWNrZXQxNmYmIGEpIHsKKyAgcmV0dXJuIGZsb2F0MmhhbGYoYSk7Cit9CisKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX0FWWAorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHR5cGVfY2FzdGluZ190cmFpdHM8RWlnZW46OmhhbGYsIGZsb2F0PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDhmIHBjYXN0PFBhY2tldDhoLCBQYWNrZXQ4Zj4oY29uc3QgUGFja2V0OGgmIGEpIHsKKyAgcmV0dXJuIGhhbGYyZmxvYXQoYSk7Cit9CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdHlwZV9jYXN0aW5nX3RyYWl0czxmbG9hdCwgRWlnZW46OmhhbGY+IHsKKyAgZW51bSB7CisgICAgVmVjdG9yaXplZENhc3QgPSAxLAorICAgIFNyY0NvZWZmUmF0aW8gPSAxLAorICAgIFRndENvZWZmUmF0aW8gPSAxCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0OGggcGNhc3Q8UGFja2V0OGYsIFBhY2tldDhoPihjb25zdCBQYWNrZXQ4ZiYgYSkgeworICByZXR1cm4gZmxvYXQyaGFsZihhKTsKK30KKworLy8gRGlzYWJsZSB0aGUgZm9sbG93aW5nIGNvZGUgc2luY2UgaXQncyBicm9rZW4gb24gdG9vIG1hbnkgcGxhdGZvcm1zIC8gY29tcGlsZXJzLgorLy8jZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU0UpICYmICghRUlHRU5fQVJDSF94ODZfNjQpICYmICghRUlHRU5fQ09NUF9NU1ZDKQorI2VsaWYgMAorCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHR5cGVfY2FzdGluZ190cmFpdHM8RWlnZW46OmhhbGYsIGZsb2F0PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBjYXN0PFBhY2tldDRoLCBQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGgmIGEpIHsKKyAgX19pbnQ2NF90IGE2NCA9IF9tbV9jdnRtNjRfc2k2NChhLngpOworICBFaWdlbjo6aGFsZiBoID0gcmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQpKTsKKyAgZmxvYXQgZjEgPSBzdGF0aWNfY2FzdDxmbG9hdD4oaCk7CisgIGggPSByYXdfdWludDE2X3RvX2hhbGYoc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KGE2NCA+PiAxNikpOworICBmbG9hdCBmMiA9IHN0YXRpY19jYXN0PGZsb2F0PihoKTsKKyAgaCA9IHJhd191aW50MTZfdG9faGFsZihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oYTY0ID4+IDMyKSk7CisgIGZsb2F0IGYzID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGgpOworICBoID0gcmF3X3VpbnQxNl90b19oYWxmKHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihhNjQgPj4gNDgpKTsKKyAgZmxvYXQgZjQgPSBzdGF0aWNfY2FzdDxmbG9hdD4oaCk7CisgIHJldHVybiBfbW1fc2V0X3BzKGY0LCBmMywgZjIsIGYxKTsKK30KKwordGVtcGxhdGUgPD4KK3N0cnVjdCB0eXBlX2Nhc3RpbmdfdHJhaXRzPGZsb2F0LCBFaWdlbjo6aGFsZj4geworICBlbnVtIHsKKyAgICBWZWN0b3JpemVkQ2FzdCA9IDEsCisgICAgU3JjQ29lZmZSYXRpbyA9IDEsCisgICAgVGd0Q29lZmZSYXRpbyA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aCBwY2FzdDxQYWNrZXQ0ZiwgUGFja2V0NGg+KGNvbnN0IFBhY2tldDRmJiBhKSB7CisgIEVJR0VOX0FMSUdOMTYgZmxvYXQgYXV4WzRdOworICBwc3RvcmUoYXV4LCBhKTsKKyAgRWlnZW46OmhhbGYgaDAoYXV4WzBdKTsKKyAgRWlnZW46OmhhbGYgaDEoYXV4WzFdKTsKKyAgRWlnZW46OmhhbGYgaDIoYXV4WzJdKTsKKyAgRWlnZW46OmhhbGYgaDMoYXV4WzNdKTsKKworICBQYWNrZXQ0aCByZXN1bHQ7CisgIHJlc3VsdC54ID0gX21tX3NldF9waTE2KGgzLngsIGgyLngsIGgxLngsIGgwLngpOworICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFlQRV9DQVNUSU5HX0NVREFfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9EZWZhdWx0L1NldHRpbmdzLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0RlZmF1bHQvU2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTczNzNjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9EZWZhdWx0L1NldHRpbmdzLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisvKiBBbGwgdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpYWxpemVkIGluIHRoZQorICogYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzLCBhbmQvb3IgYnkgdGhlIHVzZXIuCisgKiBNb3JlIHRvIGNvbWUuLi4gKi8KKworI2lmbmRlZiBFSUdFTl9ERUZBVUxUX1NFVFRJTkdTX0gKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9TRVRUSU5HU19ICisKKy8qKiBEZWZpbmVzIHRoZSBtYXhpbWFsIGxvb3Agc2l6ZSB0byBlbmFibGUgbWV0YSB1bnJvbGxpbmcgb2YgbG9vcHMuCisgICogTm90ZSB0aGF0IHRoZSB2YWx1ZSBoZXJlIGlzIGV4cHJlc3NlZCBpbiBFaWdlbidzIG93biBub3Rpb24gb2YgIm51bWJlciBvZiBGTE9QUyIsCisgICogaXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb3IgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKyAgKi8KKyNpZm5kZWYgRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisjZGVmaW5lIEVJR0VOX1VOUk9MTElOR19MSU1JVCAxMDAKKyNlbmRpZgorCisvKiogRGVmaW5lcyB0aGUgdGhyZXNob2xkIGJldHdlZW4gYSAic21hbGwiIGFuZCBhICJsYXJnZSIgbWF0cml4LgorICAqIFRoaXMgdGhyZXNob2xkIGlzIG1haW5seSB1c2VkIHRvIHNlbGVjdCB0aGUgcHJvcGVyIHByb2R1Y3QgaW1wbGVtZW50YXRpb24uCisgICovCisjaWZuZGVmIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyNkZWZpbmUgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCA4CisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIG1heGltYWwgd2lkdGggb2YgdGhlIGJsb2NrcyB1c2VkIGluIHRoZSB0cmlhbmd1bGFyIHByb2R1Y3QgYW5kIHNvbHZlcgorICAqIGZvciB2ZWN0b3JzIChsZXZlbCAyIGJsYXMgeFRSTVYgYW5kIHhUUlNWKS4gVGhlIGRlZmF1bHQgaXMgOC4KKyAgKi8KKyNpZm5kZWYgRUlHRU5fVFVORV9UUklBTkdVTEFSX1BBTkVMX1dJRFRICisjZGVmaW5lIEVJR0VOX1RVTkVfVFJJQU5HVUxBUl9QQU5FTF9XSURUSCA4CisjZW5kaWYKKworCisvKiogRGVmaW5lcyB0aGUgZGVmYXVsdCBudW1iZXIgb2YgcmVnaXN0ZXJzIGF2YWlsYWJsZSBmb3IgdGhhdCBhcmNoaXRlY3R1cmUuCisgICogQ3VycmVudGx5IGl0IG11c3QgYmUgOCBvciAxNi4gT3RoZXIgdmFsdWVzIHdpbGwgZmFpbC4KKyAgKi8KKyNpZm5kZWYgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMKKyNkZWZpbmUgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMgOAorI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9ERUZBVUxUX1NFVFRJTkdTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvTkVPTi9Db21wbGV4LmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vQ29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTliNDMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vQ29tcGxleC5oCkBAIC0wLDAgKzEsNDg2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBLb25zdGFudGlub3MgTWFyZ2FyaXRpcyA8bWFya29zQGZyZWV2ZWMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01QTEVYX05FT05fSAorI2RlZmluZSBFSUdFTl9DT01QTEVYX05FT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitpbmxpbmUgdWludDMyeDRfdCBwNHVpX0NPTkpfWE9SKCkgeworLy8gU2VlIGJ1ZyAxMzI1LCBjbGFuZyBmYWlscyB0byBjYWxsIHZsZDFxX3U2NC4KKyNpZiBFSUdFTl9DT01QX0NMQU5HCisgIHVpbnQzMng0X3QgcmV0ID0geyAweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwIH07CisgIHJldHVybiByZXQ7CisjZWxzZQorICBzdGF0aWMgY29uc3QgdWludDMyX3QgY29ual9YT1JfREFUQVtdID0geyAweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwIH07CisgIHJldHVybiB2bGQxcV91MzIoIGNvbmpfWE9SX0RBVEEgKTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDMyeDJfdCBwMnVpX0NPTkpfWE9SKCkgeworICBzdGF0aWMgY29uc3QgdWludDMyX3QgY29ual9YT1JfREFUQVtdID0geyAweDAwMDAwMDAwLCAweDgwMDAwMDAwIH07CisgIHJldHVybiB2bGQxX3UzMiggY29ual9YT1JfREFUQSApOworfQorCisvLy0tLS0tLS0tLS0gZmxvYXQgLS0tLS0tLS0tLQorc3RydWN0IFBhY2tldDJjZgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZigpIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0MmNmKGNvbnN0IFBhY2tldDRmJiBhKSA6IHYoYSkge30KKyAgUGFja2V0NGYgIHY7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPiAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQyY2YgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQyY2YgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSAyLAorICAgIEhhc0hhbGZQYWNrZXQgPSAwLAorCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzRGl2ICAgID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0FicyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAwLAorICAgIEhhc01heCAgICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMAorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDJjZj4geyB0eXBlZGVmIHN0ZDo6Y29tcGxleDxmbG9hdD4gdHlwZTsgZW51bSB7c2l6ZT0yLCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBQYWNrZXQyY2YgaGFsZjsgfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwc2V0MTxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4mICBmcm9tKQoreworICBmbG9hdDMyeDJfdCByNjQ7CisgIHI2NCA9IHZsZDFfZjMyKChmbG9hdCAqKSZmcm9tKTsKKworICByZXR1cm4gUGFja2V0MmNmKHZjb21iaW5lX2YzMihyNjQsIHI2NCkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhZGQ8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBhZGQ8UGFja2V0NGY+KGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwc3ViPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihwc3ViPFBhY2tldDRmPihhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG5lZ2F0ZShjb25zdCBQYWNrZXQyY2YmIGEpIHsgcmV0dXJuIFBhY2tldDJjZihwbmVnYXRlPFBhY2tldDRmPihhLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwY29uaihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIFBhY2tldDR1aSBiID0gdnJlaW50ZXJwcmV0cV91MzJfZjMyKGEudik7CisgIHJldHVybiBQYWNrZXQyY2YodnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZlb3JxX3UzMihiLCBwNHVpX0NPTkpfWE9SKCkpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKQoreworICBQYWNrZXQ0ZiB2MSwgdjI7CisKKyAgLy8gR2V0IHRoZSByZWFsIHZhbHVlcyBvZiBhIHwgYTFfcmUgfCBhMV9yZSB8IGEyX3JlIHwgYTJfcmUgfAorICB2MSA9IHZjb21iaW5lX2YzMih2ZHVwX2xhbmVfZjMyKHZnZXRfbG93X2YzMihhLnYpLCAwKSwgdmR1cF9sYW5lX2YzMih2Z2V0X2hpZ2hfZjMyKGEudiksIDApKTsKKyAgLy8gR2V0IHRoZSBpbWFnIHZhbHVlcyBvZiBhIHwgYTFfaW0gfCBhMV9pbSB8IGEyX2ltIHwgYTJfaW0gfAorICB2MiA9IHZjb21iaW5lX2YzMih2ZHVwX2xhbmVfZjMyKHZnZXRfbG93X2YzMihhLnYpLCAxKSwgdmR1cF9sYW5lX2YzMih2Z2V0X2hpZ2hfZjMyKGEudiksIDEpKTsKKyAgLy8gTXVsdGlwbHkgdGhlIHJlYWwgYSB3aXRoIGIKKyAgdjEgPSB2bXVscV9mMzIodjEsIGIudik7CisgIC8vIE11bHRpcGx5IHRoZSBpbWFnIGEgd2l0aCBiCisgIHYyID0gdm11bHFfZjMyKHYyLCBiLnYpOworICAvLyBDb25qdWdhdGUgdjIgCisgIHYyID0gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZlb3JxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIodjIpLCBwNHVpX0NPTkpfWE9SKCkpKTsKKyAgLy8gU3dhcCByZWFsL2ltYWcgZWxlbWVudHMgaW4gdjIuCisgIHYyID0gdnJldjY0cV9mMzIodjIpOworICAvLyBBZGQgYW5kIHJldHVybiB0aGUgcmVzdWx0CisgIHJldHVybiBQYWNrZXQyY2YodmFkZHFfZjMyKHYxLCB2MikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmQgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2cmVpbnRlcnByZXRxX2YzMl91MzIodmFuZHFfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhLnYpLHZyZWludGVycHJldHFfdTMyX2YzMihiLnYpKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwb3IgICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIHJldHVybiBQYWNrZXQyY2YodnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZvcnJxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIoYS52KSx2cmVpbnRlcnByZXRxX3UzMl9mMzIoYi52KSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHhvciAgIDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKQoreworICByZXR1cm4gUGFja2V0MmNmKHZyZWludGVycHJldHFfZjMyX3UzMih2ZW9ycV91MzIodnJlaW50ZXJwcmV0cV91MzJfZjMyKGEudiksdnJlaW50ZXJwcmV0cV91MzJfZjMyKGIudikpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2cmVpbnRlcnByZXRxX2YzMl91MzIodmJpY3FfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhLnYpLHZyZWludGVycHJldHFfdTMyX2YzMihiLnYpKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZDxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWR1PFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MmNmKHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZGR1cDxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDJjZj4oKmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBwc3RvcmUoKGZsb2F0Kil0bywgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgdG8sIGNvbnN0IFBhY2tldDJjZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgcHN0b3JldSgoZmxvYXQqKXRvLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDJjZiBwZ2F0aGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBQYWNrZXQ0ZiByZXMgPSBwc2V0MTxQYWNrZXQ0Zj4oMC5mKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoc3RkOjpyZWFsKGZyb21bMCpzdHJpZGVdKSwgcmVzLCAwKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoc3RkOjppbWFnKGZyb21bMCpzdHJpZGVdKSwgcmVzLCAxKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoc3RkOjpyZWFsKGZyb21bMSpzdHJpZGVdKSwgcmVzLCAyKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoc3RkOjppbWFnKGZyb21bMSpzdHJpZGVdKSwgcmVzLCAzKTsKKyAgcmV0dXJuIFBhY2tldDJjZihyZXMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDJjZj4oc3RkOjpjb21wbGV4PGZsb2F0PiogdG8sIGNvbnN0IFBhY2tldDJjZiYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICB0b1tzdHJpZGUqMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KHZnZXRxX2xhbmVfZjMyKGZyb20udiwgMCksIHZnZXRxX2xhbmVfZjMyKGZyb20udiwgMSkpOworICB0b1tzdHJpZGUqMV0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KHZnZXRxX2xhbmVfZjMyKGZyb20udiwgMiksIHZnZXRxX2xhbmVfZjMyKGZyb20udiwgMykpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgYWRkcikgeyBFSUdFTl9BUk1fUFJFRkVUQ0goKGZsb2F0ICopYWRkcik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gIHBmaXJzdDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBFSUdFTl9BTElHTjE2IHhbMl07CisgIHZzdDFxX2YzMigoZmxvYXQgKil4LCBhLnYpOworICByZXR1cm4geFswXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwcmV2ZXJzZShjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGk7CisgIFBhY2tldDRmIGFfcjEyODsKKworICBhX2xvID0gdmdldF9sb3dfZjMyKGEudik7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfZjMyKGEudik7CisgIGFfcjEyOCA9IHZjb21iaW5lX2YzMihhX2hpLCBhX2xvKTsKKworICByZXR1cm4gUGFja2V0MmNmKGFfcjEyOCk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNwbHhmbGlwPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICByZXR1cm4gUGFja2V0MmNmKHZyZXY2NHFfZjMyKGEudikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiBwcmVkdXg8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGExLCBhMjsKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBzOworCisgIGExID0gdmdldF9sb3dfZjMyKGEudik7CisgIGEyID0gdmdldF9oaWdoX2YzMihhLnYpOworICBhMiA9IHZhZGRfZjMyKGExLCBhMik7CisgIHZzdDFfZjMyKChmbG9hdCAqKSZzLCBhMik7CisKKyAgcmV0dXJuIHM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJlZHV4cDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiogdmVjcykKK3sKKyAgUGFja2V0NGYgc3VtMSwgc3VtMiwgc3VtOworCisgIC8vIEFkZCB0aGUgZmlyc3QgdHdvIDY0LWJpdCBmbG9hdDMyeDJfdCBvZiB2ZWNzWzBdCisgIHN1bTEgPSB2Y29tYmluZV9mMzIodmdldF9sb3dfZjMyKHZlY3NbMF0udiksIHZnZXRfbG93X2YzMih2ZWNzWzFdLnYpKTsKKyAgc3VtMiA9IHZjb21iaW5lX2YzMih2Z2V0X2hpZ2hfZjMyKHZlY3NbMF0udiksIHZnZXRfaGlnaF9mMzIodmVjc1sxXS52KSk7CisgIHN1bSA9IHZhZGRxX2YzMihzdW0xLCBzdW0yKTsKKworICByZXR1cm4gUGFja2V0MmNmKHN1bSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eF9tdWw8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGExLCBhMiwgdjEsIHYyLCBwcm9kOworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHM7CisKKyAgYTEgPSB2Z2V0X2xvd19mMzIoYS52KTsKKyAgYTIgPSB2Z2V0X2hpZ2hfZjMyKGEudik7CisgICAvLyBHZXQgdGhlIHJlYWwgdmFsdWVzIG9mIGEgfCBhMV9yZSB8IGExX3JlIHwgYTJfcmUgfCBhMl9yZSB8CisgIHYxID0gdmR1cF9sYW5lX2YzMihhMSwgMCk7CisgIC8vIEdldCB0aGUgcmVhbCB2YWx1ZXMgb2YgYSB8IGExX2ltIHwgYTFfaW0gfCBhMl9pbSB8IGEyX2ltIHwKKyAgdjIgPSB2ZHVwX2xhbmVfZjMyKGExLCAxKTsKKyAgLy8gTXVsdGlwbHkgdGhlIHJlYWwgYSB3aXRoIGIKKyAgdjEgPSB2bXVsX2YzMih2MSwgYTIpOworICAvLyBNdWx0aXBseSB0aGUgaW1hZyBhIHdpdGggYgorICB2MiA9IHZtdWxfZjMyKHYyLCBhMik7CisgIC8vIENvbmp1Z2F0ZSB2MiAKKyAgdjIgPSB2cmVpbnRlcnByZXRfZjMyX3UzMih2ZW9yX3UzMih2cmVpbnRlcnByZXRfdTMyX2YzMih2MiksIHAydWlfQ09OSl9YT1IoKSkpOworICAvLyBTd2FwIHJlYWwvaW1hZyBlbGVtZW50cyBpbiB2Mi4KKyAgdjIgPSB2cmV2NjRfZjMyKHYyKTsKKyAgLy8gQWRkIHYxLCB2MgorICBwcm9kID0gdmFkZF9mMzIodjEsIHYyKTsKKworICB2c3QxX2YzMigoZmxvYXQgKikmcywgcHJvZCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDJjZj4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBzdGF0aWMgdm9pZCBydW4oUGFja2V0MmNmJiBmaXJzdCwgY29uc3QgUGFja2V0MmNmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0LnYgPSB2ZXh0cV9mMzIoZmlyc3Qudiwgc2Vjb25kLnYsIDIpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIGZhbHNlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChhLCBwY29uaihiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwocGNvbmooYSksIGIpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgdHJ1ZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gcGNvbmooaW50ZXJuYWw6OnBtdWwoYSwgYikpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBkaXY8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgLy8gVE9ETyBvcHRpbWl6ZSBpdCBmb3IgTkVPTgorICBQYWNrZXQyY2YgcmVzID0gY29ual9oZWxwZXI8UGFja2V0MmNmLFBhY2tldDJjZixmYWxzZSx0cnVlPigpLnBtdWwoYSxiKTsKKyAgUGFja2V0NGYgcywgcmV2X3M7CisKKyAgLy8gdGhpcyBjb21wdXRlcyB0aGUgbm9ybQorICBzID0gdm11bHFfZjMyKGIudiwgYi52KTsKKyAgcmV2X3MgPSB2cmV2NjRxX2YzMihzKTsKKworICByZXR1cm4gUGFja2V0MmNmKHBkaXYocmVzLnYsIHZhZGRxX2YzMihzLHJldl9zKSkpOworfQorCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQyY2YsMj4mIGtlcm5lbCkgeworICBQYWNrZXQ0ZiB0bXAgPSB2Y29tYmluZV9mMzIodmdldF9oaWdoX2YzMihrZXJuZWwucGFja2V0WzBdLnYpLCB2Z2V0X2hpZ2hfZjMyKGtlcm5lbC5wYWNrZXRbMV0udikpOworICBrZXJuZWwucGFja2V0WzBdLnYgPSB2Y29tYmluZV9mMzIodmdldF9sb3dfZjMyKGtlcm5lbC5wYWNrZXRbMF0udiksIHZnZXRfbG93X2YzMihrZXJuZWwucGFja2V0WzFdLnYpKTsKKyAga2VybmVsLnBhY2tldFsxXS52ID0gdG1wOworfQorCisvLy0tLS0tLS0tLS0gZG91YmxlIC0tLS0tLS0tLS0KKyNpZiBFSUdFTl9BUkNIX0FSTTY0ICYmICFFSUdFTl9BUFBMRV9ET1VCTEVfTkVPTl9CVUcKKworLy8gU2VlIGJ1ZyAxMzI1LCBjbGFuZyBmYWlscyB0byBjYWxsIHZsZDFxX3U2NC4KKyNpZiBFSUdFTl9DT01QX0NMQU5HCisgIHN0YXRpYyB1aW50NjR4Ml90IHAydWxfQ09OSl9YT1IgPSB7MHgwLCAweDgwMDAwMDAwMDAwMDAwMDB9OworI2Vsc2UKKyAgY29uc3QgdWludDY0X3QgIHAydWxfY29ual9YT1JfREFUQVtdID0geyAweDAsIDB4ODAwMDAwMDAwMDAwMDAwMCB9OworICBzdGF0aWMgdWludDY0eDJfdCBwMnVsX0NPTkpfWE9SID0gdmxkMXFfdTY0KCBwMnVsX2NvbmpfWE9SX0RBVEEgKTsKKyNlbmRpZgorCitzdHJ1Y3QgUGFja2V0MWNkCit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkKCkge30KKyAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBQYWNrZXQxY2QoY29uc3QgUGFja2V0MmQmIGEpIDogdihhKSB7fQorICBQYWNrZXQyZCB2OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDFjZCB0eXBlOworICB0eXBlZGVmIFBhY2tldDFjZCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDAsCisgICAgc2l6ZSA9IDEsCisgICAgSGFzSGFsZlBhY2tldCA9IDAsCisKKyAgICBIYXNBZGQgICAgPSAxLAorICAgIEhhc1N1YiAgICA9IDEsCisgICAgSGFzTXVsICAgID0gMSwKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc05lZ2F0ZSA9IDEsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MWNkPiB7IHR5cGVkZWYgc3RkOjpjb21wbGV4PGRvdWJsZT4gdHlwZTsgZW51bSB7c2l6ZT0xLCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBQYWNrZXQxY2QgaGFsZjsgfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbG9hZDxQYWNrZXQxY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MWNkKHBsb2FkPFBhY2tldDJkPigoY29uc3QgZG91YmxlKilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWR1PFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDFjZChwbG9hZHU8UGFja2V0MmQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBzZXQxPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mICBmcm9tKQoreyAvKiBoZXJlIHdlIHJlYWxseSBoYXZlIHRvIHVzZSB1bmFsaWduZWQgbG9hZHMgOiggKi8gcmV0dXJuIHBsb2FkdTxQYWNrZXQxY2Q+KCZmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBhZGQ8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKHBhZGQ8UGFja2V0MmQ+KGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwc3ViPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChwc3ViPFBhY2tldDJkPihhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG5lZ2F0ZShjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIFBhY2tldDFjZChwbmVnYXRlPFBhY2tldDJkPihhLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwY29uaihjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIFBhY2tldDFjZCh2cmVpbnRlcnByZXRxX2Y2NF91NjQodmVvcnFfdTY0KHZyZWludGVycHJldHFfdTY0X2Y2NChhLnYpLCBwMnVsX0NPTkpfWE9SKSkpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKQoreworICBQYWNrZXQyZCB2MSwgdjI7CisKKyAgLy8gR2V0IHRoZSByZWFsIHZhbHVlcyBvZiBhIAorICB2MSA9IHZkdXBxX2xhbmVfZjY0KHZnZXRfbG93X2Y2NChhLnYpLCAwKTsKKyAgLy8gR2V0IHRoZSBpbWFnIHZhbHVlcyBvZiBhCisgIHYyID0gdmR1cHFfbGFuZV9mNjQodmdldF9oaWdoX2Y2NChhLnYpLCAwKTsKKyAgLy8gTXVsdGlwbHkgdGhlIHJlYWwgYSB3aXRoIGIKKyAgdjEgPSB2bXVscV9mNjQodjEsIGIudik7CisgIC8vIE11bHRpcGx5IHRoZSBpbWFnIGEgd2l0aCBiCisgIHYyID0gdm11bHFfZjY0KHYyLCBiLnYpOworICAvLyBDb25qdWdhdGUgdjIgCisgIHYyID0gdnJlaW50ZXJwcmV0cV9mNjRfdTY0KHZlb3JxX3U2NCh2cmVpbnRlcnByZXRxX3U2NF9mNjQodjIpLCBwMnVsX0NPTkpfWE9SKSk7CisgIC8vIFN3YXAgcmVhbC9pbWFnIGVsZW1lbnRzIGluIHYyLgorICB2MiA9IHByZXZlcnNlPFBhY2tldDJkPih2Mik7CisgIC8vIEFkZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKKyAgcmV0dXJuIFBhY2tldDFjZCh2YWRkcV9mNjQodjEsIHYyKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFuZCAgIDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKQoreworICByZXR1cm4gUGFja2V0MWNkKHZyZWludGVycHJldHFfZjY0X3U2NCh2YW5kcV91NjQodnJlaW50ZXJwcmV0cV91NjRfZjY0KGEudiksdnJlaW50ZXJwcmV0cV91NjRfZjY0KGIudikpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBvciAgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgcmV0dXJuIFBhY2tldDFjZCh2cmVpbnRlcnByZXRxX2Y2NF91NjQodm9ycnFfdTY0KHZyZWludGVycHJldHFfdTY0X2Y2NChhLnYpLHZyZWludGVycHJldHFfdTY0X2Y2NChiLnYpKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBweG9yICAgPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpCit7CisgIHJldHVybiBQYWNrZXQxY2QodnJlaW50ZXJwcmV0cV9mNjRfdTY0KHZlb3JxX3U2NCh2cmVpbnRlcnByZXRxX3U2NF9mNjQoYS52KSx2cmVpbnRlcnByZXRxX3U2NF9mNjQoYi52KSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFuZG5vdDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKQoreworICByZXR1cm4gUGFja2V0MWNkKHZyZWludGVycHJldHFfZjY0X3U2NCh2YmljcV91NjQodnJlaW50ZXJwcmV0cV91NjRfZjY0KGEudiksdnJlaW50ZXJwcmV0cV91NjRfZjY0KGIudikpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWRkdXA8UGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSkgeyByZXR1cm4gcHNldDE8UGFja2V0MWNkPigqZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlIDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgcHN0b3JlKChkb3VibGUqKXRvLCBmcm9tLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oc3RkOjpjb21wbGV4PGRvdWJsZT4gKiAgIHRvLCBjb25zdCBQYWNrZXQxY2QmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHBzdG9yZXUoKGRvdWJsZSopdG8sIGZyb20udik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqICAgYWRkcikgeyBFSUdFTl9BUk1fUFJFRkVUQ0goKGRvdWJsZSAqKWFkZHIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDFjZCBwZ2F0aGVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBQYWNrZXQxY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIFBhY2tldDJkIHJlcyA9IHBzZXQxPFBhY2tldDJkPigwLjApOworICByZXMgPSB2c2V0cV9sYW5lX2Y2NChzdGQ6OnJlYWwoZnJvbVswKnN0cmlkZV0pLCByZXMsIDApOworICByZXMgPSB2c2V0cV9sYW5lX2Y2NChzdGQ6OmltYWcoZnJvbVswKnN0cmlkZV0pLCByZXMsIDEpOworICByZXR1cm4gUGFja2V0MWNkKHJlcyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFBhY2tldDFjZD4oc3RkOjpjb21wbGV4PGRvdWJsZT4qIHRvLCBjb25zdCBQYWNrZXQxY2QmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgdG9bc3RyaWRlKjBdID0gc3RkOjpjb21wbGV4PGRvdWJsZT4odmdldHFfbGFuZV9mNjQoZnJvbS52LCAwKSwgdmdldHFfbGFuZV9mNjQoZnJvbS52LCAxKSk7Cit9CisKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxkb3VibGU+ICBwZmlyc3Q8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEpCit7CisgIHN0ZDo6Y29tcGxleDxkb3VibGU+IEVJR0VOX0FMSUdOMTYgcmVzOworICBwc3RvcmU8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigmcmVzLCBhKTsKKworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHByZXZlcnNlKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gYTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKSB7IHJldHVybiBwZmlyc3QoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwcmVkdXhwPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkKiB2ZWNzKSB7IHJldHVybiB2ZWNzWzBdOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBwcmVkdXhfbXVsPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKSB7IHJldHVybiBwZmlyc3QoYSk7IH0KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MWNkPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQxY2QmIC8qZmlyc3QqLywgY29uc3QgUGFja2V0MWNkJiAvKnNlY29uZCovKQorICB7CisgICAgLy8gRklYTUUgaXMgaXQgc3VyZSB3ZSBuZXZlciBoYXZlIHRvIGFsaWduIGEgUGFja2V0MWNkPworICAgIC8vIEV2ZW4gdGhvdWdoIGEgc3RkOjpjb21wbGV4PGRvdWJsZT4gaGFzIDE2IGJ5dGVzLCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgYWxpZ25lZCBvbiBhIDE2IGJ5dGVzIGJvdW5kYXJ5Li4uCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDFjZCwgUGFja2V0MWNkLCBmYWxzZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbWFkZChjb25zdCBQYWNrZXQxY2QmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWwoY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgcGNvbmooYikpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDFjZCwgdHJ1ZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKHBjb25qKGEpLCBiKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIHRydWUsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIHBjb25qKGludGVybmFsOjpwbXVsKGEsIGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwZGl2PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpCit7CisgIC8vIFRPRE8gb3B0aW1pemUgaXQgZm9yIE5FT04KKyAgUGFja2V0MWNkIHJlcyA9IGNvbmpfaGVscGVyPFBhY2tldDFjZCxQYWNrZXQxY2QsZmFsc2UsdHJ1ZT4oKS5wbXVsKGEsYik7CisgIFBhY2tldDJkIHMgPSBwbXVsPFBhY2tldDJkPihiLnYsIGIudik7CisgIFBhY2tldDJkIHJldl9zID0gcHJldmVyc2U8UGFja2V0MmQ+KHMpOworCisgIHJldHVybiBQYWNrZXQxY2QocGRpdihyZXMudiwgcGFkZDxQYWNrZXQyZD4ocyxyZXZfcykpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGNwbHhmbGlwLyo8UGFja2V0MWNkPiovKGNvbnN0IFBhY2tldDFjZCYgeCkKK3sKKyAgcmV0dXJuIFBhY2tldDFjZChwcmV2ZXJzZShQYWNrZXQyZCh4LnYpKSk7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDFjZCwyPiYga2VybmVsKQoreworICBQYWNrZXQyZCB0bXAgPSB2Y29tYmluZV9mNjQodmdldF9oaWdoX2Y2NChrZXJuZWwucGFja2V0WzBdLnYpLCB2Z2V0X2hpZ2hfZjY0KGtlcm5lbC5wYWNrZXRbMV0udikpOworICBrZXJuZWwucGFja2V0WzBdLnYgPSB2Y29tYmluZV9mNjQodmdldF9sb3dfZjY0KGtlcm5lbC5wYWNrZXRbMF0udiksIHZnZXRfbG93X2Y2NChrZXJuZWwucGFja2V0WzFdLnYpKTsKKyAga2VybmVsLnBhY2tldFsxXS52ID0gdG1wOworfQorI2VuZGlmIC8vIEVJR0VOX0FSQ0hfQVJNNjQKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9ORU9OX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvTkVPTi9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjA1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vTWF0aEZ1bmN0aW9ucy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiBUaGUgc2luLCBjb3MsIGV4cCwgYW5kIGxvZyBmdW5jdGlvbnMgb2YgdGhpcyBmaWxlIGNvbWUgZnJvbQorICogSnVsaWVuIFBvbW1pZXIncyBzc2UgbWF0aCBsaWJyYXJ5OiBodHRwOi8vZ3J1bnR0aGVwZW9uLmZyZWUuZnIvc3NlbWF0aC8KKyAqLworCisjaWZuZGVmIEVJR0VOX01BVEhfRlVOQ1RJT05TX05FT05fSAorI2RlZmluZSBFSUdFTl9NQVRIX0ZVTkNUSU9OU19ORU9OX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwZXhwPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgX3gpCit7CisgIFBhY2tldDRmIHggPSBfeDsKKyAgUGFja2V0NGYgdG1wLCBmeDsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZigxICwgMS4wZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGhhbGYsIDAuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgweDdmLCAweDdmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoZXhwX2hpLCAgODguMzc2MjYyNjY0Nzk1MGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihleHBfbG8sIC04OC4zNzYyNjI2NjQ3OTQ5Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19MT0cyRUYsIDEuNDQyNjk1MDQwODg4OTYzNDFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9DMSwgMC42OTMzNTkzNzVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9DMiwgLTIuMTIxOTQ0NDBlLTRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wMCwgMS45ODc1NjkxNTAwRS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDEsIDEuMzk4MTk5OTUwN0UtM2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3AyLCA4LjMzMzQ1MTkwNzNFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wMywgNC4xNjY1Nzk1ODk0RS0yZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDQsIDEuNjY2NjY2NTQ1OUUtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3A1LCA1LjAwMDAwMDEyMDFFLTFmKTsKKworICB4ID0gdm1pbnFfZjMyKHgsIHA0Zl9leHBfaGkpOworICB4ID0gdm1heHFfZjMyKHgsIHA0Zl9leHBfbG8pOworCisgIC8qIGV4cHJlc3MgZXhwKHgpIGFzIGV4cChnICsgbipsb2coMikpICovCisgIGZ4ID0gdm1sYXFfZjMyKHA0Zl9oYWxmLCB4LCBwNGZfY2VwaGVzX0xPRzJFRik7CisKKyAgLyogcGVyZm9ybSBhIGZsb29yZiAqLworICB0bXAgPSB2Y3Z0cV9mMzJfczMyKHZjdnRxX3MzMl9mMzIoZngpKTsKKworICAvKiBpZiBncmVhdGVyLCBzdWJzdHJhY3QgMSAqLworICBQYWNrZXQ0dWkgbWFzayA9IHZjZ3RxX2YzMih0bXAsIGZ4KTsKKyAgbWFzayA9IHZhbmRxX3UzMihtYXNrLCB2cmVpbnRlcnByZXRxX3UzMl9mMzIocDRmXzEpKTsKKworICBmeCA9IHZzdWJxX2YzMih0bXAsIHZyZWludGVycHJldHFfZjMyX3UzMihtYXNrKSk7CisKKyAgdG1wID0gdm11bHFfZjMyKGZ4LCBwNGZfY2VwaGVzX2V4cF9DMSk7CisgIFBhY2tldDRmIHogPSB2bXVscV9mMzIoZngsIHA0Zl9jZXBoZXNfZXhwX0MyKTsKKyAgeCA9IHZzdWJxX2YzMih4LCB0bXApOworICB4ID0gdnN1YnFfZjMyKHgsIHopOworCisgIFBhY2tldDRmIHkgPSB2bXVscV9mMzIocDRmX2NlcGhlc19leHBfcDAsIHgpOworICB6ID0gdm11bHFfZjMyKHgsIHgpOworICB5ID0gdmFkZHFfZjMyKHksIHA0Zl9jZXBoZXNfZXhwX3AxKTsKKyAgeSA9IHZtdWxxX2YzMih5LCB4KTsKKyAgeSA9IHZhZGRxX2YzMih5LCBwNGZfY2VwaGVzX2V4cF9wMik7CisgIHkgPSB2bXVscV9mMzIoeSwgeCk7CisgIHkgPSB2YWRkcV9mMzIoeSwgcDRmX2NlcGhlc19leHBfcDMpOworICB5ID0gdm11bHFfZjMyKHksIHgpOworICB5ID0gdmFkZHFfZjMyKHksIHA0Zl9jZXBoZXNfZXhwX3A0KTsKKyAgeSA9IHZtdWxxX2YzMih5LCB4KTsKKyAgeSA9IHZhZGRxX2YzMih5LCBwNGZfY2VwaGVzX2V4cF9wNSk7CisKKyAgeSA9IHZtdWxxX2YzMih5LCB6KTsKKyAgeSA9IHZhZGRxX2YzMih5LCB4KTsKKyAgeSA9IHZhZGRxX2YzMih5LCBwNGZfMSk7CisKKyAgLyogYnVpbGQgMl5uICovCisgIGludDMyeDRfdCBtbTsKKyAgbW0gPSB2Y3Z0cV9zMzJfZjMyKGZ4KTsKKyAgbW0gPSB2YWRkcV9zMzIobW0sIHA0aV8weDdmKTsKKyAgbW0gPSB2c2hscV9uX3MzMihtbSwgMjMpOworICBQYWNrZXQ0ZiBwb3cybiA9IHZyZWludGVycHJldHFfZjMyX3MzMihtbSk7CisKKyAgeSA9IHZtdWxxX2YzMih5LCBwb3cybik7CisgIHJldHVybiB5OworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRIX0ZVTkNUSU9OU19ORU9OX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvTkVPTi9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNmZiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsNzI5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEtvbnN0YW50aW5vcyBNYXJnYXJpdGlzIDxtYXJrb3NAZnJlZXZlYy5vcmc+CisvLyBIZWF2aWx5IGJhc2VkIG9uIEdhZWwncyBTU0UgdmVyc2lvbi4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFDS0VUX01BVEhfTkVPTl9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFVF9NQVRIX05FT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyNkZWZpbmUgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCA4CisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQKKyNkZWZpbmUgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9NQURECisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX0NKTUFERAorI2RlZmluZSBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX0NKTUFERAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMKKyNpZiBFSUdFTl9BUkNIX0FSTTY0CisjZGVmaW5lIEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTIDMyCisjZWxzZQorI2RlZmluZSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUyAxNiAKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgZmxvYXQzMngyX3QgUGFja2V0MmY7Cit0eXBlZGVmIGZsb2F0MzJ4NF90IFBhY2tldDRmOwordHlwZWRlZiBpbnQzMng0X3QgICBQYWNrZXQ0aTsKK3R5cGVkZWYgaW50MzJ4Ml90ICAgUGFja2V0Mmk7Cit0eXBlZGVmIHVpbnQzMng0X3QgIFBhY2tldDR1aTsKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihOQU1FLFgpIFwKKyAgY29uc3QgUGFja2V0NGYgcDRmXyMjTkFNRSA9IHBzZXQxPFBhY2tldDRmPihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0ZiBwNGZfIyNOQU1FID0gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHBzZXQxPGludDMyX3Q+KFgpKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0aSBwNGlfIyNOQU1FID0gcHNldDE8UGFja2V0NGk+KFgpCisKKyNpZiBFSUdFTl9BUkNIX0FSTTY0CisgIC8vIF9fYnVpbHRpbl9wcmVmZXRjaCB0ZW5kcyB0byBkbyBub3RoaW5nIG9uIEFSTTY0IGNvbXBpbGVycyBiZWNhdXNlIHRoZQorICAvLyBwcmVmZXRjaCBpbnN0cnVjdGlvbnMgdGhlcmUgYXJlIHRvbyBkZXRhaWxlZCBmb3IgX19idWlsdGluX3ByZWZldGNoIHRvIG1hcAorICAvLyBtZWFuaW5nZnVsbHkgdG8gdGhlbS4KKyAgI2RlZmluZSBFSUdFTl9BUk1fUFJFRkVUQ0goQUREUikgIF9fYXNtX18gX192b2xhdGlsZV9fKCJwcmZtIHBsZGwxa2VlcCwgWyVbYWRkcl1dXG4iIDo6W2FkZHJdICJyIihBRERSKSA6ICk7CisjZWxpZiBFSUdFTl9IQVNfQlVJTFRJTihfX2J1aWx0aW5fcHJlZmV0Y2gpIHx8IEVJR0VOX0NPTVBfR05VQworICAjZGVmaW5lIEVJR0VOX0FSTV9QUkVGRVRDSChBRERSKSBfX2J1aWx0aW5fcHJlZmV0Y2goQUREUik7CisjZWxpZiBkZWZpbmVkIF9fcGxkCisgICNkZWZpbmUgRUlHRU5fQVJNX1BSRUZFVENIKEFERFIpIF9fcGxkKEFERFIpCisjZWxpZiBFSUdFTl9BUkNIX0FSTTMyCisgICNkZWZpbmUgRUlHRU5fQVJNX1BSRUZFVENIKEFERFIpIF9fYXNtX18gX192b2xhdGlsZV9fICgicGxkIFslW2FkZHJdXVxuIiA6OiBbYWRkcl0gInIiIChBRERSKSA6ICk7CisjZWxzZQorICAvLyBieSBkZWZhdWx0IG5vIGV4cGxpY2l0IHByZWZldGNoaW5nCisgICNkZWZpbmUgRUlHRU5fQVJNX1BSRUZFVENIKEFERFIpCisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0NGYgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQ0ZiBoYWxmOyAvLyBQYWNrZXQyZiBpbnRyaW5zaWNzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSA0LAorICAgIEhhc0hhbGZQYWNrZXQ9MCwgLy8gUGFja2V0MmYgaW50cmluc2ljcyBub3QgaW1wbGVtZW50ZWQgeWV0CisgICAKKyAgICBIYXNEaXYgID0gMSwKKyAgICAvLyBGSVhNRSBjaGVjayB0aGUgSGFzKgorICAgIEhhc1NpbiAgPSAwLAorICAgIEhhc0NvcyAgPSAwLAorICAgIEhhc0xvZyAgPSAwLAorICAgIEhhc0V4cCAgPSAxLAorICAgIEhhc1NxcnQgPSAwCisgIH07Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxpbnQzMl90PiAgICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRpIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0NGkgaGFsZjsgLy8gUGFja2V0MmkgaW50cmluc2ljcyBub3QgaW1wbGVtZW50ZWQgeWV0CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQsCisgICAgSGFzSGFsZlBhY2tldD0wIC8vIFBhY2tldDJpIGludHJpbnNpY3Mgbm90IGltcGxlbWVudGVkIHlldAorICAgIC8vIEZJWE1FIGNoZWNrIHRoZSBIYXMqCisgIH07Cit9OworCisjaWYgRUlHRU5fR05VQ19BVF9NT1NUKDQsNCkgJiYgIUVJR0VOX0NPTVBfTExWTQorLy8gd29ya2Fyb3VuZCBnY2MgNC4yLCA0LjMgYW5kIDQuNCBjb21waWxhdGluIGlzc3VlCitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0MzJ4NF90IHZsZDFxX2YzMihjb25zdCBmbG9hdCogeCkgeyByZXR1cm4gOjp2bGQxcV9mMzIoKGNvbnN0IGZsb2F0MzJfdCopeCk7IH0KK0VJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQzMngyX3QgdmxkMV9mMzIgKGNvbnN0IGZsb2F0KiB4KSB7IHJldHVybiA6OnZsZDFfZjMyICgoY29uc3QgZmxvYXQzMl90Kil4KTsgfQorRUlHRU5fU1RST05HX0lOTElORSBmbG9hdDMyeDJfdCB2bGQxX2R1cF9mMzIgKGNvbnN0IGZsb2F0KiB4KSB7IHJldHVybiA6OnZsZDFfZHVwX2YzMiAoKGNvbnN0IGZsb2F0MzJfdCopeCk7IH0KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCAgICAgICAgdnN0MXFfZjMyKGZsb2F0KiB0bywgZmxvYXQzMng0X3QgZnJvbSkgeyA6OnZzdDFxX2YzMigoZmxvYXQzMl90Kil0byxmcm9tKTsgfQorRUlHRU5fU1RST05HX0lOTElORSB2b2lkICAgICAgICB2c3QxX2YzMiAoZmxvYXQqIHRvLCBmbG9hdDMyeDJfdCBmcm9tKSB7IDo6dnN0MV9mMzIgKChmbG9hdDMyX3QqKXRvLGZyb20pOyB9CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDRmPiB7IHR5cGVkZWYgZmxvYXQgICB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDRmIGhhbGY7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGk+IHsgdHlwZWRlZiBpbnQzMl90IHR5cGU7IGVudW0ge3NpemU9NCwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0NGkgaGFsZjsgfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzZXQxPFBhY2tldDRmPihjb25zdCBmbG9hdCYgIGZyb20pIHsgcmV0dXJuIHZkdXBxX25fZjMyKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHNldDE8UGFja2V0NGk+KGNvbnN0IGludDMyX3QmICAgIGZyb20pICAgeyByZXR1cm4gdmR1cHFfbl9zMzIoZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsc2V0PFBhY2tldDRmPihjb25zdCBmbG9hdCYgYSkKK3sKKyAgY29uc3QgZmxvYXQgZltdID0gezAsIDEsIDIsIDN9OworICBQYWNrZXQ0ZiBjb3VudGRvd24gPSB2bGQxcV9mMzIoZik7CisgIHJldHVybiB2YWRkcV9mMzIocHNldDE8UGFja2V0NGY+KGEpLCBjb3VudGRvd24pOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsc2V0PFBhY2tldDRpPihjb25zdCBpbnQzMl90JiBhKQoreworICBjb25zdCBpbnQzMl90IGlbXSA9IHswLCAxLCAyLCAzfTsKKyAgUGFja2V0NGkgY291bnRkb3duID0gdmxkMXFfczMyKGkpOworICByZXR1cm4gdmFkZHFfczMyKHBzZXQxPFBhY2tldDRpPihhKSwgY291bnRkb3duKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhZGQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmFkZHFfZjMyKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWRkPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZhZGRxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwc3ViPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZzdWJxX2YzMihhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHN1YjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2c3VicV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG5lZ2F0ZShjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gdm5lZ3FfZjMyKGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG5lZ2F0ZShjb25zdCBQYWNrZXQ0aSYgYSkgeyByZXR1cm4gdm5lZ3FfczMyKGEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwY29uaihjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gYTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBjb25qKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbXVsPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZtdWxxX2YzMihhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG11bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2bXVscV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGRpdjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworI2lmIEVJR0VOX0FSQ0hfQVJNNjQKKyAgcmV0dXJuIHZkaXZxX2YzMihhLGIpOworI2Vsc2UKKyAgUGFja2V0NGYgaW52LCByZXN0ZXAsIGRpdjsKKworICAvLyBORU9OIGRvZXMgbm90IG9mZmVyIGEgZGl2aWRlIGluc3RydWN0aW9uLCB3ZSBoYXZlIHRvIGRvIGEgcmVjaXByb2NhbCBhcHByb3hpbWF0aW9uCisgIC8vIEhvd2V2ZXIgTkVPTiBpbiBjb250cmFzdCB0byBvdGhlciBTSU1EIGVuZ2luZXMgKEFsdGlWZWMvU1NFKSwgb2ZmZXJzCisgIC8vIGEgcmVjaXByb2NhbCBlc3RpbWF0ZSBBTkQgYSByZWNpcHJvY2FsIHN0ZXAgLXdoaWNoIHNhdmVzIGEgZmV3IGluc3RydWN0aW9ucworICAvLyB2cmVjcGVxX2YzMigpIHJldHVybnMgYW4gZXN0aW1hdGUgdG8gMS9iLCB3aGljaCB3ZSB3aWxsIGZpbmV0dW5lIHdpdGgKKyAgLy8gTmV3dG9uLVJhcGhzb24gYW5kIHZyZWNwc3FfZjMyKCkKKyAgaW52ID0gdnJlY3BlcV9mMzIoYik7CisKKyAgLy8gVGhpcyByZXR1cm5zIGEgZGlmZmVyZW50aWFsLCBieSB3aGljaCB3ZSB3aWxsIGhhdmUgdG8gbXVsdGlwbHkgaW52IHRvIGdldCBhIGJldHRlcgorICAvLyBhcHByb3hpbWF0aW9uIG9mIDEvYi4KKyAgcmVzdGVwID0gdnJlY3BzcV9mMzIoYiwgaW52KTsKKyAgaW52ID0gdm11bHFfZjMyKHJlc3RlcCwgaW52KTsKKworICAvLyBGaW5hbGx5LCBtdWx0aXBseSBhIGJ5IDEvYiBhbmQgZ2V0IHRoZSB3YW50ZWQgcmVzdWx0IG9mIHRoZSBkaXZpc2lvbi4KKyAgZGl2ID0gdm11bHFfZjMyKGEsIGludik7CisKKyAgcmV0dXJuIGRpdjsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGRpdjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIC8qYSovLCBjb25zdCBQYWNrZXQ0aSYgLypiKi8pCit7IGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAicGFja2V0IGludGVnZXIgZGl2aXNpb24gYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTkVPTiIpOworICByZXR1cm4gcHNldDE8UGFja2V0NGk+KDApOworfQorCisvLyBDbGFuZy9BUk0gd3JvbmdseSBhZHZlcnRpc2VzIF9fQVJNX0ZFQVRVUkVfRk1BIGV2ZW4gd2hlbiBpdCdzIG5vdCBhdmFpbGFibGUsCisvLyB0aGVuIGltcGxlbWVudHMgYSBzbG93IHNvZnR3YXJlIHNjYWxhciBmYWxsYmFjayBjYWxsaW5nIGZtYWYoKSEKKy8vIEZpbGVkIExMVk0gYnVnOgorLy8gICAgIGh0dHBzOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyMTYKKyNpZiAoZGVmaW5lZCBfX0FSTV9GRUFUVVJFX0ZNQSkgJiYgIShFSUdFTl9DT01QX0NMQU5HICYmIEVJR0VOX0FSQ0hfQVJNKQorLy8gU2VlIGJ1ZyA5MzYuCisvLyBGTUEgaXMgYXZhaWxhYmxlIG9uIFZGUHY0IGkuZS4gd2hlbiBjb21waWxpbmcgd2l0aCAtbWZwdT1uZW9uLXZmcHY0LgorLy8gRk1BIGlzIGEgdHJ1ZSBmdXNlZCBtdWx0aXBseS1hZGQgaS5lLiBvbmx5IDEgcm91bmRpbmcgYXQgdGhlIGVuZCwgbm8gaW50ZXJtZWRpYXRlIHJvdW5kaW5nLgorLy8gTUxBIGlzIG5vdCBmdXNlZCBpLmUuIGRvZXMgMiByb3VuZGluZ3MuCisvLyBJbiBhZGRpdGlvbiB0byBnaXZpbmcgYmV0dGVyIGFjY3VyYWN5LCBGTUEgYWxzbyBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgaGVyZSBvbiBhIEtyYWl0IChOZXh1cyA0KToKKy8vIE1MQTogMTAgR0Zsb3AvcyA7IEZNQTogMTIgR0Zsb3BzL3MuCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1hZGQoY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiLCBjb25zdCBQYWNrZXQ0ZiYgYykgeyByZXR1cm4gdmZtYXFfZjMyKGMsYSxiKTsgfQorI2Vsc2UKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWFkZChjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIsIGNvbnN0IFBhY2tldDRmJiBjKSB7CisjaWYgRUlHRU5fQ09NUF9DTEFORyAmJiBFSUdFTl9BUkNIX0FSTQorICAvLyBDbGFuZy9BUk0gd2lsbCByZXBsYWNlIFZNTEEgYnkgVk1VTCtWQUREIGF0IGxlYXN0IGZvciBzb21lIHZhbHVlcyBvZiAtbWNwdSwKKyAgLy8gYXQgbGVhc3QgLW1jcHU9Y29ydGV4LWE4IGFuZCAtbWNwdT1jb3J0ZXgtYTcuIFNpbmNlIHRoZSBmb3JtZXIgaXMgdGhlIGRlZmF1bHQgb24KKyAgLy8gLW1hcmNoPWFybXY3LWEsIHRoYXQgaXMgYSB2ZXJ5IGNvbW1vbiBjYXNlLgorICAvLyBTZWUgZS5nLiB0aGlzIHRocmVhZDoKKyAgLy8gICAgIGh0dHA6Ly9saXN0cy5sbHZtLm9yZy9waXBlcm1haWwvbGx2bS1kZXYvMjAxMy1EZWNlbWJlci8wNjg4MDYuaHRtbAorICAvLyBGaWxlZCBMTFZNIGJ1ZzoKKyAgLy8gICAgIGh0dHBzOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyMTkKKyAgUGFja2V0NGYgciA9IGM7CisgIGFzbSB2b2xhdGlsZSgKKyAgICAidm1sYS5mMzIgJXFbcl0sICVxW2FdLCAlcVtiXSIKKyAgICA6IFtyXSAiK3ciIChyKQorICAgIDogW2FdICJ3IiAoYSksCisgICAgICBbYl0gInciIChiKQorICAgIDogKTsKKyAgcmV0dXJuIHI7CisjZWxzZQorICByZXR1cm4gdm1sYXFfZjMyKGMsYSxiKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8vIE5vIEZNQSBpbnN0cnVjdGlvbiBmb3IgaW50LCBzbyB1c2UgTUxBIHVuY29uZGl0aW9uYWxseS4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWFkZChjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIsIGNvbnN0IFBhY2tldDRpJiBjKSB7IHJldHVybiB2bWxhcV9zMzIoYyxhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWluPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZtaW5xX2YzMihhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2bWlucV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1heDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2bWF4cV9mMzIoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdm1heHFfczMyKGEsYik7IH0KKworLy8gTG9naWNhbCBPcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBmbG9hdCwgc28gd2UgaGF2ZSB0byByZWludGVycHJldCBjYXN0cyB1c2luZyBORU9OIGludHJpbnNpY3MKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYW5kPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl91MzIodmFuZHFfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhKSx2cmVpbnRlcnByZXRxX3UzMl9mMzIoYikpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYW5kPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZhbmRxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwb3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3UzMih2b3JycV91MzIodnJlaW50ZXJwcmV0cV91MzJfZjMyKGEpLHZyZWludGVycHJldHFfdTMyX2YzMihiKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBvcjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2b3JycV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHhvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZlb3JxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIoYSksdnJlaW50ZXJwcmV0cV91MzJfZjMyKGIpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHhvcjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZW9ycV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFuZG5vdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZiaWNxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIoYSksdnJlaW50ZXJwcmV0cV91MzJfZjMyKGIpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFuZG5vdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2YmljcV9zMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWQ8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgICBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gdmxkMXFfZjMyKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxvYWQ8UGFja2V0NGk+KGNvbnN0IGludDMyX3QqICBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gdmxkMXFfczMyKGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZHU8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIHZsZDFxX2YzMihmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50MzJfdCogZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gdmxkMXFfczMyKGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZGR1cDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pCit7CisgIGZsb2F0MzJ4Ml90IGxvLCBoaTsKKyAgbG8gPSB2bGQxX2R1cF9mMzIoZnJvbSk7CisgIGhpID0gdmxkMV9kdXBfZjMyKGZyb20rMSk7CisgIHJldHVybiB2Y29tYmluZV9mMzIobG8sIGhpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZGR1cDxQYWNrZXQ0aT4oY29uc3QgaW50MzJfdCogZnJvbSkKK3sKKyAgaW50MzJ4Ml90IGxvLCBoaTsKKyAgbG8gPSB2bGQxX2R1cF9zMzIoZnJvbSk7CisgIGhpID0gdmxkMV9kdXBfczMyKGZyb20rMSk7CisgIHJldHVybiB2Y29tYmluZV9zMzIobG8sIGhpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGZsb2F0PiAgKGZsb2F0KiAgICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSB2c3QxcV9mMzIodG8sIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8aW50MzJfdD4oaW50MzJfdCogIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHZzdDFxX3MzMih0bywgZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxmbG9hdD4gIChmbG9hdCogICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHZzdDFxX2YzMih0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8aW50MzJfdD4oaW50MzJfdCogdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSB2c3QxcV9zMzIodG8sIGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDRmIHBnYXRoZXI8ZmxvYXQsIFBhY2tldDRmPihjb25zdCBmbG9hdCogZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBQYWNrZXQ0ZiByZXMgPSBwc2V0MTxQYWNrZXQ0Zj4oMC5mKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoZnJvbVswKnN0cmlkZV0sIHJlcywgMCk7CisgIHJlcyA9IHZzZXRxX2xhbmVfZjMyKGZyb21bMSpzdHJpZGVdLCByZXMsIDEpOworICByZXMgPSB2c2V0cV9sYW5lX2YzMihmcm9tWzIqc3RyaWRlXSwgcmVzLCAyKTsKKyAgcmVzID0gdnNldHFfbGFuZV9mMzIoZnJvbVszKnN0cmlkZV0sIHJlcywgMyk7CisgIHJldHVybiByZXM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQ0aSBwZ2F0aGVyPGludDMyX3QsIFBhY2tldDRpPihjb25zdCBpbnQzMl90KiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIFBhY2tldDRpIHJlcyA9IHBzZXQxPFBhY2tldDRpPigwKTsKKyAgcmVzID0gdnNldHFfbGFuZV9zMzIoZnJvbVswKnN0cmlkZV0sIHJlcywgMCk7CisgIHJlcyA9IHZzZXRxX2xhbmVfczMyKGZyb21bMSpzdHJpZGVdLCByZXMsIDEpOworICByZXMgPSB2c2V0cV9sYW5lX3MzMihmcm9tWzIqc3RyaWRlXSwgcmVzLCAyKTsKKyAgcmVzID0gdnNldHFfbGFuZV9zMzIoZnJvbVszKnN0cmlkZV0sIHJlcywgMyk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZmxvYXQsIFBhY2tldDRmPihmbG9hdCogdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHRvW3N0cmlkZSowXSA9IHZnZXRxX2xhbmVfZjMyKGZyb20sIDApOworICB0b1tzdHJpZGUqMV0gPSB2Z2V0cV9sYW5lX2YzMihmcm9tLCAxKTsKKyAgdG9bc3RyaWRlKjJdID0gdmdldHFfbGFuZV9mMzIoZnJvbSwgMik7CisgIHRvW3N0cmlkZSozXSA9IHZnZXRxX2xhbmVfZjMyKGZyb20sIDMpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBwc2NhdHRlcjxpbnQzMl90LCBQYWNrZXQ0aT4oaW50MzJfdCogdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHRvW3N0cmlkZSowXSA9IHZnZXRxX2xhbmVfczMyKGZyb20sIDApOworICB0b1tzdHJpZGUqMV0gPSB2Z2V0cV9sYW5lX3MzMihmcm9tLCAxKTsKKyAgdG9bc3RyaWRlKjJdID0gdmdldHFfbGFuZV9zMzIoZnJvbSwgMik7CisgIHRvW3N0cmlkZSozXSA9IHZnZXRxX2xhbmVfczMyKGZyb20sIDMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxmbG9hdD4gIChjb25zdCBmbG9hdCogICAgYWRkcikgeyBFSUdFTl9BUk1fUFJFRkVUQ0goYWRkcik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPGludDMyX3Q+KGNvbnN0IGludDMyX3QqICBhZGRyKSB7IEVJR0VOX0FSTV9QUkVGRVRDSChhZGRyKTsgfQorCisvLyBGSVhNRSBvbmx5IHN0b3JlIHRoZSAyIGZpcnN0IGVsZW1lbnRzID8KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgIHBmaXJzdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgZmxvYXQgICBFSUdFTl9BTElHTjE2IHhbNF07IHZzdDFxX2YzMih4LCBhKTsgcmV0dXJuIHhbMF07IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQzMl90IHBmaXJzdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpIHsgaW50MzJfdCBFSUdFTl9BTElHTjE2IHhbNF07IHZzdDFxX3MzMih4LCBhKTsgcmV0dXJuIHhbMF07IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHByZXZlcnNlKGNvbnN0IFBhY2tldDRmJiBhKSB7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGk7CisgIFBhY2tldDRmIGFfcjY0OworCisgIGFfcjY0ID0gdnJldjY0cV9mMzIoYSk7CisgIGFfbG8gPSB2Z2V0X2xvd19mMzIoYV9yNjQpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhX3I2NCk7CisgIHJldHVybiB2Y29tYmluZV9mMzIoYV9oaSwgYV9sbyk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJldmVyc2UoY29uc3QgUGFja2V0NGkmIGEpIHsKKyAgaW50MzJ4Ml90IGFfbG8sIGFfaGk7CisgIFBhY2tldDRpIGFfcjY0OworCisgIGFfcjY0ID0gdnJldjY0cV9zMzIoYSk7CisgIGFfbG8gPSB2Z2V0X2xvd19zMzIoYV9yNjQpOworICBhX2hpID0gdmdldF9oaWdoX3MzMihhX3I2NCk7CisgIHJldHVybiB2Y29tYmluZV9zMzIoYV9oaSwgYV9sbyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWJzKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiB2YWJzcV9mMzIoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWJzKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiB2YWJzcV9zMzIoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGksIHN1bTsKKworICBhX2xvID0gdmdldF9sb3dfZjMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhKTsKKyAgc3VtID0gdnBhZGRfZjMyKGFfbG8sIGFfaGkpOworICBzdW0gPSB2cGFkZF9mMzIoc3VtLCBzdW0pOworICByZXR1cm4gdmdldF9sYW5lX2YzMihzdW0sIDApOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJlZHV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYqIHZlY3MpCit7CisgIGZsb2F0MzJ4NHgyX3QgdnRybjEsIHZ0cm4yLCByZXMxLCByZXMyOworICBQYWNrZXQ0ZiBzdW0xLCBzdW0yLCBzdW07CisKKyAgLy8gTkVPTiB6aXAgcGVyZm9ybXMgaW50ZXJsZWF2aW5nIG9mIHRoZSBzdXBwbGllZCB2ZWN0b3JzLgorICAvLyBXZSBwZXJmb3JtIHR3byBpbnRlcmxlYXZlcyBpbiBhIHJvdyB0byBhY3F1aXJlIHRoZSB0cmFuc3Bvc2VkIHZlY3RvcgorICB2dHJuMSA9IHZ6aXBxX2YzMih2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdnRybjIgPSB2emlwcV9mMzIodmVjc1sxXSwgdmVjc1szXSk7CisgIHJlczEgPSB2emlwcV9mMzIodnRybjEudmFsWzBdLCB2dHJuMi52YWxbMF0pOworICByZXMyID0gdnppcHFfZjMyKHZ0cm4xLnZhbFsxXSwgdnRybjIudmFsWzFdKTsKKworICAvLyBEbyB0aGUgYWRkaXRpb24gb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3JzCisgIHN1bTEgPSB2YWRkcV9mMzIocmVzMS52YWxbMF0sIHJlczEudmFsWzFdKTsKKyAgc3VtMiA9IHZhZGRxX2YzMihyZXMyLnZhbFswXSwgcmVzMi52YWxbMV0pOworICBzdW0gPSB2YWRkcV9mMzIoc3VtMSwgc3VtMik7CisKKyAgcmV0dXJuIHN1bTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludDMyX3QgcHJlZHV4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgaW50MzJ4Ml90IGFfbG8sIGFfaGksIHN1bTsKKworICBhX2xvID0gdmdldF9sb3dfczMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX3MzMihhKTsKKyAgc3VtID0gdnBhZGRfczMyKGFfbG8sIGFfaGkpOworICBzdW0gPSB2cGFkZF9zMzIoc3VtLCBzdW0pOworICByZXR1cm4gdmdldF9sYW5lX3MzMihzdW0sIDApOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJlZHV4cDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkqIHZlY3MpCit7CisgIGludDMyeDR4Ml90IHZ0cm4xLCB2dHJuMiwgcmVzMSwgcmVzMjsKKyAgUGFja2V0NGkgc3VtMSwgc3VtMiwgc3VtOworCisgIC8vIE5FT04gemlwIHBlcmZvcm1zIGludGVybGVhdmluZyBvZiB0aGUgc3VwcGxpZWQgdmVjdG9ycy4KKyAgLy8gV2UgcGVyZm9ybSB0d28gaW50ZXJsZWF2ZXMgaW4gYSByb3cgdG8gYWNxdWlyZSB0aGUgdHJhbnNwb3NlZCB2ZWN0b3IKKyAgdnRybjEgPSB2emlwcV9zMzIodmVjc1swXSwgdmVjc1syXSk7CisgIHZ0cm4yID0gdnppcHFfczMyKHZlY3NbMV0sIHZlY3NbM10pOworICByZXMxID0gdnppcHFfczMyKHZ0cm4xLnZhbFswXSwgdnRybjIudmFsWzBdKTsKKyAgcmVzMiA9IHZ6aXBxX3MzMih2dHJuMS52YWxbMV0sIHZ0cm4yLnZhbFsxXSk7CisKKyAgLy8gRG8gdGhlIGFkZGl0aW9uIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9ycworICBzdW0xID0gdmFkZHFfczMyKHJlczEudmFsWzBdLCByZXMxLnZhbFsxXSk7CisgIHN1bTIgPSB2YWRkcV9zMzIocmVzMi52YWxbMF0sIHJlczIudmFsWzFdKTsKKyAgc3VtID0gdmFkZHFfczMyKHN1bTEsIHN1bTIpOworCisgIHJldHVybiBzdW07Cit9CisKKy8vIE90aGVyIHJlZHVjdGlvbiBmdW5jdGlvbnM6CisvLyBtdWwKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbXVsPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaSwgcHJvZDsKKworICAvLyBHZXQgYV9sbyA9IHxhMXxhMnwgYW5kIGFfaGkgPSB8YTN8YTR8CisgIGFfbG8gPSB2Z2V0X2xvd19mMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfZjMyKGEpOworICAvLyBHZXQgdGhlIHByb2R1Y3Qgb2YgYV9sbyAqIGFfaGkgLT4gfGExKmEzfGEyKmE0fAorICBwcm9kID0gdm11bF9mMzIoYV9sbywgYV9oaSk7CisgIC8vIE11bHRpcGx5IHByb2Qgd2l0aCBpdHMgc3dhcHBlZCB2YWx1ZSB8YTIqYTR8YTEqYTN8CisgIHByb2QgPSB2bXVsX2YzMihwcm9kLCB2cmV2NjRfZjMyKHByb2QpKTsKKworICByZXR1cm4gdmdldF9sYW5lX2YzMihwcm9kLCAwKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQzMl90IHByZWR1eF9tdWw8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBpbnQzMngyX3QgYV9sbywgYV9oaSwgcHJvZDsKKworICAvLyBHZXQgYV9sbyA9IHxhMXxhMnwgYW5kIGFfaGkgPSB8YTN8YTR8CisgIGFfbG8gPSB2Z2V0X2xvd19zMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfczMyKGEpOworICAvLyBHZXQgdGhlIHByb2R1Y3Qgb2YgYV9sbyAqIGFfaGkgLT4gfGExKmEzfGEyKmE0fAorICBwcm9kID0gdm11bF9zMzIoYV9sbywgYV9oaSk7CisgIC8vIE11bHRpcGx5IHByb2Qgd2l0aCBpdHMgc3dhcHBlZCB2YWx1ZSB8YTIqYTR8YTEqYTN8CisgIHByb2QgPSB2bXVsX3MzMihwcm9kLCB2cmV2NjRfczMyKHByb2QpKTsKKworICByZXR1cm4gdmdldF9sYW5lX3MzMihwcm9kLCAwKTsKK30KKworLy8gbWluCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X21pbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGksIG1pbjsKKworICBhX2xvID0gdmdldF9sb3dfZjMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhKTsKKyAgbWluID0gdnBtaW5fZjMyKGFfbG8sIGFfaGkpOworICBtaW4gPSB2cG1pbl9mMzIobWluLCBtaW4pOworCisgIHJldHVybiB2Z2V0X2xhbmVfZjMyKG1pbiwgMCk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQzMl90IHByZWR1eF9taW48UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBpbnQzMngyX3QgYV9sbywgYV9oaSwgbWluOworCisgIGFfbG8gPSB2Z2V0X2xvd19zMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfczMyKGEpOworICBtaW4gPSB2cG1pbl9zMzIoYV9sbywgYV9oaSk7CisgIG1pbiA9IHZwbWluX3MzMihtaW4sIG1pbik7CisgIAorICByZXR1cm4gdmdldF9sYW5lX3MzMihtaW4sIDApOworfQorCisvLyBtYXgKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaSwgbWF4OworCisgIGFfbG8gPSB2Z2V0X2xvd19mMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfZjMyKGEpOworICBtYXggPSB2cG1heF9mMzIoYV9sbywgYV9oaSk7CisgIG1heCA9IHZwbWF4X2YzMihtYXgsIG1heCk7CisKKyAgcmV0dXJuIHZnZXRfbGFuZV9mMzIobWF4LCAwKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludDMyX3QgcHJlZHV4X21heDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIGludDMyeDJfdCBhX2xvLCBhX2hpLCBtYXg7CisKKyAgYV9sbyA9IHZnZXRfbG93X3MzMihhKTsKKyAgYV9oaSA9IHZnZXRfaGlnaF9zMzIoYSk7CisgIG1heCA9IHZwbWF4X3MzMihhX2xvLCBhX2hpKTsKKyAgbWF4ID0gdnBtYXhfczMyKG1heCwgbWF4KTsKKworICByZXR1cm4gdmdldF9sYW5lX3MzMihtYXgsIDApOworfQorCisvLyB0aGlzIFBBTElHTl9ORU9OIGJ1c2luZXNzIGlzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIExMVk0gQ2xhbmcgMy4wIGNhdXNpbmcgaW5jb3JyZWN0IGNvbXBpbGF0aW9uIGVycm9ycywKKy8vIHNlZSBidWcgMzQ3IGFuZCB0aGlzIExMVk0gYnVnOiBodHRwOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwNzQKKyNkZWZpbmUgUEFMSUdOX05FT04oT2Zmc2V0LFR5cGUsQ29tbWFuZCkgXAordGVtcGxhdGU8PlwKK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsVHlwZT5cCit7XAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RhdGljIHZvaWQgcnVuKFR5cGUmIGZpcnN0LCBjb25zdCBUeXBlJiBzZWNvbmQpXAorICAgIHtcCisgICAgICAgIGlmIChPZmZzZXQhPTApXAorICAgICAgICAgICAgZmlyc3QgPSBDb21tYW5kKGZpcnN0LCBzZWNvbmQsIE9mZnNldCk7XAorICAgIH1cCit9O1wKKworUEFMSUdOX05FT04oMCxQYWNrZXQ0Zix2ZXh0cV9mMzIpCitQQUxJR05fTkVPTigxLFBhY2tldDRmLHZleHRxX2YzMikKK1BBTElHTl9ORU9OKDIsUGFja2V0NGYsdmV4dHFfZjMyKQorUEFMSUdOX05FT04oMyxQYWNrZXQ0Zix2ZXh0cV9mMzIpCitQQUxJR05fTkVPTigwLFBhY2tldDRpLHZleHRxX3MzMikKK1BBTElHTl9ORU9OKDEsUGFja2V0NGksdmV4dHFfczMyKQorUEFMSUdOX05FT04oMixQYWNrZXQ0aSx2ZXh0cV9zMzIpCitQQUxJR05fTkVPTigzLFBhY2tldDRpLHZleHRxX3MzMikKKworI3VuZGVmIFBBTElHTl9ORU9OCisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDRmLDQ+JiBrZXJuZWwpIHsKKyAgZmxvYXQzMng0eDJfdCB0bXAxID0gdnppcHFfZjMyKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBmbG9hdDMyeDR4Ml90IHRtcDIgPSB2emlwcV9mMzIoa2VybmVsLnBhY2tldFsyXSwga2VybmVsLnBhY2tldFszXSk7CisKKyAga2VybmVsLnBhY2tldFswXSA9IHZjb21iaW5lX2YzMih2Z2V0X2xvd19mMzIodG1wMS52YWxbMF0pLCB2Z2V0X2xvd19mMzIodG1wMi52YWxbMF0pKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IHZjb21iaW5lX2YzMih2Z2V0X2hpZ2hfZjMyKHRtcDEudmFsWzBdKSwgdmdldF9oaWdoX2YzMih0bXAyLnZhbFswXSkpOworICBrZXJuZWwucGFja2V0WzJdID0gdmNvbWJpbmVfZjMyKHZnZXRfbG93X2YzMih0bXAxLnZhbFsxXSksIHZnZXRfbG93X2YzMih0bXAyLnZhbFsxXSkpOworICBrZXJuZWwucGFja2V0WzNdID0gdmNvbWJpbmVfZjMyKHZnZXRfaGlnaF9mMzIodG1wMS52YWxbMV0pLCB2Z2V0X2hpZ2hfZjMyKHRtcDIudmFsWzFdKSk7Cit9CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDRpLDQ+JiBrZXJuZWwpIHsKKyAgaW50MzJ4NHgyX3QgdG1wMSA9IHZ6aXBxX3MzMihrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgaW50MzJ4NHgyX3QgdG1wMiA9IHZ6aXBxX3MzMihrZXJuZWwucGFja2V0WzJdLCBrZXJuZWwucGFja2V0WzNdKTsKKyAga2VybmVsLnBhY2tldFswXSA9IHZjb21iaW5lX3MzMih2Z2V0X2xvd19zMzIodG1wMS52YWxbMF0pLCB2Z2V0X2xvd19zMzIodG1wMi52YWxbMF0pKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IHZjb21iaW5lX3MzMih2Z2V0X2hpZ2hfczMyKHRtcDEudmFsWzBdKSwgdmdldF9oaWdoX3MzMih0bXAyLnZhbFswXSkpOworICBrZXJuZWwucGFja2V0WzJdID0gdmNvbWJpbmVfczMyKHZnZXRfbG93X3MzMih0bXAxLnZhbFsxXSksIHZnZXRfbG93X3MzMih0bXAyLnZhbFsxXSkpOworICBrZXJuZWwucGFja2V0WzNdID0gdmNvbWJpbmVfczMyKHZnZXRfaGlnaF9zMzIodG1wMS52YWxbMV0pLCB2Z2V0X2hpZ2hfczMyKHRtcDIudmFsWzFdKSk7Cit9CisKKy8vLS0tLS0tLS0tLSBkb3VibGUgLS0tLS0tLS0tLQorCisvLyBDbGFuZyAzLjUgaW4gdGhlIGlPUyB0b29sY2hhaW4gaGFzIGFuIElDRSB0cmlnZ2VyZWQgYnkgTkVPTiBpbnRyaXNpY3MgZm9yIGRvdWJsZS4KKy8vIENvbmZpcm1lZCBhdCBsZWFzdCB3aXRoIF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fID0gNjAwMDA1NC4KKyNpZmRlZiBfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXworLy8gTGV0J3MgaG9wZSB0aGF0IGJ5IHRoZSB0aW1lIF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fIGhpdHMgdGhlIDYwMSogcmFuZ2UsIHRoZSBidWcgd2lsbCBiZSBmaXhlZC4KKy8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3lhbWF5YS8yOTI0MjkyIHN1Z2dlc3RzIHRoYXQgdGhlIDMgZmlyc3QgZGlnaXRzIGFyZSBvbmx5IHVwZGF0ZWQgd2l0aAorLy8gbWFqb3IgdG9vbGNoYWluIHVwZGF0ZXMuCisjZGVmaW5lIEVJR0VOX0FQUExFX0RPVUJMRV9ORU9OX0JVRyAoX19hcHBsZV9idWlsZF92ZXJzaW9uX18gPCA2MDEwMDAwKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fQVBQTEVfRE9VQkxFX05FT05fQlVHIDAKKyNlbmRpZgorCisjaWYgRUlHRU5fQVJDSF9BUk02NCAmJiAhRUlHRU5fQVBQTEVfRE9VQkxFX05FT05fQlVHCisKKy8vIEJ1ZyA5MDc6IHdvcmthcm91bmQgbWlzc2luZyBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGluIHRoZSBBREsKKy8vIERlZmluaW5nIHRoZXNlIGZ1bmN0aW9ucyBhcyB0ZW1wbGF0ZXMgZW5zdXJlcyB0aGF0IGlmIHRoZXNlIGludHJpbnNpY3MgYXJlCisvLyBhbHJlYWR5IGRlZmluZWQgaW4gYXJtX25lb24uaCwgdGhlbiBvdXIgd29ya2Fyb3VuZCBkb2Vzbid0IGNhdXNlIGEgY29uZmxpY3QKKy8vIGFuZCBoYXMgbG93ZXIgcHJpb3JpdHkgaW4gb3ZlcmxvYWQgcmVzb2x1dGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9mNjQoVCBhKQoreworICByZXR1cm4gKHVpbnQ2NHgyX3QpIGE7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorZmxvYXQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9mNjRfdTY0KFQgYSkKK3sKKyAgcmV0dXJuIChmbG9hdDY0eDJfdCkgYTsKK30KKwordHlwZWRlZiBmbG9hdDY0eDJfdCBQYWNrZXQyZDsKK3R5cGVkZWYgZmxvYXQ2NHgxX3QgUGFja2V0MWQ7CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZG91YmxlPiAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQyZCB0eXBlOworICB0eXBlZGVmIFBhY2tldDJkIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMiwKKyAgICBIYXNIYWxmUGFja2V0PTAsCisgICAKKyAgICBIYXNEaXYgID0gMSwKKyAgICAvLyBGSVhNRSBjaGVjayB0aGUgSGFzKgorICAgIEhhc1NpbiAgPSAwLAorICAgIEhhc0NvcyAgPSAwLAorICAgIEhhc0xvZyAgPSAwLAorICAgIEhhc0V4cCAgPSAwLAorICAgIEhhc1NxcnQgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MmQ+IHsgdHlwZWRlZiBkb3VibGUgIHR5cGU7IGVudW0ge3NpemU9MiwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0MmQgaGFsZjsgfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBzZXQxPFBhY2tldDJkPihjb25zdCBkb3VibGUmICBmcm9tKSB7IHJldHVybiB2ZHVwcV9uX2Y2NChmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxzZXQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSYgYSkKK3sKKyAgY29uc3QgZG91YmxlIGNvdW50ZG93bl9yYXdbXSA9IHswLjAsMS4wfTsKKyAgY29uc3QgUGFja2V0MmQgY291bnRkb3duID0gdmxkMXFfZjY0KGNvdW50ZG93bl9yYXcpOworICByZXR1cm4gdmFkZHFfZjY0KHBzZXQxPFBhY2tldDJkPihhKSwgY291bnRkb3duKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYWRkPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZhZGRxX2Y2NChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc3ViPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZzdWJxX2Y2NChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbmVnYXRlKGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiB2bmVncV9mNjQoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBjb25qKGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbXVsPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZtdWxxX2Y2NChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwZGl2PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZkaXZxX2Y2NChhLGIpOyB9CisKKyNpZmRlZiBfX0FSTV9GRUFUVVJFX0ZNQQorLy8gU2VlIGJ1ZyA5MzYuIFNlZSBhYm92ZSBjb21tZW50IGFib3V0IEZNQSBmb3IgZmxvYXQuCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG1hZGQoY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiLCBjb25zdCBQYWNrZXQyZCYgYykgeyByZXR1cm4gdmZtYXFfZjY0KGMsYSxiKTsgfQorI2Vsc2UKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWFkZChjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIsIGNvbnN0IFBhY2tldDJkJiBjKSB7IHJldHVybiB2bWxhcV9mNjQoYyxhLGIpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBtaW48UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gdm1pbnFfZjY0KGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBtYXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gdm1heHFfZjY0KGEsYik7IH0KKworLy8gTG9naWNhbCBPcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBmbG9hdCwgc28gd2UgaGF2ZSB0byByZWludGVycHJldCBjYXN0cyB1c2luZyBORU9OIGludHJpbnNpY3MKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYW5kPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpCit7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF91NjQodmFuZHFfdTY0KHZyZWludGVycHJldHFfdTY0X2Y2NChhKSx2cmVpbnRlcnByZXRxX3U2NF9mNjQoYikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKQoreworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mNjRfdTY0KHZvcnJxX3U2NCh2cmVpbnRlcnByZXRxX3U2NF9mNjQoYSksdnJlaW50ZXJwcmV0cV91NjRfZjY0KGIpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBweG9yPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpCit7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF91NjQodmVvcnFfdTY0KHZyZWludGVycHJldHFfdTY0X2Y2NChhKSx2cmVpbnRlcnByZXRxX3U2NF9mNjQoYikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhbmRub3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikKK3sKKyAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3U2NCh2YmljcV91NjQodnJlaW50ZXJwcmV0cV91NjRfZjY0KGEpLHZyZWludGVycHJldHFfdTY0X2Y2NChiKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIHZsZDFxX2Y2NChmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWR1PFBhY2tldDJkPihjb25zdCBkb3VibGUqIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIHZsZDFxX2Y2NChmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWRkdXA8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogICBmcm9tKQoreworICByZXR1cm4gdmxkMXFfZHVwX2Y2NChmcm9tKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxkb3VibGU+KGRvdWJsZSogICB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSB2c3QxcV9mNjQodG8sIGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZG91YmxlPihkb3VibGUqICB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHZzdDFxX2Y2NCh0bywgZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0MmQgcGdhdGhlcjxkb3VibGUsIFBhY2tldDJkPihjb25zdCBkb3VibGUqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgUGFja2V0MmQgcmVzID0gcHNldDE8UGFja2V0MmQ+KDAuMCk7CisgIHJlcyA9IHZzZXRxX2xhbmVfZjY0KGZyb21bMCpzdHJpZGVdLCByZXMsIDApOworICByZXMgPSB2c2V0cV9sYW5lX2Y2NChmcm9tWzEqc3RyaWRlXSwgcmVzLCAxKTsKKyAgcmV0dXJuIHJlczsKK30KK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZG91YmxlLCBQYWNrZXQyZD4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgdG9bc3RyaWRlKjBdID0gdmdldHFfbGFuZV9mNjQoZnJvbSwgMCk7CisgIHRvW3N0cmlkZSoxXSA9IHZnZXRxX2xhbmVfZjY0KGZyb20sIDEpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8ZG91YmxlPihjb25zdCBkb3VibGUqIGFkZHIpIHsgRUlHRU5fQVJNX1BSRUZFVENIKGFkZHIpOyB9CisKKy8vIEZJWE1FIG9ubHkgc3RvcmUgdGhlIDIgZmlyc3QgZWxlbWVudHMgPwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiB2Z2V0cV9sYW5lX2Y2NChhLCAwKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJldmVyc2UoY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZjb21iaW5lX2Y2NCh2Z2V0X2hpZ2hfZjY0KGEpLCB2Z2V0X2xvd19mNjQoYSkpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYWJzKGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiB2YWJzcV9mNjQoYSk7IH0KKworI2lmIEVJR0VOX0NPTVBfQ0xBTkcgJiYgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykKKy8vIHdvcmthcm91bmQgSUNFLCBzZWUgYnVnIDkwNwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiAodmdldF9sb3dfZjY0KGEpICsgdmdldF9oaWdoX2Y2NChhKSlbMF07IH0KKyNlbHNlCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZnZXRfbGFuZV9mNjQodmdldF9sb3dfZjY0KGEpICsgdmdldF9oaWdoX2Y2NChhKSwgMCk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJlZHV4cDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQqIHZlY3MpCit7CisgIGZsb2F0NjR4Ml90IHRybjEsIHRybjI7CisKKyAgLy8gTkVPTiB6aXAgcGVyZm9ybXMgaW50ZXJsZWF2aW5nIG9mIHRoZSBzdXBwbGllZCB2ZWN0b3JzLgorICAvLyBXZSBwZXJmb3JtIHR3byBpbnRlcmxlYXZlcyBpbiBhIHJvdyB0byBhY3F1aXJlIHRoZSB0cmFuc3Bvc2VkIHZlY3RvcgorICB0cm4xID0gdnppcDFxX2Y2NCh2ZWNzWzBdLCB2ZWNzWzFdKTsKKyAgdHJuMiA9IHZ6aXAycV9mNjQodmVjc1swXSwgdmVjc1sxXSk7CisKKyAgLy8gRG8gdGhlIGFkZGl0aW9uIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9ycworICByZXR1cm4gdmFkZHFfZjY0KHRybjEsIHRybjIpOworfQorLy8gT3RoZXIgcmVkdWN0aW9uIGZ1bmN0aW9uczoKKy8vIG11bAorI2lmIEVJR0VOX0NPTVBfQ0xBTkcgJiYgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X211bDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuICh2Z2V0X2xvd19mNjQoYSkgKiB2Z2V0X2hpZ2hfZjY0KGEpKVswXTsgfQorI2Vsc2UKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X211bDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZnZXRfbGFuZV9mNjQodmdldF9sb3dfZjY0KGEpICogdmdldF9oaWdoX2Y2NChhKSwgMCk7IH0KKyNlbmRpZgorCisvLyBtaW4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X21pbjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIHZnZXRxX2xhbmVfZjY0KHZwbWlucV9mNjQoYSwgYSksIDApOyB9CisKKy8vIG1heAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXhfbWF4PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gdmdldHFfbGFuZV9mNjQodnBtYXhxX2Y2NChhLCBhKSwgMCk7IH0KKworLy8gdGhpcyBQQUxJR05fTkVPTiBidXNpbmVzcyBpcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBMTFZNIENsYW5nIDMuMCBjYXVzaW5nIGluY29ycmVjdCBjb21waWxhdGlvbiBlcnJvcnMsCisvLyBzZWUgYnVnIDM0NyBhbmQgdGhpcyBMTFZNIGJ1ZzogaHR0cDovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDc0CisjZGVmaW5lIFBBTElHTl9ORU9OKE9mZnNldCxUeXBlLENvbW1hbmQpIFwKK3RlbXBsYXRlPD5cCitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFR5cGU+XAore1wKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bihUeXBlJiBmaXJzdCwgY29uc3QgVHlwZSYgc2Vjb25kKVwKKyAgICB7XAorICAgICAgICBpZiAoT2Zmc2V0IT0wKVwKKyAgICAgICAgICAgIGZpcnN0ID0gQ29tbWFuZChmaXJzdCwgc2Vjb25kLCBPZmZzZXQpO1wKKyAgICB9XAorfTtcCisKK1BBTElHTl9ORU9OKDAsUGFja2V0MmQsdmV4dHFfZjY0KQorUEFMSUdOX05FT04oMSxQYWNrZXQyZCx2ZXh0cV9mNjQpCisjdW5kZWYgUEFMSUdOX05FT04KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0MmQsMj4mIGtlcm5lbCkgeworICBmbG9hdDY0eDJfdCB0cm4xID0gdnppcDFxX2Y2NChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAgZmxvYXQ2NHgyX3QgdHJuMiA9IHZ6aXAycV9mNjQoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsxXSk7CisKKyAga2VybmVsLnBhY2tldFswXSA9IHRybjE7CisgIGtlcm5lbC5wYWNrZXRbMV0gPSB0cm4yOworfQorI2VuZGlmIC8vIEVJR0VOX0FSQ0hfQVJNNjQgCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BBQ0tFVF9NQVRIX05FT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvQ29tcGxleC5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvQ29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDdmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmgKQEAgLTAsMCArMSw1MDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01QTEVYX1NTRV9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfU1NFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8tLS0tLS0tLS0tIGZsb2F0IC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQyY2YKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDJjZihjb25zdCBfX20xMjgmIGEpIDogdihhKSB7fQorICBfX20xMjggIHY7Cit9OworCisvLyBVc2UgdGhlIHBhY2tldF90cmFpdHMgZGVmaW5lZCBpbiBBVlgvUGFja2V0TWF0aC5oIGluc3RlYWQgaWYgd2UncmUgZ29pbmcKKy8vIHRvIGxldmVyYWdlIEFWWCBpbnN0cnVjdGlvbnMuCisjaWZuZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlgKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PGZsb2F0PiA+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDJjZiB0eXBlOworICB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDIsCisgICAgSGFzSGFsZlBhY2tldCA9IDAsCisKKyAgICBIYXNBZGQgICAgPSAxLAorICAgIEhhc1N1YiAgICA9IDEsCisgICAgSGFzTXVsICAgID0gMSwKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc05lZ2F0ZSA9IDEsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwLAorICAgIEhhc0JsZW5kID0gMQorICB9OworfTsKKyNlbmRpZgorCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MmNmPiB7IHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiB0eXBlOyBlbnVtIHtzaXplPTIsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhZGQ8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9hZGRfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzdWI8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9zdWJfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBuZWdhdGUoY29uc3QgUGFja2V0MmNmJiBhKQoreworICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHg4MDAwMDAwMCwweDgwMDAwMDAwLDB4ODAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gUGFja2V0MmNmKF9tbV94b3JfcHMoYS52LG1hc2spKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNvbmooY29uc3QgUGFja2V0MmNmJiBhKQoreworICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gUGFja2V0MmNmKF9tbV94b3JfcHMoYS52LG1hc2spKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICByZXR1cm4gUGFja2V0MmNmKF9tbV9hZGRzdWJfcHMoX21tX211bF9wcyhfbW1fbW92ZWxkdXBfcHMoYS52KSwgYi52KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcHMoX21tX21vdmVoZHVwX3BzKGEudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzRmX3N3aXp6bGUxKGIudiwgMSwgMCwgMywgMikpKSk7CisvLyAgIHJldHVybiBQYWNrZXQyY2YoX21tX2FkZHN1Yl9wcyhfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMCwgMCwgMiwgMiksIGIudiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMSwgMSwgMywgMyksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzRmX3N3aXp6bGUxKGIudiwgMSwgMCwgMywgMikpKSk7CisgICNlbHNlCisgIGNvbnN0IF9fbTEyOCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwKSk7CisgIHJldHVybiBQYWNrZXQyY2YoX21tX2FkZF9wcyhfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMCwgMCwgMiwgMiksIGIudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1feG9yX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAxLCAxLCAzLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0Zl9zd2l6emxlMShiLnYsIDEsIDAsIDMsIDIpKSwgbWFzaykpKTsKKyAgI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGFuZCAgIDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YoX21tX2FuZF9wcyhhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG9yICAgIDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YoX21tX29yX3BzKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBweG9yICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihfbW1feG9yX3BzKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYW5kbm90PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihfbW1fYW5kbm90X3BzKGEudixiLnYpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkIDxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQyY2YocGxvYWQ8UGFja2V0NGY+KCZudW1leHQ6OnJlYWxfcmVmKCpmcm9tKSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkdTxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZHU8UGFja2V0NGY+KCZudW1leHQ6OnJlYWxfcmVmKCpmcm9tKSkpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHNldDE8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiAgZnJvbSkKK3sKKyAgUGFja2V0MmNmIHJlczsKKyNpZiBFSUdFTl9HTlVDX0FUX01PU1QoNCwyKQorICAvLyBXb3JrYXJvdW5kIGFubm95aW5nICJtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24iIHdhcm5pbmcgd2l0aCBnY2MgNC4yCisgIHJlcy52ID0gX21tX2xvYWRsX3BpKF9tbV9zZXQxX3BzKDAuMGYpLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTY0Kj4oJmZyb20pKTsKKyNlbGlmIEVJR0VOX0dOVUNfQVRfTEVBU1QoNCw2KQorICAvLyBTdXBwcmVzcyBhbm5veWluZyAibWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uIiB3YXJuaW5nIHdpdGggZ2NjID49IDQuNgorICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VuaW5pdGlhbGl6ZWQiCisgIHJlcy52ID0gX21tX2xvYWRsX3BpKHJlcy52LCAoY29uc3QgX19tNjQqKSZmcm9tKTsKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbHNlCisgIHJlcy52ID0gX21tX2xvYWRsX3BpKHJlcy52LCAoY29uc3QgX19tNjQqKSZmcm9tKTsKKyNlbmRpZgorICByZXR1cm4gUGFja2V0MmNmKF9tbV9tb3ZlbGhfcHMocmVzLnYscmVzLnYpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZGR1cDxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDJjZj4oKmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBwc3RvcmUoJm51bWV4dDo6cmVhbF9yZWYoKnRvKSwgUGFja2V0NGYoZnJvbS52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHBzdG9yZXUoJm51bWV4dDo6cmVhbF9yZWYoKnRvKSwgUGFja2V0NGYoZnJvbS52KSk7IH0KKworCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQyY2YgcGdhdGhlcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fc2V0X3BzKHN0ZDo6aW1hZyhmcm9tWzEqc3RyaWRlXSksIHN0ZDo6cmVhbChmcm9tWzEqc3RyaWRlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmltYWcoZnJvbVswKnN0cmlkZV0pLCBzdGQ6OnJlYWwoZnJvbVswKnN0cmlkZV0pKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8c3RkOjpjb21wbGV4PGZsb2F0PiwgUGFja2V0MmNmPihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHRvW3N0cmlkZSowXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhmcm9tLnYsIGZyb20udiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMoZnJvbS52LCBmcm9tLnYsIDEpKSk7CisgIHRvW3N0cmlkZSoxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhmcm9tLnYsIGZyb20udiwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMoZnJvbS52LCBmcm9tLnYsIDMpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPHN0ZDo6Y29tcGxleDxmbG9hdD4gPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICBhZGRyKSB7IF9tbV9wcmVmZXRjaCgoY29uc3QgY2hhciopKGFkZHIpLCBfTU1fSElOVF9UMCk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gIHBmaXJzdDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgI2lmIEVJR0VOX0dOVUNfQVRfTU9TVCg0LDMpCisgIC8vIFdvcmthcm91bmQgZ2NjIDQuMiBJQ0UgLSB0aGlzIGlzIG5vdCBwZXJmb3JtYW5jZSB3aXNlIGlkZWFsLCBidXQgd2hvIGNhcmVzLi4uCisgIC8vIFRoaXMgd29ya2Fyb3VuZCBhbHNvIGZpeCBpbnZhbGlkIGNvZGUgZ2VuZXJhdGlvbiB3aXRoIGdjYyA0LjMKKyAgRUlHRU5fQUxJR04xNiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJlc1syXTsKKyAgX21tX3N0b3JlX3BzKChmbG9hdCopcmVzLCBhLnYpOworICByZXR1cm4gcmVzWzBdOworICAjZWxzZQorICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJlczsKKyAgX21tX3N0b3JlbF9waSgoX19tNjQqKSZyZXMsIGEudik7CisgIHJldHVybiByZXM7CisgICNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHByZXZlcnNlKGNvbnN0IFBhY2tldDJjZiYgYSkgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9jYXN0cGRfcHMocHJldmVyc2UoUGFja2V0MmQoX21tX2Nhc3Rwc19wZChhLnYpKSkpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiBwcmVkdXg8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIHJldHVybiBwZmlyc3QoUGFja2V0MmNmKF9tbV9hZGRfcHMoYS52LCBfbW1fbW92ZWhsX3BzKGEudixhLnYpKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHByZWR1eHA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YqIHZlY3MpCit7CisgIHJldHVybiBQYWNrZXQyY2YoX21tX2FkZF9wcyhfbW1fbW92ZWxoX3BzKHZlY3NbMF0udix2ZWNzWzFdLnYpLCBfbW1fbW92ZWhsX3BzKHZlY3NbMV0udix2ZWNzWzBdLnYpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eF9tdWw8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIHJldHVybiBwZmlyc3QocG11bChhLCBQYWNrZXQyY2YoX21tX21vdmVobF9wcyhhLnYsYS52KSkpKTsKK30KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MmNmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQyY2YmIGZpcnN0LCBjb25zdCBQYWNrZXQyY2YmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQ9PTEpCisgICAgeworICAgICAgZmlyc3QudiA9IF9tbV9tb3ZlaGxfcHMoZmlyc3QudiwgZmlyc3Qudik7CisgICAgICBmaXJzdC52ID0gX21tX21vdmVsaF9wcyhmaXJzdC52LCBzZWNvbmQudik7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgICAjZWxzZQorICAgIGNvbnN0IF9fbTEyOCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDAwMDAwMDAwLDB4ODAwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDAwMDAwKSk7CisgICAgcmV0dXJuIFBhY2tldDJjZihfbW1fYWRkX3BzKF9tbV94b3JfcHMoX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLnYsIDAsIDAsIDIsIDIpLCBiLnYpLCBtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLnYsIDEsIDEsIDMsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzRmX3N3aXp6bGUxKGIudiwgMSwgMCwgMywgMikpKSk7CisgICAgI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwocGNvbmooYSksIGIpOworICAgICNlbHNlCisgICAgY29uc3QgX19tMTI4IG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zZXRyX2VwaTMyKDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDApKTsKKyAgICByZXR1cm4gUGFja2V0MmNmKF9tbV9hZGRfcHMoX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLnYsIDAsIDAsIDIsIDIpLCBiLnYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1feG9yX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAxLCAxLCAzLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzRmX3N3aXp6bGUxKGIudiwgMSwgMCwgMywgMikpLCBtYXNrKSkpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgdHJ1ZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICByZXR1cm4gcGNvbmooaW50ZXJuYWw6OnBtdWwoYSwgYikpOworICAgICNlbHNlCisgICAgY29uc3QgX19tMTI4IG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zZXRyX2VwaTMyKDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDApKTsKKyAgICByZXR1cm4gUGFja2V0MmNmKF9tbV9zdWJfcHMoX21tX3hvcl9wcyhfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMCwgMCwgMiwgMiksIGIudiksIG1hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMSwgMSwgMywgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYi52LCAxLCAwLCAzLCAyKSkpKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0NGYsIFBhY2tldDJjZiwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDRmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQ0ZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQyY2YoRWlnZW46OmludGVybmFsOjpwbXVsPFBhY2tldDRmPih4LCB5LnYpKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQ0ZiwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0NGYmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDRmJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQyY2YoRWlnZW46OmludGVybmFsOjpwbXVsPFBhY2tldDRmPih4LnYsIHkpKTsgfQorfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwZGl2PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIC8vIFRPRE8gb3B0aW1pemUgaXQgZm9yIFNTRTMgYW5kIDQKKyAgUGFja2V0MmNmIHJlcyA9IGNvbmpfaGVscGVyPFBhY2tldDJjZixQYWNrZXQyY2YsZmFsc2UsdHJ1ZT4oKS5wbXVsKGEsYik7CisgIF9fbTEyOCBzID0gX21tX211bF9wcyhiLnYsYi52KTsKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fZGl2X3BzKHJlcy52LF9tbV9hZGRfcHMocyxfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgocyksIDB4YjEpKSkpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNwbHhmbGlwLyogPFBhY2tldDJjZj4gKi8oY29uc3QgUGFja2V0MmNmJiB4KQoreworICByZXR1cm4gUGFja2V0MmNmKHZlYzRmX3N3aXp6bGUxKHgudiwgMSwgMCwgMywgMikpOworfQorCisKKy8vLS0tLS0tLS0tLSBkb3VibGUgLS0tLS0tLS0tLQorc3RydWN0IFBhY2tldDFjZAoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCgpIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0MWNkKGNvbnN0IF9fbTEyOGQmIGEpIDogdihhKSB7fQorICBfX20xMjhkICB2OworfTsKKworLy8gVXNlIHRoZSBwYWNrZXRfdHJhaXRzIGRlZmluZWQgaW4gQVZYL1BhY2tldE1hdGguaCBpbnN0ZWFkIGlmIHdlJ3JlIGdvaW5nCisvLyB0byBsZXZlcmFnZSBBVlggaW5zdHJ1Y3Rpb25zLgorI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MWNkIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMCwKKyAgICBzaXplID0gMSwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAKKyAgfTsKK307CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDFjZD4geyB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGU7IGVudW0ge3NpemU9MSwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFkZDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX2FkZF9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHN1YjxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX3N1Yl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG5lZ2F0ZShjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIFBhY2tldDFjZChwbmVnYXRlKFBhY2tldDJkKGEudikpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwY29uaihjb25zdCBQYWNrZXQxY2QmIGEpCit7CisgIGNvbnN0IF9fbTEyOGQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldF9lcGkzMigweDgwMDAwMDAwLDB4MCwweDAsMHgwKSk7CisgIHJldHVybiBQYWNrZXQxY2QoX21tX3hvcl9wZChhLnYsbWFzaykpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWw8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgIHJldHVybiBQYWNrZXQxY2QoX21tX2FkZHN1Yl9wZChfbW1fbXVsX3BkKF9tbV9tb3ZlZHVwX3BkKGEudiksIGIudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzJkX3N3aXp6bGUxKGIudiwgMSwgMCkpKSk7CisgICNlbHNlCisgIGNvbnN0IF9fbTEyOGQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldF9lcGkzMigweDAsMHgwLDB4ODAwMDAwMDAsMHgwKSk7CisgIHJldHVybiBQYWNrZXQxY2QoX21tX2FkZF9wZChfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMCwgMCksIGIudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1feG9yX3BkKF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyZF9zd2l6emxlMShiLnYsIDEsIDApKSwgbWFzaykpKTsKKyAgI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFuZCAgIDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX2FuZF9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG9yICAgIDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX29yX3BkKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBweG9yICAgPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChfbW1feG9yX3BkKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwYW5kbm90PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChfbW1fYW5kbm90X3BkKGEudixiLnYpKTsgfQorCisvLyBGSVhNRSBmb3JjZSB1bmFsaWduZWQgbG9hZCwgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXgKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWQgPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pCit7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MWNkKHBsb2FkPFBhY2tldDJkPigoY29uc3QgZG91YmxlKilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWR1PFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pCit7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQxY2QocGxvYWR1PFBhY2tldDJkPigoY29uc3QgZG91YmxlKilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHNldDE8UGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgIGZyb20pCit7IC8qIGhlcmUgd2UgcmVhbGx5IGhhdmUgdG8gdXNlIHVuYWxpZ25lZCBsb2FkcyA6KCAqLyByZXR1cm4gcGxvYWR1PFBhY2tldDFjZD4oJmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWRkdXA8UGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSkgeyByZXR1cm4gcHNldDE8UGFja2V0MWNkPigqZnJvbSk7IH0KKworLy8gRklYTUUgZm9yY2UgdW5hbGlnbmVkIHN0b3JlLCB0aGlzIGlzIGEgdGVtcG9yYXJ5IGZpeAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlIDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgcHN0b3JlKChkb3VibGUqKXRvLCBQYWNrZXQyZChmcm9tLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KChkb3VibGUqKXRvLCBQYWNrZXQyZChmcm9tLnYpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICBhZGRyKSB7IF9tbV9wcmVmZXRjaCgoY29uc3QgY2hhciopKGFkZHIpLCBfTU1fSElOVF9UMCk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxkb3VibGU+ICBwZmlyc3Q8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEpCit7CisgIEVJR0VOX0FMSUdOMTYgZG91YmxlIHJlc1syXTsKKyAgX21tX3N0b3JlX3BkKHJlcywgYS52KTsKKyAgcmV0dXJuIHN0ZDo6Y29tcGxleDxkb3VibGU+KHJlc1swXSxyZXNbMV0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHByZXZlcnNlKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gYTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKQoreworICByZXR1cm4gcGZpcnN0KGEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHByZWR1eHA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QqIHZlY3MpCit7CisgIHJldHVybiB2ZWNzWzBdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4X211bDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdChhKTsKK30KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MWNkPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQxY2QmIC8qZmlyc3QqLywgY29uc3QgUGFja2V0MWNkJiAvKnNlY29uZCovKQorICB7CisgICAgLy8gRklYTUUgaXMgaXQgc3VyZSB3ZSBuZXZlciBoYXZlIHRvIGFsaWduIGEgUGFja2V0MWNkPworICAgIC8vIEV2ZW4gdGhvdWdoIGEgc3RkOjpjb21wbGV4PGRvdWJsZT4gaGFzIDE2IGJ5dGVzLCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgYWxpZ25lZCBvbiBhIDE2IGJ5dGVzIGJvdW5kYXJ5Li4uCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDFjZCwgUGFja2V0MWNkLCBmYWxzZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbWFkZChjb25zdCBQYWNrZXQxY2QmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWwoY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIGNvbnN0CisgIHsKKyAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgcGNvbmooYikpOworICAgICNlbHNlCisgICAgY29uc3QgX19tMTI4ZCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fc2V0X2VwaTMyKDB4ODAwMDAwMDAsMHgwLDB4MCwweDApKTsKKyAgICByZXR1cm4gUGFja2V0MWNkKF9tbV9hZGRfcGQoX21tX3hvcl9wZChfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMCwgMCksIGIudiksIG1hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMmRfc3dpenpsZTEoYi52LCAxLCAwKSkpKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgICAgI2Vsc2UKKyAgICBjb25zdCBfX20xMjhkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHg4MDAwMDAwMCwweDAsMHgwLDB4MCkpOworICAgIHJldHVybiBQYWNrZXQxY2QoX21tX2FkZF9wZChfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMCwgMCksIGIudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV94b3JfcGQoX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMmRfc3dpenpsZTEoYi52LCAxLCAwKSksIG1hc2spKSk7CisgICAgI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDFjZCwgUGFja2V0MWNkLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgICAgI2Vsc2UKKyAgICBjb25zdCBfX20xMjhkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHg4MDAwMDAwMCwweDAsMHgwLDB4MCkpOworICAgIHJldHVybiBQYWNrZXQxY2QoX21tX3N1Yl9wZChfbW1feG9yX3BkKF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAwLCAwKSwgYi52KSwgbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyZF9zd2l6emxlMShiLnYsIDEsIDApKSkpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyZCwgUGFja2V0MWNkLCBmYWxzZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MmQmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDJkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHkpIGNvbnN0CisgIHsgcmV0dXJuIFBhY2tldDFjZChFaWdlbjo6aW50ZXJuYWw6OnBtdWw8UGFja2V0MmQ+KHgsIHkudikpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDJkLCBmYWxzZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQyZCYgeSwgY29uc3QgUGFja2V0MWNkJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MmQmIHkpIGNvbnN0CisgIHsgcmV0dXJuIFBhY2tldDFjZChFaWdlbjo6aW50ZXJuYWw6OnBtdWw8UGFja2V0MmQ+KHgudiwgeSkpOyB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBkaXY8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgLy8gVE9ETyBvcHRpbWl6ZSBpdCBmb3IgU1NFMyBhbmQgNAorICBQYWNrZXQxY2QgcmVzID0gY29ual9oZWxwZXI8UGFja2V0MWNkLFBhY2tldDFjZCxmYWxzZSx0cnVlPigpLnBtdWwoYSxiKTsKKyAgX19tMTI4ZCBzID0gX21tX211bF9wZChiLnYsYi52KTsKKyAgcmV0dXJuIFBhY2tldDFjZChfbW1fZGl2X3BkKHJlcy52LCBfbW1fYWRkX3BkKHMsX21tX3NodWZmbGVfcGQocywgcywgMHgxKSkpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGNwbHhmbGlwLyogPFBhY2tldDFjZD4gKi8oY29uc3QgUGFja2V0MWNkJiB4KQoreworICByZXR1cm4gUGFja2V0MWNkKHByZXZlcnNlKFBhY2tldDJkKHgudikpKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0MmNmLDI+JiBrZXJuZWwpIHsKKyAgX19tMTI4ZCB3MSA9IF9tbV9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFswXS52KTsKKyAgX19tMTI4ZCB3MiA9IF9tbV9jYXN0cHNfcGQoa2VybmVsLnBhY2tldFsxXS52KTsKKworICBfX20xMjggdG1wID0gX21tX2Nhc3RwZF9wcyhfbW1fdW5wYWNraGlfcGQodzEsIHcyKSk7CisgIGtlcm5lbC5wYWNrZXRbMF0udiA9IF9tbV9jYXN0cGRfcHMoX21tX3VucGFja2xvX3BkKHcxLCB3MikpOworICBrZXJuZWwucGFja2V0WzFdLnYgPSB0bXA7Cit9CisKK3RlbXBsYXRlPD4gIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBibGVuZChjb25zdCBTZWxlY3RvcjwyPiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDJjZiYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0MmNmJiBlbHNlUGFja2V0KSB7CisgIF9fbTEyOGQgcmVzdWx0ID0gcGJsZW5kPFBhY2tldDJkPihpZlBhY2tldCwgX21tX2Nhc3Rwc19wZCh0aGVuUGFja2V0LnYpLCBfbW1fY2FzdHBzX3BkKGVsc2VQYWNrZXQudikpOworICByZXR1cm4gUGFja2V0MmNmKF9tbV9jYXN0cGRfcHMocmVzdWx0KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGluc2VydGZpcnN0KGNvbnN0IFBhY2tldDJjZiYgYSwgc3RkOjpjb21wbGV4PGZsb2F0PiBiKQoreworICByZXR1cm4gUGFja2V0MmNmKF9tbV9sb2FkbF9waShhLnYsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tNjQqPigmYikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwaW5zZXJ0Zmlyc3QoY29uc3QgUGFja2V0MWNkJiwgc3RkOjpjb21wbGV4PGRvdWJsZT4gYikKK3sKKyAgcmV0dXJuIHBzZXQxPFBhY2tldDFjZD4oYik7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGluc2VydGxhc3QoY29uc3QgUGFja2V0MmNmJiBhLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGIpCit7CisgIHJldHVybiBQYWNrZXQyY2YoX21tX2xvYWRoX3BpKGEudiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX202NCo+KCZiKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBpbnNlcnRsYXN0KGNvbnN0IFBhY2tldDFjZCYsIHN0ZDo6Y29tcGxleDxkb3VibGU+IGIpCit7CisgIHJldHVybiBwc2V0MTxQYWNrZXQxY2Q+KGIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT01QTEVYX1NTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1Zjk0OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL01hdGhGdW5jdGlvbnMuaApAQCAtMCwwICsxLDU2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcgSnVsaWVuIFBvbW1pZXIKKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIFRoZSBzaW4sIGNvcywgZXhwLCBhbmQgbG9nIGZ1bmN0aW9ucyBvZiB0aGlzIGZpbGUgY29tZSBmcm9tCisgKiBKdWxpZW4gUG9tbWllcidzIHNzZSBtYXRoIGxpYnJhcnk6IGh0dHA6Ly9ncnVudHRoZXBlb24uZnJlZS5mci9zc2VtYXRoLworICovCisKKyNpZm5kZWYgRUlHRU5fTUFUSF9GVU5DVElPTlNfU1NFX0gKKyNkZWZpbmUgRUlHRU5fTUFUSF9GVU5DVElPTlNfU1NFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwbG9nPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgX3gpCit7CisgIFBhY2tldDRmIHggPSBfeDsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoMSAsIDEuMGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihoYWxmLCAwLjVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoMHg3ZiwgMHg3Zik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQoaW52X21hbnRfbWFzaywgfjB4N2Y4MDAwMDApOworCisgIC8qIHRoZSBzbWFsbGVzdCBub24gZGVub3JtYWxpemVkIGZsb2F0IG51bWJlciAqLworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChtaW5fbm9ybV9wb3MsICAweDAwODAwMDAwKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQobWludXNfaW5mLCAgICAgMHhmZjgwMDAwMCk7Ly8tMS5mLzAuZik7CisKKyAgLyogbmF0dXJhbCBsb2dhcml0aG0gY29tcHV0ZWQgZm9yIDQgc2ltdWx0YW5lb3VzIGZsb2F0CisgICAgcmV0dXJuIE5hTiBmb3IgeCA8PSAwCisgICovCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19TUVJUSEYsIDAuNzA3MTA2NzgxMTg2NTQ3NTI0Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19sb2dfcDAsIDcuMDM3NjgzNjI5MkUtMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AxLCAtIDEuMTUxNDYxMDMxMEUtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AyLCAxLjE2NzY5OTg3NDBFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wMywgLSAxLjI0MjAxNDA4NDZFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNCwgKyAxLjQyNDkzMjI3ODdFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNSwgLSAxLjY2NjgwNTc2NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNiwgKyAyLjAwMDA3MTQ3NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNywgLSAyLjQ5OTk5OTM5OTNFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wOCwgKyAzLjMzMzMzMzExNzRFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19xMSwgLTIuMTIxOTQ0NDBlLTRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19xMiwgMC42OTMzNTkzNzVmKTsKKworCisgIFBhY2tldDRpIGVtbTA7CisKKyAgUGFja2V0NGYgaW52YWxpZF9tYXNrID0gX21tX2NtcG5nZV9wcyh4LCBfbW1fc2V0emVyb19wcygpKTsgLy8gbm90IGdyZWF0ZXIgZXF1YWwgaXMgdHJ1ZSBpZiB4IGlzIE5hTgorICBQYWNrZXQ0ZiBpc3plcm9fbWFzayA9IF9tbV9jbXBlcV9wcyh4LCBfbW1fc2V0emVyb19wcygpKTsKKworICB4ID0gcG1heCh4LCBwNGZfbWluX25vcm1fcG9zKTsgIC8qIGN1dCBvZmYgZGVub3JtYWxpemVkIHN0dWZmICovCisgIGVtbTAgPSBfbW1fc3JsaV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHgpLCAyMyk7CisKKyAgLyoga2VlcCBvbmx5IHRoZSBmcmFjdGlvbmFsIHBhcnQgKi8KKyAgeCA9IF9tbV9hbmRfcHMoeCwgcDRmX2ludl9tYW50X21hc2spOworICB4ID0gX21tX29yX3BzKHgsIHA0Zl9oYWxmKTsKKworICBlbW0wID0gX21tX3N1Yl9lcGkzMihlbW0wLCBwNGlfMHg3Zik7CisgIFBhY2tldDRmIGUgPSBwYWRkKFBhY2tldDRmKF9tbV9jdnRlcGkzMl9wcyhlbW0wKSksIHA0Zl8xKTsKKworICAvKiBwYXJ0MjoKKyAgICAgaWYoIHggPCBTUVJUSEYgKSB7CisgICAgICAgZSAtPSAxOworICAgICAgIHggPSB4ICsgeCAtIDEuMDsKKyAgICAgfSBlbHNlIHsgeCA9IHggLSAxLjA7IH0KKyAgKi8KKyAgUGFja2V0NGYgbWFzayA9IF9tbV9jbXBsdF9wcyh4LCBwNGZfY2VwaGVzX1NRUlRIRik7CisgIFBhY2tldDRmIHRtcCA9IHBhbmQoeCwgbWFzayk7CisgIHggPSBwc3ViKHgsIHA0Zl8xKTsKKyAgZSA9IHBzdWIoZSwgcGFuZChwNGZfMSwgbWFzaykpOworICB4ID0gcGFkZCh4LCB0bXApOworCisgIFBhY2tldDRmIHgyID0gcG11bCh4LHgpOworICBQYWNrZXQ0ZiB4MyA9IHBtdWwoeDIseCk7CisKKyAgUGFja2V0NGYgeSwgeTEsIHkyOworICB5ICA9IHBtYWRkKHA0Zl9jZXBoZXNfbG9nX3AwLCB4LCBwNGZfY2VwaGVzX2xvZ19wMSk7CisgIHkxID0gcG1hZGQocDRmX2NlcGhlc19sb2dfcDMsIHgsIHA0Zl9jZXBoZXNfbG9nX3A0KTsKKyAgeTIgPSBwbWFkZChwNGZfY2VwaGVzX2xvZ19wNiwgeCwgcDRmX2NlcGhlc19sb2dfcDcpOworICB5ICA9IHBtYWRkKHkgLCB4LCBwNGZfY2VwaGVzX2xvZ19wMik7CisgIHkxID0gcG1hZGQoeTEsIHgsIHA0Zl9jZXBoZXNfbG9nX3A1KTsKKyAgeTIgPSBwbWFkZCh5MiwgeCwgcDRmX2NlcGhlc19sb2dfcDgpOworICB5ID0gcG1hZGQoeSwgeDMsIHkxKTsKKyAgeSA9IHBtYWRkKHksIHgzLCB5Mik7CisgIHkgPSBwbXVsKHksIHgzKTsKKworICB5MSA9IHBtdWwoZSwgcDRmX2NlcGhlc19sb2dfcTEpOworICB0bXAgPSBwbXVsKHgyLCBwNGZfaGFsZik7CisgIHkgPSBwYWRkKHksIHkxKTsKKyAgeCA9IHBzdWIoeCwgdG1wKTsKKyAgeTIgPSBwbXVsKGUsIHA0Zl9jZXBoZXNfbG9nX3EyKTsKKyAgeCA9IHBhZGQoeCwgeSk7CisgIHggPSBwYWRkKHgsIHkyKTsKKyAgLy8gbmVnYXRpdmUgYXJnIHdpbGwgYmUgTkFOLCAwIHdpbGwgYmUgLUlORgorICByZXR1cm4gX21tX29yX3BzKF9tbV9hbmRub3RfcHMoaXN6ZXJvX21hc2ssIF9tbV9vcl9wcyh4LCBpbnZhbGlkX21hc2spKSwKKyAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3BzKGlzemVyb19tYXNrLCBwNGZfbWludXNfaW5mKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcGV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiB4ID0gX3g7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKDEgLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDB4N2YsIDB4N2YpOworCisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoZXhwX2hpLCAgODguMzc2MjYyNjY0Nzk1MGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihleHBfbG8sIC04OC4zNzYyNjI2NjQ3OTQ5Zik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX0xPRzJFRiwgMS40NDI2OTUwNDA4ODg5NjM0MWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX0MxLCAwLjY5MzM1OTM3NWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX0MyLCAtMi4xMjE5NDQ0MGUtNGYpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDAsIDEuOTg3NTY5MTUwMEUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3AxLCAxLjM5ODE5OTk1MDdFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wMiwgOC4zMzM0NTE5MDczRS0zZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDMsIDQuMTY2NTc5NTg5NEUtMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3A0LCAxLjY2NjY2NjU0NTlFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wNSwgNS4wMDAwMDAxMjAxRS0xZik7CisKKyAgUGFja2V0NGYgdG1wLCBmeDsKKyAgUGFja2V0NGkgZW1tMDsKKworICAvLyBjbGFtcCB4CisgIHggPSBwbWF4KHBtaW4oeCwgcDRmX2V4cF9oaSksIHA0Zl9leHBfbG8pOworCisgIC8qIGV4cHJlc3MgZXhwKHgpIGFzIGV4cChnICsgbipsb2coMikpICovCisgIGZ4ID0gcG1hZGQoeCwgcDRmX2NlcGhlc19MT0cyRUYsIHA0Zl9oYWxmKTsKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgZnggPSBfbW1fZmxvb3JfcHMoZngpOworI2Vsc2UKKyAgZW1tMCA9IF9tbV9jdnR0cHNfZXBpMzIoZngpOworICB0bXAgID0gX21tX2N2dGVwaTMyX3BzKGVtbTApOworICAvKiBpZiBncmVhdGVyLCBzdWJzdHJhY3QgMSAqLworICBQYWNrZXQ0ZiBtYXNrID0gX21tX2NtcGd0X3BzKHRtcCwgZngpOworICBtYXNrID0gX21tX2FuZF9wcyhtYXNrLCBwNGZfMSk7CisgIGZ4ID0gcHN1Yih0bXAsIG1hc2spOworI2VuZGlmCisKKyAgdG1wID0gcG11bChmeCwgcDRmX2NlcGhlc19leHBfQzEpOworICBQYWNrZXQ0ZiB6ID0gcG11bChmeCwgcDRmX2NlcGhlc19leHBfQzIpOworICB4ID0gcHN1Yih4LCB0bXApOworICB4ID0gcHN1Yih4LCB6KTsKKworICB6ID0gcG11bCh4LHgpOworCisgIFBhY2tldDRmIHkgPSBwNGZfY2VwaGVzX2V4cF9wMDsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AxKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AyKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3AzKTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3A0KTsKKyAgeSA9IHBtYWRkKHksIHgsIHA0Zl9jZXBoZXNfZXhwX3A1KTsKKyAgeSA9IHBtYWRkKHksIHosIHgpOworICB5ID0gcGFkZCh5LCBwNGZfMSk7CisKKyAgLy8gYnVpbGQgMl5uCisgIGVtbTAgPSBfbW1fY3Z0dHBzX2VwaTMyKGZ4KTsKKyAgZW1tMCA9IF9tbV9hZGRfZXBpMzIoZW1tMCwgcDRpXzB4N2YpOworICBlbW0wID0gX21tX3NsbGlfZXBpMzIoZW1tMCwgMjMpOworICByZXR1cm4gcG1heChwbXVsKHksIFBhY2tldDRmKF9tbV9jYXN0c2kxMjhfcHMoZW1tMCkpKSwgX3gpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQyZCBwZXhwPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgX3gpCit7CisgIFBhY2tldDJkIHggPSBfeDsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZCgxICwgMS4wKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoMiAsIDIuMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGhhbGYsIDAuNSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoZXhwX2hpLCAgNzA5LjQzNyk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGV4cF9sbywgLTcwOS40MzYxMzkzMDMpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19MT0cyRUYsIDEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9wMCwgMS4yNjE3NzE5MzA3NDgxMDU5MDg3OGUtNCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcDEsIDMuMDI5OTQ0MDc3MDc0NDE5NjEzMDBlLTIpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3AyLCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTEwZS0xKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3EwLCAzLjAwMTk4NTA1MTM4NjY0NDU1MDQyZS02KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9xMSwgMi41MjQ0ODM0MDM0OTY4NDEwNDE5MmUtMyk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcTIsIDIuMjcyNjU1NDgyMDgxNTUwMjg3NjZlLTEpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX3EzLCAyLjAwMDAwMDAwMDAwMDAwMDAwMDA5ZTApOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfQzEsIDAuNjkzMTQ1NzUxOTUzMTI1KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9DMiwgMS40Mjg2MDY4MjAzMDk0MTcyMzIxMmUtNik7CisgIHN0YXRpYyBjb25zdCBfX20xMjhpIHA0aV8xMDIzXzAgPSBfbW1fc2V0cl9lcGkzMigxMDIzLCAxMDIzLCAwLCAwKTsKKworICBQYWNrZXQyZCB0bXAsIGZ4OworICBQYWNrZXQ0aSBlbW0wOworCisgIC8vIGNsYW1wIHgKKyAgeCA9IHBtYXgocG1pbih4LCBwMmRfZXhwX2hpKSwgcDJkX2V4cF9sbyk7CisgIC8qIGV4cHJlc3MgZXhwKHgpIGFzIGV4cChnICsgbipsb2coMikpICovCisgIGZ4ID0gcG1hZGQocDJkX2NlcGhlc19MT0cyRUYsIHgsIHAyZF9oYWxmKTsKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgZnggPSBfbW1fZmxvb3JfcGQoZngpOworI2Vsc2UKKyAgZW1tMCA9IF9tbV9jdnR0cGRfZXBpMzIoZngpOworICB0bXAgID0gX21tX2N2dGVwaTMyX3BkKGVtbTApOworICAvKiBpZiBncmVhdGVyLCBzdWJzdHJhY3QgMSAqLworICBQYWNrZXQyZCBtYXNrID0gX21tX2NtcGd0X3BkKHRtcCwgZngpOworICBtYXNrID0gX21tX2FuZF9wZChtYXNrLCBwMmRfMSk7CisgIGZ4ID0gcHN1Yih0bXAsIG1hc2spOworI2VuZGlmCisKKyAgdG1wID0gcG11bChmeCwgcDJkX2NlcGhlc19leHBfQzEpOworICBQYWNrZXQyZCB6ID0gcG11bChmeCwgcDJkX2NlcGhlc19leHBfQzIpOworICB4ID0gcHN1Yih4LCB0bXApOworICB4ID0gcHN1Yih4LCB6KTsKKworICBQYWNrZXQyZCB4MiA9IHBtdWwoeCx4KTsKKworICBQYWNrZXQyZCBweCA9IHAyZF9jZXBoZXNfZXhwX3AwOworICBweCA9IHBtYWRkKHB4LCB4MiwgcDJkX2NlcGhlc19leHBfcDEpOworICBweCA9IHBtYWRkKHB4LCB4MiwgcDJkX2NlcGhlc19leHBfcDIpOworICBweCA9IHBtdWwgKHB4LCB4KTsKKworICBQYWNrZXQyZCBxeCA9IHAyZF9jZXBoZXNfZXhwX3EwOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTEpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTIpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTMpOworCisgIHggPSBwZGl2KHB4LHBzdWIocXgscHgpKTsKKyAgeCA9IHBtYWRkKHAyZF8yLHgscDJkXzEpOworCisgIC8vIGJ1aWxkIDJebgorICBlbW0wID0gX21tX2N2dHRwZF9lcGkzMihmeCk7CisgIGVtbTAgPSBfbW1fYWRkX2VwaTMyKGVtbTAsIHA0aV8xMDIzXzApOworICBlbW0wID0gX21tX3NsbGlfZXBpMzIoZW1tMCwgMjApOworICBlbW0wID0gX21tX3NodWZmbGVfZXBpMzIoZW1tMCwgX01NX1NIVUZGTEUoMSwyLDAsMykpOworICByZXR1cm4gcG1heChwbXVsKHgsIFBhY2tldDJkKF9tbV9jYXN0c2kxMjhfcGQoZW1tMCkpKSwgX3gpOworfQorCisvKiBldmFsdWF0aW9uIG9mIDQgc2luZXMgYXQgb25jZXMsIHVzaW5nIFNTRTIgaW50cmluc2ljcy4KKworICAgVGhlIGNvZGUgaXMgdGhlIGV4YWN0IHJld3JpdGluZyBvZiB0aGUgY2VwaGVzIHNpbmYgZnVuY3Rpb24uCisgICBQcmVjaXNpb24gaXMgZXhjZWxsZW50IGFzIGxvbmcgYXMgeCA8IDgxOTIgKEkgZGlkIG5vdCBib3RoZXIgdG8KKyAgIHRha2UgaW50byBhY2NvdW50IHRoZSBzcGVjaWFsIGhhbmRsaW5nIHRoZXkgaGF2ZSBmb3IgZ3JlYXRlciB2YWx1ZXMKKyAgIC0tIGl0IGRvZXMgbm90IHJldHVybiBnYXJiYWdlIGZvciBhcmd1bWVudHMgb3ZlciA4MTkyLCB0aG91Z2gsIGJ1dAorICAgdGhlIGV4dHJhIHByZWNpc2lvbiBpcyBtaXNzaW5nKS4KKworICAgTm90ZSB0aGF0IGl0IGlzIHN1Y2ggdGhhdCBzaW5mKChmbG9hdClNX1BJKSA9IDguNzRlLTgsIHdoaWNoIGlzIHRoZQorICAgc3VycHJpc2luZyBidXQgY29ycmVjdCByZXN1bHQuCisqLworCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHBzaW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBfeCkKK3sKKyAgUGFja2V0NGYgeCA9IF94OworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZigxICwgMS4wZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGhhbGYsIDAuNWYpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDEsIDEpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aShub3QxLCB+MSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDIsIDIpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSg0LCA0KTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChzaWduX21hc2ssIDB4ODAwMDAwMDApOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG1pbnVzX2NlcGhlc19EUDEsLTAuNzg1MTU2MjVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYobWludXNfY2VwaGVzX0RQMiwgLTIuNDE4NzU2NDg0OTg1MzUxNTYyNWUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihtaW51c19jZXBoZXNfRFAzLCAtMy43NzQ4OTQ5Nzc0NDU5NDEwOGUtOGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihzaW5jb2ZfcDAsIC0xLjk1MTUyOTU4OTFFLTRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoc2luY29mX3AxLCAgOC4zMzIxNjA4NzM2RS0zZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHNpbmNvZl9wMiwgLTEuNjY2NjY1NDYxMUUtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihjb3Njb2ZfcDAsICAyLjQ0MzMxNTcxMTgwOTk0OEUtMDA1Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNvc2NvZl9wMSwgLTEuMzg4NzMxNjI1NDkzNzY1RS0wMDNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY29zY29mX3AyLCAgNC4xNjY2NjQ1NjgyOTg4MjdFLTAwMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfRk9QSSwgMS4yNzMyMzk1NDQ3MzUxNmYpOyAvLyA0IC8gTV9QSQorCisgIFBhY2tldDRmIHhtbTEsIHhtbTIsIHhtbTMsIHNpZ25fYml0LCB5OworCisgIFBhY2tldDRpIGVtbTAsIGVtbTI7CisgIHNpZ25fYml0ID0geDsKKyAgLyogdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgKi8KKyAgeCA9IHBhYnMoeCk7CisKKyAgLyogdGFrZSB0aGUgbW9kdWxvICovCisKKyAgLyogZXh0cmFjdCB0aGUgc2lnbiBiaXQgKHVwcGVyIG9uZSkgKi8KKyAgc2lnbl9iaXQgPSBfbW1fYW5kX3BzKHNpZ25fYml0LCBwNGZfc2lnbl9tYXNrKTsKKworICAvKiBzY2FsZSBieSA0L1BpICovCisgIHkgPSBwbXVsKHgsIHA0Zl9jZXBoZXNfRk9QSSk7CisKKyAgLyogc3RvcmUgdGhlIGludGVnZXIgcGFydCBvZiB5IGluIG1tMCAqLworICBlbW0yID0gX21tX2N2dHRwc19lcGkzMih5KTsKKyAgLyogaj0oaisxKSAmICh+MSkgKHNlZSB0aGUgY2VwaGVzIHNvdXJjZXMpICovCisgIGVtbTIgPSBfbW1fYWRkX2VwaTMyKGVtbTIsIHA0aV8xKTsKKyAgZW1tMiA9IF9tbV9hbmRfc2kxMjgoZW1tMiwgcDRpX25vdDEpOworICB5ID0gX21tX2N2dGVwaTMyX3BzKGVtbTIpOworICAvKiBnZXQgdGhlIHN3YXAgc2lnbiBmbGFnICovCisgIGVtbTAgPSBfbW1fYW5kX3NpMTI4KGVtbTIsIHA0aV80KTsKKyAgZW1tMCA9IF9tbV9zbGxpX2VwaTMyKGVtbTAsIDI5KTsKKyAgLyogZ2V0IHRoZSBwb2x5bm9tIHNlbGVjdGlvbiBtYXNrCisgICAgIHRoZXJlIGlzIG9uZSBwb2x5bm9tIGZvciAwIDw9IHggPD0gUGkvNAorICAgICBhbmQgYW5vdGhlciBvbmUgZm9yIFBpLzQ8eDw9UGkvMgorCisgICAgIEJvdGggYnJhbmNoZXMgd2lsbCBiZSBjb21wdXRlZC4KKyAgKi8KKyAgZW1tMiA9IF9tbV9hbmRfc2kxMjgoZW1tMiwgcDRpXzIpOworICBlbW0yID0gX21tX2NtcGVxX2VwaTMyKGVtbTIsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworCisgIFBhY2tldDRmIHN3YXBfc2lnbl9iaXQgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTApOworICBQYWNrZXQ0ZiBwb2x5X21hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTIpOworICBzaWduX2JpdCA9IF9tbV94b3JfcHMoc2lnbl9iaXQsIHN3YXBfc2lnbl9iaXQpOworCisgIC8qIFRoZSBtYWdpYyBwYXNzOiAiRXh0ZW5kZWQgcHJlY2lzaW9uIG1vZHVsYXIgYXJpdGhtZXRpYyIKKyAgICAgeCA9ICgoeCAtIHkgKiBEUDEpIC0geSAqIERQMikgLSB5ICogRFAzOyAqLworICB4bW0xID0gcG11bCh5LCBwNGZfbWludXNfY2VwaGVzX0RQMSk7CisgIHhtbTIgPSBwbXVsKHksIHA0Zl9taW51c19jZXBoZXNfRFAyKTsKKyAgeG1tMyA9IHBtdWwoeSwgcDRmX21pbnVzX2NlcGhlc19EUDMpOworICB4ID0gcGFkZCh4LCB4bW0xKTsKKyAgeCA9IHBhZGQoeCwgeG1tMik7CisgIHggPSBwYWRkKHgsIHhtbTMpOworCisgIC8qIEV2YWx1YXRlIHRoZSBmaXJzdCBwb2x5bm9tICAoMCA8PSB4IDw9IFBpLzQpICovCisgIHkgPSBwNGZfY29zY29mX3AwOworICBQYWNrZXQ0ZiB6ID0gX21tX211bF9wcyh4LHgpOworCisgIHkgPSBwbWFkZCh5LCB6LCBwNGZfY29zY29mX3AxKTsKKyAgeSA9IHBtYWRkKHksIHosIHA0Zl9jb3Njb2ZfcDIpOworICB5ID0gcG11bCh5LCB6KTsKKyAgeSA9IHBtdWwoeSwgeik7CisgIFBhY2tldDRmIHRtcCA9IHBtdWwoeiwgcDRmX2hhbGYpOworICB5ID0gcHN1Yih5LCB0bXApOworICB5ID0gcGFkZCh5LCBwNGZfMSk7CisKKyAgLyogRXZhbHVhdGUgdGhlIHNlY29uZCBwb2x5bm9tICAoUGkvNCA8PSB4IDw9IDApICovCisKKyAgUGFja2V0NGYgeTIgPSBwNGZfc2luY29mX3AwOworICB5MiA9IHBtYWRkKHkyLCB6LCBwNGZfc2luY29mX3AxKTsKKyAgeTIgPSBwbWFkZCh5MiwgeiwgcDRmX3NpbmNvZl9wMik7CisgIHkyID0gcG11bCh5Miwgeik7CisgIHkyID0gcG11bCh5MiwgeCk7CisgIHkyID0gcGFkZCh5MiwgeCk7CisKKyAgLyogc2VsZWN0IHRoZSBjb3JyZWN0IHJlc3VsdCBmcm9tIHRoZSB0d28gcG9seW5vbXMgKi8KKyAgeTIgPSBfbW1fYW5kX3BzKHBvbHlfbWFzaywgeTIpOworICB5ID0gX21tX2FuZG5vdF9wcyhwb2x5X21hc2ssIHkpOworICB5ID0gX21tX29yX3BzKHkseTIpOworICAvKiB1cGRhdGUgdGhlIHNpZ24gKi8KKyAgcmV0dXJuIF9tbV94b3JfcHMoeSwgc2lnbl9iaXQpOworfQorCisvKiBhbG1vc3QgdGhlIHNhbWUgYXMgcHNpbiAqLwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwY29zPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgX3gpCit7CisgIFBhY2tldDRmIHggPSBfeDsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoMSAsIDEuMGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihoYWxmLCAwLjVmKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgxLCAxKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkobm90MSwgfjEpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgyLCAyKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoNCwgNCk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYobWludXNfY2VwaGVzX0RQMSwtMC43ODUxNTYyNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihtaW51c19jZXBoZXNfRFAyLCAtMi40MTg3NTY0ODQ5ODUzNTE1NjI1ZS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG1pbnVzX2NlcGhlc19EUDMsIC0zLjc3NDg5NDk3NzQ0NTk0MTA4ZS04Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHNpbmNvZl9wMCwgLTEuOTUxNTI5NTg5MUUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihzaW5jb2ZfcDEsICA4LjMzMjE2MDg3MzZFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoc2luY29mX3AyLCAtMS42NjY2NjU0NjExRS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNvc2NvZl9wMCwgIDIuNDQzMzE1NzExODA5OTQ4RS0wMDVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY29zY29mX3AxLCAtMS4zODg3MzE2MjU0OTM3NjVFLTAwM2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihjb3Njb2ZfcDIsICA0LjE2NjY2NDU2ODI5ODgyN0UtMDAyZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19GT1BJLCAxLjI3MzIzOTU0NDczNTE2Zik7IC8vIDQgLyBNX1BJCisKKyAgUGFja2V0NGYgeG1tMSwgeG1tMiwgeG1tMywgeTsKKyAgUGFja2V0NGkgZW1tMCwgZW1tMjsKKworICB4ID0gcGFicyh4KTsKKworICAvKiBzY2FsZSBieSA0L1BpICovCisgIHkgPSBwbXVsKHgsIHA0Zl9jZXBoZXNfRk9QSSk7CisKKyAgLyogZ2V0IHRoZSBpbnRlZ2VyIHBhcnQgb2YgeSAqLworICBlbW0yID0gX21tX2N2dHRwc19lcGkzMih5KTsKKyAgLyogaj0oaisxKSAmICh+MSkgKHNlZSB0aGUgY2VwaGVzIHNvdXJjZXMpICovCisgIGVtbTIgPSBfbW1fYWRkX2VwaTMyKGVtbTIsIHA0aV8xKTsKKyAgZW1tMiA9IF9tbV9hbmRfc2kxMjgoZW1tMiwgcDRpX25vdDEpOworICB5ID0gX21tX2N2dGVwaTMyX3BzKGVtbTIpOworCisgIGVtbTIgPSBfbW1fc3ViX2VwaTMyKGVtbTIsIHA0aV8yKTsKKworICAvKiBnZXQgdGhlIHN3YXAgc2lnbiBmbGFnICovCisgIGVtbTAgPSBfbW1fYW5kbm90X3NpMTI4KGVtbTIsIHA0aV80KTsKKyAgZW1tMCA9IF9tbV9zbGxpX2VwaTMyKGVtbTAsIDI5KTsKKyAgLyogZ2V0IHRoZSBwb2x5bm9tIHNlbGVjdGlvbiBtYXNrICovCisgIGVtbTIgPSBfbW1fYW5kX3NpMTI4KGVtbTIsIHA0aV8yKTsKKyAgZW1tMiA9IF9tbV9jbXBlcV9lcGkzMihlbW0yLCBfbW1fc2V0emVyb19zaTEyOCgpKTsKKworICBQYWNrZXQ0ZiBzaWduX2JpdCA9IF9tbV9jYXN0c2kxMjhfcHMoZW1tMCk7CisgIFBhY2tldDRmIHBvbHlfbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoZW1tMik7CisKKyAgLyogVGhlIG1hZ2ljIHBhc3M6ICJFeHRlbmRlZCBwcmVjaXNpb24gbW9kdWxhciBhcml0aG1ldGljIgorICAgICB4ID0gKCh4IC0geSAqIERQMSkgLSB5ICogRFAyKSAtIHkgKiBEUDM7ICovCisgIHhtbTEgPSBwbXVsKHksIHA0Zl9taW51c19jZXBoZXNfRFAxKTsKKyAgeG1tMiA9IHBtdWwoeSwgcDRmX21pbnVzX2NlcGhlc19EUDIpOworICB4bW0zID0gcG11bCh5LCBwNGZfbWludXNfY2VwaGVzX0RQMyk7CisgIHggPSBwYWRkKHgsIHhtbTEpOworICB4ID0gcGFkZCh4LCB4bW0yKTsKKyAgeCA9IHBhZGQoeCwgeG1tMyk7CisKKyAgLyogRXZhbHVhdGUgdGhlIGZpcnN0IHBvbHlub20gICgwIDw9IHggPD0gUGkvNCkgKi8KKyAgeSA9IHA0Zl9jb3Njb2ZfcDA7CisgIFBhY2tldDRmIHogPSBwbXVsKHgseCk7CisKKyAgeSA9IHBtYWRkKHkseixwNGZfY29zY29mX3AxKTsKKyAgeSA9IHBtYWRkKHkseixwNGZfY29zY29mX3AyKTsKKyAgeSA9IHBtdWwoeSwgeik7CisgIHkgPSBwbXVsKHksIHopOworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fbXVsX3BzKHosIHA0Zl9oYWxmKTsKKyAgeSA9IHBzdWIoeSwgdG1wKTsKKyAgeSA9IHBhZGQoeSwgcDRmXzEpOworCisgIC8qIEV2YWx1YXRlIHRoZSBzZWNvbmQgcG9seW5vbSAgKFBpLzQgPD0geCA8PSAwKSAqLworICBQYWNrZXQ0ZiB5MiA9IHA0Zl9zaW5jb2ZfcDA7CisgIHkyID0gcG1hZGQoeTIsIHosIHA0Zl9zaW5jb2ZfcDEpOworICB5MiA9IHBtYWRkKHkyLCB6LCBwNGZfc2luY29mX3AyKTsKKyAgeTIgPSBwbXVsKHkyLCB6KTsKKyAgeTIgPSBwbWFkZCh5MiwgeCwgeCk7CisKKyAgLyogc2VsZWN0IHRoZSBjb3JyZWN0IHJlc3VsdCBmcm9tIHRoZSB0d28gcG9seW5vbXMgKi8KKyAgeTIgPSBfbW1fYW5kX3BzKHBvbHlfbWFzaywgeTIpOworICB5ICA9IF9tbV9hbmRub3RfcHMocG9seV9tYXNrLCB5KTsKKyAgeSAgPSBfbW1fb3JfcHMoeSx5Mik7CisKKyAgLyogdXBkYXRlIHRoZSBzaWduICovCisgIHJldHVybiBfbW1feG9yX3BzKHksIHNpZ25fYml0KTsKK30KKworI2lmIEVJR0VOX0ZBU1RfTUFUSAorCisvLyBGdW5jdGlvbnMgZm9yIHNxcnQuCisvLyBUaGUgRUlHRU5fRkFTVF9NQVRIIHZlcnNpb24gdXNlcyB0aGUgX21tX3JzcXJ0X3BzIGFwcHJveGltYXRpb24gYW5kIG9uZSBzdGVwCisvLyBvZiBOZXd0b24ncyBtZXRob2QsIGF0IGEgY29zdCBvZiAxLTIgYml0cyBvZiBwcmVjaXNpb24gYXMgb3Bwb3NlZCB0byB0aGUKKy8vIGV4YWN0IHNvbHV0aW9uLiBJdCBkb2VzIG5vdCBoYW5kbGUgK2luZiwgb3IgZGVub3JtYWxpemVkIG51bWJlcnMgY29ycmVjdGx5LgorLy8gVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgbm90IGp1c3Qgc3BlZWQsIGJ1dCBhbHNvIHRoZSBmYWN0IHRoYXQKKy8vIGl0IGNhbiBiZSBpbmxpbmVkIGFuZCBwaXBlbGluZWQgd2l0aCBvdGhlciBjb21wdXRhdGlvbnMsIGZ1cnRoZXIgcmVkdWNpbmcgaXRzCisvLyBlZmZlY3RpdmUgbGF0ZW5jeS4gVGhpcyBpcyBzaW1pbGFyIHRvIFF1YWtlMydzIGZhc3QgaW52ZXJzZSBzcXVhcmUgcm9vdC4KKy8vIEZvciBkZXRhaWwgc2VlIGhlcmU6IGh0dHA6Ly93d3cuYmV5b25kM2QuY29tL2NvbnRlbnQvYXJ0aWNsZXMvOC8KK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcHNxcnQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBfeCkKK3sKKyAgUGFja2V0NGYgaGFsZiA9IHBtdWwoX3gsIHBzZXQxPFBhY2tldDRmPiguNWYpKTsKKyAgUGFja2V0NGYgZGVub3JtYWxfbWFzayA9IF9tbV9hbmRfcHMoCisgICAgICBfbW1fY21wZ2VfcHMoX3gsIF9tbV9zZXR6ZXJvX3BzKCkpLAorICAgICAgX21tX2NtcGx0X3BzKF94LCBwc2V0MTxQYWNrZXQ0Zj4oKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptaW4pKCkpKSk7CisKKyAgLy8gQ29tcHV0ZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FsIHNxcnQuCisgIFBhY2tldDRmIHggPSBfbW1fcnNxcnRfcHMoX3gpOworICAvLyBEbyBhIHNpbmdsZSBzdGVwIG9mIE5ld3RvbidzIGl0ZXJhdGlvbi4KKyAgeCA9IHBtdWwoeCwgcHN1Yihwc2V0MTxQYWNrZXQ0Zj4oMS41ZiksIHBtdWwoaGFsZiwgcG11bCh4LHgpKSkpOworICAvLyBGbHVzaCByZXN1bHRzIGZvciBkZW5vcm1hbHMgdG8gemVyby4KKyAgcmV0dXJuIF9tbV9hbmRub3RfcHMoZGVub3JtYWxfbWFzaywgcG11bChfeCx4KSk7Cit9CisKKyNlbHNlCisKK3RlbXBsYXRlPD5FSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIHgpIHsgcmV0dXJuIF9tbV9zcXJ0X3BzKHgpOyB9CisKKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDJkIHBzcXJ0PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgeCkgeyByZXR1cm4gX21tX3NxcnRfcGQoeCk7IH0KKworI2lmIEVJR0VOX0ZBU1RfTUFUSAorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHByc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KSB7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKGluZiwgMHg3ZjgwMDAwMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKG5hbiwgMHg3ZmMwMDAwMCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG9uZV9wb2ludF9maXZlLCAxLjVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYobWludXNfaGFsZiwgLTAuNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChmbHRfbWluLCAweDAwODAwMDAwKTsKKworICBQYWNrZXQ0ZiBuZWdfaGFsZiA9IHBtdWwoX3gsIHA0Zl9taW51c19oYWxmKTsKKworICAvLyBzZWxlY3Qgb25seSB0aGUgaW52ZXJzZSBzcXJ0IG9mIHBvc2l0aXZlIG5vcm1hbCBpbnB1dHMgKGRlbm9ybWFscyBhcmUKKyAgLy8gZmx1c2hlZCB0byB6ZXJvIGFuZCBjYXVzZSBpbmZzIGFzIHdlbGwpLgorICBQYWNrZXQ0ZiBsZV96ZXJvX21hc2sgPSBfbW1fY21wbGVfcHMoX3gsIHA0Zl9mbHRfbWluKTsKKyAgUGFja2V0NGYgeCA9IF9tbV9hbmRub3RfcHMobGVfemVyb19tYXNrLCBfbW1fcnNxcnRfcHMoX3gpKTsKKworICAvLyBGaWxsIGluIE5hTnMgYW5kIEluZnMgZm9yIHRoZSBuZWdhdGl2ZS96ZXJvIGVudHJpZXMuCisgIFBhY2tldDRmIG5lZ19tYXNrID0gX21tX2NtcGx0X3BzKF94LCBfbW1fc2V0emVyb19wcygpKTsKKyAgUGFja2V0NGYgemVyb19tYXNrID0gX21tX2FuZG5vdF9wcyhuZWdfbWFzaywgbGVfemVyb19tYXNrKTsKKyAgUGFja2V0NGYgaW5mc19hbmRfbmFucyA9IF9tbV9vcl9wcyhfbW1fYW5kX3BzKG5lZ19tYXNrLCBwNGZfbmFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3BzKHplcm9fbWFzaywgcDRmX2luZikpOworCisgIC8vIERvIGEgc2luZ2xlIHN0ZXAgb2YgTmV3dG9uJ3MgaXRlcmF0aW9uLgorICB4ID0gcG11bCh4LCBwbWFkZChuZWdfaGFsZiwgcG11bCh4LCB4KSwgcDRmX29uZV9wb2ludF9maXZlKSk7CisKKyAgLy8gSW5zZXJ0IE5hTnMgYW5kIEluZnMgaW4gYWxsIHRoZSByaWdodCBwbGFjZXMuCisgIHJldHVybiBfbW1fb3JfcHMoeCwgaW5mc19hbmRfbmFucyk7Cit9CisKKyNlbHNlCisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcHJzcXJ0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgeCkgeworICAvLyBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHVzZSB0aGUgbXVjaCBmYXN0ZXIgbW1fcnFzcnRfcHMgc2luY2UgaXQgb25seSBwcm92aWRlcyBhbiBhcHByb3hpbWF0aW9uLgorICByZXR1cm4gX21tX2Rpdl9wcyhwc2V0MTxQYWNrZXQ0Zj4oMS4wZiksIF9tbV9zcXJ0X3BzKHgpKTsKK30KKworI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0MmQgcHJzcXJ0PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgeCkgeworICAvLyBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHVzZSB0aGUgbXVjaCBmYXN0ZXIgbW1fcnFzcnRfcGQgc2luY2UgaXQgb25seSBwcm92aWRlcyBhbiBhcHByb3hpbWF0aW9uLgorICByZXR1cm4gX21tX2Rpdl9wZChwc2V0MTxQYWNrZXQyZD4oMS4wKSwgX21tX3NxcnRfcGQoeCkpOworfQorCisvLyBIeXBlcmJvbGljIFRhbmdlbnQgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8PgorRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRCBQYWNrZXQ0ZgorcHRhbmg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiB4KSB7CisgIHJldHVybiBpbnRlcm5hbDo6Z2VuZXJpY19mYXN0X3RhbmhfZmxvYXQoeCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgbnVtZXh0IHsKKwordGVtcGxhdGU8PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZmxvYXQgc3FydChjb25zdCBmbG9hdCAmeCkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpwZmlyc3QoaW50ZXJuYWw6OlBhY2tldDRmKF9tbV9zcXJ0X3NzKF9tbV9zZXRfc3MoeCkpKSk7Cit9CisKK3RlbXBsYXRlPD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2RvdWJsZSBzcXJ0KGNvbnN0IGRvdWJsZSAmeCkKK3sKKyNpZiBFSUdFTl9DT01QX0dOVUNfU1RSSUNUCisgIC8vIFRoaXMgd29ya3MgYXJvdW5kIGEgR0NDIGJ1ZyBnZW5lcmF0aW5nIHBvb3IgY29kZSBmb3IgX21tX3NxcnRfcGQKKyAgLy8gU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9laWdlbi9laWdlbi9jb21taXRzLzE0ZjQ2OGRiYTRkMzUwZDdjMTljOWI5MzA3MmUxOWY3YjNkZjU2M2IKKyAgcmV0dXJuIGludGVybmFsOjpwZmlyc3QoaW50ZXJuYWw6OlBhY2tldDJkKF9fYnVpbHRpbl9pYTMyX3NxcnRzZChfbW1fc2V0X3NkKHgpKSkpOworI2Vsc2UKKyAgcmV0dXJuIGludGVybmFsOjpwZmlyc3QoaW50ZXJuYWw6OlBhY2tldDJkKF9tbV9zcXJ0X3BkKF9tbV9zZXRfc2QoeCkpKSk7CisjZW5kaWYKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG51bWV4CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUSF9GVU5DVElPTlNfU1NFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL1BhY2tldE1hdGguaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL1BhY2tldE1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODMyZGUxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsODc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQUNLRVRfTUFUSF9TU0VfSAorI2RlZmluZSBFSUdFTl9QQUNLRVRfTUFUSF9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyNkZWZpbmUgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCA4CisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUworI2RlZmluZSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUyAoMipzaXplb2Yodm9pZCopKQorI2VuZGlmCisKKyNpZmRlZiBfX0ZNQV9fCisjaWZuZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorI2RlZmluZSBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQgMQorI2VuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9BVlgpICYmIChFSUdFTl9DT01QX0dOVUNfU1RSSUNUIHx8IEVJR0VOX0NPTVBfTUlOR1cpICYmIChfX0dYWF9BQklfVkVSU0lPTiA8IDEwMDQpCisvLyBXaXRoIEdDQydzIGRlZmF1bHQgQUJJIHZlcnNpb24sIGEgX19tMTI4IG9yIF9fbTI1NiBhcmUgdGhlIHNhbWUgdHlwZXMgYW5kIHRoZXJlZm9yZSB3ZSBjYW5ub3QKKy8vIGhhdmUgb3ZlcmxvYWRzIGZvciBib3RoIHR5cGVzIHdpdGhvdXQgbGlua2luZyBlcnJvci4KKy8vIE9uZSBzb2x1dGlvbiBpcyB0byBpbmNyZWFzZSBBQkkgdmVyc2lvbiB1c2luZyAtZmFiaS12ZXJzaW9uPTQgKG9yIGdyZWF0ZXIpLgorLy8gT3RoZXJ3aXNlLCB3ZSB3b3JrYXJvdW5kIHRoaXMgaW5jb252ZW5pZW5jZSBieSB3cmFwcGluZyAxMjhiaXQgdHlwZXMgaW50byB0aGUgZm9sbG93aW5nIGhlbHBlcgorLy8gc3RydWN0dXJlOgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBlaWdlbl9wYWNrZXRfd3JhcHBlcgoreworICBFSUdFTl9BTFdBWVNfSU5MSU5FIG9wZXJhdG9yIFQmKCkgeyByZXR1cm4gbV92YWw7IH0KKyAgRUlHRU5fQUxXQVlTX0lOTElORSBvcGVyYXRvciBjb25zdCBUJigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsOyB9CisgIEVJR0VOX0FMV0FZU19JTkxJTkUgZWlnZW5fcGFja2V0X3dyYXBwZXIoKSB7fQorICBFSUdFTl9BTFdBWVNfSU5MSU5FIGVpZ2VuX3BhY2tldF93cmFwcGVyKGNvbnN0IFQgJnYpIDogbV92YWwodikge30KKyAgRUlHRU5fQUxXQVlTX0lOTElORSBlaWdlbl9wYWNrZXRfd3JhcHBlciYgb3BlcmF0b3I9KGNvbnN0IFQgJnYpIHsKKyAgICBtX3ZhbCA9IHY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBUIG1fdmFsOworfTsKK3R5cGVkZWYgZWlnZW5fcGFja2V0X3dyYXBwZXI8X19tMTI4PiAgUGFja2V0NGY7Cit0eXBlZGVmIGVpZ2VuX3BhY2tldF93cmFwcGVyPF9fbTEyOGk+IFBhY2tldDRpOwordHlwZWRlZiBlaWdlbl9wYWNrZXRfd3JhcHBlcjxfX20xMjhkPiBQYWNrZXQyZDsKKyNlbHNlCit0eXBlZGVmIF9fbTEyOCAgUGFja2V0NGY7Cit0eXBlZGVmIF9fbTEyOGkgUGFja2V0NGk7Cit0eXBlZGVmIF9fbTEyOGQgUGFja2V0MmQ7CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxfX20xMjg+ICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8X19tMTI4aT4geyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPF9fbTEyOGQ+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCisjZGVmaW5lIHZlYzRmX3N3aXp6bGUxKHYscCxxLHIscykgXAorICAoX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMiggX21tX2Nhc3Rwc19zaTEyOCh2KSwgKChzKTw8Nnwocik8PDR8KHEpPDwyfChwKSkpKSkKKworI2RlZmluZSB2ZWM0aV9zd2l6emxlMSh2LHAscSxyLHMpIFwKKyAgKF9tbV9zaHVmZmxlX2VwaTMyKCB2LCAoKHMpPDw2fChyKTw8NHwocSk8PDJ8KHApKSkpCisKKyNkZWZpbmUgdmVjMmRfc3dpenpsZTEodixwLHEpIFwKKyAgKF9tbV9jYXN0c2kxMjhfcGQoX21tX3NodWZmbGVfZXBpMzIoIF9tbV9jYXN0cGRfc2kxMjgodiksICgocSoyKzEpPDw2fChxKjIpPDw0fChwKjIrMSk8PDJ8KHAqMikpKSkpCisgIAorI2RlZmluZSB2ZWM0Zl9zd2l6emxlMihhLGIscCxxLHIscykgXAorICAoX21tX3NodWZmbGVfcHMoIChhKSwgKGIpLCAoKHMpPDw2fChyKTw8NHwocSk8PDJ8KHApKSkpCisKKyNkZWZpbmUgdmVjNGlfc3dpenpsZTIoYSxiLHAscSxyLHMpIFwKKyAgKF9tbV9jYXN0cHNfc2kxMjgoIChfbW1fc2h1ZmZsZV9wcyggX21tX2Nhc3RzaTEyOF9wcyhhKSwgX21tX2Nhc3RzaTEyOF9wcyhiKSwgKChzKTw8Nnwocik8PDR8KHEpPDwyfChwKSkpKSkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoTkFNRSxYKSBcCisgIGNvbnN0IFBhY2tldDRmIHA0Zl8jI05BTUUgPSBwc2V0MTxQYWNrZXQ0Zj4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChOQU1FLFgpIFwKKyAgY29uc3QgUGFja2V0MmQgcDJkXyMjTkFNRSA9IHBzZXQxPFBhY2tldDJkPihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0ZiBwNGZfIyNOQU1FID0gX21tX2Nhc3RzaTEyOF9wcyhwc2V0MTxQYWNrZXQ0aT4oWCkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoTkFNRSxYKSBcCisgIGNvbnN0IFBhY2tldDRpIHA0aV8jI05BTUUgPSBwc2V0MTxQYWNrZXQ0aT4oWCkKKworCisvLyBVc2UgdGhlIHBhY2tldF90cmFpdHMgZGVmaW5lZCBpbiBBVlgvUGFja2V0TWF0aC5oIGluc3RlYWQgaWYgd2UncmUgZ29pbmcKKy8vIHRvIGxldmVyYWdlIEFWWCBpbnN0cnVjdGlvbnMuCisjaWZuZGVmIEVJR0VOX1ZFQ1RPUklaRV9BVlgKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZmxvYXQ+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRmIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0NGYgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemU9NCwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0RpdiAgPSAxLAorICAgIEhhc1NpbiAgPSBFSUdFTl9GQVNUX01BVEgsCisgICAgSGFzQ29zICA9IEVJR0VOX0ZBU1RfTUFUSCwKKyAgICBIYXNMb2cgID0gMSwKKyAgICBIYXNFeHAgID0gMSwKKyAgICBIYXNTcXJ0ID0gMSwKKyAgICBIYXNSc3FydCA9IDEsCisgICAgSGFzVGFuaCAgPSBFSUdFTl9GQVNUX01BVEgsCisgICAgSGFzQmxlbmQgPSAxCisKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgICAgLAorICAgIEhhc1JvdW5kID0gMSwKKyAgICBIYXNGbG9vciA9IDEsCisgICAgSGFzQ2VpbCA9IDEKKyNlbmRpZgorICB9OworfTsKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZG91YmxlPiA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDJkIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0MmQgaGFsZjsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemU9MiwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0RpdiAgPSAxLAorICAgIEhhc0V4cCAgPSAxLAorICAgIEhhc1NxcnQgPSAxLAorICAgIEhhc1JzcXJ0ID0gMSwKKyAgICBIYXNCbGVuZCA9IDEKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgICAsCisgICAgSGFzUm91bmQgPSAxLAorICAgIEhhc0Zsb29yID0gMSwKKyAgICBIYXNDZWlsID0gMQorI2VuZGlmCisgIH07Cit9OworI2VuZGlmCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPGludD4gICAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ0aSB0eXBlOworICB0eXBlZGVmIFBhY2tldDRpIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQsCisKKyAgICBIYXNCbGVuZCA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0Zj4geyB0eXBlZGVmIGZsb2F0ICB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDRmIGhhbGY7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MmQ+IHsgdHlwZWRlZiBkb3VibGUgdHlwZTsgZW51bSB7c2l6ZT0yLCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBQYWNrZXQyZCBoYWxmOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDRpPiB7IHR5cGVkZWYgaW50ICAgIHR5cGU7IGVudW0ge3NpemU9NCwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0NGkgaGFsZjsgfTsKKworI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYCit0ZW1wbGF0ZTw+IHN0cnVjdCBzY2FsYXJfZGl2X2Nvc3Q8ZmxvYXQsdHJ1ZT4geyBlbnVtIHsgdmFsdWUgPSA3IH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzY2FsYXJfZGl2X2Nvc3Q8ZG91YmxlLHRydWU+IHsgZW51bSB7IHZhbHVlID0gOCB9OyB9OworI2VuZGlmCisKKyNpZiBFSUdFTl9DT01QX01TVkM9PTE1MDAKKy8vIFdvcmthcm91bmQgTVNWQyA5IGludGVybmFsIGNvbXBpbGVyIGVycm9yLgorLy8gVE9ETzogSXQgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aCB3aW42NCBidWlsZHMgKGFtZDY0KSwgc28gbGV0J3MgY2hlY2sgd2hldGhlciBpdCBhbHNvIGhhcHBlbnMgaW4gMzJiaXRzK1NTRSBtb2RlCisvLyBUT0RPOiBsZXQncyBjaGVjayB3aGV0aGVyIHRoZXJlIGRvZXMgbm90IGV4aXN0IGEgYmV0dGVyIGZpeCwgbGlrZSBhZGRpbmcgYSBwc2V0MCgpIGZ1bmN0aW9uLiAoaXQgY3Jhc2hlZCBvbiBwc2V0MSgwKSkuCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHNldDE8UGFja2V0NGY+KGNvbnN0IGZsb2F0JiAgZnJvbSkgeyByZXR1cm4gX21tX3NldF9wcyhmcm9tLGZyb20sZnJvbSxmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBzZXQxPFBhY2tldDJkPihjb25zdCBkb3VibGUmIGZyb20pIHsgcmV0dXJuIF9tbV9zZXRfcGQoZnJvbSxmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBzZXQxPFBhY2tldDRpPihjb25zdCBpbnQmICAgIGZyb20pIHsgcmV0dXJuIF9tbV9zZXRfZXBpMzIoZnJvbSxmcm9tLGZyb20sZnJvbSk7IH0KKyNlbHNlCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHNldDE8UGFja2V0NGY+KGNvbnN0IGZsb2F0JiAgZnJvbSkgeyByZXR1cm4gX21tX3NldF9wczEoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc2V0MTxQYWNrZXQyZD4oY29uc3QgZG91YmxlJiBmcm9tKSB7IHJldHVybiBfbW1fc2V0MV9wZChmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBzZXQxPFBhY2tldDRpPihjb25zdCBpbnQmICAgIGZyb20pIHsgcmV0dXJuIF9tbV9zZXQxX2VwaTMyKGZyb20pOyB9CisjZW5kaWYKKworLy8gR0NDIGdlbmVyYXRlcyBhIHNodWZwcyBpbnN0cnVjdGlvbiBmb3IgX21tX3NldDFfcHMvX21tX2xvYWQxX3BzIGluc3RlYWQgb2YgdGhlIG1vcmUgZWZmaWNpZW50IHBzaHVmZCBpbnN0cnVjdGlvbi4KKy8vIEhvd2V2ZXIsIHVzaW5nIGlucmluc2ljcyBmb3IgcHNldDEgbWFrZXMgZ2NjIHRvIGdlbmVyYXRlIGNyYXBweSBjb2RlIGluIHNvbWUgY2FzZXMgKHNlZSBidWcgMjAzKQorLy8gVXNpbmcgaW5saW5lIGFzc2VtYmx5IGlzIGFsc28gbm90IGFuIG9wdGlvbiBiZWNhdXNlIHRoZW4gZ2NjIGZhaWxzIHRvIHJlb3JkZXIgcHJvcGVybHkgdGhlIGluc3RydWN0aW9ucy4KKy8vIFRoZXJlZm9yZSwgd2UgaW50cm9kdWNlZCB0aGUgcGxvYWQxIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluIHByb2R1Y3Qga2VybmVscyBmb3Igd2hpY2ggYnVnIDIwMyBkb2VzIG5vdCBhcHBseS4KKy8vIEFsc28gbm90ZSB0aGF0IHdpdGggQVZYLCB3ZSB3YW50IGl0IHRvIGdlbmVyYXRlIGEgdmJyb2FkY2FzdHNzLgorI2lmIEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgJiYgKCFkZWZpbmVkIF9fQVZYX18pCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWQxPFBhY2tldDRmPihjb25zdCBmbG9hdCAqZnJvbSkgeworICByZXR1cm4gdmVjNGZfc3dpenpsZTEoX21tX2xvYWRfc3MoZnJvbSksMCwwLDAsMCk7Cit9CisjZW5kaWYKKyAgCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxzZXQ8UGFja2V0NGY+KGNvbnN0IGZsb2F0JiBhKSB7IHJldHVybiBfbW1fYWRkX3BzKHBzZXQxPFBhY2tldDRmPihhKSwgX21tX3NldF9wcygzLDIsMSwwKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbHNldDxQYWNrZXQyZD4oY29uc3QgZG91YmxlJiBhKSB7IHJldHVybiBfbW1fYWRkX3BkKHBzZXQxPFBhY2tldDJkPihhKSxfbW1fc2V0X3BkKDEsMCkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxzZXQ8UGFja2V0NGk+KGNvbnN0IGludCYgYSkgeyByZXR1cm4gX21tX2FkZF9lcGkzMihwc2V0MTxQYWNrZXQ0aT4oYSksX21tX3NldF9lcGkzMigzLDIsMSwwKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhZGQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2FkZF9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFkZDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fYWRkX3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWRkPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIF9tbV9hZGRfZXBpMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHN1YjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fc3ViX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc3ViPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9zdWJfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBzdWI8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gX21tX3N1Yl9lcGkzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbmVnYXRlKGNvbnN0IFBhY2tldDRmJiBhKQoreworICBjb25zdCBQYWNrZXQ0ZiBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDgwMDAwMDAwLDB4ODAwMDAwMDAsMHg4MDAwMDAwMCwweDgwMDAwMDAwKSk7CisgIHJldHVybiBfbW1feG9yX3BzKGEsbWFzayk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG5lZ2F0ZShjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgY29uc3QgUGFja2V0MmQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldHJfZXBpMzIoMHgwLDB4ODAwMDAwMDAsMHgwLDB4ODAwMDAwMDApKTsKKyAgcmV0dXJuIF9tbV94b3JfcGQoYSxtYXNrKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbmVnYXRlKGNvbnN0IFBhY2tldDRpJiBhKQoreworICByZXR1cm4gcHN1YihQYWNrZXQ0aShfbW1fc2V0cl9lcGkzMigwLDAsMCwwKSksIGEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGNvbmooY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIGE7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwY29uaihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gYTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBjb25qKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbXVsPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9tdWxfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBtdWw8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX211bF9wZChhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG11bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgcmV0dXJuIF9tbV9tdWxsb19lcGkzMihhLGIpOworI2Vsc2UKKyAgLy8gdGhpcyB2ZXJzaW9uIGlzIHNsaWdodGx5IGZhc3RlciB0aGFuIDQgc2NhbGFyIHByb2R1Y3RzCisgIHJldHVybiB2ZWM0aV9zd2l6emxlMSgKKyAgICAgICAgICAgIHZlYzRpX3N3aXp6bGUyKAorICAgICAgICAgICAgICBfbW1fbXVsX2VwdTMyKGEsYiksCisgICAgICAgICAgICAgIF9tbV9tdWxfZXB1MzIodmVjNGlfc3dpenpsZTEoYSwxLDAsMywyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0aV9zd2l6emxlMShiLDEsMCwzLDIpKSwKKyAgICAgICAgICAgICAgMCwyLDAsMiksCisgICAgICAgICAgICAwLDIsMSwzKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGRpdjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fZGl2X3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwZGl2PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9kaXZfcGQoYSxiKTsgfQorCisvLyBmb3Igc29tZSB3ZWlyZCByYWlzb25zLCBpdCBoYXMgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgcGFja2V0IG9mIGludGVnZXJzCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1hZGQoY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiLCBjb25zdCBQYWNrZXQ0aSYgYykgeyByZXR1cm4gcGFkZChwbXVsKGEsYiksIGMpOyB9CisjaWZkZWYgX19GTUFfXwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtYWRkKGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYiwgY29uc3QgUGFja2V0NGYmIGMpIHsgcmV0dXJuIF9tbV9mbWFkZF9wcyhhLGIsYyk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWFkZChjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIsIGNvbnN0IFBhY2tldDJkJiBjKSB7IHJldHVybiBfbW1fZm1hZGRfcGQoYSxiLGMpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtaW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX21pbl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG1pbjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fbWluX3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWluPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpCit7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICByZXR1cm4gX21tX21pbl9lcGkzMihhLGIpOworI2Vsc2UKKyAgLy8gYWZ0ZXIgc29tZSBiZW5jaCwgdGhpcyB2ZXJzaW9uICppcyogZmFzdGVyIHRoYW4gYSBzY2FsYXIgaW1wbGVtZW50YXRpb24KKyAgUGFja2V0NGkgbWFzayA9IF9tbV9jbXBsdF9lcGkzMihhLGIpOworICByZXR1cm4gX21tX29yX3NpMTI4KF9tbV9hbmRfc2kxMjgobWFzayxhKSxfbW1fYW5kbm90X3NpMTI4KG1hc2ssYikpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9tYXhfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBtYXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX21heF9wZChhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1heDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgcmV0dXJuIF9tbV9tYXhfZXBpMzIoYSxiKTsKKyNlbHNlCisgIC8vIGFmdGVyIHNvbWUgYmVuY2gsIHRoaXMgdmVyc2lvbiAqaXMqIGZhc3RlciB0aGFuIGEgc2NhbGFyIGltcGxlbWVudGF0aW9uCisgIFBhY2tldDRpIG1hc2sgPSBfbW1fY21wZ3RfZXBpMzIoYSxiKTsKKyAgcmV0dXJuIF9tbV9vcl9zaTEyOChfbW1fYW5kX3NpMTI4KG1hc2ssYSksX21tX2FuZG5vdF9zaTEyOChtYXNrLGIpKTsKKyNlbmRpZgorfQorCisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHByb3VuZDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIF9tbV9yb3VuZF9wcyhhLCAwKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHByb3VuZDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIF9tbV9yb3VuZF9wZChhLCAwKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGNlaWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBfbW1fY2VpbF9wcyhhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBjZWlsPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gX21tX2NlaWxfcGQoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBmbG9vcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIF9tbV9mbG9vcl9wcyhhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBmbG9vcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIF9tbV9mbG9vcl9wZChhKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYW5kPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9hbmRfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhbmQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX2FuZF9wZChhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFuZDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiBfbW1fYW5kX3NpMTI4KGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fb3JfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fb3JfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBvcjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiBfbW1fb3Jfc2kxMjgoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHhvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1feG9yX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBweG9yPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV94b3JfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHB4b3I8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gX21tX3hvcl9zaTEyOChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYW5kbm90PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9hbmRub3RfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhbmRub3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wZChhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFuZG5vdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiBfbW1fYW5kbm90X3NpMTI4KGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkPFBhY2tldDRmPihjb25zdCBmbG9hdCogICBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gX21tX2xvYWRfcHMoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbG9hZDxQYWNrZXQyZD4oY29uc3QgZG91YmxlKiAgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIF9tbV9sb2FkX3BkKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxvYWQ8UGFja2V0NGk+KGNvbnN0IGludCogICAgIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBfbW1fbG9hZF9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihmcm9tKSk7IH0KKworI2lmIEVJR0VOX0NPTVBfTVNWQworICB0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWR1PFBhY2tldDRmPihjb25zdCBmbG9hdCogIGZyb20pIHsKKyAgICBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRAorICAgICNpZiAoRUlHRU5fQ09NUF9NU1ZDPT0xNjAwKQorICAgIC8vIE5PVEUgU29tZSB2ZXJzaW9uIG9mIE1TVkMxMCBnZW5lcmF0ZXMgYmFkIGNvZGUgd2hlbiB1c2luZyBfbW1fbG9hZHVfcHMKKyAgICAvLyAoaS5lLiwgaXQgZG9lcyBub3QgZ2VuZXJhdGUgYW4gdW5hbGlnbmVkIGxvYWQhIQorICAgIF9fbTEyOCByZXMgPSBfbW1fbG9hZGxfcGkoX21tX3NldDFfcHMoMC4wZiksIChjb25zdCBfX202NCopKGZyb20pKTsKKyAgICByZXMgPSBfbW1fbG9hZGhfcGkocmVzLCAoY29uc3QgX19tNjQqKShmcm9tKzIpKTsKKyAgICByZXR1cm4gcmVzOworICAgICNlbHNlCisgICAgcmV0dXJuIF9tbV9sb2FkdV9wcyhmcm9tKTsKKyAgICAjZW5kaWYKKyAgfQorI2Vsc2UKKy8vIE5PVEU6IHdpdGggdGhlIGNvZGUgYmVsb3csIE1TVkMncyBjb21waWxlciBjcmFzaGVzIQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWR1PFBhY2tldDRmPihjb25zdCBmbG9hdCogZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQKKyAgcmV0dXJuIF9tbV9sb2FkdV9wcyhmcm9tKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWR1PFBhY2tldDJkPihjb25zdCBkb3VibGUqIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FECisgIHJldHVybiBfbW1fbG9hZHVfcGQoZnJvbSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxvYWR1PFBhY2tldDRpPihjb25zdCBpbnQqIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FECisgIHJldHVybiBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpKj4oZnJvbSkpOworfQorCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZGR1cDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqICAgZnJvbSkKK3sKKyAgcmV0dXJuIHZlYzRmX3N3aXp6bGUxKF9tbV9jYXN0cGRfcHMoX21tX2xvYWRfc2QocmVpbnRlcnByZXRfY2FzdDxjb25zdCBkb3VibGUqPihmcm9tKSkpLCAwLCAwLCAxLCAxKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbG9hZGR1cDxQYWNrZXQyZD4oY29uc3QgZG91YmxlKiAgZnJvbSkKK3sgcmV0dXJuIHBzZXQxPFBhY2tldDJkPihmcm9tWzBdKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkZHVwPFBhY2tldDRpPihjb25zdCBpbnQqICAgICBmcm9tKQoreworICBQYWNrZXQ0aSB0bXA7CisgIHRtcCA9IF9tbV9sb2FkbF9lcGk2NChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkqPihmcm9tKSk7CisgIHJldHVybiB2ZWM0aV9zd2l6emxlMSh0bXAsIDAsIDAsIDEsIDEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8ZmxvYXQ+KGZsb2F0KiAgIHRvLCBjb25zdCBQYWNrZXQ0ZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIF9tbV9zdG9yZV9wcyh0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxkb3VibGU+KGRvdWJsZSogdG8sIGNvbnN0IFBhY2tldDJkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgX21tX3N0b3JlX3BkKHRvLCBmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGludD4oaW50KiAgICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBfbW1fc3RvcmVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4odG8pLCBmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGRvdWJsZT4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIF9tbV9zdG9yZXVfcGQodG8sIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGZsb2F0PihmbG9hdCogICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIF9tbV9zdG9yZXVfcHModG8sIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGludD4oaW50KiAgICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIF9tbV9zdG9yZXVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpKj4odG8pLCBmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQ0ZiBwZ2F0aGVyPGZsb2F0LCBQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyByZXR1cm4gX21tX3NldF9wcyhmcm9tWzMqc3RyaWRlXSwgZnJvbVsyKnN0cmlkZV0sIGZyb21bMSpzdHJpZGVdLCBmcm9tWzAqc3RyaWRlXSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQyZCBwZ2F0aGVyPGRvdWJsZSwgUGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogZnJvbSwgSW5kZXggc3RyaWRlKQoreworIHJldHVybiBfbW1fc2V0X3BkKGZyb21bMSpzdHJpZGVdLCBmcm9tWzAqc3RyaWRlXSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQ0aSBwZ2F0aGVyPGludCwgUGFja2V0NGk+KGNvbnN0IGludCogZnJvbSwgSW5kZXggc3RyaWRlKQoreworIHJldHVybiBfbW1fc2V0X2VwaTMyKGZyb21bMypzdHJpZGVdLCBmcm9tWzIqc3RyaWRlXSwgZnJvbVsxKnN0cmlkZV0sIGZyb21bMCpzdHJpZGVdKTsKKyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZmxvYXQsIFBhY2tldDRmPihmbG9hdCogdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHRvW3N0cmlkZSowXSA9IF9tbV9jdnRzc19mMzIoZnJvbSk7CisgIHRvW3N0cmlkZSoxXSA9IF9tbV9jdnRzc19mMzIoX21tX3NodWZmbGVfcHMoZnJvbSwgZnJvbSwgMSkpOworICB0b1tzdHJpZGUqMl0gPSBfbW1fY3Z0c3NfZjMyKF9tbV9zaHVmZmxlX3BzKGZyb20sIGZyb20sIDIpKTsKKyAgdG9bc3RyaWRlKjNdID0gX21tX2N2dHNzX2YzMihfbW1fc2h1ZmZsZV9wcyhmcm9tLCBmcm9tLCAzKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGRvdWJsZSwgUGFja2V0MmQ+KGRvdWJsZSogdG8sIGNvbnN0IFBhY2tldDJkJiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIHRvW3N0cmlkZSowXSA9IF9tbV9jdnRzZF9mNjQoZnJvbSk7CisgIHRvW3N0cmlkZSoxXSA9IF9tbV9jdnRzZF9mNjQoX21tX3NodWZmbGVfcGQoZnJvbSwgZnJvbSwgMSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBwc2NhdHRlcjxpbnQsIFBhY2tldDRpPihpbnQqIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICB0b1tzdHJpZGUqMF0gPSBfbW1fY3Z0c2kxMjhfc2kzMihmcm9tKTsKKyAgdG9bc3RyaWRlKjFdID0gX21tX2N2dHNpMTI4X3NpMzIoX21tX3NodWZmbGVfZXBpMzIoZnJvbSwgMSkpOworICB0b1tzdHJpZGUqMl0gPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2h1ZmZsZV9lcGkzMihmcm9tLCAyKSk7CisgIHRvW3N0cmlkZSozXSA9IF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zaHVmZmxlX2VwaTMyKGZyb20sIDMpKTsKK30KKworLy8gc29tZSBjb21waWxlcnMgbWlnaHQgYmUgdGVtcHRlZCB0byBwZXJmb3JtIG11bHRpcGxlIG1vdmVzIGluc3RlYWQgb2YgdXNpbmcgYSB2ZWN0b3IgcGF0aC4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0NGY+KGZsb2F0KiB0bywgY29uc3QgZmxvYXQmIGEpCit7CisgIFBhY2tldDRmIHBhID0gX21tX3NldF9zcyhhKTsKKyAgcHN0b3JlKHRvLCBQYWNrZXQ0Zih2ZWM0Zl9zd2l6emxlMShwYSwwLDAsMCwwKSkpOworfQorLy8gc29tZSBjb21waWxlcnMgbWlnaHQgYmUgdGVtcHRlZCB0byBwZXJmb3JtIG11bHRpcGxlIG1vdmVzIGluc3RlYWQgb2YgdXNpbmcgYSB2ZWN0b3IgcGF0aC4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0MmQ+KGRvdWJsZSogdG8sIGNvbnN0IGRvdWJsZSYgYSkKK3sKKyAgUGFja2V0MmQgcGEgPSBfbW1fc2V0X3NkKGEpOworICBwc3RvcmUodG8sIFBhY2tldDJkKHZlYzJkX3N3aXp6bGUxKHBhLDAsMCkpKTsKK30KKworI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkVfQVZYCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxmbG9hdD4oY29uc3QgZmxvYXQqICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxkb3VibGU+KGNvbnN0IGRvdWJsZSogYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxpbnQ+KGNvbnN0IGludCogICAgICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9CisjZW5kaWYKKworI2lmIEVJR0VOX0NPTVBfTVNWQ19TVFJJQ1QgJiYgRUlHRU5fT1NfV0lONjQKKy8vIFRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgZml4ZXMgYW4gaW50ZXJuYWwgY29tcGlsYXRpb24gZXJyb3IgaW4gdnMgPD0gMjAwOCBhbmQgYSB3cm9uZy1yZXN1bHQgYnVnIGluIHZzIDIwMTAKKy8vIERpcmVjdCBvZiB0aGUgc3RydWN0IG1lbWJlcnMgZml4ZWQgYnVnICM2Mi4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gYS5tMTI4X2YzMlswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiBhLm0xMjhkX2Y2NFswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCB4ID0gX21tX2N2dHNpMTI4X3NpMzIoYSk7IHJldHVybiB4OyB9CisjZWxpZiBFSUdFTl9DT01QX01TVkNfU1RSSUNUCisvLyBUaGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGZpeGVzIGFuIGludGVybmFsIGNvbXBpbGF0aW9uIGVycm9yIGluIHZzIDw9IDIwMDggYW5kIGEgd3JvbmctcmVzdWx0IGJ1ZyBpbiB2cyAyMDEwCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgIHBmaXJzdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgZmxvYXQgeCA9IF9tbV9jdnRzc19mMzIoYSk7IHJldHVybiB4OyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHBmaXJzdDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgZG91YmxlIHggPSBfbW1fY3Z0c2RfZjY0KGEpOyByZXR1cm4geDsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCB4ID0gX21tX2N2dHNpMTI4X3NpMzIoYSk7IHJldHVybiB4OyB9CisjZWxzZQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0ICBwZmlyc3Q8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBfbW1fY3Z0c3NfZjMyKGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHBmaXJzdDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIF9tbV9jdnRzZF9mNjQoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgICAgcGZpcnN0PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkgeyByZXR1cm4gX21tX2N2dHNpMTI4X3NpMzIoYSk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJldmVyc2UoY29uc3QgUGFja2V0NGYmIGEpCit7IHJldHVybiBfbW1fc2h1ZmZsZV9wcyhhLGEsMHgxQik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQyZCYgYSkKK3sgcmV0dXJuIF9tbV9zaHVmZmxlX3BkKGEsYSwweDEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJldmVyc2UoY29uc3QgUGFja2V0NGkmIGEpCit7IHJldHVybiBfbW1fc2h1ZmZsZV9lcGkzMihhLDB4MUIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWJzKGNvbnN0IFBhY2tldDRmJiBhKQoreworICBjb25zdCBQYWNrZXQ0ZiBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDdGRkZGRkZGLDB4N0ZGRkZGRkYsMHg3RkZGRkZGRiwweDdGRkZGRkZGKSk7CisgIHJldHVybiBfbW1fYW5kX3BzKGEsbWFzayk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFicyhjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgY29uc3QgUGFja2V0MmQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldHJfZXBpMzIoMHhGRkZGRkZGRiwweDdGRkZGRkZGLDB4RkZGRkZGRkYsMHg3RkZGRkZGRikpOworICByZXR1cm4gX21tX2FuZF9wZChhLG1hc2spOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhYnMoY29uc3QgUGFja2V0NGkmIGEpCit7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NTRTMKKyAgcmV0dXJuIF9tbV9hYnNfZXBpMzIoYSk7CisgICNlbHNlCisgIFBhY2tldDRpIGF1eCA9IF9tbV9zcmFpX2VwaTMyKGEsMzEpOworICByZXR1cm4gX21tX3N1Yl9lcGkzMihfbW1feG9yX3NpMTI4KGEsYXV4KSxhdXgpOworICAjZW5kaWYKK30KKworLy8gd2l0aCBBVlgsIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBwbG9hZDEgYXJlIGZhc3RlcgorI2lmbmRlZiBfX0FWWF9fCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcGJyb2FkY2FzdDQ8UGFja2V0NGY+KGNvbnN0IGZsb2F0ICphLAorICAgICAgICAgICAgICAgICAgICAgIFBhY2tldDRmJiBhMCwgUGFja2V0NGYmIGExLCBQYWNrZXQ0ZiYgYTIsIFBhY2tldDRmJiBhMykKK3sKKyAgYTMgPSBwbG9hZDxQYWNrZXQ0Zj4oYSk7CisgIGEwID0gdmVjNGZfc3dpenpsZTEoYTMsIDAsMCwwLDApOworICBhMSA9IHZlYzRmX3N3aXp6bGUxKGEzLCAxLDEsMSwxKTsKKyAgYTIgPSB2ZWM0Zl9zd2l6emxlMShhMywgMiwyLDIsMik7CisgIGEzID0gdmVjNGZfc3dpenpsZTEoYTMsIDMsMywzLDMpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK3Bicm9hZGNhc3Q0PFBhY2tldDJkPihjb25zdCBkb3VibGUgKmEsCisgICAgICAgICAgICAgICAgICAgICAgUGFja2V0MmQmIGEwLCBQYWNrZXQyZCYgYTEsIFBhY2tldDJkJiBhMiwgUGFja2V0MmQmIGEzKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgIGEwID0gX21tX2xvYWRkdXBfcGQoYSswKTsKKyAgYTEgPSBfbW1fbG9hZGR1cF9wZChhKzEpOworICBhMiA9IF9tbV9sb2FkZHVwX3BkKGErMik7CisgIGEzID0gX21tX2xvYWRkdXBfcGQoYSszKTsKKyNlbHNlCisgIGExID0gcGxvYWQ8UGFja2V0MmQ+KGEpOworICBhMCA9IHZlYzJkX3N3aXp6bGUxKGExLCAwLDApOworICBhMSA9IHZlYzJkX3N3aXp6bGUxKGExLCAxLDEpOworICBhMyA9IHBsb2FkPFBhY2tldDJkPihhKzIpOworICBhMiA9IHZlYzJkX3N3aXp6bGUxKGEzLCAwLDApOworICBhMyA9IHZlYzJkX3N3aXp6bGUxKGEzLCAxLDEpOworI2VuZGlmCit9CisjZW5kaWYKKworRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHB1bnBhY2twKFBhY2tldDRmKiB2ZWNzKQoreworICB2ZWNzWzFdID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHZlY3NbMF0pLCAweDU1KSk7CisgIHZlY3NbMl0gPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgodmVjc1swXSksIDB4QUEpKTsKKyAgdmVjc1szXSA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NodWZmbGVfZXBpMzIoX21tX2Nhc3Rwc19zaTEyOCh2ZWNzWzBdKSwgMHhGRikpOworICB2ZWNzWzBdID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHZlY3NbMF0pLCAweDAwKSk7Cit9CisKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHByZWR1eHA8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmKiB2ZWNzKQoreworICByZXR1cm4gX21tX2hhZGRfcHMoX21tX2hhZGRfcHModmVjc1swXSwgdmVjc1sxXSksX21tX2hhZGRfcHModmVjc1syXSwgdmVjc1szXSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJlZHV4cDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQqIHZlY3MpCit7CisgIHJldHVybiBfbW1faGFkZF9wZCh2ZWNzWzBdLCB2ZWNzWzFdKTsKK30KKworI2Vsc2UKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcmVkdXhwPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiogdmVjcykKK3sKKyAgUGFja2V0NGYgdG1wMCwgdG1wMSwgdG1wMjsKKyAgdG1wMCA9IF9tbV91bnBhY2tsb19wcyh2ZWNzWzBdLCB2ZWNzWzFdKTsKKyAgdG1wMSA9IF9tbV91bnBhY2toaV9wcyh2ZWNzWzBdLCB2ZWNzWzFdKTsKKyAgdG1wMiA9IF9tbV91bnBhY2toaV9wcyh2ZWNzWzJdLCB2ZWNzWzNdKTsKKyAgdG1wMCA9IF9tbV9hZGRfcHModG1wMCwgdG1wMSk7CisgIHRtcDEgPSBfbW1fdW5wYWNrbG9fcHModmVjc1syXSwgdmVjc1szXSk7CisgIHRtcDEgPSBfbW1fYWRkX3BzKHRtcDEsIHRtcDIpOworICB0bXAyID0gX21tX21vdmVobF9wcyh0bXAxLCB0bXAwKTsKKyAgdG1wMCA9IF9tbV9tb3ZlbGhfcHModG1wMCwgdG1wMSk7CisgIHJldHVybiBfbW1fYWRkX3BzKHRtcDAsIHRtcDIpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJlZHV4cDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQqIHZlY3MpCit7CisgIHJldHVybiBfbW1fYWRkX3BkKF9tbV91bnBhY2tsb19wZCh2ZWNzWzBdLCB2ZWNzWzFdKSwgX21tX3VucGFja2hpX3BkKHZlY3NbMF0sIHZlY3NbMV0pKTsKK30KKyNlbmRpZiAgLy8gU1NFMworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgLy8gRGlzYWJsZSBTU0UzIF9tbV9oYWRkX3BkIHRoYXQgaXMgZXh0cmVtZWx5IHNsb3cgb24gYWxsIGV4aXN0aW5nIEludGVsJ3MgYXJjaGl0ZWN0dXJlcworICAvLyAoZnJvbSBOZWhhbGVtIHRvIEhhc3dlbGwpCisvLyAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKy8vICAgUGFja2V0NGYgdG1wID0gX21tX2FkZF9wcyhhLCB2ZWM0Zl9zd2l6emxlMShhLDIsMywyLDMpKTsKKy8vICAgcmV0dXJuIHBmaXJzdDxQYWNrZXQ0Zj4oX21tX2hhZGRfcHModG1wLCB0bXApKTsKKy8vICNlbHNlCisgIFBhY2tldDRmIHRtcCA9IF9tbV9hZGRfcHMoYSwgX21tX21vdmVobF9wcyhhLGEpKTsKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQ0Zj4oX21tX2FkZF9zcyh0bXAsIF9tbV9zaHVmZmxlX3BzKHRtcCx0bXAsIDEpKSk7CisvLyAjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICAvLyBEaXNhYmxlIFNTRTMgX21tX2hhZGRfcGQgdGhhdCBpcyBleHRyZW1lbHkgc2xvdyBvbiBhbGwgZXhpc3RpbmcgSW50ZWwncyBhcmNoaXRlY3R1cmVzCisgIC8vIChmcm9tIE5laGFsZW0gdG8gSGFzd2VsbCkKKy8vICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworLy8gICByZXR1cm4gcGZpcnN0PFBhY2tldDJkPihfbW1faGFkZF9wZChhLCBhKSk7CisvLyAjZWxzZQorICByZXR1cm4gcGZpcnN0PFBhY2tldDJkPihfbW1fYWRkX3NkKGEsIF9tbV91bnBhY2toaV9wZChhLGEpKSk7CisvLyAjZW5kaWYKK30KKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU1NFMwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZWR1eHA8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpKiB2ZWNzKQoreworICByZXR1cm4gX21tX2hhZGRfZXBpMzIoX21tX2hhZGRfZXBpMzIodmVjc1swXSwgdmVjc1sxXSksX21tX2hhZGRfZXBpMzIodmVjc1syXSwgdmVjc1szXSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSB0bXAwID0gX21tX2hhZGRfZXBpMzIoYSxhKTsKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQ0aT4oX21tX2hhZGRfZXBpMzIodG1wMCx0bXAwKSk7Cit9CisjZWxzZQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSB0bXAgPSBfbW1fYWRkX2VwaTMyKGEsIF9tbV91bnBhY2toaV9lcGk2NChhLGEpKTsKKyAgcmV0dXJuIHBmaXJzdCh0bXApICsgcGZpcnN0PFBhY2tldDRpPihfbW1fc2h1ZmZsZV9lcGkzMih0bXAsIDEpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZWR1eHA8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpKiB2ZWNzKQoreworICBQYWNrZXQ0aSB0bXAwLCB0bXAxLCB0bXAyOworICB0bXAwID0gX21tX3VucGFja2xvX2VwaTMyKHZlY3NbMF0sIHZlY3NbMV0pOworICB0bXAxID0gX21tX3VucGFja2hpX2VwaTMyKHZlY3NbMF0sIHZlY3NbMV0pOworICB0bXAyID0gX21tX3VucGFja2hpX2VwaTMyKHZlY3NbMl0sIHZlY3NbM10pOworICB0bXAwID0gX21tX2FkZF9lcGkzMih0bXAwLCB0bXAxKTsKKyAgdG1wMSA9IF9tbV91bnBhY2tsb19lcGkzMih2ZWNzWzJdLCB2ZWNzWzNdKTsKKyAgdG1wMSA9IF9tbV9hZGRfZXBpMzIodG1wMSwgdG1wMik7CisgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMCwgdG1wMSk7CisgIHRtcDAgPSBfbW1fdW5wYWNraGlfZXBpNjQodG1wMCwgdG1wMSk7CisgIHJldHVybiBfbW1fYWRkX2VwaTMyKHRtcDAsIHRtcDIpOworfQorI2VuZGlmCisvLyBPdGhlciByZWR1Y3Rpb24gZnVuY3Rpb25zOgorCisvLyBtdWwKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbXVsPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgUGFja2V0NGYgdG1wID0gX21tX211bF9wcyhhLCBfbW1fbW92ZWhsX3BzKGEsYSkpOworICByZXR1cm4gcGZpcnN0PFBhY2tldDRmPihfbW1fbXVsX3NzKHRtcCwgX21tX3NodWZmbGVfcHModG1wLHRtcCwgMSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X211bDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpCit7CisgIHJldHVybiBwZmlyc3Q8UGFja2V0MmQ+KF9tbV9tdWxfc2QoYSwgX21tX3VucGFja2hpX3BkKGEsYSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X211bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIC8vIGFmdGVyIHNvbWUgZXhwZXJpbWVudHMsIGl0IGlzIHNlZW1zIHRoaXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIGltcGxlbWVudCBpdAorICAvLyBmb3IgR0NDIChlZy4sIHJldXNpbmcgcG11bCBpcyB2ZXJ5IHNsb3cgISkKKyAgLy8gVE9ETyB0cnkgdG8gY2FsbCBfbW1fbXVsX2VwdTMyIGRpcmVjdGx5CisgIEVJR0VOX0FMSUdOMTYgaW50IGF1eFs0XTsKKyAgcHN0b3JlKGF1eCwgYSk7CisgIHJldHVybiAgKGF1eFswXSAqIGF1eFsxXSkgKiAoYXV4WzJdICogYXV4WzNdKTs7Cit9CisKKy8vIG1pbgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fbWluX3BzKGEsIF9tbV9tb3ZlaGxfcHMoYSxhKSk7CisgIHJldHVybiBwZmlyc3Q8UGFja2V0NGY+KF9tbV9taW5fc3ModG1wLCBfbW1fc2h1ZmZsZV9wcyh0bXAsdG1wLCAxKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXhfbWluPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQyZD4oX21tX21pbl9zZChhLCBfbW1fdW5wYWNraGlfcGQoYSxhKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXhfbWluPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgIFBhY2tldDRpIHRtcCA9IF9tbV9taW5fZXBpMzIoYSwgX21tX3NodWZmbGVfZXBpMzIoYSwgX01NX1NIVUZGTEUoMCwwLDMsMikpKTsKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQ0aT4oX21tX21pbl9lcGkzMih0bXAsX21tX3NodWZmbGVfZXBpMzIodG1wLCAxKSkpOworI2Vsc2UKKyAgLy8gYWZ0ZXIgc29tZSBleHBlcmltZW50cywgaXQgaXMgc2VlbXMgdGhpcyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gaW1wbGVtZW50IGl0CisgIC8vIGZvciBHQ0MgKGVnLiwgaXQgZG9lcyBub3QgbGlrZSB1c2luZyBzdGQ6Om1pbiBhZnRlciB0aGUgcHN0b3JlICEhKQorICBFSUdFTl9BTElHTjE2IGludCBhdXhbNF07CisgIHBzdG9yZShhdXgsIGEpOworICBpbnQgYXV4MCA9IGF1eFswXTxhdXhbMV0gPyBhdXhbMF0gOiBhdXhbMV07CisgIGludCBhdXgyID0gYXV4WzJdPGF1eFszXSA/IGF1eFsyXSA6IGF1eFszXTsKKyAgcmV0dXJuIGF1eDA8YXV4MiA/IGF1eDAgOiBhdXgyOworI2VuZGlmIC8vIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X21heDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDRmIHRtcCA9IF9tbV9tYXhfcHMoYSwgX21tX21vdmVobF9wcyhhLGEpKTsKKyAgcmV0dXJuIHBmaXJzdDxQYWNrZXQ0Zj4oX21tX21heF9zcyh0bXAsIF9tbV9zaHVmZmxlX3BzKHRtcCx0bXAsIDEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tYXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0PFBhY2tldDJkPihfbW1fbWF4X3NkKGEsIF9tbV91bnBhY2toaV9wZChhLGEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9tYXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgUGFja2V0NGkgdG1wID0gX21tX21heF9lcGkzMihhLCBfbW1fc2h1ZmZsZV9lcGkzMihhLCBfTU1fU0hVRkZMRSgwLDAsMywyKSkpOworICByZXR1cm4gcGZpcnN0PFBhY2tldDRpPihfbW1fbWF4X2VwaTMyKHRtcCxfbW1fc2h1ZmZsZV9lcGkzMih0bXAsIDEpKSk7CisjZWxzZQorICAvLyBhZnRlciBzb21lIGV4cGVyaW1lbnRzLCBpdCBpcyBzZWVtcyB0aGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBpbXBsZW1lbnQgaXQKKyAgLy8gZm9yIEdDQyAoZWcuLCBpdCBkb2VzIG5vdCBsaWtlIHVzaW5nIHN0ZDo6bWluIGFmdGVyIHRoZSBwc3RvcmUgISEpCisgIEVJR0VOX0FMSUdOMTYgaW50IGF1eFs0XTsKKyAgcHN0b3JlKGF1eCwgYSk7CisgIGludCBhdXgwID0gYXV4WzBdPmF1eFsxXSA/IGF1eFswXSA6IGF1eFsxXTsKKyAgaW50IGF1eDIgPSBhdXhbMl0+YXV4WzNdID8gYXV4WzJdIDogYXV4WzNdOworICByZXR1cm4gYXV4MD5hdXgyID8gYXV4MCA6IGF1eDI7CisjZW5kaWYgLy8gRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorfQorCisjaWYgRUlHRU5fQ09NUF9HTlVDCisvLyB0ZW1wbGF0ZSA8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtYWRkKGNvbnN0IFBhY2tldDRmJiAgYSwgY29uc3QgUGFja2V0NGYmICBiLCBjb25zdCBQYWNrZXQ0ZiYgIGMpCisvLyB7CisvLyAgIFBhY2tldDRmIHJlcyA9IGI7CisvLyAgIGFzbSgibXVscHMgJVthXSwgJVtiXSBcblx0YWRkcHMgJVtjXSwgJVtiXSIgOiBbYl0gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbY10gIngiIChjKSk7CisvLyAgIHJldHVybiByZXM7CisvLyB9CisvLyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIF9tbV9hbGlnbnJfZXBpOChjb25zdCBQYWNrZXQ0aSYgIGEsIGNvbnN0IFBhY2tldDRpJiAgYiwgY29uc3QgaW50IGkpCisvLyB7CisvLyAgIFBhY2tldDRpIHJlcyA9IGE7CisvLyAgIGFzbSgicGFsaWduciAlW2ldLCAlW2FdLCAlW2JdICIgOiBbYl0gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbaV0gImkiIChpKSk7CisvLyAgIHJldHVybiByZXM7CisvLyB9CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU1NFMworLy8gU1NTRTMgdmVyc2lvbnMKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0ZiYgZmlyc3QsIGNvbnN0IFBhY2tldDRmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0IT0wKQorICAgICAgZmlyc3QgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9hbGlnbnJfZXBpOChfbW1fY2FzdHBzX3NpMTI4KHNlY29uZCksIF9tbV9jYXN0cHNfc2kxMjgoZmlyc3QpLCBPZmZzZXQqNCkpOworICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0aT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGkmIGZpcnN0LCBjb25zdCBQYWNrZXQ0aSYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldCE9MCkKKyAgICAgIGZpcnN0ID0gX21tX2FsaWducl9lcGk4KHNlY29uZCxmaXJzdCwgT2Zmc2V0KjQpOworICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQyZD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0MmQmIGZpcnN0LCBjb25zdCBQYWNrZXQyZCYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldD09MSkKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fYWxpZ25yX2VwaTgoX21tX2Nhc3RwZF9zaTEyOChzZWNvbmQpLCBfbW1fY2FzdHBkX3NpMTI4KGZpcnN0KSwgOCkpOworICB9Cit9OworI2Vsc2UKKy8vIFNTRTIgdmVyc2lvbnMKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0ZiYgZmlyc3QsIGNvbnN0IFBhY2tldDRmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX21vdmVfc3MoZmlyc3Qsc2Vjb25kKTsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KGZpcnN0KSwweDM5KSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MikKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9tb3ZlaGxfcHMoZmlyc3QsZmlyc3QpOworICAgICAgZmlyc3QgPSBfbW1fbW92ZWxoX3BzKGZpcnN0LHNlY29uZCk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MykKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9tb3ZlX3NzKGZpcnN0LHNlY29uZCk7CisgICAgICBmaXJzdCA9IF9tbV9zaHVmZmxlX3BzKGZpcnN0LHNlY29uZCwweDkzKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRpPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0aSYgZmlyc3QsIGNvbnN0IFBhY2tldDRpJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3Rwc19zaTEyOChfbW1fbW92ZV9zcyhfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSxfbW1fY2FzdHNpMTI4X3BzKHNlY29uZCkpKTsKKyAgICAgIGZpcnN0ID0gX21tX3NodWZmbGVfZXBpMzIoZmlyc3QsMHgzOSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MikKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX21vdmVobF9wcyhfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSxfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSkpOworICAgICAgZmlyc3QgPSBfbW1fY2FzdHBzX3NpMTI4KF9tbV9tb3ZlbGhfcHMoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MykKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX21vdmVfc3MoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpKSk7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX3NodWZmbGVfcHMoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpLDB4OTMpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDJkPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQyZCYgZmlyc3QsIGNvbnN0IFBhY2tldDJkJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3Rwc19wZChfbW1fbW92ZWhsX3BzKF9tbV9jYXN0cGRfcHMoZmlyc3QpLF9tbV9jYXN0cGRfcHMoZmlyc3QpKSk7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfcGQoX21tX21vdmVsaF9wcyhfbW1fY2FzdHBkX3BzKGZpcnN0KSxfbW1fY2FzdHBkX3BzKHNlY29uZCkpKTsKKyAgICB9CisgIH0KK307CisjZW5kaWYKKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0NGYsND4mIGtlcm5lbCkgeworICBfTU1fVFJBTlNQT1NFNF9QUyhrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdLCBrZXJuZWwucGFja2V0WzJdLCBrZXJuZWwucGFja2V0WzNdKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0MmQsMj4mIGtlcm5lbCkgeworICBfX20xMjhkIHRtcCA9IF9tbV91bnBhY2toaV9wZChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAga2VybmVsLnBhY2tldFswXSA9IF9tbV91bnBhY2tsb19wZChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IHRtcDsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0NGksND4mIGtlcm5lbCkgeworICBfX20xMjhpIFQwID0gX21tX3VucGFja2xvX2VwaTMyKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX20xMjhpIFQxID0gX21tX3VucGFja2xvX2VwaTMyKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10pOworICBfX20xMjhpIFQyID0gX21tX3VucGFja2hpX2VwaTMyKGtlcm5lbC5wYWNrZXRbMF0sIGtlcm5lbC5wYWNrZXRbMV0pOworICBfX20xMjhpIFQzID0gX21tX3VucGFja2hpX2VwaTMyKGtlcm5lbC5wYWNrZXRbMl0sIGtlcm5lbC5wYWNrZXRbM10pOworCisgIGtlcm5lbC5wYWNrZXRbMF0gPSBfbW1fdW5wYWNrbG9fZXBpNjQoVDAsIFQxKTsKKyAga2VybmVsLnBhY2tldFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NChUMCwgVDEpOworICBrZXJuZWwucGFja2V0WzJdID0gX21tX3VucGFja2xvX2VwaTY0KFQyLCBUMyk7CisgIGtlcm5lbC5wYWNrZXRbM10gPSBfbW1fdW5wYWNraGlfZXBpNjQoVDIsIFQzKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBibGVuZChjb25zdCBTZWxlY3Rvcjw0PiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDRpJiB0aGVuUGFja2V0LCBjb25zdCBQYWNrZXQ0aSYgZWxzZVBhY2tldCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNlbGVjdCA9IF9tbV9zZXRfZXBpMzIoaWZQYWNrZXQuc2VsZWN0WzNdLCBpZlBhY2tldC5zZWxlY3RbMl0sIGlmUGFja2V0LnNlbGVjdFsxXSwgaWZQYWNrZXQuc2VsZWN0WzBdKTsKKyAgX19tMTI4aSBmYWxzZV9tYXNrID0gX21tX2NtcGVxX2VwaTMyKHNlbGVjdCwgemVybyk7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICByZXR1cm4gX21tX2JsZW5kdl9lcGk4KHRoZW5QYWNrZXQsIGVsc2VQYWNrZXQsIGZhbHNlX21hc2spOworI2Vsc2UKKyAgcmV0dXJuIF9tbV9vcl9zaTEyOChfbW1fYW5kbm90X3NpMTI4KGZhbHNlX21hc2ssIHRoZW5QYWNrZXQpLCBfbW1fYW5kX3NpMTI4KGZhbHNlX21hc2ssIGVsc2VQYWNrZXQpKTsKKyNlbmRpZgorfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBibGVuZChjb25zdCBTZWxlY3Rvcjw0PiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDRmJiB0aGVuUGFja2V0LCBjb25zdCBQYWNrZXQ0ZiYgZWxzZVBhY2tldCkgeworICBjb25zdCBfX20xMjggemVybyA9IF9tbV9zZXR6ZXJvX3BzKCk7CisgIGNvbnN0IF9fbTEyOCBzZWxlY3QgPSBfbW1fc2V0X3BzKGlmUGFja2V0LnNlbGVjdFszXSwgaWZQYWNrZXQuc2VsZWN0WzJdLCBpZlBhY2tldC5zZWxlY3RbMV0sIGlmUGFja2V0LnNlbGVjdFswXSk7CisgIF9fbTEyOCBmYWxzZV9tYXNrID0gX21tX2NtcGVxX3BzKHNlbGVjdCwgemVybyk7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICByZXR1cm4gX21tX2JsZW5kdl9wcyh0aGVuUGFja2V0LCBlbHNlUGFja2V0LCBmYWxzZV9tYXNrKTsKKyNlbHNlCisgIHJldHVybiBfbW1fb3JfcHMoX21tX2FuZG5vdF9wcyhmYWxzZV9tYXNrLCB0aGVuUGFja2V0KSwgX21tX2FuZF9wcyhmYWxzZV9tYXNrLCBlbHNlUGFja2V0KSk7CisjZW5kaWYKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYmxlbmQoY29uc3QgU2VsZWN0b3I8Mj4mIGlmUGFja2V0LCBjb25zdCBQYWNrZXQyZCYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0MmQmIGVsc2VQYWNrZXQpIHsKKyAgY29uc3QgX19tMTI4ZCB6ZXJvID0gX21tX3NldHplcm9fcGQoKTsKKyAgY29uc3QgX19tMTI4ZCBzZWxlY3QgPSBfbW1fc2V0X3BkKGlmUGFja2V0LnNlbGVjdFsxXSwgaWZQYWNrZXQuc2VsZWN0WzBdKTsKKyAgX19tMTI4ZCBmYWxzZV9tYXNrID0gX21tX2NtcGVxX3BkKHNlbGVjdCwgemVybyk7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICByZXR1cm4gX21tX2JsZW5kdl9wZCh0aGVuUGFja2V0LCBlbHNlUGFja2V0LCBmYWxzZV9tYXNrKTsKKyNlbHNlCisgIHJldHVybiBfbW1fb3JfcGQoX21tX2FuZG5vdF9wZChmYWxzZV9tYXNrLCB0aGVuUGFja2V0KSwgX21tX2FuZF9wZChmYWxzZV9tYXNrLCBlbHNlUGFja2V0KSk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBpbnNlcnRmaXJzdChjb25zdCBQYWNrZXQ0ZiYgYSwgZmxvYXQgYikKK3sKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgIHJldHVybiBfbW1fYmxlbmRfcHMoYSxwc2V0MTxQYWNrZXQ0Zj4oYiksMSk7CisjZWxzZQorICByZXR1cm4gX21tX21vdmVfc3MoYSwgX21tX2xvYWRfc3MoJmIpKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGluc2VydGZpcnN0KGNvbnN0IFBhY2tldDJkJiBhLCBkb3VibGUgYikKK3sKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgIHJldHVybiBfbW1fYmxlbmRfcGQoYSxwc2V0MTxQYWNrZXQyZD4oYiksMSk7CisjZWxzZQorICByZXR1cm4gX21tX21vdmVfc2QoYSwgX21tX2xvYWRfc2QoJmIpKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGluc2VydGxhc3QoY29uc3QgUGFja2V0NGYmIGEsIGZsb2F0IGIpCit7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICByZXR1cm4gX21tX2JsZW5kX3BzKGEscHNldDE8UGFja2V0NGY+KGIpLCgxPDwzKSk7CisjZWxzZQorICBjb25zdCBQYWNrZXQ0ZiBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDAsMHgwLDB4MCwweEZGRkZGRkZGKSk7CisgIHJldHVybiBfbW1fb3JfcHMoX21tX2FuZG5vdF9wcyhtYXNrLCBhKSwgX21tX2FuZF9wcyhtYXNrLCBwc2V0MTxQYWNrZXQ0Zj4oYikpKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGluc2VydGxhc3QoY29uc3QgUGFja2V0MmQmIGEsIGRvdWJsZSBiKQoreworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgcmV0dXJuIF9tbV9ibGVuZF9wZChhLHBzZXQxPFBhY2tldDJkPihiKSwoMTw8MSkpOworI2Vsc2UKKyAgY29uc3QgUGFja2V0MmQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldHJfZXBpMzIoMHgwLDB4MCwweEZGRkZGRkZGLDB4RkZGRkZGRkYpKTsKKyAgcmV0dXJuIF9tbV9vcl9wZChfbW1fYW5kbm90X3BkKG1hc2ssIGEpLCBfbW1fYW5kX3BkKG1hc2ssIHBzZXQxPFBhY2tldDJkPihiKSkpOworI2VuZGlmCit9CisKKy8vIFNjYWxhciBwYXRoIGZvciBwbWFkZCB3aXRoIEZNQSB0byBlbnN1cmUgY29uc2lzdGVuY3kgd2l0aCB2ZWN0b3JpemVkIHBhdGguCisjaWZkZWYgX19GTUFfXwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHBtYWRkKGNvbnN0IGZsb2F0JiBhLCBjb25zdCBmbG9hdCYgYiwgY29uc3QgZmxvYXQmIGMpIHsKKyAgcmV0dXJuIDo6Zm1hZihhLGIsYyk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHBtYWRkKGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiLCBjb25zdCBkb3VibGUmIGMpIHsKKyAgcmV0dXJuIDo6Zm1hKGEsYixjKTsKK30KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRVRfTUFUSF9TU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvVHlwZUNhc3RpbmcuaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL1R5cGVDYXN0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0ODkzMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL1R5cGVDYXN0aW5nLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UWVBFX0NBU1RJTkdfU1NFX0gKKyNkZWZpbmUgRUlHRU5fVFlQRV9DQVNUSU5HX1NTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdHlwZV9jYXN0aW5nX3RyYWl0czxmbG9hdCwgaW50PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBjYXN0PFBhY2tldDRmLCBQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGYmIGEpIHsKKyAgcmV0dXJuIF9tbV9jdnR0cHNfZXBpMzIoYSk7Cit9CisKKwordGVtcGxhdGUgPD4KK3N0cnVjdCB0eXBlX2Nhc3RpbmdfdHJhaXRzPGludCwgZmxvYXQ+IHsKKyAgZW51bSB7CisgICAgVmVjdG9yaXplZENhc3QgPSAxLAorICAgIFNyY0NvZWZmUmF0aW8gPSAxLAorICAgIFRndENvZWZmUmF0aW8gPSAxCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGNhc3Q8UGFja2V0NGksIFBhY2tldDRmPihjb25zdCBQYWNrZXQ0aSYgYSkgeworICByZXR1cm4gX21tX2N2dGVwaTMyX3BzKGEpOworfQorCisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdHlwZV9jYXN0aW5nX3RyYWl0czxkb3VibGUsIGZsb2F0PiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMiwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBjYXN0PFBhY2tldDJkLCBQYWNrZXQ0Zj4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7CisgIHJldHVybiBfbW1fc2h1ZmZsZV9wcyhfbW1fY3Z0cGRfcHMoYSksIF9tbV9jdnRwZF9wcyhiKSwgKDEgPDwgMikgfCAoMSA8PCA2KSk7Cit9CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgdHlwZV9jYXN0aW5nX3RyYWl0czxmbG9hdCwgZG91YmxlPiB7CisgIGVudW0geworICAgIFZlY3Rvcml6ZWRDYXN0ID0gMSwKKyAgICBTcmNDb2VmZlJhdGlvID0gMSwKKyAgICBUZ3RDb2VmZlJhdGlvID0gMgorICB9OworfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBjYXN0PFBhY2tldDRmLCBQYWNrZXQyZD4oY29uc3QgUGFja2V0NGYmIGEpIHsKKyAgLy8gU2ltcGx5IGRpc2NhcmQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBpbnB1dAorICByZXR1cm4gX21tX2N2dHBzX3BkKGEpOworfQorCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1RZUEVfQ0FTVElOR19TU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9aVmVjdG9yL0NvbXBsZXguaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvWlZlY3Rvci9Db21wbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ZDJkMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvWlZlY3Rvci9Db21wbGV4LmgKQEAgLTAsMCArMSwzOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDE2IEtvbnN0YW50aW5vcyBNYXJnYXJpdGlzIDxtYXJrb3NAZnJlZXZlYy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVgzMl9BTFRJVkVDX0gKKyNkZWZpbmUgRUlHRU5fQ09NUExFWDMyX0FMVElWRUNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdGF0aWMgUGFja2V0MnVsICBwMnVsX0NPTkpfWE9SMSA9IChQYWNrZXQydWwpIHZlY19zbGQoKFBhY2tldDR1aSkgcDJkX1pFUk9fLCAoUGFja2V0NHVpKSBwMmxfWkVSTywgOCk7Ly97IDB4ODAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwMDAwMDAwMDAwIH07CitzdGF0aWMgUGFja2V0MnVsICBwMnVsX0NPTkpfWE9SMiA9IChQYWNrZXQydWwpIHZlY19zbGQoKFBhY2tldDR1aSkgcDJsX1pFUk8sICAoUGFja2V0NHVpKSBwMmRfWkVST18sIDgpOy8veyAweDgwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCB9OworCitzdHJ1Y3QgUGFja2V0MWNkCit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkKCkge30KKyAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBQYWNrZXQxY2QoY29uc3QgUGFja2V0MmQmIGEpIDogdihhKSB7fQorICBQYWNrZXQyZCB2OworfTsKKworc3RydWN0IFBhY2tldDJjZgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZigpIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0MmNmKGNvbnN0IFBhY2tldDRmJiBhKSA6IHYoYSkge30KKyAgdW5pb24geworICAgIFBhY2tldDRmIHY7CisgICAgUGFja2V0MWNkIGNkWzJdOworICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MmNmIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0MmNmIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMiwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc0JsZW5kICA9IDEsCisgICAgSGFzU2V0TGluZWFyID0gMAorICB9OworfTsKKworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MWNkIHR5cGU7CisgIHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMSwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQyY2Y+IHsgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICB0eXBlOyBlbnVtIHtzaXplPTIsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDJjZiBoYWxmOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDFjZD4geyB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGU7IGVudW0ge3NpemU9MSwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0MWNkIGhhbGY7IH07CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDJjZiwyPiYga2VybmVsKTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZCA8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBmcm9tKSAgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZDxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWQgPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQxY2QocGxvYWQ8UGFja2V0MmQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZHU8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBmcm9tKSAgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MmNmKHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGxvYWR1PFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDFjZChwbG9hZHU8UGFja2V0MmQ+KChjb25zdCBkb3VibGUqKWZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlIDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgICB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgcHN0b3JlKChmbG9hdCopdG8sIGZyb20udik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqICAgdG8sIGNvbnN0IFBhY2tldDFjZCYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHBzdG9yZSgoZG91YmxlKil0bywgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgICB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KChmbG9hdCopdG8sIGZyb20udik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqICAgdG8sIGNvbnN0IFBhY2tldDFjZCYgZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgcHN0b3JldSgoZG91YmxlKil0bywgZnJvbS52KTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBzZXQxPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mICBmcm9tKQoreyAvKiBoZXJlIHdlIHJlYWxseSBoYXZlIHRvIHVzZSB1bmFsaWduZWQgbG9hZHMgOiggKi8gcmV0dXJuIHBsb2FkdTxQYWNrZXQxY2Q+KCZmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzZXQxPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgIGZyb20pCit7CisgIFBhY2tldDJjZiByZXM7CisgIHJlcy5jZFswXSA9IFBhY2tldDFjZCh2ZWNfbGQyZigoY29uc3QgZmxvYXQgKikmZnJvbSkpOworICByZXMuY2RbMV0gPSByZXMuY2RbMF07CisgIHJldHVybiByZXM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQyY2YgcGdhdGhlcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBFSUdFTl9BTElHTjE2IGFmWzJdOworICBhZlswXSA9IGZyb21bMCpzdHJpZGVdOworICBhZlsxXSA9IGZyb21bMSpzdHJpZGVdOworICByZXR1cm4gcGxvYWQ8UGFja2V0MmNmPihhZik7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQxY2QgcGdhdGhlcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgUGFja2V0MWNkPihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiogZnJvbSwgSW5kZXggc3RyaWRlIEVJR0VOX1VOVVNFRCkKK3sKKyAgcmV0dXJuIHBsb2FkPFBhY2tldDFjZD4oZnJvbSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4sIFBhY2tldDJjZj4oc3RkOjpjb21wbGV4PGZsb2F0PiogdG8sIGNvbnN0IFBhY2tldDJjZiYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIHBzdG9yZTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKHN0ZDo6Y29tcGxleDxmbG9hdD4gKikgYWYsIGZyb20pOworICB0b1swKnN0cmlkZV0gPSBhZlswXTsKKyAgdG9bMSpzdHJpZGVdID0gYWZbMV07Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBQYWNrZXQxY2Q+KHN0ZDo6Y29tcGxleDxkb3VibGU+KiB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tLCBJbmRleCBzdHJpZGUgRUlHRU5fVU5VU0VEKQoreworICBwc3RvcmU8c3RkOjpjb21wbGV4PGRvdWJsZT4gPih0bywgZnJvbSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGFkZDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YocGFkZDxQYWNrZXQ0Zj4oYS52LCBiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwYWRkPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZChhLnYgKyBiLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzdWI8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBzdWI8UGFja2V0NGY+KGEudiwgYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHN1YjxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoYS52IC0gYi52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbmVnYXRlKGNvbnN0IFBhY2tldDFjZCYgYSkgeyByZXR1cm4gUGFja2V0MWNkKHBuZWdhdGUoUGFja2V0MmQoYS52KSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBuZWdhdGUoY29uc3QgUGFja2V0MmNmJiBhKSB7IHJldHVybiBQYWNrZXQyY2YocG5lZ2F0ZShQYWNrZXQ0ZihhLnYpKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGNvbmooY29uc3QgUGFja2V0MWNkJiBhKSB7IHJldHVybiBQYWNrZXQxY2QoKFBhY2tldDJkKXZlY194b3IoKFBhY2tldDJkKWEudiwgKFBhY2tldDJkKXAydWxfQ09OSl9YT1IyKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNvbmooY29uc3QgUGFja2V0MmNmJiBhKQoreworICBQYWNrZXQyY2YgcmVzOworICByZXMudi52NGZbMF0gPSBwY29uaihQYWNrZXQxY2QocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oYS52LnY0ZlswXSkpKS52OworICByZXMudi52NGZbMV0gPSBwY29uaihQYWNrZXQxY2QocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oYS52LnY0ZlsxXSkpKS52OworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWw8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgUGFja2V0MmQgYV9yZSwgYV9pbSwgdjEsIHYyOworCisgIC8vIFBlcm11dGUgYW5kIG11bHRpcGx5IHRoZSByZWFsIHBhcnRzIG9mIGEgYW5kIGIKKyAgYV9yZSA9IHZlY19wZXJtKGEudiwgYS52LCBwMTZ1Y19QU0VUNjRfSEkpOworICAvLyBHZXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiBhCisgIGFfaW0gPSB2ZWNfcGVybShhLnYsIGEudiwgcDE2dWNfUFNFVDY0X0xPKTsKKyAgLy8gbXVsdGlwbHkgYV9yZSAqIGIKKyAgdjEgPSB2ZWNfbWFkZChhX3JlLCBiLnYsIHAyZF9aRVJPKTsKKyAgLy8gbXVsdGlwbHkgYV9pbSAqIGIgYW5kIGdldCB0aGUgY29uanVnYXRlIHJlc3VsdAorICB2MiA9IHZlY19tYWRkKGFfaW0sIGIudiwgcDJkX1pFUk8pOworICB2MiA9IChQYWNrZXQyZCkgdmVjX3NsZCgoUGFja2V0NHVpKXYyLCAoUGFja2V0NHVpKXYyLCA4KTsKKyAgdjIgPSAoUGFja2V0MmQpIHZlY194b3IoKFBhY2tldDJkKXYyLCAoUGFja2V0MmQpIHAydWxfQ09OSl9YT1IxKTsKKworICByZXR1cm4gUGFja2V0MWNkKHYxICsgdjIpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIFBhY2tldDJjZiByZXM7CisgIHJlcy52LnY0ZlswXSA9IHBtdWwoUGFja2V0MWNkKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KGEudi52NGZbMF0pKSwgUGFja2V0MWNkKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KGIudi52NGZbMF0pKSkudjsKKyAgcmVzLnYudjRmWzFdID0gcG11bChQYWNrZXQxY2QocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oYS52LnY0ZlsxXSkpLCBQYWNrZXQxY2QocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oYi52LnY0ZlsxXSkpKS52OworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBhbmQgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKHZlY19hbmQoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmQgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBhbmQ8UGFja2V0NGY+KGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwb3IgICAgPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZCh2ZWNfb3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBvciAgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBvcjxQYWNrZXQ0Zj4oYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHB4b3IgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKHZlY194b3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHB4b3IgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHB4b3I8UGFja2V0NGY+KGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwYW5kbm90PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpIHsgcmV0dXJuIFBhY2tldDFjZCh2ZWNfYW5kKGEudiwgdmVjX25vcihiLnYsYi52KSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHBhbmRub3Q8UGFja2V0NGY+KGEudixiLnYpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkZHVwPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qICAgICBmcm9tKSB7ICByZXR1cm4gcHNldDE8UGFja2V0MWNkPigqZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWRkdXA8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiAgICAgIGZyb20pIHsgIHJldHVybiBwc2V0MTxQYWNrZXQyY2Y+KCpmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgICBhZGRyKSB7IEVJR0VOX1pWRUNUT1JfUFJFRkVUQ0goYWRkcik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gKiAgIGFkZHIpIHsgRUlHRU5fWlZFQ1RPUl9QUkVGRVRDSChhZGRyKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gIHBmaXJzdDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSkKK3sKKyAgc3RkOjpjb21wbGV4PGRvdWJsZT4gRUlHRU5fQUxJR04xNiByZXM7CisgIHBzdG9yZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCZyZXMsIGEpOworCisgIHJldHVybiByZXM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiAgcGZpcnN0PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IEVJR0VOX0FMSUdOMTYgcmVzWzJdOworICBwc3RvcmU8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHJlcywgYSk7CisKKyAgcmV0dXJuIHJlc1swXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIGE7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJldmVyc2UoY29uc3QgUGFja2V0MmNmJiBhKQoreworICBQYWNrZXQyY2YgcmVzOworICByZXMuY2RbMF0gPSBhLmNkWzFdOworICByZXMuY2RbMV0gPSBhLmNkWzBdOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gcHJlZHV4PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKQoreworICByZXR1cm4gcGZpcnN0KGEpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gcHJlZHV4PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJlczsKKyAgUGFja2V0MWNkIGIgPSBwYWRkPFBhY2tldDFjZD4oYS5jZFswXSwgYS5jZFsxXSk7CisgIHZlY19zdDJmKGIudiwgKGZsb2F0KikmcmVzKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwcmVkdXhwPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkKiB2ZWNzKQoreworICByZXR1cm4gdmVjc1swXTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJlZHV4cDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiogdmVjcykKK3sKKyAgUGFja2V0QmxvY2s8UGFja2V0MmNmLDI+IHRyYW5zcG9zZTsKKyAgdHJhbnNwb3NlLnBhY2tldFswXSA9IHZlY3NbMF07CisgIHRyYW5zcG9zZS5wYWNrZXRbMV0gPSB2ZWNzWzFdOworICBwdHJhbnNwb3NlKHRyYW5zcG9zZSk7CisKKyAgcmV0dXJuIHBhZGQ8UGFja2V0MmNmPih0cmFuc3Bvc2UucGFja2V0WzBdLCB0cmFuc3Bvc2UucGFja2V0WzFdKTsKK30gCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBwcmVkdXhfbXVsPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKQoreworICByZXR1cm4gcGZpcnN0KGEpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gcHJlZHV4X211bDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiByZXM7CisgIFBhY2tldDFjZCBiID0gcG11bDxQYWNrZXQxY2Q+KGEuY2RbMF0sIGEuY2RbMV0pOworICB2ZWNfc3QyZihiLnYsIChmbG9hdCopJnJlcyk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDFjZD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0MWNkJiAvKmZpcnN0Ki8sIGNvbnN0IFBhY2tldDFjZCYgLypzZWNvbmQqLykKKyAgeworICAgIC8vIEZJWE1FIGlzIGl0IHN1cmUgd2UgbmV2ZXIgaGF2ZSB0byBhbGlnbiBhIFBhY2tldDFjZD8KKyAgICAvLyBFdmVuIHRob3VnaCBhIHN0ZDo6Y29tcGxleDxkb3VibGU+IGhhcyAxNiBieXRlcywgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IGFsaWduZWQgb24gYSAxNiBieXRlcyBib3VuZGFyeS4uLgorICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQyY2Y+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDJjZiYgZmlyc3QsIGNvbnN0IFBhY2tldDJjZiYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldCA9PSAxKSB7CisgICAgICBmaXJzdC5jZFswXSA9IGZpcnN0LmNkWzFdOworICAgICAgZmlyc3QuY2RbMV0gPSBzZWNvbmQuY2RbMF07CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDFjZCwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDFjZCwgUGFja2V0MWNkLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCBmYWxzZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgcGNvbmooYikpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgdHJ1ZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKHBjb25qKGEpLCBiKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIHRydWUsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIHBjb25qKGludGVybmFsOjpwbXVsKGEsIGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwZGl2PFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhLCBjb25zdCBQYWNrZXQxY2QmIGIpCit7CisgIC8vIFRPRE8gb3B0aW1pemUgaXQgZm9yIEFsdGlWZWMKKyAgUGFja2V0MWNkIHJlcyA9IGNvbmpfaGVscGVyPFBhY2tldDFjZCxQYWNrZXQxY2QsZmFsc2UsdHJ1ZT4oKS5wbXVsKGEsYik7CisgIFBhY2tldDJkIHMgPSB2ZWNfbWFkZChiLnYsIGIudiwgcDJkX1pFUk9fKTsKKyAgcmV0dXJuIFBhY2tldDFjZChwZGl2KHJlcy52LCBzICsgdmVjX3Blcm0ocywgcywgcDE2dWNfUkVWRVJTRTY0KSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBkaXY8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgLy8gVE9ETyBvcHRpbWl6ZSBpdCBmb3IgQWx0aVZlYworICBQYWNrZXQyY2YgcmVzOworICByZXMuY2RbMF0gPSBwZGl2PFBhY2tldDFjZD4oYS5jZFswXSwgYi5jZFswXSk7CisgIHJlcy5jZFsxXSA9IHBkaXY8UGFja2V0MWNkPihhLmNkWzFdLCBiLmNkWzFdKTsKKyAgcmV0dXJuIHJlczsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGNwbHhmbGlwLyo8UGFja2V0MWNkPiovKGNvbnN0IFBhY2tldDFjZCYgeCkKK3sKKyAgcmV0dXJuIFBhY2tldDFjZChwcmV2ZXJzZShQYWNrZXQyZCh4LnYpKSk7Cit9CisKK0VJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBjcGx4ZmxpcC8qPFBhY2tldDJjZj4qLyhjb25zdCBQYWNrZXQyY2YmIHgpCit7CisgIFBhY2tldDJjZiByZXM7CisgIHJlcy5jZFswXSA9IHBjcGx4ZmxpcCh4LmNkWzBdKTsKKyAgcmVzLmNkWzFdID0gcGNwbHhmbGlwKHguY2RbMV0pOworICByZXR1cm4gcmVzOworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQxY2QsMj4mIGtlcm5lbCkKK3sKKyAgUGFja2V0MmQgdG1wID0gdmVjX3Blcm0oa2VybmVsLnBhY2tldFswXS52LCBrZXJuZWwucGFja2V0WzFdLnYsIHAxNnVjX1RSQU5TUE9TRTY0X0hJKTsKKyAga2VybmVsLnBhY2tldFsxXS52ID0gdmVjX3Blcm0oa2VybmVsLnBhY2tldFswXS52LCBrZXJuZWwucGFja2V0WzFdLnYsIHAxNnVjX1RSQU5TUE9TRTY0X0xPKTsKKyAga2VybmVsLnBhY2tldFswXS52ID0gdG1wOworfQorCitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQyY2YsMj4mIGtlcm5lbCkKK3sKKyAgUGFja2V0MWNkIHRtcCA9IGtlcm5lbC5wYWNrZXRbMF0uY2RbMV07CisgIGtlcm5lbC5wYWNrZXRbMF0uY2RbMV0gPSBrZXJuZWwucGFja2V0WzFdLmNkWzBdOworICBrZXJuZWwucGFja2V0WzFdLmNkWzBdID0gdG1wOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBibGVuZChjb25zdCBTZWxlY3RvcjwyPiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDJjZiYgdGhlblBhY2tldCwgY29uc3QgUGFja2V0MmNmJiBlbHNlUGFja2V0KSB7CisgIFBhY2tldDJjZiByZXN1bHQ7CisgIGNvbnN0IFNlbGVjdG9yPDQ+IGlmUGFja2V0NCA9IHsgaWZQYWNrZXQuc2VsZWN0WzBdLCBpZlBhY2tldC5zZWxlY3RbMF0sIGlmUGFja2V0LnNlbGVjdFsxXSwgaWZQYWNrZXQuc2VsZWN0WzFdIH07CisgIHJlc3VsdC52ID0gcGJsZW5kPFBhY2tldDRmPihpZlBhY2tldDQsIHRoZW5QYWNrZXQudiwgZWxzZVBhY2tldC52KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWDMyX0FMVElWRUNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9aVmVjdG9yL01hdGhGdW5jdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvWlZlY3Rvci9NYXRoRnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3YWE3MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvWlZlY3Rvci9NYXRoRnVuY3Rpb25zLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3IEp1bGllbiBQb21taWVyCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgS29uc3RhbnRpbm9zIE1hcmdhcml0aXMgPG1hcmtvc0BmcmVldmVjLm9yZz4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIFRoZSBzaW4sIGNvcywgZXhwLCBhbmQgbG9nIGZ1bmN0aW9ucyBvZiB0aGlzIGZpbGUgY29tZSBmcm9tCisgKiBKdWxpZW4gUG9tbWllcidzIHNzZSBtYXRoIGxpYnJhcnk6IGh0dHA6Ly9ncnVudHRoZXBlb24uZnJlZS5mci9zc2VtYXRoLworICovCisKKyNpZm5kZWYgRUlHRU5fTUFUSF9GVU5DVElPTlNfQUxUSVZFQ19ICisjZGVmaW5lIEVJR0VOX01BVEhfRlVOQ1RJT05TX0FMVElWRUNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoMSAsIDEuMCk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoMiAsIDIuMCk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoaGFsZiwgMC41KTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGV4cF9oaSwgIDcwOS40MzcpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGV4cF9sbywgLTcwOS40MzYxMzkzMDMpOworCitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX0xPRzJFRiwgMS40NDI2OTUwNDA4ODg5NjM0MDczNTk5KTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcDAsIDEuMjYxNzcxOTMwNzQ4MTA1OTA4NzhlLTQpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcDEsIDMuMDI5OTQ0MDc3MDc0NDE5NjEzMDBlLTIpOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfcDIsIDkuOTk5OTk5OTk5OTk5OTk5OTk5MTBlLTEpOworCitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9xMCwgMy4wMDE5ODUwNTEzODY2NDQ1NTA0MmUtNik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9xMSwgMi41MjQ0ODM0MDM0OTY4NDEwNDE5MmUtMyk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9xMiwgMi4yNzI2NTU0ODIwODE1NTAyODc2NmUtMSk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0MmQoY2VwaGVzX2V4cF9xMywgMi4wMDAwMDAwMDAwMDAwMDAwMDAwOWUwKTsKKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJkKGNlcGhlc19leHBfQzEsIDAuNjkzMTQ1NzUxOTUzMTI1KTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChjZXBoZXNfZXhwX0MyLCAxLjQyODYwNjgyMDMwOTQxNzIzMjEyZS02KTsKKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQyZCBwZXhwPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgX3gpCit7CisgIFBhY2tldDJkIHggPSBfeDsKKworICBQYWNrZXQyZCB0bXAsIGZ4OworICBQYWNrZXQybCBlbW0wOworCisgIC8vIGNsYW1wIHgKKyAgeCA9IHBtYXgocG1pbih4LCBwMmRfZXhwX2hpKSwgcDJkX2V4cF9sbyk7CisgIC8qIGV4cHJlc3MgZXhwKHgpIGFzIGV4cChnICsgbipsb2coMikpICovCisgIGZ4ID0gcG1hZGQocDJkX2NlcGhlc19MT0cyRUYsIHgsIHAyZF9oYWxmKTsKKworICBmeCA9IHZlY19mbG9vcihmeCk7CisKKyAgdG1wID0gcG11bChmeCwgcDJkX2NlcGhlc19leHBfQzEpOworICBQYWNrZXQyZCB6ID0gcG11bChmeCwgcDJkX2NlcGhlc19leHBfQzIpOworICB4ID0gcHN1Yih4LCB0bXApOworICB4ID0gcHN1Yih4LCB6KTsKKworICBQYWNrZXQyZCB4MiA9IHBtdWwoeCx4KTsKKworICBQYWNrZXQyZCBweCA9IHAyZF9jZXBoZXNfZXhwX3AwOworICBweCA9IHBtYWRkKHB4LCB4MiwgcDJkX2NlcGhlc19leHBfcDEpOworICBweCA9IHBtYWRkKHB4LCB4MiwgcDJkX2NlcGhlc19leHBfcDIpOworICBweCA9IHBtdWwgKHB4LCB4KTsKKworICBQYWNrZXQyZCBxeCA9IHAyZF9jZXBoZXNfZXhwX3EwOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTEpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTIpOworICBxeCA9IHBtYWRkKHF4LCB4MiwgcDJkX2NlcGhlc19leHBfcTMpOworCisgIHggPSBwZGl2KHB4LHBzdWIocXgscHgpKTsKKyAgeCA9IHBtYWRkKHAyZF8yLHgscDJkXzEpOworCisgIC8vIGJ1aWxkIDJebgorICBlbW0wID0gdmVjX2N0c2woZngsIDApOworCisgIHN0YXRpYyBjb25zdCBQYWNrZXQybCBwMmxfMTAyMyA9IHsgMTAyMywgMTAyMyB9OworICBzdGF0aWMgY29uc3QgUGFja2V0MnVsIHAydWxfNTIgPSB7IDUyLCA1MiB9OworCisgIGVtbTAgPSBlbW0wICsgcDJsXzEwMjM7CisgIGVtbTAgPSBlbW0wIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0Mmw+KHAydWxfNTIpOworCisgIC8vIEFsdGl2ZWMncyBtYXggJiBtaW4gb3BlcmF0b3JzIGp1c3QgZHJvcCBzaWxlbnQgTmFOcy4gQ2hlY2sgTmFOcyBpbiAKKyAgLy8gaW5wdXRzIGFuZCByZXR1cm4gdGhlbSB1bm1vZGlmaWVkLgorICBQYWNrZXQydWwgaXNudW1iZXJfbWFzayA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MnVsPih2ZWNfY21wZXEoX3gsIF94KSk7CisgIHJldHVybiB2ZWNfc2VsKF94LCBwbWF4KHBtdWwoeCwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4oZW1tMCkpLCBfeCksCisgICAgICAgICAgICAgICAgIGlzbnVtYmVyX21hc2spOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHBleHA8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiB4KQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSBwZXhwPFBhY2tldDJkPih4LnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwZXhwPFBhY2tldDJkPih4LnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0MmQgcHNxcnQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiB4KQoreworICByZXR1cm4gIF9fYnVpbHRpbl9zMzkwX3Zmc3FkYih4KTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIHgpCit7CisgIFBhY2tldDRmIHJlczsKKyAgcmVzLnY0ZlswXSA9IHBzcXJ0PFBhY2tldDJkPih4LnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwc3FydDxQYWNrZXQyZD4oeC52NGZbMV0pOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDJkIHByc3FydDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIHgpIHsKKyAgLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgdGhlIG11Y2ggZmFzdGVyIG1tX3Jxc3J0X3BkIHNpbmNlIGl0IG9ubHkgcHJvdmlkZXMgYW4gYXBwcm94aW1hdGlvbi4KKyAgcmV0dXJuIHBzZXQxPFBhY2tldDJkPigxLjApIC8gcHNxcnQ8UGFja2V0MmQ+KHgpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBFSUdFTl9VTlVTRUQKK1BhY2tldDRmIHByc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIHgpIHsKKyAgUGFja2V0NGYgcmVzOworICByZXMudjRmWzBdID0gcHJzcXJ0PFBhY2tldDJkPih4LnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwcnNxcnQ8UGFja2V0MmQ+KHgudjRmWzFdKTsKKyAgcmV0dXJuIHJlczsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fTUFUSF9GVU5DVElPTlNfQUxUSVZFQ19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL1pWZWN0b3IvUGFja2V0TWF0aC5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9aVmVjdG9yL1BhY2tldE1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41N2IwMWZjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9aVmVjdG9yL1BhY2tldE1hdGguaApAQCAtMCwwICsxLDk0NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgS29uc3RhbnRpbm9zIE1hcmdhcml0aXMgPG1hcmtvc0BmcmVldmVjLm9yZz4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFDS0VUX01BVEhfWlZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFVF9NQVRIX1pWRUNUT1JfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZm5kZWYgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRAorI2RlZmluZSBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xEIDQKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorI2RlZmluZSBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fQ0pNQURECisjZGVmaW5lIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fQ0pNQURECisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUworI2RlZmluZSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUyAgMTYKKyNlbmRpZgorCit0eXBlZGVmIF9fdmVjdG9yIGludCAgICAgICAgICAgICAgICAgUGFja2V0NGk7Cit0eXBlZGVmIF9fdmVjdG9yIHVuc2lnbmVkIGludCAgICAgICAgUGFja2V0NHVpOwordHlwZWRlZiBfX3ZlY3RvciBfX2Jvb2wgaW50ICAgICAgICAgIFBhY2tldDRiaTsKK3R5cGVkZWYgX192ZWN0b3Igc2hvcnQgaW50ICAgICAgICAgICBQYWNrZXQ4aTsKK3R5cGVkZWYgX192ZWN0b3IgdW5zaWduZWQgY2hhciAgICAgICBQYWNrZXQxNnVjOwordHlwZWRlZiBfX3ZlY3RvciBkb3VibGUgICAgICAgICAgICAgIFBhY2tldDJkOwordHlwZWRlZiBfX3ZlY3RvciB1bnNpZ25lZCBsb25nIGxvbmcgIFBhY2tldDJ1bDsKK3R5cGVkZWYgX192ZWN0b3IgbG9uZyBsb25nICAgICAgICAgICBQYWNrZXQybDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBhY2tldDJkICB2NGZbMl07Cit9IFBhY2tldDRmOworCit0eXBlZGVmIHVuaW9uIHsKKyAgaW50MzJfdCAgIGlbNF07CisgIHVpbnQzMl90IHVpWzRdOworICBpbnQ2NF90ICAgbFsyXTsKKyAgdWludDY0X3QgdWxbMl07CisgIGRvdWJsZSAgICBkWzJdOworICBQYWNrZXQ0aSAgdjRpOworICBQYWNrZXQ0dWkgdjR1aTsKKyAgUGFja2V0MmwgIHYybDsKKyAgUGFja2V0MnVsIHYydWw7CisgIFBhY2tldDJkICB2MmQ7Cit9IFBhY2tldDsKKworLy8gV2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgc2FtZSBjb2RlIGFsbCB0aGUgdGltZSwgYnV0IHdlIG5lZWQgdG8gcmV1c2UgdGhlIGNvbnN0YW50cworLy8gYW5kIGl0IGRvZXNuJ3QgcmVhbGx5IHdvcmsgdG8gZGVjbGFyZSB0aGVtIGdsb2JhbCwgc28gd2UgZGVmaW5lIG1hY3JvcyBpbnN0ZWFkCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShOQU1FLFgpIFwKKyAgUGFja2V0NGkgcDRpXyMjTkFNRSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KHZlY19zcGxhdF9zMzIoWCkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQyZChOQU1FLFgpIFwKKyAgUGFja2V0MmQgcDJkXyMjTkFNRSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zcGxhdF9zNjQoWCkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQybChOQU1FLFgpIFwKKyAgUGFja2V0MmwgcDJsXyMjTkFNRSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0Mmw+KHZlY19zcGxhdF9zNjQoWCkpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoTkFNRSxYKSBcCisgIFBhY2tldDRpIHA0aV8jI05BTUUgPSBwc2V0MTxQYWNrZXQ0aT4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQyZChOQU1FLFgpIFwKKyAgUGFja2V0MmQgcDJkXyMjTkFNRSA9IHBzZXQxPFBhY2tldDJkPihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDJsKE5BTUUsWCkgXAorICBQYWNrZXQybCBwMmxfIyNOQU1FID0gcHNldDE8UGFja2V0Mmw+KFgpCisKKy8vIFRoZXNlIGNvbnN0YW50cyBhcmUgZW5kaWFuLWFnbm9zdGljCisvL3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDRpKFpFUk8sIDApOyAvL3sgMCwgMCwgMCwgMCx9CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShPTkUsIDEpOyAvL3sgMSwgMSwgMSwgMX0KKworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX0ZBU1RfUGFja2V0MmQoWkVSTywgMCk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQybChaRVJPLCAwKTsKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDJsKE9ORSwgMSk7CisKK3N0YXRpYyBQYWNrZXQyZCBwMmRfT05FID0geyAxLjAsIDEuMCB9OyAKK3N0YXRpYyBQYWNrZXQyZCBwMmRfWkVST18gPSB7IC0wLjAsIC0wLjAgfTsKKworc3RhdGljIFBhY2tldDRpIHA0aV9DT1VOVERPV04gPSB7IDAsIDEsIDIsIDMgfTsKK3N0YXRpYyBQYWNrZXQ0ZiBwNGZfQ09VTlRET1dOID0geyAwLjAsIDEuMCwgMi4wLCAzLjAgfTsKK3N0YXRpYyBQYWNrZXQyZCBwMmRfQ09VTlRET1dOID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDE2dWM+KHAyZF9aRVJPKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQxNnVjPihwMmRfT05FKSwgOCkpOworCitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19QU0VUNjRfSEkgPSB7IDAsMSwyLDMsIDQsNSw2LDcsIDAsMSwyLDMsIDQsNSw2LDcgfTsKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0RVUExJQ0FURTMyX0hJID0geyAwLDEsMiwzLCAwLDEsMiwzLCA0LDUsNiw3LCA0LDUsNiw3IH07CisKKy8vIE1hc2sgYWxpZ25tZW50CisjZGVmaW5lIF9FSUdFTl9NQVNLX0FMSUdOTUVOVAkweGZmZmZmZmZmZmZmZmZmZjAKKworI2RlZmluZSBfRUlHRU5fQUxJR05FRF9QVFIoeCkJKChzdGQ6OnB0cmRpZmZfdCkoeCkgJiBfRUlHRU5fTUFTS19BTElHTk1FTlQpCisKKy8vIEhhbmRsZSBlbmRpYW5uZXNzIHByb3Blcmx5IHdoaWxlIGxvYWRpbmcgY29uc3RhbnRzCisvLyBEZWZpbmUgZ2xvYmFsIHN0YXRpYyBjb25zdGFudHM6CisKK3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0ZPUldBUkQgPSAgIHsgMCwxLDIsMywgNCw1LDYsNywgOCw5LDEwLDExLCAxMiwxMywxNCwxNSB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUkVWRVJTRTMyID0geyAxMiwxMywxNCwxNSwgOCw5LDEwLDExLCA0LDUsNiw3LCAwLDEsMiwzIH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19SRVZFUlNFNjQgPSB7IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDAsMSwyLDMsIDQsNSw2LDcgfTsKKworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDMyX1dPREQgICA9IHZlY19zbGQoKFBhY2tldDE2dWMpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDApLCAoUGFja2V0MTZ1YykgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMiksIDgpOy8veyAwLDEsMiwzLCAwLDEsMiwzLCA4LDksMTAsMTEsIDgsOSwxMCwxMSB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDMyX1dFVkVOICA9IHZlY19zbGQocDE2dWNfRFVQTElDQVRFMzJfSEksIChQYWNrZXQxNnVjKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAzKSwgOCk7Ly97IDQsNSw2LDcsIDQsNSw2LDcsIDEyLDEzLDE0LDE1LCAxMiwxMywxNCwxNSB9OworLypzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19IQUxGNjRfMF8xNiA9IHZlY19zbGQoKFBhY2tldDE2dWMpcDRpX1pFUk8sIHZlY19zcGxhdCgoUGFja2V0MTZ1YykgdmVjX2FicyhwNGlfTUlOVVMxNiksIDMpLCA4KTsgICAgICAvL3sgMCwwLDAsMCwgMCwwLDAsMCwgMTYsMTYsMTYsMTYsIDE2LDE2LDE2LDE2fTsKKworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDY0X0hJID0gKFBhY2tldDE2dWMpIHZlY19tZXJnZWgoKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV09ERCwgKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV0VWRU4pOyAgICAgLy97IDAsMSwyLDMsIDQsNSw2LDcsIDAsMSwyLDMsIDQsNSw2LDcgfTsqLworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVDY0X0xPID0gKFBhY2tldDE2dWMpIHZlY19tZXJnZWwoKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV09ERCwgKFBhY2tldDR1aSlwMTZ1Y19QU0VUMzJfV0VWRU4pOyAgICAgLy97IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUgfTsKKy8qc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfVFJBTlNQT1NFNjRfSEkgPSB2ZWNfYWRkKHAxNnVjX1BTRVQ2NF9ISSwgcDE2dWNfSEFMRjY0XzBfMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97IDAsMSwyLDMsIDQsNSw2LDcsIDE2LDE3LDE4LDE5LCAyMCwyMSwyMiwyM307CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19UUkFOU1BPU0U2NF9MTyA9IHZlY19hZGQocDE2dWNfUFNFVDY0X0xPLCBwMTZ1Y19IQUxGNjRfMF8xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sgOCw5LDEwLDExLCAxMiwxMywxNCwxNSwgMjQsMjUsMjYsMjcsIDI4LDI5LDMwLDMxfTsqLworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfVFJBTlNQT1NFNjRfSEkgPSB7IDAsMSwyLDMsIDQsNSw2LDcsIDE2LDE3LDE4LDE5LCAyMCwyMSwyMiwyM307CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19UUkFOU1BPU0U2NF9MTyA9IHsgOCw5LDEwLDExLCAxMiwxMywxNCwxNSwgMjQsMjUsMjYsMjcsIDI4LDI5LDMwLDMxfTsKKworLy9zdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19DT01QTEVYMzJfUkVWID0gdmVjX3NsZChwMTZ1Y19SRVZFUlNFMzIsIHAxNnVjX1JFVkVSU0UzMiwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sgNCw1LDYsNywgMCwxLDIsMywgMTIsMTMsMTQsMTUsIDgsOSwxMCwxMSB9OworCisvL3N0YXRpYyBQYWNrZXQxNnVjIHAxNnVjX0NPTVBMRVgzMl9SRVYyID0gdmVjX3NsZChwMTZ1Y19GT1JXQVJELCBwMTZ1Y19GT1JXQVJELCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8veyA4LDksMTAsMTEsIDEyLDEzLDE0LDE1LCAwLDEsMiwzLCA0LDUsNiw3IH07CisKKworI2lmIEVJR0VOX0hBU19CVUlMVElOKF9fYnVpbHRpbl9wcmVmZXRjaCkgfHwgRUlHRU5fQ09NUF9HTlVDCisgICNkZWZpbmUgRUlHRU5fWlZFQ1RPUl9QUkVGRVRDSChBRERSKSBfX2J1aWx0aW5fcHJlZmV0Y2goQUREUik7CisjZWxzZQorICAjZGVmaW5lIEVJR0VOX1pWRUNUT1JfUFJFRkVUQ0goQUREUikgYXNtKCAiICAgcGZkIFslW2FkZHJdXVxuIiA6OiBbYWRkcl0gInIiIChBRERSKSA6ICJjYyIgKTsKKyNlbmRpZgorCit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPGludD4gICAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ0aSB0eXBlOworICB0eXBlZGVmIFBhY2tldDRpIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gNCwKKyAgICBIYXNIYWxmUGFja2V0ID0gMCwKKworICAgIEhhc0FkZCAgPSAxLAorICAgIEhhc1N1YiAgPSAxLAorICAgIEhhc011bCAgPSAxLAorICAgIEhhc0RpdiAgPSAxLAorICAgIEhhc0JsZW5kID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ0ZiB0eXBlOworICB0eXBlZGVmIFBhY2tldDRmIGhhbGY7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQsCisgICAgSGFzSGFsZlBhY2tldCA9IDAsCisKKyAgICBIYXNBZGQgID0gMSwKKyAgICBIYXNTdWIgID0gMSwKKyAgICBIYXNNdWwgID0gMSwKKyAgICBIYXNEaXYgID0gMSwKKyAgICBIYXNNaW4gID0gMSwKKyAgICBIYXNNYXggID0gMSwKKyAgICBIYXNBYnMgID0gMSwKKyAgICBIYXNTaW4gID0gMCwKKyAgICBIYXNDb3MgID0gMCwKKyAgICBIYXNMb2cgID0gMCwKKyAgICBIYXNFeHAgID0gMSwKKyAgICBIYXNTcXJ0ID0gMSwKKyAgICBIYXNSc3FydCA9IDEsCisgICAgSGFzUm91bmQgPSAxLAorICAgIEhhc0Zsb29yID0gMSwKKyAgICBIYXNDZWlsID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0JsZW5kID0gMQorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxkb3VibGU+IDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MmQgdHlwZTsKKyAgdHlwZWRlZiBQYWNrZXQyZCBoYWxmOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT0yLAorICAgIEhhc0hhbGZQYWNrZXQgPSAxLAorCisgICAgSGFzQWRkICA9IDEsCisgICAgSGFzU3ViICA9IDEsCisgICAgSGFzTXVsICA9IDEsCisgICAgSGFzRGl2ICA9IDEsCisgICAgSGFzTWluICA9IDEsCisgICAgSGFzTWF4ICA9IDEsCisgICAgSGFzQWJzICA9IDEsCisgICAgSGFzU2luICA9IDAsCisgICAgSGFzQ29zICA9IDAsCisgICAgSGFzTG9nICA9IDAsCisgICAgSGFzRXhwICA9IDEsCisgICAgSGFzU3FydCA9IDEsCisgICAgSGFzUnNxcnQgPSAxLAorICAgIEhhc1JvdW5kID0gMSwKKyAgICBIYXNGbG9vciA9IDEsCisgICAgSGFzQ2VpbCA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNCbGVuZCA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0aT4geyB0eXBlZGVmIGludCAgICB0eXBlOyBlbnVtIHtzaXplPTQsIGFsaWdubWVudD1BbGlnbmVkMTZ9OyB0eXBlZGVmIFBhY2tldDRpIGhhbGY7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGY+IHsgdHlwZWRlZiBmbG9hdCAgdHlwZTsgZW51bSB7c2l6ZT00LCBhbGlnbm1lbnQ9QWxpZ25lZDE2fTsgdHlwZWRlZiBQYWNrZXQ0ZiBoYWxmOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDJkPiB7IHR5cGVkZWYgZG91YmxlIHR5cGU7IGVudW0ge3NpemU9MiwgYWxpZ25tZW50PUFsaWduZWQxNn07IHR5cGVkZWYgUGFja2V0MmQgaGFsZjsgfTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ0Ziw0PiYga2VybmVsKTsKKyAKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXQ0aSAmIHYpCit7CisgIFBhY2tldCB2dDsKKyAgdnQudjRpID0gdjsKKyAgcyA8PCB2dC5pWzBdIDw8ICIsICIgPDwgdnQuaVsxXSA8PCAiLCAiIDw8IHZ0LmlbMl0gPDwgIiwgIiA8PCB2dC5pWzNdOworICByZXR1cm4gczsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFBhY2tldDR1aSAmIHYpCit7CisgIFBhY2tldCB2dDsKKyAgdnQudjR1aSA9IHY7CisgIHMgPDwgdnQudWlbMF0gPDwgIiwgIiA8PCB2dC51aVsxXSA8PCAiLCAiIDw8IHZ0LnVpWzJdIDw8ICIsICIgPDwgdnQudWlbM107CisgIHJldHVybiBzOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgUGFja2V0MmwgJiB2KQoreworICBQYWNrZXQgdnQ7CisgIHZ0LnYybCA9IHY7CisgIHMgPDwgdnQubFswXSA8PCAiLCAiIDw8IHZ0LmxbMV07CisgIHJldHVybiBzOworfQorCitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgUGFja2V0MnVsICYgdikKK3sKKyAgUGFja2V0IHZ0OworICB2dC52MnVsID0gdjsKKyAgcyA8PCB2dC51bFswXSA8PCAiLCAiIDw8IHZ0LnVsWzFdIDsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXQyZCAmIHYpCit7CisgIFBhY2tldCB2dDsKKyAgdnQudjJkID0gdjsKKyAgcyA8PCB2dC5kWzBdIDw8ICIsICIgPDwgdnQuZFsxXTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBzaW11bGF0ZSBhIHZlY19zcGxhdF9wYWNrZXQ0ZgorICovCit0ZW1wbGF0ZTxpbnQgZWxlbWVudD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiB2ZWNfc3BsYXRfcGFja2V0NGYoY29uc3QgUGFja2V0NGYmICAgZnJvbSkKK3sKKyAgUGFja2V0NGYgc3BsYXQ7CisgIHN3aXRjaCAoZWxlbWVudCkgeworICBjYXNlIDA6CisgICAgc3BsYXQudjRmWzBdID0gdmVjX3NwbGF0KGZyb20udjRmWzBdLCAwKTsKKyAgICBzcGxhdC52NGZbMV0gPSBzcGxhdC52NGZbMF07CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICBzcGxhdC52NGZbMF0gPSB2ZWNfc3BsYXQoZnJvbS52NGZbMF0sIDEpOworICAgIHNwbGF0LnY0ZlsxXSA9IHNwbGF0LnY0ZlswXTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHNwbGF0LnY0ZlswXSA9IHZlY19zcGxhdChmcm9tLnY0ZlsxXSwgMCk7CisgICAgc3BsYXQudjRmWzFdID0gc3BsYXQudjRmWzBdOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgc3BsYXQudjRmWzBdID0gdmVjX3NwbGF0KGZyb20udjRmWzFdLCAxKTsKKyAgICBzcGxhdC52NGZbMV0gPSBzcGxhdC52NGZbMF07CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHNwbGF0OworfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0aT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGkmIGZpcnN0LCBjb25zdCBQYWNrZXQ0aSYgc2Vjb25kKQorICB7CisgICAgc3dpdGNoIChPZmZzZXQgJSA0KSB7CisgICAgY2FzZSAxOgorICAgICAgZmlyc3QgPSB2ZWNfc2xkKGZpcnN0LCBzZWNvbmQsIDQpOyBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmaXJzdCA9IHZlY19zbGQoZmlyc3QsIHNlY29uZCwgOCk7IGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChmaXJzdCwgc2Vjb25kLCAxMik7IGJyZWFrOworICAgIH0KKyAgfQorfTsKKworLyogVGhpcyBpcyBhIHRyaWNreSBvbmUsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIGZsb2F0IGFsaWdubWVudCB0byB2ZWN0b3IgZWxlbWVudHMgb2Ygc2l6ZW9mIGRvdWJsZQorICovCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0Zj4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGYmIGZpcnN0LCBjb25zdCBQYWNrZXQ0ZiYgc2Vjb25kKQorICB7CisgICAgc3dpdGNoIChPZmZzZXQgJSA0KSB7CisgICAgY2FzZSAxOgorICAgICAgZmlyc3QudjRmWzBdID0gdmVjX3NsZChmaXJzdC52NGZbMF0sIGZpcnN0LnY0ZlsxXSwgOCk7CisgICAgICBmaXJzdC52NGZbMV0gPSB2ZWNfc2xkKGZpcnN0LnY0ZlsxXSwgc2Vjb25kLnY0ZlswXSwgOCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmaXJzdC52NGZbMF0gPSBmaXJzdC52NGZbMV07CisgICAgICBmaXJzdC52NGZbMV0gPSBzZWNvbmQudjRmWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZmlyc3QudjRmWzBdID0gdmVjX3NsZChmaXJzdC52NGZbMV0sICBzZWNvbmQudjRmWzBdLCA4KTsKKyAgICAgIGZpcnN0LnY0ZlsxXSA9IHZlY19zbGQoc2Vjb25kLnY0ZlswXSwgc2Vjb25kLnY0ZlsxXSwgOCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK307CisKKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MmQ+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDJkJiBmaXJzdCwgY29uc3QgUGFja2V0MmQmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQgPT0gMSkKKyAgICAgIGZpcnN0ID0gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDRpPihmaXJzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KHNlY29uZCksIDgpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkPFBhY2tldDRpPihjb25zdCBpbnQqICAgICBmcm9tKQoreworICAvLyBGSVhNRTogTm8gaW50cmluc2ljIHlldAorICBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyAgUGFja2V0ICp2ZnJvbTsKKyAgdmZyb20gPSAoUGFja2V0ICopIGZyb207CisgIHJldHVybiB2ZnJvbS0+djRpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWQ8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgIGZyb20pCit7CisgIC8vIEZJWE1FOiBObyBpbnRyaW5zaWMgeWV0CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRAorICBQYWNrZXQ0ZiB2ZnJvbTsKKyAgdmZyb20udjRmWzBdID0gdmVjX2xkMmYoJmZyb21bMF0pOworICB2ZnJvbS52NGZbMV0gPSB2ZWNfbGQyZigmZnJvbVsyXSk7CisgIHJldHVybiB2ZnJvbTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBsb2FkPFBhY2tldDJkPihjb25zdCBkb3VibGUqIGZyb20pCit7CisgIC8vIEZJWE1FOiBObyBpbnRyaW5zaWMgeWV0CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRAorICBQYWNrZXQgKnZmcm9tOworICB2ZnJvbSA9IChQYWNrZXQgKikgZnJvbTsKKyAgcmV0dXJuIHZmcm9tLT52MmQ7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxpbnQ+KGludCogICAgICAgdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tKQoreworICAvLyBGSVhNRTogTm8gaW50cmluc2ljIHlldAorICBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisgIFBhY2tldCAqdnRvOworICB2dG8gPSAoUGFja2V0ICopIHRvOworICB2dG8tPnY0aSA9IGZyb207Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxmbG9hdD4oZmxvYXQqICAgdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tKQoreworICAvLyBGSVhNRTogTm8gaW50cmluc2ljIHlldAorICBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisgIHZlY19zdDJmKGZyb20udjRmWzBdLCAmdG9bMF0pOworICB2ZWNfc3QyZihmcm9tLnY0ZlsxXSwgJnRvWzJdKTsKK30KKworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8ZG91YmxlPihkb3VibGUqICAgdG8sIGNvbnN0IFBhY2tldDJkJiBmcm9tKQoreworICAvLyBGSVhNRTogTm8gaW50cmluc2ljIHlldAorICBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisgIFBhY2tldCAqdnRvOworICB2dG8gPSAoUGFja2V0ICopIHRvOworICB2dG8tPnYyZCA9IGZyb207Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc2V0MTxQYWNrZXQ0aT4oY29uc3QgaW50JiAgICBmcm9tKQoreworICByZXR1cm4gdmVjX3NwbGF0cyhmcm9tKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc2V0MTxQYWNrZXQyZD4oY29uc3QgZG91YmxlJiBmcm9tKSB7CisgIHJldHVybiB2ZWNfc3BsYXRzKGZyb20pOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzZXQxPFBhY2tldDRmPihjb25zdCBmbG9hdCYgICAgZnJvbSkKK3sKKyAgUGFja2V0NGYgdG87CisgIHRvLnY0ZlswXSA9IHBzZXQxPFBhY2tldDJkPihzdGF0aWNfY2FzdDxjb25zdCBkb3VibGUmPihmcm9tKSk7CisgIHRvLnY0ZlsxXSA9IHRvLnY0ZlswXTsKKyAgcmV0dXJuIHRvOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcGJyb2FkY2FzdDQ8UGFja2V0NGk+KGNvbnN0IGludCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQ0aSYgYTAsIFBhY2tldDRpJiBhMSwgUGFja2V0NGkmIGEyLCBQYWNrZXQ0aSYgYTMpCit7CisgIGEzID0gcGxvYWQ8UGFja2V0NGk+KGEpOworICBhMCA9IHZlY19zcGxhdChhMywgMCk7CisgIGExID0gdmVjX3NwbGF0KGEzLCAxKTsKKyAgYTIgPSB2ZWNfc3BsYXQoYTMsIDIpOworICBhMyA9IHZlY19zcGxhdChhMywgMyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitwYnJvYWRjYXN0NDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgUGFja2V0NGYmIGEwLCBQYWNrZXQ0ZiYgYTEsIFBhY2tldDRmJiBhMiwgUGFja2V0NGYmIGEzKQoreworICBhMyA9IHBsb2FkPFBhY2tldDRmPihhKTsKKyAgYTAgPSB2ZWNfc3BsYXRfcGFja2V0NGY8MD4oYTMpOworICBhMSA9IHZlY19zcGxhdF9wYWNrZXQ0ZjwxPihhMyk7CisgIGEyID0gdmVjX3NwbGF0X3BhY2tldDRmPDI+KGEzKTsKKyAgYTMgPSB2ZWNfc3BsYXRfcGFja2V0NGY8Mz4oYTMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZAorcGJyb2FkY2FzdDQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrZXQyZCYgYTAsIFBhY2tldDJkJiBhMSwgUGFja2V0MmQmIGEyLCBQYWNrZXQyZCYgYTMpCit7CisgIGExID0gcGxvYWQ8UGFja2V0MmQ+KGEpOworICBhMCA9IHZlY19zcGxhdChhMSwgMCk7CisgIGExID0gdmVjX3NwbGF0KGExLCAxKTsKKyAgYTMgPSBwbG9hZDxQYWNrZXQyZD4oYSsyKTsKKyAgYTIgPSB2ZWNfc3BsYXQoYTMsIDApOworICBhMyA9IHZlY19zcGxhdChhMywgMSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldDRpIHBnYXRoZXI8aW50LCBQYWNrZXQ0aT4oY29uc3QgaW50KiBmcm9tLCBJbmRleCBzdHJpZGUpCit7CisgIGludCBFSUdFTl9BTElHTjE2IGFpWzRdOworICBhaVswXSA9IGZyb21bMCpzdHJpZGVdOworICBhaVsxXSA9IGZyb21bMSpzdHJpZGVdOworICBhaVsyXSA9IGZyb21bMipzdHJpZGVdOworICBhaVszXSA9IGZyb21bMypzdHJpZGVdOworIHJldHVybiBwbG9hZDxQYWNrZXQ0aT4oYWkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQ0ZiBwZ2F0aGVyPGZsb2F0LCBQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgZmxvYXQgRUlHRU5fQUxJR04xNiBhaVs0XTsKKyAgYWlbMF0gPSBmcm9tWzAqc3RyaWRlXTsKKyAgYWlbMV0gPSBmcm9tWzEqc3RyaWRlXTsKKyAgYWlbMl0gPSBmcm9tWzIqc3RyaWRlXTsKKyAgYWlbM10gPSBmcm9tWzMqc3RyaWRlXTsKKyByZXR1cm4gcGxvYWQ8UGFja2V0NGY+KGFpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0MmQgcGdhdGhlcjxkb3VibGUsIFBhY2tldDJkPihjb25zdCBkb3VibGUqIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgZG91YmxlIEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIGFmWzBdID0gZnJvbVswKnN0cmlkZV07CisgIGFmWzFdID0gZnJvbVsxKnN0cmlkZV07CisgcmV0dXJuIHBsb2FkPFBhY2tldDJkPihhZik7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8aW50LCBQYWNrZXQ0aT4oaW50KiB0bywgY29uc3QgUGFja2V0NGkmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgaW50IEVJR0VOX0FMSUdOMTYgYWlbNF07CisgIHBzdG9yZTxpbnQ+KChpbnQgKilhaSwgZnJvbSk7CisgIHRvWzAqc3RyaWRlXSA9IGFpWzBdOworICB0b1sxKnN0cmlkZV0gPSBhaVsxXTsKKyAgdG9bMipzdHJpZGVdID0gYWlbMl07CisgIHRvWzMqc3RyaWRlXSA9IGFpWzNdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHBzY2F0dGVyPGZsb2F0LCBQYWNrZXQ0Zj4oZmxvYXQqIHRvLCBjb25zdCBQYWNrZXQ0ZiYgZnJvbSwgSW5kZXggc3RyaWRlKQoreworICBmbG9hdCBFSUdFTl9BTElHTjE2IGFpWzRdOworICBwc3RvcmU8ZmxvYXQ+KChmbG9hdCAqKWFpLCBmcm9tKTsKKyAgdG9bMCpzdHJpZGVdID0gYWlbMF07CisgIHRvWzEqc3RyaWRlXSA9IGFpWzFdOworICB0b1syKnN0cmlkZV0gPSBhaVsyXTsKKyAgdG9bMypzdHJpZGVdID0gYWlbM107Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgcHNjYXR0ZXI8ZG91YmxlLCBQYWNrZXQyZD4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20sIEluZGV4IHN0cmlkZSkKK3sKKyAgZG91YmxlIEVJR0VOX0FMSUdOMTYgYWZbMl07CisgIHBzdG9yZTxkb3VibGU+KGFmLCBmcm9tKTsKKyAgdG9bMCpzdHJpZGVdID0gYWZbMF07CisgIHRvWzEqc3RyaWRlXSA9IGFmWzFdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFkZDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiAoYSArIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFkZDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICBQYWNrZXQ0ZiBjOworICBjLnY0ZlswXSA9IGEudjRmWzBdICsgYi52NGZbMF07CisgIGMudjRmWzFdID0gYS52NGZbMV0gKyBiLnY0ZlsxXTsKKyAgcmV0dXJuIGM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFkZDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiAoYSArIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc3ViPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIChhIC0gYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwc3ViPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIFBhY2tldDRmIGM7CisgIGMudjRmWzBdID0gYS52NGZbMF0gLSBiLnY0ZlswXTsKKyAgYy52NGZbMV0gPSBhLnY0ZlsxXSAtIGIudjRmWzFdOworICByZXR1cm4gYzsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc3ViPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIChhIC0gYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtdWw8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gKGEgKiBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgUGFja2V0NGYgYzsKKyAgYy52NGZbMF0gPSBhLnY0ZlswXSAqIGIudjRmWzBdOworICBjLnY0ZlsxXSA9IGEudjRmWzFdICogYi52NGZbMV07CisgIHJldHVybiBjOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBtdWw8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gKGEgKiBiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGRpdjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiAoYSAvIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGRpdjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICBQYWNrZXQ0ZiBjOworICBjLnY0ZlswXSA9IGEudjRmWzBdIC8gYi52NGZbMF07CisgIGMudjRmWzFdID0gYS52NGZbMV0gLyBiLnY0ZlsxXTsKKyAgcmV0dXJuIGM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGRpdjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiAoYSAvIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbmVnYXRlKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiAoLWEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG5lZ2F0ZShjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgUGFja2V0NGYgYzsKKyAgYy52NGZbMF0gPSAtYS52NGZbMF07CisgIGMudjRmWzFdID0gLWEudjRmWzFdOworICByZXR1cm4gYzsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbmVnYXRlKGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiAoLWEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwY29uaihjb25zdCBQYWNrZXQ0aSYgYSkgeyByZXR1cm4gYTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBjb25qKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBhOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGNvbmooY29uc3QgUGFja2V0MmQmIGEpIHsgcmV0dXJuIGE7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYWRkKGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYiwgY29uc3QgUGFja2V0NGkmIGMpIHsgcmV0dXJuIHBhZGQ8UGFja2V0NGk+KHBtdWw8UGFja2V0NGk+KGEsIGIpLCBjKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtYWRkKGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYiwgY29uc3QgUGFja2V0NGYmIGMpCit7CisgIFBhY2tldDRmIHJlczsKKyAgcmVzLnY0ZlswXSA9IHZlY19tYWRkKGEudjRmWzBdLCBiLnY0ZlswXSwgYy52NGZbMF0pOworICByZXMudjRmWzFdID0gdmVjX21hZGQoYS52NGZbMV0sIGIudjRmWzFdLCBjLnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG1hZGQoY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiLCBjb25zdCBQYWNrZXQyZCYgYykgeyByZXR1cm4gdmVjX21hZGQoYSwgYiwgYyk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsc2V0PFBhY2tldDRpPihjb25zdCBpbnQmIGEpICAgIHsgcmV0dXJuIHBhZGQ8UGFja2V0NGk+KHBzZXQxPFBhY2tldDRpPihhKSwgcDRpX0NPVU5URE9XTik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbHNldDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQmIGEpICB7IHJldHVybiBwYWRkPFBhY2tldDRmPihwc2V0MTxQYWNrZXQ0Zj4oYSksIHA0Zl9DT1VOVERPV04pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxzZXQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSYgYSkgeyByZXR1cm4gcGFkZDxQYWNrZXQyZD4ocHNldDE8UGFja2V0MmQ+KGEpLCBwMmRfQ09VTlRET1dOKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcG1pbjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1pbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSBwbWluKGEudjRmWzBdLCBiLnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwbWluKGEudjRmWzFdLCBiLnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWF4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWF4PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIFBhY2tldDRmIHJlczsKKyAgcmVzLnY0ZlswXSA9IHBtYXgoYS52NGZbMF0sIGIudjRmWzBdKTsKKyAgcmVzLnY0ZlsxXSA9IHBtYXgoYS52NGZbMV0sIGIudjRmWzFdKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX2FuZChhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhbmQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gdmVjX2FuZChhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhbmQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgUGFja2V0NGYgcmVzOworICByZXMudjRmWzBdID0gcGFuZChhLnY0ZlswXSwgYi52NGZbMF0pOworICByZXMudjRmWzFdID0gcGFuZChhLnY0ZlsxXSwgYi52NGZbMV0pOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG9yPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY19vcihhLCBiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfb3IoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwb3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgUGFja2V0NGYgcmVzOworICByZXMudjRmWzBdID0gcGFuZChhLnY0ZlswXSwgYi52NGZbMF0pOworICByZXMudjRmWzFdID0gcGFuZChhLnY0ZlsxXSwgYi52NGZbMV0pOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHhvcjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfeG9yKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHhvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfeG9yKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHhvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSBwYW5kKGEudjRmWzBdLCBiLnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwYW5kKGEudjRmWzFdLCBiLnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYW5kbm90PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHBhbmQ8UGFja2V0NGk+KGEsIHZlY19ub3IoYiwgYikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFuZG5vdDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiB2ZWNfYW5kKGEsIHZlY19ub3IoYiwgYikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFuZG5vdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSBwYW5kbm90KGEudjRmWzBdLCBiLnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSBwYW5kbm90KGEudjRmWzFdLCBiLnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcm91bmQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSB2ZWNfcm91bmQoYS52NGZbMF0pOworICByZXMudjRmWzFdID0gdmVjX3JvdW5kKGEudjRmWzFdKTsKKyAgcmV0dXJuIHJlczsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcm91bmQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiB2ZWNfcm91bmQoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwY2VpbDxQYWNrZXQ0Zj4oY29uc3QgIFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSB2ZWNfY2VpbChhLnY0ZlswXSk7CisgIHJlcy52NGZbMV0gPSB2ZWNfY2VpbChhLnY0ZlsxXSk7CisgIHJldHVybiByZXM7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGNlaWw8UGFja2V0MmQ+KGNvbnN0ICBQYWNrZXQyZCYgYSkgeyByZXR1cm4gdmVjX2NlaWwoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwZmxvb3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSB2ZWNfZmxvb3IoYS52NGZbMF0pOworICByZXMudjRmWzFdID0gdmVjX2Zsb29yKGEudjRmWzFdKTsKKyAgcmV0dXJuIHJlczsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwZmxvb3I8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiB2ZWNfZmxvb3IoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgICBmcm9tKSB7IHJldHVybiBwbG9hZDxQYWNrZXQ0aT4oZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZHU8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgICAgZnJvbSkgeyByZXR1cm4gcGxvYWQ8UGFja2V0NGY+KGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWR1PFBhY2tldDJkPihjb25zdCBkb3VibGUqICAgIGZyb20pIHsgcmV0dXJuIHBsb2FkPFBhY2tldDJkPihmcm9tKTsgfQorCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZGR1cDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgZnJvbSkKK3sKKyAgUGFja2V0NGkgcCA9IHBsb2FkPFBhY2tldDRpPihmcm9tKTsKKyAgcmV0dXJuIHZlY19wZXJtKHAsIHAsIHAxNnVjX0RVUExJQ0FURTMyX0hJKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkZHVwPFBhY2tldDRmPihjb25zdCBmbG9hdCogICAgZnJvbSkKK3sKKyAgUGFja2V0NGYgcCA9IHBsb2FkPFBhY2tldDRmPihmcm9tKTsKKyAgcC52NGZbMV0gPSB2ZWNfc3BsYXQocC52NGZbMF0sIDEpOworICBwLnY0ZlswXSA9IHZlY19zcGxhdChwLnY0ZlswXSwgMCk7CisgIHJldHVybiBwOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWRkdXA8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogICBmcm9tKQoreworICBQYWNrZXQyZCBwID0gcGxvYWQ8UGFja2V0MmQ+KGZyb20pOworICByZXR1cm4gdmVjX3Blcm0ocCwgcCwgcDE2dWNfUFNFVDY0X0hJKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxpbnQ+KGludCogICAgICAgIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSkgeyBwc3RvcmU8aW50Pih0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZmxvYXQ+KGZsb2F0KiAgICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgcHN0b3JlPGZsb2F0Pih0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZG91YmxlPihkb3VibGUqICB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsgcHN0b3JlPGRvdWJsZT4odG8sIGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPGludD4oY29uc3QgaW50KiAgICAgICBhZGRyKSB7IEVJR0VOX1pWRUNUT1JfUFJFRkVUQ0goYWRkcik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPGZsb2F0Pihjb25zdCBmbG9hdCogICBhZGRyKSB7IEVJR0VOX1pWRUNUT1JfUFJFRkVUQ0goYWRkcik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPGRvdWJsZT4oY29uc3QgZG91YmxlKiBhZGRyKSB7IEVJR0VOX1pWRUNUT1JfUFJFRkVUQ0goYWRkcik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCAgICBFSUdFTl9BTElHTjE2IHhbNF07IHBzdG9yZSh4LCBhKTsgcmV0dXJuIHhbMF07IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkgeyBmbG9hdCAgRUlHRU5fQUxJR04xNiB4WzJdOyB2ZWNfc3QyZihhLnY0ZlswXSwgJnhbMF0pOyByZXR1cm4geFswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IGRvdWJsZSBFSUdFTl9BTElHTjE2IHhbMl07IHBzdG9yZSh4LCBhKTsgcmV0dXJuIHhbMF07IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZXZlcnNlKGNvbnN0IFBhY2tldDRpJiBhKQoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4odmVjX3Blcm0ocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQxNnVjPihhKSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQxNnVjPihhKSwgcDE2dWNfUkVWRVJTRTMyKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcmV2ZXJzZShjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19wZXJtKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MTZ1Yz4oYSksIHAxNnVjX1JFVkVSU0U2NCkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJldmVyc2UoY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDRmIHJldjsKKyAgcmV2LnY0ZlswXSA9IHByZXZlcnNlPFBhY2tldDJkPihhLnY0ZlsxXSk7CisgIHJldi52NGZbMV0gPSBwcmV2ZXJzZTxQYWNrZXQyZD4oYS52NGZbMF0pOworICByZXR1cm4gcmV2OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFiczxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpIHsgcmV0dXJuIHZlY19hYnMoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYWJzPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkgeyByZXR1cm4gdmVjX2FicyhhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhYnM8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiByZXM7CisgIHJlcy52NGZbMF0gPSBwYWJzKGEudjRmWzBdKTsKKyAgcmVzLnY0ZlsxXSA9IHBhYnMoYS52NGZbMV0pOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIFBhY2tldDRpIGIsIHN1bTsKKyAgYiAgID0gdmVjX3NsZChhLCBhLCA4KTsKKyAgc3VtID0gcGFkZDxQYWNrZXQ0aT4oYSwgYik7CisgIGIgICA9IHZlY19zbGQoc3VtLCBzdW0sIDQpOworICBzdW0gPSBwYWRkPFBhY2tldDRpPihzdW0sIGIpOworICByZXR1cm4gcGZpcnN0KHN1bSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgUGFja2V0MmQgYiwgc3VtOworICBiICAgPSByZWludGVycHJldF9jYXN0PFBhY2tldDJkPih2ZWNfc2xkKHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGEpLCByZWludGVycHJldF9jYXN0PFBhY2tldDRpPihhKSwgOCkpOworICBzdW0gPSBwYWRkPFBhY2tldDJkPihhLCBiKTsKKyAgcmV0dXJuIHBmaXJzdChzdW0pOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDJkIHN1bTsKKyAgc3VtID0gcGFkZDxQYWNrZXQyZD4oYS52NGZbMF0sIGEudjRmWzFdKTsKKyAgZG91YmxlIGZpcnN0ID0gcHJlZHV4PFBhY2tldDJkPihzdW0pOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZpcnN0KTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZWR1eHA8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpKiB2ZWNzKQoreworICBQYWNrZXQ0aSB2WzRdLCBzdW1bNF07CisKKyAgLy8gSXQncyBlYXNpZXIgYW5kIGZhc3RlciB0byB0cmFuc3Bvc2UgdGhlbiBhZGQgYXMgY29sdW1ucworICAvLyBDaGVjazogaHR0cDovL3d3dy5mcmVldmVjLm9yZy9mdW5jdGlvbi9tYXRyaXhfNHg0X3RyYW5zcG9zZV9mbG9hdHMgZm9yIGV4cGxhbmF0aW9uCisgIC8vIERvIHRoZSB0cmFuc3Bvc2UsIGZpcnN0IHNldCBvZiBtb3ZlcworICB2WzBdID0gdmVjX21lcmdlaCh2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdlsxXSA9IHZlY19tZXJnZWwodmVjc1swXSwgdmVjc1syXSk7CisgIHZbMl0gPSB2ZWNfbWVyZ2VoKHZlY3NbMV0sIHZlY3NbM10pOworICB2WzNdID0gdmVjX21lcmdlbCh2ZWNzWzFdLCB2ZWNzWzNdKTsKKyAgLy8gR2V0IHRoZSByZXN1bHRpbmcgdmVjdG9ycworICBzdW1bMF0gPSB2ZWNfbWVyZ2VoKHZbMF0sIHZbMl0pOworICBzdW1bMV0gPSB2ZWNfbWVyZ2VsKHZbMF0sIHZbMl0pOworICBzdW1bMl0gPSB2ZWNfbWVyZ2VoKHZbMV0sIHZbM10pOworICBzdW1bM10gPSB2ZWNfbWVyZ2VsKHZbMV0sIHZbM10pOworCisgIC8vIE5vdyBkbyB0aGUgc3VtbWF0aW9uOgorICAvLyBMaW5lcyAwKzEKKyAgc3VtWzBdID0gcGFkZDxQYWNrZXQ0aT4oc3VtWzBdLCBzdW1bMV0pOworICAvLyBMaW5lcyAyKzMKKyAgc3VtWzFdID0gcGFkZDxQYWNrZXQ0aT4oc3VtWzJdLCBzdW1bM10pOworICAvLyBBZGQgdGhlIHJlc3VsdHMKKyAgc3VtWzBdID0gcGFkZDxQYWNrZXQ0aT4oc3VtWzBdLCBzdW1bMV0pOworCisgIHJldHVybiBzdW1bMF07Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcmVkdXhwPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCogdmVjcykKK3sKKyAgUGFja2V0MmQgdlsyXSwgc3VtOworICB2WzBdID0gcGFkZDxQYWNrZXQyZD4odmVjc1swXSwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQyZD4odmVjX3NsZChyZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4odmVjc1swXSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NHVpPih2ZWNzWzBdKSwgOCkpKTsKKyAgdlsxXSA9IHBhZGQ8UGFja2V0MmQ+KHZlY3NbMV0sIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHZlY3NbMV0pLCByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4odmVjc1sxXSksIDgpKSk7CisgCisgIHN1bSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0dWk+KHZbMF0pLCByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4odlsxXSksIDgpKTsKKworICByZXR1cm4gc3VtOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJlZHV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYqIHZlY3MpCit7CisgIFBhY2tldEJsb2NrPFBhY2tldDRmLDQ+IHRyYW5zcG9zZTsKKyAgdHJhbnNwb3NlLnBhY2tldFswXSA9IHZlY3NbMF07CisgIHRyYW5zcG9zZS5wYWNrZXRbMV0gPSB2ZWNzWzFdOworICB0cmFuc3Bvc2UucGFja2V0WzJdID0gdmVjc1syXTsKKyAgdHJhbnNwb3NlLnBhY2tldFszXSA9IHZlY3NbM107CisgIHB0cmFuc3Bvc2UodHJhbnNwb3NlKTsKKworICBQYWNrZXQ0ZiBzdW0gPSBwYWRkKHRyYW5zcG9zZS5wYWNrZXRbMF0sIHRyYW5zcG9zZS5wYWNrZXRbMV0pOworICBzdW0gPSBwYWRkKHN1bSwgdHJhbnNwb3NlLnBhY2tldFsyXSk7CisgIHN1bSA9IHBhZGQoc3VtLCB0cmFuc3Bvc2UucGFja2V0WzNdKTsKKyAgcmV0dXJuIHN1bTsKK30KKworLy8gT3RoZXIgcmVkdWN0aW9uIGZ1bmN0aW9uczoKKy8vIG11bAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXhfbXVsPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgRUlHRU5fQUxJR04xNiBpbnQgYXV4WzRdOworICBwc3RvcmUoYXV4LCBhKTsKKyAgcmV0dXJuIGF1eFswXSAqIGF1eFsxXSAqIGF1eFsyXSAqIGF1eFszXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXhfbXVsPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdChwbXVsKGEsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGEpLCA4KSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICAvLyBSZXR1cm4gcHJlZHV4X211bDxQYWNrZXQyZD4gb2YgdGhlIHN1YnZlY3RvcnMgcHJvZHVjdAorICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBmaXJzdChwcmVkdXhfbXVsKHBtdWwoYS52NGZbMF0sIGEudjRmWzFdKSkpKTsKK30KKworLy8gbWluCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9taW48UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSBiLCByZXM7CisgIGIgICA9IHBtaW48UGFja2V0NGk+KGEsIHZlY19zbGQoYSwgYSwgOCkpOworICByZXMgPSBwbWluPFBhY2tldDRpPihiLCB2ZWNfc2xkKGIsIGIsIDQpKTsKKyAgcmV0dXJuIHBmaXJzdChyZXMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9taW48UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0KHBtaW48UGFja2V0MmQ+KGEsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGEpLCA4KSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQyZCBiLCByZXM7CisgIGIgICA9IHBtaW48UGFja2V0MmQ+KGEudjRmWzBdLCBhLnY0ZlsxXSk7CisgIHJlcyA9IHBtaW48UGFja2V0MmQ+KGIsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oYiksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGIpLCA4KSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBmaXJzdChyZXMpKTsKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9tYXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSBiLCByZXM7CisgIGIgPSBwbWF4PFBhY2tldDRpPihhLCB2ZWNfc2xkKGEsIGEsIDgpKTsKKyAgcmVzID0gcG1heDxQYWNrZXQ0aT4oYiwgdmVjX3NsZChiLCBiLCA0KSk7CisgIHJldHVybiBwZmlyc3QocmVzKTsKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tYXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0KHBtYXg8UGFja2V0MmQ+KGEsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oYSksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGEpLCA4KSkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tYXg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQyZCBiLCByZXM7CisgIGIgICA9IHBtYXg8UGFja2V0MmQ+KGEudjRmWzBdLCBhLnY0ZlsxXSk7CisgIHJlcyA9IHBtYXg8UGFja2V0MmQ+KGIsIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MmQ+KHZlY19zbGQocmVpbnRlcnByZXRfY2FzdDxQYWNrZXQ0aT4oYiksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0NGk+KGIpLCA4KSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBmaXJzdChyZXMpKTsKK30KKworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQKK3B0cmFuc3Bvc2UoUGFja2V0QmxvY2s8UGFja2V0NGksND4mIGtlcm5lbCkgeworICBQYWNrZXQ0aSB0MCA9IHZlY19tZXJnZWgoa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsyXSk7CisgIFBhY2tldDRpIHQxID0gdmVjX21lcmdlbChrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzJdKTsKKyAgUGFja2V0NGkgdDIgPSB2ZWNfbWVyZ2VoKGtlcm5lbC5wYWNrZXRbMV0sIGtlcm5lbC5wYWNrZXRbM10pOworICBQYWNrZXQ0aSB0MyA9IHZlY19tZXJnZWwoa2VybmVsLnBhY2tldFsxXSwga2VybmVsLnBhY2tldFszXSk7CisgIGtlcm5lbC5wYWNrZXRbMF0gPSB2ZWNfbWVyZ2VoKHQwLCB0Mik7CisgIGtlcm5lbC5wYWNrZXRbMV0gPSB2ZWNfbWVyZ2VsKHQwLCB0Mik7CisgIGtlcm5lbC5wYWNrZXRbMl0gPSB2ZWNfbWVyZ2VoKHQxLCB0Myk7CisgIGtlcm5lbC5wYWNrZXRbM10gPSB2ZWNfbWVyZ2VsKHQxLCB0Myk7Cit9CisKK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkCitwdHJhbnNwb3NlKFBhY2tldEJsb2NrPFBhY2tldDJkLDI+JiBrZXJuZWwpIHsKKyAgUGFja2V0MmQgdDAgPSB2ZWNfcGVybShrZXJuZWwucGFja2V0WzBdLCBrZXJuZWwucGFja2V0WzFdLCBwMTZ1Y19UUkFOU1BPU0U2NF9ISSk7CisgIFBhY2tldDJkIHQxID0gdmVjX3Blcm0oa2VybmVsLnBhY2tldFswXSwga2VybmVsLnBhY2tldFsxXSwgcDE2dWNfVFJBTlNQT1NFNjRfTE8pOworICBrZXJuZWwucGFja2V0WzBdID0gdDA7CisgIGtlcm5lbC5wYWNrZXRbMV0gPSB0MTsKK30KKworLyogU3BsaXQgdGhlIFBhY2tldDRmIFBhY2tldEJsb2NrIGludG8gNCBQYWNrZXQyZCBQYWNrZXRCbG9ja3MgYW5kIHRyYW5zcG9zZSBlYWNoIG9uZQorICovCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZAorcHRyYW5zcG9zZShQYWNrZXRCbG9jazxQYWNrZXQ0Ziw0PiYga2VybmVsKSB7CisgIFBhY2tldEJsb2NrPFBhY2tldDJkLDI+IHQwLHQxLHQyLHQzOworICAvLyBjb3B5IHRvcC1sZWZ0IDJ4MiBQYWNrZXQyZCBibG9jaworICB0MC5wYWNrZXRbMF0gPSBrZXJuZWwucGFja2V0WzBdLnY0ZlswXTsKKyAgdDAucGFja2V0WzFdID0ga2VybmVsLnBhY2tldFsxXS52NGZbMF07CisKKyAgLy8gY29weSB0b3AtcmlnaHQgMngyIFBhY2tldDJkIGJsb2NrCisgIHQxLnBhY2tldFswXSA9IGtlcm5lbC5wYWNrZXRbMF0udjRmWzFdOworICB0MS5wYWNrZXRbMV0gPSBrZXJuZWwucGFja2V0WzFdLnY0ZlsxXTsKKworICAvLyBjb3B5IGJvdHRvbS1sZWZ0IDJ4MiBQYWNrZXQyZCBibG9jaworICB0Mi5wYWNrZXRbMF0gPSBrZXJuZWwucGFja2V0WzJdLnY0ZlswXTsKKyAgdDIucGFja2V0WzFdID0ga2VybmVsLnBhY2tldFszXS52NGZbMF07CisKKyAgLy8gY29weSBib3R0b20tcmlnaHQgMngyIFBhY2tldDJkIGJsb2NrCisgIHQzLnBhY2tldFswXSA9IGtlcm5lbC5wYWNrZXRbMl0udjRmWzFdOworICB0My5wYWNrZXRbMV0gPSBrZXJuZWwucGFja2V0WzNdLnY0ZlsxXTsKKworICAvLyBUcmFuc3Bvc2UgYWxsIDJ4MiBibG9ja3MKKyAgcHRyYW5zcG9zZSh0MCk7CisgIHB0cmFuc3Bvc2UodDEpOworICBwdHJhbnNwb3NlKHQyKTsKKyAgcHRyYW5zcG9zZSh0Myk7CisKKyAgLy8gQ29weSBiYWNrIHRyYW5zcG9zZWQgYmxvY2tzLCBidXQgZXhjaGFuZ2UgdDEgYW5kIHQyIGR1ZSB0byB0cmFuc3Bvc2l0aW9uCisgIGtlcm5lbC5wYWNrZXRbMF0udjRmWzBdID0gdDAucGFja2V0WzBdOworICBrZXJuZWwucGFja2V0WzBdLnY0ZlsxXSA9IHQyLnBhY2tldFswXTsKKyAga2VybmVsLnBhY2tldFsxXS52NGZbMF0gPSB0MC5wYWNrZXRbMV07CisgIGtlcm5lbC5wYWNrZXRbMV0udjRmWzFdID0gdDIucGFja2V0WzFdOworICBrZXJuZWwucGFja2V0WzJdLnY0ZlswXSA9IHQxLnBhY2tldFswXTsKKyAga2VybmVsLnBhY2tldFsyXS52NGZbMV0gPSB0My5wYWNrZXRbMF07CisgIGtlcm5lbC5wYWNrZXRbM10udjRmWzBdID0gdDEucGFja2V0WzFdOworICBrZXJuZWwucGFja2V0WzNdLnY0ZlsxXSA9IHQzLnBhY2tldFsxXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBibGVuZChjb25zdCBTZWxlY3Rvcjw0PiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDRpJiB0aGVuUGFja2V0LCBjb25zdCBQYWNrZXQ0aSYgZWxzZVBhY2tldCkgeworICBQYWNrZXQ0dWkgc2VsZWN0ID0geyBpZlBhY2tldC5zZWxlY3RbMF0sIGlmUGFja2V0LnNlbGVjdFsxXSwgaWZQYWNrZXQuc2VsZWN0WzJdLCBpZlBhY2tldC5zZWxlY3RbM10gfTsKKyAgUGFja2V0NHVpIG1hc2sgPSB2ZWNfY21wZXEoc2VsZWN0LCByZWludGVycHJldF9jYXN0PFBhY2tldDR1aT4ocDRpX09ORSkpOworICByZXR1cm4gdmVjX3NlbChlbHNlUGFja2V0LCB0aGVuUGFja2V0LCBtYXNrKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBibGVuZChjb25zdCBTZWxlY3Rvcjw0PiYgaWZQYWNrZXQsIGNvbnN0IFBhY2tldDRmJiB0aGVuUGFja2V0LCBjb25zdCBQYWNrZXQ0ZiYgZWxzZVBhY2tldCkgeworICBQYWNrZXQydWwgc2VsZWN0X2hpID0geyBpZlBhY2tldC5zZWxlY3RbMF0sIGlmUGFja2V0LnNlbGVjdFsxXSB9OworICBQYWNrZXQydWwgc2VsZWN0X2xvID0geyBpZlBhY2tldC5zZWxlY3RbMl0sIGlmUGFja2V0LnNlbGVjdFszXSB9OworICBQYWNrZXQydWwgbWFza19oaSA9IHZlY19jbXBlcShzZWxlY3RfaGksIHJlaW50ZXJwcmV0X2Nhc3Q8UGFja2V0MnVsPihwMmxfT05FKSk7CisgIFBhY2tldDJ1bCBtYXNrX2xvID0gdmVjX2NtcGVxKHNlbGVjdF9sbywgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQydWw+KHAybF9PTkUpKTsKKyAgUGFja2V0NGYgcmVzdWx0OworICByZXN1bHQudjRmWzBdID0gdmVjX3NlbChlbHNlUGFja2V0LnY0ZlswXSwgdGhlblBhY2tldC52NGZbMF0sIG1hc2tfaGkpOworICByZXN1bHQudjRmWzFdID0gdmVjX3NlbChlbHNlUGFja2V0LnY0ZlsxXSwgdGhlblBhY2tldC52NGZbMV0sIG1hc2tfbG8pOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGJsZW5kKGNvbnN0IFNlbGVjdG9yPDI+JiBpZlBhY2tldCwgY29uc3QgUGFja2V0MmQmIHRoZW5QYWNrZXQsIGNvbnN0IFBhY2tldDJkJiBlbHNlUGFja2V0KSB7CisgIFBhY2tldDJ1bCBzZWxlY3QgPSB7IGlmUGFja2V0LnNlbGVjdFswXSwgaWZQYWNrZXQuc2VsZWN0WzFdIH07CisgIFBhY2tldDJ1bCBtYXNrID0gdmVjX2NtcGVxKHNlbGVjdCwgcmVpbnRlcnByZXRfY2FzdDxQYWNrZXQydWw+KHAybF9PTkUpKTsKKyAgcmV0dXJuIHZlY19zZWwoZWxzZVBhY2tldCwgdGhlblBhY2tldCwgbWFzayk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BBQ0tFVF9NQVRIX1pWRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvQXNzaWdubWVudEZ1bmN0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9mdW5jdG9ycy9Bc3NpZ25tZW50RnVuY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUzYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvQXNzaWdubWVudEZ1bmN0b3JzLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FTU0lHTk1FTlRfRlVOQ1RPUlNfSAorI2RlZmluZSBFSUdFTl9BU1NJR05NRU5UX0ZVTkNUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgZm9yIHNjYWxhci9wYWNrZXQgYXNzaWdubWVudAorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RTY2FsYXIsdHlwZW5hbWUgU3JjU2NhbGFyPiBzdHJ1Y3QgYXNzaWduX29wIHsKKworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihhc3NpZ25fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25Db2VmZihEc3RTY2FsYXImIGEsIGNvbnN0IFNyY1NjYWxhciYgYikgY29uc3QgeyBhID0gYjsgfQorICAKKyAgdGVtcGxhdGU8aW50IEFsaWdubWVudCwgdHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduUGFja2V0KERzdFNjYWxhciogYSwgY29uc3QgUGFja2V0JiBiKSBjb25zdAorICB7IGludGVybmFsOjpwc3RvcmV0PERzdFNjYWxhcixQYWNrZXQsQWxpZ25tZW50PihhLGIpOyB9Cit9OworCisvLyBFbXB0eSBvdmVybG9hZCBmb3Igdm9pZCB0eXBlICh1c2VkIGJ5IFBlcm11dGF0aW9uTWF0cml4KQordGVtcGxhdGU8dHlwZW5hbWUgRHN0U2NhbGFyPiBzdHJ1Y3QgYXNzaWduX29wPERzdFNjYWxhcix2b2lkPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0U2NhbGFyLHR5cGVuYW1lIFNyY1NjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxhc3NpZ25fb3A8RHN0U2NhbGFyLFNyY1NjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8RHN0U2NhbGFyPjo6UmVhZENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gaXNfc2FtZTxEc3RTY2FsYXIsU3JjU2NhbGFyPjo6dmFsdWUgJiYgcGFja2V0X3RyYWl0czxEc3RTY2FsYXI+OjpWZWN0b3JpemFibGUgJiYgcGFja2V0X3RyYWl0czxTcmNTY2FsYXI+OjpWZWN0b3JpemFibGUKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciBmb3Igc2NhbGFyL3BhY2tldCBhc3NpZ25tZW50IHdpdGggYWRkaXRpb24KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRHN0U2NhbGFyLHR5cGVuYW1lIFNyY1NjYWxhcj4gc3RydWN0IGFkZF9hc3NpZ25fb3AgeworCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKGFkZF9hc3NpZ25fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25Db2VmZihEc3RTY2FsYXImIGEsIGNvbnN0IFNyY1NjYWxhciYgYikgY29uc3QgeyBhICs9IGI7IH0KKyAgCisgIHRlbXBsYXRlPGludCBBbGlnbm1lbnQsIHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFzc2lnblBhY2tldChEc3RTY2FsYXIqIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyBpbnRlcm5hbDo6cHN0b3JldDxEc3RTY2FsYXIsUGFja2V0LEFsaWdubWVudD4oYSxpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR0PFBhY2tldCxBbGlnbm1lbnQ+KGEpLGIpKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFNjYWxhcix0eXBlbmFtZSBTcmNTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8YWRkX2Fzc2lnbl9vcDxEc3RTY2FsYXIsU3JjU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxEc3RTY2FsYXI+OjpSZWFkQ29zdCArIE51bVRyYWl0czxEc3RTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IGlzX3NhbWU8RHN0U2NhbGFyLFNyY1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8RHN0U2NhbGFyPjo6SGFzQWRkCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgZm9yIHNjYWxhci9wYWNrZXQgYXNzaWdubWVudCB3aXRoIHN1YnRyYWN0aW9uCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERzdFNjYWxhcix0eXBlbmFtZSBTcmNTY2FsYXI+IHN0cnVjdCBzdWJfYXNzaWduX29wIHsKKworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzdWJfYXNzaWduX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduQ29lZmYoRHN0U2NhbGFyJiBhLCBjb25zdCBTcmNTY2FsYXImIGIpIGNvbnN0IHsgYSAtPSBiOyB9CisgIAorICB0ZW1wbGF0ZTxpbnQgQWxpZ25tZW50LCB0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25QYWNrZXQoRHN0U2NhbGFyKiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgaW50ZXJuYWw6OnBzdG9yZXQ8RHN0U2NhbGFyLFBhY2tldCxBbGlnbm1lbnQ+KGEsaW50ZXJuYWw6OnBzdWIoaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXQsQWxpZ25tZW50PihhKSxiKSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RTY2FsYXIsdHlwZW5hbWUgU3JjU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN1Yl9hc3NpZ25fb3A8RHN0U2NhbGFyLFNyY1NjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8RHN0U2NhbGFyPjo6UmVhZENvc3QgKyBOdW1UcmFpdHM8RHN0U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBpc19zYW1lPERzdFNjYWxhcixTcmNTY2FsYXI+Ojp2YWx1ZSAmJiBwYWNrZXRfdHJhaXRzPERzdFNjYWxhcj46Okhhc1N1YgorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIGZvciBzY2FsYXIvcGFja2V0IGFzc2lnbm1lbnQgd2l0aCBtdWx0aXBsaWNhdGlvbgorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RTY2FsYXIsIHR5cGVuYW1lIFNyY1NjYWxhcj1Ec3RTY2FsYXI+CitzdHJ1Y3QgbXVsX2Fzc2lnbl9vcCB7CisKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IobXVsX2Fzc2lnbl9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFzc2lnbkNvZWZmKERzdFNjYWxhciYgYSwgY29uc3QgU3JjU2NhbGFyJiBiKSBjb25zdCB7IGEgKj0gYjsgfQorICAKKyAgdGVtcGxhdGU8aW50IEFsaWdubWVudCwgdHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduUGFja2V0KERzdFNjYWxhciogYSwgY29uc3QgUGFja2V0JiBiKSBjb25zdAorICB7IGludGVybmFsOjpwc3RvcmV0PERzdFNjYWxhcixQYWNrZXQsQWxpZ25tZW50PihhLGludGVybmFsOjpwbXVsKGludGVybmFsOjpwbG9hZHQ8UGFja2V0LEFsaWdubWVudD4oYSksYikpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgRHN0U2NhbGFyLCB0eXBlbmFtZSBTcmNTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8bXVsX2Fzc2lnbl9vcDxEc3RTY2FsYXIsU3JjU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxEc3RTY2FsYXI+OjpSZWFkQ29zdCArIE51bVRyYWl0czxEc3RTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IGlzX3NhbWU8RHN0U2NhbGFyLFNyY1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8RHN0U2NhbGFyPjo6SGFzTXVsCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgZm9yIHNjYWxhci9wYWNrZXQgYXNzaWdubWVudCB3aXRoIGRpdml2aW5nCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERzdFNjYWxhciwgdHlwZW5hbWUgU3JjU2NhbGFyPURzdFNjYWxhcj4gc3RydWN0IGRpdl9hc3NpZ25fb3AgeworCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKGRpdl9hc3NpZ25fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhc3NpZ25Db2VmZihEc3RTY2FsYXImIGEsIGNvbnN0IFNyY1NjYWxhciYgYikgY29uc3QgeyBhIC89IGI7IH0KKyAgCisgIHRlbXBsYXRlPGludCBBbGlnbm1lbnQsIHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFzc2lnblBhY2tldChEc3RTY2FsYXIqIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyBpbnRlcm5hbDo6cHN0b3JldDxEc3RTY2FsYXIsUGFja2V0LEFsaWdubWVudD4oYSxpbnRlcm5hbDo6cGRpdihpbnRlcm5hbDo6cGxvYWR0PFBhY2tldCxBbGlnbm1lbnQ+KGEpLGIpKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFNjYWxhciwgdHlwZW5hbWUgU3JjU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPGRpdl9hc3NpZ25fb3A8RHN0U2NhbGFyLFNyY1NjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8RHN0U2NhbGFyPjo6UmVhZENvc3QgKyBOdW1UcmFpdHM8RHN0U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBpc19zYW1lPERzdFNjYWxhcixTcmNTY2FsYXI+Ojp2YWx1ZSAmJiBwYWNrZXRfdHJhaXRzPERzdFNjYWxhcj46Okhhc0RpdgorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIGZvciBzY2FsYXIvcGFja2V0IGFzc2lnbm1lbnQgd2l0aCBzd2FwcGluZworICAqCisgICogSXQgd29ya3MgYXMgZm9sbG93LiBGb3IgYSBub24tdmVjdG9yaXplZCBldmFsdWF0aW9uIGxvb3AsIHdlIGhhdmU6CisgICogICBmb3IoaSkgZnVuYyhBLmNvZWZmUmVmKGkpLCBCLmNvZWZmKGkpKTsKKyAgKiB3aGVyZSBCIGlzIGEgU3dhcFdyYXBwZXIgZXhwcmVzc2lvbi4gVGhlIHRyaWNrIGlzIHRvIG1ha2UgU3dhcFdyYXBwZXI6OmNvZWZmIGJlaGF2ZXMgbGlrZSBhIG5vbi1jb25zdCBjb2VmZlJlZi4KKyAgKiBBY3R1YWxseSwgU3dhcFdyYXBwZXIgbWlnaHQgbm90IGV2ZW4gYmUgbmVlZGVkIHNpbmNlIGV2ZW4gaWYgQiBpcyBhIHBsYWluIGV4cHJlc3Npb24sIHNpbmNlIGl0IGhhcyB0byBiZSB3cml0YWJsZQorICAqIEIuY29lZmYgYWxyZWFkeSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHNjYWxhciB2YWx1ZS4KKyAgKiAKKyAgKiBUaGUgY2FzZSBvZiBhIHZlY3Rvcml6ZWQgbG9vcCBpcyBtb3JlIHRyaWNreToKKyAgKiAgIGZvcihpLGopIGZ1bmMuYXNzaWduUGFja2V0PEFfQWxpZ24+KCZBLmNvZWZmUmVmKGksaiksIEIucGFja2V0PEJfQWxpZ24+KGksaikpOworICAqIEhlcmUsIEIgbXVzdCBiZSBhIFN3YXBXcmFwcGVyIHdob3NlIHBhY2tldCBmdW5jdGlvbiBhY3R1YWxseSByZXR1cm5zIGEgcHJveHkgb2JqZWN0IGhvbGRpbmcgYSBTY2FsYXIqLAorICAqIHRoZSBhY3R1YWwgYWxpZ25tZW50IGFuZCBQYWNrZXQgdHlwZS4KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc3dhcF9hc3NpZ25fb3AgeworCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHN3YXBfYXNzaWduX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYXNzaWduQ29lZmYoU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIGNvbnN0CisgIHsKKyNpZmRlZiBfX0NVREFDQ19fCisgICAgLy8gRklYTUUgaXMgdGhlcmUgc29tZSBraW5kIG9mIGN1ZGE6OnN3YXA/CisgICAgU2NhbGFyIHQ9YjsgY29uc3RfY2FzdDxTY2FsYXImPihiKT1hOyBhPXQ7CisjZWxzZQorICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBzd2FwKGEsY29uc3RfY2FzdDxTY2FsYXImPihiKSk7CisjZW5kaWYKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzd2FwX2Fzc2lnbl9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gMyAqIE51bVRyYWl0czxTY2FsYXI+OjpSZWFkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZQorICB9OworfTsKKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FTU0lHTk1FTlRfRlVOQ1RPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvQmluYXJ5RnVuY3RvcnMuaCBiL0VpZ2VuL3NyYy9Db3JlL2Z1bmN0b3JzL0JpbmFyeUZ1bmN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NDdiYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2Z1bmN0b3JzL0JpbmFyeUZ1bmN0b3JzLmgKQEAgLTAsMCArMSw0ODIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JJTkFSWV9GVU5DVE9SU19ICisjZGVmaW5lIEVJR0VOX0JJTkFSWV9GVU5DVE9SU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vLS0tLS0tLS0tLSBhc3NvY2lhdGl2ZSBiaW5hcnkgZnVuY3RvcnMgLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgorc3RydWN0IGJpbmFyeV9vcF9iYXNlCit7CisgIHR5cGVkZWYgQXJnMSBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIEFyZzIgc2Vjb25kX2FyZ3VtZW50X3R5cGU7Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHR3byBzY2FsYXJzCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgTWF0cml4QmFzZTo6b3BlcmF0b3IrLCBjbGFzcyBWZWN0b3J3aXNlT3AsIERlbnNlQmFzZTo6c3VtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3N1bV9vcCA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixzY2FsYXJfc3VtX29wPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyNpZm5kZWYgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3N1bV9vcCkKKyNlbHNlCisgIHNjYWxhcl9zdW1fb3AoKSB7CisgICAgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgfQorI2VuZGlmCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgKyBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwYWRkKGEsYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXgoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9zdW1fb3A8TGhzU2NhbGFyLFJoc1NjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSAoTnVtVHJhaXRzPExoc1NjYWxhcj46OkFkZENvc3QrTnVtVHJhaXRzPFJoc1NjYWxhcj46OkFkZENvc3QpLzIsIC8vIHJvdWdoIGVzdGltYXRlIQorICAgIFBhY2tldEFjY2VzcyA9IGlzX3NhbWU8TGhzU2NhbGFyLFJoc1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6SGFzQWRkICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6SGFzQWRkCisgICAgLy8gVE9ETyB2ZWN0b3JpemUgbWl4ZWQgc3VtCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRvIGRlcHJlY2F0ZSB0aGUgc3VtbWF0aW9uIG9mIGJvb2xlYW4gZXhwcmVzc2lvbnMuCisgICogVGhpcyBpcyByZXF1aXJlZCB0byBzb2x2ZSBCdWcgNDI2LgorICAqIFxzYSBEZW5zZUJhc2U6OmNvdW50KCksIERlbnNlQmFzZTo6YW55KCksIEFycmF5QmFzZTo6Y2FzdCgpLCBNYXRyaXhCYXNlOjpjYXN0KCkKKyAgKi8KK3RlbXBsYXRlPD4gc3RydWN0IHNjYWxhcl9zdW1fb3A8Ym9vbCxib29sPiA6IHNjYWxhcl9zdW1fb3A8aW50LGludD4geworICBFSUdFTl9ERVBSRUNBVEVECisgIHNjYWxhcl9zdW1fb3AoKSB7fQorfTsKKworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiB0d28gc2NhbGFycworICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIEN3aXNlOjpvcGVyYXRvciooKSwgY2xhc3MgVmVjdG9yd2lzZU9wLCBNYXRyaXhCYXNlOjpyZWR1eCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9wcm9kdWN0X29wICA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixzY2FsYXJfcHJvZHVjdF9vcD46OlJldHVyblR5cGUgcmVzdWx0X3R5cGU7CisjaWZuZGVmIEVJR0VOX1NDQUxBUl9CSU5BUllfT1BfUExVR0lOCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9wcm9kdWN0X29wKQorI2Vsc2UKKyAgc2NhbGFyX3Byb2R1Y3Rfb3AoKSB7CisgICAgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgfQorI2VuZGlmCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgKiBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXhfbXVsKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcHJvZHVjdF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IChOdW1UcmFpdHM8TGhzU2NhbGFyPjo6TXVsQ29zdCArIE51bVRyYWl0czxSaHNTY2FsYXI+OjpNdWxDb3N0KS8yLCAvLyByb3VnaCBlc3RpbWF0ZSEKKyAgICBQYWNrZXRBY2Nlc3MgPSBpc19zYW1lPExoc1NjYWxhcixSaHNTY2FsYXI+Ojp2YWx1ZSAmJiBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46Okhhc011bCAmJiBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46Okhhc011bAorICAgIC8vIFRPRE8gdmVjdG9yaXplIG1peGVkIHByb2R1Y3QKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBjb25qdWdhdGUgcHJvZHVjdCBvZiB0d28gc2NhbGFycworICAqCisgICogVGhpcyBpcyBhIHNob3J0IGN1dCBmb3IgY29uaih4KSAqIHkgd2hpY2ggaXMgbmVlZGVkIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZTsgaW4gRWlnZW4yIHN1cHBvcnQgbW9kZSwgdGhpcyBiZWNvbWVzIHggKiBjb25qKHkpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3AgIDogYmluYXJ5X29wX2Jhc2U8TGhzU2NhbGFyLFJoc1NjYWxhcj4KK3sKKworICBlbnVtIHsKKyAgICBDb25qID0gTnVtVHJhaXRzPExoc1NjYWxhcj46OklzQ29tcGxleAorICB9OworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czxMaHNTY2FsYXIsUmhzU2NhbGFyLHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3A+OjpSZXR1cm5UeXBlIHJlc3VsdF90eXBlOworICAKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2NvbmpfcHJvZHVjdF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCByZXN1bHRfdHlwZSBvcGVyYXRvcigpIChjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYikgY29uc3QKKyAgeyByZXR1cm4gY29ual9oZWxwZXI8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qLGZhbHNlPigpLnBtdWwoYSxiKTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyByZXR1cm4gY29ual9oZWxwZXI8UGFja2V0LFBhY2tldCxDb25qLGZhbHNlPigpLnBtdWwoYSxiKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2NvbmpfcHJvZHVjdF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxMaHNTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IGludGVybmFsOjppc19zYW1lPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6dmFsdWUgJiYgcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpIYXNNdWwKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBtaW4gb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBNYXRyaXhCYXNlOjpjd2lzZU1pbiwgY2xhc3MgVmVjdG9yd2lzZU9wLCBNYXRyaXhCYXNlOjptaW5Db2VmZigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9taW5fb3AgOiBiaW5hcnlfb3BfYmFzZTxMaHNTY2FsYXIsUmhzU2NhbGFyPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXIsc2NhbGFyX21pbl9vcD46OlJldHVyblR5cGUgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9taW5fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIG51bWV4dDo6bWluaShhLCBiKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSBjb25zdAorICB7IHJldHVybiBpbnRlcm5hbDo6cG1pbihhLGIpOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCByZXN1bHRfdHlwZSBwcmVkdXgoY29uc3QgUGFja2V0JiBhKSBjb25zdAorICB7IHJldHVybiBpbnRlcm5hbDo6cHJlZHV4X21pbihhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX21pbl9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IChOdW1UcmFpdHM8TGhzU2NhbGFyPjo6QWRkQ29zdCtOdW1UcmFpdHM8UmhzU2NhbGFyPjo6QWRkQ29zdCkvMiwKKyAgICBQYWNrZXRBY2Nlc3MgPSBpbnRlcm5hbDo6aXNfc2FtZTxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6SGFzTWluCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgbWF4IG9mIHR3byBzY2FsYXJzCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgTWF0cml4QmFzZTo6Y3dpc2VNYXgsIGNsYXNzIFZlY3Rvcndpc2VPcCwgTWF0cml4QmFzZTo6bWF4Q29lZmYoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBzY2FsYXJfbWF4X29wICA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixzY2FsYXJfbWF4X29wPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX21heF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCByZXN1bHRfdHlwZSBvcGVyYXRvcigpIChjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYikgY29uc3QgeyByZXR1cm4gbnVtZXh0OjptYXhpKGEsIGIpOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbWF4KGEsYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXhfbWF4KGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfbWF4X29wPExoc1NjYWxhcixSaHNTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gKE51bVRyYWl0czxMaHNTY2FsYXI+OjpBZGRDb3N0K051bVRyYWl0czxSaHNTY2FsYXI+OjpBZGRDb3N0KS8yLAorICAgIFBhY2tldEFjY2VzcyA9IGludGVybmFsOjppc19zYW1lPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6dmFsdWUgJiYgcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpIYXNNYXgKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvcnMgZm9yIGNvbXBhcmlzb24gb2YgdHdvIHNjYWxhcnMKKyAgKiBcdG9kbyBJbXBsZW1lbnQgcGFja2V0LWNvbXBhcmlzb25zCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgQ29tcGFyaXNvbk5hbWUgY21wPiBzdHJ1Y3Qgc2NhbGFyX2NtcF9vcDsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIENvbXBhcmlzb25OYW1lIGNtcD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfY21wX29wPExoc1NjYWxhcixSaHNTY2FsYXIsIGNtcD4gPiB7CisgIGVudW0geworICAgIENvc3QgPSAoTnVtVHJhaXRzPExoc1NjYWxhcj46OkFkZENvc3QrTnVtVHJhaXRzPFJoc1NjYWxhcj46OkFkZENvc3QpLzIsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKK3RlbXBsYXRlPENvbXBhcmlzb25OYW1lIENtcCwgdHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3QgcmVzdWx0X29mPHNjYWxhcl9jbXBfb3A8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIENtcD4oTGhzU2NhbGFyLFJoc1NjYWxhcik+IHsKKyAgdHlwZWRlZiBib29sIHR5cGU7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jbXBfb3A8TGhzU2NhbGFyLFJoc1NjYWxhciwgY21wX0VRPiA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2NtcF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIG9wZXJhdG9yKCkoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHtyZXR1cm4gYT09Yjt9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2NtcF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyLCBjbXBfTFQ+IDogYmluYXJ5X29wX2Jhc2U8TGhzU2NhbGFyLFJoc1NjYWxhcj4KK3sKKyAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY21wX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYikgY29uc3Qge3JldHVybiBhPGI7fQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jbXBfb3A8TGhzU2NhbGFyLFJoc1NjYWxhciwgY21wX0xFPiA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2NtcF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIG9wZXJhdG9yKCkoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHtyZXR1cm4gYTw9Yjt9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2NtcF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyLCBjbXBfR1Q+IDogYmluYXJ5X29wX2Jhc2U8TGhzU2NhbGFyLFJoc1NjYWxhcj4KK3sKKyAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY21wX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYikgY29uc3Qge3JldHVybiBhPmI7fQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jbXBfb3A8TGhzU2NhbGFyLFJoc1NjYWxhciwgY21wX0dFPiA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2NtcF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIG9wZXJhdG9yKCkoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHtyZXR1cm4gYT49Yjt9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2NtcF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyLCBjbXBfVU5PUkQ+IDogYmluYXJ5X29wX2Jhc2U8TGhzU2NhbGFyLFJoc1NjYWxhcj4KK3sKKyAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY21wX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYikgY29uc3Qge3JldHVybiAhKGE8PWIgfHwgYjw9YSk7fQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jbXBfb3A8TGhzU2NhbGFyLFJoc1NjYWxhciwgY21wX05FUT4gOiBiaW5hcnlfb3BfYmFzZTxMaHNTY2FsYXIsUmhzU2NhbGFyPgoreworICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jbXBfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IExoc1NjYWxhciYgYSwgY29uc3QgUmhzU2NhbGFyJiBiKSBjb25zdCB7cmV0dXJuIGEhPWI7fQorfTsKKworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgaHlwb3Qgb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzdGFibGVOb3JtKCksIGNsYXNzIFJlZHV4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2h5cG90X29wPFNjYWxhcixTY2FsYXI+IDogYmluYXJ5X29wX2Jhc2U8U2NhbGFyLFNjYWxhcj4KK3sKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2h5cG90X29wKQorLy8gICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIF94LCBjb25zdCBTY2FsYXImIF95KSBjb25zdAorICB7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoc3FydCkKKyAgICBTY2FsYXIgcCwgcXA7CisgICAgaWYoX3g+X3kpCisgICAgeworICAgICAgcCA9IF94OworICAgICAgcXAgPSBfeSAvIHA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwID0gX3k7CisgICAgICBxcCA9IF94IC8gcDsKKyAgICB9CisgICAgcmV0dXJuIHAgKiBzcXJ0KFNjYWxhcigxKSArIHFwKnFwKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaHlwb3Rfb3A8U2NhbGFyLFNjYWxhcj4gPiB7CisgIGVudW0KKyAgeworICAgIENvc3QgPSAzICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKworICAgICAgICAgICAyICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKworICAgICAgICAgICAyICogc2NhbGFyX2Rpdl9jb3N0PFNjYWxhcixmYWxzZT46OnZhbHVlLAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgcG93IG9mIHR3byBzY2FsYXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEV4cG9uZW50Pgorc3RydWN0IHNjYWxhcl9wb3dfb3AgIDogYmluYXJ5X29wX2Jhc2U8U2NhbGFyLEV4cG9uZW50PgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPFNjYWxhcixFeHBvbmVudCxzY2FsYXJfcG93X29wPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyNpZm5kZWYgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3Bvd19vcCkKKyNlbHNlCisgIHNjYWxhcl9wb3dfb3AoKSB7CisgICAgdHlwZWRlZiBTY2FsYXIgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgRXhwb25lbnQgUmhzU2NhbGFyOworICAgIEVJR0VOX1NDQUxBUl9CSU5BUllfT1BfUExVR0lOCisgIH0KKyNlbmRpZgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBFeHBvbmVudCYgYikgY29uc3QgeyByZXR1cm4gbnVtZXh0Ojpwb3coYSwgYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEV4cG9uZW50Pgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9wb3dfb3A8U2NhbGFyLEV4cG9uZW50PiA+IHsKKyAgZW51bSB7IENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07Cit9OworCisKKworLy8tLS0tLS0tLS0tIG5vbiBhc3NvY2lhdGl2ZSBiaW5hcnkgZnVuY3RvcnMgLS0tLS0tLS0tLQorCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2NhbGFycworICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIE1hdHJpeEJhc2U6Om9wZXJhdG9yLQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZGlmZmVyZW5jZV9vcCA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixzY2FsYXJfZGlmZmVyZW5jZV9vcD46OlJldHVyblR5cGUgcmVzdWx0X3R5cGU7CisjaWZuZGVmIEVJR0VOX1NDQUxBUl9CSU5BUllfT1BfUExVR0lOCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9kaWZmZXJlbmNlX29wKQorI2Vsc2UKKyAgc2NhbGFyX2RpZmZlcmVuY2Vfb3AoKSB7CisgICAgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgfQorI2VuZGlmCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgLSBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwc3ViKGEsYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9kaWZmZXJlbmNlX29wPExoc1NjYWxhcixSaHNTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gKE51bVRyYWl0czxMaHNTY2FsYXI+OjpBZGRDb3N0K051bVRyYWl0czxSaHNTY2FsYXI+OjpBZGRDb3N0KS8yLAorICAgIFBhY2tldEFjY2VzcyA9IGlzX3NhbWU8TGhzU2NhbGFyLFJoc1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6SGFzU3ViICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6SGFzU3ViCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgcXVvdGllbnQgb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBDd2lzZTo6b3BlcmF0b3IvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50X29wICA6IGJpbmFyeV9vcF9iYXNlPExoc1NjYWxhcixSaHNTY2FsYXI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixzY2FsYXJfcXVvdGllbnRfb3A+OjpSZXR1cm5UeXBlIHJlc3VsdF90eXBlOworI2lmbmRlZiBFSUdFTl9TQ0FMQVJfQklOQVJZX09QX1BMVUdJTgorICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfcXVvdGllbnRfb3ApCisjZWxzZQorICBzY2FsYXJfcXVvdGllbnRfb3AoKSB7CisgICAgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4KKyAgfQorI2VuZGlmCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgLyBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwZGl2KGEsYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9xdW90aWVudF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcXVvdGllbnRfb3A8TGhzU2NhbGFyLFJoc1NjYWxhcj46OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICBlbnVtIHsKKyAgICBQYWNrZXRBY2Nlc3MgPSBpc19zYW1lPExoc1NjYWxhcixSaHNTY2FsYXI+Ojp2YWx1ZSAmJiBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46Okhhc0RpdiAmJiBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46Okhhc0RpdiwKKyAgICBDb3N0ID0gc2NhbGFyX2Rpdl9jb3N0PHJlc3VsdF90eXBlLFBhY2tldEFjY2Vzcz46OnZhbHVlCisgIH07Cit9OworCisKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGFuZCBvZiB0d28gYm9vbGVhbnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBBcnJheUJhc2U6Om9wZXJhdG9yJiYKKyAgKi8KK3N0cnVjdCBzY2FsYXJfYm9vbGVhbl9hbmRfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYm9vbGVhbl9hbmRfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBib29sJiBhLCBjb25zdCBib29sJiBiKSBjb25zdCB7IHJldHVybiBhICYmIGI7IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfYm9vbGVhbl9hbmRfb3A+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxib29sPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZQorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIG9yIG9mIHR3byBib29sZWFucworICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIEFycmF5QmFzZTo6b3BlcmF0b3J8fAorICAqLworc3RydWN0IHNjYWxhcl9ib29sZWFuX29yX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Jvb2xlYW5fb3Jfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBib29sJiBhLCBjb25zdCBib29sJiBiKSBjb25zdCB7IHJldHVybiBhIHx8IGI7IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfYm9vbGVhbl9vcl9vcD4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPGJvb2w+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSB4b3Igb2YgdHdvIGJvb2xlYW5zCisgKgorICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIEFycmF5QmFzZTo6b3BlcmF0b3JeCisgKi8KK3N0cnVjdCBzY2FsYXJfYm9vbGVhbl94b3Jfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYm9vbGVhbl94b3Jfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBib29sJiBhLCBjb25zdCBib29sJiBiKSBjb25zdCB7IHJldHVybiBhIF4gYjsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9ib29sZWFuX3hvcl9vcD4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPGJvb2w+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlCisgIH07Cit9OworCisKKworLy8tLS0tLS0tLS0tIGJpbmFyeSBmdW5jdG9ycyBib3VuZCB0byBhIGNvbnN0YW50LCB0aHVzIGFwcGVhcmluZyBhcyBhIHVuYXJ5IGZ1bmN0b3IgLS0tLS0tLS0tLQorCisvLyBUaGUgZm9sbG93aW5nIHR3byBjbGFzc2VzIHBlcm1pdHMgdG8gdHVybiBhbnkgYmluYXJ5IGZ1bmN0b3IgaW50byBhIHVuYXJ5IG9uZSB3aXRoIG9uZSBhcmd1bWVudCBib3VuZCB0byBhIGNvbnN0YW50IHZhbHVlLgorLy8gVGhleSBhcmUgYW5hbG9ndWVzIHRvIHN0ZDo6YmluZGVyMXN0L2JpbmRlcjJuZCBidXQgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzOgorLy8gIC0gdGhleSBhcmUgY29tcGF0aWJsZSB3aXRoIHBhY2tldE9wCisvLyAgLSB0aGV5IGFyZSBwb3J0YWJsZSBhY3Jvc3MgQysrIHZlcnNpb25zICh0aGUgc3RkOjpiaW5kZXIqIGFyZSBkZXByZWNhdGVkIGluIEMrKzExKQordGVtcGxhdGU8dHlwZW5hbWUgQmluYXJ5T3A+IHN0cnVjdCBiaW5kMXN0X29wIDogQmluYXJ5T3AgeworCisgIHR5cGVkZWYgdHlwZW5hbWUgQmluYXJ5T3A6OmZpcnN0X2FyZ3VtZW50X3R5cGUgIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmluYXJ5T3A6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJpbmFyeU9wOjpyZXN1bHRfdHlwZSAgICAgICAgICByZXN1bHRfdHlwZTsKKworICBiaW5kMXN0X29wKGNvbnN0IGZpcnN0X2FyZ3VtZW50X3R5cGUgJnZhbCkgOiBtX3ZhbHVlKHZhbCkge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkgKGNvbnN0IHNlY29uZF9hcmd1bWVudF90eXBlJiBiKSBjb25zdCB7IHJldHVybiBCaW5hcnlPcDo6b3BlcmF0b3IoKShtX3ZhbHVlLGIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIEJpbmFyeU9wOjpwYWNrZXRPcChpbnRlcm5hbDo6cHNldDE8UGFja2V0PihtX3ZhbHVlKSwgYik7IH0KKworICBmaXJzdF9hcmd1bWVudF90eXBlIG1fdmFsdWU7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgQmluYXJ5T3A+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czxiaW5kMXN0X29wPEJpbmFyeU9wPiA+IDogZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+IHt9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wPiBzdHJ1Y3QgYmluZDJuZF9vcCA6IEJpbmFyeU9wIHsKKworICB0eXBlZGVmIHR5cGVuYW1lIEJpbmFyeU9wOjpmaXJzdF9hcmd1bWVudF90eXBlICBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJpbmFyeU9wOjpzZWNvbmRfYXJndW1lbnRfdHlwZSBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCaW5hcnlPcDo6cmVzdWx0X3R5cGUgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgYmluZDJuZF9vcChjb25zdCBzZWNvbmRfYXJndW1lbnRfdHlwZSAmdmFsKSA6IG1fdmFsdWUodmFsKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgZmlyc3RfYXJndW1lbnRfdHlwZSYgYSkgY29uc3QgeyByZXR1cm4gQmluYXJ5T3A6Om9wZXJhdG9yKCkoYSxtX3ZhbHVlKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdAorICB7IHJldHVybiBCaW5hcnlPcDo6cGFja2V0T3AoYSxpbnRlcm5hbDo6cHNldDE8UGFja2V0PihtX3ZhbHVlKSk7IH0KKworICBzZWNvbmRfYXJndW1lbnRfdHlwZSBtX3ZhbHVlOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wPiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8YmluZDJuZF9vcDxCaW5hcnlPcD4gPiA6IGZ1bmN0b3JfdHJhaXRzPEJpbmFyeU9wPiB7fTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9CSU5BUllfRlVOQ1RPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvTnVsbGFyeUZ1bmN0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9mdW5jdG9ycy9OdWxsYXJ5RnVuY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNiZTAyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvTnVsbGFyeUZ1bmN0b3JzLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05VTExBUllfRlVOQ1RPUlNfSAorI2RlZmluZSBFSUdFTl9OVUxMQVJZX0ZVTkNUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jb25zdGFudF9vcCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc2NhbGFyX2NvbnN0YW50X29wKGNvbnN0IHNjYWxhcl9jb25zdGFudF9vcCYgb3RoZXIpIDogbV9vdGhlcihvdGhlci5tX290aGVyKSB7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzY2FsYXJfY29uc3RhbnRfb3AoY29uc3QgU2NhbGFyJiBvdGhlcikgOiBtX290aGVyKG90aGVyKSB7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoKSBjb25zdCB7IHJldHVybiBtX290aGVyOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0VHlwZSBwYWNrZXRPcCgpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwc2V0MTxQYWNrZXRUeXBlPihtX290aGVyKTsgfQorICBjb25zdCBTY2FsYXIgbV9vdGhlcjsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4gPgoreyBlbnVtIHsgQ29zdCA9IDAgLyogYXMgdGhlIGNvbnN0YW50IHZhbHVlIHNob3VsZCBiZSBsb2FkZWQgaW4gcmVnaXN0ZXIgb25seSBvbmNlIGZvciB0aGUgd2hvbGUgZXhwcmVzc2lvbiAqLywKKyAgICAgICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlLCBJc1JlcGVhdGFibGUgPSB0cnVlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9pZGVudGl0eV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pZGVudGl0eV9vcCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChJbmRleFR5cGUgcm93LCBJbmRleFR5cGUgY29sKSBjb25zdCB7IHJldHVybiByb3c9PWNvbCA/IFNjYWxhcigxKSA6IFNjYWxhcigwKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlLCBJc1JlcGVhdGFibGUgPSB0cnVlIH07IH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldCwgYm9vbCBJc0ludGVnZXI+IHN0cnVjdCBsaW5zcGFjZWRfb3BfaW1wbDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IGxpbnNwYWNlZF9vcF9pbXBsPFNjYWxhcixQYWNrZXQsLypJc0ludGVnZXIqL2ZhbHNlPgoreworICBsaW5zcGFjZWRfb3BfaW1wbChjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoLCBJbmRleCBudW1fc3RlcHMpIDoKKyAgICBtX2xvdyhsb3cpLCBtX2hpZ2goaGlnaCksIG1fc2l6ZTEobnVtX3N0ZXBzPT0xID8gMSA6IG51bV9zdGVwcy0xKSwgbV9zdGVwKG51bV9zdGVwcz09MSA/IFNjYWxhcigpIDogKGhpZ2gtbG93KS9TY2FsYXIobnVtX3N0ZXBzLTEpKSwKKyAgICBtX2ZsaXAobnVtZXh0OjphYnMoaGlnaCk8bnVtZXh0OjphYnMobG93KSkKKyAge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKEluZGV4VHlwZSBpKSBjb25zdCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIGlmKG1fZmxpcCkKKyAgICAgIHJldHVybiAoaT09MCk/IG1fbG93IDogKG1faGlnaCAtIFJlYWxTY2FsYXIobV9zaXplMS1pKSptX3N0ZXApOworICAgIGVsc2UKKyAgICAgIHJldHVybiAoaT09bV9zaXplMSk/IG1faGlnaCA6IChtX2xvdyArIFJlYWxTY2FsYXIoaSkqbV9zdGVwKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoSW5kZXhUeXBlIGkpIGNvbnN0CisgIHsKKyAgICAvLyBQcmluY2lwbGU6CisgICAgLy8gW2xvdywgLi4uLCBsb3ddICsgKCBbc3RlcCwgLi4uLCBzdGVwXSAqICggW2ksIC4uLiwgaV0gKyBbMCwgLi4uLCBzaXplXSApICkKKyAgICBpZihtX2ZsaXApCisgICAgeworICAgICAgUGFja2V0IHBpID0gcGxzZXQ8UGFja2V0PihTY2FsYXIoaS1tX3NpemUxKSk7CisgICAgICBQYWNrZXQgcmVzID0gcGFkZChwc2V0MTxQYWNrZXQ+KG1faGlnaCksIHBtdWwocHNldDE8UGFja2V0PihtX3N0ZXApLCBwaSkpOworICAgICAgaWYoaT09MCkKKyAgICAgICAgcmVzID0gcGluc2VydGZpcnN0KHJlcywgbV9sb3cpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFBhY2tldCBwaSA9IHBsc2V0PFBhY2tldD4oU2NhbGFyKGkpKTsKKyAgICAgIFBhY2tldCByZXMgPSBwYWRkKHBzZXQxPFBhY2tldD4obV9sb3cpLCBwbXVsKHBzZXQxPFBhY2tldD4obV9zdGVwKSwgcGkpKTsKKyAgICAgIGlmKGk9PW1fc2l6ZTEtdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemUrMSkKKyAgICAgICAgcmVzID0gcGluc2VydGxhc3QocmVzLCBtX2hpZ2gpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgIH0KKworICBjb25zdCBTY2FsYXIgbV9sb3c7CisgIGNvbnN0IFNjYWxhciBtX2hpZ2g7CisgIGNvbnN0IEluZGV4IG1fc2l6ZTE7CisgIGNvbnN0IFNjYWxhciBtX3N0ZXA7CisgIGNvbnN0IGJvb2wgbV9mbGlwOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IGxpbnNwYWNlZF9vcF9pbXBsPFNjYWxhcixQYWNrZXQsLypJc0ludGVnZXIqL3RydWU+Cit7CisgIGxpbnNwYWNlZF9vcF9pbXBsKGNvbnN0IFNjYWxhciYgbG93LCBjb25zdCBTY2FsYXImIGhpZ2gsIEluZGV4IG51bV9zdGVwcykgOgorICAgIG1fbG93KGxvdyksCisgICAgbV9tdWx0aXBsaWVyKChoaWdoLWxvdykvY29udmVydF9pbmRleDxTY2FsYXI+KG51bV9zdGVwczw9MSA/IDEgOiBudW1fc3RlcHMtMSkpLAorICAgIG1fZGl2aXNvcihjb252ZXJ0X2luZGV4PFNjYWxhcj4oKGhpZ2g+PWxvdz9udW1fc3RlcHM6LW51bV9zdGVwcykrKGhpZ2gtbG93KSkvKChudW1leHQ6OmFicyhoaWdoLWxvdykrMSk9PTA/MToobnVtZXh0OjphYnMoaGlnaC1sb3cpKzEpKSksCisgICAgbV91c2VfZGl2aXNvcihudW1fc3RlcHM+MSAmJiAobnVtZXh0OjphYnMoaGlnaC1sb3cpKzEpPG51bV9zdGVwcykKKyAge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKEluZGV4VHlwZSBpKSBjb25zdAorICB7CisgICAgaWYobV91c2VfZGl2aXNvcikgcmV0dXJuIG1fbG93ICsgY29udmVydF9pbmRleDxTY2FsYXI+KGkpL21fZGl2aXNvcjsKKyAgICBlbHNlICAgICAgICAgICAgICByZXR1cm4gbV9sb3cgKyBjb252ZXJ0X2luZGV4PFNjYWxhcj4oaSkqbV9tdWx0aXBsaWVyOworICB9CisKKyAgY29uc3QgU2NhbGFyIG1fbG93OworICBjb25zdCBTY2FsYXIgbV9tdWx0aXBsaWVyOworICBjb25zdCBTY2FsYXIgbV9kaXZpc29yOworICBjb25zdCBib29sIG1fdXNlX2Rpdmlzb3I7Cit9OworCisvLyAtLS0tLSBMaW5zcGFjZSBmdW5jdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiAod2UgZGVmYXVsdCB0byByYW5kb20gYWNjZXNzIHdoaWNoIGRvZXMgbm90IHJlYWxseSBnaXZlCisvLyB1cyBhIHNwZWVkIGdhaW4gd2hlbiB1c2luZyBwYWNrZXQgYWNjZXNzIGJ1dCBpdCBhbGxvd3MgdG8gdXNlIHRoZSBmdW5jdG9yIGluCisvLyBuZXN0ZWQgZXhwcmVzc2lvbnMpLgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0VHlwZT4gc3RydWN0IGxpbnNwYWNlZF9vcDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldFR5cGU+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czwgbGluc3BhY2VkX29wPFNjYWxhcixQYWNrZXRUeXBlPiA+Cit7CisgIGVudW0KKyAgeworICAgIENvc3QgPSAxLAorICAgIFBhY2tldEFjY2VzcyA9ICAgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSAmJiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NldExpbmVhciAmJiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0JsZW5kLAorICAgICAgICAgICAgICAgICAgLyomJiAoKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSB8fCBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0RpdiksKi8gLy8gPC0gdmVjdG9yaXphdGlvbiBmb3IgaW50ZWdlciBpcyBjdXJyZW50bHkgZGlzYWJsZWQKKyAgICBJc1JlcGVhdGFibGUgPSB0cnVlCisgIH07Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0VHlwZT4gc3RydWN0IGxpbnNwYWNlZF9vcAoreworICBsaW5zcGFjZWRfb3AoY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCwgSW5kZXggbnVtX3N0ZXBzKQorICAgIDogaW1wbCgobnVtX3N0ZXBzPT0xID8gaGlnaCA6IGxvdyksaGlnaCxudW1fc3RlcHMpCisgIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChJbmRleFR5cGUgaSkgY29uc3QgeyByZXR1cm4gaW1wbChpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldCx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKEluZGV4VHlwZSBpKSBjb25zdCB7IHJldHVybiBpbXBsLnBhY2tldE9wKGkpOyB9CisKKyAgLy8gVGhpcyBwcm94eSBvYmplY3QgaGFuZGxlcyB0aGUgYWN0dWFsIHJlcXVpcmVkIHRlbXBvcmFyaWVzIGFuZCB0aGUgZGlmZmVyZW50CisgIC8vIGltcGxlbWVudGF0aW9ucyAoaW50ZWdlciB2cy4gZmxvYXRpbmcgcG9pbnQpLgorICBjb25zdCBsaW5zcGFjZWRfb3BfaW1wbDxTY2FsYXIsUGFja2V0VHlwZSxOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPiBpbXBsOworfTsKKworLy8gTGluZWFyIGFjY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgZnJvbSB0aGUgb3BlcmF0b3IoKSBwcm90b3R5cGVzIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIGZ1bmN0b3IuCisvLyBJZiBpdCBleHBvc2VzIGFuIG9wZXJhdG9yKCkoaSxqKSwgdGhlbiB3ZSBhc3N1bWUgdGhlIGkgYW5kIGogY29lZmZpY2llbnRzIGFyZSByZXF1aXJlZCBpbmRlcGVuZGVudGx5CisvLyBhbmQgbGluZWFyIGFjY2VzcyBpcyBub3QgcG9zc2libGUuIEluIGFsbCBvdGhlciBjYXNlcywgbGluZWFyIGFjY2VzcyBpcyBlbmFibGVkLgorLy8gVXNlcnMgc2hvdWxkIG5vdCBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzIHN0cnVjdHVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IHN0cnVjdCBmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzIHsgZW51bSB7IHJldCA9ICFoYXNfYmluYXJ5X29wZXJhdG9yPEZ1bmN0b3I+Ojp2YWx1ZSB9OyB9OworCisvLyBGb3IgdW5yZWxpYWJsZSBjb21waWxlcnMsIGxldCdzIHNwZWNpYWxpemUgdGhlIGhhc18qYXJ5X29wZXJhdG9yCisvLyBoZWxwZXJzIHNvIHRoYXQgYXQgbGVhc3QgYnVpbHQtaW4gbnVsbGFyeSBmdW5jdG9ycyB3b3JrIGZpbmUuCisjaWYgISggKEVJR0VOX0NPTVBfTVNWQz4xNjAwKSB8fCAoRUlHRU5fR05VQ19BVF9MRUFTVCg0LDgpKSB8fCAoRUlHRU5fQ09NUF9JQ0M+PTE2MDApKQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0cnVjdCBoYXNfbnVsbGFyeV9vcGVyYXRvcjxzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixJbmRleFR5cGU+IHsgZW51bSB7IHZhbHVlID0gMX07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IGhhc191bmFyeV9vcGVyYXRvcjxzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixJbmRleFR5cGU+IHsgZW51bSB7IHZhbHVlID0gMH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IGhhc19iaW5hcnlfb3BlcmF0b3I8c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sSW5kZXhUeXBlPiB7IGVudW0geyB2YWx1ZSA9IDB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IGhhc19udWxsYXJ5X29wZXJhdG9yPHNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LEluZGV4VHlwZT4geyBlbnVtIHsgdmFsdWUgPSAwfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgaGFzX3VuYXJ5X29wZXJhdG9yPHNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LEluZGV4VHlwZT4geyBlbnVtIHsgdmFsdWUgPSAwfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgaGFzX2JpbmFyeV9vcGVyYXRvcjxzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPixJbmRleFR5cGU+IHsgZW51bSB7IHZhbHVlID0gMX07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0VHlwZSx0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgaGFzX251bGxhcnlfb3BlcmF0b3I8bGluc3BhY2VkX29wPFNjYWxhcixQYWNrZXRUeXBlPixJbmRleFR5cGU+IHsgZW51bSB7IHZhbHVlID0gMH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldFR5cGUsdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IGhhc191bmFyeV9vcGVyYXRvcjxsaW5zcGFjZWRfb3A8U2NhbGFyLFBhY2tldFR5cGU+LEluZGV4VHlwZT4geyBlbnVtIHsgdmFsdWUgPSAxfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0VHlwZSx0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgaGFzX2JpbmFyeV9vcGVyYXRvcjxsaW5zcGFjZWRfb3A8U2NhbGFyLFBhY2tldFR5cGU+LEluZGV4VHlwZT4geyBlbnVtIHsgdmFsdWUgPSAwfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0cnVjdCBoYXNfbnVsbGFyeV9vcGVyYXRvcjxzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4sSW5kZXhUeXBlPiB7IGVudW0geyB2YWx1ZSA9IDF9OyB9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0cnVjdCBoYXNfdW5hcnlfb3BlcmF0b3I8c2NhbGFyX3JhbmRvbV9vcDxTY2FsYXI+LEluZGV4VHlwZT4geyBlbnVtIHsgdmFsdWUgPSAwfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgaGFzX2JpbmFyeV9vcGVyYXRvcjxzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4sSW5kZXhUeXBlPiB7IGVudW0geyB2YWx1ZSA9IDB9OyB9OworI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX05VTExBUllfRlVOQ1RPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvU3RsRnVuY3RvcnMuaCBiL0VpZ2VuL3NyYy9Db3JlL2Z1bmN0b3JzL1N0bEZ1bmN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmM2ZhNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2Z1bmN0b3JzL1N0bEZ1bmN0b3JzLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NUTF9GVU5DVE9SU19ICisjZGVmaW5lIEVJR0VOX1NUTF9GVU5DVE9SU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGRlZmF1bHQgZnVuY3RvciB0cmFpdHMgZm9yIFNUTCBmdW5jdG9yczoKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Om11bHRpcGxpZXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmRpdmlkZXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnBsdXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Om1pbnVzPFQ+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8VD46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpuZWdhdGU8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmxvZ2ljYWxfb3I8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpsb2dpY2FsX2FuZDxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmxvZ2ljYWxfbm90PFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6Z3JlYXRlcjxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Omxlc3M8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpncmVhdGVyX2VxdWFsPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6bGVzc19lcXVhbDxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmVxdWFsX3RvPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6bm90X2VxdWFsX3RvPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkgJiYgKEVJR0VOX0NPTVBfTVNWQyA8PSAxOTAwKQorLy8gc3RkOjpiaW5kZXIqIGFyZSBkZXByZWNhdGVkIHNpbmNlIGMrKzExIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYysrMTcKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpiaW5kZXIybmQ8VD4gPgoreyBlbnVtIHsgQ29zdCA9IGZ1bmN0b3JfdHJhaXRzPFQ+OjpDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6YmluZGVyMXN0PFQ+ID4KK3sgZW51bSB7IENvc3QgPSBmdW5jdG9yX3RyYWl0czxUPjo6Q29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6dW5hcnlfbmVnYXRlPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxICsgZnVuY3Rvcl90cmFpdHM8VD46OkNvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpiaW5hcnlfbmVnYXRlPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxICsgZnVuY3Rvcl90cmFpdHM8VD46OkNvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKKyNpZmRlZiBFSUdFTl9TVERFWFRfU1VQUE9SVAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCx0eXBlbmFtZSBUMT4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnByb2plY3Qxc3Q8VDAsVDE+ID4KK3sgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCx0eXBlbmFtZSBUMT4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnByb2plY3QybmQ8VDAsVDE+ID4KK3sgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCx0eXBlbmFtZSBUMT4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnNlbGVjdDJuZDxzdGQ6OnBhaXI8VDAsVDE+ID4gPgoreyBlbnVtIHsgQ29zdCA9IDAsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLHR5cGVuYW1lIFQxPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6c2VsZWN0MXN0PHN0ZDo6cGFpcjxUMCxUMT4gPiA+Cit7IGVudW0geyBDb3N0ID0gMCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVDAsdHlwZW5hbWUgVDE+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjp1bmFyeV9jb21wb3NlPFQwLFQxPiA+Cit7IGVudW0geyBDb3N0ID0gZnVuY3Rvcl90cmFpdHM8VDA+OjpDb3N0ICsgZnVuY3Rvcl90cmFpdHM8VDE+OjpDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmJpbmFyeV9jb21wb3NlPFQwLFQxLFQyPiA+Cit7IGVudW0geyBDb3N0ID0gZnVuY3Rvcl90cmFpdHM8VDA+OjpDb3N0ICsgZnVuY3Rvcl90cmFpdHM8VDE+OjpDb3N0ICsgZnVuY3Rvcl90cmFpdHM8VDI+OjpDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisjZW5kaWYgLy8gRUlHRU5fU1RERVhUX1NVUFBPUlQKKworLy8gYWxsb3cgdG8gYWRkIG5ldyBmdW5jdG9ycyBhbmQgc3BlY2lhbGl6YXRpb25zIG9mIGZ1bmN0b3JfdHJhaXRzIGZyb20gb3V0c2lkZSBFaWdlbi4KKy8vIHRoaXMgbWFjcm8gaXMgcmVhbGx5IG5lZWRlZCBiZWNhdXNlIGZ1bmN0b3JfdHJhaXRzIG11c3QgYmUgc3BlY2lhbGl6ZWQgYWZ0ZXIgaXQgaXMgZGVjbGFyZWQgYnV0IGJlZm9yZSBpdCBpcyB1c2VkLi4uCisjaWZkZWYgRUlHRU5fRlVOQ1RPUlNfUExVR0lOCisjaW5jbHVkZSBFSUdFTl9GVU5DVE9SU19QTFVHSU4KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TVExfRlVOQ1RPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvVGVybmFyeUZ1bmN0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9mdW5jdG9ycy9UZXJuYXJ5RnVuY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU0ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvZnVuY3RvcnMvVGVybmFyeUZ1bmN0b3JzLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgRXVnZW5lIEJyZXZkbyA8ZWJyZXZkb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RFUk5BUllfRlVOQ1RPUlNfSAorI2RlZmluZSBFSUdFTl9URVJOQVJZX0ZVTkNUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8tLS0tLS0tLS0tIGFzc29jaWF0aXZlIHRlcm5hcnkgZnVuY3RvcnMgLS0tLS0tLS0tLQorCisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVEVSTkFSWV9GVU5DVE9SU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9mdW5jdG9ycy9VbmFyeUZ1bmN0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9mdW5jdG9ycy9VbmFyeUZ1bmN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5NmRiMwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2Z1bmN0b3JzL1VuYXJ5RnVuY3RvcnMuaApAQCAtMCwwICsxLDEwNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1VOQVJZX0ZVTkNUT1JTX0gKKyNkZWZpbmUgRUlHRU5fVU5BUllfRlVOQ1RPUlNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBvcHBvc2l0ZSBvZiBhIHNjYWxhcgorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6Om9wZXJhdG9yLQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9vcHBvc2l0ZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9vcHBvc2l0ZV9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIKKyAgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gLWE7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQKKyAgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbmVnYXRlKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTmVnYXRlCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIHNjYWxhcgorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjphYnMKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfYWJzX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Fic19vcCkKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCByZXN1bHRfdHlwZQorICBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OmFicyhhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldAorICBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBhYnMoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9hYnNfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQWJzCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzY29yZSBvZiBhIHNjYWxhciwgdG8gY2hvc2UgYSBwaXZvdAorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfc2NvcmVfY29lZmZfb3AgOiBzY2FsYXJfYWJzX29wPFNjYWxhcj4geworICB0eXBlZGVmIHZvaWQgU2NvcmVfaXNfYWJzOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3Njb3JlX2NvZWZmX29wPFNjYWxhcj4gPgorICAgIDogZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Fic19vcDxTY2FsYXI+ID4ge307CisKKy8qIEF2b2lkIHJlY29tcHV0aW5nIGFicyB3aGVuIHdlIGtub3cgdGhlIHNjb3JlIGFuZCB0aGV5IGFyZSB0aGUgc2FtZS4gTm90IGEKKyAqIHRydWUgRWlnZW4gZnVuY3Rvci4gICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSA9IHZvaWQ+CitzdHJ1Y3QgYWJzX2tub3dpbmdfc2NvcmUgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihhYnNfa25vd2luZ19zY29yZSkKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCByZXN1bHRfdHlwZTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjb3JlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlCisgIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY29yZSYpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjphYnMoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGFic19rbm93aW5nX3Njb3JlPFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzY2FsYXJfc2NvcmVfY29lZmZfb3A8U2NhbGFyPjo6U2NvcmVfaXNfYWJzPiB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKGFic19rbm93aW5nX3Njb3JlKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCByZXN1bHRfdHlwZQorICBvcGVyYXRvcigpKGNvbnN0IFNjYWwmLCBjb25zdCByZXN1bHRfdHlwZSYgYSkgY29uc3QgeworICAgIHJldHVybiBhOworICB9Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzcXVhcmVkIGFic29sdXRlIHZhbHVlIG9mIGEgc2NhbGFyCisgKgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmFiczIKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfYWJzMl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9hYnMyX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6YWJzMihhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldAorICBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9hYnMyX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0FiczIKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGNvbmp1Z2F0ZSBvZiBhIGNvbXBsZXggdmFsdWUKKyAqCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBNYXRyaXhCYXNlOjpjb25qdWdhdGUoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jb25qdWdhdGVfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY29uanVnYXRlX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHVzaW5nIG51bWV4dDo6Y29uajsKKyAgICByZXR1cm4gY29uaihhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldAorICBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBjb25qKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ID8gTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgOiAwLAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQ29uagorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgcGhhc2UgYW5nbGUgb2YgYSBjb21wbGV4CisgKgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmFyZworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9hcmdfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYXJnX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlCisgIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgdXNpbmcgbnVtZXh0Ojphcmc7CisgICAgcmV0dXJuIGFyZyhhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldAorICBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBhcmcoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9hcmdfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggPyA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQXJnCisgIH07Cit9OworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY2FzdCBhIHNjYWxhciB0byBhbm90aGVyIHR5cGUKKyAqCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBNYXRyaXhCYXNlOjpjYXN0KCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgTmV3VHlwZT4KK3N0cnVjdCBzY2FsYXJfY2FzdF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jYXN0X29wKQorICB0eXBlZGVmIE5ld1R5cGUgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgTmV3VHlwZQorICBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFNjYWxhciwgTmV3VHlwZT4oYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBOZXdUeXBlPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jYXN0X29wPFNjYWxhciwgTmV3VHlwZT4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBpc19zYW1lPFNjYWxhciwgTmV3VHlwZT46OnZhbHVlID8gMCA6IE51bVRyYWl0czxOZXdUeXBlPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZQorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gZXh0cmFjdCB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleAorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6OnJlYWwoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9yZWFsX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3JlYWxfb3ApCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjpyZWFsKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcmVhbF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsgQ29zdCA9IDAsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBleHRyYWN0IHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXgKKyAqCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBNYXRyaXhCYXNlOjppbWFnKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfaW1hZ19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pbWFnX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6aW1hZyhhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2ltYWdfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gZXh0cmFjdCB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBhcyBhIHJlZmVyZW5jZQorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6OnJlYWwoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9yZWFsX3JlZl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9yZWFsX3JlZl9vcCkKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSByZXN1bHRfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjpyZWFsX3JlZigqY29uc3RfY2FzdDxTY2FsYXIqPigmYSkpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcmVhbF9yZWZfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gZXh0cmFjdCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IGFzIGEKKyAqIHJlZmVyZW5jZQorICoKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6OmltYWcoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9pbWFnX3JlZl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pbWFnX3JlZl9vcCkKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSByZXN1bHRfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjppbWFnX3JlZigqY29uc3RfY2FzdDxTY2FsYXIqPigmYSkpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaW1hZ19yZWZfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICoKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGV4cG9uZW50aWFsIG9mIGEgc2NhbGFyCisgKgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmV4cCgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2V4cF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9leHBfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjpleHAoYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBleHAoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9leHBfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNFeHAsCisgIC8vIFRoZSBmb2xsb3dpbmcgbnVtYmVycyBhcmUgYmFzZWQgb24gdGhlIEFWWCBpbXBsZW1lbnRhdGlvbi4KKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfRk1BCisgICAgLy8gSGFzd2VsbCBjYW4gaXNzdWUgMiBhZGQvbXVsL21hZGQgcGVyIGN5Y2xlLgorICAgIENvc3QgPQorICAgICAgICAoc2l6ZW9mKFNjYWxhcikgPT0gNAorICAgICAgICAgICAgIC8vIGZsb2F0OiA4IHBtYWRkLCA0IHBtdWwsIDIgcGFkZC9wc3ViLCA2IG90aGVyCisgICAgICAgICAgICAgPyAoOCAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0ICsgNiAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0KQorICAgICAgICAgICAgIC8vIGRvdWJsZTogNyBwbWFkZCwgNSBwbXVsLCAzIHBhZGQvcHN1YiwgMSBkaXYsICAxMyBvdGhlcgorICAgICAgICAgICAgIDogKDE0ICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKworICAgICAgICAgICAgICAgIDYgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArCisgICAgICAgICAgICAgICAgc2NhbGFyX2Rpdl9jb3N0PFNjYWxhciwgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNEaXY+Ojp2YWx1ZSkpCisjZWxzZQorICAgIENvc3QgPQorICAgICAgICAoc2l6ZW9mKFNjYWxhcikgPT0gNAorICAgICAgICAgICAgIC8vIGZsb2F0OiA3IHBtYWRkLCA2IHBtdWwsIDQgcGFkZC9wc3ViLCAxMCBvdGhlcgorICAgICAgICAgICAgID8gKDIxICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKworICAgICAgICAgICAgICAgIDEzICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QpCisgICAgICAgICAgICAgLy8gZG91YmxlOiA3IHBtYWRkLCA1IHBtdWwsIDMgcGFkZC9wc3ViLCAxIGRpdiwgIDEzIG90aGVyCisgICAgICAgICAgICAgOiAoMjMgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCArCisgICAgICAgICAgICAgICAgMTIgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArCisgICAgICAgICAgICAgICAgc2NhbGFyX2Rpdl9jb3N0PFNjYWxhciwgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNEaXY+Ojp2YWx1ZSkpCisjZW5kaWYKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBsb2dhcml0aG0gb2YgYSBzY2FsYXIKKyAqCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmxvZygpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2xvZ19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9sb2dfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0Ojpsb2coYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2coYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9sb2dfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNMb2csCisgICAgQ29zdCA9IChQYWNrZXRBY2Nlc3MKKyAgLy8gVGhlIGZvbGxvd2luZyBudW1iZXJzIGFyZSBiYXNlZCBvbiB0aGUgQVZYIGltcGxlbWVudGF0aW9uLgorI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9GTUEKKyAgICAgICAgICAgICAgICAvLyA4IHBtYWRkLCA2IHBtdWwsIDggcGFkZC9wc3ViLCAxNiBvdGhlciwgY2FuIGlzc3VlIDIKKyAgICAgICAgICAgICAgICAvLyBhZGQvbXVsL21hZGQgcGVyIGN5Y2xlLgorICAgICAgICAgICAgICAgID8gKDIwICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKworICAgICAgICAgICAgICAgICAgIDcgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCkKKyNlbHNlCisgICAgICAgICAgICAgICAgLy8gOCBwbWFkZCwgNiBwbXVsLCA4IHBhZGQvcHN1YiwgMjAgb3RoZXIKKyAgICAgICAgICAgICAgICA/ICgzNiAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0ICsKKyAgICAgICAgICAgICAgICAgICAxNCAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0KQorI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gTWVhc3VyZWQgY29zdCBvZiBzdGQ6OmxvZy4KKyAgICAgICAgICAgICAgICA6IHNpemVvZihTY2FsYXIpID09IDQgPyA0MCA6IDg1KQorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICoKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGxvZ2FyaXRobSBvZiAxIHBsdXMgYSBzY2FsYXIgdmFsdWUKKyAqCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmxvZzFwKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfbG9nMXBfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfbG9nMXBfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0Ojpsb2cxcChhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvZzFwKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfbG9nMXBfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNMb2cxcCwKKyAgICBDb3N0ID0gZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2xvZ19vcDxTY2FsYXI+ID46OkNvc3QgIC8vIFRPRE8gbWVhc3VyZSBjb3N0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cxcAorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICoKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGJhc2UtMTAgbG9nYXJpdGhtIG9mIGEgc2NhbGFyCisgKgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmxvZzEwKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfbG9nMTBfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfbG9nMTBfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICBFSUdFTl9VU0lOR19TVERfTUFUSChsb2cxMCkgcmV0dXJuIGxvZzEwKGEpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9nMTAoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9sb2cxMF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTG9nMTAKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHNxdWFyZSByb290IG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBDd2lzZTo6c3FydCgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3NxcnRfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfc3FydF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OnNxcnQoYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBzcXJ0KGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfc3FydF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyNpZiBFSUdFTl9GQVNUX01BVEgKKyAgICAvLyBUaGUgZm9sbG93aW5nIG51bWJlcnMgYXJlIGJhc2VkIG9uIHRoZSBBVlggaW1wbGVtZW50YXRpb24uCisgICAgQ29zdCA9IChzaXplb2YoU2NhbGFyKSA9PSA4ID8gMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBwbXVsLCAxIHBtYWRkLCAzIG90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKDMgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCkpLAorI2Vsc2UKKyAgICAvLyBUaGUgZm9sbG93aW5nIG51bWJlcnMgYXJlIGJhc2VkIG9uIG1pbiBWU1FSVCB0aHJvdWdocHV0IG9uIEhhc3dlbGwuCisgICAgQ29zdCA9IChzaXplb2YoU2NhbGFyKSA9PSA4ID8gMjggOiAxNCksCisjZW5kaWYKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NxcnQKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHJlY2lwcm9jYWwgc3F1YXJlIHJvb3Qgb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpyc3FydCgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3JzcXJ0X29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3JzcXJ0X29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIFNjYWxhcigxKSAvIG51bWV4dDo6c3FydChhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cHJzcXJ0KGEpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9yc3FydF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzUnNxcnQKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGNvc2luZSBvZiBhIHNjYWxhcgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjpjb3MoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jb3Nfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY29zX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6Y29zKGEpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwY29zKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfY29zX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNDb3MKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHNpbmUgb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6c2luKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfc2luX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3Npbl9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OnNpbihhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cHNpbihhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3Npbl9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzU2luCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSB0YW4gb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6dGFuKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfdGFuX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3Rhbl9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OnRhbihhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cHRhbihhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3Rhbl9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzVGFuCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBhcmMgY29zaW5lIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmFjb3MoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9hY29zX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Fjb3Nfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjphY29zKGEpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwYWNvcyhhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Fjb3Nfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0FDb3MKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGFyYyBzaW5lIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmFzaW4oKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9hc2luX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2FzaW5fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0Ojphc2luKGEpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwYXNpbihhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2FzaW5fb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0FTaW4KKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGF0YW4gb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6YXRhbigpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2F0YW5fb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYXRhbl9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OmF0YW4oYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBhdGFuKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfYXRhbl9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQVRhbgorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgdGFuaCBvZiBhIHNjYWxhcgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjp0YW5oKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfdGFuaF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl90YW5oX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6dGFuaChhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgeCkgY29uc3QgeworICAgIHJldHVybiBwdGFuaCh4KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfdGFuaF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1RhbmgsCisgICAgQ29zdCA9CisgICAgICAgICgoRUlHRU5fRkFTVF9NQVRIICYmIGlzX3NhbWU8U2NhbGFyLCBmbG9hdD46OnZhbHVlKQorLy8gVGhlIGZvbGxvd2luZyBudW1iZXJzIGFyZSBiYXNlZCBvbiB0aGUgQVZYIGltcGxlbWVudGF0aW9uLAorI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9GTUEKKyAgICAgICAgICAgICAvLyBIYXN3ZWxsIGNhbiBpc3N1ZSAyIGFkZC9tdWwvbWFkZCBwZXIgY3ljbGUuCisgICAgICAgICAgICAgLy8gOSBwbWFkZCwgMiBwbXVsLCAxIGRpdiwgMiBvdGhlcgorICAgICAgICAgICAgID8gKDIgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCArCisgICAgICAgICAgICAgICAgNiAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsKKyAgICAgICAgICAgICAgICBzY2FsYXJfZGl2X2Nvc3Q8U2NhbGFyLCBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0Rpdj46OnZhbHVlKQorI2Vsc2UKKyAgICAgICAgICAgICA/ICgxMSAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0ICsKKyAgICAgICAgICAgICAgICAxMSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsKKyAgICAgICAgICAgICAgICBzY2FsYXJfZGl2X2Nvc3Q8U2NhbGFyLCBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0Rpdj46OnZhbHVlKQorI2VuZGlmCisgICAgICAgICAgICAgLy8gVGhpcyBudW1iZXIgYXNzdW1lcyBhIG5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRhbmgKKyAgICAgICAgICAgICA6ICg2ICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKworICAgICAgICAgICAgICAgIDMgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArCisgICAgICAgICAgICAgICAgMiAqIHNjYWxhcl9kaXZfY29zdDxTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0Rpdj46OnZhbHVlICsKKyAgICAgICAgICAgICAgICBmdW5jdG9yX3RyYWl0czxzY2FsYXJfZXhwX29wPFNjYWxhcj4gPjo6Q29zdCkpCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzaW5oIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OnNpbmgoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9zaW5oX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3Npbmhfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0OjpzaW5oKGEpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwc2luaChhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3Npbmhfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NpbmgKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGNvc2ggb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6Y29zaCgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2Nvc2hfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY29zaF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6OmNvc2goYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBjb3NoKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfY29zaF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQ29zaAorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgaW52ZXJzZSBvZiBhIHNjYWxhcgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmludmVyc2UoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9pbnZlcnNlX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2ludmVyc2Vfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NhbGFyKDEpIC8gYTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGRpdihwc2V0MTxQYWNrZXQ+KFNjYWxhcigxKSksIGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaW52ZXJzZV9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNEaXYKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHNxdWFyZSBvZiBhIHNjYWxhcgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OnNxdWFyZSgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3NxdWFyZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9zcXVhcmVfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gYSAqIGE7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9zcXVhcmVfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTXVsCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBjdWJlIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBDd2lzZTo6Y3ViZSgpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2N1YmVfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY3ViZV9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiBhICogYSAqIGE7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgcG11bChhLCBhKSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jdWJlX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSAyICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNNdWwKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHJvdW5kZWQgdmFsdWUgb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6cm91bmQoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9yb3VuZF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9yb3VuZF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIKKyAgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtZXh0Ojpyb3VuZChhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cHJvdW5kKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcm91bmRfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzUm91bmQKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGZsb29yIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmZsb29yKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZmxvb3Jfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfZmxvb3Jfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyCisgIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6Zmxvb3IoYSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBmbG9vcihhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Zsb29yX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0Zsb29yCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBjZWlsIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmNlaWwoKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jZWlsX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2NlaWxfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyCisgIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6Y2VpbChhKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGNlaWwoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jZWlsX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0NlaWwKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgd2hldGhlciBhIHNjYWxhciBpcyBOYU4KKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6aXNuYW4oKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9pc25hbl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pc25hbl9vcCkKKyAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHJlc3VsdF90eXBlCisgIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgcmV0dXJuIChudW1leHQ6OmlzbmFuKShhKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2lzbmFuX29wPFNjYWxhcj4gPiB7CisgIGVudW0geyBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjaGVjayB3aGV0aGVyIGEgc2NhbGFyIGlzICsvLWluZgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjppc2luZigpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2lzaW5mX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2lzaW5mX29wKQorICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgcmVzdWx0X3R5cGUKKyAgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gKG51bWV4dDo6aXNpbmYpKGEpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaXNpbmZfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNoZWNrIHdoZXRoZXIgYSBzY2FsYXIgaGFzIGEgZmluaXRlIHZhbHVlCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmlzZmluaXRlKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfaXNmaW5pdGVfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfaXNmaW5pdGVfb3ApCisgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSByZXN1bHRfdHlwZQorICBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeworICAgIHJldHVybiAobnVtZXh0Ojppc2Zpbml0ZSkoYSk7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9pc2Zpbml0ZV9vcDxTY2FsYXI+ID4geworICBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgbG9naWNhbCBub3Qgb2YgYSBib29sZWFuCisgKgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjpvcGVyYXRvciEKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfYm9vbGVhbl9ub3Rfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYm9vbGVhbl9ub3Rfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJvb2wmIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gIWE7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9ib29sZWFuX25vdF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxib29sPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHNpZ251bSBvZiBhIHNjYWxhcgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OnNpZ24oKQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBib29sIGlzY3B4ID0gKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggIT0gMCk+CitzdHJ1Y3Qgc2NhbGFyX3NpZ25fb3A7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9zaWduX29wPFNjYWxhciwgZmFsc2U+IHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3NpZ25fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NhbGFyKChhID4gU2NhbGFyKDApKSAtIChhIDwgU2NhbGFyKDApKSk7CisgIH0KKyAgLy8gVE9ETworICAvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICAvLyBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4KKyAgLy8gaW50ZXJuYWw6OnBzaWduKGEpOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfc2lnbl9vcDxTY2FsYXIsIHRydWU+IHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3NpZ25fb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlYWxfdHlwZTsKKyAgICByZWFsX3R5cGUgYWEgPSBudW1leHQ6OmFicyhhKTsKKyAgICBpZiAoYWEgPT0gcmVhbF90eXBlKDApKSByZXR1cm4gU2NhbGFyKDApOworICAgIGFhID0gcmVhbF90eXBlKDEpIC8gYWE7CisgICAgcmV0dXJuIFNjYWxhcihyZWFsKGEpICogYWEsIGltYWcoYSkgKiBhYSk7CisgIH0KKyAgLy8gVE9ETworICAvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICAvLyBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4KKyAgLy8gaW50ZXJuYWw6OnBzaWduKGEpOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfc2lnbl9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleAorICAgICAgICAgICAgICAgPyAoOCAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0KSAgLy8gcm91Z2hseQorICAgICAgICAgICAgICAgOiAoMyAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NpZ24KKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGxvZ2lzdGljIGZ1bmN0aW9uIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OmxvZ2lzdGljKCkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc2NhbGFyX2xvZ2lzdGljX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2xvZ2lzdGljX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgb3BlcmF0b3IoKShjb25zdCBUJiB4KSBjb25zdCB7CisgICAgY29uc3QgVCBvbmUgPSBUKDEpOworICAgIHJldHVybiBvbmUgLyAob25lICsgbnVtZXh0OjpleHAoLXgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgeCkgY29uc3QgeworICAgIGNvbnN0IFBhY2tldCBvbmUgPSBwc2V0MTxQYWNrZXQ+KFQoMSkpOworICAgIHJldHVybiBwZGl2KG9uZSwgcGFkZChvbmUsIHBleHAocG5lZ2F0ZSh4KSkpKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9sb2dpc3RpY19vcDxUPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCAqIDIgKyBOdW1UcmFpdHM8VD46Ok11bENvc3QgKiA2LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8VD46Okhhc0FkZCAmJiBwYWNrZXRfdHJhaXRzPFQ+OjpIYXNEaXYgJiYKKyAgICAgICAgICAgICAgICAgICBwYWNrZXRfdHJhaXRzPFQ+OjpIYXNOZWdhdGUgJiYgcGFja2V0X3RyYWl0czxUPjo6SGFzRXhwCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgdGhlIGxvZ2lzdGljIGZ1bmN0aW9uIGZvciBmbG9hdC4KKyAqCisgKiAgVXNlcyBqdXN0IGEgOS8xMC1kZWdyZWUgcmF0aW9uYWwgaW50ZXJwb2xhbnQgd2hpY2gKKyAqICBpbnRlcnBvbGF0ZXMgMS8oMStleHAoLXgpKSAtIDAuNSB1cCB0byBhIGNvdXBsZSBvZiB1bHAgaW4gdGhlIHJhbmdlCisgKiAgWy0xOCwgMThdLCBvdXRzaWRlIG9mIHdoaWNoIHRoZSBmbChsb2dpc3RpYyh4KSkgPSB7MHwxfS4gVGhlIHNoaWZ0ZWQKKyAqICBsb2dpc3RpYyBpcyBpbnRlcnBvbGF0ZWQgYmVjYXVzZSBpdCB3YXMgZWFzaWVyIHRvIG1ha2UgdGhlIGZpdCBjb252ZXJnZS4KKyAqCisgKi8KKwordGVtcGxhdGUgPD4KK3N0cnVjdCBzY2FsYXJfbG9naXN0aWNfb3A8ZmxvYXQ+IHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2xvZ2lzdGljX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgZmxvYXQmIHgpIGNvbnN0IHsKKyAgICBjb25zdCBmbG9hdCBvbmUgPSAxLjBmOworICAgIHJldHVybiBvbmUgLyAob25lICsgbnVtZXh0OjpleHAoLXgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0CisgIHBhY2tldE9wKGNvbnN0IFBhY2tldCYgX3gpIGNvbnN0IHsKKyAgICAvLyBDbGFtcCB0aGUgaW5wdXRzIHRvIHRoZSByYW5nZSBbLTE4LCAxOF0gc2luY2UgYW55dGhpbmcgb3V0c2lkZQorICAgIC8vIHRoaXMgcmFuZ2UgaXMgMC4wZiBvciAxLjBmIGluIHNpbmdsZS1wcmVjaXNpb24uCisgICAgY29uc3QgUGFja2V0IHggPSBwbWF4KHBtaW4oX3gsIHBzZXQxPFBhY2tldD4oMTguMCkpLCBwc2V0MTxQYWNrZXQ+KC0xOC4wKSk7CisKKyAgICAvLyBUaGUgbW9ub21pYWwgY29lZmZpY2llbnRzIG9mIHRoZSBudW1lcmF0b3IgcG9seW5vbWlhbCAob2RkKS4KKyAgICBjb25zdCBQYWNrZXQgYWxwaGFfMSA9IHBzZXQxPFBhY2tldD4oMi40ODI4Nzk0NzA2MTUyOWUtMDEpOworICAgIGNvbnN0IFBhY2tldCBhbHBoYV8zID0gcHNldDE8UGFja2V0Pig4LjUxMzc3MTMzMzA0NzAxZS0wMyk7CisgICAgY29uc3QgUGFja2V0IGFscGhhXzUgPSBwc2V0MTxQYWNrZXQ+KDYuMDg1NzQ4NjQ2MDAxNDNlLTA1KTsKKyAgICBjb25zdCBQYWNrZXQgYWxwaGFfNyA9IHBzZXQxPFBhY2tldD4oMS4xNTYyNzMyNDQ1OTk0MmUtMDcpOworICAgIGNvbnN0IFBhY2tldCBhbHBoYV85ID0gcHNldDE8UGFja2V0Pig0LjM3MDMxMDEyNTc5ODAxZS0xMSk7CisKKyAgICAvLyBUaGUgbW9ub21pYWwgY29lZmZpY2llbnRzIG9mIHRoZSBkZW5vbWluYXRvciBwb2x5bm9taWFsIChldmVuKS4KKyAgICBjb25zdCBQYWNrZXQgYmV0YV8wID0gcHNldDE8UGFja2V0Pig5LjkzMTUxOTIxMDIzMTgwZS0wMSk7CisgICAgY29uc3QgUGFja2V0IGJldGFfMiA9IHBzZXQxPFBhY2tldD4oMS4xNjgxNzY1NjkwNDQ1M2UtMDEpOworICAgIGNvbnN0IFBhY2tldCBiZXRhXzQgPSBwc2V0MTxQYWNrZXQ+KDEuNzAxOTg4MTczNzQwOTRlLTAzKTsKKyAgICBjb25zdCBQYWNrZXQgYmV0YV82ID0gcHNldDE8UGFja2V0Pig2LjI5MTA2Nzg1MDE3MDQwZS0wNik7CisgICAgY29uc3QgUGFja2V0IGJldGFfOCA9IHBzZXQxPFBhY2tldD4oNS43NjEwMjEzNjk5MzQyN2UtMDkpOworICAgIGNvbnN0IFBhY2tldCBiZXRhXzEwID0gcHNldDE8UGFja2V0Pig2LjEwMjQ3Mzg5NzU1NjgxZS0xMyk7CisKKyAgICAvLyBTaW5jZSB0aGUgcG9seW5vbWlhbHMgYXJlIG9kZC9ldmVuLCB3ZSBuZWVkIHheMi4KKyAgICBjb25zdCBQYWNrZXQgeDIgPSBwbXVsKHgsIHgpOworCisgICAgLy8gRXZhbHVhdGUgdGhlIG51bWVyYXRvciBwb2x5bm9taWFsIHAuCisgICAgUGFja2V0IHAgPSBwbWFkZCh4MiwgYWxwaGFfOSwgYWxwaGFfNyk7CisgICAgcCA9IHBtYWRkKHgyLCBwLCBhbHBoYV81KTsKKyAgICBwID0gcG1hZGQoeDIsIHAsIGFscGhhXzMpOworICAgIHAgPSBwbWFkZCh4MiwgcCwgYWxwaGFfMSk7CisgICAgcCA9IHBtdWwoeCwgcCk7CisKKyAgICAvLyBFdmFsdWF0ZSB0aGUgZGVub21pbmF0b3IgcG9seW5vbWlhbCBwLgorICAgIFBhY2tldCBxID0gcG1hZGQoeDIsIGJldGFfMTAsIGJldGFfOCk7CisgICAgcSA9IHBtYWRkKHgyLCBxLCBiZXRhXzYpOworICAgIHEgPSBwbWFkZCh4MiwgcSwgYmV0YV80KTsKKyAgICBxID0gcG1hZGQoeDIsIHEsIGJldGFfMik7CisgICAgcSA9IHBtYWRkKHgyLCBxLCBiZXRhXzApOworCisgICAgLy8gRGl2aWRlIHRoZSBudW1lcmF0b3IgYnkgdGhlIGRlbm9taW5hdG9yIGFuZCBzaGlmdCBpdCB1cC4KKyAgICByZXR1cm4gcG1heChwbWluKHBhZGQocGRpdihwLCBxKSwgcHNldDE8UGFja2V0PigwLjUpKSwgcHNldDE8UGFja2V0PigxLjApKSwKKyAgICAgICAgICAgICAgICBwc2V0MTxQYWNrZXQ+KDAuMCkpOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBFSUdFTl9GVU5DVE9SU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsQmxvY2tQYW5lbEtlcm5lbC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbEJsb2NrUGFuZWxLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTIzMGJjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbEJsb2NrUGFuZWxLZXJuZWwuaApAQCAtMCwwICsxLDIxNDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfQkxPQ0tfUEFORUxfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX0JMT0NLX1BBTkVMX0gKKworCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyLCBib29sIF9Db25qTGhzPWZhbHNlLCBib29sIF9Db25qUmhzPWZhbHNlPgorY2xhc3MgZ2VicF90cmFpdHM7CisKKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBiIGlmIGE8PTAsIGFuZCByZXR1cm5zIGEgb3RoZXJ3aXNlLiAqLworaW5saW5lIHN0ZDo6cHRyZGlmZl90IG1hbmFnZV9jYWNoaW5nX3NpemVzX2hlbHBlcihzdGQ6OnB0cmRpZmZfdCBhLCBzdGQ6OnB0cmRpZmZfdCBiKQoreworICByZXR1cm4gYTw9MCA/IGIgOiBhOworfQorCisjaWYgRUlHRU5fQVJDSF9pMzg2X09SX3g4Nl82NAorY29uc3Qgc3RkOjpwdHJkaWZmX3QgZGVmYXVsdEwxQ2FjaGVTaXplID0gMzIqMTAyNDsKK2NvbnN0IHN0ZDo6cHRyZGlmZl90IGRlZmF1bHRMMkNhY2hlU2l6ZSA9IDI1NioxMDI0OworY29uc3Qgc3RkOjpwdHJkaWZmX3QgZGVmYXVsdEwzQ2FjaGVTaXplID0gMioxMDI0KjEwMjQ7CisjZWxzZQorY29uc3Qgc3RkOjpwdHJkaWZmX3QgZGVmYXVsdEwxQ2FjaGVTaXplID0gMTYqMTAyNDsKK2NvbnN0IHN0ZDo6cHRyZGlmZl90IGRlZmF1bHRMMkNhY2hlU2l6ZSA9IDUxMioxMDI0OworY29uc3Qgc3RkOjpwdHJkaWZmX3QgZGVmYXVsdEwzQ2FjaGVTaXplID0gNTEyKjEwMjQ7CisjZW5kaWYKKworLyoqIFxpbnRlcm5hbCAqLworc3RydWN0IENhY2hlU2l6ZXMgeworICBDYWNoZVNpemVzKCk6IG1fbDEoLTEpLG1fbDIoLTEpLG1fbDMoLTEpIHsKKyAgICBpbnQgbDFDYWNoZVNpemUsIGwyQ2FjaGVTaXplLCBsM0NhY2hlU2l6ZTsKKyAgICBxdWVyeUNhY2hlU2l6ZXMobDFDYWNoZVNpemUsIGwyQ2FjaGVTaXplLCBsM0NhY2hlU2l6ZSk7CisgICAgbV9sMSA9IG1hbmFnZV9jYWNoaW5nX3NpemVzX2hlbHBlcihsMUNhY2hlU2l6ZSwgZGVmYXVsdEwxQ2FjaGVTaXplKTsKKyAgICBtX2wyID0gbWFuYWdlX2NhY2hpbmdfc2l6ZXNfaGVscGVyKGwyQ2FjaGVTaXplLCBkZWZhdWx0TDJDYWNoZVNpemUpOworICAgIG1fbDMgPSBtYW5hZ2VfY2FjaGluZ19zaXplc19oZWxwZXIobDNDYWNoZVNpemUsIGRlZmF1bHRMM0NhY2hlU2l6ZSk7CisgIH0KKworICBzdGQ6OnB0cmRpZmZfdCBtX2wxOworICBzdGQ6OnB0cmRpZmZfdCBtX2wyOworICBzdGQ6OnB0cmRpZmZfdCBtX2wzOworfTsKKworCisvKiogXGludGVybmFsICovCitpbmxpbmUgdm9pZCBtYW5hZ2VfY2FjaGluZ19zaXplcyhBY3Rpb24gYWN0aW9uLCBzdGQ6OnB0cmRpZmZfdCogbDEsIHN0ZDo6cHRyZGlmZl90KiBsMiwgc3RkOjpwdHJkaWZmX3QqIGwzKQoreworICBzdGF0aWMgQ2FjaGVTaXplcyBtX2NhY2hlU2l6ZXM7CisKKyAgaWYoYWN0aW9uPT1TZXRBY3Rpb24pCisgIHsKKyAgICAvLyBzZXQgdGhlIGNwdSBjYWNoZSBzaXplIGFuZCBjYWNoZSBhbGwgYmxvY2sgc2l6ZXMgZnJvbSBhIGdsb2JhbCBjYWNoZSBzaXplIGluIGJ5dGUKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQobDEhPTAgJiYgbDIhPTApOworICAgIG1fY2FjaGVTaXplcy5tX2wxID0gKmwxOworICAgIG1fY2FjaGVTaXplcy5tX2wyID0gKmwyOworICAgIG1fY2FjaGVTaXplcy5tX2wzID0gKmwzOworICB9CisgIGVsc2UgaWYoYWN0aW9uPT1HZXRBY3Rpb24pCisgIHsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQobDEhPTAgJiYgbDIhPTApOworICAgICpsMSA9IG1fY2FjaGVTaXplcy5tX2wxOworICAgICpsMiA9IG1fY2FjaGVTaXplcy5tX2wyOworICAgICpsMyA9IG1fY2FjaGVTaXplcy5tX2wzOworICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChmYWxzZSk7CisgIH0KK30KKworLyogSGVscGVyIGZvciBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXMuCisgKgorICogR2l2ZW4gYSBtIHggayB0aW1lcyBrIHggbiBtYXRyaXggcHJvZHVjdCBvZiBzY2FsYXIgdHlwZXMgXGMgTGhzU2NhbGFyIGFuZCBcYyBSaHNTY2FsYXIsCisgKiB0aGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBibG9ja2luZyBzaXplIHBhcmFtZXRlcnMgYWxvbmcgdGhlIHJlc3BlY3RpdmUgZGltZW5zaW9ucworICogZm9yIG1hdHJpeCBwcm9kdWN0cyBhbmQgcmVsYXRlZCBhbGdvcml0aG1zLiBUaGUgYmxvY2tpbmcgc2l6ZXMgZGVwZW5kcyBvbiB2YXJpb3VzCisgKiBwYXJhbWV0ZXJzOgorICogLSB0aGUgTDEgYW5kIEwyIGNhY2hlIHNpemVzLAorICogLSB0aGUgcmVnaXN0ZXIgbGV2ZWwgYmxvY2tpbmcgc2l6ZXMgZGVmaW5lZCBieSBnZWJwX3RyYWl0cywKKyAqIC0gdGhlIG51bWJlciBvZiBzY2FsYXJzIHRoYXQgZml0IGludG8gYSBwYWNrZXQgKHdoZW4gdmVjdG9yaXphdGlvbiBpcyBlbmFibGVkKS4KKyAqCisgKiBcc2Egc2V0Q3B1Q2FjaGVTaXplcyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IEtjRmFjdG9yLCB0eXBlbmFtZSBJbmRleD4KK3ZvaWQgZXZhbHVhdGVQcm9kdWN0QmxvY2tpbmdTaXplc0hldXJpc3RpYyhJbmRleCYgaywgSW5kZXgmIG0sIEluZGV4JiBuLCBJbmRleCBudW1fdGhyZWFkcyA9IDEpCit7CisgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj4gVHJhaXRzOworCisgIC8vIEV4cGxhbmF0aW9uczoKKyAgLy8gTGV0J3MgcmVjYWxsIHRoYXQgdGhlIHByb2R1Y3QgYWxnb3JpdGhtcyBmb3JtIG1jIHgga2MgdmVydGljYWwgcGFuZWxzIEEnIG9uIHRoZSBsaHMgYW5kCisgIC8vIGtjIHggbmMgYmxvY2tzIEInIG9uIHRoZSByaHMuIEInIGhhcyB0byBmaXQgaW50byBMMi9MMyBjYWNoZS4gTW9yZW92ZXIsIEEnIGlzIHByb2Nlc3NlZAorICAvLyBwZXIgbXIgeCBrYyBob3Jpem9udGFsIHNtYWxsIHBhbmVscyB3aGVyZSBtciBpcyB0aGUgYmxvY2tpbmcgc2l6ZSBhbG9uZyB0aGUgbSBkaW1lbnNpb24KKyAgLy8gYXQgdGhlIHJlZ2lzdGVyIGxldmVsLiBUaGlzIHNtYWxsIGhvcml6b250YWwgcGFuZWwgaGFzIHRvIHN0YXkgd2l0aGluIEwxIGNhY2hlLgorICBzdGQ6OnB0cmRpZmZfdCBsMSwgbDIsIGwzOworICBtYW5hZ2VfY2FjaGluZ19zaXplcyhHZXRBY3Rpb24sICZsMSwgJmwyLCAmbDMpOworCisgIGlmIChudW1fdGhyZWFkcyA+IDEpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyIFJlc1NjYWxhcjsKKyAgICBlbnVtIHsKKyAgICAgIGtkaXYgPSBLY0ZhY3RvciAqIChUcmFpdHM6Om1yICogc2l6ZW9mKExoc1NjYWxhcikgKyBUcmFpdHM6Om5yICogc2l6ZW9mKFJoc1NjYWxhcikpLAorICAgICAga3N1YiA9IFRyYWl0czo6bXIgKiBUcmFpdHM6Om5yICogc2l6ZW9mKFJlc1NjYWxhciksCisgICAgICBrciA9IDgsCisgICAgICBtciA9IFRyYWl0czo6bXIsCisgICAgICBuciA9IFRyYWl0czo6bnIKKyAgICB9OworICAgIC8vIEluY3JlYXNpbmcgayBnaXZlcyB1cyBtb3JlIHRpbWUgdG8gcHJlZmV0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlICJDIgorICAgIC8vIHJlZ2lzdGVycy4gSG93ZXZlciBvbmNlIHRoZSBsYXRlbmN5IGlzIGhpZGRlbiB0aGVyZSBpcyBubyBwb2ludCBpbgorICAgIC8vIGluY3JlYXNpbmcgdGhlIHZhbHVlIG9mIGssIHNvIHdlJ2xsIGNhcCBpdCBhdCAzMjAgKHZhbHVlIGRldGVybWluZWQKKyAgICAvLyBleHBlcmltZW50YWxseSkuCisgICAgY29uc3QgSW5kZXgga19jYWNoZSA9IChudW1leHQ6Om1pbmk8SW5kZXg+KSgobDEta3N1Yikva2RpdiwgMzIwKTsKKyAgICBpZiAoa19jYWNoZSA8IGspIHsKKyAgICAgIGsgPSBrX2NhY2hlIC0gKGtfY2FjaGUgJSBrcik7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoayA+IDApOworICAgIH0KKworICAgIGNvbnN0IEluZGV4IG5fY2FjaGUgPSAobDItbDEpIC8gKG5yICogc2l6ZW9mKFJoc1NjYWxhcikgKiBrKTsKKyAgICBjb25zdCBJbmRleCBuX3Blcl90aHJlYWQgPSBudW1leHQ6OmRpdl9jZWlsKG4sIG51bV90aHJlYWRzKTsKKyAgICBpZiAobl9jYWNoZSA8PSBuX3Blcl90aHJlYWQpIHsKKyAgICAgIC8vIERvbid0IGV4Y2VlZCB0aGUgY2FwYWNpdHkgb2YgdGhlIGwyIGNhY2hlLgorICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG5fY2FjaGUgPj0gc3RhdGljX2Nhc3Q8SW5kZXg+KG5yKSk7CisgICAgICBuID0gbl9jYWNoZSAtIChuX2NhY2hlICUgbnIpOworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG4gPiAwKTsKKyAgICB9IGVsc2UgeworICAgICAgbiA9IChudW1leHQ6Om1pbmk8SW5kZXg+KShuLCAobl9wZXJfdGhyZWFkICsgbnIgLSAxKSAtICgobl9wZXJfdGhyZWFkICsgbnIgLSAxKSAlIG5yKSk7CisgICAgfQorCisgICAgaWYgKGwzID4gbDIpIHsKKyAgICAgIC8vIGwzIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBjb3Jlcywgc28gd2UnbGwgZ2l2ZSBlYWNoIHRocmVhZCBpdHMgb3duIGNodW5rIG9mIGwzLgorICAgICAgY29uc3QgSW5kZXggbV9jYWNoZSA9IChsMy1sMikgLyAoc2l6ZW9mKExoc1NjYWxhcikgKiBrICogbnVtX3RocmVhZHMpOworICAgICAgY29uc3QgSW5kZXggbV9wZXJfdGhyZWFkID0gbnVtZXh0OjpkaXZfY2VpbChtLCBudW1fdGhyZWFkcyk7CisgICAgICBpZihtX2NhY2hlIDwgbV9wZXJfdGhyZWFkICYmIG1fY2FjaGUgPj0gc3RhdGljX2Nhc3Q8SW5kZXg+KG1yKSkgeworICAgICAgICBtID0gbV9jYWNoZSAtIChtX2NhY2hlICUgbXIpOworICAgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQobSA+IDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbSA9IChudW1leHQ6Om1pbmk8SW5kZXg+KShtLCAobV9wZXJfdGhyZWFkICsgbXIgLSAxKSAtICgobV9wZXJfdGhyZWFkICsgbXIgLSAxKSAlIG1yKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIEluIHVuaXQgdGVzdHMgd2UgZG8gbm90IHdhbnQgdG8gdXNlIGV4dHJhIGxhcmdlIG1hdHJpY2VzLAorICAgIC8vIHNvIHdlIHJlZHVjZSB0aGUgY2FjaGUgc2l6ZSB0byBjaGVjayB0aGUgYmxvY2tpbmcgc3RyYXRlZ3kgaXMgbm90IGZsYXdlZAorI2lmZGVmIEVJR0VOX0RFQlVHX1NNQUxMX1BST0RVQ1RfQkxPQ0tTCisgICAgbDEgPSA5KjEwMjQ7CisgICAgbDIgPSAzMioxMDI0OworICAgIGwzID0gNTEyKjEwMjQ7CisjZW5kaWYKKworICAgIC8vIEVhcmx5IHJldHVybiBmb3Igc21hbGwgcHJvYmxlbXMgYmVjYXVzZSB0aGUgY29tcHV0YXRpb24gYmVsb3cgYXJlIHRpbWUgY29uc3VtaW5nIGZvciBzbWFsbCBwcm9ibGVtcy4KKyAgICAvLyBQZXJoYXBzIGl0IHdvdWxkIG1ha2UgbW9yZSBzZW5zZSB0byBjb25zaWRlciBrKm4qbT8/CisgICAgLy8gTm90ZSB0aGF0IGZvciB2ZXJ5IHRpbnkgcHJvYmxlbSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYnlwYXNzZWQgYW55d2F5CisgICAgLy8gYmVjYXVzZSB3ZSB1c2UgdGhlIGNvZWZmaWNpZW50LWJhc2VkIGltcGxlbWVudGF0aW9uIGZvciB0aGVtLgorICAgIGlmKChudW1leHQ6Om1heGkpKGssKG51bWV4dDo6bWF4aSkobSxuKSk8NDgpCisgICAgICByZXR1cm47CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyIFJlc1NjYWxhcjsKKyAgICBlbnVtIHsKKyAgICAgIGtfcGVlbGluZyA9IDgsCisgICAgICBrX2RpdiA9IEtjRmFjdG9yICogKFRyYWl0czo6bXIgKiBzaXplb2YoTGhzU2NhbGFyKSArIFRyYWl0czo6bnIgKiBzaXplb2YoUmhzU2NhbGFyKSksCisgICAgICBrX3N1YiA9IFRyYWl0czo6bXIgKiBUcmFpdHM6Om5yICogc2l6ZW9mKFJlc1NjYWxhcikKKyAgICB9OworCisgICAgLy8gLS0tLSAxc3QgbGV2ZWwgb2YgYmxvY2tpbmcgb24gTDEsIHlpZWxkcyBrYyAtLS0tCisKKyAgICAvLyBCbG9ja2luZyBvbiB0aGUgdGhpcmQgZGltZW5zaW9uIChpLmUuLCBrKSBpcyBjaG9zZW4gc28gdGhhdCBhbiBob3Jpem9udGFsIHBhbmVsCisgICAgLy8gb2Ygc2l6ZSBtciB4IGtjIG9mIHRoZSBsaHMgcGx1cyBhIHZlcnRpY2FsIHBhbmVsIG9mIGtjIHggbnIgb2YgdGhlIHJocyBib3RoIGZpdHMgd2l0aGluIEwxIGNhY2hlLgorICAgIC8vIFdlIGFsc28gaW5jbHVkZSBhIHJlZ2lzdGVyLWxldmVsIGJsb2NrIG9mIHRoZSByZXN1bHQgKG14IHggbnIpLgorICAgIC8vIChJbiBhbiBpZGVhbCB3b3JsZCBvbmx5IHRoZSBsaHMgcGFuZWwgd291bGQgc3RheSBpbiBMMSkKKyAgICAvLyBNb3Jlb3Zlciwga2MgaGFzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOCB0byBiZSBjb21wYXRpYmxlIHdpdGggbG9vcCBwZWVsaW5nLCBsZWFkaW5nIHRvIGEgbWF4aW11bSBibG9ja2luZyBzaXplIG9mOgorICAgIGNvbnN0IEluZGV4IG1heF9rYyA9IG51bWV4dDo6bWF4aTxJbmRleD4oKChsMS1rX3N1Yikva19kaXYpICYgKH4oa19wZWVsaW5nLTEpKSwxKTsKKyAgICBjb25zdCBJbmRleCBvbGRfayA9IGs7CisgICAgaWYoaz5tYXhfa2MpCisgICAgeworICAgICAgLy8gV2UgYXJlIHJlYWxseSBibG9ja2luZyBvbiB0aGUgdGhpcmQgZGltZW5zaW9uOgorICAgICAgLy8gLT4gcmVkdWNlIGJsb2NraW5nIHNpemUgdG8gbWFrZSBzdXJlIHRoZSBsYXN0IGJsb2NrIGlzIGFzIGxhcmdlIGFzIHBvc3NpYmxlCisgICAgICAvLyAgICB3aGlsZSBrZWVwaW5nIHRoZSBzYW1lIG51bWJlciBvZiBzd2VlcHMgb3ZlciB0aGUgcmVzdWx0LgorICAgICAgayA9IChrJW1heF9rYyk9PTAgPyBtYXhfa2MKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbWF4X2tjIC0ga19wZWVsaW5nICogKChtYXhfa2MtMS0oayVtYXhfa2MpKS8oa19wZWVsaW5nKihrL21heF9rYysxKSkpOworCisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoKChvbGRfay9rKSA9PSAob2xkX2svbWF4X2tjKSkgJiYgInRoZSBudW1iZXIgb2Ygc3dlZXBzIGhhcyB0byByZW1haW4gdGhlIHNhbWUiKTsKKyAgICB9CisKKyAgICAvLyAtLS0tIDJuZCBsZXZlbCBvZiBibG9ja2luZyBvbiBtYXgoTDIsTDMpLCB5aWVsZHMgbmMgLS0tLQorCisgICAgLy8gVE9ETyBmaW5kIGEgcmVsaWFibGUgd2F5IHRvIGdldCB0aGUgYWN0dWFsIGFtb3VudCBvZiBjYWNoZSBwZXIgY29yZSB0byB1c2UgZm9yIDJuZCBsZXZlbCBibG9ja2luZywgdGhhdCBpczoKKyAgICAvLyAgICAgIGFjdHVhbF9sMiA9IG1heChsMiwgbDMvbmJfY29yZV9zaGFyaW5nX2wzKQorICAgIC8vIFRoZSBudW1iZXIgYmVsb3cgaXMgcXVpdGUgY29uc2VydmF0aXZlOiBpdCBpcyBiZXR0ZXIgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgY2FjaGUgc2l6ZSByYXRoZXIgdGhhbiBvdmVyZXN0aW1hdGluZyBpdCkKKyAgICAvLyBGb3IgaW5zdGFuY2UsIGl0IGNvcnJlc3BvbmRzIHRvIDZNQiBvZiBMMyBzaGFyZWQgYW1vbmcgNCBjb3Jlcy4KKyAgICAjaWZkZWYgRUlHRU5fREVCVUdfU01BTExfUFJPRFVDVF9CTE9DS1MKKyAgICBjb25zdCBJbmRleCBhY3R1YWxfbDIgPSBsMzsKKyAgICAjZWxzZQorICAgIGNvbnN0IEluZGV4IGFjdHVhbF9sMiA9IDE1NzI4NjQ7IC8vID09IDEuNSBNQgorICAgICNlbmRpZgorCisgICAgLy8gSGVyZSwgbmMgaXMgY2hvc2VuIHN1Y2ggdGhhdCBhIGJsb2NrIG9mIGtjIHggbmMgb2YgdGhlIHJocyBmaXQgd2l0aGluIGhhbGYgb2YgTDIuCisgICAgLy8gVGhlIHNlY29uZCBoYWxmIGlzIGltcGxpY2l0bHkgcmVzZXJ2ZWQgdG8gYWNjZXNzIHRoZSByZXN1bHQgYW5kIGxocyBjb2VmZmljaWVudHMuCisgICAgLy8gV2hlbiBrPG1heF9rYywgdGhlbiBuYyBjYW4gYXJiaXRyYXJpbHkgZ3Jvd3RoLiBJbiBwcmFjdGljZSwgaXQgc2VlbXMgdG8gYmUgZnJ1aXRmdWwKKyAgICAvLyB0byBsaW1pdCB0aGlzIGdyb3d0aDogd2UgYm91bmQgbmMgdG8gZ3Jvd3RoIGJ5IGEgZmFjdG9yIHgxLjUuCisgICAgLy8gSG93ZXZlciwgaWYgdGhlIGVudGlyZSBsaHMgYmxvY2sgZml0IHdpdGhpbiBMMSwgdGhlbiB3ZSBhcmUgbm90IGdvaW5nIHRvIGJsb2NrIG9uIHRoZSByb3dzIGF0IGFsbCwKKyAgICAvLyBhbmQgaXQgYmVjb21lcyBmcnVpdGZ1bCB0byBrZWVwIHRoZSBwYWNrZWQgcmhzIGJsb2NrcyBpbiBMMSBpZiB0aGVyZSBpcyBlbm91Z2ggcmVtYWluaW5nIHNwYWNlLgorICAgIEluZGV4IG1heF9uYzsKKyAgICBjb25zdCBJbmRleCBsaHNfYnl0ZXMgPSBtICogayAqIHNpemVvZihMaHNTY2FsYXIpOworICAgIGNvbnN0IEluZGV4IHJlbWFpbmluZ19sMSA9IGwxLSBrX3N1YiAtIGxoc19ieXRlczsKKyAgICBpZihyZW1haW5pbmdfbDEgPj0gSW5kZXgoVHJhaXRzOjpucipzaXplb2YoUmhzU2NhbGFyKSkqaykKKyAgICB7CisgICAgICAvLyBMMSBibG9ja2luZworICAgICAgbWF4X25jID0gcmVtYWluaW5nX2wxIC8gKGsqc2l6ZW9mKFJoc1NjYWxhcikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gTDIgYmxvY2tpbmcKKyAgICAgIG1heF9uYyA9ICgzKmFjdHVhbF9sMikvKDIqMiptYXhfa2Mqc2l6ZW9mKFJoc1NjYWxhcikpOworICAgIH0KKyAgICAvLyBXQVJOSU5HIEJlbG93LCB3ZSBhc3N1bWUgdGhhdCBUcmFpdHM6Om5yIGlzIGEgcG93ZXIgb2YgdHdvLgorICAgIEluZGV4IG5jID0gbnVtZXh0OjptaW5pPEluZGV4PihhY3R1YWxfbDIvKDIqaypzaXplb2YoUmhzU2NhbGFyKSksIG1heF9uYykgJiAofihUcmFpdHM6Om5yLTEpKTsKKyAgICBpZihuPm5jKQorICAgIHsKKyAgICAgIC8vIFdlIGFyZSByZWFsbHkgYmxvY2tpbmcgb3ZlciB0aGUgY29sdW1uczoKKyAgICAgIC8vIC0+IHJlZHVjZSBibG9ja2luZyBzaXplIHRvIG1ha2Ugc3VyZSB0aGUgbGFzdCBibG9jayBpcyBhcyBsYXJnZSBhcyBwb3NzaWJsZQorICAgICAgLy8gICAgd2hpbGUga2VlcGluZyB0aGUgc2FtZSBudW1iZXIgb2Ygc3dlZXBzIG92ZXIgdGhlIHBhY2tlZCBsaHMuCisgICAgICAvLyAgICBIZXJlIHdlIGFsbG93IG9uZSBtb3JlIHN3ZWVwIGlmIHRoaXMgZ2l2ZXMgdXMgYSBwZXJmZWN0IG1hdGNoLCB0aHVzIHRoZSBjb21tZW50ZWQgIi0xIgorICAgICAgbiA9IChuJW5jKT09MCA/IG5jCisgICAgICAgICAgICAgICAgICAgIDogKG5jIC0gVHJhaXRzOjpuciAqICgobmMvKi0xKi8tKG4lbmMpKS8oVHJhaXRzOjpucioobi9uYysxKSkpKTsKKyAgICB9CisgICAgZWxzZSBpZihvbGRfaz09aykKKyAgICB7CisgICAgICAvLyBTbyBmYXIsIG5vIGJsb2NraW5nIGF0IGFsbCwgaS5lLiwga2M9PWssIGFuZCBuYz09bi4KKyAgICAgIC8vIEluIHRoaXMgY2FzZSwgbGV0J3MgcGVyZm9ybSBhIGJsb2NraW5nIG92ZXIgdGhlIHJvd3Mgc3VjaCB0aGF0IHRoZSBwYWNrZWQgbGhzIGRhdGEgaXMga2VwdCBpbiBjYWNoZSBMMS9MMgorICAgICAgLy8gVE9ETzogcGFydCBvZiB0aGlzIGJsb2NraW5nIHN0cmF0ZWd5IGlzIG5vdyBpbXBsZW1lbnRlZCB3aXRoaW4gdGhlIGtlcm5lbCBpdHNlbGYsIHNvIHRoZSBMMS1iYXNlZCBoZXVyaXN0aWMgaGVyZSBzaG91bGQgYmUgb2Jzb2xldGUuCisgICAgICBJbmRleCBwcm9ibGVtX3NpemUgPSBrKm4qc2l6ZW9mKExoc1NjYWxhcik7CisgICAgICBJbmRleCBhY3R1YWxfbG0gPSBhY3R1YWxfbDI7CisgICAgICBJbmRleCBtYXhfbWMgPSBtOworICAgICAgaWYocHJvYmxlbV9zaXplPD0xMDI0KQorICAgICAgeworICAgICAgICAvLyBwcm9ibGVtIGlzIHNtYWxsIGVub3VnaCB0byBrZWVwIGluIEwxCisgICAgICAgIC8vIExldCdzIGNob29zZSBtIHN1Y2ggdGhhdCBsaHMncyBibG9jayBmaXQgaW4gMS8zIG9mIEwxCisgICAgICAgIGFjdHVhbF9sbSA9IGwxOworICAgICAgfQorICAgICAgZWxzZSBpZihsMyE9MCAmJiBwcm9ibGVtX3NpemU8PTMyNzY4KQorICAgICAgeworICAgICAgICAvLyB3ZSBoYXZlIGJvdGggTDIgYW5kIEwzLCBhbmQgcHJvYmxlbSBpcyBzbWFsbCBlbm91Z2ggdG8gYmUga2VwdCBpbiBMMgorICAgICAgICAvLyBMZXQncyBjaG9vc2UgbSBzdWNoIHRoYXQgbGhzJ3MgYmxvY2sgZml0IGluIDEvMyBvZiBMMgorICAgICAgICBhY3R1YWxfbG0gPSBsMjsKKyAgICAgICAgbWF4X21jID0gKG51bWV4dDo6bWluaTxJbmRleD4pKDU3NixtYXhfbWMpOworICAgICAgfQorICAgICAgSW5kZXggbWMgPSAobnVtZXh0OjptaW5pPEluZGV4PikoYWN0dWFsX2xtLygzKmsqc2l6ZW9mKExoc1NjYWxhcikpLCBtYXhfbWMpOworICAgICAgaWYgKG1jID4gVHJhaXRzOjptcikgbWMgLT0gbWMgJSBUcmFpdHM6Om1yOworICAgICAgZWxzZSBpZiAobWM9PTApIHJldHVybjsKKyAgICAgIG0gPSAobSVtYyk9PTAgPyBtYworICAgICAgICAgICAgICAgICAgICA6IChtYyAtIFRyYWl0czo6bXIgKiAoKG1jLyotMSovLShtJW1jKSkvKFRyYWl0czo6bXIqKG0vbWMrMSkpKSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleD4KK2lubGluZSBib29sIHVzZVNwZWNpZmljQmxvY2tpbmdTaXplcyhJbmRleCYgaywgSW5kZXgmIG0sIEluZGV4JiBuKQoreworI2lmZGVmIEVJR0VOX1RFU1RfU1BFQ0lGSUNfQkxPQ0tJTkdfU0laRVMKKyAgaWYgKEVJR0VOX1RFU1RfU1BFQ0lGSUNfQkxPQ0tJTkdfU0laRVMpIHsKKyAgICBrID0gbnVtZXh0OjptaW5pPEluZGV4PihrLCBFSUdFTl9URVNUX1NQRUNJRklDX0JMT0NLSU5HX1NJWkVfSyk7CisgICAgbSA9IG51bWV4dDo6bWluaTxJbmRleD4obSwgRUlHRU5fVEVTVF9TUEVDSUZJQ19CTE9DS0lOR19TSVpFX00pOworICAgIG4gPSBudW1leHQ6Om1pbmk8SW5kZXg+KG4sIEVJR0VOX1RFU1RfU1BFQ0lGSUNfQkxPQ0tJTkdfU0laRV9OKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorI2Vsc2UKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGspCisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShtKQorICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobikKKyNlbmRpZgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIGJsb2NraW5nIHBhcmFtZXRlcnMgZm9yIGEgbSB4IGsgdGltZXMgayB4IG4gbWF0cml4IHByb2R1Y3QKKyAgKgorICAqIFxwYXJhbVtpbixvdXRdIGsgSW5wdXQ6IHRoZSB0aGlyZCBkaW1lbnNpb24gb2YgdGhlIHByb2R1Y3QuIE91dHB1dDogdGhlIGJsb2NraW5nIHNpemUgYWxvbmcgdGhlIHNhbWUgZGltZW5zaW9uLgorICAqIFxwYXJhbVtpbixvdXRdIG0gSW5wdXQ6IHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbGVmdCBoYW5kIHNpZGUuIE91dHB1dDogdGhlIGJsb2NraW5nIHNpemUgYWxvbmcgdGhlIHNhbWUgZGltZW5zaW9uLgorICAqIFxwYXJhbVtpbixvdXRdIG4gSW5wdXQ6IHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlLiBPdXRwdXQ6IHRoZSBibG9ja2luZyBzaXplIGFsb25nIHRoZSBzYW1lIGRpbWVuc2lvbi4KKyAgKgorICAqIEdpdmVuIGEgbSB4IGsgdGltZXMgayB4IG4gbWF0cml4IHByb2R1Y3Qgb2Ygc2NhbGFyIHR5cGVzIFxjIExoc1NjYWxhciBhbmQgXGMgUmhzU2NhbGFyLAorICAqIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGJsb2NraW5nIHNpemUgcGFyYW1ldGVycyBhbG9uZyB0aGUgcmVzcGVjdGl2ZSBkaW1lbnNpb25zCisgICogZm9yIG1hdHJpeCBwcm9kdWN0cyBhbmQgcmVsYXRlZCBhbGdvcml0aG1zLgorICAqCisgICogVGhlIGJsb2NraW5nIHNpemUgcGFyYW1ldGVycyBtYXkgYmUgZXZhbHVhdGVkOgorICAqICAgLSBlaXRoZXIgYnkgYSBoZXVyaXN0aWMgYmFzZWQgb24gY2FjaGUgc2l6ZXM7CisgICogICAtIG9yIHVzaW5nIGZpeGVkIHByZXNjcmliZWQgdmFsdWVzIChmb3IgdGVzdGluZyBwdXJwb3NlcykuCisgICoKKyAgKiBcc2Egc2V0Q3B1Q2FjaGVTaXplcyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IEtjRmFjdG9yLCB0eXBlbmFtZSBJbmRleD4KK3ZvaWQgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzKEluZGV4JiBrLCBJbmRleCYgbSwgSW5kZXgmIG4sIEluZGV4IG51bV90aHJlYWRzID0gMSkKK3sKKyAgaWYgKCF1c2VTcGVjaWZpY0Jsb2NraW5nU2l6ZXMoaywgbSwgbikpIHsKKyAgICBldmFsdWF0ZVByb2R1Y3RCbG9ja2luZ1NpemVzSGV1cmlzdGljPExoc1NjYWxhciwgUmhzU2NhbGFyLCBLY0ZhY3RvciwgSW5kZXg+KGssIG0sIG4sIG51bV90aHJlYWRzKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXg+CitpbmxpbmUgdm9pZCBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXMoSW5kZXgmIGssIEluZGV4JiBtLCBJbmRleCYgbiwgSW5kZXggbnVtX3RocmVhZHMgPSAxKQoreworICBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8TGhzU2NhbGFyLFJoc1NjYWxhciwxLEluZGV4PihrLCBtLCBuLCBudW1fdGhyZWFkcyk7Cit9CisKKyNpZmRlZiBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX0NKTUFERAorICAjZGVmaW5lIENKTUFERChDSixBLEIsQyxUKSAgQyA9IENKLnBtYWRkKEEsQixDKTsKKyNlbHNlCisKKyAgLy8gRklYTUUgKGEgYml0IG92ZXJraWxsIG1heWJlID8pCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ0osIHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+IHN0cnVjdCBnZWJwX21hZGRfc2VsZWN0b3IgeworICAgIEVJR0VOX0FMV0FZU19JTkxJTkUgc3RhdGljIHZvaWQgcnVuKGNvbnN0IENKJiBjaiwgQSYgYSwgQiYgYiwgQyYgYywgVCYgLyp0Ki8pCisgICAgeworICAgICAgYyA9IGNqLnBtYWRkKGEsYixjKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ0osIHR5cGVuYW1lIFQ+IHN0cnVjdCBnZWJwX21hZGRfc2VsZWN0b3I8Q0osVCxULFQsVD4geworICAgIEVJR0VOX0FMV0FZU19JTkxJTkUgc3RhdGljIHZvaWQgcnVuKGNvbnN0IENKJiBjaiwgVCYgYSwgVCYgYiwgVCYgYywgVCYgdCkKKyAgICB7CisgICAgICB0ID0gYjsgdCA9IGNqLnBtdWwoYSx0KTsgYyA9IHBhZGQoYyx0KTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ0osIHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBnZWJwX21hZGQoY29uc3QgQ0omIGNqLCBBJiBhLCBCJiBiLCBDJiBjLCBUJiB0KQorICB7CisgICAgZ2VicF9tYWRkX3NlbGVjdG9yPENKLEEsQixDLFQ+OjpydW4oY2osYSxiLGMsdCk7CisgIH0KKworICAjZGVmaW5lIENKTUFERChDSixBLEIsQyxUKSAgZ2VicF9tYWRkKENKLEEsQixDLFQpOworLy8gICAjZGVmaW5lIENKTUFERChDSixBLEIsQyxUKSAgVCA9IEI7IFQgPSBDSi5wbXVsKEEsVCk7IEMgPSBwYWRkKEMsVCk7CisjZW5kaWYKKworLyogVmVjdG9yaXphdGlvbiBsb2dpYworICogIHJlYWwqcmVhbDogdW5wYWNrIHJocyB0byBjb25zdGFudCBwYWNrZXRzLCAuLi4KKyAqIAorICogIGNkKmNkIDogdW5wYWNrIHJocyB0byAoYl9yLGJfciksIChiX2ksYl9pKSwgbXVsIHRvIGdldCAoYV9yIGJfcixhX2kgYl9yKSAoYV9yIGJfaSxhX2kgYl9pKSwKKyAqICAgICAgICAgIHN0b3JpbmcgZWFjaCByZXMgcGFja2V0IGludG8gdHdvIHBhY2tldHMgKDJ4MiksCisgKiAgICAgICAgICBhdCB0aGUgZW5kIGNvbWJpbmUgdGhlbTogc3dhcCB0aGUgc2Vjb25kIGFuZCBhZGRzdWIgdGhlbSAKKyAqICBjZipjZiA6IHNhbWUgYnV0IHdpdGggMng0IGJsb2NrcworICogIGNwbHgqcmVhbCA6IHVucGFjayByaHMgdG8gY29uc3RhbnQgcGFja2V0cywgLi4uCisgKiAgcmVhbCpjcGx4IDogbG9hZCBsaHMgYXMgKGEwLGEwLGExLGExKSwgYW5kIG11bCBhcyB1c3VhbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyLCBib29sIF9Db25qTGhzLCBib29sIF9Db25qUmhzPgorY2xhc3MgZ2VicF90cmFpdHMKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTGhzU2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiBfUmhzU2NhbGFyIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OlJldHVyblR5cGUgUmVzU2NhbGFyOworCisgIGVudW0geworICAgIENvbmpMaHMgPSBfQ29uakxocywKKyAgICBDb25qUmhzID0gX0NvbmpSaHMsCisgICAgVmVjdG9yaXphYmxlID0gcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpWZWN0b3JpemFibGUgJiYgcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpWZWN0b3JpemFibGUsCisgICAgTGhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmVzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgCisgICAgTnVtYmVyT2ZSZWdpc3RlcnMgPSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUywKKworICAgIC8vIHJlZ2lzdGVyIGJsb2NrIHNpemUgYWxvbmcgdGhlIE4gZGlyZWN0aW9uIG11c3QgYmUgMSBvciA0CisgICAgbnIgPSA0LAorCisgICAgLy8gcmVnaXN0ZXIgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24gKGN1cnJlbnRseSwgdGhpcyBvbmUgY2Fubm90IGJlIG1vZGlmaWVkKQorICAgIGRlZmF1bHRfbXIgPSAoRUlHRU5fUExBSU5fRU5VTV9NSU4oMTYsTnVtYmVyT2ZSZWdpc3RlcnMpLzIvbnIpKkxoc1BhY2tldFNpemUsCisjaWYgZGVmaW5lZChFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQpICYmICFkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9BTFRJVkVDKSAmJiAhZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfVlNYKQorICAgIC8vIHdlIGFzc3VtZSAxNiByZWdpc3RlcnMKKyAgICAvLyBTZWUgYnVnIDk5MiwgaWYgdGhlIHNjYWxhciB0eXBlIGlzIG5vdCB2ZWN0b3JpemFibGUgYnV0IHRoYXQgRUlHRU5fSEFTX1NJTkdMRV9JTlNUUlVDVElPTl9NQUREIGlzIGRlZmluZWQsCisgICAgLy8gdGhlbiB1c2luZyAzKkxoc1BhY2tldFNpemUgdHJpZ2dlcnMgbm9uLWltcGxlbWVudGVkIHBhdGhzIGluIHN5cmsuCisgICAgbXIgPSBWZWN0b3JpemFibGUgPyAzKkxoc1BhY2tldFNpemUgOiBkZWZhdWx0X21yLAorI2Vsc2UKKyAgICBtciA9IGRlZmF1bHRfbXIsCisjZW5kaWYKKyAgICAKKyAgICBMaHNQcm9ncmVzcyA9IExoc1BhY2tldFNpemUsCisgICAgUmhzUHJvZ3Jlc3MgPSAxCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnR5cGUgIF9MaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+Ojp0eXBlICBfUmhzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6dHlwZSAgX1Jlc1BhY2tldDsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfTGhzUGFja2V0LExoc1NjYWxhcj46OnR5cGUgTGhzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfUmhzUGFja2V0LFJoc1NjYWxhcj46OnR5cGUgUmhzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfUmVzUGFja2V0LFJlc1NjYWxhcj46OnR5cGUgUmVzUGFja2V0OworCisgIHR5cGVkZWYgUmVzUGFja2V0IEFjY1BhY2tldDsKKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBpbml0QWNjKEFjY1BhY2tldCYgcCkKKyAgeworICAgIHAgPSBwc2V0MTxSZXNQYWNrZXQ+KFJlc1NjYWxhcigwKSk7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBicm9hZGNhc3RSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNQYWNrZXQmIGIwLCBSaHNQYWNrZXQmIGIxLCBSaHNQYWNrZXQmIGIyLCBSaHNQYWNrZXQmIGIzKQorICB7CisgICAgcGJyb2FkY2FzdDQoYiwgYjAsIGIxLCBiMiwgYjMpOworICB9CisgIAorLy8gICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYnJvYWRjYXN0UmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBiMCwgUmhzUGFja2V0JiBiMSkKKy8vICAgeworLy8gICAgIHBicm9hZGNhc3QyKGIsIGIwLCBiMSk7CisvLyAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1BhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0VHlwZSYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwc2V0MTxSaHNQYWNrZXRUeXBlPigqYik7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzUXVhZChjb25zdCBSaHNTY2FsYXIqIGIsIFJoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZHF1YWQ8UmhzUGFja2V0PihiKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIExoc1BhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkTGhzKGNvbnN0IExoc1NjYWxhciogYSwgTGhzUGFja2V0VHlwZSYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZDxMaHNQYWNrZXRUeXBlPihhKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIExoc1BhY2tldFR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkTGhzVW5hbGlnbmVkKGNvbnN0IExoc1NjYWxhciogYSwgTGhzUGFja2V0VHlwZSYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZHU8TGhzUGFja2V0VHlwZT4oYSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNQYWNrZXRUeXBlLCB0eXBlbmFtZSBSaHNQYWNrZXRUeXBlLCB0eXBlbmFtZSBBY2NQYWNrZXRUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZChjb25zdCBMaHNQYWNrZXRUeXBlJiBhLCBjb25zdCBSaHNQYWNrZXRUeXBlJiBiLCBBY2NQYWNrZXRUeXBlJiBjLCBBY2NQYWNrZXRUeXBlJiB0bXApIGNvbnN0CisgIHsKKyAgICBjb25qX2hlbHBlcjxMaHNQYWNrZXRUeXBlLFJoc1BhY2tldFR5cGUsQ29uakxocyxDb25qUmhzPiBjajsKKyAgICAvLyBJdCB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIHRvIGNhbGwgcG1hZGQgYWxsIHRoZSB0aW1lLiBVbmZvcnR1bmF0ZWx5IGlmIHdlCisgICAgLy8gbGV0IGdjYyBhbGxvY2F0ZSB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgcG11bAorICAgIC8vIChpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBGTUEpIGdjYyBmYWlscyB0byBmaWd1cmUgb3V0IGhvdyB0byBhdm9pZAorICAgIC8vIHNwaWxsaW5nIHJlZ2lzdGVyLgorI2lmZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0bXApOworICAgIGMgPSBjai5wbWFkZChhLGIsYyk7CisjZWxzZQorICAgIHRtcCA9IGI7IHRtcCA9IGNqLnBtdWwoYSx0bXApOyBjID0gcGFkZChjLHRtcCk7CisjZW5kaWYKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhY2MoY29uc3QgQWNjUGFja2V0JiBjLCBjb25zdCBSZXNQYWNrZXQmIGFscGhhLCBSZXNQYWNrZXQmIHIpIGNvbnN0CisgIHsKKyAgICByID0gcG1hZGQoYyxhbHBoYSxyKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmVzUGFja2V0SGFsZj4KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFjYyhjb25zdCBSZXNQYWNrZXRIYWxmJiBjLCBjb25zdCBSZXNQYWNrZXRIYWxmJiBhbHBoYSwgUmVzUGFja2V0SGFsZiYgcikgY29uc3QKKyAgeworICAgIHIgPSBwbWFkZChjLGFscGhhLHIpOworICB9CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXIsIGJvb2wgX0NvbmpMaHM+CitjbGFzcyBnZWJwX3RyYWl0czxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIFJlYWxTY2FsYXIsIF9Db25qTGhzLCBmYWxzZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gTGhzU2NhbGFyOworICB0eXBlZGVmIFJlYWxTY2FsYXIgUmhzU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisKKyAgZW51bSB7CisgICAgQ29uakxocyA9IF9Db25qTGhzLAorICAgIENvbmpSaHMgPSBmYWxzZSwKKyAgICBWZWN0b3JpemFibGUgPSBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OlZlY3Rvcml6YWJsZSwKKyAgICBMaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgICBSaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgICBSZXNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+OjpzaXplIDogMSwKKyAgICAKKyAgICBOdW1iZXJPZlJlZ2lzdGVycyA9IEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTLAorICAgIG5yID0gNCwKKyNpZiBkZWZpbmVkKEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERCkgJiYgIWRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX0FMVElWRUMpICYmICFkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9WU1gpCisgICAgLy8gd2UgYXNzdW1lIDE2IHJlZ2lzdGVycworICAgIG1yID0gMypMaHNQYWNrZXRTaXplLAorI2Vsc2UKKyAgICBtciA9IChFSUdFTl9QTEFJTl9FTlVNX01JTigxNixOdW1iZXJPZlJlZ2lzdGVycykvMi9ucikqTGhzUGFja2V0U2l6ZSwKKyNlbmRpZgorCisgICAgTGhzUHJvZ3Jlc3MgPSBMaHNQYWNrZXRTaXplLAorICAgIFJoc1Byb2dyZXNzID0gMQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+Ojp0eXBlICBfTGhzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6dHlwZSAgX1Joc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnR5cGUgIF9SZXNQYWNrZXQ7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX0xoc1BhY2tldCxMaHNTY2FsYXI+Ojp0eXBlIExoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Joc1BhY2tldCxSaHNTY2FsYXI+Ojp0eXBlIFJoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Jlc1BhY2tldCxSZXNTY2FsYXI+Ojp0eXBlIFJlc1BhY2tldDsKKworICB0eXBlZGVmIFJlc1BhY2tldCBBY2NQYWNrZXQ7CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGluaXRBY2MoQWNjUGFja2V0JiBwKQorICB7CisgICAgcCA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBzZXQxPFJoc1BhY2tldD4oKmIpOworICB9CisgIAorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZFJoc1F1YWQoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcHNldDE8UmhzUGFja2V0PigqYik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZExocyhjb25zdCBMaHNTY2FsYXIqIGEsIExoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZDxMaHNQYWNrZXQ+KGEpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRMaHNVbmFsaWduZWQoY29uc3QgTGhzU2NhbGFyKiBhLCBMaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcGxvYWR1PExoc1BhY2tldD4oYSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYnJvYWRjYXN0UmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBiMCwgUmhzUGFja2V0JiBiMSwgUmhzUGFja2V0JiBiMiwgUmhzUGFja2V0JiBiMykKKyAgeworICAgIHBicm9hZGNhc3Q0KGIsIGIwLCBiMSwgYjIsIGIzKTsKKyAgfQorICAKKy8vICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGJyb2FkY2FzdFJocyhjb25zdCBSaHNTY2FsYXIqIGIsIFJoc1BhY2tldCYgYjAsIFJoc1BhY2tldCYgYjEpCisvLyAgIHsKKy8vICAgICBwYnJvYWRjYXN0MihiLCBiMCwgYjEpOworLy8gICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGQoY29uc3QgTGhzUGFja2V0JiBhLCBjb25zdCBSaHNQYWNrZXQmIGIsIEFjY1BhY2tldCYgYywgUmhzUGFja2V0JiB0bXApIGNvbnN0CisgIHsKKyAgICBtYWRkX2ltcGwoYSwgYiwgYywgdG1wLCB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsdHJ1ZV90eXBlLGZhbHNlX3R5cGU+Ojp0eXBlKCkpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGRfaW1wbChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgQWNjUGFja2V0JiBjLCBSaHNQYWNrZXQmIHRtcCwgY29uc3QgdHJ1ZV90eXBlJikgY29uc3QKKyAgeworI2lmZGVmIEVJR0VOX0hBU19TSU5HTEVfSU5TVFJVQ1RJT05fTUFERAorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0bXApOworICAgIGMudiA9IHBtYWRkKGEudixiLGMudik7CisjZWxzZQorICAgIHRtcCA9IGI7IHRtcCA9IHBtdWwoYS52LHRtcCk7IGMudiA9IHBhZGQoYy52LHRtcCk7CisjZW5kaWYKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtYWRkX2ltcGwoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIsIFJlc1NjYWxhciYgYywgUmhzU2NhbGFyJiAvKnRtcCovLCBjb25zdCBmYWxzZV90eXBlJikgY29uc3QKKyAgeworICAgIGMgKz0gYSAqIGI7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYWNjKGNvbnN0IEFjY1BhY2tldCYgYywgY29uc3QgUmVzUGFja2V0JiBhbHBoYSwgUmVzUGFja2V0JiByKSBjb25zdAorICB7CisgICAgciA9IGNqLnBtYWRkKGMsYWxwaGEscik7CisgIH0KKworcHJvdGVjdGVkOgorICBjb25qX2hlbHBlcjxSZXNQYWNrZXQsUmVzUGFja2V0LENvbmpMaHMsZmFsc2U+IGNqOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IERvdWJsZVBhY2tldAoreworICBQYWNrZXQgZmlyc3Q7CisgIFBhY2tldCBzZWNvbmQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CitEb3VibGVQYWNrZXQ8UGFja2V0PiBwYWRkKGNvbnN0IERvdWJsZVBhY2tldDxQYWNrZXQ+ICZhLCBjb25zdCBEb3VibGVQYWNrZXQ8UGFja2V0PiAmYikKK3sKKyAgRG91YmxlUGFja2V0PFBhY2tldD4gcmVzOworICByZXMuZmlyc3QgID0gcGFkZChhLmZpcnN0LCBiLmZpcnN0KTsKKyAgcmVzLnNlY29uZCA9IHBhZGQoYS5zZWNvbmQsYi5zZWNvbmQpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+Citjb25zdCBEb3VibGVQYWNrZXQ8UGFja2V0PiYgcHJlZHV4X2Rvd250bzQoY29uc3QgRG91YmxlUGFja2V0PFBhY2tldD4gJmEpCit7CisgIHJldHVybiBhOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8RG91YmxlUGFja2V0PFBhY2tldD4gPiB7IHR5cGVkZWYgRG91YmxlUGFja2V0PFBhY2tldD4gaGFsZjsgfTsKKy8vIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKy8vIERvdWJsZVBhY2tldDxQYWNrZXQ+IHBtYWRkKGNvbnN0IERvdWJsZVBhY2tldDxQYWNrZXQ+ICZhLCBjb25zdCBEb3VibGVQYWNrZXQ8UGFja2V0PiAmYikKKy8vIHsKKy8vICAgRG91YmxlUGFja2V0PFBhY2tldD4gcmVzOworLy8gICByZXMuZmlyc3QgID0gcGFkZChhLmZpcnN0LCBiLmZpcnN0KTsKKy8vICAgcmVzLnNlY29uZCA9IHBhZGQoYS5zZWNvbmQsYi5zZWNvbmQpOworLy8gICByZXR1cm4gcmVzOworLy8gfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyLCBib29sIF9Db25qTGhzLCBib29sIF9Db25qUmhzPgorY2xhc3MgZ2VicF90cmFpdHM8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIF9Db25qTGhzLCBfQ29ualJocyA+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ICBTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ICBMaHNTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ICBSaHNTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ICBSZXNTY2FsYXI7CisgIAorICBlbnVtIHsKKyAgICBDb25qTGhzID0gX0NvbmpMaHMsCisgICAgQ29ualJocyA9IF9Db25qUmhzLAorICAgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8UmVhbFNjYWxhcj46OlZlY3Rvcml6YWJsZQorICAgICAgICAgICAgICAgICYmIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlLAorICAgIFJlYWxQYWNrZXRTaXplICA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmVhbFNjYWxhcj46OnNpemUgOiAxLAorICAgIFJlc1BhY2tldFNpemUgICA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgTGhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSA6IDEsCisKKyAgICAvLyBGSVhNRTogc2hvdWxkIGRlcGVuZCBvbiBOdW1iZXJPZlJlZ2lzdGVycworICAgIG5yID0gNCwKKyAgICBtciA9IFJlc1BhY2tldFNpemUsCisKKyAgICBMaHNQcm9ncmVzcyA9IFJlc1BhY2tldFNpemUsCisgICAgUmhzUHJvZ3Jlc3MgPSAxCisgIH07CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmVhbFNjYWxhcj46OnR5cGUgUmVhbFBhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgICAgIFNjYWxhclBhY2tldDsKKyAgdHlwZWRlZiBEb3VibGVQYWNrZXQ8UmVhbFBhY2tldD4gRG91YmxlUGFja2V0VHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxSZWFsUGFja2V0LCAgU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLERvdWJsZVBhY2tldFR5cGUsU2NhbGFyPjo6dHlwZSBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLFNjYWxhclBhY2tldCxTY2FsYXI+Ojp0eXBlIFJlc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsRG91YmxlUGFja2V0VHlwZSxTY2FsYXI+Ojp0eXBlIEFjY1BhY2tldDsKKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBpbml0QWNjKFNjYWxhciYgcCkgeyBwID0gU2NhbGFyKDApOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGluaXRBY2MoRG91YmxlUGFja2V0VHlwZSYgcCkKKyAgeworICAgIHAuZmlyc3QgICA9IHBzZXQxPFJlYWxQYWNrZXQ+KFJlYWxTY2FsYXIoMCkpOworICAgIHAuc2Vjb25kICA9IHBzZXQxPFJlYWxQYWNrZXQ+KFJlYWxTY2FsYXIoMCkpOworICB9CisKKyAgLy8gU2NhbGFyIHBhdGgKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSZXNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcHNldDE8UmVzUGFja2V0PigqYik7CisgIH0KKworICAvLyBWZWN0b3JpemVkIHBhdGgKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBEb3VibGVQYWNrZXRUeXBlJiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdC5maXJzdCAgPSBwc2V0MTxSZWFsUGFja2V0PihyZWFsKCpiKSk7CisgICAgZGVzdC5zZWNvbmQgPSBwc2V0MTxSZWFsUGFja2V0PihpbWFnKCpiKSk7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzUXVhZChjb25zdCBSaHNTY2FsYXIqIGIsIFJlc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGxvYWRSaHMoYixkZXN0KTsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZFJoc1F1YWQoY29uc3QgUmhzU2NhbGFyKiBiLCBEb3VibGVQYWNrZXRUeXBlJiBkZXN0KSBjb25zdAorICB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHVucGFja2V0X3RyYWl0czxTY2FsYXJQYWNrZXQ+OjpzaXplPD00KTsKKyAgICBsb2FkUmhzKGIsZGVzdCk7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBicm9hZGNhc3RSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNQYWNrZXQmIGIwLCBSaHNQYWNrZXQmIGIxLCBSaHNQYWNrZXQmIGIyLCBSaHNQYWNrZXQmIGIzKQorICB7CisgICAgLy8gRklYTUUgbm90IHN1cmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBpbXBsZW1lbnQgaXQhCisgICAgbG9hZFJocyhiKzAsIGIwKTsKKyAgICBsb2FkUmhzKGIrMSwgYjEpOworICAgIGxvYWRSaHMoYisyLCBiMik7CisgICAgbG9hZFJocyhiKzMsIGIzKTsKKyAgfQorICAKKyAgLy8gVmVjdG9yaXplZCBwYXRoCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBicm9hZGNhc3RSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBEb3VibGVQYWNrZXRUeXBlJiBiMCwgRG91YmxlUGFja2V0VHlwZSYgYjEpCisgIHsKKyAgICAvLyBGSVhNRSBub3Qgc3VyZSB0aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIGltcGxlbWVudCBpdCEKKyAgICBsb2FkUmhzKGIrMCwgYjApOworICAgIGxvYWRSaHMoYisxLCBiMSk7CisgIH0KKyAgCisgIC8vIFNjYWxhciBwYXRoCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBicm9hZGNhc3RSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNTY2FsYXImIGIwLCBSaHNTY2FsYXImIGIxKQorICB7CisgICAgLy8gRklYTUUgbm90IHN1cmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBpbXBsZW1lbnQgaXQhCisgICAgbG9hZFJocyhiKzAsIGIwKTsKKyAgICBsb2FkUmhzKGIrMSwgYjEpOworICB9CisKKyAgLy8gbm90aGluZyBzcGVjaWFsIGhlcmUKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRMaHMoY29uc3QgTGhzU2NhbGFyKiBhLCBMaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcGxvYWQ8TGhzUGFja2V0PigoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPExoc1BhY2tldD46OnR5cGUqKShhKSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZExoc1VuYWxpZ25lZChjb25zdCBMaHNTY2FsYXIqIGEsIExoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZHU8TGhzUGFja2V0PigoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPExoc1BhY2tldD46OnR5cGUqKShhKSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgRG91YmxlUGFja2V0VHlwZSYgYywgUmhzUGFja2V0JiAvKnRtcCovKSBjb25zdAorICB7CisgICAgYy5maXJzdCAgID0gcGFkZChwbXVsKGEsYi5maXJzdCksIGMuZmlyc3QpOworICAgIGMuc2Vjb25kICA9IHBhZGQocG11bChhLGIuc2Vjb25kKSxjLnNlY29uZCk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgUmVzUGFja2V0JiBjLCBSaHNQYWNrZXQmIC8qdG1wKi8pIGNvbnN0CisgIHsKKyAgICBjID0gY2oucG1hZGQoYSxiLGMpOworICB9CisgIAorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYWNjKGNvbnN0IFNjYWxhciYgYywgY29uc3QgU2NhbGFyJiBhbHBoYSwgU2NhbGFyJiByKSBjb25zdCB7IHIgKz0gYWxwaGEgKiBjOyB9CisgIAorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYWNjKGNvbnN0IERvdWJsZVBhY2tldFR5cGUmIGMsIGNvbnN0IFJlc1BhY2tldCYgYWxwaGEsIFJlc1BhY2tldCYgcikgY29uc3QKKyAgeworICAgIC8vIGFzc2VtYmxlIGMKKyAgICBSZXNQYWNrZXQgdG1wOworICAgIGlmKCghQ29uakxocykmJighQ29ualJocykpCisgICAgeworICAgICAgdG1wID0gcGNwbHhmbGlwKHBjb25qKFJlc1BhY2tldChjLnNlY29uZCkpKTsKKyAgICAgIHRtcCA9IHBhZGQoUmVzUGFja2V0KGMuZmlyc3QpLHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYoKCFDb25qTGhzKSYmKENvbmpSaHMpKQorICAgIHsKKyAgICAgIHRtcCA9IHBjb25qKHBjcGx4ZmxpcChSZXNQYWNrZXQoYy5zZWNvbmQpKSk7CisgICAgICB0bXAgPSBwYWRkKFJlc1BhY2tldChjLmZpcnN0KSx0bXApOworICAgIH0KKyAgICBlbHNlIGlmKChDb25qTGhzKSYmKCFDb25qUmhzKSkKKyAgICB7CisgICAgICB0bXAgPSBwY3BseGZsaXAoUmVzUGFja2V0KGMuc2Vjb25kKSk7CisgICAgICB0bXAgPSBwYWRkKHBjb25qKFJlc1BhY2tldChjLmZpcnN0KSksdG1wKTsKKyAgICB9CisgICAgZWxzZSBpZigoQ29uakxocykmJihDb25qUmhzKSkKKyAgICB7CisgICAgICB0bXAgPSBwY3BseGZsaXAoUmVzUGFja2V0KGMuc2Vjb25kKSk7CisgICAgICB0bXAgPSBwc3ViKHBjb25qKFJlc1BhY2tldChjLmZpcnN0KSksdG1wKTsKKyAgICB9CisgICAgCisgICAgciA9IHBtYWRkKHRtcCxhbHBoYSxyKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbmpfaGVscGVyPExoc1NjYWxhcixSaHNTY2FsYXIsQ29uakxocyxDb25qUmhzPiBjajsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXIsIGJvb2wgX0NvbmpSaHM+CitjbGFzcyBnZWJwX3RyYWl0czxSZWFsU2NhbGFyLCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIGZhbHNlLCBfQ29ualJocyA+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ICBTY2FsYXI7CisgIHR5cGVkZWYgUmVhbFNjYWxhciAgTGhzU2NhbGFyOworICB0eXBlZGVmIFNjYWxhciAgICAgIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiBTY2FsYXIgICAgICBSZXNTY2FsYXI7CisKKyAgZW51bSB7CisgICAgQ29uakxocyA9IGZhbHNlLAorICAgIENvbmpSaHMgPSBfQ29ualJocywKKyAgICBWZWN0b3JpemFibGUgPSBwYWNrZXRfdHJhaXRzPFJlYWxTY2FsYXI+OjpWZWN0b3JpemFibGUKKyAgICAgICAgICAgICAgICAmJiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSwKKyAgICBMaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgICBSaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgICBSZXNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+OjpzaXplIDogMSwKKyAgICAKKyAgICBOdW1iZXJPZlJlZ2lzdGVycyA9IEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTLAorICAgIC8vIEZJWE1FOiBzaG91bGQgZGVwZW5kIG9uIE51bWJlck9mUmVnaXN0ZXJzCisgICAgbnIgPSA0LAorICAgIG1yID0gKEVJR0VOX1BMQUlOX0VOVU1fTUlOKDE2LE51bWJlck9mUmVnaXN0ZXJzKS8yL25yKSpSZXNQYWNrZXRTaXplLAorCisgICAgTGhzUHJvZ3Jlc3MgPSBSZXNQYWNrZXRTaXplLAorICAgIFJoc1Byb2dyZXNzID0gMQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+Ojp0eXBlICBfTGhzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6dHlwZSAgX1Joc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnR5cGUgIF9SZXNQYWNrZXQ7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX0xoc1BhY2tldCxMaHNTY2FsYXI+Ojp0eXBlIExoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Joc1BhY2tldCxSaHNTY2FsYXI+Ojp0eXBlIFJoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Jlc1BhY2tldCxSZXNTY2FsYXI+Ojp0eXBlIFJlc1BhY2tldDsKKworICB0eXBlZGVmIFJlc1BhY2tldCBBY2NQYWNrZXQ7CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGluaXRBY2MoQWNjUGFja2V0JiBwKQorICB7CisgICAgcCA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBzZXQxPFJoc1BhY2tldD4oKmIpOworICB9CisgIAorICB2b2lkIGJyb2FkY2FzdFJocyhjb25zdCBSaHNTY2FsYXIqIGIsIFJoc1BhY2tldCYgYjAsIFJoc1BhY2tldCYgYjEsIFJoc1BhY2tldCYgYjIsIFJoc1BhY2tldCYgYjMpCisgIHsKKyAgICBwYnJvYWRjYXN0NChiLCBiMCwgYjEsIGIyLCBiMyk7CisgIH0KKyAgCisvLyAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBicm9hZGNhc3RSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNQYWNrZXQmIGIwLCBSaHNQYWNrZXQmIGIxKQorLy8gICB7CisvLyAgICAgLy8gRklYTUUgbm90IHN1cmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBpbXBsZW1lbnQgaXQhCisvLyAgICAgYjAgPSBwbG9hZDE8UmhzUGFja2V0PihiKzApOworLy8gICAgIGIxID0gcGxvYWQxPFJoc1BhY2tldD4oYisxKTsKKy8vICAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkTGhzKGNvbnN0IExoc1NjYWxhciogYSwgTGhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBsb2FkZHVwPExoc1BhY2tldD4oYSk7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzUXVhZChjb25zdCBSaHNTY2FsYXIqIGIsIFJoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydCh1bnBhY2tldF90cmFpdHM8UmhzUGFja2V0Pjo6c2l6ZTw9NCk7CisgICAgbG9hZFJocyhiLGRlc3QpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRMaHNVbmFsaWduZWQoY29uc3QgTGhzU2NhbGFyKiBhLCBMaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcGxvYWRkdXA8TGhzUGFja2V0PihhKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtYWRkKGNvbnN0IExoc1BhY2tldCYgYSwgY29uc3QgUmhzUGFja2V0JiBiLCBBY2NQYWNrZXQmIGMsIFJoc1BhY2tldCYgdG1wKSBjb25zdAorICB7CisgICAgbWFkZF9pbXBsKGEsIGIsIGMsIHRtcCwgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLHRydWVfdHlwZSxmYWxzZV90eXBlPjo6dHlwZSgpKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtYWRkX2ltcGwoY29uc3QgTGhzUGFja2V0JiBhLCBjb25zdCBSaHNQYWNrZXQmIGIsIEFjY1BhY2tldCYgYywgUmhzUGFja2V0JiB0bXAsIGNvbnN0IHRydWVfdHlwZSYpIGNvbnN0CisgIHsKKyNpZmRlZiBFSUdFTl9IQVNfU0lOR0xFX0lOU1RSVUNUSU9OX01BREQKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUodG1wKTsKKyAgICBjLnYgPSBwbWFkZChhLGIudixjLnYpOworI2Vsc2UKKyAgICB0bXAgPSBiOyB0bXAudiA9IHBtdWwoYSx0bXAudik7IGMgPSBwYWRkKGMsdG1wKTsKKyNlbmRpZgorICAgIAorICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGRfaW1wbChjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYiwgUmVzU2NhbGFyJiBjLCBSaHNTY2FsYXImIC8qdG1wKi8sIGNvbnN0IGZhbHNlX3R5cGUmKSBjb25zdAorICB7CisgICAgYyArPSBhICogYjsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhY2MoY29uc3QgQWNjUGFja2V0JiBjLCBjb25zdCBSZXNQYWNrZXQmIGFscGhhLCBSZXNQYWNrZXQmIHIpIGNvbnN0CisgIHsKKyAgICByID0gY2oucG1hZGQoYWxwaGEsYyxyKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbmpfaGVscGVyPFJlc1BhY2tldCxSZXNQYWNrZXQsZmFsc2UsQ29ualJocz4gY2o7Cit9OworCisvKiBvcHRpbWl6ZWQgR0VuZXJhbCBwYWNrZWQgQmxvY2sgKiBwYWNrZWQgUGFuZWwgcHJvZHVjdCBrZXJuZWwKKyAqCisgKiBNaXhpbmcgdHlwZSBsb2dpYzogQyArPSBBICogQgorICogIHwgIEEgIHwgIEIgIHwgY29tbWVudHMKKyAqICB8cmVhbCB8Y3BseCB8IG5vIHZlY3Rvcml6YXRpb24geWV0LCB3b3VsZCByZXF1aXJlIHRvIHBhY2sgQSB3aXRoIGR1cGxpY2F0aW9uCisgKiAgfGNwbHggfHJlYWwgfCBlYXN5IHZlY3Rvcml6YXRpb24KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBEYXRhTWFwcGVyLCBpbnQgbXIsIGludCBuciwgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IGdlYnBfa2VybmVsCit7CisgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpSZXNTY2FsYXIgUmVzU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6TGhzUGFja2V0IExoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlJoc1BhY2tldCBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpSZXNQYWNrZXQgUmVzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6QWNjUGFja2V0IEFjY1BhY2tldDsKKworICB0eXBlZGVmIGdlYnBfdHJhaXRzPFJoc1NjYWxhcixMaHNTY2FsYXIsQ29uanVnYXRlUmhzLENvbmp1Z2F0ZUxocz4gU3dhcHBlZFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTd2FwcGVkVHJhaXRzOjpSZXNTY2FsYXIgU1Jlc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTd2FwcGVkVHJhaXRzOjpMaHNQYWNrZXQgU0xoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTd2FwcGVkVHJhaXRzOjpSaHNQYWNrZXQgU1Joc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTd2FwcGVkVHJhaXRzOjpSZXNQYWNrZXQgU1Jlc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTd2FwcGVkVHJhaXRzOjpBY2NQYWNrZXQgU0FjY1BhY2tldDsKKworICB0eXBlZGVmIHR5cGVuYW1lIERhdGFNYXBwZXI6OkxpbmVhck1hcHBlciBMaW5lYXJNYXBwZXI7CisKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlICA9IFRyYWl0czo6VmVjdG9yaXphYmxlLAorICAgIExoc1Byb2dyZXNzICAgPSBUcmFpdHM6Okxoc1Byb2dyZXNzLAorICAgIFJoc1Byb2dyZXNzICAgPSBUcmFpdHM6OlJoc1Byb2dyZXNzLAorICAgIFJlc1BhY2tldFNpemUgPSBUcmFpdHM6OlJlc1BhY2tldFNpemUKKyAgfTsKKworICBFSUdFTl9ET05UX0lOTElORQorICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgRGF0YU1hcHBlciYgcmVzLCBjb25zdCBMaHNTY2FsYXIqIGJsb2NrQSwgY29uc3QgUmhzU2NhbGFyKiBibG9ja0IsCisgICAgICAgICAgICAgICAgICBJbmRleCByb3dzLCBJbmRleCBkZXB0aCwgSW5kZXggY29scywgUmVzU2NhbGFyIGFscGhhLAorICAgICAgICAgICAgICAgICAgSW5kZXggc3RyaWRlQT0tMSwgSW5kZXggc3RyaWRlQj0tMSwgSW5kZXggb2Zmc2V0QT0wLCBJbmRleCBvZmZzZXRCPTApOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBEYXRhTWFwcGVyLCBpbnQgbXIsIGludCBuciwgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPgorRUlHRU5fRE9OVF9JTkxJTkUKK3ZvaWQgZ2VicF9rZXJuZWw8TGhzU2NhbGFyLFJoc1NjYWxhcixJbmRleCxEYXRhTWFwcGVyLG1yLG5yLENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+CisgIDo6b3BlcmF0b3IoKShjb25zdCBEYXRhTWFwcGVyJiByZXMsIGNvbnN0IExoc1NjYWxhciogYmxvY2tBLCBjb25zdCBSaHNTY2FsYXIqIGJsb2NrQiwKKyAgICAgICAgICAgICAgIEluZGV4IHJvd3MsIEluZGV4IGRlcHRoLCBJbmRleCBjb2xzLCBSZXNTY2FsYXIgYWxwaGEsCisgICAgICAgICAgICAgICBJbmRleCBzdHJpZGVBLCBJbmRleCBzdHJpZGVCLCBJbmRleCBvZmZzZXRBLCBJbmRleCBvZmZzZXRCKQorICB7CisgICAgVHJhaXRzIHRyYWl0czsKKyAgICBTd2FwcGVkVHJhaXRzIHN0cmFpdHM7CisgICAgCisgICAgaWYoc3RyaWRlQT09LTEpIHN0cmlkZUEgPSBkZXB0aDsKKyAgICBpZihzdHJpZGVCPT0tMSkgc3RyaWRlQiA9IGRlcHRoOworICAgIGNvbmpfaGVscGVyPExoc1NjYWxhcixSaHNTY2FsYXIsQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocz4gY2o7CisgICAgSW5kZXggcGFja2V0X2NvbHM0ID0gbnI+PTQgPyAoY29scy80KSAqIDQgOiAwOworICAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzMgPSBtcj49MypUcmFpdHM6Okxoc1Byb2dyZXNzID8gKHJvd3MvKDMqTGhzUHJvZ3Jlc3MpKSooMypMaHNQcm9ncmVzcykgOiAwOworICAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzIgPSBtcj49MipUcmFpdHM6Okxoc1Byb2dyZXNzID8gcGVlbGVkX21jMysoKHJvd3MtcGVlbGVkX21jMykvKDIqTGhzUHJvZ3Jlc3MpKSooMipMaHNQcm9ncmVzcykgOiAwOworICAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzEgPSBtcj49MSpUcmFpdHM6Okxoc1Byb2dyZXNzID8gKHJvd3MvKDEqTGhzUHJvZ3Jlc3MpKSooMSpMaHNQcm9ncmVzcykgOiAwOworICAgIGVudW0geyBwayA9IDggfTsgLy8gTk9URSBTdWNoIGEgbGFyZ2UgcGVlbGluZyBmYWN0b3IgaXMgaW1wb3J0YW50IGZvciBsYXJnZSBtYXRyaWNlcyAofiArNSUgd2hlbiA+MTAwMCBvbiBIYXN3ZWxsKQorICAgIGNvbnN0IEluZGV4IHBlZWxlZF9rYyAgPSBkZXB0aCAmIH4ocGstMSk7CisgICAgY29uc3QgSW5kZXggcHJlZmV0Y2hfcmVzX29mZnNldCA9IDMyL3NpemVvZihSZXNTY2FsYXIpOyAgICAKKy8vICAgICBjb25zdCBJbmRleCBkZXB0aDIgICAgID0gZGVwdGggJiB+MTsKKworICAgIC8vLS0tLS0tLS0tLSBQcm9jZXNzIDMgKiBMaHNQcm9ncmVzcyByb3dzIGF0IG9uY2UgLS0tLS0tLS0tLQorICAgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gMypMaHNQcm9ncmVzcyB4IG5yIHJlZ2lzdGVyIGJsb2Nrcy4KKyAgICAvLyBVc3VhbGx5LCBtYWtlIHNlbnNlIG9ubHkgd2l0aCBGTUEKKyAgICBpZihtcj49MypUcmFpdHM6Okxoc1Byb2dyZXNzKQorICAgIHsKKyAgICAgIC8vIEhlcmUsIHRoZSBnZW5lcmFsIGlkZWEgaXMgdG8gbG9vcCBvbiBlYWNoIGxhcmdlc3QgbWljcm8gaG9yaXpvbnRhbCBwYW5lbCBvZiB0aGUgbGhzICgzKlRyYWl0czo6TGhzUHJvZ3Jlc3MgeCBkZXB0aCkKKyAgICAgIC8vIGFuZCBvbiBlYWNoIGxhcmdlc3QgbWljcm8gdmVydGljYWwgcGFuZWwgb2YgdGhlIHJocyAoZGVwdGggKiBucikuCisgICAgICAvLyBCbG9ja2luZyBzaXplcywgaS5lLiwgJ2RlcHRoJyBoYXMgYmVlbiBjb21wdXRlZCBzbyB0aGF0IHRoZSBtaWNybyBob3Jpem9udGFsIHBhbmVsIG9mIHRoZSBsaHMgZml0IGluIEwxLgorICAgICAgLy8gSG93ZXZlciwgaWYgZGVwdGggaXMgdG9vIHNtYWxsLCB3ZSBjYW4gZXh0ZW5kIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGVzZSBob3Jpem9udGFsIHBhbmVscy4KKyAgICAgIC8vIFRoaXMgYWN0dWFsIG51bWJlciBvZiByb3dzIGlzIGNvbXB1dGVkIGFzIGZvbGxvdzoKKyAgICAgIGNvbnN0IEluZGV4IGwxID0gZGVmYXVsdEwxQ2FjaGVTaXplOyAvLyBpbiBCeXRlcywgVE9ETywgbDEgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICAgLy8gVGhlIG1heCgxLCAuLi4pIGhlcmUgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgbWF5IGJlIHVzaW5nIGJsb2NraW5nIHBhcmFtcyBsYXJnZXIgdGhhbiB3aGF0IG91ciBrbm93biBsMSBjYWNoZSBzaXplCisgICAgICAvLyBzdWdnZXN0cyB3ZSBzaG91bGQgYmUgdXNpbmc6IGVpdGhlciBiZWNhdXNlIG91ciBrbm93biBsMSBjYWNoZSBzaXplIGlzIGluYWNjdXJhdGUgKGUuZy4gb24gQW5kcm9pZCwgd2UgY2FuIG9ubHkgZ3Vlc3MpLAorICAgICAgLy8gb3IgYmVjYXVzZSB3ZSBhcmUgdGVzdGluZyBzcGVjaWZpYyBibG9ja2luZyBzaXplcy4KKyAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9wYW5lbF9yb3dzID0gKDMqTGhzUHJvZ3Jlc3MpICogc3RkOjptYXg8SW5kZXg+KDEsKCAobDEgLSBzaXplb2YoUmVzU2NhbGFyKSptcipuciAtIGRlcHRoKm5yKnNpemVvZihSaHNTY2FsYXIpKSAvIChkZXB0aCAqIHNpemVvZihMaHNTY2FsYXIpICogMypMaHNQcm9ncmVzcykgKSk7CisgICAgICBmb3IoSW5kZXggaTE9MDsgaTE8cGVlbGVkX21jMzsgaTErPWFjdHVhbF9wYW5lbF9yb3dzKQorICAgICAgeworICAgICAgICBjb25zdCBJbmRleCBhY3R1YWxfcGFuZWxfZW5kID0gKHN0ZDo6bWluKShpMSthY3R1YWxfcGFuZWxfcm93cywgcGVlbGVkX21jMyk7CisgICAgICAgIGZvcihJbmRleCBqMj0wOyBqMjxwYWNrZXRfY29sczQ7IGoyKz1ucikKKyAgICAgICAgeworICAgICAgICAgIGZvcihJbmRleCBpPWkxOyBpPGFjdHVhbF9wYW5lbF9lbmQ7IGkrPTMqTGhzUHJvZ3Jlc3MpCisgICAgICAgICAgeworICAgICAgICAgIAorICAgICAgICAgIC8vIFdlIHNlbGVjdGVkIGEgMypUcmFpdHM6Okxoc1Byb2dyZXNzIHggbnIgbWljcm8gYmxvY2sgb2YgcmVzIHdoaWNoIGlzIGVudGlyZWx5CisgICAgICAgICAgLy8gc3RvcmVkIGludG8gMyB4IG5yIHJlZ2lzdGVycy4KKyAgICAgICAgICAKKyAgICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEEqKDMqTGhzUHJvZ3Jlc3MpXTsKKyAgICAgICAgICBwcmVmZXRjaCgmYmxBWzBdKTsKKworICAgICAgICAgIC8vIGdldHMgcmVzIGJsb2NrIGFzIHJlZ2lzdGVyCisgICAgICAgICAgQWNjUGFja2V0IEMwLCBDMSwgQzIsICBDMywKKyAgICAgICAgICAgICAgICAgICAgQzQsIEM1LCBDNiwgIEM3LAorICAgICAgICAgICAgICAgICAgICBDOCwgQzksIEMxMCwgQzExOworICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsgIHRyYWl0cy5pbml0QWNjKEMxKTsgIHRyYWl0cy5pbml0QWNjKEMyKTsgIHRyYWl0cy5pbml0QWNjKEMzKTsKKyAgICAgICAgICB0cmFpdHMuaW5pdEFjYyhDNCk7ICB0cmFpdHMuaW5pdEFjYyhDNSk7ICB0cmFpdHMuaW5pdEFjYyhDNik7ICB0cmFpdHMuaW5pdEFjYyhDNyk7CisgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzgpOyAgdHJhaXRzLmluaXRBY2MoQzkpOyAgdHJhaXRzLmluaXRBY2MoQzEwKTsgdHJhaXRzLmluaXRBY2MoQzExKTsKKworICAgICAgICAgIExpbmVhck1hcHBlciByMCA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIgKyAwKTsKKyAgICAgICAgICBMaW5lYXJNYXBwZXIgcjEgPSByZXMuZ2V0TGluZWFyTWFwcGVyKGksIGoyICsgMSk7CisgICAgICAgICAgTGluZWFyTWFwcGVyIHIyID0gcmVzLmdldExpbmVhck1hcHBlcihpLCBqMiArIDIpOworICAgICAgICAgIExpbmVhck1hcHBlciByMyA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIgKyAzKTsKKworICAgICAgICAgIHIwLnByZWZldGNoKDApOworICAgICAgICAgIHIxLnByZWZldGNoKDApOworICAgICAgICAgIHIyLnByZWZldGNoKDApOworICAgICAgICAgIHIzLnByZWZldGNoKDApOworCisgICAgICAgICAgLy8gcGVyZm9ybXMgImlubmVyIiBwcm9kdWN0cworICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gJmJsb2NrQltqMipzdHJpZGVCK29mZnNldEIqbnJdOworICAgICAgICAgIHByZWZldGNoKCZibEJbMF0pOworICAgICAgICAgIExoc1BhY2tldCBBMCwgQTE7CisKKyAgICAgICAgICBmb3IoSW5kZXggaz0wOyBrPHBlZWxlZF9rYzsgays9cGspCisgICAgICAgICAgeworICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIGdlYnAgbWljcm8ga2VybmVsIDNwWDQiKTsKKyAgICAgICAgICAgIFJoc1BhY2tldCBCXzAsIFQwOworICAgICAgICAgICAgTGhzUGFja2V0IEEyOworCisjZGVmaW5lIEVJR0VOX0dFQlBfT05FU1RFUChLKSBcCisgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgM3BYNCIpOyBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJOb3RlOiB0aGVzZSBhc20gY29tbWVudHMgd29yayBhcm91bmQgYnVnIDkzNSEiKTsgXAorICAgICAgICAgICAgICBpbnRlcm5hbDo6cHJlZmV0Y2goYmxBKygzKksrMTYpKkxoc1Byb2dyZXNzKTsgXAorICAgICAgICAgICAgICBpZiAoRUlHRU5fQVJDSF9BUk0pIHsgaW50ZXJuYWw6OnByZWZldGNoKGJsQisoNCpLKzE2KSpSaHNQcm9ncmVzcyk7IH0gLyogQnVnIDk1MyAqLyBcCisgICAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbKDArMypLKSpMaHNQcm9ncmVzc10sIEEwKTsgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsoMSszKkspKkxoc1Byb2dyZXNzXSwgQTEpOyAgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWygyKzMqSykqTGhzUHJvZ3Jlc3NdLCBBMik7ICBcCisgICAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKGJsQiArICgwKzQqSykqVHJhaXRzOjpSaHNQcm9ncmVzcywgQl8wKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMCwgQl8wLCBDMCwgVDApOyBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLCBCXzAsIEM0LCBUMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTIsIEJfMCwgQzgsIEJfMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoYmxCICsgKDErNCpLKSpUcmFpdHM6OlJoc1Byb2dyZXNzLCBCXzApOyBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCXzAsIEMxLCBUMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsIEJfMCwgQzUsIFQwKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMiwgQl8wLCBDOSwgQl8wKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZFJocyhibEIgKyAoMis0KkspKlRyYWl0czo6UmhzUHJvZ3Jlc3MsIEJfMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsIEJfMCwgQzIsICBUMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsIEJfMCwgQzYsICBUMCk7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTIsIEJfMCwgQzEwLCBCXzApOyBcCisgICAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKGJsQiArICgzKzQqSykqVHJhaXRzOjpSaHNQcm9ncmVzcywgQl8wKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMCwgQl8wLCBDMyAsIFQwKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMSwgQl8wLCBDNywgIFQwKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMiwgQl8wLCBDMTEsIEJfMCk7IFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBzdGVwIG9mIGdlYnAgbWljcm8ga2VybmVsIDNwWDQiKTsgXAorICAgICAgICAgICAgfSB3aGlsZShmYWxzZSkKKworICAgICAgICAgICAgaW50ZXJuYWw6OnByZWZldGNoKGJsQik7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoMCk7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoMSk7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoMik7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoMyk7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoNCk7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoNSk7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoNik7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoNyk7CisKKyAgICAgICAgICAgIGJsQiArPSBwayo0KlJoc1Byb2dyZXNzOworICAgICAgICAgICAgYmxBICs9IHBrKjMqVHJhaXRzOjpMaHNQcm9ncmVzczsKKworICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBnZWJwIG1pY3JvIGtlcm5lbCAzcFg0Iik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIHByb2Nlc3MgcmVtYWluaW5nIHBlZWxlZCBsb29wCisgICAgICAgICAgZm9yKEluZGV4IGs9cGVlbGVkX2tjOyBrPGRlcHRoOyBrKyspCisgICAgICAgICAgeworICAgICAgICAgICAgUmhzUGFja2V0IEJfMCwgVDA7CisgICAgICAgICAgICBMaHNQYWNrZXQgQTI7CisgICAgICAgICAgICBFSUdFTl9HRUJQX09ORVNURVAoMCk7CisgICAgICAgICAgICBibEIgKz0gNCpSaHNQcm9ncmVzczsKKyAgICAgICAgICAgIGJsQSArPSAzKlRyYWl0czo6TGhzUHJvZ3Jlc3M7CisgICAgICAgICAgfQorCisjdW5kZWYgRUlHRU5fR0VCUF9PTkVTVEVQCisKKyAgICAgICAgICBSZXNQYWNrZXQgUjAsIFIxLCBSMjsKKyAgICAgICAgICBSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8UmVzUGFja2V0PihhbHBoYSk7CisKKyAgICAgICAgICBSMCA9IHIwLmxvYWRQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjEgPSByMC5sb2FkUGFja2V0KDEgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIyID0gcjAubG9hZFBhY2tldCgyICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMwLCBhbHBoYXYsIFIwKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM0LCBhbHBoYXYsIFIxKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM4LCBhbHBoYXYsIFIyKTsKKyAgICAgICAgICByMC5zdG9yZVBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMCk7CisgICAgICAgICAgcjAuc3RvcmVQYWNrZXQoMSAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjEpOworICAgICAgICAgIHIwLnN0b3JlUGFja2V0KDIgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIyKTsKKworICAgICAgICAgIFIwID0gcjEubG9hZFBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMSA9IHIxLmxvYWRQYWNrZXQoMSAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjIgPSByMS5sb2FkUGFja2V0KDIgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzEsIGFscGhhdiwgUjApOworICAgICAgICAgIHRyYWl0cy5hY2MoQzUsIGFscGhhdiwgUjEpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzksIGFscGhhdiwgUjIpOworICAgICAgICAgIHIxLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMS5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgICAgcjEuc3RvcmVQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjIpOworCisgICAgICAgICAgUjAgPSByMi5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIxID0gcjIubG9hZFBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMiA9IHIyLmxvYWRQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMiwgYWxwaGF2LCBSMCk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDNiwgYWxwaGF2LCBSMSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMTAsIGFscGhhdiwgUjIpOworICAgICAgICAgIHIyLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMi5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgICAgcjIuc3RvcmVQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjIpOworCisgICAgICAgICAgUjAgPSByMy5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIxID0gcjMubG9hZFBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMiA9IHIzLmxvYWRQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMywgYWxwaGF2LCBSMCk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDNywgYWxwaGF2LCBSMSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMTEsIGFscGhhdiwgUjIpOworICAgICAgICAgIHIzLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMy5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgICAgcjMuc3RvcmVQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjIpOyAgICAgICAgICAKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWFsIHdpdGggcmVtYWluaW5nIGNvbHVtbnMgb2YgdGhlIHJocworICAgICAgICBmb3IoSW5kZXggajI9cGFja2V0X2NvbHM0OyBqMjxjb2xzOyBqMisrKQorICAgICAgICB7CisgICAgICAgICAgZm9yKEluZGV4IGk9aTE7IGk8YWN0dWFsX3BhbmVsX2VuZDsgaSs9MypMaHNQcm9ncmVzcykKKyAgICAgICAgICB7CisgICAgICAgICAgLy8gT25lIGNvbHVtbiBhdCBhIHRpbWUKKyAgICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEEqKDMqVHJhaXRzOjpMaHNQcm9ncmVzcyldOworICAgICAgICAgIHByZWZldGNoKCZibEFbMF0pOworCisgICAgICAgICAgLy8gZ2V0cyByZXMgYmxvY2sgYXMgcmVnaXN0ZXIKKyAgICAgICAgICBBY2NQYWNrZXQgQzAsIEM0LCBDODsKKyAgICAgICAgICB0cmFpdHMuaW5pdEFjYyhDMCk7CisgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzQpOworICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEM4KTsKKworICAgICAgICAgIExpbmVhck1hcHBlciByMCA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIpOworICAgICAgICAgIHIwLnByZWZldGNoKDApOworCisgICAgICAgICAgLy8gcGVyZm9ybXMgImlubmVyIiBwcm9kdWN0cworICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gJmJsb2NrQltqMipzdHJpZGVCK29mZnNldEJdOworICAgICAgICAgIExoc1BhY2tldCBBMCwgQTEsIEEyOworICAgICAgICAgIAorICAgICAgICAgIGZvcihJbmRleCBrPTA7IGs8cGVlbGVkX2tjOyBrKz1waykKKyAgICAgICAgICB7CisgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gZ2VicCBtaWNybyBrZXJuZWwgM3BYMSIpOworICAgICAgICAgICAgUmhzUGFja2V0IEJfMDsKKyNkZWZpbmUgRUlHRU5fR0VCR1BfT05FU1RFUChLKSBcCisgICAgICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgM3BYMSIpOyBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJOb3RlOiB0aGVzZSBhc20gY29tbWVudHMgd29yayBhcm91bmQgYnVnIDkzNSEiKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWygwKzMqSykqTGhzUHJvZ3Jlc3NdLCBBMCk7ICBcCisgICAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbKDErMypLKSpMaHNQcm9ncmVzc10sIEExKTsgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsoMiszKkspKkxoc1Byb2dyZXNzXSwgQTIpOyAgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWygwK0spKlJoc1Byb2dyZXNzXSwgQl8wKTsgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCXzAsIEMwLCBCXzApOyBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLCBCXzAsIEM0LCBCXzApOyBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEyLCBCXzAsIEM4LCBCXzApOyBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgc3RlcCBvZiBnZWJwIG1pY3JvIGtlcm5lbCAzcFgxIik7IFwKKyAgICAgICAgICAgIH0gd2hpbGUoZmFsc2UpCisgICAgICAgIAorICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgwKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMSk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDIpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgzKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNCk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDUpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg2KTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNyk7CisKKyAgICAgICAgICAgIGJsQiArPSBwaypSaHNQcm9ncmVzczsKKyAgICAgICAgICAgIGJsQSArPSBwayozKlRyYWl0czo6TGhzUHJvZ3Jlc3M7CisKKyAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgZ2VicCBtaWNybyBrZXJuZWwgM3BYMSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIHByb2Nlc3MgcmVtYWluaW5nIHBlZWxlZCBsb29wCisgICAgICAgICAgZm9yKEluZGV4IGs9cGVlbGVkX2tjOyBrPGRlcHRoOyBrKyspCisgICAgICAgICAgeworICAgICAgICAgICAgUmhzUGFja2V0IEJfMDsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMCk7CisgICAgICAgICAgICBibEIgKz0gUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgICBibEEgKz0gMypUcmFpdHM6Okxoc1Byb2dyZXNzOworICAgICAgICAgIH0KKyN1bmRlZiBFSUdFTl9HRUJHUF9PTkVTVEVQCisgICAgICAgICAgUmVzUGFja2V0IFIwLCBSMSwgUjI7CisgICAgICAgICAgUmVzUGFja2V0IGFscGhhdiA9IHBzZXQxPFJlc1BhY2tldD4oYWxwaGEpOworCisgICAgICAgICAgUjAgPSByMC5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIxID0gcjAubG9hZFBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMiA9IHIwLmxvYWRQYWNrZXQoMiAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMCwgYWxwaGF2LCBSMCk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDNCwgYWxwaGF2LCBSMSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDOCwgYWxwaGF2LCBSMik7CisgICAgICAgICAgcjAuc3RvcmVQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjApOworICAgICAgICAgIHIwLnN0b3JlUGFja2V0KDEgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIxKTsKKyAgICAgICAgICByMC5zdG9yZVBhY2tldCgyICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMik7ICAgICAgICAgIAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLSBQcm9jZXNzIDIgKiBMaHNQcm9ncmVzcyByb3dzIGF0IG9uY2UgLS0tLS0tLS0tLQorICAgIGlmKG1yPj0yKlRyYWl0czo6TGhzUHJvZ3Jlc3MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggbDEgPSBkZWZhdWx0TDFDYWNoZVNpemU7IC8vIGluIEJ5dGVzLCBUT0RPLCBsMSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAvLyBUaGUgbWF4KDEsIC4uLikgaGVyZSBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBtYXkgYmUgdXNpbmcgYmxvY2tpbmcgcGFyYW1zIGxhcmdlciB0aGFuIHdoYXQgb3VyIGtub3duIGwxIGNhY2hlIHNpemUKKyAgICAgIC8vIHN1Z2dlc3RzIHdlIHNob3VsZCBiZSB1c2luZzogZWl0aGVyIGJlY2F1c2Ugb3VyIGtub3duIGwxIGNhY2hlIHNpemUgaXMgaW5hY2N1cmF0ZSAoZS5nLiBvbiBBbmRyb2lkLCB3ZSBjYW4gb25seSBndWVzcyksCisgICAgICAvLyBvciBiZWNhdXNlIHdlIGFyZSB0ZXN0aW5nIHNwZWNpZmljIGJsb2NraW5nIHNpemVzLgorICAgICAgSW5kZXggYWN0dWFsX3BhbmVsX3Jvd3MgPSAoMipMaHNQcm9ncmVzcykgKiBzdGQ6Om1heDxJbmRleD4oMSwoIChsMSAtIHNpemVvZihSZXNTY2FsYXIpKm1yKm5yIC0gZGVwdGgqbnIqc2l6ZW9mKFJoc1NjYWxhcikpIC8gKGRlcHRoICogc2l6ZW9mKExoc1NjYWxhcikgKiAyKkxoc1Byb2dyZXNzKSApKTsKKworICAgICAgZm9yKEluZGV4IGkxPXBlZWxlZF9tYzM7IGkxPHBlZWxlZF9tYzI7IGkxKz1hY3R1YWxfcGFuZWxfcm93cykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggYWN0dWFsX3BhbmVsX2VuZCA9IChzdGQ6Om1pbikoaTErYWN0dWFsX3BhbmVsX3Jvd3MsIHBlZWxlZF9tYzIpOworICAgICAgICBmb3IoSW5kZXggajI9MDsgajI8cGFja2V0X2NvbHM0OyBqMis9bnIpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IoSW5kZXggaT1pMTsgaTxhY3R1YWxfcGFuZWxfZW5kOyBpKz0yKkxoc1Byb2dyZXNzKQorICAgICAgICAgIHsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBXZSBzZWxlY3RlZCBhIDIqVHJhaXRzOjpMaHNQcm9ncmVzcyB4IG5yIG1pY3JvIGJsb2NrIG9mIHJlcyB3aGljaCBpcyBlbnRpcmVseQorICAgICAgICAgIC8vIHN0b3JlZCBpbnRvIDIgeCBuciByZWdpc3RlcnMuCisgICAgICAgICAgCisgICAgICAgICAgY29uc3QgTGhzU2NhbGFyKiBibEEgPSAmYmxvY2tBW2kqc3RyaWRlQStvZmZzZXRBKigyKlRyYWl0czo6TGhzUHJvZ3Jlc3MpXTsKKyAgICAgICAgICBwcmVmZXRjaCgmYmxBWzBdKTsKKworICAgICAgICAgIC8vIGdldHMgcmVzIGJsb2NrIGFzIHJlZ2lzdGVyCisgICAgICAgICAgQWNjUGFja2V0IEMwLCBDMSwgQzIsIEMzLAorICAgICAgICAgICAgICAgICAgICBDNCwgQzUsIEM2LCBDNzsKKyAgICAgICAgICB0cmFpdHMuaW5pdEFjYyhDMCk7IHRyYWl0cy5pbml0QWNjKEMxKTsgdHJhaXRzLmluaXRBY2MoQzIpOyB0cmFpdHMuaW5pdEFjYyhDMyk7CisgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzQpOyB0cmFpdHMuaW5pdEFjYyhDNSk7IHRyYWl0cy5pbml0QWNjKEM2KTsgdHJhaXRzLmluaXRBY2MoQzcpOworCisgICAgICAgICAgTGluZWFyTWFwcGVyIHIwID0gcmVzLmdldExpbmVhck1hcHBlcihpLCBqMiArIDApOworICAgICAgICAgIExpbmVhck1hcHBlciByMSA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIgKyAxKTsKKyAgICAgICAgICBMaW5lYXJNYXBwZXIgcjIgPSByZXMuZ2V0TGluZWFyTWFwcGVyKGksIGoyICsgMik7CisgICAgICAgICAgTGluZWFyTWFwcGVyIHIzID0gcmVzLmdldExpbmVhck1hcHBlcihpLCBqMiArIDMpOworCisgICAgICAgICAgcjAucHJlZmV0Y2gocHJlZmV0Y2hfcmVzX29mZnNldCk7CisgICAgICAgICAgcjEucHJlZmV0Y2gocHJlZmV0Y2hfcmVzX29mZnNldCk7CisgICAgICAgICAgcjIucHJlZmV0Y2gocHJlZmV0Y2hfcmVzX29mZnNldCk7CisgICAgICAgICAgcjMucHJlZmV0Y2gocHJlZmV0Y2hfcmVzX29mZnNldCk7CisKKyAgICAgICAgICAvLyBwZXJmb3JtcyAiaW5uZXIiIHByb2R1Y3RzCisgICAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBibEIgPSAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Qipucl07CisgICAgICAgICAgcHJlZmV0Y2goJmJsQlswXSk7CisgICAgICAgICAgTGhzUGFja2V0IEEwLCBBMTsKKworICAgICAgICAgIGZvcihJbmRleCBrPTA7IGs8cGVlbGVkX2tjOyBrKz1waykKKyAgICAgICAgICB7CisgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gZ2VicCBtaWNybyBrZXJuZWwgMnBYNCIpOworICAgICAgICAgICAgUmhzUGFja2V0IEJfMCwgQjEsIEIyLCBCMywgVDA7CisKKyAgICNkZWZpbmUgRUlHRU5fR0VCR1BfT05FU1RFUChLKSBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgMnBYNCIpOyAgICAgICAgXAorICAgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiTm90ZTogdGhlc2UgYXNtIGNvbW1lbnRzIHdvcmsgYXJvdW5kIGJ1ZyA5MzUhIik7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsoMCsyKkspKkxoc1Byb2dyZXNzXSwgQTApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWygxKzIqSykqTGhzUHJvZ3Jlc3NdLCBBMSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5icm9hZGNhc3RSaHMoJmJsQlsoMCs0KkspKlJoc1Byb2dyZXNzXSwgQl8wLCBCMSwgQjIsIEIzKTsgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsIEJfMCwgQzAsIFQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMSwgQl8wLCBDNCwgQl8wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCMSwgIEMxLCBUMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsIEIxLCAgQzUsIEIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMCwgQjIsICBDMiwgVDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLCBCMiwgIEM2LCBCMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsIEIzLCAgQzMsIFQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMSwgQjMsICBDNywgQjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgc3RlcCBvZiBnZWJwIG1pY3JvIGtlcm5lbCAycFg0Iik7ICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gd2hpbGUoZmFsc2UpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludGVybmFsOjpwcmVmZXRjaChibEIrKDQ4KzApKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMCk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDEpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgyKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMyk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cHJlZmV0Y2goYmxCKyg0OCsxNikpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg0KTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNSk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDYpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg3KTsKKworICAgICAgICAgICAgYmxCICs9IHBrKjQqUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgICBibEEgKz0gcGsqKDIqVHJhaXRzOjpMaHNQcm9ncmVzcyk7CisKKyAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgZ2VicCBtaWNybyBrZXJuZWwgMnBYNCIpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBwZWVsZWQgbG9vcAorICAgICAgICAgIGZvcihJbmRleCBrPXBlZWxlZF9rYzsgazxkZXB0aDsgaysrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFJoc1BhY2tldCBCXzAsIEIxLCBCMiwgQjMsIFQwOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgwKTsKKyAgICAgICAgICAgIGJsQiArPSA0KlJoc1Byb2dyZXNzOworICAgICAgICAgICAgYmxBICs9IDIqVHJhaXRzOjpMaHNQcm9ncmVzczsKKyAgICAgICAgICB9CisjdW5kZWYgRUlHRU5fR0VCR1BfT05FU1RFUAorCisgICAgICAgICAgUmVzUGFja2V0IFIwLCBSMSwgUjIsIFIzOworICAgICAgICAgIFJlc1BhY2tldCBhbHBoYXYgPSBwc2V0MTxSZXNQYWNrZXQ+KGFscGhhKTsKKworICAgICAgICAgIFIwID0gcjAubG9hZFBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMSA9IHIwLmxvYWRQYWNrZXQoMSAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjIgPSByMS5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIzID0gcjEubG9hZFBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMwLCBhbHBoYXYsIFIwKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM0LCBhbHBoYXYsIFIxKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMxLCBhbHBoYXYsIFIyKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM1LCBhbHBoYXYsIFIzKTsKKyAgICAgICAgICByMC5zdG9yZVBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMCk7CisgICAgICAgICAgcjAuc3RvcmVQYWNrZXQoMSAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjEpOworICAgICAgICAgIHIxLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIyKTsKKyAgICAgICAgICByMS5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMyk7CisKKyAgICAgICAgICBSMCA9IHIyLmxvYWRQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjEgPSByMi5sb2FkUGFja2V0KDEgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIyID0gcjMubG9hZFBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSMyA9IHIzLmxvYWRQYWNrZXQoMSAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMiwgIGFscGhhdiwgUjApOworICAgICAgICAgIHRyYWl0cy5hY2MoQzYsICBhbHBoYXYsIFIxKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMzLCAgYWxwaGF2LCBSMik7CisgICAgICAgICAgdHJhaXRzLmFjYyhDNywgIGFscGhhdiwgUjMpOworICAgICAgICAgIHIyLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMi5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgICAgcjMuc3RvcmVQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjIpOworICAgICAgICAgIHIzLnN0b3JlUGFja2V0KDEgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICAvLyBEZWFsIHdpdGggcmVtYWluaW5nIGNvbHVtbnMgb2YgdGhlIHJocworICAgICAgICBmb3IoSW5kZXggajI9cGFja2V0X2NvbHM0OyBqMjxjb2xzOyBqMisrKQorICAgICAgICB7CisgICAgICAgICAgZm9yKEluZGV4IGk9aTE7IGk8YWN0dWFsX3BhbmVsX2VuZDsgaSs9MipMaHNQcm9ncmVzcykKKyAgICAgICAgICB7CisgICAgICAgICAgLy8gT25lIGNvbHVtbiBhdCBhIHRpbWUKKyAgICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEEqKDIqVHJhaXRzOjpMaHNQcm9ncmVzcyldOworICAgICAgICAgIHByZWZldGNoKCZibEFbMF0pOworCisgICAgICAgICAgLy8gZ2V0cyByZXMgYmxvY2sgYXMgcmVnaXN0ZXIKKyAgICAgICAgICBBY2NQYWNrZXQgQzAsIEM0OworICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsKKyAgICAgICAgICB0cmFpdHMuaW5pdEFjYyhDNCk7CisKKyAgICAgICAgICBMaW5lYXJNYXBwZXIgcjAgPSByZXMuZ2V0TGluZWFyTWFwcGVyKGksIGoyKTsKKyAgICAgICAgICByMC5wcmVmZXRjaChwcmVmZXRjaF9yZXNfb2Zmc2V0KTsKKworICAgICAgICAgIC8vIHBlcmZvcm1zICJpbm5lciIgcHJvZHVjdHMKKyAgICAgICAgICBjb25zdCBSaHNTY2FsYXIqIGJsQiA9ICZibG9ja0JbajIqc3RyaWRlQitvZmZzZXRCXTsKKyAgICAgICAgICBMaHNQYWNrZXQgQTAsIEExOworCisgICAgICAgICAgZm9yKEluZGV4IGs9MDsgazxwZWVsZWRfa2M7IGsrPXBrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJiZWdpbiBnZWJwIG1pY3JvIGtlcm5lbCAycFgxIik7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wLCBCMTsKKyAgICAgICAgCisjZGVmaW5lIEVJR0VOX0dFQkdQX09ORVNURVAoSykgXAorICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgMnBYMSIpOyAgICAgICAgICBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJOb3RlOiB0aGVzZSBhc20gY29tbWVudHMgd29yayBhcm91bmQgYnVnIDkzNSEiKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWygwKzIqSykqTGhzUHJvZ3Jlc3NdLCBBMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsoMSsyKkspKkxoc1Byb2dyZXNzXSwgQTEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbKDArSykqUmhzUHJvZ3Jlc3NdLCBCXzApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMCwgQl8wLCBDMCwgQjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsIEJfMCwgQzQsIEJfMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgc3RlcCBvZiBnZWJwIG1pY3JvIGtlcm5lbCAycFgxIik7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSB3aGlsZShmYWxzZSkKKyAgICAgICAgCisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDApOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgxKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMik7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDMpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg0KTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNSk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDYpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg3KTsKKworICAgICAgICAgICAgYmxCICs9IHBrKlJoc1Byb2dyZXNzOworICAgICAgICAgICAgYmxBICs9IHBrKjIqVHJhaXRzOjpMaHNQcm9ncmVzczsKKworICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBnZWJwIG1pY3JvIGtlcm5lbCAycFgxIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgcGVlbGVkIGxvb3AKKyAgICAgICAgICBmb3IoSW5kZXggaz1wZWVsZWRfa2M7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wLCBCMTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMCk7CisgICAgICAgICAgICBibEIgKz0gUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgICBibEEgKz0gMipUcmFpdHM6Okxoc1Byb2dyZXNzOworICAgICAgICAgIH0KKyN1bmRlZiBFSUdFTl9HRUJHUF9PTkVTVEVQCisgICAgICAgICAgUmVzUGFja2V0IFIwLCBSMTsKKyAgICAgICAgICBSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8UmVzUGFja2V0PihhbHBoYSk7CisKKyAgICAgICAgICBSMCA9IHIwLmxvYWRQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjEgPSByMC5sb2FkUGFja2V0KDEgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzAsIGFscGhhdiwgUjApOworICAgICAgICAgIHRyYWl0cy5hY2MoQzQsIGFscGhhdiwgUjEpOworICAgICAgICAgIHIwLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMC5zdG9yZVBhY2tldCgxICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vLS0tLS0tLS0tLSBQcm9jZXNzIDEgKiBMaHNQcm9ncmVzcyByb3dzIGF0IG9uY2UgLS0tLS0tLS0tLQorICAgIGlmKG1yPj0xKlRyYWl0czo6TGhzUHJvZ3Jlc3MpCisgICAgeworICAgICAgLy8gbG9vcHMgb24gZWFjaCBsYXJnZXN0IG1pY3JvIGhvcml6b250YWwgcGFuZWwgb2YgbGhzICgxKkxoc1Byb2dyZXNzIHggZGVwdGgpCisgICAgICBmb3IoSW5kZXggaT1wZWVsZWRfbWMyOyBpPHBlZWxlZF9tYzE7IGkrPTEqTGhzUHJvZ3Jlc3MpCisgICAgICB7CisgICAgICAgIC8vIGxvb3BzIG9uIGVhY2ggbGFyZ2VzdCBtaWNybyB2ZXJ0aWNhbCBwYW5lbCBvZiByaHMgKGRlcHRoICogbnIpCisgICAgICAgIGZvcihJbmRleCBqMj0wOyBqMjxwYWNrZXRfY29sczQ7IGoyKz1ucikKKyAgICAgICAgeworICAgICAgICAgIC8vIFdlIHNlbGVjdCBhIDEqVHJhaXRzOjpMaHNQcm9ncmVzcyB4IG5yIG1pY3JvIGJsb2NrIG9mIHJlcyB3aGljaCBpcyBlbnRpcmVseQorICAgICAgICAgIC8vIHN0b3JlZCBpbnRvIDEgeCBuciByZWdpc3RlcnMuCisgICAgICAgICAgCisgICAgICAgICAgY29uc3QgTGhzU2NhbGFyKiBibEEgPSAmYmxvY2tBW2kqc3RyaWRlQStvZmZzZXRBKigxKlRyYWl0czo6TGhzUHJvZ3Jlc3MpXTsKKyAgICAgICAgICBwcmVmZXRjaCgmYmxBWzBdKTsKKworICAgICAgICAgIC8vIGdldHMgcmVzIGJsb2NrIGFzIHJlZ2lzdGVyCisgICAgICAgICAgQWNjUGFja2V0IEMwLCBDMSwgQzIsIEMzOworICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsKKyAgICAgICAgICB0cmFpdHMuaW5pdEFjYyhDMSk7CisgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzIpOworICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMzKTsKKworICAgICAgICAgIExpbmVhck1hcHBlciByMCA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIgKyAwKTsKKyAgICAgICAgICBMaW5lYXJNYXBwZXIgcjEgPSByZXMuZ2V0TGluZWFyTWFwcGVyKGksIGoyICsgMSk7CisgICAgICAgICAgTGluZWFyTWFwcGVyIHIyID0gcmVzLmdldExpbmVhck1hcHBlcihpLCBqMiArIDIpOworICAgICAgICAgIExpbmVhck1hcHBlciByMyA9IHJlcy5nZXRMaW5lYXJNYXBwZXIoaSwgajIgKyAzKTsKKworICAgICAgICAgIHIwLnByZWZldGNoKHByZWZldGNoX3Jlc19vZmZzZXQpOworICAgICAgICAgIHIxLnByZWZldGNoKHByZWZldGNoX3Jlc19vZmZzZXQpOworICAgICAgICAgIHIyLnByZWZldGNoKHByZWZldGNoX3Jlc19vZmZzZXQpOworICAgICAgICAgIHIzLnByZWZldGNoKHByZWZldGNoX3Jlc19vZmZzZXQpOworCisgICAgICAgICAgLy8gcGVyZm9ybXMgImlubmVyIiBwcm9kdWN0cworICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gJmJsb2NrQltqMipzdHJpZGVCK29mZnNldEIqbnJdOworICAgICAgICAgIHByZWZldGNoKCZibEJbMF0pOworICAgICAgICAgIExoc1BhY2tldCBBMDsKKworICAgICAgICAgIGZvcihJbmRleCBrPTA7IGs8cGVlbGVkX2tjOyBrKz1waykKKyAgICAgICAgICB7CisgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gZ2VicCBtaWNybyBrZXJuZWwgMXBYNCIpOworICAgICAgICAgICAgUmhzUGFja2V0IEJfMCwgQjEsIEIyLCBCMzsKKyAgICAgICAgICAgICAgIAorI2RlZmluZSBFSUdFTl9HRUJHUF9PTkVTVEVQKEspIFwKKyAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gc3RlcCBvZiBnZWJwIG1pY3JvIGtlcm5lbCAxcFg0Iik7ICAgICAgICBcCisgICAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJOb3RlOiB0aGVzZSBhc20gY29tbWVudHMgd29yayBhcm91bmQgYnVnIDkzNSEiKTsgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWygwKzEqSykqTGhzUHJvZ3Jlc3NdLCBBMCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5icm9hZGNhc3RSaHMoJmJsQlsoMCs0KkspKlJoc1Byb2dyZXNzXSwgQl8wLCBCMSwgQjIsIEIzKTsgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsIEJfMCwgQzAsIEJfMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubWFkZChBMCwgQjEsICBDMSwgQjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCMiwgIEMyLCBCMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsIEIzLCAgQzMsIEIzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgMXBYNCIpOyAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlKGZhbHNlKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpbnRlcm5hbDo6cHJlZmV0Y2goYmxCKyg0OCswKSk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDApOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgxKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMik7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDMpOworICAgICAgICAgICAgaW50ZXJuYWw6OnByZWZldGNoKGJsQisoNDgrMTYpKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNCk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDUpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg2KTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNyk7CisKKyAgICAgICAgICAgIGJsQiArPSBwayo0KlJoc1Byb2dyZXNzOworICAgICAgICAgICAgYmxBICs9IHBrKjEqTGhzUHJvZ3Jlc3M7CisKKyAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgZ2VicCBtaWNybyBrZXJuZWwgMXBYNCIpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBwZWVsZWQgbG9vcAorICAgICAgICAgIGZvcihJbmRleCBrPXBlZWxlZF9rYzsgazxkZXB0aDsgaysrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFJoc1BhY2tldCBCXzAsIEIxLCBCMiwgQjM7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDApOworICAgICAgICAgICAgYmxCICs9IDQqUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgICBibEEgKz0gMSpMaHNQcm9ncmVzczsKKyAgICAgICAgICB9CisjdW5kZWYgRUlHRU5fR0VCR1BfT05FU1RFUAorCisgICAgICAgICAgUmVzUGFja2V0IFIwLCBSMTsKKyAgICAgICAgICBSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8UmVzUGFja2V0PihhbHBoYSk7CisKKyAgICAgICAgICBSMCA9IHIwLmxvYWRQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjEgPSByMS5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzAsIGFscGhhdiwgUjApOworICAgICAgICAgIHRyYWl0cy5hY2MoQzEsICBhbHBoYXYsIFIxKTsKKyAgICAgICAgICByMC5zdG9yZVBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMCk7CisgICAgICAgICAgcjEuc3RvcmVQYWNrZXQoMCAqIFRyYWl0czo6UmVzUGFja2V0U2l6ZSwgUjEpOworCisgICAgICAgICAgUjAgPSByMi5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIFIxID0gcjMubG9hZFBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMyLCAgYWxwaGF2LCBSMCk7CisgICAgICAgICAgdHJhaXRzLmFjYyhDMywgIGFscGhhdiwgUjEpOworICAgICAgICAgIHIyLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgICByMy5zdG9yZVBhY2tldCgwICogVHJhaXRzOjpSZXNQYWNrZXRTaXplLCBSMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWFsIHdpdGggcmVtYWluaW5nIGNvbHVtbnMgb2YgdGhlIHJocworICAgICAgICBmb3IoSW5kZXggajI9cGFja2V0X2NvbHM0OyBqMjxjb2xzOyBqMisrKQorICAgICAgICB7CisgICAgICAgICAgLy8gT25lIGNvbHVtbiBhdCBhIHRpbWUKKyAgICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEEqKDEqVHJhaXRzOjpMaHNQcm9ncmVzcyldOworICAgICAgICAgIHByZWZldGNoKCZibEFbMF0pOworCisgICAgICAgICAgLy8gZ2V0cyByZXMgYmxvY2sgYXMgcmVnaXN0ZXIKKyAgICAgICAgICBBY2NQYWNrZXQgQzA7CisgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzApOworCisgICAgICAgICAgTGluZWFyTWFwcGVyIHIwID0gcmVzLmdldExpbmVhck1hcHBlcihpLCBqMik7CisKKyAgICAgICAgICAvLyBwZXJmb3JtcyAiaW5uZXIiIHByb2R1Y3RzCisgICAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBibEIgPSAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Ql07CisgICAgICAgICAgTGhzUGFja2V0IEEwOworCisgICAgICAgICAgZm9yKEluZGV4IGs9MDsgazxwZWVsZWRfa2M7IGsrPXBrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJiZWdpbiBnZWJwIG1pY3JvIGtlcm5lbCAxcFgxIik7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wOworICAgICAgICAKKyNkZWZpbmUgRUlHRU5fR0VCR1BfT05FU1RFUChLKSBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHN0ZXAgb2YgZ2VicCBtaWNybyBrZXJuZWwgMXBYMSIpOyAgICAgICAgXAorICAgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiTm90ZTogdGhlc2UgYXNtIGNvbW1lbnRzIHdvcmsgYXJvdW5kIGJ1ZyA5MzUhIik7IFwKKyAgICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsoMCsxKkspKkxoc1Byb2dyZXNzXSwgQTApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWygwK0spKlJoc1Byb2dyZXNzXSwgQl8wKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCXzAsIEMwLCBCXzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBzdGVwIG9mIGdlYnAgbWljcm8ga2VybmVsIDFwWDEiKTsgICAgICAgICAgXAorICAgICAgICAgICAgfSB3aGlsZShmYWxzZSk7CisKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMCk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDEpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCgyKTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoMyk7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDQpOworICAgICAgICAgICAgRUlHRU5fR0VCR1BfT05FU1RFUCg1KTsKKyAgICAgICAgICAgIEVJR0VOX0dFQkdQX09ORVNURVAoNik7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDcpOworCisgICAgICAgICAgICBibEIgKz0gcGsqUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgICBibEEgKz0gcGsqMSpUcmFpdHM6Okxoc1Byb2dyZXNzOworCisgICAgICAgICAgICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIGdlYnAgbWljcm8ga2VybmVsIDFwWDEiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBwZWVsZWQgbG9vcAorICAgICAgICAgIGZvcihJbmRleCBrPXBlZWxlZF9rYzsgazxkZXB0aDsgaysrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFJoc1BhY2tldCBCXzA7CisgICAgICAgICAgICBFSUdFTl9HRUJHUF9PTkVTVEVQKDApOworICAgICAgICAgICAgYmxCICs9IFJoc1Byb2dyZXNzOworICAgICAgICAgICAgYmxBICs9IDEqVHJhaXRzOjpMaHNQcm9ncmVzczsKKyAgICAgICAgICB9CisjdW5kZWYgRUlHRU5fR0VCR1BfT05FU1RFUAorICAgICAgICAgIFJlc1BhY2tldCBSMDsKKyAgICAgICAgICBSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8UmVzUGFja2V0PihhbHBoYSk7CisgICAgICAgICAgUjAgPSByMC5sb2FkUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzAsIGFscGhhdiwgUjApOworICAgICAgICAgIHIwLnN0b3JlUGFja2V0KDAgKiBUcmFpdHM6OlJlc1BhY2tldFNpemUsIFIwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLy0tLS0tLS0tLS0gUHJvY2VzcyByZW1haW5pbmcgcm93cywgMSBhdCBvbmNlIC0tLS0tLS0tLS0KKyAgICBpZihwZWVsZWRfbWMxPHJvd3MpCisgICAgeworICAgICAgLy8gbG9vcCBvbiBlYWNoIHBhbmVsIG9mIHRoZSByaHMKKyAgICAgIGZvcihJbmRleCBqMj0wOyBqMjxwYWNrZXRfY29sczQ7IGoyKz1ucikKKyAgICAgIHsKKyAgICAgICAgLy8gbG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgbGhzICgxKkxoc1Byb2dyZXNzIHggZGVwdGgpCisgICAgICAgIGZvcihJbmRleCBpPXBlZWxlZF9tYzE7IGk8cm93czsgaSs9MSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IExoc1NjYWxhciogYmxBID0gJmJsb2NrQVtpKnN0cmlkZUErb2Zmc2V0QV07CisgICAgICAgICAgcHJlZmV0Y2goJmJsQVswXSk7CisgICAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBibEIgPSAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Qipucl07CisKKyAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHBpZWNlIG9mIGNvZGUgd29udCB3b3JrIGZvciA1MTIgYml0IHJlZ2lzdGVycworICAgICAgICAgIC8vIE1vcmVvdmVyLCBpZiBMaHNQcm9ncmVzcz09OCBpdCBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSBoYWxmIHBhY2tldCBvZiB0aGUgc2FtZSBzaXplCisgICAgICAgICAgLy8gYXMgbnIgKHdoaWNoIGlzIGN1cnJlbnRseSA0KSBmb3IgdGhlIHJldHVybiB0eXBlLgorICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFNSZXNQYWNrZXQ+OjpoYWxmIFNSZXNQYWNrZXRIYWxmOworICAgICAgICAgIGlmICgoU3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3MgJSA0KSA9PSAwICYmCisgICAgICAgICAgICAgIChTd2FwcGVkVHJhaXRzOjpMaHNQcm9ncmVzcyA8PSA4KSAmJgorICAgICAgICAgICAgICAoU3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3MhPTggfHwgdW5wYWNrZXRfdHJhaXRzPFNSZXNQYWNrZXRIYWxmPjo6c2l6ZT09bnIpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNBY2NQYWNrZXQgQzAsIEMxLCBDMiwgQzM7CisgICAgICAgICAgICBzdHJhaXRzLmluaXRBY2MoQzApOworICAgICAgICAgICAgc3RyYWl0cy5pbml0QWNjKEMxKTsKKyAgICAgICAgICAgIHN0cmFpdHMuaW5pdEFjYyhDMik7CisgICAgICAgICAgICBzdHJhaXRzLmluaXRBY2MoQzMpOworCisgICAgICAgICAgICBjb25zdCBJbmRleCBzcGsgICA9IChzdGQ6Om1heCkoMSxTd2FwcGVkVHJhaXRzOjpMaHNQcm9ncmVzcy80KTsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IGVuZGsgID0gKGRlcHRoL3Nwaykqc3BrOworICAgICAgICAgICAgY29uc3QgSW5kZXggZW5kazQgPSAoZGVwdGgvKHNwayo0KSkqKHNwayo0KTsKKworICAgICAgICAgICAgSW5kZXggaz0wOworICAgICAgICAgICAgZm9yKDsgazxlbmRrNDsgays9NCpzcGspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFNMaHNQYWNrZXQgQTAsQTE7CisgICAgICAgICAgICAgIFNSaHNQYWNrZXQgQl8wLEJfMTsKKworICAgICAgICAgICAgICBzdHJhaXRzLmxvYWRMaHNVbmFsaWduZWQoYmxCKzAqU3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3MsIEEwKTsKKyAgICAgICAgICAgICAgc3RyYWl0cy5sb2FkTGhzVW5hbGlnbmVkKGJsQisxKlN3YXBwZWRUcmFpdHM6Okxoc1Byb2dyZXNzLCBBMSk7CisKKyAgICAgICAgICAgICAgc3RyYWl0cy5sb2FkUmhzUXVhZChibEErMCpzcGssIEJfMCk7CisgICAgICAgICAgICAgIHN0cmFpdHMubG9hZFJoc1F1YWQoYmxBKzEqc3BrLCBCXzEpOworICAgICAgICAgICAgICBzdHJhaXRzLm1hZGQoQTAsQl8wLEMwLEJfMCk7CisgICAgICAgICAgICAgIHN0cmFpdHMubWFkZChBMSxCXzEsQzEsQl8xKTsKKworICAgICAgICAgICAgICBzdHJhaXRzLmxvYWRMaHNVbmFsaWduZWQoYmxCKzIqU3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3MsIEEwKTsKKyAgICAgICAgICAgICAgc3RyYWl0cy5sb2FkTGhzVW5hbGlnbmVkKGJsQiszKlN3YXBwZWRUcmFpdHM6Okxoc1Byb2dyZXNzLCBBMSk7CisgICAgICAgICAgICAgIHN0cmFpdHMubG9hZFJoc1F1YWQoYmxBKzIqc3BrLCBCXzApOworICAgICAgICAgICAgICBzdHJhaXRzLmxvYWRSaHNRdWFkKGJsQSszKnNwaywgQl8xKTsKKyAgICAgICAgICAgICAgc3RyYWl0cy5tYWRkKEEwLEJfMCxDMixCXzApOworICAgICAgICAgICAgICBzdHJhaXRzLm1hZGQoQTEsQl8xLEMzLEJfMSk7CisKKyAgICAgICAgICAgICAgYmxCICs9IDQqU3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3M7CisgICAgICAgICAgICAgIGJsQSArPSA0KnNwazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMwID0gcGFkZChwYWRkKEMwLEMxKSxwYWRkKEMyLEMzKSk7CisgICAgICAgICAgICBmb3IoOyBrPGVuZGs7IGsrPXNwaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU0xoc1BhY2tldCBBMDsKKyAgICAgICAgICAgICAgU1Joc1BhY2tldCBCXzA7CisKKyAgICAgICAgICAgICAgc3RyYWl0cy5sb2FkTGhzVW5hbGlnbmVkKGJsQiwgQTApOworICAgICAgICAgICAgICBzdHJhaXRzLmxvYWRSaHNRdWFkKGJsQSwgQl8wKTsKKyAgICAgICAgICAgICAgc3RyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworCisgICAgICAgICAgICAgIGJsQiArPSBTd2FwcGVkVHJhaXRzOjpMaHNQcm9ncmVzczsKKyAgICAgICAgICAgICAgYmxBICs9IHNwazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFN3YXBwZWRUcmFpdHM6Okxoc1Byb2dyZXNzPT04KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBmaXJzdCByZWR1Y2UgdGhlIGFjY3VtdWxhdGlvbiByZWdpc3RlciBDMAorICAgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFN3YXBwZWRUcmFpdHM6Okxoc1Byb2dyZXNzPj04LHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxTUmVzUGFja2V0Pjo6aGFsZixTUmVzUGFja2V0Pjo6dHlwZSBTUmVzUGFja2V0SGFsZjsKKyAgICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxTd2FwcGVkVHJhaXRzOjpMaHNQcm9ncmVzcz49OCx0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8U0xoc1BhY2tldD46OmhhbGYsU0xoc1BhY2tldD46OnR5cGUgU0xoc1BhY2tldEhhbGY7CisgICAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8U3dhcHBlZFRyYWl0czo6TGhzUHJvZ3Jlc3M+PTgsdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFNMaHNQYWNrZXQ+OjpoYWxmLFNSaHNQYWNrZXQ+Ojp0eXBlIFNSaHNQYWNrZXRIYWxmOworICAgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFN3YXBwZWRUcmFpdHM6Okxoc1Byb2dyZXNzPj04LHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxTQWNjUGFja2V0Pjo6aGFsZixTQWNjUGFja2V0Pjo6dHlwZSBTQWNjUGFja2V0SGFsZjsKKworICAgICAgICAgICAgICBTUmVzUGFja2V0SGFsZiBSID0gcmVzLnRlbXBsYXRlIGdhdGhlclBhY2tldDxTUmVzUGFja2V0SGFsZj4oaSwgajIpOworICAgICAgICAgICAgICBTUmVzUGFja2V0SGFsZiBhbHBoYXYgPSBwc2V0MTxTUmVzUGFja2V0SGFsZj4oYWxwaGEpOworCisgICAgICAgICAgICAgIGlmKGRlcHRoLWVuZGs+MCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gaGFuZGxlIHRoZSBsYXN0IHJvdyBvZiB0aGUgcmhzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgaGFsZi1wYWNrZXQKKyAgICAgICAgICAgICAgICBTTGhzUGFja2V0SGFsZiBhMDsKKyAgICAgICAgICAgICAgICBTUmhzUGFja2V0SGFsZiBiMDsKKyAgICAgICAgICAgICAgICBzdHJhaXRzLmxvYWRMaHNVbmFsaWduZWQoYmxCLCBhMCk7CisgICAgICAgICAgICAgICAgc3RyYWl0cy5sb2FkUmhzKGJsQSwgYjApOworICAgICAgICAgICAgICAgIFNBY2NQYWNrZXRIYWxmIGMwID0gcHJlZHV4X2Rvd250bzQoQzApOworICAgICAgICAgICAgICAgIHN0cmFpdHMubWFkZChhMCxiMCxjMCxiMCk7CisgICAgICAgICAgICAgICAgc3RyYWl0cy5hY2MoYzAsIGFscGhhdiwgUik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyYWl0cy5hY2MocHJlZHV4X2Rvd250bzQoQzApLCBhbHBoYXYsIFIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJlcy5zY2F0dGVyUGFja2V0KGksIGoyLCBSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgU1Jlc1BhY2tldCBSID0gcmVzLnRlbXBsYXRlIGdhdGhlclBhY2tldDxTUmVzUGFja2V0PihpLCBqMik7CisgICAgICAgICAgICAgIFNSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8U1Jlc1BhY2tldD4oYWxwaGEpOworICAgICAgICAgICAgICBzdHJhaXRzLmFjYyhDMCwgYWxwaGF2LCBSKTsKKyAgICAgICAgICAgICAgcmVzLnNjYXR0ZXJQYWNrZXQoaSwgajIsIFIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8vIHNjYWxhciBwYXRoCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gZ2V0IGEgMSB4IDQgcmVzIGJsb2NrIGFzIHJlZ2lzdGVycworICAgICAgICAgICAgUmVzU2NhbGFyIEMwKDApLCBDMSgwKSwgQzIoMCksIEMzKDApOworCisgICAgICAgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIExoc1NjYWxhciBBMDsKKyAgICAgICAgICAgICAgUmhzU2NhbGFyIEJfMCwgQl8xOworCisgICAgICAgICAgICAgIEEwID0gYmxBW2tdOworCisgICAgICAgICAgICAgIEJfMCA9IGJsQlswXTsKKyAgICAgICAgICAgICAgQl8xID0gYmxCWzFdOworICAgICAgICAgICAgICBDSk1BREQoY2osQTAsQl8wLEMwLCAgQl8wKTsKKyAgICAgICAgICAgICAgQ0pNQUREKGNqLEEwLEJfMSxDMSwgIEJfMSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBCXzAgPSBibEJbMl07CisgICAgICAgICAgICAgIEJfMSA9IGJsQlszXTsKKyAgICAgICAgICAgICAgQ0pNQUREKGNqLEEwLEJfMCxDMiwgIEJfMCk7CisgICAgICAgICAgICAgIENKTUFERChjaixBMCxCXzEsQzMsICBCXzEpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgYmxCICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMoaSwgajIgKyAwKSArPSBhbHBoYSAqIEMwOworICAgICAgICAgICAgcmVzKGksIGoyICsgMSkgKz0gYWxwaGEgKiBDMTsKKyAgICAgICAgICAgIHJlcyhpLCBqMiArIDIpICs9IGFscGhhICogQzI7CisgICAgICAgICAgICByZXMoaSwgajIgKyAzKSArPSBhbHBoYSAqIEMzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gcmVtYWluaW5nIGNvbHVtbnMKKyAgICAgIGZvcihJbmRleCBqMj1wYWNrZXRfY29sczQ7IGoyPGNvbHM7IGoyKyspCisgICAgICB7CisgICAgICAgIC8vIGxvb3Agb24gZWFjaCByb3cgb2YgdGhlIGxocyAoMSpMaHNQcm9ncmVzcyB4IGRlcHRoKQorICAgICAgICBmb3IoSW5kZXggaT1wZWVsZWRfbWMxOyBpPHJvd3M7IGkrPTEpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEFdOworICAgICAgICAgIHByZWZldGNoKCZibEFbMF0pOworICAgICAgICAgIC8vIGdldHMgYSAxIHggMSByZXMgYmxvY2sgYXMgcmVnaXN0ZXJzCisgICAgICAgICAgUmVzU2NhbGFyIEMwKDApOworICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gJmJsb2NrQltqMipzdHJpZGVCK29mZnNldEJdOworICAgICAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBMaHNTY2FsYXIgQTAgPSBibEFba107CisgICAgICAgICAgICBSaHNTY2FsYXIgQl8wID0gYmxCW2tdOworICAgICAgICAgICAgQ0pNQUREKGNqLCBBMCwgQl8wLCBDMCwgQl8wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzKGksIGoyKSArPSBhbHBoYSAqIEMwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworI3VuZGVmIENKTUFERAorCisvLyBwYWNrIGEgYmxvY2sgb2YgdGhlIGxocworLy8gVGhlIHRyYXZlcnNhbCBpcyBhcyBmb2xsb3cgKG1yPT00KToKKy8vICAgMCAgNCAgOCAxMiAuLi4KKy8vICAgMSAgNSAgOSAxMyAuLi4KKy8vICAgMiAgNiAxMCAxNCAuLi4KKy8vICAgMyAgNyAxMSAxNSAuLi4KKy8vCisvLyAgMTYgMjAgMjQgMjggLi4uCisvLyAgMTcgMjEgMjUgMjkgLi4uCisvLyAgMTggMjIgMjYgMzAgLi4uCisvLyAgMTkgMjMgMjcgMzEgLi4uCisvLworLy8gIDMyIDMzIDM0IDM1IC4uLgorLy8gIDM2IDM2IDM4IDM5IC4uLgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgRGF0YU1hcHBlciwgaW50IFBhY2sxLCBpbnQgUGFjazIsIGJvb2wgQ29uanVnYXRlLCBib29sIFBhbmVsTW9kZT4KK3N0cnVjdCBnZW1tX3BhY2tfbGhzPFNjYWxhciwgSW5kZXgsIERhdGFNYXBwZXIsIFBhY2sxLCBQYWNrMiwgQ29sTWFqb3IsIENvbmp1Z2F0ZSwgUGFuZWxNb2RlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERhdGFNYXBwZXI6OkxpbmVhck1hcHBlciBMaW5lYXJNYXBwZXI7CisgIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgb3BlcmF0b3IoKShTY2FsYXIqIGJsb2NrQSwgY29uc3QgRGF0YU1hcHBlciYgbGhzLCBJbmRleCBkZXB0aCwgSW5kZXggcm93cywgSW5kZXggc3RyaWRlPTAsIEluZGV4IG9mZnNldD0wKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBQYWNrMSwgaW50IFBhY2syLCBib29sIENvbmp1Z2F0ZSwgYm9vbCBQYW5lbE1vZGU+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgRGF0YU1hcHBlciwgUGFjazEsIFBhY2syLCBDb2xNYWpvciwgQ29uanVnYXRlLCBQYW5lbE1vZGU+CisgIDo6b3BlcmF0b3IoKShTY2FsYXIqIGJsb2NrQSwgY29uc3QgRGF0YU1hcHBlciYgbGhzLCBJbmRleCBkZXB0aCwgSW5kZXggcm93cywgSW5kZXggc3RyaWRlLCBJbmRleCBvZmZzZXQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgZW51bSB7IFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUgfTsKKworICBFSUdFTl9BU01fQ09NTUVOVCgiRUlHRU4gUFJPRFVDVCBQQUNLIExIUyIpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc3RyaWRlKTsKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG9mZnNldCk7CisgIGVpZ2VuX2Fzc2VydCgoKCFQYW5lbE1vZGUpICYmIHN0cmlkZT09MCAmJiBvZmZzZXQ9PTApIHx8IChQYW5lbE1vZGUgJiYgc3RyaWRlPj1kZXB0aCAmJiBvZmZzZXQ8PXN0cmlkZSkpOworICBlaWdlbl9hc3NlcnQoICgoUGFjazElUGFja2V0U2l6ZSk9PTAgJiYgUGFjazE8PTQqUGFja2V0U2l6ZSkgfHwgKFBhY2sxPD00KSApOworICBjb25qX2lmPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgQ29uanVnYXRlPiBjajsKKyAgSW5kZXggY291bnQgPSAwOworCisgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzMgPSBQYWNrMT49MypQYWNrZXRTaXplID8gKHJvd3MvKDMqUGFja2V0U2l6ZSkpKigzKlBhY2tldFNpemUpIDogMDsKKyAgY29uc3QgSW5kZXggcGVlbGVkX21jMiA9IFBhY2sxPj0yKlBhY2tldFNpemUgPyBwZWVsZWRfbWMzKygocm93cy1wZWVsZWRfbWMzKS8oMipQYWNrZXRTaXplKSkqKDIqUGFja2V0U2l6ZSkgOiAwOworICBjb25zdCBJbmRleCBwZWVsZWRfbWMxID0gUGFjazE+PTEqUGFja2V0U2l6ZSA/IChyb3dzLygxKlBhY2tldFNpemUpKSooMSpQYWNrZXRTaXplKSA6IDA7CisgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzAgPSBQYWNrMj49MSpQYWNrZXRTaXplID8gcGVlbGVkX21jMQorICAgICAgICAgICAgICAgICAgICAgICAgIDogUGFjazI+MSAgICAgICAgICAgICA/IChyb3dzL1BhY2syKSpQYWNrMiA6IDA7CisKKyAgSW5kZXggaT0wOworCisgIC8vIFBhY2sgMyBwYWNrZXRzCisgIGlmKFBhY2sxPj0zKlBhY2tldFNpemUpCisgIHsKKyAgICBmb3IoOyBpPHBlZWxlZF9tYzM7IGkrPTMqUGFja2V0U2l6ZSkKKyAgICB7CisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9ICgzKlBhY2tldFNpemUpICogb2Zmc2V0OworCisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICB7CisgICAgICAgIFBhY2tldCBBLCBCLCBDOworICAgICAgICBBID0gbGhzLmxvYWRQYWNrZXQoaSswKlBhY2tldFNpemUsIGspOworICAgICAgICBCID0gbGhzLmxvYWRQYWNrZXQoaSsxKlBhY2tldFNpemUsIGspOworICAgICAgICBDID0gbGhzLmxvYWRQYWNrZXQoaSsyKlBhY2tldFNpemUsIGspOworICAgICAgICBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihBKSk7IGNvdW50Kz1QYWNrZXRTaXplOworICAgICAgICBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihCKSk7IGNvdW50Kz1QYWNrZXRTaXplOworICAgICAgICBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihDKSk7IGNvdW50Kz1QYWNrZXRTaXplOworICAgICAgfQorICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSAoMypQYWNrZXRTaXplKSAqIChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KKyAgLy8gUGFjayAyIHBhY2tldHMKKyAgaWYoUGFjazE+PTIqUGFja2V0U2l6ZSkKKyAgeworICAgIGZvcig7IGk8cGVlbGVkX21jMjsgaSs9MipQYWNrZXRTaXplKQorICAgIHsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gKDIqUGFja2V0U2l6ZSkgKiBvZmZzZXQ7CisKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgIHsKKyAgICAgICAgUGFja2V0IEEsIEI7CisgICAgICAgIEEgPSBsaHMubG9hZFBhY2tldChpKzAqUGFja2V0U2l6ZSwgayk7CisgICAgICAgIEIgPSBsaHMubG9hZFBhY2tldChpKzEqUGFja2V0U2l6ZSwgayk7CisgICAgICAgIHBzdG9yZShibG9ja0ErY291bnQsIGNqLnBjb25qKEEpKTsgY291bnQrPVBhY2tldFNpemU7CisgICAgICAgIHBzdG9yZShibG9ja0ErY291bnQsIGNqLnBjb25qKEIpKTsgY291bnQrPVBhY2tldFNpemU7CisgICAgICB9CisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9ICgyKlBhY2tldFNpemUpICogKHN0cmlkZS1vZmZzZXQtZGVwdGgpOworICAgIH0KKyAgfQorICAvLyBQYWNrIDEgcGFja2V0cworICBpZihQYWNrMT49MSpQYWNrZXRTaXplKQorICB7CisgICAgZm9yKDsgaTxwZWVsZWRfbWMxOyBpKz0xKlBhY2tldFNpemUpCisgICAgeworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSAoMSpQYWNrZXRTaXplKSAqIG9mZnNldDsKKworICAgICAgZm9yKEluZGV4IGs9MDsgazxkZXB0aDsgaysrKQorICAgICAgeworICAgICAgICBQYWNrZXQgQTsKKyAgICAgICAgQSA9IGxocy5sb2FkUGFja2V0KGkrMCpQYWNrZXRTaXplLCBrKTsKKyAgICAgICAgcHN0b3JlKGJsb2NrQStjb3VudCwgY2oucGNvbmooQSkpOworICAgICAgICBjb3VudCs9UGFja2V0U2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gKDEqUGFja2V0U2l6ZSkgKiAoc3RyaWRlLW9mZnNldC1kZXB0aCk7CisgICAgfQorICB9CisgIC8vIFBhY2sgc2NhbGFycworICBpZihQYWNrMjxQYWNrZXRTaXplICYmIFBhY2syPjEpCisgIHsKKyAgICBmb3IoOyBpPHBlZWxlZF9tYzA7IGkrPVBhY2syKQorICAgIHsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gUGFjazIgKiBvZmZzZXQ7CisKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgZm9yKEluZGV4IHc9MDsgdzxQYWNrMjsgdysrKQorICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGNqKGxocyhpK3csIGspKTsKKworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBQYWNrMiAqIChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KKyAgZm9yKDsgaTxyb3dzOyBpKyspCisgIHsKKyAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IG9mZnNldDsKKyAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICBibG9ja0FbY291bnQrK10gPSBjaihsaHMoaSwgaykpOworICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gKHN0cmlkZS1vZmZzZXQtZGVwdGgpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBQYWNrMSwgaW50IFBhY2syLCBib29sIENvbmp1Z2F0ZSwgYm9vbCBQYW5lbE1vZGU+CitzdHJ1Y3QgZ2VtbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBEYXRhTWFwcGVyLCBQYWNrMSwgUGFjazIsIFJvd01ham9yLCBDb25qdWdhdGUsIFBhbmVsTW9kZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEYXRhTWFwcGVyOjpMaW5lYXJNYXBwZXIgTGluZWFyTWFwcGVyOworICBFSUdFTl9ET05UX0lOTElORSB2b2lkIG9wZXJhdG9yKCkoU2NhbGFyKiBibG9ja0EsIGNvbnN0IERhdGFNYXBwZXImIGxocywgSW5kZXggZGVwdGgsIEluZGV4IHJvd3MsIEluZGV4IHN0cmlkZT0wLCBJbmRleCBvZmZzZXQ9MCk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBEYXRhTWFwcGVyLCBpbnQgUGFjazEsIGludCBQYWNrMiwgYm9vbCBDb25qdWdhdGUsIGJvb2wgUGFuZWxNb2RlPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBnZW1tX3BhY2tfbGhzPFNjYWxhciwgSW5kZXgsIERhdGFNYXBwZXIsIFBhY2sxLCBQYWNrMiwgUm93TWFqb3IsIENvbmp1Z2F0ZSwgUGFuZWxNb2RlPgorICA6Om9wZXJhdG9yKCkoU2NhbGFyKiBibG9ja0EsIGNvbnN0IERhdGFNYXBwZXImIGxocywgSW5kZXggZGVwdGgsIEluZGV4IHJvd3MsIEluZGV4IHN0cmlkZSwgSW5kZXggb2Zmc2V0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGVudW0geyBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplIH07CisKKyAgRUlHRU5fQVNNX0NPTU1FTlQoIkVJR0VOIFBST0RVQ1QgUEFDSyBMSFMiKTsKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHN0cmlkZSk7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvZmZzZXQpOworICBlaWdlbl9hc3NlcnQoKCghUGFuZWxNb2RlKSAmJiBzdHJpZGU9PTAgJiYgb2Zmc2V0PT0wKSB8fCAoUGFuZWxNb2RlICYmIHN0cmlkZT49ZGVwdGggJiYgb2Zmc2V0PD1zdHJpZGUpKTsKKyAgY29ual9pZjxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIENvbmp1Z2F0ZT4gY2o7CisgIEluZGV4IGNvdW50ID0gMDsKKworLy8gICBjb25zdCBJbmRleCBwZWVsZWRfbWMzID0gUGFjazE+PTMqUGFja2V0U2l6ZSA/IChyb3dzLygzKlBhY2tldFNpemUpKSooMypQYWNrZXRTaXplKSA6IDA7CisvLyAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzIgPSBQYWNrMT49MipQYWNrZXRTaXplID8gcGVlbGVkX21jMysoKHJvd3MtcGVlbGVkX21jMykvKDIqUGFja2V0U2l6ZSkpKigyKlBhY2tldFNpemUpIDogMDsKKy8vICAgY29uc3QgSW5kZXggcGVlbGVkX21jMSA9IFBhY2sxPj0xKlBhY2tldFNpemUgPyAocm93cy8oMSpQYWNrZXRTaXplKSkqKDEqUGFja2V0U2l6ZSkgOiAwOworCisgIGludCBwYWNrID0gUGFjazE7CisgIEluZGV4IGkgPSAwOworICB3aGlsZShwYWNrPjApCisgIHsKKyAgICBJbmRleCByZW1haW5pbmdfcm93cyA9IHJvd3MtaTsKKyAgICBJbmRleCBwZWVsZWRfbWMgPSBpKyhyZW1haW5pbmdfcm93cy9wYWNrKSpwYWNrOworICAgIGZvcig7IGk8cGVlbGVkX21jOyBpKz1wYWNrKQorICAgIHsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gcGFjayAqIG9mZnNldDsKKworICAgICAgY29uc3QgSW5kZXggcGVlbGVkX2sgPSAoZGVwdGgvUGFja2V0U2l6ZSkqUGFja2V0U2l6ZTsKKyAgICAgIEluZGV4IGs9MDsKKyAgICAgIGlmKHBhY2s+PVBhY2tldFNpemUpCisgICAgICB7CisgICAgICAgIGZvcig7IGs8cGVlbGVkX2s7IGsrPVBhY2tldFNpemUpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKEluZGV4IG0gPSAwOyBtIDwgcGFjazsgbSArPSBQYWNrZXRTaXplKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFBhY2tldEJsb2NrPFBhY2tldD4ga2VybmVsOworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBQYWNrZXRTaXplOyArK3ApIGtlcm5lbC5wYWNrZXRbcF0gPSBsaHMubG9hZFBhY2tldChpK3ArbSwgayk7CisgICAgICAgICAgICBwdHJhbnNwb3NlKGtlcm5lbCk7CisgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IFBhY2tldFNpemU7ICsrcCkgcHN0b3JlKGJsb2NrQStjb3VudCttKyhwYWNrKSpwLCBjai5wY29uaihrZXJuZWwucGFja2V0W3BdKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvdW50ICs9IFBhY2tldFNpemUqcGFjazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yKDsgazxkZXB0aDsgaysrKQorICAgICAgeworICAgICAgICBJbmRleCB3PTA7CisgICAgICAgIGZvcig7IHc8cGFjay0zOyB3Kz00KQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIGEoY2oobGhzKGkrdyswLCBrKSkpLAorICAgICAgICAgICAgICAgICBiKGNqKGxocyhpK3crMSwgaykpKSwKKyAgICAgICAgICAgICAgICAgYyhjaihsaHMoaSt3KzIsIGspKSksCisgICAgICAgICAgICAgICAgIGQoY2oobGhzKGkrdyszLCBrKSkpOworICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGE7CisgICAgICAgICAgYmxvY2tBW2NvdW50KytdID0gYjsKKyAgICAgICAgICBibG9ja0FbY291bnQrK10gPSBjOworICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgaWYocGFjayU0KQorICAgICAgICAgIGZvcig7dzxwYWNrOysrdykKKyAgICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGNqKGxocyhpK3csIGspKTsKKyAgICAgIH0KKworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBwYWNrICogKHN0cmlkZS1vZmZzZXQtZGVwdGgpOworICAgIH0KKworICAgIHBhY2sgLT0gUGFja2V0U2l6ZTsKKyAgICBpZihwYWNrPFBhY2syICYmIChwYWNrK1BhY2tldFNpemUpIT1QYWNrMikKKyAgICAgIHBhY2sgPSBQYWNrMjsKKyAgfQorCisgIGZvcig7IGk8cm93czsgaSsrKQorICB7CisgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBvZmZzZXQ7CisgICAgZm9yKEluZGV4IGs9MDsgazxkZXB0aDsgaysrKQorICAgICAgYmxvY2tBW2NvdW50KytdID0gY2oobGhzKGksIGspKTsKKyAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgfQorfQorCisvLyBjb3B5IGEgY29tcGxldGUgcGFuZWwgb2YgdGhlIHJocworLy8gdGhpcyB2ZXJzaW9uIGlzIG9wdGltaXplZCBmb3IgY29sdW1uIG1ham9yIG1hdHJpY2VzCisvLyBUaGUgdHJhdmVyc2FsIG9yZGVyIGlzIGFzIGZvbGxvdzogKG5yPT00KToKKy8vICAwICAxICAyICAzICAgMTIgMTMgMTQgMTUgICAyNCAyNworLy8gIDQgIDUgIDYgIDcgICAxNiAxNyAxOCAxOSAgIDI1IDI4CisvLyAgOCAgOSAxMCAxMSAgIDIwIDIxIDIyIDIzICAgMjYgMjkKKy8vICAuICAuICAuICAuICAgIC4gIC4gIC4gIC4gICAgLiAgLgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgRGF0YU1hcHBlciwgaW50IG5yLCBib29sIENvbmp1Z2F0ZSwgYm9vbCBQYW5lbE1vZGU+CitzdHJ1Y3QgZ2VtbV9wYWNrX3JoczxTY2FsYXIsIEluZGV4LCBEYXRhTWFwcGVyLCBuciwgQ29sTWFqb3IsIENvbmp1Z2F0ZSwgUGFuZWxNb2RlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGF0YU1hcHBlcjo6TGluZWFyTWFwcGVyIExpbmVhck1hcHBlcjsKKyAgZW51bSB7IFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUgfTsKKyAgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tCLCBjb25zdCBEYXRhTWFwcGVyJiByaHMsIEluZGV4IGRlcHRoLCBJbmRleCBjb2xzLCBJbmRleCBzdHJpZGU9MCwgSW5kZXggb2Zmc2V0PTApOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgRGF0YU1hcHBlciwgaW50IG5yLCBib29sIENvbmp1Z2F0ZSwgYm9vbCBQYW5lbE1vZGU+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbW1fcGFja19yaHM8U2NhbGFyLCBJbmRleCwgRGF0YU1hcHBlciwgbnIsIENvbE1ham9yLCBDb25qdWdhdGUsIFBhbmVsTW9kZT4KKyAgOjpvcGVyYXRvcigpKFNjYWxhciogYmxvY2tCLCBjb25zdCBEYXRhTWFwcGVyJiByaHMsIEluZGV4IGRlcHRoLCBJbmRleCBjb2xzLCBJbmRleCBzdHJpZGUsIEluZGV4IG9mZnNldCkKK3sKKyAgRUlHRU5fQVNNX0NPTU1FTlQoIkVJR0VOIFBST0RVQ1QgUEFDSyBSSFMgQ09MTUFKT1IiKTsKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHN0cmlkZSk7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvZmZzZXQpOworICBlaWdlbl9hc3NlcnQoKCghUGFuZWxNb2RlKSAmJiBzdHJpZGU9PTAgJiYgb2Zmc2V0PT0wKSB8fCAoUGFuZWxNb2RlICYmIHN0cmlkZT49ZGVwdGggJiYgb2Zmc2V0PD1zdHJpZGUpKTsKKyAgY29ual9pZjxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIENvbmp1Z2F0ZT4gY2o7CisgIEluZGV4IHBhY2tldF9jb2xzOCA9IG5yPj04ID8gKGNvbHMvOCkgKiA4IDogMDsKKyAgSW5kZXggcGFja2V0X2NvbHM0ID0gbnI+PTQgPyAoY29scy80KSAqIDQgOiAwOworICBJbmRleCBjb3VudCA9IDA7CisgIGNvbnN0IEluZGV4IHBlZWxlZF9rID0gKGRlcHRoL1BhY2tldFNpemUpKlBhY2tldFNpemU7CisvLyAgIGlmKG5yPj04KQorLy8gICB7CisvLyAgICAgZm9yKEluZGV4IGoyPTA7IGoyPHBhY2tldF9jb2xzODsgajIrPTgpCisvLyAgICAgeworLy8gICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYmVmb3JlCisvLyAgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IDggKiBvZmZzZXQ7CisvLyAgICAgICBjb25zdCBTY2FsYXIqIGIwID0gJnJoc1soajIrMCkqcmhzU3RyaWRlXTsKKy8vICAgICAgIGNvbnN0IFNjYWxhciogYjEgPSAmcmhzWyhqMisxKSpyaHNTdHJpZGVdOworLy8gICAgICAgY29uc3QgU2NhbGFyKiBiMiA9ICZyaHNbKGoyKzIpKnJoc1N0cmlkZV07CisvLyAgICAgICBjb25zdCBTY2FsYXIqIGIzID0gJnJoc1soajIrMykqcmhzU3RyaWRlXTsKKy8vICAgICAgIGNvbnN0IFNjYWxhciogYjQgPSAmcmhzWyhqMis0KSpyaHNTdHJpZGVdOworLy8gICAgICAgY29uc3QgU2NhbGFyKiBiNSA9ICZyaHNbKGoyKzUpKnJoc1N0cmlkZV07CisvLyAgICAgICBjb25zdCBTY2FsYXIqIGI2ID0gJnJoc1soajIrNikqcmhzU3RyaWRlXTsKKy8vICAgICAgIGNvbnN0IFNjYWxhciogYjcgPSAmcmhzWyhqMis3KSpyaHNTdHJpZGVdOworLy8gICAgICAgSW5kZXggaz0wOworLy8gICAgICAgaWYoUGFja2V0U2l6ZT09OCkgLy8gVE9ETyBlbmJhbGUgdmVjdG9yaXplZCB0cmFuc3Bvc2l0aW9uIGZvciBQYWNrZXRTaXplPT00CisvLyAgICAgICB7CisvLyAgICAgICAgIGZvcig7IGs8cGVlbGVkX2s7IGsrPVBhY2tldFNpemUpIHsKKy8vICAgICAgICAgICBQYWNrZXRCbG9jazxQYWNrZXQ+IGtlcm5lbDsKKy8vICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IFBhY2tldFNpemU7ICsrcCkgeworLy8gICAgICAgICAgICAga2VybmVsLnBhY2tldFtwXSA9IHBsb2FkdTxQYWNrZXQ+KCZyaHNbKGoyK3ApKnJoc1N0cmlkZStrXSk7CisvLyAgICAgICAgICAgfQorLy8gICAgICAgICAgIHB0cmFuc3Bvc2Uoa2VybmVsKTsKKy8vICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IFBhY2tldFNpemU7ICsrcCkgeworLy8gICAgICAgICAgICAgcHN0b3JldShibG9ja0IrY291bnQsIGNqLnBjb25qKGtlcm5lbC5wYWNrZXRbcF0pKTsKKy8vICAgICAgICAgICAgIGNvdW50Kz1QYWNrZXRTaXplOworLy8gICAgICAgICAgIH0KKy8vICAgICAgICAgfQorLy8gICAgICAgfQorLy8gICAgICAgZm9yKDsgazxkZXB0aDsgaysrKQorLy8gICAgICAgeworLy8gICAgICAgICBibG9ja0JbY291bnQrMF0gPSBjaihiMFtrXSk7CisvLyAgICAgICAgIGJsb2NrQltjb3VudCsxXSA9IGNqKGIxW2tdKTsKKy8vICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gY2ooYjJba10pOworLy8gICAgICAgICBibG9ja0JbY291bnQrM10gPSBjaihiM1trXSk7CisvLyAgICAgICAgIGJsb2NrQltjb3VudCs0XSA9IGNqKGI0W2tdKTsKKy8vICAgICAgICAgYmxvY2tCW2NvdW50KzVdID0gY2ooYjVba10pOworLy8gICAgICAgICBibG9ja0JbY291bnQrNl0gPSBjaihiNltrXSk7CisvLyAgICAgICAgIGJsb2NrQltjb3VudCs3XSA9IGNqKGI3W2tdKTsKKy8vICAgICAgICAgY291bnQgKz0gODsKKy8vICAgICAgIH0KKy8vICAgICAgIC8vIHNraXAgd2hhdCB3ZSBoYXZlIGFmdGVyCisvLyAgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IDggKiAoc3RyaWRlLW9mZnNldC1kZXB0aCk7CisvLyAgICAgfQorLy8gICB9CisKKyAgaWYobnI+PTQpCisgIHsKKyAgICBmb3IoSW5kZXggajI9cGFja2V0X2NvbHM4OyBqMjxwYWNrZXRfY29sczQ7IGoyKz00KQorICAgIHsKKyAgICAgIC8vIHNraXAgd2hhdCB3ZSBoYXZlIGJlZm9yZQorICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSA0ICogb2Zmc2V0OworICAgICAgY29uc3QgTGluZWFyTWFwcGVyIGRtMCA9IHJocy5nZXRMaW5lYXJNYXBwZXIoMCwgajIgKyAwKTsKKyAgICAgIGNvbnN0IExpbmVhck1hcHBlciBkbTEgPSByaHMuZ2V0TGluZWFyTWFwcGVyKDAsIGoyICsgMSk7CisgICAgICBjb25zdCBMaW5lYXJNYXBwZXIgZG0yID0gcmhzLmdldExpbmVhck1hcHBlcigwLCBqMiArIDIpOworICAgICAgY29uc3QgTGluZWFyTWFwcGVyIGRtMyA9IHJocy5nZXRMaW5lYXJNYXBwZXIoMCwgajIgKyAzKTsKKworICAgICAgSW5kZXggaz0wOworICAgICAgaWYoKFBhY2tldFNpemUlNCk9PTApIC8vIFRPRE8gZW5hYmxlIHZlY3Rvcml6ZWQgdHJhbnNwb3NpdGlvbiBmb3IgUGFja2V0U2l6ZT09MiA/PworICAgICAgeworICAgICAgICBmb3IoOyBrPHBlZWxlZF9rOyBrKz1QYWNrZXRTaXplKSB7CisgICAgICAgICAgUGFja2V0QmxvY2s8UGFja2V0LChQYWNrZXRTaXplJTQpPT0wPzQ6UGFja2V0U2l6ZT4ga2VybmVsOworICAgICAgICAgIGtlcm5lbC5wYWNrZXRbMF0gPSBkbTAubG9hZFBhY2tldChrKTsKKyAgICAgICAgICBrZXJuZWwucGFja2V0WzElUGFja2V0U2l6ZV0gPSBkbTEubG9hZFBhY2tldChrKTsKKyAgICAgICAgICBrZXJuZWwucGFja2V0WzIlUGFja2V0U2l6ZV0gPSBkbTIubG9hZFBhY2tldChrKTsKKyAgICAgICAgICBrZXJuZWwucGFja2V0WzMlUGFja2V0U2l6ZV0gPSBkbTMubG9hZFBhY2tldChrKTsKKyAgICAgICAgICBwdHJhbnNwb3NlKGtlcm5lbCk7CisgICAgICAgICAgcHN0b3JldShibG9ja0IrY291bnQrMCpQYWNrZXRTaXplLCBjai5wY29uaihrZXJuZWwucGFja2V0WzBdKSk7CisgICAgICAgICAgcHN0b3JldShibG9ja0IrY291bnQrMSpQYWNrZXRTaXplLCBjai5wY29uaihrZXJuZWwucGFja2V0WzElUGFja2V0U2l6ZV0pKTsKKyAgICAgICAgICBwc3RvcmV1KGJsb2NrQitjb3VudCsyKlBhY2tldFNpemUsIGNqLnBjb25qKGtlcm5lbC5wYWNrZXRbMiVQYWNrZXRTaXplXSkpOworICAgICAgICAgIHBzdG9yZXUoYmxvY2tCK2NvdW50KzMqUGFja2V0U2l6ZSwgY2oucGNvbmooa2VybmVsLnBhY2tldFszJVBhY2tldFNpemVdKSk7CisgICAgICAgICAgY291bnQrPTQqUGFja2V0U2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yKDsgazxkZXB0aDsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnQrMF0gPSBjaihkbTAoaykpOworICAgICAgICBibG9ja0JbY291bnQrMV0gPSBjaihkbTEoaykpOworICAgICAgICBibG9ja0JbY291bnQrMl0gPSBjaihkbTIoaykpOworICAgICAgICBibG9ja0JbY291bnQrM10gPSBjaihkbTMoaykpOworICAgICAgICBjb3VudCArPSA0OworICAgICAgfQorICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYWZ0ZXIKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gNCAqIChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KKworICAvLyBjb3B5IHRoZSByZW1haW5pbmcgY29sdW1ucyBvbmUgYXQgYSB0aW1lIChucj09MSkKKyAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzNDsgajI8Y29sczsgKytqMikKKyAgeworICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gb2Zmc2V0OworICAgIGNvbnN0IExpbmVhck1hcHBlciBkbTAgPSByaHMuZ2V0TGluZWFyTWFwcGVyKDAsIGoyKTsKKyAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgeworICAgICAgYmxvY2tCW2NvdW50XSA9IGNqKGRtMChrKSk7CisgICAgICBjb3VudCArPSAxOworICAgIH0KKyAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgfQorfQorCisvLyB0aGlzIHZlcnNpb24gaXMgb3B0aW1pemVkIGZvciByb3cgbWFqb3IgbWF0cmljZXMKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBuciwgYm9vbCBDb25qdWdhdGUsIGJvb2wgUGFuZWxNb2RlPgorc3RydWN0IGdlbW1fcGFja19yaHM8U2NhbGFyLCBJbmRleCwgRGF0YU1hcHBlciwgbnIsIFJvd01ham9yLCBDb25qdWdhdGUsIFBhbmVsTW9kZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIERhdGFNYXBwZXI6OkxpbmVhck1hcHBlciBMaW5lYXJNYXBwZXI7CisgIGVudW0geyBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplIH07CisgIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgb3BlcmF0b3IoKShTY2FsYXIqIGJsb2NrQiwgY29uc3QgRGF0YU1hcHBlciYgcmhzLCBJbmRleCBkZXB0aCwgSW5kZXggY29scywgSW5kZXggc3RyaWRlPTAsIEluZGV4IG9mZnNldD0wKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBuciwgYm9vbCBDb25qdWdhdGUsIGJvb2wgUGFuZWxNb2RlPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIERhdGFNYXBwZXIsIG5yLCBSb3dNYWpvciwgQ29uanVnYXRlLCBQYW5lbE1vZGU+CisgIDo6b3BlcmF0b3IoKShTY2FsYXIqIGJsb2NrQiwgY29uc3QgRGF0YU1hcHBlciYgcmhzLCBJbmRleCBkZXB0aCwgSW5kZXggY29scywgSW5kZXggc3RyaWRlLCBJbmRleCBvZmZzZXQpCit7CisgIEVJR0VOX0FTTV9DT01NRU5UKCJFSUdFTiBQUk9EVUNUIFBBQ0sgUkhTIFJPV01BSk9SIik7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzdHJpZGUpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob2Zmc2V0KTsKKyAgZWlnZW5fYXNzZXJ0KCgoIVBhbmVsTW9kZSkgJiYgc3RyaWRlPT0wICYmIG9mZnNldD09MCkgfHwgKFBhbmVsTW9kZSAmJiBzdHJpZGU+PWRlcHRoICYmIG9mZnNldDw9c3RyaWRlKSk7CisgIGNvbmpfaWY8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBDb25qdWdhdGU+IGNqOworICBJbmRleCBwYWNrZXRfY29sczggPSBucj49OCA/IChjb2xzLzgpICogOCA6IDA7CisgIEluZGV4IHBhY2tldF9jb2xzNCA9IG5yPj00ID8gKGNvbHMvNCkgKiA0IDogMDsKKyAgSW5kZXggY291bnQgPSAwOworCisvLyAgIGlmKG5yPj04KQorLy8gICB7CisvLyAgICAgZm9yKEluZGV4IGoyPTA7IGoyPHBhY2tldF9jb2xzODsgajIrPTgpCisvLyAgICAgeworLy8gICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYmVmb3JlCisvLyAgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IDggKiBvZmZzZXQ7CisvLyAgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisvLyAgICAgICB7CisvLyAgICAgICAgIGlmIChQYWNrZXRTaXplPT04KSB7CisvLyAgICAgICAgICAgUGFja2V0IEEgPSBwbG9hZHU8UGFja2V0PigmcmhzW2sqcmhzU3RyaWRlICsgajJdKTsKKy8vICAgICAgICAgICBwc3RvcmV1KGJsb2NrQitjb3VudCwgY2oucGNvbmooQSkpOworLy8gICAgICAgICB9IGVsc2UgaWYgKFBhY2tldFNpemU9PTQpIHsKKy8vICAgICAgICAgICBQYWNrZXQgQSA9IHBsb2FkdTxQYWNrZXQ+KCZyaHNbaypyaHNTdHJpZGUgKyBqMl0pOworLy8gICAgICAgICAgIFBhY2tldCBCID0gcGxvYWR1PFBhY2tldD4oJnJoc1trKnJoc1N0cmlkZSArIGoyICsgUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgIHBzdG9yZXUoYmxvY2tCK2NvdW50LCBjai5wY29uaihBKSk7CisvLyAgICAgICAgICAgcHN0b3JldShibG9ja0IrY291bnQrUGFja2V0U2l6ZSwgY2oucGNvbmooQikpOworLy8gICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgIGNvbnN0IFNjYWxhciogYjAgPSAmcmhzW2sqcmhzU3RyaWRlICsgajJdOworLy8gICAgICAgICAgIGJsb2NrQltjb3VudCswXSA9IGNqKGIwWzBdKTsKKy8vICAgICAgICAgICBibG9ja0JbY291bnQrMV0gPSBjaihiMFsxXSk7CisvLyAgICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gY2ooYjBbMl0pOworLy8gICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IGNqKGIwWzNdKTsKKy8vICAgICAgICAgICBibG9ja0JbY291bnQrNF0gPSBjaihiMFs0XSk7CisvLyAgICAgICAgICAgYmxvY2tCW2NvdW50KzVdID0gY2ooYjBbNV0pOworLy8gICAgICAgICAgIGJsb2NrQltjb3VudCs2XSA9IGNqKGIwWzZdKTsKKy8vICAgICAgICAgICBibG9ja0JbY291bnQrN10gPSBjaihiMFs3XSk7CisvLyAgICAgICAgIH0KKy8vICAgICAgICAgY291bnQgKz0gODsKKy8vICAgICAgIH0KKy8vICAgICAgIC8vIHNraXAgd2hhdCB3ZSBoYXZlIGFmdGVyCisvLyAgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IDggKiAoc3RyaWRlLW9mZnNldC1kZXB0aCk7CisvLyAgICAgfQorLy8gICB9CisgIGlmKG5yPj00KQorICB7CisgICAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzODsgajI8cGFja2V0X2NvbHM0OyBqMis9NCkKKyAgICB7CisgICAgICAvLyBza2lwIHdoYXQgd2UgaGF2ZSBiZWZvcmUKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gNCAqIG9mZnNldDsKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgIHsKKyAgICAgICAgaWYgKFBhY2tldFNpemU9PTQpIHsKKyAgICAgICAgICBQYWNrZXQgQSA9IHJocy5sb2FkUGFja2V0KGssIGoyKTsKKyAgICAgICAgICBwc3RvcmV1KGJsb2NrQitjb3VudCwgY2oucGNvbmooQSkpOworICAgICAgICAgIGNvdW50ICs9IFBhY2tldFNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3QgTGluZWFyTWFwcGVyIGRtMCA9IHJocy5nZXRMaW5lYXJNYXBwZXIoaywgajIpOworICAgICAgICAgIGJsb2NrQltjb3VudCswXSA9IGNqKGRtMCgwKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gY2ooZG0wKDEpKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrMl0gPSBjaihkbTAoMikpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IGNqKGRtMCgzKSk7CisgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYWZ0ZXIKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gNCAqIChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KKyAgLy8gY29weSB0aGUgcmVtYWluaW5nIGNvbHVtbnMgb25lIGF0IGEgdGltZSAobnI9PTEpCisgIGZvcihJbmRleCBqMj1wYWNrZXRfY29sczQ7IGoyPGNvbHM7ICsrajIpCisgIHsKKyAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IG9mZnNldDsKKyAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgeworICAgICAgYmxvY2tCW2NvdW50XSA9IGNqKHJocyhrLCBqMikpOworICAgICAgY291bnQgKz0gMTsKKyAgICB9CisgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBzdHJpZGUtb2Zmc2V0LWRlcHRoOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgbGV2ZWwgMSBjcHUgY2FjaGUgc2l6ZSAoaW4gYnl0ZXMpIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGlkZWFsIGJsb2NraW5nIHNpemUgcGFyYW1ldGVycy4KKyAgKiBcc2Egc2V0Q3B1Q2FjaGVTaXplICovCitpbmxpbmUgc3RkOjpwdHJkaWZmX3QgbDFDYWNoZVNpemUoKQoreworICBzdGQ6OnB0cmRpZmZfdCBsMSwgbDIsIGwzOworICBpbnRlcm5hbDo6bWFuYWdlX2NhY2hpbmdfc2l6ZXMoR2V0QWN0aW9uLCAmbDEsICZsMiwgJmwzKTsKKyAgcmV0dXJuIGwxOworfQorCisvKiogXHJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgbGV2ZWwgMiBjcHUgY2FjaGUgc2l6ZSAoaW4gYnl0ZXMpIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGlkZWFsIGJsb2NraW5nIHNpemUgcGFyYW1ldGVycy4KKyAgKiBcc2Egc2V0Q3B1Q2FjaGVTaXplICovCitpbmxpbmUgc3RkOjpwdHJkaWZmX3QgbDJDYWNoZVNpemUoKQoreworICBzdGQ6OnB0cmRpZmZfdCBsMSwgbDIsIGwzOworICBpbnRlcm5hbDo6bWFuYWdlX2NhY2hpbmdfc2l6ZXMoR2V0QWN0aW9uLCAmbDEsICZsMiwgJmwzKTsKKyAgcmV0dXJuIGwyOworfQorCisvKiogXHJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgbGV2ZWwgMyBjcHUgY2FjaGUgc2l6ZSAoaW4gYnl0ZXMpIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGlkZWFsIGJsb2NraW5nIHNpemUgcGFyYW1ldGVcCitycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqIFxzYSBzZXRDcHVDYWNoZVNpemUgKi8KK2lubGluZSBzdGQ6OnB0cmRpZmZfdCBsM0NhY2hlU2l6ZSgpCit7CisgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMiwgbDM7CisgIGludGVybmFsOjptYW5hZ2VfY2FjaGluZ19zaXplcyhHZXRBY3Rpb24sICZsMSwgJmwyLCAmbDMpOworICByZXR1cm4gbDM7Cit9CisKKy8qKiBTZXQgdGhlIGNwdSBMMSBhbmQgTDIgY2FjaGUgc2l6ZXMgKGluIGJ5dGVzKS4KKyAgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZSB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJsb2NrcworICAqIGZvciB0aGUgYWxnb3JpdGhtcyB3b3JraW5nIHBlciBibG9ja3MuCisgICoKKyAgKiBcc2EgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzICovCitpbmxpbmUgdm9pZCBzZXRDcHVDYWNoZVNpemVzKHN0ZDo6cHRyZGlmZl90IGwxLCBzdGQ6OnB0cmRpZmZfdCBsMiwgc3RkOjpwdHJkaWZmX3QgbDMpCit7CisgIGludGVybmFsOjptYW5hZ2VfY2FjaGluZ19zaXplcyhTZXRBY3Rpb24sICZsMSwgJmwyLCAmbDMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfQkxPQ0tfUEFORUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxY2ZiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4LmgKQEAgLTAsMCArMSw0OTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9MaHNTY2FsYXIsIHR5cGVuYW1lIF9SaHNTY2FsYXI+IGNsYXNzIGxldmVsM19ibG9ja2luZzsKKworLyogU3BlY2lhbGl6YXRpb24gZm9yIGEgcm93LW1ham9yIGRlc3RpbmF0aW9uIG1hdHJpeCA9PiBzaW1wbGUgdHJhbnNwb3NpdGlvbiBvZiB0aGUgcHJvZHVjdCAqLwordGVtcGxhdGU8CisgIHR5cGVuYW1lIEluZGV4LAorICB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLFJoc1NjYWxhcixSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLFJvd01ham9yPgoreworICB0eXBlZGVmIGdlYnBfdHJhaXRzPFJoc1NjYWxhcixMaHNTY2FsYXI+IFRyYWl0czsKKworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGRlcHRoLAorICAgIGNvbnN0IExoc1NjYWxhciogbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgUmhzU2NhbGFyKiByaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzU3RyaWRlLAorICAgIFJlc1NjYWxhciBhbHBoYSwKKyAgICBsZXZlbDNfYmxvY2tpbmc8UmhzU2NhbGFyLExoc1NjYWxhcj4mIGJsb2NraW5nLAorICAgIEdlbW1QYXJhbGxlbEluZm88SW5kZXg+KiBpbmZvID0gMCkKKyAgeworICAgIC8vIHRyYW5zcG9zZSB0aGUgcHJvZHVjdCBzdWNoIHRoYXQgdGhlIHJlc3VsdCBpcyBjb2x1bW4gbWFqb3IKKyAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbmRleCwKKyAgICAgIFJoc1NjYWxhciwgUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsIENvbmp1Z2F0ZVJocywKKyAgICAgIExoc1NjYWxhciwgTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsIENvbmp1Z2F0ZUxocywKKyAgICAgIENvbE1ham9yPgorICAgIDo6cnVuKGNvbHMscm93cyxkZXB0aCxyaHMscmhzU3RyaWRlLGxocyxsaHNTdHJpZGUscmVzLHJlc1N0cmlkZSxhbHBoYSxibG9ja2luZyxpbmZvKTsKKyAgfQorfTsKKworLyogIFNwZWNpYWxpemF0aW9uIGZvciBhIGNvbC1tYWpvciBkZXN0aW5hdGlvbiBtYXRyaXgKKyAqICAgID0+IEJsb2NraW5nIGFsZ29yaXRobSBmb2xsb3dpbmcgR290bydzIHBhcGVyICovCit0ZW1wbGF0ZTwKKyAgdHlwZW5hbWUgSW5kZXgsCisgIHR5cGVuYW1lIExoc1NjYWxhciwgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3I+Cit7CisKK3R5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj4gVHJhaXRzOworCit0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CitzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsCisgIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgUmVzU2NhbGFyKiBfcmVzLCBJbmRleCByZXNTdHJpZGUsCisgIFJlc1NjYWxhciBhbHBoYSwKKyAgbGV2ZWwzX2Jsb2NraW5nPExoc1NjYWxhcixSaHNTY2FsYXI+JiBibG9ja2luZywKKyAgR2VtbVBhcmFsbGVsSW5mbzxJbmRleD4qIGluZm8gPSAwKQoreworICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8TGhzU2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBMaHNNYXBwZXI7CisgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxSaHNTY2FsYXIsIEluZGV4LCBSaHNTdG9yYWdlT3JkZXI+IFJoc01hcHBlcjsKKyAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IFJlc01hcHBlcjsKKyAgTGhzTWFwcGVyIGxocyhfbGhzLGxoc1N0cmlkZSk7CisgIFJoc01hcHBlciByaHMoX3JocyxyaHNTdHJpZGUpOworICBSZXNNYXBwZXIgcmVzKF9yZXMsIHJlc1N0cmlkZSk7CisKKyAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICBJbmRleCBtYyA9IChzdGQ6Om1pbikocm93cyxibG9ja2luZy5tYygpKTsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisgIEluZGV4IG5jID0gKHN0ZDo6bWluKShjb2xzLGJsb2NraW5nLm5jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTiBkaXJlY3Rpb24KKworICBnZW1tX3BhY2tfbGhzPExoc1NjYWxhciwgSW5kZXgsIExoc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgZ2VtbV9wYWNrX3JoczxSaHNTY2FsYXIsIEluZGV4LCBSaHNNYXBwZXIsIFRyYWl0czo6bnIsIFJoc1N0b3JhZ2VPcmRlcj4gcGFja19yaHM7CisgIGdlYnBfa2VybmVsPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgUmVzTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBDb25qdWdhdGVMaHMsIENvbmp1Z2F0ZVJocz4gZ2VicDsKKworI2lmZGVmIEVJR0VOX0hBU19PUEVOTVAKKyAgaWYoaW5mbykKKyAgeworICAgIC8vIHRoaXMgaXMgdGhlIHBhcmFsbGVsIHZlcnNpb24hCisgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgIGludCB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisgICAgTGhzU2NhbGFyKiBibG9ja0EgPSBibG9ja2luZy5ibG9ja0EoKTsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoYmxvY2tBIT0wKTsKKworICAgIHN0ZDo6c2l6ZV90IHNpemVCID0ga2MqbmM7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJoc1NjYWxhciwgYmxvY2tCLCBzaXplQiwgMCk7CisKKyAgICAvLyBGb3IgZWFjaCBob3Jpem9udGFsIHBhbmVsIG9mIHRoZSByaHMsIGFuZCBjb3JyZXNwb25kaW5nIHZlcnRpY2FsIHBhbmVsIG9mIHRoZSBsaHMuLi4KKyAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKz1rYykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfa2MgPSAoc3RkOjptaW4pKGsra2MsZGVwdGgpLWs7IC8vID0+IHJvd3Mgb2YgQicsIGFuZCBjb2xzIG9mIHRoZSBBJworCisgICAgICAvLyBJbiBvcmRlciB0byByZWR1Y2UgdGhlIGNoYW5jZSB0aGF0IGEgdGhyZWFkIGhhcyB0byB3YWl0IGZvciB0aGUgb3RoZXIsCisgICAgICAvLyBsZXQncyBzdGFydCBieSBwYWNraW5nIEInLgorICAgICAgcGFja19yaHMoYmxvY2tCLCByaHMuZ2V0U3ViTWFwcGVyKGssMCksIGFjdHVhbF9rYywgbmMpOworCisgICAgICAvLyBQYWNrIEFfayB0byBBJyBpbiBhIHBhcmFsbGVsIGZhc2hpb246CisgICAgICAvLyBlYWNoIHRocmVhZCBwYWNrcyB0aGUgc3ViIGJsb2NrIEFfayxpIHRvIEEnX2kgd2hlcmUgaSBpcyB0aGUgdGhyZWFkIGlkLgorCisgICAgICAvLyBIb3dldmVyLCBiZWZvcmUgY29weWluZyB0byBBJ19pLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIG90aGVyIHRocmVhZCBpcyBzdGlsbCB1c2luZyBpdCwKKyAgICAgIC8vIGkuZS4sIHdlIHRlc3QgdGhhdCBpbmZvW3RpZF0udXNlcnMgZXF1YWxzIDAuCisgICAgICAvLyBUaGVuLCB3ZSBzZXQgaW5mb1t0aWRdLnVzZXJzIHRvIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBtYXJrIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgYXJlIGdvaW5nIHRvIHVzZSBpdC4KKyAgICAgIHdoaWxlKGluZm9bdGlkXS51c2VycyE9MCkge30KKyAgICAgIGluZm9bdGlkXS51c2VycyArPSB0aHJlYWRzOworCisgICAgICBwYWNrX2xocyhibG9ja0EraW5mb1t0aWRdLmxoc19zdGFydCphY3R1YWxfa2MsIGxocy5nZXRTdWJNYXBwZXIoaW5mb1t0aWRdLmxoc19zdGFydCxrKSwgYWN0dWFsX2tjLCBpbmZvW3RpZF0ubGhzX2xlbmd0aCk7CisKKyAgICAgIC8vIE5vdGlmeSB0aGUgb3RoZXIgdGhyZWFkcyB0aGF0IHRoZSBwYXJ0IEEnX2kgaXMgcmVhZHkgdG8gZ28uCisgICAgICBpbmZvW3RpZF0uc3luYyA9IGs7CisKKyAgICAgIC8vIENvbXB1dGVzIENfaSArPSBBJyAqIEInIHBlciBBJ19pCisgICAgICBmb3IoaW50IHNoaWZ0PTA7IHNoaWZ0PHRocmVhZHM7ICsrc2hpZnQpCisgICAgICB7CisgICAgICAgIGludCBpID0gKHRpZCtzaGlmdCkldGhyZWFkczsKKworICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgQSdfaSBoYXMgYmVlbiB1cGRhdGVkIGJ5IHRoZSB0aHJlYWQgaSwKKyAgICAgICAgLy8gd2UgdXNlIHRlc3RBbmRTZXRPcmRlcmVkIHRvIG1pbWljIGEgdm9sYXRpbGUgYWNjZXNzLgorICAgICAgICAvLyBIb3dldmVyLCBubyBuZWVkIHRvIHdhaXQgZm9yIHRoZSBCJyBwYXJ0IHdoaWNoIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIQorICAgICAgICBpZiAoc2hpZnQ+MCkgeworICAgICAgICAgIHdoaWxlKGluZm9baV0uc3luYyE9aykgeworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdlYnAocmVzLmdldFN1Yk1hcHBlcihpbmZvW2ldLmxoc19zdGFydCwgMCksIGJsb2NrQStpbmZvW2ldLmxoc19zdGFydCphY3R1YWxfa2MsIGJsb2NrQiwgaW5mb1tpXS5saHNfbGVuZ3RoLCBhY3R1YWxfa2MsIG5jLCBhbHBoYSk7CisgICAgICB9CisKKyAgICAgIC8vIFRoZW4ga2VlcCBnb2luZyBhcyB1c3VhbCB3aXRoIHRoZSByZW1haW5pbmcgQicKKyAgICAgIGZvcihJbmRleCBqPW5jOyBqPGNvbHM7IGorPW5jKQorICAgICAgeworICAgICAgICBjb25zdCBJbmRleCBhY3R1YWxfbmMgPSAoc3RkOjptaW4pKGorbmMsY29scyktajsKKworICAgICAgICAvLyBwYWNrIEJfayxqIHRvIEInCisgICAgICAgIHBhY2tfcmhzKGJsb2NrQiwgcmhzLmdldFN1Yk1hcHBlcihrLGopLCBhY3R1YWxfa2MsIGFjdHVhbF9uYyk7CisKKyAgICAgICAgLy8gQ19qICs9IEEnICogQicKKyAgICAgICAgZ2VicChyZXMuZ2V0U3ViTWFwcGVyKDAsIGopLCBibG9ja0EsIGJsb2NrQiwgcm93cywgYWN0dWFsX2tjLCBhY3R1YWxfbmMsIGFscGhhKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVsZWFzZSBhbGwgdGhlIHN1YiBibG9ja3MgQSdfaSBvZiBBJyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLAorICAgICAgLy8gaS5lLiwgd2Ugc2ltcGx5IGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIHVzZXJzIGJ5IDEKKyAgICAgIGZvcihJbmRleCBpPTA7IGk8dGhyZWFkczsgKytpKQorICAgICAgICBpbmZvW2ldLnVzZXJzIC09IDE7CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZiAvLyBFSUdFTl9IQVNfT1BFTk1QCisgIHsKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbyk7CisKKyAgICAvLyB0aGlzIGlzIHRoZSBzZXF1ZW50aWFsIHZlcnNpb24hCisgICAgc3RkOjpzaXplX3Qgc2l6ZUEgPSBrYyptYzsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IGtjKm5jOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKExoc1NjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKworICAgIGNvbnN0IGJvb2wgcGFja19yaHNfb25jZSA9IG1jIT1yb3dzICYmIGtjPT1kZXB0aCAmJiBuYz09Y29sczsKKworICAgIC8vIEZvciBlYWNoIGhvcml6b250YWwgcGFuZWwgb2YgdGhlIHJocywgYW5kIGNvcnJlc3BvbmRpbmcgcGFuZWwgb2YgdGhlIGxocy4uLgorICAgIGZvcihJbmRleCBpMj0wOyBpMjxyb3dzOyBpMis9bWMpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxyb3dzKS1pMjsKKworICAgICAgZm9yKEluZGV4IGsyPTA7IGsyPGRlcHRoOyBrMis9a2MpCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9rYyA9IChzdGQ6Om1pbikoazIra2MsZGVwdGgpLWsyOworCisgICAgICAgIC8vIE9LLCBoZXJlIHdlIGhhdmUgc2VsZWN0ZWQgb25lIGhvcml6b250YWwgcGFuZWwgb2YgcmhzIGFuZCBvbmUgdmVydGljYWwgcGFuZWwgb2YgbGhzLgorICAgICAgICAvLyA9PiBQYWNrIGxocydzIHBhbmVsIGludG8gYSBzZXF1ZW50aWFsIGNodW5rIG9mIG1lbW9yeSAoTDIvTDMgY2FjaGluZykKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgcGFuZWwgd2lsbCBiZSByZWFkIGFzIG1hbnkgdGltZXMgYXMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIHJocydzCisgICAgICAgIC8vIGhvcml6b250YWwgcGFuZWwgd2hpY2ggaXMsIGluIHByYWN0aWNlLCBhIHZlcnkgbG93IG51bWJlci4KKyAgICAgICAgcGFja19saHMoYmxvY2tBLCBsaHMuZ2V0U3ViTWFwcGVyKGkyLGsyKSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgIC8vIEZvciBlYWNoIGtjIHggbmMgYmxvY2sgb2YgdGhlIHJocydzIGhvcml6b250YWwgcGFuZWwuLi4KKyAgICAgICAgZm9yKEluZGV4IGoyPTA7IGoyPGNvbHM7IGoyKz1uYykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9uYyA9IChzdGQ6Om1pbikoajIrbmMsY29scyktajI7CisKKyAgICAgICAgICAvLyBXZSBwYWNrIHRoZSByaHMncyBibG9jayBpbnRvIGEgc2VxdWVudGlhbCBjaHVuayBvZiBtZW1vcnkgKEwyIGNhY2hpbmcpCisgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgYmxvY2sgd2lsbCBiZSByZWFkIGEgdmVyeSBoaWdoIG51bWJlciBvZiB0aW1lcywgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgIC8vIG1pY3JvIGhvcml6b250YWwgcGFuZWwgb2YgdGhlIGxhcmdlIHJocydzIHBhbmVsIChlLmcuLCByb3dzLzEyIHRpbWVzKS4KKyAgICAgICAgICBpZigoIXBhY2tfcmhzX29uY2UpIHx8IGkyPT0wKQorICAgICAgICAgICAgcGFja19yaHMoYmxvY2tCLCByaHMuZ2V0U3ViTWFwcGVyKGsyLGoyKSwgYWN0dWFsX2tjLCBhY3R1YWxfbmMpOworCisgICAgICAgICAgLy8gRXZlcnl0aGluZyBpcyBwYWNrZWQsIHdlIGNhbiBub3cgY2FsbCB0aGUgcGFuZWwgKiBibG9jayBrZXJuZWw6CisgICAgICAgICAgZ2VicChyZXMuZ2V0U3ViTWFwcGVyKGkyLCBqMiksIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgYWN0dWFsX25jLCBhbHBoYSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU3BlY2lhbGl6YXRpb24gb2YgZ2VuZXJpY19wcm9kdWN0X2ltcGwgZm9yICJsYXJnZSIgR0VNTSwgaS5lLiwKKyogIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoaWdoIGxldmVsIHdyYXBwZXIgdG8gZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIEdlbW0sIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBCbG9ja2luZ1R5cGU+CitzdHJ1Y3QgZ2VtbV9mdW5jdG9yCit7CisgIGdlbW1fZnVuY3Rvcihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIERlc3QmIGRlc3QsIGNvbnN0IFNjYWxhciYgYWN0dWFsQWxwaGEsIEJsb2NraW5nVHlwZSYgYmxvY2tpbmcpCisgICAgOiBtX2xocyhsaHMpLCBtX3JocyhyaHMpLCBtX2Rlc3QoZGVzdCksIG1fYWN0dWFsQWxwaGEoYWN0dWFsQWxwaGEpLCBtX2Jsb2NraW5nKGJsb2NraW5nKQorICB7fQorCisgIHZvaWQgaW5pdFBhcmFsbGVsU2Vzc2lvbihJbmRleCBudW1fdGhyZWFkcykgY29uc3QKKyAgeworICAgIG1fYmxvY2tpbmcuaW5pdFBhcmFsbGVsKG1fbGhzLnJvd3MoKSwgbV9yaHMuY29scygpLCBtX2xocy5jb2xzKCksIG51bV90aHJlYWRzKTsKKyAgICBtX2Jsb2NraW5nLmFsbG9jYXRlQSgpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IHJvd3MsIEluZGV4IGNvbD0wLCBJbmRleCBjb2xzPS0xLCBHZW1tUGFyYWxsZWxJbmZvPEluZGV4PiogaW5mbz0wKSBjb25zdAorICB7CisgICAgaWYoY29scz09LTEpCisgICAgICBjb2xzID0gbV9yaHMuY29scygpOworCisgICAgR2VtbTo6cnVuKHJvd3MsIGNvbHMsIG1fbGhzLmNvbHMoKSwKKyAgICAgICAgICAgICAgJm1fbGhzLmNvZWZmUmVmKHJvdywwKSwgbV9saHMub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgICAgJm1fcmhzLmNvZWZmUmVmKDAsY29sKSwgbV9yaHMub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgICAgKFNjYWxhciopJihtX2Rlc3QuY29lZmZSZWYocm93LGNvbCkpLCBtX2Rlc3Qub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgICAgbV9hY3R1YWxBbHBoYSwgbV9ibG9ja2luZywgaW5mbyk7CisgIH0KKworICB0eXBlZGVmIHR5cGVuYW1lIEdlbW06OlRyYWl0cyBUcmFpdHM7CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IExocyYgbV9saHM7CisgICAgY29uc3QgUmhzJiBtX3JoczsKKyAgICBEZXN0JiBtX2Rlc3Q7CisgICAgU2NhbGFyIG1fYWN0dWFsQWxwaGE7CisgICAgQmxvY2tpbmdUeXBlJiBtX2Jsb2NraW5nOworfTsKKwordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlciwgdHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scywgaW50IE1heERlcHRoLCBpbnQgS2NGYWN0b3I9MSwKK2Jvb2wgRmluaXRlQXRDb21waWxlVGltZSA9IE1heFJvd3MhPUR5bmFtaWMgJiYgTWF4Q29scyE9RHluYW1pYyAmJiBNYXhEZXB0aCAhPSBEeW5hbWljPiBjbGFzcyBnZW1tX2Jsb2NraW5nX3NwYWNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyPgorY2xhc3MgbGV2ZWwzX2Jsb2NraW5nCit7CisgICAgdHlwZWRlZiBfTGhzU2NhbGFyIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIF9SaHNTY2FsYXIgUmhzU2NhbGFyOworCisgIHByb3RlY3RlZDoKKyAgICBMaHNTY2FsYXIqIG1fYmxvY2tBOworICAgIFJoc1NjYWxhciogbV9ibG9ja0I7CisKKyAgICBJbmRleCBtX21jOworICAgIEluZGV4IG1fbmM7CisgICAgSW5kZXggbV9rYzsKKworICBwdWJsaWM6CisKKyAgICBsZXZlbDNfYmxvY2tpbmcoKQorICAgICAgOiBtX2Jsb2NrQSgwKSwgbV9ibG9ja0IoMCksIG1fbWMoMCksIG1fbmMoMCksIG1fa2MoMCkKKyAgICB7fQorCisgICAgaW5saW5lIEluZGV4IG1jKCkgY29uc3QgeyByZXR1cm4gbV9tYzsgfQorICAgIGlubGluZSBJbmRleCBuYygpIGNvbnN0IHsgcmV0dXJuIG1fbmM7IH0KKyAgICBpbmxpbmUgSW5kZXgga2MoKSBjb25zdCB7IHJldHVybiBtX2tjOyB9CisKKyAgICBpbmxpbmUgTGhzU2NhbGFyKiBibG9ja0EoKSB7IHJldHVybiBtX2Jsb2NrQTsgfQorICAgIGlubGluZSBSaHNTY2FsYXIqIGJsb2NrQigpIHsgcmV0dXJuIG1fYmxvY2tCOyB9Cit9OworCit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLCB0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyLCBpbnQgTWF4Um93cywgaW50IE1heENvbHMsIGludCBNYXhEZXB0aCwgaW50IEtjRmFjdG9yPgorY2xhc3MgZ2VtbV9ibG9ja2luZ19zcGFjZTxTdG9yYWdlT3JkZXIsX0xoc1NjYWxhcixfUmhzU2NhbGFyLE1heFJvd3MsIE1heENvbHMsIE1heERlcHRoLCBLY0ZhY3RvciwgdHJ1ZSAvKiA9PSBGaW5pdGVBdENvbXBpbGVUaW1lICovPgorICA6IHB1YmxpYyBsZXZlbDNfYmxvY2tpbmc8CisgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDxTdG9yYWdlT3JkZXI9PVJvd01ham9yLF9SaHNTY2FsYXIsX0xoc1NjYWxhcj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDxTdG9yYWdlT3JkZXI9PVJvd01ham9yLF9MaHNTY2FsYXIsX1Joc1NjYWxhcj46OnR5cGU+Cit7CisgICAgZW51bSB7CisgICAgICBUcmFuc3Bvc2UgPSBTdG9yYWdlT3JkZXI9PVJvd01ham9yLAorICAgICAgQWN0dWFsUm93cyA9IFRyYW5zcG9zZSA/IE1heENvbHMgOiBNYXhSb3dzLAorICAgICAgQWN0dWFsQ29scyA9IFRyYW5zcG9zZSA/IE1heFJvd3MgOiBNYXhDb2xzCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFRyYW5zcG9zZSxfUmhzU2NhbGFyLF9MaHNTY2FsYXI+Ojp0eXBlIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFRyYW5zcG9zZSxfTGhzU2NhbGFyLF9SaHNTY2FsYXI+Ojp0eXBlIFJoc1NjYWxhcjsKKyAgICB0eXBlZGVmIGdlYnBfdHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXI+IFRyYWl0czsKKyAgICBlbnVtIHsKKyAgICAgIFNpemVBID0gQWN0dWFsUm93cyAqIE1heERlcHRoLAorICAgICAgU2l6ZUIgPSBBY3R1YWxDb2xzICogTWF4RGVwdGgKKyAgICB9OworCisjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyA+PSBFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTCisgICAgRUlHRU5fQUxJR05fTUFYIExoc1NjYWxhciBtX3N0YXRpY0FbU2l6ZUFdOworICAgIEVJR0VOX0FMSUdOX01BWCBSaHNTY2FsYXIgbV9zdGF0aWNCW1NpemVCXTsKKyNlbHNlCisgICAgRUlHRU5fQUxJR05fTUFYIGNoYXIgbV9zdGF0aWNBW1NpemVBICogc2l6ZW9mKExoc1NjYWxhcikgKyBFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTLTFdOworICAgIEVJR0VOX0FMSUdOX01BWCBjaGFyIG1fc3RhdGljQltTaXplQiAqIHNpemVvZihSaHNTY2FsYXIpICsgRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUy0xXTsKKyNlbmRpZgorCisgIHB1YmxpYzoKKworICAgIGdlbW1fYmxvY2tpbmdfc3BhY2UoSW5kZXggLypyb3dzKi8sIEluZGV4IC8qY29scyovLCBJbmRleCAvKmRlcHRoKi8sIEluZGV4IC8qbnVtX3RocmVhZHMqLywgYm9vbCAvKmZ1bGxfcm93cyA9IGZhbHNlKi8pCisgICAgeworICAgICAgdGhpcy0+bV9tYyA9IEFjdHVhbFJvd3M7CisgICAgICB0aGlzLT5tX25jID0gQWN0dWFsQ29sczsKKyAgICAgIHRoaXMtPm1fa2MgPSBNYXhEZXB0aDsKKyNpZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTID49IEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMKKyAgICAgIHRoaXMtPm1fYmxvY2tBID0gbV9zdGF0aWNBOworICAgICAgdGhpcy0+bV9ibG9ja0IgPSBtX3N0YXRpY0I7CisjZWxzZQorICAgICAgdGhpcy0+bV9ibG9ja0EgPSByZWludGVycHJldF9jYXN0PExoc1NjYWxhcio+KChpbnRlcm5hbDo6VUludFB0cihtX3N0YXRpY0EpICsgKEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMtMSkpICYgfnN0ZDo6c2l6ZV90KEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMtMSkpOworICAgICAgdGhpcy0+bV9ibG9ja0IgPSByZWludGVycHJldF9jYXN0PFJoc1NjYWxhcio+KChpbnRlcm5hbDo6VUludFB0cihtX3N0YXRpY0IpICsgKEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMtMSkpICYgfnN0ZDo6c2l6ZV90KEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMtMSkpOworI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBpbml0UGFyYWxsZWwoSW5kZXgsIEluZGV4LCBJbmRleCwgSW5kZXgpCisgICAge30KKworICAgIGlubGluZSB2b2lkIGFsbG9jYXRlQSgpIHt9CisgICAgaW5saW5lIHZvaWQgYWxsb2NhdGVCKCkge30KKyAgICBpbmxpbmUgdm9pZCBhbGxvY2F0ZUFsbCgpIHt9Cit9OworCit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLCB0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyLCBpbnQgTWF4Um93cywgaW50IE1heENvbHMsIGludCBNYXhEZXB0aCwgaW50IEtjRmFjdG9yPgorY2xhc3MgZ2VtbV9ibG9ja2luZ19zcGFjZTxTdG9yYWdlT3JkZXIsX0xoc1NjYWxhcixfUmhzU2NhbGFyLE1heFJvd3MsIE1heENvbHMsIE1heERlcHRoLCBLY0ZhY3RvciwgZmFsc2U+CisgIDogcHVibGljIGxldmVsM19ibG9ja2luZzwKKyAgICAgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFN0b3JhZ2VPcmRlcj09Um93TWFqb3IsX1Joc1NjYWxhcixfTGhzU2NhbGFyPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFN0b3JhZ2VPcmRlcj09Um93TWFqb3IsX0xoc1NjYWxhcixfUmhzU2NhbGFyPjo6dHlwZT4KK3sKKyAgICBlbnVtIHsKKyAgICAgIFRyYW5zcG9zZSA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VHJhbnNwb3NlLF9SaHNTY2FsYXIsX0xoc1NjYWxhcj46OnR5cGUgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VHJhbnNwb3NlLF9MaHNTY2FsYXIsX1Joc1NjYWxhcj46OnR5cGUgUmhzU2NhbGFyOworICAgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj4gVHJhaXRzOworCisgICAgSW5kZXggbV9zaXplQTsKKyAgICBJbmRleCBtX3NpemVCOworCisgIHB1YmxpYzoKKworICAgIGdlbW1fYmxvY2tpbmdfc3BhY2UoSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsIEluZGV4IG51bV90aHJlYWRzLCBib29sIGwzX2Jsb2NraW5nKQorICAgIHsKKyAgICAgIHRoaXMtPm1fbWMgPSBUcmFuc3Bvc2UgPyBjb2xzIDogcm93czsKKyAgICAgIHRoaXMtPm1fbmMgPSBUcmFuc3Bvc2UgPyByb3dzIDogY29sczsKKyAgICAgIHRoaXMtPm1fa2MgPSBkZXB0aDsKKworICAgICAgaWYobDNfYmxvY2tpbmcpCisgICAgICB7CisgICAgICAgIGNvbXB1dGVQcm9kdWN0QmxvY2tpbmdTaXplczxMaHNTY2FsYXIsUmhzU2NhbGFyLEtjRmFjdG9yPih0aGlzLT5tX2tjLCB0aGlzLT5tX21jLCB0aGlzLT5tX25jLCBudW1fdGhyZWFkcyk7CisgICAgICB9CisgICAgICBlbHNlICAvLyBubyBsMyBibG9ja2luZworICAgICAgeworICAgICAgICBJbmRleCBuID0gdGhpcy0+bV9uYzsKKyAgICAgICAgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPExoc1NjYWxhcixSaHNTY2FsYXIsS2NGYWN0b3I+KHRoaXMtPm1fa2MsIHRoaXMtPm1fbWMsIG4sIG51bV90aHJlYWRzKTsKKyAgICAgIH0KKworICAgICAgbV9zaXplQSA9IHRoaXMtPm1fbWMgKiB0aGlzLT5tX2tjOworICAgICAgbV9zaXplQiA9IHRoaXMtPm1fa2MgKiB0aGlzLT5tX25jOworICAgIH0KKworICAgIHZvaWQgaW5pdFBhcmFsbGVsKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGRlcHRoLCBJbmRleCBudW1fdGhyZWFkcykKKyAgICB7CisgICAgICB0aGlzLT5tX21jID0gVHJhbnNwb3NlID8gY29scyA6IHJvd3M7CisgICAgICB0aGlzLT5tX25jID0gVHJhbnNwb3NlID8gcm93cyA6IGNvbHM7CisgICAgICB0aGlzLT5tX2tjID0gZGVwdGg7CisKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydCh0aGlzLT5tX2Jsb2NrQT09MCAmJiB0aGlzLT5tX2Jsb2NrQj09MCk7CisgICAgICBJbmRleCBtID0gdGhpcy0+bV9tYzsKKyAgICAgIGNvbXB1dGVQcm9kdWN0QmxvY2tpbmdTaXplczxMaHNTY2FsYXIsUmhzU2NhbGFyLEtjRmFjdG9yPih0aGlzLT5tX2tjLCBtLCB0aGlzLT5tX25jLCBudW1fdGhyZWFkcyk7CisgICAgICBtX3NpemVBID0gdGhpcy0+bV9tYyAqIHRoaXMtPm1fa2M7CisgICAgICBtX3NpemVCID0gdGhpcy0+bV9rYyAqIHRoaXMtPm1fbmM7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUEoKQorICAgIHsKKyAgICAgIGlmKHRoaXMtPm1fYmxvY2tBPT0wKQorICAgICAgICB0aGlzLT5tX2Jsb2NrQSA9IGFsaWduZWRfbmV3PExoc1NjYWxhcj4obV9zaXplQSk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUIoKQorICAgIHsKKyAgICAgIGlmKHRoaXMtPm1fYmxvY2tCPT0wKQorICAgICAgICB0aGlzLT5tX2Jsb2NrQiA9IGFsaWduZWRfbmV3PFJoc1NjYWxhcj4obV9zaXplQik7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUFsbCgpCisgICAgeworICAgICAgYWxsb2NhdGVBKCk7CisgICAgICBhbGxvY2F0ZUIoKTsKKyAgICB9CisKKyAgICB+Z2VtbV9ibG9ja2luZ19zcGFjZSgpCisgICAgeworICAgICAgYWxpZ25lZF9kZWxldGUodGhpcy0+bV9ibG9ja0EsIG1fc2l6ZUEpOworICAgICAgYWxpZ25lZF9kZWxldGUodGhpcy0+bV9ibG9ja0IsIG1fc2l6ZUIpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxHZW1tUHJvZHVjdD4KKyAgOiBnZW5lcmljX3Byb2R1Y3RfaW1wbF9iYXNlPExocyxSaHMsZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLFJocyxEZW5zZVNoYXBlLERlbnNlU2hhcGUsR2VtbVByb2R1Y3Q+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6U2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBSaHNTY2FsYXI7CisKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIExoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsTGhzVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxMaHNUeXBlPjo6dHlwZSBBY3R1YWxMaHNUeXBlQ2xlYW5lZDsKKworICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxSaHM+IFJoc0JsYXNUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxSaHNUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJoc1R5cGU+Ojp0eXBlIEFjdHVhbFJoc1R5cGVDbGVhbmVkOworCisgIGVudW0geworICAgIE1heERlcHRoQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChMaHM6Ok1heENvbHNBdENvbXBpbGVUaW1lLFJoczo6TWF4Um93c0F0Q29tcGlsZVRpbWUpCisgIH07CisKKyAgdHlwZWRlZiBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLERlbnNlU2hhcGUsRGVuc2VTaGFwZSxDb2VmZkJhc2VkUHJvZHVjdE1vZGU+IGxhenlwcm9kdWN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERzdD4KKyAgc3RhdGljIHZvaWQgZXZhbFRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICBpZigocmhzLnJvd3MoKStkc3Qucm93cygpK2RzdC5jb2xzKCkpPDIwICYmIHJocy5yb3dzKCk+MCkKKyAgICAgIGxhenlwcm9kdWN0OjpldmFsVG8oZHN0LCBsaHMsIHJocyk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICBzY2FsZUFuZEFkZFRvKGRzdCwgbGhzLCByaHMsIFNjYWxhcigxKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0PgorICBzdGF0aWMgdm9pZCBhZGRUbyhEc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgaWYoKHJocy5yb3dzKCkrZHN0LnJvd3MoKStkc3QuY29scygpKTwyMCAmJiByaHMucm93cygpPjApCisgICAgICBsYXp5cHJvZHVjdDo6YWRkVG8oZHN0LCBsaHMsIHJocyk7CisgICAgZWxzZQorICAgICAgc2NhbGVBbmRBZGRUbyhkc3QsbGhzLCByaHMsIFNjYWxhcigxKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyB2b2lkIHN1YlRvKERzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICBpZigocmhzLnJvd3MoKStkc3Qucm93cygpK2RzdC5jb2xzKCkpPDIwICYmIHJocy5yb3dzKCk+MCkKKyAgICAgIGxhenlwcm9kdWN0OjpzdWJUbyhkc3QsIGxocywgcmhzKTsKKyAgICBlbHNlCisgICAgICBzY2FsZUFuZEFkZFRvKGRzdCwgbGhzLCByaHMsIFNjYWxhcigtMSkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgYV9saHMsIGNvbnN0IFJocyYgYV9yaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoZHN0LnJvd3MoKT09YV9saHMucm93cygpICYmIGRzdC5jb2xzKCk9PWFfcmhzLmNvbHMoKSk7CisgICAgaWYoYV9saHMuY29scygpPT0wIHx8IGFfbGhzLnJvd3MoKT09MCB8fCBhX3Jocy5jb2xzKCk9PTApCisgICAgICByZXR1cm47CisKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsTGhzVHlwZT46OnR5cGUgbGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChhX2xocyk7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbFJoc1R5cGU+Ojp0eXBlIHJocyA9IFJoc0JsYXNUcmFpdHM6OmV4dHJhY3QoYV9yaHMpOworCisgICAgU2NhbGFyIGFjdHVhbEFscGhhID0gYWxwaGEgKiBMaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKGFfbGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihhX3Jocyk7CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPChEZXN0OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLExoc1NjYWxhcixSaHNTY2FsYXIsCisgICAgICAgICAgICBEZXN0OjpNYXhSb3dzQXRDb21waWxlVGltZSxEZXN0OjpNYXhDb2xzQXRDb21waWxlVGltZSxNYXhEZXB0aEF0Q29tcGlsZVRpbWU+IEJsb2NraW5nVHlwZTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fZnVuY3RvcjwKKyAgICAgIFNjYWxhciwgSW5kZXgsCisgICAgICBpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8CisgICAgICAgIEluZGV4LAorICAgICAgICBMaHNTY2FsYXIsIChBY3R1YWxMaHNUeXBlQ2xlYW5lZDo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgYm9vbChMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUpLAorICAgICAgICBSaHNTY2FsYXIsIChBY3R1YWxSaHNUeXBlQ2xlYW5lZDo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgYm9vbChSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUpLAorICAgICAgICAoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4sCisgICAgICBBY3R1YWxMaHNUeXBlQ2xlYW5lZCwgQWN0dWFsUmhzVHlwZUNsZWFuZWQsIERlc3QsIEJsb2NraW5nVHlwZT4gR2VtbUZ1bmN0b3I7CisKKyAgICBCbG9ja2luZ1R5cGUgYmxvY2tpbmcoZHN0LnJvd3MoKSwgZHN0LmNvbHMoKSwgbGhzLmNvbHMoKSwgMSwgdHJ1ZSk7CisgICAgaW50ZXJuYWw6OnBhcmFsbGVsaXplX2dlbW08KERlc3Q6Ok1heFJvd3NBdENvbXBpbGVUaW1lPjMyIHx8IERlc3Q6Ok1heFJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKT4KKyAgICAgICAgKEdlbW1GdW5jdG9yKGxocywgcmhzLCBkc3QsIGFjdHVhbEFscGhhLCBibG9ja2luZyksIGFfbGhzLnJvd3MoKSwgYV9yaHMuY29scygpLCBhX2xocy5jb2xzKCksIERlc3Q6OkZsYWdzJlJvd01ham9yQml0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9NQVRSSVhfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhNYXRyaXhUcmlhbmd1bGFyLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDRlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhci5oCkBAIC0wLDAgKzEsMzExIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUkFMX01BVFJJWF9NQVRSSVhfVFJJQU5HVUxBUl9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZ2VuZXJhbCBBICogQiBwcm9kdWN0IHdoaWxlCisqIGV2YWx1YXRpbmcgb25seSBvbmUgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBwcm9kdWN0LgorKiBUaGlzIGlzIGEgbW9yZSBnZW5lcmFsIHZlcnNpb24gb2Ygc2VsZiBhZGpvaW50IHByb2R1Y3QgKEMgKz0gQSBBXlQpCisqIGFzIHRoZSBsZXZlbCAzIFNZUksgQmxhcyByb3V0aW5lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbnMgKGRlZmluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUpCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBtciwgaW50IG5yLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocywgaW50IFVwTG8+CitzdHJ1Y3QgdHJpYmJfa2VybmVsOworICAKKy8qIE9wdGltaXplZCBtYXRyaXgtbWF0cml4IHByb2R1Y3QgZXZhbHVhdGluZyBvbmx5IG9uZSB0cmlhbmd1bGFyIGhhbGYgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUmVzU3RvcmFnZU9yZGVyLCBpbnQgIFVwTG8sIGludCBWZXJzaW9uID0gU3BlY2lhbGl6ZWQ+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDsKKworLy8gYXMgdXN1YWwgaWYgdGhlIHJlc3VsdCBpcyByb3cgbWFqb3IgPT4gd2UgdHJhbnNwb3NlIHRoZSBwcm9kdWN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIExoc1NjYWxhciwgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCAgVXBMbywgaW50IFZlcnNpb24+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxSaHNTY2FsYXIsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxSb3dNYWpvcixVcExvLFZlcnNpb24+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsY29uc3QgTGhzU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmhzU2NhbGFyKiByaHMsIEluZGV4IHJoc1N0cmlkZSwgUmVzU2NhbGFyKiByZXMsIEluZGV4IHJlc1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFJoc1NjYWxhcixMaHNTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8SW5kZXgsCisgICAgICAgIFJoc1NjYWxhciwgUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsIENvbmp1Z2F0ZVJocywKKyAgICAgICAgTGhzU2NhbGFyLCBMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgQ29uanVnYXRlTGhzLAorICAgICAgICBDb2xNYWpvciwgVXBMbz09TG93ZXI/VXBwZXI6TG93ZXI+CisgICAgICA6OnJ1bihzaXplLGRlcHRoLHJocyxyaHNTdHJpZGUsbGhzLGxoc1N0cmlkZSxyZXMscmVzU3RyaWRlLGFscGhhLGJsb2NraW5nKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgIFVwTG8sIGludCBWZXJzaW9uPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3IsVXBMbyxWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHNpemUsIEluZGV4IGRlcHRoLGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgUmVzU2NhbGFyKiBfcmVzLCBJbmRleCByZXNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1NjYWxhciYgYWxwaGEsIGxldmVsM19ibG9ja2luZzxMaHNTY2FsYXIsUmhzU2NhbGFyPiYgYmxvY2tpbmcpCisgIHsKKyAgICB0eXBlZGVmIGdlYnBfdHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXI+IFRyYWl0czsKKworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxMaHNTY2FsYXIsIEluZGV4LCBMaHNTdG9yYWdlT3JkZXI+IExoc01hcHBlcjsKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8UmhzU2NhbGFyLCBJbmRleCwgUmhzU3RvcmFnZU9yZGVyPiBSaHNNYXBwZXI7CisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IFJlc01hcHBlcjsKKyAgICBMaHNNYXBwZXIgbGhzKF9saHMsbGhzU3RyaWRlKTsKKyAgICBSaHNNYXBwZXIgcmhzKF9yaHMscmhzU3RyaWRlKTsKKyAgICBSZXNNYXBwZXIgcmVzKF9yZXMsIHJlc1N0cmlkZSk7CisKKyAgICBJbmRleCBrYyA9IGJsb2NraW5nLmtjKCk7CisgICAgSW5kZXggbWMgPSAoc3RkOjptaW4pKHNpemUsYmxvY2tpbmcubWMoKSk7CisKKyAgICAvLyAhISEgbWMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIG5yOgorICAgIGlmKG1jID4gVHJhaXRzOjpucikKKyAgICAgIG1jID0gKG1jL1RyYWl0czo6bnIpKlRyYWl0czo6bnI7CisKKyAgICBzdGQ6OnNpemVfdCBzaXplQSA9IGtjKm1jOworICAgIHN0ZDo6c2l6ZV90IHNpemVCID0ga2Mqc2l6ZTsKKworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShMaHNTY2FsYXIsIGJsb2NrQSwgc2l6ZUEsIGJsb2NraW5nLmJsb2NrQSgpKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoUmhzU2NhbGFyLCBibG9ja0IsIHNpemVCLCBibG9ja2luZy5ibG9ja0IoKSk7CisKKyAgICBnZW1tX3BhY2tfbGhzPExoc1NjYWxhciwgSW5kZXgsIExoc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFJoc1NjYWxhciwgSW5kZXgsIFJoc01hcHBlciwgVHJhaXRzOjpuciwgUmhzU3RvcmFnZU9yZGVyPiBwYWNrX3JoczsKKyAgICBnZWJwX2tlcm5lbDxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIFJlc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnA7CisgICAgdHJpYmJfa2VybmVsPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHMsIFVwTG8+IHN5YmI7CisKKyAgICBmb3IoSW5kZXggazI9MDsgazI8ZGVwdGg7IGsyKz1rYykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfa2MgPSAoc3RkOjptaW4pKGsyK2tjLGRlcHRoKS1rMjsKKworICAgICAgLy8gbm90ZSB0aGF0IHRoZSBhY3R1YWwgcmhzIGlzIHRoZSB0cmFuc3Bvc2UvYWRqb2ludCBvZiBtYXQKKyAgICAgIHBhY2tfcmhzKGJsb2NrQiwgcmhzLmdldFN1Yk1hcHBlcihrMiwwKSwgYWN0dWFsX2tjLCBzaXplKTsKKworICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPHNpemU7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxzaXplKS1pMjsKKworICAgICAgICBwYWNrX2xocyhibG9ja0EsIGxocy5nZXRTdWJNYXBwZXIoaTIsIGsyKSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgIC8vIHRoZSBzZWxlY3RlZCBhY3R1YWxfbWMgKiBzaXplIHBhbmVsIG9mIHJlcyBpcyBzcGxpdCBpbnRvIHRocmVlIGRpZmZlcmVudCBwYXJ0OgorICAgICAgICAvLyAgMSAtIGJlZm9yZSB0aGUgZGlhZ29uYWwgPT4gcHJvY2Vzc2VkIHdpdGggZ2VicCBvciBza2lwcGVkCisgICAgICAgIC8vICAyIC0gdGhlIGFjdHVhbF9tYyB4IGFjdHVhbF9tYyBzeW1tZXRyaWMgYmxvY2sgPT4gcHJvY2Vzc2VkIHdpdGggYSBzcGVjaWFsIGtlcm5lbAorICAgICAgICAvLyAgMyAtIGFmdGVyIHRoZSBkaWFnb25hbCA9PiBwcm9jZXNzZWQgd2l0aCBnZWJwIG9yIHNraXBwZWQKKyAgICAgICAgaWYgKFVwTG89PUxvd2VyKQorICAgICAgICAgIGdlYnAocmVzLmdldFN1Yk1hcHBlcihpMiwgMCksIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywKKyAgICAgICAgICAgICAgIChzdGQ6Om1pbikoc2l6ZSxpMiksIGFscGhhLCAtMSwgLTEsIDAsIDApOworCisKKyAgICAgICAgc3liYihfcmVzK3Jlc1N0cmlkZSppMiArIGkyLCByZXNTdHJpZGUsIGJsb2NrQSwgYmxvY2tCICsgYWN0dWFsX2tjKmkyLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgYWxwaGEpOworCisgICAgICAgIGlmIChVcExvPT1VcHBlcikKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGoyID0gaTIrYWN0dWFsX21jOworICAgICAgICAgIGdlYnAocmVzLmdldFN1Yk1hcHBlcihpMiwgajIpLCBibG9ja0EsIGJsb2NrQithY3R1YWxfa2MqajIsIGFjdHVhbF9tYywKKyAgICAgICAgICAgICAgIGFjdHVhbF9rYywgKHN0ZDo6bWF4KShJbmRleCgwKSwgc2l6ZS1qMiksIGFscGhhLCAtMSwgLTEsIDAsIDApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9OworCisvLyBPcHRpbWl6ZWQgcGFja2VkIEJsb2NrICogcGFja2VkIEJsb2NrIHByb2R1Y3Qga2VybmVsIGV2YWx1YXRpbmcgb25seSBvbmUgZ2l2ZW4gdHJpYW5ndWxhciBwYXJ0CisvLyBUaGlzIGtlcm5lbCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIGdlYnAga2VybmVsOgorLy8gLSB0aGUgY3VycmVudCBkZXN0aW5hdGlvbiBibG9jayBpcyBwcm9jZXNzZWQgcGVyIHBhbmVsIG9mIGFjdHVhbF9tYyB4IEJsb2NrU2l6ZQorLy8gICB3aGVyZSBCbG9ja1NpemUgaXMgc2V0IHRvIHRoZSBtaW5pbWFsIHZhbHVlIGFsbG93aW5nIGdlYnAgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZQorLy8gLSB0aGVuLCBhcyB1c3VhbCwgZWFjaCBwYW5lbCBpcyBzcGxpdCBpbnRvIHRocmVlIHBhcnRzIGFsb25nIHRoZSBkaWFnb25hbCwKKy8vICAgdGhlIHN1YiBibG9ja3MgYWJvdmUgYW5kIGJlbG93IHRoZSBkaWFnb25hbCBhcmUgcHJvY2Vzc2VkIGFzIHVzdWFsLAorLy8gICB3aGlsZSB0aGUgdHJpYW5ndWxhciBibG9jayBvdmVybGFwcGluZyB0aGUgZGlhZ29uYWwgaXMgZXZhbHVhdGVkIGludG8gYQorLy8gICBzbWFsbCB0ZW1wb3JhcnkgYnVmZmVyIHdoaWNoIGlzIHRoZW4gYWNjdW11bGF0ZWQgaW50byB0aGUgcmVzdWx0IHVzaW5nIGEKKy8vICAgdHJpYW5ndWxhciB0cmF2ZXJzYWwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBtciwgaW50IG5yLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocywgaW50IFVwTG8+CitzdHJ1Y3QgdHJpYmJfa2VybmVsCit7CisgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qTGhzLENvbmpSaHM+IFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlJlc1NjYWxhciBSZXNTY2FsYXI7CisKKyAgZW51bSB7CisgICAgQmxvY2tTaXplICA9IG1ldGFfbGVhc3RfY29tbW9uX211bHRpcGxlPEVJR0VOX1BMQUlOX0VOVU1fTUFYKG1yLG5yKSxFSUdFTl9QTEFJTl9FTlVNX01JTihtcixucik+OjpyZXQKKyAgfTsKKyAgdm9pZCBvcGVyYXRvcigpKFJlc1NjYWxhciogX3JlcywgSW5kZXggcmVzU3RyaWRlLCBjb25zdCBMaHNTY2FsYXIqIGJsb2NrQSwgY29uc3QgUmhzU2NhbGFyKiBibG9ja0IsIEluZGV4IHNpemUsIEluZGV4IGRlcHRoLCBjb25zdCBSZXNTY2FsYXImIGFscGhhKQorICB7CisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPFJlc1NjYWxhciwgSW5kZXgsIENvbE1ham9yPiBSZXNNYXBwZXI7CisgICAgUmVzTWFwcGVyIHJlcyhfcmVzLCByZXNTdHJpZGUpOworICAgIGdlYnBfa2VybmVsPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgUmVzTWFwcGVyLCBtciwgbnIsIENvbmpMaHMsIENvbmpSaHM+IGdlYnBfa2VybmVsOworCisgICAgTWF0cml4PFJlc1NjYWxhcixCbG9ja1NpemUsQmxvY2tTaXplLENvbE1ham9yPiBidWZmZXIoKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSkpOworCisgICAgLy8gbGV0J3MgcHJvY2VzcyB0aGUgYmxvY2sgcGVyIHBhbmVsIG9mIGFjdHVhbF9tYyB4IEJsb2NrU2l6ZSwKKyAgICAvLyBhZ2FpbiwgZWFjaCBpcyBzcGxpdCBpbnRvIHRocmVlIHBhcnRzLCBldGMuCisgICAgZm9yIChJbmRleCBqPTA7IGo8c2l6ZTsgais9QmxvY2tTaXplKQorICAgIHsKKyAgICAgIEluZGV4IGFjdHVhbEJsb2NrU2l6ZSA9IHN0ZDo6bWluPEluZGV4PihCbG9ja1NpemUsc2l6ZSAtIGopOworICAgICAgY29uc3QgUmhzU2NhbGFyKiBhY3R1YWxfYiA9IGJsb2NrQitqKmRlcHRoOworCisgICAgICBpZihVcExvPT1VcHBlcikKKyAgICAgICAgZ2VicF9rZXJuZWwocmVzLmdldFN1Yk1hcHBlcigwLCBqKSwgYmxvY2tBLCBhY3R1YWxfYiwgaiwgZGVwdGgsIGFjdHVhbEJsb2NrU2l6ZSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgMCwgMCk7CisKKyAgICAgIC8vIHNlbGZhZGpvaW50IG1pY3JvIGJsb2NrCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBqOworICAgICAgICBidWZmZXIuc2V0WmVybygpOworICAgICAgICAvLyAxIC0gYXBwbHkgdGhlIGtlcm5lbCBvbiB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcgorICAgICAgICBnZWJwX2tlcm5lbChSZXNNYXBwZXIoYnVmZmVyLmRhdGEoKSwgQmxvY2tTaXplKSwgYmxvY2tBK2RlcHRoKmksIGFjdHVhbF9iLCBhY3R1YWxCbG9ja1NpemUsIGRlcHRoLCBhY3R1YWxCbG9ja1NpemUsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDApOworICAgICAgICAvLyAyIC0gdHJpYW5ndWxhciBhY2N1bXVsYXRpb24KKyAgICAgICAgZm9yKEluZGV4IGoxPTA7IGoxPGFjdHVhbEJsb2NrU2l6ZTsgKytqMSkKKyAgICAgICAgeworICAgICAgICAgIFJlc1NjYWxhciogciA9ICZyZXMoaSwgaiArIGoxKTsKKyAgICAgICAgICBmb3IoSW5kZXggaTE9VXBMbz09TG93ZXIgPyBqMSA6IDA7CisgICAgICAgICAgICAgIFVwTG89PUxvd2VyID8gaTE8YWN0dWFsQmxvY2tTaXplIDogaTE8PWoxOyArK2kxKQorICAgICAgICAgICAgcltpMV0gKz0gYnVmZmVyKGkxLGoxKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZihVcExvPT1Mb3dlcikKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IGorYWN0dWFsQmxvY2tTaXplOworICAgICAgICBnZWJwX2tlcm5lbChyZXMuZ2V0U3ViTWFwcGVyKGksIGopLCBibG9ja0ErZGVwdGgqaSwgYWN0dWFsX2IsIHNpemUtaSwgCisgICAgICAgICAgICAgICAgICAgIGRlcHRoLCBhY3R1YWxCbG9ja1NpemUsIGFscGhhLCAtMSwgLTEsIDAsIDApOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8vIGhpZ2ggbGV2ZWwgQVBJCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFByb2R1Y3RUeXBlLCBpbnQgVXBMbywgYm9vbCBJc091dGVyUHJvZHVjdD4KK3N0cnVjdCBnZW5lcmFsX3Byb2R1Y3RfdG9fdHJpYW5ndWxhcl9zZWxlY3RvcjsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBQcm9kdWN0VHlwZSwgaW50IFVwTG8+CitzdHJ1Y3QgZ2VuZXJhbF9wcm9kdWN0X3RvX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TWF0cml4VHlwZSxQcm9kdWN0VHlwZSxVcExvLHRydWU+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFByb2R1Y3RUeXBlJiBwcm9kLCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXImIGFscGhhLCBib29sIGJldGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBQcm9kdWN0VHlwZTo6TGhzTmVzdGVkPjo6dHlwZSBMaHM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxMaHM+Ojp0eXBlIF9BY3R1YWxMaHM7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbExocz46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLmxocygpKTsKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSaHNOZXN0ZWQ+Ojp0eXBlIFJoczsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxSaHM+IFJoc0JsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbFJoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJocz46OnR5cGUgX0FjdHVhbFJoczsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzPjo6dHlwZSBhY3R1YWxSaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KHByb2QucmhzKCkpOworCisgICAgU2NhbGFyIGFjdHVhbEFscGhhID0gYWxwaGEgKiBMaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKHByb2QubGhzKCkuZGVyaXZlZCgpKSAqIFJoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IocHJvZC5yaHMoKS5kZXJpdmVkKCkpOworCisgICAgaWYoIWJldGEpCisgICAgICBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBMbz4oKS5zZXRaZXJvKCk7CisKKyAgICBlbnVtIHsKKyAgICAgIFN0b3JhZ2VPcmRlciA9IChpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgVXNlTGhzRGlyZWN0bHkgPSBfQWN0dWFsTGhzOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWU9PTEsCisgICAgICBVc2VSaHNEaXJlY3RseSA9IF9BY3R1YWxSaHM6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MQorICAgIH07CisgICAgCisgICAgaW50ZXJuYWw6OmdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsTGhzOjpTaXplQXRDb21waWxlVGltZSxMaHM6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFVc2VMaHNEaXJlY3RseT4gc3RhdGljX2xoczsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBhY3R1YWxMaHNQdHIsIGFjdHVhbExocy5zaXplKCksCisgICAgICAoVXNlTGhzRGlyZWN0bHkgPyBjb25zdF9jYXN0PFNjYWxhcio+KGFjdHVhbExocy5kYXRhKCkpIDogc3RhdGljX2xocy5kYXRhKCkpKTsKKyAgICBpZighVXNlTGhzRGlyZWN0bHkpIE1hcDx0eXBlbmFtZSBfQWN0dWFsTGhzOjpQbGFpbk9iamVjdD4oYWN0dWFsTGhzUHRyLCBhY3R1YWxMaHMuc2l6ZSgpKSA9IGFjdHVhbExoczsKKyAgICAKKyAgICBpbnRlcm5hbDo6Z2Vtdl9zdGF0aWNfdmVjdG9yX2lmPFNjYWxhcixSaHM6OlNpemVBdENvbXBpbGVUaW1lLFJoczo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsIVVzZVJoc0RpcmVjdGx5PiBzdGF0aWNfcmhzOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGFjdHVhbFJoc1B0ciwgYWN0dWFsUmhzLnNpemUoKSwKKyAgICAgIChVc2VSaHNEaXJlY3RseSA/IGNvbnN0X2Nhc3Q8U2NhbGFyKj4oYWN0dWFsUmhzLmRhdGEoKSkgOiBzdGF0aWNfcmhzLmRhdGEoKSkpOworICAgIGlmKCFVc2VSaHNEaXJlY3RseSkgTWFwPHR5cGVuYW1lIF9BY3R1YWxSaHM6OlBsYWluT2JqZWN0PihhY3R1YWxSaHNQdHIsIGFjdHVhbFJocy5zaXplKCkpID0gYWN0dWFsUmhzOworICAgIAorICAgIAorICAgIHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUgJiYgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSAmJiBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4PgorICAgICAgICAgIDo6cnVuKGFjdHVhbExocy5zaXplKCksIG1hdC5kYXRhKCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxMaHNQdHIsIGFjdHVhbFJoc1B0ciwgYWN0dWFsQWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBQcm9kdWN0VHlwZSwgaW50IFVwTG8+CitzdHJ1Y3QgZ2VuZXJhbF9wcm9kdWN0X3RvX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TWF0cml4VHlwZSxQcm9kdWN0VHlwZSxVcExvLGZhbHNlPgoreworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbWF0LCBjb25zdCBQcm9kdWN0VHlwZSYgcHJvZCwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyJiBhbHBoYSwgYm9vbCBiZXRhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBQcm9kdWN0VHlwZTo6TGhzTmVzdGVkPjo6dHlwZSBMaHM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxMaHM+Ojp0eXBlIF9BY3R1YWxMaHM7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbExocz46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLmxocygpKTsKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSaHNOZXN0ZWQ+Ojp0eXBlIFJoczsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxSaHM+IFJoc0JsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbFJoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJocz46OnR5cGUgX0FjdHVhbFJoczsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzPjo6dHlwZSBhY3R1YWxSaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KHByb2QucmhzKCkpOworCisgICAgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpLmRlcml2ZWQoKSkgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKHByb2QucmhzKCkuZGVyaXZlZCgpKTsKKworICAgIGlmKCFiZXRhKQorICAgICAgbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwTG8+KCkuc2V0WmVybygpOworCisgICAgZW51bSB7CisgICAgICBJc1Jvd01ham9yID0gKGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzJlJvd01ham9yQml0KSA/IDEgOiAwLAorICAgICAgTGhzSXNSb3dNYWpvciA9IF9BY3R1YWxMaHM6OkZsYWdzJlJvd01ham9yQml0ID8gMSA6IDAsCisgICAgICBSaHNJc1Jvd01ham9yID0gX0FjdHVhbFJoczo6RmxhZ3MmUm93TWFqb3JCaXQgPyAxIDogMCwKKyAgICAgIFNraXBEaWFnID0gKFVwTG8mKFVuaXREaWFnfFplcm9EaWFnKSkhPTAKKyAgICB9OworCisgICAgSW5kZXggc2l6ZSA9IG1hdC5jb2xzKCk7CisgICAgaWYoU2tpcERpYWcpCisgICAgICBzaXplLS07CisgICAgSW5kZXggZGVwdGggPSBhY3R1YWxMaHMuY29scygpOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxJc1Jvd01ham9yID8gUm93TWFqb3IgOiBDb2xNYWpvcix0eXBlbmFtZSBMaHM6OlNjYWxhcix0eXBlbmFtZSBSaHM6OlNjYWxhciwKKyAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsIF9BY3R1YWxSaHM6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBCbG9ja2luZ1R5cGU7CisKKyAgICBCbG9ja2luZ1R5cGUgYmxvY2tpbmcoc2l6ZSwgc2l6ZSwgZGVwdGgsIDEsIGZhbHNlKTsKKworICAgIGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LAorICAgICAgdHlwZW5hbWUgTGhzOjpTY2FsYXIsIExoc0lzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLCBMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgICB0eXBlbmFtZSBSaHM6OlNjYWxhciwgUmhzSXNSb3dNYWpvciA/IFJvd01ham9yIDogQ29sTWFqb3IsIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgIElzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLCBVcExvJihMb3dlcnxVcHBlcik+CisgICAgICA6OnJ1bihzaXplLCBkZXB0aCwKKyAgICAgICAgICAgICZhY3R1YWxMaHMuY29lZmZSZWYoU2tpcERpYWcmJihVcExvJkxvd2VyKT09TG93ZXIgPyAxIDogMCwwKSwgYWN0dWFsTGhzLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICAmYWN0dWFsUmhzLmNvZWZmUmVmKDAsU2tpcERpYWcmJihVcExvJlVwcGVyKT09VXBwZXIgPyAxIDogMCksIGFjdHVhbFJocy5vdXRlclN0cmlkZSgpLAorICAgICAgICAgICAgbWF0LmRhdGEoKSArIChTa2lwRGlhZyA/IChib29sKElzUm93TWFqb3IpICE9ICgoVXBMbyZMb3dlcik9PUxvd2VyKSA/IDEgOiBtYXQub3V0ZXJTdHJpZGUoKSApIDogMCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxBbHBoYSwgYmxvY2tpbmcpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlPgorVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSxVcExvPiYgVHJpYW5ndWxhclZpZXdJbXBsPE1hdHJpeFR5cGUsVXBMbyxEZW5zZT46Ol9hc3NpZ25Qcm9kdWN0KGNvbnN0IFByb2R1Y3RUeXBlJiBwcm9kLCBjb25zdCBTY2FsYXImIGFscGhhLCBib29sIGJldGEpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFVwTG8mVW5pdERpYWcpPT0wLCBXUklUSU5HX1RPX1RSSUFOR1VMQVJfUEFSVF9XSVRIX1VOSVRfRElBR09OQUxfSVNfTk9UX1NVUFBPUlRFRCk7CisgIGVpZ2VuX2Fzc2VydChkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLnJvd3MoKSA9PSBwcm9kLnJvd3MoKSAmJiBkZXJpdmVkKCkuY29scygpID09IHByb2QuY29scygpKTsKKyAgCisgIGdlbmVyYWxfcHJvZHVjdF90b190cmlhbmd1bGFyX3NlbGVjdG9yPE1hdHJpeFR5cGUsIFByb2R1Y3RUeXBlLCBVcExvLCBpbnRlcm5hbDo6dHJhaXRzPFByb2R1Y3RUeXBlPjo6SW5uZXJTaXplPT0xPjo6cnVuKGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29uc3RfY2FzdF9kZXJpdmVkKCksIHByb2QsIGFscGhhLCBiZXRhKTsKKyAgCisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9NQVRSSVhfTUFUUklYX1RSSUFOR1VMQVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeFRyaWFuZ3VsYXJfQkxBUy5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeFRyaWFuZ3VsYXJfQkxBUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTE4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhcl9CTEFTLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBCTEFTIEY3NworICogICBMZXZlbCAzIEJMQVMgU1lSSy9IRVJLIGltcGxlbWVudGF0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX0JMQVNfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX01BVFJJWF9NQVRSSVhfVFJJQU5HVUxBUl9CTEFTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXIsIGludCBBU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUEsIGludCBSZXNTdG9yYWdlT3JkZXIsIGludCAgVXBMbz4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcmFua3VwZGF0ZSA6CisgICAgICAgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDwKKyAgICAgICAgIEluZGV4LFNjYWxhcixBU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUEsU2NhbGFyLEFTdG9yYWdlT3JkZXIsQ29uanVnYXRlQSxSZXNTdG9yYWdlT3JkZXIsVXBMbyxCdWlsdEluPiB7fTsKKworCisvLyB0cnkgdG8gZ28gdG8gQkxBUyBzcGVjaWFsaXphdGlvbgorI2RlZmluZSBFSUdFTl9CTEFTX1JBTktVUERBVEVfU1BFQ0lBTElaRShTY2FsYXIpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCAgVXBMbz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8SW5kZXgsU2NhbGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICAgICAgIFNjYWxhcixSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yLFVwTG8sU3BlY2lhbGl6ZWQ+IHsgXAorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBkZXB0aCxjb25zdCBTY2FsYXIqIGxocywgSW5kZXggbGhzU3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciogcmhzLCBJbmRleCByaHNTdHJpZGUsIFNjYWxhciogcmVzLCBJbmRleCByZXNTdHJpZGUsIFNjYWxhciBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhciwgU2NhbGFyPiYgYmxvY2tpbmcpIFwKKyAgeyBcCisgICAgaWYgKCBsaHM9PXJocyAmJiAoKFVwTG8mKExvd2VyfFVwcGVyKT09VXBMbykpICkgeyBcCisgICAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcmFua3VwZGF0ZTxJbmRleCxTY2FsYXIsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxDb2xNYWpvcixVcExvPiBcCisgICAgICA6OnJ1bihzaXplLGRlcHRoLGxocyxsaHNTdHJpZGUscmhzLHJoc1N0cmlkZSxyZXMscmVzU3RyaWRlLGFscGhhLGJsb2NraW5nKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgIGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8SW5kZXgsIFwKKyAgICAgICAgU2NhbGFyLCBMaHNTdG9yYWdlT3JkZXIsIENvbmp1Z2F0ZUxocywgXAorICAgICAgICBTY2FsYXIsIFJoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlUmhzLCBcCisgICAgICAgIENvbE1ham9yLCBVcExvLCBCdWlsdEluPiBcCisgICAgICA6OnJ1bihzaXplLGRlcHRoLGxocyxsaHNTdHJpZGUscmhzLHJoc1N0cmlkZSxyZXMscmVzU3RyaWRlLGFscGhhLGJsb2NraW5nKTsgXAorICAgIH0gXAorICB9IFwKK307CisKK0VJR0VOX0JMQVNfUkFOS1VQREFURV9TUEVDSUFMSVpFKGRvdWJsZSkKK0VJR0VOX0JMQVNfUkFOS1VQREFURV9TUEVDSUFMSVpFKGZsb2F0KQorLy8gVE9ETyBoYW5kbGUgY29tcGxleCBjYXNlcworLy8gRUlHRU5fQkxBU19SQU5LVVBEQVRFX1NQRUNJQUxJWkUoZGNvbXBsZXgpCisvLyBFSUdFTl9CTEFTX1JBTktVUERBVEVfU1BFQ0lBTElaRShzY29tcGxleCkKKworLy8gU1lSSyBmb3IgZmxvYXQvZG91YmxlCisjZGVmaW5lIEVJR0VOX0JMQVNfUkFOS1VQREFURV9SKEVJR1RZUEUsIEJMQVNUWVBFLCBCTEFTRlVOQykgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgQVN0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVBLCBpbnQgIFVwTG8+IFwKK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcmFua3VwZGF0ZTxJbmRleCxFSUdUWVBFLEFTdG9yYWdlT3JkZXIsQ29uanVnYXRlQSxDb2xNYWpvcixVcExvPiB7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKFVwTG8mTG93ZXIpID09IExvd2VyLCBcCisgICAgTG93VXAgPSBJc0xvd2VyID8gTG93ZXIgOiBVcHBlciwgXAorICAgIGNvbmpBID0gKChBU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlQSkgPyAxIDogMCBcCisgIH07IFwKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsY29uc3QgRUlHVFlQRSogbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUlHVFlQRSogLypyaHMqLywgSW5kZXggLypyaHNTdHJpZGUqLywgRUlHVFlQRSogcmVzLCBJbmRleCByZXNTdHJpZGUsIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLCBFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAvKiB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+IE1hdHJpeFJoczsqLyBcCitcCisgICBCbGFzSW5kZXggbGRhPWNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihsaHNTdHJpZGUpLCBsZGM9Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc1N0cmlkZSksIG49Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KHNpemUpLCBrPWNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihkZXB0aCk7IFwKKyAgIGNoYXIgdXBsbz0oKElzTG93ZXIpID8gJ0wnIDogJ1UnKSwgdHJhbnM9KChBU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyAnVCc6J04nKTsgXAorICAgRUlHVFlQRSBiZXRhKDEpOyBcCisgICBCTEFTRlVOQygmdXBsbywgJnRyYW5zLCAmbiwgJmssICZudW1leHQ6OnJlYWxfcmVmKGFscGhhKSwgbGhzLCAmbGRhLCAmbnVtZXh0OjpyZWFsX3JlZihiZXRhKSwgcmVzLCAmbGRjKTsgXAorICB9IFwKK307CisKKy8vIEhFUksgZm9yIGNvbXBsZXggZGF0YQorI2RlZmluZSBFSUdFTl9CTEFTX1JBTktVUERBVEVfQyhFSUdUWVBFLCBCTEFTVFlQRSwgUlRZUEUsIEJMQVNGVU5DKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIGludCBBU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUEsIGludCAgVXBMbz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9yYW5rdXBkYXRlPEluZGV4LEVJR1RZUEUsQVN0b3JhZ2VPcmRlcixDb25qdWdhdGVBLENvbE1ham9yLFVwTG8+IHsgXAorICBlbnVtIHsgXAorICAgIElzTG93ZXIgPSAoVXBMbyZMb3dlcikgPT0gTG93ZXIsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyLCBcCisgICAgY29uakEgPSAoKChBU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlQSkgfHwgKChBU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgJiYgIUNvbmp1Z2F0ZUEpKSA/IDEgOiAwIFwKKyAgfTsgXAorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBkZXB0aCxjb25zdCBFSUdUWVBFKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFSUdUWVBFKiAvKnJocyovLCBJbmRleCAvKnJoc1N0cmlkZSovLCBFSUdUWVBFKiByZXMsIEluZGV4IHJlc1N0cmlkZSwgRUlHVFlQRSBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPEVJR1RZUEUsIEVJR1RZUEU+JiAvKmJsb2NraW5nKi8pIFwKKyAgeyBcCisgICB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBBU3RvcmFnZU9yZGVyPiBNYXRyaXhUeXBlOyBcCitcCisgICBCbGFzSW5kZXggbGRhPWNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihsaHNTdHJpZGUpLCBsZGM9Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc1N0cmlkZSksIG49Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KHNpemUpLCBrPWNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihkZXB0aCk7IFwKKyAgIGNoYXIgdXBsbz0oKElzTG93ZXIpID8gJ0wnIDogJ1UnKSwgdHJhbnM9KChBU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyAnQyc6J04nKTsgXAorICAgUlRZUEUgYWxwaGFfLCBiZXRhXzsgXAorICAgY29uc3QgRUlHVFlQRSogYV9wdHI7IFwKK1wKKyAgIGFscGhhXyA9IGFscGhhLnJlYWwoKTsgXAorICAgYmV0YV8gPSAxLjA7IFwKKy8qIENvcHkgd2l0aCBjb25qdWdhdGlvbiBpbiBzb21lIGNhc2VzKi8gXAorICAgTWF0cml4VHlwZSBhOyBcCisgICBpZiAoY29uakEpIHsgXAorICAgICBNYXA8Y29uc3QgTWF0cml4VHlwZSwgMCwgT3V0ZXJTdHJpZGU8PiA+IG1hcEEobGhzLG4sayxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICAgIGEgPSBtYXBBLmNvbmp1Z2F0ZSgpOyBcCisgICAgIGxkYSA9IGEub3V0ZXJTdHJpZGUoKTsgXAorICAgICBhX3B0ciA9IGEuZGF0YSgpOyBcCisgICB9IGVsc2UgYV9wdHI9bGhzOyBcCisgICBCTEFTRlVOQygmdXBsbywgJnRyYW5zLCAmbiwgJmssICZhbHBoYV8sIChCTEFTVFlQRSopYV9wdHIsICZsZGEsICZiZXRhXywgKEJMQVNUWVBFKilyZXMsICZsZGMpOyBcCisgIH0gXAorfTsKKworCitFSUdFTl9CTEFTX1JBTktVUERBVEVfUihkb3VibGUsIGRvdWJsZSwgZHN5cmtfKQorRUlHRU5fQkxBU19SQU5LVVBEQVRFX1IoZmxvYXQsICBmbG9hdCwgIHNzeXJrXykKKworLy8gVE9ETyBoYW5sZGUgY29tcGxleCBjYXNlcworLy8gRUlHRU5fQkxBU19SQU5LVVBEQVRFX0MoZGNvbXBsZXgsIGRvdWJsZSwgZG91YmxlLCB6aGVya18pCisvLyBFSUdFTl9CTEFTX1JBTktVUERBVEVfQyhzY29tcGxleCwgZmxvYXQsICBmbG9hdCwgY2hlcmtfKQorCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX0JMQVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeF9CTEFTLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4X0JMQVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTNiZGJmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeF9CTEFTLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBCTEFTIEY3NworICogICBHZW5lcmFsIG1hdHJpeC1tYXRyaXggcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9HRU1NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9CTEFTX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJBTF9NQVRSSVhfTUFUUklYX0JMQVNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBmaWxlIGltcGxlbWVudHMgZ2VuZXJhbCBtYXRyaXgtbWF0cml4IG11bHRpcGxpY2F0aW9uIHVzaW5nIEJMQVMKKyogZ2VtbSBmdW5jdGlvbiB2aWEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZgorKiBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDo6cnVuKC4uKSBtZXRob2QgZm9yIGZsb2F0LCBkb3VibGUsCisqIHN0ZDo6Y29tcGxleDxmbG9hdD4gYW5kIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBnZW1tIHNwZWNpYWxpemF0aW9uCisKKyNkZWZpbmUgR0VNTV9TUEVDSUFMSVpBVElPTihFSUdUWVBFLCBFSUdQUkVGSVgsIEJMQVNUWVBFLCBCTEFTUFJFRklYKSBcCit0ZW1wbGF0ZTwgXAorICB0eXBlbmFtZSBJbmRleCwgXAorICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PEluZGV4LEVJR1RZUEUsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxFSUdUWVBFLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3I+IFwKK3sgXAordHlwZWRlZiBnZWJwX3RyYWl0czxFSUdUWVBFLEVJR1RZUEU+IFRyYWl0czsgXAorXAorc3RhdGljIHZvaWQgcnVuKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGRlcHRoLCBcCisgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFwKKyAgRUlHVFlQRSogcmVzLCBJbmRleCByZXNTdHJpZGUsIFwKKyAgRUlHVFlQRSBhbHBoYSwgXAorICBsZXZlbDNfYmxvY2tpbmc8RUlHVFlQRSwgRUlHVFlQRT4mIC8qYmxvY2tpbmcqLywgXAorICBHZW1tUGFyYWxsZWxJbmZvPEluZGV4PiogLyppbmZvID0gMCovKSBcCit7IFwKKyAgdXNpbmcgc3RkOjpjb25qOyBcCitcCisgIGNoYXIgdHJhbnNhLCB0cmFuc2I7IFwKKyAgQmxhc0luZGV4IG0sIG4sIGssIGxkYSwgbGRiLCBsZGM7IFwKKyAgY29uc3QgRUlHVFlQRSAqYSwgKmI7IFwKKyAgRUlHVFlQRSBiZXRhKDEpOyBcCisgIE1hdHJpeFgjI0VJR1BSRUZJWCBhX3RtcCwgYl90bXA7IFwKK1wKKy8qIFNldCB0cmFuc3Bvc2Ugb3B0aW9ucyAqLyBcCisgIHRyYW5zYSA9IChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlTGhzKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKKyAgdHJhbnNiID0gKFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpID8gKChDb25qdWdhdGVSaHMpID8gJ0MnIDogJ1QnKSA6ICdOJzsgXAorXAorLyogU2V0IG0sIG4sIGsgKi8gXAorICBtID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJvd3MpOyAgXAorICBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGNvbHMpOyAgXAorICBrID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGRlcHRoKTsgXAorXAorLyogU2V0IGxkYSwgbGRiLCBsZGMgKi8gXAorICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4obGhzU3RyaWRlKTsgXAorICBsZGIgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmhzU3RyaWRlKTsgXAorICBsZGMgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmVzU3RyaWRlKTsgXAorXAorLyogU2V0IGEsIGIsIGMgKi8gXAorICBpZiAoKExoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIChDb25qdWdhdGVMaHMpKSB7IFwKKyAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbSxrLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICBhX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgXAorICAgIGEgPSBhX3RtcC5kYXRhKCk7IFwKKyAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oYV90bXAub3V0ZXJTdHJpZGUoKSk7IFwKKyAgfSBlbHNlIGEgPSBfbGhzOyBcCitcCisgIGlmICgoUmhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgKENvbmp1Z2F0ZVJocykpIHsgXAorICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxrLG4sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgIGJfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBcCisgICAgYiA9IGJfdG1wLmRhdGEoKTsgXAorICAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihiX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICB9IGVsc2UgYiA9IF9yaHM7IFwKK1wKKyAgQkxBU1BSRUZJWCMjZ2VtbV8oJnRyYW5zYSwgJnRyYW5zYiwgJm0sICZuLCAmaywgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChjb25zdCBCTEFTVFlQRSopYiwgJmxkYiwgJm51bWV4dDo6cmVhbF9yZWYoYmV0YSksIChCTEFTVFlQRSopcmVzLCAmbGRjKTsgXAorfX07CisKK0dFTU1fU1BFQ0lBTElaQVRJT04oZG91YmxlLCAgIGQsICBkb3VibGUsIGQpCitHRU1NX1NQRUNJQUxJWkFUSU9OKGZsb2F0LCAgICBmLCAgZmxvYXQsICBzKQorR0VNTV9TUEVDSUFMSVpBVElPTihkY29tcGxleCwgY2QsIGRvdWJsZSwgeikKK0dFTU1fU1BFQ0lBTElaQVRJT04oc2NvbXBsZXgsIGNmLCBmbG9hdCwgIGMpCisKK30gLy8gZW5kIG5hbWVzcGFzZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9CTEFTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhWZWN0b3IuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzFhN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvci5oCkBAIC0wLDAgKzEsNjE5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUkFMX01BVFJJWF9WRUNUT1JfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX01BVFJJWF9WRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgY29sLW1ham9yIG1hdHJpeCAqIHZlY3RvciBwcm9kdWN0OgorICogVGhpcyBhbGdvcml0aG0gcHJvY2Vzc2VzIDQgY29sdW1ucyBhdCBvbmNlcyB0aGF0IGFsbG93cyB0byBib3RoIHJlZHVjZQorICogdGhlIG51bWJlciBvZiBsb2FkL3N0b3JlcyBvZiB0aGUgcmVzdWx0IGJ5IGEgZmFjdG9yIDQgYW5kIHRvIHJlZHVjZQorICogdGhlIGluc3RydWN0aW9uIGRlcGVuZGVuY3kuIE1vcmVvdmVyLCB3ZSBrbm93IHRoYXQgYWxsIGJhbmRzIGhhdmUgdGhlCisgKiBzYW1lIGFsaWdubWVudCBwYXR0ZXJuLgorICoKKyAqIE1peGluZyB0eXBlIGxvZ2ljOiBDICs9IGFscGhhICogQSAqIEIKKyAqICB8ICBBICB8ICBCICB8YWxwaGF8IGNvbW1lbnRzCisgKiAgfHJlYWwgfGNwbHggfGNwbHggfCBubyB2ZWN0b3JpemF0aW9uCisgKiAgfHJlYWwgfGNwbHggfHJlYWwgfCBhbHBoYSBpcyBjb252ZXJ0ZWQgdG8gYSBjcGx4IHdoZW4gY2FsbGluZyB0aGUgcnVuIGZ1bmN0aW9uLCBubyB2ZWN0b3JpemF0aW9uCisgKiAgfGNwbHggfHJlYWwgfGNwbHggfCBpbnZhbGlkLCB0aGUgY2FsbGVyIGhhcyB0byBkbyB0bXA6ID0gQSAqIEI7IEMgKz0gYWxwaGEqdG1wCisgKiAgfGNwbHggfHJlYWwgfHJlYWwgfCBvcHRpbWFsIGNhc2UsIHZlY3Rvcml6YXRpb24gcG9zc2libGUgdmlhIHJlYWwtY3BseCBtdWwKKyAqCisgKiBBY2Nlc3NlcyB0byB0aGUgbWF0cml4IGNvZWZmaWNpZW50cyBmb2xsb3cgdGhlIGZvbGxvd2luZyBsb2dpYzoKKyAqCisgKiAtIGlmIGFsbCBjb2x1bW5zIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IHRoZW4KKyAqICAgLSBpZiB0aGUgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCBhcyB0aGUgcmVzdWx0IHZlY3RvciwgdGhlbiBlYXN5ISAoLT4gQWxsQWxpZ25lZCBjYXNlKQorICogICAtIG90aGVyd2lzZSBwZXJmb3JtIHVuYWxpZ25lZCBsb2FkcyBvbmx5ICgtPiBOb25lQWxpZ25lZCBjYXNlKQorICogLSBvdGhlcndpc2UKKyAqICAgLSBpZiBldmVuIGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQgdGhlbgorICogICAgIC8vIG9kZCBjb2x1bW5zIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IHRvbworICogICAgIC0gaWYgZXZlbiBvciBvZGQgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCBhcyB0aGUgcmVzdWx0LCB0aGVuCisgKiAgICAgICAvLyBmb3IgYSByZWdpc3RlciBzaXplIG9mIDIgc2NhbGFycywgdGhpcyBpcyBndWFyYW50ZWUgdG8gYmUgdGhlIGNhc2UgKGUuZy4sIFNTRSB3aXRoIGRvdWJsZSkKKyAqICAgICAgIC0gcGVyZm9ybSBoYWxmIGFsaWduZWQgYW5kIGhhbGYgdW5hbGlnbmVkIGxvYWRzICgtPiBFdmVuQWxpZ25lZCBjYXNlKQorICogICAgIC0gb3RoZXJ3aXNlIHBlcmZvcm0gdW5hbGlnbmVkIGxvYWRzIG9ubHkgKC0+IE5vbmVBbGlnbmVkIGNhc2UpCisgKiAgIC0gb3RoZXJ3aXNlLCBpZiB0aGUgcmVnaXN0ZXIgc2l6ZSBpcyA0IHNjYWxhcnMgKGUuZy4sIFNTRSB3aXRoIGZsb2F0KSB0aGVuCisgKiAgICAgLSBvbmUgb3ZlciA0IGNvbnNlY3V0aXZlIGNvbHVtbnMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggdGhlIHJlc3VsdCB2ZWN0b3IsCisgKiAgICAgICBwZXJmb3JtIHNpbXBsZSBhbGlnbmVkIGxvYWRzIGZvciB0aGlzIGNvbHVtbiBhbmQgYWxpZ25lZCBsb2FkcyBwbHVzIHJlLWFsaWdubWVudCBmb3IgdGhlIG90aGVyLiAoLT4gRmlyc3RBbGlnbmVkIGNhc2UpCisgKiAgICAgICAvLyB0aGlzIHJlLWFsaWdubWVudCBpcyBkb25lIGJ5IHRoZSBwYWxpZ24gZnVuY3Rpb24gaW1wbGVtZW50ZWQgZm9yIFNTRSBpbiBFaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgKKyAqICAgLSBvdGhlcndpc2UsCisgKiAgICAgLy8gaWYgd2UgZ2V0IGhlcmUsIHRoaXMgbWVhbnMgdGhlIHJlZ2lzdGVyIHNpemUgaXMgZ3JlYXRlciB0aGFuIDQgKGUuZy4sIEFWWCB3aXRoIGZsb2F0cyksCisgKiAgICAgLy8gd2UgY3VycmVudGx5IGZhbGwgYmFjayB0byB0aGUgTm9uZUFsaWduZWQgY2FzZQorICoKKyAqIFRoZSBzYW1lIHJlYXNvbmluZyBhcHBseSBmb3IgdGhlIHRyYW5zcG9zZWQgY2FzZS4KKyAqCisgKiBUaGUgbGFzdCBjYXNlIChQYWNrZXRTaXplPjQpIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkIGJ5IGdlbmVyYWxpemluZyB0aGUgRmlyc3RBbGlnbmVkIGNhc2UsIGJ1dCBzaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBBVlggeWV0Li4uCisgKiBPbmUgbWlnaHQgYWxzbyB3b25kZXIgd2h5IGluIHRoZSBFdmVuQWxpZ25lZCBjYXNlIHdlIHBlcmZvcm0gdW5hbGlnbmVkIGxvYWRzIGluc3RlYWQgb2YgdXNpbmcgdGhlIGFsaWduZWQtbG9hZHMgcGx1cyByZS1hbGlnbm1lbnQKKyAqIHN0cmF0ZWd5IGFzIGluIHRoZSBGaXJzdEFsaWduZWQgY2FzZS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIG9ic2VydmVkIHRoYXQgdW5hbGlnbmVkIGxvYWRzIG9uIGEgOCBieXRlIGJvdW5kYXJ5IGFyZSBub3QgdG9vIHNsb3cKKyAqIGNvbXBhcmVkIHRvIHVuYWxpZ25lZCBsb2FkcyBvbiBhIDQgYnl0ZSBib3VuZGFyeS4KKyAqCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIExoc01hcHBlciwgYm9vbCBDb25qdWdhdGVMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgUmhzTWFwcGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixDb2xNYWpvcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc01hcHBlcixDb25qdWdhdGVSaHMsVmVyc2lvbj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OlJldHVyblR5cGUgUmVzU2NhbGFyOworCitlbnVtIHsKKyAgVmVjdG9yaXphYmxlID0gcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpWZWN0b3JpemFibGUgJiYgcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpWZWN0b3JpemFibGUKKyAgICAgICAgICAgICAgJiYgaW50KHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSk9PWludChwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnNpemUpLAorICBMaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgUmhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgIFJlc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnNpemUgOiAxCit9OworCit0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6dHlwZSAgX0xoc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+Ojp0eXBlICBfUmhzUGFja2V0OwordHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnR5cGUgIF9SZXNQYWNrZXQ7CisKK3R5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9MaHNQYWNrZXQsTGhzU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7Cit0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfUmhzUGFja2V0LFJoc1NjYWxhcj46OnR5cGUgUmhzUGFja2V0OwordHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Jlc1BhY2tldCxSZXNTY2FsYXI+Ojp0eXBlIFJlc1BhY2tldDsKKworRUlHRU5fRE9OVF9JTkxJTkUgc3RhdGljIHZvaWQgcnVuKAorICBJbmRleCByb3dzLCBJbmRleCBjb2xzLAorICBjb25zdCBMaHNNYXBwZXImIGxocywKKyAgY29uc3QgUmhzTWFwcGVyJiByaHMsCisgICAgICAgIFJlc1NjYWxhciogcmVzLCBJbmRleCByZXNJbmNyLAorICBSaHNTY2FsYXIgYWxwaGEpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgTGhzTWFwcGVyLCBib29sIENvbmp1Z2F0ZUxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBSaHNNYXBwZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixDb2xNYWpvcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc01hcHBlcixDb25qdWdhdGVSaHMsVmVyc2lvbj46OnJ1bigKKyAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgY29uc3QgTGhzTWFwcGVyJiBsaHMsCisgIGNvbnN0IFJoc01hcHBlciYgcmhzLAorICAgICAgICBSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzSW5jciwKKyAgUmhzU2NhbGFyIGFscGhhKQoreworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocmVzSW5jcik7CisgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyZXNJbmNyPT0xKTsKKyAgI2lmZGVmIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMKKyAgI2Vycm9yIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCisgICNlbmRpZgorICAjZGVmaW5lIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoQWxpZ25tZW50MCxBbGlnbm1lbnQxMyxBbGlnbm1lbnQyKSBcCisgICAgcHN0b3JlKCZyZXNbal0sIFwKKyAgICAgIHBhZGQocGxvYWQ8UmVzUGFja2V0PigmcmVzW2pdKSwgXAorICAgICAgICBwYWRkKCBcCisgICAgICBwYWRkKHBjai5wbXVsKGxoczAudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWdubWVudDA+KGopLCAgICBwdG1wMCksIFwKKyAgICAgIHBjai5wbXVsKGxoczEudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWdubWVudDEzPihqKSwgICBwdG1wMSkpLCAgIFwKKyAgICAgIHBhZGQocGNqLnBtdWwobGhzMi50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25tZW50Mj4oaiksICAgIHB0bXAyKSwgXAorICAgICAgcGNqLnBtdWwobGhzMy50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25tZW50MTM+KGopLCAgIHB0bXAzKSkgKSkpCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNNYXBwZXI6OlZlY3Rvck1hcHBlciBMaHNTY2FsYXJzOworCisgIGNvbmpfaGVscGVyPExoc1NjYWxhcixSaHNTY2FsYXIsQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocz4gY2o7CisgIGNvbmpfaGVscGVyPExoc1BhY2tldCxSaHNQYWNrZXQsQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocz4gcGNqOworICBpZihDb25qdWdhdGVSaHMpCisgICAgYWxwaGEgPSBudW1leHQ6OmNvbmooYWxwaGEpOworCisgIGVudW0geyBBbGxBbGlnbmVkID0gMCwgRXZlbkFsaWduZWQsIEZpcnN0QWxpZ25lZCwgTm9uZUFsaWduZWQgfTsKKyAgY29uc3QgSW5kZXggY29sdW1uc0F0T25jZSA9IDQ7CisgIGNvbnN0IEluZGV4IHBlZWxzID0gMjsKKyAgY29uc3QgSW5kZXggTGhzUGFja2V0QWxpZ25lZE1hc2sgPSBMaHNQYWNrZXRTaXplLTE7CisgIGNvbnN0IEluZGV4IFJlc1BhY2tldEFsaWduZWRNYXNrID0gUmVzUGFja2V0U2l6ZS0xOworLy8gIGNvbnN0IEluZGV4IFBlZWxBbGlnbmVkTWFzayA9IFJlc1BhY2tldFNpemUqcGVlbHMtMTsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IHJvd3M7CisKKyAgY29uc3QgSW5kZXggbGhzU3RyaWRlID0gbGhzLnN0cmlkZSgpOworCisgIC8vIEhvdyBtYW55IGNvZWZmcyBvZiB0aGUgcmVzdWx0IGRvIHdlIGhhdmUgdG8gc2tpcCB0byBiZSBhbGlnbmVkLgorICAvLyBIZXJlIHdlIGFzc3VtZSBkYXRhIGFyZSBhdCBsZWFzdCBhbGlnbmVkIG9uIHRoZSBiYXNlIHNjYWxhciB0eXBlLgorICBJbmRleCBhbGlnbmVkU3RhcnQgPSBpbnRlcm5hbDo6Zmlyc3RfZGVmYXVsdF9hbGlnbmVkKHJlcyxzaXplKTsKKyAgSW5kZXggYWxpZ25lZFNpemUgPSBSZXNQYWNrZXRTaXplPjEgPyBhbGlnbmVkU3RhcnQgKyAoKHNpemUtYWxpZ25lZFN0YXJ0KSAmIH5SZXNQYWNrZXRBbGlnbmVkTWFzaykgOiAwOworICBjb25zdCBJbmRleCBwZWVsZWRTaXplID0gYWxpZ25lZFNpemUgLSBSaHNQYWNrZXRTaXplKnBlZWxzIC0gUmhzUGFja2V0U2l6ZSArIDE7CisKKyAgY29uc3QgSW5kZXggYWxpZ25tZW50U3RlcCA9IExoc1BhY2tldFNpemU+MSA/IChMaHNQYWNrZXRTaXplIC0gbGhzU3RyaWRlICUgTGhzUGFja2V0U2l6ZSkgJiBMaHNQYWNrZXRBbGlnbmVkTWFzayA6IDA7CisgIEluZGV4IGFsaWdubWVudFBhdHRlcm4gPSBhbGlnbm1lbnRTdGVwPT0wID8gQWxsQWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICA6IGFsaWdubWVudFN0ZXA9PShMaHNQYWNrZXRTaXplLzIpID8gRXZlbkFsaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgOiBGaXJzdEFsaWduZWQ7CisKKyAgLy8gd2UgY2Fubm90IGFzc3VtZSB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbGlnbmVkIGJlY2F1c2Ugb2Ygc3ViLW1hdHJpY2VzCisgIGNvbnN0IEluZGV4IGxoc0FsaWdubWVudE9mZnNldCA9IGxocy5maXJzdEFsaWduZWQoc2l6ZSk7CisKKyAgLy8gZmluZCBob3cgbWFueSBjb2x1bW5zIGRvIHdlIGhhdmUgdG8gc2tpcCB0byBiZSBhbGlnbmVkIHdpdGggdGhlIHJlc3VsdCAoaWYgcG9zc2libGUpCisgIEluZGV4IHNraXBDb2x1bW5zID0gMDsKKyAgLy8gaWYgdGhlIGRhdGEgY2Fubm90IGJlIGFsaWduZWQgKFRPRE8gYWRkIHNvbWUgY29tcGlsZSB0aW1lIHRlc3RzIHdoZW4gcG9zc2libGUsIGUuZy4gZm9yIGZsb2F0cykKKyAgaWYoIChsaHNBbGlnbm1lbnRPZmZzZXQgPCAwKSB8fCAobGhzQWxpZ25tZW50T2Zmc2V0ID09IHNpemUpIHx8IChVSW50UHRyKHJlcyklc2l6ZW9mKFJlc1NjYWxhcikpICkKKyAgeworICAgIGFsaWduZWRTaXplID0gMDsKKyAgICBhbGlnbmVkU3RhcnQgPSAwOworICAgIGFsaWdubWVudFBhdHRlcm4gPSBOb25lQWxpZ25lZDsKKyAgfQorICBlbHNlIGlmKExoc1BhY2tldFNpemUgPiA0KQorICB7CisgICAgLy8gVE9ETzogZXh0ZW5kIHRoZSBjb2RlIHRvIHN1cHBvcnQgYWxpZ25lZCBsb2FkcyB3aGVuZXZlciBwb3NzaWJsZSB3aGVuIExoc1BhY2tldFNpemUgPiA0LgorICAgIC8vIEN1cnJlbnRseSwgaXQgc2VlbXMgdG8gYmUgYmV0dGVyIHRvIHBlcmZvcm0gdW5hbGlnbmVkIGxvYWRzIGFueXdheQorICAgIGFsaWdubWVudFBhdHRlcm4gPSBOb25lQWxpZ25lZDsKKyAgfQorICBlbHNlIGlmIChMaHNQYWNrZXRTaXplPjEpCisgIHsKKyAgLy8gICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemVfdChmaXJzdExocytsaHNBbGlnbm1lbnRPZmZzZXQpJXNpemVvZihMaHNQYWNrZXQpPT0wIHx8IHNpemU8TGhzUGFja2V0U2l6ZSk7CisKKyAgICB3aGlsZSAoc2tpcENvbHVtbnM8TGhzUGFja2V0U2l6ZSAmJgorICAgICAgICAgIGFsaWduZWRTdGFydCAhPSAoKGxoc0FsaWdubWVudE9mZnNldCArIGFsaWdubWVudFN0ZXAqc2tpcENvbHVtbnMpJUxoc1BhY2tldFNpemUpKQorICAgICAgKytza2lwQ29sdW1uczsKKyAgICBpZiAoc2tpcENvbHVtbnM9PUxoc1BhY2tldFNpemUpCisgICAgeworICAgICAgLy8gbm90aGluZyBjYW4gYmUgYWxpZ25lZCwgbm8gbmVlZCB0byBza2lwIGFueSBjb2x1bW4KKyAgICAgIGFsaWdubWVudFBhdHRlcm4gPSBOb25lQWxpZ25lZDsKKyAgICAgIHNraXBDb2x1bW5zID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNraXBDb2x1bW5zID0gKHN0ZDo6bWluKShza2lwQ29sdW1ucyxjb2xzKTsKKyAgICAgIC8vIG5vdGUgdGhhdCB0aGUgc2tpcGVkIGNvbHVtbnMgYXJlIHByb2Nlc3NlZCBsYXRlci4KKyAgICB9CisKKyAgICAvKiAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoICAoYWxpZ25tZW50UGF0dGVybj09Tm9uZUFsaWduZWQpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHNraXBDb2x1bW5zICsgY29sdW1uc0F0T25jZSA+PSBjb2xzKQorICAgICAgICAgICAgICAgICAgICAgIHx8IExoc1BhY2tldFNpemUgPiBzaXplCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHNpemVfdChmaXJzdExocythbGlnbmVkU3RhcnQrbGhzU3RyaWRlKnNraXBDb2x1bW5zKSVzaXplb2YoTGhzUGFja2V0KSk9PTApOyovCisgIH0KKyAgZWxzZSBpZihWZWN0b3JpemFibGUpCisgIHsKKyAgICBhbGlnbmVkU3RhcnQgPSAwOworICAgIGFsaWduZWRTaXplID0gc2l6ZTsKKyAgICBhbGlnbm1lbnRQYXR0ZXJuID0gQWxsQWxpZ25lZDsKKyAgfQorCisgIGNvbnN0IEluZGV4IG9mZnNldDEgPSAoRmlyc3RBbGlnbmVkICYmIGFsaWdubWVudFN0ZXA9PTEpPzM6MTsKKyAgY29uc3QgSW5kZXggb2Zmc2V0MyA9IChGaXJzdEFsaWduZWQgJiYgYWxpZ25tZW50U3RlcD09MSk/MTozOworCisgIEluZGV4IGNvbHVtbkJvdW5kID0gKChjb2xzLXNraXBDb2x1bW5zKS9jb2x1bW5zQXRPbmNlKSpjb2x1bW5zQXRPbmNlICsgc2tpcENvbHVtbnM7CisgIGZvciAoSW5kZXggaT1za2lwQ29sdW1uczsgaTxjb2x1bW5Cb3VuZDsgaSs9Y29sdW1uc0F0T25jZSkKKyAgeworICAgIFJoc1BhY2tldCBwdG1wMCA9IHBzZXQxPFJoc1BhY2tldD4oYWxwaGEqcmhzKGksIDApKSwKKyAgICAgICAgICAgICAgcHRtcDEgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJocyhpK29mZnNldDEsIDApKSwKKyAgICAgICAgICAgICAgcHRtcDIgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJocyhpKzIsIDApKSwKKyAgICAgICAgICAgICAgcHRtcDMgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJocyhpK29mZnNldDMsIDApKTsKKworICAgIC8vIHRoaXMgaGVscHMgYSBsb3QgZ2VuZXJhdGluZyBiZXR0ZXIgYmluYXJ5IGNvZGUKKyAgICBjb25zdCBMaHNTY2FsYXJzIGxoczAgPSBsaHMuZ2V0VmVjdG9yTWFwcGVyKDAsIGkrMCksICAgbGhzMSA9IGxocy5nZXRWZWN0b3JNYXBwZXIoMCwgaStvZmZzZXQxKSwKKyAgICAgICAgICAgICAgICAgICAgIGxoczIgPSBsaHMuZ2V0VmVjdG9yTWFwcGVyKDAsIGkrMiksICAgbGhzMyA9IGxocy5nZXRWZWN0b3JNYXBwZXIoMCwgaStvZmZzZXQzKTsKKworICAgIGlmIChWZWN0b3JpemFibGUpCisgICAgeworICAgICAgLyogZXhwbGljaXQgdmVjdG9yaXphdGlvbiAqLworICAgICAgLy8gcHJvY2VzcyBpbml0aWFsIHVuYWxpZ25lZCBjb2VmZnMKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPGFsaWduZWRTdGFydDsgKytqKQorICAgICAgeworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMwKGopLCBwZmlyc3QocHRtcDApLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMxKGopLCBwZmlyc3QocHRtcDEpLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMyKGopLCBwZmlyc3QocHRtcDIpLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMzKGopLCBwZmlyc3QocHRtcDMpLCByZXNbal0pOworICAgICAgfQorCisgICAgICBpZiAoYWxpZ25lZFNpemU+YWxpZ25lZFN0YXJ0KQorICAgICAgeworICAgICAgICBzd2l0Y2goYWxpZ25tZW50UGF0dGVybikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgQWxsQWxpZ25lZDoKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxhbGlnbmVkU2l6ZTsgais9UmVzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhBbGlnbmVkLEFsaWduZWQsQWxpZ25lZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEV2ZW5BbGlnbmVkOgorICAgICAgICAgICAgZm9yIChJbmRleCBqID0gYWxpZ25lZFN0YXJ0OyBqPGFsaWduZWRTaXplOyBqKz1SZXNQYWNrZXRTaXplKQorICAgICAgICAgICAgICBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKEFsaWduZWQsVW5hbGlnbmVkLEFsaWduZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBGaXJzdEFsaWduZWQ6CisgICAgICAgICAgeworICAgICAgICAgICAgSW5kZXggaiA9IGFsaWduZWRTdGFydDsKKyAgICAgICAgICAgIGlmKHBlZWxzPjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIExoc1BhY2tldCBBMDAsIEEwMSwgQTAyLCBBMDMsIEExMCwgQTExLCBBMTIsIEExMzsKKyAgICAgICAgICAgICAgUmVzUGFja2V0IFQwLCBUMTsKKworICAgICAgICAgICAgICBBMDEgPSBsaHMxLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihhbGlnbmVkU3RhcnQtMSk7CisgICAgICAgICAgICAgIEEwMiA9IGxoczIudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGFsaWduZWRTdGFydC0yKTsKKyAgICAgICAgICAgICAgQTAzID0gbGhzMy50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oYWxpZ25lZFN0YXJ0LTMpOworCisgICAgICAgICAgICAgIGZvciAoOyBqPHBlZWxlZFNpemU7IGorPXBlZWxzKlJlc1BhY2tldFNpemUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBMTEgPSBsaHMxLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihqLTErTGhzUGFja2V0U2l6ZSk7ICBwYWxpZ248MT4oQTAxLEExMSk7CisgICAgICAgICAgICAgICAgQTEyID0gbGhzMi50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oai0yK0xoc1BhY2tldFNpemUpOyAgcGFsaWduPDI+KEEwMixBMTIpOworICAgICAgICAgICAgICAgIEExMyA9IGxoczMudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGotMytMaHNQYWNrZXRTaXplKTsgIHBhbGlnbjwzPihBMDMsQTEzKTsKKworICAgICAgICAgICAgICAgIEEwMCA9IGxoczAudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGopOworICAgICAgICAgICAgICAgIEExMCA9IGxoczAudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGorTGhzUGFja2V0U2l6ZSk7CisgICAgICAgICAgICAgICAgVDAgID0gcGNqLnBtYWRkKEEwMCwgcHRtcDAsIHBsb2FkPFJlc1BhY2tldD4oJnJlc1tqXSkpOworICAgICAgICAgICAgICAgIFQxICA9IHBjai5wbWFkZChBMTAsIHB0bXAwLCBwbG9hZDxSZXNQYWNrZXQ+KCZyZXNbaitSZXNQYWNrZXRTaXplXSkpOworCisgICAgICAgICAgICAgICAgVDAgID0gcGNqLnBtYWRkKEEwMSwgcHRtcDEsIFQwKTsKKyAgICAgICAgICAgICAgICBBMDEgPSBsaHMxLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihqLTErMipMaHNQYWNrZXRTaXplKTsgIHBhbGlnbjwxPihBMTEsQTAxKTsKKyAgICAgICAgICAgICAgICBUMCAgPSBwY2oucG1hZGQoQTAyLCBwdG1wMiwgVDApOworICAgICAgICAgICAgICAgIEEwMiA9IGxoczIudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGotMisyKkxoc1BhY2tldFNpemUpOyAgcGFsaWduPDI+KEExMixBMDIpOworICAgICAgICAgICAgICAgIFQwICA9IHBjai5wbWFkZChBMDMsIHB0bXAzLCBUMCk7CisgICAgICAgICAgICAgICAgcHN0b3JlKCZyZXNbal0sVDApOworICAgICAgICAgICAgICAgIEEwMyA9IGxoczMudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGotMysyKkxoc1BhY2tldFNpemUpOyAgcGFsaWduPDM+KEExMyxBMDMpOworICAgICAgICAgICAgICAgIFQxICA9IHBjai5wbWFkZChBMTEsIHB0bXAxLCBUMSk7CisgICAgICAgICAgICAgICAgVDEgID0gcGNqLnBtYWRkKEExMiwgcHRtcDIsIFQxKTsKKyAgICAgICAgICAgICAgICBUMSAgPSBwY2oucG1hZGQoQTEzLCBwdG1wMywgVDEpOworICAgICAgICAgICAgICAgIHBzdG9yZSgmcmVzW2orUmVzUGFja2V0U2l6ZV0sVDEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDsgajxhbGlnbmVkU2l6ZTsgais9UmVzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhBbGlnbmVkLFVuYWxpZ25lZCxVbmFsaWduZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7IGo8YWxpZ25lZFNpemU7IGorPVJlc1BhY2tldFNpemUpCisgICAgICAgICAgICAgIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoVW5hbGlnbmVkLFVuYWxpZ25lZCxVbmFsaWduZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8vIGVuZCBleHBsaWNpdCB2ZWN0b3JpemF0aW9uCisKKyAgICAvKiBwcm9jZXNzIHJlbWFpbmluZyBjb2VmZnMgKG9yIGFsbCBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCB2ZWN0b3JpemF0aW9uKSAqLworICAgIGZvciAoSW5kZXggaj1hbGlnbmVkU2l6ZTsgajxzaXplOyArK2opCisgICAgeworICAgICAgcmVzW2pdID0gY2oucG1hZGQobGhzMChqKSwgcGZpcnN0KHB0bXAwKSwgcmVzW2pdKTsKKyAgICAgIHJlc1tqXSA9IGNqLnBtYWRkKGxoczEoaiksIHBmaXJzdChwdG1wMSksIHJlc1tqXSk7CisgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMyKGopLCBwZmlyc3QocHRtcDIpLCByZXNbal0pOworICAgICAgcmVzW2pdID0gY2oucG1hZGQobGhzMyhqKSwgcGZpcnN0KHB0bXAzKSwgcmVzW2pdKTsKKyAgICB9CisgIH0KKworICAvLyBwcm9jZXNzIHJlbWFpbmluZyBmaXJzdCBhbmQgbGFzdCBjb2x1bW5zIChhdCBtb3N0IGNvbHVtbnNBdE9uY2UtMSkKKyAgSW5kZXggZW5kID0gY29sczsKKyAgSW5kZXggc3RhcnQgPSBjb2x1bW5Cb3VuZDsKKyAgZG8KKyAgeworICAgIGZvciAoSW5kZXggaz1zdGFydDsgazxlbmQ7ICsraykKKyAgICB7CisgICAgICBSaHNQYWNrZXQgcHRtcDAgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJocyhrLCAwKSk7CisgICAgICBjb25zdCBMaHNTY2FsYXJzIGxoczAgPSBsaHMuZ2V0VmVjdG9yTWFwcGVyKDAsIGspOworCisgICAgICBpZiAoVmVjdG9yaXphYmxlKQorICAgICAgeworICAgICAgICAvKiBleHBsaWNpdCB2ZWN0b3JpemF0aW9uICovCisgICAgICAgIC8vIHByb2Nlc3MgZmlyc3QgdW5hbGlnbmVkIHJlc3VsdCdzIGNvZWZmcworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxhbGlnbmVkU3RhcnQ7ICsraikKKyAgICAgICAgICByZXNbal0gKz0gY2oucG11bChsaHMwKGopLCBwZmlyc3QocHRtcDApKTsKKyAgICAgICAgLy8gcHJvY2VzcyBhbGlnbmVkIHJlc3VsdCdzIGNvZWZmcworICAgICAgICBpZiAobGhzMC50ZW1wbGF0ZSBhbGlnbmVkPExoc1BhY2tldD4oYWxpZ25lZFN0YXJ0KSkKKyAgICAgICAgICBmb3IgKEluZGV4IGkgPSBhbGlnbmVkU3RhcnQ7aTxhbGlnbmVkU2l6ZTtpKz1SZXNQYWNrZXRTaXplKQorICAgICAgICAgICAgcHN0b3JlKCZyZXNbaV0sIHBjai5wbWFkZChsaHMwLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihpKSwgcHRtcDAsIHBsb2FkPFJlc1BhY2tldD4oJnJlc1tpXSkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZvciAoSW5kZXggaSA9IGFsaWduZWRTdGFydDtpPGFsaWduZWRTaXplO2krPVJlc1BhY2tldFNpemUpCisgICAgICAgICAgICBwc3RvcmUoJnJlc1tpXSwgcGNqLnBtYWRkKGxoczAudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIFVuYWxpZ25lZD4oaSksIHB0bXAwLCBwbG9hZDxSZXNQYWNrZXQ+KCZyZXNbaV0pKSk7CisgICAgICB9CisKKyAgICAgIC8vIHByb2Nlc3MgcmVtYWluaW5nIHNjYWxhcnMgKG9yIGFsbCBpZiBubyBleHBsaWNpdCB2ZWN0b3JpemF0aW9uKQorICAgICAgZm9yIChJbmRleCBpPWFsaWduZWRTaXplOyBpPHNpemU7ICsraSkKKyAgICAgICAgcmVzW2ldICs9IGNqLnBtdWwobGhzMChpKSwgcGZpcnN0KHB0bXAwKSk7CisgICAgfQorICAgIGlmIChza2lwQ29sdW1ucykKKyAgICB7CisgICAgICBzdGFydCA9IDA7CisgICAgICBlbmQgPSBza2lwQ29sdW1uczsKKyAgICAgIHNraXBDb2x1bW5zID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUoVmVjdG9yaXphYmxlKTsKKyAgI3VuZGVmIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMKK30KKworLyogT3B0aW1pemVkIHJvdy1tYWpvciBtYXRyaXggKiB2ZWN0b3IgcHJvZHVjdDoKKyAqIFRoaXMgYWxnb3JpdGhtIHByb2Nlc3NlcyA0IHJvd3MgYXQgb25jZXMgdGhhdCBhbGxvd3MgdG8gYm90aCByZWR1Y2UKKyAqIHRoZSBudW1iZXIgb2YgbG9hZC9zdG9yZXMgb2YgdGhlIHJlc3VsdCBieSBhIGZhY3RvciA0IGFuZCB0byByZWR1Y2UKKyAqIHRoZSBpbnN0cnVjdGlvbiBkZXBlbmRlbmN5LiBNb3Jlb3Zlciwgd2Uga25vdyB0aGF0IGFsbCBiYW5kcyBoYXZlIHRoZQorICogc2FtZSBhbGlnbm1lbnQgcGF0dGVybi4KKyAqCisgKiBNaXhpbmcgdHlwZSBsb2dpYzoKKyAqICAtIGFscGhhIGlzIGFsd2F5cyBhIGNvbXBsZXggKG9yIGNvbnZlcnRlZCB0byBhIGNvbXBsZXgpCisgKiAgLSBubyB2ZWN0b3JpemF0aW9uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIExoc01hcHBlciwgYm9vbCBDb25qdWdhdGVMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgUmhzTWFwcGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixSb3dNYWpvcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc01hcHBlcixDb25qdWdhdGVSaHMsVmVyc2lvbj4KK3sKK3R5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKworZW51bSB7CisgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6VmVjdG9yaXphYmxlCisgICAgICAgICAgICAgICYmIGludChwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnNpemUpPT1pbnQocGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpzaXplKSwKKyAgTGhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgIFJoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnNpemUgOiAxLAorICBSZXNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+OjpzaXplIDogMQorfTsKKwordHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnR5cGUgIF9MaHNQYWNrZXQ7Cit0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6dHlwZSAgX1Joc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+Ojp0eXBlICBfUmVzUGFja2V0OworCit0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfTGhzUGFja2V0LExoc1NjYWxhcj46OnR5cGUgTGhzUGFja2V0OwordHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Joc1BhY2tldCxSaHNTY2FsYXI+Ojp0eXBlIFJoc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SZXNQYWNrZXQsUmVzU2NhbGFyPjo6dHlwZSBSZXNQYWNrZXQ7CisKK0VJR0VOX0RPTlRfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bigKKyAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgY29uc3QgTGhzTWFwcGVyJiBsaHMsCisgIGNvbnN0IFJoc01hcHBlciYgcmhzLAorICAgICAgICBSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzSW5jciwKKyAgUmVzU2NhbGFyIGFscGhhKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIExoc01hcHBlciwgYm9vbCBDb25qdWdhdGVMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgUmhzTWFwcGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsUm93TWFqb3IsQ29uanVnYXRlTGhzLFJoc1NjYWxhcixSaHNNYXBwZXIsQ29uanVnYXRlUmhzLFZlcnNpb24+OjpydW4oCisgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsCisgIGNvbnN0IExoc01hcHBlciYgbGhzLAorICBjb25zdCBSaHNNYXBwZXImIHJocywKKyAgUmVzU2NhbGFyKiByZXMsIEluZGV4IHJlc0luY3IsCisgIFJlc1NjYWxhciBhbHBoYSkKK3sKKyAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJocy5zdHJpZGUoKT09MSk7CisKKyAgI2lmZGVmIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMKKyAgI2Vycm9yIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCisgICNlbmRpZgorCisgICNkZWZpbmUgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhBbGlnbm1lbnQwLEFsaWdubWVudDEzLEFsaWdubWVudDIpIHtcCisgICAgUmhzUGFja2V0IGIgPSByaHMuZ2V0VmVjdG9yTWFwcGVyKGosIDApLnRlbXBsYXRlIGxvYWQ8UmhzUGFja2V0LCBBbGlnbmVkPigwKTsgIFwKKyAgICBwdG1wMCA9IHBjai5wbWFkZChsaHMwLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbm1lbnQwPihqKSwgYiwgcHRtcDApOyBcCisgICAgcHRtcDEgPSBwY2oucG1hZGQobGhzMS50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25tZW50MTM+KGopLCBiLCBwdG1wMSk7IFwKKyAgICBwdG1wMiA9IHBjai5wbWFkZChsaHMyLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbm1lbnQyPihqKSwgYiwgcHRtcDIpOyBcCisgICAgcHRtcDMgPSBwY2oucG1hZGQobGhzMy50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25tZW50MTM+KGopLCBiLCBwdG1wMyk7IH0KKworICBjb25qX2hlbHBlcjxMaHNTY2FsYXIsUmhzU2NhbGFyLENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+IGNqOworICBjb25qX2hlbHBlcjxMaHNQYWNrZXQsUmhzUGFja2V0LENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+IHBjajsKKworICB0eXBlZGVmIHR5cGVuYW1lIExoc01hcHBlcjo6VmVjdG9yTWFwcGVyIExoc1NjYWxhcnM7CisKKyAgZW51bSB7IEFsbEFsaWduZWQ9MCwgRXZlbkFsaWduZWQ9MSwgRmlyc3RBbGlnbmVkPTIsIE5vbmVBbGlnbmVkPTMgfTsKKyAgY29uc3QgSW5kZXggcm93c0F0T25jZSA9IDQ7CisgIGNvbnN0IEluZGV4IHBlZWxzID0gMjsKKyAgY29uc3QgSW5kZXggUmhzUGFja2V0QWxpZ25lZE1hc2sgPSBSaHNQYWNrZXRTaXplLTE7CisgIGNvbnN0IEluZGV4IExoc1BhY2tldEFsaWduZWRNYXNrID0gTGhzUGFja2V0U2l6ZS0xOworICBjb25zdCBJbmRleCBkZXB0aCA9IGNvbHM7CisgIGNvbnN0IEluZGV4IGxoc1N0cmlkZSA9IGxocy5zdHJpZGUoKTsKKworICAvLyBIb3cgbWFueSBjb2VmZnMgb2YgdGhlIHJlc3VsdCBkbyB3ZSBoYXZlIHRvIHNraXAgdG8gYmUgYWxpZ25lZC4KKyAgLy8gSGVyZSB3ZSBhc3N1bWUgZGF0YSBhcmUgYXQgbGVhc3QgYWxpZ25lZCBvbiB0aGUgYmFzZSBzY2FsYXIgdHlwZQorICAvLyBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlIHRoZW4gdmVjdG9yaXphdGlvbiBpcyBkaXNjYXJkZWQsIHNlZSBiZWxvdy4KKyAgSW5kZXggYWxpZ25lZFN0YXJ0ID0gcmhzLmZpcnN0QWxpZ25lZChkZXB0aCk7CisgIEluZGV4IGFsaWduZWRTaXplID0gUmhzUGFja2V0U2l6ZT4xID8gYWxpZ25lZFN0YXJ0ICsgKChkZXB0aC1hbGlnbmVkU3RhcnQpICYgflJoc1BhY2tldEFsaWduZWRNYXNrKSA6IDA7CisgIGNvbnN0IEluZGV4IHBlZWxlZFNpemUgPSBhbGlnbmVkU2l6ZSAtIFJoc1BhY2tldFNpemUqcGVlbHMgLSBSaHNQYWNrZXRTaXplICsgMTsKKworICBjb25zdCBJbmRleCBhbGlnbm1lbnRTdGVwID0gTGhzUGFja2V0U2l6ZT4xID8gKExoc1BhY2tldFNpemUgLSBsaHNTdHJpZGUgJSBMaHNQYWNrZXRTaXplKSAmIExoc1BhY2tldEFsaWduZWRNYXNrIDogMDsKKyAgSW5kZXggYWxpZ25tZW50UGF0dGVybiA9IGFsaWdubWVudFN0ZXA9PTAgPyBBbGxBbGlnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFsaWdubWVudFN0ZXA9PShMaHNQYWNrZXRTaXplLzIpID8gRXZlbkFsaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmlyc3RBbGlnbmVkOworCisgIC8vIHdlIGNhbm5vdCBhc3N1bWUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxpZ25lZCBiZWNhdXNlIG9mIHN1Yi1tYXRyaWNlcworICBjb25zdCBJbmRleCBsaHNBbGlnbm1lbnRPZmZzZXQgPSBsaHMuZmlyc3RBbGlnbmVkKGRlcHRoKTsKKyAgY29uc3QgSW5kZXggcmhzQWxpZ25tZW50T2Zmc2V0ID0gcmhzLmZpcnN0QWxpZ25lZChyb3dzKTsKKworICAvLyBmaW5kIGhvdyBtYW55IHJvd3MgZG8gd2UgaGF2ZSB0byBza2lwIHRvIGJlIGFsaWduZWQgd2l0aCByaHMgKGlmIHBvc3NpYmxlKQorICBJbmRleCBza2lwUm93cyA9IDA7CisgIC8vIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBhbGlnbmVkIChUT0RPIGFkZCBzb21lIGNvbXBpbGUgdGltZSB0ZXN0cyB3aGVuIHBvc3NpYmxlLCBlLmcuIGZvciBmbG9hdHMpCisgIGlmKCAoc2l6ZW9mKExoc1NjYWxhcikhPXNpemVvZihSaHNTY2FsYXIpKSB8fAorICAgICAgKGxoc0FsaWdubWVudE9mZnNldCA8IDApIHx8IChsaHNBbGlnbm1lbnRPZmZzZXQgPT0gZGVwdGgpIHx8CisgICAgICAocmhzQWxpZ25tZW50T2Zmc2V0IDwgMCkgfHwgKHJoc0FsaWdubWVudE9mZnNldCA9PSByb3dzKSApCisgIHsKKyAgICBhbGlnbmVkU2l6ZSA9IDA7CisgICAgYWxpZ25lZFN0YXJ0ID0gMDsKKyAgICBhbGlnbm1lbnRQYXR0ZXJuID0gTm9uZUFsaWduZWQ7CisgIH0KKyAgZWxzZSBpZihMaHNQYWNrZXRTaXplID4gNCkKKyAgeworICAgIC8vIFRPRE86IGV4dGVuZCB0aGUgY29kZSB0byBzdXBwb3J0IGFsaWduZWQgbG9hZHMgd2hlbmV2ZXIgcG9zc2libGUgd2hlbiBMaHNQYWNrZXRTaXplID4gNC4KKyAgICBhbGlnbm1lbnRQYXR0ZXJuID0gTm9uZUFsaWduZWQ7CisgIH0KKyAgZWxzZSBpZiAoTGhzUGFja2V0U2l6ZT4xKQorICB7CisgIC8vICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChzaXplX3QoZmlyc3RMaHMrbGhzQWxpZ25tZW50T2Zmc2V0KSVzaXplb2YoTGhzUGFja2V0KT09MCAgfHwgZGVwdGg8TGhzUGFja2V0U2l6ZSk7CisKKyAgICB3aGlsZSAoc2tpcFJvd3M8TGhzUGFja2V0U2l6ZSAmJgorICAgICAgICAgICBhbGlnbmVkU3RhcnQgIT0gKChsaHNBbGlnbm1lbnRPZmZzZXQgKyBhbGlnbm1lbnRTdGVwKnNraXBSb3dzKSVMaHNQYWNrZXRTaXplKSkKKyAgICAgICsrc2tpcFJvd3M7CisgICAgaWYgKHNraXBSb3dzPT1MaHNQYWNrZXRTaXplKQorICAgIHsKKyAgICAgIC8vIG5vdGhpbmcgY2FuIGJlIGFsaWduZWQsIG5vIG5lZWQgdG8gc2tpcCBhbnkgY29sdW1uCisgICAgICBhbGlnbm1lbnRQYXR0ZXJuID0gTm9uZUFsaWduZWQ7CisgICAgICBza2lwUm93cyA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBza2lwUm93cyA9IChzdGQ6Om1pbikoc2tpcFJvd3MsSW5kZXgocm93cykpOworICAgICAgLy8gbm90ZSB0aGF0IHRoZSBza2lwZWQgY29sdW1ucyBhcmUgcHJvY2Vzc2VkIGxhdGVyLgorICAgIH0KKyAgICAvKiAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoICBhbGlnbm1lbnRQYXR0ZXJuPT1Ob25lQWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgIHx8IExoc1BhY2tldFNpemU9PTEKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoc2tpcFJvd3MgKyByb3dzQXRPbmNlID49IHJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgfHwgTGhzUGFja2V0U2l6ZSA+IGRlcHRoCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHNpemVfdChmaXJzdExocythbGlnbmVkU3RhcnQrbGhzU3RyaWRlKnNraXBSb3dzKSVzaXplb2YoTGhzUGFja2V0KSk9PTApOyovCisgIH0KKyAgZWxzZSBpZihWZWN0b3JpemFibGUpCisgIHsKKyAgICBhbGlnbmVkU3RhcnQgPSAwOworICAgIGFsaWduZWRTaXplID0gZGVwdGg7CisgICAgYWxpZ25tZW50UGF0dGVybiA9IEFsbEFsaWduZWQ7CisgIH0KKworICBjb25zdCBJbmRleCBvZmZzZXQxID0gKEZpcnN0QWxpZ25lZCAmJiBhbGlnbm1lbnRTdGVwPT0xKT8zOjE7CisgIGNvbnN0IEluZGV4IG9mZnNldDMgPSAoRmlyc3RBbGlnbmVkICYmIGFsaWdubWVudFN0ZXA9PTEpPzE6MzsKKworICBJbmRleCByb3dCb3VuZCA9ICgocm93cy1za2lwUm93cykvcm93c0F0T25jZSkqcm93c0F0T25jZSArIHNraXBSb3dzOworICBmb3IgKEluZGV4IGk9c2tpcFJvd3M7IGk8cm93Qm91bmQ7IGkrPXJvd3NBdE9uY2UpCisgIHsKKyAgICAvLyBGSVhNRTogd2hhdCBpcyB0aGUgcHVycG9zZSBvZiB0aGlzIEVJR0VOX0FMSUdOX0RFRkFVTFQgPz8KKyAgICBFSUdFTl9BTElHTl9NQVggUmVzU2NhbGFyIHRtcDAgPSBSZXNTY2FsYXIoMCk7CisgICAgUmVzU2NhbGFyIHRtcDEgPSBSZXNTY2FsYXIoMCksIHRtcDIgPSBSZXNTY2FsYXIoMCksIHRtcDMgPSBSZXNTY2FsYXIoMCk7CisKKyAgICAvLyB0aGlzIGhlbHBzIHRoZSBjb21waWxlciBnZW5lcmF0aW5nIGdvb2QgYmluYXJ5IGNvZGUKKyAgICBjb25zdCBMaHNTY2FsYXJzIGxoczAgPSBsaHMuZ2V0VmVjdG9yTWFwcGVyKGkrMCwgMCksICAgIGxoczEgPSBsaHMuZ2V0VmVjdG9yTWFwcGVyKGkrb2Zmc2V0MSwgMCksCisgICAgICAgICAgICAgICAgICAgICBsaHMyID0gbGhzLmdldFZlY3Rvck1hcHBlcihpKzIsIDApLCAgICBsaHMzID0gbGhzLmdldFZlY3Rvck1hcHBlcihpK29mZnNldDMsIDApOworCisgICAgaWYgKFZlY3Rvcml6YWJsZSkKKyAgICB7CisgICAgICAvKiBleHBsaWNpdCB2ZWN0b3JpemF0aW9uICovCisgICAgICBSZXNQYWNrZXQgcHRtcDAgPSBwc2V0MTxSZXNQYWNrZXQ+KFJlc1NjYWxhcigwKSksIHB0bXAxID0gcHNldDE8UmVzUGFja2V0PihSZXNTY2FsYXIoMCkpLAorICAgICAgICAgICAgICAgIHB0bXAyID0gcHNldDE8UmVzUGFja2V0PihSZXNTY2FsYXIoMCkpLCBwdG1wMyA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKTsKKworICAgICAgLy8gcHJvY2VzcyBpbml0aWFsIHVuYWxpZ25lZCBjb2VmZnMKKyAgICAgIC8vIEZJWE1FIHRoaXMgbG9vcCBnZXQgdmVjdG9yaXplZCBieSB0aGUgY29tcGlsZXIgIQorICAgICAgZm9yIChJbmRleCBqPTA7IGo8YWxpZ25lZFN0YXJ0OyArK2opCisgICAgICB7CisgICAgICAgIFJoc1NjYWxhciBiID0gcmhzKGosIDApOworICAgICAgICB0bXAwICs9IGNqLnBtdWwobGhzMChqKSxiKTsgdG1wMSArPSBjai5wbXVsKGxoczEoaiksYik7CisgICAgICAgIHRtcDIgKz0gY2oucG11bChsaHMyKGopLGIpOyB0bXAzICs9IGNqLnBtdWwobGhzMyhqKSxiKTsKKyAgICAgIH0KKworICAgICAgaWYgKGFsaWduZWRTaXplPmFsaWduZWRTdGFydCkKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoKGFsaWdubWVudFBhdHRlcm4pCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIEFsbEFsaWduZWQ6CisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7IGo8YWxpZ25lZFNpemU7IGorPVJoc1BhY2tldFNpemUpCisgICAgICAgICAgICAgIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoQWxpZ25lZCxBbGlnbmVkLEFsaWduZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBFdmVuQWxpZ25lZDoKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxhbGlnbmVkU2l6ZTsgais9UmhzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhBbGlnbmVkLFVuYWxpZ25lZCxBbGlnbmVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRmlyc3RBbGlnbmVkOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7CisgICAgICAgICAgICBpZiAocGVlbHM+MSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSGVyZSB3ZSBwcm9jY2VzcyA0IHJvd3Mgd2l0aCB3aXRoIHR3byBwZWVsZWQgaXRlcmF0aW9ucyB0byBoaWRlCisgICAgICAgICAgICAgICAqIHRoZSBvdmVyaGVhZCBvZiB1bmFsaWduZWQgbG9hZHMuIE1vcmVvdmVyIHVuYWxpZ25lZCBsb2FkcyBhcmUgaGFuZGxlZAorICAgICAgICAgICAgICAgKiB1c2luZyBzcGVjaWFsIHNoaWZ0L21vdmUgb3BlcmF0aW9ucyBiZXR3ZWVuIHRoZSB0d28gYWxpZ25lZCBwYWNrZXRzCisgICAgICAgICAgICAgICAqIG92ZXJsYXBpbmcgdGhlIGRlc2lyZWQgdW5hbGlnbmVkIHBhY2tldC4gVGhpcyBpcyAqbXVjaCogbW9yZSBlZmZpY2llbnQKKyAgICAgICAgICAgICAgICogdGhhbiBiYXNpYyB1bmFsaWduZWQgbG9hZHMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBMaHNQYWNrZXQgQTAxLCBBMDIsIEEwMywgQTExLCBBMTIsIEExMzsKKyAgICAgICAgICAgICAgQTAxID0gbGhzMS50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oYWxpZ25lZFN0YXJ0LTEpOworICAgICAgICAgICAgICBBMDIgPSBsaHMyLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihhbGlnbmVkU3RhcnQtMik7CisgICAgICAgICAgICAgIEEwMyA9IGxoczMudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGFsaWduZWRTdGFydC0zKTsKKworICAgICAgICAgICAgICBmb3IgKDsgajxwZWVsZWRTaXplOyBqKz1wZWVscypSaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmhzUGFja2V0IGIgPSByaHMuZ2V0VmVjdG9yTWFwcGVyKGosIDApLnRlbXBsYXRlIGxvYWQ8UmhzUGFja2V0LCBBbGlnbmVkPigwKTsKKyAgICAgICAgICAgICAgICBBMTEgPSBsaHMxLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihqLTErTGhzUGFja2V0U2l6ZSk7ICBwYWxpZ248MT4oQTAxLEExMSk7CisgICAgICAgICAgICAgICAgQTEyID0gbGhzMi50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oai0yK0xoc1BhY2tldFNpemUpOyAgcGFsaWduPDI+KEEwMixBMTIpOworICAgICAgICAgICAgICAgIEExMyA9IGxoczMudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGotMytMaHNQYWNrZXRTaXplKTsgIHBhbGlnbjwzPihBMDMsQTEzKTsKKworICAgICAgICAgICAgICAgIHB0bXAwID0gcGNqLnBtYWRkKGxoczAudGVtcGxhdGUgbG9hZDxMaHNQYWNrZXQsIEFsaWduZWQ+KGopLCBiLCBwdG1wMCk7CisgICAgICAgICAgICAgICAgcHRtcDEgPSBwY2oucG1hZGQoQTAxLCBiLCBwdG1wMSk7CisgICAgICAgICAgICAgICAgQTAxID0gbGhzMS50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oai0xKzIqTGhzUGFja2V0U2l6ZSk7ICBwYWxpZ248MT4oQTExLEEwMSk7CisgICAgICAgICAgICAgICAgcHRtcDIgPSBwY2oucG1hZGQoQTAyLCBiLCBwdG1wMik7CisgICAgICAgICAgICAgICAgQTAyID0gbGhzMi50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oai0yKzIqTGhzUGFja2V0U2l6ZSk7ICBwYWxpZ248Mj4oQTEyLEEwMik7CisgICAgICAgICAgICAgICAgcHRtcDMgPSBwY2oucG1hZGQoQTAzLCBiLCBwdG1wMyk7CisgICAgICAgICAgICAgICAgQTAzID0gbGhzMy50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oai0zKzIqTGhzUGFja2V0U2l6ZSk7ICBwYWxpZ248Mz4oQTEzLEEwMyk7CisKKyAgICAgICAgICAgICAgICBiID0gcmhzLmdldFZlY3Rvck1hcHBlcihqK1Joc1BhY2tldFNpemUsIDApLnRlbXBsYXRlIGxvYWQ8UmhzUGFja2V0LCBBbGlnbmVkPigwKTsKKyAgICAgICAgICAgICAgICBwdG1wMCA9IHBjai5wbWFkZChsaHMwLnRlbXBsYXRlIGxvYWQ8TGhzUGFja2V0LCBBbGlnbmVkPihqK0xoc1BhY2tldFNpemUpLCBiLCBwdG1wMCk7CisgICAgICAgICAgICAgICAgcHRtcDEgPSBwY2oucG1hZGQoQTExLCBiLCBwdG1wMSk7CisgICAgICAgICAgICAgICAgcHRtcDIgPSBwY2oucG1hZGQoQTEyLCBiLCBwdG1wMik7CisgICAgICAgICAgICAgICAgcHRtcDMgPSBwY2oucG1hZGQoQTEzLCBiLCBwdG1wMyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOyBqPGFsaWduZWRTaXplOyBqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgICBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKEFsaWduZWQsVW5hbGlnbmVkLFVuYWxpZ25lZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxhbGlnbmVkU2l6ZTsgais9UmhzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhVbmFsaWduZWQsVW5hbGlnbmVkLFVuYWxpZ25lZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0bXAwICs9IHByZWR1eChwdG1wMCk7CisgICAgICAgIHRtcDEgKz0gcHJlZHV4KHB0bXAxKTsKKyAgICAgICAgdG1wMiArPSBwcmVkdXgocHRtcDIpOworICAgICAgICB0bXAzICs9IHByZWR1eChwdG1wMyk7CisgICAgICB9CisgICAgfSAvLyBlbmQgZXhwbGljaXQgdmVjdG9yaXphdGlvbgorCisgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgY29lZmZzIChvciBhbGwgaWYgbm8gZXhwbGljaXQgdmVjdG9yaXphdGlvbikKKyAgICAvLyBGSVhNRSB0aGlzIGxvb3AgZ2V0IHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyICEKKyAgICBmb3IgKEluZGV4IGo9YWxpZ25lZFNpemU7IGo8ZGVwdGg7ICsraikKKyAgICB7CisgICAgICBSaHNTY2FsYXIgYiA9IHJocyhqLCAwKTsKKyAgICAgIHRtcDAgKz0gY2oucG11bChsaHMwKGopLGIpOyB0bXAxICs9IGNqLnBtdWwobGhzMShqKSxiKTsKKyAgICAgIHRtcDIgKz0gY2oucG11bChsaHMyKGopLGIpOyB0bXAzICs9IGNqLnBtdWwobGhzMyhqKSxiKTsKKyAgICB9CisgICAgcmVzW2kqcmVzSW5jcl0gICAgICAgICAgICArPSBhbHBoYSp0bXAwOworICAgIHJlc1soaStvZmZzZXQxKSpyZXNJbmNyXSAgKz0gYWxwaGEqdG1wMTsKKyAgICByZXNbKGkrMikqcmVzSW5jcl0gICAgICAgICs9IGFscGhhKnRtcDI7CisgICAgcmVzWyhpK29mZnNldDMpKnJlc0luY3JdICArPSBhbHBoYSp0bXAzOworICB9CisKKyAgLy8gcHJvY2VzcyByZW1haW5pbmcgZmlyc3QgYW5kIGxhc3Qgcm93cyAoYXQgbW9zdCBjb2x1bW5zQXRPbmNlLTEpCisgIEluZGV4IGVuZCA9IHJvd3M7CisgIEluZGV4IHN0YXJ0ID0gcm93Qm91bmQ7CisgIGRvCisgIHsKKyAgICBmb3IgKEluZGV4IGk9c3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgeworICAgICAgRUlHRU5fQUxJR05fTUFYIFJlc1NjYWxhciB0bXAwID0gUmVzU2NhbGFyKDApOworICAgICAgUmVzUGFja2V0IHB0bXAwID0gcHNldDE8UmVzUGFja2V0Pih0bXAwKTsKKyAgICAgIGNvbnN0IExoc1NjYWxhcnMgbGhzMCA9IGxocy5nZXRWZWN0b3JNYXBwZXIoaSwgMCk7CisgICAgICAvLyBwcm9jZXNzIGZpcnN0IHVuYWxpZ25lZCByZXN1bHQncyBjb2VmZnMKKyAgICAgIC8vIEZJWE1FIHRoaXMgbG9vcCBnZXQgdmVjdG9yaXplZCBieSB0aGUgY29tcGlsZXIgIQorICAgICAgZm9yIChJbmRleCBqPTA7IGo8YWxpZ25lZFN0YXJ0OyArK2opCisgICAgICAgIHRtcDAgKz0gY2oucG11bChsaHMwKGopLCByaHMoaiwgMCkpOworCisgICAgICBpZiAoYWxpZ25lZFNpemU+YWxpZ25lZFN0YXJ0KQorICAgICAgeworICAgICAgICAvLyBwcm9jZXNzIGFsaWduZWQgcmhzIGNvZWZmcworICAgICAgICBpZiAobGhzMC50ZW1wbGF0ZSBhbGlnbmVkPExoc1BhY2tldD4oYWxpZ25lZFN0YXJ0KSkKKyAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7ajxhbGlnbmVkU2l6ZTtqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgcHRtcDAgPSBwY2oucG1hZGQobGhzMC50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgQWxpZ25lZD4oaiksIHJocy5nZXRWZWN0b3JNYXBwZXIoaiwgMCkudGVtcGxhdGUgbG9hZDxSaHNQYWNrZXQsIEFsaWduZWQ+KDApLCBwdG1wMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7ajxhbGlnbmVkU2l6ZTtqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgcHRtcDAgPSBwY2oucG1hZGQobGhzMC50ZW1wbGF0ZSBsb2FkPExoc1BhY2tldCwgVW5hbGlnbmVkPihqKSwgcmhzLmdldFZlY3Rvck1hcHBlcihqLCAwKS50ZW1wbGF0ZSBsb2FkPFJoc1BhY2tldCwgQWxpZ25lZD4oMCksIHB0bXAwKTsKKyAgICAgICAgdG1wMCArPSBwcmVkdXgocHRtcDApOworICAgICAgfQorCisgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBzY2FsYXJzCisgICAgICAvLyBGSVhNRSB0aGlzIGxvb3AgZ2V0IHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyICEKKyAgICAgIGZvciAoSW5kZXggaj1hbGlnbmVkU2l6ZTsgajxkZXB0aDsgKytqKQorICAgICAgICB0bXAwICs9IGNqLnBtdWwobGhzMChqKSwgcmhzKGosIDApKTsKKyAgICAgIHJlc1tpKnJlc0luY3JdICs9IGFscGhhKnRtcDA7CisgICAgfQorICAgIGlmIChza2lwUm93cykKKyAgICB7CisgICAgICBzdGFydCA9IDA7CisgICAgICBlbmQgPSBza2lwUm93czsKKyAgICAgIHNraXBSb3dzID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUoVmVjdG9yaXphYmxlKTsKKworICAjdW5kZWYgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9HRU5FUkFMX01BVFJJWF9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvcl9CTEFTLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4VmVjdG9yX0JMQVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2E1ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvcl9CTEFTLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBCTEFTIEY3NworICogICBHZW5lcmFsIG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9HRU1WLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9CTEFTX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJBTF9NQVRSSVhfVkVDVE9SX0JMQVNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBmaWxlIGltcGxlbWVudHMgZ2VuZXJhbCBtYXRyaXgtdmVjdG9yIG11bHRpcGxpY2F0aW9uIHVzaW5nIEJMQVMKKyogZ2VtdiBmdW5jdGlvbiB2aWEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZgorKiBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDo6cnVuKC4uKSBtZXRob2QgZm9yIGZsb2F0LCBkb3VibGUsCisqIHN0ZDo6Y29tcGxleDxmbG9hdD4gYW5kIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBnZW12IHNwZWNpYWxpemF0aW9uCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X2dlbXY7CisKKyNkZWZpbmUgRUlHRU5fQkxBU19HRU1WX1NQRUNJQUxJWkUoU2NhbGFyKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsU2NhbGFyLGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LENvbE1ham9yPixDb2xNYWpvcixDb25qdWdhdGVMaHMsU2NhbGFyLGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LFJvd01ham9yPixDb25qdWdhdGVSaHMsU3BlY2lhbGl6ZWQ+IHsgXAorc3RhdGljIHZvaWQgcnVuKCBcCisgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIFwKKyAgY29uc3QgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsQ29sTWFqb3I+ICZsaHMsIFwKKyAgY29uc3QgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsUm93TWFqb3I+ICZyaHMsIFwKKyAgU2NhbGFyKiByZXMsIEluZGV4IHJlc0luY3IsIFNjYWxhciBhbHBoYSkgXAoreyBcCisgIGlmIChDb25qdWdhdGVMaHMpIHsgXAorICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LFNjYWxhcixjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxDb2xNYWpvcj4sQ29sTWFqb3IsQ29uanVnYXRlTGhzLFNjYWxhcixjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxSb3dNYWpvcj4sQ29uanVnYXRlUmhzLEJ1aWx0SW4+OjpydW4oIFwKKyAgICAgIHJvd3MsIGNvbHMsIGxocywgcmhzLCByZXMsIHJlc0luY3IsIGFscGhhKTsgXAorICB9IGVsc2UgeyBcCisgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3RfZ2VtdjxJbmRleCxTY2FsYXIsQ29sTWFqb3IsQ29uanVnYXRlTGhzLFNjYWxhcixDb25qdWdhdGVSaHM+OjpydW4oIFwKKyAgICAgIHJvd3MsIGNvbHMsIGxocy5kYXRhKCksIGxocy5zdHJpZGUoKSwgcmhzLmRhdGEoKSwgcmhzLnN0cmlkZSgpLCByZXMsIHJlc0luY3IsIGFscGhhKTsgXAorICB9IFwKK30gXAorfTsgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LFNjYWxhcixjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxSb3dNYWpvcj4sUm93TWFqb3IsQ29uanVnYXRlTGhzLFNjYWxhcixjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxDb2xNYWpvcj4sQ29uanVnYXRlUmhzLFNwZWNpYWxpemVkPiB7IFwKK3N0YXRpYyB2b2lkIHJ1biggXAorICBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBcCisgIGNvbnN0IGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LFJvd01ham9yPiAmbGhzLCBcCisgIGNvbnN0IGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LENvbE1ham9yPiAmcmhzLCBcCisgIFNjYWxhciogcmVzLCBJbmRleCByZXNJbmNyLCBTY2FsYXIgYWxwaGEpIFwKK3sgXAorICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X2dlbXY8SW5kZXgsU2NhbGFyLFJvd01ham9yLENvbmp1Z2F0ZUxocyxTY2FsYXIsQ29uanVnYXRlUmhzPjo6cnVuKCBcCisgICAgICByb3dzLCBjb2xzLCBsaHMuZGF0YSgpLCBsaHMuc3RyaWRlKCksIHJocy5kYXRhKCksIHJocy5zdHJpZGUoKSwgcmVzLCByZXNJbmNyLCBhbHBoYSk7IFwKK30gXAorfTsgXAorCitFSUdFTl9CTEFTX0dFTVZfU1BFQ0lBTElaRShkb3VibGUpCitFSUdFTl9CTEFTX0dFTVZfU1BFQ0lBTElaRShmbG9hdCkKK0VJR0VOX0JMQVNfR0VNVl9TUEVDSUFMSVpFKGRjb21wbGV4KQorRUlHRU5fQkxBU19HRU1WX1NQRUNJQUxJWkUoc2NvbXBsZXgpCisKKyNkZWZpbmUgRUlHRU5fQkxBU19HRU1WX1NQRUNJQUxJWkFUSU9OKEVJR1RZUEUsQkxBU1RZUEUsQkxBU1BSRUZJWCkgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X2dlbXY8SW5kZXgsRUlHVFlQRSxMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLEVJR1RZUEUsQ29uanVnYXRlUmhzPiBcCit7IFwKK3R5cGVkZWYgTWF0cml4PEVJR1RZUEUsRHluYW1pYywxLENvbE1ham9yPiBHRU1WVmVjdG9yO1wKK1wKK3N0YXRpYyB2b2lkIHJ1biggXAorICBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBcCisgIGNvbnN0IEVJR1RZUEUqIGxocywgSW5kZXggbGhzU3RyaWRlLCBcCisgIGNvbnN0IEVJR1RZUEUqIHJocywgSW5kZXggcmhzSW5jciwgXAorICBFSUdUWVBFKiByZXMsIEluZGV4IHJlc0luY3IsIEVJR1RZUEUgYWxwaGEpIFwKK3sgXAorICBCbGFzSW5kZXggbT1jb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cyksIG49Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KGNvbHMpLCBcCisgICAgICAgICAgICBsZGE9Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KGxoc1N0cmlkZSksIGluY3g9Y29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJoc0luY3IpLCBpbmN5PWNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihyZXNJbmNyKTsgXAorICBjb25zdCBFSUdUWVBFIGJldGEoMSk7IFwKKyAgY29uc3QgRUlHVFlQRSAqeF9wdHI7IFwKKyAgY2hhciB0cmFucz0oTGhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgPyAnTicgOiAoQ29uanVnYXRlTGhzKSA/ICdDJyA6ICdUJzsgXAorICBpZiAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgeyBcCisgICAgbSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4Pihjb2xzKTsgXAorICAgIG4gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cyk7IFwKKyAgfVwKKyAgR0VNVlZlY3RvciB4X3RtcDsgXAorICBpZiAoQ29uanVnYXRlUmhzKSB7IFwKKyAgICBNYXA8Y29uc3QgR0VNVlZlY3RvciwgMCwgSW5uZXJTdHJpZGU8PiA+IG1hcF94KHJocyxjb2xzLDEsSW5uZXJTdHJpZGU8PihpbmN4KSk7IFwKKyAgICB4X3RtcD1tYXBfeC5jb25qdWdhdGUoKTsgXAorICAgIHhfcHRyPXhfdG1wLmRhdGEoKTsgXAorICAgIGluY3g9MTsgXAorICB9IGVsc2UgeF9wdHI9cmhzOyBcCisgIEJMQVNQUkVGSVgjI2dlbXZfKCZ0cmFucywgJm0sICZuLCAmbnVtZXh0OjpyZWFsX3JlZihhbHBoYSksIChjb25zdCBCTEFTVFlQRSopbGhzLCAmbGRhLCAoY29uc3QgQkxBU1RZUEUqKXhfcHRyLCAmaW5jeCwgJm51bWV4dDo6cmVhbF9yZWYoYmV0YSksIChCTEFTVFlQRSopcmVzLCAmaW5jeSk7IFwKK31cCit9OworCitFSUdFTl9CTEFTX0dFTVZfU1BFQ0lBTElaQVRJT04oZG91YmxlLCAgIGRvdWJsZSwgZCkKK0VJR0VOX0JMQVNfR0VNVl9TUEVDSUFMSVpBVElPTihmbG9hdCwgICAgZmxvYXQsICBzKQorRUlHRU5fQkxBU19HRU1WX1NQRUNJQUxJWkFUSU9OKGRjb21wbGV4LCBkb3VibGUsIHopCitFSUdFTl9CTEFTX0dFTVZfU1BFQ0lBTElaQVRJT04oc2NvbXBsZXgsIGZsb2F0LCAgYykKKworfSAvLyBlbmQgbmFtZXNwYXNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9NQVRSSVhfVkVDVE9SX0JMQVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9QYXJhbGxlbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRkYzBjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQVJBTExFTElaRVJfSAorI2RlZmluZSBFSUdFTl9QQVJBTExFTElaRVJfSAorCisjaW5jbHVkZSA8YXRvbWljPgorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsICovCitpbmxpbmUgdm9pZCBtYW5hZ2VfbXVsdGlfdGhyZWFkaW5nKEFjdGlvbiBhY3Rpb24sIGludCogdikKK3sKKyAgc3RhdGljIEVJR0VOX1VOVVNFRCBpbnQgbV9tYXhUaHJlYWRzID0gLTE7CisKKyAgaWYoYWN0aW9uPT1TZXRBY3Rpb24pCisgIHsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQodiE9MCk7CisgICAgbV9tYXhUaHJlYWRzID0gKnY7CisgIH0KKyAgZWxzZSBpZihhY3Rpb249PUdldEFjdGlvbikKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydCh2IT0wKTsKKyAgICAjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAorICAgIGlmKG1fbWF4VGhyZWFkcz4wKQorICAgICAgKnYgPSBtX21heFRocmVhZHM7CisgICAgZWxzZQorICAgICAgKnYgPSBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgI2Vsc2UKKyAgICAqdiA9IDE7CisgICAgI2VuZGlmCisgIH0KKyAgZWxzZQorICB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGZhbHNlKTsKKyAgfQorfQorCit9CisKKy8qKiBNdXN0IGJlIGNhbGwgZmlyc3Qgd2hlbiBjYWxsaW5nIEVpZ2VuIGZyb20gbXVsdGlwbGUgdGhyZWFkcyAqLworaW5saW5lIHZvaWQgaW5pdFBhcmFsbGVsKCkKK3sKKyAgaW50IG5idDsKKyAgaW50ZXJuYWw6Om1hbmFnZV9tdWx0aV90aHJlYWRpbmcoR2V0QWN0aW9uLCAmbmJ0KTsKKyAgc3RkOjpwdHJkaWZmX3QgbDEsIGwyLCBsMzsKKyAgaW50ZXJuYWw6Om1hbmFnZV9jYWNoaW5nX3NpemVzKEdldEFjdGlvbiwgJmwxLCAmbDIsICZsMyk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF4IG51bWJlciBvZiB0aHJlYWRzIHJlc2VydmVkIGZvciBFaWdlbgorICAqIFxzYSBzZXROYlRocmVhZHMgKi8KK2lubGluZSBpbnQgbmJUaHJlYWRzKCkKK3sKKyAgaW50IHJldDsKKyAgaW50ZXJuYWw6Om1hbmFnZV9tdWx0aV90aHJlYWRpbmcoR2V0QWN0aW9uLCAmcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIFNldHMgdGhlIG1heCBudW1iZXIgb2YgdGhyZWFkcyByZXNlcnZlZCBmb3IgRWlnZW4KKyAgKiBcc2EgbmJUaHJlYWRzICovCitpbmxpbmUgdm9pZCBzZXROYlRocmVhZHMoaW50IHYpCit7CisgIGludGVybmFsOjptYW5hZ2VfbXVsdGlfdGhyZWFkaW5nKFNldEFjdGlvbiwgJnYpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4gc3RydWN0IEdlbW1QYXJhbGxlbEluZm8KK3sKKyAgR2VtbVBhcmFsbGVsSW5mbygpIDogc3luYygtMSksIHVzZXJzKDApLCBsaHNfc3RhcnQoMCksIGxoc19sZW5ndGgoMCkge30KKworICBzdGQ6OmF0b21pYzxJbmRleD4gc3luYzsKKyAgc3RkOjphdG9taWM8aW50PiB1c2VyczsKKworICBJbmRleCBsaHNfc3RhcnQ7CisgIEluZGV4IGxoc19sZW5ndGg7Cit9OworCit0ZW1wbGF0ZTxib29sIENvbmRpdGlvbiwgdHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUgSW5kZXg+Cit2b2lkIHBhcmFsbGVsaXplX2dlbW0oY29uc3QgRnVuY3RvciYgZnVuYywgSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsIGJvb2wgdHJhbnNwb3NlKQoreworICAvLyBUT0RPIHdoZW4gRUlHRU5fVVNFX0JMQVMgaXMgZGVmaW5lZCwKKyAgLy8gd2Ugc2hvdWxkIHN0aWxsIGVuYWJsZSBPTVAgZm9yIG90aGVyIHNjYWxhciB0eXBlcworI2lmICEoZGVmaW5lZCAoRUlHRU5fSEFTX09QRU5NUCkpIHx8IGRlZmluZWQgKEVJR0VOX1VTRV9CTEFTKQorICAvLyBGSVhNRSB0aGUgdHJhbnNwb3NlIHZhcmlhYmxlIGlzIG9ubHkgbmVlZGVkIHRvIHByb3Blcmx5IHNwbGl0CisgIC8vIHRoZSBtYXRyaXggcHJvZHVjdCB3aGVuIG11bHRpdGhyZWFkaW5nIGlzIGVuYWJsZWQuIFRoaXMgaXMgYSB0ZW1wb3JhcnkKKyAgLy8gZml4IHRvIHN1cHBvcnQgcm93LW1ham9yIGRlc3RpbmF0aW9uIG1hdHJpY2VzLiBUaGlzIHdob2xlCisgIC8vIHBhcmFsbGVsaXplciBtZWNoYW5pc20gaGFzIHRvIGJlIHJlZGlzaWduZWQgYW55d2F5LgorICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZGVwdGgpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUodHJhbnNwb3NlKTsKKyAgZnVuYygwLHJvd3MsIDAsY29scyk7CisjZWxzZQorCisgIC8vIER5bmFtaWNhbGx5IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGVuYWJsZSBvciBkaXNhYmxlIE9wZW5NUC4KKyAgLy8gVGhlIGNvbmRpdGlvbnMgYXJlOgorICAvLyAtIHRoZSBtYXggbnVtYmVyIG9mIHRocmVhZHMgd2UgY2FuIGNyZWF0ZSBpcyBncmVhdGVyIHRoYW4gMQorICAvLyAtIHdlIGFyZSBub3QgYWxyZWFkeSBpbiBhIHBhcmFsbGVsIGNvZGUKKyAgLy8gLSB0aGUgc2l6ZXMgYXJlIGxhcmdlIGVub3VnaAorCisgIC8vIGNvbXB1dGUgdGhlIG1heGltYWwgbnVtYmVyIG9mIHRocmVhZHMgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgcHJvZHVjdDoKKyAgLy8gVGhpcyBmaXJzdCBoZXVyaXN0aWMgdGFrZXMgaW50byBhY2NvdW50IHRoYXQgdGhlIHByb2R1Y3Qga2VybmVsIGlzIGZ1bGx5IG9wdGltaXplZCB3aGVuIHdvcmtpbmcgd2l0aCBuciBjb2x1bW5zIGF0IG9uY2UuCisgIEluZGV4IHNpemUgPSB0cmFuc3Bvc2UgPyByb3dzIDogY29sczsKKyAgSW5kZXggcGJfbWF4X3RocmVhZHMgPSBzdGQ6Om1heDxJbmRleD4oMSxzaXplIC8gRnVuY3Rvcjo6VHJhaXRzOjpucik7CisKKyAgLy8gY29tcHV0ZSB0aGUgbWF4aW1hbCBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIHRoZSB0b3RhbCBhbW91bnQgb2Ygd29yazoKKyAgZG91YmxlIHdvcmsgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHJvd3MpICogc3RhdGljX2Nhc3Q8ZG91YmxlPihjb2xzKSAqCisgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGRlcHRoKTsKKyAgZG91YmxlIGtNaW5UYXNrU2l6ZSA9IDUwMDAwOyAgLy8gRklYTUUgaW1wcm92ZSB0aGlzIGhldXJpc3RpYy4KKyAgcGJfbWF4X3RocmVhZHMgPSBzdGQ6Om1heDxJbmRleD4oMSwgc3RkOjptaW48SW5kZXg+KHBiX21heF90aHJlYWRzLCB3b3JrIC8ga01pblRhc2tTaXplKSk7CisKKyAgLy8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2UgYXJlIGdvaW5nIHRvIHVzZQorICBJbmRleCB0aHJlYWRzID0gc3RkOjptaW48SW5kZXg+KG5iVGhyZWFkcygpLCBwYl9tYXhfdGhyZWFkcyk7CisKKyAgLy8gaWYgbXVsdGktdGhyZWFkaW5nIGlzIGV4cGxpY2l0ZWx5IGRpc2FibGVkLCBub3QgdXNlZnVsLCBvciBpZiB3ZSBhbHJlYWR5IGFyZSBpbiBhIHBhcmFsbGVsIHNlc3Npb24sCisgIC8vIHRoZW4gYWJvcnQgbXVsdGktdGhyZWFkaW5nCisgIC8vIEZJWE1FIG9tcF9nZXRfbnVtX3RocmVhZHMoKT4xIG9ubHkgd29ya3MgZm9yIG9wZW5tcCwgd2hhdCBpZiB0aGUgdXNlciBkb2VzIG5vdCB1c2Ugb3Blbm1wPworICBpZigoIUNvbmRpdGlvbikgfHwgKHRocmVhZHM9PTEpIHx8IChvbXBfZ2V0X251bV90aHJlYWRzKCk+MSkpCisgICAgcmV0dXJuIGZ1bmMoMCxyb3dzLCAwLGNvbHMpOworCisgIEVpZ2VuOjppbml0UGFyYWxsZWwoKTsKKyAgZnVuYy5pbml0UGFyYWxsZWxTZXNzaW9uKHRocmVhZHMpOworCisgIGlmKHRyYW5zcG9zZSkKKyAgICBzdGQ6OnN3YXAocm93cyxjb2xzKTsKKworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoR2VtbVBhcmFsbGVsSW5mbzxJbmRleD4saW5mbyx0aHJlYWRzLDApOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKHRocmVhZHMpCisgIHsKKyAgICBJbmRleCBpID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHRocmVhZHMgbWlnaHQgYmUgbG93ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHJlcXVlc3Qgb25lcy4KKyAgICBJbmRleCBhY3R1YWxfdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworICAgIEluZGV4IGJsb2NrQ29scyA9IChjb2xzIC8gYWN0dWFsX3RocmVhZHMpICYgfkluZGV4KDB4Myk7CisgICAgSW5kZXggYmxvY2tSb3dzID0gKHJvd3MgLyBhY3R1YWxfdGhyZWFkcyk7CisgICAgYmxvY2tSb3dzID0gKGJsb2NrUm93cy9GdW5jdG9yOjpUcmFpdHM6Om1yKSpGdW5jdG9yOjpUcmFpdHM6Om1yOworCisgICAgSW5kZXggcjAgPSBpKmJsb2NrUm93czsKKyAgICBJbmRleCBhY3R1YWxCbG9ja1Jvd3MgPSAoaSsxPT1hY3R1YWxfdGhyZWFkcykgPyByb3dzLXIwIDogYmxvY2tSb3dzOworCisgICAgSW5kZXggYzAgPSBpKmJsb2NrQ29sczsKKyAgICBJbmRleCBhY3R1YWxCbG9ja0NvbHMgPSAoaSsxPT1hY3R1YWxfdGhyZWFkcykgPyBjb2xzLWMwIDogYmxvY2tDb2xzOworCisgICAgaW5mb1tpXS5saHNfc3RhcnQgPSByMDsKKyAgICBpbmZvW2ldLmxoc19sZW5ndGggPSBhY3R1YWxCbG9ja1Jvd3M7CisKKyAgICBpZih0cmFuc3Bvc2UpIGZ1bmMoYzAsIGFjdHVhbEJsb2NrQ29scywgMCwgcm93cywgaW5mbyk7CisgICAgZWxzZSAgICAgICAgICBmdW5jKDAsIHJvd3MsIGMwLCBhY3R1YWxCbG9ja0NvbHMsIGluZm8pOworICB9CisjZW5kaWYKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFSQUxMRUxJWkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmY4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oCkBAIC0wLDAgKzEsNTIxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1NFTEZBREpPSU5UX01BVFJJWF9NQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gcGFjayBhIHNlbGZhZGpvaW50IGJsb2NrIGRpYWdvbmFsIGZvciB1c2Ugd2l0aCB0aGUgZ2VicF9rZXJuZWwKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBQYWNrMSwgaW50IFBhY2syX2R1bW15LCBpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHN5bW1fcGFja19saHMKK3sKKyAgdGVtcGxhdGU8aW50IEJsb2NrUm93cz4gaW5saW5lCisgIHZvaWQgcGFjayhTY2FsYXIqIGJsb2NrQSwgY29uc3QgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyPiYgbGhzLCBJbmRleCBjb2xzLCBJbmRleCBpLCBJbmRleCYgY291bnQpCisgIHsKKyAgICAvLyBub3JtYWwgY29weQorICAgIGZvcihJbmRleCBrPTA7IGs8aTsgaysrKQorICAgICAgZm9yKEluZGV4IHc9MDsgdzxCbG9ja1Jvd3M7IHcrKykKKyAgICAgICAgYmxvY2tBW2NvdW50KytdID0gbGhzKGkrdyxrKTsgICAgICAgICAgIC8vIG5vcm1hbAorICAgIC8vIHN5bW1ldHJpYyBjb3B5CisgICAgSW5kZXggaCA9IDA7CisgICAgZm9yKEluZGV4IGs9aTsgazxpK0Jsb2NrUm93czsgaysrKQorICAgIHsKKyAgICAgIGZvcihJbmRleCB3PTA7IHc8aDsgdysrKQorICAgICAgICBibG9ja0FbY291bnQrK10gPSBudW1leHQ6OmNvbmoobGhzKGssIGkrdykpOyAvLyB0cmFuc3Bvc2VkCisKKyAgICAgIGJsb2NrQVtjb3VudCsrXSA9IG51bWV4dDo6cmVhbChsaHMoayxrKSk7ICAgLy8gcmVhbCAoZGlhZ29uYWwpCisKKyAgICAgIGZvcihJbmRleCB3PWgrMTsgdzxCbG9ja1Jvd3M7IHcrKykKKyAgICAgICAgYmxvY2tBW2NvdW50KytdID0gbGhzKGkrdywgayk7ICAgICAgICAgIC8vIG5vcm1hbAorICAgICAgKytoOworICAgIH0KKyAgICAvLyB0cmFuc3Bvc2VkIGNvcHkKKyAgICBmb3IoSW5kZXggaz1pK0Jsb2NrUm93czsgazxjb2xzOyBrKyspCisgICAgICBmb3IoSW5kZXggdz0wOyB3PEJsb2NrUm93czsgdysrKQorICAgICAgICBibG9ja0FbY291bnQrK10gPSBudW1leHQ6OmNvbmoobGhzKGssIGkrdykpOyAvLyB0cmFuc3Bvc2VkCisgIH0KKyAgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tBLCBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgSW5kZXggY29scywgSW5kZXggcm93cykKKyAgeworICAgIGVudW0geyBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplIH07CisgICAgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICAvL0luZGV4IHBlZWxlZF9tYzMgPSAocm93cy9QYWNrMSkqUGFjazE7CisgICAgCisgICAgY29uc3QgSW5kZXggcGVlbGVkX21jMyA9IFBhY2sxPj0zKlBhY2tldFNpemUgPyAocm93cy8oMypQYWNrZXRTaXplKSkqKDMqUGFja2V0U2l6ZSkgOiAwOworICAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYzIgPSBQYWNrMT49MipQYWNrZXRTaXplID8gcGVlbGVkX21jMysoKHJvd3MtcGVlbGVkX21jMykvKDIqUGFja2V0U2l6ZSkpKigyKlBhY2tldFNpemUpIDogMDsKKyAgICBjb25zdCBJbmRleCBwZWVsZWRfbWMxID0gUGFjazE+PTEqUGFja2V0U2l6ZSA/IChyb3dzLygxKlBhY2tldFNpemUpKSooMSpQYWNrZXRTaXplKSA6IDA7CisgICAgCisgICAgaWYoUGFjazE+PTMqUGFja2V0U2l6ZSkKKyAgICAgIGZvcihJbmRleCBpPTA7IGk8cGVlbGVkX21jMzsgaSs9MypQYWNrZXRTaXplKQorICAgICAgICBwYWNrPDMqUGFja2V0U2l6ZT4oYmxvY2tBLCBsaHMsIGNvbHMsIGksIGNvdW50KTsKKyAgICAKKyAgICBpZihQYWNrMT49MipQYWNrZXRTaXplKQorICAgICAgZm9yKEluZGV4IGk9cGVlbGVkX21jMzsgaTxwZWVsZWRfbWMyOyBpKz0yKlBhY2tldFNpemUpCisgICAgICAgIHBhY2s8MipQYWNrZXRTaXplPihibG9ja0EsIGxocywgY29scywgaSwgY291bnQpOworICAgIAorICAgIGlmKFBhY2sxPj0xKlBhY2tldFNpemUpCisgICAgICBmb3IoSW5kZXggaT1wZWVsZWRfbWMyOyBpPHBlZWxlZF9tYzE7IGkrPTEqUGFja2V0U2l6ZSkKKyAgICAgICAgcGFjazwxKlBhY2tldFNpemU+KGJsb2NrQSwgbGhzLCBjb2xzLCBpLCBjb3VudCk7CisKKyAgICAvLyBkbyB0aGUgc2FtZSB3aXRoIG1yPT0xCisgICAgZm9yKEluZGV4IGk9cGVlbGVkX21jMTsgaTxyb3dzOyBpKyspCisgICAgeworICAgICAgZm9yKEluZGV4IGs9MDsgazxpOyBrKyspCisgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGxocyhpLCBrKTsgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsCisKKyAgICAgIGJsb2NrQVtjb3VudCsrXSA9IG51bWV4dDo6cmVhbChsaHMoaSwgaSkpOyAgICAgICAvLyByZWFsIChkaWFnb25hbCkKKworICAgICAgZm9yKEluZGV4IGs9aSsxOyBrPGNvbHM7IGsrKykKKyAgICAgICAgYmxvY2tBW2NvdW50KytdID0gbnVtZXh0Ojpjb25qKGxocyhrLCBpKSk7ICAgICAvLyB0cmFuc3Bvc2VkCisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgbnIsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3Qgc3ltbV9wYWNrX3JocworeworICBlbnVtIHsgUGFja2V0U2l6ZSA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSB9OworICB2b2lkIG9wZXJhdG9yKCkoU2NhbGFyKiBibG9ja0IsIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBrMikKKyAgeworICAgIEluZGV4IGVuZF9rID0gazIgKyByb3dzOworICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxTdG9yYWdlT3JkZXI+IHJocyhfcmhzLHJoc1N0cmlkZSk7CisgICAgSW5kZXggcGFja2V0X2NvbHM4ID0gbnI+PTggPyAoY29scy84KSAqIDggOiAwOworICAgIEluZGV4IHBhY2tldF9jb2xzNCA9IG5yPj00ID8gKGNvbHMvNCkgKiA0IDogMDsKKworICAgIC8vIGZpcnN0IHBhcnQ6IG5vcm1hbCBjYXNlCisgICAgZm9yKEluZGV4IGoyPTA7IGoyPGsyOyBqMis9bnIpCisgICAgeworICAgICAgZm9yKEluZGV4IGs9azI7IGs8ZW5kX2s7IGsrKykKKyAgICAgIHsKKyAgICAgICAgYmxvY2tCW2NvdW50KzBdID0gcmhzKGssajIrMCk7CisgICAgICAgIGJsb2NrQltjb3VudCsxXSA9IHJocyhrLGoyKzEpOworICAgICAgICBpZiAobnI+PTQpCisgICAgICAgIHsKKyAgICAgICAgICBibG9ja0JbY291bnQrMl0gPSByaHMoayxqMisyKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrM10gPSByaHMoayxqMiszKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnI+PTgpCisgICAgICAgIHsKKyAgICAgICAgICBibG9ja0JbY291bnQrNF0gPSByaHMoayxqMis0KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNV0gPSByaHMoayxqMis1KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNl0gPSByaHMoayxqMis2KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrN10gPSByaHMoayxqMis3KTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCArPSBucjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZWNvbmQgcGFydDogZGlhZ29uYWwgYmxvY2sKKyAgICBJbmRleCBlbmQ4ID0gbnI+PTggPyAoc3RkOjptaW4pKGsyK3Jvd3MscGFja2V0X2NvbHM4KSA6IGsyOworICAgIGlmKG5yPj04KQorICAgIHsKKyAgICAgIGZvcihJbmRleCBqMj1rMjsgajI8ZW5kODsgajIrPTgpCisgICAgICB7CisgICAgICAgIC8vIGFnYWluIHdlIGNhbiBzcGxpdCB2ZXJ0aWNhbGx5IGluIHRocmVlIGRpZmZlcmVudCBwYXJ0cyAodHJhbnNwb3NlLCBzeW1tZXRyaWMsIG5vcm1hbCkKKyAgICAgICAgLy8gdHJhbnNwb3NlCisgICAgICAgIGZvcihJbmRleCBrPWsyOyBrPGoyOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICBibG9ja0JbY291bnQrMF0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzAsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCsxXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMSxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gbnVtZXh0Ojpjb25qKHJocyhqMisyLGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrM10gPSBudW1leHQ6OmNvbmoocmhzKGoyKzMsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCs0XSA9IG51bWV4dDo6Y29uaihyaHMoajIrNCxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzVdID0gbnVtZXh0Ojpjb25qKHJocyhqMis1LGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNl0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzYsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCs3XSA9IG51bWV4dDo6Y29uaihyaHMoajIrNyxrKSk7CisgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgfQorICAgICAgICAvLyBzeW1tZXRyaWMKKyAgICAgICAgSW5kZXggaCA9IDA7CisgICAgICAgIGZvcihJbmRleCBrPWoyOyBrPGoyKzg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIC8vIG5vcm1hbAorICAgICAgICAgIGZvciAoSW5kZXggdz0wIDsgdzxoOyArK3cpCisgICAgICAgICAgICBibG9ja0JbY291bnQrd10gPSByaHMoayxqMit3KTsKKworICAgICAgICAgIGJsb2NrQltjb3VudCtoXSA9IG51bWV4dDo6cmVhbChyaHMoayxrKSk7CisKKyAgICAgICAgICAvLyB0cmFuc3Bvc2UKKyAgICAgICAgICBmb3IgKEluZGV4IHc9aCsxIDsgdzw4OyArK3cpCisgICAgICAgICAgICBibG9ja0JbY291bnQrd10gPSBudW1leHQ6OmNvbmoocmhzKGoyK3csaykpOworICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgKytoOworICAgICAgICB9CisgICAgICAgIC8vIG5vcm1hbAorICAgICAgICBmb3IoSW5kZXggaz1qMis4OyBrPGVuZF9rOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICBibG9ja0JbY291bnQrMF0gPSByaHMoayxqMiswKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrMV0gPSByaHMoayxqMisxKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrMl0gPSByaHMoayxqMisyKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrM10gPSByaHMoayxqMiszKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNF0gPSByaHMoayxqMis0KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNV0gPSByaHMoayxqMis1KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNl0gPSByaHMoayxqMis2KTsKKyAgICAgICAgICBibG9ja0JbY291bnQrN10gPSByaHMoayxqMis3KTsKKyAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKG5yPj00KQorICAgIHsKKyAgICAgIGZvcihJbmRleCBqMj1lbmQ4OyBqMjwoc3RkOjptaW4pKGsyK3Jvd3MscGFja2V0X2NvbHM0KTsgajIrPTQpCisgICAgICB7CisgICAgICAgIC8vIGFnYWluIHdlIGNhbiBzcGxpdCB2ZXJ0aWNhbGx5IGluIHRocmVlIGRpZmZlcmVudCBwYXJ0cyAodHJhbnNwb3NlLCBzeW1tZXRyaWMsIG5vcm1hbCkKKyAgICAgICAgLy8gdHJhbnNwb3NlCisgICAgICAgIGZvcihJbmRleCBrPWsyOyBrPGoyOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICBibG9ja0JbY291bnQrMF0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzAsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCsxXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMSxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gbnVtZXh0Ojpjb25qKHJocyhqMisyLGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrM10gPSBudW1leHQ6OmNvbmoocmhzKGoyKzMsaykpOworICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3ltbWV0cmljCisgICAgICAgIEluZGV4IGggPSAwOworICAgICAgICBmb3IoSW5kZXggaz1qMjsgazxqMis0OyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAvLyBub3JtYWwKKyAgICAgICAgICBmb3IgKEluZGV4IHc9MCA7IHc8aDsgKyt3KQorICAgICAgICAgICAgYmxvY2tCW2NvdW50K3ddID0gcmhzKGssajIrdyk7CisKKyAgICAgICAgICBibG9ja0JbY291bnQraF0gPSBudW1leHQ6OnJlYWwocmhzKGssaykpOworCisgICAgICAgICAgLy8gdHJhbnNwb3NlCisgICAgICAgICAgZm9yIChJbmRleCB3PWgrMSA7IHc8NDsgKyt3KQorICAgICAgICAgICAgYmxvY2tCW2NvdW50K3ddID0gbnVtZXh0Ojpjb25qKHJocyhqMit3LGspKTsKKyAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICsraDsKKyAgICAgICAgfQorICAgICAgICAvLyBub3JtYWwKKyAgICAgICAgZm9yKEluZGV4IGs9ajIrNDsgazxlbmRfazsgaysrKQorICAgICAgICB7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzBdID0gcmhzKGssajIrMCk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gcmhzKGssajIrMSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gcmhzKGssajIrMik7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzNdID0gcmhzKGssajIrMyk7CisgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIHRoaXJkIHBhcnQ6IHRyYW5zcG9zZWQKKyAgICBpZihucj49OCkKKyAgICB7CisgICAgICBmb3IoSW5kZXggajI9azIrcm93czsgajI8cGFja2V0X2NvbHM4OyBqMis9OCkKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGs9azI7IGs8ZW5kX2s7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrQltjb3VudCswXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMCxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gbnVtZXh0Ojpjb25qKHJocyhqMisxLGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrMl0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzIsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMyxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzRdID0gbnVtZXh0Ojpjb25qKHJocyhqMis0LGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrNV0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzUsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCs2XSA9IG51bWV4dDo6Y29uaihyaHMoajIrNixrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzddID0gbnVtZXh0Ojpjb25qKHJocyhqMis3LGspKTsKKyAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKG5yPj00KQorICAgIHsKKyAgICAgIGZvcihJbmRleCBqMj0oc3RkOjptYXgpKHBhY2tldF9jb2xzOCxrMityb3dzKTsgajI8cGFja2V0X2NvbHM0OyBqMis9NCkKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGs9azI7IGs8ZW5kX2s7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrQltjb3VudCswXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMCxrKSk7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gbnVtZXh0Ojpjb25qKHJocyhqMisxLGspKTsKKyAgICAgICAgICBibG9ja0JbY291bnQrMl0gPSBudW1leHQ6OmNvbmoocmhzKGoyKzIsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IG51bWV4dDo6Y29uaihyaHMoajIrMyxrKSk7CisgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIGNvcHkgdGhlIHJlbWFpbmluZyBjb2x1bW5zIG9uZSBhdCBhIHRpbWUgKD0+IHRoZSBzYW1lIHdpdGggbnI9PTEpCisgICAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzNDsgajI8Y29sczsgKytqMikKKyAgICB7CisgICAgICAvLyB0cmFuc3Bvc2UKKyAgICAgIEluZGV4IGhhbGYgPSAoc3RkOjptaW4pKGVuZF9rLGoyKTsKKyAgICAgIGZvcihJbmRleCBrPWsyOyBrPGhhbGY7IGsrKykKKyAgICAgIHsKKyAgICAgICAgYmxvY2tCW2NvdW50XSA9IG51bWV4dDo6Y29uaihyaHMoajIsaykpOworICAgICAgICBjb3VudCArPSAxOworICAgICAgfQorCisgICAgICBpZihoYWxmPT1qMiAmJiBoYWxmPGsyK3Jvd3MpCisgICAgICB7CisgICAgICAgIGJsb2NrQltjb3VudF0gPSBudW1leHQ6OnJlYWwocmhzKGoyLGoyKSk7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGhhbGYtLTsKKworICAgICAgLy8gbm9ybWFsCisgICAgICBmb3IoSW5kZXggaz1oYWxmKzE7IGs8azIrcm93czsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnRdID0gcmhzKGssajIpOworICAgICAgICBjb3VudCArPSAxOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLyogT3B0aW1pemVkIHNlbGZhZGpvaW50IG1hdHJpeCAqIG1hdHJpeCAoX1NZTU0pIHByb2R1Y3QgYnVpbHQgb24gdG9wIG9mCisgKiB0aGUgZ2VuZXJhbCBtYXRyaXggbWF0cml4IHByb2R1Y3QuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgTGhzU2VsZkFkam9pbnQsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgUmhzU2VsZkFkam9pbnQsIGJvb2wgQ29uanVnYXRlUmhzLAorICAgICAgICAgIGludCBSZXNTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgTGhzU2VsZkFkam9pbnQsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgUmhzU2VsZkFkam9pbnQsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixJbmRleCxMaHNTdG9yYWdlT3JkZXIsTGhzU2VsZkFkam9pbnQsQ29uanVnYXRlTGhzLCBSaHNTdG9yYWdlT3JkZXIsUmhzU2VsZkFkam9pbnQsQ29uanVnYXRlUmhzLFJvd01ham9yPgoreworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsCisgICAgY29uc3QgU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXIqIHJocywgSW5kZXggcmhzU3RyaWRlLAorICAgIFNjYWxhciogcmVzLCAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgSW5kZXgsCisgICAgICBFSUdFTl9MT0dJQ0FMX1hPUihSaHNTZWxmQWRqb2ludCxSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/IENvbE1ham9yIDogUm93TWFqb3IsCisgICAgICBSaHNTZWxmQWRqb2ludCwgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihSaHNTZWxmQWRqb2ludCxDb25qdWdhdGVSaHMpLAorICAgICAgRUlHRU5fTE9HSUNBTF9YT1IoTGhzU2VsZkFkam9pbnQsTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyBDb2xNYWpvciA6IFJvd01ham9yLAorICAgICAgTGhzU2VsZkFkam9pbnQsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgRUlHRU5fTE9HSUNBTF9YT1IoTGhzU2VsZkFkam9pbnQsQ29uanVnYXRlTGhzKSwKKyAgICAgIENvbE1ham9yPgorICAgICAgOjpydW4oY29scywgcm93cywgIHJocywgcmhzU3RyaWRlLCAgbGhzLCBsaHNTdHJpZGUsICByZXMsIHJlc1N0cmlkZSwgIGFscGhhLCBibG9ja2luZyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixJbmRleCxMaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVMaHMsIFJoc1N0b3JhZ2VPcmRlcixmYWxzZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+Cit7CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsCisgICAgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZyk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLEluZGV4LExoc1N0b3JhZ2VPcmRlcix0cnVlLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj46OnJ1bigKKyAgICBJbmRleCByb3dzLCBJbmRleCBjb2xzLAorICAgIGNvbnN0IFNjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLAorICAgIFNjYWxhciogX3JlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXImIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgSW5kZXggc2l6ZSA9IHJvd3M7CisKKyAgICB0eXBlZGVmIGdlYnBfdHJhaXRzPFNjYWxhcixTY2FsYXI+IFRyYWl0czsKKworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBMaHNTdG9yYWdlT3JkZXI+IExoc01hcHBlcjsKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgKExoc1N0b3JhZ2VPcmRlciA9PSBSb3dNYWpvcikgPyBDb2xNYWpvciA6IFJvd01ham9yPiBMaHNUcmFuc3Bvc2VNYXBwZXI7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIFJoc1N0b3JhZ2VPcmRlcj4gUmhzTWFwcGVyOworICAgIHR5cGVkZWYgYmxhc19kYXRhX21hcHBlcjx0eXBlbmFtZSBUcmFpdHM6OlJlc1NjYWxhciwgSW5kZXgsIENvbE1ham9yPiBSZXNNYXBwZXI7CisgICAgTGhzTWFwcGVyIGxocyhfbGhzLGxoc1N0cmlkZSk7CisgICAgTGhzVHJhbnNwb3NlTWFwcGVyIGxoc190cmFuc3Bvc2UoX2xocyxsaHNTdHJpZGUpOworICAgIFJoc01hcHBlciByaHMoX3JocyxyaHNTdHJpZGUpOworICAgIFJlc01hcHBlciByZXMoX3JlcywgcmVzU3RyaWRlKTsKKworICAgIEluZGV4IGtjID0gYmxvY2tpbmcua2MoKTsgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgSyBkaXJlY3Rpb24KKyAgICBJbmRleCBtYyA9IChzdGQ6Om1pbikocm93cyxibG9ja2luZy5tYygpKTsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisgICAgLy8ga2MgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWMKKyAgICBrYyA9IChzdGQ6Om1pbikoa2MsbWMpOworICAgIHN0ZDo6c2l6ZV90IHNpemVBID0ga2MqbWM7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBrYypjb2xzOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQSwgc2l6ZUEsIGJsb2NraW5nLmJsb2NrQSgpKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0IsIHNpemVCLCBibG9ja2luZy5ibG9ja0IoKSk7CisKKyAgICBnZWJwX2tlcm5lbDxTY2FsYXIsIFNjYWxhciwgSW5kZXgsIFJlc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnBfa2VybmVsOworICAgIHN5bW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFJoc01hcHBlciwgVHJhaXRzOjpucixSaHNTdG9yYWdlT3JkZXI+IHBhY2tfcmhzOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgTGhzVHJhbnNwb3NlTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yP0NvbE1ham9yOlJvd01ham9yLCB0cnVlPiBwYWNrX2xoc190cmFuc3Bvc2VkOworCisgICAgZm9yKEluZGV4IGsyPTA7IGsyPHNpemU7IGsyKz1rYykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfa2MgPSAoc3RkOjptaW4pKGsyK2tjLHNpemUpLWsyOworCisgICAgICAvLyB3ZSBoYXZlIHNlbGVjdGVkIG9uZSByb3cgcGFuZWwgb2YgcmhzIGFuZCBvbmUgY29sdW1uIHBhbmVsIG9mIGxocworICAgICAgLy8gcGFjayByaHMncyBwYW5lbCBpbnRvIGEgc2VxdWVudGlhbCBjaHVuayBvZiBtZW1vcnkKKyAgICAgIC8vIGFuZCBleHBhbmQgZWFjaCBjb2VmZiB0byBhIGNvbnN0YW50IHBhY2tldCBmb3IgZnVydGhlciByZXVzZQorICAgICAgcGFja19yaHMoYmxvY2tCLCByaHMuZ2V0U3ViTWFwcGVyKGsyLDApLCBhY3R1YWxfa2MsIGNvbHMpOworCisgICAgICAvLyB0aGUgc2VsZWN0IGxocydzIHBhbmVsIGhhcyB0byBiZSBzcGxpdCBpbiB0aHJlZSBkaWZmZXJlbnQgcGFydHM6CisgICAgICAvLyAgMSAtIHRoZSB0cmFuc3Bvc2VkIHBhbmVsIGFib3ZlIHRoZSBkaWFnb25hbCBibG9jayA9PiB0cmFuc3Bvc2VkIHBhY2tlZCBjb3B5CisgICAgICAvLyAgMiAtIHRoZSBkaWFnb25hbCBibG9jayA9PiBzcGVjaWFsIHBhY2tlZCBjb3B5CisgICAgICAvLyAgMyAtIHRoZSBwYW5lbCBiZWxvdyB0aGUgZGlhZ29uYWwgYmxvY2sgPT4gZ2VuZXJpYyBwYWNrZWQgY29weQorICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPGsyOyBpMis9bWMpCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikoaTIrbWMsazIpLWkyOworICAgICAgICAvLyB0cmFuc3Bvc2VkIHBhY2tlZCBjb3B5CisgICAgICAgIHBhY2tfbGhzX3RyYW5zcG9zZWQoYmxvY2tBLCBsaHNfdHJhbnNwb3NlLmdldFN1Yk1hcHBlcihpMiwgazIpLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgZ2VicF9rZXJuZWwocmVzLmdldFN1Yk1hcHBlcihpMiwgMCksIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgY29scywgYWxwaGEpOworICAgICAgfQorICAgICAgLy8gdGhlIGJsb2NrIGRpYWdvbmFsCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikoazIra2Msc2l6ZSktazI7CisgICAgICAgIC8vIHN5bW1ldHJpYyBwYWNrZWQgY29weQorICAgICAgICBwYWNrX2xocyhibG9ja0EsICZsaHMoazIsazIpLCBsaHNTdHJpZGUsIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICBnZWJwX2tlcm5lbChyZXMuZ2V0U3ViTWFwcGVyKGsyLCAwKSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBjb2xzLCBhbHBoYSk7CisgICAgICB9CisKKyAgICAgIGZvcihJbmRleCBpMj1rMitrYzsgaTI8c2l6ZTsgaTIrPW1jKQorICAgICAgeworICAgICAgICBjb25zdCBJbmRleCBhY3R1YWxfbWMgPSAoc3RkOjptaW4pKGkyK21jLHNpemUpLWkyOworICAgICAgICBnZW1tX3BhY2tfbGhzPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyLGZhbHNlPigpCisgICAgICAgICAgKGJsb2NrQSwgbGhzLmdldFN1Yk1hcHBlcihpMiwgazIpLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgZ2VicF9rZXJuZWwocmVzLmdldFN1Yk1hcHBlcihpMiwgMCksIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgY29scywgYWxwaGEpOworICAgICAgfQorICAgIH0KKyAgfQorCisvLyBtYXRyaXggKiBzZWxmYWRqb2ludCBwcm9kdWN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsSW5kZXgsTGhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLHRydWUsQ29uanVnYXRlUmhzLENvbE1ham9yPgoreworCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCByb3dzLCBJbmRleCBjb2xzLAorICAgIGNvbnN0IFNjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLAorICAgIFNjYWxhciogcmVzLCAgICAgICAgSW5kZXggcmVzU3RyaWRlLAorICAgIGNvbnN0IFNjYWxhciYgYWxwaGEsIGxldmVsM19ibG9ja2luZzxTY2FsYXIsU2NhbGFyPiYgYmxvY2tpbmcpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixJbmRleCxMaHNTdG9yYWdlT3JkZXIsZmFsc2UsQ29uanVnYXRlTGhzLCBSaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+OjpydW4oCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgICBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIF9yZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIEluZGV4IHNpemUgPSBjb2xzOworCisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IFJlc01hcHBlcjsKKyAgICBMaHNNYXBwZXIgbGhzKF9saHMsbGhzU3RyaWRlKTsKKyAgICBSZXNNYXBwZXIgcmVzKF9yZXMscmVzU3RyaWRlKTsKKworICAgIEluZGV4IGtjID0gYmxvY2tpbmcua2MoKTsgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgSyBkaXJlY3Rpb24KKyAgICBJbmRleCBtYyA9IChzdGQ6Om1pbikocm93cyxibG9ja2luZy5tYygpKTsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisgICAgc3RkOjpzaXplX3Qgc2l6ZUEgPSBrYyptYzsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IGtjKmNvbHM7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKworICAgIGdlYnBfa2VybmVsPFNjYWxhciwgU2NhbGFyLCBJbmRleCwgUmVzTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBDb25qdWdhdGVMaHMsIENvbmp1Z2F0ZVJocz4gZ2VicF9rZXJuZWw7CisgICAgZ2VtbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBMaHNNYXBwZXIsIFRyYWl0czo6bXIsIFRyYWl0czo6TGhzUHJvZ3Jlc3MsIExoc1N0b3JhZ2VPcmRlcj4gcGFja19saHM7CisgICAgc3ltbV9wYWNrX3JoczxTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om5yLFJoc1N0b3JhZ2VPcmRlcj4gcGFja19yaHM7CisKKyAgICBmb3IoSW5kZXggazI9MDsgazI8c2l6ZTsgazIrPWtjKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9rYyA9IChzdGQ6Om1pbikoazIra2Msc2l6ZSktazI7CisKKyAgICAgIHBhY2tfcmhzKGJsb2NrQiwgX3JocywgcmhzU3RyaWRlLCBhY3R1YWxfa2MsIGNvbHMsIGsyKTsKKworICAgICAgLy8gPT4gR0VQUAorICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPHJvd3M7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxyb3dzKS1pMjsKKyAgICAgICAgcGFja19saHMoYmxvY2tBLCBsaHMuZ2V0U3ViTWFwcGVyKGkyLCBrMiksIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICBnZWJwX2tlcm5lbChyZXMuZ2V0U3ViTWFwcGVyKGkyLCAwKSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBjb2xzLCBhbHBoYSk7CisgICAgICB9CisgICAgfQorICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyYXBwZXIgdG8gcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIGludCBMaHNNb2RlLCB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlPgorc3RydWN0IHNlbGZhZGpvaW50X3Byb2R1Y3RfaW1wbDxMaHMsTGhzTW9kZSxmYWxzZSxSaHMsUmhzTW9kZSxmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICAKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIExoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsTGhzVHlwZTsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8UmhzPiBSaHNCbGFzVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFJoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsUmhzVHlwZTsKKyAgCisgIGVudW0geworICAgIExoc0lzVXBwZXIgPSAoTGhzTW9kZSYoVXBwZXJ8TG93ZXIpKT09VXBwZXIsCisgICAgTGhzSXNTZWxmQWRqb2ludCA9IChMaHNNb2RlJlNlbGZBZGpvaW50KT09U2VsZkFkam9pbnQsCisgICAgUmhzSXNVcHBlciA9IChSaHNNb2RlJihVcHBlcnxMb3dlcikpPT1VcHBlciwKKyAgICBSaHNJc1NlbGZBZGpvaW50ID0gKFJoc01vZGUmU2VsZkFkam9pbnQpPT1TZWxmQWRqb2ludAorICB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgcnVuKERlc3QgJmRzdCwgY29uc3QgTGhzICZhX2xocywgY29uc3QgUmhzICZhX3JocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpPT1hX2xocy5yb3dzKCkgJiYgZHN0LmNvbHMoKT09YV9yaHMuY29scygpKTsKKworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxMaHNUeXBlPjo6dHlwZSBsaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KGFfbGhzKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgcmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChhX3Jocyk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IoYV9saHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKGFfcmhzKTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8KERlc3Q6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsU2NhbGFyLFNjYWxhciwKKyAgICAgICAgICAgICAgTGhzOjpNYXhSb3dzQXRDb21waWxlVGltZSwgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZSwgTGhzOjpNYXhDb2xzQXRDb21waWxlVGltZSwxPiBCbG9ja2luZ1R5cGU7CisKKyAgICBCbG9ja2luZ1R5cGUgYmxvY2tpbmcobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSwgbGhzLmNvbHMoKSwgMSwgZmFsc2UpOworCisgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgSW5kZXgsCisgICAgICBFSUdFTl9MT0dJQ0FMX1hPUihMaHNJc1VwcGVyLGludGVybmFsOjp0cmFpdHM8TGhzPjo6RmxhZ3MgJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsIExoc0lzU2VsZkFkam9pbnQsCisgICAgICBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIEVJR0VOX0xPR0lDQUxfWE9SKExoc0lzVXBwZXIsYm9vbChMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUpKSwKKyAgICAgIEVJR0VOX0xPR0lDQUxfWE9SKFJoc0lzVXBwZXIsaW50ZXJuYWw6OnRyYWl0czxSaHM+OjpGbGFncyAmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgUmhzSXNTZWxmQWRqb2ludCwKKyAgICAgIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgRUlHRU5fTE9HSUNBTF9YT1IoUmhzSXNVcHBlcixib29sKFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSkpLAorICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXN0Pjo6RmxhZ3MmUm93TWFqb3JCaXQgID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKAorICAgICAgICBsaHMucm93cygpLCByaHMuY29scygpLCAgICAgICAgICAgICAgICAgLy8gc2l6ZXMKKyAgICAgICAgJmxocy5jb2VmZlJlZigwLDApLCBsaHMub3V0ZXJTdHJpZGUoKSwgIC8vIGxocyBpbmZvCisgICAgICAgICZyaHMuY29lZmZSZWYoMCwwKSwgcmhzLm91dGVyU3RyaWRlKCksICAvLyByaHMgaW5mbworICAgICAgICAmZHN0LmNvZWZmUmVmKDAsMCksIGRzdC5vdXRlclN0cmlkZSgpLCAgLy8gcmVzdWx0IGluZm8KKyAgICAgICAgYWN0dWFsQWxwaGEsIGJsb2NraW5nICAgICAgICAgICAgICAgICAgIC8vIGFscGhhCisgICAgICApOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4X0JMQVMuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4X0JMQVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDUyMzhkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhNYXRyaXhfQkxBUy5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBCTEFTIEY3NworICogICBTZWxmIGFkam9pbnQgbWF0cml4ICogbWF0cml4IHByb2R1Y3QgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiA/U1lNTS8/SEVNTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfTUFUUklYX0JMQVNfSAorI2RlZmluZSBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfTUFUUklYX0JMQVNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworCisvKiBPcHRpbWl6ZWQgc2VsZmFkam9pbnQgbWF0cml4ICogbWF0cml4ICg/U1lNTS8/SEVNTSkgcHJvZHVjdCAqLworCisjZGVmaW5lIEVJR0VOX0JMQVNfU1lNTV9MKEVJR1RZUEUsIEJMQVNUWVBFLCBFSUdQUkVGSVgsIEJMQVNQUkVGSVgpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgXAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBcCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+IFwKK3N0cnVjdCBwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxFSUdUWVBFLEluZGV4LExoc1N0b3JhZ2VPcmRlcix0cnVlLENvbmp1Z2F0ZUxocyxSaHNTdG9yYWdlT3JkZXIsZmFsc2UsQ29uanVnYXRlUmhzLENvbE1ham9yPiBcCit7XAorXAorICBzdGF0aWMgdm9pZCBydW4oIFwKKyAgICBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBcCisgICAgY29uc3QgRUlHVFlQRSogX2xocywgSW5kZXggbGhzU3RyaWRlLCBcCisgICAgY29uc3QgRUlHVFlQRSogX3JocywgSW5kZXggcmhzU3RyaWRlLCBcCisgICAgRUlHVFlQRSogcmVzLCAgICAgICAgSW5kZXggcmVzU3RyaWRlLCBcCisgICAgRUlHVFlQRSBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPEVJR1RZUEUsIEVJR1RZUEU+JiAvKmJsb2NraW5nKi8pIFwKKyAgeyBcCisgICAgY2hhciBzaWRlPSdMJywgdXBsbz0nTCc7IFwKKyAgICBCbGFzSW5kZXggbSwgbiwgbGRhLCBsZGIsIGxkYzsgXAorICAgIGNvbnN0IEVJR1RZUEUgKmEsICpiOyBcCisgICAgRUlHVFlQRSBiZXRhKDEpOyBcCisgICAgTWF0cml4WCMjRUlHUFJFRklYIGJfdG1wOyBcCitcCisvKiBTZXQgdHJhbnNwb3NlIG9wdGlvbnMgKi8gXAorLyogU2V0IG0sIG4sIGsgKi8gXAorICAgIG0gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cyk7ICBcCisgICAgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4Pihjb2xzKTsgIFwKK1wKKy8qIFNldCBsZGEsIGxkYiwgbGRjICovIFwKKyAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4obGhzU3RyaWRlKTsgXAorICAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihyaHNTdHJpZGUpOyBcCisgICAgbGRjID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc1N0cmlkZSk7IFwKK1wKKy8qIFNldCBhLCBiLCBjICovIFwKKyAgICBpZiAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbz0nVSc7IFwKKyAgICBhID0gX2xoczsgXAorXAorICAgIGlmIChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB7IFwKKyAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxuLG0sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgYl90bXAgPSByaHMuYWRqb2ludCgpOyBcCisgICAgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICAgICBsZGIgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oYl90bXAub3V0ZXJTdHJpZGUoKSk7IFwKKyAgICB9IGVsc2UgYiA9IF9yaHM7IFwKK1wKKyAgICBCTEFTUFJFRklYIyNzeW1tXygmc2lkZSwgJnVwbG8sICZtLCAmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChjb25zdCBCTEFTVFlQRSopYiwgJmxkYiwgJm51bWV4dDo6cmVhbF9yZWYoYmV0YSksIChCTEFTVFlQRSopcmVzLCAmbGRjKTsgXAorXAorICB9IFwKK307CisKKworI2RlZmluZSBFSUdFTl9CTEFTX0hFTU1fTChFSUdUWVBFLCBCTEFTVFlQRSwgRUlHUFJFRklYLCBCTEFTUFJFRklYKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8RUlHVFlQRSxJbmRleCxMaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVMaHMsUmhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAore1wKKyAgc3RhdGljIHZvaWQgcnVuKCBcCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLCBFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nTCcsIHVwbG89J0wnOyBcCisgICAgQmxhc0luZGV4IG0sIG4sIGxkYSwgbGRiLCBsZGM7IFwKKyAgICBjb25zdCBFSUdUWVBFICphLCAqYjsgXAorICAgIEVJR1RZUEUgYmV0YSgxKTsgXAorICAgIE1hdHJpeFgjI0VJR1BSRUZJWCBiX3RtcDsgXAorICAgIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBMaHNTdG9yYWdlT3JkZXI+IGFfdG1wOyBcCitcCisvKiBTZXQgdHJhbnNwb3NlIG9wdGlvbnMgKi8gXAorLyogU2V0IG0sIG4sIGsgKi8gXAorICAgIG0gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cyk7IFwKKyAgICBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGNvbHMpOyBcCitcCisvKiBTZXQgbGRhLCBsZGIsIGxkYyAqLyBcCisgICAgbGRhID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGxoc1N0cmlkZSk7IFwKKyAgICBsZGIgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmhzU3RyaWRlKTsgXAorICAgIGxkYyA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihyZXNTdHJpZGUpOyBcCitcCisvKiBTZXQgYSwgYiwgYyAqLyBcCisgICAgaWYgKCgoTGhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlTGhzKSB8fCAoKExoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpICYmICghQ29uanVnYXRlTGhzKSkpIHsgXAorICAgICAgTWFwPGNvbnN0IE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBMaHNTdG9yYWdlT3JkZXI+LCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbSxtLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICAgIGFfdG1wID0gbGhzLmNvbmp1Z2F0ZSgpOyBcCisgICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oYV90bXAub3V0ZXJTdHJpZGUoKSk7IFwKKyAgICB9IGVsc2UgYSA9IF9saHM7IFwKKyAgICBpZiAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbz0nVSc7IFwKK1wKKyAgICBpZiAoUmhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvciAmJiAoIUNvbmp1Z2F0ZVJocykpIHsgXAorICAgICAgIGIgPSBfcmhzOyB9IFwKKyAgICBlbHNlIHsgXAorICAgICAgaWYgKFJoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IgJiYgQ29uanVnYXRlUmhzKSB7IFwKKyAgICAgICAgTWFwPGNvbnN0IE1hdHJpeFgjI0VJR1BSRUZJWCwgMCwgT3V0ZXJTdHJpZGU8PiA+IHJocyhfcmhzLG0sbixPdXRlclN0cmlkZTw+KHJoc1N0cmlkZSkpOyBcCisgICAgICAgIGJfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBcCisgICAgICB9IGVsc2UgXAorICAgICAgaWYgKENvbmp1Z2F0ZVJocykgeyBcCisgICAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxuLG0sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgICBiX3RtcCA9IHJocy5hZGpvaW50KCk7IFwKKyAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgTWFwPGNvbnN0IE1hdHJpeFgjI0VJR1BSRUZJWCwgMCwgT3V0ZXJTdHJpZGU8PiA+IHJocyhfcmhzLG4sbSxPdXRlclN0cmlkZTw+KHJoc1N0cmlkZSkpOyBcCisgICAgICAgIGJfdG1wID0gcmhzLnRyYW5zcG9zZSgpOyBcCisgICAgICB9IFwKKyAgICAgIGIgPSBiX3RtcC5kYXRhKCk7IFwKKyAgICAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihiX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgIH0gXAorXAorICAgIEJMQVNQUkVGSVgjI2hlbW1fKCZzaWRlLCAmdXBsbywgJm0sICZuLCAmbnVtZXh0OjpyZWFsX3JlZihhbHBoYSksIChjb25zdCBCTEFTVFlQRSopYSwgJmxkYSwgKGNvbnN0IEJMQVNUWVBFKiliLCAmbGRiLCAmbnVtZXh0OjpyZWFsX3JlZihiZXRhKSwgKEJMQVNUWVBFKilyZXMsICZsZGMpOyBcCitcCisgIH0gXAorfTsKKworRUlHRU5fQkxBU19TWU1NX0woZG91YmxlLCBkb3VibGUsIGQsIGQpCitFSUdFTl9CTEFTX1NZTU1fTChmbG9hdCwgZmxvYXQsIGYsIHMpCitFSUdFTl9CTEFTX0hFTU1fTChkY29tcGxleCwgZG91YmxlLCBjZCwgeikKK0VJR0VOX0JMQVNfSEVNTV9MKHNjb21wbGV4LCBmbG9hdCwgY2YsIGMpCisKKworLyogT3B0aW1pemVkIG1hdHJpeCAqIHNlbGZhZGpvaW50IG1hdHJpeCAoP1NZTU0vP0hFTU0pIHByb2R1Y3QgKi8KKworI2RlZmluZSBFSUdFTl9CTEFTX1NZTU1fUihFSUdUWVBFLCBCTEFTVFlQRSwgRUlHUFJFRklYLCBCTEFTUFJFRklYKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8RUlHVFlQRSxJbmRleCxMaHNTdG9yYWdlT3JkZXIsZmFsc2UsQ29uanVnYXRlTGhzLFJoc1N0b3JhZ2VPcmRlcix0cnVlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAore1wKK1wKKyAgc3RhdGljIHZvaWQgcnVuKCBcCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLCBFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nUicsIHVwbG89J0wnOyBcCisgICAgQmxhc0luZGV4IG0sIG4sIGxkYSwgbGRiLCBsZGM7IFwKKyAgICBjb25zdCBFSUdUWVBFICphLCAqYjsgXAorICAgIEVJR1RZUEUgYmV0YSgxKTsgXAorICAgIE1hdHJpeFgjI0VJR1BSRUZJWCBiX3RtcDsgXAorXAorLyogU2V0IG0sIG4sIGsgKi8gXAorICAgIG0gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cyk7ICBcCisgICAgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4Pihjb2xzKTsgIFwKK1wKKy8qIFNldCBsZGEsIGxkYiwgbGRjICovIFwKKyAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmhzU3RyaWRlKTsgXAorICAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihsaHNTdHJpZGUpOyBcCisgICAgbGRjID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc1N0cmlkZSk7IFwKK1wKKy8qIFNldCBhLCBiLCBjICovIFwKKyAgICBpZiAoUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbz0nVSc7IFwKKyAgICBhID0gX3JoczsgXAorXAorICAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB7IFwKKyAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiBsaHMoX2xocyxuLG0sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgYl90bXAgPSBsaHMuYWRqb2ludCgpOyBcCisgICAgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICAgICBsZGIgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oYl90bXAub3V0ZXJTdHJpZGUoKSk7IFwKKyAgICB9IGVsc2UgYiA9IF9saHM7IFwKK1wKKyAgICBCTEFTUFJFRklYIyNzeW1tXygmc2lkZSwgJnVwbG8sICZtLCAmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChjb25zdCBCTEFTVFlQRSopYiwgJmxkYiwgJm51bWV4dDo6cmVhbF9yZWYoYmV0YSksIChCTEFTVFlQRSopcmVzLCAmbGRjKTsgXAorXAorICB9IFwKK307CisKKworI2RlZmluZSBFSUdFTl9CTEFTX0hFTU1fUihFSUdUWVBFLCBCTEFTVFlQRSwgRUlHUFJFRklYLCBCTEFTUFJFRklYKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8RUlHVFlQRSxJbmRleCxMaHNTdG9yYWdlT3JkZXIsZmFsc2UsQ29uanVnYXRlTGhzLFJoc1N0b3JhZ2VPcmRlcix0cnVlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAore1wKKyAgc3RhdGljIHZvaWQgcnVuKCBcCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLCBFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nUicsIHVwbG89J0wnOyBcCisgICAgQmxhc0luZGV4IG0sIG4sIGxkYSwgbGRiLCBsZGM7IFwKKyAgICBjb25zdCBFSUdUWVBFICphLCAqYjsgXAorICAgIEVJR1RZUEUgYmV0YSgxKTsgXAorICAgIE1hdHJpeFgjI0VJR1BSRUZJWCBiX3RtcDsgXAorICAgIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+IGFfdG1wOyBcCitcCisvKiBTZXQgbSwgbiwgayAqLyBcCisgICAgbSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4Pihyb3dzKTsgXAorICAgIG4gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oY29scyk7IFwKK1wKKy8qIFNldCBsZGEsIGxkYiwgbGRjICovIFwKKyAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmhzU3RyaWRlKTsgXAorICAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihsaHNTdHJpZGUpOyBcCisgICAgbGRjID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc1N0cmlkZSk7IFwKK1wKKy8qIFNldCBhLCBiLCBjICovIFwKKyAgICBpZiAoKChSaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSAmJiBDb25qdWdhdGVSaHMpIHx8ICgoUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgJiYgKCFDb25qdWdhdGVSaHMpKSkgeyBcCisgICAgICBNYXA8Y29uc3QgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIFJoc1N0b3JhZ2VPcmRlcj4sIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxuLG4sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgYV90bXAgPSByaHMuY29uanVnYXRlKCk7IFwKKyAgICAgIGEgPSBhX3RtcC5kYXRhKCk7IFwKKyAgICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgIH0gZWxzZSBhID0gX3JoczsgXAorICAgIGlmIChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB1cGxvPSdVJzsgXAorXAorICAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yICYmICghQ29uanVnYXRlTGhzKSkgeyBcCisgICAgICAgYiA9IF9saHM7IH0gXAorICAgIGVsc2UgeyBcCisgICAgICBpZiAoTGhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvciAmJiBDb25qdWdhdGVMaHMpIHsgXAorICAgICAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbSxuLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICAgICAgYl90bXAgPSBsaHMuY29uanVnYXRlKCk7IFwKKyAgICAgIH0gZWxzZSBcCisgICAgICBpZiAoQ29uanVnYXRlTGhzKSB7IFwKKyAgICAgICAgTWFwPGNvbnN0IE1hdHJpeFgjI0VJR1BSRUZJWCwgMCwgT3V0ZXJTdHJpZGU8PiA+IGxocyhfbGhzLG4sbSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICAgICAgIGJfdG1wID0gbGhzLmFkam9pbnQoKTsgXAorICAgICAgfSBlbHNlIHsgXAorICAgICAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbixtLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICAgICAgYl90bXAgPSBsaHMudHJhbnNwb3NlKCk7IFwKKyAgICAgIH0gXAorICAgICAgYiA9IGJfdG1wLmRhdGEoKTsgXAorICAgICAgbGRiID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGJfdG1wLm91dGVyU3RyaWRlKCkpOyBcCisgICAgfSBcCitcCisgICAgQkxBU1BSRUZJWCMjaGVtbV8oJnNpZGUsICZ1cGxvLCAmbSwgJm4sICZudW1leHQ6OnJlYWxfcmVmKGFscGhhKSwgKGNvbnN0IEJMQVNUWVBFKilhLCAmbGRhLCAoY29uc3QgQkxBU1RZUEUqKWIsICZsZGIsICZudW1leHQ6OnJlYWxfcmVmKGJldGEpLCAoQkxBU1RZUEUqKXJlcywgJmxkYyk7IFwKKyAgfSBcCit9OworCitFSUdFTl9CTEFTX1NZTU1fUihkb3VibGUsIGRvdWJsZSwgZCwgZCkKK0VJR0VOX0JMQVNfU1lNTV9SKGZsb2F0LCBmbG9hdCwgZiwgcykKK0VJR0VOX0JMQVNfSEVNTV9SKGRjb21wbGV4LCBkb3VibGUsIGNkLCB6KQorRUlHRU5fQkxBU19IRU1NX1Ioc2NvbXBsZXgsIGZsb2F0LCBjZiwgYykKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX01BVFJJWF9CTEFTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4VmVjdG9yLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDE4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvci5oCkBAIC0wLDAgKzEsMjYwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgc2VsZmFkam9pbnQgbWF0cml4ICogdmVjdG9yIHByb2R1Y3Q6CisgKiBUaGlzIGFsZ29yaXRobSBwcm9jZXNzZXMgMiBjb2x1bW5zIGF0IG9uY2VzIHRoYXQgYWxsb3dzIHRvIGJvdGggcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIGxvYWQvc3RvcmVzIG9mIHRoZSByZXN1bHQgYnkgYSBmYWN0b3IgMiBhbmQgdG8gcmVkdWNlCisgKiB0aGUgaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeS4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj1TcGVjaWFsaXplZD4KK3N0cnVjdCBzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBVcExvLCBib29sIENvbmp1Z2F0ZUxocywgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdAorCit7CitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgIEluZGV4IHNpemUsCisgIGNvbnN0IFNjYWxhciogIGxocywgSW5kZXggbGhzU3RyaWRlLAorICBjb25zdCBTY2FsYXIqICByaHMsCisgIFNjYWxhciogcmVzLAorICBTY2FsYXIgYWxwaGEpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFN0b3JhZ2VPcmRlciwgaW50IFVwTG8sIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocyxWZXJzaW9uPjo6cnVuKAorICBJbmRleCBzaXplLAorICBjb25zdCBTY2FsYXIqICBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgY29uc3QgU2NhbGFyKiAgcmhzLAorICBTY2FsYXIqIHJlcywKKyAgU2NhbGFyIGFscGhhKQoreworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgY29uc3QgSW5kZXggUGFja2V0U2l6ZSA9IHNpemVvZihQYWNrZXQpL3NpemVvZihTY2FsYXIpOworCisgIGVudW0geworICAgIElzUm93TWFqb3IgPSBTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gMSA6IDAsCisgICAgSXNMb3dlciA9IFVwTG8gPT0gTG93ZXIgPyAxIDogMCwKKyAgICBGaXJzdFRyaWFuZ3VsYXIgPSBJc1Jvd01ham9yID09IElzTG93ZXIKKyAgfTsKKworICBjb25qX2hlbHBlcjxTY2FsYXIsU2NhbGFyLE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgRUlHRU5fTE9HSUNBTF9YT1IoQ29uanVnYXRlTGhzLCAgSXNSb3dNYWpvciksIENvbmp1Z2F0ZVJocz4gY2owOworICBjb25qX2hlbHBlcjxTY2FsYXIsU2NhbGFyLE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgRUlHRU5fTE9HSUNBTF9YT1IoQ29uanVnYXRlTGhzLCAhSXNSb3dNYWpvciksIENvbmp1Z2F0ZVJocz4gY2oxOworICBjb25qX2hlbHBlcjxSZWFsU2NhbGFyLFNjYWxhcixmYWxzZSwgQ29uanVnYXRlUmhzPiBjamQ7CisKKyAgY29ual9oZWxwZXI8UGFja2V0LFBhY2tldCxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIEVJR0VOX0xPR0lDQUxfWE9SKENvbmp1Z2F0ZUxocywgIElzUm93TWFqb3IpLCBDb25qdWdhdGVSaHM+IHBjajA7CisgIGNvbmpfaGVscGVyPFBhY2tldCxQYWNrZXQsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihDb25qdWdhdGVMaHMsICFJc1Jvd01ham9yKSwgQ29uanVnYXRlUmhzPiBwY2oxOworCisgIFNjYWxhciBjakFscGhhID0gQ29uanVnYXRlUmhzID8gbnVtZXh0Ojpjb25qKGFscGhhKSA6IGFscGhhOworCisKKyAgSW5kZXggYm91bmQgPSAoc3RkOjptYXgpKEluZGV4KDApLHNpemUtOCkgJiAweGZmZmZmZmZlOworICBpZiAoRmlyc3RUcmlhbmd1bGFyKQorICAgIGJvdW5kID0gc2l6ZSAtIGJvdW5kOworCisgIGZvciAoSW5kZXggaj1GaXJzdFRyaWFuZ3VsYXIgPyBib3VuZCA6IDA7CisgICAgICAgajwoRmlyc3RUcmlhbmd1bGFyID8gc2l6ZSA6IGJvdW5kKTtqKz0yKQorICB7CisgICAgY29uc3QgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCBBMCA9IGxocyArIGoqbGhzU3RyaWRlOworICAgIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgQTEgPSBsaHMgKyAoaisxKSpsaHNTdHJpZGU7CisKKyAgICBTY2FsYXIgdDAgPSBjakFscGhhICogcmhzW2pdOworICAgIFBhY2tldCBwdG1wMCA9IHBzZXQxPFBhY2tldD4odDApOworICAgIFNjYWxhciB0MSA9IGNqQWxwaGEgKiByaHNbaisxXTsKKyAgICBQYWNrZXQgcHRtcDEgPSBwc2V0MTxQYWNrZXQ+KHQxKTsKKworICAgIFNjYWxhciB0MigwKTsKKyAgICBQYWNrZXQgcHRtcDIgPSBwc2V0MTxQYWNrZXQ+KHQyKTsKKyAgICBTY2FsYXIgdDMoMCk7CisgICAgUGFja2V0IHB0bXAzID0gcHNldDE8UGFja2V0Pih0Myk7CisKKyAgICBJbmRleCBzdGFydGkgPSBGaXJzdFRyaWFuZ3VsYXIgPyAwIDogaisyOworICAgIEluZGV4IGVuZGkgICA9IEZpcnN0VHJpYW5ndWxhciA/IGogOiBzaXplOworICAgIEluZGV4IGFsaWduZWRTdGFydCA9IChzdGFydGkpICsgaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZCgmcmVzW3N0YXJ0aV0sIGVuZGktc3RhcnRpKTsKKyAgICBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChlbmRpLWFsaWduZWRTdGFydCkvKFBhY2tldFNpemUpKSooUGFja2V0U2l6ZSk7CisKKyAgICByZXNbal0gICArPSBjamQucG11bChudW1leHQ6OnJlYWwoQTBbal0pLCB0MCk7CisgICAgcmVzW2orMV0gKz0gY2pkLnBtdWwobnVtZXh0OjpyZWFsKEExW2orMV0pLCB0MSk7CisgICAgaWYoRmlyc3RUcmlhbmd1bGFyKQorICAgIHsKKyAgICAgIHJlc1tqXSAgICs9IGNqMC5wbXVsKEExW2pdLCAgIHQxKTsKKyAgICAgIHQzICAgICAgICs9IGNqMS5wbXVsKEExW2pdLCAgIHJoc1tqXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXNbaisxXSArPSBjajAucG11bChBMFtqKzFdLHQwKTsKKyAgICAgIHQyICs9IGNqMS5wbXVsKEEwW2orMV0sIHJoc1tqKzFdKTsKKyAgICB9CisKKyAgICBmb3IgKEluZGV4IGk9c3RhcnRpOyBpPGFsaWduZWRTdGFydDsgKytpKQorICAgIHsKKyAgICAgIHJlc1tpXSArPSBjajAucG11bChBMFtpXSwgdDApICsgY2owLnBtdWwoQTFbaV0sdDEpOworICAgICAgdDIgKz0gY2oxLnBtdWwoQTBbaV0sIHJoc1tpXSk7CisgICAgICB0MyArPSBjajEucG11bChBMVtpXSwgcmhzW2ldKTsKKyAgICB9CisgICAgLy8gWWVzIHRoaXMgYW4gb3B0aW1pemF0aW9uIGZvciBnY2MgNC4zIGFuZCA0LjQgKD0+IGh1Z2Ugc3BlZWQgdXApCisgICAgLy8gZ2NjIDQuMiBkb2VzIHRoaXMgb3B0aW1pemF0aW9uIGF1dG9tYXRpY2FsbHkuCisgICAgY29uc3QgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCBhMEl0ICA9IEEwICArIGFsaWduZWRTdGFydDsKKyAgICBjb25zdCBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIGExSXQgID0gQTEgICsgYWxpZ25lZFN0YXJ0OworICAgIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgcmhzSXQgPSByaHMgKyBhbGlnbmVkU3RhcnQ7CisgICAgICAgICAgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCByZXNJdCA9IHJlcyArIGFsaWduZWRTdGFydDsKKyAgICBmb3IgKEluZGV4IGk9YWxpZ25lZFN0YXJ0OyBpPGFsaWduZWRFbmQ7IGkrPVBhY2tldFNpemUpCisgICAgeworICAgICAgUGFja2V0IEEwaSA9IHBsb2FkdTxQYWNrZXQ+KGEwSXQpOyAgYTBJdCAgKz0gUGFja2V0U2l6ZTsKKyAgICAgIFBhY2tldCBBMWkgPSBwbG9hZHU8UGFja2V0PihhMUl0KTsgIGExSXQgICs9IFBhY2tldFNpemU7CisgICAgICBQYWNrZXQgQmkgID0gcGxvYWR1PFBhY2tldD4ocmhzSXQpOyByaHNJdCArPSBQYWNrZXRTaXplOyAvLyBGSVhNRSBzaG91bGQgYmUgYWxpZ25lZCBpbiBtb3N0IGNhc2VzCisgICAgICBQYWNrZXQgWGkgID0gcGxvYWQgPFBhY2tldD4ocmVzSXQpOworCisgICAgICBYaSAgICA9IHBjajAucG1hZGQoQTBpLHB0bXAwLCBwY2owLnBtYWRkKEExaSxwdG1wMSxYaSkpOworICAgICAgcHRtcDIgPSBwY2oxLnBtYWRkKEEwaSwgIEJpLCBwdG1wMik7CisgICAgICBwdG1wMyA9IHBjajEucG1hZGQoQTFpLCAgQmksIHB0bXAzKTsKKyAgICAgIHBzdG9yZShyZXNJdCxYaSk7IHJlc0l0ICs9IFBhY2tldFNpemU7CisgICAgfQorICAgIGZvciAoSW5kZXggaT1hbGlnbmVkRW5kOyBpPGVuZGk7IGkrKykKKyAgICB7CisgICAgICByZXNbaV0gKz0gY2owLnBtdWwoQTBbaV0sIHQwKSArIGNqMC5wbXVsKEExW2ldLHQxKTsKKyAgICAgIHQyICs9IGNqMS5wbXVsKEEwW2ldLCByaHNbaV0pOworICAgICAgdDMgKz0gY2oxLnBtdWwoQTFbaV0sIHJoc1tpXSk7CisgICAgfQorCisgICAgcmVzW2pdICAgKz0gYWxwaGEgKiAodDIgKyBwcmVkdXgocHRtcDIpKTsKKyAgICByZXNbaisxXSArPSBhbHBoYSAqICh0MyArIHByZWR1eChwdG1wMykpOworICB9CisgIGZvciAoSW5kZXggaj1GaXJzdFRyaWFuZ3VsYXIgPyAwIDogYm91bmQ7ajwoRmlyc3RUcmlhbmd1bGFyID8gYm91bmQgOiBzaXplKTtqKyspCisgIHsKKyAgICBjb25zdCBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIEEwID0gbGhzICsgaipsaHNTdHJpZGU7CisKKyAgICBTY2FsYXIgdDEgPSBjakFscGhhICogcmhzW2pdOworICAgIFNjYWxhciB0MigwKTsKKyAgICByZXNbal0gKz0gY2pkLnBtdWwobnVtZXh0OjpyZWFsKEEwW2pdKSwgdDEpOworICAgIGZvciAoSW5kZXggaT1GaXJzdFRyaWFuZ3VsYXIgPyAwIDogaisxOyBpPChGaXJzdFRyaWFuZ3VsYXIgPyBqIDogc2l6ZSk7IGkrKykKKyAgICB7CisgICAgICByZXNbaV0gKz0gY2owLnBtdWwoQTBbaV0sIHQxKTsKKyAgICAgIHQyICs9IGNqMS5wbXVsKEEwW2ldLCByaHNbaV0pOworICAgIH0KKyAgICByZXNbal0gKz0gYWxwaGEgKiB0MjsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JhcHBlciB0byBwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIGludCBMaHNNb2RlLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcHJvZHVjdF9pbXBsPExocyxMaHNNb2RlLGZhbHNlLFJocywwLHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzPjo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPExocz4gTGhzQmxhc1RyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbExoc1R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsTGhzVHlwZT46OnR5cGUgQWN0dWFsTGhzVHlwZUNsZWFuZWQ7CisgIAorICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxSaHM+IFJoc0JsYXNUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxSaHNUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJoc1R5cGU+Ojp0eXBlIEFjdHVhbFJoc1R5cGVDbGVhbmVkOworCisgIGVudW0geyBMaHNVcExvID0gTGhzTW9kZSYoVXBwZXJ8TG93ZXIpIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgcnVuKERlc3QmIGRlc3QsIGNvbnN0IExocyAmYV9saHMsIGNvbnN0IFJocyAmYV9yaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlNjYWxhciBSZXNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+LCBFSUdFTl9QTEFJTl9FTlVNX01JTihBbGlnbmVkTWF4LGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnNpemUpPiBNYXBwZWREZXN0OworICAgIAorICAgIGVpZ2VuX2Fzc2VydChkZXN0LnJvd3MoKT09YV9saHMucm93cygpICYmIGRlc3QuY29scygpPT1hX3Jocy5jb2xzKCkpOworCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbExoc1R5cGU+Ojp0eXBlIGxocyA9IExoc0JsYXNUcmFpdHM6OmV4dHJhY3QoYV9saHMpOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxSaHNUeXBlPjo6dHlwZSByaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KGFfcmhzKTsKKworICAgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihhX2xocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IoYV9yaHMpOworCisgICAgZW51bSB7CisgICAgICBFdmFsVG9EZXN0ID0gKERlc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSksCisgICAgICBVc2VSaHMgPSAoQWN0dWFsUmhzVHlwZUNsZWFuZWQ6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSkKKyAgICB9OworICAgIAorICAgIGludGVybmFsOjpnZW12X3N0YXRpY192ZWN0b3JfaWY8UmVzU2NhbGFyLERlc3Q6OlNpemVBdENvbXBpbGVUaW1lLERlc3Q6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFFdmFsVG9EZXN0PiBzdGF0aWNfZGVzdDsKKyAgICBpbnRlcm5hbDo6Z2Vtdl9zdGF0aWNfdmVjdG9yX2lmPFJoc1NjYWxhcixBY3R1YWxSaHNUeXBlQ2xlYW5lZDo6U2l6ZUF0Q29tcGlsZVRpbWUsQWN0dWFsUmhzVHlwZUNsZWFuZWQ6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFVc2VSaHM+IHN0YXRpY19yaHM7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoUmVzU2NhbGFyLGFjdHVhbERlc3RQdHIsZGVzdC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxUb0Rlc3QgPyBkZXN0LmRhdGEoKSA6IHN0YXRpY19kZXN0LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsYWN0dWFsUmhzUHRyLHJocy5zaXplKCksCisgICAgICAgIFVzZVJocyA/IGNvbnN0X2Nhc3Q8UmhzU2NhbGFyKj4ocmhzLmRhdGEoKSkgOiBzdGF0aWNfcmhzLmRhdGEoKSk7CisgICAgCisgICAgaWYoIUV2YWxUb0Rlc3QpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIEluZGV4IHNpemUgPSBkZXN0LnNpemUoKTsKKyAgICAgIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgICNlbmRpZgorICAgICAgTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSkgPSBkZXN0OworICAgIH0KKyAgICAgIAorICAgIGlmKCFVc2VSaHMpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIEluZGV4IHNpemUgPSByaHMuc2l6ZSgpOworICAgICAgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTgorICAgICAgI2VuZGlmCisgICAgICBNYXA8dHlwZW5hbWUgQWN0dWFsUmhzVHlwZUNsZWFuZWQ6OlBsYWluT2JqZWN0PihhY3R1YWxSaHNQdHIsIHJocy5zaXplKCkpID0gcmhzOworICAgIH0KKyAgICAgIAorICAgICAgCisgICAgaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsIEluZGV4LCAoaW50ZXJuYWw6OnRyYWl0czxBY3R1YWxMaHNUeXBlQ2xlYW5lZD46OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoTGhzVXBMbyksIGJvb2woTGhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlKSwgYm9vbChSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUpPjo6cnVuCisgICAgICAoCisgICAgICAgIGxocy5yb3dzKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplCisgICAgICAgICZsaHMuY29lZmZSZWYoMCwwKSwgIGxocy5vdXRlclN0cmlkZSgpLCAvLyBsaHMgaW5mbworICAgICAgICBhY3R1YWxSaHNQdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmhzIGluZm8KKyAgICAgICAgYWN0dWFsRGVzdFB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBpbmZvCisgICAgICAgIGFjdHVhbEFscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBmYWN0b3IKKyAgICAgICk7CisgICAgCisgICAgaWYoIUV2YWxUb0Rlc3QpCisgICAgICBkZXN0ID0gTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUmhzTW9kZT4KK3N0cnVjdCBzZWxmYWRqb2ludF9wcm9kdWN0X2ltcGw8TGhzLDAsdHJ1ZSxSaHMsUmhzTW9kZSxmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsgUmhzVXBMbyA9IFJoc01vZGUmKFVwcGVyfExvd2VyKSAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oRGVzdCYgZGVzdCwgY29uc3QgTGhzICZhX2xocywgY29uc3QgUmhzICZhX3JocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIC8vIGxldCdzIHNpbXBseSB0cmFuc3Bvc2UgdGhlIHByb2R1Y3QKKyAgICBUcmFuc3Bvc2U8RGVzdD4gZGVzdFQoZGVzdCk7CisgICAgc2VsZmFkam9pbnRfcHJvZHVjdF9pbXBsPFRyYW5zcG9zZTxjb25zdCBSaHM+LCBpbnQoUmhzVXBMbyk9PVVwcGVyID8gTG93ZXIgOiBVcHBlciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9zZTxjb25zdCBMaHM+LCAwLCB0cnVlPjo6cnVuKGRlc3RULCBhX3Jocy50cmFuc3Bvc2UoKSwgYV9saHMudHJhbnNwb3NlKCksIGFscGhhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvcl9CTEFTLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvcl9CTEFTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMjNhYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4VmVjdG9yX0JMQVMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEJMQVMgRjc3CisgKiAgIFNlbGZhZGpvaW50IG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9TWU1WL0hFTVYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9CTEFTX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9CTEFTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNlbGZhZGpvaW50IG1hdHJpeC12ZWN0b3IgbXVsdGlwbGljYXRpb24gdXNpbmcgQkxBUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gc3ltdi9oZW12IHNwZWNpYWxpemF0aW9uCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBVcExvLCBib29sIENvbmp1Z2F0ZUxocywgYm9vbCBDb25qdWdhdGVSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3N5bXYgOgorICBzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U2NhbGFyLEluZGV4LFN0b3JhZ2VPcmRlcixVcExvLENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHMsQnVpbHRJbj4ge307CisKKyNkZWZpbmUgRUlHRU5fQkxBU19TWU1WX1NQRUNJQUxJWkUoU2NhbGFyKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IFN0b3JhZ2VPcmRlciwgaW50IFVwTG8sIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocyxTcGVjaWFsaXplZD4geyBcCitzdGF0aWMgdm9pZCBydW4oIFwKKyAgSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyKiAgbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgY29uc3QgU2NhbGFyKiBfcmhzLCBTY2FsYXIqIHJlcywgU2NhbGFyIGFscGhhKSB7IFwKKyAgICBlbnVtIHtcCisgICAgICBJc0NvbE1ham9yID0gU3RvcmFnZU9yZGVyPT1Db2xNYWpvciBcCisgICAgfTsgXAorICAgIGlmIChJc0NvbE1ham9yID09IENvbmp1Z2F0ZUxocykge1wKKyAgICAgIHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocyxCdWlsdEluPjo6cnVuKCBcCisgICAgICAgIHNpemUsIGxocywgbGhzU3RyaWRlLCBfcmhzLCByZXMsIGFscGhhKTsgIFwKKyAgICB9IGVsc2Uge1wKKyAgICAgIHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdF9zeW12PFNjYWxhcixJbmRleCxTdG9yYWdlT3JkZXIsVXBMbyxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPjo6cnVuKCBcCisgICAgICAgIHNpemUsIGxocywgbGhzU3RyaWRlLCBfcmhzLCByZXMsIGFscGhhKTsgIFwKKyAgICB9XAorICB9IFwKK307IFwKKworRUlHRU5fQkxBU19TWU1WX1NQRUNJQUxJWkUoZG91YmxlKQorRUlHRU5fQkxBU19TWU1WX1NQRUNJQUxJWkUoZmxvYXQpCitFSUdFTl9CTEFTX1NZTVZfU1BFQ0lBTElaRShkY29tcGxleCkKK0VJR0VOX0JMQVNfU1lNVl9TUEVDSUFMSVpFKHNjb21wbGV4KQorCisjZGVmaW5lIEVJR0VOX0JMQVNfU1lNVl9TUEVDSUFMSVpBVElPTihFSUdUWVBFLEJMQVNUWVBFLEJMQVNGVU5DKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IFN0b3JhZ2VPcmRlciwgaW50IFVwTG8sIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdF9zeW12PEVJR1RZUEUsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocz4gXAoreyBcCit0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLER5bmFtaWMsMSxDb2xNYWpvcj4gU1lNVlZlY3RvcjtcCitcCitzdGF0aWMgdm9pZCBydW4oIFwKK0luZGV4IHNpemUsIGNvbnN0IEVJR1RZUEUqICBsaHMsIEluZGV4IGxoc1N0cmlkZSwgXAorY29uc3QgRUlHVFlQRSogX3JocywgRUlHVFlQRSogcmVzLCBFSUdUWVBFIGFscGhhKSBcCit7IFwKKyAgZW51bSB7XAorICAgIElzUm93TWFqb3IgPSBTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gMSA6IDAsIFwKKyAgICBJc0xvd2VyID0gVXBMbyA9PSBMb3dlciA/IDEgOiAwIFwKKyAgfTsgXAorICBCbGFzSW5kZXggbj1jb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oc2l6ZSksIGxkYT1jb252ZXJ0X2luZGV4PEJsYXNJbmRleD4obGhzU3RyaWRlKSwgaW5jeD0xLCBpbmN5PTE7IFwKKyAgRUlHVFlQRSBiZXRhKDEpOyBcCisgIGNvbnN0IEVJR1RZUEUgKnhfcHRyOyBcCisgIGNoYXIgdXBsbz0oSXNSb3dNYWpvcikgPyAoSXNMb3dlciA/ICdVJyA6ICdMJykgOiAoSXNMb3dlciA/ICdMJyA6ICdVJyk7IFwKKyAgU1lNVlZlY3RvciB4X3RtcDsgXAorICBpZiAoQ29uanVnYXRlUmhzKSB7IFwKKyAgICBNYXA8Y29uc3QgU1lNVlZlY3RvciwgMCA+IG1hcF94KF9yaHMsc2l6ZSwxKTsgXAorICAgIHhfdG1wPW1hcF94LmNvbmp1Z2F0ZSgpOyBcCisgICAgeF9wdHI9eF90bXAuZGF0YSgpOyBcCisgIH0gZWxzZSB4X3B0cj1fcmhzOyBcCisgIEJMQVNGVU5DKCZ1cGxvLCAmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWxocywgJmxkYSwgKGNvbnN0IEJMQVNUWVBFKil4X3B0ciwgJmluY3gsICZudW1leHQ6OnJlYWxfcmVmKGJldGEpLCAoQkxBU1RZUEUqKXJlcywgJmluY3kpOyBcCit9XAorfTsKKworRUlHRU5fQkxBU19TWU1WX1NQRUNJQUxJWkFUSU9OKGRvdWJsZSwgICBkb3VibGUsIGRzeW12XykKK0VJR0VOX0JMQVNfU1lNVl9TUEVDSUFMSVpBVElPTihmbG9hdCwgICAgZmxvYXQsICBzc3ltdl8pCitFSUdFTl9CTEFTX1NZTVZfU1BFQ0lBTElaQVRJT04oZGNvbXBsZXgsIGRvdWJsZSwgemhlbXZfKQorRUlHRU5fQkxBU19TWU1WX1NQRUNJQUxJWkFUSU9OKHNjb21wbGV4LCBmbG9hdCwgIGNoZW12XykKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9CTEFTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UHJvZHVjdC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzOGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UHJvZHVjdC5oCkBAIC0wLDAgKzEsMTMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0VMRkFESk9JTlRfUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX1NFTEZBREpPSU5UX1BST0RVQ1RfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNlbGYgYWRqb2ludCBwcm9kdWN0OiBDICs9IEEgQV5UIHVwZGF0aW5nIG9ubHkKKyogaGFsZiBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IEMuCisqIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBsZXZlbCAzIFNZUksgYW5kIGxldmVsIDIgU1lSIEJsYXMgcm91dGluZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgRWlnZW4geyAKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxDb2xNYWpvcixVcExvLENvbmpMaHMsQ29ualJocz4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBJbmRleCBzdHJpZGUsIGNvbnN0IFNjYWxhciogdmVjWCwgY29uc3QgU2NhbGFyKiB2ZWNZLCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgaW50ZXJuYWw6OmNvbmpfaWY8Q29ualJocz4gY2o7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4gT3RoZXJNYXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8Q29uakxocyx0eXBlbmFtZSBPdGhlck1hcDo6Q29uanVnYXRlUmV0dXJuVHlwZSxjb25zdCBPdGhlck1hcCY+Ojp0eXBlIENvbmpMaHNUeXBlOworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4obWF0K3N0cmlkZSppKyhVcExvPT1Mb3dlciA/IGkgOiAwKSwgKFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpKQorICAgICAgICAgICs9IChhbHBoYSAqIGNqKHZlY1lbaV0pKSAqIENvbmpMaHNUeXBlKE90aGVyTWFwKHZlY1grKFVwTG89PUxvd2VyID8gaSA6IDApLFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LFJvd01ham9yLFVwTG8sQ29uakxocyxDb25qUmhzPgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB2ZWNYLCBjb25zdCBTY2FsYXIqIHZlY1ksIGNvbnN0IFNjYWxhciYgYWxwaGEpCisgIHsKKyAgICBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LENvbE1ham9yLFVwTG89PUxvd2VyP1VwcGVyOkxvd2VyLENvbmpSaHMsQ29uakxocz46OnJ1bihzaXplLG1hdCxzdHJpZGUsdmVjWSx2ZWNYLGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3RoZXJUeXBlLCBpbnQgVXBMbywgYm9vbCBPdGhlcklzVmVjdG9yID0gT3RoZXJUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcHJvZHVjdF9zZWxlY3RvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3RoZXJUeXBlLCBpbnQgVXBMbz4KK3N0cnVjdCBzZWxmYWRqb2ludF9wcm9kdWN0X3NlbGVjdG9yPE1hdHJpeFR5cGUsT3RoZXJUeXBlLFVwTG8sdHJ1ZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgT3RoZXJUeXBlJiBvdGhlciwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxPdGhlclR5cGU+IE90aGVyQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxPdGhlclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxPdGhlclR5cGU+Ojp0eXBlIF9BY3R1YWxPdGhlclR5cGU7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbE90aGVyVHlwZT46OnR5cGUgYWN0dWFsT3RoZXIgPSBPdGhlckJsYXNUcmFpdHM6OmV4dHJhY3Qob3RoZXIuZGVyaXZlZCgpKTsKKworICAgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogT3RoZXJCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKG90aGVyLmRlcml2ZWQoKSk7CisKKyAgICBlbnVtIHsKKyAgICAgIFN0b3JhZ2VPcmRlciA9IChpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgVXNlT3RoZXJEaXJlY3RseSA9IF9BY3R1YWxPdGhlclR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MQorICAgIH07CisgICAgaW50ZXJuYWw6OmdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsT3RoZXJUeXBlOjpTaXplQXRDb21waWxlVGltZSxPdGhlclR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFVc2VPdGhlckRpcmVjdGx5PiBzdGF0aWNfb3RoZXI7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBhY3R1YWxPdGhlclB0ciwgb3RoZXIuc2l6ZSgpLAorICAgICAgKFVzZU90aGVyRGlyZWN0bHkgPyBjb25zdF9jYXN0PFNjYWxhcio+KGFjdHVhbE90aGVyLmRhdGEoKSkgOiBzdGF0aWNfb3RoZXIuZGF0YSgpKSk7CisgICAgICAKKyAgICBpZighVXNlT3RoZXJEaXJlY3RseSkKKyAgICAgIE1hcDx0eXBlbmFtZSBfQWN0dWFsT3RoZXJUeXBlOjpQbGFpbk9iamVjdD4oYWN0dWFsT3RoZXJQdHIsIGFjdHVhbE90aGVyLnNpemUoKSkgPSBhY3R1YWxPdGhlcjsKKyAgICAKKyAgICBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LFN0b3JhZ2VPcmRlcixVcExvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUgICYmIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFPdGhlckJsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSkgJiYgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD4KKyAgICAgICAgICA6OnJ1bihvdGhlci5zaXplKCksIG1hdC5kYXRhKCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxPdGhlclB0ciwgYWN0dWFsT3RoZXJQdHIsIGFjdHVhbEFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3RoZXJUeXBlLCBpbnQgVXBMbz4KK3N0cnVjdCBzZWxmYWRqb2ludF9wcm9kdWN0X3NlbGVjdG9yPE1hdHJpeFR5cGUsT3RoZXJUeXBlLFVwTG8sZmFsc2U+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IE90aGVyVHlwZSYgb3RoZXIsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciYgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8T3RoZXJUeXBlPiBPdGhlckJsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBPdGhlckJsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsT3RoZXJUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsT3RoZXJUeXBlPjo6dHlwZSBfQWN0dWFsT3RoZXJUeXBlOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxPdGhlclR5cGU+Ojp0eXBlIGFjdHVhbE90aGVyID0gT3RoZXJCbGFzVHJhaXRzOjpleHRyYWN0KG90aGVyLmRlcml2ZWQoKSk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIE90aGVyQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihvdGhlci5kZXJpdmVkKCkpOworCisgICAgZW51bSB7CisgICAgICBJc1Jvd01ham9yID0gKGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzJlJvd01ham9yQml0KSA/IDEgOiAwLAorICAgICAgT3RoZXJJc1Jvd01ham9yID0gX0FjdHVhbE90aGVyVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQgPyAxIDogMAorICAgIH07CisKKyAgICBJbmRleCBzaXplID0gbWF0LmNvbHMoKTsKKyAgICBJbmRleCBkZXB0aCA9IGFjdHVhbE90aGVyLmNvbHMoKTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8SXNSb3dNYWpvciA/IFJvd01ham9yIDogQ29sTWFqb3IsU2NhbGFyLFNjYWxhciwKKyAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLCBfQWN0dWFsT3RoZXJUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gQmxvY2tpbmdUeXBlOworCisgICAgQmxvY2tpbmdUeXBlIGJsb2NraW5nKHNpemUsIHNpemUsIGRlcHRoLCAxLCBmYWxzZSk7CisKKworICAgIGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LAorICAgICAgU2NhbGFyLCBPdGhlcklzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLCAgIE90aGVyQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlICAmJiBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgU2NhbGFyLCBPdGhlcklzUm93TWFqb3IgPyBDb2xNYWpvciA6IFJvd01ham9yLCAoIU90aGVyQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlKSAmJiBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgSXNSb3dNYWpvciA/IFJvd01ham9yIDogQ29sTWFqb3IsIFVwTG8+CisgICAgICA6OnJ1bihzaXplLCBkZXB0aCwKKyAgICAgICAgICAgICZhY3R1YWxPdGhlci5jb2VmZlJlZigwLDApLCBhY3R1YWxPdGhlci5vdXRlclN0cmlkZSgpLCAmYWN0dWFsT3RoZXIuY29lZmZSZWYoMCwwKSwgYWN0dWFsT3RoZXIub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgIG1hdC5kYXRhKCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxBbHBoYSwgYmxvY2tpbmcpOworICB9Cit9OworCisvLyBoaWdoIGxldmVsIEFQSQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRVPgorU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4mIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+Cis6OnJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVT4mIHUsIGNvbnN0IFNjYWxhciYgYWxwaGEpCit7CisgIHNlbGZhZGpvaW50X3Byb2R1Y3Rfc2VsZWN0b3I8TWF0cml4VHlwZSxEZXJpdmVkVSxVcExvPjo6cnVuKF9leHByZXNzaW9uKCkuY29uc3RfY2FzdF9kZXJpdmVkKCksIHUuZGVyaXZlZCgpLCBhbHBoYSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UX1BST0RVQ1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRSYW5rMlVwZGF0ZS5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRSYW5rMlVwZGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTM2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludFJhbmsyVXBkYXRlLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEZBREpPSU5UUkFOSzJVUFRBREVfSAorI2RlZmluZSBFSUdFTl9TRUxGQURKT0lOVFJBTksyVVBUQURFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qIE9wdGltaXplZCBzZWxmYWRqb2ludCBtYXRyaXggKz0gYWxwaGEgKiB1dicgKyBjb25qKGFscGhhKSp2dScKKyAqIEl0IGNvcnJlc3BvbmRzIHRvIHRoZSBMZXZlbDIgc3lyMiBCTEFTIHJvdXRpbmUKKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBVVHlwZSwgdHlwZW5hbWUgVlR5cGUsIGludCBVcExvPgorc3RydWN0IHNlbGZhZGpvaW50X3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgVVR5cGUsIHR5cGVuYW1lIFZUeXBlPgorc3RydWN0IHNlbGZhZGpvaW50X3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsSW5kZXgsVVR5cGUsVlR5cGUsTG93ZXI+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihTY2FsYXIqIG1hdCwgSW5kZXggc3RyaWRlLCBjb25zdCBVVHlwZSYgdSwgY29uc3QgVlR5cGUmIHYsIGNvbnN0IFNjYWxhciYgYWxwaGEpCisgIHsKKyAgICBjb25zdCBJbmRleCBzaXplID0gdS5zaXplKCk7CisgICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmkraSwgc2l6ZS1pKSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKG51bWV4dDo6Y29uaihhbHBoYSkgKiBudW1leHQ6OmNvbmoodS5jb2VmZihpKSkpICogdi50YWlsKHNpemUtaSkKKyAgICAgICAgICAgICAgICAgICAgICArIChhbHBoYSAqIG51bWV4dDo6Y29uaih2LmNvZWZmKGkpKSkgKiB1LnRhaWwoc2l6ZS1pKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFVUeXBlLCB0eXBlbmFtZSBWVHlwZT4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLEluZGV4LFVUeXBlLFZUeXBlLFVwcGVyPgoreworICBzdGF0aWMgdm9pZCBydW4oU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgVVR5cGUmIHUsIGNvbnN0IFZUeXBlJiB2LCBjb25zdCBTY2FsYXImIGFscGhhKQorICB7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IHUuc2l6ZSgpOworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmksIGkrMSkgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIChudW1leHQ6OmNvbmooYWxwaGEpICAqIG51bWV4dDo6Y29uaih1LmNvZWZmKGkpKSkgKiB2LmhlYWQoaSsxKQorICAgICAgICAgICAgICAgICAgICAgICsgKGFscGhhICogbnVtZXh0Ojpjb25qKHYuY29lZmYoaSkpKSAqIHUuaGVhZChpKzEpOworICB9Cit9OworCit0ZW1wbGF0ZTxib29sIENvbmQsIHR5cGVuYW1lIFQ+IHN0cnVjdCBjb25qX2V4cHJfaWYKKyAgOiBjb25kaXRpb25hbDwhQ29uZCwgY29uc3QgVCYsCisgICAgICBDd2lzZVVuYXJ5T3A8c2NhbGFyX2Nvbmp1Z2F0ZV9vcDx0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhcj4sVD4gPiB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFUsIHR5cGVuYW1lIERlcml2ZWRWPgorU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4mIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+Cis6OnJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVT4mIHUsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFY+JiB2LCBjb25zdCBTY2FsYXImIGFscGhhKQoreworICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxEZXJpdmVkVT4gVUJsYXNUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVUJsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsVVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsVVR5cGU+Ojp0eXBlIF9BY3R1YWxVVHlwZTsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbFVUeXBlPjo6dHlwZSBhY3R1YWxVID0gVUJsYXNUcmFpdHM6OmV4dHJhY3QodS5kZXJpdmVkKCkpOworCisgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPERlcml2ZWRWPiBWQmxhc1RyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxWVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxWVHlwZT46OnR5cGUgX0FjdHVhbFZUeXBlOworICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsVlR5cGU+Ojp0eXBlIGFjdHVhbFYgPSBWQmxhc1RyYWl0czo6ZXh0cmFjdCh2LmRlcml2ZWQoKSk7CisKKyAgLy8gSWYgTWF0cml4VHlwZSBpcyByb3cgbWFqb3IsIHRoZW4gd2UgdXNlIHRoZSByb3V0aW5lIGZvciBsb3dlciB0cmlhbmd1bGFyIGluIHRoZSB1cHBlciB0cmlhbmd1bGFyIGNhc2UgYW5kCisgIC8vIHZpY2UgdmVyc2EsIGFuZCB0YWtlIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbGwgY29lZmZpY2llbnRzIGFuZCB2ZWN0b3IgZW50cmllcy4KKworICBlbnVtIHsgSXNSb3dNYWpvciA9IChpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyZSb3dNYWpvckJpdCkgPyAxIDogMCB9OworICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIFVCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKHUuZGVyaXZlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bWV4dDo6Y29uaihWQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcih2LmRlcml2ZWQoKSkpOworICBpZiAoSXNSb3dNYWpvcikKKyAgICBhY3R1YWxBbHBoYSA9IG51bWV4dDo6Y29uaihhY3R1YWxBbHBoYSk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBpbnRlcm5hbDo6Y29ual9leHByX2lmPElzUm93TWFqb3IgXiBVQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLF9BY3R1YWxVVHlwZT46OnR5cGU+Ojp0eXBlIFVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIGludGVybmFsOjpjb25qX2V4cHJfaWY8SXNSb3dNYWpvciBeIFZCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsX0FjdHVhbFZUeXBlPjo6dHlwZT46OnR5cGUgVlR5cGU7CisgIGludGVybmFsOjpzZWxmYWRqb2ludF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLCBJbmRleCwgVVR5cGUsIFZUeXBlLAorICAgIChJc1Jvd01ham9yID8gaW50KFVwTG89PVVwcGVyID8gTG93ZXIgOiBVcHBlcikgOiBVcExvKT4KKyAgICA6OnJ1bihfZXhwcmVzc2lvbigpLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmRhdGEoKSxfZXhwcmVzc2lvbigpLm91dGVyU3RyaWRlKCksVVR5cGUoYWN0dWFsVSksVlR5cGUoYWN0dWFsViksYWN0dWFsQWxwaGEpOworCisgIHJldHVybiAqdGhpczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQURKT0lOVFJBTksyVVBUQURFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhNYXRyaXguaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM1YThhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeC5oCkBAIC0wLDAgKzEsNDQxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IG1yLCBpbnQgU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZSwgaW50IE1vZGU+CisvLyBzdHJ1Y3QgZ2VtbV9wYWNrX2xoc190cmlhbmd1bGFyCisvLyB7CisvLyAgIE1hdHJpeDxTY2FsYXIsbXIsbXIsCisvLyAgIHZvaWQgb3BlcmF0b3IoKShTY2FsYXIqIGJsb2NrQSwgY29uc3QgRUlHRU5fUkVTVFJJQ1QgU2NhbGFyKiBfbGhzLCBpbnQgbGhzU3RyaWRlLCBpbnQgZGVwdGgsIGludCByb3dzKQorLy8gICB7CisvLyAgICAgY29ual9pZjxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIENvbmp1Z2F0ZT4gY2o7CisvLyAgICAgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsIFN0b3JhZ2VPcmRlcj4gbGhzKF9saHMsbGhzU3RyaWRlKTsKKy8vICAgICBpbnQgY291bnQgPSAwOworLy8gICAgIGNvbnN0IGludCBwZWVsZWRfbWMgPSAocm93cy9tcikqbXI7CisvLyAgICAgZm9yKGludCBpPTA7IGk8cGVlbGVkX21jOyBpKz1tcikKKy8vICAgICB7CisvLyAgICAgICBmb3IoaW50IGs9MDsgazxkZXB0aDsgaysrKQorLy8gICAgICAgICBmb3IoaW50IHc9MDsgdzxtcjsgdysrKQorLy8gICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGNqKGxocyhpK3csIGspKTsKKy8vICAgICB9CisvLyAgICAgZm9yKGludCBpPXBlZWxlZF9tYzsgaTxyb3dzOyBpKyspCisvLyAgICAgeworLy8gICAgICAgZm9yKGludCBrPTA7IGs8ZGVwdGg7IGsrKykKKy8vICAgICAgICAgYmxvY2tBW2NvdW50KytdID0gY2oobGhzKGksIGspKTsKKy8vICAgICB9CisvLyAgIH0KKy8vIH07CisKKy8qIE9wdGltaXplZCB0cmlhbmd1bGFyIG1hdHJpeCAqIG1hdHJpeCAoX1RSTU0rKykgcHJvZHVjdCBidWlsdCBvbiB0b3Agb2YKKyAqIHRoZSBnZW5lcmFsIG1hdHJpeCBtYXRyaXggcHJvZHVjdC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsCisgICAgICAgICAgaW50IE1vZGUsIGJvb2wgTGhzSXNUcmlhbmd1bGFyLAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLAorICAgICAgICAgIGludCBSZXNTdG9yYWdlT3JkZXIsIGludCBWZXJzaW9uID0gU3BlY2lhbGl6ZWQ+CitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBNb2RlLCBib29sIExoc0lzVHJpYW5ndWxhciwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLEluZGV4LE1vZGUsTGhzSXNUcmlhbmd1bGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxSb3dNYWpvcixWZXJzaW9uPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBkZXB0aCwKKyAgICBjb25zdCBTY2FsYXIqIGxocywgSW5kZXggbGhzU3RyaWRlLAorICAgIGNvbnN0IFNjYWxhciogcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgIEluZGV4IHJlc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXImIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBJbmRleCwKKyAgICAgIChNb2RlJihVbml0RGlhZ3xaZXJvRGlhZykpIHwgKChNb2RlJlVwcGVyKSA/IExvd2VyIDogVXBwZXIpLAorICAgICAgKCFMaHNJc1RyaWFuZ3VsYXIpLAorICAgICAgUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsCisgICAgICBDb25qdWdhdGVSaHMsCisgICAgICBMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwKKyAgICAgIENvbmp1Z2F0ZUxocywKKyAgICAgIENvbE1ham9yPgorICAgICAgOjpydW4oY29scywgcm93cywgZGVwdGgsIHJocywgcmhzU3RyaWRlLCBsaHMsIGxoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhLCBibG9ja2luZyk7CisgIH0KK307CisKKy8vIGltcGxlbWVudHMgY29sLW1ham9yICs9IGFscGhhICogb3AodHJpYW5ndWxhcikgKiBvcChnZW5lcmFsKQordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsSW5kZXgsTW9kZSx0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixWZXJzaW9uPgoreworICAKKyAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgIGVudW0geworICAgIFNtYWxsUGFuZWxXaWR0aCAgID0gMiAqIEVJR0VOX1BMQUlOX0VOVU1fTUFYKFRyYWl0czo6bXIsVHJhaXRzOjpuciksCisgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciwKKyAgICBTZXREaWFnID0gKE1vZGUmKFplcm9EaWFnfFVuaXREaWFnKSkgPyAwIDogMQorICB9OworCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIEluZGV4IF9kZXB0aCwKKyAgICBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXImIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCxNb2RlLHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3IsVmVyc2lvbj46OnJ1bigKKyAgICBJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIEluZGV4IF9kZXB0aCwKKyAgICBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIF9yZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIC8vIHN0cmlwIHplcm9zCisgICAgSW5kZXggZGlhZ1NpemUgID0gKHN0ZDo6bWluKShfcm93cyxfZGVwdGgpOworICAgIEluZGV4IHJvd3MgICAgICA9IElzTG93ZXIgPyBfcm93cyA6IGRpYWdTaXplOworICAgIEluZGV4IGRlcHRoICAgICA9IElzTG93ZXIgPyBkaWFnU2l6ZSA6IF9kZXB0aDsKKyAgICBJbmRleCBjb2xzICAgICAgPSBfY29sczsKKyAgICAKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIFJoc1N0b3JhZ2VPcmRlcj4gUmhzTWFwcGVyOworICAgIHR5cGVkZWYgYmxhc19kYXRhX21hcHBlcjx0eXBlbmFtZSBUcmFpdHM6OlJlc1NjYWxhciwgSW5kZXgsIENvbE1ham9yPiBSZXNNYXBwZXI7CisgICAgTGhzTWFwcGVyIGxocyhfbGhzLGxoc1N0cmlkZSk7CisgICAgUmhzTWFwcGVyIHJocyhfcmhzLHJoc1N0cmlkZSk7CisgICAgUmVzTWFwcGVyIHJlcyhfcmVzLCByZXNTdHJpZGUpOworCisgICAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKyAgICAvLyBUaGUgc21hbGwgcGFuZWwgc2l6ZSBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBibG9ja2luZyBzaXplLgorICAgIC8vIFVzdWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgYmUgdGhlIGNhc2UgYmVjYXVzZSBTbWFsbFBhbmVsV2lkdGheMiBpcyB2ZXJ5IHNtYWxsCisgICAgLy8gY29tcGFyZWQgdG8gTDIgY2FjaGUgc2l6ZSwgYnV0IGxldCdzIGJlIHNhZmU6CisgICAgSW5kZXggcGFuZWxXaWR0aCA9IChzdGQ6Om1pbikoSW5kZXgoU21hbGxQYW5lbFdpZHRoKSwoc3RkOjptaW4pKGtjLG1jKSk7CisKKyAgICBzdGQ6OnNpemVfdCBzaXplQSA9IGtjKm1jOworICAgIHN0ZDo6c2l6ZV90IHNpemVCID0ga2MqY29sczsKKworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQSwgc2l6ZUEsIGJsb2NraW5nLmJsb2NrQSgpKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0IsIHNpemVCLCBibG9ja2luZy5ibG9ja0IoKSk7CisKKyAgICBNYXRyaXg8U2NhbGFyLFNtYWxsUGFuZWxXaWR0aCxTbWFsbFBhbmVsV2lkdGgsTGhzU3RvcmFnZU9yZGVyPiB0cmlhbmd1bGFyQnVmZmVyKChpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpKTsKKyAgICB0cmlhbmd1bGFyQnVmZmVyLnNldFplcm8oKTsKKyAgICBpZigoTW9kZSZaZXJvRGlhZyk9PVplcm9EaWFnKQorICAgICAgdHJpYW5ndWxhckJ1ZmZlci5kaWFnb25hbCgpLnNldFplcm8oKTsKKyAgICBlbHNlCisgICAgICB0cmlhbmd1bGFyQnVmZmVyLmRpYWdvbmFsKCkuc2V0T25lcygpOworCisgICAgZ2VicF9rZXJuZWw8U2NhbGFyLCBTY2FsYXIsIEluZGV4LCBSZXNNYXBwZXIsIFRyYWl0czo6bXIsIFRyYWl0czo6bnIsIENvbmp1Z2F0ZUxocywgQ29uanVnYXRlUmhzPiBnZWJwX2tlcm5lbDsKKyAgICBnZW1tX3BhY2tfbGhzPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFJoc01hcHBlciwgVHJhaXRzOjpucixSaHNTdG9yYWdlT3JkZXI+IHBhY2tfcmhzOworCisgICAgZm9yKEluZGV4IGsyPUlzTG93ZXIgPyBkZXB0aCA6IDA7CisgICAgICAgIElzTG93ZXIgPyBrMj4wIDogazI8ZGVwdGg7CisgICAgICAgIElzTG93ZXIgPyBrMi09a2MgOiBrMis9a2MpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShJc0xvd2VyID8gazIgOiBkZXB0aC1rMiwga2MpOworICAgICAgSW5kZXggYWN0dWFsX2syID0gSXNMb3dlciA/IGsyLWFjdHVhbF9rYyA6IGsyOworCisgICAgICAvLyBhbGlnbiBibG9ja3Mgd2l0aCB0aGUgZW5kIG9mIHRoZSB0cmlhbmd1bGFyIHBhcnQgZm9yIHRyYXBlem9pZGFsIGxocworICAgICAgaWYoKCFJc0xvd2VyKSYmKGsyPHJvd3MpJiYoazIrYWN0dWFsX2tjPnJvd3MpKQorICAgICAgeworICAgICAgICBhY3R1YWxfa2MgPSByb3dzLWsyOworICAgICAgICBrMiA9IGsyK2FjdHVhbF9rYy1rYzsKKyAgICAgIH0KKworICAgICAgcGFja19yaHMoYmxvY2tCLCByaHMuZ2V0U3ViTWFwcGVyKGFjdHVhbF9rMiwwKSwgYWN0dWFsX2tjLCBjb2xzKTsKKworICAgICAgLy8gdGhlIHNlbGVjdGVkIGxocydzIHBhbmVsIGhhcyB0byBiZSBzcGxpdCBpbiB0aHJlZSBkaWZmZXJlbnQgcGFydHM6CisgICAgICAvLyAgMSAtIHRoZSBwYXJ0IHdoaWNoIGlzIHplcm8gPT4gc2tpcCBpdAorICAgICAgLy8gIDIgLSB0aGUgZGlhZ29uYWwgYmxvY2sgPT4gc3BlY2lhbCBrZXJuZWwKKyAgICAgIC8vICAzIC0gdGhlIGRlbnNlIHBhbmVsIGJlbG93IChsb3dlciBjYXNlKSBvciBhYm92ZSAodXBwZXIgY2FzZSkgdGhlIGRpYWdvbmFsIGJsb2NrID0+IEdFUFAKKworICAgICAgLy8gdGhlIGJsb2NrIGRpYWdvbmFsLCBpZiBhbnk6CisgICAgICBpZihJc0xvd2VyIHx8IGFjdHVhbF9rMjxyb3dzKQorICAgICAgeworICAgICAgICAvLyBmb3IgZWFjaCBzbWFsbCB2ZXJ0aWNhbCBwYW5lbHMgb2YgbGhzCisgICAgICAgIGZvciAoSW5kZXggazE9MDsgazE8YWN0dWFsX2tjOyBrMSs9cGFuZWxXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWsxLCBwYW5lbFdpZHRoKTsKKyAgICAgICAgICBJbmRleCBsZW5ndGhUYXJnZXQgPSBJc0xvd2VyID8gYWN0dWFsX2tjLWsxLWFjdHVhbFBhbmVsV2lkdGggOiBrMTsKKyAgICAgICAgICBJbmRleCBzdGFydEJsb2NrICAgPSBhY3R1YWxfazIrazE7CisgICAgICAgICAgSW5kZXggYmxvY2tCT2Zmc2V0ID0gazE7CisKKyAgICAgICAgICAvLyA9PiBHRUJQIHdpdGggdGhlIG1pY3JvIHRyaWFuZ3VsYXIgYmxvY2sKKyAgICAgICAgICAvLyBUaGUgdHJpY2sgaXMgdG8gcGFjayB0aGlzIG1pY3JvIGJsb2NrIHdoaWxlIGZpbGxpbmcgdGhlIG9wcG9zaXRlIHRyaWFuZ3VsYXIgcGFydCB3aXRoIHplcm9zLgorICAgICAgICAgIC8vIFRvIHRoaXMgZW5kIHdlIGRvIGFuIGV4dHJhIHRyaWFuZ3VsYXIgY29weSB0byBhIHNtYWxsIHRlbXBvcmFyeSBidWZmZXIKKyAgICAgICAgICBmb3IgKEluZGV4IGs9MDtrPGFjdHVhbFBhbmVsV2lkdGg7KytrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTZXREaWFnKQorICAgICAgICAgICAgICB0cmlhbmd1bGFyQnVmZmVyLmNvZWZmUmVmKGssaykgPSBsaHMoc3RhcnRCbG9jaytrLHN0YXJ0QmxvY2srayk7CisgICAgICAgICAgICBmb3IgKEluZGV4IGk9SXNMb3dlciA/IGsrMSA6IDA7IElzTG93ZXIgPyBpPGFjdHVhbFBhbmVsV2lkdGggOiBpPGs7ICsraSkKKyAgICAgICAgICAgICAgdHJpYW5ndWxhckJ1ZmZlci5jb2VmZlJlZihpLGspID0gbGhzKHN0YXJ0QmxvY2sraSxzdGFydEJsb2NrK2spOworICAgICAgICAgIH0KKyAgICAgICAgICBwYWNrX2xocyhibG9ja0EsIExoc01hcHBlcih0cmlhbmd1bGFyQnVmZmVyLmRhdGEoKSwgdHJpYW5ndWxhckJ1ZmZlci5vdXRlclN0cmlkZSgpKSwgYWN0dWFsUGFuZWxXaWR0aCwgYWN0dWFsUGFuZWxXaWR0aCk7CisKKyAgICAgICAgICBnZWJwX2tlcm5lbChyZXMuZ2V0U3ViTWFwcGVyKHN0YXJ0QmxvY2ssIDApLCBibG9ja0EsIGJsb2NrQiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxQYW5lbFdpZHRoLCBjb2xzLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxfa2MsIDAsIGJsb2NrQk9mZnNldCk7CisKKyAgICAgICAgICAvLyBHRUJQIHdpdGggcmVtYWluaW5nIG1pY3JvIHBhbmVsCisgICAgICAgICAgaWYgKGxlbmd0aFRhcmdldD4wKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IHN0YXJ0VGFyZ2V0ICA9IElzTG93ZXIgPyBhY3R1YWxfazIrazErYWN0dWFsUGFuZWxXaWR0aCA6IGFjdHVhbF9rMjsKKworICAgICAgICAgICAgcGFja19saHMoYmxvY2tBLCBsaHMuZ2V0U3ViTWFwcGVyKHN0YXJ0VGFyZ2V0LHN0YXJ0QmxvY2spLCBhY3R1YWxQYW5lbFdpZHRoLCBsZW5ndGhUYXJnZXQpOworCisgICAgICAgICAgICBnZWJwX2tlcm5lbChyZXMuZ2V0U3ViTWFwcGVyKHN0YXJ0VGFyZ2V0LCAwKSwgYmxvY2tBLCBibG9ja0IsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYXJnZXQsIGFjdHVhbFBhbmVsV2lkdGgsIGNvbHMsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgYWN0dWFsX2tjLCAwLCBibG9ja0JPZmZzZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gdGhlIHBhcnQgYmVsb3cgKGxvd2VyIGNhc2UpIG9yIGFib3ZlICh1cHBlciBjYXNlKSB0aGUgZGlhZ29uYWwgPT4gR0VQUAorICAgICAgeworICAgICAgICBJbmRleCBzdGFydCA9IElzTG93ZXIgPyBrMiA6IDA7CisgICAgICAgIEluZGV4IGVuZCAgID0gSXNMb3dlciA/IHJvd3MgOiAoc3RkOjptaW4pKGFjdHVhbF9rMixyb3dzKTsKKyAgICAgICAgZm9yKEluZGV4IGkyPXN0YXJ0OyBpMjxlbmQ7IGkyKz1tYykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikoaTIrbWMsZW5kKS1pMjsKKyAgICAgICAgICBnZW1tX3BhY2tfbGhzPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgVHJhaXRzOjptcixUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXIsZmFsc2U+KCkKKyAgICAgICAgICAgIChibG9ja0EsIGxocy5nZXRTdWJNYXBwZXIoaTIsIGFjdHVhbF9rMiksIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICAgIGdlYnBfa2VybmVsKHJlcy5nZXRTdWJNYXBwZXIoaTIsIDApLCBibG9ja0EsIGJsb2NrQiwgYWN0dWFsX21jLAorICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgY29scywgYWxwaGEsIC0xLCAtMSwgMCwgMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworLy8gaW1wbGVtZW50cyBjb2wtbWFqb3IgKz0gYWxwaGEgKiBvcChnZW5lcmFsKSAqIG9wKHRyaWFuZ3VsYXIpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorc3RydWN0IHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCxNb2RlLGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIGdlYnBfdHJhaXRzPFNjYWxhcixTY2FsYXI+IFRyYWl0czsKKyAgZW51bSB7CisgICAgU21hbGxQYW5lbFdpZHRoICAgPSBFSUdFTl9QTEFJTl9FTlVNX01BWChUcmFpdHM6Om1yLFRyYWl0czo6bnIpLAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEKKyAgfTsKKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBJbmRleCBfZGVwdGgsCisgICAgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZyk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsSW5kZXgsTW9kZSxmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixWZXJzaW9uPjo6cnVuKAorICAgIEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgSW5kZXggX2RlcHRoLAorICAgIGNvbnN0IFNjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLAorICAgIFNjYWxhciogX3JlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXImIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgY29uc3QgSW5kZXggUGFja2V0Qnl0ZXMgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUqc2l6ZW9mKFNjYWxhcik7CisgICAgLy8gc3RyaXAgemVyb3MKKyAgICBJbmRleCBkaWFnU2l6ZSAgPSAoc3RkOjptaW4pKF9jb2xzLF9kZXB0aCk7CisgICAgSW5kZXggcm93cyAgICAgID0gX3Jvd3M7CisgICAgSW5kZXggZGVwdGggICAgID0gSXNMb3dlciA/IF9kZXB0aCA6IGRpYWdTaXplOworICAgIEluZGV4IGNvbHMgICAgICA9IElzTG93ZXIgPyBkaWFnU2l6ZSA6IF9jb2xzOworICAgIAorICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBMaHNTdG9yYWdlT3JkZXI+IExoc01hcHBlcjsKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgUmhzU3RvcmFnZU9yZGVyPiBSaHNNYXBwZXI7CisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IFJlc01hcHBlcjsKKyAgICBMaHNNYXBwZXIgbGhzKF9saHMsbGhzU3RyaWRlKTsKKyAgICBSaHNNYXBwZXIgcmhzKF9yaHMscmhzU3RyaWRlKTsKKyAgICBSZXNNYXBwZXIgcmVzKF9yZXMsIHJlc1N0cmlkZSk7CisKKyAgICBJbmRleCBrYyA9IGJsb2NraW5nLmtjKCk7ICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIEsgZGlyZWN0aW9uCisgICAgSW5kZXggbWMgPSAoc3RkOjptaW4pKHJvd3MsYmxvY2tpbmcubWMoKSk7ICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBNIGRpcmVjdGlvbgorCisgICAgc3RkOjpzaXplX3Qgc2l6ZUEgPSBrYyptYzsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IGtjKmNvbHMrRUlHRU5fTUFYX0FMSUdOX0JZVEVTL3NpemVvZihTY2FsYXIpOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKworICAgIE1hdHJpeDxTY2FsYXIsU21hbGxQYW5lbFdpZHRoLFNtYWxsUGFuZWxXaWR0aCxSaHNTdG9yYWdlT3JkZXI+IHRyaWFuZ3VsYXJCdWZmZXIoKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSkpOworICAgIHRyaWFuZ3VsYXJCdWZmZXIuc2V0WmVybygpOworICAgIGlmKChNb2RlJlplcm9EaWFnKT09WmVyb0RpYWcpCisgICAgICB0cmlhbmd1bGFyQnVmZmVyLmRpYWdvbmFsKCkuc2V0WmVybygpOworICAgIGVsc2UKKyAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuZGlhZ29uYWwoKS5zZXRPbmVzKCk7CisKKyAgICBnZWJwX2tlcm5lbDxTY2FsYXIsIFNjYWxhciwgSW5kZXgsIFJlc01hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnBfa2VybmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgTGhzTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXI+IHBhY2tfbGhzOworICAgIGdlbW1fcGFja19yaHM8U2NhbGFyLCBJbmRleCwgUmhzTWFwcGVyLCBUcmFpdHM6Om5yLFJoc1N0b3JhZ2VPcmRlcj4gcGFja19yaHM7CisgICAgZ2VtbV9wYWNrX3JoczxTY2FsYXIsIEluZGV4LCBSaHNNYXBwZXIsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyLGZhbHNlLHRydWU+IHBhY2tfcmhzX3BhbmVsOworCisgICAgZm9yKEluZGV4IGsyPUlzTG93ZXIgPyAwIDogZGVwdGg7CisgICAgICAgIElzTG93ZXIgPyBrMjxkZXB0aCAgOiBrMj4wOworICAgICAgICBJc0xvd2VyID8gazIrPWtjICAgOiBrMi09a2MpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShJc0xvd2VyID8gZGVwdGgtazIgOiBrMiwga2MpOworICAgICAgSW5kZXggYWN0dWFsX2syID0gSXNMb3dlciA/IGsyIDogazItYWN0dWFsX2tjOworCisgICAgICAvLyBhbGlnbiBibG9ja3Mgd2l0aCB0aGUgZW5kIG9mIHRoZSB0cmlhbmd1bGFyIHBhcnQgZm9yIHRyYXBlem9pZGFsIHJocworICAgICAgaWYoSXNMb3dlciAmJiAoazI8Y29scykgJiYgKGFjdHVhbF9rMithY3R1YWxfa2M+Y29scykpCisgICAgICB7CisgICAgICAgIGFjdHVhbF9rYyA9IGNvbHMtazI7CisgICAgICAgIGsyID0gYWN0dWFsX2syICsgYWN0dWFsX2tjIC0ga2M7CisgICAgICB9CisKKyAgICAgIC8vIHJlbWFpbmluZyBzaXplCisgICAgICBJbmRleCBycyA9IElzTG93ZXIgPyAoc3RkOjptaW4pKGNvbHMsYWN0dWFsX2syKSA6IGNvbHMgLSBrMjsKKyAgICAgIC8vIHNpemUgb2YgdGhlIHRyaWFuZ3VsYXIgcGFydAorICAgICAgSW5kZXggdHMgPSAoSXNMb3dlciAmJiBhY3R1YWxfazI+PWNvbHMpID8gMCA6IGFjdHVhbF9rYzsKKworICAgICAgU2NhbGFyKiBnZWIgPSBibG9ja0IrdHMqdHM7CisgICAgICBnZWIgPSBnZWIgKyBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZDxQYWNrZXRCeXRlcz4oZ2ViLFBhY2tldEJ5dGVzL3NpemVvZihTY2FsYXIpKTsKKworICAgICAgcGFja19yaHMoZ2ViLCByaHMuZ2V0U3ViTWFwcGVyKGFjdHVhbF9rMixJc0xvd2VyID8gMCA6IGsyKSwgYWN0dWFsX2tjLCBycyk7CisKKyAgICAgIC8vIHBhY2sgdGhlIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgcmhzIHBhZGRpbmcgdGhlIHVucm9sbGVkIGJsb2NrcyB3aXRoIHplcm9zCisgICAgICBpZih0cz4wKQorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGoyPTA7IGoyPGFjdHVhbF9rYzsgajIrPVNtYWxsUGFuZWxXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgIEluZGV4IGFjdHVhbF9qMiA9IGFjdHVhbF9rMiArIGoyOworICAgICAgICAgIEluZGV4IHBhbmVsT2Zmc2V0ID0gSXNMb3dlciA/IGoyK2FjdHVhbFBhbmVsV2lkdGggOiAwOworICAgICAgICAgIEluZGV4IHBhbmVsTGVuZ3RoID0gSXNMb3dlciA/IGFjdHVhbF9rYy1qMi1hY3R1YWxQYW5lbFdpZHRoIDogajI7CisgICAgICAgICAgLy8gZ2VuZXJhbCBwYXJ0CisgICAgICAgICAgcGFja19yaHNfcGFuZWwoYmxvY2tCK2oyKmFjdHVhbF9rYywKKyAgICAgICAgICAgICAgICAgICAgICAgICByaHMuZ2V0U3ViTWFwcGVyKGFjdHVhbF9rMitwYW5lbE9mZnNldCwgYWN0dWFsX2oyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbExlbmd0aCwgYWN0dWFsUGFuZWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfa2MsIHBhbmVsT2Zmc2V0KTsKKworICAgICAgICAgIC8vIGFwcGVuZCB0aGUgdHJpYW5ndWxhciBwYXJ0IHZpYSBhIHRlbXBvcmFyeSBidWZmZXIKKyAgICAgICAgICBmb3IgKEluZGV4IGo9MDtqPGFjdHVhbFBhbmVsV2lkdGg7KytqKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTZXREaWFnKQorICAgICAgICAgICAgICB0cmlhbmd1bGFyQnVmZmVyLmNvZWZmUmVmKGosaikgPSByaHMoYWN0dWFsX2oyK2osYWN0dWFsX2oyK2opOworICAgICAgICAgICAgZm9yIChJbmRleCBrPUlzTG93ZXIgPyBqKzEgOiAwOyBJc0xvd2VyID8gazxhY3R1YWxQYW5lbFdpZHRoIDogazxqOyArK2spCisgICAgICAgICAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuY29lZmZSZWYoayxqKSA9IHJocyhhY3R1YWxfajIrayxhY3R1YWxfajIraik7CisgICAgICAgICAgfQorCisgICAgICAgICAgcGFja19yaHNfcGFuZWwoYmxvY2tCK2oyKmFjdHVhbF9rYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSaHNNYXBwZXIodHJpYW5ndWxhckJ1ZmZlci5kYXRhKCksIHRyaWFuZ3VsYXJCdWZmZXIub3V0ZXJTdHJpZGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgYWN0dWFsUGFuZWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfa2MsIGoyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKEluZGV4IGkyPTA7IGkyPHJvd3M7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShtYyxyb3dzLWkyKTsKKyAgICAgICAgcGFja19saHMoYmxvY2tBLCBsaHMuZ2V0U3ViTWFwcGVyKGkyLCBhY3R1YWxfazIpLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgLy8gdHJpYW5ndWxhciBrZXJuZWwKKyAgICAgICAgaWYodHM+MCkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoSW5kZXggajI9MDsgajI8YWN0dWFsX2tjOyBqMis9U21hbGxQYW5lbFdpZHRoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgICAgSW5kZXggcGFuZWxMZW5ndGggPSBJc0xvd2VyID8gYWN0dWFsX2tjLWoyIDogajIrYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgICAgIEluZGV4IGJsb2NrT2Zmc2V0ID0gSXNMb3dlciA/IGoyIDogMDsKKworICAgICAgICAgICAgZ2VicF9rZXJuZWwocmVzLmdldFN1Yk1hcHBlcihpMiwgYWN0dWFsX2syICsgajIpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tBLCBibG9ja0IrajIqYWN0dWFsX2tjLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX21jLCBwYW5lbExlbmd0aCwgYWN0dWFsUGFuZWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2tjLCBhY3R1YWxfa2MsICAvLyBzdHJpZGVzCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja09mZnNldCwgYmxvY2tPZmZzZXQpOy8vIG9mZnNldHMKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ2VicF9rZXJuZWwocmVzLmdldFN1Yk1hcHBlcihpMiwgSXNMb3dlciA/IDAgOiBrMiksCisgICAgICAgICAgICAgICAgICAgIGJsb2NrQSwgZ2ViLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgcnMsCisgICAgICAgICAgICAgICAgICAgIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyYXBwZXIgdG8gcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyaWFuZ3VsYXJfcHJvZHVjdF9pbXBsPE1vZGUsTGhzSXNUcmlhbmd1bGFyLExocyxmYWxzZSxSaHMsZmFsc2U+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHN0YXRpYyB2b2lkIHJ1bihEZXN0JiBkc3QsIGNvbnN0IExocyAmYV9saHMsIGNvbnN0IFJocyAmYV9yaHMsIGNvbnN0IHR5cGVuYW1lIERlc3Q6OlNjYWxhciYgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlNjYWxhciAgICAgU2NhbGFyOworICAgIAorICAgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPExocz4gTGhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsTGhzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbExoc1R5cGU+Ojp0eXBlIEFjdHVhbExoc1R5cGVDbGVhbmVkOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPFJocz4gUmhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsUmhzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFJoc1R5cGU+Ojp0eXBlIEFjdHVhbFJoc1R5cGVDbGVhbmVkOworICAgIAorICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxMaHNUeXBlPjo6dHlwZSBsaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KGFfbGhzKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgcmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChhX3Jocyk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IoYV9saHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKGFfcmhzKTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8KERlc3Q6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsU2NhbGFyLFNjYWxhciwKKyAgICAgICAgICAgICAgTGhzOjpNYXhSb3dzQXRDb21waWxlVGltZSwgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZSwgTGhzOjpNYXhDb2xzQXRDb21waWxlVGltZSw0PiBCbG9ja2luZ1R5cGU7CisKKyAgICBlbnVtIHsgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciB9OworICAgIEluZGV4IHN0cmlwZWRSb3dzICA9ICgoIUxoc0lzVHJpYW5ndWxhcikgfHwgKElzTG93ZXIpKSAgPyBsaHMucm93cygpIDogKHN0ZDo6bWluKShsaHMucm93cygpLGxocy5jb2xzKCkpOworICAgIEluZGV4IHN0cmlwZWRDb2xzICA9ICgoTGhzSXNUcmlhbmd1bGFyKSAgfHwgKCFJc0xvd2VyKSkgPyByaHMuY29scygpIDogKHN0ZDo6bWluKShyaHMuY29scygpLHJocy5yb3dzKCkpOworICAgIEluZGV4IHN0cmlwZWREZXB0aCA9IExoc0lzVHJpYW5ndWxhciA/ICgoIUlzTG93ZXIpID8gbGhzLmNvbHMoKSA6IChzdGQ6Om1pbikobGhzLmNvbHMoKSxsaHMucm93cygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKElzTG93ZXIpICA/IHJocy5yb3dzKCkgOiAoc3RkOjptaW4pKHJocy5yb3dzKCkscmhzLmNvbHMoKSkpOworCisgICAgQmxvY2tpbmdUeXBlIGJsb2NraW5nKHN0cmlwZWRSb3dzLCBzdHJpcGVkQ29scywgc3RyaXBlZERlcHRoLCAxLCBmYWxzZSk7CisKKyAgICBpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBJbmRleCwKKyAgICAgIE1vZGUsIExoc0lzVHJpYW5ndWxhciwKKyAgICAgIChpbnRlcm5hbDo6dHJhaXRzPEFjdHVhbExoc1R5cGVDbGVhbmVkPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgTGhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLAorICAgICAgKGludGVybmFsOjp0cmFpdHM8QWN0dWFsUmhzVHlwZUNsZWFuZWQ+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLCBSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgICAoaW50ZXJuYWw6OnRyYWl0czxEZXN0ICAgICAgICAgID46OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3I+CisgICAgICA6OnJ1bigKKyAgICAgICAgc3RyaXBlZFJvd3MsIHN0cmlwZWRDb2xzLCBzdHJpcGVkRGVwdGgsICAgLy8gc2l6ZXMKKyAgICAgICAgJmxocy5jb2VmZlJlZigwLDApLCBsaHMub3V0ZXJTdHJpZGUoKSwgICAgLy8gbGhzIGluZm8KKyAgICAgICAgJnJocy5jb2VmZlJlZigwLDApLCByaHMub3V0ZXJTdHJpZGUoKSwgICAgLy8gcmhzIGluZm8KKyAgICAgICAgJmRzdC5jb2VmZlJlZigwLDApLCBkc3Qub3V0ZXJTdHJpZGUoKSwgICAgLy8gcmVzdWx0IGluZm8KKyAgICAgICAgYWN0dWFsQWxwaGEsIGJsb2NraW5nCisgICAgICApOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeF9CTEFTLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4TWF0cml4X0JMQVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNkZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeF9CTEFTLmgKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBCTEFTIEY3NworICogICBUcmlhbmd1bGFyIG1hdHJpeCAqIG1hdHJpeCBwcm9kdWN0IGZ1bmN0aW9uYWxpdHkgYmFzZWQgb24gP1RSTU0uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfTUFUUklYX0JMQVNfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfQkxBU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBNb2RlLCBib29sIExoc0lzVHJpYW5ndWxhciwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywKKyAgICAgICAgICBpbnQgUmVzU3RvcmFnZU9yZGVyPgorc3RydWN0IHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4X3RybW0gOgorICAgICAgIHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCxNb2RlLAorICAgICAgICAgIExoc0lzVHJpYW5ndWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLAorICAgICAgICAgIFJoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlUmhzLCBSZXNTdG9yYWdlT3JkZXIsIEJ1aWx0SW4+IHt9OworCisKKy8vIHRyeSB0byBnbyB0byBCTEFTIHNwZWNpYWxpemF0aW9uCisjZGVmaW5lIEVJR0VOX0JMQVNfVFJNTV9TUEVDSUFMSVpFKFNjYWxhciwgTGhzSXNUcmlhbmd1bGFyKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBcCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCwgTW9kZSwgTGhzSXNUcmlhbmd1bGFyLCBcCisgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsIFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3IsU3BlY2lhbGl6ZWQ+IHsgXAorICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgSW5kZXggX2RlcHRoLCBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSxcCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFNjYWxhciogcmVzLCBJbmRleCByZXNTdHJpZGUsIFNjYWxhciBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykgeyBcCisgICAgICBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeF90cm1tPFNjYWxhcixJbmRleCxNb2RlLCBcCisgICAgICAgIExoc0lzVHJpYW5ndWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLCBcCisgICAgICAgIFJoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlUmhzLCBDb2xNYWpvcj46OnJ1biggXAorICAgICAgICBfcm93cywgX2NvbHMsIF9kZXB0aCwgX2xocywgbGhzU3RyaWRlLCBfcmhzLCByaHNTdHJpZGUsIHJlcywgcmVzU3RyaWRlLCBhbHBoYSwgYmxvY2tpbmcpOyBcCisgIH0gXAorfTsKKworRUlHRU5fQkxBU19UUk1NX1NQRUNJQUxJWkUoZG91YmxlLCB0cnVlKQorRUlHRU5fQkxBU19UUk1NX1NQRUNJQUxJWkUoZG91YmxlLCBmYWxzZSkKK0VJR0VOX0JMQVNfVFJNTV9TUEVDSUFMSVpFKGRjb21wbGV4LCB0cnVlKQorRUlHRU5fQkxBU19UUk1NX1NQRUNJQUxJWkUoZGNvbXBsZXgsIGZhbHNlKQorRUlHRU5fQkxBU19UUk1NX1NQRUNJQUxJWkUoZmxvYXQsIHRydWUpCitFSUdFTl9CTEFTX1RSTU1fU1BFQ0lBTElaRShmbG9hdCwgZmFsc2UpCitFSUdFTl9CTEFTX1RSTU1fU1BFQ0lBTElaRShzY29tcGxleCwgdHJ1ZSkKK0VJR0VOX0JMQVNfVFJNTV9TUEVDSUFMSVpFKHNjb21wbGV4LCBmYWxzZSkKKworLy8gaW1wbGVtZW50cyBjb2wtbWFqb3IgKz0gYWxwaGEgKiBvcCh0cmlhbmd1bGFyKSAqIG9wKGdlbmVyYWwpCisjZGVmaW5lIEVJR0VOX0JMQVNfVFJNTV9MKEVJR1RZUEUsIEJMQVNUWVBFLCBFSUdQUkVGSVgsIEJMQVNQUkVGSVgpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXhfdHJtbTxFSUdUWVBFLEluZGV4LE1vZGUsdHJ1ZSwgXAorICAgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yPiBcCit7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyLCBcCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEsIFwKKyAgICBJc1VuaXREaWFnICA9IChNb2RlJlVuaXREaWFnKSA/IDEgOiAwLCBcCisgICAgSXNaZXJvRGlhZyAgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwgXAorICAgIExvd1VwID0gSXNMb3dlciA/IExvd2VyIDogVXBwZXIsIFwKKyAgICBjb25qQSA9ICgoTGhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlTGhzKSA/IDEgOiAwIFwKKyAgfTsgXAorXAorICBzdGF0aWMgdm9pZCBydW4oIFwKKyAgICBJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIEluZGV4IF9kZXB0aCwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLEVJR1RZUEU+JiBibG9ja2luZykgXAorICB7IFwKKyAgIEluZGV4IGRpYWdTaXplICA9IChzdGQ6Om1pbikoX3Jvd3MsX2RlcHRoKTsgXAorICAgSW5kZXggcm93cyAgICAgID0gSXNMb3dlciA/IF9yb3dzIDogZGlhZ1NpemU7IFwKKyAgIEluZGV4IGRlcHRoICAgICA9IElzTG93ZXIgPyBkaWFnU2l6ZSA6IF9kZXB0aDsgXAorICAgSW5kZXggY29scyAgICAgID0gX2NvbHM7IFwKK1wKKyAgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIExoc1N0b3JhZ2VPcmRlcj4gTWF0cml4TGhzOyBcCisgICB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+IE1hdHJpeFJoczsgXAorXAorLyogTm9uLXNxdWFyZSBjYXNlIC0gZG9lc24ndCBmaXQgdG8gQkxBUyA/VFJNTS4gRmFsbCB0byBkZWZhdWx0IHRyaWFuZ3VsYXIgcHJvZHVjdCBvciBjYWxsIEJMQVMgP0dFTU0qLyBcCisgICBpZiAocm93cyAhPSBkZXB0aCkgeyBcCitcCisgICAgIC8qIEZJWE1FIGhhbmRsZSBta2xfZG9tYWluX2dldF9tYXhfdGhyZWFkcyAqLyBcCisgICAgIC8qaW50IG50aHIgPSBta2xfZG9tYWluX2dldF9tYXhfdGhyZWFkcyhFSUdFTl9CTEFTX0RPTUFJTl9CTEFTKTsqLyBpbnQgbnRociA9IDE7XAorXAorICAgICBpZiAoKChudGhyPT0xKSAmJiAoKChzdGQ6Om1heCkocm93cyxkZXB0aCktZGlhZ1NpemUpLyhkb3VibGUpZGlhZ1NpemUgPCAwLjUpKSkgeyBcCisgICAgIC8qIE1vc3QgbGlrZWx5IG5vIGJlbmVmaXQgdG8gY2FsbCBUUk1NIG9yIEdFTU0gZnJvbSBCTEFTICovIFwKKyAgICAgICBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxFSUdUWVBFLEluZGV4LE1vZGUsdHJ1ZSwgXAorICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsIFJoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlUmhzLCBDb2xNYWpvciwgQnVpbHRJbj46OnJ1biggXAorICAgICAgICAgICBfcm93cywgX2NvbHMsIF9kZXB0aCwgX2xocywgbGhzU3RyaWRlLCBfcmhzLCByaHNTdHJpZGUsIHJlcywgcmVzU3RyaWRlLCBhbHBoYSwgYmxvY2tpbmcpOyBcCisgICAgIC8qc3RkOjpjb3V0IDw8ICJUUk1NX0w6IEEgaXMgbm90IHNxdWFyZSEgR28gdG8gRWlnZW4gVFJNTSBpbXBsZW1lbnRhdGlvbiFcbiI7Ki8gXAorICAgICB9IGVsc2UgeyBcCisgICAgIC8qIE1ha2Ugc2Vuc2UgdG8gY2FsbCBHRU1NICovIFwKKyAgICAgICBNYXA8Y29uc3QgTWF0cml4TGhzLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzTWFwKF9saHMscm93cyxkZXB0aCxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICAgICAgTWF0cml4TGhzIGFhX3RtcD1saHNNYXAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsgXAorICAgICAgIEJsYXNJbmRleCBhU3RyaWRlID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGFhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgICAgIGdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsRUlHVFlQRSxFSUdUWVBFLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBnZW1tX2Jsb2NraW5nKF9yb3dzLF9jb2xzLF9kZXB0aCwgMSwgdHJ1ZSk7IFwKKyAgICAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbmRleCxFSUdUWVBFLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsRUlHVFlQRSxSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yPjo6cnVuKCBcCisgICAgICAgcm93cywgY29scywgZGVwdGgsIGFhX3RtcC5kYXRhKCksIGFTdHJpZGUsIF9yaHMsIHJoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhLCBnZW1tX2Jsb2NraW5nLCAwKTsgXAorXAorICAgICAvKnN0ZDo6Y291dCA8PCAiVFJNTV9MOiBBIGlzIG5vdCBzcXVhcmUhIEdvIHRvIEJMQVMgR0VNTSBpbXBsZW1lbnRhdGlvbiEgIiA8PCBudGhyPDwiIFxuIjsqLyBcCisgICAgIH0gXAorICAgICByZXR1cm47IFwKKyAgIH0gXAorICAgY2hhciBzaWRlID0gJ0wnLCB0cmFuc2EsIHVwbG8sIGRpYWcgPSAnTic7IFwKKyAgIEVJR1RZUEUgKmI7IFwKKyAgIGNvbnN0IEVJR1RZUEUgKmE7IFwKKyAgIEJsYXNJbmRleCBtLCBuLCBsZGEsIGxkYjsgXAorXAorLyogU2V0IG0sIG4gKi8gXAorICAgbSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihkaWFnU2l6ZSk7IFwKKyAgIG4gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oY29scyk7IFwKK1wKKy8qIFNldCB0cmFucyAqLyBcCisgICB0cmFuc2EgPSAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyAoKENvbmp1Z2F0ZUxocykgPyAnQycgOiAnVCcpIDogJ04nOyBcCitcCisvKiBTZXQgYiwgbGRiICovIFwKKyAgIE1hcDxjb25zdCBNYXRyaXhSaHMsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxkZXB0aCxjb2xzLE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgIE1hdHJpeFgjI0VJR1BSRUZJWCBiX3RtcDsgXAorXAorICAgaWYgKENvbmp1Z2F0ZVJocykgYl90bXAgPSByaHMuY29uanVnYXRlKCk7IGVsc2UgYl90bXAgPSByaHM7IFwKKyAgIGIgPSBiX3RtcC5kYXRhKCk7IFwKKyAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihiX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorXAorLyogU2V0IHVwbG8gKi8gXAorICAgdXBsbyA9IElzTG93ZXIgPyAnTCcgOiAnVSc7IFwKKyAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB1cGxvID0gKHVwbG8gPT0gJ0wnKSA/ICdVJyA6ICdMJzsgXAorLyogU2V0IGEsIGxkYSAqLyBcCisgICBNYXA8Y29uc3QgTWF0cml4TGhzLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMscm93cyxkZXB0aCxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICBNYXRyaXhMaHMgYV90bXA7IFwKK1wKKyAgIGlmICgoY29uakEhPTApIHx8IChTZXREaWFnPT0wKSkgeyBcCisgICAgIGlmIChjb25qQSkgYV90bXAgPSBsaHMuY29uanVnYXRlKCk7IGVsc2UgYV90bXAgPSBsaHM7IFwKKyAgICAgaWYgKElzWmVyb0RpYWcpIFwKKyAgICAgICBhX3RtcC5kaWFnb25hbCgpLnNldFplcm8oKTsgXAorICAgICBlbHNlIGlmIChJc1VuaXREaWFnKSBcCisgICAgICAgYV90bXAuZGlhZ29uYWwoKS5zZXRPbmVzKCk7XAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgfSBlbHNlIHsgXAorICAgICBhID0gX2xoczsgXAorICAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4obGhzU3RyaWRlKTsgXAorICAgfSBcCisgICAvKnN0ZDo6Y291dCA8PCAiVFJNTV9MOiBBIGlzIHNxdWFyZSEgR28gdG8gQkxBUyBUUk1NIGltcGxlbWVudGF0aW9uISBcbiI7Ki8gXAorLyogY2FsbCA/dHJtbSovIFwKKyAgIEJMQVNQUkVGSVgjI3RybW1fKCZzaWRlLCAmdXBsbywgJnRyYW5zYSwgJmRpYWcsICZtLCAmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChCTEFTVFlQRSopYiwgJmxkYik7IFwKK1wKKy8qIEFkZCBvcChhX3RyaWFuZ3VsYXIpKmIgaW50byByZXMqLyBcCisgICBNYXA8TWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmVzX3RtcChyZXMscm93cyxjb2xzLE91dGVyU3RyaWRlPD4ocmVzU3RyaWRlKSk7IFwKKyAgIHJlc190bXA9cmVzX3RtcCtiX3RtcDsgXAorICB9IFwKK307CisKK0VJR0VOX0JMQVNfVFJNTV9MKGRvdWJsZSwgZG91YmxlLCBkLCBkKQorRUlHRU5fQkxBU19UUk1NX0woZGNvbXBsZXgsIGRvdWJsZSwgY2QsIHopCitFSUdFTl9CTEFTX1RSTU1fTChmbG9hdCwgZmxvYXQsIGYsIHMpCitFSUdFTl9CTEFTX1RSTU1fTChzY29tcGxleCwgZmxvYXQsIGNmLCBjKQorCisvLyBpbXBsZW1lbnRzIGNvbC1tYWpvciArPSBhbHBoYSAqIG9wKGdlbmVyYWwpICogb3AodHJpYW5ndWxhcikKKyNkZWZpbmUgRUlHRU5fQkxBU19UUk1NX1IoRUlHVFlQRSwgQkxBU1RZUEUsIEVJR1BSRUZJWCwgQkxBU1BSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgXAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBcCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+IFwKK3N0cnVjdCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeF90cm1tPEVJR1RZUEUsSW5kZXgsTW9kZSxmYWxzZSwgXAorICAgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yPiBcCit7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyLCBcCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEsIFwKKyAgICBJc1VuaXREaWFnICA9IChNb2RlJlVuaXREaWFnKSA/IDEgOiAwLCBcCisgICAgSXNaZXJvRGlhZyAgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwgXAorICAgIExvd1VwID0gSXNMb3dlciA/IExvd2VyIDogVXBwZXIsIFwKKyAgICBjb25qQSA9ICgoUmhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlUmhzKSA/IDEgOiAwIFwKKyAgfTsgXAorXAorICBzdGF0aWMgdm9pZCBydW4oIFwKKyAgICBJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIEluZGV4IF9kZXB0aCwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLEVJR1RZUEU+JiBibG9ja2luZykgXAorICB7IFwKKyAgIEluZGV4IGRpYWdTaXplICA9IChzdGQ6Om1pbikoX2NvbHMsX2RlcHRoKTsgXAorICAgSW5kZXggcm93cyAgICAgID0gX3Jvd3M7IFwKKyAgIEluZGV4IGRlcHRoICAgICA9IElzTG93ZXIgPyBfZGVwdGggOiBkaWFnU2l6ZTsgXAorICAgSW5kZXggY29scyAgICAgID0gSXNMb3dlciA/IGRpYWdTaXplIDogX2NvbHM7IFwKK1wKKyAgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIExoc1N0b3JhZ2VPcmRlcj4gTWF0cml4TGhzOyBcCisgICB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+IE1hdHJpeFJoczsgXAorXAorLyogTm9uLXNxdWFyZSBjYXNlIC0gZG9lc24ndCBmaXQgdG8gQkxBUyA/VFJNTS4gRmFsbCB0byBkZWZhdWx0IHRyaWFuZ3VsYXIgcHJvZHVjdCBvciBjYWxsIEJMQVMgP0dFTU0qLyBcCisgICBpZiAoY29scyAhPSBkZXB0aCkgeyBcCitcCisgICAgIGludCBudGhyID0gMSAvKm1rbF9kb21haW5fZ2V0X21heF90aHJlYWRzKEVJR0VOX0JMQVNfRE9NQUlOX0JMQVMpKi87IFwKK1wKKyAgICAgaWYgKChudGhyPT0xKSAmJiAoKChzdGQ6Om1heCkoY29scyxkZXB0aCktZGlhZ1NpemUpLyhkb3VibGUpZGlhZ1NpemUgPCAwLjUpKSB7IFwKKyAgICAgLyogTW9zdCBsaWtlbHkgbm8gYmVuZWZpdCB0byBjYWxsIFRSTU0gb3IgR0VNTSBmcm9tIEJMQVMqLyBcCisgICAgICAgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8RUlHVFlQRSxJbmRleCxNb2RlLGZhbHNlLCBcCisgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLCBDb25qdWdhdGVSaHMsIENvbE1ham9yLCBCdWlsdEluPjo6cnVuKCBcCisgICAgICAgICAgIF9yb3dzLCBfY29scywgX2RlcHRoLCBfbGhzLCBsaHNTdHJpZGUsIF9yaHMsIHJoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhLCBibG9ja2luZyk7IFwKKyAgICAgICAvKnN0ZDo6Y291dCA8PCAiVFJNTV9SOiBBIGlzIG5vdCBzcXVhcmUhIEdvIHRvIEVpZ2VuIFRSTU0gaW1wbGVtZW50YXRpb24hXG4iOyovIFwKKyAgICAgfSBlbHNlIHsgXAorICAgICAvKiBNYWtlIHNlbnNlIHRvIGNhbGwgR0VNTSAqLyBcCisgICAgICAgTWFwPGNvbnN0IE1hdHJpeFJocywgMCwgT3V0ZXJTdHJpZGU8PiA+IHJoc01hcChfcmhzLGRlcHRoLGNvbHMsIE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgICAgICBNYXRyaXhSaHMgYWFfdG1wPXJoc01hcC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpOyBcCisgICAgICAgQmxhc0luZGV4IGFTdHJpZGUgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oYWFfdG1wLm91dGVyU3RyaWRlKCkpOyBcCisgICAgICAgZ2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixFSUdUWVBFLEVJR1RZUEUsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+IGdlbW1fYmxvY2tpbmcoX3Jvd3MsX2NvbHMsX2RlcHRoLCAxLCB0cnVlKTsgXAorICAgICAgIGdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PEluZGV4LEVJR1RZUEUsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxFSUdUWVBFLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3I+OjpydW4oIFwKKyAgICAgICByb3dzLCBjb2xzLCBkZXB0aCwgX2xocywgbGhzU3RyaWRlLCBhYV90bXAuZGF0YSgpLCBhU3RyaWRlLCByZXMsIHJlc1N0cmlkZSwgYWxwaGEsIGdlbW1fYmxvY2tpbmcsIDApOyBcCitcCisgICAgIC8qc3RkOjpjb3V0IDw8ICJUUk1NX1I6IEEgaXMgbm90IHNxdWFyZSEgR28gdG8gQkxBUyBHRU1NIGltcGxlbWVudGF0aW9uISAiIDw8IG50aHI8PCIgXG4iOyovIFwKKyAgICAgfSBcCisgICAgIHJldHVybjsgXAorICAgfSBcCisgICBjaGFyIHNpZGUgPSAnUicsIHRyYW5zYSwgdXBsbywgZGlhZyA9ICdOJzsgXAorICAgRUlHVFlQRSAqYjsgXAorICAgY29uc3QgRUlHVFlQRSAqYTsgXAorICAgQmxhc0luZGV4IG0sIG4sIGxkYSwgbGRiOyBcCitcCisvKiBTZXQgbSwgbiAqLyBcCisgICBtID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJvd3MpOyBcCisgICBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGRpYWdTaXplKTsgXAorXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlUmhzKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKK1wKKy8qIFNldCBiLCBsZGIgKi8gXAorICAgTWFwPGNvbnN0IE1hdHJpeExocywgMCwgT3V0ZXJTdHJpZGU8PiA+IGxocyhfbGhzLHJvd3MsZGVwdGgsT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsgXAorICAgTWF0cml4WCMjRUlHUFJFRklYIGJfdG1wOyBcCitcCisgICBpZiAoQ29uanVnYXRlTGhzKSBiX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgZWxzZSBiX3RtcCA9IGxoczsgXAorICAgYiA9IGJfdG1wLmRhdGEoKTsgXAorICAgbGRiID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGJfdG1wLm91dGVyU3RyaWRlKCkpOyBcCitcCisvKiBTZXQgdXBsbyAqLyBcCisgICB1cGxvID0gSXNMb3dlciA/ICdMJyA6ICdVJzsgXAorICAgaWYgKFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpIHVwbG8gPSAodXBsbyA9PSAnTCcpID8gJ1UnIDogJ0wnOyBcCisvKiBTZXQgYSwgbGRhICovIFwKKyAgIE1hcDxjb25zdCBNYXRyaXhSaHMsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxkZXB0aCxjb2xzLCBPdXRlclN0cmlkZTw+KHJoc1N0cmlkZSkpOyBcCisgICBNYXRyaXhSaHMgYV90bXA7IFwKK1wKKyAgIGlmICgoY29uakEhPTApIHx8IChTZXREaWFnPT0wKSkgeyBcCisgICAgIGlmIChjb25qQSkgYV90bXAgPSByaHMuY29uanVnYXRlKCk7IGVsc2UgYV90bXAgPSByaHM7IFwKKyAgICAgaWYgKElzWmVyb0RpYWcpIFwKKyAgICAgICBhX3RtcC5kaWFnb25hbCgpLnNldFplcm8oKTsgXAorICAgICBlbHNlIGlmIChJc1VuaXREaWFnKSBcCisgICAgICAgYV90bXAuZGlhZ29uYWwoKS5zZXRPbmVzKCk7XAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgfSBlbHNlIHsgXAorICAgICBhID0gX3JoczsgXAorICAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocmhzU3RyaWRlKTsgXAorICAgfSBcCisgICAvKnN0ZDo6Y291dCA8PCAiVFJNTV9SOiBBIGlzIHNxdWFyZSEgR28gdG8gQkxBUyBUUk1NIGltcGxlbWVudGF0aW9uISBcbiI7Ki8gXAorLyogY2FsbCA/dHJtbSovIFwKKyAgIEJMQVNQUkVGSVgjI3RybW1fKCZzaWRlLCAmdXBsbywgJnRyYW5zYSwgJmRpYWcsICZtLCAmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChCTEFTVFlQRSopYiwgJmxkYik7IFwKK1wKKy8qIEFkZCBvcChhX3RyaWFuZ3VsYXIpKmIgaW50byByZXMqLyBcCisgICBNYXA8TWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmVzX3RtcChyZXMscm93cyxjb2xzLE91dGVyU3RyaWRlPD4ocmVzU3RyaWRlKSk7IFwKKyAgIHJlc190bXA9cmVzX3RtcCtiX3RtcDsgXAorICB9IFwKK307CisKK0VJR0VOX0JMQVNfVFJNTV9SKGRvdWJsZSwgZG91YmxlLCBkLCBkKQorRUlHRU5fQkxBU19UUk1NX1IoZGNvbXBsZXgsIGRvdWJsZSwgY2QsIHopCitFSUdFTl9CTEFTX1RSTU1fUihmbG9hdCwgZmxvYXQsIGYsIHMpCitFSUdFTl9CTEFTX1RSTU1fUihzY29tcGxleCwgZmxvYXQsIGNmLCBjKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfQkxBU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyOTJlNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaApAQCAtMCwwICsxLDMzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJNQVRSSVhWRUNUT1JfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSTUFUUklYVkVDVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHMsIGludCBTdG9yYWdlT3JkZXIsIGludCBWZXJzaW9uPVNwZWNpYWxpemVkPgorc3RydWN0IHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxDb2xNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoKE1vZGUmTG93ZXIpPT1Mb3dlciksCisgICAgSGFzVW5pdERpYWcgPSAoTW9kZSAmIFVuaXREaWFnKT09VW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKT09WmVyb0RpYWcKKyAgfTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FICB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogX3JocywgSW5kZXggcmhzSW5jciwgUmVzU2NhbGFyKiBfcmVzLCBJbmRleCByZXNJbmNyLCBjb25zdCBSaHNTY2FsYXImIGFscGhhKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qUmhzLCBpbnQgVmVyc2lvbj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxDb2xNYWpvcixWZXJzaW9uPgorICA6OnJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFJlc1NjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgY29uc3QgUmhzU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHN0YXRpYyBjb25zdCBJbmRleCBQYW5lbFdpZHRoID0gRUlHRU5fVFVORV9UUklBTkdVTEFSX1BBTkVMX1dJRFRIOworICAgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKTsKKyAgICBJbmRleCByb3dzID0gSXNMb3dlciA/IF9yb3dzIDogKHN0ZDo6bWluKShfcm93cyxfY29scyk7CisgICAgSW5kZXggY29scyA9IElzTG93ZXIgPyAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKSA6IF9jb2xzOworCisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTGhzTWFwOworICAgIGNvbnN0IExoc01hcCBsaHMoX2xocyxyb3dzLGNvbHMsT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsKKyAgICB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29uakxocyxMaHNNYXA+Ojp0eXBlIGNqTGhzKGxocyk7CisKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPD4gPiBSaHNNYXA7CisgICAgY29uc3QgUmhzTWFwIHJocyhfcmhzLGNvbHMsSW5uZXJTdHJpZGU8PihyaHNJbmNyKSk7CisgICAgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpSaHMsUmhzTWFwPjo6dHlwZSBjalJocyhyaHMpOworCisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+ID4gUmVzTWFwOworICAgIFJlc01hcCByZXMoX3Jlcyxyb3dzKTsKKworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxMaHNTY2FsYXIsSW5kZXgsQ29sTWFqb3I+IExoc01hcHBlcjsKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8UmhzU2NhbGFyLEluZGV4LFJvd01ham9yPiBSaHNNYXBwZXI7CisKKyAgICBmb3IgKEluZGV4IHBpPTA7IHBpPHNpemU7IHBpKz1QYW5lbFdpZHRoKQorICAgIHsKKyAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSAoc3RkOjptaW4pKFBhbmVsV2lkdGgsIHNpemUtcGkpOworICAgICAgZm9yIChJbmRleCBrPTA7IGs8YWN0dWFsUGFuZWxXaWR0aDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGkgKyBrOworICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/ICgoSGFzVW5pdERpYWd8fEhhc1plcm9EaWFnKSA/IGkrMSA6IGkgKSA6IHBpOworICAgICAgICBJbmRleCByID0gSXNMb3dlciA/IGFjdHVhbFBhbmVsV2lkdGgtayA6IGsrMTsKKyAgICAgICAgaWYgKCghKEhhc1VuaXREaWFnfHxIYXNaZXJvRGlhZykpIHx8ICgtLXIpPjApCisgICAgICAgICAgcmVzLnNlZ21lbnQocyxyKSArPSAoYWxwaGEgKiBjalJocy5jb2VmZihpKSkgKiBjakxocy5jb2woaSkuc2VnbWVudChzLHIpOworICAgICAgICBpZiAoSGFzVW5pdERpYWcpCisgICAgICAgICAgcmVzLmNvZWZmUmVmKGkpICs9IGFscGhhICogY2pSaHMuY29lZmYoaSk7CisgICAgICB9CisgICAgICBJbmRleCByID0gSXNMb3dlciA/IHJvd3MgLSBwaSAtIGFjdHVhbFBhbmVsV2lkdGggOiBwaTsKKyAgICAgIGlmIChyPjApCisgICAgICB7CisgICAgICAgIEluZGV4IHMgPSBJc0xvd2VyID8gcGkrYWN0dWFsUGFuZWxXaWR0aCA6IDA7CisgICAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsQ29sTWFqb3IsQ29uakxocyxSaHNTY2FsYXIsUmhzTWFwcGVyLENvbmpSaHMsQnVpbHRJbj46OnJ1bigKKyAgICAgICAgICAgIHIsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICBMaHNNYXBwZXIoJmxocy5jb2VmZlJlZihzLHBpKSwgbGhzU3RyaWRlKSwKKyAgICAgICAgICAgIFJoc01hcHBlcigmcmhzLmNvZWZmUmVmKHBpKSwgcmhzSW5jciksCisgICAgICAgICAgICAmcmVzLmNvZWZmUmVmKHMpLCByZXNJbmNyLCBhbHBoYSk7CisgICAgICB9CisgICAgfQorICAgIGlmKCghSXNMb3dlcikgJiYgY29scz5zaXplKQorICAgIHsKKyAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsQ29sTWFqb3IsQ29uakxocyxSaHNTY2FsYXIsUmhzTWFwcGVyLENvbmpSaHM+OjpydW4oCisgICAgICAgICAgcm93cywgY29scy1zaXplLAorICAgICAgICAgIExoc01hcHBlcigmbGhzLmNvZWZmUmVmKDAsc2l6ZSksIGxoc1N0cmlkZSksCisgICAgICAgICAgUmhzTWFwcGVyKCZyaHMuY29lZmZSZWYoc2l6ZSksIHJoc0luY3IpLAorICAgICAgICAgIF9yZXMsIHJlc0luY3IsIGFscGhhKTsKKyAgICB9CisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHMsaW50IFZlcnNpb24+CitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxSb3dNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoKE1vZGUmTG93ZXIpPT1Mb3dlciksCisgICAgSGFzVW5pdERpYWcgPSAoTW9kZSAmIFVuaXREaWFnKT09VW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKT09WmVyb0RpYWcKKyAgfTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgY29uc3QgTGhzU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFJlc1NjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgY29uc3QgUmVzU2NhbGFyJiBhbHBoYSk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocyxpbnQgVmVyc2lvbj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxSb3dNYWpvcixWZXJzaW9uPgorICA6OnJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFJlc1NjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgY29uc3QgUmVzU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHN0YXRpYyBjb25zdCBJbmRleCBQYW5lbFdpZHRoID0gRUlHRU5fVFVORV9UUklBTkdVTEFSX1BBTkVMX1dJRFRIOworICAgIEluZGV4IGRpYWdTaXplID0gKHN0ZDo6bWluKShfcm93cyxfY29scyk7CisgICAgSW5kZXggcm93cyA9IElzTG93ZXIgPyBfcm93cyA6IGRpYWdTaXplOworICAgIEluZGV4IGNvbHMgPSBJc0xvd2VyID8gZGlhZ1NpemUgOiBfY29sczsKKworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IExoc01hcDsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMscm93cyxjb2xzLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpMaHMsTGhzTWFwPjo6dHlwZSBjakxocyhsaHMpOworCisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4gUmhzTWFwOworICAgIGNvbnN0IFJoc01hcCByaHMoX3Jocyxjb2xzKTsKKyAgICB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29ualJocyxSaHNNYXA+Ojp0eXBlIGNqUmhzKHJocyk7CisKKyAgICB0eXBlZGVmIE1hcDxNYXRyaXg8UmVzU2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPD4gPiBSZXNNYXA7CisgICAgUmVzTWFwIHJlcyhfcmVzLHJvd3MsSW5uZXJTdHJpZGU8PihyZXNJbmNyKSk7CisKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8TGhzU2NhbGFyLEluZGV4LFJvd01ham9yPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFJoc1NjYWxhcixJbmRleCxSb3dNYWpvcj4gUmhzTWFwcGVyOworCisgICAgZm9yIChJbmRleCBwaT0wOyBwaTxkaWFnU2l6ZTsgcGkrPVBhbmVsV2lkdGgpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IChzdGQ6Om1pbikoUGFuZWxXaWR0aCwgZGlhZ1NpemUtcGkpOworICAgICAgZm9yIChJbmRleCBrPTA7IGs8YWN0dWFsUGFuZWxXaWR0aDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGkgKyBrOworICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IHBpICA6ICgoSGFzVW5pdERpYWd8fEhhc1plcm9EaWFnKSA/IGkrMSA6IGkpOworICAgICAgICBJbmRleCByID0gSXNMb3dlciA/IGsrMSA6IGFjdHVhbFBhbmVsV2lkdGgtazsKKyAgICAgICAgaWYgKCghKEhhc1VuaXREaWFnfHxIYXNaZXJvRGlhZykpIHx8ICgtLXIpPjApCisgICAgICAgICAgcmVzLmNvZWZmUmVmKGkpICs9IGFscGhhICogKGNqTGhzLnJvdyhpKS5zZWdtZW50KHMscikuY3dpc2VQcm9kdWN0KGNqUmhzLnNlZ21lbnQocyxyKS50cmFuc3Bvc2UoKSkpLnN1bSgpOworICAgICAgICBpZiAoSGFzVW5pdERpYWcpCisgICAgICAgICAgcmVzLmNvZWZmUmVmKGkpICs9IGFscGhhICogY2pSaHMuY29lZmYoaSk7CisgICAgICB9CisgICAgICBJbmRleCByID0gSXNMb3dlciA/IHBpIDogY29scyAtIHBpIC0gYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgIGlmIChyPjApCisgICAgICB7CisgICAgICAgIEluZGV4IHMgPSBJc0xvd2VyID8gMCA6IHBpICsgYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixSb3dNYWpvcixDb25qTGhzLFJoc1NjYWxhcixSaHNNYXBwZXIsQ29ualJocyxCdWlsdEluPjo6cnVuKAorICAgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgciwKKyAgICAgICAgICAgIExoc01hcHBlcigmbGhzLmNvZWZmUmVmKHBpLHMpLCBsaHNTdHJpZGUpLAorICAgICAgICAgICAgUmhzTWFwcGVyKCZyaHMuY29lZmZSZWYocyksIHJoc0luY3IpLAorICAgICAgICAgICAgJnJlcy5jb2VmZlJlZihwaSksIHJlc0luY3IsIGFscGhhKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoSXNMb3dlciAmJiByb3dzPmRpYWdTaXplKQorICAgIHsKKyAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsUm93TWFqb3IsQ29uakxocyxSaHNTY2FsYXIsUmhzTWFwcGVyLENvbmpSaHM+OjpydW4oCisgICAgICAgICAgICByb3dzLWRpYWdTaXplLCBjb2xzLAorICAgICAgICAgICAgTGhzTWFwcGVyKCZsaHMuY29lZmZSZWYoZGlhZ1NpemUsMCksIGxoc1N0cmlkZSksCisgICAgICAgICAgICBSaHNNYXBwZXIoJnJocy5jb2VmZlJlZigwKSwgcmhzSW5jciksCisgICAgICAgICAgICAmcmVzLmNvZWZmUmVmKGRpYWdTaXplKSwgcmVzSW5jciwgYWxwaGEpOworICAgIH0KKyAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyYXBwZXIgdG8gcHJvZHVjdF90cmlhbmd1bGFyX3ZlY3RvcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTxpbnQgTW9kZSxpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHRybXZfc2VsZWN0b3I7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJpYW5ndWxhcl9wcm9kdWN0X2ltcGw8TW9kZSx0cnVlLExocyxmYWxzZSxSaHMsdHJ1ZT4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gc3RhdGljIHZvaWQgcnVuKERlc3QmIGRzdCwgY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCk9PWxocy5yb3dzKCkgJiYgZHN0LmNvbHMoKT09cmhzLmNvbHMoKSk7CisgIAorICAgIGludGVybmFsOjp0cm12X3NlbGVjdG9yPE1vZGUsKGludChpbnRlcm5hbDo6dHJhaXRzPExocz46OkZsYWdzKSZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yPjo6cnVuKGxocywgcmhzLCBkc3QsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE1vZGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyaWFuZ3VsYXJfcHJvZHVjdF9pbXBsPE1vZGUsZmFsc2UsTGhzLHRydWUsUmhzLGZhbHNlPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBzdGF0aWMgdm9pZCBydW4oRGVzdCYgZHN0LCBjb25zdCBMaHMgJmxocywgY29uc3QgUmhzICZyaHMsIGNvbnN0IHR5cGVuYW1lIERlc3Q6OlNjYWxhciYgYWxwaGEpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoZHN0LnJvd3MoKT09bGhzLnJvd3MoKSAmJiBkc3QuY29scygpPT1yaHMuY29scygpKTsKKworICAgIFRyYW5zcG9zZTxEZXN0PiBkc3RUKGRzdCk7CisgICAgaW50ZXJuYWw6OnRybXZfc2VsZWN0b3I8KE1vZGUgJiAoVW5pdERpYWd8WmVyb0RpYWcpKSB8ICgoTW9kZSAmIExvd2VyKSA/IFVwcGVyIDogTG93ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQoaW50ZXJuYWw6OnRyYWl0czxSaHM+OjpGbGFncykmUm93TWFqb3JCaXQpID8gQ29sTWFqb3IgOiBSb3dNYWpvcj4KKyAgICAgICAgICAgIDo6cnVuKHJocy50cmFuc3Bvc2UoKSxsaHMudHJhbnNwb3NlKCksIGRzdFQsIGFscGhhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE86IGZpbmQgYSB3YXkgdG8gZmFjdG9yaXplIHRoaXMgcGllY2Ugb2YgY29kZSB3aXRoIGdlbXZfc2VsZWN0b3Igc2luY2UgdGhlIGxvZ2ljIGlzIGV4YWN0bHkgdGhlIHNhbWUuCisgIAordGVtcGxhdGU8aW50IE1vZGU+IHN0cnVjdCB0cm12X3NlbGVjdG9yPE1vZGUsQ29sTWFqb3I+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzICZsaHMsIGNvbnN0IFJocyAmcmhzLCBEZXN0JiBkZXN0LCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OlNjYWxhciAgICAgIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyICAgICAgUmhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyICAgICBSZXNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8TGhzPiBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHNUeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPFJocz4gUmhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoc0JsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsUmhzVHlwZTsKKyAgICAKKyAgICB0eXBlZGVmIE1hcDxNYXRyaXg8UmVzU2NhbGFyLER5bmFtaWMsMT4sIEVJR0VOX1BMQUlOX0VOVU1fTUlOKEFsaWduZWRNYXgsaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSk+IE1hcHBlZERlc3Q7CisKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsTGhzVHlwZT46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChsaHMpOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxSaHNUeXBlPjo6dHlwZSBhY3R1YWxSaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KHJocyk7CisKKyAgICBSZXNTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IobGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihyaHMpOworCisgICAgZW51bSB7CisgICAgICAvLyBGSVhNRSBmaW5kIGEgd2F5IHRvIGFsbG93IGFuIGlubmVyIHN0cmlkZSBvbiB0aGUgcmVzdWx0IGlmIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZT09MQorICAgICAgLy8gb24sIHRoZSBvdGhlciBoYW5kIGl0IGlzIGdvb2QgZm9yIHRoZSBjYWNoZSB0byBwYWNrIHRoZSB2ZWN0b3IgYW55d2F5cy4uLgorICAgICAgRXZhbFRvRGVzdEF0Q29tcGlsZVRpbWUgPSBEZXN0OjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWU9PTEsCisgICAgICBDb21wbGV4QnlSZWFsID0gKE51bVRyYWl0czxMaHNTY2FsYXI+OjpJc0NvbXBsZXgpICYmICghTnVtVHJhaXRzPFJoc1NjYWxhcj46OklzQ29tcGxleCksCisgICAgICBNaWdodENhbm5vdFVzZURlc3QgPSAoRGVzdDo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lIT0xKSB8fCBDb21wbGV4QnlSZWFsCisgICAgfTsKKworICAgIGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxSZXNTY2FsYXIsRGVzdDo6U2l6ZUF0Q29tcGlsZVRpbWUsRGVzdDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsTWlnaHRDYW5ub3RVc2VEZXN0PiBzdGF0aWNfZGVzdDsKKworICAgIGJvb2wgYWxwaGFJc0NvbXBhdGlibGUgPSAoIUNvbXBsZXhCeVJlYWwpIHx8IChudW1leHQ6OmltYWcoYWN0dWFsQWxwaGEpPT1SZWFsU2NhbGFyKDApKTsKKyAgICBib29sIGV2YWxUb0Rlc3QgPSBFdmFsVG9EZXN0QXRDb21waWxlVGltZSAmJiBhbHBoYUlzQ29tcGF0aWJsZTsKKworICAgIFJoc1NjYWxhciBjb21wYXRpYmxlQWxwaGEgPSBnZXRfZmFjdG9yPFJlc1NjYWxhcixSaHNTY2FsYXI+OjpydW4oYWN0dWFsQWxwaGEpOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJlc1NjYWxhcixhY3R1YWxEZXN0UHRyLGRlc3Quc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsVG9EZXN0ID8gZGVzdC5kYXRhKCkgOiBzdGF0aWNfZGVzdC5kYXRhKCkpOworCisgICAgaWYoIWV2YWxUb0Rlc3QpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIEluZGV4IHNpemUgPSBkZXN0LnNpemUoKTsKKyAgICAgIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgICNlbmRpZgorICAgICAgaWYoIWFscGhhSXNDb21wYXRpYmxlKQorICAgICAgeworICAgICAgICBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKS5zZXRaZXJvKCk7CisgICAgICAgIGNvbXBhdGlibGVBbHBoYSA9IFJoc1NjYWxhcigxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSkgPSBkZXN0OworICAgIH0KKworICAgIGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdAorICAgICAgPEluZGV4LE1vZGUsCisgICAgICAgTGhzU2NhbGFyLCBMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgICAgUmhzU2NhbGFyLCBSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgICAgQ29sTWFqb3I+CisgICAgICA6OnJ1bihhY3R1YWxMaHMucm93cygpLGFjdHVhbExocy5jb2xzKCksCisgICAgICAgICAgICBhY3R1YWxMaHMuZGF0YSgpLGFjdHVhbExocy5vdXRlclN0cmlkZSgpLAorICAgICAgICAgICAgYWN0dWFsUmhzLmRhdGEoKSxhY3R1YWxSaHMuaW5uZXJTdHJpZGUoKSwKKyAgICAgICAgICAgIGFjdHVhbERlc3RQdHIsMSxjb21wYXRpYmxlQWxwaGEpOworCisgICAgaWYgKCFldmFsVG9EZXN0KQorICAgIHsKKyAgICAgIGlmKCFhbHBoYUlzQ29tcGF0aWJsZSkKKyAgICAgICAgZGVzdCArPSBhY3R1YWxBbHBoYSAqIE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpOworICAgICAgZWxzZQorICAgICAgICBkZXN0ID0gTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgTW9kZT4gc3RydWN0IHRybXZfc2VsZWN0b3I8TW9kZSxSb3dNYWpvcj4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMgJmxocywgY29uc3QgUmhzICZyaHMsIERlc3QmIGRlc3QsIGNvbnN0IHR5cGVuYW1lIERlc3Q6OlNjYWxhciYgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6U2NhbGFyICAgICAgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpTY2FsYXIgICAgICBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgICAgIFJlc1NjYWxhcjsKKyAgICAKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxMaHM+IExoc0JsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8UmhzPiBSaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsUmhzVHlwZT46OnR5cGUgQWN0dWFsUmhzVHlwZUNsZWFuZWQ7CisKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsTGhzVHlwZT46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChsaHMpOworICAgIHR5cGVuYW1lIGFkZF9jb25zdDxBY3R1YWxSaHNUeXBlPjo6dHlwZSBhY3R1YWxSaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KHJocyk7CisKKyAgICBSZXNTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IobGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihyaHMpOworCisgICAgZW51bSB7CisgICAgICBEaXJlY3RseVVzZVJocyA9IEFjdHVhbFJoc1R5cGVDbGVhbmVkOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWU9PTEKKyAgICB9OworCisgICAgZ2Vtdl9zdGF0aWNfdmVjdG9yX2lmPFJoc1NjYWxhcixBY3R1YWxSaHNUeXBlQ2xlYW5lZDo6U2l6ZUF0Q29tcGlsZVRpbWUsQWN0dWFsUmhzVHlwZUNsZWFuZWQ6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFEaXJlY3RseVVzZVJocz4gc3RhdGljX3JoczsKKworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsYWN0dWFsUmhzUHRyLGFjdHVhbFJocy5zaXplKCksCisgICAgICAgIERpcmVjdGx5VXNlUmhzID8gY29uc3RfY2FzdDxSaHNTY2FsYXIqPihhY3R1YWxSaHMuZGF0YSgpKSA6IHN0YXRpY19yaHMuZGF0YSgpKTsKKworICAgIGlmKCFEaXJlY3RseVVzZVJocykKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTgorICAgICAgSW5kZXggc2l6ZSA9IGFjdHVhbFJocy5zaXplKCk7CisgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIE1hcDx0eXBlbmFtZSBBY3R1YWxSaHNUeXBlQ2xlYW5lZDo6UGxhaW5PYmplY3Q+KGFjdHVhbFJoc1B0ciwgYWN0dWFsUmhzLnNpemUoKSkgPSBhY3R1YWxSaHM7CisgICAgfQorCisgICAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICA8SW5kZXgsTW9kZSwKKyAgICAgICBMaHNTY2FsYXIsIExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBSaHNTY2FsYXIsIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBSb3dNYWpvcj4KKyAgICAgIDo6cnVuKGFjdHVhbExocy5yb3dzKCksYWN0dWFsTGhzLmNvbHMoKSwKKyAgICAgICAgICAgIGFjdHVhbExocy5kYXRhKCksYWN0dWFsTGhzLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICBhY3R1YWxSaHNQdHIsMSwKKyAgICAgICAgICAgIGRlc3QuZGF0YSgpLGRlc3QuaW5uZXJTdHJpZGUoKSwKKyAgICAgICAgICAgIGFjdHVhbEFscGhhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUk1BVFJJWFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yX0JMQVMuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhWZWN0b3JfQkxBUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmYyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yX0JMQVMuaApAQCAtMCwwICsxLDI0MSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEJMQVMgRjc3CisgKiAgIFRyaWFuZ3VsYXIgbWF0cml4LXZlY3RvciBwcm9kdWN0IGZ1bmN0aW9uYWxpdHkgYmFzZWQgb24gP1RSTVYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfVkVDVE9SX0JMQVNfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9WRUNUT1JfQkxBU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0cmlhbmd1bGFyIG1hdHJpeC12ZWN0b3IgbXVsdGlwbGljYXRpb24gdXNpbmcgQkxBUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gdHJtdi9oZW12IHNwZWNpYWxpemF0aW9uCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qUmhzLCBpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3RybXYgOgorICB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxNb2RlLExoc1NjYWxhcixDb25qTGhzLFJoc1NjYWxhcixDb25qUmhzLFN0b3JhZ2VPcmRlcixCdWlsdEluPiB7fTsKKworI2RlZmluZSBFSUdFTl9CTEFTX1RSTVZfU1BFQ0lBTElaRShTY2FsYXIpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxNb2RlLFNjYWxhcixDb25qTGhzLFNjYWxhcixDb25qUmhzLENvbE1ham9yLFNwZWNpYWxpemVkPiB7IFwKKyBzdGF0aWMgdm9pZCBydW4oSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzSW5jciwgU2NhbGFyKiBfcmVzLCBJbmRleCByZXNJbmNyLCBTY2FsYXIgYWxwaGEpIHsgXAorICAgICAgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3RfdHJtdjxJbmRleCxNb2RlLFNjYWxhcixDb25qTGhzLFNjYWxhcixDb25qUmhzLENvbE1ham9yPjo6cnVuKCBcCisgICAgICAgIF9yb3dzLCBfY29scywgX2xocywgbGhzU3RyaWRlLCBfcmhzLCByaHNJbmNyLCBfcmVzLCByZXNJbmNyLCBhbHBoYSk7IFwKKyAgfSBcCit9OyBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPiBcCitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxTY2FsYXIsQ29uakxocyxTY2FsYXIsQ29ualJocyxSb3dNYWpvcixTcGVjaWFsaXplZD4geyBcCisgc3RhdGljIHZvaWQgcnVuKEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFNjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgU2NhbGFyIGFscGhhKSB7IFwKKyAgICAgIHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3RybXY8SW5kZXgsTW9kZSxTY2FsYXIsQ29uakxocyxTY2FsYXIsQ29ualJocyxSb3dNYWpvcj46OnJ1biggXAorICAgICAgICBfcm93cywgX2NvbHMsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzSW5jciwgX3JlcywgcmVzSW5jciwgYWxwaGEpOyBcCisgIH0gXAorfTsKKworRUlHRU5fQkxBU19UUk1WX1NQRUNJQUxJWkUoZG91YmxlKQorRUlHRU5fQkxBU19UUk1WX1NQRUNJQUxJWkUoZmxvYXQpCitFSUdFTl9CTEFTX1RSTVZfU1BFQ0lBTElaRShkY29tcGxleCkKK0VJR0VOX0JMQVNfVFJNVl9TUEVDSUFMSVpFKHNjb21wbGV4KQorCisvLyBpbXBsZW1lbnRzIGNvbC1tYWpvcjogcmVzICs9IGFscGhhICogb3AodHJpYW5ndWxhcikgKiB2ZWN0b3IKKyNkZWZpbmUgRUlHRU5fQkxBU19UUk1WX0NNKEVJR1RZUEUsIEJMQVNUWVBFLCBFSUdQUkVGSVgsIEJMQVNQUkVGSVgpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdF90cm12PEluZGV4LE1vZGUsRUlHVFlQRSxDb25qTGhzLEVJR1RZUEUsQ29ualJocyxDb2xNYWpvcj4geyBcCisgIGVudW0geyBcCisgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciwgXAorICAgIFNldERpYWcgPSAoTW9kZSYoWmVyb0RpYWd8VW5pdERpYWcpKSA/IDAgOiAxLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyIFwKKyAgfTsgXAorIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNJbmNyLCBFSUdUWVBFKiBfcmVzLCBJbmRleCByZXNJbmNyLCBFSUdUWVBFIGFscGhhKSBcCisgeyBcCisgICBpZiAoQ29uakxocyB8fCBJc1plcm9EaWFnKSB7IFwKKyAgICAgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxFSUdUWVBFLENvbmpMaHMsRUlHVFlQRSxDb25qUmhzLENvbE1ham9yLEJ1aWx0SW4+OjpydW4oIFwKKyAgICAgICBfcm93cywgX2NvbHMsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzSW5jciwgX3JlcywgcmVzSW5jciwgYWxwaGEpOyBcCisgICAgIHJldHVybjsgXAorICAgfVwKKyAgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKTsgXAorICAgSW5kZXggcm93cyA9IElzTG93ZXIgPyBfcm93cyA6IHNpemU7IFwKKyAgIEluZGV4IGNvbHMgPSBJc0xvd2VyID8gc2l6ZSA6IF9jb2xzOyBcCitcCisgICB0eXBlZGVmIFZlY3RvclgjI0VJR1BSRUZJWCBWZWN0b3JSaHM7IFwKKyAgIEVJR1RZUEUgKngsICp5O1wKK1wKKy8qIFNldCB4Ki8gXAorICAgTWFwPGNvbnN0IFZlY3RvclJocywgMCwgSW5uZXJTdHJpZGU8PiA+IHJocyhfcmhzLGNvbHMsSW5uZXJTdHJpZGU8PihyaHNJbmNyKSk7IFwKKyAgIFZlY3RvclJocyB4X3RtcDsgXAorICAgaWYgKENvbmpSaHMpIHhfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIHhfdG1wID0gcmhzOyBcCisgICB4ID0geF90bXAuZGF0YSgpOyBcCitcCisvKiBTcXVhcmUgcGFydCBoYW5kbGluZyAqL1wKK1wKKyAgIGNoYXIgdHJhbnMsIHVwbG8sIGRpYWc7IFwKKyAgIEJsYXNJbmRleCBtLCBuLCBsZGEsIGluY3gsIGluY3k7IFwKKyAgIEVJR1RZUEUgY29uc3QgKmE7IFwKKyAgIEVJR1RZUEUgYmV0YSgxKTsgXAorXAorLyogU2V0IG0sIG4gKi8gXAorICAgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihzaXplKTsgXAorICAgbGRhID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGxoc1N0cmlkZSk7IFwKKyAgIGluY3ggPSAxOyBcCisgICBpbmN5ID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc0luY3IpOyBcCitcCisvKiBTZXQgdXBsbywgdHJhbnMgYW5kIGRpYWcqLyBcCisgICB0cmFucyA9ICdOJzsgXAorICAgdXBsbyA9IElzTG93ZXIgPyAnTCcgOiAnVSc7IFwKKyAgIGRpYWcgPSBJc1VuaXREaWFnID8gJ1UnIDogJ04nOyBcCitcCisvKiBjYWxsID9UUk1WKi8gXAorICAgQkxBU1BSRUZJWCMjdHJtdl8oJnVwbG8sICZ0cmFucywgJmRpYWcsICZuLCAoY29uc3QgQkxBU1RZUEUqKV9saHMsICZsZGEsIChCTEFTVFlQRSopeCwgJmluY3gpOyBcCitcCisvKiBBZGQgb3AoYV90cilyaHMgaW50byByZXMqLyBcCisgICBCTEFTUFJFRklYIyNheHB5XygmbiwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLChjb25zdCBCTEFTVFlQRSopeCwgJmluY3gsIChCTEFTVFlQRSopX3JlcywgJmluY3kpOyBcCisvKiBOb24tc3F1YXJlIGNhc2UgLSBkb2Vzbid0IGZpdCB0byBCTEFTID9UUk1WLiBGYWxsIHRvIGRlZmF1bHQgdHJpYW5ndWxhciBwcm9kdWN0Ki8gXAorICAgaWYgKHNpemU8KHN0ZDo6bWF4KShyb3dzLGNvbHMpKSB7IFwKKyAgICAgaWYgKENvbmpSaHMpIHhfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIHhfdG1wID0gcmhzOyBcCisgICAgIHggPSB4X3RtcC5kYXRhKCk7IFwKKyAgICAgaWYgKHNpemU8cm93cykgeyBcCisgICAgICAgeSA9IF9yZXMgKyBzaXplKnJlc0luY3I7IFwKKyAgICAgICBhID0gX2xocyArIHNpemU7IFwKKyAgICAgICBtID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJvd3Mtc2l6ZSk7IFwKKyAgICAgICBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHNpemUpOyBcCisgICAgIH0gXAorICAgICBlbHNlIHsgXAorICAgICAgIHggKz0gc2l6ZTsgXAorICAgICAgIHkgPSBfcmVzOyBcCisgICAgICAgYSA9IF9saHMgKyBzaXplKmxkYTsgXAorICAgICAgIG0gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oc2l6ZSk7IFwKKyAgICAgICBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGNvbHMtc2l6ZSk7IFwKKyAgICAgfSBcCisgICAgIEJMQVNQUkVGSVgjI2dlbXZfKCZ0cmFucywgJm0sICZuLCAmbnVtZXh0OjpyZWFsX3JlZihhbHBoYSksIChjb25zdCBCTEFTVFlQRSopYSwgJmxkYSwgKGNvbnN0IEJMQVNUWVBFKil4LCAmaW5jeCwgJm51bWV4dDo6cmVhbF9yZWYoYmV0YSksIChCTEFTVFlQRSopeSwgJmluY3kpOyBcCisgICB9IFwKKyAgfSBcCit9OworCitFSUdFTl9CTEFTX1RSTVZfQ00oZG91YmxlLCAgIGRvdWJsZSwgZCwgIGQpCitFSUdFTl9CTEFTX1RSTVZfQ00oZGNvbXBsZXgsIGRvdWJsZSwgY2QsIHopCitFSUdFTl9CTEFTX1RSTVZfQ00oZmxvYXQsICAgIGZsb2F0LCAgZiwgIHMpCitFSUdFTl9CTEFTX1RSTVZfQ00oc2NvbXBsZXgsIGZsb2F0LCAgY2YsIGMpCisKKy8vIGltcGxlbWVudHMgcm93LW1ham9yOiByZXMgKz0gYWxwaGEgKiBvcCh0cmlhbmd1bGFyKSAqIHZlY3RvcgorI2RlZmluZSBFSUdFTl9CTEFTX1RSTVZfUk0oRUlHVFlQRSwgQkxBU1RZUEUsIEVJR1BSRUZJWCwgQkxBU1BSRUZJWCkgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4gXAorc3RydWN0IHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3RybXY8SW5kZXgsTW9kZSxFSUdUWVBFLENvbmpMaHMsRUlHVFlQRSxDb25qUmhzLFJvd01ham9yPiB7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyLCBcCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEsIFwKKyAgICBJc1VuaXREaWFnICA9IChNb2RlJlVuaXREaWFnKSA/IDEgOiAwLCBcCisgICAgSXNaZXJvRGlhZyAgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwgXAorICAgIExvd1VwID0gSXNMb3dlciA/IExvd2VyIDogVXBwZXIgXAorICB9OyBcCisgc3RhdGljIHZvaWQgcnVuKEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgY29uc3QgRUlHVFlQRSogX2xocywgSW5kZXggbGhzU3RyaWRlLCBcCisgICAgICAgICAgICAgICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc0luY3IsIEVJR1RZUEUqIF9yZXMsIEluZGV4IHJlc0luY3IsIEVJR1RZUEUgYWxwaGEpIFwKKyB7IFwKKyAgIGlmIChJc1plcm9EaWFnKSB7IFwKKyAgICAgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxFSUdUWVBFLENvbmpMaHMsRUlHVFlQRSxDb25qUmhzLFJvd01ham9yLEJ1aWx0SW4+OjpydW4oIFwKKyAgICAgICBfcm93cywgX2NvbHMsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzSW5jciwgX3JlcywgcmVzSW5jciwgYWxwaGEpOyBcCisgICAgIHJldHVybjsgXAorICAgfVwKKyAgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKTsgXAorICAgSW5kZXggcm93cyA9IElzTG93ZXIgPyBfcm93cyA6IHNpemU7IFwKKyAgIEluZGV4IGNvbHMgPSBJc0xvd2VyID8gc2l6ZSA6IF9jb2xzOyBcCitcCisgICB0eXBlZGVmIFZlY3RvclgjI0VJR1BSRUZJWCBWZWN0b3JSaHM7IFwKKyAgIEVJR1RZUEUgKngsICp5O1wKK1wKKy8qIFNldCB4Ki8gXAorICAgTWFwPGNvbnN0IFZlY3RvclJocywgMCwgSW5uZXJTdHJpZGU8PiA+IHJocyhfcmhzLGNvbHMsSW5uZXJTdHJpZGU8PihyaHNJbmNyKSk7IFwKKyAgIFZlY3RvclJocyB4X3RtcDsgXAorICAgaWYgKENvbmpSaHMpIHhfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIHhfdG1wID0gcmhzOyBcCisgICB4ID0geF90bXAuZGF0YSgpOyBcCitcCisvKiBTcXVhcmUgcGFydCBoYW5kbGluZyAqL1wKK1wKKyAgIGNoYXIgdHJhbnMsIHVwbG8sIGRpYWc7IFwKKyAgIEJsYXNJbmRleCBtLCBuLCBsZGEsIGluY3gsIGluY3k7IFwKKyAgIEVJR1RZUEUgY29uc3QgKmE7IFwKKyAgIEVJR1RZUEUgYmV0YSgxKTsgXAorXAorLyogU2V0IG0sIG4gKi8gXAorICAgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihzaXplKTsgXAorICAgbGRhID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KGxoc1N0cmlkZSk7IFwKKyAgIGluY3ggPSAxOyBcCisgICBpbmN5ID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHJlc0luY3IpOyBcCitcCisvKiBTZXQgdXBsbywgdHJhbnMgYW5kIGRpYWcqLyBcCisgICB0cmFucyA9IENvbmpMaHMgPyAnQycgOiAnVCc7IFwKKyAgIHVwbG8gPSBJc0xvd2VyID8gJ1UnIDogJ0wnOyBcCisgICBkaWFnID0gSXNVbml0RGlhZyA/ICdVJyA6ICdOJzsgXAorXAorLyogY2FsbCA/VFJNViovIFwKKyAgIEJMQVNQUkVGSVgjI3RybXZfKCZ1cGxvLCAmdHJhbnMsICZkaWFnLCAmbiwgKGNvbnN0IEJMQVNUWVBFKilfbGhzLCAmbGRhLCAoQkxBU1RZUEUqKXgsICZpbmN4KTsgXAorXAorLyogQWRkIG9wKGFfdHIpcmhzIGludG8gcmVzKi8gXAorICAgQkxBU1BSRUZJWCMjYXhweV8oJm4sICZudW1leHQ6OnJlYWxfcmVmKGFscGhhKSwoY29uc3QgQkxBU1RZUEUqKXgsICZpbmN4LCAoQkxBU1RZUEUqKV9yZXMsICZpbmN5KTsgXAorLyogTm9uLXNxdWFyZSBjYXNlIC0gZG9lc24ndCBmaXQgdG8gQkxBUyA/VFJNVi4gRmFsbCB0byBkZWZhdWx0IHRyaWFuZ3VsYXIgcHJvZHVjdCovIFwKKyAgIGlmIChzaXplPChzdGQ6Om1heCkocm93cyxjb2xzKSkgeyBcCisgICAgIGlmIChDb25qUmhzKSB4X3RtcCA9IHJocy5jb25qdWdhdGUoKTsgZWxzZSB4X3RtcCA9IHJoczsgXAorICAgICB4ID0geF90bXAuZGF0YSgpOyBcCisgICAgIGlmIChzaXplPHJvd3MpIHsgXAorICAgICAgIHkgPSBfcmVzICsgc2l6ZSpyZXNJbmNyOyBcCisgICAgICAgYSA9IF9saHMgKyBzaXplKmxkYTsgXAorICAgICAgIG0gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4ocm93cy1zaXplKTsgXAorICAgICAgIG4gPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4oc2l6ZSk7IFwKKyAgICAgfSBcCisgICAgIGVsc2UgeyBcCisgICAgICAgeCArPSBzaXplOyBcCisgICAgICAgeSA9IF9yZXM7IFwKKyAgICAgICBhID0gX2xocyArIHNpemU7IFwKKyAgICAgICBtID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHNpemUpOyBcCisgICAgICAgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4Pihjb2xzLXNpemUpOyBcCisgICAgIH0gXAorICAgICBCTEFTUFJFRklYIyNnZW12XygmdHJhbnMsICZuLCAmbSwgJm51bWV4dDo6cmVhbF9yZWYoYWxwaGEpLCAoY29uc3QgQkxBU1RZUEUqKWEsICZsZGEsIChjb25zdCBCTEFTVFlQRSopeCwgJmluY3gsICZudW1leHQ6OnJlYWxfcmVmKGJldGEpLCAoQkxBU1RZUEUqKXksICZpbmN5KTsgXAorICAgfSBcCisgIH0gXAorfTsKKworRUlHRU5fQkxBU19UUk1WX1JNKGRvdWJsZSwgICBkb3VibGUsIGQsICBkKQorRUlHRU5fQkxBU19UUk1WX1JNKGRjb21wbGV4LCBkb3VibGUsIGNkLCB6KQorRUlHRU5fQkxBU19UUk1WX1JNKGZsb2F0LCAgICBmbG9hdCwgIGYsICBzKQorRUlHRU5fQkxBU19UUk1WX1JNKHNjb21wbGV4LCBmbG9hdCwgIGNmLCBjKQorCit9IC8vIGVuZCBuYW1lc3Bhc2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9WRUNUT1JfQkxBU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyTWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYzM4YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXguaApAQCAtMCwwICsxLDMzNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX01BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBpZiB0aGUgcmhzIGlzIHJvdyBtYWpvciwgbGV0J3MgdHJhbnNwb3NlIHRoZSBwcm9kdWN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFNpZGUsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFRyaVN0b3JhZ2VPcmRlcj4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsSW5kZXgsU2lkZSxNb2RlLENvbmp1Z2F0ZSxUcmlTdG9yYWdlT3JkZXIsUm93TWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bigKKyAgICBJbmRleCBzaXplLCBJbmRleCBjb2xzLAorICAgIGNvbnN0IFNjYWxhciogIHRyaSwgSW5kZXggdHJpU3RyaWRlLAorICAgIFNjYWxhciogX290aGVyLCBJbmRleCBvdGhlclN0cmlkZSwKKyAgICBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8CisgICAgICBTY2FsYXIsIEluZGV4LCBTaWRlPT1PblRoZUxlZnQ/T25UaGVSaWdodDpPblRoZUxlZnQsCisgICAgICAoTW9kZSZVbml0RGlhZykgfCAoKE1vZGUmVXBwZXIpID8gTG93ZXIgOiBVcHBlciksCisgICAgICBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIENvbmp1Z2F0ZSwKKyAgICAgIFRyaVN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBDb2xNYWpvciA6IFJvd01ham9yLCBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKHNpemUsIGNvbHMsIHRyaSwgdHJpU3RyaWRlLCBfb3RoZXIsIG90aGVyU3RyaWRlLCBibG9ja2luZyk7CisgIH0KK307CisKKy8qIE9wdGltaXplZCB0cmlhbmd1bGFyIHNvbHZlciB3aXRoIG11bHRpcGxlIHJpZ2h0IGhhbmQgc2lkZSBhbmQgdGhlIHRyaWFuZ3VsYXIgbWF0cml4IG9uIHRoZSBsZWZ0CisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBUcmlTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLEluZGV4LE9uVGhlTGVmdCxNb2RlLENvbmp1Z2F0ZSxUcmlTdG9yYWdlT3JkZXIsQ29sTWFqb3I+Cit7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCBzaXplLCBJbmRleCBvdGhlclNpemUsCisgICAgY29uc3QgU2NhbGFyKiBfdHJpLCBJbmRleCB0cmlTdHJpZGUsCisgICAgU2NhbGFyKiBfb3RoZXIsIEluZGV4IG90aGVyU3RyaWRlLAorICAgIGxldmVsM19ibG9ja2luZzxTY2FsYXIsU2NhbGFyPiYgYmxvY2tpbmcpOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBUcmlTdG9yYWdlT3JkZXI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixJbmRleCxPblRoZUxlZnQsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLENvbE1ham9yPjo6cnVuKAorICAgIEluZGV4IHNpemUsIEluZGV4IG90aGVyU2l6ZSwKKyAgICBjb25zdCBTY2FsYXIqIF90cmksIEluZGV4IHRyaVN0cmlkZSwKKyAgICBTY2FsYXIqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsCisgICAgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIEluZGV4IGNvbHMgPSBvdGhlclNpemU7CisKKyAgICB0eXBlZGVmIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgVHJpU3RvcmFnZU9yZGVyPiBUcmlNYXBwZXI7CisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIENvbE1ham9yPiBPdGhlck1hcHBlcjsKKyAgICBUcmlNYXBwZXIgdHJpKF90cmksIHRyaVN0cmlkZSk7CisgICAgT3RoZXJNYXBwZXIgb3RoZXIoX290aGVyLCBvdGhlclN0cmlkZSk7CisKKyAgICB0eXBlZGVmIGdlYnBfdHJhaXRzPFNjYWxhcixTY2FsYXI+IFRyYWl0czsKKworICAgIGVudW0geworICAgICAgU21hbGxQYW5lbFdpZHRoICAgPSBFSUdFTl9QTEFJTl9FTlVNX01BWChUcmFpdHM6Om1yLFRyYWl0czo6bnIpLAorICAgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlcgorICAgIH07CisKKyAgICBJbmRleCBrYyA9IGJsb2NraW5nLmtjKCk7ICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIEsgZGlyZWN0aW9uCisgICAgSW5kZXggbWMgPSAoc3RkOjptaW4pKHNpemUsYmxvY2tpbmcubWMoKSk7ICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBNIGRpcmVjdGlvbgorCisgICAgc3RkOjpzaXplX3Qgc2l6ZUEgPSBrYyptYzsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IGtjKmNvbHM7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIHNpemVBLCBibG9ja2luZy5ibG9ja0EoKSk7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tCLCBzaXplQiwgYmxvY2tpbmcuYmxvY2tCKCkpOworCisgICAgY29ual9pZjxDb25qdWdhdGU+IGNvbmo7CisgICAgZ2VicF9rZXJuZWw8U2NhbGFyLCBTY2FsYXIsIEluZGV4LCBPdGhlck1hcHBlciwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlLCBmYWxzZT4gZ2VicF9rZXJuZWw7CisgICAgZ2VtbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBUcmlNYXBwZXIsIFRyYWl0czo6bXIsIFRyYWl0czo6TGhzUHJvZ3Jlc3MsIFRyaVN0b3JhZ2VPcmRlcj4gcGFja19saHM7CisgICAgZ2VtbV9wYWNrX3JoczxTY2FsYXIsIEluZGV4LCBPdGhlck1hcHBlciwgVHJhaXRzOjpuciwgQ29sTWFqb3IsIGZhbHNlLCB0cnVlPiBwYWNrX3JoczsKKworICAgIC8vIHRoZSBnb2FsIGhlcmUgaXMgdG8gc3ViZGl2aXNlIHRoZSBSaHMgcGFuZWxzIHN1Y2ggdGhhdCB3ZSBrZWVwIHNvbWUgY2FjaGUKKyAgICAvLyBjb2hlcmVuY2Ugd2hlbiBhY2Nlc3NpbmcgdGhlIHJocyBlbGVtZW50cworICAgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMiwgbDM7CisgICAgbWFuYWdlX2NhY2hpbmdfc2l6ZXMoR2V0QWN0aW9uLCAmbDEsICZsMiwgJmwzKTsKKyAgICBJbmRleCBzdWJjb2xzID0gY29scz4wID8gbDIvKDQgKiBzaXplb2YoU2NhbGFyKSAqIHN0ZDo6bWF4PEluZGV4PihvdGhlclN0cmlkZSxzaXplKSkgOiAwOworICAgIHN1YmNvbHMgPSBzdGQ6Om1heDxJbmRleD4oKHN1YmNvbHMvVHJhaXRzOjpucikqVHJhaXRzOjpuciwgVHJhaXRzOjpucik7CisKKyAgICBmb3IoSW5kZXggazI9SXNMb3dlciA/IDAgOiBzaXplOworICAgICAgICBJc0xvd2VyID8gazI8c2l6ZSA6IGsyPjA7CisgICAgICAgIElzTG93ZXIgPyBrMis9a2MgOiBrMi09a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShJc0xvd2VyID8gc2l6ZS1rMiA6IGsyLCBrYyk7CisKKyAgICAgIC8vIFdlIGhhdmUgc2VsZWN0ZWQgYW5kIHBhY2tlZCBhIGJpZyBob3Jpem9udGFsIHBhbmVsIFIxIG9mIHJocy4gTGV0IEIgYmUgdGhlIHBhY2tlZCBjb3B5IG9mIHRoaXMgcGFuZWwsCisgICAgICAvLyBhbmQgUjIgdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHJocy4gVGhlIGNvcnJlc3BvbmRpbmcgdmVydGljYWwgcGFuZWwgb2YgbGhzIGlzIHNwbGl0IGludG8KKyAgICAgIC8vIEExMSAodGhlIHRyaWFuZ3VsYXIgcGFydCkgYW5kIEEyMSB0aGUgcmVtYWluaW5nIHJlY3Rhbmd1bGFyIHBhcnQuCisgICAgICAvLyBUaGVuIHRoZSBoaWdoIGxldmVsIGFsZ29yaXRobSBpczoKKyAgICAgIC8vICAtIEIgPSBSMSAgICAgICAgICAgICAgICAgICAgPT4gZ2VuZXJhbCBibG9jayBjb3B5IChkb25lIGR1cmluZyB0aGUgbmV4dCBzdGVwKQorICAgICAgLy8gIC0gUjEgPSBBMTFeLTEgQiAgICAgICAgICAgICA9PiB0cmlja3kgcGFydAorICAgICAgLy8gIC0gdXBkYXRlIEIgZnJvbSB0aGUgbmV3IFIxICA9PiBhY3R1YWxseSB0aGlzIGhhcyB0byBiZSBwZXJmb3JtZWQgY29udGludW91c2x5IGR1cmluZyB0aGUgYWJvdmUgc3RlcAorICAgICAgLy8gIC0gUjIgLT0gQTIxICogQiAgICAgICAgICAgICA9PiBHRVBQCisKKyAgICAgIC8vIFRoZSB0cmlja3kgcGFydDogY29tcHV0ZSBSMSA9IEExMV4tMSBCIHdoaWxlIHVwZGF0aW5nIEIgZnJvbSBSMQorICAgICAgLy8gVGhlIGlkZWEgaXMgdG8gc3BsaXQgQTExIGludG8gbXVsdGlwbGUgc21hbGwgdmVydGljYWwgcGFuZWxzLgorICAgICAgLy8gRWFjaCBwYW5lbCBjYW4gYmUgc3BsaXQgaW50byBhIHNtYWxsIHRyaWFuZ3VsYXIgcGFydCBUMWsgd2hpY2ggaXMgcHJvY2Vzc2VkIHdpdGhvdXQgb3B0aW1pemF0aW9uLAorICAgICAgLy8gYW5kIHRoZSByZW1haW5pbmcgc21hbGwgcGFydCBUMmsgd2hpY2ggaXMgcHJvY2Vzc2VkIHVzaW5nIGdlYnAgd2l0aCBhcHByb3ByaWF0ZSBibG9jayBzdHJpZGVzCisgICAgICBmb3IoSW5kZXggajI9MDsgajI8Y29sczsgajIrPXN1YmNvbHMpCisgICAgICB7CisgICAgICAgIEluZGV4IGFjdHVhbF9jb2xzID0gKHN0ZDo6bWluKShjb2xzLWoyLHN1YmNvbHMpOworICAgICAgICAvLyBmb3IgZWFjaCBzbWFsbCB2ZXJ0aWNhbCBwYW5lbHMgW1Qxa15ULCBUMmteVF1eVCBvZiBsaHMKKyAgICAgICAgZm9yIChJbmRleCBrMT0wOyBrMTxhY3R1YWxfa2M7IGsxKz1TbWFsbFBhbmVsV2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBhY3R1YWxQYW5lbFdpZHRoID0gc3RkOjptaW48SW5kZXg+KGFjdHVhbF9rYy1rMSwgU21hbGxQYW5lbFdpZHRoKTsKKyAgICAgICAgICAvLyB0ciBzb2x2ZQorICAgICAgICAgIGZvciAoSW5kZXggaz0wOyBrPGFjdHVhbFBhbmVsV2lkdGg7ICsraykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIHdyaXRlIGEgc21hbGwga2VybmVsIGhhbmRsaW5nIHRoaXMgKGNhbiBiZSBzaGFyZWQgd2l0aCB0cnN2KQorICAgICAgICAgICAgSW5kZXggaSAgPSBJc0xvd2VyID8gazIrazErayA6IGsyLWsxLWstMTsKKyAgICAgICAgICAgIEluZGV4IHJzID0gYWN0dWFsUGFuZWxXaWR0aCAtIGsgLSAxOyAvLyByZW1haW5pbmcgc2l6ZQorICAgICAgICAgICAgSW5kZXggcyAgPSBUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gKElzTG93ZXIgPyBrMitrMSA6IGkrMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICBJc0xvd2VyID8gaSsxIDogaS1yczsKKworICAgICAgICAgICAgU2NhbGFyIGEgPSAoTW9kZSAmIFVuaXREaWFnKSA/IFNjYWxhcigxKSA6IFNjYWxhcigxKS9jb25qKHRyaShpLGkpKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXggaj1qMjsgajxqMithY3R1YWxfY29sczsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoVHJpU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjYWxhciBiKDApOworICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciogbCA9ICZ0cmkoaSxzKTsKKyAgICAgICAgICAgICAgICBTY2FsYXIqIHIgPSAmb3RoZXIocyxqKTsKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGkzPTA7IGkzPGs7ICsraTMpCisgICAgICAgICAgICAgICAgICBiICs9IGNvbmoobFtpM10pICogcltpM107CisKKyAgICAgICAgICAgICAgICBvdGhlcihpLGopID0gKG90aGVyKGksaikgLSBiKSphOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjYWxhciBiID0gKG90aGVyKGksaikgKj0gYSk7CisgICAgICAgICAgICAgICAgU2NhbGFyKiByID0gJm90aGVyKHMsaik7CisgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyKiBsID0gJnRyaShzLGkpOworICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaTM9MDtpMzxyczsrK2kzKQorICAgICAgICAgICAgICAgICAgcltpM10gLT0gYiAqIGNvbmoobFtpM10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgSW5kZXggbGVuZ3RoVGFyZ2V0ID0gYWN0dWFsX2tjLWsxLWFjdHVhbFBhbmVsV2lkdGg7CisgICAgICAgICAgSW5kZXggc3RhcnRCbG9jayAgID0gSXNMb3dlciA/IGsyK2sxIDogazItazEtYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgICBJbmRleCBibG9ja0JPZmZzZXQgPSBJc0xvd2VyID8gazEgOiBsZW5ndGhUYXJnZXQ7CisKKyAgICAgICAgICAvLyB1cGRhdGUgdGhlIHJlc3BlY3RpdmUgcm93cyBvZiBCIGZyb20gb3RoZXIKKyAgICAgICAgICBwYWNrX3JocyhibG9ja0IrYWN0dWFsX2tjKmoyLCBvdGhlci5nZXRTdWJNYXBwZXIoc3RhcnRCbG9jayxqMiksIGFjdHVhbFBhbmVsV2lkdGgsIGFjdHVhbF9jb2xzLCBhY3R1YWxfa2MsIGJsb2NrQk9mZnNldCk7CisKKyAgICAgICAgICAvLyBHRUJQCisgICAgICAgICAgaWYgKGxlbmd0aFRhcmdldD4wKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IHN0YXJ0VGFyZ2V0ICA9IElzTG93ZXIgPyBrMitrMSthY3R1YWxQYW5lbFdpZHRoIDogazItYWN0dWFsX2tjOworCisgICAgICAgICAgICBwYWNrX2xocyhibG9ja0EsIHRyaS5nZXRTdWJNYXBwZXIoc3RhcnRUYXJnZXQsc3RhcnRCbG9jayksIGFjdHVhbFBhbmVsV2lkdGgsIGxlbmd0aFRhcmdldCk7CisKKyAgICAgICAgICAgIGdlYnBfa2VybmVsKG90aGVyLmdldFN1Yk1hcHBlcihzdGFydFRhcmdldCxqMiksIGJsb2NrQSwgYmxvY2tCK2FjdHVhbF9rYypqMiwgbGVuZ3RoVGFyZ2V0LCBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxfY29scywgU2NhbGFyKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFBhbmVsV2lkdGgsIGFjdHVhbF9rYywgMCwgYmxvY2tCT2Zmc2V0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gUjIgLT0gQTIxICogQiA9PiBHRVBQCisgICAgICB7CisgICAgICAgIEluZGV4IHN0YXJ0ID0gSXNMb3dlciA/IGsyK2tjIDogMDsKKyAgICAgICAgSW5kZXggZW5kICAgPSBJc0xvd2VyID8gc2l6ZSA6IGsyLWtjOworICAgICAgICBmb3IoSW5kZXggaTI9c3RhcnQ7IGkyPGVuZDsgaTIrPW1jKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShtYyxlbmQtaTIpOworICAgICAgICAgIGlmIChhY3R1YWxfbWM+MCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwYWNrX2xocyhibG9ja0EsIHRyaS5nZXRTdWJNYXBwZXIoaTIsIElzTG93ZXIgPyBrMiA6IGsyLWtjKSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgICAgICBnZWJwX2tlcm5lbChvdGhlci5nZXRTdWJNYXBwZXIoaTIsIDApLCBibG9ja0EsIGJsb2NrQiwgYWN0dWFsX21jLCBhY3R1YWxfa2MsIGNvbHMsIFNjYWxhcigtMSksIC0xLCAtMSwgMCwgMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKy8qIE9wdGltaXplZCB0cmlhbmd1bGFyIHNvbHZlciB3aXRoIG11bHRpcGxlIGxlZnQgaGFuZCBzaWRlcyBhbmQgdGhlIHRyaWFuZ3VsYXIgbWF0cml4IG9uIHRoZSByaWdodAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgVHJpU3RvcmFnZU9yZGVyPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixJbmRleCxPblRoZVJpZ2h0LE1vZGUsQ29uanVnYXRlLFRyaVN0b3JhZ2VPcmRlcixDb2xNYWpvcj4KK3sKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHNpemUsIEluZGV4IG90aGVyU2l6ZSwKKyAgICBjb25zdCBTY2FsYXIqIF90cmksIEluZGV4IHRyaVN0cmlkZSwKKyAgICBTY2FsYXIqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsCisgICAgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZyk7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFRyaVN0b3JhZ2VPcmRlcj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLEluZGV4LE9uVGhlUmlnaHQsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLENvbE1ham9yPjo6cnVuKAorICAgIEluZGV4IHNpemUsIEluZGV4IG90aGVyU2l6ZSwKKyAgICBjb25zdCBTY2FsYXIqIF90cmksIEluZGV4IHRyaVN0cmlkZSwKKyAgICBTY2FsYXIqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsCisgICAgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIEluZGV4IHJvd3MgPSBvdGhlclNpemU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgdHlwZWRlZiBibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIENvbE1ham9yPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIFRyaVN0b3JhZ2VPcmRlcj4gUmhzTWFwcGVyOworICAgIExoc01hcHBlciBsaHMoX290aGVyLCBvdGhlclN0cmlkZSk7CisgICAgUmhzTWFwcGVyIHJocyhfdHJpLCB0cmlTdHJpZGUpOworCisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgICAgZW51bSB7CisgICAgICBSaHNTdG9yYWdlT3JkZXIgICA9IFRyaVN0b3JhZ2VPcmRlciwKKyAgICAgIFNtYWxsUGFuZWxXaWR0aCAgID0gRUlHRU5fUExBSU5fRU5VTV9NQVgoVHJhaXRzOjptcixUcmFpdHM6Om5yKSwKKyAgICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIKKyAgICB9OworCisgICAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKworICAgIHN0ZDo6c2l6ZV90IHNpemVBID0ga2MqbWM7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBrYypzaXplOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKworICAgIGNvbmpfaWY8Q29uanVnYXRlPiBjb25qOworICAgIGdlYnBfa2VybmVsPFNjYWxhciwgU2NhbGFyLCBJbmRleCwgTGhzTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBmYWxzZSwgQ29uanVnYXRlPiBnZWJwX2tlcm5lbDsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFJoc01hcHBlciwgVHJhaXRzOjpuciwgUmhzU3RvcmFnZU9yZGVyPiBwYWNrX3JoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFJoc01hcHBlciwgVHJhaXRzOjpuciwgUmhzU3RvcmFnZU9yZGVyLGZhbHNlLHRydWU+IHBhY2tfcmhzX3BhbmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgTGhzTWFwcGVyLCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBDb2xNYWpvciwgZmFsc2UsIHRydWU+IHBhY2tfbGhzX3BhbmVsOworCisgICAgZm9yKEluZGV4IGsyPUlzTG93ZXIgPyBzaXplIDogMDsKKyAgICAgICAgSXNMb3dlciA/IGsyPjAgOiBrMjxzaXplOworICAgICAgICBJc0xvd2VyID8gazItPWtjIDogazIrPWtjKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9rYyA9IChzdGQ6Om1pbikoSXNMb3dlciA/IGsyIDogc2l6ZS1rMiwga2MpOworICAgICAgSW5kZXggYWN0dWFsX2syID0gSXNMb3dlciA/IGsyLWFjdHVhbF9rYyA6IGsyIDsKKworICAgICAgSW5kZXggc3RhcnRQYW5lbCA9IElzTG93ZXIgPyAwIDogazIrYWN0dWFsX2tjOworICAgICAgSW5kZXggcnMgPSBJc0xvd2VyID8gYWN0dWFsX2syIDogc2l6ZSAtIGFjdHVhbF9rMiAtIGFjdHVhbF9rYzsKKyAgICAgIFNjYWxhciogZ2ViID0gYmxvY2tCK2FjdHVhbF9rYyphY3R1YWxfa2M7CisKKyAgICAgIGlmIChycz4wKSBwYWNrX3JocyhnZWIsIHJocy5nZXRTdWJNYXBwZXIoYWN0dWFsX2syLHN0YXJ0UGFuZWwpLCBhY3R1YWxfa2MsIHJzKTsKKworICAgICAgLy8gdHJpYW5ndWxhciBwYWNraW5nICh3ZSBvbmx5IHBhY2sgdGhlIHBhbmVscyBvZmYgdGhlIGRpYWdvbmFsLAorICAgICAgLy8gbmVnbGVjdGluZyB0aGUgYmxvY2tzIG92ZXJsYXBwaW5nIHRoZSBkaWFnb25hbAorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGoyPTA7IGoyPGFjdHVhbF9rYzsgajIrPVNtYWxsUGFuZWxXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgIEluZGV4IGFjdHVhbF9qMiA9IGFjdHVhbF9rMiArIGoyOworICAgICAgICAgIEluZGV4IHBhbmVsT2Zmc2V0ID0gSXNMb3dlciA/IGoyK2FjdHVhbFBhbmVsV2lkdGggOiAwOworICAgICAgICAgIEluZGV4IHBhbmVsTGVuZ3RoID0gSXNMb3dlciA/IGFjdHVhbF9rYy1qMi1hY3R1YWxQYW5lbFdpZHRoIDogajI7CisKKyAgICAgICAgICBpZiAocGFuZWxMZW5ndGg+MCkKKyAgICAgICAgICBwYWNrX3Joc19wYW5lbChibG9ja0IrajIqYWN0dWFsX2tjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5nZXRTdWJNYXBwZXIoYWN0dWFsX2syK3BhbmVsT2Zmc2V0LCBhY3R1YWxfajIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGVuZ3RoLCBhY3R1YWxQYW5lbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgcGFuZWxPZmZzZXQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvcihJbmRleCBpMj0wOyBpMjxyb3dzOyBpMis9bWMpCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikobWMscm93cy1pMik7CisKKyAgICAgICAgLy8gdHJpYW5ndWxhciBzb2x2ZXIga2VybmVsCisgICAgICAgIHsKKyAgICAgICAgICAvLyBmb3IgZWFjaCBzbWFsbCBibG9jayBvZiB0aGUgZGlhZ29uYWwgKD0+IHZlcnRpY2FsIHBhbmVscyBvZiByaHMpCisgICAgICAgICAgZm9yIChJbmRleCBqMiA9IElzTG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICA/IChhY3R1YWxfa2MgLSAoKGFjdHVhbF9rYyVTbWFsbFBhbmVsV2lkdGgpID8gSW5kZXgoYWN0dWFsX2tjJVNtYWxsUGFuZWxXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5kZXgoU21hbGxQYW5lbFdpZHRoKSkpCisgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICAgICAgICAgSXNMb3dlciA/IGoyPj0wIDogajI8YWN0dWFsX2tjOworICAgICAgICAgICAgICAgSXNMb3dlciA/IGoyLT1TbWFsbFBhbmVsV2lkdGggOiBqMis9U21hbGxQYW5lbFdpZHRoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgICAgSW5kZXggYWJzb2x1dGVfajIgPSBhY3R1YWxfazIgKyBqMjsKKyAgICAgICAgICAgIEluZGV4IHBhbmVsT2Zmc2V0ID0gSXNMb3dlciA/IGoyK2FjdHVhbFBhbmVsV2lkdGggOiAwOworICAgICAgICAgICAgSW5kZXggcGFuZWxMZW5ndGggPSBJc0xvd2VyID8gYWN0dWFsX2tjIC0gajIgLSBhY3R1YWxQYW5lbFdpZHRoIDogajI7CisKKyAgICAgICAgICAgIC8vIEdFQlAKKyAgICAgICAgICAgIGlmKHBhbmVsTGVuZ3RoPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdlYnBfa2VybmVsKGxocy5nZXRTdWJNYXBwZXIoaTIsYWJzb2x1dGVfajIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0EsIGJsb2NrQitqMiphY3R1YWxfa2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9tYywgcGFuZWxMZW5ndGgsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcigtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgYWN0dWFsX2tjLCAvLyBzdHJpZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsT2Zmc2V0LCBwYW5lbE9mZnNldCk7IC8vIG9mZnNldHMKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdW5ibG9ja2VkIHRyaWFuZ3VsYXIgc29sdmUKKyAgICAgICAgICAgIGZvciAoSW5kZXggaz0wOyBrPGFjdHVhbFBhbmVsV2lkdGg7ICsraykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgSW5kZXggaiA9IElzTG93ZXIgPyBhYnNvbHV0ZV9qMithY3R1YWxQYW5lbFdpZHRoLWstMSA6IGFic29sdXRlX2oyK2s7CisKKyAgICAgICAgICAgICAgU2NhbGFyKiByID0gJmxocyhpMixqKTsKKyAgICAgICAgICAgICAgZm9yIChJbmRleCBrMz0wOyBrMzxrOyArK2szKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NhbGFyIGIgPSBjb25qKHJocyhJc0xvd2VyID8gaisxK2szIDogYWJzb2x1dGVfajIrazMsaikpOworICAgICAgICAgICAgICAgIFNjYWxhciogYSA9ICZsaHMoaTIsSXNMb3dlciA/IGorMStrMyA6IGFic29sdXRlX2oyK2szKTsKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGk9MDsgaTxhY3R1YWxfbWM7ICsraSkKKyAgICAgICAgICAgICAgICAgIHJbaV0gLT0gYVtpXSAqIGI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYoKE1vZGUgJiBVbml0RGlhZyk9PTApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2FsYXIgaW52X3JqaiA9IFJlYWxTY2FsYXIoMSkvY29uaihyaHMoaixqKSk7CisgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8YWN0dWFsX21jOyArK2kpCisgICAgICAgICAgICAgICAgICByW2ldICo9IGludl9yamo7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcGFjayB0aGUganVzdCBjb21wdXRlZCBwYXJ0IG9mIGxocyB0byBBCisgICAgICAgICAgICBwYWNrX2xoc19wYW5lbChibG9ja0EsIExoc01hcHBlcihfb3RoZXIrYWJzb2x1dGVfajIqb3RoZXJTdHJpZGUraTIsIG90aGVyU3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFBhbmVsV2lkdGgsIGFjdHVhbF9tYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgajIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChycz4wKQorICAgICAgICAgIGdlYnBfa2VybmVsKGxocy5nZXRTdWJNYXBwZXIoaTIsIHN0YXJ0UGFuZWwpLCBibG9ja0EsIGdlYiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbWMsIGFjdHVhbF9rYywgcnMsIFNjYWxhcigtMSksCisgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAwLCAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVJfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXhfQkxBUy5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlck1hdHJpeF9CTEFTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMGZiNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXhfQkxBUy5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gQkxBUyBGNzcKKyAqICAgVHJpYW5ndWxhciBtYXRyaXggKiBtYXRyaXggcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9UUk1NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX01BVFJJWF9CTEFTX0gKKyNkZWZpbmUgRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVJfTUFUUklYX0JMQVNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBpbXBsZW1lbnRzIExlZnRTaWRlIG9wKHRyaWFuZ3VsYXIpXi0xICogZ2VuZXJhbAorI2RlZmluZSBFSUdFTl9CTEFTX1RSU01fTChFSUdUWVBFLCBCTEFTVFlQRSwgQkxBU1BSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBUcmlTdG9yYWdlT3JkZXI+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxFSUdUWVBFLEluZGV4LE9uVGhlTGVmdCxNb2RlLENvbmp1Z2F0ZSxUcmlTdG9yYWdlT3JkZXIsQ29sTWFqb3I+IFwKK3sgXAorICBlbnVtIHsgXAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsIFwKKyAgICBJc1VuaXREaWFnICA9IChNb2RlJlVuaXREaWFnKSA/IDEgOiAwLCBcCisgICAgSXNaZXJvRGlhZyAgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwgXAorICAgIGNvbmpBID0gKChUcmlTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSAmJiBDb25qdWdhdGUpID8gMSA6IDAgXAorICB9OyBcCisgIHN0YXRpYyB2b2lkIHJ1biggXAorICAgICAgSW5kZXggc2l6ZSwgSW5kZXggb3RoZXJTaXplLCBcCisgICAgICBjb25zdCBFSUdUWVBFKiBfdHJpLCBJbmRleCB0cmlTdHJpZGUsIFwKKyAgICAgIEVJR1RZUEUqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLEVJR1RZUEU+JiAvKmJsb2NraW5nKi8pIFwKKyAgeyBcCisgICBCbGFzSW5kZXggbSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihzaXplKSwgbiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihvdGhlclNpemUpLCBsZGEsIGxkYjsgXAorICAgY2hhciBzaWRlID0gJ0wnLCB1cGxvLCBkaWFnPSdOJywgdHJhbnNhOyBcCisgICAvKiBTZXQgYWxwaGFfICovIFwKKyAgIEVJR1RZUEUgYWxwaGEoMSk7IFwKKyAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihvdGhlclN0cmlkZSk7XAorXAorICAgY29uc3QgRUlHVFlQRSAqYTsgXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKKy8qIFNldCB1cGxvICovIFwKKyAgIHVwbG8gPSBJc0xvd2VyID8gJ0wnIDogJ1UnOyBcCisgICBpZiAoVHJpU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbyA9ICh1cGxvID09ICdMJykgPyAnVScgOiAnTCc7IFwKKy8qIFNldCBhLCBsZGEgKi8gXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgVHJpU3RvcmFnZU9yZGVyPiBNYXRyaXhUcmk7IFwKKyAgIE1hcDxjb25zdCBNYXRyaXhUcmksIDAsIE91dGVyU3RyaWRlPD4gPiB0cmkoX3RyaSxzaXplLHNpemUsT3V0ZXJTdHJpZGU8Pih0cmlTdHJpZGUpKTsgXAorICAgTWF0cml4VHJpIGFfdG1wOyBcCitcCisgICBpZiAoY29uakEpIHsgXAorICAgICBhX3RtcCA9IHRyaS5jb25qdWdhdGUoKTsgXAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgfSBlbHNlIHsgXAorICAgICBhID0gX3RyaTsgXAorICAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4odHJpU3RyaWRlKTsgXAorICAgfSBcCisgICBpZiAoSXNVbml0RGlhZykgZGlhZz0nVSc7IFwKKy8qIGNhbGwgP3Ryc20qLyBcCisgICBCTEFTUFJFRklYIyN0cnNtXygmc2lkZSwgJnVwbG8sICZ0cmFuc2EsICZkaWFnLCAmbSwgJm4sICZudW1leHQ6OnJlYWxfcmVmKGFscGhhKSwgKGNvbnN0IEJMQVNUWVBFKilhLCAmbGRhLCAoQkxBU1RZUEUqKV9vdGhlciwgJmxkYik7IFwKKyB9IFwKK307CisKK0VJR0VOX0JMQVNfVFJTTV9MKGRvdWJsZSwgICBkb3VibGUsIGQpCitFSUdFTl9CTEFTX1RSU01fTChkY29tcGxleCwgZG91YmxlLCB6KQorRUlHRU5fQkxBU19UUlNNX0woZmxvYXQsICAgIGZsb2F0LCAgcykKK0VJR0VOX0JMQVNfVFJTTV9MKHNjb21wbGV4LCBmbG9hdCwgIGMpCisKKworLy8gaW1wbGVtZW50cyBSaWdodFNpZGUgZ2VuZXJhbCAqIG9wKHRyaWFuZ3VsYXIpXi0xCisjZGVmaW5lIEVJR0VOX0JMQVNfVFJTTV9SKEVJR1RZUEUsIEJMQVNUWVBFLCBCTEFTUFJFRklYKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFRyaVN0b3JhZ2VPcmRlcj4gXAorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PEVJR1RZUEUsSW5kZXgsT25UaGVSaWdodCxNb2RlLENvbmp1Z2F0ZSxUcmlTdG9yYWdlT3JkZXIsQ29sTWFqb3I+IFwKK3sgXAorICBlbnVtIHsgXAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsIFwKKyAgICBJc1VuaXREaWFnICA9IChNb2RlJlVuaXREaWFnKSA/IDEgOiAwLCBcCisgICAgSXNaZXJvRGlhZyAgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwgXAorICAgIGNvbmpBID0gKChUcmlTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSAmJiBDb25qdWdhdGUpID8gMSA6IDAgXAorICB9OyBcCisgIHN0YXRpYyB2b2lkIHJ1biggXAorICAgICAgSW5kZXggc2l6ZSwgSW5kZXggb3RoZXJTaXplLCBcCisgICAgICBjb25zdCBFSUdUWVBFKiBfdHJpLCBJbmRleCB0cmlTdHJpZGUsIFwKKyAgICAgIEVJR1RZUEUqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLEVJR1RZUEU+JiAvKmJsb2NraW5nKi8pIFwKKyAgeyBcCisgICBCbGFzSW5kZXggbSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihvdGhlclNpemUpLCBuID0gY29udmVydF9pbmRleDxCbGFzSW5kZXg+KHNpemUpLCBsZGEsIGxkYjsgXAorICAgY2hhciBzaWRlID0gJ1InLCB1cGxvLCBkaWFnPSdOJywgdHJhbnNhOyBcCisgICAvKiBTZXQgYWxwaGFfICovIFwKKyAgIEVJR1RZUEUgYWxwaGEoMSk7IFwKKyAgIGxkYiA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihvdGhlclN0cmlkZSk7XAorXAorICAgY29uc3QgRUlHVFlQRSAqYTsgXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKKy8qIFNldCB1cGxvICovIFwKKyAgIHVwbG8gPSBJc0xvd2VyID8gJ0wnIDogJ1UnOyBcCisgICBpZiAoVHJpU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbyA9ICh1cGxvID09ICdMJykgPyAnVScgOiAnTCc7IFwKKy8qIFNldCBhLCBsZGEgKi8gXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgVHJpU3RvcmFnZU9yZGVyPiBNYXRyaXhUcmk7IFwKKyAgIE1hcDxjb25zdCBNYXRyaXhUcmksIDAsIE91dGVyU3RyaWRlPD4gPiB0cmkoX3RyaSxzaXplLHNpemUsT3V0ZXJTdHJpZGU8Pih0cmlTdHJpZGUpKTsgXAorICAgTWF0cml4VHJpIGFfdG1wOyBcCitcCisgICBpZiAoY29uakEpIHsgXAorICAgICBhX3RtcCA9IHRyaS5jb25qdWdhdGUoKTsgXAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8Qmxhc0luZGV4PihhX3RtcC5vdXRlclN0cmlkZSgpKTsgXAorICAgfSBlbHNlIHsgXAorICAgICBhID0gX3RyaTsgXAorICAgICBsZGEgPSBjb252ZXJ0X2luZGV4PEJsYXNJbmRleD4odHJpU3RyaWRlKTsgXAorICAgfSBcCisgICBpZiAoSXNVbml0RGlhZykgZGlhZz0nVSc7IFwKKy8qIGNhbGwgP3Ryc20qLyBcCisgICBCTEFTUFJFRklYIyN0cnNtXygmc2lkZSwgJnVwbG8sICZ0cmFuc2EsICZkaWFnLCAmbSwgJm4sICZudW1leHQ6OnJlYWxfcmVmKGFscGhhKSwgKGNvbnN0IEJMQVNUWVBFKilhLCAmbGRhLCAoQkxBU1RZUEUqKV9vdGhlciwgJmxkYik7IFwKKyAgIC8qc3RkOjpjb3V0IDw8ICJUUk1TX0wgc3BlY2lhbGl6YXRpb24hXG4iOyovIFwKKyB9IFwKK307CisKK0VJR0VOX0JMQVNfVFJTTV9SKGRvdWJsZSwgICBkb3VibGUsIGQpCitFSUdFTl9CTEFTX1RSU01fUihkY29tcGxleCwgZG91YmxlLCB6KQorRUlHRU5fQkxBU19UUlNNX1IoZmxvYXQsICAgIGZsb2F0LCAgcykKK0VJR0VOX0JMQVNfVFJTTV9SKHNjb21wbGV4LCBmbG9hdCwgIGMpCisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVJfTUFUUklYX0JMQVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTQ3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyVmVjdG9yLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVSaWdodCwgTW9kZSwgQ29uanVnYXRlLCBTdG9yYWdlT3JkZXI+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgUmhzU2NhbGFyKiByaHMpCisgIHsKKyAgICB0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsUmhzU2NhbGFyLEluZGV4LE9uVGhlTGVmdCwKKyAgICAgICAgKChNb2RlJlVwcGVyKT09VXBwZXIgPyBMb3dlciA6IFVwcGVyKSB8IChNb2RlJlVuaXREaWFnKSwKKyAgICAgICAgQ29uanVnYXRlLFN0b3JhZ2VPcmRlcj09Um93TWFqb3I/Q29sTWFqb3I6Um93TWFqb3IKKyAgICAgID46OnJ1bihzaXplLCBfbGhzLCBsaHNTdHJpZGUsIHJocyk7CisgIH0KK307CisKKy8vIGZvcndhcmQgYW5kIGJhY2t3YXJkIHN1YnN0aXR1dGlvbiwgcm93LW1ham9yLCByaHMgaXMgYSB2ZWN0b3IKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVMZWZ0LCBNb2RlLCBDb25qdWdhdGUsIFJvd01ham9yPgoreworICBlbnVtIHsKKyAgICBJc0xvd2VyID0gKChNb2RlJkxvd2VyKT09TG93ZXIpCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgUmhzU2NhbGFyKiByaHMpCisgIHsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7CisgICAgY29uc3QgTGhzTWFwIGxocyhfbGhzLHNpemUsc2l6ZSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworCisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPExoc1NjYWxhcixJbmRleCxSb3dNYWpvcj4gTGhzTWFwcGVyOworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxSaHNTY2FsYXIsSW5kZXgsQ29sTWFqb3I+IFJoc01hcHBlcjsKKworICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uanVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZVVuYXJ5T3A8dHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8TGhzU2NhbGFyPixMaHNNYXA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaHNNYXAmPgorICAgICAgICAgICAgICAgICAgICAgICAgOjp0eXBlIGNqTGhzKGxocyk7CisgICAgc3RhdGljIGNvbnN0IEluZGV4IFBhbmVsV2lkdGggPSBFSUdFTl9UVU5FX1RSSUFOR1VMQVJfUEFORUxfV0lEVEg7CisgICAgZm9yKEluZGV4IHBpPUlzTG93ZXIgPyAwIDogc2l6ZTsKKyAgICAgICAgSXNMb3dlciA/IHBpPHNpemUgOiBwaT4wOworICAgICAgICBJc0xvd2VyID8gcGkrPVBhbmVsV2lkdGggOiBwaS09UGFuZWxXaWR0aCkKKyAgICB7CisgICAgICBJbmRleCBhY3R1YWxQYW5lbFdpZHRoID0gKHN0ZDo6bWluKShJc0xvd2VyID8gc2l6ZSAtIHBpIDogcGksIFBhbmVsV2lkdGgpOworCisgICAgICBJbmRleCByID0gSXNMb3dlciA/IHBpIDogc2l6ZSAtIHBpOyAvLyByZW1haW5pbmcgc2l6ZQorICAgICAgaWYgKHIgPiAwKQorICAgICAgeworICAgICAgICAvLyBsZXQncyBkaXJlY3RseSBjYWxsIHRoZSBsb3cgbGV2ZWwgcHJvZHVjdCBmdW5jdGlvbiBiZWNhdXNlOgorICAgICAgICAvLyAxIC0gaXQgaXMgZmFzdGVyIHRvIGNvbXBpbGUKKyAgICAgICAgLy8gMiAtIGl0IGlzIHNsaWdobHR5IGZhc3RlciBhdCBydW50aW1lCisgICAgICAgIEluZGV4IHN0YXJ0Um93ID0gSXNMb3dlciA/IHBpIDogcGktYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgSW5kZXggc3RhcnRDb2wgPSBJc0xvd2VyID8gMCA6IHBpOworCisgICAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNNYXBwZXIsUm93TWFqb3IsQ29uanVnYXRlLFJoc1NjYWxhcixSaHNNYXBwZXIsZmFsc2U+OjpydW4oCisgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgciwKKyAgICAgICAgICBMaHNNYXBwZXIoJmxocy5jb2VmZlJlZihzdGFydFJvdyxzdGFydENvbCksIGxoc1N0cmlkZSksCisgICAgICAgICAgUmhzTWFwcGVyKHJocyArIHN0YXJ0Q29sLCAxKSwKKyAgICAgICAgICByaHMgKyBzdGFydFJvdywgMSwKKyAgICAgICAgICBSaHNTY2FsYXIoLTEpKTsKKyAgICAgIH0KKworICAgICAgZm9yKEluZGV4IGs9MDsgazxhY3R1YWxQYW5lbFdpZHRoOyArK2spCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBJc0xvd2VyID8gcGkrayA6IHBpLWstMTsKKyAgICAgICAgSW5kZXggcyA9IElzTG93ZXIgPyBwaSAgIDogaSsxOworICAgICAgICBpZiAoaz4wKQorICAgICAgICAgIHJoc1tpXSAtPSAoY2pMaHMucm93KGkpLnNlZ21lbnQocyxrKS50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QoTWFwPGNvbnN0IE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+KHJocytzLGspKSkuc3VtKCk7CisKKyAgICAgICAgaWYoIShNb2RlICYgVW5pdERpYWcpKQorICAgICAgICAgIHJoc1tpXSAvPSBjakxocyhpLGkpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLy8gZm9yd2FyZCBhbmQgYmFja3dhcmQgc3Vic3RpdHV0aW9uLCBjb2x1bW4tbWFqb3IsIHJocyBpcyBhIHZlY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIEluZGV4LCBPblRoZUxlZnQsIE1vZGUsIENvbmp1Z2F0ZSwgQ29sTWFqb3I+Cit7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoKE1vZGUmTG93ZXIpPT1Mb3dlcikKKyAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIHJocykKKyAgeworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IExoc01hcDsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMsc2l6ZSxzaXplLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgdHlwZWRlZiBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPExoc1NjYWxhcixJbmRleCxDb2xNYWpvcj4gTGhzTWFwcGVyOworICAgIHR5cGVkZWYgY29uc3RfYmxhc19kYXRhX21hcHBlcjxSaHNTY2FsYXIsSW5kZXgsQ29sTWFqb3I+IFJoc01hcHBlcjsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8Q29uanVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZVVuYXJ5T3A8dHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8TGhzU2NhbGFyPixMaHNNYXA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaHNNYXAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBjakxocyhsaHMpOworICAgIHN0YXRpYyBjb25zdCBJbmRleCBQYW5lbFdpZHRoID0gRUlHRU5fVFVORV9UUklBTkdVTEFSX1BBTkVMX1dJRFRIOworCisgICAgZm9yKEluZGV4IHBpPUlzTG93ZXIgPyAwIDogc2l6ZTsKKyAgICAgICAgSXNMb3dlciA/IHBpPHNpemUgOiBwaT4wOworICAgICAgICBJc0xvd2VyID8gcGkrPVBhbmVsV2lkdGggOiBwaS09UGFuZWxXaWR0aCkKKyAgICB7CisgICAgICBJbmRleCBhY3R1YWxQYW5lbFdpZHRoID0gKHN0ZDo6bWluKShJc0xvd2VyID8gc2l6ZSAtIHBpIDogcGksIFBhbmVsV2lkdGgpOworICAgICAgSW5kZXggc3RhcnRCbG9jayA9IElzTG93ZXIgPyBwaSA6IHBpLWFjdHVhbFBhbmVsV2lkdGg7CisgICAgICBJbmRleCBlbmRCbG9jayA9IElzTG93ZXIgPyBwaSArIGFjdHVhbFBhbmVsV2lkdGggOiAwOworCisgICAgICBmb3IoSW5kZXggaz0wOyBrPGFjdHVhbFBhbmVsV2lkdGg7ICsraykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IElzTG93ZXIgPyBwaStrIDogcGktay0xOworICAgICAgICBpZighKE1vZGUgJiBVbml0RGlhZykpCisgICAgICAgICAgcmhzW2ldIC89IGNqTGhzLmNvZWZmKGksaSk7CisKKyAgICAgICAgSW5kZXggciA9IGFjdHVhbFBhbmVsV2lkdGggLSBrIC0gMTsgLy8gcmVtYWluaW5nIHNpemUKKyAgICAgICAgSW5kZXggcyA9IElzTG93ZXIgPyBpKzEgOiBpLXI7CisgICAgICAgIGlmIChyPjApCisgICAgICAgICAgTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+KHJocytzLHIpIC09IHJoc1tpXSAqIGNqTGhzLmNvbChpKS5zZWdtZW50KHMscik7CisgICAgICB9CisgICAgICBJbmRleCByID0gSXNMb3dlciA/IHNpemUgLSBlbmRCbG9jayA6IHN0YXJ0QmxvY2s7IC8vIHJlbWFpbmluZyBzaXplCisgICAgICBpZiAociA+IDApCisgICAgICB7CisgICAgICAgIC8vIGxldCdzIGRpcmVjdGx5IGNhbGwgdGhlIGxvdyBsZXZlbCBwcm9kdWN0IGZ1bmN0aW9uIGJlY2F1c2U6CisgICAgICAgIC8vIDEgLSBpdCBpcyBmYXN0ZXIgdG8gY29tcGlsZQorICAgICAgICAvLyAyIC0gaXQgaXMgc2xpZ2hsdHkgZmFzdGVyIGF0IHJ1bnRpbWUKKyAgICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc01hcHBlcixDb2xNYWpvcixDb25qdWdhdGUsUmhzU2NhbGFyLFJoc01hcHBlcixmYWxzZT46OnJ1bigKKyAgICAgICAgICAgIHIsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICBMaHNNYXBwZXIoJmxocy5jb2VmZlJlZihlbmRCbG9jayxzdGFydEJsb2NrKSwgbGhzU3RyaWRlKSwKKyAgICAgICAgICAgIFJoc01hcHBlcihyaHMrc3RhcnRCbG9jaywgMSksCisgICAgICAgICAgICByaHMrZW5kQmxvY2ssIDEsIFJoc1NjYWxhcigtMSkpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVJfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQmxhc1V0aWwuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQmxhc1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTZlZTExCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9CbGFzVXRpbC5oCkBAIC0wLDAgKzEsMzk4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CTEFTVVRJTF9ICisjZGVmaW5lIEVJR0VOX0JMQVNVVElMX0gKKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG1hbnkgbGlnaHR3ZWlnaHQgaGVscGVyIGNsYXNzZXMgdXNlZCB0bworLy8gaW1wbGVtZW50IGFuZCBjb250cm9sIGZhc3QgbGV2ZWwgMiBhbmQgbGV2ZWwgMyBCTEFTLWxpa2Ugcm91dGluZXMuCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb25zCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBtciwgaW50IG5yLCBib29sIENvbmp1Z2F0ZUxocz1mYWxzZSwgYm9vbCBDb25qdWdhdGVSaHM9ZmFsc2U+CitzdHJ1Y3QgZ2VicF9rZXJuZWw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGludCBuciwgaW50IFN0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGUgPSBmYWxzZSwgYm9vbCBQYW5lbE1vZGU9ZmFsc2U+CitzdHJ1Y3QgZ2VtbV9wYWNrX3JoczsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgRGF0YU1hcHBlciwgaW50IFBhY2sxLCBpbnQgUGFjazIsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlID0gZmFsc2UsIGJvb2wgUGFuZWxNb2RlID0gZmFsc2U+CitzdHJ1Y3QgZ2VtbV9wYWNrX2xoczsKKwordGVtcGxhdGU8CisgIHR5cGVuYW1lIEluZGV4LAorICB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLAorICBpbnQgUmVzU3RvcmFnZU9yZGVyPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgIHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgTGhzTWFwcGVyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgUmhzTWFwcGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb249U3BlY2lhbGl6ZWQ+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q7CisKKwordGVtcGxhdGU8Ym9vbCBDb25qdWdhdGU+IHN0cnVjdCBjb25qX2lmOworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2lmPHRydWU+IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFQgb3BlcmF0b3IoKShjb25zdCBUJiB4KSBjb25zdCB7IHJldHVybiBudW1leHQ6OmNvbmooeCk7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFQgcGNvbmooY29uc3QgVCYgeCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBjb25qKHgpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2lmPGZhbHNlPiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIGNvbnN0IHsgcmV0dXJuIHg7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIGNvbnN0IFQmIHBjb25qKGNvbnN0IFQmIHgpIGNvbnN0IHsgcmV0dXJuIHg7IH0KK307CisKKy8vIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIGN1c3RvbSBjb21wbGV4IHR5cGVzLgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgorc3RydWN0IGNvbmpfaGVscGVyCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj46OlJldHVyblR5cGUgU2NhbGFyOworCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IExoc1NjYWxhciYgeCwgY29uc3QgUmhzU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtdWwoY29uc3QgTGhzU2NhbGFyJiB4LCBjb25zdCBSaHNTY2FsYXImIHkpIGNvbnN0CisgIHsgcmV0dXJuIGNvbmpfaWY8Q29uakxocz4oKSh4KSAqICBjb25qX2lmPENvbmpSaHM+KCkoeSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwbWFkZCh4LHksYyk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG11bChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBtdWwoeCx5KTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBmYWxzZSx0cnVlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0CisgIHsgcmV0dXJuIGMgKyBwbXVsKHgseSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbXVsKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiBTY2FsYXIobnVtZXh0OjpyZWFsKHgpKm51bWV4dDo6cmVhbCh5KSArIG51bWV4dDo6aW1hZyh4KSpudW1leHQ6OmltYWcoeSksIG51bWV4dDo6aW1hZyh4KSpudW1leHQ6OnJlYWwoeSkgLSBudW1leHQ6OnJlYWwoeCkqbnVtZXh0OjppbWFnKHkpKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCB0cnVlLGZhbHNlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0CisgIHsgcmV0dXJuIGMgKyBwbXVsKHgseSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbXVsKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiBTY2FsYXIobnVtZXh0OjpyZWFsKHgpKm51bWV4dDo6cmVhbCh5KSArIG51bWV4dDo6aW1hZyh4KSpudW1leHQ6OmltYWcoeSksIG51bWV4dDo6cmVhbCh4KSpudW1leHQ6OmltYWcoeSkgLSBudW1leHQ6OmltYWcoeCkqbnVtZXh0OjpyZWFsKHkpKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCB0cnVlLHRydWU+Cit7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IFNjYWxhcjsKKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG1hZGQoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgYykgY29uc3QKKyAgeyByZXR1cm4gYyArIHBtdWwoeCx5KTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtdWwoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIGNvbnN0CisgIHsgcmV0dXJuIFNjYWxhcihudW1leHQ6OnJlYWwoeCkqbnVtZXh0OjpyZWFsKHkpIC0gbnVtZXh0OjppbWFnKHgpKm51bWV4dDo6aW1hZyh5KSwgLSBudW1leHQ6OnJlYWwoeCkqbnVtZXh0OjppbWFnKHkpIC0gbnVtZXh0OjppbWFnKHgpKm51bWV4dDo6cmVhbCh5KSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXIsYm9vbCBDb25qPiBzdHJ1Y3QgY29ual9oZWxwZXI8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBSZWFsU2NhbGFyLCBDb25qLGZhbHNlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgUmVhbFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG11bChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFJlYWxTY2FsYXImIHkpIGNvbnN0CisgIHsgcmV0dXJuIGNvbmpfaWY8Q29uaj4oKSh4KSp5OyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyLGJvb2wgQ29uaj4gc3RydWN0IGNvbmpfaGVscGVyPFJlYWxTY2FsYXIsIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgZmFsc2UsQ29uaj4KK3sKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gU2NhbGFyOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbWFkZChjb25zdCBSZWFsU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtdWwoY29uc3QgUmVhbFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiB4KmNvbmpfaWY8Q29uaj4oKSh5KTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbSx0eXBlbmFtZSBUbz4gc3RydWN0IGdldF9mYWN0b3IgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBUbyBydW4oY29uc3QgRnJvbSYgeCkgeyByZXR1cm4gVG8oeCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGdldF9mYWN0b3I8U2NhbGFyLHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBTY2FsYXImIHgpIHsgcmV0dXJuIG51bWV4dDo6cmVhbCh4KTsgfQorfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4PgorY2xhc3MgQmxhc1ZlY3Rvck1hcHBlciB7CisgIHB1YmxpYzoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBCbGFzVmVjdG9yTWFwcGVyKFNjYWxhciAqZGF0YSkgOiBtX2RhdGEoZGF0YSkge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9kYXRhW2ldOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQsIGludCBBbGlnbm1lbnRUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFBhY2tldCBsb2FkKEluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gcGxvYWR0PFBhY2tldCwgQWxpZ25tZW50VHlwZT4obV9kYXRhICsgaSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGFsaWduZWQoSW5kZXggaSkgY29uc3QgeworICAgIHJldHVybiAoVUludFB0cihtX2RhdGEraSklc2l6ZW9mKFBhY2tldCkpPT0wOworICB9CisKKyAgcHJvdGVjdGVkOgorICBTY2FsYXIqIG1fZGF0YTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBBbGlnbm1lbnRUeXBlPgorY2xhc3MgQmxhc0xpbmVhck1hcHBlciB7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6aGFsZiBIYWxmUGFja2V0OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgQmxhc0xpbmVhck1hcHBlcihTY2FsYXIgKmRhdGEpIDogbV9kYXRhKGRhdGEpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIHByZWZldGNoKGludCBpKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OnByZWZldGNoKCZvcGVyYXRvcigpKGkpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9kYXRhW2ldOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBQYWNrZXQgbG9hZFBhY2tldChJbmRleCBpKSBjb25zdCB7CisgICAgcmV0dXJuIHBsb2FkdDxQYWNrZXQsIEFsaWdubWVudFR5cGU+KG1fZGF0YSArIGkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBIYWxmUGFja2V0IGxvYWRIYWxmUGFja2V0KEluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gcGxvYWR0PEhhbGZQYWNrZXQsIEFsaWdubWVudFR5cGU+KG1fZGF0YSArIGkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIHN0b3JlUGFja2V0KEluZGV4IGksIGNvbnN0IFBhY2tldCAmcCkgY29uc3QgeworICAgIHBzdG9yZXQ8U2NhbGFyLCBQYWNrZXQsIEFsaWdubWVudFR5cGU+KG1fZGF0YSArIGksIHApOworICB9CisKKyAgcHJvdGVjdGVkOgorICBTY2FsYXIgKm1fZGF0YTsKK307CisKKy8vIExpZ2h0d2VpZ2h0IGhlbHBlciBjbGFzcyB0byBhY2Nlc3MgbWF0cml4IGNvZWZmaWNpZW50cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBBbGlnbm1lbnRUeXBlID0gVW5hbGlnbmVkPgorY2xhc3MgYmxhc19kYXRhX21hcHBlciB7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6aGFsZiBIYWxmUGFja2V0OworCisgIHR5cGVkZWYgQmxhc0xpbmVhck1hcHBlcjxTY2FsYXIsIEluZGV4LCBBbGlnbm1lbnRUeXBlPiBMaW5lYXJNYXBwZXI7CisgIHR5cGVkZWYgQmxhc1ZlY3Rvck1hcHBlcjxTY2FsYXIsIEluZGV4PiBWZWN0b3JNYXBwZXI7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBibGFzX2RhdGFfbWFwcGVyKFNjYWxhciogZGF0YSwgSW5kZXggc3RyaWRlKSA6IG1fZGF0YShkYXRhKSwgbV9zdHJpZGUoc3RyaWRlKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DICBFSUdFTl9BTFdBWVNfSU5MSU5FIGJsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgU3RvcmFnZU9yZGVyLCBBbGlnbm1lbnRUeXBlPgorICBnZXRTdWJNYXBwZXIoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIHJldHVybiBibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIFN0b3JhZ2VPcmRlciwgQWxpZ25tZW50VHlwZT4oJm9wZXJhdG9yKCkoaSwgaiksIG1fc3RyaWRlKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DICBFSUdFTl9BTFdBWVNfSU5MSU5FIExpbmVhck1hcHBlciBnZXRMaW5lYXJNYXBwZXIoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIHJldHVybiBMaW5lYXJNYXBwZXIoJm9wZXJhdG9yKCkoaSwgaikpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgIEVJR0VOX0FMV0FZU19JTkxJTkUgVmVjdG9yTWFwcGVyIGdldFZlY3Rvck1hcHBlcihJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgcmV0dXJuIFZlY3Rvck1hcHBlcigmb3BlcmF0b3IoKShpLCBqKSk7CisgIH0KKworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX0FMV0FZU19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGksIEluZGV4IGopIGNvbnN0IHsKKyAgICByZXR1cm4gbV9kYXRhW1N0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBqICsgaSptX3N0cmlkZSA6IGkgKyBqKm1fc3RyaWRlXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgUGFja2V0IGxvYWRQYWNrZXQoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIHJldHVybiBwbG9hZHQ8UGFja2V0LCBBbGlnbm1lbnRUeXBlPigmb3BlcmF0b3IoKShpLCBqKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIEhhbGZQYWNrZXQgbG9hZEhhbGZQYWNrZXQoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIHJldHVybiBwbG9hZHQ8SGFsZlBhY2tldCwgQWxpZ25tZW50VHlwZT4oJm9wZXJhdG9yKCkoaSwgaikpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU3ViUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIHZvaWQgc2NhdHRlclBhY2tldChJbmRleCBpLCBJbmRleCBqLCBjb25zdCBTdWJQYWNrZXQgJnApIGNvbnN0IHsKKyAgICBwc2NhdHRlcjxTY2FsYXIsIFN1YlBhY2tldD4oJm9wZXJhdG9yKCkoaSwgaiksIHAsIG1fc3RyaWRlKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN1YlBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBTdWJQYWNrZXQgZ2F0aGVyUGFja2V0KEluZGV4IGksIEluZGV4IGopIGNvbnN0IHsKKyAgICByZXR1cm4gcGdhdGhlcjxTY2FsYXIsIFN1YlBhY2tldD4oJm9wZXJhdG9yKCkoaSwgaiksIG1fc3RyaWRlKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IEluZGV4IHN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaWRlOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IGZpcnN0QWxpZ25lZChJbmRleCBzaXplKSBjb25zdCB7CisgICAgaWYgKFVJbnRQdHIobV9kYXRhKSVzaXplb2YoU2NhbGFyKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZChtX2RhdGEsIHNpemUpOworICB9CisKKyAgcHJvdGVjdGVkOgorICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIG1fZGF0YTsKKyAgY29uc3QgSW5kZXggbV9zdHJpZGU7Cit9OworCisvLyBsaWdodHdlaWdodCBoZWxwZXIgY2xhc3MgdG8gYWNjZXNzIG1hdHJpeCBjb2VmZmljaWVudHMgKGNvbnN0IHZlcnNpb24pCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyPgorY2xhc3MgY29uc3RfYmxhc19kYXRhX21hcHBlciA6IHB1YmxpYyBibGFzX2RhdGFfbWFwcGVyPGNvbnN0IFNjYWxhciwgSW5kZXgsIFN0b3JhZ2VPcmRlcj4geworICBwdWJsaWM6CisgIEVJR0VOX0FMV0FZU19JTkxJTkUgY29uc3RfYmxhc19kYXRhX21hcHBlcihjb25zdCBTY2FsYXIgKmRhdGEsIEluZGV4IHN0cmlkZSkgOiBibGFzX2RhdGFfbWFwcGVyPGNvbnN0IFNjYWxhciwgSW5kZXgsIFN0b3JhZ2VPcmRlcj4oZGF0YSwgc3RyaWRlKSB7fQorCisgIEVJR0VOX0FMV0FZU19JTkxJTkUgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBTdG9yYWdlT3JkZXI+IGdldFN1Yk1hcHBlcihJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgU3RvcmFnZU9yZGVyPigmKHRoaXMtPm9wZXJhdG9yKCkoaSwgaikpLCB0aGlzLT5tX3N0cmlkZSk7CisgIH0KK307CisKKworLyogSGVscGVyIGNsYXNzIHRvIGFuYWx5emUgdGhlIGZhY3RvcnMgb2YgYSBQcm9kdWN0IGV4cHJlc3Npb24uCisgKiBJbiBwYXJ0aWN1bGFyIGl0IGFsbG93cyB0byBwb3Agb3V0IG9wZXJhdG9yLSwgc2NhbGFyIG11bHRpcGxlcywKKyAqIGFuZCBjb25qdWdhdGUgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBibGFzX3RyYWl0cworeworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBjb25zdCBYcHJUeXBlJiBFeHRyYWN0VHlwZTsKKyAgdHlwZWRlZiBYcHJUeXBlIF9FeHRyYWN0VHlwZTsKKyAgZW51bSB7CisgICAgSXNDb21wbGV4ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICBJc1RyYW5zcG9zZWQgPSBmYWxzZSwKKyAgICBOZWVkVG9Db25qdWdhdGUgPSBmYWxzZSwKKyAgICBIYXNVc2FibGVEaXJlY3RBY2Nlc3MgPSAoICAgIChpbnQoWHByVHlwZTo6RmxhZ3MpJkRpcmVjdEFjY2Vzc0JpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggICBib29sKFhwclR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnQoaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxYcHJUeXBlPjo6cmV0KSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID8gIDEgOiAwCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8Ym9vbChIYXNVc2FibGVEaXJlY3RBY2Nlc3MpLAorICAgIEV4dHJhY3RUeXBlLAorICAgIHR5cGVuYW1lIF9FeHRyYWN0VHlwZTo6UGxhaW5PYmplY3QKKyAgICA+Ojp0eXBlIERpcmVjdExpbmVhckFjY2Vzc1R5cGU7CisgIHN0YXRpYyBpbmxpbmUgRXh0cmFjdFR5cGUgZXh0cmFjdChjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiB4OyB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgU2NhbGFyIGV4dHJhY3RTY2FsYXJGYWN0b3IoY29uc3QgWHByVHlwZSYpIHsgcmV0dXJuIFNjYWxhcigxKTsgfQorfTsKKworLy8gcG9wIGNvbmp1Z2F0ZQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBOZXN0ZWRYcHI+CitzdHJ1Y3QgYmxhc190cmFpdHM8Q3dpc2VVbmFyeU9wPHNjYWxhcl9jb25qdWdhdGVfb3A8U2NhbGFyPiwgTmVzdGVkWHByPiA+CisgOiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+Cit7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TmVzdGVkWHByPiBCYXNlOworICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4sIE5lc3RlZFhwcj4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpFeHRyYWN0VHlwZSBFeHRyYWN0VHlwZTsKKworICBlbnVtIHsKKyAgICBJc0NvbXBsZXggPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgIE5lZWRUb0Nvbmp1Z2F0ZSA9IEJhc2U6Ok5lZWRUb0Nvbmp1Z2F0ZSA/IDAgOiBJc0NvbXBsZXgKKyAgfTsKKyAgc3RhdGljIGlubGluZSBFeHRyYWN0VHlwZSBleHRyYWN0KGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIEJhc2U6OmV4dHJhY3QoeC5uZXN0ZWRFeHByZXNzaW9uKCkpOyB9CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIGV4dHJhY3RTY2FsYXJGYWN0b3IoY29uc3QgWHByVHlwZSYgeCkgeyByZXR1cm4gY29uaihCYXNlOjpleHRyYWN0U2NhbGFyRmFjdG9yKHgubmVzdGVkRXhwcmVzc2lvbigpKSk7IH0KK307CisKKy8vIHBvcCBzY2FsYXIgbXVsdGlwbGUKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgTmVzdGVkWHByLCB0eXBlbmFtZSBQbGFpbj4KK3N0cnVjdCBibGFzX3RyYWl0czxDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcj4sIGNvbnN0IEN3aXNlTnVsbGFyeU9wPHNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluPiwgTmVzdGVkWHByPiA+CisgOiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+Cit7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TmVzdGVkWHByPiBCYXNlOworICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sUGxhaW4+LCBOZXN0ZWRYcHI+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6RXh0cmFjdFR5cGUgRXh0cmFjdFR5cGU7CisgIHN0YXRpYyBpbmxpbmUgRXh0cmFjdFR5cGUgZXh0cmFjdChjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiBCYXNlOjpleHRyYWN0KHgucmhzKCkpOyB9CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIGV4dHJhY3RTY2FsYXJGYWN0b3IoY29uc3QgWHByVHlwZSYgeCkKKyAgeyByZXR1cm4geC5saHMoKS5mdW5jdG9yKCkubV9vdGhlciAqIEJhc2U6OmV4dHJhY3RTY2FsYXJGYWN0b3IoeC5yaHMoKSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5lc3RlZFhwciwgdHlwZW5hbWUgUGxhaW4+CitzdHJ1Y3QgYmxhc190cmFpdHM8Q3dpc2VCaW5hcnlPcDxzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXI+LCBOZXN0ZWRYcHIsIGNvbnN0IEN3aXNlTnVsbGFyeU9wPHNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluPiA+ID4KKyA6IGJsYXNfdHJhaXRzPE5lc3RlZFhwcj4KK3sKKyAgdHlwZWRlZiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+IEJhc2U7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxzY2FsYXJfcHJvZHVjdF9vcDxTY2FsYXI+LCBOZXN0ZWRYcHIsIGNvbnN0IEN3aXNlTnVsbGFyeU9wPHNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluPiA+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6RXh0cmFjdFR5cGUgRXh0cmFjdFR5cGU7CisgIHN0YXRpYyBpbmxpbmUgRXh0cmFjdFR5cGUgZXh0cmFjdChjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiBCYXNlOjpleHRyYWN0KHgubGhzKCkpOyB9CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIGV4dHJhY3RTY2FsYXJGYWN0b3IoY29uc3QgWHByVHlwZSYgeCkKKyAgeyByZXR1cm4gQmFzZTo6ZXh0cmFjdFNjYWxhckZhY3Rvcih4LmxocygpKSAqIHgucmhzKCkuZnVuY3RvcigpLm1fb3RoZXI7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBsYWluMSwgdHlwZW5hbWUgUGxhaW4yPgorc3RydWN0IGJsYXNfdHJhaXRzPEN3aXNlQmluYXJ5T3A8c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sUGxhaW4xPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlTnVsbGFyeU9wPHNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LFBsYWluMj4gPiA+CisgOiBibGFzX3RyYWl0czxDd2lzZU51bGxhcnlPcDxzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixQbGFpbjE+ID4KK3t9OworCisvLyBwb3Agb3Bwb3NpdGUKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgTmVzdGVkWHByPgorc3RydWN0IGJsYXNfdHJhaXRzPEN3aXNlVW5hcnlPcDxzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgTmVzdGVkWHByPiA+CisgOiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+Cit7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TmVzdGVkWHByPiBCYXNlOworICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgTmVzdGVkWHByPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkV4dHJhY3RUeXBlIEV4dHJhY3RUeXBlOworICBzdGF0aWMgaW5saW5lIEV4dHJhY3RUeXBlIGV4dHJhY3QoY29uc3QgWHByVHlwZSYgeCkgeyByZXR1cm4gQmFzZTo6ZXh0cmFjdCh4Lm5lc3RlZEV4cHJlc3Npb24oKSk7IH0KKyAgc3RhdGljIGlubGluZSBTY2FsYXIgZXh0cmFjdFNjYWxhckZhY3Rvcihjb25zdCBYcHJUeXBlJiB4KQorICB7IHJldHVybiAtIEJhc2U6OmV4dHJhY3RTY2FsYXJGYWN0b3IoeC5uZXN0ZWRFeHByZXNzaW9uKCkpOyB9Cit9OworCisvLyBwb3AvcHVzaCB0cmFuc3Bvc2UKK3RlbXBsYXRlPHR5cGVuYW1lIE5lc3RlZFhwcj4KK3N0cnVjdCBibGFzX3RyYWl0czxUcmFuc3Bvc2U8TmVzdGVkWHByPiA+CisgOiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTmVzdGVkWHByOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIGJsYXNfdHJhaXRzPE5lc3RlZFhwcj4gQmFzZTsKKyAgdHlwZWRlZiBUcmFuc3Bvc2U8TmVzdGVkWHByPiBYcHJUeXBlOworICB0eXBlZGVmIFRyYW5zcG9zZTxjb25zdCB0eXBlbmFtZSBCYXNlOjpfRXh0cmFjdFR5cGU+ICBFeHRyYWN0VHlwZTsgLy8gY29uc3QgdG8gZ2V0IHJpZCBvZiBhIGNvbXBpbGUgZXJyb3I7IGFueXdheSBibGFzIHRyYWl0cyBhcmUgb25seSB1c2VkIG9uIHRoZSBSSFMKKyAgdHlwZWRlZiBUcmFuc3Bvc2U8Y29uc3QgdHlwZW5hbWUgQmFzZTo6X0V4dHJhY3RUeXBlPiBfRXh0cmFjdFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8Ym9vbChCYXNlOjpIYXNVc2FibGVEaXJlY3RBY2Nlc3MpLAorICAgIEV4dHJhY3RUeXBlLAorICAgIHR5cGVuYW1lIEV4dHJhY3RUeXBlOjpQbGFpbk9iamVjdAorICAgID46OnR5cGUgRGlyZWN0TGluZWFyQWNjZXNzVHlwZTsKKyAgZW51bSB7CisgICAgSXNUcmFuc3Bvc2VkID0gQmFzZTo6SXNUcmFuc3Bvc2VkID8gMCA6IDEKKyAgfTsKKyAgc3RhdGljIGlubGluZSBFeHRyYWN0VHlwZSBleHRyYWN0KGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIEV4dHJhY3RUeXBlKEJhc2U6OmV4dHJhY3QoeC5uZXN0ZWRFeHByZXNzaW9uKCkpKTsgfQorICBzdGF0aWMgaW5saW5lIFNjYWxhciBleHRyYWN0U2NhbGFyRmFjdG9yKGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIEJhc2U6OmV4dHJhY3RTY2FsYXJGYWN0b3IoeC5uZXN0ZWRFeHByZXNzaW9uKCkpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGJsYXNfdHJhaXRzPGNvbnN0IFQ+CisgICAgIDogYmxhc190cmFpdHM8VD4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEhhc1VzYWJsZURpcmVjdEFjY2Vzcz1ibGFzX3RyYWl0czxUPjo6SGFzVXNhYmxlRGlyZWN0QWNjZXNzPgorc3RydWN0IGV4dHJhY3RfZGF0YV9zZWxlY3RvciB7CisgIHN0YXRpYyBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIHJ1bihjb25zdCBUJiBtKQorICB7CisgICAgcmV0dXJuIGJsYXNfdHJhaXRzPFQ+OjpleHRyYWN0KG0pLmRhdGEoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBleHRyYWN0X2RhdGFfc2VsZWN0b3I8VCxmYWxzZT4geworICBzdGF0aWMgdHlwZW5hbWUgVDo6U2NhbGFyKiBydW4oY29uc3QgVCYpIHsgcmV0dXJuIDA7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogZXh0cmFjdF9kYXRhKGNvbnN0IFQmIG0pCit7CisgIHJldHVybiBleHRyYWN0X2RhdGFfc2VsZWN0b3I8VD46OnJ1bihtKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkxBU1VUSUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9Db25zdGFudHMuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4N2Q2OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ29uc3RhbnRzLmgKQEAgLTAsMCArMSw1NDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09OU1RBTlRTX0gKKyNkZWZpbmUgRUlHRU5fQ09OU1RBTlRTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFRoaXMgdmFsdWUgbWVhbnMgdGhhdCBhIHBvc2l0aXZlIHF1YW50aXR5IChlLmcuLCBhIHNpemUpIGlzIG5vdCBrbm93biBhdCBjb21waWxlLXRpbWUsIGFuZCB0aGF0IGluc3RlYWQgdGhlIHZhbHVlIGlzCisgICogc3RvcmVkIGluIHNvbWUgcnVudGltZSB2YXJpYWJsZS4KKyAgKgorICAqIENoYW5naW5nIHRoZSB2YWx1ZSBvZiBEeW5hbWljIGJyZWFrcyB0aGUgQUJJLCBhcyBEeW5hbWljIGlzIG9mdGVuIHVzZWQgYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZm9yIE1hdHJpeC4KKyAgKi8KK2NvbnN0IGludCBEeW5hbWljID0gLTE7CisKKy8qKiBUaGlzIHZhbHVlIG1lYW5zIHRoYXQgYSBzaWduZWQgcXVhbnRpdHkgKGUuZy4sIGEgc2lnbmVkIGluZGV4KSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLCBhbmQgdGhhdCBpbnN0ZWFkIGl0cyB2YWx1ZQorICAqIGhhcyB0byBiZSBzcGVjaWZpZWQgYXQgcnVudGltZS4KKyAgKi8KK2NvbnN0IGludCBEeW5hbWljSW5kZXggPSAweGZmZmZmZjsKKworLyoqIFRoaXMgdmFsdWUgbWVhbnMgK0luZmluaXR5OyBpdCBpcyBjdXJyZW50bHkgdXNlZCBvbmx5IGFzIHRoZSBwIHBhcmFtZXRlciB0byBNYXRyaXhCYXNlOjpscE5vcm08aW50PigpLgorICAqIFRoZSB2YWx1ZSBJbmZpbml0eSB0aGVyZSBtZWFucyB0aGUgTC1pbmZpbml0eSBub3JtLgorICAqLworY29uc3QgaW50IEluZmluaXR5ID0gLTE7CisKKy8qKiBUaGlzIHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNvc3QgdG8gZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBjb2VmZmljaWVudCBpcyBlaXRoZXIgdmVyeSBleHBlbnNpdmUgb3IKKyAgKiBjYW5ub3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLgorICAqCisgICogVGhpcyB2YWx1ZSBoYXMgdG8gYmUgcG9zaXRpdmUgdG8gKDEpIHNpbXBsaWZ5IGNvc3QgY29tcHV0YXRpb24sIGFuZCAoMikgYWxsb3cgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIHZlcnkgZXhwZW5zaXZlIGFuZCB2ZXJ5IHZlcnkgZXhwZW5zaXZlIGV4cHJlc3Npb25zLgorICAqIEl0IHRodXMgbXVzdCBhbHNvIGJlIGxhcmdlIGVub3VnaCB0byBtYWtlIHN1cmUgdW5yb2xsaW5nIHdvbid0IGhhcHBlbiBhbmQgdGhhdCBzdWIgZXhwcmVzc2lvbnMgd2lsbCBiZSBldmFsdWF0ZWQsIGJ1dCBub3QgdG9vIGxhcmdlIHRvIGF2b2lkIG92ZXJmbG93LgorICAqLworY29uc3QgaW50IEh1Z2VDb3N0ID0gMTAwMDA7CisKKy8qKiBcZGVmZ3JvdXAgZmxhZ3MgRmxhZ3MKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSBiaXRzIHdoaWNoIGNhbiBiZSBPUidlZCB0byBjb25zdGl0dXRlIHRoZSBmbGFncyBvZiBhIG1hdHJpeCBvcgorICAqIGV4cHJlc3Npb24uCisgICoKKyAgKiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZXNlIGZsYWdzIGFyZSBhIHB1cmVseSBjb21waWxlLXRpbWUgbm90aW9uLiBUaGV5IGFyZSBhIGNvbXBpbGUtdGltZSBwcm9wZXJ0eSBvZgorICAqIGFuIGV4cHJlc3Npb24gdHlwZSwgaW1wbGVtZW50ZWQgYXMgZW51bSdzLiBUaGV5IGFyZSBub3Qgc3RvcmVkIGluIG1lbW9yeSBhdCBydW50aW1lLCBhbmQgdGhleSBkbyBub3QgaW5jdXIgYW55CisgICogcnVudGltZSBvdmVyaGVhZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpGbGFncworICAqLworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKgorICAqIGZvciBhIG1hdHJpeCwgdGhpcyBtZWFucyB0aGF0IHRoZSBzdG9yYWdlIG9yZGVyIGlzIHJvdy1tYWpvci4KKyAgKiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGUgc3RvcmFnZSBvcmRlciBpcyBjb2x1bW4tbWFqb3IuCisgICogRm9yIGFuIGV4cHJlc3Npb24sIHRoaXMgZGV0ZXJtaW5lcyB0aGUgc3RvcmFnZSBvcmRlciBvZgorICAqIHRoZSBtYXRyaXggY3JlYXRlZCBieSBldmFsdWF0aW9uIG9mIHRoYXQgZXhwcmVzc2lvbi4KKyAgKiBcc2EgXGJsYW5rICBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAqLworY29uc3QgdW5zaWduZWQgaW50IFJvd01ham9yQml0ID0gMHgxOworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKiBtZWFucyB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkIGJ5IHRoZSBjYWxsaW5nIGV4cHJlc3Npb24gKi8KK2NvbnN0IHVuc2lnbmVkIGludCBFdmFsQmVmb3JlTmVzdGluZ0JpdCA9IDB4MjsKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICogXGRlcHJlY2F0ZWQKKyAgKiBtZWFucyB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkIGJlZm9yZSBhbnkgYXNzaWdubWVudCAqLworRUlHRU5fREVQUkVDQVRFRAorY29uc3QgdW5zaWduZWQgaW50IEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQgPSAweDQ7IC8vIEZJWE1FIGRlcHJlY2F0ZWQKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBTaG9ydCB2ZXJzaW9uOiBtZWFucyB0aGUgZXhwcmVzc2lvbiBtaWdodCBiZSB2ZWN0b3JpemVkCisgICoKKyAgKiBMb25nIHZlcnNpb246IG1lYW5zIHRoYXQgdGhlIGNvZWZmaWNpZW50cyBjYW4gYmUgaGFuZGxlZCBieSBwYWNrZXRzCisgICogYW5kIHN0YXJ0IGF0IGEgbWVtb3J5IGxvY2F0aW9uIHdob3NlIGFsaWdubWVudCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzCisgICogb2YgdGhlIHByZXNlbnQgQ1BVIGFyY2hpdGVjdHVyZSBmb3Igb3B0aW1pemVkIHBhY2tldCBhY2Nlc3MuIEluIHRoZSBmaXhlZC1zaXplCisgICogY2FzZSwgdGhlcmUgaXMgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9uIHRoYXQgaXQgYmUgcG9zc2libGUgdG8gYWNjZXNzIGFsbCB0aGUKKyAgKiBjb2VmZmljaWVudHMgYnkgcGFja2V0cyAodGhpcyBpbXBsaWVzIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBzaXplIGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMsCisgICogYW5kIHRoYXQgYW55IG5vbnRyaXZpYWwgc3RyaWRlcyBkb24ndCBicmVhayB0aGUgYWxpZ25tZW50KS4gSW4gdGhlIGR5bmFtaWMtc2l6ZSBjYXNlLAorICAqIHRoZXJlIGlzIG5vIHN1Y2ggY29uZGl0aW9uIG9uIHRoZSB0b3RhbCBzaXplIGFuZCBzdHJpZGVzLCBzbyBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gYWNjZXNzCisgICogYWxsIGNvZWZmcyBieSBwYWNrZXRzLgorICAqCisgICogXG5vdGUgVGhpcyBiaXQgY2FuIGJlIHNldCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdmVjdG9yaXphdGlvbiBpcyBhY3R1YWxseSBlbmFibGVkLgorICAqICAgICAgIFRvIGNoZWNrIGZvciBhY3R1YWwgdmVjdG9yaXphYmlsaXR5LCBzZWUgXGEgQWN0dWFsUGFja2V0QWNjZXNzQml0LgorICAqLworY29uc3QgdW5zaWduZWQgaW50IFBhY2tldEFjY2Vzc0JpdCA9IDB4ODsKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRQorLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBJZiB2ZWN0b3JpemF0aW9uIGlzIGVuYWJsZWQgKEVJR0VOX1ZFQ1RPUklaRSBpcyBkZWZpbmVkKSB0aGlzIGNvbnN0YW50CisgICogaXMgc2V0IHRvIHRoZSB2YWx1ZSBcYSBQYWNrZXRBY2Nlc3NCaXQuCisgICoKKyAgKiBJZiB2ZWN0b3JpemF0aW9uIGlzIG5vdCBlbmFibGVkIChFSUdFTl9WRUNUT1JJWkUgaXMgbm90IGRlZmluZWQpIHRoaXMgY29uc3RhbnQKKyAgKiBpcyBzZXQgdG8gdGhlIHZhbHVlIDAuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgQWN0dWFsUGFja2V0QWNjZXNzQml0ID0gUGFja2V0QWNjZXNzQml0OworI2Vsc2UKK2NvbnN0IHVuc2lnbmVkIGludCBBY3R1YWxQYWNrZXRBY2Nlc3NCaXQgPSAweDA7CisjZW5kaWYKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBTaG9ydCB2ZXJzaW9uOiBtZWFucyB0aGUgZXhwcmVzc2lvbiBjYW4gYmUgc2VlbiBhcyAxRCB2ZWN0b3IuCisgICoKKyAgKiBMb25nIHZlcnNpb246IG1lYW5zIHRoYXQgb25lIGNhbiBhY2Nlc3MgdGhlIGNvZWZmaWNpZW50cworICAqIG9mIHRoaXMgZXhwcmVzc2lvbiBieSBjb2VmZihpbnQpLCBhbmQgY29lZmZSZWYoaW50KSBpbiB0aGUgY2FzZSBvZiBhIGx2YWx1ZSBleHByZXNzaW9uLiBUaGVzZQorICAqIGluZGV4LWJhc2VkIGFjY2VzcyBtZXRob2RzIGFyZSBndWFyYW50ZWVkCisgICogdG8gbm90IGhhdmUgdG8gZG8gYW55IHJ1bnRpbWUgY29tcHV0YXRpb24gb2YgYSAocm93LCBjb2wpLXBhaXIgZnJvbSB0aGUgaW5kZXgsIHNvIHRoYXQgaXQKKyAgKiBpcyBndWFyYW50ZWVkIHRoYXQgd2hlbmV2ZXIgaXQgaXMgYXZhaWxhYmxlLCBpbmRleC1iYXNlZCBhY2Nlc3MgaXMgYXQgbGVhc3QgYXMgZmFzdCBhcworICAqIChyb3csY29sKS1iYXNlZCBhY2Nlc3MuIEV4cHJlc3Npb25zIGZvciB3aGljaCB0aGF0IGlzbid0IHBvc3NpYmxlIGRvbid0IGhhdmUgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgKgorICAqIElmIGJvdGggUGFja2V0QWNjZXNzQml0IGFuZCBMaW5lYXJBY2Nlc3NCaXQgYXJlIHNldCwgdGhlbiB0aGUKKyAgKiBwYWNrZXRzIG9mIHRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgYWNjZXNzZWQgYnkgcGFja2V0KGludCksIGFuZCB3cml0ZVBhY2tldChpbnQpIGluIHRoZSBjYXNlIG9mIGEKKyAgKiBsdmFsdWUgZXhwcmVzc2lvbi4KKyAgKgorICAqIFR5cGljYWxseSwgYWxsIHZlY3RvciBleHByZXNzaW9ucyBoYXZlIHRoZSBMaW5lYXJBY2Nlc3NCaXQsIGJ1dCB0aGVyZSBpcyBvbmUgZXhjZXB0aW9uOgorICAqIFByb2R1Y3QgZXhwcmVzc2lvbnMgZG9uJ3QgaGF2ZSBpdCwgYmVjYXVzZSBpdCB3b3VsZCBiZSB0cm91Ymxlc29tZSBmb3IgdmVjdG9yaXphdGlvbiwgZXZlbiB3aGVuIHRoZQorICAqIFByb2R1Y3QgaXMgYSB2ZWN0b3IgZXhwcmVzc2lvbi4gVGh1cywgdmVjdG9yIFByb2R1Y3QgZXhwcmVzc2lvbnMgYWxsb3cgaW5kZXgtYmFzZWQgY29lZmZpY2llbnQgYWNjZXNzIGJ1dAorICAqIG5vdCBpbmRleC1iYXNlZCBwYWNrZXQgYWNjZXNzLCBzbyB0aGV5IGRvbid0IGhhdmUgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgKi8KK2NvbnN0IHVuc2lnbmVkIGludCBMaW5lYXJBY2Nlc3NCaXQgPSAweDEwOworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKgorICAqIE1lYW5zIHRoZSBleHByZXNzaW9uIGhhcyBhIGNvZWZmUmVmKCkgbWV0aG9kLCBpLmUuIGlzIHdyaXRhYmxlIGFzIGl0cyBpbmRpdmlkdWFsIGNvZWZmaWNpZW50cyBhcmUgZGlyZWN0bHkgYWRkcmVzc2FibGUuCisgICogVGhpcyBydWxlcyBvdXQgcmVhZC1vbmx5IGV4cHJlc3Npb25zLgorICAqCisgICogTm90ZSB0aGF0IERpcmVjdEFjY2Vzc0JpdCBhbmQgTHZhbHVlQml0IGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLCBhcyB0aGVyZSBhcmUgZXhhbXBsZXMgb2YgZXhwcmVzc2lvbiBoYXZpbmcgb25lIGJ1dCBub3RlCisgICogdGhlIG90aGVyOgorICAqICAgXGxpIHdyaXRhYmxlIGV4cHJlc3Npb25zIHRoYXQgZG9uJ3QgaGF2ZSBhIHZlcnkgc2ltcGxlIG1lbW9yeSBsYXlvdXQgYXMgYSBzdHJpZGVkIGFycmF5LCBoYXZlIEx2YWx1ZUJpdCBidXQgbm90IERpcmVjdEFjY2Vzc0JpdAorICAqICAgXGxpIE1hcC10by1jb25zdCBleHByZXNzaW9ucywgZm9yIGV4YW1wbGUgTWFwPGNvbnN0IE1hdHJpeD4sIGhhdmUgRGlyZWN0QWNjZXNzQml0IGJ1dCBub3QgTHZhbHVlQml0CisgICoKKyAgKiBFeHByZXNzaW9ucyBoYXZpbmcgTHZhbHVlQml0IGFsc28gaGF2ZSB0aGVpciBjb2VmZigpIG1ldGhvZCByZXR1cm5pbmcgYSBjb25zdCByZWZlcmVuY2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgdmFsdWUuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgTHZhbHVlQml0ID0gMHgyMDsKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBNZWFucyB0aGF0IHRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGNvZWZmaWNpZW50cyBjYW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQgYXMgYSBwbGFpbiBzdHJpZGVkIGFycmF5LiBUaGUgbWVtb3J5IGxheW91dAorICAqIG9mIHRoZSBhcnJheSBvZiBjb2VmZmljaWVudHMgbXVzdCBiZSBleGFjdGx5IHRoZSBuYXR1cmFsIG9uZSBzdWdnZXN0ZWQgYnkgcm93cygpLCBjb2xzKCksCisgICogb3V0ZXJTdHJpZGUoKSwgaW5uZXJTdHJpZGUoKSwgYW5kIHRoZSBSb3dNYWpvckJpdC4gVGhpcyBydWxlcyBvdXQgZXhwcmVzc2lvbnMgc3VjaCBhcyBEaWFnb25hbCwgd2hvc2UgY29lZmZpY2llbnRzLAorICAqIHRob3VnaCByZWZlcmVuY2FibGUsIGRvIG5vdCBoYXZlIHN1Y2ggYSByZWd1bGFyIG1lbW9yeSBsYXlvdXQuCisgICoKKyAgKiBTZWUgdGhlIGNvbW1lbnQgb24gTHZhbHVlQml0IGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgTHZhbHVlQml0IGFuZCBEaXJlY3RBY2Nlc3NCaXQgYXJlIG11dHVhbGx5IG9ydGhvZ29uYWwuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgRGlyZWN0QWNjZXNzQml0ID0gMHg0MDsKKworLyoqIFxkZXByZWNhdGVkIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBtZWFucyB0aGUgZmlyc3QgY29lZmZpY2llbnQgcGFja2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZC4KKyAgKiBBbiBleHByZXNzaW9uIGNhbm5vdCBoYXMgdGhlIEFsaWduZWRCaXQgd2l0aG91dCB0aGUgUGFja2V0QWNjZXNzQml0IGZsYWcuCisgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgbWVhbnMgd2UgYXJlIGFsbG93IHRvIHBlcmZvcm0gYW4gYWxpZ25lZCBwYWNrZXQgYWNjZXNzIHRvIHRoZSBmaXJzdCBlbGVtZW50IHJlZ2FyZGxlc3MKKyAgKiBvZiB0aGUgZXhwcmVzc2lvbiBraW5kOgorICAqIFxjb2RlCisgICogZXhwcmVzc2lvbi5wYWNrZXQ8QWxpZ25lZD4oMCk7CisgICogXGVuZGNvZGUKKyAgKi8KK0VJR0VOX0RFUFJFQ0FURUQgY29uc3QgdW5zaWduZWQgaW50IEFsaWduZWRCaXQgPSAweDgwOworCitjb25zdCB1bnNpZ25lZCBpbnQgTmVzdEJ5UmVmQml0ID0gMHgxMDA7CisKKy8qKiBcaW5ncm91cCBmbGFncworICAqCisgICogZm9yIGFuIGV4cHJlc3Npb24sIHRoaXMgbWVhbnMgdGhhdCB0aGUgc3RvcmFnZSBvcmRlcgorICAqIGNhbiBiZSBlaXRoZXIgcm93LW1ham9yIG9yIGNvbHVtbi1tYWpvci4KKyAgKiBUaGUgcHJlY2lzZSBjaG9pY2Ugd2lsbCBiZSBkZWNpZGVkIGF0IGV2YWx1YXRpb24gdGltZSBvciB3aGVuCisgICogY29tYmluZWQgd2l0aCBvdGhlciBleHByZXNzaW9ucy4KKyAgKiBcc2EgXGJsYW5rICBccmVmIFJvd01ham9yQml0LCBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAqLworY29uc3QgdW5zaWduZWQgaW50IE5vUHJlZmVycmVkU3RvcmFnZU9yZGVyQml0ID0gMHgyMDA7CisKKy8qKiBcaW5ncm91cCBmbGFncworICAqCisgICogTWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZyBjb2VmZmljaWVudHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggcG9pbnRlcnMgdG8gdGhlIHNwYXJzZSAodW4pY29tcHJlc3NlZCBzdG9yYWdlIGZvcm1hdCwKKyAgKiB0aGF0IGlzLCB0aGUgZXhwcmVzc2lvbiBwcm92aWRlczoKKyAgKiBcY29kZQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIHZhbHVlUHRyKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IEluZGV4KiBpbm5lckluZGV4UHRyKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IEluZGV4KiBvdXRlckluZGV4UHRyKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IEluZGV4KiBpbm5lck5vblplcm9QdHIoKSBjb25zdDsKKyAgICBcZW5kY29kZQorICAqLworY29uc3QgdW5zaWduZWQgaW50IENvbXByZXNzZWRBY2Nlc3NCaXQgPSAweDQwMDsKKworCisvLyBsaXN0IG9mIGZsYWdzIHRoYXQgYXJlIGluaGVyaXRlZCBieSBkZWZhdWx0Citjb25zdCB1bnNpZ25lZCBpbnQgSGVyZWRpdGFyeUJpdHMgPSBSb3dNYWpvckJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQ7CisKKy8qKiBcZGVmZ3JvdXAgZW51bXMgRW51bWVyYXRpb25zCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFZhcmlvdXMgZW51bWVyYXRpb25zIHVzZWQgaW4gJUVpZ2VuLiBNYW55IG9mIHRoZXNlIGFyZSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICovCisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gY29udGFpbmluZyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBcYyBNb2RlIG9yIFxjIFVwTG8gcGFyYW1ldGVyIG9mCisgICogTWF0cml4QmFzZTo6c2VsZmFkam9pbnRWaWV3KCkgYW5kIE1hdHJpeEJhc2U6OnRyaWFuZ3VsYXJWaWV3KCksIGFuZCBzZWxmYWRqb2ludCBzb2x2ZXJzLiAqLworZW51bSBVcExvVHlwZSB7CisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLworICBMb3dlcj0weDEsICAgICAgICAgICAgICAgICAgICAgIAorICAvKiogVmlldyBtYXRyaXggYXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguICovCisgIFVwcGVyPTB4MiwgICAgICAgICAgICAgICAgICAgICAgCisgIC8qKiAlTWF0cml4IGhhcyBvbmVzIG9uIHRoZSBkaWFnb25hbDsgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICNMb3dlciBvciAjVXBwZXIuICovCisgIFVuaXREaWFnPTB4NCwgCisgIC8qKiAlTWF0cml4IGhhcyB6ZXJvcyBvbiB0aGUgZGlhZ29uYWw7IHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAjTG93ZXIgb3IgI1VwcGVyLiAqLworICBaZXJvRGlhZz0weDgsCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggb25lcyBvbiB0aGUgZGlhZ29uYWwuICovCisgIFVuaXRMb3dlcj1Vbml0RGlhZ3xMb3dlciwgCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCB3aXRoIG9uZXMgb24gdGhlIGRpYWdvbmFsLiAqLworICBVbml0VXBwZXI9VW5pdERpYWd8VXBwZXIsCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggemVyb3Mgb24gdGhlIGRpYWdvbmFsLiAqLworICBTdHJpY3RseUxvd2VyPVplcm9EaWFnfExvd2VyLCAKKyAgLyoqIFZpZXcgbWF0cml4IGFzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggemVyb3Mgb24gdGhlIGRpYWdvbmFsLiAqLworICBTdHJpY3RseVVwcGVyPVplcm9EaWFnfFVwcGVyLAorICAvKiogVXNlZCBpbiBCYW5kTWF0cml4IGFuZCBTZWxmQWRqb2ludFZpZXcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWF0cml4IGlzIHNlbGYtYWRqb2ludC4gKi8KKyAgU2VsZkFkam9pbnQ9MHgxMCwKKyAgLyoqIFVzZWQgdG8gc3VwcG9ydCBzeW1tZXRyaWMsIG5vbi1zZWxmYWRqb2ludCwgY29tcGxleCBtYXRyaWNlcy4gKi8KKyAgU3ltbWV0cmljPTB4MjAKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gZm9yIGluZGljYXRpbmcgd2hldGhlciBhIGJ1ZmZlciBpcyBhbGlnbmVkIG9yIG5vdC4gKi8KK2VudW0gQWxpZ25tZW50VHlwZSB7CisgIFVuYWxpZ25lZD0wLCAgICAgICAgLyoqPCBEYXRhIHBvaW50ZXIgaGFzIG5vIHNwZWNpZmljIGFsaWdubWVudC4gKi8KKyAgQWxpZ25lZDg9OCwgICAgICAgICAvKio8IERhdGEgcG9pbnRlciBpcyBhbGlnbmVkIG9uIGEgOCBieXRlcyBib3VuZGFyeS4gKi8KKyAgQWxpZ25lZDE2PTE2LCAgICAgICAvKio8IERhdGEgcG9pbnRlciBpcyBhbGlnbmVkIG9uIGEgMTYgYnl0ZXMgYm91bmRhcnkuICovCisgIEFsaWduZWQzMj0zMiwgICAgICAgLyoqPCBEYXRhIHBvaW50ZXIgaXMgYWxpZ25lZCBvbiBhIDMyIGJ5dGVzIGJvdW5kYXJ5LiAqLworICBBbGlnbmVkNjQ9NjQsICAgICAgIC8qKjwgRGF0YSBwb2ludGVyIGlzIGFsaWduZWQgb24gYSA2NCBieXRlcyBib3VuZGFyeS4gKi8KKyAgQWxpZ25lZDEyOD0xMjgsICAgICAvKio8IERhdGEgcG9pbnRlciBpcyBhbGlnbmVkIG9uIGEgMTI4IGJ5dGVzIGJvdW5kYXJ5LiAqLworICBBbGlnbmVkTWFzaz0yNTUsCisgIEFsaWduZWQ9MTYsICAgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBTeW5vbnltIGZvciBBbGlnbmVkMTYuICovCisjaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPT0xMjgKKyAgQWxpZ25lZE1heCA9IEFsaWduZWQxMjgKKyNlbGlmIEVJR0VOX01BWF9BTElHTl9CWVRFUz09NjQKKyAgQWxpZ25lZE1heCA9IEFsaWduZWQ2NAorI2VsaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPT0zMgorICBBbGlnbmVkTWF4ID0gQWxpZ25lZDMyCisjZWxpZiBFSUdFTl9NQVhfQUxJR05fQllURVM9PTE2CisgIEFsaWduZWRNYXggPSBBbGlnbmVkMTYKKyNlbGlmIEVJR0VOX01BWF9BTElHTl9CWVRFUz09OAorICBBbGlnbmVkTWF4ID0gQWxpZ25lZDgKKyNlbGlmIEVJR0VOX01BWF9BTElHTl9CWVRFUz09MAorICBBbGlnbmVkTWF4ID0gVW5hbGlnbmVkCisjZWxzZQorI2Vycm9yIEludmFsaWQgdmFsdWUgZm9yIEVJR0VOX01BWF9BTElHTl9CWVRFUworI2VuZGlmCit9OworCisvKiogXGluZ3JvdXAgZW51bXMKKyAqIEVudW0gdXNlZCBieSBEZW5zZUJhc2U6OmNvcm5lcigpIGluIEVpZ2VuMiBjb21wYXRpYmlsaXR5IG1vZGUuICovCisvLyBGSVhNRSBhZnRlciB0aGUgY29ybmVyKCkgQVBJIGNoYW5nZSwgdGhpcyB3YXMgbm90IG5lZWRlZCBhbnltb3JlLCBleGNlcHQgYnkgQWxpZ25lZEJveAorLy8gVE9ETzogZmluZCBvdXQgd2hhdCB0byBkbyB3aXRoIHRoYXQuIEFkYXB0IHRoZSBBbGlnbmVkQm94IEFQSSA/CitlbnVtIENvcm5lclR5cGUgeyBUb3BMZWZ0LCBUb3BSaWdodCwgQm90dG9tTGVmdCwgQm90dG9tUmlnaHQgfTsKKworLyoqIFxpbmdyb3VwIGVudW1zCisgICogRW51bSBjb250YWluaW5nIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFxwIERpcmVjdGlvbiBwYXJhbWV0ZXIgb2YKKyAgKiBSZXZlcnNlLCBQYXJ0aWFsUmVkdXhFeHByIGFuZCBWZWN0b3J3aXNlT3AuICovCitlbnVtIERpcmVjdGlvblR5cGUgeyAKKyAgLyoqIEZvciBSZXZlcnNlLCBhbGwgY29sdW1ucyBhcmUgcmV2ZXJzZWQ7IAorICAgICogZm9yIFBhcnRpYWxSZWR1eEV4cHIgYW5kIFZlY3Rvcndpc2VPcCwgYWN0IG9uIGNvbHVtbnMuICovCisgIFZlcnRpY2FsLCAKKyAgLyoqIEZvciBSZXZlcnNlLCBhbGwgcm93cyBhcmUgcmV2ZXJzZWQ7IAorICAgICogZm9yIFBhcnRpYWxSZWR1eEV4cHIgYW5kIFZlY3Rvcndpc2VPcCwgYWN0IG9uIHJvd3MuICovCisgIEhvcml6b250YWwsIAorICAvKiogRm9yIFJldmVyc2UsIGJvdGggcm93cyBhbmQgY29sdW1ucyBhcmUgcmV2ZXJzZWQ7IAorICAgICogbm90IHVzZWQgZm9yIFBhcnRpYWxSZWR1eEV4cHIgYW5kIFZlY3Rvcndpc2VPcC4gKi8KKyAgQm90aERpcmVjdGlvbnMgCit9OworCisvKiogXGludGVybmFsIFxpbmdyb3VwIGVudW1zCisgICogRW51bSB0byBzcGVjaWZ5IGhvdyB0byB0cmF2ZXJzZSB0aGUgZW50cmllcyBvZiBhIG1hdHJpeC4gKi8KK2VudW0gVHJhdmVyc2FsVHlwZSB7CisgIC8qKiBcaW50ZXJuYWwgRGVmYXVsdCB0cmF2ZXJzYWwsIG5vIHZlY3Rvcml6YXRpb24sIG5vIGluZGV4LWJhc2VkIGFjY2VzcyAqLworICBEZWZhdWx0VHJhdmVyc2FsLAorICAvKiogXGludGVybmFsIE5vIHZlY3Rvcml6YXRpb24sIHVzZSBpbmRleC1iYXNlZCBhY2Nlc3MgdG8gaGF2ZSBvbmx5IG9uZSBmb3IgbG9vcCBpbnN0ZWFkIG9mIDIgbmVzdGVkIGxvb3BzICovCisgIExpbmVhclRyYXZlcnNhbCwKKyAgLyoqIFxpbnRlcm5hbCBFcXVpdmFsZW50IHRvIGEgc2xpY2UgdmVjdG9yaXphdGlvbiBmb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcyBoYXZpbmcgZ29vZCBhbGlnbm1lbnQKKyAgICAqIGFuZCBnb29kIHNpemUgKi8KKyAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLAorICAvKiogXGludGVybmFsIFZlY3Rvcml6YXRpb24gcGF0aCB1c2luZyBhIHNpbmdsZSBsb29wIHBsdXMgc2NhbGFyIGxvb3BzIGZvciB0aGUKKyAgICAqIHVuYWxpZ25lZCBib3VuZGFyaWVzICovCisgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgIC8qKiBcaW50ZXJuYWwgR2VuZXJpYyB2ZWN0b3JpemF0aW9uIHBhdGggdXNpbmcgb25lIHZlY3Rvcml6ZWQgbG9vcCBwZXIgcm93L2NvbHVtbiB3aXRoIHNvbWUKKyAgICAqIHNjYWxhciBsb29wcyB0byBoYW5kbGUgdGhlIHVuYWxpZ25lZCBib3VuZGFyaWVzICovCisgIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwKKyAgLyoqIFxpbnRlcm5hbCBTcGVjaWFsIGNhc2UgdG8gcHJvcGVybHkgaGFuZGxlIGluY29tcGF0aWJsZSBzY2FsYXIgdHlwZXMgb3Igb3RoZXIgZGVmZWN0aW5nIGNhc2VzKi8KKyAgSW52YWxpZFRyYXZlcnNhbCwKKyAgLyoqIFxpbnRlcm5hbCBFdmFsdWF0ZSBhbGwgZW50cmllcyBhdCBvbmNlICovCisgIEFsbEF0T25jZVRyYXZlcnNhbAorfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVucm9sbCBsb29wcyB3aGVuIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50cmllcyBvZiBhIG1hdHJpeC4gKi8KK2VudW0gVW5yb2xsaW5nVHlwZSB7CisgIC8qKiBcaW50ZXJuYWwgRG8gbm90IHVucm9sbCBsb29wcy4gKi8KKyAgTm9VbnJvbGxpbmcsCisgIC8qKiBcaW50ZXJuYWwgVW5yb2xsIG9ubHkgdGhlIGlubmVyIGxvb3AsIGJ1dCBub3QgdGhlIG91dGVyIGxvb3AuICovCisgIElubmVyVW5yb2xsaW5nLAorICAvKiogXGludGVybmFsIFVucm9sbCBib3RoIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGxvb3AuIElmIHRoZXJlIGlzIG9ubHkgb25lIGxvb3AsIAorICAgICogYmVjYXVzZSBsaW5lYXIgdHJhdmVyc2FsIGlzIHVzZWQsIHRoZW4gdW5yb2xsIHRoYXQgbG9vcC4gKi8KKyAgQ29tcGxldGVVbnJvbGxpbmcKK307CisKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgKGJ1aWx0LWluKSBpbXBsZW1lbnRhdGlvbiBvciB0aGUgc3BlY2lhbGl6YXRpb24uICovCitlbnVtIFNwZWNpYWxpemVkVHlwZSB7CisgIFNwZWNpYWxpemVkLAorICBCdWlsdEluCit9OworCisvKiogXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIGNvbnRhaW5pbmcgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgXHAgX09wdGlvbnMgdGVtcGxhdGUgcGFyYW1ldGVyIG9mCisgICogTWF0cml4LCBBcnJheSBhbmQgQmFuZE1hdHJpeC4gKi8KK2VudW0gU3RvcmFnZU9wdGlvbnMgeworICAvKiogU3RvcmFnZSBvcmRlciBpcyBjb2x1bW4gbWFqb3IgKHNlZSBccmVmIFRvcGljU3RvcmFnZU9yZGVycykuICovCisgIENvbE1ham9yID0gMCwKKyAgLyoqIFN0b3JhZ2Ugb3JkZXIgaXMgcm93IG1ham9yIChzZWUgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMpLiAqLworICBSb3dNYWpvciA9IDB4MSwgIC8vIGl0IGlzIG9ubHkgYSBjb2luY2lkZW5jZSB0aGF0IHRoaXMgaXMgZXF1YWwgdG8gUm93TWFqb3JCaXQgLS0gZG9uJ3QgcmVseSBvbiB0aGF0CisgIC8qKiBBbGlnbiB0aGUgbWF0cml4IGl0c2VsZiBpZiBpdCBpcyB2ZWN0b3JpemFibGUgZml4ZWQtc2l6ZSAqLworICBBdXRvQWxpZ24gPSAwLAorICAvKiogRG9uJ3QgcmVxdWlyZSBhbGlnbm1lbnQgZm9yIHRoZSBtYXRyaXggaXRzZWxmICh0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzLCBpZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIG1heSBzdGlsbCBiZSByZXF1ZXN0ZWQgdG8gYmUgYWxpZ25lZCkgKi8gLy8gRklYTUUgLS0tIGNsYXJpZnkgdGhlIHNpdHVhdGlvbgorICBEb250QWxpZ24gPSAweDIKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgd2hldGhlciB0byBhcHBseSBvciBzb2x2ZSBvbiB0aGUgbGVmdCBvciByaWdodC4gKi8KK2VudW0gU2lkZVR5cGUgeworICAvKiogQXBwbHkgdHJhbnNmb3JtYXRpb24gb24gdGhlIGxlZnQuICovCisgIE9uVGhlTGVmdCA9IDEsICAKKyAgLyoqIEFwcGx5IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSByaWdodC4gKi8KKyAgT25UaGVSaWdodCA9IDIgIAorfTsKKworLyogdGhlIGZvbGxvd2luZyB1c2VkIHRvIGJlIHdyaXR0ZW4gYXM6CisgKgorICogICBzdHJ1Y3QgTm9DaGFuZ2VfdCB7fTsKKyAqICAgbmFtZXNwYWNlIHsKKyAqICAgICBFSUdFTl9VTlVTRUQgTm9DaGFuZ2VfdCBOb0NoYW5nZTsKKyAqICAgfQorICoKKyAqIG9uIHRoZSBncm91bmQgdGhhdCBpdCBmZWVscyBkYW5nZXJvdXMgdG8gZGlzYW1iaWd1YXRlIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG9uIGVudW0vaW50ZWdlciB0eXBlcy4gIAorICogSG93ZXZlciwgdGhpcyBsZWFkcyB0byAidmFyaWFibGUgZGVjbGFyZWQgYnV0IG5ldmVyIHJlZmVyZW5jZWQiIHdhcm5pbmdzIG9uIEludGVsIENvbXBvc2VyIFhFLAorICogYW5kIHdlIGRvIG5vdCBrbm93IGhvdyB0byBnZXQgcmlkIG9mIHRoZW0gKGJ1ZyA0NTApLgorICovCisKK2VudW0gTm9DaGFuZ2VfdCAgIHsgTm9DaGFuZ2UgfTsKK2VudW0gU2VxdWVudGlhbF90IHsgU2VxdWVudGlhbCB9OworZW51bSBEZWZhdWx0X3QgICAgeyBEZWZhdWx0IH07CisKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgZW51bXMKKyAgKiBVc2VkIGluIEFtYmlWZWN0b3IuICovCitlbnVtIEFtYmlWZWN0b3JNb2RlIHsKKyAgSXNEZW5zZSAgICAgICAgID0gMCwKKyAgSXNTcGFyc2UKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIFVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyIGluIERlbnNlQ29lZmZCYXNlIGFuZCBNYXBCYXNlIHRvIGluZGljYXRlIAorICAqIHdoaWNoIGFjY2Vzc29ycyBzaG91bGQgYmUgcHJvdmlkZWQuICovCitlbnVtIEFjY2Vzc29yTGV2ZWxzIHsKKyAgLyoqIFJlYWQtb25seSBhY2Nlc3MgdmlhIGEgbWVtYmVyIGZ1bmN0aW9uLiAqLworICBSZWFkT25seUFjY2Vzc29ycywgCisgIC8qKiBSZWFkL3dyaXRlIGFjY2VzcyB2aWEgbWVtYmVyIGZ1bmN0aW9ucy4gKi8KKyAgV3JpdGVBY2Nlc3NvcnMsIAorICAvKiogRGlyZWN0IHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50cy4gKi8KKyAgRGlyZWN0QWNjZXNzb3JzLCAKKyAgLyoqIERpcmVjdCByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnRzLiAqLworICBEaXJlY3RXcml0ZUFjY2Vzc29ycworfTsKKworLyoqIFxpbmdyb3VwIGVudW1zCisgICogRW51bSB3aXRoIG9wdGlvbnMgdG8gZ2l2ZSB0byB2YXJpb3VzIGRlY29tcG9zaXRpb25zLiAqLworZW51bSBEZWNvbXBvc2l0aW9uT3B0aW9ucyB7CisgIC8qKiBcaW50ZXJuYWwgTm90IHVzZWQgKG1lYW50IGZvciBMRExUPykuICovCisgIFBpdm90aW5nICAgICAgICAgICAgPSAweDAxLCAKKyAgLyoqIFxpbnRlcm5hbCBOb3QgdXNlZCAobWVhbnQgZm9yIExETFQ/KS4gKi8KKyAgTm9QaXZvdGluZyAgICAgICAgICA9IDB4MDIsIAorICAvKiogVXNlZCBpbiBKYWNvYmlTVkQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3F1YXJlIG1hdHJpeCBVIGlzIHRvIGJlIGNvbXB1dGVkLiAqLworICBDb21wdXRlRnVsbFUgICAgICAgID0gMHgwNCwKKyAgLyoqIFVzZWQgaW4gSmFjb2JpU1ZEIHRvIGluZGljYXRlIHRoYXQgdGhlIHRoaW4gbWF0cml4IFUgaXMgdG8gYmUgY29tcHV0ZWQuICovCisgIENvbXB1dGVUaGluVSAgICAgICAgPSAweDA4LAorICAvKiogVXNlZCBpbiBKYWNvYmlTVkQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3F1YXJlIG1hdHJpeCBWIGlzIHRvIGJlIGNvbXB1dGVkLiAqLworICBDb21wdXRlRnVsbFYgICAgICAgID0gMHgxMCwKKyAgLyoqIFVzZWQgaW4gSmFjb2JpU1ZEIHRvIGluZGljYXRlIHRoYXQgdGhlIHRoaW4gbWF0cml4IFYgaXMgdG8gYmUgY29tcHV0ZWQuICovCisgIENvbXB1dGVUaGluViAgICAgICAgPSAweDIwLAorICAvKiogVXNlZCBpbiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGFuZCBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgdG8gc3BlY2lmeQorICAgICogdGhhdCBvbmx5IHRoZSBlaWdlbnZhbHVlcyBhcmUgdG8gYmUgY29tcHV0ZWQgYW5kIG5vdCB0aGUgZWlnZW52ZWN0b3JzLiAqLworICBFaWdlbnZhbHVlc09ubHkgICAgID0gMHg0MCwKKyAgLyoqIFVzZWQgaW4gU2VsZkFkam9pbnRFaWdlblNvbHZlciBhbmQgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIHNwZWNpZnkKKyAgICAqIHRoYXQgYm90aCB0aGUgZWlnZW52YWx1ZXMgYW5kIHRoZSBlaWdlbnZlY3RvcnMgYXJlIHRvIGJlIGNvbXB1dGVkLiAqLworICBDb21wdXRlRWlnZW52ZWN0b3JzID0gMHg4MCwKKyAgLyoqIFxpbnRlcm5hbCAqLworICBFaWdWZWNNYXNrID0gRWlnZW52YWx1ZXNPbmx5IHwgQ29tcHV0ZUVpZ2VudmVjdG9ycywKKyAgLyoqIFVzZWQgaW4gR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIGluZGljYXRlIHRoYXQgaXQgc2hvdWxkCisgICAgKiBzb2x2ZSB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW5wcm9ibGVtIFxmJCBBeCA9IFxsYW1iZGEgQiB4IFxmJC4gKi8KKyAgQXhfbEJ4ICAgICAgICAgICAgICA9IDB4MTAwLAorICAvKiogVXNlZCBpbiBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgdG8gaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQKKyAgICAqIHNvbHZlIHRoZSBnZW5lcmFsaXplZCBlaWdlbnByb2JsZW0gXGYkIEFCeCA9IFxsYW1iZGEgeCBcZiQuICovCisgIEFCeF9seCAgICAgICAgICAgICAgPSAweDIwMCwKKyAgLyoqIFVzZWQgaW4gR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIGluZGljYXRlIHRoYXQgaXQgc2hvdWxkCisgICAgKiBzb2x2ZSB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW5wcm9ibGVtIFxmJCBCQXggPSBcbGFtYmRhIHggXGYkLiAqLworICBCQXhfbHggICAgICAgICAgICAgID0gMHg0MDAsCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgR2VuRWlnTWFzayA9IEF4X2xCeCB8IEFCeF9seCB8IEJBeF9seAorfTsKKworLyoqIFxpbmdyb3VwIGVudW1zCisgICogUG9zc2libGUgdmFsdWVzIGZvciB0aGUgXHAgUVJQcmVjb25kaXRpb25lciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgSmFjb2JpU1ZELiAqLworZW51bSBRUlByZWNvbmRpdGlvbmVycyB7CisgIC8qKiBEbyBub3Qgc3BlY2lmeSB3aGF0IGlzIHRvIGJlIGRvbmUgaWYgdGhlIFNWRCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4IGlzIGFza2VkIGZvci4gKi8KKyAgTm9RUlByZWNvbmRpdGlvbmVyLAorICAvKiogVXNlIGEgUVIgZGVjb21wb3NpdGlvbiB3aXRob3V0IHBpdm90aW5nIGFzIHRoZSBmaXJzdCBzdGVwLiAqLworICBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIsCisgIC8qKiBVc2UgYSBRUiBkZWNvbXBvc2l0aW9uIHdpdGggY29sdW1uIHBpdm90aW5nIGFzIHRoZSBmaXJzdCBzdGVwLiAqLworICBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIsCisgIC8qKiBVc2UgYSBRUiBkZWNvbXBvc2l0aW9uIHdpdGggZnVsbCBwaXZvdGluZyBhcyB0aGUgZmlyc3Qgc3RlcC4gKi8KKyAgRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcgorfTsKKworI2lmZGVmIFN1Y2Nlc3MKKyNlcnJvciBUaGUgcHJlcHJvY2Vzc29yIHN5bWJvbCAnU3VjY2VzcycgaXMgZGVmaW5lZCwgcG9zc2libHkgYnkgdGhlIFgxMSBoZWFkZXIgZmlsZSBYLmgKKyNlbmRpZgorCisvKiogXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIGZvciByZXBvcnRpbmcgdGhlIHN0YXR1cyBvZiBhIGNvbXB1dGF0aW9uLiAqLworZW51bSBDb21wdXRhdGlvbkluZm8geworICAvKiogQ29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuICovCisgIFN1Y2Nlc3MgPSAwLCAgICAgICAgCisgIC8qKiBUaGUgcHJvdmlkZWQgZGF0YSBkaWQgbm90IHNhdGlzZnkgdGhlIHByZXJlcXVpc2l0ZXMuICovCisgIE51bWVyaWNhbElzc3VlID0gMSwgCisgIC8qKiBJdGVyYXRpdmUgcHJvY2VkdXJlIGRpZCBub3QgY29udmVyZ2UuICovCisgIE5vQ29udmVyZ2VuY2UgPSAyLAorICAvKiogVGhlIGlucHV0cyBhcmUgaW52YWxpZCwgb3IgdGhlIGFsZ29yaXRobSBoYXMgYmVlbiBpbXByb3Blcmx5IGNhbGxlZC4KKyAgICAqIFdoZW4gYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgc3VjaCBlcnJvcnMgdHJpZ2dlciBhbiBhc3NlcnQuICovCisgIEludmFsaWRJbnB1dCA9IDMKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdXNlZCB0byBzcGVjaWZ5IGhvdyBhIHBhcnRpY3VsYXIgdHJhbnNmb3JtYXRpb24gaXMgc3RvcmVkIGluIGEgbWF0cml4LgorICAqIFxzYSBUcmFuc2Zvcm0sIEh5cGVycGxhbmU6OnRyYW5zZm9ybSgpLiAqLworZW51bSBUcmFuc2Zvcm1UcmFpdHMgeworICAvKiogVHJhbnNmb3JtYXRpb24gaXMgYW4gaXNvbWV0cnkuICovCisgIElzb21ldHJ5ICAgICAgPSAweDEsCisgIC8qKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3RvcmVkIGFzIGEgKERpbSsxKV4yIG1hdHJpeCB3aG9zZSBsYXN0IHJvdyBpcyAKKyAgICAqIGFzc3VtZWQgdG8gYmUgWzAgLi4uIDAgMV0uICovCisgIEFmZmluZSAgICAgICAgPSAweDIsCisgIC8qKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3RvcmVkIGFzIGEgKERpbSkgeCAoRGltKzEpIG1hdHJpeC4gKi8KKyAgQWZmaW5lQ29tcGFjdCA9IDB4MTAgfCBBZmZpbmUsCisgIC8qKiBUcmFuc2Zvcm1hdGlvbiBpcyBhIGdlbmVyYWwgcHJvamVjdGl2ZSB0cmFuc2Zvcm1hdGlvbiBzdG9yZWQgYXMgYSAoRGltKzEpXjIgbWF0cml4LiAqLworICBQcm9qZWN0aXZlICAgID0gMHgyMAorfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdXNlZCB0byBjaG9vc2UgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRpbmcgb24gdGhlIGNvbXB1dGVyIGFyY2hpdGVjdHVyZS4gKi8KK25hbWVzcGFjZSBBcmNoaXRlY3R1cmUKK3sKKyAgZW51bSBUeXBlIHsKKyAgICBHZW5lcmljID0gMHgwLAorICAgIFNTRSA9IDB4MSwKKyAgICBBbHRpVmVjID0gMHgyLAorICAgIFZTWCA9IDB4MywKKyAgICBORU9OID0gMHg0LAorI2lmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX1NTRQorICAgIFRhcmdldCA9IFNTRQorI2VsaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQworICAgIFRhcmdldCA9IEFsdGlWZWMKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX1ZTWAorICAgIFRhcmdldCA9IFZTWAorI2VsaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfTkVPTgorICAgIFRhcmdldCA9IE5FT04KKyNlbHNlCisgICAgVGFyZ2V0ID0gR2VuZXJpYworI2VuZGlmCisgIH07Cit9CisKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyIGluIFByb2R1Y3QgYW5kIHByb2R1Y3QgZXZhbHVhdG9ycy4gKi8KK2VudW0gUHJvZHVjdEltcGxUeXBlCit7IERlZmF1bHRQcm9kdWN0PTAsIExhenlQcm9kdWN0LCBBbGlhc0ZyZWVQcm9kdWN0LCBDb2VmZkJhc2VkUHJvZHVjdE1vZGUsIExhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUsIE91dGVyUHJvZHVjdCwgSW5uZXJQcm9kdWN0LCBHZW12UHJvZHVjdCwgR2VtbVByb2R1Y3QgfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdXNlZCBpbiBleHBlcmltZW50YWwgcGFyYWxsZWwgaW1wbGVtZW50YXRpb24uICovCitlbnVtIEFjdGlvbiB7R2V0QWN0aW9uLCBTZXRBY3Rpb259OworCisvKiogVGhlIHR5cGUgdXNlZCB0byBpZGVudGlmeSBhIGRlbnNlIHN0b3JhZ2UuICovCitzdHJ1Y3QgRGVuc2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgZ2VuZXJhbCBzcGFyc2Ugc3RvcmFnZS4gKi8KK3N0cnVjdCBTcGFyc2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgZ2VuZXJhbCBzb2x2ZXIgKGZhY3RvcmVkKSBzdG9yYWdlLiAqLworc3RydWN0IFNvbHZlclN0b3JhZ2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgcGVybXV0YXRpb24gc3RvcmFnZS4gKi8KK3N0cnVjdCBQZXJtdXRhdGlvblN0b3JhZ2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgcGVybXV0YXRpb24gc3RvcmFnZS4gKi8KK3N0cnVjdCBUcmFuc3Bvc2l0aW9uc1N0b3JhZ2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWF0cml4IGV4cHJlc3Npb24gKi8KK3N0cnVjdCBNYXRyaXhYcHIge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGFuIGFycmF5IGV4cHJlc3Npb24gKi8KK3N0cnVjdCBBcnJheVhwciB7fTsKKworLy8gQW4gZXZhbHVhdG9yIG11c3QgZGVmaW5lIGl0cyBzaGFwZS4gQnkgZGVmYXVsdCwgaXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorc3RydWN0IERlbnNlU2hhcGUgICAgICAgICAgICAgeyBzdGF0aWMgc3RkOjpzdHJpbmcgZGVidWdOYW1lKCkgeyByZXR1cm4gIkRlbnNlU2hhcGUiOyB9IH07CitzdHJ1Y3QgU29sdmVyU2hhcGUgICAgICAgICAgICB7IHN0YXRpYyBzdGQ6OnN0cmluZyBkZWJ1Z05hbWUoKSB7IHJldHVybiAiU29sdmVyU2hhcGUiOyB9IH07CitzdHJ1Y3QgSG9tb2dlbmVvdXNTaGFwZSAgICAgICB7IHN0YXRpYyBzdGQ6OnN0cmluZyBkZWJ1Z05hbWUoKSB7IHJldHVybiAiSG9tb2dlbmVvdXNTaGFwZSI7IH0gfTsKK3N0cnVjdCBEaWFnb25hbFNoYXBlICAgICAgICAgIHsgc3RhdGljIHN0ZDo6c3RyaW5nIGRlYnVnTmFtZSgpIHsgcmV0dXJuICJEaWFnb25hbFNoYXBlIjsgfSB9Oworc3RydWN0IEJhbmRTaGFwZSAgICAgICAgICAgICAgeyBzdGF0aWMgc3RkOjpzdHJpbmcgZGVidWdOYW1lKCkgeyByZXR1cm4gIkJhbmRTaGFwZSI7IH0gfTsKK3N0cnVjdCBUcmlhbmd1bGFyU2hhcGUgICAgICAgIHsgc3RhdGljIHN0ZDo6c3RyaW5nIGRlYnVnTmFtZSgpIHsgcmV0dXJuICJUcmlhbmd1bGFyU2hhcGUiOyB9IH07CitzdHJ1Y3QgU2VsZkFkam9pbnRTaGFwZSAgICAgICB7IHN0YXRpYyBzdGQ6OnN0cmluZyBkZWJ1Z05hbWUoKSB7IHJldHVybiAiU2VsZkFkam9pbnRTaGFwZSI7IH0gfTsKK3N0cnVjdCBQZXJtdXRhdGlvblNoYXBlICAgICAgIHsgc3RhdGljIHN0ZDo6c3RyaW5nIGRlYnVnTmFtZSgpIHsgcmV0dXJuICJQZXJtdXRhdGlvblNoYXBlIjsgfSB9Oworc3RydWN0IFRyYW5zcG9zaXRpb25zU2hhcGUgICAgeyBzdGF0aWMgc3RkOjpzdHJpbmcgZGVidWdOYW1lKCkgeyByZXR1cm4gIlRyYW5zcG9zaXRpb25zU2hhcGUiOyB9IH07CitzdHJ1Y3QgU3BhcnNlU2hhcGUgICAgICAgICAgICB7IHN0YXRpYyBzdGQ6OnN0cmluZyBkZWJ1Z05hbWUoKSB7IHJldHVybiAiU3BhcnNlU2hhcGUiOyB9IH07CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLy8gcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgYmFzZWQgb24gY29lZmYqKCkgYWNjZXNzb3JzLgorc3RydWN0IEluZGV4QmFzZWQge307CisKKy8vIGV2YWx1YXRvciBiYXNlZCBvbiBpdGVyYXRvcnMgdG8gYWNjZXNzIGNvZWZmaWNpZW50cy4gCitzdHJ1Y3QgSXRlcmF0b3JCYXNlZCB7fTsKKworLyoqIFxpbnRlcm5hbAorICogQ29uc3RhbnRzIGZvciBjb21wYXJpc29uIGZ1bmN0b3JzCisgKi8KK2VudW0gQ29tcGFyaXNvbk5hbWUgeworICBjbXBfRVEgPSAwLAorICBjbXBfTFQgPSAxLAorICBjbXBfTEUgPSAyLAorICBjbXBfVU5PUkQgPSAzLAorICBjbXBfTkVRID0gNCwKKyAgY21wX0dUID0gNSwKKyAgY21wX0dFID0gNgorfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NTU5ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECisjZGVmaW5lIEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECisKKyNpZmRlZiBfTVNDX1ZFUgorICAvLyA0MTAwIC0gdW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXIgKG9jY3VycmVkIGUuZy4gaW4gYWxpZ25lZF9hbGxvY2F0b3I6OmRlc3Ryb3kocG9pbnRlciBwKSkKKyAgLy8gNDEwMSAtIHVucmVmZXJlbmNlZCBsb2NhbCB2YXJpYWJsZQorICAvLyA0MTI3IC0gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorICAvLyA0MTgxIC0gcXVhbGlmaWVyIGFwcGxpZWQgdG8gcmVmZXJlbmNlIHR5cGUgaWdub3JlZAorICAvLyA0MjExIC0gbm9uc3RhbmRhcmQgZXh0ZW5zaW9uIHVzZWQgOiByZWRlZmluZWQgZXh0ZXJuIHRvIHN0YXRpYworICAvLyA0MjQ0IC0gJ2FyZ3VtZW50JyA6IGNvbnZlcnNpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorICAvLyA0MjczIC0gUXRBbGlnbmVkTWFsbG9jLCBpbmNvbnNpc3RlbnQgRExMIGxpbmthZ2UKKyAgLy8gNDMyNCAtIHN0cnVjdHVyZSB3YXMgcGFkZGVkIGR1ZSB0byBkZWNsc3BlYyhhbGlnbigpKQorICAvLyA0NTAzIC0gZGVjb3JhdGVkIG5hbWUgbGVuZ3RoIGV4Y2VlZGVkLCBuYW1lIHdhcyB0cnVuY2F0ZWQKKyAgLy8gNDUxMiAtIGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZAorICAvLyA0NTIyIC0gJ2NsYXNzJyA6IG11bHRpcGxlIGFzc2lnbm1lbnQgb3BlcmF0b3JzIHNwZWNpZmllZAorICAvLyA0NzAwIC0gdW5pbml0aWFsaXplZCBsb2NhbCB2YXJpYWJsZSAneHl6JyB1c2VkCisgIC8vIDQ3MTQgLSBmdW5jdGlvbiBtYXJrZWQgYXMgX19mb3JjZWlubGluZSBub3QgaW5saW5lZAorICAvLyA0NzE3IC0gJ2Z1bmN0aW9uJyA6IHJlY3Vyc2l2ZSBvbiBhbGwgY29udHJvbCBwYXRocywgZnVuY3Rpb24gd2lsbCBjYXVzZSBydW50aW1lIHN0YWNrIG92ZXJmbG93CisgIC8vIDQ4MDAgLSAndHlwZScgOiBmb3JjaW5nIHZhbHVlIHRvIGJvb2wgJ3RydWUnIG9yICdmYWxzZScgKHBlcmZvcm1hbmNlIHdhcm5pbmcpCisgICNpZm5kZWYgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKKyAgICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAjZW5kaWYKKyAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCA0MTAxIDQxMjcgNDE4MSA0MjExIDQyNDQgNDI3MyA0MzI0IDQ1MDMgNDUxMiA0NTIyIDQ3MDAgNDcxNCA0NzE3IDQ4MDApCisKKyNlbGlmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorICAvLyAyMTk2IC0gcm91dGluZSBpcyBib3RoICJpbmxpbmUiIGFuZCAibm9pbmxpbmUiICgibm9pbmxpbmUiIGFzc3VtZWQpCisgIC8vICAgICAgICBJQ0MgMTIgZ2VuZXJhdGVzIHRoaXMgd2FybmluZyBldmVuIHdpdGhvdXQgYW55IGlubGluZSBrZXl3b3JkLCB3aGVuIGRlZmluaW5nIGNsYXNzIG1ldGhvZHMgJ2lubGluZScgaS5lLiBpbnNpZGUgb2YgY2xhc3MgYm9keQorICAvLyAgICAgICAgdHlwZWRlZiB0aGF0IG1heSBiZSBhIHJlZmVyZW5jZSB0eXBlLgorICAvLyAyNzkgIC0gY29udHJvbGxpbmcgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorICAvLyAgICAgICAgSUNDIDEyIGdlbmVyYXRlcyB0aGlzIHdhcm5pbmcgb24gYXNzZXJ0KGNvbnN0YW50X2V4cHJlc3Npb25fZGVwZW5kaW5nX29uX3RlbXBsYXRlX3BhcmFtcykgYW5kIGZyYW5rbHkgdGhpcyBpcyBhIGxlZ2l0aW1hdGUgdXNlIGNhc2UuCisgIC8vIDE2ODQgLSBjb252ZXJzaW9uIGZyb20gcG9pbnRlciB0byBzYW1lLXNpemVkIGludGVncmFsIHR5cGUgKHBvdGVudGlhbCBwb3J0YWJpbGl0eSBwcm9ibGVtKQorICAvLyAyMjU5IC0gbm9uLXBvaW50ZXIgY29udmVyc2lvbiBmcm9tICJFaWdlbjo6SW5kZXg9e3B0cmRpZmZfdD17bG9uZ319IiB0byAiaW50IiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICNpZm5kZWYgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKKyAgICAjcHJhZ21hIHdhcm5pbmcgcHVzaAorICAjZW5kaWYKKyAgI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5NiAyNzkgMTY4NCAyMjU5CisKKyNlbGlmIGRlZmluZWQgX19jbGFuZ19fCisgIC8vIC1XY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIC0gd2FybmluZzogdXNlIG9mIGxvZ2ljYWwgJiYgd2l0aCBjb25zdGFudCBvcGVyYW5kOyBzd2l0Y2ggdG8gYml0d2lzZSAmIG9yIHJlbW92ZSBjb25zdGFudAorICAvLyAgICAgdGhpcyBpcyByZWFsbHkgYSBzdHVwaWQgd2FybmluZyBhcyBpdCB3YXJucyBvbiBjb21waWxlLXRpbWUgZXhwcmVzc2lvbnMgaW52b2x2aW5nIGVudW1zCisgICNpZm5kZWYgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKKyAgICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorICAjZW5kaWYKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIgorCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fPj02CisKKyAgI2lmbmRlZiBFSUdFTl9QRVJNQU5FTlRMWV9ESVNBQkxFX1NUVVBJRF9XQVJOSU5HUworICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAjZW5kaWYKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2lnbm9yZWQtYXR0cmlidXRlcyIKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fTlZDQ19fCisgIC8vIERpc2FibGUgdGhlICJzdGF0ZW1lbnQgaXMgdW5yZWFjaGFibGUiIG1lc3NhZ2UKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIGNvZGVfaXNfdW5yZWFjaGFibGUKKyAgLy8gRGlzYWJsZSB0aGUgImR5bmFtaWMgaW5pdGlhbGl6YXRpb24gaW4gdW5yZWFjaGFibGUgY29kZSIgbWVzc2FnZQorICAjcHJhZ21hIGRpYWdfc3VwcHJlc3MgaW5pdGlhbGl6YXRpb25fbm90X3JlYWNoYWJsZQorICAvLyBEaXNhYmxlIHRoZSAiaW52YWxpZCBlcnJvciBudW1iZXIiIG1lc3NhZ2UgdGhhdCB3ZSBnZXQgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBudmNjCisgICNwcmFnbWEgZGlhZ19zdXBwcmVzcyAxMjIyCisgIC8vIERpc2FibGUgdGhlICJjYWxsaW5nIGEgX19ob3N0X18gZnVuY3Rpb24gZnJvbSBhIF9faG9zdF9fIF9fZGV2aWNlX18gZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQiIG1lc3NhZ2VzICh5ZXMsIHRoZXJlIGFyZSBtYW55IG9mIHRoZW0gYW5kIHRoZXkgc2VlbSB0byBjaGFuZ2Ugd2l0aCBldmVyeSB2ZXJzaW9uIG9mIHRoZSBjb21waWxlcikKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI1MjcKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI1MjkKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NTEKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NTMKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NjgKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NjkKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NzAKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI2NzEKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI3MzUKKyAgI3ByYWdtYSBkaWFnX3N1cHByZXNzIDI3MzcKKyNlbmRpZgorCisjZW5kaWYgLy8gbm90IEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRm9yd2FyZERlY2xhcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTA3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaApAQCAtMCwwICsxLDMwMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GT1JXQVJEREVDTEFSQVRJT05TX0gKKyNkZWZpbmUgRUlHRU5fRk9SV0FSRERFQ0xBUkFUSU9OU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRzOworCisvLyBoZXJlIHdlIHNheSBvbmNlIGFuZCBmb3IgYWxsIHRoYXQgdHJhaXRzPGNvbnN0IFQ+ID09IHRyYWl0czxUPgorLy8gV2hlbiBjb25zdG5lc3MgbXVzdCBhZmZlY3QgdHJhaXRzLCBpdCBoYXMgdG8gYmUgY29uc3RuZXNzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgb24gd2hpY2ggVCBpdHNlbGYgZGVwZW5kcy4KKy8vIEZvciBleGFtcGxlLCB0cmFpdHM8TWFwPGNvbnN0IFQ+ID4gIT0gdHJhaXRzPE1hcDxUPiA+LCBidXQKKy8vICAgICAgICAgICAgICB0cmFpdHM8Y29uc3QgTWFwPFQ+ID4gPT0gdHJhaXRzPE1hcDxUPiA+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRzPGNvbnN0IFQ+IDogdHJhaXRzPFQ+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgaGFzX2RpcmVjdF9hY2Nlc3MKK3sKKyAgZW51bSB7IHJldCA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgRGlyZWN0QWNjZXNzQml0KSA/IDEgOiAwIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgYWNjZXNzb3JzX2xldmVsCit7CisgIGVudW0geyBoYXNfZGlyZWN0X2FjY2VzcyA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgRGlyZWN0QWNjZXNzQml0KSA/IDEgOiAwLAorICAgICAgICAgaGFzX3dyaXRlX2FjY2VzcyA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgTHZhbHVlQml0KSA/IDEgOiAwLAorICAgICAgICAgdmFsdWUgPSBoYXNfZGlyZWN0X2FjY2VzcyA/IChoYXNfd3JpdGVfYWNjZXNzID8gRGlyZWN0V3JpdGVBY2Nlc3NvcnMgOiBEaXJlY3RBY2Nlc3NvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGhhc193cml0ZV9hY2Nlc3MgPyBXcml0ZUFjY2Vzc29ycyAgICAgICA6IFJlYWRPbmx5QWNjZXNzb3JzKQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGV2YWx1YXRvcl90cmFpdHM7CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUPiBzdHJ1Y3QgZXZhbHVhdG9yOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IE51bVRyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IEVpZ2VuQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIERlbnNlQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFBsYWluT2JqZWN0QmFzZTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLAorICAgICAgICAgaW50IExldmVsID0gaW50ZXJuYWw6OmFjY2Vzc29yc19sZXZlbDxEZXJpdmVkPjo6dmFsdWUgPgorY2xhc3MgRGVuc2VDb2VmZnNCYXNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywKKyAgICAgICAgIGludCBfT3B0aW9ucyA9IEF1dG9BbGlnbiB8CisjaWYgRUlHRU5fR05VQ19BVCgzLDQpCisgICAgLy8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBhdCBsZWFzdCBnY2MgMy40LjYKKyAgICAvLyB0aGUgaW5uZXJtb3N0ID86IHRlcm5hcnkgb3BlcmF0b3IgaXMgbWlzcGFyc2VkLiBXZSB3cml0ZSBpdCBzbGlnaHRseQorICAgIC8vIGRpZmZlcmVudGx5IGFuZCB0aGlzIG1ha2VzIGdjYyAzLjQuNiBoYXBweSwgYnV0IGl0J3MgdWdseS4KKyAgICAvLyBUaGUgZXJyb3Igd291bGQgb25seSBzaG93IHVwIHdpdGggRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IgaXMgZGVmaW5lZAorICAgIC8vICh3aGVuIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OIGlzIFJvd01ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChfUm93cz09MSAmJiBfQ29scyE9MSkgPyBFaWdlbjo6Um93TWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAhKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/ICBFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVpZ2VuOjpDb2xNYWpvciApLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoX1Jvd3M9PTEgJiYgX0NvbHMhPTEpID8gRWlnZW46OlJvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/IEVpZ2VuOjpDb2xNYWpvcgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OICksCisjZW5kaWYKKyAgICAgICAgIGludCBfTWF4Um93cyA9IF9Sb3dzLAorICAgICAgICAgaW50IF9NYXhDb2xzID0gX0NvbHMKKz4gY2xhc3MgTWF0cml4OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBNYXRyaXhCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgQXJyYXlCYXNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgdW5zaWduZWQgaW50IEFkZGVkLCB1bnNpZ25lZCBpbnQgUmVtb3ZlZD4gY2xhc3MgRmxhZ2dlZDsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFN0b3JhZ2VCYXNlID4gY2xhc3MgTm9BbGlhczsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPiBjbGFzcyBOZXN0QnlWYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPiBjbGFzcyBGb3JjZUFsaWduZWRBY2Nlc3M7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgU3dhcFdyYXBwZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIGludCBCbG9ja1Jvd3M9RHluYW1pYywgaW50IEJsb2NrQ29scz1EeW5hbWljLCBib29sIElubmVyUGFuZWwgPSBmYWxzZT4gY2xhc3MgQmxvY2s7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBTaXplPUR5bmFtaWM+IGNsYXNzIFZlY3RvckJsb2NrOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgVHJhbnNwb3NlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgQ29uanVnYXRlOwordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPiAgICAgICAgIGNsYXNzIEN3aXNlTnVsbGFyeU9wOwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgICB0eXBlbmFtZSBNYXRyaXhUeXBlPiAgICAgICAgIGNsYXNzIEN3aXNlVW5hcnlPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgICAgdHlwZW5hbWUgTWF0cml4VHlwZT4gICAgICAgICBjbGFzcyBDd2lzZVVuYXJ5VmlldzsKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCAgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+ICBjbGFzcyBDd2lzZUJpbmFyeU9wOwordGVtcGxhdGU8dHlwZW5hbWUgVGVybmFyeU9wLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPiAgY2xhc3MgQ3dpc2VUZXJuYXJ5T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHN0eXBlPiAgICAgICAgY2xhc3MgU29sdmU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgSW52ZXJzZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBPcHRpb24gPSBEZWZhdWx0UHJvZHVjdD4gY2xhc3MgUHJvZHVjdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgRGlhZ29uYWxCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgX0RpYWdvbmFsVmVjdG9yVHlwZT4gY2xhc3MgRGlhZ29uYWxXcmFwcGVyOwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWU9U2l6ZUF0Q29tcGlsZVRpbWU+IGNsYXNzIERpYWdvbmFsTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgRGlhZ29uYWxUeXBlLCBpbnQgUHJvZHVjdE9yZGVyPiBjbGFzcyBEaWFnb25hbFByb2R1Y3Q7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgSW5kZXggPSAwPiBjbGFzcyBEaWFnb25hbDsKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lID0gU2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZT1pbnQ+IGNsYXNzIFBlcm11dGF0aW9uTWF0cml4OwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBTaXplQXRDb21waWxlVGltZSwgdHlwZW5hbWUgSW5kZXhUeXBlPWludD4gY2xhc3MgVHJhbnNwb3NpdGlvbnM7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBQZXJtdXRhdGlvbkJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBUcmFuc3Bvc2l0aW9uc0Jhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5kaWNlc1R5cGU+IGNsYXNzIFBlcm11dGF0aW9uV3JhcHBlcjsKK3RlbXBsYXRlPHR5cGVuYW1lIF9JbmRpY2VzVHlwZT4gY2xhc3MgVHJhbnNwb3NpdGlvbnNXcmFwcGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLAorICAgICAgICAgaW50IExldmVsID0gaW50ZXJuYWw6OmFjY2Vzc29yc19sZXZlbDxEZXJpdmVkPjo6aGFzX3dyaXRlX2FjY2VzcyA/IFdyaXRlQWNjZXNzb3JzIDogUmVhZE9ubHlBY2Nlc3NvcnMKKz4gY2xhc3MgTWFwQmFzZTsKK3RlbXBsYXRlPGludCBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsIGludCBPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWU+IGNsYXNzIFN0cmlkZTsKK3RlbXBsYXRlPGludCBWYWx1ZSA9IER5bmFtaWM+IGNsYXNzIElubmVyU3RyaWRlOwordGVtcGxhdGU8aW50IFZhbHVlID0gRHluYW1pYz4gY2xhc3MgT3V0ZXJTdHJpZGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgTWFwT3B0aW9ucz1VbmFsaWduZWQsIHR5cGVuYW1lIFN0cmlkZVR5cGUgPSBTdHJpZGU8MCwwPiA+IGNsYXNzIE1hcDsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFJlZkJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsIGludCBPcHRpb25zID0gMCwKKyAgICAgICAgIHR5cGVuYW1lIFN0cmlkZVR5cGUgPSB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8UGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsSW5uZXJTdHJpZGU8MT4sT3V0ZXJTdHJpZGU8PiA+Ojp0eXBlID4gY2xhc3MgUmVmOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBUcmlhbmd1bGFyQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPiBjbGFzcyBUcmlhbmd1bGFyVmlldzsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPiBjbGFzcyBTZWxmQWRqb2ludFZpZXc7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBTcGFyc2VWaWV3OwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIFdpdGhGb3JtYXQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgQ29tbWFJbml0aWFsaXplcjsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFJldHVybkJ5VmFsdWU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgQXJyYXlXcmFwcGVyOwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIE1hdHJpeFdyYXBwZXI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTb2x2ZXJCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgSW5uZXJJdGVyYXRvcjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3Qga2VybmVsX3JldHZhbF9iYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU+IHN0cnVjdCBrZXJuZWxfcmV0dmFsOwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU+IHN0cnVjdCBpbWFnZV9yZXR2YWxfYmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3QgaW1hZ2VfcmV0dmFsOworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgUm93cz1EeW5hbWljLCBpbnQgQ29scz1EeW5hbWljLCBpbnQgU3VwZXJzPUR5bmFtaWMsIGludCBTdWJzPUR5bmFtaWMsIGludCBPcHRpb25zPTA+IGNsYXNzIEJhbmRNYXRyaXg7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gc3RydWN0IHByb2R1Y3RfdHlwZTsKKwordGVtcGxhdGU8Ym9vbD4gc3RydWN0IEVuYWJsZUlmOworCisvKiogXGludGVybmFsCisgICogXGNsYXNzIHByb2R1Y3RfZXZhbHVhdG9yCisgICogUHJvZHVjdHMgbmVlZCB0aGVpciBvd24gZXZhbHVhdG9yIHdpdGggbW9yZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYWxsb3dpbmcgZm9yCisgICogZWFzaWVyIHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIFQsCisgICAgICAgICAgaW50IFByb2R1Y3RUYWcgPSBpbnRlcm5hbDo6cHJvZHVjdF90eXBlPHR5cGVuYW1lIFQ6Okxocyx0eXBlbmFtZSBUOjpSaHM+OjpyZXQsCisgICAgICAgICAgdHlwZW5hbWUgTGhzU2hhcGUgPSB0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPHR5cGVuYW1lIFQ6Okxocz46OlNoYXBlLAorICAgICAgICAgIHR5cGVuYW1lIFJoc1NoYXBlID0gdHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czx0eXBlbmFtZSBUOjpSaHM+OjpTaGFwZSwKKyAgICAgICAgICB0eXBlbmFtZSBMaHNTY2FsYXIgPSB0eXBlbmFtZSB0cmFpdHM8dHlwZW5hbWUgVDo6TGhzPjo6U2NhbGFyLAorICAgICAgICAgIHR5cGVuYW1lIFJoc1NjYWxhciA9IHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSBUOjpSaHM+OjpTY2FsYXIKKyAgICAgICAgPiBzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLAorICAgICAgICAgaW50IFByb2R1Y3RUeXBlID0gaW50ZXJuYWw6OnByb2R1Y3RfdHlwZTxMaHMsUmhzPjo6dmFsdWU+CitzdHJ1Y3QgUHJvZHVjdFJldHVyblR5cGU7CisKKy8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBzdW4gQ0MKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgTGF6eVByb2R1Y3RSZXR1cm5UeXBlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm92aWRlcyBzY2FsYXIvcGFja2V0LXdpc2UgcHJvZHVjdCBhbmQgcHJvZHVjdCB3aXRoIGFjY3VtdWxhdGlvbgorLy8gd2l0aCBvcHRpb25hbCBjb25qdWdhdGlvbiBvZiB0aGUgYXJndW1lbnRzLgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uakxocz1mYWxzZSwgYm9vbCBDb25qUmhzPWZhbHNlPiBzdHJ1Y3QgY29ual9oZWxwZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI9TGhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3N1bV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI9TGhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2RpZmZlcmVuY2Vfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPUxoc1NjYWxhcj4gc3RydWN0IHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPUxoc1NjYWxhcj4gc3RydWN0IHNjYWxhcl9taW5fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPUxoc1NjYWxhcj4gc3RydWN0IHNjYWxhcl9tYXhfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfb3Bwb3NpdGVfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY29uanVnYXRlX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3JlYWxfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfaW1hZ19vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hYnNfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYWJzMl9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zcXJ0X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3JzcXJ0X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2V4cF9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9sb2dfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY29zX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3Npbl9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hY29zX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2FzaW5fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfdGFuX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2ludmVyc2Vfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfc3F1YXJlX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2N1YmVfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5ld1R5cGU+IHN0cnVjdCBzY2FsYXJfY2FzdF9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9yYW5kb21fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY29uc3RhbnRfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfaWRlbnRpdHlfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsYm9vbCBpc2NweD4gc3RydWN0IHNjYWxhcl9zaWduX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFNjYWxhckV4cG9uZW50PiBzdHJ1Y3Qgc2NhbGFyX3Bvd19vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI9TGhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2h5cG90X29wOwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj1MaHNTY2FsYXI+IHN0cnVjdCBzY2FsYXJfcHJvZHVjdF9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI9TGhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50X29wOworCisvLyBTcGVjaWFsRnVuY3Rpb25zIG1vZHVsZQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2xnYW1tYV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9kaWdhbW1hX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2VyZl9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9lcmZjX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2lnYW1tYV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9pZ2FtbWFjX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3pldGFfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYmV0YWluY19vcDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3N0cnVjdCBJT0Zvcm1hdDsKKworLy8gQXJyYXkgbW9kdWxlCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywKKyAgICAgICAgIGludCBfT3B0aW9ucyA9IEF1dG9BbGlnbiB8CisjaWYgRUlHRU5fR05VQ19BVCgzLDQpCisgICAgLy8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBhdCBsZWFzdCBnY2MgMy40LjYKKyAgICAvLyB0aGUgaW5uZXJtb3N0ID86IHRlcm5hcnkgb3BlcmF0b3IgaXMgbWlzcGFyc2VkLiBXZSB3cml0ZSBpdCBzbGlnaHRseQorICAgIC8vIGRpZmZlcmVudGx5IGFuZCB0aGlzIG1ha2VzIGdjYyAzLjQuNiBoYXBweSwgYnV0IGl0J3MgdWdseS4KKyAgICAvLyBUaGUgZXJyb3Igd291bGQgb25seSBzaG93IHVwIHdpdGggRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IgaXMgZGVmaW5lZAorICAgIC8vICh3aGVuIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OIGlzIFJvd01ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChfUm93cz09MSAmJiBfQ29scyE9MSkgPyBFaWdlbjo6Um93TWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAhKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/ICBFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVpZ2VuOjpDb2xNYWpvciApLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoX1Jvd3M9PTEgJiYgX0NvbHMhPTEpID8gRWlnZW46OlJvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/IEVpZ2VuOjpDb2xNYWpvcgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OICksCisjZW5kaWYKKyAgICAgICAgIGludCBfTWF4Um93cyA9IF9Sb3dzLCBpbnQgX01heENvbHMgPSBfQ29scz4gY2xhc3MgQXJyYXk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25kaXRpb25NYXRyaXhUeXBlLCB0eXBlbmFtZSBUaGVuTWF0cml4VHlwZSwgdHlwZW5hbWUgRWxzZU1hdHJpeFR5cGU+IGNsYXNzIFNlbGVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEJpbmFyeU9wLCBpbnQgRGlyZWN0aW9uPiBjbGFzcyBQYXJ0aWFsUmVkdXhFeHByOwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIGludCBEaXJlY3Rpb24+IGNsYXNzIFZlY3Rvcndpc2VPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IFJvd0ZhY3RvcixpbnQgQ29sRmFjdG9yPiBjbGFzcyBSZXBsaWNhdGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgRGlyZWN0aW9uID0gQm90aERpcmVjdGlvbnM+IGNsYXNzIFJldmVyc2U7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIEZ1bGxQaXZMVTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFBhcnRpYWxQaXZMVTsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgaW52ZXJzZV9pbXBsOworfQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgSG91c2Vob2xkZXJRUjsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIENvbFBpdkhvdXNlaG9sZGVyUVI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBGdWxsUGl2SG91c2Vob2xkZXJRUjsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb247Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lciA9IENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4gY2xhc3MgSmFjb2JpU1ZEOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgQkRDU1ZEOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8gPSBMb3dlcj4gY2xhc3MgTExUOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8gPSBMb3dlcj4gY2xhc3MgTERMVDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT1PblRoZUxlZnQ+IGNsYXNzIEhvdXNlaG9sZGVyU2VxdWVuY2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+ICAgICBjbGFzcyBKYWNvYmlSb3RhdGlvbjsKKworLy8gR2VvbWV0cnkgbW9kdWxlOgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IF9EaW0+IGNsYXNzIFJvdGF0aW9uQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBjbGFzcyBDcm9zczsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFF1YXRlcm5pb25CYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBSb3RhdGlvbjJEOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBBbmdsZUF4aXM7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgVHJhbnNsYXRpb247Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgQWxpZ25lZEJveDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdGlvbnMgPSBBdXRvQWxpZ24+IGNsYXNzIFF1YXRlcm5pb247Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbSxpbnQgTW9kZSxpbnQgX09wdGlvbnM9QXV0b0FsaWduPiBjbGFzcyBUcmFuc2Zvcm07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltLCBpbnQgT3B0aW9ucz1BdXRvQWxpZ24+IGNsYXNzIFBhcmFtZXRyaXplZExpbmU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltLCBpbnQgT3B0aW9ucz1BdXRvQWxpZ24+IGNsYXNzIEh5cGVycGxhbmU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGNsYXNzIFVuaWZvcm1TY2FsaW5nOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgRGlyZWN0aW9uPiBjbGFzcyBIb21vZ2VuZW91czsKKworLy8gU3BhcnNlIG1vZHVsZToKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZU1hdHJpeEJhc2U7CisKKy8vIE1hdHJpeEZ1bmN0aW9ucyBtb2R1bGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4UG93ZXJSZXR1cm5WYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeENvbXBsZXhQb3dlclJldHVyblZhbHVlOworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzdGVtX2Z1bmN0aW9uCit7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsPiBDb21wbGV4U2NhbGFyOworICB0eXBlZGVmIENvbXBsZXhTY2FsYXIgdHlwZShDb21wbGV4U2NhbGFyLCBpbnQpOworfTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9GT1JXQVJEREVDTEFSQVRJT05TX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmI1OTY2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NS0xfc3VwcG9ydC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgIEluY2x1ZGUgZmlsZSB3aXRoIGNvbW1vbiBNS0wgZGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fTUtMX1NVUFBPUlRfSAorI2RlZmluZSBFSUdFTl9NS0xfU1VQUE9SVF9ICisKKyNpZmRlZiBFSUdFTl9VU0VfTUtMX0FMTAorICAjaWZuZGVmIEVJR0VOX1VTRV9CTEFTCisgICAgI2RlZmluZSBFSUdFTl9VU0VfQkxBUworICAjZW5kaWYKKyAgI2lmbmRlZiBFSUdFTl9VU0VfTEFQQUNLRQorICAgICNkZWZpbmUgRUlHRU5fVVNFX0xBUEFDS0UKKyAgI2VuZGlmCisgICNpZm5kZWYgRUlHRU5fVVNFX01LTF9WTUwKKyAgICAjZGVmaW5lIEVJR0VOX1VTRV9NS0xfVk1MCisgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9VU0VfTEFQQUNLRV9TVFJJQ1QKKyAgI2RlZmluZSBFSUdFTl9VU0VfTEFQQUNLRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9NS0xfVk1MKQorICAjZGVmaW5lIEVJR0VOX1VTRV9NS0wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBFSUdFTl9VU0VfTUtMCisjICAgaW5jbHVkZSA8bWtsLmg+IAorLypDaGVjayBJTUtMIHZlcnNpb24gZm9yIGNvbXBhdGliaWxpdHk6IDwgMTAuMyBpcyBub3QgdXNhYmxlIHdpdGggRWlnZW4qLworIyAgIGlmbmRlZiBJTlRFTF9NS0xfVkVSU0lPTgorIyAgICAgICB1bmRlZiBFSUdFTl9VU0VfTUtMIC8qIElOVEVMX01LTF9WRVJTSU9OIGlzIG5vdCBldmVuIGRlZmluZWQgb24gb2xkZXIgdmVyc2lvbnMgKi8KKyMgICBlbGlmIElOVEVMX01LTF9WRVJTSU9OIDwgMTAwMzA1ICAgIC8qIHRoZSBpbnRlbC1ta2wtMTAzLXJlbGVhc2Utbm90ZXMgc2F5IHRoaXMgd2FzIHdoZW4gdGhlIGxhcGFja2UuaCBpbnRlcmZhY2Ugd2FzIGFkZGVkKi8KKyMgICAgICAgdW5kZWYgRUlHRU5fVVNFX01LTAorIyAgIGVuZGlmCisjICAgaWZuZGVmIEVJR0VOX1VTRV9NS0wKKyAgICAvKklmIHRoZSBNS0wgdmVyc2lvbiBpcyB0b28gb2xkLCB1bmRlZiBldmVyeXRoaW5nKi8KKyMgICAgICAgdW5kZWYgICBFSUdFTl9VU0VfTUtMX0FMTAorIyAgICAgICB1bmRlZiAgIEVJR0VOX1VTRV9MQVBBQ0tFCisjICAgICAgIHVuZGVmICAgRUlHRU5fVVNFX01LTF9WTUwKKyMgICAgICAgdW5kZWYgICBFSUdFTl9VU0VfTEFQQUNLRV9TVFJJQ1QKKyMgICAgICAgdW5kZWYgICBFSUdFTl9VU0VfTEFQQUNLRQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgRUlHRU5fVVNFX01LTAorCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfVEhSRVNIT0xEIDEyOAorCisvKiBNS0xfRE9NQUlOX0JMQVMsIGV0YyBhcmUgZGVmaW5lZCBvbmx5IGluIDEwLjMgdXBkYXRlIDcgKi8KKy8qIE1LTF9CTEFTLCBldGMgYXJlIG5vdCBkZWZpbmVkIGluIDExLjIgKi8KKyNpZmRlZiBNS0xfRE9NQUlOX0FMTAorI2RlZmluZSBFSUdFTl9NS0xfRE9NQUlOX0FMTCBNS0xfRE9NQUlOX0FMTAorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fTUtMX0RPTUFJTl9BTEwgTUtMX0FMTAorI2VuZGlmCisKKyNpZmRlZiBNS0xfRE9NQUlOX0JMQVMKKyNkZWZpbmUgRUlHRU5fTUtMX0RPTUFJTl9CTEFTIE1LTF9ET01BSU5fQkxBUworI2Vsc2UKKyNkZWZpbmUgRUlHRU5fTUtMX0RPTUFJTl9CTEFTIE1LTF9CTEFTCisjZW5kaWYKKworI2lmZGVmIE1LTF9ET01BSU5fRkZUCisjZGVmaW5lIEVJR0VOX01LTF9ET01BSU5fRkZUIE1LTF9ET01BSU5fRkZUCisjZWxzZQorI2RlZmluZSBFSUdFTl9NS0xfRE9NQUlOX0ZGVCBNS0xfRkZUCisjZW5kaWYKKworI2lmZGVmIE1LTF9ET01BSU5fVk1MCisjZGVmaW5lIEVJR0VOX01LTF9ET01BSU5fVk1MIE1LTF9ET01BSU5fVk1MCisjZWxzZQorI2RlZmluZSBFSUdFTl9NS0xfRE9NQUlOX1ZNTCBNS0xfVk1MCisjZW5kaWYKKworI2lmZGVmIE1LTF9ET01BSU5fUEFSRElTTworI2RlZmluZSBFSUdFTl9NS0xfRE9NQUlOX1BBUkRJU08gTUtMX0RPTUFJTl9QQVJESVNPCisjZWxzZQorI2RlZmluZSBFSUdFTl9NS0xfRE9NQUlOX1BBUkRJU08gTUtMX1BBUkRJU08KKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK3R5cGVkZWYgc3RkOjpjb21wbGV4PGRvdWJsZT4gZGNvbXBsZXg7Cit0eXBlZGVmIHN0ZDo6Y29tcGxleDxmbG9hdD4gIHNjb21wbGV4OworCisjaWYgZGVmaW5lZChFSUdFTl9VU0VfTUtMKQordHlwZWRlZiBNS0xfSU5UIEJsYXNJbmRleDsKKyNlbHNlCit0eXBlZGVmIGludCBCbGFzSW5kZXg7CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9CTEFTKQorI2luY2x1ZGUgIi4uLy4uL21pc2MvYmxhcy5oIgorI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9NS0xfU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL01hY3Jvcy5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ2ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NYWNyb3MuaApAQCAtMCwwICsxLDk5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQUNST1NfSAorI2RlZmluZSBFSUdFTl9NQUNST1NfSAorCisjZGVmaW5lIEVJR0VOX1dPUkxEX1ZFUlNJT04gMworI2RlZmluZSBFSUdFTl9NQUpPUl9WRVJTSU9OIDMKKyNkZWZpbmUgRUlHRU5fTUlOT1JfVkVSU0lPTiA0CisKKyNkZWZpbmUgRUlHRU5fVkVSU0lPTl9BVF9MRUFTVCh4LHkseikgKEVJR0VOX1dPUkxEX1ZFUlNJT04+eCB8fCAoRUlHRU5fV09STERfVkVSU0lPTj49eCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFSUdFTl9NQUpPUl9WRVJTSU9OPnkgfHwgKEVJR0VOX01BSk9SX1ZFUlNJT04+PXkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9NSU5PUl9WRVJTSU9OPj16KSkpKQorCisvLyBDb21waWxlciBpZGVudGlmaWNhdGlvbiwgRUlHRU5fQ09NUF8qCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fQ09NUF9HTlVDIHNldCB0byAxIGZvciBhbGwgY29tcGlsZXJzIGNvbXBhdGlibGUgd2l0aCBHQ0MKKyNpZmRlZiBfX0dOVUNfXworICAjZGVmaW5lIEVJR0VOX0NPTVBfR05VQyAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0NPTVBfR05VQyAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9DT01QX0NMQU5HIHNldCB0byBtYWpvcittaW5vciB2ZXJzaW9uIChlLmcuLCAzMDcgZm9yIGNsYW5nIDMuNykgaWYgdGhlIGNvbXBpbGVyIGlzIGNsYW5nCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9DTEFORyAoX19jbGFuZ19tYWpvcl9fKjEwMCtfX2NsYW5nX21pbm9yX18pCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0NPTVBfQ0xBTkcgMAorI2VuZGlmCisKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9DT01QX0xMVk0gc2V0IHRvIDEgaWYgdGhlIGNvbXBpbGVyIGJhY2tlbmQgaXMgbGx2bQorI2lmIGRlZmluZWQoX19sbHZtX18pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9MTFZNIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQ09NUF9MTFZNIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0NPTVBfSUNDIHNldCB0byBfX0lOVEVMX0NPTVBJTEVSIGlmIHRoZSBjb21waWxlciBpcyBJbnRlbCBjb21waWxlciwgMCBvdGhlcndpc2UKKyNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisgICNkZWZpbmUgRUlHRU5fQ09NUF9JQ0MgX19JTlRFTF9DT01QSUxFUgorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9DT01QX0lDQyAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9DT01QX01JTkdXIHNldCB0byAxIGlmIHRoZSBjb21waWxlciBpcyBtaW5ndworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9NSU5HVyAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0NPTVBfTUlOR1cgMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fQ09NUF9TVU5DQyBzZXQgdG8gMSBpZiB0aGUgY29tcGlsZXIgaXMgU29sYXJpcyBTdHVkaW8KKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQorICAjZGVmaW5lIEVJR0VOX0NPTVBfU1VOQ0MgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9DT01QX1NVTkNDIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0NPTVBfTVNWQyBzZXQgdG8gX01TQ19WRVIgaWYgdGhlIGNvbXBpbGVyIGlzIE1pY3Jvc29mdCBWaXN1YWwgQysrLCAwIG90aGVyd2lzZS4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAjZGVmaW5lIEVJR0VOX0NPTVBfTVNWQyBfTVNDX1ZFUgorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9DT01QX01TVkMgMAorI2VuZGlmCisKKy8vIEZvciB0aGUgcmVjb3JkLCBoZXJlIGlzIGEgdGFibGUgc3VtbWFyaXppbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgRUlHRU5fQ09NUF9NU1ZDOgorLy8gIG5hbWUgIHZlciAgIE1TQ19WRVIKKy8vICAyMDA4ICAgIDkgICAgICAxNTAwCisvLyAgMjAxMCAgIDEwICAgICAgMTYwMAorLy8gIDIwMTIgICAxMSAgICAgIDE3MDAKKy8vICAyMDEzICAgMTIgICAgICAxODAwCisvLyAgMjAxNSAgIDE0ICAgICAgMTkwMAorLy8gICIxNSIgICAxNSAgICAgIDE5MDAKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9DT01QX01TVkNfU1RSSUNUIHNldCB0byAxIGlmIHRoZSBjb21waWxlciBpcyByZWFsbHkgTWljcm9zb2Z0IFZpc3VhbCBDKysgYW5kIG5vdCAsZS5nLiwgSUNDIG9yIGNsYW5nLWNsCisjaWYgRUlHRU5fQ09NUF9NU1ZDICYmICEoRUlHRU5fQ09NUF9JQ0MgfHwgRUlHRU5fQ09NUF9MTFZNIHx8IEVJR0VOX0NPTVBfQ0xBTkcpCisgICNkZWZpbmUgRUlHRU5fQ09NUF9NU1ZDX1NUUklDVCBfTVNDX1ZFUgorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9DT01QX01TVkNfU1RSSUNUIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0NPTVBfSUJNIHNldCB0byAxIGlmIHRoZSBjb21waWxlciBpcyBJQk0gWEwgQysrCisjaWYgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9feGxjX18pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9JQk0gMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9DT01QX0lCTSAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9DT01QX1BHSSBzZXQgdG8gMSBpZiB0aGUgY29tcGlsZXIgaXMgUG9ydGxhbmQgR3JvdXAgQ29tcGlsZXIKKyNpZiBkZWZpbmVkKF9fUEdJKQorICAjZGVmaW5lIEVJR0VOX0NPTVBfUEdJIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQ09NUF9QR0kgMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fQ09NUF9BUk0gc2V0IHRvIDEgaWYgdGhlIGNvbXBpbGVyIGlzIEFSTSBDb21waWxlcgorI2lmIGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKQorICAjZGVmaW5lIEVJR0VOX0NPTVBfQVJNIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQ09NUF9BUk0gMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fQ09NUF9BUk0gc2V0IHRvIDEgaWYgdGhlIGNvbXBpbGVyIGlzIEFSTSBDb21waWxlcgorI2lmIGRlZmluZWQoX19FTVNDUklQVEVOX18pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9FTVNDUklQVEVOIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQ09NUF9FTVNDUklQVEVOIDAKKyNlbmRpZgorCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fR05VQ19TVFJJQ1Qgc2V0IHRvIDEgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MgYW5kIG5vdCBhIGNvbXBhdGlibGUgY29tcGlsZXIgKGUuZy4sIElDQywgY2xhbmcsIG1pbmd3LCBldGMuKQorI2lmIEVJR0VOX0NPTVBfR05VQyAmJiAhKEVJR0VOX0NPTVBfQ0xBTkcgfHwgRUlHRU5fQ09NUF9JQ0MgfHwgRUlHRU5fQ09NUF9NSU5HVyB8fCBFSUdFTl9DT01QX1BHSSB8fCBFSUdFTl9DT01QX0lCTSB8fCBFSUdFTl9DT01QX0FSTSB8fCBFSUdFTl9DT01QX0VNU0NSSVBURU4pCisgICNkZWZpbmUgRUlHRU5fQ09NUF9HTlVDX1NUUklDVCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgMAorI2VuZGlmCisKKworI2lmIEVJR0VOX0NPTVBfR05VQworICAjZGVmaW5lIEVJR0VOX0dOVUNfQVRfTEVBU1QoeCx5KSAoKF9fR05VQ19fPT14ICYmIF9fR05VQ19NSU5PUl9fPj15KSB8fCBfX0dOVUNfXz54KQorICAjZGVmaW5lIEVJR0VOX0dOVUNfQVRfTU9TVCh4LHkpICAoKF9fR05VQ19fPT14ICYmIF9fR05VQ19NSU5PUl9fPD15KSB8fCBfX0dOVUNfXzx4KQorICAjZGVmaW5lIEVJR0VOX0dOVUNfQVQoeCx5KSAgICAgICAoIF9fR05VQ19fPT14ICYmIF9fR05VQ19NSU5PUl9fPT15ICkKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fR05VQ19BVF9MRUFTVCh4LHkpIDAKKyAgI2RlZmluZSBFSUdFTl9HTlVDX0FUX01PU1QoeCx5KSAgMAorICAjZGVmaW5lIEVJR0VOX0dOVUNfQVQoeCx5KSAgICAgICAwCisjZW5kaWYKKworLy8gRklYTUU6IGNvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXMgd2UgZG8gbm90IHN1cHBvcnQgZ2NjIDMueCBhbnltb3JlCisjaWYgRUlHRU5fQ09NUF9HTlVDICYmIChfX0dOVUNfXyA8PSAzKQorI2RlZmluZSBFSUdFTl9HQ0MzX09SX09MREVSIDEKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0dDQzNfT1JfT0xERVIgMAorI2VuZGlmCisKKworLy8gQXJjaGl0ZWN0dXJlIGlkZW50aWZpY2F0aW9uLCBFSUdFTl9BUkNIXyoKKworI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX19hbWQ2NCkKKyAgI2RlZmluZSBFSUdFTl9BUkNIX3g4Nl82NCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0FSQ0hfeDg2XzY0IDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9YODZfKSB8fCBkZWZpbmVkKF9faTM4NikKKyAgI2RlZmluZSBFSUdFTl9BUkNIX2kzODYgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BUkNIX2kzODYgMAorI2VuZGlmCisKKyNpZiBFSUdFTl9BUkNIX3g4Nl82NCB8fCBFSUdFTl9BUkNIX2kzODYKKyAgI2RlZmluZSBFSUdFTl9BUkNIX2kzODZfT1JfeDg2XzY0IDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQVJDSF9pMzg2X09SX3g4Nl82NCAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9BUkNIX0FSTSBzZXQgdG8gMSBpZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIEFSTQorI2lmIGRlZmluZWQoX19hcm1fXykKKyAgI2RlZmluZSBFSUdFTl9BUkNIX0FSTSAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0FSQ0hfQVJNIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0FSQ0hfQVJNNjQgc2V0IHRvIDEgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBBUk02NAorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICNkZWZpbmUgRUlHRU5fQVJDSF9BUk02NCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0FSQ0hfQVJNNjQgMAorI2VuZGlmCisKKyNpZiBFSUdFTl9BUkNIX0FSTSB8fCBFSUdFTl9BUkNIX0FSTTY0CisgICNkZWZpbmUgRUlHRU5fQVJDSF9BUk1fT1JfQVJNNjQgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BUkNIX0FSTV9PUl9BUk02NCAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9BUkNIX01JUFMgc2V0IHRvIDEgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBNSVBTCisjaWYgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX21pcHMpCisgICNkZWZpbmUgRUlHRU5fQVJDSF9NSVBTIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQVJDSF9NSVBTIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0FSQ0hfU1BBUkMgc2V0IHRvIDEgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBTUEFSQworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fc3BhcmMpCisgICNkZWZpbmUgRUlHRU5fQVJDSF9TUEFSQyAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0FSQ0hfU1BBUkMgMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fQVJDSF9JQTY0IHNldCB0byAxIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgSW50ZWwgSXRhbml1bQorI2lmIGRlZmluZWQoX19pYTY0X18pCisgICNkZWZpbmUgRUlHRU5fQVJDSF9JQTY0IDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQVJDSF9JQTY0IDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX0FSQ0hfUFBDIHNldCB0byAxIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgUG93ZXJQQworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfTV9QUEMpCisgICNkZWZpbmUgRUlHRU5fQVJDSF9QUEMgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BUkNIX1BQQyAwCisjZW5kaWYKKworCisKKy8vIE9wZXJhdGluZyBzeXN0ZW0gaWRlbnRpZmljYXRpb24sIEVJR0VOX09TXyoKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19VTklYIHNldCB0byAxIGlmIHRoZSBPUyBpcyBhIHVuaXggdmFyaWFudAorI2lmIGRlZmluZWQoX191bml4X18pIHx8IGRlZmluZWQoX191bml4KQorICAjZGVmaW5lIEVJR0VOX09TX1VOSVggMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19VTklYIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX09TX0xJTlVYIHNldCB0byAxIGlmIHRoZSBPUyBpcyBiYXNlZCBvbiBMaW51eCBrZXJuZWwKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgI2RlZmluZSBFSUdFTl9PU19MSU5VWCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX09TX0xJTlVYIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX09TX0FORFJPSUQgc2V0IHRvIDEgaWYgdGhlIE9TIGlzIEFuZHJvaWQKKy8vIG5vdGU6IEFORFJPSUQgaXMgZGVmaW5lZCB3aGVuIHVzaW5nIG5ka19idWlsZCwgX19BTkRST0lEX18gaXMgZGVmaW5lZCB3aGVuIHVzaW5nIGEgc3RhbmRhbG9uZSB0b29sY2hhaW4uCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChBTkRST0lEKQorICAjZGVmaW5lIEVJR0VOX09TX0FORFJPSUQgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19BTkRST0lEIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX09TX0dOVUxJTlVYIHNldCB0byAxIGlmIHRoZSBPUyBpcyBHTlUgTGludXggYW5kIG5vdCBMaW51eC1iYXNlZCBPUyAoZS5nLiwgbm90IGFuZHJvaWQpCisjaWYgZGVmaW5lZChfX2dudV9saW51eF9fKSAmJiAhKEVJR0VOX09TX0FORFJPSUQpCisgICNkZWZpbmUgRUlHRU5fT1NfR05VTElOVVggMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19HTlVMSU5VWCAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19CU0Qgc2V0IHRvIDEgaWYgdGhlIE9TIGlzIGEgQlNEIHZhcmlhbnQKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19ic2RpX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyAgI2RlZmluZSBFSUdFTl9PU19CU0QgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19CU0QgMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fT1NfTUFDIHNldCB0byAxIGlmIHRoZSBPUyBpcyBNYWNPUworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAjZGVmaW5lIEVJR0VOX09TX01BQyAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX09TX01BQyAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19RTlggc2V0IHRvIDEgaWYgdGhlIE9TIGlzIFFOWAorI2lmIGRlZmluZWQoX19RTlhfXykKKyAgI2RlZmluZSBFSUdFTl9PU19RTlggMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19RTlggMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fT1NfV0lOIHNldCB0byAxIGlmIHRoZSBPUyBpcyBXaW5kb3dzIGJhc2VkCisjaWYgZGVmaW5lZChfV0lOMzIpCisgICNkZWZpbmUgRUlHRU5fT1NfV0lOIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fT1NfV0lOIDAKKyNlbmRpZgorCisvLy8gXGludGVybmFsIEVJR0VOX09TX1dJTjY0IHNldCB0byAxIGlmIHRoZSBPUyBpcyBXaW5kb3dzIDY0Yml0cworI2lmIGRlZmluZWQoX1dJTjY0KQorICAjZGVmaW5lIEVJR0VOX09TX1dJTjY0IDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fT1NfV0lONjQgMAorI2VuZGlmCisKKy8vLyBcaW50ZXJuYWwgRUlHRU5fT1NfV0lOQ0Ugc2V0IHRvIDEgaWYgdGhlIE9TIGlzIFdpbmRvd3MgQ0UKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICNkZWZpbmUgRUlHRU5fT1NfV0lOQ0UgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9PU19XSU5DRSAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19DWUdXSU4gc2V0IHRvIDEgaWYgdGhlIE9TIGlzIFdpbmRvd3MvQ3lnd2luCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorICAjZGVmaW5lIEVJR0VOX09TX0NZR1dJTiAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX09TX0NZR1dJTiAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19XSU5fU1RSSUNUIHNldCB0byAxIGlmIHRoZSBPUyBpcyByZWFsbHkgV2luZG93cyBhbmQgbm90IHNvbWUgdmFyaWFudHMKKyNpZiBFSUdFTl9PU19XSU4gJiYgISggRUlHRU5fT1NfV0lOQ0UgfHwgRUlHRU5fT1NfQ1lHV0lOICkKKyAgI2RlZmluZSBFSUdFTl9PU19XSU5fU1RSSUNUIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fT1NfV0lOX1NUUklDVCAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19TVU4gc2V0IHRvIDEgaWYgdGhlIE9TIGlzIFNVTgorI2lmIChkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChfX3N1bikpICYmICEoZGVmaW5lZChfX1NWUjQpIHx8IGRlZmluZWQoX19zdnI0X18pKQorICAjZGVmaW5lIEVJR0VOX09TX1NVTiAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX09TX1NVTiAwCisjZW5kaWYKKworLy8vIFxpbnRlcm5hbCBFSUdFTl9PU19TT0xBUklTIHNldCB0byAxIGlmIHRoZSBPUyBpcyBTb2xhcmlzCisjaWYgKGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fc3VuKSkgJiYgKGRlZmluZWQoX19TVlI0KSB8fCBkZWZpbmVkKF9fc3ZyNF9fKSkKKyAgI2RlZmluZSBFSUdFTl9PU19TT0xBUklTIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fT1NfU09MQVJJUyAwCisjZW5kaWYKKworCisKKyNpZiBFSUdFTl9HTlVDX0FUX01PU1QoNCwzKSAmJiAhRUlHRU5fQ09NUF9DTEFORworICAvLyBzZWUgYnVnIDg5CisgICNkZWZpbmUgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPIDAKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPIDEKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZnJvbSBtYWNybyBleHBhbnNpb24sIGUuZy46CisvLyAgIHN0ZDo6bWF4IEVJR0VOX05PVF9BX01BQ1JPKGEsYikKKyNkZWZpbmUgRUlHRU5fTk9UX0FfTUFDUk8KKworI2lmZGVmIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OIEVpZ2VuOjpSb3dNYWpvcgorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04gRWlnZW46OkNvbE1ham9yCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIHN0ZDo6cHRyZGlmZl90CisjZW5kaWYKKworLy8gQ3Jvc3MgY29tcGlsZXIgd3JhcHBlciBhcm91bmQgTExWTSdzIF9faGFzX2J1aWx0aW4KKyNpZmRlZiBfX2hhc19idWlsdGluCisjICBkZWZpbmUgRUlHRU5fSEFTX0JVSUxUSU4oeCkgX19oYXNfYnVpbHRpbih4KQorI2Vsc2UKKyMgIGRlZmluZSBFSUdFTl9IQVNfQlVJTFRJTih4KSAwCisjZW5kaWYKKworLy8gQSBDbGFuZyBmZWF0dXJlIGV4dGVuc2lvbiB0byBkZXRlcm1pbmUgY29tcGlsZXIgZmVhdHVyZXMuCisvLyBXZSB1c2UgaXQgdG8gZGV0ZXJtaW5lICdjeHhfcnZhbHVlX3JlZmVyZW5jZXMnCisjaWZuZGVmIF9faGFzX2ZlYXR1cmUKKyMgZGVmaW5lIF9faGFzX2ZlYXR1cmUoeCkgMAorI2VuZGlmCisKKy8vIFVwcGVyYm91bmQgb24gdGhlIEMrKyB2ZXJzaW9uIHRvIHVzZS4KKy8vIEV4cGVjdGVkIHZhbHVlcyBhcmUgMDMsIDExLCAxNCwgMTcsIGV0Yy4KKy8vIEJ5IGRlZmF1bHQsIGxldCdzIHVzZSBhbiBhcmJpdHJhcmlseSBsYXJnZSBDKysgdmVyc2lvbi4KKyNpZm5kZWYgRUlHRU5fTUFYX0NQUF9WRVIKKyNkZWZpbmUgRUlHRU5fTUFYX0NQUF9WRVIgOTkKKyNlbmRpZgorCisjaWYgRUlHRU5fTUFYX0NQUF9WRVI+PTExICYmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgfHwgRUlHRU5fQ09NUF9NU1ZDID49IDE5MDApCisjZGVmaW5lIEVJR0VOX0hBU19DWFgxMSAxCisjZWxzZQorI2RlZmluZSBFSUdFTl9IQVNfQ1hYMTEgMAorI2VuZGlmCisKKworLy8gRG8gd2Ugc3VwcG9ydCByLXZhbHVlIHJlZmVyZW5jZXM/CisjaWZuZGVmIEVJR0VOX0hBU19SVkFMVUVfUkVGRVJFTkNFUworI2lmIEVJR0VOX01BWF9DUFBfVkVSPj0xMSAmJiBcCisgICAgKF9faGFzX2ZlYXR1cmUoY3h4X3J2YWx1ZV9yZWZlcmVuY2VzKSB8fCBcCisgICAgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIHx8IFwKKyAgICAoRUlHRU5fQ09NUF9NU1ZDID49IDE2MDApKQorICAjZGVmaW5lIEVJR0VOX0hBU19SVkFMVUVfUkVGRVJFTkNFUyAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0hBU19SVkFMVUVfUkVGRVJFTkNFUyAwCisjZW5kaWYKKyNlbmRpZgorCisvLyBEb2VzIHRoZSBjb21waWxlciBzdXBwb3J0IEM5OT8KKyNpZm5kZWYgRUlHRU5fSEFTX0M5OV9NQVRICisjaWYgRUlHRU5fTUFYX0NQUF9WRVI+PTExICYmIFwKKyAgICAoKGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxKSkgICAgICAgXAorICB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5KSkgXAorICB8fCAoZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pICYmICFkZWZpbmVkKF9NU0NfVkVSKSkpCisgICNkZWZpbmUgRUlHRU5fSEFTX0M5OV9NQVRIIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fSEFTX0M5OV9NQVRIIDAKKyNlbmRpZgorI2VuZGlmCisKKy8vIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgcmVzdWx0X29mPworI2lmbmRlZiBFSUdFTl9IQVNfU1REX1JFU1VMVF9PRgorI2lmIEVJR0VOX01BWF9DUFBfVkVSPj0xMSAmJiAoKF9faGFzX2ZlYXR1cmUoY3h4X2xhbWJkYXMpIHx8IChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSkpCisjZGVmaW5lIEVJR0VOX0hBU19TVERfUkVTVUxUX09GIDEKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0hBU19TVERfUkVTVUxUX09GIDAKKyNlbmRpZgorI2VuZGlmCisKKy8vIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgdmFyaWFkaWMgdGVtcGxhdGVzPworI2lmbmRlZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisjaWYgRUlHRU5fTUFYX0NQUF9WRVI+PTExICYmIChfX2NwbHVzcGx1cyA+IDE5OTcxMUwgfHwgRUlHRU5fQ09NUF9NU1ZDID49IDE5MDApIFwKKyAgJiYgKCAhZGVmaW5lZChfX05WQ0NfXykgfHwgIUVJR0VOX0FSQ0hfQVJNX09SX0FSTTY0IHx8IChkZWZpbmVkIF9fQ1VEQUNDX1ZFUl9fICYmIF9fQ1VEQUNDX1ZFUl9fID49IDgwMDAwKSApCisgICAgLy8gXl4gRGlzYWJsZSB0aGUgdXNlIG9mIHZhcmlhZGljIHRlbXBsYXRlcyB3aGVuIGNvbXBpbGluZyB3aXRoIHZlcnNpb25zIG9mIG52Y2Mgb2xkZXIgdGhhbiA4LjAgb24gQVJNIGRldmljZXM6CisgICAgLy8gICAgdGhpcyBwcmV2ZW50cyBudmNjIGZyb20gY3Jhc2hpbmcgd2hlbiBjb21waWxpbmcgRWlnZW4gb24gVGVncmEgWDEKKyNkZWZpbmUgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUyAxCisjZWxzZQorI2RlZmluZSBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTIDAKKyNlbmRpZgorI2VuZGlmCisKKy8vIERvZXMgdGhlIGNvbXBpbGVyIGZ1bGx5IHN1cHBvcnQgY29uc3QgZXhwcmVzc2lvbnM/IChhcyBpbiBjKysxNCkKKyNpZm5kZWYgRUlHRU5fSEFTX0NPTlNURVhQUgorCisjaWZkZWYgX19DVURBQ0NfXworLy8gQ29uc3QgZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZCBwcm92aWRlZCB0aGF0IGMrKzExIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIHVzaW5nIGVpdGhlciBjbGFuZyBvciBudmNjIDcuNSBvciBhYm92ZQorI2lmIEVJR0VOX01BWF9DUFBfVkVSPj0xNCAmJiAoX19jcGx1c3BsdXMgPiAxOTk3MTFMICYmIGRlZmluZWQoX19DVURBQ0NfVkVSX18pICYmIChFSUdFTl9DT01QX0NMQU5HIHx8IF9fQ1VEQUNDX1ZFUl9fID49IDcwNTAwKSkKKyAgI2RlZmluZSBFSUdFTl9IQVNfQ09OU1RFWFBSIDEKKyNlbmRpZgorI2VsaWYgRUlHRU5fTUFYX0NQUF9WRVI+PTE0ICYmIChfX2hhc19mZWF0dXJlKGN4eF9yZWxheGVkX2NvbnN0ZXhwcikgfHwgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTQwMkwpIHx8IFwKKyAgKEVJR0VOX0dOVUNfQVRfTEVBU1QoNCw4KSAmJiAoX19jcGx1c3BsdXMgPiAxOTk3MTFMKSkpCisjZGVmaW5lIEVJR0VOX0hBU19DT05TVEVYUFIgMQorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fSEFTX0NPTlNURVhQUgorI2RlZmluZSBFSUdFTl9IQVNfQ09OU1RFWFBSIDAKKyNlbmRpZgorCisjZW5kaWYKKworLy8gRG9lcyB0aGUgY29tcGlsZXIgc3VwcG9ydCBDKysxMSBtYXRoPworLy8gTGV0J3MgYmUgY29uc2VydmF0aXZlIGFuZCBlbmFibGUgdGhlIGRlZmF1bHQgQysrMTEgaW1wbGVtZW50YXRpb24gb25seSBpZiB3ZSBhcmUgc3VyZSBpdCBleGlzdHMKKyNpZm5kZWYgRUlHRU5fSEFTX0NYWDExX01BVEgKKyAgI2lmIEVJR0VOX01BWF9DUFBfVkVSPj0xMSAmJiAoKF9fY3BsdXNwbHVzID4gMjAxMTAzTCkgfHwgKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpICYmIChFSUdFTl9DT01QX0dOVUNfU1RSSUNUIHx8IEVJR0VOX0NPTVBfQ0xBTkcgfHwgRUlHRU5fQ09NUF9NU1ZDIHx8IEVJR0VOX0NPTVBfSUNDKSAgXAorICAgICAgJiYgKEVJR0VOX0FSQ0hfaTM4Nl9PUl94ODZfNjQpICYmIChFSUdFTl9PU19HTlVMSU5VWCB8fCBFSUdFTl9PU19XSU5fU1RSSUNUIHx8IEVJR0VOX09TX01BQykpCisgICAgI2RlZmluZSBFSUdFTl9IQVNfQ1hYMTFfTUFUSCAxCisgICNlbHNlCisgICAgI2RlZmluZSBFSUdFTl9IQVNfQ1hYMTFfTUFUSCAwCisgICNlbmRpZgorI2VuZGlmCisKKy8vIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgcHJvcGVyIEMrKzExIGNvbnRhaW5lcnM/CisjaWZuZGVmIEVJR0VOX0hBU19DWFgxMV9DT05UQUlORVJTCisgICNpZiAgICBFSUdFTl9NQVhfQ1BQX1ZFUj49MTEgJiYgXAorICAgICAgICAgKChfX2NwbHVzcGx1cyA+IDIwMTEwM0wpIFwKKyAgICAgIHx8ICgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgKEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgfHwgRUlHRU5fQ09NUF9DTEFORyB8fCBFSUdFTl9DT01QX0lDQz49MTQwMCkpIFwKKyAgICAgIHx8IEVJR0VOX0NPTVBfTVNWQyA+PSAxOTAwKQorICAgICNkZWZpbmUgRUlHRU5fSEFTX0NYWDExX0NPTlRBSU5FUlMgMQorICAjZWxzZQorICAgICNkZWZpbmUgRUlHRU5fSEFTX0NYWDExX0NPTlRBSU5FUlMgMAorICAjZW5kaWYKKyNlbmRpZgorCisvLyBEb2VzIHRoZSBjb21waWxlciBzdXBwb3J0IEMrKzExIG5vZXhjZXB0PworI2lmbmRlZiBFSUdFTl9IQVNfQ1hYMTFfTk9FWENFUFQKKyAgI2lmICAgIEVJR0VOX01BWF9DUFBfVkVSPj0xMSAmJiBcCisgICAgICAgICAoX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpIFwKKyAgICAgIHx8IChfX2NwbHVzcGx1cyA+IDIwMTEwM0wpIFwKKyAgICAgIHx8ICgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgKEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgfHwgRUlHRU5fQ09NUF9DTEFORyB8fCBFSUdFTl9DT01QX0lDQz49MTQwMCkpIFwKKyAgICAgIHx8IEVJR0VOX0NPTVBfTVNWQyA+PSAxOTAwKQorICAgICNkZWZpbmUgRUlHRU5fSEFTX0NYWDExX05PRVhDRVBUIDEKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0hBU19DWFgxMV9OT0VYQ0VQVCAwCisgICNlbmRpZgorI2VuZGlmCisKKy8qKiBBbGxvd3MgdG8gZGlzYWJsZSBzb21lIG9wdGltaXphdGlvbnMgd2hpY2ggbWlnaHQgYWZmZWN0IHRoZSBhY2N1cmFjeSBvZiB0aGUgcmVzdWx0LgorICAqIFN1Y2ggb3B0aW1pemF0aW9uIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBzZXQgRUlHRU5fRkFTVF9NQVRIIHRvIDAgdG8gZGlzYWJsZSB0aGVtLgorICAqIFRoZXkgY3VycmVudGx5IGluY2x1ZGU6CisgICogICAtIHNpbmdsZSBwcmVjaXNpb24gQXJyYXlCYXNlOjpzaW4oKSBhbmQgQXJyYXlCYXNlOjpjb3MoKSBmb3IgU1NFIGFuZCBBVlggdmVjdG9yaXphdGlvbi4KKyAgKi8KKyNpZm5kZWYgRUlHRU5fRkFTVF9NQVRICisjZGVmaW5lIEVJR0VOX0ZBU1RfTUFUSCAxCisjZW5kaWYKKworI2RlZmluZSBFSUdFTl9ERUJVR19WQVIoeCkgc3RkOjpjZXJyIDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgc3RkOjplbmRsOworCisvLyBjb25jYXRlbmF0ZSB0d28gdG9rZW5zCisjZGVmaW5lIEVJR0VOX0NBVDIoYSxiKSBhICMjIGIKKyNkZWZpbmUgRUlHRU5fQ0FUKGEsYikgRUlHRU5fQ0FUMihhLGIpCisKKyNkZWZpbmUgRUlHRU5fQ09NTUEgLAorCisvLyBjb252ZXJ0IGEgdG9rZW4gdG8gYSBzdHJpbmcKKyNkZWZpbmUgRUlHRU5fTUFLRVNUUklORzIoYSkgI2EKKyNkZWZpbmUgRUlHRU5fTUFLRVNUUklORyhhKSBFSUdFTl9NQUtFU1RSSU5HMihhKQorCisvLyBFSUdFTl9TVFJPTkdfSU5MSU5FIGlzIGEgc3Ryb25nZXIgdmVyc2lvbiBvZiB0aGUgaW5saW5lLCB1c2luZyBfX2ZvcmNlaW5saW5lIG9uIE1TVkMsCisvLyBidXQgaXQgc3RpbGwgZG9lc24ndCB1c2UgR0NDJ3MgYWx3YXlzX2lubGluZS4gVGhpcyBpcyB1c2VmdWwgaW4gKGNvbW1vbikgc2l0dWF0aW9ucyB3aGVyZSBNU1ZDIG5lZWRzIGZvcmNlaW5saW5lCisvLyBidXQgR0NDIGlzIHN0aWxsIGRvaW5nIGZpbmUgd2l0aCBqdXN0IGlubGluZS4KKyNpZiBFSUdFTl9DT01QX01TVkMgfHwgRUlHRU5fQ09NUF9JQ0MKKyNkZWZpbmUgRUlHRU5fU1RST05HX0lOTElORSBfX2ZvcmNlaW5saW5lCisjZWxzZQorI2RlZmluZSBFSUdFTl9TVFJPTkdfSU5MSU5FIGlubGluZQorI2VuZGlmCisKKy8vIEVJR0VOX0FMV0FZU19JTkxJTkUgaXMgdGhlIHN0cm9uZ2V0LCBpdCBoYXMgdGhlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGZ1bmN0aW9uIGlubGluZSBhbmQgYWRkaW5nIGV2ZXJ5IHBvc3NpYmxlCisvLyBhdHRyaWJ1dGUgdG8gbWF4aW1pemUgaW5saW5pbmcuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHJlYWxseSBuZWNlc3Nhcnk6IGluIHBhcnRpY3VsYXIsCisvLyBpdCB1c2VzIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKSBvbiBHQ0MsIHdoaWNoIG1vc3Qgb2YgdGhlIHRpbWUgaXMgdXNlbGVzcyBhbmQgY2FuIHNldmVyZWx5IGhhcm0gY29tcGlsZSB0aW1lcy4KKy8vIEZJWE1FIHdpdGggdGhlIGFsd2F5c19pbmxpbmUgYXR0cmlidXRlLAorLy8gZ2NjIDMuNC54IGFuZCA0LjEgcmVwb3J0cyB0aGUgZm9sbG93aW5nIGNvbXBpbGF0aW9uIGVycm9yOgorLy8gICBFdmFsLmg6OTE6IHNvcnJ5LCB1bmltcGxlbWVudGVkOiBpbmxpbmluZyBmYWlsZWQgaW4gY2FsbCB0byAnY29uc3QgRWlnZW46OkV2YWw8RGVyaXZlZD4gRWlnZW46Ok1hdHJpeEJhc2U8U2NhbGFyLCBEZXJpdmVkPjo6ZXZhbCgpIGNvbnN0JworLy8gICAgOiBmdW5jdGlvbiBib2R5IG5vdCBhdmFpbGFibGUKKy8vICAgU2VlIGFsc28gYnVnIDEzNjcKKyNpZiBFSUdFTl9HTlVDX0FUX0xFQVNUKDQsMikKKyNkZWZpbmUgRUlHRU5fQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgaW5saW5lCisjZWxzZQorI2RlZmluZSBFSUdFTl9BTFdBWVNfSU5MSU5FIEVJR0VOX1NUUk9OR19JTkxJTkUKKyNlbmRpZgorCisjaWYgRUlHRU5fQ09NUF9HTlVDCisjZGVmaW5lIEVJR0VOX0RPTlRfSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbGlmIEVJR0VOX0NPTVBfTVNWQworI2RlZmluZSBFSUdFTl9ET05UX0lOTElORSBfX2RlY2xzcGVjKG5vaW5saW5lKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fRE9OVF9JTkxJTkUKKyNlbmRpZgorCisjaWYgRUlHRU5fQ09NUF9HTlVDCisjZGVmaW5lIEVJR0VOX1BFUk1JU1NJVkVfRVhQUiBfX2V4dGVuc2lvbl9fCisjZWxzZQorI2RlZmluZSBFSUdFTl9QRVJNSVNTSVZFX0VYUFIKKyNlbmRpZgorCisvLyB0aGlzIG1hY3JvIGFsbG93cyB0byBnZXQgcmlkIG9mIGxpbmtpbmcgZXJyb3JzIGFib3V0IG11bHRpcGx5IGRlZmluZWQgZnVuY3Rpb25zLgorLy8gIC0gc3RhdGljIGlzIG5vdCB2ZXJ5IGdvb2QgYmVjYXVzZSBpdCBwcmV2ZW50cyBkZWZpbml0aW9ucyBmcm9tIGRpZmZlcmVudCBvYmplY3QgZmlsZXMgdG8gYmUgbWVyZ2VkLgorLy8gICAgICAgICAgIFNvIHN0YXRpYyBjYXVzZXMgdGhlIHJlc3VsdGluZyBsaW5rZWQgZXhlY3V0YWJsZSB0byBiZSBibG9hdGVkIHdpdGggbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLgorLy8gIC0gaW5saW5lIGlzIG5vdCBwZXJmZWN0IGVpdGhlciBhcyBpdCB1bndhbnRlZGx5IGhpbnRzIHRoZSBjb21waWxlciB0b3dhcmQgaW5saW5pbmcgdGhlIGZ1bmN0aW9uLgorI2RlZmluZSBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCisjZGVmaW5lIEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBpbmxpbmUKKworI2lmZGVmIE5ERUJVRworIyBpZm5kZWYgRUlHRU5fTk9fREVCVUcKKyMgIGRlZmluZSBFSUdFTl9OT19ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKy8vIGVpZ2VuX3BsYWluX2Fzc2VydCBpcyB3aGVyZSB3ZSBpbXBsZW1lbnQgdGhlIHdvcmthcm91bmQgZm9yIHRoZSBhc3NlcnQoKSBidWcgaW4gR0NDIDw9IDQuMywgc2VlIGJ1ZyA4OQorI2lmZGVmIEVJR0VOX05PX0RFQlVHCisgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpCisjZWxzZQorICAjaWYgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPCisgICAgbmFtZXNwYWNlIEVpZ2VuIHsKKyAgICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgIGlubGluZSBib29sIGNvcHlfYm9vbChib29sIGIpIHsgcmV0dXJuIGI7IH0KKyAgICB9CisgICAgfQorICAgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpIGFzc2VydCh4KQorICAjZWxzZQorICAgIC8vIHdvcmsgYXJvdW5kIGJ1ZyA4OQorICAgICNpbmNsdWRlIDxjc3RkbGliPiAgIC8vIGZvciBhYm9ydAorICAgICNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIGZvciBzdGQ6OmNlcnIKKworICAgIG5hbWVzcGFjZSBFaWdlbiB7CisgICAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICAvLyB0cml2aWFsIGZ1bmN0aW9uIGNvcHlpbmcgYSBib29sLiBNdXN0IGJlIEVJR0VOX0RPTlRfSU5MSU5FLCBzbyB3ZSBpbXBsZW1lbnQgaXQgYWZ0ZXIgaW5jbHVkaW5nIEVpZ2VuIGhlYWRlcnMuCisgICAgLy8gc2VlIGJ1ZyA4OS4KKyAgICBuYW1lc3BhY2UgeworICAgIEVJR0VOX0RPTlRfSU5MSU5FIGJvb2wgY29weV9ib29sKGJvb2wgYikgeyByZXR1cm4gYjsgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhc3NlcnRfZmFpbChjb25zdCBjaGFyICpjb25kaXRpb24sIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgImFzc2VydGlvbiBmYWlsZWQ6ICIgPDwgY29uZGl0aW9uIDw8ICIgaW4gZnVuY3Rpb24gIiA8PCBmdW5jdGlvbiA8PCAiIGF0ICIgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB9CisgICAgfQorICAgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpIFwKKyAgICAgIGRvIHsgXAorICAgICAgICBpZighRWlnZW46OmludGVybmFsOjpjb3B5X2Jvb2woeCkpIFwKKyAgICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OmFzc2VydF9mYWlsKEVJR0VOX01BS0VTVFJJTkcoeCksIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgIH0gd2hpbGUoZmFsc2UpCisgICNlbmRpZgorI2VuZGlmCisKKy8vIGVpZ2VuX2Fzc2VydCBjYW4gYmUgb3ZlcnJpZGRlbgorI2lmbmRlZiBlaWdlbl9hc3NlcnQKKyNkZWZpbmUgZWlnZW5fYXNzZXJ0KHgpIGVpZ2VuX3BsYWluX2Fzc2VydCh4KQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyNkZWZpbmUgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHgpIGVpZ2VuX2Fzc2VydCh4KQorI2Vsc2UKKyNkZWZpbmUgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHgpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX05PX0RFQlVHCisjZGVmaW5lIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcoeCkgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHgpCisjZWxzZQorI2RlZmluZSBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHgpCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9OT19ERVBSRUNBVEVEX1dBUk5JTkcKKyAgI2lmIEVJR0VOX0NPTVBfR05VQworICAgICNkZWZpbmUgRUlHRU5fREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyAgI2VsaWYgRUlHRU5fQ09NUF9NU1ZDCisgICAgI2RlZmluZSBFSUdFTl9ERVBSRUNBVEVEIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0RFUFJFQ0FURUQKKyAgI2VuZGlmCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWYgRUlHRU5fQ09NUF9HTlVDCisjZGVmaW5lIEVJR0VOX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fVU5VU0VECisjZW5kaWYKKworLy8gU3VwcHJlc3NlcyAndW51c2VkIHZhcmlhYmxlJyB3YXJuaW5ncy4KK25hbWVzcGFjZSBFaWdlbiB7CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBpZ25vcmVfdW51c2VkX3ZhcmlhYmxlKGNvbnN0IFQmKSB7fQorICB9Cit9CisjZGVmaW5lIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh2YXIpIEVpZ2VuOjppbnRlcm5hbDo6aWdub3JlX3VudXNlZF92YXJpYWJsZSh2YXIpOworCisjaWYgIWRlZmluZWQoRUlHRU5fQVNNX0NPTU1FTlQpCisgICNpZiBFSUdFTl9DT01QX0dOVUMgJiYgKEVJR0VOX0FSQ0hfaTM4Nl9PUl94ODZfNjQgfHwgRUlHRU5fQVJDSF9BUk1fT1JfQVJNNjQpCisgICAgI2RlZmluZSBFSUdFTl9BU01fQ09NTUVOVChYKSAgX19hc21fXygiIyIgWCkKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0FTTV9DT01NRU5UKFgpCisgICNlbmRpZgorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRpYyBhbmQgZHluYW1pYyBhbGlnbm1lbnQgY29udHJvbAorLy8KKy8vIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIGlzIHRvIGRlZmluZSBFSUdFTl9NQVhfQUxJR05fQllURVMgYW5kIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMKKy8vIGFzIHRoZSBtYXhpbWFsIGJvdW5kYXJ5IGluIGJ5dGVzIG9uIHdoaWNoIGR5bmFtaWNhbGx5IGFuZCBzdGF0aWNhbGx5IGFsbG9jYXRlZCBkYXRhIG1heSBiZSBhbGlnbm1lbnQgcmVzcGVjdGl2ZWx5LgorLy8gVGhlIHZhbHVlcyBvZiBFSUdFTl9NQVhfQUxJR05fQllURVMgYW5kIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMgY2FuIGJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4gSWYgbm90LAorLy8gYSBkZWZhdWx0IHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYmFzZWQgb24gYXJjaGl0ZWN0dXJlLCBjb21waWxlciwgYW5kIE9TLgorLy8KKy8vIFRoaXMgc2VjdGlvbiBhbHNvIGRlZmluZXMgbWFjcm9zIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKE4pIGFuZCB0aGUgc2hvcnRjdXRzIEVJR0VOX0FMSUdOezgsMTYsMzIsX01BWH0KKy8vIHRvIGJlIHVzZWQgdG8gZGVjbGFyZSBzdGF0aWNhbGx5IGFsaWduZWQgYnVmZmVycy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLyogRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkobikgZm9yY2VzIGRhdGEgdG8gYmUgbi1ieXRlIGFsaWduZWQuIFRoaXMgaXMgdXNlZCB0byBzYXRpc2Z5IFNJTUQgcmVxdWlyZW1lbnRzLgorICogSG93ZXZlciwgd2UgZG8gdGhhdCBFVkVOIGlmIHZlY3Rvcml6YXRpb24gKEVJR0VOX1ZFQ1RPUklaRSkgaXMgZGlzYWJsZWQsCisgKiBzbyB0aGF0IHZlY3Rvcml6YXRpb24gZG9lc24ndCBhZmZlY3QgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgKgorICogSWYgd2UgbWFkZSBhbGlnbm1lbnQgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IEVJR0VOX1ZFQ1RPUklaRSBpcyBkZWZpbmVkLCBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGxpbmsKKyAqIHZlY3Rvcml6ZWQgYW5kIG5vbi12ZWN0b3JpemVkIGNvZGUuCisgKi8KKyNpZiAoZGVmaW5lZCBfX0NVREFDQ19fKQorICAjZGVmaW5lIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKG4pIF9fYWxpZ25fXyhuKQorI2VsaWYgRUlHRU5fQ09NUF9HTlVDIHx8IEVJR0VOX0NPTVBfUEdJIHx8IEVJR0VOX0NPTVBfSUJNIHx8IEVJR0VOX0NPTVBfQVJNCisgICNkZWZpbmUgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkobikgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChuKSkpCisjZWxpZiBFSUdFTl9DT01QX01TVkMKKyAgI2RlZmluZSBFSUdFTl9BTElHTl9UT19CT1VOREFSWShuKSBfX2RlY2xzcGVjKGFsaWduKG4pKQorI2VsaWYgRUlHRU5fQ09NUF9TVU5DQworICAvLyBGSVhNRSBub3Qgc3VyZSBhYm91dCB0aGlzIG9uZToKKyAgI2RlZmluZSBFSUdFTl9BTElHTl9UT19CT1VOREFSWShuKSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKG4pKSkKKyNlbHNlCisgICNlcnJvciBQbGVhc2UgdGVsbCBtZSB3aGF0IGlzIHRoZSBlcXVpdmFsZW50IG9mIF9fYXR0cmlidXRlX18oKGFsaWduZWQobikpKSBmb3IgeW91ciBjb21waWxlcgorI2VuZGlmCisKKy8vIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgZGlzYWJsZSB2ZWN0b3JpemF0aW9uLCB0aGVuIHdlIGFsc28gZGlzYWJsZSBhbGlnbm1lbnQKKyNpZiBkZWZpbmVkKEVJR0VOX0RPTlRfVkVDVE9SSVpFKQorICAjZGVmaW5lIEVJR0VOX0lERUFMX01BWF9BTElHTl9CWVRFUyAwCisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9BVlg1MTIpCisgIC8vIDY0IGJ5dGVzIHN0YXRpYyBhbGlnbm1lZW50IGlzIHByZWZlcnJlZCBvbmx5IGlmIHJlYWxseSByZXF1aXJlZAorICAjZGVmaW5lIEVJR0VOX0lERUFMX01BWF9BTElHTl9CWVRFUyA2NAorI2VsaWYgZGVmaW5lZChfX0FWWF9fKQorICAvLyAzMiBieXRlcyBzdGF0aWMgYWxpZ25tZWVudCBpcyBwcmVmZXJyZWQgb25seSBpZiByZWFsbHkgcmVxdWlyZWQKKyAgI2RlZmluZSBFSUdFTl9JREVBTF9NQVhfQUxJR05fQllURVMgMzIKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fSURFQUxfTUFYX0FMSUdOX0JZVEVTIDE2CisjZW5kaWYKKworCisvLyBFSUdFTl9NSU5fQUxJR05fQllURVMgZGVmaW5lcyB0aGUgbWluaW1hbCB2YWx1ZSBmb3Igd2hpY2ggdGhlIG5vdGlvbiBvZiBleHBsaWNpdCBhbGlnbm1lbnQgbWFrZXMgc2Vuc2UKKyNkZWZpbmUgRUlHRU5fTUlOX0FMSUdOX0JZVEVTIDE2CisKKy8vIERlZmluZWQgdGhlIGJvdW5kYXJ5IChpbiBieXRlcykgb24gd2hpY2ggdGhlIGRhdGEgbmVlZHMgdG8gYmUgYWxpZ25lZC4gTm90ZQorLy8gdGhhdCB1bmxlc3MgRUlHRU5fQUxJR04gaXMgZGVmaW5lZCBhbmQgbm90IGVxdWFsIHRvIDAsIHRoZSBkYXRhIG1heSBub3QgYmUKKy8vIGFsaWduZWQgYXQgYWxsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgI2RlZmluZS4KKworI2lmIChkZWZpbmVkKEVJR0VOX0RPTlRfQUxJR05fU1RBVElDQUxMWSkgfHwgZGVmaW5lZChFSUdFTl9ET05UX0FMSUdOKSkgICYmIGRlZmluZWQoRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUykgJiYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUz4wCisjZXJyb3IgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyBhbmQgRUlHRU5fRE9OVF9BTElHTltfU1RBVElDQUxMWV0gYXJlIGJvdGggZGVmaW5lZCB3aXRoIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMhPTAuIFVzZSBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPTAgYXMgYSBzeW5vbnltIG9mIEVJR0VOX0RPTlRfQUxJR05fU1RBVElDQUxMWS4KKyNlbmRpZgorCisvLyBFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkgYW5kIEVJR0VOX0RPTlRfQUxJR04gYXJlIGRlcHJlY3RhdGVkCisvLyBUaGV5IGltcGx5IEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM9MAorI2lmIGRlZmluZWQoRUlHRU5fRE9OVF9BTElHTl9TVEFUSUNBTExZKSB8fCBkZWZpbmVkKEVJR0VOX0RPTlRfQUxJR04pCisgICNpZmRlZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTCisgICAgI3VuZGVmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMKKyAgI2VuZGlmCisgICNkZWZpbmUgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyAwCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTCisKKyAgLy8gVHJ5IHRvIGF1dG9tYXRpY2FsbHkgZ3Vlc3Mgd2hhdCBpcyB0aGUgYmVzdCBkZWZhdWx0IHZhbHVlIGZvciBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTCisKKyAgLy8gMTYgYnl0ZSBhbGlnbm1lbnQgaXMgb25seSB1c2VmdWwgZm9yIHZlY3Rvcml6YXRpb24uIFNpbmNlIGl0IGFmZmVjdHMgdGhlIEFCSSwgd2UgbmVlZCB0byBlbmFibGUKKyAgLy8gMTYgYnl0ZSBhbGlnbm1lbnQgb24gYWxsIHBsYXRmb3JtcyB3aGVyZSB2ZWN0b3JpemF0aW9uIG1pZ2h0IGJlIGVuYWJsZWQuIEluIHRoZW9yeSB3ZSBjb3VsZCBhbHdheXMKKyAgLy8gZW5hYmxlIGFsaWdubWVudCwgYnV0IGl0IGNhbiBiZSBhIGNhdXNlIG9mIHByb2JsZW1zIG9uIHNvbWUgcGxhdGZvcm1zLCBzbyB3ZSBqdXN0IGRpc2FibGUgaXQgaW4KKyAgLy8gY2VydGFpbiBjb21tb24gcGxhdGZvcm0gKGNvbXBpbGVyK2FyY2hpdGVjdHVyZSBjb21iaW5hdGlvbnMpIHRvIGF2b2lkIHRoZXNlIHByb2JsZW1zLgorICAvLyBPbmx5IHN0YXRpYyBhbGlnbm1lbnQgaXMgcmVhbGx5IHByb2JsZW1hdGljIChyZWxpZXMgb24gbm9uc3RhbmRhcmQgY29tcGlsZXIgZXh0ZW5zaW9ucyksCisgIC8vIHRyeSB0byBrZWVwIGhlYXAgYWxpZ25tZW50IGV2ZW4gd2hlbiB3ZSBoYXZlIHRvIGRpc2FibGUgc3RhdGljIGFsaWdubWVudC4KKyAgI2lmIEVJR0VOX0NPTVBfR05VQyAmJiAhKEVJR0VOX0FSQ0hfaTM4Nl9PUl94ODZfNjQgfHwgRUlHRU5fQVJDSF9BUk1fT1JfQVJNNjQgfHwgRUlHRU5fQVJDSF9QUEMgfHwgRUlHRU5fQVJDSF9JQTY0KQorICAjZGVmaW5lIEVJR0VOX0dDQ19BTkRfQVJDSF9ET0VTTlRfV0FOVF9TVEFDS19BTElHTk1FTlQgMQorICAjZWxpZiBFSUdFTl9BUkNIX0FSTV9PUl9BUk02NCAmJiBFSUdFTl9DT01QX0dOVUNfU1RSSUNUICYmIEVJR0VOX0dOVUNfQVRfTU9TVCg0LCA2KQorICAvLyBPbGQgdmVyc2lvbnMgb2YgR0NDIG9uIEFSTSwgYXQgbGVhc3QgNC40LCB3ZXJlIG9uY2Ugc2VlbiB0byBoYXZlIGJ1Z2d5IHN0YXRpYyBhbGlnbm1lbnQgc3VwcG9ydC4KKyAgLy8gTm90IHN1cmUgd2hpY2ggdmVyc2lvbiBmaXhlZCBpdCwgaG9wZWZ1bGx5IGl0IGRvZXNuJ3QgYWZmZWN0IDQuNywgd2hpY2ggaXMgc3RpbGwgc29tZXdoYXQgaW4gdXNlLgorICAvLyA0LjggYW5kIG5ld2VyIHNlZW0gZGVmaW5pdGVseSB1bmFmZmVjdGVkLgorICAjZGVmaW5lIEVJR0VOX0dDQ19BTkRfQVJDSF9ET0VTTlRfV0FOVF9TVEFDS19BTElHTk1FTlQgMQorICAjZWxzZQorICAjZGVmaW5lIEVJR0VOX0dDQ19BTkRfQVJDSF9ET0VTTlRfV0FOVF9TVEFDS19BTElHTk1FTlQgMAorICAjZW5kaWYKKworICAvLyBzdGF0aWMgYWxpZ25tZW50IGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgd2l0aCBHQ0MgMywgU3VuIFN0dWRpbywgYW5kIFFDQy9RTlgKKyAgI2lmICFFSUdFTl9HQ0NfQU5EX0FSQ0hfRE9FU05UX1dBTlRfU1RBQ0tfQUxJR05NRU5UIFwKKyAgJiYgIUVJR0VOX0dDQzNfT1JfT0xERVIgXAorICAmJiAhRUlHRU5fQ09NUF9TVU5DQyBcCisgICYmICFFSUdFTl9PU19RTlgKKyAgICAjZGVmaW5lIEVJR0VOX0FSQ0hfV0FOVFNfU1RBQ0tfQUxJR05NRU5UIDEKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0FSQ0hfV0FOVFNfU1RBQ0tfQUxJR05NRU5UIDAKKyAgI2VuZGlmCisKKyAgI2lmIEVJR0VOX0FSQ0hfV0FOVFNfU1RBQ0tfQUxJR05NRU5UCisgICAgI2RlZmluZSBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTIEVJR0VOX0lERUFMX01BWF9BTElHTl9CWVRFUworICAjZWxzZQorICAgICNkZWZpbmUgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyAwCisgICNlbmRpZgorCisjZW5kaWYKKworLy8gSWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTIGlzIGRlZmluZWQsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBhcyBhbiB1cHBlciBib3VuZCBmb3IgRUlHRU5fTUFYX0FMSUdOX0JZVEVTCisjaWYgZGVmaW5lZChFSUdFTl9NQVhfQUxJR05fQllURVMpICYmIEVJR0VOX01BWF9BTElHTl9CWVRFUzxFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTCisjdW5kZWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUworI2RlZmluZSBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTIEVJR0VOX01BWF9BTElHTl9CWVRFUworI2VuZGlmCisKKyNpZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPT0wICYmICFkZWZpbmVkKEVJR0VOX0RJU0FCTEVfVU5BTElHTkVEX0FSUkFZX0FTU0VSVCkKKyAgI2RlZmluZSBFSUdFTl9ESVNBQkxFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQKKyNlbmRpZgorCisvLyBBdCB0aGlzIHN0YWdlLCBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPjAgaXMgdGhlIHRydWUgdGVzdCB3aGV0aGVyIHdlIHdhbnQgdG8gYWxpZ24gYXJyYXlzIG9uIHRoZSBzdGFjayBvciBub3QuCisvLyBJdCB0YWtlcyBpbnRvIGFjY291bnQgYm90aCB0aGUgdXNlciBjaG9pY2UgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBhbGlnbm1lbnQgKGJ5IHNldHR0aW5nIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMpCisvLyBhbmQgdGhlIGFyY2hpdGVjdHVyZSBjb25maWcgKEVJR0VOX0FSQ0hfV0FOVFNfU1RBQ0tfQUxJR05NRU5UKS4KKy8vIEhlbmNlZm9ydGgsIG9ubHkgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyBzaG91bGQgYmUgdXNlZC4KKworCisvLyBTaG9ydGN1dHMgdG8gRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkKKyNkZWZpbmUgRUlHRU5fQUxJR044ICBFSUdFTl9BTElHTl9UT19CT1VOREFSWSg4KQorI2RlZmluZSBFSUdFTl9BTElHTjE2IEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDE2KQorI2RlZmluZSBFSUdFTl9BTElHTjMyIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDMyKQorI2RlZmluZSBFSUdFTl9BTElHTjY0IEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDY0KQorI2lmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM+MAorI2RlZmluZSBFSUdFTl9BTElHTl9NQVggRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUykKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0FMSUdOX01BWAorI2VuZGlmCisKKworLy8gRHluYW1pYyBhbGlnbm1lbnQgY29udHJvbAorCisjaWYgZGVmaW5lZChFSUdFTl9ET05UX0FMSUdOKSAmJiBkZWZpbmVkKEVJR0VOX01BWF9BTElHTl9CWVRFUykgJiYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPjAKKyNlcnJvciBFSUdFTl9NQVhfQUxJR05fQllURVMgYW5kIEVJR0VOX0RPTlRfQUxJR04gYXJlIGJvdGggZGVmaW5lZCB3aXRoIEVJR0VOX01BWF9BTElHTl9CWVRFUyE9MC4gVXNlIEVJR0VOX01BWF9BTElHTl9CWVRFUz0wIGFzIGEgc3lub255bSBvZiBFSUdFTl9ET05UX0FMSUdOLgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9ET05UX0FMSUdOCisgICNpZmRlZiBFSUdFTl9NQVhfQUxJR05fQllURVMKKyAgICAjdW5kZWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTCisgICNlbmRpZgorICAjZGVmaW5lIEVJR0VOX01BWF9BTElHTl9CWVRFUyAwCisjZWxpZiAhZGVmaW5lZChFSUdFTl9NQVhfQUxJR05fQllURVMpCisgICNkZWZpbmUgRUlHRU5fTUFYX0FMSUdOX0JZVEVTIEVJR0VOX0lERUFMX01BWF9BTElHTl9CWVRFUworI2VuZGlmCisKKyNpZiBFSUdFTl9JREVBTF9NQVhfQUxJR05fQllURVMgPiBFSUdFTl9NQVhfQUxJR05fQllURVMKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUyBFSUdFTl9JREVBTF9NQVhfQUxJR05fQllURVMKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMgRUlHRU5fTUFYX0FMSUdOX0JZVEVTCisjZW5kaWYKKworCisjaWZuZGVmIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUKKyNkZWZpbmUgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSAxCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI2lmZGVmIEVJR0VOX0RPTlRfVVNFX1JFU1RSSUNUX0tFWVdPUkQKKyAgI2RlZmluZSBFSUdFTl9SRVNUUklDVAorI2VuZGlmCisjaWZuZGVmIEVJR0VOX1JFU1RSSUNUCisgICNkZWZpbmUgRUlHRU5fUkVTVFJJQ1QgX19yZXN0cmljdAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVAorLy8gMTMxMDcyID09IDEyOCBLQgorI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDEzMTA3MgorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fREVGQVVMVF9JT19GT1JNQVQKKyNpZmRlZiBFSUdFTl9NQUtJTkdfRE9DUworLy8gZm9ybWF0IHVzZWQgaW4gRWlnZW4ncyBkb2N1bWVudGF0aW9uCisvLyBuZWVkZWQgdG8gZGVmaW5lIGl0IGhlcmUgYXMgZXNjYXBpbmcgY2hhcmFjdGVycyBpbiBDTWFrZSBhZGRfZGVmaW5pdGlvbidzIGFyZ3VtZW50IHNlZW1zIHZlcnkgcHJvYmxlbWF0aWMuCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfSU9fRk9STUFUIEVpZ2VuOjpJT0Zvcm1hdCgzLCAwLCAiICIsICJcbiIsICIiLCAiIikKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfSU9fRk9STUFUIEVpZ2VuOjpJT0Zvcm1hdCgpCisjZW5kaWYKKyNlbmRpZgorCisvLyBqdXN0IGFuIGVtcHR5IG1hY3JvICEKKyNkZWZpbmUgRUlHRU5fRU1QVFkKKworI2lmIEVJR0VOX0NPTVBfTVNWQ19TVFJJQ1QgJiYgKEVJR0VOX0NPTVBfTVNWQyA8IDE5MDAgfHwgIGRlZmluZWQoX19DVURBQ0NfVkVSX18pKSAvLyBmb3Igb2xkZXIgTVNWQyB2ZXJzaW9ucywgYXMgd2VsbCBhcyAxOTAwICYmIENVREEgOCwgdXNpbmcgdGhlIGJhc2Ugb3BlcmF0b3IgaXMgc3VmZmljaWVudCAoY2YgQnVncyAxMDAwLCAxMzI0KQorICAjZGVmaW5lIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9FUVVBTF9PUEVSQVRPUihEZXJpdmVkKSBcCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IgPTsKKyNlbGlmIEVJR0VOX0NPTVBfQ0xBTkcgLy8gd29ya2Fyb3VuZCBjbGFuZyBidWcgKHNlZSBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD0xMDI2NTMpCisgICNkZWZpbmUgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX0VRVUFMX09QRVJBVE9SKERlcml2ZWQpIFwKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvciA9OyBcCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVyaXZlZCYgb3RoZXIpIHsgQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsgcmV0dXJuICp0aGlzOyB9IFwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBcCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7IEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOyByZXR1cm4gKnRoaXM7IH0KKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX0VRVUFMX09QRVJBVE9SKERlcml2ZWQpIFwKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvciA9OyBcCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVyaXZlZCYgb3RoZXIpIFwKKyAgICB7IFwKKyAgICAgIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7IFwKKyAgICAgIHJldHVybiAqdGhpczsgXAorICAgIH0KKyNlbmRpZgorCisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBNYWNybyB0byBtYW51YWxseSBpbmhlcml0IGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICogVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIGltcGxpY2l0bHkgZGVmaW5lZCBhc3NpZ25tZW50IG9wZXJhdG9yIGdldHMgZGVsZXRlZCB3aGVuIGEgY3VzdG9tIG9wZXJhdG9yPSBpcyBkZWZpbmVkLgorICovCisjZGVmaW5lIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoRGVyaXZlZCkgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX0VRVUFMX09QRVJBVE9SKERlcml2ZWQpCisKKy8qKgorKiBKdXN0IGEgc2lkZSBub3RlLiBDb21tZW50aW5nIHdpdGhpbiBkZWZpbmVzIHdvcmtzIG9ubHkgYnkgZG9jdW1lbnRpbmcKKyogYmVoaW5kIHRoZSBvYmplY3QgKHZpYSAnITwnKS4gQ29tbWVudHMgY2Fubm90IGJlIG11bHRpLWxpbmUgYW5kIHRodXMKKyogd2UgaGF2ZSB0aGVzZSBleHRyYSBsb25nIGxpbmVzLiBXaGF0IGlzIGNvbmZ1c2luZyBkb3h5Z2VuIG92ZXIgaGVyZSBpcworKiB0aGF0IHdlIHVzZSAnXCcgYW5kIGJhc2ljYWxseSBoYXZlIGEgYnVuY2ggb2YgdHlwZWRlZnMgd2l0aCB0aGVpcgorKiBkb2N1bWVudGF0aW9uIGluIGEgc2luZ2xlIGxpbmUuCisqKi8KKworI2RlZmluZSBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOyAvKiE8IFxicmllZiBOdW1lcmljIHR5cGUsIGUuZy4gZmxvYXQsIGRvdWJsZSwgaW50IG9yIHN0ZDo6Y29tcGxleDxmbG9hdD4uICovIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsgLyohPCBcYnJpZWYgVGhlIHVuZGVybHlpbmcgbnVtZXJpYyB0eXBlIGZvciBjb21wb3NlZCBzY2FsYXIgdHlwZXMuIFxkZXRhaWxzIEluIGNhc2VzIHdoZXJlIFNjYWxhciBpcyBlLmcuIHN0ZDo6Y29tcGxleDxUPiwgVCB3ZXJlIGNvcnJlc3BvbmRpbmcgdG8gUmVhbFNjYWxhci4gKi8gXAorICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7IC8qITwgXGJyaWVmIFRoZSByZXR1cm4gdHlwZSBmb3IgY29lZmZpY2llbnQgYWNjZXNzLiBcZGV0YWlscyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgb2JqZWN0IGFsbG93cyBkaXJlY3QgY29lZmZpY2llbnQgYWNjZXNzIChlLmcuIGZvciBhIE1hdHJpeFhkKSwgdGhpcyB0eXBlIGlzIGVpdGhlciAnY29uc3QgU2NhbGFyJicgb3Igc2ltcGx5ICdTY2FsYXInIGZvciBvYmplY3RzIHRoYXQgZG8gbm90IGFsbG93IGRpcmVjdCBjb2VmZmljaWVudCBhY2Nlc3MuICovIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxEZXJpdmVkPjo6dHlwZSBOZXN0ZWQ7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsgXAorICBlbnVtIHsgUm93c0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgRmxhZ3MgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsIFwKKyAgICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSBCYXNlOjpTaXplQXRDb21waWxlVGltZSwgXAorICAgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lLCBcCisgICAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZSB9OyBcCisgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7IFwKKyAgdXNpbmcgQmFzZTo6Y29uc3RfY2FzdF9kZXJpdmVkOworCisKKy8vIEZJWE1FIE1heWJlIHRoZSBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFIGNvdWxkIGJlIHJlbW92ZWQgYXMgaW1wb3J0aW5nIFBhY2tldFNjYWxhciBpcyByYXJlbHkgbmVlZGVkCisjZGVmaW5lIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBhY2tldFNjYWxhciBQYWNrZXRTY2FsYXI7CisKKworI2RlZmluZSBFSUdFTl9QTEFJTl9FTlVNX01JTihhLGIpICgoKGludClhIDw9IChpbnQpYikgPyAoaW50KWEgOiAoaW50KWIpCisjZGVmaW5lIEVJR0VOX1BMQUlOX0VOVU1fTUFYKGEsYikgKCgoaW50KWEgPj0gKGludCliKSA/IChpbnQpYSA6IChpbnQpYikKKworLy8gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMgZ2l2ZXMgdGhlIG1pbiBiZXR3ZWVuIGNvbXBpbGUtdGltZSBzaXplcy4gMCBoYXMgYWJzb2x1dGUgcHJpb3JpdHksIGZvbGxvd2VkIGJ5IDEsCisvLyBmb2xsb3dlZCBieSBEeW5hbWljLCBmb2xsb3dlZCBieSBvdGhlciBmaW5pdGUgdmFsdWVzLiBUaGUgcmVhc29uIGZvciBnaXZpbmcgRHluYW1pYyB0aGUgcHJpb3JpdHkgb3ZlcgorLy8gZmluaXRlIHZhbHVlcyBpcyB0aGF0IG1pbigzLCBEeW5hbWljKSBzaG91bGQgYmUgRHluYW1pYywgc2luY2UgdGhhdCBjb3VsZCBiZSBhbnl0aGluZyBiZXR3ZWVuIDAgYW5kIDMuCisjZGVmaW5lIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKGEsYikgKCgoaW50KWEgPT0gMCB8fCAoaW50KWIgPT0gMCkgPyAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnQpYSA9PSAxIHx8IChpbnQpYiA9PSAxKSA/IDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhID09IER5bmFtaWMgfHwgKGludCliID09IER5bmFtaWMpID8gRHluYW1pYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWEgPD0gKGludCliKSA/IChpbnQpYSA6IChpbnQpYikKKworLy8gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEIGlzIGEgdmFyaWFudCBvZiBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyBjb21wYXJpbmcgTWF4U2l6ZXMuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZmluaXRlIHZhbHVlcworLy8gbm93IGhhdmUgcHJpb3JpdHkgb3ZlciBEeW5hbWljLCBzbyB0aGF0IG1pbigzLCBEeW5hbWljKSBnaXZlcyAzLiBJbmRlZWQsIHdoYXRldmVyIHRoZSBhY3R1YWwgdmFsdWUgaXMKKy8vIChiZXR3ZWVuIDAgYW5kIDMpLCBpdCBpcyBub3QgbW9yZSB0aGFuIDMuCisjZGVmaW5lIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChhLGIpICAoKChpbnQpYSA9PSAwIHx8IChpbnQpYiA9PSAwKSA/IDAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhID09IDEgfHwgKGludCliID09IDEpID8gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWEgPT0gRHluYW1pYyAmJiAoaW50KWIgPT0gRHluYW1pYykgPyBEeW5hbWljIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnQpYSA9PSBEeW5hbWljKSA/IChpbnQpYiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWIgPT0gRHluYW1pYykgPyAoaW50KWEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhIDw9IChpbnQpYikgPyAoaW50KWEgOiAoaW50KWIpCisKKy8vIHNlZSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQy4gTm8gbmVlZCBmb3IgYSBzZXBhcmF0ZSB2YXJpYW50IGZvciBNYXhTaXplcyBoZXJlLgorI2RlZmluZSBFSUdFTl9TSVpFX01BWChhLGIpICgoKGludClhID09IER5bmFtaWMgfHwgKGludCliID09IER5bmFtaWMpID8gRHluYW1pYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWEgPj0gKGludCliKSA/IChpbnQpYSA6IChpbnQpYikKKworI2RlZmluZSBFSUdFTl9MT0dJQ0FMX1hPUihhLGIpICgoKGEpIHx8IChiKSkgJiYgISgoYSkgJiYgKGIpKSkKKworI2RlZmluZSBFSUdFTl9JTVBMSUVTKGEsYikgKCEoYSkgfHwgKGIpKQorCisvLyB0aGUgZXhwcmVzc2lvbiB0eXBlIG9mIGEgc3RhbmRhcmQgY29lZmZpY2llbnQgd2lzZSBiaW5hcnkgb3BlcmF0aW9uCisjZGVmaW5lIEVJR0VOX0NXSVNFX0JJTkFSWV9SRVRVUk5fVFlQRShMSFMsUkhTLE9QTkFNRSkgXAorICAgIEN3aXNlQmluYXJ5T3A8IFwKKyAgICAgIEVJR0VOX0NBVChFSUdFTl9DQVQoaW50ZXJuYWw6OnNjYWxhcl8sT1BOQU1FKSxfb3ApPCBcCisgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxMSFM+OjpTY2FsYXIsIFwKKyAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJIUz46OlNjYWxhciBcCisgICAgICA+LCBcCisgICAgICBjb25zdCBMSFMsIFwKKyAgICAgIGNvbnN0IFJIUyBcCisgICAgPgorCisjZGVmaW5lIEVJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKE1FVEhPRCxPUE5BTUUpIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBcCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRUlHRU5fQ1dJU0VfQklOQVJZX1JFVFVSTl9UWVBFKERlcml2ZWQsT3RoZXJEZXJpdmVkLE9QTkFNRSkgXAorICAoTUVUSE9EKShjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QgXAorICB7IFwKKyAgICByZXR1cm4gRUlHRU5fQ1dJU0VfQklOQVJZX1JFVFVSTl9UWVBFKERlcml2ZWQsT3RoZXJEZXJpdmVkLE9QTkFNRSkoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOyBcCisgIH0KKworI2RlZmluZSBFSUdFTl9TQ0FMQVJfQklOQVJZX1NVUFBPUlRFRChPUE5BTUUsVFlQRUEsVFlQRUIpIFwKKyAgKEVpZ2VuOjppbnRlcm5hbDo6aGFzX1JldHVyblR5cGU8RWlnZW46OlNjYWxhckJpbmFyeU9wVHJhaXRzPFRZUEVBLFRZUEVCLEVJR0VOX0NBVChFSUdFTl9DQVQoRWlnZW46OmludGVybmFsOjpzY2FsYXJfLE9QTkFNRSksX29wKTxUWVBFQSxUWVBFQj4gID4gPjo6dmFsdWUpCisKKyNkZWZpbmUgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRVhQUixTQ0FMQVIsT1BOQU1FKSBcCisgIEN3aXNlQmluYXJ5T3A8RUlHRU5fQ0FUKEVJR0VOX0NBVChpbnRlcm5hbDo6c2NhbGFyXyxPUE5BTUUpLF9vcCk8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxFWFBSPjo6U2NhbGFyLFNDQUxBUj4sIGNvbnN0IEVYUFIsIFwKKyAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29uc3RhbnRfdHlwZTxFWFBSLFNDQUxBUj46OnR5cGU+CisKKyNkZWZpbmUgRUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoU0NBTEFSLEVYUFIsT1BOQU1FKSBcCisgIEN3aXNlQmluYXJ5T3A8RUlHRU5fQ0FUKEVJR0VOX0NBVChpbnRlcm5hbDo6c2NhbGFyXyxPUE5BTUUpLF9vcCk8U0NBTEFSLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RVhQUj46OlNjYWxhcj4sIFwKKyAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29uc3RhbnRfdHlwZTxFWFBSLFNDQUxBUj46OnR5cGUsIGNvbnN0IEVYUFI+CisKKy8vIFdvcmthcm91bmQgZm9yIE1TVkMgMjAxMCAoc2VlIE1MIHRocmVhZCAicGF0Y2ggd2l0aCBjb21waWxlIGZvciBmb3IgTVNWQyAyMDEwIikKKyNpZiBFSUdFTl9DT01QX01TVkNfU1RSSUNUPD0xNjAwCisjZGVmaW5lIEVJR0VOX01TVkMxMF9XT1JLQVJPVU5EX0JJTkFSWU9QX1JFVFVSTl9UWVBFKFgpIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8dHJ1ZSxYPjo6dHlwZQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fTVNWQzEwX1dPUktBUk9VTkRfQklOQVJZT1BfUkVUVVJOX1RZUEUoWCkgWAorI2VuZGlmCisKKyNkZWZpbmUgRUlHRU5fTUFLRV9TQ0FMQVJfQklOQVJZX09QX09OVEhFUklHSFQoTUVUSE9ELE9QTkFNRSkgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFwKKyAgRUlHRU5fTVNWQzEwX1dPUktBUk9VTkRfQklOQVJZT1BfUkVUVVJOX1RZUEUoY29uc3QgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyaXZlZCx0eXBlbmFtZSBpbnRlcm5hbDo6cHJvbW90ZV9zY2FsYXJfYXJnPFNjYWxhciBFSUdFTl9DT01NQSBUIEVJR0VOX0NPTU1BIEVJR0VOX1NDQUxBUl9CSU5BUllfU1VQUE9SVEVEKE9QTkFNRSxTY2FsYXIsVCk+Ojp0eXBlLE9QTkFNRSkpXAorICAoTUVUSE9EKShjb25zdCBUJiBzY2FsYXIpIGNvbnN0IHsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnByb21vdGVfc2NhbGFyX2FyZzxTY2FsYXIsVCxFSUdFTl9TQ0FMQVJfQklOQVJZX1NVUFBPUlRFRChPUE5BTUUsU2NhbGFyLFQpPjo6dHlwZSBQcm9tb3RlZFQ7IFwKKyAgICByZXR1cm4gRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyaXZlZCxQcm9tb3RlZFQsT1BOQU1FKShkZXJpdmVkKCksIFwKKyAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbnN0YW50X3R5cGU8RGVyaXZlZCxQcm9tb3RlZFQ+Ojp0eXBlKGRlcml2ZWQoKS5yb3dzKCksIGRlcml2ZWQoKS5jb2xzKCksIGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8UHJvbW90ZWRUPihzY2FsYXIpKSk7IFwKKyAgfQorCisjZGVmaW5lIEVJR0VOX01BS0VfU0NBTEFSX0JJTkFSWV9PUF9PTlRIRUxFRlQoTUVUSE9ELE9QTkFNRSkgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGZyaWVuZCBcCisgIEVJR0VOX01TVkMxMF9XT1JLQVJPVU5EX0JJTkFSWU9QX1JFVFVSTl9UWVBFKGNvbnN0IEVJR0VOX1NDQUxBUl9CSU5BUllPUF9FWFBSX1JFVFVSTl9UWVBFKHR5cGVuYW1lIGludGVybmFsOjpwcm9tb3RlX3NjYWxhcl9hcmc8U2NhbGFyIEVJR0VOX0NPTU1BIFQgRUlHRU5fQ09NTUEgRUlHRU5fU0NBTEFSX0JJTkFSWV9TVVBQT1JURUQoT1BOQU1FLFQsU2NhbGFyKT46OnR5cGUsRGVyaXZlZCxPUE5BTUUpKSBcCisgIChNRVRIT0QpKGNvbnN0IFQmIHNjYWxhciwgY29uc3QgU3RvcmFnZUJhc2VUeXBlJiBtYXRyaXgpIHsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnByb21vdGVfc2NhbGFyX2FyZzxTY2FsYXIsVCxFSUdFTl9TQ0FMQVJfQklOQVJZX1NVUFBPUlRFRChPUE5BTUUsVCxTY2FsYXIpPjo6dHlwZSBQcm9tb3RlZFQ7IFwKKyAgICByZXR1cm4gRUlHRU5fU0NBTEFSX0JJTkFSWU9QX0VYUFJfUkVUVVJOX1RZUEUoUHJvbW90ZWRULERlcml2ZWQsT1BOQU1FKSggXAorICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29uc3RhbnRfdHlwZTxEZXJpdmVkLFByb21vdGVkVD46OnR5cGUobWF0cml4LmRlcml2ZWQoKS5yb3dzKCksIG1hdHJpeC5kZXJpdmVkKCkuY29scygpLCBpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFByb21vdGVkVD4oc2NhbGFyKSksIG1hdHJpeC5kZXJpdmVkKCkpOyBcCisgIH0KKworI2RlZmluZSBFSUdFTl9NQUtFX1NDQUxBUl9CSU5BUllfT1AoTUVUSE9ELE9QTkFNRSkgXAorICBFSUdFTl9NQUtFX1NDQUxBUl9CSU5BUllfT1BfT05USEVMRUZUKE1FVEhPRCxPUE5BTUUpIFwKKyAgRUlHRU5fTUFLRV9TQ0FMQVJfQklOQVJZX09QX09OVEhFUklHSFQoTUVUSE9ELE9QTkFNRSkKKworCisjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworIyAgZGVmaW5lIEVJR0VOX1RIUk9XX1goWCkgdGhyb3cgWAorIyAgZGVmaW5lIEVJR0VOX1RIUk9XIHRocm93CisjICBkZWZpbmUgRUlHRU5fVFJZIHRyeQorIyAgZGVmaW5lIEVJR0VOX0NBVENIKFgpIGNhdGNoIChYKQorI2Vsc2UKKyMgIGlmZGVmIF9fQ1VEQV9BUkNIX18KKyMgICAgZGVmaW5lIEVJR0VOX1RIUk9XX1goWCkgYXNtKCJ0cmFwOyIpCisjICAgIGRlZmluZSBFSUdFTl9USFJPVyBhc20oInRyYXA7IikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEVJR0VOX1RIUk9XX1goWCkgc3RkOjphYm9ydCgpCisjICAgIGRlZmluZSBFSUdFTl9USFJPVyBzdGQ6OmFib3J0KCkKKyMgIGVuZGlmCisjICBkZWZpbmUgRUlHRU5fVFJZIGlmICh0cnVlKQorIyAgZGVmaW5lIEVJR0VOX0NBVENIKFgpIGVsc2UKKyNlbmRpZgorCisKKyNpZiBFSUdFTl9IQVNfQ1hYMTFfTk9FWENFUFQKKyMgICBkZWZpbmUgRUlHRU5fSU5DTFVERV9UWVBFX1RSQUlUUworIyAgIGRlZmluZSBFSUdFTl9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgIGRlZmluZSBFSUdFTl9OT0VYQ0VQVF9JRih4KSBub2V4Y2VwdCh4KQorIyAgIGRlZmluZSBFSUdFTl9OT19USFJPVyBub2V4Y2VwdCh0cnVlKQorIyAgIGRlZmluZSBFSUdFTl9FWENFUFRJT05fU1BFQyhYKSBub2V4Y2VwdChmYWxzZSkKKyNlbHNlCisjICAgZGVmaW5lIEVJR0VOX05PRVhDRVBUCisjICAgZGVmaW5lIEVJR0VOX05PRVhDRVBUX0lGKHgpCisjICAgZGVmaW5lIEVJR0VOX05PX1RIUk9XIHRocm93KCkKKyMgICBkZWZpbmUgRUlHRU5fRVhDRVBUSU9OX1NQRUMoWCkgdGhyb3coWCkKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fTUFDUk9TX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWVtb3J5LmggYi9FaWdlbi9zcmMvQ29yZS91dGlsL01lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzRkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL01lbW9yeS5oCkBAIC0wLDAgKzEsOTc3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgS2VubmV0aCBSaWRkaWxlIDxrZnJpZGRpbGVAeWFob28uY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFBhdmVsIEhvbG9ib3JvZGtvIDxwYXZlbEBob2xvYm9yb2Rrby5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFBsYXRmb3JtIGNoZWNrcyBmb3IgYWxpZ25lZCBtYWxsb2MgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFSUdFTl9NRU1PUllfSAorI2RlZmluZSBFSUdFTl9NRU1PUllfSAorCisjaWZuZGVmIEVJR0VOX01BTExPQ19BTFJFQURZX0FMSUdORUQKKworLy8gVHJ5IHRvIGRldGVybWluZSBhdXRvbWF0aWNhbGx5IGlmIG1hbGxvYyBpcyBhbHJlYWR5IGFsaWduZWQuCisKKy8vIE9uIDY0LWJpdCBzeXN0ZW1zLCBnbGliYydzIG1hbGxvYyByZXR1cm5zIDE2LWJ5dGUtYWxpZ25lZCBwb2ludGVycywgc2VlOgorLy8gICBodHRwOi8vd3d3LmdudS5vcmcvcy9saWJjL21hbnVhbC9odG1sX25vZGUvQWxpZ25lZC1NZW1vcnktQmxvY2tzLmh0bWwKKy8vIFRoaXMgaXMgdHJ1ZSBhdCBsZWFzdCBzaW5jZSBnbGliYyAyLjguCisvLyBUaGlzIGxlYXZlcyB0aGUgcXVlc3Rpb24gaG93IHRvIGRldGVjdCA2NC1iaXQuIEFjY29yZGluZyB0byB0aGlzIGRvY3VtZW50LAorLy8gICBodHRwOi8vZ2NjLmZ5eG0ubmV0L3N1bW1pdC8yMDAzL1BvcnRpbmclMjB0byUyMDY0JTIwYml0LnBkZgorLy8gcGFnZSAxMTQsICJbVGhlXSBMUDY0IG1vZGVsIFsuLi5dIGlzIHVzZWQgYnkgYWxsIDY0LWJpdCBVTklYIHBvcnRzIiBzbyBpdCdzIGluZGVlZAorLy8gcXVpdGUgc2FmZSwgYXQgbGVhc3Qgd2l0aGluIHRoZSBjb250ZXh0IG9mIGdsaWJjLCB0byBlcXVhdGUgNjQtYml0IHdpdGggTFA2NC4KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgKChfX0dMSUJDX18+PTIgJiYgX19HTElCQ19NSU5PUl9fID49IDgpIHx8IF9fR0xJQkNfXz4yKSBcCisgJiYgZGVmaW5lZChfX0xQNjRfXykgJiYgISBkZWZpbmVkKCBfX1NBTklUSVpFX0FERFJFU1NfXyApICYmIChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTID09IDE2KQorICAjZGVmaW5lIEVJR0VOX0dMSUJDX01BTExPQ19BTFJFQURZX0FMSUdORUQgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9HTElCQ19NQUxMT0NfQUxSRUFEWV9BTElHTkVEIDAKKyNlbmRpZgorCisvLyBGcmVlQlNEIDYgc2VlbXMgdG8gaGF2ZSAxNi1ieXRlIGFsaWduZWQgbWFsbG9jCisvLyAgIFNlZSBodHRwOi8vc3ZuLmZyZWVic2Qub3JnL3ZpZXd2Yy9iYXNlL3N0YWJsZS82L2xpYi9saWJjL3N0ZGxpYi9tYWxsb2MuYz92aWV3PW1hcmt1cAorLy8gRnJlZUJTRCA3IHNlZW1zIHRvIGhhdmUgMTYtYnl0ZSBhbGlnbmVkIG1hbGxvYyBleGNlcHQgb24gQVJNIGFuZCBNSVBTIGFyY2hpdGVjdHVyZXMKKy8vICAgU2VlIGh0dHA6Ly9zdm4uZnJlZWJzZC5vcmcvdmlld3ZjL2Jhc2Uvc3RhYmxlLzcvbGliL2xpYmMvc3RkbGliL21hbGxvYy5jP3ZpZXc9bWFya3VwCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIShFSUdFTl9BUkNIX0FSTSB8fCBFSUdFTl9BUkNIX01JUFMpICYmIChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTID09IDE2KQorICAjZGVmaW5lIEVJR0VOX0ZSRUVCU0RfTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0ZSRUVCU0RfTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAwCisjZW5kaWYKKworI2lmIChFSUdFTl9PU19NQUMgJiYgKEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMgPT0gMTYpKSAgICAgXAorIHx8IChFSUdFTl9PU19XSU42NCAmJiAoRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUyA9PSAxNikpICAgXAorIHx8IEVJR0VOX0dMSUJDX01BTExPQ19BTFJFQURZX0FMSUdORUQgICAgICAgICAgICAgIFwKKyB8fCBFSUdFTl9GUkVFQlNEX01BTExPQ19BTFJFQURZX0FMSUdORUQKKyAgI2RlZmluZSBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVEIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAwCisjZW5kaWYKKworI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK0VJR0VOX0RFVklDRV9GVU5DIAoraW5saW5lIHZvaWQgdGhyb3dfc3RkX2JhZF9hbGxvYygpCit7CisgICNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgI2Vsc2UKKyAgICBzdGQ6OnNpemVfdCBodWdlID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KC0xKTsKKyAgICBuZXcgaW50W2h1Z2VdOworICAjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogSW1wbGVtZW50YXRpb24gb2YgaGFuZG1hZGUgYWxpZ25lZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLSBIYW5kIG1hZGUgaW1wbGVtZW50YXRpb25zIG9mIGFsaWduZWQgbWFsbG9jL2ZyZWUgYW5kIHJlYWxsb2MgLS0tLS0gKi8KKworLyoqIFxpbnRlcm5hbCBMaWtlIG1hbGxvYywgYnV0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgMTYtYnl0ZSBhbGlnbmVkLgorICAqIEZhc3QsIGJ1dCB3YXN0ZXMgMTYgYWRkaXRpb25hbCBieXRlcyBvZiBtZW1vcnkuIERvZXMgbm90IHRocm93IGFueSBleGNlcHRpb24uCisgICovCitpbmxpbmUgdm9pZCogaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2Moc3RkOjpzaXplX3Qgc2l6ZSkKK3sKKyAgdm9pZCAqb3JpZ2luYWwgPSBzdGQ6Om1hbGxvYyhzaXplK0VJR0VOX0RFRkFVTFRfQUxJR05fQllURVMpOworICBpZiAob3JpZ2luYWwgPT0gMCkgcmV0dXJuIDA7CisgIHZvaWQgKmFsaWduZWQgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4ob3JpZ2luYWwpICYgfihzdGQ6OnNpemVfdChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTLTEpKSkgKyBFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTKTsKKyAgKihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oYWxpZ25lZCkgLSAxKSA9IG9yaWdpbmFsOworICByZXR1cm4gYWxpZ25lZDsKK30KKworLyoqIFxpbnRlcm5hbCBGcmVlcyBtZW1vcnkgYWxsb2NhdGVkIHdpdGggaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MgKi8KK2lubGluZSB2b2lkIGhhbmRtYWRlX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgIGlmIChwdHIpIHN0ZDo6ZnJlZSgqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihwdHIpIC0gMSkpOworfQorCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFJlYWxsb2NhdGVzIGFsaWduZWQgbWVtb3J5LgorICAqIFNpbmNlIHdlIGtub3cgdGhhdCBvdXIgaGFuZG1hZGUgdmVyc2lvbiBpcyBiYXNlZCBvbiBzdGQ6Om1hbGxvYworICAqIHdlIGNhbiB1c2Ugc3RkOjpyZWFsbG9jIHRvIGltcGxlbWVudCBlZmZpY2llbnQgcmVhbGxvY2F0aW9uLgorICAqLworaW5saW5lIHZvaWQqIGhhbmRtYWRlX2FsaWduZWRfcmVhbGxvYyh2b2lkKiBwdHIsIHN0ZDo6c2l6ZV90IHNpemUsIHN0ZDo6c2l6ZV90ID0gMCkKK3sKKyAgaWYgKHB0ciA9PSAwKSByZXR1cm4gaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2Moc2l6ZSk7CisgIHZvaWQgKm9yaWdpbmFsID0gKihyZWludGVycHJldF9jYXN0PHZvaWQqKj4ocHRyKSAtIDEpOworICBzdGQ6OnB0cmRpZmZfdCBwcmV2aW91c19vZmZzZXQgPSBzdGF0aWNfY2FzdDxjaGFyICo+KHB0ciktc3RhdGljX2Nhc3Q8Y2hhciAqPihvcmlnaW5hbCk7CisgIG9yaWdpbmFsID0gc3RkOjpyZWFsbG9jKG9yaWdpbmFsLHNpemUrRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUyk7CisgIGlmIChvcmlnaW5hbCA9PSAwKSByZXR1cm4gMDsKKyAgdm9pZCAqYWxpZ25lZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KChyZWludGVycHJldF9jYXN0PHN0ZDo6c2l6ZV90PihvcmlnaW5hbCkgJiB+KHN0ZDo6c2l6ZV90KEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMtMSkpKSArIEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVMpOworICB2b2lkICpwcmV2aW91c19hbGlnbmVkID0gc3RhdGljX2Nhc3Q8Y2hhciAqPihvcmlnaW5hbCkrcHJldmlvdXNfb2Zmc2V0OworICBpZihhbGlnbmVkIT1wcmV2aW91c19hbGlnbmVkKQorICAgIHN0ZDo6bWVtbW92ZShhbGlnbmVkLCBwcmV2aW91c19hbGlnbmVkLCBzaXplKTsKKyAgCisgICoocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KGFsaWduZWQpIC0gMSkgPSBvcmlnaW5hbDsKKyAgcmV0dXJuIGFsaWduZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIHBvcnRhYmxlIGFsaWduZWQgdmVyc2lvbnMgb2YgbWFsbG9jL2ZyZWUvcmVhbGxvYyAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVJR0VOX05PX01BTExPQworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgY2hlY2tfdGhhdF9tYWxsb2NfaXNfYWxsb3dlZCgpCit7CisgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiaGVhcCBhbGxvY2F0aW9uIGlzIGZvcmJpZGRlbiAoRUlHRU5fTk9fTUFMTE9DIGlzIGRlZmluZWQpIik7Cit9CisjZWxpZiBkZWZpbmVkIEVJR0VOX1JVTlRJTUVfTk9fTUFMTE9DCitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKGJvb2wgdXBkYXRlLCBib29sIG5ld192YWx1ZSA9IGZhbHNlKQoreworICBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgIGlmICh1cGRhdGUgPT0gMSkKKyAgICB2YWx1ZSA9IG5ld192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOworfQorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgaXNfbWFsbG9jX2FsbG93ZWQoKSB7IHJldHVybiBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKGZhbHNlKTsgfQorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgc2V0X2lzX21hbGxvY19hbGxvd2VkKGJvb2wgbmV3X3ZhbHVlKSB7IHJldHVybiBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKHRydWUsIG5ld192YWx1ZSk7IH0KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIGNoZWNrX3RoYXRfbWFsbG9jX2lzX2FsbG93ZWQoKQoreworICBlaWdlbl9hc3NlcnQoaXNfbWFsbG9jX2FsbG93ZWQoKSAmJiAiaGVhcCBhbGxvY2F0aW9uIGlzIGZvcmJpZGRlbiAoRUlHRU5fUlVOVElNRV9OT19NQUxMT0MgaXMgZGVmaW5lZCBhbmQgZ19pc19tYWxsb2NfYWxsb3dlZCBpcyBmYWxzZSkiKTsKK30KKyNlbHNlIAorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgY2hlY2tfdGhhdF9tYWxsb2NfaXNfYWxsb3dlZCgpCit7fQorI2VuZGlmCisKKy8qKiBcaW50ZXJuYWwgQWxsb2NhdGVzIFxhIHNpemUgYnl0ZXMuIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSAxNiBvciAzMiBieXRlcyBhbGlnbm1lbnQgZGVwZW5kaW5nIG9uIHRoZSByZXF1aXJlbWVudHMuCisgICogT24gYWxsb2NhdGlvbiBlcnJvciwgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgbnVsbCwgYW5kIHN0ZDo6YmFkX2FsbG9jIGlzIHRocm93bi4KKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkKiBhbGlnbmVkX21hbGxvYyhzdGQ6OnNpemVfdCBzaXplKQoreworICBjaGVja190aGF0X21hbGxvY19pc19hbGxvd2VkKCk7CisKKyAgdm9pZCAqcmVzdWx0OworICAjaWYgKEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVM9PTApIHx8IEVJR0VOX01BTExPQ19BTFJFQURZX0FMSUdORUQKKyAgICByZXN1bHQgPSBzdGQ6Om1hbGxvYyhzaXplKTsKKyAgICAjaWYgRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUz09MTYKKyAgICBlaWdlbl9hc3NlcnQoKHNpemU8MTYgfHwgKHN0ZDo6c2l6ZV90KHJlc3VsdCklMTYpPT0wKSAmJiAiU3lzdGVtJ3MgbWFsbG9jIHJldHVybmVkIGFuIHVuYWxpZ25lZCBwb2ludGVyLiBDb21waWxlIHdpdGggRUlHRU5fTUFMTE9DX0FMUkVBRFlfQUxJR05FRD0wIHRvIGZhbGxiYWNrIHRvIGhhbmRtYWRlIGFsaWduZCBtZW1vcnkgYWxsb2NhdG9yLiIpOworICAgICNlbmRpZgorICAjZWxzZQorICAgIHJlc3VsdCA9IGhhbmRtYWRlX2FsaWduZWRfbWFsbG9jKHNpemUpOworICAjZW5kaWYKKworICBpZighcmVzdWx0ICYmIHNpemUpCisgICAgdGhyb3dfc3RkX2JhZF9hbGxvYygpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBcaW50ZXJuYWwgRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGFsaWduZWRfbWFsbG9jLiAqLworRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgI2lmIChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTPT0wKSB8fCBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgICAgc3RkOjpmcmVlKHB0cik7CisgICNlbHNlCisgICAgaGFuZG1hZGVfYWxpZ25lZF9mcmVlKHB0cik7CisgICNlbmRpZgorfQorCisvKioKKyAgKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgUmVhbGxvY2F0ZXMgYW4gYWxpZ25lZCBibG9jayBvZiBtZW1vcnkuCisgICogXHRocm93cyBzdGQ6OmJhZF9hbGxvYyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUKKyAgKi8KK2lubGluZSB2b2lkKiBhbGlnbmVkX3JlYWxsb2Modm9pZCAqcHRyLCBzdGQ6OnNpemVfdCBuZXdfc2l6ZSwgc3RkOjpzaXplX3Qgb2xkX3NpemUpCit7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvbGRfc2l6ZSk7CisKKyAgdm9pZCAqcmVzdWx0OworI2lmIChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTPT0wKSB8fCBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgIHJlc3VsdCA9IHN0ZDo6cmVhbGxvYyhwdHIsbmV3X3NpemUpOworI2Vsc2UKKyAgcmVzdWx0ID0gaGFuZG1hZGVfYWxpZ25lZF9yZWFsbG9jKHB0cixuZXdfc2l6ZSxvbGRfc2l6ZSk7CisjZW5kaWYKKworICBpZiAoIXJlc3VsdCAmJiBuZXdfc2l6ZSkKKyAgICB0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogSW1wbGVtZW50YXRpb24gb2YgY29uZGl0aW9uYWxseSBhbGlnbmVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGludGVybmFsIEFsbG9jYXRlcyBcYSBzaXplIGJ5dGVzLiBJZiBBbGlnbiBpcyB0cnVlLCB0aGVuIHRoZSByZXR1cm5lZCBwdHIgaXMgMTYtYnl0ZS1hbGlnbmVkLgorICAqIE9uIGFsbG9jYXRpb24gZXJyb3IsIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG51bGwsIGFuZCBhIHN0ZDo6YmFkX2FsbG9jIGlzIHRocm93bi4KKyAgKi8KK3RlbXBsYXRlPGJvb2wgQWxpZ24+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkKiBjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYyhzdGQ6OnNpemVfdCBzaXplKQoreworICByZXR1cm4gYWxpZ25lZF9tYWxsb2Moc2l6ZSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQqIGNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jPGZhbHNlPihzdGQ6OnNpemVfdCBzaXplKQoreworICBjaGVja190aGF0X21hbGxvY19pc19hbGxvd2VkKCk7CisKKyAgdm9pZCAqcmVzdWx0ID0gc3RkOjptYWxsb2Moc2l6ZSk7CisgIGlmKCFyZXN1bHQgJiYgc2l6ZSkKKyAgICB0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBcaW50ZXJuYWwgRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jICovCit0ZW1wbGF0ZTxib29sIEFsaWduPiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICBhbGlnbmVkX2ZyZWUocHRyKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8ZmFsc2U+KHZvaWQgKnB0cikKK3sKKyAgc3RkOjpmcmVlKHB0cik7Cit9CisKK3RlbXBsYXRlPGJvb2wgQWxpZ24+IGlubGluZSB2b2lkKiBjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2Modm9pZCogcHRyLCBzdGQ6OnNpemVfdCBuZXdfc2l6ZSwgc3RkOjpzaXplX3Qgb2xkX3NpemUpCit7CisgIHJldHVybiBhbGlnbmVkX3JlYWxsb2MocHRyLCBuZXdfc2l6ZSwgb2xkX3NpemUpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSB2b2lkKiBjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2M8ZmFsc2U+KHZvaWQqIHB0ciwgc3RkOjpzaXplX3QgbmV3X3NpemUsIHN0ZDo6c2l6ZV90KQoreworICByZXR1cm4gc3RkOjpyZWFsbG9jKHB0ciwgbmV3X3NpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBDb25zdHJ1Y3Rpb24vZGVzdHJ1Y3Rpb24gb2YgYXJyYXkgZWxlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcaW50ZXJuYWwgRGVzdHJ1Y3RzIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheS4KKyAgKiBUaGUgXGEgc2l6ZSBwYXJhbWV0ZXJzIHRlbGxzIG9uIGhvdyBtYW55IG9iamVjdHMgdG8gY2FsbCB0aGUgZGVzdHJ1Y3RvciBvZiBULgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHZvaWQgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkoVCAqcHRyLCBzdGQ6OnNpemVfdCBzaXplKQoreworICAvLyBhbHdheXMgZGVzdHJ1Y3QgYW4gYXJyYXkgc3RhcnRpbmcgZnJvbSB0aGUgZW5kLgorICBpZihwdHIpCisgICAgd2hpbGUoc2l6ZSkgcHRyWy0tc2l6ZV0uflQoKTsKK30KKworLyoqIFxpbnRlcm5hbCBDb25zdHJ1Y3RzIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheS4KKyAgKiBUaGUgXGEgc2l6ZSBwYXJhbWV0ZXIgdGVsbHMgb24gaG93IG1hbnkgb2JqZWN0cyB0byBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvZiBULgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFQqIGNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShUICpwdHIsIHN0ZDo6c2l6ZV90IHNpemUpCit7CisgIHN0ZDo6c2l6ZV90IGk7CisgIEVJR0VOX1RSWQorICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSA6Om5ldyAocHRyICsgaSkgVDsKKyAgICAgIHJldHVybiBwdHI7CisgIH0KKyAgRUlHRU5fQ0FUQ0goLi4uKQorICB7CisgICAgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocHRyLCBpKTsKKyAgICBFSUdFTl9USFJPVzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogSW1wbGVtZW50YXRpb24gb2YgYWxpZ25lZCBuZXcvZGVsZXRlLWxpa2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIGNoZWNrX3NpemVfZm9yX292ZXJmbG93KHN0ZDo6c2l6ZV90IHNpemUpCit7CisgIGlmKHNpemUgPiBzdGQ6OnNpemVfdCgtMSkgLyBzaXplb2YoVCkpCisgICAgdGhyb3dfc3RkX2JhZF9hbGxvYygpOworfQorCisvKiogXGludGVybmFsIEFsbG9jYXRlcyBcYSBzaXplIG9iamVjdHMgb2YgdHlwZSBULiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBndWFyYW50ZWVkIHRvIGhhdmUgMTYgYnl0ZXMgYWxpZ25tZW50LgorICAqIE9uIGFsbG9jYXRpb24gZXJyb3IsIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHVuZGVmaW5lZCwgYnV0IGEgc3RkOjpiYWRfYWxsb2MgaXMgdGhyb3duLgorICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFQgaXMgY2FsbGVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFQqIGFsaWduZWRfbmV3KHN0ZDo6c2l6ZV90IHNpemUpCit7CisgIGNoZWNrX3NpemVfZm9yX292ZXJmbG93PFQ+KHNpemUpOworICBUICpyZXN1bHQgPSByZWludGVycHJldF9jYXN0PFQqPihhbGlnbmVkX21hbGxvYyhzaXplb2YoVCkqc2l6ZSkpOworICBFSUdFTl9UUlkKKyAgeworICAgIHJldHVybiBjb25zdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocmVzdWx0LCBzaXplKTsKKyAgfQorICBFSUdFTl9DQVRDSCguLi4pCisgIHsKKyAgICBhbGlnbmVkX2ZyZWUocmVzdWx0KTsKKyAgICBFSUdFTl9USFJPVzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVCogY29uZGl0aW9uYWxfYWxpZ25lZF9uZXcoc3RkOjpzaXplX3Qgc2l6ZSkKK3sKKyAgY2hlY2tfc2l6ZV9mb3Jfb3ZlcmZsb3c8VD4oc2l6ZSk7CisgIFQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jPEFsaWduPihzaXplb2YoVCkqc2l6ZSkpOworICBFSUdFTl9UUlkKKyAgeworICAgIHJldHVybiBjb25zdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocmVzdWx0LCBzaXplKTsKKyAgfQorICBFSUdFTl9DQVRDSCguLi4pCisgIHsKKyAgICBjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8QWxpZ24+KHJlc3VsdCk7CisgICAgRUlHRU5fVEhST1c7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIFxpbnRlcm5hbCBEZWxldGVzIG9iamVjdHMgY29uc3RydWN0ZWQgd2l0aCBhbGlnbmVkX25ldworICAqIFRoZSBcYSBzaXplIHBhcmFtZXRlcnMgdGVsbHMgb24gaG93IG1hbnkgb2JqZWN0cyB0byBjYWxsIHRoZSBkZXN0cnVjdG9yIG9mIFQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBhbGlnbmVkX2RlbGV0ZShUICpwdHIsIHN0ZDo6c2l6ZV90IHNpemUpCit7CisgIGRlc3RydWN0X2VsZW1lbnRzX29mX2FycmF5PFQ+KHB0ciwgc2l6ZSk7CisgIGFsaWduZWRfZnJlZShwdHIpOworfQorCisvKiogXGludGVybmFsIERlbGV0ZXMgb2JqZWN0cyBjb25zdHJ1Y3RlZCB3aXRoIGNvbmRpdGlvbmFsX2FsaWduZWRfbmV3CisgICogVGhlIFxhIHNpemUgcGFyYW1ldGVycyB0ZWxscyBvbiBob3cgbWFueSBvYmplY3RzIHRvIGNhbGwgdGhlIGRlc3RydWN0b3Igb2YgVC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQWxpZ24+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIGNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlKFQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkKK3sKKyAgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXk8VD4ocHRyLCBzaXplKTsKKyAgY29uZGl0aW9uYWxfYWxpZ25lZF9mcmVlPEFsaWduPihwdHIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVCogY29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ldyhUKiBwdHMsIHN0ZDo6c2l6ZV90IG5ld19zaXplLCBzdGQ6OnNpemVfdCBvbGRfc2l6ZSkKK3sKKyAgY2hlY2tfc2l6ZV9mb3Jfb3ZlcmZsb3c8VD4obmV3X3NpemUpOworICBjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihvbGRfc2l6ZSk7CisgIGlmKG5ld19zaXplIDwgb2xkX3NpemUpCisgICAgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocHRzK25ld19zaXplLCBvbGRfc2l6ZS1uZXdfc2l6ZSk7CisgIFQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvYzxBbGlnbj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocHRzKSwgc2l6ZW9mKFQpKm5ld19zaXplLCBzaXplb2YoVCkqb2xkX3NpemUpKTsKKyAgaWYobmV3X3NpemUgPiBvbGRfc2l6ZSkKKyAgeworICAgIEVJR0VOX1RSWQorICAgIHsKKyAgICAgIGNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShyZXN1bHQrb2xkX3NpemUsIG5ld19zaXplLW9sZF9zaXplKTsKKyAgICB9CisgICAgRUlHRU5fQ0FUQ0goLi4uKQorICAgIHsKKyAgICAgIGNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxBbGlnbj4ocmVzdWx0KTsKKyAgICAgIEVJR0VOX1RIUk9XOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQWxpZ24+IEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUKiBjb25kaXRpb25hbF9hbGlnbmVkX25ld19hdXRvKHN0ZDo6c2l6ZV90IHNpemUpCit7CisgIGlmKHNpemU9PTApCisgICAgcmV0dXJuIDA7IC8vIHNob3J0LWN1dC4gQWxzbyBmaXhlcyBCdWcgODg0CisgIGNoZWNrX3NpemVfZm9yX292ZXJmbG93PFQ+KHNpemUpOworICBUICpyZXN1bHQgPSByZWludGVycHJldF9jYXN0PFQqPihjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxBbGlnbj4oc2l6ZW9mKFQpKnNpemUpKTsKKyAgaWYoTnVtVHJhaXRzPFQ+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24pCisgIHsKKyAgICBFSUdFTl9UUlkKKyAgICB7CisgICAgICBjb25zdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocmVzdWx0LCBzaXplKTsKKyAgICB9CisgICAgRUlHRU5fQ0FUQ0goLi4uKQorICAgIHsKKyAgICAgIGNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxBbGlnbj4ocmVzdWx0KTsKKyAgICAgIEVJR0VOX1RIUk9XOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBpbmxpbmUgVCogY29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ld19hdXRvKFQqIHB0cywgc3RkOjpzaXplX3QgbmV3X3NpemUsIHN0ZDo6c2l6ZV90IG9sZF9zaXplKQoreworICBjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihuZXdfc2l6ZSk7CisgIGNoZWNrX3NpemVfZm9yX292ZXJmbG93PFQ+KG9sZF9zaXplKTsKKyAgaWYoTnVtVHJhaXRzPFQ+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24gJiYgKG5ld19zaXplIDwgb2xkX3NpemUpKQorICAgIGRlc3RydWN0X2VsZW1lbnRzX29mX2FycmF5KHB0cytuZXdfc2l6ZSwgb2xkX3NpemUtbmV3X3NpemUpOworICBUICpyZXN1bHQgPSByZWludGVycHJldF9jYXN0PFQqPihjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2M8QWxpZ24+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHB0cyksIHNpemVvZihUKSpuZXdfc2l6ZSwgc2l6ZW9mKFQpKm9sZF9zaXplKSk7CisgIGlmKE51bVRyYWl0czxUPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uICYmIChuZXdfc2l6ZSA+IG9sZF9zaXplKSkKKyAgeworICAgIEVJR0VOX1RSWQorICAgIHsKKyAgICAgIGNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShyZXN1bHQrb2xkX3NpemUsIG5ld19zaXplLW9sZF9zaXplKTsKKyAgICB9CisgICAgRUlHRU5fQ0FUQ0goLi4uKQorICAgIHsKKyAgICAgIGNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxBbGlnbj4ocmVzdWx0KTsKKyAgICAgIEVJR0VOX1RIUk9XOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvKFQgKnB0ciwgc3RkOjpzaXplX3Qgc2l6ZSkKK3sKKyAgaWYoTnVtVHJhaXRzPFQ+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24pCisgICAgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXk8VD4ocHRyLCBzaXplKTsKKyAgY29uZGl0aW9uYWxfYWxpZ25lZF9mcmVlPEFsaWduPihwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxpbnRlcm5hbCBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhhdCBpcyB3ZWxsIGFsaWduZWQgd2l0aCByZXNwZWN0IHRvIHRoZSByZXF1ZXN0ZWQgXGEgQWxpZ25tZW50LgorICAqCisgICogXHRwYXJhbSBBbGlnbm1lbnQgcmVxdWVzdGVkIGFsaWdubWVudCBpbiBCeXRlcy4KKyAgKiBccGFyYW0gYXJyYXkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheQorICAqIFxwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBhcnJheQorICAqCisgICogXG5vdGUgSWYgbm8gZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgd2VsbCBhbGlnbmVkIG9yIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgc2NhbGFyLAorICAqIHRoZSBzaXplIG9mIHRoZSBhcnJheSBpcyByZXR1cm5lZC4gRm9yIGV4YW1wbGUgd2l0aCBTU0UsIHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIHR5cGljYWxseSAxNi1ieXRlcy4gSWYKKyAgKiBwYWNrZXQgc2l6ZSBmb3IgdGhlIGdpdmVuIHNjYWxhciB0eXBlIGlzIDEsIHRoZW4gZXZlcnl0aGluZyBpcyBjb25zaWRlcmVkIHdlbGwtYWxpZ25lZC4KKyAgKgorICAqIFxub3RlIE90aGVyd2lzZSwgaWYgdGhlIEFsaWdubWVudCBpcyBsYXJnZXIgdGhhdCB0aGUgc2NhbGFyIHNpemUsIHdlIHJlbHkgb24gdGhlIGFzc3VtcHRpb25zIHRoYXQgc2l6ZW9mKFNjYWxhcikgaXMgYQorICAqIHBvd2VyIG9mIDIuIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBkbyBub3QgYXNzdW1lIHRoYXQgdGhlIGFycmF5IGFkZHJlc3MgaXMgYSBtdWx0aXBsZSBvZiBzaXplb2YoU2NhbGFyKSwgYXMgdGhhdCBmYWlscyBmb3IKKyAgKiBleGFtcGxlIHdpdGggU2NhbGFyPWRvdWJsZSBvbiBjZXJ0YWluIDMyLWJpdCBwbGF0Zm9ybXMsIHNlZSBidWcgIzc5LgorICAqCisgICogVGhlcmUgaXMgYWxzbyB0aGUgdmFyaWFudCBmaXJzdF9hbGlnbmVkKGNvbnN0IE1hdHJpeEJhc2UmKSBkZWZpbmVkIGluIERlbnNlQ29lZmZzQmFzZS5oLgorICAqIFxzYSBmaXJzdF9kZWZhdWx0X2FsaWduZWQoKQorICAqLwordGVtcGxhdGU8aW50IEFsaWdubWVudCwgdHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBmaXJzdF9hbGlnbmVkKGNvbnN0IFNjYWxhciogYXJyYXksIEluZGV4IHNpemUpCit7CisgIGNvbnN0IEluZGV4IFNjYWxhclNpemUgPSBzaXplb2YoU2NhbGFyKTsKKyAgY29uc3QgSW5kZXggQWxpZ25tZW50U2l6ZSA9IEFsaWdubWVudCAvIFNjYWxhclNpemU7CisgIGNvbnN0IEluZGV4IEFsaWdubWVudE1hc2sgPSBBbGlnbm1lbnRTaXplLTE7CisKKyAgaWYoQWxpZ25tZW50U2l6ZTw9MSkKKyAgeworICAgIC8vIEVpdGhlciB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBpZiBzbWFsbGVyIHRoYW4gYSBzY2FsYXIsIG9yIGl0IGV4YWN0bHkgbWF0Y2ggYSAxIHNjYWxhcgorICAgIC8vIHNvIHRoYXQgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIGFsaWdubWVudC4KKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKCAoVUludFB0cihhcnJheSkgJiAoc2l6ZW9mKFNjYWxhciktMSkpIHx8IChBbGlnbm1lbnQlU2NhbGFyU2l6ZSkhPTApCisgIHsKKyAgICAvLyBUaGUgYXJyYXkgaXMgbm90IGFsaWduZWQgdG8gdGhlIHNpemUgb2YgYSBzaW5nbGUgc2NhbGFyLCBvciB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgc2NhbGFyIHNpemUuCisgICAgLy8gQ29uc2VxdWVudGx5LCBubyBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyB3ZWxsIGFsaWduZWQuCisgICAgcmV0dXJuIHNpemU7CisgIH0KKyAgZWxzZQorICB7CisgICAgSW5kZXggZmlyc3QgPSAoQWxpZ25tZW50U2l6ZSAtIChJbmRleCgoVUludFB0cihhcnJheSkvc2l6ZW9mKFNjYWxhcikpKSAmIEFsaWdubWVudE1hc2spKSAmIEFsaWdubWVudE1hc2s7CisgICAgcmV0dXJuIChmaXJzdCA8IHNpemUpID8gZmlyc3QgOiBzaXplOworICB9Cit9CisKKy8qKiBcaW50ZXJuYWwgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoYXQgaXMgd2VsbCBhbGlnbmVkIHdpdGggcmVzcGVjdCB0aGUgbGFyZ2VzdCBwYWNrZXQgcmVxdWlyZW1lbnQuCisgICAqIFxzYSBmaXJzdF9hbGlnbmVkKFNjYWxhciosSW5kZXgpIGFuZCBmaXJzdF9kZWZhdWx0X2FsaWduZWQoRGVuc2VCYXNlPERlcml2ZWQ+KSAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBmaXJzdF9kZWZhdWx0X2FsaWduZWQoY29uc3QgU2NhbGFyKiBhcnJheSwgSW5kZXggc2l6ZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgRGVmYXVsdFBhY2tldFR5cGU7CisgIHJldHVybiBmaXJzdF9hbGlnbmVkPHVucGFja2V0X3RyYWl0czxEZWZhdWx0UGFja2V0VHlwZT46OmFsaWdubWVudD4oYXJyYXksIHNpemUpOworfQorCisvKiogXGludGVybmFsIFJldHVybnMgdGhlIHNtYWxsZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgXGEgYmFzZSBhbmQgZ3JlYXRlciBvciBlcXVhbCB0byBcYSBzaXplCisgICovIAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+IAoraW5saW5lIEluZGV4IGZpcnN0X211bHRpcGxlKEluZGV4IHNpemUsIEluZGV4IGJhc2UpCit7CisgIHJldHVybiAoKHNpemUrYmFzZS0xKS9iYXNlKSpiYXNlOworfQorCisvLyBzdGQ6OmNvcHkgaXMgbXVjaCBzbG93ZXIgdGhhbiBtZW1jcHksIHNvIGxldCdzIGludHJvZHVjZSBhIHNtYXJ0X2NvcHkgd2hpY2gKKy8vIHVzZSBtZW1jcHkgb24gdHJpdmlhbCB0eXBlcywgaS5lLiwgb24gdHlwZXMgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemF0aW9uIGN0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIFVzZU1lbWNweT4gc3RydWN0IHNtYXJ0X2NvcHlfaGVscGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHNtYXJ0X2NvcHkoY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQoreworICBzbWFydF9jb3B5X2hlbHBlcjxULCFOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbj46OnJ1bihzdGFydCwgZW5kLCB0YXJnZXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc21hcnRfY29weV9oZWxwZXI8VCx0cnVlPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQorICB7CisgICAgSW50UHRyIHNpemUgPSBJbnRQdHIoZW5kKS1JbnRQdHIoc3RhcnQpOworICAgIGlmKHNpemU9PTApIHJldHVybjsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc3RhcnQhPTAgJiYgZW5kIT0wICYmIHRhcmdldCE9MCk7CisgICAgbWVtY3B5KHRhcmdldCwgc3RhcnQsIHNpemUpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc21hcnRfY29weV9oZWxwZXI8VCxmYWxzZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IFQqIHN0YXJ0LCBjb25zdCBUKiBlbmQsIFQqIHRhcmdldCkKKyAgeyBzdGQ6OmNvcHkoc3RhcnQsIGVuZCwgdGFyZ2V0KTsgfQorfTsKKworLy8gaW50ZWxsaWdlbnQgbWVtbW92ZS4gZmFsbHMgYmFjayB0byBzdGQ6Om1lbW1vdmUgZm9yIFBPRCB0eXBlcywgdXNlcyBzdGQ6OmNvcHkgb3RoZXJ3aXNlLiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgVXNlTWVtbW92ZT4gc3RydWN0IHNtYXJ0X21lbW1vdmVfaGVscGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHNtYXJ0X21lbW1vdmUoY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQoreworICBzbWFydF9tZW1tb3ZlX2hlbHBlcjxULCFOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbj46OnJ1bihzdGFydCwgZW5kLCB0YXJnZXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc21hcnRfbWVtbW92ZV9oZWxwZXI8VCx0cnVlPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQorICB7CisgICAgSW50UHRyIHNpemUgPSBJbnRQdHIoZW5kKS1JbnRQdHIoc3RhcnQpOworICAgIGlmKHNpemU9PTApIHJldHVybjsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc3RhcnQhPTAgJiYgZW5kIT0wICYmIHRhcmdldCE9MCk7CisgICAgc3RkOjptZW1tb3ZlKHRhcmdldCwgc3RhcnQsIHNpemUpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc21hcnRfbWVtbW92ZV9oZWxwZXI8VCxmYWxzZT4geworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IFQqIHN0YXJ0LCBjb25zdCBUKiBlbmQsIFQqIHRhcmdldCkKKyAgeyAKKyAgICBpZiAoVUludFB0cih0YXJnZXQpIDwgVUludFB0cihzdGFydCkpCisgICAgeworICAgICAgc3RkOjpjb3B5KHN0YXJ0LCBlbmQsIHRhcmdldCk7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB7CisgICAgICBzdGQ6OnB0cmRpZmZfdCBjb3VudCA9IChzdGQ6OnB0cmRpZmZfdChlbmQpLXN0ZDo6cHRyZGlmZl90KHN0YXJ0KSkgLyBzaXplb2YoVCk7CisgICAgICBzdGQ6OmNvcHlfYmFja3dhcmQoc3RhcnQsIGVuZCwgdGFyZ2V0ICsgY291bnQpOyAKKyAgICB9CisgIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogSW1wbGVtZW50YXRpb24gb2YgcnVudGltZSBzdGFjayBhbGxvY2F0aW9uIChmYWxsaW5nIGJhY2sgdG8gbWFsbG9jKSAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyB5b3UgY2FuIG92ZXJ3cml0ZSBFaWdlbidzIGRlZmF1bHQgYmVoYXZpb3IgcmVnYXJkaW5nIGFsbG9jYSBieSBkZWZpbmluZyBFSUdFTl9BTExPQ0EKKy8vIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGFjayBhbGxvY2F0aW9uIGZ1bmN0aW9uCisjaWZuZGVmIEVJR0VOX0FMTE9DQQorICAjaWYgRUlHRU5fT1NfTElOVVggfHwgRUlHRU5fT1NfTUFDIHx8IChkZWZpbmVkIGFsbG9jYSkKKyAgICAjZGVmaW5lIEVJR0VOX0FMTE9DQSBhbGxvY2EKKyAgI2VsaWYgRUlHRU5fQ09NUF9NU1ZDCisgICAgI2RlZmluZSBFSUdFTl9BTExPQ0EgX2FsbG9jYQorICAjZW5kaWYKKyNlbmRpZgorCisvLyBUaGlzIGhlbHBlciBjbGFzcyBjb25zdHJ1Y3QgdGhlIGFsbG9jYXRlZCBtZW1vcnksIGFuZCB0YWtlcyBjYXJlIG9mIGRlc3RydWN0aW5nIGFuZCBmcmVlaW5nIHRoZSBoYW5kbGVkIGRhdGEKKy8vIGF0IGRlc3RydWN0aW9uIHRpbWUuIEluIHByYWN0aWNlIHRoaXMgaGVscGVyIGNsYXNzIGlzIG1haW5seSB1c2VmdWwgdG8gYXZvaWQgbWVtb3J5IGxlYWsgaW4gY2FzZSBvZiBleGNlcHRpb25zLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgYWxpZ25lZF9zdGFja19tZW1vcnlfaGFuZGxlciA6IG5vbmNvcHlhYmxlCit7CisgIHB1YmxpYzoKKyAgICAvKiBDcmVhdGVzIGEgc3RhY2tfbWVtb3J5X2hhbmRsZXIgcmVzcG9uc2libGUgZm9yIHRoZSBidWZmZXIgXGEgcHRyIG9mIHNpemUgXGEgc2l6ZS4KKyAgICAgKiBOb3RlIHRoYXQgXGEgcHRyIGNhbiBiZSAwIHJlZ2FyZGxlc3Mgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMuCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBjYXJlIG9mIGNvbnN0cnVjdGluZy9pbml0aWFsaXppbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBidWZmZXIgaWYgcmVxdWlyZWQgYnkgdGhlIHNjYWxhciB0eXBlIFQgKHNlZSBOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbikuCisgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGVsZW1lbnRzIHdpbGwgYWxzbyBiZSBkZXN0cnVjdGVkIHdoZW4gdGhpcyBoYW5kbGVyIHdpbGwgYmUgZGVzdHJ1Y3RlZC4KKyAgICAgKiBGaW5hbGx5LCBpZiBcYSBkZWFsbG9jIGlzIHRydWUsIHRoZW4gdGhlIHBvaW50ZXIgXGEgcHRyIGlzIGZyZWVkLgorICAgICAqKi8KKyAgICBhbGlnbmVkX3N0YWNrX21lbW9yeV9oYW5kbGVyKFQqIHB0ciwgc3RkOjpzaXplX3Qgc2l6ZSwgYm9vbCBkZWFsbG9jKQorICAgICAgOiBtX3B0cihwdHIpLCBtX3NpemUoc2l6ZSksIG1fZGVhbGxvY2F0ZShkZWFsbG9jKQorICAgIHsKKyAgICAgIGlmKE51bVRyYWl0czxUPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uICYmIG1fcHRyKQorICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OmNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShtX3B0ciwgc2l6ZSk7CisgICAgfQorICAgIH5hbGlnbmVkX3N0YWNrX21lbW9yeV9oYW5kbGVyKCkKKyAgICB7CisgICAgICBpZihOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbiAmJiBtX3B0cikKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpkZXN0cnVjdF9lbGVtZW50c19vZl9hcnJheTxUPihtX3B0ciwgbV9zaXplKTsKKyAgICAgIGlmKG1fZGVhbGxvY2F0ZSkKKyAgICAgICAgRWlnZW46OmludGVybmFsOjphbGlnbmVkX2ZyZWUobV9wdHIpOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIFQqIG1fcHRyOworICAgIHN0ZDo6c2l6ZV90IG1fc2l6ZTsKKyAgICBib29sIG1fZGVhbGxvY2F0ZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHNjb3BlZF9hcnJheSA6IG5vbmNvcHlhYmxlCit7CisgIFQqIG1fcHRyOworcHVibGljOgorICBleHBsaWNpdCBzY29wZWRfYXJyYXkoc3RkOjpwdHJkaWZmX3Qgc2l6ZSkKKyAgeworICAgIG1fcHRyID0gbmV3IFRbc2l6ZV07CisgIH0KKyAgfnNjb3BlZF9hcnJheSgpCisgIHsKKyAgICBkZWxldGVbXSBtX3B0cjsKKyAgfQorICBUJiBvcGVyYXRvcltdKHN0ZDo6cHRyZGlmZl90IGkpIHsgcmV0dXJuIG1fcHRyW2ldOyB9CisgIGNvbnN0IFQmIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgaSkgY29uc3QgeyByZXR1cm4gbV9wdHJbaV07IH0KKyAgVCogJnB0cigpIHsgcmV0dXJuIG1fcHRyOyB9CisgIGNvbnN0IFQqIHB0cigpIGNvbnN0IHsgcmV0dXJuIG1fcHRyOyB9CisgIG9wZXJhdG9yIGNvbnN0IFQqKCkgY29uc3QgeyByZXR1cm4gbV9wdHI7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgc3dhcChzY29wZWRfYXJyYXk8VD4gJmEsc2NvcGVkX2FycmF5PFQ+ICZiKQoreworICBzdGQ6OnN3YXAoYS5wdHIoKSxiLnB0cigpKTsKK30KKyAgICAKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGludGVybmFsCisgICogRGVjbGFyZXMsIGFsbG9jYXRlcyBhbmQgY29uc3RydWN0IGFuIGFsaWduZWQgYnVmZmVyIG5hbWVkIE5BTUUgb2YgU0laRSBlbGVtZW50cyBvZiB0eXBlIFRZUEUgb24gdGhlIHN0YWNrCisgICogaWYgU0laRSBpcyBzbWFsbGVyIHRoYW4gRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCwgYW5kIGlmIHN0YWNrIGFsbG9jYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybQorICAqIChjdXJyZW50bHksIHRoaXMgaXMgTGludXggYW5kIFZpc3VhbCBTdHVkaW8gb25seSkuIE90aGVyd2lzZSB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4KKyAgKiBUaGUgYWxsb2NhdGVkIGJ1ZmZlciBpcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgd2hlbiBleGl0aW5nIHRoZSBzY29wZSBvZiB0aGlzIGRlY2xhcmF0aW9uLgorICAqIElmIEJVRkZFUiBpcyBub24gbnVsbCwgdGhlbiB0aGUgZGVjbGFyZWQgdmFyaWFibGUgaXMgc2ltcGx5IGFuIGFsaWFzIGZvciBCVUZGRVIsIGFuZCBubyBhbGxvY2F0aW9uL2RlbGV0aW9uIG9jY3Vycy4KKyAgKiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICogXGNvZGUKKyAgKiB7CisgICogICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoZmxvYXQsZGF0YSxzaXplLDApOworICAqICAgLy8gdXNlIGRhdGFbMF0gdG8gZGF0YVtzaXplLTFdCisgICogfQorICAqIFxlbmRjb2RlCisgICogVGhlIHVuZGVybHlpbmcgc3RhY2sgYWxsb2NhdGlvbiBmdW5jdGlvbiBjYW4gY29udHJvbGxlZCB3aXRoIHRoZSBFSUdFTl9BTExPQ0EgcHJlcHJvY2Vzc29yIHRva2VuLgorICAqLworI2lmZGVmIEVJR0VOX0FMTE9DQQorICAKKyAgI2lmIEVJR0VOX0RFRkFVTFRfQUxJR05fQllURVM+MAorICAgIC8vIFdlIGFsd2F5cyBtYW51YWxseSByZS1hbGlnbiB0aGUgcmVzdWx0IG9mIEVJR0VOX0FMTE9DQS4KKyAgICAvLyBJZiBhbGxvY2EgaXMgYWxyZWFkeSBhbGlnbmVkLCB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIHNtYXJ0IGVub3VnaCB0byBvcHRpbWl6ZSBhd2F5IHRoZSByZS1hbGlnbm1lbnQuCisgICAgI2RlZmluZSBFSUdFTl9BTElHTkVEX0FMTE9DQShTSVpFKSByZWludGVycHJldF9jYXN0PHZvaWQqPigoaW50ZXJuYWw6OlVJbnRQdHIoRUlHRU5fQUxMT0NBKFNJWkUrRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUy0xKSkgKyBFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTLTEpICYgfihzdGQ6OnNpemVfdChFSUdFTl9ERUZBVUxUX0FMSUdOX0JZVEVTLTEpKSkKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0FMSUdORURfQUxMT0NBKFNJWkUpIEVJR0VOX0FMTE9DQShTSVpFKQorICAjZW5kaWYKKworICAjZGVmaW5lIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShUWVBFLE5BTUUsU0laRSxCVUZGRVIpIFwKKyAgICBFaWdlbjo6aW50ZXJuYWw6OmNoZWNrX3NpemVfZm9yX292ZXJmbG93PFRZUEU+KFNJWkUpOyBcCisgICAgVFlQRSogTkFNRSA9IChCVUZGRVIpIT0wID8gKEJVRkZFUikgXAorICAgICAgICAgICAgICAgOiByZWludGVycHJldF9jYXN0PFRZUEUqPiggXAorICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVFlQRSkqU0laRTw9RUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCkgPyBFSUdFTl9BTElHTkVEX0FMTE9DQShzaXplb2YoVFlQRSkqU0laRSkgXAorICAgICAgICAgICAgICAgICAgICA6IEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2Moc2l6ZW9mKFRZUEUpKlNJWkUpICk7ICBcCisgICAgRWlnZW46OmludGVybmFsOjphbGlnbmVkX3N0YWNrX21lbW9yeV9oYW5kbGVyPFRZUEU+IEVJR0VOX0NBVChOQU1FLF9zdGFja19tZW1vcnlfZGVzdHJ1Y3RvcikoKEJVRkZFUik9PTAgPyBOQU1FIDogMCxTSVpFLHNpemVvZihUWVBFKSpTSVpFPkVJR0VOX1NUQUNLX0FMTE9DQVRJT05fTElNSVQpCisKKyNlbHNlCisKKyAgI2RlZmluZSBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoVFlQRSxOQU1FLFNJWkUsQlVGRkVSKSBcCisgICAgRWlnZW46OmludGVybmFsOjpjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUWVBFPihTSVpFKTsgXAorICAgIFRZUEUqIE5BTUUgPSAoQlVGRkVSKSE9MCA/IEJVRkZFUiA6IHJlaW50ZXJwcmV0X2Nhc3Q8VFlQRSo+KEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2Moc2l6ZW9mKFRZUEUpKlNJWkUpKTsgICAgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9zdGFja19tZW1vcnlfaGFuZGxlcjxUWVBFPiBFSUdFTl9DQVQoTkFNRSxfc3RhY2tfbWVtb3J5X2Rlc3RydWN0b3IpKChCVUZGRVIpPT0wID8gTkFNRSA6IDAsU0laRSx0cnVlKQorICAgIAorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogSW1wbGVtZW50YXRpb24gb2YgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVyBbX0lGXSAgICAgICAgICAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTIT0wCisgICNkZWZpbmUgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19OT1RIUk9XKE5lZWRzVG9BbGlnbikgXAorICAgICAgdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgRUlHRU5fTk9fVEhST1cgeyBcCisgICAgICAgIEVJR0VOX1RSWSB7IHJldHVybiBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jPE5lZWRzVG9BbGlnbj4oc2l6ZSk7IH0gXAorICAgICAgICBFSUdFTl9DQVRDSCAoLi4uKSB7IHJldHVybiAwOyB9IFwKKyAgICAgIH0KKyAgI2RlZmluZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKE5lZWRzVG9BbGlnbikgXAorICAgICAgdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHNpemUpIHsgXAorICAgICAgICByZXR1cm4gRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxOZWVkc1RvQWxpZ24+KHNpemUpOyBcCisgICAgICB9IFwKKyAgICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IHNpemUpIHsgXAorICAgICAgICByZXR1cm4gRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxOZWVkc1RvQWxpZ24+KHNpemUpOyBcCisgICAgICB9IFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiBwdHIpIEVJR0VOX05PX1RIUk9XIHsgRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8TmVlZHNUb0FsaWduPihwdHIpOyB9IFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqIHB0cikgRUlHRU5fTk9fVEhST1cgeyBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxOZWVkc1RvQWxpZ24+KHB0cik7IH0gXAorICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqIHB0ciwgc3RkOjpzaXplX3QgLyogc3ogKi8pIEVJR0VOX05PX1RIUk9XIHsgRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8TmVlZHNUb0FsaWduPihwdHIpOyB9IFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqIHB0ciwgc3RkOjpzaXplX3QgLyogc3ogKi8pIEVJR0VOX05PX1RIUk9XIHsgRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8TmVlZHNUb0FsaWduPihwdHIpOyB9IFwKKyAgICAgIC8qIGluLXBsYWNlIG5ldyBhbmQgZGVsZXRlLiBzaW5jZSAoYXQgbGVhc3QgYWZhaWspIHRoZXJlIGlzIG5vIGFjdHVhbCAgICovIFwKKyAgICAgIC8qIG1lbW9yeSBhbGxvY2F0ZWQgd2UgY2FuIHNhZmVseSBsZXQgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFuZGxlICovIFwKKyAgICAgIC8qIHRoaXMgcGFydGljdWxhciBjYXNlLiAqLyBcCisgICAgICBzdGF0aWMgdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHNpemUsIHZvaWQgKnB0cikgeyByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSxwdHIpOyB9IFwKKyAgICAgIHN0YXRpYyB2b2lkICpvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCBzaXplLCB2b2lkKiBwdHIpIHsgcmV0dXJuIDo6b3BlcmF0b3IgbmV3W10oc2l6ZSxwdHIpOyB9IFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiBtZW1vcnksIHZvaWQgKnB0cikgRUlHRU5fTk9fVEhST1cgeyByZXR1cm4gOjpvcGVyYXRvciBkZWxldGUobWVtb3J5LHB0cik7IH0gXAorICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICogbWVtb3J5LCB2b2lkICpwdHIpIEVJR0VOX05PX1RIUk9XIHsgcmV0dXJuIDo6b3BlcmF0b3IgZGVsZXRlW10obWVtb3J5LHB0cik7IH0gXAorICAgICAgLyogbm90aHJvdy1uZXcgKHJldHVybnMgemVybyBpbnN0ZWFkIG9mIHN0ZDo6YmFkX2FsbG9jKSAqLyBcCisgICAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX05PVEhST1coTmVlZHNUb0FsaWduKSBcCisgICAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwdHIsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgRUlHRU5fTk9fVEhST1cgeyBcCisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9mcmVlPE5lZWRzVG9BbGlnbj4ocHRyKTsgXAorICAgICAgfSBcCisgICAgICB0eXBlZGVmIHZvaWQgZWlnZW5fYWxpZ25lZF9vcGVyYXRvcl9uZXdfbWFya2VyX3R5cGU7CisjZWxzZQorICAjZGVmaW5lIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUYoTmVlZHNUb0FsaWduKQorI2VuZGlmCisKKyNkZWZpbmUgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVyBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKHRydWUpCisjZGVmaW5lIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoU2NhbGFyLFNpemUpIFwKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihib29sKCgoU2l6ZSkhPUVpZ2VuOjpEeW5hbWljKSAmJiAoKHNpemVvZihTY2FsYXIpKihTaXplKSklRUlHRU5fTUFYX0FMSUdOX0JZVEVTPT0wKSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGNsYXNzIGFsaWduZWRfYWxsb2NhdG9yCisqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisqCisqIFxicmllZiBTVEwgY29tcGF0aWJsZSBhbGxvY2F0b3IgdG8gdXNlIHdpdGggd2l0aCAxNiBieXRlIGFsaWduZWQgdHlwZXMKKyoKKyogRXhhbXBsZToKKyogXGNvZGUKKyogLy8gTWF0cml4NGYgcmVxdWlyZXMgMTYgYnl0ZXMgYWxpZ25tZW50OgorKiBzdGQ6Om1hcDwgaW50LCBNYXRyaXg0Ziwgc3RkOjpsZXNzPGludD4sIAorKiAgICAgICAgICAgYWxpZ25lZF9hbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IGludCwgTWF0cml4NGY+ID4gPiBteV9tYXBfbWF0NDsKKyogLy8gVmVjdG9yM2YgZG9lcyBub3QgcmVxdWlyZSAxNiBieXRlcyBhbGlnbm1lbnQsIG5vIG5lZWQgdG8gdXNlIEVpZ2VuJ3MgYWxsb2NhdG9yOgorKiBzdGQ6Om1hcDwgaW50LCBWZWN0b3IzZiA+IG15X21hcF92ZWMzOworKiBcZW5kY29kZQorKgorKiBcc2EgXGJsYW5rIFxyZWYgVG9waWNTdGxDb250YWluZXJzLgorKi8KK3RlbXBsYXRlPGNsYXNzIFQ+CitjbGFzcyBhbGlnbmVkX2FsbG9jYXRvciA6IHB1YmxpYyBzdGQ6OmFsbG9jYXRvcjxUPgoreworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICBzaXplX3R5cGU7CisgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiBUKiAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgdHlwZWRlZiBjb25zdCBUKiAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBUJiAgICAgICAgICAgICAgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IFQmICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgVCAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgVT4KKyAgc3RydWN0IHJlYmluZAorICB7CisgICAgdHlwZWRlZiBhbGlnbmVkX2FsbG9jYXRvcjxVPiBvdGhlcjsKKyAgfTsKKworICBhbGlnbmVkX2FsbG9jYXRvcigpIDogc3RkOjphbGxvY2F0b3I8VD4oKSB7fQorCisgIGFsaWduZWRfYWxsb2NhdG9yKGNvbnN0IGFsaWduZWRfYWxsb2NhdG9yJiBvdGhlcikgOiBzdGQ6OmFsbG9jYXRvcjxUPihvdGhlcikge30KKworICB0ZW1wbGF0ZTxjbGFzcyBVPgorICBhbGlnbmVkX2FsbG9jYXRvcihjb25zdCBhbGlnbmVkX2FsbG9jYXRvcjxVPiYgb3RoZXIpIDogc3RkOjphbGxvY2F0b3I8VD4ob3RoZXIpIHt9CisKKyAgfmFsaWduZWRfYWxsb2NhdG9yKCkge30KKworICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBudW0sIGNvbnN0IHZvaWQqIC8qaGludCovID0gMCkKKyAgeworICAgIGludGVybmFsOjpjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihudW0pOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPiggaW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKG51bSAqIHNpemVvZihUKSkgKTsKKyAgfQorCisgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIHAsIHNpemVfdHlwZSAvKm51bSovKQorICB7CisgICAgaW50ZXJuYWw6OmFsaWduZWRfZnJlZShwKTsKKyAgfQorfTsKKworLy8tLS0tLS0tLS0tIENhY2hlIHNpemVzIC0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKEVJR0VOX05PX0NQVUlEKQorIyAgaWYgRUlHRU5fQ09NUF9HTlVDICYmIEVJR0VOX0FSQ0hfaTM4Nl9PUl94ODZfNjQKKyMgICAgaWYgZGVmaW5lZChfX1BJQ19fKSAmJiBFSUdFTl9BUkNIX2kzODYKKyAgICAgICAvLyBDYXNlIGZvciB4ODYgd2l0aCBQSUMKKyMgICAgICBkZWZpbmUgRUlHRU5fQ1BVSUQoYWJjZCxmdW5jLGlkKSBcCisgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInhjaGdsICUlZWJ4LCAlazE7Y3B1aWQ7IHhjaGdsICUlZWJ4LCVrMSI6ICI9YSIgKGFiY2RbMF0pLCAiPSZyIiAoYWJjZFsxXSksICI9YyIgKGFiY2RbMl0pLCAiPWQiIChhYmNkWzNdKSA6ICJhIiAoZnVuYyksICJjIiAoaWQpKTsKKyMgICAgZWxpZiBkZWZpbmVkKF9fUElDX18pICYmIEVJR0VOX0FSQ0hfeDg2XzY0CisgICAgICAgLy8gQ2FzZSBmb3IgeDY0IHdpdGggUElDLiBJbiB0aGVvcnkgdGhpcyBpcyBvbmx5IGEgcHJvYmxlbSB3aXRoIHJlY2VudCBnY2MgYW5kIHdpdGggbWVkaXVtIG9yIGxhcmdlIGNvZGUgbW9kZWwsIG5vdCB3aXRoIHRoZSBkZWZhdWx0IHNtYWxsIGNvZGUgbW9kZWwuCisgICAgICAgLy8gSG93ZXZlciwgd2UgY2Fubm90IGRldGVjdCB3aGljaCBjb2RlIG1vZGVsIGlzIHVzZWQsIGFuZCB0aGUgeGNoZyBvdmVyaGVhZCBpcyBuZWdsaWdpYmxlIGFueXdheS4KKyMgICAgICBkZWZpbmUgRUlHRU5fQ1BVSUQoYWJjZCxmdW5jLGlkKSBcCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgieGNoZ3txfVx0eyUlfXJieCwgJXExOyBjcHVpZDsgeGNoZ3txfVx0eyUlfXJieCwgJXExIjogIj1hIiAoYWJjZFswXSksICI9JnIiIChhYmNkWzFdKSwgIj1jIiAoYWJjZFsyXSksICI9ZCIgKGFiY2RbM10pIDogIjAiIChmdW5jKSwgIjIiIChpZCkpOworIyAgICBlbHNlCisgICAgICAgLy8gQ2FzZSBmb3IgeDg2XzY0IG9yIHg4NiB3L28gUElDCisjICAgICAgZGVmaW5lIEVJR0VOX0NQVUlEKGFiY2QsZnVuYyxpZCkgXAorICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjcHVpZCI6ICI9YSIgKGFiY2RbMF0pLCAiPWIiIChhYmNkWzFdKSwgIj1jIiAoYWJjZFsyXSksICI9ZCIgKGFiY2RbM10pIDogIjAiIChmdW5jKSwgIjIiIChpZCkgKTsKKyMgICAgZW5kaWYKKyMgIGVsaWYgRUlHRU5fQ09NUF9NU1ZDCisjICAgIGlmIChFSUdFTl9DT01QX01TVkMgPiAxNTAwKSAmJiBFSUdFTl9BUkNIX2kzODZfT1JfeDg2XzY0CisjICAgICAgZGVmaW5lIEVJR0VOX0NQVUlEKGFiY2QsZnVuYyxpZCkgX19jcHVpZGV4KChpbnQqKWFiY2QsZnVuYyxpZCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmZGVmIEVJR0VOX0NQVUlECisKK2lubGluZSBib29sIGNwdWlkX2lzX3ZlbmRvcihpbnQgYWJjZFs0XSwgY29uc3QgaW50IHZlbmRvclszXSkKK3sKKyAgcmV0dXJuIGFiY2RbMV09PXZlbmRvclswXSAmJiBhYmNkWzNdPT12ZW5kb3JbMV0gJiYgYWJjZFsyXT09dmVuZG9yWzJdOworfQorCitpbmxpbmUgdm9pZCBxdWVyeUNhY2hlU2l6ZXNfaW50ZWxfZGlyZWN0KGludCYgbDEsIGludCYgbDIsIGludCYgbDMpCit7CisgIGludCBhYmNkWzRdOworICBsMSA9IGwyID0gbDMgPSAwOworICBpbnQgY2FjaGVfaWQgPSAwOworICBpbnQgY2FjaGVfdHlwZSA9IDA7CisgIGRvIHsKKyAgICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDsKKyAgICBFSUdFTl9DUFVJRChhYmNkLDB4NCxjYWNoZV9pZCk7CisgICAgY2FjaGVfdHlwZSAgPSAoYWJjZFswXSAmIDB4MEYpID4+IDA7CisgICAgaWYoY2FjaGVfdHlwZT09MXx8Y2FjaGVfdHlwZT09MykgLy8gZGF0YSBvciB1bmlmaWVkIGNhY2hlCisgICAgeworICAgICAgaW50IGNhY2hlX2xldmVsID0gKGFiY2RbMF0gJiAweEUwKSA+PiA1OyAgLy8gQVs3OjVdCisgICAgICBpbnQgd2F5cyAgICAgICAgPSAoYWJjZFsxXSAmIDB4RkZDMDAwMDApID4+IDIyOyAvLyBCWzMxOjIyXQorICAgICAgaW50IHBhcnRpdGlvbnMgID0gKGFiY2RbMV0gJiAweDAwM0ZGMDAwKSA+PiAxMjsgLy8gQlsyMToxMl0KKyAgICAgIGludCBsaW5lX3NpemUgICA9IChhYmNkWzFdICYgMHgwMDAwMEZGRikgPj4gIDA7IC8vIEJbMTE6MF0KKyAgICAgIGludCBzZXRzICAgICAgICA9IChhYmNkWzJdKTsgICAgICAgICAgICAgICAgICAgIC8vIENbMzE6MF0KKworICAgICAgaW50IGNhY2hlX3NpemUgPSAod2F5cysxKSAqIChwYXJ0aXRpb25zKzEpICogKGxpbmVfc2l6ZSsxKSAqIChzZXRzKzEpOworCisgICAgICBzd2l0Y2goY2FjaGVfbGV2ZWwpCisgICAgICB7CisgICAgICAgIGNhc2UgMTogbDEgPSBjYWNoZV9zaXplOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBsMiA9IGNhY2hlX3NpemU7IGJyZWFrOworICAgICAgICBjYXNlIDM6IGwzID0gY2FjaGVfc2l6ZTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBjYWNoZV9pZCsrOworICB9IHdoaWxlKGNhY2hlX3R5cGU+MCAmJiBjYWNoZV9pZDwxNik7Cit9CisKK2lubGluZSB2b2lkIHF1ZXJ5Q2FjaGVTaXplc19pbnRlbF9jb2RlcyhpbnQmIGwxLCBpbnQmIGwyLCBpbnQmIGwzKQoreworICBpbnQgYWJjZFs0XTsKKyAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7CisgIGwxID0gbDIgPSBsMyA9IDA7CisgIEVJR0VOX0NQVUlEKGFiY2QsMHgwMDAwMDAwMiwwKTsKKyAgdW5zaWduZWQgY2hhciAqIGJ5dGVzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyICo+KGFiY2QpKzI7CisgIGJvb2wgY2hlY2tfZm9yX3AyX2NvcmUyID0gZmFsc2U7CisgIGZvcihpbnQgaT0wOyBpPDE0OyArK2kpCisgIHsKKyAgICBzd2l0Y2goYnl0ZXNbaV0pCisgICAgeworICAgICAgY2FzZSAweDBBOiBsMSA9IDg7IGJyZWFrOyAgIC8vIDBBaCAgIGRhdGEgTDEgY2FjaGUsIDggS0IsIDIgd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDBDOiBsMSA9IDE2OyBicmVhazsgIC8vIDBDaCAgIGRhdGEgTDEgY2FjaGUsIDE2IEtCLCA0IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHgwRTogbDEgPSAyNDsgYnJlYWs7ICAvLyAwRWggICBkYXRhIEwxIGNhY2hlLCAyNCBLQiwgNiB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4MTA6IGwxID0gMTY7IGJyZWFrOyAgLy8gMTBoICAgZGF0YSBMMSBjYWNoZSwgMTYgS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcyAoSUEtNjQpCisgICAgICBjYXNlIDB4MTU6IGwxID0gMTY7IGJyZWFrOyAgLy8gMTVoICAgY29kZSBMMSBjYWNoZSwgMTYgS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcyAoSUEtNjQpCisgICAgICBjYXNlIDB4MkM6IGwxID0gMzI7IGJyZWFrOyAgLy8gMkNoICAgZGF0YSBMMSBjYWNoZSwgMzIgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDMwOiBsMSA9IDMyOyBicmVhazsgIC8vIDMwaCAgIGNvZGUgTDEgY2FjaGUsIDMyIEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg2MDogbDEgPSAxNjsgYnJlYWs7ICAvLyA2MGggICBkYXRhIEwxIGNhY2hlLCAxNiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDY2OiBsMSA9IDg7IGJyZWFrOyAgIC8vIDY2aCAgIGRhdGEgTDEgY2FjaGUsIDggS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHg2NzogbDEgPSAxNjsgYnJlYWs7ICAvLyA2N2ggICBkYXRhIEwxIGNhY2hlLCAxNiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDY4OiBsMSA9IDMyOyBicmVhazsgIC8vIDY4aCAgIGRhdGEgTDEgY2FjaGUsIDMyIEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4MUE6IGwyID0gOTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDk2IEtCLCA2IHdheXMsIDY0IGJ5dGUgbGluZXMgKElBLTY0KQorICAgICAgY2FzZSAweDIyOiBsMyA9IDUxMjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgNTEyIEtCLCA0IHdheXMgKCEpLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4MjM6IGwzID0gMTAyNDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMTAyNCBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4MjU6IGwzID0gMjA0ODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMjA0OCBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4Mjk6IGwzID0gNDA5NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgNDA5NiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4Mzk6IGwyID0gMTI4OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxMjggS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHgzQTogbDIgPSAxOTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDE5MiBLQiwgNiB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDNCOiBsMiA9IDEyODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTI4IEtCLCAyIHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4M0M6IGwyID0gMjU2OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAyNTYgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHgzRDogbDIgPSAzODQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDM4NCBLQiwgNiB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDNFOiBsMiA9IDUxMjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgNTEyIEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4NDA6IGwyID0gMDsgYnJlYWs7ICAgLy8gbm8gaW50ZWdyYXRlZCBMMiBjYWNoZSAoUDYgY29yZSkgb3IgTDMgY2FjaGUgKFA0IGNvcmUpCisgICAgICBjYXNlIDB4NDE6IGwyID0gMTI4OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxMjggS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQyOiBsMiA9IDI1NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjU2IEtCLCA0IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0MzogbDIgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDUxMiBLQiwgNCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDQ6IGwyID0gMTAyNDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTAyNCBLQiwgNCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDU6IGwyID0gMjA0ODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjA0OCBLQiwgNCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDY6IGwzID0gNDA5NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgNDA5NiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDc6IGwzID0gODE5MjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgODE5MiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDg6IGwyID0gMzA3MjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMzA3MiBLQiwgMTIgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ5OiBpZihsMiE9MCkgbDMgPSA0MDk2OyBlbHNlIHtjaGVja19mb3JfcDJfY29yZTI9dHJ1ZTsgbDMgPSBsMiA9IDQwOTY7fSBicmVhazsvLyBjb2RlIGFuZCBkYXRhIEwzIGNhY2hlLCA0MDk2IEtCLCAxNiB3YXlzLCA2NCBieXRlIGxpbmVzIChQNCkgb3IgTDIgZm9yIGNvcmUyCisgICAgICBjYXNlIDB4NEE6IGwzID0gNjE0NDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgNjE0NCBLQiwgMTIgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDRCOiBsMyA9IDgxOTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDgxOTIgS0IsIDE2IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0QzogbDMgPSAxMjI4ODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMTIyODggS0IsIDEyIHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0RDogbDMgPSAxNjM4NDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMTYzODQgS0IsIDE2IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0RTogbDIgPSA2MTQ0OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA2MTQ0IEtCLCAyNCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4Nzg6IGwyID0gMTAyNDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTAyNCBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4Nzk6IGwyID0gMTI4OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxMjggS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDdBOiBsMiA9IDI1NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjU2IEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMsIGR1YWwtc2VjdG9yZWQKKyAgICAgIGNhc2UgMHg3QjogbDIgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDUxMiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4N0M6IGwyID0gMTAyNDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTAyNCBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4N0Q6IGwyID0gMjA0ODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjA0OCBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4N0U6IGwyID0gMjU2OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAyNTYgS0IsIDggd2F5cywgMTI4IGJ5dGUgbGluZXMsIHNlY3QuIChJQS02NCkKKyAgICAgIGNhc2UgMHg3RjogbDIgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDUxMiBLQiwgMiB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4ODA6IGwyID0gNTEyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA1MTIgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDgxOiBsMiA9IDEyODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTI4IEtCLCA4IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4MjogbDIgPSAyNTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDI1NiBLQiwgOCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4ODM6IGwyID0gNTEyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA1MTIgS0IsIDggd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDg0OiBsMiA9IDEwMjQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEwMjQgS0IsIDggd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDg1OiBsMiA9IDIwNDg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDIwNDggS0IsIDggd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDg2OiBsMiA9IDUxMjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgNTEyIEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4NzogbDIgPSAxMDI0OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxMDI0IEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4ODogbDMgPSAyMDQ4OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwzIGNhY2hlLCAyMDQ4IEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMgKElBLTY0KQorICAgICAgY2FzZSAweDg5OiBsMyA9IDQwOTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDQwOTYgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcyAoSUEtNjQpCisgICAgICBjYXNlIDB4OEE6IGwzID0gODE5MjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgODE5MiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzIChJQS02NCkKKyAgICAgIGNhc2UgMHg4RDogbDMgPSAzMDcyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwzIGNhY2hlLCAzMDcyIEtCLCAxMiB3YXlzLCAxMjggYnl0ZSBsaW5lcyAoSUEtNjQpCisKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgfQorICBpZihjaGVja19mb3JfcDJfY29yZTIgJiYgbDIgPT0gbDMpCisgICAgbDMgPSAwOworICBsMSAqPSAxMDI0OworICBsMiAqPSAxMDI0OworICBsMyAqPSAxMDI0OworfQorCitpbmxpbmUgdm9pZCBxdWVyeUNhY2hlU2l6ZXNfaW50ZWwoaW50JiBsMSwgaW50JiBsMiwgaW50JiBsMywgaW50IG1heF9zdGRfZnVuY3MpCit7CisgIGlmKG1heF9zdGRfZnVuY3M+PTQpCisgICAgcXVlcnlDYWNoZVNpemVzX2ludGVsX2RpcmVjdChsMSxsMixsMyk7CisgIGVsc2UKKyAgICBxdWVyeUNhY2hlU2l6ZXNfaW50ZWxfY29kZXMobDEsbDIsbDMpOworfQorCitpbmxpbmUgdm9pZCBxdWVyeUNhY2hlU2l6ZXNfYW1kKGludCYgbDEsIGludCYgbDIsIGludCYgbDMpCit7CisgIGludCBhYmNkWzRdOworICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDsKKyAgRUlHRU5fQ1BVSUQoYWJjZCwweDgwMDAwMDA1LDApOworICBsMSA9IChhYmNkWzJdID4+IDI0KSAqIDEwMjQ7IC8vIENbMzE6MjRdID0gTDEgc2l6ZSBpbiBLQgorICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDsKKyAgRUlHRU5fQ1BVSUQoYWJjZCwweDgwMDAwMDA2LDApOworICBsMiA9IChhYmNkWzJdID4+IDE2KSAqIDEwMjQ7IC8vIENbMzE7MTZdID0gbDIgY2FjaGUgc2l6ZSBpbiBLQgorICBsMyA9ICgoYWJjZFszXSAmIDB4RkZGQzAwMCkgPj4gMTgpICogNTEyICogMTAyNDsgLy8gRFszMTsxOF0gPSBsMyBjYWNoZSBzaXplIGluIDUxMktCCit9CisjZW5kaWYKKworLyoqIFxpbnRlcm5hbAorICogUXVlcmllcyBhbmQgcmV0dXJucyB0aGUgY2FjaGUgc2l6ZXMgaW4gQnl0ZXMgb2YgdGhlIEwxLCBMMiwgYW5kIEwzIGRhdGEgY2FjaGVzIHJlc3BlY3RpdmVseSAqLworaW5saW5lIHZvaWQgcXVlcnlDYWNoZVNpemVzKGludCYgbDEsIGludCYgbDIsIGludCYgbDMpCit7CisgICNpZmRlZiBFSUdFTl9DUFVJRAorICBpbnQgYWJjZFs0XTsKKyAgY29uc3QgaW50IEdlbnVpbmVJbnRlbFtdID0gezB4NzU2ZTY1NDcsIDB4NDk2NTZlNjksIDB4NmM2NTc0NmV9OworICBjb25zdCBpbnQgQXV0aGVudGljQU1EW10gPSB7MHg2ODc0NzU0MSwgMHg2OTc0NmU2NSwgMHg0NDRkNDE2M307CisgIGNvbnN0IGludCBBTURpc2JldHRlcl9bXSA9IHsweDY5NDQ0ZDQxLCAweDc0NjU2MjczLCAweDIxNzI2NTc0fTsgLy8gIkFNRGlzYmV0dGVyISIKKworICAvLyBpZGVudGlmeSB0aGUgQ1BVIHZlbmRvcgorICBFSUdFTl9DUFVJRChhYmNkLDB4MCwwKTsKKyAgaW50IG1heF9zdGRfZnVuY3MgPSBhYmNkWzFdOworICBpZihjcHVpZF9pc192ZW5kb3IoYWJjZCxHZW51aW5lSW50ZWwpKQorICAgIHF1ZXJ5Q2FjaGVTaXplc19pbnRlbChsMSxsMixsMyxtYXhfc3RkX2Z1bmNzKTsKKyAgZWxzZSBpZihjcHVpZF9pc192ZW5kb3IoYWJjZCxBdXRoZW50aWNBTUQpIHx8IGNwdWlkX2lzX3ZlbmRvcihhYmNkLEFNRGlzYmV0dGVyXykpCisgICAgcXVlcnlDYWNoZVNpemVzX2FtZChsMSxsMixsMyk7CisgIGVsc2UKKyAgICAvLyBieSBkZWZhdWx0IGxldCdzIHVzZSBJbnRlbCdzIEFQSQorICAgIHF1ZXJ5Q2FjaGVTaXplc19pbnRlbChsMSxsMixsMyxtYXhfc3RkX2Z1bmNzKTsKKworICAvLyBoZXJlIGlzIHRoZSBsaXN0IG9mIG90aGVyIHZlbmRvcnM6CisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIlZJQSBWSUEgVklBICIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIkN5cml4SW5zdGVhZCIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIkNlbnRhdXJIYXVscyIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIkdlbnVpbmVUTXg4NiIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIlRyYW5zbWV0YUNQVSIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIlJpc2VSaXNlUmlzZSIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIkdlb2RlIGJ5IE5TQyIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIlNpUyBTaVMgU2lTICIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIlVNQyBVTUMgVU1DICIpCisvLyAgIHx8Y3B1aWRfaXNfdmVuZG9yKGFiY2QsIk5leEdlbkRyaXZlbiIpCisgICNlbHNlCisgIGwxID0gbDIgPSBsMyA9IC0xOworICAjZW5kaWYKK30KKworLyoqIFxpbnRlcm5hbAorICogXHJldHVybnMgdGhlIHNpemUgaW4gQnl0ZXMgb2YgdGhlIEwxIGRhdGEgY2FjaGUgKi8KK2lubGluZSBpbnQgcXVlcnlMMUNhY2hlU2l6ZSgpCit7CisgIGludCBsMSgtMSksIGwyLCBsMzsKKyAgcXVlcnlDYWNoZVNpemVzKGwxLGwyLGwzKTsKKyAgcmV0dXJuIGwxOworfQorCisvKiogXGludGVybmFsCisgKiBccmV0dXJucyB0aGUgc2l6ZSBpbiBCeXRlcyBvZiB0aGUgTDIgb3IgTDMgY2FjaGUgaWYgdGhpcyBsYXRlciBpcyBwcmVzZW50ICovCitpbmxpbmUgaW50IHF1ZXJ5VG9wTGV2ZWxDYWNoZVNpemUoKQoreworICBpbnQgbDEsIGwyKC0xKSwgbDMoLTEpOworICBxdWVyeUNhY2hlU2l6ZXMobDEsbDIsbDMpOworICByZXR1cm4gKHN0ZDo6bWF4KShsMixsMyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01FTU9SWV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL01ldGEuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWV0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmNjM3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL01ldGEuaApAQCAtMCwwICsxLDQ5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NRVRBX0gKKyNkZWZpbmUgRUlHRU5fTUVUQV9ICisKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pCisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPG1hdGhfY29uc3RhbnRzLmg+CisjZW5kaWYKKworI2lmIEVJR0VOX0NPTVBfSUNDPj0xNjAwICYmICBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNlbmRpZgorCituYW1lc3BhY2UgRWlnZW4geworCit0eXBlZGVmIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBEZW5zZUluZGV4OworCisvKioKKyAqIFxicmllZiBUaGUgSW5kZXggdHlwZSBhcyB1c2VkIGZvciB0aGUgQVBJLgorICogXGRldGFpbHMgVG8gY2hhbmdlIHRoaXMsIFxjIFwjZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRS4KKyAqIFxzYSBcYmxhbmsgXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMsIFN0b3JhZ2VJbmRleC4KKyAqLworCit0eXBlZGVmIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBJbmRleDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIFxmaWxlIE1ldGEuaAorICAqIFRoaXMgZmlsZSBjb250YWlucyBnZW5lcmljIG1ldGFwcm9ncmFtbWluZyBjbGFzc2VzIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gRWlnZW4uCisgICogXG5vdGUgSW4gY2FzZSB5b3Ugd29uZGVyLCB5ZXMgd2UncmUgYXdhcmUgdGhhdCBCb29zdCBhbHJlYWR5IHByb3ZpZGVzIGFsbCB0aGVzZSBmZWF0dXJlcywKKyAgKiB3ZSBob3dldmVyIGRvbid0IHdhbnQgdG8gYWRkIGEgZGVwZW5kZW5jeSB0byBCb29zdC4KKyAgKi8KKworLy8gT25seSByZWNlbnQgdmVyc2lvbnMgb2YgSUNDIGNvbXBsYWluIGFib3V0IHVzaW5nIHB0cmRpZmZfdCB0byBob2xkIHBvaW50ZXJzLAorLy8gYW5kIG9sZGVyIHZlcnNpb25zIGRvIG5vdCBwcm92aWRlICppbnRwdHJfdCB0eXBlcy4KKyNpZiBFSUdFTl9DT01QX0lDQz49MTYwMCAmJiAgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAordHlwZWRlZiBzdGQ6OmludHB0cl90ICBJbnRQdHI7Cit0eXBlZGVmIHN0ZDo6dWludHB0cl90IFVJbnRQdHI7CisjZWxzZQordHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCBJbnRQdHI7Cit0eXBlZGVmIHN0ZDo6c2l6ZV90IFVJbnRQdHI7CisjZW5kaWYKKworc3RydWN0IHRydWVfdHlwZSB7ICBlbnVtIHsgdmFsdWUgPSAxIH07IH07CitzdHJ1Y3QgZmFsc2VfdHlwZSB7IGVudW0geyB2YWx1ZSA9IDAgfTsgfTsKKwordGVtcGxhdGU8Ym9vbCBDb25kaXRpb24sIHR5cGVuYW1lIFRoZW4sIHR5cGVuYW1lIEVsc2U+CitzdHJ1Y3QgY29uZGl0aW9uYWwgeyB0eXBlZGVmIFRoZW4gdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVGhlbiwgdHlwZW5hbWUgRWxzZT4KK3N0cnVjdCBjb25kaXRpb25hbCA8ZmFsc2UsIFRoZW4sIEVsc2U+IHsgdHlwZWRlZiBFbHNlIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBpc19zYW1lIHsgZW51bSB7IHZhbHVlID0gMCB9OyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3NhbWU8VCxUPiB7IGVudW0geyB2YWx1ZSA9IDEgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9yZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlcjxUKj4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlcjxUKmNvbnN0PiB7IHR5cGVkZWYgVCB0eXBlOyB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV9jb25zdCB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX2NvbnN0PGNvbnN0IFRbXT4geyB0eXBlZGVmIFQgdHlwZVtdOyB9OwordGVtcGxhdGUgPGNsYXNzIFQsIHVuc2lnbmVkIGludCBTaXplPiBzdHJ1Y3QgcmVtb3ZlX2NvbnN0PGNvbnN0IFRbU2l6ZV0+IHsgdHlwZWRlZiBUIHR5cGVbU2l6ZV07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsIHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX2FsbDxjb25zdCBUPiAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFQ+Ojp0eXBlIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX2FsbDxUIGNvbnN0Jj4gIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFQ+Ojp0eXBlIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX2FsbDxUJj4gICAgICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFQ+Ojp0eXBlIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX2FsbDxUIGNvbnN0Kj4gIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFQ+Ojp0eXBlIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX2FsbDxUKj4gICAgICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFQ+Ojp0eXBlIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19hcml0aG1ldGljICAgICAgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxmbG9hdD4gICAgICAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8ZG91YmxlPiAgICAgICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPGxvbmcgZG91YmxlPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxib29sPiAgICAgICAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8Y2hhcj4gICAgICAgICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHNpZ25lZCBjaGFyPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzx1bnNpZ25lZCBjaGFyPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8c2lnbmVkIHNob3J0PiAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHVuc2lnbmVkIHNob3J0PnsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxzaWduZWQgaW50PiAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8dW5zaWduZWQgaW50PiAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHNpZ25lZCBsb25nPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzx1bnNpZ25lZCBsb25nPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2ludGVncmFsICAgICAgICB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDxib29sPiAgICAgICAgICAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8Y2hhcj4gICAgICAgICAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHNpZ25lZCBjaGFyPiAgICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDx1bnNpZ25lZCBjaGFyPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8c2lnbmVkIHNob3J0PiAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHVuc2lnbmVkIHNob3J0PiAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDxzaWduZWQgaW50PiAgICAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfaW50ZWdyYWw8dW5zaWduZWQgaW50PiAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2ludGVncmFsPHNpZ25lZCBsb25nPiAgICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnRlZ3JhbDx1bnNpZ25lZCBsb25nPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdCB7IHR5cGVkZWYgY29uc3QgVCB0eXBlOyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfY29uc3Q8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2NvbnN0IHsgZW51bSB7IHZhbHVlID0gMCB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19jb25zdDxUIGNvbnN0PiB7IGVudW0geyB2YWx1ZSA9IDEgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlICAgICAgICAgICAgeyB0eXBlZGVmIGNvbnN0IFQgdHlwZTsgIH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8VCY+ICAgICAgICB7IHR5cGVkZWYgVCBjb25zdCYgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxUKj4gICAgICAgIHsgdHlwZWRlZiBUIGNvbnN0KiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlPFQqIGNvbnN0PiAgeyB0eXBlZGVmIFQgY29uc3QqIGNvbnN0IHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8VCBjb25zdCogY29uc3Q+ICB7IHR5cGVkZWYgVCBjb25zdCogY29uc3QgdHlwZTsgfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3N0cnVjdCBpc19jb252ZXJ0aWJsZV9pbXBsCit7Citwcml2YXRlOgorICBzdHJ1Y3QgYW55X2NvbnZlcnNpb24KKyAgeworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBhbnlfY29udmVyc2lvbihjb25zdCB2b2xhdGlsZSBUJik7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGFueV9jb252ZXJzaW9uKFQmKTsKKyAgfTsKKyAgc3RydWN0IHllcyB7aW50IGFbMV07fTsKKyAgc3RydWN0IG5vICB7aW50IGFbMl07fTsKKworICBzdGF0aWMgeWVzIHRlc3QoY29uc3QgVG8mLCBpbnQpOworICBzdGF0aWMgbm8gIHRlc3QoYW55X2NvbnZlcnNpb24sIC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIEZyb20gbXNfZnJvbTsKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisgICNwcmFnbWEgd2FybmluZyBwdXNoCisgICNwcmFnbWEgd2FybmluZyAoIGRpc2FibGUgOiAyMjU5ICkKKyNlbmRpZgorICBlbnVtIHsgdmFsdWUgPSBzaXplb2YodGVzdChtc19mcm9tLCAwKSk9PXNpemVvZih5ZXMpIH07CisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorICAjcHJhZ21hIHdhcm5pbmcgcG9wCisjZW5kaWYKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorc3RydWN0IGlzX2NvbnZlcnRpYmxlCit7CisgIGVudW0geyB2YWx1ZSA9IGlzX2NvbnZlcnRpYmxlX2ltcGw8dHlwZW5hbWUgcmVtb3ZlX2FsbDxGcm9tPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfYWxsPFRvICA+Ojp0eXBlPjo6dmFsdWUgfTsKK307CisKKy8qKiBcaW50ZXJuYWwgQWxsb3dzIHRvIGVuYWJsZS9kaXNhYmxlIGFuIG92ZXJsb2FkCisgICogYWNjb3JkaW5nIHRvIGEgY29tcGlsZSB0aW1lIGNvbmRpdGlvbi4KKyAgKi8KK3RlbXBsYXRlPGJvb2wgQ29uZGl0aW9uLCB0eXBlbmFtZSBUPXZvaWQ+IHN0cnVjdCBlbmFibGVfaWY7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlbmFibGVfaWY8dHJ1ZSxUPgoreyB0eXBlZGVmIFQgdHlwZTsgfTsKKworI2lmIGRlZmluZWQoX19DVURBX0FSQ0hfXykKKyNpZiAhZGVmaW5lZChfX0ZMVF9FUFNJTE9OX18pCisjZGVmaW5lIF9fRkxUX0VQU0lMT05fXyBGTFRfRVBTSUxPTgorI2RlZmluZSBfX0RCTF9FUFNJTE9OX18gREJMX0VQU0lMT04KKyNlbmRpZgorCituYW1lc3BhY2UgZGV2aWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IG51bWVyaWNfbGltaXRzCit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBUIGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIHN0YXRpYyBUIChtYXgpKCkgeyBhc3NlcnQoZmFsc2UgJiYgIkhpZ2hlc3Qgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0eXBlIik7IH0KKyAgc3RhdGljIFQgKG1pbikoKSB7IGFzc2VydChmYWxzZSAmJiAiTG93ZXN0IG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdHlwZSIpOyB9CisgIHN0YXRpYyBUIGluZmluaXR5KCkgeyBhc3NlcnQoZmFsc2UgJiYgIkluZmluaXR5IG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdHlwZSIpOyB9CisgIHN0YXRpYyBUIHF1aWV0X05hTigpIHsgYXNzZXJ0KGZhbHNlICYmICJxdWlldF9OYU4gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0eXBlIik7IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czxmbG9hdD4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGZsb2F0IGVwc2lsb24oKSB7IHJldHVybiBfX0ZMVF9FUFNJTE9OX187IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGZsb2F0IChtYXgpKCkgeyByZXR1cm4gQ1VEQVJUX01BWF9OT1JNQUxfRjsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgZmxvYXQgKG1pbikoKSB7IHJldHVybiBGTFRfTUlOOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBmbG9hdCBpbmZpbml0eSgpIHsgcmV0dXJuIENVREFSVF9JTkZfRjsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgZmxvYXQgcXVpZXRfTmFOKCkgeyByZXR1cm4gQ1VEQVJUX05BTl9GOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8ZG91YmxlPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgZG91YmxlIGVwc2lsb24oKSB7IHJldHVybiBfX0RCTF9FUFNJTE9OX187IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGRvdWJsZSAobWF4KSgpIHsgcmV0dXJuIERCTF9NQVg7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGRvdWJsZSAobWluKSgpIHsgcmV0dXJuIERCTF9NSU47IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGRvdWJsZSBpbmZpbml0eSgpIHsgcmV0dXJuIENVREFSVF9JTkY7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGRvdWJsZSBxdWlldF9OYU4oKSB7IHJldHVybiBDVURBUlRfTkFOOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8aW50PgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW50IGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbnQgKG1heCkoKSB7IHJldHVybiBJTlRfTUFYOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbnQgKG1pbikoKSB7IHJldHVybiBJTlRfTUlOOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgdW5zaWduZWQgaW50IGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgKG1heCkoKSB7IHJldHVybiBVSU5UX01BWDsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgdW5zaWduZWQgaW50IChtaW4pKCkgeyByZXR1cm4gMDsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IG51bWVyaWNfbGltaXRzPGxvbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBsb25nIGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBsb25nIChtYXgpKCkgeyByZXR1cm4gTE9OR19NQVg7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGxvbmcgKG1pbikoKSB7IHJldHVybiBMT05HX01JTjsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIChtYXgpKCkgeyByZXR1cm4gVUxPTkdfTUFYOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIChtaW4pKCkgeyByZXR1cm4gMDsgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IG51bWVyaWNfbGltaXRzPGxvbmcgbG9uZz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGxvbmcgbG9uZyBlcHNpbG9uKCkgeyByZXR1cm4gMDsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgbG9uZyBsb25nIChtYXgpKCkgeyByZXR1cm4gTExPTkdfTUFYOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBsb25nIGxvbmcgKG1pbikoKSB7IHJldHVybiBMTE9OR19NSU47IH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nIGxvbmc+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZXBzaWxvbigpIHsgcmV0dXJuIDA7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAobWF4KSgpIHsgcmV0dXJuIFVMTE9OR19NQVg7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAobWluKSgpIHsgcmV0dXJuIDA7IH0KK307CisKK30KKworI2VuZGlmCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBBIGJhc2UgY2xhc3MgZG8gZGlzYWJsZSBkZWZhdWx0IGNvcHkgY3RvciBhbmQgY29weSBhc3NpZ25lbWVudCBvcGVyYXRvci4KKyAgKi8KK2NsYXNzIG5vbmNvcHlhYmxlCit7CisgIEVJR0VOX0RFVklDRV9GVU5DIG5vbmNvcHlhYmxlKGNvbnN0IG5vbmNvcHlhYmxlJik7CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IG5vbmNvcHlhYmxlJiBvcGVyYXRvcj0oY29uc3Qgbm9uY29weWFibGUmKTsKK3Byb3RlY3RlZDoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgbm9uY29weWFibGUoKSB7fQorICBFSUdFTl9ERVZJQ0VfRlVOQyB+bm9uY29weWFibGUoKSB7fQorfTsKKworLyoqIFxpbnRlcm5hbAorICAqIENvbnZlbmllbnQgc3RydWN0IHRvIGdldCB0aGUgcmVzdWx0IHR5cGUgb2YgYSB1bmFyeSBvciBiaW5hcnkgZnVuY3Rvci4KKyAgKgorICAqIEl0IHN1cHBvcnRzIGJvdGggdGhlIGN1cnJlbnQgU1RMIG1lY2hhbmlzbSAodXNpbmcgdGhlIHJlc3VsdF90eXBlIG1lbWJlcikgYXMgd2VsbCBhcworICAqIHVwY29taW5nIG5leHQgU1RMIGdlbmVyYXRpb24gKHVzaW5nIGEgdGVtcGxhdGVkIHJlc3VsdCBtZW1iZXIpLgorICAqIElmIG5vbmUgb2YgdGhlc2UgbWVtYmVycyBpcyBwcm92aWRlZCwgdGhlbiB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgcmV0dXJuZWQuIEZJWE1FLCB0aGF0IGJlaGF2aW9yIGlzIGEgcHJldHR5IGJhZCBoYWNrLgorICAqLworI2lmIEVJR0VOX0hBU19TVERfUkVTVUxUX09GCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVzdWx0X29mIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlc3VsdF9vZjxUPjo6dHlwZSB0eXBlMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGUxPjo6dHlwZSB0eXBlOworfTsKKyNlbHNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVzdWx0X29mIHsgfTsKKworc3RydWN0IGhhc19ub25lIHtpbnQgYVsxXTt9Oworc3RydWN0IGhhc19zdGRfcmVzdWx0X3R5cGUge2ludCBhWzJdO307CitzdHJ1Y3QgaGFzX3RyMV9yZXN1bHQge2ludCBhWzNdO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGUsIGludCBTaXplT2Y9c2l6ZW9mKGhhc19ub25lKT4KK3N0cnVjdCB1bmFyeV9yZXN1bHRfb2Zfc2VsZWN0IHt0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFyZ1R5cGU+Ojp0eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZT4KK3N0cnVjdCB1bmFyeV9yZXN1bHRfb2Zfc2VsZWN0PEZ1bmMsIEFyZ1R5cGUsIHNpemVvZihoYXNfc3RkX3Jlc3VsdF90eXBlKT4ge3R5cGVkZWYgdHlwZW5hbWUgRnVuYzo6cmVzdWx0X3R5cGUgdHlwZTt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBBcmdUeXBlPgorc3RydWN0IHVuYXJ5X3Jlc3VsdF9vZl9zZWxlY3Q8RnVuYywgQXJnVHlwZSwgc2l6ZW9mKGhhc190cjFfcmVzdWx0KT4ge3R5cGVkZWYgdHlwZW5hbWUgRnVuYzo6dGVtcGxhdGUgcmVzdWx0PEZ1bmMoQXJnVHlwZSk+Ojp0eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZT4KK3N0cnVjdCByZXN1bHRfb2Y8RnVuYyhBcmdUeXBlKT4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGhhc19zdGRfcmVzdWx0X3R5cGUgICAgdGVzdEZ1bmN0b3IoVCBjb25zdCAqLCB0eXBlbmFtZSBUOjpyZXN1bHRfdHlwZSBjb25zdCAqID0gMCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgaGFzX3RyMV9yZXN1bHQgICAgICAgICB0ZXN0RnVuY3RvcihUIGNvbnN0ICosIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIHJlc3VsdDxUKEFyZ1R5cGUpPjo6dHlwZSBjb25zdCAqID0gMCk7CisgICAgc3RhdGljIGhhc19ub25lICAgICAgICAgICAgICAgdGVzdEZ1bmN0b3IoLi4uKTsKKworICAgIC8vIG5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGluZGlyZWN0aW9uIGlzIG5lZWRlZCBmb3IgZ2NjLTMuMworICAgIGVudW0ge0Z1bmN0b3JUeXBlID0gc2l6ZW9mKHRlc3RGdW5jdG9yKHN0YXRpY19jYXN0PEZ1bmMqPigwKSkpfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVuYXJ5X3Jlc3VsdF9vZl9zZWxlY3Q8RnVuYywgQXJnVHlwZSwgRnVuY3RvclR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBBcmdUeXBlMCwgdHlwZW5hbWUgQXJnVHlwZTEsIGludCBTaXplT2Y9c2l6ZW9mKGhhc19ub25lKT4KK3N0cnVjdCBiaW5hcnlfcmVzdWx0X29mX3NlbGVjdCB7dHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmdUeXBlMD46OnR5cGUgdHlwZTt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBBcmdUeXBlMCwgdHlwZW5hbWUgQXJnVHlwZTE+CitzdHJ1Y3QgYmluYXJ5X3Jlc3VsdF9vZl9zZWxlY3Q8RnVuYywgQXJnVHlwZTAsIEFyZ1R5cGUxLCBzaXplb2YoaGFzX3N0ZF9yZXN1bHRfdHlwZSk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpyZXN1bHRfdHlwZSB0eXBlO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGUwLCB0eXBlbmFtZSBBcmdUeXBlMT4KK3N0cnVjdCBiaW5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlMCwgQXJnVHlwZTEsIHNpemVvZihoYXNfdHIxX3Jlc3VsdCk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjp0ZW1wbGF0ZSByZXN1bHQ8RnVuYyhBcmdUeXBlMCxBcmdUeXBlMSk+Ojp0eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZTAsIHR5cGVuYW1lIEFyZ1R5cGUxPgorc3RydWN0IHJlc3VsdF9vZjxGdW5jKEFyZ1R5cGUwLEFyZ1R5cGUxKT4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGhhc19zdGRfcmVzdWx0X3R5cGUgICAgdGVzdEZ1bmN0b3IoVCBjb25zdCAqLCB0eXBlbmFtZSBUOjpyZXN1bHRfdHlwZSBjb25zdCAqID0gMCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgaGFzX3RyMV9yZXN1bHQgICAgICAgICB0ZXN0RnVuY3RvcihUIGNvbnN0ICosIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIHJlc3VsdDxUKEFyZ1R5cGUwLEFyZ1R5cGUxKT46OnR5cGUgY29uc3QgKiA9IDApOworICAgIHN0YXRpYyBoYXNfbm9uZSAgICAgICAgICAgICAgIHRlc3RGdW5jdG9yKC4uLik7CisKKyAgICAvLyBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbmRpcmVjdGlvbiBpcyBuZWVkZWQgZm9yIGdjYy0zLjMKKyAgICBlbnVtIHtGdW5jdG9yVHlwZSA9IHNpemVvZih0ZXN0RnVuY3RvcihzdGF0aWNfY2FzdDxGdW5jKj4oMCkpKX07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiaW5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlMCwgQXJnVHlwZTEsIEZ1bmN0b3JUeXBlPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZTAsIHR5cGVuYW1lIEFyZ1R5cGUxLCB0eXBlbmFtZSBBcmdUeXBlMiwgaW50IFNpemVPZj1zaXplb2YoaGFzX25vbmUpPgorc3RydWN0IHRlcm5hcnlfcmVzdWx0X29mX3NlbGVjdCB7dHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBcmdUeXBlMD46OnR5cGUgdHlwZTt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBBcmdUeXBlMCwgdHlwZW5hbWUgQXJnVHlwZTEsIHR5cGVuYW1lIEFyZ1R5cGUyPgorc3RydWN0IHRlcm5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlMCwgQXJnVHlwZTEsIEFyZ1R5cGUyLCBzaXplb2YoaGFzX3N0ZF9yZXN1bHRfdHlwZSk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpyZXN1bHRfdHlwZSB0eXBlO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGUwLCB0eXBlbmFtZSBBcmdUeXBlMSwgdHlwZW5hbWUgQXJnVHlwZTI+CitzdHJ1Y3QgdGVybmFyeV9yZXN1bHRfb2Zfc2VsZWN0PEZ1bmMsIEFyZ1R5cGUwLCBBcmdUeXBlMSwgQXJnVHlwZTIsIHNpemVvZihoYXNfdHIxX3Jlc3VsdCk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjp0ZW1wbGF0ZSByZXN1bHQ8RnVuYyhBcmdUeXBlMCxBcmdUeXBlMSxBcmdUeXBlMik+Ojp0eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZTAsIHR5cGVuYW1lIEFyZ1R5cGUxLCB0eXBlbmFtZSBBcmdUeXBlMj4KK3N0cnVjdCByZXN1bHRfb2Y8RnVuYyhBcmdUeXBlMCxBcmdUeXBlMSxBcmdUeXBlMik+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBoYXNfc3RkX3Jlc3VsdF90eXBlICAgIHRlc3RGdW5jdG9yKFQgY29uc3QgKiwgdHlwZW5hbWUgVDo6cmVzdWx0X3R5cGUgY29uc3QgKiA9IDApOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGhhc190cjFfcmVzdWx0ICAgICAgICAgdGVzdEZ1bmN0b3IoVCBjb25zdCAqLCB0eXBlbmFtZSBUOjp0ZW1wbGF0ZSByZXN1bHQ8VChBcmdUeXBlMCxBcmdUeXBlMSxBcmdUeXBlMik+Ojp0eXBlIGNvbnN0ICogPSAwKTsKKyAgICBzdGF0aWMgaGFzX25vbmUgICAgICAgICAgICAgICB0ZXN0RnVuY3RvciguLi4pOworCisgICAgLy8gbm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgaW5kaXJlY3Rpb24gaXMgbmVlZGVkIGZvciBnY2MtMy4zCisgICAgZW51bSB7RnVuY3RvclR5cGUgPSBzaXplb2YodGVzdEZ1bmN0b3Ioc3RhdGljX2Nhc3Q8RnVuYyo+KDApKSl9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgdGVybmFyeV9yZXN1bHRfb2Zfc2VsZWN0PEZ1bmMsIEFyZ1R5cGUwLCBBcmdUeXBlMSwgQXJnVHlwZTIsIEZ1bmN0b3JUeXBlPjo6dHlwZSB0eXBlOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgbWV0YV95ZXMgeyBjaGFyIGFbMV07IH07CitzdHJ1Y3QgbWV0YV9ubyAgeyBjaGFyIGFbMl07IH07CisKKy8vIENoZWNrIHdoZXRoZXIgVDo6UmV0dXJuVHlwZSBkb2VzIGV4aXN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBoYXNfUmV0dXJuVHlwZQoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4gc3RhdGljIG1ldGFfeWVzIHRlc3RGdW5jdG9yKHR5cGVuYW1lIEM6OlJldHVyblR5cGUgY29uc3QgKik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDPiBzdGF0aWMgbWV0YV9ubyB0ZXN0RnVuY3RvciguLi4pOworCisgIGVudW0geyB2YWx1ZSA9IHNpemVvZih0ZXN0RnVuY3RvcjxUPigwKSkgPT0gc2l6ZW9mKG1ldGFfeWVzKSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCogcmV0dXJuX3B0cigpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXhUeXBlPUluZGV4Pgorc3RydWN0IGhhc19udWxsYXJ5X29wZXJhdG9yCit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDPiBzdGF0aWMgbWV0YV95ZXMgdGVzdEZ1bmN0b3IoQyBjb25zdCAqLHR5cGVuYW1lIGVuYWJsZV9pZjwoc2l6ZW9mKHJldHVybl9wdHI8Qz4oKS0+b3BlcmF0b3IoKSgpKT4wKT46OnR5cGUgKiA9IDApOworICBzdGF0aWMgbWV0YV9ubyB0ZXN0RnVuY3RvciguLi4pOworCisgIGVudW0geyB2YWx1ZSA9IHNpemVvZih0ZXN0RnVuY3RvcihzdGF0aWNfY2FzdDxUKj4oMCkpKSA9PSBzaXplb2YobWV0YV95ZXMpIH07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXhUeXBlPUluZGV4Pgorc3RydWN0IGhhc191bmFyeV9vcGVyYXRvcgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4gc3RhdGljIG1ldGFfeWVzIHRlc3RGdW5jdG9yKEMgY29uc3QgKix0eXBlbmFtZSBlbmFibGVfaWY8KHNpemVvZihyZXR1cm5fcHRyPEM+KCktPm9wZXJhdG9yKCkoSW5kZXhUeXBlKDApKSk+MCk+Ojp0eXBlICogPSAwKTsKKyAgc3RhdGljIG1ldGFfbm8gdGVzdEZ1bmN0b3IoLi4uKTsKKworICBlbnVtIHsgdmFsdWUgPSBzaXplb2YodGVzdEZ1bmN0b3Ioc3RhdGljX2Nhc3Q8VCo+KDApKSkgPT0gc2l6ZW9mKG1ldGFfeWVzKSB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluZGV4VHlwZT1JbmRleD4KK3N0cnVjdCBoYXNfYmluYXJ5X29wZXJhdG9yCit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDPiBzdGF0aWMgbWV0YV95ZXMgdGVzdEZ1bmN0b3IoQyBjb25zdCAqLHR5cGVuYW1lIGVuYWJsZV9pZjwoc2l6ZW9mKHJldHVybl9wdHI8Qz4oKS0+b3BlcmF0b3IoKShJbmRleFR5cGUoMCksSW5kZXhUeXBlKDApKSk+MCk+Ojp0eXBlICogPSAwKTsKKyAgc3RhdGljIG1ldGFfbm8gdGVzdEZ1bmN0b3IoLi4uKTsKKworICBlbnVtIHsgdmFsdWUgPSBzaXplb2YodGVzdEZ1bmN0b3Ioc3RhdGljX2Nhc3Q8VCo+KDApKSkgPT0gc2l6ZW9mKG1ldGFfeWVzKSB9OworfTsKKworLyoqIFxpbnRlcm5hbCBJbiBzaG9ydCwgaXQgY29tcHV0ZXMgaW50KHNxcnQoXGEgWSkpIHdpdGggXGEgWSBhbiBpbnRlZ2VyLgorICAqIFVzYWdlIGV4YW1wbGU6IFxjb2RlIG1ldGFfc3FydDwxMDIzPjo6cmV0IFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTxpbnQgWSwKKyAgICAgICAgIGludCBJbmZYID0gMCwKKyAgICAgICAgIGludCBTdXBYID0gKChZPT0xKSA/IDEgOiBZLzIpLAorICAgICAgICAgYm9vbCBEb25lID0gKChTdXBYLUluZlgpPD0xID8gdHJ1ZSA6ICgoU3VwWCpTdXBYIDw9IFkpICYmICgoU3VwWCsxKSooU3VwWCsxKSA+IFkpKSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgPzogaW5zdGVhZCBvZiB8fCBqdXN0IHRvIHNodXQgdXAgYSBzdHVwaWQgZ2NjIDQuMyB3YXJuaW5nCitjbGFzcyBtZXRhX3NxcnQKK3sKKyAgICBlbnVtIHsKKyAgICAgIE1pZFggPSAoSW5mWCtTdXBYKS8yLAorICAgICAgVGFrZUluZiA9IE1pZFgqTWlkWCA+IFkgPyAxIDogMCwKKyAgICAgIE5ld0luZiA9IGludChUYWtlSW5mKSA/IEluZlggOiBpbnQoTWlkWCksCisgICAgICBOZXdTdXAgPSBpbnQoVGFrZUluZikgPyBpbnQoTWlkWCkgOiBTdXBYCisgICAgfTsKKyAgcHVibGljOgorICAgIGVudW0geyByZXQgPSBtZXRhX3NxcnQ8WSxOZXdJbmYsTmV3U3VwPjo6cmV0IH07Cit9OworCit0ZW1wbGF0ZTxpbnQgWSwgaW50IEluZlgsIGludCBTdXBYPgorY2xhc3MgbWV0YV9zcXJ0PFksIEluZlgsIFN1cFgsIHRydWU+IHsgcHVibGljOiAgZW51bSB7IHJldCA9IChTdXBYKlN1cFggPD0gWSkgPyBTdXBYIDogSW5mWCB9OyB9OworCisKKy8qKiBcaW50ZXJuYWwgQ29tcHV0ZXMgdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0d28gcG9zaXRpdmUgaW50ZWdlciBBIGFuZCBCCisgICogYXQgY29tcGlsZS10aW1lLiBJdCBpbXBsZW1lbnRzIGEgbmFpdmUgYWxnb3JpdGhtIHRlc3RpbmcgYWxsIG11bHRpcGxlcyBvZiBBLgorICAqIEl0IHRodXMgd29ya3MgYmV0dGVyIGlmIEE+PUIuCisgICovCit0ZW1wbGF0ZTxpbnQgQSwgaW50IEIsIGludCBLPTEsIGJvb2wgRG9uZSA9ICgoQSpLKSVCKT09MD4KK3N0cnVjdCBtZXRhX2xlYXN0X2NvbW1vbl9tdWx0aXBsZQoreworICBlbnVtIHsgcmV0ID0gbWV0YV9sZWFzdF9jb21tb25fbXVsdGlwbGU8QSxCLEsrMT46OnJldCB9OworfTsKK3RlbXBsYXRlPGludCBBLCBpbnQgQiwgaW50IEs+CitzdHJ1Y3QgbWV0YV9sZWFzdF9jb21tb25fbXVsdGlwbGU8QSxCLEssdHJ1ZT4KK3sKKyAgZW51bSB7IHJldCA9IEEqSyB9OworfTsKKworLyoqIFxpbnRlcm5hbCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb2R1Y3Qgb2YgdHdvIG51bWVyaWMgdHlwZXMgaXMgYWxsb3dlZCBhbmQgd2hhdCB0aGUgcmV0dXJuIHR5cGUgaXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBzY2FsYXJfcHJvZHVjdF90cmFpdHMKK3sKKyAgZW51bSB7IERlZmluZWQgPSAwIH07Cit9OworCisvLyBGSVhNRSBxdWljayB3b3JrYXJvdW5kIGFyb3VuZCBjdXJyZW50IGxpbWl0YXRpb24gb2YgcmVzdWx0X29mCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEFyZ1R5cGUwLCB0eXBlbmFtZSBBcmdUeXBlMT4KKy8vIHN0cnVjdCByZXN1bHRfb2Y8c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPihBcmdUeXBlMCxBcmdUeXBlMSk+IHsKKy8vIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9hbGw8QXJnVHlwZTA+Ojp0eXBlLCB0eXBlbmFtZSByZW1vdmVfYWxsPEFyZ1R5cGUxPjo6dHlwZT46OlJldHVyblR5cGUgdHlwZTsKKy8vIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgbnVtZXh0IHsKKyAgCisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKQordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgICB2b2lkIHN3YXAoVCAmYSwgVCAmYikgeyBUIHRtcCA9IGI7IGIgPSBhOyBhID0gdG1wOyB9CisjZWxzZQordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHN3YXAoVCAmYSwgVCAmYikgeyBzdGQ6OnN3YXAoYSxiKTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pCit1c2luZyBpbnRlcm5hbDo6ZGV2aWNlOjpudW1lcmljX2xpbWl0czsKKyNlbHNlCit1c2luZyBzdGQ6Om51bWVyaWNfbGltaXRzOworI2VuZGlmCisKKy8vIEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB1cC4KKy8vIFQgaXMgYXNzdW1lZCB0byBiZSBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBhPj0wLCBhbmQgYj4wCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBkaXZfY2VpbChjb25zdCBUICZhLCBjb25zdCBUICZiKQoreworICByZXR1cm4gKGErYi0xKSAvIGI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBudW1leHQKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NRVRBX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9Ob25NUEwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNjdjZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oCkBAIC0wLDAgKzEsMyBAQAorI2lmZGVmIEVJR0VOX01QTDJfT05MWQorI2Vycm9yIEluY2x1ZGluZyBub24tTVBMMiBjb2RlIGluIEVJR0VOX01QTDJfT05MWSBtb2RlCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNjBmNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZmRlZiBFSUdFTl9XQVJOSU5HU19ESVNBQkxFRAorI3VuZGVmIEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECisKKyNpZm5kZWYgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKKyAgI2lmZGVmIF9NU0NfVkVSCisgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAjZWxpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKyAgICAjcHJhZ21hIHdhcm5pbmcgcG9wCisgICNlbGlmIGRlZmluZWQgX19jbGFuZ19fCisgICAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorICAjZWxpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fPj02CisgICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgI2VuZGlmCisKKyAgI2lmIGRlZmluZWQgX19OVkNDX18KKy8vICAgIERvbid0IHJlZW5hYmxlIHRoZSBkaWFnbm9zdGljIG1lc3NhZ2VzLCBhcyBpdCB0dXJucyBvdXQgdGhlc2UgbWVzc2FnZXMgbmVlZAorLy8gICAgdG8gYmUgZGlzYWJsZWQgYXQgdGhlIHBvaW50IG9mIHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIChpLmUgdGhlIHVzZXIgY29kZSkKKy8vICAgIG90aGVyd2lzZSB0aGV5J2xsIGJlIHRyaWdnZXJlZCBieSBudmNjLgorLy8gICAgI3ByYWdtYSBkaWFnX2RlZmF1bHQgY29kZV9pc191bnJlYWNoYWJsZQorLy8gICAgI3ByYWdtYSBkaWFnX2RlZmF1bHQgaW5pdGlhbGl6YXRpb25fbm90X3JlYWNoYWJsZQorLy8gICAgI3ByYWdtYSBkaWFnX2RlZmF1bHQgMjY1MQorLy8gICAgI3ByYWdtYSBkaWFnX2RlZmF1bHQgMjY1MworICAjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9XQVJOSU5HU19ESVNBQkxFRApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9TdGF0aWNBc3NlcnQuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvU3RhdGljQXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzMzYxYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvU3RhdGljQXNzZXJ0LmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVEFUSUNfQVNTRVJUX0gKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9ICisKKy8qIFNvbWUgbm90ZXMgb24gRWlnZW4ncyBzdGF0aWMgYXNzZXJ0aW9uIG1lY2hhbmlzbToKKyAqCisgKiAgLSBpbiBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIHRoZSBwYXJhbWV0ZXIgQ09ORElUSU9OIG11c3QgYmUgYSBjb21waWxlIHRpbWUgYm9vbGVhbgorICogICAgZXhwcmVzc2lvbiwgYW5kIE1TRyBhbiBlbnVtIGxpc3RlZCBpbiBzdHJ1Y3QgaW50ZXJuYWw6OnN0YXRpY19hc3NlcnRpb248dHJ1ZT4KKyAqCisgKiAgLSBkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVCB0byBkaXNhYmxlIHRoZW0gKGFuZCBzYXZlIGNvbXBpbGF0aW9uIHRpbWUpCisgKiAgICBpbiB0aGF0IGNhc2UsIHRoZSBzdGF0aWMgYXNzZXJ0aW9uIGlzIGNvbnZlcnRlZCB0byB0aGUgZm9sbG93aW5nIHJ1bnRpbWUgYXNzZXJ0OgorICogICAgICBlaWdlbl9hc3NlcnQoQ09ORElUSU9OICYmICJNU0ciKQorICoKKyAqICAtIGN1cnJlbnRseSBFSUdFTl9TVEFUSUNfQVNTRVJUIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb24gc2NvcGUKKyAqCisgKi8KKworI2lmbmRlZiBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyAgI2lmIEVJR0VOX01BWF9DUFBfVkVSPj0xMSAmJiAoX19oYXNfZmVhdHVyZShjeHhfc3RhdGljX2Fzc2VydCkgfHwgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIHx8IChFSUdFTl9DT01QX01TVkMgPj0gMTYwMCkpCisKKyAgICAvLyBpZiBuYXRpdmUgc3RhdGljX2Fzc2VydCBpcyBlbmFibGVkLCBsZXQncyB1c2UgaXQKKyAgICAjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlQoWCxNU0cpIHN0YXRpY19hc3NlcnQoWCwjTVNHKTsKKworICAjZWxzZSAvLyBub3QgQ1hYMFgKKworICAgIG5hbWVzcGFjZSBFaWdlbiB7CisKKyAgICBuYW1lc3BhY2UgaW50ZXJuYWwgeworCisgICAgdGVtcGxhdGU8Ym9vbCBjb25kaXRpb24+CisgICAgc3RydWN0IHN0YXRpY19hc3NlcnRpb24ge307CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHN0YXRpY19hc3NlcnRpb248dHJ1ZT4KKyAgICB7CisgICAgICBlbnVtIHsKKyAgICAgICAgWU9VX1RSSUVEX0NBTExJTkdfQV9WRUNUT1JfTUVUSE9EX09OX0FfTUFUUklYLAorICAgICAgICBZT1VfTUlYRURfVkVDVE9SU19PRl9ESUZGRVJFTlRfU0laRVMsCisgICAgICAgIFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1ZFQ1RPUlNfT0ZfQV9TUEVDSUZJQ19TSVpFLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9NQVRSSUNFU19PRl9BX1NQRUNJRklDX1NJWkUsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX09CSkVDVFNfT0ZfQV9TUEVDSUZJQ19TSVpFLAorICAgICAgICBPVVRfT0ZfUkFOR0VfQUNDRVNTLAorICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UsCisgICAgICAgIEVJR0VOX0lOVEVSTkFMX0VSUk9SX1BMRUFTRV9GSUxFX0FfQlVHX1JFUE9SVCwKKyAgICAgICAgRUlHRU5fSU5URVJOQUxfQ09NUElMQVRJT05fRVJST1JfT1JfWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFLAorICAgICAgICBZT1VfQ0FMTEVEX0FfRklYRURfU0laRV9NRVRIT0RfT05fQV9EWU5BTUlDX1NJWkVfTUFUUklYX09SX1ZFQ1RPUiwKKyAgICAgICAgWU9VX0NBTExFRF9BX0RZTkFNSUNfU0laRV9NRVRIT0RfT05fQV9GSVhFRF9TSVpFX01BVFJJWF9PUl9WRUNUT1IsCisgICAgICAgIFVOQUxJR05FRF9MT0FEX0FORF9TVE9SRV9PUEVSQVRJT05TX1VOSU1QTEVNRU5URURfT05fQUxUSVZFQywKKyAgICAgICAgVEhJU19GVU5DVElPTl9JU19OT1RfRk9SX0lOVEVHRVJfTlVNRVJJQ19UWVBFUywKKyAgICAgICAgRkxPQVRJTkdfUE9JTlRfQVJHVU1FTlRfUEFTU0VEX19JTlRFR0VSX1dBU19FWFBFQ1RFRCwKKyAgICAgICAgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCwKKyAgICAgICAgQ09FRkZJQ0lFTlRfV1JJVEVfQUNDRVNTX1RPX1NFTEZBREpPSU5UX05PVF9TVVBQT1JURUQsCisgICAgICAgIFdSSVRJTkdfVE9fVFJJQU5HVUxBUl9QQVJUX1dJVEhfVU5JVF9ESUFHT05BTF9JU19OT1RfU1VQUE9SVEVELAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9GSVhFRF9TSVpFLAorICAgICAgICBJTlZBTElEX01BVFJJWF9QUk9EVUNULAorICAgICAgICBJTlZBTElEX1ZFQ1RPUl9WRUNUT1JfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0RPVF9PUl9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTlMsCisgICAgICAgIElOVkFMSURfTUFUUklYX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTiwKKyAgICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFksCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUywKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfUk9XX01BSk9SX01BVFJJQ0VTLAorICAgICAgICBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTLAorICAgICAgICBJTlZBTElEX01BVFJJWEJBU0VfVEVNUExBVEVfUEFSQU1FVEVSUywKKyAgICAgICAgQk9USF9NQVRSSUNFU19NVVNUX0hBVkVfVEhFX1NBTUVfU1RPUkFHRV9PUkRFUiwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfRElBR09OQUxfTUFUUklYLAorICAgICAgICBUSEVfTUFUUklYX09SX0VYUFJFU1NJT05fVEhBVF9ZT1VfUEFTU0VEX0RPRVNfTk9UX0hBVkVfVEhFX0VYUEVDVEVEX1RZUEUsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX1dJVEhfRElSRUNUX01FTU9SWV9BQ0NFU1NfU1VDSF9BU19NQVBfT1JfUExBSU5fTUFUUklDRVMsCisgICAgICAgIFlPVV9BTFJFQURZX1NQRUNJRklFRF9USElTX1NUUklERSwKKyAgICAgICAgSU5WQUxJRF9TVE9SQUdFX09SREVSX0ZPUl9USElTX1ZFQ1RPUl9FWFBSRVNTSU9OLAorICAgICAgICBUSEVfQlJBQ0tFVF9PUEVSQVRPUl9JU19PTkxZX0ZPUl9WRUNUT1JTX19VU0VfVEhFX1BBUkVOVEhFU0lTX09QRVJBVE9SX0lOU1RFQUQsCisgICAgICAgIFBBQ0tFVF9BQ0NFU1NfUkVRVUlSRVNfVE9fSEFWRV9JTk5FUl9TVFJJREVfRklYRURfVE9fMSwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfU1BFQ0lGSUNfVFJBTlNGT1JNQVRJT05TLAorICAgICAgICBZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTLAorICAgICAgICBZT1VfUEVSRk9STUVEX0FOX0lOVkFMSURfVFJBTlNGT1JNQVRJT05fQ09OVkVSU0lPTiwKKyAgICAgICAgVEhJU19FWFBSRVNTSU9OX0lTX05PVF9BX0xWQUxVRV9fSVRfSVNfUkVBRF9PTkxZLAorICAgICAgICBZT1VfQVJFX1RSWUlOR19UT19VU0VfQU5fSU5ERVhfQkFTRURfQUNDRVNTT1JfT05fQU5fRVhQUkVTU0lPTl9USEFUX0RPRVNfTk9UX1NVUFBPUlRfVEhBVCwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfMXgxX0VYUFJFU1NJT05TLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9JTk5FUl9PUl9MQVpZX1BST0RVQ1RTLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19PRl9CT09MLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9BUlJBWVNfTk9UX01BVFJJQ0VTLAorICAgICAgICBZT1VfUEFTU0VEX0FfUk9XX1ZFQ1RPUl9CVVRfQV9DT0xVTU5fVkVDVE9SX1dBU19FWFBFQ1RFRCwKKyAgICAgICAgWU9VX1BBU1NFRF9BX0NPTFVNTl9WRUNUT1JfQlVUX0FfUk9XX1ZFQ1RPUl9XQVNfRVhQRUNURUQsCisgICAgICAgIFRIRV9JTkRFWF9UWVBFX01VU1RfQkVfQV9TSUdORURfVFlQRSwKKyAgICAgICAgVEhFX1NUT1JBR0VfT1JERVJfT0ZfQk9USF9TSURFU19NVVNUX01BVENILAorICAgICAgICBPQkpFQ1RfQUxMT0NBVEVEX09OX1NUQUNLX0lTX1RPT19CSUcsCisgICAgICAgIElNUExJQ0lUX0NPTlZFUlNJT05fVE9fU0NBTEFSX0lTX0ZPUl9JTk5FUl9QUk9EVUNUX09OTFksCisgICAgICAgIFNUT1JBR0VfTEFZT1VUX0RPRVNfTk9UX01BVENILAorICAgICAgICBFSUdFTl9JTlRFUk5BTF9FUlJPUl9QTEVBU0VfRklMRV9BX0JVR19SRVBPUlRfX0lOVkFMSURfQ09TVF9WQUxVRSwKKyAgICAgICAgVEhJU19DT0VGRklDSUVOVF9BQ0NFU1NPUl9UQUtJTkdfT05FX0FDQ0VTU19JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19BTExPV0lOR19MSU5FQVJfQUNDRVNTLAorICAgICAgICBNQVRSSVhfRlJFRV9DT05KVUdBVEVfR1JBRElFTlRfSVNfQ09NUEFUSUJMRV9XSVRIX1VQUEVSX1VOSU9OX0xPV0VSX01PREVfT05MWSwKKyAgICAgICAgVEhJU19UWVBFX0lTX05PVF9TVVBQT1JURUQsCisgICAgICAgIFNUT1JBR0VfS0lORF9NVVNUX01BVENILAorICAgICAgICBTVE9SQUdFX0lOREVYX01VU1RfTUFUQ0gsCisgICAgICAgIENIT0xNT0RfU1VQUE9SVFNfRE9VQkxFX1BSRUNJU0lPTl9PTkxZCisgICAgICB9OworICAgIH07CisKKyAgICB9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworICAgIH0gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisgICAgLy8gU3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIE1TVkMgdG8gYXZvaWQgImNvbmRpdGlvbmFsCisgICAgLy8gZXhwcmVzc2lvbiBpcyBjb25zdGFudCIgd2FybmluZ3MuICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAgICAvLyBhcHBlYXIgdG8gd29yayB1bmRlciBHQ0MsIGhlbmNlIHRoZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgI2lmIEVJR0VOX0NPTVBfTVNWQworCisgICAgICAjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlQoQ09ORElUSU9OLE1TRykgXAorICAgICAgICB7RWlnZW46OmludGVybmFsOjpzdGF0aWNfYXNzZXJ0aW9uPGJvb2woQ09ORElUSU9OKT46Ok1TRzt9CisKKyAgICAjZWxzZQorICAgICAgLy8gSW4gc29tZSBjYXNlcyBjbGFuZyBpbnRlcnByZXRzIGJvb2woQ09ORElUSU9OKSBhcyBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICAgICAgI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIFwKKyAgICAgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6c3RhdGljX2Fzc2VydGlvbjxzdGF0aWNfY2FzdDxib29sPihDT05ESVRJT04pPjo6TVNHKSB7fQorCisgICAgI2VuZGlmCisKKyAgI2VuZGlmIC8vIG5vdCBDWFgwWAorCisjZWxzZSAvLyBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyAgI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIGVpZ2VuX2Fzc2VydCgoQ09ORElUSU9OKSAmJiAjTVNHKTsKKworI2VuZGlmIC8vIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworCisvLyBzdGF0aWMgYXNzZXJ0aW9uIGZhaWxpbmcgaWYgdGhlIHR5cGUgXGEgVFlQRSBpcyBub3QgYSB2ZWN0b3IgdHlwZQorI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKFRZUEUpIFwKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChUWVBFOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfVFJJRURfQ0FMTElOR19BX1ZFQ1RPUl9NRVRIT0RfT05fQV9NQVRSSVgpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHlwZSBcYSBUWVBFIGlzIG5vdCBmaXhlZC1zaXplCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfRklYRURfU0laRShUWVBFKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoVFlQRTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUVpZ2VuOjpEeW5hbWljLCBcCisgICAgICAgICAgICAgICAgICAgICAgWU9VX0NBTExFRF9BX0ZJWEVEX1NJWkVfTUVUSE9EX09OX0FfRFlOQU1JQ19TSVpFX01BVFJJWF9PUl9WRUNUT1IpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHlwZSBcYSBUWVBFIGlzIG5vdCBkeW5hbWljLXNpemUKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1NJWkUoVFlQRSkgXAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFRZUEU6OlNpemVBdENvbXBpbGVUaW1lPT1FaWdlbjo6RHluYW1pYywgXAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9DQUxMRURfQV9EWU5BTUlDX1NJWkVfTUVUSE9EX09OX0FfRklYRURfU0laRV9NQVRSSVhfT1JfVkVDVE9SKQorCisvLyBzdGF0aWMgYXNzZXJ0aW9uIGZhaWxpbmcgaWYgdGhlIHR5cGUgXGEgVFlQRSBpcyBub3QgYSB2ZWN0b3IgdHlwZSBvZiB0aGUgZ2l2ZW4gc2l6ZQorI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKFRZUEUsIFNJWkUpIFwKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChUWVBFOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgVFlQRTo6U2l6ZUF0Q29tcGlsZVRpbWU9PVNJWkUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9WRUNUT1JTX09GX0FfU1BFQ0lGSUNfU0laRSkKKworLy8gc3RhdGljIGFzc2VydGlvbiBmYWlsaW5nIGlmIHRoZSB0eXBlIFxhIFRZUEUgaXMgbm90IGEgdmVjdG9yIHR5cGUgb2YgdGhlIGdpdmVuIHNpemUKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9NQVRSSVhfU1BFQ0lGSUNfU0laRShUWVBFLCBST1dTLCBDT0xTKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoVFlQRTo6Um93c0F0Q29tcGlsZVRpbWU9PVJPV1MgJiYgVFlQRTo6Q29sc0F0Q29tcGlsZVRpbWU9PUNPTFMsIFwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9NQVRSSUNFU19PRl9BX1NQRUNJRklDX1NJWkUpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHdvIHZlY3RvciBleHByZXNzaW9uIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZSAoc2FtZSBmaXhlZC1zaXplIG9yIGR5bmFtaWMgc2l6ZSkKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKFRZUEUwLFRZUEUxKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIFwKKyAgICAgIChpbnQoVFlQRTA6OlNpemVBdENvbXBpbGVUaW1lKT09RWlnZW46OkR5bmFtaWMgXAorICAgIHx8IGludChUWVBFMTo6U2l6ZUF0Q29tcGlsZVRpbWUpPT1FaWdlbjo6RHluYW1pYyBcCisgICAgfHwgaW50KFRZUEUwOjpTaXplQXRDb21waWxlVGltZSk9PWludChUWVBFMTo6U2l6ZUF0Q29tcGlsZVRpbWUpKSxcCisgICAgWU9VX01JWEVEX1ZFQ1RPUlNfT0ZfRElGRkVSRU5UX1NJWkVTKQorCisjZGVmaW5lIEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKFRZUEUwLFRZUEUxKSBcCisgICAgICggXAorICAgICAgICAoaW50KEVpZ2VuOjppbnRlcm5hbDo6c2l6ZV9vZl94cHJfYXRfY29tcGlsZV90aW1lPFRZUEUwPjo6cmV0KT09MCAmJiBpbnQoRWlnZW46OmludGVybmFsOjpzaXplX29mX3hwcl9hdF9jb21waWxlX3RpbWU8VFlQRTE+OjpyZXQpPT0wKSBcCisgICAgfHwgKFwKKyAgICAgICAgICAoaW50KFRZUEUwOjpSb3dzQXRDb21waWxlVGltZSk9PUVpZ2VuOjpEeW5hbWljIFwKKyAgICAgICAgfHwgaW50KFRZUEUxOjpSb3dzQXRDb21waWxlVGltZSk9PUVpZ2VuOjpEeW5hbWljIFwKKyAgICAgICAgfHwgaW50KFRZUEUwOjpSb3dzQXRDb21waWxlVGltZSk9PWludChUWVBFMTo6Um93c0F0Q29tcGlsZVRpbWUpKSBcCisgICAgICAmJiAgKGludChUWVBFMDo6Q29sc0F0Q29tcGlsZVRpbWUpPT1FaWdlbjo6RHluYW1pYyBcCisgICAgICAgIHx8IGludChUWVBFMTo6Q29sc0F0Q29tcGlsZVRpbWUpPT1FaWdlbjo6RHluYW1pYyBcCisgICAgICAgIHx8IGludChUWVBFMDo6Q29sc0F0Q29tcGlsZVRpbWUpPT1pbnQoVFlQRTE6OkNvbHNBdENvbXBpbGVUaW1lKSlcCisgICAgICAgKSBcCisgICAgICkKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFRZUEUpIFwKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFOdW1UcmFpdHM8VFlQRT46OklzSW50ZWdlciwgVEhJU19GVU5DVElPTl9JU19OT1RfRk9SX0lOVEVHRVJfTlVNRVJJQ19UWVBFUykKKworCisvLyBzdGF0aWMgYXNzZXJ0aW9uIGZhaWxpbmcgaWYgaXQgaXMgZ3VhcmFudGVlZCBhdCBjb21waWxlLXRpbWUgdGhhdCB0aGUgdHdvIG1hdHJpeCBleHByZXNzaW9uIHR5cGVzIGhhdmUgZGlmZmVyZW50IHNpemVzCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShUWVBFMCxUWVBFMSkgXAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKCBcCisgICAgIEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKFRZUEUwLFRZUEUxKSxcCisgICAgWU9VX01JWEVEX01BVFJJQ0VTX09GX0RJRkZFUkVOVF9TSVpFUykKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX1NJWkVfMXgxKFRZUEUpIFwKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFRZUEU6OlJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgVFlQRTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoVFlQRTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBUWVBFOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl8xeDFfRVhQUkVTU0lPTlMpCisKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoRGVyaXZlZCkgXAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFaWdlbjo6aW50ZXJuYWw6OmlzX2x2YWx1ZTxEZXJpdmVkPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19FWFBSRVNTSU9OX0lTX05PVF9BX0xWQUxVRV9fSVRfSVNfUkVBRF9PTkxZKQorCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfQVJSQVlYUFIoRGVyaXZlZCkgXAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpYcHJLaW5kLCBBcnJheVhwcj46OnZhbHVlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9BUlJBWVNfTk9UX01BVFJJQ0VTKQorCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChEZXJpdmVkMSwgRGVyaXZlZDIpIFwKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkMT46OlhwcktpbmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQyPjo6WHByS2luZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnZhbHVlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTKQorCisvLyBDaGVjayB0aGF0IGEgY29zdCB2YWx1ZSBpcyBwb3NpdGl2ZSwgYW5kIHRoYXQgaXMgc3RheSB3aXRoaW4gYSByZWFzb25hYmxlIHJhbmdlCisvLyBUT0RPIHRoaXMgY2hlY2sgY291bGQgYmUgZW5hYmxlZCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkKKyNkZWZpbmUgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDKSBcCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChDKT49MCAmJiAoQyk8PUh1Z2VDb3N0Kkh1Z2VDb3N0LCBFSUdFTl9JTlRFUk5BTF9FUlJPUl9QTEVBU0VfRklMRV9BX0JVR19SRVBPUlRfX0lOVkFMSURfQ09TVF9WQUxVRSk7CisKKyNlbmRpZiAvLyBFSUdFTl9TVEFUSUNfQVNTRVJUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3V0aWwvWHBySGVscGVyLmggYi9FaWdlbi9zcmMvQ29yZS91dGlsL1hwckhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWJkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL1hwckhlbHBlci5oCkBAIC0wLDAgKzEsODIxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9YUFJIRUxQRVJfSAorI2RlZmluZSBFSUdFTl9YUFJIRUxQRVJfSAorCisvLyBqdXN0IGEgd29ya2Fyb3VuZCBiZWNhdXNlIEdDQyBzZWVtcyB0byBub3QgcmVhbGx5IGxpa2UgZW1wdHkgc3RydWN0cworLy8gRklYTUU6IGdjYyA0LjMgZ2VuZXJhdGVzIGJhZCBjb2RlIHdoZW4gc3RyaWN0LWFsaWFzaW5nIGlzIGVuYWJsZWQKKy8vIHNvIGN1cnJlbnRseSB3ZSBzaW1wbHkgZGlzYWJsZSB0aGlzIG9wdGltaXphdGlvbiBmb3IgZ2NjIDQuMworI2lmIEVJR0VOX0NPTVBfR05VQyAmJiAhRUlHRU5fR05VQ19BVCg0LDMpCisgICNkZWZpbmUgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IoWCkgXAorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgWCgpIHt9IFwKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFgoY29uc3QgWCYgKSB7fQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihYKQorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4RGVzdCwgdHlwZW5hbWUgSW5kZXhTcmM+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEluZGV4RGVzdCBjb252ZXJ0X2luZGV4KGNvbnN0IEluZGV4U3JjJiBpZHgpIHsKKyAgLy8gZm9yIHNpemVvZihJbmRleERlc3QpPj1zaXplb2YoSW5kZXhTcmMpIGNvbXBpbGVycyBzaG91bGQgYmUgYWJsZSB0byBvcHRpbWl6ZSB0aGlzIGF3YXk6CisgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpZHggPD0gTnVtVHJhaXRzPEluZGV4RGVzdD46OmhpZ2hlc3QoKSAmJiAiSW5kZXggdmFsdWUgdG8gYmlnIGZvciB0YXJnZXQgdHlwZSIpOworICByZXR1cm4gSW5kZXhEZXN0KGlkeCk7Cit9CisKKworLy8gcHJvbW90ZV9zY2FsYXJfYXJnIGlzIGFuIGhlbHBlciB1c2VkIGluIG9wZXJhdGlvbiBiZXR3ZWVuIGFuIGV4cHJlc3Npb24gYW5kIGEgc2NhbGFyLCBsaWtlOgorLy8gICAgZXhwcmVzc2lvbiAqIHNjYWxhcgorLy8gSXRzIHJvbGUgaXMgdG8gZGV0ZXJtaW5lIGhvdyB0aGUgdHlwZSBUIG9mIHRoZSBzY2FsYXIgb3BlcmFuZCBzaG91bGQgYmUgcHJvbW90ZWQgZ2l2ZW4gdGhlIHNjYWxhciB0eXBlIEV4cHJTY2FsYXIgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisvLyBUaGUgSXNTdXBwb3J0ZWQgdGVtcGxhdGUgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciBhczogaW50ZXJuYWw6Omhhc19SZXR1cm5UeXBlPFNjYWxhckJpbmFyeU9wVHJhaXRzPEV4cHJTY2FsYXIsVCxvcD4gPjo6dmFsdWUgdXNpbmcgdGhlIHByb3BlciBvcmRlciBmb3IgRXhwclNjYWxhciBhbmQgVC4KKy8vIFRoZW4gdGhlIGxvZ2ljIGlzIGFzIGZvbGxvd3M6CisvLyAgLSBpZiB0aGUgb3BlcmF0aW9uIGlzIG5hdGl2ZWx5IHN1cHBvcnRlZCBhcyBkZWZpbmVkIGJ5IElzU3VwcG9ydGVkLCB0aGVuIHRoZSBzY2FsYXIgdHlwZSBpcyBub3QgcHJvbW90ZWQsIGFuZCBUIGlzIHJldHVybmVkLgorLy8gIC0gb3RoZXJ3aXNlLCBOdW1UcmFpdHM8RXhwclNjYWxhcj46OkxpdGVyYWwgaXMgcmV0dXJuZWQgaWYgVCBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIE51bVRyYWl0czxFeHByU2NhbGFyPjo6TGl0ZXJhbCBBTkQgdGhhdCB0aGlzIGRvZXMgbm90IGltcGx5IGEgZmxvYXQgdG8gaW50ZWdlciBjb252ZXJzaW9uLgorLy8gIC0gb3RoZXJ3aXNlLCBFeHByU2NhbGFyIGlzIHJldHVybmVkIGlmIFQgaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBFeHByU2NhbGFyIEFORCB0aGF0IHRoaXMgZG9lcyBub3QgaW1wbHkgYSBmbG9hdCB0byBpbnRlZ2VyIGNvbnZlcnNpb24uCisvLyAgLSBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBwcm9tb3RlZCB0eXBlIGlzIG5vdCBkZWZpbmVkLCBhbmQgdGhlIHJlc3BlY3RpdmUgb3BlcmF0aW9uIGlzIHRodXMgaW52YWxpZCBhbmQgbm90IGF2YWlsYWJsZSAoU0ZJTkFFKS4KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJTY2FsYXIsdHlwZW5hbWUgVCwgYm9vbCBJc1N1cHBvcnRlZD4KK3N0cnVjdCBwcm9tb3RlX3NjYWxhcl9hcmc7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsdHlwZW5hbWUgVD4KK3N0cnVjdCBwcm9tb3RlX3NjYWxhcl9hcmc8UyxULHRydWU+Cit7CisgIHR5cGVkZWYgVCB0eXBlOworfTsKKworLy8gUmVjdXJzaXZlbHkgY2hlY2sgc2FmZSBjb252ZXJzaW9uIHRvIFByb21vdGVkVHlwZSwgYW5kIHRoZW4gRXhwclNjYWxhciBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByU2NhbGFyLHR5cGVuYW1lIFQsdHlwZW5hbWUgUHJvbW90ZWRUeXBlLAorICBib29sIENvbnZlcnRpYmxlVG9MaXRlcmFsID0gaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPFQsUHJvbW90ZWRUeXBlPjo6dmFsdWUsCisgIGJvb2wgSXNTYWZlID0gTnVtVHJhaXRzPFQ+OjpJc0ludGVnZXIgfHwgIU51bVRyYWl0czxQcm9tb3RlZFR5cGU+OjpJc0ludGVnZXI+CitzdHJ1Y3QgcHJvbW90ZV9zY2FsYXJfYXJnX3Vuc3VwcG9ydGVkOworCisvLyBTdGFydCByZWN1cnNpb24gd2l0aCBOdW1UcmFpdHM8RXhwclNjYWxhcj46OkxpdGVyYWwKK3RlbXBsYXRlPHR5cGVuYW1lIFMsdHlwZW5hbWUgVD4KK3N0cnVjdCBwcm9tb3RlX3NjYWxhcl9hcmc8UyxULGZhbHNlPiA6IHByb21vdGVfc2NhbGFyX2FyZ191bnN1cHBvcnRlZDxTLFQsdHlwZW5hbWUgTnVtVHJhaXRzPFM+OjpMaXRlcmFsPiB7fTsKKworLy8gV2UgZm91bmQgYSBtYXRjaCEKK3RlbXBsYXRlPHR5cGVuYW1lIFMsdHlwZW5hbWUgVCwgdHlwZW5hbWUgUHJvbW90ZWRUeXBlPgorc3RydWN0IHByb21vdGVfc2NhbGFyX2FyZ191bnN1cHBvcnRlZDxTLFQsUHJvbW90ZWRUeXBlLHRydWUsdHJ1ZT4KK3sKKyAgdHlwZWRlZiBQcm9tb3RlZFR5cGUgdHlwZTsKK307CisKKy8vIE5vIG1hdGNoLCBidXQgbm8gcmVhbC10by1pbnRlZ2VyIGlzc3VlcywgYW5kIEV4cHJTY2FsYXIgYW5kIGN1cnJlbnQgUHJvbW90ZWRUeXBlIGFyZSBkaWZmZXJlbnQsCisvLyBzbyBsZXQncyB0cnkgdG8gcHJvbW90ZSB0byBFeHByU2NhbGFyCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByU2NhbGFyLHR5cGVuYW1lIFQsIHR5cGVuYW1lIFByb21vdGVkVHlwZT4KK3N0cnVjdCBwcm9tb3RlX3NjYWxhcl9hcmdfdW5zdXBwb3J0ZWQ8RXhwclNjYWxhcixULFByb21vdGVkVHlwZSxmYWxzZSx0cnVlPgorICAgOiBwcm9tb3RlX3NjYWxhcl9hcmdfdW5zdXBwb3J0ZWQ8RXhwclNjYWxhcixULEV4cHJTY2FsYXI+Cit7fTsKKworLy8gVW5zYWZlIHJlYWwtdG8taW50ZWdlciwgbGV0J3Mgc3RvcC4KK3RlbXBsYXRlPHR5cGVuYW1lIFMsdHlwZW5hbWUgVCwgdHlwZW5hbWUgUHJvbW90ZWRUeXBlLCBib29sIENvbnZlcnRpYmxlVG9MaXRlcmFsPgorc3RydWN0IHByb21vdGVfc2NhbGFyX2FyZ191bnN1cHBvcnRlZDxTLFQsUHJvbW90ZWRUeXBlLENvbnZlcnRpYmxlVG9MaXRlcmFsLGZhbHNlPiB7fTsKKworLy8gVCBpcyBub3QgZXZlbiBjb252ZXJ0aWJsZSB0byBFeHByU2NhbGFyLCBsZXQncyBzdG9wLgordGVtcGxhdGU8dHlwZW5hbWUgUyx0eXBlbmFtZSBUPgorc3RydWN0IHByb21vdGVfc2NhbGFyX2FyZ191bnN1cHBvcnRlZDxTLFQsUyxmYWxzZSx0cnVlPiB7fTsKKworLy9jbGFzc2VzIGluaGVyaXRpbmcgbm9fYXNzaWdubWVudF9vcGVyYXRvciBkb24ndCBnZW5lcmF0ZSBhIGRlZmF1bHQgb3BlcmF0b3I9LgorY2xhc3Mgbm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwcml2YXRlOgorICAgIG5vX2Fzc2lnbm1lbnRfb3BlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBub19hc3NpZ25tZW50X29wZXJhdG9yJik7Cit9OworCisvKiogXGludGVybmFsIHJldHVybiB0aGUgaW5kZXggdHlwZSB3aXRoIHRoZSBsYXJnZXN0IG51bWJlciBvZiBiaXRzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBJMSwgdHlwZW5hbWUgSTI+CitzdHJ1Y3QgcHJvbW90ZV9pbmRleF90eXBlCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8KHNpemVvZihJMSk8c2l6ZW9mKEkyKSksIEkyLCBJMT46OnR5cGUgdHlwZTsKK307CisKKy8qKiBcaW50ZXJuYWwgSWYgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBWYWx1ZSBpcyBEeW5hbWljLCB0aGlzIGNsYXNzIGlzIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBhIFQgdmFyaWFibGUgdGhhdAorICAqIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB2YWx1ZSgpIGFuZCBzZXRWYWx1ZSgpLgorICAqIE90aGVyd2lzZSwgdGhpcyBjbGFzcyBpcyBhbiBlbXB0eSBzdHJ1Y3R1cmUgYW5kIHZhbHVlKCkganVzdCByZXR1cm5zIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVmFsdWUuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgVmFsdWU+IGNsYXNzIHZhcmlhYmxlX2lmX2R5bmFtaWMKK3sKKyAgcHVibGljOgorICAgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHZhcmlhYmxlX2lmX2R5bmFtaWMpCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCB2YXJpYWJsZV9pZl9keW5hbWljKFQgdikgeyBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHYpOyBlaWdlbl9hc3NlcnQodiA9PSBUKFZhbHVlKSk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBUIHZhbHVlKCkgeyByZXR1cm4gVChWYWx1ZSk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgc2V0VmFsdWUoVCkge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZhcmlhYmxlX2lmX2R5bmFtaWM8VCwgRHluYW1pYz4KK3sKKyAgICBUIG1fdmFsdWU7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdmFyaWFibGVfaWZfZHluYW1pYygpIHsgZWlnZW5fYXNzZXJ0KGZhbHNlKTsgfQorICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCB2YXJpYWJsZV9pZl9keW5hbWljKFQgdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9Cit9OworCisvKiogXGludGVybmFsIGxpa2UgdmFyaWFibGVfaWZfZHluYW1pYyBidXQgZm9yIER5bmFtaWNJbmRleAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFZhbHVlPiBjbGFzcyB2YXJpYWJsZV9pZl9keW5hbWljaW5kZXgKK3sKKyAgcHVibGljOgorICAgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHZhcmlhYmxlX2lmX2R5bmFtaWNpbmRleCkKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IHZhcmlhYmxlX2lmX2R5bmFtaWNpbmRleChUIHYpIHsgRUlHRU5fT05MWV9VU0VEX0ZPUl9ERUJVRyh2KTsgZWlnZW5fYXNzZXJ0KHYgPT0gVChWYWx1ZSkpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgVCB2YWx1ZSgpIHsgcmV0dXJuIFQoVmFsdWUpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHNldFZhbHVlKFQpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2YXJpYWJsZV9pZl9keW5hbWljaW5kZXg8VCwgRHluYW1pY0luZGV4PgoreworICAgIFQgbV92YWx1ZTsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2YXJpYWJsZV9pZl9keW5hbWljaW5kZXgoKSB7IGVpZ2VuX2Fzc2VydChmYWxzZSk7IH0KKyAgcHVibGljOgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgdmFyaWFibGVfaWZfZHluYW1pY2luZGV4KFQgdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSkge30KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBUIEVJR0VOX1NUUk9OR19JTkxJTkUgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHMKK3sKKyAgZW51bQorICB7CisgICAgQ29zdCA9IDEwLAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlLAorICAgIElzUmVwZWF0YWJsZSA9IGZhbHNlCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcGFja2V0X3RyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHVucGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFQgdHlwZTsKKyAgdHlwZWRlZiBUIGhhbGY7CisgIGVudW0KKyAgeworICAgIHNpemUgPSAxLAorICAgIGFsaWdubWVudCA9IDEKKyAgfTsKK307CisKK3RlbXBsYXRlPGludCBTaXplLCB0eXBlbmFtZSBQYWNrZXRUeXBlLAorICAgICAgICAgYm9vbCBTdG9wID0gU2l6ZT09RHluYW1pYyB8fCAoU2l6ZSV1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemUpPT0wIHx8IGlzX3NhbWU8UGFja2V0VHlwZSx0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OmhhbGY+Ojp2YWx1ZT4KK3N0cnVjdCBmaW5kX2Jlc3RfcGFja2V0X2hlbHBlcjsKKwordGVtcGxhdGU8IGludCBTaXplLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorc3RydWN0IGZpbmRfYmVzdF9wYWNrZXRfaGVscGVyPFNpemUsUGFja2V0VHlwZSx0cnVlPgoreworICB0eXBlZGVmIFBhY2tldFR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPGludCBTaXplLCB0eXBlbmFtZSBQYWNrZXRUeXBlPgorc3RydWN0IGZpbmRfYmVzdF9wYWNrZXRfaGVscGVyPFNpemUsUGFja2V0VHlwZSxmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBmaW5kX2Jlc3RfcGFja2V0X2hlbHBlcjxTaXplLHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXRUeXBlPjo6aGFsZj46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplPgorc3RydWN0IGZpbmRfYmVzdF9wYWNrZXQKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBmaW5kX2Jlc3RfcGFja2V0X2hlbHBlcjxTaXplLHR5cGVuYW1lIHBhY2tldF90cmFpdHM8VD46OnR5cGU+Ojp0eXBlIHR5cGU7Cit9OworCisjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUz4wCit0ZW1wbGF0ZTxpbnQgQXJyYXlCeXRlcywgaW50IEFsaWdubWVudEJ5dGVzLAorICAgICAgICAgYm9vbCBNYXRjaCAgICAgPSAgYm9vbCgoQXJyYXlCeXRlcyVBbGlnbm1lbnRCeXRlcyk9PTApLAorICAgICAgICAgYm9vbCBUcnlIYWxmICAgPSAgYm9vbChFSUdFTl9NSU5fQUxJR05fQllURVM8QWxpZ25tZW50Qnl0ZXMpID4KK3N0cnVjdCBjb21wdXRlX2RlZmF1bHRfYWxpZ25tZW50X2hlbHBlcgoreworICBlbnVtIHsgdmFsdWUgPSAwIH07Cit9OworCit0ZW1wbGF0ZTxpbnQgQXJyYXlCeXRlcywgaW50IEFsaWdubWVudEJ5dGVzLCBib29sIFRyeUhhbGY+CitzdHJ1Y3QgY29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudF9oZWxwZXI8QXJyYXlCeXRlcywgQWxpZ25tZW50Qnl0ZXMsIHRydWUsIFRyeUhhbGY+IC8vIE1hdGNoCit7CisgIGVudW0geyB2YWx1ZSA9IEFsaWdubWVudEJ5dGVzIH07Cit9OworCit0ZW1wbGF0ZTxpbnQgQXJyYXlCeXRlcywgaW50IEFsaWdubWVudEJ5dGVzPgorc3RydWN0IGNvbXB1dGVfZGVmYXVsdF9hbGlnbm1lbnRfaGVscGVyPEFycmF5Qnl0ZXMsIEFsaWdubWVudEJ5dGVzLCBmYWxzZSwgdHJ1ZT4gLy8gVHJ5LWhhbGYKK3sKKyAgLy8gY3VycmVudCBwYWNrZXQgdG9vIGxhcmdlLCB0cnkgd2l0aCBhbiBoYWxmLXBhY2tldAorICBlbnVtIHsgdmFsdWUgPSBjb21wdXRlX2RlZmF1bHRfYWxpZ25tZW50X2hlbHBlcjxBcnJheUJ5dGVzLCBBbGlnbm1lbnRCeXRlcy8yPjo6dmFsdWUgfTsKK307CisjZWxzZQorLy8gSWYgc3RhdGljIGFsaWdubWVudCBpcyBkaXNhYmxlZCwgbm8gbmVlZCB0byBib3RoZXIuCisvLyBUaGlzIGFsc28gYXZvaWRzIGEgZGl2aXNpb24gYnkgemVybyBpbiAiYm9vbCBNYXRjaCA9ICBib29sKChBcnJheUJ5dGVzJUFsaWdubWVudEJ5dGVzKT09MCkiCit0ZW1wbGF0ZTxpbnQgQXJyYXlCeXRlcywgaW50IEFsaWdubWVudEJ5dGVzPgorc3RydWN0IGNvbXB1dGVfZGVmYXVsdF9hbGlnbm1lbnRfaGVscGVyCit7CisgIGVudW0geyB2YWx1ZSA9IDAgfTsKK307CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemU+IHN0cnVjdCBjb21wdXRlX2RlZmF1bHRfYWxpZ25tZW50IHsKKyAgZW51bSB7IHZhbHVlID0gY29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudF9oZWxwZXI8U2l6ZSpzaXplb2YoVCksRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUz46OnZhbHVlIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgY29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudDxULER5bmFtaWM+IHsKKyAgZW51bSB7IHZhbHVlID0gRUlHRU5fTUFYX0FMSUdOX0JZVEVTIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywKKyAgICAgICAgIGludCBfT3B0aW9ucyA9IEF1dG9BbGlnbiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICggKF9Sb3dzPT0xICYmIF9Db2xzIT0xKSA/IFJvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/IENvbE1ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04gKSwKKyAgICAgICAgIGludCBfTWF4Um93cyA9IF9Sb3dzLAorICAgICAgICAgaW50IF9NYXhDb2xzID0gX0NvbHMKKz4gY2xhc3MgbWFrZV9wcm9wZXJfbWF0cml4X3R5cGUKK3sKKyAgICBlbnVtIHsKKyAgICAgIElzQ29sVmVjdG9yID0gX0NvbHM9PTEgJiYgX1Jvd3MhPTEsCisgICAgICBJc1Jvd1ZlY3RvciA9IF9Sb3dzPT0xICYmIF9Db2xzIT0xLAorICAgICAgT3B0aW9ucyA9IElzQ29sVmVjdG9yID8gKF9PcHRpb25zIHwgQ29sTWFqb3IpICYgflJvd01ham9yCisgICAgICAgICAgICAgIDogSXNSb3dWZWN0b3IgPyAoX09wdGlvbnMgfCBSb3dNYWpvcikgJiB+Q29sTWFqb3IKKyAgICAgICAgICAgICAgOiBfT3B0aW9ucworICAgIH07CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLCBfUm93cywgX0NvbHMsIE9wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgT3B0aW9ucywgaW50IE1heFJvd3MsIGludCBNYXhDb2xzPgorY2xhc3MgY29tcHV0ZV9tYXRyaXhfZmxhZ3MKK3sKKyAgICBlbnVtIHsgcm93X21ham9yX2JpdCA9IE9wdGlvbnMmUm93TWFqb3IgPyBSb3dNYWpvckJpdCA6IDAgfTsKKyAgcHVibGljOgorICAgIC8vIEZJWE1FIGN1cnJlbnRseSB3ZSBzdGlsbCBoYXZlIHRvIGhhbmRsZSBEaXJlY3RBY2Nlc3NCaXQgYXQgdGhlIGV4cHJlc3Npb24gbGV2ZWwgdG8gaGFuZGxlIERlbnNlQ29lZmZzQmFzZTw+CisgICAgLy8gYW5kIHRoZW4gcHJvcGFnYXRlIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIGV2YWx1YXRvcidzIGZsYWdzLgorICAgIC8vIEhvd2V2ZXIsIEkgKEdhZWwpIHRoaW5rIHRoYXQgRGlyZWN0QWNjZXNzQml0IHNob3VsZCBvbmx5IG1hdHRlciBhdCB0aGUgZXZhbHVhdGlvbiBzdGFnZS4KKyAgICBlbnVtIHsgcmV0ID0gRGlyZWN0QWNjZXNzQml0IHwgTHZhbHVlQml0IHwgTmVzdEJ5UmVmQml0IHwgcm93X21ham9yX2JpdCB9OworfTsKKwordGVtcGxhdGU8aW50IF9Sb3dzLCBpbnQgX0NvbHM+IHN0cnVjdCBzaXplX2F0X2NvbXBpbGVfdGltZQoreworICBlbnVtIHsgcmV0ID0gKF9Sb3dzPT1EeW5hbWljIHx8IF9Db2xzPT1EeW5hbWljKSA/IER5bmFtaWMgOiBfUm93cyAqIF9Db2xzIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiBzdHJ1Y3Qgc2l6ZV9vZl94cHJfYXRfY29tcGlsZV90aW1lCit7CisgIGVudW0geyByZXQgPSBzaXplX2F0X2NvbXBpbGVfdGltZTx0cmFpdHM8WHByVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lLHRyYWl0czxYcHJUeXBlPjo6Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQgfTsKK307CisKKy8qIHBsYWluX21hdHJpeF90eXBlIDogdGhlIGRpZmZlcmVuY2UgZnJvbSBldmFsIGlzIHRoYXQgcGxhaW5fbWF0cml4X3R5cGUgaXMgYWx3YXlzIGEgcGxhaW4gbWF0cml4IHR5cGUsCisgKiB3aGVyZWFzIGV2YWwgaXMgYSBjb25zdCByZWZlcmVuY2UgaW4gdGhlIGNhc2Ugb2YgYSBtYXRyaXgKKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTdG9yYWdlS2luZCA9IHR5cGVuYW1lIHRyYWl0czxUPjo6U3RvcmFnZUtpbmQ+IHN0cnVjdCBwbGFpbl9tYXRyaXhfdHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEJhc2VDbGFzc1R5cGUsIGludCBGbGFncz4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlX2RlbnNlOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlPFQsRGVuc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGVfZGVuc2U8VCx0eXBlbmFtZSB0cmFpdHM8VD46OlhwcktpbmQsIHRyYWl0czxUPjo6RmxhZ3M+Ojp0eXBlIHR5cGU7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlPFQsRGlhZ29uYWxTaGFwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpQbGFpbk9iamVjdCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IEZsYWdzPiBzdHJ1Y3QgcGxhaW5fbWF0cml4X3R5cGVfZGVuc2U8VCxNYXRyaXhYcHIsRmxhZ3M+Cit7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBdXRvQWxpZ24gfCAoRmxhZ3MmUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yKSwKKyAgICAgICAgICAgICAgICB0cmFpdHM8VD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgRmxhZ3M+IHN0cnVjdCBwbGFpbl9tYXRyaXhfdHlwZV9kZW5zZTxULEFycmF5WHByLEZsYWdzPgoreworICB0eXBlZGVmIEFycmF5PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBdXRvQWxpZ24gfCAoRmxhZ3MmUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yKSwKKyAgICAgICAgICAgICAgICB0cmFpdHM8VD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICA+IHR5cGU7Cit9OworCisvKiBldmFsIDogdGhlIHJldHVybiB0eXBlIG9mIGV2YWwoKS4gRm9yIG1hdHJpY2VzLCB0aGlzIGlzIGp1c3QgYSBjb25zdCByZWZlcmVuY2UKKyAqIGluIG9yZGVyIHRvIGF2b2lkIGEgdXNlbGVzcyBjb3B5CisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgU3RvcmFnZUtpbmQgPSB0eXBlbmFtZSB0cmFpdHM8VD46OlN0b3JhZ2VLaW5kPiBzdHJ1Y3QgZXZhbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGV2YWw8VCxEZW5zZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxUPjo6dHlwZSB0eXBlOworLy8gICB0eXBlZGVmIHR5cGVuYW1lIFQ6OlBsYWluT2JqZWN0IHR5cGU7CisvLyAgIHR5cGVkZWYgVDo6TWF0cml4PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorLy8gICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisvLyAgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKy8vICAgICAgICAgICAgICAgICBBdXRvQWxpZ24gfCAodHJhaXRzPFQ+OjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IpLAorLy8gICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisvLyAgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpNYXhDb2xzQXRDb21waWxlVGltZQorLy8gICAgICAgICAgID4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBldmFsPFQsRGlhZ29uYWxTaGFwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxUPjo6dHlwZSB0eXBlOworfTsKKworLy8gZm9yIG1hdHJpY2VzLCBubyBuZWVkIHRvIGV2YWx1YXRlLCBqdXN0IHVzZSBhIGNvbnN0IHJlZmVyZW5jZSB0byBhdm9pZCBhIHVzZWxlc3MgY29weQordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3QgZXZhbDxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiwgRGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK3N0cnVjdCBldmFsPEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4sIERlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4mIHR5cGU7Cit9OworCisKKy8qIHNpbWlsYXIgdG8gcGxhaW5fbWF0cml4X3R5cGUsIGJ1dCB1c2luZyB0aGUgZXZhbHVhdG9yJ3MgRmxhZ3MgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kID0gdHlwZW5hbWUgdHJhaXRzPFQ+OjpTdG9yYWdlS2luZD4gc3RydWN0IHBsYWluX29iamVjdF9ldmFsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHBsYWluX29iamVjdF9ldmFsPFQsRGVuc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGVfZGVuc2U8VCx0eXBlbmFtZSB0cmFpdHM8VD46OlhwcktpbmQsIGV2YWx1YXRvcjxUPjo6RmxhZ3M+Ojp0eXBlIHR5cGU7Cit9OworCisKKy8qIHBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvciA6IHNhbWUgYXMgcGxhaW5fbWF0cml4X3R5cGUgYnV0IGd1YXJhbnRlZWQgdG8gYmUgY29sdW1uLW1ham9yCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3IKK3sKKyAgZW51bSB7IFJvd3MgPSB0cmFpdHM8VD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgQ29scyA9IHRyYWl0czxUPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICBNYXhSb3dzID0gdHJhaXRzPFQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgIE1heENvbHMgPSB0cmFpdHM8VD46Ok1heENvbHNBdENvbXBpbGVUaW1lCisgIH07CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIFJvd3MsCisgICAgICAgICAgICAgICAgQ29scywKKyAgICAgICAgICAgICAgICAoTWF4Um93cz09MSYmTWF4Q29scyE9MSkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgICAgICAgICAgIE1heFJvd3MsCisgICAgICAgICAgICAgICAgTWF4Q29scworICAgICAgICAgID4gdHlwZTsKK307CisKKy8qIHBsYWluX21hdHJpeF90eXBlX3Jvd19tYWpvciA6IHNhbWUgYXMgcGxhaW5fbWF0cml4X3R5cGUgYnV0IGd1YXJhbnRlZWQgdG8gYmUgcm93LW1ham9yCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBwbGFpbl9tYXRyaXhfdHlwZV9yb3dfbWFqb3IKK3sKKyAgZW51bSB7IFJvd3MgPSB0cmFpdHM8VD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgQ29scyA9IHRyYWl0czxUPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICBNYXhSb3dzID0gdHJhaXRzPFQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgIE1heENvbHMgPSB0cmFpdHM8VD46Ok1heENvbHNBdENvbXBpbGVUaW1lCisgIH07CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIFJvd3MsCisgICAgICAgICAgICAgICAgQ29scywKKyAgICAgICAgICAgICAgICAoTWF4Q29scz09MSYmTWF4Um93cyE9MSkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgICAgICAgICAgIE1heFJvd3MsCisgICAgICAgICAgICAgICAgTWF4Q29scworICAgICAgICAgID4gdHlwZTsKK307CisKKy8qKiBcaW50ZXJuYWwgVGhlIHJlZmVyZW5jZSBzZWxlY3RvciBmb3IgdGVtcGxhdGUgZXhwcmVzc2lvbnMuIFRoZSBpZGVhIGlzIHRoYXQgd2UgZG9uJ3QKKyAgKiBuZWVkIHRvIHVzZSByZWZlcmVuY2VzIGZvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZSBsaWdodCB3ZWlnaHQgcHJveHkKKyAgKiBvYmplY3RzIHdoaWNoIHNob3VsZCBnZW5lcmF0ZSBubyBjb3B5aW5nIG92ZXJoZWFkLiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgcmVmX3NlbGVjdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgYm9vbCh0cmFpdHM8VD46OkZsYWdzICYgTmVzdEJ5UmVmQml0KSwKKyAgICBUIGNvbnN0JiwKKyAgICBjb25zdCBUCisgID46OnR5cGUgdHlwZTsKKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgYm9vbCh0cmFpdHM8VD46OkZsYWdzICYgTmVzdEJ5UmVmQml0KSwKKyAgICBUICYsCisgICAgVAorICA+Ojp0eXBlIG5vbl9jb25zdF90eXBlOworfTsKKworLyoqIFxpbnRlcm5hbCBBZGRzIHRoZSBjb25zdCBxdWFsaWZpZXIgb24gdGhlIHZhbHVlLXR5cGUgb2YgVDIgaWYgYW5kIG9ubHkgaWYgVDEgaXMgYSBjb25zdCB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgdHJhbnNmZXJfY29uc3RuZXNzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgYm9vbChpbnRlcm5hbDo6aXNfY29uc3Q8VDE+Ojp2YWx1ZSksCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPFQyPjo6dHlwZSwKKyAgICBUMgorICA+Ojp0eXBlIHR5cGU7Cit9OworCisKKy8vIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgYSBtZWNoYW5pc20gdG8gZGV0ZWN0IHdoZXRoZXIgYW4gZXhwcmVzc2lvbiB3aGljaCBpcyBldmFsdWF0ZWQgbXVsdGlwbGUgdGltZQorLy8gaGFzIHRvIGJlIGV2YWx1YXRlZCBpbnRvIGEgdGVtcG9yYXJ5LgorLy8gVGhhdCdzIHRoZSBwdXJwb3NlIG9mIHRoaXMgbmV3IG5lc3RlZF9ldmFsIGhlbHBlcjoKKy8qKiBcaW50ZXJuYWwgRGV0ZXJtaW5lcyBob3cgYSBnaXZlbiBleHByZXNzaW9uIHNob3VsZCBiZSBuZXN0ZWQgd2hlbiBldmFsdWF0ZWQgbXVsdGlwbGUgdGltZXMuCisgICogRm9yIGV4YW1wbGUsIHdoZW4geW91IGRvIGEgKiAoYitjKSwgRWlnZW4gd2lsbCBkZXRlcm1pbmUgaG93IHRoZSBleHByZXNzaW9uIGIrYyBzaG91bGQgYmUKKyAgKiBldmFsdWF0ZWQgaW50byB0aGUgYmlnZ2VyIHByb2R1Y3QgZXhwcmVzc2lvbi4gVGhlIGNob2ljZSBpcyBiZXR3ZWVuIG5lc3RpbmcgdGhlIGV4cHJlc3Npb24gYitjIGFzLWlzLCBvcgorICAqIGV2YWx1YXRpbmcgdGhhdCBleHByZXNzaW9uIGIrYyBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGQsIGFuZCBuZXN0IGQgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gaXMKKyAgKiBhKmQuIEV2YWx1YXRpbmcgY2FuIGJlIGJlbmVmaWNpYWwgZm9yIGV4YW1wbGUgaWYgZXZlcnkgY29lZmZpY2llbnQgYWNjZXNzIGluIHRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiBjYXVzZXMKKyAgKiBtYW55IGNvZWZmaWNpZW50IGFjY2Vzc2VzIGluIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbnMgLS0gYXMgaXMgdGhlIGNhc2Ugd2l0aCBtYXRyaXggcHJvZHVjdCBmb3IgZXhhbXBsZS4KKyAgKgorICAqIFx0cGFyYW0gVCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyBuZXN0ZWQuCisgICogXHRwYXJhbSBuIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnQgYWNjZXNzZXMgaW4gdGhlIG5lc3RlZCBleHByZXNzaW9uIGZvciBlYWNoIGNvZWZmaWNpZW50IGFjY2VzcyBpbiB0aGUgYmlnZ2VyIGV4cHJlc3Npb24uCisgICogXHRwYXJhbSBQbGFpbk9iamVjdCB0aGUgdHlwZSBvZiB0aGUgdGVtcG9yYXJ5IGlmIG5lZWRlZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBuLCB0eXBlbmFtZSBQbGFpbk9iamVjdCA9IHR5cGVuYW1lIHBsYWluX29iamVjdF9ldmFsPFQ+Ojp0eXBlPiBzdHJ1Y3QgbmVzdGVkX2V2YWwKK3sKKyAgZW51bSB7CisgICAgU2NhbGFyUmVhZENvc3QgPSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTY2FsYXI+OjpSZWFkQ29zdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPFQ+OjpDb2VmZlJlYWRDb3N0LCAgLy8gTk9URSBXaGF0IGlmIGFuIGV2YWx1YXRvciBldmFsdWF0ZSBpdHNlbGYgaW50byBhIHRlbXBvcnk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgVGhlbiBDb2VmZlJlYWRDb3N0IHdpbGwgYmUgc21hbGwgKGUuZy4sIDEpIGJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGV2YWx1YXRlLCBlc3BlY2lhbGx5IGlmIG4+MS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBUaGlzIHNpdHVhdGlvbiBpcyBhbHJlYWR5IHRha2VuIGNhcmUgYnkgdGhlIEV2YWxCZWZvcmVOZXN0aW5nQml0IGZsYWcsIHdoaWNoIGlzIHR1cm5lZCBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGZvciBhbGwgZXZhbHVhdG9yIGNyZWF0aW5nIGEgdGVtcG9yYXJ5LiBUaGlzIGZsYWcgaXMgdGhlbiBwcm9wYWdhdGVkIGJ5IHRoZSBwYXJlbnQgZXZhbHVhdG9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBBbm90aGVyIHNvbHV0aW9uIGNvdWxkIGJlIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdGVtcHM/CisgICAgTkFzSW50ZWdlciA9IG4gPT0gRHluYW1pYyA/IEh1Z2VDb3N0IDogbiwKKyAgICBDb3N0RXZhbCAgID0gKE5Bc0ludGVnZXIrMSkgKiBTY2FsYXJSZWFkQ29zdCArIENvZWZmUmVhZENvc3QsCisgICAgQ29zdE5vRXZhbCA9IE5Bc0ludGVnZXIgKiBDb2VmZlJlYWRDb3N0LAorICAgIEV2YWx1YXRlID0gKGludChldmFsdWF0b3I8VD46OkZsYWdzKSAmIEV2YWxCZWZvcmVOZXN0aW5nQml0KSB8fCAoaW50KENvc3RFdmFsKSA8IGludChDb3N0Tm9FdmFsKSkKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPEV2YWx1YXRlLCBQbGFpbk9iamVjdCwgdHlwZW5hbWUgcmVmX3NlbGVjdG9yPFQ+Ojp0eXBlPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgVCogY29uc3RfY2FzdF9wdHIoY29uc3QgVCogcHRyKQoreworICByZXR1cm4gY29uc3RfY2FzdDxUKj4ocHRyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgWHByS2luZCA9IHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6WHByS2luZD4KK3N0cnVjdCBkZW5zZV94cHJfYmFzZQoreworICAvKiBkZW5zZV94cHJfYmFzZSBzaG91bGQgb25seSBldmVyIGJlIHVzZWQgb24gZGVuc2UgZXhwcmVzc2lvbnMsIHRodXMgZmFsbGluZyBlaXRoZXIgaW50byB0aGUgTWF0cml4WHByIG9yIGludG8gdGhlIEFycmF5WHByIGNhc2VzICovCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGRlbnNlX3hwcl9iYXNlPERlcml2ZWQsIE1hdHJpeFhwcj4KK3sKKyAgdHlwZWRlZiBNYXRyaXhCYXNlPERlcml2ZWQ+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGRlbnNlX3hwcl9iYXNlPERlcml2ZWQsIEFycmF5WHByPgoreworICB0eXBlZGVmIEFycmF5QmFzZTxEZXJpdmVkPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgWHByS2luZCA9IHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6WHByS2luZCwgdHlwZW5hbWUgU3RvcmFnZUtpbmQgPSB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kPgorc3RydWN0IGdlbmVyaWNfeHByX2Jhc2U7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFhwcktpbmQ+CitzdHJ1Y3QgZ2VuZXJpY194cHJfYmFzZTxEZXJpdmVkLCBYcHJLaW5kLCBEZW5zZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBkZW5zZV94cHJfYmFzZTxEZXJpdmVkLFhwcktpbmQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0eXBlbmFtZSBDYXN0VHlwZT4gc3RydWN0IGNhc3RfcmV0dXJuX3R5cGUKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgQ3VycmVudFNjYWxhclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxDYXN0VHlwZT46OnR5cGUgX0Nhc3RUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9DYXN0VHlwZTo6U2NhbGFyIE5ld1NjYWxhclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfc2FtZTxDdXJyZW50U2NhbGFyVHlwZSxOZXdTY2FsYXJUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYcHJUeXBlJixDYXN0VHlwZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdHJ1Y3QgcHJvbW90ZV9zdG9yYWdlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBPiBzdHJ1Y3QgcHJvbW90ZV9zdG9yYWdlX3R5cGU8QSxBPgoreworICB0eXBlZGVmIEEgcmV0OworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBPiBzdHJ1Y3QgcHJvbW90ZV9zdG9yYWdlX3R5cGU8QSwgY29uc3QgQT4KK3sKKyAgdHlwZWRlZiBBIHJldDsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQT4gc3RydWN0IHByb21vdGVfc3RvcmFnZV90eXBlPGNvbnN0IEEsIEE+Cit7CisgIHR5cGVkZWYgQSByZXQ7Cit9OworCisvKiogXGludGVybmFsIFNwZWNpZnkgdGhlICJzdG9yYWdlIGtpbmQiIG9mIGFwcGx5aW5nIGEgY29lZmZpY2llbnQtd2lzZQorICAqIGJpbmFyeSBvcGVyYXRpb25zIGJldHdlZW4gdHdvIGV4cHJlc3Npb25zIG9mIGtpbmRzIEEgYW5kIEIgcmVzcGVjdGl2ZWx5LgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgRnVuY3RvciBwZXJtaXRzIHRvIHNwZWNpYWxpemUgdGhlIHJlc3VsdGluZyBzdG9yYWdlIGtpbmQgd3J0IHRvCisgICogdGhlIGZ1bmN0b3IuCisgICogVGhlIGRlZmF1bHQgcnVsZXMgYXJlIGFzIGZvbGxvd3M6CisgICogXGNvZGUKKyAgKiBBICAgICAgb3AgQSAgICAgIC0+IEEKKyAgKiBBICAgICAgb3AgZGVuc2UgIC0+IGRlbnNlCisgICogZGVuc2UgIG9wIEIgICAgICAtPiBkZW5zZQorICAqIHNwYXJzZSBvcCBkZW5zZSAgLT4gc3BhcnNlCisgICogZGVuc2UgIG9wIHNwYXJzZSAtPiBzcGFyc2UKKyAgKiBcZW5kY29kZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEZ1bmN0b3I+IHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxBLEEsRnVuY3Rvcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBBICAgICAgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEZW5zZSxEZW5zZSxGdW5jdG9yPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBEZW5zZSAgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxBLERlbnNlLEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBEZW5zZSAgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEIsIHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEZW5zZSxCLEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBEZW5zZSAgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxTcGFyc2UsRGVuc2UsRnVuY3Rvcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBTcGFyc2UgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEZW5zZSxTcGFyc2UsRnVuY3Rvcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZWRlZiBTcGFyc2UgcmV0OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzS2luZCwgdHlwZW5hbWUgUmhzS2luZCwgaW50IExoc09yZGVyLCBpbnQgUmhzT3JkZXI+IHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2Vfb3JkZXIgeworICBlbnVtIHsgdmFsdWUgPSBMaHNPcmRlciB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExoc0tpbmQsIGludCBMaHNPcmRlciwgaW50IFJoc09yZGVyPiAgIHN0cnVjdCBjd2lzZV9wcm9tb3RlX3N0b3JhZ2Vfb3JkZXI8TGhzS2luZCxTcGFyc2UsTGhzT3JkZXIsUmhzT3JkZXI+ICAgICAgICAgICAgICAgIHsgZW51bSB7IHZhbHVlID0gUmhzT3JkZXIgfTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBSaHNLaW5kLCBpbnQgTGhzT3JkZXIsIGludCBSaHNPcmRlcj4gICBzdHJ1Y3QgY3dpc2VfcHJvbW90ZV9zdG9yYWdlX29yZGVyPFNwYXJzZSxSaHNLaW5kLExoc09yZGVyLFJoc09yZGVyPiAgICAgICAgICAgICAgICB7IGVudW0geyB2YWx1ZSA9IExoc09yZGVyIH07IH07Cit0ZW1wbGF0ZSA8aW50IE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN3aXNlX3Byb21vdGVfc3RvcmFnZV9vcmRlcjxTcGFyc2UsU3BhcnNlLE9yZGVyLE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgeyBlbnVtIHsgdmFsdWUgPSBPcmRlciB9OyB9OworCisKKy8qKiBcaW50ZXJuYWwgU3BlY2lmeSB0aGUgInN0b3JhZ2Uga2luZCIgb2YgbXVsdGlwbHlpbmcgYW4gZXhwcmVzc2lvbiBvZiBraW5kIEEgd2l0aCBraW5kIEIuCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBQcm9kdWN0VGFnIHBlcm1pdHMgdG8gc3BlY2lhbGl6ZSB0aGUgcmVzdWx0aW5nIHN0b3JhZ2Uga2luZCB3cnQgdG8KKyAgKiBzb21lIGNvbXBpbGUtdGltZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm9kdWN0OiBHZW1tUHJvZHVjdCwgR2VtdlByb2R1Y3QsIE91dGVyUHJvZHVjdCwgSW5uZXJQcm9kdWN0LgorICAqIFRoZSBkZWZhdWx0IHJ1bGVzIGFyZSBhcyBmb2xsb3dzOgorICAqIFxjb2RlCisgICogIEsgKiBLICAgICAgICAgICAgLT4gSworICAqICBkZW5zZSAqIEsgICAgICAgIC0+IGRlbnNlCisgICogIEsgKiBkZW5zZSAgICAgICAgLT4gZGVuc2UKKyAgKiAgZGlhZyAqIEsgICAgICAgICAtPiBLCisgICogIEsgKiBkaWFnICAgICAgICAgLT4gSworICAqICBQZXJtICogSyAgICAgICAgIC0+IEsKKyAgKiBLICogUGVybSAgICAgICAgICAtPiBLCisgICogXGVuZGNvZGUKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCBpbnQgUHJvZHVjdFRhZz4gc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCBpbnQgUHJvZHVjdFRhZz4gc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU8QSwgICAgICAgICAgICAgICAgICBBLCAgICAgICAgICAgICAgICAgIFByb2R1Y3RUYWc+IHsgdHlwZWRlZiBBICAgICByZXQ7fTsKK3RlbXBsYXRlIDxpbnQgUHJvZHVjdFRhZz4gICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU8RGVuc2UsICAgICAgICAgICAgICBEZW5zZSwgICAgICAgICAgICAgIFByb2R1Y3RUYWc+IHsgdHlwZWRlZiBEZW5zZSByZXQ7fTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCBpbnQgUHJvZHVjdFRhZz4gc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU8QSwgICAgICAgICAgICAgICAgICBEZW5zZSwgICAgICAgICAgICAgIFByb2R1Y3RUYWc+IHsgdHlwZWRlZiBEZW5zZSByZXQ7IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQiwgaW50IFByb2R1Y3RUYWc+IHN0cnVjdCBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPERlbnNlLCAgICAgICAgICAgICAgQiwgICAgICAgICAgICAgICAgICBQcm9kdWN0VGFnPiB7IHR5cGVkZWYgRGVuc2UgcmV0OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgaW50IFByb2R1Y3RUYWc+IHN0cnVjdCBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPEEsICAgICAgICAgICAgICAgICAgRGlhZ29uYWxTaGFwZSwgICAgICBQcm9kdWN0VGFnPiB7IHR5cGVkZWYgQSByZXQ7IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQiwgaW50IFByb2R1Y3RUYWc+IHN0cnVjdCBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPERpYWdvbmFsU2hhcGUsICAgICAgQiwgICAgICAgICAgICAgICAgICBQcm9kdWN0VGFnPiB7IHR5cGVkZWYgQiByZXQ7IH07Cit0ZW1wbGF0ZSA8aW50IFByb2R1Y3RUYWc+ICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPERlbnNlLCAgICAgICAgICAgICAgRGlhZ29uYWxTaGFwZSwgICAgICBQcm9kdWN0VGFnPiB7IHR5cGVkZWYgRGVuc2UgcmV0OyB9OwordGVtcGxhdGUgPGludCBQcm9kdWN0VGFnPiAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEaWFnb25hbFNoYXBlLCAgICAgIERlbnNlLCAgICAgICAgICAgICAgUHJvZHVjdFRhZz4geyB0eXBlZGVmIERlbnNlIHJldDsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIGludCBQcm9kdWN0VGFnPiBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxBLCAgICAgICAgICAgICAgICAgIFBlcm11dGF0aW9uU3RvcmFnZSwgUHJvZHVjdFRhZz4geyB0eXBlZGVmIEEgcmV0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEIsIGludCBQcm9kdWN0VGFnPiBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxQZXJtdXRhdGlvblN0b3JhZ2UsIEIsICAgICAgICAgICAgICAgICAgUHJvZHVjdFRhZz4geyB0eXBlZGVmIEIgcmV0OyB9OwordGVtcGxhdGUgPGludCBQcm9kdWN0VGFnPiAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEZW5zZSwgICAgICAgICAgICAgIFBlcm11dGF0aW9uU3RvcmFnZSwgUHJvZHVjdFRhZz4geyB0eXBlZGVmIERlbnNlIHJldDsgfTsKK3RlbXBsYXRlIDxpbnQgUHJvZHVjdFRhZz4gICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU8UGVybXV0YXRpb25TdG9yYWdlLCBEZW5zZSwgICAgICAgICAgICAgIFByb2R1Y3RUYWc+IHsgdHlwZWRlZiBEZW5zZSByZXQ7IH07CisKKy8qKiBcaW50ZXJuYWwgZ2l2ZXMgdGhlIHBsYWluIG1hdHJpeCBvciBhcnJheSB0eXBlIHRvIHN0b3JlIGEgcm93L2NvbHVtbi9kaWFnb25hbCBvZiBhIG1hdHJpeCB0eXBlLgorICAqIFx0cGFyYW0gU2NhbGFyIG9wdGlvbmFsIHBhcmFtZXRlciBhbGxvd2luZyB0byBwYXNzIGEgZGlmZmVyZW50IHNjYWxhciB0eXBlIHRoYW4gdGhlIG9uZSBvZiB0aGUgTWF0cml4VHlwZS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBTY2FsYXIgPSB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyPgorc3RydWN0IHBsYWluX3Jvd190eXBlCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgRXhwcmVzc2lvblR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBFeHByZXNzaW9uVHlwZTo6UGxhaW5PYmplY3Q6Ok9wdGlvbnMgfCBSb3dNYWpvciwgMSwgRXhwcmVzc2lvblR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhSb3dUeXBlOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgMSwgRXhwcmVzc2lvblR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBFeHByZXNzaW9uVHlwZTo6UGxhaW5PYmplY3Q6Ok9wdGlvbnMgfCBSb3dNYWpvciwgMSwgRXhwcmVzc2lvblR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBBcnJheVJvd1R5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICBpc19zYW1lPCB0eXBlbmFtZSB0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpYcHJLaW5kLCBNYXRyaXhYcHIgPjo6dmFsdWUsCisgICAgTWF0cml4Um93VHlwZSwKKyAgICBBcnJheVJvd1R5cGUgCisgID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBTY2FsYXIgPSB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyPgorc3RydWN0IHBsYWluX2NvbF90eXBlCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRXhwcmVzc2lvblR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxLAorICAgICAgICAgICAgICAgICBFeHByZXNzaW9uVHlwZTo6UGxhaW5PYmplY3Q6Ok9wdGlvbnMgJiB+Um93TWFqb3IsIEV4cHJlc3Npb25UeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gTWF0cml4Q29sVHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEV4cHJlc3Npb25UeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMSwKKyAgICAgICAgICAgICAgICAgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zICYgflJvd01ham9yLCBFeHByZXNzaW9uVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIDE+IEFycmF5Q29sVHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgIGlzX3NhbWU8IHR5cGVuYW1lIHRyYWl0czxFeHByZXNzaW9uVHlwZT46OlhwcktpbmQsIE1hdHJpeFhwciA+Ojp2YWx1ZSwKKyAgICBNYXRyaXhDb2xUeXBlLAorICAgIEFycmF5Q29sVHlwZSAKKyAgPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIHR5cGVuYW1lIFNjYWxhciA9IHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpTY2FsYXI+CitzdHJ1Y3QgcGxhaW5fZGlhZ190eXBlCit7CisgIGVudW0geyBkaWFnX3NpemUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhFeHByZXNzaW9uVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIEV4cHJlc3Npb25UeXBlOjpDb2xzQXRDb21waWxlVGltZSksCisgICAgICAgICBtYXhfZGlhZ19zaXplID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKEV4cHJlc3Npb25UeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwgRXhwcmVzc2lvblR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lKQorICB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIGRpYWdfc2l6ZSwgMSwgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zICYgflJvd01ham9yLCBtYXhfZGlhZ19zaXplLCAxPiBNYXRyaXhEaWFnVHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIGRpYWdfc2l6ZSwgMSwgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zICYgflJvd01ham9yLCBtYXhfZGlhZ19zaXplLCAxPiBBcnJheURpYWdUeXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgaXNfc2FtZTwgdHlwZW5hbWUgdHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6WHByS2luZCwgTWF0cml4WHByID46OnZhbHVlLAorICAgIE1hdHJpeERpYWdUeXBlLAorICAgIEFycmF5RGlhZ1R5cGUgCisgID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHIsdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgRXhwcjo6U2NhbGFyPgorc3RydWN0IHBsYWluX2NvbnN0YW50X3R5cGUKK3sKKyAgZW51bSB7IE9wdGlvbnMgPSAodHJhaXRzPEV4cHI+OjpGbGFncyZSb3dNYWpvckJpdCk/Um93TWFqb3I6MCB9OworCisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCAgdHJhaXRzPEV4cHI+OjpSb3dzQXRDb21waWxlVGltZSwgICB0cmFpdHM8RXhwcj46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIE9wdGlvbnMsIHRyYWl0czxFeHByPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsdHJhaXRzPEV4cHI+OjpNYXhDb2xzQXRDb21waWxlVGltZT4gYXJyYXlfdHlwZTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsICB0cmFpdHM8RXhwcj46OlJvd3NBdENvbXBpbGVUaW1lLCAgIHRyYWl0czxFeHByPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE9wdGlvbnMsIHRyYWl0czxFeHByPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsdHJhaXRzPEV4cHI+OjpNYXhDb2xzQXRDb21waWxlVGltZT4gbWF0cml4X3R5cGU7CisKKyAgdHlwZWRlZiBDd2lzZU51bGxhcnlPcDxzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPiwgY29uc3QgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfc2FtZTwgdHlwZW5hbWUgdHJhaXRzPEV4cHI+OjpYcHJLaW5kLCBNYXRyaXhYcHIgPjo6dmFsdWUsIG1hdHJpeF90eXBlLCBhcnJheV90eXBlPjo6dHlwZSA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3N0cnVjdCBpc19sdmFsdWUKK3sKKyAgZW51bSB7IHZhbHVlID0gKCFib29sKGlzX2NvbnN0PEV4cHJlc3Npb25UeXBlPjo6dmFsdWUpKSAmJgorICAgICAgICAgICAgICAgICBib29sKHRyYWl0czxFeHByZXNzaW9uVHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2RpYWdvbmFsCit7IGVudW0geyByZXQgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfZGlhZ29uYWw8RGlhZ29uYWxCYXNlPFQ+ID4KK3sgZW51bSB7IHJldCA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2RpYWdvbmFsPERpYWdvbmFsV3JhcHBlcjxUPiA+Cit7IGVudW0geyByZXQgPSB0cnVlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTPiBzdHJ1Y3QgaXNfZGlhZ29uYWw8RGlhZ29uYWxNYXRyaXg8VCxTPiA+Cit7IGVudW0geyByZXQgPSB0cnVlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMxLCB0eXBlbmFtZSBTMj4gc3RydWN0IGdsdWVfc2hhcGVzOwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2x1ZV9zaGFwZXM8RGVuc2VTaGFwZSxUcmlhbmd1bGFyU2hhcGU+IHsgdHlwZWRlZiBUcmlhbmd1bGFyU2hhcGUgdHlwZTsgIH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2Jvb2wgaXNfc2FtZV9kZW5zZShjb25zdCBUMSAmbWF0MSwgY29uc3QgVDIgJm1hdDIsIHR5cGVuYW1lIGVuYWJsZV9pZjxoYXNfZGlyZWN0X2FjY2VzczxUMT46OnJldCYmaGFzX2RpcmVjdF9hY2Nlc3M8VDI+OjpyZXQsIFQxPjo6dHlwZSAqID0gMCkKK3sKKyAgcmV0dXJuIChtYXQxLmRhdGEoKT09bWF0Mi5kYXRhKCkpICYmIChtYXQxLmlubmVyU3RyaWRlKCk9PW1hdDIuaW5uZXJTdHJpZGUoKSkgJiYgKG1hdDEub3V0ZXJTdHJpZGUoKT09bWF0Mi5vdXRlclN0cmlkZSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBpc19zYW1lX2RlbnNlKGNvbnN0IFQxICYsIGNvbnN0IFQyICYsIHR5cGVuYW1lIGVuYWJsZV9pZjwhKGhhc19kaXJlY3RfYWNjZXNzPFQxPjo6cmV0JiZoYXNfZGlyZWN0X2FjY2VzczxUMj46OnJldCksIFQxPjo6dHlwZSAqID0gMCkKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBJbnRlcm5hbCBoZWxwZXIgZGVmaW5pbmcgdGhlIGNvc3Qgb2YgYSBzY2FsYXIgZGl2aXNpb24gZm9yIHRoZSB0eXBlIFQuCisvLyBUaGUgZGVmYXVsdCBoZXVyaXN0aWMgY2FuIGJlIHNwZWNpYWxpemVkIGZvciBlYWNoIHNjYWxhciB0eXBlIGFuZCBhcmNoaXRlY3R1cmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULGJvb2wgVmVjdG9yaXplZD1mYWxzZSx0eXBlbmFtZSBFbmFsZUlmID0gdm9pZD4KK3N0cnVjdCBzY2FsYXJfZGl2X2Nvc3QgeworICBlbnVtIHsgdmFsdWUgPSA4Kk51bVRyYWl0czxUPjo6TXVsQ29zdCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCxib29sIFZlY3Rvcml6ZWQ+CitzdHJ1Y3Qgc2NhbGFyX2Rpdl9jb3N0PHN0ZDo6Y29tcGxleDxUPiwgVmVjdG9yaXplZD4geworICBlbnVtIHsgdmFsdWUgPSAyKnNjYWxhcl9kaXZfY29zdDxUPjo6dmFsdWUKKyAgICAgICAgICAgICAgICsgNipOdW1UcmFpdHM8VD46Ok11bENvc3QKKyAgICAgICAgICAgICAgICsgMypOdW1UcmFpdHM8VD46OkFkZENvc3QKKyAgfTsKK307CisKKwordGVtcGxhdGU8Ym9vbCBWZWN0b3JpemVkPgorc3RydWN0IHNjYWxhcl9kaXZfY29zdDxzaWduZWQgbG9uZyxWZWN0b3JpemVkLHR5cGVuYW1lIGNvbmRpdGlvbmFsPHNpemVvZihsb25nKT09OCx2b2lkLGZhbHNlX3R5cGU+Ojp0eXBlPiB7IGVudW0geyB2YWx1ZSA9IDI0IH07IH07Cit0ZW1wbGF0ZTxib29sIFZlY3Rvcml6ZWQ+CitzdHJ1Y3Qgc2NhbGFyX2Rpdl9jb3N0PHVuc2lnbmVkIGxvbmcsVmVjdG9yaXplZCx0eXBlbmFtZSBjb25kaXRpb25hbDxzaXplb2YobG9uZyk9PTgsdm9pZCxmYWxzZV90eXBlPjo6dHlwZT4geyBlbnVtIHsgdmFsdWUgPSAyMSB9OyB9OworCisKKyNpZmRlZiBFSUdFTl9ERUJVR19BU1NJR04KK3N0ZDo6c3RyaW5nIGRlbWFuZ2xlX3RyYXZlcnNhbChpbnQgdCkKK3sKKyAgaWYodD09RGVmYXVsdFRyYXZlcnNhbCkgcmV0dXJuICJEZWZhdWx0VHJhdmVyc2FsIjsKKyAgaWYodD09TGluZWFyVHJhdmVyc2FsKSByZXR1cm4gIkxpbmVhclRyYXZlcnNhbCI7CisgIGlmKHQ9PUlubmVyVmVjdG9yaXplZFRyYXZlcnNhbCkgcmV0dXJuICJJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwiOworICBpZih0PT1MaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKSByZXR1cm4gIkxpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwiOworICBpZih0PT1TbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwpIHJldHVybiAiU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsIjsKKyAgcmV0dXJuICI/IjsKK30KK3N0ZDo6c3RyaW5nIGRlbWFuZ2xlX3Vucm9sbGluZyhpbnQgdCkKK3sKKyAgaWYodD09Tm9VbnJvbGxpbmcpIHJldHVybiAiTm9VbnJvbGxpbmciOworICBpZih0PT1Jbm5lclVucm9sbGluZykgcmV0dXJuICJJbm5lclVucm9sbGluZyI7CisgIGlmKHQ9PUNvbXBsZXRlVW5yb2xsaW5nKSByZXR1cm4gIkNvbXBsZXRlVW5yb2xsaW5nIjsKKyAgcmV0dXJuICI/IjsKK30KK3N0ZDo6c3RyaW5nIGRlbWFuZ2xlX2ZsYWdzKGludCBmKQoreworICBzdGQ6OnN0cmluZyByZXM7CisgIGlmKGYmUm93TWFqb3JCaXQpICAgICAgICAgICAgICAgICByZXMgKz0gIiB8IFJvd01ham9yIjsKKyAgaWYoZiZQYWNrZXRBY2Nlc3NCaXQpICAgICAgICAgICAgIHJlcyArPSAiIHwgUGFja2V0IjsKKyAgaWYoZiZMaW5lYXJBY2Nlc3NCaXQpICAgICAgICAgICAgIHJlcyArPSAiIHwgTGluZWFyIjsKKyAgaWYoZiZMdmFsdWVCaXQpICAgICAgICAgICAgICAgICAgIHJlcyArPSAiIHwgTHZhbHVlIjsKKyAgaWYoZiZEaXJlY3RBY2Nlc3NCaXQpICAgICAgICAgICAgIHJlcyArPSAiIHwgRGlyZWN0IjsKKyAgaWYoZiZOZXN0QnlSZWZCaXQpICAgICAgICAgICAgICAgIHJlcyArPSAiIHwgTmVzdEJ5UmVmIjsKKyAgaWYoZiZOb1ByZWZlcnJlZFN0b3JhZ2VPcmRlckJpdCkgIHJlcyArPSAiIHwgTm9QcmVmZXJyZWRTdG9yYWdlT3JkZXJCaXQiOworICAKKyAgcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvKiogXGNsYXNzIFNjYWxhckJpbmFyeU9wVHJhaXRzCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGJpbmFyeSBvcGVyYXRpb24gb2YgdHdvIG51bWVyaWMgdHlwZXMgaXMgYWxsb3dlZCBhbmQgd2hhdCB0aGUgc2NhbGFyIHJldHVybiB0eXBlIGlzLgorICAqCisgICogVGhpcyBjbGFzcyBwZXJtaXRzIHRvIGNvbnRyb2wgdGhlIHNjYWxhciByZXR1cm4gdHlwZSBvZiBhbnkgYmluYXJ5IG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdHdvIGRpZmZlcmVudCBzY2FsYXIgdHlwZXMgdGhyb3VnaCAocGFydGlhbCkgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLgorICAqCisgICogRm9yIGluc3RhbmNlLCBsZXQgXGMgVTEsIFxjIFUyIGFuZCBcYyBVMyBiZSB0aHJlZSB1c2VyIGRlZmluZWQgc2NhbGFyIHR5cGVzIGZvciB3aGljaCBtb3N0IG9wZXJhdGlvbnMgYmV0d2VlbiBpbnN0YW5jZXMgb2YgXGMgVTEgYW5kIFxjIFUyIHJldHVybnMgYW4gXGMgVTMuCisgICogWW91IGNhbiBsZXQgJUVpZ2VuIGtub3dzIHRoYXQgYnkgZGVmaW5pbmc6CisgICAgXGNvZGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4KKyAgICBzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8VTEsVTIsQmluYXJ5T3A+IHsgdHlwZWRlZiBVMyBSZXR1cm5UeXBlOyAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4KKyAgICBzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8VTIsVTEsQmluYXJ5T3A+IHsgdHlwZWRlZiBVMyBSZXR1cm5UeXBlOyAgfTsKKyAgICBcZW5kY29kZQorICAqIFlvdSBjYW4gdGhlbiBleHBsaWNpdGx5IGRpc2FibGUgc29tZSBwYXJ0aWN1bGFyIG9wZXJhdGlvbnMgdG8gZ2V0IG1vcmUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZXM6CisgICAgXGNvZGUKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFNjYWxhckJpbmFyeU9wVHJhaXRzPFUxLFUyLGludGVybmFsOjpzY2FsYXJfbWF4X29wPFUxLFUyPiA+IHt9OworICAgIFxlbmRjb2RlCisgICogT3IgY3VzdG9taXplIHRoZSByZXR1cm4gdHlwZSBmb3IgaW5kaXZpZHVhbCBvcGVyYXRpb246CisgICAgXGNvZGUKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFNjYWxhckJpbmFyeU9wVHJhaXRzPFUxLFUyLGludGVybmFsOjpzY2FsYXJfc3VtX29wPFUxLFUyPiA+IHsgdHlwZWRlZiBVMSBSZXR1cm5UeXBlOyB9OworICAgIFxlbmRjb2RlCisgICoKKyAgKiBCeSBkZWZhdWx0LCB0aGUgZm9sbG93aW5nIGdlbmVyaWMgY29tYmluYXRpb25zIGFyZSBzdXBwb3J0ZWQ6CisgIDx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKyAgPHRyPjx0aD5TY2FsYXJBPC90aD48dGg+U2NhbGFyQjwvdGg+PHRoPkJpbmFyeU9wPC90aD48dGg+UmV0dXJuVHlwZTwvdGg+PHRoPk5vdGU8L3RoPjwvdHI+CisgIDx0ciAgICAgICAgICAgID48dGQ+XGMgVCA8L3RkPjx0ZD5cYyBUIDwvdGQ+PHRkPlxjICogPC90ZD48dGQ+XGMgVCA8L3RkPjx0ZD48L3RkPjwvdHI+CisgIDx0ciBjbGFzcz0iYWx0Ij48dGQ+XGMgTnVtVHJhaXRzPFQ+OjpSZWFsIDwvdGQ+PHRkPlxjIFQgPC90ZD48dGQ+XGMgKiA8L3RkPjx0ZD5cYyBUIDwvdGQ+PHRkPk9ubHkgaWYgXGMgTnVtVHJhaXRzPFQ+OjpJc0NvbXBsZXggPC90ZD48L3RyPgorICA8dHIgICAgICAgICAgICA+PHRkPlxjIFQgPC90ZD48dGQ+XGMgTnVtVHJhaXRzPFQ+OjpSZWFsIDwvdGQ+PHRkPlxjICogPC90ZD48dGQ+XGMgVCA8L3RkPjx0ZD5Pbmx5IGlmIFxjIE51bVRyYWl0czxUPjo6SXNDb21wbGV4IDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKyAgKgorICAqIFxzYSBDd2lzZUJpbmFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJBLCB0eXBlbmFtZSBTY2FsYXJCLCB0eXBlbmFtZSBCaW5hcnlPcD1pbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyQSxTY2FsYXJCPiA+CitzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHMKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSB0aGUgaGludHMgZ2l2ZW4gYnkgdGhlIChkZXByZWNhdGVkKSBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3RfdHJhaXRzIGNsYXNzLgorICA6IGludGVybmFsOjpzY2FsYXJfcHJvZHVjdF90cmFpdHM8U2NhbGFyQSxTY2FsYXJCPgorI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQmluYXJ5T3A+CitzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8VCxULEJpbmFyeU9wPgoreworICB0eXBlZGVmIFQgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBCaW5hcnlPcD4KK3N0cnVjdCBTY2FsYXJCaW5hcnlPcFRyYWl0czxULCB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxOdW1UcmFpdHM8VD46OklzQ29tcGxleCxUPjo6dHlwZT46OlJlYWwsIEJpbmFyeU9wPgoreworICB0eXBlZGVmIFQgUmV0dXJuVHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQmluYXJ5T3A+CitzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8TnVtVHJhaXRzPFQ+OjpJc0NvbXBsZXgsVD46OnR5cGU+OjpSZWFsLCBULCBCaW5hcnlPcD4KK3sKKyAgdHlwZWRlZiBUIFJldHVyblR5cGU7Cit9OworCisvLyBGb3IgTWF0cml4ICogUGVybXV0YXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEJpbmFyeU9wPgorc3RydWN0IFNjYWxhckJpbmFyeU9wVHJhaXRzPFQsdm9pZCxCaW5hcnlPcD4KK3sKKyAgdHlwZWRlZiBUIFJldHVyblR5cGU7Cit9OworCisvLyBGb3IgUGVybXV0YXRpb24gKiBNYXRyaXgKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEJpbmFyeU9wPgorc3RydWN0IFNjYWxhckJpbmFyeU9wVHJhaXRzPHZvaWQsVCxCaW5hcnlPcD4KK3sKKyAgdHlwZWRlZiBUIFJldHVyblR5cGU7Cit9OworCisvLyBmb3IgUGVybXV0YXRpb24qUGVybXV0YXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wPgorc3RydWN0IFNjYWxhckJpbmFyeU9wVHJhaXRzPHZvaWQsdm9pZCxCaW5hcnlPcD4KK3sKKyAgdHlwZWRlZiB2b2lkIFJldHVyblR5cGU7Cit9OworCisvLyBXZSByZXF1aXJlIExocyBhbmQgUmhzIHRvIGhhdmUgImNvbXBhdGlibGUiIHNjYWxhciB0eXBlcy4KKy8vIEl0IGlzIHRlbXB0aW5nIHRvIGFsd2F5cyBhbGxvdyBtaXhpbmcgZGlmZmVyZW50IHR5cGVzIGJ1dCByZW1lbWJlciB0aGF0IHRoaXMgaXMgb2Z0ZW4gaW1wb3NzaWJsZSBpbiB0aGUgdmVjdG9yaXplZCBwYXRocy4KKy8vIFNvIGFsbG93aW5nIG1peGluZyBkaWZmZXJlbnQgdHlwZXMgZ2l2ZXMgdmVyeSB1bmV4cGVjdGVkIGVycm9ycyB3aGVuIGVuYWJsaW5nIHZlY3Rvcml6YXRpb24sIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8KKy8vIGFkZCB0b2dldGhlciBhIGZsb2F0IG1hdHJpeCBhbmQgYSBkb3VibGUgbWF0cml4LgorI2RlZmluZSBFSUdFTl9DSEVDS19CSU5BUllfQ09NUEFUSUJJTElZKEJJTk9QLExIUyxSSFMpIFwKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjpoYXNfUmV0dXJuVHlwZTxTY2FsYXJCaW5hcnlPcFRyYWl0czxMSFMsIFJIUyxCSU5PUD4gPjo6dmFsdWUpLCBcCisgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisgICAgCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1hQUkhFTFBFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQ29tcGxleEVpZ2VuU29sdmVyLmggYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQ29tcGxleEVpZ2VuU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1ZmFlMAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4RWlnZW5Tb2x2ZXIuaApAQCAtMCwwICsxLDM0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2xhaXJlIE1hdXJpY2UKKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCwyMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfRUlHRU5fU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fQ09NUExFWF9FSUdFTl9TT0xWRVJfSAorCisjaW5jbHVkZSAiLi9Db21wbGV4U2NodXIuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICoKKyAgKiBcY2xhc3MgQ29tcGxleEVpZ2VuU29sdmVyCisgICoKKyAgKiBcYnJpZWYgQ29tcHV0ZXMgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBnZW5lcmFsIGNvbXBsZXggbWF0cmljZXMKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUKKyAgKiBjb21wdXRpbmcgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbjsgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbgorICAqIGluc3RhbnRpYXRpb24gb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKgorICAqIFRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgbWF0cml4IFxmJCBBIFxmJCBhcmUgc2NhbGFycworICAqIFxmJCBcbGFtYmRhIFxmJCBhbmQgdmVjdG9ycyBcZiQgdiBcZiQgc3VjaCB0aGF0IFxmJCBBdiA9IFxsYW1iZGEgdgorICAqIFxmJC4gIElmIFxmJCBEIFxmJCBpcyBhIGRpYWdvbmFsIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZhbHVlcyBvbgorICAqIHRoZSBkaWFnb25hbCwgYW5kIFxmJCBWIFxmJCBpcyBhIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZlY3RvcnMgYXMKKyAgKiBpdHMgY29sdW1ucywgdGhlbiBcZiQgQSBWID0gViBEIFxmJC4gVGhlIG1hdHJpeCBcZiQgViBcZiQgaXMKKyAgKiBhbG1vc3QgYWx3YXlzIGludmVydGlibGUsIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSBcZiQgQSA9IFYgRCBWXnstMX0KKyAgKiBcZiQuIFRoaXMgaXMgY2FsbGVkIHRoZSBlaWdlbmRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgbWFpbiBmdW5jdGlvbiBpbiB0aGlzIGNsYXNzIGlzIGNvbXB1dGUoKSwgd2hpY2ggY29tcHV0ZXMgdGhlCisgICogZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIGdpdmVuIGZ1bmN0aW9uLiBUaGUKKyAgKiBkb2N1bWVudGF0aW9uIGZvciB0aGF0IGZ1bmN0aW9uIGNvbnRhaW5zIGFuIGV4YW1wbGUgc2hvd2luZyB0aGUKKyAgKiBtYWluIGZlYXR1cmVzIG9mIHRoZSBjbGFzcy4KKyAgKgorICAqIFxzYSBjbGFzcyBFaWdlblNvbHZlciwgY2xhc3MgU2VsZkFkam9pbnRFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIENvbXBsZXhFaWdlblNvbHZlcgoreworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIFN5bm9ueW0gZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXHAgX01hdHJpeFR5cGUuICovCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSAjTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworCisgICAgLyoqIFxicmllZiBDb21wbGV4IHNjYWxhciB0eXBlIGZvciAjTWF0cml4VHlwZS4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBcYyBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBpZiAjU2NhbGFyIGlzIHJlYWwgKGUuZy4sCisgICAgICAqIFxjIGZsb2F0IG9yIFxjIGRvdWJsZSkgYW5kIGp1c3QgXGMgU2NhbGFyIGlmICNTY2FsYXIgaXMKKyAgICAgICogY29tcGxleC4KKyAgICAgICovCisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIGVpZ2VudmFsdWVzIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBjb2x1bW4gdmVjdG9yIHdpdGggZW50cmllcyBvZiB0eXBlICNDb21wbGV4U2NhbGFyLgorICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgaXMgdGhlIHNpemUgb2YgI01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCAxLCBPcHRpb25zJih+Um93TWFqb3IpLCBNYXhDb2xzQXRDb21waWxlVGltZSwgMT4gRWlnZW52YWx1ZVR5cGU7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMgYXMgcmV0dXJuZWQgYnkgZWlnZW52ZWN0b3JzKCkuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBzcXVhcmUgbWF0cml4IHdpdGggZW50cmllcyBvZiB0eXBlICNDb21wbGV4U2NhbGFyLgorICAgICAgKiBUaGUgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiAjTWF0cml4VHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBPcHRpb25zLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Q29sc0F0Q29tcGlsZVRpbWU+IEVpZ2VudmVjdG9yVHlwZTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLgorICAgICAgKi8KKyAgICBDb21wbGV4RWlnZW5Tb2x2ZXIoKQorICAgICAgICAgICAgOiBtX2VpdmVjKCksCisgICAgICAgICAgICAgIG1fZWl2YWx1ZXMoKSwKKyAgICAgICAgICAgICAgbV9zY2h1cigpLAorICAgICAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICAgICAgICBtX2VpZ2VudmVjdG9yc09rKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9tYXRYKCkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICAgICogXHNhIENvbXBsZXhFaWdlblNvbHZlcigpCisgICAgICAqLworICAgIGV4cGxpY2l0IENvbXBsZXhFaWdlblNvbHZlcihJbmRleCBzaXplKQorICAgICAgICAgICAgOiBtX2VpdmVjKHNpemUsIHNpemUpLAorICAgICAgICAgICAgICBtX2VpdmFsdWVzKHNpemUpLAorICAgICAgICAgICAgICBtX3NjaHVyKHNpemUpLAorICAgICAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICAgICAgICBtX2VpZ2VudmVjdG9yc09rKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9tYXRYKHNpemUsIHNpemUpCisgICAge30KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3I7IGNvbXB1dGVzIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVFaWdlbnZlY3RvcnMgIElmIHRydWUsIGJvdGggdGhlIGVpZ2VudmVjdG9ycyBhbmQgdGhlCisgICAgICAqICAgIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgdGhlIGVpZ2VudmFsdWVzIGFyZQorICAgICAgKiAgICBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgZXhwbGljaXQgQ29tcGxleEVpZ2VuU29sdmVyKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgsIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IHRydWUpCisgICAgICAgICAgICA6IG1fZWl2ZWMobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgbV9laXZhbHVlcyhtYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgbV9zY2h1cihtYXRyaXgucm93cygpKSwKKyAgICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9laWdlbnZlY3RvcnNPayhmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF0WChtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGVpZ2VudmVjdG9ycyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zICBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdob3NlIGNvbHVtbnMgYXJlIHRoZSBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgKiBDb21wbGV4RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sKSBvciB0aGUgbWVtYmVyCisgICAgICAqIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCwgYW5kCisgICAgICAqIFxwIGNvbXB1dGVFaWdlbnZlY3RvcnMgd2FzIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCkuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSB0aGUgZWlnZW52ZWN0b3JzLiBDb2x1bW4KKyAgICAgICogXGYkIGsgXGYkIGlzIGFuIGVpZ2VudmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gZWlnZW52YWx1ZSBudW1iZXIgXGYkIGsKKyAgICAgICogXGYkIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuICBUaGUgZWlnZW52ZWN0b3JzIGFyZSBub3JtYWxpemVkIHRvCisgICAgICAqIGhhdmUgKEV1Y2xpZGVhbikgbm9ybSBlcXVhbCB0byBvbmUuIFRoZSBtYXRyaXggcmV0dXJuZWQgYnkgdGhpcworICAgICAgKiBmdW5jdGlvbiBpcyB0aGUgbWF0cml4IFxmJCBWIFxmJCBpbiB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBID0gViBECisgICAgICAqIFZeey0xfSBcZiQsIGlmIGl0IGV4aXN0cy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5vdXQKKyAgICAgICovCisgICAgY29uc3QgRWlnZW52ZWN0b3JUeXBlJiBlaWdlbnZlY3RvcnMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgICAgcmV0dXJuIG1fZWl2ZWM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBlaWdlbnZhbHVlcyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGVpZ2VudmFsdWVzLgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IKKyAgICAgICogQ29tcGxleEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCkgb3IgdGhlIG1lbWJlcgorICAgICAgKiBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNvbHVtbiB2ZWN0b3IgY29udGFpbmluZyB0aGUKKyAgICAgICogZWlnZW52YWx1ZXMuIEVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIKKyAgICAgICogYWxnZWJyYWljIG11bHRpcGxpY2l0eSwgc28gdGhlcmUgYXJlIGFzIG1hbnkgZWlnZW52YWx1ZXMgYXMKKyAgICAgICogcm93cyBpbiB0aGUgbWF0cml4LiBUaGUgZWlnZW52YWx1ZXMgYXJlIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIKKyAgICAgICogb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLm91dAorICAgICAgKi8KKyAgICBjb25zdCBFaWdlbnZhbHVlVHlwZSYgZWlnZW52YWx1ZXMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9laXZhbHVlczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVFaWdlbnZlY3RvcnMgIElmIHRydWUsIGJvdGggdGhlIGVpZ2VudmVjdG9ycyBhbmQgdGhlCisgICAgICAqICAgIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgdGhlIGVpZ2VudmFsdWVzIGFyZQorICAgICAgKiAgICBjb21wdXRlZC4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBjb21wbGV4IG1hdHJpeCBccCBtYXRyaXguCisgICAgICAqIFRoZSBlaWdlbnZhbHVlcygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZW0uICBJZgorICAgICAgKiBccCBjb21wdXRlRWlnZW52ZWN0b3JzIGlzIHRydWUsIHRoZW4gdGhlIGVpZ2VudmVjdG9ycyBhcmUgYWxzbyBjb21wdXRlZAorICAgICAgKiBhbmQgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGVpZ2VudmVjdG9ycygpLgorICAgICAgKgorICAgICAgKiBUaGUgbWF0cml4IGlzIGZpcnN0IHJlZHVjZWQgdG8gU2NodXIgZm9ybSB1c2luZyB0aGUKKyAgICAgICogQ29tcGxleFNjaHVyIGNsYXNzLiBUaGUgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB0aGVuIHVzZWQgdG8KKyAgICAgICogY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogVGhlIGNvc3Qgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGRvbWluYXRlZCBieSB0aGUgY29zdCBvZiB0aGUKKyAgICAgICogU2NodXIgZGVjb21wb3NpdGlvbiwgd2hpY2ggaXMgXGYkIE8obl4zKSBcZiQgd2hlcmUgXGYkIG4gXGYkCisgICAgICAqIGlzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXguCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhFaWdlblNvbHZlcl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDb21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5vdXQKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIENvbXBsZXhFaWdlblNvbHZlciYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSB0cnVlKTsKKworICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsIFxjIE5vQ29udmVyZ2VuY2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29tcGxleEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3NjaHVyLmluZm8oKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWxsb3dlZC4gKi8KKyAgICBDb21wbGV4RWlnZW5Tb2x2ZXImIHNldE1heEl0ZXJhdGlvbnMoSW5kZXggbWF4SXRlcnMpCisgICAgeworICAgICAgbV9zY2h1ci5zZXRNYXhJdGVyYXRpb25zKG1heEl0ZXJzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICovCisgICAgSW5kZXggZ2V0TWF4SXRlcmF0aW9ucygpCisgICAgeworICAgICAgcmV0dXJuIG1fc2NodXIuZ2V0TWF4SXRlcmF0aW9ucygpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgCisgICAgc3RhdGljIHZvaWQgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpOworICAgIH0KKyAgICAKKyAgICBFaWdlbnZlY3RvclR5cGUgbV9laXZlYzsKKyAgICBFaWdlbnZhbHVlVHlwZSBtX2VpdmFsdWVzOworICAgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBtX3NjaHVyOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9laWdlbnZlY3RvcnNPazsKKyAgICBFaWdlbnZlY3RvclR5cGUgbV9tYXRYOworCisgIHByaXZhdGU6CisgICAgdm9pZCBkb0NvbXB1dGVFaWdlbnZlY3RvcnMoUmVhbFNjYWxhciBtYXRyaXhub3JtKTsKKyAgICB2b2lkIHNvcnRFaWdlbnZhbHVlcyhib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JiAKK0NvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKyAgCisgIC8vIHRoaXMgY29kZSBpcyBpbnNwaXJlZCBmcm9tIEphbXBhY2sKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisKKyAgLy8gRG8gYSBjb21wbGV4IFNjaHVyIGRlY29tcG9zaXRpb24sIEEgPSBVIFQgVV4qCisgIC8vIFRoZSBlaWdlbnZhbHVlcyBhcmUgb24gdGhlIGRpYWdvbmFsIG9mIFQuCisgIG1fc2NodXIuY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKworICBpZihtX3NjaHVyLmluZm8oKSA9PSBTdWNjZXNzKQorICB7CisgICAgbV9laXZhbHVlcyA9IG1fc2NodXIubWF0cml4VCgpLmRpYWdvbmFsKCk7CisgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICAgIGRvQ29tcHV0ZUVpZ2VudmVjdG9ycyhtX3NjaHVyLm1hdHJpeFQoKS5ub3JtKCkpOworICAgIHNvcnRFaWdlbnZhbHVlcyhjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgfQorCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIG1fZWlnZW52ZWN0b3JzT2sgPSBjb21wdXRlRWlnZW52ZWN0b3JzOworICByZXR1cm4gKnRoaXM7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpkb0NvbXB1dGVFaWdlbnZlY3RvcnMoUmVhbFNjYWxhciBtYXRyaXhub3JtKQoreworICBjb25zdCBJbmRleCBuID0gbV9laXZhbHVlcy5zaXplKCk7CisKKyAgbWF0cml4bm9ybSA9IG51bWV4dDo6bWF4aShtYXRyaXhub3JtLChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpOworCisgIC8vIENvbXB1dGUgWCBzdWNoIHRoYXQgVCA9IFggRCBYXigtMSksIHdoZXJlIEQgaXMgdGhlIGRpYWdvbmFsIG9mIFQuCisgIC8vIFRoZSBtYXRyaXggWCBpcyB1bml0IHRyaWFuZ3VsYXIuCisgIG1fbWF0WCA9IEVpZ2VudmVjdG9yVHlwZTo6WmVybyhuLCBuKTsKKyAgZm9yKEluZGV4IGs9bi0xIDsgaz49MCA7IGstLSkKKyAgeworICAgIG1fbWF0WC5jb2VmZlJlZihrLGspID0gQ29tcGxleFNjYWxhcigxLjAsMC4wKTsKKyAgICAvLyBDb21wdXRlIFgoaSxrKSB1c2luZyB0aGUgKGksaykgZW50cnkgb2YgdGhlIGVxdWF0aW9uIFggVCA9IEQgWAorICAgIGZvcihJbmRleCBpPWstMSA7IGk+PTAgOyBpLS0pCisgICAgeworICAgICAgbV9tYXRYLmNvZWZmUmVmKGksaykgPSAtbV9zY2h1ci5tYXRyaXhUKCkuY29lZmYoaSxrKTsKKyAgICAgIGlmKGstaS0xPjApCisgICAgICAgIG1fbWF0WC5jb2VmZlJlZihpLGspIC09IChtX3NjaHVyLm1hdHJpeFQoKS5yb3coaSkuc2VnbWVudChpKzEsay1pLTEpICogbV9tYXRYLmNvbChrKS5zZWdtZW50KGkrMSxrLWktMSkpLnZhbHVlKCk7CisgICAgICBDb21wbGV4U2NhbGFyIHogPSBtX3NjaHVyLm1hdHJpeFQoKS5jb2VmZihpLGkpIC0gbV9zY2h1ci5tYXRyaXhUKCkuY29lZmYoayxrKTsKKyAgICAgIGlmKHo9PUNvbXBsZXhTY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIC8vIElmIHRoZSBpLXRoIGFuZCBrLXRoIGVpZ2VudmFsdWUgYXJlIGVxdWFsLCB0aGVuIHogZXF1YWxzIDAuCisgICAgICAgIC8vIFVzZSBhIHNtYWxsIHZhbHVlIGluc3RlYWQsIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVyby4KKyAgICAgICAgbnVtZXh0OjpyZWFsX3JlZih6KSA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpICogbWF0cml4bm9ybTsKKyAgICAgIH0KKyAgICAgIG1fbWF0WC5jb2VmZlJlZihpLGspID0gbV9tYXRYLmNvZWZmKGksaykgLyB6OworICAgIH0KKyAgfQorCisgIC8vIENvbXB1dGUgViBhcyBWID0gVSBYOyBub3cgQSA9IFUgVCBVXiogPSBVIFggRCBYXigtMSkgVV4qID0gViBEIFZeKC0xKQorICBtX2VpdmVjLm5vYWxpYXMoKSA9IG1fc2NodXIubWF0cml4VSgpICogbV9tYXRYOworICAvLyAuLiBhbmQgbm9ybWFsaXplIHRoZSBlaWdlbnZlY3RvcnMKKyAgZm9yKEluZGV4IGs9MCA7IGs8biA7IGsrKykKKyAgeworICAgIG1fZWl2ZWMuY29sKGspLm5vcm1hbGl6ZSgpOworICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpzb3J0RWlnZW52YWx1ZXMoYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzKQoreworICBjb25zdCBJbmRleCBuID0gIG1fZWl2YWx1ZXMuc2l6ZSgpOworICBmb3IgKEluZGV4IGk9MDsgaTxuOyBpKyspCisgIHsKKyAgICBJbmRleCBrOworICAgIG1fZWl2YWx1ZXMuY3dpc2VBYnMoKS50YWlsKG4taSkubWluQ29lZmYoJmspOworICAgIGlmIChrICE9IDApCisgICAgeworICAgICAgayArPSBpOworICAgICAgc3RkOjpzd2FwKG1fZWl2YWx1ZXNba10sbV9laXZhbHVlc1tpXSk7CisgICAgICBpZihjb21wdXRlRWlnZW52ZWN0b3JzKQorCW1fZWl2ZWMuY29sKGkpLnN3YXAobV9laXZlYy5jb2woaykpOworICAgIH0KKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBMRVhfRUlHRU5fU09MVkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXIuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM4OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhTY2h1ci5oCkBAIC0wLDAgKzEsNDU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBDbGFpcmUgTWF1cmljZQorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwLDIwMTIgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09NUExFWF9TQ0hVUl9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfU0NIVVJfSAorCisjaW5jbHVkZSAiLi9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSXNDb21wbGV4PiBzdHJ1Y3QgY29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZzsKK30KKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBDb21wbGV4U2NodXIKKyAgKgorICAqIFxicmllZiBQZXJmb3JtcyBhIGNvbXBsZXggU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhIHJlYWwgb3IgY29tcGxleCBzcXVhcmUgbWF0cml4CisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlCisgICogY29tcHV0aW5nIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uOyB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuCisgICogaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqCisgICogR2l2ZW4gYSByZWFsIG9yIGNvbXBsZXggc3F1YXJlIG1hdHJpeCBBLCB0aGlzIGNsYXNzIGNvbXB1dGVzIHRoZQorICAqIFNjaHVyIGRlY29tcG9zaXRpb246IFxmJCBBID0gVSBUIFVeKlxmJCB3aGVyZSBVIGlzIGEgdW5pdGFyeQorICAqIGNvbXBsZXggbWF0cml4LCBhbmQgVCBpcyBhIGNvbXBsZXggdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguICBUaGUKKyAgKiBkaWFnb25hbCBvZiB0aGUgbWF0cml4IFQgY29ycmVzcG9uZHMgdG8gdGhlIGVpZ2VudmFsdWVzIG9mIHRoZQorICAqIG1hdHJpeCBBLgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YKKyAgKiBhIGdpdmVuIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIAorICAqIENvbXBsZXhTY2h1cihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMKKyAgKiB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gT25jZSB0aGUKKyAgKiBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkLCB5b3UgY2FuIHVzZSB0aGUgbWF0cml4VSgpIGFuZCBtYXRyaXhUKCkKKyAgKiBmdW5jdGlvbnMgdG8gcmV0cmlldmUgdGhlIG1hdHJpY2VzIFUgYW5kIFYgaW4gdGhlIGRlY29tcG9zaXRpb24uCisgICoKKyAgKiBcbm90ZSBUaGlzIGNvZGUgaXMgaW5zcGlyZWQgZnJvbSBKYW1wYWNrCisgICoKKyAgKiBcc2EgY2xhc3MgUmVhbFNjaHVyLCBjbGFzcyBFaWdlblNvbHZlciwgY2xhc3MgQ29tcGxleEVpZ2VuU29sdmVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgQ29tcGxleFNjaHVyCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSBccCBfTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworCisgICAgLyoqIFxicmllZiBDb21wbGV4IHNjYWxhciB0eXBlIGZvciBccCBfTWF0cml4VHlwZS4gCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgXGMgc3RkOjpjb21wbGV4PFNjYWxhcj4gaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLAorICAgICAgKiBcYyBmbG9hdCBvciBcYyBkb3VibGUpIGFuZCBqdXN0IFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzCisgICAgICAqIGNvbXBsZXguCisgICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIHRoZSBtYXRyaWNlcyBpbiB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBhIHNxdWFyZSBtYXRyaXggd2l0aCBlbnRyaWVzIG9mIHR5cGUgI0NvbXBsZXhTY2FsYXIuIAorICAgICAgKiBUaGUgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiBccCBfTWF0cml4VHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBPcHRpb25zLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Q29sc0F0Q29tcGlsZVRpbWU+IENvbXBsZXhNYXRyaXhUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSBzaXplICBQb3NpdGl2ZSBpbnRlZ2VyLCBzaXplIG9mIHRoZSBtYXRyaXggd2hvc2UgU2NodXIgZGVjb21wb3NpdGlvbiB3aWxsIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIKKyAgICAgICogaW50ZW5kcyB0byBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuICBUaGUgXHAgc2l6ZQorICAgICAgKiBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGFzIGEgaGludC4gSXQgaXMgbm90IGFuIGVycm9yIHRvIGdpdmUgYQorICAgICAgKiB3cm9uZyBccCBzaXplLCBidXQgaXQgbWF5IGltcGFpciBwZXJmb3JtYW5jZS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKSBmb3IgYW4gZXhhbXBsZS4KKyAgICAgICovCisgICAgZXhwbGljaXQgQ29tcGxleFNjaHVyKEluZGV4IHNpemUgPSBSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyA/IDEgOiBSb3dzQXRDb21waWxlVGltZSkKKyAgICAgIDogbV9tYXRUKHNpemUsc2l6ZSksCisgICAgICAgIG1fbWF0VShzaXplLHNpemUpLAorICAgICAgICBtX2hlc3Moc2l6ZSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fbWF0VWlzVXB0b2RhdGUoZmFsc2UpLAorICAgICAgICBtX21heEl0ZXJzKC0xKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggICAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIG1hdHJpeFQoKSBhbmQgbWF0cml4VSgpIGZvciBleGFtcGxlcy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIGV4cGxpY2l0IENvbXBsZXhTY2h1cihjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVVID0gdHJ1ZSkKKyAgICAgIDogbV9tYXRUKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fbWF0VShtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2hlc3MobWF0cml4LnJvd3MoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fbWF0VWlzVXB0b2RhdGUoZmFsc2UpLAorICAgICAgICBtX21heEl0ZXJzKC0xKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LmRlcml2ZWQoKSwgY29tcHV0ZVUpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgdW5pdGFyeSBtYXRyaXggaW4gdGhlIFNjaHVyIGRlY29tcG9zaXRpb24uIAorICAgICAgKgorICAgICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IFUuCisgICAgICAqCisgICAgICAqIEl0IGlzIGFzc3VtZWQgdGhhdCBlaXRoZXIgdGhlIGNvbnN0cnVjdG9yCisgICAgICAqIENvbXBsZXhTY2h1cihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUpIG9yIHRoZQorICAgICAgKiBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUpCisgICAgICAqIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhCisgICAgICAqIG1hdHJpeCwgYW5kIHRoYXQgXHAgY29tcHV0ZVUgd2FzIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdAorICAgICAgKiB2YWx1ZSkuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhTY2h1cl9tYXRyaXhVLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDb21wbGV4U2NodXJfbWF0cml4VS5vdXQKKyAgICAgICovCisgICAgY29uc3QgQ29tcGxleE1hdHJpeFR5cGUmIG1hdHJpeFUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhTY2h1ciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRVaXNVcHRvZGF0ZSAmJiAiVGhlIG1hdHJpeCBVIGhhcyBub3QgYmVlbiBjb21wdXRlZCBkdXJpbmcgdGhlIENvbXBsZXhTY2h1ciBkZWNvbXBvc2l0aW9uLiIpOworICAgICAgcmV0dXJuIG1fbWF0VTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIHRyaWFuZ3VsYXIgbWF0cml4IGluIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uLiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBULgorICAgICAgKgorICAgICAgKiBJdCBpcyBhc3N1bWVkIHRoYXQgZWl0aGVyIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgKiBDb21wbGV4U2NodXIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVVKSBvciB0aGUKKyAgICAgICogbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVVKQorICAgICAgKiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRvIGNvbXB1dGUgdGhlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgYQorICAgICAgKiBtYXRyaXguCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwbGFpbiBzcXVhcmUgbWF0cml4LiBJZiB5b3Ugd2FudCB0byByZWZlcmVuY2UKKyAgICAgICogb25seSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0LCB1c2U6CisgICAgICAqIFxjb2RlIHNjaHVyLm1hdHJpeFQoKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSBcZW5kY29kZSAKKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ29tcGxleFNjaHVyX21hdHJpeFQuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIENvbXBsZXhTY2h1cl9tYXRyaXhULm91dAorICAgICAgKi8KKyAgICBjb25zdCBDb21wbGV4TWF0cml4VHlwZSYgbWF0cml4VCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29tcGxleFNjaHVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdFQ7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNxdWFyZSBtYXRyaXggd2hvc2UgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICogXHBhcmFtW2luXSAgY29tcHV0ZVUgIElmIHRydWUsIGJvdGggVCBhbmQgVSBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IFQgaXMgY29tcHV0ZWQuCisKKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGJ5IGZpcnN0IHJlZHVjaW5nIHRoZQorICAgICAgKiBtYXRyaXggdG8gSGVzc2VuYmVyZyBmb3JtIHVzaW5nIHRoZSBjbGFzcworICAgICAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbi4gVGhlIEhlc3NlbmJlcmcgbWF0cml4IGlzIHRoZW4gcmVkdWNlZAorICAgICAgKiB0byB0cmlhbmd1bGFyIGZvcm0gYnkgcGVyZm9ybWluZyBRUiBpdGVyYXRpb25zIHdpdGggYSBzaW5nbGUKKyAgICAgICogc2hpZnQuIFRoZSBjb3N0IG9mIGNvbXB1dGluZyB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBkZXBlbmRzCisgICAgICAqIG9uIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgYXMgYSByb3VnaCBndWlkZSwgaXQgbWF5IGJlIHRha2VuCisgICAgICAqIG9uIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgYXMgYSByb3VnaCBndWlkZSwgaXQgbWF5IGJlIHRha2VuCisgICAgICAqIHRvIGJlIFxmJDI1bl4zXGYkIGNvbXBsZXggZmxvcHMsIG9yIFxmJDEwbl4zXGYkIGNvbXBsZXggZmxvcHMKKyAgICAgICogaWYgXGEgY29tcHV0ZVUgaXMgZmFsc2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhTY2h1cl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDb21wbGV4U2NodXJfY29tcHV0ZS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wsIEluZGV4KQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgQ29tcGxleFNjaHVyJiBjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUgPSB0cnVlKTsKKyAgICAKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgU2NodXIgZGVjb21wb3NpdGlvbiBmcm9tIGEgZ2l2ZW4gSGVzc2VuYmVyZyBtYXRyaXgKKyAgICAgKiAgXHBhcmFtW2luXSBtYXRyaXhIIE1hdHJpeCBpbiBIZXNzZW5iZXJnIGZvcm0gSAorICAgICAqICBccGFyYW1baW5dIG1hdHJpeFEgb3J0aG9nb25hbCBtYXRyaXggUSB0aGF0IHRyYW5zZm9ybSBhIG1hdHJpeCBBIHRvIEggOiBBID0gUSBIIFFeVAorICAgICAqICBccGFyYW0gY29tcHV0ZVUgQ29tcHV0ZXMgdGhlIG1hdHJpWCBVIG9mIHRoZSBTY2h1ciB2ZWN0b3JzCisgICAgICogXHJldHVybiBSZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgKiAKKyAgICAgKiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgbWF0cml4IGlzIGFscmVhZHkgcmVkdWNlZCBpbiBIZXNzZW5iZXJnIGZvcm0gbWF0cml4SAorICAgICAqICB1c2luZyBlaXRoZXIgdGhlIGNsYXNzIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIG9yIGFub3RoZXIgbWVhbi4gCisgICAgICogIEl0IGNvbXB1dGVzIHRoZSB1cHBlciBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCBUIG9mIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIEgKKyAgICAgKiAgV2hlbiBjb21wdXRlVSBpcyB0cnVlLCB0aGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIG1hdHJpeCBVIHN1Y2ggdGhhdCAKKyAgICAgKiAgQSA9IFUgVCBVXlQgPSAgKFFaKSBUIChRWileVCA9IFEgSCBRXlQgd2hlcmUgQSBpcyB0aGUgaW5pdGlhbCBtYXRyaXgKKyAgICAgKiAKKyAgICAgKiBOT1RFIFEgaXMgcmVmZXJlbmNlZCBpZiBjb21wdXRlVSBpcyB0cnVlOyBzbywgaWYgdGhlIGluaXRpYWwgb3J0aG9nb25hbCBtYXRyaXgKKyAgICAgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGUgdXNlciBzaG91bGQgZ2l2ZSBhbiBpZGVudGl0eSBtYXRyaXggKFEuc2V0SWRlbnRpdHkoKSkKKyAgICAgKiAKKyAgICAgKiBcc2EgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZXNzTWF0cml4VHlwZSwgdHlwZW5hbWUgT3J0aE1hdHJpeFR5cGU+CisgICAgQ29tcGxleFNjaHVyJiBjb21wdXRlRnJvbUhlc3NlbmJlcmcoY29uc3QgSGVzc01hdHJpeFR5cGUmIG1hdHJpeEgsIGNvbnN0IE9ydGhNYXRyaXhUeXBlJiBtYXRyaXhRLCAgYm9vbCBjb21wdXRlVT10cnVlKTsKKworICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsIFxjIE5vQ29udmVyZ2VuY2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29tcGxleFNjaHVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIFxicmllZiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGFsbG93ZWQuIAorICAgICAgKgorICAgICAgKiBJZiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyBtX21heEl0ZXJhdGlvbnNQZXJSb3cgdGltZXMgdGhlIHNpemUKKyAgICAgICogb2YgdGhlIG1hdHJpeC4KKyAgICAgICovCisgICAgQ29tcGxleFNjaHVyJiBzZXRNYXhJdGVyYXRpb25zKEluZGV4IG1heEl0ZXJzKQorICAgIHsKKyAgICAgIG1fbWF4SXRlcnMgPSBtYXhJdGVyczsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICovCisgICAgSW5kZXggZ2V0TWF4SXRlcmF0aW9ucygpCisgICAgeworICAgICAgcmV0dXJuIG1fbWF4SXRlcnM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciByb3cuCisgICAgICAqCisgICAgICAqIElmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyB0aGlzIG51bWJlciB0aW1lcyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICogbWF0cml4LiBJdCBpcyBjdXJyZW50bHkgc2V0IHRvIDMwLgorICAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IG1fbWF4SXRlcmF0aW9uc1BlclJvdyA9IDMwOworCisgIHByb3RlY3RlZDoKKyAgICBDb21wbGV4TWF0cml4VHlwZSBtX21hdFQsIG1fbWF0VTsKKyAgICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBtX2hlc3M7CisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBib29sIG1fbWF0VWlzVXB0b2RhdGU7CisgICAgSW5kZXggbV9tYXhJdGVyczsKKworICBwcml2YXRlOiAgCisgICAgYm9vbCBzdWJkaWFnb25hbEVudHJ5SXNOZWdsZWdpYmxlKEluZGV4IGkpOworICAgIENvbXBsZXhTY2FsYXIgY29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyKTsKKyAgICB2b2lkIHJlZHVjZVRvVHJpYW5ndWxhckZvcm0oYm9vbCBjb21wdXRlVSk7CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6Y29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZzxNYXRyaXhUeXBlLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4PjsKK307CisKKy8qKiBJZiBtX21hdFQoaSsxLGkpIGlzIG5lZ2xlZ2libGUgaW4gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYworICAqIGNvbXBhcmVkIHRvIG1fbWF0VChpLGkpIGFuZCBtX21hdFQoaixqKSwgdGhlbiBzZXQgaXQgdG8gemVybyBhbmQKKyAgKiByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIGJvb2wgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpzdWJkaWFnb25hbEVudHJ5SXNOZWdsZWdpYmxlKEluZGV4IGkpCit7CisgIFJlYWxTY2FsYXIgZCA9IG51bWV4dDo6bm9ybTEobV9tYXRULmNvZWZmKGksaSkpICsgbnVtZXh0Ojpub3JtMShtX21hdFQuY29lZmYoaSsxLGkrMSkpOworICBSZWFsU2NhbGFyIHNkID0gbnVtZXh0Ojpub3JtMShtX21hdFQuY29lZmYoaSsxLGkpKTsKKyAgaWYgKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihzZCwgZCwgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpKQorICB7CisgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxpKSA9IENvbXBsZXhTY2FsYXIoMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qKiBDb21wdXRlIHRoZSBzaGlmdCBpbiB0aGUgY3VycmVudCBRUiBpdGVyYXRpb24uICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPjo6Y29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgaWYgKGl0ZXIgPT0gMTAgfHwgaXRlciA9PSAyMCkgCisgIHsKKyAgICAvLyBleGNlcHRpb25hbCBzaGlmdCwgdGFrZW4gZnJvbSBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZWlzcGFjay9jb21xci5mCisgICAgcmV0dXJuIGFicyhudW1leHQ6OnJlYWwobV9tYXRULmNvZWZmKGl1LGl1LTEpKSkgKyBhYnMobnVtZXh0OjpyZWFsKG1fbWF0VC5jb2VmZihpdS0xLGl1LTIpKSk7CisgIH0KKworICAvLyBjb21wdXRlIHRoZSBzaGlmdCBhcyBvbmUgb2YgdGhlIGVpZ2VudmFsdWVzIG9mIHQsIHRoZSAyeDIKKyAgLy8gZGlhZ29uYWwgYmxvY2sgb24gdGhlIGJvdHRvbSBvZiB0aGUgYWN0aXZlIHN1Ym1hdHJpeAorICBNYXRyaXg8Q29tcGxleFNjYWxhciwyLDI+IHQgPSBtX21hdFQudGVtcGxhdGUgYmxvY2s8MiwyPihpdS0xLGl1LTEpOworICBSZWFsU2NhbGFyIG5vcm10ID0gdC5jd2lzZUFicygpLnN1bSgpOworICB0IC89IG5vcm10OyAgICAgLy8gdGhlIG5vcm1hbGl6YXRpb24gYnkgc2YgaXMgdG8gYXZvaWQgdW5kZXIvb3ZlcmZsb3cKKworICBDb21wbGV4U2NhbGFyIGIgPSB0LmNvZWZmKDAsMSkgKiB0LmNvZWZmKDEsMCk7CisgIENvbXBsZXhTY2FsYXIgYyA9IHQuY29lZmYoMCwwKSAtIHQuY29lZmYoMSwxKTsKKyAgQ29tcGxleFNjYWxhciBkaXNjID0gc3FydChjKmMgKyBSZWFsU2NhbGFyKDQpKmIpOworICBDb21wbGV4U2NhbGFyIGRldCA9IHQuY29lZmYoMCwwKSAqIHQuY29lZmYoMSwxKSAtIGI7CisgIENvbXBsZXhTY2FsYXIgdHJhY2UgPSB0LmNvZWZmKDAsMCkgKyB0LmNvZWZmKDEsMSk7CisgIENvbXBsZXhTY2FsYXIgZWl2YWwxID0gKHRyYWNlICsgZGlzYykgLyBSZWFsU2NhbGFyKDIpOworICBDb21wbGV4U2NhbGFyIGVpdmFsMiA9ICh0cmFjZSAtIGRpc2MpIC8gUmVhbFNjYWxhcigyKTsKKworICBpZihudW1leHQ6Om5vcm0xKGVpdmFsMSkgPiBudW1leHQ6Om5vcm0xKGVpdmFsMikpCisgICAgZWl2YWwyID0gZGV0IC8gZWl2YWwxOworICBlbHNlCisgICAgZWl2YWwxID0gZGV0IC8gZWl2YWwyOworCisgIC8vIGNob29zZSB0aGUgZWlnZW52YWx1ZSBjbG9zZXN0IHRvIHRoZSBib3R0b20gZW50cnkgb2YgdGhlIGRpYWdvbmFsCisgIGlmKG51bWV4dDo6bm9ybTEoZWl2YWwxLXQuY29lZmYoMSwxKSkgPCBudW1leHQ6Om5vcm0xKGVpdmFsMi10LmNvZWZmKDEsMSkpKQorICAgIHJldHVybiBub3JtdCAqIGVpdmFsMTsKKyAgZWxzZQorICAgIHJldHVybiBub3JtdCAqIGVpdmFsMjsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+JiBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKK3sKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGZhbHNlOworICBlaWdlbl9hc3NlcnQobWF0cml4LmNvbHMoKSA9PSBtYXRyaXgucm93cygpKTsKKworICBpZihtYXRyaXguY29scygpID09IDEpCisgIHsKKyAgICBtX21hdFQgPSBtYXRyaXguZGVyaXZlZCgpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICBpZihjb21wdXRlVSkgIG1fbWF0VSA9IENvbXBsZXhNYXRyaXhUeXBlOjpJZGVudGl0eSgxLDEpOworICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBtX21hdFVpc1VwdG9kYXRlID0gY29tcHV0ZVU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW50ZXJuYWw6OmNvbXBsZXhfc2NodXJfcmVkdWNlX3RvX2hlc3NlbmJlcmc8TWF0cml4VHlwZSwgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD46OnJ1bigqdGhpcywgbWF0cml4LmRlcml2ZWQoKSwgY29tcHV0ZVUpOworICBjb21wdXRlRnJvbUhlc3NlbmJlcmcobV9tYXRULCBtX21hdFUsIGNvbXB1dGVVKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSGVzc01hdHJpeFR5cGUsIHR5cGVuYW1lIE9ydGhNYXRyaXhUeXBlPgorQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+JiBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OmNvbXB1dGVGcm9tSGVzc2VuYmVyZyhjb25zdCBIZXNzTWF0cml4VHlwZSYgbWF0cml4SCwgY29uc3QgT3J0aE1hdHJpeFR5cGUmIG1hdHJpeFEsIGJvb2wgY29tcHV0ZVUpCit7CisgIG1fbWF0VCA9IG1hdHJpeEg7CisgIGlmKGNvbXB1dGVVKQorICAgIG1fbWF0VSA9IG1hdHJpeFE7CisgIHJlZHVjZVRvVHJpYW5ndWxhckZvcm0oY29tcHV0ZVUpOworICByZXR1cm4gKnRoaXM7Cit9CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBSZWR1Y2UgZ2l2ZW4gbWF0cml4IHRvIEhlc3NlbmJlcmcgZm9ybSAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3QgY29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZworeworICAvLyB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGNhc2UgSXNDb21wbGV4ID0gdHJ1ZQorICBzdGF0aWMgdm9pZCBydW4oQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+JiBfdGhpcywgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVVKQorICB7CisgICAgX3RoaXMubV9oZXNzLmNvbXB1dGUobWF0cml4KTsKKyAgICBfdGhpcy5tX21hdFQgPSBfdGhpcy5tX2hlc3MubWF0cml4SCgpOworICAgIGlmKGNvbXB1dGVVKSAgX3RoaXMubV9tYXRVID0gX3RoaXMubV9oZXNzLm1hdHJpeFEoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBjb21wbGV4X3NjaHVyX3JlZHVjZV90b19oZXNzZW5iZXJnPE1hdHJpeFR5cGUsIGZhbHNlPgoreworICBzdGF0aWMgdm9pZCBydW4oQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+JiBfdGhpcywgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVVKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OkNvbXBsZXhTY2FsYXIgQ29tcGxleFNjYWxhcjsKKworICAgIC8vIE5vdGU6IG1faGVzcyBpcyBvdmVyIFJlYWxTY2FsYXI7IG1fbWF0VCBhbmQgbV9tYXRVIGlzIG92ZXIgQ29tcGxleFNjYWxhcgorICAgIF90aGlzLm1faGVzcy5jb21wdXRlKG1hdHJpeCk7CisgICAgX3RoaXMubV9tYXRUID0gX3RoaXMubV9oZXNzLm1hdHJpeEgoKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCk7CisgICAgaWYoY29tcHV0ZVUpICAKKyAgICB7CisgICAgICAvLyBUaGlzIG1heSBjYXVzZSBhbiBhbGxvY2F0aW9uIHdoaWNoIHNlZW1zIHRvIGJlIGF2b2lkYWJsZQorICAgICAgTWF0cml4VHlwZSBRID0gX3RoaXMubV9oZXNzLm1hdHJpeFEoKTsgCisgICAgICBfdGhpcy5tX21hdFUgPSBRLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICB9CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSZWR1Y2UgdGhlIEhlc3NlbmJlcmcgbWF0cml4IG1fbWF0VCB0byB0cmlhbmd1bGFyIGZvcm0gYnkgUVIgaXRlcmF0aW9uLgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpyZWR1Y2VUb1RyaWFuZ3VsYXJGb3JtKGJvb2wgY29tcHV0ZVUpCit7ICAKKyAgSW5kZXggbWF4SXRlcnMgPSBtX21heEl0ZXJzOworICBpZiAobWF4SXRlcnMgPT0gLTEpCisgICAgbWF4SXRlcnMgPSBtX21heEl0ZXJhdGlvbnNQZXJSb3cgKiBtX21hdFQucm93cygpOworCisgIC8vIFRoZSBtYXRyaXggbV9tYXRUIGlzIGRpdmlkZWQgaW4gdGhyZWUgcGFydHMuIAorICAvLyBSb3dzIDAsLi4uLGlsLTEgYXJlIGRlY291cGxlZCBmcm9tIHRoZSByZXN0IGJlY2F1c2UgbV9tYXRUKGlsLGlsLTEpIGlzIHplcm8uIAorICAvLyBSb3dzIGlsLC4uLixpdSBpcyB0aGUgcGFydCB3ZSBhcmUgd29ya2luZyBvbiAodGhlIGFjdGl2ZSBzdWJtYXRyaXgpLgorICAvLyBSb3dzIGl1KzEsLi4uLGVuZCBhcmUgYWxyZWFkeSBicm91Z2h0IGluIHRyaWFuZ3VsYXIgZm9ybS4KKyAgSW5kZXggaXUgPSBtX21hdFQuY29scygpIC0gMTsKKyAgSW5kZXggaWw7CisgIEluZGV4IGl0ZXIgPSAwOyAvLyBudW1iZXIgb2YgaXRlcmF0aW9ucyB3ZSBhcmUgd29ya2luZyBvbiB0aGUgKGl1LGl1KSBlbGVtZW50CisgIEluZGV4IHRvdGFsSXRlciA9IDA7IC8vIG51bWJlciBvZiBpdGVyYXRpb25zIGZvciB3aG9sZSBtYXRyaXgKKworICB3aGlsZSh0cnVlKQorICB7CisgICAgLy8gZmluZCBpdSwgdGhlIGJvdHRvbSByb3cgb2YgdGhlIGFjdGl2ZSBzdWJtYXRyaXgKKyAgICB3aGlsZShpdSA+IDApCisgICAgeworICAgICAgaWYoIXN1YmRpYWdvbmFsRW50cnlJc05lZ2xlZ2libGUoaXUtMSkpIGJyZWFrOworICAgICAgaXRlciA9IDA7CisgICAgICAtLWl1OworICAgIH0KKworICAgIC8vIGlmIGl1IGlzIHplcm8gdGhlbiB3ZSBhcmUgZG9uZTsgdGhlIHdob2xlIG1hdHJpeCBpcyB0cmlhbmd1bGFyaXplZAorICAgIGlmKGl1PT0wKSBicmVhazsKKworICAgIC8vIGlmIHdlIHNwZW50IHRvbyBtYW55IGl0ZXJhdGlvbnMsIHdlIGdpdmUgdXAKKyAgICBpdGVyKys7CisgICAgdG90YWxJdGVyKys7CisgICAgaWYodG90YWxJdGVyID4gbWF4SXRlcnMpIGJyZWFrOworCisgICAgLy8gZmluZCBpbCwgdGhlIHRvcCByb3cgb2YgdGhlIGFjdGl2ZSBzdWJtYXRyaXgKKyAgICBpbCA9IGl1LTE7CisgICAgd2hpbGUoaWwgPiAwICYmICFzdWJkaWFnb25hbEVudHJ5SXNOZWdsZWdpYmxlKGlsLTEpKQorICAgIHsKKyAgICAgIC0taWw7CisgICAgfQorCisgICAgLyogcGVyZm9ybSB0aGUgUVIgc3RlcCB1c2luZyBHaXZlbnMgcm90YXRpb25zLiBUaGUgZmlyc3Qgcm90YXRpb24KKyAgICAgICBjcmVhdGVzIGEgYnVsZ2U7IHRoZSAoaWwrMixpbCkgZWxlbWVudCBiZWNvbWVzIG5vbnplcm8uIFRoaXMKKyAgICAgICBidWxnZSBpcyBjaGFzZWQgZG93biB0byB0aGUgYm90dG9tIG9mIHRoZSBhY3RpdmUgc3VibWF0cml4LiAqLworCisgICAgQ29tcGxleFNjYWxhciBzaGlmdCA9IGNvbXB1dGVTaGlmdChpdSwgaXRlcik7CisgICAgSmFjb2JpUm90YXRpb248Q29tcGxleFNjYWxhcj4gcm90OworICAgIHJvdC5tYWtlR2l2ZW5zKG1fbWF0VC5jb2VmZihpbCxpbCkgLSBzaGlmdCwgbV9tYXRULmNvZWZmKGlsKzEsaWwpKTsKKyAgICBtX21hdFQucmlnaHRDb2xzKG1fbWF0VC5jb2xzKCktaWwpLmFwcGx5T25UaGVMZWZ0KGlsLCBpbCsxLCByb3QuYWRqb2ludCgpKTsKKyAgICBtX21hdFQudG9wUm93cygoc3RkOjptaW4pKGlsKzIsaXUpKzEpLmFwcGx5T25UaGVSaWdodChpbCwgaWwrMSwgcm90KTsKKyAgICBpZihjb21wdXRlVSkgbV9tYXRVLmFwcGx5T25UaGVSaWdodChpbCwgaWwrMSwgcm90KTsKKworICAgIGZvcihJbmRleCBpPWlsKzEgOyBpPGl1IDsgaSsrKQorICAgIHsKKyAgICAgIHJvdC5tYWtlR2l2ZW5zKG1fbWF0VC5jb2VmZlJlZihpLGktMSksIG1fbWF0VC5jb2VmZlJlZihpKzEsaS0xKSwgJm1fbWF0VC5jb2VmZlJlZihpLGktMSkpOworICAgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxpLTEpID0gQ29tcGxleFNjYWxhcigwKTsKKyAgICAgIG1fbWF0VC5yaWdodENvbHMobV9tYXRULmNvbHMoKS1pKS5hcHBseU9uVGhlTGVmdChpLCBpKzEsIHJvdC5hZGpvaW50KCkpOworICAgICAgbV9tYXRULnRvcFJvd3MoKHN0ZDo6bWluKShpKzIsaXUpKzEpLmFwcGx5T25UaGVSaWdodChpLCBpKzEsIHJvdCk7CisgICAgICBpZihjb21wdXRlVSkgbV9tYXRVLmFwcGx5T25UaGVSaWdodChpLCBpKzEsIHJvdCk7CisgICAgfQorICB9CisKKyAgaWYodG90YWxJdGVyIDw9IG1heEl0ZXJzKQorICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgIGVsc2UKKyAgICBtX2luZm8gPSBOb0NvbnZlcmdlbmNlOworCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT01QTEVYX1NDSFVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXJfTEFQQUNLRS5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhTY2h1cl9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4MGEzZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXJfTEFQQUNLRS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBMQVBBQ0tlCisgKiAgICBDb21wbGV4IFNjaHVyIG5lZWRlZCB0byBjb21wbGV4IHVuc3ltbWV0cmljYWwgZWlnZW52YWx1ZXMvZWlnZW52ZWN0b3JzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfU0NIVVJfTEFQQUNLRV9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfU0NIVVJfTEFQQUNLRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGludGVybmFsIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgZGF0YSB0eXBlcyBzdXBwb3J0ZWQgYnkgTEFQQUNLZSAqLworCisjZGVmaW5lIEVJR0VOX0xBUEFDS0VfU0NIVVJfQ09NUExFWChFSUdUWVBFLCBMQVBBQ0tFX1RZUEUsIExBUEFDS0VfUFJFRklYLCBMQVBBQ0tFX1BSRUZJWF9VLCBFSUdDT0xST1csIExBUEFDS0VfQ09MUk9XKSBcCit0ZW1wbGF0ZTw+IHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4gaW5saW5lIFwKK0NvbXBsZXhTY2h1cjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XPiA+JiBcCitDb21wbGV4U2NodXI8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVVKSBcCit7IFwKKyAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XPiBNYXRyaXhUeXBlOyBcCisgIHR5cGVkZWYgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyBcCisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7IFwKK1wKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7IFwKK1wKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGZhbHNlOyBcCisgIGlmKG1hdHJpeC5jb2xzKCkgPT0gMSkgXAorICB7IFwKKyAgICBtX21hdFQgPSBtYXRyaXguZGVyaXZlZCgpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsgXAorICAgIGlmKGNvbXB1dGVVKSAgbV9tYXRVID0gQ29tcGxleE1hdHJpeFR5cGU6OklkZW50aXR5KDEsMSk7IFwKKyAgICAgIG1faW5mbyA9IFN1Y2Nlc3M7IFwKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7IFwKKyAgICAgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsgXAorICAgICAgcmV0dXJuICp0aGlzOyBcCisgIH0gXAorICBsYXBhY2tfaW50IG4gPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxsYXBhY2tfaW50PihtYXRyaXguY29scygpKSwgc2RpbSwgaW5mbzsgXAorICBsYXBhY2tfaW50IG1hdHJpeF9vcmRlciA9IExBUEFDS0VfQ09MUk9XOyBcCisgIGNoYXIgam9idnMsIHNvcnQ9J04nOyBcCisgIExBUEFDS18jI0xBUEFDS0VfUFJFRklYX1UjI19TRUxFQ1QxIHNlbGVjdCA9IDA7IFwKKyAgam9idnMgPSAoY29tcHV0ZVUpID8gJ1YnIDogJ04nOyBcCisgIG1fbWF0VS5yZXNpemUobiwgbik7IFwKKyAgbGFwYWNrX2ludCBsZHZzICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1fbWF0VS5vdXRlclN0cmlkZSgpKTsgXAorICBtX21hdFQgPSBtYXRyaXg7IFwKKyAgbGFwYWNrX2ludCBsZGEgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxsYXBhY2tfaW50PihtX21hdFQub3V0ZXJTdHJpZGUoKSk7IFwKKyAgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWM+IHc7IFwKKyAgdy5yZXNpemUobiwgMSk7XAorICBpbmZvID0gTEFQQUNLRV8jI0xBUEFDS0VfUFJFRklYIyNnZWVzKCBtYXRyaXhfb3JkZXIsIGpvYnZzLCBzb3J0LCBzZWxlY3QsIG4sIChMQVBBQ0tFX1RZUEUqKW1fbWF0VC5kYXRhKCksIGxkYSwgJnNkaW0sIChMQVBBQ0tFX1RZUEUqKXcuZGF0YSgpLCAoTEFQQUNLRV9UWVBFKiltX21hdFUuZGF0YSgpLCBsZHZzICk7IFwKKyAgaWYoaW5mbyA9PSAwKSBcCisgICAgbV9pbmZvID0gU3VjY2VzczsgXAorICBlbHNlIFwKKyAgICBtX2luZm8gPSBOb0NvbnZlcmdlbmNlOyBcCitcCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7IFwKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGNvbXB1dGVVOyBcCisgIHJldHVybiAqdGhpczsgXAorXAorfQorCitFSUdFTl9MQVBBQ0tFX1NDSFVSX0NPTVBMRVgoZGNvbXBsZXgsIGxhcGFja19jb21wbGV4X2RvdWJsZSwgeiwgWiwgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX1NDSFVSX0NPTVBMRVgoc2NvbXBsZXgsIGxhcGFja19jb21wbGV4X2Zsb2F0LCAgYywgQywgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX1NDSFVSX0NPTVBMRVgoZGNvbXBsZXgsIGxhcGFja19jb21wbGV4X2RvdWJsZSwgeiwgWiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX1NDSFVSX0NPTVBMRVgoc2NvbXBsZXgsIGxhcGFja19jb21wbGV4X2Zsb2F0LCAgYywgQywgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9TQ0hVUl9MQVBBQ0tFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9FaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0VpZ2VuU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNWIxOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9FaWdlblNvbHZlci5oCkBAIC0wLDAgKzEsNjIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCwyMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0VJR0VOU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fRUlHRU5TT0xWRVJfSAorCisjaW5jbHVkZSAiLi9SZWFsU2NodXIuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICoKKyAgKiBcY2xhc3MgRWlnZW5Tb2x2ZXIKKyAgKgorICAqIFxicmllZiBDb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGdlbmVyYWwgbWF0cmljZXMKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAqIGVpZ2VuZGVjb21wb3NpdGlvbjsgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZSBNYXRyaXgKKyAgKiBjbGFzcyB0ZW1wbGF0ZS4gQ3VycmVudGx5LCBvbmx5IHJlYWwgbWF0cmljZXMgYXJlIHN1cHBvcnRlZC4KKyAgKgorICAqIFRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgbWF0cml4IFxmJCBBIFxmJCBhcmUgc2NhbGFycworICAqIFxmJCBcbGFtYmRhIFxmJCBhbmQgdmVjdG9ycyBcZiQgdiBcZiQgc3VjaCB0aGF0IFxmJCBBdiA9IFxsYW1iZGEgdiBcZiQuICBJZgorICAqIFxmJCBEIFxmJCBpcyBhIGRpYWdvbmFsIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZhbHVlcyBvbiB0aGUgZGlhZ29uYWwsIGFuZAorICAqIFxmJCBWIFxmJCBpcyBhIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZlY3RvcnMgYXMgaXRzIGNvbHVtbnMsIHRoZW4gXGYkIEEgViA9CisgICogViBEIFxmJC4gVGhlIG1hdHJpeCBcZiQgViBcZiQgaXMgYWxtb3N0IGFsd2F5cyBpbnZlcnRpYmxlLCBpbiB3aGljaCBjYXNlIHdlCisgICogaGF2ZSBcZiQgQSA9IFYgRCBWXnstMX0gXGYkLiBUaGlzIGlzIGNhbGxlZCB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uLgorICAqCisgICogVGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBtYXRyaXggbWF5IGJlIGNvbXBsZXgsIGV2ZW4gd2hlbiB0aGUKKyAgKiBtYXRyaXggaXMgcmVhbC4gSG93ZXZlciwgd2UgY2FuIGNob29zZSByZWFsIG1hdHJpY2VzIFxmJCBWIFxmJCBhbmQgXGYkIEQKKyAgKiBcZiQgc2F0aXNmeWluZyBcZiQgQSBWID0gViBEIFxmJCwganVzdCBsaWtlIHRoZSBlaWdlbmRlY29tcG9zaXRpb24sIGlmIHRoZQorICAqIG1hdHJpeCBcZiQgRCBcZiQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIGRpYWdvbmFsLCBidXQgaWYgaXQgaXMgYWxsb3dlZCB0bworICAqIGhhdmUgYmxvY2tzIG9mIHRoZSBmb3JtCisgICogXGZbIFxiZWdpbntibWF0cml4fSB1ICYgdiBcXCAtdiAmIHUgXGVuZHtibWF0cml4fSBcZl0KKyAgKiAod2hlcmUgXGYkIHUgXGYkIGFuZCBcZiQgdiBcZiQgYXJlIHJlYWwgbnVtYmVycykgb24gdGhlIGRpYWdvbmFsLiAgVGhlc2UKKyAgKiBibG9ja3MgY29ycmVzcG9uZCB0byBjb21wbGV4IGVpZ2VudmFsdWUgcGFpcnMgXGYkIHUgXHBtIGl2IFxmJC4gV2UgY2FsbAorICAqIHRoaXMgdmFyaWFudCBvZiB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIHRoZSBwc2V1ZG8tZWlnZW5kZWNvbXBvc2l0aW9uLgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YKKyAgKiBhIGdpdmVuIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIAorICAqIEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcyB0aGUKKyAgKiBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZSBlaWdlbnZhbHVlIGFuZAorICAqIGVpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBlaWdlbnZhbHVlcygpIGFuZAorICAqIGVpZ2VudmVjdG9ycygpIGZ1bmN0aW9ucy4gVGhlIHBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSBhbmQKKyAgKiBwc2V1ZG9FaWdlbnZlY3RvcnMoKSBtZXRob2RzIGFsbG93IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlCisgICogcHNldWRvLWVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgY29udGFpbnMgYW4KKyAgKiBleGFtcGxlIG9mIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGNsYXNzLgorICAqCisgICogXG5vdGUgVGhlIGltcGxlbWVudGF0aW9uIGlzIGFkYXB0ZWQgZnJvbQorICAqIDxhIGhyZWY9Imh0dHA6Ly9tYXRoLm5pc3QuZ292L2phdmFudW1lcmljcy9qYW1hLyI+SkFNQTwvYT4gKHB1YmxpYyBkb21haW4pLgorICAqIFRoZWlyIGNvZGUgaXMgYmFzZWQgb24gRUlTUEFDSy4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpLCBjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIsIGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBFaWdlblNvbHZlcgoreworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIFN5bm9ueW0gZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXHAgX01hdHJpeFR5cGUuICovCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSAjTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworCisgICAgLyoqIFxicmllZiBDb21wbGV4IHNjYWxhciB0eXBlIGZvciAjTWF0cml4VHlwZS4gCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgXGMgc3RkOjpjb21wbGV4PFNjYWxhcj4gaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLAorICAgICAgKiBcYyBmbG9hdCBvciBcYyBkb3VibGUpIGFuZCBqdXN0IFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzCisgICAgICAqIGNvbXBsZXguCisgICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIHZlY3RvciBvZiBlaWdlbnZhbHVlcyBhcyByZXR1cm5lZCBieSBlaWdlbnZhbHVlcygpLiAKKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBhIGNvbHVtbiB2ZWN0b3Igd2l0aCBlbnRyaWVzIG9mIHR5cGUgI0NvbXBsZXhTY2FsYXIuCisgICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIHZlY3RvciBpcyB0aGUgc2l6ZSBvZiAjTWF0cml4VHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlVHlwZTsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgbWF0cml4IG9mIGVpZ2VudmVjdG9ycyBhcyByZXR1cm5lZCBieSBlaWdlbnZlY3RvcnMoKS4gCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBzcXVhcmUgbWF0cml4IHdpdGggZW50cmllcyBvZiB0eXBlICNDb21wbGV4U2NhbGFyLiAKKyAgICAgICogVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgI01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBFaWdlbnZlY3RvcnNUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBFaWdlblNvbHZlcjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworICAgIEVpZ2VuU29sdmVyKCkgOiBtX2VpdmVjKCksIG1fZWl2YWx1ZXMoKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwgbV9yZWFsU2NodXIoKSwgbV9tYXRUKCksIG1fdG1wKCkge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBFaWdlblNvbHZlcigpCisgICAgICAqLworICAgIGV4cGxpY2l0IEVpZ2VuU29sdmVyKEluZGV4IHNpemUpCisgICAgICA6IG1fZWl2ZWMoc2l6ZSwgc2l6ZSksCisgICAgICAgIG1fZWl2YWx1ZXMoc2l6ZSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fZWlnZW52ZWN0b3JzT2soZmFsc2UpLAorICAgICAgICBtX3JlYWxTY2h1cihzaXplKSwKKyAgICAgICAgbV9tYXRUKHNpemUsIHNpemUpLCAKKyAgICAgICAgbV90bXAoc2l6ZSkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNxdWFyZSBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlRWlnZW52ZWN0b3JzICBJZiB0cnVlLCBib3RoIHRoZSBlaWdlbnZlY3RvcnMgYW5kIHRoZQorICAgICAgKiAgICBlaWdlbnZhbHVlcyBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IHRoZSBlaWdlbnZhbHVlcyBhcmUKKyAgICAgICogICAgY29tcHV0ZWQuIAorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcworICAgICAgKiBhbmQgZWlnZW52ZWN0b3JzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBFaWdlblNvbHZlcihjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSB0cnVlKQorICAgICAgOiBtX2VpdmVjKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2VpdmFsdWVzKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICBtX2VpZ2VudmVjdG9yc09rKGZhbHNlKSwKKyAgICAgICAgbV9yZWFsU2NodXIobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fbWF0VChtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwgCisgICAgICAgIG1fdG1wKG1hdHJpeC5jb2xzKCkpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGVpZ2VudmVjdG9ycyBvZiBnaXZlbiBtYXRyaXguIAorICAgICAgKgorICAgICAgKiBccmV0dXJucyAgJU1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSB0aGUgKHBvc3NpYmx5IGNvbXBsZXgpIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIAorICAgICAgKiBFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJixib29sKSBvciB0aGUgbWVtYmVyIGZ1bmN0aW9uCisgICAgICAqIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIGFuZAorICAgICAgKiBccCBjb21wdXRlRWlnZW52ZWN0b3JzIHdhcyBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLgorICAgICAgKgorICAgICAgKiBDb2x1bW4gXGYkIGsgXGYkIG9mIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYW4gZWlnZW52ZWN0b3IgY29ycmVzcG9uZGluZworICAgICAgKiB0byBlaWdlbnZhbHVlIG51bWJlciBcZiQgayBcZiQgYXMgcmV0dXJuZWQgYnkgZWlnZW52YWx1ZXMoKS4gIFRoZQorICAgICAgKiBlaWdlbnZlY3RvcnMgYXJlIG5vcm1hbGl6ZWQgdG8gaGF2ZSAoRXVjbGlkZWFuKSBub3JtIGVxdWFsIHRvIG9uZS4gVGhlCisgICAgICAqIG1hdHJpeCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBtYXRyaXggXGYkIFYgXGYkIGluIHRoZQorICAgICAgKiBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJCwgaWYgaXQgZXhpc3RzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGVpZ2VudmFsdWVzKCksIHBzZXVkb0VpZ2VudmVjdG9ycygpCisgICAgICAqLworICAgIEVpZ2VudmVjdG9yc1R5cGUgZWlnZW52ZWN0b3JzKCkgY29uc3Q7CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIHBzZXVkby1laWdlbnZlY3RvcnMgb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgIENvbnN0IHJlZmVyZW5jZSB0byBtYXRyaXggd2hvc2UgY29sdW1ucyBhcmUgdGhlIHBzZXVkby1laWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsYm9vbCkgb3IgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgKiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCBhbmQKKyAgICAgICogXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyB3YXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KS4KKyAgICAgICoKKyAgICAgICogVGhlIHJlYWwgbWF0cml4IFxmJCBWIFxmJCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUKKyAgICAgICogYmxvY2stZGlhZ29uYWwgbWF0cml4IFxmJCBEIFxmJCByZXR1cm5lZCBieSBwc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkKKyAgICAgICogc2F0aXNmeSBcZiQgQVYgPSBWRCBcZiQuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEVpZ2VuU29sdmVyX3BzZXVkb0VpZ2VudmVjdG9ycy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLm91dAorICAgICAgKgorICAgICAgKiBcc2EgcHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpLCBlaWdlbnZlY3RvcnMoKQorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBwc2V1ZG9FaWdlbnZlY3RvcnMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgICAgICByZXR1cm4gbV9laXZlYzsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGJsb2NrLWRpYWdvbmFsIG1hdHJpeCBpbiB0aGUgcHNldWRvLWVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgIEEgYmxvY2stZGlhZ29uYWwgbWF0cml4LgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgCisgICAgICAqIEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLGJvb2wpIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24KKyAgICAgICogY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgICAgICoKKyAgICAgICogVGhlIG1hdHJpeCBcZiQgRCBcZiQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyByZWFsIGFuZAorICAgICAgKiBibG9jay1kaWFnb25hbC4gVGhlIGJsb2NrcyBvbiB0aGUgZGlhZ29uYWwgYXJlIGVpdGhlciAxLWJ5LTEgb3IgMi1ieS0yCisgICAgICAqIGJsb2NrcyBvZiB0aGUgZm9ybQorICAgICAgKiBcZiQgXGJlZ2lue2JtYXRyaXh9IHUgJiB2IFxcIC12ICYgdSBcZW5ke2JtYXRyaXh9IFxmJC4KKyAgICAgICogVGhlc2UgYmxvY2tzIGFyZSBub3Qgc29ydGVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLgorICAgICAgKiBUaGUgbWF0cml4IFxmJCBEIFxmJCBhbmQgdGhlIG1hdHJpeCBcZiQgViBcZiQgcmV0dXJuZWQgYnkKKyAgICAgICogcHNldWRvRWlnZW52ZWN0b3JzKCkgc2F0aXNmeSBcZiQgQVYgPSBWRCBcZiQuCisgICAgICAqCisgICAgICAqIFxzYSBwc2V1ZG9FaWdlbnZlY3RvcnMoKSBmb3IgYW4gZXhhbXBsZSwgZWlnZW52YWx1ZXMoKQorICAgICAgKi8KKyAgICBNYXRyaXhUeXBlIHBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSBjb25zdDsKKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgZWlnZW52YWx1ZXMgb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiB2ZWN0b3IgY29udGFpbmluZyB0aGUgZWlnZW52YWx1ZXMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsYm9vbCkgb3IgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgKiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0byB0aGVpciBhbGdlYnJhaWMgbXVsdGlwbGljaXR5LAorICAgICAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguIFRoZSBlaWdlbnZhbHVlcyAKKyAgICAgICogYXJlIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGVpZ2VudmVjdG9ycygpLCBwc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCksCisgICAgICAqICAgICBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpCisgICAgICAqLworICAgIGNvbnN0IEVpZ2VudmFsdWVUeXBlJiBlaWdlbnZhbHVlcygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fZWl2YWx1ZXM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICogCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVFaWdlbnZlY3RvcnMgIElmIHRydWUsIGJvdGggdGhlIGVpZ2VudmVjdG9ycyBhbmQgdGhlCisgICAgICAqICAgIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgdGhlIGVpZ2VudmFsdWVzIGFyZQorICAgICAgKiAgICBjb21wdXRlZC4gCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcmVhbCBtYXRyaXggXHAgbWF0cml4LgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGVtLiAgSWYgCisgICAgICAqIFxwIGNvbXB1dGVFaWdlbnZlY3RvcnMgaXMgdHJ1ZSwgdGhlbiB0aGUgZWlnZW52ZWN0b3JzIGFyZSBhbHNvIGNvbXB1dGVkCisgICAgICAqIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgZWlnZW52ZWN0b3JzKCkuCisgICAgICAqCisgICAgICAqIFRoZSBtYXRyaXggaXMgZmlyc3QgcmVkdWNlZCB0byByZWFsIFNjaHVyIGZvcm0gdXNpbmcgdGhlIFJlYWxTY2h1cgorICAgICAgKiBjbGFzcy4gVGhlIFNjaHVyIGRlY29tcG9zaXRpb24gaXMgdGhlbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzCisgICAgICAqIGFuZCBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFRoZSBjb3N0IG9mIHRoZSBjb21wdXRhdGlvbiBpcyBkb21pbmF0ZWQgYnkgdGhlIGNvc3Qgb2YgdGhlCisgICAgICAqIFNjaHVyIGRlY29tcG9zaXRpb24sIHdoaWNoIGlzIHZlcnkgYXBwcm94aW1hdGVseSBcZiQgMjVuXjMgXGYkCisgICAgICAqICh3aGVyZSBcZiQgbiBcZiQgaXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCkgaWYgXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyAKKyAgICAgICogaXMgdHJ1ZSwgYW5kIFxmJCAxMG5eMyBcZiQgaWYgXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyBpcyBmYWxzZS4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgcmV1c2VzIG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgRWlnZW5Tb2x2ZXIgb2JqZWN0LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9jb21wdXRlLm91dAorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgRWlnZW5Tb2x2ZXImIGNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCwgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gdHJ1ZSk7CisKKyAgICAvKiogXHJldHVybnMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIGlucHV0IGNvbnRhaW5zIElORiBvciBOYU4gdmFsdWVzIG9yIG92ZXJmbG93IG9jY3VyZWQuIFJldHVybnMgU3VjY2VzcyBvdGhlcndpc2UuICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIFxicmllZiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGFsbG93ZWQuICovCisgICAgRWlnZW5Tb2x2ZXImIHNldE1heEl0ZXJhdGlvbnMoSW5kZXggbWF4SXRlcnMpCisgICAgeworICAgICAgbV9yZWFsU2NodXIuc2V0TWF4SXRlcmF0aW9ucyhtYXhJdGVycyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zLiAqLworICAgIEluZGV4IGdldE1heEl0ZXJhdGlvbnMoKQorICAgIHsKKyAgICAgIHJldHVybiBtX3JlYWxTY2h1ci5nZXRNYXhJdGVyYXRpb25zKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBkb0NvbXB1dGVFaWdlbnZlY3RvcnMoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgCisgICAgc3RhdGljIHZvaWQgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpOworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCk7CisgICAgfQorICAgIAorICAgIE1hdHJpeFR5cGUgbV9laXZlYzsKKyAgICBFaWdlbnZhbHVlVHlwZSBtX2VpdmFsdWVzOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9laWdlbnZlY3RvcnNPazsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBtX3JlYWxTY2h1cjsKKyAgICBNYXRyaXhUeXBlIG1fbWF0VDsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBDb2x1bW5WZWN0b3JUeXBlOworICAgIENvbHVtblZlY3RvclR5cGUgbV90bXA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorTWF0cml4VHlwZSBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6cHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgY29uc3QgUmVhbFNjYWxhciBwcmVjaXNpb24gPSBSZWFsU2NhbGFyKDIpKk51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpOworICBJbmRleCBuID0gbV9laXZhbHVlcy5yb3dzKCk7CisgIE1hdHJpeFR5cGUgbWF0RCA9IE1hdHJpeFR5cGU6Olplcm8obixuKTsKKyAgZm9yIChJbmRleCBpPTA7IGk8bjsgKytpKQorICB7CisgICAgaWYgKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihudW1leHQ6OmltYWcobV9laXZhbHVlcy5jb2VmZihpKSksIG51bWV4dDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGkpKSwgcHJlY2lzaW9uKSkKKyAgICAgIG1hdEQuY29lZmZSZWYoaSxpKSA9IG51bWV4dDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGkpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgbWF0RC50ZW1wbGF0ZSBibG9jazwyLDI+KGksaSkgPDwgIG51bWV4dDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGkpKSwgbnVtZXh0OjppbWFnKG1fZWl2YWx1ZXMuY29lZmYoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLW51bWV4dDo6aW1hZyhtX2VpdmFsdWVzLmNvZWZmKGkpKSwgbnVtZXh0OjpyZWFsKG1fZWl2YWx1ZXMuY29lZmYoaSkpOworICAgICAgKytpOworICAgIH0KKyAgfQorICByZXR1cm4gbWF0RDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjpFaWdlbnZlY3RvcnNUeXBlIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjplaWdlbnZlY3RvcnMoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgIGNvbnN0IFJlYWxTY2FsYXIgcHJlY2lzaW9uID0gUmVhbFNjYWxhcigyKSpOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKTsKKyAgSW5kZXggbiA9IG1fZWl2ZWMuY29scygpOworICBFaWdlbnZlY3RvcnNUeXBlIG1hdFYobixuKTsKKyAgZm9yIChJbmRleCBqPTA7IGo8bjsgKytqKQorICB7CisgICAgaWYgKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihudW1leHQ6OmltYWcobV9laXZhbHVlcy5jb2VmZihqKSksIG51bWV4dDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGopKSwgcHJlY2lzaW9uKSB8fCBqKzE9PW4pCisgICAgeworICAgICAgLy8gd2UgaGF2ZSBhIHJlYWwgZWlnZW4gdmFsdWUKKyAgICAgIG1hdFYuY29sKGopID0gbV9laXZlYy5jb2woaikudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICAgICAgbWF0Vi5jb2woaikubm9ybWFsaXplKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyB3ZSBoYXZlIGEgcGFpciBvZiBjb21wbGV4IGVpZ2VuIHZhbHVlcworICAgICAgZm9yIChJbmRleCBpPTA7IGk8bjsgKytpKQorICAgICAgeworICAgICAgICBtYXRWLmNvZWZmUmVmKGksaikgICA9IENvbXBsZXhTY2FsYXIobV9laXZlYy5jb2VmZihpLGopLCAgbV9laXZlYy5jb2VmZihpLGorMSkpOworICAgICAgICBtYXRWLmNvZWZmUmVmKGksaisxKSA9IENvbXBsZXhTY2FsYXIobV9laXZlYy5jb2VmZihpLGopLCAtbV9laXZlYy5jb2VmZihpLGorMSkpOworICAgICAgfQorICAgICAgbWF0Vi5jb2woaikubm9ybWFsaXplKCk7CisgICAgICBtYXRWLmNvbChqKzEpLm5vcm1hbGl6ZSgpOworICAgICAgKytqOworICAgIH0KKyAgfQorICByZXR1cm4gbWF0VjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KK0VpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JiAKK0VpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgsIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycykKK3sKKyAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgbnVtZXh0Ojppc2Zpbml0ZTsKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisKKyAgLy8gUmVkdWNlIHRvIHJlYWwgU2NodXIgZm9ybS4KKyAgbV9yZWFsU2NodXIuY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgCisgIG1faW5mbyA9IG1fcmVhbFNjaHVyLmluZm8oKTsKKworICBpZiAobV9pbmZvID09IFN1Y2Nlc3MpCisgIHsKKyAgICBtX21hdFQgPSBtX3JlYWxTY2h1ci5tYXRyaXhUKCk7CisgICAgaWYgKGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgICAgICBtX2VpdmVjID0gbV9yZWFsU2NodXIubWF0cml4VSgpOworICAKKyAgICAvLyBDb21wdXRlIGVpZ2VudmFsdWVzIGZyb20gbWF0VAorICAgIG1fZWl2YWx1ZXMucmVzaXplKG1hdHJpeC5jb2xzKCkpOworICAgIEluZGV4IGkgPSAwOworICAgIHdoaWxlIChpIDwgbWF0cml4LmNvbHMoKSkgCisgICAgeworICAgICAgaWYgKGkgPT0gbWF0cml4LmNvbHMoKSAtIDEgfHwgbV9tYXRULmNvZWZmKGkrMSwgaSkgPT0gU2NhbGFyKDApKSAKKyAgICAgIHsKKyAgICAgICAgbV9laXZhbHVlcy5jb2VmZlJlZihpKSA9IG1fbWF0VC5jb2VmZihpLCBpKTsKKyAgICAgICAgaWYoIShpc2Zpbml0ZSkobV9laXZhbHVlcy5jb2VmZlJlZihpKSkpCisgICAgICAgIHsKKyAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgIG1fZWlnZW52ZWN0b3JzT2sgPSBmYWxzZTsKKyAgICAgICAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTY2FsYXIgcCA9IFNjYWxhcigwLjUpICogKG1fbWF0VC5jb2VmZihpLCBpKSAtIG1fbWF0VC5jb2VmZihpKzEsIGkrMSkpOworICAgICAgICBTY2FsYXIgejsKKyAgICAgICAgLy8gQ29tcHV0ZSB6ID0gc3FydChhYnMocCAqIHAgKyBtX21hdFQuY29lZmYoaSsxLCBpKSAqIG1fbWF0VC5jb2VmZihpLCBpKzEpKSk7CisgICAgICAgIC8vIHdpdGhvdXQgb3ZlcmZsb3cKKyAgICAgICAgeworICAgICAgICAgIFNjYWxhciB0MCA9IG1fbWF0VC5jb2VmZihpKzEsIGkpOworICAgICAgICAgIFNjYWxhciB0MSA9IG1fbWF0VC5jb2VmZihpLCBpKzEpOworICAgICAgICAgIFNjYWxhciBtYXh2YWwgPSBudW1leHQ6Om1heGk8U2NhbGFyPihhYnMocCksbnVtZXh0OjptYXhpPFNjYWxhcj4oYWJzKHQwKSxhYnModDEpKSk7CisgICAgICAgICAgdDAgLz0gbWF4dmFsOworICAgICAgICAgIHQxIC89IG1heHZhbDsKKyAgICAgICAgICBTY2FsYXIgcDAgPSBwL21heHZhbDsKKyAgICAgICAgICB6ID0gbWF4dmFsICogc3FydChhYnMocDAgKiBwMCArIHQwICogdDEpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9laXZhbHVlcy5jb2VmZlJlZihpKSAgID0gQ29tcGxleFNjYWxhcihtX21hdFQuY29lZmYoaSsxLCBpKzEpICsgcCwgeik7CisgICAgICAgIG1fZWl2YWx1ZXMuY29lZmZSZWYoaSsxKSA9IENvbXBsZXhTY2FsYXIobV9tYXRULmNvZWZmKGkrMSwgaSsxKSArIHAsIC16KTsKKyAgICAgICAgaWYoISgoaXNmaW5pdGUpKG1fZWl2YWx1ZXMuY29lZmZSZWYoaSkpICYmIChpc2Zpbml0ZSkobV9laXZhbHVlcy5jb2VmZlJlZihpKzEpKSkpCisgICAgICAgIHsKKyAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgIG1fZWlnZW52ZWN0b3JzT2sgPSBmYWxzZTsKKyAgICAgICAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgaSArPSAyOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBDb21wdXRlIGVpZ2VudmVjdG9ycy4KKyAgICBpZiAoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICAgIGRvQ29tcHV0ZUVpZ2VudmVjdG9ycygpOworICB9CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpkb0NvbXB1dGVFaWdlbnZlY3RvcnMoKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fZWl2ZWMuY29scygpOworICBjb25zdCBTY2FsYXIgZXBzID0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKworICAvLyBpbmVmZmljaWVudCEgdGhpcyBpcyBhbHJlYWR5IGNvbXB1dGVkIGluIFJlYWxTY2h1cgorICBTY2FsYXIgbm9ybSgwKTsKKyAgZm9yIChJbmRleCBqID0gMDsgaiA8IHNpemU7ICsraikKKyAgeworICAgIG5vcm0gKz0gbV9tYXRULnJvdyhqKS5zZWdtZW50KChzdGQ6Om1heCkoai0xLEluZGV4KDApKSwgc2l6ZS0oc3RkOjptYXgpKGotMSxJbmRleCgwKSkpLmN3aXNlQWJzKCkuc3VtKCk7CisgIH0KKyAgCisgIC8vIEJhY2tzdWJzdGl0dXRlIHRvIGZpbmQgdmVjdG9ycyBvZiB1cHBlciB0cmlhbmd1bGFyIGZvcm0KKyAgaWYgKG5vcm0gPT0gU2NhbGFyKDApKQorICB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChJbmRleCBuID0gc2l6ZS0xOyBuID49IDA7IG4tLSkKKyAgeworICAgIFNjYWxhciBwID0gbV9laXZhbHVlcy5jb2VmZihuKS5yZWFsKCk7CisgICAgU2NhbGFyIHEgPSBtX2VpdmFsdWVzLmNvZWZmKG4pLmltYWcoKTsKKworICAgIC8vIFNjYWxhciB2ZWN0b3IKKyAgICBpZiAocSA9PSBTY2FsYXIoMCkpCisgICAgeworICAgICAgU2NhbGFyIGxhc3RyKDApLCBsYXN0dygwKTsKKyAgICAgIEluZGV4IGwgPSBuOworCisgICAgICBtX21hdFQuY29lZmZSZWYobixuKSA9IFNjYWxhcigxKTsKKyAgICAgIGZvciAoSW5kZXggaSA9IG4tMTsgaSA+PSAwOyBpLS0pCisgICAgICB7CisgICAgICAgIFNjYWxhciB3ID0gbV9tYXRULmNvZWZmKGksaSkgLSBwOworICAgICAgICBTY2FsYXIgciA9IG1fbWF0VC5yb3coaSkuc2VnbWVudChsLG4tbCsxKS5kb3QobV9tYXRULmNvbChuKS5zZWdtZW50KGwsIG4tbCsxKSk7CisKKyAgICAgICAgaWYgKG1fZWl2YWx1ZXMuY29lZmYoaSkuaW1hZygpIDwgU2NhbGFyKDApKQorICAgICAgICB7CisgICAgICAgICAgbGFzdHcgPSB3OworICAgICAgICAgIGxhc3RyID0gcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsID0gaTsKKyAgICAgICAgICBpZiAobV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgPT0gU2NhbGFyKDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ICE9IFNjYWxhcigwKSkKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGksbikgPSAtciAvIHc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4pID0gLXIgLyAoZXBzICogbm9ybSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgLy8gU29sdmUgcmVhbCBlcXVhdGlvbnMKKyAgICAgICAgICB7CisgICAgICAgICAgICBTY2FsYXIgeCA9IG1fbWF0VC5jb2VmZihpLGkrMSk7CisgICAgICAgICAgICBTY2FsYXIgeSA9IG1fbWF0VC5jb2VmZihpKzEsaSk7CisgICAgICAgICAgICBTY2FsYXIgZGVub20gPSAobV9laXZhbHVlcy5jb2VmZihpKS5yZWFsKCkgLSBwKSAqIChtX2VpdmFsdWVzLmNvZWZmKGkpLnJlYWwoKSAtIHApICsgbV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgKiBtX2VpdmFsdWVzLmNvZWZmKGkpLmltYWcoKTsKKyAgICAgICAgICAgIFNjYWxhciB0ID0gKHggKiBsYXN0ciAtIGxhc3R3ICogcikgLyBkZW5vbTsKKyAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4pID0gdDsKKyAgICAgICAgICAgIGlmIChhYnMoeCkgPiBhYnMobGFzdHcpKQorICAgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSsxLG4pID0gKC1yIC0gdyAqIHQpIC8geDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxuKSA9ICgtbGFzdHIgLSB5ICogdCkgLyBsYXN0dzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBPdmVyZmxvdyBjb250cm9sCisgICAgICAgICAgU2NhbGFyIHQgPSBhYnMobV9tYXRULmNvZWZmKGksbikpOworICAgICAgICAgIGlmICgoZXBzICogdCkgKiB0ID4gU2NhbGFyKDEpKQorICAgICAgICAgICAgbV9tYXRULmNvbChuKS50YWlsKHNpemUtaSkgLz0gdDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChxIDwgU2NhbGFyKDApICYmIG4gPiAwKSAvLyBDb21wbGV4IHZlY3RvcgorICAgIHsKKyAgICAgIFNjYWxhciBsYXN0cmEoMCksIGxhc3RzYSgwKSwgbGFzdHcoMCk7CisgICAgICBJbmRleCBsID0gbi0xOworCisgICAgICAvLyBMYXN0IHZlY3RvciBjb21wb25lbnQgaW1hZ2luYXJ5IHNvIG1hdHJpeCBpcyB0cmlhbmd1bGFyCisgICAgICBpZiAoYWJzKG1fbWF0VC5jb2VmZihuLG4tMSkpID4gYWJzKG1fbWF0VC5jb2VmZihuLTEsbikpKQorICAgICAgeworICAgICAgICBtX21hdFQuY29lZmZSZWYobi0xLG4tMSkgPSBxIC8gbV9tYXRULmNvZWZmKG4sbi0xKTsKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKG4tMSxuKSA9IC0obV9tYXRULmNvZWZmKG4sbikgLSBwKSAvIG1fbWF0VC5jb2VmZihuLG4tMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIENvbXBsZXhTY2FsYXIgY2MgPSBDb21wbGV4U2NhbGFyKFNjYWxhcigwKSwtbV9tYXRULmNvZWZmKG4tMSxuKSkgLyBDb21wbGV4U2NhbGFyKG1fbWF0VC5jb2VmZihuLTEsbi0xKS1wLHEpOworICAgICAgICBtX21hdFQuY29lZmZSZWYobi0xLG4tMSkgPSBudW1leHQ6OnJlYWwoY2MpOworICAgICAgICBtX21hdFQuY29lZmZSZWYobi0xLG4pID0gbnVtZXh0OjppbWFnKGNjKTsKKyAgICAgIH0KKyAgICAgIG1fbWF0VC5jb2VmZlJlZihuLG4tMSkgPSBTY2FsYXIoMCk7CisgICAgICBtX21hdFQuY29lZmZSZWYobixuKSA9IFNjYWxhcigxKTsKKyAgICAgIGZvciAoSW5kZXggaSA9IG4tMjsgaSA+PSAwOyBpLS0pCisgICAgICB7CisgICAgICAgIFNjYWxhciByYSA9IG1fbWF0VC5yb3coaSkuc2VnbWVudChsLCBuLWwrMSkuZG90KG1fbWF0VC5jb2wobi0xKS5zZWdtZW50KGwsIG4tbCsxKSk7CisgICAgICAgIFNjYWxhciBzYSA9IG1fbWF0VC5yb3coaSkuc2VnbWVudChsLCBuLWwrMSkuZG90KG1fbWF0VC5jb2wobikuc2VnbWVudChsLCBuLWwrMSkpOworICAgICAgICBTY2FsYXIgdyA9IG1fbWF0VC5jb2VmZihpLGkpIC0gcDsKKworICAgICAgICBpZiAobV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgPCBTY2FsYXIoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0dyA9IHc7CisgICAgICAgICAgbGFzdHJhID0gcmE7CisgICAgICAgICAgbGFzdHNhID0gc2E7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbCA9IGk7CisgICAgICAgICAgaWYgKG1fZWl2YWx1ZXMuY29lZmYoaSkuaW1hZygpID09IFJlYWxTY2FsYXIoMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQ29tcGxleFNjYWxhciBjYyA9IENvbXBsZXhTY2FsYXIoLXJhLC1zYSkgLyBDb21wbGV4U2NhbGFyKHcscSk7CisgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSxuLTEpID0gbnVtZXh0OjpyZWFsKGNjKTsKKyAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4pID0gbnVtZXh0OjppbWFnKGNjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbHZlIGNvbXBsZXggZXF1YXRpb25zCisgICAgICAgICAgICBTY2FsYXIgeCA9IG1fbWF0VC5jb2VmZihpLGkrMSk7CisgICAgICAgICAgICBTY2FsYXIgeSA9IG1fbWF0VC5jb2VmZihpKzEsaSk7CisgICAgICAgICAgICBTY2FsYXIgdnIgPSAobV9laXZhbHVlcy5jb2VmZihpKS5yZWFsKCkgLSBwKSAqIChtX2VpdmFsdWVzLmNvZWZmKGkpLnJlYWwoKSAtIHApICsgbV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgKiBtX2VpdmFsdWVzLmNvZWZmKGkpLmltYWcoKSAtIHEgKiBxOworICAgICAgICAgICAgU2NhbGFyIHZpID0gKG1fZWl2YWx1ZXMuY29lZmYoaSkucmVhbCgpIC0gcCkgKiBTY2FsYXIoMikgKiBxOworICAgICAgICAgICAgaWYgKCh2ciA9PSBTY2FsYXIoMCkpICYmICh2aSA9PSBTY2FsYXIoMCkpKQorICAgICAgICAgICAgICB2ciA9IGVwcyAqIG5vcm0gKiAoYWJzKHcpICsgYWJzKHEpICsgYWJzKHgpICsgYWJzKHkpICsgYWJzKGxhc3R3KSk7CisKKyAgICAgICAgICAgIENvbXBsZXhTY2FsYXIgY2MgPSBDb21wbGV4U2NhbGFyKHgqbGFzdHJhLWxhc3R3KnJhK3Eqc2EseCpsYXN0c2EtbGFzdHcqc2EtcSpyYSkgLyBDb21wbGV4U2NhbGFyKHZyLHZpKTsKKyAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4tMSkgPSBudW1leHQ6OnJlYWwoY2MpOworICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGksbikgPSBudW1leHQ6OmltYWcoY2MpOworICAgICAgICAgICAgaWYgKGFicyh4KSA+IChhYnMobGFzdHcpICsgYWJzKHEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxuLTEpID0gKC1yYSAtIHcgKiBtX21hdFQuY29lZmYoaSxuLTEpICsgcSAqIG1fbWF0VC5jb2VmZihpLG4pKSAvIHg7CisgICAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpKzEsbikgPSAoLXNhIC0gdyAqIG1fbWF0VC5jb2VmZihpLG4pIC0gcSAqIG1fbWF0VC5jb2VmZihpLG4tMSkpIC8geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2MgPSBDb21wbGV4U2NhbGFyKC1sYXN0cmEteSptX21hdFQuY29lZmYoaSxuLTEpLC1sYXN0c2EteSptX21hdFQuY29lZmYoaSxuKSkgLyBDb21wbGV4U2NhbGFyKGxhc3R3LHEpOworICAgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSsxLG4tMSkgPSBudW1leHQ6OnJlYWwoY2MpOworICAgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSsxLG4pID0gbnVtZXh0OjppbWFnKGNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBPdmVyZmxvdyBjb250cm9sCisgICAgICAgICAgU2NhbGFyIHQgPSBudW1leHQ6Om1heGk8U2NhbGFyPihhYnMobV9tYXRULmNvZWZmKGksbi0xKSksYWJzKG1fbWF0VC5jb2VmZihpLG4pKSk7CisgICAgICAgICAgaWYgKChlcHMgKiB0KSAqIHQgPiBTY2FsYXIoMSkpCisgICAgICAgICAgICBtX21hdFQuYmxvY2soaSwgbi0xLCBzaXplLWksIDIpIC89IHQ7CisKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBXZSBoYW5kbGVkIGEgcGFpciBvZiBjb21wbGV4IGNvbmp1Z2F0ZSBlaWdlbnZhbHVlcywgc28gbmVlZCB0byBza2lwIHRoZW0gYm90aAorICAgICAgbi0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KDAgJiYgIkludGVybmFsIGJ1ZyBpbiBFaWdlblNvbHZlciAoSU5GIG9yIE5hTiBoYXMgbm90IGJlZW4gZGV0ZWN0ZWQpIik7IC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKyAgICB9CisgIH0KKworICAvLyBCYWNrIHRyYW5zZm9ybWF0aW9uIHRvIGdldCBlaWdlbnZlY3RvcnMgb2Ygb3JpZ2luYWwgbWF0cml4CisgIGZvciAoSW5kZXggaiA9IHNpemUtMTsgaiA+PSAwOyBqLS0pCisgIHsKKyAgICBtX3RtcC5ub2FsaWFzKCkgPSBtX2VpdmVjLmxlZnRDb2xzKGorMSkgKiBtX21hdFQuY29sKGopLnNlZ21lbnQoMCwgaisxKTsKKyAgICBtX2VpdmVjLmNvbChqKSA9IG1fdG1wOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRUlHRU5TT0xWRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9HZW5lcmFsaXplZEVpZ2VuU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhOTFkZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9HZW5lcmFsaXplZEVpZ2VuU29sdmVyLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMiBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRvYmlhcyBXb29kIDx0b2JpYXNAc3BpbmljaXN0Lm9yZy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR0VORVJBTElaRURFSUdFTlNPTFZFUl9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxJWkVERUlHRU5TT0xWRVJfSAorCisjaW5jbHVkZSAiLi9SZWFsUVouaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICoKKyAgKiBcY2xhc3MgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcgorICAqCisgICogXGJyaWVmIENvbXB1dGVzIHRoZSBnZW5lcmFsaXplZCBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgcGFpciBvZiBnZW5lcmFsIG1hdHJpY2VzCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaWNlcyBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAqIGVpZ2VuLWRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4CisgICogY2xhc3MgdGVtcGxhdGUuIEN1cnJlbnRseSwgb25seSByZWFsIG1hdHJpY2VzIGFyZSBzdXBwb3J0ZWQuCisgICoKKyAgKiBUaGUgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIG1hdHJpeCBwYWlyIFxmJCBBIFxmJCBhbmQgXGYkIEIgXGYkIGFyZSBzY2FsYXJzCisgICogXGYkIFxsYW1iZGEgXGYkIGFuZCB2ZWN0b3JzIFxmJCB2IFxmJCBzdWNoIHRoYXQgXGYkIEF2ID0gXGxhbWJkYSBCdiBcZiQuICBJZgorICAqIFxmJCBEIFxmJCBpcyBhIGRpYWdvbmFsIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZhbHVlcyBvbiB0aGUgZGlhZ29uYWwsIGFuZAorICAqIFxmJCBWIFxmJCBpcyBhIG1hdHJpeCB3aXRoIHRoZSBlaWdlbnZlY3RvcnMgYXMgaXRzIGNvbHVtbnMsIHRoZW4gXGYkIEEgViA9CisgICogQiBWIEQgXGYkLiBUaGUgbWF0cml4IFxmJCBWIFxmJCBpcyBhbG1vc3QgYWx3YXlzIGludmVydGlibGUsIGluIHdoaWNoIGNhc2Ugd2UKKyAgKiBoYXZlIFxmJCBBID0gQiBWIEQgVl57LTF9IFxmJC4gVGhpcyBpcyBjYWxsZWQgdGhlIGdlbmVyYWxpemVkIGVpZ2VuLWRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIG1hdHJpeCBwYWlyIG1heSBiZSBjb21wbGV4LCBldmVuIHdoZW4gdGhlCisgICogbWF0cmljZXMgYXJlIHJlYWwuIE1vcmVvdmVyLCB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZSBtaWdodCBiZSBpbmZpbml0ZSBpZiB0aGUgbWF0cml4IEIgaXMKKyAgKiBzaW5ndWxhci4gVG8gd29ya2Fyb3VuZCB0aGlzIGRpZmZpY3VsdHksIHRoZSBlaWdlbnZhbHVlcyBhcmUgcHJvdmlkZWQgYXMgYSBwYWlyIG9mIGNvbXBsZXggXGYkIFxhbHBoYSBcZiQKKyAgKiBhbmQgcmVhbCBcZiQgXGJldGEgXGYkIHN1Y2ggdGhhdDogXGYkIFxsYW1iZGFfaSA9IFxhbHBoYV9pIC8gXGJldGFfaSBcZiQuIElmIFxmJCBcYmV0YV9pIFxmJCBpcyAobmVhcmx5KSB6ZXJvLAorICAqIHRoZW4gb25lIGNhbiBjb25zaWRlciB0aGUgd2VsbCBkZWZpbmVkIGxlZnQgZWlnZW52YWx1ZSBcZiQgXG11ID0gXGJldGFfaSAvIFxhbHBoYV9pXGYkIHN1Y2ggdGhhdDoKKyAgKiBcZiQgXG11X2kgQSB2X2kgPSBCIHZfaSBcZiQsIG9yIGV2ZW4gXGYkIFxtdV9pIHVfaV5UIEEgID0gdV9pXlQgQiBcZiQgd2hlcmUgXGYkIHVfaSBcZiQgaXMKKyAgKiBjYWxsZWQgdGhlIGxlZnQgZWlnZW52ZWN0b3IuCisgICoKKyAgKiBDYWxsIHRoZSBmdW5jdGlvbiBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZgorICAqIGEgZ2l2ZW4gbWF0cml4IHBhaXIuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZQorICAqIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsIGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcyB0aGUKKyAgKiBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZSBlaWdlbnZhbHVlIGFuZAorICAqIGVpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBlaWdlbnZhbHVlcygpIGFuZAorICAqIGVpZ2VudmVjdG9ycygpIGZ1bmN0aW9ucy4KKyAgKgorICAqIEhlcmUgaXMgYW4gdXNhZ2UgZXhhbXBsZSBvZiB0aGlzIGNsYXNzOgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgR2VuZXJhbGl6ZWRFaWdlblNvbHZlci5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpLCBjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIsIGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBHZW5lcmFsaXplZEVpZ2VuU29sdmVyCit7CisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgU3lub255bSBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBccCBfTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICAvKiogXGJyaWVmIFNjYWxhciB0eXBlIGZvciBtYXRyaWNlcyBvZiB0eXBlICNNYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisKKyAgICAvKiogXGJyaWVmIENvbXBsZXggc2NhbGFyIHR5cGUgZm9yICNNYXRyaXhUeXBlLiAKKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBcYyBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBpZiAjU2NhbGFyIGlzIHJlYWwgKGUuZy4sCisgICAgICAqIFxjIGZsb2F0IG9yIFxjIGRvdWJsZSkgYW5kIGp1c3QgXGMgU2NhbGFyIGlmICNTY2FsYXIgaXMKKyAgICAgICogY29tcGxleC4KKyAgICAgICovCisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIHJlYWwgc2NhbGFyIHZhbHVlcyBlaWdlbnZhbHVlcyBhcyByZXR1cm5lZCBieSBiZXRhcygpLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgY29sdW1uIHZlY3RvciB3aXRoIGVudHJpZXMgb2YgdHlwZSAjU2NhbGFyLgorICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgaXMgdGhlIHNpemUgb2YgI01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBUeXBlIGZvciB2ZWN0b3Igb2YgY29tcGxleCBzY2FsYXIgdmFsdWVzIGVpZ2VudmFsdWVzIGFzIHJldHVybmVkIGJ5IGFscGhhcygpLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgY29sdW1uIHZlY3RvciB3aXRoIGVudHJpZXMgb2YgdHlwZSAjQ29tcGxleFNjYWxhci4KKyAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIGlzIHRoZSBzaXplIG9mICNNYXRyaXhUeXBlLgorICAgICAgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxDb21wbGV4U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgMSwgT3B0aW9ucyAmIH5Sb3dNYWpvciwgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIDE+IENvbXBsZXhWZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBFeHByZXNzaW9uIHR5cGUgZm9yIHRoZSBlaWdlbnZhbHVlcyBhcyByZXR1cm5lZCBieSBlaWdlbnZhbHVlcygpLgorICAgICAgKi8KKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxDb21wbGV4U2NhbGFyLFNjYWxhcj4sQ29tcGxleFZlY3RvclR5cGUsVmVjdG9yVHlwZT4gRWlnZW52YWx1ZVR5cGU7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMgYXMgcmV0dXJuZWQgYnkgZWlnZW52ZWN0b3JzKCkuIAorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgc3F1YXJlIG1hdHJpeCB3aXRoIGVudHJpZXMgb2YgdHlwZSAjQ29tcGxleFNjYWxhci4gCisgICAgICAqIFRoZSBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mICNNYXRyaXhUeXBlLgorICAgICAgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxDb21wbGV4U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIE9wdGlvbnMsIE1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZT4gRWlnZW52ZWN0b3JzVHlwZTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgRWlnZW5Tb2x2ZXI6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpIGZvciBhbiBleGFtcGxlLgorICAgICAgKi8KKyAgICBHZW5lcmFsaXplZEVpZ2VuU29sdmVyKCkKKyAgICAgIDogbV9laXZlYygpLAorICAgICAgICBtX2FscGhhcygpLAorICAgICAgICBtX2JldGFzKCksCisgICAgICAgIG1fdmFsdWVzT2theShmYWxzZSksCisgICAgICAgIG1fdmVjdG9yc09rYXkoZmFsc2UpLAorICAgICAgICBtX3JlYWxRWigpCisgICAge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBHZW5lcmFsaXplZEVpZ2VuU29sdmVyKCkKKyAgICAgICovCisgICAgZXhwbGljaXQgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcihJbmRleCBzaXplKQorICAgICAgOiBtX2VpdmVjKHNpemUsIHNpemUpLAorICAgICAgICBtX2FscGhhcyhzaXplKSwKKyAgICAgICAgbV9iZXRhcyhzaXplKSwKKyAgICAgICAgbV92YWx1ZXNPa2F5KGZhbHNlKSwKKyAgICAgICAgbV92ZWN0b3JzT2theShmYWxzZSksCisgICAgICAgIG1fcmVhbFFaKHNpemUpLAorICAgICAgICBtX3RtcChzaXplKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCBwYWlyLgorICAgICAgKiAKKyAgICAgICogXHBhcmFtW2luXSAgQSAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIEIgIFNxdWFyZSBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlRWlnZW52ZWN0b3JzICBJZiB0cnVlLCBib3RoIHRoZSBlaWdlbnZlY3RvcnMgYW5kIHRoZQorICAgICAgKiAgICBlaWdlbnZhbHVlcyBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IHRoZSBlaWdlbnZhbHVlcyBhcmUgY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIGdlbmVyYWxpemVkIGVpZ2VudmFsdWVzCisgICAgICAqIGFuZCBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXhUeXBlJiBCLCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSB0cnVlKQorICAgICAgOiBtX2VpdmVjKEEucm93cygpLCBBLmNvbHMoKSksCisgICAgICAgIG1fYWxwaGFzKEEuY29scygpKSwKKyAgICAgICAgbV9iZXRhcyhBLmNvbHMoKSksCisgICAgICAgIG1fdmFsdWVzT2theShmYWxzZSksCisgICAgICAgIG1fdmVjdG9yc09rYXkoZmFsc2UpLAorICAgICAgICBtX3JlYWxRWihBLmNvbHMoKSksCisgICAgICAgIG1fdG1wKEEuY29scygpKQorICAgIHsKKyAgICAgIGNvbXB1dGUoQSwgQiwgY29tcHV0ZUVpZ2VudmVjdG9ycyk7CisgICAgfQorCisgICAgLyogXGJyaWVmIFJldHVybnMgdGhlIGNvbXB1dGVkIGdlbmVyYWxpemVkIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgICVNYXRyaXggd2hvc2UgY29sdW1ucyBhcmUgdGhlIChwb3NzaWJseSBjb21wbGV4KSByaWdodCBlaWdlbnZlY3RvcnMuCisgICAgICAqIGkuZS4gdGhlIGVpZ2VudmVjdG9ycyB0aGF0IHNvbHZlIChBIC0gbCpCKXggPSAwLiBUaGUgb3JkZXJpbmcgbWF0Y2hlcyB0aGUgZWlnZW52YWx1ZXMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogR2VuZXJhbGl6ZWRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJixjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgb3IgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgKiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJiBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCBhbmQKKyAgICAgICogXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyB3YXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KS4KKyAgICAgICoKKyAgICAgICogXHNhIGVpZ2VudmFsdWVzKCkKKyAgICAgICovCisgICAgRWlnZW52ZWN0b3JzVHlwZSBlaWdlbnZlY3RvcnMoKSBjb25zdCB7CisgICAgICBlaWdlbl9hc3NlcnQobV92ZWN0b3JzT2theSAmJiAiRWlnZW52ZWN0b3JzIGZvciBHZW5lcmFsaXplZEVpZ2VuU29sdmVyIHdlcmUgbm90IGNhbGN1bGF0ZWQuIik7CisgICAgICByZXR1cm4gbV9laXZlYzsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29tcHV0ZWQgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZXMuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEFuIGV4cHJlc3Npb24gb2YgdGhlIGNvbHVtbiB2ZWN0b3IgY29udGFpbmluZyB0aGUgZWlnZW52YWx1ZXMuCisgICAgICAqCisgICAgICAqIEl0IGlzIGEgc2hvcnRjdXQgZm9yIFxjb2RlIHRoaXMtPmFscGhhcygpLmN3aXNlUXVvdGllbnQodGhpcy0+YmV0YXMoKSk7IFxlbmRjb2RlCisgICAgICAqIE5vdCB0aGF0IGJldGFzIG1pZ2h0IGNvbnRhaW4gemVyb3MuIEl0IGlzIHRoZXJlZm9yZSBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sCisgICAgICAqIGJ1dCByYXRoZXIgZGlyZWN0bHkgZGVhbCB3aXRoIHRoZSBhbHBoYXMgYW5kIGJldGFzIHZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogR2VuZXJhbGl6ZWRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJixjb25zdCBNYXRyaXhUeXBlJixib29sKSBvciB0aGUgbWVtYmVyIGZ1bmN0aW9uCisgICAgICAqIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsY29uc3QgTWF0cml4VHlwZSYsYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgICAgICoKKyAgICAgICogVGhlIGVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgYWxnZWJyYWljIG11bHRpcGxpY2l0eSwKKyAgICAgICogc28gdGhlcmUgYXJlIGFzIG1hbnkgZWlnZW52YWx1ZXMgYXMgcm93cyBpbiB0aGUgbWF0cml4LiBUaGUgZWlnZW52YWx1ZXMgCisgICAgICAqIGFyZSBub3Qgc29ydGVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLgorICAgICAgKgorICAgICAgKiBcc2EgYWxwaGFzKCksIGJldGFzKCksIGVpZ2VudmVjdG9ycygpCisgICAgICAqLworICAgIEVpZ2VudmFsdWVUeXBlIGVpZ2VudmFsdWVzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV92YWx1ZXNPa2F5ICYmICJHZW5lcmFsaXplZEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBFaWdlbnZhbHVlVHlwZShtX2FscGhhcyxtX2JldGFzKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZlY3RvcnMgY29udGFpbmluZyB0aGUgYWxwaGEgdmFsdWVzCisgICAgICAqCisgICAgICAqIFRoaXMgdmVjdG9yIHBlcm1pdHMgdG8gcmVjb25zdHJ1Y3QgdGhlIGotdGggZWlnZW52YWx1ZXMgYXMgYWxwaGFzKGkpL2JldGFzKGopLgorICAgICAgKgorICAgICAgKiBcc2EgYmV0YXMoKSwgZWlnZW52YWx1ZXMoKSAqLworICAgIENvbXBsZXhWZWN0b3JUeXBlIGFscGhhcygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fdmFsdWVzT2theSAmJiAiR2VuZXJhbGl6ZWRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9hbHBoYXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3JzIGNvbnRhaW5pbmcgdGhlIGJldGEgdmFsdWVzCisgICAgICAqCisgICAgICAqIFRoaXMgdmVjdG9yIHBlcm1pdHMgdG8gcmVjb25zdHJ1Y3QgdGhlIGotdGggZWlnZW52YWx1ZXMgYXMgYWxwaGFzKGkpL2JldGFzKGopLgorICAgICAgKgorICAgICAgKiBcc2EgYWxwaGFzKCksIGVpZ2VudmFsdWVzKCkgKi8KKyAgICBWZWN0b3JUeXBlIGJldGFzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV92YWx1ZXNPa2F5ICYmICJHZW5lcmFsaXplZEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2JldGFzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgZ2VuZXJhbGl6ZWQgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICogCisgICAgICAqIFxwYXJhbVtpbl0gIEEgIFNxdWFyZSBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBCICBTcXVhcmUgbWF0cml4IHdob3NlIGVpZ2VuZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICogXHBhcmFtW2luXSAgY29tcHV0ZUVpZ2VudmVjdG9ycyAgSWYgdHJ1ZSwgYm90aCB0aGUgZWlnZW52ZWN0b3JzIGFuZCB0aGUKKyAgICAgICogICAgZWlnZW52YWx1ZXMgYXJlIGNvbXB1dGVkOyBpZiBmYWxzZSwgb25seSB0aGUgZWlnZW52YWx1ZXMgYXJlCisgICAgICAqICAgIGNvbXB1dGVkLiAKKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSByZWFsIG1hdHJpeCBccCBtYXRyaXguCisgICAgICAqIFRoZSBlaWdlbnZhbHVlcygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZW0uICBJZiAKKyAgICAgICogXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyBpcyB0cnVlLCB0aGVuIHRoZSBlaWdlbnZlY3RvcnMgYXJlIGFsc28gY29tcHV0ZWQKKyAgICAgICogYW5kIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBlaWdlbnZlY3RvcnMoKS4KKyAgICAgICoKKyAgICAgICogVGhlIG1hdHJpeCBpcyBmaXJzdCByZWR1Y2VkIHRvIHJlYWwgZ2VuZXJhbGl6ZWQgU2NodXIgZm9ybSB1c2luZyB0aGUgUmVhbFFaCisgICAgICAqIGNsYXNzLiBUaGUgZ2VuZXJhbGl6ZWQgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB0aGVuIHVzZWQgdG8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKKyAgICAgICogYW5kIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogVGhlIGNvc3Qgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGRvbWluYXRlZCBieSB0aGUgY29zdCBvZiB0aGUKKyAgICAgICogZ2VuZXJhbGl6ZWQgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgcmV1c2VzIG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgR2VuZXJhbGl6ZWRFaWdlblNvbHZlciBvYmplY3QuCisgICAgICAqLworICAgIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXImIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4VHlwZSYgQiwgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gdHJ1ZSk7CisKKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fdmFsdWVzT2theSAmJiAiRWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fcmVhbFFaLmluZm8oKTsKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbGxvd2VkLgorICAgICovCisgICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlciYgc2V0TWF4SXRlcmF0aW9ucyhJbmRleCBtYXhJdGVycykKKyAgICB7CisgICAgICBtX3JlYWxRWi5zZXRNYXhJdGVyYXRpb25zKG1heEl0ZXJzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsIE5VTUVSSUNfVFlQRV9NVVNUX0JFX1JFQUwpOworICAgIH0KKyAgICAKKyAgICBFaWdlbnZlY3RvcnNUeXBlIG1fZWl2ZWM7CisgICAgQ29tcGxleFZlY3RvclR5cGUgbV9hbHBoYXM7CisgICAgVmVjdG9yVHlwZSBtX2JldGFzOworICAgIGJvb2wgbV92YWx1ZXNPa2F5LCBtX3ZlY3RvcnNPa2F5OworICAgIFJlYWxRWjxNYXRyaXhUeXBlPiBtX3JlYWxRWjsKKyAgICBDb21wbGV4VmVjdG9yVHlwZSBtX3RtcDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JgorR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXhUeXBlJiBCLCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKyAgCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisgIGVpZ2VuX2Fzc2VydChBLmNvbHMoKSA9PSBBLnJvd3MoKSAmJiBCLmNvbHMoKSA9PSBBLnJvd3MoKSAmJiBCLmNvbHMoKSA9PSBCLnJvd3MoKSk7CisgIEluZGV4IHNpemUgPSBBLmNvbHMoKTsKKyAgbV92YWx1ZXNPa2F5ID0gZmFsc2U7CisgIG1fdmVjdG9yc09rYXkgPSBmYWxzZTsKKyAgLy8gUmVkdWNlIHRvIGdlbmVyYWxpemVkIHJlYWwgU2NodXIgZm9ybToKKyAgLy8gQSA9IFEgUyBaIGFuZCBCID0gUSBUIFoKKyAgbV9yZWFsUVouY29tcHV0ZShBLCBCLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgaWYgKG1fcmVhbFFaLmluZm8oKSA9PSBTdWNjZXNzKQorICB7CisgICAgLy8gUmVzaXplIHN0b3JhZ2UKKyAgICBtX2FscGhhcy5yZXNpemUoc2l6ZSk7CisgICAgbV9iZXRhcy5yZXNpemUoc2l6ZSk7CisgICAgaWYgKGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgICAgeworICAgICAgbV9laXZlYy5yZXNpemUoc2l6ZSxzaXplKTsKKyAgICAgIG1fdG1wLnJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICAvLyBBbGlhc2VzOgorICAgIE1hcDxWZWN0b3JUeXBlPiB2KHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4obV90bXAuZGF0YSgpKSwgc2l6ZSk7CisgICAgQ29tcGxleFZlY3RvclR5cGUgJmN2ID0gbV90bXA7CisgICAgY29uc3QgTWF0cml4VHlwZSAmbVogPSBtX3JlYWxRWi5tYXRyaXhaKCk7CisgICAgY29uc3QgTWF0cml4VHlwZSAmbVMgPSBtX3JlYWxRWi5tYXRyaXhTKCk7CisgICAgY29uc3QgTWF0cml4VHlwZSAmbVQgPSBtX3JlYWxRWi5tYXRyaXhUKCk7CisKKyAgICBJbmRleCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IHNpemUpCisgICAgeworICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEgfHwgbVMuY29lZmYoaSsxLCBpKSA9PSBTY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIC8vIFJlYWwgZWlnZW52YWx1ZQorICAgICAgICBtX2FscGhhcy5jb2VmZlJlZihpKSA9IG1TLmRpYWdvbmFsKCkuY29lZmYoaSk7CisgICAgICAgIG1fYmV0YXMuY29lZmZSZWYoaSkgID0gbVQuZGlhZ29uYWwoKS5jb2VmZihpKTsKKyAgICAgICAgaWYgKGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgICAgICAgIHsKKyAgICAgICAgICB2LnNldENvbnN0YW50KFNjYWxhcigwLjApKTsKKyAgICAgICAgICB2LmNvZWZmUmVmKGkpID0gU2NhbGFyKDEuMCk7CisgICAgICAgICAgLy8gRm9yIHNpbmd1bGFyIGVpZ2VudmFsdWVzIGRvIG5vdGhpbmcgbW9yZQorICAgICAgICAgIGlmKGFicyhtX2JldGFzLmNvZWZmUmVmKGkpKSA+PSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vbi1zaW5ndWxhciBlaWdlbnZhbHVlCisgICAgICAgICAgICBjb25zdCBTY2FsYXIgYWxwaGEgPSByZWFsKG1fYWxwaGFzLmNvZWZmUmVmKGkpKTsKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciBiZXRhID0gbV9iZXRhcy5jb2VmZlJlZihpKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGktMTsgaiA+PSAwOyBqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0ID0gaisxOworICAgICAgICAgICAgICBjb25zdCBJbmRleCBzeiA9IGktajsKKyAgICAgICAgICAgICAgaWYgKGogPiAwICYmIG1TLmNvZWZmKGosIGotMSkgIT0gU2NhbGFyKDApKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gMngyIGJsb2NrCisgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgMiwgMT4gcmhzID0gKGFscGhhKm1ULnRlbXBsYXRlIGJsb2NrPDIsRHluYW1pYz4oai0xLHN0LDIsc3opIC0gYmV0YSptUy50ZW1wbGF0ZSBibG9jazwyLER5bmFtaWM+KGotMSxzdCwyLHN6KSkgLmxhenlQcm9kdWN0KCB2LnNlZ21lbnQoc3Qsc3opICk7CisgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgMiwgMj4gbGhzID0gYmV0YSAqIG1TLnRlbXBsYXRlIGJsb2NrPDIsMj4oai0xLGotMSkgLSBhbHBoYSAqIG1ULnRlbXBsYXRlIGJsb2NrPDIsMj4oai0xLGotMSk7CisgICAgICAgICAgICAgICAgdi50ZW1wbGF0ZSBzZWdtZW50PDI+KGotMSkgPSBsaHMucGFydGlhbFBpdkx1KCkuc29sdmUocmhzKTsKKyAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdi5jb2VmZlJlZihqKSA9IC12LnNlZ21lbnQoc3Qsc3opLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChiZXRhKm1TLmJsb2NrKGosc3QsMSxzeikgLSBhbHBoYSptVC5ibG9jayhqLHN0LDEsc3opKS5zdW0oKSAvIChiZXRhKm1TLmNvZWZmUmVmKGosaikgLSBhbHBoYSptVC5jb2VmZlJlZihqLGopKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBtX2VpdmVjLmNvbChpKS5yZWFsKCkubm9hbGlhcygpID0gbVoudHJhbnNwb3NlKCkgKiB2OworICAgICAgICAgIG1fZWl2ZWMuY29sKGkpLnJlYWwoKS5ub3JtYWxpemUoKTsKKyAgICAgICAgICBtX2VpdmVjLmNvbChpKS5pbWFnKCkuc2V0Q29uc3RhbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBXZSBuZWVkIHRvIGV4dHJhY3QgdGhlIGdlbmVyYWxpemVkIGVpZ2VudmFsdWVzIG9mIHRoZSBwYWlyIG9mIGEgZ2VuZXJhbCAyeDIgYmxvY2sgUyBhbmQgYSBwb3NpdGl2ZSBkaWFnb25hbCAyeDIgYmxvY2sgVAorICAgICAgICAvLyBUaGVuIHRha2luZyBiZXRhPVRfMDAqVF8xMSwgd2UgY2FuIGF2b2lkIGFueSBkaXZpc2lvbiwgYW5kIGFscGhhIGlzIHRoZSBlaWdlbnZhbHVlcyBvZiBBID0gKFVeLTEgKiBTICogVSkgKiBkaWFnKFRfMTEsVF8wMCk6CisKKyAgICAgICAgLy8gVCA9ICBbYSAwXQorICAgICAgICAvLyAgICAgIFswIGJdCisgICAgICAgIFJlYWxTY2FsYXIgYSA9IG1ULmRpYWdvbmFsKCkuY29lZmYoaSksCisgICAgICAgICAgICAgICAgICAgYiA9IG1ULmRpYWdvbmFsKCkuY29lZmYoaSsxKTsKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciBiZXRhID0gbV9iZXRhcy5jb2VmZlJlZihpKSA9IG1fYmV0YXMuY29lZmZSZWYoaSsxKSA9IGEqYjsKKworICAgICAgICAvLyBeXiBOT1RFOiB1c2luZyBkaWFnb25hbCgpKGkpIGluc3RlYWQgb2YgY29lZmYoaSxpKSB3b3JrYXJvdW5kcyBhIE1TVkMgYnVnLgorICAgICAgICBNYXRyaXg8UmVhbFNjYWxhciwyLDI+IFMyID0gbVMudGVtcGxhdGUgYmxvY2s8MiwyPihpLGkpICogTWF0cml4PFNjYWxhciwyLDE+KGIsYSkuYXNEaWFnb25hbCgpOworCisgICAgICAgIFNjYWxhciBwID0gU2NhbGFyKDAuNSkgKiAoUzIuY29lZmYoMCwwKSAtIFMyLmNvZWZmKDEsMSkpOworICAgICAgICBTY2FsYXIgeiA9IHNxcnQoYWJzKHAgKiBwICsgUzIuY29lZmYoMSwwKSAqIFMyLmNvZWZmKDAsMSkpKTsKKyAgICAgICAgY29uc3QgQ29tcGxleFNjYWxhciBhbHBoYSA9IENvbXBsZXhTY2FsYXIoUzIuY29lZmYoMSwxKSArIHAsIChiZXRhID4gMCkgPyB6IDogLXopOworICAgICAgICBtX2FscGhhcy5jb2VmZlJlZihpKSAgID0gY29uaihhbHBoYSk7CisgICAgICAgIG1fYWxwaGFzLmNvZWZmUmVmKGkrMSkgPSBhbHBoYTsKKworICAgICAgICBpZiAoY29tcHV0ZUVpZ2VudmVjdG9ycykgeworICAgICAgICAgIC8vIENvbXB1dGUgZWlnZW52ZWN0b3IgaW4gcG9zaXRpb24gKGkrMSkgYW5kIHRoZW4gcG9zaXRpb24gKGkpIGlzIGp1c3QgdGhlIGNvbmp1Z2F0ZQorICAgICAgICAgIGN2LnNldFplcm8oKTsKKyAgICAgICAgICBjdi5jb2VmZlJlZihpKzEpID0gU2NhbGFyKDEuMCk7CisgICAgICAgICAgLy8gaGVyZSwgdGhlICJzdGF0aWNfY2FzdCIgd29ya2FvdW5kIGV4cHJlc3Npb24gdGVtcGxhdGUgaXNzdWVzLgorICAgICAgICAgIGN2LmNvZWZmUmVmKGkpID0gLShzdGF0aWNfY2FzdDxTY2FsYXI+KGJldGEqbVMuY29lZmZSZWYoaSxpKzEpKSAtIGFscGhhKm1ULmNvZWZmUmVmKGksaSsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3RhdGljX2Nhc3Q8U2NhbGFyPihiZXRhKm1TLmNvZWZmUmVmKGksaSkpICAgLSBhbHBoYSptVC5jb2VmZlJlZihpLGkpKTsKKyAgICAgICAgICBmb3IgKEluZGV4IGogPSBpLTE7IGogPj0gMDsgai0tKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0ID0gaisxOworICAgICAgICAgICAgY29uc3QgSW5kZXggc3ogPSBpKzEtajsKKyAgICAgICAgICAgIGlmIChqID4gMCAmJiBtUy5jb2VmZihqLCBqLTEpICE9IFNjYWxhcigwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gMngyIGJsb2NrCisgICAgICAgICAgICAgIE1hdHJpeDxDb21wbGV4U2NhbGFyLCAyLCAxPiByaHMgPSAoYWxwaGEqbVQudGVtcGxhdGUgYmxvY2s8MixEeW5hbWljPihqLTEsc3QsMixzeikgLSBiZXRhKm1TLnRlbXBsYXRlIGJsb2NrPDIsRHluYW1pYz4oai0xLHN0LDIsc3opKSAubGF6eVByb2R1Y3QoIGN2LnNlZ21lbnQoc3Qsc3opICk7CisgICAgICAgICAgICAgIE1hdHJpeDxDb21wbGV4U2NhbGFyLCAyLCAyPiBsaHMgPSBiZXRhICogbVMudGVtcGxhdGUgYmxvY2s8MiwyPihqLTEsai0xKSAtIGFscGhhICogbVQudGVtcGxhdGUgYmxvY2s8MiwyPihqLTEsai0xKTsKKyAgICAgICAgICAgICAgY3YudGVtcGxhdGUgc2VnbWVudDwyPihqLTEpID0gbGhzLnBhcnRpYWxQaXZMdSgpLnNvbHZlKHJocyk7CisgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGN2LmNvZWZmUmVmKGopID0gIGN2LnNlZ21lbnQoc3Qsc3opLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChiZXRhKm1TLmJsb2NrKGosc3QsMSxzeikgLSBhbHBoYSptVC5ibG9jayhqLHN0LDEsc3opKS5zdW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoYWxwaGEqbVQuY29lZmZSZWYoaixqKSAtIHN0YXRpY19jYXN0PFNjYWxhcj4oYmV0YSptUy5jb2VmZlJlZihqLGopKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIG1fZWl2ZWMuY29sKGkrMSkubm9hbGlhcygpID0gKG1aLnRyYW5zcG9zZSgpICogY3YpOworICAgICAgICAgIG1fZWl2ZWMuY29sKGkrMSkubm9ybWFsaXplKCk7CisgICAgICAgICAgbV9laXZlYy5jb2woaSkgPSBtX2VpdmVjLmNvbChpKzEpLmNvbmp1Z2F0ZSgpOworICAgICAgICB9CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtX3ZhbHVlc09rYXkgPSB0cnVlOworICAgIG1fdmVjdG9yc09rYXkgPSBjb21wdXRlRWlnZW52ZWN0b3JzOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9HRU5FUkFMSVpFREVJR0VOU09MVkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9HZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9HZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZiYjgyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlci5oCkBAIC0wLDAgKzEsMjI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxJWkVEU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxJWkVEU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICisKKyNpbmNsdWRlICIuL1RyaWRpYWdvbmFsaXphdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKgorICAqIFxicmllZiBDb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIHRoZSBnZW5lcmFsaXplZCBzZWxmYWRqb2ludCBlaWdlbiBwcm9ibGVtCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUKKyAgKiBlaWdlbmRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4CisgICogY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBUaGlzIGNsYXNzIHNvbHZlcyB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZSBwcm9ibGVtCisgICogXGYkIEF2ID0gXGxhbWJkYSBCdiBcZiQuIEluIHRoaXMgY2FzZSwgdGhlIG1hdHJpeCBcZiQgQSBcZiQgc2hvdWxkIGJlCisgICogc2VsZmFkam9pbnQgYW5kIHRoZSBtYXRyaXggXGYkIEIgXGYkIHNob3VsZCBiZSBwb3NpdGl2ZSBkZWZpbml0ZS4KKyAgKgorICAqIE9ubHkgdGhlIFxiIGxvd2VyIFxiIHRyaWFuZ3VsYXIgXGIgcGFydCBvZiB0aGUgaW5wdXQgbWF0cml4IGlzIHJlZmVyZW5jZWQuCisgICoKKyAgKiBDYWxsIHRoZSBmdW5jdGlvbiBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZgorICAqIGEgZ2l2ZW4gbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUKKyAgKiBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsIGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICogY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgYXQgY29uc3RydWN0aW9uIHRpbWUuCisgICogT25jZSB0aGUgZWlnZW52YWx1ZSBhbmQgZWlnZW52ZWN0b3JzIGFyZSBjb21wdXRlZCwgdGhleSBjYW4gYmUgcmV0cmlldmVkIHdpdGggdGhlIGVpZ2VudmFsdWVzKCkKKyAgKiBhbmQgZWlnZW52ZWN0b3JzKCkgZnVuY3Rpb25zLgorICAqCisgICogVGhlIGRvY3VtZW50YXRpb24gZm9yIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgY29uc3QgTWF0cml4VHlwZSYsIGludCkKKyAgKiBjb250YWlucyBhbiBleGFtcGxlIG9mIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGNsYXNzLgorICAqCisgICogXHNhIGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIsIGNsYXNzIEVpZ2VuU29sdmVyLCBjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorY2xhc3MgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIDogcHVibGljIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8X01hdHJpeFR5cGU+Cit7CisgICAgdHlwZWRlZiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPF9NYXRyaXhUeXBlPiBCYXNlOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIGZpeGVkLXNpemUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAgKiBjYW4gb25seSBiZSB1c2VkIGlmIFxwIF9NYXRyaXhUeXBlIGlzIGEgZml4ZWQtc2l6ZSBtYXRyaXg7IHVzZQorICAgICAgKiBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoSW5kZXgpIGZvciBkeW5hbWljLXNpemUgbWF0cmljZXMuCisgICAgICAqLworICAgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcigpIDogQmFzZSgpIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLCBwcmUtYWxsb2NhdGVzIG1lbW9yeSBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSAgc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlCisgICAgICAqIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgd2hlbiB0aGUgdXNlcgorICAgICAgKiBpbnRlbmRzIHRvIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gVGhlIFxwIHNpemUKKyAgICAgICogcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEgd3JvbmcKKyAgICAgICogXHAgc2l6ZSwgYnV0IGl0IG1heSBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUKKyAgICAgICovCisgICAgZXhwbGljaXQgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKEluZGV4IHNpemUpCisgICAgICAgIDogQmFzZShzaXplKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBnZW5lcmFsaXplZCBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4IHBlbmNpbC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0QSAgU2VsZmFkam9pbnQgbWF0cml4IGluIG1hdHJpeCBwZW5jaWwuCisgICAgICAqICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IGlzIHJlZmVyZW5jZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdEIgIFBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCBpbiBtYXRyaXggcGVuY2lsLgorICAgICAgKiAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAgICAgKiBccGFyYW1baW5dICBvcHRpb25zIEEgb3ItZWQgc2V0IG9mIGZsYWdzIHsjQ29tcHV0ZUVpZ2VudmVjdG9ycywjRWlnZW52YWx1ZXNPbmx5fSB8IHsjQXhfbEJ4LCNBQnhfbHgsI0JBeF9seH0uCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyAjQ29tcHV0ZUVpZ2VudmVjdG9yc3wjQXhfbEJ4LgorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzIGFuZCAoaWYgcmVxdWVzdGVkKSB0aGUgZWlnZW52ZWN0b3JzIG9mIHRoZQorICAgICAgKiBnZW5lcmFsaXplZCBlaWdlbnByb2JsZW0gXGYkIEF4ID0gXGxhbWJkYSBCIHggXGYkIHdpdGggXGEgbWF0QSB0aGUKKyAgICAgICogc2VsZmFkam9pbnQgbWF0cml4IFxmJCBBIFxmJCBhbmQgXGEgbWF0QiB0aGUgcG9zaXRpdmUgZGVmaW5pdGUgbWF0cml4CisgICAgICAqIFxmJCBCIFxmJC4gRWFjaCBlaWdlbnZlY3RvciBcZiQgeCBcZiQgc2F0aXNmaWVzIHRoZSBwcm9wZXJ0eQorICAgICAgKiBcZiQgeF4qIEIgeCA9IDEgXGYkLiBUaGUgZWlnZW52ZWN0b3JzIGFyZSBjb21wdXRlZCBpZgorICAgICAgKiBcYSBvcHRpb25zIGNvbnRhaW5zIENvbXB1dGVFaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIEluIGFkZGl0aW9uLCB0aGUgdHdvIGZvbGxvd2luZyB2YXJpYW50cyBjYW4gYmUgc29sdmVkIHZpYSBccCBvcHRpb25zOgorICAgICAgKiAtIFxjIEFCeF9seDogXGYkIEFCeCA9IFxsYW1iZGEgeCBcZiQKKyAgICAgICogLSBcYyBCQXhfbHg6IFxmJCBCQXggPSBcbGFtYmRhIHggXGYkCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUyLm91dAorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgY29uc3QgTWF0cml4VHlwZSYsIGludCkKKyAgICAgICovCisgICAgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdEEsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25zID0gQ29tcHV0ZUVpZ2VudmVjdG9yc3xBeF9sQngpCisgICAgICA6IEJhc2UobWF0QS5jb2xzKCkpCisgICAgeworICAgICAgY29tcHV0ZShtYXRBLCBtYXRCLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIGdlbmVyYWxpemVkIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXggcGVuY2lsLgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRBICBTZWxmYWRqb2ludCBtYXRyaXggaW4gbWF0cml4IHBlbmNpbC4KKyAgICAgICogICAgICAgICAgICAgICAgICAgT25seSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggaXMgcmVmZXJlbmNlZC4KKyAgICAgICogXHBhcmFtW2luXSAgbWF0QiAgUG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4IGluIG1hdHJpeCBwZW5jaWwuCisgICAgICAqICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IGlzIHJlZmVyZW5jZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIG9wdGlvbnMgQSBvci1lZCBzZXQgb2YgZmxhZ3MgeyNDb21wdXRlRWlnZW52ZWN0b3JzLCNFaWdlbnZhbHVlc09ubHl9IHwgeyNBeF9sQngsI0FCeF9seCwjQkF4X2x4fS4KKyAgICAgICogICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzICNDb21wdXRlRWlnZW52ZWN0b3JzfCNBeF9sQnguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBBY2NvcmluZyB0byBccCBvcHRpb25zLCB0aGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGVpZ2VudmFsdWVzIGFuZCAoaWYgcmVxdWVzdGVkKQorICAgICAgKiB0aGUgZWlnZW52ZWN0b3JzIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIGdlbmVyYWxpemVkIGVpZ2VucHJvYmxlbXM6CisgICAgICAqIC0gXGMgQXhfbEJ4OiBcZiQgQXggPSBcbGFtYmRhIEIgeCBcZiQKKyAgICAgICogLSBcYyBBQnhfbHg6IFxmJCBBQnggPSBcbGFtYmRhIHggXGYkCisgICAgICAqIC0gXGMgQkF4X2x4OiBcZiQgQkF4ID0gXGxhbWJkYSB4IFxmJAorICAgICAgKiB3aXRoIFxhIG1hdEEgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBcZiQgQSBcZiQgYW5kIFxhIG1hdEIgdGhlIHBvc2l0aXZlIGRlZmluaXRlCisgICAgICAqIG1hdHJpeCBcZiQgQiBcZiQuCisgICAgICAqIEluIGFkZGl0aW9uLCBlYWNoIGVpZ2VudmVjdG9yIFxmJCB4IFxmJCBzYXRpc2ZpZXMgdGhlIHByb3BlcnR5IFxmJCB4XiogQiB4ID0gMSBcZiQuCisgICAgICAqCisgICAgICAqIFRoZSBlaWdlbnZhbHVlcygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlCisgICAgICAqIHRoZSBlaWdlbnZhbHVlcy4gSWYgXHAgb3B0aW9ucyBjb250YWlucyBDb21wdXRlRWlnZW52ZWN0b3JzLCB0aGVuIHRoZQorICAgICAgKiBlaWdlbnZlY3RvcnMgYXJlIGFsc28gY29tcHV0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZworICAgICAgKiBlaWdlbnZlY3RvcnMoKS4KKyAgICAgICoKKyAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgTExUIHRvIGNvbXB1dGUgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24KKyAgICAgICogXGYkIEIgPSBMTF4qIFxmJCBhbmQgY29tcHV0ZXMgdGhlIGNsYXNzaWNhbCBlaWdlbmRlY29tcG9zaXRpb24KKyAgICAgICogb2YgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBcZiQgTF57LTF9IEEgKExeKileey0xfSBcZiQgaWYgXHAgb3B0aW9ucyBjb250YWlucyBBeF9sQngKKyAgICAgICogYW5kIG9mIFxmJCBMXnsqfSBBIEwgXGYkIG90aGVyd2lzZS4gVGhpcyBzb2x2ZXMgdGhlCisgICAgICAqIGdlbmVyYWxpemVkIGVpZ2VucHJvYmxlbSwgYmVjYXVzZSBhbnkgc29sdXRpb24gb2YgdGhlIGdlbmVyYWxpemVkCisgICAgICAqIGVpZ2VucHJvYmxlbSBcZiQgQXggPSBcbGFtYmRhIEIgeCBcZiQgY29ycmVzcG9uZHMgdG8gYSBzb2x1dGlvbgorICAgICAgKiBcZiQgTF57LTF9IEEgKExeKileey0xfSAoTF4qIHgpID0gXGxhbWJkYSAoTF4qIHgpIFxmJCBvZiB0aGUKKyAgICAgICogZWlnZW5wcm9ibGVtIGZvciBcZiQgTF57LTF9IEEgKExeKileey0xfSBcZiQuIFNpbWlsYXIgc3RhdGVtZW50cworICAgICAgKiBjYW4gYmUgbWFkZSBmb3IgdGhlIHR3byBvdGhlciB2YXJpYW50cy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZTIub3V0CisgICAgICAqCisgICAgICAqIFxzYSBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsIGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICAgICAqLworICAgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRBLCBjb25zdCBNYXRyaXhUeXBlJiBtYXRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucyA9IENvbXB1dGVFaWdlbnZlY3RvcnN8QXhfbEJ4KTsKKworICBwcm90ZWN0ZWQ6CisKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiYgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjoKK2NvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0QSwgY29uc3QgTWF0cml4VHlwZSYgbWF0QiwgaW50IG9wdGlvbnMpCit7CisgIGVpZ2VuX2Fzc2VydChtYXRBLmNvbHMoKT09bWF0QS5yb3dzKCkgJiYgbWF0Qi5yb3dzKCk9PW1hdEEucm93cygpICYmIG1hdEIuY29scygpPT1tYXRCLnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydCgob3B0aW9ucyZ+KEVpZ1ZlY01hc2t8R2VuRWlnTWFzaykpPT0wCisgICAgICAgICAgJiYgKG9wdGlvbnMmRWlnVmVjTWFzaykhPUVpZ1ZlY01hc2sKKyAgICAgICAgICAmJiAoKG9wdGlvbnMmR2VuRWlnTWFzayk9PTAgfHwgKG9wdGlvbnMmR2VuRWlnTWFzayk9PUF4X2xCeAorICAgICAgICAgICB8fCAob3B0aW9ucyZHZW5FaWdNYXNrKT09QUJ4X2x4IHx8IChvcHRpb25zJkdlbkVpZ01hc2spPT1CQXhfbHgpCisgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOworCisgIGJvb2wgY29tcHV0ZUVpZ1ZlY3MgPSAoKG9wdGlvbnMmRWlnVmVjTWFzayk9PTApIHx8ICgob3B0aW9ucyZFaWdWZWNNYXNrKT09Q29tcHV0ZUVpZ2VudmVjdG9ycyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgY2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBtYXRCID0gTCBMJyA9IFUnVQorICBMTFQ8TWF0cml4VHlwZT4gY2hvbEIobWF0Qik7CisKKyAgaW50IHR5cGUgPSAob3B0aW9ucyZHZW5FaWdNYXNrKTsKKyAgaWYodHlwZT09MCkKKyAgICB0eXBlID0gQXhfbEJ4OworCisgIGlmKHR5cGU9PUF4X2xCeCkKKyAgeworICAgIC8vIGNvbXB1dGUgQyA9IGludihMKSBBIGludihMJykKKyAgICBNYXRyaXhUeXBlIG1hdEMgPSBtYXRBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBjaG9sQi5tYXRyaXhMKCkudGVtcGxhdGUgc29sdmVJblBsYWNlPE9uVGhlTGVmdD4obWF0Qyk7CisgICAgY2hvbEIubWF0cml4VSgpLnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxPblRoZVJpZ2h0PihtYXRDKTsKKworICAgIEJhc2U6OmNvbXB1dGUobWF0QywgY29tcHV0ZUVpZ1ZlY3MgPyBDb21wdXRlRWlnZW52ZWN0b3JzIDogRWlnZW52YWx1ZXNPbmx5ICk7CisKKyAgICAvLyB0cmFuc2Zvcm0gYmFjayB0aGUgZWlnZW4gdmVjdG9yczogZXZlY3MgPSBpbnYoVSkgKiBldmVjcworICAgIGlmKGNvbXB1dGVFaWdWZWNzKQorICAgICAgY2hvbEIubWF0cml4VSgpLnNvbHZlSW5QbGFjZShCYXNlOjptX2VpdmVjKTsKKyAgfQorICBlbHNlIGlmKHR5cGU9PUFCeF9seCkKKyAgeworICAgIC8vIGNvbXB1dGUgQyA9IEwnIEEgTAorICAgIE1hdHJpeFR5cGUgbWF0QyA9IG1hdEEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICAgIG1hdEMgPSBtYXRDICogY2hvbEIubWF0cml4TCgpOworICAgIG1hdEMgPSBjaG9sQi5tYXRyaXhVKCkgKiBtYXRDOworCisgICAgQmFzZTo6Y29tcHV0ZShtYXRDLCBjb21wdXRlRWlnVmVjcyA/IENvbXB1dGVFaWdlbnZlY3RvcnMgOiBFaWdlbnZhbHVlc09ubHkpOworCisgICAgLy8gdHJhbnNmb3JtIGJhY2sgdGhlIGVpZ2VuIHZlY3RvcnM6IGV2ZWNzID0gaW52KFUpICogZXZlY3MKKyAgICBpZihjb21wdXRlRWlnVmVjcykKKyAgICAgIGNob2xCLm1hdHJpeFUoKS5zb2x2ZUluUGxhY2UoQmFzZTo6bV9laXZlYyk7CisgIH0KKyAgZWxzZSBpZih0eXBlPT1CQXhfbHgpCisgIHsKKyAgICAvLyBjb21wdXRlIEMgPSBMJyBBIEwKKyAgICBNYXRyaXhUeXBlIG1hdEMgPSBtYXRBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBtYXRDID0gbWF0QyAqIGNob2xCLm1hdHJpeEwoKTsKKyAgICBtYXRDID0gY2hvbEIubWF0cml4VSgpICogbWF0QzsKKworICAgIEJhc2U6OmNvbXB1dGUobWF0QywgY29tcHV0ZUVpZ1ZlY3MgPyBDb21wdXRlRWlnZW52ZWN0b3JzIDogRWlnZW52YWx1ZXNPbmx5KTsKKworICAgIC8vIHRyYW5zZm9ybSBiYWNrIHRoZSBlaWdlbiB2ZWN0b3JzOiBldmVjcyA9IEwgKiBldmVjcworICAgIGlmKGNvbXB1dGVFaWdWZWNzKQorICAgICAgQmFzZTo6bV9laXZlYyA9IGNob2xCLm1hdHJpeEwoKSAqIEJhc2U6Om1fZWl2ZWM7CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTElaRURTRUxGQURKT0lOVEVJR0VOU09MVkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0N2Y2OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oCkBAIC0wLDAgKzEsMzc0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0hFU1NFTkJFUkdERUNPTVBPU0lUSU9OX0gKKyNkZWZpbmUgRUlHRU5fSEVTU0VOQkVSR0RFQ09NUE9TSVRJT05fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25NYXRyaXhIUmV0dXJuVHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uTWF0cml4SFJldHVyblR5cGU8TWF0cml4VHlwZT4gPgoreworICB0eXBlZGVmIE1hdHJpeFR5cGUgUmV0dXJuVHlwZTsKK307CisKK30KKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgorICAqCisgICogXGJyaWVmIFJlZHVjZXMgYSBzcXVhcmUgbWF0cml4IHRvIEhlc3NlbmJlcmcgZm9ybSBieSBhbiBvcnRob2dvbmFsIHNpbWlsYXJpdHkgdHJhbnNmb3JtYXRpb24KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgYW4gSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IFxmJCBBIFxmJC4gSW4KKyAgKiB0aGUgcmVhbCBjYXNlLCB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIGNvbnNpc3RzIG9mIGFuIG9ydGhvZ29uYWwKKyAgKiBtYXRyaXggXGYkIFEgXGYkIGFuZCBhIEhlc3NlbmJlcmcgbWF0cml4IFxmJCBIIFxmJCBzdWNoIHRoYXQgXGYkIEEgPSBRIEgKKyAgKiBRXlQgXGYkLiBBbiBvcnRob2dvbmFsIG1hdHJpeCBpcyBhIG1hdHJpeCB3aG9zZSBpbnZlcnNlIGVxdWFscyBpdHMKKyAgKiB0cmFuc3Bvc2UgKFxmJCBRXnstMX0gPSBRXlQgXGYkKS4gQSBIZXNzZW5iZXJnIG1hdHJpeCBoYXMgemVyb3MgYmVsb3cgdGhlCisgICogc3ViZGlhZ29uYWwsIHNvIGl0IGlzIGFsbW9zdCB1cHBlciB0cmlhbmd1bGFyLiBUaGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uCisgICogb2YgYSBjb21wbGV4IG1hdHJpeCBpcyBcZiQgQSA9IFEgSCBRXiogXGYkIHdpdGggXGYkIFEgXGYkIHVuaXRhcnkgKHRoYXQgaXMsCisgICogXGYkIFFeey0xfSA9IFFeKiBcZiQpLgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBvZiBhCisgICogZ2l2ZW4gbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUKKyAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbihjb25zdCBNYXRyaXhUeXBlJikgY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMgdGhlCisgICogSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZSBkZWNvbXBvc2l0aW9uIGlzCisgICogY29tcHV0ZWQsIHlvdSBjYW4gdXNlIHRoZSBtYXRyaXhIKCkgYW5kIG1hdHJpeFEoKSBmdW5jdGlvbnMgdG8gY29uc3RydWN0CisgICogdGhlIG1hdHJpY2VzIEggYW5kIFEgaW4gdGhlIGRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgbWF0cml4SCgpIGNvbnRhaW5zIGFuIGV4YW1wbGUgb2YgdGhlIHR5cGljYWwgdXNlIG9mCisgICogdGhpcyBjbGFzcy4KKyAgKgorICAqIFxzYSBjbGFzcyBDb21wbGV4U2NodXIsIGNsYXNzIFRyaWRpYWdvbmFsaXphdGlvbiwgXHJlZiBRUl9Nb2R1bGUgIlFSIE1vZHVsZSIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgoreworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIFN5bm9ueW0gZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXHAgX01hdHJpeFR5cGUuICovCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgICAgZW51bSB7CisgICAgICBTaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBTaXplTWludXNPbmUgPSBTaXplID09IER5bmFtaWMgPyBEeW5hbWljIDogU2l6ZSAtIDEsCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgIE1heFNpemUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFNpemVNaW51c09uZSA9IE1heFNpemUgPT0gRHluYW1pYyA/IER5bmFtaWMgOiBNYXhTaXplIC0gMQorICAgIH07CisKKyAgICAvKiogXGJyaWVmIFNjYWxhciB0eXBlIGZvciBtYXRyaWNlcyBvZiB0eXBlICNNYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cy4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBjb2x1bW4gdmVjdG9yIHdpdGggZW50cmllcyBvZiB0eXBlICNTY2FsYXIuIFRoZSBsZW5ndGggb2YgdGhlCisgICAgICAqIHZlY3RvciBpcyBvbmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mICNNYXRyaXhUeXBlLCBpZiBpdCBpcyBhIGZpeGVkLXNpZGUKKyAgICAgICogdHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplTWludXNPbmUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heFNpemVNaW51c09uZSwgMT4gQ29lZmZWZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBSZXR1cm4gdHlwZSBvZiBtYXRyaXhRKCkgKi8KKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBDb2VmZlZlY3RvclR5cGU6OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlPiBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZTsKKyAgICAKKyAgICB0eXBlZGVmIGludGVybmFsOjpIZXNzZW5iZXJnRGVjb21wb3NpdGlvbk1hdHJpeEhSZXR1cm5UeXBlPE1hdHJpeFR5cGU+IE1hdHJpeEhSZXR1cm5UeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yOyB0aGUgZGVjb21wb3NpdGlvbiB3aWxsIGJlIGNvbXB1dGVkIGxhdGVyLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSBzaXplICBUaGUgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiB3aWxsIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuICBUaGUgXHAgc2l6ZSBwYXJhbWV0ZXIgaXMgb25seQorICAgICAgKiB1c2VkIGFzIGEgaGludC4gSXQgaXMgbm90IGFuIGVycm9yIHRvIGdpdmUgYSB3cm9uZyBccCBzaXplLCBidXQgaXQgbWF5CisgICAgICAqIGltcGFpciBwZXJmb3JtYW5jZS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKSBmb3IgYW4gZXhhbXBsZS4KKyAgICAgICovCisgICAgZXhwbGljaXQgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oSW5kZXggc2l6ZSA9IFNpemU9PUR5bmFtaWMgPyAyIDogU2l6ZSkKKyAgICAgIDogbV9tYXRyaXgoc2l6ZSxzaXplKSwKKyAgICAgICAgbV90ZW1wKHNpemUpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgaWYoc2l6ZT4xKQorICAgICAgICBtX2hDb2VmZnMucmVzaXplKHNpemUtMSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICBTcXVhcmUgbWF0cml4IHdob3NlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgSGVzc2VuYmVyZworICAgICAgKiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgbWF0cml4SCgpIGZvciBhbiBleGFtcGxlLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgZXhwbGljaXQgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4LmRlcml2ZWQoKSksCisgICAgICAgIG1fdGVtcChtYXRyaXgucm93cygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHsKKyAgICAgIGlmKG1hdHJpeC5yb3dzKCk8MikKKyAgICAgIHsKKyAgICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbV9oQ29lZmZzLnJlc2l6ZShtYXRyaXgucm93cygpLTEsMSk7CisgICAgICBfY29tcHV0ZShtX21hdHJpeCwgbV9oQ29lZmZzLCBtX3RlbXApOworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGJ5IGJyaW5naW5nIHRoZSBjb2x1bW5zIG9mIHRoZQorICAgICAgKiBtYXRyaXggc3VjY2Vzc2l2ZWx5IGluIHRoZSByZXF1aXJlZCBmb3JtIHVzaW5nIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zCisgICAgICAqIChzZWUsIGUuZy4sIEFsZ29yaXRobSA3LjQuMiBpbiBHb2x1YiBcJiBWYW4gTG9hbiwgPGk+JU1hdHJpeAorICAgICAgKiBDb21wdXRhdGlvbnM8L2k+KS4gVGhlIGNvc3QgaXMgXGYkIDEwbl4zLzMgXGYkIGZsb3BzLCB3aGVyZSBcZiQgbiBcZiQKKyAgICAgICogZGVub3RlcyB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCByZXVzZXMgb2YgdGhlIGFsbG9jYXRlZCBkYXRhIGluIHRoZSBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgorICAgICAgKiBvYmplY3QuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbiYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICAgIHsKKyAgICAgIG1fbWF0cml4ID0gbWF0cml4LmRlcml2ZWQoKTsKKyAgICAgIGlmKG1hdHJpeC5yb3dzKCk8MikKKyAgICAgIHsKKyAgICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgbV9oQ29lZmZzLnJlc2l6ZShtYXRyaXgucm93cygpLTEsMSk7CisgICAgICBfY29tcHV0ZShtX21hdHJpeCwgbV9oQ29lZmZzLCBtX3RlbXApOworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cy4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZlY3RvciBvZiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKQorICAgICAgKiBvciB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZAorICAgICAgKiBiZWZvcmUgdG8gY29tcHV0ZSB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGUgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIGFsbG93IHRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgbWF0cml4CisgICAgICAqIFxmJCBRIFxmJCBpbiB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIGZyb20gdGhlIHBhY2tlZCBkYXRhLgorICAgICAgKgorICAgICAgKiBcc2EgcGFja2VkTWF0cml4KCksIFxyZWYgSG91c2Vob2xkZXJfTW9kdWxlICJIb3VzZWhvbGRlciBtb2R1bGUiCisgICAgICAqLworICAgIGNvbnN0IENvZWZmVmVjdG9yVHlwZSYgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2hDb2VmZnM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVjb21wb3NpdGlvbgorICAgICAgKgorICAgICAgKglccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBhIG1hdHJpeCB3aXRoIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgICAgKgkgICAgICAgICBvZiB0aGUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKQorICAgICAgKiBvciB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZAorICAgICAgKiBiZWZvcmUgdG8gY29tcHV0ZSB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGUgcmV0dXJuZWQgbWF0cml4IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgICAgICAqICAtIHRoZSB1cHBlciBwYXJ0IGFuZCBsb3dlciBzdWItZGlhZ29uYWwgcmVwcmVzZW50IHRoZSBIZXNzZW5iZXJnIG1hdHJpeCBICisgICAgICAqICAtIHRoZSByZXN0IG9mIHRoZSBsb3dlciBwYXJ0IGNvbnRhaW5zIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzIHRoYXQsIGNvbWJpbmVkIHdpdGgKKyAgICAgICogICAgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIHJldHVybmVkIGJ5IGhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCksCisgICAgICAqICAgIGFsbG93cyB0byByZWNvbnN0cnVjdCB0aGUgbWF0cml4IFEgYXMKKyAgICAgICogICAgICAgXGYkIFEgPSBIX3tOLTF9IFxsZG90cyBIXzEgSF8wIFxmJC4KKyAgICAgICogICAgSGVyZSwgdGhlIG1hdHJpY2VzIFxmJCBIX2kgXGYkIGFyZSB0aGUgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb25zCisgICAgICAqICAgICAgIFxmJCBIX2kgPSAoSSAtIGhfaSB2X2kgdl9pXlQpIFxmJAorICAgICAgKiAgICB3aGVyZSBcZiQgaF9pIFxmJCBpcyB0aGUgXGYkIGkgXGYkdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgYW5kCisgICAgICAqICAgIFxmJCB2X2kgXGYkIGlzIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3IgZGVmaW5lZCBieQorICAgICAgKiAgICAgICBcZiQgdl9pID0gWyAwLCBcbGRvdHMsIDAsIDEsIE0oaSsyLGkpLCBcbGRvdHMsIE0oTi0xLGkpIF1eVCBcZiQKKyAgICAgICogICAgd2l0aCBNIHRoZSBtYXRyaXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICogU2VlIExBUEFDSyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgcGFja2VkIHN0b3JhZ2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX3BhY2tlZE1hdHJpeC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4Lm91dAorICAgICAgKgorICAgICAgKiBcc2EgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKQorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBwYWNrZWRNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeDsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJlY29uc3RydWN0cyB0aGUgb3J0aG9nb25hbCBtYXRyaXggUSBpbiB0aGUgZGVjb21wb3NpdGlvbgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggUQorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgICAgICAqIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkCisgICAgICAqIGJlZm9yZSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpZ2h0LXdlaWdodCBvYmplY3Qgb2YgdGVtcGxhdGUgY2xhc3MKKyAgICAgICogSG91c2Vob2xkZXJTZXF1ZW5jZS4gWW91IGNhbiBlaXRoZXIgYXBwbHkgaXQgZGlyZWN0bHkgdG8gYSBtYXRyaXggb3IKKyAgICAgICogeW91IGNhbiBjb252ZXJ0IGl0IHRvIGEgbWF0cml4IG9mIHR5cGUgI01hdHJpeFR5cGUuCisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhIKCkgZm9yIGFuIGV4YW1wbGUsIGNsYXNzIEhvdXNlaG9sZGVyU2VxdWVuY2UKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgbWF0cml4USgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlKG1fbWF0cml4LCBtX2hDb2VmZnMuY29uanVnYXRlKCkpCisgICAgICAgICAgICAgLnNldExlbmd0aChtX21hdHJpeC5yb3dzKCkgLSAxKQorICAgICAgICAgICAgIC5zZXRTaGlmdCgxKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgdGhlIEhlc3NlbmJlcmcgbWF0cml4IEggaW4gdGhlIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgZXhwcmVzc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggSAorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgICAgICAqIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkCisgICAgICAqIGJlZm9yZSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSBIZXNzZW5iZXJnIG1hdHJpeCBICisgICAgICAqIHdoZW4gaXQgaXMgYXNzaWduZWQgdG8gYSBtYXRyaXggb3Igb3RoZXJ3aXNlIGV2YWx1YXRlZC4gVGhlIG1hdHJpeCBIIGlzCisgICAgICAqIGNvbnN0cnVjdGVkIGZyb20gdGhlIHBhY2tlZCBtYXRyaXggYXMgcmV0dXJuZWQgYnkgcGFja2VkTWF0cml4KCk6IFRoZQorICAgICAgKiB1cHBlciBwYXJ0IChpbmNsdWRpbmcgdGhlIHN1YmRpYWdvbmFsKSBvZiB0aGUgcGFja2VkIG1hdHJpeCBjb250YWlucworICAgICAgKiB0aGUgbWF0cml4IEguIEl0IG1heSBzb21ldGltZXMgYmUgYmV0dGVyIHRvIGRpcmVjdGx5IHVzZSB0aGUgcGFja2VkCisgICAgICAqIG1hdHJpeCBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyB0aGUgbWF0cml4IEguCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEguY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEgub3V0CisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhRKCksIHBhY2tlZE1hdHJpeCgpCisgICAgICAqLworICAgIE1hdHJpeEhSZXR1cm5UeXBlIG1hdHJpeEgoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBNYXRyaXhIUmV0dXJuVHlwZSgqdGhpcyk7CisgICAgfQorCisgIHByaXZhdGU6CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIFNpemUsIE9wdGlvbnMgfCBSb3dNYWpvciwgMSwgTWF4U2l6ZT4gVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgc3RhdGljIHZvaWQgX2NvbXB1dGUoTWF0cml4VHlwZSYgbWF0QSwgQ29lZmZWZWN0b3JUeXBlJiBoQ29lZmZzLCBWZWN0b3JUeXBlJiB0ZW1wKTsKKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX21hdHJpeDsKKyAgICBDb2VmZlZlY3RvclR5cGUgbV9oQ29lZmZzOworICAgIFZlY3RvclR5cGUgbV90ZW1wOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFBlcmZvcm1zIGEgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRBIGluIHBsYWNlLgorICAqCisgICogXHBhcmFtIG1hdEEgdGhlIGlucHV0IHNlbGZhZGpvaW50IG1hdHJpeAorICAqIFxwYXJhbSBoQ29lZmZzIHJldHVybmVkIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cworICAqCisgICogVGhlIHJlc3VsdCBpcyB3cml0dGVuIGluIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgXGEgbWF0QS4KKyAgKgorICAqIEltcGxlbWVudGVkIGZyb20gR29sdWIncyAiJU1hdHJpeCBDb21wdXRhdGlvbnMiLCBhbGdvcml0aG0gOC4zLjEuCisgICoKKyAgKiBcc2EgcGFja2VkTWF0cml4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+OjpfY29tcHV0ZShNYXRyaXhUeXBlJiBtYXRBLCBDb2VmZlZlY3RvclR5cGUmIGhDb2VmZnMsIFZlY3RvclR5cGUmIHRlbXApCit7CisgIGVpZ2VuX2Fzc2VydChtYXRBLnJvd3MoKT09bWF0QS5jb2xzKCkpOworICBJbmRleCBuID0gbWF0QS5yb3dzKCk7CisgIHRlbXAucmVzaXplKG4pOworICBmb3IgKEluZGV4IGkgPSAwOyBpPG4tMTsgKytpKQorICB7CisgICAgLy8gbGV0J3MgY29uc2lkZXIgdGhlIHZlY3RvciB2ID0gaS10aCBjb2x1bW4gc3RhcnRpbmcgYXQgcG9zaXRpb24gaSsxCisgICAgSW5kZXggcmVtYWluaW5nU2l6ZSA9IG4taS0xOworICAgIFJlYWxTY2FsYXIgYmV0YTsKKyAgICBTY2FsYXIgaDsKKyAgICBtYXRBLmNvbChpKS50YWlsKHJlbWFpbmluZ1NpemUpLm1ha2VIb3VzZWhvbGRlckluUGxhY2UoaCwgYmV0YSk7CisgICAgbWF0QS5jb2woaSkuY29lZmZSZWYoaSsxKSA9IGJldGE7CisgICAgaENvZWZmcy5jb2VmZlJlZihpKSA9IGg7CisKKyAgICAvLyBBcHBseSBzaW1pbGFyaXR5IHRyYW5zZm9ybWF0aW9uIHRvIHJlbWFpbmluZyBjb2x1bW5zLAorICAgIC8vIGkuZS4sIGNvbXB1dGUgQSA9IEggQSBIJworCisgICAgLy8gQSA9IEggQQorICAgIG1hdEEuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nU2l6ZSwgcmVtYWluaW5nU2l6ZSkKKyAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplLTEpLCBoLCAmdGVtcC5jb2VmZlJlZigwKSk7CisKKyAgICAvLyBBID0gQSBIJworICAgIG1hdEEucmlnaHRDb2xzKHJlbWFpbmluZ1NpemUpCisgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChtYXRBLmNvbChpKS50YWlsKHJlbWFpbmluZ1NpemUtMSkuY29uanVnYXRlKCksIG51bWV4dDo6Y29uaihoKSwgJnRlbXAuY29lZmZSZWYoMCkpOworICB9Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiB0eXBlIGZvciByZXR1cm4gdmFsdWUgb2YgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb246Om1hdHJpeEgoKQorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHR5cGUgb2YgbWF0cml4IGluIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24KKyAgKgorICAqIE9iamVjdHMgb2YgdGhpcyB0eXBlIHJlcHJlc2VudCB0aGUgSGVzc2VuYmVyZyBtYXRyaXggaW4gdGhlIEhlc3NlbmJlcmcKKyAgKiBkZWNvbXBvc2l0aW9uIG9mIHNvbWUgbWF0cml4LiBUaGUgb2JqZWN0IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZQorICAqIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIGNsYXNzIHVudGlsIHRoZSBpdCBpcyBhc3NpZ25lZCBvciBldmFsdWF0ZWQgZm9yCisgICogc29tZSBvdGhlciByZWFzb24gKHRoZSByZWZlcmVuY2Ugc2hvdWxkIHJlbWFpbiB2YWxpZCBkdXJpbmcgdGhlIGxpZmUgdGltZQorICAqIG9mIHRoaXMgb2JqZWN0KS4gVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjo6bWF0cml4SCgpOyB0aGVyZSBpcyBwcm9iYWJseSBubyBvdGhlciB1c2UgZm9yIHRoaXMKKyAgKiBjbGFzcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbk1hdHJpeEhSZXR1cm5UeXBlCis6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uTWF0cml4SFJldHVyblR5cGU8TWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSBoZXNzICBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24KKyAgICAgICovCisgICAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25NYXRyaXhIUmV0dXJuVHlwZShjb25zdCBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiYgaGVzcykgOiBtX2hlc3MoaGVzcykgeyB9CisKKyAgICAvKiogXGJyaWVmIEhlc3NlbmJlcmcgbWF0cml4IGluIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgSGVzc2VuYmVyZyBtYXRyaXggaW4gZGVjb21wb3NpdGlvbiBccCBoZXNzIHdoaWNoCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgd2FzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICByZXN1bHQgPSBtX2hlc3MucGFja2VkTWF0cml4KCk7CisgICAgICBJbmRleCBuID0gcmVzdWx0LnJvd3MoKTsKKyAgICAgIGlmIChuPjIpCisgICAgICAgIHJlc3VsdC5ib3R0b21MZWZ0Q29ybmVyKG4tMiwgbi0yKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1faGVzcy5wYWNrZWRNYXRyaXgoKS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9oZXNzLnBhY2tlZE1hdHJpeCgpLmNvbHMoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiYgbV9oZXNzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSEVTU0VOQkVSR0RFQ09NUE9TSVRJT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL01hdHJpeEJhc2VFaWdlbnZhbHVlcy5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL01hdHJpeEJhc2VFaWdlbnZhbHVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWM4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvTWF0cml4QmFzZUVpZ2VudmFsdWVzLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWEJBU0VFSUdFTlZBTFVFU19ICisjZGVmaW5lIEVJR0VOX01BVFJJWEJBU0VFSUdFTlZBTFVFU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBib29sIElzQ29tcGxleD4KK3N0cnVjdCBlaWdlbnZhbHVlc19zZWxlY3RvcgoreworICAvLyB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGNhc2UgSXNDb21wbGV4ID0gdHJ1ZQorICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkVpZ2VudmFsdWVzUmV0dXJuVHlwZSBjb25zdAorICBydW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgICAgUGxhaW5PYmplY3QgbV9ldmFsKG0pOworICAgIHJldHVybiBDb21wbGV4RWlnZW5Tb2x2ZXI8UGxhaW5PYmplY3Q+KG1fZXZhbCwgZmFsc2UpLmVpZ2VudmFsdWVzKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZWlnZW52YWx1ZXNfc2VsZWN0b3I8RGVyaXZlZCwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RWlnZW52YWx1ZXNSZXR1cm5UeXBlIGNvbnN0CisgIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgICBQbGFpbk9iamVjdCBtX2V2YWwobSk7CisgICAgcmV0dXJuIEVpZ2VuU29sdmVyPFBsYWluT2JqZWN0PihtX2V2YWwsIGZhbHNlKS5laWdlbnZhbHVlcygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgZWlnZW52YWx1ZXMgb2YgYSBtYXRyaXggCisgICogXHJldHVybnMgQ29sdW1uIHZlY3RvciBjb250YWluaW5nIHRoZSBlaWdlbnZhbHVlcy4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyB3aXRoIHRoZSBoZWxwIG9mIHRoZSBFaWdlblNvbHZlcgorICAqIGNsYXNzIChmb3IgcmVhbCBtYXRyaWNlcykgb3IgdGhlIENvbXBsZXhFaWdlblNvbHZlciBjbGFzcyAoZm9yIGNvbXBsZXgKKyAgKiBtYXRyaWNlcykuIAorICAqCisgICogVGhlIGVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgYWxnZWJyYWljIG11bHRpcGxpY2l0eSwKKyAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguCisgICoKKyAgKiBUaGUgU2VsZkFkam9pbnRWaWV3IGNsYXNzIHByb3ZpZGVzIGEgYmV0dGVyIGFsZ29yaXRobSBmb3Igc2VsZmFkam9pbnQKKyAgKiBtYXRyaWNlcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZWlnZW52YWx1ZXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9laWdlbnZhbHVlcy5vdXQKKyAgKgorICAqIFxzYSBFaWdlblNvbHZlcjo6ZWlnZW52YWx1ZXMoKSwgQ29tcGxleEVpZ2VuU29sdmVyOjplaWdlbnZhbHVlcygpLAorICAqICAgICBTZWxmQWRqb2ludFZpZXc6OmVpZ2VudmFsdWVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RWlnZW52YWx1ZXNSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjplaWdlbnZhbHVlcygpIGNvbnN0Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgcmV0dXJuIGludGVybmFsOjplaWdlbnZhbHVlc19zZWxlY3RvcjxEZXJpdmVkLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4Pjo6cnVuKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIGEgbWF0cml4CisgICogXHJldHVybnMgQ29sdW1uIHZlY3RvciBjb250YWluaW5nIHRoZSBlaWdlbnZhbHVlcy4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyB3aXRoIHRoZSBoZWxwIG9mIHRoZQorICAqIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgY2xhc3MuICBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0bworICAqIHRoZWlyIGFsZ2VicmFpYyBtdWx0aXBsaWNpdHksIHNvIHRoZXJlIGFyZSBhcyBtYW55IGVpZ2VudmFsdWVzIGFzIHJvd3MgaW4KKyAgKiB0aGUgbWF0cml4LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRWaWV3X2VpZ2VudmFsdWVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5vdXQKKyAgKgorICAqIFxzYSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyOjplaWdlbnZhbHVlcygpLCBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4gCitpbmxpbmUgdHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpFaWdlbnZhbHVlc1JldHVyblR5cGUKK1NlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6ZWlnZW52YWx1ZXMoKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIFBsYWluT2JqZWN0IHRoaXNBc01hdHJpeCgqdGhpcyk7CisgIHJldHVybiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPFBsYWluT2JqZWN0Pih0aGlzQXNNYXRyaXgsIGZhbHNlKS5laWdlbnZhbHVlcygpOworfQorCisKKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgTDIgb3BlcmF0b3Igbm9ybQorICAqIFxyZXR1cm5zIE9wZXJhdG9yIG5vcm0gb2YgdGhlIG1hdHJpeC4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBMMiBvcGVyYXRvciBub3JtIG9mIGEgbWF0cml4LCB3aGljaCBpcyBhbHNvCisgICoga25vd24gYXMgdGhlIHNwZWN0cmFsIG5vcm0uIFRoZSBub3JtIG9mIGEgbWF0cml4IFxmJCBBIFxmJCBpcyBkZWZpbmVkIHRvIGJlCisgICogXGZbIFx8QVx8XzIgPSBcbWF4X3ggXGZyYWN7XHxBeFx8XzJ9e1x8eFx8XzJ9IFxmXQorICAqIHdoZXJlIHRoZSBtYXhpbXVtIGlzIG92ZXIgYWxsIHZlY3RvcnMgYW5kIHRoZSBub3JtIG9uIHRoZSByaWdodCBpcyB0aGUKKyAgKiBFdWNsaWRlYW4gdmVjdG9yIG5vcm0uIFRoZSBub3JtIGVxdWFscyB0aGUgbGFyZ2VzdCBzaW5ndWxhciB2YWx1ZSwgd2hpY2ggaXMKKyAgKiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGxhcmdlc3QgZWlnZW52YWx1ZSBvZiB0aGUgcG9zaXRpdmUgc2VtaS1kZWZpbml0ZQorICAqIG1hdHJpeCBcZiQgQV4qQSBcZiQuCisgICoKKyAgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBlaWdlbnZhbHVlcyBvZiBcZiQgQV4qQSBcZiQsIGFzIGNvbXB1dGVkCisgICogYnkgU2VsZkFkam9pbnRWaWV3OjplaWdlbnZhbHVlcygpLCB0byBjb21wdXRlIHRoZSBvcGVyYXRvciBub3JtIG9mIGEKKyAgKiBtYXRyaXguICBUaGUgU2VsZkFkam9pbnRWaWV3IGNsYXNzIHByb3ZpZGVzIGEgYmV0dGVyIGFsZ29yaXRobSBmb3IKKyAgKiBzZWxmYWRqb2ludCBtYXRyaWNlcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLm91dAorICAqCisgICogXHNhIFNlbGZBZGpvaW50Vmlldzo6ZWlnZW52YWx1ZXMoKSwgU2VsZkFkam9pbnRWaWV3OjpvcGVyYXRvck5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpSZWFsU2NhbGFyCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvck5vcm0oKSBjb25zdAoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IG1fZXZhbChkZXJpdmVkKCkpOworICAvLyBGSVhNRSBpZiBpdCBpcyByZWFsbHkgZ3VhcmFudGVlZCB0aGF0IHRoZSBlaWdlbnZhbHVlcyBhcmUgYWxyZWFkeSBzb3J0ZWQsCisgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjb21wdXRlIGEgbWF4Q29lZmYoKSBoZXJlLCBjb21wYXJpbmcgdGhlIDFzdCBhbmQgbGFzdCBvbmVzIGlzIGVub3VnaC4KKyAgcmV0dXJuIHNxcnQoKG1fZXZhbCptX2V2YWwuYWRqb2ludCgpKQorICAgICAgICAgICAgICAgICAuZXZhbCgpCisJCSAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpCisJCSAuZWlnZW52YWx1ZXMoKQorCQkgLm1heENvZWZmKCkKKwkJICk7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIEwyIG9wZXJhdG9yIG5vcm0KKyAgKiBccmV0dXJucyBPcGVyYXRvciBub3JtIG9mIHRoZSBtYXRyaXguCisgICoKKyAgKiBcZWlnZW52YWx1ZXNfbW9kdWxlCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgTDIgb3BlcmF0b3Igbm9ybSBvZiBhIHNlbGYtYWRqb2ludCBtYXRyaXguIEZvciBhCisgICogc2VsZi1hZGpvaW50IG1hdHJpeCwgdGhlIG9wZXJhdG9yIG5vcm0gaXMgdGhlIGxhcmdlc3QgZWlnZW52YWx1ZS4KKyAgKgorICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBtYXRyaXgsIGFzIGNvbXB1dGVkCisgICogYnkgZWlnZW52YWx1ZXMoKSwgdG8gY29tcHV0ZSB0aGUgb3BlcmF0b3Igbm9ybSBvZiB0aGUgbWF0cml4LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRWaWV3X29wZXJhdG9yTm9ybS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLm91dAorICAqCisgICogXHNhIGVpZ2VudmFsdWVzKCksIE1hdHJpeEJhc2U6Om9wZXJhdG9yTm9ybSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KK2lubGluZSB0eXBlbmFtZSBTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSwgVXBMbz46OlJlYWxTY2FsYXIKK1NlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6b3BlcmF0b3JOb3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIGVpZ2VudmFsdWVzKCkuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvUmVhbFFaLmggYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvUmVhbFFaLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhOTEwZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsUVouaApAQCAtMCwwICsxLDY1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWxleGV5IEtvcmVwYW5vdiA8a2Fpa2Fpa2FpQHlhbmRleC5ydT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVBTF9RWl9ICisjZGVmaW5lIEVJR0VOX1JFQUxfUVpfSAorCituYW1lc3BhY2UgRWlnZW4geworCisgIC8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAgKgorICAgKgorICAgKiBcY2xhc3MgUmVhbFFaCisgICAqCisgICAqIFxicmllZiBQZXJmb3JtcyBhIHJlYWwgUVogZGVjb21wb3NpdGlvbiBvZiBhIHBhaXIgb2Ygc3F1YXJlIG1hdHJpY2VzCisgICAqCisgICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAgKiByZWFsIFFaIGRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUKKyAgICogTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAgKgorICAgKiBHaXZlbiBhIHJlYWwgc3F1YXJlIG1hdHJpY2VzIEEgYW5kIEIsIHRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIHJlYWwgUVoKKyAgICogZGVjb21wb3NpdGlvbjogXGYkIEEgPSBRIFMgWiBcZiQsIFxmJCBCID0gUSBUIFogXGYkIHdoZXJlIFEgYW5kIFogYXJlCisgICAqIHJlYWwgb3J0aG9nb25hbCBtYXRyaXhlcywgVCBpcyB1cHBlci10cmlhbmd1bGFyIG1hdHJpeCwgYW5kIFMgaXMgdXBwZXIKKyAgICogcXVhc2ktdHJpYW5ndWxhciBtYXRyaXguIEFuIG9ydGhvZ29uYWwgbWF0cml4IGlzIGEgbWF0cml4IHdob3NlCisgICAqIGludmVyc2UgaXMgZXF1YWwgdG8gaXRzIHRyYW5zcG9zZSwgXGYkIFVeey0xfSA9IFVeVCBcZiQuIEEgcXVhc2ktdHJpYW5ndWxhcgorICAgKiBtYXRyaXggaXMgYSBibG9jay10cmlhbmd1bGFyIG1hdHJpeCB3aG9zZSBkaWFnb25hbCBjb25zaXN0cyBvZiAxLWJ5LTEKKyAgICogYmxvY2tzIGFuZCAyLWJ5LTIgYmxvY2tzIHdoZXJlIGZ1cnRoZXIgcmVkdWN0aW9uIGlzIGltcG9zc2libGUgZHVlIHRvCisgICAqIGNvbXBsZXggZWlnZW52YWx1ZXMuIAorICAgKgorICAgKiBUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIHBlbmNpbCBcZiQgQSAtIHogQiBcZiQgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgICogMXgxIGFuZCAyeDIgYmxvY2tzIG9uIHRoZSBkaWFnb25hbHMgb2YgUyBhbmQgVC4KKyAgICoKKyAgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIHJlYWwgUVogZGVjb21wb3NpdGlvbiBvZiBhCisgICAqIGdpdmVuIHBhaXIgb2YgbWF0cmljZXMuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSAKKyAgICogUmVhbFFaKGNvbnN0IE1hdHJpeFR5cGUmIEIsIGNvbnN0IE1hdHJpeFR5cGUmIEIsIGJvb2wgY29tcHV0ZVFaKQorICAgKiBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcyB0aGUgcmVhbCBRWiBkZWNvbXBvc2l0aW9uIGF0IGNvbnN0cnVjdGlvbgorICAgKiB0aW1lLiBPbmNlIHRoZSBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkLCB5b3UgY2FuIHVzZSB0aGUgbWF0cml4UygpLAorICAgKiBtYXRyaXhUKCksIG1hdHJpeFEoKSBhbmQgbWF0cml4WigpIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSB0aGUgbWF0cmljZXMKKyAgICogUywgVCwgUSBhbmQgWiBpbiB0aGUgZGVjb21wb3NpdGlvbi4gSWYgY29tcHV0ZVFaPT1mYWxzZSwgc29tZSB0aW1lCisgICAqIGlzIHNhdmVkIGJ5IG5vdCBjb21wdXRpbmcgbWF0cmljZXMgUSBhbmQgWi4KKyAgICoKKyAgICogRXhhbXBsZTogXGluY2x1ZGUgUmVhbFFaX2NvbXB1dGUuY3BwCisgICAqIE91dHB1dDogXGluY2x1ZGUgUmVhbFFaX2NvbXB1dGUub3V0CisgICAqCisgICAqIFxub3RlIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgYWxnb3JpdGhtIGluICJNYXRyaXggQ29tcHV0YXRpb25zIgorICAgKiBieSBHZW5lIEguIEdvbHViIGFuZCBDaGFybGVzIEYuIFZhbiBMb2FuLCBhbmQgYSBwYXBlciAiQW4gYWxnb3JpdGhtIGZvcgorICAgKiBnZW5lcmFsaXplZCBlaWdlbnZhbHVlIHByb2JsZW1zIiBieSBDLkIuTW9sZXIgYW5kIEcuVy5TdGV3YXJ0LgorICAgKgorICAgKiBcc2EgY2xhc3MgUmVhbFNjaHVyLCBjbGFzcyBDb21wbGV4U2NodXIsIGNsYXNzIEVpZ2VuU29sdmVyLCBjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIKKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIFJlYWxRWgorICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgICAgZW51bSB7CisgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgICB9OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWw+IENvbXBsZXhTY2FsYXI7CisgICAgICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKworICAgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBDb2x1bW5WZWN0b3JUeXBlOworCisgICAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogXHBhcmFtIFtpbl0gc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlIFFaIGRlY29tcG9zaXRpb24gd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICAqCisgICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLiAgVGhlIFxwIHNpemUgcGFyYW1ldGVyIGlzIG9ubHkKKyAgICAgICAqIHVzZWQgYXMgYSBoaW50LiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gZ2l2ZSBhIHdyb25nIFxwIHNpemUsIGJ1dCBpdCBtYXkKKyAgICAgICAqIGltcGFpciBwZXJmb3JtYW5jZS4KKyAgICAgICAqCisgICAgICAgKiBcc2EgY29tcHV0ZSgpIGZvciBhbiBleGFtcGxlLgorICAgICAgICovCisgICAgICBleHBsaWNpdCBSZWFsUVooSW5kZXggc2l6ZSA9IFJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljID8gMSA6IFJvd3NBdENvbXBpbGVUaW1lKSA6CisgICAgICAgIG1fUyhzaXplLCBzaXplKSwKKyAgICAgICAgbV9UKHNpemUsIHNpemUpLAorICAgICAgICBtX1Eoc2l6ZSwgc2l6ZSksCisgICAgICAgIG1fWihzaXplLCBzaXplKSwKKyAgICAgICAgbV93b3Jrc3BhY2Uoc2l6ZSoyKSwKKyAgICAgICAgbV9tYXhJdGVycyg0MDApLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgICAgIHsgfQorCisgICAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyByZWFsIFFaIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cmljZXMKKyAgICAgICAqIAorICAgICAgICogXHBhcmFtW2luXSAgQSAgICAgICAgICBNYXRyaXggQS4KKyAgICAgICAqIFxwYXJhbVtpbl0gIEIgICAgICAgICAgTWF0cml4IEIuCisgICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlUVogIElmIGZhbHNlLCBBIGFuZCBaIGFyZSBub3QgY29tcHV0ZWQuCisgICAgICAgKgorICAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgUVogZGVjb21wb3NpdGlvbi4KKyAgICAgICAqLworICAgICAgUmVhbFFaKGNvbnN0IE1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeFR5cGUmIEIsIGJvb2wgY29tcHV0ZVFaID0gdHJ1ZSkgOgorICAgICAgICBtX1MoQS5yb3dzKCksQS5jb2xzKCkpLAorICAgICAgICBtX1QoQS5yb3dzKCksQS5jb2xzKCkpLAorICAgICAgICBtX1EoQS5yb3dzKCksQS5jb2xzKCkpLAorICAgICAgICBtX1ooQS5yb3dzKCksQS5jb2xzKCkpLAorICAgICAgICBtX3dvcmtzcGFjZShBLnJvd3MoKSoyKSwKKyAgICAgICAgbV9tYXhJdGVycyg0MDApLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHsKKyAgICAgICAgICBjb21wdXRlKEEsIEIsIGNvbXB1dGVRWik7CisgICAgICAgIH0KKworICAgICAgLyoqIFxicmllZiBSZXR1cm5zIG1hdHJpeCBRIGluIHRoZSBRWiBkZWNvbXBvc2l0aW9uLiAKKyAgICAgICAqCisgICAgICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IFEuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFEoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlJlYWxRWiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2NvbXB1dGVRWiAmJiAiVGhlIG1hdHJpY2VzIFEgYW5kIFogaGF2ZSBub3QgYmVlbiBjb21wdXRlZCBkdXJpbmcgdGhlIFFaIGRlY29tcG9zaXRpb24uIik7CisgICAgICAgIHJldHVybiBtX1E7CisgICAgICB9CisKKyAgICAgIC8qKiBcYnJpZWYgUmV0dXJucyBtYXRyaXggWiBpbiB0aGUgUVogZGVjb21wb3NpdGlvbi4gCisgICAgICAgKgorICAgICAgICogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBaLgorICAgICAgICovCisgICAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhaKCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsUVogaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICBlaWdlbl9hc3NlcnQobV9jb21wdXRlUVogJiYgIlRoZSBtYXRyaWNlcyBRIGFuZCBaIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgZHVyaW5nIHRoZSBRWiBkZWNvbXBvc2l0aW9uLiIpOworICAgICAgICByZXR1cm4gbV9aOworICAgICAgfQorCisgICAgICAvKiogXGJyaWVmIFJldHVybnMgbWF0cml4IFMgaW4gdGhlIFFaIGRlY29tcG9zaXRpb24uIAorICAgICAgICoKKyAgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggUy4KKyAgICAgICAqLworICAgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4UygpIGNvbnN0IHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUmVhbFFaIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIG1fUzsKKyAgICAgIH0KKworICAgICAgLyoqIFxicmllZiBSZXR1cm5zIG1hdHJpeCBTIGluIHRoZSBRWiBkZWNvbXBvc2l0aW9uLiAKKyAgICAgICAqCisgICAgICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IFMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFQoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlJlYWxRWiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiBtX1Q7CisgICAgICB9CisKKyAgICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgUVogZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguIAorICAgICAgICogCisgICAgICAgKiBccGFyYW1baW5dICBBICAgICAgICAgIE1hdHJpeCBBLgorICAgICAgICogXHBhcmFtW2luXSAgQiAgICAgICAgICBNYXRyaXggQi4KKyAgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVRWiAgSWYgZmFsc2UsIEEgYW5kIFogYXJlIG5vdCBjb21wdXRlZC4KKyAgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgICovCisgICAgICBSZWFsUVomIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4VHlwZSYgQiwgYm9vbCBjb21wdXRlUVogPSB0cnVlKTsKKworICAgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgKgorICAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLCBcYyBOb0NvbnZlcmdlbmNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgICAgeworICAgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsUVogaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gbV9pbmZvOworICAgICAgfQorCisgICAgICAvKiogXGJyaWVmIFJldHVybnMgbnVtYmVyIG9mIHBlcmZvcm1lZCBRUi1saWtlIGl0ZXJhdGlvbnMuCisgICAgICAqLworICAgICAgSW5kZXggaXRlcmF0aW9ucygpIGNvbnN0CisgICAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlJlYWxRWiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiBtX2dsb2JhbF9pdGVyOworICAgICAgfQorCisgICAgICAvKiogU2V0cyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbGxvd2VkIHRvIGNvbnZlcmdlIHRvIG9uZSBlaWdlbnZhbHVlCisgICAgICAgKiBvciBkZWNvdXBsZSB0aGUgcHJvYmxlbS4KKyAgICAgICovCisgICAgICBSZWFsUVomIHNldE1heEl0ZXJhdGlvbnMoSW5kZXggbWF4SXRlcnMpCisgICAgICB7CisgICAgICAgIG1fbWF4SXRlcnMgPSBtYXhJdGVyczsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgTWF0cml4VHlwZSBtX1MsIG1fVCwgbV9RLCBtX1o7CisgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gbV93b3Jrc3BhY2U7CisgICAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgICAgSW5kZXggbV9tYXhJdGVyczsKKyAgICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgICAgYm9vbCBtX2NvbXB1dGVRWjsKKyAgICAgIFNjYWxhciBtX25vcm1PZlQsIG1fbm9ybU9mUzsKKyAgICAgIEluZGV4IG1fZ2xvYmFsX2l0ZXI7CisKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjNzOworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMnM7CisgICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwyPiBNYXRyaXgyczsKKyAgICAgIHR5cGVkZWYgSmFjb2JpUm90YXRpb248U2NhbGFyPiBKUnM7CisKKyAgICAgIHZvaWQgaGVzc2VuYmVyZ1RyaWFuZ3VsYXIoKTsKKyAgICAgIHZvaWQgY29tcHV0ZU5vcm1zKCk7CisgICAgICBJbmRleCBmaW5kU21hbGxTdWJkaWFnRW50cnkoSW5kZXggaXUpOworICAgICAgSW5kZXggZmluZFNtYWxsRGlhZ0VudHJ5KEluZGV4IGYsIEluZGV4IGwpOworICAgICAgdm9pZCBzcGxpdE9mZlR3b1Jvd3MoSW5kZXggaSk7CisgICAgICB2b2lkIHB1c2hEb3duWmVybyhJbmRleCB6LCBJbmRleCBmLCBJbmRleCBsKTsKKyAgICAgIHZvaWQgc3RlcChJbmRleCBmLCBJbmRleCBsLCBJbmRleCBpdGVyKTsKKworICB9OyAvLyBSZWFsUVoKKworICAvKiogXGludGVybmFsIFJlZHVjZXMgUyBhbmQgVCB0byB1cHBlciBIZXNzZW5iZXJnIC0gdHJpYW5ndWxhciBmb3JtICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgdm9pZCBSZWFsUVo8TWF0cml4VHlwZT46Omhlc3NlbmJlcmdUcmlhbmd1bGFyKCkKKyAgICB7CisKKyAgICAgIGNvbnN0IEluZGV4IGRpbSA9IG1fUy5jb2xzKCk7CisKKyAgICAgIC8vIHBlcmZvcm0gUVIgZGVjb21wb3NpdGlvbiBvZiBULCBvdmVyd3JpdGUgVCB3aXRoIFIsIHNhdmUgUQorICAgICAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxclQobV9UKTsKKyAgICAgIG1fVCA9IHFyVC5tYXRyaXhRUigpOworICAgICAgbV9ULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOworICAgICAgbV9RID0gcXJULmhvdXNlaG9sZGVyUSgpOworICAgICAgLy8gb3ZlcndyaXRlIFMgd2l0aCBRKiBTCisgICAgICBtX1MuYXBwbHlPblRoZUxlZnQobV9RLmFkam9pbnQoKSk7CisgICAgICAvLyBpbml0IFogYXMgSWRlbnRpdHkKKyAgICAgIGlmIChtX2NvbXB1dGVRWikKKyAgICAgICAgbV9aID0gTWF0cml4VHlwZTo6SWRlbnRpdHkoZGltLGRpbSk7CisgICAgICAvLyByZWR1Y2UgUyB0byB1cHBlciBIZXNzZW5iZXJnIHdpdGggR2l2ZW5zIHJvdGF0aW9ucworICAgICAgZm9yIChJbmRleCBqPTA7IGo8PWRpbS0zOyBqKyspIHsKKyAgICAgICAgZm9yIChJbmRleCBpPWRpbS0xOyBpPj1qKzI7IGktLSkgeworICAgICAgICAgIEpScyBHOworICAgICAgICAgIC8vIGtpbGwgUyhpLGopCisgICAgICAgICAgaWYobV9TLmNvZWZmKGksaikgIT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBHLm1ha2VHaXZlbnMobV9TLmNvZWZmKGktMSxqKSwgbV9TLmNvZWZmKGksaiksICZtX1MuY29lZmZSZWYoaS0xLCBqKSk7CisgICAgICAgICAgICBtX1MuY29lZmZSZWYoaSxqKSA9IFNjYWxhcigwLjApOworICAgICAgICAgICAgbV9TLnJpZ2h0Q29scyhkaW0tai0xKS5hcHBseU9uVGhlTGVmdChpLTEsaSxHLmFkam9pbnQoKSk7CisgICAgICAgICAgICBtX1QucmlnaHRDb2xzKGRpbS1pKzEpLmFwcGx5T25UaGVMZWZ0KGktMSxpLEcuYWRqb2ludCgpKTsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBRCisgICAgICAgICAgICBpZiAobV9jb21wdXRlUVopCisgICAgICAgICAgICAgIG1fUS5hcHBseU9uVGhlUmlnaHQoaS0xLGksRyk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGtpbGwgVChpLGktMSkKKyAgICAgICAgICBpZihtX1QuY29lZmYoaSxpLTEpIT1TY2FsYXIoMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgRy5tYWtlR2l2ZW5zKG1fVC5jb2VmZihpLGkpLCBtX1QuY29lZmYoaSxpLTEpLCAmbV9ULmNvZWZmUmVmKGksaSkpOworICAgICAgICAgICAgbV9ULmNvZWZmUmVmKGksaS0xKSA9IFNjYWxhcigwLjApOworICAgICAgICAgICAgbV9TLmFwcGx5T25UaGVSaWdodChpLGktMSxHKTsKKyAgICAgICAgICAgIG1fVC50b3BSb3dzKGkpLmFwcGx5T25UaGVSaWdodChpLGktMSxHKTsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBaCisgICAgICAgICAgICBpZiAobV9jb21wdXRlUVopCisgICAgICAgICAgICAgIG1fWi5hcHBseU9uVGhlTGVmdChpLGktMSxHLmFkam9pbnQoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIC8qKiBcaW50ZXJuYWwgQ29tcHV0ZXMgdmVjdG9yIEwxIG5vcm1zIG9mIFMgYW5kIFQgd2hlbiBpbiBIZXNzZW5iZXJnLVRyaWFuZ3VsYXIgZm9ybSBhbHJlYWR5ICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgaW5saW5lIHZvaWQgUmVhbFFaPE1hdHJpeFR5cGU+Ojpjb21wdXRlTm9ybXMoKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IHNpemUgPSBtX1MuY29scygpOworICAgICAgbV9ub3JtT2ZTID0gU2NhbGFyKDAuMCk7CisgICAgICBtX25vcm1PZlQgPSBTY2FsYXIoMC4wKTsKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBzaXplOyArK2opCisgICAgICB7CisgICAgICAgIG1fbm9ybU9mUyArPSBtX1MuY29sKGopLnNlZ21lbnQoMCwgKHN0ZDo6bWluKShzaXplLGorMikpLmN3aXNlQWJzKCkuc3VtKCk7CisgICAgICAgIG1fbm9ybU9mVCArPSBtX1Qucm93KGopLnNlZ21lbnQoaiwgc2l6ZSAtIGopLmN3aXNlQWJzKCkuc3VtKCk7CisgICAgICB9CisgICAgfQorCisKKyAgLyoqIFxpbnRlcm5hbCBMb29rIGZvciBzaW5nbGUgc21hbGwgc3ViLWRpYWdvbmFsIGVsZW1lbnQgUyhyZXMsIHJlcy0xKSBhbmQgcmV0dXJuIHJlcyAob3IgMCkgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBpbmxpbmUgSW5kZXggUmVhbFFaPE1hdHJpeFR5cGU+OjpmaW5kU21hbGxTdWJkaWFnRW50cnkoSW5kZXggaXUpCisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBJbmRleCByZXMgPSBpdTsKKyAgICAgIHdoaWxlIChyZXMgPiAwKQorICAgICAgeworICAgICAgICBTY2FsYXIgcyA9IGFicyhtX1MuY29lZmYocmVzLTEscmVzLTEpKSArIGFicyhtX1MuY29lZmYocmVzLHJlcykpOworICAgICAgICBpZiAocyA9PSBTY2FsYXIoMC4wKSkKKyAgICAgICAgICBzID0gbV9ub3JtT2ZTOworICAgICAgICBpZiAoYWJzKG1fUy5jb2VmZihyZXMscmVzLTEpKSA8IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBzKQorICAgICAgICAgIGJyZWFrOworICAgICAgICByZXMtLTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgIC8qKiBcaW50ZXJuYWwgTG9vayBmb3Igc2luZ2xlIHNtYWxsIGRpYWdvbmFsIGVsZW1lbnQgVChyZXMsIHJlcykgZm9yIHJlcyBiZXR3ZWVuIGYgYW5kIGwsIGFuZCByZXR1cm4gcmVzIChvciBmLTEpICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIGlubGluZSBJbmRleCBSZWFsUVo8TWF0cml4VHlwZT46OmZpbmRTbWFsbERpYWdFbnRyeShJbmRleCBmLCBJbmRleCBsKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YWJzOworICAgICAgSW5kZXggcmVzID0gbDsKKyAgICAgIHdoaWxlIChyZXMgPj0gZikgeworICAgICAgICBpZiAoYWJzKG1fVC5jb2VmZihyZXMscmVzKSkgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIG1fbm9ybU9mVCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVzLS07CisgICAgICB9CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAvKiogXGludGVybmFsIGRlY291cGxlIDJ4MiBkaWFnb25hbCBibG9jayBpbiByb3dzIGksIGkrMSBpZiBlaWdlbnZhbHVlcyBhcmUgcmVhbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIGlubGluZSB2b2lkIFJlYWxRWjxNYXRyaXhUeXBlPjo6c3BsaXRPZmZUd29Sb3dzKEluZGV4IGkpCisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgICBjb25zdCBJbmRleCBkaW09bV9TLmNvbHMoKTsKKyAgICAgIGlmIChhYnMobV9TLmNvZWZmKGkrMSxpKSk9PVNjYWxhcigwKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgSW5kZXggaiA9IGZpbmRTbWFsbERpYWdFbnRyeShpLGkrMSk7CisgICAgICBpZiAoaj09aS0xKQorICAgICAgeworICAgICAgICAvLyBibG9jayBvZiAoUyBUXnstMX0pCisgICAgICAgIE1hdHJpeDJzIFNUaSA9IG1fVC50ZW1wbGF0ZSBibG9jazwyLDI+KGksaSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuCisgICAgICAgICAgdGVtcGxhdGUgc29sdmU8T25UaGVSaWdodD4obV9TLnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxpKSk7CisgICAgICAgIFNjYWxhciBwID0gU2NhbGFyKDAuNSkqKFNUaSgwLDApLVNUaSgxLDEpKTsKKyAgICAgICAgU2NhbGFyIHEgPSBwKnAgKyBTVGkoMSwwKSpTVGkoMCwxKTsKKyAgICAgICAgaWYgKHE+PTApIHsKKyAgICAgICAgICBTY2FsYXIgeiA9IHNxcnQocSk7CisgICAgICAgICAgLy8gb25lIFFSLWxpa2UgaXRlcmF0aW9uIGZvciBBQmkgLSBsYW1iZGEgSQorICAgICAgICAgIC8vIGlzIGVub3VnaCAtIHdoZW4gd2Uga25vdyBleGFjdCBlaWdlbnZhbHVlIGluIGFkdmFuY2UsCisgICAgICAgICAgLy8gY29udmVyZ2VuY2UgaXMgaW1tZWRpYXRlCisgICAgICAgICAgSlJzIEc7CisgICAgICAgICAgaWYgKHA+PTApCisgICAgICAgICAgICBHLm1ha2VHaXZlbnMocCArIHosIFNUaSgxLDApKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBHLm1ha2VHaXZlbnMocCAtIHosIFNUaSgxLDApKTsKKyAgICAgICAgICBtX1MucmlnaHRDb2xzKGRpbS1pKS5hcHBseU9uVGhlTGVmdChpLGkrMSxHLmFkam9pbnQoKSk7CisgICAgICAgICAgbV9ULnJpZ2h0Q29scyhkaW0taSkuYXBwbHlPblRoZUxlZnQoaSxpKzEsRy5hZGpvaW50KCkpOworICAgICAgICAgIC8vIHVwZGF0ZSBRCisgICAgICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICAgICAgbV9RLmFwcGx5T25UaGVSaWdodChpLGkrMSxHKTsKKworICAgICAgICAgIEcubWFrZUdpdmVucyhtX1QuY29lZmYoaSsxLGkrMSksIG1fVC5jb2VmZihpKzEsaSkpOworICAgICAgICAgIG1fUy50b3BSb3dzKGkrMikuYXBwbHlPblRoZVJpZ2h0KGkrMSxpLEcpOworICAgICAgICAgIG1fVC50b3BSb3dzKGkrMikuYXBwbHlPblRoZVJpZ2h0KGkrMSxpLEcpOworICAgICAgICAgIC8vIHVwZGF0ZSBaCisgICAgICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICAgICAgbV9aLmFwcGx5T25UaGVMZWZ0KGkrMSxpLEcuYWRqb2ludCgpKTsKKworICAgICAgICAgIG1fUy5jb2VmZlJlZihpKzEsaSkgPSBTY2FsYXIoMC4wKTsKKyAgICAgICAgICBtX1QuY29lZmZSZWYoaSsxLGkpID0gU2NhbGFyKDAuMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHVzaERvd25aZXJvKGosaSxpKzEpOworICAgICAgfQorICAgIH0KKworICAvKiogXGludGVybmFsIHVzZSB6ZXJvIGluIFQoeix6KSB0byB6ZXJvIFMobCxsLTEpLCB3b3JraW5nIGluIGJsb2NrIGYuLmwgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBpbmxpbmUgdm9pZCBSZWFsUVo8TWF0cml4VHlwZT46OnB1c2hEb3duWmVybyhJbmRleCB6LCBJbmRleCBmLCBJbmRleCBsKQorICAgIHsKKyAgICAgIEpScyBHOworICAgICAgY29uc3QgSW5kZXggZGltID0gbV9TLmNvbHMoKTsKKyAgICAgIGZvciAoSW5kZXggeno9ejsgeno8bDsgenorKykKKyAgICAgIHsKKyAgICAgICAgLy8gcHVzaCAwIGRvd24KKyAgICAgICAgSW5kZXggZmlyc3RDb2xTID0geno+ZiA/ICh6ei0xKSA6IHp6OworICAgICAgICBHLm1ha2VHaXZlbnMobV9ULmNvZWZmKHp6LCB6eisxKSwgbV9ULmNvZWZmKHp6KzEsIHp6KzEpKTsKKyAgICAgICAgbV9TLnJpZ2h0Q29scyhkaW0tZmlyc3RDb2xTKS5hcHBseU9uVGhlTGVmdCh6eix6eisxLEcuYWRqb2ludCgpKTsKKyAgICAgICAgbV9ULnJpZ2h0Q29scyhkaW0tenopLmFwcGx5T25UaGVMZWZ0KHp6LHp6KzEsRy5hZGpvaW50KCkpOworICAgICAgICBtX1QuY29lZmZSZWYoenorMSx6eisxKSA9IFNjYWxhcigwLjApOworICAgICAgICAvLyB1cGRhdGUgUQorICAgICAgICBpZiAobV9jb21wdXRlUVopCisgICAgICAgICAgbV9RLmFwcGx5T25UaGVSaWdodCh6eix6eisxLEcpOworICAgICAgICAvLyBraWxsIFMoenorMSwgenotMSkKKyAgICAgICAgaWYgKHp6PmYpCisgICAgICAgIHsKKyAgICAgICAgICBHLm1ha2VHaXZlbnMobV9TLmNvZWZmKHp6KzEsIHp6KSwgbV9TLmNvZWZmKHp6KzEsenotMSkpOworICAgICAgICAgIG1fUy50b3BSb3dzKHp6KzIpLmFwcGx5T25UaGVSaWdodCh6eiwgenotMSxHKTsKKyAgICAgICAgICBtX1QudG9wUm93cyh6eisxKS5hcHBseU9uVGhlUmlnaHQoenosIHp6LTEsRyk7CisgICAgICAgICAgbV9TLmNvZWZmUmVmKHp6KzEsenotMSkgPSBTY2FsYXIoMC4wKTsKKyAgICAgICAgICAvLyB1cGRhdGUgWgorICAgICAgICAgIGlmIChtX2NvbXB1dGVRWikKKyAgICAgICAgICAgIG1fWi5hcHBseU9uVGhlTGVmdCh6eix6ei0xLEcuYWRqb2ludCgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZmluYWxseSBraWxsIFMobCxsLTEpCisgICAgICBHLm1ha2VHaXZlbnMobV9TLmNvZWZmKGwsbCksIG1fUy5jb2VmZihsLGwtMSkpOworICAgICAgbV9TLmFwcGx5T25UaGVSaWdodChsLGwtMSxHKTsKKyAgICAgIG1fVC5hcHBseU9uVGhlUmlnaHQobCxsLTEsRyk7CisgICAgICBtX1MuY29lZmZSZWYobCxsLTEpPVNjYWxhcigwLjApOworICAgICAgLy8gdXBkYXRlIFoKKyAgICAgIGlmIChtX2NvbXB1dGVRWikKKyAgICAgICAgbV9aLmFwcGx5T25UaGVMZWZ0KGwsbC0xLEcuYWRqb2ludCgpKTsKKyAgICB9CisKKyAgLyoqIFxpbnRlcm5hbCBRUi1saWtlIGl0ZXJhdGl2ZSBzdGVwIGZvciBibG9jayBmLi5sICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgaW5saW5lIHZvaWQgUmVhbFFaPE1hdHJpeFR5cGU+OjpzdGVwKEluZGV4IGYsIEluZGV4IGwsIEluZGV4IGl0ZXIpCisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBjb25zdCBJbmRleCBkaW0gPSBtX1MuY29scygpOworCisgICAgICAvLyB4LCB5LCB6CisgICAgICBTY2FsYXIgeCwgeSwgejsKKyAgICAgIGlmIChpdGVyPT0xMCkKKyAgICAgIHsKKyAgICAgICAgLy8gV2lsa2luc29uIGFkIGhvYyBzaGlmdAorICAgICAgICBjb25zdCBTY2FsYXIKKyAgICAgICAgICBhMTE9bV9TLmNvZWZmKGYrMCxmKzApLCBhMTI9bV9TLmNvZWZmKGYrMCxmKzEpLAorICAgICAgICAgIGEyMT1tX1MuY29lZmYoZisxLGYrMCksIGEyMj1tX1MuY29lZmYoZisxLGYrMSksIGEzMj1tX1MuY29lZmYoZisyLGYrMSksCisgICAgICAgICAgYjEyPW1fVC5jb2VmZihmKzAsZisxKSwKKyAgICAgICAgICBiMTFpPVNjYWxhcigxLjApL21fVC5jb2VmZihmKzAsZiswKSwKKyAgICAgICAgICBiMjJpPVNjYWxhcigxLjApL21fVC5jb2VmZihmKzEsZisxKSwKKyAgICAgICAgICBhODc9bV9TLmNvZWZmKGwtMSxsLTIpLAorICAgICAgICAgIGE5OD1tX1MuY29lZmYobC0wLGwtMSksCisgICAgICAgICAgYjc3aT1TY2FsYXIoMS4wKS9tX1QuY29lZmYobC0yLGwtMiksCisgICAgICAgICAgYjg4aT1TY2FsYXIoMS4wKS9tX1QuY29lZmYobC0xLGwtMSk7CisgICAgICAgIFNjYWxhciBzcyA9IGFicyhhODcqYjc3aSkgKyBhYnMoYTk4KmI4OGkpLAorICAgICAgICAgICAgICAgbHBsID0gU2NhbGFyKDEuNSkqc3MsCisgICAgICAgICAgICAgICBsbCA9IHNzKnNzOworICAgICAgICB4ID0gbGwgKyBhMTEqYTExKmIxMWkqYjExaSAtIGxwbCphMTEqYjExaSArIGExMiphMjEqYjExaSpiMjJpCisgICAgICAgICAgLSBhMTEqYTIxKmIxMipiMTFpKmIxMWkqYjIyaTsKKyAgICAgICAgeSA9IGExMSphMjEqYjExaSpiMTFpIC0gbHBsKmEyMSpiMTFpICsgYTIxKmEyMipiMTFpKmIyMmkgCisgICAgICAgICAgLSBhMjEqYTIxKmIxMipiMTFpKmIxMWkqYjIyaTsKKyAgICAgICAgeiA9IGEyMSphMzIqYjExaSpiMjJpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaXRlcj09MTYpCisgICAgICB7CisgICAgICAgIC8vIGFub3RoZXIgZXhjZXB0aW9uYWwgc2hpZnQKKyAgICAgICAgeCA9IG1fUy5jb2VmZihmLGYpL21fVC5jb2VmZihmLGYpLW1fUy5jb2VmZihsLGwpL21fVC5jb2VmZihsLGwpICsgbV9TLmNvZWZmKGwsbC0xKSptX1QuY29lZmYobC0xLGwpIC8KKyAgICAgICAgICAobV9ULmNvZWZmKGwtMSxsLTEpKm1fVC5jb2VmZihsLGwpKTsKKyAgICAgICAgeSA9IG1fUy5jb2VmZihmKzEsZikvbV9ULmNvZWZmKGYsZik7CisgICAgICAgIHogPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaXRlcj4yMyAmJiAhKGl0ZXIlOCkpCisgICAgICB7CisgICAgICAgIC8vIGV4dHJlbWVseSBleGNlcHRpb25hbCBzaGlmdAorICAgICAgICB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xLjAsMS4wKTsKKyAgICAgICAgeSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMS4wLDEuMCk7CisgICAgICAgIHogPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEuMCwxLjApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBDb21wdXRlIHRoZSBzaGlmdHM6ICh4LHkseiwwLi4uKSA9IChBQl4tMSAtIGwxIEkpIChBQl4tMSAtIGwyIEkpIGUxCisgICAgICAgIC8vIHdoZXJlIGwxIGFuZCBsMiBhcmUgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAyeDIgbWF0cml4IEMgPSBVIFZeLTEgd2hlcmUKKyAgICAgICAgLy8gVSBhbmQgViBhcmUgMngyIGJvdHRvbSByaWdodCBzdWIgbWF0cmljZXMgb2YgQSBhbmQgQi4gVGh1czoKKyAgICAgICAgLy8gID0gQUJeLTFBQl4tMSArIGwxIGwyIEkgLSAobDErbDIpKEFCXi0xKQorICAgICAgICAvLyAgPSBBQl4tMUFCXi0xICsgZGV0KE0pIC0gdHIoTSkoQUJeLTEpCisgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gaGF2aW5nIHgsIHksIHogd2l0aCBhIGNvcnJlY3QgcmF0aW8sIHdlIGhhdmU6CisgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgIGExMSA9IG1fUy5jb2VmZihmLGYpLCAgICAgYTEyID0gbV9TLmNvZWZmKGYsZisxKSwKKyAgICAgICAgICBhMjEgPSBtX1MuY29lZmYoZisxLGYpLCAgIGEyMiA9IG1fUy5jb2VmZihmKzEsZisxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzMiA9IG1fUy5jb2VmZihmKzIsZisxKSwKKworICAgICAgICAgIGE4OCA9IG1fUy5jb2VmZihsLTEsbC0xKSwgYTg5ID0gbV9TLmNvZWZmKGwtMSxsKSwKKyAgICAgICAgICBhOTggPSBtX1MuY29lZmYobCxsLTEpLCAgIGE5OSA9IG1fUy5jb2VmZihsLGwpLAorCisgICAgICAgICAgYjExID0gbV9ULmNvZWZmKGYsZiksICAgICBiMTIgPSBtX1QuY29lZmYoZixmKzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIyID0gbV9ULmNvZWZmKGYrMSxmKzEpLAorCisgICAgICAgICAgYjg4ID0gbV9ULmNvZWZmKGwtMSxsLTEpLCBiODkgPSBtX1QuY29lZmYobC0xLGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjk5ID0gbV9ULmNvZWZmKGwsbCk7CisKKyAgICAgICAgeCA9ICggKGE4OC9iODggLSBhMTEvYjExKSooYTk5L2I5OSAtIGExMS9iMTEpIC0gKGE4OS9iOTkpKihhOTgvYjg4KSArIChhOTgvYjg4KSooYjg5L2I5OSkqKGExMS9iMTEpICkgKiAoYjExL2EyMSkKKyAgICAgICAgICArIGExMi9iMjIgLSAoYTExL2IxMSkqKGIxMi9iMjIpOworICAgICAgICB5ID0gKGEyMi9iMjItYTExL2IxMSkgLSAoYTIxL2IxMSkqKGIxMi9iMjIpIC0gKGE4OC9iODgtYTExL2IxMSkgLSAoYTk5L2I5OS1hMTEvYjExKSArIChhOTgvYjg4KSooYjg5L2I5OSk7CisgICAgICAgIHogPSBhMzIvYjIyOworICAgICAgfQorCisgICAgICBKUnMgRzsKKworICAgICAgZm9yIChJbmRleCBrPWY7IGs8PWwtMjsgaysrKQorICAgICAgeworICAgICAgICAvLyB2YXJpYWJsZXMgZm9yIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zCisgICAgICAgIFZlY3RvcjJzIGVzc2VudGlhbDI7CisgICAgICAgIFNjYWxhciB0YXUsIGJldGE7CisKKyAgICAgICAgVmVjdG9yM3MgaHIoeCx5LHopOworCisgICAgICAgIC8vIFFfayB0byBhbm5paGlsYXRlIFMoaysxLGstMSkgYW5kIFMoaysyLGstMSkKKyAgICAgICAgaHIubWFrZUhvdXNlaG9sZGVySW5QbGFjZSh0YXUsIGJldGEpOworICAgICAgICBlc3NlbnRpYWwyID0gaHIudGVtcGxhdGUgYm90dG9tUm93czwyPigpOworICAgICAgICBJbmRleCBmYz0oc3RkOjptYXgpKGstMSxJbmRleCgwKSk7ICAvLyBmaXJzdCBjb2wgdG8gdXBkYXRlCisgICAgICAgIG1fUy50ZW1wbGF0ZSBtaWRkbGVSb3dzPDM+KGspLnJpZ2h0Q29scyhkaW0tZmMpLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsMiwgdGF1LCBtX3dvcmtzcGFjZS5kYXRhKCkpOworICAgICAgICBtX1QudGVtcGxhdGUgbWlkZGxlUm93czwzPihrKS5yaWdodENvbHMoZGltLWZjKS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KGVzc2VudGlhbDIsIHRhdSwgbV93b3Jrc3BhY2UuZGF0YSgpKTsKKyAgICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICAgIG1fUS50ZW1wbGF0ZSBtaWRkbGVDb2xzPDM+KGspLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzc2VudGlhbDIsIHRhdSwgbV93b3Jrc3BhY2UuZGF0YSgpKTsKKyAgICAgICAgaWYgKGs+ZikKKyAgICAgICAgICBtX1MuY29lZmZSZWYoaysyLGstMSkgPSBtX1MuY29lZmZSZWYoaysxLGstMSkgPSBTY2FsYXIoMC4wKTsKKworICAgICAgICAvLyBaX3trMX0gdG8gYW5uaWhpbGF0ZSBUKGsrMixrKzEpIGFuZCBUKGsrMixrKQorICAgICAgICBociA8PCBtX1QuY29lZmYoaysyLGsrMiksbV9ULmNvZWZmKGsrMixrKSxtX1QuY29lZmYoaysyLGsrMSk7CisgICAgICAgIGhyLm1ha2VIb3VzZWhvbGRlckluUGxhY2UodGF1LCBiZXRhKTsKKyAgICAgICAgZXNzZW50aWFsMiA9IGhyLnRlbXBsYXRlIGJvdHRvbVJvd3M8Mj4oKTsKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGxyID0gKHN0ZDo6bWluKShrKzQsZGltKTsgLy8gbGFzdCByb3cgdG8gdXBkYXRlCisgICAgICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IHRtcChtX3dvcmtzcGFjZS5kYXRhKCksbHIpOworICAgICAgICAgIC8vIFMKKyAgICAgICAgICB0bXAgPSBtX1MudGVtcGxhdGUgbWlkZGxlQ29sczwyPihrKS50b3BSb3dzKGxyKSAqIGVzc2VudGlhbDI7CisgICAgICAgICAgdG1wICs9IG1fUy5jb2woaysyKS5oZWFkKGxyKTsKKyAgICAgICAgICBtX1MuY29sKGsrMikuaGVhZChscikgLT0gdGF1KnRtcDsKKyAgICAgICAgICBtX1MudGVtcGxhdGUgbWlkZGxlQ29sczwyPihrKS50b3BSb3dzKGxyKSAtPSAodGF1KnRtcCkgKiBlc3NlbnRpYWwyLmFkam9pbnQoKTsKKyAgICAgICAgICAvLyBUCisgICAgICAgICAgdG1wID0gbV9ULnRlbXBsYXRlIG1pZGRsZUNvbHM8Mj4oaykudG9wUm93cyhscikgKiBlc3NlbnRpYWwyOworICAgICAgICAgIHRtcCArPSBtX1QuY29sKGsrMikuaGVhZChscik7CisgICAgICAgICAgbV9ULmNvbChrKzIpLmhlYWQobHIpIC09IHRhdSp0bXA7CisgICAgICAgICAgbV9ULnRlbXBsYXRlIG1pZGRsZUNvbHM8Mj4oaykudG9wUm93cyhscikgLT0gKHRhdSp0bXApICogZXNzZW50aWFsMi5hZGpvaW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICB7CisgICAgICAgICAgLy8gWgorICAgICAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gPiB0bXAobV93b3Jrc3BhY2UuZGF0YSgpLGRpbSk7CisgICAgICAgICAgdG1wID0gZXNzZW50aWFsMi5hZGpvaW50KCkqKG1fWi50ZW1wbGF0ZSBtaWRkbGVSb3dzPDI+KGspKTsKKyAgICAgICAgICB0bXAgKz0gbV9aLnJvdyhrKzIpOworICAgICAgICAgIG1fWi5yb3coaysyKSAtPSB0YXUqdG1wOworICAgICAgICAgIG1fWi50ZW1wbGF0ZSBtaWRkbGVSb3dzPDI+KGspIC09IGVzc2VudGlhbDIgKiAodGF1KnRtcCk7CisgICAgICAgIH0KKyAgICAgICAgbV9ULmNvZWZmUmVmKGsrMixrKSA9IG1fVC5jb2VmZlJlZihrKzIsaysxKSA9IFNjYWxhcigwLjApOworCisgICAgICAgIC8vIFpfe2syfSB0byBhbm5paGlsYXRlIFQoaysxLGspCisgICAgICAgIEcubWFrZUdpdmVucyhtX1QuY29lZmYoaysxLGsrMSksIG1fVC5jb2VmZihrKzEsaykpOworICAgICAgICBtX1MuYXBwbHlPblRoZVJpZ2h0KGsrMSxrLEcpOworICAgICAgICBtX1QuYXBwbHlPblRoZVJpZ2h0KGsrMSxrLEcpOworICAgICAgICAvLyB1cGRhdGUgWgorICAgICAgICBpZiAobV9jb21wdXRlUVopCisgICAgICAgICAgbV9aLmFwcGx5T25UaGVMZWZ0KGsrMSxrLEcuYWRqb2ludCgpKTsKKyAgICAgICAgbV9ULmNvZWZmUmVmKGsrMSxrKSA9IFNjYWxhcigwLjApOworCisgICAgICAgIC8vIHVwZGF0ZSB4LHksegorICAgICAgICB4ID0gbV9TLmNvZWZmKGsrMSxrKTsKKyAgICAgICAgeSA9IG1fUy5jb2VmZihrKzIsayk7CisgICAgICAgIGlmIChrIDwgbC0yKQorICAgICAgICAgIHogPSBtX1MuY29lZmYoayszLGspOworICAgICAgfSAvLyBsb29wIG92ZXIgaworCisgICAgICAvLyBRX3tuLTF9IHRvIGFubmloaWxhdGUgeSA9IFMobCxsLTIpCisgICAgICBHLm1ha2VHaXZlbnMoeCx5KTsKKyAgICAgIG1fUy5hcHBseU9uVGhlTGVmdChsLTEsbCxHLmFkam9pbnQoKSk7CisgICAgICBtX1QuYXBwbHlPblRoZUxlZnQobC0xLGwsRy5hZGpvaW50KCkpOworICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICBtX1EuYXBwbHlPblRoZVJpZ2h0KGwtMSxsLEcpOworICAgICAgbV9TLmNvZWZmUmVmKGwsbC0yKSA9IFNjYWxhcigwLjApOworCisgICAgICAvLyBaX3tuLTF9IHRvIGFubmloaWxhdGUgVChsLGwtMSkKKyAgICAgIEcubWFrZUdpdmVucyhtX1QuY29lZmYobCxsKSxtX1QuY29lZmYobCxsLTEpKTsKKyAgICAgIG1fUy5hcHBseU9uVGhlUmlnaHQobCxsLTEsRyk7CisgICAgICBtX1QuYXBwbHlPblRoZVJpZ2h0KGwsbC0xLEcpOworICAgICAgaWYgKG1fY29tcHV0ZVFaKQorICAgICAgICBtX1ouYXBwbHlPblRoZUxlZnQobCxsLTEsRy5hZGpvaW50KCkpOworICAgICAgbV9ULmNvZWZmUmVmKGwsbC0xKSA9IFNjYWxhcigwLjApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIFJlYWxRWjxNYXRyaXhUeXBlPiYgUmVhbFFaPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIEFfaW4sIGNvbnN0IE1hdHJpeFR5cGUmIEJfaW4sIGJvb2wgY29tcHV0ZVFaKQorICAgIHsKKworICAgICAgY29uc3QgSW5kZXggZGltID0gQV9pbi5jb2xzKCk7CisKKyAgICAgIGVpZ2VuX2Fzc2VydCAoQV9pbi5yb3dzKCk9PWRpbSAmJiBBX2luLmNvbHMoKT09ZGltIAorICAgICAgICAgICYmIEJfaW4ucm93cygpPT1kaW0gJiYgQl9pbi5jb2xzKCk9PWRpbSAKKyAgICAgICAgICAmJiAiTmVlZCBzcXVhcmUgbWF0cmljZXMgb2YgdGhlIHNhbWUgZGltZW5zaW9uIik7CisKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICBtX2NvbXB1dGVRWiA9IGNvbXB1dGVRWjsKKyAgICAgIG1fUyA9IEFfaW47IG1fVCA9IEJfaW47CisgICAgICBtX3dvcmtzcGFjZS5yZXNpemUoZGltKjIpOworICAgICAgbV9nbG9iYWxfaXRlciA9IDA7CisKKyAgICAgIC8vIGVudHJhbmNlIHBvaW50OiBoZXNzZW5iZXJnIHRyaWFuZ3VsYXIgZGVjb21wb3NpdGlvbgorICAgICAgaGVzc2VuYmVyZ1RyaWFuZ3VsYXIoKTsKKyAgICAgIC8vIGNvbXB1dGUgTDEgdmVjdG9yIG5vcm1zIG9mIFQsIFMgaW50byBtX25vcm1PZlMsIG1fbm9ybU9mVAorICAgICAgY29tcHV0ZU5vcm1zKCk7CisKKyAgICAgIEluZGV4IGwgPSBkaW0tMSwgCisgICAgICAgICAgICBmLCAKKyAgICAgICAgICAgIGxvY2FsX2l0ZXIgPSAwOworCisgICAgICB3aGlsZSAobD4wICYmIGxvY2FsX2l0ZXI8bV9tYXhJdGVycykKKyAgICAgIHsKKyAgICAgICAgZiA9IGZpbmRTbWFsbFN1YmRpYWdFbnRyeShsKTsKKyAgICAgICAgLy8gbm93IHJvd3MgYW5kIGNvbHVtbnMgZi4ubCAoaW5jbHVkaW5nKSBkZWNvdXBsZSBmcm9tIHRoZSByZXN0IG9mIHRoZSBwcm9ibGVtCisgICAgICAgIGlmIChmPjApIG1fUy5jb2VmZlJlZihmLGYtMSkgPSBTY2FsYXIoMC4wKTsKKyAgICAgICAgaWYgKGYgPT0gbCkgLy8gT25lIHJvb3QgZm91bmQKKyAgICAgICAgeworICAgICAgICAgIGwtLTsKKyAgICAgICAgICBsb2NhbF9pdGVyID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmID09IGwtMSkgLy8gVHdvIHJvb3RzIGZvdW5kCisgICAgICAgIHsKKyAgICAgICAgICBzcGxpdE9mZlR3b1Jvd3MoZik7CisgICAgICAgICAgbCAtPSAyOworICAgICAgICAgIGxvY2FsX2l0ZXIgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gTm8gY29udmVyZ2VuY2UgeWV0CisgICAgICAgIHsKKyAgICAgICAgICAvLyBpZiB0aGVyZSdzIHplcm8gb24gZGlhZ29uYWwgb2YgVCwgd2UgY2FuIGlzb2xhdGUgYW4gZWlnZW52YWx1ZSB3aXRoIEdpdmVucyByb3RhdGlvbnMKKyAgICAgICAgICBJbmRleCB6ID0gZmluZFNtYWxsRGlhZ0VudHJ5KGYsbCk7CisgICAgICAgICAgaWYgKHo+PWYpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gemVybyBmb3VuZAorICAgICAgICAgICAgcHVzaERvd25aZXJvKHosZixsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBzdXJlIG5vdyB0aGF0IFMuYmxvY2soZixmLCBsLWYrMSxsLWYrMSkgaXMgdW5kZXJ1Y2VkIHVwcGVyLUhlc3NlbmJlcmcgCisgICAgICAgICAgICAvLyBhbmQgVC5ibG9jayhmLGYsIGwtZisxLGwtZisxKSBpcyBpbnZlcnRpYmxlIHVwZXItdHJpYW5ndWxhciwgd2hpY2ggYWxsb3dzIHRvCisgICAgICAgICAgICAvLyBhcHBseSBhIFFSLWxpa2UgaXRlcmF0aW9uIHRvIHJvd3MgYW5kIGNvbHVtbnMgZi4ubC4KKyAgICAgICAgICAgIHN0ZXAoZixsLCBsb2NhbF9pdGVyKTsKKyAgICAgICAgICAgIGxvY2FsX2l0ZXIrKzsKKyAgICAgICAgICAgIG1fZ2xvYmFsX2l0ZXIrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIGNoZWNrIGlmIHdlIGNvbnZlcmdlZCBiZWZvcmUgcmVhY2hpbmcgaXRlcmF0aW9ucyBsaW1pdAorICAgICAgbV9pbmZvID0gKGxvY2FsX2l0ZXI8bV9tYXhJdGVycykgPyBTdWNjZXNzIDogTm9Db252ZXJnZW5jZTsKKworICAgICAgLy8gRm9yIGVhY2ggbm9uIHRyaWFuZ3VsYXIgMngyIGRpYWdvbmFsIGJsb2NrIG9mIFMsCisgICAgICAvLyAgICByZWR1Y2UgdGhlIHJlc3BlY3RpdmUgMngyIGRpYWdvbmFsIGJsb2NrIG9mIFQgdG8gcG9zaXRpdmUgZGlhZ29uYWwgZm9ybSB1c2luZyAyeDIgU1ZELgorICAgICAgLy8gVGhpcyBzdGVwIGlzIG5vdCBtYW5kYXRvcnkgZm9yIFFaLCBidXQgaXQgZG9lcyBoZWxwIGZ1cnRoZXIgZXh0cmFjdGlvbiBvZiBlaWdlbnZhbHVlcy9laWdlbnZlY3RvcnMsCisgICAgICAvLyBhbmQgaXMgaW4gcGFyIHdpdGggTGFwYWNrL01hdGxhYiBRWi4KKyAgICAgIGlmKG1faW5mbz09U3VjY2VzcykKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGk9MDsgaTxkaW0tMTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgaWYobV9TLmNvZWZmKGkrMSwgaSkgIT0gU2NhbGFyKDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gal9sZWZ0LCBqX3JpZ2h0OworICAgICAgICAgICAgaW50ZXJuYWw6OnJlYWxfMngyX2phY29iaV9zdmQobV9ULCBpLCBpKzEsICZqX2xlZnQsICZqX3JpZ2h0KTsKKworICAgICAgICAgICAgLy8gQXBwbHkgcmVzdWx0aW5nIEphY29iaSByb3RhdGlvbnMKKyAgICAgICAgICAgIG1fUy5hcHBseU9uVGhlTGVmdChpLGkrMSxqX2xlZnQpOworICAgICAgICAgICAgbV9TLmFwcGx5T25UaGVSaWdodChpLGkrMSxqX3JpZ2h0KTsKKyAgICAgICAgICAgIG1fVC5hcHBseU9uVGhlTGVmdChpLGkrMSxqX2xlZnQpOworICAgICAgICAgICAgbV9ULmFwcGx5T25UaGVSaWdodChpLGkrMSxqX3JpZ2h0KTsKKyAgICAgICAgICAgIG1fVChpKzEsaSkgPSBtX1QoaSxpKzEpID0gU2NhbGFyKDApOworCisgICAgICAgICAgICBpZihtX2NvbXB1dGVRWikgeworICAgICAgICAgICAgICBtX1EuYXBwbHlPblRoZVJpZ2h0KGksaSsxLGpfbGVmdC50cmFuc3Bvc2UoKSk7CisgICAgICAgICAgICAgIG1fWi5hcHBseU9uVGhlTGVmdChpLGkrMSxqX3JpZ2h0LnRyYW5zcG9zZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfSAvLyBlbmQgY29tcHV0ZQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vRUlHRU5fUkVBTF9RWgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1ci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Yzg2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvUmVhbFNjaHVyLmgKQEAgLTAsMCArMSw1NDYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwLDIwMTIgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkVBTF9TQ0hVUl9ICisjZGVmaW5lIEVJR0VOX1JFQUxfU0NIVVJfSAorCisjaW5jbHVkZSAiLi9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBSZWFsU2NodXIKKyAgKgorICAqIFxicmllZiBQZXJmb3JtcyBhIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhIHNxdWFyZSBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAqIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbjsgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZQorICAqIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKgorICAqIEdpdmVuIGEgcmVhbCBzcXVhcmUgbWF0cml4IEEsIHRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIHJlYWwgU2NodXIKKyAgKiBkZWNvbXBvc2l0aW9uOiBcZiQgQSA9IFUgVCBVXlQgXGYkIHdoZXJlIFUgaXMgYSByZWFsIG9ydGhvZ29uYWwgbWF0cml4IGFuZAorICAqIFQgaXMgYSByZWFsIHF1YXNpLXRyaWFuZ3VsYXIgbWF0cml4LiBBbiBvcnRob2dvbmFsIG1hdHJpeCBpcyBhIG1hdHJpeCB3aG9zZQorICAqIGludmVyc2UgaXMgZXF1YWwgdG8gaXRzIHRyYW5zcG9zZSwgXGYkIFVeey0xfSA9IFVeVCBcZiQuIEEgcXVhc2ktdHJpYW5ndWxhcgorICAqIG1hdHJpeCBpcyBhIGJsb2NrLXRyaWFuZ3VsYXIgbWF0cml4IHdob3NlIGRpYWdvbmFsIGNvbnNpc3RzIG9mIDEtYnktMQorICAqIGJsb2NrcyBhbmQgMi1ieS0yIGJsb2NrcyB3aXRoIGNvbXBsZXggZWlnZW52YWx1ZXMuIFRoZSBlaWdlbnZhbHVlcyBvZiB0aGUKKyAgKiBibG9ja3Mgb24gdGhlIGRpYWdvbmFsIG9mIFQgYXJlIHRoZSBzYW1lIGFzIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgbWF0cml4CisgICogQSwgYW5kIHRodXMgdGhlIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB1c2VkIGluIEVpZ2VuU29sdmVyIHRvIGNvbXB1dGUKKyAgKiB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhCisgICogZ2l2ZW4gbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgUmVhbFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKQorICAqIGNvbnN0cnVjdG9yIHdoaWNoIGNvbXB1dGVzIHRoZSByZWFsIFNjaHVyIGRlY29tcG9zaXRpb24gYXQgY29uc3RydWN0aW9uCisgICogdGltZS4gT25jZSB0aGUgZGVjb21wb3NpdGlvbiBpcyBjb21wdXRlZCwgeW91IGNhbiB1c2UgdGhlIG1hdHJpeFUoKSBhbmQKKyAgKiBtYXRyaXhUKCkgZnVuY3Rpb25zIHRvIHJldHJpZXZlIHRoZSBtYXRyaWNlcyBVIGFuZCBUIGluIHRoZSBkZWNvbXBvc2l0aW9uLgorICAqCisgICogVGhlIGRvY3VtZW50YXRpb24gb2YgUmVhbFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBjb250YWlucyBhbiBleGFtcGxlCisgICogb2YgdGhlIHR5cGljYWwgdXNlIG9mIHRoaXMgY2xhc3MuCisgICoKKyAgKiBcbm90ZSBUaGUgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tCisgICogPGEgaHJlZj0iaHR0cDovL21hdGgubmlzdC5nb3YvamF2YW51bWVyaWNzL2phbWEvIj5KQU1BPC9hPiAocHVibGljIGRvbWFpbikuCisgICogVGhlaXIgY29kZSBpcyBiYXNlZCBvbiBFSVNQQUNLLgorICAqCisgICogXHNhIGNsYXNzIENvbXBsZXhTY2h1ciwgY2xhc3MgRWlnZW5Tb2x2ZXIsIGNsYXNzIENvbXBsZXhFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIFJlYWxTY2h1cgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWw+IENvbXBsZXhTY2FsYXI7CisgICAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisKKyAgICB0eXBlZGVmIE1hdHJpeDxDb21wbGV4U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgMSwgT3B0aW9ucyAmIH5Sb3dNYWpvciwgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIDE+IEVpZ2VudmFsdWVUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBDb2x1bW5WZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSBzaXplICBQb3NpdGl2ZSBpbnRlZ2VyLCBzaXplIG9mIHRoZSBtYXRyaXggd2hvc2UgU2NodXIgZGVjb21wb3NpdGlvbiB3aWxsIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuICBUaGUgXHAgc2l6ZSBwYXJhbWV0ZXIgaXMgb25seQorICAgICAgKiB1c2VkIGFzIGEgaGludC4gSXQgaXMgbm90IGFuIGVycm9yIHRvIGdpdmUgYSB3cm9uZyBccCBzaXplLCBidXQgaXQgbWF5CisgICAgICAqIGltcGFpciBwZXJmb3JtYW5jZS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKSBmb3IgYW4gZXhhbXBsZS4KKyAgICAgICovCisgICAgZXhwbGljaXQgUmVhbFNjaHVyKEluZGV4IHNpemUgPSBSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyA/IDEgOiBSb3dzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgIDogbV9tYXRUKHNpemUsIHNpemUpLAorICAgICAgICAgICAgICBtX21hdFUoc2l6ZSwgc2l6ZSksCisgICAgICAgICAgICAgIG1fd29ya3NwYWNlVmVjdG9yKHNpemUpLAorICAgICAgICAgICAgICBtX2hlc3Moc2l6ZSksCisgICAgICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF0VWlzVXB0b2RhdGUoZmFsc2UpLAorICAgICAgICAgICAgICBtX21heEl0ZXJzKC0xKQorICAgIHsgfQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggICAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUmVhbFNjaHVyX1JlYWxTY2h1cl9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBSZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBSZWFsU2NodXIoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCwgYm9vbCBjb21wdXRlVSA9IHRydWUpCisgICAgICAgICAgICA6IG1fbWF0VChtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpLAorICAgICAgICAgICAgICBtX21hdFUobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgbV93b3Jrc3BhY2VWZWN0b3IobWF0cml4LnJvd3MoKSksCisgICAgICAgICAgICAgIG1faGVzcyhtYXRyaXgucm93cygpKSwKKyAgICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9tYXRVaXNVcHRvZGF0ZShmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF4SXRlcnMoLTEpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBjb21wdXRlVSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBvcnRob2dvbmFsIG1hdHJpeCBpbiB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4gCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggVS4KKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFJlYWxTY2h1cihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgb3IgdGhlCisgICAgICAqIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXgsIGFuZCBccCBjb21wdXRlVSB3YXMgc2V0CisgICAgICAqIHRvIHRydWUgKHRoZSBkZWZhdWx0IHZhbHVlKS4KKyAgICAgICoKKyAgICAgICogXHNhIFJlYWxTY2h1cihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgZm9yIGFuIGV4YW1wbGUKKyAgICAgICovCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUmVhbFNjaHVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX21hdFVpc1VwdG9kYXRlICYmICJUaGUgbWF0cml4IFUgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIGR1cmluZyB0aGUgUmVhbFNjaHVyIGRlY29tcG9zaXRpb24uIik7CisgICAgICByZXR1cm4gbV9tYXRVOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgcXVhc2ktdHJpYW5ndWxhciBtYXRyaXggaW4gdGhlIFNjaHVyIGRlY29tcG9zaXRpb24uIAorICAgICAgKgorICAgICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IFQuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBSZWFsU2NodXIoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIG9yIHRoZQorICAgICAgKiBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBcc2EgUmVhbFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBmb3IgYW4gZXhhbXBsZQorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhUKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsU2NodXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbWF0VDsKKyAgICB9CisgIAorICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguIAorICAgICAgKiAKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICAgIFNxdWFyZSBtYXRyaXggd2hvc2UgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICogXHBhcmFtW2luXSAgY29tcHV0ZVUgIElmIHRydWUsIGJvdGggVCBhbmQgVSBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IFQgaXMgY29tcHV0ZWQuCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGUgU2NodXIgZGVjb21wb3NpdGlvbiBpcyBjb21wdXRlZCBieSBmaXJzdCByZWR1Y2luZyB0aGUgbWF0cml4IHRvCisgICAgICAqIEhlc3NlbmJlcmcgZm9ybSB1c2luZyB0aGUgY2xhc3MgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24uIFRoZSBIZXNzZW5iZXJnCisgICAgICAqIG1hdHJpeCBpcyB0aGVuIHJlZHVjZWQgdG8gdHJpYW5ndWxhciBmb3JtIGJ5IHBlcmZvcm1pbmcgRnJhbmNpcyBRUgorICAgICAgKiBpdGVyYXRpb25zIHdpdGggaW1wbGljaXQgZG91YmxlIHNoaWZ0LiBUaGUgY29zdCBvZiBjb21wdXRpbmcgdGhlIFNjaHVyCisgICAgICAqIGRlY29tcG9zaXRpb24gZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnM7IGFzIGEgcm91Z2ggZ3VpZGUsIGl0CisgICAgICAqIG1heSBiZSB0YWtlbiB0byBiZSBcZiQyNW5eM1xmJCBmbG9wcyBpZiBcYSBjb21wdXRlVSBpcyB0cnVlIGFuZAorICAgICAgKiBcZiQxMG5eM1xmJCBmbG9wcyBpZiBcYSBjb21wdXRlVSBpcyBmYWxzZS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUmVhbFNjaHVyX2NvbXB1dGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFJlYWxTY2h1cl9jb21wdXRlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCwgSW5kZXgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBSZWFsU2NodXImIGNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCwgYm9vbCBjb21wdXRlVSA9IHRydWUpOworCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEgSGVzc2VuYmVyZyBtYXRyaXggSCA9IFogVCBaXlQKKyAgICAgKiAgXHBhcmFtW2luXSBtYXRyaXhIIE1hdHJpeCBpbiBIZXNzZW5iZXJnIGZvcm0gSAorICAgICAqICBccGFyYW1baW5dIG1hdHJpeFEgb3J0aG9nb25hbCBtYXRyaXggUSB0aGF0IHRyYW5zZm9ybSBhIG1hdHJpeCBBIHRvIEggOiBBID0gUSBIIFFeVAorICAgICAqICBccGFyYW0gY29tcHV0ZVUgQ29tcHV0ZXMgdGhlIG1hdHJpWCBVIG9mIHRoZSBTY2h1ciB2ZWN0b3JzCisgICAgICogXHJldHVybiBSZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgKiAKKyAgICAgKiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgbWF0cml4IGlzIGFscmVhZHkgcmVkdWNlZCBpbiBIZXNzZW5iZXJnIGZvcm0gbWF0cml4SAorICAgICAqICB1c2luZyBlaXRoZXIgdGhlIGNsYXNzIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uIG9yIGFub3RoZXIgbWVhbi4gCisgICAgICogIEl0IGNvbXB1dGVzIHRoZSB1cHBlciBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCBUIG9mIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIEgKKyAgICAgKiAgV2hlbiBjb21wdXRlVSBpcyB0cnVlLCB0aGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIG1hdHJpeCBVIHN1Y2ggdGhhdCAKKyAgICAgKiAgQSA9IFUgVCBVXlQgPSAgKFFaKSBUIChRWileVCA9IFEgSCBRXlQgd2hlcmUgQSBpcyB0aGUgaW5pdGlhbCBtYXRyaXgKKyAgICAgKiAKKyAgICAgKiBOT1RFIFEgaXMgcmVmZXJlbmNlZCBpZiBjb21wdXRlVSBpcyB0cnVlOyBzbywgaWYgdGhlIGluaXRpYWwgb3J0aG9nb25hbCBtYXRyaXgKKyAgICAgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGUgdXNlciBzaG91bGQgZ2l2ZSBhbiBpZGVudGl0eSBtYXRyaXggKFEuc2V0SWRlbnRpdHkoKSkKKyAgICAgKiAKKyAgICAgKiBcc2EgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZXNzTWF0cml4VHlwZSwgdHlwZW5hbWUgT3J0aE1hdHJpeFR5cGU+CisgICAgUmVhbFNjaHVyJiBjb21wdXRlRnJvbUhlc3NlbmJlcmcoY29uc3QgSGVzc01hdHJpeFR5cGUmIG1hdHJpeEgsIGNvbnN0IE9ydGhNYXRyaXhUeXBlJiBtYXRyaXhRLCAgYm9vbCBjb21wdXRlVSk7CisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwgXGMgTm9Db252ZXJnZW5jZSBvdGhlcndpc2UuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsU2NodXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWxsb3dlZC4gCisgICAgICAqCisgICAgICAqIElmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIG1fbWF4SXRlcmF0aW9uc1BlclJvdyB0aW1lcyB0aGUgc2l6ZQorICAgICAgKiBvZiB0aGUgbWF0cml4LgorICAgICAgKi8KKyAgICBSZWFsU2NodXImIHNldE1heEl0ZXJhdGlvbnMoSW5kZXggbWF4SXRlcnMpCisgICAgeworICAgICAgbV9tYXhJdGVycyA9IG1heEl0ZXJzOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucy4gKi8KKyAgICBJbmRleCBnZXRNYXhJdGVyYXRpb25zKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXhJdGVyczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyIHJvdy4KKyAgICAgICoKKyAgICAgICogSWYgbm90IG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIHRoaXMgbnVtYmVyIHRpbWVzIHRoZSBzaXplIG9mIHRoZQorICAgICAgKiBtYXRyaXguIEl0IGlzIGN1cnJlbnRseSBzZXQgdG8gNDAuCisgICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgbV9tYXhJdGVyYXRpb25zUGVyUm93ID0gNDA7CisKKyAgcHJpdmF0ZToKKyAgICAKKyAgICBNYXRyaXhUeXBlIG1fbWF0VDsKKyAgICBNYXRyaXhUeXBlIG1fbWF0VTsKKyAgICBDb2x1bW5WZWN0b3JUeXBlIG1fd29ya3NwYWNlVmVjdG9yOworICAgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IG1faGVzczsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9tYXRVaXNVcHRvZGF0ZTsKKyAgICBJbmRleCBtX21heEl0ZXJzOworCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yM3M7CisKKyAgICBTY2FsYXIgY29tcHV0ZU5vcm1PZlQoKTsKKyAgICBJbmRleCBmaW5kU21hbGxTdWJkaWFnRW50cnkoSW5kZXggaXUpOworICAgIHZvaWQgc3BsaXRPZmZUd29Sb3dzKEluZGV4IGl1LCBib29sIGNvbXB1dGVVLCBjb25zdCBTY2FsYXImIGV4c2hpZnQpOworICAgIHZvaWQgY29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyLCBTY2FsYXImIGV4c2hpZnQsIFZlY3RvcjNzJiBzaGlmdEluZm8pOworICAgIHZvaWQgaW5pdEZyYW5jaXNRUlN0ZXAoSW5kZXggaWwsIEluZGV4IGl1LCBjb25zdCBWZWN0b3IzcyYgc2hpZnRJbmZvLCBJbmRleCYgaW0sIFZlY3RvcjNzJiBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yKTsKKyAgICB2b2lkIHBlcmZvcm1GcmFuY2lzUVJTdGVwKEluZGV4IGlsLCBJbmRleCBpbSwgSW5kZXggaXUsIGJvb2wgY29tcHV0ZVUsIGNvbnN0IFZlY3RvcjNzJiBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yLCBTY2FsYXIqIHdvcmtzcGFjZSk7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CitSZWFsU2NodXI8TWF0cml4VHlwZT4mIFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVVKQoreworICBjb25zdCBTY2FsYXIgY29uc2lkZXJBc1plcm8gPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CisKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisgIEluZGV4IG1heEl0ZXJzID0gbV9tYXhJdGVyczsKKyAgaWYgKG1heEl0ZXJzID09IC0xKQorICAgIG1heEl0ZXJzID0gbV9tYXhJdGVyYXRpb25zUGVyUm93ICogbWF0cml4LnJvd3MoKTsKKworICBTY2FsYXIgc2NhbGUgPSBtYXRyaXguZGVyaXZlZCgpLmN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgaWYoc2NhbGU8Y29uc2lkZXJBc1plcm8pCisgIHsKKyAgICBtX21hdFQuc2V0WmVybyhtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpOworICAgIGlmKGNvbXB1dGVVKQorICAgICAgbV9tYXRVLnNldElkZW50aXR5KG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSk7CisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBTdGVwIDEuIFJlZHVjZSB0byBIZXNzZW5iZXJnIGZvcm0KKyAgbV9oZXNzLmNvbXB1dGUobWF0cml4LmRlcml2ZWQoKS9zY2FsZSk7CisKKyAgLy8gU3RlcCAyLiBSZWR1Y2UgdG8gcmVhbCBTY2h1ciBmb3JtICAKKyAgY29tcHV0ZUZyb21IZXNzZW5iZXJnKG1faGVzcy5tYXRyaXhIKCksIG1faGVzcy5tYXRyaXhRKCksIGNvbXB1dGVVKTsKKworICBtX21hdFQgKj0gc2NhbGU7CisgIAorICByZXR1cm4gKnRoaXM7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSGVzc01hdHJpeFR5cGUsIHR5cGVuYW1lIE9ydGhNYXRyaXhUeXBlPgorUmVhbFNjaHVyPE1hdHJpeFR5cGU+JiBSZWFsU2NodXI8TWF0cml4VHlwZT46OmNvbXB1dGVGcm9tSGVzc2VuYmVyZyhjb25zdCBIZXNzTWF0cml4VHlwZSYgbWF0cml4SCwgY29uc3QgT3J0aE1hdHJpeFR5cGUmIG1hdHJpeFEsICBib29sIGNvbXB1dGVVKQoreworICB1c2luZyBzdGQ6OmFiczsKKworICBtX21hdFQgPSBtYXRyaXhIOworICBpZihjb21wdXRlVSkKKyAgICBtX21hdFUgPSBtYXRyaXhROworICAKKyAgSW5kZXggbWF4SXRlcnMgPSBtX21heEl0ZXJzOworICBpZiAobWF4SXRlcnMgPT0gLTEpCisgICAgbWF4SXRlcnMgPSBtX21heEl0ZXJhdGlvbnNQZXJSb3cgKiBtYXRyaXhILnJvd3MoKTsKKyAgbV93b3Jrc3BhY2VWZWN0b3IucmVzaXplKG1fbWF0VC5jb2xzKCkpOworICBTY2FsYXIqIHdvcmtzcGFjZSA9ICZtX3dvcmtzcGFjZVZlY3Rvci5jb2VmZlJlZigwKTsKKworICAvLyBUaGUgbWF0cml4IG1fbWF0VCBpcyBkaXZpZGVkIGluIHRocmVlIHBhcnRzLiAKKyAgLy8gUm93cyAwLC4uLixpbC0xIGFyZSBkZWNvdXBsZWQgZnJvbSB0aGUgcmVzdCBiZWNhdXNlIG1fbWF0VChpbCxpbC0xKSBpcyB6ZXJvLiAKKyAgLy8gUm93cyBpbCwuLi4saXUgaXMgdGhlIHBhcnQgd2UgYXJlIHdvcmtpbmcgb24gKHRoZSBhY3RpdmUgd2luZG93KS4KKyAgLy8gUm93cyBpdSsxLC4uLixlbmQgYXJlIGFscmVhZHkgYnJvdWdodCBpbiB0cmlhbmd1bGFyIGZvcm0uCisgIEluZGV4IGl1ID0gbV9tYXRULmNvbHMoKSAtIDE7CisgIEluZGV4IGl0ZXIgPSAwOyAgICAgIC8vIGl0ZXJhdGlvbiBjb3VudCBmb3IgY3VycmVudCBlaWdlbnZhbHVlCisgIEluZGV4IHRvdGFsSXRlciA9IDA7IC8vIGl0ZXJhdGlvbiBjb3VudCBmb3Igd2hvbGUgbWF0cml4CisgIFNjYWxhciBleHNoaWZ0KDApOyAgIC8vIHN1bSBvZiBleGNlcHRpb25hbCBzaGlmdHMKKyAgU2NhbGFyIG5vcm0gPSBjb21wdXRlTm9ybU9mVCgpOworCisgIGlmKG5vcm0hPTApCisgIHsKKyAgICB3aGlsZSAoaXUgPj0gMCkKKyAgICB7CisgICAgICBJbmRleCBpbCA9IGZpbmRTbWFsbFN1YmRpYWdFbnRyeShpdSk7CisKKyAgICAgIC8vIENoZWNrIGZvciBjb252ZXJnZW5jZQorICAgICAgaWYgKGlsID09IGl1KSAvLyBPbmUgcm9vdCBmb3VuZAorICAgICAgeworICAgICAgICBtX21hdFQuY29lZmZSZWYoaXUsaXUpID0gbV9tYXRULmNvZWZmKGl1LGl1KSArIGV4c2hpZnQ7CisgICAgICAgIGlmIChpdSA+IDApCisgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGl1LCBpdS0xKSA9IFNjYWxhcigwKTsKKyAgICAgICAgaXUtLTsKKyAgICAgICAgaXRlciA9IDA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbCA9PSBpdS0xKSAvLyBUd28gcm9vdHMgZm91bmQKKyAgICAgIHsKKyAgICAgICAgc3BsaXRPZmZUd29Sb3dzKGl1LCBjb21wdXRlVSwgZXhzaGlmdCk7CisgICAgICAgIGl1IC09IDI7CisgICAgICAgIGl0ZXIgPSAwOworICAgICAgfQorICAgICAgZWxzZSAvLyBObyBjb252ZXJnZW5jZSB5ZXQKKyAgICAgIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IgdmVjdG9yIGhhcyB0byBiZSBpbml0aWFsaXplZCB0byBzb21ldGhpbmcgdG8gZ2V0IHJpZCBvZiBhIHNpbGx5IEdDQyB3YXJuaW5nICgtTzEgLVdhbGwgLUROREVCVUcgKQorICAgICAgICBWZWN0b3IzcyBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yKDAsMCwwKSwgc2hpZnRJbmZvOworICAgICAgICBjb21wdXRlU2hpZnQoaXUsIGl0ZXIsIGV4c2hpZnQsIHNoaWZ0SW5mbyk7CisgICAgICAgIGl0ZXIgPSBpdGVyICsgMTsKKyAgICAgICAgdG90YWxJdGVyID0gdG90YWxJdGVyICsgMTsKKyAgICAgICAgaWYgKHRvdGFsSXRlciA+IG1heEl0ZXJzKSBicmVhazsKKyAgICAgICAgSW5kZXggaW07CisgICAgICAgIGluaXRGcmFuY2lzUVJTdGVwKGlsLCBpdSwgc2hpZnRJbmZvLCBpbSwgZmlyc3RIb3VzZWhvbGRlclZlY3Rvcik7CisgICAgICAgIHBlcmZvcm1GcmFuY2lzUVJTdGVwKGlsLCBpbSwgaXUsIGNvbXB1dGVVLCBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yLCB3b3Jrc3BhY2UpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZih0b3RhbEl0ZXIgPD0gbWF4SXRlcnMpCisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgZWxzZQorICAgIG1faW5mbyA9IE5vQ29udmVyZ2VuY2U7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGNvbXB1dGVVOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBcaW50ZXJuYWwgQ29tcHV0ZXMgYW5kIHJldHVybnMgdmVjdG9yIEwxIG5vcm0gb2YgVCAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgUmVhbFNjaHVyPE1hdHJpeFR5cGU+Ojpjb21wdXRlTm9ybU9mVCgpCit7CisgIGNvbnN0IEluZGV4IHNpemUgPSBtX21hdFQuY29scygpOworICAvLyBGSVhNRSB0byBiZSBlZmZpY2llbnQgdGhlIGZvbGxvd2luZyB3b3VsZCByZXF1aXJlcyBhIHRyaWFuZ3VsYXIgcmVkdXhpb24gY29kZQorICAvLyBTY2FsYXIgbm9ybSA9IG1fbWF0VC51cHBlcigpLmN3aXNlQWJzKCkuc3VtKCkgCisgIC8vICAgICAgICAgICAgICAgKyBtX21hdFQuYm90dG9tTGVmdENvcm5lcihzaXplLTEsc2l6ZS0xKS5kaWFnb25hbCgpLmN3aXNlQWJzKCkuc3VtKCk7CisgIFNjYWxhciBub3JtKDApOworICBmb3IgKEluZGV4IGogPSAwOyBqIDwgc2l6ZTsgKytqKQorICAgIG5vcm0gKz0gbV9tYXRULmNvbChqKS5zZWdtZW50KDAsIChzdGQ6Om1pbikoc2l6ZSxqKzIpKS5jd2lzZUFicygpLnN1bSgpOworICByZXR1cm4gbm9ybTsKK30KKworLyoqIFxpbnRlcm5hbCBMb29rIGZvciBzaW5nbGUgc21hbGwgc3ViLWRpYWdvbmFsIGVsZW1lbnQgYW5kIHJldHVybnMgaXRzIGluZGV4ICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIEluZGV4IFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6ZmluZFNtYWxsU3ViZGlhZ0VudHJ5KEluZGV4IGl1KQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgSW5kZXggcmVzID0gaXU7CisgIHdoaWxlIChyZXMgPiAwKQorICB7CisgICAgU2NhbGFyIHMgPSBhYnMobV9tYXRULmNvZWZmKHJlcy0xLHJlcy0xKSkgKyBhYnMobV9tYXRULmNvZWZmKHJlcyxyZXMpKTsKKyAgICBpZiAoYWJzKG1fbWF0VC5jb2VmZihyZXMscmVzLTEpKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogcykKKyAgICAgIGJyZWFrOworICAgIHJlcy0tOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qKiBcaW50ZXJuYWwgVXBkYXRlIFQgZ2l2ZW4gdGhhdCByb3dzIGl1LTEgYW5kIGl1IGRlY291cGxlIGZyb20gdGhlIHJlc3QuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHZvaWQgUmVhbFNjaHVyPE1hdHJpeFR5cGU+OjpzcGxpdE9mZlR3b1Jvd3MoSW5kZXggaXUsIGJvb2wgY29tcHV0ZVUsIGNvbnN0IFNjYWxhciYgZXhzaGlmdCkKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0VC5jb2xzKCk7CisKKyAgLy8gVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAyeDIgbWF0cml4IFthIGI7IGMgZF0gYXJlIAorICAvLyB0cmFjZSArLy0gc3FydChkaXNjci80KSB3aGVyZSBkaXNjciA9IHRyXjIgLSA0KmRldCwgdHIgPSBhICsgZCwgZGV0ID0gYWQgLSBiYworICBTY2FsYXIgcCA9IFNjYWxhcigwLjUpICogKG1fbWF0VC5jb2VmZihpdS0xLGl1LTEpIC0gbV9tYXRULmNvZWZmKGl1LGl1KSk7CisgIFNjYWxhciBxID0gcCAqIHAgKyBtX21hdFQuY29lZmYoaXUsaXUtMSkgKiBtX21hdFQuY29lZmYoaXUtMSxpdSk7ICAgLy8gcSA9IHRyXjIgLyA0IC0gZGV0ID0gZGlzY3IvNAorICBtX21hdFQuY29lZmZSZWYoaXUsaXUpICs9IGV4c2hpZnQ7CisgIG1fbWF0VC5jb2VmZlJlZihpdS0xLGl1LTEpICs9IGV4c2hpZnQ7CisKKyAgaWYgKHEgPj0gU2NhbGFyKDApKSAvLyBUd28gcmVhbCBlaWdlbnZhbHVlcworICB7CisgICAgU2NhbGFyIHogPSBzcXJ0KGFicyhxKSk7CisgICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiByb3Q7CisgICAgaWYgKHAgPj0gU2NhbGFyKDApKQorICAgICAgcm90Lm1ha2VHaXZlbnMocCArIHosIG1fbWF0VC5jb2VmZihpdSwgaXUtMSkpOworICAgIGVsc2UKKyAgICAgIHJvdC5tYWtlR2l2ZW5zKHAgLSB6LCBtX21hdFQuY29lZmYoaXUsIGl1LTEpKTsKKworICAgIG1fbWF0VC5yaWdodENvbHMoc2l6ZS1pdSsxKS5hcHBseU9uVGhlTGVmdChpdS0xLCBpdSwgcm90LmFkam9pbnQoKSk7CisgICAgbV9tYXRULnRvcFJvd3MoaXUrMSkuYXBwbHlPblRoZVJpZ2h0KGl1LTEsIGl1LCByb3QpOworICAgIG1fbWF0VC5jb2VmZlJlZihpdSwgaXUtMSkgPSBTY2FsYXIoMCk7IAorICAgIGlmIChjb21wdXRlVSkKKyAgICAgIG1fbWF0VS5hcHBseU9uVGhlUmlnaHQoaXUtMSwgaXUsIHJvdCk7CisgIH0KKworICBpZiAoaXUgPiAxKSAKKyAgICBtX21hdFQuY29lZmZSZWYoaXUtMSwgaXUtMikgPSBTY2FsYXIoMCk7Cit9CisKKy8qKiBcaW50ZXJuYWwgRm9ybSBzaGlmdCBpbiBzaGlmdEluZm8sIGFuZCB1cGRhdGUgZXhzaGlmdCBpZiBhbiBleGNlcHRpb25hbCBzaGlmdCBpcyBwZXJmb3JtZWQuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHZvaWQgUmVhbFNjaHVyPE1hdHJpeFR5cGU+Ojpjb21wdXRlU2hpZnQoSW5kZXggaXUsIEluZGV4IGl0ZXIsIFNjYWxhciYgZXhzaGlmdCwgVmVjdG9yM3MmIHNoaWZ0SW5mbykKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgc2hpZnRJbmZvLmNvZWZmUmVmKDApID0gbV9tYXRULmNvZWZmKGl1LGl1KTsKKyAgc2hpZnRJbmZvLmNvZWZmUmVmKDEpID0gbV9tYXRULmNvZWZmKGl1LTEsaXUtMSk7CisgIHNoaWZ0SW5mby5jb2VmZlJlZigyKSA9IG1fbWF0VC5jb2VmZihpdSxpdS0xKSAqIG1fbWF0VC5jb2VmZihpdS0xLGl1KTsKKworICAvLyBXaWxraW5zb24ncyBvcmlnaW5hbCBhZCBob2Mgc2hpZnQKKyAgaWYgKGl0ZXIgPT0gMTApCisgIHsKKyAgICBleHNoaWZ0ICs9IHNoaWZ0SW5mby5jb2VmZigwKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDw9IGl1OyArK2kpCisgICAgICBtX21hdFQuY29lZmZSZWYoaSxpKSAtPSBzaGlmdEluZm8uY29lZmYoMCk7CisgICAgU2NhbGFyIHMgPSBhYnMobV9tYXRULmNvZWZmKGl1LGl1LTEpKSArIGFicyhtX21hdFQuY29lZmYoaXUtMSxpdS0yKSk7CisgICAgc2hpZnRJbmZvLmNvZWZmUmVmKDApID0gU2NhbGFyKDAuNzUpICogczsKKyAgICBzaGlmdEluZm8uY29lZmZSZWYoMSkgPSBTY2FsYXIoMC43NSkgKiBzOworICAgIHNoaWZ0SW5mby5jb2VmZlJlZigyKSA9IFNjYWxhcigtMC40Mzc1KSAqIHMgKiBzOworICB9CisKKyAgLy8gTUFUTEFCJ3MgbmV3IGFkIGhvYyBzaGlmdAorICBpZiAoaXRlciA9PSAzMCkKKyAgeworICAgIFNjYWxhciBzID0gKHNoaWZ0SW5mby5jb2VmZigxKSAtIHNoaWZ0SW5mby5jb2VmZigwKSkgLyBTY2FsYXIoMi4wKTsKKyAgICBzID0gcyAqIHMgKyBzaGlmdEluZm8uY29lZmYoMik7CisgICAgaWYgKHMgPiBTY2FsYXIoMCkpCisgICAgeworICAgICAgcyA9IHNxcnQocyk7CisgICAgICBpZiAoc2hpZnRJbmZvLmNvZWZmKDEpIDwgc2hpZnRJbmZvLmNvZWZmKDApKQorICAgICAgICBzID0gLXM7CisgICAgICBzID0gcyArIChzaGlmdEluZm8uY29lZmYoMSkgLSBzaGlmdEluZm8uY29lZmYoMCkpIC8gU2NhbGFyKDIuMCk7CisgICAgICBzID0gc2hpZnRJbmZvLmNvZWZmKDApIC0gc2hpZnRJbmZvLmNvZWZmKDIpIC8gczsKKyAgICAgIGV4c2hpZnQgKz0gczsKKyAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPD0gaXU7ICsraSkKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKGksaSkgLT0gczsKKyAgICAgIHNoaWZ0SW5mby5zZXRDb25zdGFudChTY2FsYXIoMC45NjQpKTsKKyAgICB9CisgIH0KK30KKworLyoqIFxpbnRlcm5hbCBDb21wdXRlIGluZGV4IGltIGF0IHdoaWNoIEZyYW5jaXMgUVIgc3RlcCBzdGFydHMgYW5kIHRoZSBmaXJzdCBIb3VzZWhvbGRlciB2ZWN0b3IuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHZvaWQgUmVhbFNjaHVyPE1hdHJpeFR5cGU+Ojppbml0RnJhbmNpc1FSU3RlcChJbmRleCBpbCwgSW5kZXggaXUsIGNvbnN0IFZlY3RvcjNzJiBzaGlmdEluZm8sIEluZGV4JiBpbSwgVmVjdG9yM3MmIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICBWZWN0b3IzcyYgdiA9IGZpcnN0SG91c2Vob2xkZXJWZWN0b3I7IC8vIGFsaWFzIHRvIHNhdmUgdHlwaW5nCisKKyAgZm9yIChpbSA9IGl1LTI7IGltID49IGlsOyAtLWltKQorICB7CisgICAgY29uc3QgU2NhbGFyIFRtbSA9IG1fbWF0VC5jb2VmZihpbSxpbSk7CisgICAgY29uc3QgU2NhbGFyIHIgPSBzaGlmdEluZm8uY29lZmYoMCkgLSBUbW07CisgICAgY29uc3QgU2NhbGFyIHMgPSBzaGlmdEluZm8uY29lZmYoMSkgLSBUbW07CisgICAgdi5jb2VmZlJlZigwKSA9IChyICogcyAtIHNoaWZ0SW5mby5jb2VmZigyKSkgLyBtX21hdFQuY29lZmYoaW0rMSxpbSkgKyBtX21hdFQuY29lZmYoaW0saW0rMSk7CisgICAgdi5jb2VmZlJlZigxKSA9IG1fbWF0VC5jb2VmZihpbSsxLGltKzEpIC0gVG1tIC0gciAtIHM7CisgICAgdi5jb2VmZlJlZigyKSA9IG1fbWF0VC5jb2VmZihpbSsyLGltKzEpOworICAgIGlmIChpbSA9PSBpbCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNvbnN0IFNjYWxhciBsaHMgPSBtX21hdFQuY29lZmYoaW0saW0tMSkgKiAoYWJzKHYuY29lZmYoMSkpICsgYWJzKHYuY29lZmYoMikpKTsKKyAgICBjb25zdCBTY2FsYXIgcmhzID0gdi5jb2VmZigwKSAqIChhYnMobV9tYXRULmNvZWZmKGltLTEsaW0tMSkpICsgYWJzKFRtbSkgKyBhYnMobV9tYXRULmNvZWZmKGltKzEsaW0rMSkpKTsKKyAgICBpZiAoYWJzKGxocykgPCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogcmhzKQorICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqIFxpbnRlcm5hbCBQZXJmb3JtIGEgRnJhbmNpcyBRUiBzdGVwIGludm9sdmluZyByb3dzIGlsOml1IGFuZCBjb2x1bW5zIGltOml1LiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB2b2lkIFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6cGVyZm9ybUZyYW5jaXNRUlN0ZXAoSW5kZXggaWwsIEluZGV4IGltLCBJbmRleCBpdSwgYm9vbCBjb21wdXRlVSwgY29uc3QgVmVjdG9yM3MmIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IsIFNjYWxhciogd29ya3NwYWNlKQoreworICBlaWdlbl9hc3NlcnQoaW0gPj0gaWwpOworICBlaWdlbl9hc3NlcnQoaW0gPD0gaXUtMik7CisKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0VC5jb2xzKCk7CisKKyAgZm9yIChJbmRleCBrID0gaW07IGsgPD0gaXUtMjsgKytrKQorICB7CisgICAgYm9vbCBmaXJzdEl0ZXJhdGlvbiA9IChrID09IGltKTsKKworICAgIFZlY3RvcjNzIHY7CisgICAgaWYgKGZpcnN0SXRlcmF0aW9uKQorICAgICAgdiA9IGZpcnN0SG91c2Vob2xkZXJWZWN0b3I7CisgICAgZWxzZQorICAgICAgdiA9IG1fbWF0VC50ZW1wbGF0ZSBibG9jazwzLDE+KGssay0xKTsKKworICAgIFNjYWxhciB0YXUsIGJldGE7CisgICAgTWF0cml4PFNjYWxhciwgMiwgMT4gZXNzOworICAgIHYubWFrZUhvdXNlaG9sZGVyKGVzcywgdGF1LCBiZXRhKTsKKyAgICAKKyAgICBpZiAoYmV0YSAhPSBTY2FsYXIoMCkpIC8vIGlmIHYgaXMgbm90IHplcm8KKyAgICB7CisgICAgICBpZiAoZmlyc3RJdGVyYXRpb24gJiYgayA+IGlsKQorICAgICAgICBtX21hdFQuY29lZmZSZWYoayxrLTEpID0gLW1fbWF0VC5jb2VmZihrLGstMSk7CisgICAgICBlbHNlIGlmICghZmlyc3RJdGVyYXRpb24pCisgICAgICAgIG1fbWF0VC5jb2VmZlJlZihrLGstMSkgPSBiZXRhOworCisgICAgICAvLyBUaGVzZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMgZm9ybSB0aGUgTyhuXjMpIHBhcnQgb2YgdGhlIGFsZ29yaXRobQorICAgICAgbV9tYXRULmJsb2NrKGssIGssIDMsIHNpemUtaykuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3MsIHRhdSwgd29ya3NwYWNlKTsKKyAgICAgIG1fbWF0VC5ibG9jaygwLCBrLCAoc3RkOjptaW4pKGl1LGsrMykgKyAxLCAzKS5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChlc3MsIHRhdSwgd29ya3NwYWNlKTsKKyAgICAgIGlmIChjb21wdXRlVSkKKyAgICAgICAgbV9tYXRVLmJsb2NrKDAsIGssIHNpemUsIDMpLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzcywgdGF1LCB3b3Jrc3BhY2UpOworICAgIH0KKyAgfQorCisgIE1hdHJpeDxTY2FsYXIsIDIsIDE+IHYgPSBtX21hdFQudGVtcGxhdGUgYmxvY2s8MiwxPihpdS0xLCBpdS0yKTsKKyAgU2NhbGFyIHRhdSwgYmV0YTsKKyAgTWF0cml4PFNjYWxhciwgMSwgMT4gZXNzOworICB2Lm1ha2VIb3VzZWhvbGRlcihlc3MsIHRhdSwgYmV0YSk7CisKKyAgaWYgKGJldGEgIT0gU2NhbGFyKDApKSAvLyBpZiB2IGlzIG5vdCB6ZXJvCisgIHsKKyAgICBtX21hdFQuY29lZmZSZWYoaXUtMSwgaXUtMikgPSBiZXRhOworICAgIG1fbWF0VC5ibG9jayhpdS0xLCBpdS0xLCAyLCBzaXplLWl1KzEpLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzLCB0YXUsIHdvcmtzcGFjZSk7CisgICAgbV9tYXRULmJsb2NrKDAsIGl1LTEsIGl1KzEsIDIpLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzcywgdGF1LCB3b3Jrc3BhY2UpOworICAgIGlmIChjb21wdXRlVSkKKyAgICAgIG1fbWF0VS5ibG9jaygwLCBpdS0xLCBzaXplLCAyKS5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChlc3MsIHRhdSwgd29ya3NwYWNlKTsKKyAgfQorCisgIC8vIGNsZWFuIHVwIHBvbGx1dGlvbiBkdWUgdG8gcm91bmQtb2ZmIGVycm9ycworICBmb3IgKEluZGV4IGkgPSBpbSsyOyBpIDw9IGl1OyArK2kpCisgIHsKKyAgICBtX21hdFQuY29lZmZSZWYoaSxpLTIpID0gU2NhbGFyKDApOworICAgIGlmIChpID4gaW0rMikKKyAgICAgIG1fbWF0VC5jb2VmZlJlZihpLGktMykgPSBTY2FsYXIoMCk7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9SRUFMX1NDSFVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXJfTEFQQUNLRS5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1cl9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyMjUxNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXJfTEFQQUNLRS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBMQVBBQ0tlCisgKiAgICBSZWFsIFNjaHVyIG5lZWRlZCB0byByZWFsIHVuc3ltbWV0cmljYWwgZWlnZW52YWx1ZXMvZWlnZW52ZWN0b3JzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1JFQUxfU0NIVVJfTEFQQUNLRV9ICisjZGVmaW5lIEVJR0VOX1JFQUxfU0NIVVJfTEFQQUNLRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGludGVybmFsIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgZGF0YSB0eXBlcyBzdXBwb3J0ZWQgYnkgTEFQQUNLZSAqLworCisjZGVmaW5lIEVJR0VOX0xBUEFDS0VfU0NIVVJfUkVBTChFSUdUWVBFLCBMQVBBQ0tFX1RZUEUsIExBUEFDS0VfUFJFRklYLCBMQVBBQ0tFX1BSRUZJWF9VLCBFSUdDT0xST1csIExBUEFDS0VfQ09MUk9XKSBcCit0ZW1wbGF0ZTw+IHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4gaW5saW5lIFwKK1JlYWxTY2h1cjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XPiA+JiBcCitSZWFsU2NodXI8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBib29sIGNvbXB1dGVVKSBcCit7IFwKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7IFwKK1wKKyAgbGFwYWNrX2ludCBuID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4obWF0cml4LmNvbHMoKSksIHNkaW0sIGluZm87IFwKKyAgbGFwYWNrX2ludCBtYXRyaXhfb3JkZXIgPSBMQVBBQ0tFX0NPTFJPVzsgXAorICBjaGFyIGpvYnZzLCBzb3J0PSdOJzsgXAorICBMQVBBQ0tfIyNMQVBBQ0tFX1BSRUZJWF9VIyNfU0VMRUNUMiBzZWxlY3QgPSAwOyBcCisgIGpvYnZzID0gKGNvbXB1dGVVKSA/ICdWJyA6ICdOJzsgXAorICBtX21hdFUucmVzaXplKG4sIG4pOyBcCisgIGxhcGFja19pbnQgbGR2cyAgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxsYXBhY2tfaW50PihtX21hdFUub3V0ZXJTdHJpZGUoKSk7IFwKKyAgbV9tYXRUID0gbWF0cml4OyBcCisgIGxhcGFja19pbnQgbGRhID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4obV9tYXRULm91dGVyU3RyaWRlKCkpOyBcCisgIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljPiB3ciwgd2k7IFwKKyAgd3IucmVzaXplKG4sIDEpOyB3aS5yZXNpemUobiwgMSk7IFwKKyAgaW5mbyA9IExBUEFDS0VfIyNMQVBBQ0tFX1BSRUZJWCMjZ2VlcyggbWF0cml4X29yZGVyLCBqb2J2cywgc29ydCwgc2VsZWN0LCBuLCAoTEFQQUNLRV9UWVBFKiltX21hdFQuZGF0YSgpLCBsZGEsICZzZGltLCAoTEFQQUNLRV9UWVBFKil3ci5kYXRhKCksIChMQVBBQ0tFX1RZUEUqKXdpLmRhdGEoKSwgKExBUEFDS0VfVFlQRSopbV9tYXRVLmRhdGEoKSwgbGR2cyApOyBcCisgIGlmKGluZm8gPT0gMCkgXAorICAgIG1faW5mbyA9IFN1Y2Nlc3M7IFwKKyAgZWxzZSBcCisgICAgbV9pbmZvID0gTm9Db252ZXJnZW5jZTsgXAorXAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsgXAorICByZXR1cm4gKnRoaXM7IFwKK1wKK30KKworRUlHRU5fTEFQQUNLRV9TQ0hVUl9SRUFMKGRvdWJsZSwgICBkb3VibGUsIGQsIEQsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTEFQQUNLRV9TQ0hVUl9SRUFMKGZsb2F0LCAgICBmbG9hdCwgIHMsIFMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTEFQQUNLRV9TQ0hVUl9SRUFMKGRvdWJsZSwgICBkb3VibGUsIGQsIEQsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTEFQQUNLRV9TQ0hVUl9SRUFMKGZsb2F0LCAgICBmbG9hdCwgIHMsIFMsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFQUxfU0NIVVJfTEFQQUNLRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRkNTUzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApAQCAtMCwwICsxLDg3MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVEVJR0VOU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICisKKyNpbmNsdWRlICIuL1RyaWRpYWdvbmFsaXphdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXJUeXBlLGludCBTaXplLGJvb2wgSXNDb21wbGV4PiBzdHJ1Y3QgZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgRGlhZ1R5cGUsIHR5cGVuYW1lIFN1YkRpYWdUeXBlPgorQ29tcHV0YXRpb25JbmZvIGNvbXB1dGVGcm9tVHJpZGlhZ29uYWxfaW1wbChEaWFnVHlwZSYgZGlhZywgU3ViRGlhZ1R5cGUmIHN1YmRpYWcsIGNvbnN0IEluZGV4IG1heEl0ZXJhdGlvbnMsIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycywgTWF0cml4VHlwZSYgZWl2ZWMpOworfQorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKgorICAqIFxicmllZiBDb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIHNlbGZhZGpvaW50IG1hdHJpY2VzCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUKKyAgKiBlaWdlbmRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4CisgICogY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBBIG1hdHJpeCBcZiQgQSBcZiQgaXMgc2VsZmFkam9pbnQgaWYgaXQgZXF1YWxzIGl0cyBhZGpvaW50LiBGb3IgcmVhbAorICAqIG1hdHJpY2VzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG1hdHJpeCBpcyBzeW1tZXRyaWM6IGl0IGVxdWFscyBpdHMKKyAgKiB0cmFuc3Bvc2UuIFRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYQorICAqIHNlbGZhZGpvaW50IG1hdHJpeC4gVGhlc2UgYXJlIHRoZSBzY2FsYXJzIFxmJCBcbGFtYmRhIFxmJCBhbmQgdmVjdG9ycworICAqIFxmJCB2IFxmJCBzdWNoIHRoYXQgXGYkIEF2ID0gXGxhbWJkYSB2IFxmJC4gIFRoZSBlaWdlbnZhbHVlcyBvZiBhCisgICogc2VsZmFkam9pbnQgbWF0cml4IGFyZSBhbHdheXMgcmVhbC4gSWYgXGYkIEQgXGYkIGlzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGgKKyAgKiB0aGUgZWlnZW52YWx1ZXMgb24gdGhlIGRpYWdvbmFsLCBhbmQgXGYkIFYgXGYkIGlzIGEgbWF0cml4IHdpdGggdGhlCisgICogZWlnZW52ZWN0b3JzIGFzIGl0cyBjb2x1bW5zLCB0aGVuIFxmJCBBID0gViBEIFZeey0xfSBcZiQgKGZvciBzZWxmYWRqb2ludAorICAqIG1hdHJpY2VzLCB0aGUgbWF0cml4IFxmJCBWIFxmJCBpcyBhbHdheXMgaW52ZXJ0aWJsZSkuIFRoaXMgaXMgY2FsbGVkIHRoZQorICAqIGVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFRoZSBhbGdvcml0aG0gZXhwbG9pdHMgdGhlIGZhY3QgdGhhdCB0aGUgbWF0cml4IGlzIHNlbGZhZGpvaW50LCBtYWtpbmcgaXQKKyAgKiBmYXN0ZXIgYW5kIG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgZ2VuZXJhbCBwdXJwb3NlIGVpZ2VudmFsdWUgYWxnb3JpdGhtcworICAqIGltcGxlbWVudGVkIGluIEVpZ2VuU29sdmVyIGFuZCBDb21wbGV4RWlnZW5Tb2x2ZXIuCisgICoKKyAgKiBPbmx5IHRoZSBcYiBsb3dlciBcYiB0cmlhbmd1bGFyIFxiIHBhcnQgb2YgdGhlIGlucHV0IG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YKKyAgKiBhIGdpdmVuIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlCisgICogU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgaW50KSBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcworICAqIHRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZSBlaWdlbnZhbHVlCisgICogYW5kIGVpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBlaWdlbnZhbHVlcygpCisgICogYW5kIGVpZ2VudmVjdG9ycygpIGZ1bmN0aW9ucy4KKyAgKgorICAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICogY29udGFpbnMgYW4gZXhhbXBsZSBvZiB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgKgorICAqIFRvIHNvbHZlIHRoZSBcZW0gZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZSBwcm9ibGVtIFxmJCBBdiA9IFxsYW1iZGEgQnYgXGYkIGFuZAorICAqIHRoZSBsaWtlcywgc2VlIHRoZSBjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6ZWlnZW52YWx1ZXMoKSwgY2xhc3MgRWlnZW5Tb2x2ZXIsIGNsYXNzIENvbXBsZXhFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSBccCBfTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisgICAgCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZSxDb2xNYWpvcixNYXhDb2xzQXRDb21waWxlVGltZSxNYXhDb2xzQXRDb21waWxlVGltZT4gRWlnZW52ZWN0b3JzVHlwZTsKKworICAgIC8qKiBcYnJpZWYgUmVhbCBzY2FsYXIgdHlwZSBmb3IgXHAgX01hdHJpeFR5cGUuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMganVzdCBcYyBTY2FsYXIgaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLCBcYyBmbG9hdCBvcgorICAgICAgKiBcYyBkb3VibGUpLCBhbmQgdGhlIHR5cGUgb2YgdGhlIHJlYWwgcGFydCBvZiBcYyBTY2FsYXIgaWYgI1NjYWxhciBpcworICAgICAgKiBjb21wbGV4LgorICAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgCisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6ZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzPFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIsU2l6ZSxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4PjsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIGVpZ2VudmFsdWVzIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBjb2x1bW4gdmVjdG9yIHdpdGggZW50cmllcyBvZiB0eXBlICNSZWFsU2NhbGFyLgorICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgaXMgdGhlIHNpemUgb2YgXHAgX01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXI+Ojp0eXBlIFJlYWxWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+IFRyaWRpYWdvbmFsaXphdGlvblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb25UeXBlOjpTdWJEaWFnb25hbFR5cGUgU3ViRGlhZ29uYWxUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBmaXhlZC1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgICogY2FuIG9ubHkgYmUgdXNlZCBpZiBccCBfTWF0cml4VHlwZSBpcyBhIGZpeGVkLXNpemUgbWF0cml4OyB1c2UKKyAgICAgICogU2VsZkFkam9pbnRFaWdlblNvbHZlcihJbmRleCkgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIub3V0CisgICAgICAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcigpCisgICAgICAgIDogbV9laXZlYygpLAorICAgICAgICAgIG1fZWl2YWx1ZXMoKSwKKyAgICAgICAgICBtX3N1YmRpYWcoKSwKKyAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeyB9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLCBwcmUtYWxsb2NhdGVzIG1lbW9yeSBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSAgc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlCisgICAgICAqIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgd2hlbiB0aGUgdXNlcgorICAgICAgKiBpbnRlbmRzIHRvIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gVGhlIFxwIHNpemUKKyAgICAgICogcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEgd3JvbmcKKyAgICAgICogXHAgc2l6ZSwgYnV0IGl0IG1heSBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBleHBsaWNpdCBTZWxmQWRqb2ludEVpZ2VuU29sdmVyKEluZGV4IHNpemUpCisgICAgICAgIDogbV9laXZlYyhzaXplLCBzaXplKSwKKyAgICAgICAgICBtX2VpdmFsdWVzKHNpemUpLAorICAgICAgICAgIG1fc3ViZGlhZyhzaXplID4gMSA/IHNpemUgLSAxIDogMSksCisgICAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNlbGZhZGpvaW50IG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8KKyAgICAgICogICAgYmUgY29tcHV0ZWQuIE9ubHkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IGlzIHJlZmVyZW5jZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIG9wdGlvbnMgQ2FuIGJlICNDb21wdXRlRWlnZW52ZWN0b3JzIChkZWZhdWx0KSBvciAjRWlnZW52YWx1ZXNPbmx5LgorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGludCkgdG8gY29tcHV0ZSB0aGUKKyAgICAgICogZWlnZW52YWx1ZXMgb2YgdGhlIG1hdHJpeCBccCBtYXRyaXguIFRoZSBlaWdlbnZlY3RvcnMgYXJlIGNvbXB1dGVkIGlmCisgICAgICAqIFxwIG9wdGlvbnMgZXF1YWxzICNDb21wdXRlRWlnZW52ZWN0b3JzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUub3V0CisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGV4cGxpY2l0IFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCwgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgOiBtX2VpdmVjKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2VpdmFsdWVzKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3N1YmRpYWcobWF0cml4LnJvd3MoKSA+IDEgPyBtYXRyaXgucm93cygpIC0gMSA6IDEpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU2VsZmFkam9pbnQgbWF0cml4IHdob3NlIGVpZ2VuZGVjb21wb3NpdGlvbiBpcyB0bworICAgICAgKiAgICBiZSBjb21wdXRlZC4gT25seSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggaXMgcmVmZXJlbmNlZC4KKyAgICAgICogXHBhcmFtW2luXSAgb3B0aW9ucyBDYW4gYmUgI0NvbXB1dGVFaWdlbnZlY3RvcnMgKGRlZmF1bHQpIG9yICNFaWdlbnZhbHVlc09ubHkuCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyBvZiBccCBtYXRyaXguICBUaGUgZWlnZW52YWx1ZXMoKQorICAgICAgKiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGVtLiAgSWYgXHAgb3B0aW9ucyBlcXVhbHMgI0NvbXB1dGVFaWdlbnZlY3RvcnMsCisgICAgICAqIHRoZW4gdGhlIGVpZ2VudmVjdG9ycyBhcmUgYWxzbyBjb21wdXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCBieQorICAgICAgKiBjYWxsaW5nIGVpZ2VudmVjdG9ycygpLgorICAgICAgKgorICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBzeW1tZXRyaWMgUVIgYWxnb3JpdGhtLiBUaGUgbWF0cml4IGlzIGZpcnN0CisgICAgICAqIHJlZHVjZWQgdG8gdHJpZGlhZ29uYWwgZm9ybSB1c2luZyB0aGUgVHJpZGlhZ29uYWxpemF0aW9uIGNsYXNzLiBUaGUKKyAgICAgICogdHJpZGlhZ29uYWwgbWF0cml4IGlzIHRoZW4gYnJvdWdodCB0byBkaWFnb25hbCBmb3JtIHdpdGggaW1wbGljaXQKKyAgICAgICogc3ltbWV0cmljIFFSIHN0ZXBzIHdpdGggV2lsa2luc29uIHNoaWZ0LiBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbgorICAgICAgKiBTZWN0aW9uIDguMyBvZiBHb2x1YiBcJiBWYW4gTG9hbiwgPGk+JU1hdHJpeCBDb21wdXRhdGlvbnM8L2k+LgorICAgICAgKgorICAgICAgKiBUaGUgY29zdCBvZiB0aGUgY29tcHV0YXRpb24gaXMgYWJvdXQgXGYkIDluXjMgXGYkIGlmIHRoZSBlaWdlbnZlY3RvcnMKKyAgICAgICogYXJlIHJlcXVpcmVkIGFuZCBcZiQgNG5eMy8zIFxmJCBpZiB0aGV5IGFyZSBub3QgcmVxdWlyZWQuCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIHJldXNlcyB0aGUgbWVtb3J5IGluIHRoZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyIG9iamVjdCB0aGF0CisgICAgICAqIHdhcyBhbGxvY2F0ZWQgd2hlbiB0aGUgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZCwgaWYgdGhlIHNpemUgb2YgdGhlCisgICAgICAqIG1hdHJpeCBkb2VzIG5vdCBjaGFuZ2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsIGludCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlciYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBpbnQgb3B0aW9ucyA9IENvbXB1dGVFaWdlbnZlY3RvcnMpOworICAgIAorICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCB1c2luZyBhIGNsb3NlZC1mb3JtIGFsZ29yaXRobQorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgdmFyaWFudCBvZiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQgb3B0aW9ucykgd2hpY2gKKyAgICAgICogZGlyZWN0bHkgc29sdmVzIHRoZSB1bmRlcmx5aW5nIHBvbHlub21pYWwgZXF1YXRpb24uCisgICAgICAqIAorICAgICAgKiBDdXJyZW50bHkgb25seSAyeDIgYW5kIDN4MyBtYXRyaWNlcyBmb3Igd2hpY2ggdGhlIHNpemVzIGFyZSBrbm93biBhdCBjb21waWxlIHRpbWUgYXJlIHN1cHBvcnRlZCAoZS5nLiwgTWF0cml4M2QpLgorICAgICAgKiAKKyAgICAgICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIHRoZSBRUiBpdGVyYXRpdmUgYWxnb3JpdGhtCisgICAgICAqIGJ1dCBpdCBtaWdodCBhbHNvIGJlIGxlc3MgYWNjdXJhdGUuIEl0IGlzIGFsc28gd29ydGggbm90aW5nIHRoYXQKKyAgICAgICogZm9yIDN4MyBtYXRyaWNlcyBpdCBpbnZvbHZlcyB0cmlnb25vbWV0cmljIG9wZXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICAqIG5vdCBuZWNlc3NhcmlseSBhdmFpbGFibGUgZm9yIGFsbCBzY2FsYXIgdHlwZXMuCisgICAgICAqIAorICAgICAgKiBGb3IgdGhlIDN4MyBjYXNlLCB3ZSBvYnNlcnZlZCB0aGUgZm9sbG93aW5nIHdvcnN0IGNhc2UgcmVsYXRpdmUgZXJyb3IgcmVnYXJkaW5nIHRoZSBlaWdlbnZhbHVlczoKKyAgICAgICogICAtIGRvdWJsZTogMWUtOAorICAgICAgKiAgIC0gZmxvYXQ6ICAxZS0zCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQgb3B0aW9ucykKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyJiBjb21wdXRlRGlyZWN0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzKTsKKworICAgIC8qKgorICAgICAgKlxicmllZiBDb21wdXRlcyB0aGUgZWlnZW4gZGVjb21wb3NpdGlvbiBmcm9tIGEgdHJpZGlhZ29uYWwgc3ltbWV0cmljIG1hdHJpeAorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dIGRpYWcgVGhlIHZlY3RvciBjb250YWluaW5nIHRoZSBkaWFnb25hbCBvZiB0aGUgbWF0cml4LgorICAgICAgKiBccGFyYW1baW5dIHN1YmRpYWcgVGhlIHN1YmRpYWdvbmFsIG9mIHRoZSBtYXRyaXguCisgICAgICAqIFxwYXJhbVtpbl0gb3B0aW9ucyBDYW4gYmUgI0NvbXB1dGVFaWdlbnZlY3RvcnMgKGRlZmF1bHQpIG9yICNFaWdlbnZhbHVlc09ubHkuCisgICAgICAqIFxyZXR1cm5zIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgbWF0cml4IGhhcyBiZWVuIHJlZHVjZWQgdG8gdHJpZGlhZ29uYWwgZm9ybS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGludCkgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgICovCisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlciYgY29tcHV0ZUZyb21UcmlkaWFnb25hbChjb25zdCBSZWFsVmVjdG9yVHlwZSYgZGlhZywgY29uc3QgU3ViRGlhZ29uYWxUeXBlJiBzdWJkaWFnICwgaW50IG9wdGlvbnM9Q29tcHV0ZUVpZ2VudmVjdG9ycyk7CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGVpZ2VudmVjdG9ycyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zICBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdob3NlIGNvbHVtbnMgYXJlIHRoZSBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgVGhlIGVpZ2VudmVjdG9ycyBoYXZlIGJlZW4gY29tcHV0ZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBDb2x1bW4gXGYkIGsgXGYkIG9mIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYW4gZWlnZW52ZWN0b3IgY29ycmVzcG9uZGluZworICAgICAgKiB0byBlaWdlbnZhbHVlIG51bWJlciBcZiQgayBcZiQgYXMgcmV0dXJuZWQgYnkgZWlnZW52YWx1ZXMoKS4gIFRoZQorICAgICAgKiBlaWdlbnZlY3RvcnMgYXJlIG5vcm1hbGl6ZWQgdG8gaGF2ZSAoRXVjbGlkZWFuKSBub3JtIGVxdWFsIHRvIG9uZS4gSWYKKyAgICAgICogdGhpcyBvYmplY3Qgd2FzIHVzZWQgdG8gc29sdmUgdGhlIGVpZ2VucHJvYmxlbSBmb3IgdGhlIHNlbGZhZGpvaW50CisgICAgICAqIG1hdHJpeCBcZiQgQSBcZiQsIHRoZW4gdGhlIG1hdHJpeCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIHRoZQorICAgICAgKiBtYXRyaXggXGYkIFYgXGYkIGluIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLm91dAorICAgICAgKgorICAgICAgKiBcc2EgZWlnZW52YWx1ZXMoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEVpZ2VudmVjdG9yc1R5cGUmIGVpZ2VudmVjdG9ycygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgICAgcmV0dXJuIG1fZWl2ZWM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBlaWdlbnZhbHVlcyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGVpZ2VudmFsdWVzLgorICAgICAgKgorICAgICAgKiBccHJlIFRoZSBlaWdlbnZhbHVlcyBoYXZlIGJlZW4gY29tcHV0ZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0byB0aGVpciBhbGdlYnJhaWMgbXVsdGlwbGljaXR5LAorICAgICAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguIFRoZSBlaWdlbnZhbHVlcworICAgICAgKiBhcmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMub3V0CisgICAgICAqCisgICAgICAqIFxzYSBlaWdlbnZlY3RvcnMoKSwgTWF0cml4QmFzZTo6ZWlnZW52YWx1ZXMoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFJlYWxWZWN0b3JUeXBlJiBlaWdlbnZhbHVlcygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9laXZhbHVlczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIHRoZSBwb3NpdGl2ZS1kZWZpbml0ZSBzcXVhcmUgcm9vdCBvZiB0aGUgbWF0cml4LgorICAgICAgKgorICAgICAgKiBccmV0dXJucyB0aGUgcG9zaXRpdmUtZGVmaW5pdGUgc3F1YXJlIHJvb3Qgb2YgdGhlIG1hdHJpeAorICAgICAgKgorICAgICAgKiBccHJlIFRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgcG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4CisgICAgICAqIGhhdmUgYmVlbiBjb21wdXRlZCBiZWZvcmUuCisgICAgICAqCisgICAgICAqIFRoZSBzcXVhcmUgcm9vdCBvZiBhIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCBcZiQgQSBcZiQgaXMgdGhlCisgICAgICAqIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCB3aG9zZSBzcXVhcmUgZXF1YWxzIFxmJCBBIFxmJC4gVGhpcyBmdW5jdGlvbgorICAgICAgKiB1c2VzIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJCB0byBjb21wdXRlIHRoZQorICAgICAgKiBzcXVhcmUgcm9vdCBhcyBcZiQgQV57MS8yfSA9IFYgRF57MS8yfSBWXnstMX0gXGYkLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9yU3FydC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvckludmVyc2VTcXJ0KCksIDxhIGhyZWY9InVuc3VwcG9ydGVkL2dyb3VwX19NYXRyaXhGdW5jdGlvbnNfX01vZHVsZS5odG1sIj5NYXRyaXhGdW5jdGlvbnMgTW9kdWxlPC9hPgorICAgICAgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIE1hdHJpeFR5cGUgb3BlcmF0b3JTcXJ0KCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgICAgICByZXR1cm4gbV9laXZlYyAqIG1fZWl2YWx1ZXMuY3dpc2VTcXJ0KCkuYXNEaWFnb25hbCgpICogbV9laXZlYy5hZGpvaW50KCk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyB0aGUgaW52ZXJzZSBzcXVhcmUgcm9vdCBvZiB0aGUgbWF0cml4LgorICAgICAgKgorICAgICAgKiBccmV0dXJucyB0aGUgaW52ZXJzZSBwb3NpdGl2ZS1kZWZpbml0ZSBzcXVhcmUgcm9vdCBvZiB0aGUgbWF0cml4CisgICAgICAqCisgICAgICAqIFxwcmUgVGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXgKKyAgICAgICogaGF2ZSBiZWVuIGNvbXB1dGVkIGJlZm9yZS4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJCB0bworICAgICAgKiBjb21wdXRlIHRoZSBpbnZlcnNlIHNxdWFyZSByb290IGFzIFxmJCBWIEReey0xLzJ9IFZeey0xfSBcZiQuIFRoaXMgaXMKKyAgICAgICogY2hlYXBlciB0aGFuIGZpcnN0IGNvbXB1dGluZyB0aGUgc3F1YXJlIHJvb3Qgd2l0aCBvcGVyYXRvclNxcnQoKSBhbmQKKyAgICAgICogdGhlbiBpdHMgaW52ZXJzZSB3aXRoIE1hdHJpeEJhc2U6OmludmVyc2UoKS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0LmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvclNxcnQoKSwgTWF0cml4QmFzZTo6aW52ZXJzZSgpLCA8YSBocmVmPSJ1bnN1cHBvcnRlZC9ncm91cF9fTWF0cml4RnVuY3Rpb25zX19Nb2R1bGUuaHRtbCI+TWF0cml4RnVuY3Rpb25zIE1vZHVsZTwvYT4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBNYXRyaXhUeXBlIG9wZXJhdG9ySW52ZXJzZVNxcnQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fZWlnZW52ZWN0b3JzT2sgJiYgIlRoZSBlaWdlbnZlY3RvcnMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB0b2dldGhlciB3aXRoIHRoZSBlaWdlbnZhbHVlcy4iKTsKKyAgICAgIHJldHVybiBtX2VpdmVjICogbV9laXZhbHVlcy5jd2lzZUludmVyc2UoKS5jd2lzZVNxcnQoKS5hc0RpYWdvbmFsKCkgKiBtX2VpdmVjLmFkam9pbnQoKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLCBcYyBOb0NvbnZlcmdlbmNlIG90aGVyd2lzZS4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucy4KKyAgICAgICoKKyAgICAgICogVGhlIGFsZ29yaXRobSB0ZXJtaW5hdGVzIGlmIGl0IGRvZXMgbm90IGNvbnZlcmdlIHdpdGhpbiBtX21heEl0ZXJhdGlvbnMgKiBuIGl0ZXJhdGlvbnMsIHdoZXJlIG4KKyAgICAgICogZGVub3RlcyB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4LiBUaGlzIHZhbHVlIGlzIGN1cnJlbnRseSBzZXQgdG8gMzAgKGNvcGllZCBmcm9tIExBUEFDSykuCisgICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgbV9tYXhJdGVyYXRpb25zID0gMzA7CisKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgICB9CisgICAgCisgICAgRWlnZW52ZWN0b3JzVHlwZSBtX2VpdmVjOworICAgIFJlYWxWZWN0b3JUeXBlIG1fZWl2YWx1ZXM7CisgICAgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uVHlwZTo6U3ViRGlhZ29uYWxUeXBlIG1fc3ViZGlhZzsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9laWdlbnZlY3RvcnNPazsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvKiogXGludGVybmFsCisgICoKKyAgKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICogUGVyZm9ybXMgYSBRUiBzdGVwIG9uIGEgdHJpZGlhZ29uYWwgc3ltbWV0cmljIG1hdHJpeCByZXByZXNlbnRlZCBhcyBhCisgICogcGFpciBvZiB0d28gdmVjdG9ycyBcYSBkaWFnIGFuZCBcYSBzdWJkaWFnLgorICAqCisgICogXHBhcmFtIGRpYWcgdGhlIGRpYWdvbmFsIHBhcnQgb2YgdGhlIGlucHV0IHNlbGZhZGpvaW50IHRyaWRpYWdvbmFsIG1hdHJpeAorICAqIFxwYXJhbSBzdWJkaWFnIHRoZSBzdWItZGlhZ29uYWwgcGFydCBvZiB0aGUgaW5wdXQgc2VsZmFkam9pbnQgdHJpZGlhZ29uYWwgbWF0cml4CisgICogXHBhcmFtIHN0YXJ0IHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBzdWJtYXRyaXggdG8gd29yayBvbgorICAqIFxwYXJhbSBlbmQgbGFzdCsxIGluZGV4IG9mIHRoZSBzdWJtYXRyaXggdG8gd29yayBvbgorICAqIFxwYXJhbSBtYXRyaXhRIHBvaW50ZXIgdG8gdGhlIGNvbHVtbi1tYWpvciBtYXRyaXggaG9sZGluZyB0aGUgZWlnZW52ZWN0b3JzLCBjYW4gYmUgMAorICAqIFxwYXJhbSBuIHNpemUgb2YgdGhlIGlucHV0IG1hdHJpeAorICAqCisgICogRm9yIGNvbXBpbGF0aW9uIGVmZmljaWVuY3kgcmVhc29ucywgdGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdXNlIGVpZ2VuIGV4cHJlc3Npb24KKyAgKiBmb3IgaXRzIGFyZ3VtZW50cy4KKyAgKgorICAqIEltcGxlbWVudGVkIGZyb20gR29sdWIncyAiTWF0cml4IENvbXB1dGF0aW9ucyIsIGFsZ29yaXRobSA4LjMuMjoKKyAgKiAiaW1wbGljaXQgc3ltbWV0cmljIFFSIHN0ZXAgd2l0aCBXaWxraW5zb24gc2hpZnQiCisgICovCit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLHR5cGVuYW1lIFJlYWxTY2FsYXIsIHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXg+CitFSUdFTl9ERVZJQ0VfRlVOQworc3RhdGljIHZvaWQgdHJpZGlhZ29uYWxfcXJfc3RlcChSZWFsU2NhbGFyKiBkaWFnLCBSZWFsU2NhbGFyKiBzdWJkaWFnLCBJbmRleCBzdGFydCwgSW5kZXggZW5kLCBTY2FsYXIqIG1hdHJpeFEsIEluZGV4IG4pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4mIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4KKzo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgYV9tYXRyaXgsIGludCBvcHRpb25zKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgIAorICBjb25zdCBJbnB1dFR5cGUgJm1hdHJpeChhX21hdHJpeC5kZXJpdmVkKCkpOworICAKKyAgdXNpbmcgc3RkOjphYnM7CisgIGVpZ2VuX2Fzc2VydChtYXRyaXguY29scygpID09IG1hdHJpeC5yb3dzKCkpOworICBlaWdlbl9hc3NlcnQoKG9wdGlvbnMmfihFaWdWZWNNYXNrfEdlbkVpZ01hc2spKT09MAorICAgICAgICAgICYmIChvcHRpb25zJkVpZ1ZlY01hc2spIT1FaWdWZWNNYXNrCisgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOworICBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSAob3B0aW9ucyZDb21wdXRlRWlnZW52ZWN0b3JzKT09Q29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgSW5kZXggbiA9IG1hdHJpeC5jb2xzKCk7CisgIG1fZWl2YWx1ZXMucmVzaXplKG4sMSk7CisKKyAgaWYobj09MSkKKyAgeworICAgIG1fZWl2ZWMgPSBtYXRyaXg7CisgICAgbV9laXZhbHVlcy5jb2VmZlJlZigwLDApID0gbnVtZXh0OjpyZWFsKG1fZWl2ZWMuY29lZmYoMCwwKSk7CisgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICAgIG1fZWl2ZWMuc2V0T25lcyhuLG4pOworICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBtX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBkZWNsYXJlIHNvbWUgYWxpYXNlcworICBSZWFsVmVjdG9yVHlwZSYgZGlhZyA9IG1fZWl2YWx1ZXM7CisgIEVpZ2VudmVjdG9yc1R5cGUmIG1hdCA9IG1fZWl2ZWM7CisKKyAgLy8gbWFwIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIHRvIFstMToxXSB0byBhdm9pZCBvdmVyLSBhbmQgdW5kZXJmbG93LgorICBtYXQgPSBtYXRyaXgudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFJlYWxTY2FsYXIgc2NhbGUgPSBtYXQuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICBpZihzY2FsZT09UmVhbFNjYWxhcigwKSkgc2NhbGUgPSBSZWFsU2NhbGFyKDEpOworICBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgLz0gc2NhbGU7CisgIG1fc3ViZGlhZy5yZXNpemUobi0xKTsKKyAgaW50ZXJuYWw6OnRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlKG1hdCwgZGlhZywgbV9zdWJkaWFnLCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKworICBtX2luZm8gPSBpbnRlcm5hbDo6Y29tcHV0ZUZyb21UcmlkaWFnb25hbF9pbXBsKGRpYWcsIG1fc3ViZGlhZywgbV9tYXhJdGVyYXRpb25zLCBjb21wdXRlRWlnZW52ZWN0b3JzLCBtX2VpdmVjKTsKKyAgCisgIC8vIHNjYWxlIGJhY2sgdGhlIGVpZ2VuIHZhbHVlcworICBtX2VpdmFsdWVzICo9IHNjYWxlOworCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIG1fZWlnZW52ZWN0b3JzT2sgPSBjb21wdXRlRWlnZW52ZWN0b3JzOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Cis6OmNvbXB1dGVGcm9tVHJpZGlhZ29uYWwoY29uc3QgUmVhbFZlY3RvclR5cGUmIGRpYWcsIGNvbnN0IFN1YkRpYWdvbmFsVHlwZSYgc3ViZGlhZyAsIGludCBvcHRpb25zKQoreworICAvL1RPRE8gOiBBZGQgYW4gb3B0aW9uIHRvIHNjYWxlIHRoZSB2YWx1ZXMgYmVmb3JlaGFuZAorICBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSAob3B0aW9ucyZDb21wdXRlRWlnZW52ZWN0b3JzKT09Q29tcHV0ZUVpZ2VudmVjdG9yczsKKworICBtX2VpdmFsdWVzID0gZGlhZzsKKyAgbV9zdWJkaWFnID0gc3ViZGlhZzsKKyAgaWYgKGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgIHsKKyAgICBtX2VpdmVjLnNldElkZW50aXR5KGRpYWcuc2l6ZSgpLCBkaWFnLnNpemUoKSk7CisgIH0KKyAgbV9pbmZvID0gaW50ZXJuYWw6OmNvbXB1dGVGcm9tVHJpZGlhZ29uYWxfaW1wbChtX2VpdmFsdWVzLCBtX3N1YmRpYWcsIG1fbWF4SXRlcmF0aW9ucywgY29tcHV0ZUVpZ2VudmVjdG9ycywgbV9laXZlYyk7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7CisgIHJldHVybiAqdGhpczsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8qKgorICAqIFxpbnRlcm5hbAorICAqIFxicmllZiBDb21wdXRlIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gZnJvbSBhIHRyaWRpYWdvbmFsIG1hdHJpeAorICAqCisgICogXHBhcmFtW2luLG91dF0gZGlhZyA6IE9uIGlucHV0LCB0aGUgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCwgb24gb3V0cHV0IHRoZSBlaWdlbnZhbHVlcworICAqIFxwYXJhbVtpbixvdXRdIHN1YmRpYWcgOiBUaGUgc3ViZGlhZ29uYWwgcGFydCBvZiB0aGUgbWF0cml4IChlbnRyaWVzIGFyZSBtb2RpZmllZCBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24pCisgICogXHBhcmFtW2luXSBtYXhJdGVyYXRpb25zIDogdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKyAgKiBccGFyYW1baW5dIGNvbXB1dGVFaWdlbnZlY3RvcnMgOiB3aGV0aGVyIHRoZSBlaWdlbnZlY3RvcnMgaGF2ZSB0byBiZSBjb21wdXRlZCBvciBub3QKKyAgKiBccGFyYW1bb3V0XSBlaXZlYyA6IFRoZSBtYXRyaXggdG8gc3RvcmUgdGhlIGVpZ2VudmVjdG9ycyBpZiBjb21wdXRlRWlnZW52ZWN0b3JzPT10cnVlLiBNdXN0IGJlIGFsbG9jYXRlZCBvbiBpbnB1dC4KKyAgKiBccmV0dXJucyBcYyBTdWNjZXNzIG9yIFxjIE5vQ29udmVyZ2VuY2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERpYWdUeXBlLCB0eXBlbmFtZSBTdWJEaWFnVHlwZT4KK0NvbXB1dGF0aW9uSW5mbyBjb21wdXRlRnJvbVRyaWRpYWdvbmFsX2ltcGwoRGlhZ1R5cGUmIGRpYWcsIFN1YkRpYWdUeXBlJiBzdWJkaWFnLCBjb25zdCBJbmRleCBtYXhJdGVyYXRpb25zLCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMsIE1hdHJpeFR5cGUmIGVpdmVjKQoreworICB1c2luZyBzdGQ6OmFiczsKKworICBDb21wdXRhdGlvbkluZm8gaW5mbzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IG4gPSBkaWFnLnNpemUoKTsKKyAgSW5kZXggZW5kID0gbi0xOworICBJbmRleCBzdGFydCA9IDA7CisgIEluZGV4IGl0ZXIgPSAwOyAvLyB0b3RhbCBudW1iZXIgb2YgaXRlcmF0aW9ucworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBEaWFnVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBjb25zdCBSZWFsU2NhbGFyIGNvbnNpZGVyQXNaZXJvID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKTsKKyAgY29uc3QgUmVhbFNjYWxhciBwcmVjaXNpb24gPSBSZWFsU2NhbGFyKDIpKk51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpOworICAKKyAgd2hpbGUgKGVuZD4wKQorICB7CisgICAgZm9yIChJbmRleCBpID0gc3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgICBpZiAoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGFicyhzdWJkaWFnW2ldKSwoYWJzKGRpYWdbaV0pK2FicyhkaWFnW2krMV0pKSxwcmVjaXNpb24pIHx8IGFicyhzdWJkaWFnW2ldKSA8PSBjb25zaWRlckFzWmVybykKKyAgICAgICAgc3ViZGlhZ1tpXSA9IDA7CisKKyAgICAvLyBmaW5kIHRoZSBsYXJnZXN0IHVucmVkdWNlZCBibG9jaworICAgIHdoaWxlIChlbmQ+MCAmJiBzdWJkaWFnW2VuZC0xXT09UmVhbFNjYWxhcigwKSkKKyAgICB7CisgICAgICBlbmQtLTsKKyAgICB9CisgICAgaWYgKGVuZDw9MCkKKyAgICAgIGJyZWFrOworCisgICAgLy8gaWYgd2Ugc3BlbnQgdG9vIG1hbnkgaXRlcmF0aW9ucywgd2UgZ2l2ZSB1cAorICAgIGl0ZXIrKzsKKyAgICBpZihpdGVyID4gbWF4SXRlcmF0aW9ucyAqIG4pIGJyZWFrOworCisgICAgc3RhcnQgPSBlbmQgLSAxOworICAgIHdoaWxlIChzdGFydD4wICYmIHN1YmRpYWdbc3RhcnQtMV0hPTApCisgICAgICBzdGFydC0tOworCisgICAgaW50ZXJuYWw6OnRyaWRpYWdvbmFsX3FyX3N0ZXA8TWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yPihkaWFnLmRhdGEoKSwgc3ViZGlhZy5kYXRhKCksIHN0YXJ0LCBlbmQsIGNvbXB1dGVFaWdlbnZlY3RvcnMgPyBlaXZlYy5kYXRhKCkgOiAoU2NhbGFyKikwLCBuKTsKKyAgfQorICBpZiAoaXRlciA8PSBtYXhJdGVyYXRpb25zICogbikKKyAgICBpbmZvID0gU3VjY2VzczsKKyAgZWxzZQorICAgIGluZm8gPSBOb0NvbnZlcmdlbmNlOworCisgIC8vIFNvcnQgZWlnZW52YWx1ZXMgYW5kIGNvcnJlc3BvbmRpbmcgdmVjdG9ycy4KKyAgLy8gVE9ETyBtYWtlIHRoZSBzb3J0IG9wdGlvbmFsID8KKyAgLy8gVE9ETyB1c2UgYSBiZXR0ZXIgc29ydCBhbGdvcml0aG0gISEKKyAgaWYgKGluZm8gPT0gU3VjY2VzcykKKyAgeworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBuLTE7ICsraSkKKyAgICB7CisgICAgICBJbmRleCBrOworICAgICAgZGlhZy5zZWdtZW50KGksbi1pKS5taW5Db2VmZigmayk7CisgICAgICBpZiAoayA+IDApCisgICAgICB7CisgICAgICAgIHN0ZDo6c3dhcChkaWFnW2ldLCBkaWFnW2sraV0pOworICAgICAgICBpZihjb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgICAgIGVpdmVjLmNvbChpKS5zd2FwKGVpdmVjLmNvbChrK2kpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGluZm87Cit9CisgIAordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyVHlwZSxpbnQgU2l6ZSxib29sIElzQ29tcGxleD4gc3RydWN0IGRpcmVjdF9zZWxmYWRqb2ludF9laWdlbnZhbHVlcworeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFNvbHZlclR5cGUmIGVpZywgY29uc3QgdHlwZW5hbWUgU29sdmVyVHlwZTo6TWF0cml4VHlwZSYgQSwgaW50IG9wdGlvbnMpCisgIHsgZWlnLmNvbXB1dGUoQSxvcHRpb25zKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyVHlwZT4gc3RydWN0IGRpcmVjdF9zZWxmYWRqb2ludF9laWdlbnZhbHVlczxTb2x2ZXJUeXBlLDMsZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlclR5cGU6OlJlYWxWZWN0b3JUeXBlIFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXJUeXBlOjpFaWdlbnZlY3RvcnNUeXBlIEVpZ2VudmVjdG9yc1R5cGU7CisgIAorCisgIC8qKiBcaW50ZXJuYWwKKyAgICogQ29tcHV0ZXMgdGhlIHJvb3RzIG9mIHRoZSBjaGFyYWN0ZXJpc3RpYyBwb2x5bm9taWFsIG9mIFxhIG0uCisgICAqIEZvciBudW1lcmljYWwgc3RhYmlsaXR5IG0udHJhY2UoKSBzaG91bGQgYmUgbmVhciB6ZXJvIGFuZCB0byBhdm9pZCBvdmVyLSBvciB1bmRlcmZsb3cgbSBzaG91bGQgYmUgbm9ybWFsaXplZC4KKyAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb21wdXRlUm9vdHMoY29uc3QgTWF0cml4VHlwZSYgbSwgVmVjdG9yVHlwZSYgcm9vdHMpCisgIHsKKyAgICBFSUdFTl9VU0lOR19TVERfTUFUSChzcXJ0KQorICAgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGF0YW4yKQorICAgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGNvcykKKyAgICBFSUdFTl9VU0lOR19TVERfTUFUSChzaW4pCisgICAgY29uc3QgU2NhbGFyIHNfaW52MyA9IFNjYWxhcigxKS9TY2FsYXIoMyk7CisgICAgY29uc3QgU2NhbGFyIHNfc3FydDMgPSBzcXJ0KFNjYWxhcigzKSk7CisKKyAgICAvLyBUaGUgY2hhcmFjdGVyaXN0aWMgZXF1YXRpb24gaXMgeF4zIC0gYzIqeF4yICsgYzEqeCAtIGMwID0gMC4gIFRoZQorICAgIC8vIGVpZ2VudmFsdWVzIGFyZSB0aGUgcm9vdHMgdG8gdGhpcyBlcXVhdGlvbiwgYWxsIGd1YXJhbnRlZWQgdG8gYmUKKyAgICAvLyByZWFsLXZhbHVlZCwgYmVjYXVzZSB0aGUgbWF0cml4IGlzIHN5bW1ldHJpYy4KKyAgICBTY2FsYXIgYzAgPSBtKDAsMCkqbSgxLDEpKm0oMiwyKSArIFNjYWxhcigyKSptKDEsMCkqbSgyLDApKm0oMiwxKSAtIG0oMCwwKSptKDIsMSkqbSgyLDEpIC0gbSgxLDEpKm0oMiwwKSptKDIsMCkgLSBtKDIsMikqbSgxLDApKm0oMSwwKTsKKyAgICBTY2FsYXIgYzEgPSBtKDAsMCkqbSgxLDEpIC0gbSgxLDApKm0oMSwwKSArIG0oMCwwKSptKDIsMikgLSBtKDIsMCkqbSgyLDApICsgbSgxLDEpKm0oMiwyKSAtIG0oMiwxKSptKDIsMSk7CisgICAgU2NhbGFyIGMyID0gbSgwLDApICsgbSgxLDEpICsgbSgyLDIpOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gY2xhc3NpZnlpbmcgdGhlIHJvb3RzIG9mIHRoZSBlcXVhdGlvbgorICAgIC8vIGFuZCBpbiBzb2x2aW5nIHRoZSBlcXVhdGlvbiBmb3IgdGhlIHJvb3RzIGluIGNsb3NlZCBmb3JtLgorICAgIFNjYWxhciBjMl9vdmVyXzMgPSBjMipzX2ludjM7CisgICAgU2NhbGFyIGFfb3Zlcl8zID0gKGMyKmMyX292ZXJfMyAtIGMxKSpzX2ludjM7CisgICAgYV9vdmVyXzMgPSBudW1leHQ6Om1heGkoYV9vdmVyXzMsIFNjYWxhcigwKSk7CisKKyAgICBTY2FsYXIgaGFsZl9iID0gU2NhbGFyKDAuNSkqKGMwICsgYzJfb3Zlcl8zKihTY2FsYXIoMikqYzJfb3Zlcl8zKmMyX292ZXJfMyAtIGMxKSk7CisKKyAgICBTY2FsYXIgcSA9IGFfb3Zlcl8zKmFfb3Zlcl8zKmFfb3Zlcl8zIC0gaGFsZl9iKmhhbGZfYjsKKyAgICBxID0gbnVtZXh0OjptYXhpKHEsIFNjYWxhcigwKSk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBieSBzb2x2aW5nIGZvciB0aGUgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwuCisgICAgU2NhbGFyIHJobyA9IHNxcnQoYV9vdmVyXzMpOworICAgIFNjYWxhciB0aGV0YSA9IGF0YW4yKHNxcnQocSksaGFsZl9iKSpzX2ludjM7ICAvLyBzaW5jZSBzcXJ0KHEpID4gMCwgYXRhbjIgaXMgaW4gWzAsIHBpXSBhbmQgdGhldGEgaXMgaW4gWzAsIHBpLzNdCisgICAgU2NhbGFyIGNvc190aGV0YSA9IGNvcyh0aGV0YSk7CisgICAgU2NhbGFyIHNpbl90aGV0YSA9IHNpbih0aGV0YSk7CisgICAgLy8gcm9vdHMgYXJlIGFscmVhZHkgc29ydGVkLCBzaW5jZSBjb3MgaXMgbW9ub3RvbmljYWxseSBkZWNyZWFzaW5nIG9uIFswLCBwaV0KKyAgICByb290cygwKSA9IGMyX292ZXJfMyAtIHJobyooY29zX3RoZXRhICsgc19zcXJ0MypzaW5fdGhldGEpOyAvLyA9PSAyKnJobypjb3ModGhldGErMnBpLzMpCisgICAgcm9vdHMoMSkgPSBjMl9vdmVyXzMgLSByaG8qKGNvc190aGV0YSAtIHNfc3FydDMqc2luX3RoZXRhKTsgLy8gPT0gMipyaG8qY29zKHRoZXRhKyBwaS8zKQorICAgIHJvb3RzKDIpID0gYzJfb3Zlcl8zICsgU2NhbGFyKDIpKnJobypjb3NfdGhldGE7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIGJvb2wgZXh0cmFjdF9rZXJuZWwoTWF0cml4VHlwZSYgbWF0LCBSZWY8VmVjdG9yVHlwZT4gcmVzLCBSZWY8VmVjdG9yVHlwZT4gcmVwcmVzZW50YXRpdmUpCisgIHsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICBJbmRleCBpMDsKKyAgICAvLyBGaW5kIG5vbi16ZXJvIGNvbHVtbiBpMCAoYnkgY29uc3RydWN0aW9uLCB0aGVyZSBtdXN0IGV4aXN0IGEgbm9uIHplcm8gY29lZmZpY2llbnQgb24gdGhlIGRpYWdvbmFsKToKKyAgICBtYXQuZGlhZ29uYWwoKS5jd2lzZUFicygpLm1heENvZWZmKCZpMCk7CisgICAgLy8gbWF0LmNvbChpMCkgaXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IgYW4gb3J0aG9nb25hbCB2ZWN0b3IgdG8gdGhlIGN1cnJlbnQgZWlnZW52ZWN0b3IsCisgICAgLy8gc28gbGV0J3Mgc2F2ZSBpdDoKKyAgICByZXByZXNlbnRhdGl2ZSA9IG1hdC5jb2woaTApOworICAgIFNjYWxhciBuMCwgbjE7CisgICAgVmVjdG9yVHlwZSBjMCwgYzE7CisgICAgbjAgPSAoYzAgPSByZXByZXNlbnRhdGl2ZS5jcm9zcyhtYXQuY29sKChpMCsxKSUzKSkpLnNxdWFyZWROb3JtKCk7CisgICAgbjEgPSAoYzEgPSByZXByZXNlbnRhdGl2ZS5jcm9zcyhtYXQuY29sKChpMCsyKSUzKSkpLnNxdWFyZWROb3JtKCk7CisgICAgaWYobjA+bjEpIHJlcyA9IGMwL3N0ZDo6c3FydChuMCk7CisgICAgZWxzZSAgICAgIHJlcyA9IGMxL3N0ZDo6c3FydChuMSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oU29sdmVyVHlwZSYgc29sdmVyLCBjb25zdCBNYXRyaXhUeXBlJiBtYXQsIGludCBvcHRpb25zKQorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1hdC5jb2xzKCkgPT0gMyAmJiBtYXQuY29scygpID09IG1hdC5yb3dzKCkpOworICAgIGVpZ2VuX2Fzc2VydCgob3B0aW9ucyZ+KEVpZ1ZlY01hc2t8R2VuRWlnTWFzaykpPT0wCisgICAgICAgICAgICAmJiAob3B0aW9ucyZFaWdWZWNNYXNrKSE9RWlnVmVjTWFzaworICAgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOworICAgIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IChvcHRpb25zJkNvbXB1dGVFaWdlbnZlY3RvcnMpPT1Db21wdXRlRWlnZW52ZWN0b3JzOworICAgIAorICAgIEVpZ2VudmVjdG9yc1R5cGUmIGVpdmVjcyA9IHNvbHZlci5tX2VpdmVjOworICAgIFZlY3RvclR5cGUmIGVpdmFscyA9IHNvbHZlci5tX2VpdmFsdWVzOworICAKKyAgICAvLyBTaGlmdCB0aGUgbWF0cml4IHRvIHRoZSBtZWFuIGVpZ2VudmFsdWUgYW5kIG1hcCB0aGUgbWF0cml4IGNvZWZmaWNpZW50cyB0byBbLTE6MV0gdG8gYXZvaWQgb3Zlci0gYW5kIHVuZGVyZmxvdy4KKyAgICBTY2FsYXIgc2hpZnQgPSBtYXQudHJhY2UoKSAvIFNjYWxhcigzKTsKKyAgICAvLyBUT0RPIEF2b2lkIHRoaXMgY29weS4gQ3VycmVudGx5IGl0IGlzIG5lY2Vzc2FyeSB0byBzdXBwcmVzcyBib2d1cyB2YWx1ZXMgd2hlbiBkZXRlcm1pbmluZyBtYXhDb2VmZiBhbmQgZm9yIGNvbXB1dGluZyB0aGUgZWlnZW52ZWN0b3JzIGxhdGVyCisgICAgTWF0cml4VHlwZSBzY2FsZWRNYXQgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICAgIHNjYWxlZE1hdC5kaWFnb25hbCgpLmFycmF5KCkgLT0gc2hpZnQ7CisgICAgU2NhbGFyIHNjYWxlID0gc2NhbGVkTWF0LmN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgICBpZihzY2FsZSA+IDApIHNjYWxlZE1hdCAvPSBzY2FsZTsgICAvLyBUT0RPIGZvciBzY2FsZT09MCB3ZSBjb3VsZCBzYXZlIHRoZSByZW1haW5pbmcgb3BlcmF0aW9ucworCisgICAgLy8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKKyAgICBjb21wdXRlUm9vdHMoc2NhbGVkTWF0LGVpdmFscyk7CisKKyAgICAvLyBjb21wdXRlIHRoZSBlaWdlbnZlY3RvcnMKKyAgICBpZihjb21wdXRlRWlnZW52ZWN0b3JzKQorICAgIHsKKyAgICAgIGlmKChlaXZhbHMoMiktZWl2YWxzKDApKTw9RWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpCisgICAgICB7CisgICAgICAgIC8vIEFsbCB0aHJlZSBlaWdlbnZhbHVlcyBhcmUgbnVtZXJpY2FsbHkgdGhlIHNhbWUKKyAgICAgICAgZWl2ZWNzLnNldElkZW50aXR5KCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIE1hdHJpeFR5cGUgdG1wOworICAgICAgICB0bXAgPSBzY2FsZWRNYXQ7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZWlnZW52ZWN0b3Igb2YgdGhlIG1vc3QgZGlzdGluY3QgZWlnZW52YWx1ZQorICAgICAgICBTY2FsYXIgZDAgPSBlaXZhbHMoMikgLSBlaXZhbHMoMSk7CisgICAgICAgIFNjYWxhciBkMSA9IGVpdmFscygxKSAtIGVpdmFscygwKTsKKyAgICAgICAgSW5kZXggaygwKSwgbCgyKTsKKyAgICAgICAgaWYoZDAgPiBkMSkKKyAgICAgICAgeworICAgICAgICAgIG51bWV4dDo6c3dhcChrLGwpOworICAgICAgICAgIGQwID0gZDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIHRoZSBlaWdlbnZlY3RvciBvZiBpbmRleCBrCisgICAgICAgIHsKKyAgICAgICAgICB0bXAuZGlhZ29uYWwoKS5hcnJheSAoKSAtPSBlaXZhbHMoayk7CisgICAgICAgICAgLy8gQnkgY29uc3RydWN0aW9uLCAndG1wJyBpcyBvZiByYW5rIDIsIGFuZCBpdHMga2VybmVsIGNvcnJlc3BvbmRzIHRvIHRoZSByZXNwZWN0aXZlIGVpZ2VudmVjdG9yLgorICAgICAgICAgIGV4dHJhY3Rfa2VybmVsKHRtcCwgZWl2ZWNzLmNvbChrKSwgZWl2ZWNzLmNvbChsKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wdXRlIGVpZ2VudmVjdG9yIG9mIGluZGV4IGwKKyAgICAgICAgaWYoZDA8PTIqRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkqZDEpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBJZiBkMCBpcyB0b28gc21hbGwsIHRoZW4gdGhlIHR3byBvdGhlciBlaWdlbnZhbHVlcyBhcmUgbnVtZXJpY2FsbHkgdGhlIHNhbWUsCisgICAgICAgICAgLy8gYW5kIHRodXMgd2Ugb25seSBoYXZlIHRvIG9ydGhvLW5vcm1hbGl6ZSB0aGUgbmVhciBvcnRob2dvbmFsIHZlY3RvciB3ZSBzYXZlZCBhYm92ZS4KKyAgICAgICAgICBlaXZlY3MuY29sKGwpIC09IGVpdmVjcy5jb2woaykuZG90KGVpdmVjcy5jb2wobCkpKmVpdmVjcy5jb2wobCk7CisgICAgICAgICAgZWl2ZWNzLmNvbChsKS5ub3JtYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0bXAgPSBzY2FsZWRNYXQ7CisgICAgICAgICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkgKCkgLT0gZWl2YWxzKGwpOworCisgICAgICAgICAgVmVjdG9yVHlwZSBkdW1teTsKKyAgICAgICAgICBleHRyYWN0X2tlcm5lbCh0bXAsIGVpdmVjcy5jb2wobCksIGR1bW15KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXB1dGUgbGFzdCBlaWdlbnZlY3RvciBmcm9tIHRoZSBvdGhlciB0d28KKyAgICAgICAgZWl2ZWNzLmNvbCgxKSA9IGVpdmVjcy5jb2woMikuY3Jvc3MoZWl2ZWNzLmNvbCgwKSkubm9ybWFsaXplZCgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJlc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZS4KKyAgICBlaXZhbHMgKj0gc2NhbGU7CisgICAgZWl2YWxzLmFycmF5KCkgKz0gc2hpZnQ7CisgICAgCisgICAgc29sdmVyLm1faW5mbyA9IFN1Y2Nlc3M7CisgICAgc29sdmVyLm1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgc29sdmVyLm1fZWlnZW52ZWN0b3JzT2sgPSBjb21wdXRlRWlnZW52ZWN0b3JzOworICB9Cit9OworCisvLyAyeDIgZGlyZWN0IGVpZ2VudmFsdWVzIGRlY29tcG9zaXRpb24sIGNvZGUgZnJvbSBIYXVrZSBIZWliZWwKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlclR5cGU+IAorc3RydWN0IGRpcmVjdF9zZWxmYWRqb2ludF9laWdlbnZhbHVlczxTb2x2ZXJUeXBlLDIsZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlclR5cGU6OlJlYWxWZWN0b3JUeXBlIFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXJUeXBlOjpFaWdlbnZlY3RvcnNUeXBlIEVpZ2VudmVjdG9yc1R5cGU7CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgY29tcHV0ZVJvb3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0sIFZlY3RvclR5cGUmIHJvb3RzKQorICB7CisgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgIGNvbnN0IFNjYWxhciB0MCA9IFNjYWxhcigwLjUpICogc3FydCggbnVtZXh0OjphYnMyKG0oMCwwKS1tKDEsMSkpICsgU2NhbGFyKDQpKm51bWV4dDo6YWJzMihtKDEsMCkpKTsKKyAgICBjb25zdCBTY2FsYXIgdDEgPSBTY2FsYXIoMC41KSAqIChtKDAsMCkgKyBtKDEsMSkpOworICAgIHJvb3RzKDApID0gdDEgLSB0MDsKKyAgICByb290cygxKSA9IHQxICsgdDA7CisgIH0KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oU29sdmVyVHlwZSYgc29sdmVyLCBjb25zdCBNYXRyaXhUeXBlJiBtYXQsIGludCBvcHRpb25zKQorICB7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoc3FydCk7CisgICAgRUlHRU5fVVNJTkdfU1REX01BVEgoYWJzKTsKKyAgICAKKyAgICBlaWdlbl9hc3NlcnQobWF0LmNvbHMoKSA9PSAyICYmIG1hdC5jb2xzKCkgPT0gbWF0LnJvd3MoKSk7CisgICAgZWlnZW5fYXNzZXJ0KChvcHRpb25zJn4oRWlnVmVjTWFza3xHZW5FaWdNYXNrKSk9PTAKKyAgICAgICAgICAgICYmIChvcHRpb25zJkVpZ1ZlY01hc2spIT1FaWdWZWNNYXNrCisgICAgICAgICAgICAmJiAiaW52YWxpZCBvcHRpb24gcGFyYW1ldGVyIik7CisgICAgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gKG9wdGlvbnMmQ29tcHV0ZUVpZ2VudmVjdG9ycyk9PUNvbXB1dGVFaWdlbnZlY3RvcnM7CisgICAgCisgICAgRWlnZW52ZWN0b3JzVHlwZSYgZWl2ZWNzID0gc29sdmVyLm1fZWl2ZWM7CisgICAgVmVjdG9yVHlwZSYgZWl2YWxzID0gc29sdmVyLm1fZWl2YWx1ZXM7CisgIAorICAgIC8vIFNoaWZ0IHRoZSBtYXRyaXggdG8gdGhlIG1lYW4gZWlnZW52YWx1ZSBhbmQgbWFwIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIHRvIFstMToxXSB0byBhdm9pZCBvdmVyLSBhbmQgdW5kZXJmbG93LgorICAgIFNjYWxhciBzaGlmdCA9IG1hdC50cmFjZSgpIC8gU2NhbGFyKDIpOworICAgIE1hdHJpeFR5cGUgc2NhbGVkTWF0ID0gbWF0OworICAgIHNjYWxlZE1hdC5jb2VmZlJlZigwLDEpID0gbWF0LmNvZWZmKDEsMCk7CisgICAgc2NhbGVkTWF0LmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBzaGlmdDsKKyAgICBTY2FsYXIgc2NhbGUgPSBzY2FsZWRNYXQuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICAgIGlmKHNjYWxlID4gU2NhbGFyKDApKQorICAgICAgc2NhbGVkTWF0IC89IHNjYWxlOworCisgICAgLy8gQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKKyAgICBjb21wdXRlUm9vdHMoc2NhbGVkTWF0LGVpdmFscyk7CisKKyAgICAvLyBjb21wdXRlIHRoZSBlaWdlbiB2ZWN0b3JzCisgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICB7CisgICAgICBpZigoZWl2YWxzKDEpLWVpdmFscygwKSk8PWFicyhlaXZhbHMoMSkpKkVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgeworICAgICAgICBlaXZlY3Muc2V0SWRlbnRpdHkoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2NhbGVkTWF0LmRpYWdvbmFsKCkuYXJyYXkgKCkgLT0gZWl2YWxzKDEpOworICAgICAgICBTY2FsYXIgYTIgPSBudW1leHQ6OmFiczIoc2NhbGVkTWF0KDAsMCkpOworICAgICAgICBTY2FsYXIgYzIgPSBudW1leHQ6OmFiczIoc2NhbGVkTWF0KDEsMSkpOworICAgICAgICBTY2FsYXIgYjIgPSBudW1leHQ6OmFiczIoc2NhbGVkTWF0KDEsMCkpOworICAgICAgICBpZihhMj5jMikKKyAgICAgICAgeworICAgICAgICAgIGVpdmVjcy5jb2woMSkgPDwgLXNjYWxlZE1hdCgxLDApLCBzY2FsZWRNYXQoMCwwKTsKKyAgICAgICAgICBlaXZlY3MuY29sKDEpIC89IHNxcnQoYTIrYjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGVpdmVjcy5jb2woMSkgPDwgLXNjYWxlZE1hdCgxLDEpLCBzY2FsZWRNYXQoMSwwKTsKKyAgICAgICAgICBlaXZlY3MuY29sKDEpIC89IHNxcnQoYzIrYjIpOworICAgICAgICB9CisKKyAgICAgICAgZWl2ZWNzLmNvbCgwKSA8PCBlaXZlY3MuY29sKDEpLnVuaXRPcnRob2dvbmFsKCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplLgorICAgIGVpdmFscyAqPSBzY2FsZTsKKyAgICBlaXZhbHMuYXJyYXkoKSArPSBzaGlmdDsKKworICAgIHNvbHZlci5tX2luZm8gPSBTdWNjZXNzOworICAgIHNvbHZlci5tX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHNvbHZlci5tX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgfQorfTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4mIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4KKzo6Y29tcHV0ZURpcmVjdChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGludCBvcHRpb25zKQoreworICBpbnRlcm5hbDo6ZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzPFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIsU2l6ZSxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4Pjo6cnVuKCp0aGlzLG1hdHJpeCxvcHRpb25zKTsKKyAgcmV0dXJuICp0aGlzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlcix0eXBlbmFtZSBSZWFsU2NhbGFyLCB0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4PgorRUlHRU5fREVWSUNFX0ZVTkMKK3N0YXRpYyB2b2lkIHRyaWRpYWdvbmFsX3FyX3N0ZXAoUmVhbFNjYWxhciogZGlhZywgUmVhbFNjYWxhciogc3ViZGlhZywgSW5kZXggc3RhcnQsIEluZGV4IGVuZCwgU2NhbGFyKiBtYXRyaXhRLCBJbmRleCBuKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgUmVhbFNjYWxhciB0ZCA9IChkaWFnW2VuZC0xXSAtIGRpYWdbZW5kXSkqUmVhbFNjYWxhcigwLjUpOworICBSZWFsU2NhbGFyIGUgPSBzdWJkaWFnW2VuZC0xXTsKKyAgLy8gTm90ZSB0aGF0IHRoYW5rcyB0byBzY2FsaW5nLCBlXjIgb3IgdGReMiBjYW5ub3Qgb3ZlcmZsb3csIGhvd2V2ZXIgdGhleSBjYW4gc3RpbGwKKyAgLy8gdW5kZXJmbG93IHRodXMgbGVhZGluZyB0byBpbmYvTmFOIHZhbHVlcyB3aGVuIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWVudGVkIGNvZGU6CisvLyAgIFJlYWxTY2FsYXIgZTIgPSBudW1leHQ6OmFiczIoc3ViZGlhZ1tlbmQtMV0pOworLy8gICBSZWFsU2NhbGFyIG11ID0gZGlhZ1tlbmRdIC0gZTIgLyAodGQgKyAodGQ+MCA/IDEgOiAtMSkgKiBzcXJ0KHRkKnRkICsgZTIpKTsKKyAgLy8gVGhpcyBleHBsYWluIHRoZSBmb2xsb3dpbmcsIHNvbWV3aGF0IG1vcmUgY29tcGxpY2F0ZWQsIHZlcnNpb246CisgIFJlYWxTY2FsYXIgbXUgPSBkaWFnW2VuZF07CisgIGlmKHRkPT1SZWFsU2NhbGFyKDApKQorICAgIG11IC09IGFicyhlKTsKKyAgZWxzZQorICB7CisgICAgUmVhbFNjYWxhciBlMiA9IG51bWV4dDo6YWJzMihzdWJkaWFnW2VuZC0xXSk7CisgICAgUmVhbFNjYWxhciBoID0gbnVtZXh0OjpoeXBvdCh0ZCxlKTsKKyAgICBpZihlMj09UmVhbFNjYWxhcigwKSkgbXUgLT0gKGUgLyAodGQgKyAodGQ+UmVhbFNjYWxhcigwKSA/IFJlYWxTY2FsYXIoMSkgOiBSZWFsU2NhbGFyKC0xKSkpKSAqIChlIC8gaCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgIG11IC09IGUyIC8gKHRkICsgKHRkPlJlYWxTY2FsYXIoMCkgPyBoIDogLWgpKTsKKyAgfQorICAKKyAgUmVhbFNjYWxhciB4ID0gZGlhZ1tzdGFydF0gLSBtdTsKKyAgUmVhbFNjYWxhciB6ID0gc3ViZGlhZ1tzdGFydF07CisgIGZvciAoSW5kZXggayA9IHN0YXJ0OyBrIDwgZW5kOyArK2spCisgIHsKKyAgICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiByb3Q7CisgICAgcm90Lm1ha2VHaXZlbnMoeCwgeik7CisKKyAgICAvLyBkbyBUID0gRycgVCBHCisgICAgUmVhbFNjYWxhciBzZGsgPSByb3QucygpICogZGlhZ1trXSArIHJvdC5jKCkgKiBzdWJkaWFnW2tdOworICAgIFJlYWxTY2FsYXIgZGtwMSA9IHJvdC5zKCkgKiBzdWJkaWFnW2tdICsgcm90LmMoKSAqIGRpYWdbaysxXTsKKworICAgIGRpYWdba10gPSByb3QuYygpICogKHJvdC5jKCkgKiBkaWFnW2tdIC0gcm90LnMoKSAqIHN1YmRpYWdba10pIC0gcm90LnMoKSAqIChyb3QuYygpICogc3ViZGlhZ1trXSAtIHJvdC5zKCkgKiBkaWFnW2srMV0pOworICAgIGRpYWdbaysxXSA9IHJvdC5zKCkgKiBzZGsgKyByb3QuYygpICogZGtwMTsKKyAgICBzdWJkaWFnW2tdID0gcm90LmMoKSAqIHNkayAtIHJvdC5zKCkgKiBka3AxOworICAgIAorCisgICAgaWYgKGsgPiBzdGFydCkKKyAgICAgIHN1YmRpYWdbayAtIDFdID0gcm90LmMoKSAqIHN1YmRpYWdbay0xXSAtIHJvdC5zKCkgKiB6OworCisgICAgeCA9IHN1YmRpYWdba107CisKKyAgICBpZiAoayA8IGVuZCAtIDEpCisgICAgeworICAgICAgeiA9IC1yb3QucygpICogc3ViZGlhZ1trKzFdOworICAgICAgc3ViZGlhZ1trICsgMV0gPSByb3QuYygpICogc3ViZGlhZ1trKzFdOworICAgIH0KKyAgICAKKyAgICAvLyBhcHBseSB0aGUgZ2l2ZW5zIHJvdGF0aW9uIHRvIHRoZSB1bml0IG1hdHJpeCBRID0gUSAqIEcKKyAgICBpZiAobWF0cml4USkKKyAgICB7CisgICAgICAvLyBGSVhNRSBpZiBTdG9yYWdlT3JkZXIgPT0gUm93TWFqb3IgdGhpcyBvcGVyYXRpb24gaXMgbm90IHZlcnkgZWZmaWNpZW50CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsU3RvcmFnZU9yZGVyPiA+IHEobWF0cml4USxuLG4pOworICAgICAgcS5hcHBseU9uVGhlUmlnaHQoayxrKzEscm90KTsKKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9MQVBBQ0tFLmggYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5MWNmOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX0xBUEFDS0UuaApAQCAtMCwwICsxLDkwIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gTEFQQUNLZQorICogICAgU2VsZi1hZGpvaW50IGVpZ2VudmFsdWVzL2VpZ2VudmVjdG9ycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9TQUVJR0VOU09MVkVSX0xBUEFDS0VfSAorI2RlZmluZSBFSUdFTl9TQUVJR0VOU09MVkVSX0xBUEFDS0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbnRlcm5hbCBTcGVjaWFsaXphdGlvbiBmb3IgdGhlIGRhdGEgdHlwZXMgc3VwcG9ydGVkIGJ5IExBUEFDS2UgKi8KKworI2RlZmluZSBFSUdFTl9MQVBBQ0tFX0VJR19TRUxGQURKKEVJR1RZUEUsIExBUEFDS0VfVFlQRSwgTEFQQUNLRV9SVFlQRSwgTEFQQUNLRV9OQU1FLCBFSUdDT0xST1csIExBUEFDS0VfQ09MUk9XICkgXAordGVtcGxhdGU8PiB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+IGlubGluZSBcCitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+ID4mIFwKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4LCBpbnQgb3B0aW9ucykgXAoreyBcCisgIGVpZ2VuX2Fzc2VydChtYXRyaXguY29scygpID09IG1hdHJpeC5yb3dzKCkpOyBcCisgIGVpZ2VuX2Fzc2VydCgob3B0aW9ucyZ+KEVpZ1ZlY01hc2t8R2VuRWlnTWFzaykpPT0wIFwKKyAgICAgICAgICAmJiAob3B0aW9ucyZFaWdWZWNNYXNrKSE9RWlnVmVjTWFzayBcCisgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOyBcCisgIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IChvcHRpb25zJkNvbXB1dGVFaWdlbnZlY3RvcnMpPT1Db21wdXRlRWlnZW52ZWN0b3JzOyBcCisgIGxhcGFja19pbnQgbiA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1hdHJpeC5jb2xzKCkpLCBsZGEsIG1hdHJpeF9vcmRlciwgaW5mbzsgXAorICBtX2VpdmFsdWVzLnJlc2l6ZShuLDEpOyBcCisgIG1fc3ViZGlhZy5yZXNpemUobi0xKTsgXAorICBtX2VpdmVjID0gbWF0cml4OyBcCitcCisgIGlmKG49PTEpIFwKKyAgeyBcCisgICAgbV9laXZhbHVlcy5jb2VmZlJlZigwLDApID0gbnVtZXh0OjpyZWFsKG1fZWl2ZWMuY29lZmYoMCwwKSk7IFwKKyAgICBpZihjb21wdXRlRWlnZW52ZWN0b3JzKSBtX2VpdmVjLnNldE9uZXMobixuKTsgXAorICAgIG1faW5mbyA9IFN1Y2Nlc3M7IFwKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgICAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7IFwKKyAgICByZXR1cm4gKnRoaXM7IFwKKyAgfSBcCitcCisgIGxkYSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1fZWl2ZWMub3V0ZXJTdHJpZGUoKSk7IFwKKyAgbWF0cml4X29yZGVyPUxBUEFDS0VfQ09MUk9XOyBcCisgIGNoYXIgam9ieiwgdXBsbz0nTCcvKiwgcmFuZ2U9J0EnKi87IFwKKyAgam9ieiA9IGNvbXB1dGVFaWdlbnZlY3RvcnMgPyAnVicgOiAnTic7IFwKK1wKKyAgaW5mbyA9IExBUEFDS0VfIyNMQVBBQ0tFX05BTUUoIG1hdHJpeF9vcmRlciwgam9ieiwgdXBsbywgbiwgKExBUEFDS0VfVFlQRSopbV9laXZlYy5kYXRhKCksIGxkYSwgKExBUEFDS0VfUlRZUEUqKW1fZWl2YWx1ZXMuZGF0YSgpICk7IFwKKyAgbV9pbmZvID0gKGluZm89PTApID8gU3VjY2VzcyA6IE5vQ29udmVyZ2VuY2U7IFwKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsgXAorICBtX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsgXAorICByZXR1cm4gKnRoaXM7IFwKK30KKworCitFSUdFTl9MQVBBQ0tFX0VJR19TRUxGQURKKGRvdWJsZSwgICBkb3VibGUsICAgICAgICAgICAgICAgIGRvdWJsZSwgZHN5ZXYsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTEFQQUNLRV9FSUdfU0VMRkFESihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgICAgICAgICBmbG9hdCwgIHNzeWV2LCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX0xBUEFDS0VfRUlHX1NFTEZBREooZGNvbXBsZXgsIGxhcGFja19jb21wbGV4X2RvdWJsZSwgZG91YmxlLCB6aGVldiwgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX0VJR19TRUxGQURKKHNjb21wbGV4LCBsYXBhY2tfY29tcGxleF9mbG9hdCwgIGZsb2F0LCAgY2hlZXYsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorCitFSUdFTl9MQVBBQ0tFX0VJR19TRUxGQURKKGRvdWJsZSwgICBkb3VibGUsICAgICAgICAgICAgICAgIGRvdWJsZSwgZHN5ZXYsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTEFQQUNLRV9FSUdfU0VMRkFESihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgICAgICAgICBmbG9hdCwgIHNzeWV2LCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX0xBUEFDS0VfRUlHX1NFTEZBREooZGNvbXBsZXgsIGxhcGFja19jb21wbGV4X2RvdWJsZSwgZG91YmxlLCB6aGVldiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX0VJR19TRUxGQURKKHNjb21wbGV4LCBsYXBhY2tfY29tcGxleF9mbG9hdCwgIGZsb2F0LCAgY2hlZXYsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NBRUlHRU5TT0xWRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1RyaWRpYWdvbmFsaXphdGlvbi5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1RyaWRpYWdvbmFsaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTAyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvVHJpZGlhZ29uYWxpemF0aW9uLmgKQEAgLTAsMCArMSw1NTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSURJQUdPTkFMSVpBVElPTl9ICisjZGVmaW5lIEVJR0VOX1RSSURJQUdPTkFMSVpBVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBUcmlkaWFnb25hbGl6YXRpb25NYXRyaXhUUmV0dXJuVHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRyaWRpYWdvbmFsaXphdGlvbk1hdHJpeFRSZXR1cm5UeXBlPE1hdHJpeFR5cGU+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7IC8vIEZJWE1FIHNoYWxsIGl0IGJlIGEgQmFuZE1hdHJpeD8KKyAgZW51bSB7IEZsYWdzID0gMCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQ29lZmZWZWN0b3JUeXBlPgordm9pZCB0cmlkaWFnb25hbGl6YXRpb25faW5wbGFjZShNYXRyaXhUeXBlJiBtYXRBLCBDb2VmZlZlY3RvclR5cGUmIGhDb2VmZnMpOworfQorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIFRyaWRpYWdvbmFsaXphdGlvbgorICAqCisgICogXGJyaWVmIFRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBzZWxmYWRqb2ludCBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAqIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUKKyAgKiBNYXRyaXggY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGEgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhIHNlbGZhZGpvaW50IG1hdHJpeCBcZiQgQSBcZiQgc3VjaCB0aGF0OgorICAqIFxmJCBBID0gUSBUIFFeKiBcZiQgd2hlcmUgXGYkIFEgXGYkIGlzIHVuaXRhcnkgYW5kIFxmJCBUIFxmJCBhIHJlYWwgc3ltbWV0cmljIHRyaWRpYWdvbmFsIG1hdHJpeC4KKyAgKgorICAqIEEgdHJpZGlhZ29uYWwgbWF0cml4IGlzIGEgbWF0cml4IHdoaWNoIGhhcyBub256ZXJvIGVsZW1lbnRzIG9ubHkgb24gdGhlCisgICogbWFpbiBkaWFnb25hbCBhbmQgdGhlIGZpcnN0IGRpYWdvbmFsIGJlbG93IGFuZCBhYm92ZSBpdC4gVGhlIEhlc3NlbmJlcmcKKyAgKiBkZWNvbXBvc2l0aW9uIG9mIGEgc2VsZmFkam9pbnQgbWF0cml4IGlzIGluIGZhY3QgYSB0cmlkaWFnb25hbAorICAqIGRlY29tcG9zaXRpb24uIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIGNvbXB1dGUgdGhlCisgICogZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIHNlbGZhZGpvaW50IG1hdHJpeC4KKyAgKgorICAqIENhbGwgdGhlIGZ1bmN0aW9uIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEKKyAgKiBnaXZlbiBtYXRyaXguIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgICogY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMgdGhlIHRyaWRpYWdvbmFsIFNjaHVyIGRlY29tcG9zaXRpb24gYXQKKyAgKiBjb25zdHJ1Y3Rpb24gdGltZS4gT25jZSB0aGUgZGVjb21wb3NpdGlvbiBpcyBjb21wdXRlZCwgeW91IGNhbiB1c2UgdGhlCisgICogbWF0cml4USgpIGFuZCBtYXRyaXhUKCkgZnVuY3Rpb25zIHRvIHJldHJpZXZlIHRoZSBtYXRyaWNlcyBRIGFuZCBUIGluIHRoZQorICAqIGRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIGNvbnRhaW5zIGFuCisgICogZXhhbXBsZSBvZiB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgKgorICAqIFxzYSBjbGFzcyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbiwgY2xhc3MgU2VsZkFkam9pbnRFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIFRyaWRpYWdvbmFsaXphdGlvbgoreworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIFN5bm9ueW0gZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXHAgX01hdHJpeFR5cGUuICovCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKworICAgIGVudW0geworICAgICAgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgU2l6ZU1pbnVzT25lID0gU2l6ZSA9PSBEeW5hbWljID8gRHluYW1pYyA6IChTaXplID4gMSA/IFNpemUgLSAxIDogMSksCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgIE1heFNpemUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFNpemVNaW51c09uZSA9IE1heFNpemUgPT0gRHluYW1pYyA/IER5bmFtaWMgOiAoTWF4U2l6ZSA+IDEgPyBNYXhTaXplIC0gMSA6IDEpCisgICAgfTsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZU1pbnVzT25lLCAxLCBPcHRpb25zICYgflJvd01ham9yLCBNYXhTaXplTWludXNPbmUsIDE+IENvZWZmVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlLCBSZWFsU2NhbGFyPjo6dHlwZSBEaWFnb25hbFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgU2l6ZU1pbnVzT25lLCAxLCBPcHRpb25zICYgflJvd01ham9yLCBNYXhTaXplTWludXNPbmUsIDE+IFN1YkRpYWdvbmFsVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxSZXR1cm5UeXBlPjo6dHlwZSBNYXRyaXhUeXBlUmVhbFZpZXc7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGU8TWF0cml4VHlwZVJlYWxWaWV3PiBNYXRyaXhUUmV0dXJuVHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPjo6UmVhbFJldHVyblR5cGU+Ojp0eXBlLAorICAgICAgICAgICAgICBjb25zdCBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPgorICAgICAgICAgICAgPjo6dHlwZSBEaWFnb25hbFJldHVyblR5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8dHlwZW5hbWUgRGlhZ29uYWw8Y29uc3QgTWF0cml4VHlwZSwgLTE+OjpSZWFsUmV0dXJuVHlwZT46OnR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IERpYWdvbmFsPGNvbnN0IE1hdHJpeFR5cGUsIC0xPgorICAgICAgICAgICAgPjo6dHlwZSBTdWJEaWFnb25hbFJldHVyblR5cGU7CisKKyAgICAvKiogXGJyaWVmIFJldHVybiB0eXBlIG9mIG1hdHJpeFEoKSAqLworICAgIHR5cGVkZWYgSG91c2Vob2xkZXJTZXF1ZW5jZTxNYXRyaXhUeXBlLHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIENvZWZmVmVjdG9yVHlwZTo6Q29uanVnYXRlUmV0dXJuVHlwZT46OnR5cGU+IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSAgc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlIHRyaWRpYWdvbmFsCisgICAgICAqIGRlY29tcG9zaXRpb24gd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLiAgVGhlIFxwIHNpemUgcGFyYW1ldGVyIGlzIG9ubHkKKyAgICAgICogdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEgd3JvbmcgXHAgc2l6ZSwgYnV0IGl0IG1heQorICAgICAgKiBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworICAgIGV4cGxpY2l0IFRyaWRpYWdvbmFsaXphdGlvbihJbmRleCBzaXplID0gU2l6ZT09RHluYW1pYyA/IDIgOiBTaXplKQorICAgICAgOiBtX21hdHJpeChzaXplLHNpemUpLAorICAgICAgICBtX2hDb2VmZnMoc2l6ZSA+IDEgPyBzaXplLTEgOiAxKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICBTZWxmYWRqb2ludCBtYXRyaXggd2hvc2UgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbgorICAgICAgKiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX1RyaWRpYWdvbmFsaXphdGlvbl9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBUcmlkaWFnb25hbGl6YXRpb25fVHJpZGlhZ29uYWxpemF0aW9uX01hdHJpeFR5cGUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4LmRlcml2ZWQoKSksCisgICAgICAgIG1faENvZWZmcyhtYXRyaXguY29scygpID4gMSA/IG1hdHJpeC5jb2xzKCktMSA6IDEpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgaW50ZXJuYWw6OnRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlKG1fbWF0cml4LCBtX2hDb2VmZnMpOworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNlbGZhZGpvaW50IG1hdHJpeCB3aG9zZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uCisgICAgICAqIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccmV0dXJucyAgICBSZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogVGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gaXMgY29tcHV0ZWQgYnkgYnJpbmdpbmcgdGhlIGNvbHVtbnMgb2YKKyAgICAgICogdGhlIG1hdHJpeCBzdWNjZXNzaXZlbHkgaW4gdGhlIHJlcXVpcmVkIGZvcm0gdXNpbmcgSG91c2Vob2xkZXIKKyAgICAgICogcmVmbGVjdGlvbnMuIFRoZSBjb3N0IGlzIFxmJCA0bl4zLzMgXGYkIGZsb3BzLCB3aGVyZSBcZiQgbiBcZiQgZGVub3RlcworICAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCByZXVzZXMgb2YgdGhlIGFsbG9jYXRlZCBkYXRhIGluIHRoZSBUcmlkaWFnb25hbGl6YXRpb24KKyAgICAgICogb2JqZWN0LCBpZiB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2NvbXB1dGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9jb21wdXRlLm91dAorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgVHJpZGlhZ29uYWxpemF0aW9uJiBjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgeworICAgICAgbV9tYXRyaXggPSBtYXRyaXguZGVyaXZlZCgpOworICAgICAgbV9oQ29lZmZzLnJlc2l6ZShtYXRyaXgucm93cygpLTEsIDEpOworICAgICAgaW50ZXJuYWw6OnRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlKG1fbWF0cml4LCBtX2hDb2VmZnMpOworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cy4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZlY3RvciBvZiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJikgb3IKKyAgICAgICogdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgYWxsb3cgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBtYXRyaXgKKyAgICAgICogXGYkIFEgXGYkIGluIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIGZyb20gdGhlIHBhY2tlZCBkYXRhLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUcmlkaWFnb25hbGl6YXRpb25faG91c2Vob2xkZXJDb2VmZmljaWVudHMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIHBhY2tlZE1hdHJpeCgpLCBccmVmIEhvdXNlaG9sZGVyX01vZHVsZSAiSG91c2Vob2xkZXIgbW9kdWxlIgorICAgICAgKi8KKyAgICBpbmxpbmUgQ29lZmZWZWN0b3JUeXBlIGhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJUcmlkaWFnb25hbGl6YXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faENvZWZmczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWNvbXBvc2l0aW9uCisgICAgICAqCisgICAgICAqCVxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgbWF0cml4IHdpdGggdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisgICAgICAqCSAgICAgICAgIG9mIHRoZSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBvcgorICAgICAgKiB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUKKyAgICAgICogdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhlIHJldHVybmVkIG1hdHJpeCBjb250YWlucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorICAgICAgKiAgLSB0aGUgc3RyaWN0IHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBpcyBlcXVhbCB0byB0aGUgaW5wdXQgbWF0cml4IEEuCisgICAgICAqICAtIHRoZSBkaWFnb25hbCBhbmQgbG93ZXIgc3ViLWRpYWdvbmFsIHJlcHJlc2VudCB0aGUgcmVhbCB0cmlkaWFnb25hbAorICAgICAgKiAgICBzeW1tZXRyaWMgbWF0cml4IFQuCisgICAgICAqICAtIHRoZSByZXN0IG9mIHRoZSBsb3dlciBwYXJ0IGNvbnRhaW5zIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzIHRoYXQsCisgICAgICAqICAgIGNvbWJpbmVkIHdpdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIHJldHVybmVkIGJ5CisgICAgICAqICAgIGhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCksIGFsbG93cyB0byByZWNvbnN0cnVjdCB0aGUgbWF0cml4IFEgYXMKKyAgICAgICogICAgICAgXGYkIFEgPSBIX3tOLTF9IFxsZG90cyBIXzEgSF8wIFxmJC4KKyAgICAgICogICAgSGVyZSwgdGhlIG1hdHJpY2VzIFxmJCBIX2kgXGYkIGFyZSB0aGUgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb25zCisgICAgICAqICAgICAgIFxmJCBIX2kgPSAoSSAtIGhfaSB2X2kgdl9pXlQpIFxmJAorICAgICAgKiAgICB3aGVyZSBcZiQgaF9pIFxmJCBpcyB0aGUgXGYkIGkgXGYkdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgYW5kCisgICAgICAqICAgIFxmJCB2X2kgXGYkIGlzIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3IgZGVmaW5lZCBieQorICAgICAgKiAgICAgICBcZiQgdl9pID0gWyAwLCBcbGRvdHMsIDAsIDEsIE0oaSsyLGkpLCBcbGRvdHMsIE0oTi0xLGkpIF1eVCBcZiQKKyAgICAgICogICAgd2l0aCBNIHRoZSBtYXRyaXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICogU2VlIExBUEFDSyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgcGFja2VkIHN0b3JhZ2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXguY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXgub3V0CisgICAgICAqCisgICAgICAqIFxzYSBob3VzZWhvbGRlckNvZWZmaWNpZW50cygpCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBwYWNrZWRNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9tYXRyaXg7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSB1bml0YXJ5IG1hdHJpeCBRIGluIHRoZSBkZWNvbXBvc2l0aW9uCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG1hdHJpeCBRCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIG9yCisgICAgICAqIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBsaWdodC13ZWlnaHQgb2JqZWN0IG9mIHRlbXBsYXRlIGNsYXNzCisgICAgICAqIEhvdXNlaG9sZGVyU2VxdWVuY2UuIFlvdSBjYW4gZWl0aGVyIGFwcGx5IGl0IGRpcmVjdGx5IHRvIGEgbWF0cml4IG9yCisgICAgICAqIHlvdSBjYW4gY29udmVydCBpdCB0byBhIG1hdHJpeCBvZiB0eXBlICNNYXRyaXhUeXBlLgorICAgICAgKgorICAgICAgKiBcc2EgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBmb3IgYW4gZXhhbXBsZSwKKyAgICAgICogICAgIG1hdHJpeFQoKSwgY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZQorICAgICAgKi8KKyAgICBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZSBtYXRyaXhRKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJUcmlkaWFnb25hbGl6YXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlKG1fbWF0cml4LCBtX2hDb2VmZnMuY29uanVnYXRlKCkpCisgICAgICAgICAgICAgLnNldExlbmd0aChtX21hdHJpeC5yb3dzKCkgLSAxKQorICAgICAgICAgICAgIC5zZXRTaGlmdCgxKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgZXhwcmVzc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggVAorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBvcgorICAgICAgKiB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUKKyAgICAgICogdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIG1hdHJpeCBUIGZyb20gaW50ZXJuYWwKKyAgICAgICogZGF0YSBhbmQgY29weSBpdCB0byBhIGRlbnNlIG1hdHJpeCBvYmplY3QuIEluIG1vc3QgY2FzZXMsIGl0IG1heSBiZQorICAgICAgKiBzdWZmaWNpZW50IHRvIGRpcmVjdGx5IHVzZSB0aGUgcGFja2VkIG1hdHJpeCBvciB0aGUgdmVjdG9yIGV4cHJlc3Npb25zCisgICAgICAqIHJldHVybmVkIGJ5IGRpYWdvbmFsKCkgYW5kIHN1YkRpYWdvbmFsKCkgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldworICAgICAgKiBkZW5zZSBjb3B5IG1hdHJpeCB3aXRoIHRoaXMgZnVuY3Rpb24uCisgICAgICAqCisgICAgICAqIFxzYSBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIGZvciBhbiBleGFtcGxlLAorICAgICAgKiBtYXRyaXhRKCksIHBhY2tlZE1hdHJpeCgpLCBkaWFnb25hbCgpLCBzdWJEaWFnb25hbCgpCisgICAgICAqLworICAgIE1hdHJpeFRSZXR1cm5UeXBlIG1hdHJpeFQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gTWF0cml4VFJldHVyblR5cGUobV9tYXRyaXgucmVhbCgpKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGRpYWdvbmFsIG9mIFQKKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJikgb3IKKyAgICAgICogdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RpYWdvbmFsLm91dAorICAgICAgKgorICAgICAgKiBcc2EgbWF0cml4VCgpLCBzdWJEaWFnb25hbCgpCisgICAgICAqLworICAgIERpYWdvbmFsUmV0dXJuVHlwZSBkaWFnb25hbCgpIGNvbnN0OworCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBzdWJkaWFnb25hbCBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBzdWJkaWFnb25hbCBvZiBUCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIG9yCisgICAgICAqIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBcc2EgZGlhZ29uYWwoKSBmb3IgYW4gZXhhbXBsZSwgbWF0cml4VCgpCisgICAgICAqLworICAgIFN1YkRpYWdvbmFsUmV0dXJuVHlwZSBzdWJEaWFnb25hbCgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKworICAgIE1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgQ29lZmZWZWN0b3JUeXBlIG1faENvZWZmczsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OkRpYWdvbmFsUmV0dXJuVHlwZQorVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+OjpkaWFnb25hbCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIHJldHVybiBtX21hdHJpeC5kaWFnb25hbCgpLnJlYWwoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIFRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhUeXBlPjo6U3ViRGlhZ29uYWxSZXR1cm5UeXBlCitUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OnN1YkRpYWdvbmFsKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVHJpZGlhZ29uYWxpemF0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpLnJlYWwoKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIFBlcmZvcm1zIGEgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IFxhIG1hdEEgaW4tcGxhY2UuCisgICoKKyAgKiBccGFyYW1baW4sb3V0XSBtYXRBIE9uIGlucHV0IHRoZSBzZWxmYWRqb2ludCBtYXRyaXguIE9ubHkgdGhlIFxiIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBpcyByZWZlcmVuY2VkLgorICAqICAgICAgICAgICAgICAgICAgICAgT24gb3V0cHV0LCB0aGUgc3RyaWN0IHVwcGVyIHBhcnQgaXMgbGVmdCB1bmNoYW5nZWQsIGFuZCB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0CisgICogICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBUIGFuZCBRIG1hdHJpY2VzIGluIHBhY2tlZCBmb3JtYXQgaGFzIGRldGFpbGVkIGJlbG93LgorICAqIFxwYXJhbVtvdXRdICAgIGhDb2VmZnMgcmV0dXJuZWQgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIChzZWUgYmVsb3cpCisgICoKKyAgKiBPbiBvdXRwdXQsIHRoZSB0cmlkaWFnb25hbCBzZWxmYWRqb2ludCBtYXRyaXggVCBpcyBzdG9yZWQgaW4gdGhlIGRpYWdvbmFsCisgICogYW5kIGxvd2VyIHN1Yi1kaWFnb25hbCBvZiB0aGUgbWF0cml4IFxhIG1hdEEuCisgICogVGhlIHVuaXRhcnkgbWF0cml4IFEgaXMgcmVwcmVzZW50ZWQgaW4gYSBjb21wYWN0IHdheSBhcyBhIHByb2R1Y3Qgb2YKKyAgKiBIb3VzZWhvbGRlciByZWZsZWN0b3JzIFxmJCBIX2kgXGYkIHN1Y2ggdGhhdDoKKyAgKiAgICAgICBcZiQgUSA9IEhfe04tMX0gXGxkb3RzIEhfMSBIXzAgXGYkLgorICAqIFRoZSBIb3VzZWhvbGRlciByZWZsZWN0b3JzIGFyZSBkZWZpbmVkIGFzCisgICogICAgICAgXGYkIEhfaSA9IChJIC0gaF9pIHZfaSB2X2leVCkgXGYkCisgICogd2hlcmUgXGYkIGhfaSA9IGhDb2VmZnNbaV1cZiQgaXMgdGhlIFxmJCBpIFxmJHRoIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50IGFuZAorICAqIFxmJCB2X2kgXGYkIGlzIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3IgZGVmaW5lZCBieQorICAqICAgICAgIFxmJCB2X2kgPSBbIDAsIFxsZG90cywgMCwgMSwgbWF0QShpKzIsaSksIFxsZG90cywgbWF0QShOLTEsaSkgXV5UIFxmJC4KKyAgKgorICAqIEltcGxlbWVudGVkIGZyb20gR29sdWIncyAiTWF0cml4IENvbXB1dGF0aW9ucyIsIGFsZ29yaXRobSA4LjMuMS4KKyAgKgorICAqIFxzYSBUcmlkaWFnb25hbGl6YXRpb246OnBhY2tlZE1hdHJpeCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBDb2VmZlZlY3RvclR5cGU+Cit2b2lkIHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlKE1hdHJpeFR5cGUmIG1hdEEsIENvZWZmVmVjdG9yVHlwZSYgaENvZWZmcykKK3sKKyAgdXNpbmcgbnVtZXh0Ojpjb25qOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBJbmRleCBuID0gbWF0QS5yb3dzKCk7CisgIGVpZ2VuX2Fzc2VydChuPT1tYXRBLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChuPT1oQ29lZmZzLnNpemUoKSsxIHx8IG49PTEpOworICAKKyAgZm9yIChJbmRleCBpID0gMDsgaTxuLTE7ICsraSkKKyAgeworICAgIEluZGV4IHJlbWFpbmluZ1NpemUgPSBuLWktMTsKKyAgICBSZWFsU2NhbGFyIGJldGE7CisgICAgU2NhbGFyIGg7CisgICAgbWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplKS5tYWtlSG91c2Vob2xkZXJJblBsYWNlKGgsIGJldGEpOworCisgICAgLy8gQXBwbHkgc2ltaWxhcml0eSB0cmFuc2Zvcm1hdGlvbiB0byByZW1haW5pbmcgY29sdW1ucywKKyAgICAvLyBpLmUuLCBBID0gSCBBIEgnIHdoZXJlIEggPSBJIC0gaCB2IHYnIGFuZCB2ID0gbWF0QS5jb2woaSkudGFpbChuLWktMSkKKyAgICBtYXRBLmNvbChpKS5jb2VmZlJlZihpKzEpID0gMTsKKworICAgIGhDb2VmZnMudGFpbChuLWktMSkubm9hbGlhcygpID0gKG1hdEEuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nU2l6ZSxyZW1haW5pbmdTaXplKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChjb25qKGgpICogbWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplKSkpOworCisgICAgaENvZWZmcy50YWlsKG4taS0xKSArPSAoY29uaihoKSpSZWFsU2NhbGFyKC0wLjUpKihoQ29lZmZzLnRhaWwocmVtYWluaW5nU2l6ZSkuZG90KG1hdEEuY29sKGkpLnRhaWwocmVtYWluaW5nU2l6ZSkpKSkgKiBtYXRBLmNvbChpKS50YWlsKG4taS0xKTsKKworICAgIG1hdEEuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nU2l6ZSwgcmVtYWluaW5nU2l6ZSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpCisgICAgICAucmFua1VwZGF0ZShtYXRBLmNvbChpKS50YWlsKHJlbWFpbmluZ1NpemUpLCBoQ29lZmZzLnRhaWwocmVtYWluaW5nU2l6ZSksIFNjYWxhcigtMSkpOworCisgICAgbWF0QS5jb2woaSkuY29lZmZSZWYoaSsxKSA9IGJldGE7CisgICAgaENvZWZmcy5jb2VmZlJlZihpKSA9IGg7CisgIH0KK30KKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiwgaW1wbGVtZW50YXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgICAgICAgICBpbnQgU2l6ZT1NYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgIGJvb2wgSXNDb21wbGV4PU51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2Vfc2VsZWN0b3I7CisKKy8qKiBcYnJpZWYgUGVyZm9ybXMgYSBmdWxsIHRyaWRpYWdvbmFsaXphdGlvbiBpbiBwbGFjZQorICAqCisgICogXHBhcmFtW2luLG91dF0gIG1hdCAgT24gaW5wdXQsIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggd2hvc2UgdHJpZGlhZ29uYWwKKyAgKiAgICBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgcmVmZXJlbmNlZC4KKyAgKiAgICBUaGUgcmVzdCBpcyBsZWZ0IHVuY2hhbmdlZC4gT24gb3V0cHV0LCB0aGUgb3J0aG9nb25hbCBtYXRyaXggUQorICAqICAgIGluIHRoZSBkZWNvbXBvc2l0aW9uIGlmIFxwIGV4dHJhY3RRIGlzIHRydWUuCisgICogXHBhcmFtW291dF0gIGRpYWcgIFRoZSBkaWFnb25hbCBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaW4gdGhlCisgICogICAgZGVjb21wb3NpdGlvbi4KKyAgKiBccGFyYW1bb3V0XSAgc3ViZGlhZyAgVGhlIHN1YmRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpbgorICAqICAgIHRoZSBkZWNvbXBvc2l0aW9uLgorICAqIFxwYXJhbVtpbl0gIGV4dHJhY3RRICBJZiB0cnVlLCB0aGUgb3J0aG9nb25hbCBtYXRyaXggUSBpbiB0aGUKKyAgKiAgICBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGFuZCBzdG9yZWQgaW4gXHAgbWF0LgorICAqCisgICogQ29tcHV0ZXMgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBccCBtYXQgaW4gcGxhY2UKKyAgKiBzdWNoIHRoYXQgXGYkIG1hdCA9IFEgVCBRXiogXGYkIHdoZXJlIFxmJCBRIFxmJCBpcyB1bml0YXJ5IGFuZCBcZiQgVCBcZiQgYSByZWFsCisgICogc3ltbWV0cmljIHRyaWRpYWdvbmFsIG1hdHJpeC4KKyAgKgorICAqIFRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpcyBwYXNzZWQgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXJzIFxwIGRpYWcgYW5kIFxwIHN1YmRpYWcuIElmCisgICogXHAgZXh0cmFjdFEgaXMgdHJ1ZSwgdGhlbiB0aGUgb3J0aG9nb25hbCBtYXRyaXggUSBpcyBwYXNzZWQgdG8gXHAgbWF0LiBPdGhlcndpc2UgdGhlIGxvd2VyCisgICogcGFydCBvZiB0aGUgbWF0cml4IFxwIG1hdCBpcyBkZXN0cm95ZWQuCisgICoKKyAgKiBUaGUgdmVjdG9ycyBccCBkaWFnIGFuZCBccCBzdWJkaWFnIGFyZSBub3QgcmVzaXplZC4gVGhlIGZ1bmN0aW9uCisgICogYXNzdW1lcyB0aGF0IHRoZXkgYXJlIGFscmVhZHkgb2YgdGhlIGNvcnJlY3Qgc2l6ZS4gVGhlIGxlbmd0aCBvZiB0aGUKKyAgKiB2ZWN0b3IgXHAgZGlhZyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciBvZiByb3dzIGluIFxwIG1hdCwgYW5kIHRoZQorICAqIGxlbmd0aCBvZiB0aGUgdmVjdG9yIFxwIHN1YmRpYWcgc2hvdWxkIGJlIG9uZSBsZWZ0LgorICAqCisgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjb250YWlucyBhbiBvcHRpbWl6ZWQgcGF0aCBmb3IgMy1ieS0zIG1hdHJpY2VzCisgICogd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIHBsYW5lIGZpdHRpbmcuCisgICoKKyAgKiBcbm90ZSBDdXJyZW50bHksIGl0IHJlcXVpcmVzIHR3byB0ZW1wb3JhcnkgdmVjdG9ycyB0byBob2xkIHRoZSBpbnRlcm1lZGlhdGUKKyAgKiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMsIGFuZCB0byByZWNvbnN0cnVjdCB0aGUgbWF0cml4IFEgZnJvbSB0aGUgSG91c2Vob2xkZXIKKyAgKiByZWZsZWN0b3JzLgorICAqCisgICogRXhhbXBsZSAodGhpcyB1c2VzIHRoZSBzYW1lIG1hdHJpeCBhcyB0aGUgZXhhbXBsZSBpbgorICAqICAgIFRyaWRpYWdvbmFsaXphdGlvbjo6VHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSk6CisgICogICAgXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2Uub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgVHJpZGlhZ29uYWxpemF0aW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEaWFnb25hbFR5cGUsIHR5cGVuYW1lIFN1YkRpYWdvbmFsVHlwZT4KK3ZvaWQgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoTWF0cml4VHlwZSYgbWF0LCBEaWFnb25hbFR5cGUmIGRpYWcsIFN1YkRpYWdvbmFsVHlwZSYgc3ViZGlhZywgYm9vbCBleHRyYWN0USkKK3sKKyAgZWlnZW5fYXNzZXJ0KG1hdC5jb2xzKCk9PW1hdC5yb3dzKCkgJiYgZGlhZy5zaXplKCk9PW1hdC5yb3dzKCkgJiYgc3ViZGlhZy5zaXplKCk9PW1hdC5yb3dzKCktMSk7CisgIHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX3NlbGVjdG9yPE1hdHJpeFR5cGU+OjpydW4obWF0LCBkaWFnLCBzdWJkaWFnLCBleHRyYWN0USk7Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBHZW5lcmFsIGZ1bGwgdHJpZGlhZ29uYWxpemF0aW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2l6ZSwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3QgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2Vfc2VsZWN0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OkNvZWZmVmVjdG9yVHlwZSBDb2VmZlZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+OjpIb3VzZWhvbGRlclNlcXVlbmNlVHlwZSBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlhZ29uYWxUeXBlLCB0eXBlbmFtZSBTdWJEaWFnb25hbFR5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtYXQsIERpYWdvbmFsVHlwZSYgZGlhZywgU3ViRGlhZ29uYWxUeXBlJiBzdWJkaWFnLCBib29sIGV4dHJhY3RRKQorICB7CisgICAgQ29lZmZWZWN0b3JUeXBlIGhDb2VmZnMobWF0LmNvbHMoKS0xKTsKKyAgICB0cmlkaWFnb25hbGl6YXRpb25faW5wbGFjZShtYXQsaENvZWZmcyk7CisgICAgZGlhZyA9IG1hdC5kaWFnb25hbCgpLnJlYWwoKTsKKyAgICBzdWJkaWFnID0gbWF0LnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpLnJlYWwoKTsKKyAgICBpZihleHRyYWN0USkKKyAgICAgIG1hdCA9IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlKG1hdCwgaENvZWZmcy5jb25qdWdhdGUoKSkKKyAgICAgICAgICAgIC5zZXRMZW5ndGgobWF0LnJvd3MoKSAtIDEpCisgICAgICAgICAgICAuc2V0U2hpZnQoMSk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBTcGVjaWFsaXphdGlvbiBmb3IgM3gzIHJlYWwgbWF0cmljZXMuCisgICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHBsYW5lIGZpdHRpbmcuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX3NlbGVjdG9yPE1hdHJpeFR5cGUsMyxmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbFR5cGUsIHR5cGVuYW1lIFN1YkRpYWdvbmFsVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgRGlhZ29uYWxUeXBlJiBkaWFnLCBTdWJEaWFnb25hbFR5cGUmIHN1YmRpYWcsIGJvb2wgZXh0cmFjdFEpCisgIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgY29uc3QgUmVhbFNjYWxhciB0b2wgPSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpOworICAgIGRpYWdbMF0gPSBtYXQoMCwwKTsKKyAgICBSZWFsU2NhbGFyIHYxbm9ybTIgPSBudW1leHQ6OmFiczIobWF0KDIsMCkpOworICAgIGlmKHYxbm9ybTIgPD0gdG9sKQorICAgIHsKKyAgICAgIGRpYWdbMV0gPSBtYXQoMSwxKTsKKyAgICAgIGRpYWdbMl0gPSBtYXQoMiwyKTsKKyAgICAgIHN1YmRpYWdbMF0gPSBtYXQoMSwwKTsKKyAgICAgIHN1YmRpYWdbMV0gPSBtYXQoMiwxKTsKKyAgICAgIGlmIChleHRyYWN0USkKKyAgICAgICAgbWF0LnNldElkZW50aXR5KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSZWFsU2NhbGFyIGJldGEgPSBzcXJ0KG51bWV4dDo6YWJzMihtYXQoMSwwKSkgKyB2MW5vcm0yKTsKKyAgICAgIFJlYWxTY2FsYXIgaW52QmV0YSA9IFJlYWxTY2FsYXIoMSkvYmV0YTsKKyAgICAgIFNjYWxhciBtMDEgPSBtYXQoMSwwKSAqIGludkJldGE7CisgICAgICBTY2FsYXIgbTAyID0gbWF0KDIsMCkgKiBpbnZCZXRhOworICAgICAgU2NhbGFyIHEgPSBSZWFsU2NhbGFyKDIpKm0wMSptYXQoMiwxKSArIG0wMioobWF0KDIsMikgLSBtYXQoMSwxKSk7CisgICAgICBkaWFnWzFdID0gbWF0KDEsMSkgKyBtMDIqcTsKKyAgICAgIGRpYWdbMl0gPSBtYXQoMiwyKSAtIG0wMipxOworICAgICAgc3ViZGlhZ1swXSA9IGJldGE7CisgICAgICBzdWJkaWFnWzFdID0gbWF0KDIsMSkgLSBtMDEgKiBxOworICAgICAgaWYgKGV4dHJhY3RRKQorICAgICAgeworICAgICAgICBtYXQgPDwgMSwgICAwLCAgICAwLAorICAgICAgICAgICAgICAgMCwgbTAxLCAgbTAyLAorICAgICAgICAgICAgICAgMCwgbTAyLCAtbTAxOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFRyaXZpYWwgc3BlY2lhbGl6YXRpb24gZm9yIDF4MSBtYXRyaWNlcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3QgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2Vfc2VsZWN0b3I8TWF0cml4VHlwZSwxLElzQ29tcGxleD4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpYWdvbmFsVHlwZSwgdHlwZW5hbWUgU3ViRGlhZ29uYWxUeXBlPgorICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbWF0LCBEaWFnb25hbFR5cGUmIGRpYWcsIFN1YkRpYWdvbmFsVHlwZSYsIGJvb2wgZXh0cmFjdFEpCisgIHsKKyAgICBkaWFnKDAsMCkgPSBudW1leHQ6OnJlYWwobWF0KDAsMCkpOworICAgIGlmKGV4dHJhY3RRKQorICAgICAgbWF0KDAsMCkgPSBTY2FsYXIoMSk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gdHlwZSBmb3IgcmV0dXJuIHZhbHVlIG9mIFRyaWRpYWdvbmFsaXphdGlvbjo6bWF0cml4VCgpCisgICoKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdHlwZSBvZiB1bmRlcmx5aW5nIGRlbnNlIG1hdHJpeAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IFRyaWRpYWdvbmFsaXphdGlvbk1hdHJpeFRSZXR1cm5UeXBlCis6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPFRyaWRpYWdvbmFsaXphdGlvbk1hdHJpeFRSZXR1cm5UeXBlPE1hdHJpeFR5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gbWF0IFRoZSB1bmRlcmx5aW5nIGRlbnNlIG1hdHJpeAorICAgICAgKi8KKyAgICBUcmlkaWFnb25hbGl6YXRpb25NYXRyaXhUUmV0dXJuVHlwZShjb25zdCBNYXRyaXhUeXBlJiBtYXQpIDogbV9tYXRyaXgobWF0KSB7IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGlubGluZSB2b2lkIGV2YWxUbyhSZXN1bHRUeXBlJiByZXN1bHQpIGNvbnN0CisgICAgeworICAgICAgcmVzdWx0LnNldFplcm8oKTsKKyAgICAgIHJlc3VsdC50ZW1wbGF0ZSBkaWFnb25hbDwxPigpID0gbV9tYXRyaXgudGVtcGxhdGUgZGlhZ29uYWw8LTE+KCkuY29uanVnYXRlKCk7CisgICAgICByZXN1bHQuZGlhZ29uYWwoKSA9IG1fbWF0cml4LmRpYWdvbmFsKCk7CisgICAgICByZXN1bHQudGVtcGxhdGUgZGlhZ29uYWw8LTE+KCkgPSBtX21hdHJpeC50ZW1wbGF0ZSBkaWFnb25hbDwtMT4oKTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklESUFHT05BTElaQVRJT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L0FsaWduZWRCb3guaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbGlnbmVkQm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2ZWFlNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbGlnbmVkQm94LmgKQEAgLTAsMCArMSwzOTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BTElHTkVEQk9YX0gKKyNkZWZpbmUgRUlHRU5fQUxJR05FREJPWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEFsaWduZWRCb3gKKyAgKgorICAqIFxicmllZiBBbiBheGlzIGFsaWduZWQgYm94CisgICoKKyAgKiBcdHBhcmFtIF9TY2FsYXIgdGhlIHR5cGUgb2YgdGhlIHNjYWxhciBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIF9BbWJpZW50RGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UsIGNhbiBiZSBhIGNvbXBpbGUgdGltZSB2YWx1ZSBvciBEeW5hbWljLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGF4aXMgYWxpZ25lZCBib3ggYXMgYSBwYWlyIG9mIHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsIGNvcm5lcnMuCisgICogXHdhcm5pbmcgVGhlIHJlc3VsdCBvZiBtb3N0IG1ldGhvZHMgaXMgdW5kZWZpbmVkIHdoZW4gYXBwbGllZCB0byBhbiBlbXB0eSBib3guIFlvdSBjYW4gY2hlY2sgZm9yIGVtcHR5IGJveGVzIHVzaW5nIGlzRW1wdHkoKS4KKyAgKiBcc2EgYWxpZ25lZGJveHR5cGVkZWZzCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltPgorY2xhc3MgQWxpZ25lZEJveAoreworcHVibGljOgorRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9BbWJpZW50RGltKQorICBlbnVtIHsgQW1iaWVudERpbUF0Q29tcGlsZVRpbWUgPSBfQW1iaWVudERpbSB9OworICB0eXBlZGVmIF9TY2FsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcjsKKyAgdHlwZWRlZiBOdW1UcmFpdHM8U2NhbGFyPiAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJUcmFpdHM7CisgIHR5cGVkZWYgRWlnZW46OkluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyVHJhaXRzOjpSZWFsICAgICAgICAgICAgICAgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJUcmFpdHM6Ok5vbkludGVnZXIgICAgICAgICBOb25JbnRlZ2VyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gIFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LCBjb25zdCBWZWN0b3JUeXBlLCBjb25zdCBWZWN0b3JUeXBlPiBWZWN0b3JUeXBlU3VtOworCisgIC8qKiBEZWZpbmUgY29uc3RhbnRzIHRvIG5hbWUgdGhlIGNvcm5lcnMgb2YgYSAxRCwgMkQgb3IgM0QgYXhpcyBhbGlnbmVkIGJvdW5kaW5nIGJveCAqLworICBlbnVtIENvcm5lclR5cGUKKyAgeworICAgIC8qKiAxRCBuYW1lcyBAeyAqLworICAgIE1pbj0wLCBNYXg9MSwKKyAgICAvKiogQH0gKi8KKworICAgIC8qKiBJZGVudGlmaWVyIGZvciAyRCBjb3JuZXIgQHsgKi8KKyAgICBCb3R0b21MZWZ0PTAsIEJvdHRvbVJpZ2h0PTEsCisgICAgVG9wTGVmdD0yLCBUb3BSaWdodD0zLAorICAgIC8qKiBAfSAqLworCisgICAgLyoqIElkZW50aWZpZXIgZm9yIDNEIGNvcm5lciAgQHsgKi8KKyAgICBCb3R0b21MZWZ0Rmxvb3I9MCwgQm90dG9tUmlnaHRGbG9vcj0xLAorICAgIFRvcExlZnRGbG9vcj0yLCBUb3BSaWdodEZsb29yPTMsCisgICAgQm90dG9tTGVmdENlaWw9NCwgQm90dG9tUmlnaHRDZWlsPTUsCisgICAgVG9wTGVmdENlaWw9NiwgVG9wUmlnaHRDZWlsPTcKKyAgICAvKiogQH0gKi8KKyAgfTsKKworCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGluaXRpYWxpemluZyBhIG51bGwgYm94LiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQWxpZ25lZEJveCgpCisgIHsgaWYgKEFtYmllbnREaW1BdENvbXBpbGVUaW1lIT1EeW5hbWljKSBzZXRFbXB0eSgpOyB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBudWxsIGJveCB3aXRoIFxhIF9kaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgYW1iaWVudCBzcGFjZS4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGV4cGxpY2l0IEFsaWduZWRCb3goSW5kZXggX2RpbSkgOiBtX21pbihfZGltKSwgbV9tYXgoX2RpbSkKKyAgeyBzZXRFbXB0eSgpOyB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBib3ggd2l0aCBleHRyZW1pdGllcyBcYSBfbWluIGFuZCBcYSBfbWF4LgorICAgKiBcd2FybmluZyBJZiBlaXRoZXIgY29tcG9uZW50IG9mIFxhIF9taW4gaXMgbGFyZ2VyIHRoYW4gdGhlIHNhbWUgY29tcG9uZW50IG9mIFxhIF9tYXgsIHRoZSBjb25zdHJ1Y3RlZCBib3ggaXMgZW1wdHkuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyVmVjdG9yVHlwZTEsIHR5cGVuYW1lIE90aGVyVmVjdG9yVHlwZTI+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBBbGlnbmVkQm94KGNvbnN0IE90aGVyVmVjdG9yVHlwZTEmIF9taW4sIGNvbnN0IE90aGVyVmVjdG9yVHlwZTImIF9tYXgpIDogbV9taW4oX21pbiksIG1fbWF4KF9tYXgpIHt9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBib3ggY29udGFpbmluZyBhIHNpbmdsZSBwb2ludCBcYSBwLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgQWxpZ25lZEJveChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBwKSA6IG1fbWluKHApLCBtX21heChtX21pbikKKyAgeyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgfkFsaWduZWRCb3goKSB7fQorCisgIC8qKiBccmV0dXJucyB0aGUgZGltZW5zaW9uIGluIHdoaWNoIHRoZSBib3ggaG9sZHMgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGRpbSgpIGNvbnN0IHsgcmV0dXJuIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPT1EeW5hbWljID8gbV9taW4uc2l6ZSgpIDogSW5kZXgoQW1iaWVudERpbUF0Q29tcGlsZVRpbWUpOyB9CisKKyAgLyoqIFxkZXByZWNhdGVkIHVzZSBpc0VtcHR5KCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gaXNFbXB0eSgpOyB9CisKKyAgLyoqIFxkZXByZWNhdGVkIHVzZSBzZXRFbXB0eSgpICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHNldE51bGwoKSB7IHNldEVtcHR5KCk7IH0KKworICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgYm94IGlzIGVtcHR5LgorICAgKiBcc2Egc2V0RW1wdHkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIChtX21pbi5hcnJheSgpID4gbV9tYXguYXJyYXkoKSkuYW55KCk7IH0KKworICAvKiogTWFrZXMgXGMgKnRoaXMgYW4gZW1wdHkgYm94LgorICAgKiBcc2EgaXNFbXB0eSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBzZXRFbXB0eSgpCisgIHsKKyAgICBtX21pbi5zZXRDb25zdGFudCggU2NhbGFyVHJhaXRzOjpoaWdoZXN0KCkgKTsKKyAgICBtX21heC5zZXRDb25zdGFudCggU2NhbGFyVHJhaXRzOjpsb3dlc3QoKSApOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBtaW5pbWFsIGNvcm5lciAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgVmVjdG9yVHlwZSYgKG1pbikoKSBjb25zdCB7IHJldHVybiBtX21pbjsgfQorICAvKiogXHJldHVybnMgYSBub24gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtaW5pbWFsIGNvcm5lciAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVmVjdG9yVHlwZSYgKG1pbikoKSB7IHJldHVybiBtX21pbjsgfQorICAvKiogXHJldHVybnMgdGhlIG1heGltYWwgY29ybmVyICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBWZWN0b3JUeXBlJiAobWF4KSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4OyB9CisgIC8qKiBccmV0dXJucyBhIG5vbiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1heGltYWwgY29ybmVyICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBWZWN0b3JUeXBlJiAobWF4KSgpIHsgcmV0dXJuIG1fbWF4OyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGJveCAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoVmVjdG9yVHlwZVN1bSwgUmVhbFNjYWxhciwgcXVvdGllbnQpCisgIGNlbnRlcigpIGNvbnN0CisgIHsgcmV0dXJuIChtX21pbittX21heCkvUmVhbFNjYWxhcigyKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbGVuZ3RocyBvZiB0aGUgc2lkZXMgb2YgdGhlIGJvdW5kaW5nIGJveC4KKyAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGdldCB0aGUgc2FtZQorICAgICogcmVzdWx0IGZvciBpbnRlZ3JhbCBvciBmbG9hdGluZyBzY2FsYXIgdHlwZXM6IHNlZQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPCBpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IFZlY3RvclR5cGUsIGNvbnN0IFZlY3RvclR5cGU+IHNpemVzKCkgY29uc3QKKyAgeyByZXR1cm4gbV9tYXggLSBtX21pbjsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdm9sdW1lIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciB2b2x1bWUoKSBjb25zdAorICB7IHJldHVybiBzaXplcygpLnByb2QoKTsgfQorCisgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIGZvciB0aGUgYm91bmRpbmcgYm94IGRpYWdvbmFsIHZlY3RvcgorICAgICogaWYgdGhlIGxlbmd0aCBvZiB0aGUgZGlhZ29uYWwgaXMgbmVlZGVkOiBkaWFnb25hbCgpLm5vcm0oKQorICAgICogd2lsbCBwcm92aWRlIGl0LgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDd2lzZUJpbmFyeU9wPCBpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IFZlY3RvclR5cGUsIGNvbnN0IFZlY3RvclR5cGU+IGRpYWdvbmFsKCkgY29uc3QKKyAgeyByZXR1cm4gc2l6ZXMoKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdmVydGV4IG9mIHRoZSBib3VuZGluZyBib3ggYXQgdGhlIGNvcm5lciBkZWZpbmVkIGJ5CisgICAgKiB0aGUgY29ybmVyLWlkIGNvcm5lci4gSXQgd29ya3Mgb25seSBmb3IgYSAxRCwgMkQgb3IgM0QgYm91bmRpbmcgYm94LgorICAgICogRm9yIDFEIGJvdW5kaW5nIGJveGVzIGNvcm5lcnMgYXJlIG5hbWVkIGJ5IDIgZW51bSBjb25zdGFudHM6CisgICAgKiBCb3R0b21MZWZ0IGFuZCBCb3R0b21SaWdodC4KKyAgICAqIEZvciAyRCBib3VuZGluZyBib3hlcywgY29ybmVycyBhcmUgbmFtZWQgYnkgNCBlbnVtIGNvbnN0YW50czoKKyAgICAqIEJvdHRvbUxlZnQsIEJvdHRvbVJpZ2h0LCBUb3BMZWZ0LCBUb3BSaWdodC4KKyAgICAqIEZvciAzRCBib3VuZGluZyBib3hlcywgdGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgYWRkZWQ6CisgICAgKiBCb3R0b21MZWZ0Q2VpbCwgQm90dG9tUmlnaHRDZWlsLCBUb3BMZWZ0Q2VpbCwgVG9wUmlnaHRDZWlsLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBWZWN0b3JUeXBlIGNvcm5lcihDb3JuZXJUeXBlIGNvcm5lcikgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoX0FtYmllbnREaW0gPD0gMywgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfVkVDVE9SU19PRl9BX1NQRUNJRklDX1NJWkUpOworCisgICAgVmVjdG9yVHlwZSByZXM7CisKKyAgICBJbmRleCBtdWx0ID0gMTsKKyAgICBmb3IoSW5kZXggZD0wOyBkPGRpbSgpOyArK2QpCisgICAgeworICAgICAgaWYoIG11bHQgJiBjb3JuZXIgKSByZXNbZF0gPSBtX21heFtkXTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgcmVzW2RdID0gbV9taW5bZF07CisgICAgICBtdWx0ICo9IDI7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICAvKiogXHJldHVybnMgYSByYW5kb20gcG9pbnQgaW5zaWRlIHRoZSBib3VuZGluZyBib3ggc2FtcGxlZCB3aXRoCisgICAqIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFZlY3RvclR5cGUgc2FtcGxlKCkgY29uc3QKKyAgeworICAgIFZlY3RvclR5cGUgcihkaW0oKSk7CisgICAgZm9yKEluZGV4IGQ9MDsgZDxkaW0oKTsgKytkKQorICAgIHsKKyAgICAgIGlmKCFTY2FsYXJUcmFpdHM6OklzSW50ZWdlcikKKyAgICAgIHsKKyAgICAgICAgcltkXSA9IG1fbWluW2RdICsgKG1fbWF4W2RdLW1fbWluW2RdKQorICAgICAgICAgICAgICogaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwKSwgU2NhbGFyKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcltkXSA9IGludGVybmFsOjpyYW5kb20obV9taW5bZF0sIG1fbWF4W2RdKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKworICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnQgXGEgcCBpcyBpbnNpZGUgdGhlIGJveCBcYyAqdGhpcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgcCkgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLDI+Ojp0eXBlIHBfbihwLmRlcml2ZWQoKSk7CisgICAgcmV0dXJuIChtX21pbi5hcnJheSgpPD1wX24uYXJyYXkoKSkuYWxsKCkgJiYgKHBfbi5hcnJheSgpPD1tX21heC5hcnJheSgpKS5hbGwoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBib3ggXGEgYiBpcyBlbnRpcmVseSBpbnNpZGUgdGhlIGJveCBcYyAqdGhpcy4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3QKKyAgeyByZXR1cm4gKG1fbWluLmFycmF5KCk8PShiLm1pbikoKS5hcnJheSgpKS5hbGwoKSAmJiAoKGIubWF4KSgpLmFycmF5KCk8PW1fbWF4LmFycmF5KCkpLmFsbCgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIGJveCBcYSBiIGlzIGludGVyc2VjdGluZyB0aGUgYm94IFxjICp0aGlzLgorICAgKiBcc2EgaW50ZXJzZWN0aW9uLCBjbGFtcCAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IEFsaWduZWRCb3gmIGIpIGNvbnN0CisgIHsgcmV0dXJuIChtX21pbi5hcnJheSgpPD0oYi5tYXgpKCkuYXJyYXkoKSkuYWxsKCkgJiYgKChiLm1pbikoKS5hcnJheSgpPD1tX21heC5hcnJheSgpKS5hbGwoKTsgfQorCisgIC8qKiBFeHRlbmRzIFxjICp0aGlzIHN1Y2ggdGhhdCBpdCBjb250YWlucyB0aGUgcG9pbnQgXGEgcCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICogXHNhIGV4dGVuZChjb25zdCBBbGlnbmVkQm94JikgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEFsaWduZWRCb3gmIGV4dGVuZChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBwKQorICB7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMj46OnR5cGUgcF9uKHAuZGVyaXZlZCgpKTsKKyAgICBtX21pbiA9IG1fbWluLmN3aXNlTWluKHBfbik7CisgICAgbV9tYXggPSBtX21heC5jd2lzZU1heChwX24pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBFeHRlbmRzIFxjICp0aGlzIHN1Y2ggdGhhdCBpdCBjb250YWlucyB0aGUgYm94IFxhIGIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAqIFxzYSBtZXJnZWQsIGV4dGVuZChjb25zdCBNYXRyaXhCYXNlJikgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEFsaWduZWRCb3gmIGV4dGVuZChjb25zdCBBbGlnbmVkQm94JiBiKQorICB7CisgICAgbV9taW4gPSBtX21pbi5jd2lzZU1pbihiLm1fbWluKTsKKyAgICBtX21heCA9IG1fbWF4LmN3aXNlTWF4KGIubV9tYXgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBDbGFtcHMgXGMgKnRoaXMgYnkgdGhlIGJveCBcYSBiIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgKiBcbm90ZSBJZiB0aGUgYm94ZXMgZG9uJ3QgaW50ZXJzZWN0LCB0aGUgcmVzdWx0aW5nIGJveCBpcyBlbXB0eS4KKyAgICogXHNhIGludGVyc2VjdGlvbigpLCBpbnRlcnNlY3RzKCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEFsaWduZWRCb3gmIGNsYW1wKGNvbnN0IEFsaWduZWRCb3gmIGIpCisgIHsKKyAgICBtX21pbiA9IG1fbWluLmN3aXNlTWF4KGIubV9taW4pOworICAgIG1fbWF4ID0gbV9tYXguY3dpc2VNaW4oYi5tX21heCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFJldHVybnMgYW4gQWxpZ25lZEJveCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXGEgYiBhbmQgXGMgKnRoaXMKKyAgICogXG5vdGUgSWYgdGhlIGJveGVzIGRvbid0IGludGVyc2VjdCwgdGhlIHJlc3VsdGluZyBib3ggaXMgZW1wdHkuCisgICAqIFxzYSBpbnRlcnNlY3RzKCksIGNsYW1wLCBjb250YWlucygpICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQWxpZ25lZEJveCBpbnRlcnNlY3Rpb24oY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3QKKyAge3JldHVybiBBbGlnbmVkQm94KG1fbWluLmN3aXNlTWF4KGIubV9taW4pLCBtX21heC5jd2lzZU1pbihiLm1fbWF4KSk7IH0KKworICAvKiogUmV0dXJucyBhbiBBbGlnbmVkQm94IHRoYXQgaXMgdGhlIHVuaW9uIG9mIFxhIGIgYW5kIFxjICp0aGlzLgorICAgKiBcbm90ZSBNZXJnaW5nIHdpdGggYW4gZW1wdHkgYm94IG1heSByZXN1bHQgaW4gYSBib3ggYmlnZ2VyIHRoYW4gXGMgKnRoaXMuIAorICAgKiBcc2EgZXh0ZW5kKGNvbnN0IEFsaWduZWRCb3gmKSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQWxpZ25lZEJveCBtZXJnZWQoY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3QKKyAgeyByZXR1cm4gQWxpZ25lZEJveChtX21pbi5jd2lzZU1pbihiLm1fbWluKSwgbV9tYXguY3dpc2VNYXgoYi5tX21heCkpOyB9CisKKyAgLyoqIFRyYW5zbGF0ZSBcYyAqdGhpcyBieSB0aGUgdmVjdG9yIFxhIHQgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBBbGlnbmVkQm94JiB0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgYV90KQorICB7CisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMj46OnR5cGUgdChhX3QuZGVyaXZlZCgpKTsKKyAgICBtX21pbiArPSB0OworICAgIG1fbWF4ICs9IHQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IFxhIHAgYW5kIHRoZSBib3ggXGMgKnRoaXMsCisgICAgKiBhbmQgemVybyBpZiBcYSBwIGlzIGluc2lkZSB0aGUgYm94LgorICAgICogXHNhIGV4dGVyaW9yRGlzdGFuY2UoY29uc3QgTWF0cml4QmFzZSYpLCBzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBBbGlnbmVkQm94JikKKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIHNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHApIGNvbnN0OworCisgIC8qKiBccmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3hlcyBcYSBiIGFuZCBcYyAqdGhpcywKKyAgICAqIGFuZCB6ZXJvIGlmIHRoZSBib3hlcyBpbnRlcnNlY3QuCisgICAgKiBcc2EgZXh0ZXJpb3JEaXN0YW5jZShjb25zdCBBbGlnbmVkQm94JiksIHNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGNvbnN0IE1hdHJpeEJhc2UmKQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBcYSBwIGFuZCB0aGUgYm94IFxjICp0aGlzLAorICAgICogYW5kIHplcm8gaWYgXGEgcCBpcyBpbnNpZGUgdGhlIGJveC4KKyAgICAqIFxzYSBzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlJiksIGV4dGVyaW9yRGlzdGFuY2UoY29uc3QgQWxpZ25lZEJveCYpCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIE5vbkludGVnZXIgZXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBwKSBjb25zdAorICB7IEVJR0VOX1VTSU5HX1NURF9NQVRIKHNxcnQpIHJldHVybiBzcXJ0KE5vbkludGVnZXIoc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocCkpKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm94ZXMgXGEgYiBhbmQgXGMgKnRoaXMsCisgICAgKiBhbmQgemVybyBpZiB0aGUgYm94ZXMgaW50ZXJzZWN0LgorICAgICogXHNhIHNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGNvbnN0IEFsaWduZWRCb3gmKSwgZXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlJikKKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgTm9uSW50ZWdlciBleHRlcmlvckRpc3RhbmNlKGNvbnN0IEFsaWduZWRCb3gmIGIpIGNvbnN0CisgIHsgRUlHRU5fVVNJTkdfU1REX01BVEgoc3FydCkgcmV0dXJuIHNxcnQoTm9uSW50ZWdlcihzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShiKSkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8QWxpZ25lZEJveCwKKyAgICAgICAgICAgQWxpZ25lZEJveDxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7CisgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFsaWduZWRCb3gsCisgICAgICAgICAgICAgICAgICAgIEFsaWduZWRCb3g8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4gPjo6dHlwZSgqdGhpcyk7CisgIH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgQWxpZ25lZEJveChjb25zdCBBbGlnbmVkQm94PE90aGVyU2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4mIG90aGVyKQorICB7CisgICAgbV9taW4gPSAob3RoZXIubWluKSgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICAgIG1fbWF4ID0gKG90aGVyLm1heCkoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc0FwcHJveChjb25zdCBBbGlnbmVkQm94JiBvdGhlciwgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IFNjYWxhclRyYWl0czo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWluLmlzQXBwcm94KG90aGVyLm1fbWluLCBwcmVjKSAmJiBtX21heC5pc0FwcHJveChvdGhlci5tX21heCwgcHJlYyk7IH0KKworcHJvdGVjdGVkOgorCisgIFZlY3RvclR5cGUgbV9taW4sIG1fbWF4OworfTsKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgQW1iaWVudERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIEFsaWduZWRCb3g8U2NhbGFyLEFtYmllbnREaW0+OjpzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBhX3ApIGNvbnN0Cit7CisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLDIqQW1iaWVudERpbT46OnR5cGUgcChhX3AuZGVyaXZlZCgpKTsKKyAgU2NhbGFyIGRpc3QyKDApOworICBTY2FsYXIgYXV4OworICBmb3IgKEluZGV4IGs9MDsgazxkaW0oKTsgKytrKQorICB7CisgICAgaWYoIG1fbWluW2tdID4gcFtrXSApCisgICAgeworICAgICAgYXV4ID0gbV9taW5ba10gLSBwW2tdOworICAgICAgZGlzdDIgKz0gYXV4KmF1eDsKKyAgICB9CisgICAgZWxzZSBpZiggcFtrXSA+IG1fbWF4W2tdICkKKyAgICB7CisgICAgICBhdXggPSBwW2tdIC0gbV9tYXhba107CisgICAgICBkaXN0MiArPSBhdXgqYXV4OworICAgIH0KKyAgfQorICByZXR1cm4gZGlzdDI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgQW1iaWVudERpbT4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgQWxpZ25lZEJveDxTY2FsYXIsQW1iaWVudERpbT46OnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGNvbnN0IEFsaWduZWRCb3gmIGIpIGNvbnN0Cit7CisgIFNjYWxhciBkaXN0MigwKTsKKyAgU2NhbGFyIGF1eDsKKyAgZm9yIChJbmRleCBrPTA7IGs8ZGltKCk7ICsraykKKyAgeworICAgIGlmKCBtX21pbltrXSA+IGIubV9tYXhba10gKQorICAgIHsKKyAgICAgIGF1eCA9IG1fbWluW2tdIC0gYi5tX21heFtrXTsKKyAgICAgIGRpc3QyICs9IGF1eCphdXg7CisgICAgfQorICAgIGVsc2UgaWYoIGIubV9taW5ba10gPiBtX21heFtrXSApCisgICAgeworICAgICAgYXV4ID0gYi5tX21pbltrXSAtIG1fbWF4W2tdOworICAgICAgZGlzdDIgKz0gYXV4KmF1eDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRpc3QyOworfQorCisvKiogXGRlZmdyb3VwIGFsaWduZWRib3h0eXBlZGVmcyBHbG9iYWwgYWxpZ25lZCBib3ggdHlwZWRlZnMKKyAgKgorICAqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogRWlnZW4gZGVmaW5lcyBzZXZlcmFsIHR5cGVkZWYgc2hvcnRjdXRzIGZvciBtb3N0IGNvbW1vbiBhbGlnbmVkIGJveCB0eXBlcy4KKyAgKgorICAqIFRoZSBnZW5lcmFsIHBhdHRlcm5zIGFyZSB0aGUgZm9sbG93aW5nOgorICAqCisgICogXGMgQWxpZ25lZEJveFNpemVUeXBlIHdoZXJlIFxjIFNpemUgY2FuIGJlIFxjIDEsIFxjIDIsXGMgMyxcYyA0IGZvciBmaXhlZCBzaXplIGJveGVzIG9yIFxjIFggZm9yIGR5bmFtaWMgc2l6ZSwKKyAgKiBhbmQgd2hlcmUgXGMgVHlwZSBjYW4gYmUgXGMgaSBmb3IgaW50ZWdlciwgXGMgZiBmb3IgZmxvYXQsIFxjIGQgZm9yIGRvdWJsZS4KKyAgKgorICAqIEZvciBleGFtcGxlLCBcYyBBbGlnbmVkQm94M2QgaXMgYSBmaXhlZC1zaXplIDN4MyBhbGlnbmVkIGJveCB0eXBlIG9mIGRvdWJsZXMsIGFuZCBcYyBBbGlnbmVkQm94WGYgaXMgYSBkeW5hbWljLXNpemUgYWxpZ25lZCBib3ggb2YgZmxvYXRzLgorICAqCisgICogXHNhIGNsYXNzIEFsaWduZWRCb3gKKyAgKi8KKworI2RlZmluZSBFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIFNpemUsIFNpemVTdWZmaXgpICAgIFwKKy8qKiBcaW5ncm91cCBhbGlnbmVkYm94dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIEFsaWduZWRCb3g8VHlwZSwgU2l6ZT4gICBBbGlnbmVkQm94IyNTaXplU3VmZml4IyNUeXBlU3VmZml4OworCisjZGVmaW5lIEVJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKFR5cGUsIFR5cGVTdWZmaXgpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMSwgMSkgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAyLCAyKSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDMsIDMpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgNCwgNCkgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBEeW5hbWljLCBYKQorCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhpbnQsICAgICAgICAgICAgICAgICAgaSkKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKGZsb2F0LCAgICAgICAgICAgICAgICBmKQorRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMoZG91YmxlLCAgICAgICAgICAgICAgIGQpCisKKyN1bmRlZiBFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUworI3VuZGVmIEVJR0VOX01BS0VfVFlQRURFRlMKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BTElHTkVEQk9YX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbmdsZUF4aXMuaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbmdsZUF4aXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWYzYzFiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0FuZ2xlQXhpcy5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQU5HTEVBWElTX0gKKyNkZWZpbmUgRUlHRU5fQU5HTEVBWElTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIEFuZ2xlQXhpcworICAqCisgICogXGJyaWVmIFJlcHJlc2VudHMgYSAzRCByb3RhdGlvbiBhcyBhIHJvdGF0aW9uIGFuZ2xlIGFyb3VuZCBhbiBhcmJpdHJhcnkgM0QgYXhpcworICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzLgorICAqCisgICogXHdhcm5pbmcgV2hlbiBzZXR0aW5nIHVwIGFuIEFuZ2xlQXhpcyBvYmplY3QsIHRoZSBheGlzIHZlY3RvciBcYiBtdXN0IFxiIGJlIFxiIG5vcm1hbGl6ZWQuCisgICoKKyAgKiBUaGUgZm9sbG93aW5nIHR3byB0eXBlZGVmcyBhcmUgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOgorICAqIFxsaSBcYyBBbmdsZUF4aXNmIGZvciBcYyBmbG9hdAorICAqIFxsaSBcYyBBbmdsZUF4aXNkIGZvciBcYyBkb3VibGUKKyAgKgorICAqIENvbWJpbmVkIHdpdGggTWF0cml4QmFzZTo6VW5pdHtYLFksWn0sIEFuZ2xlQXhpcyBjYW4gYmUgdXNlZCB0byBlYXNpbHkKKyAgKiBtaW1pYyBFdWxlci1hbmdsZXMuIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgKiBcaW5jbHVkZSBBbmdsZUF4aXNfbWltaWNfZXVsZXIuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQW5nbGVBeGlzX21pbWljX2V1bGVyLm91dAorICAqCisgICogXG5vdGUgVGhpcyBjbGFzcyBpcyBub3QgYWltZWQgdG8gYmUgdXNlZCB0byBzdG9yZSBhIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLAorICAqIGJ1dCByYXRoZXIgdG8gbWFrZSBlYXNpZXIgdGhlIGNyZWF0aW9uIG9mIG90aGVyIHJvdGF0aW9uIChRdWF0ZXJuaW9uLCByb3RhdGlvbiBNYXRyaXgpCisgICogYW5kIHRyYW5zZm9ybWF0aW9uIG9iamVjdHMuCisgICoKKyAgKiBcc2EgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgVHJhbnNmb3JtLCBNYXRyaXhCYXNlOjpVbml0WCgpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiBzdHJ1Y3QgdHJhaXRzPEFuZ2xlQXhpczxfU2NhbGFyPiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPgorY2xhc3MgQW5nbGVBeGlzIDogcHVibGljIFJvdGF0aW9uQmFzZTxBbmdsZUF4aXM8X1NjYWxhcj4sMz4KK3sKKyAgdHlwZWRlZiBSb3RhdGlvbkJhc2U8QW5nbGVBeGlzPF9TY2FsYXI+LDM+IEJhc2U7CisKK3B1YmxpYzoKKworICB1c2luZyBCYXNlOjpvcGVyYXRvcio7CisKKyAgZW51bSB7IERpbSA9IDMgfTsKKyAgLyoqIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzICovCisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb25UeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgVmVjdG9yMyBtX2F4aXM7CisgIFNjYWxhciBtX2FuZ2xlOworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbi4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgQW5nbGVBeGlzKCkge30KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgdGhlIGFuZ2xlLWF4aXMgcm90YXRpb24gZnJvbSBhbiBcYSBhbmdsZSBpbiByYWRpYW4KKyAgICAqIGFuZCBhbiBcYSBheGlzIHdoaWNoIFxiIG11c3QgXGIgYmUgXGIgbm9ybWFsaXplZC4KKyAgICAqCisgICAgKiBcd2FybmluZyBJZiB0aGUgXGEgYXhpcyB2ZWN0b3IgaXMgbm90IG5vcm1hbGl6ZWQsIHRoZW4gdGhlIGFuZ2xlLWF4aXMgb2JqZWN0CisgICAgKiAgICAgICAgICByZXByZXNlbnRzIGFuIGludmFsaWQgcm90YXRpb24uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIAorICBpbmxpbmUgQW5nbGVBeGlzKGNvbnN0IFNjYWxhciYgYW5nbGUsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGF4aXMpIDogbV9heGlzKGF4aXMpLCBtX2FuZ2xlKGFuZ2xlKSB7fQorICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgYW5nbGUtYXhpcyByb3RhdGlvbiBmcm9tIGEgcXVhdGVybmlvbiBcYSBxLgorICAgICogVGhpcyBmdW5jdGlvbiBpbXBsaWNpdGx5IG5vcm1hbGl6ZXMgdGhlIHF1YXRlcm5pb24gXGEgcS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0RGVyaXZlZD4gCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBleHBsaWNpdCBBbmdsZUF4aXMoY29uc3QgUXVhdGVybmlvbkJhc2U8UXVhdERlcml2ZWQ+JiBxKSB7ICp0aGlzID0gcTsgfQorICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgYW5nbGUtYXhpcyByb3RhdGlvbiBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGV4cGxpY2l0IEFuZ2xlQXhpcyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKSB7ICp0aGlzID0gbTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJvdGF0aW9uIGFuZ2xlIGluIHJhZGlhbiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIgYW5nbGUoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlOyB9CisgIC8qKiBccmV0dXJucyBhIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYW5nbGUgaW4gcmFkaWFuICovCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciYgYW5nbGUoKSB7IHJldHVybiBtX2FuZ2xlOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSByb3RhdGlvbiBheGlzICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFZlY3RvcjMmIGF4aXMoKSBjb25zdCB7IHJldHVybiBtX2F4aXM7IH0KKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC13cml0ZSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCByb3RhdGlvbiBheGlzLgorICAgICoKKyAgICAqIFx3YXJuaW5nIFRoZSByb3RhdGlvbiBheGlzIG11c3QgcmVtYWluIGEgXGIgdW5pdCB2ZWN0b3IuCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVmVjdG9yMyYgYXhpcygpIHsgcmV0dXJuIG1fYXhpczsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHJvdGF0aW9ucyAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUXVhdGVybmlvblR5cGUgb3BlcmF0b3IqIChjb25zdCBBbmdsZUF4aXMmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBRdWF0ZXJuaW9uVHlwZSgqdGhpcykgKiBRdWF0ZXJuaW9uVHlwZShvdGhlcik7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byByb3RhdGlvbnMgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFF1YXRlcm5pb25UeXBlIG9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvblR5cGUmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBRdWF0ZXJuaW9uVHlwZSgqdGhpcykgKiBvdGhlcjsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHJvdGF0aW9ucyAqLworICBmcmllbmQgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFF1YXRlcm5pb25UeXBlIG9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvblR5cGUmIGEsIGNvbnN0IEFuZ2xlQXhpcyYgYikKKyAgeyByZXR1cm4gYSAqIFF1YXRlcm5pb25UeXBlKGIpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHJvdGF0aW9uLCBpLmUuLCBhbiBhbmdsZS1heGlzIHdpdGggb3Bwb3NpdGUgcm90YXRpb24gYW5nbGUgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgQW5nbGVBeGlzIGludmVyc2UoKSBjb25zdAorICB7IHJldHVybiBBbmdsZUF4aXMoLW1fYW5nbGUsIG1fYXhpcyk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBRdWF0RGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgQW5nbGVBeGlzJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2U8UXVhdERlcml2ZWQ+JiBxKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgQW5nbGVBeGlzJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgQW5nbGVBeGlzJiBmcm9tUm90YXRpb25NYXRyaXgoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSk7CisgIEVJR0VOX0RFVklDRV9GVU5DIE1hdHJpeDMgdG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdDsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxBbmdsZUF4aXMsQW5nbGVBeGlzPE5ld1NjYWxhclR5cGU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFuZ2xlQXhpcyxBbmdsZUF4aXM8TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSgqdGhpcyk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgQW5nbGVBeGlzKGNvbnN0IEFuZ2xlQXhpczxPdGhlclNjYWxhclR5cGU+JiBvdGhlcikKKyAgeworICAgIG1fYXhpcyA9IG90aGVyLmF4aXMoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgICBtX2FuZ2xlID0gU2NhbGFyKG90aGVyLmFuZ2xlKCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBjb25zdCBBbmdsZUF4aXMgSWRlbnRpdHkoKSB7IHJldHVybiBBbmdsZUF4aXMoU2NhbGFyKDApLCBWZWN0b3IzOjpVbml0WCgpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc0FwcHJveChjb25zdCBBbmdsZUF4aXMmIG90aGVyLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9heGlzLmlzQXBwcm94KG90aGVyLm1fYXhpcywgcHJlYykgJiYgaW50ZXJuYWw6OmlzQXBwcm94KG1fYW5nbGUsb3RoZXIubV9hbmdsZSwgcHJlYyk7IH0KK307CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBzaW5nbGUgcHJlY2lzaW9uIGFuZ2xlLWF4aXMgdHlwZSAqLwordHlwZWRlZiBBbmdsZUF4aXM8ZmxvYXQ+IEFuZ2xlQXhpc2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogZG91YmxlIHByZWNpc2lvbiBhbmdsZS1heGlzIHR5cGUgKi8KK3R5cGVkZWYgQW5nbGVBeGlzPGRvdWJsZT4gQW5nbGVBeGlzZDsKKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgXGIgdW5pdCBxdWF0ZXJuaW9uLgorICAqCisgICogVGhlIHJlc3VsdGluZyBheGlzIGlzIG5vcm1hbGl6ZWQsIGFuZCB0aGUgY29tcHV0ZWQgYW5nbGUgaXMgaW4gdGhlIFswLHBpXSByYW5nZS4KKyAgKiAKKyAgKiBUaGlzIGZ1bmN0aW9uIGltcGxpY2l0bHkgbm9ybWFsaXplcyB0aGUgcXVhdGVybmlvbiBcYSBxLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgUXVhdERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBBbmdsZUF4aXM8U2NhbGFyPiYgQW5nbGVBeGlzPFNjYWxhcj46Om9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uQmFzZTxRdWF0RGVyaXZlZD4mIHEpCit7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGF0YW4yKQorICBFSUdFTl9VU0lOR19TVERfTUFUSChhYnMpCisgIFNjYWxhciBuID0gcS52ZWMoKS5ub3JtKCk7CisgIGlmKG48TnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICBuID0gcS52ZWMoKS5zdGFibGVOb3JtKCk7CisKKyAgaWYgKG4gIT0gU2NhbGFyKDApKQorICB7CisgICAgbV9hbmdsZSA9IFNjYWxhcigyKSphdGFuMihuLCBhYnMocS53KCkpKTsKKyAgICBpZihxLncoKSA8IDApCisgICAgICBuID0gLW47CisgICAgbV9heGlzICA9IHEudmVjKCkgLyBuOworICB9CisgIGVsc2UKKyAgeworICAgIG1fYW5nbGUgPSBTY2FsYXIoMCk7CisgICAgbV9heGlzIDw8IFNjYWxhcigxKSwgU2NhbGFyKDApLCBTY2FsYXIoMCk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSAzeDMgcm90YXRpb24gbWF0cml4IFxhIG1hdC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBBbmdsZUF4aXM8U2NhbGFyPiYgQW5nbGVBeGlzPFNjYWxhcj46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQpCit7CisgIC8vIFNpbmNlIGEgZGlyZWN0IGNvbnZlcnNpb24gd291bGQgbm90IGJlIHJlYWxseSBmYXN0ZXIsCisgIC8vIGxldCdzIHVzZSB0aGUgcm9idXN0IFF1YXRlcm5pb24gaW1wbGVtZW50YXRpb246CisgIHJldHVybiAqdGhpcyA9IFF1YXRlcm5pb25UeXBlKG1hdCk7Cit9CisKKy8qKgorKiBcYnJpZWYgU2V0cyBcYyAqdGhpcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeC4KKyoqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEFuZ2xlQXhpczxTY2FsYXI+JiBBbmdsZUF4aXM8U2NhbGFyPjo6ZnJvbVJvdGF0aW9uTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdCkKK3sKKyAgcmV0dXJuICp0aGlzID0gUXVhdGVybmlvblR5cGUobWF0KTsKK30KKworLyoqIENvbnN0cnVjdHMgYW5kIFxyZXR1cm5zIGFuIGVxdWl2YWxlbnQgM3gzIHJvdGF0aW9uIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3R5cGVuYW1lIEFuZ2xlQXhpczxTY2FsYXI+OjpNYXRyaXgzCitFSUdFTl9ERVZJQ0VfRlVOQyBBbmdsZUF4aXM8U2NhbGFyPjo6dG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdAoreworICBFSUdFTl9VU0lOR19TVERfTUFUSChzaW4pCisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGNvcykKKyAgTWF0cml4MyByZXM7CisgIFZlY3RvcjMgc2luX2F4aXMgID0gc2luKG1fYW5nbGUpICogbV9heGlzOworICBTY2FsYXIgYyA9IGNvcyhtX2FuZ2xlKTsKKyAgVmVjdG9yMyBjb3MxX2F4aXMgPSAoU2NhbGFyKDEpLWMpICogbV9heGlzOworCisgIFNjYWxhciB0bXA7CisgIHRtcCA9IGNvczFfYXhpcy54KCkgKiBtX2F4aXMueSgpOworICByZXMuY29lZmZSZWYoMCwxKSA9IHRtcCAtIHNpbl9heGlzLnooKTsKKyAgcmVzLmNvZWZmUmVmKDEsMCkgPSB0bXAgKyBzaW5fYXhpcy56KCk7CisKKyAgdG1wID0gY29zMV9heGlzLngoKSAqIG1fYXhpcy56KCk7CisgIHJlcy5jb2VmZlJlZigwLDIpID0gdG1wICsgc2luX2F4aXMueSgpOworICByZXMuY29lZmZSZWYoMiwwKSA9IHRtcCAtIHNpbl9heGlzLnkoKTsKKworICB0bXAgPSBjb3MxX2F4aXMueSgpICogbV9heGlzLnooKTsKKyAgcmVzLmNvZWZmUmVmKDEsMikgPSB0bXAgLSBzaW5fYXhpcy54KCk7CisgIHJlcy5jb2VmZlJlZigyLDEpID0gdG1wICsgc2luX2F4aXMueCgpOworCisgIHJlcy5kaWFnb25hbCgpID0gKGNvczFfYXhpcy5jd2lzZVByb2R1Y3QobV9heGlzKSkuYXJyYXkoKSArIGM7CisKKyAgcmV0dXJuIHJlczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BTkdMRUFYSVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvRXVsZXJBbmdsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMzMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FVUxFUkFOR0xFU19ICisjZGVmaW5lIEVJR0VOX0VVTEVSQU5HTEVTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICoKKyAgKiBccmV0dXJucyB0aGUgRXVsZXItYW5nbGVzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXggXGMgKnRoaXMgdXNpbmcgdGhlIGNvbnZlbnRpb24gZGVmaW5lZCBieSB0aGUgdHJpcGxldCAoXGEgYTAsXGEgYTEsXGEgYTIpCisgICoKKyAgKiBFYWNoIG9mIHRoZSB0aHJlZSBwYXJhbWV0ZXJzIFxhIGEwLFxhIGExLFxhIGEyIHJlcHJlc2VudHMgdGhlIHJlc3BlY3RpdmUgcm90YXRpb24gYXhpcyBhcyBhbiBpbnRlZ2VyIGluIHswLDEsMn0uCisgICogRm9yIGluc3RhbmNlLCBpbjoKKyAgKiBcY29kZSBWZWN0b3IzZiBlYSA9IG1hdC5ldWxlckFuZ2xlcygyLCAwLCAyKTsgXGVuZGNvZGUKKyAgKiAiMiIgcmVwcmVzZW50cyB0aGUgeiBheGlzIGFuZCAiMCIgdGhlIHggYXhpcywgZXRjLiBUaGUgcmV0dXJuZWQgYW5nbGVzIGFyZSBzdWNoIHRoYXQKKyAgKiB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgZXF1YWxpdHk6CisgICogXGNvZGUKKyAgKiBtYXQgPT0gQW5nbGVBeGlzZihlYVswXSwgVmVjdG9yM2Y6OlVuaXRaKCkpCisgICogICAgICAqIEFuZ2xlQXhpc2YoZWFbMV0sIFZlY3RvcjNmOjpVbml0WCgpKQorICAqICAgICAgKiBBbmdsZUF4aXNmKGVhWzJdLCBWZWN0b3IzZjo6VW5pdFooKSk7IFxlbmRjb2RlCisgICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcmlnaHQtbXVsdGlwbHkgY29udmVudGlvbnMgKHdpdGggcmlnaHQgaGFuZCBzaWRlIGZyYW1lcykuCisgICogCisgICogVGhlIHJldHVybmVkIGFuZ2xlcyBhcmUgaW4gdGhlIHJhbmdlcyBbMDpwaV14Wy1waTpwaV14Wy1waTpwaV0uCisgICogCisgICogXHNhIGNsYXNzIEFuZ2xlQXhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBNYXRyaXg8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6U2NhbGFyLDMsMT4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmV1bGVyQW5nbGVzKEluZGV4IGEwLCBJbmRleCBhMSwgSW5kZXggYTIpIGNvbnN0Cit7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGF0YW4yKQorICBFSUdFTl9VU0lOR19TVERfTUFUSChzaW4pCisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGNvcykKKyAgLyogSW1wbGVtZW50ZWQgZnJvbSBHcmFwaGljcyBHZW1zIElWICovCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoRGVyaXZlZCwzLDMpCisKKyAgTWF0cml4PFNjYWxhciwzLDE+IHJlczsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLDIsMT4gVmVjdG9yMjsKKworICBjb25zdCBJbmRleCBvZGQgPSAoKGEwKzEpJTMgPT0gYTEpID8gMCA6IDE7CisgIGNvbnN0IEluZGV4IGkgPSBhMDsKKyAgY29uc3QgSW5kZXggaiA9IChhMCArIDEgKyBvZGQpJTM7CisgIGNvbnN0IEluZGV4IGsgPSAoYTAgKyAyIC0gb2RkKSUzOworICAKKyAgaWYgKGEwPT1hMikKKyAgeworICAgIHJlc1swXSA9IGF0YW4yKGNvZWZmKGosaSksIGNvZWZmKGssaSkpOworICAgIGlmKChvZGQgJiYgcmVzWzBdPFNjYWxhcigwKSkgfHwgKCghb2RkKSAmJiByZXNbMF0+U2NhbGFyKDApKSkKKyAgICB7CisgICAgICBpZihyZXNbMF0gPiBTY2FsYXIoMCkpIHsKKyAgICAgICAgcmVzWzBdIC09IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzWzBdICs9IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICB9CisgICAgICBTY2FsYXIgczIgPSBWZWN0b3IyKGNvZWZmKGosaSksIGNvZWZmKGssaSkpLm5vcm0oKTsKKyAgICAgIHJlc1sxXSA9IC1hdGFuMihzMiwgY29lZmYoaSxpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBTY2FsYXIgczIgPSBWZWN0b3IyKGNvZWZmKGosaSksIGNvZWZmKGssaSkpLm5vcm0oKTsKKyAgICAgIHJlc1sxXSA9IGF0YW4yKHMyLCBjb2VmZihpLGkpKTsKKyAgICB9CisgICAgCisgICAgLy8gV2l0aCBhPSgwLDEsMCksIHdlIGhhdmUgaT0wOyBqPTE7IGs9MiwgYW5kIGFmdGVyIGNvbXB1dGluZyB0aGUgZmlyc3QgdHdvIGFuZ2xlcywKKyAgICAvLyB3ZSBjYW4gY29tcHV0ZSB0aGVpciByZXNwZWN0aXZlIHJvdGF0aW9uLCBhbmQgYXBwbHkgaXRzIGludmVyc2UgdG8gTS4gU2luY2UgdGhlIHJlc3VsdCBtdXN0CisgICAgLy8gYmUgYSByb3RhdGlvbiBhcm91bmQgeCwgd2UgaGF2ZToKKyAgICAvLworICAgIC8vICBjMiAgczEuczIgYzEuczIgICAgICAgICAgICAgICAgICAgMSAgMCAgIDAgCisgICAgLy8gIDAgICBjMSAgICAtczEgICAgICAgKiAgICBNICAgID0gICAwICBjMyAgczMKKyAgICAvLyAgLXMyIHMxLmMyIGMxLmMyICAgICAgICAgICAgICAgICAgIDAgLXMzICBjMworICAgIC8vCisgICAgLy8gIFRodXM6ICBtMTEuYzEgLSBtMjEuczEgPSBjMyAgJiAgIG0xMi5jMSAtIG0yMi5zMSA9IHMzCisgICAgCisgICAgU2NhbGFyIHMxID0gc2luKHJlc1swXSk7CisgICAgU2NhbGFyIGMxID0gY29zKHJlc1swXSk7CisgICAgcmVzWzJdID0gYXRhbjIoYzEqY29lZmYoaixrKS1zMSpjb2VmZihrLGspLCBjMSpjb2VmZihqLGopIC0gczEgKiBjb2VmZihrLGopKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgcmVzWzBdID0gYXRhbjIoY29lZmYoaixrKSwgY29lZmYoayxrKSk7CisgICAgU2NhbGFyIGMyID0gVmVjdG9yMihjb2VmZihpLGkpLCBjb2VmZihpLGopKS5ub3JtKCk7CisgICAgaWYoKG9kZCAmJiByZXNbMF08U2NhbGFyKDApKSB8fCAoKCFvZGQpICYmIHJlc1swXT5TY2FsYXIoMCkpKSB7CisgICAgICBpZihyZXNbMF0gPiBTY2FsYXIoMCkpIHsKKyAgICAgICAgcmVzWzBdIC09IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzWzBdICs9IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICB9CisgICAgICByZXNbMV0gPSBhdGFuMigtY29lZmYoaSxrKSwgLWMyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmVzWzFdID0gYXRhbjIoLWNvZWZmKGksayksIGMyKTsKKyAgICBTY2FsYXIgczEgPSBzaW4ocmVzWzBdKTsKKyAgICBTY2FsYXIgYzEgPSBjb3MocmVzWzBdKTsKKyAgICByZXNbMl0gPSBhdGFuMihzMSpjb2VmZihrLGkpLWMxKmNvZWZmKGosaSksIGMxKmNvZWZmKGosaikgLSBzMSAqIGNvZWZmKGssaikpOworICB9CisgIGlmICghb2RkKQorICAgIHJlcyA9IC1yZXM7CisgIAorICByZXR1cm4gcmVzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0VVTEVSQU5HTEVTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9Ib21vZ2VuZW91cy5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0hvbW9nZW5lb3VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwZGExYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Ib21vZ2VuZW91cy5oCkBAIC0wLDAgKzEsNDk3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IT01PR0VORU9VU19ICisjZGVmaW5lIEVJR0VOX0hPTU9HRU5FT1VTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIEhvbW9nZW5lb3VzCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBvbmUgKG9yIGEgc2V0IG9mKSBob21vZ2VuZW91cyB2ZWN0b3IocykKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgYXJlIG1ha2luZyBob21vZ2VuZW91cworICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2Ygb25lIChvciBhIHNldCBvZikgaG9tb2dlbmVvdXMgdmVjdG9yKHMpLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpob21vZ2VuZW91cygpIGFuZCBtb3N0IG9mIHRoZSB0aW1lCisgICogdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpob21vZ2VuZW91cygpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IERpcmVjdGlvbj4KK3N0cnVjdCB0cmFpdHM8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxEaXJlY3Rpb24+ID4KKyA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVmX3NlbGVjdG9yPE1hdHJpeFR5cGU+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgUm93c1BsdXNPbmUgPSAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYykgPworICAgICAgICAgICAgICAgICAgaW50KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSArIDEgOiBEeW5hbWljLAorICAgIENvbHNQbHVzT25lID0gKE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lICE9IER5bmFtaWMpID8KKyAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgKyAxIDogRHluYW1pYywKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IERpcmVjdGlvbj09VmVydGljYWwgID8gIFJvd3NQbHVzT25lIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyBDb2xzUGx1c09uZSA6IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBDb2xzQXRDb21waWxlVGltZSwKKyAgICBUbXBGbGFncyA9IF9NYXRyaXhUeXBlTmVzdGVkOjpGbGFncyAmIEhlcmVkaXRhcnlCaXRzLAorICAgIEZsYWdzID0gQ29sc0F0Q29tcGlsZVRpbWU9PTEgPyAoVG1wRmxhZ3MgJiB+Um93TWFqb3JCaXQpCisgICAgICAgICAgOiBSb3dzQXRDb21waWxlVGltZT09MSA/IChUbXBGbGFncyB8IFJvd01ham9yQml0KQorICAgICAgICAgIDogVG1wRmxhZ3MKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdHlwZW5hbWUgTGhzPiBzdHJ1Y3QgaG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X2ltcGw7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIFJocz4gc3RydWN0IGhvbW9nZW5lb3VzX3JpZ2h0X3Byb2R1Y3RfaW1wbDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IF9EaXJlY3Rpb24+IGNsYXNzIEhvbW9nZW5lb3VzCisgIDogcHVibGljIE1hdHJpeEJhc2U8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxfRGlyZWN0aW9uPiA+LCBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIE1hdHJpeFR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKyAgICBlbnVtIHsgRGlyZWN0aW9uID0gX0RpcmVjdGlvbiB9OworCisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPEhvbW9nZW5lb3VzPiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoSG9tb2dlbmVvdXMpCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBpbmxpbmUgSG9tb2dlbmVvdXMoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpCisgICAge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpICsgKGludChEaXJlY3Rpb24pPT1WZXJ0aWNhbCAgID8gMSA6IDApOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCkgKyAoaW50KERpcmVjdGlvbik9PUhvcml6b250YWwgPyAxIDogMCk7IH0KKyAgICAKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBOZXN0ZWRFeHByZXNzaW9uJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgUHJvZHVjdDxIb21vZ2VuZW91cyxSaHM+CisgICAgb3BlcmF0b3IqIChjb25zdCBNYXRyaXhCYXNlPFJocz4mIHJocykgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW50KERpcmVjdGlvbik9PUhvcml6b250YWwpOworICAgICAgcmV0dXJuIFByb2R1Y3Q8SG9tb2dlbmVvdXMsUmhzPigqdGhpcyxyaHMuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHM+IGZyaWVuZAorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBQcm9kdWN0PExocyxIb21vZ2VuZW91cz4KKyAgICBvcGVyYXRvciogKGNvbnN0IE1hdHJpeEJhc2U8TGhzPiYgbGhzLCBjb25zdCBIb21vZ2VuZW91cyYgcmhzKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbnQoRGlyZWN0aW9uKT09VmVydGljYWwpOworICAgICAgcmV0dXJuIFByb2R1Y3Q8TGhzLEhvbW9nZW5lb3VzPihsaHMuZGVyaXZlZCgpLHJocyk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+IGZyaWVuZAorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBQcm9kdWN0PFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4sIEhvbW9nZW5lb3VzID4KKyAgICBvcGVyYXRvciogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIGxocywgY29uc3QgSG9tb2dlbmVvdXMmIHJocykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW50KERpcmVjdGlvbik9PVZlcnRpY2FsKTsKKyAgICAgIHJldHVybiBQcm9kdWN0PFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4sIEhvbW9nZW5lb3VzPihsaHMscmhzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF9vZjxGdW5jKFNjYWxhcixTY2FsYXIpPjo6dHlwZQorICAgIHJlZHV4KGNvbnN0IEZ1bmMmIGZ1bmMpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGZ1bmMobV9tYXRyaXgucmVkdXgoZnVuYyksIFNjYWxhcigxKSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7Cit9OworCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIHZlY3RvciBhcmd1bWVudCwgd2l0aCB0aGUgdmFsdWUgMSBzeW1ib2xpY2FsbHkgYXBwZW5kZWQgYXMgdGhlIGxhc3QgY29lZmZpY2llbnQuCisgICoKKyAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYWZmaW5lIGNvb3JkaW5hdGVzIHRvIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaG9tb2dlbmVvdXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ob21vZ2VuZW91cy5vdXQKKyAgKgorICAqIFxzYSBWZWN0b3J3aXNlT3A6OmhvbW9nZW5lb3VzKCksIGNsYXNzIEhvbW9nZW5lb3VzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkhvbW9nZW5lb3VzUmV0dXJuVHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6aG9tb2dlbmVvdXMoKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpOworICByZXR1cm4gSG9tb2dlbmVvdXNSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXHJldHVybnMgYW4gZXhwcmVzc2lvbiB3aGVyZSB0aGUgdmFsdWUgMSBpcyBzeW1ib2xpY2FsbHkgYXBwZW5kZWQgYXMgdGhlIGZpbmFsIGNvZWZmaWNpZW50IHRvIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSBtYXRyaXguCisgICoKKyAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYWZmaW5lIGNvb3JkaW5hdGVzIHRvIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgVmVjdG9yd2lzZU9wX2hvbW9nZW5lb3VzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFZlY3Rvcndpc2VPcF9ob21vZ2VuZW91cy5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpob21vZ2VuZW91cygpLCBjbGFzcyBIb21vZ2VuZW91cyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIGludCBEaXJlY3Rpb24+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSG9tb2dlbmVvdXM8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPgorVmVjdG9yd2lzZU9wPEV4cHJlc3Npb25UeXBlLERpcmVjdGlvbj46OmhvbW9nZW5lb3VzKCkgY29uc3QKK3sKKyAgcmV0dXJuIEhvbW9nZW5lb3VzUmV0dXJuVHlwZShfZXhwcmVzc2lvbigpKTsKK30KKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgaG9tb2dlbmVvdXMgbm9ybWFsaXphdGlvbgorICAqCisgICogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgTi0xIGZpcnN0IGNvZWZmaWNpZW50cyBvZiBcYyAqdGhpcyBkaXZpZGVkIGJ5IHRoYXQgbGFzdCBjb2VmZmljaWVudC4KKyAgKgorICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29udmVydCBob21vZ2VuZW91cyBjb29yZGluYXRlcyB0byBhZmZpbmUgY29vcmRpbmF0ZXMuCisgICoKKyAgKiBJdCBpcyBlc3NlbnRpYWxseSBhIHNob3J0Y3V0IGZvcjoKKyAgKiBcY29kZQorICAgIHRoaXMtPmhlYWQodGhpcy0+c2l6ZSgpLTEpL3RoaXMtPmNvZWZmKHRoaXMtPnNpemUoKS0xKTsKKyAgICBcZW5kY29kZQorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9obm9ybWFsaXplZC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2hub3JtYWxpemVkLm91dAorICAqCisgICogXHNhIFZlY3Rvcndpc2VPcDo6aG5vcm1hbGl6ZWQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpITm9ybWFsaXplZFJldHVyblR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46Omhub3JtYWxpemVkKCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKTsKKyAgcmV0dXJuIENvbnN0U3RhcnRNaW51c09uZShkZXJpdmVkKCksMCwwLAorICAgIENvbHNBdENvbXBpbGVUaW1lPT0xP3NpemUoKS0xOjEsCisgICAgQ29sc0F0Q29tcGlsZVRpbWU9PTE/MTpzaXplKCktMSkgLyBjb2VmZihzaXplKCktMSk7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIGNvbHVtbiBvciByb3ctd2lzZSBob21vZ2VuZW91cyBub3JtYWxpemF0aW9uCisgICoKKyAgKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBmaXJzdCBOLTEgY29lZmZpY2llbnRzIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIFxjICp0aGlzIGRpdmlkZWQgYnkgdGhlIGxhc3QgY29lZmZpY2llbnQgb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykuCisgICoKKyAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgdG8gYWZmaW5lIGNvb3JkaW5hdGVzLgorICAqCisgICogSXQgaXMgY29uY2VwdHVhbGx5IGVxdWl2YWxlbnQgdG8gY2FsbGluZyBNYXRyaXhCYXNlOjpobm9ybWFsaXplZCgpIHRvIGVhY2ggY29sdW1uIChvciByb3cpIG9mIFxjICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgRGlyZWN0aW9uV2lzZV9obm9ybWFsaXplZC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBEaXJlY3Rpb25XaXNlX2hub3JtYWxpemVkLm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6Omhub3JtYWxpemVkKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IHR5cGVuYW1lIFZlY3Rvcndpc2VPcDxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+OjpITm9ybWFsaXplZFJldHVyblR5cGUKK1ZlY3Rvcndpc2VPcDxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+Ojpobm9ybWFsaXplZCgpIGNvbnN0Cit7CisgIHJldHVybiBITm9ybWFsaXplZF9CbG9jayhfZXhwcmVzc2lvbigpLDAsMCwKKyAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IF9leHByZXNzaW9uKCkucm93cygpLTEgOiBfZXhwcmVzc2lvbigpLnJvd3MoKSwKKyAgICAgIERpcmVjdGlvbj09SG9yaXpvbnRhbCA/IF9leHByZXNzaW9uKCkuY29scygpLTEgOiBfZXhwcmVzc2lvbigpLmNvbHMoKSkuY3dpc2VRdW90aWVudCgKKyAgICAgIFJlcGxpY2F0ZTxITm9ybWFsaXplZF9GYWN0b3JzLAorICAgICAgICAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IEhOb3JtYWxpemVkX1NpemVNaW51c09uZSA6IDEsCisgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsID8gSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lIDogMT4KKyAgICAgICAgKEhOb3JtYWxpemVkX0ZhY3RvcnMoX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgID8gX2V4cHJlc3Npb24oKS5yb3dzKCktMTowLAorICAgICAgICAgIERpcmVjdGlvbj09SG9yaXpvbnRhbCAgPyBfZXhwcmVzc2lvbigpLmNvbHMoKS0xOjAsCisgICAgICAgICAgRGlyZWN0aW9uPT1WZXJ0aWNhbCAgICA/IDEgOiBfZXhwcmVzc2lvbigpLnJvd3MoKSwKKyAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgID8gMSA6IF9leHByZXNzaW9uKCkuY29scygpKSwKKyAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IF9leHByZXNzaW9uKCkucm93cygpLTEgOiAxLAorICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsID8gX2V4cHJlc3Npb24oKS5jb2xzKCktMSA6IDEpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4T3JUcmFuc2Zvcm1UeXBlPgorc3RydWN0IHRha2VfbWF0cml4X2Zvcl9wcm9kdWN0Cit7CisgIHR5cGVkZWYgTWF0cml4T3JUcmFuc2Zvcm1UeXBlIHR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdCB0eXBlJiBydW4oY29uc3QgdHlwZSAmeCkgeyByZXR1cm4geDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSxpbnQgT3B0aW9ucz4KK3N0cnVjdCB0YWtlX21hdHJpeF9mb3JfcHJvZHVjdDxUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIE1vZGUsIE9wdGlvbnM+ID4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIE1vZGUsIE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdDx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpDb25zdEFmZmluZVBhcnQ+Ojp0eXBlIHR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyB0eXBlIHJ1biAoY29uc3QgVHJhbnNmb3JtVHlwZSYgeCkgeyByZXR1cm4geC5hZmZpbmUoKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4KK3N0cnVjdCB0YWtlX21hdHJpeF9mb3JfcHJvZHVjdDxUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIFByb2plY3RpdmUsIE9wdGlvbnM+ID4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIFByb2plY3RpdmUsIE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSB0eXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgdHlwZSYgcnVuIChjb25zdCBUcmFuc2Zvcm1UeXBlJiB4KSB7IHJldHVybiB4Lm1hdHJpeCgpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIExocz4KK3N0cnVjdCB0cmFpdHM8aG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxWZXJ0aWNhbD4sTGhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdGFrZV9tYXRyaXhfZm9yX3Byb2R1Y3Q8TGhzPjo6dHlwZSBMaHNNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZUNsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHNNYXRyaXhUeXBlPjo6dHlwZSBMaHNNYXRyaXhUeXBlQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3Byb3Blcl9tYXRyaXhfdHlwZTwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGVDbGVhbmVkPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgICBMaHNNYXRyaXhUeXBlQ2xlYW5lZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGVDbGVhbmVkOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZUNsZWFuZWQ6OlBsYWluT2JqZWN0OjpPcHRpb25zLAorICAgICAgICAgICAgICAgICBMaHNNYXRyaXhUeXBlQ2xlYW5lZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGVDbGVhbmVkOjpNYXhDb2xzQXRDb21waWxlVGltZT46OnR5cGUgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdHlwZW5hbWUgTGhzPgorc3RydWN0IGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPE1hdHJpeFR5cGUsVmVydGljYWw+LExocz4KKyAgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfaW1wbDxIb21vZ2VuZW91czxNYXRyaXhUeXBlLFZlcnRpY2FsPixMaHM+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8aG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X2ltcGw+OjpMaHNNYXRyaXhUeXBlIExoc01hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHNNYXRyaXhUeXBlPjo6dHlwZSBMaHNNYXRyaXhUeXBlQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGVuYW1lIExoc01hdHJpeFR5cGVDbGVhbmVkOjpOZXN0ZWQ+Ojp0eXBlIExoc01hdHJpeFR5cGVOZXN0ZWQ7CisgIEVJR0VOX0RFVklDRV9GVU5DIGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsKGNvbnN0IExocyYgbGhzLCBjb25zdCBNYXRyaXhUeXBlJiByaHMpCisgICAgOiBtX2xocyh0YWtlX21hdHJpeF9mb3JfcHJvZHVjdDxMaHM+OjpydW4obGhzKSksCisgICAgICBtX3JocyhyaHMpCisgIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2xocy5yb3dzKCk7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvLyBGSVhNRSBpbnZlc3RpZ2F0ZSBob3cgdG8gYWxsb3cgbGF6eSBldmFsdWF0aW9uIG9mIHRoaXMgcHJvZHVjdCB3aGVuIHBvc3NpYmxlCisgICAgZHN0ID0gQmxvY2s8Y29uc3QgTGhzTWF0cml4VHlwZU5lc3RlZCwKKyAgICAgICAgICAgICAgTGhzTWF0cml4VHlwZU5lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgIExoc01hdHJpeFR5cGVOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljP0R5bmFtaWM6TGhzTWF0cml4VHlwZU5lc3RlZDo6Q29sc0F0Q29tcGlsZVRpbWUtMT4KKyAgICAgICAgICAgIChtX2xocywwLDAsbV9saHMucm93cygpLG1fbGhzLmNvbHMoKS0xKSAqIG1fcmhzOworICAgIGRzdCArPSBtX2xocy5jb2wobV9saHMuY29scygpLTEpLnJvd3dpc2UoKQorICAgICAgICAgICAgLnRlbXBsYXRlIHJlcGxpY2F0ZTxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4obV9yaHMuY29scygpKTsKKyAgfQorCisgIHR5cGVuYW1lIExoc01hdHJpeFR5cGVDbGVhbmVkOjpOZXN0ZWQgbV9saHM7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxIb3Jpem9udGFsPixSaHM+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3Byb3Blcl9tYXRyaXhfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoczo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZT46OnR5cGUgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdHlwZW5hbWUgUmhzPgorc3RydWN0IGhvbW9nZW5lb3VzX3JpZ2h0X3Byb2R1Y3RfaW1wbDxIb21vZ2VuZW91czxNYXRyaXhUeXBlLEhvcml6b250YWw+LFJocz4KKyAgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxIb3Jpem9udGFsPixSaHM+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGVuYW1lIFJoczo6TmVzdGVkPjo6dHlwZSBSaHNOZXN0ZWQ7CisgIEVJR0VOX0RFVklDRV9GVU5DIGhvbW9nZW5lb3VzX3JpZ2h0X3Byb2R1Y3RfaW1wbChjb25zdCBNYXRyaXhUeXBlJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKQorICB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9saHMucm93cygpOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9yaHMuY29scygpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgLy8gRklYTUUgaW52ZXN0aWdhdGUgaG93IHRvIGFsbG93IGxhenkgZXZhbHVhdGlvbiBvZiB0aGlzIHByb2R1Y3Qgd2hlbiBwb3NzaWJsZQorICAgIGRzdCA9IG1fbGhzICogQmxvY2s8Y29uc3QgUmhzTmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYz9EeW5hbWljOlJoc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJoc05lc3RlZDo6Q29sc0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICAobV9yaHMsMCwwLG1fcmhzLnJvd3MoKS0xLG1fcmhzLmNvbHMoKSk7CisgICAgZHN0ICs9IG1fcmhzLnJvdyhtX3Jocy5yb3dzKCktMSkuY29sd2lzZSgpCisgICAgICAgICAgICAudGVtcGxhdGUgcmVwbGljYXRlPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPihtX2xocy5yb3dzKCkpOworICB9CisKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbGhzOworICB0eXBlbmFtZSBSaHM6Ok5lc3RlZCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsaW50IERpcmVjdGlvbj4KK3N0cnVjdCBldmFsdWF0b3JfdHJhaXRzPEhvbW9nZW5lb3VzPEFyZ1R5cGUsRGlyZWN0aW9uPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RvcmFnZV9raW5kX3RvX2V2YWx1YXRvcl9raW5kPHR5cGVuYW1lIEFyZ1R5cGU6OlN0b3JhZ2VLaW5kPjo6S2luZCBLaW5kOworICB0eXBlZGVmIEhvbW9nZW5lb3VzU2hhcGUgU2hhcGU7ICAKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFzc2lnbm1lbnRLaW5kPERlbnNlU2hhcGUsSG9tb2dlbmVvdXNTaGFwZT4geyB0eXBlZGVmIERlbnNlMkRlbnNlIEtpbmQ7IH07CisKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZSxpbnQgRGlyZWN0aW9uPgorc3RydWN0IHVuYXJ5X2V2YWx1YXRvcjxIb21vZ2VuZW91czxBcmdUeXBlLERpcmVjdGlvbj4sIEluZGV4QmFzZWQ+CisgIDogZXZhbHVhdG9yPHR5cGVuYW1lIEhvbW9nZW5lb3VzPEFyZ1R5cGUsRGlyZWN0aW9uPjo6UGxhaW5PYmplY3QgPgoreworICB0eXBlZGVmIEhvbW9nZW5lb3VzPEFyZ1R5cGUsRGlyZWN0aW9uPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3ApCisgICAgOiBCYXNlKCksIG1fdGVtcChvcCkKKyAgeworICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UobV90ZW1wKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFBsYWluT2JqZWN0IG1fdGVtcDsKK307CisKKy8vIGRlbnNlID0gaG9tb2dlbmVvdXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBIb21vZ2VuZW91czxBcmdUeXBlLFZlcnRpY2FsPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyPiwgRGVuc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgSG9tb2dlbmVvdXM8QXJnVHlwZSxWZXJ0aWNhbD4gU3JjWHByVHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXI+ICYpCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKworICAgIGRzdC50ZW1wbGF0ZSB0b3BSb3dzPEFyZ1R5cGU6OlJvd3NBdENvbXBpbGVUaW1lPihzcmMubmVzdGVkRXhwcmVzc2lvbigpLnJvd3MoKSkgPSBzcmMubmVzdGVkRXhwcmVzc2lvbigpOworICAgIGRzdC5yb3coZHN0LnJvd3MoKS0xKS5zZXRPbmVzKCk7CisgIH0KK307CisKKy8vIGRlbnNlID0gaG9tb2dlbmVvdXMKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBIb21vZ2VuZW91czxBcmdUeXBlLEhvcml6b250YWw+LCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXI+LCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBIb21vZ2VuZW91czxBcmdUeXBlLEhvcml6b250YWw+IFNyY1hwclR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyPiAmKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisKKyAgICBkc3QudGVtcGxhdGUgbGVmdENvbHM8QXJnVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KHNyYy5uZXN0ZWRFeHByZXNzaW9uKCkuY29scygpKSA9IHNyYy5uZXN0ZWRFeHByZXNzaW9uKCk7CisgICAgZHN0LmNvbChkc3QuY29scygpLTEpLnNldE9uZXMoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzQXJnLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPExoc0FyZyxIb3Jpem9udGFsPiwgUmhzLCBIb21vZ2VuZW91c1NoYXBlLCBEZW5zZVNoYXBlLCBQcm9kdWN0VGFnPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBldmFsVG8oRGVzdCYgZHN0LCBjb25zdCBIb21vZ2VuZW91czxMaHNBcmcsSG9yaXpvbnRhbD4mIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICBob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TGhzQXJnLEhvcml6b250YWw+LCBSaHM+KGxocy5uZXN0ZWRFeHByZXNzaW9uKCksIHJocykuZXZhbFRvKGRzdCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgaG9tb2dlbmVvdXNfcmlnaHRfcHJvZHVjdF9yZWZhY3RvcmluZ19oZWxwZXIKK3sKKyAgZW51bSB7CisgICAgRGltICA9IExoczo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgUm93cyA9IExoczo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OnRlbXBsYXRlIENvbnN0TlJvd3NCbG9ja1hwcjxEaW0+OjpUeXBlICAgICAgICAgIExpbmVhckJsb2NrQ29uc3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PExpbmVhckJsb2NrQ29uc3Q+Ojp0eXBlICAgICAgICAgICAgICAgICBMaW5lYXJCbG9jazsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OkNvbnN0Um93WHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50Q29sdW1uOworICB0eXBlZGVmIFJlcGxpY2F0ZTxjb25zdCBDb25zdGFudENvbHVtbixSb3dzLDE+ICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRCbG9jazsKKyAgdHlwZWRlZiBQcm9kdWN0PExocyxMaW5lYXJCbG9jayxMYXp5UHJvZHVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhclByb2R1Y3Q7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBMaHM6OlNjYWxhcix0eXBlbmFtZSBSaHM6OlNjYWxhcj4sIGNvbnN0IExpbmVhclByb2R1Y3QsIGNvbnN0IENvbnN0YW50QmxvY2s+IFhwcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExocywgUmhzLCBMYXp5UHJvZHVjdD4sIFByb2R1Y3RUYWcsIEhvbW9nZW5lb3VzU2hhcGUsIERlbnNlU2hhcGU+CisgOiBwdWJsaWMgZXZhbHVhdG9yPHR5cGVuYW1lIGhvbW9nZW5lb3VzX3JpZ2h0X3Byb2R1Y3RfcmVmYWN0b3JpbmdfaGVscGVyPHR5cGVuYW1lIExoczo6TmVzdGVkRXhwcmVzc2lvbixSaHM+OjpYcHI+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+IFhwclR5cGU7CisgIHR5cGVkZWYgaG9tb2dlbmVvdXNfcmlnaHRfcHJvZHVjdF9yZWZhY3RvcmluZ19oZWxwZXI8dHlwZW5hbWUgTGhzOjpOZXN0ZWRFeHByZXNzaW9uLFJocz4gaGVscGVyOworICB0eXBlZGVmIHR5cGVuYW1lIGhlbHBlcjo6Q29uc3RhbnRCbG9jayBDb25zdGFudEJsb2NrOworICB0eXBlZGVmIHR5cGVuYW1lIGhlbHBlcjo6WHByIFJlZmFjdG9yZWRYcHI7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFJlZmFjdG9yZWRYcHI+IEJhc2U7CisgIAorICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBCYXNlKCAgeHByLmxocygpLm5lc3RlZEV4cHJlc3Npb24oKSAubGF6eVByb2R1Y3QoICB4cHIucmhzKCkudGVtcGxhdGUgdG9wUm93czxoZWxwZXI6OkRpbT4oeHByLmxocygpLm5lc3RlZEV4cHJlc3Npb24oKS5jb2xzKCkpICkKKyAgICAgICAgICAgICsgQ29uc3RhbnRCbG9jayh4cHIucmhzKCkucm93KHhwci5yaHMoKS5yb3dzKCktMSkseHByLmxocygpLnJvd3MoKSwgMSkgKQorICB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHNBcmcsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgSG9tb2dlbmVvdXM8UmhzQXJnLFZlcnRpY2FsPiwgRGVuc2VTaGFwZSwgSG9tb2dlbmVvdXNTaGFwZSwgUHJvZHVjdFRhZz4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IEhvbW9nZW5lb3VzPFJoc0FyZyxWZXJ0aWNhbD4mIHJocykKKyAgeworICAgIGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPFJoc0FyZyxWZXJ0aWNhbD4sIExocz4obGhzLCByaHMubmVzdGVkRXhwcmVzc2lvbigpKS5ldmFsVG8oZHN0KTsKKyAgfQorfTsKKworLy8gVE9ETzogdGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBpcyB0byBhZGRyZXNzIGEgcmVncmVzc2lvbiBmcm9tIDMuMiB0byAzLjMKKy8vIEluIHRoZSBmdXR1cmUsIHRoaXMgcGF0aCBzaG91bGQgYmUgb3B0aW1pemVkLgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHNBcmcsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgSG9tb2dlbmVvdXM8UmhzQXJnLFZlcnRpY2FsPiwgVHJpYW5ndWxhclNoYXBlLCBIb21vZ2VuZW91c1NoYXBlLCBQcm9kdWN0VGFnPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBldmFsVG8oRGVzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgSG9tb2dlbmVvdXM8UmhzQXJnLFZlcnRpY2FsPiYgcmhzKQorICB7CisgICAgZHN0Lm5vYWxpYXMoKSA9IGxocyAqIHJocy5ldmFsKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgaG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X3JlZmFjdG9yaW5nX2hlbHBlcgoreworICBlbnVtIHsKKyAgICBEaW0gPSBSaHM6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHMgPSBSaHM6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjp0ZW1wbGF0ZSBDb25zdE5Db2xzQmxvY2tYcHI8RGltPjo6VHlwZSAgICAgICAgICBMaW5lYXJCbG9ja0NvbnN0OworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDxMaW5lYXJCbG9ja0NvbnN0Pjo6dHlwZSAgICAgICAgICAgICAgICAgTGluZWFyQmxvY2s7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpDb25zdENvbFhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudENvbHVtbjsKKyAgdHlwZWRlZiBSZXBsaWNhdGU8Y29uc3QgQ29uc3RhbnRDb2x1bW4sMSxDb2xzPiAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50QmxvY2s7CisgIHR5cGVkZWYgUHJvZHVjdDxMaW5lYXJCbG9jayxSaHMsTGF6eVByb2R1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJQcm9kdWN0OworICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8dHlwZW5hbWUgTGhzOjpTY2FsYXIsdHlwZW5hbWUgUmhzOjpTY2FsYXI+LCBjb25zdCBMaW5lYXJQcm9kdWN0LCBjb25zdCBDb25zdGFudEJsb2NrPiBYcHI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+LCBQcm9kdWN0VGFnLCBEZW5zZVNoYXBlLCBIb21vZ2VuZW91c1NoYXBlPgorIDogcHVibGljIGV2YWx1YXRvcjx0eXBlbmFtZSBob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfcmVmYWN0b3JpbmdfaGVscGVyPExocyx0eXBlbmFtZSBSaHM6Ok5lc3RlZEV4cHJlc3Npb24+OjpYcHI+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+IFhwclR5cGU7CisgIHR5cGVkZWYgaG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X3JlZmFjdG9yaW5nX2hlbHBlcjxMaHMsdHlwZW5hbWUgUmhzOjpOZXN0ZWRFeHByZXNzaW9uPiBoZWxwZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaGVscGVyOjpDb25zdGFudEJsb2NrIENvbnN0YW50QmxvY2s7CisgIHR5cGVkZWYgdHlwZW5hbWUgaGVscGVyOjpYcHIgUmVmYWN0b3JlZFhwcjsKKyAgdHlwZWRlZiBldmFsdWF0b3I8UmVmYWN0b3JlZFhwcj4gQmFzZTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IHByb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IEJhc2UoICAgeHByLmxocygpLnRlbXBsYXRlIGxlZnRDb2xzPGhlbHBlcjo6RGltPih4cHIucmhzKCkubmVzdGVkRXhwcmVzc2lvbigpLnJvd3MoKSkgLmxhenlQcm9kdWN0KCB4cHIucmhzKCkubmVzdGVkRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICsgQ29uc3RhbnRCbG9jayh4cHIubGhzKCkuY29sKHhwci5saHMoKS5jb2xzKCktMSksMSx4cHIucmhzKCkuY29scygpKSApCisgIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLGludCBPcHRpb25zLCB0eXBlbmFtZSBSaHNBcmcsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4sIEhvbW9nZW5lb3VzPFJoc0FyZyxWZXJ0aWNhbD4sIERlbnNlU2hhcGUsIEhvbW9nZW5lb3VzU2hhcGUsIFByb2R1Y3RUYWc+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBldmFsVG8oRGVzdCYgZHN0LCBjb25zdCBUcmFuc2Zvcm1UeXBlJiBsaHMsIGNvbnN0IEhvbW9nZW5lb3VzPFJoc0FyZyxWZXJ0aWNhbD4mIHJocykKKyAgeworICAgIGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPFJoc0FyZyxWZXJ0aWNhbD4sIFRyYW5zZm9ybVR5cGU+KGxocywgcmhzLm5lc3RlZEV4cHJlc3Npb24oKSkuZXZhbFRvKGRzdCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkPgorc3RydWN0IHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0PEV4cHJlc3Npb25UeXBlLCBTaWRlLCBUcmFuc3Bvc2VkLCBIb21vZ2VuZW91c1NoYXBlPgorICA6IHB1YmxpYyBwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxFeHByZXNzaW9uVHlwZSwgU2lkZSwgVHJhbnNwb3NlZCwgRGVuc2VTaGFwZT4KK3t9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IT01PR0VORU9VU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvSHlwZXJwbGFuZS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0h5cGVycGxhbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkyOWIyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0h5cGVycGxhbmUuaApAQCAtMCwwICsxLDI4MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0hZUEVSUExBTkVfSAorI2RlZmluZSBFSUdFTl9IWVBFUlBMQU5FX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIEh5cGVycGxhbmUKKyAgKgorICAqIFxicmllZiBBIGh5cGVycGxhbmUKKyAgKgorICAqIEEgaHlwZXJwbGFuZSBpcyBhbiBhZmZpbmUgc3Vic3BhY2Ugb2YgZGltZW5zaW9uIG4tMSBpbiBhIHNwYWNlIG9mIGRpbWVuc2lvbiBuLgorICAqIEZvciBleGFtcGxlLCBhIGh5cGVycGxhbmUgaW4gYSBwbGFuZSBpcyBhIGxpbmU7IGEgaHlwZXJwbGFuZSBpbiAzLXNwYWNlIGlzIGEgcGxhbmUuCisgICoKKyAgKiBcdHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzCisgICogXHRwYXJhbSBfQW1iaWVudERpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYy4KKyAgKiAgICAgICAgICAgICBOb3RpY2UgdGhhdCB0aGUgZGltZW5zaW9uIG9mIHRoZSBoeXBlcnBsYW5lIGlzIF9BbWJpZW50RGltLTEuCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaHlwZXJwbGFuZSBhcyB0aGUgemVybyBzZXQgb2YgdGhlIGltcGxpY2l0IGVxdWF0aW9uCisgICogXGYkIG4gXGNkb3QgeCArIGQgPSAwIFxmJCB3aGVyZSBcZiQgbiBcZiQgaXMgYSB1bml0IG5vcm1hbCB2ZWN0b3Igb2YgdGhlIHBsYW5lIChsaW5lYXIgcGFydCkKKyAgKiBhbmQgXGYkIGQgXGYkIGlzIHRoZSBkaXN0YW5jZSAob2Zmc2V0KSB0byB0aGUgb3JpZ2luLgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgorY2xhc3MgSHlwZXJwbGFuZQoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0FtYmllbnREaW09PUR5bmFtaWMgPyBEeW5hbWljIDogX0FtYmllbnREaW0rMSkKKyAgZW51bSB7CisgICAgQW1iaWVudERpbUF0Q29tcGlsZVRpbWUgPSBfQW1iaWVudERpbSwKKyAgICBPcHRpb25zID0gX09wdGlvbnMKKyAgfTsKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixJbmRleChBbWJpZW50RGltQXRDb21waWxlVGltZSk9PUR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgOiBJbmRleChBbWJpZW50RGltQXRDb21waWxlVGltZSkrMSwxLE9wdGlvbnM+IENvZWZmaWNpZW50czsKKyAgdHlwZWRlZiBCbG9jazxDb2VmZmljaWVudHMsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gTm9ybWFsUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiBjb25zdCBCbG9jazxjb25zdCBDb2VmZmljaWVudHMsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gQ29uc3ROb3JtYWxSZXR1cm5UeXBlOworCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEh5cGVycGxhbmUoKSB7fQorICAKKyAgdGVtcGxhdGU8aW50IE90aGVyT3B0aW9ucz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgSHlwZXJwbGFuZShjb25zdCBIeXBlcnBsYW5lPFNjYWxhcixBbWJpZW50RGltQXRDb21waWxlVGltZSxPdGhlck9wdGlvbnM+JiBvdGhlcikKKyAgIDogbV9jb2VmZnMob3RoZXIuY29lZmZzKCkpCisgIHt9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBkeW5hbWljLXNpemUgaHlwZXJwbGFuZSB3aXRoIFxhIF9kaW0gdGhlIGRpbWVuc2lvbgorICAgICogb2YgdGhlIGFtYmllbnQgc3BhY2UgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGV4cGxpY2l0IEh5cGVycGxhbmUoSW5kZXggX2RpbSkgOiBtX2NvZWZmcyhfZGltKzEpIHt9CisKKyAgLyoqIENvbnN0cnVjdCBhIHBsYW5lIGZyb20gaXRzIG5vcm1hbCBcYSBuIGFuZCBhIHBvaW50IFxhIGUgb250byB0aGUgcGxhbmUuCisgICAgKiBcd2FybmluZyB0aGUgdmVjdG9yIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEh5cGVycGxhbmUoY29uc3QgVmVjdG9yVHlwZSYgbiwgY29uc3QgVmVjdG9yVHlwZSYgZSkKKyAgICA6IG1fY29lZmZzKG4uc2l6ZSgpKzEpCisgIHsKKyAgICBub3JtYWwoKSA9IG47CisgICAgb2Zmc2V0KCkgPSAtbi5kb3QoZSk7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIHBsYW5lIGZyb20gaXRzIG5vcm1hbCBcYSBuIGFuZCBkaXN0YW5jZSB0byB0aGUgb3JpZ2luIFxhIGQKKyAgICAqIHN1Y2ggdGhhdCB0aGUgYWxnZWJyYWljIGVxdWF0aW9uIG9mIHRoZSBwbGFuZSBpcyBcZiQgbiBcY2RvdCB4ICsgZCA9IDAgXGYkLgorICAgICogXHdhcm5pbmcgdGhlIHZlY3RvciBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBIeXBlcnBsYW5lKGNvbnN0IFZlY3RvclR5cGUmIG4sIGNvbnN0IFNjYWxhciYgZCkKKyAgICA6IG1fY29lZmZzKG4uc2l6ZSgpKzEpCisgIHsKKyAgICBub3JtYWwoKSA9IG47CisgICAgb2Zmc2V0KCkgPSBkOworICB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBoeXBlcnBsYW5lIHBhc3NpbmcgdGhyb3VnaCB0aGUgdHdvIHBvaW50cy4gSWYgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYW1iaWVudCBzcGFjZQorICAgICogaXMgZ3JlYXRlciB0aGFuIDIsIHRoZW4gdGhlcmUgaXNuJ3QgdW5pcXVlbmVzcywgc28gYW4gYXJiaXRyYXJ5IGNob2ljZSBpcyBtYWRlLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgSHlwZXJwbGFuZSBUaHJvdWdoKGNvbnN0IFZlY3RvclR5cGUmIHAwLCBjb25zdCBWZWN0b3JUeXBlJiBwMSkKKyAgeworICAgIEh5cGVycGxhbmUgcmVzdWx0KHAwLnNpemUoKSk7CisgICAgcmVzdWx0Lm5vcm1hbCgpID0gKHAxIC0gcDApLnVuaXRPcnRob2dvbmFsKCk7CisgICAgcmVzdWx0Lm9mZnNldCgpID0gLXAwLmRvdChyZXN1bHQubm9ybWFsKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSB0aHJlZSBwb2ludHMuIFRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UKKyAgICAqIGlzIHJlcXVpcmVkIHRvIGJlIGV4YWN0bHkgMy4KKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIEh5cGVycGxhbmUgVGhyb3VnaChjb25zdCBWZWN0b3JUeXBlJiBwMCwgY29uc3QgVmVjdG9yVHlwZSYgcDEsIGNvbnN0IFZlY3RvclR5cGUmIHAyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShWZWN0b3JUeXBlLCAzKQorICAgIEh5cGVycGxhbmUgcmVzdWx0KHAwLnNpemUoKSk7CisgICAgVmVjdG9yVHlwZSB2MChwMiAtIHAwKSwgdjEocDEgLSBwMCk7CisgICAgcmVzdWx0Lm5vcm1hbCgpID0gdjAuY3Jvc3ModjEpOworICAgIFJlYWxTY2FsYXIgbm9ybSA9IHJlc3VsdC5ub3JtYWwoKS5ub3JtKCk7CisgICAgaWYobm9ybSA8PSB2MC5ub3JtKCkgKiB2MS5ub3JtKCkgKiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICB7CisgICAgICBNYXRyaXg8U2NhbGFyLDIsMz4gbTsgbSA8PCB2MC50cmFuc3Bvc2UoKSwgdjEudHJhbnNwb3NlKCk7CisgICAgICBKYWNvYmlTVkQ8TWF0cml4PFNjYWxhciwyLDM+ID4gc3ZkKG0sIENvbXB1dGVGdWxsVik7CisgICAgICByZXN1bHQubm9ybWFsKCkgPSBzdmQubWF0cml4VigpLmNvbCgyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmVzdWx0Lm5vcm1hbCgpIC89IG5vcm07CisgICAgcmVzdWx0Lm9mZnNldCgpID0gLXAwLmRvdChyZXN1bHQubm9ybWFsKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSBwYXJhbWV0cml6ZWQgbGluZSBcYSBwYXJhbWV0cml6ZWQuCisgICAgKiBJZiB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlIGlzIGdyZWF0ZXIgdGhhbiAyLCB0aGVuIHRoZXJlIGlzbid0IHVuaXF1ZW5lc3MsCisgICAgKiBzbyBhbiBhcmJpdHJhcnkgY2hvaWNlIGlzIG1hZGUuCisgICAgKi8KKyAgLy8gRklYTUUgdG8gYmUgY29uc2l0ZW50IHdpdGggdGhlIHJlc3QgdGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIHN0YXRpYyBUaHJvdWdoIGZ1bmN0aW9uID8/CisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IEh5cGVycGxhbmUoY29uc3QgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiYgcGFyYW1ldHJpemVkKQorICB7CisgICAgbm9ybWFsKCkgPSBwYXJhbWV0cml6ZWQuZGlyZWN0aW9uKCkudW5pdE9ydGhvZ29uYWwoKTsKKyAgICBvZmZzZXQoKSA9IC1wYXJhbWV0cml6ZWQub3JpZ2luKCkuZG90KG5vcm1hbCgpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIH5IeXBlcnBsYW5lKCkge30KKworICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgcGxhbmUgaG9sZHMgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGRpbSgpIGNvbnN0IHsgcmV0dXJuIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPT1EeW5hbWljID8gbV9jb2VmZnMuc2l6ZSgpLTEgOiBJbmRleChBbWJpZW50RGltQXRDb21waWxlVGltZSk7IH0KKworICAvKiogbm9ybWFsaXplcyBcYyAqdGhpcyAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG5vcm1hbGl6ZSh2b2lkKQorICB7CisgICAgbV9jb2VmZnMgLz0gbm9ybWFsKCkubm9ybSgpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgXGMgKnRoaXMgYW5kIGEgcG9pbnQgXGEgcC4KKyAgICAqIFxzYSBhYnNEaXN0YW5jZSgpCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBzaWduZWREaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBub3JtYWwoKS5kb3QocCkgKyBvZmZzZXQoKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgXGMgKnRoaXMgYW5kIGEgcG9pbnQgXGEgcC4KKyAgICAqIFxzYSBzaWduZWREaXN0YW5jZSgpCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBhYnNEaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBudW1leHQ6OmFicyhzaWduZWREaXN0YW5jZShwKSk7IH0KKworICAvKiogXHJldHVybnMgdGhlIHByb2plY3Rpb24gb2YgYSBwb2ludCBcYSBwIG9udG8gdGhlIHBsYW5lIFxjICp0aGlzLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBWZWN0b3JUeXBlIHByb2plY3Rpb24oY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QgeyByZXR1cm4gcCAtIHNpZ25lZERpc3RhbmNlKHApICogbm9ybWFsKCk7IH0KKworICAvKiogXHJldHVybnMgYSBjb25zdGFudCByZWZlcmVuY2UgdG8gdGhlIHVuaXQgbm9ybWFsIHZlY3RvciBvZiB0aGUgcGxhbmUsIHdoaWNoIGNvcnJlc3BvbmRzCisgICAgKiB0byB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIGltcGxpY2l0IGVxdWF0aW9uLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDb25zdE5vcm1hbFJldHVyblR5cGUgbm9ybWFsKCkgY29uc3QgeyByZXR1cm4gQ29uc3ROb3JtYWxSZXR1cm5UeXBlKG1fY29lZmZzLDAsMCxkaW0oKSwxKTsgfQorCisgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdGFudCByZWZlcmVuY2UgdG8gdGhlIHVuaXQgbm9ybWFsIHZlY3RvciBvZiB0aGUgcGxhbmUsIHdoaWNoIGNvcnJlc3BvbmRzCisgICAgKiB0byB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIGltcGxpY2l0IGVxdWF0aW9uLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBOb3JtYWxSZXR1cm5UeXBlIG5vcm1hbCgpIHsgcmV0dXJuIE5vcm1hbFJldHVyblR5cGUobV9jb2VmZnMsMCwwLGRpbSgpLDEpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaXN0YW5jZSB0byB0aGUgb3JpZ2luLCB3aGljaCBpcyBhbHNvIHRoZSAiY29uc3RhbnQgdGVybSIgb2YgdGhlIGltcGxpY2l0IGVxdWF0aW9uCisgICAgKiBcd2FybmluZyB0aGUgdmVjdG9yIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciYgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMuY29lZmYoZGltKCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgZGlzdGFuY2UgdG8gdGhlIG9yaWdpbiwgd2hpY2ggaXMgYWxzbyB0aGUgY29uc3RhbnQgcGFydAorICAgICogb2YgdGhlIGltcGxpY2l0IGVxdWF0aW9uICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIG9mZnNldCgpIHsgcmV0dXJuIG1fY29lZmZzKGRpbSgpKTsgfQorCisgIC8qKiBccmV0dXJucyBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgY29lZmZpY2llbnRzIGNfaSBvZiB0aGUgcGxhbmUgZXF1YXRpb246CisgICAgKiBcZiQgY18wKnhfMCArIC4uLiArIGNfe2QtMX0qeF97ZC0xfSArIGNfZCA9IDAgXGYkCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICAvKiogXHJldHVybnMgYSBub24tY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSBjb2VmZmljaWVudHMgY19pIG9mIHRoZSBwbGFuZSBlcXVhdGlvbjoKKyAgICAqIFxmJCBjXzAqeF8wICsgLi4uICsgY197ZC0xfSp4X3tkLTF9ICsgY19kID0gMCBcZiQKKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQ29lZmZpY2llbnRzJiBjb2VmZnMoKSB7IHJldHVybiBtX2NvZWZmczsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIG9mICp0aGlzIHdpdGggXGEgb3RoZXIuCisgICAgKgorICAgICogXHdhcm5pbmcgVGhlIGFtYmllbnQgc3BhY2UgbXVzdCBiZSBhIHBsYW5lLCBpLmUuIGhhdmUgZGltZW5zaW9uIDIsIHNvIHRoYXQgXGMgKnRoaXMgYW5kIFxhIG90aGVyIGFyZSBsaW5lcy4KKyAgICAqCisgICAgKiBcbm90ZSBJZiBcYSBvdGhlciBpcyBhcHByb3hpbWF0ZWx5IHBhcmFsbGVsIHRvICp0aGlzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbnkgcG9pbnQgb24gKnRoaXMuCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVmVjdG9yVHlwZSBpbnRlcnNlY3Rpb24oY29uc3QgSHlwZXJwbGFuZSYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKFZlY3RvclR5cGUsIDIpCisgICAgU2NhbGFyIGRldCA9IGNvZWZmcygpLmNvZWZmKDApICogb3RoZXIuY29lZmZzKCkuY29lZmYoMSkgLSBjb2VmZnMoKS5jb2VmZigxKSAqIG90aGVyLmNvZWZmcygpLmNvZWZmKDApOworICAgIC8vIHNpbmNlIHRoZSBsaW5lIGVxdWF0aW9ucyBheCtieT1jIGFyZSBub3JtYWxpemVkIHdpdGggYV4yK2JeMj0xLCB0aGUgZm9sbG93aW5nIHRlc3RzCisgICAgLy8gd2hldGhlciB0aGUgdHdvIGxpbmVzIGFyZSBhcHByb3hpbWF0ZWx5IHBhcmFsbGVsLgorICAgIGlmKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihkZXQsIFNjYWxhcigxKSkpCisgICAgeyAgIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgdHdvIGxpbmVzIGFyZSBhcHByb3hpbWF0ZWx5IHBhcmFsbGVsLiBQaWNrIGFueSBwb2ludCBvbiB0aGUgZmlyc3QgbGluZS4KKyAgICAgICAgaWYobnVtZXh0OjphYnMoY29lZmZzKCkuY29lZmYoMSkpPm51bWV4dDo6YWJzKGNvZWZmcygpLmNvZWZmKDApKSkKKyAgICAgICAgICAgIHJldHVybiBWZWN0b3JUeXBlKGNvZWZmcygpLmNvZWZmKDEpLCAtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMSktY29lZmZzKCkuY29lZmYoMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVmVjdG9yVHlwZSgtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMCktY29lZmZzKCkuY29lZmYoMSksIGNvZWZmcygpLmNvZWZmKDApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBnZW5lcmFsIGNhc2UKKyAgICAgICAgU2NhbGFyIGludmRldCA9IFNjYWxhcigxKSAvIGRldDsKKyAgICAgICAgcmV0dXJuIFZlY3RvclR5cGUoaW52ZGV0Kihjb2VmZnMoKS5jb2VmZigxKSpvdGhlci5jb2VmZnMoKS5jb2VmZigyKS1vdGhlci5jb2VmZnMoKS5jb2VmZigxKSpjb2VmZnMoKS5jb2VmZigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludmRldCoob3RoZXIuY29lZmZzKCkuY29lZmYoMCkqY29lZmZzKCkuY29lZmYoMiktY29lZmZzKCkuY29lZmYoMCkqb3RoZXIuY29lZmZzKCkuY29lZmYoMikpKTsKKyAgICB9CisgIH0KKworICAvKiogQXBwbGllcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IFxhIG1hdCB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqCisgICAgKiBccGFyYW0gbWF0IHRoZSBEaW0geCBEaW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgKiBccGFyYW0gdHJhaXRzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggXGEgbWF0IHJlcHJlc2VudHMgYW4gI0lzb21ldHJ5CisgICAgKiAgICAgICAgICAgICAgIG9yIGEgbW9yZSBnZW5lcmljICNBZmZpbmUgdHJhbnNmb3JtYXRpb24uIFRoZSBkZWZhdWx0IGlzICNBZmZpbmUuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEh5cGVycGxhbmUmIHRyYW5zZm9ybShjb25zdCBNYXRyaXhCYXNlPFhwclR5cGU+JiBtYXQsIFRyYW5zZm9ybVRyYWl0cyB0cmFpdHMgPSBBZmZpbmUpCisgIHsKKyAgICBpZiAodHJhaXRzPT1BZmZpbmUpCisgICAgeworICAgICAgbm9ybWFsKCkgPSBtYXQuaW52ZXJzZSgpLnRyYW5zcG9zZSgpICogbm9ybWFsKCk7CisgICAgICBtX2NvZWZmcyAvPSBub3JtYWwoKS5ub3JtKCk7CisgICAgfQorICAgIGVsc2UgaWYgKHRyYWl0cz09SXNvbWV0cnkpCisgICAgICBub3JtYWwoKSA9IG1hdCAqIG5vcm1hbCgpOworICAgIGVsc2UKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoMCAmJiAiaW52YWxpZCB0cmFpdHMgdmFsdWUgaW4gSHlwZXJwbGFuZTo6dHJhbnNmb3JtKCkiKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIEFwcGxpZXMgdGhlIHRyYW5zZm9ybWF0aW9uIFxhIHQgdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKgorICAgICogXHBhcmFtIHQgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGRpbWVuc2lvbiBEaW0KKyAgICAqIFxwYXJhbSB0cmFpdHMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRyYW5zZm9ybWF0aW9uIFxhIHQgcmVwcmVzZW50cyBhbiAjSXNvbWV0cnkKKyAgICAqICAgICAgICAgICAgICAgb3IgYSBtb3JlIGdlbmVyaWMgI0FmZmluZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIGRlZmF1bHQgaXMgI0FmZmluZS4KKyAgICAqICAgICAgICAgICAgICAgT3RoZXIga2luZCBvZiB0cmFuc2Zvcm1hdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgKi8KKyAgdGVtcGxhdGU8aW50IFRyT3B0aW9ucz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEh5cGVycGxhbmUmIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm08U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLEFmZmluZSxUck9wdGlvbnM+JiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1UcmFpdHMgdHJhaXRzID0gQWZmaW5lKQorICB7CisgICAgdHJhbnNmb3JtKHQubGluZWFyKCksIHRyYWl0cyk7CisgICAgb2Zmc2V0KCkgLT0gbm9ybWFsKCkuZG90KHQudHJhbnNsYXRpb24oKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8SHlwZXJwbGFuZSwKKyAgICAgICAgICAgSHlwZXJwbGFuZTxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE9wdGlvbnM+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8SHlwZXJwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgSHlwZXJwbGFuZTxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE9wdGlvbnM+ID46OnR5cGUoKnRoaXMpOworICB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZSxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgSHlwZXJwbGFuZShjb25zdCBIeXBlcnBsYW5lPE90aGVyU2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPdGhlck9wdGlvbnM+JiBvdGhlcikKKyAgeyBtX2NvZWZmcyA9IG90aGVyLmNvZWZmcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICB0ZW1wbGF0ZTxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGlzQXBwcm94KGNvbnN0IEh5cGVycGxhbmU8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE90aGVyT3B0aW9ucz4mIG90aGVyLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMuaXNBcHByb3gob3RoZXIubV9jb2VmZnMsIHByZWMpOyB9CisKK3Byb3RlY3RlZDoKKworICBDb2VmZmljaWVudHMgbV9jb2VmZnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0hZUEVSUExBTkVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L09ydGhvTWV0aG9kcy5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L09ydGhvTWV0aG9kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzVlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvT3J0aG9NZXRob2RzLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fT1JUSE9NRVRIT0RTX0gKKyNkZWZpbmUgRUlHRU5fT1JUSE9NRVRIT0RTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXHJldHVybnMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBIZXJlIGlzIGEgdmVyeSBnb29kIGV4cGxhbmF0aW9uIG9mIGNyb3NzLXByb2R1Y3Q6IGh0dHA6Ly94a2NkLmNvbS8xOTkvCisgICogCisgICogV2l0aCBjb21wbGV4IG51bWJlcnMsIHRoZSBjcm9zcyBwcm9kdWN0IGlzIGltcGxlbWVudGVkIGFzCisgICogXGYkIChcbWF0aGJme2F9K2lcbWF0aGJme2J9KSBcdGltZXMgKFxtYXRoYmZ7Y30raVxtYXRoYmZ7ZH0pID0gKFxtYXRoYmZ7YX0gXHRpbWVzIFxtYXRoYmZ7Y30gLSBcbWF0aGJme2J9IFx0aW1lcyBcbWF0aGJme2R9KSAtIGkoXG1hdGhiZnthfSBcdGltZXMgXG1hdGhiZntkfSAtIFxtYXRoYmZ7Yn0gXHRpbWVzIFxtYXRoYmZ7Y30pXGYkCisgICogCisgICogXHNhIE1hdHJpeEJhc2U6OmNyb3NzMygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIGNyb3NzX3Byb2R1Y3RfcmV0dXJuX3R5cGU8T3RoZXJEZXJpdmVkPjo6dHlwZQorI2Vsc2UKK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdAorI2VuZGlmCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjcm9zcyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKERlcml2ZWQsMykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsMykKKworICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXhwcmVzc2lvbiBoZXJlIHNpbmNlIHRoZSBjb21waWxlcgorICAvLyBvcHRpbWl6ZSBzdWNoIGEgc21hbGwgdGVtcG9yYXJ5IHZlcnkgd2VsbCAoZXZlbiB3aXRoaW4gYSBjb21wbGV4IGV4cHJlc3Npb24pCisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLDI+Ojp0eXBlIGxocyhkZXJpdmVkKCkpOworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8T3RoZXJEZXJpdmVkLDI+Ojp0eXBlIHJocyhvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gdHlwZW5hbWUgY3Jvc3NfcHJvZHVjdF9yZXR1cm5fdHlwZTxPdGhlckRlcml2ZWQ+Ojp0eXBlKAorICAgIG51bWV4dDo6Y29uaihsaHMuY29lZmYoMSkgKiByaHMuY29lZmYoMikgLSBsaHMuY29lZmYoMikgKiByaHMuY29lZmYoMSkpLAorICAgIG51bWV4dDo6Y29uaihsaHMuY29lZmYoMikgKiByaHMuY29lZmYoMCkgLSBsaHMuY29lZmYoMCkgKiByaHMuY29lZmYoMikpLAorICAgIG51bWV4dDo6Y29uaihsaHMuY29lZmYoMCkgKiByaHMuY29lZmYoMSkgLSBsaHMuY29lZmYoMSkgKiByaHMuY29lZmYoMCkpCisgICk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPCBpbnQgQXJjaCx0eXBlbmFtZSBWZWN0b3JMaHMsdHlwZW5hbWUgVmVjdG9yUmhzLAorICAgICAgICAgIHR5cGVuYW1lIFNjYWxhciA9IHR5cGVuYW1lIFZlY3Rvckxoczo6U2NhbGFyLAorICAgICAgICAgIGJvb2wgVmVjdG9yaXphYmxlID0gYm9vbCgoVmVjdG9yTGhzOjpGbGFncyZWZWN0b3JSaHM6OkZsYWdzKSZQYWNrZXRBY2Nlc3NCaXQpPgorc3RydWN0IGNyb3NzM19pbXBsIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGU8VmVjdG9yTGhzPjo6dHlwZQorICBydW4oY29uc3QgVmVjdG9yTGhzJiBsaHMsIGNvbnN0IFZlY3RvclJocyYgcmhzKQorICB7CisgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZTxWZWN0b3JMaHM+Ojp0eXBlKAorICAgICAgbnVtZXh0Ojpjb25qKGxocy5jb2VmZigxKSAqIHJocy5jb2VmZigyKSAtIGxocy5jb2VmZigyKSAqIHJocy5jb2VmZigxKSksCisgICAgICBudW1leHQ6OmNvbmoobGhzLmNvZWZmKDIpICogcmhzLmNvZWZmKDApIC0gbGhzLmNvZWZmKDApICogcmhzLmNvZWZmKDIpKSwKKyAgICAgIG51bWV4dDo6Y29uaihsaHMuY29lZmYoMCkgKiByaHMuY29lZmYoMSkgLSBsaHMuY29lZmYoMSkgKiByaHMuY29lZmYoMCkpLAorICAgICAgMAorICAgICk7CisgIH0KK307CisKK30KKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBccmV0dXJucyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgdXNpbmcgb25seSB0aGUgeCwgeSwgYW5kIHogY29lZmZpY2llbnRzCisgICoKKyAgKiBUaGUgc2l6ZSBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgbXVzdCBiZSBmb3VyLiBUaGlzIGZ1bmN0aW9uIGlzIGVzcGVjaWFsbHkgdXNlZnVsCisgICogd2hlbiB1c2luZyA0RCB2ZWN0b3JzIGluc3RlYWQgb2YgM0Qgb25lcyB0byBnZXQgYWR2YW50YWdlIG9mIFNTRS9BbHRpVmVjIHZlY3Rvcml6YXRpb24uCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6Y3Jvc3MoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdAorTWF0cml4QmFzZTxEZXJpdmVkPjo6Y3Jvc3MzKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoRGVyaXZlZCw0KQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCw0KQorCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsMj46OnR5cGUgRGVyaXZlZE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8T3RoZXJEZXJpdmVkLDI+Ojp0eXBlIE90aGVyRGVyaXZlZE5lc3RlZDsKKyAgRGVyaXZlZE5lc3RlZCBsaHMoZGVyaXZlZCgpKTsKKyAgT3RoZXJEZXJpdmVkTmVzdGVkIHJocyhvdGhlci5kZXJpdmVkKCkpOworCisgIHJldHVybiBpbnRlcm5hbDo6Y3Jvc3MzX2ltcGw8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJpdmVkTmVzdGVkPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyaXZlZE5lc3RlZD46OnR5cGU+OjpydW4obGhzLHJocyk7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXHJldHVybnMgYSBtYXRyaXggZXhwcmVzc2lvbiBvZiB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBlYWNoIGNvbHVtbiBvciByb3cKKyAgKiBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uIHdpdGggdGhlIFxhIG90aGVyIHZlY3Rvci4KKyAgKgorICAqIFRoZSByZWZlcmVuY2VkIG1hdHJpeCBtdXN0IGhhdmUgb25lIGRpbWVuc2lvbiBlcXVhbCB0byAzLgorICAqIFRoZSByZXN1bHQgbWF0cml4IGhhcyB0aGUgc2FtZSBkaW1lbnNpb25zIHRoYW4gdGhlIHJlZmVyZW5jZWQgb25lLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmNyb3NzKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgCitjb25zdCB0eXBlbmFtZSBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6Q3Jvc3NSZXR1cm5UeXBlCitWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6Y3Jvc3MoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsMykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgCisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxFeHByZXNzaW9uVHlwZSwyPjo6dHlwZSBtYXQoX2V4cHJlc3Npb24oKSk7CisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxPdGhlckRlcml2ZWQsMj46OnR5cGUgdmVjKG90aGVyLmRlcml2ZWQoKSk7CisKKyAgQ3Jvc3NSZXR1cm5UeXBlIHJlcyhfZXhwcmVzc2lvbigpLnJvd3MoKSxfZXhwcmVzc2lvbigpLmNvbHMoKSk7CisgIGlmKERpcmVjdGlvbj09VmVydGljYWwpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoQ3Jvc3NSZXR1cm5UeXBlOjpSb3dzQXRDb21waWxlVGltZT09MyAmJiAidGhlIG1hdHJpeCBtdXN0IGhhdmUgZXhhY3RseSAzIHJvd3MiKTsKKyAgICByZXMucm93KDApID0gKG1hdC5yb3coMSkgKiB2ZWMuY29lZmYoMikgLSBtYXQucm93KDIpICogdmVjLmNvZWZmKDEpKS5jb25qdWdhdGUoKTsKKyAgICByZXMucm93KDEpID0gKG1hdC5yb3coMikgKiB2ZWMuY29lZmYoMCkgLSBtYXQucm93KDApICogdmVjLmNvZWZmKDIpKS5jb25qdWdhdGUoKTsKKyAgICByZXMucm93KDIpID0gKG1hdC5yb3coMCkgKiB2ZWMuY29lZmYoMSkgLSBtYXQucm93KDEpICogdmVjLmNvZWZmKDApKS5jb25qdWdhdGUoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoQ3Jvc3NSZXR1cm5UeXBlOjpDb2xzQXRDb21waWxlVGltZT09MyAmJiAidGhlIG1hdHJpeCBtdXN0IGhhdmUgZXhhY3RseSAzIGNvbHVtbnMiKTsKKyAgICByZXMuY29sKDApID0gKG1hdC5jb2woMSkgKiB2ZWMuY29lZmYoMikgLSBtYXQuY29sKDIpICogdmVjLmNvZWZmKDEpKS5jb25qdWdhdGUoKTsKKyAgICByZXMuY29sKDEpID0gKG1hdC5jb2woMikgKiB2ZWMuY29lZmYoMCkgLSBtYXQuY29sKDApICogdmVjLmNvZWZmKDIpKS5jb25qdWdhdGUoKTsKKyAgICByZXMuY29sKDIpID0gKG1hdC5jb2woMCkgKiB2ZWMuY29lZmYoMSkgLSBtYXQuY29sKDEpICogdmVjLmNvZWZmKDApKS5jb25qdWdhdGUoKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBpbnQgU2l6ZSA9IERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lPgorc3RydWN0IHVuaXRPcnRob2dvbmFsX3NlbGVjdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGU8RGVyaXZlZD46OnR5cGUgVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBWZWN0b3JUeXBlIHJ1bihjb25zdCBEZXJpdmVkJiBzcmMpCisgIHsKKyAgICBWZWN0b3JUeXBlIHBlcnAgPSBWZWN0b3JUeXBlOjpaZXJvKHNyYy5zaXplKCkpOworICAgIEluZGV4IG1heGkgPSAwOworICAgIEluZGV4IHNuZGkgPSAwOworICAgIHNyYy5jd2lzZUFicygpLm1heENvZWZmKCZtYXhpKTsKKyAgICBpZiAobWF4aT09MCkKKyAgICAgIHNuZGkgPSAxOworICAgIFJlYWxTY2FsYXIgaW52bm0gPSBSZWFsU2NhbGFyKDEpLyhWZWN0b3IyKCkgPDwgc3JjLmNvZWZmKHNuZGkpLHNyYy5jb2VmZihtYXhpKSkuZmluaXNoZWQoKS5ub3JtKCk7CisgICAgcGVycC5jb2VmZlJlZihtYXhpKSA9IC1udW1leHQ6OmNvbmooc3JjLmNvZWZmKHNuZGkpKSAqIGludm5tOworICAgIHBlcnAuY29lZmZSZWYoc25kaSkgPSAgbnVtZXh0Ojpjb25qKHNyYy5jb2VmZihtYXhpKSkgKiBpbnZubTsKKworICAgIHJldHVybiBwZXJwOworICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCB1bml0T3J0aG9nb25hbF9zZWxlY3RvcjxEZXJpdmVkLDM+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGU8RGVyaXZlZD46OnR5cGUgVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSBWZWN0b3JUeXBlIHJ1bihjb25zdCBEZXJpdmVkJiBzcmMpCisgIHsKKyAgICBWZWN0b3JUeXBlIHBlcnA7CisgICAgLyogTGV0IHVzIGNvbXB1dGUgdGhlIGNyb3NzZWQgcHJvZHVjdCBvZiAqdGhpcyB3aXRoIGEgdmVjdG9yCisgICAgICogdGhhdCBpcyBub3QgdG9vIGNsb3NlIHRvIGJlaW5nIGNvbGluZWFyIHRvICp0aGlzLgorICAgICAqLworCisgICAgLyogdW5sZXNzIHRoZSB4IGFuZCB5IGNvb3JkcyBhcmUgYm90aCBjbG9zZSB0byB6ZXJvLCB3ZSBjYW4KKyAgICAgKiBzaW1wbHkgdGFrZSAoIC15LCB4LCAwICkgYW5kIG5vcm1hbGl6ZSBpdC4KKyAgICAgKi8KKyAgICBpZigoIWlzTXVjaFNtYWxsZXJUaGFuKHNyYy54KCksIHNyYy56KCkpKQorICAgIHx8ICghaXNNdWNoU21hbGxlclRoYW4oc3JjLnkoKSwgc3JjLnooKSkpKQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgaW52bm0gPSBSZWFsU2NhbGFyKDEpL3NyYy50ZW1wbGF0ZSBoZWFkPDI+KCkubm9ybSgpOworICAgICAgcGVycC5jb2VmZlJlZigwKSA9IC1udW1leHQ6OmNvbmooc3JjLnkoKSkqaW52bm07CisgICAgICBwZXJwLmNvZWZmUmVmKDEpID0gbnVtZXh0Ojpjb25qKHNyYy54KCkpKmludm5tOworICAgICAgcGVycC5jb2VmZlJlZigyKSA9IDA7CisgICAgfQorICAgIC8qIGlmIGJvdGggeCBhbmQgeSBhcmUgY2xvc2UgdG8gemVybywgdGhlbiB0aGUgdmVjdG9yIGlzIGNsb3NlCisgICAgICogdG8gdGhlIHotYXhpcywgc28gaXQncyBmYXIgZnJvbSBjb2xpbmVhciB0byB0aGUgeC1heGlzIGZvciBpbnN0YW5jZS4KKyAgICAgKiBTbyB3ZSB0YWtlIHRoZSBjcm9zc2VkIHByb2R1Y3Qgd2l0aCAoMSwwLDApIGFuZCBub3JtYWxpemUgaXQuCisgICAgICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgaW52bm0gPSBSZWFsU2NhbGFyKDEpL3NyYy50ZW1wbGF0ZSB0YWlsPDI+KCkubm9ybSgpOworICAgICAgcGVycC5jb2VmZlJlZigwKSA9IDA7CisgICAgICBwZXJwLmNvZWZmUmVmKDEpID0gLW51bWV4dDo6Y29uaihzcmMueigpKSppbnZubTsKKyAgICAgIHBlcnAuY29lZmZSZWYoMikgPSBudW1leHQ6OmNvbmooc3JjLnkoKSkqaW52bm07CisgICAgfQorCisgICAgcmV0dXJuIHBlcnA7CisgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHVuaXRPcnRob2dvbmFsX3NlbGVjdG9yPERlcml2ZWQsMj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxEZXJpdmVkPjo6dHlwZSBWZWN0b3JUeXBlOworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIFZlY3RvclR5cGUgcnVuKGNvbnN0IERlcml2ZWQmIHNyYykKKyAgeyByZXR1cm4gVmVjdG9yVHlwZSgtbnVtZXh0Ojpjb25qKHNyYy55KCkpLCBudW1leHQ6OmNvbmooc3JjLngoKSkpLm5vcm1hbGl6ZWQoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXHJldHVybnMgYSB1bml0IHZlY3RvciB3aGljaCBpcyBvcnRob2dvbmFsIHRvIFxjICp0aGlzCisgICoKKyAgKiBUaGUgc2l6ZSBvZiBcYyAqdGhpcyBtdXN0IGJlIGF0IGxlYXN0IDIuIElmIHRoZSBzaXplIGlzIGV4YWN0bHkgMiwKKyAgKiB0aGVuIHRoZSByZXR1cm5lZCB2ZWN0b3IgaXMgYSBjb3VudGVyIGNsb2NrIHdpc2Ugcm90YXRpb24gb2YgXGMgKnRoaXMsIGkuZS4sICgteSx4KS5ub3JtYWxpemVkKCkuCisgICoKKyAgKiBcc2EgY3Jvc3MoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojp1bml0T3J0aG9nb25hbCgpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIGludGVybmFsOjp1bml0T3J0aG9nb25hbF9zZWxlY3RvcjxEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fT1JUSE9NRVRIT0RTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9QYXJhbWV0cml6ZWRMaW5lLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvUGFyYW1ldHJpemVkTGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTg1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvUGFyYW1ldHJpemVkTGluZS5oCkBAIC0wLDAgKzEsMTk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFSQU1FVFJJWkVETElORV9ICisjZGVmaW5lIEVJR0VOX1BBUkFNRVRSSVpFRExJTkVfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUGFyYW1ldHJpemVkTGluZQorICAqCisgICogXGJyaWVmIEEgcGFyYW1ldHJpemVkIGxpbmUKKyAgKgorICAqIEEgcGFyYW1ldHJpemVkIGxpbmUgaXMgZGVmaW5lZCBieSBhbiBvcmlnaW4gcG9pbnQgXGYkIFxtYXRoYmZ7b30gXGYkIGFuZCBhIHVuaXQKKyAgKiBkaXJlY3Rpb24gdmVjdG9yIFxmJCBcbWF0aGJme2R9IFxmJCBzdWNoIHRoYXQgdGhlIGxpbmUgY29ycmVzcG9uZHMgdG8KKyAgKiB0aGUgc2V0IFxmJCBsKHQpID0gXG1hdGhiZntvfSArIHQgXG1hdGhiZntkfSBcZiQsIFxmJCB0IFxpbiBcbWF0aGJme1J9IFxmJC4KKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIF9BbWJpZW50RGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UsIGNhbiBiZSBhIGNvbXBpbGUgdGltZSB2YWx1ZSBvciBEeW5hbWljLgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgorY2xhc3MgUGFyYW1ldHJpemVkTGluZQoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0FtYmllbnREaW0pCisgIGVudW0geworICAgIEFtYmllbnREaW1BdENvbXBpbGVUaW1lID0gX0FtYmllbnREaW0sCisgICAgT3B0aW9ucyA9IF9PcHRpb25zCisgIH07CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7IC8vLzwgXGRlcHJlY2F0ZWQgc2luY2UgRWlnZW4gMy4zCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixBbWJpZW50RGltQXRDb21waWxlVGltZSwxLE9wdGlvbnM+IFZlY3RvclR5cGU7CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFyYW1ldHJpemVkTGluZSgpIHt9CisgIAorICB0ZW1wbGF0ZTxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBQYXJhbWV0cml6ZWRMaW5lKGNvbnN0IFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE90aGVyT3B0aW9ucz4mIG90aGVyKQorICAgOiBtX29yaWdpbihvdGhlci5vcmlnaW4oKSksIG1fZGlyZWN0aW9uKG90aGVyLmRpcmVjdGlvbigpKQorICB7fQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgZHluYW1pYy1zaXplIGxpbmUgd2l0aCBcYSBfZGltIHRoZSBkaW1lbnNpb24KKyAgICAqIG9mIHRoZSBhbWJpZW50IHNwYWNlICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBleHBsaWNpdCBQYXJhbWV0cml6ZWRMaW5lKEluZGV4IF9kaW0pIDogbV9vcmlnaW4oX2RpbSksIG1fZGlyZWN0aW9uKF9kaW0pIHt9CisKKyAgLyoqIEluaXRpYWxpemVzIGEgcGFyYW1ldHJpemVkIGxpbmUgb2YgZGlyZWN0aW9uIFxhIGRpcmVjdGlvbiBhbmQgb3JpZ2luIFxhIG9yaWdpbi4KKyAgICAqIFx3YXJuaW5nIHRoZSB2ZWN0b3IgZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBQYXJhbWV0cml6ZWRMaW5lKGNvbnN0IFZlY3RvclR5cGUmIG9yaWdpbiwgY29uc3QgVmVjdG9yVHlwZSYgZGlyZWN0aW9uKQorICAgIDogbV9vcmlnaW4ob3JpZ2luKSwgbV9kaXJlY3Rpb24oZGlyZWN0aW9uKSB7fQorCisgIHRlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBQYXJhbWV0cml6ZWRMaW5lKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpOworCisgIC8qKiBDb25zdHJ1Y3RzIGEgcGFyYW1ldHJpemVkIGxpbmUgZ29pbmcgZnJvbSBcYSBwMCB0byBcYSBwMS4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBQYXJhbWV0cml6ZWRMaW5lIFRocm91Z2goY29uc3QgVmVjdG9yVHlwZSYgcDAsIGNvbnN0IFZlY3RvclR5cGUmIHAxKQorICB7IHJldHVybiBQYXJhbWV0cml6ZWRMaW5lKHAwLCAocDEtcDApLm5vcm1hbGl6ZWQoKSk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyB+UGFyYW1ldHJpemVkTGluZSgpIHt9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaW1lbnNpb24gaW4gd2hpY2ggdGhlIGxpbmUgaG9sZHMgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGRpbSgpIGNvbnN0IHsgcmV0dXJuIG1fZGlyZWN0aW9uLnNpemUoKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFZlY3RvclR5cGUmIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIFZlY3RvclR5cGUmIG9yaWdpbigpIHsgcmV0dXJuIG1fb3JpZ2luOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgVmVjdG9yVHlwZSYgZGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9kaXJlY3Rpb247IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVmVjdG9yVHlwZSYgZGlyZWN0aW9uKCkgeyByZXR1cm4gbV9kaXJlY3Rpb247IH0KKworICAvKiogXHJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2Ugb2YgYSBwb2ludCBcYSBwIHRvIGl0cyBwcm9qZWN0aW9uIG9udG8gdGhlIGxpbmUgXGMgKnRoaXMuCisgICAgKiBcc2EgZGlzdGFuY2UoKQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIFJlYWxTY2FsYXIgc3F1YXJlZERpc3RhbmNlKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0CisgIHsKKyAgICBWZWN0b3JUeXBlIGRpZmYgPSBwIC0gb3JpZ2luKCk7CisgICAgcmV0dXJuIChkaWZmIC0gZGlyZWN0aW9uKCkuZG90KGRpZmYpICogZGlyZWN0aW9uKCkpLnNxdWFyZWROb3JtKCk7CisgIH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBkaXN0YW5jZSBvZiBhIHBvaW50IFxhIHAgdG8gaXRzIHByb2plY3Rpb24gb250byB0aGUgbGluZSBcYyAqdGhpcy4KKyAgICAqIFxzYSBzcXVhcmVkRGlzdGFuY2UoKQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIFJlYWxTY2FsYXIgZGlzdGFuY2UoY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QgeyBFSUdFTl9VU0lOR19TVERfTUFUSChzcXJ0KSByZXR1cm4gc3FydChzcXVhcmVkRGlzdGFuY2UocCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBwcm9qZWN0aW9uIG9mIGEgcG9pbnQgXGEgcCBvbnRvIHRoZSBsaW5lIFxjICp0aGlzLiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBWZWN0b3JUeXBlIHByb2plY3Rpb24oY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QKKyAgeyByZXR1cm4gb3JpZ2luKCkgKyBkaXJlY3Rpb24oKS5kb3QocC1vcmlnaW4oKSkgKiBkaXJlY3Rpb24oKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFZlY3RvclR5cGUgcG9pbnRBdChjb25zdCBTY2FsYXImIHQpIGNvbnN0OworICAKKyAgdGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciBpbnRlcnNlY3Rpb25QYXJhbWV0ZXIoY29uc3QgSHlwZXJwbGFuZTxfU2NhbGFyLCBfQW1iaWVudERpbSwgT3RoZXJPcHRpb25zPiYgaHlwZXJwbGFuZSkgY29uc3Q7CisgCisgIHRlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIgaW50ZXJzZWN0aW9uKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpIGNvbnN0OworICAKKyAgdGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CisgIEVJR0VOX0RFVklDRV9GVU5DIFZlY3RvclR5cGUgaW50ZXJzZWN0aW9uUG9pbnQoY29uc3QgSHlwZXJwbGFuZTxfU2NhbGFyLCBfQW1iaWVudERpbSwgT3RoZXJPcHRpb25zPiYgaHlwZXJwbGFuZSkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8UGFyYW1ldHJpemVkTGluZSwKKyAgICAgICAgICAgUGFyYW1ldHJpemVkTGluZTxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE9wdGlvbnM+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8UGFyYW1ldHJpemVkTGluZSwKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldHJpemVkTGluZTxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE9wdGlvbnM+ID46OnR5cGUoKnRoaXMpOworICB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZSxpbnQgT3RoZXJPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgUGFyYW1ldHJpemVkTGluZShjb25zdCBQYXJhbWV0cml6ZWRMaW5lPE90aGVyU2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPdGhlck9wdGlvbnM+JiBvdGhlcikKKyAgeworICAgIG1fb3JpZ2luID0gb3RoZXIub3JpZ2luKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgICAgbV9kaXJlY3Rpb24gPSBvdGhlci5kaXJlY3Rpb24oKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc0FwcHJveChjb25zdCBQYXJhbWV0cml6ZWRMaW5lJiBvdGhlciwgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fb3JpZ2luLmlzQXBwcm94KG90aGVyLm1fb3JpZ2luLCBwcmVjKSAmJiBtX2RpcmVjdGlvbi5pc0FwcHJveChvdGhlci5tX2RpcmVjdGlvbiwgcHJlYyk7IH0KKworcHJvdGVjdGVkOgorCisgIFZlY3RvclR5cGUgbV9vcmlnaW4sIG1fZGlyZWN0aW9uOworfTsKKworLyoqIENvbnN0cnVjdHMgYSBwYXJhbWV0cml6ZWQgbGluZSBmcm9tIGEgMkQgaHlwZXJwbGFuZQorICAqCisgICogXHdhcm5pbmcgdGhlIGFtYmllbnQgc3BhY2UgbXVzdCBoYXZlIGRpbWVuc2lvbiAyIHN1Y2ggdGhhdCB0aGUgaHlwZXJwbGFuZSBhY3R1YWxseSBkZXNjcmliZXMgYSBsaW5lCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltLCBpbnQgX09wdGlvbnM+Cit0ZW1wbGF0ZSA8aW50IE90aGVyT3B0aW9ucz4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6UGFyYW1ldHJpemVkTGluZShjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoVmVjdG9yVHlwZSwgMikKKyAgZGlyZWN0aW9uKCkgPSBoeXBlcnBsYW5lLm5vcm1hbCgpLnVuaXRPcnRob2dvbmFsKCk7CisgIG9yaWdpbigpID0gLWh5cGVycGxhbmUubm9ybWFsKCkqaHlwZXJwbGFuZS5vZmZzZXQoKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBwb2ludCBhdCBcYSB0IGFsb25nIHRoaXMgbGluZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIFBhcmFtZXRyaXplZExpbmU8X1NjYWxhciwgX0FtYmllbnREaW0sX09wdGlvbnM+OjpWZWN0b3JUeXBlCitQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6cG9pbnRBdChjb25zdCBfU2NhbGFyJiB0KSBjb25zdAoreworICByZXR1cm4gb3JpZ2luKCkgKyAoZGlyZWN0aW9uKCkqdCk7IAorfQorCisvKiogXHJldHVybnMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gXGMgKnRoaXMgYW5kIHRoZSBnaXZlbiBcYSBoeXBlcnBsYW5lCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltLCBpbnQgX09wdGlvbnM+Cit0ZW1wbGF0ZSA8aW50IE90aGVyT3B0aW9ucz4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBfU2NhbGFyIFBhcmFtZXRyaXplZExpbmU8X1NjYWxhciwgX0FtYmllbnREaW0sX09wdGlvbnM+OjppbnRlcnNlY3Rpb25QYXJhbWV0ZXIoY29uc3QgSHlwZXJwbGFuZTxfU2NhbGFyLCBfQW1iaWVudERpbSwgT3RoZXJPcHRpb25zPiYgaHlwZXJwbGFuZSkgY29uc3QKK3sKKyAgcmV0dXJuIC0oaHlwZXJwbGFuZS5vZmZzZXQoKStoeXBlcnBsYW5lLm5vcm1hbCgpLmRvdChvcmlnaW4oKSkpCisgICAgICAgICAgLyBoeXBlcnBsYW5lLm5vcm1hbCgpLmRvdChkaXJlY3Rpb24oKSk7Cit9CisKKworLyoqIFxkZXByZWNhdGVkIHVzZSBpbnRlcnNlY3Rpb25QYXJhbWV0ZXIoKQorICAqIFxyZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFxjICp0aGlzIGFuZCB0aGUgZ2l2ZW4gXGEgaHlwZXJwbGFuZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgordGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgX1NjYWxhciBQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6aW50ZXJzZWN0aW9uKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcnNlY3Rpb25QYXJhbWV0ZXIoaHlwZXJwbGFuZSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgcG9pbnQgb2YgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFxjICp0aGlzIGFuZCB0aGUgZ2l2ZW4gaHlwZXJwbGFuZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgordGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgUGFyYW1ldHJpemVkTGluZTxfU2NhbGFyLCBfQW1iaWVudERpbSxfT3B0aW9ucz46OlZlY3RvclR5cGUKK1BhcmFtZXRyaXplZExpbmU8X1NjYWxhciwgX0FtYmllbnREaW0sX09wdGlvbnM+OjppbnRlcnNlY3Rpb25Qb2ludChjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLCBPdGhlck9wdGlvbnM+JiBoeXBlcnBsYW5lKSBjb25zdAoreworICByZXR1cm4gcG9pbnRBdChpbnRlcnNlY3Rpb25QYXJhbWV0ZXIoaHlwZXJwbGFuZSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BBUkFNRVRSSVpFRExJTkVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L1F1YXRlcm5pb24uaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9RdWF0ZXJuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1YTliYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9RdWF0ZXJuaW9uLmgKQEAgLTAsMCArMSw4MDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWF0aGlldSBHYXV0aWVyIDxtYXRoaWV1LmdhdXRpZXJAY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9RVUFURVJOSU9OX0gKKyNkZWZpbmUgRUlHRU5fUVVBVEVSTklPTl9ICituYW1lc3BhY2UgRWlnZW4geyAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlZmluaXRpb24gb2YgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4KKyogVGhlIGltcGxlbWVudGF0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLAorICAgICAgICAgaW50IE90aGVyUm93cz1PdGhlcjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICBpbnQgT3RoZXJDb2xzPU90aGVyOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCBxdWF0ZXJuaW9uYmFzZV9hc3NpZ25faW1wbDsKK30KKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogXGNsYXNzIFF1YXRlcm5pb25CYXNlCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHF1YXRlcm5pb24gZXhwcmVzc2lvbnMKKyAgKiBcdHBhcmFtIERlcml2ZWQgZGVyaXZlZCB0eXBlIChDUlRQKQorICAqIFxzYSBjbGFzcyBRdWF0ZXJuaW9uCisgICovCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorY2xhc3MgUXVhdGVybmlvbkJhc2UgOiBwdWJsaWMgUm90YXRpb25CYXNlPERlcml2ZWQsIDM+Cit7CisgcHVibGljOgorICB0eXBlZGVmIFJvdGF0aW9uQmFzZTxEZXJpdmVkLCAzPiBCYXNlOworCisgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKyAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICBlbnVtIHsKKyAgICBGbGFncyA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncworICB9OworCisgLy8gdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXg8U2NhbGFyLDQsMT4gQ29lZmZpY2llbnRzOworICAvKiogdGhlIHR5cGUgb2YgYSAzRCB2ZWN0b3IgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgLyoqIHRoZSBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCB0eXBlICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7CisgIC8qKiB0aGUgZXF1aXZhbGVudCBhbmdsZS1heGlzIHR5cGUgKi8KKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXNUeXBlOworCisKKworICAvKiogXHJldHVybnMgdGhlIFxjIHggY29lZmZpY2llbnQgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciB4KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmKDApOyB9CisgIC8qKiBccmV0dXJucyB0aGUgXGMgeSBjb2VmZmljaWVudCAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIHkoKSBjb25zdCB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmYoMSk7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBcYyB6IGNvZWZmaWNpZW50ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgeigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmRlcml2ZWQoKS5jb2VmZnMoKS5jb2VmZigyKTsgfQorICAvKiogXHJldHVybnMgdGhlIFxjIHcgY29lZmZpY2llbnQgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciB3KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmKDMpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB4IGNvZWZmaWNpZW50ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIHgoKSB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmZSZWYoMCk7IH0KKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB5IGNvZWZmaWNpZW50ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIHkoKSB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmZSZWYoMSk7IH0KKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB6IGNvZWZmaWNpZW50ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIHooKSB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmZSZWYoMik7IH0KKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB3IGNvZWZmaWNpZW50ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIHcoKSB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmZSZWYoMyk7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0ICh4LHkseikgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IENvZWZmaWNpZW50cywzPiB2ZWMoKSBjb25zdCB7IHJldHVybiBjb2VmZnMoKS50ZW1wbGF0ZSBoZWFkPDM+KCk7IH0KKworICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgaW1hZ2luYXJ5IHBhcnQgKHgseSx6KSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVmVjdG9yQmxvY2s8Q29lZmZpY2llbnRzLDM+IHZlYygpIHsgcmV0dXJuIGNvZWZmcygpLnRlbXBsYXRlIGhlYWQ8Mz4oKTsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtb25seSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnRzICh4LHkseix3KSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZpY2llbnRzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuY29lZmZzKCk7IH0KKworICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnRzICh4LHkseix3KSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZpY2llbnRzJiBjb2VmZnMoKSB7IHJldHVybiBkZXJpdmVkKCkuY29lZmZzKCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+JiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIG90aGVyKTsKKyAgdGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKy8vIGRpc2FibGVkIHRoaXMgY29weSBvcGVyYXRvciBhcyBpdCBpcyBnaXZpbmcgdmVyeSBzdHJhbmdlIGNvbXBpbGF0aW9uIGVycm9ycyB3aGVuIGNvbXBpbGluZworLy8gdGVzdF9zdGR2ZWN0b3Igd2l0aCBHQ0MgNC40LjIuIFRoaXMgbG9va3MgbGlrZSBhIEdDQyBidWcgdGhvdWdoLCBzbyBmZWVsIGZyZWUgdG8gcmUtZW5hYmxlIGl0IGlmIGl0J3MKKy8vIHVzZWZ1bDsgaG93ZXZlciBub3RpY2UgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0gYWJvdmUgYW5kIGUuZy4gaW4gTWF0cml4QmFzZQorLy8gd2UgZGlkbid0IGhhdmUgdG8gYWRkLCBpbiBhZGRpdGlvbiB0byB0ZW1wbGF0ZWQgb3BlcmF0b3I9LCBzdWNoIGEgbm9uLXRlbXBsYXRlZCBjb3B5IG9wZXJhdG9yLgorLy8gIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uQmFzZSYgb3RoZXIpCisvLyAgeyByZXR1cm4gb3BlcmF0b3I9PERlcml2ZWQ+KG90aGVyKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBBbmdsZUF4aXNUeXBlJiBhYSk7CisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgbSk7CisKKyAgLyoqIFxyZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYW4gaWRlbnRpdHkgcm90YXRpb24KKyAgICAqIFxzYSBNYXRyaXhCYXNlOjpJZGVudGl0eSgpCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBRdWF0ZXJuaW9uPFNjYWxhcj4gSWRlbnRpdHkoKSB7IHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oU2NhbGFyKDEpLCBTY2FsYXIoMCksIFNjYWxhcigwKSwgU2NhbGFyKDApKTsgfQorCisgIC8qKiBcc2EgUXVhdGVybmlvbkJhc2U6OklkZW50aXR5KCksIE1hdHJpeEJhc2U6OnNldElkZW50aXR5KCkKKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUXVhdGVybmlvbkJhc2UmIHNldElkZW50aXR5KCkgeyBjb2VmZnMoKSA8PCBTY2FsYXIoMCksIFNjYWxhcigwKSwgU2NhbGFyKDApLCBTY2FsYXIoMSk7IHJldHVybiAqdGhpczsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgc3F1YXJlZCBub3JtIG9mIHRoZSBxdWF0ZXJuaW9uJ3MgY29lZmZpY2llbnRzCisgICAgKiBcc2EgUXVhdGVybmlvbkJhc2U6Om5vcm0oKSwgTWF0cml4QmFzZTo6c3F1YXJlZE5vcm0oKQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdCB7IHJldHVybiBjb2VmZnMoKS5zcXVhcmVkTm9ybSgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBub3JtIG9mIHRoZSBxdWF0ZXJuaW9uJ3MgY29lZmZpY2llbnRzCisgICAgKiBcc2EgUXVhdGVybmlvbkJhc2U6OnNxdWFyZWROb3JtKCksIE1hdHJpeEJhc2U6Om5vcm0oKQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgbm9ybSgpIGNvbnN0IHsgcmV0dXJuIGNvZWZmcygpLm5vcm0oKTsgfQorCisgIC8qKiBOb3JtYWxpemVzIHRoZSBxdWF0ZXJuaW9uIFxjICp0aGlzCisgICAgKiBcc2Egbm9ybWFsaXplZCgpLCBNYXRyaXhCYXNlOjpub3JtYWxpemUoKSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdm9pZCBub3JtYWxpemUoKSB7IGNvZWZmcygpLm5vcm1hbGl6ZSgpOyB9CisgIC8qKiBccmV0dXJucyBhIG5vcm1hbGl6ZWQgY29weSBvZiBcYyAqdGhpcworICAgICogXHNhIG5vcm1hbGl6ZSgpLCBNYXRyaXhCYXNlOjpub3JtYWxpemVkKCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiBub3JtYWxpemVkKCkgY29uc3QgeyByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KGNvZWZmcygpLm5vcm1hbGl6ZWQoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICAgKiBHZW9tZXRyaWNhbGx5IHNwZWFraW5nLCB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHVuaXQgcXVhdGVybmlvbnMKKyAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBjb3NpbmUgb2YgaGFsZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgdHdvIHJvdGF0aW9ucy4KKyAgICAqIFxzYSBhbmd1bGFyRGlzdGFuY2UoKQorICAgICovCisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBkb3QoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGNvZWZmcygpLmRvdChvdGhlci5jb2VmZnMoKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciBhbmd1bGFyRGlzdGFuY2UoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IDN4MyByb3RhdGlvbiBtYXRyaXggKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgTWF0cml4MyB0b1JvdGF0aW9uTWF0cml4KCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBxdWF0ZXJuaW9uIHdoaWNoIHRyYW5zZm9ybSBcYSBhIGludG8gXGEgYiB0aHJvdWdoIGEgcm90YXRpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXJpdmVkJiBzZXRGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpOworCisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBRdWF0ZXJuaW9uPFNjYWxhcj4gb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBxKSBjb25zdDsKKyAgdGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yKj0gKGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIHEpOworCisgIC8qKiBccmV0dXJucyB0aGUgcXVhdGVybmlvbiBkZXNjcmliaW5nIHRoZSBpbnZlcnNlIHJvdGF0aW9uICovCisgIEVJR0VOX0RFVklDRV9GVU5DIFF1YXRlcm5pb248U2NhbGFyPiBpbnZlcnNlKCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBjb25qdWdhdGVkIHF1YXRlcm5pb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgUXVhdGVybmlvbjxTY2FsYXI+IGNvbmp1Z2F0ZSgpIGNvbnN0OworCisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgUXVhdGVybmlvbjxTY2FsYXI+IHNsZXJwKGNvbnN0IFNjYWxhciYgdCwgY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBib29sIGlzQXBwcm94KGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICB7IHJldHVybiBjb2VmZnMoKS5pc0FwcHJveChvdGhlci5jb2VmZnMoKSwgcHJlYyk7IH0KKworICAvKiogcmV0dXJuIHRoZSByZXN1bHQgdmVjdG9yIG9mIFxhIHYgdGhyb3VnaCB0aGUgcm90YXRpb24qLworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFZlY3RvcjMgX3RyYW5zZm9ybVZlY3Rvcihjb25zdCBWZWN0b3IzJiB2KSBjb25zdDsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxEZXJpdmVkLFF1YXRlcm5pb248TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeworICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxEZXJpdmVkLFF1YXRlcm5pb248TmV3U2NhbGFyVHlwZT4gPjo6dHlwZShkZXJpdmVkKCkpOworICB9CisKKyNpZmRlZiBFSUdFTl9RVUFURVJOSU9OQkFTRV9QTFVHSU4KKyMgaW5jbHVkZSBFSUdFTl9RVUFURVJOSU9OQkFTRV9QTFVHSU4KKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZWZpbml0aW9uL2ltcGxlbWVudGF0aW9uIG9mIFF1YXRlcm5pb248U2NhbGFyPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBRdWF0ZXJuaW9uCisgICoKKyAgKiBcYnJpZWYgVGhlIHF1YXRlcm5pb24gY2xhc3MgdXNlZCB0byByZXByZXNlbnQgM0Qgb3JpZW50YXRpb25zIGFuZCByb3RhdGlvbnMKKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIF9PcHRpb25zIGNvbnRyb2xzIHRoZSBtZW1vcnkgYWxpZ25tZW50IG9mIHRoZSBjb2VmZmljaWVudHMuIENhbiBiZSBcIyBBdXRvQWxpZ24gb3IgXCMgRG9udEFsaWduLiBEZWZhdWx0IGlzIEF1dG9BbGlnbi4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHF1YXRlcm5pb24gXGYkIHcreGkreWoremsgXGYkIHRoYXQgaXMgYSBjb252ZW5pZW50IHJlcHJlc2VudGF0aW9uIG9mCisgICogb3JpZW50YXRpb25zIGFuZCByb3RhdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aHJlZSBkaW1lbnNpb25zLiBDb21wYXJlZCB0byBvdGhlciByZXByZXNlbnRhdGlvbnMKKyAgKiBsaWtlIEV1bGVyIGFuZ2xlcyBvciAzeDMgbWF0cmljZXMsIHF1YXRlcm5pb25zIG9mZmVyIHRoZSBmb2xsb3dpbmcgYWR2YW50YWdlczoKKyAgKiBcbGkgXGIgY29tcGFjdCBzdG9yYWdlICg0IHNjYWxhcnMpCisgICogXGxpIFxiIGVmZmljaWVudCB0byBjb21wb3NlICgyOCBmbG9wcyksCisgICogXGxpIFxiIHN0YWJsZSBzcGhlcmljYWwgaW50ZXJwb2xhdGlvbgorICAqCisgICogVGhlIGZvbGxvd2luZyB0d28gdHlwZWRlZnMgYXJlIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZToKKyAgKiBcbGkgXGMgUXVhdGVybmlvbmYgZm9yIFxjIGZsb2F0CisgICogXGxpIFxjIFF1YXRlcm5pb25kIGZvciBcYyBkb3VibGUKKyAgKgorICAqIFx3YXJuaW5nIE9wZXJhdGlvbnMgaW50ZXJwcmV0aW5nIHRoZSBxdWF0ZXJuaW9uIGFzIHJvdGF0aW9uIGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vdCBub3JtYWxpemVkLgorICAqCisgICogXHNhICBjbGFzcyBBbmdsZUF4aXMsIGNsYXNzIFRyYW5zZm9ybQorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcixpbnQgX09wdGlvbnM+CitzdHJ1Y3QgdHJhaXRzPFF1YXRlcm5pb248X1NjYWxhcixfT3B0aW9ucz4gPgoreworICB0eXBlZGVmIFF1YXRlcm5pb248X1NjYWxhcixfT3B0aW9ucz4gUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsNCwxLF9PcHRpb25zPiBDb2VmZmljaWVudHM7CisgIGVudW17CisgICAgQWxpZ25tZW50ID0gaW50ZXJuYWw6OnRyYWl0czxDb2VmZmljaWVudHM+OjpBbGlnbm1lbnQsCisgICAgRmxhZ3MgPSBMdmFsdWVCaXQKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIFF1YXRlcm5pb24gOiBwdWJsaWMgUXVhdGVybmlvbkJhc2U8UXVhdGVybmlvbjxfU2NhbGFyLF9PcHRpb25zPiA+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgUXVhdGVybmlvbkJhc2U8UXVhdGVybmlvbjxfU2NhbGFyLF9PcHRpb25zPiA+IEJhc2U7CisgIGVudW0geyBOZWVkc0FsaWdubWVudCA9IGludGVybmFsOjp0cmFpdHM8UXVhdGVybmlvbj46OkFsaWdubWVudD4wIH07CisKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKworICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKFF1YXRlcm5pb24pCisgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKj07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFF1YXRlcm5pb24+OjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkFuZ2xlQXhpc1R5cGUgQW5nbGVBeGlzVHlwZTsKKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciBsZWF2aW5nIHRoZSBxdWF0ZXJuaW9uIHVuaW5pdGlhbGl6ZWQuICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBRdWF0ZXJuaW9uKCkge30KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHF1YXRlcm5pb24gXGYkIHcreGkreWoremsgXGYkIGZyb20KKyAgICAqIGl0cyBmb3VyIGNvZWZmaWNpZW50cyBcYSB3LCBcYSB4LCBcYSB5IGFuZCBcYSB6LgorICAgICoKKyAgICAqIFx3YXJuaW5nIE5vdGUgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHM6IHRoZSByZWFsIFxhIHcgY29lZmZpY2llbnQgZmlyc3QsCisgICAgKiB3aGlsZSBpbnRlcm5hbGx5IHRoZSBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICogW1xjIHgsIFxjIHksIFxjIHosIFxjIHddCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgU2NhbGFyJiB3LCBjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiB6KSA6IG1fY29lZmZzKHgsIHksIHosIHcpe30KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBhIHF1YXRlcm5pb24gZnJvbSB0aGUgYXJyYXkgZGF0YSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBpbmxpbmUgUXVhdGVybmlvbihjb25zdCBTY2FsYXIqIGRhdGEpIDogbV9jb2VmZnMoZGF0YSkge30KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciAqLworICB0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFF1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIG90aGVyKSB7IHRoaXMtPkJhc2U6Om9wZXJhdG9yPShvdGhlcik7IH0KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGFuZ2xlLWF4aXMgXGEgYWEgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgQW5nbGVBeGlzVHlwZSYgYWEpIHsgKnRoaXMgPSBhYTsgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplcyBhIHF1YXRlcm5pb24gZnJvbSBlaXRoZXI6CisgICAgKiAgLSBhIHJvdGF0aW9uIG1hdHJpeCBleHByZXNzaW9uLAorICAgICogIC0gYSA0RCB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgcXVhdGVybmlvbiBjb2VmZmljaWVudHMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCisgIC8qKiBFeHBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXIsIGludCBPdGhlck9wdGlvbnM+CisgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IGlubGluZSBRdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb248T3RoZXJTY2FsYXIsIE90aGVyT3B0aW9ucz4mIG90aGVyKQorICB7IG1fY29lZmZzID0gb3RoZXIuY29lZmZzKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgUXVhdGVybmlvbiBVbml0UmFuZG9tKCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgUXVhdGVybmlvbiBGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDb2VmZmljaWVudHMmIGNvZWZmcygpIHsgcmV0dXJuIG1fY29lZmZzO30KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7fQorCisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUYoYm9vbChOZWVkc0FsaWdubWVudCkpCisgIAorI2lmZGVmIEVJR0VOX1FVQVRFUk5JT05fUExVR0lOCisjIGluY2x1ZGUgRUlHRU5fUVVBVEVSTklPTl9QTFVHSU4KKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgIENvZWZmaWNpZW50cyBtX2NvZWZmczsKKyAgCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCAoX09wdGlvbnMgJiBEb250QWxpZ24pID09IF9PcHRpb25zLAorICAgICAgICBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTKQorICAgIH0KKyNlbmRpZgorfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIHNpbmdsZSBwcmVjaXNpb24gcXVhdGVybmlvbiB0eXBlICovCit0eXBlZGVmIFF1YXRlcm5pb248ZmxvYXQ+IFF1YXRlcm5pb25mOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIGRvdWJsZSBwcmVjaXNpb24gcXVhdGVybmlvbiB0eXBlICovCit0eXBlZGVmIFF1YXRlcm5pb248ZG91YmxlPiBRdWF0ZXJuaW9uZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTcGVjaWFsaXphdGlvbiBvZiBNYXA8UXVhdGVybmlvbjxTY2FsYXI+PgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnM+CisgIHN0cnVjdCB0cmFpdHM8TWFwPFF1YXRlcm5pb248X1NjYWxhcj4sIF9PcHRpb25zPiA+IDogdHJhaXRzPFF1YXRlcm5pb248X1NjYWxhciwgKGludChfT3B0aW9ucykmQWxpZ25lZCk9PUFsaWduZWQgPyBBdXRvQWxpZ24gOiBEb250QWxpZ24+ID4KKyAgeworICAgIHR5cGVkZWYgTWFwPE1hdHJpeDxfU2NhbGFyLDQsMT4sIF9PcHRpb25zPiBDb2VmZmljaWVudHM7CisgIH07Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KKyAgc3RydWN0IHRyYWl0czxNYXA8Y29uc3QgUXVhdGVybmlvbjxfU2NhbGFyPiwgX09wdGlvbnM+ID4gOiB0cmFpdHM8UXVhdGVybmlvbjxfU2NhbGFyLCAoaW50KF9PcHRpb25zKSZBbGlnbmVkKT09QWxpZ25lZCA/IEF1dG9BbGlnbiA6IERvbnRBbGlnbj4gPgorICB7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PF9TY2FsYXIsNCwxPiwgX09wdGlvbnM+IENvZWZmaWNpZW50czsKKyAgICB0eXBlZGVmIHRyYWl0czxRdWF0ZXJuaW9uPF9TY2FsYXIsIChpbnQoX09wdGlvbnMpJkFsaWduZWQpPT1BbGlnbmVkID8gQXV0b0FsaWduIDogRG9udEFsaWduPiA+IFRyYWl0c0Jhc2U7CisgICAgZW51bSB7CisgICAgICBGbGFncyA9IFRyYWl0c0Jhc2U6OkZsYWdzICYgfkx2YWx1ZUJpdAorICAgIH07CisgIH07Cit9CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBcYnJpZWYgUXVhdGVybmlvbiBleHByZXNzaW9uIG1hcHBpbmcgYSBjb25zdGFudCBtZW1vcnkgYnVmZmVyCisgICoKKyAgKiBcdHBhcmFtIF9TY2FsYXIgdGhlIHR5cGUgb2YgdGhlIFF1YXRlcm5pb24gY29lZmZpY2llbnRzCisgICogXHRwYXJhbSBfT3B0aW9ucyBzZWUgY2xhc3MgTWFwCisgICoKKyAgKiBUaGlzIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgY2xhc3MgTWFwIGZvciBRdWF0ZXJuaW9uLiBUaGlzIGNsYXNzIGFsbG93cyB0byB2aWV3CisgICogYSA0IHNjYWxhciBtZW1vcnkgYnVmZmVyIGFzIGFuIEVpZ2VuJ3MgUXVhdGVybmlvbiBvYmplY3QuCisgICoKKyAgKiBcc2EgY2xhc3MgTWFwLCBjbGFzcyBRdWF0ZXJuaW9uLCBjbGFzcyBRdWF0ZXJuaW9uQmFzZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zPgorY2xhc3MgTWFwPGNvbnN0IFF1YXRlcm5pb248X1NjYWxhcj4sIF9PcHRpb25zID4KKyAgOiBwdWJsaWMgUXVhdGVybmlvbkJhc2U8TWFwPGNvbnN0IFF1YXRlcm5pb248X1NjYWxhcj4sIF9PcHRpb25zPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFF1YXRlcm5pb25CYXNlPE1hcDxjb25zdCBRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucz4gPiBCYXNlOworCisgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWFwPjo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKE1hcCkKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcio9OworCisgICAgLyoqIENvbnN0cnVjdHMgYSBNYXBwZWQgUXVhdGVybmlvbiBvYmplY3QgZnJvbSB0aGUgcG9pbnRlciBcYSBjb2VmZnMKKyAgICAgICoKKyAgICAgICogVGhlIHBvaW50ZXIgXGEgY29lZmZzIG11c3QgcmVmZXJlbmNlIHRoZSBmb3VyIGNvZWZmaWNpZW50cyBvZiBRdWF0ZXJuaW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgICAqIFxjb2RlICpjb2VmZnMgPT0ge3gsIHksIHosIHd9IFxlbmRjb2RlCisgICAgICAqCisgICAgICAqIElmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgX09wdGlvbnMgaXMgc2V0IHRvICNBbGlnbmVkLCB0aGVuIHRoZSBwb2ludGVyIGNvZWZmcyBtdXN0IGJlIGFsaWduZWQuICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgRUlHRU5fU1RST05HX0lOTElORSBNYXAoY29uc3QgU2NhbGFyKiBjb2VmZnMpIDogbV9jb2VmZnMoY29lZmZzKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7fQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBDb2VmZmljaWVudHMgbV9jb2VmZnM7Cit9OworCisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBxdWF0ZXJuaW9uIGZyb20gYSBtZW1vcnkgYnVmZmVyCisgICoKKyAgKiBcdHBhcmFtIF9TY2FsYXIgdGhlIHR5cGUgb2YgdGhlIFF1YXRlcm5pb24gY29lZmZpY2llbnRzCisgICogXHRwYXJhbSBfT3B0aW9ucyBzZWUgY2xhc3MgTWFwCisgICoKKyAgKiBUaGlzIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgY2xhc3MgTWFwIGZvciBRdWF0ZXJuaW9uLiBUaGlzIGNsYXNzIGFsbG93cyB0byB2aWV3CisgICogYSA0IHNjYWxhciBtZW1vcnkgYnVmZmVyIGFzIGFuIEVpZ2VuJ3MgIFF1YXRlcm5pb24gb2JqZWN0LgorICAqCisgICogXHNhIGNsYXNzIE1hcCwgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgUXVhdGVybmlvbkJhc2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIE1hcDxRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucyA+CisgIDogcHVibGljIFF1YXRlcm5pb25CYXNlPE1hcDxRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBRdWF0ZXJuaW9uQmFzZTxNYXA8UXVhdGVybmlvbjxfU2NhbGFyPiwgX09wdGlvbnM+ID4gQmFzZTsKKworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hcD46OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhNYXApCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqPTsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgTWFwcGVkIFF1YXRlcm5pb24gb2JqZWN0IGZyb20gdGhlIHBvaW50ZXIgXGEgY29lZmZzCisgICAgICAqCisgICAgICAqIFRoZSBwb2ludGVyIFxhIGNvZWZmcyBtdXN0IHJlZmVyZW5jZSB0aGUgZm91ciBjb2VmZmljaWVudHMgb2YgUXVhdGVybmlvbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAgKiBcY29kZSAqY29lZmZzID09IHt4LCB5LCB6LCB3fSBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIF9PcHRpb25zIGlzIHNldCB0byAjQWxpZ25lZCwgdGhlbiB0aGUgcG9pbnRlciBjb2VmZnMgbXVzdCBiZSBhbGlnbmVkLiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGV4cGxpY2l0IEVJR0VOX1NUUk9OR19JTkxJTkUgTWFwKFNjYWxhciogY29lZmZzKSA6IG1fY29lZmZzKGNvZWZmcykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDb2VmZmljaWVudHMmIGNvZWZmcygpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgQ29lZmZpY2llbnRzIG1fY29lZmZzOworfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIE1hcCBhbiB1bmFsaWduZWQgYXJyYXkgb2Ygc2luZ2xlIHByZWNpc2lvbiBzY2FsYXJzIGFzIGEgcXVhdGVybmlvbiAqLwordHlwZWRlZiBNYXA8UXVhdGVybmlvbjxmbG9hdD4sIDA+ICAgICAgICAgUXVhdGVybmlvbk1hcGY7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogTWFwIGFuIHVuYWxpZ25lZCBhcnJheSBvZiBkb3VibGUgcHJlY2lzaW9uIHNjYWxhcnMgYXMgYSBxdWF0ZXJuaW9uICovCit0eXBlZGVmIE1hcDxRdWF0ZXJuaW9uPGRvdWJsZT4sIDA+ICAgICAgICBRdWF0ZXJuaW9uTWFwZDsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBNYXAgYSAxNi1ieXRlIGFsaWduZWQgYXJyYXkgb2Ygc2luZ2xlIHByZWNpc2lvbiBzY2FsYXJzIGFzIGEgcXVhdGVybmlvbiAqLwordHlwZWRlZiBNYXA8UXVhdGVybmlvbjxmbG9hdD4sIEFsaWduZWQ+ICAgUXVhdGVybmlvbk1hcEFsaWduZWRmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIE1hcCBhIDE2LWJ5dGUgYWxpZ25lZCBhcnJheSBvZiBkb3VibGUgcHJlY2lzaW9uIHNjYWxhcnMgYXMgYSBxdWF0ZXJuaW9uICovCit0eXBlZGVmIE1hcDxRdWF0ZXJuaW9uPGRvdWJsZT4sIEFsaWduZWQ+ICBRdWF0ZXJuaW9uTWFwQWxpZ25lZGQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgUXVhdGVybmlvbkJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBHZW5lcmljIFF1YXRlcm5pb24gKiBRdWF0ZXJuaW9uIHByb2R1Y3QKKy8vIFRoaXMgcHJvZHVjdCBjYW4gYmUgc3BlY2lhbGl6ZWQgZm9yIGEgZ2l2ZW4gYXJjaGl0ZWN0dXJlIHZpYSB0aGUgQXJjaCB0ZW1wbGF0ZSBhcmd1bWVudC4KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgQXJjaCwgY2xhc3MgRGVyaXZlZDEsIGNsYXNzIERlcml2ZWQyLCB0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBxdWF0X3Byb2R1Y3QKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgUXVhdGVybmlvbjxTY2FsYXI+IHJ1bihjb25zdCBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkMT4mIGEsIGNvbnN0IFF1YXRlcm5pb25CYXNlPERlcml2ZWQyPiYgYil7CisgICAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPgorICAgICgKKyAgICAgIGEudygpICogYi53KCkgLSBhLngoKSAqIGIueCgpIC0gYS55KCkgKiBiLnkoKSAtIGEueigpICogYi56KCksCisgICAgICBhLncoKSAqIGIueCgpICsgYS54KCkgKiBiLncoKSArIGEueSgpICogYi56KCkgLSBhLnooKSAqIGIueSgpLAorICAgICAgYS53KCkgKiBiLnkoKSArIGEueSgpICogYi53KCkgKyBhLnooKSAqIGIueCgpIC0gYS54KCkgKiBiLnooKSwKKyAgICAgIGEudygpICogYi56KCkgKyBhLnooKSAqIGIudygpICsgYS54KCkgKiBiLnkoKSAtIGEueSgpICogYi54KCkKKyAgICApOworICB9Cit9OworfQorCisvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdHdvIHJvdGF0aW9ucyBhcyBhIHF1YXRlcm5pb24tcXVhdGVybmlvbiBwcm9kdWN0ICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlIDxjbGFzcyBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFF1YXRlcm5pb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPgorUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSksCisgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgcmV0dXJuIGludGVybmFsOjpxdWF0X3Byb2R1Y3Q8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsIERlcml2ZWQsIE90aGVyRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpydW4oKnRoaXMsIG90aGVyKTsKK30KKworLyoqIFxzYSBvcGVyYXRvciooUXVhdGVybmlvbikgKi8KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgordGVtcGxhdGUgPGNsYXNzIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKj0gKGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBkZXJpdmVkKCkgPSBkZXJpdmVkKCkgKiBvdGhlci5kZXJpdmVkKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBSb3RhdGlvbiBvZiBhIHZlY3RvciBieSBhIHF1YXRlcm5pb24uCisgICogXHJlbWFya3MgSWYgdGhlIHF1YXRlcm5pb24gaXMgdXNlZCB0byByb3RhdGUgc2V2ZXJhbCBwb2ludHMgKD4xKQorICAqIHRoZW4gaXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0byBmaXJzdCBjb252ZXJ0IGl0IHRvIGEgM3gzIE1hdHJpeC4KKyAgKiBDb21wYXJpc29uIG9mIHRoZSBvcGVyYXRpb24gY29zdCBmb3IgbiB0cmFuc2Zvcm1hdGlvbnM6CisgICogICAtIFF1YXRlcm5pb24yOiAgICAzMG4KKyAgKiAgIC0gVmlhIGEgTWF0cml4MzogMjQgKyAxNW4KKyAgKi8KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6VmVjdG9yMworUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Ol90cmFuc2Zvcm1WZWN0b3IoY29uc3QgVmVjdG9yMyYgdikgY29uc3QKK3sKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgb3B0aW1pemF0aW9uIGJ5IGhhbmQKKyAgICAvLyBvZiB0aGUgY29udmVyc2lvbiB0byBhIE1hdHJpeCBmb2xsb3dlZCBieSBhIE1hdHJpeC9WZWN0b3IgcHJvZHVjdC4KKyAgICAvLyBJdCBhcHBlYXJzIHRvIGJlIG11Y2ggZmFzdGVyIHRoYW4gdGhlIGNvbW1vbiBhbGdvcml0aG0gZm91bmQKKyAgICAvLyBpbiB0aGUgbGl0ZXJhdHVyZSAoMzAgdmVyc3VzIDM5IGZsb3BzKS4gSXQgYWxzbyByZXF1aXJlcyB0d28KKyAgICAvLyBWZWN0b3IzIGFzIHRlbXBvcmFyaWVzLgorICAgIFZlY3RvcjMgdXYgPSB0aGlzLT52ZWMoKS5jcm9zcyh2KTsKKyAgICB1diArPSB1djsKKyAgICByZXR1cm4gdiArIHRoaXMtPncoKSAqIHV2ICsgdGhpcy0+dmVjKCkuY3Jvc3ModXYpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgb3RoZXIpCit7CisgIGNvZWZmcygpID0gb3RoZXIuY29lZmZzKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+Cit0ZW1wbGF0ZTxjbGFzcyBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGNvZWZmcygpID0gb3RoZXIuY29lZmZzKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBTZXQgXGMgKnRoaXMgZnJvbSBhbiBhbmdsZS1heGlzIFxhIGFhIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICovCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IEFuZ2xlQXhpc1R5cGUmIGFhKQoreworICBFSUdFTl9VU0lOR19TVERfTUFUSChjb3MpCisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKHNpbikKKyAgU2NhbGFyIGhhID0gU2NhbGFyKDAuNSkqYWEuYW5nbGUoKTsgLy8gU2NhbGFyKDAuNSkgdG8gc3VwcHJlc3MgcHJlY2lzaW9uIGxvc3Mgd2FybmluZ3MKKyAgdGhpcy0+dygpID0gY29zKGhhKTsKKyAgdGhpcy0+dmVjKCkgPSBzaW4oaGEpICogYWEuYXhpcygpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gdGhlIGV4cHJlc3Npb24gXGEgeHByOgorICAqICAgLSBpZiBcYSB4cHIgaXMgYSA0eDEgdmVjdG9yLCB0aGVuIFxhIHhwciBpcyBhc3N1bWVkIHRvIGJlIGEgcXVhdGVybmlvbgorICAqICAgLSBpZiBcYSB4cHIgaXMgYSAzeDMgbWF0cml4LCB0aGVuIFxhIHhwciBpcyBhc3N1bWVkIHRvIGJlIHJvdGF0aW9uIG1hdHJpeAorICAqICAgICBhbmQgXGEgeHByIGlzIGNvbnZlcnRlZCB0byBhIHF1YXRlcm5pb24KKyAgKi8KKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlPGNsYXNzIE1hdHJpeERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgRGVyaXZlZCYgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE1hdHJpeERlcml2ZWQ+JiB4cHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciwgdHlwZW5hbWUgTWF0cml4RGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisgIGludGVybmFsOjpxdWF0ZXJuaW9uYmFzZV9hc3NpZ25faW1wbDxNYXRyaXhEZXJpdmVkPjo6cnVuKCp0aGlzLCB4cHIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIENvbnZlcnQgdGhlIHF1YXRlcm5pb24gdG8gYSAzeDMgcm90YXRpb24gbWF0cml4LiBUaGUgcXVhdGVybmlvbiBpcyByZXF1aXJlZCB0bworICAqIGJlIG5vcm1hbGl6ZWQsIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Ok1hdHJpeDMKK1F1YXRlcm5pb25CYXNlPERlcml2ZWQ+Ojp0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIC8vIE5PVEUgaWYgaW5saW5lZCwgdGhlbiBnY2MgNC4yIGFuZCA0LjQgZ2V0IHJpZCBvZiB0aGUgdGVtcG9yYXJ5IChub3QgZ2NjIDQuMyAhISkKKyAgLy8gaWYgbm90IGlubGluZWQgdGhlbiB0aGUgY29zdCBvZiB0aGUgcmV0dXJuIGJ5IHZhbHVlIGlzIGh1Z2UgfiArMzUlLAorICAvLyBob3dldmVyLCBub3QgaW5saW5pbmcgdGhpcyBmdW5jdGlvbiBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyLCBzbworICAvLyBpdCBoYXMgdG8gYmUgaW5saW5lZCwgYW5kIHNvIHRoZSByZXR1cm4gYnkgdmFsdWUgaXMgbm90IGFuIGlzc3VlCisgIE1hdHJpeDMgcmVzOworCisgIGNvbnN0IFNjYWxhciB0eCAgPSBTY2FsYXIoMikqdGhpcy0+eCgpOworICBjb25zdCBTY2FsYXIgdHkgID0gU2NhbGFyKDIpKnRoaXMtPnkoKTsKKyAgY29uc3QgU2NhbGFyIHR6ICA9IFNjYWxhcigyKSp0aGlzLT56KCk7CisgIGNvbnN0IFNjYWxhciB0d3ggPSB0eCp0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0d3kgPSB0eSp0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0d3ogPSB0eip0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0eHggPSB0eCp0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eHkgPSB0eSp0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eHogPSB0eip0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eXkgPSB0eSp0aGlzLT55KCk7CisgIGNvbnN0IFNjYWxhciB0eXogPSB0eip0aGlzLT55KCk7CisgIGNvbnN0IFNjYWxhciB0enogPSB0eip0aGlzLT56KCk7CisKKyAgcmVzLmNvZWZmUmVmKDAsMCkgPSBTY2FsYXIoMSktKHR5eSt0enopOworICByZXMuY29lZmZSZWYoMCwxKSA9IHR4eS10d3o7CisgIHJlcy5jb2VmZlJlZigwLDIpID0gdHh6K3R3eTsKKyAgcmVzLmNvZWZmUmVmKDEsMCkgPSB0eHkrdHd6OworICByZXMuY29lZmZSZWYoMSwxKSA9IFNjYWxhcigxKS0odHh4K3R6eik7CisgIHJlcy5jb2VmZlJlZigxLDIpID0gdHl6LXR3eDsKKyAgcmVzLmNvZWZmUmVmKDIsMCkgPSB0eHotdHd5OworICByZXMuY29lZmZSZWYoMiwxKSA9IHR5eit0d3g7CisgIHJlcy5jb2VmZlJlZigyLDIpID0gU2NhbGFyKDEpLSh0eHgrdHl5KTsKKworICByZXR1cm4gcmVzOworfQorCisvKiogU2V0cyBcYyAqdGhpcyB0byBiZSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIGEgcm90YXRpb24gYmV0d2VlbgorICAqIHRoZSB0d28gYXJiaXRyYXJ5IHZlY3RvcnMgXGEgYSBhbmQgXGEgYi4gSW4gb3RoZXIgd29yZHMsIHRoZSBidWlsdAorICAqIHJvdGF0aW9uIHJlcHJlc2VudCBhIHJvdGF0aW9uIHNlbmRpbmcgdGhlIGxpbmUgb2YgZGlyZWN0aW9uIFxhIGEKKyAgKiB0byB0aGUgbGluZSBvZiBkaXJlY3Rpb24gXGEgYiwgYm90aCBsaW5lcyBwYXNzaW5nIHRocm91Z2ggdGhlIG9yaWdpbi4KKyAgKgorICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqCisgICogTm90ZSB0aGF0IHRoZSB0d28gaW5wdXQgdmVjdG9ycyBkbyBcYiBub3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLCBhbmQKKyAgKiBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lIG5vcm0uCisgICovCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIERlcml2ZWQmIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpzZXRGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpCit7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKHNxcnQpCisgIFZlY3RvcjMgdjAgPSBhLm5vcm1hbGl6ZWQoKTsKKyAgVmVjdG9yMyB2MSA9IGIubm9ybWFsaXplZCgpOworICBTY2FsYXIgYyA9IHYxLmRvdCh2MCk7CisKKyAgLy8gaWYgZG90ID09IC0xLCB2ZWN0b3JzIGFyZSBuZWFybHkgb3Bwb3NpdGVzCisgIC8vID0+IGFjY3VyYXRlbHkgY29tcHV0ZSB0aGUgcm90YXRpb24gYXhpcyBieSBjb21wdXRpbmcgdGhlCisgIC8vICAgIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHBsYW5lcy4gVGhpcyBpcyBkb25lIGJ5IHNvbHZpbmc6CisgIC8vICAgICAgIHheVCB2MCA9IDAKKyAgLy8gICAgICAgeF5UIHYxID0gMAorICAvLyAgICB1bmRlciB0aGUgY29uc3RyYWludDoKKyAgLy8gICAgICAgfHx4fHwgPSAxCisgIC8vICAgIHdoaWNoIHlpZWxkcyBhIHNpbmd1bGFyIHZhbHVlIHByb2JsZW0KKyAgaWYgKGMgPCBTY2FsYXIoLTEpK051bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKKyAgeworICAgIGMgPSBudW1leHQ6Om1heGkoYyxTY2FsYXIoLTEpKTsKKyAgICBNYXRyaXg8U2NhbGFyLDIsMz4gbTsgbSA8PCB2MC50cmFuc3Bvc2UoKSwgdjEudHJhbnNwb3NlKCk7CisgICAgSmFjb2JpU1ZEPE1hdHJpeDxTY2FsYXIsMiwzPiA+IHN2ZChtLCBDb21wdXRlRnVsbFYpOworICAgIFZlY3RvcjMgYXhpcyA9IHN2ZC5tYXRyaXhWKCkuY29sKDIpOworCisgICAgU2NhbGFyIHcyID0gKFNjYWxhcigxKStjKSpTY2FsYXIoMC41KTsKKyAgICB0aGlzLT53KCkgPSBzcXJ0KHcyKTsKKyAgICB0aGlzLT52ZWMoKSA9IGF4aXMgKiBzcXJ0KFNjYWxhcigxKSAtIHcyKTsKKyAgICByZXR1cm4gZGVyaXZlZCgpOworICB9CisgIFZlY3RvcjMgYXhpcyA9IHYwLmNyb3NzKHYxKTsKKyAgU2NhbGFyIHMgPSBzcXJ0KChTY2FsYXIoMSkrYykqU2NhbGFyKDIpKTsKKyAgU2NhbGFyIGludnMgPSBTY2FsYXIoMSkvczsKKyAgdGhpcy0+dmVjKCkgPSBheGlzICogaW52czsKKyAgdGhpcy0+dygpID0gcyAqIFNjYWxhcigwLjUpOworCisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhIHJhbmRvbSB1bml0IHF1YXRlcm5pb24gZm9sbG93aW5nIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gbGF3IG9uIFNPKDMpCisgICoKKyAgKiBcbm90ZSBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gaHR0cDovL3BsYW5uaW5nLmNzLnVpdWMuZWR1L25vZGUxOTguaHRtbAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4KK0VJR0VOX0RFVklDRV9GVU5DIFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+IFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+OjpVbml0UmFuZG9tKCkKK3sKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoc3FydCkKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoc2luKQorICBFSUdFTl9VU0lOR19TVERfTUFUSChjb3MpCisgIGNvbnN0IFNjYWxhciB1MSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLCAxKSwKKyAgICAgICAgICAgICAgIHUyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsIDIqRUlHRU5fUEkpLAorICAgICAgICAgICAgICAgdTMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwgMipFSUdFTl9QSSk7CisgIGNvbnN0IFNjYWxhciBhID0gc3FydCgxIC0gdTEpLAorICAgICAgICAgICAgICAgYiA9IHNxcnQodTEpOworICByZXR1cm4gUXVhdGVybmlvbiAoYSAqIHNpbih1MiksIGEgKiBjb3ModTIpLCBiICogc2luKHUzKSwgYiAqIGNvcyh1MykpOworfQorCisKKy8qKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYSByb3RhdGlvbiBiZXR3ZWVuCisgICogdGhlIHR3byBhcmJpdHJhcnkgdmVjdG9ycyBcYSBhIGFuZCBcYSBiLiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1aWx0CisgICogcm90YXRpb24gcmVwcmVzZW50IGEgcm90YXRpb24gc2VuZGluZyB0aGUgbGluZSBvZiBkaXJlY3Rpb24gXGEgYQorICAqIHRvIHRoZSBsaW5lIG9mIGRpcmVjdGlvbiBcYSBiLCBib3RoIGxpbmVzIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luLgorICAqCisgICogXHJldHVybnMgcmVzdWx0aW5nIHF1YXRlcm5pb24KKyAgKgorICAqIE5vdGUgdGhhdCB0aGUgdHdvIGlucHV0IHZlY3RvcnMgZG8gXGIgbm90IGhhdmUgdG8gYmUgbm9ybWFsaXplZCwgYW5kCisgICogZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBub3JtLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK0VJR0VOX0RFVklDRV9GVU5DIFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+IFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+OjpGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpCit7CisgICAgUXVhdGVybmlvbiBxdWF0OworICAgIHF1YXQuc2V0RnJvbVR3b1ZlY3RvcnMoYSwgYik7CisgICAgcmV0dXJuIHF1YXQ7Cit9CisKKworLyoqIFxyZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIFxjICp0aGlzCisgICogTm90ZSB0aGF0IGluIG1vc3QgY2FzZXMsIGkuZS4sIGlmIHlvdSBzaW1wbHkgd2FudCB0aGUgb3Bwb3NpdGUgcm90YXRpb24sCisgICogYW5kL29yIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoZW4gaXQgaXMgZW5vdWdoIHRvIHVzZSB0aGUgY29uanVnYXRlLgorICAqCisgICogXHNhIFF1YXRlcm5pb25CYXNlOjpjb25qdWdhdGUoKQorICAqLwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUXVhdGVybmlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+IFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjppbnZlcnNlKCkgY29uc3QKK3sKKyAgLy8gRklYTUUgc2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgY2FsbGVkIG11bHRpcGxpY2F0aXZlSW52ZXJzZSBhbmQgY29uanVnYXRlKCkgYmUgY2FsbGVkIGludmVyc2UoKSBvciBvcHBvc2l0ZSgpICA/PworICBTY2FsYXIgbjIgPSB0aGlzLT5zcXVhcmVkTm9ybSgpOworICBpZiAobjIgPiBTY2FsYXIoMCkpCisgICAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPihjb25qdWdhdGUoKS5jb2VmZnMoKSAvIG4yKTsKKyAgZWxzZQorICB7CisgICAgLy8gcmV0dXJuIGFuIGludmFsaWQgcmVzdWx0IHRvIGZsYWcgdGhlIGVycm9yCisgICAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPihDb2VmZmljaWVudHM6Olplcm8oKSk7CisgIH0KK30KKworLy8gR2VuZXJpYyBjb25qdWdhdGUgb2YgYSBRdWF0ZXJuaW9uCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IEFyY2gsIGNsYXNzIERlcml2ZWQsIHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHF1YXRfY29uagoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBRdWF0ZXJuaW9uPFNjYWxhcj4gcnVuKGNvbnN0IFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+JiBxKXsKKyAgICByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KHEudygpLC1xLngoKSwtcS55KCksLXEueigpKTsKKyAgfQorfTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBccmV0dXJucyB0aGUgY29uanVnYXRlIG9mIHRoZSBcYyAqdGhpcyB3aGljaCBpcyBlcXVhbCB0byB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZQorICAqIGlmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQuCisgICogVGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRlcm5pb24gcmVwcmVzZW50cyB0aGUgb3Bwb3NpdGUgcm90YXRpb24uCisgICoKKyAgKiBcc2EgUXVhdGVybmlvbjI6OmludmVyc2UoKQorICAqLwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUXVhdGVybmlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+CitRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6Y29uanVnYXRlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjpxdWF0X2Nvbmo8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsIERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6cnVuKCp0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyoqIFxyZXR1cm5zIHRoZSBhbmdsZSAoaW4gcmFkaWFuKSBiZXR3ZWVuIHR3byByb3RhdGlvbnMKKyAgKiBcc2EgZG90KCkKKyAgKi8KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgordGVtcGxhdGUgPGNsYXNzIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK1F1YXRlcm5pb25CYXNlPERlcml2ZWQ+Ojphbmd1bGFyRGlzdGFuY2UoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1VTSU5HX1NURF9NQVRIKGF0YW4yKQorICBRdWF0ZXJuaW9uPFNjYWxhcj4gZCA9ICgqdGhpcykgKiBvdGhlci5jb25qdWdhdGUoKTsKKyAgcmV0dXJuIFNjYWxhcigyKSAqIGF0YW4yKCBkLnZlYygpLm5vcm0oKSwgbnVtZXh0OjphYnMoZC53KCkpICk7Cit9CisKKyAKKyAgICAKKy8qKiBccmV0dXJucyB0aGUgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHR3byBxdWF0ZXJuaW9ucworICAqIFxjICp0aGlzIGFuZCBcYSBvdGhlciBhdCB0aGUgcGFyYW1ldGVyIFxhIHQgaW4gWzA7MV0uCisgICogCisgICogVGhpcyByZXByZXNlbnRzIGFuIGludGVycG9sYXRpb24gZm9yIGEgY29uc3RhbnQgbW90aW9uIGJldHdlZW4gXGMgKnRoaXMgYW5kIFxhIG90aGVyLAorICAqIHNlZSBhbHNvIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2xlcnAuCisgICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlIDxjbGFzcyBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBRdWF0ZXJuaW9uPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4KK1F1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpzbGVycChjb25zdCBTY2FsYXImIHQsIGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBFSUdFTl9VU0lOR19TVERfTUFUSChhY29zKQorICBFSUdFTl9VU0lOR19TVERfTUFUSChzaW4pCisgIGNvbnN0IFNjYWxhciBvbmUgPSBTY2FsYXIoMSkgLSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBTY2FsYXIgZCA9IHRoaXMtPmRvdChvdGhlcik7CisgIFNjYWxhciBhYnNEID0gbnVtZXh0OjphYnMoZCk7CisKKyAgU2NhbGFyIHNjYWxlMDsKKyAgU2NhbGFyIHNjYWxlMTsKKworICBpZihhYnNEPj1vbmUpCisgIHsKKyAgICBzY2FsZTAgPSBTY2FsYXIoMSkgLSB0OworICAgIHNjYWxlMSA9IHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gdGhldGEgaXMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIDIgcXVhdGVybmlvbnMKKyAgICBTY2FsYXIgdGhldGEgPSBhY29zKGFic0QpOworICAgIFNjYWxhciBzaW5UaGV0YSA9IHNpbih0aGV0YSk7CisKKyAgICBzY2FsZTAgPSBzaW4oICggU2NhbGFyKDEpIC0gdCApICogdGhldGEpIC8gc2luVGhldGE7CisgICAgc2NhbGUxID0gc2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOworICB9CisgIGlmKGQ8U2NhbGFyKDApKSBzY2FsZTEgPSAtc2NhbGUxOworCisgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oc2NhbGUwICogY29lZmZzKCkgKyBzY2FsZTEgKiBvdGhlci5jb2VmZnMoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHNldCBmcm9tIGEgcm90YXRpb24gbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KK3N0cnVjdCBxdWF0ZXJuaW9uYmFzZV9hc3NpZ25faW1wbDxPdGhlciwzLDM+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgT3RoZXI6OlNjYWxhciBTY2FsYXI7CisgIHRlbXBsYXRlPGNsYXNzIERlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIHEsIGNvbnN0IE90aGVyJiBhX21hdCkKKyAgeworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxPdGhlciwyPjo6dHlwZSBtYXQoYV9tYXQpOworICAgIEVJR0VOX1VTSU5HX1NURF9NQVRIKHNxcnQpCisgICAgLy8gVGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSAgIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uIiwKKyAgICAvLyBLZW4gU2hvZW1ha2UsIDE5ODcgU0lHR1JBUEggY291cnNlIG5vdGVzCisgICAgU2NhbGFyIHQgPSBtYXQudHJhY2UoKTsKKyAgICBpZiAodCA+IFNjYWxhcigwKSkKKyAgICB7CisgICAgICB0ID0gc3FydCh0ICsgU2NhbGFyKDEuMCkpOworICAgICAgcS53KCkgPSBTY2FsYXIoMC41KSp0OworICAgICAgdCA9IFNjYWxhcigwLjUpL3Q7CisgICAgICBxLngoKSA9IChtYXQuY29lZmYoMiwxKSAtIG1hdC5jb2VmZigxLDIpKSAqIHQ7CisgICAgICBxLnkoKSA9IChtYXQuY29lZmYoMCwyKSAtIG1hdC5jb2VmZigyLDApKSAqIHQ7CisgICAgICBxLnooKSA9IChtYXQuY29lZmYoMSwwKSAtIG1hdC5jb2VmZigwLDEpKSAqIHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBJbmRleCBpID0gMDsKKyAgICAgIGlmIChtYXQuY29lZmYoMSwxKSA+IG1hdC5jb2VmZigwLDApKQorICAgICAgICBpID0gMTsKKyAgICAgIGlmIChtYXQuY29lZmYoMiwyKSA+IG1hdC5jb2VmZihpLGkpKQorICAgICAgICBpID0gMjsKKyAgICAgIEluZGV4IGogPSAoaSsxKSUzOworICAgICAgSW5kZXggayA9IChqKzEpJTM7CisKKyAgICAgIHQgPSBzcXJ0KG1hdC5jb2VmZihpLGkpLW1hdC5jb2VmZihqLGopLW1hdC5jb2VmZihrLGspICsgU2NhbGFyKDEuMCkpOworICAgICAgcS5jb2VmZnMoKS5jb2VmZlJlZihpKSA9IFNjYWxhcigwLjUpICogdDsKKyAgICAgIHQgPSBTY2FsYXIoMC41KS90OworICAgICAgcS53KCkgPSAobWF0LmNvZWZmKGssaiktbWF0LmNvZWZmKGosaykpKnQ7CisgICAgICBxLmNvZWZmcygpLmNvZWZmUmVmKGopID0gKG1hdC5jb2VmZihqLGkpK21hdC5jb2VmZihpLGopKSp0OworICAgICAgcS5jb2VmZnMoKS5jb2VmZlJlZihrKSA9IChtYXQuY29lZmYoayxpKSttYXQuY29lZmYoaSxrKSkqdDsKKyAgICB9CisgIH0KK307CisKKy8vIHNldCBmcm9tIGEgdmVjdG9yIG9mIGNvZWZmaWNpZW50cyBhc3N1bWVkIHRvIGJlIGEgcXVhdGVybmlvbgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CitzdHJ1Y3QgcXVhdGVybmlvbmJhc2VfYXNzaWduX2ltcGw8T3RoZXIsNCwxPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyOjpTY2FsYXIgU2NhbGFyOworICB0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+JiBxLCBjb25zdCBPdGhlciYgdmVjKQorICB7CisgICAgcS5jb2VmZnMoKSA9IHZlYzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUVVBVEVSTklPTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvUm90YXRpb24yRC5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1JvdGF0aW9uMkQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRiN2QwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1JvdGF0aW9uMkQuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JPVEFUSU9OMkRfSAorI2RlZmluZSBFSUdFTl9ST1RBVElPTjJEX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIFJvdGF0aW9uMkQKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgcm90YXRpb24vb3JpZW50YXRpb24gaW4gYSAyIGRpbWVuc2lvbmFsIHNwYWNlLgorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIHNjYWxhciByZXByZXNlbnRpbmcgYSBjb3VudGVyIGNsb2NrIHdpc2Ugcm90YXRpb24KKyAgKiBhcyBhIHNpbmdsZSBhbmdsZSBpbiByYWRpYW4uIEl0IHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBhdXRvbWF0aWMKKyAgKiBjb252ZXJzaW9uIGZyb20vdG8gYSAyeDIgcm90YXRpb24gbWF0cml4LiBNb3Jlb3ZlciB0aGlzIGNsYXNzIGFpbXMgdG8gcHJvdmlkZSBhIHNpbWlsYXIKKyAgKiBpbnRlcmZhY2UgdG8gUXVhdGVybmlvbiBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHRoZSB3cml0aW5nIG9mIGdlbmVyaWMgYWxnb3JpdGhtcworICAqIGRlYWxpbmcgd2l0aCByb3RhdGlvbnMuCisgICoKKyAgKiBcc2EgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgVHJhbnNmb3JtCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IHN0cnVjdCB0cmFpdHM8Um90YXRpb24yRDxfU2NhbGFyPiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBSb3RhdGlvbjJEIDogcHVibGljIFJvdGF0aW9uQmFzZTxSb3RhdGlvbjJEPF9TY2FsYXI+LDI+Cit7CisgIHR5cGVkZWYgUm90YXRpb25CYXNlPFJvdGF0aW9uMkQ8X1NjYWxhcj4sMj4gQmFzZTsKKworcHVibGljOgorCisgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKworICBlbnVtIHsgRGltID0gMiB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMj4gTWF0cml4MjsKKworcHJvdGVjdGVkOgorCisgIFNjYWxhciBtX2FuZ2xlOworCitwdWJsaWM6CisKKyAgLyoqIENvbnN0cnVjdCBhIDJEIGNvdW50ZXIgY2xvY2sgd2lzZSByb3RhdGlvbiBmcm9tIHRoZSBhbmdsZSBcYSBhIGluIHJhZGlhbi4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgaW5saW5lIFJvdGF0aW9uMkQoY29uc3QgU2NhbGFyJiBhKSA6IG1fYW5nbGUoYSkge30KKyAgCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpaHRvdXQgaW5pdGlhbGl6YXRpb24uIFRoZSByZXByZXNlbnRlZCByb3RhdGlvbiBpcyB1bmRlZmluZWQuICovCisgIEVJR0VOX0RFVklDRV9GVU5DIFJvdGF0aW9uMkQoKSB7fQorCisgIC8qKiBDb25zdHJ1Y3QgYSAyRCByb3RhdGlvbiBmcm9tIGEgMngyIHJvdGF0aW9uIG1hdHJpeCBcYSBtYXQuCisgICAgKgorICAgICogXHNhIGZyb21Sb3RhdGlvbk1hdHJpeCgpCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgUm90YXRpb24yRChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgZnJvbVJvdGF0aW9uTWF0cml4KG0uZGVyaXZlZCgpKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgcm90YXRpb24gYW5nbGUgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBhbmdsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5nbGU7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLXdyaXRlIHJlZmVyZW5jZSB0byB0aGUgcm90YXRpb24gYW5nbGUgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciYgYW5nbGUoKSB7IHJldHVybiBtX2FuZ2xlOyB9CisgIAorICAvKiogXHJldHVybnMgdGhlIHJvdGF0aW9uIGFuZ2xlIGluIFswLDJwaV0gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBzbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSBjb25zdCB7CisgICAgU2NhbGFyIHRtcCA9IG51bWV4dDo6Zm1vZChtX2FuZ2xlLFNjYWxhcigyKkVJR0VOX1BJKSk7CisgICAgcmV0dXJuIHRtcDxTY2FsYXIoMCkgPyB0bXAgKyBTY2FsYXIoMipFSUdFTl9QSSkgOiB0bXA7CisgIH0KKyAgCisgIC8qKiBccmV0dXJucyB0aGUgcm90YXRpb24gYW5nbGUgaW4gWy1waSxwaV0gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBzbWFsbGVzdEFuZ2xlKCkgY29uc3QgeworICAgIFNjYWxhciB0bXAgPSBudW1leHQ6OmZtb2QobV9hbmdsZSxTY2FsYXIoMipFSUdFTl9QSSkpOworICAgIGlmKHRtcD5TY2FsYXIoRUlHRU5fUEkpKSAgICAgICB0bXAgLT0gU2NhbGFyKDIqRUlHRU5fUEkpOworICAgIGVsc2UgaWYodG1wPC1TY2FsYXIoRUlHRU5fUEkpKSB0bXAgKz0gU2NhbGFyKDIqRUlHRU5fUEkpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFJvdGF0aW9uMkQgaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIFJvdGF0aW9uMkQoLW1fYW5nbGUpOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSb3RhdGlvbjJEIG9wZXJhdG9yKihjb25zdCBSb3RhdGlvbjJEJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gUm90YXRpb24yRChtX2FuZ2xlICsgb3RoZXIubV9hbmdsZSk7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byByb3RhdGlvbnMgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFJvdGF0aW9uMkQmIG9wZXJhdG9yKj0oY29uc3QgUm90YXRpb24yRCYgb3RoZXIpCisgIHsgbV9hbmdsZSArPSBvdGhlci5tX2FuZ2xlOyByZXR1cm4gKnRoaXM7IH0KKworICAvKiogQXBwbGllcyB0aGUgcm90YXRpb24gdG8gYSAyRCB2ZWN0b3IgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVmVjdG9yMiBvcGVyYXRvciogKGNvbnN0IFZlY3RvcjImIHZlYykgY29uc3QKKyAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogdmVjOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBSb3RhdGlvbjJEJiBmcm9tUm90YXRpb25NYXRyaXgoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSk7CisgIEVJR0VOX0RFVklDRV9GVU5DIE1hdHJpeDIgdG9Sb3RhdGlvbk1hdHJpeCgpIGNvbnN0OworCisgIC8qKiBTZXQgXGMgKnRoaXMgZnJvbSBhIDJ4MiByb3RhdGlvbiBtYXRyaXggXGEgbWF0LgorICAgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gZXh0cmFjdCB0aGUgcm90YXRpb24gYW5nbGUgZnJvbSB0aGUgcm90YXRpb24gbWF0cml4LgorICAgICoKKyAgICAqIFRoaXMgbWV0aG9kIGlzIGFuIGFsaWFzIGZvciBmcm9tUm90YXRpb25NYXRyaXgoKQorICAgICoKKyAgICAqIFxzYSBmcm9tUm90YXRpb25NYXRyaXgoKQorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIFJvdGF0aW9uMkQmIG9wZXJhdG9yPShjb25zdCAgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKKyAgeyByZXR1cm4gZnJvbVJvdGF0aW9uTWF0cml4KG0uZGVyaXZlZCgpKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgc3BoZXJpY2FsIGludGVycG9sYXRpb24gYmV0d2VlbiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgdXNpbmcKKyAgICAqIHBhcmFtZXRlciBcYSB0LiBJdCBpcyBpbiBmYWN0IGVxdWl2YWxlbnQgdG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUm90YXRpb24yRCBzbGVycChjb25zdCBTY2FsYXImIHQsIGNvbnN0IFJvdGF0aW9uMkQmIG90aGVyKSBjb25zdAorICB7CisgICAgU2NhbGFyIGRpc3QgPSBSb3RhdGlvbjJEKG90aGVyLm1fYW5nbGUtbV9hbmdsZSkuc21hbGxlc3RBbmdsZSgpOworICAgIHJldHVybiBSb3RhdGlvbjJEKG1fYW5nbGUgKyBkaXN0KnQpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8Um90YXRpb24yRCxSb3RhdGlvbjJEPE5ld1NjYWxhclR5cGU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFJvdGF0aW9uMkQsUm90YXRpb24yRDxOZXdTY2FsYXJUeXBlPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBleHBsaWNpdCBSb3RhdGlvbjJEKGNvbnN0IFJvdGF0aW9uMkQ8T3RoZXJTY2FsYXJUeXBlPiYgb3RoZXIpCisgIHsKKyAgICBtX2FuZ2xlID0gU2NhbGFyKG90aGVyLmFuZ2xlKCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBSb3RhdGlvbjJEIElkZW50aXR5KCkgeyByZXR1cm4gUm90YXRpb24yRCgwKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBpc0FwcHJveChjb25zdCBSb3RhdGlvbjJEJiBvdGhlciwgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChtX2FuZ2xlLG90aGVyLm1fYW5nbGUsIHByZWMpOyB9CisgIAorfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIHNpbmdsZSBwcmVjaXNpb24gMkQgcm90YXRpb24gdHlwZSAqLwordHlwZWRlZiBSb3RhdGlvbjJEPGZsb2F0PiBSb3RhdGlvbjJEZjsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBkb3VibGUgcHJlY2lzaW9uIDJEIHJvdGF0aW9uIHR5cGUgKi8KK3R5cGVkZWYgUm90YXRpb24yRDxkb3VibGU+IFJvdGF0aW9uMkRkOworCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSAyeDIgcm90YXRpb24gbWF0cml4IFxhIG1hdC4KKyAgKiBJbiBvdGhlciB3b3JkcywgdGhpcyBmdW5jdGlvbiBleHRyYWN0IHRoZSByb3RhdGlvbiBhbmdsZQorICAqIGZyb20gdGhlIHJvdGF0aW9uIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBSb3RhdGlvbjJEPFNjYWxhcj4mIFJvdGF0aW9uMkQ8U2NhbGFyPjo6ZnJvbVJvdGF0aW9uTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdCkKK3sKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoYXRhbjIpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTIgJiYgRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU9PTIsWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBtX2FuZ2xlID0gYXRhbjIobWF0LmNvZWZmKDEsMCksIG1hdC5jb2VmZigwLDApKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQ29uc3RydWN0cyBhbmQgXHJldHVybnMgYW4gZXF1aXZhbGVudCAyeDIgcm90YXRpb24gbWF0cml4LgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordHlwZW5hbWUgUm90YXRpb24yRDxTY2FsYXI+OjpNYXRyaXgyCitFSUdFTl9ERVZJQ0VfRlVOQyBSb3RhdGlvbjJEPFNjYWxhcj46OnRvUm90YXRpb25NYXRyaXgodm9pZCkgY29uc3QKK3sKKyAgRUlHRU5fVVNJTkdfU1REX01BVEgoc2luKQorICBFSUdFTl9VU0lOR19TVERfTUFUSChjb3MpCisgIFNjYWxhciBzaW5BID0gc2luKG1fYW5nbGUpOworICBTY2FsYXIgY29zQSA9IGNvcyhtX2FuZ2xlKTsKKyAgcmV0dXJuIChNYXRyaXgyKCkgPDwgY29zQSwgLXNpbkEsIHNpbkEsIGNvc0EpLmZpbmlzaGVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUk9UQVRJT04yRF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvUm90YXRpb25CYXNlLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvUm90YXRpb25CYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZTBiZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Sb3RhdGlvbkJhc2UuaApAQCAtMCwwICsxLDIwNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JPVEFUSU9OQkFTRV9ICisjZGVmaW5lIEVJR0VOX1JPVEFUSU9OQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25EZXJpdmVkLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBib29sIElzVmVjdG9yPU1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZT4KK3N0cnVjdCByb3RhdGlvbl9iYXNlX2dlbmVyaWNfcHJvZHVjdF9zZWxlY3RvcjsKK30KKworLyoqIFxjbGFzcyBSb3RhdGlvbkJhc2UKKyAgKgorICAqIFxicmllZiBDb21tb24gYmFzZSBjbGFzcyBmb3IgY29tcGFjdCByb3RhdGlvbiByZXByZXNlbnRhdGlvbnMKKyAgKgorICAqIFx0cGFyYW0gRGVyaXZlZCBpcyB0aGUgZGVyaXZlZCB0eXBlLCBpLmUuLCBhIHJvdGF0aW9uIHR5cGUKKyAgKiBcdHBhcmFtIF9EaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGludCBfRGltPgorY2xhc3MgUm90YXRpb25CYXNlCit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgRGltID0gX0RpbSB9OworICAgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKworICAgIC8qKiBjb3JyZXNwb25kaW5nIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdHlwZSAqLworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBSb3RhdGlvbk1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSwxPiBWZWN0b3JUeXBlOworCisgIHB1YmxpYzoKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSb3RhdGlvbk1hdHJpeFR5cGUgdG9Sb3RhdGlvbk1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS50b1JvdGF0aW9uTWF0cml4KCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCAKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBiZSBjb25mb3JtIHdpdGggdGhlIFRyYW5zZm9ybSBjbGFzcycgbmFtaW5nIHNjaGVtZS4KKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFJvdGF0aW9uTWF0cml4VHlwZSBtYXRyaXgoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkudG9Sb3RhdGlvbk1hdHJpeCgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgRGVyaXZlZCBpbnZlcnNlKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmludmVyc2UoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgdHJhbnNsYXRpb24gXGEgdCAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxJc29tZXRyeT4gb3BlcmF0b3IqKGNvbnN0IFRyYW5zbGF0aW9uPFNjYWxhcixEaW0+JiB0KSBjb25zdAorICAgIHsgcmV0dXJuIFRyYW5zZm9ybTxTY2FsYXIsRGltLElzb21ldHJ5PigqdGhpcykgKiB0OyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHJvdGF0aW9uIFxjICp0aGlzIHdpdGggYSB1bmlmb3JtIHNjYWxpbmcgXGEgcyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBSb3RhdGlvbk1hdHJpeFR5cGUgb3BlcmF0b3IqKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogcy5mYWN0b3IoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgZ2VuZXJpYyBleHByZXNzaW9uIFxhIGUKKyAgICAgICogXGEgZSBjYW4gYmU6CisgICAgICAqICAtIGEgRGlteERpbSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgICAqICAtIGEgRGlteERpbSBkaWFnb25hbCBtYXRyaXggKGF4aXMgYWxpZ25lZCBzY2FsaW5nKQorICAgICAgKiAgLSBhIHZlY3RvciBvZiBzaXplIERpbQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6cm90YXRpb25fYmFzZV9nZW5lcmljX3Byb2R1Y3Rfc2VsZWN0b3I8RGVyaXZlZCxPdGhlckRlcml2ZWQsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU+OjpSZXR1cm5UeXBlCisgICAgb3BlcmF0b3IqKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBlKSBjb25zdAorICAgIHsgcmV0dXJuIGludGVybmFsOjpyb3RhdGlvbl9iYXNlX2dlbmVyaWNfcHJvZHVjdF9zZWxlY3RvcjxEZXJpdmVkLE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIGUuZGVyaXZlZCgpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uIFxhIGwgd2l0aCB0aGUgcm90YXRpb24gXGEgciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFJvdGF0aW9uTWF0cml4VHlwZSBvcGVyYXRvciooY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIGwsIGNvbnN0IERlcml2ZWQmIHIpCisgICAgeyByZXR1cm4gbC5kZXJpdmVkKCkgKiByLnRvUm90YXRpb25NYXRyaXgoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgc2NhbGluZyBcYSBsIHdpdGggdGhlIHJvdGF0aW9uIFxhIHIgKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBmcmllbmQgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gb3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0+JiBsLCBjb25zdCBEZXJpdmVkJiByKQorICAgIHsgCisgICAgICBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmU+IHJlcyhyKTsKKyAgICAgIHJlcy5saW5lYXIoKS5hcHBseU9uVGhlTGVmdChsKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgdHJhbnNmb3JtYXRpb24gXGEgdCAqLworICAgIHRlbXBsYXRlPGludCBNb2RlLCBpbnQgT3B0aW9ucz4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZT4gb3BlcmF0b3IqKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIHQpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogdDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJWZWN0b3JUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBWZWN0b3JUeXBlIF90cmFuc2Zvcm1WZWN0b3IoY29uc3QgT3RoZXJWZWN0b3JUeXBlJiB2KSBjb25zdAorICAgIHsgcmV0dXJuIHRvUm90YXRpb25NYXRyaXgoKSAqIHY7IH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnZW5lcmljIHByb2R1Y3Qgcm90YXRpb24gKiBtYXRyaXgKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCByb3RhdGlvbl9iYXNlX2dlbmVyaWNfcHJvZHVjdF9zZWxlY3RvcjxSb3RhdGlvbkRlcml2ZWQsTWF0cml4VHlwZSxmYWxzZT4KK3sKKyAgZW51bSB7IERpbSA9IFJvdGF0aW9uRGVyaXZlZDo6RGltIH07CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZDo6U2NhbGFyLERpbSxEaW0+IFJldHVyblR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgUmV0dXJuVHlwZSBydW4oY29uc3QgUm90YXRpb25EZXJpdmVkJiByLCBjb25zdCBNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiByLnRvUm90YXRpb25NYXRyaXgoKSAqIG07IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTWF4RGltPgorc3RydWN0IHJvdGF0aW9uX2Jhc2VfZ2VuZXJpY19wcm9kdWN0X3NlbGVjdG9yPCBSb3RhdGlvbkRlcml2ZWQsIERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0sTWF4RGltPiwgZmFsc2UgPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gUmV0dXJuVHlwZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBSZXR1cm5UeXBlIHJ1bihjb25zdCBSb3RhdGlvbkRlcml2ZWQmIHIsIGNvbnN0IERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0sTWF4RGltPiYgbSkKKyAgeworICAgIFJldHVyblR5cGUgcmVzKHIpOworICAgIHJlcy5saW5lYXIoKSAqPSBtOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCx0eXBlbmFtZSBPdGhlclZlY3RvclR5cGU+CitzdHJ1Y3Qgcm90YXRpb25fYmFzZV9nZW5lcmljX3Byb2R1Y3Rfc2VsZWN0b3I8Um90YXRpb25EZXJpdmVkLE90aGVyVmVjdG9yVHlwZSx0cnVlPgoreworICBlbnVtIHsgRGltID0gUm90YXRpb25EZXJpdmVkOjpEaW0gfTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgUm90YXRpb25EZXJpdmVkOjpTY2FsYXIsRGltLDE+IFJldHVyblR5cGU7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJldHVyblR5cGUgcnVuKGNvbnN0IFJvdGF0aW9uRGVyaXZlZCYgciwgY29uc3QgT3RoZXJWZWN0b3JUeXBlJiB2KQorICB7CisgICAgcmV0dXJuIHIuX3RyYW5zZm9ybVZlY3Rvcih2KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQ29uc3RydWN0cyBhIERpbSB4IERpbSByb3RhdGlvbiBtYXRyaXggZnJvbSB0aGUgcm90YXRpb24gXGEgcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3RvcmFnZSwgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfU3RvcmFnZSwgX01heFJvd3MsIF9NYXhDb2xzPgorOjpNYXRyaXgoY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoTWF0cml4LGludChPdGhlckRlcml2ZWQ6OkRpbSksaW50KE90aGVyRGVyaXZlZDo6RGltKSkKKyAgKnRoaXMgPSByLnRvUm90YXRpb25NYXRyaXgoKTsKK30KKworLyoqIFxnZW9tZXRyeV9tb2R1bGUKKyAgKgorICAqIFxicmllZiBTZXQgYSBEaW0geCBEaW0gcm90YXRpb24gbWF0cml4IGZyb20gdGhlIHJvdGF0aW9uIFxhIHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N0b3JhZ2UsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMgTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX1N0b3JhZ2UsIF9NYXhSb3dzLCBfTWF4Q29scz4mCitNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfU3RvcmFnZSwgX01heFJvd3MsIF9NYXhDb2xzPgorOjpvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoTWF0cml4LGludChPdGhlckRlcml2ZWQ6OkRpbSksaW50KE90aGVyRGVyaXZlZDo6RGltKSkKKyAgcmV0dXJuICp0aGlzID0gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHJvdGF0aW9uIG9iamVjdCB0byBhIHJvdGF0aW9uIG1hdHJpeC4KKyAgKgorICAqIFx0cGFyYW0gU2NhbGFyIHRoZSBudW1lcmljIHR5cGUgb2YgdGhlIG1hdHJpeCBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIERpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBjdXJyZW50IHNwYWNlCisgICoKKyAgKiBJdCByZXR1cm5zIGEgRGltIHggRGltIGZpeGVkIHNpemUgbWF0cml4LgorICAqCisgICogRGVmYXVsdCBzcGVjaWFsaXphdGlvbnMgYXJlIHByb3ZpZGVkIGZvcjoKKyAgKiAgIC0gYW55IHNjYWxhciB0eXBlICgyRCksCisgICogICAtIGFueSBtYXRyaXggZXhwcmVzc2lvbiwKKyAgKiAgIC0gYW55IHR5cGUgYmFzZWQgb24gUm90YXRpb25CYXNlIChlLmcuLCBRdWF0ZXJuaW9uLCBBbmdsZUF4aXMsIFJvdGF0aW9uMkQpCisgICoKKyAgKiBDdXJyZW50bHkgdG9Sb3RhdGlvbk1hdHJpeCBpcyBvbmx5IHVzZWQgYnkgVHJhbnNmb3JtLgorICAqCisgICogXHNhIGNsYXNzIFRyYW5zZm9ybSwgY2xhc3MgUm90YXRpb24yRCwgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgQW5nbGVBeGlzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIE1hdHJpeDxTY2FsYXIsMiwyPiB0b1JvdGF0aW9uTWF0cml4KGNvbnN0IFNjYWxhciYgcykKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEaW09PTIsWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICByZXR1cm4gUm90YXRpb24yRDxTY2FsYXI+KHMpLnRvUm90YXRpb25NYXRyaXgoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIE1hdHJpeDxTY2FsYXIsRGltLERpbT4gdG9Sb3RhdGlvbk1hdHJpeChjb25zdCBSb3RhdGlvbkJhc2U8T3RoZXJEZXJpdmVkLERpbT4mIHIpCit7CisgIHJldHVybiByLnRvUm90YXRpb25NYXRyaXgoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgdG9Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG1hdCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lPT1EaW0gJiYgT3RoZXJEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT09RGltLAorICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgcmV0dXJuIG1hdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUk9UQVRJT05CQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9TY2FsaW5nLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvU2NhbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1OGNhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvU2NhbGluZy5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0NBTElOR19ICisjZGVmaW5lIEVJR0VOX1NDQUxJTkdfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgU2NhbGluZworICAqCisgICogXGJyaWVmIFJlcHJlc2VudHMgYSBnZW5lcmljIHVuaWZvcm0gc2NhbGluZyB0cmFuc2Zvcm1hdGlvbgorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdW5pZm9ybSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uLiBJdCBpcyB0aGUgcmV0dXJuCisgICogdHlwZSBvZiBTY2FsaW5nKFNjYWxhciksIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0CisgICogaXMgdXNlZC4gSW4gcGFydGljdWxhciwgdGhpcyBjbGFzcyBpcyBub3QgYWltZWQgdG8gYmUgdXNlZCB0byBzdG9yZSBhIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24sCisgICogYnV0IHJhdGhlciB0byBtYWtlIGVhc2llciB0aGUgY29uc3RydWN0aW9ucyBhbmQgdXBkYXRlcyBvZiBUcmFuc2Zvcm0gb2JqZWN0cy4KKyAgKgorICAqIFRvIHJlcHJlc2VudCBhbiBheGlzIGFsaWduZWQgc2NhbGluZywgdXNlIHRoZSBEaWFnb25hbE1hdHJpeCBjbGFzcy4KKyAgKgorICAqIFxzYSBTY2FsaW5nKCksIGNsYXNzIERpYWdvbmFsTWF0cml4LCBNYXRyaXhCYXNlOjphc0RpYWdvbmFsKCksIGNsYXNzIFRyYW5zbGF0aW9uLCBjbGFzcyBUcmFuc2Zvcm0KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBVbmlmb3JtU2NhbGluZworeworcHVibGljOgorICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKworcHJvdGVjdGVkOgorCisgIFNjYWxhciBtX2ZhY3RvcjsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIFVuaWZvcm1TY2FsaW5nKCkge30KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgYSB1bmlmb3JtIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gKi8KKyAgZXhwbGljaXQgaW5saW5lIFVuaWZvcm1TY2FsaW5nKGNvbnN0IFNjYWxhciYgcykgOiBtX2ZhY3RvcihzKSB7fQorCisgIGlubGluZSBjb25zdCBTY2FsYXImIGZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZmFjdG9yOyB9CisgIGlubGluZSBTY2FsYXImIGZhY3RvcigpIHsgcmV0dXJuIG1fZmFjdG9yOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gdW5pZm9ybSBzY2FsaW5nICovCisgIGlubGluZSBVbmlmb3JtU2NhbGluZyBvcGVyYXRvciogKGNvbnN0IFVuaWZvcm1TY2FsaW5nJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmcobV9mYWN0b3IgKiBvdGhlci5mYWN0b3IoKSk7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdW5pZm9ybSBzY2FsaW5nIGFuZCBhIHRyYW5zbGF0aW9uICovCisgIHRlbXBsYXRlPGludCBEaW0+CisgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmU+IG9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLERpbT4mIHQpIGNvbnN0OworCisgIC8qKiBDb25jYXRlbmF0ZXMgYSB1bmlmb3JtIHNjYWxpbmcgYW5kIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiAqLworICB0ZW1wbGF0ZTxpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CisgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSwoaW50KE1vZGUpPT1pbnQoSXNvbWV0cnkpP0FmZmluZTpNb2RlKT4gb3BlcmF0b3IqIChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSwgTW9kZSwgT3B0aW9ucz4mIHQpIGNvbnN0CisgIHsKKyAgICBUcmFuc2Zvcm08U2NhbGFyLERpbSwoaW50KE1vZGUpPT1pbnQoSXNvbWV0cnkpP0FmZmluZTpNb2RlKT4gcmVzID0gdDsKKyAgICByZXMucHJlc2NhbGUoZmFjdG9yKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdW5pZm9ybSBzY2FsaW5nIGFuZCBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi8KKyAgLy8gVE9ETyByZXR1cm5zIGFuIGV4cHJlc3Npb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZTxEZXJpdmVkPjo6dHlwZSBvcGVyYXRvciogKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBvdGhlciAqIG1fZmFjdG9yOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCxpbnQgRGltPgorICBpbmxpbmUgTWF0cml4PFNjYWxhcixEaW0sRGltPiBvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKKyAgeyByZXR1cm4gci50b1JvdGF0aW9uTWF0cml4KCkgKiBtX2ZhY3RvcjsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBzY2FsaW5nICovCisgIGlubGluZSBVbmlmb3JtU2NhbGluZyBpbnZlcnNlKCkgY29uc3QKKyAgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmcoU2NhbGFyKDEpL21fZmFjdG9yKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIFVuaWZvcm1TY2FsaW5nPE5ld1NjYWxhclR5cGU+IGNhc3QoKSBjb25zdAorICB7IHJldHVybiBVbmlmb3JtU2NhbGluZzxOZXdTY2FsYXJUeXBlPihOZXdTY2FsYXJUeXBlKG1fZmFjdG9yKSk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBpbmxpbmUgZXhwbGljaXQgVW5pZm9ybVNjYWxpbmcoY29uc3QgVW5pZm9ybVNjYWxpbmc8T3RoZXJTY2FsYXJUeXBlPiYgb3RoZXIpCisgIHsgbV9mYWN0b3IgPSBTY2FsYXIob3RoZXIuZmFjdG9yKCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IFVuaWZvcm1TY2FsaW5nJiBvdGhlciwgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChtX2ZhY3Rvciwgb3RoZXIuZmFjdG9yKCksIHByZWMpOyB9CisKK307CisKKy8qKiBcYWRkdG9ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KKy8vQHsKKworLyoqIENvbmNhdGVuYXRlcyBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYW5kIGEgdW5pZm9ybSBzY2FsaW5nCisgICogXHJlbGF0ZXMgVW5pZm9ybVNjYWxpbmcKKyAgKi8KKy8vIE5PVEUgdGhpcyBvcGVyYXRvciBpcyBkZWZpZW5kIGluIE1hdHJpeEJhc2UgYW5kIG5vdCBhcyBhIGZyaWVuZCBmdW5jdGlvbgorLy8gb2YgVW5pZm9ybVNjYWxpbmcgdG8gZml4IGFuIGludGVybmFsIGNyYXNoIG9mIEludGVsJ3MgSUNDCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKERlcml2ZWQsU2NhbGFyLHByb2R1Y3QpCitvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4LCBjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKQoreyByZXR1cm4gbWF0cml4LmRlcml2ZWQoKSAqIHMuZmFjdG9yKCk7IH0KKworLyoqIENvbnN0cnVjdHMgYSB1bmlmb3JtIHNjYWxpbmcgZnJvbSBzY2FsZSBmYWN0b3IgXGEgcyAqLworaW5saW5lIFVuaWZvcm1TY2FsaW5nPGZsb2F0PiBTY2FsaW5nKGZsb2F0IHMpIHsgcmV0dXJuIFVuaWZvcm1TY2FsaW5nPGZsb2F0PihzKTsgfQorLyoqIENvbnN0cnVjdHMgYSB1bmlmb3JtIHNjYWxpbmcgZnJvbSBzY2FsZSBmYWN0b3IgXGEgcyAqLworaW5saW5lIFVuaWZvcm1TY2FsaW5nPGRvdWJsZT4gU2NhbGluZyhkb3VibGUgcykgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmc8ZG91YmxlPihzKTsgfQorLyoqIENvbnN0cnVjdHMgYSB1bmlmb3JtIHNjYWxpbmcgZnJvbSBzY2FsZSBmYWN0b3IgXGEgcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4KK2lubGluZSBVbmlmb3JtU2NhbGluZzxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gPiBTY2FsaW5nKGNvbnN0IHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiYgcykKK3sgcmV0dXJuIFVuaWZvcm1TY2FsaW5nPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiA+KHMpOyB9CisKKy8qKiBDb25zdHJ1Y3RzIGEgMkQgYXhpcyBhbGlnbmVkIHNjYWxpbmcgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBEaWFnb25hbE1hdHJpeDxTY2FsYXIsMj4gU2NhbGluZyhjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5KQoreyByZXR1cm4gRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDI+KHN4LCBzeSk7IH0KKy8qKiBDb25zdHJ1Y3RzIGEgM0QgYXhpcyBhbGlnbmVkIHNjYWxpbmcgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBEaWFnb25hbE1hdHJpeDxTY2FsYXIsMz4gU2NhbGluZyhjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5LCBjb25zdCBTY2FsYXImIHN6KQoreyByZXR1cm4gRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDM+KHN4LCBzeSwgc3opOyB9CisKKy8qKiBDb25zdHJ1Y3RzIGFuIGF4aXMgYWxpZ25lZCBzY2FsaW5nIGV4cHJlc3Npb24gZnJvbSB2ZWN0b3IgZXhwcmVzc2lvbiBcYSBjb2VmZnMKKyAgKiBUaGlzIGlzIGFuIGFsaWFzIGZvciBjb2VmZnMuYXNEaWFnb25hbCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IERpYWdvbmFsV3JhcHBlcjxjb25zdCBEZXJpdmVkPiBTY2FsaW5nKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGNvZWZmcykKK3sgcmV0dXJuIGNvZWZmcy5hc0RpYWdvbmFsKCk7IH0KKworLyoqIFxkZXByZWNhdGVkICovCit0eXBlZGVmIERpYWdvbmFsTWF0cml4PGZsb2F0LCAyPiBBbGlnbmVkU2NhbGluZzJmOworLyoqIFxkZXByZWNhdGVkICovCit0eXBlZGVmIERpYWdvbmFsTWF0cml4PGRvdWJsZSwyPiBBbGlnbmVkU2NhbGluZzJkOworLyoqIFxkZXByZWNhdGVkICovCit0eXBlZGVmIERpYWdvbmFsTWF0cml4PGZsb2F0LCAzPiBBbGlnbmVkU2NhbGluZzNmOworLyoqIFxkZXByZWNhdGVkICovCit0eXBlZGVmIERpYWdvbmFsTWF0cml4PGRvdWJsZSwzPiBBbGlnbmVkU2NhbGluZzNkOworLy9AfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTxpbnQgRGltPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4KK1VuaWZvcm1TY2FsaW5nPFNjYWxhcj46Om9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLERpbT4mIHQpIGNvbnN0Cit7CisgIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gcmVzOworICByZXMubWF0cml4KCkuc2V0WmVybygpOworICByZXMubGluZWFyKCkuZGlhZ29uYWwoKS5maWxsKGZhY3RvcigpKTsKKyAgcmVzLnRyYW5zbGF0aW9uKCkgPSBmYWN0b3IoKSAqIHQudmVjdG9yKCk7CisgIHJlcyhEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgcmV0dXJuIHJlczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TQ0FMSU5HX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2Zvcm0uaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2Zvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMxZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1RyYW5zZm9ybS5oCkBAIC0wLDAgKzEsMTU0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUkFOU0ZPUk1fSAorI2RlZmluZSBFSUdFTl9UUkFOU0ZPUk1fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtPgorc3RydWN0IHRyYW5zZm9ybV90cmFpdHMKK3sKKyAgZW51bQorICB7CisgICAgRGltID0gVHJhbnNmb3JtOjpEaW0sCisgICAgSERpbSA9IFRyYW5zZm9ybTo6SERpbSwKKyAgICBNb2RlID0gVHJhbnNmb3JtOjpNb2RlLAorICAgIElzUHJvamVjdGl2ZSA9IChpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKSkKKyAgfTsKK307CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlLAorICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgICAgICAgICAgaW50IENhc2UgPSB0cmFuc2Zvcm1fdHJhaXRzPFRyYW5zZm9ybVR5cGU+OjpJc1Byb2plY3RpdmUgPyAwCisgICAgICAgICAgICAgICAgICAgOiBpbnQoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpID09IGludCh0cmFuc2Zvcm1fdHJhaXRzPFRyYW5zZm9ybVR5cGU+OjpIRGltKSA/IDEKKyAgICAgICAgICAgICAgICAgICA6IDIsCisgICAgICAgICAgaW50IFJoc0NvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCB0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsOworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXIsCisgICAgICAgICAgaW50IE1vZGUsCisgICAgICAgICAgaW50IE9wdGlvbnMsCisgICAgICAgICAgaW50IERpbSwKKyAgICAgICAgICBpbnQgSERpbSwKKyAgICAgICAgICBpbnQgT3RoZXJSb3dzPU90aGVyOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICBpbnQgT3RoZXJDb2xzPU90aGVyOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCB0cmFuc2Zvcm1fbGVmdF9wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBMaHMsCisgICAgICAgICAgdHlwZW5hbWUgUmhzLAorICAgICAgICAgIGJvb2wgQW55UHJvamVjdGl2ZSA9IAorICAgICAgICAgICAgdHJhbnNmb3JtX3RyYWl0czxMaHM+OjpJc1Byb2plY3RpdmUgfHwKKyAgICAgICAgICAgIHRyYW5zZm9ybV90cmFpdHM8UmhzPjo6SXNQcm9qZWN0aXZlPgorc3RydWN0IHRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsOworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXIsCisgICAgICAgICAgaW50IE1vZGUsCisgICAgICAgICAgaW50IE9wdGlvbnMsCisgICAgICAgICAgaW50IERpbSwKKyAgICAgICAgICBpbnQgSERpbSwKKyAgICAgICAgICBpbnQgT3RoZXJSb3dzPU90aGVyOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICBpbnQgT3RoZXJDb2xzPU90aGVyOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPiBzdHJ1Y3QgdHJhbnNmb3JtX3Rha2VfYWZmaW5lX3BhcnQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX01vZGUsIGludCBfT3B0aW9ucz4KK3N0cnVjdCB0cmFpdHM8VHJhbnNmb3JtPF9TY2FsYXIsX0RpbSxfTW9kZSxfT3B0aW9ucz4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIGVudW0geworICAgIERpbTEgPSBfRGltPT1EeW5hbWljID8gX0RpbSA6IF9EaW0gKyAxLAorICAgIFJvd3NBdENvbXBpbGVUaW1lID0gX01vZGU9PVByb2plY3RpdmUgPyBEaW0xIDogX0RpbSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IERpbTEsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gMAorICB9OworfTsKKwordGVtcGxhdGU8aW50IE1vZGU+IHN0cnVjdCB0cmFuc2Zvcm1fbWFrZV9hZmZpbmU7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmFuc2Zvcm0KKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGFuIGhvbW9nZW5lb3VzIHRyYW5zZm9ybWF0aW9uIGluIGEgTiBkaW1lbnNpb25hbCBzcGFjZQorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFx0cGFyYW0gX0RpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZQorICAqIFx0cGFyYW0gX01vZGUgdGhlIHR5cGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLiBDYW4gYmU6CisgICogICAgICAgICAgICAgIC0gI0FmZmluZTogdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN0b3JlZCBhcyBhIChEaW0rMSleMiBtYXRyaXgsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGxhc3Qgcm93IGlzIGFzc3VtZWQgdG8gYmUgWzAgLi4uIDAgMV0uCisgICogICAgICAgICAgICAgIC0gI0FmZmluZUNvbXBhY3Q6IHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBzdG9yZWQgYXMgYSAoRGltKXgoRGltKzEpIG1hdHJpeC4KKyAgKiAgICAgICAgICAgICAgLSAjUHJvamVjdGl2ZTogdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN0b3JlZCBhcyBhIChEaW0rMSleMiBtYXRyaXgKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhbnkgYXNzdW1wdGlvbi4KKyAgKiBcdHBhcmFtIF9PcHRpb25zIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGNsYXNzIE1hdHJpeC4gSXQgYWxsb3dzIHRvIHNwZWNpZnkgRG9udEFsaWduIGFuZC9vciBSb3dNYWpvci4KKyAgKiAgICAgICAgICAgICAgICAgIFRoZXNlIE9wdGlvbnMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBtYXRyaXggdHlwZS4KKyAgKgorICAqIFRoZSBob21vZ3JhcGh5IGlzIGludGVybmFsbHkgcmVwcmVzZW50ZWQgYW5kIHN0b3JlZCBieSBhIG1hdHJpeCB3aGljaAorICAqIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBtYXRyaXgoKSBtZXRob2QuIFRvIHVuZGVyc3RhbmQgdGhlIGJlaGF2aW9yIG9mCisgICogdGhpcyBjbGFzcyB5b3UgaGF2ZSB0byB0aGluayBhIFRyYW5zZm9ybSBvYmplY3QgYXMgaXRzIGludGVybmFsCisgICogbWF0cml4IHJlcHJlc2VudGF0aW9uLiBUaGUgY2hvc2VuIGNvbnZlbnRpb24gaXMgcmlnaHQgbXVsdGlwbHk6CisgICoKKyAgKiBcY29kZSB2JyA9IFQgKiB2IFxlbmRjb2RlCisgICoKKyAgKiBUaGVyZWZvcmUsIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggTSBpcyBzaGFwZWQgbGlrZSB0aGlzOgorICAqCisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjfQorICAqIGxpbmVhciAmIHRyYW5zbGF0aW9uXFwKKyAgKiAwIC4uLiAwICYgMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBOb3RlIHRoYXQgZm9yIGEgcHJvamVjdGl2ZSB0cmFuc2Zvcm1hdGlvbiB0aGUgbGFzdCByb3cgY2FuIGJlIGFueXRoaW5nLAorICAqIGFuZCB0aGVuIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBkaWZmZXJlbnQgcGFydHMgbWlnaHQgYmUgc2lnaHRseSBkaWZmZXJlbnQuCisgICoKKyAgKiBIb3dldmVyLCB1bmxpa2UgYSBwbGFpbiBtYXRyaXgsIHRoZSBUcmFuc2Zvcm0gY2xhc3MgcHJvdmlkZXMgbWFueSBmZWF0dXJlcworICAqIHNpbXBsaWZ5aW5nIGJvdGggaXRzIGFzc2VtYmx5IGFuZCB1c2FnZS4gSW4gcGFydGljdWxhciwgaXQgY2FuIGJlIGNvbXBvc2VkCisgICogd2l0aCBhbnkgb3RoZXIgdHJhbnNmb3JtYXRpb25zIChUcmFuc2Zvcm0sVHJhbnNsYXRpb24sUm90YXRpb25CYXNlLERpYWdvbmFsTWF0cml4KQorICAqIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCB0byB0cmFuc2Zvcm0gaW1wbGljaXQgaG9tb2dlbmVvdXMgdmVjdG9ycy4gQWxsIHRoZXNlCisgICogb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCB2aWEgdGhlIG9wZXJhdG9yKi4gRm9yIHRoZSBjb21wb3NpdGlvbiBvZiB0cmFuc2Zvcm1hdGlvbnMsCisgICogaXRzIHByaW5jaXBsZSBjb25zaXN0cyB0byBmaXJzdCBjb252ZXJ0IHRoZSByaWdodC9sZWZ0IGhhbmQgc2lkZXMgb2YgdGhlIHByb2R1Y3QKKyAgKiB0byBhIGNvbXBhdGlibGUgKERpbSsxKV4yIG1hdHJpeCBhbmQgdGhlbiBwZXJmb3JtIGEgcHVyZSBtYXRyaXggcHJvZHVjdC4KKyAgKiBPZiBjb3Vyc2UsIGludGVybmFsbHksIG9wZXJhdG9yKiB0cmllcyB0byBwZXJmb3JtIHRoZSBtaW5pbWFsIG51bWJlciBvZiBvcGVyYXRpb25zCisgICogYWNjb3JkaW5nIHRvIHRoZSBuYXR1cmUgb2YgZWFjaCB0ZXJtcy4gTGlrZXdpc2UsIHdoZW4gYXBwbHlpbmcgdGhlIHRyYW5zZm9ybQorICAqIHRvIHBvaW50cywgdGhlIGxhdHRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgcHJvbW90ZWQgdG8gaG9tb2dlbmVvdXMgdmVjdG9ycworICAqIGJlZm9yZSBkb2luZyB0aGUgbWF0cml4IHByb2R1Y3QuIFRoZSBjb252ZW50aW9ucyB0byBob21vZ2VuZW91cyByZXByZXNlbnRhdGlvbnMKKyAgKiBhcmUgcGVyZm9ybWVkIGFzIGZvbGxvdzoKKyAgKgorICAqIFxiIFRyYW5zbGF0aW9uIHQgKERpbSl4KDEpOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjY30KKyAgKiBJICYgdCBcXAorICAqIDBcLC4uLlwsMCAmIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqCisgICogXGIgUm90YXRpb24gUiAoRGltKXgoRGltKToKKyAgKiBcZiQgXGxlZnQoIFxiZWdpbnthcnJheX17Y2N9CisgICogUiAmIDBcXAorICAqIDBcLC4uLlwsMCAmIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqPCEtLQorICAqIFxiIExpbmVhciBcYiBNYXRyaXggTCAoRGltKXgoRGltKToKKyAgKiBcZiQgXGxlZnQoIFxiZWdpbnthcnJheX17Y2N9CisgICogTCAmIDBcXAorICAqIDBcLC4uLlwsMCAmIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqCisgICogXGIgQWZmaW5lIFxiIE1hdHJpeCBBIChEaW0peChEaW0rMSk6CisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2N9CisgICogQVxcCisgICogMFwsLi4uXCwwXCwxCisgICogXGVuZHthcnJheX0gXHJpZ2h0KSBcZiQKKyAgKi0tPgorICAqIFxiIFNjYWxpbmcgXGIgRGlhZ29uYWxNYXRyaXggUyAoRGltKXgoRGltKToKKyAgKiBcZiQgXGxlZnQoIFxiZWdpbnthcnJheX17Y2N9CisgICogUyAmIDBcXAorICAqIDBcLC4uLlwsMCAmIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqCisgICogXGIgQ29sdW1uIFxiIHBvaW50IHYgKERpbSl4KDEpOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjfQorICAqIHZcXAorICAqIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqCisgICogXGIgU2V0IFxiIG9mIFxiIGNvbHVtbiBcYiBwb2ludHMgVjEuLi5WbiAoRGltKXgobik6CisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjY30KKyAgKiB2XzEgJiAuLi4gJiB2X25cXAorICAqIDEgJiAuLi4gJiAxCisgICogXGVuZHthcnJheX0gXHJpZ2h0KSBcZiQKKyAgKgorICAqIFRoZSBjb25jYXRlbmF0aW9uIG9mIGEgVHJhbnNmb3JtIG9iamVjdCB3aXRoIGFueSBraW5kIG9mIG90aGVyIHRyYW5zZm9ybWF0aW9uCisgICogYWx3YXlzIHJldHVybnMgYSBUcmFuc2Zvcm0gb2JqZWN0LgorICAqCisgICogQSBsaXR0bGUgZXhjZXB0aW9uIHRvIHRoZSAiYXMgcHVyZSBtYXRyaXggcHJvZHVjdCIgcnVsZSBpcyB0aGUgY2FzZSBvZiB0aGUKKyAgKiB0cmFuc2Zvcm1hdGlvbiBvZiBub24gaG9tb2dlbmVvdXMgdmVjdG9ycyBieSBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24uIEluCisgICogdGhhdCBjYXNlIHRoZSBsYXN0IG1hdHJpeCByb3cgY2FuIGJlIGlnbm9yZWQsIGFuZCB0aGUgcHJvZHVjdCByZXR1cm5zIG5vbgorICAqIGhvbW9nZW5lb3VzIHZlY3RvcnMuCisgICoKKyAgKiBTaW5jZSwgZm9yIGluc3RhbmNlLCBhIERpbSB4IERpbSBtYXRyaXggaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24sCisgICogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRpcmVjdGx5IHRyYW5zZm9ybSBEaW0gdmVjdG9ycyBzdG9yZWQgaW4gYSBEaW0geCBEaW0gbWF0cml4LgorICAqIFRoZSBzb2x1dGlvbiBpcyBlaXRoZXIgdG8gdXNlIGEgRGltIHggRHluYW1pYyBtYXRyaXggb3IgZXhwbGljaXRseSByZXF1ZXN0IGEKKyAgKiB2ZWN0b3IgdHJhbnNmb3JtYXRpb24gYnkgbWFraW5nIHRoZSB2ZWN0b3IgaG9tb2dlbmVvdXM6CisgICogXGNvZGUKKyAgKiBtJyA9IFQgKiBtLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpOworICAqIFxlbmRjb2RlCisgICogTm90ZSB0aGF0IHRoZXJlIGlzIHplcm8gb3ZlcmhlYWQuCisgICoKKyAgKiBDb252ZXJzaW9uIG1ldGhvZHMgZnJvbS90byBRdCdzIFFNYXRyaXggYW5kIFFUcmFuc2Zvcm0gYXJlIGF2YWlsYWJsZSBpZiB0aGUKKyAgKiBwcmVwcm9jZXNzb3IgdG9rZW4gRUlHRU5fUVRfU1VQUE9SVCBpcyBkZWZpbmVkLgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgcGx1Z2luIG1lY2hhbmlzbSBkZXNjcmliZWQgb24gdGhlIHBhZ2UKKyAgKiBccmVmIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucyBieSBkZWZpbmluZyB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBcYyBFSUdFTl9UUkFOU0ZPUk1fUExVR0lOLgorICAqCisgICogXHNhIGNsYXNzIE1hdHJpeCwgY2xhc3MgUXVhdGVybmlvbgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfTW9kZSwgaW50IF9PcHRpb25zPgorY2xhc3MgVHJhbnNmb3JtCit7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfRGltPT1EeW5hbWljID8gRHluYW1pYyA6IChfRGltKzEpKihfRGltKzEpKQorICBlbnVtIHsKKyAgICBNb2RlID0gX01vZGUsCisgICAgT3B0aW9ucyA9IF9PcHRpb25zLAorICAgIERpbSA9IF9EaW0sICAgICAvLy88IHNwYWNlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgdHJhbnNmb3JtYXRpb24gaG9sZHMKKyAgICBIRGltID0gX0RpbSsxLCAgLy8vPCBzaXplIG9mIGEgcmVzcGVjdGl2ZSBob21vZ2VuZW91cyB2ZWN0b3IKKyAgICBSb3dzID0gaW50KE1vZGUpPT0oQWZmaW5lQ29tcGFjdCkgPyBEaW0gOiBIRGltCisgIH07CisgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgRWlnZW46OkluZGV4IEluZGV4OyAvLy88IFxkZXByZWNhdGVkIHNpbmNlIEVpZ2VuIDMuMworICAvKiogdHlwZSBvZiB0aGUgbWF0cml4IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjptYWtlX3Byb3Blcl9tYXRyaXhfdHlwZTxTY2FsYXIsUm93cyxIRGltLE9wdGlvbnM+Ojp0eXBlIE1hdHJpeFR5cGU7CisgIC8qKiBjb25zdGlmaWVkIE1hdHJpeFR5cGUgKi8KKyAgdHlwZWRlZiBjb25zdCBNYXRyaXhUeXBlIENvbnN0TWF0cml4VHlwZTsKKyAgLyoqIHR5cGUgb2YgdGhlIG1hdHJpeCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltLE9wdGlvbnM+IExpbmVhck1hdHJpeFR5cGU7CisgIC8qKiB0eXBlIG9mIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLERpbSxEaW0saW50KE1vZGUpPT0oQWZmaW5lQ29tcGFjdCkgJiYgKE9wdGlvbnMmUm93TWFqb3IpPT0wPiBMaW5lYXJQYXJ0OworICAvKiogdHlwZSBvZiByZWFkIHJlZmVyZW5jZSB0byB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgY29uc3QgQmxvY2s8Q29uc3RNYXRyaXhUeXBlLERpbSxEaW0saW50KE1vZGUpPT0oQWZmaW5lQ29tcGFjdCkgJiYgKE9wdGlvbnMmUm93TWFqb3IpPT0wPiBDb25zdExpbmVhclBhcnQ7CisgIC8qKiB0eXBlIG9mIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBhZmZpbmUgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8aW50KE1vZGUpPT1pbnQoQWZmaW5lQ29tcGFjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRGltLEhEaW0+ID46OnR5cGUgQWZmaW5lUGFydDsKKyAgLyoqIHR5cGUgb2YgcmVhZCByZWZlcmVuY2UgdG8gdGhlIGFmZmluZSBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxpbnQoTW9kZSk9PWludChBZmZpbmVDb21wYWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeFR5cGUmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2s8Y29uc3QgTWF0cml4VHlwZSxEaW0sSERpbT4gPjo6dHlwZSBDb25zdEFmZmluZVBhcnQ7CisgIC8qKiB0eXBlIG9mIGEgdmVjdG9yICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sMT4gVmVjdG9yVHlwZTsKKyAgLyoqIHR5cGUgb2YgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgdHJhbnNsYXRpb24gcGFydCBvZiB0aGUgcm90YXRpb24gKi8KKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLERpbSwxLCEoaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCk+IFRyYW5zbGF0aW9uUGFydDsKKyAgLyoqIHR5cGUgb2YgYSByZWFkIHJlZmVyZW5jZSB0byB0aGUgdHJhbnNsYXRpb24gcGFydCBvZiB0aGUgcm90YXRpb24gKi8KKyAgdHlwZWRlZiBjb25zdCBCbG9jazxDb25zdE1hdHJpeFR5cGUsRGltLDEsIShpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0KT4gQ29uc3RUcmFuc2xhdGlvblBhcnQ7CisgIC8qKiBjb3JyZXNwb25kaW5nIHRyYW5zbGF0aW9uIHR5cGUgKi8KKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPiBUcmFuc2xhdGlvblR5cGU7CisgIAorICAvLyB0aGlzIGludGVybWVkaWF0ZSBlbnVtIGlzIG5lZWRlZCB0byBhdm9pZCBhbiBJQ0Ugd2l0aCBnY2MgMy40IGFuZCA0LjAKKyAgZW51bSB7IFRyYW5zZm9ybVRpbWVEaWFnb25hbE1vZGUgPSAoKE1vZGU9PWludChJc29tZXRyeSkpP0FmZmluZTppbnQoTW9kZSkpIH07CisgIC8qKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHByb2R1Y3QgYmV0d2VlbiBhIGRpYWdvbmFsIG1hdHJpeCBhbmQgYSB0cmFuc2Zvcm0gKi8KKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxUcmFuc2Zvcm1UaW1lRGlhZ29uYWxNb2RlPiBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgTWF0cml4VHlwZSBtX21hdHJpeDsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1lYW5pbmdmdWwgY29lZmZpY2llbnRzLgorICAgICogSWYgTW9kZT09QWZmaW5lLCB0aGVuIHRoZSBsYXN0IHJvdyBpcyBzZXQgdG8gWzAgLi4uIDAgMV0gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybSgpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICBpbnRlcm5hbDo6dHJhbnNmb3JtX21ha2VfYWZmaW5lPChpbnQoTW9kZSk9PUFmZmluZSkgPyBBZmZpbmUgOiBBZmZpbmVDb21wYWN0Pjo6cnVuKG1fbWF0cml4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtJiBvdGhlcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIG1fbWF0cml4ID0gb3RoZXIubV9tYXRyaXg7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICp0aGlzID0gdDsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAqdGhpcyA9IHM7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGV4cGxpY2l0IFRyYW5zZm9ybShjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCwgRGltPiYgcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICp0aGlzID0gcjsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBUcmFuc2Zvcm0mIG90aGVyKQorICB7IG1fbWF0cml4ID0gb3RoZXIubV9tYXRyaXg7IHJldHVybiAqdGhpczsgfQorCisgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYW5zZm9ybV90YWtlX2FmZmluZV9wYXJ0PFRyYW5zZm9ybT4gdGFrZV9hZmZpbmVfcGFydDsKKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGEgRGltXjIgb3IgYSAoRGltKzEpXjIgbWF0cml4LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBleHBsaWNpdCBUcmFuc2Zvcm0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpOworCisgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgaW50ZXJuYWw6OnRyYW5zZm9ybV9jb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXJEZXJpdmVkLE1vZGUsT3B0aW9ucyxEaW0sSERpbT46OnJ1bih0aGlzLCBvdGhlci5kZXJpdmVkKCkpOworICB9CisKKyAgLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgRGltXjIgb3IgKERpbSsxKV4yIG1hdHJpeC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpOworCisgICAgaW50ZXJuYWw6OnRyYW5zZm9ybV9jb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXJEZXJpdmVkLE1vZGUsT3B0aW9ucyxEaW0sSERpbT46OnJ1bih0aGlzLCBvdGhlci5kZXJpdmVkKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgdGVtcGxhdGU8aW50IE90aGVyT3B0aW9ucz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE90aGVyT3B0aW9ucz4mIG90aGVyKQorICB7CisgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgLy8gb25seSB0aGUgb3B0aW9ucyBjaGFuZ2UsIHdlIGNhbiBkaXJlY3RseSBjb3B5IHRoZSBtYXRyaWNlcworICAgIG1fbWF0cml4ID0gb3RoZXIubWF0cml4KCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgT3RoZXJNb2RlLGludCBPdGhlck9wdGlvbnM+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtPFNjYWxhcixEaW0sT3RoZXJNb2RlLE90aGVyT3B0aW9ucz4mIG90aGVyKQorICB7CisgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgLy8gcHJldmVudCBjb252ZXJzaW9ucyBhczoKKyAgICAvLyBBZmZpbmUgfCBBZmZpbmVDb21wYWN0IHwgSXNvbWV0cnkgPSBQcm9qZWN0aXZlCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFSUdFTl9JTVBMSUVTKE90aGVyTW9kZT09aW50KFByb2plY3RpdmUpLCBNb2RlPT1pbnQoUHJvamVjdGl2ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgWU9VX1BFUkZPUk1FRF9BTl9JTlZBTElEX1RSQU5TRk9STUFUSU9OX0NPTlZFUlNJT04pCisKKyAgICAvLyBwcmV2ZW50IGNvbnZlcnNpb25zIGFzOgorICAgIC8vIElzb21ldHJ5ID0gQWZmaW5lIHwgQWZmaW5lQ29tcGFjdAorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhPdGhlck1vZGU9PWludChBZmZpbmUpfHxPdGhlck1vZGU9PWludChBZmZpbmVDb21wYWN0KSwgTW9kZSE9aW50KElzb21ldHJ5KSksCisgICAgICAgICAgICAgICAgICAgICAgICBZT1VfUEVSRk9STUVEX0FOX0lOVkFMSURfVFJBTlNGT1JNQVRJT05fQ09OVkVSU0lPTikKKworICAgIGVudW0geyBNb2RlSXNBZmZpbmVDb21wYWN0ID0gTW9kZSA9PSBpbnQoQWZmaW5lQ29tcGFjdCksCisgICAgICAgICAgIE90aGVyTW9kZUlzQWZmaW5lQ29tcGFjdCA9IE90aGVyTW9kZSA9PSBpbnQoQWZmaW5lQ29tcGFjdCkKKyAgICB9OworCisgICAgaWYoTW9kZUlzQWZmaW5lQ29tcGFjdCA9PSBPdGhlck1vZGVJc0FmZmluZUNvbXBhY3QpCisgICAgeworICAgICAgLy8gV2UgbmVlZCB0aGUgYmxvY2sgZXhwcmVzc2lvbiBiZWNhdXNlIHRoZSBjb2RlIGlzIGNvbXBpbGVkIGZvciBhbGwKKyAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiB0cmFuc2Zvcm1hdGlvbnMgYW5kIHdpbGwgdHJpZ2dlciBhIGNvbXBpbGUgdGltZSBlcnJvcgorICAgICAgLy8gaWYgb25lIHRyaWVzIHRvIGFzc2lnbiB0aGUgbWF0cmljZXMgZGlyZWN0bHkKKyAgICAgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxEaW0rMT4oMCwwKSA9IG90aGVyLm1hdHJpeCgpLnRlbXBsYXRlIGJsb2NrPERpbSxEaW0rMT4oMCwwKTsKKyAgICAgIG1ha2VBZmZpbmUoKTsKKyAgICB9CisgICAgZWxzZSBpZihPdGhlck1vZGVJc0FmZmluZUNvbXBhY3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxPdGhlck1vZGUsT3RoZXJPcHRpb25zPjo6TWF0cml4VHlwZSBPdGhlck1hdHJpeFR5cGU7CisgICAgICBpbnRlcm5hbDo6dHJhbnNmb3JtX2NvbnN0cnVjdF9mcm9tX21hdHJpeDxPdGhlck1hdHJpeFR5cGUsTW9kZSxPcHRpb25zLERpbSxIRGltPjo6cnVuKHRoaXMsIG90aGVyLm1hdHJpeCgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGhlcmUgd2Uga25vdyB0aGF0IE1vZGUgPT0gQWZmaW5lQ29tcGFjdCBhbmQgT3RoZXJNb2RlICE9IEFmZmluZUNvbXBhY3QuCisgICAgICAvLyBpZiBPdGhlck1vZGUgd2VyZSBQcm9qZWN0aXZlLCB0aGUgc3RhdGljIGFzc2VydCBhYm92ZSB3b3VsZCBhbHJlYWR5IGhhdmUgY2F1Z2h0IGl0LgorICAgICAgLy8gU28gdGhlIG9ubHkgcG9zc2liaWxpdHkgaXMgdGhhdCBPdGhlck1vZGUgPT0gQWZmaW5lCisgICAgICBsaW5lYXIoKSA9IG90aGVyLmxpbmVhcigpOworICAgICAgdHJhbnNsYXRpb24oKSA9IG90aGVyLnRyYW5zbGF0aW9uKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIG90aGVyLmV2YWxUbygqdGhpcyk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgIHsKKyAgICBvdGhlci5ldmFsVG8oKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgICNpZmRlZiBFSUdFTl9RVF9TVVBQT1JUCisgIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgUU1hdHJpeCYgb3RoZXIpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUU1hdHJpeCYgb3RoZXIpOworICBpbmxpbmUgUU1hdHJpeCB0b1FNYXRyaXgodm9pZCkgY29uc3Q7CisgIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpOworICBpbmxpbmUgUVRyYW5zZm9ybSB0b1FUcmFuc2Zvcm0odm9pZCkgY29uc3Q7CisgICNlbmRpZgorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIGludChNb2RlKT09aW50KFByb2plY3RpdmUpID8gbV9tYXRyaXguY29scygpIDogKG1fbWF0cml4LmNvbHMoKS0xKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisKKyAgLyoqIHNob3J0Y3V0IGZvciBtX21hdHJpeChyb3csY29sKTsKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcihJbmRleCxJbmRleCkgY29uc3QgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgocm93LGNvbCk7IH0KKyAgLyoqIHNob3J0Y3V0IGZvciBtX21hdHJpeChyb3csY29sKTsKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcihJbmRleCxJbmRleCkgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciYgb3BlcmF0b3IoKSAoSW5kZXggcm93LCBJbmRleCBjb2wpIHsgcmV0dXJuIG1fbWF0cml4KHJvdyxjb2wpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgLyoqIFxyZXR1cm5zIGEgd3JpdGFibGUgZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBNYXRyaXhUeXBlJiBtYXRyaXgoKSB7IHJldHVybiBtX21hdHJpeDsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtb25seSBleHByZXNzaW9uIG9mIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIENvbnN0TGluZWFyUGFydCBsaW5lYXIoKSBjb25zdCB7IHJldHVybiBDb25zdExpbmVhclBhcnQobV9tYXRyaXgsMCwwKTsgfQorICAvKiogXHJldHVybnMgYSB3cml0YWJsZSBleHByZXNzaW9uIG9mIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIExpbmVhclBhcnQgbGluZWFyKCkgeyByZXR1cm4gTGluZWFyUGFydChtX21hdHJpeCwwLDApOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIERpbSB4IEhEaW0gYWZmaW5lIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBDb25zdEFmZmluZVBhcnQgYWZmaW5lKCkgY29uc3QgeyByZXR1cm4gdGFrZV9hZmZpbmVfcGFydDo6cnVuKG1fbWF0cml4KTsgfQorICAvKiogXHJldHVybnMgYSB3cml0YWJsZSBleHByZXNzaW9uIG9mIHRoZSBEaW0geCBIRGltIGFmZmluZSBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQWZmaW5lUGFydCBhZmZpbmUoKSB7IHJldHVybiB0YWtlX2FmZmluZV9wYXJ0OjpydW4obV9tYXRyaXgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIENvbnN0VHJhbnNsYXRpb25QYXJ0IHRyYW5zbGF0aW9uKCkgY29uc3QgeyByZXR1cm4gQ29uc3RUcmFuc2xhdGlvblBhcnQobV9tYXRyaXgsMCxEaW0pOyB9CisgIC8qKiBccmV0dXJucyBhIHdyaXRhYmxlIGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zbGF0aW9uUGFydCB0cmFuc2xhdGlvbigpIHsgcmV0dXJuIFRyYW5zbGF0aW9uUGFydChtX21hdHJpeCwwLERpbSk7IH0KKworICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgcHJvZHVjdCBiZXR3ZWVuIHRoZSB0cmFuc2Zvcm0gXGMgKnRoaXMgYW5kIGEgbWF0cml4IGV4cHJlc3Npb24gXGEgb3RoZXIuCisgICAgKgorICAgICogVGhlIHJpZ2h0LWhhbmQtc2lkZSBcYSBvdGhlciBjYW4gYmUgZWl0aGVyOgorICAgICogXGxpIGFuIGhvbW9nZW5lb3VzIHZlY3RvciBvZiBzaXplIERpbSsxLAorICAgICogXGxpIGEgc2V0IG9mIGhvbW9nZW5lb3VzIHZlY3RvcnMgb2Ygc2l6ZSBEaW0rMSB4IE4sCisgICAgKiBcbGkgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2Ygc2l6ZSBEaW0rMSB4IERpbSsxLgorICAgICoKKyAgICAqIE1vcmVvdmVyLCBpZiBcYyAqdGhpcyByZXByZXNlbnRzIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiAoaS5lLiwgTW9kZSE9UHJvamVjdGl2ZSksIHRoZW4gXGEgb3RoZXIgY2FuIGFsc28gYmU6CisgICAgKiBcbGkgYSBwb2ludCBvZiBzaXplIERpbSAoY29tcHV0ZXM6IFxjb2RlIHRoaXMtPmxpbmVhcigpICogb3RoZXIgKyB0aGlzLT50cmFuc2xhdGlvbigpXGVuZGNvZGUpLAorICAgICogXGxpIGEgc2V0IG9mIE4gcG9pbnRzIGFzIGEgRGltIHggTiBtYXRyaXggKGNvbXB1dGVzOiBcY29kZSAodGhpcy0+bGluZWFyKCkgKiBvdGhlcikuY29sd2lzZSgpICsgdGhpcy0+dHJhbnNsYXRpb24oKVxlbmRjb2RlKSwKKyAgICAqCisgICAgKiBJbiBhbGwgY2FzZXMsIHRoZSByZXR1cm4gdHlwZSBpcyBhIG1hdHJpeCBvciB2ZWN0b3Igb2Ygc2FtZSBzaXplcyBhcyB0aGUgcmlnaHQtaGFuZC1zaWRlIFxhIG90aGVyLgorICAgICoKKyAgICAqIElmIHlvdSB3YW50IHRvIGludGVycHJldCBcYSBvdGhlciBhcyBhIGxpbmVhciBvciBhZmZpbmUgdHJhbnNmb3JtYXRpb24sIHRoZW4gZmlyc3QgY29udmVydCBpdCB0byBhIFRyYW5zZm9ybTw+IHR5cGUsCisgICAgKiBvciBkbyB5b3VyIG93biBjb29raW5nLgorICAgICoKKyAgICAqIEZpbmFsbHksIGlmIHlvdSB3YW50IHRvIGFwcGx5IEFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgdG8gdmVjdG9ycywgdGhlbiBleHBsaWNpdGx5IGFwcGx5IHRoZSBsaW5lYXIgcGFydCBvbmx5OgorICAgICogXGNvZGUKKyAgICAqIEFmZmluZTNmIEE7CisgICAgKiBWZWN0b3IzZiB2MSwgdjI7CisgICAgKiB2MiA9IEEubGluZWFyKCkgKiB2MTsKKyAgICAqIFxlbmRjb2RlCisgICAgKgorICAgICovCisgIC8vIG5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY2Fubm90IGZpbmQgdGhlIHJlc3BlY3RpdmUgZGVjbGFyYXRpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjp0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsPFRyYW5zZm9ybSwgT3RoZXJEZXJpdmVkPjo6UmVzdWx0VHlwZQorICBvcGVyYXRvciAqIChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjp0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsPFRyYW5zZm9ybSwgT3RoZXJEZXJpdmVkPjo6cnVuKCp0aGlzLG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAvKiogXHJldHVybnMgdGhlIHByb2R1Y3QgZXhwcmVzc2lvbiBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBcYSBhIHRpbWVzIGEgdHJhbnNmb3JtIFxhIGIKKyAgICAqCisgICAgKiBUaGUgbGVmdCBoYW5kIHNpZGUgXGEgb3RoZXIgY2FuIGJlIGVpdGhlcjoKKyAgICAqIFxsaSBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2Ygc2l6ZSBEaW0geCBEaW0sCisgICAgKiBcbGkgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiBzaXplIERpbSB4IERpbSsxLAorICAgICogXGxpIGEgZ2VuZXJhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2Ygc2l6ZSBEaW0rMSB4IERpbSsxLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhbnNmb3JtX2xlZnRfcHJvZHVjdF9pbXBsPE90aGVyRGVyaXZlZCxNb2RlLE9wdGlvbnMsX0RpbSxfRGltKzE+OjpSZXN1bHRUeXBlCisgICAgb3BlcmF0b3IgKiAoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJmEsIGNvbnN0IFRyYW5zZm9ybSAmYikKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlckRlcml2ZWQsTW9kZSxPcHRpb25zLERpbSxIRGltPjo6cnVuKGEuZGVyaXZlZCgpLGIpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFRoZSBwcm9kdWN0IGV4cHJlc3Npb24gb2YgYSB0cmFuc2Zvcm0gXGEgYSB0aW1lcyBhIGRpYWdvbmFsIG1hdHJpeCBcYSBiCisgICAgKgorICAgICogVGhlIHJocyBkaWFnb25hbCBtYXRyaXggaXMgaW50ZXJwcmV0ZWQgYXMgYW4gYWZmaW5lIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24uIFRoZQorICAgICogcHJvZHVjdCByZXN1bHRzIGluIGEgVHJhbnNmb3JtIG9mIHRoZSBzYW1lIHR5cGUgKG1vZGUpIGFzIHRoZSBsaHMgb25seSBpZiB0aGUgbGhzIAorICAgICogbW9kZSBpcyBubyBpc29tZXRyeS4gSW4gdGhhdCBjYXNlLCB0aGUgcmV0dXJuZWQgdHJhbnNmb3JtIGlzIGFuIGFmZmluaXR5LgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpYWdvbmFsRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFRyYW5zZm9ybVRpbWVEaWFnb25hbFJldHVyblR5cGUKKyAgICBvcGVyYXRvciAqIChjb25zdCBEaWFnb25hbEJhc2U8RGlhZ29uYWxEZXJpdmVkPiAmYikgY29uc3QKKyAgeworICAgIFRyYW5zZm9ybVRpbWVEaWFnb25hbFJldHVyblR5cGUgcmVzKCp0aGlzKTsKKyAgICByZXMubGluZWFyRXh0KCkgKj0gYjsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFRoZSBwcm9kdWN0IGV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXggXGEgYSB0aW1lcyBhIHRyYW5zZm9ybSBcYSBiCisgICAgKgorICAgICogVGhlIGxocyBkaWFnb25hbCBtYXRyaXggaXMgaW50ZXJwcmV0ZWQgYXMgYW4gYWZmaW5lIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24uIFRoZQorICAgICogcHJvZHVjdCByZXN1bHRzIGluIGEgVHJhbnNmb3JtIG9mIHRoZSBzYW1lIHR5cGUgKG1vZGUpIGFzIHRoZSBsaHMgb25seSBpZiB0aGUgbGhzIAorICAgICogbW9kZSBpcyBubyBpc29tZXRyeS4gSW4gdGhhdCBjYXNlLCB0aGUgcmV0dXJuZWQgdHJhbnNmb3JtIGlzIGFuIGFmZmluaXR5LgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERpYWdvbmFsRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZnJpZW5kIGlubGluZSBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlCisgICAgb3BlcmF0b3IgKiAoY29uc3QgRGlhZ29uYWxCYXNlPERpYWdvbmFsRGVyaXZlZD4gJmEsIGNvbnN0IFRyYW5zZm9ybSAmYikKKyAgeworICAgIFRyYW5zZm9ybVRpbWVEaWFnb25hbFJldHVyblR5cGUgcmVzOworICAgIHJlcy5saW5lYXIoKS5ub2FsaWFzKCkgPSBhKmIubGluZWFyKCk7CisgICAgcmVzLnRyYW5zbGF0aW9uKCkubm9hbGlhcygpID0gYSpiLnRyYW5zbGF0aW9uKCk7CisgICAgaWYgKE1vZGUhPWludChBZmZpbmVDb21wYWN0KSkKKyAgICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKSA9IGIubWF0cml4KCkucm93KERpbSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3IqPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIHsgcmV0dXJuICp0aGlzID0gKnRoaXMgKiBvdGhlcjsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHRyYW5zZm9ybWF0aW9ucyAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgVHJhbnNmb3JtIG9wZXJhdG9yICogKGNvbnN0IFRyYW5zZm9ybSYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPFRyYW5zZm9ybSxUcmFuc2Zvcm0+OjpydW4oKnRoaXMsb3RoZXIpOworICB9CisgIAorICAjaWYgRUlHRU5fQ09NUF9JQ0MKK3ByaXZhdGU6CisgIC8vIHRoaXMgaW50ZXJtZWRpYXRlIHN0cnVjdHVyZSBwZXJtaXRzIHRvIHdvcmthcm91bmQgYSBidWcgaW4gSUNDIDExOgorICAvLyAgIGVycm9yOiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHJlc3VsdGVkIGluIHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZSBvZiAiRWlnZW46OlRyYW5zZm9ybTxkb3VibGUsIDMsIDMyLCAwPgorICAvLyAgICAgICAgICAgICAoY29uc3QgRWlnZW46OlRyYW5zZm9ybTxkb3VibGUsIDMsIDIsIDA+ICYpIGNvbnN0IgorICAvLyAgKHRoZSBtZWFuaW5nIG9mIGEgbmFtZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtLSB0aGUgdHlwZSBvZiB0aGUgdGVtcGxhdGUgaXM6CisgIC8vICJFaWdlbjo6aW50ZXJuYWw6OnRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPEVpZ2VuOjpUcmFuc2Zvcm08ZG91YmxlLCAzLCAzMiwgMD4sCisgIC8vICAgICBFaWdlbjo6VHJhbnNmb3JtPGRvdWJsZSwgMywgTW9kZSwgT3B0aW9ucz4sIDxleHByZXNzaW9uPj46OlJlc3VsdFR5cGUgKGNvbnN0IEVpZ2VuOjpUcmFuc2Zvcm08ZG91YmxlLCAzLCBNb2RlLCBPcHRpb25zPiAmKSBjb25zdCIpCisgIC8vIAorICB0ZW1wbGF0ZTxpbnQgT3RoZXJNb2RlLGludCBPdGhlck9wdGlvbnM+IHN0cnVjdCBpY2NfMTFfd29ya2Fyb3VuZAorICB7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+ID4gUHJvZHVjdFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6UmVzdWx0VHlwZSBSZXN1bHRUeXBlOworICB9OworICAKK3B1YmxpYzoKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gZGlmZmVyZW50IHRyYW5zZm9ybWF0aW9ucyAqLworICB0ZW1wbGF0ZTxpbnQgT3RoZXJNb2RlLGludCBPdGhlck9wdGlvbnM+CisgIGlubGluZSB0eXBlbmFtZSBpY2NfMTFfd29ya2Fyb3VuZDxPdGhlck1vZGUsT3RoZXJPcHRpb25zPjo6UmVzdWx0VHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikgY29uc3QKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgaWNjXzExX3dvcmthcm91bmQ8T3RoZXJNb2RlLE90aGVyT3B0aW9ucz46OlByb2R1Y3RUeXBlIFByb2R1Y3RUeXBlOworICAgIHJldHVybiBQcm9kdWN0VHlwZTo6cnVuKCp0aGlzLG90aGVyKTsKKyAgfQorICAjZWxzZQorICAvKiogQ29uY2F0ZW5hdGVzIHR3byBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zICovCisgIHRlbXBsYXRlPGludCBPdGhlck1vZGUsaW50IE90aGVyT3B0aW9ucz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjp0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm0sVHJhbnNmb3JtPFNjYWxhcixEaW0sT3RoZXJNb2RlLE90aGVyT3B0aW9ucz4gPjo6UmVzdWx0VHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6dHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+ID46OnJ1bigqdGhpcyxvdGhlcik7CisgIH0KKyAgI2VuZGlmCisKKyAgLyoqIFxzYSBNYXRyaXhCYXNlOjpzZXRJZGVudGl0eSgpICovCisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgc2V0SWRlbnRpdHkoKSB7IG1fbWF0cml4LnNldElkZW50aXR5KCk7IH0KKworICAvKioKKyAgICogXGJyaWVmIFJldHVybnMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uCisgICAqIFx0b2RvIEluIHRoZSBmdXR1cmUgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmV0dXJuaW5nIGEgVHJhbnNmb3JtIGV4cHJlc3Npb24uCisgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3QgVHJhbnNmb3JtIElkZW50aXR5KCkKKyAgeworICAgIHJldHVybiBUcmFuc2Zvcm0oTWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIAorICBpbmxpbmUgVHJhbnNmb3JtJiBzY2FsZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm0mIHByZXNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0mIHNjYWxlKGNvbnN0IFNjYWxhciYgcyk7CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0mIHByZXNjYWxlKGNvbnN0IFNjYWxhciYgcyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgVHJhbnNmb3JtJiB0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgVHJhbnNmb3JtJiBwcmV0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgVHJhbnNmb3JtJiByb3RhdGUoY29uc3QgUm90YXRpb25UeXBlJiByb3RhdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBpbmxpbmUgVHJhbnNmb3JtJiBwcmVyb3RhdGUoY29uc3QgUm90YXRpb25UeXBlJiByb3RhdGlvbik7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVHJhbnNmb3JtJiBzaGVhcihjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5KTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVHJhbnNmb3JtJiBwcmVzaGVhcihjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5KTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSB7IHJldHVybiB0cmFuc2xhdGUodC52ZWN0b3IoKSk7IH0KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm0gb3BlcmF0b3IqKGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkgY29uc3Q7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiB0KTsKKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgVW5pZm9ybVNjYWxpbmc8U2NhbGFyPiYgcykgeyByZXR1cm4gc2NhbGUocy5mYWN0b3IoKSk7IH0KKyAgCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlIG9wZXJhdG9yKihjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKSBjb25zdAorICB7CisgICAgVHJhbnNmb3JtVGltZURpYWdvbmFsUmV0dXJuVHlwZSByZXMgPSAqdGhpczsKKyAgICByZXMuc2NhbGUocy5mYWN0b3IoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLERpbT4mIHMpIHsgbGluZWFyRXh0KCkgKj0gczsgcmV0dXJuICp0aGlzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLERpbT4mIHIpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcio9KGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLERpbT4mIHIpIHsgcmV0dXJuIHJvdGF0ZShyLnRvUm90YXRpb25NYXRyaXgoKSk7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybSBvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3Q7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgTGluZWFyTWF0cml4VHlwZSByb3RhdGlvbigpIGNvbnN0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICB2b2lkIGNvbXB1dGVSb3RhdGlvblNjYWxpbmcoUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbiwgU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcpIGNvbnN0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsaW5nTWF0cml4VHlwZSwgdHlwZW5hbWUgUm90YXRpb25NYXRyaXhUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICB2b2lkIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcsIFJvdGF0aW9uTWF0cml4VHlwZSAqcm90YXRpb24pIGNvbnN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFBvc2l0aW9uRGVyaXZlZCwgdHlwZW5hbWUgT3JpZW50YXRpb25UeXBlLCB0eXBlbmFtZSBTY2FsZURlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIFRyYW5zZm9ybSYgZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZShjb25zdCBNYXRyaXhCYXNlPFBvc2l0aW9uRGVyaXZlZD4gJnBvc2l0aW9uLAorICAgIGNvbnN0IE9yaWVudGF0aW9uVHlwZSYgb3JpZW50YXRpb24sIGNvbnN0IE1hdHJpeEJhc2U8U2NhbGVEZXJpdmVkPiAmc2NhbGUpOworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGlubGluZSBUcmFuc2Zvcm0gaW52ZXJzZShUcmFuc2Zvcm1UcmFpdHMgdHJhaXRzID0gKFRyYW5zZm9ybVRyYWl0cylNb2RlKSBjb25zdDsKKworICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBjb2x1bW4gbWFqb3IgaW50ZXJuYWwgbWF0cml4ICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmRhdGEoKTsgfQorICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgY29sdW1uIG1ham9yIGludGVybmFsIG1hdHJpeCAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSB7IHJldHVybiBtX21hdHJpeC5kYXRhKCk7IH0KKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2Zvcm0sVHJhbnNmb3JtPE5ld1NjYWxhclR5cGUsRGltLE1vZGUsT3B0aW9ucz4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeyByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8VHJhbnNmb3JtLFRyYW5zZm9ybTxOZXdTY2FsYXJUeXBlLERpbSxNb2RlLE9wdGlvbnM+ID46OnR5cGUoKnRoaXMpOyB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGV4cGxpY2l0IFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm08T3RoZXJTY2FsYXJUeXBlLERpbSxNb2RlLE9wdGlvbnM+JiBvdGhlcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIG1fbWF0cml4ID0gb3RoZXIubWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNBcHByb3goY29uc3QgVHJhbnNmb3JtJiBvdGhlciwgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWF0cml4LmlzQXBwcm94KG90aGVyLm1fbWF0cml4LCBwcmVjKTsgfQorCisgIC8qKiBTZXRzIHRoZSBsYXN0IHJvdyB0byBbMCAuLi4gMCAxXQorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgbWFrZUFmZmluZSgpCisgIHsKKyAgICBpbnRlcm5hbDo6dHJhbnNmb3JtX21ha2VfYWZmaW5lPGludChNb2RlKT46OnJ1bihtX21hdHJpeCk7CisgIH0KKworICAvKiogXGludGVybmFsCisgICAgKiBccmV0dXJucyB0aGUgRGltIHggRGltIGxpbmVhciBwYXJ0IGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhZmZpbmUsCisgICAgKiAgICAgICAgICBhbmQgdGhlIEhEaW0geCBEaW0gcGFydCBmb3IgcHJvamVjdGl2ZSB0cmFuc2Zvcm1hdGlvbnMuCisgICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEJsb2NrPE1hdHJpeFR5cGUsaW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sRGltPiBsaW5lYXJFeHQoKQorICB7IHJldHVybiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKT9IRGltOkRpbSxEaW0+KDAsMCk7IH0KKyAgLyoqIFxpbnRlcm5hbAorICAgICogXHJldHVybnMgdGhlIERpbSB4IERpbSBsaW5lYXIgcGFydCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYWZmaW5lLAorICAgICogICAgICAgICAgYW5kIHRoZSBIRGltIHggRGltIHBhcnQgZm9yIHByb2plY3RpdmUgdHJhbnNmb3JtYXRpb25zLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBCbG9jazxNYXRyaXhUeXBlLGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLERpbT4gbGluZWFyRXh0KCkgY29uc3QKKyAgeyByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8aW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sRGltPigwLDApOyB9CisKKyAgLyoqIFxpbnRlcm5hbAorICAgICogXHJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHBhcnQgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGFmZmluZSwKKyAgICAqICAgICAgICAgIGFuZCB0aGUgbGFzdCBjb2x1bW4gZm9yIHByb2plY3RpdmUgdHJhbnNmb3JtYXRpb25zLgorICAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBCbG9jazxNYXRyaXhUeXBlLGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLDE+IHRyYW5zbGF0aW9uRXh0KCkKKyAgeyByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8aW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sMT4oMCxEaW0pOyB9CisgIC8qKiBcaW50ZXJuYWwKKyAgICAqIFxyZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiBwYXJ0IGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhZmZpbmUsCisgICAgKiAgICAgICAgICBhbmQgdGhlIGxhc3QgY29sdW1uIGZvciBwcm9qZWN0aXZlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgY29uc3QgQmxvY2s8TWF0cml4VHlwZSxpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKT9IRGltOkRpbSwxPiB0cmFuc2xhdGlvbkV4dCgpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLDE+KDAsRGltKTsgfQorCisKKyAgI2lmZGVmIEVJR0VOX1RSQU5TRk9STV9QTFVHSU4KKyAgI2luY2x1ZGUgRUlHRU5fVFJBTlNGT1JNX1BMVUdJTgorICAjZW5kaWYKKyAgCitwcm90ZWN0ZWQ6CisgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoT3B0aW9ucyAmIChEb250QWxpZ258Um93TWFqb3IpKSA9PSBPcHRpb25zLCBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTKQorICAgIH0KKyAgI2VuZGlmCisKK307CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsSXNvbWV0cnk+IElzb21ldHJ5MmY7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxmbG9hdCwzLElzb21ldHJ5PiBJc29tZXRyeTNmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZG91YmxlLDIsSXNvbWV0cnk+IElzb21ldHJ5MmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxJc29tZXRyeT4gSXNvbWV0cnkzZDsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMixBZmZpbmU+IEFmZmluZTJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmU+IEFmZmluZTNmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZG91YmxlLDIsQWZmaW5lPiBBZmZpbmUyZDsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGRvdWJsZSwzLEFmZmluZT4gQWZmaW5lM2Q7CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsQWZmaW5lQ29tcGFjdD4gQWZmaW5lQ29tcGFjdDJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0M2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMixBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0MmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0M2Q7CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsUHJvamVjdGl2ZT4gUHJvamVjdGl2ZTJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxQcm9qZWN0aXZlPiBQcm9qZWN0aXZlM2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMixQcm9qZWN0aXZlPiBQcm9qZWN0aXZlMmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxQcm9qZWN0aXZlPiBQcm9qZWN0aXZlM2Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIE9wdGlvbmFsIFFUIHN1cHBvcnQgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVJR0VOX1FUX1NVUFBPUlQKKy8qKiBJbml0aWFsaXplcyBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6VHJhbnNmb3JtKGNvbnN0IFFNYXRyaXgmIG90aGVyKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgKnRoaXMgPSBvdGhlcjsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6b3BlcmF0b3I9KGNvbnN0IFFNYXRyaXgmIG90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBpZiAoTW9kZSA9PSBpbnQoQWZmaW5lQ29tcGFjdCkpCisgICAgbV9tYXRyaXggPDwgb3RoZXIubTExKCksIG90aGVyLm0yMSgpLCBvdGhlci5keCgpLAorICAgICAgICAgICAgICAgIG90aGVyLm0xMigpLCBvdGhlci5tMjIoKSwgb3RoZXIuZHkoKTsKKyAgZWxzZQorICAgIG1fbWF0cml4IDw8IG90aGVyLm0xMSgpLCBvdGhlci5tMjEoKSwgb3RoZXIuZHgoKSwKKyAgICAgICAgICAgICAgICBvdGhlci5tMTIoKSwgb3RoZXIubTIyKCksIG90aGVyLmR5KCksCisgICAgICAgICAgICAgICAgMCwgMCwgMTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybnMgYSBRTWF0cml4IGZyb20gXGMgKnRoaXMgYXNzdW1pbmcgdGhlIGRpbWVuc2lvbiBpcyAyLgorICAqCisgICogXHdhcm5pbmcgdGhpcyBjb252ZXJzaW9uIG1pZ2h0IGxvc3MgZGF0YSBpZiBcYyAqdGhpcyBpcyBub3QgYWZmaW5lCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK1FNYXRyaXggVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6dG9RTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICByZXR1cm4gUU1hdHJpeChtX21hdHJpeC5jb2VmZigwLDApLCBtX21hdHJpeC5jb2VmZigxLDApLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDEpLCBtX21hdHJpeC5jb2VmZigxLDEpLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpKTsKK30KKworLyoqIEluaXRpYWxpemVzIFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsaW50IE9wdGlvbnM+CitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAqdGhpcyA9IG90aGVyOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6b3BlcmF0b3I9KGNvbnN0IFFUcmFuc2Zvcm0mIG90aGVyKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEaW09PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgaWYgKE1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpKQorICAgIG1fbWF0cml4IDw8IG90aGVyLm0xMSgpLCBvdGhlci5tMjEoKSwgb3RoZXIuZHgoKSwKKyAgICAgICAgICAgICAgICBvdGhlci5tMTIoKSwgb3RoZXIubTIyKCksIG90aGVyLmR5KCk7CisgIGVsc2UKKyAgICBtX21hdHJpeCA8PCBvdGhlci5tMTEoKSwgb3RoZXIubTIxKCksIG90aGVyLmR4KCksCisgICAgICAgICAgICAgICAgb3RoZXIubTEyKCksIG90aGVyLm0yMigpLCBvdGhlci5keSgpLAorICAgICAgICAgICAgICAgIG90aGVyLm0xMygpLCBvdGhlci5tMjMoKSwgb3RoZXIubTMzKCk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxyZXR1cm5zIGEgUVRyYW5zZm9ybSBmcm9tIFxjICp0aGlzIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorUVRyYW5zZm9ybSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+Ojp0b1FUcmFuc2Zvcm0odm9pZCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEaW09PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgaWYgKE1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpKQorICAgIHJldHVybiBRVHJhbnNmb3JtKG1fbWF0cml4LmNvZWZmKDAsMCksIG1fbWF0cml4LmNvZWZmKDEsMCksCisgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXguY29lZmYoMCwxKSwgbV9tYXRyaXguY29lZmYoMSwxKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpKTsKKyAgZWxzZQorICAgIHJldHVybiBRVHJhbnNmb3JtKG1fbWF0cml4LmNvZWZmKDAsMCksIG1fbWF0cml4LmNvZWZmKDEsMCksIG1fbWF0cml4LmNvZWZmKDIsMCksCisgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXguY29lZmYoMCwxKSwgbV9tYXRyaXguY29lZmYoMSwxKSwgbV9tYXRyaXguY29lZmYoMiwxKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpLCBtX21hdHJpeC5jb2VmZigyLDIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqCisqKiogUHJvY2VkdXJhbCBBUEkgKioqCisqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgbm9uIHVuaWZvcm0gc2NhbGUgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBwcmVzY2FsZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpzY2FsZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCxpbnQoRGltKSkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChNb2RlIT1pbnQoSXNvbWV0cnkpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9TUEVDSUZJQ19UUkFOU0ZPUk1BVElPTlMpCisgIGxpbmVhckV4dCgpLm5vYWxpYXMoKSA9IChsaW5lYXJFeHQoKSAqIG90aGVyLmFzRGlhZ29uYWwoKSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIHJpZ2h0IGEgdW5pZm9ybSBzY2FsZSBvZiBhIGZhY3RvciBcYSBjIHRvIFxjICp0aGlzCisgICogYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHByZXNjYWxlKFNjYWxhcikKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnNjYWxlKGNvbnN0IFNjYWxhciYgcykKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChNb2RlIT1pbnQoSXNvbWV0cnkpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9TUEVDSUZJQ19UUkFOU0ZPUk1BVElPTlMpCisgIGxpbmVhckV4dCgpICo9IHM7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIG5vbiB1bmlmb3JtIHNjYWxlIHRyYW5zZm9ybWF0aW9uIHJlcHJlc2VudGVkCisgICogYnkgdGhlIHZlY3RvciBcYSBvdGhlciB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcc2Egc2NhbGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cHJlc2NhbGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsaW50KERpbSkpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTW9kZSE9aW50KElzb21ldHJ5KSwgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfU1BFQ0lGSUNfVFJBTlNGT1JNQVRJT05TKQorICBhZmZpbmUoKS5ub2FsaWFzKCkgPSAob3RoZXIuYXNEaWFnb25hbCgpICogYWZmaW5lKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSBsZWZ0IGEgdW5pZm9ybSBzY2FsZSBvZiBhIGZhY3RvciBcYSBjIHRvIFxjICp0aGlzCisgICogYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHNjYWxlKFNjYWxhcikKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnByZXNjYWxlKGNvbnN0IFNjYWxhciYgcykKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChNb2RlIT1pbnQoSXNvbWV0cnkpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9TUEVDSUZJQ19UUkFOU0ZPUk1BVElPTlMpCisgIG1fbWF0cml4LnRlbXBsYXRlIHRvcFJvd3M8RGltPigpICo9IHM7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIHJpZ2h0IHRoZSB0cmFuc2xhdGlvbiBtYXRyaXggcmVwcmVzZW50ZWQgYnkgdGhlIHZlY3RvciBcYSBvdGhlcgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBwcmV0cmFuc2xhdGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6dHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoT3RoZXJEZXJpdmVkLGludChEaW0pKQorICB0cmFuc2xhdGlvbkV4dCgpICs9IGxpbmVhckV4dCgpICogb3RoZXI7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIHRyYW5zbGF0aW9uIG1hdHJpeCByZXByZXNlbnRlZCBieSB0aGUgdmVjdG9yIFxhIG90aGVyCisgICogdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHRyYW5zbGF0ZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpwcmV0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsaW50KERpbSkpCisgIGlmKGludChNb2RlKT09aW50KFByb2plY3RpdmUpKQorICAgIGFmZmluZSgpICs9IG90aGVyICogbV9tYXRyaXgucm93KERpbSk7CisgIGVsc2UKKyAgICB0cmFuc2xhdGlvbigpICs9IG90aGVyOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgcm90YXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdGF0aW9uIFxhIHJvdGF0aW9uCisgICogdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIFJvdGF0aW9uVHlwZSBpcyB0aGUgdHlwZSBvZiB0aGUgcm90YXRpb24gd2hpY2gKKyAgKiBtdXN0IGJlIGtub3duIGJ5IGludGVybmFsOjp0b1JvdGF0aW9uTWF0cml4PD4uCisgICoKKyAgKiBOYXRpdmVseSBzdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZXM6CisgICogICAtIGFueSBzY2FsYXIgKDJEKSwKKyAgKiAgIC0gYSBEaW0geCBEaW0gbWF0cml4IGV4cHJlc3Npb24sCisgICogICAtIGEgUXVhdGVybmlvbiAoM0QpLAorICAqICAgLSBhIEFuZ2xlQXhpcyAoM0QpCisgICoKKyAgKiBUaGlzIG1lY2hhbmlzbSBpcyBlYXNpbHkgZXh0ZW5kYWJsZSB0byBzdXBwb3J0IHVzZXIgdHlwZXMgc3VjaCBhcyBFdWxlciBhbmdsZXMsCisgICogb3IgYSBwYWlyIG9mIFF1YXRlcm5pb24gZm9yIDREIHJvdGF0aW9ucy4KKyAgKgorICAqIFxzYSByb3RhdGUoU2NhbGFyKSwgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgQW5nbGVBeGlzLCBwcmVyb3RhdGUoUm90YXRpb25UeXBlKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSb3RhdGlvblR5cGU+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cm90YXRlKGNvbnN0IFJvdGF0aW9uVHlwZSYgcm90YXRpb24pCit7CisgIGxpbmVhckV4dCgpICo9IGludGVybmFsOjp0b1JvdGF0aW9uTWF0cml4PFNjYWxhcixEaW0+KHJvdGF0aW9uKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgbGVmdCB0aGUgcm90YXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdGF0aW9uIFxhIHJvdGF0aW9uCisgICogdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICoKKyAgKiBTZWUgcm90YXRlKCkgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgKgorICAqIFxzYSByb3RhdGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSb3RhdGlvblR5cGU+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cHJlcm90YXRlKGNvbnN0IFJvdGF0aW9uVHlwZSYgcm90YXRpb24pCit7CisgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApID0gaW50ZXJuYWw6OnRvUm90YXRpb25NYXRyaXg8U2NhbGFyLERpbT4ocm90YXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIHJpZ2h0IHRoZSBzaGVhciB0cmFuc2Zvcm1hdGlvbiByZXByZXNlbnRlZAorICAqIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHdhcm5pbmcgMkQgb25seS4KKyAgKiBcc2EgcHJlc2hlYXIoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6c2hlYXIoY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnQoRGltKT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKE1vZGUhPWludChJc29tZXRyeSksIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1NQRUNJRklDX1RSQU5TRk9STUFUSU9OUykKKyAgVmVjdG9yVHlwZSB0bXAgPSBsaW5lYXIoKS5jb2woMCkqc3kgKyBsaW5lYXIoKS5jb2woMSk7CisgIGxpbmVhcigpIDw8IGxpbmVhcigpLmNvbCgwKSArIGxpbmVhcigpLmNvbCgxKSpzeCwgdG1wOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSBsZWZ0IHRoZSBzaGVhciB0cmFuc2Zvcm1hdGlvbiByZXByZXNlbnRlZAorICAqIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHdhcm5pbmcgMkQgb25seS4KKyAgKiBcc2Egc2hlYXIoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cHJlc2hlYXIoY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnQoRGltKT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKE1vZGUhPWludChJc29tZXRyeSksIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1NQRUNJRklDX1RSQU5TRk9STUFUSU9OUykKKyAgbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCkgPSBMaW5lYXJNYXRyaXhUeXBlKDEsIHN4LCBzeSwgMSkgKiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2NhbGluZywgVHJhbnNsYXRpb24gYW5kIFJvdGF0aW9uIGNvbXBhdGliaWxpdHkgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46Om9wZXJhdG9yPShjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpCit7CisgIGxpbmVhcigpLnNldElkZW50aXR5KCk7CisgIHRyYW5zbGF0aW9uKCkgPSB0LnZlY3RvcigpOworICBtYWtlQWZmaW5lKCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvciooY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSBjb25zdAoreworICBUcmFuc2Zvcm0gcmVzID0gKnRoaXM7CisgIHJlcy50cmFuc2xhdGUodC52ZWN0b3IoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46Om9wZXJhdG9yPShjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKQoreworICBtX21hdHJpeC5zZXRaZXJvKCk7CisgIGxpbmVhcigpLmRpYWdvbmFsKCkuZmlsbChzLmZhY3RvcigpKTsKKyAgbWFrZUFmZmluZSgpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikKK3sKKyAgbGluZWFyKCkgPSBpbnRlcm5hbDo6dG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihyKTsKKyAgdHJhbnNsYXRpb24oKS5zZXRaZXJvKCk7CisgIG1ha2VBZmZpbmUoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlcyA9ICp0aGlzOworICByZXMucm90YXRlKHIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNwZWNpYWwgZnVuY3Rpb25zICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXHJldHVybnMgdGhlIHJvdGF0aW9uIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisgICoKKyAgKgorICAqIFxzdmRfbW9kdWxlCisgICoKKyAgKiBcc2EgY29tcHV0ZVJvdGF0aW9uU2NhbGluZygpLCBjb21wdXRlU2NhbGluZ1JvdGF0aW9uKCksIGNsYXNzIFNWRAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCB0eXBlbmFtZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpMaW5lYXJNYXRyaXhUeXBlCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+Ojpyb3RhdGlvbigpIGNvbnN0Cit7CisgIExpbmVhck1hdHJpeFR5cGUgcmVzdWx0OworICBjb21wdXRlUm90YXRpb25TY2FsaW5nKCZyZXN1bHQsIChMaW5lYXJNYXRyaXhUeXBlKikwKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiogZGVjb21wb3NlcyB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGFzIGEgcHJvZHVjdCByb3RhdGlvbiB4IHNjYWxpbmcsIHRoZSBzY2FsaW5nIGJlaW5nCisgICogbm90IG5lY2Vzc2FyaWx5IHBvc2l0aXZlLgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqCisgICoKKyAgKiBcc3ZkX21vZHVsZQorICAqCisgICogXHNhIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oKSwgcm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uTWF0cml4VHlwZSwgdHlwZW5hbWUgU2NhbGluZ01hdHJpeFR5cGU+CitFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbiwgU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcpIGNvbnN0Cit7CisgIEphY29iaVNWRDxMaW5lYXJNYXRyaXhUeXBlPiBzdmQobGluZWFyKCksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgU2NhbGFyIHggPSAoc3ZkLm1hdHJpeFUoKSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIFZlY3RvclR5cGUgc3Yoc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKSBzY2FsaW5nLT5sYXp5QXNzaWduKHN2ZC5tYXRyaXhWKCkgKiBzdi5hc0RpYWdvbmFsKCkgKiBzdmQubWF0cml4VigpLmFkam9pbnQoKSk7CisgIGlmKHJvdGF0aW9uKQorICB7CisgICAgTGluZWFyTWF0cml4VHlwZSBtKHN2ZC5tYXRyaXhVKCkpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPmxhenlBc3NpZ24obSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKTsKKyAgfQorfQorCisvKiogZGVjb21wb3NlcyB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGFzIGEgcHJvZHVjdCBzY2FsaW5nIHggcm90YXRpb24sIHRoZSBzY2FsaW5nIGJlaW5nCisgICogbm90IG5lY2Vzc2FyaWx5IHBvc2l0aXZlLgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqCisgICoKKyAgKiBcc3ZkX21vZHVsZQorICAqCisgICogXHNhIGNvbXB1dGVSb3RhdGlvblNjYWxpbmcoKSwgcm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlLCB0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGU+CitFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OmNvbXB1dGVTY2FsaW5nUm90YXRpb24oU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcsIFJvdGF0aW9uTWF0cml4VHlwZSAqcm90YXRpb24pIGNvbnN0Cit7CisgIEphY29iaVNWRDxMaW5lYXJNYXRyaXhUeXBlPiBzdmQobGluZWFyKCksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgU2NhbGFyIHggPSAoc3ZkLm1hdHJpeFUoKSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIFZlY3RvclR5cGUgc3Yoc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKSBzY2FsaW5nLT5sYXp5QXNzaWduKHN2ZC5tYXRyaXhVKCkgKiBzdi5hc0RpYWdvbmFsKCkgKiBzdmQubWF0cml4VSgpLmFkam9pbnQoKSk7CisgIGlmKHJvdGF0aW9uKQorICB7CisgICAgTGluZWFyTWF0cml4VHlwZSBtKHN2ZC5tYXRyaXhVKCkpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPmxhenlBc3NpZ24obSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKTsKKyAgfQorfQorCisvKiogQ29udmVuaWVudCBtZXRob2QgdG8gc2V0IFxjICp0aGlzIGZyb20gYSBwb3NpdGlvbiwgb3JpZW50YXRpb24gYW5kIHNjYWxlCisgICogb2YgYSAzRCBvYmplY3QuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFBvc2l0aW9uRGVyaXZlZCwgdHlwZW5hbWUgT3JpZW50YXRpb25UeXBlLCB0eXBlbmFtZSBTY2FsZURlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6ZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZShjb25zdCBNYXRyaXhCYXNlPFBvc2l0aW9uRGVyaXZlZD4gJnBvc2l0aW9uLAorICBjb25zdCBPcmllbnRhdGlvblR5cGUmIG9yaWVudGF0aW9uLCBjb25zdCBNYXRyaXhCYXNlPFNjYWxlRGVyaXZlZD4gJnNjYWxlKQoreworICBsaW5lYXIoKSA9IGludGVybmFsOjp0b1JvdGF0aW9uTWF0cml4PFNjYWxhcixEaW0+KG9yaWVudGF0aW9uKTsKKyAgbGluZWFyKCkgKj0gc2NhbGUuYXNEaWFnb25hbCgpOworICB0cmFuc2xhdGlvbigpID0gcG9zaXRpb247CisgIG1ha2VBZmZpbmUoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgTW9kZT4KK3N0cnVjdCB0cmFuc2Zvcm1fbWFrZV9hZmZpbmUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUgJm1hdCkKKyAgeworICAgIHN0YXRpYyBjb25zdCBpbnQgRGltID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUtMTsKKyAgICBtYXQudGVtcGxhdGUgYmxvY2s8MSxEaW0+KERpbSwwKS5zZXRaZXJvKCk7CisgICAgbWF0LmNvZWZmUmVmKERpbSxEaW0pID0gdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyKDEpOworICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgdHJhbnNmb3JtX21ha2VfYWZmaW5lPEFmZmluZUNvbXBhY3Q+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlICYpIHsgfQorfTsKKyAgICAKKy8vIHNlbGVjdG9yIG5lZWRlZCB0byBhdm9pZCB0YWtpbmcgdGhlIGludmVyc2Ugb2YgYSAzeDQgbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlLCBpbnQgTW9kZT1UcmFuc2Zvcm1UeXBlOjpNb2RlPgorc3RydWN0IHByb2plY3RpdmVfdHJhbnNmb3JtX2ludmVyc2UKK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBUcmFuc2Zvcm1UeXBlJiwgVHJhbnNmb3JtVHlwZSYpCisgIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgorc3RydWN0IHByb2plY3RpdmVfdHJhbnNmb3JtX2ludmVyc2U8VHJhbnNmb3JtVHlwZSwgUHJvamVjdGl2ZT4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBUcmFuc2Zvcm1UeXBlJiBtLCBUcmFuc2Zvcm1UeXBlJiByZXMpCisgIHsKKyAgICByZXMubWF0cml4KCkgPSBtLm1hdHJpeCgpLmludmVyc2UoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworLyoqCisgICoKKyAgKiBccmV0dXJucyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBhY2NvcmRpbmcgdG8gc29tZSBnaXZlbiBrbm93bGVkZ2UKKyAgKiBvbiBcYyAqdGhpcy4KKyAgKgorICAqIFxwYXJhbSBoaW50IGFsbG93cyB0byBvcHRpbWl6ZSB0aGUgaW52ZXJzaW9uIHByb2Nlc3Mgd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24KKyAgKiBpcyBrbm93biB0byBiZSBub3QgYSBnZW5lcmFsIHRyYW5zZm9ybWF0aW9uIChvcHRpb25hbCkuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAqICAtICNQcm9qZWN0aXZlIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgYWZmaW5lLCBpLmUuLCBpZiB0aGUKKyAgKiAgICBsYXN0IHJvdyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBbMCAuLi4gMCAxXQorICAqICAtICNBZmZpbmUgaWYgdGhlIGxhc3Qgcm93IGNhbiBiZSBhc3N1bWVkIHRvIGJlIFswIC4uLiAwIDFdCisgICogIC0gI0lzb21ldHJ5IGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvbmx5IGEgY29uY2F0ZW5hdGlvbnMgb2YgdHJhbnNsYXRpb25zCisgICogICAgYW5kIHJvdGF0aW9ucy4KKyAgKiAgVGhlIGRlZmF1bHQgaXMgdGhlIHRlbXBsYXRlIGNsYXNzIHBhcmFtZXRlciBcYyBNb2RlLgorICAqCisgICogXHdhcm5pbmcgdW5sZXNzIFxhIHRyYWl0cyBpcyBhbHdheXMgc2V0IHRvIE5vU2hlYXIgb3IgTm9TY2FsaW5nLCB0aGlzIGZ1bmN0aW9uCisgICogcmVxdWlyZXMgdGhlIGdlbmVyaWMgaW52ZXJzZSBtZXRob2Qgb2YgTWF0cml4QmFzZSBkZWZpbmVkIGluIHRoZSBMVSBtb2R1bGUuIElmCisgICogeW91IGZvcmdldCB0byBpbmNsdWRlIHRoaXMgbW9kdWxlLCB0aGVuIHlvdSB3aWxsIGdldCBoYXJkIHRvIGRlYnVnIGxpbmtpbmcgZXJyb3JzLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmludmVyc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitFSUdFTl9ERVZJQ0VfRlVOQyBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+CitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjppbnZlcnNlKFRyYW5zZm9ybVRyYWl0cyBoaW50KSBjb25zdAoreworICBUcmFuc2Zvcm0gcmVzOworICBpZiAoaGludCA9PSBQcm9qZWN0aXZlKQorICB7CisgICAgaW50ZXJuYWw6OnByb2plY3RpdmVfdHJhbnNmb3JtX2ludmVyc2U8VHJhbnNmb3JtPjo6cnVuKCp0aGlzLCByZXMpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChoaW50ID09IElzb21ldHJ5KQorICAgIHsKKyAgICAgIHJlcy5tYXRyaXgoKS50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPERpbSxEaW0+KCkgPSBsaW5lYXIoKS50cmFuc3Bvc2UoKTsKKyAgICB9CisgICAgZWxzZSBpZihoaW50JkFmZmluZSkKKyAgICB7CisgICAgICByZXMubWF0cml4KCkudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEaW0sRGltPigpID0gbGluZWFyKCkuaW52ZXJzZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJJbnZhbGlkIHRyYW5zZm9ybSB0cmFpdHMgaW4gVHJhbnNmb3JtOjpJbnZlcnNlIik7CisgICAgfQorICAgIC8vIHRyYW5zbGF0aW9uIGFuZCByZW1haW5pbmcgcGFydHMKKyAgICByZXMubWF0cml4KCkudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8RGltLDE+KCkKKyAgICAgID0gLSByZXMubWF0cml4KCkudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEaW0sRGltPigpICogdHJhbnNsYXRpb24oKTsKKyAgICByZXMubWFrZUFmZmluZSgpOyAvLyB3ZSBkbyBuZWVkIHRoaXMsIGJlY2F1c2UgaW4gdGhlIGJlZ2lubmluZyByZXMgaXMgdW5pbml0aWFsaXplZAorICB9CisgIHJldHVybiByZXM7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNwZWNpYWxpemF0aW9ucyBvZiB0YWtlIGFmZmluZSBwYXJ0ICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4gc3RydWN0IHRyYW5zZm9ybV90YWtlX2FmZmluZV9wYXJ0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6QWZmaW5lUGFydCBBZmZpbmVQYXJ0OworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6OkNvbnN0QWZmaW5lUGFydCBDb25zdEFmZmluZVBhcnQ7CisgIHN0YXRpYyBpbmxpbmUgQWZmaW5lUGFydCBydW4oTWF0cml4VHlwZSYgbSkKKyAgeyByZXR1cm4gbS50ZW1wbGF0ZSBibG9jazxUcmFuc2Zvcm1UeXBlOjpEaW0sVHJhbnNmb3JtVHlwZTo6SERpbT4oMCwwKTsgfQorICBzdGF0aWMgaW5saW5lIENvbnN0QWZmaW5lUGFydCBydW4oY29uc3QgTWF0cml4VHlwZSYgbSkKKyAgeyByZXR1cm4gbS50ZW1wbGF0ZSBibG9jazxUcmFuc2Zvcm1UeXBlOjpEaW0sVHJhbnNmb3JtVHlwZTo6SERpbT4oMCwwKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4KK3N0cnVjdCB0cmFuc2Zvcm1fdGFrZV9hZmZpbmVfcGFydDxUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LCBPcHRpb25zPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+OjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4VHlwZSYgcnVuKE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG07IH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBydW4oY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gbTsgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU3BlY2lhbGl6YXRpb25zIG9mIGNvbnN0cnVjdCBmcm9tIG1hdHJpeCAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE1vZGUsIGludCBPcHRpb25zLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyLCBNb2RlLE9wdGlvbnMsRGltLEhEaW0sIERpbSxEaW0+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oVHJhbnNmb3JtPHR5cGVuYW1lIE90aGVyOjpTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4gKnRyYW5zZm9ybSwgY29uc3QgT3RoZXImIG90aGVyKQorICB7CisgICAgdHJhbnNmb3JtLT5saW5lYXIoKSA9IG90aGVyOworICAgIHRyYW5zZm9ybS0+dHJhbnNsYXRpb24oKS5zZXRaZXJvKCk7CisgICAgdHJhbnNmb3JtLT5tYWtlQWZmaW5lKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9jb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXIsIE1vZGUsT3B0aW9ucyxEaW0sSERpbSwgRGltLEhEaW0+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oVHJhbnNmb3JtPHR5cGVuYW1lIE90aGVyOjpTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4gKnRyYW5zZm9ybSwgY29uc3QgT3RoZXImIG90aGVyKQorICB7CisgICAgdHJhbnNmb3JtLT5hZmZpbmUoKSA9IG90aGVyOworICAgIHRyYW5zZm9ybS0+bWFrZUFmZmluZSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE1vZGUsIGludCBPcHRpb25zLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyLCBNb2RlLE9wdGlvbnMsRGltLEhEaW0sIEhEaW0sSERpbT4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiAqdHJhbnNmb3JtLCBjb25zdCBPdGhlciYgb3RoZXIpCisgIHsgdHJhbnNmb3JtLT5tYXRyaXgoKSA9IG90aGVyOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9jb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXIsIEFmZmluZUNvbXBhY3QsT3B0aW9ucyxEaW0sSERpbSwgSERpbSxIRGltPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+ICp0cmFuc2Zvcm0sIGNvbnN0IE90aGVyJiBvdGhlcikKKyAgeyB0cmFuc2Zvcm0tPm1hdHJpeCgpID0gb3RoZXIudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCk7IH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogICBTcGVjaWFsaXphdGlvbnMgb2Ygb3BlcmF0b3IqIHdpdGggcmhzIEVpZ2VuQmFzZSAgICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8aW50IExoc01vZGUsaW50IFJoc01vZGU+CitzdHJ1Y3QgdHJhbnNmb3JtX3Byb2R1Y3RfcmVzdWx0Cit7CisgIGVudW0gCisgIHsgCisgICAgTW9kZSA9CisgICAgICAoTGhzTW9kZSA9PSAoaW50KVByb2plY3RpdmUgICAgfHwgUmhzTW9kZSA9PSAoaW50KVByb2plY3RpdmUgICAgKSA/IFByb2plY3RpdmUgOgorICAgICAgKExoc01vZGUgPT0gKGludClBZmZpbmUgICAgICAgIHx8IFJoc01vZGUgPT0gKGludClBZmZpbmUgICAgICAgICkgPyBBZmZpbmUgOgorICAgICAgKExoc01vZGUgPT0gKGludClBZmZpbmVDb21wYWN0IHx8IFJoc01vZGUgPT0gKGludClBZmZpbmVDb21wYWN0ICkgPyBBZmZpbmVDb21wYWN0IDoKKyAgICAgIChMaHNNb2RlID09IChpbnQpSXNvbWV0cnkgICAgICB8fCBSaHNNb2RlID09IChpbnQpSXNvbWV0cnkgICAgICApID8gSXNvbWV0cnkgOiBQcm9qZWN0aXZlCisgIH07Cit9OworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFJoc0NvbHM+CitzdHJ1Y3QgdHJhbnNmb3JtX3JpZ2h0X3Byb2R1Y3RfaW1wbDwgVHJhbnNmb3JtVHlwZSwgTWF0cml4VHlwZSwgMCwgUmhzQ29scz4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdCBSZXN1bHRUeXBlOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJlc3VsdFR5cGUgcnVuKGNvbnN0IFRyYW5zZm9ybVR5cGUmIFQsIGNvbnN0IE1hdHJpeFR5cGUmIG90aGVyKQorICB7CisgICAgcmV0dXJuIFQubWF0cml4KCkgKiBvdGhlcjsKKyAgfQorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIFRyYW5zZm9ybVR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBSaHNDb2xzPgorc3RydWN0IHRyYW5zZm9ybV9yaWdodF9wcm9kdWN0X2ltcGw8IFRyYW5zZm9ybVR5cGUsIE1hdHJpeFR5cGUsIDEsIFJoc0NvbHM+Cit7CisgIGVudW0geyAKKyAgICBEaW0gPSBUcmFuc2Zvcm1UeXBlOjpEaW0sIAorICAgIEhEaW0gPSBUcmFuc2Zvcm1UeXBlOjpIRGltLAorICAgIE90aGVyUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIE90aGVyQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdCBSZXN1bHRUeXBlOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJlc3VsdFR5cGUgcnVuKGNvbnN0IFRyYW5zZm9ybVR5cGUmIFQsIGNvbnN0IE1hdHJpeFR5cGUmIG90aGVyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChPdGhlclJvd3M9PUhEaW0sIFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMpOworCisgICAgdHlwZWRlZiBCbG9jazxSZXN1bHRUeXBlLCBEaW0sIE90aGVyQ29scywgaW50KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKT09RGltPiBUb3BMZWZ0TGhzOworCisgICAgUmVzdWx0VHlwZSByZXMob3RoZXIucm93cygpLG90aGVyLmNvbHMoKSk7CisgICAgVG9wTGVmdExocyhyZXMsIDAsIDAsIERpbSwgb3RoZXIuY29scygpKS5ub2FsaWFzKCkgPSBULmFmZmluZSgpICogb3RoZXI7CisgICAgcmVzLnJvdyhPdGhlclJvd3MtMSkgPSBvdGhlci5yb3coT3RoZXJSb3dzLTEpOworICAgIAorICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUmhzQ29scz4KK3N0cnVjdCB0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsPCBUcmFuc2Zvcm1UeXBlLCBNYXRyaXhUeXBlLCAyLCBSaHNDb2xzPgoreworICBlbnVtIHsgCisgICAgRGltID0gVHJhbnNmb3JtVHlwZTo6RGltLCAKKyAgICBIRGltID0gVHJhbnNmb3JtVHlwZTo6SERpbSwKKyAgICBPdGhlclJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBPdGhlckNvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUmVzdWx0VHlwZTsKKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBSZXN1bHRUeXBlIHJ1bihjb25zdCBUcmFuc2Zvcm1UeXBlJiBULCBjb25zdCBNYXRyaXhUeXBlJiBvdGhlcikKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoT3RoZXJSb3dzPT1EaW0sIFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMpOworCisgICAgdHlwZWRlZiBCbG9jazxSZXN1bHRUeXBlLCBEaW0sIE90aGVyQ29scywgdHJ1ZT4gVG9wTGVmdExoczsKKyAgICBSZXN1bHRUeXBlIHJlcyhSZXBsaWNhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6Q29uc3RUcmFuc2xhdGlvblBhcnQsIDEsIE90aGVyQ29scz4oVC50cmFuc2xhdGlvbigpLDEsb3RoZXIuY29scygpKSk7CisgICAgVG9wTGVmdExocyhyZXMsIDAsIDAsIERpbSwgb3RoZXIuY29scygpKS5ub2FsaWFzKCkgKz0gVC5saW5lYXIoKSAqIG90aGVyOworCisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIFRyYW5zZm9ybVR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUgPgorc3RydWN0IHRyYW5zZm9ybV9yaWdodF9wcm9kdWN0X2ltcGw8IFRyYW5zZm9ybVR5cGUsIE1hdHJpeFR5cGUsIDIsIDE+IC8vIHJocyBpcyBhIHZlY3RvciBvZiBzaXplIERpbQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgVHJhbnNmb3JtTWF0cml4OworICBlbnVtIHsKKyAgICBEaW0gPSBUcmFuc2Zvcm1UeXBlOjpEaW0sCisgICAgSERpbSA9IFRyYW5zZm9ybVR5cGU6OkhEaW0sCisgICAgT3RoZXJSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgV29ya2luZ1Jvd3MgPSBFSUdFTl9QTEFJTl9FTlVNX01JTihUcmFuc2Zvcm1NYXRyaXg6OlJvd3NBdENvbXBpbGVUaW1lLEhEaW0pCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdCBSZXN1bHRUeXBlOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJlc3VsdFR5cGUgcnVuKGNvbnN0IFRyYW5zZm9ybVR5cGUmIFQsIGNvbnN0IE1hdHJpeFR5cGUmIG90aGVyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChPdGhlclJvd3M9PURpbSwgWU9VX01JWEVEX01BVFJJQ0VTX09GX0RJRkZFUkVOVF9TSVpFUyk7CisKKyAgICBNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLCBEaW0rMSwgMT4gcmhzOworICAgIHJocy50ZW1wbGF0ZSBoZWFkPERpbT4oKSA9IG90aGVyOyByaHNbRGltXSA9IHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcigxKTsKKyAgICBNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLCBXb3JraW5nUm93cywgMT4gcmVzKFQubWF0cml4KCkgKiByaHMpOworICAgIHJldHVybiByZXMudGVtcGxhdGUgaGVhZDxEaW0+KCk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogICBTcGVjaWFsaXphdGlvbnMgb2Ygb3BlcmF0b3IqIHdpdGggbGhzIEVpZ2VuQmFzZSAgICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZ2VuZXJpYyBIRGltIHggSERpbSBtYXRyaXggKiBUID0+IFByb2plY3RpdmUKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2xlZnRfcHJvZHVjdF9pbXBsPE90aGVyLE1vZGUsT3B0aW9ucyxEaW0sSERpbSwgSERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxQcm9qZWN0aXZlLE9wdGlvbnM+IFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBPdGhlciYgb3RoZXIsY29uc3QgVHJhbnNmb3JtVHlwZSYgdHIpCisgIHsgcmV0dXJuIFJlc3VsdFR5cGUob3RoZXIgKiB0ci5tYXRyaXgoKSk7IH0KK307CisKKy8vIGdlbmVyaWMgSERpbSB4IEhEaW0gbWF0cml4ICogQWZmaW5lQ29tcGFjdCA9PiBQcm9qZWN0aXZlCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixBZmZpbmVDb21wYWN0LE9wdGlvbnMsRGltLEhEaW0sIEhEaW0sSERpbT4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sUHJvamVjdGl2ZSxPcHRpb25zPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgT3RoZXImIG90aGVyLGNvbnN0IFRyYW5zZm9ybVR5cGUmIHRyKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLm1hdHJpeCgpLm5vYWxpYXMoKSA9IG90aGVyLnRlbXBsYXRlIGJsb2NrPEhEaW0sRGltPigwLDApICogdHIubWF0cml4KCk7CisgICAgcmVzLm1hdHJpeCgpLmNvbChEaW0pICs9IG90aGVyLmNvbChEaW0pOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8vIGFmZmluZSBtYXRyaXggKiBUCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcixpbnQgTW9kZSwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixNb2RlLE9wdGlvbnMsRGltLEhEaW0sIERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybVR5cGUgUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IE90aGVyJiBvdGhlcixjb25zdCBUcmFuc2Zvcm1UeXBlJiB0cikKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzOworICAgIHJlcy5hZmZpbmUoKS5ub2FsaWFzKCkgPSBvdGhlciAqIHRyLm1hdHJpeCgpOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKSA9IHRyLm1hdHJpeCgpLnJvdyhEaW0pOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8vIGFmZmluZSBtYXRyaXggKiBBZmZpbmVDb21wYWN0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixBZmZpbmVDb21wYWN0LE9wdGlvbnMsRGltLEhEaW0sIERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybVR5cGUgUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IE90aGVyJiBvdGhlcixjb25zdCBUcmFuc2Zvcm1UeXBlJiB0cikKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzOworICAgIHJlcy5tYXRyaXgoKS5ub2FsaWFzKCkgPSBvdGhlci50ZW1wbGF0ZSBibG9jazxEaW0sRGltPigwLDApICogdHIubWF0cml4KCk7CisgICAgcmVzLnRyYW5zbGF0aW9uKCkgKz0gb3RoZXIuY29sKERpbSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworLy8gbGluZWFyIG1hdHJpeCAqIFQKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2xlZnRfcHJvZHVjdF9pbXBsPE90aGVyLE1vZGUsT3B0aW9ucyxEaW0sSERpbSwgRGltLERpbT4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm1UeXBlIFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBPdGhlciYgb3RoZXIsIGNvbnN0IFRyYW5zZm9ybVR5cGUmIHRyKQorICB7CisgICAgVHJhbnNmb3JtVHlwZSByZXM7CisgICAgaWYoTW9kZSE9aW50KEFmZmluZUNvbXBhY3QpKQorICAgICAgcmVzLm1hdHJpeCgpLnJvdyhEaW0pID0gdHIubWF0cml4KCkucm93KERpbSk7CisgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpLm5vYWxpYXMoKQorICAgICAgPSBvdGhlciAqIHRyLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU3BlY2lhbGl6YXRpb25zIG9mIG9wZXJhdG9yKiB3aXRoIGFub3RoZXIgVHJhbnNmb3JtICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTGhzTW9kZSwgaW50IExoc09wdGlvbnMsIGludCBSaHNNb2RlLCBpbnQgUmhzT3B0aW9ucz4KK3N0cnVjdCB0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm08U2NhbGFyLERpbSxMaHNNb2RlLExoc09wdGlvbnM+LFRyYW5zZm9ybTxTY2FsYXIsRGltLFJoc01vZGUsUmhzT3B0aW9ucz4sZmFsc2UgPgoreworICBlbnVtIHsgUmVzdWx0TW9kZSA9IHRyYW5zZm9ybV9wcm9kdWN0X3Jlc3VsdDxMaHNNb2RlLFJoc01vZGU+OjpNb2RlIH07CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTGhzTW9kZSxMaHNPcHRpb25zPiBMaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUmhzTW9kZSxSaHNPcHRpb25zPiBSaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUmVzdWx0TW9kZSxMaHNPcHRpb25zPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLmxpbmVhcigpID0gbGhzLmxpbmVhcigpICogcmhzLmxpbmVhcigpOworICAgIHJlcy50cmFuc2xhdGlvbigpID0gbGhzLmxpbmVhcigpICogcmhzLnRyYW5zbGF0aW9uKCkgKyBsaHMudHJhbnNsYXRpb24oKTsKKyAgICByZXMubWFrZUFmZmluZSgpOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IExoc01vZGUsIGludCBMaHNPcHRpb25zLCBpbnQgUmhzTW9kZSwgaW50IFJoc09wdGlvbnM+CitzdHJ1Y3QgdHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtPFNjYWxhcixEaW0sTGhzTW9kZSxMaHNPcHRpb25zPixUcmFuc2Zvcm08U2NhbGFyLERpbSxSaHNNb2RlLFJoc09wdGlvbnM+LHRydWUgPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLExoc01vZGUsTGhzT3B0aW9ucz4gTGhzOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLFJoc01vZGUsUmhzT3B0aW9ucz4gUmhzOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLFByb2plY3RpdmU+IFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICByZXR1cm4gUmVzdWx0VHlwZSggbGhzLm1hdHJpeCgpICogcmhzLm1hdHJpeCgpICk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IExoc09wdGlvbnMsIGludCBSaHNPcHRpb25zPgorc3RydWN0IHRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZUNvbXBhY3QsTGhzT3B0aW9ucz4sVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZSxSaHNPcHRpb25zPix0cnVlID4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LExoc09wdGlvbnM+IExoczsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLFJoc09wdGlvbnM+IFJoczsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpID0gbGhzLm1hdHJpeCgpICogcmhzLm1hdHJpeCgpOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKSA9IHJocy5tYXRyaXgoKS5yb3coRGltKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBMaHNPcHRpb25zLCBpbnQgUmhzT3B0aW9ucz4KK3N0cnVjdCB0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLExoc09wdGlvbnM+LFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZUNvbXBhY3QsUmhzT3B0aW9ucz4sdHJ1ZSA+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZSxMaHNPcHRpb25zPiBMaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxSaHNPcHRpb25zPiBSaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZT4gUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzKGxocy5tYXRyaXgoKS50ZW1wbGF0ZSBsZWZ0Q29sczxEaW0+KCkgKiByaHMubWF0cml4KCkpOworICAgIHJlcy5tYXRyaXgoKS5jb2woRGltKSArPSBsaHMubWF0cml4KCkuY29sKERpbSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJBTlNGT1JNX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2xhdGlvbi5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1RyYW5zbGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkOWE4MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2xhdGlvbi5oCkBAIC0wLDAgKzEsMjA4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJBTlNMQVRJT05fSAorI2RlZmluZSBFSUdFTl9UUkFOU0xBVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmFuc2xhdGlvbgorICAqCisgICogXGJyaWVmIFJlcHJlc2VudHMgYSB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbgorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKiBcdHBhcmFtIF9EaW0gdGhlICBkaW1lbnNpb24gb2YgdGhlIHNwYWNlLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYworICAqCisgICogXG5vdGUgVGhpcyBjbGFzcyBpcyBub3QgYWltZWQgdG8gYmUgdXNlZCB0byBzdG9yZSBhIHRyYW5zbGF0aW9uIHRyYW5zZm9ybWF0aW9uLAorICAqIGJ1dCByYXRoZXIgdG8gbWFrZSBlYXNpZXIgdGhlIGNvbnN0cnVjdGlvbnMgYW5kIHVwZGF0ZXMgb2YgVHJhbnNmb3JtIG9iamVjdHMuCisgICoKKyAgKiBcc2EgY2xhc3MgU2NhbGluZywgY2xhc3MgVHJhbnNmb3JtCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbT4KK2NsYXNzIFRyYW5zbGF0aW9uCit7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfRGltKQorICAvKiogZGltZW5zaW9uIG9mIHRoZSBzcGFjZSAqLworICBlbnVtIHsgRGltID0gX0RpbSB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgLyoqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHR5cGUgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSwxPiBWZWN0b3JUeXBlOworICAvKiogY29ycmVzcG9uZGluZyBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IHR5cGUgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSxEaW0+IExpbmVhck1hdHJpeFR5cGU7CisgIC8qKiBjb3JyZXNwb25kaW5nIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiB0eXBlICovCisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lPiBBZmZpbmVUcmFuc2Zvcm1UeXBlOworICAvKiogY29ycmVzcG9uZGluZyBpc29tZXRyaWMgdHJhbnNmb3JtYXRpb24gdHlwZSAqLworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLElzb21ldHJ5PiBJc29tZXRyeVRyYW5zZm9ybVR5cGU7CisKK3Byb3RlY3RlZDoKKworICBWZWN0b3JUeXBlIG1fY29lZmZzOworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbi4gKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVHJhbnNsYXRpb24oKSB7fQorICAvKiogICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBUcmFuc2xhdGlvbihjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5KQorICB7CisgICAgZWlnZW5fYXNzZXJ0KERpbT09Mik7CisgICAgbV9jb2VmZnMueCgpID0gc3g7CisgICAgbV9jb2VmZnMueSgpID0gc3k7CisgIH0KKyAgLyoqICAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNsYXRpb24oY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSwgY29uc3QgU2NhbGFyJiBzeikKKyAgeworICAgIGVpZ2VuX2Fzc2VydChEaW09PTMpOworICAgIG1fY29lZmZzLngoKSA9IHN4OworICAgIG1fY29lZmZzLnkoKSA9IHN5OworICAgIG1fY29lZmZzLnooKSA9IHN6OworICB9CisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIHRoZSB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbiBmcm9tIGEgdmVjdG9yIG9mIHRyYW5zbGF0aW9uIGNvZWZmaWNpZW50cyAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBleHBsaWNpdCBpbmxpbmUgVHJhbnNsYXRpb24oY29uc3QgVmVjdG9yVHlwZSYgdmVjdG9yKSA6IG1fY29lZmZzKHZlY3Rvcikge30KKworICAvKiogXGJyaWVmIFJldHJ1bnMgdGhlIHgtdHJhbnNsYXRpb24gYnkgdmFsdWUuICoqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIHgoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy54KCk7IH0KKyAgLyoqIFxicmllZiBSZXRydW5zIHRoZSB5LXRyYW5zbGF0aW9uIGJ5IHZhbHVlLiAqKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciB5KCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMueSgpOyB9CisgIC8qKiBcYnJpZWYgUmV0cnVucyB0aGUgei10cmFuc2xhdGlvbiBieSB2YWx1ZS4gKiovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXIgeigpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLnooKTsgfQorCisgIC8qKiBcYnJpZWYgUmV0cnVucyB0aGUgeC10cmFuc2xhdGlvbiBhcyBhIHJlZmVyZW5jZS4gKiovCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBTY2FsYXImIHgoKSB7IHJldHVybiBtX2NvZWZmcy54KCk7IH0KKyAgLyoqIFxicmllZiBSZXRydW5zIHRoZSB5LXRyYW5zbGF0aW9uIGFzIGEgcmVmZXJlbmNlLiAqKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciYgeSgpIHsgcmV0dXJuIG1fY29lZmZzLnkoKTsgfQorICAvKiogXGJyaWVmIFJldHJ1bnMgdGhlIHotdHJhbnNsYXRpb24gYXMgYSByZWZlcmVuY2UuICoqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyJiB6KCkgeyByZXR1cm4gbV9jb2VmZnMueigpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgVmVjdG9yVHlwZSYgdmVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVmVjdG9yVHlwZSYgdmVjdG9yKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBWZWN0b3JUeXBlJiB0cmFuc2xhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIFZlY3RvclR5cGUmIHRyYW5zbGF0aW9uKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byB0cmFuc2xhdGlvbiAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNsYXRpb24gb3BlcmF0b3IqIChjb25zdCBUcmFuc2xhdGlvbiYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFRyYW5zbGF0aW9uKG1fY29lZmZzICsgb3RoZXIubV9jb2VmZnMpOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHRyYW5zbGF0aW9uIGFuZCBhIHVuaWZvcm0gc2NhbGluZyAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgQWZmaW5lVHJhbnNmb3JtVHlwZSBvcGVyYXRvciogKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIG90aGVyKSBjb25zdDsKKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdHJhbnNsYXRpb24gYW5kIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEFmZmluZVRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqIChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgbGluZWFyKSBjb25zdDsKKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdHJhbnNsYXRpb24gYW5kIGEgcm90YXRpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIElzb21ldHJ5VHJhbnNmb3JtVHlwZSBvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKKyAgeyByZXR1cm4gKnRoaXMgKiBJc29tZXRyeVRyYW5zZm9ybVR5cGUocik7IH0KKworICAvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gXGEgbCB3aXRoIHRoZSB0cmFuc2xhdGlvbiBcYSB0ICovCisgIC8vIGl0cyBhIG5pZ2h0bWFyZSB0byBkZWZpbmUgYSB0ZW1wbGF0ZWQgZnJpZW5kIGZ1bmN0aW9uIG91dHNpZGUgaXRzIGRlY2xhcmF0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBBZmZpbmVUcmFuc2Zvcm1UeXBlIG9wZXJhdG9yKihjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgbGluZWFyLCBjb25zdCBUcmFuc2xhdGlvbiYgdCkKKyAgeworICAgIEFmZmluZVRyYW5zZm9ybVR5cGUgcmVzOworICAgIHJlcy5tYXRyaXgoKS5zZXRaZXJvKCk7CisgICAgcmVzLmxpbmVhcigpID0gbGluZWFyLmRlcml2ZWQoKTsKKyAgICByZXMudHJhbnNsYXRpb24oKSA9IGxpbmVhci5kZXJpdmVkKCkgKiB0Lm1fY29lZmZzOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKS5zZXRaZXJvKCk7CisgICAgcmVzKERpbSxEaW0pID0gU2NhbGFyKDEpOworICAgIHJldHVybiByZXM7CisgIH0KKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdHJhbnNsYXRpb24gYW5kIGEgdHJhbnNmb3JtYXRpb24gKi8KKyAgdGVtcGxhdGU8aW50IE1vZGUsIGludCBPcHRpb25zPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZT4gb3BlcmF0b3IqIChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JiB0KSBjb25zdAorICB7CisgICAgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZT4gcmVzID0gdDsKKyAgICByZXMucHJldHJhbnNsYXRlKG1fY29lZmZzKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLyoqIEFwcGxpZXMgdHJhbnNsYXRpb24gdG8gdmVjdG9yICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSxWZWN0b3JUeXBlPjo6dHlwZQorICBvcGVyYXRvciogKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHZlYykgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMgKyB2ZWMuZGVyaXZlZCgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHRyYW5zbGF0aW9uIChvcHBvc2l0ZSkgKi8KKyAgVHJhbnNsYXRpb24gaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIFRyYW5zbGF0aW9uKC1tX2NvZWZmcyk7IH0KKworICBUcmFuc2xhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zbGF0aW9uJiBvdGhlcikKKyAgeworICAgIG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFRyYW5zbGF0aW9uIElkZW50aXR5KCkgeyByZXR1cm4gVHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6WmVybygpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFRyYW5zbGF0aW9uLFRyYW5zbGF0aW9uPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7IHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2xhdGlvbixUcmFuc2xhdGlvbjxOZXdTY2FsYXJUeXBlLERpbT4gPjo6dHlwZSgqdGhpcyk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgZXhwbGljaXQgVHJhbnNsYXRpb24oY29uc3QgVHJhbnNsYXRpb248T3RoZXJTY2FsYXJUeXBlLERpbT4mIG90aGVyKQorICB7IG1fY29lZmZzID0gb3RoZXIudmVjdG9yKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7IH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgaXNBcHByb3goY29uc3QgVHJhbnNsYXRpb24mIG90aGVyLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMuaXNBcHByb3gob3RoZXIubV9jb2VmZnMsIHByZWMpOyB9CisKK307CisKKy8qKiBcYWRkdG9ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KKy8vQHsKK3R5cGVkZWYgVHJhbnNsYXRpb248ZmxvYXQsIDI+IFRyYW5zbGF0aW9uMmY7Cit0eXBlZGVmIFRyYW5zbGF0aW9uPGRvdWJsZSwyPiBUcmFuc2xhdGlvbjJkOwordHlwZWRlZiBUcmFuc2xhdGlvbjxmbG9hdCwgMz4gVHJhbnNsYXRpb24zZjsKK3R5cGVkZWYgVHJhbnNsYXRpb248ZG91YmxlLDM+IFRyYW5zbGF0aW9uM2Q7CisvL0B9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSB0eXBlbmFtZSBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPjo6QWZmaW5lVHJhbnNmb3JtVHlwZQorVHJhbnNsYXRpb248U2NhbGFyLERpbT46Om9wZXJhdG9yKiAoY29uc3QgVW5pZm9ybVNjYWxpbmc8U2NhbGFyPiYgb3RoZXIpIGNvbnN0Cit7CisgIEFmZmluZVRyYW5zZm9ybVR5cGUgcmVzOworICByZXMubWF0cml4KCkuc2V0WmVybygpOworICByZXMubGluZWFyKCkuZGlhZ29uYWwoKS5maWxsKG90aGVyLmZhY3RvcigpKTsKKyAgcmVzLnRyYW5zbGF0aW9uKCkgPSBtX2NvZWZmczsKKyAgcmVzKERpbSxEaW0pID0gU2NhbGFyKDEpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgdHlwZW5hbWUgVHJhbnNsYXRpb248U2NhbGFyLERpbT46OkFmZmluZVRyYW5zZm9ybVR5cGUKK1RyYW5zbGF0aW9uPFNjYWxhcixEaW0+OjpvcGVyYXRvciogKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBsaW5lYXIpIGNvbnN0Cit7CisgIEFmZmluZVRyYW5zZm9ybVR5cGUgcmVzOworICByZXMubWF0cml4KCkuc2V0WmVybygpOworICByZXMubGluZWFyKCkgPSBsaW5lYXIuZGVyaXZlZCgpOworICByZXMudHJhbnNsYXRpb24oKSA9IG1fY29lZmZzOworICByZXMubWF0cml4KCkucm93KERpbSkuc2V0WmVybygpOworICByZXMoRGltLERpbSkgPSBTY2FsYXIoMSk7CisgIHJldHVybiByZXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJBTlNMQVRJT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L1VtZXlhbWEuaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9VbWV5YW1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5MzNmYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9VbWV5YW1hLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVU1FWUFNQV9ICisjZGVmaW5lIEVJR0VOX1VNRVlBTUFfSAorCisvLyBUaGlzIGZpbGUgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaW5jbHVkZSAKKy8vICogRWlnZW4vQ29yZQorLy8gKiBFaWdlbi9MVSAKKy8vICogRWlnZW4vU1ZECisvLyAqIEVpZ2VuL0FycmF5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKy8vIFRoZXNlIGhlbHBlcnMgYXJlIHJlcXVpcmVkIHNpbmNlIGl0IGFsbG93cyB0byB1c2UgbWl4ZWQgdHlwZXMgYXMgcGFyYW1ldGVycworLy8gZm9yIHRoZSBVbWV5YW1hLiBUaGUgcHJvYmxlbSB3aXRoIG1peGVkIHBhcmFtZXRlcnMgaXMgdGhhdCB0aGUgcmV0dXJuIHR5cGUKKy8vIGNhbm5vdCB0cml2aWFsbHkgYmUgZGVkdWNlZCB3aGVuIGZsb2F0IGFuZCBkb3VibGUgdHlwZXMgYXJlIG1peGVkLgorbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQ29tcGlsZSB0aW1lIHJldHVybiB0eXBlIGRlZHVjdGlvbiBmb3IgZGlmZmVyZW50IE1hdHJpeEJhc2UgdHlwZXMuCisvLyBEaWZmZXJlbnQgbWVhbnMgaGVyZSBkaWZmZXJlbnQgYWxpZ25tZW50IGFuZCBwYXJhbWV0ZXJzIGJ1dCB0aGUgc2FtZSB1bmRlcmx5aW5nCisvLyByZWFsIHNjYWxhciB0eXBlLgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3RoZXJNYXRyaXhUeXBlPgorc3RydWN0IHVtZXlhbWFfdHJhbnNmb3JtX21hdHJpeF90eXBlCit7CisgIGVudW0geworICAgIE1pblJvd3NBdENvbXBpbGVUaW1lID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE90aGVyTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpLAorCisgICAgLy8gV2hlbiBwb3NzaWJsZSB3ZSB3YW50IHRvIGNob29zZSBzb21lIHNtYWxsIGZpeGVkIHNpemUgdmFsdWUgc2luY2UgdGhlIHJlc3VsdAorICAgIC8vIGlzIGxpa2VseSB0byBmaXQgb24gdGhlIHN0YWNrLiBTbyBoZXJlLCBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyBpcyBub3Qgd2hhdCB3ZSB3YW50LgorICAgIEhvbW9nZW5lb3VzRGltZW5zaW9uID0gaW50KE1pblJvd3NBdENvbXBpbGVUaW1lKSA9PSBEeW5hbWljID8gRHluYW1pYyA6IGludChNaW5Sb3dzQXRDb21waWxlVGltZSkrMQorICB9OworCisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyLAorICAgIEhvbW9nZW5lb3VzRGltZW5zaW9uLAorICAgIEhvbW9nZW5lb3VzRGltZW5zaW9uLAorICAgIEF1dG9BbGlnbiB8ICh0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yKSwKKyAgICBIb21vZ2VuZW91c0RpbWVuc2lvbiwKKyAgICBIb21vZ2VuZW91c0RpbWVuc2lvbgorICA+IHR5cGU7Cit9OworCit9CisKKyNlbmRpZgorCisvKioKKyogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyoKKyogXGJyaWVmIFJldHVybnMgdGhlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdHdvIHBvaW50IHNldHMuCisqCisqIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb246CisqICJMZWFzdC1zcXVhcmVzIGVzdGltYXRpb24gb2YgdHJhbnNmb3JtYXRpb24gcGFyYW1ldGVycyBiZXR3ZWVuIHR3byBwb2ludCBwYXR0ZXJucyIsCisqIFNoaW5qaSBVbWV5YW1hLCBQQU1JIDE5OTEsIERPSTogMTAuMTEwOS8zNC44ODU3MworKgorKiBJdCBlc3RpbWF0ZXMgcGFyYW1ldGVycyBcZiQgYywgXG1hdGhiZntSfSwgXGYkIGFuZCBcZiQgXG1hdGhiZnt0fSBcZiQgc3VjaCB0aGF0CisqIFxme2FsaWduKn0KKyogICBcZnJhY3sxfXtufSBcc3VtX3tpPTF9Xm4gXHZlcnRcdmVydCB5X2kgLSAoY1xtYXRoYmZ7Un14X2kgKyBcbWF0aGJme3R9KSBcdmVydFx2ZXJ0XzJeMgorKiBcZn0KKyogaXMgbWluaW1pemVkLgorKgorKiBUaGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBhbmFseXNpcyBvZiB0aGUgY292YXJpYW5jZSBtYXRyaXgKKyogXGYkIFxTaWdtYV97XG1hdGhiZnt4fVxtYXRoYmZ7eX19IFxpbiBcbWF0aGJie1J9XntkIFx0aW1lcyBkfSBcZiQKKyogb2YgdGhlIGlucHV0IHBvaW50IHNldHMgXGYkIFxtYXRoYmZ7eH0gXGYkIGFuZCBcZiQgXG1hdGhiZnt5fSBcZiQgd2hlcmUgCisqIFxmJGRcZiQgaXMgY29ycmVzcG9uZGluZyB0byB0aGUgZGltZW5zaW9uICh3aGljaCBpcyB0eXBpY2FsbHkgc21hbGwpLgorKiBUaGUgYW5hbHlzaXMgaXMgaW52b2x2aW5nIHRoZSBTVkQgaGF2aW5nIGEgY29tcGxleGl0eSBvZiBcZiRPKGReMylcZiQKKyogdGhvdWdoIHRoZSBhY3R1YWwgY29tcHV0YXRpb25hbCBlZmZvcnQgbGllcyBpbiB0aGUgY292YXJpYW5jZQorKiBtYXRyaXggY29tcHV0YXRpb24gd2hpY2ggaGFzIGFuIGFzeW1wdG90aWMgbG93ZXIgYm91bmQgb2YgXGYkTyhkbSlcZiQgd2hlbiAKKyogdGhlIGlucHV0IHBvaW50IHNldHMgaGF2ZSBkaW1lbnNpb24gXGYkZCBcdGltZXMgbVxmJC4KKyoKKyogQ3VycmVudGx5IHRoZSBtZXRob2QgaXMgd29ya2luZyBvbmx5IGZvciBmbG9hdGluZyBwb2ludCBtYXRyaWNlcy4KKyoKKyogXHRvZG8gU2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiB1bWV5YW1hKCkgYmVjb21lIGEgVHJhbnNmb3JtPworKgorKiBccGFyYW0gc3JjIFNvdXJjZSBwb2ludHMgXGYkIFxtYXRoYmZ7eH0gPSBcbGVmdCggeF8xLCBcaGRvdHMsIHhfbiBccmlnaHQpIFxmJC4KKyogXHBhcmFtIGRzdCBEZXN0aW5hdGlvbiBwb2ludHMgXGYkIFxtYXRoYmZ7eX0gPSBcbGVmdCggeV8xLCBcaGRvdHMsIHlfbiBccmlnaHQpIFxmJC4KKyogXHBhcmFtIHdpdGhfc2NhbGluZyBTZXRzIFxmJCBjPTEgXGYkIHdoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHBhc3NlZC4KKyogXHJldHVybiBUaGUgaG9tb2dlbmVvdXMgdHJhbnNmb3JtYXRpb24gCisqIFxme2FsaWduKn0KKyogICBUID0gXGJlZ2lue2JtYXRyaXh9IGNcbWF0aGJme1J9ICYgXG1hdGhiZnt0fSBcXCBcbWF0aGJmezB9ICYgMSBcZW5ke2JtYXRyaXh9CisqIFxmfQorKiBtaW5pbWl6aW5nIHRoZSByZXN1ZGl1YWwgYWJvdmUuIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgYWx3YXlzIHJldHVybmVkIGFzIGFuIAorKiBFaWdlbjo6TWF0cml4LgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dW1leWFtYV90cmFuc2Zvcm1fbWF0cml4X3R5cGU8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6dHlwZQordW1leWFtYShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBzcmMsIGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgZHN0LCBib29sIHdpdGhfc2NhbGluZyA9IHRydWUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnVtZXlhbWFfdHJhbnNmb3JtX21hdHJpeF90eXBlPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnR5cGUgVHJhbnNmb3JtYXRpb25NYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJhbnNmb3JtYXRpb25NYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsIE5VTUVSSUNfVFlQRV9NVVNUX0JFX1JFQUwpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpTY2FsYXI+Ojp2YWx1ZSksCisgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisKKyAgZW51bSB7IERpbWVuc2lvbiA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLCBPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSB9OworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltZW5zaW9uLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbWVuc2lvbiwgRGltZW5zaW9uPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZV9yb3dfbWFqb3I8RGVyaXZlZD46OnR5cGUgUm93TWFqb3JNYXRyaXhUeXBlOworCisgIGNvbnN0IEluZGV4IG0gPSBzcmMucm93cygpOyAvLyBkaW1lbnNpb24KKyAgY29uc3QgSW5kZXggbiA9IHNyYy5jb2xzKCk7IC8vIG51bWJlciBvZiBtZWFzdXJlbWVudHMKKworICAvLyByZXF1aXJlZCBmb3IgZGVtZWFuaW5nIC4uLgorICBjb25zdCBSZWFsU2NhbGFyIG9uZV9vdmVyX24gPSBSZWFsU2NhbGFyKDEpIC8gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4obik7CisKKyAgLy8gY29tcHV0YXRpb24gb2YgbWVhbgorICBjb25zdCBWZWN0b3JUeXBlIHNyY19tZWFuID0gc3JjLnJvd3dpc2UoKS5zdW0oKSAqIG9uZV9vdmVyX247CisgIGNvbnN0IFZlY3RvclR5cGUgZHN0X21lYW4gPSBkc3Qucm93d2lzZSgpLnN1bSgpICogb25lX292ZXJfbjsKKworICAvLyBkZW1lYW5pbmcgb2Ygc3JjIGFuZCBkc3QgcG9pbnRzCisgIGNvbnN0IFJvd01ham9yTWF0cml4VHlwZSBzcmNfZGVtZWFuID0gc3JjLmNvbHdpc2UoKSAtIHNyY19tZWFuOworICBjb25zdCBSb3dNYWpvck1hdHJpeFR5cGUgZHN0X2RlbWVhbiA9IGRzdC5jb2x3aXNlKCkgLSBkc3RfbWVhbjsKKworICAvLyBFcS4gKDM2KS0oMzcpCisgIGNvbnN0IFNjYWxhciBzcmNfdmFyID0gc3JjX2RlbWVhbi5yb3d3aXNlKCkuc3F1YXJlZE5vcm0oKS5zdW0oKSAqIG9uZV9vdmVyX247CisKKyAgLy8gRXEuICgzOCkKKyAgY29uc3QgTWF0cml4VHlwZSBzaWdtYSA9IG9uZV9vdmVyX24gKiBkc3RfZGVtZWFuICogc3JjX2RlbWVhbi50cmFuc3Bvc2UoKTsKKworICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gc3ZkKHNpZ21hLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworCisgIC8vIEluaXRpYWxpemUgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1hdGlvbiB3aXRoIGFuIGlkZW50aXR5IG1hdHJpeC4uLgorICBUcmFuc2Zvcm1hdGlvbk1hdHJpeFR5cGUgUnQgPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeFR5cGU6OklkZW50aXR5KG0rMSxtKzEpOworCisgIC8vIEVxLiAoMzkpCisgIFZlY3RvclR5cGUgUyA9IFZlY3RvclR5cGU6Ok9uZXMobSk7CisKKyAgaWYgICggc3ZkLm1hdHJpeFUoKS5kZXRlcm1pbmFudCgpICogc3ZkLm1hdHJpeFYoKS5kZXRlcm1pbmFudCgpIDwgMCApCisgICAgUyhtLTEpID0gLTE7CisKKyAgLy8gRXEuICg0MCkgYW5kICg0MykKKyAgUnQuYmxvY2soMCwwLG0sbSkubm9hbGlhcygpID0gc3ZkLm1hdHJpeFUoKSAqIFMuYXNEaWFnb25hbCgpICogc3ZkLm1hdHJpeFYoKS50cmFuc3Bvc2UoKTsKKworICBpZiAod2l0aF9zY2FsaW5nKQorICB7CisgICAgLy8gRXEuICg0MikKKyAgICBjb25zdCBTY2FsYXIgYyA9IFNjYWxhcigxKS9zcmNfdmFyICogc3ZkLnNpbmd1bGFyVmFsdWVzKCkuZG90KFMpOworCisgICAgLy8gRXEuICg0MSkKKyAgICBSdC5jb2wobSkuaGVhZChtKSA9IGRzdF9tZWFuOworICAgIFJ0LmNvbChtKS5oZWFkKG0pLm5vYWxpYXMoKSAtPSBjKlJ0LnRvcExlZnRDb3JuZXIobSxtKSpzcmNfbWVhbjsKKyAgICBSdC5ibG9jaygwLDAsbSxtKSAqPSBjOworICB9CisgIGVsc2UKKyAgeworICAgIFJ0LmNvbChtKS5oZWFkKG0pID0gZHN0X21lYW47CisgICAgUnQuY29sKG0pLmhlYWQobSkubm9hbGlhcygpIC09IFJ0LnRvcExlZnRDb3JuZXIobSxtKSpzcmNfbWVhbjsKKyAgfQorCisgIHJldHVybiBSdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9VTUVZQU1BX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9hcmNoL0dlb21ldHJ5X1NTRS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L2FyY2gvR2VvbWV0cnlfU1NFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4Y2FiNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9hcmNoL0dlb21ldHJ5X1NTRS5oCkBAIC0wLDAgKzEsMTYxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBSb2hpdCBHYXJnIDxycGcuMzE0QGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU9NRVRSWV9TU0VfSAorI2RlZmluZSBFSUdFTl9HRU9NRVRSWV9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgT3RoZXJEZXJpdmVkPgorc3RydWN0IHF1YXRfcHJvZHVjdDxBcmNoaXRlY3R1cmU6OlNTRSwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBmbG9hdD4KK3sKKyAgZW51bSB7CisgICAgQUFsaWdubWVudCA9IHRyYWl0czxEZXJpdmVkPjo6QWxpZ25tZW50LAorICAgIEJBbGlnbm1lbnQgPSB0cmFpdHM8T3RoZXJEZXJpdmVkPjo6QWxpZ25tZW50LAorICAgIFJlc0FsaWdubWVudCA9IHRyYWl0czxRdWF0ZXJuaW9uPGZsb2F0PiA+OjpBbGlnbm1lbnQKKyAgfTsKKyAgc3RhdGljIGlubGluZSBRdWF0ZXJuaW9uPGZsb2F0PiBydW4oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIF9hLCBjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBfYikKKyAgeworICAgIFF1YXRlcm5pb248ZmxvYXQ+IHJlczsKKyAgICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9zZXRyX3BzKDAuZiwwLmYsMC5mLC0wLmYpOworICAgIF9fbTEyOCBhID0gX2EuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEFBbGlnbm1lbnQ+KDApOworICAgIF9fbTEyOCBiID0gX2IuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEJBbGlnbm1lbnQ+KDApOworICAgIF9fbTEyOCBzMSA9IF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYSwxLDIsMCwyKSx2ZWM0Zl9zd2l6emxlMShiLDIsMCwxLDIpKTsKKyAgICBfX20xMjggczIgPSBfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEsMywzLDMsMSksdmVjNGZfc3dpenpsZTEoYiwwLDEsMiwxKSk7CisgICAgcHN0b3JldDxmbG9hdCxQYWNrZXQ0ZixSZXNBbGlnbm1lbnQ+KAorICAgICAgICAgICAgICAmcmVzLngoKSwKKyAgICAgICAgICAgICAgX21tX2FkZF9wcyhfbW1fc3ViX3BzKF9tbV9tdWxfcHMoYSx2ZWM0Zl9zd2l6emxlMShiLDMsMywzLDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYSwyLDAsMSwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYiwxLDIsMCwwKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV94b3JfcHMobWFzayxfbW1fYWRkX3BzKHMxLHMyKSkpKTsKKyAgICAKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorc3RydWN0IHF1YXRfY29uajxBcmNoaXRlY3R1cmU6OlNTRSwgRGVyaXZlZCwgZmxvYXQ+Cit7CisgIGVudW0geworICAgIFJlc0FsaWdubWVudCA9IHRyYWl0czxRdWF0ZXJuaW9uPGZsb2F0PiA+OjpBbGlnbm1lbnQKKyAgfTsKKyAgc3RhdGljIGlubGluZSBRdWF0ZXJuaW9uPGZsb2F0PiBydW4oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIHEpCisgIHsKKyAgICBRdWF0ZXJuaW9uPGZsb2F0PiByZXM7CisgICAgY29uc3QgX19tMTI4IG1hc2sgPSBfbW1fc2V0cl9wcygtMC5mLC0wLmYsLTAuZiwwLmYpOworICAgIHBzdG9yZXQ8ZmxvYXQsUGFja2V0NGYsUmVzQWxpZ25tZW50PigmcmVzLngoKSwgX21tX3hvcl9wcyhtYXNrLCBxLmNvZWZmcygpLnRlbXBsYXRlIHBhY2tldDx0cmFpdHM8RGVyaXZlZD46OkFsaWdubWVudD4oMCkpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvckxocyx0eXBlbmFtZSBWZWN0b3JSaHM+CitzdHJ1Y3QgY3Jvc3MzX2ltcGw8QXJjaGl0ZWN0dXJlOjpTU0UsVmVjdG9yTGhzLFZlY3RvclJocyxmbG9hdCx0cnVlPgoreworICBlbnVtIHsKKyAgICBSZXNBbGlnbm1lbnQgPSB0cmFpdHM8dHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGU8VmVjdG9yTGhzPjo6dHlwZT46OkFsaWdubWVudAorICB9OworICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlPFZlY3Rvckxocz46OnR5cGUKKyAgcnVuKGNvbnN0IFZlY3RvckxocyYgbGhzLCBjb25zdCBWZWN0b3JSaHMmIHJocykKKyAgeworICAgIF9fbTEyOCBhID0gbGhzLnRlbXBsYXRlIHBhY2tldDx0cmFpdHM8VmVjdG9yTGhzPjo6QWxpZ25tZW50PigwKTsKKyAgICBfX20xMjggYiA9IHJocy50ZW1wbGF0ZSBwYWNrZXQ8dHJhaXRzPFZlY3RvclJocz46OkFsaWdubWVudD4oMCk7CisgICAgX19tMTI4IG11bDE9X21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLDEsMiwwLDMpLHZlYzRmX3N3aXp6bGUxKGIsMiwwLDEsMykpOworICAgIF9fbTEyOCBtdWwyPV9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYSwyLDAsMSwzKSx2ZWM0Zl9zd2l6emxlMShiLDEsMiwwLDMpKTsKKyAgICB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxWZWN0b3JMaHM+Ojp0eXBlIHJlczsKKyAgICBwc3RvcmV0PGZsb2F0LFBhY2tldDRmLFJlc0FsaWdubWVudD4oJnJlcy54KCksX21tX3N1Yl9wcyhtdWwxLG11bDIpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCisKKworCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkLCBjbGFzcyBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgcXVhdF9wcm9kdWN0PEFyY2hpdGVjdHVyZTo6U1NFLCBEZXJpdmVkLCBPdGhlckRlcml2ZWQsIGRvdWJsZT4KK3sKKyAgZW51bSB7CisgICAgQkFsaWdubWVudCA9IHRyYWl0czxPdGhlckRlcml2ZWQ+OjpBbGlnbm1lbnQsCisgICAgUmVzQWxpZ25tZW50ID0gdHJhaXRzPFF1YXRlcm5pb248ZG91YmxlPiA+OjpBbGlnbm1lbnQKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIFF1YXRlcm5pb248ZG91YmxlPiBydW4oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIF9hLCBjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBfYikKKyAgeworICBjb25zdCBQYWNrZXQyZCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fc2V0X2VwaTMyKDB4MCwweDAsMHg4MDAwMDAwMCwweDApKTsKKworICBRdWF0ZXJuaW9uPGRvdWJsZT4gcmVzOworCisgIGNvbnN0IGRvdWJsZSogYSA9IF9hLmNvZWZmcygpLmRhdGEoKTsKKyAgUGFja2V0MmQgYl94eSA9IF9iLmNvZWZmcygpLnRlbXBsYXRlIHBhY2tldDxCQWxpZ25tZW50PigwKTsKKyAgUGFja2V0MmQgYl96dyA9IF9iLmNvZWZmcygpLnRlbXBsYXRlIHBhY2tldDxCQWxpZ25tZW50PigyKTsKKyAgUGFja2V0MmQgYV94eCA9IHBzZXQxPFBhY2tldDJkPihhWzBdKTsKKyAgUGFja2V0MmQgYV95eSA9IHBzZXQxPFBhY2tldDJkPihhWzFdKTsKKyAgUGFja2V0MmQgYV96eiA9IHBzZXQxPFBhY2tldDJkPihhWzJdKTsKKyAgUGFja2V0MmQgYV93dyA9IHBzZXQxPFBhY2tldDJkPihhWzNdKTsKKworICAvLyB0d28gdGVtcG9yYXJpZXM6CisgIFBhY2tldDJkIHQxLCB0MjsKKworICAvKgorICAgKiB0MSA9IHd3Knh5ICsgeXkqencKKyAgICogdDIgPSB6eip4eSAtIHh4Knp3CisgICAqIHJlcy54eSA9IHQxICsvLSBzd2FwKHQyKQorICAgKi8KKyAgdDEgPSBwYWRkKHBtdWwoYV93dywgYl94eSksIHBtdWwoYV95eSwgYl96dykpOworICB0MiA9IHBzdWIocG11bChhX3p6LCBiX3h5KSwgcG11bChhX3h4LCBiX3p3KSk7CisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG1hc2spCisgIHBzdG9yZXQ8ZG91YmxlLFBhY2tldDJkLFJlc0FsaWdubWVudD4oJnJlcy54KCksIF9tbV9hZGRzdWJfcGQodDEsIHByZXZlcnNlKHQyKSkpOworI2Vsc2UKKyAgcHN0b3JldDxkb3VibGUsUGFja2V0MmQsUmVzQWxpZ25tZW50PigmcmVzLngoKSwgcGFkZCh0MSwgcHhvcihtYXNrLHByZXZlcnNlKHQyKSkpKTsKKyNlbmRpZgorICAKKyAgLyoKKyAgICogdDEgPSB3dyp6dyAtIHl5Knh5CisgICAqIHQyID0genoqencgKyB4eCp4eQorICAgKiByZXMuencgPSB0MSAtLysgc3dhcCh0MikgPSBzd2FwKCBzd2FwKHQxKSArLy0gdDIpCisgICAqLworICB0MSA9IHBzdWIocG11bChhX3d3LCBiX3p3KSwgcG11bChhX3l5LCBiX3h5KSk7CisgIHQyID0gcGFkZChwbXVsKGFfenosIGJfencpLCBwbXVsKGFfeHgsIGJfeHkpKTsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobWFzaykKKyAgcHN0b3JldDxkb3VibGUsUGFja2V0MmQsUmVzQWxpZ25tZW50PigmcmVzLnooKSwgcHJldmVyc2UoX21tX2FkZHN1Yl9wZChwcmV2ZXJzZSh0MSksIHQyKSkpOworI2Vsc2UKKyAgcHN0b3JldDxkb3VibGUsUGFja2V0MmQsUmVzQWxpZ25tZW50PigmcmVzLnooKSwgcHN1Yih0MSwgcHhvcihtYXNrLHByZXZlcnNlKHQyKSkpKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorc3RydWN0IHF1YXRfY29uajxBcmNoaXRlY3R1cmU6OlNTRSwgRGVyaXZlZCwgZG91YmxlPgoreworICBlbnVtIHsKKyAgICBSZXNBbGlnbm1lbnQgPSB0cmFpdHM8UXVhdGVybmlvbjxkb3VibGU+ID46OkFsaWdubWVudAorICB9OworICBzdGF0aWMgaW5saW5lIFF1YXRlcm5pb248ZG91YmxlPiBydW4oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIHEpCisgIHsKKyAgICBRdWF0ZXJuaW9uPGRvdWJsZT4gcmVzOworICAgIGNvbnN0IF9fbTEyOGQgbWFzazAgPSBfbW1fc2V0cl9wZCgtMC4sLTAuKTsKKyAgICBjb25zdCBfX20xMjhkIG1hc2syID0gX21tX3NldHJfcGQoLTAuLDAuKTsKKyAgICBwc3RvcmV0PGRvdWJsZSxQYWNrZXQyZCxSZXNBbGlnbm1lbnQ+KCZyZXMueCgpLCBfbW1feG9yX3BkKG1hc2swLCBxLmNvZWZmcygpLnRlbXBsYXRlIHBhY2tldDx0cmFpdHM8RGVyaXZlZD46OkFsaWdubWVudD4oMCkpKTsKKyAgICBwc3RvcmV0PGRvdWJsZSxQYWNrZXQyZCxSZXNBbGlnbm1lbnQ+KCZyZXMueigpLCBfbW1feG9yX3BkKG1hc2syLCBxLmNvZWZmcygpLnRlbXBsYXRlIHBhY2tldDx0cmFpdHM8RGVyaXZlZD46OkFsaWdubWVudD4oMikpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9HRU9NRVRSWV9TU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0Jsb2NrSG91c2Vob2xkZXIuaCBiL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9CbG9ja0hvdXNlaG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhN2VkMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9CbG9ja0hvdXNlaG9sZGVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIFZpbmNlbnQgTGVqZXVuZQorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CTE9DS19IT1VTRUhPTERFUl9ICisjZGVmaW5lIEVJR0VOX0JMT0NLX0hPVVNFSE9MREVSX0gKKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgaGVscGVyIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCBibG9jayBob3VzZWhvbGRlciByZWZsZWN0b3JzCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKKy8qKiBcaW50ZXJuYWwgKi8KKy8vIHRlbXBsYXRlPHR5cGVuYW1lIFRyaWFuZ3VsYXJGYWN0b3JUeXBlLHR5cGVuYW1lIFZlY3RvcnNUeXBlLHR5cGVuYW1lIENvZWZmc1R5cGU+CisvLyB2b2lkIG1ha2VfYmxvY2tfaG91c2Vob2xkZXJfdHJpYW5ndWxhcl9mYWN0b3IoVHJpYW5ndWxhckZhY3RvclR5cGUmIHRyaUZhY3RvciwgY29uc3QgVmVjdG9yc1R5cGUmIHZlY3RvcnMsIGNvbnN0IENvZWZmc1R5cGUmIGhDb2VmZnMpCisvLyB7CisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yc1R5cGU6OlNjYWxhciBTY2FsYXI7CisvLyAgIGNvbnN0IEluZGV4IG5iVmVjcyA9IHZlY3RvcnMuY29scygpOworLy8gICBlaWdlbl9hc3NlcnQodHJpRmFjdG9yLnJvd3MoKSA9PSBuYlZlY3MgJiYgdHJpRmFjdG9yLmNvbHMoKSA9PSBuYlZlY3MgJiYgdmVjdG9ycy5yb3dzKCk+PW5iVmVjcyk7CisvLyAKKy8vICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbmJWZWNzOyBpKyspCisvLyAgIHsKKy8vICAgICBJbmRleCBycyA9IHZlY3RvcnMucm93cygpIC0gaTsKKy8vICAgICAvLyBXYXJuaW5nLCBub3RlIHRoYXQgaENvZWZmcyBtYXkgYWxpYXMgd2l0aCB2ZWN0b3JzLgorLy8gICAgIC8vIEl0IGlzIHRoZW4gbmVjZXNzYXJ5IHRvIGNvcHkgaXQgYmVmb3JlIG1vZGlmeWluZyB2ZWN0b3JzKGksaSkuIAorLy8gICAgIHR5cGVuYW1lIENvZWZmc1R5cGU6OlNjYWxhciBoID0gaENvZWZmcyhpKTsKKy8vICAgICAvLyBUaGlzIGhhY2sgcGVybWl0cyB0byBwYXNzIHRyb3VnaCBuZXN0ZWQgQmxvY2s8PiBhbmQgVHJhbnNwb3NlPD4gZXhwcmVzc2lvbnMuCisvLyAgICAgU2NhbGFyICpWaWlfcHRyID0gY29uc3RfY2FzdDxTY2FsYXIqPih2ZWN0b3JzLmRhdGEoKSArIHZlY3RvcnMub3V0ZXJTdHJpZGUoKSppICsgdmVjdG9ycy5pbm5lclN0cmlkZSgpKmkpOworLy8gICAgIFNjYWxhciBWaWkgPSAqVmlpX3B0cjsKKy8vICAgICAqVmlpX3B0ciA9IFNjYWxhcigxKTsKKy8vICAgICB0cmlGYWN0b3IuY29sKGkpLmhlYWQoaSkubm9hbGlhcygpID0gLWggKiB2ZWN0b3JzLmJsb2NrKGksIDAsIHJzLCBpKS5hZGpvaW50KCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmVjdG9ycy5jb2woaSkudGFpbChycyk7CisvLyAgICAgKlZpaV9wdHIgPSBWaWk7CisvLyAgICAgLy8gRklYTUUgYWRkIC5ub2FsaWFzKCkgb25jZSB0aGUgdHJpYW5ndWxhciBwcm9kdWN0IGNhbiB3b3JrIGlucGxhY2UKKy8vICAgICB0cmlGYWN0b3IuY29sKGkpLmhlYWQoaSkgPSB0cmlGYWN0b3IuYmxvY2soMCwwLGksaSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0cmlGYWN0b3IuY29sKGkpLmhlYWQoaSk7CisvLyAgICAgdHJpRmFjdG9yKGksaSkgPSBoQ29lZmZzKGkpOworLy8gICB9CisvLyB9CisKKy8qKiBcaW50ZXJuYWwgKi8KKy8vIFRoaXMgdmFyaWFudCBhdm9pZCBtb2RpZmljYXRpb25zIGluIHZlY3RvcnMKK3RlbXBsYXRlPHR5cGVuYW1lIFRyaWFuZ3VsYXJGYWN0b3JUeXBlLHR5cGVuYW1lIFZlY3RvcnNUeXBlLHR5cGVuYW1lIENvZWZmc1R5cGU+Cit2b2lkIG1ha2VfYmxvY2tfaG91c2Vob2xkZXJfdHJpYW5ndWxhcl9mYWN0b3IoVHJpYW5ndWxhckZhY3RvclR5cGUmIHRyaUZhY3RvciwgY29uc3QgVmVjdG9yc1R5cGUmIHZlY3RvcnMsIGNvbnN0IENvZWZmc1R5cGUmIGhDb2VmZnMpCit7CisgIGNvbnN0IEluZGV4IG5iVmVjcyA9IHZlY3RvcnMuY29scygpOworICBlaWdlbl9hc3NlcnQodHJpRmFjdG9yLnJvd3MoKSA9PSBuYlZlY3MgJiYgdHJpRmFjdG9yLmNvbHMoKSA9PSBuYlZlY3MgJiYgdmVjdG9ycy5yb3dzKCk+PW5iVmVjcyk7CisKKyAgZm9yKEluZGV4IGkgPSBuYlZlY3MtMTsgaSA+PTAgOyAtLWkpCisgIHsKKyAgICBJbmRleCBycyA9IHZlY3RvcnMucm93cygpIC0gaSAtIDE7CisgICAgSW5kZXggcnQgPSBuYlZlY3MtaS0xOworCisgICAgaWYocnQ+MCkKKyAgICB7CisgICAgICB0cmlGYWN0b3Iucm93KGkpLnRhaWwocnQpLm5vYWxpYXMoKSA9IC1oQ29lZmZzKGkpICogdmVjdG9ycy5jb2woaSkudGFpbChycykuYWRqb2ludCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmVjdG9ycy5ib3R0b21SaWdodENvcm5lcihycywgcnQpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKTsKKyAgICAgICAgICAgIAorICAgICAgLy8gRklYTUUgYWRkIC5ub2FsaWFzKCkgb25jZSB0aGUgdHJpYW5ndWxhciBwcm9kdWN0IGNhbiB3b3JrIGlucGxhY2UKKyAgICAgIHRyaUZhY3Rvci5yb3coaSkudGFpbChydCkgPSB0cmlGYWN0b3Iucm93KGkpLnRhaWwocnQpICogdHJpRmFjdG9yLmJvdHRvbVJpZ2h0Q29ybmVyKHJ0LHJ0KS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICAgIAorICAgIH0KKyAgICB0cmlGYWN0b3IoaSxpKSA9IGhDb2VmZnMoaSk7CisgIH0KK30KKworLyoqIFxpbnRlcm5hbAorICAqIGlmIGZvcndhcmQgdGhlbiBwZXJmb3JtICAgbWF0ID0gSDAgKiBIMSAqIEgyICogbWF0CisgICogb3RoZXJ3aXNlIHBlcmZvcm0gICAgICAgICBtYXQgPSBIMiAqIEgxICogSDAgKiBtYXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdHlwZW5hbWUgVmVjdG9yc1R5cGUsdHlwZW5hbWUgQ29lZmZzVHlwZT4KK3ZvaWQgYXBwbHlfYmxvY2tfaG91c2Vob2xkZXJfb25fdGhlX2xlZnQoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JzVHlwZSYgdmVjdG9ycywgY29uc3QgQ29lZmZzVHlwZSYgaENvZWZmcywgYm9vbCBmb3J3YXJkKQoreworICBlbnVtIHsgVEZhY3RvclNpemUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OworICBJbmRleCBuYlZlY3MgPSB2ZWN0b3JzLmNvbHMoKTsKKyAgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgVEZhY3RvclNpemUsIFRGYWN0b3JTaXplLCBSb3dNYWpvcj4gVChuYlZlY3MsbmJWZWNzKTsKKyAgCisgIGlmKGZvcndhcmQpIG1ha2VfYmxvY2tfaG91c2Vob2xkZXJfdHJpYW5ndWxhcl9mYWN0b3IoVCwgdmVjdG9ycywgaENvZWZmcyk7CisgIGVsc2UgICAgICAgIG1ha2VfYmxvY2tfaG91c2Vob2xkZXJfdHJpYW5ndWxhcl9mYWN0b3IoVCwgdmVjdG9ycywgaENvZWZmcy5jb25qdWdhdGUoKSk7ICAKKyAgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgVmVjdG9yc1R5cGUsIFVuaXRMb3dlcj4gVih2ZWN0b3JzKTsKKworICAvLyBBIC09IFYgVCBWXiogQQorICBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLFZlY3RvcnNUeXBlOjpDb2xzQXRDb21waWxlVGltZSxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgIChWZWN0b3JzVHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEgJiYgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUhPTEpP1Jvd01ham9yOkNvbE1ham9yLAorICAgICAgICAgVmVjdG9yc1R5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPiB0bXAgPSBWLmFkam9pbnQoKSAqIG1hdDsKKyAgLy8gRklYTUUgYWRkIC5ub2FsaWFzKCkgb25jZSB0aGUgdHJpYW5ndWxhciBwcm9kdWN0IGNhbiB3b3JrIGlucGxhY2UKKyAgaWYoZm9yd2FyZCkgdG1wID0gVC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAgICAgICAgICAgKiB0bXA7CisgIGVsc2UgICAgICAgIHRtcCA9IFQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuYWRqb2ludCgpICogdG1wOworICBtYXQubm9hbGlhcygpIC09IFYgKiB0bXA7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0JMT0NLX0hPVVNFSE9MREVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9Ib3VzZWhvbGRlci5oIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZTJjMwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9Ib3VzZWhvbGRlci5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSE9VU0VIT0xERVJfSAorI2RlZmluZSBFSUdFTl9IT1VTRUhPTERFUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IG4+IHN0cnVjdCBkZWNyZW1lbnRfc2l6ZQoreworICBlbnVtIHsKKyAgICByZXQgPSBuPT1EeW5hbWljID8gbiA6IG4tMQorICB9OworfTsKK30KKworLyoqIENvbXB1dGVzIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvciBIIHN1Y2ggdGhhdDoKKyAgKiBcZiQgSCAqdGhpcyA9IFsgYmV0YSAwIC4uLiAwXV5UIFxmJAorICAqIHdoZXJlIHRoZSB0cmFuc2Zvcm1hdGlvbiBIIGlzOgorICAqIFxmJCBIID0gSSAtIHRhdSB2IHZeKlxmJAorICAqIGFuZCB0aGUgdmVjdG9yIHYgaXM6CisgICogXGYkIHZeVCA9IFsxIGVzc2VudGlhbF5UXSBcZiQKKyAgKgorICAqIFRoZSBlc3NlbnRpYWwgcGFydCBvZiB0aGUgdmVjdG9yIFxjIHYgaXMgc3RvcmVkIGluICp0aGlzLgorICAqIAorICAqIE9uIG91dHB1dDoKKyAgKiBccGFyYW0gdGF1IHRoZSBzY2FsaW5nIGZhY3RvciBvZiB0aGUgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24KKyAgKiBccGFyYW0gYmV0YSB0aGUgcmVzdWx0IG9mIEggKiBcYyAqdGhpcworICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om1ha2VIb3VzZWhvbGRlcigpLCBNYXRyaXhCYXNlOjphcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KCksCisgICogICAgIE1hdHJpeEJhc2U6OmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46Om1ha2VIb3VzZWhvbGRlckluUGxhY2UoU2NhbGFyJiB0YXUsIFJlYWxTY2FsYXImIGJldGEpCit7CisgIFZlY3RvckJsb2NrPERlcml2ZWQsIGludGVybmFsOjpkZWNyZW1lbnRfc2l6ZTxCYXNlOjpTaXplQXRDb21waWxlVGltZT46OnJldD4gZXNzZW50aWFsUGFydChkZXJpdmVkKCksIDEsIHNpemUoKS0xKTsKKyAgbWFrZUhvdXNlaG9sZGVyKGVzc2VudGlhbFBhcnQsIHRhdSwgYmV0YSk7Cit9CisKKy8qKiBDb21wdXRlcyB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3IgSCBzdWNoIHRoYXQ6CisgICogXGYkIEggKnRoaXMgPSBbIGJldGEgMCAuLi4gMF1eVCBcZiQKKyAgKiB3aGVyZSB0aGUgdHJhbnNmb3JtYXRpb24gSCBpczoKKyAgKiBcZiQgSCA9IEkgLSB0YXUgdiB2XipcZiQKKyAgKiBhbmQgdGhlIHZlY3RvciB2IGlzOgorICAqIFxmJCB2XlQgPSBbMSBlc3NlbnRpYWxeVF0gXGYkCisgICoKKyAgKiBPbiBvdXRwdXQ6CisgICogXHBhcmFtIGVzc2VudGlhbCB0aGUgZXNzZW50aWFsIHBhcnQgb2YgdGhlIHZlY3RvciBcYyB2CisgICogXHBhcmFtIHRhdSB0aGUgc2NhbGluZyBmYWN0b3Igb2YgdGhlIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uCisgICogXHBhcmFtIGJldGEgdGhlIHJlc3VsdCBvZiBIICogXGMgKnRoaXMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjptYWtlSG91c2Vob2xkZXJJblBsYWNlKCksIE1hdHJpeEJhc2U6OmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoKSwKKyAgKiAgICAgTWF0cml4QmFzZTo6YXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEVzc2VudGlhbFBhcnQ+Cit2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46Om1ha2VIb3VzZWhvbGRlcigKKyAgRXNzZW50aWFsUGFydCYgZXNzZW50aWFsLAorICBTY2FsYXImIHRhdSwKKyAgUmVhbFNjYWxhciYgYmV0YSkgY29uc3QKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBudW1leHQ6OmNvbmo7CisgIAorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKEVzc2VudGlhbFBhcnQpCisgIFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIEVzc2VudGlhbFBhcnQ6OlNpemVBdENvbXBpbGVUaW1lPiB0YWlsKGRlcml2ZWQoKSwgMSwgc2l6ZSgpLTEpOworICAKKyAgUmVhbFNjYWxhciB0YWlsU3FOb3JtID0gc2l6ZSgpPT0xID8gUmVhbFNjYWxhcigwKSA6IHRhaWwuc3F1YXJlZE5vcm0oKTsKKyAgU2NhbGFyIGMwID0gY29lZmYoMCk7CisgIGNvbnN0IFJlYWxTY2FsYXIgdG9sID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKTsKKworICBpZih0YWlsU3FOb3JtIDw9IHRvbCAmJiBudW1leHQ6OmFiczIobnVtZXh0OjppbWFnKGMwKSk8PXRvbCkKKyAgeworICAgIHRhdSA9IFJlYWxTY2FsYXIoMCk7CisgICAgYmV0YSA9IG51bWV4dDo6cmVhbChjMCk7CisgICAgZXNzZW50aWFsLnNldFplcm8oKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBiZXRhID0gc3FydChudW1leHQ6OmFiczIoYzApICsgdGFpbFNxTm9ybSk7CisgICAgaWYgKG51bWV4dDo6cmVhbChjMCk+PVJlYWxTY2FsYXIoMCkpCisgICAgICBiZXRhID0gLWJldGE7CisgICAgZXNzZW50aWFsID0gdGFpbCAvIChjMCAtIGJldGEpOworICAgIHRhdSA9IGNvbmooKGJldGEgLSBjMCkgLyBiZXRhKTsKKyAgfQorfQorCisvKiogQXBwbHkgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggZ2l2ZW4gYnkKKyAgKiBcZiQgSCA9IEkgLSB0YXUgdiB2XipcZiQKKyAgKiB3aXRoCisgICogXGYkIHZeVCA9IFsxIGVzc2VudGlhbF5UXSBcZiQKKyAgKiBmcm9tIHRoZSBsZWZ0IHRvIGEgdmVjdG9yIG9yIG1hdHJpeC4KKyAgKgorICAqIE9uIGlucHV0OgorICAqIFxwYXJhbSBlc3NlbnRpYWwgdGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSB2ZWN0b3IgXGMgdgorICAqIFxwYXJhbSB0YXUgdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbgorICAqIFxwYXJhbSB3b3Jrc3BhY2UgYSBwb2ludGVyIHRvIHdvcmtpbmcgc3BhY2Ugd2l0aCBhdCBsZWFzdAorICAqICAgICAgICAgICAgICAgICAgdGhpcy0+Y29scygpICogZXNzZW50aWFsLnNpemUoKSBlbnRyaWVzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bWFrZUhvdXNlaG9sZGVyKCksIE1hdHJpeEJhc2U6Om1ha2VIb3VzZWhvbGRlckluUGxhY2UoKSwgCisgICogICAgIE1hdHJpeEJhc2U6OmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFc3NlbnRpYWxQYXJ0Pgordm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KAorICBjb25zdCBFc3NlbnRpYWxQYXJ0JiBlc3NlbnRpYWwsCisgIGNvbnN0IFNjYWxhciYgdGF1LAorICBTY2FsYXIqIHdvcmtzcGFjZSkKK3sKKyAgaWYocm93cygpID09IDEpCisgIHsKKyAgICAqdGhpcyAqPSBTY2FsYXIoMSktdGF1OworICB9CisgIGVsc2UgaWYodGF1IT1TY2FsYXIoMCkpCisgIHsKKyAgICBNYXA8dHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPFBsYWluT2JqZWN0Pjo6dHlwZT4gdG1wKHdvcmtzcGFjZSxjb2xzKCkpOworICAgIEJsb2NrPERlcml2ZWQsIEVzc2VudGlhbFBhcnQ6OlNpemVBdENvbXBpbGVUaW1lLCBEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT4gYm90dG9tKGRlcml2ZWQoKSwgMSwgMCwgcm93cygpLTEsIGNvbHMoKSk7CisgICAgdG1wLm5vYWxpYXMoKSA9IGVzc2VudGlhbC5hZGpvaW50KCkgKiBib3R0b207CisgICAgdG1wICs9IHRoaXMtPnJvdygwKTsKKyAgICB0aGlzLT5yb3coMCkgLT0gdGF1ICogdG1wOworICAgIGJvdHRvbS5ub2FsaWFzKCkgLT0gdGF1ICogZXNzZW50aWFsICogdG1wOworICB9Cit9CisKKy8qKiBBcHBseSB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3IgSCBnaXZlbiBieQorICAqIFxmJCBIID0gSSAtIHRhdSB2IHZeKlxmJAorICAqIHdpdGgKKyAgKiBcZiQgdl5UID0gWzEgZXNzZW50aWFsXlRdIFxmJAorICAqIGZyb20gdGhlIHJpZ2h0IHRvIGEgdmVjdG9yIG9yIG1hdHJpeC4KKyAgKgorICAqIE9uIGlucHV0OgorICAqIFxwYXJhbSBlc3NlbnRpYWwgdGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSB2ZWN0b3IgXGMgdgorICAqIFxwYXJhbSB0YXUgdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbgorICAqIFxwYXJhbSB3b3Jrc3BhY2UgYSBwb2ludGVyIHRvIHdvcmtpbmcgc3BhY2Ugd2l0aCBhdCBsZWFzdAorICAqICAgICAgICAgICAgICAgICAgdGhpcy0+Y29scygpICogZXNzZW50aWFsLnNpemUoKSBlbnRyaWVzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bWFrZUhvdXNlaG9sZGVyKCksIE1hdHJpeEJhc2U6Om1ha2VIb3VzZWhvbGRlckluUGxhY2UoKSwgCisgICogICAgIE1hdHJpeEJhc2U6OmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEVzc2VudGlhbFBhcnQ+Cit2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KAorICBjb25zdCBFc3NlbnRpYWxQYXJ0JiBlc3NlbnRpYWwsCisgIGNvbnN0IFNjYWxhciYgdGF1LAorICBTY2FsYXIqIHdvcmtzcGFjZSkKK3sKKyAgaWYoY29scygpID09IDEpCisgIHsKKyAgICAqdGhpcyAqPSBTY2FsYXIoMSktdGF1OworICB9CisgIGVsc2UgaWYodGF1IT1TY2FsYXIoMCkpCisgIHsKKyAgICBNYXA8dHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPFBsYWluT2JqZWN0Pjo6dHlwZT4gdG1wKHdvcmtzcGFjZSxyb3dzKCkpOworICAgIEJsb2NrPERlcml2ZWQsIERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLCBFc3NlbnRpYWxQYXJ0OjpTaXplQXRDb21waWxlVGltZT4gcmlnaHQoZGVyaXZlZCgpLCAwLCAxLCByb3dzKCksIGNvbHMoKS0xKTsKKyAgICB0bXAubm9hbGlhcygpID0gcmlnaHQgKiBlc3NlbnRpYWwuY29uanVnYXRlKCk7CisgICAgdG1wICs9IHRoaXMtPmNvbCgwKTsKKyAgICB0aGlzLT5jb2woMCkgLT0gdGF1ICogdG1wOworICAgIHJpZ2h0Lm5vYWxpYXMoKSAtPSB0YXUgKiB0bXAgKiBlc3NlbnRpYWwudHJhbnNwb3NlKCk7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IT1VTRUhPTERFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSG91c2Vob2xkZXIvSG91c2Vob2xkZXJTZXF1ZW5jZS5oIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyU2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2UwYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyU2VxdWVuY2UuaApAQCAtMCwwICsxLDQ3MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0hPVVNFSE9MREVSX1NFUVVFTkNFX0gKKyNkZWZpbmUgRUlHRU5fSE9VU0VIT0xERVJfU0VRVUVOQ0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIEhvdXNlaG9sZGVyX01vZHVsZQorICAqIFxob3VzZWhvbGRlcl9tb2R1bGUKKyAgKiBcY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZQorICAqIFxicmllZiBTZXF1ZW5jZSBvZiBIb3VzZWhvbGRlciByZWZsZWN0aW9ucyBhY3Rpbmcgb24gc3Vic3BhY2VzIHdpdGggZGVjcmVhc2luZyBzaXplCisgICogXHRwYXJhbSBWZWN0b3JzVHlwZSB0eXBlIG9mIG1hdHJpeCBjb250YWluaW5nIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzCisgICogXHRwYXJhbSBDb2VmZnNUeXBlICB0eXBlIG9mIHZlY3RvciBjb250YWluaW5nIHRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIFNpZGUgICAgICAgIGVpdGhlciBPblRoZUxlZnQgKHRoZSBkZWZhdWx0KSBvciBPblRoZVJpZ2h0CisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcm9kdWN0IHNlcXVlbmNlIG9mIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zIHdoZXJlIHRoZSBmaXJzdCBIb3VzZWhvbGRlciByZWZsZWN0aW9uCisgICogYWN0cyBvbiB0aGUgd2hvbGUgc3BhY2UsIHRoZSBzZWNvbmQgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBsZWF2ZXMgdGhlIG9uZS1kaW1lbnNpb25hbCBzdWJzcGFjZSBzcGFubmVkIGJ5CisgICogdGhlIGZpcnN0IHVuaXQgdmVjdG9yIGludmFyaWFudCwgdGhlIHRoaXJkIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb24gbGVhdmVzIHRoZSB0d28tZGltZW5zaW9uYWwgc3Vic3BhY2UKKyAgKiBzcGFubmVkIGJ5IHRoZSBmaXJzdCB0d28gdW5pdCB2ZWN0b3JzIGludmFyaWFudCwgYW5kIHNvIG9uIHVwIHRvIHRoZSBsYXN0IHJlZmxlY3Rpb24gd2hpY2ggbGVhdmVzIGFsbCBidXQKKyAgKiBvbmUgZGltZW5zaW9ucyBpbnZhcmlhbnQgYW5kIGFjdHMgb25seSBvbiB0aGUgbGFzdCBkaW1lbnNpb24uIFN1Y2ggc2VxdWVuY2VzIG9mIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zCisgICogYXJlIHVzZWQgaW4gc2V2ZXJhbCBhbGdvcml0aG1zIHRvIHplcm8gb3V0IGNlcnRhaW4gcGFydHMgb2YgYSBtYXRyaXguIEluZGVlZCwgdGhlIG1ldGhvZHMKKyAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjo6bWF0cml4USgpLCBUcmlkaWFnb25hbGl6YXRpb246Om1hdHJpeFEoKSwgSG91c2Vob2xkZXJRUjo6aG91c2Vob2xkZXJRKCksCisgICogYW5kIENvbFBpdkhvdXNlaG9sZGVyUVI6OmhvdXNlaG9sZGVyUSgpIGFsbCByZXR1cm4gYSAlSG91c2Vob2xkZXJTZXF1ZW5jZS4KKyAgKgorICAqIE1vcmUgcHJlY2lzZWx5LCB0aGUgY2xhc3MgJUhvdXNlaG9sZGVyU2VxdWVuY2UgcmVwcmVzZW50cyBhbiBcZiQgbiBcdGltZXMgbiBcZiQgbWF0cml4IFxmJCBIIFxmJCBvZiB0aGUKKyAgKiBmb3JtIFxmJCBIID0gXHByb2Rfe2k9MH1ee24tMX0gSF9pIFxmJCB3aGVyZSB0aGUgaS10aCBIb3VzZWhvbGRlciByZWZsZWN0aW9uIGlzIFxmJCBIX2kgPSBJIC0gaF9pIHZfaQorICAqIHZfaV4qIFxmJC4gVGhlIGktdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgXGYkIGhfaSBcZiQgaXMgYSBzY2FsYXIgYW5kIHRoZSBpLXRoIEhvdXNlaG9sZGVyIHZlY3RvciBcZiQKKyAgKiB2X2kgXGYkIGlzIGEgdmVjdG9yIG9mIHRoZSBmb3JtCisgICogXGZbIAorICAqIHZfaSA9IFtcdW5kZXJicmFjZXswLCBcbGRvdHMsIDB9X3tpLTFcbWJveHsgemVyb3N9fSwgMSwgXHVuZGVyYnJhY2V7KiwgXGxkb3RzLCp9X3tuLWlcbWJveHsgYXJiaXRyYXJ5IGVudHJpZXN9fSBdLiAKKyAgKiBcZl0KKyAgKiBUaGUgbGFzdCBcZiQgbi1pIFxmJCBlbnRyaWVzIG9mIFxmJCB2X2kgXGYkIGFyZSBjYWxsZWQgdGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3IuCisgICoKKyAgKiBUeXBpY2FsIHVzYWdlcyBhcmUgbGlzdGVkIGJlbG93LCB3aGVyZSBIIGlzIGEgSG91c2Vob2xkZXJTZXF1ZW5jZToKKyAgKiBcY29kZQorICAqIEEuYXBwbHlPblRoZVJpZ2h0KEgpOyAgICAgICAgICAgICAvLyBBID0gQSAqIEgKKyAgKiBBLmFwcGx5T25UaGVMZWZ0KEgpOyAgICAgICAgICAgICAgLy8gQSA9IEggKiBBCisgICogQS5hcHBseU9uVGhlUmlnaHQoSC5hZGpvaW50KCkpOyAgIC8vIEEgPSBBICogSF4qCisgICogQS5hcHBseU9uVGhlTGVmdChILmFkam9pbnQoKSk7ICAgIC8vIEEgPSBIXiogKiBBCisgICogTWF0cml4WGQgUSA9IEg7ICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gdG8gYSBkZW5zZSBtYXRyaXgKKyAgKiBcZW5kY29kZQorICAqIEluIGFkZGl0aW9uIHRvIHRoZSBhZGpvaW50LCB5b3UgY2FuIGFsc28gYXBwbHkgdGhlIGludmVyc2UgKD1hZGpvaW50KSwgdGhlIHRyYW5zcG9zZSwgYW5kIHRoZSBjb25qdWdhdGUgb3BlcmF0b3JzLgorICAqCisgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBIb3VzZWhvbGRlclNlcXVlbmNlKGNvbnN0IFZlY3RvcnNUeXBlJiwgY29uc3QgQ29lZmZzVHlwZSYpIGZvciBhbiBleGFtcGxlLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVMZWZ0KCksIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVSaWdodCgpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT4KK3N0cnVjdCB0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLFNpZGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gU2lkZT09T25UaGVMZWZ0ID8gdHJhaXRzPFZlY3RvcnNUeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRyYWl0czxWZWN0b3JzVHlwZT46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBTaWRlPT1PblRoZUxlZnQgPyB0cmFpdHM8VmVjdG9yc1R5cGU+OjpNYXhSb3dzQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHJhaXRzPFZlY3RvcnNUeXBlPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICBGbGFncyA9IDAKKyAgfTsKK307CisKK3N0cnVjdCBIb3VzZWhvbGRlclNlcXVlbmNlU2hhcGUge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT4KK3N0cnVjdCBldmFsdWF0b3JfdHJhaXRzPEhvdXNlaG9sZGVyU2VxdWVuY2U8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxTaWRlPiA+CisgIDogcHVibGljIGV2YWx1YXRvcl90cmFpdHNfYmFzZTxIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLENvZWZmc1R5cGUsU2lkZT4gPgoreworICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2VTaGFwZSBTaGFwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT4KK3N0cnVjdCBoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGwKK3sKKyAgdHlwZWRlZiBCbG9jazxjb25zdCBWZWN0b3JzVHlwZSwgRHluYW1pYywgMT4gRXNzZW50aWFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLCBDb2VmZnNUeXBlLCBPblRoZUxlZnQ+IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworICBzdGF0aWMgaW5saW5lIGNvbnN0IEVzc2VudGlhbFZlY3RvclR5cGUgZXNzZW50aWFsVmVjdG9yKGNvbnN0IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlJiBoLCBJbmRleCBrKQorICB7CisgICAgSW5kZXggc3RhcnQgPSBrKzEraC5tX3NoaWZ0OworICAgIHJldHVybiBCbG9jazxjb25zdCBWZWN0b3JzVHlwZSxEeW5hbWljLDE+KGgubV92ZWN0b3JzLCBzdGFydCwgaywgaC5yb3dzKCktc3RhcnQsIDEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JzVHlwZSwgdHlwZW5hbWUgQ29lZmZzVHlwZT4KK3N0cnVjdCBoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGw8VmVjdG9yc1R5cGUsIENvZWZmc1R5cGUsIE9uVGhlUmlnaHQ+Cit7CisgIHR5cGVkZWYgVHJhbnNwb3NlPEJsb2NrPGNvbnN0IFZlY3RvcnNUeXBlLCAxLCBEeW5hbWljPiA+IEVzc2VudGlhbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgSG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSwgQ29lZmZzVHlwZSwgT25UaGVSaWdodD4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRXNzZW50aWFsVmVjdG9yVHlwZSBlc3NlbnRpYWxWZWN0b3IoY29uc3QgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUmIGgsIEluZGV4IGspCisgIHsKKyAgICBJbmRleCBzdGFydCA9IGsrMStoLm1fc2hpZnQ7CisgICAgcmV0dXJuIEJsb2NrPGNvbnN0IFZlY3RvcnNUeXBlLDEsRHluYW1pYz4oaC5tX3ZlY3RvcnMsIGssIHN0YXJ0LCAxLCBoLnJvd3MoKS1zdGFydCkudHJhbnNwb3NlKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IG1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8T3RoZXJTY2FsYXJUeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZXR1cm5UeXBlCisgICAgUmVzdWx0U2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxSZXN1bHRTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgMCwgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBUeXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT4gY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZQorICA6IHB1YmxpYyBFaWdlbkJhc2U8SG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLFNpZGU+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGw8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxTaWRlPjo6RXNzZW50aWFsVmVjdG9yVHlwZSBFc3NlbnRpYWxWZWN0b3JUeXBlOworICAKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPEhvdXNlaG9sZGVyU2VxdWVuY2U+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxIb3VzZWhvbGRlclNlcXVlbmNlPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZT46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPEhvdXNlaG9sZGVyU2VxdWVuY2U+OjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEhvdXNlaG9sZGVyU2VxdWVuY2U+OjpTY2FsYXIgU2NhbGFyOworCisgICAgdHlwZWRlZiBIb3VzZWhvbGRlclNlcXVlbmNlPAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFZlY3RvcnNUeXBlOjpDb25qdWdhdGVSZXR1cm5UeXBlPjo6dHlwZSwKKyAgICAgICAgVmVjdG9yc1R5cGU+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIENvZWZmc1R5cGU6OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlLAorICAgICAgICBDb2VmZnNUeXBlPjo6dHlwZSwKKyAgICAgIFNpZGUKKyAgICA+IENvbmp1Z2F0ZVJldHVyblR5cGU7CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAgKiBccGFyYW1baW5dICB2ICAgICAgJU1hdHJpeCBjb250YWluaW5nIHRoZSBlc3NlbnRpYWwgcGFydHMgb2YgdGhlIEhvdXNlaG9sZGVyIHZlY3RvcnMKKyAgICAgICogXHBhcmFtW2luXSAgaCAgICAgIFZlY3RvciBjb250YWluaW5nIHRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgICAgICoKKyAgICAgICogQ29uc3RydWN0cyB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2Ugd2l0aCBjb2VmZmljaWVudHMgZ2l2ZW4gYnkgXHAgaCBhbmQgdmVjdG9ycyBnaXZlbiBieSBccCB2LiBUaGUKKyAgICAgICogaS10aCBIb3VzZWhvbGRlciBjb2VmZmljaWVudCBcZiQgaF9pIFxmJCBpcyBnaXZlbiBieSBccCBoKGkpIGFuZCB0aGUgZXNzZW50aWFsIHBhcnQgb2YgdGhlIGktdGgKKyAgICAgICogSG91c2Vob2xkZXIgdmVjdG9yIFxmJCB2X2kgXGYkIGlzIGdpdmVuIGJ5IFxwIHYoayxpKSB3aXRoIFxwIGsgPiBccCBpICh0aGUgc3ViZGlhZ29uYWwgcGFydCBvZiB0aGUKKyAgICAgICogaS10aCBjb2x1bW4pLiBJZiBccCB2IGhhcyBmZXdlciBjb2x1bW5zIHRoYW4gcm93cywgdGhlbiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UgY29udGFpbnMgYXMgbWFueQorICAgICAgKiBIb3VzZWhvbGRlciByZWZsZWN0aW9ucyBhcyB0aGVyZSBhcmUgY29sdW1ucy4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhlICVIb3VzZWhvbGRlclNlcXVlbmNlIG9iamVjdCBzdG9yZXMgXHAgdiBhbmQgXHAgaCBieSByZWZlcmVuY2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhvdXNlaG9sZGVyU2VxdWVuY2VfSG91c2Vob2xkZXJTZXF1ZW5jZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSG91c2Vob2xkZXJTZXF1ZW5jZV9Ib3VzZWhvbGRlclNlcXVlbmNlLm91dAorICAgICAgKgorICAgICAgKiBcc2Egc2V0TGVuZ3RoKCksIHNldFNoaWZ0KCkKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZShjb25zdCBWZWN0b3JzVHlwZSYgdiwgY29uc3QgQ29lZmZzVHlwZSYgaCkKKyAgICAgIDogbV92ZWN0b3JzKHYpLCBtX2NvZWZmcyhoKSwgbV90cmFucyhmYWxzZSksIG1fbGVuZ3RoKHYuZGlhZ29uYWxTaXplKCkpLAorICAgICAgICBtX3NoaWZ0KDApCisgICAgeworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICBIb3VzZWhvbGRlclNlcXVlbmNlKGNvbnN0IEhvdXNlaG9sZGVyU2VxdWVuY2UmIG90aGVyKQorICAgICAgOiBtX3ZlY3RvcnMob3RoZXIubV92ZWN0b3JzKSwKKyAgICAgICAgbV9jb2VmZnMob3RoZXIubV9jb2VmZnMpLAorICAgICAgICBtX3RyYW5zKG90aGVyLm1fdHJhbnMpLAorICAgICAgICBtX2xlbmd0aChvdGhlci5tX2xlbmd0aCksCisgICAgICAgIG1fc2hpZnQob3RoZXIubV9zaGlmdCkKKyAgICB7CisgICAgfQorCisgICAgLyoqIFxicmllZiBOdW1iZXIgb2Ygcm93cyBvZiB0cmFuc2Zvcm1hdGlvbiB2aWV3ZWQgYXMgYSBtYXRyaXguCisgICAgICAqIFxyZXR1cm5zIE51bWJlciBvZiByb3dzIAorICAgICAgKiBcZGV0YWlscyBUaGlzIGVxdWFscyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBhY3RzIG9uLgorICAgICAgKi8KKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gU2lkZT09T25UaGVMZWZ0ID8gbV92ZWN0b3JzLnJvd3MoKSA6IG1fdmVjdG9ycy5jb2xzKCk7IH0KKworICAgIC8qKiBcYnJpZWYgTnVtYmVyIG9mIGNvbHVtbnMgb2YgdHJhbnNmb3JtYXRpb24gdmlld2VkIGFzIGEgbWF0cml4LgorICAgICAgKiBccmV0dXJucyBOdW1iZXIgb2YgY29sdW1ucworICAgICAgKiBcZGV0YWlscyBUaGlzIGVxdWFscyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBhY3RzIG9uLgorICAgICAgKi8KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gcm93cygpOyB9CisKKyAgICAvKiogXGJyaWVmIEVzc2VudGlhbCBwYXJ0IG9mIGEgSG91c2Vob2xkZXIgdmVjdG9yLgorICAgICAgKiBccGFyYW1baW5dICBrICBJbmRleCBvZiBIb3VzZWhvbGRlciByZWZsZWN0aW9uCisgICAgICAqIFxyZXR1cm5zICAgIFZlY3RvciBjb250YWluaW5nIG5vbi10cml2aWFsIGVudHJpZXMgb2Ygay10aCBIb3VzZWhvbGRlciB2ZWN0b3IKKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3NlbnRpYWwgcGFydCBvZiB0aGUgSG91c2Vob2xkZXIgdmVjdG9yIFxmJCB2X2kgXGYkLiBUaGlzIGlzIGEgdmVjdG9yIG9mCisgICAgICAqIGxlbmd0aCBcZiQgbi1pIFxmJCBjb250YWluaW5nIHRoZSBsYXN0IFxmJCBuLWkgXGYkIGVudHJpZXMgb2YgdGhlIHZlY3RvcgorICAgICAgKiBcZlsgCisgICAgICAqIHZfaSA9IFtcdW5kZXJicmFjZXswLCBcbGRvdHMsIDB9X3tpLTFcbWJveHsgemVyb3N9fSwgMSwgXHVuZGVyYnJhY2V7KiwgXGxkb3RzLCp9X3tuLWlcbWJveHsgYXJiaXRyYXJ5IGVudHJpZXN9fSBdLiAKKyAgICAgICogXGZdCisgICAgICAqIFRoZSBpbmRleCBcZiQgaSBcZiQgZXF1YWxzIFxwIGsgKyBzaGlmdCgpLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBrLXRoIGNvbHVtbiBvZiB0aGUgbWF0cml4IFxwIHYKKyAgICAgICogcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHNhIHNldFNoaWZ0KCksIHNoaWZ0KCkKKyAgICAgICovCisgICAgY29uc3QgRXNzZW50aWFsVmVjdG9yVHlwZSBlc3NlbnRpYWxWZWN0b3IoSW5kZXggaykgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoayA+PSAwICYmIGsgPCBtX2xlbmd0aCk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmhzZXFfc2lkZV9kZXBlbmRlbnRfaW1wbDxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLFNpZGU+Ojplc3NlbnRpYWxWZWN0b3IoKnRoaXMsIGspOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgJVRyYW5zcG9zZSBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZSB0cmFuc3Bvc2UoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBIb3VzZWhvbGRlclNlcXVlbmNlKCp0aGlzKS5zZXRUcmFucyghbV90cmFucyk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuICovCisgICAgQ29uanVnYXRlUmV0dXJuVHlwZSBjb25qdWdhdGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBDb25qdWdhdGVSZXR1cm5UeXBlKG1fdmVjdG9ycy5jb25qdWdhdGUoKSwgbV9jb2VmZnMuY29uanVnYXRlKCkpCisgICAgICAgICAgICAgLnNldFRyYW5zKG1fdHJhbnMpCisgICAgICAgICAgICAgLnNldExlbmd0aChtX2xlbmd0aCkKKyAgICAgICAgICAgICAuc2V0U2hpZnQobV9zaGlmdCk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBBZGpvaW50IChjb25qdWdhdGUgdHJhbnNwb3NlKSBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuICovCisgICAgQ29uanVnYXRlUmV0dXJuVHlwZSBhZGpvaW50KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29uanVnYXRlKCkuc2V0VHJhbnMoIW1fdHJhbnMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgSW52ZXJzZSBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UgKGVxdWFscyB0aGUgYWRqb2ludCkuICovCisgICAgQ29uanVnYXRlUmV0dXJuVHlwZSBpbnZlcnNlKCkgY29uc3QgeyByZXR1cm4gYWRqb2ludCgpOyB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFR5cGU+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0VHlwZSYgZHN0KSBjb25zdAorICAgIHsKKyAgICAgIE1hdHJpeDxTY2FsYXIsIERlc3RUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMSwKKyAgICAgICAgICAgICBBdXRvQWxpZ258Q29sTWFqb3IsIERlc3RUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gd29ya3NwYWNlKHJvd3MoKSk7CisgICAgICBldmFsVG8oZHN0LCB3b3Jrc3BhY2UpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBXb3Jrc3BhY2U+CisgICAgdm9pZCBldmFsVG8oRGVzdCYgZHN0LCBXb3Jrc3BhY2UmIHdvcmtzcGFjZSkgY29uc3QKKyAgICB7CisgICAgICB3b3Jrc3BhY2UucmVzaXplKHJvd3MoKSk7CisgICAgICBJbmRleCB2ZWNzID0gbV9sZW5ndGg7CisgICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZV9kZW5zZShkc3QsbV92ZWN0b3JzKSkKKyAgICAgIHsKKyAgICAgICAgLy8gaW4tcGxhY2UKKyAgICAgICAgZHN0LmRpYWdvbmFsKCkuc2V0T25lcygpOworICAgICAgICBkc3QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICAgIGZvcihJbmRleCBrID0gdmVjcy0xOyBrID49IDA7IC0taykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGNvcm5lclNpemUgPSByb3dzKCkgLSBrIC0gbV9zaGlmdDsKKyAgICAgICAgICBpZihtX3RyYW5zKQorICAgICAgICAgICAgZHN0LmJvdHRvbVJpZ2h0Q29ybmVyKGNvcm5lclNpemUsIGNvcm5lclNpemUpCisgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsVmVjdG9yKGspLCBtX2NvZWZmcy5jb2VmZihrKSwgd29ya3NwYWNlLmRhdGEoKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHN0LmJvdHRvbVJpZ2h0Q29ybmVyKGNvcm5lclNpemUsIGNvcm5lclNpemUpCisgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWxWZWN0b3IoayksIG1fY29lZmZzLmNvZWZmKGspLCB3b3Jrc3BhY2UuZGF0YSgpKTsKKworICAgICAgICAgIC8vIGNsZWFyIHRoZSBvZmYgZGlhZ29uYWwgdmVjdG9yCisgICAgICAgICAgZHN0LmNvbChrKS50YWlsKHJvd3MoKS1rLTEpLnNldFplcm8oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjbGVhciB0aGUgcmVtYWluaW5nIGNvbHVtbnMgaWYgbmVlZGVkCisgICAgICAgIGZvcihJbmRleCBrID0gMDsgazxjb2xzKCktdmVjcyA7ICsraykKKyAgICAgICAgICBkc3QuY29sKGspLnRhaWwocm93cygpLWstMSkuc2V0WmVybygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBkc3Quc2V0SWRlbnRpdHkocm93cygpLCByb3dzKCkpOworICAgICAgICBmb3IoSW5kZXggayA9IHZlY3MtMTsgayA+PSAwOyAtLWspCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBjb3JuZXJTaXplID0gcm93cygpIC0gayAtIG1fc2hpZnQ7CisgICAgICAgICAgaWYobV90cmFucykKKyAgICAgICAgICAgIGRzdC5ib3R0b21SaWdodENvcm5lcihjb3JuZXJTaXplLCBjb3JuZXJTaXplKQorICAgICAgICAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzc2VudGlhbFZlY3RvcihrKSwgbV9jb2VmZnMuY29lZmYoayksICZ3b3Jrc3BhY2UuY29lZmZSZWYoMCkpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRzdC5ib3R0b21SaWdodENvcm5lcihjb3JuZXJTaXplLCBjb3JuZXJTaXplKQorICAgICAgICAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsVmVjdG9yKGspLCBtX2NvZWZmcy5jb2VmZihrKSwgJndvcmtzcGFjZS5jb2VmZlJlZigwKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVSaWdodChEZXN0JiBkc3QpIGNvbnN0CisgICAgeworICAgICAgTWF0cml4PFNjYWxhciwxLERlc3Q6OlJvd3NBdENvbXBpbGVUaW1lLFJvd01ham9yLDEsRGVzdDo6TWF4Um93c0F0Q29tcGlsZVRpbWU+IHdvcmtzcGFjZShkc3Qucm93cygpKTsKKyAgICAgIGFwcGx5VGhpc09uVGhlUmlnaHQoZHN0LCB3b3Jrc3BhY2UpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBXb3Jrc3BhY2U+CisgICAgaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVSaWdodChEZXN0JiBkc3QsIFdvcmtzcGFjZSYgd29ya3NwYWNlKSBjb25zdAorICAgIHsKKyAgICAgIHdvcmtzcGFjZS5yZXNpemUoZHN0LnJvd3MoKSk7CisgICAgICBmb3IoSW5kZXggayA9IDA7IGsgPCBtX2xlbmd0aDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBhY3R1YWxfayA9IG1fdHJhbnMgPyBtX2xlbmd0aC1rLTEgOiBrOworICAgICAgICBkc3QucmlnaHRDb2xzKHJvd3MoKS1tX3NoaWZ0LWFjdHVhbF9rKQorICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsVmVjdG9yKGFjdHVhbF9rKSwgbV9jb2VmZnMuY29lZmYoYWN0dWFsX2spLCB3b3Jrc3BhY2UuZGF0YSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVMZWZ0KERlc3QmIGRzdCkgY29uc3QKKyAgICB7CisgICAgICBNYXRyaXg8U2NhbGFyLDEsRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWUsUm93TWFqb3IsMSxEZXN0OjpNYXhDb2xzQXRDb21waWxlVGltZT4gd29ya3NwYWNlOworICAgICAgYXBwbHlUaGlzT25UaGVMZWZ0KGRzdCwgd29ya3NwYWNlKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdCwgdHlwZW5hbWUgV29ya3NwYWNlPgorICAgIGlubGluZSB2b2lkIGFwcGx5VGhpc09uVGhlTGVmdChEZXN0JiBkc3QsIFdvcmtzcGFjZSYgd29ya3NwYWNlKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IEJsb2NrU2l6ZSA9IDQ4OworICAgICAgLy8gaWYgdGhlIGVudHJpZXMgYXJlIGxhcmdlIGVub3VnaCwgdGhlbiBhcHBseSB0aGUgcmVmbGVjdG9ycyBieSBibG9jaworICAgICAgaWYobV9sZW5ndGg+PUJsb2NrU2l6ZSAmJiBkc3QuY29scygpPjEpCisgICAgICB7CisgICAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1fbGVuZ3RoOyBpKz1CbG9ja1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBlbmQgPSBtX3RyYW5zID8gKHN0ZDo6bWluKShtX2xlbmd0aCxpK0Jsb2NrU2l6ZSkgOiBtX2xlbmd0aC1pOworICAgICAgICAgIEluZGV4IGsgPSBtX3RyYW5zID8gaSA6IChzdGQ6Om1heCkoSW5kZXgoMCksZW5kLUJsb2NrU2l6ZSk7CisgICAgICAgICAgSW5kZXggYnMgPSBlbmQtazsKKyAgICAgICAgICBJbmRleCBzdGFydCA9IGsgKyBtX3NoaWZ0OworICAgICAgICAgIAorICAgICAgICAgIHR5cGVkZWYgQmxvY2s8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8VmVjdG9yc1R5cGU+Ojp0eXBlLER5bmFtaWMsRHluYW1pYz4gU3ViVmVjdG9yc1R5cGU7CisgICAgICAgICAgU3ViVmVjdG9yc1R5cGUgc3ViX3ZlY3MxKG1fdmVjdG9ycy5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgU2lkZT09T25UaGVSaWdodCA/IGsgOiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWRlPT1PblRoZVJpZ2h0ID8gc3RhcnQgOiBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZGU9PU9uVGhlUmlnaHQgPyBicyA6IG1fdmVjdG9ycy5yb3dzKCktc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lkZT09T25UaGVSaWdodCA/IG1fdmVjdG9ycy5jb2xzKCktc3RhcnQgOiBicyk7CisgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPFNpZGU9PU9uVGhlUmlnaHQsIFRyYW5zcG9zZTxTdWJWZWN0b3JzVHlwZT4sIFN1YlZlY3RvcnNUeXBlJj46OnR5cGUgc3ViX3ZlY3Moc3ViX3ZlY3MxKTsKKyAgICAgICAgICBCbG9jazxEZXN0LER5bmFtaWMsRHluYW1pYz4gc3ViX2RzdChkc3QsZHN0LnJvd3MoKS1yb3dzKCkrbV9zaGlmdCtrLDAsIHJvd3MoKS1tX3NoaWZ0LWssZHN0LmNvbHMoKSk7CisgICAgICAgICAgYXBwbHlfYmxvY2tfaG91c2Vob2xkZXJfb25fdGhlX2xlZnQoc3ViX2RzdCwgc3ViX3ZlY3MsIG1fY29lZmZzLnNlZ21lbnQoaywgYnMpLCAhbV90cmFucyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd29ya3NwYWNlLnJlc2l6ZShkc3QuY29scygpKTsKKyAgICAgICAgZm9yKEluZGV4IGsgPSAwOyBrIDwgbV9sZW5ndGg7ICsraykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbF9rID0gbV90cmFucyA/IGsgOiBtX2xlbmd0aC1rLTE7CisgICAgICAgICAgZHN0LmJvdHRvbVJvd3Mocm93cygpLW1fc2hpZnQtYWN0dWFsX2spCisgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWxWZWN0b3IoYWN0dWFsX2spLCBtX2NvZWZmcy5jb2VmZihhY3R1YWxfayksIHdvcmtzcGFjZS5kYXRhKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyB0aGUgcHJvZHVjdCBvZiBhIEhvdXNlaG9sZGVyIHNlcXVlbmNlIHdpdGggYSBtYXRyaXguCisgICAgICAqIFxwYXJhbVtpbl0gIG90aGVyICAlTWF0cml4IGJlaW5nIG11bHRpcGxpZWQuCisgICAgICAqIFxyZXR1cm5zICAgIEV4cHJlc3Npb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcHJvZHVjdC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBcZiQgSE0gXGYkIHdoZXJlIFxmJCBIIFxmJCBpcyB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgXHAgKnRoaXMKKyAgICAgICogYW5kIFxmJCBNIFxmJCBpcyB0aGUgbWF0cml4IFxwIG90aGVyLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlPFNjYWxhciwgT3RoZXJEZXJpdmVkPjo6VHlwZSBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6bWF0cml4X3R5cGVfdGltZXNfc2NhbGFyX3R5cGU8U2NhbGFyLCBPdGhlckRlcml2ZWQ+OjpUeXBlCisgICAgICAgIHJlcyhvdGhlci50ZW1wbGF0ZSBjYXN0PHR5cGVuYW1lIGludGVybmFsOjptYXRyaXhfdHlwZV90aW1lc19zY2FsYXJfdHlwZTxTY2FsYXIsT3RoZXJEZXJpdmVkPjo6UmVzdWx0U2NhbGFyPigpKTsKKyAgICAgIGFwcGx5VGhpc09uVGhlTGVmdChyZXMpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmVjdG9yc1R5cGUsIHR5cGVuYW1lIF9Db2VmZnNUeXBlLCBpbnQgX1NpZGU+IGZyaWVuZCBzdHJ1Y3QgaW50ZXJuYWw6OmhzZXFfc2lkZV9kZXBlbmRlbnRfaW1wbDsKKworICAgIC8qKiBcYnJpZWYgU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBIb3VzZWhvbGRlciBzZXF1ZW5jZS4KKyAgICAgICogXHBhcmFtIFtpbl0gIGxlbmd0aCAgTmV3IHZhbHVlIGZvciB0aGUgbGVuZ3RoLgorICAgICAgKgorICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgbGVuZ3RoIFxmJCBuIFxmJCBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UgXGYkIEggPSBIXzAgSF8xIFxsZG90cyBIX3tuLTF9IFxmJCBpcyBzZXQKKyAgICAgICogdG8gdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggXHAgdiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBvciB0aGUgbnVtYmVyIG9mIHJvd3MgaWYgdGhhdAorICAgICAgKiBpcyBzbWFsbGVyLiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGxlbmd0aCBlcXVhbHMgXHAgbGVuZ3RoLgorICAgICAgKgorICAgICAgKiBcc2EgbGVuZ3RoKCkKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZSYgc2V0TGVuZ3RoKEluZGV4IGxlbmd0aCkKKyAgICB7CisgICAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFNldHMgdGhlIHNoaWZ0IG9mIHRoZSBIb3VzZWhvbGRlciBzZXF1ZW5jZS4KKyAgICAgICogXHBhcmFtIFtpbl0gIHNoaWZ0ICBOZXcgdmFsdWUgZm9yIHRoZSBzaGlmdC4KKyAgICAgICoKKyAgICAgICogQnkgZGVmYXVsdCwgYSAlSG91c2Vob2xkZXJTZXF1ZW5jZSBvYmplY3QgcmVwcmVzZW50cyBcZiQgSCA9IEhfMCBIXzEgXGxkb3RzIEhfe24tMX0gXGYkIGFuZCB0aGUgaS10aAorICAgICAgKiBjb2x1bW4gb2YgdGhlIG1hdHJpeCBccCB2IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgY29ycmVzcG9uZHMgdG8gdGhlIGktdGggSG91c2Vob2xkZXIKKyAgICAgICogcmVmbGVjdGlvbi4gQWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBvYmplY3QgcmVwcmVzZW50cyBcZiQgSCA9IEhfe1xtYXRocm17c2hpZnR9fQorICAgICAgKiBIX3tcbWF0aHJte3NoaWZ0fSsxfSBcbGRvdHMgSF97bi0xfSBcZiQgYW5kIHRoZSBpLXRoIGNvbHVtbiBvZiBccCB2IGNvcnJlc3BvbmRzIHRvIHRoZSAoc2hpZnQraSktdGgKKyAgICAgICogSG91c2Vob2xkZXIgcmVmbGVjdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIHNoaWZ0KCkKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZSYgc2V0U2hpZnQoSW5kZXggc2hpZnQpCisgICAgeworICAgICAgbV9zaGlmdCA9IHNoaWZ0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEluZGV4IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVuZ3RoOyB9ICAvKio8IFxicmllZiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAqLworICAgIEluZGV4IHNoaWZ0KCkgY29uc3QgeyByZXR1cm4gbV9zaGlmdDsgfSAgICAvKio8IFxicmllZiBSZXR1cm5zIHRoZSBzaGlmdCBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuICovCisKKyAgICAvKiBOZWNlc3NhcnkgZm9yIC5hZGpvaW50KCkgYW5kIC5jb25qdWdhdGUoKSAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JzVHlwZTIsIHR5cGVuYW1lIENvZWZmc1R5cGUyLCBpbnQgU2lkZTI+IGZyaWVuZCBjbGFzcyBIb3VzZWhvbGRlclNlcXVlbmNlOworCisgIHByb3RlY3RlZDoKKworICAgIC8qKiBcYnJpZWYgU2V0cyB0aGUgdHJhbnNwb3NlIGZsYWcuCisgICAgICAqIFxwYXJhbSBbaW5dICB0cmFucyAgTmV3IHZhbHVlIG9mIHRoZSB0cmFuc3Bvc2UgZmxhZy4KKyAgICAgICoKKyAgICAgICogQnkgZGVmYXVsdCwgdGhlIHRyYW5zcG9zZSBmbGFnIGlzIG5vdCBzZXQuIElmIHRoZSB0cmFuc3Bvc2UgZmxhZyBpcyBzZXQsIHRoZW4gdGhpcyBvYmplY3QgcmVwcmVzZW50cyAKKyAgICAgICogXGYkIEheVCA9IEhfe24tMX1eVCBcbGRvdHMgSF8xXlQgSF8wXlQgXGYkIGluc3RlYWQgb2YgXGYkIEggPSBIXzAgSF8xIFxsZG90cyBIX3tuLTF9IFxmJC4KKyAgICAgICoKKyAgICAgICogXHNhIHRyYW5zKCkKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZSYgc2V0VHJhbnMoYm9vbCB0cmFucykKKyAgICB7CisgICAgICBtX3RyYW5zID0gdHJhbnM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYm9vbCB0cmFucygpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnM7IH0gICAgIC8qKjwgXGJyaWVmIFJldHVybnMgdGhlIHRyYW5zcG9zZSBmbGFnLiAqLworCisgICAgdHlwZW5hbWUgVmVjdG9yc1R5cGU6Ok5lc3RlZCBtX3ZlY3RvcnM7CisgICAgdHlwZW5hbWUgQ29lZmZzVHlwZTo6TmVzdGVkIG1fY29lZmZzOworICAgIGJvb2wgbV90cmFuczsKKyAgICBJbmRleCBtX2xlbmd0aDsKKyAgICBJbmRleCBtX3NoaWZ0OworfTsKKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgcHJvZHVjdCBvZiBhIG1hdHJpeCB3aXRoIGEgSG91c2Vob2xkZXIgc2VxdWVuY2UuCisgICogXHBhcmFtW2luXSAgb3RoZXIgICVNYXRyaXggYmVpbmcgbXVsdGlwbGllZC4KKyAgKiBccGFyYW1baW5dICBoICAgICAgJUhvdXNlaG9sZGVyU2VxdWVuY2UgYmVpbmcgbXVsdGlwbGllZC4KKyAgKiBccmV0dXJucyAgICBFeHByZXNzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHByb2R1Y3QuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIFxmJCBNSCBcZiQgd2hlcmUgXGYkIE0gXGYkIGlzIHRoZSBtYXRyaXggXHAgb3RoZXIgYW5kIFxmJCBIIFxmJCBpcyB0aGUKKyAgKiBIb3VzZWhvbGRlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieSBccCBoLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBWZWN0b3JzVHlwZSwgdHlwZW5hbWUgQ29lZmZzVHlwZSwgaW50IFNpZGU+Cit0eXBlbmFtZSBpbnRlcm5hbDo6bWF0cml4X3R5cGVfdGltZXNfc2NhbGFyX3R5cGU8dHlwZW5hbWUgVmVjdG9yc1R5cGU6OlNjYWxhcixPdGhlckRlcml2ZWQ+OjpUeXBlIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCBjb25zdCBIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLENvZWZmc1R5cGUsU2lkZT4mIGgpCit7CisgIHR5cGVuYW1lIGludGVybmFsOjptYXRyaXhfdHlwZV90aW1lc19zY2FsYXJfdHlwZTx0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U2NhbGFyLE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICByZXMob3RoZXIudGVtcGxhdGUgY2FzdDx0eXBlbmFtZSBpbnRlcm5hbDo6bWF0cml4X3R5cGVfdGltZXNfc2NhbGFyX3R5cGU8dHlwZW5hbWUgVmVjdG9yc1R5cGU6OlNjYWxhcixPdGhlckRlcml2ZWQ+OjpSZXN1bHRTY2FsYXI+KCkpOworICBoLmFwcGx5VGhpc09uVGhlUmlnaHQocmVzKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIFxpbmdyb3VwIEhvdXNlaG9sZGVyX01vZHVsZSBcaG91c2Vob2xkZXJfbW9kdWxlCisgICogXGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBIb3VzZWhvbGRlciBzZXF1ZW5jZS4gCisgICogXHJldHVybnMgQSBIb3VzZWhvbGRlclNlcXVlbmNlIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JzVHlwZSwgdHlwZW5hbWUgQ29lZmZzVHlwZT4KK0hvdXNlaG9sZGVyU2VxdWVuY2U8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZT4gaG91c2Vob2xkZXJTZXF1ZW5jZShjb25zdCBWZWN0b3JzVHlwZSYgdiwgY29uc3QgQ29lZmZzVHlwZSYgaCkKK3sKKyAgcmV0dXJuIEhvdXNlaG9sZGVyU2VxdWVuY2U8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxPblRoZUxlZnQ+KHYsIGgpOworfQorCisvKiogXGluZ3JvdXAgSG91c2Vob2xkZXJfTW9kdWxlIFxob3VzZWhvbGRlcl9tb2R1bGUKKyAgKiBcYnJpZWYgQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBhIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAKKyAgKiBccmV0dXJucyBBIEhvdXNlaG9sZGVyU2VxdWVuY2UgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KKyAgKiBcZGV0YWlscyBUaGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBob3VzZWhvbGRlclNlcXVlbmNlKCkgaW4gdGhhdCB0aGUgdGVtcGxhdGUgYXJndW1lbnQgXHAgT25UaGVTaWRlIG9mCisgICogdGhlIGNvbnN0cnVjdGVkIEhvdXNlaG9sZGVyU2VxdWVuY2UgaXMgc2V0IHRvIE9uVGhlUmlnaHQsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgT25UaGVMZWZ0LgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yc1R5cGUsIHR5cGVuYW1lIENvZWZmc1R5cGU+CitIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLENvZWZmc1R5cGUsT25UaGVSaWdodD4gcmlnaHRIb3VzZWhvbGRlclNlcXVlbmNlKGNvbnN0IFZlY3RvcnNUeXBlJiB2LCBjb25zdCBDb2VmZnNUeXBlJiBoKQoreworICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLE9uVGhlUmlnaHQ+KHYsIGgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0hPVVNFSE9MREVSX1NFUVVFTkNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0Jhc2ljUHJlY29uZGl0aW9uZXJzLmggYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CYXNpY1ByZWNvbmRpdGlvbmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2RhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CYXNpY1ByZWNvbmRpdGlvbmVycy5oCkBAIC0wLDAgKzEsMjI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CQVNJQ19QUkVDT05ESVRJT05FUlNfSAorI2RlZmluZSBFSUdFTl9CQVNJQ19QUkVDT05ESVRJT05FUlNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGJyaWVmIEEgcHJlY29uZGl0aW9uZXIgYmFzZWQgb24gdGhlIGRpZ29uYWwgZW50cmllcworICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gYXBwcm94aW1hdGVseSBzb2x2ZSBmb3IgQS54ID0gYiBwcm9ibGVtcyBhc3N1bWluZyBBIGlzIGEgZGlhZ29uYWwgbWF0cml4LgorICAqIEluIG90aGVyIHdvcmRzLCB0aGlzIHByZWNvbmRpdGlvbmVyIG5lZ2xlY3RzIGFsbCBvZmYgZGlhZ29uYWwgZW50cmllcyBhbmQsIGluIEVpZ2VuJ3MgbGFuZ3VhZ2UsIHNvbHZlcyBmb3I6CisgICAgXGNvZGUKKyAgICBBLmRpYWdvbmFsKCkuYXNEaWFnb25hbCgpIC4geCA9IGIKKyAgICBcZW5kY29kZQorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSB0eXBlIG9mIHRoZSBzY2FsYXIuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFRoaXMgcHJlY29uZGl0aW9uZXIgaXMgc3VpdGFibGUgZm9yIGJvdGggc2VsZmFkam9pbnQgYW5kIGdlbmVyYWwgcHJvYmxlbXMuCisgICogVGhlIGRpYWdvbmFsIGVudHJpZXMgYXJlIHByZS1pbnZlcnRlZCBhbmQgc3RvcmVkIGludG8gYSBkZW5zZSB2ZWN0b3IuCisgICoKKyAgKiBcbm90ZSBBIHZhcmlhbnQgdGhhdCBoYXMgeWV0IHRvIGJlIGltcGxlbWVudGVkIHdvdWxkIGF0dGVtcHQgdG8gcHJlc2VydmUgdGhlIG5vcm0gb2YgZWFjaCBjb2x1bW4uCisgICoKKyAgKiBcc2EgY2xhc3MgTGVhc3RTcXVhcmVEaWFnb25hbFByZWNvbmRpdGlvbmVyLCBjbGFzcyBDb25qdWdhdGVHcmFkaWVudAorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBEaWFnb25hbFByZWNvbmRpdGlvbmVyCit7CisgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3I7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvcjo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICBlbnVtIHsKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYworICAgIH07CisKKyAgICBEaWFnb25hbFByZWNvbmRpdGlvbmVyKCkgOiBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRUeXBlPgorICAgIGV4cGxpY2l0IERpYWdvbmFsUHJlY29uZGl0aW9uZXIoY29uc3QgTWF0VHlwZSYgbWF0KSA6IG1faW52ZGlhZyhtYXQuY29scygpKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0KTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9pbnZkaWFnLnNpemUoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2ludmRpYWcuc2l6ZSgpOyB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0VHlwZT4KKyAgICBEaWFnb25hbFByZWNvbmRpdGlvbmVyJiBhbmFseXplUGF0dGVybihjb25zdCBNYXRUeXBlJiApCisgICAgeworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRUeXBlPgorICAgIERpYWdvbmFsUHJlY29uZGl0aW9uZXImIGZhY3Rvcml6ZShjb25zdCBNYXRUeXBlJiBtYXQpCisgICAgeworICAgICAgbV9pbnZkaWFnLnJlc2l6ZShtYXQuY29scygpKTsKKyAgICAgIGZvcihpbnQgaj0wOyBqPG1hdC5vdXRlclNpemUoKTsgKytqKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBNYXRUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1hdCxqKTsKKyAgICAgICAgd2hpbGUoaXQgJiYgaXQuaW5kZXgoKSE9aikgKytpdDsKKyAgICAgICAgaWYoaXQgJiYgaXQuaW5kZXgoKT09aiAmJiBpdC52YWx1ZSgpIT1TY2FsYXIoMCkpCisgICAgICAgICAgbV9pbnZkaWFnKGopID0gU2NhbGFyKDEpL2l0LnZhbHVlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2ludmRpYWcoaikgPSBTY2FsYXIoMSk7CisgICAgICB9CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRUeXBlPgorICAgIERpYWdvbmFsUHJlY29uZGl0aW9uZXImIGNvbXB1dGUoY29uc3QgTWF0VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIHJldHVybiBmYWN0b3JpemUobWF0KTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICAgIHsKKyAgICAgIHggPSBtX2ludmRpYWcuYXJyYXkoKSAqIGIuYXJyYXkoKSA7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPiBpbmxpbmUgY29uc3QgU29sdmU8RGlhZ29uYWxQcmVjb25kaXRpb25lciwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEaWFnb25hbFByZWNvbmRpdGlvbmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ludmRpYWcuc2l6ZSgpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJEaWFnb25hbFByZWNvbmRpdGlvbmVyOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxEaWFnb25hbFByZWNvbmRpdGlvbmVyLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorICAgIAorICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgeyByZXR1cm4gU3VjY2VzczsgfQorCisgIHByb3RlY3RlZDoKKyAgICBWZWN0b3IgbV9pbnZkaWFnOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworfTsKKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGJyaWVmIEphY29iaSBwcmVjb25kaXRpb25lciBmb3IgTGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIGFwcHJveGltYXRlbHkgc29sdmUgZm9yIEEnIEEgeCAgPSBBJyBiIHByb2JsZW1zIGFzc3VtaW5nIEEnIEEgaXMgYSBkaWFnb25hbCBtYXRyaXguCisgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgcHJlY29uZGl0aW9uZXIgbmVnbGVjdHMgYWxsIG9mZiBkaWFnb25hbCBlbnRyaWVzIGFuZCwgaW4gRWlnZW4ncyBsYW5ndWFnZSwgc29sdmVzIGZvcjoKKyAgICBcY29kZQorICAgIChBLmFkam9pbnQoKSAqIEEpLmRpYWdvbmFsKCkuYXNEaWFnb25hbCgpICogeCA9IGIKKyAgICBcZW5kY29kZQorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSB0eXBlIG9mIHRoZSBzY2FsYXIuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFRoZSBkaWFnb25hbCBlbnRyaWVzIGFyZSBwcmUtaW52ZXJ0ZWQgYW5kIHN0b3JlZCBpbnRvIGEgZGVuc2UgdmVjdG9yLgorICAqIAorICAqIFxzYSBjbGFzcyBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudCwgY2xhc3MgRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBMZWFzdFNxdWFyZURpYWdvbmFsUHJlY29uZGl0aW9uZXIgOiBwdWJsaWMgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxfU2NhbGFyPgoreworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxfU2NhbGFyPiBCYXNlOworICAgIHVzaW5nIEJhc2U6Om1faW52ZGlhZzsKKyAgcHVibGljOgorCisgICAgTGVhc3RTcXVhcmVEaWFnb25hbFByZWNvbmRpdGlvbmVyKCkgOiBCYXNlKCkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdFR5cGU+CisgICAgZXhwbGljaXQgTGVhc3RTcXVhcmVEaWFnb25hbFByZWNvbmRpdGlvbmVyKGNvbnN0IE1hdFR5cGUmIG1hdCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0VHlwZT4KKyAgICBMZWFzdFNxdWFyZURpYWdvbmFsUHJlY29uZGl0aW9uZXImIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdFR5cGUmICkKKyAgICB7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdFR5cGU+CisgICAgTGVhc3RTcXVhcmVEaWFnb25hbFByZWNvbmRpdGlvbmVyJiBmYWN0b3JpemUoY29uc3QgTWF0VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIC8vIENvbXB1dGUgdGhlIGludmVyc2Ugc3F1YXJlZC1ub3JtIG9mIGVhY2ggY29sdW1uIG9mIG1hdAorICAgICAgbV9pbnZkaWFnLnJlc2l6ZShtYXQuY29scygpKTsKKyAgICAgIGlmKE1hdFR5cGU6OklzUm93TWFqb3IpCisgICAgICB7CisgICAgICAgIG1faW52ZGlhZy5zZXRaZXJvKCk7CisgICAgICAgIGZvcihJbmRleCBqPTA7IGo8bWF0Lm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBmb3IodHlwZW5hbWUgTWF0VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtYXQsaik7IGl0OyArK2l0KQorICAgICAgICAgICAgbV9pbnZkaWFnKGl0LmluZGV4KCkpICs9IG51bWV4dDo6YWJzMihpdC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1hdC5jb2xzKCk7ICsraikKKyAgICAgICAgICBpZihudW1leHQ6OnJlYWwobV9pbnZkaWFnKGopKT5SZWFsU2NhbGFyKDApKQorICAgICAgICAgICAgbV9pbnZkaWFnKGopID0gUmVhbFNjYWxhcigxKS9udW1leHQ6OnJlYWwobV9pbnZkaWFnKGopKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGo9MDsgajxtYXQub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIFJlYWxTY2FsYXIgc3VtID0gbWF0LmlubmVyVmVjdG9yKGopLnNxdWFyZWROb3JtKCk7CisgICAgICAgICAgaWYoc3VtPlJlYWxTY2FsYXIoMCkpCisgICAgICAgICAgICBtX2ludmRpYWcoaikgPSBSZWFsU2NhbGFyKDEpL3N1bTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2ludmRpYWcoaikgPSBSZWFsU2NhbGFyKDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBCYXNlOjptX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRUeXBlPgorICAgIExlYXN0U3F1YXJlRGlhZ29uYWxQcmVjb25kaXRpb25lciYgY29tcHV0ZShjb25zdCBNYXRUeXBlJiBtYXQpCisgICAgeworICAgICAgcmV0dXJuIGZhY3Rvcml6ZShtYXQpOworICAgIH0KKyAgICAKKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIHsgcmV0dXJuIFN1Y2Nlc3M7IH0KKworICBwcm90ZWN0ZWQ6Cit9OworCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgQSBuYWl2ZSBwcmVjb25kaXRpb25lciB3aGljaCBhcHByb3hpbWF0ZXMgYW55IG1hdHJpeCBhcyB0aGUgaWRlbnRpdHkgbWF0cml4CisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBjbGFzcyBEaWFnb25hbFByZWNvbmRpdGlvbmVyCisgICovCitjbGFzcyBJZGVudGl0eVByZWNvbmRpdGlvbmVyCit7CisgIHB1YmxpYzoKKworICAgIElkZW50aXR5UHJlY29uZGl0aW9uZXIoKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBleHBsaWNpdCBJZGVudGl0eVByZWNvbmRpdGlvbmVyKGNvbnN0IE1hdHJpeFR5cGUmICkge30KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIElkZW50aXR5UHJlY29uZGl0aW9uZXImIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmICkgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIElkZW50aXR5UHJlY29uZGl0aW9uZXImIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiApIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIElkZW50aXR5UHJlY29uZGl0aW9uZXImIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgKSB7IHJldHVybiAqdGhpczsgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgUmhzJiBzb2x2ZShjb25zdCBSaHMmIGIpIGNvbnN0IHsgcmV0dXJuIGI7IH0KKyAgICAKKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIHsgcmV0dXJuIFN1Y2Nlc3M7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkFTSUNfUFJFQ09ORElUSU9ORVJTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0JpQ0dTVEFCLmggYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CaUNHU1RBQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGY0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CaUNHU1RBQi5oCkBAIC0wLDAgKzEsMjI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CSUNHU1RBQl9ICisjZGVmaW5lIEVJR0VOX0JJQ0dTVEFCX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgTG93LWxldmVsIGJpIGNvbmp1Z2F0ZSBncmFkaWVudCBzdGFiaWxpemVkIGFsZ29yaXRobQorICAqIFxwYXJhbSBtYXQgVGhlIG1hdHJpeCBBCisgICogXHBhcmFtIHJocyBUaGUgcmlnaHQgaGFuZCBzaWRlIHZlY3RvciBiCisgICogXHBhcmFtIHggT24gaW5wdXQgYW5kIGluaXRpYWwgc29sdXRpb24sIG9uIG91dHB1dCB0aGUgY29tcHV0ZWQgc29sdXRpb24uCisgICogXHBhcmFtIHByZWNvbmQgQSBwcmVjb25kaXRpb25lciBiZWluZyBhYmxlIHRvIGVmZmljaWVudGx5IHNvbHZlIGZvciBhbgorICAqICAgICAgICAgICAgICAgIGFwcHJveGltYXRpb24gb2YgQXg9YiAocmVnYXJkbGVzcyBvZiBiKQorICAqIFxwYXJhbSBpdGVycyBPbiBpbnB1dCB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb24sIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mIHBlcmZvcm1lZCBpdGVyYXRpb25zLgorICAqIFxwYXJhbSB0b2xfZXJyb3IgT24gaW5wdXQgdGhlIHRvbGVyYW5jZSBlcnJvciwgb24gb3V0cHV0IGFuIGVzdGltYXRpb24gb2YgdGhlIHJlbGF0aXZlIGVycm9yLgorICAqIFxyZXR1cm4gZmFsc2UgaW4gdGhlIGNhc2Ugb2YgbnVtZXJpY2FsIGlzc3VlLCBmb3IgZXhhbXBsZSBhIGJyZWFrIGRvd24gb2YgQmlDR1NUQUIuIAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBQcmVjb25kaXRpb25lcj4KK2Jvb2wgYmljZ3N0YWIoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBSaHMmIHJocywgRGVzdCYgeCwKKyAgICAgICAgICAgICAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIEluZGV4JiBpdGVycywKKyAgICAgICAgICAgICAgdHlwZW5hbWUgRGVzdDo6UmVhbFNjYWxhciYgdG9sX2Vycm9yKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JUeXBlOworICBSZWFsU2NhbGFyIHRvbCA9IHRvbF9lcnJvcjsKKyAgSW5kZXggbWF4SXRlcnMgPSBpdGVyczsKKworICBJbmRleCBuID0gbWF0LmNvbHMoKTsKKyAgVmVjdG9yVHlwZSByICA9IHJocyAtIG1hdCAqIHg7CisgIFZlY3RvclR5cGUgcjAgPSByOworICAKKyAgUmVhbFNjYWxhciByMF9zcW5vcm0gPSByMC5zcXVhcmVkTm9ybSgpOworICBSZWFsU2NhbGFyIHJoc19zcW5vcm0gPSByaHMuc3F1YXJlZE5vcm0oKTsKKyAgaWYocmhzX3Nxbm9ybSA9PSAwKQorICB7CisgICAgeC5zZXRaZXJvKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgU2NhbGFyIHJobyAgICA9IDE7CisgIFNjYWxhciBhbHBoYSAgPSAxOworICBTY2FsYXIgdyAgICAgID0gMTsKKyAgCisgIFZlY3RvclR5cGUgdiA9IFZlY3RvclR5cGU6Olplcm8obiksIHAgPSBWZWN0b3JUeXBlOjpaZXJvKG4pOworICBWZWN0b3JUeXBlIHkobiksICB6KG4pOworICBWZWN0b3JUeXBlIGt0KG4pLCBrcyhuKTsKKworICBWZWN0b3JUeXBlIHMobiksIHQobik7CisKKyAgUmVhbFNjYWxhciB0b2wyID0gdG9sKnRvbCpyaHNfc3Fub3JtOworICBSZWFsU2NhbGFyIGVwczIgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKk51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgIEluZGV4IGkgPSAwOworICBJbmRleCByZXN0YXJ0cyA9IDA7CisKKyAgd2hpbGUgKCByLnNxdWFyZWROb3JtKCkgPiB0b2wyICYmIGk8bWF4SXRlcnMgKQorICB7CisgICAgU2NhbGFyIHJob19vbGQgPSByaG87CisKKyAgICByaG8gPSByMC5kb3Qocik7CisgICAgaWYgKGFicyhyaG8pIDwgZXBzMipyMF9zcW5vcm0pCisgICAgeworICAgICAgLy8gVGhlIG5ldyByZXNpZHVhbCB2ZWN0b3IgYmVjYW1lIHRvbyBvcnRob2dvbmFsIHRvIHRoZSBhcmJpdHJhcmlseSBjaG9zZW4gZGlyZWN0aW9uIHIwCisgICAgICAvLyBMZXQncyByZXN0YXJ0IHdpdGggYSBuZXcgcjA6CisgICAgICByICA9IHJocyAtIG1hdCAqIHg7CisgICAgICByMCA9IHI7CisgICAgICByaG8gPSByMF9zcW5vcm0gPSByLnNxdWFyZWROb3JtKCk7CisgICAgICBpZihyZXN0YXJ0cysrID09IDApCisgICAgICAgIGkgPSAwOworICAgIH0KKyAgICBTY2FsYXIgYmV0YSA9IChyaG8vcmhvX29sZCkgKiAoYWxwaGEgLyB3KTsKKyAgICBwID0gciArIGJldGEgKiAocCAtIHcgKiB2KTsKKyAgICAKKyAgICB5ID0gcHJlY29uZC5zb2x2ZShwKTsKKyAgICAKKyAgICB2Lm5vYWxpYXMoKSA9IG1hdCAqIHk7CisKKyAgICBhbHBoYSA9IHJobyAvIHIwLmRvdCh2KTsKKyAgICBzID0gciAtIGFscGhhICogdjsKKworICAgIHogPSBwcmVjb25kLnNvbHZlKHMpOworICAgIHQubm9hbGlhcygpID0gbWF0ICogejsKKworICAgIFJlYWxTY2FsYXIgdG1wID0gdC5zcXVhcmVkTm9ybSgpOworICAgIGlmKHRtcD5SZWFsU2NhbGFyKDApKQorICAgICAgdyA9IHQuZG90KHMpIC8gdG1wOworICAgIGVsc2UKKyAgICAgIHcgPSBTY2FsYXIoMCk7CisgICAgeCArPSBhbHBoYSAqIHkgKyB3ICogejsKKyAgICByID0gcyAtIHcgKiB0OworICAgICsraTsKKyAgfQorICB0b2xfZXJyb3IgPSBzcXJ0KHIuc3F1YXJlZE5vcm0oKS9yaHNfc3Fub3JtKTsKKyAgaXRlcnMgPSBpOworICByZXR1cm4gdHJ1ZTsgCit9CisKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lciA9IERpYWdvbmFsUHJlY29uZGl0aW9uZXI8dHlwZW5hbWUgX01hdHJpeFR5cGU6OlNjYWxhcj4gPgorY2xhc3MgQmlDR1NUQUI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyPgorc3RydWN0IHRyYWl0czxCaUNHU1RBQjxfTWF0cml4VHlwZSxfUHJlY29uZGl0aW9uZXI+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIF9QcmVjb25kaXRpb25lciBQcmVjb25kaXRpb25lcjsKK307CisKK30KKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGJyaWVmIEEgYmkgY29uanVnYXRlIGdyYWRpZW50IHN0YWJpbGl6ZWQgc29sdmVyIGZvciBzcGFyc2Ugc3F1YXJlIHByb2JsZW1zCisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS54ID0gYiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHVzaW5nIGEgYmkgY29uanVnYXRlIGdyYWRpZW50CisgICogc3RhYmlsaXplZCBhbGdvcml0aG0uIFRoZSB2ZWN0b3JzIHggYW5kIGIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGNhbiBiZSBhIGRlbnNlIG9yIGEgc3BhcnNlIG1hdHJpeC4KKyAgKiBcdHBhcmFtIF9QcmVjb25kaXRpb25lciB0aGUgdHlwZSBvZiB0aGUgcHJlY29uZGl0aW9uZXIuIERlZmF1bHQgaXMgRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBUaGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbmQgdG9sZXJhbmNlIHZhbHVlIGNhbiBiZSBjb250cm9sbGVkIHZpYSB0aGUgc2V0TWF4SXRlcmF0aW9ucygpCisgICogYW5kIHNldFRvbGVyYW5jZSgpIG1ldGhvZHMuIFRoZSBkZWZhdWx0cyBhcmUgdGhlIHNpemUgb2YgdGhlIHByb2JsZW0gZm9yIHRoZSBtYXhpbWFsIG51bWJlciBvZiBpdGVyYXRpb25zCisgICogYW5kIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgZm9yIHRoZSB0b2xlcmFuY2UuCisgICogCisgICogVGhlIHRvbGVyYW5jZSBjb3JyZXNwb25kcyB0byB0aGUgcmVsYXRpdmUgcmVzaWR1YWwgZXJyb3I6IHxBeC1ifC98YnwKKyAgKiAKKyAgKiBcYiBQZXJmb3JtYW5jZTogd2hlbiB1c2luZyBzcGFyc2UgbWF0cmljZXMsIGJlc3QgcGVyZm9ybWFuY2UgaXMgYWNoaWVkIGZvciBhIHJvdy1tYWpvciBzcGFyc2UgbWF0cml4IGZvcm1hdC4KKyAgKiBNb3Jlb3ZlciwgaW4gdGhpcyBjYXNlIG11bHRpLXRocmVhZGluZyBjYW4gYmUgZXhwbG9pdGVkIGlmIHRoZSB1c2VyIGNvZGUgaXMgY29tcGlsZWQgd2l0aCBPcGVuTVAgZW5hYmxlZC4KKyAgKiBTZWUgXHJlZiBUb3BpY011bHRpVGhyZWFkaW5nIGZvciBkZXRhaWxzLgorICAqIAorICAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIGRpcmVjdCBzb2x2ZXIgY2xhc3Nlcy4gSGVyZSBpcyBhIHR5cGljYWwgdXNhZ2UgZXhhbXBsZToKKyAgKiBcaW5jbHVkZSBCaUNHU1RBQl9zaW1wbGUuY3BwCisgICogCisgICogQnkgZGVmYXVsdCB0aGUgaXRlcmF0aW9ucyBzdGFydCB3aXRoIHg9MCBhcyBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBzb2x1dGlvbi4KKyAgKiBPbmUgY2FuIGNvbnRyb2wgdGhlIHN0YXJ0IHVzaW5nIHRoZSBzb2x2ZVdpdGhHdWVzcygpIG1ldGhvZC4KKyAgKiAKKyAgKiBCaUNHU1RBQiBjYW4gYWxzbyBiZSB1c2VkIGluIGEgbWF0cml4LWZyZWUgY29udGV4dCwgc2VlIHRoZSBmb2xsb3dpbmcgXGxpbmsgTWF0cml4ZnJlZVNvbHZlckV4YW1wbGUgZXhhbXBsZSBcZW5kbGluay4KKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3ksIERpYWdvbmFsUHJlY29uZGl0aW9uZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIKKyAgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyPgorY2xhc3MgQmlDR1NUQUIgOiBwdWJsaWMgSXRlcmF0aXZlU29sdmVyQmFzZTxCaUNHU1RBQjxfTWF0cml4VHlwZSxfUHJlY29uZGl0aW9uZXI+ID4KK3sKKyAgdHlwZWRlZiBJdGVyYXRpdmVTb2x2ZXJCYXNlPEJpQ0dTVEFCPiBCYXNlOworICB1c2luZyBCYXNlOjptYXRyaXg7CisgIHVzaW5nIEJhc2U6Om1fZXJyb3I7CisgIHVzaW5nIEJhc2U6Om1faXRlcmF0aW9uczsKKyAgdXNpbmcgQmFzZTo6bV9pbmZvOworICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CitwdWJsaWM6CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7CisKK3B1YmxpYzoKKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgQmlDR1NUQUIoKSA6IEJhc2UoKSB7fQorCisgIC8qKiBJbml0aWFsaXplIHRoZSBzb2x2ZXIgd2l0aCBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBcYyBBeD1iIHNvbHZpbmcuCisgICAgKiAKKyAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9sbG93ZWQKKyAgICAqIGJ5IGEgY2FsbCB0byBjb21wdXRlKCkuCisgICAgKiAKKyAgICAqIFx3YXJuaW5nIHRoaXMgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggQSBhcyB3ZWxsIGFzIHNvbWUKKyAgICAqIHByZWNvbXB1dGVkIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhlcmVmb3JlLCBpZiBcYSBBIGlzIGNoYW5nZWQKKyAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgKiBtYXRyaXggQSwgb3IgbW9kaWZ5IGEgY29weSBvZiBBLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CisgIGV4cGxpY2l0IEJpQ0dTVEFCKGNvbnN0IEVpZ2VuQmFzZTxNYXRyaXhEZXJpdmVkPiYgQSkgOiBCYXNlKEEuZGVyaXZlZCgpKSB7fQorCisgIH5CaUNHU1RBQigpIHt9CisKKyAgLyoqIFxpbnRlcm5hbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgdm9pZCBfc29sdmVfd2l0aF9ndWVzc19pbXBsKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgeyAgICAKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZvcihJbmRleCBqPTA7IGo8Yi5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBtX2l0ZXJhdGlvbnMgPSBCYXNlOjptYXhJdGVyYXRpb25zKCk7CisgICAgICBtX2Vycm9yID0gQmFzZTo6bV90b2xlcmFuY2U7CisgICAgICAKKyAgICAgIHR5cGVuYW1lIERlc3Q6OkNvbFhwciB4aih4LGopOworICAgICAgaWYoIWludGVybmFsOjpiaWNnc3RhYihtYXRyaXgoKSwgYi5jb2woaiksIHhqLCBCYXNlOjptX3ByZWNvbmRpdGlvbmVyLCBtX2l0ZXJhdGlvbnMsIG1fZXJyb3IpKQorICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKyAgICBtX2luZm8gPSBmYWlsZWQgPyBOdW1lcmljYWxJc3N1ZQorICAgICAgICAgICA6IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzCisgICAgICAgICAgIDogTm9Db252ZXJnZW5jZTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgLyoqIFxpbnRlcm5hbCAqLworICB1c2luZyBCYXNlOjpfc29sdmVfaW1wbDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgeC5yZXNpemUodGhpcy0+cm93cygpLGIuY29scygpKTsKKyAgICB4LnNldFplcm8oKTsKKyAgICBfc29sdmVfd2l0aF9ndWVzc19pbXBsKGIseCk7CisgIH0KKworcHJvdGVjdGVkOgorCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0JJQ0dTVEFCX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0Nvbmp1Z2F0ZUdyYWRpZW50LmggYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9Db25qdWdhdGVHcmFkaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWRhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9Db25qdWdhdGVHcmFkaWVudC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT05KVUdBVEVfR1JBRElFTlRfSAorI2RlZmluZSBFSUdFTl9DT05KVUdBVEVfR1JBRElFTlRfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCBMb3ctbGV2ZWwgY29uanVnYXRlIGdyYWRpZW50IGFsZ29yaXRobQorICAqIFxwYXJhbSBtYXQgVGhlIG1hdHJpeCBBCisgICogXHBhcmFtIHJocyBUaGUgcmlnaHQgaGFuZCBzaWRlIHZlY3RvciBiCisgICogXHBhcmFtIHggT24gaW5wdXQgYW5kIGluaXRpYWwgc29sdXRpb24sIG9uIG91dHB1dCB0aGUgY29tcHV0ZWQgc29sdXRpb24uCisgICogXHBhcmFtIHByZWNvbmQgQSBwcmVjb25kaXRpb25lciBiZWluZyBhYmxlIHRvIGVmZmljaWVudGx5IHNvbHZlIGZvciBhbgorICAqICAgICAgICAgICAgICAgIGFwcHJveGltYXRpb24gb2YgQXg9YiAocmVnYXJkbGVzcyBvZiBiKQorICAqIFxwYXJhbSBpdGVycyBPbiBpbnB1dCB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb24sIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mIHBlcmZvcm1lZCBpdGVyYXRpb25zLgorICAqIFxwYXJhbSB0b2xfZXJyb3IgT24gaW5wdXQgdGhlIHRvbGVyYW5jZSBlcnJvciwgb24gb3V0cHV0IGFuIGVzdGltYXRpb24gb2YgdGhlIHJlbGF0aXZlIGVycm9yLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBQcmVjb25kaXRpb25lcj4KK0VJR0VOX0RPTlRfSU5MSU5FCit2b2lkIGNvbmp1Z2F0ZV9ncmFkaWVudChjb25zdCBNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IFJocyYgcmhzLCBEZXN0JiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIEluZGV4JiBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXImIHRvbF9lcnJvcikKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgCisgIFJlYWxTY2FsYXIgdG9sID0gdG9sX2Vycm9yOworICBJbmRleCBtYXhJdGVycyA9IGl0ZXJzOworICAKKyAgSW5kZXggbiA9IG1hdC5jb2xzKCk7CisKKyAgVmVjdG9yVHlwZSByZXNpZHVhbCA9IHJocyAtIG1hdCAqIHg7IC8vaW5pdGlhbCByZXNpZHVhbAorCisgIFJlYWxTY2FsYXIgcmhzTm9ybTIgPSByaHMuc3F1YXJlZE5vcm0oKTsKKyAgaWYocmhzTm9ybTIgPT0gMCkgCisgIHsKKyAgICB4LnNldFplcm8oKTsKKyAgICBpdGVycyA9IDA7CisgICAgdG9sX2Vycm9yID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSB0b2wqdG9sKnJoc05vcm0yOworICBSZWFsU2NhbGFyIHJlc2lkdWFsTm9ybTIgPSByZXNpZHVhbC5zcXVhcmVkTm9ybSgpOworICBpZiAocmVzaWR1YWxOb3JtMiA8IHRocmVzaG9sZCkKKyAgeworICAgIGl0ZXJzID0gMDsKKyAgICB0b2xfZXJyb3IgPSBzcXJ0KHJlc2lkdWFsTm9ybTIgLyByaHNOb3JtMik7CisgICAgcmV0dXJuOworICB9CisgIAorICBWZWN0b3JUeXBlIHAobik7CisgIHAgPSBwcmVjb25kLnNvbHZlKHJlc2lkdWFsKTsgICAgICAvLyBpbml0aWFsIHNlYXJjaCBkaXJlY3Rpb24KKworICBWZWN0b3JUeXBlIHoobiksIHRtcChuKTsKKyAgUmVhbFNjYWxhciBhYnNOZXcgPSBudW1leHQ6OnJlYWwocmVzaWR1YWwuZG90KHApKTsgIC8vIHRoZSBzcXVhcmUgb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHIgc2NhbGVkIGJ5IGludk0KKyAgSW5kZXggaSA9IDA7CisgIHdoaWxlKGkgPCBtYXhJdGVycykKKyAgeworICAgIHRtcC5ub2FsaWFzKCkgPSBtYXQgKiBwOyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdHRsZW5lY2sgb2YgdGhlIGFsZ29yaXRobQorCisgICAgU2NhbGFyIGFscGhhID0gYWJzTmV3IC8gcC5kb3QodG1wKTsgICAgICAgICAvLyB0aGUgYW1vdW50IHdlIHRyYXZlbCBvbiBkaXIKKyAgICB4ICs9IGFscGhhICogcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzb2x1dGlvbgorICAgIHJlc2lkdWFsIC09IGFscGhhICogdG1wOyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHJlc2lkdWFsCisgICAgCisgICAgcmVzaWR1YWxOb3JtMiA9IHJlc2lkdWFsLnNxdWFyZWROb3JtKCk7CisgICAgaWYocmVzaWR1YWxOb3JtMiA8IHRocmVzaG9sZCkKKyAgICAgIGJyZWFrOworICAgIAorICAgIHogPSBwcmVjb25kLnNvbHZlKHJlc2lkdWFsKTsgICAgICAgICAgICAgICAgLy8gYXBwcm94aW1hdGVseSBzb2x2ZSBmb3IgIkEgeiA9IHJlc2lkdWFsIgorCisgICAgUmVhbFNjYWxhciBhYnNPbGQgPSBhYnNOZXc7CisgICAgYWJzTmV3ID0gbnVtZXh0OjpyZWFsKHJlc2lkdWFsLmRvdCh6KSk7ICAgICAvLyB1cGRhdGUgdGhlIGFic29sdXRlIHZhbHVlIG9mIHIKKyAgICBSZWFsU2NhbGFyIGJldGEgPSBhYnNOZXcgLyBhYnNPbGQ7ICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgR3JhbS1TY2htaWR0IHZhbHVlIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgc2VhcmNoIGRpcmVjdGlvbgorICAgIHAgPSB6ICsgYmV0YSAqIHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlYXJjaCBkaXJlY3Rpb24KKyAgICBpKys7CisgIH0KKyAgdG9sX2Vycm9yID0gc3FydChyZXNpZHVhbE5vcm0yIC8gcmhzTm9ybTIpOworICBpdGVycyA9IGk7Cit9CisKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG89TG93ZXIsCisgICAgICAgICAgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyID0gRGlhZ29uYWxQcmVjb25kaXRpb25lcjx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyPiA+CitjbGFzcyBDb25qdWdhdGVHcmFkaWVudDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK3N0cnVjdCB0cmFpdHM8Q29uanVnYXRlR3JhZGllbnQ8X01hdHJpeFR5cGUsX1VwTG8sX1ByZWNvbmRpdGlvbmVyPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7Cit9OworCit9CisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZQorICAqIFxicmllZiBBIGNvbmp1Z2F0ZSBncmFkaWVudCBzb2x2ZXIgZm9yIHNwYXJzZSAob3IgZGVuc2UpIHNlbGYtYWRqb2ludCBwcm9ibGVtcworICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gc29sdmUgZm9yIEEueCA9IGIgbGluZWFyIHByb2JsZW1zIHVzaW5nIGFuIGl0ZXJhdGl2ZSBjb25qdWdhdGUgZ3JhZGllbnQgYWxnb3JpdGhtLgorICAqIFRoZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZhZGpvaW50LiBUaGUgbWF0cml4IEEgYW5kIHRoZSB2ZWN0b3JzIHggYW5kIGIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggQSwgY2FuIGJlIGEgZGVuc2Ugb3IgYSBzcGFyc2UgbWF0cml4LgorICAqIFx0cGFyYW0gX1VwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4gSXQgY2FuIGJlIExvd2VyLAorICAqICAgICAgICAgICAgICAgXGMgVXBwZXIsIG9yIFxjIExvd2VyfFVwcGVyIGluIHdoaWNoIHRoZSBmdWxsIG1hdHJpeCBlbnRyaWVzIHdpbGwgYmUgY29uc2lkZXJlZC4KKyAgKiAgICAgICAgICAgICAgIERlZmF1bHQgaXMgXGMgTG93ZXIsIGJlc3QgcGVyZm9ybWFuY2UgaXMgXGMgTG93ZXJ8VXBwZXIuCisgICogXHRwYXJhbSBfUHJlY29uZGl0aW9uZXIgdGhlIHR5cGUgb2YgdGhlIHByZWNvbmRpdGlvbmVyLiBEZWZhdWx0IGlzIERpYWdvbmFsUHJlY29uZGl0aW9uZXIKKyAgKgorICAqIFxpbXBsc3BhcnNlc29sdmVyY29uY2VwdAorICAqCisgICogVGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRvbGVyYW5jZSB2YWx1ZSBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIHNldE1heEl0ZXJhdGlvbnMoKQorICAqIGFuZCBzZXRUb2xlcmFuY2UoKSBtZXRob2RzLiBUaGUgZGVmYXVsdHMgYXJlIHRoZSBzaXplIG9mIHRoZSBwcm9ibGVtIGZvciB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucworICAqIGFuZCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpIGZvciB0aGUgdG9sZXJhbmNlLgorICAqIAorICAqIFRoZSB0b2xlcmFuY2UgY29ycmVzcG9uZHMgdG8gdGhlIHJlbGF0aXZlIHJlc2lkdWFsIGVycm9yOiB8QXgtYnwvfGJ8CisgICogCisgICogXGIgUGVyZm9ybWFuY2U6IEV2ZW4gdGhvdWdoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFxjIF9VcExvIGlzIFxjIExvd2VyLCBzaWduaWZpY2FudGx5IGhpZ2hlciBwZXJmb3JtYW5jZSBpcworICAqIGFjaGlldmVkIHdoZW4gdXNpbmcgYSBjb21wbGV0ZSBtYXRyaXggYW5kIFxiIExvd2VyfFVwcGVyIGFzIHRoZSBcYSBfVXBMbyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuIE1vcmVvdmVyLCBpbiB0aGlzCisgICogY2FzZSBtdWx0aS10aHJlYWRpbmcgY2FuIGJlIGV4cGxvaXRlZCBpZiB0aGUgdXNlciBjb2RlIGlzIGNvbXBpbGVkIHdpdGggT3Blbk1QIGVuYWJsZWQuCisgICogU2VlIFxyZWYgVG9waWNNdWx0aVRocmVhZGluZyBmb3IgZGV0YWlscy4KKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIHRoZSBkaXJlY3Qgc29sdmVyIGNsYXNzZXMuIEhlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CisgICAgXGNvZGUKKyAgICBpbnQgbiA9IDEwMDAwOworICAgIFZlY3RvclhkIHgobiksIGIobik7CisgICAgU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLG4pOworICAgIC8vIGZpbGwgQSBhbmQgYgorICAgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxkb3VibGU+LCBMb3dlcnxVcHBlcj4gY2c7CisgICAgY2cuY29tcHV0ZShBKTsKKyAgICB4ID0gY2cuc29sdmUoYik7CisgICAgc3RkOjpjb3V0IDw8ICIjaXRlcmF0aW9uczogICAgICIgPDwgY2cuaXRlcmF0aW9ucygpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgImVzdGltYXRlZCBlcnJvcjogIiA8PCBjZy5lcnJvcigpICAgICAgPDwgc3RkOjplbmRsOworICAgIC8vIHVwZGF0ZSBiLCBhbmQgc29sdmUgYWdhaW4KKyAgICB4ID0gY2cuc29sdmUoYik7CisgICAgXGVuZGNvZGUKKyAgKiAKKyAgKiBCeSBkZWZhdWx0IHRoZSBpdGVyYXRpb25zIHN0YXJ0IHdpdGggeD0wIGFzIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIHNvbHV0aW9uLgorICAqIE9uZSBjYW4gY29udHJvbCB0aGUgc3RhcnQgdXNpbmcgdGhlIHNvbHZlV2l0aEd1ZXNzKCkgbWV0aG9kLgorICAqIAorICAqIENvbmp1Z2F0ZUdyYWRpZW50IGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBtYXRyaXgtZnJlZSBjb250ZXh0LCBzZWUgdGhlIGZvbGxvd2luZyBcbGluayBNYXRyaXhmcmVlU29sdmVyRXhhbXBsZSBleGFtcGxlIFxlbmRsaW5rLgorICAqCisgICogXHNhIGNsYXNzIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50LCBjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3ksIERpYWdvbmFsUHJlY29uZGl0aW9uZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIKKyAgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitjbGFzcyBDb25qdWdhdGVHcmFkaWVudCA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPENvbmp1Z2F0ZUdyYWRpZW50PF9NYXRyaXhUeXBlLF9VcExvLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8Q29uanVnYXRlR3JhZGllbnQ+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1hdHJpeDsKKyAgdXNpbmcgQmFzZTo6bV9lcnJvcjsKKyAgdXNpbmcgQmFzZTo6bV9pdGVyYXRpb25zOworICB1c2luZyBCYXNlOjptX2luZm87CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIF9QcmVjb25kaXRpb25lciBQcmVjb25kaXRpb25lcjsKKworICBlbnVtIHsKKyAgICBVcExvID0gX1VwTG8KKyAgfTsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICBDb25qdWdhdGVHcmFkaWVudCgpIDogQmFzZSgpIHt9CisKKyAgLyoqIEluaXRpYWxpemUgdGhlIHNvbHZlciB3aXRoIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIFxjIEF4PWIgc29sdmluZy4KKyAgICAqIAorICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb2xsb3dlZAorICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAqIAorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgZXhwbGljaXQgQ29uanVnYXRlR3JhZGllbnQoY29uc3QgRWlnZW5CYXNlPE1hdHJpeERlcml2ZWQ+JiBBKSA6IEJhc2UoQS5kZXJpdmVkKCkpIHt9CisKKyAgfkNvbmp1Z2F0ZUdyYWRpZW50KCkge30KKworICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpNYXRyaXhXcmFwcGVyIE1hdHJpeFdyYXBwZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpBY3R1YWxNYXRyaXhUeXBlIEFjdHVhbE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBUcmFuc3Bvc2VJbnB1dCAgPSAgICghTWF0cml4V3JhcHBlcjo6TWF0cml4RnJlZSkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAgKFVwTG89PShMb3dlcnxVcHBlcikpCisgICAgICAgICAgICAgICAgICAgICAgJiYgICghTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAmJiAgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8VHJhbnNwb3NlSW5wdXQsVHJhbnNwb3NlPGNvbnN0IEFjdHVhbE1hdHJpeFR5cGU+LCBBY3R1YWxNYXRyaXhUeXBlIGNvbnN0Jj46OnR5cGUgUm93TWFqb3JXcmFwcGVyOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhNYXRyaXhXcmFwcGVyOjpNYXRyaXhGcmVlLFVwTG89PShMb3dlcnxVcHBlcikpLE1BVFJJWF9GUkVFX0NPTkpVR0FURV9HUkFESUVOVF9JU19DT01QQVRJQkxFX1dJVEhfVVBQRVJfVU5JT05fTE9XRVJfTU9ERV9PTkxZKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxVcExvPT0oTG93ZXJ8VXBwZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd01ham9yV3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhXcmFwcGVyOjp0ZW1wbGF0ZSBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGU8VXBMbz46OlR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgU2VsZkFkam9pbnRXcmFwcGVyOworICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICBtX2Vycm9yID0gQmFzZTo6bV90b2xlcmFuY2U7CisKKyAgICBmb3IoSW5kZXggaj0wOyBqPGIuY29scygpOyArK2opCisgICAgeworICAgICAgbV9pdGVyYXRpb25zID0gQmFzZTo6bWF4SXRlcmF0aW9ucygpOworICAgICAgbV9lcnJvciA9IEJhc2U6Om1fdG9sZXJhbmNlOworCisgICAgICB0eXBlbmFtZSBEZXN0OjpDb2xYcHIgeGooeCxqKTsKKyAgICAgIFJvd01ham9yV3JhcHBlciByb3dfbWF0KG1hdHJpeCgpKTsKKyAgICAgIGludGVybmFsOjpjb25qdWdhdGVfZ3JhZGllbnQoU2VsZkFkam9pbnRXcmFwcGVyKHJvd19tYXQpLCBiLmNvbChqKSwgeGosIEJhc2U6Om1fcHJlY29uZGl0aW9uZXIsIG1faXRlcmF0aW9ucywgbV9lcnJvcik7CisgICAgfQorCisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBtX2luZm8gPSBtX2Vycm9yIDw9IEJhc2U6Om1fdG9sZXJhbmNlID8gU3VjY2VzcyA6IE5vQ29udmVyZ2VuY2U7CisgIH0KKyAgCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgdXNpbmcgQmFzZTo6X3NvbHZlX2ltcGw7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYiwgRGVzdCYgeCkgY29uc3QKKyAgeworICAgIHguc2V0WmVybygpOworICAgIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoYi5kZXJpdmVkKCkseCk7CisgIH0KKworcHJvdGVjdGVkOgorCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTkpVR0FURV9HUkFESUVOVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JbmNvbXBsZXRlQ2hvbGVza3kuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0luY29tcGxldGVDaG9sZXNreS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWMyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JbmNvbXBsZXRlQ2hvbGVza3kuaApAQCAtMCwwICsxLDQwMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lOQ09NUExFVEVfQ0hPbEVTS1lfSAorI2RlZmluZSBFSUdFTl9JTkNPTVBMRVRFX0NIT2xFU0tZX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgRWlnZW4geyAgCisvKiogCisgICogXGJyaWVmIE1vZGlmaWVkIEluY29tcGxldGUgQ2hvbGVza3kgd2l0aCBkdWFsIHRocmVzaG9sZAorICAqCisgICogUmVmZXJlbmNlcyA6IEMtSi4gTGluIGFuZCBKLiBKLiBNb3LDqSwgSW5jb21wbGV0ZSBDaG9sZXNreSBGYWN0b3JpemF0aW9ucyB3aXRoCisgICogICAgICAgICAgICAgIExpbWl0ZWQgbWVtb3J5LCBTSUFNIEouIFNjaS4gQ29tcHV0LiAgMjEoMSksIHBwLiAyNC00NSwgMTk5OQorICAqCisgICogXHRwYXJhbSBTY2FsYXIgdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBpbnB1dCBtYXRyaWNlcworICAqIFx0cGFyYW0gX1VwTG8gVGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4gSXQgY2FuIGJlIExvd2VyCisgICAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqIFx0cGFyYW0gX09yZGVyaW5nVHlwZSBUaGUgb3JkZXJpbmcgbWV0aG9kIHRvIHVzZSwgZWl0aGVyIEFNRE9yZGVyaW5nPD4gb3IgTmF0dXJhbE9yZGVyaW5nPD4uIERlZmF1bHQgaXMgQU1ET3JkZXJpbmc8aW50PiwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIEVJR0VOX01QTDJfT05MWSBpcyBkZWZpbmVkLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIE5hdHVyYWxPcmRlcmluZzxpbnQ+LgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBJdCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGluY29tcGxldGUgZmFjdG9yaXphdGlvbjogXGYkIFMgUCBBIFAnIFMgXGFwcHJveCBMIEwnIFxmJAorICAqIHdoZXJlIEwgaXMgYSBsb3dlciB0cmlhbmd1bGFyIGZhY3RvciwgUyBpcyBhIGRpYWdvbmFsIHNjYWxpbmcgbWF0cml4LCBhbmQgUCBpcyBhCisgICogZmlsbC1pbiByZWR1Y2luZyBwZXJtdXRhdGlvbiBhcyBjb21wdXRlZCBieSB0aGUgb3JkZXJpbmcgbWV0aG9kLgorICAqCisgICogXGIgU2hpZnRpbmcgXGIgc3RyYXRlZ3k6IExldCBcZiQgQiA9IFMgUCBBIFAnIFMgXGYkICBiZSB0aGUgc2NhbGVkIG1hdHJpeCBvbiB3aGljaCB0aGUgZmFjdG9yaXphdGlvbiBpcyBjYXJyaWVkIG91dCwKKyAgKiBhbmQgXGYkIFxiZXRhIFxmJCBiZSB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgZGlhZ29uYWwuIElmIFxmJCBcYmV0YSA+IDAgXGYkIHRoZW4sIHRoZSBmYWN0b3JpemF0aW9uIGlzIGRpcmVjdGx5IHBlcmZvcm1lZAorICAqIG9uIHRoZSBtYXRyaXggQi4gT3RoZXJ3aXNlLCB0aGUgZmFjdG9yaXphdGlvbiBpcyBwZXJmb3JtZWQgb24gdGhlIHNoaWZ0ZWQgbWF0cml4IFxmJCBCICsgKFxzaWdtYSt8XGJldGF8IEkgXGYkIHdoZXJlCisgICogXGYkIFxzaWdtYSBcZiQgaXMgdGhlIGluaXRpYWwgc2hpZnQgdmFsdWUgYXMgcmV0dXJuZWQgYW5kIHNldCBieSBzZXRJbml0aWFsU2hpZnQoKSBtZXRob2QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxmJCBcc2lnbWEgPSAxMF57LTN9IFxmJC4KKyAgKiBJZiB0aGUgZmFjdG9yaXphdGlvbiBmYWlscywgdGhlbiB0aGUgc2hpZnQgaW4gZG91YmxlZCB1bnRpbCBpdCBzdWNjZWVkIG9yIGEgbWF4aW11bSBvZiB0ZW4gYXR0ZW1wdHMuIElmIGl0IHN0aWxsIGZhaWxzLCBhcyByZXR1cm5lZCBieQorICAqIHRoZSBpbmZvKCkgbWV0aG9kLCB0aGVuIHlvdSBjYW4gZWl0aGVyIGluY3JlYXNlIHRoZSBpbml0aWFsIHNoaWZ0LCBvciBiZXR0ZXIgdXNlIGFub3RoZXIgcHJlY29uZGl0aW9uaW5nIHRlY2huaXF1ZS4KKyAgKgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IF9VcExvID0gTG93ZXIsIHR5cGVuYW1lIF9PcmRlcmluZ1R5cGUgPQorI2lmbmRlZiBFSUdFTl9NUEwyX09OTFkKK0FNRE9yZGVyaW5nPGludD4KKyNlbHNlCitOYXR1cmFsT3JkZXJpbmc8aW50PgorI2VuZGlmCis+CitjbGFzcyBJbmNvbXBsZXRlQ2hvbGVza3kgOiBwdWJsaWMgU3BhcnNlU29sdmVyQmFzZTxJbmNvbXBsZXRlQ2hvbGVza3k8U2NhbGFyLF9VcExvLF9PcmRlcmluZ1R5cGU+ID4KK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgU3BhcnNlU29sdmVyQmFzZTxJbmNvbXBsZXRlQ2hvbGVza3k8U2NhbGFyLF9VcExvLF9PcmRlcmluZ1R5cGU+ID4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7IAorICAgIHR5cGVkZWYgX09yZGVyaW5nVHlwZSBPcmRlcmluZ1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBPcmRlcmluZ1R5cGU6OlBlcm11dGF0aW9uVHlwZSBQZXJtdXRhdGlvblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQZXJtdXRhdGlvblR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7IAorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+IEZhY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yU3g7CisgICAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclJ4OworICAgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLCAxPiBWZWN0b3JJeDsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6bGlzdDxTdG9yYWdlSW5kZXg+ID4gVmVjdG9yTGlzdDsgCisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljCisgICAgfTsKKyAgcHVibGljOgorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgbGVhdmluZyB0aGUgb2JqZWN0IGluIGEgcGFydGx5IG5vbi1pbml0aWFsaXplZCBzdGFnZS4KKyAgICAgICoKKyAgICAgICogWW91IG11c3QgY2FsbCBjb21wdXRlKCkgb3IgdGhlIHBhaXIgYW5hbHl6ZVBhdHRlcm4oKS9mYWN0b3JpemUoKSB0byBtYWtlIGl0IHZhbGlkLgorICAgICAgKgorICAgICAgKiBcc2EgSW5jb21wbGV0ZUNob2xlc2t5KGNvbnN0IE1hdHJpeFR5cGUmKQorICAgICAgKi8KKyAgICBJbmNvbXBsZXRlQ2hvbGVza3koKSA6IG1faW5pdGlhbFNoaWZ0KDFlLTMpLG1fZmFjdG9yaXphdGlvbklzT2soZmFsc2UpIHt9CisgICAgCisgICAgLyoqIENvbnN0cnVjdG9yIGNvbXB1dGluZyB0aGUgaW5jb21wbGV0ZSBmYWN0b3JpemF0aW9uIGZvciB0aGUgZ2l2ZW4gbWF0cml4IFxhIG1hdHJpeC4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBJbmNvbXBsZXRlQ2hvbGVza3koY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IG1faW5pdGlhbFNoaWZ0KDFlLTMpLG1fZmFjdG9yaXphdGlvbklzT2soZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIGZhY3RvcmVkIG1hdHJpeCAqLworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX0wucm93cygpOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBmYWN0b3JlZCBtYXRyaXggKi8KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9MLmNvbHMoKTsgfQorICAgIAorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIEl0IHRyaWdnZXJzIGFuIGFzc2VydGlvbiBpZiBcYyAqdGhpcyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBjb25zdHJ1Y3RvciwKKyAgICAgICogb3IgYSBjYWxsIHRvIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgbWF0cml4IGFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJbmNvbXBsZXRlQ2hvbGVza3kgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisgICAgCisgICAgLyoqIFxicmllZiBTZXQgdGhlIGluaXRpYWwgc2hpZnQgcGFyYW1ldGVyIFxmJCBcc2lnbWEgXGYkLgorICAgICAgKi8KKyAgICB2b2lkIHNldEluaXRpYWxTaGlmdChSZWFsU2NhbGFyIHNoaWZ0KSB7IG1faW5pdGlhbFNoaWZ0ID0gc2hpZnQ7IH0KKyAgICAKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIHRoZSBmaWxsIHJlZHVjaW5nIHBlcm11dGF0aW9uIHZlY3RvciB1c2luZyB0aGUgc3BhcnNpdHkgcGF0dGVybiBvZiBcYSBtYXQKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCkKKyAgICB7CisgICAgICBPcmRlcmluZ1R5cGUgb3JkOyAKKyAgICAgIFBlcm11dGF0aW9uVHlwZSBwaW52OworICAgICAgb3JkKG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKSwgcGludik7IAorICAgICAgaWYocGludi5zaXplKCk+MCkgbV9wZXJtID0gcGludi5pbnZlcnNlKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICBtX3Blcm0ucmVzaXplKDApOworICAgICAgbV9MLnJlc2l6ZShtYXQucm93cygpLCBtYXQuY29scygpKTsKKyAgICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIH0KKyAgICAKKyAgICAvKiogXGJyaWVmIFBlcmZvcm1zIHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbiBvZiB0aGUgaW5wdXQgbWF0cml4IFxhIG1hdAorICAgICAgKgorICAgICAgKiBUaGUgbWV0aG9kIGFuYWx5emVQYXR0ZXJuKCkgb3IgY29tcHV0ZSgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmVoYW5kCisgICAgICAqIHdpdGggYSBtYXRyaXggaGF2aW5nIHRoZSBzYW1lIHBhdHRlcm4uCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCksIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBtYXQpOworICAgIAorICAgIC8qKiBDb21wdXRlcyBvciByZS1jb21wdXRlcyB0aGUgaW5jb21wbGV0ZSBDaG9sZXNreSBmYWN0b3JpemF0aW9uIG9mIHRoZSBpbnB1dCBtYXRyaXggXGEgbWF0CisgICAgICAqCisgICAgICAqIEl0IGlzIGEgc2hvcnRjdXQgZm9yIGEgc2VxdWVudGlhbCBjYWxsIHRvIHRoZSBhbmFseXplUGF0dGVybigpIGFuZCBmYWN0b3JpemUoKSBtZXRob2RzLgorICAgICAgKgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKSwgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIGFuYWx5emVQYXR0ZXJuKG1hdCk7CisgICAgICBmYWN0b3JpemUobWF0KTsKKyAgICB9CisgICAgCisgICAgLy8gaW50ZXJuYWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHMmIGIsIERlc3QmIHgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgImZhY3Rvcml6ZSgpIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QiKTsKKyAgICAgIGlmIChtX3Blcm0ucm93cygpID09IGIucm93cygpKSAgeCA9IG1fcGVybSAqIGI7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBiOworICAgICAgeCA9IG1fc2NhbGUuYXNEaWFnb25hbCgpICogeDsKKyAgICAgIHggPSBtX0wudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUoeCk7CisgICAgICB4ID0gbV9MLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh4KTsKKyAgICAgIHggPSBtX3NjYWxlLmFzRGlhZ29uYWwoKSAqIHg7CisgICAgICBpZiAobV9wZXJtLnJvd3MoKSA9PSBiLnJvd3MoKSkKKyAgICAgICAgeCA9IG1fcGVybS5pbnZlcnNlKCkgKiB4OworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc3BhcnNlIGxvd2VyIHRyaWFuZ3VsYXIgZmFjdG9yIEwgKi8KKyAgICBjb25zdCBGYWN0b3JUeXBlJiBtYXRyaXhMKCkgY29uc3QgeyBlaWdlbl9hc3NlcnQoIm1fZmFjdG9yaXphdGlvbklzT2siKTsgcmV0dXJuIG1fTDsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgc2NhbGluZyBmYWN0b3IgUyAqLworICAgIGNvbnN0IFZlY3RvclJ4JiBzY2FsaW5nUygpIGNvbnN0IHsgZWlnZW5fYXNzZXJ0KCJtX2ZhY3Rvcml6YXRpb25Jc09rIik7IHJldHVybiBtX3NjYWxlOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGZpbGwtaW4gcmVkdWNpbmcgcGVybXV0YXRpb24gUCAoY2FuIGJlIGVtcHR5IGZvciBhIG5hdHVyYWwgb3JkZXJpbmcpICovCisgICAgY29uc3QgUGVybXV0YXRpb25UeXBlJiBwZXJtdXRhdGlvblAoKSBjb25zdCB7IGVpZ2VuX2Fzc2VydCgibV9hbmFseXNpc0lzT2siKTsgcmV0dXJuIG1fcGVybTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBGYWN0b3JUeXBlIG1fTDsgICAgICAgICAgICAgIC8vIFRoZSBsb3dlciBwYXJ0IHN0b3JlZCBpbiBDU0MKKyAgICBWZWN0b3JSeCBtX3NjYWxlOyAgICAgICAgICAgIC8vIFRoZSB2ZWN0b3IgZm9yIHNjYWxpbmcgdGhlIG1hdHJpeCAKKyAgICBSZWFsU2NhbGFyIG1faW5pdGlhbFNoaWZ0OyAgIC8vIFRoZSBpbml0aWFsIHNoaWZ0IHBhcmFtZXRlcgorICAgIGJvb2wgbV9hbmFseXNpc0lzT2s7IAorICAgIGJvb2wgbV9mYWN0b3JpemF0aW9uSXNPazsgCisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBQZXJtdXRhdGlvblR5cGUgbV9wZXJtOyAKKworICBwcml2YXRlOgorICAgIGlubGluZSB2b2lkIHVwZGF0ZUxpc3QoUmVmPGNvbnN0IFZlY3Rvckl4PiBjb2xQdHIsIFJlZjxWZWN0b3JJeD4gcm93SWR4LCBSZWY8VmVjdG9yU3g+IHZhbHMsIGNvbnN0IEluZGV4JiBjb2wsIGNvbnN0IEluZGV4JiBqaywgVmVjdG9ySXgmIGZpcnN0RWx0LCBWZWN0b3JMaXN0JiBsaXN0Q29sKTsgCit9OyAKKworLy8gQmFzZWQgb24gdGhlIGZvbGxvd2luZyBwYXBlcjoKKy8vICAgQy1KLiBMaW4gYW5kIEouIEouIE1vcsOpLCBJbmNvbXBsZXRlIENob2xlc2t5IEZhY3Rvcml6YXRpb25zIHdpdGgKKy8vICAgTGltaXRlZCBtZW1vcnksIFNJQU0gSi4gU2NpLiBDb21wdXQuICAyMSgxKSwgcHAuIDI0LTQ1LCAxOTk5CisvLyAgIGh0dHA6Ly9mdHAubWNzLmFubC5nb3YvcHViL3RlY2hfcmVwb3J0cy9yZXBvcnRzL1A2ODIucGRmCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfVXBMbywgdHlwZW5hbWUgT3JkZXJpbmdUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit2b2lkIEluY29tcGxldGVDaG9sZXNreTxTY2FsYXIsX1VwTG8sIE9yZGVyaW5nVHlwZT46OmZhY3Rvcml6ZShjb25zdCBfTWF0cml4VHlwZSYgbWF0KQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiYW5hbHl6ZVBhdHRlcm4oKSBzaG91bGQgYmUgY2FsbGVkIGZpcnN0Iik7IAorICAgIAorICAvLyBEcm9wcGluZyBzdHJhdGVneSA6IEtlZXAgb25seSB0aGUgcCBsYXJnZXN0IGVsZW1lbnRzIHBlciBjb2x1bW4sIHdoZXJlIHAgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sdW1uIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXguIE90aGVyIHN0cmF0ZWdpZXMgd2lsbCBiZSBhZGRlZAorICAKKyAgLy8gQXBwbHkgdGhlIGZpbGwtcmVkdWNpbmcgcGVybXV0YXRpb24gY29tcHV0ZWQgaW4gYW5hbHl6ZVBhdHRlcm4oKQorICBpZiAobV9wZXJtLnJvd3MoKSA9PSBtYXQucm93cygpICkgLy8gVG8gZGV0ZWN0IHRoZSBudWxsIHBlcm11dGF0aW9uCisgIHsKKyAgICAvLyBUaGUgdGVtcG9yYXJ5IGlzIG5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGlhZ29uYWwgZW50cnkgaXMgcHJvcGVybHkgc29ydGVkCisgICAgRmFjdG9yVHlwZSB0bXAobWF0LnJvd3MoKSwgbWF0LmNvbHMoKSk7CisgICAgdG1wID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxfVXBMbz4oKS50d2lzdGVkQnkobV9wZXJtKTsKKyAgICBtX0wudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gdG1wLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtX0wudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxfVXBMbz4oKTsKKyAgfQorICAKKyAgSW5kZXggbiA9IG1fTC5jb2xzKCk7IAorICBJbmRleCBubnogPSBtX0wubm9uWmVyb3MoKTsKKyAgTWFwPFZlY3RvclN4PiB2YWxzKG1fTC52YWx1ZVB0cigpLCBubnopOyAgICAgICAgIC8vdmFsdWVzCisgIE1hcDxWZWN0b3JJeD4gcm93SWR4KG1fTC5pbm5lckluZGV4UHRyKCksIG5ueik7ICAvL1JvdyBpbmRpY2VzCisgIE1hcDxWZWN0b3JJeD4gY29sUHRyKCBtX0wub3V0ZXJJbmRleFB0cigpLCBuKzEpOyAvLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByb3cKKyAgVmVjdG9ySXggZmlyc3RFbHQobi0xKTsgLy8gZm9yIGVhY2ggaiwgcG9pbnRzIHRvIHRoZSBuZXh0IGVudHJ5IGluIHZhbHMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGZhY3Rvcml6YXRpb24KKyAgVmVjdG9yTGlzdCBsaXN0Q29sKG4pOyAgLy8gbGlzdENvbChqKSBpcyBhIGxpbmtlZCBsaXN0IG9mIGNvbHVtbnMgdG8gdXBkYXRlIGNvbHVtbiBqCisgIFZlY3RvclN4IGNvbF92YWxzKG4pOyAgIC8vIFN0b3JlIGEgIG5vbnplcm8gdmFsdWVzIGluIGVhY2ggY29sdW1uCisgIFZlY3Rvckl4IGNvbF9pcm93KG4pOyAgIC8vIFJvdyBpbmRpY2VzIG9mIG5vbnplcm8gZWxlbWVudHMgaW4gZWFjaCBjb2x1bW4KKyAgVmVjdG9ySXggY29sX3BhdHRlcm4obik7CisgIGNvbF9wYXR0ZXJuLmZpbGwoLTEpOworICBTdG9yYWdlSW5kZXggY29sX25uejsKKyAgCisgIAorICAvLyBDb21wdXRlcyB0aGUgc2NhbGluZyBmYWN0b3JzIAorICBtX3NjYWxlLnJlc2l6ZShuKTsKKyAgbV9zY2FsZS5zZXRaZXJvKCk7CisgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyBqKyspCisgICAgZm9yIChJbmRleCBrID0gY29sUHRyW2pdOyBrIDwgY29sUHRyW2orMV07IGsrKykKKyAgICB7CisgICAgICBtX3NjYWxlKGopICs9IG51bWV4dDo6YWJzMih2YWxzKGspKTsKKyAgICAgIGlmKHJvd0lkeFtrXSE9aikKKyAgICAgICAgbV9zY2FsZShyb3dJZHhba10pICs9IG51bWV4dDo6YWJzMih2YWxzKGspKTsKKyAgICB9CisgIAorICBtX3NjYWxlID0gbV9zY2FsZS5jd2lzZVNxcnQoKS5jd2lzZVNxcnQoKTsKKworICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgIGlmKG1fc2NhbGUoaik+KHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSkKKyAgICAgIG1fc2NhbGUoaikgPSBSZWFsU2NhbGFyKDEpL21fc2NhbGUoaik7CisgICAgZWxzZQorICAgICAgbV9zY2FsZShqKSA9IDE7CisKKyAgLy8gVE9ETyBkaXNhYmxlIHNjYWxpbmcgaWYgbm90IG5lZWRlZCwgaS5lLiwgaWYgaXQgaXMgcm91Z2hseSB1bmlmb3JtPyAodGhpcyB3aWxsIG1ha2Ugc29sdmUoKSBmYXN0ZXIpCisgIAorICAvLyBTY2FsZSBhbmQgY29tcHV0ZSB0aGUgc2hpZnQgZm9yIHRoZSBtYXRyaXggCisgIFJlYWxTY2FsYXIgbWluZGlhZyA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6aGlnaGVzdCgpOworICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgaisrKQorICB7CisgICAgZm9yIChJbmRleCBrID0gY29sUHRyW2pdOyBrIDwgY29sUHRyW2orMV07IGsrKykKKyAgICAgIHZhbHNba10gKj0gKG1fc2NhbGUoaikqbV9zY2FsZShyb3dJZHhba10pKTsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93SWR4W2NvbFB0cltqXV09PWogJiYgIkluY29tcGxldGVDaG9sZXNreTogb25seSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG11c3QgYmUgc3RvcmVkIik7CisgICAgbWluZGlhZyA9IG51bWV4dDo6bWluaShudW1leHQ6OnJlYWwodmFsc1tjb2xQdHJbal1dKSwgbWluZGlhZyk7CisgIH0KKworICBGYWN0b3JUeXBlIExfc2F2ZSA9IG1fTDsKKyAgCisgIFJlYWxTY2FsYXIgc2hpZnQgPSAwOworICBpZihtaW5kaWFnIDw9IFJlYWxTY2FsYXIoMC4pKQorICAgIHNoaWZ0ID0gbV9pbml0aWFsU2hpZnQgLSBtaW5kaWFnOworCisgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworCisgIC8vIFRyeSB0byBwZXJmb3JtIHRoZSBpbmNvbXBsZXRlIGZhY3Rvcml6YXRpb24gdXNpbmcgdGhlIGN1cnJlbnQgc2hpZnQKKyAgaW50IGl0ZXIgPSAwOworICBkbworICB7CisgICAgLy8gQXBwbHkgdGhlIHNoaWZ0IHRvIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiB0aGUgbWF0cml4CisgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47IGorKykKKyAgICAgIHZhbHNbY29sUHRyW2pdXSArPSBzaGlmdDsKKworICAgIC8vIGpraSB2ZXJzaW9uIG9mIHRoZSBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICAgSW5kZXggaj0wOworICAgIGZvciAoOyBqIDwgbjsgKytqKQorICAgIHsKKyAgICAgIC8vIExlZnQtbG9va2luZyBmYWN0b3JpemF0aW9uIG9mIHRoZSBqLXRoIGNvbHVtbgorICAgICAgLy8gRmlyc3QsIGxvYWQgdGhlIGotdGggY29sdW1uIGludG8gY29sX3ZhbHMKKyAgICAgIFNjYWxhciBkaWFnID0gdmFsc1tjb2xQdHJbal1dOyAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IG9ubHkgdGhlIGxvd2VyIHBhcnQgaXMgc3RvcmVkCisgICAgICBjb2xfbm56ID0gMDsKKyAgICAgIGZvciAoSW5kZXggaSA9IGNvbFB0cltqXSArIDE7IGkgPCBjb2xQdHJbaisxXTsgaSsrKQorICAgICAgeworICAgICAgICBTdG9yYWdlSW5kZXggbCA9IHJvd0lkeFtpXTsKKyAgICAgICAgY29sX3ZhbHMoY29sX25ueikgPSB2YWxzW2ldOworICAgICAgICBjb2xfaXJvdyhjb2xfbm56KSA9IGw7CisgICAgICAgIGNvbF9wYXR0ZXJuKGwpID0gY29sX25uejsKKyAgICAgICAgY29sX25ueisrOworICAgICAgfQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8U3RvcmFnZUluZGV4Pjo6aXRlcmF0b3IgazsKKyAgICAgICAgLy8gQnJvd3NlIGFsbCBwcmV2aW91cyBjb2x1bW5zIHRoYXQgd2lsbCB1cGRhdGUgY29sdW1uIGoKKyAgICAgICAgZm9yKGsgPSBsaXN0Q29sW2pdLmJlZ2luKCk7IGsgIT0gbGlzdENvbFtqXS5lbmQoKTsgaysrKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggamsgPSBmaXJzdEVsdCgqayk7IC8vIEZpcnN0IGVsZW1lbnQgdG8gdXNlIGluIHRoZSBjb2x1bW4KKyAgICAgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93SWR4W2prXT09aik7CisgICAgICAgICAgU2NhbGFyIHZfal9qayA9IG51bWV4dDo6Y29uaih2YWxzW2prXSk7CisKKyAgICAgICAgICBqayArPSAxOworICAgICAgICAgIGZvciAoSW5kZXggaSA9IGprOyBpIDwgY29sUHRyWyprKzFdOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgU3RvcmFnZUluZGV4IGwgPSByb3dJZHhbaV07CisgICAgICAgICAgICBpZihjb2xfcGF0dGVybltsXTwwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb2xfdmFscyhjb2xfbm56KSA9IHZhbHNbaV0gKiB2X2pfams7CisgICAgICAgICAgICAgIGNvbF9pcm93W2NvbF9ubnpdID0gbDsKKyAgICAgICAgICAgICAgY29sX3BhdHRlcm4obCkgPSBjb2xfbm56OworICAgICAgICAgICAgICBjb2xfbm56Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGNvbF92YWxzKGNvbF9wYXR0ZXJuW2xdKSAtPSB2YWxzW2ldICogdl9qX2prOworICAgICAgICAgIH0KKyAgICAgICAgICB1cGRhdGVMaXN0KGNvbFB0cixyb3dJZHgsdmFscywgKmssIGprLCBmaXJzdEVsdCwgbGlzdENvbCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU2NhbGUgdGhlIGN1cnJlbnQgY29sdW1uCisgICAgICBpZihudW1leHQ6OnJlYWwoZGlhZykgPD0gMCkKKyAgICAgIHsKKyAgICAgICAgaWYoKytpdGVyPj0xMCkKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gaW5jcmVhc2Ugc2hpZnQKKyAgICAgICAgc2hpZnQgPSBudW1leHQ6Om1heGkobV9pbml0aWFsU2hpZnQsUmVhbFNjYWxhcigyKSpzaGlmdCk7CisgICAgICAgIC8vIHJlc3RvcmUgbV9MLCBjb2xfcGF0dGVybiwgYW5kIGxpc3RDb2wKKyAgICAgICAgdmFscyA9IE1hcDxjb25zdCBWZWN0b3JTeD4oTF9zYXZlLnZhbHVlUHRyKCksIG5ueik7CisgICAgICAgIHJvd0lkeCA9IE1hcDxjb25zdCBWZWN0b3JJeD4oTF9zYXZlLmlubmVySW5kZXhQdHIoKSwgbm56KTsKKyAgICAgICAgY29sUHRyID0gTWFwPGNvbnN0IFZlY3Rvckl4PihMX3NhdmUub3V0ZXJJbmRleFB0cigpLCBuKzEpOworICAgICAgICBjb2xfcGF0dGVybi5maWxsKC0xKTsKKyAgICAgICAgZm9yKEluZGV4IGk9MDsgaTxuOyArK2kpCisgICAgICAgICAgbGlzdENvbFtpXS5jbGVhcigpOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBSZWFsU2NhbGFyIHJkaWFnID0gc3FydChudW1leHQ6OnJlYWwoZGlhZykpOworICAgICAgdmFsc1tjb2xQdHJbal1dID0gcmRpYWc7CisgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrPGNvbF9ubno7ICsraykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IGNvbF9pcm93W2tdOworICAgICAgICAvL1NjYWxlCisgICAgICAgIGNvbF92YWxzKGspIC89IHJkaWFnOworICAgICAgICAvL1VwZGF0ZSB0aGUgcmVtYWluaW5nIGRpYWdvbmFscyB3aXRoIGNvbF92YWxzCisgICAgICAgIHZhbHNbY29sUHRyW2ldXSAtPSBudW1leHQ6OmFiczIoY29sX3ZhbHMoaykpOworICAgICAgfQorICAgICAgLy8gU2VsZWN0IHRoZSBsYXJnZXN0IHAgZWxlbWVudHMKKyAgICAgIC8vIHAgaXMgdGhlIG9yaWdpbmFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sdW1uICh3aXRob3V0IHRoZSBkaWFnb25hbCkKKyAgICAgIEluZGV4IHAgPSBjb2xQdHJbaisxXSAtIGNvbFB0cltqXSAtIDEgOworICAgICAgUmVmPFZlY3RvclN4PiBjdmFscyA9IGNvbF92YWxzLmhlYWQoY29sX25ueik7CisgICAgICBSZWY8VmVjdG9ySXg+IGNpcm93ID0gY29sX2lyb3cuaGVhZChjb2xfbm56KTsKKyAgICAgIGludGVybmFsOjpRdWlja1NwbGl0KGN2YWxzLGNpcm93LCBwKTsKKyAgICAgIC8vIEluc2VydCB0aGUgbGFyZ2VzdCBwIGVsZW1lbnRzIGluIHRoZSBtYXRyaXgKKyAgICAgIEluZGV4IGNwdCA9IDA7CisgICAgICBmb3IgKEluZGV4IGkgPSBjb2xQdHJbal0rMTsgaSA8IGNvbFB0cltqKzFdOyBpKyspCisgICAgICB7CisgICAgICAgIHZhbHNbaV0gPSBjb2xfdmFscyhjcHQpOworICAgICAgICByb3dJZHhbaV0gPSBjb2xfaXJvdyhjcHQpOworICAgICAgICAvLyByZXN0b3JlIGNvbF9wYXR0ZXJuOgorICAgICAgICBjb2xfcGF0dGVybihjb2xfaXJvdyhjcHQpKSA9IC0xOworICAgICAgICBjcHQrKzsKKyAgICAgIH0KKyAgICAgIC8vIEdldCB0aGUgZmlyc3Qgc21hbGxlc3Qgcm93IGluZGV4IGFuZCBwdXQgaXQgYWZ0ZXIgdGhlIGRpYWdvbmFsIGVsZW1lbnQKKyAgICAgIEluZGV4IGprID0gY29sUHRyKGopKzE7CisgICAgICB1cGRhdGVMaXN0KGNvbFB0cixyb3dJZHgsdmFscyxqLGprLGZpcnN0RWx0LGxpc3RDb2wpOworICAgIH0KKworICAgIGlmKGo9PW4pCisgICAgeworICAgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIH0KKyAgfSB3aGlsZShtX2luZm8hPVN1Y2Nlc3MpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfVXBMbywgdHlwZW5hbWUgT3JkZXJpbmdUeXBlPgoraW5saW5lIHZvaWQgSW5jb21wbGV0ZUNob2xlc2t5PFNjYWxhcixfVXBMbywgT3JkZXJpbmdUeXBlPjo6dXBkYXRlTGlzdChSZWY8Y29uc3QgVmVjdG9ySXg+IGNvbFB0ciwgUmVmPFZlY3Rvckl4PiByb3dJZHgsIFJlZjxWZWN0b3JTeD4gdmFscywgY29uc3QgSW5kZXgmIGNvbCwgY29uc3QgSW5kZXgmIGprLCBWZWN0b3JJeCYgZmlyc3RFbHQsIFZlY3Rvckxpc3QmIGxpc3RDb2wpCit7CisgIGlmIChqayA8IGNvbFB0cihjb2wrMSkgKQorICB7CisgICAgSW5kZXggcCA9IGNvbFB0cihjb2wrMSkgLSBqazsKKyAgICBJbmRleCBtaW5wb3M7IAorICAgIHJvd0lkeC5zZWdtZW50KGprLHApLm1pbkNvZWZmKCZtaW5wb3MpOworICAgIG1pbnBvcyArPSBqazsKKyAgICBpZiAocm93SWR4KG1pbnBvcykgIT0gcm93SWR4KGprKSkKKyAgICB7CisgICAgICAvL1N3YXAKKyAgICAgIHN0ZDo6c3dhcChyb3dJZHgoamspLHJvd0lkeChtaW5wb3MpKTsKKyAgICAgIHN0ZDo6c3dhcCh2YWxzKGprKSx2YWxzKG1pbnBvcykpOworICAgIH0KKyAgICBmaXJzdEVsdChjb2wpID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4LEluZGV4Pihqayk7CisgICAgbGlzdENvbFtyb3dJZHgoamspXS5wdXNoX2JhY2soaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4LEluZGV4Pihjb2wpKTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4gCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvSW5jb21wbGV0ZUxVVC5oIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvSW5jb21wbGV0ZUxVVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGU2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JbmNvbXBsZXRlTFVULmgKQEAgLTAsMCArMSw0NjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JTkNPTVBMRVRFX0xVVF9ICisjZGVmaW5lIEVJR0VOX0lOQ09NUExFVEVfTFVUX0gKKworCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICAKKy8qKiBcaW50ZXJuYWwKKyAgKiBDb21wdXRlIGEgcXVpY2stc29ydCBzcGxpdCBvZiBhIHZlY3RvciAKKyAgKiBPbiBvdXRwdXQsIHRoZSB2ZWN0b3Igcm93IGlzIHBlcm11dGVkIHN1Y2ggdGhhdCBpdHMgZWxlbWVudHMgc2F0aXNmeQorICAqIGFicyhyb3coaSkpID49IGFicyhyb3cobmN1dCkpIGlmIGk8bmN1dAorICAqIGFicyhyb3coaSkpIDw9IGFicyhyb3cobmN1dCkpIGlmIGk+bmN1dCAKKyAgKiBccGFyYW0gcm93IFRoZSB2ZWN0b3Igb2YgdmFsdWVzCisgICogXHBhcmFtIGluZCBUaGUgYXJyYXkgb2YgaW5kZXggZm9yIHRoZSBlbGVtZW50cyBpbiBAcCByb3cKKyAgKiBccGFyYW0gbmN1dCAgVGhlIG51bWJlciBvZiBsYXJnZXN0IGVsZW1lbnRzIHRvIGtlZXAKKyAgKiovIAordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclYsIHR5cGVuYW1lIFZlY3Rvckk+CitJbmRleCBRdWlja1NwbGl0KFZlY3RvclYgJnJvdywgVmVjdG9ySSAmaW5kLCBJbmRleCBuY3V0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclY6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdXNpbmcgc3RkOjpzd2FwOworICB1c2luZyBzdGQ6OmFiczsKKyAgSW5kZXggbWlkOworICBJbmRleCBuID0gcm93LnNpemUoKTsgLyogbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKi8KKyAgSW5kZXggZmlyc3QsIGxhc3QgOworICAKKyAgbmN1dC0tOyAvKiB0byBmaXQgdGhlIHplcm8tYmFzZWQgaW5kaWNlcyAqLworICBmaXJzdCA9IDA7IAorICBsYXN0ID0gbi0xOyAKKyAgaWYgKG5jdXQgPCBmaXJzdCB8fCBuY3V0ID4gbGFzdCApIHJldHVybiAwOworICAKKyAgZG8geworICAgIG1pZCA9IGZpcnN0OyAKKyAgICBSZWFsU2NhbGFyIGFic2tleSA9IGFicyhyb3cobWlkKSk7IAorICAgIGZvciAoSW5kZXggaiA9IGZpcnN0ICsgMTsgaiA8PSBsYXN0OyBqKyspIHsKKyAgICAgIGlmICggYWJzKHJvdyhqKSkgPiBhYnNrZXkpIHsKKyAgICAgICAgKyttaWQ7CisgICAgICAgIHN3YXAocm93KG1pZCksIHJvdyhqKSk7CisgICAgICAgIHN3YXAoaW5kKG1pZCksIGluZChqKSk7CisgICAgICB9CisgICAgfQorICAgIC8qIEludGVyY2hhbmdlIGZvciB0aGUgcGl2b3QgZWxlbWVudCAqLworICAgIHN3YXAocm93KG1pZCksIHJvdyhmaXJzdCkpOworICAgIHN3YXAoaW5kKG1pZCksIGluZChmaXJzdCkpOworICAgIAorICAgIGlmIChtaWQgPiBuY3V0KSBsYXN0ID0gbWlkIC0gMTsKKyAgICBlbHNlIGlmIChtaWQgPCBuY3V0ICkgZmlyc3QgPSBtaWQgKyAxOyAKKyAgfSB3aGlsZSAobWlkICE9IG5jdXQgKTsKKyAgCisgIHJldHVybiAwOyAvKiBtaWQgaXMgZXF1YWwgdG8gbmN1dCAqLyAKK30KKworfS8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGNsYXNzIEluY29tcGxldGVMVVQKKyAgKiBcYnJpZWYgSW5jb21wbGV0ZSBMVSBmYWN0b3JpemF0aW9uIHdpdGggZHVhbC10aHJlc2hvbGQgc3RyYXRlZ3kKKyAgKgorICAqIFxpbXBsc3BhcnNlc29sdmVyY29uY2VwdAorICAqCisgICogRHVyaW5nIHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbiwgdHdvIGRyb3BwaW5nIHJ1bGVzIGFyZSB1c2VkIDoKKyAgKiAgMSkgYW55IGVsZW1lbnQgd2hvc2UgbWFnbml0dWRlIGlzIGxlc3MgdGhhbiBzb21lIHRvbGVyYW5jZSBpcyBkcm9wcGVkLgorICAqICAgIFRoaXMgdG9sZXJhbmNlIGlzIG9idGFpbmVkIGJ5IG11bHRpcGx5aW5nIHRoZSBpbnB1dCB0b2xlcmFuY2UgQHAgZHJvcHRvbCAKKyAgKiAgICBieSB0aGUgYXZlcmFnZSBtYWduaXR1ZGUgb2YgYWxsIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCByb3cuCisgICogIDIpIEFmdGVyIHRoZSBlbGltaW5hdGlvbiBvZiB0aGUgcm93LCBvbmx5IHRoZSBAcCBmaWxsIGxhcmdlc3QgZWxlbWVudHMgaW4gCisgICogICAgdGhlIEwgcGFydCBhbmQgdGhlIEBwIGZpbGwgbGFyZ2VzdCBlbGVtZW50cyBpbiB0aGUgVSBwYXJ0IGFyZSBrZXB0IAorICAqICAgIChpbiBhZGRpdGlvbiB0byB0aGUgZGlhZ29uYWwgZWxlbWVudCApLiBOb3RlIHRoYXQgQHAgZmlsbCBpcyBjb21wdXRlZCBmcm9tIAorICAqICAgIHRoZSBpbnB1dCBwYXJhbWV0ZXIgQHAgZmlsbGZhY3RvciB3aGljaCBpcyB1c2VkIHRoZSByYXRpbyB0byBjb250cm9sIHRoZSBmaWxsX2luIAorICAqICAgIHJlbGF0aXZlbHkgdG8gdGhlIGluaXRpYWwgbnVtYmVyIG9mIG5vbnplcm8gZWxlbWVudHMuCisgICogCisgICogVGhlIHR3byBleHRyZW1lIGNhc2VzIGFyZSB3aGVuIEBwIGRyb3B0b2w9MCAodG8ga2VlcCBhbGwgdGhlIEBwIGZpbGwqMiBsYXJnZXN0IGVsZW1lbnRzKQorICAqIGFuZCB3aGVuIEBwIGZpbGw9bi8yIHdpdGggQHAgZHJvcHRvbCBiZWluZyBkaWZmZXJlbnQgdG8gemVyby4gCisgICogCisgICogUmVmZXJlbmNlcyA6IFlvdXNlZiBTYWFkLCBJTFVUOiBBIGR1YWwgdGhyZXNob2xkIGluY29tcGxldGUgTFUgZmFjdG9yaXphdGlvbiwgCisgICogICAgICAgICAgICAgIE51bWVyaWNhbCBMaW5lYXIgQWxnZWJyYSB3aXRoIEFwcGxpY2F0aW9ucywgMSg0KSwgcHAgMzg3LTQwMiwgMTk5NC4KKyAgKiAKKyAgKiBOT1RFIDogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIElMVVQgaW1wbGVtZW50YXRpb24KKyAgKiBpbiB0aGUgU1BBUlNLSVQgcGFja2FnZSwgQ29weXJpZ2h0IChDKSAyMDA1LCB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaW5uZXNvdGEgCisgICogIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEw6IAorICAqICAgIGh0dHA6Ly93d3ctdXNlcnMuY3MudW1uLmVkdS9+c2FhZC9zb2Z0d2FyZS9TUEFSU0tJVC9SRUFETUUKKyAgKiBIb3dldmVyLCBZb3VzZWYgU2FhZCBnYXZlIHVzIHBlcm1pc3Npb24gdG8gcmVsaWNlbnNlIGhpcyBJTFVUIGNvZGUgdG8gTVBMMi4KKyAgKiBTZWUgdGhlIEVpZ2VuIG1haWxpbmcgbGlzdCBhcmNoaXZlLCB0aHJlYWQ6IElMVVQsIGRhdGU6IEp1bHkgOCwgMjAxMjoKKyAgKiAgIGh0dHA6Ly9saXN0ZW5naW5lLnR1eGZhbWlseS5vcmcvbGlzdHMudHV4ZmFtaWx5Lm9yZy9laWdlbi8yMDEyLzA3L21zZzAwMDY0Lmh0bWwKKyAgKiBhbHRlcm5hdGl2ZWx5LCBvbiBHTUFORToKKyAgKiAgIGh0dHA6Ly9jb21tZW50cy5nbWFuZS5vcmcvZ21hbmUuY29tcC5saWIuZWlnZW4vMzMwMgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXggPSBpbnQ+CitjbGFzcyBJbmNvbXBsZXRlTFVUIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8SW5jb21wbGV0ZUxVVDxfU2NhbGFyLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFNwYXJzZVNvbHZlckJhc2U8SW5jb21wbGV0ZUxVVD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsRHluYW1pYywxPiBWZWN0b3JJOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixSb3dNYWpvcixTdG9yYWdlSW5kZXg+IEZhY3RvclR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYworICAgIH07CisKKyAgcHVibGljOgorICAgIAorICAgIEluY29tcGxldGVMVVQoKQorICAgICAgOiBtX2Ryb3B0b2woTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSwgbV9maWxsZmFjdG9yKDEwKSwKKyAgICAgICAgbV9hbmFseXNpc0lzT2soZmFsc2UpLCBtX2ZhY3Rvcml6YXRpb25Jc09rKGZhbHNlKQorICAgIHt9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBleHBsaWNpdCBJbmNvbXBsZXRlTFVUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUmVhbFNjYWxhciYgZHJvcHRvbD1OdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCksIGludCBmaWxsZmFjdG9yID0gMTApCisgICAgICA6IG1fZHJvcHRvbChkcm9wdG9sKSxtX2ZpbGxmYWN0b3IoZmlsbGZhY3RvciksCisgICAgICAgIG1fYW5hbHlzaXNJc09rKGZhbHNlKSxtX2ZhY3Rvcml6YXRpb25Jc09rKGZhbHNlKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChmaWxsZmFjdG9yICE9IDApOworICAgICAgY29tcHV0ZShtYXQpOyAKKyAgICB9CisgICAgCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbHUucm93cygpOyB9CisgICAgCisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbHUuY29scygpOyB9CisKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgbWF0cml4LmFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJbmNvbXBsZXRlTFVUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhbWF0KTsKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGFtYXQpOworICAgIAorICAgIC8qKgorICAgICAgKiBDb21wdXRlIGFuIGluY29tcGxldGUgTFUgZmFjdG9yaXphdGlvbiB3aXRoIGR1YWwgdGhyZXNob2xkIG9uIHRoZSBtYXRyaXggbWF0CisgICAgICAqIE5vIHBpdm90aW5nIGlzIGRvbmUgaW4gdGhpcyB2ZXJzaW9uCisgICAgICAqIAorICAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBJbmNvbXBsZXRlTFVUJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIGFtYXQpCisgICAgeworICAgICAgYW5hbHl6ZVBhdHRlcm4oYW1hdCk7IAorICAgICAgZmFjdG9yaXplKGFtYXQpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgc2V0RHJvcHRvbChjb25zdCBSZWFsU2NhbGFyJiBkcm9wdG9sKTsgCisgICAgdm9pZCBzZXRGaWxsZmFjdG9yKGludCBmaWxsZmFjdG9yKTsgCisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICAgIHsKKyAgICAgIHggPSBtX1BpbnYgKiBiOworICAgICAgeCA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlKHgpOworICAgICAgeCA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUoeCk7CisgICAgICB4ID0gbV9QICogeDsgCisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvKioga2VlcHMgb2ZmLWRpYWdvbmFsIGVudHJpZXM7IGRyb3BzIGRpYWdvbmFsIGVudHJpZXMgKi8KKyAgICBzdHJ1Y3Qga2VlcF9kaWFnIHsKKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkgKGNvbnN0IEluZGV4JiByb3csIGNvbnN0IEluZGV4JiBjb2wsIGNvbnN0IFNjYWxhciYpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiByb3chPWNvbDsKKyAgICAgIH0KKyAgICB9OworCitwcm90ZWN0ZWQ6CisKKyAgICBGYWN0b3JUeXBlIG1fbHU7CisgICAgUmVhbFNjYWxhciBtX2Ryb3B0b2w7CisgICAgaW50IG1fZmlsbGZhY3RvcjsKKyAgICBib29sIG1fYW5hbHlzaXNJc09rOworICAgIGJvb2wgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxTdG9yYWdlSW5kZXg+IG1fUDsgICAgIC8vIEZpbGwtcmVkdWNpbmcgcGVybXV0YXRpb24KKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBtX1BpbnY7ICAvLyBJbnZlcnNlIHBlcm11dGF0aW9uCit9OworCisvKioKKyAqIFNldCBjb250cm9sIHBhcmFtZXRlciBkcm9wdG9sCisgKiAgXHBhcmFtIGRyb3B0b2wgICBEcm9wIGFueSBlbGVtZW50IHdob3NlIG1hZ25pdHVkZSBpcyBsZXNzIHRoYW4gdGhpcyB0b2xlcmFuY2UgCisgKiovIAordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyLFN0b3JhZ2VJbmRleD46OnNldERyb3B0b2woY29uc3QgUmVhbFNjYWxhciYgZHJvcHRvbCkKK3sKKyAgdGhpcy0+bV9kcm9wdG9sID0gZHJvcHRvbDsgICAKK30KKworLyoqCisgKiBTZXQgY29udHJvbCBwYXJhbWV0ZXIgZmlsbGZhY3RvcgorICogXHBhcmFtIGZpbGxmYWN0b3IgIFRoaXMgaXMgdXNlZCB0byBjb21wdXRlIHRoZSAgbnVtYmVyIEBwIGZpbGxfaW4gb2YgbGFyZ2VzdCBlbGVtZW50cyB0byBrZWVwIG9uIGVhY2ggcm93LiAKKyAqKi8gCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3ZvaWQgSW5jb21wbGV0ZUxVVDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6c2V0RmlsbGZhY3RvcihpbnQgZmlsbGZhY3RvcikKK3sKKyAgdGhpcy0+bV9maWxsZmFjdG9yID0gZmlsbGZhY3RvcjsgICAKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyLFN0b3JhZ2VJbmRleD46OmFuYWx5emVQYXR0ZXJuKGNvbnN0IF9NYXRyaXhUeXBlJiBhbWF0KQoreworICAvLyBDb21wdXRlIHRoZSBGaWxsLXJlZHVjaW5nIHBlcm11dGF0aW9uCisgIC8vIFNpbmNlIElMVVQgZG9lcyBub3QgcGVyZm9ybSBhbnkgbnVtZXJpY2FsIHBpdm90aW5nLAorICAvLyBpdCBpcyBoaWdobHkgcHJlZmVyYWJsZSB0byBrZWVwIHRoZSBkaWFnb25hbCB0aHJvdWdoIHN5bW1ldHJpYyBwZXJtdXRhdGlvbnMuCisjaWZuZGVmIEVJR0VOX01QTDJfT05MWQorICAvLyBUbyB0aGlzIGVuZCwgbGV0J3Mgc3ltbWV0cml6ZSB0aGUgcGF0dGVybiBhbmQgcGVyZm9ybSBBTUQgb24gaXQuCisgIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsIFN0b3JhZ2VJbmRleD4gbWF0MSA9IGFtYXQ7CisgIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsIFN0b3JhZ2VJbmRleD4gbWF0MiA9IGFtYXQudHJhbnNwb3NlKCk7CisgIC8vIEZJWE1FIGZvciBhIG1hdHJpeCB3aXRoIG5lYXJseSBzeW1tZXRyaWMgcGF0dGVybiwgbWF0MittYXQxIGlzIHRoZSBhcHByb3ByaWF0ZSBjaG9pY2UuCisgIC8vICAgICAgIG9uIHRoZSBvdGhlciBoYW5kIGZvciBhIHJlYWxseSBub24tc3ltbWV0cmljIHBhdHRlcm4sIG1hdDIqbWF0MSBzaG91bGQgYmUgcHJlZmVyZWQuLi4KKyAgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvciwgU3RvcmFnZUluZGV4PiBBdEEgPSBtYXQyICsgbWF0MTsKKyAgQU1ET3JkZXJpbmc8U3RvcmFnZUluZGV4PiBvcmRlcmluZzsKKyAgb3JkZXJpbmcoQXRBLG1fUCk7CisgIG1fUGludiAgPSBtX1AuaW52ZXJzZSgpOyAvLyBjYWNoZSB0aGUgaW52ZXJzZSBwZXJtdXRhdGlvbgorI2Vsc2UKKyAgLy8gSWYgQU1EIGlzIG5vdCBhdmFpbGFibGUsIChNUEwyLW9ubHkpLCB0aGVuIGxldCdzIHVzZSB0aGUgc2xvd2VyIENPTEFNRCByb3V0aW5lLgorICBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCBTdG9yYWdlSW5kZXg+IG1hdDEgPSBhbWF0OworICBDT0xBTURPcmRlcmluZzxTdG9yYWdlSW5kZXg+IG9yZGVyaW5nOworICBvcmRlcmluZyhtYXQxLG1fUGludik7CisgIG1fUCA9IG1fUGludi5pbnZlcnNlKCk7CisjZW5kaWYKKworICBtX2FuYWx5c2lzSXNPayA9IHRydWU7CisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyLFN0b3JhZ2VJbmRleD46OmZhY3Rvcml6ZShjb25zdCBfTWF0cml4VHlwZSYgYW1hdCkKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OnN3YXA7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBpbnRlcm5hbDo6Y29udmVydF9pbmRleDsKKworICBlaWdlbl9hc3NlcnQoKGFtYXQucm93cygpID09IGFtYXQuY29scygpKSAmJiAiVGhlIGZhY3Rvcml6YXRpb24gc2hvdWxkIGJlIGRvbmUgb24gYSBzcXVhcmUgbWF0cml4Iik7CisgIEluZGV4IG4gPSBhbWF0LmNvbHMoKTsgIC8vIFNpemUgb2YgdGhlIG1hdHJpeAorICBtX2x1LnJlc2l6ZShuLG4pOworICAvLyBEZWNsYXJlIFdvcmtpbmcgdmVjdG9ycyBhbmQgdmFyaWFibGVzCisgIFZlY3RvciB1KG4pIDsgICAgIC8vIHJlYWwgdmFsdWVzIG9mIHRoZSByb3cgLS0gbWF4aW11bSBzaXplIGlzIG4gLS0KKyAgVmVjdG9ySSBqdShuKTsgICAvLyBjb2x1bW4gcG9zaXRpb24gb2YgdGhlIHZhbHVlcyBpbiB1IC0tIG1heGltdW0gc2l6ZSAgaXMgbgorICBWZWN0b3JJIGpyKG4pOyAgIC8vIEluZGljYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9uemVybyBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIHUgLS0gQSB6ZXJvIGxvY2F0aW9uIGlzIGluZGljYXRlZCBieSAtMQorCisgIC8vIEFwcGx5IHRoZSBmaWxsLXJlZHVjaW5nIHBlcm11dGF0aW9uCisgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiWW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3IsIFN0b3JhZ2VJbmRleD4gbWF0OworICBtYXQgPSBhbWF0LnR3aXN0ZWRCeShtX1BpbnYpOworCisgIC8vIEluaXRpYWxpemF0aW9uCisgIGpyLmZpbGwoLTEpOworICBqdS5maWxsKDApOworICB1LmZpbGwoMCk7CisKKyAgLy8gbnVtYmVyIG9mIGxhcmdlc3QgZWxlbWVudHMgdG8ga2VlcCBpbiBlYWNoIHJvdzoKKyAgSW5kZXggZmlsbF9pbiA9IChhbWF0Lm5vblplcm9zKCkqbV9maWxsZmFjdG9yKS9uICsgMTsKKyAgaWYgKGZpbGxfaW4gPiBuKSBmaWxsX2luID0gbjsKKworICAvLyBudW1iZXIgb2YgbGFyZ2VzdCBub256ZXJvIGVsZW1lbnRzIHRvIGtlZXAgaW4gdGhlIEwgYW5kIHRoZSBVIHBhcnQgb2YgdGhlIGN1cnJlbnQgcm93OgorICBJbmRleCBubnpMID0gZmlsbF9pbi8yOworICBJbmRleCBubnpVID0gbm56TDsKKyAgbV9sdS5yZXNlcnZlKG4gKiAobm56TCArIG5uelUgKyAxKSk7CisKKyAgLy8gZ2xvYmFsIGxvb3Agb3ZlciB0aGUgcm93cyBvZiB0aGUgc3BhcnNlIG1hdHJpeAorICBmb3IgKEluZGV4IGlpID0gMDsgaWkgPCBuOyBpaSsrKQorICB7CisgICAgLy8gMSAtIGNvcHkgdGhlIGxvd2VyIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcm93IGkgb2YgbWF0IGluIHRoZSB3b3JraW5nIHZlY3RvciB1CisKKyAgICBJbmRleCBzaXpldSA9IDE7IC8vIG51bWJlciBvZiBub256ZXJvIGVsZW1lbnRzIGluIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBjdXJyZW50IHJvdworICAgIEluZGV4IHNpemVsID0gMDsgLy8gbnVtYmVyIG9mIG5vbnplcm8gZWxlbWVudHMgaW4gdGhlIGxvd2VyIHBhcnQgb2YgdGhlIGN1cnJlbnQgcm93CisgICAganUoaWkpICAgID0gY29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KGlpKTsKKyAgICB1KGlpKSAgICAgPSAwOworICAgIGpyKGlpKSAgICA9IGNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihpaSk7CisgICAgUmVhbFNjYWxhciByb3dub3JtID0gMDsKKworICAgIHR5cGVuYW1lIEZhY3RvclR5cGU6OklubmVySXRlcmF0b3Igal9pdChtYXQsIGlpKTsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjdXJyZW50IHJvdyBpaQorICAgIGZvciAoOyBqX2l0OyArK2pfaXQpCisgICAgeworICAgICAgSW5kZXggayA9IGpfaXQuaW5kZXgoKTsKKyAgICAgIGlmIChrIDwgaWkpCisgICAgICB7CisgICAgICAgIC8vIGNvcHkgdGhlIGxvd2VyIHBhcnQKKyAgICAgICAganUoc2l6ZWwpID0gY29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KGspOworICAgICAgICB1KHNpemVsKSA9IGpfaXQudmFsdWUoKTsKKyAgICAgICAganIoaykgPSBjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oc2l6ZWwpOworICAgICAgICArK3NpemVsOworICAgICAgfQorICAgICAgZWxzZSBpZiAoayA9PSBpaSkKKyAgICAgIHsKKyAgICAgICAgdShpaSkgPSBqX2l0LnZhbHVlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIGNvcHkgdGhlIHVwcGVyIHBhcnQKKyAgICAgICAgSW5kZXgganBvcyA9IGlpICsgc2l6ZXU7CisgICAgICAgIGp1KGpwb3MpID0gY29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KGspOworICAgICAgICB1KGpwb3MpID0gal9pdC52YWx1ZSgpOworICAgICAgICBqcihrKSA9IGNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihqcG9zKTsKKyAgICAgICAgKytzaXpldTsKKyAgICAgIH0KKyAgICAgIHJvd25vcm0gKz0gbnVtZXh0OjphYnMyKGpfaXQudmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gMiAtIGRldGVjdCBwb3NzaWJsZSB6ZXJvIHJvdworICAgIGlmKHJvd25vcm09PTApCisgICAgeworICAgICAgbV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRha2UgdGhlIDItbm9ybSBvZiB0aGUgY3VycmVudCByb3cgYXMgYSByZWxhdGl2ZSB0b2xlcmFuY2UKKyAgICByb3dub3JtID0gc3FydChyb3dub3JtKTsKKworICAgIC8vIDMgLSBlbGltaW5hdGUgdGhlIHByZXZpb3VzIG5vbnplcm8gcm93cworICAgIEluZGV4IGpqID0gMDsKKyAgICBJbmRleCBsZW4gPSAwOworICAgIHdoaWxlIChqaiA8IHNpemVsKQorICAgIHsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGVsaW1pbmF0ZSBpbiB0aGUgY29ycmVjdCBvcmRlciwKKyAgICAgIC8vIHdlIG11c3Qgc2VsZWN0IGZpcnN0IHRoZSBzbWFsbGVzdCBjb2x1bW4gaW5kZXggYW1vbmcgIGp1KGpqOnNpemVsKQorICAgICAgSW5kZXggazsKKyAgICAgIEluZGV4IG1pbnJvdyA9IGp1LnNlZ21lbnQoamosc2l6ZWwtamopLm1pbkNvZWZmKCZrKTsgLy8gayBpcyByZWxhdGl2ZSB0byB0aGUgc2VnbWVudAorICAgICAgayArPSBqajsKKyAgICAgIGlmIChtaW5yb3cgIT0ganUoamopKQorICAgICAgeworICAgICAgICAvLyBzd2FwIHRoZSB0d28gbG9jYXRpb25zCisgICAgICAgIEluZGV4IGogPSBqdShqaik7CisgICAgICAgIHN3YXAoanUoamopLCBqdShrKSk7CisgICAgICAgIGpyKG1pbnJvdykgPSBjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oamopOworICAgICAgICBqcihqKSA9IGNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihrKTsKKyAgICAgICAgc3dhcCh1KGpqKSwgdShrKSk7CisgICAgICB9CisgICAgICAvLyBSZXNldCB0aGlzIGxvY2F0aW9uCisgICAgICBqcihtaW5yb3cpID0gLTE7CisKKyAgICAgIC8vIFN0YXJ0IGVsaW1pbmF0aW9uCisgICAgICB0eXBlbmFtZSBGYWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGtpX2l0KG1fbHUsIG1pbnJvdyk7CisgICAgICB3aGlsZSAoa2lfaXQgJiYga2lfaXQuaW5kZXgoKSA8IG1pbnJvdykgKytraV9pdDsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChraV9pdCAmJiBraV9pdC5jb2woKT09bWlucm93KTsKKyAgICAgIFNjYWxhciBmYWN0ID0gdShqaikgLyBraV9pdC52YWx1ZSgpOworCisgICAgICAvLyBkcm9wIHRvbyBzbWFsbCBlbGVtZW50cworICAgICAgaWYoYWJzKGZhY3QpIDw9IG1fZHJvcHRvbCkKKyAgICAgIHsKKyAgICAgICAgamorKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGxpbmVhciBjb21iaW5hdGlvbiBvZiB0aGUgY3VycmVudCByb3cgaWkgYW5kIHRoZSByb3cgbWlucm93CisgICAgICArK2tpX2l0OworICAgICAgZm9yICg7IGtpX2l0OyArK2tpX2l0KQorICAgICAgeworICAgICAgICBTY2FsYXIgcHJvZCA9IGZhY3QgKiBraV9pdC52YWx1ZSgpOworICAgICAgICBJbmRleCBqICAgICA9IGtpX2l0LmluZGV4KCk7CisgICAgICAgIEluZGV4IGpwb3MgID0ganIoaik7CisgICAgICAgIGlmIChqcG9zID09IC0xKSAvLyBmaWxsLWluIGVsZW1lbnQKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IG5ld3BvczsKKyAgICAgICAgICBpZiAoaiA+PSBpaSkgLy8gZGVhbGluZyB3aXRoIHRoZSB1cHBlciBwYXJ0CisgICAgICAgICAgeworICAgICAgICAgICAgbmV3cG9zID0gaWkgKyBzaXpldTsKKyAgICAgICAgICAgIHNpemV1Kys7CisgICAgICAgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc2l6ZXU8PW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8vIGRlYWxpbmcgd2l0aCB0aGUgbG93ZXIgcGFydAorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5ld3BvcyA9IHNpemVsOworICAgICAgICAgICAgc2l6ZWwrKzsKKyAgICAgICAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChzaXplbDw9aWkpOworICAgICAgICAgIH0KKyAgICAgICAgICBqdShuZXdwb3MpID0gY29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KGopOworICAgICAgICAgIHUobmV3cG9zKSA9IC1wcm9kOworICAgICAgICAgIGpyKGopID0gY29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KG5ld3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHUoanBvcykgLT0gcHJvZDsKKyAgICAgIH0KKyAgICAgIC8vIHN0b3JlIHRoZSBwaXZvdCBlbGVtZW50CisgICAgICB1KGxlbikgID0gZmFjdDsKKyAgICAgIGp1KGxlbikgPSBjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4obWlucm93KTsKKyAgICAgICsrbGVuOworCisgICAgICBqaisrOworICAgIH0gLy8gZW5kIG9mIHRoZSBlbGltaW5hdGlvbiBvbiB0aGUgcm93IGlpCisKKyAgICAvLyByZXNldCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcG9pbnRlciBqciB0byB6ZXJvCisgICAgZm9yKEluZGV4IGsgPSAwOyBrIDxzaXpldTsgaysrKSBqcihqdShpaStrKSkgPSAtMTsKKworICAgIC8vIDQgLSBwYXJ0aWFsbHkgc29ydCBhbmQgaW5zZXJ0IHRoZSBlbGVtZW50cyBpbiB0aGUgbV9sdSBtYXRyaXgKKworICAgIC8vIHNvcnQgdGhlIEwtcGFydCBvZiB0aGUgcm93CisgICAgc2l6ZWwgPSBsZW47CisgICAgbGVuID0gKHN0ZDo6bWluKShzaXplbCwgbm56TCk7CisgICAgdHlwZW5hbWUgVmVjdG9yOjpTZWdtZW50UmV0dXJuVHlwZSB1bCh1LnNlZ21lbnQoMCwgc2l6ZWwpKTsKKyAgICB0eXBlbmFtZSBWZWN0b3JJOjpTZWdtZW50UmV0dXJuVHlwZSBqdWwoanUuc2VnbWVudCgwLCBzaXplbCkpOworICAgIGludGVybmFsOjpRdWlja1NwbGl0KHVsLCBqdWwsIGxlbik7CisKKyAgICAvLyBzdG9yZSB0aGUgbGFyZ2VzdCBtX2ZpbGwgZWxlbWVudHMgb2YgdGhlIEwgcGFydAorICAgIG1fbHUuc3RhcnRWZWMoaWkpOworICAgIGZvcihJbmRleCBrID0gMDsgayA8IGxlbjsgaysrKQorICAgICAgbV9sdS5pbnNlcnRCYWNrQnlPdXRlcklubmVyVW5vcmRlcmVkKGlpLGp1KGspKSA9IHUoayk7CisKKyAgICAvLyBzdG9yZSB0aGUgZGlhZ29uYWwgZWxlbWVudAorICAgIC8vIGFwcGx5IGEgc2hpZnRpbmcgcnVsZSB0byBhdm9pZCB6ZXJvIHBpdm90cyAod2UgYXJlIGRvaW5nIGFuIGluY29tcGxldGUgZmFjdG9yaXphdGlvbikKKyAgICBpZiAodShpaSkgPT0gU2NhbGFyKDApKQorICAgICAgdShpaSkgPSBzcXJ0KG1fZHJvcHRvbCkgKiByb3dub3JtOworICAgIG1fbHUuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lclVub3JkZXJlZChpaSwgaWkpID0gdShpaSk7CisKKyAgICAvLyBzb3J0IHRoZSBVLXBhcnQgb2YgdGhlIHJvdworICAgIC8vIGFwcGx5IHRoZSBkcm9wcGluZyBydWxlIGZpcnN0CisgICAgbGVuID0gMDsKKyAgICBmb3IoSW5kZXggayA9IDE7IGsgPCBzaXpldTsgaysrKQorICAgIHsKKyAgICAgIGlmKGFicyh1KGlpK2spKSA+IG1fZHJvcHRvbCAqIHJvd25vcm0gKQorICAgICAgeworICAgICAgICArK2xlbjsKKyAgICAgICAgdShpaSArIGxlbikgID0gdShpaSArIGspOworICAgICAgICBqdShpaSArIGxlbikgPSBqdShpaSArIGspOworICAgICAgfQorICAgIH0KKyAgICBzaXpldSA9IGxlbiArIDE7IC8vICsxIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBkaWFnb25hbCBlbGVtZW50CisgICAgbGVuID0gKHN0ZDo6bWluKShzaXpldSwgbm56VSk7CisgICAgdHlwZW5hbWUgVmVjdG9yOjpTZWdtZW50UmV0dXJuVHlwZSB1dSh1LnNlZ21lbnQoaWkrMSwgc2l6ZXUtMSkpOworICAgIHR5cGVuYW1lIFZlY3Rvckk6OlNlZ21lbnRSZXR1cm5UeXBlIGp1dShqdS5zZWdtZW50KGlpKzEsIHNpemV1LTEpKTsKKyAgICBpbnRlcm5hbDo6UXVpY2tTcGxpdCh1dSwganV1LCBsZW4pOworCisgICAgLy8gc3RvcmUgdGhlIGxhcmdlc3QgZWxlbWVudHMgb2YgdGhlIFUgcGFydAorICAgIGZvcihJbmRleCBrID0gaWkgKyAxOyBrIDwgaWkgKyBsZW47IGsrKykKKyAgICAgIG1fbHUuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lclVub3JkZXJlZChpaSxqdShrKSkgPSB1KGspOworICB9CisgIG1fbHUuZmluYWxpemUoKTsKKyAgbV9sdS5tYWtlQ29tcHJlc3NlZCgpOworCisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICBtX2luZm8gPSBTdWNjZXNzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lOQ09NUExFVEVfTFVUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0l0ZXJhdGl2ZVNvbHZlckJhc2UuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0l0ZXJhdGl2ZVNvbHZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzIzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvSXRlcmF0aXZlU29sdmVyQmFzZS5oCkBAIC0wLDAgKzEsMzk0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JVEVSQVRJVkVfU09MVkVSX0JBU0VfSAorI2RlZmluZSBFSUdFTl9JVEVSQVRJVkVfU09MVkVSX0JBU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBpc19yZWZfY29tcGF0aWJsZV9pbXBsCit7Citwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDA+CisgIHN0cnVjdCBhbnlfY29udmVyc2lvbgorICB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGFueV9jb252ZXJzaW9uKGNvbnN0IHZvbGF0aWxlIFQmKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYW55X2NvbnZlcnNpb24oVCYpOworICB9OworICBzdHJ1Y3QgeWVzIHtpbnQgYVsxXTt9OworICBzdHJ1Y3Qgbm8gIHtpbnQgYVsyXTt9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB5ZXMgdGVzdChjb25zdCBSZWY8Y29uc3QgVD4mLCBpbnQpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgbm8gIHRlc3QoYW55X2NvbnZlcnNpb248VD4sIC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIE1hdHJpeFR5cGUgbXNfZnJvbTsKKyAgZW51bSB7IHZhbHVlID0gc2l6ZW9mKHRlc3Q8TWF0cml4VHlwZT4obXNfZnJvbSwgMCkpPT1zaXplb2YoeWVzKSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBpc19yZWZfY29tcGF0aWJsZQoreworICBlbnVtIHsgdmFsdWUgPSBpc19yZWZfY29tcGF0aWJsZV9pbXBsPHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGU+Ojp2YWx1ZSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgYm9vbCBNYXRyaXhGcmVlID0gIWludGVybmFsOjppc19yZWZfY29tcGF0aWJsZTxNYXRyaXhUeXBlPjo6dmFsdWU+CitjbGFzcyBnZW5lcmljX21hdHJpeF93cmFwcGVyOworCisvLyBXZSBoYXZlIGFuIGV4cGxpY2l0IG1hdHJpeCBhdCBoYW5kLCBjb21wYXRpYmxlIHdpdGggUmVmPD4KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBnZW5lcmljX21hdHJpeF93cmFwcGVyPE1hdHJpeFR5cGUsZmFsc2U+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgUmVmPGNvbnN0IE1hdHJpeFR5cGU+IEFjdHVhbE1hdHJpeFR5cGU7CisgIHRlbXBsYXRlPGludCBVcExvPiBzdHJ1Y3QgQ29uc3RTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFjdHVhbE1hdHJpeFR5cGU6OnRlbXBsYXRlIENvbnN0U2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZTxVcExvPjo6VHlwZSBUeXBlOworICB9OworCisgIGVudW0geworICAgIE1hdHJpeEZyZWUgPSBmYWxzZQorICB9OworCisgIGdlbmVyaWNfbWF0cml4X3dyYXBwZXIoKQorICAgIDogbV9kdW1teSgwLDApLCBtX21hdHJpeChtX2R1bW15KQorICB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgZ2VuZXJpY19tYXRyaXhfd3JhcHBlcihjb25zdCBJbnB1dFR5cGUgJm1hdCkKKyAgICA6IG1fbWF0cml4KG1hdCkKKyAge30KKworICBjb25zdCBBY3R1YWxNYXRyaXhUeXBlJiBtYXRyaXgoKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fbWF0cml4OworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgdm9pZCBncmFiKGNvbnN0IEVpZ2VuQmFzZTxNYXRyaXhEZXJpdmVkPiAmbWF0KQorICB7CisgICAgbV9tYXRyaXguflJlZjxjb25zdCBNYXRyaXhUeXBlPigpOworICAgIDo6bmV3ICgmbV9tYXRyaXgpIFJlZjxjb25zdCBNYXRyaXhUeXBlPihtYXQuZGVyaXZlZCgpKTsKKyAgfQorCisgIHZvaWQgZ3JhYihjb25zdCBSZWY8Y29uc3QgTWF0cml4VHlwZT4gJm1hdCkKKyAgeworICAgIGlmKCYobWF0LmRlcml2ZWQoKSkgIT0gJm1fbWF0cml4KQorICAgIHsKKyAgICAgIG1fbWF0cml4Ln5SZWY8Y29uc3QgTWF0cml4VHlwZT4oKTsKKyAgICAgIDo6bmV3ICgmbV9tYXRyaXgpIFJlZjxjb25zdCBNYXRyaXhUeXBlPihtYXQpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIE1hdHJpeFR5cGUgbV9kdW1teTsgLy8gdXNlZCB0byBkZWZhdWx0IGluaXRpYWxpemUgdGhlIFJlZjw+IG9iamVjdAorICBBY3R1YWxNYXRyaXhUeXBlIG1fbWF0cml4OworfTsKKworLy8gTWF0cml4VHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFJlZjw+IC0+IG1hdHJpeC1mcmVlIHdyYXBwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBnZW5lcmljX21hdHJpeF93cmFwcGVyPE1hdHJpeFR5cGUsdHJ1ZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBNYXRyaXhUeXBlIEFjdHVhbE1hdHJpeFR5cGU7CisgIHRlbXBsYXRlPGludCBVcExvPiBzdHJ1Y3QgQ29uc3RTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlCisgIHsKKyAgICB0eXBlZGVmIEFjdHVhbE1hdHJpeFR5cGUgVHlwZTsKKyAgfTsKKworICBlbnVtIHsKKyAgICBNYXRyaXhGcmVlID0gdHJ1ZQorICB9OworCisgIGdlbmVyaWNfbWF0cml4X3dyYXBwZXIoKQorICAgIDogbXBfbWF0cml4KDApCisgIHt9CisKKyAgZ2VuZXJpY19tYXRyaXhfd3JhcHBlcihjb25zdCBNYXRyaXhUeXBlICZtYXQpCisgICAgOiBtcF9tYXRyaXgoJm1hdCkKKyAge30KKworICBjb25zdCBBY3R1YWxNYXRyaXhUeXBlJiBtYXRyaXgoKSBjb25zdAorICB7CisgICAgcmV0dXJuICptcF9tYXRyaXg7CisgIH0KKworICB2b2lkIGdyYWIoY29uc3QgTWF0cml4VHlwZSAmbWF0KQorICB7CisgICAgbXBfbWF0cml4ID0gJm1hdDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEFjdHVhbE1hdHJpeFR5cGUgKm1wX21hdHJpeDsKK307CisKK30KKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIGxpbmVhciBpdGVyYXRpdmUgc29sdmVycworICAqCisgICogXHNhIGNsYXNzIFNpbXBsaWNpYWxDaG9sZXNreSwgRGlhZ29uYWxQcmVjb25kaXRpb25lciwgSWRlbnRpdHlQcmVjb25kaXRpb25lcgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBJdGVyYXRpdmVTb2x2ZXJCYXNlIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4KK3sKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPERlcml2ZWQ+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKyAgCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisKKyAgZW51bSB7CisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgIH07CisKK3B1YmxpYzoKKworICB1c2luZyBCYXNlOjpkZXJpdmVkOworCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICBJdGVyYXRpdmVTb2x2ZXJCYXNlKCkKKyAgeworICAgIGluaXQoKTsKKyAgfQorCisgIC8qKiBJbml0aWFsaXplIHRoZSBzb2x2ZXIgd2l0aCBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBcYyBBeD1iIHNvbHZpbmcuCisgICAgKiAKKyAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9sbG93ZWQKKyAgICAqIGJ5IGEgY2FsbCB0byBjb21wdXRlKCkuCisgICAgKiAKKyAgICAqIFx3YXJuaW5nIHRoaXMgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggQSBhcyB3ZWxsIGFzIHNvbWUKKyAgICAqIHByZWNvbXB1dGVkIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhlcmVmb3JlLCBpZiBcYSBBIGlzIGNoYW5nZWQKKyAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgKiBtYXRyaXggQSwgb3IgbW9kaWZ5IGEgY29weSBvZiBBLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CisgIGV4cGxpY2l0IEl0ZXJhdGl2ZVNvbHZlckJhc2UoY29uc3QgRWlnZW5CYXNlPE1hdHJpeERlcml2ZWQ+JiBBKQorICAgIDogbV9tYXRyaXhXcmFwcGVyKEEuZGVyaXZlZCgpKQorICB7CisgICAgaW5pdCgpOworICAgIGNvbXB1dGUobWF0cml4KCkpOworICB9CisKKyAgfkl0ZXJhdGl2ZVNvbHZlckJhc2UoKSB7fQorICAKKyAgLyoqIEluaXRpYWxpemVzIHRoZSBpdGVyYXRpdmUgc29sdmVyIGZvciB0aGUgc3BhcnNpdHkgcGF0dGVybiBvZiB0aGUgbWF0cml4IFxhIEEgZm9yIGZ1cnRoZXIgc29sdmluZyBcYyBBeD1iIHByb2JsZW1zLgorICAgICoKKyAgICAqIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiBtb3N0bHkgY2FsbHMgYW5hbHl6ZVBhdHRlcm4gb24gdGhlIHByZWNvbmRpdGlvbmVyLiBJbiB0aGUgZnV0dXJlCisgICAgKiB3ZSBtaWdodCwgZm9yIGluc3RhbmNlLCBpbXBsZW1lbnQgY29sdW1uIHJlb3JkZXJpbmcgZm9yIGZhc3RlciBtYXRyaXggdmVjdG9yIHByb2R1Y3RzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CisgIERlcml2ZWQmIGFuYWx5emVQYXR0ZXJuKGNvbnN0IEVpZ2VuQmFzZTxNYXRyaXhEZXJpdmVkPiYgQSkKKyAgeworICAgIGdyYWIoQS5kZXJpdmVkKCkpOworICAgIG1fcHJlY29uZGl0aW9uZXIuYW5hbHl6ZVBhdHRlcm4obWF0cml4KCkpOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICAgIG1faW5mbyA9IG1fcHJlY29uZGl0aW9uZXIuaW5mbygpOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KKyAgCisgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0aXZlIHNvbHZlciB3aXRoIHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZSBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBzb2x2aW5nIFxjIEF4PWIgcHJvYmxlbXMuCisgICAgKgorICAgICogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIG1vc3RseSBjYWxscyBmYWN0b3JpemUgb24gdGhlIHByZWNvbmRpdGlvbmVyLgorICAgICoKKyAgICAqIFx3YXJuaW5nIHRoaXMgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggQSBhcyB3ZWxsIGFzIHNvbWUKKyAgICAqIHByZWNvbXB1dGVkIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhlcmVmb3JlLCBpZiBcYSBBIGlzIGNoYW5nZWQKKyAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgKiBtYXRyaXggQSwgb3IgbW9kaWZ5IGEgY29weSBvZiBBLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeERlcml2ZWQ+CisgIERlcml2ZWQmIGZhY3Rvcml6ZShjb25zdCBFaWdlbkJhc2U8TWF0cml4RGVyaXZlZD4mIEEpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOyAKKyAgICBncmFiKEEuZGVyaXZlZCgpKTsKKyAgICBtX3ByZWNvbmRpdGlvbmVyLmZhY3Rvcml6ZShtYXRyaXgoKSk7CisgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgICAgbV9pbmZvID0gbV9wcmVjb25kaXRpb25lci5pbmZvKCk7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0aXZlIHNvbHZlciB3aXRoIHRoZSBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBzb2x2aW5nIFxjIEF4PWIgcHJvYmxlbXMuCisgICAgKgorICAgICogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIG1vc3RseSBpbml0aWFsaXplcy9jb21wdXRlcyB0aGUgcHJlY29uZGl0aW9uZXIuIEluIHRoZSBmdXR1cmUKKyAgICAqIHdlIG1pZ2h0LCBmb3IgaW5zdGFuY2UsIGltcGxlbWVudCBjb2x1bW4gcmVvcmRlcmluZyBmb3IgZmFzdGVyIG1hdHJpeCB2ZWN0b3IgcHJvZHVjdHMuCisgICAgKgorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgRGVyaXZlZCYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8TWF0cml4RGVyaXZlZD4mIEEpCisgIHsKKyAgICBncmFiKEEuZGVyaXZlZCgpKTsKKyAgICBtX3ByZWNvbmRpdGlvbmVyLmNvbXB1dGUobWF0cml4KCkpOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIG1faW5mbyA9IG1fcHJlY29uZGl0aW9uZXIuaW5mbygpOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KKworICAvKiogXGludGVybmFsICovCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtYXRyaXgoKS5yb3dzKCk7IH0KKworICAvKiogXGludGVybmFsICovCisgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtYXRyaXgoKS5jb2xzKCk7IH0KKworICAvKiogXHJldHVybnMgdGhlIHRvbGVyYW5jZSB0aHJlc2hvbGQgdXNlZCBieSB0aGUgc3RvcHBpbmcgY3JpdGVyaWEuCisgICAgKiBcc2Egc2V0VG9sZXJhbmNlKCkKKyAgICAqLworICBSZWFsU2NhbGFyIHRvbGVyYW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1fdG9sZXJhbmNlOyB9CisgIAorICAvKiogU2V0cyB0aGUgdG9sZXJhbmNlIHRocmVzaG9sZCB1c2VkIGJ5IHRoZSBzdG9wcGluZyBjcml0ZXJpYS4KKyAgICAqCisgICAgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYW4gdXBwZXIgYm91bmQgdG8gdGhlIHJlbGF0aXZlIHJlc2lkdWFsIGVycm9yOiB8QXgtYnwvfGJ8LgorICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIG1hY2hpbmUgcHJlY2lzaW9uIGdpdmVuIGJ5IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkKKyAgICAqLworICBEZXJpdmVkJiBzZXRUb2xlcmFuY2UoY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgbV90b2xlcmFuY2UgPSB0b2xlcmFuY2U7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBwcmVjb25kaXRpb25lciBmb3IgY3VzdG9tIGNvbmZpZ3VyYXRpb24uICovCisgIFByZWNvbmRpdGlvbmVyJiBwcmVjb25kaXRpb25lcigpIHsgcmV0dXJuIG1fcHJlY29uZGl0aW9uZXI7IH0KKyAgCisgIC8qKiBccmV0dXJucyBhIHJlYWQtb25seSByZWZlcmVuY2UgdG8gdGhlIHByZWNvbmRpdGlvbmVyLiAqLworICBjb25zdCBQcmVjb25kaXRpb25lciYgcHJlY29uZGl0aW9uZXIoKSBjb25zdCB7IHJldHVybiBtX3ByZWNvbmRpdGlvbmVyOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAgKiBJdCBpcyBlaXRoZXIgdGhlIHZhbHVlIHNldHRlZCBieSBzZXRNYXhJdGVyYXRpb25zIG9yLCBieSBkZWZhdWx0LAorICAgICogdHdpY2UgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXguCisgICAgKi8KKyAgSW5kZXggbWF4SXRlcmF0aW9ucygpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKG1fbWF4SXRlcmF0aW9uczwwKSA/IDIqbWF0cml4KCkuY29scygpIDogbV9tYXhJdGVyYXRpb25zOworICB9CisgIAorICAvKiogU2V0cyB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb25zLgorICAgICogRGVmYXVsdCBpcyB0d2ljZSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeC4KKyAgICAqLworICBEZXJpdmVkJiBzZXRNYXhJdGVyYXRpb25zKEluZGV4IG1heEl0ZXJzKQorICB7CisgICAgbV9tYXhJdGVyYXRpb25zID0gbWF4SXRlcnM7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyZm9ybWVkIGR1cmluZyB0aGUgbGFzdCBzb2x2ZSAqLworICBJbmRleCBpdGVyYXRpb25zKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbmp1Z2F0ZUdyYWRpZW50IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gbV9pdGVyYXRpb25zOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSB0b2xlcmFuY2UgZXJyb3IgcmVhY2hlZCBkdXJpbmcgdGhlIGxhc3Qgc29sdmUuCisgICAgKiBJdCBpcyBhIGNsb3NlIGFwcHJveGltYXRpb24gb2YgdGhlIHRydWUgcmVsYXRpdmUgcmVzaWR1YWwgZXJyb3IgfEF4LWJ8L3xifC4KKyAgICAqLworICBSZWFsU2NhbGFyIGVycm9yKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbmp1Z2F0ZUdyYWRpZW50IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gbV9lcnJvcjsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBCisgICAgKiBhbmQgXGEgeDAgYXMgYW4gaW5pdGlhbCBzb2x1dGlvbi4KKyAgICAqCisgICAgKiBcc2Egc29sdmUoKSwgY29tcHV0ZSgpCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIEd1ZXNzPgorICBpbmxpbmUgY29uc3QgU29sdmVXaXRoR3Vlc3M8RGVyaXZlZCwgUmhzLCBHdWVzcz4KKyAgc29sdmVXaXRoR3Vlc3MoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiLCBjb25zdCBHdWVzcyYgeDApIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIGVpZ2VuX2Fzc2VydChkZXJpdmVkKCkucm93cygpPT1iLnJvd3MoKSAmJiAic29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgcmV0dXJuIFNvbHZlV2l0aEd1ZXNzPERlcml2ZWQsIFJocywgR3Vlc3M+KGRlcml2ZWQoKSwgYi5kZXJpdmVkKCksIHgwKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBTdWNjZXNzIGlmIHRoZSBpdGVyYXRpb25zIGNvbnZlcmdlZCwgYW5kIE5vQ29udmVyZ2VuY2Ugb3RoZXJ3aXNlLiAqLworICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJdGVyYXRpdmVTb2x2ZXJCYXNlIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gbV9pbmZvOworICB9CisgIAorICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdERlcml2ZWQ+CisgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzJiBiLCBTcGFyc2VNYXRyaXhCYXNlPERlc3REZXJpdmVkPiAmYURlc3QpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKSk7CisgICAgCisgICAgSW5kZXggcmhzQ29scyA9IGIuY29scygpOworICAgIEluZGV4IHNpemUgPSBiLnJvd3MoKTsKKyAgICBEZXN0RGVyaXZlZCYgZGVzdChhRGVzdC5kZXJpdmVkKCkpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdERlcml2ZWQ6OlNjYWxhciBEZXN0U2NhbGFyOworICAgIEVpZ2VuOjpNYXRyaXg8RGVzdFNjYWxhcixEeW5hbWljLDE+IHRiKHNpemUpOworICAgIEVpZ2VuOjpNYXRyaXg8RGVzdFNjYWxhcixEeW5hbWljLDE+IHR4KGNvbHMoKSk7CisgICAgLy8gV2UgZG8gbm90IGRpcmVjdGx5IGZpbGwgZGVzdCBiZWNhdXNlIHNwYXJzZSBleHByZXNzaW9ucyBoYXZlIHRvIGJlIGZyZWUgb2YgYWxpYXNpbmcgaXNzdWUuCisgICAgLy8gRm9yIG5vbiBzcXVhcmUgbGVhc3Qtc3F1YXJlIHByb2JsZW1zLCBiIGFuZCBkZXN0IG1pZ2h0IG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgd2hlcmVhcyB0aGV5IG1pZ2h0IGFsaWFzIGVhY2gtb3RoZXIuCisgICAgdHlwZW5hbWUgRGVzdERlcml2ZWQ6OlBsYWluT2JqZWN0IHRtcChjb2xzKCkscmhzQ29scyk7CisgICAgZm9yKEluZGV4IGs9MDsgazxyaHNDb2xzOyArK2spCisgICAgeworICAgICAgdGIgPSBiLmNvbChrKTsKKyAgICAgIHR4ID0gZGVyaXZlZCgpLnNvbHZlKHRiKTsKKyAgICAgIHRtcC5jb2woaykgPSB0eC5zcGFyc2VWaWV3KDApOworICAgIH0KKyAgICBkZXN0LnN3YXAodG1wKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgaW5pdCgpCisgIHsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtX2FuYWx5c2lzSXNPayA9IGZhbHNlOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICBtX21heEl0ZXJhdGlvbnMgPSAtMTsKKyAgICBtX3RvbGVyYW5jZSA9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgIH0KKworICB0eXBlZGVmIGludGVybmFsOjpnZW5lcmljX21hdHJpeF93cmFwcGVyPE1hdHJpeFR5cGU+IE1hdHJpeFdyYXBwZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4V3JhcHBlcjo6QWN0dWFsTWF0cml4VHlwZSBBY3R1YWxNYXRyaXhUeXBlOworCisgIGNvbnN0IEFjdHVhbE1hdHJpeFR5cGUmIG1hdHJpeCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9tYXRyaXhXcmFwcGVyLm1hdHJpeCgpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgIHZvaWQgZ3JhYihjb25zdCBJbnB1dFR5cGUgJkEpCisgIHsKKyAgICBtX21hdHJpeFdyYXBwZXIuZ3JhYihBKTsKKyAgfQorICAKKyAgTWF0cml4V3JhcHBlciBtX21hdHJpeFdyYXBwZXI7CisgIFByZWNvbmRpdGlvbmVyIG1fcHJlY29uZGl0aW9uZXI7CisKKyAgSW5kZXggbV9tYXhJdGVyYXRpb25zOworICBSZWFsU2NhbGFyIG1fdG9sZXJhbmNlOworICAKKyAgbXV0YWJsZSBSZWFsU2NhbGFyIG1fZXJyb3I7CisgIG11dGFibGUgSW5kZXggbV9pdGVyYXRpb25zOworICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgIG11dGFibGUgYm9vbCBtX2FuYWx5c2lzSXNPaywgbV9mYWN0b3JpemF0aW9uSXNPazsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSVRFUkFUSVZFX1NPTFZFUl9CQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0xlYXN0U3F1YXJlQ29uanVnYXRlR3JhZGllbnQuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0xlYXN0U3F1YXJlQ29uanVnYXRlR3JhZGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWVhMGUwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvTGVhc3RTcXVhcmVDb25qdWdhdGVHcmFkaWVudC5oCkBAIC0wLDAgKzEsMjE2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTEVBU1RfU1FVQVJFX0NPTkpVR0FURV9HUkFESUVOVF9ICisjZGVmaW5lIEVJR0VOX0xFQVNUX1NRVUFSRV9DT05KVUdBVEVfR1JBRElFTlRfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCBMb3ctbGV2ZWwgY29uanVnYXRlIGdyYWRpZW50IGFsZ29yaXRobSBmb3IgbGVhc3Qtc3F1YXJlIHByb2JsZW1zCisgICogXHBhcmFtIG1hdCBUaGUgbWF0cml4IEEKKyAgKiBccGFyYW0gcmhzIFRoZSByaWdodCBoYW5kIHNpZGUgdmVjdG9yIGIKKyAgKiBccGFyYW0geCBPbiBpbnB1dCBhbmQgaW5pdGlhbCBzb2x1dGlvbiwgb24gb3V0cHV0IHRoZSBjb21wdXRlZCBzb2x1dGlvbi4KKyAgKiBccGFyYW0gcHJlY29uZCBBIHByZWNvbmRpdGlvbmVyIGJlaW5nIGFibGUgdG8gZWZmaWNpZW50bHkgc29sdmUgZm9yIGFuCisgICogICAgICAgICAgICAgICAgYXBwcm94aW1hdGlvbiBvZiBBJ0F4PWIgKHJlZ2FyZGxlc3Mgb2YgYikKKyAgKiBccGFyYW0gaXRlcnMgT24gaW5wdXQgdGhlIG1heCBudW1iZXIgb2YgaXRlcmF0aW9uLCBvbiBvdXRwdXQgdGhlIG51bWJlciBvZiBwZXJmb3JtZWQgaXRlcmF0aW9ucy4KKyAgKiBccGFyYW0gdG9sX2Vycm9yIE9uIGlucHV0IHRoZSB0b2xlcmFuY2UgZXJyb3IsIG9uIG91dHB1dCBhbiBlc3RpbWF0aW9uIG9mIHRoZSByZWxhdGl2ZSBlcnJvci4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdCwgdHlwZW5hbWUgUHJlY29uZGl0aW9uZXI+CitFSUdFTl9ET05UX0lOTElORQordm9pZCBsZWFzdF9zcXVhcmVfY29uanVnYXRlX2dyYWRpZW50KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUmhzJiByaHMsIERlc3QmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIEluZGV4JiBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyJiB0b2xfZXJyb3IpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgIAorICBSZWFsU2NhbGFyIHRvbCA9IHRvbF9lcnJvcjsKKyAgSW5kZXggbWF4SXRlcnMgPSBpdGVyczsKKyAgCisgIEluZGV4IG0gPSBtYXQucm93cygpLCBuID0gbWF0LmNvbHMoKTsKKworICBWZWN0b3JUeXBlIHJlc2lkdWFsICAgICAgICA9IHJocyAtIG1hdCAqIHg7CisgIFZlY3RvclR5cGUgbm9ybWFsX3Jlc2lkdWFsID0gbWF0LmFkam9pbnQoKSAqIHJlc2lkdWFsOworCisgIFJlYWxTY2FsYXIgcmhzTm9ybTIgPSAobWF0LmFkam9pbnQoKSpyaHMpLnNxdWFyZWROb3JtKCk7CisgIGlmKHJoc05vcm0yID09IDApIAorICB7CisgICAgeC5zZXRaZXJvKCk7CisgICAgaXRlcnMgPSAwOworICAgIHRvbF9lcnJvciA9IDA7CisgICAgcmV0dXJuOworICB9CisgIFJlYWxTY2FsYXIgdGhyZXNob2xkID0gdG9sKnRvbCpyaHNOb3JtMjsKKyAgUmVhbFNjYWxhciByZXNpZHVhbE5vcm0yID0gbm9ybWFsX3Jlc2lkdWFsLnNxdWFyZWROb3JtKCk7CisgIGlmIChyZXNpZHVhbE5vcm0yIDwgdGhyZXNob2xkKQorICB7CisgICAgaXRlcnMgPSAwOworICAgIHRvbF9lcnJvciA9IHNxcnQocmVzaWR1YWxOb3JtMiAvIHJoc05vcm0yKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIFZlY3RvclR5cGUgcChuKTsKKyAgcCA9IHByZWNvbmQuc29sdmUobm9ybWFsX3Jlc2lkdWFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBzZWFyY2ggZGlyZWN0aW9uCisKKyAgVmVjdG9yVHlwZSB6KG4pLCB0bXAobSk7CisgIFJlYWxTY2FsYXIgYWJzTmV3ID0gbnVtZXh0OjpyZWFsKG5vcm1hbF9yZXNpZHVhbC5kb3QocCkpOyAgLy8gdGhlIHNxdWFyZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgciBzY2FsZWQgYnkgaW52TQorICBJbmRleCBpID0gMDsKKyAgd2hpbGUoaSA8IG1heEl0ZXJzKQorICB7CisgICAgdG1wLm5vYWxpYXMoKSA9IG1hdCAqIHA7CisKKyAgICBTY2FsYXIgYWxwaGEgPSBhYnNOZXcgLyB0bXAuc3F1YXJlZE5vcm0oKTsgICAgICAvLyB0aGUgYW1vdW50IHdlIHRyYXZlbCBvbiBkaXIKKyAgICB4ICs9IGFscGhhICogcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgc29sdXRpb24KKyAgICByZXNpZHVhbCAtPSBhbHBoYSAqIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcmVzaWR1YWwKKyAgICBub3JtYWxfcmVzaWR1YWwgPSBtYXQuYWRqb2ludCgpICogcmVzaWR1YWw7ICAgICAvLyB1cGRhdGUgcmVzaWR1YWwgb2YgdGhlIG5vcm1hbCBlcXVhdGlvbgorICAgIAorICAgIHJlc2lkdWFsTm9ybTIgPSBub3JtYWxfcmVzaWR1YWwuc3F1YXJlZE5vcm0oKTsKKyAgICBpZihyZXNpZHVhbE5vcm0yIDwgdGhyZXNob2xkKQorICAgICAgYnJlYWs7CisgICAgCisgICAgeiA9IHByZWNvbmQuc29sdmUobm9ybWFsX3Jlc2lkdWFsKTsgICAgICAgICAgICAgLy8gYXBwcm94aW1hdGVseSBzb2x2ZSBmb3IgIkEnQSB6ID0gbm9ybWFsX3Jlc2lkdWFsIgorCisgICAgUmVhbFNjYWxhciBhYnNPbGQgPSBhYnNOZXc7CisgICAgYWJzTmV3ID0gbnVtZXh0OjpyZWFsKG5vcm1hbF9yZXNpZHVhbC5kb3QoeikpOyAgLy8gdXBkYXRlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiByCisgICAgUmVhbFNjYWxhciBiZXRhID0gYWJzTmV3IC8gYWJzT2xkOyAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBHcmFtLVNjaG1pZHQgdmFsdWUgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBzZWFyY2ggZGlyZWN0aW9uCisgICAgcCA9IHogKyBiZXRhICogcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlYXJjaCBkaXJlY3Rpb24KKyAgICBpKys7CisgIH0KKyAgdG9sX2Vycm9yID0gc3FydChyZXNpZHVhbE5vcm0yIC8gcmhzTm9ybTIpOworICBpdGVycyA9IGk7Cit9CisKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lciA9IExlYXN0U3F1YXJlRGlhZ29uYWxQcmVjb25kaXRpb25lcjx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyPiA+CitjbGFzcyBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitzdHJ1Y3QgdHJhaXRzPExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PF9NYXRyaXhUeXBlLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgX1ByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworfTsKKworfQorCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgQSBjb25qdWdhdGUgZ3JhZGllbnQgc29sdmVyIGZvciBzcGFyc2UgKG9yIGRlbnNlKSBsZWFzdC1zcXVhcmUgcHJvYmxlbXMKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBIHggPSBiIGxpbmVhciBwcm9ibGVtcyB1c2luZyBhbiBpdGVyYXRpdmUgY29uanVnYXRlIGdyYWRpZW50IGFsZ29yaXRobS4KKyAgKiBUaGUgbWF0cml4IEEgY2FuIGJlIG5vbiBzeW1tZXRyaWMgYW5kIHJlY3Rhbmd1bGFyLCBidXQgdGhlIG1hdHJpeCBBJyBBIHNob3VsZCBiZSBwb3NpdGl2ZS1kZWZpbml0ZSB0byBndWFyYW50eSBzdGFiaWxpdHkuCisgICogT3RoZXJ3aXNlLCB0aGUgU3BhcnNlTFUgb3IgU3BhcnNlUVIgY2xhc3NlcyBtaWdodCBiZSBwcmVmZXJhYmxlLgorICAqIFRoZSBtYXRyaXggQSBhbmQgdGhlIHZlY3RvcnMgeCBhbmQgYiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBBLCBjYW4gYmUgYSBkZW5zZSBvciBhIHNwYXJzZSBtYXRyaXguCisgICogXHRwYXJhbSBfUHJlY29uZGl0aW9uZXIgdGhlIHR5cGUgb2YgdGhlIHByZWNvbmRpdGlvbmVyLiBEZWZhdWx0IGlzIExlYXN0U3F1YXJlRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICogCisgICogVGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRvbGVyYW5jZSB2YWx1ZSBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIHNldE1heEl0ZXJhdGlvbnMoKQorICAqIGFuZCBzZXRUb2xlcmFuY2UoKSBtZXRob2RzLiBUaGUgZGVmYXVsdHMgYXJlIHRoZSBzaXplIG9mIHRoZSBwcm9ibGVtIGZvciB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucworICAqIGFuZCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpIGZvciB0aGUgdG9sZXJhbmNlLgorICAqIAorICAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIGRpcmVjdCBzb2x2ZXIgY2xhc3Nlcy4gSGVyZSBpcyBhIHR5cGljYWwgdXNhZ2UgZXhhbXBsZToKKyAgICBcY29kZQorICAgIGludCBtPTEwMDAwMDAsIG4gPSAxMDAwMDsKKyAgICBWZWN0b3JYZCB4KG4pLCBiKG0pOworICAgIFNwYXJzZU1hdHJpeDxkb3VibGU+IEEobSxuKTsKKyAgICAvLyBmaWxsIEEgYW5kIGIKKyAgICBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IGxzY2c7CisgICAgbHNjZy5jb21wdXRlKEEpOworICAgIHggPSBsc2NnLnNvbHZlKGIpOworICAgIHN0ZDo6Y291dCA8PCAiI2l0ZXJhdGlvbnM6ICAgICAiIDw8IGxzY2cuaXRlcmF0aW9ucygpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgImVzdGltYXRlZCBlcnJvcjogIiA8PCBsc2NnLmVycm9yKCkgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgLy8gdXBkYXRlIGIsIGFuZCBzb2x2ZSBhZ2FpbgorICAgIHggPSBsc2NnLnNvbHZlKGIpOworICAgIFxlbmRjb2RlCisgICogCisgICogQnkgZGVmYXVsdCB0aGUgaXRlcmF0aW9ucyBzdGFydCB3aXRoIHg9MCBhcyBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBzb2x1dGlvbi4KKyAgKiBPbmUgY2FuIGNvbnRyb2wgdGhlIHN0YXJ0IHVzaW5nIHRoZSBzb2x2ZVdpdGhHdWVzcygpIG1ldGhvZC4KKyAgKiAKKyAgKiBcc2EgY2xhc3MgQ29uanVnYXRlR3JhZGllbnQsIFNwYXJzZUxVLCBTcGFyc2VRUgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitjbGFzcyBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudCA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PF9NYXRyaXhUeXBlLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8TGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQ+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1hdHJpeDsKKyAgdXNpbmcgQmFzZTo6bV9lcnJvcjsKKyAgdXNpbmcgQmFzZTo6bV9pdGVyYXRpb25zOworICB1c2luZyBCYXNlOjptX2luZm87CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIF9QcmVjb25kaXRpb25lciBQcmVjb25kaXRpb25lcjsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudCgpIDogQmFzZSgpIHt9CisKKyAgLyoqIEluaXRpYWxpemUgdGhlIHNvbHZlciB3aXRoIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIFxjIEF4PWIgc29sdmluZy4KKyAgICAqIAorICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb2xsb3dlZAorICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAqIAorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgZXhwbGljaXQgTGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQoY29uc3QgRWlnZW5CYXNlPE1hdHJpeERlcml2ZWQ+JiBBKSA6IEJhc2UoQS5kZXJpdmVkKCkpIHt9CisKKyAgfkxlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50KCkge30KKworICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgbV9pdGVyYXRpb25zID0gQmFzZTo6bWF4SXRlcmF0aW9ucygpOworICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKworICAgIGZvcihJbmRleCBqPTA7IGo8Yi5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBtX2l0ZXJhdGlvbnMgPSBCYXNlOjptYXhJdGVyYXRpb25zKCk7CisgICAgICBtX2Vycm9yID0gQmFzZTo6bV90b2xlcmFuY2U7CisKKyAgICAgIHR5cGVuYW1lIERlc3Q6OkNvbFhwciB4aih4LGopOworICAgICAgaW50ZXJuYWw6OmxlYXN0X3NxdWFyZV9jb25qdWdhdGVfZ3JhZGllbnQobWF0cml4KCksIGIuY29sKGopLCB4aiwgQmFzZTo6bV9wcmVjb25kaXRpb25lciwgbV9pdGVyYXRpb25zLCBtX2Vycm9yKTsKKyAgICB9CisKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1faW5mbyA9IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzIDogTm9Db252ZXJnZW5jZTsKKyAgfQorICAKKyAgLyoqIFxpbnRlcm5hbCAqLworICB1c2luZyBCYXNlOjpfc29sdmVfaW1wbDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgeC5zZXRaZXJvKCk7CisgICAgX3NvbHZlX3dpdGhfZ3Vlc3NfaW1wbChiLmRlcml2ZWQoKSx4KTsKKyAgfQorCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xFQVNUX1NRVUFSRV9DT05KVUdBVEVfR1JBRElFTlRfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvU29sdmVXaXRoR3Vlc3MuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL1NvbHZlV2l0aEd1ZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjZTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL1NvbHZlV2l0aEd1ZXNzLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TT0xWRVdJVEhHVUVTU19ICisjZGVmaW5lIEVJR0VOX1NPTFZFV0lUSEdVRVNTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgR3Vlc3NUeXBlPiBjbGFzcyBTb2x2ZVdpdGhHdWVzczsKKyAgCisvKiogXGNsYXNzIFNvbHZlV2l0aEd1ZXNzCisgICogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQc2V1ZG8gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBzb2x2aW5nIG9wZXJhdGlvbgorICAqCisgICogXHRwYXJhbSBEZWNvbXBvc2l0aW9uIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb3IgZGVjb21wb3Npb24gb2JqZWN0CisgICogXHRwYXJhbSBSaHN0eXBlIHRoZSB0eXBlIG9mIHRoZSByaWdodC1oYW5kIHNpZGUKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIEEuc29sdmUoQikKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb24sIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIEd1ZXNzVHlwZT4KK3N0cnVjdCB0cmFpdHM8U29sdmVXaXRoR3Vlc3M8RGVjb21wb3NpdGlvbiwgUmhzVHlwZSwgR3Vlc3NUeXBlPiA+CisgIDogdHJhaXRzPFNvbHZlPERlY29tcG9zaXRpb24sUmhzVHlwZT4gPgore307CisKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBHdWVzc1R5cGU+CitjbGFzcyBTb2x2ZVdpdGhHdWVzcyA6IHB1YmxpYyBpbnRlcm5hbDo6Z2VuZXJpY194cHJfYmFzZTxTb2x2ZVdpdGhHdWVzczxEZWNvbXBvc2l0aW9uLFJoc1R5cGUsR3Vlc3NUeXBlPiwgTWF0cml4WHByLCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJoc1R5cGU+OjpTdG9yYWdlS2luZD46OnR5cGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNvbHZlV2l0aEd1ZXNzPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNvbHZlV2l0aEd1ZXNzPjo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlbmVyaWNfeHByX2Jhc2U8U29sdmVXaXRoR3Vlc3M8RGVjb21wb3NpdGlvbixSaHNUeXBlLEd1ZXNzVHlwZT4sIE1hdHJpeFhwciwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxSaHNUeXBlPjo6U3RvcmFnZUtpbmQ+Ojp0eXBlIEJhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxTb2x2ZVdpdGhHdWVzcz46OnR5cGUgTmVzdGVkOworICAKKyAgU29sdmVXaXRoR3Vlc3MoY29uc3QgRGVjb21wb3NpdGlvbiAmZGVjLCBjb25zdCBSaHNUeXBlICZyaHMsIGNvbnN0IEd1ZXNzVHlwZSAmZ3Vlc3MpCisgICAgOiBtX2RlYyhkZWMpLCBtX3JocyhyaHMpLCBtX2d1ZXNzKGd1ZXNzKQorICB7fQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjLmNvbHMoKTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9yaHMuY29scygpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGVjb21wb3NpdGlvbiYgZGVjKCkgICBjb25zdCB7IHJldHVybiBtX2RlYzsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBSaHNUeXBlJiAgICAgICByaHMoKSAgIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IEd1ZXNzVHlwZSYgICAgIGd1ZXNzKCkgY29uc3QgeyByZXR1cm4gbV9ndWVzczsgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IERlY29tcG9zaXRpb24gJm1fZGVjOworICBjb25zdCBSaHNUeXBlICAgICAgICZtX3JoczsKKyAgY29uc3QgR3Vlc3NUeXBlICAgICAmbV9ndWVzczsKKyAgCitwcml2YXRlOgorICBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0OworICBTY2FsYXIgY29lZmYoSW5kZXggaSkgY29uc3Q7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBFdmFsdWF0b3Igb2YgU29sdmVXaXRoR3Vlc3MgLT4gZXZhbCBpbnRvIGEgdGVtcG9yYXJ5Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBHdWVzc1R5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yPFNvbHZlV2l0aEd1ZXNzPERlY29tcG9zaXRpb24sUmhzVHlwZSwgR3Vlc3NUeXBlPiA+CisgIDogcHVibGljIGV2YWx1YXRvcjx0eXBlbmFtZSBTb2x2ZVdpdGhHdWVzczxEZWNvbXBvc2l0aW9uLFJoc1R5cGUsR3Vlc3NUeXBlPjo6UGxhaW5PYmplY3Q+Cit7CisgIHR5cGVkZWYgU29sdmVXaXRoR3Vlc3M8RGVjb21wb3NpdGlvbixSaHNUeXBlLEd1ZXNzVHlwZT4gU29sdmVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlVHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFBsYWluT2JqZWN0PiBCYXNlOworCisgIGV2YWx1YXRvcihjb25zdCBTb2x2ZVR5cGUmIHNvbHZlKQorICAgIDogbV9yZXN1bHQoc29sdmUucm93cygpLCBzb2x2ZS5jb2xzKCkpCisgIHsKKyAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8QmFzZSo+KHRoaXMpKSBCYXNlKG1fcmVzdWx0KTsKKyAgICBtX3Jlc3VsdCA9IHNvbHZlLmd1ZXNzKCk7CisgICAgc29sdmUuZGVjKCkuX3NvbHZlX3dpdGhfZ3Vlc3NfaW1wbChzb2x2ZS5yaHMoKSwgbV9yZXN1bHQpOworICB9CisgIAorcHJvdGVjdGVkOiAgCisgIFBsYWluT2JqZWN0IG1fcmVzdWx0OworfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yICJkc3QgPSBkZWMuc29sdmVXaXRoR3Vlc3MocmhzKSIKKy8vIE5PVEUgd2UgbmVlZCB0byBzcGVjaWFsaXplIGl0IGZvciBEZW5zZTJEZW5zZSB0byBhdm9pZCBhbWJpZ3VvdXMgc3BlY2lhbGl6YXRpb24gZXJyb3IgYW5kIGEgU3BhcnNlMlNwYXJzZSBzcGVjaWFsaXphdGlvbiBtdXN0IGV4aXN0IHNvbWV3aGVyZQordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgRGVjVHlwZSwgdHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgR3Vlc3NUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTb2x2ZVdpdGhHdWVzczxEZWNUeXBlLFJoc1R5cGUsR3Vlc3NUeXBlPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiwgRGVuc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgU29sdmVXaXRoR3Vlc3M8RGVjVHlwZSxSaHNUeXBlLEd1ZXNzVHlwZT4gU3JjWHByVHlwZTsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+ICYpCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKworICAgIGRzdCA9IHNyYy5ndWVzcygpOworICAgIHNyYy5kZWMoKS5fc29sdmVfd2l0aF9ndWVzc19pbXBsKHNyYy5yaHMoKSwgZHN0LyosIHNyYy5ndWVzcygpKi8pOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lcHNhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TT0xWRVdJVEhHVUVTU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSmFjb2JpL0phY29iaS5oIGIvRWlnZW4vc3JjL0phY29iaS9KYWNvYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzAzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0phY29iaS9KYWNvYmkuaApAQCAtMCwwICsxLDQ0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0pBQ09CSV9ICisjZGVmaW5lIEVJR0VOX0pBQ09CSV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgSmFjb2JpX01vZHVsZQorICAqIFxqYWNvYmlfbW9kdWxlCisgICogXGNsYXNzIEphY29iaVJvdGF0aW9uCisgICogXGJyaWVmIFJvdGF0aW9uIGdpdmVuIGJ5IGEgY29zaW5lLXNpbmUgcGFpci4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIEphY29iaSBvciBHaXZlbnMgcm90YXRpb24uCisgICogVGhpcyBpcyBhIDJEIHJvdGF0aW9uIGluIHRoZSBwbGFuZSBcYyBKIG9mIGFuZ2xlIFxmJCBcdGhldGEgXGYkIGRlZmluZWQgYnkKKyAgKiBpdHMgY29zaW5lIFxjIGMgYW5kIHNpbmUgXGMgcyBhcyBmb2xsb3c6CisgICogXGYkIEogPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IGMgJiBcb3ZlcmxpbmUgcyBcXCAtcyAgJiBcb3ZlcmxpbmUgYyBcZW5ke2FycmF5fSBccmlnaHQgKSBcZiQKKyAgKgorICAqIFlvdSBjYW4gYXBwbHkgdGhlIHJlc3BlY3RpdmUgY291bnRlci1jbG9ja3dpc2Ugcm90YXRpb24gdG8gYSBjb2x1bW4gdmVjdG9yIFxjIHYgYnkKKyAgKiBhcHBseWluZyBpdHMgYWRqb2ludCBvbiB0aGUgbGVmdDogXGYkIHYgPSBKXiogdiBcZiQgdGhhdCB0cmFuc2xhdGVzIHRvIHRoZSBmb2xsb3dpbmcgRWlnZW4gY29kZToKKyAgKiBcY29kZQorICAqIHYuYXBwbHlPblRoZUxlZnQoSi5hZGpvaW50KCkpOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6YXBwbHlPblRoZUxlZnQoKSwgTWF0cml4QmFzZTo6YXBwbHlPblRoZVJpZ2h0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gY2xhc3MgSmFjb2JpUm90YXRpb24KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uLiAqLworICAgIEphY29iaVJvdGF0aW9uKCkge30KKworICAgIC8qKiBDb25zdHJ1Y3QgYSBwbGFuYXIgcm90YXRpb24gZnJvbSBhIGNvc2luZS1zaW5lIHBhaXIgKFxhIGMsIFxjIHMpLiAqLworICAgIEphY29iaVJvdGF0aW9uKGNvbnN0IFNjYWxhciYgYywgY29uc3QgU2NhbGFyJiBzKSA6IG1fYyhjKSwgbV9zKHMpIHt9CisKKyAgICBTY2FsYXImIGMoKSB7IHJldHVybiBtX2M7IH0KKyAgICBTY2FsYXIgYygpIGNvbnN0IHsgcmV0dXJuIG1fYzsgfQorICAgIFNjYWxhciYgcygpIHsgcmV0dXJuIG1fczsgfQorICAgIFNjYWxhciBzKCkgY29uc3QgeyByZXR1cm4gbV9zOyB9CisKKyAgICAvKiogQ29uY2F0ZW5hdGVzIHR3byBwbGFuYXIgcm90YXRpb24gKi8KKyAgICBKYWNvYmlSb3RhdGlvbiBvcGVyYXRvciooY29uc3QgSmFjb2JpUm90YXRpb24mIG90aGVyKQorICAgIHsKKyAgICAgIHVzaW5nIG51bWV4dDo6Y29uajsKKyAgICAgIHJldHVybiBKYWNvYmlSb3RhdGlvbihtX2MgKiBvdGhlci5tX2MgLSBjb25qKG1fcykgKiBvdGhlci5tX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uaihtX2MgKiBjb25qKG90aGVyLm1fcykgKyBjb25qKG1fcykgKiBjb25qKG90aGVyLm1fYykpKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdHJhbnNwb3NlZCB0cmFuc2Zvcm1hdGlvbiAqLworICAgIEphY29iaVJvdGF0aW9uIHRyYW5zcG9zZSgpIGNvbnN0IHsgdXNpbmcgbnVtZXh0Ojpjb25qOyByZXR1cm4gSmFjb2JpUm90YXRpb24obV9jLCAtY29uaihtX3MpKTsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGFkam9pbnQgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBKYWNvYmlSb3RhdGlvbiBhZGpvaW50KCkgY29uc3QgeyB1c2luZyBudW1leHQ6OmNvbmo7IHJldHVybiBKYWNvYmlSb3RhdGlvbihjb25qKG1fYyksIC1tX3MpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGJvb2wgbWFrZUphY29iaShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiwgSW5kZXggcCwgSW5kZXggcSk7CisgICAgYm9vbCBtYWtlSmFjb2JpKGNvbnN0IFJlYWxTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgeik7CisKKyAgICB2b2lkIG1ha2VHaXZlbnMoY29uc3QgU2NhbGFyJiBwLCBjb25zdCBTY2FsYXImIHEsIFNjYWxhciogej0wKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBtYWtlR2l2ZW5zKGNvbnN0IFNjYWxhciYgcCwgY29uc3QgU2NhbGFyJiBxLCBTY2FsYXIqIHosIGludGVybmFsOjp0cnVlX3R5cGUpOworICAgIHZvaWQgbWFrZUdpdmVucyhjb25zdCBTY2FsYXImIHAsIGNvbnN0IFNjYWxhciYgcSwgU2NhbGFyKiB6LCBpbnRlcm5hbDo6ZmFsc2VfdHlwZSk7CisKKyAgICBTY2FsYXIgbV9jLCBtX3M7Cit9OworCisvKiogTWFrZXMgXGMgKnRoaXMgYXMgYSBKYWNvYmkgcm90YXRpb24gXGEgSiBzdWNoIHRoYXQgYXBwbHlpbmcgXGEgSiBvbiBib3RoIHRoZSByaWdodCBhbmQgbGVmdCBzaWRlcyBvZiB0aGUgc2VsZmFkam9pbnQgMngyIG1hdHJpeAorICAqIFxmJCBCID0gXGxlZnQgKCBcYmVnaW57YXJyYXl9e2NjfSB4ICYgeSBcXCBcb3ZlcmxpbmUgeSAmIHogXGVuZHthcnJheX0gXHJpZ2h0IClcZiQgeWllbGRzIGEgZGlhZ29uYWwgbWF0cml4IFxmJCBBID0gSl4qIEIgSiBcZiQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjptYWtlSmFjb2JpKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mLCBJbmRleCwgSW5kZXgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorYm9vbCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+OjptYWtlSmFjb2JpKGNvbnN0IFJlYWxTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgeikKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBSZWFsU2NhbGFyIGRlbm8gPSBSZWFsU2NhbGFyKDIpKmFicyh5KTsKKyAgaWYoZGVubyA8IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpCisgIHsKKyAgICBtX2MgPSBTY2FsYXIoMSk7CisgICAgbV9zID0gU2NhbGFyKDApOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSZWFsU2NhbGFyIHRhdSA9ICh4LXopL2Rlbm87CisgICAgUmVhbFNjYWxhciB3ID0gc3FydChudW1leHQ6OmFiczIodGF1KSArIFJlYWxTY2FsYXIoMSkpOworICAgIFJlYWxTY2FsYXIgdDsKKyAgICBpZih0YXU+UmVhbFNjYWxhcigwKSkKKyAgICB7CisgICAgICB0ID0gUmVhbFNjYWxhcigxKSAvICh0YXUgKyB3KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHQgPSBSZWFsU2NhbGFyKDEpIC8gKHRhdSAtIHcpOworICAgIH0KKyAgICBSZWFsU2NhbGFyIHNpZ25fdCA9IHQgPiBSZWFsU2NhbGFyKDApID8gUmVhbFNjYWxhcigxKSA6IFJlYWxTY2FsYXIoLTEpOworICAgIFJlYWxTY2FsYXIgbiA9IFJlYWxTY2FsYXIoMSkgLyBzcXJ0KG51bWV4dDo6YWJzMih0KStSZWFsU2NhbGFyKDEpKTsKKyAgICBtX3MgPSAtIHNpZ25fdCAqIChudW1leHQ6OmNvbmooeSkgLyBhYnMoeSkpICogYWJzKHQpICogbjsKKyAgICBtX2MgPSBuOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8qKiBNYWtlcyBcYyAqdGhpcyBhcyBhIEphY29iaSByb3RhdGlvbiBcYyBKIHN1Y2ggdGhhdCBhcHBseWluZyBcYSBKIG9uIGJvdGggdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGVzIG9mIHRoZSAyeDIgc2VsZmFkam9pbnQgbWF0cml4CisgICogXGYkIEIgPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IFx0ZXh0e3RoaXN9X3twcH0gJiBcdGV4dHt0aGlzfV97cHF9IFxcIChcdGV4dHt0aGlzfV97cHF9KV4qICYgXHRleHR7dGhpc31fe3FxfSBcZW5ke2FycmF5fSBccmlnaHQgKVxmJCB5aWVsZHMKKyAgKiBhIGRpYWdvbmFsIG1hdHJpeCBcZiQgQSA9IEpeKiBCIEogXGYkCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBKYWNvYmlfbWFrZUphY29iaS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBKYWNvYmlfbWFrZUphY29iaS5vdXQKKyAgKgorICAqIFxzYSBKYWNvYmlSb3RhdGlvbjo6bWFrZUphY29iaShSZWFsU2NhbGFyLCBTY2FsYXIsIFJlYWxTY2FsYXIpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBib29sIEphY29iaVJvdGF0aW9uPFNjYWxhcj46Om1ha2VKYWNvYmkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSwgSW5kZXggcCwgSW5kZXggcSkKK3sKKyAgcmV0dXJuIG1ha2VKYWNvYmkobnVtZXh0OjpyZWFsKG0uY29lZmYocCxwKSksIG0uY29lZmYocCxxKSwgbnVtZXh0OjpyZWFsKG0uY29lZmYocSxxKSkpOworfQorCisvKiogTWFrZXMgXGMgKnRoaXMgYXMgYSBHaXZlbnMgcm90YXRpb24gXGMgRyBzdWNoIHRoYXQgYXBwbHlpbmcgXGYkIEdeKiBcZiQgdG8gdGhlIGxlZnQgb2YgdGhlIHZlY3RvcgorICAqIFxmJCBWID0gXGxlZnQgKCBcYmVnaW57YXJyYXl9e2N9IHAgXFwgcSBcZW5ke2FycmF5fSBccmlnaHQgKVxmJCB5aWVsZHM6CisgICogXGYkIEdeKiBWID0gXGxlZnQgKCBcYmVnaW57YXJyYXl9e2N9IHIgXFwgMCBcZW5ke2FycmF5fSBccmlnaHQgKVxmJC4KKyAgKgorICAqIFRoZSB2YWx1ZSBvZiBcYSB6IGlzIHJldHVybmVkIGlmIFxhIHogaXMgbm90IG51bGwgKHRoZSBkZWZhdWx0IGlzIG51bGwpLgorICAqIEFsc28gbm90ZSB0aGF0IEcgaXMgYnVpbHQgc3VjaCB0aGF0IHRoZSBjb3NpbmUgaXMgYWx3YXlzIHJlYWwuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBKYWNvYmlfbWFrZUdpdmVucy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBKYWNvYmlfbWFrZUdpdmVucy5vdXQKKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgY29udGludW91cyBHaXZlbnMgcm90YXRpb24gZ2VuZXJhdGlvbiBhbGdvcml0aG0KKyAgKiBmb3VuZCBpbiBBbmRlcnNvbiAoMjAwMCksIERpc2NvbnRpbnVvdXMgUGxhbmUgUm90YXRpb25zIGFuZCB0aGUgU3ltbWV0cmljIEVpZ2VudmFsdWUgUHJvYmxlbS4KKyAgKiBMQVBBQ0sgV29ya2luZyBOb3RlIDE1MCwgVW5pdmVyc2l0eSBvZiBUZW5uZXNzZWUsIFVULUNTLTAwLTQ1NCwgRGVjZW1iZXIgNCwgMjAwMC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+OjptYWtlR2l2ZW5zKGNvbnN0IFNjYWxhciYgcCwgY29uc3QgU2NhbGFyJiBxLCBTY2FsYXIqIHopCit7CisgIG1ha2VHaXZlbnMocCwgcSwgeiwgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsIGludGVybmFsOjp0cnVlX3R5cGUsIGludGVybmFsOjpmYWxzZV90eXBlPjo6dHlwZSgpKTsKK30KKworCisvLyBzcGVjaWFsaXphdGlvbiBmb3IgY29tcGxleGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIEphY29iaVJvdGF0aW9uPFNjYWxhcj46Om1ha2VHaXZlbnMoY29uc3QgU2NhbGFyJiBwLCBjb25zdCBTY2FsYXImIHEsIFNjYWxhciogciwgaW50ZXJuYWw6OnRydWVfdHlwZSkKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgbnVtZXh0Ojpjb25qOworICAKKyAgaWYocT09U2NhbGFyKDApKQorICB7CisgICAgbV9jID0gbnVtZXh0OjpyZWFsKHApPDAgPyBTY2FsYXIoLTEpIDogU2NhbGFyKDEpOworICAgIG1fcyA9IDA7CisgICAgaWYocikgKnIgPSBtX2MgKiBwOworICB9CisgIGVsc2UgaWYocD09U2NhbGFyKDApKQorICB7CisgICAgbV9jID0gMDsKKyAgICBtX3MgPSAtcS9hYnMocSk7CisgICAgaWYocikgKnIgPSBhYnMocSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgUmVhbFNjYWxhciBwMSA9IG51bWV4dDo6bm9ybTEocCk7CisgICAgUmVhbFNjYWxhciBxMSA9IG51bWV4dDo6bm9ybTEocSk7CisgICAgaWYocDE+PXExKQorICAgIHsKKyAgICAgIFNjYWxhciBwcyA9IHAgLyBwMTsKKyAgICAgIFJlYWxTY2FsYXIgcDIgPSBudW1leHQ6OmFiczIocHMpOworICAgICAgU2NhbGFyIHFzID0gcSAvIHAxOworICAgICAgUmVhbFNjYWxhciBxMiA9IG51bWV4dDo6YWJzMihxcyk7CisKKyAgICAgIFJlYWxTY2FsYXIgdSA9IHNxcnQoUmVhbFNjYWxhcigxKSArIHEyL3AyKTsKKyAgICAgIGlmKG51bWV4dDo6cmVhbChwKTxSZWFsU2NhbGFyKDApKQorICAgICAgICB1ID0gLXU7CisKKyAgICAgIG1fYyA9IFNjYWxhcigxKS91OworICAgICAgbV9zID0gLXFzKmNvbmoocHMpKihtX2MvcDIpOworICAgICAgaWYocikgKnIgPSBwICogdTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNjYWxhciBwcyA9IHAgLyBxMTsKKyAgICAgIFJlYWxTY2FsYXIgcDIgPSBudW1leHQ6OmFiczIocHMpOworICAgICAgU2NhbGFyIHFzID0gcSAvIHExOworICAgICAgUmVhbFNjYWxhciBxMiA9IG51bWV4dDo6YWJzMihxcyk7CisKKyAgICAgIFJlYWxTY2FsYXIgdSA9IHExICogc3FydChwMiArIHEyKTsKKyAgICAgIGlmKG51bWV4dDo6cmVhbChwKTxSZWFsU2NhbGFyKDApKQorICAgICAgICB1ID0gLXU7CisKKyAgICAgIHAxID0gYWJzKHApOworICAgICAgcHMgPSBwL3AxOworICAgICAgbV9jID0gcDEvdTsKKyAgICAgIG1fcyA9IC1jb25qKHBzKSAqIChxL3UpOworICAgICAgaWYocikgKnIgPSBwcyAqIHU7CisgICAgfQorICB9Cit9CisKKy8vIHNwZWNpYWxpemF0aW9uIGZvciByZWFscwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+OjptYWtlR2l2ZW5zKGNvbnN0IFNjYWxhciYgcCwgY29uc3QgU2NhbGFyJiBxLCBTY2FsYXIqIHIsIGludGVybmFsOjpmYWxzZV90eXBlKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICBpZihxPT1TY2FsYXIoMCkpCisgIHsKKyAgICBtX2MgPSBwPFNjYWxhcigwKSA/IFNjYWxhcigtMSkgOiBTY2FsYXIoMSk7CisgICAgbV9zID0gU2NhbGFyKDApOworICAgIGlmKHIpICpyID0gYWJzKHApOworICB9CisgIGVsc2UgaWYocD09U2NhbGFyKDApKQorICB7CisgICAgbV9jID0gU2NhbGFyKDApOworICAgIG1fcyA9IHE8U2NhbGFyKDApID8gU2NhbGFyKDEpIDogU2NhbGFyKC0xKTsKKyAgICBpZihyKSAqciA9IGFicyhxKTsKKyAgfQorICBlbHNlIGlmKGFicyhwKSA+IGFicyhxKSkKKyAgeworICAgIFNjYWxhciB0ID0gcS9wOworICAgIFNjYWxhciB1ID0gc3FydChTY2FsYXIoMSkgKyBudW1leHQ6OmFiczIodCkpOworICAgIGlmKHA8U2NhbGFyKDApKQorICAgICAgdSA9IC11OworICAgIG1fYyA9IFNjYWxhcigxKS91OworICAgIG1fcyA9IC10ICogbV9jOworICAgIGlmKHIpICpyID0gcCAqIHU7CisgIH0KKyAgZWxzZQorICB7CisgICAgU2NhbGFyIHQgPSBwL3E7CisgICAgU2NhbGFyIHUgPSBzcXJ0KFNjYWxhcigxKSArIG51bWV4dDo6YWJzMih0KSk7CisgICAgaWYocTxTY2FsYXIoMCkpCisgICAgICB1ID0gLXU7CisgICAgbV9zID0gLVNjYWxhcigxKS91OworICAgIG1fYyA9IC10ICogbV9zOworICAgIGlmKHIpICpyID0gcSAqIHU7CisgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIEltcGxlbWVudGF0aW9uIG9mIE1hdHJpeEJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8qKiBcamFjb2JpX21vZHVsZQorICAqIEFwcGxpZXMgdGhlIGNsb2NrIHdpc2UgMkQgcm90YXRpb24gXGEgaiB0byB0aGUgc2V0IG9mIDJEIHZlY3RvcnMgb2YgY29yZGluYXRlcyBcYSB4IGFuZCBcYSB5OgorICAqIFxmJCBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IHggXFwgeSBcZW5ke2FycmF5fSBccmlnaHQgKSAgPSAgSiBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IHggXFwgeSBcZW5ke2FycmF5fSBccmlnaHQgKSBcZiQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yWCwgdHlwZW5hbWUgVmVjdG9yWSwgdHlwZW5hbWUgT3RoZXJTY2FsYXI+Cit2b2lkIGFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShEZW5zZUJhc2U8VmVjdG9yWD4mIHhwcl94LCBEZW5zZUJhc2U8VmVjdG9yWT4mIHhwcl95LCBjb25zdCBKYWNvYmlSb3RhdGlvbjxPdGhlclNjYWxhcj4mIGopOworfQorCisvKiogXGphY29iaV9tb2R1bGUKKyAgKiBBcHBsaWVzIHRoZSByb3RhdGlvbiBpbiB0aGUgcGxhbmUgXGEgaiB0byB0aGUgcm93cyBcYSBwIGFuZCBcYSBxIG9mIFxjICp0aGlzLCBpLmUuLCBpdCBjb21wdXRlcyBCID0gSiAqIEIsCisgICogd2l0aCBcZiQgQiA9IFxsZWZ0ICggXGJlZ2lue2FycmF5fXtjY30gXHRleHR7KnRoaXMucm93fShwKSBcXCBcdGV4dHsqdGhpcy5yb3d9KHEpIFxlbmR7YXJyYXl9IFxyaWdodCApIFxmJC4KKyAgKgorICAqIFxzYSBjbGFzcyBKYWNvYmlSb3RhdGlvbiwgTWF0cml4QmFzZTo6YXBwbHlPblRoZVJpZ2h0KCksIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyPgoraW5saW5lIHZvaWQgTWF0cml4QmFzZTxEZXJpdmVkPjo6YXBwbHlPblRoZUxlZnQoSW5kZXggcCwgSW5kZXggcSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKQoreworICBSb3dYcHIgeCh0aGlzLT5yb3cocCkpOworICBSb3dYcHIgeSh0aGlzLT5yb3cocSkpOworICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHgsIHksIGopOworfQorCisvKiogXGluZ3JvdXAgSmFjb2JpX01vZHVsZQorICAqIEFwcGxpZXMgdGhlIHJvdGF0aW9uIGluIHRoZSBwbGFuZSBcYSBqIHRvIHRoZSBjb2x1bW5zIFxhIHAgYW5kIFxhIHEgb2YgXGMgKnRoaXMsIGkuZS4sIGl0IGNvbXB1dGVzIEIgPSBCICogSgorICAqIHdpdGggXGYkIEIgPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IFx0ZXh0eyp0aGlzLmNvbH0ocCkgJiBcdGV4dHsqdGhpcy5jb2x9KHEpIFxlbmR7YXJyYXl9IFxyaWdodCApIFxmJC4KKyAgKgorICAqIFxzYSBjbGFzcyBKYWNvYmlSb3RhdGlvbiwgTWF0cml4QmFzZTo6YXBwbHlPblRoZUxlZnQoKSwgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXI+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseU9uVGhlUmlnaHQoSW5kZXggcCwgSW5kZXggcSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKQoreworICBDb2xYcHIgeCh0aGlzLT5jb2wocCkpOworICBDb2xYcHIgeSh0aGlzLT5jb2wocSkpOworICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHgsIHksIGoudHJhbnNwb3NlKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yWCwgdHlwZW5hbWUgVmVjdG9yWSwgdHlwZW5hbWUgT3RoZXJTY2FsYXI+Cit2b2lkIC8qRUlHRU5fRE9OVF9JTkxJTkUqLyBhcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoRGVuc2VCYXNlPFZlY3Rvclg+JiB4cHJfeCwgRGVuc2VCYXNlPFZlY3Rvclk+JiB4cHJfeSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvclg6OlNjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgT3RoZXJQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxPdGhlclNjYWxhcj46OnNpemUKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8T3RoZXJTY2FsYXI+Ojp0eXBlIE90aGVyUGFja2V0OworICBlaWdlbl9hc3NlcnQoeHByX3guc2l6ZSgpID09IHhwcl95LnNpemUoKSk7CisgIEluZGV4IHNpemUgPSB4cHJfeC5zaXplKCk7CisgIEluZGV4IGluY3J4ID0geHByX3guZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7CisgIEluZGV4IGluY3J5ID0geHByX3kuZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7CisKKyAgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCB4ID0gJnhwcl94LmRlcml2ZWQoKS5jb2VmZlJlZigwKTsKKyAgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCB5ID0gJnhwcl95LmRlcml2ZWQoKS5jb2VmZlJlZigwKTsKKyAgCisgIE90aGVyU2NhbGFyIGMgPSBqLmMoKTsKKyAgT3RoZXJTY2FsYXIgcyA9IGoucygpOworICBpZiAoYz09T3RoZXJTY2FsYXIoMSkgJiYgcz09T3RoZXJTY2FsYXIoMCkpCisgICAgcmV0dXJuOworCisgIC8qKiogZHluYW1pYy1zaXplIHZlY3Rvcml6ZWQgcGF0aHMgKioqLworCisgIGlmKFZlY3Rvclg6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgJiYKKyAgICAoVmVjdG9yWDo6RmxhZ3MgJiBWZWN0b3JZOjpGbGFncyAmIFBhY2tldEFjY2Vzc0JpdCkgJiYKKyAgICAoUGFja2V0U2l6ZSA9PSBPdGhlclBhY2tldFNpemUpICYmCisgICAgKChpbmNyeD09MSAmJiBpbmNyeT09MSkgfHwgUGFja2V0U2l6ZSA9PSAxKSkKKyAgeworICAgIC8vIGJvdGggdmVjdG9ycyBhcmUgc2VxdWVudGlhbGx5IHN0b3JlZCBpbiBtZW1vcnkgPT4gdmVjdG9yaXphdGlvbgorICAgIGVudW0geyBQZWVsaW5nID0gMiB9OworCisgICAgSW5kZXggYWxpZ25lZFN0YXJ0ID0gaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZCh5LCBzaXplKTsKKyAgICBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplLWFsaWduZWRTdGFydCkvUGFja2V0U2l6ZSkqUGFja2V0U2l6ZTsKKworICAgIGNvbnN0IE90aGVyUGFja2V0IHBjID0gcHNldDE8T3RoZXJQYWNrZXQ+KGMpOworICAgIGNvbnN0IE90aGVyUGFja2V0IHBzID0gcHNldDE8T3RoZXJQYWNrZXQ+KHMpOworICAgIGNvbmpfaGVscGVyPE90aGVyUGFja2V0LFBhY2tldCxOdW1UcmFpdHM8T3RoZXJTY2FsYXI+OjpJc0NvbXBsZXgsZmFsc2U+IHBjajsKKyAgICBjb25qX2hlbHBlcjxPdGhlclBhY2tldCxQYWNrZXQsZmFsc2UsZmFsc2U+IHBtOworCisgICAgZm9yKEluZGV4IGk9MDsgaTxhbGlnbmVkU3RhcnQ7ICsraSkKKyAgICB7CisgICAgICBTY2FsYXIgeGkgPSB4W2ldOworICAgICAgU2NhbGFyIHlpID0geVtpXTsKKyAgICAgIHhbaV0gPSAgYyAqIHhpICsgbnVtZXh0Ojpjb25qKHMpICogeWk7CisgICAgICB5W2ldID0gLXMgKiB4aSArIG51bWV4dDo6Y29uaihjKSAqIHlpOworICAgIH0KKworICAgIFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgcHggPSB4ICsgYWxpZ25lZFN0YXJ0OworICAgIFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgcHkgPSB5ICsgYWxpZ25lZFN0YXJ0OworCisgICAgaWYoaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZCh4LCBzaXplKT09YWxpZ25lZFN0YXJ0KQorICAgIHsKKyAgICAgIGZvcihJbmRleCBpPWFsaWduZWRTdGFydDsgaTxhbGlnbmVkRW5kOyBpKz1QYWNrZXRTaXplKQorICAgICAgeworICAgICAgICBQYWNrZXQgeGkgPSBwbG9hZDxQYWNrZXQ+KHB4KTsKKyAgICAgICAgUGFja2V0IHlpID0gcGxvYWQ8UGFja2V0PihweSk7CisgICAgICAgIHBzdG9yZShweCwgcGFkZChwbS5wbXVsKHBjLHhpKSxwY2oucG11bChwcyx5aSkpKTsKKyAgICAgICAgcHN0b3JlKHB5LCBwc3ViKHBjai5wbXVsKHBjLHlpKSxwbS5wbXVsKHBzLHhpKSkpOworICAgICAgICBweCArPSBQYWNrZXRTaXplOworICAgICAgICBweSArPSBQYWNrZXRTaXplOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgSW5kZXggcGVlbGluZ0VuZCA9IGFsaWduZWRTdGFydCArICgoc2l6ZS1hbGlnbmVkU3RhcnQpLyhQZWVsaW5nKlBhY2tldFNpemUpKSooUGVlbGluZypQYWNrZXRTaXplKTsKKyAgICAgIGZvcihJbmRleCBpPWFsaWduZWRTdGFydDsgaTxwZWVsaW5nRW5kOyBpKz1QZWVsaW5nKlBhY2tldFNpemUpCisgICAgICB7CisgICAgICAgIFBhY2tldCB4aSAgID0gcGxvYWR1PFBhY2tldD4ocHgpOworICAgICAgICBQYWNrZXQgeGkxICA9IHBsb2FkdTxQYWNrZXQ+KHB4K1BhY2tldFNpemUpOworICAgICAgICBQYWNrZXQgeWkgICA9IHBsb2FkIDxQYWNrZXQ+KHB5KTsKKyAgICAgICAgUGFja2V0IHlpMSAgPSBwbG9hZCA8UGFja2V0PihweStQYWNrZXRTaXplKTsKKyAgICAgICAgcHN0b3JldShweCwgcGFkZChwbS5wbXVsKHBjLHhpKSxwY2oucG11bChwcyx5aSkpKTsKKyAgICAgICAgcHN0b3JldShweCtQYWNrZXRTaXplLCBwYWRkKHBtLnBtdWwocGMseGkxKSxwY2oucG11bChwcyx5aTEpKSk7CisgICAgICAgIHBzdG9yZSAocHksIHBzdWIocGNqLnBtdWwocGMseWkpLHBtLnBtdWwocHMseGkpKSk7CisgICAgICAgIHBzdG9yZSAocHkrUGFja2V0U2l6ZSwgcHN1YihwY2oucG11bChwYyx5aTEpLHBtLnBtdWwocHMseGkxKSkpOworICAgICAgICBweCArPSBQZWVsaW5nKlBhY2tldFNpemU7CisgICAgICAgIHB5ICs9IFBlZWxpbmcqUGFja2V0U2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmKGFsaWduZWRFbmQhPXBlZWxpbmdFbmQpCisgICAgICB7CisgICAgICAgIFBhY2tldCB4aSA9IHBsb2FkdTxQYWNrZXQ+KHgrcGVlbGluZ0VuZCk7CisgICAgICAgIFBhY2tldCB5aSA9IHBsb2FkIDxQYWNrZXQ+KHkrcGVlbGluZ0VuZCk7CisgICAgICAgIHBzdG9yZXUoeCtwZWVsaW5nRW5kLCBwYWRkKHBtLnBtdWwocGMseGkpLHBjai5wbXVsKHBzLHlpKSkpOworICAgICAgICBwc3RvcmUgKHkrcGVlbGluZ0VuZCwgcHN1YihwY2oucG11bChwYyx5aSkscG0ucG11bChwcyx4aSkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoSW5kZXggaT1hbGlnbmVkRW5kOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICBTY2FsYXIgeGkgPSB4W2ldOworICAgICAgU2NhbGFyIHlpID0geVtpXTsKKyAgICAgIHhbaV0gPSAgYyAqIHhpICsgbnVtZXh0Ojpjb25qKHMpICogeWk7CisgICAgICB5W2ldID0gLXMgKiB4aSArIG51bWV4dDo6Y29uaihjKSAqIHlpOworICAgIH0KKyAgfQorCisgIC8qKiogZml4ZWQtc2l6ZSB2ZWN0b3JpemVkIHBhdGggKioqLworICBlbHNlIGlmKFZlY3Rvclg6OlNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYKKyAgICAgICAgICAoVmVjdG9yWDo6RmxhZ3MgJiBWZWN0b3JZOjpGbGFncyAmIFBhY2tldEFjY2Vzc0JpdCkgJiYKKyAgICAgICAgICAoUGFja2V0U2l6ZSA9PSBPdGhlclBhY2tldFNpemUpICYmCisgICAgICAgICAgKEVJR0VOX1BMQUlOX0VOVU1fTUlOKGV2YWx1YXRvcjxWZWN0b3JYPjo6QWxpZ25tZW50LCBldmFsdWF0b3I8VmVjdG9yWT46OkFsaWdubWVudCk+MCkpIC8vIEZJWE1FIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50CisgIHsKKyAgICBjb25zdCBPdGhlclBhY2tldCBwYyA9IHBzZXQxPE90aGVyUGFja2V0PihjKTsKKyAgICBjb25zdCBPdGhlclBhY2tldCBwcyA9IHBzZXQxPE90aGVyUGFja2V0PihzKTsKKyAgICBjb25qX2hlbHBlcjxPdGhlclBhY2tldCxQYWNrZXQsTnVtVHJhaXRzPE90aGVyUGFja2V0Pjo6SXNDb21wbGV4LGZhbHNlPiBwY2o7CisgICAgY29ual9oZWxwZXI8T3RoZXJQYWNrZXQsUGFja2V0LGZhbHNlLGZhbHNlPiBwbTsKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB4ID0geDsKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB5ID0geTsKKyAgICBmb3IoSW5kZXggaT0wOyBpPHNpemU7IGkrPVBhY2tldFNpemUpCisgICAgeworICAgICAgUGFja2V0IHhpID0gcGxvYWQ8UGFja2V0PihweCk7CisgICAgICBQYWNrZXQgeWkgPSBwbG9hZDxQYWNrZXQ+KHB5KTsKKyAgICAgIHBzdG9yZShweCwgcGFkZChwbS5wbXVsKHBjLHhpKSxwY2oucG11bChwcyx5aSkpKTsKKyAgICAgIHBzdG9yZShweSwgcHN1YihwY2oucG11bChwYyx5aSkscG0ucG11bChwcyx4aSkpKTsKKyAgICAgIHB4ICs9IFBhY2tldFNpemU7CisgICAgICBweSArPSBQYWNrZXRTaXplOworICAgIH0KKyAgfQorCisgIC8qKiogbm9uLXZlY3Rvcml6ZWQgcGF0aCAqKiovCisgIGVsc2UKKyAgeworICAgIGZvcihJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIFNjYWxhciB4aSA9ICp4OworICAgICAgU2NhbGFyIHlpID0gKnk7CisgICAgICAqeCA9ICBjICogeGkgKyBudW1leHQ6OmNvbmoocykgKiB5aTsKKyAgICAgICp5ID0gLXMgKiB4aSArIG51bWV4dDo6Y29uaihjKSAqIHlpOworICAgICAgeCArPSBpbmNyeDsKKyAgICAgIHkgKz0gaW5jcnk7CisgICAgfQorICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvRGV0ZXJtaW5hbnQuaCBiL0VpZ2VuL3NyYy9MVS9EZXRlcm1pbmFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTNjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvTFUvRGV0ZXJtaW5hbnQuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RFVEVSTUlOQU5UX0gKKyNkZWZpbmUgRUlHRU5fREVURVJNSU5BTlRfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgYnJ1dGVmb3JjZV9kZXQzX2hlbHBlcgorKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwgaW50IGEsIGludCBiLCBpbnQgYykKK3sKKyAgcmV0dXJuIG1hdHJpeC5jb2VmZigwLGEpCisgICAgICAgICAqIChtYXRyaXguY29lZmYoMSxiKSAqIG1hdHJpeC5jb2VmZigyLGMpIC0gbWF0cml4LmNvZWZmKDEsYykgKiBtYXRyaXguY29lZmYoMixiKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgYnJ1dGVmb3JjZV9kZXQ0X2hlbHBlcgorKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwgaW50IGosIGludCBrLCBpbnQgbSwgaW50IG4pCit7CisgIHJldHVybiAobWF0cml4LmNvZWZmKGosMCkgKiBtYXRyaXguY29lZmYoaywxKSAtIG1hdHJpeC5jb2VmZihrLDApICogbWF0cml4LmNvZWZmKGosMSkpCisgICAgICAgKiAobWF0cml4LmNvZWZmKG0sMikgKiBtYXRyaXguY29lZmYobiwzKSAtIG1hdHJpeC5jb2VmZihuLDIpICogbWF0cml4LmNvZWZmKG0sMykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLAorICAgICAgICAgaW50IERldGVybWluYW50VHlwZSA9IERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lCis+IHN0cnVjdCBkZXRlcm1pbmFudF9pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG0pCisgIHsKKyAgICBpZihEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyAmJiBtLnJvd3MoKT09MCkKKyAgICAgIHJldHVybiB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhcigxKTsKKyAgICByZXR1cm4gbS5wYXJ0aWFsUGl2THUoKS5kZXRlcm1pbmFudCgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgZGV0ZXJtaW5hbnRfaW1wbDxEZXJpdmVkLCAxPgoreworICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkJiBtKQorICB7CisgICAgcmV0dXJuIG0uY29lZmYoMCwwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IGRldGVybWluYW50X2ltcGw8RGVyaXZlZCwgMj4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBydW4oY29uc3QgRGVyaXZlZCYgbSkKKyAgeworICAgIHJldHVybiBtLmNvZWZmKDAsMCkgKiBtLmNvZWZmKDEsMSkgLSBtLmNvZWZmKDEsMCkgKiBtLmNvZWZmKDAsMSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBkZXRlcm1pbmFudF9pbXBsPERlcml2ZWQsIDM+Cit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG0pCisgIHsKKyAgICByZXR1cm4gYnJ1dGVmb3JjZV9kZXQzX2hlbHBlcihtLDAsMSwyKQorICAgICAgICAgIC0gYnJ1dGVmb3JjZV9kZXQzX2hlbHBlcihtLDEsMCwyKQorICAgICAgICAgICsgYnJ1dGVmb3JjZV9kZXQzX2hlbHBlcihtLDIsMCwxKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IGRldGVybWluYW50X2ltcGw8RGVyaXZlZCwgND4KK3sKKyAgc3RhdGljIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkJiBtKQorICB7CisgICAgLy8gdHJpY2sgYnkgTWFydGluIENvc3RhYmVsIHRvIGNvbXB1dGUgNHg0IGRldCB3aXRoIG9ubHkgMzAgbXVscworICAgIHJldHVybiBicnV0ZWZvcmNlX2RldDRfaGVscGVyKG0sMCwxLDIsMykKKyAgICAgICAgICAtIGJydXRlZm9yY2VfZGV0NF9oZWxwZXIobSwwLDIsMSwzKQorICAgICAgICAgICsgYnJ1dGVmb3JjZV9kZXQ0X2hlbHBlcihtLDAsMywxLDIpCisgICAgICAgICAgKyBicnV0ZWZvcmNlX2RldDRfaGVscGVyKG0sMSwyLDAsMykKKyAgICAgICAgICAtIGJydXRlZm9yY2VfZGV0NF9oZWxwZXIobSwxLDMsMCwyKQorICAgICAgICAgICsgYnJ1dGVmb3JjZV9kZXQ0X2hlbHBlcihtLDIsMywwLDEpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIFxyZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGlzIG1hdHJpeAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgTWF0cml4QmFzZTxEZXJpdmVkPjo6ZGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPERlcml2ZWQsQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU+Ojp0eXBlIE5lc3RlZDsKKyAgcmV0dXJuIGludGVybmFsOjpkZXRlcm1pbmFudF9pbXBsPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE5lc3RlZD46OnR5cGU+OjpydW4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERVRFUk1JTkFOVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvRnVsbFBpdkxVLmggYi9FaWdlbi9zcmMvTFUvRnVsbFBpdkxVLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiNmFmNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9GdWxsUGl2TFUuaApAQCAtMCwwICsxLDg5MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTFVfSAorI2RlZmluZSBFSUdFTl9MVV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gc3RydWN0IHRyYWl0czxGdWxsUGl2TFU8X01hdHJpeFR5cGU+ID4KKyA6IHRyYWl0czxfTWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgdHlwZWRlZiBTb2x2ZXJTdG9yYWdlIFN0b3JhZ2VLaW5kOworICBlbnVtIHsgRmxhZ3MgPSAwIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIExVX01vZHVsZQorICAqCisgICogXGNsYXNzIEZ1bGxQaXZMVQorICAqCisgICogXGJyaWVmIExVIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXggd2l0aCBjb21wbGV0ZSBwaXZvdGluZywgYW5kIHJlbGF0ZWQgZmVhdHVyZXMKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBMVSBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBMVSBkZWNvbXBvc2l0aW9uIG9mIGFueSBtYXRyaXgsIHdpdGggY29tcGxldGUgcGl2b3Rpbmc6IHRoZSBtYXRyaXggQSBpcworICAqIGRlY29tcG9zZWQgYXMgXGYkIEEgPSBQXnstMX0gTCBVIFFeey0xfSBcZiQgd2hlcmUgTCBpcyB1bml0LWxvd2VyLXRyaWFuZ3VsYXIsIFUgaXMKKyAgKiB1cHBlci10cmlhbmd1bGFyLCBhbmQgUCBhbmQgUSBhcmUgcGVybXV0YXRpb24gbWF0cmljZXMuIFRoaXMgaXMgYSByYW5rLXJldmVhbGluZyBMVQorICAqIGRlY29tcG9zaXRpb24uIFRoZSBlaWdlbnZhbHVlcyAoZGlhZ29uYWwgY29lZmZpY2llbnRzKSBvZiBVIGFyZSBzb3J0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGFueQorICAqIHplcm9zIGFyZSBhdCB0aGUgZW5kLgorICAqCisgICogVGhpcyBkZWNvbXBvc2l0aW9uIHByb3ZpZGVzIHRoZSBnZW5lcmljIGFwcHJvYWNoIHRvIHNvbHZpbmcgc3lzdGVtcyBvZiBsaW5lYXIgZXF1YXRpb25zLCBjb21wdXRpbmcKKyAgKiB0aGUgcmFuaywgaW52ZXJ0aWJpbGl0eSwgaW52ZXJzZSwga2VybmVsLCBhbmQgZGV0ZXJtaW5hbnQuCisgICoKKyAgKiBUaGlzIExVIGRlY29tcG9zaXRpb24gaXMgdmVyeSBzdGFibGUgYW5kIHdlbGwgdGVzdGVkIHdpdGggbGFyZ2UgbWF0cmljZXMuIEhvd2V2ZXIgdGhlcmUgYXJlIHVzZSBjYXNlcyB3aGVyZSB0aGUgU1ZECisgICogZGVjb21wb3NpdGlvbiBpcyBpbmhlcmVudGx5IG1vcmUgc3RhYmxlIGFuZC9vciBmbGV4aWJsZS4gRm9yIGV4YW1wbGUsIHdoZW4gY29tcHV0aW5nIHRoZSBrZXJuZWwgb2YgYSBtYXRyaXgsCisgICogd29ya2luZyB3aXRoIHRoZSBTVkQgYWxsb3dzIHRvIHNlbGVjdCB0aGUgc21hbGxlc3Qgc2luZ3VsYXIgdmFsdWVzIG9mIHRoZSBtYXRyaXgsIHNvbWV0aGluZyB0aGF0CisgICogdGhlIExVIGRlY29tcG9zaXRpb24gZG9lc24ndCBzZWUuCisgICoKKyAgKiBUaGUgZGF0YSBvZiB0aGUgTFUgZGVjb21wb3NpdGlvbiBjYW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbWV0aG9kcyBtYXRyaXhMVSgpLAorICAqIHBlcm11dGF0aW9uUCgpLCBwZXJtdXRhdGlvblEoKS4KKyAgKgorICAqIEFzIGFuIGV4ZW1wbGUsIGhlcmUgaXMgaG93IHRoZSBvcmlnaW5hbCBtYXRyaXggY2FuIGJlIHJldHJpZXZlZDoKKyAgKiBcaW5jbHVkZSBjbGFzc19GdWxsUGl2TFUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgY2xhc3NfRnVsbFBpdkxVLm91dAorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIG1lY2hhbmlzbS4KKyAgKiAKKyAgKiBcc2EgTWF0cml4QmFzZTo6ZnVsbFBpdkx1KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmludmVyc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIEZ1bGxQaXZMVQorICA6IHB1YmxpYyBTb2x2ZXJCYXNlPEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgU29sdmVyQmFzZTxGdWxsUGl2TFU+IEJhc2U7CisKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoRnVsbFBpdkxVKQorICAgIC8vIEZJWE1FIFN0b3JhZ2VJbmRleCBkZWZpbmVkIGluIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRSBzaG91bGQgYmUgaW50CisgICAgZW51bSB7CisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZSwgU3RvcmFnZUluZGV4Pjo6dHlwZSBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIFN0b3JhZ2VJbmRleD46OnR5cGUgSW50Q29sVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PENvbHNBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25RVHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25QVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworCisgICAgLyoqCisgICAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBMVTo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgICAqLworICAgIEZ1bGxQaXZMVSgpOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICAgICogXHNhIEZ1bGxQaXZMVSgpCisgICAgICAqLworICAgIEZ1bGxQaXZMVShJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKworICAgIC8qKiBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IG9mIHdoaWNoIHRvIGNvbXB1dGUgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqICAgICAgICAgICAgICAgSXQgaXMgcmVxdWlyZWQgdG8gYmUgbm9uemVyby4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIGV4cGxpY2l0IEZ1bGxQaXZMVShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KTsKKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIExVIGZhY3Rvcml6YXRpb24gZnJvbSBhIGdpdmVuIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGlzIG92ZXJsb2FkZWQgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgZm9yIFxsaW5rIElucGxhY2VEZWNvbXBvc2l0aW9uIGlucGxhY2UgZGVjb21wb3NpdGlvbiBcZW5kbGluayB3aGVuIFxjIE1hdHJpeFR5cGUgaXMgYSBFaWdlbjo6UmVmLgorICAgICAgKgorICAgICAgKiBcc2EgRnVsbFBpdkxVKGNvbnN0IEVpZ2VuQmFzZSYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBGdWxsUGl2TFUoRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCk7CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIExVIGRlY29tcG9zaXRpb24gb2YgdGhlIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IG9mIHdoaWNoIHRvIGNvbXB1dGUgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqICAgICAgICAgICAgICAgSXQgaXMgcmVxdWlyZWQgdG8gYmUgbm9uemVyby4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIEZ1bGxQaXZMVSYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KSB7CisgICAgICBtX2x1ID0gbWF0cml4LmRlcml2ZWQoKTsKKyAgICAgIGNvbXB1dGVJblBsYWNlKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBMVSBkZWNvbXBvc2l0aW9uIG1hdHJpeDogdGhlIHVwcGVyLXRyaWFuZ3VsYXIgcGFydCBpcyBVLCB0aGUKKyAgICAgICogdW5pdC1sb3dlci10cmlhbmd1bGFyIHBhcnQgaXMgTCAoYXQgbGVhc3QgZm9yIHNxdWFyZSBtYXRyaWNlczsgaW4gdGhlIG5vbi1zcXVhcmUKKyAgICAgICogY2FzZSwgc3BlY2lhbCBjYXJlIGlzIG5lZWRlZCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIEZ1bGxQaXZMVSkuCisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhMKCksIG1hdHJpeFUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4TFUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2x1OworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbnplcm8gcGl2b3RzIGluIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKiBIZXJlIG5vbnplcm8gaXMgbWVhbnQgaW4gdGhlIGV4YWN0IHNlbnNlLCBub3QgaW4gYSBmdXp6eSBzZW5zZS4KKyAgICAgICogU28gdGhhdCBub3Rpb24gaXNuJ3QgcmVhbGx5IGludHJpbnNpY2FsbHkgaW50ZXJlc3RpbmcsIGJ1dCBpdCBpcworICAgICAgKiBzdGlsbCB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgYWxnb3JpdGhtcy4KKyAgICAgICoKKyAgICAgICogXHNhIHJhbmsoKQorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggbm9uemVyb1Bpdm90cygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbm9uemVyb19waXZvdHM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYmlnZ2VzdCBwaXZvdCwgaS5lLiB0aGUgYmlnZ2VzdAorICAgICAgKiAgICAgICAgICBkaWFnb25hbCBjb2VmZmljaWVudCBvZiBVLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIG1heFBpdm90KCkgY29uc3QgeyByZXR1cm4gbV9tYXhwaXZvdDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBtYXRyaXggUAorICAgICAgKgorICAgICAgKiBcc2EgcGVybXV0YXRpb25RKCkKKyAgICAgICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFBlcm11dGF0aW9uUFR5cGUmIHBlcm11dGF0aW9uUCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fcDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBlcm11dGF0aW9uIG1hdHJpeCBRCisgICAgICAqCisgICAgICAqIFxzYSBwZXJtdXRhdGlvblAoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUGVybXV0YXRpb25RVHlwZSYgcGVybXV0YXRpb25RKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9xOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUga2VybmVsIG9mIHRoZSBtYXRyaXgsIGFsc28gY2FsbGVkIGl0cyBudWxsLXNwYWNlLiBUaGUgY29sdW1ucyBvZiB0aGUgcmV0dXJuZWQgbWF0cml4CisgICAgICAqIHdpbGwgZm9ybSBhIGJhc2lzIG9mIHRoZSBrZXJuZWwuCisgICAgICAqCisgICAgICAqIFxub3RlIElmIHRoZSBrZXJuZWwgaGFzIGRpbWVuc2lvbiB6ZXJvLCB0aGVuIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYSBjb2x1bW4tdmVjdG9yIGZpbGxlZCB3aXRoIHplcm9zLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgRnVsbFBpdkxVX2tlcm5lbC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRnVsbFBpdkxVX2tlcm5lbC5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGltYWdlKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjprZXJuZWxfcmV0dmFsPEZ1bGxQaXZMVT4ga2VybmVsKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6Omtlcm5lbF9yZXR2YWw8RnVsbFBpdkxVPigqdGhpcyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbWFnZSBvZiB0aGUgbWF0cml4LCBhbHNvIGNhbGxlZCBpdHMgY29sdW1uLXNwYWNlLiBUaGUgY29sdW1ucyBvZiB0aGUgcmV0dXJuZWQgbWF0cml4CisgICAgICAqIHdpbGwgZm9ybSBhIGJhc2lzIG9mIHRoZSBpbWFnZSAoY29sdW1uLXNwYWNlKS4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG9yaWdpbmFsTWF0cml4IHRoZSBvcmlnaW5hbCBtYXRyaXgsIG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiB3aHkgaXQgaXMgbmVlZGVkIHRvIHBhc3MgaXQgaGVyZSwgaXMgdGhhdCB0aGlzIGFsbG93cworICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYSBsYXJnZSBvcHRpbWl6YXRpb24sIGFzIG90aGVyd2lzZSB0aGlzIG1ldGhvZCB3b3VsZCBuZWVkIHRvIHJlY29uc3RydWN0IGl0CisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGUgaW1hZ2UgaGFzIGRpbWVuc2lvbiB6ZXJvLCB0aGVuIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYSBjb2x1bW4tdmVjdG9yIGZpbGxlZCB3aXRoIHplcm9zLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgRnVsbFBpdkxVX2ltYWdlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBGdWxsUGl2TFVfaW1hZ2Uub3V0CisgICAgICAqCisgICAgICAqIFxzYSBrZXJuZWwoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OmltYWdlX3JldHZhbDxGdWxsUGl2TFU+CisgICAgICBpbWFnZShjb25zdCBNYXRyaXhUeXBlJiBvcmlnaW5hbE1hdHJpeCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmltYWdlX3JldHZhbDxGdWxsUGl2TFU+KCp0aGlzLCBvcmlnaW5hbE1hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm4gYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBBeD1iLCB3aGVyZSBBIGlzIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGVxdWF0aW9uIHRvIHNvbHZlLiBDYW4gYmUgYSB2ZWN0b3Igb3IgYSBtYXRyaXgsCisgICAgICAqICAgICAgICAgIHRoZSBvbmx5IHJlcXVpcmVtZW50IGluIG9yZGVyIGZvciB0aGUgZXF1YXRpb24gdG8gbWFrZSBzZW5zZSBpcyB0aGF0CisgICAgICAqICAgICAgICAgIGIucm93cygpPT1BLnJvd3MoKSwgd2hlcmUgQSBpcyB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHNvbHV0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9jaGVja2luZ19zb2x1dGlvbnMKKyAgICAgICoKKyAgICAgICogXG5vdGVfYWJvdXRfYXJiaXRyYXJ5X2Nob2ljZV9vZl9zb2x1dGlvbgorICAgICAgKiBcbm90ZV9hYm91dF91c2luZ19rZXJuZWxfdG9fc3R1ZHlfbXVsdGlwbGVfc29sdXRpb25zCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEZ1bGxQaXZMVV9zb2x2ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRnVsbFBpdkxVX3NvbHZlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgVHJpYW5ndWxhclZpZXc6OnNvbHZlKCksIGtlcm5lbCgpLCBpbnZlcnNlKCkKKyAgICAgICovCisgICAgLy8gRklYTUUgdGhpcyBpcyBhIGNvcHktcGFzdGUgb2YgdGhlIGJhc2UtY2xhc3MgbWVtYmVyIHRvIGFkZCB0aGUgaXNJbml0aWFsaXplZCBhc3NlcnRpb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBTb2x2ZTxGdWxsUGl2TFUsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFNvbHZlPEZ1bGxQaXZMVSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgcmVjaXByb2NhbCBjb25kaXRpb24gbnVtYmVyIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggXGMgKnRoaXMgaXMKKyAgICAgICAgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqLworICAgIGlubGluZSBSZWFsU2NhbGFyIHJjb25kKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpyY29uZF9lc3RpbWF0ZV9oZWxwZXIobV9sMV9ub3JtLCAqdGhpcyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLiBJdCBoYXMgb25seSBsaW5lYXIgY29tcGxleGl0eQorICAgICAgKiAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNxdWFyZSBtYXRyaXgpCisgICAgICAqIGFzIHRoZSBMVSBkZWNvbXBvc2l0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBcbm90ZSBGb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcyBvZiBzaXplIHVwIHRvIDQsIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkgb2ZmZXJzCisgICAgICAqICAgICAgIG9wdGltaXplZCBwYXRocy4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgYSBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSBiaWcgb3Igc21hbGwsIHNvIGZvciBtYXRyaWNlcworICAgICAgKiBvZiBsYXJnZSBlbm91Z2ggZGltZW5zaW9uLCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIC8qKiBBbGxvd3MgdG8gcHJlc2NyaWJlIGEgdGhyZXNob2xkIHRvIGJlIHVzZWQgYnkgY2VydGFpbiBtZXRob2RzLCBzdWNoIGFzIHJhbmsoKSwKKyAgICAgICogd2hvIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZW4gcGl2b3RzIGFyZSB0byBiZSBjb25zaWRlcmVkIG5vbnplcm8uIFRoaXMgaXMgbm90IHVzZWQgZm9yIHRoZQorICAgICAgKiBMVSBkZWNvbXBvc2l0aW9uIGl0c2VsZi4KKyAgICAgICoKKyAgICAgICogV2hlbiBpdCBuZWVkcyB0byBnZXQgdGhlIHRocmVzaG9sZCB2YWx1ZSwgRWlnZW4gY2FsbHMgdGhyZXNob2xkKCkuIEJ5IGRlZmF1bHQsIHRoaXMKKyAgICAgICogdXNlcyBhIGZvcm11bGEgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgYSByZWFzb25hYmxlIHRocmVzaG9sZC4KKyAgICAgICogT25jZSB5b3UgaGF2ZSBjYWxsZWQgdGhlIHByZXNlbnQgbWV0aG9kIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJiksCisgICAgICAqIHlvdXIgdmFsdWUgaXMgdXNlZCBpbnN0ZWFkLgorICAgICAgKgorICAgICAgKiBccGFyYW0gdGhyZXNob2xkIFRoZSBuZXcgdmFsdWUgdG8gdXNlIGFzIHRoZSB0aHJlc2hvbGQuCisgICAgICAqCisgICAgICAqIEEgcGl2b3Qgd2lsbCBiZSBjb25zaWRlcmVkIG5vbnplcm8gaWYgaXRzIGFic29sdXRlIHZhbHVlIGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbgorICAgICAgKiAgXGYkIFx2ZXJ0IHBpdm90IFx2ZXJ0IFxsZXFzbGFudCB0aHJlc2hvbGQgXHRpbWVzIFx2ZXJ0IG1heHBpdm90IFx2ZXJ0IFxmJAorICAgICAgKiB3aGVyZSBtYXhwaXZvdCBpcyB0aGUgYmlnZ2VzdCBwaXZvdC4KKyAgICAgICoKKyAgICAgICogSWYgeW91IHdhbnQgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBjYWxsIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgICAgICAqLworICAgIEZ1bGxQaXZMVSYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSB0cnVlOworICAgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBBbGxvd3MgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBsZXR0aW5nIEVpZ2VuIHVzZSBpdHMgZGVmYXVsdCBmb3JtdWxhIGZvcgorICAgICAgKiBkZXRlcm1pbmluZyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBZb3Ugc2hvdWxkIHBhc3MgdGhlIHNwZWNpYWwgb2JqZWN0IEVpZ2VuOjpEZWZhdWx0IGFzIHBhcmFtZXRlciBoZXJlLgorICAgICAgKiBcY29kZSBsdS5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgRnVsbFBpdkxVJiBzZXRUaHJlc2hvbGQoRGVmYXVsdF90KQorICAgIHsKKyAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA9IGZhbHNlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB0aHJlc2hvbGQgdGhhdCB3aWxsIGJlIHVzZWQgYnkgY2VydGFpbiBtZXRob2RzIHN1Y2ggYXMgcmFuaygpLgorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgUmVhbFNjYWxhciB0aHJlc2hvbGQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgfHwgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKTsKKyAgICAgIHJldHVybiBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPyBtX3ByZXNjcmliZWRUaHJlc2hvbGQKKyAgICAgIC8vIHRoaXMgZm9ybXVsYSBjb21lcyBmcm9tIGV4cGVyaW1lbnRpbmcgKHNlZSAiTFUgcHJlY2lzaW9uIHR1bmluZyIgdGhyZWFkIG9uIHRoZSBsaXN0KQorICAgICAgLy8gYW5kIHR1cm5zIG91dCB0byBiZSBpZGVudGljYWwgdG8gSGlnaGFtJ3MgZm9ybXVsYSB1c2VkIGFscmVhZHkgaW4gTERMdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogbV9sdS5kaWFnb25hbFNpemUoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHJhbmsgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBJbmRleCByYW5rKCkgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIFJlYWxTY2FsYXIgcHJlbXVsdGlwbGllZF90aHJlc2hvbGQgPSBhYnMobV9tYXhwaXZvdCkgKiB0aHJlc2hvbGQoKTsKKyAgICAgIEluZGV4IHJlc3VsdCA9IDA7CisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtX25vbnplcm9fcGl2b3RzOyArK2kpCisgICAgICAgIHJlc3VsdCArPSAoYWJzKG1fbHUuY29lZmYoaSxpKSkgPiBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZGltZW5zaW9uIG9mIHRoZSBrZXJuZWwgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBkaW1lbnNpb25PZktlcm5lbCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGNvbHMoKSAtIHJhbmsoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uIHJlcHJlc2VudHMgYW4gaW5qZWN0aXZlCisgICAgICAqICAgICAgICAgIGxpbmVhciBtYXAsIGkuZS4gaGFzIHRyaXZpYWwga2VybmVsOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0luamVjdGl2ZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIHJhbmsoKSA9PSBjb2xzKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbiByZXByZXNlbnRzIGEgc3VyamVjdGl2ZQorICAgICAgKiAgICAgICAgICBsaW5lYXIgbWFwOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1N1cmplY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiByYW5rKCkgPT0gcm93cygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24gaXMgaW52ZXJ0aWJsZS4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBib29sIGlzSW52ZXJ0aWJsZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGlzSW5qZWN0aXZlKCkgJiYgKG1fbHUucm93cygpID09IG1fbHUuY29scygpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgSWYgdGhpcyBtYXRyaXggaXMgbm90IGludmVydGlibGUsIHRoZSByZXR1cm5lZCBtYXRyaXggaGFzIHVuZGVmaW5lZCBjb2VmZmljaWVudHMuCisgICAgICAqICAgICAgIFVzZSBpc0ludmVydGlibGUoKSB0byBmaXJzdCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIG1hdHJpeCBpcyBpbnZlcnRpYmxlLgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6aW52ZXJzZSgpCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBJbnZlcnNlPEZ1bGxQaXZMVT4gaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fbHUucm93cygpID09IG1fbHUuY29scygpICYmICJZb3UgY2FuJ3QgdGFrZSB0aGUgaW52ZXJzZSBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICAgICAgcmV0dXJuIEludmVyc2U8RnVsbFBpdkxVPigqdGhpcyk7CisgICAgfQorCisgICAgTWF0cml4VHlwZSByZWNvbnN0cnVjdGVkTWF0cml4KCkgY29uc3Q7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbHUucm93cygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2x1LmNvbHMoKTsgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFJoc1R5cGUgJnJocywgRHN0VHlwZSAmZHN0KSBjb25zdDsKKworICAgIHRlbXBsYXRlPGJvb2wgQ29uanVnYXRlLCB0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBfc29sdmVfaW1wbF90cmFuc3Bvc2VkKGNvbnN0IFJoc1R5cGUgJnJocywgRHN0VHlwZSAmZHN0KSBjb25zdDsKKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFNjYWxhcik7CisgICAgfQorCisgICAgdm9pZCBjb21wdXRlSW5QbGFjZSgpOworCisgICAgTWF0cml4VHlwZSBtX2x1OworICAgIFBlcm11dGF0aW9uUFR5cGUgbV9wOworICAgIFBlcm11dGF0aW9uUVR5cGUgbV9xOworICAgIEludENvbFZlY3RvclR5cGUgbV9yb3dzVHJhbnNwb3NpdGlvbnM7CisgICAgSW50Um93VmVjdG9yVHlwZSBtX2NvbHNUcmFuc3Bvc2l0aW9uczsKKyAgICBJbmRleCBtX25vbnplcm9fcGl2b3RzOworICAgIFJlYWxTY2FsYXIgbV9sMV9ub3JtOworICAgIFJlYWxTY2FsYXIgbV9tYXhwaXZvdCwgbV9wcmVzY3JpYmVkVGhyZXNob2xkOworICAgIHNpZ25lZCBjaGFyIG1fZGV0X3BxOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkLCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRnVsbFBpdkxVPE1hdHJpeFR5cGU+OjpGdWxsUGl2TFUoKQorICA6IG1faXNJbml0aWFsaXplZChmYWxzZSksIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKK3sKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0Z1bGxQaXZMVTxNYXRyaXhUeXBlPjo6RnVsbFBpdkxVKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgIDogbV9sdShyb3dzLCBjb2xzKSwKKyAgICBtX3Aocm93cyksCisgICAgbV9xKGNvbHMpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKHJvd3MpLAorICAgIG1fY29sc1RyYW5zcG9zaXRpb25zKGNvbHMpLAorICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorRnVsbFBpdkxVPE1hdHJpeFR5cGU+OjpGdWxsUGl2TFUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgOiBtX2x1KG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgIG1fcChtYXRyaXgucm93cygpKSwKKyAgICBtX3EobWF0cml4LmNvbHMoKSksCisgICAgbV9yb3dzVHJhbnNwb3NpdGlvbnMobWF0cml4LnJvd3MoKSksCisgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMobWF0cml4LmNvbHMoKSksCisgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQoZmFsc2UpCit7CisgIGNvbXB1dGUobWF0cml4LmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CitGdWxsUGl2TFU8TWF0cml4VHlwZT46OkZ1bGxQaXZMVShFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICA6IG1fbHUobWF0cml4LmRlcml2ZWQoKSksCisgICAgbV9wKG1hdHJpeC5yb3dzKCkpLAorICAgIG1fcShtYXRyaXguY29scygpKSwKKyAgICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucyhtYXRyaXgucm93cygpKSwKKyAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucyhtYXRyaXguY29scygpKSwKKyAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKK3sKKyAgY29tcHV0ZUluUGxhY2UoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgRnVsbFBpdkxVPE1hdHJpeFR5cGU+Ojpjb21wdXRlSW5QbGFjZSgpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKworICAvLyB0aGUgcGVybXV0YXRpb25zIGFyZSBzdG9yZWQgYXMgaW50IGluZGljZXMsIHNvIGp1c3QgdG8gYmUgc3VyZToKKyAgZWlnZW5fYXNzZXJ0KG1fbHUucm93cygpPD1OdW1UcmFpdHM8aW50Pjo6aGlnaGVzdCgpICYmIG1fbHUuY29scygpPD1OdW1UcmFpdHM8aW50Pjo6aGlnaGVzdCgpKTsKKworICBtX2wxX25vcm0gPSBtX2x1LmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CisKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbHUuZGlhZ29uYWxTaXplKCk7CisgIGNvbnN0IEluZGV4IHJvd3MgPSBtX2x1LnJvd3MoKTsKKyAgY29uc3QgSW5kZXggY29scyA9IG1fbHUuY29scygpOworCisgIC8vIHdpbGwgc3RvcmUgdGhlIHRyYW5zcG9zaXRpb25zLCBiZWZvcmUgd2UgYWNjdW11bGF0ZSB0aGVtIGF0IHRoZSBlbmQuCisgIC8vIGNhbid0IGFjY3VtdWxhdGUgb24tdGhlLWZseSBiZWNhdXNlIHRoYXQgd2lsbCBiZSBkb25lIGluIHJldmVyc2Ugb3JkZXIgZm9yIHRoZSByb3dzLgorICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucy5yZXNpemUobV9sdS5yb3dzKCkpOworICBtX2NvbHNUcmFuc3Bvc2l0aW9ucy5yZXNpemUobV9sdS5jb2xzKCkpOworICBJbmRleCBudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMgPSAwOyAvLyBudW1iZXIgb2YgTk9OVFJJVklBTCB0cmFuc3Bvc2l0aW9ucywgaS5lLiBtX3Jvd3NUcmFuc3Bvc2l0aW9uc1tpXSE9aQorCisgIG1fbm9uemVyb19waXZvdHMgPSBzaXplOyAvLyB0aGUgZ2VuZXJpYyBjYXNlIGlzIHRoYXQgaW4gd2hpY2ggYWxsIHBpdm90cyBhcmUgbm9uemVybyAoaW52ZXJ0aWJsZSBjYXNlKQorICBtX21heHBpdm90ID0gUmVhbFNjYWxhcigwKTsKKworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgIHsKKyAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBmaW5kIHRoZSBwaXZvdC4KKworICAgIC8vIGJpZ2dlc3QgY29lZmZpY2llbnQgaW4gdGhlIHJlbWFpbmluZyBib3R0b20tcmlnaHQgY29ybmVyIChzdGFydGluZyBhdCByb3cgaywgY29sIGspCisgICAgSW5kZXggcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyLCBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6c2NhbGFyX3Njb3JlX2NvZWZmX29wPFNjYWxhcj4gU2NvcmluZzsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNjb3Jpbmc6OnJlc3VsdF90eXBlIFNjb3JlOworICAgIFNjb3JlIGJpZ2dlc3RfaW5fY29ybmVyOworICAgIGJpZ2dlc3RfaW5fY29ybmVyID0gbV9sdS5ib3R0b21SaWdodENvcm5lcihyb3dzLWssIGNvbHMtaykKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bmFyeUV4cHIoU2NvcmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1heENvZWZmKCZyb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsICZjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpOworICAgIHJvd19vZl9iaWdnZXN0X2luX2Nvcm5lciArPSBrOyAvLyBjb3JyZWN0IHRoZSB2YWx1ZXMhIHNpbmNlIHRoZXkgd2VyZSBjb21wdXRlZCBpbiB0aGUgY29ybmVyLAorICAgIGNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lciArPSBrOyAvLyBuZWVkIHRvIGFkZCBrIHRvIHRoZW0uCisKKyAgICBpZihiaWdnZXN0X2luX2Nvcm5lcj09U2NvcmUoMCkpCisgICAgeworICAgICAgLy8gYmVmb3JlIGV4aXRpbmcsIG1ha2Ugc3VyZSB0byBpbml0aWFsaXplIHRoZSBzdGlsbCB1bmluaXRpYWxpemVkIHRyYW5zcG9zaXRpb25zCisgICAgICAvLyBpbiBhIHNhbmUgc3RhdGUgd2l0aG91dCBkZXN0cm95aW5nIHdoYXQgd2UgYWxyZWFkeSBoYXZlLgorICAgICAgbV9ub256ZXJvX3Bpdm90cyA9IGs7CisgICAgICBmb3IoSW5kZXggaSA9IGs7IGkgPCBzaXplOyArK2kpCisgICAgICB7CisgICAgICAgIG1fcm93c1RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGkpID0gaTsKKyAgICAgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUmVhbFNjYWxhciBhYnNfcGl2b3QgPSBpbnRlcm5hbDo6YWJzX2tub3dpbmdfc2NvcmU8U2NhbGFyPigpKG1fbHUocm93X29mX2JpZ2dlc3RfaW5fY29ybmVyLCBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpLCBiaWdnZXN0X2luX2Nvcm5lcik7CisgICAgaWYoYWJzX3Bpdm90ID4gbV9tYXhwaXZvdCkgbV9tYXhwaXZvdCA9IGFic19waXZvdDsKKworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGZvdW5kIHRoZSBwaXZvdCwgd2UgbmVlZCB0byBhcHBseSB0aGUgcm93L2NvbCBzd2FwcyB0bworICAgIC8vIGJyaW5nIGl0IHRvIHRoZSBsb2NhdGlvbiAoayxrKS4KKworICAgIG1fcm93c1RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGspID0gcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgIG1fY29sc1RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGspID0gY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgIGlmKGsgIT0gcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyKSB7CisgICAgICBtX2x1LnJvdyhrKS5zd2FwKG1fbHUucm93KHJvd19vZl9iaWdnZXN0X2luX2Nvcm5lcikpOworICAgICAgKytudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnM7CisgICAgfQorICAgIGlmKGsgIT0gY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyKSB7CisgICAgICBtX2x1LmNvbChrKS5zd2FwKG1fbHUuY29sKGNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lcikpOworICAgICAgKytudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgdGhlIHBpdm90IGlzIGF0IHRoZSByaWdodCBsb2NhdGlvbiwgd2UgdXBkYXRlIHRoZSByZW1haW5pbmcKKyAgICAvLyBib3R0b20tcmlnaHQgY29ybmVyIGJ5IEdhdXNzaWFuIGVsaW1pbmF0aW9uLgorCisgICAgaWYoazxyb3dzLTEpCisgICAgICBtX2x1LmNvbChrKS50YWlsKHJvd3Mtay0xKSAvPSBtX2x1LmNvZWZmKGssayk7CisgICAgaWYoazxzaXplLTEpCisgICAgICBtX2x1LmJsb2NrKGsrMSxrKzEscm93cy1rLTEsY29scy1rLTEpLm5vYWxpYXMoKSAtPSBtX2x1LmNvbChrKS50YWlsKHJvd3Mtay0xKSAqIG1fbHUucm93KGspLnRhaWwoY29scy1rLTEpOworICB9CisKKyAgLy8gdGhlIG1haW4gbG9vcCBpcyBvdmVyLCB3ZSBzdGlsbCBoYXZlIHRvIGFjY3VtdWxhdGUgdGhlIHRyYW5zcG9zaXRpb25zIHRvIGZpbmQgdGhlCisgIC8vIHBlcm11dGF0aW9ucyBQIGFuZCBRCisKKyAgbV9wLnNldElkZW50aXR5KHJvd3MpOworICBmb3IoSW5kZXggayA9IHNpemUtMTsgayA+PSAwOyAtLWspCisgICAgbV9wLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoaywgbV9yb3dzVHJhbnNwb3NpdGlvbnMuY29lZmYoaykpOworCisgIG1fcS5zZXRJZGVudGl0eShjb2xzKTsKKyAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICAgIG1fcS5hcHBseVRyYW5zcG9zaXRpb25PblRoZVJpZ2h0KGssIG1fY29sc1RyYW5zcG9zaXRpb25zLmNvZWZmKGspKTsKKworICBtX2RldF9wcSA9IChudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMlMikgPyAtMSA6IDE7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBGdWxsUGl2TFU8TWF0cml4VHlwZT46OmRldGVybWluYW50KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9sdS5yb3dzKCkgPT0gbV9sdS5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gU2NhbGFyKG1fZGV0X3BxKSAqIFNjYWxhcihtX2x1LmRpYWdvbmFsKCkucHJvZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggcmVwcmVzZW50ZWQgYnkgdGhlIGRlY29tcG9zaXRpb24sCisgKiBpLmUuLCBpdCByZXR1cm5zIHRoZSBwcm9kdWN0OiBcZiQgUF57LTF9IEwgVSBRXnstMX0gXGYkLgorICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgZGVidWcgcHVycG9zZXMuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorTWF0cml4VHlwZSBGdWxsUGl2TFU8TWF0cml4VHlwZT46OnJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGNvbnN0IEluZGV4IHNtYWxsZGltID0gKHN0ZDo6bWluKShtX2x1LnJvd3MoKSwgbV9sdS5jb2xzKCkpOworICAvLyBMVQorICBNYXRyaXhUeXBlIHJlcyhtX2x1LnJvd3MoKSxtX2x1LmNvbHMoKSk7CisgIC8vIEZJWE1FIHRoZSAudG9EZW5zZU1hdHJpeCgpIHNob3VsZCBub3QgYmUgbmVlZGVkLi4uCisgIHJlcyA9IG1fbHUubGVmdENvbHMoc21hbGxkaW0pCisgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKQorICAgICAgKiBtX2x1LnRvcFJvd3Moc21hbGxkaW0pCisgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpOworCisgIC8vIFBeey0xfShMVSkKKyAgcmVzID0gbV9wLmludmVyc2UoKSAqIHJlczsKKworICAvLyAoUF57LTF9TFUpUV57LTF9CisgIHJlcyA9IHJlcyAqIG1fcS5pbnZlcnNlKCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKiBJbXBsZW1lbnRhdGlvbiBvZiBrZXJuZWwoKSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorc3RydWN0IGtlcm5lbF9yZXR2YWw8RnVsbFBpdkxVPF9NYXRyaXhUeXBlPiA+CisgIDoga2VybmVsX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4gPgoreworICBFSUdFTl9NQUtFX0tFUk5FTF9IRUxQRVJTKEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4pCisKKyAgZW51bSB7IE1heFNtYWxsRGltQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRCgKKyAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUpCisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgY29uc3QgSW5kZXggY29scyA9IGRlYygpLm1hdHJpeExVKCkuY29scygpLCBkaW1rZXIgPSBjb2xzIC0gcmFuaygpOworICAgIGlmKGRpbWtlciA9PSAwKQorICAgIHsKKyAgICAgIC8vIFRoZSBLZXJuZWwgaXMganVzdCB7MH0sIHNvIGl0IGRvZXNuJ3QgaGF2ZSBhIGJhc2lzIHByb3Blcmx5IHNwZWFraW5nLCBidXQgbGV0J3MKKyAgICAgIC8vIGF2b2lkIGNyYXNoaW5nL2Fzc2VydGluZyBhcyB0aGF0IGRlcGVuZHMgb24gZmxvYXRpbmcgcG9pbnQgY2FsY3VsYXRpb25zLiBMZXQncworICAgICAgLy8ganVzdCByZXR1cm4gYSBzaW5nbGUgY29sdW1uIHZlY3RvciBmaWxsZWQgd2l0aCB6ZXJvcy4KKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogTGV0IHVzIHVzZSB0aGUgZm9sbG93aW5nIGxlbW1hOgorICAgICAgKgorICAgICAgKiBMZW1tYTogSWYgdGhlIG1hdHJpeCBBIGhhcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBQQVEgPSBMVSwKKyAgICAgICogdGhlbiBLZXIgQSA9IFEoS2VyIFUpLgorICAgICAgKgorICAgICAgKiBQcm9vZjogdHJpdmlhbDoganVzdCBrZWVwIGluIG1pbmQgdGhhdCBQLCBRLCBMIGFyZSBpbnZlcnRpYmxlLgorICAgICAgKi8KKworICAgIC8qIFRodXMsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRvIGNvbXB1dGUgS2VyIFUsIGFuZCB0aGVuIGFwcGx5IFEuCisgICAgICAqCisgICAgICAqIFUgaXMgdXBwZXIgdHJpYW5ndWxhciwgd2l0aCBlaWdlbnZhbHVlcyBzb3J0ZWQgc28gdGhhdCBhbnkgemVyb3MgYXBwZWFyIGF0IHRoZSBlbmQuCisgICAgICAqIFRodXMsIHRoZSBkaWFnb25hbCBvZiBVIGVuZHMgd2l0aCBleGFjdGx5CisgICAgICAqIGRpbUtlciB6ZXJvJ3MuIExldCB1cyB1c2UgdGhhdCB0byBjb25zdHJ1Y3QgZGltS2VyIGxpbmVhcmx5CisgICAgICAqIGluZGVwZW5kZW50IHZlY3RvcnMgaW4gS2VyIFUuCisgICAgICAqLworCisgICAgTWF0cml4PEluZGV4LCBEeW5hbWljLCAxLCAwLCBNYXhTbWFsbERpbUF0Q29tcGlsZVRpbWUsIDE+IHBpdm90cyhyYW5rKCkpOworICAgIFJlYWxTY2FsYXIgcHJlbXVsdGlwbGllZF90aHJlc2hvbGQgPSBkZWMoKS5tYXhQaXZvdCgpICogZGVjKCkudGhyZXNob2xkKCk7CisgICAgSW5kZXggcCA9IDA7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgZGVjKCkubm9uemVyb1Bpdm90cygpOyArK2kpCisgICAgICBpZihhYnMoZGVjKCkubWF0cml4TFUoKS5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKQorICAgICAgICBwaXZvdHMuY29lZmZSZWYocCsrKSA9IGk7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHAgPT0gcmFuaygpKTsKKworICAgIC8vIHdlIGNvbnN0cnVjdCBhIHRlbXBvcmF0eSB0cmFwZXpvaWQgbWF0cml4IG0sIGJ5IHRha2luZyB0aGUgVSBtYXRyaXggYW5kCisgICAgLy8gcGVybXV0aW5nIHRoZSByb3dzIGFuZCBjb2xzIHRvIGJyaW5nIHRoZSBub25uZWdsaWdpYmxlIHBpdm90cyB0byB0aGUgdG9wIG9mCisgICAgLy8gdGhlIG1haW4gZGlhZ29uYWwuIFdlIG5lZWQgdGhhdCB0byBiZSBhYmxlIHRvIGFwcGx5IG91ciB0cmlhbmd1bGFyIHNvbHZlcnMuCisgICAgLy8gRklYTUUgd2hlbiB3ZSBnZXQgdHJpYW5ndWxhclZpZXctZm9yLXJlY3Rhbmd1bGFyLW1hdHJpY2VzLCB0aGlzIGNhbiBiZSBzaW1wbGlmaWVkCisgICAgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgRHluYW1pYywgRHluYW1pYywgTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgICAgICAgTWF4U21hbGxEaW1BdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4KKyAgICAgIG0oZGVjKCkubWF0cml4TFUoKS5ibG9jaygwLCAwLCByYW5rKCksIGNvbHMpKTsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByYW5rKCk7ICsraSkKKyAgICB7CisgICAgICBpZihpKSBtLnJvdyhpKS5oZWFkKGkpLnNldFplcm8oKTsKKyAgICAgIG0ucm93KGkpLnRhaWwoY29scy1pKSA9IGRlYygpLm1hdHJpeExVKCkucm93KHBpdm90cy5jb2VmZihpKSkudGFpbChjb2xzLWkpOworICAgIH0KKyAgICBtLmJsb2NrKDAsIDAsIHJhbmsoKSwgcmFuaygpKTsKKyAgICBtLmJsb2NrKDAsIDAsIHJhbmsoKSwgcmFuaygpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpLnNldFplcm8oKTsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByYW5rKCk7ICsraSkKKyAgICAgIG0uY29sKGkpLnN3YXAobS5jb2wocGl2b3RzLmNvZWZmKGkpKSk7CisKKyAgICAvLyBvaywgd2UgaGF2ZSBvdXIgdHJhcGV6b2lkIG1hdHJpeCwgd2UgY2FuIGFwcGx5IHRoZSB0cmlhbmd1bGFyIHNvbHZlci4KKyAgICAvLyBub3RpY2UgdGhhdCB0aGUgbWF0aCBiZWhpbmQgdGhpcyBzdWdnZXN0cyB0aGF0IHdlIHNob3VsZCBhcHBseSB0aGlzIHRvIHRoZQorICAgIC8vIG5lZ2F0aXZlIG9mIHRoZSBSSFMsIGJ1dCBmb3IgcGVyZm9ybWFuY2Ugd2UganVzdCBwdXQgdGhlIG5lZ2F0aXZlIHNpZ24gZWxzZXdoZXJlLCBzZWUgYmVsb3cuCisgICAgbS50b3BMZWZ0Q29ybmVyKHJhbmsoKSwgcmFuaygpKQorICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKAorICAgICAgICBtLnRvcFJpZ2h0Q29ybmVyKHJhbmsoKSwgZGlta2VyKQorICAgICAgKTsKKworICAgIC8vIG5vdyB3ZSBtdXN0IHVuZG8gdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiB0aGF0IHdlIGhhZCBhcHBsaWVkIQorICAgIGZvcihJbmRleCBpID0gcmFuaygpLTE7IGkgPj0gMDsgLS1pKQorICAgICAgbS5jb2woaSkuc3dhcChtLmNvbChwaXZvdHMuY29lZmYoaSkpKTsKKworICAgIC8vIHNlZSB0aGUgbmVnYXRpdmUgc2lnbiBpbiB0aGUgbmV4dCBsaW5lLCB0aGF0J3Mgd2hhdCB3ZSB3ZXJlIHRhbGtpbmcgYWJvdXQgYWJvdmUuCisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcmFuaygpOyArK2kpIGRzdC5yb3coZGVjKCkucGVybXV0YXRpb25RKCkuaW5kaWNlcygpLmNvZWZmKGkpKSA9IC1tLnJvdyhpKS50YWlsKGRpbWtlcik7CisgICAgZm9yKEluZGV4IGkgPSByYW5rKCk7IGkgPCBjb2xzOyArK2kpIGRzdC5yb3coZGVjKCkucGVybXV0YXRpb25RKCkuaW5kaWNlcygpLmNvZWZmKGkpKS5zZXRaZXJvKCk7CisgICAgZm9yKEluZGV4IGsgPSAwOyBrIDwgZGlta2VyOyArK2spIGRzdC5jb2VmZlJlZihkZWMoKS5wZXJtdXRhdGlvblEoKS5pbmRpY2VzKCkuY29lZmYocmFuaygpK2spLCBrKSA9IFNjYWxhcigxKTsKKyAgfQorfTsKKworLyoqKioqIEltcGxlbWVudGF0aW9uIG9mIGltYWdlKCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorc3RydWN0IGltYWdlX3JldHZhbDxGdWxsUGl2TFU8X01hdHJpeFR5cGU+ID4KKyAgOiBpbWFnZV9yZXR2YWxfYmFzZTxGdWxsUGl2TFU8X01hdHJpeFR5cGU+ID4KK3sKKyAgRUlHRU5fTUFLRV9JTUFHRV9IRUxQRVJTKEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4pCisKKyAgZW51bSB7IE1heFNtYWxsRGltQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRCgKKyAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUpCisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgaWYocmFuaygpID09IDApCisgICAgeworICAgICAgLy8gVGhlIEltYWdlIGlzIGp1c3QgezB9LCBzbyBpdCBkb2Vzbid0IGhhdmUgYSBiYXNpcyBwcm9wZXJseSBzcGVha2luZywgYnV0IGxldCdzCisgICAgICAvLyBhdm9pZCBjcmFzaGluZy9hc3NlcnRpbmcgYXMgdGhhdCBkZXBlbmRzIG9uIGZsb2F0aW5nIHBvaW50IGNhbGN1bGF0aW9ucy4gTGV0J3MKKyAgICAgIC8vIGp1c3QgcmV0dXJuIGEgc2luZ2xlIGNvbHVtbiB2ZWN0b3IgZmlsbGVkIHdpdGggemVyb3MuCisgICAgICBkc3Quc2V0WmVybygpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE1hdHJpeDxJbmRleCwgRHluYW1pYywgMSwgMCwgTWF4U21hbGxEaW1BdENvbXBpbGVUaW1lLCAxPiBwaXZvdHMocmFuaygpKTsKKyAgICBSZWFsU2NhbGFyIHByZW11bHRpcGxpZWRfdGhyZXNob2xkID0gZGVjKCkubWF4UGl2b3QoKSAqIGRlYygpLnRocmVzaG9sZCgpOworICAgIEluZGV4IHAgPSAwOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IGRlYygpLm5vbnplcm9QaXZvdHMoKTsgKytpKQorICAgICAgaWYoYWJzKGRlYygpLm1hdHJpeExVKCkuY29lZmYoaSxpKSkgPiBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCkKKyAgICAgICAgcGl2b3RzLmNvZWZmUmVmKHArKykgPSBpOworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChwID09IHJhbmsoKSk7CisKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByYW5rKCk7ICsraSkKKyAgICAgIGRzdC5jb2woaSkgPSBvcmlnaW5hbE1hdHJpeCgpLmNvbChkZWMoKS5wZXJtdXRhdGlvblEoKS5pbmRpY2VzKCkuY29lZmYocGl2b3RzLmNvZWZmKGkpKSk7CisgIH0KK307CisKKy8qKioqKiBJbXBsZW1lbnRhdGlvbiBvZiBzb2x2ZSgpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgordm9pZCBGdWxsUGl2TFU8X01hdHJpeFR5cGU+Ojpfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3QKK3sKKyAgLyogVGhlIGRlY29tcG9zaXRpb24gUEFRID0gTFUgY2FuIGJlIHJld3JpdHRlbiBhcyBBID0gUF57LTF9IEwgVSBRXnstMX0uCisgICogU28gd2UgcHJvY2VlZCBhcyBmb2xsb3dzOgorICAqIFN0ZXAgMTogY29tcHV0ZSBjID0gUCAqIHJocy4KKyAgKiBTdGVwIDI6IHJlcGxhY2UgYyBieSB0aGUgc29sdXRpb24geCB0byBMeCA9IGMuIEV4aXN0cyBiZWNhdXNlIEwgaXMgaW52ZXJ0aWJsZS4KKyAgKiBTdGVwIDM6IHJlcGxhY2UgYyBieSB0aGUgc29sdXRpb24geCB0byBVeCA9IGMuIE1heSBvciBtYXkgbm90IGV4aXN0LgorICAqIFN0ZXAgNDogcmVzdWx0ID0gUSAqIGM7CisgICovCisKKyAgY29uc3QgSW5kZXggcm93cyA9IHRoaXMtPnJvd3MoKSwKKyAgICAgICAgICAgICAgY29scyA9IHRoaXMtPmNvbHMoKSwKKyAgICAgICAgICAgICAgbm9uemVyb19waXZvdHMgPSB0aGlzLT5yYW5rKCk7CisgIGVpZ2VuX2Fzc2VydChyaHMucm93cygpID09IHJvd3MpOworICBjb25zdCBJbmRleCBzbWFsbGRpbSA9IChzdGQ6Om1pbikocm93cywgY29scyk7CisKKyAgaWYobm9uemVyb19waXZvdHMgPT0gMCkKKyAgeworICAgIGRzdC5zZXRaZXJvKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdHlwZW5hbWUgUmhzVHlwZTo6UGxhaW5PYmplY3QgYyhyaHMucm93cygpLCByaHMuY29scygpKTsKKworICAvLyBTdGVwIDEKKyAgYyA9IHBlcm11dGF0aW9uUCgpICogcmhzOworCisgIC8vIFN0ZXAgMgorICBtX2x1LnRvcExlZnRDb3JuZXIoc21hbGxkaW0sc21hbGxkaW0pCisgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpCisgICAgICAuc29sdmVJblBsYWNlKGMudG9wUm93cyhzbWFsbGRpbSkpOworICBpZihyb3dzPmNvbHMpCisgICAgYy5ib3R0b21Sb3dzKHJvd3MtY29scykgLT0gbV9sdS5ib3R0b21Sb3dzKHJvd3MtY29scykgKiBjLnRvcFJvd3MoY29scyk7CisKKyAgLy8gU3RlcCAzCisgIG1fbHUudG9wTGVmdENvcm5lcihub256ZXJvX3Bpdm90cywgbm9uemVyb19waXZvdHMpCisgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKG5vbnplcm9fcGl2b3RzKSk7CisKKyAgLy8gU3RlcCA0CisgIGZvcihJbmRleCBpID0gMDsgaSA8IG5vbnplcm9fcGl2b3RzOyArK2kpCisgICAgZHN0LnJvdyhwZXJtdXRhdGlvblEoKS5pbmRpY2VzKCkuY29lZmYoaSkpID0gYy5yb3coaSk7CisgIGZvcihJbmRleCBpID0gbm9uemVyb19waXZvdHM7IGkgPCBtX2x1LmNvbHMoKTsgKytpKQorICAgIGRzdC5yb3cocGVybXV0YXRpb25RKCkuaW5kaWNlcygpLmNvZWZmKGkpKS5zZXRaZXJvKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgordGVtcGxhdGU8Ym9vbCBDb25qdWdhdGUsIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+Cit2b2lkIEZ1bGxQaXZMVTxfTWF0cml4VHlwZT46Ol9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0Cit7CisgIC8qIFRoZSBkZWNvbXBvc2l0aW9uIFBBUSA9IExVIGNhbiBiZSByZXdyaXR0ZW4gYXMgQSA9IFBeey0xfSBMIFUgUV57LTF9LAorICAgKiBhbmQgc2luY2UgcGVybXV0YXRpb25zIGFyZSByZWFsIGFuZCB1bml0YXJ5LCB3ZSBjYW4gd3JpdGUgdGhpcworICAgKiBhcyAgIEFeVCA9IFEgVV5UIExeVCBQLAorICAgKiBTbyB3ZSBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAqIFN0ZXAgMTogY29tcHV0ZSBjID0gUV5UIHJocy4KKyAgICogU3RlcCAyOiByZXBsYWNlIGMgYnkgdGhlIHNvbHV0aW9uIHggdG8gVV5UIHggPSBjLiBNYXkgb3IgbWF5IG5vdCBleGlzdC4KKyAgICogU3RlcCAzOiByZXBsYWNlIGMgYnkgdGhlIHNvbHV0aW9uIHggdG8gTF5UIHggPSBjLgorICAgKiBTdGVwIDQ6IHJlc3VsdCA9IFBeVCBjLgorICAgKiBJZiBDb25qdWdhdGUgaXMgdHJ1ZSwgcmVwbGFjZSAiXlQiIGJ5ICJeKiIgYWJvdmUuCisgICAqLworCisgIGNvbnN0IEluZGV4IHJvd3MgPSB0aGlzLT5yb3dzKCksIGNvbHMgPSB0aGlzLT5jb2xzKCksCisgICAgbm9uemVyb19waXZvdHMgPSB0aGlzLT5yYW5rKCk7CisgICBlaWdlbl9hc3NlcnQocmhzLnJvd3MoKSA9PSBjb2xzKTsKKyAgY29uc3QgSW5kZXggc21hbGxkaW0gPSAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOworCisgIGlmKG5vbnplcm9fcGl2b3RzID09IDApCisgIHsKKyAgICBkc3Quc2V0WmVybygpOworICAgIHJldHVybjsKKyAgfQorCisgIHR5cGVuYW1lIFJoc1R5cGU6OlBsYWluT2JqZWN0IGMocmhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisKKyAgLy8gU3RlcCAxCisgIGMgPSBwZXJtdXRhdGlvblEoKS5pbnZlcnNlKCkgKiByaHM7CisKKyAgaWYgKENvbmp1Z2F0ZSkgeworICAgIC8vIFN0ZXAgMgorICAgIG1fbHUudG9wTGVmdENvcm5lcihub256ZXJvX3Bpdm90cywgbm9uemVyb19waXZvdHMpCisgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgICAuYWRqb2ludCgpCisgICAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKG5vbnplcm9fcGl2b3RzKSk7CisgICAgLy8gU3RlcCAzCisgICAgbV9sdS50b3BMZWZ0Q29ybmVyKHNtYWxsZGltLCBzbWFsbGRpbSkKKyAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKQorICAgICAgICAuYWRqb2ludCgpCisgICAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKHNtYWxsZGltKSk7CisgIH0gZWxzZSB7CisgICAgLy8gU3RlcCAyCisgICAgbV9sdS50b3BMZWZ0Q29ybmVyKG5vbnplcm9fcGl2b3RzLCBub256ZXJvX3Bpdm90cykKKyAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgIC50cmFuc3Bvc2UoKQorICAgICAgICAuc29sdmVJblBsYWNlKGMudG9wUm93cyhub256ZXJvX3Bpdm90cykpOworICAgIC8vIFN0ZXAgMworICAgIG1fbHUudG9wTGVmdENvcm5lcihzbWFsbGRpbSwgc21hbGxkaW0pCisgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkKKyAgICAgICAgLnRyYW5zcG9zZSgpCisgICAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKHNtYWxsZGltKSk7CisgIH0KKworICAvLyBTdGVwIDQKKyAgUGVybXV0YXRpb25QVHlwZSBpbnZwID0gcGVybXV0YXRpb25QKCkuaW52ZXJzZSgpLmV2YWwoKTsKKyAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc21hbGxkaW07ICsraSkKKyAgICBkc3Qucm93KGludnAuaW5kaWNlcygpLmNvZWZmKGkpKSA9IGMucm93KGkpOworICBmb3IoSW5kZXggaSA9IHNtYWxsZGltOyBpIDwgcm93czsgKytpKQorICAgIGRzdC5yb3coaW52cC5pbmRpY2VzKCkuY29lZmYoaSkpLnNldFplcm8oKTsKK30KKworI2VuZGlmCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKworLyoqKioqIEltcGxlbWVudGF0aW9uIG9mIGludmVyc2UoKSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBJbnZlcnNlPEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiA+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBGdWxsUGl2TFU8TWF0cml4VHlwZT46OlNjYWxhcj4sIERlbnNlMkRlbnNlPgoreworICB0eXBlZGVmIEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiBMdVR5cGU7CisgIHR5cGVkZWYgSW52ZXJzZTxMdVR5cGU+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPiAmKQorICB7CisgICAgZHN0ID0gc3JjLm5lc3RlZEV4cHJlc3Npb24oKS5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShzcmMucm93cygpLCBzcmMuY29scygpKSk7CisgIH0KK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKiogTWF0cml4QmFzZSBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGx1X21vZHVsZQorICAqCisgICogXHJldHVybiB0aGUgZnVsbC1waXZvdGluZyBMVSBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIEZ1bGxQaXZMVQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBGdWxsUGl2TFU8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpmdWxsUGl2THUoKSBjb25zdAoreworICByZXR1cm4gRnVsbFBpdkxVPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xVX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9MVS9JbnZlcnNlSW1wbC5oIGIvRWlnZW4vc3JjL0xVL0ludmVyc2VJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4Zjk5YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9JbnZlcnNlSW1wbC5oCkBAIC0wLDAgKzEsNDE1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JTlZFUlNFX0lNUExfSAorI2RlZmluZSBFSUdFTl9JTlZFUlNFX0lNUExfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBHZW5lcmFsIGNhc2UgaW1wbGVtZW50YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlLCBpbnQgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgorc3RydWN0IGNvbXB1dGVfaW52ZXJzZQoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgUmVzdWx0VHlwZSYgcmVzdWx0KQorICB7CisgICAgcmVzdWx0ID0gbWF0cml4LnBhcnRpYWxQaXZMdSgpLmludmVyc2UoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZSwgaW50IFNpemUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2VfYW5kX2RldF93aXRoX2NoZWNrIHsgLyogbm90aGluZyEgZ2VuZXJhbCBjYXNlIG5vdCBzdXBwb3J0ZWQuICovIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2l6ZSAxIGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2U8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgMT4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBpbnRlcm5hbDo6ZXZhbHVhdG9yPE1hdHJpeFR5cGU+IG1hdHJpeEV2YWwobWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMCwwKSA9IFNjYWxhcigxKSAvIG1hdHJpeEV2YWwuY29lZmYoMCwwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2VfYW5kX2RldF93aXRoX2NoZWNrPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDE+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LAorICAgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkLAorICAgIFJlc3VsdFR5cGUmIHJlc3VsdCwKKyAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgIGJvb2wmIGludmVydGlibGUKKyAgKQorICB7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgZGV0ZXJtaW5hbnQgPSBtYXRyaXguY29lZmYoMCwwKTsKKyAgICBpbnZlcnRpYmxlID0gYWJzKGRldGVybWluYW50KSA+IGFic0RldGVybWluYW50VGhyZXNob2xkOworICAgIGlmKGludmVydGlibGUpIHJlc3VsdC5jb2VmZlJlZigwLDApID0gdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyKDEpIC8gZGV0ZXJtaW5hbnQ7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2l6ZSAyIGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK0VJR0VOX0RFVklDRV9GVU5DIAoraW5saW5lIHZvaWQgY29tcHV0ZV9pbnZlcnNlX3NpemUyX2hlbHBlcigKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGNvbnN0IHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciYgaW52ZGV0LAorICAgIFJlc3VsdFR5cGUmIHJlc3VsdCkKK3sKKyAgcmVzdWx0LmNvZWZmUmVmKDAsMCkgPSAgbWF0cml4LmNvZWZmKDEsMSkgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigxLDApID0gLW1hdHJpeC5jb2VmZigxLDApICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMCwxKSA9IC1tYXRyaXguY29lZmYoMCwxKSAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDEsMSkgPSAgbWF0cml4LmNvZWZmKDAsMCkgKiBpbnZkZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDI+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgY29uc3QgU2NhbGFyIGludmRldCA9IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcigxKSAvIG1hdHJpeC5kZXRlcm1pbmFudCgpOworICAgIGNvbXB1dGVfaW52ZXJzZV9zaXplMl9oZWxwZXIobWF0cml4LCBpbnZkZXQsIHJlc3VsdCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlX2FuZF9kZXRfd2l0aF9jaGVjazxNYXRyaXhUeXBlLCBSZXN1bHRUeXBlLCAyPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwKKyAgICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCwKKyAgICBSZXN1bHRUeXBlJiBpbnZlcnNlLAorICAgIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciYgZGV0ZXJtaW5hbnQsCisgICAgYm9vbCYgaW52ZXJ0aWJsZQorICApCisgIHsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgZGV0ZXJtaW5hbnQgPSBtYXRyaXguZGV0ZXJtaW5hbnQoKTsKKyAgICBpbnZlcnRpYmxlID0gYWJzKGRldGVybWluYW50KSA+IGFic0RldGVybWluYW50VGhyZXNob2xkOworICAgIGlmKCFpbnZlcnRpYmxlKSByZXR1cm47CisgICAgY29uc3QgU2NhbGFyIGludmRldCA9IFNjYWxhcigxKSAvIGRldGVybWluYW50OworICAgIGNvbXB1dGVfaW52ZXJzZV9zaXplMl9oZWxwZXIobWF0cml4LCBpbnZkZXQsIGludmVyc2UpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNpemUgMyBpbXBsZW1lbnRhdGlvbiAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBpLCBpbnQgaj4KK0VJR0VOX0RFVklDRV9GVU5DIAoraW5saW5lIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBjb2ZhY3Rvcl8zeDMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgZW51bSB7CisgICAgaTEgPSAoaSsxKSAlIDMsCisgICAgaTIgPSAoaSsyKSAlIDMsCisgICAgajEgPSAoaisxKSAlIDMsCisgICAgajIgPSAoaisyKSAlIDMKKyAgfTsKKyAgcmV0dXJuIG0uY29lZmYoaTEsIGoxKSAqIG0uY29lZmYoaTIsIGoyKQorICAgICAgIC0gbS5jb2VmZihpMSwgajIpICogbS5jb2VmZihpMiwgajEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB2b2lkIGNvbXB1dGVfaW52ZXJzZV9zaXplM19oZWxwZXIoCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LAorICAgIGNvbnN0IHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciYgaW52ZGV0LAorICAgIGNvbnN0IE1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsMywxPiYgY29mYWN0b3JzX2NvbDAsCisgICAgUmVzdWx0VHlwZSYgcmVzdWx0KQoreworICByZXN1bHQucm93KDApID0gY29mYWN0b3JzX2NvbDAgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigxLDApID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDAsMT4obWF0cml4KSAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDEsMSkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMSwxPihtYXRyaXgpICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMSwyKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwyLDE+KG1hdHJpeCkgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigyLDApID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDAsMj4obWF0cml4KSAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDIsMSkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMSwyPihtYXRyaXgpICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMiwyKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwyLDI+KG1hdHJpeCkgKiBpbnZkZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDM+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwzLDE+IGNvZmFjdG9yc19jb2wwOworICAgIGNvZmFjdG9yc19jb2wwLmNvZWZmUmVmKDApID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDAsMD4obWF0cml4KTsKKyAgICBjb2ZhY3RvcnNfY29sMC5jb2VmZlJlZigxKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwxLDA+KG1hdHJpeCk7CisgICAgY29mYWN0b3JzX2NvbDAuY29lZmZSZWYoMikgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMiwwPihtYXRyaXgpOworICAgIGNvbnN0IFNjYWxhciBkZXQgPSAoY29mYWN0b3JzX2NvbDAuY3dpc2VQcm9kdWN0KG1hdHJpeC5jb2woMCkpKS5zdW0oKTsKKyAgICBjb25zdCBTY2FsYXIgaW52ZGV0ID0gU2NhbGFyKDEpIC8gZGV0OworICAgIGNvbXB1dGVfaW52ZXJzZV9zaXplM19oZWxwZXIobWF0cml4LCBpbnZkZXQsIGNvZmFjdG9yc19jb2wwLCByZXN1bHQpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbXB1dGVfaW52ZXJzZV9hbmRfZGV0X3dpdGhfY2hlY2s8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgMz4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bigKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsCisgICAgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQsCisgICAgUmVzdWx0VHlwZSYgaW52ZXJzZSwKKyAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgIGJvb2wmIGludmVydGlibGUKKyAgKQorICB7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIE1hdHJpeDxTY2FsYXIsMywxPiBjb2ZhY3RvcnNfY29sMDsKKyAgICBjb2ZhY3RvcnNfY29sMC5jb2VmZlJlZigwKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwwLDA+KG1hdHJpeCk7CisgICAgY29mYWN0b3JzX2NvbDAuY29lZmZSZWYoMSkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMSwwPihtYXRyaXgpOworICAgIGNvZmFjdG9yc19jb2wwLmNvZWZmUmVmKDIpID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDIsMD4obWF0cml4KTsKKyAgICBkZXRlcm1pbmFudCA9IChjb2ZhY3RvcnNfY29sMC5jd2lzZVByb2R1Y3QobWF0cml4LmNvbCgwKSkpLnN1bSgpOworICAgIGludmVydGlibGUgPSBhYnMoZGV0ZXJtaW5hbnQpID4gYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQ7CisgICAgaWYoIWludmVydGlibGUpIHJldHVybjsKKyAgICBjb25zdCBTY2FsYXIgaW52ZGV0ID0gU2NhbGFyKDEpIC8gZGV0ZXJtaW5hbnQ7CisgICAgY29tcHV0ZV9pbnZlcnNlX3NpemUzX2hlbHBlcihtYXRyaXgsIGludmRldCwgY29mYWN0b3JzX2NvbDAsIGludmVyc2UpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNpemUgNCBpbXBsZW1lbnRhdGlvbiAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQyAKK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgZ2VuZXJhbF9kZXQzX2hlbHBlcgorKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwgaW50IGkxLCBpbnQgaTIsIGludCBpMywgaW50IGoxLCBpbnQgajIsIGludCBqMykKK3sKKyAgcmV0dXJuIG1hdHJpeC5jb2VmZihpMSxqMSkKKyAgICAgICAgICogKG1hdHJpeC5jb2VmZihpMixqMikgKiBtYXRyaXguY29lZmYoaTMsajMpIC0gbWF0cml4LmNvZWZmKGkyLGozKSAqIG1hdHJpeC5jb2VmZihpMyxqMikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgaSwgaW50IGo+CitFSUdFTl9ERVZJQ0VfRlVOQyAKK2lubGluZSB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgY29mYWN0b3JfNHg0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKK3sKKyAgZW51bSB7CisgICAgaTEgPSAoaSsxKSAlIDQsCisgICAgaTIgPSAoaSsyKSAlIDQsCisgICAgaTMgPSAoaSszKSAlIDQsCisgICAgajEgPSAoaisxKSAlIDQsCisgICAgajIgPSAoaisyKSAlIDQsCisgICAgajMgPSAoaiszKSAlIDQKKyAgfTsKKyAgcmV0dXJuIGdlbmVyYWxfZGV0M19oZWxwZXIobWF0cml4LCBpMSwgaTIsIGkzLCBqMSwgajIsIGozKQorICAgICAgICsgZ2VuZXJhbF9kZXQzX2hlbHBlcihtYXRyaXgsIGkyLCBpMywgaTEsIGoxLCBqMiwgajMpCisgICAgICAgKyBnZW5lcmFsX2RldDNfaGVscGVyKG1hdHJpeCwgaTMsIGkxLCBpMiwgajEsIGoyLCBqMyk7Cit9CisKK3RlbXBsYXRlPGludCBBcmNoLCB0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlX3NpemU0Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIHJlc3VsdC5jb2VmZlJlZigwLDApID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDAsMD4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMSwwKSA9IC1jb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwwLDE+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDIsMCkgPSAgY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMCwyPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigzLDApID0gLWNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDAsMz4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMCwyKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwyLDA+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDEsMikgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMiwxPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigyLDIpID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDIsMj4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMywyKSA9IC1jb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwyLDM+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDAsMSkgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMSwwPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigxLDEpID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDEsMT4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMiwxKSA9IC1jb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwxLDI+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDMsMSkgPSAgY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMSwzPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigwLDMpID0gLWNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDMsMD4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMSwzKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwzLDE+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDIsMykgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMywyPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigzLDMpID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDMsMz4obWF0cml4KTsKKyAgICByZXN1bHQgLz0gKG1hdHJpeC5jb2woMCkuY3dpc2VQcm9kdWN0KHJlc3VsdC5yb3coMCkudHJhbnNwb3NlKCkpKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2U8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgND4KKyA6IGNvbXB1dGVfaW52ZXJzZV9zaXplNDxBcmNoaXRlY3R1cmU6OlRhcmdldCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGUsIFJlc3VsdFR5cGU+Cit7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbXB1dGVfaW52ZXJzZV9hbmRfZGV0X3dpdGhfY2hlY2s8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgND4KK3sKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bigKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsCisgICAgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQsCisgICAgUmVzdWx0VHlwZSYgaW52ZXJzZSwKKyAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgIGJvb2wmIGludmVydGlibGUKKyAgKQorICB7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgZGV0ZXJtaW5hbnQgPSBtYXRyaXguZGV0ZXJtaW5hbnQoKTsKKyAgICBpbnZlcnRpYmxlID0gYWJzKGRldGVybWluYW50KSA+IGFic0RldGVybWluYW50VGhyZXNob2xkOworICAgIGlmKGludmVydGlibGUpIGNvbXB1dGVfaW52ZXJzZTxNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPjo6cnVuKG1hdHJpeCwgaW52ZXJzZSk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogTWF0cml4QmFzZSBtZXRob2RzICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciAiZGVuc2UgPSBkZW5zZV94cHIuaW52ZXJzZSgpIgordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIEludmVyc2U8WHByVHlwZT4sIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcj4sIERlbnNlMkRlbnNlPgoreworICB0eXBlZGVmIEludmVyc2U8WHByVHlwZT4gU3JjWHByVHlwZTsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXI+ICYpCisgIHsKKyAgICBJbmRleCBkc3RSb3dzID0gc3JjLnJvd3MoKTsKKyAgICBJbmRleCBkc3RDb2xzID0gc3JjLmNvbHMoKTsKKyAgICBpZigoZHN0LnJvd3MoKSE9ZHN0Um93cykgfHwgKGRzdC5jb2xzKCkhPWRzdENvbHMpKQorICAgICAgZHN0LnJlc2l6ZShkc3RSb3dzLCBkc3RDb2xzKTsKKyAgICAKKyAgICBjb25zdCBpbnQgU2l6ZSA9IEVJR0VOX1BMQUlOX0VOVU1fTUlOKFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLERzdFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKTsKKyAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKFNpemUpOworICAgIGVpZ2VuX2Fzc2VydCgoIChTaXplPD0xKSB8fCAoU2l6ZT40KSB8fCAoZXh0cmFjdF9kYXRhKHNyYy5uZXN0ZWRFeHByZXNzaW9uKCkpIT1leHRyYWN0X2RhdGEoZHN0KSkpCisgICAgICAgICAgICAgICYmICJBbGlhc2luZyBwcm9ibGVtIGRldGVjdGVkIGluIGludmVyc2UoKSwgeW91IG5lZWQgdG8gZG8gaW52ZXJzZSgpLmV2YWwoKSBoZXJlLiIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8WHByVHlwZSxYcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZT46OnR5cGUgIEFjdHVhbFhwclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxYcHJUeXBlPjo6dHlwZSAgICAgICAgICAgICAgICAgICAgICAgIEFjdHVhbFhwclR5cGVDbGVhbmRlZDsKKyAgICAKKyAgICBBY3R1YWxYcHJUeXBlIGFjdHVhbF94cHIoc3JjLm5lc3RlZEV4cHJlc3Npb24oKSk7CisgICAgCisgICAgY29tcHV0ZV9pbnZlcnNlPEFjdHVhbFhwclR5cGVDbGVhbmRlZCwgRHN0WHByVHlwZT46OnJ1bihhY3R1YWxfeHByLCBkc3QpOworICB9Cit9OworCisgIAorfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcbHVfbW9kdWxlCisgICoKKyAgKiBccmV0dXJucyB0aGUgbWF0cml4IGludmVyc2Ugb2YgdGhpcyBtYXRyaXguCisgICoKKyAgKiBGb3Igc21hbGwgZml4ZWQgc2l6ZXMgdXAgdG8gNHg0LCB0aGlzIG1ldGhvZCB1c2VzIGNvZmFjdG9ycy4KKyAgKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGlzIG1ldGhvZCB1c2VzIGNsYXNzIFBhcnRpYWxQaXZMVS4KKyAgKgorICAqIFxub3RlIFRoaXMgbWF0cml4IG11c3QgYmUgaW52ZXJ0aWJsZSwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiBJZiB5b3UgbmVlZCBhbgorICAqIGludmVydGliaWxpdHkgY2hlY2ssIGRvIHRoZSBmb2xsb3dpbmc6CisgICogXGxpIGZvciBmaXhlZCBzaXplcyB1cCB0byA0eDQsIHVzZSBjb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjaygpLgorICAqIFxsaSBmb3IgdGhlIGdlbmVyYWwgY2FzZSwgdXNlIGNsYXNzIEZ1bGxQaXZMVS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaW52ZXJzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2ludmVyc2Uub3V0CisgICoKKyAgKiBcc2EgY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBJbnZlcnNlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmludmVyc2UoKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLFRISVNfRlVOQ1RJT05fSVNfTk9UX0ZPUl9JTlRFR0VSX05VTUVSSUNfVFlQRVMpCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgcmV0dXJuIEludmVyc2U8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIENvbXB1dGF0aW9uIG9mIG1hdHJpeCBpbnZlcnNlIGFuZCBkZXRlcm1pbmFudCwgd2l0aCBpbnZlcnRpYmlsaXR5IGNoZWNrLgorICAqCisgICogVGhpcyBpcyBvbmx5IGZvciBmaXhlZC1zaXplIHNxdWFyZSBtYXRyaWNlcyBvZiBzaXplIHVwIHRvIDR4NC4KKyAgKgorICAqIFxwYXJhbSBpbnZlcnNlIFJlZmVyZW5jZSB0byB0aGUgbWF0cml4IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBpbnZlcnNlLgorICAqIFxwYXJhbSBkZXRlcm1pbmFudCBSZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBkZXRlcm1pbmFudC4KKyAgKiBccGFyYW0gaW52ZXJ0aWJsZSBSZWZlcmVuY2UgdG8gdGhlIGJvb2wgdmFyaWFibGUgaW4gd2hpY2ggdG8gc3RvcmUgd2hldGhlciB0aGUgbWF0cml4IGlzIGludmVydGlibGUuCisgICogXHBhcmFtIGFic0RldGVybWluYW50VGhyZXNob2xkIE9wdGlvbmFsIHBhcmFtZXRlciBjb250cm9sbGluZyB0aGUgaW52ZXJ0aWJpbGl0eSBjaGVjay4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1hdHJpeCB3aWxsIGJlIGRlY2xhcmVkIGludmVydGlibGUgaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIGl0cworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmFudCBpcyBncmVhdGVyIHRoYW4gdGhpcyB0aHJlc2hvbGQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2sub3V0CisgICoKKyAgKiBcc2EgaW52ZXJzZSgpLCBjb21wdXRlSW52ZXJzZVdpdGhDaGVjaygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZT4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmNvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrKAorICAgIFJlc3VsdFR5cGUmIGludmVyc2UsCisgICAgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyJiBkZXRlcm1pbmFudCwKKyAgICBib29sJiBpbnZlcnRpYmxlLAorICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkCisgICkgY29uc3QKK3sKKyAgLy8gaSdkIGxvdmUgdG8gcHV0IHNvbWUgc3RhdGljIGFzc2VydGlvbnMgdGhlcmUsIGJ1dCBTRklOQUUgbWVhbnMgdGhhdCB0aGV5IGhhdmUgbm8gZWZmZWN0Li4uCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgLy8gZm9yIDJ4MiwgaXQncyB3b3J0aCBnaXZpbmcgYSBjaGFuY2UgdG8gYXZvaWQgZXZhbHVhdGluZy4KKyAgLy8gZm9yIGxhcmdlciBzaXplcywgZXZhbHVhdGluZyBoYXMgbmVnbGlnaWJsZSBjb3N0IGFuZCBsaW1pdHMgY29kZSBzaXplLgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICBSb3dzQXRDb21waWxlVGltZSA9PSAyLAorICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLCAyPjo6dHlwZT46OnR5cGUsCisgICAgUGxhaW5PYmplY3QKKyAgPjo6dHlwZSBNYXRyaXhUeXBlOworICBpbnRlcm5hbDo6Y29tcHV0ZV9pbnZlcnNlX2FuZF9kZXRfd2l0aF9jaGVjazxNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPjo6cnVuCisgICAgKGRlcml2ZWQoKSwgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQsIGludmVyc2UsIGRldGVybWluYW50LCBpbnZlcnRpYmxlKTsKK30KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIENvbXB1dGF0aW9uIG9mIG1hdHJpeCBpbnZlcnNlLCB3aXRoIGludmVydGliaWxpdHkgY2hlY2suCisgICoKKyAgKiBUaGlzIGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgc3F1YXJlIG1hdHJpY2VzIG9mIHNpemUgdXAgdG8gNHg0LgorICAqCisgICogXHBhcmFtIGludmVyc2UgUmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGludmVyc2UuCisgICogXHBhcmFtIGludmVydGlibGUgUmVmZXJlbmNlIHRvIHRoZSBib29sIHZhcmlhYmxlIGluIHdoaWNoIHRvIHN0b3JlIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBpbnZlcnRpYmxlLgorICAqIFxwYXJhbSBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCBPcHRpb25hbCBwYXJhbWV0ZXIgY29udHJvbGxpbmcgdGhlIGludmVydGliaWxpdHkgY2hlY2suCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXRyaXggd2lsbCBiZSBkZWNsYXJlZCBpbnZlcnRpYmxlIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5hbnQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZVdpdGhDaGVjay5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlV2l0aENoZWNrLm91dAorICAqCisgICogXHNhIGludmVyc2UoKSwgY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb21wdXRlSW52ZXJzZVdpdGhDaGVjaygKKyAgICBSZXN1bHRUeXBlJiBpbnZlcnNlLAorICAgIGJvb2wmIGludmVydGlibGUsCisgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQKKyAgKSBjb25zdAoreworICBSZWFsU2NhbGFyIGRldGVybWluYW50OworICAvLyBpJ2QgbG92ZSB0byBwdXQgc29tZSBzdGF0aWMgYXNzZXJ0aW9ucyB0aGVyZSwgYnV0IFNGSU5BRSBtZWFucyB0aGF0IHRoZXkgaGF2ZSBubyBlZmZlY3QuLi4KKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICBjb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhpbnZlcnNlLGRldGVybWluYW50LGludmVydGlibGUsYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lOVkVSU0VfSU1QTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvUGFydGlhbFBpdkxVLmggYi9FaWdlbi9zcmMvTFUvUGFydGlhbFBpdkxVLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOTYxOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9QYXJ0aWFsUGl2TFUuaApAQCAtMCwwICsxLDYxMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFSVElBTExVX0gKKyNkZWZpbmUgRUlHRU5fUEFSVElBTExVX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBzdHJ1Y3QgdHJhaXRzPFBhcnRpYWxQaXZMVTxfTWF0cml4VHlwZT4gPgorIDogdHJhaXRzPF9NYXRyaXhUeXBlPgoreworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICB0eXBlZGVmIFNvbHZlclN0b3JhZ2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHJhaXRzPF9NYXRyaXhUeXBlPiBCYXNlVHJhaXRzOworICBlbnVtIHsKKyAgICBGbGFncyA9IEJhc2VUcmFpdHM6OkZsYWdzICYgUm93TWFqb3JCaXQsCisgICAgQ29lZmZSZWFkQ29zdCA9IER5bmFtaWMKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBlbmFibGVfaWZfcmVmOworLy8geworLy8gICB0eXBlZGVmIERlcml2ZWQgdHlwZTsKKy8vIH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBlbmFibGVfaWZfcmVmPFJlZjxUPixEZXJpdmVkPiB7CisgIHR5cGVkZWYgRGVyaXZlZCB0eXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcaW5ncm91cCBMVV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBQYXJ0aWFsUGl2TFUKKyAgKgorICAqIFxicmllZiBMVSBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IHdpdGggcGFydGlhbCBwaXZvdGluZywgYW5kIHJlbGF0ZWQgZmVhdHVyZXMKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBMVSBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBMVSBkZWNvbXBvc2l0aW9uIG9mIGEgXGIgc3F1YXJlIFxiIGludmVydGlibGUgbWF0cml4LCB3aXRoIHBhcnRpYWwgcGl2b3Rpbmc6IHRoZSBtYXRyaXggQQorICAqIGlzIGRlY29tcG9zZWQgYXMgQSA9IFBMVSB3aGVyZSBMIGlzIHVuaXQtbG93ZXItdHJpYW5ndWxhciwgVSBpcyB1cHBlci10cmlhbmd1bGFyLCBhbmQgUAorICAqIGlzIGEgcGVybXV0YXRpb24gbWF0cml4LgorICAqCisgICogVHlwaWNhbGx5LCBwYXJ0aWFsIHBpdm90aW5nIExVIGRlY29tcG9zaXRpb24gaXMgb25seSBjb25zaWRlcmVkIG51bWVyaWNhbGx5IHN0YWJsZSBmb3Igc3F1YXJlIGludmVydGlibGUKKyAgKiBtYXRyaWNlcy4gVGh1cyBMQVBBQ0sncyBkZ2VzdiBhbmQgZGdlc3Z4IHJlcXVpcmUgdGhlIG1hdHJpeCB0byBiZSBzcXVhcmUgYW5kIGludmVydGlibGUuIFRoZSBwcmVzZW50IGNsYXNzCisgICogZG9lcyB0aGUgc2FtZS4gSXQgd2lsbCBhc3NlcnQgdGhhdCB0aGUgbWF0cml4IGlzIHNxdWFyZSwgYnV0IGl0IHdvbid0IChhY3R1YWxseSBpdCBjYW4ndCkgY2hlY2sgdGhhdCB0aGUKKyAgKiBtYXRyaXggaXMgaW52ZXJ0aWJsZTogaXQgaXMgeW91ciB0YXNrIHRvIGNoZWNrIHRoYXQgeW91IG9ubHkgdXNlIHRoaXMgZGVjb21wb3NpdGlvbiBvbiBpbnZlcnRpYmxlIG1hdHJpY2VzLgorICAqCisgICogVGhlIGd1YXJhbnRlZWQgc2FmZSBhbHRlcm5hdGl2ZSwgd29ya2luZyBmb3IgYWxsIG1hdHJpY2VzLCBpcyB0aGUgZnVsbCBwaXZvdGluZyBMVSBkZWNvbXBvc2l0aW9uLCBwcm92aWRlZAorICAqIGJ5IGNsYXNzIEZ1bGxQaXZMVS4KKyAgKgorICAqIFRoaXMgaXMgXGIgbm90IGEgcmFuay1yZXZlYWxpbmcgTFUgZGVjb21wb3NpdGlvbi4gTWFueSBmZWF0dXJlcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgZnJvbSB0aGlzIGNsYXNzLAorICAqIHN1Y2ggYXMgcmFuayBjb21wdXRhdGlvbi4gSWYgeW91IG5lZWQgdGhlc2UgZmVhdHVyZXMsIHVzZSBjbGFzcyBGdWxsUGl2TFUuCisgICoKKyAgKiBUaGlzIExVIGRlY29tcG9zaXRpb24gaXMgc3VpdGFibGUgdG8gaW52ZXJ0IGludmVydGlibGUgbWF0cmljZXMuIEl0IGlzIHdoYXQgTWF0cml4QmFzZTo6aW52ZXJzZSgpIHVzZXMKKyAgKiBpbiB0aGUgZ2VuZXJhbCBjYXNlLgorICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBcYiBub3Qgc3VpdGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBtYXRyaXggaXMgaW52ZXJ0aWJsZS4KKyAgKgorICAqIFRoZSBkYXRhIG9mIHRoZSBMVSBkZWNvbXBvc2l0aW9uIGNhbiBiZSBkaXJlY3RseSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBtZXRob2RzIG1hdHJpeExVKCksIHBlcm11dGF0aW9uUCgpLgorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIG1lY2hhbmlzbS4KKyAgKiAKKyAgKiBcc2EgTWF0cml4QmFzZTo6cGFydGlhbFBpdkx1KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmludmVyc2UoKSwgTWF0cml4QmFzZTo6Y29tcHV0ZUludmVyc2UoKSwgY2xhc3MgRnVsbFBpdkxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgUGFydGlhbFBpdkxVCisgIDogcHVibGljIFNvbHZlckJhc2U8UGFydGlhbFBpdkxVPF9NYXRyaXhUeXBlPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFNvbHZlckJhc2U8UGFydGlhbFBpdkxVPiBCYXNlOworICAgIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShQYXJ0aWFsUGl2TFUpCisgICAgLy8gRklYTUUgU3RvcmFnZUluZGV4IGRlZmluZWQgaW4gRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFIHNob3VsZCBiZSBpbnQKKyAgICBlbnVtIHsKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25UeXBlOworICAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnM8Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBUcmFuc3Bvc2l0aW9uVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworCisgICAgLyoqCisgICAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBQYXJ0aWFsUGl2TFU6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpLgorICAgICAgKi8KKyAgICBQYXJ0aWFsUGl2TFUoKTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBQYXJ0aWFsUGl2TFUoKQorICAgICAgKi8KKyAgICBleHBsaWNpdCBQYXJ0aWFsUGl2TFUoSW5kZXggc2l6ZSk7CisKKyAgICAvKiogQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCBvZiB3aGljaCB0byBjb21wdXRlIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBUaGUgbWF0cml4IHNob3VsZCBoYXZlIGZ1bGwgcmFuayAoZS5nLiBpZiBpdCdzIHNxdWFyZSwgaXQgc2hvdWxkIGJlIGludmVydGlibGUpLgorICAgICAgKiBJZiB5b3UgbmVlZCB0byBkZWFsIHdpdGggbm9uLWZ1bGwgcmFuaywgdXNlIGNsYXNzIEZ1bGxQaXZMVSBpbnN0ZWFkLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgZXhwbGljaXQgUGFydGlhbFBpdkxVKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpOworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBcbGluayBJbnBsYWNlRGVjb21wb3NpdGlvbiBpbnBsYWNlIGRlY29tcG9zaXRpb24gXGVuZGxpbmsKKyAgICAgICoKKyAgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IG9mIHdoaWNoIHRvIGNvbXB1dGUgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIFRoZSBtYXRyaXggc2hvdWxkIGhhdmUgZnVsbCByYW5rIChlLmcuIGlmIGl0J3Mgc3F1YXJlLCBpdCBzaG91bGQgYmUgaW52ZXJ0aWJsZSkuCisgICAgICAqIElmIHlvdSBuZWVkIHRvIGRlYWwgd2l0aCBub24tZnVsbCByYW5rLCB1c2UgY2xhc3MgRnVsbFBpdkxVIGluc3RlYWQuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBQYXJ0aWFsUGl2TFUoRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgUGFydGlhbFBpdkxVJiBjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpIHsKKyAgICAgIG1fbHUgPSBtYXRyaXguZGVyaXZlZCgpOworICAgICAgY29tcHV0ZSgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgTFUgZGVjb21wb3NpdGlvbiBtYXRyaXg6IHRoZSB1cHBlci10cmlhbmd1bGFyIHBhcnQgaXMgVSwgdGhlCisgICAgICAqIHVuaXQtbG93ZXItdHJpYW5ndWxhciBwYXJ0IGlzIEwgKGF0IGxlYXN0IGZvciBzcXVhcmUgbWF0cmljZXM7IGluIHRoZSBub24tc3F1YXJlCisgICAgICAqIGNhc2UsIHNwZWNpYWwgY2FyZSBpcyBuZWVkZWQsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBGdWxsUGl2TFUpLgorICAgICAgKgorICAgICAgKiBcc2EgbWF0cml4TCgpLCBtYXRyaXhVKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeExVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbHU7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBtYXRyaXggUC4KKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgcGVybXV0YXRpb25QKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fcDsKKyAgICB9CisKKyAgICAvKiogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc29sdXRpb24geCB0byB0aGUgZXF1YXRpb24gQXg9Yiwgd2hlcmUgQSBpcyB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccGFyYW0gYiB0aGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBlcXVhdGlvbiB0byBzb2x2ZS4gQ2FuIGJlIGEgdmVjdG9yIG9yIGEgbWF0cml4LAorICAgICAgKiAgICAgICAgICB0aGUgb25seSByZXF1aXJlbWVudCBpbiBvcmRlciBmb3IgdGhlIGVxdWF0aW9uIHRvIG1ha2Ugc2Vuc2UgaXMgdGhhdAorICAgICAgKiAgICAgICAgICBiLnJvd3MoKT09QS5yb3dzKCksIHdoZXJlIEEgaXMgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgdGhlIHNvbHV0aW9uLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUGl2TFVfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFBhcnRpYWxQaXZMVV9zb2x2ZS5vdXQKKyAgICAgICoKKyAgICAgICogU2luY2UgdGhpcyBQYXJ0aWFsUGl2TFUgY2xhc3MgYXNzdW1lcyBhbnl3YXkgdGhhdCB0aGUgbWF0cml4IEEgaXMgaW52ZXJ0aWJsZSwgdGhlIHNvbHV0aW9uCisgICAgICAqIHRoZW9yZXRpY2FsbHkgZXhpc3RzIGFuZCBpcyB1bmlxdWUgcmVnYXJkbGVzcyBvZiBiLgorICAgICAgKgorICAgICAgKiBcc2EgVHJpYW5ndWxhclZpZXc6OnNvbHZlKCksIGludmVyc2UoKSwgY29tcHV0ZUludmVyc2UoKQorICAgICAgKi8KKyAgICAvLyBGSVhNRSB0aGlzIGlzIGEgY29weS1wYXN0ZSBvZiB0aGUgYmFzZS1jbGFzcyBtZW1iZXIgdG8gYWRkIHRoZSBpc0luaXRpYWxpemVkIGFzc2VydGlvbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IFNvbHZlPFBhcnRpYWxQaXZMVSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFNvbHZlPFBhcnRpYWxQaXZMVSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgcmVjaXByb2NhbCBjb25kaXRpb24gbnVtYmVyIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggXGMgKnRoaXMgaXMKKyAgICAgICAgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqLworICAgIGlubGluZSBSZWFsU2NhbGFyIHJjb25kKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpyY29uZF9lc3RpbWF0ZV9oZWxwZXIobV9sMV9ub3JtLCAqdGhpcyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIFRoZSBtYXRyaXggYmVpbmcgZGVjb21wb3NlZCBoZXJlIGlzIGFzc3VtZWQgdG8gYmUgaW52ZXJ0aWJsZS4gSWYgeW91IG5lZWQgdG8gY2hlY2sgZm9yCisgICAgICAqICAgICAgICAgIGludmVydGliaWxpdHksIHVzZSBjbGFzcyBGdWxsUGl2TFUgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogXHNhIE1hdHJpeEJhc2U6OmludmVyc2UoKSwgTFU6OmludmVyc2UoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgSW52ZXJzZTxQYXJ0aWFsUGl2TFU+IGludmVyc2UoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlBhcnRpYWxQaXZMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSW52ZXJzZTxQYXJ0aWFsUGl2TFU+KCp0aGlzKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIExVIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgRm9yIGZpeGVkLXNpemUgbWF0cmljZXMgb2Ygc2l6ZSB1cCB0byA0LCBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpIG9mZmVycworICAgICAgKiAgICAgICBvcHRpbWl6ZWQgcGF0aHMuCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIGEgZGV0ZXJtaW5hbnQgY2FuIGJlIHZlcnkgYmlnIG9yIHNtYWxsLCBzbyBmb3IgbWF0cmljZXMKKyAgICAgICogb2YgbGFyZ2UgZW5vdWdoIGRpbWVuc2lvbiwgdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdy4KKyAgICAgICoKKyAgICAgICogXHNhIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICAgICovCisgICAgU2NhbGFyIGRldGVybWluYW50KCkgY29uc3Q7CisKKyAgICBNYXRyaXhUeXBlIHJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdDsKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9sdS5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbHUuY29scygpOyB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgRHN0VHlwZT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0IHsKKyAgICAgLyogVGhlIGRlY29tcG9zaXRpb24gUEEgPSBMVSBjYW4gYmUgcmV3cml0dGVuIGFzIEEgPSBQXnstMX0gTCBVLgorICAgICAgKiBTbyB3ZSBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICAqIFN0ZXAgMTogY29tcHV0ZSBjID0gUGIuCisgICAgICAqIFN0ZXAgMjogcmVwbGFjZSBjIGJ5IHRoZSBzb2x1dGlvbiB4IHRvIEx4ID0gYy4KKyAgICAgICogU3RlcCAzOiByZXBsYWNlIGMgYnkgdGhlIHNvbHV0aW9uIHggdG8gVXggPSBjLgorICAgICAgKi8KKworICAgICAgZWlnZW5fYXNzZXJ0KHJocy5yb3dzKCkgPT0gbV9sdS5yb3dzKCkpOworCisgICAgICAvLyBTdGVwIDEKKyAgICAgIGRzdCA9IHBlcm11dGF0aW9uUCgpICogcmhzOworCisgICAgICAvLyBTdGVwIDIKKyAgICAgIG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlSW5QbGFjZShkc3QpOworCisgICAgICAvLyBTdGVwIDMKKyAgICAgIG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKGRzdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8Ym9vbCBDb25qdWdhdGUsIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIF9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0IHsKKyAgICAgLyogVGhlIGRlY29tcG9zaXRpb24gUEEgPSBMVSBjYW4gYmUgcmV3cml0dGVuIGFzIEEgPSBQXnstMX0gTCBVLgorICAgICAgKiBTbyB3ZSBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICAqIFN0ZXAgMTogY29tcHV0ZSBjID0gUGIuCisgICAgICAqIFN0ZXAgMjogcmVwbGFjZSBjIGJ5IHRoZSBzb2x1dGlvbiB4IHRvIEx4ID0gYy4KKyAgICAgICogU3RlcCAzOiByZXBsYWNlIGMgYnkgdGhlIHNvbHV0aW9uIHggdG8gVXggPSBjLgorICAgICAgKi8KKworICAgICAgZWlnZW5fYXNzZXJ0KHJocy5yb3dzKCkgPT0gbV9sdS5jb2xzKCkpOworCisgICAgICBpZiAoQ29uanVnYXRlKSB7CisgICAgICAgIC8vIFN0ZXAgMQorICAgICAgICBkc3QgPSBtX2x1LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKS5zb2x2ZShyaHMpOworICAgICAgICAvLyBTdGVwIDIKKyAgICAgICAgbV9sdS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkuYWRqb2ludCgpLnNvbHZlSW5QbGFjZShkc3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU3RlcCAxCisgICAgICAgIGRzdCA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudHJhbnNwb3NlKCkuc29sdmUocmhzKTsKKyAgICAgICAgLy8gU3RlcCAyCisgICAgICAgIG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnRyYW5zcG9zZSgpLnNvbHZlSW5QbGFjZShkc3QpOworICAgICAgfQorICAgICAgLy8gU3RlcCAzCisgICAgICBkc3QgPSBwZXJtdXRhdGlvblAoKS50cmFuc3Bvc2UoKSAqIGRzdDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorCisgICAgc3RhdGljIHZvaWQgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpOworICAgIH0KKworICAgIHZvaWQgY29tcHV0ZSgpOworCisgICAgTWF0cml4VHlwZSBtX2x1OworICAgIFBlcm11dGF0aW9uVHlwZSBtX3A7CisgICAgVHJhbnNwb3NpdGlvblR5cGUgbV9yb3dzVHJhbnNwb3NpdGlvbnM7CisgICAgUmVhbFNjYWxhciBtX2wxX25vcm07CisgICAgc2lnbmVkIGNoYXIgbV9kZXRfcDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OlBhcnRpYWxQaXZMVSgpCisgIDogbV9sdSgpLAorICAgIG1fcCgpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKCksCisgICAgbV9sMV9ub3JtKDApLAorICAgIG1fZGV0X3AoMCksCisgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpQYXJ0aWFsUGl2TFUoSW5kZXggc2l6ZSkKKyAgOiBtX2x1KHNpemUsIHNpemUpLAorICAgIG1fcChzaXplKSwKKyAgICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucyhzaXplKSwKKyAgICBtX2wxX25vcm0oMCksCisgICAgbV9kZXRfcCgwKSwKKyAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CitQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OlBhcnRpYWxQaXZMVShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICA6IG1fbHUobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSwKKyAgICBtX3AobWF0cml4LnJvd3MoKSksCisgICAgbV9yb3dzVHJhbnNwb3NpdGlvbnMobWF0cml4LnJvd3MoKSksCisgICAgbV9sMV9ub3JtKDApLAorICAgIG1fZGV0X3AoMCksCisgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQoreworICBjb21wdXRlKG1hdHJpeC5kZXJpdmVkKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpQYXJ0aWFsUGl2TFUoRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgOiBtX2x1KG1hdHJpeC5kZXJpdmVkKCkpLAorICAgIG1fcChtYXRyaXgucm93cygpKSwKKyAgICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucyhtYXRyaXgucm93cygpKSwKKyAgICBtX2wxX25vcm0oMCksCisgICAgbV9kZXRfcCgwKSwKKyAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCit7CisgIGNvbXB1dGUoKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCBUaGlzIGlzIHRoZSBibG9ja2VkIHZlcnNpb24gb2YgZnVsbHBpdmx1X3VuYmxvY2tlZCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIHR5cGVuYW1lIFBpdkluZGV4Pgorc3RydWN0IHBhcnRpYWxfbHVfaW1wbAoreworICAvLyBGSVhNRSBhZGQgYSBzdHJpZGUgdG8gTWFwLCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgbWFwcGluZyBiZWNvbWVzIGVhc2llciwKKyAgLy8gYW5vdGhlciBvcHRpb24gd291bGQgYmUgdG8gY3JlYXRlIGFuIGV4cHJlc3Npb24gYmVpbmcgYWJsZSB0byBhdXRvbWF0aWNhbGx5CisgIC8vIHdhcnAgYW55IE1hcCwgTWF0cml4LCBhbmQgQmxvY2sgZXhwcmVzc2lvbnMgYXMgYSB1bmlxdWUgdHlwZSwgYnV0IHNpbmNlIHRoYXQncyBleGFjdGx5CisgIC8vIGEgTWFwICsgc3RyaWRlLCB3aHkgbm90IGFkZGluZyBhIHN0cmlkZSB0byBNYXAsIGFuZCBjb252ZW5pZW50IGN0b3JzIGZyb20gYSBNYXRyaXgsCisgIC8vIGFuZCBCbG9jay4KKyAgdHlwZWRlZiBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgU3RvcmFnZU9yZGVyPiA+IE1hcExVOworICB0eXBlZGVmIEJsb2NrPE1hcExVLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYyxEeW5hbWljPiBCbG9ja1R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIC8qKiBcaW50ZXJuYWwgcGVyZm9ybXMgdGhlIExVIGRlY29tcG9zaXRpb24gaW4tcGxhY2Ugb2YgdGhlIG1hdHJpeCBcYSBsdQorICAgICogdXNpbmcgYW4gdW5ibG9ja2VkIGFsZ29yaXRobS4KKyAgICAqCisgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByb3cgdHJhbnNwb3NpdGlvbnMgaW4gdGhlCisgICAgKiB2ZWN0b3IgXGEgcm93X3RyYW5zcG9zaXRpb25zIHdoaWNoIG11c3QgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIG51bWJlcgorICAgICogb2YgY29sdW1ucyBvZiB0aGUgbWF0cml4IFxhIGx1LCBhbmQgYW4gaW50ZWdlciBcYSBuYl90cmFuc3Bvc2l0aW9ucworICAgICogd2hpY2ggcmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiB0cmFuc3Bvc2l0aW9ucy4KKyAgICAqCisgICAgKiBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHBpdm90IHdoaWNoIGlzIGV4YWN0bHkgemVybyBpZiBhbnksIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgICAqLworICBzdGF0aWMgSW5kZXggdW5ibG9ja2VkX2x1KE1hdHJpeFR5cGUmIGx1LCBQaXZJbmRleCogcm93X3RyYW5zcG9zaXRpb25zLCBQaXZJbmRleCYgbmJfdHJhbnNwb3NpdGlvbnMpCisgIHsKKyAgICB0eXBlZGVmIHNjYWxhcl9zY29yZV9jb2VmZl9vcDxTY2FsYXI+IFNjb3Jpbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTY29yaW5nOjpyZXN1bHRfdHlwZSBTY29yZTsKKyAgICBjb25zdCBJbmRleCByb3dzID0gbHUucm93cygpOworICAgIGNvbnN0IEluZGV4IGNvbHMgPSBsdS5jb2xzKCk7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikocm93cyxjb2xzKTsKKyAgICBuYl90cmFuc3Bvc2l0aW9ucyA9IDA7CisgICAgSW5kZXggZmlyc3RfemVyb19waXZvdCA9IC0xOworICAgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgICB7CisgICAgICBJbmRleCBycm93cyA9IHJvd3Mtay0xOworICAgICAgSW5kZXggcmNvbHMgPSBjb2xzLWstMTsKKworICAgICAgSW5kZXggcm93X29mX2JpZ2dlc3RfaW5fY29sOworICAgICAgU2NvcmUgYmlnZ2VzdF9pbl9jb3JuZXIKKyAgICAgICAgPSBsdS5jb2woaykudGFpbChyb3dzLWspLnVuYXJ5RXhwcihTY29yaW5nKCkpLm1heENvZWZmKCZyb3dfb2ZfYmlnZ2VzdF9pbl9jb2wpOworICAgICAgcm93X29mX2JpZ2dlc3RfaW5fY29sICs9IGs7CisKKyAgICAgIHJvd190cmFuc3Bvc2l0aW9uc1trXSA9IFBpdkluZGV4KHJvd19vZl9iaWdnZXN0X2luX2NvbCk7CisKKyAgICAgIGlmKGJpZ2dlc3RfaW5fY29ybmVyICE9IFNjb3JlKDApKQorICAgICAgeworICAgICAgICBpZihrICE9IHJvd19vZl9iaWdnZXN0X2luX2NvbCkKKyAgICAgICAgeworICAgICAgICAgIGx1LnJvdyhrKS5zd2FwKGx1LnJvdyhyb3dfb2ZfYmlnZ2VzdF9pbl9jb2wpKTsKKyAgICAgICAgICArK25iX3RyYW5zcG9zaXRpb25zOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUUgc2hhbGwgd2UgaW50cm9kdWNlIGEgc2FmZSBxdW90aWVudCBleHByZXNzaW9uIGluIGNhcyAxL2x1LmNvZWZmKGssaykKKyAgICAgICAgLy8gb3ZlcmZsb3cgYnV0IG5vdCB0aGUgYWN0dWFsIHF1b3RpZW50PworICAgICAgICBsdS5jb2woaykudGFpbChycm93cykgLz0gbHUuY29lZmYoayxrKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZmlyc3RfemVyb19waXZvdD09LTEpCisgICAgICB7CisgICAgICAgIC8vIHRoZSBwaXZvdCBpcyBleGFjdGx5IHplcm8sIHdlIHJlY29yZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHBpdm90IHdoaWNoIGlzIGV4YWN0bHkgMCwKKyAgICAgICAgLy8gYW5kIGNvbnRpbnVlIHRoZSBmYWN0b3JpemF0aW9uIHN1Y2ggd2Ugc3RpbGwgaGF2ZSBBID0gUExVCisgICAgICAgIGZpcnN0X3plcm9fcGl2b3QgPSBrOworICAgICAgfQorCisgICAgICBpZihrPHJvd3MtMSkKKyAgICAgICAgbHUuYm90dG9tUmlnaHRDb3JuZXIocnJvd3MscmNvbHMpLm5vYWxpYXMoKSAtPSBsdS5jb2woaykudGFpbChycm93cykgKiBsdS5yb3coaykudGFpbChyY29scyk7CisgICAgfQorICAgIHJldHVybiBmaXJzdF96ZXJvX3Bpdm90OworICB9CisKKyAgLyoqIFxpbnRlcm5hbCBwZXJmb3JtcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBpbi1wbGFjZSBvZiB0aGUgbWF0cml4IHJlcHJlc2VudGVkCisgICAgKiBieSB0aGUgdmFyaWFibGVzIFxhIHJvd3MsIFxhIGNvbHMsIFxhIGx1X2RhdGEsIGFuZCBcYSBsdV9zdHJpZGUgdXNpbmcgYQorICAgICogcmVjdXJzaXZlLCBibG9ja2VkIGFsZ29yaXRobS4KKyAgICAqCisgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByb3cgdHJhbnNwb3NpdGlvbnMgaW4gdGhlCisgICAgKiB2ZWN0b3IgXGEgcm93X3RyYW5zcG9zaXRpb25zIHdoaWNoIG11c3QgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIG51bWJlcgorICAgICogb2YgY29sdW1ucyBvZiB0aGUgbWF0cml4IFxhIGx1LCBhbmQgYW4gaW50ZWdlciBcYSBuYl90cmFuc3Bvc2l0aW9ucworICAgICogd2hpY2ggcmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiB0cmFuc3Bvc2l0aW9ucy4KKyAgICAqCisgICAgKiBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHBpdm90IHdoaWNoIGlzIGV4YWN0bHkgemVybyBpZiBhbnksIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgICAqCisgICAgKiBcbm90ZSBUaGlzIHZlcnkgbG93IGxldmVsIGludGVyZmFjZSB1c2luZyBwb2ludGVycywgZXRjLiBpcyB0bzoKKyAgICAqICAgMSAtIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluc3RhbmNpYXRpb25zIHRvIHRoZSBzdHJpY3QgbWluaW11bQorICAgICogICAyIC0gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBpbnN0YW5jaWF0aW9ucyB3aXRoIEJsb2NrPEJsb2NrPEJsb2NrPC4uLj4gPiA+CisgICAgKi8KKyAgc3RhdGljIEluZGV4IGJsb2NrZWRfbHUoSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBsdV9kYXRhLCBJbmRleCBsdVN0cmlkZSwgUGl2SW5kZXgqIHJvd190cmFuc3Bvc2l0aW9ucywgUGl2SW5kZXgmIG5iX3RyYW5zcG9zaXRpb25zLCBJbmRleCBtYXhCbG9ja1NpemU9MjU2KQorICB7CisgICAgTWFwTFUgbHUxKGx1X2RhdGEsU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcj9yb3dzOmx1U3RyaWRlLFN0b3JhZ2VPcmRlcj09Um93TWFqb3I/bHVTdHJpZGU6Y29scyk7CisgICAgTWF0cml4VHlwZSBsdShsdTEsMCwwLHJvd3MsY29scyk7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLGNvbHMpOworCisgICAgLy8gaWYgdGhlIG1hdHJpeCBpcyB0b28gc21hbGwsIG5vIGJsb2NraW5nOgorICAgIGlmKHNpemU8PTE2KQorICAgIHsKKyAgICAgIHJldHVybiB1bmJsb2NrZWRfbHUobHUsIHJvd190cmFuc3Bvc2l0aW9ucywgbmJfdHJhbnNwb3NpdGlvbnMpOworICAgIH0KKworICAgIC8vIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHRvIHRoZSBzaXplCisgICAgLy8gb2YgdGhlIG1hdHJpeCBzbyB0aGF0IHRoZXJlIGlzIGVub3VnaCBzdWIgYmxvY2tzOgorICAgIEluZGV4IGJsb2NrU2l6ZTsKKyAgICB7CisgICAgICBibG9ja1NpemUgPSBzaXplLzg7CisgICAgICBibG9ja1NpemUgPSAoYmxvY2tTaXplLzE2KSoxNjsKKyAgICAgIGJsb2NrU2l6ZSA9IChzdGQ6Om1pbikoKHN0ZDo6bWF4KShibG9ja1NpemUsSW5kZXgoOCkpLCBtYXhCbG9ja1NpemUpOworICAgIH0KKworICAgIG5iX3RyYW5zcG9zaXRpb25zID0gMDsKKyAgICBJbmRleCBmaXJzdF96ZXJvX3Bpdm90ID0gLTE7CisgICAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgays9YmxvY2tTaXplKQorICAgIHsKKyAgICAgIEluZGV4IGJzID0gKHN0ZDo6bWluKShzaXplLWssYmxvY2tTaXplKTsgLy8gYWN0dWFsIHNpemUgb2YgdGhlIGJsb2NrCisgICAgICBJbmRleCB0cm93cyA9IHJvd3MgLSBrIC0gYnM7IC8vIHRyYWlsaW5nIHJvd3MKKyAgICAgIEluZGV4IHRzaXplID0gc2l6ZSAtIGsgLSBiczsgLy8gdHJhaWxpbmcgc2l6ZQorCisgICAgICAvLyBwYXJ0aXRpb24gdGhlIG1hdHJpeDoKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBBMDAgfCBBMDEgfCBBMDIKKyAgICAgIC8vIGx1ICA9IEFfMCB8IEFfMSB8IEFfMiA9ICBBMTAgfCBBMTEgfCBBMTIKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBBMjAgfCBBMjEgfCBBMjIKKyAgICAgIEJsb2NrVHlwZSBBXzAobHUsMCwwLHJvd3Msayk7CisgICAgICBCbG9ja1R5cGUgQV8yKGx1LDAsayticyxyb3dzLHRzaXplKTsKKyAgICAgIEJsb2NrVHlwZSBBMTEobHUsayxrLGJzLGJzKTsKKyAgICAgIEJsb2NrVHlwZSBBMTIobHUsayxrK2JzLGJzLHRzaXplKTsKKyAgICAgIEJsb2NrVHlwZSBBMjEobHUsayticyxrLHRyb3dzLGJzKTsKKyAgICAgIEJsb2NrVHlwZSBBMjIobHUsayticyxrK2JzLHRyb3dzLHRzaXplKTsKKworICAgICAgUGl2SW5kZXggbmJfdHJhbnNwb3NpdGlvbnNfaW5fcGFuZWw7CisgICAgICAvLyByZWN1cnNpdmVseSBjYWxsIHRoZSBibG9ja2VkIExVIGFsZ29yaXRobSBvbiBbQTExXlQgQTIxXlRdXlQKKyAgICAgIC8vIHdpdGggYSB2ZXJ5IHNtYWxsIGJsb2NraW5nIHNpemU6CisgICAgICBJbmRleCByZXQgPSBibG9ja2VkX2x1KHRyb3dzK2JzLCBicywgJmx1LmNvZWZmUmVmKGssayksIGx1U3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHJvd190cmFuc3Bvc2l0aW9ucytrLCBuYl90cmFuc3Bvc2l0aW9uc19pbl9wYW5lbCwgMTYpOworICAgICAgaWYocmV0Pj0wICYmIGZpcnN0X3plcm9fcGl2b3Q9PS0xKQorICAgICAgICBmaXJzdF96ZXJvX3Bpdm90ID0gaytyZXQ7CisKKyAgICAgIG5iX3RyYW5zcG9zaXRpb25zICs9IG5iX3RyYW5zcG9zaXRpb25zX2luX3BhbmVsOworICAgICAgLy8gdXBkYXRlIHBlcm11dGF0aW9ucyBhbmQgYXBwbHkgdGhlbSB0byBBXzAKKyAgICAgIGZvcihJbmRleCBpPWs7IGk8ayticzsgKytpKQorICAgICAgeworICAgICAgICBJbmRleCBwaXYgPSAocm93X3RyYW5zcG9zaXRpb25zW2ldICs9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFBpdkluZGV4PihrKSk7CisgICAgICAgIEFfMC5yb3coaSkuc3dhcChBXzAucm93KHBpdikpOworICAgICAgfQorCisgICAgICBpZih0cm93cykKKyAgICAgIHsKKyAgICAgICAgLy8gYXBwbHkgcGVybXV0YXRpb25zIHRvIEFfMgorICAgICAgICBmb3IoSW5kZXggaT1rO2k8ayticzsgKytpKQorICAgICAgICAgIEFfMi5yb3coaSkuc3dhcChBXzIucm93KHJvd190cmFuc3Bvc2l0aW9uc1tpXSkpOworCisgICAgICAgIC8vIEExMiA9IEExMV4tMSBBMTIKKyAgICAgICAgQTExLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS5zb2x2ZUluUGxhY2UoQTEyKTsKKworICAgICAgICBBMjIubm9hbGlhcygpIC09IEEyMSAqIEExMjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpcnN0X3plcm9fcGl2b3Q7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwgcGVyZm9ybXMgdGhlIExVIGRlY29tcG9zaXRpb24gd2l0aCBwYXJ0aWFsIHBpdm90aW5nIGluLXBsYWNlLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGU+Cit2b2lkIHBhcnRpYWxfbHVfaW5wbGFjZShNYXRyaXhUeXBlJiBsdSwgVHJhbnNwb3NpdGlvblR5cGUmIHJvd190cmFuc3Bvc2l0aW9ucywgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGU6OlN0b3JhZ2VJbmRleCYgbmJfdHJhbnNwb3NpdGlvbnMpCit7CisgIGVpZ2VuX2Fzc2VydChsdS5jb2xzKCkgPT0gcm93X3RyYW5zcG9zaXRpb25zLnNpemUoKSk7CisgIGVpZ2VuX2Fzc2VydCgoJnJvd190cmFuc3Bvc2l0aW9ucy5jb2VmZlJlZigxKS0mcm93X3RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKDApKSA9PSAxKTsKKworICBwYXJ0aWFsX2x1X2ltcGwKKyAgICA8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Sb3dNYWpvcjpDb2xNYWpvciwgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGU6OlN0b3JhZ2VJbmRleD4KKyAgICA6OmJsb2NrZWRfbHUobHUucm93cygpLCBsdS5jb2xzKCksICZsdS5jb2VmZlJlZigwLDApLCBsdS5vdXRlclN0cmlkZSgpLCAmcm93X3RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKDApLCBuYl90cmFuc3Bvc2l0aW9ucyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OmNvbXB1dGUoKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisKKyAgLy8gdGhlIHJvdyBwZXJtdXRhdGlvbiBpcyBzdG9yZWQgYXMgaW50IGluZGljZXMsIHNvIGp1c3QgdG8gYmUgc3VyZToKKyAgZWlnZW5fYXNzZXJ0KG1fbHUucm93cygpPE51bVRyYWl0czxpbnQ+OjpoaWdoZXN0KCkpOworCisgIG1fbDFfbm9ybSA9IG1fbHUuY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCkubWF4Q29lZmYoKTsKKworICBlaWdlbl9hc3NlcnQobV9sdS5yb3dzKCkgPT0gbV9sdS5jb2xzKCkgJiYgIlBhcnRpYWxQaXZMVSBpcyBvbmx5IGZvciBzcXVhcmUgKGFuZCBtb3Jlb3ZlciBpbnZlcnRpYmxlKSBtYXRyaWNlcyIpOworICBjb25zdCBJbmRleCBzaXplID0gbV9sdS5yb3dzKCk7CisKKyAgbV9yb3dzVHJhbnNwb3NpdGlvbnMucmVzaXplKHNpemUpOworCisgIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlOjpTdG9yYWdlSW5kZXggbmJfdHJhbnNwb3NpdGlvbnM7CisgIGludGVybmFsOjpwYXJ0aWFsX2x1X2lucGxhY2UobV9sdSwgbV9yb3dzVHJhbnNwb3NpdGlvbnMsIG5iX3RyYW5zcG9zaXRpb25zKTsKKyAgbV9kZXRfcCA9IChuYl90cmFuc3Bvc2l0aW9ucyUyKSA/IC0xIDogMTsKKworICBtX3AgPSBtX3Jvd3NUcmFuc3Bvc2l0aW9uczsKKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpTY2FsYXIgUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpkZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlBhcnRpYWxQaXZMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIHJldHVybiBTY2FsYXIobV9kZXRfcCkgKiBtX2x1LmRpYWdvbmFsKCkucHJvZCgpOworfQorCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCByZXByZXNlbnRlZCBieSB0aGUgZGVjb21wb3NpdGlvbiwKKyAqIGkuZS4sIGl0IHJldHVybnMgdGhlIHByb2R1Y3Q6IFBeey0xfSBMIFUuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBkZWJ1ZyBwdXJwb3NlLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpyZWNvbnN0cnVjdGVkTWF0cml4KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAvLyBMVQorICBNYXRyaXhUeXBlIHJlcyA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKQorICAgICAgICAgICAgICAgICAqIG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisKKyAgLy8gUF57LTF9KExVKQorICByZXMgPSBtX3AuaW52ZXJzZSgpICogcmVzOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKioqKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioqKiogSW1wbGVtZW50YXRpb24gb2YgaW52ZXJzZSgpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIEludmVyc2U8UGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+ID4sIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFBhcnRpYWxQaXZMVTxNYXRyaXhUeXBlPjo6U2NhbGFyPiwgRGVuc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+IEx1VHlwZTsKKyAgdHlwZWRlZiBJbnZlcnNlPEx1VHlwZT4gU3JjWHByVHlwZTsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBMdVR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIGRzdCA9IHNyYy5uZXN0ZWRFeHByZXNzaW9uKCkuc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkoc3JjLnJvd3MoKSwgc3JjLmNvbHMoKSkpOworICB9Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKiBNYXRyaXhCYXNlIG1ldGhvZHMgKioqKioqKi8KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIFxyZXR1cm4gdGhlIHBhcnRpYWwtcGl2b3RpbmcgTFUgZGVjb21wb3NpdGlvbiBvZiBcYyAqdGhpcy4KKyAgKgorICAqIFxzYSBjbGFzcyBQYXJ0aWFsUGl2TFUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgUGFydGlhbFBpdkxVPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6cGFydGlhbFBpdkx1KCkgY29uc3QKK3sKKyAgcmV0dXJuIFBhcnRpYWxQaXZMVTxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIFN5bm9ueW0gb2YgcGFydGlhbFBpdkx1KCkuCisgICoKKyAgKiBccmV0dXJuIHRoZSBwYXJ0aWFsLXBpdm90aW5nIExVIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgUGFydGlhbFBpdkxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IFBhcnRpYWxQaXZMVTx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46Omx1KCkgY29uc3QKK3sKKyAgcmV0dXJuIFBhcnRpYWxQaXZMVTxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJUSUFMTFVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0xVL1BhcnRpYWxQaXZMVV9MQVBBQ0tFLmggYi9FaWdlbi9zcmMvTFUvUGFydGlhbFBpdkxVX0xBUEFDS0UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTUxNjhhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0xVL1BhcnRpYWxQaXZMVV9MQVBBQ0tFLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIExBUEFDS2UKKyAqICAgICBMVSBkZWNvbXBvc2l0aW9uIHdpdGggcGFydGlhbCBwaXZvdGluZyBiYXNlZCBvbiBMQVBBQ0tFXz9nZXRyZiBmdW5jdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9QQVJUSUFMTFVfTEFQQUNLX0gKKyNkZWZpbmUgRUlHRU5fUEFSVElBTExVX0xBUEFDS19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgZGF0YSB0eXBlcyBzdXBwb3J0ZWQgYnkgTEFQQUNLZSAqLworCisjZGVmaW5lIEVJR0VOX0xBUEFDS0VfTFVfUEFSVFBJVihFSUdUWVBFLCBMQVBBQ0tFX1RZUEUsIExBUEFDS0VfUFJFRklYKSBcCit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyPiBcCitzdHJ1Y3QgcGFydGlhbF9sdV9pbXBsPEVJR1RZUEUsIFN0b3JhZ2VPcmRlciwgbGFwYWNrX2ludD4gXAoreyBcCisgIC8qIFxpbnRlcm5hbCBwZXJmb3JtcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBpbi1wbGFjZSBvZiB0aGUgbWF0cml4IHJlcHJlc2VudGVkICovIFwKKyAgc3RhdGljIGxhcGFja19pbnQgYmxvY2tlZF9sdShJbmRleCByb3dzLCBJbmRleCBjb2xzLCBFSUdUWVBFKiBsdV9kYXRhLCBJbmRleCBsdVN0cmlkZSwgbGFwYWNrX2ludCogcm93X3RyYW5zcG9zaXRpb25zLCBsYXBhY2tfaW50JiBuYl90cmFuc3Bvc2l0aW9ucywgbGFwYWNrX2ludCBtYXhCbG9ja1NpemU9MjU2KSBcCisgIHsgXAorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShtYXhCbG9ja1NpemUpO1wKKyAgICBsYXBhY2tfaW50IG1hdHJpeF9vcmRlciwgZmlyc3RfemVyb19waXZvdDsgXAorICAgIGxhcGFja19pbnQgbSwgbiwgbGRhLCAqaXBpdiwgaW5mbzsgXAorICAgIEVJR1RZUEUqIGE7IFwKKy8qIFNldCB1cCBwYXJhbWV0ZXJzIGZvciA/Z2V0cmYgKi8gXAorICAgIG1hdHJpeF9vcmRlciA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBMQVBBQ0tfUk9XX01BSk9SIDogTEFQQUNLX0NPTF9NQUpPUjsgXAorICAgIGxkYSA9IGNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4obHVTdHJpZGUpOyBcCisgICAgYSA9IGx1X2RhdGE7IFwKKyAgICBpcGl2ID0gcm93X3RyYW5zcG9zaXRpb25zOyBcCisgICAgbSA9IGNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4ocm93cyk7IFwKKyAgICBuID0gY29udmVydF9pbmRleDxsYXBhY2tfaW50Pihjb2xzKTsgXAorICAgIG5iX3RyYW5zcG9zaXRpb25zID0gMDsgXAorXAorICAgIGluZm8gPSBMQVBBQ0tFXyMjTEFQQUNLRV9QUkVGSVgjI2dldHJmKCBtYXRyaXhfb3JkZXIsIG0sIG4sIChMQVBBQ0tFX1RZUEUqKWEsIGxkYSwgaXBpdiApOyBcCitcCisgICAgZm9yKGludCBpPTA7aTxtO2krKykgeyBpcGl2W2ldLS07IGlmIChpcGl2W2ldIT1pKSBuYl90cmFuc3Bvc2l0aW9ucysrOyB9IFwKK1wKKyAgICBlaWdlbl9hc3NlcnQoaW5mbyA+PSAwKTsgXAorLyogc29tZXRoaW5nIHNob3VsZCBiZSBkb25lIHdpdGggbmJfdHJhbnNwb3NpdGlvbnMgKi8gXAorXAorICAgIGZpcnN0X3plcm9fcGl2b3QgPSBpbmZvOyBcCisgICAgcmV0dXJuIGZpcnN0X3plcm9fcGl2b3Q7IFwKKyAgfSBcCit9OworCitFSUdFTl9MQVBBQ0tFX0xVX1BBUlRQSVYoZG91YmxlLCBkb3VibGUsIGQpCitFSUdFTl9MQVBBQ0tFX0xVX1BBUlRQSVYoZmxvYXQsIGZsb2F0LCBzKQorRUlHRU5fTEFQQUNLRV9MVV9QQVJUUElWKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIHopCitFSUdFTl9MQVBBQ0tFX0xVX1BBUlRQSVYoc2NvbXBsZXgsIGxhcGFja19jb21wbGV4X2Zsb2F0LCAgYykKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFSVElBTExVX0xBUEFDS19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvYXJjaC9JbnZlcnNlX1NTRS5oIGIvRWlnZW4vc3JjL0xVL2FyY2gvSW52ZXJzZV9TU0UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmI2NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0xVL2FyY2gvSW52ZXJzZV9TU0UuaApAQCAtMCwwICsxLDMzOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEgSW50ZWwgQ29ycG9yYXRpb24KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoZSBTU0UgY29kZSBmb3IgdGhlIDR4NCBmbG9hdCBhbmQgZG91YmxlIG1hdHJpeCBpbnZlcnNlIGluIHRoaXMgZmlsZQorLy8gY29tZXMgZnJvbSB0aGUgZm9sbG93aW5nIEludGVsJ3MgbGlicmFyeToKKy8vIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvb3B0aW1pemVkLW1hdHJpeC1saWJyYXJ5LWZvci11c2Utd2l0aC10aGUtaW50ZWwtcGVudGl1bXItNC1wcm9jZXNzb3JzLXNzZTItaW5zdHJ1Y3Rpb25zLworLy8KKy8vIEhlcmUgaXMgdGhlIHJlc3BlY3RpdmUgY29weXJpZ2h0IGFuZCBsaWNlbnNlIHN0YXRlbWVudDoKKy8vCisvLyAgIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3Jwb3JhdGlvbi4KKy8vCisvLyBQZXJtaXRpb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGRpc3RyaWJ1dGUgYW5kIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcworLy8gb2YgdGhpcyBsaWJyYXJ5IGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUsIHByb3ZpZGVkLCB0aGF0IHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBzdGF0ZW1lbnQgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisvLyBJbnRlbCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisvLyBhbnkgcHVycG9zZSwgYW5kIHNwZWNpZmljYWxseSBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMuCisvLyBTZWUgTEVHQUwuVFhUIGZvciBhbGwgdGhlIGxlZ2FsIGluZm9ybWF0aW9uLgorCisjaWZuZGVmIEVJR0VOX0lOVkVSU0VfU1NFX0gKKyNkZWZpbmUgRUlHRU5fSU5WRVJTRV9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2Vfc2l6ZTQ8QXJjaGl0ZWN0dXJlOjpTU0UsIGZsb2F0LCBNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPgoreworICBlbnVtIHsKKyAgICBNYXRyaXhBbGlnbm1lbnQgICAgID0gdHJhaXRzPE1hdHJpeFR5cGU+OjpBbGlnbm1lbnQsCisgICAgUmVzdWx0QWxpZ25tZW50ICAgICA9IHRyYWl0czxSZXN1bHRUeXBlPjo6QWxpZ25tZW50LAorICAgIFN0b3JhZ2VPcmRlcnNNYXRjaCAgPSAoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpID09IChSZXN1bHRUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwoTWF0cml4VHlwZTo6RmxhZ3MmTGluZWFyQWNjZXNzQml0KSxNYXRyaXhUeXBlIGNvbnN0ICYsdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3Q+Ojp0eXBlIEFjdHVhbE1hdHJpeFR5cGU7CisgIAorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICBBY3R1YWxNYXRyaXhUeXBlIG1hdHJpeChtYXQpOworICAgIEVJR0VOX0FMSUdOMTYgY29uc3QgdW5zaWduZWQgaW50IF9TaWduX1BOTlBbNF0gPSB7IDB4MDAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDAgfTsKKworICAgIC8vIExvYWQgdGhlIGZ1bGwgbWF0cml4IGludG8gcmVnaXN0ZXJzCisgICAgX19tMTI4IF9MMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggMCk7CisgICAgX19tMTI4IF9MMiA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggNCk7CisgICAgX19tMTI4IF9MMyA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggOCk7CisgICAgX19tMTI4IF9MNCA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PigxMik7CisKKyAgICAvLyBUaGUgaW52ZXJzZSBpcyBjYWxjdWxhdGVkIHVzaW5nICJEaXZpZGUgYW5kIENvbnF1ZXIiIHRlY2huaXF1ZS4gVGhlCisgICAgLy8gb3JpZ2luYWwgbWF0cml4IGlzIGRpdmlkZSBpbnRvIGZvdXIgMngyIHN1Yi1tYXRyaWNlcy4gU2luY2UgZWFjaAorICAgIC8vIHJlZ2lzdGVyIGhvbGRzIGZvdXIgbWF0cml4IGVsZW1lbnQsIHRoZSBzbWFsbGVyIG1hdHJpY2VzIGFyZQorICAgIC8vIHJlcHJlc2VudGVkIGFzIGEgcmVnaXN0ZXJzLiBIZW5jZSB3ZSBnZXQgYSBiZXR0ZXIgbG9jYWxpdHkgb2YgdGhlCisgICAgLy8gY2FsY3VsYXRpb25zLgorCisgICAgX19tMTI4IEEsIEIsIEMsIEQ7IC8vIHRoZSBmb3VyIHN1Yi1tYXRyaWNlcworICAgIGlmKCFTdG9yYWdlT3JkZXJzTWF0Y2gpCisgICAgeworICAgICAgQSA9IF9tbV91bnBhY2tsb19wcyhfTDEsIF9MMik7CisgICAgICBCID0gX21tX3VucGFja2xvX3BzKF9MMywgX0w0KTsKKyAgICAgIEMgPSBfbW1fdW5wYWNraGlfcHMoX0wxLCBfTDIpOworICAgICAgRCA9IF9tbV91bnBhY2toaV9wcyhfTDMsIF9MNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBBID0gX21tX21vdmVsaF9wcyhfTDEsIF9MMik7CisgICAgICBCID0gX21tX21vdmVobF9wcyhfTDIsIF9MMSk7CisgICAgICBDID0gX21tX21vdmVsaF9wcyhfTDMsIF9MNCk7CisgICAgICBEID0gX21tX21vdmVobF9wcyhfTDQsIF9MMyk7CisgICAgfQorCisgICAgX19tMTI4IGlBLCBpQiwgaUMsIGlELCAgICAgICAgICAgICAgICAgLy8gcGFydGlhbCBpbnZlcnNlIG9mIHRoZSBzdWItbWF0cmljZXMKKyAgICAgICAgICAgIERDLCBBQjsKKyAgICBfX20xMjggZEEsIGRCLCBkQywgZEQ7ICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmFudCBvZiB0aGUgc3ViLW1hdHJpY2VzCisgICAgX19tMTI4IGRldCwgZCwgZDEsIGQyOworICAgIF9fbTEyOCByZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2lwcm9jYWwgb2YgdGhlIGRldGVybWluYW50CisKKyAgICAvLyAgQUIgPSBBIyAqIEIKKyAgICBBQiA9IF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQSxBLDB4MEYpLCBCKTsKKyAgICBBQiA9IF9tbV9zdWJfcHMoQUIsX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhBLEEsMHhBNSksIF9tbV9zaHVmZmxlX3BzKEIsQiwweDRFKSkpOworICAgIC8vICBEQyA9IEQjICogQworICAgIERDID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhELEQsMHgwRiksIEMpOworICAgIERDID0gX21tX3N1Yl9wcyhEQyxfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEQsRCwweEE1KSwgX21tX3NodWZmbGVfcHMoQyxDLDB4NEUpKSk7CisKKyAgICAvLyAgZEEgPSB8QXwKKyAgICBkQSA9IF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQSwgQSwgMHg1RiksQSk7CisgICAgZEEgPSBfbW1fc3ViX3NzKGRBLCBfbW1fbW92ZWhsX3BzKGRBLGRBKSk7CisgICAgLy8gIGRCID0gfEJ8CisgICAgZEIgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEIsIEIsIDB4NUYpLEIpOworICAgIGRCID0gX21tX3N1Yl9zcyhkQiwgX21tX21vdmVobF9wcyhkQixkQikpOworCisgICAgLy8gIGRDID0gfEN8CisgICAgZEMgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEMsIEMsIDB4NUYpLEMpOworICAgIGRDID0gX21tX3N1Yl9zcyhkQywgX21tX21vdmVobF9wcyhkQyxkQykpOworICAgIC8vICBkRCA9IHxEfAorICAgIGREID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhELCBELCAweDVGKSxEKTsKKyAgICBkRCA9IF9tbV9zdWJfc3MoZEQsIF9tbV9tb3ZlaGxfcHMoZEQsZEQpKTsKKworICAgIC8vICBkID0gdHJhY2UoQUIqREMpID0gdHJhY2UoQSMqQipEIypDKQorICAgIGQgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKERDLERDLDB4RDgpLEFCKTsKKworICAgIC8vICBpRCA9IEMqQSMqQgorICAgIGlEID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhDLEMsMHhBMCksIF9tbV9tb3ZlbGhfcHMoQUIsQUIpKTsKKyAgICBpRCA9IF9tbV9hZGRfcHMoaUQsX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhDLEMsMHhGNSksIF9tbV9tb3ZlaGxfcHMoQUIsQUIpKSk7CisgICAgLy8gIGlBID0gQipEIypDCisgICAgaUEgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEIsQiwweEEwKSwgX21tX21vdmVsaF9wcyhEQyxEQykpOworICAgIGlBID0gX21tX2FkZF9wcyhpQSxfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEIsQiwweEY1KSwgX21tX21vdmVobF9wcyhEQyxEQykpKTsKKworICAgIC8vICBkID0gdHJhY2UoQUIqREMpID0gdHJhY2UoQSMqQipEIypDKSBbY29udGludWVdCisgICAgZCAgPSBfbW1fYWRkX3BzKGQsIF9tbV9tb3ZlaGxfcHMoZCwgZCkpOworICAgIGQgID0gX21tX2FkZF9zcyhkLCBfbW1fc2h1ZmZsZV9wcyhkLCBkLCAxKSk7CisgICAgZDEgPSBfbW1fbXVsX3NzKGRBLGREKTsKKyAgICBkMiA9IF9tbV9tdWxfc3MoZEIsZEMpOworCisgICAgLy8gIGlEID0gRCp8QXwgLSBDKkEjKkIKKyAgICBpRCA9IF9tbV9zdWJfcHMoX21tX211bF9wcyhELF9tbV9zaHVmZmxlX3BzKGRBLGRBLDApKSwgaUQpOworCisgICAgLy8gIGlBID0gQSp8RHwgLSBCKkQjKkM7CisgICAgaUEgPSBfbW1fc3ViX3BzKF9tbV9tdWxfcHMoQSxfbW1fc2h1ZmZsZV9wcyhkRCxkRCwwKSksIGlBKTsKKworICAgIC8vICBkZXQgPSB8QXwqfER8ICsgfEJ8KnxDfCAtIHRyYWNlKEEjKkIqRCMqQykKKyAgICBkZXQgPSBfbW1fc3ViX3NzKF9tbV9hZGRfc3MoZDEsZDIpLGQpOworICAgIHJkICA9IF9tbV9kaXZfc3MoX21tX3NldF9zcygxLjBmKSwgZGV0KTsKKworLy8gICAgICNpZmRlZiBaRVJPX1NJTkdVTEFSCisvLyAgICAgICAgIHJkID0gX21tX2FuZF9wcyhfbW1fY21wbmVxX3NzKGRldCxfbW1fc2V0emVyb19wcygpKSwgcmQpOworLy8gICAgICNlbmRpZgorCisgICAgLy8gIGlCID0gRCAqIChBI0IpIyA9IEQqQiMqQQorICAgIGlCID0gX21tX211bF9wcyhELCBfbW1fc2h1ZmZsZV9wcyhBQixBQiwweDMzKSk7CisgICAgaUIgPSBfbW1fc3ViX3BzKGlCLCBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEQsRCwweEIxKSwgX21tX3NodWZmbGVfcHMoQUIsQUIsMHg2NikpKTsKKyAgICAvLyAgaUMgPSBBICogKEQjQykjID0gQSpDIypECisgICAgaUMgPSBfbW1fbXVsX3BzKEEsIF9tbV9zaHVmZmxlX3BzKERDLERDLDB4MzMpKTsKKyAgICBpQyA9IF9tbV9zdWJfcHMoaUMsIF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQSxBLDB4QjEpLCBfbW1fc2h1ZmZsZV9wcyhEQyxEQywweDY2KSkpOworCisgICAgcmQgPSBfbW1fc2h1ZmZsZV9wcyhyZCxyZCwwKTsKKyAgICByZCA9IF9tbV94b3JfcHMocmQsIF9tbV9sb2FkX3BzKChmbG9hdCopX1NpZ25fUE5OUCkpOworCisgICAgLy8gIGlCID0gQyp8QnwgLSBEKkIjKkEKKyAgICBpQiA9IF9tbV9zdWJfcHMoX21tX211bF9wcyhDLF9tbV9zaHVmZmxlX3BzKGRCLGRCLDApKSwgaUIpOworCisgICAgLy8gIGlDID0gQip8Q3wgLSBBKkMjKkQ7CisgICAgaUMgPSBfbW1fc3ViX3BzKF9tbV9tdWxfcHMoQixfbW1fc2h1ZmZsZV9wcyhkQyxkQywwKSksIGlDKTsKKworICAgIC8vICBpWCA9IGlYIC8gZGV0CisgICAgaUEgPSBfbW1fbXVsX3BzKHJkLGlBKTsKKyAgICBpQiA9IF9tbV9tdWxfcHMocmQsaUIpOworICAgIGlDID0gX21tX211bF9wcyhyZCxpQyk7CisgICAgaUQgPSBfbW1fbXVsX3BzKHJkLGlEKTsKKworICAgIEluZGV4IHJlc19zdHJpZGUgPSByZXN1bHQub3V0ZXJTdHJpZGUoKTsKKyAgICBmbG9hdCogcmVzID0gcmVzdWx0LmRhdGEoKTsKKyAgICBwc3RvcmV0PGZsb2F0LCBQYWNrZXQ0ZiwgUmVzdWx0QWxpZ25tZW50PihyZXMrMCwgICAgICAgICAgICBfbW1fc2h1ZmZsZV9wcyhpQSxpQiwweDc3KSk7CisgICAgcHN0b3JldDxmbG9hdCwgUGFja2V0NGYsIFJlc3VsdEFsaWdubWVudD4ocmVzK3Jlc19zdHJpZGUsICAgX21tX3NodWZmbGVfcHMoaUEsaUIsMHgyMikpOworICAgIHBzdG9yZXQ8ZmxvYXQsIFBhY2tldDRmLCBSZXN1bHRBbGlnbm1lbnQ+KHJlcysyKnJlc19zdHJpZGUsIF9tbV9zaHVmZmxlX3BzKGlDLGlELDB4NzcpKTsKKyAgICBwc3RvcmV0PGZsb2F0LCBQYWNrZXQ0ZiwgUmVzdWx0QWxpZ25tZW50PihyZXMrMypyZXNfc3RyaWRlLCBfbW1fc2h1ZmZsZV9wcyhpQyxpRCwweDIyKSk7CisgIH0KKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2Vfc2l6ZTQ8QXJjaGl0ZWN0dXJlOjpTU0UsIGRvdWJsZSwgTWF0cml4VHlwZSwgUmVzdWx0VHlwZT4KK3sKKyAgZW51bSB7CisgICAgTWF0cml4QWxpZ25tZW50ICAgICA9IHRyYWl0czxNYXRyaXhUeXBlPjo6QWxpZ25tZW50LAorICAgIFJlc3VsdEFsaWdubWVudCAgICAgPSB0cmFpdHM8UmVzdWx0VHlwZT46OkFsaWdubWVudCwKKyAgICBTdG9yYWdlT3JkZXJzTWF0Y2ggID0gKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA9PSAoUmVzdWx0VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8KE1hdHJpeFR5cGU6OkZsYWdzJkxpbmVhckFjY2Vzc0JpdCksTWF0cml4VHlwZSBjb25zdCAmLHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0Pjo6dHlwZSBBY3R1YWxNYXRyaXhUeXBlOworICAKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgUmVzdWx0VHlwZSYgcmVzdWx0KQorICB7CisgICAgQWN0dWFsTWF0cml4VHlwZSBtYXRyaXgobWF0KTsKKyAgICBjb25zdCBfX20xMjhkIF9TaWduX05QID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fc2V0X2VwaTMyKDB4MCwweDAsMHg4MDAwMDAwMCwweDApKTsKKyAgICBjb25zdCBfX20xMjhkIF9TaWduX1BOID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fc2V0X2VwaTMyKDB4ODAwMDAwMDAsMHgwLDB4MCwweDApKTsKKworICAgIC8vIFRoZSBpbnZlcnNlIGlzIGNhbGN1bGF0ZWQgdXNpbmcgIkRpdmlkZSBhbmQgQ29ucXVlciIgdGVjaG5pcXVlLiBUaGUKKyAgICAvLyBvcmlnaW5hbCBtYXRyaXggaXMgZGl2aWRlIGludG8gZm91ciAyeDIgc3ViLW1hdHJpY2VzLiBTaW5jZSBlYWNoCisgICAgLy8gcmVnaXN0ZXIgb2YgdGhlIG1hdHJpeCBob2xkcyB0d28gZWxlbWVudHMsIHRoZSBzbWFsbGVyIG1hdHJpY2VzIGFyZQorICAgIC8vIGNvbnNpc3RlZCBvZiB0d28gcmVnaXN0ZXJzLiBIZW5jZSB3ZSBnZXQgYSBiZXR0ZXIgbG9jYWxpdHkgb2YgdGhlCisgICAgLy8gY2FsY3VsYXRpb25zLgorCisgICAgLy8gdGhlIGZvdXIgc3ViLW1hdHJpY2VzCisgICAgX19tMTI4ZCBBMSwgQTIsIEIxLCBCMiwgQzEsIEMyLCBEMSwgRDI7CisgICAgCisgICAgaWYoU3RvcmFnZU9yZGVyc01hdGNoKQorICAgIHsKKyAgICAgIEExID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCAwKTsgQjEgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDIpOworICAgICAgQTIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDQpOyBCMiA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggNik7CisgICAgICBDMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggOCk7IEQxID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDEwKTsKKyAgICAgIEMyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDEyKTsgRDIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oMTQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19tMTI4ZCB0bXA7CisgICAgICBBMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggMCk7IEMxID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCAyKTsKKyAgICAgIEEyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCA0KTsgQzIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDYpOworICAgICAgdG1wID0gQTE7CisgICAgICBBMSA9IF9tbV91bnBhY2tsb19wZChBMSxBMik7CisgICAgICBBMiA9IF9tbV91bnBhY2toaV9wZCh0bXAsQTIpOworICAgICAgdG1wID0gQzE7CisgICAgICBDMSA9IF9tbV91bnBhY2tsb19wZChDMSxDMik7CisgICAgICBDMiA9IF9tbV91bnBhY2toaV9wZCh0bXAsQzIpOworICAgICAgCisgICAgICBCMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggOCk7IEQxID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDEwKTsKKyAgICAgIEIyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDEyKTsgRDIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oMTQpOworICAgICAgdG1wID0gQjE7CisgICAgICBCMSA9IF9tbV91bnBhY2tsb19wZChCMSxCMik7CisgICAgICBCMiA9IF9tbV91bnBhY2toaV9wZCh0bXAsQjIpOworICAgICAgdG1wID0gRDE7CisgICAgICBEMSA9IF9tbV91bnBhY2tsb19wZChEMSxEMik7CisgICAgICBEMiA9IF9tbV91bnBhY2toaV9wZCh0bXAsRDIpOworICAgIH0KKyAgICAKKyAgICBfX20xMjhkIGlBMSwgaUEyLCBpQjEsIGlCMiwgaUMxLCBpQzIsIGlEMSwgaUQyLCAgICAgLy8gcGFydGlhbCBpbnZlc2Ugb2YgdGhlIHN1Yi1tYXRyaWNlcworICAgICAgICAgICAgREMxLCBEQzIsIEFCMSwgQUIyOworICAgIF9fbTEyOGQgZEEsIGRCLCBkQywgZEQ7ICAgICAvLyBkZXRlcm1pbmFudCBvZiB0aGUgc3ViLW1hdHJpY2VzCisgICAgX19tMTI4ZCBkZXQsIGQxLCBkMiwgcmQ7CisKKyAgICAvLyAgZEEgPSB8QXwKKyAgICBkQSA9IF9tbV9zaHVmZmxlX3BkKEEyLCBBMiwgMSk7CisgICAgZEEgPSBfbW1fbXVsX3BkKEExLCBkQSk7CisgICAgZEEgPSBfbW1fc3ViX3NkKGRBLCBfbW1fc2h1ZmZsZV9wZChkQSxkQSwzKSk7CisgICAgLy8gIGRCID0gfEJ8CisgICAgZEIgPSBfbW1fc2h1ZmZsZV9wZChCMiwgQjIsIDEpOworICAgIGRCID0gX21tX211bF9wZChCMSwgZEIpOworICAgIGRCID0gX21tX3N1Yl9zZChkQiwgX21tX3NodWZmbGVfcGQoZEIsZEIsMykpOworCisgICAgLy8gIEFCID0gQSMgKiBCCisgICAgQUIxID0gX21tX211bF9wZChCMSwgX21tX3NodWZmbGVfcGQoQTIsQTIsMykpOworICAgIEFCMiA9IF9tbV9tdWxfcGQoQjIsIF9tbV9zaHVmZmxlX3BkKEExLEExLDApKTsKKyAgICBBQjEgPSBfbW1fc3ViX3BkKEFCMSwgX21tX211bF9wZChCMiwgX21tX3NodWZmbGVfcGQoQTEsQTEsMykpKTsKKyAgICBBQjIgPSBfbW1fc3ViX3BkKEFCMiwgX21tX211bF9wZChCMSwgX21tX3NodWZmbGVfcGQoQTIsQTIsMCkpKTsKKworICAgIC8vICBkQyA9IHxDfAorICAgIGRDID0gX21tX3NodWZmbGVfcGQoQzIsIEMyLCAxKTsKKyAgICBkQyA9IF9tbV9tdWxfcGQoQzEsIGRDKTsKKyAgICBkQyA9IF9tbV9zdWJfc2QoZEMsIF9tbV9zaHVmZmxlX3BkKGRDLGRDLDMpKTsKKyAgICAvLyAgZEQgPSB8RHwKKyAgICBkRCA9IF9tbV9zaHVmZmxlX3BkKEQyLCBEMiwgMSk7CisgICAgZEQgPSBfbW1fbXVsX3BkKEQxLCBkRCk7CisgICAgZEQgPSBfbW1fc3ViX3NkKGRELCBfbW1fc2h1ZmZsZV9wZChkRCxkRCwzKSk7CisKKyAgICAvLyAgREMgPSBEIyAqIEMKKyAgICBEQzEgPSBfbW1fbXVsX3BkKEMxLCBfbW1fc2h1ZmZsZV9wZChEMixEMiwzKSk7CisgICAgREMyID0gX21tX211bF9wZChDMiwgX21tX3NodWZmbGVfcGQoRDEsRDEsMCkpOworICAgIERDMSA9IF9tbV9zdWJfcGQoREMxLCBfbW1fbXVsX3BkKEMyLCBfbW1fc2h1ZmZsZV9wZChEMSxEMSwzKSkpOworICAgIERDMiA9IF9tbV9zdWJfcGQoREMyLCBfbW1fbXVsX3BkKEMxLCBfbW1fc2h1ZmZsZV9wZChEMixEMiwwKSkpOworCisgICAgLy8gIHJkID0gdHJhY2UoQUIqREMpID0gdHJhY2UoQSMqQipEIypDKQorICAgIGQxID0gX21tX211bF9wZChBQjEsIF9tbV9zaHVmZmxlX3BkKERDMSwgREMyLCAwKSk7CisgICAgZDIgPSBfbW1fbXVsX3BkKEFCMiwgX21tX3NodWZmbGVfcGQoREMxLCBEQzIsIDMpKTsKKyAgICByZCA9IF9tbV9hZGRfcGQoZDEsIGQyKTsKKyAgICByZCA9IF9tbV9hZGRfc2QocmQsIF9tbV9zaHVmZmxlX3BkKHJkLCByZCwzKSk7CisKKyAgICAvLyAgaUQgPSBDKkEjKkIKKyAgICBpRDEgPSBfbW1fbXVsX3BkKEFCMSwgX21tX3NodWZmbGVfcGQoQzEsQzEsMCkpOworICAgIGlEMiA9IF9tbV9tdWxfcGQoQUIxLCBfbW1fc2h1ZmZsZV9wZChDMixDMiwwKSk7CisgICAgaUQxID0gX21tX2FkZF9wZChpRDEsIF9tbV9tdWxfcGQoQUIyLCBfbW1fc2h1ZmZsZV9wZChDMSxDMSwzKSkpOworICAgIGlEMiA9IF9tbV9hZGRfcGQoaUQyLCBfbW1fbXVsX3BkKEFCMiwgX21tX3NodWZmbGVfcGQoQzIsQzIsMykpKTsKKworICAgIC8vICBpQSA9IEIqRCMqQworICAgIGlBMSA9IF9tbV9tdWxfcGQoREMxLCBfbW1fc2h1ZmZsZV9wZChCMSxCMSwwKSk7CisgICAgaUEyID0gX21tX211bF9wZChEQzEsIF9tbV9zaHVmZmxlX3BkKEIyLEIyLDApKTsKKyAgICBpQTEgPSBfbW1fYWRkX3BkKGlBMSwgX21tX211bF9wZChEQzIsIF9tbV9zaHVmZmxlX3BkKEIxLEIxLDMpKSk7CisgICAgaUEyID0gX21tX2FkZF9wZChpQTIsIF9tbV9tdWxfcGQoREMyLCBfbW1fc2h1ZmZsZV9wZChCMixCMiwzKSkpOworCisgICAgLy8gIGlEID0gRCp8QXwgLSBDKkEjKkIKKyAgICBkQSA9IF9tbV9zaHVmZmxlX3BkKGRBLGRBLDApOworICAgIGlEMSA9IF9tbV9zdWJfcGQoX21tX211bF9wZChEMSwgZEEpLCBpRDEpOworICAgIGlEMiA9IF9tbV9zdWJfcGQoX21tX211bF9wZChEMiwgZEEpLCBpRDIpOworCisgICAgLy8gIGlBID0gQSp8RHwgLSBCKkQjKkM7CisgICAgZEQgPSBfbW1fc2h1ZmZsZV9wZChkRCxkRCwwKTsKKyAgICBpQTEgPSBfbW1fc3ViX3BkKF9tbV9tdWxfcGQoQTEsIGREKSwgaUExKTsKKyAgICBpQTIgPSBfbW1fc3ViX3BkKF9tbV9tdWxfcGQoQTIsIGREKSwgaUEyKTsKKworICAgIGQxID0gX21tX211bF9zZChkQSwgZEQpOworICAgIGQyID0gX21tX211bF9zZChkQiwgZEMpOworCisgICAgLy8gIGlCID0gRCAqIChBI0IpIyA9IEQqQiMqQQorICAgIGlCMSA9IF9tbV9tdWxfcGQoRDEsIF9tbV9zaHVmZmxlX3BkKEFCMixBQjEsMSkpOworICAgIGlCMiA9IF9tbV9tdWxfcGQoRDIsIF9tbV9zaHVmZmxlX3BkKEFCMixBQjEsMSkpOworICAgIGlCMSA9IF9tbV9zdWJfcGQoaUIxLCBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKEQxLEQxLDEpLCBfbW1fc2h1ZmZsZV9wZChBQjIsQUIxLDIpKSk7CisgICAgaUIyID0gX21tX3N1Yl9wZChpQjIsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoRDIsRDIsMSksIF9tbV9zaHVmZmxlX3BkKEFCMixBQjEsMikpKTsKKworICAgIC8vICBkZXQgPSB8QXwqfER8ICsgfEJ8KnxDfCAtIHRyYWNlKEEjKkIqRCMqQykKKyAgICBkZXQgPSBfbW1fYWRkX3NkKGQxLCBkMik7CisgICAgZGV0ID0gX21tX3N1Yl9zZChkZXQsIHJkKTsKKworICAgIC8vICBpQyA9IEEgKiAoRCNDKSMgPSBBKkMjKkQKKyAgICBpQzEgPSBfbW1fbXVsX3BkKEExLCBfbW1fc2h1ZmZsZV9wZChEQzIsREMxLDEpKTsKKyAgICBpQzIgPSBfbW1fbXVsX3BkKEEyLCBfbW1fc2h1ZmZsZV9wZChEQzIsREMxLDEpKTsKKyAgICBpQzEgPSBfbW1fc3ViX3BkKGlDMSwgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChBMSxBMSwxKSwgX21tX3NodWZmbGVfcGQoREMyLERDMSwyKSkpOworICAgIGlDMiA9IF9tbV9zdWJfcGQoaUMyLCBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKEEyLEEyLDEpLCBfbW1fc2h1ZmZsZV9wZChEQzIsREMxLDIpKSk7CisKKyAgICByZCA9IF9tbV9kaXZfc2QoX21tX3NldF9zZCgxLjApLCBkZXQpOworLy8gICAgICNpZmRlZiBaRVJPX1NJTkdVTEFSCisvLyAgICAgICAgIHJkID0gX21tX2FuZF9wZChfbW1fY21wbmVxX3NkKGRldCxfbW1fc2V0emVyb19wZCgpKSwgcmQpOworLy8gICAgICNlbmRpZgorICAgIHJkID0gX21tX3NodWZmbGVfcGQocmQscmQsMCk7CisKKyAgICAvLyAgaUIgPSBDKnxCfCAtIEQqQiMqQQorICAgIGRCID0gX21tX3NodWZmbGVfcGQoZEIsZEIsMCk7CisgICAgaUIxID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEMxLCBkQiksIGlCMSk7CisgICAgaUIyID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEMyLCBkQiksIGlCMik7CisKKyAgICBkMSA9IF9tbV94b3JfcGQocmQsIF9TaWduX1BOKTsKKyAgICBkMiA9IF9tbV94b3JfcGQocmQsIF9TaWduX05QKTsKKworICAgIC8vICBpQyA9IEIqfEN8IC0gQSpDIypEOworICAgIGRDID0gX21tX3NodWZmbGVfcGQoZEMsZEMsMCk7CisgICAgaUMxID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEIxLCBkQyksIGlDMSk7CisgICAgaUMyID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEIyLCBkQyksIGlDMik7CisKKyAgICBJbmRleCByZXNfc3RyaWRlID0gcmVzdWx0Lm91dGVyU3RyaWRlKCk7CisgICAgZG91YmxlKiByZXMgPSByZXN1bHQuZGF0YSgpOworICAgIHBzdG9yZXQ8ZG91YmxlLCBQYWNrZXQyZCwgUmVzdWx0QWxpZ25tZW50PihyZXMrMCwgICAgICAgICAgICAgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChpQTIsIGlBMSwgMyksIGQxKSk7CisgICAgcHN0b3JldDxkb3VibGUsIFBhY2tldDJkLCBSZXN1bHRBbGlnbm1lbnQ+KHJlcytyZXNfc3RyaWRlLCAgICBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKGlBMiwgaUExLCAwKSwgZDIpKTsKKyAgICBwc3RvcmV0PGRvdWJsZSwgUGFja2V0MmQsIFJlc3VsdEFsaWdubWVudD4ocmVzKzIsICAgICAgICAgICAgIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUIyLCBpQjEsIDMpLCBkMSkpOworICAgIHBzdG9yZXQ8ZG91YmxlLCBQYWNrZXQyZCwgUmVzdWx0QWxpZ25tZW50PihyZXMrcmVzX3N0cmlkZSsyLCAgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChpQjIsIGlCMSwgMCksIGQyKSk7CisgICAgcHN0b3JldDxkb3VibGUsIFBhY2tldDJkLCBSZXN1bHRBbGlnbm1lbnQ+KHJlcysyKnJlc19zdHJpZGUsICBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKGlDMiwgaUMxLCAzKSwgZDEpKTsKKyAgICBwc3RvcmV0PGRvdWJsZSwgUGFja2V0MmQsIFJlc3VsdEFsaWdubWVudD4ocmVzKzMqcmVzX3N0cmlkZSwgIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUMyLCBpQzEsIDApLCBkMikpOworICAgIHBzdG9yZXQ8ZG91YmxlLCBQYWNrZXQyZCwgUmVzdWx0QWxpZ25tZW50PihyZXMrMipyZXNfc3RyaWRlKzIsX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChpRDIsIGlEMSwgMyksIGQxKSk7CisgICAgcHN0b3JldDxkb3VibGUsIFBhY2tldDJkLCBSZXN1bHRBbGlnbm1lbnQ+KHJlcyszKnJlc19zdHJpZGUrMixfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKGlEMiwgaUQxLCAwKSwgZDIpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSU5WRVJTRV9TU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL01ldGlzU3VwcG9ydC9NZXRpc1N1cHBvcnQuaCBiL0VpZ2VuL3NyYy9NZXRpc1N1cHBvcnQvTWV0aXNTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxNTMwNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9NZXRpc1N1cHBvcnQvTWV0aXNTdXBwb3J0LmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKyNpZm5kZWYgTUVUSVNfU1VQUE9SVF9ICisjZGVmaW5lIE1FVElTX1NVUFBPUlRfSAorCituYW1lc3BhY2UgRWlnZW4geworLyoqCisgKiBHZXQgdGhlIGZpbGwtcmVkdWNpbmcgb3JkZXJpbmcgZnJvbSB0aGUgTUVUSVMgcGFja2FnZQorICogCisgKiBJZiBBIGlzIHRoZSBvcmlnaW5hbCBtYXRyaXggYW5kIEFwIGlzIHRoZSBwZXJtdXRlZCBtYXRyaXgsIAorICogdGhlIGZpbGwtcmVkdWNpbmcgcGVybXV0YXRpb24gaXMgZGVmaW5lZCBhcyBmb2xsb3dzIDoKKyAqIFJvdyAoY29sdW1uKSBpIG9mIEEgaXMgdGhlIG1hdHBlcm0oaSkgcm93IChjb2x1bW4pIG9mIEFwLiAKKyAqIFdBUk5JTkc6IEFzIGNvbXB1dGVkIGJ5IE1FVElTLCB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB2ZWN0b3IgaXBlcm0gKGluc3RlYWQgb2YgcGVybSkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK2NsYXNzIE1ldGlzT3JkZXJpbmcKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBQZXJtdXRhdGlvblR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IEluZGV4VmVjdG9yOyAKKyAgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICB2b2lkIGdldF9zeW1tZXRyaXplZF9ncmFwaChjb25zdCBNYXRyaXhUeXBlJiBBKQorICB7CisgICAgSW5kZXggbSA9IEEuY29scygpOyAKKyAgICBlaWdlbl9hc3NlcnQoKEEucm93cygpID09IEEuY29scygpKSAmJiAiT05MWSBGT1IgU1FVQVJFRCBNQVRSSUNFUyIpOworICAgIC8vIEdldCB0aGUgdHJhbnNwb3NlIG9mIHRoZSBpbnB1dCBtYXRyaXggCisgICAgTWF0cml4VHlwZSBBdCA9IEEudHJhbnNwb3NlKCk7IAorICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIG5vbnplcm9zIGVsZW1lbnRzIGluIGVhY2ggcm93L2NvbCBvZiBBdCtBCisgICAgSW5kZXggVG90TnogPSAwOyAKKyAgICBJbmRleFZlY3RvciB2aXNpdGVkKG0pOyAKKyAgICB2aXNpdGVkLnNldENvbnN0YW50KC0xKTsgCisgICAgZm9yIChTdG9yYWdlSW5kZXggaiA9IDA7IGogPCBtOyBqKyspCisgICAgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgdW5pb24gc3RydWN0dXJlIG9mIG9mIEEoaiw6KSBhbmQgQXQoaiw6KQorICAgICAgdmlzaXRlZChqKSA9IGo7IC8vIERvIG5vdCBpbmNsdWRlIHRoZSBkaWFnb25hbCBlbGVtZW50CisgICAgICAvLyBHZXQgdGhlIG5vbnplcm9zIGluIHJvdy9jb2x1bW4gaiBvZiBBCisgICAgICBmb3IgKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQoQSwgaik7IGl0OyArK2l0KQorICAgICAgeworICAgICAgICBJbmRleCBpZHggPSBpdC5pbmRleCgpOyAvLyBHZXQgdGhlIHJvdyBpbmRleCAoZm9yIGNvbHVtbiBtYWpvcikgb3IgY29sdW1uIGluZGV4IChmb3Igcm93IG1ham9yKQorICAgICAgICBpZiAodmlzaXRlZChpZHgpICE9IGogKSAKKyAgICAgICAgeworICAgICAgICAgIHZpc2l0ZWQoaWR4KSA9IGo7IAorICAgICAgICAgICsrVG90Tno7IAorICAgICAgICB9CisgICAgICB9CisgICAgICAvL0dldCB0aGUgbm9uemVyb3MgaW4gcm93L2NvbHVtbiBqIG9mIEF0CisgICAgICBmb3IgKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQoQXQsIGopOyBpdDsgKytpdCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaWR4ID0gaXQuaW5kZXgoKTsgCisgICAgICAgIGlmKHZpc2l0ZWQoaWR4KSAhPSBqKQorICAgICAgICB7CisgICAgICAgICAgdmlzaXRlZChpZHgpID0gajsgCisgICAgICAgICAgKytUb3ROejsgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gUmVzZXJ2ZSBwbGFjZSBmb3IgQSArIEF0CisgICAgbV9pbmRleFB0ci5yZXNpemUobSsxKTsKKyAgICBtX2lubmVySW5kaWNlcy5yZXNpemUoVG90TnopOyAKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSByZWFsIGFkamFjZW5jeSBsaXN0IG9mIGVhY2ggY29sdW1uL3JvdyAKKyAgICB2aXNpdGVkLnNldENvbnN0YW50KC0xKTsgCisgICAgU3RvcmFnZUluZGV4IEN1ck56ID0gMDsgCisgICAgZm9yIChTdG9yYWdlSW5kZXggaiA9IDA7IGogPCBtOyBqKyspCisgICAgeworICAgICAgbV9pbmRleFB0cihqKSA9IEN1ck56OyAKKyAgICAgIAorICAgICAgdmlzaXRlZChqKSA9IGo7IC8vIERvIG5vdCBpbmNsdWRlIHRoZSBkaWFnb25hbCBlbGVtZW50CisgICAgICAvLyBBZGQgdGhlIHBhdHRlcm4gb2Ygcm93L2NvbHVtbiBqIG9mIEEgdG8gQStBdAorICAgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KEEsaik7IGl0OyArK2l0KQorICAgICAgeworICAgICAgICBTdG9yYWdlSW5kZXggaWR4ID0gaXQuaW5kZXgoKTsgLy8gR2V0IHRoZSByb3cgaW5kZXggKGZvciBjb2x1bW4gbWFqb3IpIG9yIGNvbHVtbiBpbmRleCAoZm9yIHJvdyBtYWpvcikKKyAgICAgICAgaWYgKHZpc2l0ZWQoaWR4KSAhPSBqICkgCisgICAgICAgIHsKKyAgICAgICAgICB2aXNpdGVkKGlkeCkgPSBqOyAKKyAgICAgICAgICBtX2lubmVySW5kaWNlcyhDdXJOeikgPSBpZHg7IAorICAgICAgICAgIEN1ck56Kys7IAorICAgICAgICB9CisgICAgICB9CisgICAgICAvL0FkZCB0aGUgcGF0dGVybiBvZiByb3cvY29sdW1uIGogb2YgQXQgdG8gQStBdAorICAgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KEF0LCBqKTsgaXQ7ICsraXQpCisgICAgICB7CisgICAgICAgIFN0b3JhZ2VJbmRleCBpZHggPSBpdC5pbmRleCgpOyAKKyAgICAgICAgaWYodmlzaXRlZChpZHgpICE9IGopCisgICAgICAgIHsKKyAgICAgICAgICB2aXNpdGVkKGlkeCkgPSBqOyAKKyAgICAgICAgICBtX2lubmVySW5kaWNlcyhDdXJOeikgPSBpZHg7IAorICAgICAgICAgICsrQ3VyTno7IAorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1faW5kZXhQdHIobSkgPSBDdXJOejsgICAgCisgIH0KKyAgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IE1hdHJpeFR5cGUmIEEsIFBlcm11dGF0aW9uVHlwZSYgbWF0cGVybSkKKyAgeworICAgICBTdG9yYWdlSW5kZXggbSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oQS5jb2xzKCkpOyAvLyBtdXN0IGJlIFN0b3JhZ2VJbmRleCwgYmVjYXVzZSBpdCBpcyBwYXNzZWQgYnkgYWRkcmVzcyB0byBNRVRJUworICAgICBJbmRleFZlY3RvciBwZXJtKG0pLGlwZXJtKG0pOyAKKyAgICAvLyBGaXJzdCwgc3ltbWV0cml6ZSB0aGUgbWF0cml4IGdyYXBoLiAKKyAgICAgZ2V0X3N5bW1ldHJpemVkX2dyYXBoKEEpOyAKKyAgICAgaW50IG91dHB1dF9lcnJvcjsKKyAgICAgCisgICAgIC8vIENhbGwgdGhlIGZpbGwtcmVkdWNpbmcgcm91dGluZSBmcm9tIE1FVElTIAorICAgICBvdXRwdXRfZXJyb3IgPSBNRVRJU19Ob2RlTkQoJm0sIG1faW5kZXhQdHIuZGF0YSgpLCBtX2lubmVySW5kaWNlcy5kYXRhKCksIE5VTEwsIE5VTEwsIHBlcm0uZGF0YSgpLCBpcGVybS5kYXRhKCkpOworICAgICAKKyAgICBpZihvdXRwdXRfZXJyb3IgIT0gTUVUSVNfT0spIAorICAgIHsKKyAgICAgIC8vRklYTUUgVGhlIG9yZGVyaW5nIGludGVyZmFjZSBzaG91bGQgZGVmaW5lIGEgY2xhc3Mgb2YgcG9zc2libGUgZXJyb3JzIAorICAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SIFdISUxFIENBTExJTkcgVEhFIE1FVElTIFBBQ0tBR0UgXG4iOyAKKyAgICAgcmV0dXJuOyAKKyAgICB9CisgICAgCisgICAgLy8gR2V0IHRoZSBmaWxsLXJlZHVjaW5nIHBlcm11dGF0aW9uIAorICAgIC8vTk9URTogIElmIEFwIGlzIHRoZSBwZXJtdXRlZCBtYXRyaXggdGhlbiBwZXJtIGFuZCBpcGVybSB2ZWN0b3JzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3MgCisgICAgLy8gUm93IChjb2x1bW4pIGkgb2YgQXAgaXMgdGhlIHBlcm0oaSkgcm93KGNvbHVtbikgb2YgQSwgYW5kIHJvdyAoY29sdW1uKSBpIG9mIEEgaXMgdGhlIGlwZXJtKGkpIHJvdyhjb2x1bW4pIG9mIEFwCisgICAgCisgICAgIG1hdHBlcm0ucmVzaXplKG0pOworICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKKyAgICAgICBtYXRwZXJtLmluZGljZXMoKShpcGVybShqKSkgPSBqOworICAgCisgIH0KKyAgCisgIHByb3RlY3RlZDoKKyAgICBJbmRleFZlY3RvciBtX2luZGV4UHRyOyAvLyBQb2ludGVyIHRvIHRoZSBhZGphY2VuY2N5IGxpc3Qgb2YgZWFjaCByb3cvY29sdW1uCisgICAgSW5kZXhWZWN0b3IgbV9pbm5lckluZGljZXM7IC8vIEFkamFjZW5jeSBsaXN0IAorfTsKKworfS8vIGVuZCBuYW1lc3BhY2UgZWlnZW4gCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9PcmRlcmluZ01ldGhvZHMvQW1kLmggYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0FtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWVjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0FtZC5oCkBAIC0wLDAgKzEsNDQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKworLyoKKworTk9URTogdGhpcyByb3V0aW5lIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgQ1NwYXJzZSBsaWJyYXJ5OgorCitDb3B5cmlnaHQgKGMpIDIwMDYsIFRpbW90aHkgQS4gRGF2aXMuCitodHRwOi8vd3d3LnN1aXRlc3BhcnNlLmNvbQorCitDU3BhcnNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworQ1NwYXJzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBNb2R1bGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKyovCisKKyNpbmNsdWRlICIuLi9Db3JlL3V0aWwvTm9uTVBMMi5oIgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9BTURfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfQU1EX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgYW1kX2ZsaXAoY29uc3QgVCYgaSkgeyByZXR1cm4gLWktMjsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgYW1kX3VuZmxpcChjb25zdCBUJiBpKSB7IHJldHVybiBpPDAgPyBhbWRfZmxpcChpKSA6IGk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4gaW5saW5lIGJvb2wgYW1kX21hcmtlZChjb25zdCBUMCogdywgY29uc3QgVDEmIGopIHsgcmV0dXJuIHdbal08MDsgfQordGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPiBpbmxpbmUgdm9pZCBhbWRfbWFyayhjb25zdCBUMCogdywgY29uc3QgVDEmIGopIHsgcmV0dXJuIHdbal0gPSBhbWRfZmxpcCh3W2pdKTsgfQorCisvKiBjbGVhciB3ICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdG9yYWdlSW5kZXg+CitzdGF0aWMgU3RvcmFnZUluZGV4IGNzX3djbGVhciAoU3RvcmFnZUluZGV4IG1hcmssIFN0b3JhZ2VJbmRleCBsZW1heCwgU3RvcmFnZUluZGV4ICp3LCBTdG9yYWdlSW5kZXggbikKK3sKKyAgU3RvcmFnZUluZGV4IGs7CisgIGlmKG1hcmsgPCAyIHx8IChtYXJrICsgbGVtYXggPCAwKSkKKyAgeworICAgIGZvcihrID0gMDsgayA8IG47IGsrKykKKyAgICAgIGlmKHdba10gIT0gMCkKKyAgICAgICAgd1trXSA9IDE7CisgICAgbWFyayA9IDI7CisgIH0KKyAgcmV0dXJuIChtYXJrKTsgICAgIC8qIGF0IHRoaXMgcG9pbnQsIHdbMC4ubi0xXSA8IG1hcmsgaG9sZHMgKi8KK30KKworLyogZGVwdGgtZmlyc3Qgc2VhcmNoIGFuZCBwb3N0b3JkZXIgb2YgYSB0cmVlIHJvb3RlZCBhdCBub2RlIGogKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK1N0b3JhZ2VJbmRleCBjc190ZGZzKFN0b3JhZ2VJbmRleCBqLCBTdG9yYWdlSW5kZXggaywgU3RvcmFnZUluZGV4ICpoZWFkLCBjb25zdCBTdG9yYWdlSW5kZXggKm5leHQsIFN0b3JhZ2VJbmRleCAqcG9zdCwgU3RvcmFnZUluZGV4ICpzdGFjaykKK3sKKyAgU3RvcmFnZUluZGV4IGksIHAsIHRvcCA9IDA7CisgIGlmKCFoZWFkIHx8ICFuZXh0IHx8ICFwb3N0IHx8ICFzdGFjaykgcmV0dXJuICgtMSk7ICAgIC8qIGNoZWNrIGlucHV0cyAqLworICBzdGFja1swXSA9IGo7ICAgICAgICAgICAgICAgICAvKiBwbGFjZSBqIG9uIHRoZSBzdGFjayAqLworICB3aGlsZSAodG9wID49IDApICAgICAgICAgICAgICAgIC8qIHdoaWxlIChzdGFjayBpcyBub3QgZW1wdHkpICovCisgIHsKKyAgICBwID0gc3RhY2tbdG9wXTsgICAgICAgICAgIC8qIHAgPSB0b3Agb2Ygc3RhY2sgKi8KKyAgICBpID0gaGVhZFtwXTsgICAgICAgICAgICAgIC8qIGkgPSB5b3VuZ2VzdCBjaGlsZCBvZiBwICovCisgICAgaWYoaSA9PSAtMSkKKyAgICB7CisgICAgICB0b3AtLTsgICAgICAgICAgICAgICAgIC8qIHAgaGFzIG5vIHVub3JkZXJlZCBjaGlsZHJlbiBsZWZ0ICovCisgICAgICBwb3N0W2srK10gPSBwOyAgICAgICAgLyogbm9kZSBwIGlzIHRoZSBrdGggcG9zdG9yZGVyZWQgbm9kZSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGVhZFtwXSA9IG5leHRbaV07ICAgLyogcmVtb3ZlIGkgZnJvbSBjaGlsZHJlbiBvZiBwICovCisgICAgICBzdGFja1srK3RvcF0gPSBpOyAgICAgLyogc3RhcnQgZGZzIG9uIGNoaWxkIG5vZGUgaSAqLworICAgIH0KKyAgfQorICByZXR1cm4gazsKK30KKworCisvKiogXGludGVybmFsCisgICogXGluZ3JvdXAgT3JkZXJpbmdNZXRob2RzX01vZHVsZSAKKyAgKiBBcHByb3hpbWF0ZSBtaW5pbXVtIGRlZ3JlZSBvcmRlcmluZyBhbGdvcml0aG0uCisgICoKKyAgKiBccGFyYW1baW5dIEMgdGhlIGlucHV0IHNlbGZhZGpvaW50IG1hdHJpeCBzdG9yZWQgaW4gY29tcHJlc3NlZCBjb2x1bW4gbWFqb3IgZm9ybWF0LgorICAqIFxwYXJhbVtvdXRdIHBlcm0gdGhlIHBlcm11dGF0aW9uIFAgcmVkdWNpbmcgdGhlIGZpbGwtaW4gb2YgdGhlIGlucHV0IG1hdHJpeCBcYSBDCisgICoKKyAgKiBOb3RlIHRoYXQgdGhlIGlucHV0IG1hdHJpeCBcYSBDIG11c3QgYmUgY29tcGxldGUsIHRoYXQgaXMgYm90aCB0aGUgdXBwZXIgYW5kIGxvd2VyIHBhcnRzIGhhdmUgdG8gYmUgc3RvcmVkLCBhcyB3ZWxsIGFzIHRoZSBkaWFnb25hbCBlbnRyaWVzLgorICAqIE9uIGV4aXQgdGhlIHZhbHVlcyBvZiBDIGFyZSBkZXN0cm95ZWQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4Pgordm9pZCBtaW5pbXVtX2RlZ3JlZV9vcmRlcmluZyhTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLFN0b3JhZ2VJbmRleD4mIEMsIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxTdG9yYWdlSW5kZXg+JiBwZXJtKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIAorICBTdG9yYWdlSW5kZXggZCwgZGssIGRleHQsIGxlbWF4ID0gMCwgZSwgZWxlbmssIGVsbiwgaSwgaiwgaywgazEsCisgICAgICAgICAgICAgICAgazIsIGszLCBqbGFzdCwgbG4sIGRlbnNlLCBuem1heCwgbWluZGVnID0gMCwgbnZpLCBudmosIG52aywgbWFyaywgd252aSwKKyAgICAgICAgICAgICAgICBvaywgbmVsID0gMCwgcCwgcDEsIHAyLCBwMywgcDQsIHBqLCBwaywgcGsxLCBwazIsIHBuLCBxLCB0LCBoOworICAKKyAgU3RvcmFnZUluZGV4IG4gPSBTdG9yYWdlSW5kZXgoQy5jb2xzKCkpOworICBkZW5zZSA9IHN0ZDo6bWF4PFN0b3JhZ2VJbmRleD4gKDE2LCBTdG9yYWdlSW5kZXgoMTAgKiBzcXJ0KGRvdWJsZShuKSkpKTsgICAvKiBmaW5kIGRlbnNlIHRocmVzaG9sZCAqLworICBkZW5zZSA9IChzdGQ6Om1pbikobi0yLCBkZW5zZSk7CisgIAorICBTdG9yYWdlSW5kZXggY256ID0gU3RvcmFnZUluZGV4KEMubm9uWmVyb3MoKSk7CisgIHBlcm0ucmVzaXplKG4rMSk7CisgIHQgPSBjbnogKyBjbnovNSArIDIqbjsgICAgICAgICAgICAgICAgIC8qIGFkZCBlbGJvdyByb29tIHRvIEMgKi8KKyAgQy5yZXNpemVOb25aZXJvcyh0KTsKKyAgCisgIC8vIGdldCB3b3Jrc3BhY2UKKyAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFN0b3JhZ2VJbmRleCxXLDgqKG4rMSksMCk7CisgIFN0b3JhZ2VJbmRleCogbGVuICAgICA9IFc7CisgIFN0b3JhZ2VJbmRleCogbnYgICAgICA9IFcgKyAgIChuKzEpOworICBTdG9yYWdlSW5kZXgqIG5leHQgICAgPSBXICsgMioobisxKTsKKyAgU3RvcmFnZUluZGV4KiBoZWFkICAgID0gVyArIDMqKG4rMSk7CisgIFN0b3JhZ2VJbmRleCogZWxlbiAgICA9IFcgKyA0KihuKzEpOworICBTdG9yYWdlSW5kZXgqIGRlZ3JlZSAgPSBXICsgNSoobisxKTsKKyAgU3RvcmFnZUluZGV4KiB3ICAgICAgID0gVyArIDYqKG4rMSk7CisgIFN0b3JhZ2VJbmRleCogaGhlYWQgICA9IFcgKyA3KihuKzEpOworICBTdG9yYWdlSW5kZXgqIGxhc3QgICAgPSBwZXJtLmluZGljZXMoKS5kYXRhKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIFAgYXMgd29ya3NwYWNlIGZvciBsYXN0ICovCisgIAorICAvKiAtLS0gSW5pdGlhbGl6ZSBxdW90aWVudCBncmFwaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIFN0b3JhZ2VJbmRleCogQ3AgPSBDLm91dGVySW5kZXhQdHIoKTsKKyAgU3RvcmFnZUluZGV4KiBDaSA9IEMuaW5uZXJJbmRleFB0cigpOworICBmb3IoayA9IDA7IGsgPCBuOyBrKyspCisgICAgbGVuW2tdID0gQ3BbaysxXSAtIENwW2tdOworICBsZW5bbl0gPSAwOworICBuem1heCA9IHQ7CisgIAorICBmb3IoaSA9IDA7IGkgPD0gbjsgaSsrKQorICB7CisgICAgaGVhZFtpXSAgID0gLTE7ICAgICAgICAgICAgICAgICAgICAgLy8gZGVncmVlIGxpc3QgaSBpcyBlbXB0eQorICAgIGxhc3RbaV0gICA9IC0xOworICAgIG5leHRbaV0gICA9IC0xOworICAgIGhoZWFkW2ldICA9IC0xOyAgICAgICAgICAgICAgICAgICAgIC8vIGhhc2ggbGlzdCBpIGlzIGVtcHR5IAorICAgIG52W2ldICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgaSBpcyBqdXN0IG9uZSBub2RlCisgICAgd1tpXSAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBpIGlzIGFsaXZlCisgICAgZWxlbltpXSAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gRWsgb2Ygbm9kZSBpIGlzIGVtcHR5CisgICAgZGVncmVlW2ldID0gbGVuW2ldOyAgICAgICAgICAgICAgICAgLy8gZGVncmVlIG9mIG5vZGUgaQorICB9CisgIG1hcmsgPSBpbnRlcm5hbDo6Y3Nfd2NsZWFyPFN0b3JhZ2VJbmRleD4oMCwgMCwgdywgbik7ICAgICAgICAgLyogY2xlYXIgdyAqLworICAKKyAgLyogLS0tIEluaXRpYWxpemUgZGVncmVlIGxpc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsKKyAgICBib29sIGhhc19kaWFnID0gZmFsc2U7CisgICAgZm9yKHAgPSBDcFtpXTsgcDxDcFtpKzFdOyArK3ApCisgICAgICBpZihDaVtwXT09aSkKKyAgICAgIHsKKyAgICAgICAgaGFzX2RpYWcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgIAorICAgIGQgPSBkZWdyZWVbaV07CisgICAgaWYoZCA9PSAxICYmIGhhc19kaWFnKSAgICAgICAgICAgLyogbm9kZSBpIGlzIGVtcHR5ICovCisgICAgeworICAgICAgZWxlbltpXSA9IC0yOyAgICAgICAgICAgICAgICAgLyogZWxlbWVudCBpIGlzIGRlYWQgKi8KKyAgICAgIG5lbCsrOworICAgICAgQ3BbaV0gPSAtMTsgICAgICAgICAgICAgICAgICAgLyogaSBpcyBhIHJvb3Qgb2YgYXNzZW1ibHkgdHJlZSAqLworICAgICAgd1tpXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYoZCA+IGRlbnNlIHx8ICFoYXNfZGlhZykgIC8qIG5vZGUgaSBpcyBkZW5zZSBvciBoYXMgbm8gc3RydWN0dXJhbCBkaWFnb25hbCBlbGVtZW50ICovCisgICAgeworICAgICAgbnZbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogYWJzb3JiIGkgaW50byBlbGVtZW50IG4gKi8KKyAgICAgIGVsZW5baV0gPSAtMTsgICAgICAgICAgICAgICAgIC8qIG5vZGUgaSBpcyBkZWFkICovCisgICAgICBuZWwrKzsKKyAgICAgIENwW2ldID0gYW1kX2ZsaXAgKG4pOworICAgICAgbnZbbl0rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKGhlYWRbZF0gIT0gLTEpIGxhc3RbaGVhZFtkXV0gPSBpOworICAgICAgbmV4dFtpXSA9IGhlYWRbZF07ICAgICAgICAgICAvKiBwdXQgbm9kZSBpIGluIGRlZ3JlZSBsaXN0IGQgKi8KKyAgICAgIGhlYWRbZF0gPSBpOworICAgIH0KKyAgfQorICAKKyAgZWxlbltuXSA9IC0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuIGlzIGEgZGVhZCBlbGVtZW50ICovCisgIENwW25dID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbiBpcyBhIHJvb3Qgb2YgYXNzZW1ibHkgdHJlZSAqLworICB3W25dID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG4gaXMgYSBkZWFkIGVsZW1lbnQgKi8KKyAgCisgIHdoaWxlIChuZWwgPCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAoc2VsZWN0aW5nIHBpdm90cykgZG8gKi8KKyAgeworICAgIC8qIC0tLSBTZWxlY3Qgbm9kZSBvZiBtaW5pbXVtIGFwcHJveGltYXRlIGRlZ3JlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGZvcihrID0gLTE7IG1pbmRlZyA8IG4gJiYgKGsgPSBoZWFkW21pbmRlZ10pID09IC0xOyBtaW5kZWcrKykge30KKyAgICBpZihuZXh0W2tdICE9IC0xKSBsYXN0W25leHRba11dID0gLTE7CisgICAgaGVhZFttaW5kZWddID0gbmV4dFtrXTsgICAgICAgICAgLyogcmVtb3ZlIGsgZnJvbSBkZWdyZWUgbGlzdCAqLworICAgIGVsZW5rID0gZWxlbltrXTsgICAgICAgICAgICAgICAgICAvKiBlbGVuayA9IHxFa3wgKi8KKyAgICBudmsgPSBudltrXTsgICAgICAgICAgICAgICAgICAgICAgLyogIyBvZiBub2RlcyBrIHJlcHJlc2VudHMgKi8KKyAgICBuZWwgKz0gbnZrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG52W2tdIG5vZGVzIG9mIEEgZWxpbWluYXRlZCAqLworICAgIAorICAgIC8qIC0tLSBHYXJiYWdlIGNvbGxlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmKGVsZW5rID4gMCAmJiBjbnogKyBtaW5kZWcgPj0gbnptYXgpCisgICAgeworICAgICAgZm9yKGogPSAwOyBqIDwgbjsgaisrKQorICAgICAgeworICAgICAgICBpZigocCA9IENwW2pdKSA+PSAwKSAgICAgIC8qIGogaXMgYSBsaXZlIG5vZGUgb3IgZWxlbWVudCAqLworICAgICAgICB7CisgICAgICAgICAgQ3Bbal0gPSBDaVtwXTsgICAgICAgICAgLyogc2F2ZSBmaXJzdCBlbnRyeSBvZiBvYmplY3QgKi8KKyAgICAgICAgICBDaVtwXSA9IGFtZF9mbGlwIChqKTsgICAgLyogZmlyc3QgZW50cnkgaXMgbm93IGFtZF9mbGlwKGopICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvcihxID0gMCwgcCA9IDA7IHAgPCBjbno7ICkgLyogc2NhbiBhbGwgb2YgbWVtb3J5ICovCisgICAgICB7CisgICAgICAgIGlmKChqID0gYW1kX2ZsaXAgKENpW3ArK10pKSA+PSAwKSAgLyogZm91bmQgb2JqZWN0IGogKi8KKyAgICAgICAgeworICAgICAgICAgIENpW3FdID0gQ3Bbal07ICAgICAgIC8qIHJlc3RvcmUgZmlyc3QgZW50cnkgb2Ygb2JqZWN0ICovCisgICAgICAgICAgQ3Bbal0gPSBxKys7ICAgICAgICAgIC8qIG5ldyBwb2ludGVyIHRvIG9iamVjdCBqICovCisgICAgICAgICAgZm9yKGszID0gMDsgazMgPCBsZW5bal0tMTsgazMrKykgQ2lbcSsrXSA9IENpW3ArK107CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNueiA9IHE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDaVtjbnouLi5uem1heC0xXSBub3cgZnJlZSAqLworICAgIH0KKyAgICAKKyAgICAvKiAtLS0gQ29uc3RydWN0IG5ldyBlbGVtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBkayA9IDA7CisgICAgbnZba10gPSAtbnZrOyAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgayBhcyBpbiBMayAqLworICAgIHAgPSBDcFtrXTsKKyAgICBwazEgPSAoZWxlbmsgPT0gMCkgPyBwIDogY256OyAgICAgIC8qIGRvIGluIHBsYWNlIGlmIGVsZW5ba10gPT0gMCAqLworICAgIHBrMiA9IHBrMTsKKyAgICBmb3IoazEgPSAxOyBrMSA8PSBlbGVuayArIDE7IGsxKyspCisgICAgeworICAgICAgaWYoazEgPiBlbGVuaykKKyAgICAgIHsKKyAgICAgICAgZSA9IGs7ICAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIHRoZSBub2RlcyBpbiBrICovCisgICAgICAgIHBqID0gcDsgICAgICAgICAgICAgICAgICAgIC8qIGxpc3Qgb2Ygbm9kZXMgc3RhcnRzIGF0IENpW3BqXSovCisgICAgICAgIGxuID0gbGVuW2tdIC0gZWxlbms7ICAgICAgLyogbGVuZ3RoIG9mIGxpc3Qgb2Ygbm9kZXMgaW4gayAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBlID0gQ2lbcCsrXTsgICAgICAgICAgICAgIC8qIHNlYXJjaCB0aGUgbm9kZXMgaW4gZSAqLworICAgICAgICBwaiA9IENwW2VdOworICAgICAgICBsbiA9IGxlbltlXTsgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBsaXN0IG9mIG5vZGVzIGluIGUgKi8KKyAgICAgIH0KKyAgICAgIGZvcihrMiA9IDE7IGsyIDw9IGxuOyBrMisrKQorICAgICAgeworICAgICAgICBpID0gQ2lbcGorK107CisgICAgICAgIGlmKChudmkgPSBudltpXSkgPD0gMCkgY29udGludWU7IC8qIG5vZGUgaSBkZWFkLCBvciBzZWVuICovCisgICAgICAgIGRrICs9IG52aTsgICAgICAgICAgICAgICAgIC8qIGRlZ3JlZVtMa10gKz0gc2l6ZSBvZiBub2RlIGkgKi8KKyAgICAgICAgbnZbaV0gPSAtbnZpOyAgICAgICAgICAgICAvKiBuZWdhdGUgbnZbaV0gdG8gZGVub3RlIGkgaW4gTGsqLworICAgICAgICBDaVtwazIrK10gPSBpOyAgICAgICAgICAgIC8qIHBsYWNlIGkgaW4gTGsgKi8KKyAgICAgICAgaWYobmV4dFtpXSAhPSAtMSkgbGFzdFtuZXh0W2ldXSA9IGxhc3RbaV07CisgICAgICAgIGlmKGxhc3RbaV0gIT0gLTEpICAgICAgICAgLyogcmVtb3ZlIGkgZnJvbSBkZWdyZWUgbGlzdCAqLworICAgICAgICB7CisgICAgICAgICAgbmV4dFtsYXN0W2ldXSA9IG5leHRbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGVhZFtkZWdyZWVbaV1dID0gbmV4dFtpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYoZSAhPSBrKQorICAgICAgeworICAgICAgICBDcFtlXSA9IGFtZF9mbGlwIChrKTsgICAgICAvKiBhYnNvcmIgZSBpbnRvIGsgKi8KKyAgICAgICAgd1tlXSA9IDA7ICAgICAgICAgICAgICAgICAvKiBlIGlzIG5vdyBhIGRlYWQgZWxlbWVudCAqLworICAgICAgfQorICAgIH0KKyAgICBpZihlbGVuayAhPSAwKSBjbnogPSBwazI7ICAgICAgICAgLyogQ2lbY256Li4ubnptYXhdIGlzIGZyZWUgKi8KKyAgICBkZWdyZWVba10gPSBkazsgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgZGVncmVlIG9mIGsgLSB8TGtcaXwgKi8KKyAgICBDcFtrXSA9IHBrMTsgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCBrIGlzIGluIENpW3BrMS4ucGsyLTFdICovCisgICAgbGVuW2tdID0gcGsyIC0gcGsxOworICAgIGVsZW5ba10gPSAtMjsgICAgICAgICAgICAgICAgICAgICAvKiBrIGlzIG5vdyBhbiBlbGVtZW50ICovCisgICAgCisgICAgLyogLS0tIEZpbmQgc2V0IGRpZmZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgbWFyayA9IGludGVybmFsOjpjc193Y2xlYXI8U3RvcmFnZUluZGV4PihtYXJrLCBsZW1heCwgdywgbik7ICAvKiBjbGVhciB3IGlmIG5lY2Vzc2FyeSAqLworICAgIGZvcihwayA9IHBrMTsgcGsgPCBwazI7IHBrKyspICAgIC8qIHNjYW4gMTogZmluZCB8TGVcTGt8ICovCisgICAgeworICAgICAgaSA9IENpW3BrXTsKKyAgICAgIGlmKChlbG4gPSBlbGVuW2ldKSA8PSAwKSBjb250aW51ZTsvKiBza2lwIGlmIGVsZW5baV0gZW1wdHkgKi8KKyAgICAgIG52aSA9IC1udltpXTsgICAgICAgICAgICAgICAgICAgICAgLyogbnZbaV0gd2FzIG5lZ2F0ZWQgKi8KKyAgICAgIHdudmkgPSBtYXJrIC0gbnZpOworICAgICAgZm9yKHAgPSBDcFtpXTsgcCA8PSBDcFtpXSArIGVsbiAtIDE7IHArKykgIC8qIHNjYW4gRWkgKi8KKyAgICAgIHsKKyAgICAgICAgZSA9IENpW3BdOworICAgICAgICBpZih3W2VdID49IG1hcmspCisgICAgICAgIHsKKyAgICAgICAgICB3W2VdIC09IG52aTsgICAgICAgICAgLyogZGVjcmVtZW50IHxMZVxMa3wgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHdbZV0gIT0gMCkgICAgICAgIC8qIGVuc3VyZSBlIGlzIGEgbGl2ZSBlbGVtZW50ICovCisgICAgICAgIHsKKyAgICAgICAgICB3W2VdID0gZGVncmVlW2VdICsgd252aTsgLyogMXN0IHRpbWUgZSBzZWVuIGluIHNjYW4gMSAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIC0tLSBEZWdyZWUgdXBkYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGZvcihwayA9IHBrMTsgcGsgPCBwazI7IHBrKyspICAgIC8qIHNjYW4yOiBkZWdyZWUgdXBkYXRlICovCisgICAgeworICAgICAgaSA9IENpW3BrXTsgICAgICAgICAgICAgICAgICAgLyogY29uc2lkZXIgbm9kZSBpIGluIExrICovCisgICAgICBwMSA9IENwW2ldOworICAgICAgcDIgPSBwMSArIGVsZW5baV0gLSAxOworICAgICAgcG4gPSBwMTsKKyAgICAgIGZvcihoID0gMCwgZCA9IDAsIHAgPSBwMTsgcCA8PSBwMjsgcCsrKSAgICAvKiBzY2FuIEVpICovCisgICAgICB7CisgICAgICAgIGUgPSBDaVtwXTsKKyAgICAgICAgaWYod1tlXSAhPSAwKSAgICAgICAgICAgICAvKiBlIGlzIGFuIHVuYWJzb3JiZWQgZWxlbWVudCAqLworICAgICAgICB7CisgICAgICAgICAgZGV4dCA9IHdbZV0gLSBtYXJrOyAgIC8qIGRleHQgPSB8TGVcTGt8ICovCisgICAgICAgICAgaWYoZGV4dCA+IDApCisgICAgICAgICAgeworICAgICAgICAgICAgZCArPSBkZXh0OyAgICAgICAgIC8qIHN1bSB1cCB0aGUgc2V0IGRpZmZlcmVuY2VzICovCisgICAgICAgICAgICBDaVtwbisrXSA9IGU7ICAgICAvKiBrZWVwIGUgaW4gRWkgKi8KKyAgICAgICAgICAgIGggKz0gZTsgICAgICAgICAgICAvKiBjb21wdXRlIHRoZSBoYXNoIG9mIG5vZGUgaSAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgQ3BbZV0gPSBhbWRfZmxpcCAoayk7ICAvKiBhZ2dyZXNzaXZlIGFic29yYi4gZS0+ayAqLworICAgICAgICAgICAgd1tlXSA9IDA7ICAgICAgICAgICAgIC8qIGUgaXMgYSBkZWFkIGVsZW1lbnQgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsZW5baV0gPSBwbiAtIHAxICsgMTsgICAgICAgIC8qIGVsZW5baV0gPSB8RWl8ICovCisgICAgICBwMyA9IHBuOworICAgICAgcDQgPSBwMSArIGxlbltpXTsKKyAgICAgIGZvcihwID0gcDIgKyAxOyBwIDwgcDQ7IHArKykgLyogcHJ1bmUgZWRnZXMgaW4gQWkgKi8KKyAgICAgIHsKKyAgICAgICAgaiA9IENpW3BdOworICAgICAgICBpZigobnZqID0gbnZbal0pIDw9IDApIGNvbnRpbnVlOyAvKiBub2RlIGogZGVhZCBvciBpbiBMayAqLworICAgICAgICBkICs9IG52ajsgICAgICAgICAgICAgICAgICAvKiBkZWdyZWUoaSkgKz0gfGp8ICovCisgICAgICAgIENpW3BuKytdID0gajsgICAgICAgICAgICAgLyogcGxhY2UgaiBpbiBub2RlIGxpc3Qgb2YgaSAqLworICAgICAgICBoICs9IGo7ICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGhhc2ggZm9yIG5vZGUgaSAqLworICAgICAgfQorICAgICAgaWYoZCA9PSAwKSAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBtYXNzIGVsaW1pbmF0aW9uICovCisgICAgICB7CisgICAgICAgIENwW2ldID0gYW1kX2ZsaXAgKGspOyAgICAgIC8qIGFic29yYiBpIGludG8gayAqLworICAgICAgICBudmkgPSAtbnZbaV07CisgICAgICAgIGRrIC09IG52aTsgICAgICAgICAgICAgICAgIC8qIHxMa3wgLT0gfGl8ICovCisgICAgICAgIG52ayArPSBudmk7ICAgICAgICAgICAgICAgIC8qIHxrfCArPSBudltpXSAqLworICAgICAgICBuZWwgKz0gbnZpOworICAgICAgICBudltpXSA9IDA7CisgICAgICAgIGVsZW5baV0gPSAtMTsgICAgICAgICAgICAgLyogbm9kZSBpIGlzIGRlYWQgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGVncmVlW2ldID0gc3RkOjptaW48U3RvcmFnZUluZGV4PiAoZGVncmVlW2ldLCBkKTsgICAvKiB1cGRhdGUgZGVncmVlKGkpICovCisgICAgICAgIENpW3BuXSA9IENpW3AzXTsgICAgICAgICAvKiBtb3ZlIGZpcnN0IG5vZGUgdG8gZW5kICovCisgICAgICAgIENpW3AzXSA9IENpW3AxXTsgICAgICAgICAvKiBtb3ZlIDFzdCBlbC4gdG8gZW5kIG9mIEVpICovCisgICAgICAgIENpW3AxXSA9IGs7ICAgICAgICAgICAgICAgLyogYWRkIGsgYXMgMXN0IGVsZW1lbnQgaW4gb2YgRWkgKi8KKyAgICAgICAgbGVuW2ldID0gcG4gLSBwMSArIDE7ICAgICAvKiBuZXcgbGVuIG9mIGFkai4gbGlzdCBvZiBub2RlIGkgKi8KKyAgICAgICAgaCAlPSBuOyAgICAgICAgICAgICAgICAgICAgLyogZmluYWxpemUgaGFzaCBvZiBpICovCisgICAgICAgIG5leHRbaV0gPSBoaGVhZFtoXTsgICAgICAvKiBwbGFjZSBpIGluIGhhc2ggYnVja2V0ICovCisgICAgICAgIGhoZWFkW2hdID0gaTsKKyAgICAgICAgbGFzdFtpXSA9IGg7ICAgICAgLyogc2F2ZSBoYXNoIG9mIGkgaW4gbGFzdFtpXSAqLworICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYW4yIGlzIGRvbmUgKi8KKyAgICBkZWdyZWVba10gPSBkazsgICAgICAgICAgICAgICAgICAgLyogZmluYWxpemUgfExrfCAqLworICAgIGxlbWF4ID0gc3RkOjptYXg8U3RvcmFnZUluZGV4PihsZW1heCwgZGspOworICAgIG1hcmsgPSBpbnRlcm5hbDo6Y3Nfd2NsZWFyPFN0b3JhZ2VJbmRleD4obWFyaytsZW1heCwgbGVtYXgsIHcsIG4pOyAgICAvKiBjbGVhciB3ICovCisgICAgCisgICAgLyogLS0tIFN1cGVybm9kZSBkZXRlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgZm9yKHBrID0gcGsxOyBwayA8IHBrMjsgcGsrKykKKyAgICB7CisgICAgICBpID0gQ2lbcGtdOworICAgICAgaWYobnZbaV0gPj0gMCkgY29udGludWU7ICAgICAgICAgLyogc2tpcCBpZiBpIGlzIGRlYWQgKi8KKyAgICAgIGggPSBsYXN0W2ldOyAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FuIGhhc2ggYnVja2V0IG9mIG5vZGUgaSAqLworICAgICAgaSA9IGhoZWFkW2hdOworICAgICAgaGhlYWRbaF0gPSAtMTsgICAgICAgICAgICAgICAgICAgIC8qIGhhc2ggYnVja2V0IHdpbGwgYmUgZW1wdHkgKi8KKyAgICAgIGZvcig7IGkgIT0gLTEgJiYgbmV4dFtpXSAhPSAtMTsgaSA9IG5leHRbaV0sIG1hcmsrKykKKyAgICAgIHsKKyAgICAgICAgbG4gPSBsZW5baV07CisgICAgICAgIGVsbiA9IGVsZW5baV07CisgICAgICAgIGZvcihwID0gQ3BbaV0rMTsgcCA8PSBDcFtpXSArIGxuLTE7IHArKykgd1tDaVtwXV0gPSBtYXJrOworICAgICAgICBqbGFzdCA9IGk7CisgICAgICAgIGZvcihqID0gbmV4dFtpXTsgaiAhPSAtMTsgKSAvKiBjb21wYXJlIGkgd2l0aCBhbGwgaiAqLworICAgICAgICB7CisgICAgICAgICAgb2sgPSAobGVuW2pdID09IGxuKSAmJiAoZWxlbltqXSA9PSBlbG4pOworICAgICAgICAgIGZvcihwID0gQ3Bbal0gKyAxOyBvayAmJiBwIDw9IENwW2pdICsgbG4gLSAxOyBwKyspCisgICAgICAgICAgeworICAgICAgICAgICAgaWYod1tDaVtwXV0gIT0gbWFyaykgb2sgPSAwOyAgICAvKiBjb21wYXJlIGkgYW5kIGoqLworICAgICAgICAgIH0KKyAgICAgICAgICBpZihvaykgICAgICAgICAgICAgICAgICAgICAvKiBpIGFuZCBqIGFyZSBpZGVudGljYWwgKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBDcFtqXSA9IGFtZF9mbGlwIChpKTsgIC8qIGFic29yYiBqIGludG8gaSAqLworICAgICAgICAgICAgbnZbaV0gKz0gbnZbal07CisgICAgICAgICAgICBudltqXSA9IDA7CisgICAgICAgICAgICBlbGVuW2pdID0gLTE7ICAgICAgICAgLyogbm9kZSBqIGlzIGRlYWQgKi8KKyAgICAgICAgICAgIGogPSBuZXh0W2pdOyAgICAgICAgICAvKiBkZWxldGUgaiBmcm9tIGhhc2ggYnVja2V0ICovCisgICAgICAgICAgICBuZXh0W2psYXN0XSA9IGo7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBqbGFzdCA9IGo7ICAgICAgICAgICAgIC8qIGogYW5kIGkgYXJlIGRpZmZlcmVudCAqLworICAgICAgICAgICAgaiA9IG5leHRbal07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIC0tLSBGaW5hbGl6ZSBuZXcgZWxlbWVudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGZvcihwID0gcGsxLCBwayA9IHBrMTsgcGsgPCBwazI7IHBrKyspICAgLyogZmluYWxpemUgTGsgKi8KKyAgICB7CisgICAgICBpID0gQ2lbcGtdOworICAgICAgaWYoKG52aSA9IC1udltpXSkgPD0gMCkgY29udGludWU7Lyogc2tpcCBpZiBpIGlzIGRlYWQgKi8KKyAgICAgIG52W2ldID0gbnZpOyAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIG52W2ldICovCisgICAgICBkID0gZGVncmVlW2ldICsgZGsgLSBudmk7ICAgICAgICAgLyogY29tcHV0ZSBleHRlcm5hbCBkZWdyZWUoaSkgKi8KKyAgICAgIGQgPSBzdGQ6Om1pbjxTdG9yYWdlSW5kZXg+IChkLCBuIC0gbmVsIC0gbnZpKTsKKyAgICAgIGlmKGhlYWRbZF0gIT0gLTEpIGxhc3RbaGVhZFtkXV0gPSBpOworICAgICAgbmV4dFtpXSA9IGhlYWRbZF07ICAgICAgICAgICAgICAgLyogcHV0IGkgYmFjayBpbiBkZWdyZWUgbGlzdCAqLworICAgICAgbGFzdFtpXSA9IC0xOworICAgICAgaGVhZFtkXSA9IGk7CisgICAgICBtaW5kZWcgPSBzdGQ6Om1pbjxTdG9yYWdlSW5kZXg+IChtaW5kZWcsIGQpOyAgICAgICAvKiBmaW5kIG5ldyBtaW5pbXVtIGRlZ3JlZSAqLworICAgICAgZGVncmVlW2ldID0gZDsKKyAgICAgIENpW3ArK10gPSBpOyAgICAgICAgICAgICAgICAgICAgICAvKiBwbGFjZSBpIGluIExrICovCisgICAgfQorICAgIG52W2tdID0gbnZrOyAgICAgICAgICAgICAgICAgICAgICAvKiAjIG5vZGVzIGFic29yYmVkIGludG8gayAqLworICAgIGlmKChsZW5ba10gPSBwLXBrMSkgPT0gMCkgICAgICAgICAvKiBsZW5ndGggb2YgYWRqIGxpc3Qgb2YgZWxlbWVudCBrKi8KKyAgICB7CisgICAgICBDcFtrXSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBrIGlzIGEgcm9vdCBvZiB0aGUgdHJlZSAqLworICAgICAgd1trXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogayBpcyBub3cgYSBkZWFkIGVsZW1lbnQgKi8KKyAgICB9CisgICAgaWYoZWxlbmsgIT0gMCkgY256ID0gcDsgICAgICAgICAgIC8qIGZyZWUgdW51c2VkIHNwYWNlIGluIExrICovCisgIH0KKyAgCisgIC8qIC0tLSBQb3N0b3JkZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSBDcFtpXSA9IGFtZF9mbGlwIChDcFtpXSk7LyogZml4IGFzc2VtYmx5IHRyZWUgKi8KKyAgZm9yKGogPSAwOyBqIDw9IG47IGorKykgaGVhZFtqXSA9IC0xOworICBmb3IoaiA9IG47IGogPj0gMDsgai0tKSAgICAgICAgICAgICAgLyogcGxhY2UgdW5vcmRlcmVkIG5vZGVzIGluIGxpc3RzICovCisgIHsKKyAgICBpZihudltqXSA+IDApIGNvbnRpbnVlOyAgICAgICAgICAvKiBza2lwIGlmIGogaXMgYW4gZWxlbWVudCAqLworICAgIG5leHRbal0gPSBoZWFkW0NwW2pdXTsgICAgICAgICAgLyogcGxhY2UgaiBpbiBsaXN0IG9mIGl0cyBwYXJlbnQgKi8KKyAgICBoZWFkW0NwW2pdXSA9IGo7CisgIH0KKyAgZm9yKGUgPSBuOyBlID49IDA7IGUtLSkgICAgICAgICAgICAgIC8qIHBsYWNlIGVsZW1lbnRzIGluIGxpc3RzICovCisgIHsKKyAgICBpZihudltlXSA8PSAwKSBjb250aW51ZTsgICAgICAgICAvKiBza2lwIHVubGVzcyBlIGlzIGFuIGVsZW1lbnQgKi8KKyAgICBpZihDcFtlXSAhPSAtMSkKKyAgICB7CisgICAgICBuZXh0W2VdID0gaGVhZFtDcFtlXV07ICAgICAgLyogcGxhY2UgZSBpbiBsaXN0IG9mIGl0cyBwYXJlbnQgKi8KKyAgICAgIGhlYWRbQ3BbZV1dID0gZTsKKyAgICB9CisgIH0KKyAgZm9yKGsgPSAwLCBpID0gMDsgaSA8PSBuOyBpKyspICAgICAgIC8qIHBvc3RvcmRlciB0aGUgYXNzZW1ibHkgdHJlZSAqLworICB7CisgICAgaWYoQ3BbaV0gPT0gLTEpIGsgPSBpbnRlcm5hbDo6Y3NfdGRmczxTdG9yYWdlSW5kZXg+KGksIGssIGhlYWQsIG5leHQsIHBlcm0uaW5kaWNlcygpLmRhdGEoKSwgdyk7CisgIH0KKyAgCisgIHBlcm0uaW5kaWNlcygpLmNvbnNlcnZhdGl2ZVJlc2l6ZShuKTsKK30KKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQU1EX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9PcmRlcmluZ01ldGhvZHMvRWlnZW5fQ29sYW1kLmggYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0VpZ2VuX0NvbGFtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODViNGQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0VpZ2VuX0NvbGFtZC5oCkBAIC0wLDAgKzEsMTg0MyBAQAorLy8gLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRGVzaXJlIE51ZW50c2EgV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gVGhpcyBmaWxlIGlzIG1vZGlmaWVkIGZyb20gdGhlIGNvbGFtZC9zeW1hbWQgbGlicmFyeS4gVGhlIGNvcHlyaWdodCBpcyBiZWxvdworCisvLyAgIFRoZSBhdXRob3JzIG9mIHRoZSBjb2RlIGl0c2VsZiBhcmUgU3RlZmFuIEkuIExhcmltb3JlIGFuZCBUaW1vdGh5IEEuCisvLyAgIERhdmlzIChkYXZpc0BjaXNlLnVmbC5lZHUpLCBVbml2ZXJzaXR5IG9mIEZsb3JpZGEuICBUaGUgYWxnb3JpdGhtIHdhcworLy8gICBkZXZlbG9wZWQgaW4gY29sbGFib3JhdGlvbiB3aXRoIEpvaG4gR2lsYmVydCwgWGVyb3ggUEFSQywgYW5kIEVzbW9uZAorLy8gICBOZywgT2FrIFJpZGdlIE5hdGlvbmFsIExhYm9yYXRvcnkuCisvLyAKKy8vICAgICBEYXRlOgorLy8gCisvLyAgIFNlcHRlbWJlciA4LCAyMDAzLiAgVmVyc2lvbiAyLjMuCisvLyAKKy8vICAgICBBY2tub3dsZWRnZW1lbnRzOgorLy8gCisvLyAgIFRoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IHRoZSBOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24sIHVuZGVyCisvLyAgIGdyYW50cyBETVMtOTUwNDk3NCBhbmQgRE1TLTk4MDM1OTkuCisvLyAKKy8vICAgICBOb3RpY2U6CisvLyAKKy8vICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgYnkgdGhlIFVuaXZlcnNpdHkgb2YgRmxvcmlkYS4KKy8vICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIAorLy8gICBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKy8vICAgRVhQUkVTU0VEIE9SIElNUExJRUQuICBBTlkgVVNFIElTIEFUIFlPVVIgT1dOIFJJU0suCisvLyAKKy8vICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUKKy8vICAgdGhpcyBwcm9ncmFtLCBwcm92aWRlZCB0aGF0IHRoZSBDb3B5cmlnaHQsIHRoaXMgTGljZW5zZSwgYW5kIHRoZQorLy8gICBBdmFpbGFiaWxpdHkgb2YgdGhlIG9yaWdpbmFsIHZlcnNpb24gaXMgcmV0YWluZWQgb24gYWxsIGNvcGllcyBhbmQgbWFkZQorLy8gICBhY2Nlc3NpYmxlIHRvIHRoZSBlbmQtdXNlciBvZiBhbnkgY29kZSBvciBwYWNrYWdlIHRoYXQgaW5jbHVkZXMgQ09MQU1ECisvLyAgIG9yIGFueSBtb2RpZmllZCB2ZXJzaW9uIG9mIENPTEFNRC4gCisvLyAKKy8vICAgICBBdmFpbGFiaWxpdHk6CisvLyAKKy8vICAgVGhlIGNvbGFtZC9zeW1hbWQgbGlicmFyeSBpcyBhdmFpbGFibGUgYXQKKy8vIAorLy8gICAgICAgaHR0cDovL3d3dy5zdWl0ZXNwYXJzZS5jb20KKworICAKKyNpZm5kZWYgRUlHRU5fQ09MQU1EX0gKKyNkZWZpbmUgRUlHRU5fQ09MQU1EX0gKKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8qIEVuc3VyZSB0aGF0IGRlYnVnZ2luZyBpcyB0dXJuZWQgb2ZmOiAqLworI2lmbmRlZiBDT0xBTURfTkRFQlVHCisjZGVmaW5lIENPTEFNRF9OREVCVUcKKyNlbmRpZiAvKiBOREVCVUcgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gS25vYiBhbmQgc3RhdGlzdGljcyBkZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogc2l6ZSBvZiB0aGUga25vYnMgWyBdIGFycmF5LiAgT25seSBrbm9icyBbMC4uMV0gYXJlIGN1cnJlbnRseSB1c2VkLiAqLworI2RlZmluZSBDT0xBTURfS05PQlMgMjAKKworLyogbnVtYmVyIG9mIG91dHB1dCBzdGF0aXN0aWNzLiAgT25seSBzdGF0cyBbMC4uNl0gYXJlIGN1cnJlbnRseSB1c2VkLiAqLworI2RlZmluZSBDT0xBTURfU1RBVFMgMjAgCisKKy8qIGtub2JzIFswXSBhbmQgc3RhdHMgWzBdOiBkZW5zZSByb3cga25vYiBhbmQgb3V0cHV0IHN0YXRpc3RpYy4gKi8KKyNkZWZpbmUgQ09MQU1EX0RFTlNFX1JPVyAwCisKKy8qIGtub2JzIFsxXSBhbmQgc3RhdHMgWzFdOiBkZW5zZSBjb2x1bW4ga25vYiBhbmQgb3V0cHV0IHN0YXRpc3RpYy4gKi8KKyNkZWZpbmUgQ09MQU1EX0RFTlNFX0NPTCAxCisKKy8qIHN0YXRzIFsyXTogbWVtb3J5IGRlZnJhZ21lbnRhdGlvbiBjb3VudCBvdXRwdXQgc3RhdGlzdGljICovCisjZGVmaW5lIENPTEFNRF9ERUZSQUdfQ09VTlQgMgorCisvKiBzdGF0cyBbM106IGNvbGFtZCBzdGF0dXM6ICB6ZXJvIE9LLCA+IDAgd2FybmluZyBvciBub3RpY2UsIDwgMCBlcnJvciAqLworI2RlZmluZSBDT0xBTURfU1RBVFVTIDMKKworLyogc3RhdHMgWzQuLjZdOiBlcnJvciBpbmZvLCBvciBpbmZvIG9uIGp1bWJsZWQgY29sdW1ucyAqLyAKKyNkZWZpbmUgQ09MQU1EX0lORk8xIDQKKyNkZWZpbmUgQ09MQU1EX0lORk8yIDUKKyNkZWZpbmUgQ09MQU1EX0lORk8zIDYKKworLyogZXJyb3IgY29kZXMgcmV0dXJuZWQgaW4gc3RhdHMgWzNdOiAqLworI2RlZmluZSBDT0xBTURfT0sgICAgICAgKDApCisjZGVmaW5lIENPTEFNRF9PS19CVVRfSlVNQkxFRCAgICAgKDEpCisjZGVmaW5lIENPTEFNRF9FUlJPUl9BX25vdF9wcmVzZW50ICAgICgtMSkKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX3Bfbm90X3ByZXNlbnQgICAgKC0yKQorI2RlZmluZSBDT0xBTURfRVJST1JfbnJvd19uZWdhdGl2ZSAgICAoLTMpCisjZGVmaW5lIENPTEFNRF9FUlJPUl9uY29sX25lZ2F0aXZlICAgICgtNCkKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX25uel9uZWdhdGl2ZSAgICgtNSkKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX3AwX25vbnplcm8gICAgICgtNikKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX0FfdG9vX3NtYWxsICAgICgtNykKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX2NvbF9sZW5ndGhfbmVnYXRpdmUgICgtOCkKKyNkZWZpbmUgQ09MQU1EX0VSUk9SX3Jvd19pbmRleF9vdXRfb2ZfYm91bmRzICAoLTkpCisjZGVmaW5lIENPTEFNRF9FUlJPUl9vdXRfb2ZfbWVtb3J5ICAgICgtMTApCisjZGVmaW5lIENPTEFNRF9FUlJPUl9pbnRlcm5hbF9lcnJvciAgICgtOTk5KQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09IERlZmluaXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNkZWZpbmUgT05FU19DT01QTEVNRU5UKHIpICgtKHIpLTEpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ09MQU1EX0VNUFRZICgtMSkKKworLyogUm93IGFuZCBjb2x1bW4gc3RhdHVzICovCisjZGVmaW5lIEFMSVZFICgwKQorI2RlZmluZSBERUFEICAoLTEpCisKKy8qIENvbHVtbiBzdGF0dXMgKi8KKyNkZWZpbmUgREVBRF9QUklOQ0lQQUwgICAgKC0xKQorI2RlZmluZSBERUFEX05PTl9QUklOQ0lQQUwgICgtMikKKworLyogTWFjcm9zIGZvciByb3cgYW5kIGNvbHVtbiBzdGF0dXMgdXBkYXRlIGFuZCBjaGVja2luZy4gKi8KKyNkZWZpbmUgUk9XX0lTX0RFQUQocikgICAgICBST1dfSVNfTUFSS0VEX0RFQUQgKFJvd1tyXS5zaGFyZWQyLm1hcmspCisjZGVmaW5lIFJPV19JU19NQVJLRURfREVBRChyb3dfbWFyaykgIChyb3dfbWFyayA8IEFMSVZFKQorI2RlZmluZSBST1dfSVNfQUxJVkUocikgICAgIChSb3cgW3JdLnNoYXJlZDIubWFyayA+PSBBTElWRSkKKyNkZWZpbmUgQ09MX0lTX0RFQUQoYykgICAgICAoQ29sIFtjXS5zdGFydCA8IEFMSVZFKQorI2RlZmluZSBDT0xfSVNfQUxJVkUoYykgICAgIChDb2wgW2NdLnN0YXJ0ID49IEFMSVZFKQorI2RlZmluZSBDT0xfSVNfREVBRF9QUklOQ0lQQUwoYykgIChDb2wgW2NdLnN0YXJ0ID09IERFQURfUFJJTkNJUEFMKQorI2RlZmluZSBLSUxMX1JPVyhyKSAgICAgeyBSb3cgW3JdLnNoYXJlZDIubWFyayA9IERFQUQgOyB9CisjZGVmaW5lIEtJTExfUFJJTkNJUEFMX0NPTChjKSAgIHsgQ29sIFtjXS5zdGFydCA9IERFQURfUFJJTkNJUEFMIDsgfQorI2RlZmluZSBLSUxMX05PTl9QUklOQ0lQQUxfQ09MKGMpIHsgQ29sIFtjXS5zdGFydCA9IERFQURfTk9OX1BSSU5DSVBBTCA7IH0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PSBDb2xhbWQgcmVwb3J0aW5nIG1lY2hhbmlzbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvLyA9PSBSb3cgYW5kIENvbHVtbiBzdHJ1Y3R1cmVzID09Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IGNvbGFtZF9jb2wKK3sKKyAgSW5kZXhUeXBlIHN0YXJ0IDsgICAvKiBpbmRleCBmb3IgQSBvZiBmaXJzdCByb3cgaW4gdGhpcyBjb2x1bW4sIG9yIERFQUQgKi8KKyAgLyogaWYgY29sdW1uIGlzIGRlYWQgKi8KKyAgSW5kZXhUeXBlIGxlbmd0aCA7ICAvKiBudW1iZXIgb2Ygcm93cyBpbiB0aGlzIGNvbHVtbiAqLworICB1bmlvbgorICB7CisgICAgSW5kZXhUeXBlIHRoaWNrbmVzcyA7IC8qIG51bWJlciBvZiBvcmlnaW5hbCBjb2x1bW5zIHJlcHJlc2VudGVkIGJ5IHRoaXMgKi8KKyAgICAvKiBjb2wsIGlmIHRoZSBjb2x1bW4gaXMgYWxpdmUgKi8KKyAgICBJbmRleFR5cGUgcGFyZW50IDsgIC8qIHBhcmVudCBpbiBwYXJlbnQgdHJlZSBzdXBlci1jb2x1bW4gc3RydWN0dXJlLCBpZiAqLworICAgIC8qIHRoZSBjb2x1bW4gaXMgZGVhZCAqLworICB9IHNoYXJlZDEgOworICB1bmlvbgorICB7CisgICAgSW5kZXhUeXBlIHNjb3JlIDsgLyogdGhlIHNjb3JlIHVzZWQgdG8gbWFpbnRhaW4gaGVhcCwgaWYgY29sIGlzIGFsaXZlICovCisgICAgSW5kZXhUeXBlIG9yZGVyIDsgLyogcGl2b3Qgb3JkZXJpbmcgb2YgdGhpcyBjb2x1bW4sIGlmIGNvbCBpcyBkZWFkICovCisgIH0gc2hhcmVkMiA7CisgIHVuaW9uCisgIHsKKyAgICBJbmRleFR5cGUgaGVhZGhhc2ggOyAgLyogaGVhZCBvZiBhIGhhc2ggYnVja2V0LCBpZiBjb2wgaXMgYXQgdGhlIGhlYWQgb2YgKi8KKyAgICAvKiBhIGRlZ3JlZSBsaXN0ICovCisgICAgSW5kZXhUeXBlIGhhc2ggOyAgLyogaGFzaCB2YWx1ZSwgaWYgY29sIGlzIG5vdCBpbiBhIGRlZ3JlZSBsaXN0ICovCisgICAgSW5kZXhUeXBlIHByZXYgOyAgLyogcHJldmlvdXMgY29sdW1uIGluIGRlZ3JlZSBsaXN0LCBpZiBjb2wgaXMgaW4gYSAqLworICAgIC8qIGRlZ3JlZSBsaXN0IChidXQgbm90IGF0IHRoZSBoZWFkIG9mIGEgZGVncmVlIGxpc3QpICovCisgIH0gc2hhcmVkMyA7CisgIHVuaW9uCisgIHsKKyAgICBJbmRleFR5cGUgZGVncmVlX25leHQgOyAvKiBuZXh0IGNvbHVtbiwgaWYgY29sIGlzIGluIGEgZGVncmVlIGxpc3QgKi8KKyAgICBJbmRleFR5cGUgaGFzaF9uZXh0IDsgICAvKiBuZXh0IGNvbHVtbiwgaWYgY29sIGlzIGluIGEgaGFzaCBsaXN0ICovCisgIH0gc2hhcmVkNCA7CisgIAorfTsKKyAKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdHJ1Y3QgQ29sYW1kX1JvdworeworICBJbmRleFR5cGUgc3RhcnQgOyAgIC8qIGluZGV4IGZvciBBIG9mIGZpcnN0IGNvbCBpbiB0aGlzIHJvdyAqLworICBJbmRleFR5cGUgbGVuZ3RoIDsgIC8qIG51bWJlciBvZiBwcmluY2lwYWwgY29sdW1ucyBpbiB0aGlzIHJvdyAqLworICB1bmlvbgorICB7CisgICAgSW5kZXhUeXBlIGRlZ3JlZSA7ICAvKiBudW1iZXIgb2YgcHJpbmNpcGFsICYgbm9uLXByaW5jaXBhbCBjb2x1bW5zIGluIHJvdyAqLworICAgIEluZGV4VHlwZSBwIDsgICAvKiB1c2VkIGFzIGEgcm93IHBvaW50ZXIgaW4gaW5pdF9yb3dzX2NvbHMgKCkgKi8KKyAgfSBzaGFyZWQxIDsKKyAgdW5pb24KKyAgeworICAgIEluZGV4VHlwZSBtYXJrIDsgIC8qIGZvciBjb21wdXRpbmcgc2V0IGRpZmZlcmVuY2VzIGFuZCBtYXJraW5nIGRlYWQgcm93cyovCisgICAgSW5kZXhUeXBlIGZpcnN0X2NvbHVtbiA7LyogZmlyc3QgY29sdW1uIGluIHJvdyAodXNlZCBpbiBnYXJiYWdlIGNvbGxlY3Rpb24pICovCisgIH0gc2hhcmVkMiA7CisgIAorfTsKKyAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gQ29sYW1kIHJlY29tbWVuZGVkIG1lbW9yeSBzaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAKKy8qCisgIFRoZSByZWNvbW1lbmRlZCBsZW5ndGggQWxlbiBvZiB0aGUgYXJyYXkgQSBwYXNzZWQgdG8gY29sYW1kIGlzIGdpdmVuIGJ5CisgIHRoZSBDT0xBTURfUkVDT01NRU5ERUQgKG5ueiwgbl9yb3csIG5fY29sKSBtYWNyby4gIEl0IHJldHVybnMgLTEgaWYgYW55CisgIGFyZ3VtZW50IGlzIG5lZ2F0aXZlLiAgMipubnogc3BhY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSByb3cgYW5kIGNvbHVtbgorICBpbmRpY2VzIG9mIHRoZSBtYXRyaXguIGNvbGFtZF9jIChuX2NvbCkgKyBjb2xhbWRfciAobl9yb3cpIHNwYWNlIGlzCisgIHJlcXVpcmVkIGZvciB0aGUgQ29sIGFuZCBSb3cgYXJyYXlzLCByZXNwZWN0aXZlbHksIHdoaWNoIGFyZSBpbnRlcm5hbCB0bworICBjb2xhbWQuICBBbiBhZGRpdGlvbmFsIG5fY29sIHNwYWNlIGlzIHRoZSBtaW5pbWFsIGFtb3VudCBvZiAiZWxib3cgcm9vbSIsCisgIGFuZCBubnovNSBtb3JlIHNwYWNlIGlzIHJlY29tbWVuZGVkIGZvciBydW4gdGltZSBlZmZpY2llbmN5LgorICAKKyAgVGhpcyBtYWNybyBpcyBub3QgbmVlZGVkIHdoZW4gdXNpbmcgc3ltYW1kLgorICAKKyAgRXhwbGljaXQgdHlwZWNhc3QgdG8gSW5kZXhUeXBlIGFkZGVkIFNlcHQuIDIzLCAyMDAyLCBDT0xBTUQgdmVyc2lvbiAyLjIsIHRvIGF2b2lkCisgIGdjYyAtcGVkYW50aWMgd2FybmluZyBtZXNzYWdlcy4KKyovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgoraW5saW5lIEluZGV4VHlwZSBjb2xhbWRfYyhJbmRleFR5cGUgbl9jb2wpIAoreyByZXR1cm4gSW5kZXhUeXBlKCAoKG5fY29sKSArIDEpICogc2l6ZW9mIChjb2xhbWRfY29sPEluZGV4VHlwZT4pIC8gc2l6ZW9mIChJbmRleFR5cGUpICkgOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitpbmxpbmUgSW5kZXhUeXBlICBjb2xhbWRfcihJbmRleFR5cGUgbl9yb3cpCit7IHJldHVybiBJbmRleFR5cGUoKChuX3JvdykgKyAxKSAqIHNpemVvZiAoQ29sYW1kX1JvdzxJbmRleFR5cGU+KSAvIHNpemVvZiAoSW5kZXhUeXBlKSk7IH0KKworLy8gUHJvdG90eXBlcyBvZiBub24tdXNlciBjYWxsYWJsZSByb3V0aW5lcwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyBJbmRleFR5cGUgaW5pdF9yb3dzX2NvbHMgKEluZGV4VHlwZSBuX3JvdywgSW5kZXhUeXBlIG5fY29sLCBDb2xhbWRfUm93PEluZGV4VHlwZT4gUm93IFtdLCBjb2xhbWRfY29sPEluZGV4VHlwZT4gY29sIFtdLCBJbmRleFR5cGUgQSBbXSwgSW5kZXhUeXBlIHAgW10sIEluZGV4VHlwZSBzdGF0c1tDT0xBTURfU1RBVFNdICk7IAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgaW5pdF9zY29yaW5nIChJbmRleFR5cGUgbl9yb3csIEluZGV4VHlwZSBuX2NvbCwgQ29sYW1kX1JvdzxJbmRleFR5cGU+IFJvdyBbXSwgY29sYW1kX2NvbDxJbmRleFR5cGU+IENvbCBbXSwgSW5kZXhUeXBlIEEgW10sIEluZGV4VHlwZSBoZWFkIFtdLCBkb3VibGUga25vYnNbQ09MQU1EX0tOT0JTXSwgSW5kZXhUeXBlICpwX25fcm93MiwgSW5kZXhUeXBlICpwX25fY29sMiwgSW5kZXhUeXBlICpwX21heF9kZWcpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIEluZGV4VHlwZSBmaW5kX29yZGVyaW5nIChJbmRleFR5cGUgbl9yb3csIEluZGV4VHlwZSBuX2NvbCwgSW5kZXhUeXBlIEFsZW4sIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiBSb3cgW10sIGNvbGFtZF9jb2w8SW5kZXhUeXBlPiBDb2wgW10sIEluZGV4VHlwZSBBIFtdLCBJbmRleFR5cGUgaGVhZCBbXSwgSW5kZXhUeXBlIG5fY29sMiwgSW5kZXhUeXBlIG1heF9kZWcsIEluZGV4VHlwZSBwZnJlZSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCBvcmRlcl9jaGlsZHJlbiAoSW5kZXhUeXBlIG5fY29sLCBjb2xhbWRfY29sPEluZGV4VHlwZT4gQ29sIFtdLCBJbmRleFR5cGUgcCBbXSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCBkZXRlY3Rfc3VwZXJfY29scyAoY29sYW1kX2NvbDxJbmRleFR5cGU+IENvbCBbXSwgSW5kZXhUeXBlIEEgW10sIEluZGV4VHlwZSBoZWFkIFtdLCBJbmRleFR5cGUgcm93X3N0YXJ0LCBJbmRleFR5cGUgcm93X2xlbmd0aCApIDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyBJbmRleFR5cGUgZ2FyYmFnZV9jb2xsZWN0aW9uIChJbmRleFR5cGUgbl9yb3csIEluZGV4VHlwZSBuX2NvbCwgQ29sYW1kX1JvdzxJbmRleFR5cGU+IFJvdyBbXSwgY29sYW1kX2NvbDxJbmRleFR5cGU+IENvbCBbXSwgSW5kZXhUeXBlIEEgW10sIEluZGV4VHlwZSAqcGZyZWUpIDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyBpbmxpbmUgIEluZGV4VHlwZSBjbGVhcl9tYXJrIChJbmRleFR5cGUgbl9yb3csIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiBSb3cgW10gKSA7CisKKy8qID09PSBObyBkZWJ1Z2dpbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNkZWZpbmUgQ09MQU1EX0RFQlVHMChwYXJhbXMpIDsKKyNkZWZpbmUgQ09MQU1EX0RFQlVHMShwYXJhbXMpIDsKKyNkZWZpbmUgQ09MQU1EX0RFQlVHMihwYXJhbXMpIDsKKyNkZWZpbmUgQ09MQU1EX0RFQlVHMyhwYXJhbXMpIDsKKyNkZWZpbmUgQ09MQU1EX0RFQlVHNChwYXJhbXMpIDsKKworI2RlZmluZSBDT0xBTURfQVNTRVJUKGV4cHJlc3Npb24pICgodm9pZCkgMCkKKworCisvKioKKyAqIFxicmllZiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBvZiBBbGVuIAorICogCisgKiBSZXR1cm5zIHJlY29tbWVuZGVkIHZhbHVlIG9mIEFsZW4gZm9yIHVzZSBieSBjb2xhbWQuICAKKyAqIFJldHVybnMgLTEgaWYgYW55IGlucHV0IGFyZ3VtZW50IGlzIG5lZ2F0aXZlLiAgCisgKiBUaGUgdXNlIG9mIHRoaXMgcm91dGluZSBvciBtYWNybyBpcyBvcHRpb25hbC4gIAorICogTm90ZSB0aGF0IHRoZSBtYWNybyB1c2VzIGl0cyBhcmd1bWVudHMgICBtb3JlIHRoYW4gb25jZSwgCisgKiBzbyBiZSBjYXJlZnVsIGZvciBzaWRlIGVmZmVjdHMsIGlmIHlvdSBwYXNzIGV4cHJlc3Npb25zIGFzIGFyZ3VtZW50cyB0byBDT0xBTURfUkVDT01NRU5ERUQuICAKKyAqIAorICogXHBhcmFtIG5ueiBub256ZXJvcyBpbiBBCisgKiBccGFyYW0gbl9yb3cgbnVtYmVyIG9mIHJvd3MgaW4gQQorICogXHBhcmFtIG5fY29sIG51bWJlciBvZiBjb2x1bW5zIGluIEEKKyAqIFxyZXR1cm4gcmVjb21tZW5kZWQgdmFsdWUgb2YgQWxlbiBmb3IgdXNlIGJ5IGNvbGFtZAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlPgoraW5saW5lIEluZGV4VHlwZSBjb2xhbWRfcmVjb21tZW5kZWQgKCBJbmRleFR5cGUgbm56LCBJbmRleFR5cGUgbl9yb3csIEluZGV4VHlwZSBuX2NvbCkKK3sKKyAgaWYgKChubnopIDwgMCB8fCAobl9yb3cpIDwgMCB8fCAobl9jb2wpIDwgMCkKKyAgICByZXR1cm4gKC0xKTsKKyAgZWxzZQorICAgIHJldHVybiAoMiAqIChubnopICsgY29sYW1kX2MgKG5fY29sKSArIGNvbGFtZF9yIChuX3JvdykgKyAobl9jb2wpICsgKChubnopIC8gNSkpOyAKK30KKworLyoqCisgKiBcYnJpZWYgc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAgVGhlIHVzZSBvZiB0aGlzIHJvdXRpbmUgaXMgb3B0aW9uYWwuCisgKiAKKyAqIENvbGFtZDogcm93cyB3aXRoIG1vcmUgdGhhbiAoa25vYnMgW0NPTEFNRF9ERU5TRV9ST1ddICogbl9jb2wpCisgKiBlbnRyaWVzIGFyZSByZW1vdmVkIHByaW9yIHRvIG9yZGVyaW5nLiAgQ29sdW1ucyB3aXRoIG1vcmUgdGhhbgorICogKGtub2JzIFtDT0xBTURfREVOU0VfQ09MXSAqIG5fcm93KSBlbnRyaWVzIGFyZSByZW1vdmVkIHByaW9yIHRvCisgKiBvcmRlcmluZywgYW5kIHBsYWNlZCBsYXN0IGluIHRoZSBvdXRwdXQgY29sdW1uIG9yZGVyaW5nLiAKKyAqCisgKiBDT0xBTURfREVOU0VfUk9XIGFuZCBDT0xBTURfREVOU0VfQ09MIGFyZSBkZWZpbmVkIGFzIDAgYW5kIDEsCisgKiByZXNwZWN0aXZlbHksIGluIGNvbGFtZC5oLiAgRGVmYXVsdCB2YWx1ZXMgb2YgdGhlc2UgdHdvIGtub2JzCisgKiBhcmUgYm90aCAwLjUuICBDdXJyZW50bHksIG9ubHkga25vYnMgWzBdIGFuZCBrbm9icyBbMV0gYXJlCisgKiB1c2VkLCBidXQgZnV0dXJlIHZlcnNpb25zIG1heSB1c2UgbW9yZSBrbm9icy4gIElmIHNvLCB0aGV5IHdpbGwKKyAqIGJlIHByb3Blcmx5IHNldCB0byB0aGVpciBkZWZhdWx0cyBieSB0aGUgZnV0dXJlIHZlcnNpb24gb2YKKyAqIGNvbGFtZF9zZXRfZGVmYXVsdHMsIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBjYWxscyBjb2xhbWQgd2lsbAorICogbm90IG5lZWQgdG8gY2hhbmdlLCBhc3N1bWluZyB0aGF0IHlvdSBlaXRoZXIgdXNlCisgKiBjb2xhbWRfc2V0X2RlZmF1bHRzLCBvciBwYXNzIGEgKGRvdWJsZSAqKSBOVUxMIHBvaW50ZXIgYXMgdGhlCisgKiBrbm9icyBhcnJheSB0byBjb2xhbWQgb3Igc3ltYW1kLgorICogCisgKiBccGFyYW0ga25vYnMgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBjb2xhbWQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29sYW1kX3NldF9kZWZhdWx0cyhkb3VibGUga25vYnNbQ09MQU1EX0tOT0JTXSkKK3sKKyAgLyogPT09IExvY2FsIHZhcmlhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworICAKKyAgaW50IGkgOworCisgIGlmICgha25vYnMpCisgIHsKKyAgICByZXR1cm4gOyAgICAgIC8qIG5vIGtub2JzIHRvIGluaXRpYWxpemUgKi8KKyAgfQorICBmb3IgKGkgPSAwIDsgaSA8IENPTEFNRF9LTk9CUyA7IGkrKykKKyAgeworICAgIGtub2JzIFtpXSA9IDAgOworICB9CisgIGtub2JzIFtDT0xBTURfREVOU0VfUk9XXSA9IDAuNSA7ICAvKiBpZ25vcmUgcm93cyBvdmVyIDUwJSBkZW5zZSAqLworICBrbm9icyBbQ09MQU1EX0RFTlNFX0NPTF0gPSAwLjUgOyAgLyogaWdub3JlIGNvbHVtbnMgb3ZlciA1MCUgZGVuc2UgKi8KK30KKworLyoqIAorICogXGJyaWVmICBDb21wdXRlcyBhIGNvbHVtbiBvcmRlcmluZyB1c2luZyB0aGUgY29sdW1uIGFwcHJveGltYXRlIG1pbmltdW0gZGVncmVlIG9yZGVyaW5nCisgKiAKKyAqIENvbXB1dGVzIGEgY29sdW1uIG9yZGVyaW5nIChRKSBvZiBBIHN1Y2ggdGhhdCBQKEFRKT1MVSBvcgorICogKEFRKSdBUT1MTCcgaGF2ZSBsZXNzIGZpbGwtaW4gYW5kIHJlcXVpcmUgZmV3ZXIgZmxvYXRpbmcgcG9pbnQKKyAqIG9wZXJhdGlvbnMgdGhhbiBmYWN0b3JpemluZyB0aGUgdW5wZXJtdXRlZCBtYXRyaXggQSBvciBBJ0EsCisgKiByZXNwZWN0aXZlbHkuCisgKiAKKyAqIAorICogXHBhcmFtIG5fcm93IG51bWJlciBvZiByb3dzIGluIEEKKyAqIFxwYXJhbSBuX2NvbCBudW1iZXIgb2YgY29sdW1ucyBpbiBBCisgKiBccGFyYW0gQWxlbiwgc2l6ZSBvZiB0aGUgYXJyYXkgQQorICogXHBhcmFtIEEgcm93IGluZGljZXMgb2YgdGhlIG1hdHJpeCwgb2Ygc2l6ZSBBTGVuCisgKiBccGFyYW0gcCBjb2x1bW4gcG9pbnRlcnMgb2YgQSwgb2Ygc2l6ZSBuX2NvbCsxCisgKiBccGFyYW0ga25vYnMgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBjb2xhbWQKKyAqIFxwYXJhbSBzdGF0cyBjb2xhbWQgb3V0cHV0IHN0YXRpc3RpY3MgYW5kIGVycm9yIGNvZGVzCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgYm9vbCBjb2xhbWQoSW5kZXhUeXBlIG5fcm93LCBJbmRleFR5cGUgbl9jb2wsIEluZGV4VHlwZSBBbGVuLCBJbmRleFR5cGUgKkEsIEluZGV4VHlwZSAqcCwgZG91YmxlIGtub2JzW0NPTEFNRF9LTk9CU10sIEluZGV4VHlwZSBzdGF0c1tDT0xBTURfU1RBVFNdKQoreworICAvKiA9PT0gTG9jYWwgdmFyaWFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBJbmRleFR5cGUgaSA7ICAgICAvKiBsb29wIGluZGV4ICovCisgIEluZGV4VHlwZSBubnogOyAgICAgLyogbm9uemVyb3MgaW4gQSAqLworICBJbmRleFR5cGUgUm93X3NpemUgOyAgICAvKiBzaXplIG9mIFJvdyBbXSwgaW4gaW50ZWdlcnMgKi8KKyAgSW5kZXhUeXBlIENvbF9zaXplIDsgICAgLyogc2l6ZSBvZiBDb2wgW10sIGluIGludGVnZXJzICovCisgIEluZGV4VHlwZSBuZWVkIDsgICAgICAvKiBtaW5pbXVtIHJlcXVpcmVkIGxlbmd0aCBvZiBBICovCisgIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiAqUm93IDsgICAvKiBwb2ludGVyIGludG8gQSBvZiBSb3cgWzAuLm5fcm93XSBhcnJheSAqLworICBjb2xhbWRfY29sPEluZGV4VHlwZT4gKkNvbCA7ICAgLyogcG9pbnRlciBpbnRvIEEgb2YgQ29sIFswLi5uX2NvbF0gYXJyYXkgKi8KKyAgSW5kZXhUeXBlIG5fY29sMiA7ICAgIC8qIG51bWJlciBvZiBub24tZGVuc2UsIG5vbi1lbXB0eSBjb2x1bW5zICovCisgIEluZGV4VHlwZSBuX3JvdzIgOyAgICAvKiBudW1iZXIgb2Ygbm9uLWRlbnNlLCBub24tZW1wdHkgcm93cyAqLworICBJbmRleFR5cGUgbmdhcmJhZ2UgOyAgICAvKiBudW1iZXIgb2YgZ2FyYmFnZSBjb2xsZWN0aW9ucyBwZXJmb3JtZWQgKi8KKyAgSW5kZXhUeXBlIG1heF9kZWcgOyAgIC8qIG1heGltdW0gcm93IGRlZ3JlZSAqLworICBkb3VibGUgZGVmYXVsdF9rbm9icyBbQ09MQU1EX0tOT0JTXSA7IC8qIGRlZmF1bHQga25vYnMgYXJyYXkgKi8KKyAgCisgIAorICAvKiA9PT0gQ2hlY2sgdGhlIGlucHV0IGFyZ3VtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBpZiAoIXN0YXRzKQorICB7CisgICAgQ09MQU1EX0RFQlVHMCAoKCJjb2xhbWQ6IHN0YXRzIG5vdCBwcmVzZW50XG4iKSkgOworICAgIHJldHVybiAoZmFsc2UpIDsKKyAgfQorICBmb3IgKGkgPSAwIDsgaSA8IENPTEFNRF9TVEFUUyA7IGkrKykKKyAgeworICAgIHN0YXRzIFtpXSA9IDAgOworICB9CisgIHN0YXRzIFtDT0xBTURfU1RBVFVTXSA9IENPTEFNRF9PSyA7CisgIHN0YXRzIFtDT0xBTURfSU5GTzFdID0gLTEgOworICBzdGF0cyBbQ09MQU1EX0lORk8yXSA9IC0xIDsKKyAgCisgIGlmICghQSkgICAvKiBBIGlzIG5vdCBwcmVzZW50ICovCisgIHsKKyAgICBzdGF0cyBbQ09MQU1EX1NUQVRVU10gPSBDT0xBTURfRVJST1JfQV9ub3RfcHJlc2VudCA7CisgICAgQ09MQU1EX0RFQlVHMCAoKCJjb2xhbWQ6IEEgbm90IHByZXNlbnRcbiIpKSA7CisgICAgcmV0dXJuIChmYWxzZSkgOworICB9CisgIAorICBpZiAoIXApICAgLyogcCBpcyBub3QgcHJlc2VudCAqLworICB7CisgICAgc3RhdHMgW0NPTEFNRF9TVEFUVVNdID0gQ09MQU1EX0VSUk9SX3Bfbm90X3ByZXNlbnQgOworICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBwIG5vdCBwcmVzZW50XG4iKSkgOworICAgIHJldHVybiAoZmFsc2UpIDsKKyAgfQorICAKKyAgaWYgKG5fcm93IDwgMCkgIC8qIG5fcm93IG11c3QgYmUgPj0gMCAqLworICB7CisgICAgc3RhdHMgW0NPTEFNRF9TVEFUVVNdID0gQ09MQU1EX0VSUk9SX25yb3dfbmVnYXRpdmUgOworICAgIHN0YXRzIFtDT0xBTURfSU5GTzFdID0gbl9yb3cgOworICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBucm93IG5lZ2F0aXZlICVkXG4iLCBuX3JvdykpIDsKKyAgICByZXR1cm4gKGZhbHNlKSA7CisgIH0KKyAgCisgIGlmIChuX2NvbCA8IDApICAvKiBuX2NvbCBtdXN0IGJlID49IDAgKi8KKyAgeworICAgIHN0YXRzIFtDT0xBTURfU1RBVFVTXSA9IENPTEFNRF9FUlJPUl9uY29sX25lZ2F0aXZlIDsKKyAgICBzdGF0cyBbQ09MQU1EX0lORk8xXSA9IG5fY29sIDsKKyAgICBDT0xBTURfREVCVUcwICgoImNvbGFtZDogbmNvbCBuZWdhdGl2ZSAlZFxuIiwgbl9jb2wpKSA7CisgICAgcmV0dXJuIChmYWxzZSkgOworICB9CisgIAorICBubnogPSBwIFtuX2NvbF0gOworICBpZiAobm56IDwgMCkgIC8qIG5ueiBtdXN0IGJlID49IDAgKi8KKyAgeworICAgIHN0YXRzIFtDT0xBTURfU1RBVFVTXSA9IENPTEFNRF9FUlJPUl9ubnpfbmVnYXRpdmUgOworICAgIHN0YXRzIFtDT0xBTURfSU5GTzFdID0gbm56IDsKKyAgICBDT0xBTURfREVCVUcwICgoImNvbGFtZDogbnVtYmVyIG9mIGVudHJpZXMgbmVnYXRpdmUgJWRcbiIsIG5ueikpIDsKKyAgICByZXR1cm4gKGZhbHNlKSA7CisgIH0KKyAgCisgIGlmIChwIFswXSAhPSAwKQorICB7CisgICAgc3RhdHMgW0NPTEFNRF9TVEFUVVNdID0gQ09MQU1EX0VSUk9SX3AwX25vbnplcm8gOworICAgIHN0YXRzIFtDT0xBTURfSU5GTzFdID0gcCBbMF0gOworICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBwWzBdIG5vdCB6ZXJvICVkXG4iLCBwIFswXSkpIDsKKyAgICByZXR1cm4gKGZhbHNlKSA7CisgIH0KKyAgCisgIC8qID09PSBJZiBubyBrbm9icywgc2V0IGRlZmF1bHQga25vYnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgCisgIGlmICgha25vYnMpCisgIHsKKyAgICBjb2xhbWRfc2V0X2RlZmF1bHRzIChkZWZhdWx0X2tub2JzKSA7CisgICAga25vYnMgPSBkZWZhdWx0X2tub2JzIDsKKyAgfQorICAKKyAgLyogPT09IEFsbG9jYXRlIHRoZSBSb3cgYW5kIENvbCBhcnJheXMgZnJvbSBhcnJheSBBID09PT09PT09PT09PT09PT09PT09PSAqLworICAKKyAgQ29sX3NpemUgPSBjb2xhbWRfYyAobl9jb2wpIDsKKyAgUm93X3NpemUgPSBjb2xhbWRfciAobl9yb3cpIDsKKyAgbmVlZCA9IDIqbm56ICsgbl9jb2wgKyBDb2xfc2l6ZSArIFJvd19zaXplIDsKKyAgCisgIGlmIChuZWVkID4gQWxlbikKKyAgeworICAgIC8qIG5vdCBlbm91Z2ggc3BhY2UgaW4gYXJyYXkgQSB0byBwZXJmb3JtIHRoZSBvcmRlcmluZyAqLworICAgIHN0YXRzIFtDT0xBTURfU1RBVFVTXSA9IENPTEFNRF9FUlJPUl9BX3Rvb19zbWFsbCA7CisgICAgc3RhdHMgW0NPTEFNRF9JTkZPMV0gPSBuZWVkIDsKKyAgICBzdGF0cyBbQ09MQU1EX0lORk8yXSA9IEFsZW4gOworICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBOZWVkIEFsZW4gPj0gJWQsIGdpdmVuIG9ubHkgQWxlbiA9ICVkXG4iLCBuZWVkLEFsZW4pKTsKKyAgICByZXR1cm4gKGZhbHNlKSA7CisgIH0KKyAgCisgIEFsZW4gLT0gQ29sX3NpemUgKyBSb3dfc2l6ZSA7CisgIENvbCA9IChjb2xhbWRfY29sPEluZGV4VHlwZT4gKikgJkEgW0FsZW5dIDsKKyAgUm93ID0gKENvbGFtZF9Sb3c8SW5kZXhUeXBlPiAqKSAmQSBbQWxlbiArIENvbF9zaXplXSA7CisKKyAgLyogPT09IENvbnN0cnVjdCB0aGUgcm93IGFuZCBjb2x1bW4gZGF0YSBzdHJ1Y3R1cmVzID09PT09PT09PT09PT09PT09PT09PSAqLworICAKKyAgaWYgKCFFaWdlbjo6aW50ZXJuYWw6OmluaXRfcm93c19jb2xzIChuX3Jvdywgbl9jb2wsIFJvdywgQ29sLCBBLCBwLCBzdGF0cykpCisgIHsKKyAgICAvKiBpbnB1dCBtYXRyaXggaXMgaW52YWxpZCAqLworICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBNYXRyaXggaW52YWxpZFxuIikpIDsKKyAgICByZXR1cm4gKGZhbHNlKSA7CisgIH0KKyAgCisgIC8qID09PSBJbml0aWFsaXplIHNjb3Jlcywga2lsbCBkZW5zZSByb3dzL2NvbHVtbnMgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBFaWdlbjo6aW50ZXJuYWw6OmluaXRfc2NvcmluZyAobl9yb3csIG5fY29sLCBSb3csIENvbCwgQSwgcCwga25vYnMsCisJCSZuX3JvdzIsICZuX2NvbDIsICZtYXhfZGVnKSA7CisgIAorICAvKiA9PT0gT3JkZXIgdGhlIHN1cGVyY29sdW1ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBuZ2FyYmFnZSA9IEVpZ2VuOjppbnRlcm5hbDo6ZmluZF9vcmRlcmluZyAobl9yb3csIG5fY29sLCBBbGVuLCBSb3csIENvbCwgQSwgcCwKKwkJCSAgICBuX2NvbDIsIG1heF9kZWcsIDIqbm56KSA7CisgIAorICAvKiA9PT0gT3JkZXIgdGhlIG5vbi1wcmluY2lwYWwgY29sdW1ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBFaWdlbjo6aW50ZXJuYWw6Om9yZGVyX2NoaWxkcmVuIChuX2NvbCwgQ29sLCBwKSA7CisgIAorICAvKiA9PT0gUmV0dXJuIHN0YXRpc3RpY3MgaW4gc3RhdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBzdGF0cyBbQ09MQU1EX0RFTlNFX1JPV10gPSBuX3JvdyAtIG5fcm93MiA7CisgIHN0YXRzIFtDT0xBTURfREVOU0VfQ09MXSA9IG5fY29sIC0gbl9jb2wyIDsKKyAgc3RhdHMgW0NPTEFNRF9ERUZSQUdfQ09VTlRdID0gbmdhcmJhZ2UgOworICBDT0xBTURfREVCVUcwICgoImNvbGFtZDogZG9uZS5cbiIpKSA7IAorICByZXR1cm4gKHRydWUpIDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PSBOT04tVVNFUi1DQUxMQUJMRSBST1VUSU5FUzogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBUaGVyZSBhcmUgbm8gdXNlci1jYWxsYWJsZSByb3V0aW5lcyBiZXlvbmQgdGhpcyBwb2ludCBpbiB0aGUgZmlsZSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gaW5pdF9yb3dzX2NvbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAgVGFrZXMgdGhlIGNvbHVtbiBmb3JtIG9mIHRoZSBtYXRyaXggaW4gQSBhbmQgY3JlYXRlcyB0aGUgcm93IGZvcm0gb2YgdGhlCisgIG1hdHJpeC4gIEFsc28sIHJvdyBhbmQgY29sdW1uIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiB0aGUgQ29sIGFuZCBSb3cKKyAgc3RydWN0cy4gIElmIHRoZSBjb2x1bW5zIGFyZSB1bi1zb3J0ZWQgb3IgY29udGFpbiBkdXBsaWNhdGUgcm93IGluZGljZXMsCisgIHRoaXMgcm91dGluZSB3aWxsIGFsc28gc29ydCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSByb3cgaW5kaWNlcyBmcm9tIHRoZQorICBjb2x1bW4gZm9ybSBvZiB0aGUgbWF0cml4LiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgbWF0cml4IGlzIGludmFsaWQsCisgIHRydWUgb3RoZXJ3aXNlLiAgTm90IHVzZXItY2FsbGFibGUuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyBJbmRleFR5cGUgaW5pdF9yb3dzX2NvbHMgIC8qIHJldHVybnMgdHJ1ZSBpZiBPSywgb3IgZmFsc2Ugb3RoZXJ3aXNlICovCisgICgKKyAgICAvKiA9PT0gUGFyYW1ldGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBJbmRleFR5cGUgbl9yb3csICAgICAgLyogbnVtYmVyIG9mIHJvd3Mgb2YgQSAqLworICAgIEluZGV4VHlwZSBuX2NvbCwgICAgICAvKiBudW1iZXIgb2YgY29sdW1ucyBvZiBBICovCisgICAgQ29sYW1kX1JvdzxJbmRleFR5cGU+IFJvdyBbXSwgICAgLyogb2Ygc2l6ZSBuX3JvdysxICovCisgICAgY29sYW1kX2NvbDxJbmRleFR5cGU+IENvbCBbXSwgICAgLyogb2Ygc2l6ZSBuX2NvbCsxICovCisgICAgSW5kZXhUeXBlIEEgW10sICAgICAvKiByb3cgaW5kaWNlcyBvZiBBLCBvZiBzaXplIEFsZW4gKi8KKyAgICBJbmRleFR5cGUgcCBbXSwgICAgIC8qIHBvaW50ZXJzIHRvIGNvbHVtbnMgaW4gQSwgb2Ygc2l6ZSBuX2NvbCsxICovCisgICAgSW5kZXhUeXBlIHN0YXRzIFtDT0xBTURfU1RBVFNdICAvKiBjb2xhbWQgc3RhdGlzdGljcyAqLyAKKyAgICApCit7CisgIC8qID09PSBMb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBJbmRleFR5cGUgY29sIDsgICAgIC8qIGEgY29sdW1uIGluZGV4ICovCisgIEluZGV4VHlwZSByb3cgOyAgICAgLyogYSByb3cgaW5kZXggKi8KKyAgSW5kZXhUeXBlICpjcCA7ICAgICAvKiBhIGNvbHVtbiBwb2ludGVyICovCisgIEluZGV4VHlwZSAqY3BfZW5kIDsgICAvKiBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiBhIGNvbHVtbiAqLworICBJbmRleFR5cGUgKnJwIDsgICAgIC8qIGEgcm93IHBvaW50ZXIgKi8KKyAgSW5kZXhUeXBlICpycF9lbmQgOyAgIC8qIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIGEgcm93ICovCisgIEluZGV4VHlwZSBsYXN0X3JvdyA7ICAgIC8qIHByZXZpb3VzIHJvdyAqLworCisgIC8qID09PSBJbml0aWFsaXplIGNvbHVtbnMsIGFuZCBjaGVjayBjb2x1bW4gcG9pbnRlcnMgPT09PT09PT09PT09PT09PT09PT0gKi8KKworICBmb3IgKGNvbCA9IDAgOyBjb2wgPCBuX2NvbCA7IGNvbCsrKQorICB7CisgICAgQ29sIFtjb2xdLnN0YXJ0ID0gcCBbY29sXSA7CisgICAgQ29sIFtjb2xdLmxlbmd0aCA9IHAgW2NvbCsxXSAtIHAgW2NvbF0gOworCisgICAgaWYgKChDb2wgW2NvbF0ubGVuZ3RoKSA8IDApIC8vIGV4dHJhIHBhcmVudGhlc2VzIHRvIHdvcmstYXJvdW5kIGdjYyBidWcgMTAyMDAKKyAgICB7CisgICAgICAvKiBjb2x1bW4gcG9pbnRlcnMgbXVzdCBiZSBub24tZGVjcmVhc2luZyAqLworICAgICAgc3RhdHMgW0NPTEFNRF9TVEFUVVNdID0gQ09MQU1EX0VSUk9SX2NvbF9sZW5ndGhfbmVnYXRpdmUgOworICAgICAgc3RhdHMgW0NPTEFNRF9JTkZPMV0gPSBjb2wgOworICAgICAgc3RhdHMgW0NPTEFNRF9JTkZPMl0gPSBDb2wgW2NvbF0ubGVuZ3RoIDsKKyAgICAgIENPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiBjb2wgJWQgbGVuZ3RoICVkIDwgMFxuIiwgY29sLCBDb2wgW2NvbF0ubGVuZ3RoKSkgOworICAgICAgcmV0dXJuIChmYWxzZSkgOworICAgIH0KKworICAgIENvbCBbY29sXS5zaGFyZWQxLnRoaWNrbmVzcyA9IDEgOworICAgIENvbCBbY29sXS5zaGFyZWQyLnNjb3JlID0gMCA7CisgICAgQ29sIFtjb2xdLnNoYXJlZDMucHJldiA9IENPTEFNRF9FTVBUWSA7CisgICAgQ29sIFtjb2xdLnNoYXJlZDQuZGVncmVlX25leHQgPSBDT0xBTURfRU1QVFkgOworICB9CisKKyAgLyogcCBbMC4ubl9jb2xdIG5vIGxvbmdlciBuZWVkZWQsIHVzZWQgYXMgImhlYWQiIGluIHN1YnNlcXVlbnQgcm91dGluZXMgKi8KKworICAvKiA9PT0gU2NhbiBjb2x1bW5zLCBjb21wdXRlIHJvdyBkZWdyZWVzLCBhbmQgY2hlY2sgcm93IGluZGljZXMgPT09PT09PT09ICovCisKKyAgc3RhdHMgW0NPTEFNRF9JTkZPM10gPSAwIDsgIC8qIG51bWJlciBvZiBkdXBsaWNhdGUgb3IgdW5zb3J0ZWQgcm93IGluZGljZXMqLworCisgIGZvciAocm93ID0gMCA7IHJvdyA8IG5fcm93IDsgcm93KyspCisgIHsKKyAgICBSb3cgW3Jvd10ubGVuZ3RoID0gMCA7CisgICAgUm93IFtyb3ddLnNoYXJlZDIubWFyayA9IC0xIDsKKyAgfQorCisgIGZvciAoY29sID0gMCA7IGNvbCA8IG5fY29sIDsgY29sKyspCisgIHsKKyAgICBsYXN0X3JvdyA9IC0xIDsKKworICAgIGNwID0gJkEgW3AgW2NvbF1dIDsKKyAgICBjcF9lbmQgPSAmQSBbcCBbY29sKzFdXSA7CisKKyAgICB3aGlsZSAoY3AgPCBjcF9lbmQpCisgICAgeworICAgICAgcm93ID0gKmNwKysgOworCisgICAgICAvKiBtYWtlIHN1cmUgcm93IGluZGljZXMgd2l0aGluIHJhbmdlICovCisgICAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gbl9yb3cpCisgICAgICB7CisJc3RhdHMgW0NPTEFNRF9TVEFUVVNdID0gQ09MQU1EX0VSUk9SX3Jvd19pbmRleF9vdXRfb2ZfYm91bmRzIDsKKwlzdGF0cyBbQ09MQU1EX0lORk8xXSA9IGNvbCA7CisJc3RhdHMgW0NPTEFNRF9JTkZPMl0gPSByb3cgOworCXN0YXRzIFtDT0xBTURfSU5GTzNdID0gbl9yb3cgOworCUNPTEFNRF9ERUJVRzAgKCgiY29sYW1kOiByb3cgJWQgY29sICVkIG91dCBvZiBib3VuZHNcbiIsIHJvdywgY29sKSkgOworCXJldHVybiAoZmFsc2UpIDsKKyAgICAgIH0KKworICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyB8fCBSb3cgW3Jvd10uc2hhcmVkMi5tYXJrID09IGNvbCkKKyAgICAgIHsKKwkvKiByb3cgaW5kZXggYXJlIHVuc29ydGVkIG9yIHJlcGVhdGVkIChvciBib3RoKSwgdGh1cyBjb2wgKi8KKwkvKiBpcyBqdW1ibGVkLiAgVGhpcyBpcyBhIG5vdGljZSwgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4gKi8KKwlzdGF0cyBbQ09MQU1EX1NUQVRVU10gPSBDT0xBTURfT0tfQlVUX0pVTUJMRUQgOworCXN0YXRzIFtDT0xBTURfSU5GTzFdID0gY29sIDsKKwlzdGF0cyBbQ09MQU1EX0lORk8yXSA9IHJvdyA7CisJKHN0YXRzIFtDT0xBTURfSU5GTzNdKSArKyA7CisJQ09MQU1EX0RFQlVHMSAoKCJjb2xhbWQ6IHJvdyAlZCBjb2wgJWQgdW5zb3J0ZWQvZHVwbGljYXRlXG4iLHJvdyxjb2wpKTsKKyAgICAgIH0KKworICAgICAgaWYgKFJvdyBbcm93XS5zaGFyZWQyLm1hcmsgIT0gY29sKQorICAgICAgeworCVJvdyBbcm93XS5sZW5ndGgrKyA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJLyogdGhpcyBpcyBhIHJlcGVhdGVkIGVudHJ5IGluIHRoZSBjb2x1bW4sICovCisJLyogaXQgd2lsbCBiZSByZW1vdmVkICovCisJQ29sIFtjb2xdLmxlbmd0aC0tIDsKKyAgICAgIH0KKworICAgICAgLyogbWFyayB0aGUgcm93IGFzIGhhdmluZyBiZWVuIHNlZW4gaW4gdGhpcyBjb2x1bW4gKi8KKyAgICAgIFJvdyBbcm93XS5zaGFyZWQyLm1hcmsgPSBjb2wgOworCisgICAgICBsYXN0X3JvdyA9IHJvdyA7CisgICAgfQorICB9CisKKyAgLyogPT09IENvbXB1dGUgcm93IHBvaW50ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIC8qIHJvdyBmb3JtIG9mIHRoZSBtYXRyaXggc3RhcnRzIGRpcmVjdGx5IGFmdGVyIHRoZSBjb2x1bW4gKi8KKyAgLyogZm9ybSBvZiBtYXRyaXggaW4gQSAqLworICBSb3cgWzBdLnN0YXJ0ID0gcCBbbl9jb2xdIDsKKyAgUm93IFswXS5zaGFyZWQxLnAgPSBSb3cgWzBdLnN0YXJ0IDsKKyAgUm93IFswXS5zaGFyZWQyLm1hcmsgPSAtMSA7CisgIGZvciAocm93ID0gMSA7IHJvdyA8IG5fcm93IDsgcm93KyspCisgIHsKKyAgICBSb3cgW3Jvd10uc3RhcnQgPSBSb3cgW3Jvdy0xXS5zdGFydCArIFJvdyBbcm93LTFdLmxlbmd0aCA7CisgICAgUm93IFtyb3ddLnNoYXJlZDEucCA9IFJvdyBbcm93XS5zdGFydCA7CisgICAgUm93IFtyb3ddLnNoYXJlZDIubWFyayA9IC0xIDsKKyAgfQorCisgIC8qID09PSBDcmVhdGUgcm93IGZvcm0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBpZiAoc3RhdHMgW0NPTEFNRF9TVEFUVVNdID09IENPTEFNRF9PS19CVVRfSlVNQkxFRCkKKyAgeworICAgIC8qIGlmIGNvbHMganVtYmxlZCwgd2F0Y2ggZm9yIHJlcGVhdGVkIHJvdyBpbmRpY2VzICovCisgICAgZm9yIChjb2wgPSAwIDsgY29sIDwgbl9jb2wgOyBjb2wrKykKKyAgICB7CisgICAgICBjcCA9ICZBIFtwIFtjb2xdXSA7CisgICAgICBjcF9lbmQgPSAmQSBbcCBbY29sKzFdXSA7CisgICAgICB3aGlsZSAoY3AgPCBjcF9lbmQpCisgICAgICB7CisJcm93ID0gKmNwKysgOworCWlmIChSb3cgW3Jvd10uc2hhcmVkMi5tYXJrICE9IGNvbCkKKwl7CisJICBBIFsoUm93IFtyb3ddLnNoYXJlZDEucCkrK10gPSBjb2wgOworCSAgUm93IFtyb3ddLnNoYXJlZDIubWFyayA9IGNvbCA7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBpZiBjb2xzIG5vdCBqdW1ibGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBtYXJrICh0aGlzIGlzIGZhc3RlcikgKi8KKyAgICBmb3IgKGNvbCA9IDAgOyBjb2wgPCBuX2NvbCA7IGNvbCsrKQorICAgIHsKKyAgICAgIGNwID0gJkEgW3AgW2NvbF1dIDsKKyAgICAgIGNwX2VuZCA9ICZBIFtwIFtjb2wrMV1dIDsKKyAgICAgIHdoaWxlIChjcCA8IGNwX2VuZCkKKyAgICAgIHsKKwlBIFsoUm93IFsqY3ArK10uc2hhcmVkMS5wKSsrXSA9IGNvbCA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogPT09IENsZWFyIHRoZSByb3cgbWFya3MgYW5kIHNldCByb3cgZGVncmVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGZvciAocm93ID0gMCA7IHJvdyA8IG5fcm93IDsgcm93KyspCisgIHsKKyAgICBSb3cgW3Jvd10uc2hhcmVkMi5tYXJrID0gMCA7CisgICAgUm93IFtyb3ddLnNoYXJlZDEuZGVncmVlID0gUm93IFtyb3ddLmxlbmd0aCA7CisgIH0KKworICAvKiA9PT0gU2VlIGlmIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGNvbHVtbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgaWYgKHN0YXRzIFtDT0xBTURfU1RBVFVTXSA9PSBDT0xBTURfT0tfQlVUX0pVTUJMRUQpCisgIHsKKyAgICBDT0xBTURfREVCVUcwICgoImNvbGFtZDogcmVjb25zdHJ1Y3RpbmcgY29sdW1uIGZvcm0sIG1hdHJpeCBqdW1ibGVkXG4iKSkgOworCisKKyAgICAvKiA9PT0gQ29tcHV0ZSBjb2wgcG9pbnRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIC8qIGNvbCBmb3JtIG9mIHRoZSBtYXRyaXggc3RhcnRzIGF0IEEgWzBdLiAqLworICAgIC8qIE5vdGUsIHdlIG1heSBoYXZlIGEgZ2FwIGJldHdlZW4gdGhlIGNvbCBmb3JtIGFuZCB0aGUgcm93ICovCisgICAgLyogZm9ybSBpZiB0aGVyZSB3ZXJlIGR1cGxpY2F0ZSBlbnRyaWVzLCBpZiBzbywgaXQgd2lsbCBiZSAqLworICAgIC8qIHJlbW92ZWQgdXBvbiB0aGUgZmlyc3QgZ2FyYmFnZSBjb2xsZWN0aW9uICovCisgICAgQ29sIFswXS5zdGFydCA9IDAgOworICAgIHAgWzBdID0gQ29sIFswXS5zdGFydCA7CisgICAgZm9yIChjb2wgPSAxIDsgY29sIDwgbl9jb2wgOyBjb2wrKykKKyAgICB7CisgICAgICAvKiBub3RlIHRoYXQgdGhlIGxlbmd0aHMgaGVyZSBhcmUgZm9yIHBydW5lZCBjb2x1bW5zLCBpLmUuICovCisgICAgICAvKiBubyBkdXBsaWNhdGUgcm93IGluZGljZXMgd2lsbCBleGlzdCBmb3IgdGhlc2UgY29sdW1ucyAqLworICAgICAgQ29sIFtjb2xdLnN0YXJ0ID0gQ29sIFtjb2wtMV0uc3RhcnQgKyBDb2wgW2NvbC0xXS5sZW5ndGggOworICAgICAgcCBbY29sXSA9IENvbCBbY29sXS5zdGFydCA7CisgICAgfQorCisgICAgLyogPT09IFJlLWNyZWF0ZSBjb2wgZm9ybSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBmb3IgKHJvdyA9IDAgOyByb3cgPCBuX3JvdyA7IHJvdysrKQorICAgIHsKKyAgICAgIHJwID0gJkEgW1JvdyBbcm93XS5zdGFydF0gOworICAgICAgcnBfZW5kID0gcnAgKyBSb3cgW3Jvd10ubGVuZ3RoIDsKKyAgICAgIHdoaWxlIChycCA8IHJwX2VuZCkKKyAgICAgIHsKKwlBIFsocCBbKnJwKytdKSsrXSA9IHJvdyA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogPT09IERvbmUuICBNYXRyaXggaXMgbm90IChvciBubyBsb25nZXIpIGp1bWJsZWQgPT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHJldHVybiAodHJ1ZSkgOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gaW5pdF9zY29yaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAgS2lsbHMgZGVuc2Ugb3IgZW1wdHkgY29sdW1ucyBhbmQgcm93cywgY2FsY3VsYXRlcyBhbiBpbml0aWFsIHNjb3JlIGZvcgorICBlYWNoIGNvbHVtbiwgYW5kIHBsYWNlcyBhbGwgY29sdW1ucyBpbiB0aGUgZGVncmVlIGxpc3RzLiAgTm90IHVzZXItY2FsbGFibGUuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyB2b2lkIGluaXRfc2NvcmluZworICAoCisgICAgLyogPT09IFBhcmFtZXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgSW5kZXhUeXBlIG5fcm93LCAgICAgIC8qIG51bWJlciBvZiByb3dzIG9mIEEgKi8KKyAgICBJbmRleFR5cGUgbl9jb2wsICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgb2YgQSAqLworICAgIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiBSb3cgW10sICAgIC8qIG9mIHNpemUgbl9yb3crMSAqLworICAgIGNvbGFtZF9jb2w8SW5kZXhUeXBlPiBDb2wgW10sICAgIC8qIG9mIHNpemUgbl9jb2wrMSAqLworICAgIEluZGV4VHlwZSBBIFtdLCAgICAgLyogY29sdW1uIGZvcm0gYW5kIHJvdyBmb3JtIG9mIEEgKi8KKyAgICBJbmRleFR5cGUgaGVhZCBbXSwgICAgLyogb2Ygc2l6ZSBuX2NvbCsxICovCisgICAgZG91YmxlIGtub2JzIFtDT0xBTURfS05PQlNdLC8qIHBhcmFtZXRlcnMgKi8KKyAgICBJbmRleFR5cGUgKnBfbl9yb3cyLCAgICAvKiBudW1iZXIgb2Ygbm9uLWRlbnNlLCBub24tZW1wdHkgcm93cyAqLworICAgIEluZGV4VHlwZSAqcF9uX2NvbDIsICAgIC8qIG51bWJlciBvZiBub24tZGVuc2UsIG5vbi1lbXB0eSBjb2x1bW5zICovCisgICAgSW5kZXhUeXBlICpwX21heF9kZWcgICAgLyogbWF4aW11bSByb3cgZGVncmVlICovCisgICAgKQoreworICAvKiA9PT0gTG9jYWwgdmFyaWFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgSW5kZXhUeXBlIGMgOyAgICAgLyogYSBjb2x1bW4gaW5kZXggKi8KKyAgSW5kZXhUeXBlIHIsIHJvdyA7ICAgIC8qIGEgcm93IGluZGV4ICovCisgIEluZGV4VHlwZSAqY3AgOyAgICAgLyogYSBjb2x1bW4gcG9pbnRlciAqLworICBJbmRleFR5cGUgZGVnIDsgICAgIC8qIGRlZ3JlZSBvZiBhIHJvdyBvciBjb2x1bW4gKi8KKyAgSW5kZXhUeXBlICpjcF9lbmQgOyAgIC8qIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIGEgY29sdW1uICovCisgIEluZGV4VHlwZSAqbmV3X2NwIDsgICAvKiBuZXcgY29sdW1uIHBvaW50ZXIgKi8KKyAgSW5kZXhUeXBlIGNvbF9sZW5ndGggOyAgICAvKiBsZW5ndGggb2YgcHJ1bmVkIGNvbHVtbiAqLworICBJbmRleFR5cGUgc2NvcmUgOyAgICAgLyogY3VycmVudCBjb2x1bW4gc2NvcmUgKi8KKyAgSW5kZXhUeXBlIG5fY29sMiA7ICAgIC8qIG51bWJlciBvZiBub24tZGVuc2UsIG5vbi1lbXB0eSBjb2x1bW5zICovCisgIEluZGV4VHlwZSBuX3JvdzIgOyAgICAvKiBudW1iZXIgb2Ygbm9uLWRlbnNlLCBub24tZW1wdHkgcm93cyAqLworICBJbmRleFR5cGUgZGVuc2Vfcm93X2NvdW50IDsgLyogcmVtb3ZlIHJvd3Mgd2l0aCBtb3JlIGVudHJpZXMgdGhhbiB0aGlzICovCisgIEluZGV4VHlwZSBkZW5zZV9jb2xfY291bnQgOyAvKiByZW1vdmUgY29scyB3aXRoIG1vcmUgZW50cmllcyB0aGFuIHRoaXMgKi8KKyAgSW5kZXhUeXBlIG1pbl9zY29yZSA7ICAgLyogc21hbGxlc3QgY29sdW1uIHNjb3JlICovCisgIEluZGV4VHlwZSBtYXhfZGVnIDsgICAvKiBtYXhpbXVtIHJvdyBkZWdyZWUgKi8KKyAgSW5kZXhUeXBlIG5leHRfY29sIDsgICAgLyogVXNlZCB0byBhZGQgdG8gZGVncmVlIGxpc3QuKi8KKworCisgIC8qID09PSBFeHRyYWN0IGtub2JzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBkZW5zZV9yb3dfY291bnQgPSBudW1leHQ6Om1heGkoSW5kZXhUeXBlKDApLCBudW1leHQ6Om1pbmkoSW5kZXhUeXBlKGtub2JzIFtDT0xBTURfREVOU0VfUk9XXSAqIG5fY29sKSwgbl9jb2wpKSA7CisgIGRlbnNlX2NvbF9jb3VudCA9IG51bWV4dDo6bWF4aShJbmRleFR5cGUoMCksIG51bWV4dDo6bWluaShJbmRleFR5cGUoa25vYnMgW0NPTEFNRF9ERU5TRV9DT0xdICogbl9yb3cpLCBuX3JvdykpIDsKKyAgQ09MQU1EX0RFQlVHMSAoKCJjb2xhbWQ6IGRlbnNlY291bnQ6ICVkICVkXG4iLCBkZW5zZV9yb3dfY291bnQsIGRlbnNlX2NvbF9jb3VudCkpIDsKKyAgbWF4X2RlZyA9IDAgOworICBuX2NvbDIgPSBuX2NvbCA7CisgIG5fcm93MiA9IG5fcm93IDsKKworICAvKiA9PT0gS2lsbCBlbXB0eSBjb2x1bW5zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgLyogUHV0IHRoZSBlbXB0eSBjb2x1bW5zIGF0IHRoZSBlbmQgaW4gdGhlaXIgbmF0dXJhbCBvcmRlciwgc28gdGhhdCBMVSAqLworICAvKiBmYWN0b3JpemF0aW9uIGNhbiBwcm9jZWVkIGFzIGZhciBhcyBwb3NzaWJsZS4gKi8KKyAgZm9yIChjID0gbl9jb2wtMSA7IGMgPj0gMCA7IGMtLSkKKyAgeworICAgIGRlZyA9IENvbCBbY10ubGVuZ3RoIDsKKyAgICBpZiAoZGVnID09IDApCisgICAgeworICAgICAgLyogdGhpcyBpcyBhIGVtcHR5IGNvbHVtbiwga2lsbCBhbmQgb3JkZXIgaXQgbGFzdCAqLworICAgICAgQ29sIFtjXS5zaGFyZWQyLm9yZGVyID0gLS1uX2NvbDIgOworICAgICAgS0lMTF9QUklOQ0lQQUxfQ09MIChjKSA7CisgICAgfQorICB9CisgIENPTEFNRF9ERUJVRzEgKCgiY29sYW1kOiBudWxsIGNvbHVtbnMga2lsbGVkOiAlZFxuIiwgbl9jb2wgLSBuX2NvbDIpKSA7CisKKyAgLyogPT09IEtpbGwgZGVuc2UgY29sdW1ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIC8qIFB1dCB0aGUgZGVuc2UgY29sdW1ucyBhdCB0aGUgZW5kLCBpbiB0aGVpciBuYXR1cmFsIG9yZGVyICovCisgIGZvciAoYyA9IG5fY29sLTEgOyBjID49IDAgOyBjLS0pCisgIHsKKyAgICAvKiBza2lwIGFueSBkZWFkIGNvbHVtbnMgKi8KKyAgICBpZiAoQ09MX0lTX0RFQUQgKGMpKQorICAgIHsKKyAgICAgIGNvbnRpbnVlIDsKKyAgICB9CisgICAgZGVnID0gQ29sIFtjXS5sZW5ndGggOworICAgIGlmIChkZWcgPiBkZW5zZV9jb2xfY291bnQpCisgICAgeworICAgICAgLyogdGhpcyBpcyBhIGRlbnNlIGNvbHVtbiwga2lsbCBhbmQgb3JkZXIgaXQgbGFzdCAqLworICAgICAgQ29sIFtjXS5zaGFyZWQyLm9yZGVyID0gLS1uX2NvbDIgOworICAgICAgLyogZGVjcmVtZW50IHRoZSByb3cgZGVncmVlcyAqLworICAgICAgY3AgPSAmQSBbQ29sIFtjXS5zdGFydF0gOworICAgICAgY3BfZW5kID0gY3AgKyBDb2wgW2NdLmxlbmd0aCA7CisgICAgICB3aGlsZSAoY3AgPCBjcF9lbmQpCisgICAgICB7CisJUm93IFsqY3ArK10uc2hhcmVkMS5kZWdyZWUtLSA7CisgICAgICB9CisgICAgICBLSUxMX1BSSU5DSVBBTF9DT0wgKGMpIDsKKyAgICB9CisgIH0KKyAgQ09MQU1EX0RFQlVHMSAoKCJjb2xhbWQ6IERlbnNlIGFuZCBudWxsIGNvbHVtbnMga2lsbGVkOiAlZFxuIiwgbl9jb2wgLSBuX2NvbDIpKSA7CisKKyAgLyogPT09IEtpbGwgZGVuc2UgYW5kIGVtcHR5IHJvd3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGZvciAociA9IDAgOyByIDwgbl9yb3cgOyByKyspCisgIHsKKyAgICBkZWcgPSBSb3cgW3JdLnNoYXJlZDEuZGVncmVlIDsKKyAgICBDT0xBTURfQVNTRVJUIChkZWcgPj0gMCAmJiBkZWcgPD0gbl9jb2wpIDsKKyAgICBpZiAoZGVnID4gZGVuc2Vfcm93X2NvdW50IHx8IGRlZyA9PSAwKQorICAgIHsKKyAgICAgIC8qIGtpbGwgYSBkZW5zZSBvciBlbXB0eSByb3cgKi8KKyAgICAgIEtJTExfUk9XIChyKSA7CisgICAgICAtLW5fcm93MiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBrZWVwIHRyYWNrIG9mIG1heCBkZWdyZWUgb2YgcmVtYWluaW5nIHJvd3MgKi8KKyAgICAgIG1heF9kZWcgPSBudW1leHQ6Om1heGkobWF4X2RlZywgZGVnKSA7CisgICAgfQorICB9CisgIENPTEFNRF9ERUJVRzEgKCgiY29sYW1kOiBEZW5zZSBhbmQgbnVsbCByb3dzIGtpbGxlZDogJWRcbiIsIG5fcm93IC0gbl9yb3cyKSkgOworCisgIC8qID09PSBDb21wdXRlIGluaXRpYWwgY29sdW1uIHNjb3JlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAvKiBBdCB0aGlzIHBvaW50IHRoZSByb3cgZGVncmVlcyBhcmUgYWNjdXJhdGUuICBUaGV5IHJlZmxlY3QgdGhlIG51bWJlciAqLworICAvKiBvZiAibGl2ZSIgKG5vbi1kZW5zZSkgY29sdW1ucyBpbiBlYWNoIHJvdy4gIE5vIGVtcHR5IHJvd3MgZXhpc3QuICovCisgIC8qIFNvbWUgImxpdmUiIGNvbHVtbnMgbWF5IGNvbnRhaW4gb25seSBkZWFkIHJvd3MsIGhvd2V2ZXIuICBUaGVzZSBhcmUgKi8KKyAgLyogcHJ1bmVkIGluIHRoZSBjb2RlIGJlbG93LiAqLworCisgIC8qIG5vdyBmaW5kIHRoZSBpbml0aWFsIG1hdGxhYiBzY29yZSBmb3IgZWFjaCBjb2x1bW4gKi8KKyAgZm9yIChjID0gbl9jb2wtMSA7IGMgPj0gMCA7IGMtLSkKKyAgeworICAgIC8qIHNraXAgZGVhZCBjb2x1bW4gKi8KKyAgICBpZiAoQ09MX0lTX0RFQUQgKGMpKQorICAgIHsKKyAgICAgIGNvbnRpbnVlIDsKKyAgICB9CisgICAgc2NvcmUgPSAwIDsKKyAgICBjcCA9ICZBIFtDb2wgW2NdLnN0YXJ0XSA7CisgICAgbmV3X2NwID0gY3AgOworICAgIGNwX2VuZCA9IGNwICsgQ29sIFtjXS5sZW5ndGggOworICAgIHdoaWxlIChjcCA8IGNwX2VuZCkKKyAgICB7CisgICAgICAvKiBnZXQgYSByb3cgKi8KKyAgICAgIHJvdyA9ICpjcCsrIDsKKyAgICAgIC8qIHNraXAgaWYgZGVhZCAqLworICAgICAgaWYgKFJPV19JU19ERUFEIChyb3cpKQorICAgICAgeworCWNvbnRpbnVlIDsKKyAgICAgIH0KKyAgICAgIC8qIGNvbXBhY3QgdGhlIGNvbHVtbiAqLworICAgICAgKm5ld19jcCsrID0gcm93IDsKKyAgICAgIC8qIGFkZCByb3cncyBleHRlcm5hbCBkZWdyZWUgKi8KKyAgICAgIHNjb3JlICs9IFJvdyBbcm93XS5zaGFyZWQxLmRlZ3JlZSAtIDEgOworICAgICAgLyogZ3VhcmQgYWdhaW5zdCBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgICBzY29yZSA9IG51bWV4dDo6bWluaShzY29yZSwgbl9jb2wpIDsKKyAgICB9CisgICAgLyogZGV0ZXJtaW5lIHBydW5lZCBjb2x1bW4gbGVuZ3RoICovCisgICAgY29sX2xlbmd0aCA9IChJbmRleFR5cGUpIChuZXdfY3AgLSAmQSBbQ29sIFtjXS5zdGFydF0pIDsKKyAgICBpZiAoY29sX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGEgbmV3bHktbWFkZSBudWxsIGNvbHVtbiAoYWxsIHJvd3MgaW4gdGhpcyBjb2wgYXJlICJkZW5zZSIgKi8KKyAgICAgIC8qIGFuZCBoYXZlIGFscmVhZHkgYmVlbiBraWxsZWQpICovCisgICAgICBDT0xBTURfREVCVUcyICgoIk5ld2x5IG51bGwga2lsbGVkOiAlZFxuIiwgYykpIDsKKyAgICAgIENvbCBbY10uc2hhcmVkMi5vcmRlciA9IC0tbl9jb2wyIDsKKyAgICAgIEtJTExfUFJJTkNJUEFMX0NPTCAoYykgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogc2V0IGNvbHVtbiBsZW5ndGggYW5kIHNldCBzY29yZSAqLworICAgICAgQ09MQU1EX0FTU0VSVCAoc2NvcmUgPj0gMCkgOworICAgICAgQ09MQU1EX0FTU0VSVCAoc2NvcmUgPD0gbl9jb2wpIDsKKyAgICAgIENvbCBbY10ubGVuZ3RoID0gY29sX2xlbmd0aCA7CisgICAgICBDb2wgW2NdLnNoYXJlZDIuc2NvcmUgPSBzY29yZSA7CisgICAgfQorICB9CisgIENPTEFNRF9ERUJVRzEgKCgiY29sYW1kOiBEZW5zZSwgbnVsbCwgYW5kIG5ld2x5LW51bGwgY29sdW1ucyBraWxsZWQ6ICVkXG4iLAorCQkgIG5fY29sLW5fY29sMikpIDsKKworICAvKiBBdCB0aGlzIHBvaW50LCBhbGwgZW1wdHkgcm93cyBhbmQgY29sdW1ucyBhcmUgZGVhZC4gIEFsbCBsaXZlIGNvbHVtbnMgKi8KKyAgLyogYXJlICJjbGVhbiIgKGNvbnRhaW5pbmcgbm8gZGVhZCByb3dzKSBhbmQgc2ltcGxpY2lhbCAobm8gc3VwZXJjb2x1bW5zICovCisgIC8qIHlldCkuICBSb3dzIG1heSBjb250YWluIGRlYWQgY29sdW1ucywgYnV0IGFsbCBsaXZlIHJvd3MgY29udGFpbiBhdCAqLworICAvKiBsZWFzdCBvbmUgbGl2ZSBjb2x1bW4uICovCisKKyAgLyogPT09IEluaXRpYWxpemUgZGVncmVlIGxpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKKyAgLyogY2xlYXIgdGhlIGhhc2ggYnVja2V0cyAqLworICBmb3IgKGMgPSAwIDsgYyA8PSBuX2NvbCA7IGMrKykKKyAgeworICAgIGhlYWQgW2NdID0gQ09MQU1EX0VNUFRZIDsKKyAgfQorICBtaW5fc2NvcmUgPSBuX2NvbCA7CisgIC8qIHBsYWNlIGluIHJldmVyc2Ugb3JkZXIsIHNvIGxvdyBjb2x1bW4gaW5kaWNlcyBhcmUgYXQgdGhlIGZyb250ICovCisgIC8qIG9mIHRoZSBsaXN0cy4gIFRoaXMgaXMgdG8gZW5jb3VyYWdlIG5hdHVyYWwgdGllLWJyZWFraW5nICovCisgIGZvciAoYyA9IG5fY29sLTEgOyBjID49IDAgOyBjLS0pCisgIHsKKyAgICAvKiBvbmx5IGFkZCBwcmluY2lwYWwgY29sdW1ucyB0byBkZWdyZWUgbGlzdHMgKi8KKyAgICBpZiAoQ09MX0lTX0FMSVZFIChjKSkKKyAgICB7CisgICAgICBDT0xBTURfREVCVUc0ICgoInBsYWNlICVkIHNjb3JlICVkIG1pbnNjb3JlICVkIG5jb2wgJWRcbiIsCisJCSAgICAgIGMsIENvbCBbY10uc2hhcmVkMi5zY29yZSwgbWluX3Njb3JlLCBuX2NvbCkpIDsKKworICAgICAgLyogPT09IEFkZCBjb2x1bW5zIHNjb3JlIHRvIERMaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgICAgc2NvcmUgPSBDb2wgW2NdLnNoYXJlZDIuc2NvcmUgOworCisgICAgICBDT0xBTURfQVNTRVJUIChtaW5fc2NvcmUgPj0gMCkgOworICAgICAgQ09MQU1EX0FTU0VSVCAobWluX3Njb3JlIDw9IG5fY29sKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChzY29yZSA+PSAwKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChzY29yZSA8PSBuX2NvbCkgOworICAgICAgQ09MQU1EX0FTU0VSVCAoaGVhZCBbc2NvcmVdID49IENPTEFNRF9FTVBUWSkgOworCisgICAgICAvKiBub3cgYWRkIHRoaXMgY29sdW1uIHRvIGRMaXN0IGF0IHByb3BlciBzY29yZSBsb2NhdGlvbiAqLworICAgICAgbmV4dF9jb2wgPSBoZWFkIFtzY29yZV0gOworICAgICAgQ29sIFtjXS5zaGFyZWQzLnByZXYgPSBDT0xBTURfRU1QVFkgOworICAgICAgQ29sIFtjXS5zaGFyZWQ0LmRlZ3JlZV9uZXh0ID0gbmV4dF9jb2wgOworCisgICAgICAvKiBpZiB0aGVyZSBhbHJlYWR5IHdhcyBhIGNvbHVtbiB3aXRoIHRoZSBzYW1lIHNjb3JlLCBzZXQgaXRzICovCisgICAgICAvKiBwcmV2aW91cyBwb2ludGVyIHRvIHRoaXMgbmV3IGNvbHVtbiAqLworICAgICAgaWYgKG5leHRfY29sICE9IENPTEFNRF9FTVBUWSkKKyAgICAgIHsKKwlDb2wgW25leHRfY29sXS5zaGFyZWQzLnByZXYgPSBjIDsKKyAgICAgIH0KKyAgICAgIGhlYWQgW3Njb3JlXSA9IGMgOworCisgICAgICAvKiBzZWUgaWYgdGhpcyBzY29yZSBpcyBsZXNzIHRoYW4gY3VycmVudCBtaW4gKi8KKyAgICAgIG1pbl9zY29yZSA9IG51bWV4dDo6bWluaShtaW5fc2NvcmUsIHNjb3JlKSA7CisKKworICAgIH0KKyAgfQorCisKKyAgLyogPT09IFJldHVybiBudW1iZXIgb2YgcmVtYWluaW5nIGNvbHVtbnMsIGFuZCBtYXggcm93IGRlZ3JlZSA9PT09PT09PT09PSAqLworCisgICpwX25fY29sMiA9IG5fY29sMiA7CisgICpwX25fcm93MiA9IG5fcm93MiA7CisgICpwX21heF9kZWcgPSBtYXhfZGVnIDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09IGZpbmRfb3JkZXJpbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgIE9yZGVyIHRoZSBwcmluY2lwYWwgY29sdW1ucyBvZiB0aGUgc3VwZXJjb2x1bW4gZm9ybSBvZiB0aGUgbWF0cml4CisgIChubyBzdXBlcmNvbHVtbnMgb24gaW5wdXQpLiAgVXNlcyBhIG1pbmltdW0gYXBwcm94aW1hdGUgY29sdW1uIG1pbmltdW0KKyAgZGVncmVlIG9yZGVyaW5nIG1ldGhvZC4gIE5vdCB1c2VyLWNhbGxhYmxlLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgSW5kZXhUeXBlIGZpbmRfb3JkZXJpbmcgLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgZ2FyYmFnZSBjb2xsZWN0aW9ucyAqLworICAoCisgICAgLyogPT09IFBhcmFtZXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgSW5kZXhUeXBlIG5fcm93LCAgICAgIC8qIG51bWJlciBvZiByb3dzIG9mIEEgKi8KKyAgICBJbmRleFR5cGUgbl9jb2wsICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgb2YgQSAqLworICAgIEluZGV4VHlwZSBBbGVuLCAgICAgLyogc2l6ZSBvZiBBLCAyKm5ueiArIG5fY29sIG9yIGxhcmdlciAqLworICAgIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiBSb3cgW10sICAgIC8qIG9mIHNpemUgbl9yb3crMSAqLworICAgIGNvbGFtZF9jb2w8SW5kZXhUeXBlPiBDb2wgW10sICAgIC8qIG9mIHNpemUgbl9jb2wrMSAqLworICAgIEluZGV4VHlwZSBBIFtdLCAgICAgLyogY29sdW1uIGZvcm0gYW5kIHJvdyBmb3JtIG9mIEEgKi8KKyAgICBJbmRleFR5cGUgaGVhZCBbXSwgICAgLyogb2Ygc2l6ZSBuX2NvbCsxICovCisgICAgSW5kZXhUeXBlIG5fY29sMiwgICAgIC8qIFJlbWFpbmluZyBjb2x1bW5zIHRvIG9yZGVyICovCisgICAgSW5kZXhUeXBlIG1heF9kZWcsICAgIC8qIE1heGltdW0gcm93IGRlZ3JlZSAqLworICAgIEluZGV4VHlwZSBwZnJlZSAgICAgLyogaW5kZXggb2YgZmlyc3QgZnJlZSBzbG90ICgyKm5ueiBvbiBlbnRyeSkgKi8KKyAgICApCit7CisgIC8qID09PSBMb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBJbmRleFR5cGUgayA7ICAgICAvKiBjdXJyZW50IHBpdm90IG9yZGVyaW5nIHN0ZXAgKi8KKyAgSW5kZXhUeXBlIHBpdm90X2NvbCA7ICAgLyogY3VycmVudCBwaXZvdCBjb2x1bW4gKi8KKyAgSW5kZXhUeXBlICpjcCA7ICAgICAvKiBhIGNvbHVtbiBwb2ludGVyICovCisgIEluZGV4VHlwZSAqcnAgOyAgICAgLyogYSByb3cgcG9pbnRlciAqLworICBJbmRleFR5cGUgcGl2b3Rfcm93IDsgICAvKiBjdXJyZW50IHBpdm90IHJvdyAqLworICBJbmRleFR5cGUgKm5ld19jcCA7ICAgLyogbW9kaWZpZWQgY29sdW1uIHBvaW50ZXIgKi8KKyAgSW5kZXhUeXBlICpuZXdfcnAgOyAgIC8qIG1vZGlmaWVkIHJvdyBwb2ludGVyICovCisgIEluZGV4VHlwZSBwaXZvdF9yb3dfc3RhcnQgOyAvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHBpdm90IHJvdyAqLworICBJbmRleFR5cGUgcGl2b3Rfcm93X2RlZ3JlZSA7ICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiBwaXZvdCByb3cgKi8KKyAgSW5kZXhUeXBlIHBpdm90X3Jvd19sZW5ndGggOyAgLyogbnVtYmVyIG9mIHN1cGVyY29sdW1ucyBpbiBwaXZvdCByb3cgKi8KKyAgSW5kZXhUeXBlIHBpdm90X2NvbF9zY29yZSA7IC8qIHNjb3JlIG9mIHBpdm90IGNvbHVtbiAqLworICBJbmRleFR5cGUgbmVlZGVkX21lbW9yeSA7ICAgLyogZnJlZSBzcGFjZSBuZWVkZWQgZm9yIHBpdm90IHJvdyAqLworICBJbmRleFR5cGUgKmNwX2VuZCA7ICAgLyogcG9pbnRlciB0byB0aGUgZW5kIG9mIGEgY29sdW1uICovCisgIEluZGV4VHlwZSAqcnBfZW5kIDsgICAvKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgYSByb3cgKi8KKyAgSW5kZXhUeXBlIHJvdyA7ICAgICAvKiBhIHJvdyBpbmRleCAqLworICBJbmRleFR5cGUgY29sIDsgICAgIC8qIGEgY29sdW1uIGluZGV4ICovCisgIEluZGV4VHlwZSBtYXhfc2NvcmUgOyAgIC8qIG1heGltdW0gcG9zc2libGUgc2NvcmUgKi8KKyAgSW5kZXhUeXBlIGN1cl9zY29yZSA7ICAgLyogc2NvcmUgb2YgY3VycmVudCBjb2x1bW4gKi8KKyAgdW5zaWduZWQgaW50IGhhc2ggOyAgIC8qIGhhc2ggdmFsdWUgZm9yIHN1cGVybm9kZSBkZXRlY3Rpb24gKi8KKyAgSW5kZXhUeXBlIGhlYWRfY29sdW1uIDsgICAvKiBoZWFkIG9mIGhhc2ggYnVja2V0ICovCisgIEluZGV4VHlwZSBmaXJzdF9jb2wgOyAgIC8qIGZpcnN0IGNvbHVtbiBpbiBoYXNoIGJ1Y2tldCAqLworICBJbmRleFR5cGUgdGFnX21hcmsgOyAgICAvKiBtYXJrZXIgdmFsdWUgZm9yIG1hcmsgYXJyYXkgKi8KKyAgSW5kZXhUeXBlIHJvd19tYXJrIDsgICAgLyogUm93IFtyb3ddLnNoYXJlZDIubWFyayAqLworICBJbmRleFR5cGUgc2V0X2RpZmZlcmVuY2UgOyAgLyogc2V0IGRpZmZlcmVuY2Ugc2l6ZSBvZiByb3cgd2l0aCBwaXZvdCByb3cgKi8KKyAgSW5kZXhUeXBlIG1pbl9zY29yZSA7ICAgLyogc21hbGxlc3QgY29sdW1uIHNjb3JlICovCisgIEluZGV4VHlwZSBjb2xfdGhpY2tuZXNzIDsgICAvKiAidGhpY2tuZXNzIiAobm8uIG9mIGNvbHVtbnMgaW4gYSBzdXBlcmNvbCkgKi8KKyAgSW5kZXhUeXBlIG1heF9tYXJrIDsgICAgLyogbWF4aW11bSB2YWx1ZSBvZiB0YWdfbWFyayAqLworICBJbmRleFR5cGUgcGl2b3RfY29sX3RoaWNrbmVzcyA7IC8qIG51bWJlciBvZiBjb2x1bW5zIHJlcHJlc2VudGVkIGJ5IHBpdm90IGNvbCAqLworICBJbmRleFR5cGUgcHJldl9jb2wgOyAgICAvKiBVc2VkIGJ5IERsaXN0IG9wZXJhdGlvbnMuICovCisgIEluZGV4VHlwZSBuZXh0X2NvbCA7ICAgIC8qIFVzZWQgYnkgRGxpc3Qgb3BlcmF0aW9ucy4gKi8KKyAgSW5kZXhUeXBlIG5nYXJiYWdlIDsgICAgLyogbnVtYmVyIG9mIGdhcmJhZ2UgY29sbGVjdGlvbnMgcGVyZm9ybWVkICovCisKKworICAvKiA9PT0gSW5pdGlhbGl6YXRpb24gYW5kIGNsZWFyIG1hcmsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgbWF4X21hcmsgPSBJTlRfTUFYIC0gbl9jb2wgOyAgLyogSU5UX01BWCBkZWZpbmVkIGluIDxsaW1pdHMuaD4gKi8KKyAgdGFnX21hcmsgPSBFaWdlbjo6aW50ZXJuYWw6OmNsZWFyX21hcmsgKG5fcm93LCBSb3cpIDsKKyAgbWluX3Njb3JlID0gMCA7CisgIG5nYXJiYWdlID0gMCA7CisgIENPTEFNRF9ERUJVRzEgKCgiY29sYW1kOiBPcmRlcmluZywgbl9jb2wyPSVkXG4iLCBuX2NvbDIpKSA7CisKKyAgLyogPT09IE9yZGVyIHRoZSBjb2x1bW5zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGZvciAoayA9IDAgOyBrIDwgbl9jb2wyIDsgLyogJ2snIGlzIGluY3JlbWVudGVkIGJlbG93ICovKQorICB7CisKKyAgICAvKiA9PT0gU2VsZWN0IHBpdm90IGNvbHVtbiwgYW5kIG9yZGVyIGl0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIC8qIG1ha2Ugc3VyZSBkZWdyZWUgbGlzdCBpc24ndCBlbXB0eSAqLworICAgIENPTEFNRF9BU1NFUlQgKG1pbl9zY29yZSA+PSAwKSA7CisgICAgQ09MQU1EX0FTU0VSVCAobWluX3Njb3JlIDw9IG5fY29sKSA7CisgICAgQ09MQU1EX0FTU0VSVCAoaGVhZCBbbWluX3Njb3JlXSA+PSBDT0xBTURfRU1QVFkpIDsKKworICAgIC8qIGdldCBwaXZvdCBjb2x1bW4gZnJvbSBoZWFkIG9mIG1pbmltdW0gZGVncmVlIGxpc3QgKi8KKyAgICB3aGlsZSAobWluX3Njb3JlIDwgbl9jb2wgJiYgaGVhZCBbbWluX3Njb3JlXSA9PSBDT0xBTURfRU1QVFkpCisgICAgeworICAgICAgbWluX3Njb3JlKysgOworICAgIH0KKyAgICBwaXZvdF9jb2wgPSBoZWFkIFttaW5fc2NvcmVdIDsKKyAgICBDT0xBTURfQVNTRVJUIChwaXZvdF9jb2wgPj0gMCAmJiBwaXZvdF9jb2wgPD0gbl9jb2wpIDsKKyAgICBuZXh0X2NvbCA9IENvbCBbcGl2b3RfY29sXS5zaGFyZWQ0LmRlZ3JlZV9uZXh0IDsKKyAgICBoZWFkIFttaW5fc2NvcmVdID0gbmV4dF9jb2wgOworICAgIGlmIChuZXh0X2NvbCAhPSBDT0xBTURfRU1QVFkpCisgICAgeworICAgICAgQ29sIFtuZXh0X2NvbF0uc2hhcmVkMy5wcmV2ID0gQ09MQU1EX0VNUFRZIDsKKyAgICB9CisKKyAgICBDT0xBTURfQVNTRVJUIChDT0xfSVNfQUxJVkUgKHBpdm90X2NvbCkpIDsKKyAgICBDT0xBTURfREVCVUczICgoIlBpdm90IGNvbDogJWRcbiIsIHBpdm90X2NvbCkpIDsKKworICAgIC8qIHJlbWVtYmVyIHNjb3JlIGZvciBkZWZyYWcgY2hlY2sgKi8KKyAgICBwaXZvdF9jb2xfc2NvcmUgPSBDb2wgW3Bpdm90X2NvbF0uc2hhcmVkMi5zY29yZSA7CisKKyAgICAvKiB0aGUgcGl2b3QgY29sdW1uIGlzIHRoZSBrdGggY29sdW1uIGluIHRoZSBwaXZvdCBvcmRlciAqLworICAgIENvbCBbcGl2b3RfY29sXS5zaGFyZWQyLm9yZGVyID0gayA7CisKKyAgICAvKiBpbmNyZW1lbnQgb3JkZXIgY291bnQgYnkgY29sdW1uIHRoaWNrbmVzcyAqLworICAgIHBpdm90X2NvbF90aGlja25lc3MgPSBDb2wgW3Bpdm90X2NvbF0uc2hhcmVkMS50aGlja25lc3MgOworICAgIGsgKz0gcGl2b3RfY29sX3RoaWNrbmVzcyA7CisgICAgQ09MQU1EX0FTU0VSVCAocGl2b3RfY29sX3RoaWNrbmVzcyA+IDApIDsKKworICAgIC8qID09PSBHYXJiYWdlX2NvbGxlY3Rpb24sIGlmIG5lY2Vzc2FyeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgbmVlZGVkX21lbW9yeSA9IG51bWV4dDo6bWluaShwaXZvdF9jb2xfc2NvcmUsIG5fY29sIC0gaykgOworICAgIGlmIChwZnJlZSArIG5lZWRlZF9tZW1vcnkgPj0gQWxlbikKKyAgICB7CisgICAgICBwZnJlZSA9IEVpZ2VuOjppbnRlcm5hbDo6Z2FyYmFnZV9jb2xsZWN0aW9uIChuX3Jvdywgbl9jb2wsIFJvdywgQ29sLCBBLCAmQSBbcGZyZWVdKSA7CisgICAgICBuZ2FyYmFnZSsrIDsKKyAgICAgIC8qIGFmdGVyIGdhcmJhZ2UgY29sbGVjdGlvbiB3ZSB3aWxsIGhhdmUgZW5vdWdoICovCisgICAgICBDT0xBTURfQVNTRVJUIChwZnJlZSArIG5lZWRlZF9tZW1vcnkgPCBBbGVuKSA7CisgICAgICAvKiBnYXJiYWdlIGNvbGxlY3Rpb24gaGFzIHdpcGVkIG91dCB0aGUgUm93W10uc2hhcmVkMi5tYXJrIGFycmF5ICovCisgICAgICB0YWdfbWFyayA9IEVpZ2VuOjppbnRlcm5hbDo6Y2xlYXJfbWFyayAobl9yb3csIFJvdykgOworCisgICAgfQorCisgICAgLyogPT09IENvbXB1dGUgcGl2b3Qgcm93IHBhdHRlcm4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICAvKiBnZXQgc3RhcnRpbmcgbG9jYXRpb24gZm9yIHRoaXMgbmV3IG1lcmdlZCByb3cgKi8KKyAgICBwaXZvdF9yb3dfc3RhcnQgPSBwZnJlZSA7CisKKyAgICAvKiBpbml0aWFsaXplIG5ldyByb3cgY291bnRzIHRvIHplcm8gKi8KKyAgICBwaXZvdF9yb3dfZGVncmVlID0gMCA7CisKKyAgICAvKiB0YWcgcGl2b3QgY29sdW1uIGFzIGhhdmluZyBiZWVuIHZpc2l0ZWQgc28gaXQgaXNuJ3QgaW5jbHVkZWQgKi8KKyAgICAvKiBpbiBtZXJnZWQgcGl2b3Qgcm93ICovCisgICAgQ29sIFtwaXZvdF9jb2xdLnNoYXJlZDEudGhpY2tuZXNzID0gLXBpdm90X2NvbF90aGlja25lc3MgOworCisgICAgLyogcGl2b3Qgcm93IGlzIHRoZSB1bmlvbiBvZiBhbGwgcm93cyBpbiB0aGUgcGl2b3QgY29sdW1uIHBhdHRlcm4gKi8KKyAgICBjcCA9ICZBIFtDb2wgW3Bpdm90X2NvbF0uc3RhcnRdIDsKKyAgICBjcF9lbmQgPSBjcCArIENvbCBbcGl2b3RfY29sXS5sZW5ndGggOworICAgIHdoaWxlIChjcCA8IGNwX2VuZCkKKyAgICB7CisgICAgICAvKiBnZXQgYSByb3cgKi8KKyAgICAgIHJvdyA9ICpjcCsrIDsKKyAgICAgIENPTEFNRF9ERUJVRzQgKCgiUGl2b3QgY29sIHBhdHRlcm4gJWQgJWRcbiIsIFJPV19JU19BTElWRSAocm93KSwgcm93KSkgOworICAgICAgLyogc2tpcCBpZiByb3cgaXMgZGVhZCAqLworICAgICAgaWYgKFJPV19JU19ERUFEIChyb3cpKQorICAgICAgeworCWNvbnRpbnVlIDsKKyAgICAgIH0KKyAgICAgIHJwID0gJkEgW1JvdyBbcm93XS5zdGFydF0gOworICAgICAgcnBfZW5kID0gcnAgKyBSb3cgW3Jvd10ubGVuZ3RoIDsKKyAgICAgIHdoaWxlIChycCA8IHJwX2VuZCkKKyAgICAgIHsKKwkvKiBnZXQgYSBjb2x1bW4gKi8KKwljb2wgPSAqcnArKyA7CisJLyogYWRkIHRoZSBjb2x1bW4sIGlmIGFsaXZlIGFuZCB1bnRhZ2dlZCAqLworCWNvbF90aGlja25lc3MgPSBDb2wgW2NvbF0uc2hhcmVkMS50aGlja25lc3MgOworCWlmIChjb2xfdGhpY2tuZXNzID4gMCAmJiBDT0xfSVNfQUxJVkUgKGNvbCkpCisJeworCSAgLyogdGFnIGNvbHVtbiBpbiBwaXZvdCByb3cgKi8KKwkgIENvbCBbY29sXS5zaGFyZWQxLnRoaWNrbmVzcyA9IC1jb2xfdGhpY2tuZXNzIDsKKwkgIENPTEFNRF9BU1NFUlQgKHBmcmVlIDwgQWxlbikgOworCSAgLyogcGxhY2UgY29sdW1uIGluIHBpdm90IHJvdyAqLworCSAgQSBbcGZyZWUrK10gPSBjb2wgOworCSAgcGl2b3Rfcm93X2RlZ3JlZSArPSBjb2xfdGhpY2tuZXNzIDsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgLyogY2xlYXIgdGFnIG9uIHBpdm90IGNvbHVtbiAqLworICAgIENvbCBbcGl2b3RfY29sXS5zaGFyZWQxLnRoaWNrbmVzcyA9IHBpdm90X2NvbF90aGlja25lc3MgOworICAgIG1heF9kZWcgPSBudW1leHQ6Om1heGkobWF4X2RlZywgcGl2b3Rfcm93X2RlZ3JlZSkgOworCisKKyAgICAvKiA9PT0gS2lsbCBhbGwgcm93cyB1c2VkIHRvIGNvbnN0cnVjdCBwaXZvdCByb3cgPT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIC8qIGFsc28ga2lsbCBwaXZvdCByb3csIHRlbXBvcmFyaWx5ICovCisgICAgY3AgPSAmQSBbQ29sIFtwaXZvdF9jb2xdLnN0YXJ0XSA7CisgICAgY3BfZW5kID0gY3AgKyBDb2wgW3Bpdm90X2NvbF0ubGVuZ3RoIDsKKyAgICB3aGlsZSAoY3AgPCBjcF9lbmQpCisgICAgeworICAgICAgLyogbWF5IGJlIGtpbGxpbmcgYW4gYWxyZWFkeSBkZWFkIHJvdyAqLworICAgICAgcm93ID0gKmNwKysgOworICAgICAgQ09MQU1EX0RFQlVHMyAoKCJLaWxsIHJvdyBpbiBwaXZvdCBjb2w6ICVkXG4iLCByb3cpKSA7CisgICAgICBLSUxMX1JPVyAocm93KSA7CisgICAgfQorCisgICAgLyogPT09IFNlbGVjdCBhIHJvdyBpbmRleCB0byB1c2UgYXMgdGhlIG5ldyBwaXZvdCByb3cgPT09PT09PT09PT09PT09ICovCisKKyAgICBwaXZvdF9yb3dfbGVuZ3RoID0gcGZyZWUgLSBwaXZvdF9yb3dfc3RhcnQgOworICAgIGlmIChwaXZvdF9yb3dfbGVuZ3RoID4gMCkKKyAgICB7CisgICAgICAvKiBwaWNrIHRoZSAicGl2b3QiIHJvdyBhcmJpdHJhcmlseSAoZmlyc3Qgcm93IGluIGNvbCkgKi8KKyAgICAgIHBpdm90X3JvdyA9IEEgW0NvbCBbcGl2b3RfY29sXS5zdGFydF0gOworICAgICAgQ09MQU1EX0RFQlVHMyAoKCJQaXZvdGFsIHJvdyBpcyAlZFxuIiwgcGl2b3Rfcm93KSkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogdGhlcmUgaXMgbm8gcGl2b3Qgcm93LCBzaW5jZSBpdCBpcyBvZiB6ZXJvIGxlbmd0aCAqLworICAgICAgcGl2b3Rfcm93ID0gQ09MQU1EX0VNUFRZIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKHBpdm90X3Jvd19sZW5ndGggPT0gMCkgOworICAgIH0KKyAgICBDT0xBTURfQVNTRVJUIChDb2wgW3Bpdm90X2NvbF0ubGVuZ3RoID4gMCB8fCBwaXZvdF9yb3dfbGVuZ3RoID09IDApIDsKKworICAgIC8qID09PSBBcHByb3hpbWF0ZSBkZWdyZWUgY29tcHV0YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgLyogSGVyZSBiZWdpbnMgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBhcHByb3hpbWF0ZSBkZWdyZWUuICBUaGUgY29sdW1uICovCisgICAgLyogc2NvcmUgaXMgdGhlIHN1bSBvZiB0aGUgcGl2b3Qgcm93ICJsZW5ndGgiLCBwbHVzIHRoZSBzaXplIG9mIHRoZSAqLworICAgIC8qIHNldCBkaWZmZXJlbmNlcyBvZiBlYWNoIHJvdyBpbiB0aGUgY29sdW1uIG1pbnVzIHRoZSBwYXR0ZXJuIG9mIHRoZSAqLworICAgIC8qIHBpdm90IHJvdyBpdHNlbGYuICBUaGUgY29sdW1uICgidGhpY2tuZXNzIikgaXRzZWxmIGlzIGFsc28gKi8KKyAgICAvKiBleGNsdWRlZCBmcm9tIHRoZSBjb2x1bW4gc2NvcmUgKHdlIHRodXMgdXNlIGFuIGFwcHJveGltYXRlICovCisgICAgLyogZXh0ZXJuYWwgZGVncmVlKS4gKi8KKworICAgIC8qIFRoZSB0aW1lIHRha2VuIGJ5IHRoZSBmb2xsb3dpbmcgY29kZSAoY29tcHV0ZSBzZXQgZGlmZmVyZW5jZXMsIGFuZCAqLworICAgIC8qIGFkZCB0aGVtIHVwKSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlICovCisgICAgLyogYmVpbmcgc2Nhbm5lZCAtIHRoYXQgaXMsIHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIGVhY2ggY29sdW1uIGluICovCisgICAgLyogdGhlIHBpdm90IHJvdy4gIFRodXMsIHRoZSBhbW9ydGl6ZWQgdGltZSB0byBjb21wdXRlIGEgY29sdW1uIHNjb3JlICovCisgICAgLyogaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoYXQgY29sdW1uICh3aGVyZSBzaXplLCBpbiB0aGlzICovCisgICAgLyogY29udGV4dCwgaXMgdGhlIGNvbHVtbiAibGVuZ3RoIiwgb3IgdGhlIG51bWJlciBvZiByb3cgaW5kaWNlcyAqLworICAgIC8qIGluIHRoYXQgY29sdW1uKS4gIFRoZSBudW1iZXIgb2Ygcm93IGluZGljZXMgaW4gYSBjb2x1bW4gaXMgKi8KKyAgICAvKiBtb25vdG9uaWNhbGx5IG5vbi1kZWNyZWFzaW5nLCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsICovCisgICAgLyogY29sdW1uIG9uIGlucHV0IHRvIGNvbGFtZC4gKi8KKworICAgIC8qID09PSBDb21wdXRlIHNldCBkaWZmZXJlbmNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgQ09MQU1EX0RFQlVHMyAoKCIqKiBDb21wdXRpbmcgc2V0IGRpZmZlcmVuY2VzIHBoYXNlLiAqKlxuIikpIDsKKworICAgIC8qIHBpdm90IHJvdyBpcyBjdXJyZW50bHkgZGVhZCAtIGl0IHdpbGwgYmUgcmV2aXZlZCBsYXRlci4gKi8KKworICAgIENPTEFNRF9ERUJVRzMgKCgiUGl2b3Qgcm93OiAiKSkgOworICAgIC8qIGZvciBlYWNoIGNvbHVtbiBpbiBwaXZvdCByb3cgKi8KKyAgICBycCA9ICZBIFtwaXZvdF9yb3dfc3RhcnRdIDsKKyAgICBycF9lbmQgPSBycCArIHBpdm90X3Jvd19sZW5ndGggOworICAgIHdoaWxlIChycCA8IHJwX2VuZCkKKyAgICB7CisgICAgICBjb2wgPSAqcnArKyA7CisgICAgICBDT0xBTURfQVNTRVJUIChDT0xfSVNfQUxJVkUgKGNvbCkgJiYgY29sICE9IHBpdm90X2NvbCkgOworICAgICAgQ09MQU1EX0RFQlVHMyAoKCJDb2w6ICVkXG4iLCBjb2wpKSA7CisKKyAgICAgIC8qIGNsZWFyIHRhZ3MgdXNlZCB0byBjb25zdHJ1Y3QgcGl2b3Qgcm93IHBhdHRlcm4gKi8KKyAgICAgIGNvbF90aGlja25lc3MgPSAtQ29sIFtjb2xdLnNoYXJlZDEudGhpY2tuZXNzIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKGNvbF90aGlja25lc3MgPiAwKSA7CisgICAgICBDb2wgW2NvbF0uc2hhcmVkMS50aGlja25lc3MgPSBjb2xfdGhpY2tuZXNzIDsKKworICAgICAgLyogPT09IFJlbW92ZSBjb2x1bW4gZnJvbSBkZWdyZWUgbGlzdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgICAgY3VyX3Njb3JlID0gQ29sIFtjb2xdLnNoYXJlZDIuc2NvcmUgOworICAgICAgcHJldl9jb2wgPSBDb2wgW2NvbF0uc2hhcmVkMy5wcmV2IDsKKyAgICAgIG5leHRfY29sID0gQ29sIFtjb2xdLnNoYXJlZDQuZGVncmVlX25leHQgOworICAgICAgQ09MQU1EX0FTU0VSVCAoY3VyX3Njb3JlID49IDApIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKGN1cl9zY29yZSA8PSBuX2NvbCkgOworICAgICAgQ09MQU1EX0FTU0VSVCAoY3VyX3Njb3JlID49IENPTEFNRF9FTVBUWSkgOworICAgICAgaWYgKHByZXZfY29sID09IENPTEFNRF9FTVBUWSkKKyAgICAgIHsKKwloZWFkIFtjdXJfc2NvcmVdID0gbmV4dF9jb2wgOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCUNvbCBbcHJldl9jb2xdLnNoYXJlZDQuZGVncmVlX25leHQgPSBuZXh0X2NvbCA7CisgICAgICB9CisgICAgICBpZiAobmV4dF9jb2wgIT0gQ09MQU1EX0VNUFRZKQorICAgICAgeworCUNvbCBbbmV4dF9jb2xdLnNoYXJlZDMucHJldiA9IHByZXZfY29sIDsKKyAgICAgIH0KKworICAgICAgLyogPT09IFNjYW4gdGhlIGNvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgICAgY3AgPSAmQSBbQ29sIFtjb2xdLnN0YXJ0XSA7CisgICAgICBjcF9lbmQgPSBjcCArIENvbCBbY29sXS5sZW5ndGggOworICAgICAgd2hpbGUgKGNwIDwgY3BfZW5kKQorICAgICAgeworCS8qIGdldCBhIHJvdyAqLworCXJvdyA9ICpjcCsrIDsKKwlyb3dfbWFyayA9IFJvdyBbcm93XS5zaGFyZWQyLm1hcmsgOworCS8qIHNraXAgaWYgZGVhZCAqLworCWlmIChST1dfSVNfTUFSS0VEX0RFQUQgKHJvd19tYXJrKSkKKwl7CisJICBjb250aW51ZSA7CisJfQorCUNPTEFNRF9BU1NFUlQgKHJvdyAhPSBwaXZvdF9yb3cpIDsKKwlzZXRfZGlmZmVyZW5jZSA9IHJvd19tYXJrIC0gdGFnX21hcmsgOworCS8qIGNoZWNrIGlmIHRoZSByb3cgaGFzIGJlZW4gc2VlbiB5ZXQgKi8KKwlpZiAoc2V0X2RpZmZlcmVuY2UgPCAwKQorCXsKKwkgIENPTEFNRF9BU1NFUlQgKFJvdyBbcm93XS5zaGFyZWQxLmRlZ3JlZSA8PSBtYXhfZGVnKSA7CisJICBzZXRfZGlmZmVyZW5jZSA9IFJvdyBbcm93XS5zaGFyZWQxLmRlZ3JlZSA7CisJfQorCS8qIHN1YnRyYWN0IGNvbHVtbiB0aGlja25lc3MgZnJvbSB0aGlzIHJvdydzIHNldCBkaWZmZXJlbmNlICovCisJc2V0X2RpZmZlcmVuY2UgLT0gY29sX3RoaWNrbmVzcyA7CisJQ09MQU1EX0FTU0VSVCAoc2V0X2RpZmZlcmVuY2UgPj0gMCkgOworCS8qIGFic29yYiB0aGlzIHJvdyBpZiB0aGUgc2V0IGRpZmZlcmVuY2UgYmVjb21lcyB6ZXJvICovCisJaWYgKHNldF9kaWZmZXJlbmNlID09IDApCisJeworCSAgQ09MQU1EX0RFQlVHMyAoKCJhZ2dyZXNzaXZlIGFic29ycHRpb24uIFJvdzogJWRcbiIsIHJvdykpIDsKKwkgIEtJTExfUk9XIChyb3cpIDsKKwl9CisJZWxzZQorCXsKKwkgIC8qIHNhdmUgdGhlIG5ldyBtYXJrICovCisJICBSb3cgW3Jvd10uc2hhcmVkMi5tYXJrID0gc2V0X2RpZmZlcmVuY2UgKyB0YWdfbWFyayA7CisJfQorICAgICAgfQorICAgIH0KKworCisgICAgLyogPT09IEFkZCB1cCBzZXQgZGlmZmVyZW5jZXMgZm9yIGVhY2ggY29sdW1uID09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBDT0xBTURfREVCVUczICgoIioqIEFkZGluZyBzZXQgZGlmZmVyZW5jZXMgcGhhc2UuICoqXG4iKSkgOworCisgICAgLyogZm9yIGVhY2ggY29sdW1uIGluIHBpdm90IHJvdyAqLworICAgIHJwID0gJkEgW3Bpdm90X3Jvd19zdGFydF0gOworICAgIHJwX2VuZCA9IHJwICsgcGl2b3Rfcm93X2xlbmd0aCA7CisgICAgd2hpbGUgKHJwIDwgcnBfZW5kKQorICAgIHsKKyAgICAgIC8qIGdldCBhIGNvbHVtbiAqLworICAgICAgY29sID0gKnJwKysgOworICAgICAgQ09MQU1EX0FTU0VSVCAoQ09MX0lTX0FMSVZFIChjb2wpICYmIGNvbCAhPSBwaXZvdF9jb2wpIDsKKyAgICAgIGhhc2ggPSAwIDsKKyAgICAgIGN1cl9zY29yZSA9IDAgOworICAgICAgY3AgPSAmQSBbQ29sIFtjb2xdLnN0YXJ0XSA7CisgICAgICAvKiBjb21wYWN0IHRoZSBjb2x1bW4gKi8KKyAgICAgIG5ld19jcCA9IGNwIDsKKyAgICAgIGNwX2VuZCA9IGNwICsgQ29sIFtjb2xdLmxlbmd0aCA7CisKKyAgICAgIENPTEFNRF9ERUJVRzQgKCgiQWRkaW5nIHNldCBkaWZmcyBmb3IgQ29sOiAlZC5cbiIsIGNvbCkpIDsKKworICAgICAgd2hpbGUgKGNwIDwgY3BfZW5kKQorICAgICAgeworCS8qIGdldCBhIHJvdyAqLworCXJvdyA9ICpjcCsrIDsKKwlDT0xBTURfQVNTRVJUKHJvdyA+PSAwICYmIHJvdyA8IG5fcm93KSA7CisJcm93X21hcmsgPSBSb3cgW3Jvd10uc2hhcmVkMi5tYXJrIDsKKwkvKiBza2lwIGlmIGRlYWQgKi8KKwlpZiAoUk9XX0lTX01BUktFRF9ERUFEIChyb3dfbWFyaykpCisJeworCSAgY29udGludWUgOworCX0KKwlDT0xBTURfQVNTRVJUIChyb3dfbWFyayA+IHRhZ19tYXJrKSA7CisJLyogY29tcGFjdCB0aGUgY29sdW1uICovCisJKm5ld19jcCsrID0gcm93IDsKKwkvKiBjb21wdXRlIGhhc2ggZnVuY3Rpb24gKi8KKwloYXNoICs9IHJvdyA7CisJLyogYWRkIHNldCBkaWZmZXJlbmNlICovCisJY3VyX3Njb3JlICs9IHJvd19tYXJrIC0gdGFnX21hcmsgOworCS8qIGludGVnZXIgb3ZlcmZsb3cuLi4gKi8KKwljdXJfc2NvcmUgPSBudW1leHQ6Om1pbmkoY3VyX3Njb3JlLCBuX2NvbCkgOworICAgICAgfQorCisgICAgICAvKiByZWNvbXB1dGUgdGhlIGNvbHVtbidzIGxlbmd0aCAqLworICAgICAgQ29sIFtjb2xdLmxlbmd0aCA9IChJbmRleFR5cGUpIChuZXdfY3AgLSAmQSBbQ29sIFtjb2xdLnN0YXJ0XSkgOworCisgICAgICAvKiA9PT0gRnVydGhlciBtYXNzIGVsaW1pbmF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgICBpZiAoQ29sIFtjb2xdLmxlbmd0aCA9PSAwKQorICAgICAgeworCUNPTEFNRF9ERUJVRzQgKCgiZnVydGhlciBtYXNzIGVsaW1pbmF0aW9uLiBDb2w6ICVkXG4iLCBjb2wpKSA7CisJLyogbm90aGluZyBsZWZ0IGJ1dCB0aGUgcGl2b3Qgcm93IGluIHRoaXMgY29sdW1uICovCisJS0lMTF9QUklOQ0lQQUxfQ09MIChjb2wpIDsKKwlwaXZvdF9yb3dfZGVncmVlIC09IENvbCBbY29sXS5zaGFyZWQxLnRoaWNrbmVzcyA7CisJQ09MQU1EX0FTU0VSVCAocGl2b3Rfcm93X2RlZ3JlZSA+PSAwKSA7CisJLyogb3JkZXIgaXQgKi8KKwlDb2wgW2NvbF0uc2hhcmVkMi5vcmRlciA9IGsgOworCS8qIGluY3JlbWVudCBvcmRlciBjb3VudCBieSBjb2x1bW4gdGhpY2tuZXNzICovCisJayArPSBDb2wgW2NvbF0uc2hhcmVkMS50aGlja25lc3MgOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCS8qID09PSBQcmVwYXJlIGZvciBzdXBlcmNvbHVtbiBkZXRlY3Rpb24gPT09PT09PT09PT09PT09PT09PT0gKi8KKworCUNPTEFNRF9ERUJVRzQgKCgiUHJlcGFyaW5nIHN1cGVyY29sIGRldGVjdGlvbiBmb3IgQ29sOiAlZC5cbiIsIGNvbCkpIDsKKworCS8qIHNhdmUgc2NvcmUgc28gZmFyICovCisJQ29sIFtjb2xdLnNoYXJlZDIuc2NvcmUgPSBjdXJfc2NvcmUgOworCisJLyogYWRkIGNvbHVtbiB0byBoYXNoIHRhYmxlLCBmb3Igc3VwZXJjb2x1bW4gZGV0ZWN0aW9uICovCisJaGFzaCAlPSBuX2NvbCArIDEgOworCisJQ09MQU1EX0RFQlVHNCAoKCIgSGFzaCA9ICVkLCBuX2NvbCA9ICVkLlxuIiwgaGFzaCwgbl9jb2wpKSA7CisJQ09MQU1EX0FTU0VSVCAoaGFzaCA8PSBuX2NvbCkgOworCisJaGVhZF9jb2x1bW4gPSBoZWFkIFtoYXNoXSA7CisJaWYgKGhlYWRfY29sdW1uID4gQ09MQU1EX0VNUFRZKQorCXsKKwkgIC8qIGRlZ3JlZSBsaXN0ICJoYXNoIiBpcyBub24tZW1wdHksIHVzZSBwcmV2IChzaGFyZWQzKSBvZiAqLworCSAgLyogZmlyc3QgY29sdW1uIGluIGRlZ3JlZSBsaXN0IGFzIGhlYWQgb2YgaGFzaCBidWNrZXQgKi8KKwkgIGZpcnN0X2NvbCA9IENvbCBbaGVhZF9jb2x1bW5dLnNoYXJlZDMuaGVhZGhhc2ggOworCSAgQ29sIFtoZWFkX2NvbHVtbl0uc2hhcmVkMy5oZWFkaGFzaCA9IGNvbCA7CisJfQorCWVsc2UKKwl7CisJICAvKiBkZWdyZWUgbGlzdCAiaGFzaCIgaXMgZW1wdHksIHVzZSBoZWFkIGFzIGhhc2ggYnVja2V0ICovCisJICBmaXJzdF9jb2wgPSAtIChoZWFkX2NvbHVtbiArIDIpIDsKKwkgIGhlYWQgW2hhc2hdID0gLSAoY29sICsgMikgOworCX0KKwlDb2wgW2NvbF0uc2hhcmVkNC5oYXNoX25leHQgPSBmaXJzdF9jb2wgOworCisJLyogc2F2ZSBoYXNoIGZ1bmN0aW9uIGluIENvbCBbY29sXS5zaGFyZWQzLmhhc2ggKi8KKwlDb2wgW2NvbF0uc2hhcmVkMy5oYXNoID0gKEluZGV4VHlwZSkgaGFzaCA7CisJQ09MQU1EX0FTU0VSVCAoQ09MX0lTX0FMSVZFIChjb2wpKSA7CisgICAgICB9CisgICAgfQorCisgICAgLyogVGhlIGFwcHJveGltYXRlIGV4dGVybmFsIGNvbHVtbiBkZWdyZWUgaXMgbm93IGNvbXB1dGVkLiAgKi8KKworICAgIC8qID09PSBTdXBlcmNvbHVtbiBkZXRlY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgQ09MQU1EX0RFQlVHMyAoKCIqKiBTdXBlcmNvbHVtbiBkZXRlY3Rpb24gcGhhc2UuICoqXG4iKSkgOworCisgICAgRWlnZW46OmludGVybmFsOjpkZXRlY3Rfc3VwZXJfY29scyAoQ29sLCBBLCBoZWFkLCBwaXZvdF9yb3dfc3RhcnQsIHBpdm90X3Jvd19sZW5ndGgpIDsKKworICAgIC8qID09PSBLaWxsIHRoZSBwaXZvdGFsIGNvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgS0lMTF9QUklOQ0lQQUxfQ09MIChwaXZvdF9jb2wpIDsKKworICAgIC8qID09PSBDbGVhciBtYXJrID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgdGFnX21hcmsgKz0gKG1heF9kZWcgKyAxKSA7CisgICAgaWYgKHRhZ19tYXJrID49IG1heF9tYXJrKQorICAgIHsKKyAgICAgIENPTEFNRF9ERUJVRzIgKCgiY2xlYXJpbmcgdGFnX21hcmtcbiIpKSA7CisgICAgICB0YWdfbWFyayA9IEVpZ2VuOjppbnRlcm5hbDo6Y2xlYXJfbWFyayAobl9yb3csIFJvdykgOworICAgIH0KKworICAgIC8qID09PSBGaW5hbGl6ZSB0aGUgbmV3IHBpdm90IHJvdywgYW5kIGNvbHVtbiBzY29yZXMgPT09PT09PT09PT09PT09PSAqLworCisgICAgQ09MQU1EX0RFQlVHMyAoKCIqKiBGaW5hbGl6ZSBzY29yZXMgcGhhc2UuICoqXG4iKSkgOworCisgICAgLyogZm9yIGVhY2ggY29sdW1uIGluIHBpdm90IHJvdyAqLworICAgIHJwID0gJkEgW3Bpdm90X3Jvd19zdGFydF0gOworICAgIC8qIGNvbXBhY3QgdGhlIHBpdm90IHJvdyAqLworICAgIG5ld19ycCA9IHJwIDsKKyAgICBycF9lbmQgPSBycCArIHBpdm90X3Jvd19sZW5ndGggOworICAgIHdoaWxlIChycCA8IHJwX2VuZCkKKyAgICB7CisgICAgICBjb2wgPSAqcnArKyA7CisgICAgICAvKiBza2lwIGRlYWQgY29sdW1ucyAqLworICAgICAgaWYgKENPTF9JU19ERUFEIChjb2wpKQorICAgICAgeworCWNvbnRpbnVlIDsKKyAgICAgIH0KKyAgICAgICpuZXdfcnArKyA9IGNvbCA7CisgICAgICAvKiBhZGQgbmV3IHBpdm90IHJvdyB0byBjb2x1bW4gKi8KKyAgICAgIEEgW0NvbCBbY29sXS5zdGFydCArIChDb2wgW2NvbF0ubGVuZ3RoKyspXSA9IHBpdm90X3JvdyA7CisKKyAgICAgIC8qIHJldHJpZXZlIHNjb3JlIHNvIGZhciBhbmQgYWRkIG9uIHBpdm90IHJvdydzIGRlZ3JlZS4gKi8KKyAgICAgIC8qICh3ZSB3YWl0IHVudGlsIGhlcmUgZm9yIHRoaXMgaW4gY2FzZSB0aGUgcGl2b3QgKi8KKyAgICAgIC8qIHJvdydzIGRlZ3JlZSB3YXMgcmVkdWNlZCBkdWUgdG8gbWFzcyBlbGltaW5hdGlvbikuICovCisgICAgICBjdXJfc2NvcmUgPSBDb2wgW2NvbF0uc2hhcmVkMi5zY29yZSArIHBpdm90X3Jvd19kZWdyZWUgOworCisgICAgICAvKiBjYWxjdWxhdGUgdGhlIG1heCBwb3NzaWJsZSBzY29yZSBhcyB0aGUgbnVtYmVyIG9mICovCisgICAgICAvKiBleHRlcm5hbCBjb2x1bW5zIG1pbnVzIHRoZSAnaycgdmFsdWUgbWludXMgdGhlICovCisgICAgICAvKiBjb2x1bW5zIHRoaWNrbmVzcyAqLworICAgICAgbWF4X3Njb3JlID0gbl9jb2wgLSBrIC0gQ29sIFtjb2xdLnNoYXJlZDEudGhpY2tuZXNzIDsKKworICAgICAgLyogbWFrZSB0aGUgc2NvcmUgdGhlIGV4dGVybmFsIGRlZ3JlZSBvZiB0aGUgdW5pb24tb2Ytcm93cyAqLworICAgICAgY3VyX3Njb3JlIC09IENvbCBbY29sXS5zaGFyZWQxLnRoaWNrbmVzcyA7CisKKyAgICAgIC8qIG1ha2Ugc3VyZSBzY29yZSBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gdGhlIG1heCBzY29yZSAqLworICAgICAgY3VyX3Njb3JlID0gbnVtZXh0OjptaW5pKGN1cl9zY29yZSwgbWF4X3Njb3JlKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChjdXJfc2NvcmUgPj0gMCkgOworCisgICAgICAvKiBzdG9yZSB1cGRhdGVkIHNjb3JlICovCisgICAgICBDb2wgW2NvbF0uc2hhcmVkMi5zY29yZSA9IGN1cl9zY29yZSA7CisKKyAgICAgIC8qID09PSBQbGFjZSBjb2x1bW4gYmFjayBpbiBkZWdyZWUgbGlzdCA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICAgIENPTEFNRF9BU1NFUlQgKG1pbl9zY29yZSA+PSAwKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChtaW5fc2NvcmUgPD0gbl9jb2wpIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKGN1cl9zY29yZSA+PSAwKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChjdXJfc2NvcmUgPD0gbl9jb2wpIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKGhlYWQgW2N1cl9zY29yZV0gPj0gQ09MQU1EX0VNUFRZKSA7CisgICAgICBuZXh0X2NvbCA9IGhlYWQgW2N1cl9zY29yZV0gOworICAgICAgQ29sIFtjb2xdLnNoYXJlZDQuZGVncmVlX25leHQgPSBuZXh0X2NvbCA7CisgICAgICBDb2wgW2NvbF0uc2hhcmVkMy5wcmV2ID0gQ09MQU1EX0VNUFRZIDsKKyAgICAgIGlmIChuZXh0X2NvbCAhPSBDT0xBTURfRU1QVFkpCisgICAgICB7CisJQ29sIFtuZXh0X2NvbF0uc2hhcmVkMy5wcmV2ID0gY29sIDsKKyAgICAgIH0KKyAgICAgIGhlYWQgW2N1cl9zY29yZV0gPSBjb2wgOworCisgICAgICAvKiBzZWUgaWYgdGhpcyBzY29yZSBpcyBsZXNzIHRoYW4gY3VycmVudCBtaW4gKi8KKyAgICAgIG1pbl9zY29yZSA9IG51bWV4dDo6bWluaShtaW5fc2NvcmUsIGN1cl9zY29yZSkgOworCisgICAgfQorCisgICAgLyogPT09IFJlc3VycmVjdCB0aGUgbmV3IHBpdm90IHJvdyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBpZiAocGl2b3Rfcm93X2RlZ3JlZSA+IDApCisgICAgeworICAgICAgLyogdXBkYXRlIHBpdm90IHJvdyBsZW5ndGggdG8gcmVmbGVjdCBhbnkgY29scyB0aGF0IHdlcmUga2lsbGVkICovCisgICAgICAvKiBkdXJpbmcgc3VwZXItY29sIGRldGVjdGlvbiBhbmQgbWFzcyBlbGltaW5hdGlvbiAqLworICAgICAgUm93IFtwaXZvdF9yb3ddLnN0YXJ0ICA9IHBpdm90X3Jvd19zdGFydCA7CisgICAgICBSb3cgW3Bpdm90X3Jvd10ubGVuZ3RoID0gKEluZGV4VHlwZSkgKG5ld19ycCAtICZBW3Bpdm90X3Jvd19zdGFydF0pIDsKKyAgICAgIFJvdyBbcGl2b3Rfcm93XS5zaGFyZWQxLmRlZ3JlZSA9IHBpdm90X3Jvd19kZWdyZWUgOworICAgICAgUm93IFtwaXZvdF9yb3ddLnNoYXJlZDIubWFyayA9IDAgOworICAgICAgLyogcGl2b3Qgcm93IGlzIG5vIGxvbmdlciBkZWFkICovCisgICAgfQorICB9CisKKyAgLyogPT09IEFsbCBwcmluY2lwYWwgY29sdW1ucyBoYXZlIG5vdyBiZWVuIG9yZGVyZWQgPT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHJldHVybiAobmdhcmJhZ2UpIDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09IG9yZGVyX2NoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgIFRoZSBmaW5kX29yZGVyaW5nIHJvdXRpbmUgaGFzIG9yZGVyZWQgYWxsIG9mIHRoZSBwcmluY2lwYWwgY29sdW1ucyAodGhlCisgIHJlcHJlc2VudGF0aXZlcyBvZiB0aGUgc3VwZXJjb2x1bW5zKS4gIFRoZSBub24tcHJpbmNpcGFsIGNvbHVtbnMgaGF2ZSBub3QKKyAgeWV0IGJlZW4gb3JkZXJlZC4gIFRoaXMgcm91dGluZSBvcmRlcnMgdGhvc2UgY29sdW1ucyBieSB3YWxraW5nIHVwIHRoZQorICBwYXJlbnQgdHJlZSAoYSBjb2x1bW4gaXMgYSBjaGlsZCBvZiB0aGUgY29sdW1uIHdoaWNoIGFic29yYmVkIGl0KS4gIFRoZQorICBmaW5hbCBwZXJtdXRhdGlvbiB2ZWN0b3IgaXMgdGhlbiBwbGFjZWQgaW4gcCBbMCAuLi4gbl9jb2wtMV0sIHdpdGggcCBbMF0KKyAgYmVpbmcgdGhlIGZpcnN0IGNvbHVtbiwgYW5kIHAgW25fY29sLTFdIGJlaW5nIHRoZSBsYXN0LiAgSXQgZG9lc24ndCBsb29rCisgIGxpa2UgaXQgYXQgZmlyc3QgZ2xhbmNlLCBidXQgYmUgYXNzdXJlZCB0aGF0IHRoaXMgcm91dGluZSB0YWtlcyB0aW1lIGxpbmVhcgorICBpbiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuICBBbHRob3VnaCBub3QgaW1tZWRpYXRlbHkgb2J2aW91cywgdGhlIHRpbWUKKyAgdGFrZW4gYnkgdGhpcyByb3V0aW5lIGlzIE8gKG5fY29sKSwgdGhhdCBpcywgbGluZWFyIGluIHRoZSBudW1iZXIgb2YKKyAgY29sdW1ucy4gIE5vdCB1c2VyLWNhbGxhYmxlLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgaW5saW5lICB2b2lkIG9yZGVyX2NoaWxkcmVuCisoCisgIC8qID09PSBQYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBJbmRleFR5cGUgbl9jb2wsICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgb2YgQSAqLworICBjb2xhbWRfY29sPEluZGV4VHlwZT4gQ29sIFtdLCAgICAvKiBvZiBzaXplIG5fY29sKzEgKi8KKyAgSW5kZXhUeXBlIHAgW10gICAgICAvKiBwIFswIC4uLiBuX2NvbC0xXSBpcyB0aGUgY29sdW1uIHBlcm11dGF0aW9uKi8KKyAgKQoreworICAvKiA9PT0gTG9jYWwgdmFyaWFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgSW5kZXhUeXBlIGkgOyAgICAgLyogbG9vcCBjb3VudGVyIGZvciBhbGwgY29sdW1ucyAqLworICBJbmRleFR5cGUgYyA7ICAgICAvKiBjb2x1bW4gaW5kZXggKi8KKyAgSW5kZXhUeXBlIHBhcmVudCA7ICAgIC8qIGluZGV4IG9mIGNvbHVtbidzIHBhcmVudCAqLworICBJbmRleFR5cGUgb3JkZXIgOyAgICAgLyogY29sdW1uJ3Mgb3JkZXIgKi8KKworICAvKiA9PT0gT3JkZXIgZWFjaCBub24tcHJpbmNpcGFsIGNvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgZm9yIChpID0gMCA7IGkgPCBuX2NvbCA7IGkrKykKKyAgeworICAgIC8qIGZpbmQgYW4gdW4tb3JkZXJlZCBub24tcHJpbmNpcGFsIGNvbHVtbiAqLworICAgIENPTEFNRF9BU1NFUlQgKENPTF9JU19ERUFEIChpKSkgOworICAgIGlmICghQ09MX0lTX0RFQURfUFJJTkNJUEFMIChpKSAmJiBDb2wgW2ldLnNoYXJlZDIub3JkZXIgPT0gQ09MQU1EX0VNUFRZKQorICAgIHsKKyAgICAgIHBhcmVudCA9IGkgOworICAgICAgLyogb25jZSBmb3VuZCwgZmluZCBpdHMgcHJpbmNpcGFsIHBhcmVudCAqLworICAgICAgZG8KKyAgICAgIHsKKwlwYXJlbnQgPSBDb2wgW3BhcmVudF0uc2hhcmVkMS5wYXJlbnQgOworICAgICAgfSB3aGlsZSAoIUNPTF9JU19ERUFEX1BSSU5DSVBBTCAocGFyZW50KSkgOworCisgICAgICAvKiBub3csIG9yZGVyIGFsbCB1bi1vcmRlcmVkIG5vbi1wcmluY2lwYWwgY29sdW1ucyBhbG9uZyBwYXRoICovCisgICAgICAvKiB0byB0aGlzIHBhcmVudC4gIGNvbGxhcHNlIHRyZWUgYXQgdGhlIHNhbWUgdGltZSAqLworICAgICAgYyA9IGkgOworICAgICAgLyogZ2V0IG9yZGVyIG9mIHBhcmVudCAqLworICAgICAgb3JkZXIgPSBDb2wgW3BhcmVudF0uc2hhcmVkMi5vcmRlciA7CisKKyAgICAgIGRvCisgICAgICB7CisJQ09MQU1EX0FTU0VSVCAoQ29sIFtjXS5zaGFyZWQyLm9yZGVyID09IENPTEFNRF9FTVBUWSkgOworCisJLyogb3JkZXIgdGhpcyBjb2x1bW4gKi8KKwlDb2wgW2NdLnNoYXJlZDIub3JkZXIgPSBvcmRlcisrIDsKKwkvKiBjb2xsYXBzIHRyZWUgKi8KKwlDb2wgW2NdLnNoYXJlZDEucGFyZW50ID0gcGFyZW50IDsKKworCS8qIGdldCBpbW1lZGlhdGUgcGFyZW50IG9mIHRoaXMgY29sdW1uICovCisJYyA9IENvbCBbY10uc2hhcmVkMS5wYXJlbnQgOworCisJLyogY29udGludWUgdW50aWwgd2UgaGl0IGFuIG9yZGVyZWQgY29sdW1uLiAgVGhlcmUgYXJlICovCisJLyogZ3VhcnJhbnRlZWQgbm90IHRvIGJlIGFueW1vcmUgdW5vcmRlcmVkIGNvbHVtbnMgKi8KKwkvKiBhYm92ZSBhbiBvcmRlcmVkIGNvbHVtbiAqLworICAgICAgfSB3aGlsZSAoQ29sIFtjXS5zaGFyZWQyLm9yZGVyID09IENPTEFNRF9FTVBUWSkgOworCisgICAgICAvKiByZS1vcmRlciB0aGUgc3VwZXJfY29sIHBhcmVudCB0byBsYXJnZXN0IG9yZGVyIGZvciB0aGlzIGdyb3VwICovCisgICAgICBDb2wgW3BhcmVudF0uc2hhcmVkMi5vcmRlciA9IG9yZGVyIDsKKyAgICB9CisgIH0KKworICAvKiA9PT0gR2VuZXJhdGUgdGhlIHBlcm11dGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgZm9yIChjID0gMCA7IGMgPCBuX2NvbCA7IGMrKykKKyAgeworICAgIHAgW0NvbCBbY10uc2hhcmVkMi5vcmRlcl0gPSBjIDsKKyAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gZGV0ZWN0X3N1cGVyX2NvbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAgRGV0ZWN0cyBzdXBlcmNvbHVtbnMgYnkgZmluZGluZyBtYXRjaGVzIGJldHdlZW4gY29sdW1ucyBpbiB0aGUgaGFzaCBidWNrZXRzLgorICBDaGVjayBhbW9uZ3N0IGNvbHVtbnMgaW4gdGhlIHNldCBBIFtyb3dfc3RhcnQgLi4uIHJvd19zdGFydCArIHJvd19sZW5ndGgtMV0uCisgIFRoZSBjb2x1bW5zIHVuZGVyIGNvbnNpZGVyYXRpb24gYXJlIGN1cnJlbnRseSAqbm90KiBpbiB0aGUgZGVncmVlIGxpc3RzLAorICBhbmQgaGF2ZSBhbHJlYWR5IGJlZW4gcGxhY2VkIGluIHRoZSBoYXNoIGJ1Y2tldHMuCisKKyAgVGhlIGhhc2ggYnVja2V0IGZvciBjb2x1bW5zIHdob3NlIGhhc2ggZnVuY3Rpb24gaXMgZXF1YWwgdG8gaCBpcyBzdG9yZWQKKyAgYXMgZm9sbG93czoKKworICBpZiBoZWFkIFtoXSBpcyA+PSAwLCB0aGVuIGhlYWQgW2hdIGNvbnRhaW5zIGEgZGVncmVlIGxpc3QsIHNvOgorCisgIGhlYWQgW2hdIGlzIHRoZSBmaXJzdCBjb2x1bW4gaW4gZGVncmVlIGJ1Y2tldCBoLgorICBDb2wgW2hlYWQgW2hdXS5oZWFkaGFzaCBnaXZlcyB0aGUgZmlyc3QgY29sdW1uIGluIGhhc2ggYnVja2V0IGguCisKKyAgb3RoZXJ3aXNlLCB0aGUgZGVncmVlIGxpc3QgaXMgZW1wdHksIGFuZDoKKworICAtKGhlYWQgW2hdICsgMikgaXMgdGhlIGZpcnN0IGNvbHVtbiBpbiBoYXNoIGJ1Y2tldCBoLgorCisgIEZvciBhIGNvbHVtbiBjIGluIGEgaGFzaCBidWNrZXQsIENvbCBbY10uc2hhcmVkMy5wcmV2IGlzIE5PVCBhICJwcmV2aW91cworICBjb2x1bW4iIHBvaW50ZXIuICBDb2wgW2NdLnNoYXJlZDMuaGFzaCBpcyB1c2VkIGluc3RlYWQgYXMgdGhlIGhhc2ggbnVtYmVyCisgIGZvciB0aGF0IGNvbHVtbi4gIFRoZSB2YWx1ZSBvZiBDb2wgW2NdLnNoYXJlZDQuaGFzaF9uZXh0IGlzIHRoZSBuZXh0IGNvbHVtbgorICBpbiB0aGUgc2FtZSBoYXNoIGJ1Y2tldC4KKworICBBc3N1bWluZyBubywgb3IgImZldyIgaGFzaCBjb2xsaXNpb25zLCB0aGUgdGltZSB0YWtlbiBieSB0aGlzIHJvdXRpbmUgaXMKKyAgbGluZWFyIGluIHRoZSBzdW0gb2YgdGhlIHNpemVzIChsZW5ndGhzKSBvZiBlYWNoIGNvbHVtbiB3aG9zZSBzY29yZSBoYXMKKyAganVzdCBiZWVuIGNvbXB1dGVkIGluIHRoZSBhcHByb3hpbWF0ZSBkZWdyZWUgY29tcHV0YXRpb24uCisgIE5vdCB1c2VyLWNhbGxhYmxlLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCBkZXRlY3Rfc3VwZXJfY29scworKAorICAvKiA9PT0gUGFyYW1ldGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgIAorICBjb2xhbWRfY29sPEluZGV4VHlwZT4gQ29sIFtdLCAgICAvKiBvZiBzaXplIG5fY29sKzEgKi8KKyAgSW5kZXhUeXBlIEEgW10sICAgICAvKiByb3cgaW5kaWNlcyBvZiBBICovCisgIEluZGV4VHlwZSBoZWFkIFtdLCAgICAvKiBoZWFkIG9mIGRlZ3JlZSBsaXN0cyBhbmQgaGFzaCBidWNrZXRzICovCisgIEluZGV4VHlwZSByb3dfc3RhcnQsICAgIC8qIHBvaW50ZXIgdG8gc2V0IG9mIGNvbHVtbnMgdG8gY2hlY2sgKi8KKyAgSW5kZXhUeXBlIHJvd19sZW5ndGggICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgdG8gY2hlY2sgKi8KKykKK3sKKyAgLyogPT09IExvY2FsIHZhcmlhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIEluZGV4VHlwZSBoYXNoIDsgICAgICAvKiBoYXNoIHZhbHVlIGZvciBhIGNvbHVtbiAqLworICBJbmRleFR5cGUgKnJwIDsgICAgIC8qIHBvaW50ZXIgdG8gYSByb3cgKi8KKyAgSW5kZXhUeXBlIGMgOyAgICAgLyogYSBjb2x1bW4gaW5kZXggKi8KKyAgSW5kZXhUeXBlIHN1cGVyX2MgOyAgIC8qIGNvbHVtbiBpbmRleCBvZiB0aGUgY29sdW1uIHRvIGFic29yYiBpbnRvICovCisgIEluZGV4VHlwZSAqY3AxIDsgICAgICAvKiBjb2x1bW4gcG9pbnRlciBmb3IgY29sdW1uIHN1cGVyX2MgKi8KKyAgSW5kZXhUeXBlICpjcDIgOyAgICAgIC8qIGNvbHVtbiBwb2ludGVyIGZvciBjb2x1bW4gYyAqLworICBJbmRleFR5cGUgbGVuZ3RoIDsgICAgLyogbGVuZ3RoIG9mIGNvbHVtbiBzdXBlcl9jICovCisgIEluZGV4VHlwZSBwcmV2X2MgOyAgICAvKiBjb2x1bW4gcHJlY2VkaW5nIGMgaW4gaGFzaCBidWNrZXQgKi8KKyAgSW5kZXhUeXBlIGkgOyAgICAgLyogbG9vcCBjb3VudGVyICovCisgIEluZGV4VHlwZSAqcnBfZW5kIDsgICAvKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHJvdyAqLworICBJbmRleFR5cGUgY29sIDsgICAgIC8qIGEgY29sdW1uIGluZGV4IGluIHRoZSByb3cgdG8gY2hlY2sgKi8KKyAgSW5kZXhUeXBlIGhlYWRfY29sdW1uIDsgICAvKiBmaXJzdCBjb2x1bW4gaW4gaGFzaCBidWNrZXQgb3IgZGVncmVlIGxpc3QgKi8KKyAgSW5kZXhUeXBlIGZpcnN0X2NvbCA7ICAgLyogZmlyc3QgY29sdW1uIGluIGhhc2ggYnVja2V0ICovCisKKyAgLyogPT09IENvbnNpZGVyIGVhY2ggY29sdW1uIGluIHRoZSByb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHJwID0gJkEgW3Jvd19zdGFydF0gOworICBycF9lbmQgPSBycCArIHJvd19sZW5ndGggOworICB3aGlsZSAocnAgPCBycF9lbmQpCisgIHsKKyAgICBjb2wgPSAqcnArKyA7CisgICAgaWYgKENPTF9JU19ERUFEIChjb2wpKQorICAgIHsKKyAgICAgIGNvbnRpbnVlIDsKKyAgICB9CisKKyAgICAvKiBnZXQgaGFzaCBudW1iZXIgZm9yIHRoaXMgY29sdW1uICovCisgICAgaGFzaCA9IENvbCBbY29sXS5zaGFyZWQzLmhhc2ggOworICAgIENPTEFNRF9BU1NFUlQgKGhhc2ggPD0gbl9jb2wpIDsKKworICAgIC8qID09PSBHZXQgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGlzIGhhc2ggYnVja2V0ID09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgaGVhZF9jb2x1bW4gPSBoZWFkIFtoYXNoXSA7CisgICAgaWYgKGhlYWRfY29sdW1uID4gQ09MQU1EX0VNUFRZKQorICAgIHsKKyAgICAgIGZpcnN0X2NvbCA9IENvbCBbaGVhZF9jb2x1bW5dLnNoYXJlZDMuaGVhZGhhc2ggOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZmlyc3RfY29sID0gLSAoaGVhZF9jb2x1bW4gKyAyKSA7CisgICAgfQorCisgICAgLyogPT09IENvbnNpZGVyIGVhY2ggY29sdW1uIGluIHRoZSBoYXNoIGJ1Y2tldCA9PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBmb3IgKHN1cGVyX2MgPSBmaXJzdF9jb2wgOyBzdXBlcl9jICE9IENPTEFNRF9FTVBUWSA7CisJIHN1cGVyX2MgPSBDb2wgW3N1cGVyX2NdLnNoYXJlZDQuaGFzaF9uZXh0KQorICAgIHsKKyAgICAgIENPTEFNRF9BU1NFUlQgKENPTF9JU19BTElWRSAoc3VwZXJfYykpIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKENvbCBbc3VwZXJfY10uc2hhcmVkMy5oYXNoID09IGhhc2gpIDsKKyAgICAgIGxlbmd0aCA9IENvbCBbc3VwZXJfY10ubGVuZ3RoIDsKKworICAgICAgLyogcHJldl9jIGlzIHRoZSBjb2x1bW4gcHJlY2VkaW5nIGNvbHVtbiBjIGluIHRoZSBoYXNoIGJ1Y2tldCAqLworICAgICAgcHJldl9jID0gc3VwZXJfYyA7CisKKyAgICAgIC8qID09PSBDb21wYXJlIHN1cGVyX2Mgd2l0aCBhbGwgY29sdW1ucyBhZnRlciBpdCA9PT09PT09PT09PT09PT09ICovCisKKyAgICAgIGZvciAoYyA9IENvbCBbc3VwZXJfY10uc2hhcmVkNC5oYXNoX25leHQgOworCSAgIGMgIT0gQ09MQU1EX0VNUFRZIDsgYyA9IENvbCBbY10uc2hhcmVkNC5oYXNoX25leHQpCisgICAgICB7CisJQ09MQU1EX0FTU0VSVCAoYyAhPSBzdXBlcl9jKSA7CisJQ09MQU1EX0FTU0VSVCAoQ09MX0lTX0FMSVZFIChjKSkgOworCUNPTEFNRF9BU1NFUlQgKENvbCBbY10uc2hhcmVkMy5oYXNoID09IGhhc2gpIDsKKworCS8qIG5vdCBpZGVudGljYWwgaWYgbGVuZ3RocyBvciBzY29yZXMgYXJlIGRpZmZlcmVudCAqLworCWlmIChDb2wgW2NdLmxlbmd0aCAhPSBsZW5ndGggfHwKKwkgICAgQ29sIFtjXS5zaGFyZWQyLnNjb3JlICE9IENvbCBbc3VwZXJfY10uc2hhcmVkMi5zY29yZSkKKwl7CisJICBwcmV2X2MgPSBjIDsKKwkgIGNvbnRpbnVlIDsKKwl9CisKKwkvKiBjb21wYXJlIHRoZSB0d28gY29sdW1ucyAqLworCWNwMSA9ICZBIFtDb2wgW3N1cGVyX2NdLnN0YXJ0XSA7CisJY3AyID0gJkEgW0NvbCBbY10uc3RhcnRdIDsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKQorCXsKKwkgIC8qIHRoZSBjb2x1bW5zIGFyZSAiY2xlYW4iIChubyBkZWFkIHJvd3MpICovCisJICBDT0xBTURfQVNTRVJUIChST1dfSVNfQUxJVkUgKCpjcDEpKSAgOworCSAgQ09MQU1EX0FTU0VSVCAoUk9XX0lTX0FMSVZFICgqY3AyKSkgIDsKKwkgIC8qIHJvdyBpbmRpY2VzIHdpbGwgc2FtZSBvcmRlciBmb3IgYm90aCBzdXBlcmNvbHMsICovCisJICAvKiBubyBnYXRoZXIgc2NhdHRlciBuZXNzYXNhcnkgKi8KKwkgIGlmICgqY3AxKysgIT0gKmNwMisrKQorCSAgeworCSAgICBicmVhayA7CisJICB9CisJfQorCisJLyogdGhlIHR3byBjb2x1bW5zIGFyZSBkaWZmZXJlbnQgaWYgdGhlIGZvci1sb29wICJicm9rZSIgKi8KKwlpZiAoaSAhPSBsZW5ndGgpCisJeworCSAgcHJldl9jID0gYyA7CisJICBjb250aW51ZSA7CisJfQorCisJLyogPT09IEdvdCBpdCEgIHR3byBjb2x1bW5zIGFyZSBpZGVudGljYWwgPT09PT09PT09PT09PT09PT09PSAqLworCisJQ09MQU1EX0FTU0VSVCAoQ29sIFtjXS5zaGFyZWQyLnNjb3JlID09IENvbCBbc3VwZXJfY10uc2hhcmVkMi5zY29yZSkgOworCisJQ29sIFtzdXBlcl9jXS5zaGFyZWQxLnRoaWNrbmVzcyArPSBDb2wgW2NdLnNoYXJlZDEudGhpY2tuZXNzIDsKKwlDb2wgW2NdLnNoYXJlZDEucGFyZW50ID0gc3VwZXJfYyA7CisJS0lMTF9OT05fUFJJTkNJUEFMX0NPTCAoYykgOworCS8qIG9yZGVyIGMgbGF0ZXIsIGluIG9yZGVyX2NoaWxkcmVuKCkgKi8KKwlDb2wgW2NdLnNoYXJlZDIub3JkZXIgPSBDT0xBTURfRU1QVFkgOworCS8qIHJlbW92ZSBjIGZyb20gaGFzaCBidWNrZXQgKi8KKwlDb2wgW3ByZXZfY10uc2hhcmVkNC5oYXNoX25leHQgPSBDb2wgW2NdLnNoYXJlZDQuaGFzaF9uZXh0IDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiA9PT0gRW1wdHkgdGhpcyBoYXNoIGJ1Y2tldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGlmIChoZWFkX2NvbHVtbiA+IENPTEFNRF9FTVBUWSkKKyAgICB7CisgICAgICAvKiBjb3JyZXNwb25kaW5nIGRlZ3JlZSBsaXN0ICJoYXNoIiBpcyBub3QgZW1wdHkgKi8KKyAgICAgIENvbCBbaGVhZF9jb2x1bW5dLnNoYXJlZDMuaGVhZGhhc2ggPSBDT0xBTURfRU1QVFkgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogY29ycmVzcG9uZGluZyBkZWdyZWUgbGlzdCAiaGFzaCIgaXMgZW1wdHkgKi8KKyAgICAgIGhlYWQgW2hhc2hdID0gQ09MQU1EX0VNUFRZIDsKKyAgICB9CisgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09IGdhcmJhZ2VfY29sbGVjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgIERlZnJhZ21lbnRzIGFuZCBjb21wYWN0cyBjb2x1bW5zIGFuZCByb3dzIGluIHRoZSB3b3Jrc3BhY2UgQS4gIFVzZWQgd2hlbgorICBhbGwgYXZhbGlhYmxlIG1lbW9yeSBoYXMgYmVlbiB1c2VkIHdoaWxlIHBlcmZvcm1pbmcgcm93IG1lcmdpbmcuICBSZXR1cm5zCisgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSBwb3NpdGlvbiBpbiBBLCBhZnRlciBnYXJiYWdlIGNvbGxlY3Rpb24uICBUaGUKKyAgdGltZSB0YWtlbiBieSB0aGlzIHJvdXRpbmUgaXMgbGluZWFyIGlzIHRoZSBzaXplIG9mIHRoZSBhcnJheSBBLCB3aGljaCBpcworICBpdHNlbGYgbGluZWFyIGluIHRoZSBudW1iZXIgb2Ygbm9uemVyb3MgaW4gdGhlIGlucHV0IG1hdHJpeC4KKyAgTm90IHVzZXItY2FsbGFibGUuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyBJbmRleFR5cGUgZ2FyYmFnZV9jb2xsZWN0aW9uICAvKiByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgcGZyZWUgKi8KKyAgKAorICAgIC8qID09PSBQYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAKKyAgICBJbmRleFR5cGUgbl9yb3csICAgICAgLyogbnVtYmVyIG9mIHJvd3MgKi8KKyAgICBJbmRleFR5cGUgbl9jb2wsICAgICAgLyogbnVtYmVyIG9mIGNvbHVtbnMgKi8KKyAgICBDb2xhbWRfUm93PEluZGV4VHlwZT4gUm93IFtdLCAgICAvKiByb3cgaW5mbyAqLworICAgIGNvbGFtZF9jb2w8SW5kZXhUeXBlPiBDb2wgW10sICAgIC8qIGNvbHVtbiBpbmZvICovCisgICAgSW5kZXhUeXBlIEEgW10sICAgICAvKiBBIFswIC4uLiBBbGVuLTFdIGhvbGRzIHRoZSBtYXRyaXggKi8KKyAgICBJbmRleFR5cGUgKnBmcmVlICAgICAgLyogJkEgWzBdIC4uLiBwZnJlZSBpcyBpbiB1c2UgKi8KKyAgICApCit7CisgIC8qID09PSBMb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBJbmRleFR5cGUgKnBzcmMgOyAgICAgLyogc291cmNlIHBvaW50ZXIgKi8KKyAgSW5kZXhUeXBlICpwZGVzdCA7ICAgIC8qIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgSW5kZXhUeXBlIGogOyAgICAgLyogY291bnRlciAqLworICBJbmRleFR5cGUgciA7ICAgICAvKiBhIHJvdyBpbmRleCAqLworICBJbmRleFR5cGUgYyA7ICAgICAvKiBhIGNvbHVtbiBpbmRleCAqLworICBJbmRleFR5cGUgbGVuZ3RoIDsgICAgLyogbGVuZ3RoIG9mIGEgcm93IG9yIGNvbHVtbiAqLworCisgIC8qID09PSBEZWZyYWdtZW50IHRoZSBjb2x1bW5zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBwZGVzdCA9ICZBWzBdIDsKKyAgZm9yIChjID0gMCA7IGMgPCBuX2NvbCA7IGMrKykKKyAgeworICAgIGlmIChDT0xfSVNfQUxJVkUgKGMpKQorICAgIHsKKyAgICAgIHBzcmMgPSAmQSBbQ29sIFtjXS5zdGFydF0gOworCisgICAgICAvKiBtb3ZlIGFuZCBjb21wYWN0IHRoZSBjb2x1bW4gKi8KKyAgICAgIENPTEFNRF9BU1NFUlQgKHBkZXN0IDw9IHBzcmMpIDsKKyAgICAgIENvbCBbY10uc3RhcnQgPSAoSW5kZXhUeXBlKSAocGRlc3QgLSAmQSBbMF0pIDsKKyAgICAgIGxlbmd0aCA9IENvbCBbY10ubGVuZ3RoIDsKKyAgICAgIGZvciAoaiA9IDAgOyBqIDwgbGVuZ3RoIDsgaisrKQorICAgICAgeworCXIgPSAqcHNyYysrIDsKKwlpZiAoUk9XX0lTX0FMSVZFIChyKSkKKwl7CisJICAqcGRlc3QrKyA9IHIgOworCX0KKyAgICAgIH0KKyAgICAgIENvbCBbY10ubGVuZ3RoID0gKEluZGV4VHlwZSkgKHBkZXN0IC0gJkEgW0NvbCBbY10uc3RhcnRdKSA7CisgICAgfQorICB9CisKKyAgLyogPT09IFByZXBhcmUgdG8gZGVmcmFnbWVudCB0aGUgcm93cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGZvciAociA9IDAgOyByIDwgbl9yb3cgOyByKyspCisgIHsKKyAgICBpZiAoUk9XX0lTX0FMSVZFIChyKSkKKyAgICB7CisgICAgICBpZiAoUm93IFtyXS5sZW5ndGggPT0gMCkKKyAgICAgIHsKKwkvKiB0aGlzIHJvdyBpcyBvZiB6ZXJvIGxlbmd0aC4gIGNhbm5vdCBjb21wYWN0IGl0LCBzbyBraWxsIGl0ICovCisJQ09MQU1EX0RFQlVHMyAoKCJEZWZyYWcgcm93IGtpbGxcbiIpKSA7CisJS0lMTF9ST1cgKHIpIDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwkvKiBzYXZlIGZpcnN0IGNvbHVtbiBpbmRleCBpbiBSb3cgW3JdLnNoYXJlZDIuZmlyc3RfY29sdW1uICovCisJcHNyYyA9ICZBIFtSb3cgW3JdLnN0YXJ0XSA7CisJUm93IFtyXS5zaGFyZWQyLmZpcnN0X2NvbHVtbiA9ICpwc3JjIDsKKwlDT0xBTURfQVNTRVJUIChST1dfSVNfQUxJVkUgKHIpKSA7CisJLyogZmxhZyB0aGUgc3RhcnQgb2YgdGhlIHJvdyB3aXRoIHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHJvdyAqLworCSpwc3JjID0gT05FU19DT01QTEVNRU5UIChyKSA7CisKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiA9PT0gRGVmcmFnbWVudCB0aGUgcm93cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgcHNyYyA9IHBkZXN0IDsKKyAgd2hpbGUgKHBzcmMgPCBwZnJlZSkKKyAgeworICAgIC8qIGZpbmQgYSBuZWdhdGl2ZSBudW1iZXIgLi4uIHRoZSBzdGFydCBvZiBhIHJvdyAqLworICAgIGlmICgqcHNyYysrIDwgMCkKKyAgICB7CisgICAgICBwc3JjLS0gOworICAgICAgLyogZ2V0IHRoZSByb3cgaW5kZXggKi8KKyAgICAgIHIgPSBPTkVTX0NPTVBMRU1FTlQgKCpwc3JjKSA7CisgICAgICBDT0xBTURfQVNTRVJUIChyID49IDAgJiYgciA8IG5fcm93KSA7CisgICAgICAvKiByZXN0b3JlIGZpcnN0IGNvbHVtbiBpbmRleCAqLworICAgICAgKnBzcmMgPSBSb3cgW3JdLnNoYXJlZDIuZmlyc3RfY29sdW1uIDsKKyAgICAgIENPTEFNRF9BU1NFUlQgKFJPV19JU19BTElWRSAocikpIDsKKworICAgICAgLyogbW92ZSBhbmQgY29tcGFjdCB0aGUgcm93ICovCisgICAgICBDT0xBTURfQVNTRVJUIChwZGVzdCA8PSBwc3JjKSA7CisgICAgICBSb3cgW3JdLnN0YXJ0ID0gKEluZGV4VHlwZSkgKHBkZXN0IC0gJkEgWzBdKSA7CisgICAgICBsZW5ndGggPSBSb3cgW3JdLmxlbmd0aCA7CisgICAgICBmb3IgKGogPSAwIDsgaiA8IGxlbmd0aCA7IGorKykKKyAgICAgIHsKKwljID0gKnBzcmMrKyA7CisJaWYgKENPTF9JU19BTElWRSAoYykpCisJeworCSAgKnBkZXN0KysgPSBjIDsKKwl9CisgICAgICB9CisgICAgICBSb3cgW3JdLmxlbmd0aCA9IChJbmRleFR5cGUpIChwZGVzdCAtICZBIFtSb3cgW3JdLnN0YXJ0XSkgOworCisgICAgfQorICB9CisgIC8qIGVuc3VyZSB3ZSBmb3VuZCBhbGwgdGhlIHJvd3MgKi8KKyAgQ09MQU1EX0FTU0VSVCAoZGVidWdfcm93cyA9PSAwKSA7CisKKyAgLyogPT09IFJldHVybiB0aGUgbmV3IHZhbHVlIG9mIHBmcmVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHJldHVybiAoKEluZGV4VHlwZSkgKHBkZXN0IC0gJkEgWzBdKSkgOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT0gY2xlYXJfbWFyayA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAgQ2xlYXJzIHRoZSBSb3cgW10uc2hhcmVkMi5tYXJrIGFycmF5LCBhbmQgcmV0dXJucyB0aGUgbmV3IHRhZ19tYXJrLgorICBSZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyB0YWdfbWFyay4gIE5vdCB1c2VyLWNhbGxhYmxlLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgaW5saW5lICBJbmRleFR5cGUgY2xlYXJfbWFyayAgLyogcmV0dXJuIHRoZSBuZXcgdmFsdWUgZm9yIHRhZ19tYXJrICovCisgICgKKyAgICAgIC8qID09PSBQYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIEluZGV4VHlwZSBuX3JvdywgICAgLyogbnVtYmVyIG9mIHJvd3MgaW4gQSAqLworICAgIENvbGFtZF9Sb3c8SW5kZXhUeXBlPiBSb3cgW10gLyogUm93IFswIC4uLiBuX3Jvdy0xXS5zaGFyZWQyLm1hcmsgaXMgc2V0IHRvIHplcm8gKi8KKyAgICApCit7CisgIC8qID09PSBMb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBJbmRleFR5cGUgciA7CisKKyAgZm9yIChyID0gMCA7IHIgPCBuX3JvdyA7IHIrKykKKyAgeworICAgIGlmIChST1dfSVNfQUxJVkUgKHIpKQorICAgIHsKKyAgICAgIFJvdyBbcl0uc2hhcmVkMi5tYXJrID0gMCA7CisgICAgfQorICB9CisgIHJldHVybiAoMSkgOworfQorCisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsIAorI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL09yZGVyaW5nLmggYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL09yZGVyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhOWIxNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9PcmRlcmluZ01ldGhvZHMvT3JkZXJpbmcuaApAQCAtMCwwICsxLDE1NyBAQAorIAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9PUkRFUklOR19ICisjZGVmaW5lIEVJR0VOX09SREVSSU5HX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKyAgCisjaW5jbHVkZSAiRWlnZW5fQ29sYW1kLmgiCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgCisvKiogXGludGVybmFsCisgICogXGluZ3JvdXAgT3JkZXJpbmdNZXRob2RzX01vZHVsZQorICAqIFxwYXJhbVtpbl0gQSB0aGUgaW5wdXQgbm9uLXN5bW1ldHJpYyBtYXRyaXgKKyAgKiBccGFyYW1bb3V0XSBzeW1tYXQgdGhlIHN5bW1ldHJpYyBwYXR0ZXJuIEFeVCtBIGZyb20gdGhlIGlucHV0IG1hdHJpeCBcYSBBLgorICAqIEZJWE1FOiBUaGUgdmFsdWVzIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBoZXJlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiAKK3ZvaWQgb3JkZXJpbmdfaGVscGVyX2F0X3BsdXNfYShjb25zdCBNYXRyaXhUeXBlJiBBLCBNYXRyaXhUeXBlJiBzeW1tYXQpCit7CisgIE1hdHJpeFR5cGUgQzsKKyAgQyA9IEEudHJhbnNwb3NlKCk7IC8vIE5PVEU6IENvdWxkIGJlICBjb3N0bHkKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBDLnJvd3MoKTsgaSsrKSAKKyAgeworICAgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KEMsIGkpOyBpdDsgKytpdCkKKyAgICAgICAgaXQudmFsdWVSZWYoKSA9IDAuMDsKKyAgfQorICBzeW1tYXQgPSBDICsgQTsKK30KKyAgICAKK30KKworI2lmbmRlZiBFSUdFTl9NUEwyX09OTFkKKworLyoqIFxpbmdyb3VwIE9yZGVyaW5nTWV0aG9kc19Nb2R1bGUKKyAgKiBcY2xhc3MgQU1ET3JkZXJpbmcKKyAgKgorICAqIEZ1bmN0b3IgY29tcHV0aW5nIHRoZSBcZW0gYXBwcm94aW1hdGUgXGVtIG1pbmltdW0gXGVtIGRlZ3JlZSBvcmRlcmluZworICAqIElmIHRoZSBtYXRyaXggaXMgbm90IHN0cnVjdHVyYWxseSBzeW1tZXRyaWMsIGFuIG9yZGVyaW5nIG9mIEFeVCtBIGlzIGNvbXB1dGVkCisgICogXHRwYXJhbSAgU3RvcmFnZUluZGV4IFRoZSB0eXBlIG9mIGluZGljZXMgb2YgdGhlIG1hdHJpeCAKKyAgKiBcc2EgQ09MQU1ET3JkZXJpbmcKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdG9yYWdlSW5kZXg+CitjbGFzcyBBTURPcmRlcmluZworeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljLCBTdG9yYWdlSW5kZXg+IFBlcm11dGF0aW9uVHlwZTsKKyAgICAKKyAgICAvKiogQ29tcHV0ZSB0aGUgcGVybXV0YXRpb24gdmVjdG9yIGZyb20gYSBzcGFyc2UgbWF0cml4CisgICAgICogVGhpcyByb3V0aW5lIGlzIG11Y2ggZmFzdGVyIGlmIHRoZSBpbnB1dCBtYXRyaXggaXMgY29sdW1uLW1ham9yICAgICAKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBQZXJtdXRhdGlvblR5cGUmIHBlcm0pCisgICAgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgc3ltbWV0cmljIHBhdHRlcm4KKyAgICAgIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIENvbE1ham9yLCBTdG9yYWdlSW5kZXg+IHN5bW07CisgICAgICBpbnRlcm5hbDo6b3JkZXJpbmdfaGVscGVyX2F0X3BsdXNfYShtYXQsc3ltbSk7IAorICAgIAorICAgICAgLy8gQ2FsbCB0aGUgQU1EIHJvdXRpbmUgCisgICAgICAvL21fbWF0LnBydW5lKGtlZXBfZGlhZygpKTsKKyAgICAgIGludGVybmFsOjptaW5pbXVtX2RlZ3JlZV9vcmRlcmluZyhzeW1tLCBwZXJtKTsKKyAgICB9CisgICAgCisgICAgLyoqIENvbXB1dGUgdGhlIHBlcm11dGF0aW9uIHdpdGggYSBzZWxmYWRqb2ludCBtYXRyaXggKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHlwZSwgdW5zaWduZWQgaW50IFNyY1VwTG8+IAorICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBTcGFyc2VTZWxmQWRqb2ludFZpZXc8U3JjVHlwZSwgU3JjVXBMbz4mIG1hdCwgUGVybXV0YXRpb25UeXBlJiBwZXJtKQorICAgIHsgCisgICAgICBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgU3JjVHlwZTo6U2NhbGFyLCBDb2xNYWpvciwgU3RvcmFnZUluZGV4PiBDOyBDID0gbWF0OworICAgICAgCisgICAgICAvLyBDYWxsIHRoZSBBTUQgcm91dGluZSAKKyAgICAgIC8vIG1fbWF0LnBydW5lKGtlZXBfZGlhZygpKTsgLy9SZW1vdmUgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIAorICAgICAgaW50ZXJuYWw6Om1pbmltdW1fZGVncmVlX29yZGVyaW5nKEMsIHBlcm0pOworICAgIH0KK307CisKKyNlbmRpZiAvLyBFSUdFTl9NUEwyX09OTFkKKworLyoqIFxpbmdyb3VwIE9yZGVyaW5nTWV0aG9kc19Nb2R1bGUKKyAgKiBcY2xhc3MgTmF0dXJhbE9yZGVyaW5nCisgICoKKyAgKiBGdW5jdG9yIGNvbXB1dGluZyB0aGUgbmF0dXJhbCBvcmRlcmluZyAoaWRlbnRpdHkpCisgICogCisgICogXG5vdGUgUmV0dXJucyBhbiBlbXB0eSBwZXJtdXRhdGlvbiBtYXRyaXgKKyAgKiBcdHBhcmFtICBTdG9yYWdlSW5kZXggVGhlIHR5cGUgb2YgaW5kaWNlcyBvZiB0aGUgbWF0cml4IAorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK2NsYXNzIE5hdHVyYWxPcmRlcmluZworeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljLCBTdG9yYWdlSW5kZXg+IFBlcm11dGF0aW9uVHlwZTsKKyAgICAKKyAgICAvKiogQ29tcHV0ZSB0aGUgcGVybXV0YXRpb24gdmVjdG9yIGZyb20gYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBNYXRyaXhUeXBlJiAvKm1hdCovLCBQZXJtdXRhdGlvblR5cGUmIHBlcm0pCisgICAgeworICAgICAgcGVybS5yZXNpemUoMCk7IAorICAgIH0KKyAgICAKK307CisKKy8qKiBcaW5ncm91cCBPcmRlcmluZ01ldGhvZHNfTW9kdWxlCisgICogXGNsYXNzIENPTEFNRE9yZGVyaW5nCisgICoKKyAgKiBcdHBhcmFtICBTdG9yYWdlSW5kZXggVGhlIHR5cGUgb2YgaW5kaWNlcyBvZiB0aGUgbWF0cml4IAorICAqIAorICAqIEZ1bmN0b3IgY29tcHV0aW5nIHRoZSBcZW0gY29sdW1uIFxlbSBhcHByb3hpbWF0ZSBcZW0gbWluaW11bSBcZW0gZGVncmVlIG9yZGVyaW5nIAorICAqIFRoZSBtYXRyaXggc2hvdWxkIGJlIGluIGNvbHVtbi1tYWpvciBhbmQgXGIgY29tcHJlc3NlZCBmb3JtYXQgKHNlZSBTcGFyc2VNYXRyaXg6Om1ha2VDb21wcmVzc2VkKCkpLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU3RvcmFnZUluZGV4PgorY2xhc3MgQ09MQU1ET3JkZXJpbmcKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgU3RvcmFnZUluZGV4PiBQZXJtdXRhdGlvblR5cGU7IAorICAgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCwgRHluYW1pYywgMT4gSW5kZXhWZWN0b3I7CisgICAgCisgICAgLyoqIENvbXB1dGUgdGhlIHBlcm11dGF0aW9uIHZlY3RvciBcYSBwZXJtIGZvcm0gdGhlIHNwYXJzZSBtYXRyaXggXGEgbWF0CisgICAgICAqIFx3YXJuaW5nIFRoZSBpbnB1dCBzcGFyc2UgbWF0cml4IFxhIG1hdCBtdXN0IGJlIGluIGNvbXByZXNzZWQgbW9kZSAoc2VlIFNwYXJzZU1hdHJpeDo6bWFrZUNvbXByZXNzZWQoKSkuCisgICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBQZXJtdXRhdGlvblR5cGUmIHBlcm0pCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1hdC5pc0NvbXByZXNzZWQoKSAmJiAiQ09MQU1ET3JkZXJpbmcgcmVxdWlyZXMgYSBzcGFyc2UgbWF0cml4IGluIGNvbXByZXNzZWQgbW9kZS4gQ2FsbCAubWFrZUNvbXByZXNzZWQoKSBiZWZvcmUgcGFzc2luZyBpdCB0byBDT0xBTURPcmRlcmluZyIpOworICAgICAgCisgICAgICBTdG9yYWdlSW5kZXggbSA9IFN0b3JhZ2VJbmRleChtYXQucm93cygpKTsKKyAgICAgIFN0b3JhZ2VJbmRleCBuID0gU3RvcmFnZUluZGV4KG1hdC5jb2xzKCkpOworICAgICAgU3RvcmFnZUluZGV4IG5ueiA9IFN0b3JhZ2VJbmRleChtYXQubm9uWmVyb3MoKSk7CisgICAgICAvLyBHZXQgdGhlIHJlY29tbWVuZGVkIHZhbHVlIG9mIEFsZW4gdG8gYmUgdXNlZCBieSBjb2xhbWQKKyAgICAgIFN0b3JhZ2VJbmRleCBBbGVuID0gaW50ZXJuYWw6OmNvbGFtZF9yZWNvbW1lbmRlZChubnosIG0sIG4pOyAKKyAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzCisgICAgICBkb3VibGUga25vYnMgW0NPTEFNRF9LTk9CU107IAorICAgICAgU3RvcmFnZUluZGV4IHN0YXRzIFtDT0xBTURfU1RBVFNdOworICAgICAgaW50ZXJuYWw6OmNvbGFtZF9zZXRfZGVmYXVsdHMoa25vYnMpOworICAgICAgCisgICAgICBJbmRleFZlY3RvciBwKG4rMSksIEEoQWxlbik7IAorICAgICAgZm9yKFN0b3JhZ2VJbmRleCBpPTA7IGkgPD0gbjsgaSsrKSAgIHAoaSkgPSBtYXQub3V0ZXJJbmRleFB0cigpW2ldOworICAgICAgZm9yKFN0b3JhZ2VJbmRleCBpPTA7IGkgPCBubno7IGkrKykgIEEoaSkgPSBtYXQuaW5uZXJJbmRleFB0cigpW2ldOworICAgICAgLy8gQ2FsbCBDb2xhbWQgcm91dGluZSB0byBjb21wdXRlIHRoZSBvcmRlcmluZyAKKyAgICAgIFN0b3JhZ2VJbmRleCBpbmZvID0gaW50ZXJuYWw6OmNvbGFtZChtLCBuLCBBbGVuLCBBLmRhdGEoKSwgcC5kYXRhKCksIGtub2JzLCBzdGF0cyk7IAorICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pOworICAgICAgZWlnZW5fYXNzZXJ0KCBpbmZvICYmICJDT0xBTUQgZmFpbGVkICIgKTsKKyAgICAgIAorICAgICAgcGVybS5yZXNpemUobik7CisgICAgICBmb3IgKFN0b3JhZ2VJbmRleCBpID0gMDsgaSA8IG47IGkrKykgcGVybS5pbmRpY2VzKCkocChpKSkgPSBpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9QYVN0aVhTdXBwb3J0L1BhU3RpWFN1cHBvcnQuaCBiL0VpZ2VuL3NyYy9QYVN0aVhTdXBwb3J0L1BhU3RpWFN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmViZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1BhU3RpWFN1cHBvcnQvUGFTdGlYU3VwcG9ydC5oCkBAIC0wLDAgKzEsNjc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFTVElYU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX1BBU1RJWFNVUFBPUlRfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworI2lmIGRlZmluZWQoRENPTVBMRVgpCisgICNkZWZpbmUgUEFTVElYX0NPTVBMRVggIENPTVBMRVgKKyAgI2RlZmluZSBQQVNUSVhfRENPTVBMRVggRENPTVBMRVgKKyNlbHNlCisgICNkZWZpbmUgUEFTVElYX0NPTVBMRVggIHN0ZDo6Y29tcGxleDxmbG9hdD4KKyAgI2RlZmluZSBQQVNUSVhfRENPTVBMRVggc3RkOjpjb21wbGV4PGRvdWJsZT4KKyNlbmRpZgorCisvKiogXGluZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUKKyAgKiBcYnJpZWYgSW50ZXJmYWNlIHRvIHRoZSBQYVN0aXggc29sdmVyCisgICogCisgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtcyBBLlggPSBCIHZpYSB0aGUgUGFTdGl4IGxpYnJhcnkuIAorICAqIFRoZSBtYXRyaXggY2FuIGJlIGVpdGhlciByZWFsIG9yIGNvbXBsZXgsIHN5bW1ldHJpYyBvciBub3QuCisgICoKKyAgKiBcc2EgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgYm9vbCBJc1N0clN5bSA9IGZhbHNlPiBjbGFzcyBQYXN0aXhMVTsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgT3B0aW9ucz4gY2xhc3MgUGFzdGl4TExUOwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPiBjbGFzcyBQYXN0aXhMRExUOworCituYW1lc3BhY2UgaW50ZXJuYWwKK3sKKyAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzdGl4PiBzdHJ1Y3QgcGFzdGl4X3RyYWl0czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4KKyAgc3RydWN0IHBhc3RpeF90cmFpdHM8IFBhc3RpeExVPF9NYXRyaXhUeXBlPiA+CisgIHsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM+CisgIHN0cnVjdCBwYXN0aXhfdHJhaXRzPCBQYXN0aXhMTFQ8X01hdHJpeFR5cGUsT3B0aW9ucz4gPgorICB7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPgorICBzdHJ1Y3QgcGFzdGl4X3RyYWl0czwgUGFzdGl4TERMVDxfTWF0cml4VHlwZSxPcHRpb25zPiA+CisgIHsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgfTsKKyAgCisgIHZvaWQgZWlnZW5fcGFzdGl4KHBhc3RpeF9kYXRhX3QgKipwYXN0aXhfZGF0YSwgaW50IHBhc3RpeF9jb21tLCBpbnQgbiwgaW50ICpwdHIsIGludCAqaWR4LCBmbG9hdCAqdmFscywgaW50ICpwZXJtLCBpbnQgKiBpbnZwLCBmbG9hdCAqeCwgaW50IG5icmhzLCBpbnQgKmlwYXJtLCBkb3VibGUgKmRwYXJtKQorICB7CisgICAgaWYgKG4gPT0gMCkgeyBwdHIgPSBOVUxMOyBpZHggPSBOVUxMOyB2YWxzID0gTlVMTDsgfQorICAgIGlmIChuYnJocyA9PSAwKSB7eCA9IE5VTEw7IG5icmhzPTE7fQorICAgIHNfcGFzdGl4KHBhc3RpeF9kYXRhLCBwYXN0aXhfY29tbSwgbiwgcHRyLCBpZHgsIHZhbHMsIHBlcm0sIGludnAsIHgsIG5icmhzLCBpcGFybSwgZHBhcm0pOyAKKyAgfQorICAKKyAgdm9pZCBlaWdlbl9wYXN0aXgocGFzdGl4X2RhdGFfdCAqKnBhc3RpeF9kYXRhLCBpbnQgcGFzdGl4X2NvbW0sIGludCBuLCBpbnQgKnB0ciwgaW50ICppZHgsIGRvdWJsZSAqdmFscywgaW50ICpwZXJtLCBpbnQgKiBpbnZwLCBkb3VibGUgKngsIGludCBuYnJocywgaW50ICppcGFybSwgZG91YmxlICpkcGFybSkKKyAgeworICAgIGlmIChuID09IDApIHsgcHRyID0gTlVMTDsgaWR4ID0gTlVMTDsgdmFscyA9IE5VTEw7IH0KKyAgICBpZiAobmJyaHMgPT0gMCkge3ggPSBOVUxMOyBuYnJocz0xO30KKyAgICBkX3Bhc3RpeChwYXN0aXhfZGF0YSwgcGFzdGl4X2NvbW0sIG4sIHB0ciwgaWR4LCB2YWxzLCBwZXJtLCBpbnZwLCB4LCBuYnJocywgaXBhcm0sIGRwYXJtKTsgCisgIH0KKyAgCisgIHZvaWQgZWlnZW5fcGFzdGl4KHBhc3RpeF9kYXRhX3QgKipwYXN0aXhfZGF0YSwgaW50IHBhc3RpeF9jb21tLCBpbnQgbiwgaW50ICpwdHIsIGludCAqaWR4LCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICp2YWxzLCBpbnQgKnBlcm0sIGludCAqIGludnAsIHN0ZDo6Y29tcGxleDxmbG9hdD4gKngsIGludCBuYnJocywgaW50ICppcGFybSwgZG91YmxlICpkcGFybSkKKyAgeworICAgIGlmIChuID09IDApIHsgcHRyID0gTlVMTDsgaWR4ID0gTlVMTDsgdmFscyA9IE5VTEw7IH0KKyAgICBpZiAobmJyaHMgPT0gMCkge3ggPSBOVUxMOyBuYnJocz0xO30KKyAgICBjX3Bhc3RpeChwYXN0aXhfZGF0YSwgcGFzdGl4X2NvbW0sIG4sIHB0ciwgaWR4LCByZWludGVycHJldF9jYXN0PFBBU1RJWF9DT01QTEVYKj4odmFscyksIHBlcm0sIGludnAsIHJlaW50ZXJwcmV0X2Nhc3Q8UEFTVElYX0NPTVBMRVgqPih4KSwgbmJyaHMsIGlwYXJtLCBkcGFybSk7IAorICB9CisgIAorICB2b2lkIGVpZ2VuX3Bhc3RpeChwYXN0aXhfZGF0YV90ICoqcGFzdGl4X2RhdGEsIGludCBwYXN0aXhfY29tbSwgaW50IG4sIGludCAqcHRyLCBpbnQgKmlkeCwgc3RkOjpjb21wbGV4PGRvdWJsZT4gKnZhbHMsIGludCAqcGVybSwgaW50ICogaW52cCwgc3RkOjpjb21wbGV4PGRvdWJsZT4gKngsIGludCBuYnJocywgaW50ICppcGFybSwgZG91YmxlICpkcGFybSkKKyAgeworICAgIGlmIChuID09IDApIHsgcHRyID0gTlVMTDsgaWR4ID0gTlVMTDsgdmFscyA9IE5VTEw7IH0KKyAgICBpZiAobmJyaHMgPT0gMCkge3ggPSBOVUxMOyBuYnJocz0xO30KKyAgICB6X3Bhc3RpeChwYXN0aXhfZGF0YSwgcGFzdGl4X2NvbW0sIG4sIHB0ciwgaWR4LCByZWludGVycHJldF9jYXN0PFBBU1RJWF9EQ09NUExFWCo+KHZhbHMpLCBwZXJtLCBpbnZwLCByZWludGVycHJldF9jYXN0PFBBU1RJWF9EQ09NUExFWCo+KHgpLCBuYnJocywgaXBhcm0sIGRwYXJtKTsgCisgIH0KKworICAvLyBDb252ZXJ0IHRoZSBtYXRyaXggIHRvIEZvcnRyYW4tc3R5bGUgTnVtYmVyaW5nCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICB2b2lkIGNfdG9fZm9ydHJhbl9udW1iZXJpbmcgKE1hdHJpeFR5cGUmIG1hdCkKKyAgeworICAgIGlmICggIShtYXQub3V0ZXJJbmRleFB0cigpWzBdKSApIAorICAgIHsgCisgICAgICBpbnQgaTsKKyAgICAgIGZvcihpID0gMDsgaSA8PSBtYXQucm93cygpOyArK2kpCisgICAgICAgICsrbWF0Lm91dGVySW5kZXhQdHIoKVtpXTsKKyAgICAgIGZvcihpID0gMDsgaSA8IG1hdC5ub25aZXJvcygpOyArK2kpCisgICAgICAgICsrbWF0LmlubmVySW5kZXhQdHIoKVtpXTsKKyAgICB9CisgIH0KKyAgCisgIC8vIENvbnZlcnQgdG8gQy1zdHlsZSBOdW1iZXJpbmcKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHZvaWQgZm9ydHJhbl90b19jX251bWJlcmluZyAoTWF0cml4VHlwZSYgbWF0KQorICB7CisgICAgLy8gQ2hlY2sgdGhlIE51bWJlcmluZworICAgIGlmICggbWF0Lm91dGVySW5kZXhQdHIoKVswXSA9PSAxICkgCisgICAgeyAvLyBDb252ZXJ0IHRvIEMtc3R5bGUgbnVtYmVyaW5nCisgICAgICBpbnQgaTsKKyAgICAgIGZvcihpID0gMDsgaSA8PSBtYXQucm93cygpOyArK2kpCisgICAgICAgIC0tbWF0Lm91dGVySW5kZXhQdHIoKVtpXTsKKyAgICAgIGZvcihpID0gMDsgaSA8IG1hdC5ub25aZXJvcygpOyArK2kpCisgICAgICAgIC0tbWF0LmlubmVySW5kZXhQdHIoKVtpXTsKKyAgICB9CisgIH0KK30KKworLy8gVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyB0byBpbnRlcmZhY2Ugd2l0aCBQYVN0aVggZnVuY3Rpb25zLiAKKy8vIFVzZXJzIHNob3VsZCBub3QgdXNlZCB0aGlzIGNsYXNzIGRpcmVjdGx5LiAKK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgorY2xhc3MgUGFzdGl4QmFzZSA6IHB1YmxpYyBTcGFyc2VTb2x2ZXJCYXNlPERlcml2ZWQ+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKyAgcHVibGljOgorICAgIHVzaW5nIEJhc2U6Ol9zb2x2ZV9pbXBsOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhc3RpeF90cmFpdHM8RGVyaXZlZD46Ok1hdHJpeFR5cGUgX01hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3I+IENvbFNwTWF0cml4OworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgUGFzdGl4QmFzZSgpIDogbV9pbml0aXNPayhmYWxzZSksIG1fYW5hbHlzaXNJc09rKGZhbHNlKSwgbV9mYWN0b3JpemF0aW9uSXNPayhmYWxzZSksIG1fcGFzdGl4ZGF0YSgwKSwgbV9zaXplKDApCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKyAgICAKKyAgICB+UGFzdGl4QmFzZSgpIAorICAgIHsKKyAgICAgIGNsZWFuKCk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIGJvb2wgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZ4KSBjb25zdDsKKyAgICAKKyAgICAvKiogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZWdlciB2ZWN0b3IgSVBBUk0gb2YgUGFTdGlYIHBhcmFtZXRlcnMKKyAgICAgICogdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuIAorICAgICAgKiBUaGUgc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbnQgcGhhc2VzIG9mIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlIGFyZSBzYXZlZCBoZXJlIGFzIHdlbGwKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgQXJyYXk8U3RvcmFnZUluZGV4LElQQVJNX1NJWkUsMT4mIGlwYXJtKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9pcGFybTsgCisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBwYXJ0aWN1bGFyIGluZGV4IHBhcmFtZXRlciBvZiB0aGUgSVBBUk0gdmVjdG9yIAorICAgICAqIFxzYSBpcGFybSgpCisgICAgICovCisgICAgCisgICAgaW50JiBpcGFybShpbnQgaWR4cGFyYW0pCisgICAgeworICAgICAgcmV0dXJuIG1faXBhcm0oaWR4cGFyYW0pOworICAgIH0KKyAgICAKKyAgICAgLyoqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGRvdWJsZSB2ZWN0b3IgRFBBUk0gb2YgUGFTdGlYIHBhcmFtZXRlcnMgCisgICAgICAqIFRoZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIGRpZmZlcmVudCBwaGFzZXMgb2YgZmFjdG9yaXphdGlvbiBhbmQgc29sdmUgYXJlIHNhdmVkIGhlcmUgYXMgd2VsbAorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKSBmYWN0b3JpemUoKQorICAgICAgKi8KKyAgICBBcnJheTxkb3VibGUsRFBBUk1fU0laRSwxPiYgZHBhcm0oKQorICAgIHsKKyAgICAgIHJldHVybiBtX2RwYXJtOyAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqIFJldHVybiBhIHJlZmVyZW5jZSB0byBhIHBhcnRpY3VsYXIgaW5kZXggcGFyYW1ldGVyIG9mIHRoZSBEUEFSTSB2ZWN0b3IgCisgICAgICogXHNhIGRwYXJtKCkKKyAgICAgKi8KKyAgICBkb3VibGUmIGRwYXJtKGludCBpZHhwYXJhbSkKKyAgICB7CisgICAgICByZXR1cm4gbV9kcGFybShpZHhwYXJhbSk7CisgICAgfQorICAgIAorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICAKKyAgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIFBhU3RpWCByZXBvcnRzIGEgcHJvYmxlbQorICAgICAgKiAgICAgICAgICBcYyBJbnZhbGlkSW5wdXQgaWYgdGhlIGlucHV0IG1hdHJpeCBpcyBpbnZhbGlkCisgICAgICAqCisgICAgICAqIFxzYSBpcGFybSgpICAgICAgICAgIAorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgICAKKyAgcHJvdGVjdGVkOgorCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgUGFzdGl4IGRhdGEgc3RydWN0dXJlLCBjaGVjayB0aGUgbWF0cml4CisgICAgdm9pZCBpbml0KCk7IAorICAgIAorICAgIC8vIENvbXB1dGUgdGhlIG9yZGVyaW5nIGFuZCB0aGUgc3ltYm9saWMgZmFjdG9yaXphdGlvbgorICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oQ29sU3BNYXRyaXgmIG1hdCk7CisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24KKyAgICB2b2lkIGZhY3Rvcml6ZShDb2xTcE1hdHJpeCYgbWF0KTsKKyAgICAKKyAgICAvLyBGcmVlIGFsbCB0aGUgZGF0YSBhbGxvY2F0ZWQgYnkgUGFzdGl4CisgICAgdm9pZCBjbGVhbigpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faW5pdGlzT2sgJiYgIlRoZSBQYXN0aXggc3RydWN0dXJlIHNob3VsZCBiZSBhbGxvY2F0ZWQgZmlyc3QiKTsgCisgICAgICBtX2lwYXJtKElQQVJNX1NUQVJUX1RBU0spID0gQVBJX1RBU0tfQ0xFQU47CisgICAgICBtX2lwYXJtKElQQVJNX0VORF9UQVNLKSA9IEFQSV9UQVNLX0NMRUFOOworICAgICAgaW50ZXJuYWw6OmVpZ2VuX3Bhc3RpeCgmbV9wYXN0aXhkYXRhLCBNUElfQ09NTV9XT1JMRCwgMCwgMCwgMCwgKFNjYWxhciopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wZXJtLmRhdGEoKSwgbV9pbnZwLmRhdGEoKSwgMCwgMCwgbV9pcGFybS5kYXRhKCksIG1fZHBhcm0uZGF0YSgpKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBjb21wdXRlKENvbFNwTWF0cml4JiBtYXQpOworICAgIAorICAgIGludCBtX2luaXRpc09rOyAKKyAgICBpbnQgbV9hbmFseXNpc0lzT2s7CisgICAgaW50IG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOyAKKyAgICBtdXRhYmxlIHBhc3RpeF9kYXRhX3QgKm1fcGFzdGl4ZGF0YTsgLy8gRGF0YSBzdHJ1Y3R1cmUgZm9yIHBhc3RpeAorICAgIG11dGFibGUgaW50IG1fY29tbTsgLy8gVGhlIE1QSSBjb21tdW5pY2F0b3IgaWRlbnRpZmllcgorICAgIG11dGFibGUgQXJyYXk8aW50LElQQVJNX1NJWkUsMT4gbV9pcGFybTsgLy8gaW50ZWdlciB2ZWN0b3IgZm9yIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICAgbXV0YWJsZSBBcnJheTxkb3VibGUsRFBBUk1fU0laRSwxPiBtX2RwYXJtOyAvLyBTY2FsYXIgdmVjdG9yIGZvciB0aGUgaW5wdXQgcGFyYW1ldGVycworICAgIG11dGFibGUgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IG1fcGVybTsgIC8vIFBlcm11dGF0aW9uIHZlY3RvcgorICAgIG11dGFibGUgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IG1faW52cDsgIC8vIEludmVyc2UgcGVybXV0YXRpb24gdmVjdG9yCisgICAgbXV0YWJsZSBpbnQgbV9zaXplOyAvLyBTaXplIG9mIHRoZSBtYXRyaXggCit9OyAKKworIC8qKiBJbml0aWFsaXplIHRoZSBQYVN0aVggZGF0YSBzdHJ1Y3R1cmUuIAorICAgKkEgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGZpbGxzIGlwYXJtIGFuZCBkcGFybSB3aXRoIHRoZSBkZWZhdWx0IFBhU3RpWCBwYXJhbWV0ZXJzCisgICAqIFxzYSBpcGFybSgpIGRwYXJtKCkKKyAgICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3ZvaWQgUGFzdGl4QmFzZTxEZXJpdmVkPjo6aW5pdCgpCit7CisgIG1fc2l6ZSA9IDA7IAorICBtX2lwYXJtLnNldFplcm8oSVBBUk1fU0laRSk7CisgIG1fZHBhcm0uc2V0WmVybyhEUEFSTV9TSVpFKTsKKyAgCisgIG1faXBhcm0oSVBBUk1fTU9ESUZZX1BBUkFNRVRFUikgPSBBUElfTk87CisgIHBhc3RpeCgmbV9wYXN0aXhkYXRhLCBNUElfQ09NTV9XT1JMRCwKKyAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAwLCAwLCAwLCAxLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAKKyAgbV9pcGFybVtJUEFSTV9NQVRSSVhfVkVSSUZJQ0FUSU9OXSA9IEFQSV9OTzsKKyAgbV9pcGFybVtJUEFSTV9WRVJCT1NFXSAgICAgICAgICAgICA9IEFQSV9WRVJCT1NFX05PVDsKKyAgbV9pcGFybVtJUEFSTV9PUkRFUklOR10gICAgICAgICAgICA9IEFQSV9PUkRFUl9TQ09UQ0g7CisgIG1faXBhcm1bSVBBUk1fSU5DT01QTEVURV0gICAgICAgICAgPSBBUElfTk87CisgIG1faXBhcm1bSVBBUk1fT09DX0xJTUlUXSAgICAgICAgICAgPSAyMDAwOworICBtX2lwYXJtW0lQQVJNX1JIU19NQUtJTkddICAgICAgICAgID0gQVBJX1JIU19COworICBtX2lwYXJtKElQQVJNX01BVFJJWF9WRVJJRklDQVRJT04pID0gQVBJX05POworICAKKyAgbV9pcGFybShJUEFSTV9TVEFSVF9UQVNLKSA9IEFQSV9UQVNLX0lOSVQ7CisgIG1faXBhcm0oSVBBUk1fRU5EX1RBU0spID0gQVBJX1RBU0tfSU5JVDsKKyAgaW50ZXJuYWw6OmVpZ2VuX3Bhc3RpeCgmbV9wYXN0aXhkYXRhLCBNUElfQ09NTV9XT1JMRCwgMCwgMCwgMCwgKFNjYWxhciopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAKKyAgLy8gQ2hlY2sgdGhlIHJldHVybmVkIGVycm9yCisgIGlmKG1faXBhcm0oSVBBUk1fRVJST1JfTlVNQkVSKSkgeworICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICBtX2luaXRpc09rID0gZmFsc2U7CisgIH0KKyAgZWxzZSB7IAorICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgbV9pbml0aXNPayA9IHRydWU7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+Cit2b2lkIFBhc3RpeEJhc2U8RGVyaXZlZD46OmNvbXB1dGUoQ29sU3BNYXRyaXgmIG1hdCkKK3sKKyAgZWlnZW5fYXNzZXJ0KG1hdC5yb3dzKCkgPT0gbWF0LmNvbHMoKSAmJiAiVGhlIGlucHV0IG1hdHJpeCBzaG91bGQgYmUgc3F1YXJlZCIpOworICAKKyAgYW5hbHl6ZVBhdHRlcm4obWF0KTsgIAorICBmYWN0b3JpemUobWF0KTsKKyAgCisgIG1faXBhcm0oSVBBUk1fTUFUUklYX1ZFUklGSUNBVElPTikgPSBBUElfTk87Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+Cit2b2lkIFBhc3RpeEJhc2U8RGVyaXZlZD46OmFuYWx5emVQYXR0ZXJuKENvbFNwTWF0cml4JiBtYXQpCit7ICAgICAgICAgICAgICAgICAgICAgICAgIAorICBlaWdlbl9hc3NlcnQobV9pbml0aXNPayAmJiAiVGhlIGluaXRpYWxpemF0aW9uIG9mIFBhU1RpWCBmYWlsZWQiKTsKKyAgCisgIC8vIGNsZWFuIHByZXZpb3VzIGNhbGxzCisgIGlmKG1fc2l6ZT4wKQorICAgIGNsZWFuKCk7CisgIAorICBtX3NpemUgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxpbnQ+KG1hdC5yb3dzKCkpOworICBtX3Blcm0ucmVzaXplKG1fc2l6ZSk7CisgIG1faW52cC5yZXNpemUobV9zaXplKTsKKyAgCisgIG1faXBhcm0oSVBBUk1fU1RBUlRfVEFTSykgPSBBUElfVEFTS19PUkRFUklORzsKKyAgbV9pcGFybShJUEFSTV9FTkRfVEFTSykgPSBBUElfVEFTS19BTkFMWVNFOworICBpbnRlcm5hbDo6ZWlnZW5fcGFzdGl4KCZtX3Bhc3RpeGRhdGEsIE1QSV9DT01NX1dPUkxELCBtX3NpemUsIG1hdC5vdXRlckluZGV4UHRyKCksIG1hdC5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICBtYXQudmFsdWVQdHIoKSwgbV9wZXJtLmRhdGEoKSwgbV9pbnZwLmRhdGEoKSwgMCwgMCwgbV9pcGFybS5kYXRhKCksIG1fZHBhcm0uZGF0YSgpKTsKKyAgCisgIC8vIENoZWNrIHRoZSByZXR1cm5lZCBlcnJvcgorICBpZihtX2lwYXJtKElQQVJNX0VSUk9SX05VTUJFUikpCisgIHsKKyAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICBtX2FuYWx5c2lzSXNPayA9IGZhbHNlOworICB9CisgIGVsc2UKKyAgeyAKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3ZvaWQgUGFzdGl4QmFzZTxEZXJpdmVkPjo6ZmFjdG9yaXplKENvbFNwTWF0cml4JiBtYXQpCit7CisvLyAgIGlmKCZtX2NweU1hdCAhPSAmbWF0KSBtX2NweU1hdCA9IG1hdDsKKyAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc09rICYmICJUaGUgYW5hbHlzaXMgcGhhc2Ugc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZhY3Rvcml6YXRpb24gcGhhc2UiKTsKKyAgbV9pcGFybShJUEFSTV9TVEFSVF9UQVNLKSA9IEFQSV9UQVNLX05VTUZBQ1Q7CisgIG1faXBhcm0oSVBBUk1fRU5EX1RBU0spID0gQVBJX1RBU0tfTlVNRkFDVDsKKyAgbV9zaXplID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8aW50PihtYXQucm93cygpKTsKKyAgCisgIGludGVybmFsOjplaWdlbl9wYXN0aXgoJm1fcGFzdGl4ZGF0YSwgTVBJX0NPTU1fV09STEQsIG1fc2l6ZSwgbWF0Lm91dGVySW5kZXhQdHIoKSwgbWF0LmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgIG1hdC52YWx1ZVB0cigpLCBtX3Blcm0uZGF0YSgpLCBtX2ludnAuZGF0YSgpLCAwLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAKKyAgLy8gQ2hlY2sgdGhlIHJldHVybmVkIGVycm9yCisgIGlmKG1faXBhcm0oSVBBUk1fRVJST1JfTlVNQkVSKSkKKyAgeworICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIH0KK30KKworLyogU29sdmUgdGhlIHN5c3RlbSAqLwordGVtcGxhdGU8dHlwZW5hbWUgQmFzZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorYm9vbCBQYXN0aXhCYXNlPEJhc2U+Ojpfc29sdmVfaW1wbChjb25zdCBNYXRyaXhCYXNlPFJocz4gJmIsIE1hdHJpeEJhc2U8RGVzdD4gJngpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRoZSBtYXRyaXggc2hvdWxkIGJlIGZhY3Rvcml6ZWQgZmlyc3QiKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wLAorICAgICAgICAgICAgICAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfQ09MVU1OX01BSk9SX01BVFJJQ0VTKTsKKyAgaW50IHJocyA9IDE7CisgIAorICB4ID0gYjsgLyogb24gcmV0dXJuLCB4IGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb21wdXRlZCBzb2x1dGlvbiAqLworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmNvbHMoKTsgaSsrKXsKKyAgICBtX2lwYXJtW0lQQVJNX1NUQVJUX1RBU0tdICAgICAgICAgID0gQVBJX1RBU0tfU09MVkU7CisgICAgbV9pcGFybVtJUEFSTV9FTkRfVEFTS10gICAgICAgICAgICA9IEFQSV9UQVNLX1JFRklORTsKKyAgCisgICAgaW50ZXJuYWw6OmVpZ2VuX3Bhc3RpeCgmbV9wYXN0aXhkYXRhLCBNUElfQ09NTV9XT1JMRCwgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8aW50Pih4LnJvd3MoKSksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCBtX2ludnAuZGF0YSgpLCAmeCgwLCBpKSwgcmhzLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICB9CisgIAorICAvLyBDaGVjayB0aGUgcmV0dXJuZWQgZXJyb3IKKyAgbV9pbmZvID0gbV9pcGFybShJUEFSTV9FUlJPUl9OVU1CRVIpPT0wID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlOworICAKKyAgcmV0dXJuIG1faXBhcm0oSVBBUk1fRVJST1JfTlVNQkVSKT09MDsKK30KKworLyoqIFxpbmdyb3VwIFBhU3RpWFN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFBhc3RpeExVCisgICogXGJyaWVmIFNwYXJzZSBkaXJlY3QgTFUgc29sdmVyIGJhc2VkIG9uIFBhU3RpWCBsaWJyYXJ5CisgICogCisgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtcyBBLlggPSBCIHdpdGggYSBzdXBlcm5vZGFsIExVIAorICAqIGZhY3Rvcml6YXRpb24gaW4gdGhlIFBhU3RpWCBsaWJyYXJ5LiBUaGUgbWF0cml4IEEgc2hvdWxkIGJlIHNxdWFyZWQgYW5kIG5vbnNpbmd1bGFyCisgICogUGFTdGlYIHJlcXVpcmVzIHRoYXQgdGhlIG1hdHJpeCBBIGhhcyBhIHN5bW1ldHJpYyBzdHJ1Y3R1cmFsIHBhdHRlcm4uIAorICAqIFRoaXMgaW50ZXJmYWNlIGNhbiBzeW1tZXRyaXplIHRoZSBpbnB1dCBtYXRyaXggb3RoZXJ3aXNlLiAKKyAgKiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcyBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqIAorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBJc1N0clN5bSBJbmRpY2F0ZXMgaWYgdGhlIGlucHV0IG1hdHJpeCBoYXMgYSBzeW1tZXRyaWMgcGF0dGVybiwgZGVmYXVsdCBpcyBmYWxzZQorICAqIE5PVEUgOiBOb3RlIHRoYXQgaWYgdGhlIGFuYWx5c2lzIGFuZCBmYWN0b3JpemF0aW9uIHBoYXNlIGFyZSBjYWxsZWQgc2VwYXJhdGVseSwgCisgICogdGhlIGlucHV0IG1hdHJpeCB3aWxsIGJlIHN5bW1ldHJpemVkIGF0IGVhY2ggY2FsbCwgaGVuY2UgaXQgaXMgYWR2aXNlZCB0byAKKyAgKiBzeW1tZXRyaXplIHRoZSBtYXRyaXggaW4gYSBlbmQtdXNlciBwcm9ncmFtIGFuZCBzZXQgXHAgSXNTdHJTeW0gdG8gdHJ1ZQorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNwYXJzZUxVCisgICogCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgYm9vbCBJc1N0clN5bT4KK2NsYXNzIFBhc3RpeExVIDogcHVibGljIFBhc3RpeEJhc2U8IFBhc3RpeExVPF9NYXRyaXhUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBQYXN0aXhCYXNlPFBhc3RpeExVPE1hdHJpeFR5cGU+ID4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbFNwTWF0cml4IENvbFNwTWF0cml4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICAKKyAgcHVibGljOgorICAgIFBhc3RpeExVKCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorICAgIAorICAgIGV4cGxpY2l0IFBhc3RpeExVKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk6QmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAvKiogQ29tcHV0ZSB0aGUgTFUgc3VwZXJub2RhbCBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeC4gCisgICAgICAqIGlwYXJtIGFuZCBkcGFybSBjYW4gYmUgdXNlZCB0byB0dW5lIHRoZSBQYVN0aVggcGFyYW1ldGVycy4gCisgICAgICAqIHNlZSB0aGUgUGFTdGlYIHVzZXIncyBtYW51YWwKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBjb21wdXRlIChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgbV9zdHJ1Y3R1cmVJc1VwdG9kYXRlID0gZmFsc2U7CisgICAgICBDb2xTcE1hdHJpeCB0ZW1wOworICAgICAgZ3JhYk1hdHJpeChtYXRyaXgsIHRlbXApOworICAgICAgQmFzZTo6Y29tcHV0ZSh0ZW1wKTsKKyAgICB9CisgICAgLyoqIENvbXB1dGUgdGhlIExVIHN5bWJvbGljIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4IHVzaW5nIGl0cyBzcGFyc2l0eSBwYXR0ZXJuLiAKKyAgICAgICogU2V2ZXJhbCBvcmRlcmluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGF0IHRoaXMgc3RlcC4gU2VlIHRoZSBQYVN0aVggdXNlcidzIG1hbnVhbC4gCisgICAgICAqIFRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgd2l0aCBzdWNjZXNzaXZlIG1hdHJpY2VzIGhhdmluZyB0aGUgc2FtZSBwYXR0ZXJuIGFzIFxwIG1hdHJpeAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgbV9zdHJ1Y3R1cmVJc1VwdG9kYXRlID0gZmFsc2U7CisgICAgICBDb2xTcE1hdHJpeCB0ZW1wOworICAgICAgZ3JhYk1hdHJpeChtYXRyaXgsIHRlbXApOworICAgICAgQmFzZTo6YW5hbHl6ZVBhdHRlcm4odGVtcCk7CisgICAgfQorCisgICAgLyoqIENvbXB1dGUgdGhlIExVIHN1cGVybm9kYWwgZmFjdG9yaXphdGlvbiBvZiBccCBtYXRyaXgKKyAgICAgICogV0FSTklORyBUaGUgbWF0cml4IFxwIG1hdHJpeCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmFsIHBhdHRlcm4gCisgICAgICAqIGFzIHRoZSBzYW1lIHVzZWQgaW4gdGhlIGFuYWx5c2lzIHBoYXNlLgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgKi8gCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjpmYWN0b3JpemUodGVtcCk7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX3N0cnVjdHVyZUlzVXB0b2RhdGUgPSBmYWxzZTsKKyAgICAgIG1faXBhcm0oSVBBUk1fU1lNKSA9IEFQSV9TWU1fTk87CisgICAgICBtX2lwYXJtKElQQVJNX0ZBQ1RPUklaQVRJT04pID0gQVBJX0ZBQ1RfTFU7CisgICAgfQorICAgIAorICAgIHZvaWQgZ3JhYk1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIENvbFNwTWF0cml4JiBvdXQpCisgICAgeworICAgICAgaWYoSXNTdHJTeW0pCisgICAgICAgIG91dCA9IG1hdHJpeDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYoIW1fc3RydWN0dXJlSXNVcHRvZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdHJhbnNwb3NlZCBzdHJ1Y3R1cmUKKyAgICAgICAgICBtX3RyYW5zcG9zZWRTdHJ1Y3R1cmUgPSBtYXRyaXgudHJhbnNwb3NlKCk7CisgICAgICAgICAgCisgICAgICAgICAgLy8gU2V0IHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4IHRvIHplcm8gCisgICAgICAgICAgZm9yIChJbmRleCBqPTA7IGo8bV90cmFuc3Bvc2VkU3RydWN0dXJlLm91dGVyU2l6ZSgpOyArK2opIAorICAgICAgICAgICAgZm9yKHR5cGVuYW1lIENvbFNwTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KG1fdHJhbnNwb3NlZFN0cnVjdHVyZSwgaik7IGl0OyArK2l0KQorICAgICAgICAgICAgICBpdC52YWx1ZVJlZigpID0gMC4wOworCisgICAgICAgICAgbV9zdHJ1Y3R1cmVJc1VwdG9kYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0ID0gbV90cmFuc3Bvc2VkU3RydWN0dXJlICsgbWF0cml4OworICAgICAgfQorICAgICAgaW50ZXJuYWw6OmNfdG9fZm9ydHJhbl9udW1iZXJpbmcob3V0KTsKKyAgICB9CisgICAgCisgICAgdXNpbmcgQmFzZTo6bV9pcGFybTsKKyAgICB1c2luZyBCYXNlOjptX2RwYXJtOworICAgIAorICAgIENvbFNwTWF0cml4IG1fdHJhbnNwb3NlZFN0cnVjdHVyZTsKKyAgICBib29sIG1fc3RydWN0dXJlSXNVcHRvZGF0ZTsKK307CisKKy8qKiBcaW5ncm91cCBQYVN0aVhTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBQYXN0aXhMTFQKKyAgKiBcYnJpZWYgQSBzcGFyc2UgZGlyZWN0IHN1cGVybm9kYWwgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIHRoZSBQYVN0aVggbGlicmFyeQorICAqIAorICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzb2x2ZSB0aGUgbGluZWFyIHN5c3RlbXMgQS5YID0gQiB2aWEgYSBMTF5UIHN1cGVybm9kYWwgQ2hvbGVza3kgZmFjdG9yaXphdGlvbgorICAqIGF2YWlsYWJsZSBpbiB0aGUgUGFTdGlYIGxpYnJhcnkuIFRoZSBtYXRyaXggQSBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCBwb3NpdGl2ZSBkZWZpbml0ZQorICAqIFdBUk5JTkcgU2VsZmFkam9pbnQgY29tcGxleCBtYXRyaWNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFBhU3RpWAorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UKKyAgKiAKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBVcExvIFRoZSBwYXJ0IG9mIHRoZSBtYXRyaXggdG8gdXNlIDogTG93ZXIgb3IgVXBwZXIuIFRoZSBkZWZhdWx0IGlzIExvd2VyIGFzIHJlcXVpcmVkIGJ5IFBhU3RpWAorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNpbXBsaWNpYWxMTFQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+CitjbGFzcyBQYXN0aXhMTFQgOiBwdWJsaWMgUGFzdGl4QmFzZTwgUGFzdGl4TExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgUGFzdGl4QmFzZTxQYXN0aXhMTFQ8TWF0cml4VHlwZSwgX1VwTG8+ID4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbFNwTWF0cml4IENvbFNwTWF0cml4OworICAgIAorICBwdWJsaWM6CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIFBhc3RpeExMVCgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKyAgICAKKyAgICBleHBsaWNpdCBQYXN0aXhMTFQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTpCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgLyoqIENvbXB1dGUgdGhlIEwgZmFjdG9yIG9mIHRoZSBMTF5UIHN1cGVybm9kYWwgZmFjdG9yaXphdGlvbiBvZiBccCBtYXRyaXggCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgY29tcHV0ZSAoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjpjb21wdXRlKHRlbXApOworICAgIH0KKworICAgICAvKiogQ29tcHV0ZSB0aGUgTExeVCBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCB1c2luZyBpdHMgc3BhcnNpdHkgcGF0dGVybgorICAgICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHdpdGggc3VjY2Vzc2l2ZSBtYXRyaWNlcyBoYXZpbmcgdGhlIHNhbWUgcGF0dGVybiBhcyBccCBtYXRyaXgKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybih0ZW1wKTsKKyAgICB9CisgICAgICAvKiogQ29tcHV0ZSB0aGUgTExeVCBzdXBlcm5vZGFsIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCAKKyAgICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBDb2xTcE1hdHJpeCB0ZW1wOworICAgICAgZ3JhYk1hdHJpeChtYXRyaXgsIHRlbXApOworICAgICAgQmFzZTo6ZmFjdG9yaXplKHRlbXApOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHVzaW5nIEJhc2U6Om1faXBhcm07CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX2lwYXJtKElQQVJNX1NZTSkgPSBBUElfU1lNX1lFUzsKKyAgICAgIG1faXBhcm0oSVBBUk1fRkFDVE9SSVpBVElPTikgPSBBUElfRkFDVF9MTFQ7CisgICAgfQorICAgIAorICAgIHZvaWQgZ3JhYk1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIENvbFNwTWF0cml4JiBvdXQpCisgICAgeworICAgICAgb3V0LnJlc2l6ZShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKTsKKyAgICAgIC8vIFBhc3RpeCBzdXBwb3J0cyBvbmx5IGxvd2VyLCBjb2x1bW4tbWFqb3IgbWF0cmljZXMgCisgICAgICBvdXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0cml4LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpOworICAgICAgaW50ZXJuYWw6OmNfdG9fZm9ydHJhbl9udW1iZXJpbmcob3V0KTsKKyAgICB9Cit9OworCisvKiogXGluZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgUGFzdGl4TERMVAorICAqIFxicmllZiBBIHNwYXJzZSBkaXJlY3Qgc3VwZXJub2RhbCBDaG9sZXNreSAoTExUKSBmYWN0b3JpemF0aW9uIGFuZCBzb2x2ZXIgYmFzZWQgb24gdGhlIFBhU3RpWCBsaWJyYXJ5CisgICogCisgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtcyBBLlggPSBCIHZpYSBhIExETF5UIHN1cGVybm9kYWwgQ2hvbGVza3kgZmFjdG9yaXphdGlvbgorICAqIGF2YWlsYWJsZSBpbiB0aGUgUGFTdGlYIGxpYnJhcnkuIFRoZSBtYXRyaXggQSBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCBwb3NpdGl2ZSBkZWZpbml0ZQorICAqIFdBUk5JTkcgU2VsZmFkam9pbnQgY29tcGxleCBtYXRyaWNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFBhU3RpWAorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UKKyAgKiAKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBVcExvIFRoZSBwYXJ0IG9mIHRoZSBtYXRyaXggdG8gdXNlIDogTG93ZXIgb3IgVXBwZXIuIFRoZSBkZWZhdWx0IGlzIExvd2VyIGFzIHJlcXVpcmVkIGJ5IFBhU3RpWAorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNpbXBsaWNpYWxMRExUCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPgorY2xhc3MgUGFzdGl4TERMVCA6IHB1YmxpYyBQYXN0aXhCYXNlPCBQYXN0aXhMRExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgUGFzdGl4QmFzZTxQYXN0aXhMRExUPE1hdHJpeFR5cGUsIF9VcExvPiA+IEJhc2U7IAorICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29sU3BNYXRyaXggQ29sU3BNYXRyaXg7CisgICAgCisgIHB1YmxpYzoKKyAgICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgICAgUGFzdGl4TERMVCgpOkJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICB9CisgICAgCisgICAgZXhwbGljaXQgUGFzdGl4TERMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOkJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZSB0aGUgTCBhbmQgRCBmYWN0b3JzIG9mIHRoZSBMRExeVCBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCAKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBjb21wdXRlIChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgQ29sU3BNYXRyaXggdGVtcDsKKyAgICAgIGdyYWJNYXRyaXgobWF0cml4LCB0ZW1wKTsKKyAgICAgIEJhc2U6OmNvbXB1dGUodGVtcCk7CisgICAgfQorCisgICAgLyoqIENvbXB1dGUgdGhlIExETF5UIHN5bWJvbGljIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4IHVzaW5nIGl0cyBzcGFyc2l0eSBwYXR0ZXJuCisgICAgICAqIFRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgd2l0aCBzdWNjZXNzaXZlIG1hdHJpY2VzIGhhdmluZyB0aGUgc2FtZSBwYXR0ZXJuIGFzIFxwIG1hdHJpeAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeyAKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybih0ZW1wKTsKKyAgICB9CisgICAgLyoqIENvbXB1dGUgdGhlIExETF5UIHN1cGVybm9kYWwgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4IAorICAgICAgKiAKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjpmYWN0b3JpemUodGVtcCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB1c2luZyBCYXNlOjptX2lwYXJtOworICAgIAorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9pcGFybShJUEFSTV9TWU0pID0gQVBJX1NZTV9ZRVM7CisgICAgICBtX2lwYXJtKElQQVJNX0ZBQ1RPUklaQVRJT04pID0gQVBJX0ZBQ1RfTERMVDsKKyAgICB9CisgICAgCisgICAgdm9pZCBncmFiTWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgQ29sU3BNYXRyaXgmIG91dCkKKyAgICB7CisgICAgICAvLyBQYXN0aXggc3VwcG9ydHMgb25seSBsb3dlciwgY29sdW1uLW1ham9yIG1hdHJpY2VzIAorICAgICAgb3V0LnJlc2l6ZShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKTsKKyAgICAgIG91dC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCk7CisgICAgICBpbnRlcm5hbDo6Y190b19mb3J0cmFuX251bWJlcmluZyhvdXQpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9QYXJkaXNvU3VwcG9ydC5oIGIvRWlnZW4vc3JjL1BhcmRpc29TdXBwb3J0L1BhcmRpc29TdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYzM5NwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9QYXJkaXNvU3VwcG9ydC5oCkBAIC0wLDAgKzEsNTQzIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMIFBBUkRJU08KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9QQVJESVNPU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX1BBUkRJU09TVVBQT1JUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBQYXJkaXNvTFU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM9VXBwZXI+IGNsYXNzIFBhcmRpc29MTFQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM9VXBwZXI+IGNsYXNzIFBhcmRpc29MRExUOworCituYW1lc3BhY2UgaW50ZXJuYWwKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorICBzdHJ1Y3QgcGFyZGlzb19ydW5fc2VsZWN0b3IKKyAgeworICAgIHN0YXRpYyBJbmRleFR5cGUgcnVuKCBfTUtMX0RTU19IQU5ETEVfdCBwdCwgSW5kZXhUeXBlIG1heGZjdCwgSW5kZXhUeXBlIG1udW0sIEluZGV4VHlwZSB0eXBlLCBJbmRleFR5cGUgcGhhc2UsIEluZGV4VHlwZSBuLCB2b2lkICphLAorICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSAqaWEsIEluZGV4VHlwZSAqamEsIEluZGV4VHlwZSAqcGVybSwgSW5kZXhUeXBlIG5yaHMsIEluZGV4VHlwZSAqaXBhcm0sIEluZGV4VHlwZSBtc2dsdmwsIHZvaWQgKmIsIHZvaWQgKngpCisgICAgeworICAgICAgSW5kZXhUeXBlIGVycm9yID0gMDsKKyAgICAgIDo6cGFyZGlzbyhwdCwgJm1heGZjdCwgJm1udW0sICZ0eXBlLCAmcGhhc2UsICZuLCBhLCBpYSwgamEsIHBlcm0sICZucmhzLCBpcGFybSwgJm1zZ2x2bCwgYiwgeCwgJmVycm9yKTsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IHBhcmRpc29fcnVuX3NlbGVjdG9yPGxvbmcgbG9uZyBpbnQ+CisgIHsKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgSW5kZXhUeXBlOworICAgIHN0YXRpYyBJbmRleFR5cGUgcnVuKCBfTUtMX0RTU19IQU5ETEVfdCBwdCwgSW5kZXhUeXBlIG1heGZjdCwgSW5kZXhUeXBlIG1udW0sIEluZGV4VHlwZSB0eXBlLCBJbmRleFR5cGUgcGhhc2UsIEluZGV4VHlwZSBuLCB2b2lkICphLAorICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSAqaWEsIEluZGV4VHlwZSAqamEsIEluZGV4VHlwZSAqcGVybSwgSW5kZXhUeXBlIG5yaHMsIEluZGV4VHlwZSAqaXBhcm0sIEluZGV4VHlwZSBtc2dsdmwsIHZvaWQgKmIsIHZvaWQgKngpCisgICAgeworICAgICAgSW5kZXhUeXBlIGVycm9yID0gMDsKKyAgICAgIDo6cGFyZGlzb182NChwdCwgJm1heGZjdCwgJm1udW0sICZ0eXBlLCAmcGhhc2UsICZuLCBhLCBpYSwgamEsIHBlcm0sICZucmhzLCBpcGFybSwgJm1zZ2x2bCwgYiwgeCwgJmVycm9yKTsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgUGFyZGlzbz4gc3RydWN0IHBhcmRpc29fdHJhaXRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorICBzdHJ1Y3QgcGFyZGlzb190cmFpdHM8IFBhcmRpc29MVTxfTWF0cml4VHlwZT4gPgorICB7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPgorICBzdHJ1Y3QgcGFyZGlzb190cmFpdHM8IFBhcmRpc29MTFQ8X01hdHJpeFR5cGUsIE9wdGlvbnM+ID4KKyAgeworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgT3B0aW9ucz4KKyAgc3RydWN0IHBhcmRpc29fdHJhaXRzPCBQYXJkaXNvTERMVDxfTWF0cml4VHlwZSwgT3B0aW9ucz4gPgorICB7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7ICAgIAorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK2NsYXNzIFBhcmRpc29JbXBsIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4KK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgU3BhcnNlU29sdmVyQmFzZTxEZXJpdmVkPiBCYXNlOworICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIAorICAgIHR5cGVkZWYgaW50ZXJuYWw6OnBhcmRpc29fdHJhaXRzPERlcml2ZWQ+IFRyYWl0czsKKyAgcHVibGljOgorICAgIHVzaW5nIEJhc2U6Ol9zb2x2ZV9pbXBsOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3IsU3RvcmFnZUluZGV4PiBTcGFyc2VNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gSW50Um93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBJbnRDb2xWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgQXJyYXk8U3RvcmFnZUluZGV4LDY0LDEsRG9udEFsaWduPiBQYXJhbWV0ZXJUeXBlOworICAgIGVudW0geworICAgICAgU2NhbGFySXNDb21wbGV4ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYworICAgIH07CisKKyAgICBQYXJkaXNvSW1wbCgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChzaXplb2YoU3RvcmFnZUluZGV4KSA+PSBzaXplb2YoX0lOVEVHRVJfdCkgJiYgc2l6ZW9mKFN0b3JhZ2VJbmRleCkgPD0gOCkgJiYgIk5vbi1zdXBwb3J0ZWQgaW5kZXggdHlwZSIpOworICAgICAgbV9pcGFybS5zZXRaZXJvKCk7CisgICAgICBtX21zZ2x2bCA9IDA7IC8vIE5vIG91dHB1dAorICAgICAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgflBhcmRpc29JbXBsKCkKKyAgICB7CisgICAgICBwYXJkaXNvUmVsZWFzZSgpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeCBhcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIC8qKiBcd2FybmluZyBmb3IgYWR2YW5jZWQgdXNhZ2Ugb25seS4KKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmFtZXRlciBhcnJheSBjb250cm9sbGluZyBQQVJESVNPLgorICAgICAgKiBTZWUgdGhlIFBBUkRJU08gbWFudWFsIHRvIGtub3cgaG93IHRvIHVzZSBpdC4gKi8KKyAgICBQYXJhbWV0ZXJUeXBlJiBwYXJkaXNvUGFyYW1ldGVyQXJyYXkoKQorICAgIHsKKyAgICAgIHJldHVybiBtX2lwYXJtOworICAgIH0KKyAgICAKKyAgICAvKiogUGVyZm9ybXMgYSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIG9uIHRoZSBzcGFyY2l0eSBvZiBcYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHNvbHZpbmcgZm9yIHNldmVyYWwgcHJvYmxlbXMgaGF2aW5nIHRoZSBzYW1lIHN0cnVjdHVyZS4KKyAgICAgICogCisgICAgICAqIFxzYSBmYWN0b3JpemUoKQorICAgICAgKi8KKyAgICBEZXJpdmVkJiBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIG51bWVyaWMgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhlIGdpdmVuIG1hdHJpeCBtdXN0IGhhcyB0aGUgc2FtZSBzcGFyY2l0eSB0aGFuIHRoZSBtYXRyaXggb24gd2hpY2ggdGhlIHN5bWJvbGljIGRlY29tcG9zaXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgorICAgICAgKgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgKi8KKyAgICBEZXJpdmVkJiBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKworICAgIERlcml2ZWQmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBwYXJkaXNvUmVsZWFzZSgpCisgICAgeworICAgICAgaWYobV9pc0luaXRpYWxpemVkKSAvLyBGYWN0b3JpemF0aW9uIHJhbiBhdCBsZWFzdCBvbmNlCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxTdG9yYWdlSW5kZXg+OjpydW4obV9wdCwgMSwgMSwgbV90eXBlLCAtMSwgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtX3NpemUpLDAsIDAsIDAsIG1fcGVybS5kYXRhKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pcGFybS5kYXRhKCksIG1fbXNnbHZsLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwYXJkaXNvSW5pdChpbnQgdHlwZSkKKyAgICB7CisgICAgICBtX3R5cGUgPSB0eXBlOworICAgICAgYm9vbCBzeW1tZXRyaWMgPSBzdGQ6OmFicyhtX3R5cGUpIDwgMTA7CisgICAgICBtX2lwYXJtWzBdID0gMTsgICAvLyBObyBzb2x2ZXIgZGVmYXVsdAorICAgICAgbV9pcGFybVsxXSA9IDI7ICAgLy8gdXNlIE1ldGlzIGZvciB0aGUgb3JkZXJpbmcKKyAgICAgIG1faXBhcm1bMl0gPSAwOyAgIC8vIFJlc2VydmVkLiBTZXQgdG8gemVyby4gKD8/TnVtYmVycyBvZiBwcm9jZXNzb3JzLCB2YWx1ZSBvZiBPTVBfTlVNX1RIUkVBRFM/PykKKyAgICAgIG1faXBhcm1bM10gPSAwOyAgIC8vIE5vIGl0ZXJhdGl2ZS1kaXJlY3QgYWxnb3JpdGhtCisgICAgICBtX2lwYXJtWzRdID0gMDsgICAvLyBObyB1c2VyIGZpbGwtaW4gcmVkdWNpbmcgcGVybXV0YXRpb24KKyAgICAgIG1faXBhcm1bNV0gPSAwOyAgIC8vIFdyaXRlIHNvbHV0aW9uIGludG8geCwgYiBpcyBsZWZ0IHVuY2hhbmdlZAorICAgICAgbV9pcGFybVs2XSA9IDA7ICAgLy8gTm90IGluIHVzZQorICAgICAgbV9pcGFybVs3XSA9IDI7ICAgLy8gTWF4IG51bWJlcnMgb2YgaXRlcmF0aXZlIHJlZmluZW1lbnQgc3RlcHMKKyAgICAgIG1faXBhcm1bOF0gPSAwOyAgIC8vIE5vdCBpbiB1c2UKKyAgICAgIG1faXBhcm1bOV0gPSAxMzsgIC8vIFBlcnR1cmIgdGhlIHBpdm90IGVsZW1lbnRzIHdpdGggMUUtMTMKKyAgICAgIG1faXBhcm1bMTBdID0gc3ltbWV0cmljID8gMCA6IDE7IC8vIFVzZSBub25zeW1tZXRyaWMgcGVybXV0YXRpb24gYW5kIHNjYWxpbmcgTVBTCisgICAgICBtX2lwYXJtWzExXSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzEyXSA9IHN5bW1ldHJpYyA/IDAgOiAxOyAgLy8gTWF4aW11bSB3ZWlnaHRlZCBtYXRjaGluZyBhbGdvcml0aG0gaXMgc3dpdGNoZWQtb2ZmIChkZWZhdWx0IGZvciBzeW1tZXRyaWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBtX2lwYXJtWzEyXSA9IDEgaW4gY2FzZSBvZiBpbmFwcHJvcHJpYXRlIGFjY3VyYWN5CisgICAgICBtX2lwYXJtWzEzXSA9IDA7ICAvLyBPdXRwdXQ6IE51bWJlciBvZiBwZXJ0dXJiZWQgcGl2b3RzCisgICAgICBtX2lwYXJtWzE0XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE1XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE2XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE3XSA9IC0xOyAvLyBPdXRwdXQ6IE51bWJlciBvZiBub256ZXJvcyBpbiB0aGUgZmFjdG9yIExVCisgICAgICBtX2lwYXJtWzE4XSA9IC0xOyAvLyBPdXRwdXQ6IE1mbG9wcyBmb3IgTFUgZmFjdG9yaXphdGlvbgorICAgICAgbV9pcGFybVsxOV0gPSAwOyAgLy8gT3V0cHV0OiBOdW1iZXJzIG9mIENHIEl0ZXJhdGlvbnMKKyAgICAgIAorICAgICAgbV9pcGFybVsyMF0gPSAwOyAgLy8gMXgxIHBpdm90aW5nCisgICAgICBtX2lwYXJtWzI2XSA9IDA7ICAvLyBObyBtYXRyaXggY2hlY2tlcgorICAgICAgbV9pcGFybVsyN10gPSAoc2l6ZW9mKFJlYWxTY2FsYXIpID09IDQpID8gMSA6IDA7CisgICAgICBtX2lwYXJtWzM0XSA9IDE7ICAvLyBDIGluZGV4aW5nCisgICAgICBtX2lwYXJtWzM2XSA9IDA7ICAvLyBDU1IKKyAgICAgIG1faXBhcm1bNTldID0gMDsgIC8vIDAgLSBJbi1Db3JlIDsgMSAtIEF1dG9tYXRpYyBzd2l0Y2ggYmV0d2VlbiBJbi1Db3JlIGFuZCBPdXQtb2YtQ29yZSBtb2RlcyA7IDIgLSBPdXQtb2YtQ29yZQorICAgICAgCisgICAgICBtZW1zZXQobV9wdCwgMCwgc2l6ZW9mKG1fcHQpKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIGNhY2hlZCBkYXRhIHRvIHJlZHVjZSByZWFsbG9jYXRpb24sIGV0Yy4KKyAgICAKKyAgICB2b2lkIG1hbmFnZUVycm9yQ29kZShJbmRleCBlcnJvcikgY29uc3QKKyAgICB7CisgICAgICBzd2l0Y2goZXJyb3IpCisgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC00OgorICAgICAgICBjYXNlIC03OgorICAgICAgICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtdXRhYmxlIFNwYXJzZU1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9hbmFseXNpc0lzT2ssIG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgU3RvcmFnZUluZGV4IG1fdHlwZSwgbV9tc2dsdmw7CisgICAgbXV0YWJsZSB2b2lkICptX3B0WzY0XTsKKyAgICBtdXRhYmxlIFBhcmFtZXRlclR5cGUgbV9pcGFybTsKKyAgICBtdXRhYmxlIEludENvbFZlY3RvclR5cGUgbV9wZXJtOworICAgIEluZGV4IG1fc2l6ZTsKKyAgICAKK307CisKK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+CitEZXJpdmVkJiBQYXJkaXNvSW1wbDxEZXJpdmVkPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBtX3NpemUgPSBhLnJvd3MoKTsKKyAgZWlnZW5fYXNzZXJ0KGEucm93cygpID09IGEuY29scygpKTsKKworICBwYXJkaXNvUmVsZWFzZSgpOworICBtX3Blcm0uc2V0WmVybyhtX3NpemUpOworICBkZXJpdmVkKCkuZ2V0TWF0cml4KGEpOworICAKKyAgSW5kZXggZXJyb3I7CisgIGVycm9yID0gaW50ZXJuYWw6OnBhcmRpc29fcnVuX3NlbGVjdG9yPFN0b3JhZ2VJbmRleD46OnJ1bihtX3B0LCAxLCAxLCBtX3R5cGUsIDEyLCBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KG1fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC52YWx1ZVB0cigpLCBtX21hdHJpeC5vdXRlckluZGV4UHRyKCksIG1fbWF0cml4LmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGVybS5kYXRhKCksIDAsIG1faXBhcm0uZGF0YSgpLCBtX21zZ2x2bCwgTlVMTCwgTlVMTCk7CisgIG1hbmFnZUVycm9yQ29kZShlcnJvcik7CisgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+CitEZXJpdmVkJiBQYXJkaXNvSW1wbDxEZXJpdmVkPjo6YW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgYSkKK3sKKyAgbV9zaXplID0gYS5yb3dzKCk7CisgIGVpZ2VuX2Fzc2VydChtX3NpemUgPT0gYS5jb2xzKCkpOworCisgIHBhcmRpc29SZWxlYXNlKCk7CisgIG1fcGVybS5zZXRaZXJvKG1fc2l6ZSk7CisgIGRlcml2ZWQoKS5nZXRNYXRyaXgoYSk7CisgIAorICBJbmRleCBlcnJvcjsKKyAgZXJyb3IgPSBpbnRlcm5hbDo6cGFyZGlzb19ydW5fc2VsZWN0b3I8U3RvcmFnZUluZGV4Pjo6cnVuKG1fcHQsIDEsIDEsIG1fdHlwZSwgMTEsIGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4obV9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF0cml4LnZhbHVlUHRyKCksIG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKSwgbV9tYXRyaXguaW5uZXJJbmRleFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wZXJtLmRhdGEoKSwgMCwgbV9pcGFybS5kYXRhKCksIG1fbXNnbHZsLCBOVUxMLCBOVUxMKTsKKyAgCisgIG1hbmFnZUVycm9yQ29kZShlcnJvcik7CisgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorRGVyaXZlZCYgUGFyZGlzb0ltcGw8RGVyaXZlZD46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBlaWdlbl9hc3NlcnQobV9zaXplID09IGEucm93cygpICYmIG1fc2l6ZSA9PSBhLmNvbHMoKSk7CisgIAorICBkZXJpdmVkKCkuZ2V0TWF0cml4KGEpOworCisgIEluZGV4IGVycm9yOworICBlcnJvciA9IGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxTdG9yYWdlSW5kZXg+OjpydW4obV9wdCwgMSwgMSwgbV90eXBlLCAyMiwgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXgudmFsdWVQdHIoKSwgbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpLCBtX21hdHJpeC5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9tc2dsdmwsIE5VTEwsIE5VTEwpOworICAKKyAgbWFuYWdlRXJyb3JDb2RlKGVycm9yKTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCRGVyaXZlZCx0eXBlbmFtZSBYRGVyaXZlZD4KK3ZvaWQgUGFyZGlzb0ltcGw8RGVyaXZlZD46Ol9zb2x2ZV9pbXBsKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiYgeCkgY29uc3QKK3sKKyAgaWYobV9pcGFybVswXSA9PSAwKSAvLyBGYWN0b3JpemF0aW9uIHdhcyBub3QgY29tcHV0ZWQKKyAgeworICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICByZXR1cm47CisgIH0KKworICAvL0luZGV4IG4gPSBtX21hdHJpeC5yb3dzKCk7CisgIEluZGV4IG5yaHMgPSBJbmRleChiLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChtX3NpemU9PWIucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KCgoTWF0cml4QmFzZTxCRGVyaXZlZD46OkZsYWdzICYgUm93TWFqb3JCaXQpID09IDAgfHwgbnJocyA9PSAxKSAmJiAiUm93LW1ham9yIHJpZ2h0IGhhbmQgc2lkZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgZWlnZW5fYXNzZXJ0KCgoTWF0cml4QmFzZTxYRGVyaXZlZD46OkZsYWdzICYgUm93TWFqb3JCaXQpID09IDAgfHwgbnJocyA9PSAxKSAmJiAiUm93LW1ham9yIG1hdHJpY2VzIG9mIHVua25vd25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgIGVpZ2VuX2Fzc2VydCgoKG5yaHMgPT0gMSkgfHwgYi5vdXRlclN0cmlkZSgpID09IGIucm93cygpKSk7CisKKworLy8gIHN3aXRjaCAodHJhbnNwb3NlZCkgeworLy8gICAgY2FzZSBTdk5vVHJhbnMgICAgOiBtX2lwYXJtWzExXSA9IDAgOyBicmVhazsKKy8vICAgIGNhc2UgU3ZUcmFuc3Bvc2UgIDogbV9pcGFybVsxMV0gPSAyIDsgYnJlYWs7CisvLyAgICBjYXNlIFN2QWRqb2ludCAgICA6IG1faXBhcm1bMTFdID0gMSA7IGJyZWFrOworLy8gICAgZGVmYXVsdDoKKy8vICAgICAgLy9zdGQ6OmNlcnIgPDwgIkVpZ2VuOiB0cmFuc3Bvc2l0aW9uICBvcHRpb24gXCIiIDw8IHRyYW5zcG9zZWQgPDwgIlwiIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBBUkRJU08gYmFja2VuZFxuIjsKKy8vICAgICAgbV9pcGFybVsxMV0gPSAwOworLy8gIH0KKworICBTY2FsYXIqIHJoc19wdHIgPSBjb25zdF9jYXN0PFNjYWxhcio+KGIuZGVyaXZlZCgpLmRhdGEoKSk7CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiB0bXA7CisgIAorICAvLyBQYXJkaXNvIGNhbm5vdCBzb2x2ZSBpbi1wbGFjZQorICBpZihyaHNfcHRyID09IHguZGVyaXZlZCgpLmRhdGEoKSkKKyAgeworICAgIHRtcCA9IGI7CisgICAgcmhzX3B0ciA9IHRtcC5kYXRhKCk7CisgIH0KKyAgCisgIEluZGV4IGVycm9yOworICBlcnJvciA9IGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxTdG9yYWdlSW5kZXg+OjpydW4obV9wdCwgMSwgMSwgbV90eXBlLCAzMywgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXgudmFsdWVQdHIoKSwgbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpLCBtX21hdHJpeC5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KG5yaHMpLCBtX2lwYXJtLmRhdGEoKSwgbV9tc2dsdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfcHRyLCB4LmRlcml2ZWQoKS5kYXRhKCkpOworCisgIG1hbmFnZUVycm9yQ29kZShlcnJvcik7Cit9CisKKworLyoqIFxpbmdyb3VwIFBhcmRpc29TdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBQYXJkaXNvTFUKKyAgKiBcYnJpZWYgQSBzcGFyc2UgZGlyZWN0IExVIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgUEFSRElTTyBsaWJyYXJ5CisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhIGRpcmVjdCBMVSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIEludGVsIE1LTCBQQVJESVNPIGxpYnJhcnkuIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzcXVhcmVkIGFuZCBpbnZlcnRpYmxlLgorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBCeSBkZWZhdWx0LCBpdCBydW5zIGluIGluLWNvcmUgbW9kZS4gVG8gZW5hYmxlIFBBUkRJU08ncyBvdXQtb2YtY29yZSBmZWF0dXJlLCBzZXQ6CisgICogXGNvZGUgc29sdmVyLnBhcmRpc29QYXJhbWV0ZXJBcnJheSgpWzU5XSA9IDE7IFxlbmRjb2RlCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNwYXJzZUxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgUGFyZGlzb0xVIDogcHVibGljIFBhcmRpc29JbXBsPCBQYXJkaXNvTFU8TWF0cml4VHlwZT4gPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBQYXJkaXNvSW1wbDxQYXJkaXNvTFU+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHVzaW5nIEJhc2U6OnBhcmRpc29Jbml0OworICAgIHVzaW5nIEJhc2U6Om1fbWF0cml4OworICAgIGZyaWVuZCBjbGFzcyBQYXJkaXNvSW1wbDwgUGFyZGlzb0xVPE1hdHJpeFR5cGU+ID47CisKKyAgcHVibGljOgorCisgICAgdXNpbmcgQmFzZTo6Y29tcHV0ZTsKKyAgICB1c2luZyBCYXNlOjpzb2x2ZTsKKworICAgIFBhcmRpc29MVSgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/IDEzIDogMTEpOworICAgIH0KKworICAgIGV4cGxpY2l0IFBhcmRpc29MVShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/IDEzIDogMTEpOworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgZ2V0TWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBtX21hdHJpeCA9IG1hdHJpeDsKKyAgICAgIG1fbWF0cml4Lm1ha2VDb21wcmVzc2VkKCk7CisgICAgfQorfTsKKworLyoqIFxpbmdyb3VwIFBhcmRpc29TdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBQYXJkaXNvTExUCisgICogXGJyaWVmIEEgc3BhcnNlIGRpcmVjdCBDaG9sZXNreSAoTExUKSBmYWN0b3JpemF0aW9uIGFuZCBzb2x2ZXIgYmFzZWQgb24gdGhlIFBBUkRJU08gbGlicmFyeQorICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gc29sdmUgZm9yIEEuWCA9IEIgc3BhcnNlIGxpbmVhciBwcm9ibGVtcyB2aWEgYSBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgSW50ZWwgTUtMIFBBUkRJU08gbGlicmFyeS4gVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZham9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLgorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBCeSBkZWZhdWx0LCBpdCBydW5zIGluIGluLWNvcmUgbW9kZS4gVG8gZW5hYmxlIFBBUkRJU08ncyBvdXQtb2YtY29yZSBmZWF0dXJlLCBzZXQ6CisgICogXGNvZGUgc29sdmVyLnBhcmRpc29QYXJhbWV0ZXJBcnJheSgpWzU5XSA9IDE7IFxlbmRjb2RlCisgICoKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBVcExvIGNhbiBiZSBhbnkgYml0d2lzZSBjb21iaW5hdGlvbiBvZiBVcHBlciwgTG93ZXIuIFRoZSBkZWZhdWx0IGlzIFVwcGVyLCBtZWFuaW5nIG9ubHkgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBoYXMgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgIFVwcGVyfExvd2VyIGNhbiBiZSB1c2VkIHRvIHRlbGwgYm90aCB0cmlhbmd1bGFyIHBhcnRzIGNhbiBiZSB1c2VkIGFzIGlucHV0LgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNpbXBsaWNpYWxMTFQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK2NsYXNzIFBhcmRpc29MTFQgOiBwdWJsaWMgUGFyZGlzb0ltcGw8IFBhcmRpc29MTFQ8TWF0cml4VHlwZSxfVXBMbz4gPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBQYXJkaXNvSW1wbDwgUGFyZGlzb0xMVDxNYXRyaXhUeXBlLF9VcExvPiA+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHVzaW5nIEJhc2U6OnBhcmRpc29Jbml0OworICAgIHVzaW5nIEJhc2U6Om1fbWF0cml4OworICAgIGZyaWVuZCBjbGFzcyBQYXJkaXNvSW1wbDwgUGFyZGlzb0xMVDxNYXRyaXhUeXBlLF9VcExvPiA+OworCisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgICAgdXNpbmcgQmFzZTo6Y29tcHV0ZTsKKworICAgIFBhcmRpc29MTFQoKQorICAgICAgOiBCYXNlKCkKKyAgICB7CisgICAgICBwYXJkaXNvSW5pdChCYXNlOjpTY2FsYXJJc0NvbXBsZXggPyA0IDogMik7CisgICAgfQorCisgICAgZXhwbGljaXQgUGFyZGlzb0xMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/IDQgOiAyKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAKKyAgICB2b2lkIGdldE1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgLy8gUEFSRElTTyBzdXBwb3J0cyBvbmx5IHVwcGVyLCByb3ctbWFqb3IgbWF0cmljZXMKKyAgICAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxTdG9yYWdlSW5kZXg+IHBfbnVsbDsKKyAgICAgIG1fbWF0cml4LnJlc2l6ZShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKTsKKyAgICAgIG1fbWF0cml4LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSA9IG1hdHJpeC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKS50d2lzdGVkQnkocF9udWxsKTsKKyAgICAgIG1fbWF0cml4Lm1ha2VDb21wcmVzc2VkKCk7CisgICAgfQorfTsKKworLyoqIFxpbmdyb3VwIFBhcmRpc29TdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBQYXJkaXNvTERMVAorICAqIFxicmllZiBBIHNwYXJzZSBkaXJlY3QgQ2hvbGVza3kgKExETFQpIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgUEFSRElTTyBsaWJyYXJ5CisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhIExETF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgSW50ZWwgTUtMIFBBUkRJU08gbGlicmFyeS4gVGhlIHNwYXJzZSBtYXRyaXggQSBpcyBhc3N1bWVkIHRvIGJlIHNlbGZham9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLgorICAqIEZvciBjb21wbGV4IG1hdHJpY2VzLCBBIGNhbiBhbHNvIGJlIHN5bW1ldHJpYyBvbmx5LCBzZWUgdGhlIFxhIE9wdGlvbnMgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBCeSBkZWZhdWx0LCBpdCBydW5zIGluIGluLWNvcmUgbW9kZS4gVG8gZW5hYmxlIFBBUkRJU08ncyBvdXQtb2YtY29yZSBmZWF0dXJlLCBzZXQ6CisgICogXGNvZGUgc29sdmVyLnBhcmRpc29QYXJhbWV0ZXJBcnJheSgpWzU5XSA9IDE7IFxlbmRjb2RlCisgICoKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBPcHRpb25zIGNhbiBiZSBhbnkgYml0d2lzZSBjb21iaW5hdGlvbiBvZiBVcHBlciwgTG93ZXIsIGFuZCBTeW1tZXRyaWMuIFRoZSBkZWZhdWx0IGlzIFVwcGVyLCBtZWFuaW5nIG9ubHkgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBoYXMgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgIFN5bW1ldHJpYyBjYW4gYmUgdXNlZCBmb3Igc3ltbWV0cmljLCBub24tc2VsZmFkam9pbnQgY29tcGxleCBtYXRyaWNlcywgdGhlIGRlZmF1bHQgYmVpbmcgdG8gYXNzdW1lIGEgc2VsZmFkam9pbnQgbWF0cml4LgorICAqICAgICAgICAgVXBwZXJ8TG93ZXIgY2FuIGJlIHVzZWQgdG8gdGVsbCBib3RoIHRyaWFuZ3VsYXIgcGFydHMgY2FuIGJlIHVzZWQgYXMgaW5wdXQuCisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlU29sdmVyQ29uY2VwdCwgY2xhc3MgU2ltcGxpY2lhbExETFQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBPcHRpb25zPgorY2xhc3MgUGFyZGlzb0xETFQgOiBwdWJsaWMgUGFyZGlzb0ltcGw8IFBhcmRpc29MRExUPE1hdHJpeFR5cGUsT3B0aW9ucz4gPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBQYXJkaXNvSW1wbDwgUGFyZGlzb0xETFQ8TWF0cml4VHlwZSxPcHRpb25zPiA+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHVzaW5nIEJhc2U6OnBhcmRpc29Jbml0OworICAgIHVzaW5nIEJhc2U6Om1fbWF0cml4OworICAgIGZyaWVuZCBjbGFzcyBQYXJkaXNvSW1wbDwgUGFyZGlzb0xETFQ8TWF0cml4VHlwZSxPcHRpb25zPiA+OworCisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB1c2luZyBCYXNlOjpjb21wdXRlOworICAgIGVudW0geyBVcExvID0gT3B0aW9ucyYoVXBwZXJ8TG93ZXIpIH07CisKKyAgICBQYXJkaXNvTERMVCgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/ICggYm9vbChPcHRpb25zJlN5bW1ldHJpYykgPyA2IDogLTQgKSA6IC0yKTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBQYXJkaXNvTERMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/ICggYm9vbChPcHRpb25zJlN5bW1ldHJpYykgPyA2IDogLTQgKSA6IC0yKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgICAgCisgICAgdm9pZCBnZXRNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIC8vIFBBUkRJU08gc3VwcG9ydHMgb25seSB1cHBlciwgcm93LW1ham9yIG1hdHJpY2VzCisgICAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBwX251bGw7CisgICAgICBtX21hdHJpeC5yZXNpemUobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSk7CisgICAgICBtX21hdHJpeC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCkudHdpc3RlZEJ5KHBfbnVsbCk7CisgICAgICBtX21hdHJpeC5tYWtlQ29tcHJlc3NlZCgpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFSRElTT1NVUFBPUlRfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1FSL0NvbFBpdkhvdXNlaG9sZGVyUVIuaCBiL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNDdkNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSLmgKQEAgLTAsMCArMSw2NTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTFBJVk9USU5HSE9VU0VIT0xERVJRUl9ICisjZGVmaW5lIEVJR0VOX0NPTFBJVk9USU5HSE9VU0VIT0xERVJRUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gc3RydWN0IHRyYWl0czxDb2xQaXZIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPiA+CisgOiB0cmFpdHM8X01hdHJpeFR5cGU+Cit7CisgIGVudW0geyBGbGFncyA9IDAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgUVJfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgQ29sUGl2SG91c2Vob2xkZXJRUgorICAqCisgICogXGJyaWVmIEhvdXNlaG9sZGVyIHJhbmstcmV2ZWFsaW5nIFFSIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXggd2l0aCBjb2x1bW4tcGl2b3RpbmcKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBRUiBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGEgcmFuay1yZXZlYWxpbmcgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCBcYiBBIGludG8gbWF0cmljZXMgXGIgUCwgXGIgUSBhbmQgXGIgUgorICAqIHN1Y2ggdGhhdAorICAqIFxmWworICAqICBcbWF0aGJme0F9IFwsIFxtYXRoYmZ7UH0gPSBcbWF0aGJme1F9IFwsIFxtYXRoYmZ7Un0KKyAgKiBcZl0KKyAgKiBieSB1c2luZyBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMuIEhlcmUsIFxiIFAgaXMgYSBwZXJtdXRhdGlvbiBtYXRyaXgsIFxiIFEgYSB1bml0YXJ5IG1hdHJpeCBhbmQgXGIgUiBhbgorICAqIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorICAqCisgICogVGhpcyBkZWNvbXBvc2l0aW9uIHBlcmZvcm1zIGNvbHVtbiBwaXZvdGluZyBpbiBvcmRlciB0byBiZSByYW5rLXJldmVhbGluZyBhbmQgaW1wcm92ZQorICAqIG51bWVyaWNhbCBzdGFiaWxpdHkuIEl0IGlzIHNsb3dlciB0aGFuIEhvdXNlaG9sZGVyUVIsIGFuZCBmYXN0ZXIgdGhhbiBGdWxsUGl2SG91c2Vob2xkZXJRUi4KKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgdGhlIFxsaW5rIElucGxhY2VEZWNvbXBvc2l0aW9uIGlucGxhY2UgZGVjb21wb3NpdGlvbiBcZW5kbGluayBtZWNoYW5pc20uCisgICogCisgICogXHNhIE1hdHJpeEJhc2U6OmNvbFBpdkhvdXNlaG9sZGVyUXIoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIENvbFBpdkhvdXNlaG9sZGVyUVIKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIC8vIEZJWE1FIHNob3VsZCBiZSBpbnQKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fZGlhZ190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIEhDb2VmZnNUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBQZXJtdXRhdGlvblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZSwgSW5kZXg+Ojp0eXBlIEludFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxNYXRyaXhUeXBlLCBSZWFsU2NhbGFyPjo6dHlwZSBSZWFsUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBIQ29lZmZzVHlwZTo6Q29uanVnYXRlUmV0dXJuVHlwZT46OnR5cGU+IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgcHJpdmF0ZToKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgUGVybXV0YXRpb25UeXBlOjpTdG9yYWdlSW5kZXggUGVybUluZGV4VHlwZTsKKworICBwdWJsaWM6CisKKyAgICAvKioKKyAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICoKKyAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBDb2xQaXZIb3VzZWhvbGRlclFSOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAqLworICAgIENvbFBpdkhvdXNlaG9sZGVyUVIoKQorICAgICAgOiBtX3FyKCksCisgICAgICAgIG1faENvZWZmcygpLAorICAgICAgICBtX2NvbHNQZXJtdXRhdGlvbigpLAorICAgICAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucygpLAorICAgICAgICBtX3RlbXAoKSwKKyAgICAgICAgbV9jb2xOb3Jtc1VwZGF0ZWQoKSwKKyAgICAgICAgbV9jb2xOb3Jtc0RpcmVjdCgpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQoZmFsc2UpIHt9CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3Igd2l0aCBtZW1vcnkgcHJlYWxsb2NhdGlvbgorICAgICAgKgorICAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGJ1dCB3aXRoIHByZWFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEKKyAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvYmxlbSBcYSBzaXplLgorICAgICAgKiBcc2EgQ29sUGl2SG91c2Vob2xkZXJRUigpCisgICAgICAqLworICAgIENvbFBpdkhvdXNlaG9sZGVyUVIoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICAgIDogbV9xcihyb3dzLCBjb2xzKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikocm93cyxjb2xzKSksCisgICAgICAgIG1fY29sc1Blcm11dGF0aW9uKFBlcm1JbmRleFR5cGUoY29scykpLAorICAgICAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucyhjb2xzKSwKKyAgICAgICAgbV90ZW1wKGNvbHMpLAorICAgICAgICBtX2NvbE5vcm1zVXBkYXRlZChjb2xzKSwKKyAgICAgICAgbV9jb2xOb3Jtc0RpcmVjdChjb2xzKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKSB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGEgUVIgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIFFSIGZhY3Rvcml6YXRpb24gb2YgdGhlIG1hdHJpeCBcYSBtYXRyaXggYnkgY2FsbGluZworICAgICAgKiB0aGUgbWV0aG9kIGNvbXB1dGUoKS4gSXQgaXMgYSBzaG9ydCBjdXQgZm9yOgorICAgICAgKgorICAgICAgKiBcY29kZQorICAgICAgKiBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgKiBxci5jb21wdXRlKG1hdHJpeCk7CisgICAgICAqIFxlbmRjb2RlCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIGV4cGxpY2l0IENvbFBpdkhvdXNlaG9sZGVyUVIoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9xcihtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSksCisgICAgICAgIG1fY29sc1Blcm11dGF0aW9uKFBlcm1JbmRleFR5cGUobWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucyhtYXRyaXguY29scygpKSwKKyAgICAgICAgbV90ZW1wKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2NvbE5vcm1zVXBkYXRlZChtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9jb2xOb3Jtc0RpcmVjdChtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGEgUVIgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIHdoZW4gXGMgTWF0cml4VHlwZSBpcyBhIEVpZ2VuOjpSZWYuCisgICAgICAqCisgICAgICAqIFxzYSBDb2xQaXZIb3VzZWhvbGRlclFSKGNvbnN0IEVpZ2VuQmFzZSYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBDb2xQaXZIb3VzZWhvbGRlclFSKEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgICA6IG1fcXIobWF0cml4LmRlcml2ZWQoKSksCisgICAgICAgIG1faENvZWZmcygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX2NvbHNQZXJtdXRhdGlvbihQZXJtSW5kZXhUeXBlKG1hdHJpeC5jb2xzKCkpKSwKKyAgICAgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fdGVtcChtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9jb2xOb3Jtc1VwZGF0ZWQobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fY29sTm9ybXNEaXJlY3QobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlSW5QbGFjZSgpOworICAgIH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCBmaW5kcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIEF4PWIsIHdoZXJlIEEgaXMgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiwgaWYgYW55IGV4aXN0cy4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGIgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXF1YXRpb24gdG8gc29sdmUuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIGEgc29sdXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucworICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9hcmJpdHJhcnlfY2hvaWNlX29mX3NvbHV0aW9uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIENvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgU29sdmU8Q29sUGl2SG91c2Vob2xkZXJRUiwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBTb2x2ZTxDb2xQaXZIb3VzZWhvbGRlclFSLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgaG91c2Vob2xkZXJRKCkgY29uc3Q7CisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgbWF0cml4USgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGhvdXNlaG9sZGVyUSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdoZXJlIHRoZSBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIGlzIHN0b3JlZAorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhRUigpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9xcjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCB3aGVyZSB0aGUgcmVzdWx0IEhvdXNlaG9sZGVyIFFSIGlzIHN0b3JlZAorICAgICAqIFx3YXJuaW5nIFRoZSBzdHJpY3QgbG93ZXIgcGFydCBvZiB0aGlzIG1hdHJpeCBjb250YWlucyBpbnRlcm5hbCB2YWx1ZXMuCisgICAgICogT25seSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IHNob3VsZCBiZSByZWZlcmVuY2VkLiBUbyBnZXQgaXQsIHVzZQorICAgICAqIFxjb2RlIG1hdHJpeFIoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSBcZW5kY29kZQorICAgICAqIEZvciByYW5rLWRlZmljaWVudCBtYXRyaWNlcywgdXNlCisgICAgICogXGNvZGUKKyAgICAgKiBtYXRyaXhSKCkudG9wTGVmdENvcm5lcihyYW5rKCksIHJhbmsoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgKiBcZW5kY29kZQorICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFIoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fcXI7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorICAgIENvbFBpdkhvdXNlaG9sZGVyUVImIGNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCk7CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiBtYXRyaXggKi8KKyAgICBjb25zdCBQZXJtdXRhdGlvblR5cGUmIGNvbHNQZXJtdXRhdGlvbigpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9jb2xzUGVybXV0YXRpb247CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4gSXQgaGFzIG9ubHkgbGluZWFyIGNvbXBsZXhpdHkKKyAgICAgICogKHRoYXQgaXMsIE8obikgd2hlcmUgbiBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcXVhcmUgbWF0cml4KQorICAgICAgKiBhcyB0aGUgUVIgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgYSBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSBiaWcgb3Igc21hbGwsIHNvIGZvciBtYXRyaWNlcworICAgICAgKiBvZiBsYXJnZSBlbm91Z2ggZGltZW5zaW9uLCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgICAgKiBPbmUgd2F5IHRvIHdvcmsgYXJvdW5kIHRoYXQgaXMgdG8gdXNlIGxvZ0Fic0RldGVybWluYW50KCkgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogXHNhIGxvZ0Fic0RldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICAgICovCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBhYnNEZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuYXR1cmFsIGxvZyBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIFFSIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byB3b3JrIGFyb3VuZCB0aGUgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cgdGhhdCdzIGluaGVyZW50CisgICAgICAqIHRvIGRldGVybWluYW50IGNvbXB1dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgYWJzRGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIGxvZ0Fic0RldGVybWluYW50KCkgY29uc3Q7CisKKyAgICAvKiogXHJldHVybnMgdGhlIHJhbmsgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBJbmRleCByYW5rKCkgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgUmVhbFNjYWxhciBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCA9IGFicyhtX21heHBpdm90KSAqIHRocmVzaG9sZCgpOworICAgICAgSW5kZXggcmVzdWx0ID0gMDsKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1fbm9uemVyb19waXZvdHM7ICsraSkKKyAgICAgICAgcmVzdWx0ICs9IChhYnMobV9xci5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBkaW1lbnNpb24gb2YgdGhlIGtlcm5lbCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IGRpbWVuc2lvbk9mS2VybmVsKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBjb2xzKCkgLSByYW5rKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiByZXByZXNlbnRzIGFuIGluamVjdGl2ZQorICAgICAgKiAgICAgICAgICBsaW5lYXIgbWFwLCBpLmUuIGhhcyB0cml2aWFsIGtlcm5lbDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJbmplY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIHJhbmsoKSA9PSBjb2xzKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiByZXByZXNlbnRzIGEgc3VyamVjdGl2ZQorICAgICAgKiAgICAgICAgICBsaW5lYXIgbWFwOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1N1cmplY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIHJhbmsoKSA9PSByb3dzKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiBpcyBpbnZlcnRpYmxlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJbnZlcnRpYmxlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpc0luamVjdGl2ZSgpICYmIGlzU3VyamVjdGl2ZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGlzIG1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSwgdGhlIHJldHVybmVkIG1hdHJpeCBoYXMgdW5kZWZpbmVkIGNvZWZmaWNpZW50cy4KKyAgICAgICogICAgICAgVXNlIGlzSW52ZXJ0aWJsZSgpIHRvIGZpcnN0IGRldGVybWluZSB3aGV0aGVyIHRoaXMgbWF0cml4IGlzIGludmVydGlibGUuCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBJbnZlcnNlPENvbFBpdkhvdXNlaG9sZGVyUVI+IGludmVyc2UoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIEludmVyc2U8Q29sUGl2SG91c2Vob2xkZXJRUj4oKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9xci5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcXIuY29scygpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZlY3RvciBvZiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGZhY3RvciBcYyBRLgorICAgICAgKgorICAgICAgKiBGb3IgYWR2YW5jZWQgdXNlcyBvbmx5LgorICAgICAgKi8KKyAgICBjb25zdCBIQ29lZmZzVHlwZSYgaENvZWZmcygpIGNvbnN0IHsgcmV0dXJuIG1faENvZWZmczsgfQorCisgICAgLyoqIEFsbG93cyB0byBwcmVzY3JpYmUgYSB0aHJlc2hvbGQgdG8gYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMsIHN1Y2ggYXMgcmFuaygpLAorICAgICAgKiB3aG8gbmVlZCB0byBkZXRlcm1pbmUgd2hlbiBwaXZvdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgbm9uemVyby4gVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlCisgICAgICAqIFFSIGRlY29tcG9zaXRpb24gaXRzZWxmLgorICAgICAgKgorICAgICAgKiBXaGVuIGl0IG5lZWRzIHRvIGdldCB0aGUgdGhyZXNob2xkIHZhbHVlLCBFaWdlbiBjYWxscyB0aHJlc2hvbGQoKS4gQnkgZGVmYXVsdCwgdGhpcworICAgICAgKiB1c2VzIGEgZm9ybXVsYSB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhIHJlYXNvbmFibGUgdGhyZXNob2xkLgorICAgICAgKiBPbmNlIHlvdSBoYXZlIGNhbGxlZCB0aGUgcHJlc2VudCBtZXRob2Qgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKSwKKyAgICAgICogeW91ciB2YWx1ZSBpcyB1c2VkIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxwYXJhbSB0aHJlc2hvbGQgVGhlIG5ldyB2YWx1ZSB0byB1c2UgYXMgdGhlIHRocmVzaG9sZC4KKyAgICAgICoKKyAgICAgICogQSBwaXZvdCB3aWxsIGJlIGNvbnNpZGVyZWQgbm9uemVybyBpZiBpdHMgYWJzb2x1dGUgdmFsdWUgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuCisgICAgICAqICBcZiQgXHZlcnQgcGl2b3QgXHZlcnQgXGxlcXNsYW50IHRocmVzaG9sZCBcdGltZXMgXHZlcnQgbWF4cGl2b3QgXHZlcnQgXGYkCisgICAgICAqIHdoZXJlIG1heHBpdm90IGlzIHRoZSBiaWdnZXN0IHBpdm90LgorICAgICAgKgorICAgICAgKiBJZiB5b3Ugd2FudCB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGNhbGwgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICAgICovCisgICAgQ29sUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSB0cnVlOworICAgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBBbGxvd3MgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBsZXR0aW5nIEVpZ2VuIHVzZSBpdHMgZGVmYXVsdCBmb3JtdWxhIGZvcgorICAgICAgKiBkZXRlcm1pbmluZyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBZb3Ugc2hvdWxkIHBhc3MgdGhlIHNwZWNpYWwgb2JqZWN0IEVpZ2VuOjpEZWZhdWx0IGFzIHBhcmFtZXRlciBoZXJlLgorICAgICAgKiBcY29kZSBxci5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgQ29sUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSBmYWxzZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdGhyZXNob2xkIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNlcnRhaW4gbWV0aG9kcyBzdWNoIGFzIHJhbmsoKS4KKyAgICAgICoKKyAgICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIFJlYWxTY2FsYXIgdGhyZXNob2xkKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkIHx8IG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCk7CisgICAgICByZXR1cm4gbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkID8gbV9wcmVzY3JpYmVkVGhyZXNob2xkCisgICAgICAvLyB0aGlzIGZvcm11bGEgY29tZXMgZnJvbSBleHBlcmltZW50aW5nIChzZWUgIkxVIHByZWNpc2lvbiB0dW5pbmciIHRocmVhZCBvbiB0aGUgbGlzdCkKKyAgICAgIC8vIGFuZCB0dXJucyBvdXQgdG8gYmUgaWRlbnRpY2FsIHRvIEhpZ2hhbSdzIGZvcm11bGEgdXNlZCBhbHJlYWR5IGluIExETHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIFJlYWxTY2FsYXIobV9xci5kaWFnb25hbFNpemUoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uemVybyBwaXZvdHMgaW4gdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqIEhlcmUgbm9uemVybyBpcyBtZWFudCBpbiB0aGUgZXhhY3Qgc2Vuc2UsIG5vdCBpbiBhIGZ1enp5IHNlbnNlLgorICAgICAgKiBTbyB0aGF0IG5vdGlvbiBpc24ndCByZWFsbHkgaW50cmluc2ljYWxseSBpbnRlcmVzdGluZywgYnV0IGl0IGlzCisgICAgICAqIHN0aWxsIHVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBhbGdvcml0aG1zLgorICAgICAgKgorICAgICAgKiBcc2EgcmFuaygpCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBub256ZXJvUGl2b3RzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX25vbnplcm9fcGl2b3RzOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGJpZ2dlc3QgcGl2b3QsIGkuZS4gdGhlIGJpZ2dlc3QKKyAgICAgICogICAgICAgICAgZGlhZ29uYWwgY29lZmZpY2llbnQgb2YgUi4KKyAgICAgICovCisgICAgUmVhbFNjYWxhciBtYXhQaXZvdCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4cGl2b3Q7IH0KKworICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHRoZSBRUiBmYWN0b3JpemF0aW9uIHdhcyBzdWNjZXNmdWwuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgXGMgU3VjY2Vzcy4gSXQgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgICogd2l0aCBvdGhlciBmYWN0b3JpemF0aW9uIHJvdXRpbmVzLgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBTdWNjZXNzOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248TWF0cml4VHlwZT47CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFNjYWxhcik7CisgICAgfQorCisgICAgdm9pZCBjb21wdXRlSW5QbGFjZSgpOworCisgICAgTWF0cml4VHlwZSBtX3FyOworICAgIEhDb2VmZnNUeXBlIG1faENvZWZmczsKKyAgICBQZXJtdXRhdGlvblR5cGUgbV9jb2xzUGVybXV0YXRpb247CisgICAgSW50Um93VmVjdG9yVHlwZSBtX2NvbHNUcmFuc3Bvc2l0aW9uczsKKyAgICBSb3dWZWN0b3JUeXBlIG1fdGVtcDsKKyAgICBSZWFsUm93VmVjdG9yVHlwZSBtX2NvbE5vcm1zVXBkYXRlZDsKKyAgICBSZWFsUm93VmVjdG9yVHlwZSBtX2NvbE5vcm1zRGlyZWN0OworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkLCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQ7CisgICAgUmVhbFNjYWxhciBtX3ByZXNjcmliZWRUaHJlc2hvbGQsIG1fbWF4cGl2b3Q7CisgICAgSW5kZXggbV9ub256ZXJvX3Bpdm90czsKKyAgICBJbmRleCBtX2RldF9wcTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OmFic0RldGVybWluYW50KCkgY29uc3QKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gYWJzKG1fcXIuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Ojpsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gbV9xci5kaWFnb25hbCgpLmN3aXNlQWJzKCkuYXJyYXkoKS5sb2coKS5zdW0oKTsKK30KKworLyoqIFBlcmZvcm1zIHRoZSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBnaXZlbiBtYXRyaXggXGEgbWF0cml4LiBUaGUgcmVzdWx0IG9mCisgICogdGhlIGZhY3Rvcml6YXRpb24gaXMgc3RvcmVkIGludG8gXGMgKnRoaXMsIGFuZCBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqIGlzIHJldHVybmVkLgorICAqCisgICogXHNhIGNsYXNzIENvbFBpdkhvdXNlaG9sZGVyUVIsIENvbFBpdkhvdXNlaG9sZGVyUVIoY29uc3QgTWF0cml4VHlwZSYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPgorQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiYgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQoreworICBtX3FyID0gbWF0cml4LmRlcml2ZWQoKTsKKyAgY29tcHV0ZUluUGxhY2UoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Ojpjb21wdXRlSW5QbGFjZSgpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKworICAvLyB0aGUgY29sdW1uIHBlcm11dGF0aW9uIGlzIHN0b3JlZCBhcyBpbnQgaW5kaWNlcywgc28ganVzdCB0byBiZSBzdXJlOgorICBlaWdlbl9hc3NlcnQobV9xci5jb2xzKCk8PU51bVRyYWl0czxpbnQ+OjpoaWdoZXN0KCkpOworCisgIHVzaW5nIHN0ZDo6YWJzOworCisgIEluZGV4IHJvd3MgPSBtX3FyLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG1fcXIuY29scygpOworICBJbmRleCBzaXplID0gbV9xci5kaWFnb25hbFNpemUoKTsKKworICBtX2hDb2VmZnMucmVzaXplKHNpemUpOworCisgIG1fdGVtcC5yZXNpemUoY29scyk7CisKKyAgbV9jb2xzVHJhbnNwb3NpdGlvbnMucmVzaXplKG1fcXIuY29scygpKTsKKyAgSW5kZXggbnVtYmVyX29mX3RyYW5zcG9zaXRpb25zID0gMDsKKworICBtX2NvbE5vcm1zVXBkYXRlZC5yZXNpemUoY29scyk7CisgIG1fY29sTm9ybXNEaXJlY3QucmVzaXplKGNvbHMpOworICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgY29sczsgKytrKSB7CisgICAgLy8gY29sTm9ybXNEaXJlY3QoaykgY2FjaGVzIHRoZSBtb3N0IHJlY2VudCBkaXJlY3RseSBjb21wdXRlZCBub3JtIG9mCisgICAgLy8gY29sdW1uIGsuCisgICAgbV9jb2xOb3Jtc0RpcmVjdC5jb2VmZlJlZihrKSA9IG1fcXIuY29sKGspLm5vcm0oKTsKKyAgICBtX2NvbE5vcm1zVXBkYXRlZC5jb2VmZlJlZihrKSA9IG1fY29sTm9ybXNEaXJlY3QuY29lZmZSZWYoayk7CisgIH0KKworICBSZWFsU2NhbGFyIHRocmVzaG9sZF9oZWxwZXIgPSAgbnVtZXh0OjphYnMyPFJlYWxTY2FsYXI+KG1fY29sTm9ybXNVcGRhdGVkLm1heENvZWZmKCkgKiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkgLyBSZWFsU2NhbGFyKHJvd3MpOworICBSZWFsU2NhbGFyIG5vcm1fZG93bmRhdGVfdGhyZXNob2xkID0gbnVtZXh0OjpzcXJ0KE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpKTsKKworICBtX25vbnplcm9fcGl2b3RzID0gc2l6ZTsgLy8gdGhlIGdlbmVyaWMgY2FzZSBpcyB0aGF0IGluIHdoaWNoIGFsbCBwaXZvdHMgYXJlIG5vbnplcm8gKGludmVydGlibGUgY2FzZSkKKyAgbV9tYXhwaXZvdCA9IFJlYWxTY2FsYXIoMCk7CisKKyAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICB7CisgICAgLy8gZmlyc3QsIHdlIGxvb2sgdXAgaW4gb3VyIHRhYmxlIG1fY29sTm9ybXNVcGRhdGVkIHdoaWNoIGNvbHVtbiBoYXMgdGhlIGJpZ2dlc3Qgbm9ybQorICAgIEluZGV4IGJpZ2dlc3RfY29sX2luZGV4OworICAgIFJlYWxTY2FsYXIgYmlnZ2VzdF9jb2xfc3Ffbm9ybSA9IG51bWV4dDo6YWJzMihtX2NvbE5vcm1zVXBkYXRlZC50YWlsKGNvbHMtaykubWF4Q29lZmYoJmJpZ2dlc3RfY29sX2luZGV4KSk7CisgICAgYmlnZ2VzdF9jb2xfaW5kZXggKz0gazsKKworICAgIC8vIFRyYWNrIHRoZSBudW1iZXIgb2YgbWVhbmluZ2Z1bCBwaXZvdHMgYnV0IGRvIG5vdCBzdG9wIHRoZSBkZWNvbXBvc2l0aW9uIHRvIG1ha2UKKyAgICAvLyBzdXJlIHRoYXQgdGhlIGluaXRpYWwgbWF0cml4IGlzIHByb3Blcmx5IHJlcHJvZHVjZWQuIFNlZSBidWcgOTQxLgorICAgIGlmKG1fbm9uemVyb19waXZvdHM9PXNpemUgJiYgYmlnZ2VzdF9jb2xfc3Ffbm9ybSA8IHRocmVzaG9sZF9oZWxwZXIgKiBSZWFsU2NhbGFyKHJvd3MtaykpCisgICAgICBtX25vbnplcm9fcGl2b3RzID0gazsKKworICAgIC8vIGFwcGx5IHRoZSB0cmFuc3Bvc2l0aW9uIHRvIHRoZSBjb2x1bW5zCisgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaykgPSBiaWdnZXN0X2NvbF9pbmRleDsKKyAgICBpZihrICE9IGJpZ2dlc3RfY29sX2luZGV4KSB7CisgICAgICBtX3FyLmNvbChrKS5zd2FwKG1fcXIuY29sKGJpZ2dlc3RfY29sX2luZGV4KSk7CisgICAgICBzdGQ6OnN3YXAobV9jb2xOb3Jtc1VwZGF0ZWQuY29lZmZSZWYoayksIG1fY29sTm9ybXNVcGRhdGVkLmNvZWZmUmVmKGJpZ2dlc3RfY29sX2luZGV4KSk7CisgICAgICBzdGQ6OnN3YXAobV9jb2xOb3Jtc0RpcmVjdC5jb2VmZlJlZihrKSwgbV9jb2xOb3Jtc0RpcmVjdC5jb2VmZlJlZihiaWdnZXN0X2NvbF9pbmRleCkpOworICAgICAgKytudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gZ2VuZXJhdGUgdGhlIGhvdXNlaG9sZGVyIHZlY3Rvciwgc3RvcmUgaXQgYmVsb3cgdGhlIGRpYWdvbmFsCisgICAgUmVhbFNjYWxhciBiZXRhOworICAgIG1fcXIuY29sKGspLnRhaWwocm93cy1rKS5tYWtlSG91c2Vob2xkZXJJblBsYWNlKG1faENvZWZmcy5jb2VmZlJlZihrKSwgYmV0YSk7CisKKyAgICAvLyBhcHBseSB0aGUgaG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50CisgICAgbV9xci5jb2VmZlJlZihrLGspID0gYmV0YTsKKworICAgIC8vIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGRpYWdvbmFsIGNvZWZmaWNpZW50cworICAgIGlmKGFicyhiZXRhKSA+IG1fbWF4cGl2b3QpIG1fbWF4cGl2b3QgPSBhYnMoYmV0YSk7CisKKyAgICAvLyBhcHBseSB0aGUgaG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24KKyAgICBtX3FyLmJvdHRvbVJpZ2h0Q29ybmVyKHJvd3MtaywgY29scy1rLTEpCisgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KG1fcXIuY29sKGspLnRhaWwocm93cy1rLTEpLCBtX2hDb2VmZnMuY29lZmZSZWYoayksICZtX3RlbXAuY29lZmZSZWYoaysxKSk7CisKKyAgICAvLyB1cGRhdGUgb3VyIHRhYmxlIG9mIG5vcm1zIG9mIHRoZSBjb2x1bW5zCisgICAgZm9yIChJbmRleCBqID0gayArIDE7IGogPCBjb2xzOyArK2opIHsKKyAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50cyB0aGUgc3RhYmxlIG5vcm0gZG93bmdyYWRlIHN0ZXAgZGlzY3Vzc2VkIGluCisgICAgICAvLyBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2xhd25zcGRmL2xhd24xNzYucGRmCisgICAgICAvLyBhbmQgdXNlZCBpbiBMQVBBQ0sgcm91dGluZXMgeEdFUVBGIGFuZCB4R0VRUDMuCisgICAgICAvLyBTZWUgbGluZXMgMjc4LTI5NyBpbiBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC9kYy9kZjQvc2dlcXBmXzhmX3NvdXJjZS5odG1sCisgICAgICBpZiAobV9jb2xOb3Jtc1VwZGF0ZWQuY29lZmZSZWYoaikgIT0gUmVhbFNjYWxhcigwKSkgeworICAgICAgICBSZWFsU2NhbGFyIHRlbXAgPSBhYnMobV9xci5jb2VmZlJlZihrLCBqKSkgLyBtX2NvbE5vcm1zVXBkYXRlZC5jb2VmZlJlZihqKTsKKyAgICAgICAgdGVtcCA9IChSZWFsU2NhbGFyKDEpICsgdGVtcCkgKiAoUmVhbFNjYWxhcigxKSAtIHRlbXApOworICAgICAgICB0ZW1wID0gdGVtcCA8ICBSZWFsU2NhbGFyKDApID8gUmVhbFNjYWxhcigwKSA6IHRlbXA7CisgICAgICAgIFJlYWxTY2FsYXIgdGVtcDIgPSB0ZW1wICogbnVtZXh0OjphYnMyPFJlYWxTY2FsYXI+KG1fY29sTm9ybXNVcGRhdGVkLmNvZWZmUmVmKGopIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xOb3Jtc0RpcmVjdC5jb2VmZlJlZihqKSk7CisgICAgICAgIGlmICh0ZW1wMiA8PSBub3JtX2Rvd25kYXRlX3RocmVzaG9sZCkgeworICAgICAgICAgIC8vIFRoZSB1cGRhdGVkIG5vcm0gaGFzIGJlY29tZSB0b28gaW5hY2N1cmF0ZSBzbyByZS1jb21wdXRlIHRoZSBjb2x1bW4KKyAgICAgICAgICAvLyBub3JtIGRpcmVjdGx5LgorICAgICAgICAgIG1fY29sTm9ybXNEaXJlY3QuY29lZmZSZWYoaikgPSBtX3FyLmNvbChqKS50YWlsKHJvd3MgLSBrIC0gMSkubm9ybSgpOworICAgICAgICAgIG1fY29sTm9ybXNVcGRhdGVkLmNvZWZmUmVmKGopID0gbV9jb2xOb3Jtc0RpcmVjdC5jb2VmZlJlZihqKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX2NvbE5vcm1zVXBkYXRlZC5jb2VmZlJlZihqKSAqPSBudW1leHQ6OnNxcnQodGVtcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBtX2NvbHNQZXJtdXRhdGlvbi5zZXRJZGVudGl0eShQZXJtSW5kZXhUeXBlKGNvbHMpKTsKKyAgZm9yKFBlcm1JbmRleFR5cGUgayA9IDA7IGsgPCBzaXplLyptX25vbnplcm9fcGl2b3RzKi87ICsraykKKyAgICBtX2NvbHNQZXJtdXRhdGlvbi5hcHBseVRyYW5zcG9zaXRpb25PblRoZVJpZ2h0KGssIFBlcm1JbmRleFR5cGUobV9jb2xzVHJhbnNwb3NpdGlvbnMuY29lZmYoaykpKTsKKworICBtX2RldF9wcSA9IChudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMlMikgPyAtMSA6IDE7CisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7Cit9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgRHN0VHlwZT4KK3ZvaWQgQ29sUGl2SG91c2Vob2xkZXJRUjxfTWF0cml4VHlwZT46Ol9zb2x2ZV9pbXBsKGNvbnN0IFJoc1R5cGUgJnJocywgRHN0VHlwZSAmZHN0KSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocmhzLnJvd3MoKSA9PSByb3dzKCkpOworCisgIGNvbnN0IEluZGV4IG5vbnplcm9fcGl2b3RzID0gbm9uemVyb1Bpdm90cygpOworCisgIGlmKG5vbnplcm9fcGl2b3RzID09IDApCisgIHsKKyAgICBkc3Quc2V0WmVybygpOworICAgIHJldHVybjsKKyAgfQorCisgIHR5cGVuYW1lIFJoc1R5cGU6OlBsYWluT2JqZWN0IGMocmhzKTsKKworICAvLyBOb3RlIHRoYXQgdGhlIG1hdHJpeCBRID0gSF8wXiogSF8xXiouLi4gc28gaXRzIGludmVyc2UgaXMgUV4qID0gKEhfMCBIXzEgLi4uKV5UCisgIGMuYXBwbHlPblRoZUxlZnQoaG91c2Vob2xkZXJTZXF1ZW5jZShtX3FyLCBtX2hDb2VmZnMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRMZW5ndGgobm9uemVyb19waXZvdHMpCisgICAgICAgICAgICAgICAgICAgIC50cmFuc3Bvc2UoKQorICAgICk7CisKKyAgbV9xci50b3BMZWZ0Q29ybmVyKG5vbnplcm9fcGl2b3RzLCBub256ZXJvX3Bpdm90cykKKyAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgLnNvbHZlSW5QbGFjZShjLnRvcFJvd3Mobm9uemVyb19waXZvdHMpKTsKKworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBub256ZXJvX3Bpdm90czsgKytpKSBkc3Qucm93KG1fY29sc1Blcm11dGF0aW9uLmluZGljZXMoKS5jb2VmZihpKSkgPSBjLnJvdyhpKTsKKyAgZm9yKEluZGV4IGkgPSBub256ZXJvX3Bpdm90czsgaSA8IGNvbHMoKTsgKytpKSBkc3Qucm93KG1fY29sc1Blcm11dGF0aW9uLmluZGljZXMoKS5jb2VmZihpKSkuc2V0WmVybygpOworfQorI2VuZGlmCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBJbnZlcnNlPENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6U2NhbGFyPiwgRGVuc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRclR5cGU7CisgIHR5cGVkZWYgSW52ZXJzZTxRclR5cGU+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgUXJUeXBlOjpTY2FsYXI+ICYpCisgIHsKKyAgICBkc3QgPSBzcmMubmVzdGVkRXhwcmVzc2lvbigpLnNvbHZlKE1hdHJpeFR5cGU6OklkZW50aXR5KHNyYy5yb3dzKCksIHNyYy5jb2xzKCkpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IFEgYXMgYSBzZXF1ZW5jZSBvZiBob3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMuCisgICogWW91IGNhbiBleHRyYWN0IHRoZSBtZWFuaW5nZnVsIHBhcnQgb25seSBieSB1c2luZzoKKyAgKiBcY29kZSBxci5ob3VzZWhvbGRlclEoKS5zZXRMZW5ndGgocXIubm9uemVyb1Bpdm90cygpKSBcZW5kY29kZSovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6SG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPgorICA6OmhvdXNlaG9sZGVyUSgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUobV9xciwgbV9oQ29lZmZzLmNvbmp1Z2F0ZSgpKTsKK30KKworLyoqIFxyZXR1cm4gdGhlIGNvbHVtbi1waXZvdGluZyBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIENvbFBpdkhvdXNlaG9sZGVyUVIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBDb2xQaXZIb3VzZWhvbGRlclFSPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6Y29sUGl2SG91c2Vob2xkZXJRcigpIGNvbnN0Cit7CisgIHJldHVybiBDb2xQaXZIb3VzZWhvbGRlclFSPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTFBJVk9USU5HSE9VU0VIT0xERVJRUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvUVIvQ29sUGl2SG91c2Vob2xkZXJRUl9MQVBBQ0tFLmggYi9FaWdlbi9zcmMvUVIvQ29sUGl2SG91c2Vob2xkZXJRUl9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NjUxZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSX0xBUEFDS0UuaApAQCAtMCwwICsxLDk3IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gTEFQQUNLZQorICogICAgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIGNvbHVtbiBwaXZvdGluZyBiYXNlZCBvbgorICogICAgTEFQQUNLRV8/Z2VxcDMgZnVuY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fQ09MUElWT1RJTkdIT1VTRUhPTERFUlFSX0xBUEFDS0VfSAorI2RlZmluZSBFSUdFTl9DT0xQSVZPVElOR0hPVVNFSE9MREVSUVJfTEFQQUNLRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGludGVybmFsIFNwZWNpYWxpemF0aW9uIGZvciB0aGUgZGF0YSB0eXBlcyBzdXBwb3J0ZWQgYnkgTEFQQUNLZSAqLworCisjZGVmaW5lIEVJR0VOX0xBUEFDS0VfUVJfQ09MUElWKEVJR1RZUEUsIExBUEFDS0VfVFlQRSwgTEFQQUNLRV9QUkVGSVgsIEVJR0NPTFJPVywgTEFQQUNLRV9DT0xST1cpIFwKK3RlbXBsYXRlPD4gdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRUeXBlPiBpbmxpbmUgXAorQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XLCBEeW5hbWljLCBEeW5hbWljPiA+JiBcCitDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1csIER5bmFtaWMsIER5bmFtaWM+ID46OmNvbXB1dGUoIFwKKyAgICAgICAgICAgICAgY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkgXAorXAoreyBcCisgIHVzaW5nIHN0ZDo6YWJzOyBcCisgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsgXAorICB0eXBlZGVmIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgXAorICBJbmRleCByb3dzID0gbWF0cml4LnJvd3MoKTtcCisgIEluZGV4IGNvbHMgPSBtYXRyaXguY29scygpO1wKK1wKKyAgbV9xciA9IG1hdHJpeDtcCisgIEluZGV4IHNpemUgPSBtX3FyLmRpYWdvbmFsU2l6ZSgpO1wKKyAgbV9oQ29lZmZzLnJlc2l6ZShzaXplKTtcCitcCisgIG1fY29sc1RyYW5zcG9zaXRpb25zLnJlc2l6ZShjb2xzKTtcCisgIC8qSW5kZXggbnVtYmVyX29mX3RyYW5zcG9zaXRpb25zID0gMDsqLyBcCitcCisgIG1fbm9uemVyb19waXZvdHMgPSAwOyBcCisgIG1fbWF4cGl2b3QgPSBSZWFsU2NhbGFyKDApO1wKKyAgbV9jb2xzUGVybXV0YXRpb24ucmVzaXplKGNvbHMpOyBcCisgIG1fY29sc1Blcm11dGF0aW9uLmluZGljZXMoKS5zZXRaZXJvKCk7IFwKK1wKKyAgbGFwYWNrX2ludCBsZGEgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxsYXBhY2tfaW50LEluZGV4PihtX3FyLm91dGVyU3RyaWRlKCkpOyBcCisgIGxhcGFja19pbnQgbWF0cml4X29yZGVyID0gTEFQQUNLRV9DT0xST1c7IFwKKyAgTEFQQUNLRV8jI0xBUEFDS0VfUFJFRklYIyNnZXFwMyggbWF0cml4X29yZGVyLCBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxsYXBhY2tfaW50LEluZGV4Pihyb3dzKSwgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludCxJbmRleD4oY29scyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMQVBBQ0tFX1RZUEUqKW1fcXIuZGF0YSgpLCBsZGEsIChsYXBhY2tfaW50KiltX2NvbHNQZXJtdXRhdGlvbi5pbmRpY2VzKCkuZGF0YSgpLCAoTEFQQUNLRV9UWVBFKiltX2hDb2VmZnMuZGF0YSgpKTsgXAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgIG1fbWF4cGl2b3Q9bV9xci5kaWFnb25hbCgpLmN3aXNlQWJzKCkubWF4Q29lZmYoKTsgXAorICBtX2hDb2VmZnMuYWRqb2ludEluUGxhY2UoKTsgXAorICBSZWFsU2NhbGFyIHByZW11bHRpcGxpZWRfdGhyZXNob2xkID0gYWJzKG1fbWF4cGl2b3QpICogdGhyZXNob2xkKCk7IFwKKyAgbGFwYWNrX2ludCAqcGVybSA9IG1fY29sc1Blcm11dGF0aW9uLmluZGljZXMoKS5kYXRhKCk7IFwKKyAgZm9yKEluZGV4IGk9MDtpPHNpemU7aSsrKSB7IFwKKyAgICBtX25vbnplcm9fcGl2b3RzICs9IChhYnMobV9xci5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKTtcCisgIH0gXAorICBmb3IoSW5kZXggaT0wO2k8Y29scztpKyspIHBlcm1baV0tLTtcCitcCisgIC8qbV9kZXRfcHEgPSAobnVtYmVyX29mX3RyYW5zcG9zaXRpb25zJTIpID8gLTEgOiAxOyAgLy8gVE9ETzogSXQncyBub3QgbmVlZGVkIG5vdzsgZml4IHVwb24gYXZhaWxhYmlsaXR5IGluIEVpZ2VuICovIFwKK1wKKyAgcmV0dXJuICp0aGlzOyBcCit9CisKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkLCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGZsb2F0LCAgICBmbG9hdCwgICAgICAgICBzLCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIHosIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTEFQQUNLRV9RUl9DT0xQSVYoc2NvbXBsZXgsIGxhcGFja19jb21wbGV4X2Zsb2F0LCAgYywgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCisKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGZsb2F0LCAgICBmbG9hdCwgICAgICAgICBzLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX0xBUEFDS0VfUVJfQ09MUElWKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIHosIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTEFQQUNLRV9RUl9DT0xQSVYoc2NvbXBsZXgsIGxhcGFja19jb21wbGV4X2Zsb2F0LCAgYywgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09MUElWT1RJTkdIT1VTRUhPTERFUlFSX0xBUEFDS0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1FSL0NvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24uaCBiL0VpZ2VuL3NyYy9RUi9Db21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNjM3YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Db21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uLmgKQEAgLTAsMCArMSw1NjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IFJhc211cyBNdW5rIExhcnNlbiA8cm1sYXJzZW5AZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09NUExFVEVPUlRIT0dPTkFMREVDT01QT1NJVElPTl9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVRFT1JUSE9HT05BTERFQ09NUE9TSVRJT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorc3RydWN0IHRyYWl0czxDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPF9NYXRyaXhUeXBlPiA+CisgICAgOiB0cmFpdHM8X01hdHJpeFR5cGU+IHsKKyAgZW51bSB7IEZsYWdzID0gMCB9OworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgUVJfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbgorICAqCisgICogXGJyaWVmIENvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiAoQ09EKSBvZiBhIG1hdHJpeC4KKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgQ09ELgorICAqCisgICogVGhpcyBjbGFzcyBwZXJmb3JtcyBhIHJhbmstcmV2ZWFsaW5nIGNvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhCisgICogbWF0cml4ICBcYiBBIGludG8gbWF0cmljZXMgXGIgUCwgXGIgUSwgXGIgVCwgYW5kIFxiIFogc3VjaCB0aGF0CisgICogXGZbCisgICogIFxtYXRoYmZ7QX0gXCwgXG1hdGhiZntQfSA9IFxtYXRoYmZ7UX0gXCwKKyAgKiAgICAgICAgICAgICAgICAgICAgIFxiZWdpbntibWF0cml4fSBcbWF0aGJme1R9ICYgIFxtYXRoYmZ7MH0gXFwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbWF0aGJmezB9ICYgXG1hdGhiZnswfSBcZW5ke2JtYXRyaXh9IFwsIFxtYXRoYmZ7Wn0KKyAgKiBcZl0KKyAgKiBieSB1c2luZyBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMuIEhlcmUsIFxiIFAgaXMgYSBwZXJtdXRhdGlvbiBtYXRyaXgsCisgICogXGIgUSBhbmQgXGIgWiBhcmUgdW5pdGFyeSBtYXRyaWNlcyBhbmQgXGIgVCBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBvZgorICAqIHNpemUgcmFuay1ieS1yYW5rLiBcYiBBIG1heSBiZSByYW5rIGRlZmljaWVudC4KKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgdGhlIFxsaW5rIElucGxhY2VEZWNvbXBvc2l0aW9uIGlucGxhY2UgZGVjb21wb3NpdGlvbiBcZW5kbGluayBtZWNoYW5pc20uCisgICogCisgICogXHNhIE1hdHJpeEJhc2U6OmNvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24oKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorY2xhc3MgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiB7CisgcHVibGljOgorICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9kaWFnX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgSENvZWZmc1R5cGU7CisgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPgorICAgICAgUGVybXV0YXRpb25UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxNYXRyaXhUeXBlLCBJbmRleD46OnR5cGUKKyAgICAgIEludFJvd1ZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIFJvd1ZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXI+Ojp0eXBlCisgICAgICBSZWFsUm93VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBIb3VzZWhvbGRlclNlcXVlbmNlPAorICAgICAgTWF0cml4VHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgSENvZWZmc1R5cGU6OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlPgorICAgICAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZTo6SW5kZXggUGVybUluZGV4VHlwZTsKKworIHB1YmxpYzoKKyAgLyoqCisgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgKgorICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYQorICAgKiBcYyBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uOjpjb21wdXRlKGNvbnN0KiBNYXRyaXhUeXBlJikuCisgICAqLworICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uKCkgOiBtX2NwcXIoKSwgbV96Q29lZmZzKCksIG1fdGVtcCgpIHt9CisKKyAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICoKKyAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICogXHNhIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24oKQorICAgKi8KKyAgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbihJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX2NwcXIocm93cywgY29scyksIG1fekNvZWZmcygoc3RkOjptaW4pKHJvd3MsIGNvbHMpKSwgbV90ZW1wKGNvbHMpIHt9CisKKyAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGEgY29tcGxldGUgb3J0aG9nb25hbCBkZWNvbXBvc2l0aW9uIGZyb20gYSBnaXZlbgorICAgKiBtYXRyaXguCisgICAqCisgICAqIFRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIGNvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiBvZiB0aGUKKyAgICogbWF0cml4IFxhIG1hdHJpeCBieSBjYWxsaW5nIHRoZSBtZXRob2QgY29tcHV0ZSgpLiBUaGUgZGVmYXVsdAorICAgKiB0aHJlc2hvbGQgZm9yIHJhbmsgZGV0ZXJtaW5hdGlvbiB3aWxsIGJlIHVzZWQuIEl0IGlzIGEgc2hvcnQgY3V0IGZvcjoKKyAgICoKKyAgICogXGNvZGUKKyAgICogQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBjb2QobWF0cml4LnJvd3MoKSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LmNvbHMoKSk7CisgICAqIGNvZC5zZXRUaHJlc2hvbGQoRGVmYXVsdCk7CisgICAqIGNvZC5jb21wdXRlKG1hdHJpeCk7CisgICAqIFxlbmRjb2RlCisgICAqCisgICAqIFxzYSBjb21wdXRlKCkKKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dFR5cGU+CisgIGV4cGxpY2l0IENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24oY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9jcHFyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3pDb2VmZnMoKHN0ZDo6bWluKShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSksCisgICAgICAgIG1fdGVtcChtYXRyaXguY29scygpKQorICB7CisgICAgY29tcHV0ZShtYXRyaXguZGVyaXZlZCgpKTsKKyAgfQorCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIGNvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgKgorICAgICogVGhpcyBvdmVybG9hZGVkIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGZvciBcbGluayBJbnBsYWNlRGVjb21wb3NpdGlvbiBpbnBsYWNlIGRlY29tcG9zaXRpb24gXGVuZGxpbmsgd2hlbiBcYyBNYXRyaXhUeXBlIGlzIGEgRWlnZW46OlJlZi4KKyAgICAqCisgICAgKiBcc2EgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbihjb25zdCBFaWdlbkJhc2UmKQorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgZXhwbGljaXQgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbihFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICAgIDogbV9jcHFyKG1hdHJpeC5kZXJpdmVkKCkpLAorICAgICAgbV96Q29lZmZzKChzdGQ6Om1pbikobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSkpLAorICAgICAgbV90ZW1wKG1hdHJpeC5jb2xzKCkpCisgIHsKKyAgICBjb21wdXRlSW5QbGFjZSgpOworICB9CisKKworICAvKiogVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIG1pbmltdW0tbm9ybSBzb2x1dGlvbiBYIHRvIGEgbGVhc3Qgc3F1YXJlcworICAgKiBwcm9ibGVtIFxmW1xtYXRocm17bWluaW1pemV9IFx8QSBYIC0gQlx8LCBcZl0gd2hlcmUgXGIgQSBpcyB0aGUgbWF0cml4IG9mCisgICAqIHdoaWNoIFxjICp0aGlzIGlzIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsIGRlY29tcG9zaXRpb24uCisgICAqCisgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kIHNpZGVzIG9mIHRoZSBwcm9ibGVtIHRvIHNvbHZlLgorICAgKgorICAgKiBccmV0dXJucyBhIHNvbHV0aW9uLgorICAgKgorICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KKyAgaW5saW5lIGNvbnN0IFNvbHZlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24sIFJocz4gc29sdmUoCisgICAgICBjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0IHsKKyAgICBlaWdlbl9hc3NlcnQobV9jcHFyLm1faXNJbml0aWFsaXplZCAmJgorICAgICAgICAgICAgICAgICAiQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgcmV0dXJuIFNvbHZlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24sIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgfQorCisgIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyUSh2b2lkKSBjb25zdDsKKyAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgbWF0cml4USh2b2lkKSBjb25zdCB7IHJldHVybiBtX2NwcXIuaG91c2Vob2xkZXJRKCk7IH0KKworICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCBcYiBaLgorICAgKi8KKyAgTWF0cml4VHlwZSBtYXRyaXhaKCkgY29uc3QgeworICAgIE1hdHJpeFR5cGUgWiA9IE1hdHJpeFR5cGU6OklkZW50aXR5KG1fY3Bxci5jb2xzKCksIG1fY3Bxci5jb2xzKCkpOworICAgIGFwcGx5WkFkam9pbnRPblRoZUxlZnRJblBsYWNlKFopOworICAgIHJldHVybiBaLmFkam9pbnQoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdoZXJlIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsCisgICAqIGRlY29tcG9zaXRpb24gaXMgc3RvcmVkCisgICAqLworICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhRVFooKSBjb25zdCB7IHJldHVybiBtX2NwcXIubWF0cml4UVIoKTsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdoZXJlIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsCisgICAqIGRlY29tcG9zaXRpb24gaXMgc3RvcmVkLgorICAgKiBcd2FybmluZyBUaGUgc3RyaWN0IGxvd2VyIHBhcnQgYW5kIFxjb2RlIGNvbHMoKSAtIHJhbmsoKSBcZW5kY29kZSByaWdodAorICAgKiBjb2x1bW5zIG9mIHRoaXMgbWF0cml4IGNvbnRhaW5zIGludGVybmFsIHZhbHVlcy4KKyAgICogT25seSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IHNob3VsZCBiZSByZWZlcmVuY2VkLiBUbyBnZXQgaXQsIHVzZQorICAgKiBcY29kZSBtYXRyaXhUKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgXGVuZGNvZGUKKyAgICogRm9yIHJhbmstZGVmaWNpZW50IG1hdHJpY2VzLCB1c2UKKyAgICogXGNvZGUKKyAgICogbWF0cml4UigpLnRvcExlZnRDb3JuZXIocmFuaygpLCByYW5rKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAqIFxlbmRjb2RlCisgICAqLworICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhUKCkgY29uc3QgeyByZXR1cm4gbV9jcHFyLm1hdHJpeFFSKCk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRUeXBlPgorICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uJiBjb21wdXRlKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpIHsKKyAgICAvLyBDb21wdXRlIHRoZSBjb2x1bW4gcGl2b3RlZCBRUiBmYWN0b3JpemF0aW9uIEEgUCA9IFEgUi4KKyAgICBtX2NwcXIuY29tcHV0ZShtYXRyaXgpOworICAgIGNvbXB1dGVJblBsYWNlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gcGVybXV0YXRpb24gbWF0cml4ICovCisgIGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgY29sc1Blcm11dGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtX2NwcXIuY29sc1Blcm11dGF0aW9uKCk7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAqICp0aGlzIGlzIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhcgorICAgKiBjb21wbGV4aXR5ICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICogYXMgdGhlIGNvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgKgorICAgKiBcbm90ZSBUaGlzIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgICoKKyAgICogXHdhcm5pbmcgYSBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSBiaWcgb3Igc21hbGwsIHNvIGZvciBtYXRyaWNlcworICAgKiBvZiBsYXJnZSBlbm91Z2ggZGltZW5zaW9uLCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgKiBPbmUgd2F5IHRvIHdvcmsgYXJvdW5kIHRoYXQgaXMgdG8gdXNlIGxvZ0Fic0RldGVybWluYW50KCkgaW5zdGVhZC4KKyAgICoKKyAgICogXHNhIGxvZ0Fic0RldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICovCisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgYWJzRGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAvKiogXHJldHVybnMgdGhlIG5hdHVyYWwgbG9nIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlCisgICAqIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgY29tcGxldGUgb3J0aG9nb25hbCBkZWNvbXBvc2l0aW9uLiBJdCBoYXMKKyAgICogb25seSBsaW5lYXIgY29tcGxleGl0eSAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlCisgICAqIHNxdWFyZSBtYXRyaXgpIGFzIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbgorICAgKiBjb21wdXRlZC4KKyAgICoKKyAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAqCisgICAqIFxub3RlIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byB3b3JrIGFyb3VuZCB0aGUgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cKKyAgICogdGhhdCdzIGluaGVyZW50IHRvIGRldGVybWluYW50IGNvbXB1dGF0aW9uLgorICAgKgorICAgKiBcc2EgYWJzRGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgKi8KKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsCisgICAqIGRlY29tcG9zaXRpb24uCisgICAqCisgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAqIG5vbnplcm8uIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkKKyAgICogY2FsbGluZyBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgKi8KKyAgaW5saW5lIEluZGV4IHJhbmsoKSBjb25zdCB7IHJldHVybiBtX2NwcXIucmFuaygpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaW1lbnNpb24gb2YgdGhlIGtlcm5lbCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZQorICAgKiBjb21wbGV0ZSBvcnRob2dvbmFsIGRlY29tcG9zaXRpb24uCisgICAqCisgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAqIG5vbnplcm8uIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkKKyAgICogY2FsbGluZyBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgKi8KKyAgaW5saW5lIEluZGV4IGRpbWVuc2lvbk9mS2VybmVsKCkgY29uc3QgeyByZXR1cm4gbV9jcHFyLmRpbWVuc2lvbk9mS2VybmVsKCk7IH0KKworICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBkZWNvbXBvc2l0aW9uIHJlcHJlc2VudHMKKyAgICogYW4gaW5qZWN0aXZlIGxpbmVhciBtYXAsIGkuZS4gaGFzIHRyaXZpYWwga2VybmVsOyBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAqIG5vbnplcm8uIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkKKyAgICogY2FsbGluZyBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgKi8KKyAgaW5saW5lIGJvb2wgaXNJbmplY3RpdmUoKSBjb25zdCB7IHJldHVybiBtX2NwcXIuaXNJbmplY3RpdmUoKTsgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIGRlY29tcG9zaXRpb24gcmVwcmVzZW50cworICAgKiBhIHN1cmplY3RpdmUgbGluZWFyIG1hcDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgKiBub256ZXJvLiBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5CisgICAqIGNhbGxpbmcgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICovCisgIGlubGluZSBib29sIGlzU3VyamVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY3Bxci5pc1N1cmplY3RpdmUoKTsgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIGNvbXBsZXRlIG9ydGhvZ29uYWwKKyAgICogZGVjb21wb3NpdGlvbiBpcyBpbnZlcnRpYmxlLgorICAgKgorICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgKiBub256ZXJvLiBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5CisgICAqIGNhbGxpbmcgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICovCisgIGlubGluZSBib29sIGlzSW52ZXJ0aWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fY3Bxci5pc0ludmVydGlibGUoKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgcHNldWRvLWludmVyc2Ugb2YgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgY29tcGxldGUKKyAgICogb3J0aG9nb25hbCBkZWNvbXBvc2l0aW9uLgorICAgKiBcd2FybmluZzogRG8gbm90IGNvbXB1dGUgXGMgdGhpcy0+cHNldWRvSW52ZXJzZSgpKnJocyB0byBzb2x2ZSBhIGxpbmVhciBzeXN0ZW1zLgorICAgKiBJdCBpcyBtb3JlIGVmZmljaWVudCBhbmQgbnVtZXJpY2FsbHkgc3RhYmxlIHRvIGNhbGwgXGMgdGhpcy0+c29sdmUocmhzKS4KKyAgICovCisgIGlubGluZSBjb25zdCBJbnZlcnNlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24+IHBzZXVkb0ludmVyc2UoKSBjb25zdAorICB7CisgICAgcmV0dXJuIEludmVyc2U8Q29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbj4oKnRoaXMpOworICB9CisKKyAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2NwcXIucm93cygpOyB9CisgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jcHFyLmNvbHMoKTsgfQorCisgIC8qKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cyB1c2VkCisgICAqIHRvIHJlcHJlc2VudCB0aGUgZmFjdG9yIFxjIFEuCisgICAqCisgICAqIEZvciBhZHZhbmNlZCB1c2VzIG9ubHkuCisgICAqLworICBpbmxpbmUgY29uc3QgSENvZWZmc1R5cGUmIGhDb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2NwcXIuaENvZWZmcygpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3Igb2YgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzCisgICAqIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmYWN0b3IgXGMgWi4KKyAgICoKKyAgICogRm9yIGFkdmFuY2VkIHVzZXMgb25seS4KKyAgICovCisgIGNvbnN0IEhDb2VmZnNUeXBlJiB6Q29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV96Q29lZmZzOyB9CisKKyAgLyoqIEFsbG93cyB0byBwcmVzY3JpYmUgYSB0aHJlc2hvbGQgdG8gYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMsIHN1Y2ggYXMKKyAgICogcmFuaygpLCB3aG8gbmVlZCB0byBkZXRlcm1pbmUgd2hlbiBwaXZvdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICogTW9zdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgY29tcHV0ZSgpLgorICAgKgorICAgKiBXaGVuIGl0IG5lZWRzIHRvIGdldCB0aGUgdGhyZXNob2xkIHZhbHVlLCBFaWdlbiBjYWxscyB0aHJlc2hvbGQoKS4gQnkKKyAgICogZGVmYXVsdCwgdGhpcyB1c2VzIGEgZm9ybXVsYSB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhIHJlYXNvbmFibGUKKyAgICogdGhyZXNob2xkLiBPbmNlIHlvdSBoYXZlIGNhbGxlZCB0aGUgcHJlc2VudCBtZXRob2QKKyAgICogc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKSwgeW91ciB2YWx1ZSBpcyB1c2VkIGluc3RlYWQuCisgICAqCisgICAqIFxwYXJhbSB0aHJlc2hvbGQgVGhlIG5ldyB2YWx1ZSB0byB1c2UgYXMgdGhlIHRocmVzaG9sZC4KKyAgICoKKyAgICogQSBwaXZvdCB3aWxsIGJlIGNvbnNpZGVyZWQgbm9uemVybyBpZiBpdHMgYWJzb2x1dGUgdmFsdWUgaXMgc3RyaWN0bHkKKyAgICogZ3JlYXRlciB0aGFuCisgICAqICBcZiQgXHZlcnQgcGl2b3QgXHZlcnQgXGxlcXNsYW50IHRocmVzaG9sZCBcdGltZXMgXHZlcnQgbWF4cGl2b3QgXHZlcnQgXGYkCisgICAqIHdoZXJlIG1heHBpdm90IGlzIHRoZSBiaWdnZXN0IHBpdm90LgorICAgKgorICAgKiBJZiB5b3Ugd2FudCB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGNhbGwKKyAgICogc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICovCisgIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24mIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJiB0aHJlc2hvbGQpIHsKKyAgICBtX2NwcXIuc2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIEFsbG93cyB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGxldHRpbmcgRWlnZW4gdXNlIGl0cyBkZWZhdWx0CisgICAqIGZvcm11bGEgZm9yIGRldGVybWluaW5nIHRoZSB0aHJlc2hvbGQuCisgICAqCisgICAqIFlvdSBzaG91bGQgcGFzcyB0aGUgc3BlY2lhbCBvYmplY3QgRWlnZW46OkRlZmF1bHQgYXMgcGFyYW1ldGVyIGhlcmUuCisgICAqIFxjb2RlIHFyLnNldFRocmVzaG9sZChFaWdlbjo6RGVmYXVsdCk7IFxlbmRjb2RlCisgICAqCisgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgKi8KKyAgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiYgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkgeworICAgIG1fY3Bxci5zZXRUaHJlc2hvbGQoRGVmYXVsdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMgc3VjaCBhcyByYW5rKCkuCisgICAqCisgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgKi8KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQoKSBjb25zdCB7IHJldHVybiBtX2NwcXIudGhyZXNob2xkKCk7IH0KKworICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBub256ZXJvIHBpdm90cyBpbiB0aGUgY29tcGxldGUgb3J0aG9nb25hbAorICAgKiBkZWNvbXBvc2l0aW9uLiBIZXJlIG5vbnplcm8gaXMgbWVhbnQgaW4gdGhlIGV4YWN0IHNlbnNlLCBub3QgaW4gYQorICAgKiBmdXp6eSBzZW5zZS4gU28gdGhhdCBub3Rpb24gaXNuJ3QgcmVhbGx5IGludHJpbnNpY2FsbHkgaW50ZXJlc3RpbmcsCisgICAqIGJ1dCBpdCBpcyBzdGlsbCB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgYWxnb3JpdGhtcy4KKyAgICoKKyAgICogXHNhIHJhbmsoKQorICAgKi8KKyAgaW5saW5lIEluZGV4IG5vbnplcm9QaXZvdHMoKSBjb25zdCB7IHJldHVybiBtX2NwcXIubm9uemVyb1Bpdm90cygpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYmlnZ2VzdCBwaXZvdCwgaS5lLiB0aGUgYmlnZ2VzdAorICAgKiAgICAgICAgICBkaWFnb25hbCBjb2VmZmljaWVudCBvZiBSLgorICAgKi8KKyAgaW5saW5lIFJlYWxTY2FsYXIgbWF4UGl2b3QoKSBjb25zdCB7IHJldHVybiBtX2NwcXIubWF4UGl2b3QoKTsgfQorCisgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHRoZSBjb21wbGV0ZSBvcnRob2dvbmFsIGRlY29tcG9zaXRpb24gd2FzCisgICAqIHN1Y2Nlc2Z1bC4KKyAgICoKKyAgICogXG5vdGUgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBcYyBTdWNjZXNzLiBJdCBpcyBwcm92aWRlZCBmb3IKKyAgICogY29tcGF0aWJpbGl0eQorICAgKiB3aXRoIG90aGVyIGZhY3Rvcml6YXRpb24gcm91dGluZXMuCisgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MKKyAgICovCisgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChtX2NwcXIubV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gU3VjY2VzczsKKyAgfQorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFJoc1R5cGUmIHJocywgRHN0VHlwZSYgZHN0KSBjb25zdDsKKyNlbmRpZgorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgfQorCisgIHZvaWQgY29tcHV0ZUluUGxhY2UoKTsKKworICAvKiogT3ZlcndyaXRlcyBcYiByaHMgd2l0aCBcZiQgXG1hdGhiZntafV4qICogXG1hdGhiZntyaHN9IFxmJC4KKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+CisgIHZvaWQgYXBwbHlaQWRqb2ludE9uVGhlTGVmdEluUGxhY2UoUmhzJiByaHMpIGNvbnN0OworCisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gbV9jcHFyOworICBIQ29lZmZzVHlwZSBtX3pDb2VmZnM7CisgIFJvd1ZlY3RvclR5cGUgbV90ZW1wOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyCitDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+OjphYnNEZXRlcm1pbmFudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fY3Bxci5hYnNEZXRlcm1pbmFudCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIKK0NvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248TWF0cml4VHlwZT46OmxvZ0Fic0RldGVybWluYW50KCkgY29uc3QgeworICByZXR1cm4gbV9jcHFyLmxvZ0Fic0RldGVybWluYW50KCk7Cit9CisKKy8qKiBQZXJmb3JtcyB0aGUgY29tcGxldGUgb3J0aG9nb25hbCBkZWNvbXBvc2l0aW9uIG9mIHRoZSBnaXZlbiBtYXRyaXggXGEKKyAqIG1hdHJpeC4gVGhlIHJlc3VsdCBvZiB0aGUgZmFjdG9yaXphdGlvbiBpcyBzdG9yZWQgaW50byBcYyAqdGhpcywgYW5kIGEKKyAqIHJlZmVyZW5jZSB0byBcYyAqdGhpcyBpcyByZXR1cm5lZC4KKyAqCisgKiBcc2EgY2xhc3MgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiwKKyAqIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+Ojpjb21wdXRlSW5QbGFjZSgpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKworICAvLyB0aGUgY29sdW1uIHBlcm11dGF0aW9uIGlzIHN0b3JlZCBhcyBpbnQgaW5kaWNlcywgc28ganVzdCB0byBiZSBzdXJlOgorICBlaWdlbl9hc3NlcnQobV9jcHFyLmNvbHMoKSA8PSBOdW1UcmFpdHM8aW50Pjo6aGlnaGVzdCgpKTsKKworICBjb25zdCBJbmRleCByYW5rID0gbV9jcHFyLnJhbmsoKTsKKyAgY29uc3QgSW5kZXggY29scyA9IG1fY3Bxci5jb2xzKCk7CisgIGNvbnN0IEluZGV4IHJvd3MgPSBtX2NwcXIucm93cygpOworICBtX3pDb2VmZnMucmVzaXplKChzdGQ6Om1pbikocm93cywgY29scykpOworICBtX3RlbXAucmVzaXplKGNvbHMpOworCisgIGlmIChyYW5rIDwgY29scykgeworICAgIC8vIFdlIGhhdmUgcmVkdWNlZCB0aGUgKHBlcm11dGVkKSBtYXRyaXggdG8gdGhlIGZvcm0KKyAgICAvLyAgIFtSMTEgUjEyXQorICAgIC8vICAgWyAwICBSMjJdCisgICAgLy8gd2hlcmUgUjExIGlzIHItYnktciAociA9IHJhbmspIHVwcGVyIHRyaWFuZ3VsYXIsIFIxMiBpcworICAgIC8vIHItYnktKG4tciksIGFuZCBSMjIgaXMgZW1wdHkgb3IgdGhlIG5vcm0gb2YgUjIyIGlzIG5lZ2xpZ2libGUuCisgICAgLy8gV2Ugbm93IGNvbXB1dGUgdGhlIGNvbXBsZXRlIG9ydGhvZ29uYWwgZGVjb21wb3NpdGlvbiBieSBhcHBseWluZworICAgIC8vIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucyBmcm9tIHRoZSByaWdodCB0byB0aGUgdXBwZXIgdHJhcGV6b2lkYWwKKyAgICAvLyBtYXRyaXggWCA9IFtSMTEgUjEyXSB0byB6ZXJvIG91dCBSMTIgYW5kIG9idGFpbiB0aGUgZmFjdG9yaXphdGlvbgorICAgIC8vIFtSMTEgUjEyXSA9IFtUMTEgMF0gKiBaLCB3aGVyZSBUMTEgaXMgci1ieS1yIHVwcGVyIHRyaWFuZ3VsYXIgYW5kCisgICAgLy8gWiA9IFooMCkgKiBaKDEpIC4uLiBaKHItMSkgaXMgYW4gbi1ieS1uIG9ydGhvZ29uYWwgbWF0cml4LgorICAgIC8vIFdlIHN0b3JlIHRoZSBkYXRhIHJlcHJlc2VudGluZyBaIGluIFIxMiBhbmQgbV96Q29lZmZzLgorICAgIGZvciAoSW5kZXggayA9IHJhbmsgLSAxOyBrID49IDA7IC0taykgeworICAgICAgaWYgKGsgIT0gcmFuayAtIDEpIHsKKyAgICAgICAgLy8gR2l2ZW4gdGhlIEFQSSBmb3IgSG91c2Vob2xkZXIgcmVmbGVjdG9ycywgaXQgaXMgbW9yZSBjb252ZW5pZW50IGlmCisgICAgICAgIC8vIHdlIHN3YXAgdGhlIGxlYWRpbmcgcGFydHMgb2YgY29sdW1ucyBrIGFuZCByLTEgKHplcm8tYmFzZWQpIHRvIGZvcm0KKyAgICAgICAgLy8gdGhlIG1hdHJpeCBYX2sgPSBbWCgwOmssIGspLCBYKDA6aywgcjpuKV0KKyAgICAgICAgbV9jcHFyLm1fcXIuY29sKGspLmhlYWQoayArIDEpLnN3YXAoCisgICAgICAgICAgICBtX2NwcXIubV9xci5jb2wocmFuayAtIDEpLmhlYWQoayArIDEpKTsKKyAgICAgIH0KKyAgICAgIC8vIENvbnN0cnVjdCBIb3VzZWhvbGRlciByZWZsZWN0b3IgWihrKSB0byB6ZXJvIG91dCB0aGUgbGFzdCByb3cgb2YgWF9rLAorICAgICAgLy8gaS5lLiBjaG9vc2UgWihrKSBzdWNoIHRoYXQKKyAgICAgIC8vIFtYKGssIGspLCBYKGssIHI6bildICogWihrKSA9IFtiZXRhLCAwLCAuLiwgMF0uCisgICAgICBSZWFsU2NhbGFyIGJldGE7CisgICAgICBtX2NwcXIubV9xci5yb3coaykKKyAgICAgICAgICAudGFpbChjb2xzIC0gcmFuayArIDEpCisgICAgICAgICAgLm1ha2VIb3VzZWhvbGRlckluUGxhY2UobV96Q29lZmZzKGspLCBiZXRhKTsKKyAgICAgIG1fY3Bxci5tX3FyKGssIHJhbmsgLSAxKSA9IGJldGE7CisgICAgICBpZiAoayA+IDApIHsKKyAgICAgICAgLy8gQXBwbHkgWihrKSB0byB0aGUgZmlyc3QgayByb3dzIG9mIFhfaworICAgICAgICBtX2NwcXIubV9xci50b3BSaWdodENvcm5lcihrLCBjb2xzIC0gcmFuayArIDEpCisgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoCisgICAgICAgICAgICAgICAgbV9jcHFyLm1fcXIucm93KGspLnRhaWwoY29scyAtIHJhbmspLnRyYW5zcG9zZSgpLCBtX3pDb2VmZnMoayksCisgICAgICAgICAgICAgICAgJm1fdGVtcCgwKSk7CisgICAgICB9CisgICAgICBpZiAoayAhPSByYW5rIC0gMSkgeworICAgICAgICAvLyBTd2FwIFgoMDprLGspIGJhY2sgdG8gaXRzIHByb3BlciBsb2NhdGlvbi4KKyAgICAgICAgbV9jcHFyLm1fcXIuY29sKGspLmhlYWQoayArIDEpLnN3YXAoCisgICAgICAgICAgICBtX2NwcXIubV9xci5jb2wocmFuayAtIDEpLmhlYWQoayArIDEpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgordm9pZCBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+OjphcHBseVpBZGpvaW50T25UaGVMZWZ0SW5QbGFjZSgKKyAgICBSaHMmIHJocykgY29uc3QgeworICBjb25zdCBJbmRleCBjb2xzID0gdGhpcy0+Y29scygpOworICBjb25zdCBJbmRleCBucmhzID0gcmhzLmNvbHMoKTsKKyAgY29uc3QgSW5kZXggcmFuayA9IHRoaXMtPnJhbmsoKTsKKyAgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgRHluYW1pYywgMT4gdGVtcCgoc3RkOjptYXgpKGNvbHMsIG5yaHMpKTsKKyAgZm9yIChJbmRleCBrID0gMDsgayA8IHJhbms7ICsraykgeworICAgIGlmIChrICE9IHJhbmsgLSAxKSB7CisgICAgICByaHMucm93KGspLnN3YXAocmhzLnJvdyhyYW5rIC0gMSkpOworICAgIH0KKyAgICByaHMubWlkZGxlUm93cyhyYW5rIC0gMSwgY29scyAtIHJhbmsgKyAxKQorICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdCgKKyAgICAgICAgICAgIG1hdHJpeFFUWigpLnJvdyhrKS50YWlsKGNvbHMgLSByYW5rKS5hZGpvaW50KCksIHpDb2VmZnMoKShrKSwKKyAgICAgICAgICAgICZ0ZW1wKDApKTsKKyAgICBpZiAoayAhPSByYW5rIC0gMSkgeworICAgICAgcmhzLnJvdyhrKS5zd2FwKHJocy5yb3cocmFuayAtIDEpKTsKKyAgICB9CisgIH0KK30KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGUgPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+Cit2b2lkIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248X01hdHJpeFR5cGU+Ojpfc29sdmVfaW1wbCgKKyAgICBjb25zdCBSaHNUeXBlJiByaHMsIERzdFR5cGUmIGRzdCkgY29uc3QgeworICBlaWdlbl9hc3NlcnQocmhzLnJvd3MoKSA9PSB0aGlzLT5yb3dzKCkpOworCisgIGNvbnN0IEluZGV4IHJhbmsgPSB0aGlzLT5yYW5rKCk7CisgIGlmIChyYW5rID09IDApIHsKKyAgICBkc3Quc2V0WmVybygpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIENvbXB1dGUgYyA9IFFeKiAqIHJocworICAvLyBOb3RlIHRoYXQgdGhlIG1hdHJpeCBRID0gSF8wXiogSF8xXiouLi4gc28gaXRzIGludmVyc2UgaXMKKyAgLy8gUV4qID0gKEhfMCBIXzEgLi4uKV5UCisgIHR5cGVuYW1lIFJoc1R5cGU6OlBsYWluT2JqZWN0IGMocmhzKTsKKyAgYy5hcHBseU9uVGhlTGVmdCgKKyAgICAgIGhvdXNlaG9sZGVyU2VxdWVuY2UobWF0cml4UVRaKCksIGhDb2VmZnMoKSkuc2V0TGVuZ3RoKHJhbmspLnRyYW5zcG9zZSgpKTsKKworICAvLyBTb2x2ZSBUIHogPSBjKDE6cmFuaywgOikKKyAgZHN0LnRvcFJvd3MocmFuaykgPSBtYXRyaXhUKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb2x2ZShjLnRvcFJvd3MocmFuaykpOworCisgIGNvbnN0IEluZGV4IGNvbHMgPSB0aGlzLT5jb2xzKCk7CisgIGlmIChyYW5rIDwgY29scykgeworICAgIC8vIENvbXB1dGUgeSA9IFpeKiAqIFsgeiBdCisgICAgLy8gICAgICAgICAgICAgICAgICAgWyAwIF0KKyAgICBkc3QuYm90dG9tUm93cyhjb2xzIC0gcmFuaykuc2V0WmVybygpOworICAgIGFwcGx5WkFkam9pbnRPblRoZUxlZnRJblBsYWNlKGRzdCk7CisgIH0KKworICAvLyBVbmRvIHBlcm11dGF0aW9uIHRvIGdldCB4ID0gUF57LTF9ICogeS4KKyAgZHN0ID0gY29sc1Blcm11dGF0aW9uKCkgKiBkc3Q7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIEludmVyc2U8Q29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiA+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+OjpTY2FsYXI+LCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IENvZFR5cGU7CisgIHR5cGVkZWYgSW52ZXJzZTxDb2RUeXBlPiBTcmNYcHJUeXBlOworICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIENvZFR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIGRzdCA9IHNyYy5uZXN0ZWRFeHByZXNzaW9uKCkuc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkoc3JjLnJvd3MoKSwgc3JjLnJvd3MoKSkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggUSBhcyBhIHNlcXVlbmNlIG9mIGhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+OjpIb3VzZWhvbGRlclNlcXVlbmNlVHlwZQorQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPjo6aG91c2Vob2xkZXJRKCkgY29uc3QgeworICByZXR1cm4gbV9jcHFyLmhvdXNlaG9sZGVyUSgpOworfQorCisvKiogXHJldHVybiB0aGUgY29tcGxldGUgb3J0aG9nb25hbCBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmNvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24oKSBjb25zdCB7CisgIHJldHVybiBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fQ09NUExFVEVPUlRIT0dPTkFMREVDT01QT1NJVElPTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvUVIvRnVsbFBpdkhvdXNlaG9sZGVyUVIuaCBiL0VpZ2VuL3NyYy9RUi9GdWxsUGl2SG91c2Vob2xkZXJRUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODliZGQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvUVIvRnVsbFBpdkhvdXNlaG9sZGVyUVIuaApAQCAtMCwwICsxLDY3NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRlVMTFBJVk9USU5HSE9VU0VIT0xERVJRUl9ICisjZGVmaW5lIEVJR0VOX0ZVTExQSVZPVElOR0hPVVNFSE9MREVSUVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IHN0cnVjdCB0cmFpdHM8RnVsbFBpdkhvdXNlaG9sZGVyUVI8X01hdHJpeFR5cGU+ID4KKyA6IHRyYWl0czxfTWF0cml4VHlwZT4KK3sKKyAgZW51bSB7IEZsYWdzID0gMCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IEZ1bGxQaXZIb3VzZWhvbGRlclFSTWF0cml4UVJldHVyblR5cGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPEZ1bGxQaXZIb3VzZWhvbGRlclFSTWF0cml4UVJldHVyblR5cGU8TWF0cml4VHlwZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIFFSX01vZHVsZQorICAqCisgICogXGNsYXNzIEZ1bGxQaXZIb3VzZWhvbGRlclFSCisgICoKKyAgKiBcYnJpZWYgSG91c2Vob2xkZXIgcmFuay1yZXZlYWxpbmcgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIGZ1bGwgcGl2b3RpbmcKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBRUiBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGEgcmFuay1yZXZlYWxpbmcgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCBcYiBBIGludG8gbWF0cmljZXMgXGIgUCwgXGIgUCcsIFxiIFEgYW5kIFxiIFIKKyAgKiBzdWNoIHRoYXQgCisgICogXGZbCisgICogIFxtYXRoYmZ7UH0gXCwgXG1hdGhiZntBfSBcLCBcbWF0aGJme1B9JyA9IFxtYXRoYmZ7UX0gXCwgXG1hdGhiZntSfQorICAqIFxmXQorICAqIGJ5IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucy4gSGVyZSwgXGIgUCBhbmQgXGIgUCcgYXJlIHBlcm11dGF0aW9uIG1hdHJpY2VzLCBcYiBRIGEgdW5pdGFyeSBtYXRyaXggCisgICogYW5kIFxiIFIgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguCisgICoKKyAgKiBUaGlzIGRlY29tcG9zaXRpb24gcGVyZm9ybXMgYSB2ZXJ5IHBydWRlbnQgZnVsbCBwaXZvdGluZyBpbiBvcmRlciB0byBiZSByYW5rLXJldmVhbGluZyBhbmQgYWNoaWV2ZSBvcHRpbWFsCisgICogbnVtZXJpY2FsIHN0YWJpbGl0eS4gVGhlIHRyYWRlLW9mZiBpcyB0aGF0IGl0IGlzIHNsb3dlciB0aGFuIEhvdXNlaG9sZGVyUVIgYW5kIENvbFBpdkhvdXNlaG9sZGVyUVIuCisgICoKKyAgKiBUaGlzIGNsYXNzIHN1cHBvcnRzIHRoZSBcbGluayBJbnBsYWNlRGVjb21wb3NpdGlvbiBpbnBsYWNlIGRlY29tcG9zaXRpb24gXGVuZGxpbmsgbWVjaGFuaXNtLgorICAqIAorICAqIFxzYSBNYXRyaXhCYXNlOjpmdWxsUGl2SG91c2Vob2xkZXJRcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgRnVsbFBpdkhvdXNlaG9sZGVyUVIKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIC8vIEZJWE1FIHNob3VsZCBiZSBpbnQKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6RnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiBNYXRyaXhRUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9kaWFnX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgSENvZWZmc1R5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LCAxLAorICAgICAgICAgICAgICAgICAgIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKENvbHNBdENvbXBpbGVUaW1lLFJvd3NBdENvbXBpbGVUaW1lKSwgUm93TWFqb3IsIDEsCisgICAgICAgICAgICAgICAgICAgRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKE1heENvbHNBdENvbXBpbGVUaW1lLE1heFJvd3NBdENvbXBpbGVUaW1lKT4gSW50RGlhZ1NpemVWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBQZXJtdXRhdGlvblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBDb2xWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIEZ1bGxQaXZIb3VzZWhvbGRlclFSOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAgICovCisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVIoKQorICAgICAgOiBtX3FyKCksCisgICAgICAgIG1faENvZWZmcygpLAorICAgICAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMoKSwKKyAgICAgICAgbV9jb2xzX3RyYW5zcG9zaXRpb25zKCksCisgICAgICAgIG1fY29sc19wZXJtdXRhdGlvbigpLAorICAgICAgICBtX3RlbXAoKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKSB7fQorCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICAgICogXHNhIEZ1bGxQaXZIb3VzZWhvbGRlclFSKCkKKyAgICAgICovCisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVIoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICAgIDogbV9xcihyb3dzLCBjb2xzKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikocm93cyxjb2xzKSksCisgICAgICAgIG1fcm93c190cmFuc3Bvc2l0aW9ucygoc3RkOjptaW4pKHJvd3MsY29scykpLAorICAgICAgICBtX2NvbHNfdHJhbnNwb3NpdGlvbnMoKHN0ZDo6bWluKShyb3dzLGNvbHMpKSwKKyAgICAgICAgbV9jb2xzX3Blcm11dGF0aW9uKGNvbHMpLAorICAgICAgICBtX3RlbXAoY29scyksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkge30KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIFFSIGZhY3Rvcml6YXRpb24gZnJvbSBhIGdpdmVuIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNvbXB1dGVzIHRoZSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBtYXRyaXggXGEgbWF0cml4IGJ5IGNhbGxpbmcKKyAgICAgICogdGhlIG1ldGhvZCBjb21wdXRlKCkuIEl0IGlzIGEgc2hvcnQgY3V0IGZvcjoKKyAgICAgICogCisgICAgICAqIFxjb2RlCisgICAgICAqIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgKiBxci5jb21wdXRlKG1hdHJpeCk7CisgICAgICAqIFxlbmRjb2RlCisgICAgICAqIAorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBGdWxsUGl2SG91c2Vob2xkZXJRUihjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQorICAgICAgOiBtX3FyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2hDb2VmZnMoKHN0ZDo6bWluKShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSksCisgICAgICAgIG1fcm93c190cmFuc3Bvc2l0aW9ucygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpKSwKKyAgICAgICAgbV9jb2xzX3RyYW5zcG9zaXRpb25zKChzdGQ6Om1pbikobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX2NvbHNfcGVybXV0YXRpb24obWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fdGVtcChtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGEgUVIgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIHdoZW4gXGMgTWF0cml4VHlwZSBpcyBhIEVpZ2VuOjpSZWYuCisgICAgICAqCisgICAgICAqIFxzYSBGdWxsUGl2SG91c2Vob2xkZXJRUihjb25zdCBFaWdlbkJhc2UmKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgZXhwbGljaXQgRnVsbFBpdkhvdXNlaG9sZGVyUVIoRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCkKKyAgICAgIDogbV9xcihtYXRyaXguZGVyaXZlZCgpKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMoKHN0ZDo6bWluKShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSksCisgICAgICAgIG1fY29sc190cmFuc3Bvc2l0aW9ucygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpKSwKKyAgICAgICAgbV9jb2xzX3Blcm11dGF0aW9uKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3RlbXAobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlSW5QbGFjZSgpOworICAgIH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCBmaW5kcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIEF4PWIsIHdoZXJlIEEgaXMgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiBcYyAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGIgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXF1YXRpb24gdG8gc29sdmUuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIHRoZSBleGFjdCBvciBsZWFzdC1zcXVhcmUgc29sdXRpb24gaWYgdGhlIHJhbmsgaXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgQSwKKyAgICAgICogYW5kIGFuIGFyYml0cmFyeSBzb2x1dGlvbiBvdGhlcndpc2UuCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucworICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9hcmJpdHJhcnlfY2hvaWNlX29mX3NvbHV0aW9uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEZ1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBGdWxsUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5vdXQKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBTb2x2ZTxGdWxsUGl2SG91c2Vob2xkZXJRUiwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gU29sdmU8RnVsbFBpdkhvdXNlaG9sZGVyUVIsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgRXhwcmVzc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggUQorICAgICAgKi8KKyAgICBNYXRyaXhRUmV0dXJuVHlwZSBtYXRyaXhRKHZvaWQpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggd2hlcmUgdGhlIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gaXMgc3RvcmVkCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFFSKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9xcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVImIGNvbXB1dGUoY29uc3QgRWlnZW5CYXNlPElucHV0VHlwZT4mIG1hdHJpeCk7CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiBtYXRyaXggKi8KKyAgICBjb25zdCBQZXJtdXRhdGlvblR5cGUmIGNvbHNQZXJtdXRhdGlvbigpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fY29sc19wZXJtdXRhdGlvbjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHZlY3RvciBvZiBpbmRpY2VzIHJlcHJlc2VudGluZyB0aGUgcm93cyB0cmFuc3Bvc2l0aW9ucyAqLworICAgIGNvbnN0IEludERpYWdTaXplVmVjdG9yVHlwZSYgcm93c1RyYW5zcG9zaXRpb25zKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9yb3dzX3RyYW5zcG9zaXRpb25zOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIFFSIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIGEgZGV0ZXJtaW5hbnQgY2FuIGJlIHZlcnkgYmlnIG9yIHNtYWxsLCBzbyBmb3IgbWF0cmljZXMKKyAgICAgICogb2YgbGFyZ2UgZW5vdWdoIGRpbWVuc2lvbiwgdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdy4KKyAgICAgICogT25lIHdheSB0byB3b3JrIGFyb3VuZCB0aGF0IGlzIHRvIHVzZSBsb2dBYnNEZXRlcm1pbmFudCgpIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxzYSBsb2dBYnNEZXRlcm1pbmFudCgpLCBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgYWJzRGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0aGUgbmF0dXJhbCBsb2cgb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLiBJdCBoYXMgb25seSBsaW5lYXIgY29tcGxleGl0eQorICAgICAgKiAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNxdWFyZSBtYXRyaXgpCisgICAgICAqIGFzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gd29yayBhcm91bmQgdGhlIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93IHRoYXQncyBpbmhlcmVudAorICAgICAgKiB0byBkZXRlcm1pbmFudCBjb21wdXRhdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIGFic0RldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICAgICovCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSByYW5rIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBSZWFsU2NhbGFyIHByZW11bHRpcGxpZWRfdGhyZXNob2xkID0gYWJzKG1fbWF4cGl2b3QpICogdGhyZXNob2xkKCk7CisgICAgICBJbmRleCByZXN1bHQgPSAwOworICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbV9ub256ZXJvX3Bpdm90czsgKytpKQorICAgICAgICByZXN1bHQgKz0gKGFicyhtX3FyLmNvZWZmKGksaSkpID4gcHJlbXVsdGlwbGllZF90aHJlc2hvbGQpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggZGltZW5zaW9uT2ZLZXJuZWwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBjb2xzKCkgLSByYW5rKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiByZXByZXNlbnRzIGFuIGluamVjdGl2ZQorICAgICAgKiAgICAgICAgICBsaW5lYXIgbWFwLCBpLmUuIGhhcyB0cml2aWFsIGtlcm5lbDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJbmplY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiByYW5rKCkgPT0gY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24gcmVwcmVzZW50cyBhIHN1cmplY3RpdmUKKyAgICAgICogICAgICAgICAgbGluZWFyIG1hcDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNTdXJqZWN0aXZlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gcmFuaygpID09IHJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGlzIGludmVydGlibGUuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0ludmVydGlibGUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpc0luamVjdGl2ZSgpICYmIGlzU3VyamVjdGl2ZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGlzIG1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSwgdGhlIHJldHVybmVkIG1hdHJpeCBoYXMgdW5kZWZpbmVkIGNvZWZmaWNpZW50cy4KKyAgICAgICogICAgICAgVXNlIGlzSW52ZXJ0aWJsZSgpIHRvIGZpcnN0IGRldGVybWluZSB3aGV0aGVyIHRoaXMgbWF0cml4IGlzIGludmVydGlibGUuCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBJbnZlcnNlPEZ1bGxQaXZIb3VzZWhvbGRlclFSPiBpbnZlcnNlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSW52ZXJzZTxGdWxsUGl2SG91c2Vob2xkZXJRUj4oKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9xci5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcXIuY29scygpOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3Igb2YgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmYWN0b3IgXGMgUS4KKyAgICAgICogCisgICAgICAqIEZvciBhZHZhbmNlZCB1c2VzIG9ubHkuCisgICAgICAqLworICAgIGNvbnN0IEhDb2VmZnNUeXBlJiBoQ29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9oQ29lZmZzOyB9CisKKyAgICAvKiogQWxsb3dzIHRvIHByZXNjcmliZSBhIHRocmVzaG9sZCB0byBiZSB1c2VkIGJ5IGNlcnRhaW4gbWV0aG9kcywgc3VjaCBhcyByYW5rKCksCisgICAgICAqIHdobyBuZWVkIHRvIGRldGVybWluZSB3aGVuIHBpdm90cyBhcmUgdG8gYmUgY29uc2lkZXJlZCBub256ZXJvLiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0aGUKKyAgICAgICogUVIgZGVjb21wb3NpdGlvbiBpdHNlbGYuCisgICAgICAqCisgICAgICAqIFdoZW4gaXQgbmVlZHMgdG8gZ2V0IHRoZSB0aHJlc2hvbGQgdmFsdWUsIEVpZ2VuIGNhbGxzIHRocmVzaG9sZCgpLiBCeSBkZWZhdWx0LCB0aGlzCisgICAgICAqIHVzZXMgYSBmb3JtdWxhIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGEgcmVhc29uYWJsZSB0aHJlc2hvbGQuCisgICAgICAqIE9uY2UgeW91IGhhdmUgY2FsbGVkIHRoZSBwcmVzZW50IG1ldGhvZCBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLAorICAgICAgKiB5b3VyIHZhbHVlIGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIHRocmVzaG9sZCBUaGUgbmV3IHZhbHVlIHRvIHVzZSBhcyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBBIHBpdm90IHdpbGwgYmUgY29uc2lkZXJlZCBub256ZXJvIGlmIGl0cyBhYnNvbHV0ZSB2YWx1ZSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4KKyAgICAgICogIFxmJCBcdmVydCBwaXZvdCBcdmVydCBcbGVxc2xhbnQgdGhyZXNob2xkIFx0aW1lcyBcdmVydCBtYXhwaXZvdCBcdmVydCBcZiQKKyAgICAgICogd2hlcmUgbWF4cGl2b3QgaXMgdGhlIGJpZ2dlc3QgcGl2b3QuCisgICAgICAqCisgICAgICAqIElmIHlvdSB3YW50IHRvIGNvbWUgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvciwgY2FsbCBzZXRUaHJlc2hvbGQoRGVmYXVsdF90KQorICAgICAgKi8KKyAgICBGdWxsUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSB0cnVlOworICAgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBBbGxvd3MgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBsZXR0aW5nIEVpZ2VuIHVzZSBpdHMgZGVmYXVsdCBmb3JtdWxhIGZvcgorICAgICAgKiBkZXRlcm1pbmluZyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBZb3Ugc2hvdWxkIHBhc3MgdGhlIHNwZWNpYWwgb2JqZWN0IEVpZ2VuOjpEZWZhdWx0IGFzIHBhcmFtZXRlciBoZXJlLgorICAgICAgKiBcY29kZSBxci5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVImIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgICAgeworICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkID0gZmFsc2U7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMgc3VjaCBhcyByYW5rKCkuCisgICAgICAqCisgICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIHRocmVzaG9sZCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCB8fCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQpOworICAgICAgcmV0dXJuIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA/IG1fcHJlc2NyaWJlZFRocmVzaG9sZAorICAgICAgLy8gdGhpcyBmb3JtdWxhIGNvbWVzIGZyb20gZXhwZXJpbWVudGluZyAoc2VlICJMVSBwcmVjaXNpb24gdHVuaW5nIiB0aHJlYWQgb24gdGhlIGxpc3QpCisgICAgICAvLyBhbmQgdHVybnMgb3V0IHRvIGJlIGlkZW50aWNhbCB0byBIaWdoYW0ncyBmb3JtdWxhIHVzZWQgYWxyZWFkeSBpbiBMREx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBSZWFsU2NhbGFyKG1fcXIuZGlhZ29uYWxTaXplKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbnplcm8gcGl2b3RzIGluIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKiBIZXJlIG5vbnplcm8gaXMgbWVhbnQgaW4gdGhlIGV4YWN0IHNlbnNlLCBub3QgaW4gYSBmdXp6eSBzZW5zZS4KKyAgICAgICogU28gdGhhdCBub3Rpb24gaXNuJ3QgcmVhbGx5IGludHJpbnNpY2FsbHkgaW50ZXJlc3RpbmcsIGJ1dCBpdCBpcworICAgICAgKiBzdGlsbCB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgYWxnb3JpdGhtcy4KKyAgICAgICoKKyAgICAgICogXHNhIHJhbmsoKQorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggbm9uemVyb1Bpdm90cygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbm9uemVyb19waXZvdHM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYmlnZ2VzdCBwaXZvdCwgaS5lLiB0aGUgYmlnZ2VzdAorICAgICAgKiAgICAgICAgICBkaWFnb25hbCBjb2VmZmljaWVudCBvZiBVLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIG1heFBpdm90KCkgY29uc3QgeyByZXR1cm4gbV9tYXhwaXZvdDsgfQorICAgIAorICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBjb21wdXRlSW5QbGFjZSgpOworICAgIAorICAgIE1hdHJpeFR5cGUgbV9xcjsKKyAgICBIQ29lZmZzVHlwZSBtX2hDb2VmZnM7CisgICAgSW50RGlhZ1NpemVWZWN0b3JUeXBlIG1fcm93c190cmFuc3Bvc2l0aW9uczsKKyAgICBJbnREaWFnU2l6ZVZlY3RvclR5cGUgbV9jb2xzX3RyYW5zcG9zaXRpb25zOworICAgIFBlcm11dGF0aW9uVHlwZSBtX2NvbHNfcGVybXV0YXRpb247CisgICAgUm93VmVjdG9yVHlwZSBtX3RlbXA7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQsIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZDsKKyAgICBSZWFsU2NhbGFyIG1fcHJlc2NyaWJlZFRocmVzaG9sZCwgbV9tYXhwaXZvdDsKKyAgICBJbmRleCBtX25vbnplcm9fcGl2b3RzOworICAgIFJlYWxTY2FsYXIgbV9wcmVjaXNpb247CisgICAgSW5kZXggbV9kZXRfcHE7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6YWJzRGV0ZXJtaW5hbnQoKSBjb25zdAoreworICB1c2luZyBzdGQ6OmFiczsKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gYWJzKG1fcXIuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6bG9nQWJzRGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX3FyLnJvd3MoKSA9PSBtX3FyLmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBtX3FyLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5hcnJheSgpLmxvZygpLnN1bSgpOworfQorCisvKiogUGVyZm9ybXMgdGhlIFFSIGZhY3Rvcml6YXRpb24gb2YgdGhlIGdpdmVuIG1hdHJpeCBcYSBtYXRyaXguIFRoZSByZXN1bHQgb2YKKyAgKiB0aGUgZmFjdG9yaXphdGlvbiBpcyBzdG9yZWQgaW50byBcYyAqdGhpcywgYW5kIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICogaXMgcmV0dXJuZWQuCisgICoKKyAgKiBcc2EgY2xhc3MgRnVsbFBpdkhvdXNlaG9sZGVyUVIsIEZ1bGxQaXZIb3VzZWhvbGRlclFSKGNvbnN0IE1hdHJpeFR5cGUmKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KK0Z1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+JiBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KQoreworICBtX3FyID0gbWF0cml4LmRlcml2ZWQoKTsKKyAgY29tcHV0ZUluUGxhY2UoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6Y29tcHV0ZUluUGxhY2UoKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisKKyAgdXNpbmcgc3RkOjphYnM7CisgIEluZGV4IHJvd3MgPSBtX3FyLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG1fcXIuY29scygpOworICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLGNvbHMpOworCisgIAorICBtX2hDb2VmZnMucmVzaXplKHNpemUpOworCisgIG1fdGVtcC5yZXNpemUoY29scyk7CisKKyAgbV9wcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogUmVhbFNjYWxhcihzaXplKTsKKworICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMucmVzaXplKHNpemUpOworICBtX2NvbHNfdHJhbnNwb3NpdGlvbnMucmVzaXplKHNpemUpOworICBJbmRleCBudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMgPSAwOworCisgIFJlYWxTY2FsYXIgYmlnZ2VzdCgwKTsKKworICBtX25vbnplcm9fcGl2b3RzID0gc2l6ZTsgLy8gdGhlIGdlbmVyaWMgY2FzZSBpcyB0aGF0IGluIHdoaWNoIGFsbCBwaXZvdHMgYXJlIG5vbnplcm8gKGludmVydGlibGUgY2FzZSkKKyAgbV9tYXhwaXZvdCA9IFJlYWxTY2FsYXIoMCk7CisKKyAgZm9yIChJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgeworICAgIEluZGV4IHJvd19vZl9iaWdnZXN0X2luX2Nvcm5lciwgY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnNjYWxhcl9zY29yZV9jb2VmZl9vcDxTY2FsYXI+IFNjb3Jpbmc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTY29yaW5nOjpyZXN1bHRfdHlwZSBTY29yZTsKKworICAgIFNjb3JlIHNjb3JlID0gbV9xci5ib3R0b21SaWdodENvcm5lcihyb3dzLWssIGNvbHMtaykKKyAgICAgICAgICAgICAgICAgICAgICAudW5hcnlFeHByKFNjb3JpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAubWF4Q29lZmYoJnJvd19vZl9iaWdnZXN0X2luX2Nvcm5lciwgJmNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lcik7CisgICAgcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7CisgICAgY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7CisgICAgUmVhbFNjYWxhciBiaWdnZXN0X2luX2Nvcm5lciA9IGludGVybmFsOjphYnNfa25vd2luZ19zY29yZTxTY2FsYXI+KCkobV9xcihyb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsIGNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lciksIHNjb3JlKTsKKyAgICBpZihrPT0wKSBiaWdnZXN0ID0gYmlnZ2VzdF9pbl9jb3JuZXI7CisKKyAgICAvLyBpZiB0aGUgY29ybmVyIGlzIG5lZ2xpZ2libGUsIHRoZW4gd2UgaGF2ZSBsZXNzIHRoYW4gZnVsbCByYW5rLCBhbmQgd2UgY2FuIGZpbmlzaCBlYXJseQorICAgIGlmKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihiaWdnZXN0X2luX2Nvcm5lciwgYmlnZ2VzdCwgbV9wcmVjaXNpb24pKQorICAgIHsKKyAgICAgIG1fbm9uemVyb19waXZvdHMgPSBrOworICAgICAgZm9yKEluZGV4IGkgPSBrOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgeworICAgICAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgICAgICBtX2NvbHNfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgICAgICBtX2hDb2VmZnMuY29lZmZSZWYoaSkgPSBTY2FsYXIoMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaykgPSByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgbV9jb2xzX3RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGspID0gY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgIGlmKGsgIT0gcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyKSB7CisgICAgICBtX3FyLnJvdyhrKS50YWlsKGNvbHMtaykuc3dhcChtX3FyLnJvdyhyb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpLnRhaWwoY29scy1rKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisgICAgaWYoayAhPSBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpIHsKKyAgICAgIG1fcXIuY29sKGspLnN3YXAobV9xci5jb2woY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisKKyAgICBSZWFsU2NhbGFyIGJldGE7CisgICAgbV9xci5jb2woaykudGFpbChyb3dzLWspLm1ha2VIb3VzZWhvbGRlckluUGxhY2UobV9oQ29lZmZzLmNvZWZmUmVmKGspLCBiZXRhKTsKKyAgICBtX3FyLmNvZWZmUmVmKGssaykgPSBiZXRhOworCisgICAgLy8gcmVtZW1iZXIgdGhlIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzCisgICAgaWYoYWJzKGJldGEpID4gbV9tYXhwaXZvdCkgbV9tYXhwaXZvdCA9IGFicyhiZXRhKTsKKworICAgIG1fcXIuYm90dG9tUmlnaHRDb3JuZXIocm93cy1rLCBjb2xzLWstMSkKKyAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobV9xci5jb2woaykudGFpbChyb3dzLWstMSksIG1faENvZWZmcy5jb2VmZlJlZihrKSwgJm1fdGVtcC5jb2VmZlJlZihrKzEpKTsKKyAgfQorCisgIG1fY29sc19wZXJtdXRhdGlvbi5zZXRJZGVudGl0eShjb2xzKTsKKyAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICAgIG1fY29sc19wZXJtdXRhdGlvbi5hcHBseVRyYW5zcG9zaXRpb25PblRoZVJpZ2h0KGssIG1fY29sc190cmFuc3Bvc2l0aW9ucy5jb2VmZihrKSk7CisKKyAgbV9kZXRfcHEgPSAobnVtYmVyX29mX3RyYW5zcG9zaXRpb25zJTIpID8gLTEgOiAxOworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERzdFR5cGU+Cit2b2lkIEZ1bGxQaXZIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPjo6X3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyaHMucm93cygpID09IHJvd3MoKSk7CisgIGNvbnN0IEluZGV4IGxfcmFuayA9IHJhbmsoKTsKKworICAvLyBGSVhNRSBpbnRyb2R1Y2Ugbm9uemVyb1Bpdm90cygpIGFuZCB1c2UgaXQgaGVyZS4gYW5kIG1vcmUgZ2VuZXJhbGx5LAorICAvLyBtYWtlIHRoZSBzYW1lIGltcHJvdmVtZW50cyBpbiB0aGlzIGRlYyBhcyBpbiBGdWxsUGl2TFUuCisgIGlmKGxfcmFuaz09MCkKKyAgeworICAgIGRzdC5zZXRaZXJvKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdHlwZW5hbWUgUmhzVHlwZTo6UGxhaW5PYmplY3QgYyhyaHMpOworCisgIE1hdHJpeDxTY2FsYXIsMSxSaHNUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gdGVtcChyaHMuY29scygpKTsKKyAgZm9yIChJbmRleCBrID0gMDsgayA8IGxfcmFuazsgKytrKQorICB7CisgICAgSW5kZXggcmVtYWluaW5nU2l6ZSA9IHJvd3MoKS1rOworICAgIGMucm93KGspLnN3YXAoYy5yb3cobV9yb3dzX3RyYW5zcG9zaXRpb25zLmNvZWZmKGspKSk7CisgICAgYy5ib3R0b21SaWdodENvcm5lcihyZW1haW5pbmdTaXplLCByaHMuY29scygpKQorICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobV9xci5jb2woaykudGFpbChyZW1haW5pbmdTaXplLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faENvZWZmcy5jb2VmZihrKSwgJnRlbXAuY29lZmZSZWYoMCkpOworICB9CisKKyAgbV9xci50b3BMZWZ0Q29ybmVyKGxfcmFuaywgbF9yYW5rKQorICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAuc29sdmVJblBsYWNlKGMudG9wUm93cyhsX3JhbmspKTsKKworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBsX3Jhbms7ICsraSkgZHN0LnJvdyhtX2NvbHNfcGVybXV0YXRpb24uaW5kaWNlcygpLmNvZWZmKGkpKSA9IGMucm93KGkpOworICBmb3IoSW5kZXggaSA9IGxfcmFuazsgaSA8IGNvbHMoKTsgKytpKSBkc3Qucm93KG1fY29sc19wZXJtdXRhdGlvbi5pbmRpY2VzKCkuY29lZmYoaSkpLnNldFplcm8oKTsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBJbnZlcnNlPEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+ID4sIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+OjpTY2FsYXI+LCBEZW5zZTJEZW5zZT4KK3sKKyAgdHlwZWRlZiBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRclR5cGU7CisgIHR5cGVkZWYgSW52ZXJzZTxRclR5cGU+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgUXJUeXBlOjpTY2FsYXI+ICYpCisgIHsgICAgCisgICAgZHN0ID0gc3JjLm5lc3RlZEV4cHJlc3Npb24oKS5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShzcmMucm93cygpLCBzcmMuY29scygpKSk7CisgIH0KK307CisKKy8qKiBcaW5ncm91cCBRUl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIHR5cGUgZm9yIHJldHVybiB2YWx1ZSBvZiBGdWxsUGl2SG91c2Vob2xkZXJRUjo6bWF0cml4USgpCisgICoKKyAgKiBcdHBhcmFtIE1hdHJpeFR5cGUgdHlwZSBvZiB1bmRlcmx5aW5nIGRlbnNlIG1hdHJpeAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IEZ1bGxQaXZIb3VzZWhvbGRlclFSTWF0cml4UVJldHVyblR5cGUKKyAgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxGdWxsUGl2SG91c2Vob2xkZXJRUk1hdHJpeFFSZXR1cm5UeXBlPE1hdHJpeFR5cGU+ID4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6SW50RGlhZ1NpemVWZWN0b3JUeXBlIEludERpYWdTaXplVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fZGlhZ190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIEhDb2VmZnNUeXBlOworICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBSb3dNYWpvciwgMSwKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU+IFdvcmtWZWN0b3JUeXBlOworCisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSTWF0cml4UVJldHVyblR5cGUoY29uc3QgTWF0cml4VHlwZSYgICAgICAgcXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSENvZWZmc1R5cGUmICAgICAgaENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnREaWFnU2l6ZVZlY3RvclR5cGUmIHJvd3NUcmFuc3Bvc2l0aW9ucykKKyAgICA6IG1fcXIocXIpLAorICAgICAgbV9oQ29lZmZzKGhDb2VmZnMpLAorICAgICAgbV9yb3dzVHJhbnNwb3NpdGlvbnMocm93c1RyYW5zcG9zaXRpb25zKQorICB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICB2b2lkIGV2YWxUbyhSZXN1bHRUeXBlJiByZXN1bHQpIGNvbnN0CisgIHsKKyAgICBjb25zdCBJbmRleCByb3dzID0gbV9xci5yb3dzKCk7CisgICAgV29ya1ZlY3RvclR5cGUgd29ya3NwYWNlKHJvd3MpOworICAgIGV2YWxUbyhyZXN1bHQsIHdvcmtzcGFjZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgdm9pZCBldmFsVG8oUmVzdWx0VHlwZSYgcmVzdWx0LCBXb3JrVmVjdG9yVHlwZSYgd29ya3NwYWNlKSBjb25zdAorICB7CisgICAgdXNpbmcgbnVtZXh0Ojpjb25qOworICAgIC8vIGNvbXB1dGUgdGhlIHByb2R1Y3QgSCdfMCBIJ18xIC4uLiBIJ19uLTEsCisgICAgLy8gd2hlcmUgSF9rIGlzIHRoZSBrLXRoIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uIEkgLSBoX2sgdl9rIHZfaycKKyAgICAvLyBhbmQgdl9rIGlzIHRoZSBrLXRoIEhvdXNlaG9sZGVyIHZlY3RvciBbMSxtX3FyKGsrMSxrKSwgbV9xcihrKzIsayksIC4uLl0KKyAgICBjb25zdCBJbmRleCByb3dzID0gbV9xci5yb3dzKCk7CisgICAgY29uc3QgSW5kZXggY29scyA9IG1fcXIuY29scygpOworICAgIGNvbnN0IEluZGV4IHNpemUgPSAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOworICAgIHdvcmtzcGFjZS5yZXNpemUocm93cyk7CisgICAgcmVzdWx0LnNldElkZW50aXR5KHJvd3MsIHJvd3MpOworICAgIGZvciAoSW5kZXggayA9IHNpemUtMTsgayA+PSAwOyBrLS0pCisgICAgeworICAgICAgcmVzdWx0LmJsb2NrKGssIGssIHJvd3Mtaywgcm93cy1rKQorICAgICAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobV9xci5jb2woaykudGFpbChyb3dzLWstMSksIGNvbmoobV9oQ29lZmZzLmNvZWZmKGspKSwgJndvcmtzcGFjZS5jb2VmZlJlZihrKSk7CisgICAgICByZXN1bHQucm93KGspLnN3YXAocmVzdWx0LnJvdyhtX3Jvd3NUcmFuc3Bvc2l0aW9ucy5jb2VmZihrKSkpOworICAgIH0KKyAgfQorCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3FyLnJvd3MoKTsgfQorICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9xci5yb3dzKCk7IH0KKworcHJvdGVjdGVkOgorICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9xcjsKKyAgdHlwZW5hbWUgSENvZWZmc1R5cGU6Ok5lc3RlZCBtX2hDb2VmZnM7CisgIHR5cGVuYW1lIEludERpYWdTaXplVmVjdG9yVHlwZTo6TmVzdGVkIG1fcm93c1RyYW5zcG9zaXRpb25zOworfTsKKworLy8gdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKy8vIHN0cnVjdCBldmFsdWF0b3I8RnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiA+CisvLyAgOiBwdWJsaWMgZXZhbHVhdG9yPFJldHVybkJ5VmFsdWU8RnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiA+ID4KKy8vIHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB0eXBlbmFtZSBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6TWF0cml4UVJldHVyblR5cGUgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46Om1hdHJpeFEoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIHJldHVybiBNYXRyaXhRUmV0dXJuVHlwZShtX3FyLCBtX2hDb2VmZnMsIG1fcm93c190cmFuc3Bvc2l0aW9ucyk7Cit9CisKKy8qKiBccmV0dXJuIHRoZSBmdWxsLXBpdm90aW5nIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgRnVsbFBpdkhvdXNlaG9sZGVyUVIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBGdWxsUGl2SG91c2Vob2xkZXJRUjx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmZ1bGxQaXZIb3VzZWhvbGRlclFyKCkgY29uc3QKK3sKKyAgcmV0dXJuIEZ1bGxQaXZIb3VzZWhvbGRlclFSPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0ZVTExQSVZPVElOR0hPVVNFSE9MREVSUVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1FSL0hvdXNlaG9sZGVyUVIuaCBiL0VpZ2VuL3NyYy9RUi9Ib3VzZWhvbGRlclFSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxM2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Ib3VzZWhvbGRlclFSLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgVmluY2VudCBMZWpldW5lCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1FSX0gKKyNkZWZpbmUgRUlHRU5fUVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFFSX01vZHVsZQorICAqCisgICoKKyAgKiBcY2xhc3MgSG91c2Vob2xkZXJRUgorICAqCisgICogXGJyaWVmIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBRUiBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGEgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCBcYiBBIGludG8gbWF0cmljZXMgXGIgUSBhbmQgXGIgUgorICAqIHN1Y2ggdGhhdCAKKyAgKiBcZlsKKyAgKiAgXG1hdGhiZntBfSA9IFxtYXRoYmZ7UX0gXCwgXG1hdGhiZntSfQorICAqIFxmXQorICAqIGJ5IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucy4gSGVyZSwgXGIgUSBhIHVuaXRhcnkgbWF0cml4IGFuZCBcYiBSIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIGEgY29tcGFjdCB3YXkgY29tcGF0aWJsZSB3aXRoIExBUEFDSy4KKyAgKgorICAqIE5vdGUgdGhhdCBubyBwaXZvdGluZyBpcyBwZXJmb3JtZWQuIFRoaXMgaXMgXGIgbm90IGEgcmFuay1yZXZlYWxpbmcgZGVjb21wb3NpdGlvbi4KKyAgKiBJZiB5b3Ugd2FudCB0aGF0IGZlYXR1cmUsIHVzZSBGdWxsUGl2SG91c2Vob2xkZXJRUiBvciBDb2xQaXZIb3VzZWhvbGRlclFSIGluc3RlYWQuCisgICoKKyAgKiBUaGlzIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gaXMgZmFzdGVyLCBidXQgbGVzcyBudW1lcmljYWxseSBzdGFibGUgYW5kIGxlc3MgZmVhdHVyZS1mdWxsIHRoYW4KKyAgKiBGdWxsUGl2SG91c2Vob2xkZXJRUiBvciBDb2xQaXZIb3VzZWhvbGRlclFSLgorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIG1lY2hhbmlzbS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpob3VzZWhvbGRlclFyKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBIb3VzZWhvbGRlclFSCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICAvLyBGSVhNRSBzaG91bGQgYmUgaW50CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lLCAoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBNYXRyaXhRVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9kaWFnX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgSENvZWZmc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBIQ29lZmZzVHlwZTo6Q29uanVnYXRlUmV0dXJuVHlwZT46OnR5cGU+IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworCisgICAgLyoqCisgICAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBIb3VzZWhvbGRlclFSOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAgICovCisgICAgSG91c2Vob2xkZXJRUigpIDogbV9xcigpLCBtX2hDb2VmZnMoKSwgbV90ZW1wKCksIG1faXNJbml0aWFsaXplZChmYWxzZSkge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBIb3VzZWhvbGRlclFSKCkKKyAgICAgICovCisgICAgSG91c2Vob2xkZXJRUihJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX3FyKHJvd3MsIGNvbHMpLAorICAgICAgICBtX2hDb2VmZnMoKHN0ZDo6bWluKShyb3dzLGNvbHMpKSwKKyAgICAgICAgbV90ZW1wKGNvbHMpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYSBRUiBmYWN0b3JpemF0aW9uIGZyb20gYSBnaXZlbiBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjb21wdXRlcyB0aGUgUVIgZmFjdG9yaXphdGlvbiBvZiB0aGUgbWF0cml4IFxhIG1hdHJpeCBieSBjYWxsaW5nCisgICAgICAqIHRoZSBtZXRob2QgY29tcHV0ZSgpLiBJdCBpcyBhIHNob3J0IGN1dCBmb3I6CisgICAgICAqIAorICAgICAgKiBcY29kZQorICAgICAgKiBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgKiBxci5jb21wdXRlKG1hdHJpeCk7CisgICAgICAqIFxlbmRjb2RlCisgICAgICAqIAorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBIb3VzZWhvbGRlclFSKGNvbnN0IEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgICA6IG1fcXIobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faENvZWZmcygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX3RlbXAobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeC5kZXJpdmVkKCkpOworICAgIH0KKworCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGEgUVIgZmFjdG9yaXphdGlvbiBmcm9tIGEgZ2l2ZW4gbWF0cml4CisgICAgICAqCisgICAgICAqIFRoaXMgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgXGxpbmsgSW5wbGFjZURlY29tcG9zaXRpb24gaW5wbGFjZSBkZWNvbXBvc2l0aW9uIFxlbmRsaW5rIHdoZW4KKyAgICAgICogXGMgTWF0cml4VHlwZSBpcyBhIEVpZ2VuOjpSZWYuCisgICAgICAqCisgICAgICAqIFxzYSBIb3VzZWhvbGRlclFSKGNvbnN0IEVpZ2VuQmFzZSYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0VHlwZT4KKyAgICBleHBsaWNpdCBIb3VzZWhvbGRlclFSKEVpZ2VuQmFzZTxJbnB1dFR5cGU+JiBtYXRyaXgpCisgICAgICA6IG1fcXIobWF0cml4LmRlcml2ZWQoKSksCisgICAgICAgIG1faENvZWZmcygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX3RlbXAobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlSW5QbGFjZSgpOworICAgIH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCBmaW5kcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIEF4PWIsIHdoZXJlIEEgaXMgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiwgaWYgYW55IGV4aXN0cy4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGIgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXF1YXRpb24gdG8gc29sdmUuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIGEgc29sdXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucworICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9hcmJpdHJhcnlfY2hvaWNlX29mX3NvbHV0aW9uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEhvdXNlaG9sZGVyUVJfc29sdmUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgU29sdmU8SG91c2Vob2xkZXJRUiwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBTb2x2ZTxIb3VzZWhvbGRlclFSLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdW5pdGFyeSBtYXRyaXggUSBhcyBhIHNlcXVlbmNlIG9mIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgICoKKyAgICAgICogVGhlIHJldHVybmVkIGV4cHJlc3Npb24gY2FuIGRpcmVjdGx5IGJlIHVzZWQgdG8gcGVyZm9ybSBtYXRyaXggcHJvZHVjdHMuIEl0IGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvIGEgZGVuc2UgTWF0cml4IG9iamVjdC4KKyAgICAgICogSGVyZSBpcyBhbiBleGFtcGxlIHNob3dpbmcgaG93IHRvIHJlY292ZXIgdGhlIGZ1bGwgb3IgdGhpbiBtYXRyaXggUSwgYXMgd2VsbCBhcyBob3cgdG8gcGVyZm9ybSBtYXRyaXggcHJvZHVjdHMgdXNpbmcgb3BlcmF0b3IqOgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBIb3VzZWhvbGRlclFSX2hvdXNlaG9sZGVyUS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSG91c2Vob2xkZXJRUl9ob3VzZWhvbGRlclEub3V0CisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyUSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUobV9xciwgbV9oQ29lZmZzLmNvbmp1Z2F0ZSgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCB3aGVyZSB0aGUgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBpcyBzdG9yZWQKKyAgICAgICogaW4gYSBMQVBBQ0stY29tcGF0aWJsZSB3YXkuCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFFSKCkgY29uc3QKKyAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gbV9xcjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFR5cGU+CisgICAgSG91c2Vob2xkZXJRUiYgY29tcHV0ZShjb25zdCBFaWdlbkJhc2U8SW5wdXRUeXBlPiYgbWF0cml4KSB7CisgICAgICBtX3FyID0gbWF0cml4LmRlcml2ZWQoKTsKKyAgICAgIGNvbXB1dGVJblBsYWNlKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4gSXQgaGFzIG9ubHkgbGluZWFyIGNvbXBsZXhpdHkKKyAgICAgICogKHRoYXQgaXMsIE8obikgd2hlcmUgbiBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcXVhcmUgbWF0cml4KQorICAgICAgKiBhcyB0aGUgUVIgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgYSBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSBiaWcgb3Igc21hbGwsIHNvIGZvciBtYXRyaWNlcworICAgICAgKiBvZiBsYXJnZSBlbm91Z2ggZGltZW5zaW9uLCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgICAgKiBPbmUgd2F5IHRvIHdvcmsgYXJvdW5kIHRoYXQgaXMgdG8gdXNlIGxvZ0Fic0RldGVybWluYW50KCkgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogXHNhIGxvZ0Fic0RldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICAgICovCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBhYnNEZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuYXR1cmFsIGxvZyBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIFFSIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byB3b3JrIGFyb3VuZCB0aGUgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cgdGhhdCdzIGluaGVyZW50CisgICAgICAqIHRvIGRldGVybWluYW50IGNvbXB1dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgYWJzRGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIGxvZ0Fic0RldGVybWluYW50KCkgY29uc3Q7CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcXIucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3FyLmNvbHMoKTsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZmFjdG9yIFxjIFEuCisgICAgICAqIAorICAgICAgKiBGb3IgYWR2YW5jZWQgdXNlcyBvbmx5LgorICAgICAgKi8KKyAgICBjb25zdCBIQ29lZmZzVHlwZSYgaENvZWZmcygpIGNvbnN0IHsgcmV0dXJuIG1faENvZWZmczsgfQorICAgIAorICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbXB1dGVJblBsYWNlKCk7CisgICAgCisgICAgTWF0cml4VHlwZSBtX3FyOworICAgIEhDb2VmZnNUeXBlIG1faENvZWZmczsKKyAgICBSb3dWZWN0b3JUeXBlIG1fdGVtcDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OmFic0RldGVybWluYW50KCkgY29uc3QKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gYWJzKG1fcXIuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Ojpsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gbV9xci5kaWFnb25hbCgpLmN3aXNlQWJzKCkuYXJyYXkoKS5sb2coKS5zdW0oKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4UVIsIHR5cGVuYW1lIEhDb2VmZnM+Cit2b2lkIGhvdXNlaG9sZGVyX3FyX2lucGxhY2VfdW5ibG9ja2VkKE1hdHJpeFFSJiBtYXQsIEhDb2VmZnMmIGhDb2VmZnMsIHR5cGVuYW1lIE1hdHJpeFFSOjpTY2FsYXIqIHRlbXBEYXRhID0gMCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhRUjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhRUjo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBJbmRleCByb3dzID0gbWF0LnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG1hdC5jb2xzKCk7CisgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKHJvd3MsY29scyk7CisKKyAgZWlnZW5fYXNzZXJ0KGhDb2VmZnMuc2l6ZSgpID09IHNpemUpOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixNYXRyaXhRUjo6Q29sc0F0Q29tcGlsZVRpbWUsMT4gVGVtcFR5cGU7CisgIFRlbXBUeXBlIHRlbXBWZWN0b3I7CisgIGlmKHRlbXBEYXRhPT0wKQorICB7CisgICAgdGVtcFZlY3Rvci5yZXNpemUoY29scyk7CisgICAgdGVtcERhdGEgPSB0ZW1wVmVjdG9yLmRhdGEoKTsKKyAgfQorCisgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgeworICAgIEluZGV4IHJlbWFpbmluZ1Jvd3MgPSByb3dzIC0gazsKKyAgICBJbmRleCByZW1haW5pbmdDb2xzID0gY29scyAtIGsgLSAxOworCisgICAgUmVhbFNjYWxhciBiZXRhOworICAgIG1hdC5jb2woaykudGFpbChyZW1haW5pbmdSb3dzKS5tYWtlSG91c2Vob2xkZXJJblBsYWNlKGhDb2VmZnMuY29lZmZSZWYoayksIGJldGEpOworICAgIG1hdC5jb2VmZlJlZihrLGspID0gYmV0YTsKKworICAgIC8vIGFwcGx5IEggdG8gcmVtYWluaW5nIHBhcnQgb2YgbV9xciBmcm9tIHRoZSBsZWZ0CisgICAgbWF0LmJvdHRvbVJpZ2h0Q29ybmVyKHJlbWFpbmluZ1Jvd3MsIHJlbWFpbmluZ0NvbHMpCisgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KG1hdC5jb2woaykudGFpbChyZW1haW5pbmdSb3dzLTEpLCBoQ29lZmZzLmNvZWZmUmVmKGspLCB0ZW1wRGF0YStrKzEpOworICB9Cit9CisKKy8qKiBcaW50ZXJuYWwgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFFSLCB0eXBlbmFtZSBIQ29lZmZzLAorICB0eXBlbmFtZSBNYXRyaXhRUlNjYWxhciA9IHR5cGVuYW1lIE1hdHJpeFFSOjpTY2FsYXIsCisgIGJvb2wgSW5uZXJTdHJpZGVJc09uZSA9IChNYXRyaXhRUjo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDEgJiYgSENvZWZmczo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDEpPgorc3RydWN0IGhvdXNlaG9sZGVyX3FyX2lucGxhY2VfYmxvY2tlZAoreworICAvLyBUaGlzIGlzIHNwZWNpYWxpemVkIGZvciBNS0wtc3VwcG9ydGVkIFNjYWxhciB0eXBlcyBpbiBIb3VzZWhvbGRlclFSX01LTC5oCisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhRUiYgbWF0LCBIQ29lZmZzJiBoQ29lZmZzLCBJbmRleCBtYXhCbG9ja1NpemU9MzIsCisgICAgICB0eXBlbmFtZSBNYXRyaXhRUjo6U2NhbGFyKiB0ZW1wRGF0YSA9IDApCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFFSOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgQmxvY2s8TWF0cml4UVIsRHluYW1pYyxEeW5hbWljPiBCbG9ja1R5cGU7CisKKyAgICBJbmRleCByb3dzID0gbWF0LnJvd3MoKTsKKyAgICBJbmRleCBjb2xzID0gbWF0LmNvbHMoKTsKKyAgICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDEsQ29sTWFqb3IsTWF0cml4UVI6Ok1heENvbHNBdENvbXBpbGVUaW1lLDE+IFRlbXBUeXBlOworICAgIFRlbXBUeXBlIHRlbXBWZWN0b3I7CisgICAgaWYodGVtcERhdGE9PTApCisgICAgeworICAgICAgdGVtcFZlY3Rvci5yZXNpemUoY29scyk7CisgICAgICB0ZW1wRGF0YSA9IHRlbXBWZWN0b3IuZGF0YSgpOworICAgIH0KKworICAgIEluZGV4IGJsb2NrU2l6ZSA9IChzdGQ6Om1pbikobWF4QmxvY2tTaXplLHNpemUpOworCisgICAgSW5kZXggayA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsgKz0gYmxvY2tTaXplKQorICAgIHsKKyAgICAgIEluZGV4IGJzID0gKHN0ZDo6bWluKShzaXplLWssYmxvY2tTaXplKTsgIC8vIGFjdHVhbCBzaXplIG9mIHRoZSBibG9jaworICAgICAgSW5kZXggdGNvbHMgPSBjb2xzIC0gayAtIGJzOyAgICAgICAgICAgICAgLy8gdHJhaWxpbmcgY29sdW1ucworICAgICAgSW5kZXggYnJvd3MgPSByb3dzLWs7ICAgICAgICAgICAgICAgICAgICAgLy8gcm93cyBvZiB0aGUgYmxvY2sKKworICAgICAgLy8gcGFydGl0aW9uIHRoZSBtYXRyaXg6CisgICAgICAvLyAgICAgICAgQTAwIHwgQTAxIHwgQTAyCisgICAgICAvLyBtYXQgID0gQTEwIHwgQTExIHwgQTEyCisgICAgICAvLyAgICAgICAgQTIwIHwgQTIxIHwgQTIyCisgICAgICAvLyBhbmQgcGVyZm9ybXMgdGhlIHFyIGRlYyBvZiBbQTExXlQgQTEyXlRdXlQKKyAgICAgIC8vIGFuZCB1cGRhdGUgW0EyMV5UIEEyMl5UXV5UIHVzaW5nIGxldmVsIDMgb3BlcmF0aW9ucy4KKyAgICAgIC8vIEZpbmFsbHksIHRoZSBhbGdvcml0aG0gY29udGludWUgb24gQTIyCisKKyAgICAgIEJsb2NrVHlwZSBBMTFfMjEgPSBtYXQuYmxvY2soayxrLGJyb3dzLGJzKTsKKyAgICAgIEJsb2NrPEhDb2VmZnMsRHluYW1pYywxPiBoQ29lZmZzU2VnbWVudCA9IGhDb2VmZnMuc2VnbWVudChrLGJzKTsKKworICAgICAgaG91c2Vob2xkZXJfcXJfaW5wbGFjZV91bmJsb2NrZWQoQTExXzIxLCBoQ29lZmZzU2VnbWVudCwgdGVtcERhdGEpOworCisgICAgICBpZih0Y29scykKKyAgICAgIHsKKyAgICAgICAgQmxvY2tUeXBlIEEyMV8yMiA9IG1hdC5ibG9jayhrLGsrYnMsYnJvd3MsdGNvbHMpOworICAgICAgICBhcHBseV9ibG9ja19ob3VzZWhvbGRlcl9vbl90aGVfbGVmdChBMjFfMjIsQTExXzIxLGhDb2VmZnNTZWdtZW50LCBmYWxzZSk7IC8vIGZhbHNlID09IGJhY2t3YXJkCisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEc3RUeXBlPgordm9pZCBIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPjo6X3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0Cit7CisgIGNvbnN0IEluZGV4IHJhbmsgPSAoc3RkOjptaW4pKHJvd3MoKSwgY29scygpKTsKKyAgZWlnZW5fYXNzZXJ0KHJocy5yb3dzKCkgPT0gcm93cygpKTsKKworICB0eXBlbmFtZSBSaHNUeXBlOjpQbGFpbk9iamVjdCBjKHJocyk7CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBtYXRyaXggUSA9IEhfMF4qIEhfMV4qLi4uIHNvIGl0cyBpbnZlcnNlIGlzIFFeKiA9IChIXzAgSF8xIC4uLileVAorICBjLmFwcGx5T25UaGVMZWZ0KGhvdXNlaG9sZGVyU2VxdWVuY2UoCisgICAgbV9xci5sZWZ0Q29scyhyYW5rKSwKKyAgICBtX2hDb2VmZnMuaGVhZChyYW5rKSkudHJhbnNwb3NlKCkKKyAgKTsKKworICBtX3FyLnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykKKyAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgLnNvbHZlSW5QbGFjZShjLnRvcFJvd3MocmFuaykpOworCisgIGRzdC50b3BSb3dzKHJhbmspID0gYy50b3BSb3dzKHJhbmspOworICBkc3QuYm90dG9tUm93cyhjb2xzKCktcmFuaykuc2V0WmVybygpOworfQorI2VuZGlmCisKKy8qKiBQZXJmb3JtcyB0aGUgUVIgZmFjdG9yaXphdGlvbiBvZiB0aGUgZ2l2ZW4gbWF0cml4IFxhIG1hdHJpeC4gVGhlIHJlc3VsdCBvZgorICAqIHRoZSBmYWN0b3JpemF0aW9uIGlzIHN0b3JlZCBpbnRvIFxjICp0aGlzLCBhbmQgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKiBpcyByZXR1cm5lZC4KKyAgKgorICAqIFxzYSBjbGFzcyBIb3VzZWhvbGRlclFSLCBIb3VzZWhvbGRlclFSKGNvbnN0IE1hdHJpeFR5cGUmKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6Y29tcHV0ZUluUGxhY2UoKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgIAorICBJbmRleCByb3dzID0gbV9xci5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtX3FyLmNvbHMoKTsKKyAgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikocm93cyxjb2xzKTsKKworICBtX2hDb2VmZnMucmVzaXplKHNpemUpOworCisgIG1fdGVtcC5yZXNpemUoY29scyk7CisKKyAgaW50ZXJuYWw6OmhvdXNlaG9sZGVyX3FyX2lucGxhY2VfYmxvY2tlZDxNYXRyaXhUeXBlLCBIQ29lZmZzVHlwZT46OnJ1bihtX3FyLCBtX2hDb2VmZnMsIDQ4LCBtX3RlbXAuZGF0YSgpKTsKKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCisvKiogXHJldHVybiB0aGUgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBvZiBcYyAqdGhpcy4KKyAgKgorICAqIFxzYSBjbGFzcyBIb3VzZWhvbGRlclFSCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgSG91c2Vob2xkZXJRUjx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmhvdXNlaG9sZGVyUXIoKSBjb25zdAoreworICByZXR1cm4gSG91c2Vob2xkZXJRUjxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9RUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUl9MQVBBQ0tFLmggYi9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUl9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjN2Q1MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Ib3VzZWhvbGRlclFSX0xBUEFDS0UuaApAQCAtMCwwICsxLDY4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gTEFQQUNLZQorICogICAgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3L28gcGl2b3RpbmcgYmFzZWQgb24KKyAqICAgIExBUEFDS0VfP2dlcXJmIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1FSX0xBUEFDS0VfSAorI2RlZmluZSBFSUdFTl9RUl9MQVBBQ0tFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBMQVBBQ0tlICovCisKKyNkZWZpbmUgRUlHRU5fTEFQQUNLRV9RUl9OT1BJVihFSUdUWVBFLCBMQVBBQ0tFX1RZUEUsIExBUEFDS0VfUFJFRklYKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhRUiwgdHlwZW5hbWUgSENvZWZmcz4gXAorc3RydWN0IGhvdXNlaG9sZGVyX3FyX2lucGxhY2VfYmxvY2tlZDxNYXRyaXhRUiwgSENvZWZmcywgRUlHVFlQRSwgdHJ1ZT4gXAoreyBcCisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhRUiYgbWF0LCBIQ29lZmZzJiBoQ29lZmZzLCBJbmRleCA9IDMyLCBcCisgICAgICB0eXBlbmFtZSBNYXRyaXhRUjo6U2NhbGFyKiA9IDApIFwKKyAgeyBcCisgICAgbGFwYWNrX2ludCBtID0gKGxhcGFja19pbnQpIG1hdC5yb3dzKCk7IFwKKyAgICBsYXBhY2tfaW50IG4gPSAobGFwYWNrX2ludCkgbWF0LmNvbHMoKTsgXAorICAgIGxhcGFja19pbnQgbGRhID0gKGxhcGFja19pbnQpIG1hdC5vdXRlclN0cmlkZSgpOyBcCisgICAgbGFwYWNrX2ludCBtYXRyaXhfb3JkZXIgPSAoTWF0cml4UVI6OklzUm93TWFqb3IpID8gTEFQQUNLX1JPV19NQUpPUiA6IExBUEFDS19DT0xfTUFKT1I7IFwKKyAgICBMQVBBQ0tFXyMjTEFQQUNLRV9QUkVGSVgjI2dlcXJmKCBtYXRyaXhfb3JkZXIsIG0sIG4sIChMQVBBQ0tFX1RZUEUqKW1hdC5kYXRhKCksIGxkYSwgKExBUEFDS0VfVFlQRSopaENvZWZmcy5kYXRhKCkpOyBcCisgICAgaENvZWZmcy5hZGpvaW50SW5QbGFjZSgpOyBcCisgIH0gXAorfTsKKworRUlHRU5fTEFQQUNLRV9RUl9OT1BJVihkb3VibGUsIGRvdWJsZSwgZCkKK0VJR0VOX0xBUEFDS0VfUVJfTk9QSVYoZmxvYXQsIGZsb2F0LCBzKQorRUlHRU5fTEFQQUNLRV9RUl9OT1BJVihkY29tcGxleCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlLCB6KQorRUlHRU5fTEFQQUNLRV9RUl9OT1BJVihzY29tcGxleCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQsIGMpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1FSX0xBUEFDS0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NQUVJTdXBwb3J0L1N1aXRlU3BhcnNlUVJTdXBwb3J0LmggYi9FaWdlbi9zcmMvU1BRUlN1cHBvcnQvU3VpdGVTcGFyc2VRUlN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNkNTdjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NQUVJTdXBwb3J0L1N1aXRlU3BhcnNlUVJTdXBwb3J0LmgKQEAgLTAsMCArMSwzMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIERlc2lyZSBOdWVudHNhIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1VJVEVTUEFSU0VRUlNVUFBPUlRfSAorI2RlZmluZSBFSUdFTl9TVUlURVNQQVJTRVFSU1VQUE9SVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBTUFFSOyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU1BRUlR5cGU+IHN0cnVjdCBTUFFSTWF0cml4UVJldHVyblR5cGU7IAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTUFFSVHlwZT4gc3RydWN0IFNQUVJNYXRyaXhRVHJhbnNwb3NlUmV0dXJuVHlwZTsgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTUFFSVHlwZSwgdHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IFNQUVJfUVByb2R1Y3Q7CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNQUVJUeXBlPiBzdHJ1Y3QgdHJhaXRzPFNQUVJNYXRyaXhRUmV0dXJuVHlwZTxTUFFSVHlwZT4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgU1BRUlR5cGU6Ok1hdHJpeFR5cGUgUmV0dXJuVHlwZTsKKyAgICB9OworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTUFFSVHlwZT4gc3RydWN0IHRyYWl0czxTUFFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U1BRUlR5cGU+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFNQUVJUeXBlOjpNYXRyaXhUeXBlIFJldHVyblR5cGU7CisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU1BRUlR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCB0cmFpdHM8U1BRUl9RUHJvZHVjdDxTUFFSVHlwZSwgRGVyaXZlZD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKKyAgICB9OworICB9IC8vIEVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKyAgCisvKioKKyAgKiBcaW5ncm91cCBTUFFSU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgU1BRUgorICAqIFxicmllZiBTcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBiYXNlZCBvbiBTdWl0ZVNwYXJzZVFSIGxpYnJhcnkKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwZXJmb3JtIGEgbXVsdGl0aHJlYWRlZCBhbmQgbXVsdGlmcm9udGFsIHJhbmstcmV2ZWFsaW5nIFFSIGRlY29tcG9zaXRpb24KKyAgKiBvZiBzcGFyc2UgbWF0cmljZXMuIFRoZSByZXN1bHQgaXMgdGhlbiB1c2VkIHRvIHNvbHZlIGxpbmVhciBsZWFzdHNfc3F1YXJlIHN5c3RlbXMuCisgICogQ2xlYXJseSwgYSBRUiBmYWN0b3JpemF0aW9uIGlzIHJldHVybmVkIHN1Y2ggdGhhdCBBKlAgPSBRKlIgd2hlcmUgOgorICAqCisgICogUCBpcyB0aGUgY29sdW1uIHBlcm11dGF0aW9uLiBVc2UgY29sc1Blcm11dGF0aW9uKCkgdG8gZ2V0IGl0LgorICAqCisgICogUSBpcyB0aGUgb3J0aG9nb25hbCBtYXRyaXggcmVwcmVzZW50ZWQgYXMgSG91c2Vob2xkZXIgcmVmbGVjdG9ycy4KKyAgKiBVc2UgbWF0cml4USgpIHRvIGdldCBhbiBleHByZXNzaW9uIGFuZCBtYXRyaXhRKCkudHJhbnNwb3NlKCkgdG8gZ2V0IHRoZSB0cmFuc3Bvc2UuCisgICogWW91IGNhbiB0aGVuIGFwcGx5IGl0IHRvIGEgdmVjdG9yLgorICAqCisgICogUiBpcyB0aGUgc3BhcnNlIHRyaWFuZ3VsYXIgZmFjdG9yLiBVc2UgbWF0cml4UVIoKSB0byBnZXQgaXQgYXMgU3BhcnNlTWF0cml4LgorICAqIE5PVEUgOiBUaGUgSW5kZXggdHlwZSBvZiBSIGlzIGFsd2F5cyBTdWl0ZVNwYXJzZV9sb25nLiBZb3UgY2FuIGdldCBpdCB3aXRoIFNQUVI6OkluZGV4CisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIFRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIG11c3QgYmUgYSBjb2x1bW4tbWFqb3IgU3BhcnNlTWF0cml4PD4KKyAgKgorICAqIFxpbXBsc3BhcnNlc29sdmVyY29uY2VwdAorICAqCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorY2xhc3MgU1BRUiA6IHB1YmxpYyBTcGFyc2VTb2x2ZXJCYXNlPFNQUVI8X01hdHJpeFR5cGU+ID4KK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgU3BhcnNlU29sdmVyQmFzZTxTUFFSPF9NYXRyaXhUeXBlPiA+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBTdWl0ZVNwYXJzZV9sb25nIFN0b3JhZ2VJbmRleCA7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvciwgU3RvcmFnZUluZGV4PiBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWFwPFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIFN0b3JhZ2VJbmRleD4gPiBQZXJtdXRhdGlvblR5cGU7CisgICAgZW51bSB7CisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMKKyAgICB9OworICBwdWJsaWM6CisgICAgU1BRUigpIAorICAgICAgOiBtX29yZGVyaW5nKFNQUVJfT1JERVJJTkdfREVGQVVMVCksIG1fYWxsb3dfdG9sKFNQUVJfREVGQVVMVF9UT0wpLCBtX3RvbGVyYW5jZSAoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSksIG1fdXNlRGVmYXVsdFRocmVzaG9sZCh0cnVlKQorICAgIHsgCisgICAgICBjaG9sbW9kX2xfc3RhcnQoJm1fY2MpOworICAgIH0KKyAgICAKKyAgICBleHBsaWNpdCBTUFFSKGNvbnN0IF9NYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgOiBtX29yZGVyaW5nKFNQUVJfT1JERVJJTkdfREVGQVVMVCksIG1fYWxsb3dfdG9sKFNQUVJfREVGQVVMVF9UT0wpLCBtX3RvbGVyYW5jZSAoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSksIG1fdXNlRGVmYXVsdFRocmVzaG9sZCh0cnVlKQorICAgIHsKKyAgICAgIGNob2xtb2RfbF9zdGFydCgmbV9jYyk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorICAgIAorICAgIH5TUFFSKCkKKyAgICB7CisgICAgICBTUFFSX2ZyZWUoKTsKKyAgICAgIGNob2xtb2RfbF9maW5pc2goJm1fY2MpOworICAgIH0KKyAgICB2b2lkIFNQUVJfZnJlZSgpCisgICAgeworICAgICAgY2hvbG1vZF9sX2ZyZWVfc3BhcnNlKCZtX0gsICZtX2NjKTsKKyAgICAgIGNob2xtb2RfbF9mcmVlX3NwYXJzZSgmbV9jUiwgJm1fY2MpOworICAgICAgY2hvbG1vZF9sX2ZyZWVfZGVuc2UoJm1fSFRhdSwgJm1fY2MpOworICAgICAgc3RkOjpmcmVlKG1fRSk7CisgICAgICBzdGQ6OmZyZWUobV9IUGludik7CisgICAgfQorCisgICAgdm9pZCBjb21wdXRlKGNvbnN0IF9NYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgaWYobV9pc0luaXRpYWxpemVkKSBTUFFSX2ZyZWUoKTsKKworICAgICAgTWF0cml4VHlwZSBtYXQobWF0cml4KTsKKyAgICAgIAorICAgICAgLyogQ29tcHV0ZSB0aGUgZGVmYXVsdCB0aHJlc2hvbGQgYXMgaW4gTWF0TGFiLCBzZWU6CisgICAgICAgKiBUaW0gRGF2aXMsICJBbGdvcml0aG0gOTE1LCBTdWl0ZVNwYXJzZVFSOiBNdWx0aWZyb250YWwgTXVsdGl0aHJlYWRlZCBSYW5rLVJldmVhbGluZworICAgICAgICogU3BhcnNlIFFSIEZhY3Rvcml6YXRpb24sIEFDTSBUcmFucy4gb24gTWF0aC4gU29mdC4gMzgoMSksIDIwMTEsIFBhZ2UgODozIAorICAgICAgICovCisgICAgICBSZWFsU2NhbGFyIHBpdm90VGhyZXNob2xkID0gbV90b2xlcmFuY2U7CisgICAgICBpZihtX3VzZURlZmF1bHRUaHJlc2hvbGQpIAorICAgICAgeworICAgICAgICBSZWFsU2NhbGFyIG1heDJOb3JtID0gMC4wOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1hdC5jb2xzKCk7IGorKykgbWF4Mk5vcm0gPSBudW1leHQ6Om1heGkobWF4Mk5vcm0sIG1hdC5jb2woaikubm9ybSgpKTsKKyAgICAgICAgaWYobWF4Mk5vcm09PVJlYWxTY2FsYXIoMCkpCisgICAgICAgICAgbWF4Mk5vcm0gPSBSZWFsU2NhbGFyKDEpOworICAgICAgICBwaXZvdFRocmVzaG9sZCA9IDIwICogKG1hdC5yb3dzKCkgKyBtYXQuY29scygpKSAqIG1heDJOb3JtICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCk7CisgICAgICB9CisgICAgICBjaG9sbW9kX3NwYXJzZSBBOyAKKyAgICAgIEEgPSB2aWV3QXNDaG9sbW9kKG1hdCk7CisgICAgICBtX3Jvd3MgPSBtYXRyaXgucm93cygpOworICAgICAgSW5kZXggY29sID0gbWF0cml4LmNvbHMoKTsKKyAgICAgIG1fcmFuayA9IFN1aXRlU3BhcnNlUVI8U2NhbGFyPihtX29yZGVyaW5nLCBwaXZvdFRocmVzaG9sZCwgY29sLCAmQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2NSLCAmbV9FLCAmbV9ILCAmbV9IUGludiwgJm1fSFRhdSwgJm1fY2MpOworCisgICAgICBpZiAoIW1fY1IpCisgICAgICB7CisgICAgICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICBtX2lzUlVwVG9EYXRlID0gZmFsc2U7CisgICAgfQorICAgIC8qKiAKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBpbnB1dCBtYXRyaXggYW5kIHRoZSBRIG1hdHJpeAorICAgICAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3Qge3JldHVybiBtX3Jvd3M7IH0KKyAgICAKKyAgICAvKiogCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgaW5wdXQgbWF0cml4LiAKKyAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY1ItPm5jb2w7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBNYXRyaXhCYXNlPFJocz4gJmIsIE1hdHJpeEJhc2U8RGVzdD4gJmRlc3QpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiIFRoZSBRUiBmYWN0b3JpemF0aW9uIHNob3VsZCBiZSBjb21wdXRlZCBmaXJzdCwgY2FsbCBjb21wdXRlKCkiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChiLmNvbHMoKT09MSAmJiAiVGhpcyBtZXRob2QgaXMgZm9yIHZlY3RvcnMgb25seSIpOworCisgICAgICAvL0NvbXB1dGUgUV5UICogYgorICAgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgeSwgeTI7CisgICAgICB5ID0gbWF0cml4USgpLnRyYW5zcG9zZSgpICogYjsKKyAgICAgIAorICAgICAgLy8gU29sdmVzIHdpdGggdGhlIHRyaWFuZ3VsYXIgbWF0cml4IFIKKyAgICAgIEluZGV4IHJrID0gdGhpcy0+cmFuaygpOworICAgICAgeTIgPSB5OworICAgICAgeS5yZXNpemUoKHN0ZDo6bWF4KShjb2xzKCksSW5kZXgoeS5yb3dzKCkpKSx5LmNvbHMoKSk7CisgICAgICB5LnRvcFJvd3MocmspID0gdGhpcy0+bWF0cml4UigpLnRvcExlZnRDb3JuZXIocmssIHJrKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh5Mi50b3BSb3dzKHJrKSk7CisKKyAgICAgIC8vIEFwcGx5IHRoZSBjb2x1bW4gcGVybXV0YXRpb24gCisgICAgICAvLyBjb2xzUGVybXV0YXRpb24oKSBwZXJmb3JtcyBhIGNvcHkgb2YgdGhlIHBlcm11dGF0aW9uLAorICAgICAgLy8gc28gbGV0J3MgYXBwbHkgaXQgbWFudWFsbHk6CisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByazsgKytpKSBkZXN0LnJvdyhtX0VbaV0pID0geS5yb3coaSk7CisgICAgICBmb3IoSW5kZXggaSA9IHJrOyBpIDwgY29scygpOyArK2kpIGRlc3Qucm93KG1fRVtpXSkuc2V0WmVybygpOworICAgICAgCisvLyAgICAgICB5LmJvdHRvbVJvd3MoeS5yb3dzKCktcmspLnNldFplcm8oKTsKKy8vICAgICAgIGRlc3QgPSBjb2xzUGVybXV0YXRpb24oKSAqIHkudG9wUm93cyhjb2xzKCkpOworICAgICAgCisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHNwYXJzZSB0cmlhbmd1bGFyIGZhY3RvciBSLiBJdCBpcyBhIHNwYXJzZSBtYXRyaXgKKyAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlIG1hdHJpeFIoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIiBUaGUgUVIgZmFjdG9yaXphdGlvbiBzaG91bGQgYmUgY29tcHV0ZWQgZmlyc3QsIGNhbGwgY29tcHV0ZSgpIik7CisgICAgICBpZighbV9pc1JVcFRvRGF0ZSkgeworICAgICAgICBtX1IgPSB2aWV3QXNFaWdlbjxTY2FsYXIsQ29sTWFqb3IsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleD4oKm1fY1IpOworICAgICAgICBtX2lzUlVwVG9EYXRlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX1I7CisgICAgfQorICAgIC8vLyBHZXQgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbWF0cml4IFEKKyAgICBTUFFSTWF0cml4UVJldHVyblR5cGU8U1BRUj4gbWF0cml4USgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFNQUVJNYXRyaXhRUmV0dXJuVHlwZTxTUFFSPigqdGhpcyk7CisgICAgfQorICAgIC8vLyBHZXQgdGhlIHBlcm11dGF0aW9uIHRoYXQgd2FzIGFwcGxpZWQgdG8gY29sdW1ucyBvZiBBCisgICAgUGVybXV0YXRpb25UeXBlIGNvbHNQZXJtdXRhdGlvbigpIGNvbnN0CisgICAgeyAKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkRlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFBlcm11dGF0aW9uVHlwZShtX0UsIG1fY1ItPm5jb2wpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByYW5rIG9mIHRoZSBtYXRyaXguIAorICAgICAqIEl0IHNob3VsZCBiZSBlcXVhbCB0byBtYXRyaXhRUigpLmNvbHMgaWYgdGhlIG1hdHJpeCBpcyBmdWxsLXJhbmsKKyAgICAgKi8KKyAgICBJbmRleCByYW5rKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2NjLlNQUVJfaXN0YXRbNF07CisgICAgfQorICAgIC8vLyBTZXQgdGhlIGZpbGwtcmVkdWNpbmcgb3JkZXJpbmcgbWV0aG9kIHRvIGJlIHVzZWQKKyAgICB2b2lkIHNldFNQUVJPcmRlcmluZyhpbnQgb3JkKSB7IG1fb3JkZXJpbmcgPSBvcmQ7fQorICAgIC8vLyBTZXQgdGhlIHRvbGVyYW5jZSB0b2wgdG8gdHJlYXQgY29sdW1ucyB3aXRoIDItbm9ybSA8ID10b2wgYXMgemVybworICAgIHZvaWQgc2V0UGl2b3RUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYgdG9sKQorICAgIHsKKyAgICAgIG1fdXNlRGVmYXVsdFRocmVzaG9sZCA9IGZhbHNlOworICAgICAgbV90b2xlcmFuY2UgPSB0b2w7CisgICAgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFNQUVIgd29ya3NwYWNlICovCisgICAgY2hvbG1vZF9jb21tb24gKmNob2xtb2RDb21tb24oKSBjb25zdCB7IHJldHVybiAmbV9jYzsgfQorICAgIAorICAgIAorICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsCisgICAgICAqICAgICAgICAgIFxjIE51bWVyaWNhbElzc3VlIGlmIHRoZSBzcGFyc2UgUVIgY2FuIG5vdCBiZSBjb21wdXRlZAorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgbV9hbmFseXNpc0lzT2s7CisgICAgYm9vbCBtX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIG11dGFibGUgYm9vbCBtX2lzUlVwVG9EYXRlOworICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBpbnQgbV9vcmRlcmluZzsgLy8gT3JkZXJpbmcgbWV0aG9kIHRvIHVzZSwgc2VlIFNQUVIncyBtYW51YWwKKyAgICBpbnQgbV9hbGxvd190b2w7IC8vIEFsbG93IHRvIHVzZSBzb21lIHRvbGVyYW5jZSBkdXJpbmcgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24uCisgICAgUmVhbFNjYWxhciBtX3RvbGVyYW5jZTsgLy8gdHJlYXQgY29sdW1ucyB3aXRoIDItbm9ybSBiZWxvdyB0aGlzIHRvbGVyYW5jZSBhcyB6ZXJvCisgICAgbXV0YWJsZSBjaG9sbW9kX3NwYXJzZSAqbV9jUjsgLy8gVGhlIHNwYXJzZSBSIGZhY3RvciBpbiBjaG9sbW9kIGZvcm1hdAorICAgIG11dGFibGUgTWF0cml4VHlwZSBtX1I7IC8vIFRoZSBzcGFyc2UgbWF0cml4IFIgaW4gRWlnZW4gZm9ybWF0CisgICAgbXV0YWJsZSBTdG9yYWdlSW5kZXggKm1fRTsgLy8gVGhlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gY29sdW1ucworICAgIG11dGFibGUgY2hvbG1vZF9zcGFyc2UgKm1fSDsgIC8vVGhlIGhvdXNlaG9sZGVyIHZlY3RvcnMKKyAgICBtdXRhYmxlIFN0b3JhZ2VJbmRleCAqbV9IUGludjsgLy8gVGhlIHJvdyBwZXJtdXRhdGlvbiBvZiBICisgICAgbXV0YWJsZSBjaG9sbW9kX2RlbnNlICptX0hUYXU7IC8vIFRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgICBtdXRhYmxlIEluZGV4IG1fcmFuazsgLy8gVGhlIHJhbmsgb2YgdGhlIG1hdHJpeAorICAgIG11dGFibGUgY2hvbG1vZF9jb21tb24gbV9jYzsgLy8gV29ya3NwYWNlIGFuZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBtX3VzZURlZmF1bHRUaHJlc2hvbGQ7ICAgICAvLyBVc2UgZGVmYXVsdCB0aHJlc2hvbGQKKyAgICBJbmRleCBtX3Jvd3M7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLHR5cGVuYW1lID4gZnJpZW5kIHN0cnVjdCBTUFFSX1FQcm9kdWN0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNQUVJUeXBlLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IFNQUVJfUVByb2R1Y3QgOiBSZXR1cm5CeVZhbHVlPFNQUVJfUVByb2R1Y3Q8U1BRUlR5cGUsRGVyaXZlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNQUVJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNQUVJUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAvL0RlZmluZSB0aGUgY29uc3RydWN0b3IgdG8gZ2V0IHJlZmVyZW5jZSB0byBhcmd1bWVudCB0eXBlcworICBTUFFSX1FQcm9kdWN0KGNvbnN0IFNQUVJUeXBlJiBzcHFyLCBjb25zdCBEZXJpdmVkJiBvdGhlciwgYm9vbCB0cmFuc3Bvc2UpIDogbV9zcHFyKHNwcXIpLG1fb3RoZXIob3RoZXIpLG1fdHJhbnNwb3NlKHRyYW5zcG9zZSkge30KKyAgCisgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3Bvc2UgPyBtX3NwcXIucm93cygpIDogbV9zcHFyLmNvbHMoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fb3RoZXIuY29scygpOyB9CisgIC8vIEFzc2lnbiB0byBhIHZlY3RvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXNUeXBlPgorICB2b2lkIGV2YWxUbyhSZXNUeXBlJiByZXMpIGNvbnN0CisgIHsKKyAgICBjaG9sbW9kX2RlbnNlIHlfY2Q7CisgICAgY2hvbG1vZF9kZW5zZSAqeF9jZDsgCisgICAgaW50IG1ldGhvZCA9IG1fdHJhbnNwb3NlID8gU1BRUl9RVFggOiBTUFFSX1FYOyAKKyAgICBjaG9sbW9kX2NvbW1vbiAqY2MgPSBtX3NwcXIuY2hvbG1vZENvbW1vbigpOworICAgIHlfY2QgPSB2aWV3QXNDaG9sbW9kKG1fb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgIHhfY2QgPSBTdWl0ZVNwYXJzZVFSX3FtdWx0PFNjYWxhcj4obWV0aG9kLCBtX3NwcXIubV9ILCBtX3NwcXIubV9IVGF1LCBtX3NwcXIubV9IUGludiwgJnlfY2QsIGNjKTsKKyAgICByZXMgPSBNYXRyaXg8U2NhbGFyLFJlc1R5cGU6OlJvd3NBdENvbXBpbGVUaW1lLFJlc1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lPjo6TWFwKHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4oeF9jZC0+eCksIHhfY2QtPm5yb3csIHhfY2QtPm5jb2wpOworICAgIGNob2xtb2RfbF9mcmVlX2RlbnNlKCZ4X2NkLCBjYyk7CisgIH0KKyAgY29uc3QgU1BRUlR5cGUmIG1fc3BxcjsgCisgIGNvbnN0IERlcml2ZWQmIG1fb3RoZXI7IAorICBib29sIG1fdHJhbnNwb3NlOyAKKyAgCit9OwordGVtcGxhdGU8dHlwZW5hbWUgU1BRUlR5cGU+CitzdHJ1Y3QgU1BRUk1hdHJpeFFSZXR1cm5UeXBleworICAKKyAgU1BRUk1hdHJpeFFSZXR1cm5UeXBlKGNvbnN0IFNQUVJUeXBlJiBzcHFyKSA6IG1fc3BxcihzcHFyKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBTUFFSX1FQcm9kdWN0PFNQUVJUeXBlLCBEZXJpdmVkPiBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpCisgIHsKKyAgICByZXR1cm4gU1BRUl9RUHJvZHVjdDxTUFFSVHlwZSxEZXJpdmVkPihtX3NwcXIsb3RoZXIuZGVyaXZlZCgpLGZhbHNlKTsKKyAgfQorICBTUFFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U1BRUlR5cGU+IGFkam9pbnQoKSBjb25zdAorICB7CisgICAgcmV0dXJuIFNQUVJNYXRyaXhRVHJhbnNwb3NlUmV0dXJuVHlwZTxTUFFSVHlwZT4obV9zcHFyKTsKKyAgfQorICAvLyBUbyB1c2UgZm9yIG9wZXJhdGlvbnMgd2l0aCB0aGUgdHJhbnNwb3NlIG9mIFEKKyAgU1BRUk1hdHJpeFFUcmFuc3Bvc2VSZXR1cm5UeXBlPFNQUVJUeXBlPiB0cmFuc3Bvc2UoKSBjb25zdAorICB7CisgICAgcmV0dXJuIFNQUVJNYXRyaXhRVHJhbnNwb3NlUmV0dXJuVHlwZTxTUFFSVHlwZT4obV9zcHFyKTsKKyAgfQorICBjb25zdCBTUFFSVHlwZSYgbV9zcHFyOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU1BRUlR5cGU+CitzdHJ1Y3QgU1BRUk1hdHJpeFFUcmFuc3Bvc2VSZXR1cm5UeXBleworICBTUFFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGUoY29uc3QgU1BRUlR5cGUmIHNwcXIpIDogbV9zcHFyKHNwcXIpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIFNQUVJfUVByb2R1Y3Q8U1BRUlR5cGUsRGVyaXZlZD4gb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgcmV0dXJuIFNQUVJfUVByb2R1Y3Q8U1BRUlR5cGUsRGVyaXZlZD4obV9zcHFyLG90aGVyLmRlcml2ZWQoKSwgdHJ1ZSk7CisgIH0KKyAgY29uc3QgU1BRUlR5cGUmIG1fc3BxcjsKK307CisKK30vLyBFbmQgbmFtZXNwYWNlIEVpZ2VuCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TVkQvQkRDU1ZELmggYi9FaWdlbi9zcmMvU1ZEL0JEQ1NWRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTQyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU1ZEL0JEQ1NWRC5oCkBAIC0wLDAgKzEsMTIzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vIAorLy8gV2UgdXNlZCB0aGUgIkEgRGl2aWRlLUFuZC1Db25xdWVyIEFsZ29yaXRobSBmb3IgdGhlIEJpZGlhZ29uYWwgU1ZEIgorLy8gcmVzZWFyY2ggcmVwb3J0IHdyaXR0ZW4gYnkgTWluZyBHdSBhbmQgU3RhbmxleSBDLkVpc2Vuc3RhdAorLy8gVGhlIGNvZGUgdmFyaWFibGUgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgdGhleSB1c2VkIGluIHRoZWlyIAorLy8gcmVwb3J0CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIEdhdXRoaWVyIEJydW4gPGJydW4uZ2F1dGhpZXJAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIE5pY29sYXMgQ2FycmUgPG5pY29sYXMuY2FycmVAZW5zaW1hZy5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBKZWFuIENlY2NhdG8gPGplYW4uY2VjY2F0b0BlbnNpbWFnLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFBpZXJyZSBab3BwaXRlbGxpIDxwaWVycmUuem9wcGl0ZWxsaUBlbnNpbWFnLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JEQ1NWRF9ICisjZGVmaW5lIEVJR0VOX0JEQ1NWRF9ICisvLyAjZGVmaW5lIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisvLyAjZGVmaW5lIEVJR0VOX0JEQ1NWRF9TQU5JVFlfQ0hFQ0tTCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKyNpZmRlZiBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorSU9Gb3JtYXQgYmRjc3ZkZm10KDgsIDAsICIsICIsICJcbiIsICIgIFsiLCAiXSIpOworI2VuZGlmCisgIAordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIEJEQ1NWRDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IAorc3RydWN0IHRyYWl0czxCRENTVkQ8X01hdHJpeFR5cGU+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworfTsgIAorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKyAgCisgIAorLyoqIFxpbmdyb3VwIFNWRF9Nb2R1bGUKKyAqCisgKgorICogXGNsYXNzIEJEQ1NWRAorICoKKyAqIFxicmllZiBjbGFzcyBCaWRpYWdvbmFsIERpdmlkZSBhbmQgQ29ucXVlciBTVkQKKyAqCisgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgU1ZEIGRlY29tcG9zaXRpb24KKyAqCisgKiBUaGlzIGNsYXNzIGZpcnN0IHJlZHVjZXMgdGhlIGlucHV0IG1hdHJpeCB0byBiaS1kaWFnb25hbCBmb3JtIHVzaW5nIGNsYXNzIFVwcGVyQmlkaWFnb25hbGl6YXRpb24sCisgKiBhbmQgdGhlbiBwZXJmb3JtcyBhIGRpdmlkZS1hbmQtY29ucXVlciBkaWFnb25hbGl6YXRpb24uIFNtYWxsIGJsb2NrcyBhcmUgZGlhZ29uYWxpemVkIHVzaW5nIGNsYXNzIEphY29iaVNWRC4KKyAqIFlvdSBjYW4gY29udHJvbCB0aGUgc3dpdGNoaW5nIHNpemUgd2l0aCB0aGUgc2V0U3dpdGNoU2l6ZSgpIG1ldGhvZCwgZGVmYXVsdCBpcyAxNi4KKyAqIEZvciBzbWFsbCBtYXRyaWNlICg8MTYpLCBpdCBpcyB0aHVzIHByZWZlcmFibGUgdG8gZGlyZWN0bHkgdXNlIEphY29iaVNWRC4gRm9yIGxhcmdlciBvbmVzLCBCRENTVkQgaXMgaGlnaGx5CisgKiByZWNvbW1lbmRlZCBhbmQgY2FuIHNldmVyYWwgb3JkZXIgb2YgbWFnbml0dWRlIGZhc3Rlci4KKyAqCisgKiBcd2FybmluZyB0aGlzIGFsZ29yaXRobSBpcyB1bmxpa2VseSB0byBwcm92aWRlIGFjY3VyYXRlIHJlc3VsdCB3aGVuIGNvbXBpbGVkIHdpdGggdW5zYWZlIG1hdGggb3B0aW1pemF0aW9ucy4KKyAqIEZvciBpbnN0YW5jZSwgdGhpcyBjb25jZXJucyBJbnRlbCdzIGNvbXBpbGVyIChJQ0MpLCB3aGljaCBwZXJmcm9tcyBzdWNoIG9wdGltaXphdGlvbiBieSBkZWZhdWx0IHVubGVzcworICogeW91IGNvbXBpbGUgd2l0aCB0aGUgXGMgLWZwLW1vZGVsIFxjIHByZWNpc2Ugb3B0aW9uLiBMaWtld2lzZSwgdGhlIFxjIC1mZmFzdC1tYXRoIG9wdGlvbiBvZiBHQ0Mgb3IgY2xhbmcgd2lsbAorICogc2lnbmlmaWNhbnRseSBkZWdyYWRlIHRoZSBhY2N1cmFjeS4KKyAqCisgKiBcc2EgY2xhc3MgSmFjb2JpU1ZECisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiAKK2NsYXNzIEJEQ1NWRCA6IHB1YmxpYyBTVkRCYXNlPEJEQ1NWRDxfTWF0cml4VHlwZT4gPgoreworICB0eXBlZGVmIFNWREJhc2U8QkRDU1ZEPiBCYXNlOworICAgIAorcHVibGljOgorICB1c2luZyBCYXNlOjpyb3dzOworICB1c2luZyBCYXNlOjpjb2xzOworICB1c2luZyBCYXNlOjpjb21wdXRlVTsKKyAgdXNpbmcgQmFzZTo6Y29tcHV0ZVY7CisgIAorICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6TGl0ZXJhbCBMaXRlcmFsOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAKKyAgICBEaWFnU2l6ZUF0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUpLCAKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCAKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLCAKKyAgICBNYXhEaWFnU2l6ZUF0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lKSwgCisgICAgTWF0cml4T3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6Ok1hdHJpeFVUeXBlIE1hdHJpeFVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6Ok1hdHJpeFZUeXBlIE1hdHJpeFZUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNpbmd1bGFyVmFsdWVzVHlwZSBTaW5ndWxhclZhbHVlc1R5cGU7CisgIAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yPiBNYXRyaXhYOworICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4gTWF0cml4WHI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQXJyYXk8UmVhbFNjYWxhciwgRHluYW1pYywgMT4gQXJyYXlYcjsKKyAgdHlwZWRlZiBBcnJheTxJbmRleCwxLER5bmFtaWM+IEFycmF5WGk7CisgIHR5cGVkZWYgUmVmPEFycmF5WHI+IEFycmF5UmVmOworICB0eXBlZGVmIFJlZjxBcnJheVhpPiBJbmRpY2VzUmVmOworCisgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgQkRDU1ZEOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICovCisgIEJEQ1NWRCgpIDogbV9hbGdvc3dhcCgxNiksIG1fbnVtSXRlcnMoMCkKKyAge30KKworCisgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAqCisgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIHNpemUuCisgICAqIFxzYSBCRENTVkQoKQorICAgKi8KKyAgQkRDU1ZEKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMgPSAwKQorICAgIDogbV9hbGdvc3dhcCgxNiksIG1fbnVtSXRlcnMoMCkKKyAgeworICAgIGFsbG9jYXRlKHJvd3MsIGNvbHMsIGNvbXB1dGF0aW9uT3B0aW9ucyk7CisgIH0KKworICAvKiogXGJyaWVmIENvbnN0cnVjdG9yIHBlcmZvcm1pbmcgdGhlIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgKgorICAgKiBccGFyYW0gbWF0cml4IHRoZSBtYXRyaXggdG8gZGVjb21wb3NlCisgICAqIFxwYXJhbSBjb21wdXRhdGlvbk9wdGlvbnMgb3B0aW9uYWwgcGFyYW1ldGVyIGFsbG93aW5nIHRvIHNwZWNpZnkgaWYgeW91IHdhbnQgZnVsbCBvciB0aGluIFUgb3IgViB1bml0YXJpZXMgdG8gYmUgY29tcHV0ZWQuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgbm9uZSBpcyBjb21wdXRlZC4gVGhpcyBpcyBhIGJpdCAtIGZpZWxkLCB0aGUgcG9zc2libGUgYml0cyBhcmUgI0NvbXB1dGVGdWxsVSwgI0NvbXB1dGVUaGluVSwgCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgI0NvbXB1dGVGdWxsViwgI0NvbXB1dGVUaGluVi4KKyAgICoKKyAgICogVGhpbiB1bml0YXJpZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHlvdXIgbWF0cml4IHR5cGUgaGFzIGEgRHluYW1pYyBudW1iZXIgb2YgY29sdW1ucyAoZm9yIGV4YW1wbGUgTWF0cml4WGYpLiBUaGV5IGFsc28gYXJlIG5vdAorICAgKiBhdmFpbGFibGUgd2l0aCB0aGUgKG5vbiAtIGRlZmF1bHQpIEZ1bGxQaXZIb3VzZWhvbGRlclFSIHByZWNvbmRpdGlvbmVyLgorICAgKi8KKyAgQkRDU1ZEKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyA9IDApCisgICAgOiBtX2FsZ29zd2FwKDE2KSwgbV9udW1JdGVycygwKQorICB7CisgICAgY29tcHV0ZShtYXRyaXgsIGNvbXB1dGF0aW9uT3B0aW9ucyk7CisgIH0KKworICB+QkRDU1ZEKCkgCisgIHsKKyAgfQorICAKKyAgLyoqIFxicmllZiBNZXRob2QgcGVyZm9ybWluZyB0aGUgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXggdXNpbmcgY3VzdG9tIG9wdGlvbnMuCisgICAqCisgICAqIFxwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCB0byBkZWNvbXBvc2UKKyAgICogXHBhcmFtIGNvbXB1dGF0aW9uT3B0aW9ucyBvcHRpb25hbCBwYXJhbWV0ZXIgYWxsb3dpbmcgdG8gc3BlY2lmeSBpZiB5b3Ugd2FudCBmdWxsIG9yIHRoaW4gVSBvciBWIHVuaXRhcmllcyB0byBiZSBjb21wdXRlZC4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBub25lIGlzIGNvbXB1dGVkLiBUaGlzIGlzIGEgYml0IC0gZmllbGQsIHRoZSBwb3NzaWJsZSBiaXRzIGFyZSAjQ29tcHV0ZUZ1bGxVLCAjQ29tcHV0ZVRoaW5VLCAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAjQ29tcHV0ZUZ1bGxWLCAjQ29tcHV0ZVRoaW5WLgorICAgKgorICAgKiBUaGluIHVuaXRhcmllcyBhcmUgb25seSBhdmFpbGFibGUgaWYgeW91ciBtYXRyaXggdHlwZSBoYXMgYSBEeW5hbWljIG51bWJlciBvZiBjb2x1bW5zIChmb3IgZXhhbXBsZSBNYXRyaXhYZikuIFRoZXkgYWxzbyBhcmUgbm90CisgICAqIGF2YWlsYWJsZSB3aXRoIHRoZSAobm9uIC0gZGVmYXVsdCkgRnVsbFBpdkhvdXNlaG9sZGVyUVIgcHJlY29uZGl0aW9uZXIuCisgICAqLworICBCRENTVkQmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKTsKKworICAvKiogXGJyaWVmIE1ldGhvZCBwZXJmb3JtaW5nIHRoZSBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCB1c2luZyBjdXJyZW50IG9wdGlvbnMuCisgICAqCisgICAqIFxwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCB0byBkZWNvbXBvc2UKKyAgICoKKyAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgY3VycmVudCBcYSBjb21wdXRhdGlvbk9wdGlvbnMsIGFzIGFscmVhZHkgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvciB0byBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCB1bnNpZ25lZCBpbnQpLgorICAgKi8KKyAgQkRDU1ZEJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgeworICAgIHJldHVybiBjb21wdXRlKG1hdHJpeCwgdGhpcy0+bV9jb21wdXRhdGlvbk9wdGlvbnMpOworICB9CisKKyAgdm9pZCBzZXRTd2l0Y2hTaXplKGludCBzKSAKKyAgeworICAgIGVpZ2VuX2Fzc2VydChzPjMgJiYgIkJEQ1NWRCB0aGUgc2l6ZSBvZiB0aGUgYWxnbyBzd2l0Y2ggaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAzIik7CisgICAgbV9hbGdvc3dhcCA9IHM7CisgIH0KKyAKK3ByaXZhdGU6CisgIHZvaWQgYWxsb2NhdGUoSW5kZXggcm93cywgSW5kZXggY29scywgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyk7CisgIHZvaWQgZGl2aWRlKEluZGV4IGZpcnN0Q29sLCBJbmRleCBsYXN0Q29sLCBJbmRleCBmaXJzdFJvd1csIEluZGV4IGZpcnN0Q29sVywgSW5kZXggc2hpZnQpOworICB2b2lkIGNvbXB1dGVTVkRvZk0oSW5kZXggZmlyc3RDb2wsIEluZGV4IG4sIE1hdHJpeFhyJiBVLCBWZWN0b3JUeXBlJiBzaW5nVmFscywgTWF0cml4WHImIFYpOworICB2b2lkIGNvbXB1dGVTaW5nVmFscyhjb25zdCBBcnJheVJlZiYgY29sMCwgY29uc3QgQXJyYXlSZWYmIGRpYWcsIGNvbnN0IEluZGljZXNSZWYmIHBlcm0sIFZlY3RvclR5cGUmIHNpbmdWYWxzLCBBcnJheVJlZiBzaGlmdHMsIEFycmF5UmVmIG11cyk7CisgIHZvaWQgcGVydHVyYkNvbDAoY29uc3QgQXJyYXlSZWYmIGNvbDAsIGNvbnN0IEFycmF5UmVmJiBkaWFnLCBjb25zdCBJbmRpY2VzUmVmJiBwZXJtLCBjb25zdCBWZWN0b3JUeXBlJiBzaW5nVmFscywgY29uc3QgQXJyYXlSZWYmIHNoaWZ0cywgY29uc3QgQXJyYXlSZWYmIG11cywgQXJyYXlSZWYgemhhdCk7CisgIHZvaWQgY29tcHV0ZVNpbmdWZWNzKGNvbnN0IEFycmF5UmVmJiB6aGF0LCBjb25zdCBBcnJheVJlZiYgZGlhZywgY29uc3QgSW5kaWNlc1JlZiYgcGVybSwgY29uc3QgVmVjdG9yVHlwZSYgc2luZ1ZhbHMsIGNvbnN0IEFycmF5UmVmJiBzaGlmdHMsIGNvbnN0IEFycmF5UmVmJiBtdXMsIE1hdHJpeFhyJiBVLCBNYXRyaXhYciYgVik7CisgIHZvaWQgZGVmbGF0aW9uNDMoSW5kZXggZmlyc3RDb2wsIEluZGV4IHNoaWZ0LCBJbmRleCBpLCBJbmRleCBzaXplKTsKKyAgdm9pZCBkZWZsYXRpb240NChJbmRleCBmaXJzdENvbHUgLCBJbmRleCBmaXJzdENvbG0sIEluZGV4IGZpcnN0Um93VywgSW5kZXggZmlyc3RDb2xXLCBJbmRleCBpLCBJbmRleCBqLCBJbmRleCBzaXplKTsKKyAgdm9pZCBkZWZsYXRpb24oSW5kZXggZmlyc3RDb2wsIEluZGV4IGxhc3RDb2wsIEluZGV4IGssIEluZGV4IGZpcnN0Um93VywgSW5kZXggZmlyc3RDb2xXLCBJbmRleCBzaGlmdCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEhvdXNlaG9sZGVyVSwgdHlwZW5hbWUgSG91c2Vob2xkZXJWLCB0eXBlbmFtZSBOYWl2ZVUsIHR5cGVuYW1lIE5haXZlVj4KKyAgdm9pZCBjb3B5VVYoY29uc3QgSG91c2Vob2xkZXJVICZob3VzZWhvbGRlclUsIGNvbnN0IEhvdXNlaG9sZGVyViAmaG91c2Vob2xkZXJWLCBjb25zdCBOYWl2ZVUgJm5haXZlVSwgY29uc3QgTmFpdmVWICZuYWl2ZXYpOworICB2b2lkIHN0cnVjdHVyZWRfdXBkYXRlKEJsb2NrPE1hdHJpeFhyLER5bmFtaWMsRHluYW1pYz4gQSwgY29uc3QgTWF0cml4WHIgJkIsIEluZGV4IG4xKTsKKyAgc3RhdGljIFJlYWxTY2FsYXIgc2VjdWxhckVxKFJlYWxTY2FsYXIgeCwgY29uc3QgQXJyYXlSZWYmIGNvbDAsIGNvbnN0IEFycmF5UmVmJiBkaWFnLCBjb25zdCBJbmRpY2VzUmVmICZwZXJtLCBjb25zdCBBcnJheVJlZiYgZGlhZ1NoaWZ0ZWQsIFJlYWxTY2FsYXIgc2hpZnQpOworCitwcm90ZWN0ZWQ6CisgIE1hdHJpeFhyIG1fbmFpdmVVLCBtX25haXZlVjsKKyAgTWF0cml4WHIgbV9jb21wdXRlZDsKKyAgSW5kZXggbV9uUmVjOworICBBcnJheVhyIG1fd29ya3NwYWNlOworICBBcnJheVhpIG1fd29ya3NwYWNlSTsKKyAgaW50IG1fYWxnb3N3YXA7CisgIGJvb2wgbV9pc1RyYW5zcG9zZSwgbV9jb21wVSwgbV9jb21wVjsKKyAgCisgIHVzaW5nIEJhc2U6Om1fc2luZ3VsYXJWYWx1ZXM7CisgIHVzaW5nIEJhc2U6Om1fZGlhZ1NpemU7CisgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZUZ1bGxVOworICB1c2luZyBCYXNlOjptX2NvbXB1dGVGdWxsVjsKKyAgdXNpbmcgQmFzZTo6bV9jb21wdXRlVGhpblU7CisgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZVRoaW5WOworICB1c2luZyBCYXNlOjptX21hdHJpeFU7CisgIHVzaW5nIEJhc2U6Om1fbWF0cml4VjsKKyAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICB1c2luZyBCYXNlOjptX25vbnplcm9TaW5ndWxhclZhbHVlczsKKworcHVibGljOiAgCisgIGludCBtX251bUl0ZXJzOworfTsgLy9lbmQgY2xhc3MgQkRDU1ZECisKKworLy8gTWV0aG9kIHRvIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG1hdHJpeCBhbmQgYXR0cmlidXRlcwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQkRDU1ZEPE1hdHJpeFR5cGU+OjphbGxvY2F0ZShJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKQoreworICBtX2lzVHJhbnNwb3NlID0gKGNvbHMgPiByb3dzKTsKKworICBpZiAoQmFzZTo6YWxsb2NhdGUocm93cywgY29scywgY29tcHV0YXRpb25PcHRpb25zKSkKKyAgICByZXR1cm47CisgIAorICBtX2NvbXB1dGVkID0gTWF0cml4WHI6Olplcm8obV9kaWFnU2l6ZSArIDEsIG1fZGlhZ1NpemUgKTsKKyAgbV9jb21wVSA9IGNvbXB1dGVWKCk7CisgIG1fY29tcFYgPSBjb21wdXRlVSgpOworICBpZiAobV9pc1RyYW5zcG9zZSkKKyAgICBzdGQ6OnN3YXAobV9jb21wVSwgbV9jb21wVik7CisgIAorICBpZiAobV9jb21wVSkgbV9uYWl2ZVUgPSBNYXRyaXhYcjo6WmVybyhtX2RpYWdTaXplICsgMSwgbV9kaWFnU2l6ZSArIDEgKTsKKyAgZWxzZSAgICAgICAgIG1fbmFpdmVVID0gTWF0cml4WHI6Olplcm8oMiwgbV9kaWFnU2l6ZSArIDEgKTsKKyAgCisgIGlmIChtX2NvbXBWKSBtX25haXZlViA9IE1hdHJpeFhyOjpaZXJvKG1fZGlhZ1NpemUsIG1fZGlhZ1NpemUpOworICAKKyAgbV93b3Jrc3BhY2UucmVzaXplKChtX2RpYWdTaXplKzEpKihtX2RpYWdTaXplKzEpKjMpOworICBtX3dvcmtzcGFjZUkucmVzaXplKDMqbV9kaWFnU2l6ZSk7Cit9Ly8gZW5kIGFsbG9jYXRlCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitCRENTVkQ8TWF0cml4VHlwZT4mIEJEQ1NWRDxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpIAoreworI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAiXG5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiI7CisjZW5kaWYKKyAgYWxsb2NhdGUobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSwgY29tcHV0YXRpb25PcHRpb25zKTsKKyAgdXNpbmcgc3RkOjphYnM7CisKKyAgY29uc3QgUmVhbFNjYWxhciBjb25zaWRlclplcm8gPSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpOworICAKKyAgLy8qKioqIHN0ZXAgLTEgLSBJZiB0aGUgcHJvYmxlbSBpcyB0b28gc21hbGwsIGRpcmVjdGx5IGZhbGxzIGJhY2sgdG8gSmFjb2JpU1ZEIGFuZCByZXR1cm4KKyAgaWYobWF0cml4LmNvbHMoKSA8IG1fYWxnb3N3YXApCisgIHsKKyAgICAvLyBGSVhNRSB0aGlzIGxpbmUgaW52b2x2ZXMgdGVtcG9yYXJpZXMKKyAgICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4ganN2ZChtYXRyaXgsY29tcHV0YXRpb25PcHRpb25zKTsKKyAgICBpZihjb21wdXRlVSgpKSBtX21hdHJpeFUgPSBqc3ZkLm1hdHJpeFUoKTsKKyAgICBpZihjb21wdXRlVigpKSBtX21hdHJpeFYgPSBqc3ZkLm1hdHJpeFYoKTsKKyAgICBtX3Npbmd1bGFyVmFsdWVzID0ganN2ZC5zaW5ndWxhclZhbHVlcygpOworICAgIG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzID0ganN2ZC5ub256ZXJvU2luZ3VsYXJWYWx1ZXMoKTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgLy8qKioqIHN0ZXAgMCAtIENvcHkgdGhlIGlucHV0IG1hdHJpeCBhbmQgYXBwbHkgc2NhbGluZyB0byByZWR1Y2Ugb3Zlci91bmRlci1mbG93cworICBSZWFsU2NhbGFyIHNjYWxlID0gbWF0cml4LmN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgaWYoc2NhbGU9PUxpdGVyYWwoMCkpIHNjYWxlID0gTGl0ZXJhbCgxKTsKKyAgTWF0cml4WCBjb3B5OworICBpZiAobV9pc1RyYW5zcG9zZSkgY29weSA9IG1hdHJpeC5hZGpvaW50KCkvc2NhbGU7CisgIGVsc2UgICAgICAgICAgICAgICBjb3B5ID0gbWF0cml4L3NjYWxlOworICAKKyAgLy8qKioqIHN0ZXAgMSAtIEJpZGlhZ29uYWxpemF0aW9uCisgIC8vIEZJWE1FIHRoaXMgbGluZSBpbnZvbHZlcyB0ZW1wb3JhcmllcworICBpbnRlcm5hbDo6VXBwZXJCaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhYPiBiaWQoY29weSk7CisKKyAgLy8qKioqIHN0ZXAgMiAtIERpdmlkZSAmIENvbnF1ZXIKKyAgbV9uYWl2ZVUuc2V0WmVybygpOworICBtX25haXZlVi5zZXRaZXJvKCk7CisgIC8vIEZJWE1FIHRoaXMgbGluZSBpbnZvbHZlcyBhIHRlbXBvcmFyeSBtYXRyaXgKKyAgbV9jb21wdXRlZC50b3BSb3dzKG1fZGlhZ1NpemUpID0gYmlkLmJpZGlhZ29uYWwoKS50b0RlbnNlTWF0cml4KCkudHJhbnNwb3NlKCk7CisgIG1fY29tcHV0ZWQudGVtcGxhdGUgYm90dG9tUm93czwxPigpLnNldFplcm8oKTsKKyAgZGl2aWRlKDAsIG1fZGlhZ1NpemUgLSAxLCAwLCAwLCAwKTsKKworICAvLyoqKiogc3RlcCAzIC0gQ29weSBzaW5ndWxhciB2YWx1ZXMgYW5kIHZlY3RvcnMKKyAgZm9yIChpbnQgaT0wOyBpPG1fZGlhZ1NpemU7IGkrKykKKyAgeworICAgIFJlYWxTY2FsYXIgYSA9IGFicyhtX2NvbXB1dGVkLmNvZWZmKGksIGkpKTsKKyAgICBtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKGkpID0gYSAqIHNjYWxlOworICAgIGlmIChhPGNvbnNpZGVyWmVybykKKyAgICB7CisgICAgICBtX25vbnplcm9TaW5ndWxhclZhbHVlcyA9IGk7CisgICAgICBtX3Npbmd1bGFyVmFsdWVzLnRhaWwobV9kaWFnU2l6ZSAtIGkgLSAxKS5zZXRaZXJvKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoaSA9PSBtX2RpYWdTaXplIC0gMSkKKyAgICB7CisgICAgICBtX25vbnplcm9TaW5ndWxhclZhbHVlcyA9IGkgKyAxOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyNpZmRlZiBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorLy8gICBzdGQ6OmNvdXQgPDwgIm1fbmFpdmVVXG4iIDw8IG1fbmFpdmVVIDw8ICJcblxuIjsKKy8vICAgc3RkOjpjb3V0IDw8ICJtX25haXZlVlxuIiA8PCBtX25haXZlViA8PCAiXG5cbiI7CisjZW5kaWYKKyAgaWYobV9pc1RyYW5zcG9zZSkgY29weVVWKGJpZC5ob3VzZWhvbGRlclYoKSwgYmlkLmhvdXNlaG9sZGVyVSgpLCBtX25haXZlViwgbV9uYWl2ZVUpOworICBlbHNlICAgICAgICAgICAgICBjb3B5VVYoYmlkLmhvdXNlaG9sZGVyVSgpLCBiaWQuaG91c2Vob2xkZXJWKCksIG1fbmFpdmVVLCBtX25haXZlVik7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfS8vIGVuZCBjb21wdXRlCisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIEhvdXNlaG9sZGVyVSwgdHlwZW5hbWUgSG91c2Vob2xkZXJWLCB0eXBlbmFtZSBOYWl2ZVUsIHR5cGVuYW1lIE5haXZlVj4KK3ZvaWQgQkRDU1ZEPE1hdHJpeFR5cGU+Ojpjb3B5VVYoY29uc3QgSG91c2Vob2xkZXJVICZob3VzZWhvbGRlclUsIGNvbnN0IEhvdXNlaG9sZGVyViAmaG91c2Vob2xkZXJWLCBjb25zdCBOYWl2ZVUgJm5haXZlVSwgY29uc3QgTmFpdmVWICZuYWl2ZVYpCit7CisgIC8vIE5vdGUgZXhjaGFuZ2Ugb2YgVSBhbmQgVjogbV9tYXRyaXhVIGlzIHNldCBmcm9tIG1fbmFpdmVWIGFuZCB2aWNlIHZlcnNhCisgIGlmIChjb21wdXRlVSgpKQorICB7CisgICAgSW5kZXggVWNvbHMgPSBtX2NvbXB1dGVUaGluVSA/IG1fZGlhZ1NpemUgOiBob3VzZWhvbGRlclUuY29scygpOworICAgIG1fbWF0cml4VSA9IE1hdHJpeFg6OklkZW50aXR5KGhvdXNlaG9sZGVyVS5jb2xzKCksIFVjb2xzKTsKKyAgICBtX21hdHJpeFUudG9wTGVmdENvcm5lcihtX2RpYWdTaXplLCBtX2RpYWdTaXplKSA9IG5haXZlVi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKS50b3BMZWZ0Q29ybmVyKG1fZGlhZ1NpemUsIG1fZGlhZ1NpemUpOworICAgIGhvdXNlaG9sZGVyVS5hcHBseVRoaXNPblRoZUxlZnQobV9tYXRyaXhVKTsgLy8gRklYTUUgdGhpcyBsaW5lIGludm9sdmVzIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorICB9CisgIGlmIChjb21wdXRlVigpKQorICB7CisgICAgSW5kZXggVmNvbHMgPSBtX2NvbXB1dGVUaGluViA/IG1fZGlhZ1NpemUgOiBob3VzZWhvbGRlclYuY29scygpOworICAgIG1fbWF0cml4ViA9IE1hdHJpeFg6OklkZW50aXR5KGhvdXNlaG9sZGVyVi5jb2xzKCksIFZjb2xzKTsKKyAgICBtX21hdHJpeFYudG9wTGVmdENvcm5lcihtX2RpYWdTaXplLCBtX2RpYWdTaXplKSA9IG5haXZlVS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKS50b3BMZWZ0Q29ybmVyKG1fZGlhZ1NpemUsIG1fZGlhZ1NpemUpOworICAgIGhvdXNlaG9sZGVyVi5hcHBseVRoaXNPblRoZUxlZnQobV9tYXRyaXhWKTsgLy8gRklYTUUgdGhpcyBsaW5lIGludm9sdmVzIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorICB9Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBQZXJmb3JtcyBBID0gQSAqIEIgZXhwbG9pdGluZyB0aGUgc3BlY2lhbCBzdHJ1Y3R1cmUgb2YgdGhlIG1hdHJpeCBBLiBTcGxpdHRpbmcgQSBhczoKKyAgKiAgQSA9IFtBMV0KKyAgKiAgICAgIFtBMl0KKyAgKiBzdWNoIHRoYXQgQTEucm93cygpPT1uMSwgdGhlbiB3ZSBhc3N1bWUgdGhhdCBhdCBsZWFzdCBoYWxmIG9mIHRoZSBjb2x1bW5zIG9mIEExIGFuZCBBMiBhcmUgemVyb3MuCisgICogV2UgY2FuIHRodXMgcGFjayB0aGVtIHByaW9yIHRvIHRoZSB0aGUgbWF0cml4IHByb2R1Y3QuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSB3b3J0aCB0aGUgZWZmb3J0IGlmIHRoZSBtYXRyaXggaXMgbGFyZ2UKKyAgKiBlbm91Z2guCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBCRENTVkQ8TWF0cml4VHlwZT46OnN0cnVjdHVyZWRfdXBkYXRlKEJsb2NrPE1hdHJpeFhyLER5bmFtaWMsRHluYW1pYz4gQSwgY29uc3QgTWF0cml4WHIgJkIsIEluZGV4IG4xKQoreworICBJbmRleCBuID0gQS5yb3dzKCk7CisgIGlmKG4+MTAwKQorICB7CisgICAgLy8gSWYgdGhlIG1hdHJpY2VzIGFyZSBsYXJnZSBlbm91Z2gsIGxldCdzIGV4cGxvaXQgdGhlIHNwYXJzZSBzdHJ1Y3R1cmUgb2YgQSBieQorICAgIC8vIHNwbGl0dGluZyBpdCBpbiBoYWxmICh3cnQgbjEpLCBhbmQgcGFja2luZyB0aGUgbm9uLXplcm8gY29sdW1ucy4KKyAgICBJbmRleCBuMiA9IG4gLSBuMTsKKyAgICBNYXA8TWF0cml4WHI+IEExKG1fd29ya3NwYWNlLmRhdGEoKSAgICAgICwgbjEsIG4pOworICAgIE1hcDxNYXRyaXhYcj4gQTIobV93b3Jrc3BhY2UuZGF0YSgpKyBuMSpuLCBuMiwgbik7CisgICAgTWFwPE1hdHJpeFhyPiBCMShtX3dvcmtzcGFjZS5kYXRhKCkrICBuKm4sIG4sICBuKTsKKyAgICBNYXA8TWF0cml4WHI+IEIyKG1fd29ya3NwYWNlLmRhdGEoKSsyKm4qbiwgbiwgIG4pOworICAgIEluZGV4IGsxPTAsIGsyPTA7CisgICAgZm9yKEluZGV4IGo9MDsgajxuOyArK2opCisgICAgeworICAgICAgaWYoIChBLmNvbChqKS5oZWFkKG4xKS5hcnJheSgpIT1MaXRlcmFsKDApKS5hbnkoKSApCisgICAgICB7CisgICAgICAgIEExLmNvbChrMSkgPSBBLmNvbChqKS5oZWFkKG4xKTsKKyAgICAgICAgQjEucm93KGsxKSA9IEIucm93KGopOworICAgICAgICArK2sxOworICAgICAgfQorICAgICAgaWYoIChBLmNvbChqKS50YWlsKG4yKS5hcnJheSgpIT1MaXRlcmFsKDApKS5hbnkoKSApCisgICAgICB7CisgICAgICAgIEEyLmNvbChrMikgPSBBLmNvbChqKS50YWlsKG4yKTsKKyAgICAgICAgQjIucm93KGsyKSA9IEIucm93KGopOworICAgICAgICArK2syOworICAgICAgfQorICAgIH0KKyAgCisgICAgQS50b3BSb3dzKG4xKS5ub2FsaWFzKCkgICAgPSBBMS5sZWZ0Q29scyhrMSkgKiBCMS50b3BSb3dzKGsxKTsKKyAgICBBLmJvdHRvbVJvd3MobjIpLm5vYWxpYXMoKSA9IEEyLmxlZnRDb2xzKGsyKSAqIEIyLnRvcFJvd3MoazIpOworICB9CisgIGVsc2UKKyAgeworICAgIE1hcDxNYXRyaXhYcixBbGlnbmVkPiB0bXAobV93b3Jrc3BhY2UuZGF0YSgpLG4sbik7CisgICAgdG1wLm5vYWxpYXMoKSA9IEEqQjsKKyAgICBBID0gdG1wOworICB9Cit9CisKKy8vIFRoZSBkaXZpZGUgYWxnb3JpdGhtIGlzIGRvbmUgImluIHBsYWNlIiwgd2UgYXJlIGFsd2F5cyB3b3JraW5nIG9uIHN1YnNldHMgb2YgdGhlIHNhbWUgbWF0cml4LiBUaGUgZGl2aWRlIG1ldGhvZHMgdGFrZXMgYXMgYXJndW1lbnQgdGhlIAorLy8gcGxhY2Ugb2YgdGhlIHN1Ym1hdHJpeCB3ZSBhcmUgY3VycmVudGx5IHdvcmtpbmcgb24uCisKKy8vQHBhcmFtIGZpcnN0Q29sIDogVGhlIEluZGV4IG9mIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIHN1Ym1hdHJpeCBvZiBtX2NvbXB1dGVkIGFuZCBmb3IgbV9uYWl2ZVU7CisvL0BwYXJhbSBsYXN0Q29sIDogVGhlIEluZGV4IG9mIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgc3VibWF0cml4IG9mIG1fY29tcHV0ZWQgYW5kIGZvciBtX25haXZlVTsgCisvLyBsYXN0Q29sICsgMSAtIGZpcnN0Q29sIGlzIHRoZSBzaXplIG9mIHRoZSBzdWJtYXRyaXguCisvL0BwYXJhbSBmaXJzdFJvd1cgOiBUaGUgSW5kZXggb2YgdGhlIGZpcnN0IHJvdyBvZiB0aGUgbWF0cml4IFcgdGhhdCB3ZSBhcmUgdG8gY2hhbmdlLiAoc2VlIHRoZSByZWZlcmVuY2UgcGFwZXIgc2VjdGlvbiAxIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFcpCisvL0BwYXJhbSBmaXJzdFJvd1cgOiBTYW1lIGFzIGZpcnN0Um93VyB3aXRoIHRoZSBjb2x1bW4uCisvL0BwYXJhbSBzaGlmdCA6IEVhY2ggdGltZSBvbmUgdGFrZXMgdGhlIGxlZnQgc3VibWF0cml4LCBvbmUgbXVzdCBhZGQgMSB0byB0aGUgc2hpZnQuIFdoeT8gQmVjYXVzZSEgV2UgYWN0dWFsbHkgd2FudCB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIFUgc3VibWF0cml4IAorLy8gdG8gYmVjb21lIHRoZSBmaXJzdCBjb2x1bW4gKCpjb2VmZikgYW5kIHRvIHNoaWZ0IGFsbCB0aGUgb3RoZXIgY29sdW1ucyB0byB0aGUgcmlnaHQuIFRoZXJlIGFyZSBtb3JlIGRldGFpbHMgb24gdGhlIHJlZmVyZW5jZSBwYXBlci4KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEJEQ1NWRDxNYXRyaXhUeXBlPjo6ZGl2aWRlIChJbmRleCBmaXJzdENvbCwgSW5kZXggbGFzdENvbCwgSW5kZXggZmlyc3RSb3dXLCBJbmRleCBmaXJzdENvbFcsIEluZGV4IHNoaWZ0KQoreworICAvLyByZXF1aXJlcyByb3dzID0gY29scyArIDE7CisgIHVzaW5nIHN0ZDo6cG93OworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICBjb25zdCBJbmRleCBuID0gbGFzdENvbCAtIGZpcnN0Q29sICsgMTsKKyAgY29uc3QgSW5kZXggayA9IG4vMjsKKyAgY29uc3QgUmVhbFNjYWxhciBjb25zaWRlclplcm8gPSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpOworICBSZWFsU2NhbGFyIGFscGhhSzsKKyAgUmVhbFNjYWxhciBiZXRhSzsgCisgIFJlYWxTY2FsYXIgcjA7IAorICBSZWFsU2NhbGFyIGxhbWJkYSwgcGhpLCBjMCwgczA7CisgIFZlY3RvclR5cGUgbCwgZjsKKyAgLy8gV2UgdXNlIHRoZSBvdGhlciBhbGdvcml0aG0gd2hpY2ggaXMgbW9yZSBlZmZpY2llbnQgZm9yIHNtYWxsIAorICAvLyBtYXRyaWNlcy4KKyAgaWYgKG4gPCBtX2FsZ29zd2FwKQorICB7CisgICAgLy8gRklYTUUgdGhpcyBsaW5lIGludm9sdmVzIHRlbXBvcmFyaWVzCisgICAgSmFjb2JpU1ZEPE1hdHJpeFhyPiBiKG1fY29tcHV0ZWQuYmxvY2soZmlyc3RDb2wsIGZpcnN0Q29sLCBuICsgMSwgbiksIENvbXB1dGVGdWxsVSB8IChtX2NvbXBWID8gQ29tcHV0ZUZ1bGxWIDogMCkpOworICAgIGlmIChtX2NvbXBVKQorICAgICAgbV9uYWl2ZVUuYmxvY2soZmlyc3RDb2wsIGZpcnN0Q29sLCBuICsgMSwgbiArIDEpLnJlYWwoKSA9IGIubWF0cml4VSgpOworICAgIGVsc2UgCisgICAgeworICAgICAgbV9uYWl2ZVUucm93KDApLnNlZ21lbnQoZmlyc3RDb2wsIG4gKyAxKS5yZWFsKCkgPSBiLm1hdHJpeFUoKS5yb3coMCk7CisgICAgICBtX25haXZlVS5yb3coMSkuc2VnbWVudChmaXJzdENvbCwgbiArIDEpLnJlYWwoKSA9IGIubWF0cml4VSgpLnJvdyhuKTsKKyAgICB9CisgICAgaWYgKG1fY29tcFYpIG1fbmFpdmVWLmJsb2NrKGZpcnN0Um93VywgZmlyc3RDb2xXLCBuLCBuKS5yZWFsKCkgPSBiLm1hdHJpeFYoKTsKKyAgICBtX2NvbXB1dGVkLmJsb2NrKGZpcnN0Q29sICsgc2hpZnQsIGZpcnN0Q29sICsgc2hpZnQsIG4gKyAxLCBuKS5zZXRaZXJvKCk7CisgICAgbV9jb21wdXRlZC5kaWFnb25hbCgpLnNlZ21lbnQoZmlyc3RDb2wgKyBzaGlmdCwgbikgPSBiLnNpbmd1bGFyVmFsdWVzKCkuaGVhZChuKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gV2UgdXNlIHRoZSBkaXZpZGUgYW5kIGNvbnF1ZXIgYWxnb3JpdGhtCisgIGFscGhhSyA9ICBtX2NvbXB1dGVkKGZpcnN0Q29sICsgaywgZmlyc3RDb2wgKyBrKTsKKyAgYmV0YUsgPSBtX2NvbXB1dGVkKGZpcnN0Q29sICsgayArIDEsIGZpcnN0Q29sICsgayk7CisgIC8vIFRoZSBkaXZpZGUgbXVzdCBiZSBkb25lIGluIHRoYXQgb3JkZXIgaW4gb3JkZXIgdG8gaGF2ZSBnb29kIHJlc3VsdHMuIERpdmlkZSBjaGFuZ2UgdGhlIGRhdGEgaW5zaWRlIHRoZSBzdWJtYXRyaWNlcworICAvLyBhbmQgdGhlIGRpdmlkZSBvZiB0aGUgcmlnaHQgc3VibWF0cmljZSByZWFkcyBvbmUgY29sdW1uIG9mIHRoZSBsZWZ0IHN1Ym1hdHJpY2UuIFRoYXQncyB3aHkgd2UgbmVlZCB0byB0cmVhdCB0aGUgCisgIC8vIHJpZ2h0IHN1Ym1hdHJpeCBiZWZvcmUgdGhlIGxlZnQgb25lLiAKKyAgZGl2aWRlKGsgKyAxICsgZmlyc3RDb2wsIGxhc3RDb2wsIGsgKyAxICsgZmlyc3RSb3dXLCBrICsgMSArIGZpcnN0Q29sVywgc2hpZnQpOworICBkaXZpZGUoZmlyc3RDb2wsIGsgLSAxICsgZmlyc3RDb2wsIGZpcnN0Um93VywgZmlyc3RDb2xXICsgMSwgc2hpZnQgKyAxKTsKKworICBpZiAobV9jb21wVSkKKyAgeworICAgIGxhbWJkYSA9IG1fbmFpdmVVKGZpcnN0Q29sICsgaywgZmlyc3RDb2wgKyBrKTsKKyAgICBwaGkgPSBtX25haXZlVShmaXJzdENvbCArIGsgKyAxLCBsYXN0Q29sICsgMSk7CisgIH0gCisgIGVsc2UgCisgIHsKKyAgICBsYW1iZGEgPSBtX25haXZlVSgxLCBmaXJzdENvbCArIGspOworICAgIHBoaSA9IG1fbmFpdmVVKDAsIGxhc3RDb2wgKyAxKTsKKyAgfQorICByMCA9IHNxcnQoKGFicyhhbHBoYUsgKiBsYW1iZGEpICogYWJzKGFscGhhSyAqIGxhbWJkYSkpICsgYWJzKGJldGFLICogcGhpKSAqIGFicyhiZXRhSyAqIHBoaSkpOworICBpZiAobV9jb21wVSkKKyAgeworICAgIGwgPSBtX25haXZlVS5yb3coZmlyc3RDb2wgKyBrKS5zZWdtZW50KGZpcnN0Q29sLCBrKTsKKyAgICBmID0gbV9uYWl2ZVUucm93KGZpcnN0Q29sICsgayArIDEpLnNlZ21lbnQoZmlyc3RDb2wgKyBrICsgMSwgbiAtIGsgLSAxKTsKKyAgfSAKKyAgZWxzZSAKKyAgeworICAgIGwgPSBtX25haXZlVS5yb3coMSkuc2VnbWVudChmaXJzdENvbCwgayk7CisgICAgZiA9IG1fbmFpdmVVLnJvdygwKS5zZWdtZW50KGZpcnN0Q29sICsgayArIDEsIG4gLSBrIC0gMSk7CisgIH0KKyAgaWYgKG1fY29tcFYpIG1fbmFpdmVWKGZpcnN0Um93VytrLCBmaXJzdENvbFcpID0gTGl0ZXJhbCgxKTsKKyAgaWYgKHIwPGNvbnNpZGVyWmVybykKKyAgeworICAgIGMwID0gTGl0ZXJhbCgxKTsKKyAgICBzMCA9IExpdGVyYWwoMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYzAgPSBhbHBoYUsgKiBsYW1iZGEgLyByMDsKKyAgICBzMCA9IGJldGFLICogcGhpIC8gcjA7CisgIH0KKyAgCisjaWZkZWYgRUlHRU5fQkRDU1ZEX1NBTklUWV9DSEVDS1MKKyAgYXNzZXJ0KG1fbmFpdmVVLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fbmFpdmVWLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fY29tcHV0ZWQuYWxsRmluaXRlKCkpOworI2VuZGlmCisgIAorICBpZiAobV9jb21wVSkKKyAgeworICAgIE1hdHJpeFhyIHExIChtX25haXZlVS5jb2woZmlyc3RDb2wgKyBrKS5zZWdtZW50KGZpcnN0Q29sLCBrICsgMSkpOyAgICAgCisgICAgLy8gd2Ugc2hpZnRXIFExIHRvIHRoZSByaWdodAorICAgIGZvciAoSW5kZXggaSA9IGZpcnN0Q29sICsgayAtIDE7IGkgPj0gZmlyc3RDb2w7IGktLSkgCisgICAgICBtX25haXZlVS5jb2woaSArIDEpLnNlZ21lbnQoZmlyc3RDb2wsIGsgKyAxKSA9IG1fbmFpdmVVLmNvbChpKS5zZWdtZW50KGZpcnN0Q29sLCBrICsgMSk7CisgICAgLy8gd2Ugc2hpZnQgcTEgYXQgdGhlIGxlZnQgd2l0aCBhIGZhY3RvciBjMAorICAgIG1fbmFpdmVVLmNvbChmaXJzdENvbCkuc2VnbWVudCggZmlyc3RDb2wsIGsgKyAxKSA9IChxMSAqIGMwKTsKKyAgICAvLyBsYXN0IGNvbHVtbiA9IHExICogLSBzMAorICAgIG1fbmFpdmVVLmNvbChsYXN0Q29sICsgMSkuc2VnbWVudChmaXJzdENvbCwgayArIDEpID0gKHExICogKCAtIHMwKSk7CisgICAgLy8gZmlyc3QgY29sdW1uID0gcTIgKiBzMAorICAgIG1fbmFpdmVVLmNvbChmaXJzdENvbCkuc2VnbWVudChmaXJzdENvbCArIGsgKyAxLCBuIC0gaykgPSBtX25haXZlVS5jb2wobGFzdENvbCArIDEpLnNlZ21lbnQoZmlyc3RDb2wgKyBrICsgMSwgbiAtIGspICogczA7IAorICAgIC8vIHEyICo9IGMwCisgICAgbV9uYWl2ZVUuY29sKGxhc3RDb2wgKyAxKS5zZWdtZW50KGZpcnN0Q29sICsgayArIDEsIG4gLSBrKSAqPSBjMDsKKyAgfSAKKyAgZWxzZSAKKyAgeworICAgIFJlYWxTY2FsYXIgcTEgPSBtX25haXZlVSgwLCBmaXJzdENvbCArIGspOworICAgIC8vIHdlIHNoaWZ0IFExIHRvIHRoZSByaWdodAorICAgIGZvciAoSW5kZXggaSA9IGZpcnN0Q29sICsgayAtIDE7IGkgPj0gZmlyc3RDb2w7IGktLSkgCisgICAgICBtX25haXZlVSgwLCBpICsgMSkgPSBtX25haXZlVSgwLCBpKTsKKyAgICAvLyB3ZSBzaGlmdCBxMSBhdCB0aGUgbGVmdCB3aXRoIGEgZmFjdG9yIGMwCisgICAgbV9uYWl2ZVUoMCwgZmlyc3RDb2wpID0gKHExICogYzApOworICAgIC8vIGxhc3QgY29sdW1uID0gcTEgKiAtIHMwCisgICAgbV9uYWl2ZVUoMCwgbGFzdENvbCArIDEpID0gKHExICogKCAtIHMwKSk7CisgICAgLy8gZmlyc3QgY29sdW1uID0gcTIgKiBzMAorICAgIG1fbmFpdmVVKDEsIGZpcnN0Q29sKSA9IG1fbmFpdmVVKDEsIGxhc3RDb2wgKyAxKSAqczA7IAorICAgIC8vIHEyICo9IGMwCisgICAgbV9uYWl2ZVUoMSwgbGFzdENvbCArIDEpICo9IGMwOworICAgIG1fbmFpdmVVLnJvdygxKS5zZWdtZW50KGZpcnN0Q29sICsgMSwgaykuc2V0WmVybygpOworICAgIG1fbmFpdmVVLnJvdygwKS5zZWdtZW50KGZpcnN0Q29sICsgayArIDEsIG4gLSBrIC0gMSkuc2V0WmVybygpOworICB9CisgIAorI2lmZGVmIEVJR0VOX0JEQ1NWRF9TQU5JVFlfQ0hFQ0tTCisgIGFzc2VydChtX25haXZlVS5hbGxGaW5pdGUoKSk7CisgIGFzc2VydChtX25haXZlVi5hbGxGaW5pdGUoKSk7CisgIGFzc2VydChtX2NvbXB1dGVkLmFsbEZpbml0ZSgpKTsKKyNlbmRpZgorICAKKyAgbV9jb21wdXRlZChmaXJzdENvbCArIHNoaWZ0LCBmaXJzdENvbCArIHNoaWZ0KSA9IHIwOworICBtX2NvbXB1dGVkLmNvbChmaXJzdENvbCArIHNoaWZ0KS5zZWdtZW50KGZpcnN0Q29sICsgc2hpZnQgKyAxLCBrKSA9IGFscGhhSyAqIGwudHJhbnNwb3NlKCkucmVhbCgpOworICBtX2NvbXB1dGVkLmNvbChmaXJzdENvbCArIHNoaWZ0KS5zZWdtZW50KGZpcnN0Q29sICsgc2hpZnQgKyBrICsgMSwgbiAtIGsgLSAxKSA9IGJldGFLICogZi50cmFuc3Bvc2UoKS5yZWFsKCk7CisKKyNpZmRlZiBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICBBcnJheVhyIHRtcDEgPSAobV9jb21wdXRlZC5ibG9jayhmaXJzdENvbCtzaGlmdCwgZmlyc3RDb2wrc2hpZnQsIG4sIG4pKS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpOworI2VuZGlmCisgIC8vIFNlY29uZCBwYXJ0OiB0cnkgdG8gZGVmbGF0ZSBzaW5ndWxhciB2YWx1ZXMgaW4gY29tYmluZWQgbWF0cml4CisgIGRlZmxhdGlvbihmaXJzdENvbCwgbGFzdENvbCwgaywgZmlyc3RSb3dXLCBmaXJzdENvbFcsIHNoaWZ0KTsKKyNpZmRlZiBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICBBcnJheVhyIHRtcDIgPSAobV9jb21wdXRlZC5ibG9jayhmaXJzdENvbCtzaGlmdCwgZmlyc3RDb2wrc2hpZnQsIG4sIG4pKS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpOworICBzdGQ6OmNvdXQgPDwgIlxuXG5qMSA9ICIgPDwgdG1wMS50cmFuc3Bvc2UoKS5mb3JtYXQoYmRjc3ZkZm10KSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImoyID0gIiA8PCB0bXAyLnRyYW5zcG9zZSgpLmZvcm1hdChiZGNzdmRmbXQpIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJlcnI6ICAgICAgIiA8PCAoKHRtcDEtdG1wMikuYWJzKCk+MWUtMTIqdG1wMi5hYnMoKSkudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgc3RhdGljIGludCBjb3VudCA9IDA7CisgIHN0ZDo6Y291dCA8PCAiIyAiIDw8ICsrY291bnQgPDwgIlxuXG4iOworICBhc3NlcnQoKHRtcDEtdG1wMikubWF0cml4KCkubm9ybSgpIDwgMWUtMTQqdG1wMi5tYXRyaXgoKS5ub3JtKCkpOworLy8gICBhc3NlcnQoY291bnQ8NjgxKTsKKy8vICAgYXNzZXJ0KCgodG1wMS10bXAyKS5hYnMoKTwxZS0xMyp0bXAyLmFicygpKS5hbGwoKSk7CisjZW5kaWYKKyAgCisgIC8vIFRoaXJkIHBhcnQ6IGNvbXB1dGUgU1ZEIG9mIGNvbWJpbmVkIG1hdHJpeAorICBNYXRyaXhYciBVb2ZTVkQsIFZvZlNWRDsKKyAgVmVjdG9yVHlwZSBzaW5nVmFsczsKKyAgY29tcHV0ZVNWRG9mTShmaXJzdENvbCArIHNoaWZ0LCBuLCBVb2ZTVkQsIHNpbmdWYWxzLCBWb2ZTVkQpOworICAKKyNpZmRlZiBFSUdFTl9CRENTVkRfU0FOSVRZX0NIRUNLUworICBhc3NlcnQoVW9mU1ZELmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KFZvZlNWRC5hbGxGaW5pdGUoKSk7CisjZW5kaWYKKyAgCisgIGlmIChtX2NvbXBVKQorICAgIHN0cnVjdHVyZWRfdXBkYXRlKG1fbmFpdmVVLmJsb2NrKGZpcnN0Q29sLCBmaXJzdENvbCwgbiArIDEsIG4gKyAxKSwgVW9mU1ZELCAobisyKS8yKTsKKyAgZWxzZQorICB7CisgICAgTWFwPE1hdHJpeDxSZWFsU2NhbGFyLDIsRHluYW1pYz4sQWxpZ25lZD4gdG1wKG1fd29ya3NwYWNlLmRhdGEoKSwyLG4rMSk7CisgICAgdG1wLm5vYWxpYXMoKSA9IG1fbmFpdmVVLm1pZGRsZUNvbHMoZmlyc3RDb2wsIG4rMSkgKiBVb2ZTVkQ7CisgICAgbV9uYWl2ZVUubWlkZGxlQ29scyhmaXJzdENvbCwgbiArIDEpID0gdG1wOworICB9CisgIAorICBpZiAobV9jb21wVikgIHN0cnVjdHVyZWRfdXBkYXRlKG1fbmFpdmVWLmJsb2NrKGZpcnN0Um93VywgZmlyc3RDb2xXLCBuLCBuKSwgVm9mU1ZELCAobisxKS8yKTsKKyAgCisjaWZkZWYgRUlHRU5fQkRDU1ZEX1NBTklUWV9DSEVDS1MKKyAgYXNzZXJ0KG1fbmFpdmVVLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fbmFpdmVWLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fY29tcHV0ZWQuYWxsRmluaXRlKCkpOworI2VuZGlmCisgIAorICBtX2NvbXB1dGVkLmJsb2NrKGZpcnN0Q29sICsgc2hpZnQsIGZpcnN0Q29sICsgc2hpZnQsIG4sIG4pLnNldFplcm8oKTsKKyAgbV9jb21wdXRlZC5ibG9jayhmaXJzdENvbCArIHNoaWZ0LCBmaXJzdENvbCArIHNoaWZ0LCBuLCBuKS5kaWFnb25hbCgpID0gc2luZ1ZhbHM7Cit9Ly8gZW5kIGRpdmlkZQorCisvLyBDb21wdXRlIFNWRCBvZiBtX2NvbXB1dGVkLmJsb2NrKGZpcnN0Q29sLCBmaXJzdENvbCwgbiArIDEsIG4pOyB0aGlzIGJsb2NrIG9ubHkgaGFzIG5vbi16ZXJvcyBpbgorLy8gdGhlIGZpcnN0IGNvbHVtbiBhbmQgb24gdGhlIGRpYWdvbmFsIGFuZCBoYXMgdW5kZXJnb25lIGRlZmxhdGlvbiwgc28gZGlhZ29uYWwgaXMgaW4gaW5jcmVhc2luZworLy8gb3JkZXIgZXhjZXB0IGZvciBwb3NzaWJseSB0aGUgKDAsMCkgZW50cnkuIFRoZSBjb21wdXRlZCBTVkQgaXMgc3RvcmVkIFUsIHNpbmdWYWxzIGFuZCBWLCBleGNlcHQKKy8vIHRoYXQgaWYgbV9jb21wViBpcyBmYWxzZSwgdGhlbiBWIGlzIG5vdCBjb21wdXRlZC4gU2luZ3VsYXIgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlci4KKy8vCisvLyBUT0RPIE9wcG9ydHVuaXRpZXMgZm9yIG9wdGltaXphdGlvbjogYmV0dGVyIHJvb3QgZmluZGluZyBhbGdvLCBiZXR0ZXIgc3RvcHBpbmcgY3JpdGVyaW9uLCBiZXR0ZXIKKy8vIGhhbmRsaW5nIG9mIHJvdW5kLW9mZiBlcnJvcnMsIGJlIGNvbnNpc3RlbnQgaW4gb3JkZXJpbmcKKy8vIEZvciBpbnN0YW5jZSwgdG8gc29sdmUgdGhlIHNlY3VsYXIgZXF1YXRpb24gdXNpbmcgRk1NLCBzZWUgaHR0cDovL3d3dy5zdGF0LnVjaGljYWdvLmVkdS9+bGVraGVuZy9jb3Vyc2VzLzMwMi9jbGFzc2ljcy9ncmVlbmdhcmQtcm9raGxpbi5wZGYKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBCRENTVkQ8TWF0cml4VHlwZT46OmNvbXB1dGVTVkRvZk0oSW5kZXggZmlyc3RDb2wsIEluZGV4IG4sIE1hdHJpeFhyJiBVLCBWZWN0b3JUeXBlJiBzaW5nVmFscywgTWF0cml4WHImIFYpCit7CisgIGNvbnN0IFJlYWxTY2FsYXIgY29uc2lkZXJaZXJvID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKTsKKyAgdXNpbmcgc3RkOjphYnM7CisgIEFycmF5UmVmIGNvbDAgPSBtX2NvbXB1dGVkLmNvbChmaXJzdENvbCkuc2VnbWVudChmaXJzdENvbCwgbik7CisgIG1fd29ya3NwYWNlLmhlYWQobikgPSAgbV9jb21wdXRlZC5ibG9jayhmaXJzdENvbCwgZmlyc3RDb2wsIG4sIG4pLmRpYWdvbmFsKCk7CisgIEFycmF5UmVmIGRpYWcgPSBtX3dvcmtzcGFjZS5oZWFkKG4pOworICBkaWFnKDApID0gTGl0ZXJhbCgwKTsKKworICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3Igc2luZ3VsYXIgdmFsdWVzIGFuZCB2ZWN0b3JzCisgIHNpbmdWYWxzLnJlc2l6ZShuKTsKKyAgVS5yZXNpemUobisxLCBuKzEpOworICBpZiAobV9jb21wVikgVi5yZXNpemUobiwgbik7CisKKyNpZmRlZiBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICBpZiAoY29sMC5oYXNOYU4oKSB8fCBkaWFnLmhhc05hTigpKQorICAgIHN0ZDo6Y291dCA8PCAiXG5cbkhBUyBOQU5cblxuIjsKKyNlbmRpZgorICAKKyAgLy8gTWFueSBzaW5ndWxhciB2YWx1ZXMgbWlnaHQgaGF2ZSBiZWVuIGRlZmxhdGVkLCB0aGUgemVybyBvbmVzIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZW5kLAorICAvLyBidXQgb3RoZXJzIGFyZSBpbnRlcmxlYXZlZCBhbmQgd2UgbXVzdCBpZ25vcmUgdGhlbSBhdCB0aGlzIHN0YWdlLgorICAvLyBUbyB0aGlzIGVuZCwgbGV0J3MgY29tcHV0ZSBhIHBlcm11dGF0aW9uIHNraXBwaW5nIHRoZW06CisgIEluZGV4IGFjdHVhbF9uID0gbjsKKyAgd2hpbGUoYWN0dWFsX24+MSAmJiBkaWFnKGFjdHVhbF9uLTEpPT1MaXRlcmFsKDApKSAtLWFjdHVhbF9uOworICBJbmRleCBtID0gMDsgLy8gc2l6ZSBvZiB0aGUgZGVmbGF0ZWQgcHJvYmxlbQorICBmb3IoSW5kZXggaz0wO2s8YWN0dWFsX247KytrKQorICAgIGlmKGFicyhjb2wwKGspKT5jb25zaWRlclplcm8pCisgICAgICBtX3dvcmtzcGFjZUkobSsrKSA9IGs7CisgIE1hcDxBcnJheVhpPiBwZXJtKG1fd29ya3NwYWNlSS5kYXRhKCksbSk7CisgIAorICBNYXA8QXJyYXlYcj4gc2hpZnRzKG1fd29ya3NwYWNlLmRhdGEoKSsxKm4sIG4pOworICBNYXA8QXJyYXlYcj4gbXVzKG1fd29ya3NwYWNlLmRhdGEoKSsyKm4sIG4pOworICBNYXA8QXJyYXlYcj4gemhhdChtX3dvcmtzcGFjZS5kYXRhKCkrMypuLCBuKTsKKworI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAiY29tcHV0ZVNWRG9mTSB1c2luZzpcbiI7CisgIHN0ZDo6Y291dCA8PCAiICB6OiAiIDw8IGNvbDAudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIGQ6ICIgPDwgZGlhZy50cmFuc3Bvc2UoKSA8PCAiXG4iOworI2VuZGlmCisgIAorICAvLyBDb21wdXRlIHNpbmdWYWxzLCBzaGlmdHMsIGFuZCBtdXMKKyAgY29tcHV0ZVNpbmdWYWxzKGNvbDAsIGRpYWcsIHBlcm0sIHNpbmdWYWxzLCBzaGlmdHMsIG11cyk7CisgIAorI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAiICBqOiAgICAgICAgIiA8PCAobV9jb21wdXRlZC5ibG9jayhmaXJzdENvbCwgZmlyc3RDb2wsIG4sIG4pKS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpLnRyYW5zcG9zZSgpLnJldmVyc2UoKSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiICBzaW5nLXZhbDogIiA8PCBzaW5nVmFscy50cmFuc3Bvc2UoKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgbXU6ICAgICAgICIgPDwgbXVzLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiICBzaGlmdDogICAgIiA8PCBzaGlmdHMudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgCisgIHsKKyAgICBJbmRleCBhY3R1YWxfbiA9IG47CisgICAgd2hpbGUoYWN0dWFsX24+MSAmJiBhYnMoY29sMChhY3R1YWxfbi0xKSk8Y29uc2lkZXJaZXJvKSAtLWFjdHVhbF9uOworICAgIHN0ZDo6Y291dCA8PCAiXG5cbiAgICBtdXM6ICAgICIgPDwgbXVzLmhlYWQoYWN0dWFsX24pLnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICBjaGVjazEgKGV4cGVjdDApIDogIiA8PCAoKHNpbmdWYWxzLmFycmF5KCktKHNoaWZ0cyttdXMpKSAvIHNpbmdWYWxzLmFycmF5KCkpLmhlYWQoYWN0dWFsX24pLnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICBjaGVjazIgKD4wKSAgICAgIDogIiA8PCAoKHNpbmdWYWxzLmFycmF5KCktZGlhZykgLyBzaW5nVmFscy5hcnJheSgpKS5oZWFkKGFjdHVhbF9uKS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgY2hlY2szICg+MCkgICAgICA6ICIgPDwgKChkaWFnLnNlZ21lbnQoMSxhY3R1YWxfbi0xKS1zaW5nVmFscy5oZWFkKGFjdHVhbF9uLTEpLmFycmF5KCkpIC8gc2luZ1ZhbHMuaGVhZChhY3R1YWxfbi0xKS5hcnJheSgpKS50cmFuc3Bvc2UoKSA8PCAiXG5cblxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICBjaGVjazQgKD4wKSAgICAgIDogIiA8PCAoKHNpbmdWYWxzLnNlZ21lbnQoMSxhY3R1YWxfbi0xKS1zaW5nVmFscy5oZWFkKGFjdHVhbF9uLTEpKSkudHJhbnNwb3NlKCkgPDwgIlxuXG5cbiI7CisgIH0KKyNlbmRpZgorICAKKyNpZmRlZiBFSUdFTl9CRENTVkRfU0FOSVRZX0NIRUNLUworICBhc3NlcnQoc2luZ1ZhbHMuYWxsRmluaXRlKCkpOworICBhc3NlcnQobXVzLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KHNoaWZ0cy5hbGxGaW5pdGUoKSk7CisjZW5kaWYKKyAgCisgIC8vIENvbXB1dGUgemhhdAorICBwZXJ0dXJiQ29sMChjb2wwLCBkaWFnLCBwZXJtLCBzaW5nVmFscywgc2hpZnRzLCBtdXMsIHpoYXQpOworI2lmZGVmICBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICBzdGQ6OmNvdXQgPDwgIiAgemhhdDogIiA8PCB6aGF0LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisjZW5kaWYKKyAgCisjaWZkZWYgRUlHRU5fQkRDU1ZEX1NBTklUWV9DSEVDS1MKKyAgYXNzZXJ0KHpoYXQuYWxsRmluaXRlKCkpOworI2VuZGlmCisgIAorICBjb21wdXRlU2luZ1ZlY3MoemhhdCwgZGlhZywgcGVybSwgc2luZ1ZhbHMsIHNoaWZ0cywgbXVzLCBVLCBWKTsKKyAgCisjaWZkZWYgIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAiVV5UIFU6ICIgPDwgKFUudHJhbnNwb3NlKCkgKiBVIC0gTWF0cml4WHIoTWF0cml4WHI6OklkZW50aXR5KFUuY29scygpLFUuY29scygpKSkpLm5vcm0oKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIlZeVCBWOiAiIDw8IChWLnRyYW5zcG9zZSgpICogViAtIE1hdHJpeFhyKE1hdHJpeFhyOjpJZGVudGl0eShWLmNvbHMoKSxWLmNvbHMoKSkpKS5ub3JtKCkgPDwgIlxuIjsKKyNlbmRpZgorICAKKyNpZmRlZiBFSUdFTl9CRENTVkRfU0FOSVRZX0NIRUNLUworICBhc3NlcnQoVS5hbGxGaW5pdGUoKSk7CisgIGFzc2VydChWLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KChVLnRyYW5zcG9zZSgpICogVSAtIE1hdHJpeFhyKE1hdHJpeFhyOjpJZGVudGl0eShVLmNvbHMoKSxVLmNvbHMoKSkpKS5ub3JtKCkgPCAxZS0xNCAqIG4pOworICBhc3NlcnQoKFYudHJhbnNwb3NlKCkgKiBWIC0gTWF0cml4WHIoTWF0cml4WHI6OklkZW50aXR5KFYuY29scygpLFYuY29scygpKSkpLm5vcm0oKSA8IDFlLTE0ICogbik7CisgIGFzc2VydChtX25haXZlVS5hbGxGaW5pdGUoKSk7CisgIGFzc2VydChtX25haXZlVi5hbGxGaW5pdGUoKSk7CisgIGFzc2VydChtX2NvbXB1dGVkLmFsbEZpbml0ZSgpKTsKKyNlbmRpZgorICAKKyAgLy8gQmVjYXVzZSBvZiBkZWZsYXRpb24sIHRoZSBzaW5ndWxhciB2YWx1ZXMgbWlnaHQgbm90IGJlIGNvbXBsZXRlbHkgc29ydGVkLgorICAvLyBGb3J0dW5hdGVseSwgcmVvcmRlcmluZyB0aGVtIGlzIGEgTyhuKSBwcm9ibGVtCisgIGZvcihJbmRleCBpPTA7IGk8YWN0dWFsX24tMTsgKytpKQorICB7CisgICAgaWYoc2luZ1ZhbHMoaSk+c2luZ1ZhbHMoaSsxKSkKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICBzd2FwKHNpbmdWYWxzKGkpLHNpbmdWYWxzKGkrMSkpOworICAgICAgVS5jb2woaSkuc3dhcChVLmNvbChpKzEpKTsKKyAgICAgIGlmKG1fY29tcFYpIFYuY29sKGkpLnN3YXAoVi5jb2woaSsxKSk7CisgICAgfQorICB9CisgIAorICAvLyBSZXZlcnNlIG9yZGVyIHNvIHRoYXQgc2luZ3VsYXIgdmFsdWVzIGluIGluY3JlYXNlZCBvcmRlcgorICAvLyBCZWNhdXNlIG9mIGRlZmxhdGlvbiwgdGhlIHplcm9zIHNpbmd1bGFyLXZhbHVlcyBhcmUgYWxyZWFkeSBhdCB0aGUgZW5kCisgIHNpbmdWYWxzLmhlYWQoYWN0dWFsX24pLnJldmVyc2VJblBsYWNlKCk7CisgIFUubGVmdENvbHMoYWN0dWFsX24pLnJvd3dpc2UoKS5yZXZlcnNlSW5QbGFjZSgpOworICBpZiAobV9jb21wVikgVi5sZWZ0Q29scyhhY3R1YWxfbikucm93d2lzZSgpLnJldmVyc2VJblBsYWNlKCk7CisgIAorI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIEphY29iaVNWRDxNYXRyaXhYcj4ganN2ZChtX2NvbXB1dGVkLmJsb2NrKGZpcnN0Q29sLCBmaXJzdENvbCwgbiwgbikgKTsKKyAgc3RkOjpjb3V0IDw8ICIgICogajogICAgICAgICIgPDwganN2ZC5zaW5ndWxhclZhbHVlcygpLnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgICogc2luZy12YWw6ICIgPDwgc2luZ1ZhbHMudHJhbnNwb3NlKCkgPDwgIlxuIjsKKy8vICAgc3RkOjpjb3V0IDw8ICIgICogZXJyOiAgICAgICIgPDwgKChqc3ZkLnNpbmd1bGFyVmFsdWVzKCktc2luZ1ZhbHMpPjFlLTEzKnNpbmdWYWxzLm5vcm0oKSkudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIEJEQ1NWRDxNYXRyaXhUeXBlPjo6UmVhbFNjYWxhciBCRENTVkQ8TWF0cml4VHlwZT46OnNlY3VsYXJFcShSZWFsU2NhbGFyIG11LCBjb25zdCBBcnJheVJlZiYgY29sMCwgY29uc3QgQXJyYXlSZWYmIGRpYWcsIGNvbnN0IEluZGljZXNSZWYgJnBlcm0sIGNvbnN0IEFycmF5UmVmJiBkaWFnU2hpZnRlZCwgUmVhbFNjYWxhciBzaGlmdCkKK3sKKyAgSW5kZXggbSA9IHBlcm0uc2l6ZSgpOworICBSZWFsU2NhbGFyIHJlcyA9IExpdGVyYWwoMSk7CisgIGZvcihJbmRleCBpPTA7IGk8bTsgKytpKQorICB7CisgICAgSW5kZXggaiA9IHBlcm0oaSk7CisgICAgcmVzICs9IG51bWV4dDo6YWJzMihjb2wwKGopKSAvICgoZGlhZ1NoaWZ0ZWQoaikgLSBtdSkgKiAoZGlhZyhqKSArIHNoaWZ0ICsgbXUpKTsKKyAgfQorICByZXR1cm4gcmVzOworCit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBCRENTVkQ8TWF0cml4VHlwZT46OmNvbXB1dGVTaW5nVmFscyhjb25zdCBBcnJheVJlZiYgY29sMCwgY29uc3QgQXJyYXlSZWYmIGRpYWcsIGNvbnN0IEluZGljZXNSZWYgJnBlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUmIHNpbmdWYWxzLCBBcnJheVJlZiBzaGlmdHMsIEFycmF5UmVmIG11cykKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKworICBJbmRleCBuID0gY29sMC5zaXplKCk7CisgIEluZGV4IGFjdHVhbF9uID0gbjsKKyAgd2hpbGUoYWN0dWFsX24+MSAmJiBjb2wwKGFjdHVhbF9uLTEpPT1MaXRlcmFsKDApKSAtLWFjdHVhbF9uOworCisgIGZvciAoSW5kZXggayA9IDA7IGsgPCBuOyArK2spCisgIHsKKyAgICBpZiAoY29sMChrKSA9PSBMaXRlcmFsKDApIHx8IGFjdHVhbF9uPT0xKQorICAgIHsKKyAgICAgIC8vIGlmIGNvbDAoaykgPT0gMCwgdGhlbiBlbnRyeSBpcyBkZWZsYXRlZCwgc28gc2luZ3VsYXIgdmFsdWUgaXMgb24gZGlhZ29uYWwKKyAgICAgIC8vIGlmIGFjdHVhbF9uPT0xLCB0aGVuIHRoZSBkZWZsYXRlZCBwcm9ibGVtIGlzIGFscmVhZHkgZGlhZ29uYWxpemVkCisgICAgICBzaW5nVmFscyhrKSA9IGs9PTAgPyBjb2wwKDApIDogZGlhZyhrKTsKKyAgICAgIG11cyhrKSA9IExpdGVyYWwoMCk7CisgICAgICBzaGlmdHMoaykgPSBrPT0wID8gY29sMCgwKSA6IGRpYWcoayk7CisgICAgICBjb250aW51ZTsKKyAgICB9IAorCisgICAgLy8gb3RoZXJ3aXNlLCB1c2Ugc2VjdWxhciBlcXVhdGlvbiB0byBmaW5kIHNpbmd1bGFyIHZhbHVlCisgICAgUmVhbFNjYWxhciBsZWZ0ID0gZGlhZyhrKTsKKyAgICBSZWFsU2NhbGFyIHJpZ2h0OyAvLyB3YXM6ID0gKGsgIT0gYWN0dWFsX24tMSkgPyBkaWFnKGsrMSkgOiAoZGlhZyhhY3R1YWxfbi0xKSArIGNvbDAubWF0cml4KCkubm9ybSgpKTsKKyAgICBpZihrPT1hY3R1YWxfbi0xKQorICAgICAgcmlnaHQgPSAoZGlhZyhhY3R1YWxfbi0xKSArIGNvbDAubWF0cml4KCkubm9ybSgpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgLy8gU2tpcCBkZWZsYXRlZCBzaW5ndWxhciB2YWx1ZXMKKyAgICAgIEluZGV4IGwgPSBrKzE7CisgICAgICB3aGlsZShjb2wwKGwpPT1MaXRlcmFsKDApKSB7ICsrbDsgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGw8YWN0dWFsX24pOyB9CisgICAgICByaWdodCA9IGRpYWcobCk7CisgICAgfQorCisgICAgLy8gZmlyc3QgZGVjaWRlIHdoZXRoZXIgaXQncyBjbG9zZXIgdG8gdGhlIGxlZnQgZW5kIG9yIHRoZSByaWdodCBlbmQKKyAgICBSZWFsU2NhbGFyIG1pZCA9IGxlZnQgKyAocmlnaHQtbGVmdCkgLyBMaXRlcmFsKDIpOworICAgIFJlYWxTY2FsYXIgZk1pZCA9IHNlY3VsYXJFcShtaWQsIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWcsIExpdGVyYWwoMCkpOworI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgICAgc3RkOjpjb3V0IDw8IHJpZ2h0LWxlZnQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImZNaWQgPSAiIDw8IGZNaWQgPDwgIiAiIDw8IHNlY3VsYXJFcShtaWQtbGVmdCwgY29sMCwgZGlhZywgcGVybSwgZGlhZy1sZWZ0LCBsZWZ0KSA8PCAiICIgPDwgc2VjdWxhckVxKG1pZC1yaWdodCwgY29sMCwgZGlhZywgcGVybSwgZGlhZy1yaWdodCwgcmlnaHQpICAgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICAgPSAiIDw8IHNlY3VsYXJFcSgwLjEqKGxlZnQrcmlnaHQpLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnLCAwKQorICAgICAgICAgICAgICA8PCAiICIgICAgICAgPDwgc2VjdWxhckVxKDAuMioobGVmdCtyaWdodCksIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWcsIDApCisgICAgICAgICAgICAgIDw8ICIgIiAgICAgICA8PCBzZWN1bGFyRXEoMC4zKihsZWZ0K3JpZ2h0KSwgY29sMCwgZGlhZywgcGVybSwgZGlhZywgMCkKKyAgICAgICAgICAgICAgPDwgIiAiICAgICAgIDw8IHNlY3VsYXJFcSgwLjQqKGxlZnQrcmlnaHQpLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnLCAwKQorICAgICAgICAgICAgICA8PCAiICIgICAgICAgPDwgc2VjdWxhckVxKDAuNDkqKGxlZnQrcmlnaHQpLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnLCAwKQorICAgICAgICAgICAgICA8PCAiICIgICAgICAgPDwgc2VjdWxhckVxKDAuNSoobGVmdCtyaWdodCksIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWcsIDApCisgICAgICAgICAgICAgIDw8ICIgIiAgICAgICA8PCBzZWN1bGFyRXEoMC41MSoobGVmdCtyaWdodCksIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWcsIDApCisgICAgICAgICAgICAgIDw8ICIgIiAgICAgICA8PCBzZWN1bGFyRXEoMC42KihsZWZ0K3JpZ2h0KSwgY29sMCwgZGlhZywgcGVybSwgZGlhZywgMCkKKyAgICAgICAgICAgICAgPDwgIiAiICAgICAgIDw8IHNlY3VsYXJFcSgwLjcqKGxlZnQrcmlnaHQpLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnLCAwKQorICAgICAgICAgICAgICA8PCAiICIgICAgICAgPDwgc2VjdWxhckVxKDAuOCoobGVmdCtyaWdodCksIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWcsIDApCisgICAgICAgICAgICAgIDw8ICIgIiAgICAgICA8PCBzZWN1bGFyRXEoMC45KihsZWZ0K3JpZ2h0KSwgY29sMCwgZGlhZywgcGVybSwgZGlhZywgMCkgPDwgIlxuIjsKKyNlbmRpZgorICAgIFJlYWxTY2FsYXIgc2hpZnQgPSAoayA9PSBhY3R1YWxfbi0xIHx8IGZNaWQgPiBMaXRlcmFsKDApKSA/IGxlZnQgOiByaWdodDsKKyAgICAKKyAgICAvLyBtZWFzdXJlIGV2ZXJ5dGhpbmcgcmVsYXRpdmUgdG8gc2hpZnQKKyAgICBNYXA8QXJyYXlYcj4gZGlhZ1NoaWZ0ZWQobV93b3Jrc3BhY2UuZGF0YSgpKzQqbiwgbik7CisgICAgZGlhZ1NoaWZ0ZWQgPSBkaWFnIC0gc2hpZnQ7CisgICAgCisgICAgLy8gaW5pdGlhbCBndWVzcworICAgIFJlYWxTY2FsYXIgbXVQcmV2LCBtdUN1cjsKKyAgICBpZiAoc2hpZnQgPT0gbGVmdCkKKyAgICB7CisgICAgICBtdVByZXYgPSAocmlnaHQgLSBsZWZ0KSAqIFJlYWxTY2FsYXIoMC4xKTsKKyAgICAgIGlmIChrID09IGFjdHVhbF9uLTEpIG11Q3VyID0gcmlnaHQgLSBsZWZ0OworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgbXVDdXIgPSAocmlnaHQgLSBsZWZ0KSAqIFJlYWxTY2FsYXIoMC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG11UHJldiA9IC0ocmlnaHQgLSBsZWZ0KSAqIFJlYWxTY2FsYXIoMC4xKTsKKyAgICAgIG11Q3VyID0gLShyaWdodCAtIGxlZnQpICogUmVhbFNjYWxhcigwLjUpOworICAgIH0KKworICAgIFJlYWxTY2FsYXIgZlByZXYgPSBzZWN1bGFyRXEobXVQcmV2LCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnU2hpZnRlZCwgc2hpZnQpOworICAgIFJlYWxTY2FsYXIgZkN1ciA9IHNlY3VsYXJFcShtdUN1ciwgY29sMCwgZGlhZywgcGVybSwgZGlhZ1NoaWZ0ZWQsIHNoaWZ0KTsKKyAgICBpZiAoYWJzKGZQcmV2KSA8IGFicyhmQ3VyKSkKKyAgICB7CisgICAgICBzd2FwKGZQcmV2LCBmQ3VyKTsKKyAgICAgIHN3YXAobXVQcmV2LCBtdUN1cik7CisgICAgfQorCisgICAgLy8gcmF0aW9uYWwgaW50ZXJwb2xhdGlvbjogZml0IGEgZnVuY3Rpb24gb2YgdGhlIGZvcm0gYSAvIG11ICsgYiB0aHJvdWdoIHRoZSB0d28gcHJldmlvdXMKKyAgICAvLyBpdGVyYXRlcyBhbmQgdXNlIGl0cyB6ZXJvIHRvIGNvbXB1dGUgdGhlIG5leHQgaXRlcmF0ZQorICAgIGJvb2wgdXNlQmlzZWN0aW9uID0gZlByZXYqZkN1cj5MaXRlcmFsKDApOworICAgIHdoaWxlIChmQ3VyIT1MaXRlcmFsKDApICYmIGFicyhtdUN1ciAtIG11UHJldikgPiBMaXRlcmFsKDgpICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkgKiBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oYWJzKG11Q3VyKSwgYWJzKG11UHJldikpICYmIGFicyhmQ3VyIC0gZlByZXYpPk51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpICYmICF1c2VCaXNlY3Rpb24pCisgICAgeworICAgICAgKyttX251bUl0ZXJzOworCisgICAgICAvLyBGaW5kIGEgYW5kIGIgc3VjaCB0aGF0IHRoZSBmdW5jdGlvbiBmKG11KSA9IGEgLyBtdSArIGIgbWF0Y2hlcyB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc2FtcGxlcy4KKyAgICAgIFJlYWxTY2FsYXIgYSA9IChmQ3VyIC0gZlByZXYpIC8gKExpdGVyYWwoMSkvbXVDdXIgLSBMaXRlcmFsKDEpL211UHJldik7CisgICAgICBSZWFsU2NhbGFyIGIgPSBmQ3VyIC0gYSAvIG11Q3VyOworICAgICAgLy8gQW5kIGZpbmQgbXUgc3VjaCB0aGF0IGYobXUpPT0wOgorICAgICAgUmVhbFNjYWxhciBtdVplcm8gPSAtYS9iOworICAgICAgUmVhbFNjYWxhciBmWmVybyA9IHNlY3VsYXJFcShtdVplcm8sIGNvbDAsIGRpYWcsIHBlcm0sIGRpYWdTaGlmdGVkLCBzaGlmdCk7CisgICAgICAKKyAgICAgIG11UHJldiA9IG11Q3VyOworICAgICAgZlByZXYgPSBmQ3VyOworICAgICAgbXVDdXIgPSBtdVplcm87CisgICAgICBmQ3VyID0gZlplcm87CisgICAgICAKKyAgICAgIAorICAgICAgaWYgKHNoaWZ0ID09IGxlZnQgICYmIChtdUN1ciA8IExpdGVyYWwoMCkgfHwgbXVDdXIgPiByaWdodCAtIGxlZnQpKSB1c2VCaXNlY3Rpb24gPSB0cnVlOworICAgICAgaWYgKHNoaWZ0ID09IHJpZ2h0ICYmIChtdUN1ciA8IC0ocmlnaHQgLSBsZWZ0KSB8fCBtdUN1ciA+IExpdGVyYWwoMCkpKSB1c2VCaXNlY3Rpb24gPSB0cnVlOworICAgICAgaWYgKGFicyhmQ3VyKT5hYnMoZlByZXYpKSB1c2VCaXNlY3Rpb24gPSB0cnVlOworICAgIH0KKworICAgIC8vIGZhbGwgYmFjayBvbiBiaXNlY3Rpb24gbWV0aG9kIGlmIHJhdGlvbmFsIGludGVycG9sYXRpb24gZGlkIG5vdCB3b3JrCisgICAgaWYgKHVzZUJpc2VjdGlvbikKKyAgICB7CisjaWZkZWYgIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgICAgICBzdGQ6OmNvdXQgPDwgInVzZUJpc2VjdGlvbiBmb3IgayA9ICIgPDwgayA8PCAiLCBhY3R1YWxfbiA9ICIgPDwgYWN0dWFsX24gPDwgIlxuIjsKKyNlbmRpZgorICAgICAgUmVhbFNjYWxhciBsZWZ0U2hpZnRlZCwgcmlnaHRTaGlmdGVkOworICAgICAgaWYgKHNoaWZ0ID09IGxlZnQpCisgICAgICB7CisgICAgICAgIGxlZnRTaGlmdGVkID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKTsKKyAgICAgICAgLy8gSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGUgY2FzZSBrPT0wIHdvdWxkIGJlIHNwZWNpYWwgdGhlcmU6CisgICAgICAgIC8vIGlmIChrID09IDApIHJpZ2h0U2hpZnRlZCA9IHJpZ2h0IC0gbGVmdDsgZWxzZSAKKyAgICAgICAgcmlnaHRTaGlmdGVkID0gKGs9PWFjdHVhbF9uLTEpID8gcmlnaHQgOiAoKHJpZ2h0IC0gbGVmdCkgKiBSZWFsU2NhbGFyKDAuNikpOyAvLyB0aGVvcmV0aWNhbGx5IHdlIGNhbiB0YWtlIDAuNSwgYnV0IGxldCdzIGJlIHNhZmUKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGVmdFNoaWZ0ZWQgPSAtKHJpZ2h0IC0gbGVmdCkgKiBSZWFsU2NhbGFyKDAuNik7CisgICAgICAgIHJpZ2h0U2hpZnRlZCA9IC0oc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpOworICAgICAgfQorICAgICAgCisgICAgICBSZWFsU2NhbGFyIGZMZWZ0ID0gc2VjdWxhckVxKGxlZnRTaGlmdGVkLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnU2hpZnRlZCwgc2hpZnQpOworCisjaWYgZGVmaW5lZCBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcgfHwgZGVmaW5lZCBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICAgICAgUmVhbFNjYWxhciBmUmlnaHQgPSBzZWN1bGFyRXEocmlnaHRTaGlmdGVkLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnU2hpZnRlZCwgc2hpZnQpOworI2VuZGlmCisKKyNpZmRlZiAgRUlHRU5fQkRDU1ZEX0RFQlVHX1ZFUkJPU0UKKyAgICAgIGlmKCEoZkxlZnQgKiBmUmlnaHQ8MCkpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiZkxlZnQ6ICIgPDwgbGVmdFNoaWZ0ZWQgPDwgIiAtICIgPDwgZGlhZ1NoaWZ0ZWQuaGVhZCgxMCkudHJhbnNwb3NlKCkgIDw8ICJcbiA7ICIgPDwgYm9vbChsZWZ0PT1zaGlmdCkgPDwgIiAiIDw8IChsZWZ0LXNoaWZ0KSA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgayA8PCAiIDogIiA8PCAgZkxlZnQgPDwgIiAqICIgPDwgZlJpZ2h0IDw8ICIgPT0gIiA8PCBmTGVmdCAqIGZSaWdodCA8PCAiICA7ICAiIDw8IGxlZnQgPDwgIiAtICIgPDwgcmlnaHQgPDwgIiAtPiAiIDw8ICBsZWZ0U2hpZnRlZCA8PCAiICIgPDwgcmlnaHRTaGlmdGVkIDw8ICIgICBzaGlmdD0iIDw8IHNoaWZ0IDw8ICJcbiI7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChmTGVmdCAqIGZSaWdodCA8IExpdGVyYWwoMCkpOworICAgICAgCisgICAgICB3aGlsZSAocmlnaHRTaGlmdGVkIC0gbGVmdFNoaWZ0ZWQgPiBMaXRlcmFsKDIpICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkgKiBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oYWJzKGxlZnRTaGlmdGVkKSwgYWJzKHJpZ2h0U2hpZnRlZCkpKQorICAgICAgeworICAgICAgICBSZWFsU2NhbGFyIG1pZFNoaWZ0ZWQgPSAobGVmdFNoaWZ0ZWQgKyByaWdodFNoaWZ0ZWQpIC8gTGl0ZXJhbCgyKTsKKyAgICAgICAgZk1pZCA9IHNlY3VsYXJFcShtaWRTaGlmdGVkLCBjb2wwLCBkaWFnLCBwZXJtLCBkaWFnU2hpZnRlZCwgc2hpZnQpOworICAgICAgICBpZiAoZkxlZnQgKiBmTWlkIDwgTGl0ZXJhbCgwKSkKKyAgICAgICAgeworICAgICAgICAgIHJpZ2h0U2hpZnRlZCA9IG1pZFNoaWZ0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbGVmdFNoaWZ0ZWQgPSBtaWRTaGlmdGVkOworICAgICAgICAgIGZMZWZ0ID0gZk1pZDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtdUN1ciA9IChsZWZ0U2hpZnRlZCArIHJpZ2h0U2hpZnRlZCkgLyBMaXRlcmFsKDIpOworICAgIH0KKyAgICAgIAorICAgIHNpbmdWYWxzW2tdID0gc2hpZnQgKyBtdUN1cjsKKyAgICBzaGlmdHNba10gPSBzaGlmdDsKKyAgICBtdXNba10gPSBtdUN1cjsKKworICAgIC8vIHBlcnR1cmIgc2luZ3VsYXIgdmFsdWUgc2xpZ2h0bHkgaWYgaXQgZXF1YWxzIGRpYWdvbmFsIGVudHJ5IHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gbGF0ZXIKKyAgICAvLyAoZGVmbGF0aW9uIGlzIHN1cHBvc2VkIHRvIGF2b2lkIHRoaXMgZnJvbSBoYXBwZW5pbmcpCisgICAgLy8gLSB0aGlzIGRvZXMgbm8gc2VlbSB0byBiZSBuZWNlc3NhcnkgYW55bW9yZSAtCisvLyAgICAgaWYgKHNpbmdWYWxzW2tdID09IGxlZnQpIHNpbmdWYWxzW2tdICo9IDEgKyBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKTsKKy8vICAgICBpZiAoc2luZ1ZhbHNba10gPT0gcmlnaHQpIHNpbmdWYWxzW2tdICo9IDEgLSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKTsKKyAgfQorfQorCisKKy8vIHpoYXQgaXMgcGVydHVyYmF0aW9uIG9mIGNvbDAgZm9yIHdoaWNoIHNpbmd1bGFyIHZlY3RvcnMgY2FuIGJlIGNvbXB1dGVkIHN0YWJseSAoc2VlIFNlY3Rpb24gMy4xKQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEJEQ1NWRDxNYXRyaXhUeXBlPjo6cGVydHVyYkNvbDAKKyAgIChjb25zdCBBcnJheVJlZiYgY29sMCwgY29uc3QgQXJyYXlSZWYmIGRpYWcsIGNvbnN0IEluZGljZXNSZWYgJnBlcm0sIGNvbnN0IFZlY3RvclR5cGUmIHNpbmdWYWxzLAorICAgIGNvbnN0IEFycmF5UmVmJiBzaGlmdHMsIGNvbnN0IEFycmF5UmVmJiBtdXMsIEFycmF5UmVmIHpoYXQpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgSW5kZXggbiA9IGNvbDAuc2l6ZSgpOworICBJbmRleCBtID0gcGVybS5zaXplKCk7CisgIGlmKG09PTApCisgIHsKKyAgICB6aGF0LnNldFplcm8oKTsKKyAgICByZXR1cm47CisgIH0KKyAgSW5kZXggbGFzdCA9IHBlcm0obS0xKTsKKyAgLy8gVGhlIG9mZnNldCBwZXJtaXRzIHRvIHNraXAgZGVmbGF0ZWQgZW50cmllcyB3aGlsZSBjb21wdXRpbmcgemhhdAorICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbjsgKytrKQorICB7CisgICAgaWYgKGNvbDAoaykgPT0gTGl0ZXJhbCgwKSkgLy8gZGVmbGF0ZWQKKyAgICAgIHpoYXQoaykgPSBMaXRlcmFsKDApOworICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBzZWUgZXF1YXRpb24gKDMuNikKKyAgICAgIFJlYWxTY2FsYXIgZGsgPSBkaWFnKGspOworICAgICAgUmVhbFNjYWxhciBwcm9kID0gKHNpbmdWYWxzKGxhc3QpICsgZGspICogKG11cyhsYXN0KSArIChzaGlmdHMobGFzdCkgLSBkaykpOworCisgICAgICBmb3IoSW5kZXggbCA9IDA7IGw8bTsgKytsKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGVybShsKTsKKyAgICAgICAgaWYoaSE9aykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGogPSBpPGsgPyBpIDogcGVybShsLTEpOworICAgICAgICAgIHByb2QgKj0gKChzaW5nVmFscyhqKStkaykgLyAoKGRpYWcoaSkrZGspKSkgKiAoKG11cyhqKSsoc2hpZnRzKGopLWRrKSkgLyAoKGRpYWcoaSktZGspKSk7CisjaWZkZWYgRUlHRU5fQkRDU1ZEX0RFQlVHX1ZFUkJPU0UKKyAgICAgICAgICBpZihpIT1rICYmIHN0ZDo6YWJzKCgoc2luZ1ZhbHMoaikrZGspKihtdXMoaikrKHNoaWZ0cyhqKS1kaykpKS8oKGRpYWcoaSkrZGspKihkaWFnKGkpLWRrKSkgLSAxKSA+IDAuOSApCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgICAgIiA8PCAoKHNpbmdWYWxzKGopK2RrKSoobXVzKGopKyhzaGlmdHMoaiktZGspKSkvKChkaWFnKGkpK2RrKSooZGlhZyhpKS1kaykpIDw8ICIgPT0gKCIgPDwgKHNpbmdWYWxzKGopK2RrKSA8PCAiICogIiA8PCAobXVzKGopKyhzaGlmdHMoaiktZGspKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSAvICgiIDw8IChkaWFnKGkpK2RrKSA8PCAiICogIiA8PCAoZGlhZyhpKS1kaykgPDwgIilcbiI7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgfQorI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgICAgICBzdGQ6OmNvdXQgPDwgInpoYXQoIiA8PCBrIDw8ICIpID0gIHNxcnQoICIgPDwgcHJvZCA8PCAiKSAgOyAgIiA8PCAoc2luZ1ZhbHMobGFzdCkgKyBkaykgPDwgIiAqICIgPDwgbXVzKGxhc3QpICsgc2hpZnRzKGxhc3QpIDw8ICIgLSAiIDw8IGRrIDw8ICJcbiI7CisjZW5kaWYKKyAgICAgIFJlYWxTY2FsYXIgdG1wID0gc3FydChwcm9kKTsKKyAgICAgIHpoYXQoaykgPSBjb2wwKGspID4gTGl0ZXJhbCgwKSA/IHRtcCA6IC10bXA7CisgICAgfQorICB9Cit9CisKKy8vIGNvbXB1dGUgc2luZ3VsYXIgdmVjdG9ycwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEJEQ1NWRDxNYXRyaXhUeXBlPjo6Y29tcHV0ZVNpbmdWZWNzCisgICAoY29uc3QgQXJyYXlSZWYmIHpoYXQsIGNvbnN0IEFycmF5UmVmJiBkaWFnLCBjb25zdCBJbmRpY2VzUmVmICZwZXJtLCBjb25zdCBWZWN0b3JUeXBlJiBzaW5nVmFscywKKyAgICBjb25zdCBBcnJheVJlZiYgc2hpZnRzLCBjb25zdCBBcnJheVJlZiYgbXVzLCBNYXRyaXhYciYgVSwgTWF0cml4WHImIFYpCit7CisgIEluZGV4IG4gPSB6aGF0LnNpemUoKTsKKyAgSW5kZXggbSA9IHBlcm0uc2l6ZSgpOworICAKKyAgZm9yIChJbmRleCBrID0gMDsgayA8IG47ICsraykKKyAgeworICAgIGlmICh6aGF0KGspID09IExpdGVyYWwoMCkpCisgICAgeworICAgICAgVS5jb2woaykgPSBWZWN0b3JUeXBlOjpVbml0KG4rMSwgayk7CisgICAgICBpZiAobV9jb21wVikgVi5jb2woaykgPSBWZWN0b3JUeXBlOjpVbml0KG4sIGspOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVS5jb2woaykuc2V0WmVybygpOworICAgICAgZm9yKEluZGV4IGw9MDtsPG07KytsKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGVybShsKTsKKyAgICAgICAgVShpLGspID0gemhhdChpKS8oKChkaWFnKGkpIC0gc2hpZnRzKGspKSAtIG11cyhrKSkgKS8oIChkaWFnKGkpICsgc2luZ1ZhbHNba10pKTsKKyAgICAgIH0KKyAgICAgIFUobixrKSA9IExpdGVyYWwoMCk7CisgICAgICBVLmNvbChrKS5ub3JtYWxpemUoKTsKKyAgICAKKyAgICAgIGlmIChtX2NvbXBWKQorICAgICAgeworICAgICAgICBWLmNvbChrKS5zZXRaZXJvKCk7CisgICAgICAgIGZvcihJbmRleCBsPTE7bDxtOysrbCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGkgPSBwZXJtKGwpOworICAgICAgICAgIFYoaSxrKSA9IGRpYWcoaSkgKiB6aGF0KGkpIC8gKCgoZGlhZyhpKSAtIHNoaWZ0cyhrKSkgLSBtdXMoaykpICkvKCAoZGlhZyhpKSArIHNpbmdWYWxzW2tdKSk7CisgICAgICAgIH0KKyAgICAgICAgVigwLGspID0gTGl0ZXJhbCgtMSk7CisgICAgICAgIFYuY29sKGspLm5vcm1hbGl6ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorICBVLmNvbChuKSA9IFZlY3RvclR5cGU6OlVuaXQobisxLCBuKTsKK30KKworCisvLyBwYWdlIDEyXzEzCisvLyBpID49IDEsIGRpIGFsbW9zdCBudWxsIGFuZCB6aSBub24gbnVsbC4KKy8vIFdlIHVzZSBhIHJvdGF0aW9uIHRvIHplcm8gb3V0IHppIGFwcGxpZWQgdG8gdGhlIGxlZnQgb2YgTQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEJEQ1NWRDxNYXRyaXhUeXBlPjo6ZGVmbGF0aW9uNDMoSW5kZXggZmlyc3RDb2wsIEluZGV4IHNoaWZ0LCBJbmRleCBpLCBJbmRleCBzaXplKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OnBvdzsKKyAgSW5kZXggc3RhcnQgPSBmaXJzdENvbCArIHNoaWZ0OworICBSZWFsU2NhbGFyIGMgPSBtX2NvbXB1dGVkKHN0YXJ0LCBzdGFydCk7CisgIFJlYWxTY2FsYXIgcyA9IG1fY29tcHV0ZWQoc3RhcnQraSwgc3RhcnQpOworICBSZWFsU2NhbGFyIHIgPSBzcXJ0KG51bWV4dDo6YWJzMihjKSArIG51bWV4dDo6YWJzMihzKSk7CisgIGlmIChyID09IExpdGVyYWwoMCkpCisgIHsKKyAgICBtX2NvbXB1dGVkKHN0YXJ0K2ksIHN0YXJ0K2kpID0gTGl0ZXJhbCgwKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9jb21wdXRlZChzdGFydCxzdGFydCkgPSByOyAgCisgIG1fY29tcHV0ZWQoc3RhcnQraSwgc3RhcnQpID0gTGl0ZXJhbCgwKTsKKyAgbV9jb21wdXRlZChzdGFydCtpLCBzdGFydCtpKSA9IExpdGVyYWwoMCk7CisgIAorICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiBKKGMvciwtcy9yKTsKKyAgaWYgKG1fY29tcFUpICBtX25haXZlVS5taWRkbGVSb3dzKGZpcnN0Q29sLCBzaXplKzEpLmFwcGx5T25UaGVSaWdodChmaXJzdENvbCwgZmlyc3RDb2wraSwgSik7CisgIGVsc2UgICAgICAgICAgbV9uYWl2ZVUuYXBwbHlPblRoZVJpZ2h0KGZpcnN0Q29sLCBmaXJzdENvbCtpLCBKKTsKK30vLyBlbmQgZGVmbGF0aW9uIDQzCisKKworLy8gcGFnZSAxMworLy8gaSxqID49IDEsIGkhPWogYW5kIHxkaSAtIGRqfCA8IGVwc2lsb24gKiBub3JtMihNKQorLy8gV2UgYXBwbHkgdHdvIHJvdGF0aW9ucyB0byBoYXZlIHpqID0gMDsKKy8vIFRPRE8gZGVmbGF0aW9uNDQgaXMgc3RpbGwgYnJva2VuIGFuZCBub3QgcHJvcGVybHkgdGVzdGVkCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQkRDU1ZEPE1hdHJpeFR5cGU+OjpkZWZsYXRpb240NChJbmRleCBmaXJzdENvbHUgLCBJbmRleCBmaXJzdENvbG0sIEluZGV4IGZpcnN0Um93VywgSW5kZXggZmlyc3RDb2xXLCBJbmRleCBpLCBJbmRleCBqLCBJbmRleCBzaXplKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmNvbmo7CisgIHVzaW5nIHN0ZDo6cG93OworICBSZWFsU2NhbGFyIGMgPSBtX2NvbXB1dGVkKGZpcnN0Q29sbStpLCBmaXJzdENvbG0pOworICBSZWFsU2NhbGFyIHMgPSBtX2NvbXB1dGVkKGZpcnN0Q29sbStqLCBmaXJzdENvbG0pOworICBSZWFsU2NhbGFyIHIgPSBzcXJ0KG51bWV4dDo6YWJzMihjKSArIG51bWV4dDo6YWJzMihzKSk7CisjaWZkZWYgIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAiZGVmbGF0aW9uIDQuNDogIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIgLT4gIiA8PCBjIDw8ICIgIiA8PCBzIDw8ICIgIiA8PCByIDw8ICIgOyAiCisgICAgPDwgbV9jb21wdXRlZChmaXJzdENvbG0gKyBpLTEsIGZpcnN0Q29sbSkgIDw8ICIgIgorICAgIDw8IG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaSwgZmlyc3RDb2xtKSAgPDwgIiAiCisgICAgPDwgbV9jb21wdXRlZChmaXJzdENvbG0gKyBpKzEsIGZpcnN0Q29sbSkgPDwgIiAiCisgICAgPDwgbV9jb21wdXRlZChmaXJzdENvbG0gKyBpKzIsIGZpcnN0Q29sbSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8IG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaS0xLCBmaXJzdENvbG0gKyBpLTEpICA8PCAiICIKKyAgICA8PCBtX2NvbXB1dGVkKGZpcnN0Q29sbSArIGksIGZpcnN0Q29sbStpKSAgPDwgIiAiCisgICAgPDwgbV9jb21wdXRlZChmaXJzdENvbG0gKyBpKzEsIGZpcnN0Q29sbStpKzEpIDw8ICIgIgorICAgIDw8IG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaSsyLCBmaXJzdENvbG0raSsyKSA8PCAiXG4iOworI2VuZGlmCisgIGlmIChyPT1MaXRlcmFsKDApKQorICB7CisgICAgbV9jb21wdXRlZChmaXJzdENvbG0gKyBpLCBmaXJzdENvbG0gKyBpKSA9IG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaiwgZmlyc3RDb2xtICsgaik7CisgICAgcmV0dXJuOworICB9CisgIGMvPXI7CisgIHMvPXI7CisgIG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaSwgZmlyc3RDb2xtKSA9IHI7ICAKKyAgbV9jb21wdXRlZChmaXJzdENvbG0gKyBqLCBmaXJzdENvbG0gKyBqKSA9IG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaSwgZmlyc3RDb2xtICsgaSk7CisgIG1fY29tcHV0ZWQoZmlyc3RDb2xtICsgaiwgZmlyc3RDb2xtKSA9IExpdGVyYWwoMCk7CisKKyAgSmFjb2JpUm90YXRpb248UmVhbFNjYWxhcj4gSihjLC1zKTsKKyAgaWYgKG1fY29tcFUpICBtX25haXZlVS5taWRkbGVSb3dzKGZpcnN0Q29sdSwgc2l6ZSsxKS5hcHBseU9uVGhlUmlnaHQoZmlyc3RDb2x1ICsgaSwgZmlyc3RDb2x1ICsgaiwgSik7CisgIGVsc2UgICAgICAgICAgbV9uYWl2ZVUuYXBwbHlPblRoZVJpZ2h0KGZpcnN0Q29sdStpLCBmaXJzdENvbHUraiwgSik7CisgIGlmIChtX2NvbXBWKSAgbV9uYWl2ZVYubWlkZGxlUm93cyhmaXJzdFJvd1csIHNpemUpLmFwcGx5T25UaGVSaWdodChmaXJzdENvbFcgKyBpLCBmaXJzdENvbFcgKyBqLCBKKTsKK30vLyBlbmQgZGVmbGF0aW9uIDQ0CisKKworLy8gYWN0cyBvbiBibG9jayBmcm9tIChmaXJzdENvbCtzaGlmdCwgZmlyc3RDb2wrc2hpZnQpIHRvIChsYXN0Q29sK3NoaWZ0LCBsYXN0Q29sK3NoaWZ0KSBbaW5jbHVzaXZlXQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEJEQ1NWRDxNYXRyaXhUeXBlPjo6ZGVmbGF0aW9uKEluZGV4IGZpcnN0Q29sLCBJbmRleCBsYXN0Q29sLCBJbmRleCBrLCBJbmRleCBmaXJzdFJvd1csIEluZGV4IGZpcnN0Q29sVywgSW5kZXggc2hpZnQpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisgIGNvbnN0IEluZGV4IGxlbmd0aCA9IGxhc3RDb2wgKyAxIC0gZmlyc3RDb2w7CisgIAorICBCbG9jazxNYXRyaXhYcixEeW5hbWljLDE+IGNvbDAobV9jb21wdXRlZCwgZmlyc3RDb2wrc2hpZnQsIGZpcnN0Q29sK3NoaWZ0LCBsZW5ndGgsIDEpOworICBEaWFnb25hbDxNYXRyaXhYcj4gZnVsbGRpYWcobV9jb21wdXRlZCk7CisgIFZlY3RvckJsb2NrPERpYWdvbmFsPE1hdHJpeFhyPixEeW5hbWljPiBkaWFnKGZ1bGxkaWFnLCBmaXJzdENvbCtzaGlmdCwgbGVuZ3RoKTsKKyAgCisgIGNvbnN0IFJlYWxTY2FsYXIgY29uc2lkZXJaZXJvID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKTsKKyAgUmVhbFNjYWxhciBtYXhEaWFnID0gZGlhZy50YWlsKChzdGQ6Om1heCkoSW5kZXgoMSksbGVuZ3RoLTEpKS5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIFJlYWxTY2FsYXIgZXBzaWxvbl9zdHJpY3QgPSBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oY29uc2lkZXJaZXJvLE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpICogbWF4RGlhZyk7CisgIFJlYWxTY2FsYXIgZXBzaWxvbl9jb2Fyc2UgPSBMaXRlcmFsKDgpICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkgKiBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oY29sMC5jd2lzZUFicygpLm1heENvZWZmKCksIG1heERpYWcpOworICAKKyNpZmRlZiBFSUdFTl9CRENTVkRfU0FOSVRZX0NIRUNLUworICBhc3NlcnQobV9uYWl2ZVUuYWxsRmluaXRlKCkpOworICBhc3NlcnQobV9uYWl2ZVYuYWxsRmluaXRlKCkpOworICBhc3NlcnQobV9jb21wdXRlZC5hbGxGaW5pdGUoKSk7CisjZW5kaWYKKworI2lmZGVmICBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRSAgCisgIHN0ZDo6Y291dCA8PCAiXG5kZWZsYXRlOiIgPDwgZGlhZy5oZWFkKGsrMSkudHJhbnNwb3NlKCkgPDwgIiAgfCAgIiA8PCBkaWFnLnNlZ21lbnQoaysxLGxlbmd0aC1rLTEpLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisjZW5kaWYKKyAgCisgIC8vY29uZGl0aW9uIDQuMQorICBpZiAoZGlhZygwKSA8IGVwc2lsb25fY29hcnNlKQorICB7IAorI2lmZGVmICBFSUdFTl9CRENTVkRfREVCVUdfVkVSQk9TRQorICAgIHN0ZDo6Y291dCA8PCAiZGVmbGF0aW9uIDQuMSwgYmVjYXVzZSAiIDw8IGRpYWcoMCkgPDwgIiA8ICIgPDwgZXBzaWxvbl9jb2Fyc2UgPDwgIlxuIjsKKyNlbmRpZgorICAgIGRpYWcoMCkgPSBlcHNpbG9uX2NvYXJzZTsKKyAgfQorCisgIC8vY29uZGl0aW9uIDQuMgorICBmb3IgKEluZGV4IGk9MTtpPGxlbmd0aDsrK2kpCisgICAgaWYgKGFicyhjb2wwKGkpKSA8IGVwc2lsb25fc3RyaWN0KQorICAgIHsKKyNpZmRlZiAgRUlHRU5fQkRDU1ZEX0RFQlVHX1ZFUkJPU0UKKyAgICAgIHN0ZDo6Y291dCA8PCAiZGVmbGF0aW9uIDQuMiwgc2V0IHooIiA8PCBpIDw8ICIpIHRvIHplcm8gYmVjYXVzZSAiIDw8IGFicyhjb2wwKGkpKSA8PCAiIDwgIiA8PCBlcHNpbG9uX3N0cmljdCA8PCAiICAoZGlhZygiIDw8IGkgPDwgIik9IiA8PCBkaWFnKGkpIDw8ICIpXG4iOworI2VuZGlmCisgICAgICBjb2wwKGkpID0gTGl0ZXJhbCgwKTsKKyAgICB9CisKKyAgLy9jb25kaXRpb24gNC4zCisgIGZvciAoSW5kZXggaT0xO2k8bGVuZ3RoOyBpKyspCisgICAgaWYgKGRpYWcoaSkgPCBlcHNpbG9uX2NvYXJzZSkKKyAgICB7CisjaWZkZWYgIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgICAgICBzdGQ6OmNvdXQgPDwgImRlZmxhdGlvbiA0LjMsIGNhbmNlbCB6KCIgPDwgaSA8PCAiKT0iIDw8IGNvbDAoaSkgPDwgIiBiZWNhdXNlIGRpYWcoIiA8PCBpIDw8ICIpPSIgPDwgZGlhZyhpKSA8PCAiIDwgIiA8PCBlcHNpbG9uX2NvYXJzZSA8PCAiXG4iOworI2VuZGlmCisgICAgICBkZWZsYXRpb240MyhmaXJzdENvbCwgc2hpZnQsIGksIGxlbmd0aCk7CisgICAgfQorCisjaWZkZWYgRUlHRU5fQkRDU1ZEX1NBTklUWV9DSEVDS1MKKyAgYXNzZXJ0KG1fbmFpdmVVLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fbmFpdmVWLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fY29tcHV0ZWQuYWxsRmluaXRlKCkpOworI2VuZGlmCisjaWZkZWYgRUlHRU5fQkRDU1ZEX0RFQlVHX1ZFUkJPU0UKKyAgc3RkOjpjb3V0IDw8ICJ0byBiZSBzb3J0ZWQ6ICIgPDwgZGlhZy50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisjZW5kaWYKKyAgeworICAgIC8vIENoZWNrIGZvciB0b3RhbCBkZWZsYXRpb24KKyAgICAvLyBJZiB3ZSBoYXZlIGEgdG90YWwgZGVmbGF0aW9uLCB0aGVuIHdlIGhhdmUgdG8gY29uc2lkZXIgY29sMCgwKT09ZGlhZygwKSBhcyBhIHNpbmd1bGFyIHZhbHVlIGR1cmluZyBzb3J0aW5nCisgICAgYm9vbCB0b3RhbF9kZWZsYXRpb24gPSAoY29sMC50YWlsKGxlbmd0aC0xKS5hcnJheSgpPGNvbnNpZGVyWmVybykuYWxsKCk7CisgICAgCisgICAgLy8gU29ydCB0aGUgZGlhZ29uYWwgZW50cmllcywgc2luY2UgZGlhZygxOmstMSkgYW5kIGRpYWcoazpsZW5ndGgpIGFyZSBhbHJlYWR5IHNvcnRlZCwgbGV0J3MgZG8gYSBzb3J0ZWQgbWVyZ2UuCisgICAgLy8gRmlyc3QsIGNvbXB1dGUgdGhlIHJlc3BlY3RpdmUgcGVybXV0YXRpb24uCisgICAgSW5kZXggKnBlcm11dGF0aW9uID0gbV93b3Jrc3BhY2VJLmRhdGEoKTsKKyAgICB7CisgICAgICBwZXJtdXRhdGlvblswXSA9IDA7CisgICAgICBJbmRleCBwID0gMTsKKyAgICAgIAorICAgICAgLy8gTW92ZSBkZWZsYXRlZCBkaWFnb25hbCBlbnRyaWVzIGF0IHRoZSBlbmQuCisgICAgICBmb3IoSW5kZXggaT0xOyBpPGxlbmd0aDsgKytpKQorICAgICAgICBpZihhYnMoZGlhZyhpKSk8Y29uc2lkZXJaZXJvKQorICAgICAgICAgIHBlcm11dGF0aW9uW3ArK10gPSBpOworICAgICAgICAKKyAgICAgIEluZGV4IGk9MSwgaj1rKzE7CisgICAgICBmb3IoIDsgcCA8IGxlbmd0aDsgKytwKQorICAgICAgeworICAgICAgICAgICAgIGlmIChpID4gaykgICAgICAgICAgICAgcGVybXV0YXRpb25bcF0gPSBqKys7CisgICAgICAgIGVsc2UgaWYgKGogPj0gbGVuZ3RoKSAgICAgICBwZXJtdXRhdGlvbltwXSA9IGkrKzsKKyAgICAgICAgZWxzZSBpZiAoZGlhZyhpKSA8IGRpYWcoaikpIHBlcm11dGF0aW9uW3BdID0gaisrOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgcGVybXV0YXRpb25bcF0gPSBpKys7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIHdlIGhhdmUgYSB0b3RhbCBkZWZsYXRpb24sIHRoZW4gd2UgaGF2ZSB0byBpbnNlcnQgZGlhZygwKSBhdCB0aGUgcmlnaHQgcGxhY2UKKyAgICBpZih0b3RhbF9kZWZsYXRpb24pCisgICAgeworICAgICAgZm9yKEluZGV4IGk9MTsgaTxsZW5ndGg7ICsraSkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcGkgPSBwZXJtdXRhdGlvbltpXTsKKyAgICAgICAgaWYoYWJzKGRpYWcocGkpKTxjb25zaWRlclplcm8gfHwgZGlhZygwKTxkaWFnKHBpKSkKKyAgICAgICAgICBwZXJtdXRhdGlvbltpLTFdID0gcGVybXV0YXRpb25baV07CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHBlcm11dGF0aW9uW2ktMV0gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIEN1cnJlbnQgaW5kZXggb2YgZWFjaCBjb2wsIGFuZCBjdXJyZW50IGNvbHVtbiBvZiBlYWNoIGluZGV4CisgICAgSW5kZXggKnJlYWxJbmQgPSBtX3dvcmtzcGFjZUkuZGF0YSgpK2xlbmd0aDsKKyAgICBJbmRleCAqcmVhbENvbCA9IG1fd29ya3NwYWNlSS5kYXRhKCkrMipsZW5ndGg7CisgICAgCisgICAgZm9yKGludCBwb3MgPSAwOyBwb3M8IGxlbmd0aDsgcG9zKyspCisgICAgeworICAgICAgcmVhbENvbFtwb3NdID0gcG9zOworICAgICAgcmVhbEluZFtwb3NdID0gcG9zOworICAgIH0KKyAgICAKKyAgICBmb3IoSW5kZXggaSA9IHRvdGFsX2RlZmxhdGlvbj8wOjE7IGkgPCBsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBwaSA9IHBlcm11dGF0aW9uW2xlbmd0aCAtICh0b3RhbF9kZWZsYXRpb24gPyBpKzEgOiBpKV07CisgICAgICBjb25zdCBJbmRleCBKID0gcmVhbENvbFtwaV07CisgICAgICAKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIC8vIHN3YXAgZGlhZ29uYWwgYW5kIGZpcnN0IGNvbHVtbiBlbnRyaWVzOgorICAgICAgc3dhcChkaWFnKGkpLCBkaWFnKEopKTsKKyAgICAgIGlmKGkhPTAgJiYgSiE9MCkgc3dhcChjb2wwKGkpLCBjb2wwKEopKTsKKworICAgICAgLy8gY2hhbmdlIGNvbHVtbnMKKyAgICAgIGlmIChtX2NvbXBVKSBtX25haXZlVS5jb2woZmlyc3RDb2wraSkuc2VnbWVudChmaXJzdENvbCwgbGVuZ3RoICsgMSkuc3dhcChtX25haXZlVS5jb2woZmlyc3RDb2wrSikuc2VnbWVudChmaXJzdENvbCwgbGVuZ3RoICsgMSkpOworICAgICAgZWxzZSAgICAgICAgIG1fbmFpdmVVLmNvbChmaXJzdENvbCtpKS5zZWdtZW50KDAsIDIpICAgICAgICAgICAgICAgIC5zd2FwKG1fbmFpdmVVLmNvbChmaXJzdENvbCtKKS5zZWdtZW50KDAsIDIpKTsKKyAgICAgIGlmIChtX2NvbXBWKSBtX25haXZlVi5jb2woZmlyc3RDb2xXICsgaSkuc2VnbWVudChmaXJzdFJvd1csIGxlbmd0aCkuc3dhcChtX25haXZlVi5jb2woZmlyc3RDb2xXICsgSikuc2VnbWVudChmaXJzdFJvd1csIGxlbmd0aCkpOworCisgICAgICAvL3VwZGF0ZSByZWFsIHBvcworICAgICAgY29uc3QgSW5kZXggcmVhbEkgPSByZWFsSW5kW2ldOworICAgICAgcmVhbENvbFtyZWFsSV0gPSBKOworICAgICAgcmVhbENvbFtwaV0gPSBpOworICAgICAgcmVhbEluZFtKXSA9IHJlYWxJOworICAgICAgcmVhbEluZFtpXSA9IHBpOworICAgIH0KKyAgfQorI2lmZGVmIEVJR0VOX0JEQ1NWRF9ERUJVR19WRVJCT1NFCisgIHN0ZDo6Y291dCA8PCAic29ydGVkOiAiIDw8IGRpYWcudHJhbnNwb3NlKCkuZm9ybWF0KGJkY3N2ZGZtdCkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgICAgICA6ICIgPDwgY29sMC50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisjZW5kaWYKKyAgICAKKyAgLy9jb25kaXRpb24gNC40CisgIHsKKyAgICBJbmRleCBpID0gbGVuZ3RoLTE7CisgICAgd2hpbGUoaT4wICYmIChhYnMoZGlhZyhpKSk8Y29uc2lkZXJaZXJvIHx8IGFicyhjb2wwKGkpKTxjb25zaWRlclplcm8pKSAtLWk7CisgICAgZm9yKDsgaT4xOy0taSkKKyAgICAgICBpZiggKGRpYWcoaSkgLSBkaWFnKGktMSkpIDwgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkqbWF4RGlhZyApCisgICAgICB7CisjaWZkZWYgRUlHRU5fQkRDU1ZEX0RFQlVHX1ZFUkJPU0UKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJkZWZsYXRpb24gNC40IHdpdGggaSA9ICIgPDwgaSA8PCAiIGJlY2F1c2UgIiA8PCAoZGlhZyhpKSAtIGRpYWcoaS0xKSkgPDwgIiA8ICIgPDwgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkqZGlhZyhpKSA8PCAiXG4iOworI2VuZGlmCisgICAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChhYnMoZGlhZyhpKSAtIGRpYWcoaS0xKSk8ZXBzaWxvbl9jb2Fyc2UgJiYgIiBkaWFnb25hbCBlbnRyaWVzIGFyZSBub3QgcHJvcGVybHkgc29ydGVkIik7CisgICAgICAgIGRlZmxhdGlvbjQ0KGZpcnN0Q29sLCBmaXJzdENvbCArIHNoaWZ0LCBmaXJzdFJvd1csIGZpcnN0Q29sVywgaS0xLCBpLCBsZW5ndGgpOworICAgICAgfQorICB9CisgIAorI2lmZGVmIEVJR0VOX0JEQ1NWRF9TQU5JVFlfQ0hFQ0tTCisgIGZvcihJbmRleCBqPTI7ajxsZW5ndGg7KytqKQorICAgIGFzc2VydChkaWFnKGotMSk8PWRpYWcoaikgfHwgYWJzKGRpYWcoaikpPGNvbnNpZGVyWmVybyk7CisjZW5kaWYKKyAgCisjaWZkZWYgRUlHRU5fQkRDU1ZEX1NBTklUWV9DSEVDS1MKKyAgYXNzZXJ0KG1fbmFpdmVVLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fbmFpdmVWLmFsbEZpbml0ZSgpKTsKKyAgYXNzZXJ0KG1fY29tcHV0ZWQuYWxsRmluaXRlKCkpOworI2VuZGlmCit9Ly9lbmQgZGVmbGF0aW9uCisKKyNpZm5kZWYgX19DVURBQ0NfXworLyoqIFxzdmRfbW9kdWxlCisgICoKKyAgKiBccmV0dXJuIHRoZSBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzIGNvbXB1dGVkIGJ5IERpdmlkZSAmIENvbnF1ZXIgYWxnb3JpdGhtCisgICoKKyAgKiBcc2EgY2xhc3MgQkRDU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorQkRDU1ZEPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6YmRjU3ZkKHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpIGNvbnN0Cit7CisgIHJldHVybiBCRENTVkQ8UGxhaW5PYmplY3Q+KCp0aGlzLCBjb21wdXRhdGlvbk9wdGlvbnMpOworfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TVkQvSmFjb2JpU1ZELmggYi9FaWdlbi9zcmMvU1ZEL0phY29iaVNWRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDg4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU1ZEL0phY29iaVNWRC5oCkBAIC0wLDAgKzEsODA0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0pBQ09CSVNWRF9ICisjZGVmaW5lIEVJR0VOX0pBQ09CSVNWRF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiAobmVlZGVkIGJ5IElDQykKKy8vIHRoZSBlbXB0eSBib2R5IGlzIHJlcXVpcmVkIGJ5IE1TVkMKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyLAorICAgICAgICAgYm9vbCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6SXNDb21wbGV4Pgorc3RydWN0IHN2ZF9wcmVjb25kaXRpb25fMngyX2Jsb2NrX3RvX2JlX3JlYWwge307CisKKy8qKiogUVIgcHJlY29uZGl0aW9uZXJzIChSLVNWRCkKKyAqKioKKyAqKiogVGhlaXIgcm9sZSBpcyB0byByZWR1Y2UgdGhlIHByb2JsZW0gb2YgY29tcHV0aW5nIHRoZSBTVkQgdG8gdGhlIGNhc2Ugb2YgYSBzcXVhcmUgbWF0cml4LgorICoqKiBUaGlzIGFwcHJvYWNoLCBrbm93biBhcyBSLVNWRCwgaXMgYW4gb3B0aW1pemF0aW9uIGZvciByZWN0YW5ndWxhci1lbm91Z2ggbWF0cmljZXMsIGFuZCBpcyBhIHJlcXVpcmVtZW50IGZvcgorICoqKiBKYWNvYmlTVkQgd2hpY2ggYnkgaXRzZWxmIGlzIG9ubHkgYWJsZSB0byB3b3JrIG9uIHNxdWFyZSBtYXRyaWNlcy4KKyAqKiovCisKK2VudW0geyBQcmVjb25kaXRpb25JZk1vcmVDb2xzVGhhblJvd3MsIFByZWNvbmRpdGlvbklmTW9yZVJvd3NUaGFuQ29scyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lciwgaW50IENhc2U+CitzdHJ1Y3QgcXJfcHJlY29uZGl0aW9uZXJfc2hvdWxkX2RvX2FueXRoaW5nCit7CisgIGVudW0geyBhID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyAmJgorICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYKKyAgICAgICAgICAgICBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA8PSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgIGIgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljICYmCisgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyAmJgorICAgICAgICAgICAgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIDw9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgcmV0ID0gISggKFFSUHJlY29uZGl0aW9uZXIgPT0gTm9RUlByZWNvbmRpdGlvbmVyKSB8fAorICAgICAgICAgICAgICAgICAgKENhc2UgPT0gUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzICYmIGJvb2woYSkpIHx8CisgICAgICAgICAgICAgICAgICAoQ2FzZSA9PSBQcmVjb25kaXRpb25JZk1vcmVSb3dzVGhhbkNvbHMgJiYgYm9vbChiKSkgKQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXIsIGludCBDYXNlLAorICAgICAgICAgYm9vbCBEb0FueXRoaW5nID0gcXJfcHJlY29uZGl0aW9uZXJfc2hvdWxkX2RvX2FueXRoaW5nPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXIsIENhc2U+OjpyZXQKKz4gc3RydWN0IHFyX3ByZWNvbmRpdGlvbmVyX2ltcGwge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyLCBpbnQgQ2FzZT4KK2NsYXNzIHFyX3ByZWNvbmRpdGlvbmVyX2ltcGw8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lciwgQ2FzZSwgZmFsc2U+Cit7CitwdWJsaWM6CisgIHZvaWQgYWxsb2NhdGUoY29uc3QgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+Jikge30KKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+JiwgY29uc3QgTWF0cml4VHlwZSYpCisgIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8qKiogcHJlY29uZGl0aW9uZXIgdXNpbmcgRnVsbFBpdkhvdXNlaG9sZGVyUVIgKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgcXJfcHJlY29uZGl0aW9uZXJfaW1wbDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLCBQcmVjb25kaXRpb25JZk1vcmVSb3dzVGhhbkNvbHMsIHRydWU+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bQorICB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lCisgIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd01ham9yLCAxLCBNYXhSb3dzQXRDb21waWxlVGltZT4gV29ya3NwYWNlVHlwZTsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkKQorICB7CisgICAgaWYgKHN2ZC5yb3dzKCkgIT0gbV9xci5yb3dzKCkgfHwgc3ZkLmNvbHMoKSAhPSBtX3FyLmNvbHMoKSkKKyAgICB7CisgICAgICBtX3FyLn5RUlR5cGUoKTsKKyAgICAgIDo6bmV3ICgmbV9xcikgUVJUeXBlKHN2ZC5yb3dzKCksIHN2ZC5jb2xzKCkpOworICAgIH0KKyAgICBpZiAoc3ZkLm1fY29tcHV0ZUZ1bGxVKSBtX3dvcmtzcGFjZS5yZXNpemUoc3ZkLnJvd3MoKSk7CisgIH0KKworICBib29sIHJ1bihKYWNvYmlTVkQ8TWF0cml4VHlwZSwgRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LnJvd3MoKSA+IG1hdHJpeC5jb2xzKCkpCisgICAgeworICAgICAgbV9xci5jb21wdXRlKG1hdHJpeCk7CisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXguY29scygpLG1hdHJpeC5jb2xzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICAgICAgaWYoc3ZkLm1fY29tcHV0ZUZ1bGxVKSBtX3FyLm1hdHJpeFEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4VSwgbV93b3Jrc3BhY2UpOworICAgICAgaWYoc3ZkLmNvbXB1dGVWKCkpIHN2ZC5tX21hdHJpeFYgPSBtX3FyLmNvbHNQZXJtdXRhdGlvbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorcHJpdmF0ZToKKyAgdHlwZWRlZiBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRUlR5cGU7CisgIFFSVHlwZSBtX3FyOworICBXb3Jrc3BhY2VUeXBlIG1fd29ya3NwYWNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIHFyX3ByZWNvbmRpdGlvbmVyX2ltcGw8TWF0cml4VHlwZSwgRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzLCB0cnVlPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0KKyAgeworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgVHJPcHRpb25zID0gUm93c0F0Q29tcGlsZVRpbWU9PTEgPyAoTWF0cml4VHlwZTo6T3B0aW9ucyAmIH4oUm93TWFqb3IpKQorICAgICAgICAgICAgICA6IENvbHNBdENvbXBpbGVUaW1lPT0xID8gKE1hdHJpeFR5cGU6Ok9wdGlvbnMgfCAgIFJvd01ham9yKQorICAgICAgICAgICAgICA6IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgUm93c0F0Q29tcGlsZVRpbWUsIFRyT3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcjsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkKQorICB7CisgICAgaWYgKHN2ZC5jb2xzKCkgIT0gbV9xci5yb3dzKCkgfHwgc3ZkLnJvd3MoKSAhPSBtX3FyLmNvbHMoKSkKKyAgICB7CisgICAgICBtX3FyLn5RUlR5cGUoKTsKKyAgICAgIDo6bmV3ICgmbV9xcikgUVJUeXBlKHN2ZC5jb2xzKCksIHN2ZC5yb3dzKCkpOworICAgIH0KKyAgICBtX2Fkam9pbnQucmVzaXplKHN2ZC5jb2xzKCksIHN2ZC5yb3dzKCkpOworICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgfQorCisgIGJvb2wgcnVuKEphY29iaVNWRDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkLCBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgIHsKKyAgICBpZihtYXRyaXguY29scygpID4gbWF0cml4LnJvd3MoKSkKKyAgICB7CisgICAgICBtX2Fkam9pbnQgPSBtYXRyaXguYWRqb2ludCgpOworICAgICAgbV9xci5jb21wdXRlKG1fYWRqb2ludCk7CisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXgucm93cygpLG1hdHJpeC5yb3dzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVikgbV9xci5tYXRyaXhRKCkuZXZhbFRvKHN2ZC5tX21hdHJpeFYsIG1fd29ya3NwYWNlKTsKKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVID0gbV9xci5jb2xzUGVybXV0YXRpb24oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgfQorcHJpdmF0ZToKKyAgdHlwZWRlZiBGdWxsUGl2SG91c2Vob2xkZXJRUjxUcmFuc3Bvc2VUeXBlV2l0aFNhbWVTdG9yYWdlT3JkZXI+IFFSVHlwZTsKKyAgUVJUeXBlIG1fcXI7CisgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlciBtX2Fkam9pbnQ7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKKy8qKiogcHJlY29uZGl0aW9uZXIgdXNpbmcgQ29sUGl2SG91c2Vob2xkZXJRUiAqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlUm93c1RoYW5Db2xzLCB0cnVlPgoreworcHVibGljOgorICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLnJvd3MoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQuY29scygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuflFSVHlwZSgpOworICAgICAgOjpuZXcgKCZtX3FyKSBRUlR5cGUoc3ZkLnJvd3MoKSwgc3ZkLmNvbHMoKSk7CisgICAgfQorICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFUpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQucm93cygpKTsKKyAgICBlbHNlIGlmIChzdmQubV9jb21wdXRlVGhpblUpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgfQorCisgIGJvb2wgcnVuKEphY29iaVNWRDxNYXRyaXhUeXBlLCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgeworICAgIGlmKG1hdHJpeC5yb3dzKCkgPiBtYXRyaXguY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuY29tcHV0ZShtYXRyaXgpOworICAgICAgc3ZkLm1fd29ya01hdHJpeCA9IG1fcXIubWF0cml4UVIoKS5ibG9jaygwLDAsbWF0cml4LmNvbHMoKSxtYXRyaXguY29scygpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV9xci5ob3VzZWhvbGRlclEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4VSwgbV93b3Jrc3BhY2UpOworICAgICAgZWxzZSBpZihzdmQubV9jb21wdXRlVGhpblUpCisgICAgICB7CisgICAgICAgIHN2ZC5tX21hdHJpeFUuc2V0SWRlbnRpdHkobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSk7CisgICAgICAgIG1fcXIuaG91c2Vob2xkZXJRKCkuYXBwbHlUaGlzT25UaGVMZWZ0KHN2ZC5tX21hdHJpeFUsIG1fd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICAgIGlmKHN2ZC5jb21wdXRlVigpKSBzdmQubV9tYXRyaXhWID0gbV9xci5jb2xzUGVybXV0YXRpb24oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJpdmF0ZToKKyAgdHlwZWRlZiBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IFFSVHlwZTsKKyAgUVJUeXBlIG1fcXI7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzLCB0cnVlPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0KKyAgeworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgVHJPcHRpb25zID0gUm93c0F0Q29tcGlsZVRpbWU9PTEgPyAoTWF0cml4VHlwZTo6T3B0aW9ucyAmIH4oUm93TWFqb3IpKQorICAgICAgICAgICAgICA6IENvbHNBdENvbXBpbGVUaW1lPT0xID8gKE1hdHJpeFR5cGU6Ok9wdGlvbnMgfCAgIFJvd01ham9yKQorICAgICAgICAgICAgICA6IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZSwgVHJPcHRpb25zLCBNYXhDb2xzQXRDb21waWxlVGltZSwgTWF4Um93c0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgVHJhbnNwb3NlVHlwZVdpdGhTYW1lU3RvcmFnZU9yZGVyOworCisgIHZvaWQgYWxsb2NhdGUoY29uc3QgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCkKKyAgeworICAgIGlmIChzdmQuY29scygpICE9IG1fcXIucm93cygpIHx8IHN2ZC5yb3dzKCkgIT0gbV9xci5jb2xzKCkpCisgICAgeworICAgICAgbV9xci5+UVJUeXBlKCk7CisgICAgICA6Om5ldyAoJm1fcXIpIFFSVHlwZShzdmQuY29scygpLCBzdmQucm93cygpKTsKKyAgICB9CisgICAgaWYgKHN2ZC5tX2NvbXB1dGVGdWxsVikgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5jb2xzKCkpOworICAgIGVsc2UgaWYgKHN2ZC5tX2NvbXB1dGVUaGluVikgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5yb3dzKCkpOworICAgIG1fYWRqb2ludC5yZXNpemUoc3ZkLmNvbHMoKSwgc3ZkLnJvd3MoKSk7CisgIH0KKworICBib29sIHJ1bihKYWNvYmlTVkQ8TWF0cml4VHlwZSwgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkLCBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgIHsKKyAgICBpZihtYXRyaXguY29scygpID4gbWF0cml4LnJvd3MoKSkKKyAgICB7CisgICAgICBtX2Fkam9pbnQgPSBtYXRyaXguYWRqb2ludCgpOworICAgICAgbV9xci5jb21wdXRlKG1fYWRqb2ludCk7CisKKyAgICAgIHN2ZC5tX3dvcmtNYXRyaXggPSBtX3FyLm1hdHJpeFFSKCkuYmxvY2soMCwwLG1hdHJpeC5yb3dzKCksbWF0cml4LnJvd3MoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuYWRqb2ludCgpOworICAgICAgaWYoc3ZkLm1fY29tcHV0ZUZ1bGxWKSBtX3FyLmhvdXNlaG9sZGVyUSgpLmV2YWxUbyhzdmQubV9tYXRyaXhWLCBtX3dvcmtzcGFjZSk7CisgICAgICBlbHNlIGlmKHN2ZC5tX2NvbXB1dGVUaGluVikKKyAgICAgIHsKKyAgICAgICAgc3ZkLm1fbWF0cml4Vi5zZXRJZGVudGl0eShtYXRyaXguY29scygpLCBtYXRyaXgucm93cygpKTsKKyAgICAgICAgbV9xci5ob3VzZWhvbGRlclEoKS5hcHBseVRoaXNPblRoZUxlZnQoc3ZkLm1fbWF0cml4ViwgbV93b3Jrc3BhY2UpOworICAgICAgfQorICAgICAgaWYoc3ZkLmNvbXB1dGVVKCkpIHN2ZC5tX21hdHJpeFUgPSBtX3FyLmNvbHNQZXJtdXRhdGlvbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICB9CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgQ29sUGl2SG91c2Vob2xkZXJRUjxUcmFuc3Bvc2VUeXBlV2l0aFNhbWVTdG9yYWdlT3JkZXI+IFFSVHlwZTsKKyAgUVJUeXBlIG1fcXI7CisgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlciBtX2Fkam9pbnQ7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKKy8qKiogcHJlY29uZGl0aW9uZXIgdXNpbmcgSG91c2Vob2xkZXJRUiAqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlUm93c1RoYW5Db2xzLCB0cnVlPgoreworcHVibGljOgorICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLnJvd3MoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQuY29scygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuflFSVHlwZSgpOworICAgICAgOjpuZXcgKCZtX3FyKSBRUlR5cGUoc3ZkLnJvd3MoKSwgc3ZkLmNvbHMoKSk7CisgICAgfQorICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFUpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQucm93cygpKTsKKyAgICBlbHNlIGlmIChzdmQubV9jb21wdXRlVGhpblUpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgfQorCisgIGJvb2wgcnVuKEphY29iaVNWRDxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgeworICAgIGlmKG1hdHJpeC5yb3dzKCkgPiBtYXRyaXguY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuY29tcHV0ZShtYXRyaXgpOworICAgICAgc3ZkLm1fd29ya01hdHJpeCA9IG1fcXIubWF0cml4UVIoKS5ibG9jaygwLDAsbWF0cml4LmNvbHMoKSxtYXRyaXguY29scygpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV9xci5ob3VzZWhvbGRlclEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4VSwgbV93b3Jrc3BhY2UpOworICAgICAgZWxzZSBpZihzdmQubV9jb21wdXRlVGhpblUpCisgICAgICB7CisgICAgICAgIHN2ZC5tX21hdHJpeFUuc2V0SWRlbnRpdHkobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSk7CisgICAgICAgIG1fcXIuaG91c2Vob2xkZXJRKCkuYXBwbHlUaGlzT25UaGVMZWZ0KHN2ZC5tX21hdHJpeFUsIG1fd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICAgIGlmKHN2ZC5jb21wdXRlVigpKSBzdmQubV9tYXRyaXhWLnNldElkZW50aXR5KG1hdHJpeC5jb2xzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorcHJpdmF0ZToKKyAgdHlwZWRlZiBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IFFSVHlwZTsKKyAgUVJUeXBlIG1fcXI7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzLCB0cnVlPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0KKyAgeworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcjsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLmNvbHMoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQucm93cygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuflFSVHlwZSgpOworICAgICAgOjpuZXcgKCZtX3FyKSBRUlR5cGUoc3ZkLmNvbHMoKSwgc3ZkLnJvd3MoKSk7CisgICAgfQorICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgICBlbHNlIGlmIChzdmQubV9jb21wdXRlVGhpblYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQucm93cygpKTsKKyAgICBtX2Fkam9pbnQucmVzaXplKHN2ZC5jb2xzKCksIHN2ZC5yb3dzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LmNvbHMoKSA+IG1hdHJpeC5yb3dzKCkpCisgICAgeworICAgICAgbV9hZGpvaW50ID0gbWF0cml4LmFkam9pbnQoKTsKKyAgICAgIG1fcXIuY29tcHV0ZShtX2Fkam9pbnQpOworCisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXgucm93cygpLG1hdHJpeC5yb3dzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVikgbV9xci5ob3VzZWhvbGRlclEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4ViwgbV93b3Jrc3BhY2UpOworICAgICAgZWxzZSBpZihzdmQubV9jb21wdXRlVGhpblYpCisgICAgICB7CisgICAgICAgIHN2ZC5tX21hdHJpeFYuc2V0SWRlbnRpdHkobWF0cml4LmNvbHMoKSwgbWF0cml4LnJvd3MoKSk7CisgICAgICAgIG1fcXIuaG91c2Vob2xkZXJRKCkuYXBwbHlUaGlzT25UaGVMZWZ0KHN2ZC5tX21hdHJpeFYsIG1fd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVLnNldElkZW50aXR5KG1hdHJpeC5yb3dzKCksIG1hdHJpeC5yb3dzKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICB9CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgSG91c2Vob2xkZXJRUjxUcmFuc3Bvc2VUeXBlV2l0aFNhbWVTdG9yYWdlT3JkZXI+IFFSVHlwZTsKKyAgUVJUeXBlIG1fcXI7CisgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlciBtX2Fkam9pbnQ7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKKy8qKiogMngyIFNWRCBpbXBsZW1lbnRhdGlvbgorICoqKgorICoqKiBKYWNvYmlTVkQgY29uc2lzdHMgaW4gcGVyZm9ybWluZyBhIHNlcmllcyBvZiAyeDIgU1ZEIHN1YnByb2JsZW1zCisgKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lcj4KK3N0cnVjdCBzdmRfcHJlY29uZGl0aW9uXzJ4Ml9ibG9ja190b19iZV9yZWFsPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXIsIGZhbHNlPgoreworICB0eXBlZGVmIEphY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiBTVkQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgYm9vbCBydW4odHlwZW5hbWUgU1ZEOjpXb3JrTWF0cml4VHlwZSYsIFNWRCYsIEluZGV4LCBJbmRleCwgUmVhbFNjYWxhciYpIHsgcmV0dXJuIHRydWU7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyPgorc3RydWN0IHN2ZF9wcmVjb25kaXRpb25fMngyX2Jsb2NrX3RvX2JlX3JlYWw8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lciwgdHJ1ZT4KK3sKKyAgdHlwZWRlZiBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4gU1ZEOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgYm9vbCBydW4odHlwZW5hbWUgU1ZEOjpXb3JrTWF0cml4VHlwZSYgd29ya19tYXRyaXgsIFNWRCYgc3ZkLCBJbmRleCBwLCBJbmRleCBxLCBSZWFsU2NhbGFyJiBtYXhEaWFnRW50cnkpCisgIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgU2NhbGFyIHo7CisgICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiByb3Q7CisgICAgUmVhbFNjYWxhciBuID0gc3FydChudW1leHQ6OmFiczIod29ya19tYXRyaXguY29lZmYocCxwKSkgKyBudW1leHQ6OmFiczIod29ya19tYXRyaXguY29lZmYocSxwKSkpOworCisgICAgY29uc3QgUmVhbFNjYWxhciBjb25zaWRlckFzWmVybyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCk7CisgICAgY29uc3QgUmVhbFNjYWxhciBwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworCisgICAgaWYobj09MCkKKyAgICB7CisgICAgICAvLyBtYWtlIHN1cmUgZmlyc3QgY29sdW1uIGlzIHplcm8KKyAgICAgIHdvcmtfbWF0cml4LmNvZWZmUmVmKHAscCkgPSB3b3JrX21hdHJpeC5jb2VmZlJlZihxLHApID0gU2NhbGFyKDApOworCisgICAgICBpZihhYnMobnVtZXh0OjppbWFnKHdvcmtfbWF0cml4LmNvZWZmKHAscSkpKT5jb25zaWRlckFzWmVybykKKyAgICAgIHsKKyAgICAgICAgLy8gd29ya19tYXRyaXguY29lZmYocCxxKSBjYW4gYmUgemVybyBpZiB3b3JrX21hdHJpeC5jb2VmZihxLHApIGlzIG5vdCB6ZXJvIGJ1dCBzbWFsbCBlbm91Z2ggdG8gdW5kZXJmbG93IHdoZW4gY29tcHV0aW5nIG4KKyAgICAgICAgeiA9IGFicyh3b3JrX21hdHJpeC5jb2VmZihwLHEpKSAvIHdvcmtfbWF0cml4LmNvZWZmKHAscSk7CisgICAgICAgIHdvcmtfbWF0cml4LnJvdyhwKSAqPSB6OworICAgICAgICBpZihzdmQuY29tcHV0ZVUoKSkgc3ZkLm1fbWF0cml4VS5jb2wocCkgKj0gY29uaih6KTsKKyAgICAgIH0KKyAgICAgIGlmKGFicyhudW1leHQ6OmltYWcod29ya19tYXRyaXguY29lZmYocSxxKSkpPmNvbnNpZGVyQXNaZXJvKQorICAgICAgeworICAgICAgICB6ID0gYWJzKHdvcmtfbWF0cml4LmNvZWZmKHEscSkpIC8gd29ya19tYXRyaXguY29lZmYocSxxKTsKKyAgICAgICAgd29ya19tYXRyaXgucm93KHEpICo9IHo7CisgICAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVLmNvbChxKSAqPSBjb25qKHopOworICAgICAgfQorICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBzZWNvbmQgcm93IGlzIGFscmVhZHkgemVybywgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcm90LmMoKSA9IGNvbmood29ya19tYXRyaXguY29lZmYocCxwKSkgLyBuOworICAgICAgcm90LnMoKSA9IHdvcmtfbWF0cml4LmNvZWZmKHEscCkgLyBuOworICAgICAgd29ya19tYXRyaXguYXBwbHlPblRoZUxlZnQocCxxLHJvdCk7CisgICAgICBpZihzdmQuY29tcHV0ZVUoKSkgc3ZkLm1fbWF0cml4VS5hcHBseU9uVGhlUmlnaHQocCxxLHJvdC5hZGpvaW50KCkpOworICAgICAgaWYoYWJzKG51bWV4dDo6aW1hZyh3b3JrX21hdHJpeC5jb2VmZihwLHEpKSk+Y29uc2lkZXJBc1plcm8pCisgICAgICB7CisgICAgICAgIHogPSBhYnMod29ya19tYXRyaXguY29lZmYocCxxKSkgLyB3b3JrX21hdHJpeC5jb2VmZihwLHEpOworICAgICAgICB3b3JrX21hdHJpeC5jb2wocSkgKj0gejsKKyAgICAgICAgaWYoc3ZkLmNvbXB1dGVWKCkpIHN2ZC5tX21hdHJpeFYuY29sKHEpICo9IHo7CisgICAgICB9CisgICAgICBpZihhYnMobnVtZXh0OjppbWFnKHdvcmtfbWF0cml4LmNvZWZmKHEscSkpKT5jb25zaWRlckFzWmVybykKKyAgICAgIHsKKyAgICAgICAgeiA9IGFicyh3b3JrX21hdHJpeC5jb2VmZihxLHEpKSAvIHdvcmtfbWF0cml4LmNvZWZmKHEscSk7CisgICAgICAgIHdvcmtfbWF0cml4LnJvdyhxKSAqPSB6OworICAgICAgICBpZihzdmQuY29tcHV0ZVUoKSkgc3ZkLm1fbWF0cml4VS5jb2wocSkgKj0gY29uaih6KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgbGFyZ2VzdCBkaWFnb25hbCBlbnRyeQorICAgIG1heERpYWdFbnRyeSA9IG51bWV4dDo6bWF4aTxSZWFsU2NhbGFyPihtYXhEaWFnRW50cnksbnVtZXh0OjptYXhpPFJlYWxTY2FsYXI+KGFicyh3b3JrX21hdHJpeC5jb2VmZihwLHApKSwgYWJzKHdvcmtfbWF0cml4LmNvZWZmKHEscSkpKSk7CisgICAgLy8gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIDJ4MiBibG9jayBpcyBhbHJlYWR5IGRpYWdvbmFsCisgICAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oY29uc2lkZXJBc1plcm8sIHByZWNpc2lvbiAqIG1heERpYWdFbnRyeSk7CisgICAgcmV0dXJuIGFicyh3b3JrX21hdHJpeC5jb2VmZihwLHEpKT50aHJlc2hvbGQgfHwgYWJzKHdvcmtfbWF0cml4LmNvZWZmKHEscCkpID4gdGhyZXNob2xkOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+IAorc3RydWN0IHRyYWl0czxKYWNvYmlTVkQ8X01hdHJpeFR5cGUsUVJQcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIFNWRF9Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEphY29iaVNWRAorICAqCisgICogXGJyaWVmIFR3by1zaWRlZCBKYWNvYmkgU1ZEIGRlY29tcG9zaXRpb24gb2YgYSByZWN0YW5ndWxhciBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBTVkQgZGVjb21wb3NpdGlvbgorICAqIFx0cGFyYW0gUVJQcmVjb25kaXRpb25lciB0aGlzIG9wdGlvbmFsIHBhcmFtZXRlciBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBRUiBkZWNvbXBvc2l0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGludGVybmFsbHkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgUi1TVkQgc3RlcCBmb3Igbm9uLXNxdWFyZSBtYXRyaWNlcy4gU2VlIGRpc2N1c3Npb24gb2YgcG9zc2libGUgdmFsdWVzIGJlbG93LgorICAqCisgICogU1ZEIGRlY29tcG9zaXRpb24gY29uc2lzdHMgaW4gZGVjb21wb3NpbmcgYW55IG4tYnktcCBtYXRyaXggXGEgQSBhcyBhIHByb2R1Y3QKKyAgKiAgIFxmWyBBID0gVSBTIFZeKiBcZl0KKyAgKiB3aGVyZSBcYSBVIGlzIGEgbi1ieS1uIHVuaXRhcnksIFxhIFYgaXMgYSBwLWJ5LXAgdW5pdGFyeSwgYW5kIFxhIFMgaXMgYSBuLWJ5LXAgcmVhbCBwb3NpdGl2ZSBtYXRyaXggd2hpY2ggaXMgemVybyBvdXRzaWRlIG9mIGl0cyBtYWluIGRpYWdvbmFsOworICAqIHRoZSBkaWFnb25hbCBlbnRyaWVzIG9mIFMgYXJlIGtub3duIGFzIHRoZSBcZW0gc2luZ3VsYXIgXGVtIHZhbHVlcyBvZiBcYSBBIGFuZCB0aGUgY29sdW1ucyBvZiBcYSBVIGFuZCBcYSBWIGFyZSBrbm93biBhcyB0aGUgbGVmdAorICAqIGFuZCByaWdodCBcZW0gc2luZ3VsYXIgXGVtIHZlY3RvcnMgb2YgXGEgQSByZXNwZWN0aXZlbHkuCisgICoKKyAgKiBTaW5ndWxhciB2YWx1ZXMgYXJlIGFsd2F5cyBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlci4KKyAgKgorICAqIFRoaXMgSmFjb2JpU1ZEIGRlY29tcG9zaXRpb24gY29tcHV0ZXMgb25seSB0aGUgc2luZ3VsYXIgdmFsdWVzIGJ5IGRlZmF1bHQuIElmIHlvdSB3YW50IFxhIFUgb3IgXGEgViwgeW91IG5lZWQgdG8gYXNrIGZvciB0aGVtIGV4cGxpY2l0bHkuCisgICoKKyAgKiBZb3UgY2FuIGFzayBmb3Igb25seSBcZW0gdGhpbiBcYSBVIG9yIFxhIFYgdG8gYmUgY29tcHV0ZWQsIG1lYW5pbmcgdGhlIGZvbGxvd2luZy4gSW4gY2FzZSBvZiBhIHJlY3Rhbmd1bGFyIG4tYnktcCBtYXRyaXgsIGxldHRpbmcgXGEgbSBiZSB0aGUKKyAgKiBzbWFsbGVyIHZhbHVlIGFtb25nIFxhIG4gYW5kIFxhIHAsIHRoZXJlIGFyZSBvbmx5IFxhIG0gc2luZ3VsYXIgdmVjdG9yczsgdGhlIHJlbWFpbmluZyBjb2x1bW5zIG9mIFxhIFUgYW5kIFxhIFYgZG8gbm90IGNvcnJlc3BvbmQgdG8gYWN0dWFsCisgICogc2luZ3VsYXIgdmVjdG9ycy4gQXNraW5nIGZvciBcZW0gdGhpbiBcYSBVIG9yIFxhIFYgbWVhbnMgYXNraW5nIGZvciBvbmx5IHRoZWlyIFxhIG0gZmlyc3QgY29sdW1ucyB0byBiZSBmb3JtZWQuIFNvIFxhIFUgaXMgdGhlbiBhIG4tYnktbSBtYXRyaXgsCisgICogYW5kIFxhIFYgaXMgdGhlbiBhIHAtYnktbSBtYXRyaXguIE5vdGljZSB0aGF0IHRoaW4gXGEgVSBhbmQgXGEgViBhcmUgYWxsIHlvdSBuZWVkIGZvciAobGVhc3Qgc3F1YXJlcykgc29sdmluZy4KKyAgKgorICAqIEhlcmUncyBhbiBleGFtcGxlIGRlbW9uc3RyYXRpbmcgYmFzaWMgdXNhZ2U6CisgICogXGluY2x1ZGUgSmFjb2JpU1ZEX2Jhc2ljLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEphY29iaVNWRF9iYXNpYy5vdXQKKyAgKgorICAqIFRoaXMgSmFjb2JpU1ZEIGNsYXNzIGlzIGEgdHdvLXNpZGVkIEphY29iaSBSLVNWRCBkZWNvbXBvc2l0aW9uLCBlbnN1cmluZyBvcHRpbWFsIHJlbGlhYmlsaXR5IGFuZCBhY2N1cmFjeS4gVGhlIGRvd25zaWRlIGlzIHRoYXQgaXQncyBzbG93ZXIgdGhhbgorICAqIGJpZGlhZ29uYWxpemluZyBTVkQgYWxnb3JpdGhtcyBmb3IgbGFyZ2Ugc3F1YXJlIG1hdHJpY2VzOyBob3dldmVyIGl0cyBjb21wbGV4aXR5IGlzIHN0aWxsIFxmJCBPKG5eMnApIFxmJCB3aGVyZSBcYSBuIGlzIHRoZSBzbWFsbGVyIGRpbWVuc2lvbiBhbmQKKyAgKiBcYSBwIGlzIHRoZSBncmVhdGVyIGRpbWVuc2lvbiwgbWVhbmluZyB0aGF0IGl0IGlzIHN0aWxsIG9mIHRoZSBzYW1lIG9yZGVyIG9mIGNvbXBsZXhpdHkgYXMgdGhlIGZhc3RlciBiaWRpYWdvbmFsaXppbmcgUi1TVkQgYWxnb3JpdGhtcy4KKyAgKiBJbiBwYXJ0aWN1bGFyLCBsaWtlIGFueSBSLVNWRCwgaXQgdGFrZXMgYWR2YW50YWdlIG9mIG5vbi1zcXVhcmVuZXNzIGluIHRoYXQgaXRzIGNvbXBsZXhpdHkgaXMgb25seSBsaW5lYXIgaW4gdGhlIGdyZWF0ZXIgZGltZW5zaW9uLgorICAqCisgICogSWYgdGhlIGlucHV0IG1hdHJpeCBoYXMgaW5mIG9yIG5hbiBjb2VmZmljaWVudHMsIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIHVuZGVmaW5lZCwgYnV0IHRoZSBjb21wdXRhdGlvbiBpcyBndWFyYW50ZWVkIHRvCisgICogdGVybWluYXRlIGluIGZpbml0ZSAoYW5kIHJlYXNvbmFibGUpIHRpbWUuCisgICoKKyAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGZvciBRUlByZWNvbmRpdGlvbmVyIGFyZToKKyAgKiBcbGkgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyIGlzIHRoZSBkZWZhdWx0LiBJbiBwcmFjdGljZSBpdCdzIHZlcnkgc2FmZS4gSXQgdXNlcyBjb2x1bW4tcGl2b3RpbmcgUVIuCisgICogXGxpIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIsIGlzIHRoZSBzYWZlc3QgYW5kIHNsb3dlc3QuIEl0IHVzZXMgZnVsbC1waXZvdGluZyBRUi4KKyAgKiAgICAgQ29udHJhcnkgdG8gb3RoZXIgUVJzLCBpdCBkb2Vzbid0IGFsbG93IGNvbXB1dGluZyB0aGluIHVuaXRhcmllcy4KKyAgKiBcbGkgSG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyIGlzIHRoZSBmYXN0ZXN0LCBhbmQgbGVzcyBzYWZlIGFuZCBhY2N1cmF0ZSB0aGFuIHRoZSBwaXZvdGluZyB2YXJpYW50cy4gSXQgdXNlcyBub24tcGl2b3RpbmcgUVIuCisgICogICAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIGluIHNhZmV0eSBhbmQgYWNjdXJhY3kgdG8gdGhlIGJpZGlhZ29uYWxpemF0aW9uIHByb2Nlc3MgdXNlZCBieSBiaWRpYWdvbmFsaXppbmcgU1ZEIGFsZ29yaXRobXMgKHNpbmNlIGJpZGlhZ29uYWxpemF0aW9uCisgICogICAgIGlzIGluaGVyZW50bHkgbm9uLXBpdm90aW5nKS4gSG93ZXZlciB0aGUgcmVzdWx0aW5nIFNWRCBpcyBzdGlsbCBtb3JlIHJlbGlhYmxlIHRoYW4gYmlkaWFnb25hbGl6aW5nIFNWRHMgYmVjYXVzZSB0aGUgSmFjb2JpLWJhc2VkIGl0ZXJhcml2ZQorICAqICAgICBwcm9jZXNzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgb3B0aW1pemVkIGJpZGlhZ29uYWwgU1ZEIGl0ZXJhdGlvbnMuCisgICogXGxpIE5vUVJQcmVjb25kaXRpb25lciBhbGxvd3Mgbm90IHRvIHVzZSBhIFFSIHByZWNvbmRpdGlvbmVyIGF0IGFsbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGtub3cgdGhhdCB5b3Ugd2lsbCBvbmx5IGJlIGNvbXB1dGluZworICAqICAgICBKYWNvYmlTVkQgZGVjb21wb3NpdGlvbnMgb2Ygc3F1YXJlIG1hdHJpY2VzLiBOb24tc3F1YXJlIG1hdHJpY2VzIHJlcXVpcmUgYSBRUiBwcmVjb25kaXRpb25lci4gVXNpbmcgdGhpcyBvcHRpb24gd2lsbCByZXN1bHQgaW4KKyAgKiAgICAgZmFzdGVyIGNvbXBpbGF0aW9uIGFuZCBzbWFsbGVyIGV4ZWN1dGFibGUgY29kZS4gSXQgd29uJ3Qgc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBjb21wdXRhdGlvbiwgc2luY2UgSmFjb2JpU1ZEIGlzIGFsd2F5cyBjaGVja2luZworICAqICAgICBpZiBRUiBwcmVjb25kaXRpb25pbmcgaXMgbmVlZGVkIGJlZm9yZSBhcHBseWluZyBpdCBhbnl3YXkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6amFjb2JpU3ZkKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lcj4gY2xhc3MgSmFjb2JpU1ZECisgOiBwdWJsaWMgU1ZEQmFzZTxKYWNvYmlTVkQ8X01hdHJpeFR5cGUsUVJQcmVjb25kaXRpb25lcj4gPgoreworICAgIHR5cGVkZWYgU1ZEQmFzZTxKYWNvYmlTVkQ+IEJhc2U7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBEaWFnU2l6ZUF0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhSb3dzQXRDb21waWxlVGltZSxDb2xzQXRDb21waWxlVGltZSksCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heERpYWdTaXplQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChNYXhSb3dzQXRDb21waWxlVGltZSxNYXhDb2xzQXRDb21waWxlVGltZSksCisgICAgICBNYXRyaXhPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucworICAgIH07CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6Ok1hdHJpeFVUeXBlIE1hdHJpeFVUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6TWF0cml4VlR5cGUgTWF0cml4VlR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTaW5ndWxhclZhbHVlc1R5cGUgU2luZ3VsYXJWYWx1ZXNUeXBlOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIFJvd1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29sX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgQ29sVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpYWdTaXplQXRDb21waWxlVGltZSwgRGlhZ1NpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgIE1hdHJpeE9wdGlvbnMsIE1heERpYWdTaXplQXRDb21waWxlVGltZSwgTWF4RGlhZ1NpemVBdENvbXBpbGVUaW1lPgorICAgICAgICAgICAgV29ya01hdHJpeFR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIEphY29iaVNWRDo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgICAqLworICAgIEphY29iaVNWRCgpCisgICAge30KKworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gc2l6ZS4KKyAgICAgICogXHNhIEphY29iaVNWRCgpCisgICAgICAqLworICAgIEphY29iaVNWRChJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zID0gMCkKKyAgICB7CisgICAgICBhbGxvY2F0ZShyb3dzLCBjb2xzLCBjb21wdXRhdGlvbk9wdGlvbnMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IgcGVyZm9ybWluZyB0aGUgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICoKKyAgICAgKiBccGFyYW0gbWF0cml4IHRoZSBtYXRyaXggdG8gZGVjb21wb3NlCisgICAgICogXHBhcmFtIGNvbXB1dGF0aW9uT3B0aW9ucyBvcHRpb25hbCBwYXJhbWV0ZXIgYWxsb3dpbmcgdG8gc3BlY2lmeSBpZiB5b3Ugd2FudCBmdWxsIG9yIHRoaW4gVSBvciBWIHVuaXRhcmllcyB0byBiZSBjb21wdXRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIG5vbmUgaXMgY29tcHV0ZWQuIFRoaXMgaXMgYSBiaXQtZmllbGQsIHRoZSBwb3NzaWJsZSBiaXRzIGFyZSAjQ29tcHV0ZUZ1bGxVLCAjQ29tcHV0ZVRoaW5VLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgI0NvbXB1dGVGdWxsViwgI0NvbXB1dGVUaGluVi4KKyAgICAgKgorICAgICAqIFRoaW4gdW5pdGFyaWVzIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB5b3VyIG1hdHJpeCB0eXBlIGhhcyBhIER5bmFtaWMgbnVtYmVyIG9mIGNvbHVtbnMgKGZvciBleGFtcGxlIE1hdHJpeFhmKS4gVGhleSBhbHNvIGFyZSBub3QKKyAgICAgKiBhdmFpbGFibGUgd2l0aCB0aGUgKG5vbi1kZWZhdWx0KSBGdWxsUGl2SG91c2Vob2xkZXJRUiBwcmVjb25kaXRpb25lci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBKYWNvYmlTVkQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zID0gMCkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeCwgY29tcHV0YXRpb25PcHRpb25zKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIE1ldGhvZCBwZXJmb3JtaW5nIHRoZSBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCB1c2luZyBjdXN0b20gb3B0aW9ucy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCB0byBkZWNvbXBvc2UKKyAgICAgKiBccGFyYW0gY29tcHV0YXRpb25PcHRpb25zIG9wdGlvbmFsIHBhcmFtZXRlciBhbGxvd2luZyB0byBzcGVjaWZ5IGlmIHlvdSB3YW50IGZ1bGwgb3IgdGhpbiBVIG9yIFYgdW5pdGFyaWVzIHRvIGJlIGNvbXB1dGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgbm9uZSBpcyBjb21wdXRlZC4gVGhpcyBpcyBhIGJpdC1maWVsZCwgdGhlIHBvc3NpYmxlIGJpdHMgYXJlICNDb21wdXRlRnVsbFUsICNDb21wdXRlVGhpblUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAjQ29tcHV0ZUZ1bGxWLCAjQ29tcHV0ZVRoaW5WLgorICAgICAqCisgICAgICogVGhpbiB1bml0YXJpZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHlvdXIgbWF0cml4IHR5cGUgaGFzIGEgRHluYW1pYyBudW1iZXIgb2YgY29sdW1ucyAoZm9yIGV4YW1wbGUgTWF0cml4WGYpLiBUaGV5IGFsc28gYXJlIG5vdAorICAgICAqIGF2YWlsYWJsZSB3aXRoIHRoZSAobm9uLWRlZmF1bHQpIEZ1bGxQaXZIb3VzZWhvbGRlclFSIHByZWNvbmRpdGlvbmVyLgorICAgICAqLworICAgIEphY29iaVNWRCYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpOworCisgICAgLyoqIFxicmllZiBNZXRob2QgcGVyZm9ybWluZyB0aGUgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXggdXNpbmcgY3VycmVudCBvcHRpb25zLgorICAgICAqCisgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IHRvIGRlY29tcG9zZQorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgY3VycmVudCBcYSBjb21wdXRhdGlvbk9wdGlvbnMsIGFzIGFscmVhZHkgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvciB0byBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCB1bnNpZ25lZCBpbnQpLgorICAgICAqLworICAgIEphY29iaVNWRCYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgcmV0dXJuIGNvbXB1dGUobWF0cml4LCBtX2NvbXB1dGF0aW9uT3B0aW9ucyk7CisgICAgfQorCisgICAgdXNpbmcgQmFzZTo6Y29tcHV0ZVU7CisgICAgdXNpbmcgQmFzZTo6Y29tcHV0ZVY7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnJhbms7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGFsbG9jYXRlKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpOworCisgIHByb3RlY3RlZDoKKyAgICB1c2luZyBCYXNlOjptX21hdHJpeFU7CisgICAgdXNpbmcgQmFzZTo6bV9tYXRyaXhWOworICAgIHVzaW5nIEJhc2U6Om1fc2luZ3VsYXJWYWx1ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIHVzaW5nIEJhc2U6Om1faXNBbGxvY2F0ZWQ7CisgICAgdXNpbmcgQmFzZTo6bV91c2VQcmVzY3JpYmVkVGhyZXNob2xkOworICAgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZUZ1bGxVOworICAgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZVRoaW5VOworICAgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZUZ1bGxWOworICAgIHVzaW5nIEJhc2U6Om1fY29tcHV0ZVRoaW5WOworICAgIHVzaW5nIEJhc2U6Om1fY29tcHV0YXRpb25PcHRpb25zOworICAgIHVzaW5nIEJhc2U6Om1fbm9uemVyb1Npbmd1bGFyVmFsdWVzOworICAgIHVzaW5nIEJhc2U6Om1fcm93czsKKyAgICB1c2luZyBCYXNlOjptX2NvbHM7CisgICAgdXNpbmcgQmFzZTo6bV9kaWFnU2l6ZTsKKyAgICB1c2luZyBCYXNlOjptX3ByZXNjcmliZWRUaHJlc2hvbGQ7CisgICAgV29ya01hdHJpeFR5cGUgbV93b3JrTWF0cml4OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX19NYXRyaXhUeXBlLCBpbnQgX1FSUHJlY29uZGl0aW9uZXIsIGJvb2wgX0lzQ29tcGxleD4KKyAgICBmcmllbmQgc3RydWN0IGludGVybmFsOjpzdmRfcHJlY29uZGl0aW9uXzJ4Ml9ibG9ja190b19iZV9yZWFsOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9fTWF0cml4VHlwZSwgaW50IF9RUlByZWNvbmRpdGlvbmVyLCBpbnQgX0Nhc2UsIGJvb2wgX0RvQW55dGhpbmc+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6cXJfcHJlY29uZGl0aW9uZXJfaW1wbDsKKworICAgIGludGVybmFsOjpxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXIsIGludGVybmFsOjpQcmVjb25kaXRpb25JZk1vcmVDb2xzVGhhblJvd3M+IG1fcXJfcHJlY29uZF9tb3JlY29sczsKKyAgICBpbnRlcm5hbDo6cXJfcHJlY29uZGl0aW9uZXJfaW1wbDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyLCBpbnRlcm5hbDo6UHJlY29uZGl0aW9uSWZNb3JlUm93c1RoYW5Db2xzPiBtX3FyX3ByZWNvbmRfbW9yZXJvd3M7CisgICAgTWF0cml4VHlwZSBtX3NjYWxlZE1hdHJpeDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyPgordm9pZCBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj46OmFsbG9jYXRlKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpCit7CisgIGVpZ2VuX2Fzc2VydChyb3dzID49IDAgJiYgY29scyA+PSAwKTsKKworICBpZiAobV9pc0FsbG9jYXRlZCAmJgorICAgICAgcm93cyA9PSBtX3Jvd3MgJiYKKyAgICAgIGNvbHMgPT0gbV9jb2xzICYmCisgICAgICBjb21wdXRhdGlvbk9wdGlvbnMgPT0gbV9jb21wdXRhdGlvbk9wdGlvbnMpCisgIHsKKyAgICByZXR1cm47CisgIH0KKworICBtX3Jvd3MgPSByb3dzOworICBtX2NvbHMgPSBjb2xzOworICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgbV9pc0FsbG9jYXRlZCA9IHRydWU7CisgIG1fY29tcHV0YXRpb25PcHRpb25zID0gY29tcHV0YXRpb25PcHRpb25zOworICBtX2NvbXB1dGVGdWxsVSA9IChjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlRnVsbFUpICE9IDA7CisgIG1fY29tcHV0ZVRoaW5VID0gKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVUaGluVSkgIT0gMDsKKyAgbV9jb21wdXRlRnVsbFYgPSAoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZUZ1bGxWKSAhPSAwOworICBtX2NvbXB1dGVUaGluViA9IChjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblYpICE9IDA7CisgIGVpZ2VuX2Fzc2VydCghKG1fY29tcHV0ZUZ1bGxVICYmIG1fY29tcHV0ZVRoaW5VKSAmJiAiSmFjb2JpU1ZEOiB5b3UgY2FuJ3QgYXNrIGZvciBib3RoIGZ1bGwgYW5kIHRoaW4gVSIpOworICBlaWdlbl9hc3NlcnQoIShtX2NvbXB1dGVGdWxsViAmJiBtX2NvbXB1dGVUaGluVikgJiYgIkphY29iaVNWRDogeW91IGNhbid0IGFzayBmb3IgYm90aCBmdWxsIGFuZCB0aGluIFYiKTsKKyAgZWlnZW5fYXNzZXJ0KEVJR0VOX0lNUExJRVMobV9jb21wdXRlVGhpblUgfHwgbV9jb21wdXRlVGhpblYsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKSAmJgorICAgICAgICAgICAgICAiSmFjb2JpU1ZEOiB0aGluIFUgYW5kIFYgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4geW91ciBtYXRyaXggaGFzIGEgZHluYW1pYyBudW1iZXIgb2YgY29sdW1ucy4iKTsKKyAgaWYgKFFSUHJlY29uZGl0aW9uZXIgPT0gRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcikKKyAgeworICAgICAgZWlnZW5fYXNzZXJ0KCEobV9jb21wdXRlVGhpblUgfHwgbV9jb21wdXRlVGhpblYpICYmCisgICAgICAgICAgICAgICJKYWNvYmlTVkQ6IGNhbid0IGNvbXB1dGUgdGhpbiBVIG9yIHRoaW4gViB3aXRoIHRoZSBGdWxsUGl2SG91c2Vob2xkZXJRUiBwcmVjb25kaXRpb25lci4gIgorICAgICAgICAgICAgICAiVXNlIHRoZSBDb2xQaXZIb3VzZWhvbGRlclFSIHByZWNvbmRpdGlvbmVyIGluc3RlYWQuIik7CisgIH0KKyAgbV9kaWFnU2l6ZSA9IChzdGQ6Om1pbikobV9yb3dzLCBtX2NvbHMpOworICBtX3Npbmd1bGFyVmFsdWVzLnJlc2l6ZShtX2RpYWdTaXplKTsKKyAgaWYoUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgbV9tYXRyaXhVLnJlc2l6ZShtX3Jvd3MsIG1fY29tcHV0ZUZ1bGxVID8gbV9yb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2NvbXB1dGVUaGluVSA/IG1fZGlhZ1NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOworICBpZihDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICBtX21hdHJpeFYucmVzaXplKG1fY29scywgbV9jb21wdXRlRnVsbFYgPyBtX2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fY29tcHV0ZVRoaW5WID8gbV9kaWFnU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7CisgIG1fd29ya01hdHJpeC5yZXNpemUobV9kaWFnU2l6ZSwgbV9kaWFnU2l6ZSk7CisgIAorICBpZihtX2NvbHM+bV9yb3dzKSAgIG1fcXJfcHJlY29uZF9tb3JlY29scy5hbGxvY2F0ZSgqdGhpcyk7CisgIGlmKG1fcm93cz5tX2NvbHMpICAgbV9xcl9wcmVjb25kX21vcmVyb3dzLmFsbG9jYXRlKCp0aGlzKTsKKyAgaWYobV9yb3dzIT1tX2NvbHMpICBtX3NjYWxlZE1hdHJpeC5yZXNpemUocm93cyxjb2xzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+CitKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4mCitKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgYWxsb2NhdGUobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSwgY29tcHV0YXRpb25PcHRpb25zKTsKKworICAvLyBjdXJyZW50bHkgd2Ugc3RvcCB3aGVuIHdlIHJlYWNoIHByZWNpc2lvbiAyKmVwc2lsb24gYXMgdGhlIGxhc3QgYml0IG9mIHByZWNpc2lvbiBjYW4gcmVxdWlyZSBhbiB1bnJlYXNvbmFibGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMsCisgIC8vIG9ubHkgd29yc2VuaW5nIHRoZSBwcmVjaXNpb24gb2YgVSBhbmQgViBhcyB3ZSBhY2N1bXVsYXRlIG1vcmUgcm90YXRpb25zCisgIGNvbnN0IFJlYWxTY2FsYXIgcHJlY2lzaW9uID0gUmVhbFNjYWxhcigyKSAqIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisKKyAgLy8gbGltaXQgZm9yIGRlbm9ybWFsIG51bWJlcnMgdG8gYmUgY29uc2lkZXJlZCB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzIChzZWUgYnVnIDI4NikKKyAgY29uc3QgUmVhbFNjYWxhciBjb25zaWRlckFzWmVybyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCk7CisKKyAgLy8gU2NhbGluZyBmYWN0b3IgdG8gcmVkdWNlIG92ZXIvdW5kZXItZmxvd3MKKyAgUmVhbFNjYWxhciBzY2FsZSA9IG1hdHJpeC5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIGlmKHNjYWxlPT1SZWFsU2NhbGFyKDApKSBzY2FsZSA9IFJlYWxTY2FsYXIoMSk7CisgIAorICAvKioqIHN0ZXAgMS4gVGhlIFItU1ZEIHN0ZXA6IHdlIHVzZSBhIFFSIGRlY29tcG9zaXRpb24gdG8gcmVkdWNlIHRvIHRoZSBjYXNlIG9mIGEgc3F1YXJlIG1hdHJpeCAqLworCisgIGlmKG1fcm93cyE9bV9jb2xzKQorICB7CisgICAgbV9zY2FsZWRNYXRyaXggPSBtYXRyaXggLyBzY2FsZTsKKyAgICBtX3FyX3ByZWNvbmRfbW9yZWNvbHMucnVuKCp0aGlzLCBtX3NjYWxlZE1hdHJpeCk7CisgICAgbV9xcl9wcmVjb25kX21vcmVyb3dzLnJ1bigqdGhpcywgbV9zY2FsZWRNYXRyaXgpOworICB9CisgIGVsc2UKKyAgeworICAgIG1fd29ya01hdHJpeCA9IG1hdHJpeC5ibG9jaygwLDAsbV9kaWFnU2l6ZSxtX2RpYWdTaXplKSAvIHNjYWxlOworICAgIGlmKG1fY29tcHV0ZUZ1bGxVKSBtX21hdHJpeFUuc2V0SWRlbnRpdHkobV9yb3dzLG1fcm93cyk7CisgICAgaWYobV9jb21wdXRlVGhpblUpIG1fbWF0cml4VS5zZXRJZGVudGl0eShtX3Jvd3MsbV9kaWFnU2l6ZSk7CisgICAgaWYobV9jb21wdXRlRnVsbFYpIG1fbWF0cml4Vi5zZXRJZGVudGl0eShtX2NvbHMsbV9jb2xzKTsKKyAgICBpZihtX2NvbXB1dGVUaGluVikgbV9tYXRyaXhWLnNldElkZW50aXR5KG1fY29scywgbV9kaWFnU2l6ZSk7CisgIH0KKworICAvKioqIHN0ZXAgMi4gVGhlIG1haW4gSmFjb2JpIFNWRCBpdGVyYXRpb24uICoqKi8KKyAgUmVhbFNjYWxhciBtYXhEaWFnRW50cnkgPSBtX3dvcmtNYXRyaXguY3dpc2VBYnMoKS5kaWFnb25hbCgpLm1heENvZWZmKCk7CisKKyAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOworICB3aGlsZSghZmluaXNoZWQpCisgIHsKKyAgICBmaW5pc2hlZCA9IHRydWU7CisKKyAgICAvLyBkbyBhIHN3ZWVwOiBmb3IgYWxsIGluZGV4IHBhaXJzIChwLHEpLCBwZXJmb3JtIFNWRCBvZiB0aGUgY29ycmVzcG9uZGluZyAyeDIgc3ViLW1hdHJpeAorCisgICAgZm9yKEluZGV4IHAgPSAxOyBwIDwgbV9kaWFnU2l6ZTsgKytwKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBxID0gMDsgcSA8IHA7ICsrcSkKKyAgICAgIHsKKyAgICAgICAgLy8gaWYgdGhpcyAyeDIgc3ViLW1hdHJpeCBpcyBub3QgZGlhZ29uYWwgYWxyZWFkeS4uLgorICAgICAgICAvLyBub3RpY2UgdGhhdCB0aGlzIGNvbXBhcmlzb24gd2lsbCBldmFsdWF0ZSB0byBmYWxzZSBpZiBhbnkgTmFOIGlzIGludm9sdmVkLCBlbnN1cmluZyB0aGF0IE5hTidzIGRvbid0CisgICAgICAgIC8vIGtlZXAgdXMgaXRlcmF0aW5nIGZvcmV2ZXIuIFNpbWlsYXJseSwgc21hbGwgZGVub3JtYWwgbnVtYmVycyBhcmUgY29uc2lkZXJlZCB6ZXJvLgorICAgICAgICBSZWFsU2NhbGFyIHRocmVzaG9sZCA9IG51bWV4dDo6bWF4aTxSZWFsU2NhbGFyPihjb25zaWRlckFzWmVybywgcHJlY2lzaW9uICogbWF4RGlhZ0VudHJ5KTsKKyAgICAgICAgaWYoYWJzKG1fd29ya01hdHJpeC5jb2VmZihwLHEpKT50aHJlc2hvbGQgfHwgYWJzKG1fd29ya01hdHJpeC5jb2VmZihxLHApKSA+IHRocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7CisgICAgICAgICAgLy8gcGVyZm9ybSBTVkQgZGVjb21wb3NpdGlvbiBvZiAyeDIgc3ViLW1hdHJpeCBjb3JyZXNwb25kaW5nIHRvIGluZGljZXMgcCxxIHRvIG1ha2UgaXQgZGlhZ29uYWwKKyAgICAgICAgICAvLyB0aGUgY29tcGxleCB0byByZWFsIG9wZXJhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHVwZGF0ZWQgMngyIGJsb2NrIGlzIG5vdCBhbHJlYWR5IGRpYWdvbmFsCisgICAgICAgICAgaWYoaW50ZXJuYWw6OnN2ZF9wcmVjb25kaXRpb25fMngyX2Jsb2NrX3RvX2JlX3JlYWw8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj46OnJ1bihtX3dvcmtNYXRyaXgsICp0aGlzLCBwLCBxLCBtYXhEaWFnRW50cnkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEphY29iaVJvdGF0aW9uPFJlYWxTY2FsYXI+IGpfbGVmdCwgal9yaWdodDsKKyAgICAgICAgICAgIGludGVybmFsOjpyZWFsXzJ4Ml9qYWNvYmlfc3ZkKG1fd29ya01hdHJpeCwgcCwgcSwgJmpfbGVmdCwgJmpfcmlnaHQpOworCisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdGluZyBKYWNvYmkgcm90YXRpb25zCisgICAgICAgICAgICBtX3dvcmtNYXRyaXguYXBwbHlPblRoZUxlZnQocCxxLGpfbGVmdCk7CisgICAgICAgICAgICBpZihjb21wdXRlVSgpKSBtX21hdHJpeFUuYXBwbHlPblRoZVJpZ2h0KHAscSxqX2xlZnQudHJhbnNwb3NlKCkpOworCisgICAgICAgICAgICBtX3dvcmtNYXRyaXguYXBwbHlPblRoZVJpZ2h0KHAscSxqX3JpZ2h0KTsKKyAgICAgICAgICAgIGlmKGNvbXB1dGVWKCkpIG1fbWF0cml4Vi5hcHBseU9uVGhlUmlnaHQocCxxLGpfcmlnaHQpOworCisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXJnZXN0IGRpYWdvbmFsIGNvZWZmaWNpZW50CisgICAgICAgICAgICBtYXhEaWFnRW50cnkgPSBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4obWF4RGlhZ0VudHJ5LG51bWV4dDo6bWF4aTxSZWFsU2NhbGFyPihhYnMobV93b3JrTWF0cml4LmNvZWZmKHAscCkpLCBhYnMobV93b3JrTWF0cml4LmNvZWZmKHEscSkpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqKiBzdGVwIDMuIFRoZSB3b3JrIG1hdHJpeCBpcyBub3cgZGlhZ29uYWwsIHNvIGVuc3VyZSBpdCdzIHBvc2l0aXZlIHNvIGl0cyBkaWFnb25hbCBlbnRyaWVzIGFyZSB0aGUgc2luZ3VsYXIgdmFsdWVzICoqKi8KKworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtX2RpYWdTaXplOyArK2kpCisgIHsKKyAgICAvLyBGb3IgYSBjb21wbGV4IG1hdHJpeCwgc29tZSBkaWFnb25hbCBjb2VmZmljaWVudHMgbWlnaHQgbm90ZSBoYXZlIGJlZW4KKyAgICAvLyB0cmVhdGVkIGJ5IHN2ZF9wcmVjb25kaXRpb25fMngyX2Jsb2NrX3RvX2JlX3JlYWwsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQKKyAgICAvLyBvZiBzb21lIGRpYWdvbmFsIGVudHJ5IG1pZ2h0IG5vdCBiZSBudWxsLgorICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgYWJzKG51bWV4dDo6aW1hZyhtX3dvcmtNYXRyaXguY29lZmYoaSxpKSkpPmNvbnNpZGVyQXNaZXJvKQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgYSA9IGFicyhtX3dvcmtNYXRyaXguY29lZmYoaSxpKSk7CisgICAgICBtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKGkpID0gYWJzKGEpOworICAgICAgaWYoY29tcHV0ZVUoKSkgbV9tYXRyaXhVLmNvbChpKSAqPSBtX3dvcmtNYXRyaXguY29lZmYoaSxpKS9hOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gbV93b3JrTWF0cml4LmNvZWZmKGksaSkgaXMgYWxyZWFkeSByZWFsLCBubyBkaWZmaWN1bHR5OgorICAgICAgUmVhbFNjYWxhciBhID0gbnVtZXh0OjpyZWFsKG1fd29ya01hdHJpeC5jb2VmZihpLGkpKTsKKyAgICAgIG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYoaSkgPSBhYnMoYSk7CisgICAgICBpZihjb21wdXRlVSgpICYmIChhPFJlYWxTY2FsYXIoMCkpKSBtX21hdHJpeFUuY29sKGkpID0gLW1fbWF0cml4VS5jb2woaSk7CisgICAgfQorICB9CisgIAorICBtX3Npbmd1bGFyVmFsdWVzICo9IHNjYWxlOworCisgIC8qKiogc3RlcCA0LiBTb3J0IHNpbmd1bGFyIHZhbHVlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIGFuZCBjb21wdXRlIHRoZSBudW1iZXIgb2Ygbm9uemVybyBzaW5ndWxhciB2YWx1ZXMgKioqLworCisgIG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzID0gbV9kaWFnU2l6ZTsKKyAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbV9kaWFnU2l6ZTsgaSsrKQorICB7CisgICAgSW5kZXggcG9zOworICAgIFJlYWxTY2FsYXIgbWF4UmVtYWluaW5nU2luZ3VsYXJWYWx1ZSA9IG1fc2luZ3VsYXJWYWx1ZXMudGFpbChtX2RpYWdTaXplLWkpLm1heENvZWZmKCZwb3MpOworICAgIGlmKG1heFJlbWFpbmluZ1Npbmd1bGFyVmFsdWUgPT0gUmVhbFNjYWxhcigwKSkKKyAgICB7CisgICAgICBtX25vbnplcm9TaW5ndWxhclZhbHVlcyA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYocG9zKQorICAgIHsKKyAgICAgIHBvcyArPSBpOworICAgICAgc3RkOjpzd2FwKG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYoaSksIG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYocG9zKSk7CisgICAgICBpZihjb21wdXRlVSgpKSBtX21hdHJpeFUuY29sKHBvcykuc3dhcChtX21hdHJpeFUuY29sKGkpKTsKKyAgICAgIGlmKGNvbXB1dGVWKCkpIG1fbWF0cml4Vi5jb2wocG9zKS5zd2FwKG1fbWF0cml4Vi5jb2woaSkpOworICAgIH0KKyAgfQorCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxzdmRfbW9kdWxlCisgICoKKyAgKiBccmV0dXJuIHRoZSBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzIGNvbXB1dGVkIGJ5IHR3by1zaWRlZAorICAqIEphY29iaSB0cmFuc2Zvcm1hdGlvbnMuCisgICoKKyAgKiBcc2EgY2xhc3MgSmFjb2JpU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorSmFjb2JpU1ZEPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6amFjb2JpU3ZkKHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpIGNvbnN0Cit7CisgIHJldHVybiBKYWNvYmlTVkQ8UGxhaW5PYmplY3Q+KCp0aGlzLCBjb21wdXRhdGlvbk9wdGlvbnMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSVNWRF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU1ZEL0phY29iaVNWRF9MQVBBQ0tFLmggYi9FaWdlbi9zcmMvU1ZEL0phY29iaVNWRF9MQVBBQ0tFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyNzIxNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TVkQvSmFjb2JpU1ZEX0xBUEFDS0UuaApAQCAtMCwwICsxLDkwIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gTEFQQUNLZQorICogICAgU2luZ3VsYXIgVmFsdWUgRGVjb21wb3NpdGlvbiAtIFNWRC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9KQUNPQklTVkRfTEFQQUNLRV9ICisjZGVmaW5lIEVJR0VOX0pBQ09CSVNWRF9MQVBBQ0tFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBMQVBBQ0tlICovCisKKyNkZWZpbmUgRUlHRU5fTEFQQUNLRV9TVkQoRUlHVFlQRSwgTEFQQUNLRV9UWVBFLCBMQVBBQ0tFX1JUWVBFLCBMQVBBQ0tFX1BSRUZJWCwgRUlHQ09MUk9XLCBMQVBBQ0tFX0NPTFJPVykgXAordGVtcGxhdGU8PiBpbmxpbmUgXAorSmFjb2JpU1ZEPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1csIER5bmFtaWMsIER5bmFtaWM+LCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBcCitKYWNvYmlTVkQ8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4sIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj46OmNvbXB1dGUoY29uc3QgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4mIG1hdHJpeCwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucykgXAoreyBcCisgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsgXAorICAvKnR5cGVkZWYgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsqLyBcCisgIC8qdHlwZWRlZiBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7Ki8gXAorICBhbGxvY2F0ZShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpLCBjb21wdXRhdGlvbk9wdGlvbnMpOyBcCitcCisgIC8qY29uc3QgUmVhbFNjYWxhciBwcmVjaXNpb24gPSBSZWFsU2NhbGFyKDIpICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsqLyBcCisgIG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzID0gbV9kaWFnU2l6ZTsgXAorXAorICBsYXBhY2tfaW50IGxkYSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1hdHJpeC5vdXRlclN0cmlkZSgpKSwgbGR1LCBsZHZ0OyBcCisgIGxhcGFja19pbnQgbWF0cml4X29yZGVyID0gTEFQQUNLRV9DT0xST1c7IFwKKyAgY2hhciBqb2J1LCBqb2J2dDsgXAorICBMQVBBQ0tFX1RZUEUgKnUsICp2dCwgZHVtbXk7IFwKKyAgam9idSAgPSAobV9jb21wdXRlRnVsbFUpID8gJ0EnIDogKG1fY29tcHV0ZVRoaW5VKSA/ICdTJyA6ICdOJzsgXAorICBqb2J2dCA9IChtX2NvbXB1dGVGdWxsVikgPyAnQScgOiAobV9jb21wdXRlVGhpblYpID8gJ1MnIDogJ04nOyBcCisgIGlmIChjb21wdXRlVSgpKSB7IFwKKyAgICBsZHUgID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4obV9tYXRyaXhVLm91dGVyU3RyaWRlKCkpOyBcCisgICAgdSAgICA9IChMQVBBQ0tFX1RZUEUqKW1fbWF0cml4VS5kYXRhKCk7IFwKKyAgfSBlbHNlIHsgbGR1PTE7IHU9JmR1bW15OyB9XAorICBNYXRyaXhUeXBlIGxvY2FsVjsgXAorICBsZHZ0ID0gKG1fY29tcHV0ZUZ1bGxWKSA/IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1fY29scykgOiAobV9jb21wdXRlVGhpblYpID8gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8bGFwYWNrX2ludD4obV9kaWFnU2l6ZSkgOiAxOyBcCisgIGlmIChjb21wdXRlVigpKSB7IFwKKyAgICBsb2NhbFYucmVzaXplKGxkdnQsIG1fY29scyk7IFwKKyAgICB2dCAgID0gKExBUEFDS0VfVFlQRSopbG9jYWxWLmRhdGEoKTsgXAorICB9IGVsc2UgeyBsZHZ0PTE7IHZ0PSZkdW1teTsgfVwKKyAgTWF0cml4PExBUEFDS0VfUlRZUEUsIER5bmFtaWMsIER5bmFtaWM+IHN1cGVyYjsgc3VwZXJiLnJlc2l6ZShtX2RpYWdTaXplLCAxKTsgXAorICBNYXRyaXhUeXBlIG1fdGVtcDsgbV90ZW1wID0gbWF0cml4OyBcCisgIExBUEFDS0VfIyNMQVBBQ0tFX1BSRUZJWCMjZ2VzdmQoIG1hdHJpeF9vcmRlciwgam9idSwgam9idnQsIGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1fcm93cyksIGludGVybmFsOjpjb252ZXJ0X2luZGV4PGxhcGFja19pbnQ+KG1fY29scyksIChMQVBBQ0tFX1RZUEUqKW1fdGVtcC5kYXRhKCksIGxkYSwgKExBUEFDS0VfUlRZUEUqKW1fc2luZ3VsYXJWYWx1ZXMuZGF0YSgpLCB1LCBsZHUsIHZ0LCBsZHZ0LCBzdXBlcmIuZGF0YSgpKTsgXAorICBpZiAoY29tcHV0ZVYoKSkgbV9tYXRyaXhWID0gbG9jYWxWLmFkam9pbnQoKTsgXAorIC8qIGZvcihpbnQgaT0wO2k8bV9kaWFnU2l6ZTtpKyspIGlmIChtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKGkpIDwgcHJlY2lzaW9uKSB7IG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzLS07IG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYoaSk9UmVhbFNjYWxhcigwKTt9Ki8gXAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgIHJldHVybiAqdGhpczsgXAorfQorCitFSUdFTl9MQVBBQ0tFX1NWRChkb3VibGUsICAgZG91YmxlLCAgICAgICAgICAgICAgICBkb3VibGUsIGQsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTEFQQUNLRV9TVkQoZmxvYXQsICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgZmxvYXQgLCBzLCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX0xBUEFDS0VfU1ZEKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIGRvdWJsZSwgeiwgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX1NWRChzY29tcGxleCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQsICBmbG9hdCAsIGMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorCitFSUdFTl9MQVBBQ0tFX1NWRChkb3VibGUsICAgZG91YmxlLCAgICAgICAgICAgICAgICBkb3VibGUsIGQsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTEFQQUNLRV9TVkQoZmxvYXQsICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgZmxvYXQgLCBzLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX0xBUEFDS0VfU1ZEKGRjb21wbGV4LCBsYXBhY2tfY29tcGxleF9kb3VibGUsIGRvdWJsZSwgeiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9MQVBBQ0tFX1NWRChzY29tcGxleCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQsICBmbG9hdCAsIGMsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSVNWRF9MQVBBQ0tFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TVkQvU1ZEQmFzZS5oIGIvRWlnZW4vc3JjL1NWRC9TVkRCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MGEzYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TVkQvU1ZEQmFzZS5oCkBAIC0wLDAgKzEsMzEzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBHYXV0aGllciBCcnVuIDxicnVuLmdhdXRoaWVyQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBOaWNvbGFzIENhcnJlIDxuaWNvbGFzLmNhcnJlQGVuc2ltYWcuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgSmVhbiBDZWNjYXRvIDxqZWFuLmNlY2NhdG9AZW5zaW1hZy5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBQaWVycmUgWm9wcGl0ZWxsaSA8cGllcnJlLnpvcHBpdGVsbGlAZW5zaW1hZy5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1ZEQkFTRV9ICisjZGVmaW5lIEVJR0VOX1NWREJBU0VfSAorCituYW1lc3BhY2UgRWlnZW4geworLyoqIFxpbmdyb3VwIFNWRF9Nb2R1bGUKKyAqCisgKgorICogXGNsYXNzIFNWREJhc2UKKyAqCisgKiBcYnJpZWYgQmFzZSBjbGFzcyBvZiBTVkQgYWxnb3JpdGhtcworICoKKyAqIFx0cGFyYW0gRGVyaXZlZCB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIFNWRCBkZWNvbXBvc2l0aW9uCisgKgorICogU1ZEIGRlY29tcG9zaXRpb24gY29uc2lzdHMgaW4gZGVjb21wb3NpbmcgYW55IG4tYnktcCBtYXRyaXggXGEgQSBhcyBhIHByb2R1Y3QKKyAqICAgXGZbIEEgPSBVIFMgVl4qIFxmXQorICogd2hlcmUgXGEgVSBpcyBhIG4tYnktbiB1bml0YXJ5LCBcYSBWIGlzIGEgcC1ieS1wIHVuaXRhcnksIGFuZCBcYSBTIGlzIGEgbi1ieS1wIHJlYWwgcG9zaXRpdmUgbWF0cml4IHdoaWNoIGlzIHplcm8gb3V0c2lkZSBvZiBpdHMgbWFpbiBkaWFnb25hbDsKKyAqIHRoZSBkaWFnb25hbCBlbnRyaWVzIG9mIFMgYXJlIGtub3duIGFzIHRoZSBcZW0gc2luZ3VsYXIgXGVtIHZhbHVlcyBvZiBcYSBBIGFuZCB0aGUgY29sdW1ucyBvZiBcYSBVIGFuZCBcYSBWIGFyZSBrbm93biBhcyB0aGUgbGVmdAorICogYW5kIHJpZ2h0IFxlbSBzaW5ndWxhciBcZW0gdmVjdG9ycyBvZiBcYSBBIHJlc3BlY3RpdmVseS4KKyAqCisgKiBTaW5ndWxhciB2YWx1ZXMgYXJlIGFsd2F5cyBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlci4KKyAqCisgKiAKKyAqIFlvdSBjYW4gYXNrIGZvciBvbmx5IFxlbSB0aGluIFxhIFUgb3IgXGEgViB0byBiZSBjb21wdXRlZCwgbWVhbmluZyB0aGUgZm9sbG93aW5nLiBJbiBjYXNlIG9mIGEgcmVjdGFuZ3VsYXIgbi1ieS1wIG1hdHJpeCwgbGV0dGluZyBcYSBtIGJlIHRoZQorICogc21hbGxlciB2YWx1ZSBhbW9uZyBcYSBuIGFuZCBcYSBwLCB0aGVyZSBhcmUgb25seSBcYSBtIHNpbmd1bGFyIHZlY3RvcnM7IHRoZSByZW1haW5pbmcgY29sdW1ucyBvZiBcYSBVIGFuZCBcYSBWIGRvIG5vdCBjb3JyZXNwb25kIHRvIGFjdHVhbAorICogc2luZ3VsYXIgdmVjdG9ycy4gQXNraW5nIGZvciBcZW0gdGhpbiBcYSBVIG9yIFxhIFYgbWVhbnMgYXNraW5nIGZvciBvbmx5IHRoZWlyIFxhIG0gZmlyc3QgY29sdW1ucyB0byBiZSBmb3JtZWQuIFNvIFxhIFUgaXMgdGhlbiBhIG4tYnktbSBtYXRyaXgsCisgKiBhbmQgXGEgViBpcyB0aGVuIGEgcC1ieS1tIG1hdHJpeC4gTm90aWNlIHRoYXQgdGhpbiBcYSBVIGFuZCBcYSBWIGFyZSBhbGwgeW91IG5lZWQgZm9yIChsZWFzdCBzcXVhcmVzKSBzb2x2aW5nLgorICogIAorICogSWYgdGhlIGlucHV0IG1hdHJpeCBoYXMgaW5mIG9yIG5hbiBjb2VmZmljaWVudHMsIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIHVuZGVmaW5lZCwgYnV0IHRoZSBjb21wdXRhdGlvbiBpcyBndWFyYW50ZWVkIHRvCisgKiB0ZXJtaW5hdGUgaW4gZmluaXRlIChhbmQgcmVhc29uYWJsZSkgdGltZS4KKyAqIFxzYSBjbGFzcyBCRENTVkQsIGNsYXNzIEphY29iaVNWRAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgU1ZEQmFzZQoreworCitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIERpYWdTaXplQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4RGlhZ1NpemVBdENvbXBpbGVUaW1lID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKE1heFJvd3NBdENvbXBpbGVUaW1lLE1heENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICBNYXRyaXhPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucworICB9OworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhPcHRpb25zLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgTWF0cml4T3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhWVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fZGlhZ190eXBlPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXI+Ojp0eXBlIFNpbmd1bGFyVmFsdWVzVHlwZTsKKyAgCisgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBcYSBVIG1hdHJpeC4KKyAgICoKKyAgICogRm9yIHRoZSBTVkQgZGVjb21wb3NpdGlvbiBvZiBhIG4tYnktcCBtYXRyaXgsIGxldHRpbmcgXGEgbSBiZSB0aGUgbWluaW11bSBvZiBcYSBuIGFuZCBcYSBwLAorICAgKiB0aGUgVSBtYXRyaXggaXMgbi1ieS1uIGlmIHlvdSBhc2tlZCBmb3IgXGxpbmsgRWlnZW46OkNvbXB1dGVGdWxsVSBDb21wdXRlRnVsbFUgXGVuZGxpbmssIGFuZCBpcyBuLWJ5LW0gaWYgeW91IGFza2VkIGZvciBcbGluayBFaWdlbjo6Q29tcHV0ZVRoaW5VIENvbXB1dGVUaGluVSBcZW5kbGluay4KKyAgICoKKyAgICogVGhlIFxhIG0gZmlyc3QgY29sdW1ucyBvZiBcYSBVIGFyZSB0aGUgbGVmdCBzaW5ndWxhciB2ZWN0b3JzIG9mIHRoZSBtYXRyaXggYmVpbmcgZGVjb21wb3NlZC4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgYXNzZXJ0cyB0aGF0IHlvdSBhc2tlZCBmb3IgXGEgVSB0byBiZSBjb21wdXRlZC4KKyAgICovCisgIGNvbnN0IE1hdHJpeFVUeXBlJiBtYXRyaXhVKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNWRCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVVKCkgJiYgIlRoaXMgU1ZEIGRlY29tcG9zaXRpb24gZGlkbid0IGNvbXB1dGUgVS4gRGlkIHlvdSBhc2sgZm9yIGl0PyIpOworICAgIHJldHVybiBtX21hdHJpeFU7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIFxhIFYgbWF0cml4LgorICAgKgorICAgKiBGb3IgdGhlIFNWRCBkZWNvbXBvc2l0aW9uIG9mIGEgbi1ieS1wIG1hdHJpeCwgbGV0dGluZyBcYSBtIGJlIHRoZSBtaW5pbXVtIG9mIFxhIG4gYW5kIFxhIHAsCisgICAqIHRoZSBWIG1hdHJpeCBpcyBwLWJ5LXAgaWYgeW91IGFza2VkIGZvciBcbGluayBFaWdlbjo6Q29tcHV0ZUZ1bGxWIENvbXB1dGVGdWxsViBcZW5kbGluaywgYW5kIGlzIHAtYnktbSBpZiB5b3UgYXNrZWQgZm9yIFxsaW5rIEVpZ2VuOjpDb21wdXRlVGhpblYgQ29tcHV0ZVRoaW5WIFxlbmRsaW5rLgorICAgKgorICAgKiBUaGUgXGEgbSBmaXJzdCBjb2x1bW5zIG9mIFxhIFYgYXJlIHRoZSByaWdodCBzaW5ndWxhciB2ZWN0b3JzIG9mIHRoZSBtYXRyaXggYmVpbmcgZGVjb21wb3NlZC4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgYXNzZXJ0cyB0aGF0IHlvdSBhc2tlZCBmb3IgXGEgViB0byBiZSBjb21wdXRlZC4KKyAgICovCisgIGNvbnN0IE1hdHJpeFZUeXBlJiBtYXRyaXhWKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNWRCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVWKCkgJiYgIlRoaXMgU1ZEIGRlY29tcG9zaXRpb24gZGlkbid0IGNvbXB1dGUgVi4gRGlkIHlvdSBhc2sgZm9yIGl0PyIpOworICAgIHJldHVybiBtX21hdHJpeFY7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIHZlY3RvciBvZiBzaW5ndWxhciB2YWx1ZXMuCisgICAqCisgICAqIEZvciB0aGUgU1ZEIGRlY29tcG9zaXRpb24gb2YgYSBuLWJ5LXAgbWF0cml4LCBsZXR0aW5nIFxhIG0gYmUgdGhlIG1pbmltdW0gb2YgXGEgbiBhbmQgXGEgcCwgdGhlCisgICAqIHJldHVybmVkIHZlY3RvciBoYXMgc2l6ZSBcYSBtLiAgU2luZ3VsYXIgdmFsdWVzIGFyZSBhbHdheXMgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIuCisgICAqLworICBjb25zdCBTaW5ndWxhclZhbHVlc1R5cGUmIHNpbmd1bGFyVmFsdWVzKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNWRCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgcmV0dXJuIG1fc2luZ3VsYXJWYWx1ZXM7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBzaW5ndWxhciB2YWx1ZXMgdGhhdCBhcmUgbm90IGV4YWN0bHkgMCAqLworICBJbmRleCBub256ZXJvU2luZ3VsYXJWYWx1ZXMoKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU1ZEIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gbV9ub256ZXJvU2luZ3VsYXJWYWx1ZXM7CisgIH0KKyAgCisgIC8qKiBccmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIFxjICp0aGlzIGlzIHRoZSBTVkQuCisgICAgKgorICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBzaW5ndWxhciB2YWx1ZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAqLworICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0CisgIHsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJKYWNvYmlTVkQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIGlmKG1fc2luZ3VsYXJWYWx1ZXMuc2l6ZSgpPT0wKSByZXR1cm4gMDsKKyAgICBSZWFsU2NhbGFyIHByZW11bHRpcGxpZWRfdGhyZXNob2xkID0gbnVtZXh0OjptYXhpPFJlYWxTY2FsYXI+KG1fc2luZ3VsYXJWYWx1ZXMuY29lZmYoMCkgKiB0aHJlc2hvbGQoKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSk7CisgICAgSW5kZXggaSA9IG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzLTE7CisgICAgd2hpbGUoaT49MCAmJiBtX3Npbmd1bGFyVmFsdWVzLmNvZWZmKGkpIDwgcHJlbXVsdGlwbGllZF90aHJlc2hvbGQpIC0taTsKKyAgICByZXR1cm4gaSsxOworICB9CisgIAorICAvKiogQWxsb3dzIHRvIHByZXNjcmliZSBhIHRocmVzaG9sZCB0byBiZSB1c2VkIGJ5IGNlcnRhaW4gbWV0aG9kcywgc3VjaCBhcyByYW5rKCkgYW5kIHNvbHZlKCksCisgICAgKiB3aGljaCBuZWVkIHRvIGRldGVybWluZSB3aGVuIHNpbmd1bGFyIHZhbHVlcyBhcmUgdG8gYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICogVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlIFNWRCBkZWNvbXBvc2l0aW9uIGl0c2VsZi4KKyAgICAqCisgICAgKiBXaGVuIGl0IG5lZWRzIHRvIGdldCB0aGUgdGhyZXNob2xkIHZhbHVlLCBFaWdlbiBjYWxscyB0aHJlc2hvbGQoKS4KKyAgICAqIFRoZSBkZWZhdWx0IGlzIFxjIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkKKyAgICAqCisgICAgKiBccGFyYW0gdGhyZXNob2xkIFRoZSBuZXcgdmFsdWUgdG8gdXNlIGFzIHRoZSB0aHJlc2hvbGQuCisgICAgKgorICAgICogQSBzaW5ndWxhciB2YWx1ZSB3aWxsIGJlIGNvbnNpZGVyZWQgbm9uemVybyBpZiBpdHMgdmFsdWUgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuCisgICAgKiAgXGYkIFx2ZXJ0IHNpbmd1bGFyIHZhbHVlIFx2ZXJ0IFxsZXFzbGFudCB0aHJlc2hvbGQgXHRpbWVzIFx2ZXJ0IG1heCBzaW5ndWxhciB2YWx1ZSBcdmVydCBcZiQuCisgICAgKgorICAgICogSWYgeW91IHdhbnQgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBjYWxsIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgICAgKi8KKyAgRGVyaXZlZCYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgeworICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA9IHRydWU7CisgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KKworICAvKiogQWxsb3dzIHRvIGNvbWUgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvciwgbGV0dGluZyBFaWdlbiB1c2UgaXRzIGRlZmF1bHQgZm9ybXVsYSBmb3IKKyAgICAqIGRldGVybWluaW5nIHRoZSB0aHJlc2hvbGQuCisgICAgKgorICAgICogWW91IHNob3VsZCBwYXNzIHRoZSBzcGVjaWFsIG9iamVjdCBFaWdlbjo6RGVmYXVsdCBhcyBwYXJhbWV0ZXIgaGVyZS4KKyAgICAqIFxjb2RlIHN2ZC5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICoKKyAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICovCisgIERlcml2ZWQmIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgIHsKKyAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSBmYWxzZTsKKyAgICByZXR1cm4gZGVyaXZlZCgpOworICB9CisKKyAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMgc3VjaCBhcyByYW5rKCkuCisgICAgKgorICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgKi8KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQoKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCB8fCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQpOworICAgIHJldHVybiBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPyBtX3ByZXNjcmliZWRUaHJlc2hvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHN0ZDo6bWF4PEluZGV4PikoMSxtX2RpYWdTaXplKSpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRydWUgaWYgXGEgVSAoZnVsbCBvciB0aGluKSBpcyBhc2tlZCBmb3IgaW4gdGhpcyBTVkQgZGVjb21wb3NpdGlvbiAqLworICBpbmxpbmUgYm9vbCBjb21wdXRlVSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcHV0ZUZ1bGxVIHx8IG1fY29tcHV0ZVRoaW5VOyB9CisgIC8qKiBccmV0dXJucyB0cnVlIGlmIFxhIFYgKGZ1bGwgb3IgdGhpbikgaXMgYXNrZWQgZm9yIGluIHRoaXMgU1ZEIGRlY29tcG9zaXRpb24gKi8KKyAgaW5saW5lIGJvb2wgY29tcHV0ZVYoKSBjb25zdCB7IHJldHVybiBtX2NvbXB1dGVGdWxsViB8fCBtX2NvbXB1dGVUaGluVjsgfQorCisgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9CisgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9CisgIAorICAvKiogXHJldHVybnMgYSAobGVhc3Qgc3F1YXJlcykgc29sdXRpb24gb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IFNWRCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgKgorICAgICogXHBhcmFtIGIgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXF1YXRpb24gdG8gc29sdmUuCisgICAgKgorICAgICogXG5vdGUgU29sdmluZyByZXF1aXJlcyBib3RoIFUgYW5kIFYgdG8gYmUgY29tcHV0ZWQuIFRoaW4gVSBhbmQgViBhcmUgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkIGZvciBmdWxsIFUgb3IgVi4KKyAgICAqCisgICAgKiBcbm90ZSBTVkQgc29sdmluZyBpcyBpbXBsaWNpdGx5IGxlYXN0LXNxdWFyZXMuIFRodXMsIHRoaXMgbWV0aG9kIHNlcnZlcyBib3RoIHB1cnBvc2VzIG9mIGV4YWN0IHNvbHZpbmcgYW5kIGxlYXN0LXNxdWFyZXMgc29sdmluZy4KKyAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgcmV0dXJuZWQgc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBtaW5pbWl6ZSB0aGUgRXVjbGlkZWFuIG5vcm0gXGYkIFxWZXJ0IEEgeCAtIGIgXFZlcnQgXGYkLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgaW5saW5lIGNvbnN0IFNvbHZlPERlcml2ZWQsIFJocz4KKyAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU1ZEIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICBlaWdlbl9hc3NlcnQoY29tcHV0ZVUoKSAmJiBjb21wdXRlVigpICYmICJTVkQ6OnNvbHZlKCkgcmVxdWlyZXMgYm90aCB1bml0YXJpZXMgVSBhbmQgViB0byBiZSBjb21wdXRlZCAodGhpbiB1bml0YXJpZXMgc3VmZmljZSkuIik7CisgICAgcmV0dXJuIFNvbHZlPERlcml2ZWQsIFJocz4oZGVyaXZlZCgpLCBiLmRlcml2ZWQoKSk7CisgIH0KKyAgCisgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgRHN0VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3Q7CisgICNlbmRpZgorCitwcm90ZWN0ZWQ6CisgIAorICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTk9OX0lOVEVHRVIoU2NhbGFyKTsKKyAgfQorICAKKyAgLy8gcmV0dXJuIHRydWUgaWYgYWxyZWFkeSBhbGxvY2F0ZWQKKyAgYm9vbCBhbGxvY2F0ZShJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKSA7CisKKyAgTWF0cml4VVR5cGUgbV9tYXRyaXhVOworICBNYXRyaXhWVHlwZSBtX21hdHJpeFY7CisgIFNpbmd1bGFyVmFsdWVzVHlwZSBtX3Npbmd1bGFyVmFsdWVzOworICBib29sIG1faXNJbml0aWFsaXplZCwgbV9pc0FsbG9jYXRlZCwgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkOworICBib29sIG1fY29tcHV0ZUZ1bGxVLCBtX2NvbXB1dGVUaGluVTsKKyAgYm9vbCBtX2NvbXB1dGVGdWxsViwgbV9jb21wdXRlVGhpblY7CisgIHVuc2lnbmVkIGludCBtX2NvbXB1dGF0aW9uT3B0aW9uczsKKyAgSW5kZXggbV9ub256ZXJvU2luZ3VsYXJWYWx1ZXMsIG1fcm93cywgbV9jb2xzLCBtX2RpYWdTaXplOworICBSZWFsU2NhbGFyIG1fcHJlc2NyaWJlZFRocmVzaG9sZDsKKworICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3Igb2YgU1ZEQmFzZQorICAgKi8KKyAgU1ZEQmFzZSgpCisgICAgOiBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgbV9pc0FsbG9jYXRlZChmYWxzZSksCisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQoZmFsc2UpLAorICAgICAgbV9jb21wdXRhdGlvbk9wdGlvbnMoMCksCisgICAgICBtX3Jvd3MoLTEpLCBtX2NvbHMoLTEpLCBtX2RpYWdTaXplKDApCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgIH0KKworCit9OworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgRHN0VHlwZT4KK3ZvaWQgU1ZEQmFzZTxEZXJpdmVkPjo6X3NvbHZlX2ltcGwoY29uc3QgUmhzVHlwZSAmcmhzLCBEc3RUeXBlICZkc3QpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyaHMucm93cygpID09IHJvd3MoKSk7CisKKyAgLy8gQSA9IFUgUyBWXioKKyAgLy8gU28gQV57LTF9ID0gViBTXnstMX0gVV4qCisKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgUmhzVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIDAsIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCBSaHNUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gdG1wOworICBJbmRleCBsX3JhbmsgPSByYW5rKCk7CisgIHRtcC5ub2FsaWFzKCkgPSAgbV9tYXRyaXhVLmxlZnRDb2xzKGxfcmFuaykuYWRqb2ludCgpICogcmhzOworICB0bXAgPSBtX3Npbmd1bGFyVmFsdWVzLmhlYWQobF9yYW5rKS5hc0RpYWdvbmFsKCkuaW52ZXJzZSgpICogdG1wOworICBkc3QgPSBtX21hdHJpeFYubGVmdENvbHMobF9yYW5rKSAqIHRtcDsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorYm9vbCBTVkRCYXNlPE1hdHJpeFR5cGU+OjphbGxvY2F0ZShJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKQoreworICBlaWdlbl9hc3NlcnQocm93cyA+PSAwICYmIGNvbHMgPj0gMCk7CisKKyAgaWYgKG1faXNBbGxvY2F0ZWQgJiYKKyAgICAgIHJvd3MgPT0gbV9yb3dzICYmCisgICAgICBjb2xzID09IG1fY29scyAmJgorICAgICAgY29tcHV0YXRpb25PcHRpb25zID09IG1fY29tcHV0YXRpb25PcHRpb25zKQorICB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBtX3Jvd3MgPSByb3dzOworICBtX2NvbHMgPSBjb2xzOworICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgbV9pc0FsbG9jYXRlZCA9IHRydWU7CisgIG1fY29tcHV0YXRpb25PcHRpb25zID0gY29tcHV0YXRpb25PcHRpb25zOworICBtX2NvbXB1dGVGdWxsVSA9IChjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlRnVsbFUpICE9IDA7CisgIG1fY29tcHV0ZVRoaW5VID0gKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVUaGluVSkgIT0gMDsKKyAgbV9jb21wdXRlRnVsbFYgPSAoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZUZ1bGxWKSAhPSAwOworICBtX2NvbXB1dGVUaGluViA9IChjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblYpICE9IDA7CisgIGVpZ2VuX2Fzc2VydCghKG1fY29tcHV0ZUZ1bGxVICYmIG1fY29tcHV0ZVRoaW5VKSAmJiAiU1ZEQmFzZTogeW91IGNhbid0IGFzayBmb3IgYm90aCBmdWxsIGFuZCB0aGluIFUiKTsKKyAgZWlnZW5fYXNzZXJ0KCEobV9jb21wdXRlRnVsbFYgJiYgbV9jb21wdXRlVGhpblYpICYmICJTVkRCYXNlOiB5b3UgY2FuJ3QgYXNrIGZvciBib3RoIGZ1bGwgYW5kIHRoaW4gViIpOworICBlaWdlbl9hc3NlcnQoRUlHRU5fSU1QTElFUyhtX2NvbXB1dGVUaGluVSB8fCBtX2NvbXB1dGVUaGluViwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpICYmCisJICAgICAgICJTVkRCYXNlOiB0aGluIFUgYW5kIFYgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4geW91ciBtYXRyaXggaGFzIGEgZHluYW1pYyBudW1iZXIgb2YgY29sdW1ucy4iKTsKKworICBtX2RpYWdTaXplID0gKHN0ZDo6bWluKShtX3Jvd3MsIG1fY29scyk7CisgIG1fc2luZ3VsYXJWYWx1ZXMucmVzaXplKG1fZGlhZ1NpemUpOworICBpZihSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICBtX21hdHJpeFUucmVzaXplKG1fcm93cywgbV9jb21wdXRlRnVsbFUgPyBtX3Jvd3MgOiBtX2NvbXB1dGVUaGluVSA/IG1fZGlhZ1NpemUgOiAwKTsKKyAgaWYoQ29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgbV9tYXRyaXhWLnJlc2l6ZShtX2NvbHMsIG1fY29tcHV0ZUZ1bGxWID8gbV9jb2xzIDogbV9jb21wdXRlVGhpblYgPyBtX2RpYWdTaXplIDogMCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit9Ly8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gRUlHRU5fU1ZEQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU1ZEL1VwcGVyQmlkaWFnb25hbGl6YXRpb24uaCBiL0VpZ2VuL3NyYy9TVkQvVXBwZXJCaWRpYWdvbmFsaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWM4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU1ZEL1VwcGVyQmlkaWFnb25hbGl6YXRpb24uaApAQCAtMCwwICsxLDQxNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQklESUFHT05BTElaQVRJT05fSAorI2RlZmluZSBFSUdFTl9CSURJQUdPTkFMSVpBVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gVXBwZXJCaWRpYWdvbmFsaXphdGlvbiB3aWxsIHByb2JhYmx5IGJlIHJlcGxhY2VkIGJ5IGEgQmlkaWFnb25hbGl6YXRpb24gY2xhc3MsIGRvbid0IHdhbnQgdG8gbWFrZSBpdCBzdGFibGUgQVBJLgorLy8gQXQgdGhlIHNhbWUgdGltZSwgaXQncyB1c2VmdWwgdG8ga2VlcCBmb3Igbm93IGFzIGl0J3MgYWJvdXQgdGhlIG9ubHkgdGhpbmcgdGhhdCBpcyB0ZXN0aW5nIHRoZSBCYW5kTWF0cml4IGNsYXNzLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgVXBwZXJCaWRpYWdvbmFsaXphdGlvbgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lTWludXNPbmUgPSBpbnRlcm5hbDo6ZGVjcmVtZW50X3NpemU8Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsgLy8vPCBcZGVwcmVjYXRlZCBzaW5jZSBFaWdlbiAzLjMKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIENvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBCYW5kTWF0cml4PFJlYWxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgMSwgMCwgUm93TWFqb3I+IEJpZGlhZ29uYWxUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDE+IERpYWdWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWVNaW51c09uZSwgMT4gU3VwZXJEaWFnVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8CisgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeFR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIERpYWdvbmFsPGNvbnN0IE1hdHJpeFR5cGUsMD46OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlCisgICAgICAgICAgICA+IEhvdXNlaG9sZGVyVVNlcXVlbmNlVHlwZTsKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8CisgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6OkNvbmp1Z2F0ZVJldHVyblR5cGU+Ojp0eXBlLAorICAgICAgICAgICAgICBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlLDE+LAorICAgICAgICAgICAgICBPblRoZVJpZ2h0CisgICAgICAgICAgICA+IEhvdXNlaG9sZGVyVlNlcXVlbmNlVHlwZTsKKyAgICAKKyAgICAvKioKKyAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICoKKyAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBCaWRpYWdvbmFsaXphdGlvbjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgKi8KKyAgICBVcHBlckJpZGlhZ29uYWxpemF0aW9uKCkgOiBtX2hvdXNlaG9sZGVyKCksIG1fYmlkaWFnb25hbCgpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICBleHBsaWNpdCBVcHBlckJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9ob3VzZWhvbGRlcihtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9iaWRpYWdvbmFsKG1hdHJpeC5jb2xzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICBVcHBlckJpZGlhZ29uYWxpemF0aW9uJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgVXBwZXJCaWRpYWdvbmFsaXphdGlvbiYgY29tcHV0ZVVuYmxvY2tlZChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworICAgIAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIGhvdXNlaG9sZGVyKCkgY29uc3QgeyByZXR1cm4gbV9ob3VzZWhvbGRlcjsgfQorICAgIGNvbnN0IEJpZGlhZ29uYWxUeXBlJiBiaWRpYWdvbmFsKCkgY29uc3QgeyByZXR1cm4gbV9iaWRpYWdvbmFsOyB9CisgICAgCisgICAgY29uc3QgSG91c2Vob2xkZXJVU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyVSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVXBwZXJCaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJVU2VxdWVuY2VUeXBlKG1faG91c2Vob2xkZXIsIG1faG91c2Vob2xkZXIuZGlhZ29uYWwoKS5jb25qdWdhdGUoKSk7CisgICAgfQorCisgICAgY29uc3QgSG91c2Vob2xkZXJWU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyVigpIC8vIGNvbnN0IGhlcmUgZ2l2ZXMgbmFzdHkgZXJyb3JzIGFuZCBpJ20gbGF6eQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlVwcGVyQmlkaWFnb25hbGl6YXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIEhvdXNlaG9sZGVyVlNlcXVlbmNlVHlwZShtX2hvdXNlaG9sZGVyLmNvbmp1Z2F0ZSgpLCBtX2hvdXNlaG9sZGVyLmNvbnN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSBkaWFnb25hbDwxPigpKQorICAgICAgICAgICAgIC5zZXRMZW5ndGgobV9ob3VzZWhvbGRlci5jb2xzKCktMSkKKyAgICAgICAgICAgICAuc2V0U2hpZnQoMSk7CisgICAgfQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX2hvdXNlaG9sZGVyOworICAgIEJpZGlhZ29uYWxUeXBlIG1fYmlkaWFnb25hbDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKKy8vIFN0YW5kYXJkIHVwcGVyIGJpZGlhZ29uYWxpemF0aW9uIHdpdGhvdXQgZmFuY3kgb3B0aW1pemF0aW9ucworLy8gVGhpcyB2ZXJzaW9uIHNob3VsZCBiZSBmYXN0ZXIgZm9yIHNtYWxsIG1hdHJpeCBzaXplCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB1cHBlcmJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2VfdW5ibG9ja2VkKE1hdHJpeFR5cGUmIG1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyICpkaWFnb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyICp1cHBlcl9kaWFnb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIqIHRlbXBEYXRhID0gMCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtYXQucm93cygpOworICBJbmRleCBjb2xzID0gbWF0LmNvbHMoKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxLENvbE1ham9yLE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLDE+IFRlbXBUeXBlOworICBUZW1wVHlwZSB0ZW1wVmVjdG9yOworICBpZih0ZW1wRGF0YT09MCkKKyAgeworICAgIHRlbXBWZWN0b3IucmVzaXplKHJvd3MpOworICAgIHRlbXBEYXRhID0gdGVtcFZlY3Rvci5kYXRhKCk7CisgIH0KKworICBmb3IgKEluZGV4IGsgPSAwOyAvKiBicmVha3MgYXQgaz09Y29scy0xIGJlbG93ICovIDsgKytrKQorICB7CisgICAgSW5kZXggcmVtYWluaW5nUm93cyA9IHJvd3MgLSBrOworICAgIEluZGV4IHJlbWFpbmluZ0NvbHMgPSBjb2xzIC0gayAtIDE7CisKKyAgICAvLyBjb25zdHJ1Y3QgbGVmdCBob3VzZWhvbGRlciB0cmFuc2Zvcm0gaW4tcGxhY2UgaW4gQQorICAgIG1hdC5jb2woaykudGFpbChyZW1haW5pbmdSb3dzKQorICAgICAgIC5tYWtlSG91c2Vob2xkZXJJblBsYWNlKG1hdC5jb2VmZlJlZihrLGspLCBkaWFnb25hbFtrXSk7CisgICAgLy8gYXBwbHkgaG91c2Vob2xkZXIgdHJhbnNmb3JtIHRvIHJlbWFpbmluZyBwYXJ0IG9mIEEgb24gdGhlIGxlZnQKKyAgICBtYXQuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nUm93cywgcmVtYWluaW5nQ29scykKKyAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChtYXQuY29sKGspLnRhaWwocmVtYWluaW5nUm93cy0xKSwgbWF0LmNvZWZmKGssayksIHRlbXBEYXRhKTsKKworICAgIGlmKGsgPT0gY29scy0xKSBicmVhazsKKworICAgIC8vIGNvbnN0cnVjdCByaWdodCBob3VzZWhvbGRlciB0cmFuc2Zvcm0gaW4tcGxhY2UgaW4gbWF0CisgICAgbWF0LnJvdyhrKS50YWlsKHJlbWFpbmluZ0NvbHMpCisgICAgICAgLm1ha2VIb3VzZWhvbGRlckluUGxhY2UobWF0LmNvZWZmUmVmKGssaysxKSwgdXBwZXJfZGlhZ29uYWxba10pOworICAgIC8vIGFwcGx5IGhvdXNlaG9sZGVyIHRyYW5zZm9ybSB0byByZW1haW5pbmcgcGFydCBvZiBtYXQgb24gdGhlIGxlZnQKKyAgICBtYXQuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nUm93cy0xLCByZW1haW5pbmdDb2xzKQorICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChtYXQucm93KGspLnRhaWwocmVtYWluaW5nQ29scy0xKS50cmFuc3Bvc2UoKSwgbWF0LmNvZWZmKGssaysxKSwgdGVtcERhdGEpOworICB9Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBIZWxwZXIgcm91dGluZSBmb3IgdGhlIGJsb2NrIHJlZHVjdGlvbiB0byB1cHBlciBiaWRpYWdvbmFsIGZvcm0uCisgICoKKyAgKiBMZXQncyBwYXJ0aXRpb24gdGhlIG1hdHJpeCBBOgorICAqIAorICAqICAgICAgfCBBMDAgQTAxIHwKKyAgKiAgQSA9IHwgICAgICAgICB8CisgICogICAgICB8IEExMCBBMTEgfAorICAqCisgICogVGhpcyBmdW5jdGlvbiByZWR1Y2VzIHRvIGJpZGlhZ29uYWwgZm9ybSB0aGUgbGVmdCBcYyByb3dzIHggXGEgYmxvY2tTaXplIHZlcnRpY2FsIHBhbmVsIFtBMDAvQTEwXQorICAqIGFuZCB0aGUgXGEgYmxvY2tTaXplIHggXGMgY29scyBob3Jpem9udGFsIHBhbmVsIFtBMDAgQTAxXSBvZiB0aGUgbWF0cml4IFxhIEEuIFRoZSBib3R0b20tcmlnaHQgYmxvY2sgQTExCisgICogaXMgdXBkYXRlZCB1c2luZyBtYXRyaXgtbWF0cml4IHByb2R1Y3RzOgorICAqICAgQTIyIC09IFYgKiBZXlQgLSBYICogVV5UCisgICogd2hlcmUgViBhbmQgVSBjb250YWlucyB0aGUgbGVmdCBhbmQgcmlnaHQgSG91c2Vob2xkZXIgdmVjdG9ycy4gVSBhbmQgViBhcmUgc3RvcmVkIGluIEExMCwgYW5kIEEwMQorICAqIHJlc3BlY3RpdmVseSwgYW5kIHRoZSB1cGRhdGUgbWF0cmljZXMgWCBhbmQgWSBhcmUgY29tcHV0ZWQgZHVyaW5nIHRoZSByZWR1Y3Rpb24uCisgICogCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB1cHBlcmJpZGlhZ29uYWxpemF0aW9uX2Jsb2NrZWRfaGVscGVyKE1hdHJpeFR5cGUmIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciAqZGlhZ29uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciAqdXBwZXJfZGlhZ29uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmPE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQ+ID4gWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWY8TWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgRHluYW1pYywgRHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0czxNYXRyaXhUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdD4gPiBZKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6TGl0ZXJhbCBMaXRlcmFsOworICBlbnVtIHsgU3RvcmFnZU9yZGVyID0gdHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0IH07CisgIHR5cGVkZWYgSW5uZXJTdHJpZGU8aW50KFN0b3JhZ2VPcmRlcikgPT0gaW50KENvbE1ham9yKSA/IDEgOiBEeW5hbWljPiBDb2xJbm5lclN0cmlkZTsKKyAgdHlwZWRlZiBJbm5lclN0cmlkZTxpbnQoU3RvcmFnZU9yZGVyKSA9PSBpbnQoQ29sTWFqb3IpID8gRHluYW1pYyA6IDE+IFJvd0lubmVyU3RyaWRlOworICB0eXBlZGVmIFJlZjxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiwgMCwgQ29sSW5uZXJTdHJpZGU+ICAgIFN1YkNvbHVtblR5cGU7CisgIHR5cGVkZWYgUmVmPE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+LCAwLCBSb3dJbm5lclN0cmlkZT4gICAgU3ViUm93VHlwZTsKKyAgdHlwZWRlZiBSZWY8TWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgU3RvcmFnZU9yZGVyID4gPiBTdWJNYXRUeXBlOworICAKKyAgSW5kZXggYnJvd3MgPSBBLnJvd3MoKTsKKyAgSW5kZXggYmNvbHMgPSBBLmNvbHMoKTsKKworICBTY2FsYXIgdGF1X3UsIHRhdV91X3ByZXYoMCksIHRhdV92OworCisgIGZvcihJbmRleCBrID0gMDsgayA8IGJzOyArK2spCisgIHsKKyAgICBJbmRleCByZW1haW5pbmdSb3dzID0gYnJvd3MgLSBrOworICAgIEluZGV4IHJlbWFpbmluZ0NvbHMgPSBiY29scyAtIGsgLSAxOworCisgICAgU3ViTWF0VHlwZSBYX2sxKCBYLmJsb2NrKGssMCwgcmVtYWluaW5nUm93cyxrKSApOworICAgIFN1Yk1hdFR5cGUgVl9rMSggQS5ibG9jayhrLDAsIHJlbWFpbmluZ1Jvd3MsaykgKTsKKworICAgIC8vIDEgLSB1cGRhdGUgdGhlIGstdGggY29sdW1uIG9mIEEKKyAgICBTdWJDb2x1bW5UeXBlIHZfayA9IEEuY29sKGspLnRhaWwocmVtYWluaW5nUm93cyk7CisgICAgICAgICAgdl9rIC09IFZfazEgKiBZLnJvdyhrKS5oZWFkKGspLmFkam9pbnQoKTsKKyAgICBpZihrKSB2X2sgLT0gWF9rMSAqIEEuY29sKGspLmhlYWQoayk7CisgICAgCisgICAgLy8gMiAtIGNvbnN0cnVjdCBsZWZ0IEhvdXNlaG9sZGVyIHRyYW5zZm9ybSBpbi1wbGFjZQorICAgIHZfay5tYWtlSG91c2Vob2xkZXJJblBsYWNlKHRhdV92LCBkaWFnb25hbFtrXSk7CisgICAgICAgCisgICAgaWYoaysxPGJjb2xzKQorICAgIHsKKyAgICAgIFN1Yk1hdFR5cGUgWV9rICAoIFkuYmxvY2soaysxLDAsIHJlbWFpbmluZ0NvbHMsIGsrMSkgKTsKKyAgICAgIFN1Yk1hdFR5cGUgVV9rMSAoIEEuYmxvY2soMCxrKzEsIGsscmVtYWluaW5nQ29scykgKTsKKyAgICAgIAorICAgICAgLy8gdGhpcyBlYXNlcyB0aGUgYXBwbGljYXRpb24gb2YgSG91c2Vob2xkZXIgdHJhbnNmb3JBaW9ucworICAgICAgLy8gQShrLGspIHdpbGwgc3RvcmUgdGF1X3YgbGF0ZXIKKyAgICAgIEEoayxrKSA9IFNjYWxhcigxKTsKKworICAgICAgLy8gMyAtIENvbXB1dGUgeV9rXlQgPSB0YXVfdiAqICggQV5UKnZfayAtIFlfay0xKlZfay0xXlQqdl9rIC0gVV9rLTEqWF9rLTFeVCp2X2sgKQorICAgICAgeworICAgICAgICBTdWJDb2x1bW5UeXBlIHlfayggWS5jb2woaykudGFpbChyZW1haW5pbmdDb2xzKSApOworICAgICAgICAKKyAgICAgICAgLy8gbGV0J3MgdXNlIHRoZSBiZWdpbmluZyBvZiBjb2x1bW4gayBvZiBZIGFzIGEgdGVtcG9yYXJ5IHZlY3RvcgorICAgICAgICBTdWJDb2x1bW5UeXBlIHRtcCggWS5jb2woaykuaGVhZChrKSApOworICAgICAgICB5X2subm9hbGlhcygpICA9IEEuYmxvY2soayxrKzEsIHJlbWFpbmluZ1Jvd3MscmVtYWluaW5nQ29scykuYWRqb2ludCgpICogdl9rOyAvLyBib3R0bGVuZWNrCisgICAgICAgIHRtcC5ub2FsaWFzKCkgID0gVl9rMS5hZGpvaW50KCkgICogdl9rOworICAgICAgICB5X2subm9hbGlhcygpIC09IFlfay5sZWZ0Q29scyhrKSAqIHRtcDsKKyAgICAgICAgdG1wLm5vYWxpYXMoKSAgPSBYX2sxLmFkam9pbnQoKSAgKiB2X2s7CisgICAgICAgIHlfay5ub2FsaWFzKCkgLT0gVV9rMS5hZGpvaW50KCkgICogdG1wOworICAgICAgICB5X2sgKj0gbnVtZXh0Ojpjb25qKHRhdV92KTsKKyAgICAgIH0KKworICAgICAgLy8gNCAtIHVwZGF0ZSBrLXRoIHJvdyBvZiBBIChpdCB3aWxsIGJlY29tZSB1X2spCisgICAgICBTdWJSb3dUeXBlIHVfayggQS5yb3coaykudGFpbChyZW1haW5pbmdDb2xzKSApOworICAgICAgdV9rID0gdV9rLmNvbmp1Z2F0ZSgpOworICAgICAgeworICAgICAgICB1X2sgLT0gWV9rICogQS5yb3coaykuaGVhZChrKzEpLmFkam9pbnQoKTsKKyAgICAgICAgaWYoaykgdV9rIC09IFVfazEuYWRqb2ludCgpICogWC5yb3coaykuaGVhZChrKS5hZGpvaW50KCk7CisgICAgICB9CisKKyAgICAgIC8vIDUgLSBjb25zdHJ1Y3QgcmlnaHQgSG91c2Vob2xkZXIgdHJhbnNmb3JtIGluLXBsYWNlCisgICAgICB1X2subWFrZUhvdXNlaG9sZGVySW5QbGFjZSh0YXVfdSwgdXBwZXJfZGlhZ29uYWxba10pOworCisgICAgICAvLyB0aGlzIGVhc2VzIHRoZSBhcHBsaWNhdGlvbiBvZiBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgIC8vIEEoayxrKzEpIHdpbGwgc3RvcmUgdGF1X3UgbGF0ZXIKKyAgICAgIEEoayxrKzEpID0gU2NhbGFyKDEpOworCisgICAgICAvLyA2IC0gQ29tcHV0ZSB4X2sgPSB0YXVfdSAqICggQSp1X2sgLSBYX2stMSpVX2stMV5UKnVfayAtIFZfaypZX2teVCp1X2sgKQorICAgICAgeworICAgICAgICBTdWJDb2x1bW5UeXBlIHhfayAoIFguY29sKGspLnRhaWwocmVtYWluaW5nUm93cy0xKSApOworICAgICAgICAKKyAgICAgICAgLy8gbGV0J3MgdXNlIHRoZSBiZWdpbmluZyBvZiBjb2x1bW4gayBvZiBYIGFzIGEgdGVtcG9yYXJ5IHZlY3RvcnMKKyAgICAgICAgLy8gbm90ZSB0aGF0IHRtcDAgYW5kIHRtcDEgb3ZlcmxhcHMKKyAgICAgICAgU3ViQ29sdW1uVHlwZSB0bXAwICggWC5jb2woaykuaGVhZChrKSApLAorICAgICAgICAgICAgICAgICAgICAgIHRtcDEgKCBYLmNvbChrKS5oZWFkKGsrMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHhfay5ub2FsaWFzKCkgICA9IEEuYmxvY2soaysxLGsrMSwgcmVtYWluaW5nUm93cy0xLHJlbWFpbmluZ0NvbHMpICogdV9rLnRyYW5zcG9zZSgpOyAvLyBib3R0bGVuZWNrCisgICAgICAgIHRtcDAubm9hbGlhcygpICA9IFVfazEgKiB1X2sudHJhbnNwb3NlKCk7CisgICAgICAgIHhfay5ub2FsaWFzKCkgIC09IFhfazEuYm90dG9tUm93cyhyZW1haW5pbmdSb3dzLTEpICogdG1wMDsKKyAgICAgICAgdG1wMS5ub2FsaWFzKCkgID0gWV9rLmFkam9pbnQoKSAqIHVfay50cmFuc3Bvc2UoKTsKKyAgICAgICAgeF9rLm5vYWxpYXMoKSAgLT0gQS5ibG9jayhrKzEsMCwgcmVtYWluaW5nUm93cy0xLGsrMSkgKiB0bXAxOworICAgICAgICB4X2sgKj0gbnVtZXh0Ojpjb25qKHRhdV91KTsKKyAgICAgICAgdGF1X3UgPSBudW1leHQ6OmNvbmoodGF1X3UpOworICAgICAgICB1X2sgPSB1X2suY29uanVnYXRlKCk7CisgICAgICB9CisKKyAgICAgIGlmKGs+MCkgQS5jb2VmZlJlZihrLTEsaykgPSB0YXVfdV9wcmV2OworICAgICAgdGF1X3VfcHJldiA9IHRhdV91OworICAgIH0KKyAgICBlbHNlCisgICAgICBBLmNvZWZmUmVmKGstMSxrKSA9IHRhdV91X3ByZXY7CisKKyAgICBBLmNvZWZmUmVmKGssaykgPSB0YXVfdjsKKyAgfQorICAKKyAgaWYoYnM8YmNvbHMpCisgICAgQS5jb2VmZlJlZihicy0xLGJzKSA9IHRhdV91X3ByZXY7CisKKyAgLy8gdXBkYXRlIEEyMgorICBpZihiY29scz5icyAmJiBicm93cz5icykKKyAgeworICAgIFN1Yk1hdFR5cGUgQTExKCBBLmJvdHRvbVJpZ2h0Q29ybmVyKGJyb3dzLWJzLGJjb2xzLWJzKSApOworICAgIFN1Yk1hdFR5cGUgQTEwKCBBLmJsb2NrKGJzLDAsIGJyb3dzLWJzLGJzKSApOworICAgIFN1Yk1hdFR5cGUgQTAxKCBBLmJsb2NrKDAsYnMsIGJzLGJjb2xzLWJzKSApOworICAgIFNjYWxhciB0bXAgPSBBMDEoYnMtMSwwKTsKKyAgICBBMDEoYnMtMSwwKSA9IExpdGVyYWwoMSk7CisgICAgQTExLm5vYWxpYXMoKSAtPSBBMTAgKiBZLnRvcExlZnRDb3JuZXIoYmNvbHMsYnMpLmJvdHRvbVJvd3MoYmNvbHMtYnMpLmFkam9pbnQoKTsKKyAgICBBMTEubm9hbGlhcygpIC09IFgudG9wTGVmdENvcm5lcihicm93cyxicykuYm90dG9tUm93cyhicm93cy1icykgKiBBMDE7CisgICAgQTAxKGJzLTEsMCkgPSB0bXA7CisgIH0KK30KKworLyoqIFxpbnRlcm5hbAorICAqCisgICogSW1wbGVtZW50YXRpb24gb2YgYSBibG9jay1iaWRpYWdvbmFsIHJlZHVjdGlvbi4KKyAgKiBJdCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBhcGVyOgorICAqICAgVGhlIERlc2lnbiBvZiBhIFBhcmFsbGVsIERlbnNlIExpbmVhciBBbGdlYnJhIFNvZnR3YXJlIExpYnJhcnk6IFJlZHVjdGlvbiB0byBIZXNzZW5iZXJnLCBUcmlkaWFnb25hbCwgYW5kIEJpZGlhZ29uYWwgRm9ybS4KKyAgKiAgIGJ5IEphZXlvdW5nIENob2ksIEphY2sgSi4gRG9uZ2FycmEsIERhdmlkIFcuIFdhbGtlci4gKDE5OTUpCisgICogICBzZWN0aW9uIDMuMworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQmlkaWFnVHlwZT4KK3ZvaWQgdXBwZXJiaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX2Jsb2NrZWQoTWF0cml4VHlwZSYgQSwgQmlkaWFnVHlwZSYgYmlkaWFnb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggbWF4QmxvY2tTaXplPTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIqIC8qdGVtcERhdGEqLyA9IDApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gQmxvY2tUeXBlOworCisgIEluZGV4IHJvd3MgPSBBLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IEEuY29scygpOworICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKworICAvLyBYIGFuZCBZIGFyZSB3b3JrIHNwYWNlCisgIGVudW0geyBTdG9yYWdlT3JkZXIgPSB0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQgfTsKKyAgTWF0cml4PFNjYWxhciwKKyAgICAgICAgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgRHluYW1pYywKKyAgICAgICAgIFN0b3JhZ2VPcmRlciwKKyAgICAgICAgIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lPiBYKHJvd3MsbWF4QmxvY2tTaXplKTsKKyAgTWF0cml4PFNjYWxhciwKKyAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgRHluYW1pYywKKyAgICAgICAgIFN0b3JhZ2VPcmRlciwKKyAgICAgICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBZKGNvbHMsbWF4QmxvY2tTaXplKTsKKyAgSW5kZXggYmxvY2tTaXplID0gKHN0ZDo6bWluKShtYXhCbG9ja1NpemUsc2l6ZSk7CisKKyAgSW5kZXggayA9IDA7CisgIGZvcihrID0gMDsgayA8IHNpemU7IGsgKz0gYmxvY2tTaXplKQorICB7CisgICAgSW5kZXggYnMgPSAoc3RkOjptaW4pKHNpemUtayxibG9ja1NpemUpOyAgLy8gYWN0dWFsIHNpemUgb2YgdGhlIGJsb2NrCisgICAgSW5kZXggYnJvd3MgPSByb3dzIC0gazsgICAgICAgICAgICAgICAgICAgLy8gcm93cyBvZiB0aGUgYmxvY2sKKyAgICBJbmRleCBiY29scyA9IGNvbHMgLSBrOyAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW5zIG9mIHRoZSBibG9jaworCisgICAgLy8gcGFydGl0aW9uIHRoZSBtYXRyaXggQToKKyAgICAvLyAKKyAgICAvLyAgICAgIHwgQTAwIEEwMSBBMDIgfAorICAgIC8vICAgICAgfCAgICAgICAgICAgICB8CisgICAgLy8gQSAgPSB8IEExMCBBMTEgQTEyIHwKKyAgICAvLyAgICAgIHwgICAgICAgICAgICAgfAorICAgIC8vICAgICAgfCBBMjAgQTIxIEEyMiB8CisgICAgLy8KKyAgICAvLyB3aGVyZSBBMTEgaXMgYSBicyB4IGJzIGRpYWdvbmFsIGJsb2NrLAorICAgIC8vIGFuZCBsZXQ6CisgICAgLy8gICAgICB8IEExMSBBMTIgfAorICAgIC8vICBCID0gfCAgICAgICAgIHwKKyAgICAvLyAgICAgIHwgQTIxIEEyMiB8CisKKyAgICBCbG9ja1R5cGUgQiA9IEEuYmxvY2soayxrLGJyb3dzLGJjb2xzKTsKKyAgICAKKyAgICAvLyBUaGlzIHN0YWdlIHBlcmZvcm1zIHRoZSBiaWRpYWdvbmFsaXphdGlvbiBvZiBBMTEsIEEyMSwgQTEyLCBhbmQgdXBkYXRpbmcgb2YgQTIyLgorICAgIC8vIEZpbmFsbHksIHRoZSBhbGdvcml0aG0gY29udGludWUgb24gdGhlIHVwZGF0ZWQgQTIyLgorICAgIC8vCisgICAgLy8gSG93ZXZlciwgaWYgQiBpcyB0b28gc21hbGwsIG9yIEEyMiBlbXB0eSwgdGhlbiBsZXQncyB1c2UgYW4gdW5ibG9ja2VkIHN0cmF0ZWd5CisgICAgaWYoayticz09Y29scyB8fCBiY29sczw0OCkgLy8gc29tZXdoYXQgYXJiaXRyYXJ5IHRocmVzaG9sZAorICAgIHsKKyAgICAgIHVwcGVyYmlkaWFnb25hbGl6YXRpb25faW5wbGFjZV91bmJsb2NrZWQoQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihiaWRpYWdvbmFsLnRlbXBsYXRlIGRpYWdvbmFsPDA+KCkuY29lZmZSZWYoaykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGJpZGlhZ29uYWwudGVtcGxhdGUgZGlhZ29uYWw8MT4oKS5jb2VmZlJlZihrKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFguZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIGJyZWFrOyAvLyBXZSdyZSBkb25lCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB1cHBlcmJpZGlhZ29uYWxpemF0aW9uX2Jsb2NrZWRfaGVscGVyPEJsb2NrVHlwZT4oIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoYmlkaWFnb25hbC50ZW1wbGF0ZSBkaWFnb25hbDwwPigpLmNvZWZmUmVmKGspKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihiaWRpYWdvbmFsLnRlbXBsYXRlIGRpYWdvbmFsPDE+KCkuY29lZmZSZWYoaykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWC50b3BMZWZ0Q29ybmVyKGJyb3dzLGJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWS50b3BMZWZ0Q29ybmVyKGJjb2xzLGJzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitVcHBlckJpZGlhZ29uYWxpemF0aW9uPF9NYXRyaXhUeXBlPiYgVXBwZXJCaWRpYWdvbmFsaXphdGlvbjxfTWF0cml4VHlwZT46OmNvbXB1dGVVbmJsb2NrZWQoY29uc3QgX01hdHJpeFR5cGUmIG1hdHJpeCkKK3sKKyAgSW5kZXggcm93cyA9IG1hdHJpeC5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtYXRyaXguY29scygpOworICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbHMpOworCisgIGVpZ2VuX2Fzc2VydChyb3dzID49IGNvbHMgJiYgIlVwcGVyQmlkaWFnb25hbGl6YXRpb24gaXMgb25seSBmb3IgQXJpY2VzIHNhdGlzZnlpbmcgcm93cz49Y29scy4iKTsKKworICBtX2hvdXNlaG9sZGVyID0gbWF0cml4OworCisgIENvbFZlY3RvclR5cGUgdGVtcChyb3dzKTsKKworICB1cHBlcmJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2VfdW5ibG9ja2VkKG1faG91c2Vob2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihtX2JpZGlhZ29uYWwudGVtcGxhdGUgZGlhZ29uYWw8MD4oKS5jb2VmZlJlZigwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihtX2JpZGlhZ29uYWwudGVtcGxhdGUgZGlhZ29uYWw8MT4oKS5jb2VmZlJlZigwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5kYXRhKCkpOworCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitVcHBlckJpZGlhZ29uYWxpemF0aW9uPF9NYXRyaXhUeXBlPiYgVXBwZXJCaWRpYWdvbmFsaXphdGlvbjxfTWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgX01hdHJpeFR5cGUmIG1hdHJpeCkKK3sKKyAgSW5kZXggcm93cyA9IG1hdHJpeC5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtYXRyaXguY29scygpOworICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHJvd3MpOworICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbHMpOworCisgIGVpZ2VuX2Fzc2VydChyb3dzID49IGNvbHMgJiYgIlVwcGVyQmlkaWFnb25hbGl6YXRpb24gaXMgb25seSBmb3IgQXJpY2VzIHNhdGlzZnlpbmcgcm93cz49Y29scy4iKTsKKworICBtX2hvdXNlaG9sZGVyID0gbWF0cml4OworICB1cHBlcmJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2VfYmxvY2tlZChtX2hvdXNlaG9sZGVyLCBtX2JpZGlhZ29uYWwpOworICAgICAgICAgICAgCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIHJldHVybiAqdGhpczsKK30KKworI2lmIDAKKy8qKiBccmV0dXJuIHRoZSBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIEJpZGlhZ29uYWxpemF0aW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgVXBwZXJCaWRpYWdvbmFsaXphdGlvbjx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmJpZGlhZ29uYWxpemF0aW9uKCkgY29uc3QKK3sKKyAgcmV0dXJuIFVwcGVyQmlkaWFnb25hbGl6YXRpb248UGxhaW5PYmplY3Q+KGV2YWwoKSk7Cit9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQklESUFHT05BTElaQVRJT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNob2xlc2t5L1NpbXBsaWNpYWxDaG9sZXNreS5oIGIvRWlnZW4vc3JjL1NwYXJzZUNob2xlc2t5L1NpbXBsaWNpYWxDaG9sZXNreS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDdmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ2hvbGVza3kvU2ltcGxpY2lhbENob2xlc2t5LmgKQEAgLTAsMCArMSw2ODkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NJTVBMSUNJQUxfQ0hPTEVTS1lfSAorI2RlZmluZSBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK2VudW0gU2ltcGxpY2lhbENob2xlc2t5TW9kZSB7CisgIFNpbXBsaWNpYWxDaG9sZXNreUxMVCwKKyAgU2ltcGxpY2lhbENob2xlc2t5TERMVAorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hvbE1hdHJpeFR5cGUsIHR5cGVuYW1lIElucHV0TWF0cml4VHlwZT4KKyAgc3RydWN0IHNpbXBsaWNpYWxfY2hvbGVza3lfZ3JhYl9pbnB1dCB7CisgICAgdHlwZWRlZiBDaG9sTWF0cml4VHlwZSBjb25zdCAqIENvbnN0Q2hvbE1hdHJpeFB0cjsKKyAgICBzdGF0aWMgdm9pZCBydW4oY29uc3QgSW5wdXRNYXRyaXhUeXBlJiBpbnB1dCwgQ29uc3RDaG9sTWF0cml4UHRyICZwbWF0LCBDaG9sTWF0cml4VHlwZSAmdG1wKQorICAgIHsKKyAgICAgIHRtcCA9IGlucHV0OworICAgICAgcG1hdCA9ICZ0bXA7CisgICAgfQorICB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgc3RydWN0IHNpbXBsaWNpYWxfY2hvbGVza3lfZ3JhYl9pbnB1dDxNYXRyaXhUeXBlLE1hdHJpeFR5cGU+IHsKKyAgICB0eXBlZGVmIE1hdHJpeFR5cGUgY29uc3QgKiBDb25zdE1hdHJpeFB0cjsKKyAgICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgaW5wdXQsIENvbnN0TWF0cml4UHRyICZwbWF0LCBNYXRyaXhUeXBlICYvKnRtcCovKQorICAgIHsKKyAgICAgIHBtYXQgPSAmaW5wdXQ7CisgICAgfQorICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcaW5ncm91cCBTcGFyc2VDaG9sZXNreV9Nb2R1bGUKKyAgKiBcYnJpZWYgQSBiYXNlIGNsYXNzIGZvciBkaXJlY3Qgc3BhcnNlIENob2xlc2t5IGZhY3Rvcml6YXRpb25zCisgICoKKyAgKiBUaGlzIGlzIGEgYmFzZSBjbGFzcyBmb3IgTExeVCBhbmQgTERMXlQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMgb2Ygc3BhcnNlIG1hdHJpY2VzIHRoYXQgYXJlCisgICogc2VsZmFkam9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLiBUaGVzZSBmYWN0b3JpemF0aW9ucyBhbGxvdyBmb3Igc29sdmluZyBBLlggPSBCIHdoZXJlCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKiAKKyAgKiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIGZpbGwtaW4sIGEgc3ltbWV0cmljIHBlcm11dGF0aW9uIFAgaXMgYXBwbGllZCBwcmlvciB0byB0aGUgZmFjdG9yaXphdGlvbgorICAqIHN1Y2ggdGhhdCB0aGUgZmFjdG9yaXplZCBtYXRyaXggaXMgUCBBIFBeLTEuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgdGhlIHR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MsIHRoYXQgaXMgdGhlIGFjdHVhbCBmYWN0b3JpemF0aW9uIHR5cGUuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3lCYXNlIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4KK3sKKyAgICB0eXBlZGVmIFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgICAgCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok9yZGVyaW5nVHlwZSBPcmRlcmluZ1R5cGU7CisgICAgZW51bSB7IFVwTG8gPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpVcExvIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsU3RvcmFnZUluZGV4PiBDaG9sTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIENob2xNYXRyaXhUeXBlIGNvbnN0ICogQ29uc3RDaG9sTWF0cml4UHRyOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICAKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KKyAgICBTaW1wbGljaWFsQ2hvbGVza3lCYXNlKCkKKyAgICAgIDogbV9pbmZvKFN1Y2Nlc3MpLCBtX3NoaWZ0T2Zmc2V0KDApLCBtX3NoaWZ0U2NhbGUoMSkKKyAgICB7fQorCisgICAgZXhwbGljaXQgU2ltcGxpY2lhbENob2xlc2t5QmFzZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IG1faW5mbyhTdWNjZXNzKSwgbV9zaGlmdE9mZnNldCgwKSwgbV9zaGlmdFNjYWxlKDEpCisgICAgeworICAgICAgZGVyaXZlZCgpLmNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+U2ltcGxpY2lhbENob2xlc2t5QmFzZSgpCisgICAgeworICAgIH0KKworICAgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICAKKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHBlcm11dGF0aW9uIFAKKyAgICAgICogXHNhIHBlcm11dGF0aW9uUGludigpICovCisgICAgY29uc3QgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLFN0b3JhZ2VJbmRleD4mIHBlcm11dGF0aW9uUCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9QOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIFBeLTEgb2YgdGhlIHBlcm11dGF0aW9uIFAKKyAgICAgICogXHNhIHBlcm11dGF0aW9uUCgpICovCisgICAgY29uc3QgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLFN0b3JhZ2VJbmRleD4mIHBlcm11dGF0aW9uUGludigpIGNvbnN0CisgICAgeyByZXR1cm4gbV9QaW52OyB9CisKKyAgICAvKiogU2V0cyB0aGUgc2hpZnQgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50cyBkdXJpbmcgdGhlIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uLgorICAgICAgKgorICAgICAgKiBEdXJpbmcgdGhlIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uLCB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgZm9sbG93aW5nIGxpbmVhciBtb2RlbDpcbgorICAgICAgKiBcYyBkX2lpID0gXGEgb2Zmc2V0ICsgXGEgc2NhbGUgKiBcYyBkX2lpCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGlzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiB3aXRoIFxhIG9mZnNldD0wLCBhbmQgXGEgc2NhbGU9MS4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgICAqLworICAgIERlcml2ZWQmIHNldFNoaWZ0KGNvbnN0IFJlYWxTY2FsYXImIG9mZnNldCwgY29uc3QgUmVhbFNjYWxhciYgc2NhbGUgPSAxKQorICAgIHsKKyAgICAgIG1fc2hpZnRPZmZzZXQgPSBvZmZzZXQ7CisgICAgICBtX3NoaWZ0U2NhbGUgPSBzY2FsZTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbT4KKyAgICB2b2lkIGR1bXBNZW1vcnkoU3RyZWFtJiBzKQorICAgIHsKKyAgICAgIGludCB0b3RhbCA9IDA7CisgICAgICBzIDw8ICIgIEw6ICAgICAgICAiIDw8ICgodG90YWwrPShtX21hdHJpeC5jb2xzKCkrMSkgKiBzaXplb2YoaW50KSArIG1fbWF0cml4Lm5vblplcm9zKCkqKHNpemVvZihpbnQpK3NpemVvZihTY2FsYXIpKSkgPj4gMjApIDw8ICJNYiIgPDwgIlxuIjsKKyAgICAgIHMgPDwgIiAgZGlhZzogICAgICIgPDwgKCh0b3RhbCs9bV9kaWFnLnNpemUoKSAqIHNpemVvZihTY2FsYXIpKSA+PiAyMCkgPDwgIk1iIiA8PCAiXG4iOworICAgICAgcyA8PCAiICB0cmVlOiAgICAgIiA8PCAoKHRvdGFsKz1tX3BhcmVudC5zaXplKCkgKiBzaXplb2YoaW50KSkgPj4gMjApIDw8ICJNYiIgPDwgIlxuIjsKKyAgICAgIHMgPDwgIiAgbm9uemVyb3M6ICIgPDwgKCh0b3RhbCs9bV9ub25aZXJvc1BlckNvbC5zaXplKCkgKiBzaXplb2YoaW50KSkgPj4gMjApIDw8ICJNYiIgPDwgIlxuIjsKKyAgICAgIHMgPDwgIiAgcGVybTogICAgICIgPDwgKCh0b3RhbCs9bV9QLnNpemUoKSAqIHNpemVvZihpbnQpKSA+PiAyMCkgPDwgIk1iIiA8PCAiXG4iOworICAgICAgcyA8PCAiICBwZXJtXi0xOiAgIiA8PCAoKHRvdGFsKz1tX1BpbnYuc2l6ZSgpICogc2l6ZW9mKGludCkpID4+IDIwKSA8PCAiTWIiIDw8ICJcbiI7CisgICAgICBzIDw8ICIgIFRPVEFMOiAgICAiIDw8ICh0b3RhbD4+IDIwKSA8PCAiTWIiIDw8ICJcbiI7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iLnJvd3MoKSk7CisKKyAgICAgIGlmKG1faW5mbyE9U3VjY2VzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpZihtX1Auc2l6ZSgpPjApCisgICAgICAgIGRlc3QgPSBtX1AgKiBiOworICAgICAgZWxzZQorICAgICAgICBkZXN0ID0gYjsKKworICAgICAgaWYobV9tYXRyaXgubm9uWmVyb3MoKT4wKSAvLyBvdGhlcndpc2UgTD09SQorICAgICAgICBkZXJpdmVkKCkubWF0cml4TCgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKworICAgICAgaWYobV9kaWFnLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gbV9kaWFnLmFzRGlhZ29uYWwoKS5pbnZlcnNlKCkgKiBkZXN0OworCisgICAgICBpZiAobV9tYXRyaXgubm9uWmVyb3MoKT4wKSAvLyBvdGhlcndpc2UgVT09SQorICAgICAgICBkZXJpdmVkKCkubWF0cml4VSgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKworICAgICAgaWYobV9QLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gbV9QaW52ICogZGVzdDsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4gJmIsIFNwYXJzZU1hdHJpeEJhc2U8RGVzdD4gJmRlc3QpIGNvbnN0CisgICAgeworICAgICAgaW50ZXJuYWw6OnNvbHZlX3NwYXJzZV90aHJvdWdoX2RlbnNlX3BhbmVscyhkZXJpdmVkKCksIGIsIGRlc3QpOworICAgIH0KKworI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIC8qKiBDb21wdXRlcyB0aGUgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4ICovCisgICAgdGVtcGxhdGU8Ym9vbCBEb0xETFQ+CisgICAgdm9pZCBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobWF0cml4LnJvd3MoKT09bWF0cml4LmNvbHMoKSk7CisgICAgICBJbmRleCBzaXplID0gbWF0cml4LmNvbHMoKTsKKyAgICAgIENob2xNYXRyaXhUeXBlIHRtcChzaXplLHNpemUpOworICAgICAgQ29uc3RDaG9sTWF0cml4UHRyIHBtYXQ7CisgICAgICBvcmRlcmluZyhtYXRyaXgsIHBtYXQsIHRtcCk7CisgICAgICBhbmFseXplUGF0dGVybl9wcmVvcmRlcmVkKCpwbWF0LCBEb0xETFQpOworICAgICAgZmFjdG9yaXplX3ByZW9yZGVyZWQ8RG9MRExUPigqcG1hdCk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPGJvb2wgRG9MRExUPgorICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGEpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGEucm93cygpPT1hLmNvbHMoKSk7CisgICAgICBJbmRleCBzaXplID0gYS5jb2xzKCk7CisgICAgICBDaG9sTWF0cml4VHlwZSB0bXAoc2l6ZSxzaXplKTsKKyAgICAgIENvbnN0Q2hvbE1hdHJpeFB0ciBwbWF0OworICAgICAgCisgICAgICBpZihtX1Auc2l6ZSgpPT0wICYmIChVcExvJlVwcGVyKT09VXBwZXIpCisgICAgICB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG9yZGVyaW5nLCB0cnkgdG8gZGlyZWN0bHkgdXNlIHRoZSBpbnB1dCBtYXRyaXggd2l0aG91dCBhbnkgY29weQorICAgICAgICBpbnRlcm5hbDo6c2ltcGxpY2lhbF9jaG9sZXNreV9ncmFiX2lucHV0PENob2xNYXRyaXhUeXBlLE1hdHJpeFR5cGU+OjpydW4oYSwgcG1hdCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdG1wLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSA9IGEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCkudHdpc3RlZEJ5KG1fUCk7CisgICAgICAgIHBtYXQgPSAmdG1wOworICAgICAgfQorICAgICAgCisgICAgICBmYWN0b3JpemVfcHJlb3JkZXJlZDxEb0xETFQ+KCpwbWF0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxib29sIERvTERMVD4KKyAgICB2b2lkIGZhY3Rvcml6ZV9wcmVvcmRlcmVkKGNvbnN0IENob2xNYXRyaXhUeXBlJiBhKTsKKworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgYSwgYm9vbCBkb0xETFQpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGEucm93cygpPT1hLmNvbHMoKSk7CisgICAgICBJbmRleCBzaXplID0gYS5jb2xzKCk7CisgICAgICBDaG9sTWF0cml4VHlwZSB0bXAoc2l6ZSxzaXplKTsKKyAgICAgIENvbnN0Q2hvbE1hdHJpeFB0ciBwbWF0OworICAgICAgb3JkZXJpbmcoYSwgcG1hdCwgdG1wKTsKKyAgICAgIGFuYWx5emVQYXR0ZXJuX3ByZW9yZGVyZWQoKnBtYXQsZG9MRExUKTsKKyAgICB9CisgICAgdm9pZCBhbmFseXplUGF0dGVybl9wcmVvcmRlcmVkKGNvbnN0IENob2xNYXRyaXhUeXBlJiBhLCBib29sIGRvTERMVCk7CisgICAgCisgICAgdm9pZCBvcmRlcmluZyhjb25zdCBNYXRyaXhUeXBlJiBhLCBDb25zdENob2xNYXRyaXhQdHIgJnBtYXQsIENob2xNYXRyaXhUeXBlJiBhcCk7CisKKyAgICAvKioga2VlcHMgb2ZmLWRpYWdvbmFsIGVudHJpZXM7IGRyb3BzIGRpYWdvbmFsIGVudHJpZXMgKi8KKyAgICBzdHJ1Y3Qga2VlcF9kaWFnIHsKKyAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkgKGNvbnN0IEluZGV4JiByb3csIGNvbnN0IEluZGV4JiBjb2wsIGNvbnN0IFNjYWxhciYpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiByb3chPWNvbDsKKyAgICAgIH0KKyAgICB9OworCisgICAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBib29sIG1fYW5hbHlzaXNJc09rOworICAgIAorICAgIENob2xNYXRyaXhUeXBlIG1fbWF0cml4OworICAgIFZlY3RvclR5cGUgbV9kaWFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50cyAoTERMVCBtb2RlKQorICAgIFZlY3RvckkgbV9wYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxpbWluYXRpb24gdHJlZQorICAgIFZlY3RvckkgbV9ub25aZXJvc1BlckNvbDsKKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBtX1A7ICAgICAvLyB0aGUgcGVybXV0YXRpb24KKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBtX1BpbnY7ICAvLyB0aGUgaW52ZXJzZSBwZXJtdXRhdGlvbgorCisgICAgUmVhbFNjYWxhciBtX3NoaWZ0T2Zmc2V0OworICAgIFJlYWxTY2FsYXIgbV9zaGlmdFNjYWxlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyLCB0eXBlbmFtZSBfT3JkZXJpbmcgPSBBTURPcmRlcmluZzx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4PiA+IGNsYXNzIFNpbXBsaWNpYWxMTFQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvID0gTG93ZXIsIHR5cGVuYW1lIF9PcmRlcmluZyA9IEFNRE9yZGVyaW5nPHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXg+ID4gY2xhc3MgU2ltcGxpY2lhbExETFQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvID0gTG93ZXIsIHR5cGVuYW1lIF9PcmRlcmluZyA9IEFNRE9yZGVyaW5nPHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXg+ID4gY2xhc3MgU2ltcGxpY2lhbENob2xlc2t5OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBfT3JkZXJpbmc+IHN0cnVjdCB0cmFpdHM8U2ltcGxpY2lhbExMVDxfTWF0cml4VHlwZSxfVXBMbyxfT3JkZXJpbmc+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIF9PcmRlcmluZyBPcmRlcmluZ1R5cGU7CisgIGVudW0geyBVcExvID0gX1VwTG8gfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCAgICAgICAgICAgICAgICAgICBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3IsIFN0b3JhZ2VJbmRleD4gICAgICAgIENob2xNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PGNvbnN0IENob2xNYXRyaXhUeXBlLCBFaWdlbjo6TG93ZXI+ICBNYXRyaXhMOworICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PGNvbnN0IHR5cGVuYW1lIENob2xNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZSwgRWlnZW46OlVwcGVyPiAgIE1hdHJpeFU7CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4TCBnZXRMKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIE1hdHJpeEwobSk7IH0KKyAgc3RhdGljIGlubGluZSBNYXRyaXhVIGdldFUoY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gTWF0cml4VShtLmFkam9pbnQoKSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLGludCBfVXBMbywgdHlwZW5hbWUgX09yZGVyaW5nPiBzdHJ1Y3QgdHJhaXRzPFNpbXBsaWNpYWxMRExUPF9NYXRyaXhUeXBlLF9VcExvLF9PcmRlcmluZz4gPgoreworICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgX09yZGVyaW5nIE9yZGVyaW5nVHlwZTsKKyAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUluZGV4OworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yLCBTdG9yYWdlSW5kZXg+ICAgICAgICAgICAgQ2hvbE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8Y29uc3QgQ2hvbE1hdHJpeFR5cGUsIEVpZ2VuOjpVbml0TG93ZXI+ICBNYXRyaXhMOworICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PGNvbnN0IHR5cGVuYW1lIENob2xNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZSwgRWlnZW46OlVuaXRVcHBlcj4gTWF0cml4VTsKKyAgc3RhdGljIGlubGluZSBNYXRyaXhMIGdldEwoY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gTWF0cml4TChtKTsgfQorICBzdGF0aWMgaW5saW5lIE1hdHJpeFUgZ2V0VShjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBNYXRyaXhVKG0uYWRqb2ludCgpKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbywgdHlwZW5hbWUgX09yZGVyaW5nPiBzdHJ1Y3QgdHJhaXRzPFNpbXBsaWNpYWxDaG9sZXNreTxfTWF0cml4VHlwZSxfVXBMbyxfT3JkZXJpbmc+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIF9PcmRlcmluZyBPcmRlcmluZ1R5cGU7CisgIGVudW0geyBVcExvID0gX1VwTG8gfTsKK307CisKK30KKworLyoqIFxpbmdyb3VwIFNwYXJzZUNob2xlc2t5X01vZHVsZQorICAqIFxjbGFzcyBTaW1wbGljaWFsTExUCisgICogXGJyaWVmIEEgZGlyZWN0IHNwYXJzZSBMTFQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMKKyAgKgorICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb25zIG9mIHNwYXJzZSBtYXRyaWNlcyB0aGF0IGFyZQorICAqIHNlbGZhZGpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4gVGhlIGZhY3Rvcml6YXRpb24gYWxsb3dzIGZvciBzb2x2aW5nIEEuWCA9IEIgd2hlcmUKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqIAorICAqIEluIG9yZGVyIHRvIHJlZHVjZSB0aGUgZmlsbC1pbiwgYSBzeW1tZXRyaWMgcGVybXV0YXRpb24gUCBpcyBhcHBsaWVkIHByaW9yIHRvIHRoZSBmYWN0b3JpemF0aW9uCisgICogc3VjaCB0aGF0IHRoZSBmYWN0b3JpemVkIG1hdHJpeCBpcyBQIEEgUF4tMS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIKKyAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqIFx0cGFyYW0gX09yZGVyaW5nIFRoZSBvcmRlcmluZyBtZXRob2QgdG8gdXNlLCBlaXRoZXIgQU1ET3JkZXJpbmc8PiBvciBOYXR1cmFsT3JkZXJpbmc8Pi4gRGVmYXVsdCBpcyBBTURPcmRlcmluZzw+CisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsTERMVCwgY2xhc3MgQU1ET3JkZXJpbmcsIGNsYXNzIE5hdHVyYWxPcmRlcmluZworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbywgdHlwZW5hbWUgX09yZGVyaW5nPgorICAgIGNsYXNzIFNpbXBsaWNpYWxMTFQgOiBwdWJsaWMgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsTExUPF9NYXRyaXhUeXBlLF9VcExvLF9PcmRlcmluZz4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgICAgdHlwZWRlZiBTaW1wbGljaWFsQ2hvbGVza3lCYXNlPFNpbXBsaWNpYWxMTFQ+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsSW5kZXg+IENob2xNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFNpbXBsaWNpYWxMTFQ+IFRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6TWF0cml4TCAgTWF0cml4TDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6TWF0cml4VSAgTWF0cml4VTsKK3B1YmxpYzoKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLworICAgIFNpbXBsaWNpYWxMTFQoKSA6IEJhc2UoKSB7fQorICAgIC8qKiBDb25zdHJ1Y3RzIGFuZCBwZXJmb3JtcyB0aGUgTExUIGZhY3Rvcml6YXRpb24gb2YgXGEgbWF0cml4ICovCisgICAgZXhwbGljaXQgU2ltcGxpY2lhbExMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICAgIDogQmFzZShtYXRyaXgpIHt9CisKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZmFjdG9yIEwgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4TCBtYXRyaXhMKCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPayAmJiAiU2ltcGxpY2lhbCBMTFQgbm90IGZhY3Rvcml6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0TChCYXNlOjptX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZhY3RvciBVICg9IExeKikgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4VSBtYXRyaXhVKCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPayAmJiAiU2ltcGxpY2lhbCBMTFQgbm90IGZhY3Rvcml6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0VShCYXNlOjptX21hdHJpeCk7CisgICAgfQorICAgIAorICAgIC8qKiBDb21wdXRlcyB0aGUgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4ICovCisgICAgU2ltcGxpY2lhbExMVCYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgQmFzZTo6dGVtcGxhdGUgY29tcHV0ZTxmYWxzZT4obWF0cml4KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogUGVyZm9ybXMgYSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIG9uIHRoZSBzcGFyY2l0eSBvZiBcYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHNvbHZpbmcgZm9yIHNldmVyYWwgcHJvYmxlbXMgaGF2aW5nIHRoZSBzYW1lIHN0cnVjdHVyZS4KKyAgICAgICoKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgYSkKKyAgICB7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybihhLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGEpCisgICAgeworICAgICAgQmFzZTo6dGVtcGxhdGUgZmFjdG9yaXplPGZhbHNlPihhKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoZSB1bmRlcmx5aW5nIG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IGZhY3Rvcml6YXRpb24gKi8KKyAgICBTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdAorICAgIHsKKyAgICAgIFNjYWxhciBkZXRMID0gQmFzZTo6bV9tYXRyaXguZGlhZ29uYWwoKS5wcm9kKCk7CisgICAgICByZXR1cm4gbnVtZXh0OjphYnMyKGRldEwpOworICAgIH0KK307CisKKy8qKiBcaW5ncm91cCBTcGFyc2VDaG9sZXNreV9Nb2R1bGUKKyAgKiBcY2xhc3MgU2ltcGxpY2lhbExETFQKKyAgKiBcYnJpZWYgQSBkaXJlY3Qgc3BhcnNlIExETFQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMgd2l0aG91dCBzcXVhcmUgcm9vdC4KKyAgKgorICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBMRExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9ucyB3aXRob3V0IHNxdWFyZSByb290IG9mIHNwYXJzZSBtYXRyaWNlcyB0aGF0IGFyZQorICAqIHNlbGZhZGpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4gVGhlIGZhY3Rvcml6YXRpb24gYWxsb3dzIGZvciBzb2x2aW5nIEEuWCA9IEIgd2hlcmUKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqIAorICAqIEluIG9yZGVyIHRvIHJlZHVjZSB0aGUgZmlsbC1pbiwgYSBzeW1tZXRyaWMgcGVybXV0YXRpb24gUCBpcyBhcHBsaWVkIHByaW9yIHRvIHRoZSBmYWN0b3JpemF0aW9uCisgICogc3VjaCB0aGF0IHRoZSBmYWN0b3JpemVkIG1hdHJpeCBpcyBQIEEgUF4tMS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIKKyAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqIFx0cGFyYW0gX09yZGVyaW5nIFRoZSBvcmRlcmluZyBtZXRob2QgdG8gdXNlLCBlaXRoZXIgQU1ET3JkZXJpbmc8PiBvciBOYXR1cmFsT3JkZXJpbmc8Pi4gRGVmYXVsdCBpcyBBTURPcmRlcmluZzw+CisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsTExULCBjbGFzcyBBTURPcmRlcmluZywgY2xhc3MgTmF0dXJhbE9yZGVyaW5nCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBfT3JkZXJpbmc+CisgICAgY2xhc3MgU2ltcGxpY2lhbExETFQgOiBwdWJsaWMgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsTERMVDxfTWF0cml4VHlwZSxfVXBMbyxfT3JkZXJpbmc+ID4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsTERMVD4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+IENob2xNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFNpbXBsaWNpYWxMRExUPiBUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeEwgIE1hdHJpeEw7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeFUgIE1hdHJpeFU7CitwdWJsaWM6CisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KKyAgICBTaW1wbGljaWFsTERMVCgpIDogQmFzZSgpIHt9CisKKyAgICAvKiogQ29uc3RydWN0cyBhbmQgcGVyZm9ybXMgdGhlIExMVCBmYWN0b3JpemF0aW9uIG9mIFxhIG1hdHJpeCAqLworICAgIGV4cGxpY2l0IFNpbXBsaWNpYWxMRExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgICAgOiBCYXNlKG1hdHJpeCkge30KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBkaWFnb25hbCBEICovCisgICAgaW5saW5lIGNvbnN0IFZlY3RvclR5cGUgdmVjdG9yRCgpIGNvbnN0IHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KEJhc2U6Om1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlNpbXBsaWNpYWwgTERMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gQmFzZTo6bV9kaWFnOworICAgIH0KKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZmFjdG9yIEwgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4TCBtYXRyaXhMKCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPayAmJiAiU2ltcGxpY2lhbCBMRExUIG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBUcmFpdHM6OmdldEwoQmFzZTo6bV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBmYWN0b3IgVSAoPSBMXiopICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFUgbWF0cml4VSgpIGNvbnN0IHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KEJhc2U6Om1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlNpbXBsaWNpYWwgTERMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gVHJhaXRzOjpnZXRVKEJhc2U6Om1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIHNwYXJzZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeCAqLworICAgIFNpbXBsaWNpYWxMRExUJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBCYXNlOjp0ZW1wbGF0ZSBjb21wdXRlPHRydWU+KG1hdHJpeCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKGEsIHRydWUpOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIG51bWVyaWMgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhlIGdpdmVuIG1hdHJpeCBtdXN0IGhhcyB0aGUgc2FtZSBzcGFyY2l0eSB0aGFuIHRoZSBtYXRyaXggb24gd2hpY2ggdGhlIHN5bWJvbGljIGRlY29tcG9zaXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgorICAgICAgKgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgKi8KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIGZhY3Rvcml6ZTx0cnVlPihhKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoZSB1bmRlcmx5aW5nIG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IGZhY3Rvcml6YXRpb24gKi8KKyAgICBTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjptX2RpYWcucHJvZCgpOworICAgIH0KK307CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgU2ltcGxpY2lhbExETFQgb3IgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqIFxpbmdyb3VwIFNwYXJzZUNob2xlc2t5X01vZHVsZQorICAqIFxjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3kKKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsTERMVCwgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbywgdHlwZW5hbWUgX09yZGVyaW5nPgorICAgIGNsYXNzIFNpbXBsaWNpYWxDaG9sZXNreSA6IHB1YmxpYyBTaW1wbGljaWFsQ2hvbGVza3lCYXNlPFNpbXBsaWNpYWxDaG9sZXNreTxfTWF0cml4VHlwZSxfVXBMbyxfT3JkZXJpbmc+ID4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsQ2hvbGVza3k+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsU3RvcmFnZUluZGV4PiBDaG9sTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxTaW1wbGljaWFsQ2hvbGVza3k+IFRyYWl0czsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8U2ltcGxpY2lhbExETFQ8TWF0cml4VHlwZSxVcExvPiA+IExETFRUcmFpdHM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFNpbXBsaWNpYWxMTFQ8TWF0cml4VHlwZSxVcExvPiAgPiBMTFRUcmFpdHM7CisgIHB1YmxpYzoKKyAgICBTaW1wbGljaWFsQ2hvbGVza3koKSA6IEJhc2UoKSwgbV9MRExUKHRydWUpIHt9CisKKyAgICBleHBsaWNpdCBTaW1wbGljaWFsQ2hvbGVza3koY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBCYXNlKCksIG1fTERMVCh0cnVlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICBTaW1wbGljaWFsQ2hvbGVza3kmIHNldE1vZGUoU2ltcGxpY2lhbENob2xlc2t5TW9kZSBtb2RlKQorICAgIHsKKyAgICAgIHN3aXRjaChtb2RlKQorICAgICAgeworICAgICAgY2FzZSBTaW1wbGljaWFsQ2hvbGVza3lMTFQ6CisgICAgICAgIG1fTERMVCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU2ltcGxpY2lhbENob2xlc2t5TERMVDoKKyAgICAgICAgbV9MRExUID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBWZWN0b3JUeXBlIHZlY3RvckQoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIENob2xlc2t5IG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBCYXNlOjptX2RpYWc7CisgICAgfQorICAgIGlubGluZSBjb25zdCBDaG9sTWF0cml4VHlwZSByYXdNYXRyaXgoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIENob2xlc2t5IG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBCYXNlOjptX21hdHJpeDsKKyAgICB9CisgICAgCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICBTaW1wbGljaWFsQ2hvbGVza3kmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGlmKG1fTERMVCkKKyAgICAgICAgQmFzZTo6dGVtcGxhdGUgY29tcHV0ZTx0cnVlPihtYXRyaXgpOworICAgICAgZWxzZQorICAgICAgICBCYXNlOjp0ZW1wbGF0ZSBjb21wdXRlPGZhbHNlPihtYXRyaXgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKGEsIG1fTERMVCk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGEpCisgICAgeworICAgICAgaWYobV9MRExUKQorICAgICAgICBCYXNlOjp0ZW1wbGF0ZSBmYWN0b3JpemU8dHJ1ZT4oYSk7CisgICAgICBlbHNlCisgICAgICAgIEJhc2U6OnRlbXBsYXRlIGZhY3Rvcml6ZTxmYWxzZT4oYSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9tYXRyaXgucm93cygpPT1iLnJvd3MoKSk7CisKKyAgICAgIGlmKEJhc2U6Om1faW5mbyE9U3VjY2VzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpZihCYXNlOjptX1Auc2l6ZSgpPjApCisgICAgICAgIGRlc3QgPSBCYXNlOjptX1AgKiBiOworICAgICAgZWxzZQorICAgICAgICBkZXN0ID0gYjsKKworICAgICAgaWYoQmFzZTo6bV9tYXRyaXgubm9uWmVyb3MoKT4wKSAvLyBvdGhlcndpc2UgTD09SQorICAgICAgeworICAgICAgICBpZihtX0xETFQpCisgICAgICAgICAgTERMVFRyYWl0czo6Z2V0TChCYXNlOjptX21hdHJpeCkuc29sdmVJblBsYWNlKGRlc3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgTExUVHJhaXRzOjpnZXRMKEJhc2U6Om1fbWF0cml4KS5zb2x2ZUluUGxhY2UoZGVzdCk7CisgICAgICB9CisKKyAgICAgIGlmKEJhc2U6Om1fZGlhZy5zaXplKCk+MCkKKyAgICAgICAgZGVzdCA9IEJhc2U6Om1fZGlhZy5hc0RpYWdvbmFsKCkuaW52ZXJzZSgpICogZGVzdDsKKworICAgICAgaWYgKEJhc2U6Om1fbWF0cml4Lm5vblplcm9zKCk+MCkgLy8gb3RoZXJ3aXNlIEk9PUkKKyAgICAgIHsKKyAgICAgICAgaWYobV9MRExUKQorICAgICAgICAgIExETFRUcmFpdHM6OmdldFUoQmFzZTo6bV9tYXRyaXgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIExMVFRyYWl0czo6Z2V0VShCYXNlOjptX21hdHJpeCkuc29sdmVJblBsYWNlKGRlc3QpOworICAgICAgfQorCisgICAgICBpZihCYXNlOjptX1Auc2l6ZSgpPjApCisgICAgICAgIGRlc3QgPSBCYXNlOjptX1BpbnYgKiBkZXN0OworICAgIH0KKyAgICAKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4gJmIsIFNwYXJzZU1hdHJpeEJhc2U8RGVzdD4gJmRlc3QpIGNvbnN0CisgICAgeworICAgICAgaW50ZXJuYWw6OnNvbHZlX3NwYXJzZV90aHJvdWdoX2RlbnNlX3BhbmVscygqdGhpcywgYiwgZGVzdCk7CisgICAgfQorICAgIAorICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0CisgICAgeworICAgICAgaWYobV9MRExUKQorICAgICAgeworICAgICAgICByZXR1cm4gQmFzZTo6bV9kaWFnLnByb2QoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIGRldEwgPSBEaWFnb25hbDxjb25zdCBDaG9sTWF0cml4VHlwZT4oQmFzZTo6bV9tYXRyaXgpLnByb2QoKTsKKyAgICAgICAgcmV0dXJuIG51bWV4dDo6YWJzMihkZXRMKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBib29sIG1fTERMVDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIFNpbXBsaWNpYWxDaG9sZXNreUJhc2U8RGVyaXZlZD46Om9yZGVyaW5nKGNvbnN0IE1hdHJpeFR5cGUmIGEsIENvbnN0Q2hvbE1hdHJpeFB0ciAmcG1hdCwgQ2hvbE1hdHJpeFR5cGUmIGFwKQoreworICBlaWdlbl9hc3NlcnQoYS5yb3dzKCk9PWEuY29scygpKTsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IGEucm93cygpOworICBwbWF0ID0gJmFwOworICAvLyBOb3RlIHRoYXQgb3JkZXJpbmcgbWV0aG9kcyBjb21wdXRlIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uCisgIGlmKCFpbnRlcm5hbDo6aXNfc2FtZTxPcmRlcmluZ1R5cGUsTmF0dXJhbE9yZGVyaW5nPEluZGV4PiA+Ojp2YWx1ZSkKKyAgeworICAgIHsKKyAgICAgIENob2xNYXRyaXhUeXBlIEM7CisgICAgICBDID0gYS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKTsKKyAgICAgIAorICAgICAgT3JkZXJpbmdUeXBlIG9yZGVyaW5nOworICAgICAgb3JkZXJpbmcoQyxtX1BpbnYpOworICAgIH0KKworICAgIGlmKG1fUGludi5zaXplKCk+MCkgbV9QID0gbV9QaW52LmludmVyc2UoKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIG1fUC5yZXNpemUoMCk7CisgICAgCisgICAgYXAucmVzaXplKHNpemUsc2l6ZSk7CisgICAgYXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gYS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKS50d2lzdGVkQnkobV9QKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtX1BpbnYucmVzaXplKDApOworICAgIG1fUC5yZXNpemUoMCk7CisgICAgaWYoaW50KFVwTG8pPT1pbnQoTG93ZXIpIHx8IE1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgeworICAgICAgLy8gd2UgaGF2ZSB0byB0cmFuc3Bvc2UgdGhlIGxvd2VyIHBhcnQgdG8gdG8gdGhlIHVwcGVyIG9uZQorICAgICAgYXAucmVzaXplKHNpemUsc2l6ZSk7CisgICAgICBhcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBhLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpOworICAgIH0KKyAgICBlbHNlCisgICAgICBpbnRlcm5hbDo6c2ltcGxpY2lhbF9jaG9sZXNreV9ncmFiX2lucHV0PENob2xNYXRyaXhUeXBlLE1hdHJpeFR5cGU+OjpydW4oYSwgcG1hdCwgYXApOworICB9ICAKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDaG9sZXNreS9TaW1wbGljaWFsQ2hvbGVza3lfaW1wbC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNob2xlc2t5L1NpbXBsaWNpYWxDaG9sZXNreV9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlMDY5OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDaG9sZXNreS9TaW1wbGljaWFsQ2hvbGVza3lfaW1wbC5oCkBAIC0wLDAgKzEsMTk5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorCisvKgorCitOT1RFOiB0aGVzIGZ1bmN0aW9ucyB2YXZlIGJlZW4gYWRhcHRlZCBmcm9tIHRoZSBMREwgbGlicmFyeToKKworTERMIENvcHlyaWdodCAoYykgMjAwNSBieSBUaW1vdGh5IEEuIERhdmlzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTERMIExpY2Vuc2U6CisKKyAgICBZb3VyIHVzZSBvciBkaXN0cmlidXRpb24gb2YgTERMIG9yIGFueSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgICAgTERMIGltcGxpZXMgdGhhdCB5b3UgYWdyZWUgdG8gdGhpcyBMaWNlbnNlLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEKKyAgICBVU0EKKworICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgcHJvdmlkZWQgdGhhdCB0aGUgQ29weXJpZ2h0LCB0aGlzIExpY2Vuc2UsCisgICAgYW5kIHRoZSBBdmFpbGFiaWxpdHkgb2YgdGhlIG9yaWdpbmFsIHZlcnNpb24gaXMgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAgICBVc2VyIGRvY3VtZW50YXRpb24gb2YgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgY29kZSBvciBhbnkgbW9kaWZpZWQKKyAgICB2ZXJzaW9uIG9mIHRoaXMgY29kZSBtdXN0IGNpdGUgdGhlIENvcHlyaWdodCwgdGhpcyBMaWNlbnNlLCB0aGUKKyAgICBBdmFpbGFiaWxpdHkgbm90ZSwgYW5kICJVc2VkIGJ5IHBlcm1pc3Npb24uIiBQZXJtaXNzaW9uIHRvIG1vZGlmeQorICAgIHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhlCisgICAgQ29weXJpZ2h0LCB0aGlzIExpY2Vuc2UsIGFuZCB0aGUgQXZhaWxhYmlsaXR5IG5vdGUgYXJlIHJldGFpbmVkLAorICAgIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZC4KKyAqLworCisjaW5jbHVkZSAiLi4vQ29yZS91dGlsL05vbk1QTDIuaCIKKworI2lmbmRlZiBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0lNUExfSAorI2RlZmluZSBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0lNUExfSAorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBTaW1wbGljaWFsQ2hvbGVza3lCYXNlPERlcml2ZWQ+OjphbmFseXplUGF0dGVybl9wcmVvcmRlcmVkKGNvbnN0IENob2xNYXRyaXhUeXBlJiBhcCwgYm9vbCBkb0xETFQpCit7CisgIGNvbnN0IFN0b3JhZ2VJbmRleCBzaXplID0gU3RvcmFnZUluZGV4KGFwLnJvd3MoKSk7CisgIG1fbWF0cml4LnJlc2l6ZShzaXplLCBzaXplKTsKKyAgbV9wYXJlbnQucmVzaXplKHNpemUpOworICBtX25vblplcm9zUGVyQ29sLnJlc2l6ZShzaXplKTsKKworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU3RvcmFnZUluZGV4LCB0YWdzLCBzaXplLCAwKTsKKworICBmb3IoU3RvcmFnZUluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICB7CisgICAgLyogTChrLDopIHBhdHRlcm46IGFsbCBub2RlcyByZWFjaGFibGUgaW4gZXRyZWUgZnJvbSBueiBpbiBBKDA6ay0xLGspICovCisgICAgbV9wYXJlbnRba10gPSAtMTsgICAgICAgICAgICAgLyogcGFyZW50IG9mIGsgaXMgbm90IHlldCBrbm93biAqLworICAgIHRhZ3Nba10gPSBrOyAgICAgICAgICAgICAgICAgIC8qIG1hcmsgbm9kZSBrIGFzIHZpc2l0ZWQgKi8KKyAgICBtX25vblplcm9zUGVyQ29sW2tdID0gMDsgICAgICAvKiBjb3VudCBvZiBub256ZXJvcyBpbiBjb2x1bW4gayBvZiBMICovCisgICAgZm9yKHR5cGVuYW1lIENob2xNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KGFwLGspOyBpdDsgKytpdCkKKyAgICB7CisgICAgICBTdG9yYWdlSW5kZXggaSA9IGl0LmluZGV4KCk7CisgICAgICBpZihpIDwgaykKKyAgICAgIHsKKyAgICAgICAgLyogZm9sbG93IHBhdGggZnJvbSBpIHRvIHJvb3Qgb2YgZXRyZWUsIHN0b3AgYXQgZmxhZ2dlZCBub2RlICovCisgICAgICAgIGZvcig7IHRhZ3NbaV0gIT0gazsgaSA9IG1fcGFyZW50W2ldKQorICAgICAgICB7CisgICAgICAgICAgLyogZmluZCBwYXJlbnQgb2YgaSBpZiBub3QgeWV0IGRldGVybWluZWQgKi8KKyAgICAgICAgICBpZiAobV9wYXJlbnRbaV0gPT0gLTEpCisgICAgICAgICAgICBtX3BhcmVudFtpXSA9IGs7CisgICAgICAgICAgbV9ub25aZXJvc1BlckNvbFtpXSsrOyAgICAgICAgLyogTCAoayxpKSBpcyBub256ZXJvICovCisgICAgICAgICAgdGFnc1tpXSA9IGs7ICAgICAgICAgICAgICAgICAgLyogbWFyayBpIGFzIHZpc2l0ZWQgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGNvbnN0cnVjdCBMcCBpbmRleCBhcnJheSBmcm9tIG1fbm9uWmVyb3NQZXJDb2wgY29sdW1uIGNvdW50cyAqLworICBTdG9yYWdlSW5kZXgqIExwID0gbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpOworICBMcFswXSA9IDA7CisgIGZvcihTdG9yYWdlSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgICAgTHBbaysxXSA9IExwW2tdICsgbV9ub25aZXJvc1BlckNvbFtrXSArIChkb0xETFQgPyAwIDogMSk7CisKKyAgbV9tYXRyaXgucmVzaXplTm9uWmVyb3MoTHBbc2l6ZV0pOworCisgIG1faXNJbml0aWFsaXplZCAgICAgPSB0cnVlOworICBtX2luZm8gICAgICAgICAgICAgID0gU3VjY2VzczsKKyAgbV9hbmFseXNpc0lzT2sgICAgICA9IHRydWU7CisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8Ym9vbCBEb0xETFQ+Cit2b2lkIFNpbXBsaWNpYWxDaG9sZXNreUJhc2U8RGVyaXZlZD46OmZhY3Rvcml6ZV9wcmVvcmRlcmVkKGNvbnN0IENob2xNYXRyaXhUeXBlJiBhcCkKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworCisgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiWW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgIGVpZ2VuX2Fzc2VydChhcC5yb3dzKCk9PWFwLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChtX3BhcmVudC5zaXplKCk9PWFwLnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydChtX25vblplcm9zUGVyQ29sLnNpemUoKT09YXAucm93cygpKTsKKworICBjb25zdCBTdG9yYWdlSW5kZXggc2l6ZSA9IFN0b3JhZ2VJbmRleChhcC5yb3dzKCkpOworICBjb25zdCBTdG9yYWdlSW5kZXgqIExwID0gbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpOworICBTdG9yYWdlSW5kZXgqIExpID0gbV9tYXRyaXguaW5uZXJJbmRleFB0cigpOworICBTY2FsYXIqIEx4ID0gbV9tYXRyaXgudmFsdWVQdHIoKTsKKworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCB5LCBzaXplLCAwKTsKKyAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFN0b3JhZ2VJbmRleCwgIHBhdHRlcm4sIHNpemUsIDApOworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU3RvcmFnZUluZGV4LCAgdGFncywgc2l6ZSwgMCk7CisKKyAgYm9vbCBvayA9IHRydWU7CisgIG1fZGlhZy5yZXNpemUoRG9MRExUID8gc2l6ZSA6IDApOworCisgIGZvcihTdG9yYWdlSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgIHsKKyAgICAvLyBjb21wdXRlIG5vbnplcm8gcGF0dGVybiBvZiBrdGggcm93IG9mIEwsIGluIHRvcG9sb2dpY2FsIG9yZGVyCisgICAgeVtrXSA9IDAuMDsgICAgICAgICAgICAgICAgICAgICAvLyBZKDA6aykgaXMgbm93IGFsbCB6ZXJvCisgICAgU3RvcmFnZUluZGV4IHRvcCA9IHNpemU7ICAgICAgICAgICAgICAgLy8gc3RhY2sgZm9yIHBhdHRlcm4gaXMgZW1wdHkKKyAgICB0YWdzW2tdID0gazsgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgbm9kZSBrIGFzIHZpc2l0ZWQKKyAgICBtX25vblplcm9zUGVyQ29sW2tdID0gMDsgICAgICAgIC8vIGNvdW50IG9mIG5vbnplcm9zIGluIGNvbHVtbiBrIG9mIEwKKyAgICBmb3IodHlwZW5hbWUgQ2hvbE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQoYXAsayk7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIGlmKGkgPD0gaykKKyAgICAgIHsKKyAgICAgICAgeVtpXSArPSBudW1leHQ6OmNvbmooaXQudmFsdWUoKSk7ICAgICAgICAgICAgLyogc2NhdHRlciBBKGksaykgaW50byBZIChzdW0gZHVwbGljYXRlcykgKi8KKyAgICAgICAgSW5kZXggbGVuOworICAgICAgICBmb3IobGVuID0gMDsgdGFnc1tpXSAhPSBrOyBpID0gbV9wYXJlbnRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBwYXR0ZXJuW2xlbisrXSA9IGk7ICAgICAvKiBMKGssaSkgaXMgbm9uemVybyAqLworICAgICAgICAgIHRhZ3NbaV0gPSBrOyAgICAgICAgICAgIC8qIG1hcmsgaSBhcyB2aXNpdGVkICovCisgICAgICAgIH0KKyAgICAgICAgd2hpbGUobGVuID4gMCkKKyAgICAgICAgICBwYXR0ZXJuWy0tdG9wXSA9IHBhdHRlcm5bLS1sZW5dOworICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbXB1dGUgbnVtZXJpY2FsIHZhbHVlcyBrdGggcm93IG9mIEwgKGEgc3BhcnNlIHRyaWFuZ3VsYXIgc29sdmUpICovCisKKyAgICBSZWFsU2NhbGFyIGQgPSBudW1leHQ6OnJlYWwoeVtrXSkgKiBtX3NoaWZ0U2NhbGUgKyBtX3NoaWZ0T2Zmc2V0OyAgICAvLyBnZXQgRChrLGspLCBhcHBseSB0aGUgc2hpZnQgZnVuY3Rpb24sIGFuZCBjbGVhciBZKGspCisgICAgeVtrXSA9IDAuMDsKKyAgICBmb3IoOyB0b3AgPCBzaXplOyArK3RvcCkKKyAgICB7CisgICAgICBJbmRleCBpID0gcGF0dGVyblt0b3BdOyAgICAgICAvKiBwYXR0ZXJuW3RvcDpuLTFdIGlzIHBhdHRlcm4gb2YgTCg6LGspICovCisgICAgICBTY2FsYXIgeWkgPSB5W2ldOyAgICAgICAgICAgICAvKiBnZXQgYW5kIGNsZWFyIFkoaSkgKi8KKyAgICAgIHlbaV0gPSAwLjA7CisKKyAgICAgIC8qIHRoZSBub256ZXJvIGVudHJ5IEwoayxpKSAqLworICAgICAgU2NhbGFyIGxfa2k7CisgICAgICBpZihEb0xETFQpCisgICAgICAgIGxfa2kgPSB5aSAvIG1fZGlhZ1tpXTsKKyAgICAgIGVsc2UKKyAgICAgICAgeWkgPSBsX2tpID0geWkgLyBMeFtMcFtpXV07CisKKyAgICAgIEluZGV4IHAyID0gTHBbaV0gKyBtX25vblplcm9zUGVyQ29sW2ldOworICAgICAgSW5kZXggcDsKKyAgICAgIGZvcihwID0gTHBbaV0gKyAoRG9MRExUID8gMCA6IDEpOyBwIDwgcDI7ICsrcCkKKyAgICAgICAgeVtMaVtwXV0gLT0gbnVtZXh0Ojpjb25qKEx4W3BdKSAqIHlpOworICAgICAgZCAtPSBudW1leHQ6OnJlYWwobF9raSAqIG51bWV4dDo6Y29uaih5aSkpOworICAgICAgTGlbcF0gPSBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgTChrLGkpIGluIGNvbHVtbiBmb3JtIG9mIEwgKi8KKyAgICAgIEx4W3BdID0gbF9raTsKKyAgICAgICsrbV9ub25aZXJvc1BlckNvbFtpXTsgICAgICAgICAgICAgIC8qIGluY3JlbWVudCBjb3VudCBvZiBub256ZXJvcyBpbiBjb2wgaSAqLworICAgIH0KKyAgICBpZihEb0xETFQpCisgICAgeworICAgICAgbV9kaWFnW2tdID0gZDsKKyAgICAgIGlmKGQgPT0gUmVhbFNjYWxhcigwKSkKKyAgICAgIHsKKyAgICAgICAgb2sgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFpbHVyZSwgRChrLGspIGlzIHplcm8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBJbmRleCBwID0gTHBba10gKyBtX25vblplcm9zUGVyQ29sW2tdKys7CisgICAgICBMaVtwXSA9IGsgOyAgICAgICAgICAgICAgICAvKiBzdG9yZSBMKGssaykgPSBzcXJ0IChkKSBpbiBjb2x1bW4gayAqLworICAgICAgaWYoZCA8PSBSZWFsU2NhbGFyKDApKSB7CisgICAgICAgIG9rID0gZmFsc2U7ICAgICAgICAgICAgICAvKiBmYWlsdXJlLCBtYXRyaXggaXMgbm90IHBvc2l0aXZlIGRlZmluaXRlICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgTHhbcF0gPSBzcXJ0KGQpIDsKKyAgICB9CisgIH0KKworICBtX2luZm8gPSBvayA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0lNUExJQ0lBTF9DSE9MRVNLWV9JTVBMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0FtYmlWZWN0b3IuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0FtYmlWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVjYzkxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQW1iaVZlY3Rvci5oCkBAIC0wLDAgKzEsMzc3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQU1CSVZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX0FNQklWRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIEh5YnJpZCBzcGFyc2UvZGVuc2UgdmVjdG9yIGNsYXNzIGRlc2lnbmVkIGZvciBpbnRlbnNpdmUgcmVhZC13cml0ZSBvcGVyYXRpb25zLgorICAqCisgICogU2VlIEJhc2ljU3BhcnNlTExUIGFuZCBTcGFyc2VQcm9kdWN0IGZvciB1c2FnZSBleGFtcGxlcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitjbGFzcyBBbWJpVmVjdG9yCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgZXhwbGljaXQgQW1iaVZlY3RvcihJbmRleCBzaXplKQorICAgICAgOiBtX2J1ZmZlcigwKSwgbV96ZXJvKDApLCBtX3NpemUoMCksIG1fYWxsb2NhdGVkU2l6ZSgwKSwgbV9hbGxvY2F0ZWRFbGVtZW50cygwKSwgbV9tb2RlKC0xKQorICAgIHsKKyAgICAgIHJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIGluaXQoZG91YmxlIGVzdGltYXRlZERlbnNpdHkpOworICAgIHZvaWQgaW5pdChpbnQgbW9kZSk7CisKKyAgICBJbmRleCBub25aZXJvcygpIGNvbnN0OworCisgICAgLyoqIFNwZWNpZmllcyBhIHN1Yi12ZWN0b3IgdG8gd29yayBvbiAqLworICAgIHZvaWQgc2V0Qm91bmRzKEluZGV4IHN0YXJ0LCBJbmRleCBlbmQpIHsgbV9zdGFydCA9IGNvbnZlcnRfaW5kZXgoc3RhcnQpOyBtX2VuZCA9IGNvbnZlcnRfaW5kZXgoZW5kKTsgfQorCisgICAgdm9pZCBzZXRaZXJvKCk7CisKKyAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGkpOworICAgIFNjYWxhciYgY29lZmYoSW5kZXggaSk7CisKKyAgICBjbGFzcyBJdGVyYXRvcjsKKworICAgIH5BbWJpVmVjdG9yKCkgeyBkZWxldGVbXSBtX2J1ZmZlcjsgfQorCisgICAgdm9pZCByZXNpemUoSW5kZXggc2l6ZSkKKyAgICB7CisgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplIDwgc2l6ZSkKKyAgICAgICAgcmVhbGxvY2F0ZShzaXplKTsKKyAgICAgIG1fc2l6ZSA9IGNvbnZlcnRfaW5kZXgoc2l6ZSk7CisgICAgfQorCisgICAgU3RvcmFnZUluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgU3RvcmFnZUluZGV4IGNvbnZlcnRfaW5kZXgoSW5kZXggaWR4KQorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxTdG9yYWdlSW5kZXg+KGlkeCk7CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jYXRlKEluZGV4IHNpemUpCisgICAgeworICAgICAgLy8gaWYgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBpcyBub3QgdG9vIGxhcmdlLCBsZXQncyBhbGxvY2F0ZSBhIGJpdCBtb3JlIHRoYW4gbmVlZGVkIHN1Y2gKKyAgICAgIC8vIHRoYXQgd2UgY2FuIGhhbmRsZSBkZW5zZSB2ZWN0b3IgZXZlbiBpbiBzcGFyc2UgbW9kZS4KKyAgICAgIGRlbGV0ZVtdIG1fYnVmZmVyOworICAgICAgaWYgKHNpemU8MTAwMCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggYWxsb2NTaXplID0gKHNpemUgKiBzaXplb2YoTGlzdEVsKSArIHNpemVvZihTY2FsYXIpIC0gMSkvc2l6ZW9mKFNjYWxhcik7CisgICAgICAgIG1fYWxsb2NhdGVkRWxlbWVudHMgPSBjb252ZXJ0X2luZGV4KChhbGxvY1NpemUqc2l6ZW9mKFNjYWxhcikpL3NpemVvZihMaXN0RWwpKTsKKyAgICAgICAgbV9idWZmZXIgPSBuZXcgU2NhbGFyW2FsbG9jU2l6ZV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1fYWxsb2NhdGVkRWxlbWVudHMgPSBjb252ZXJ0X2luZGV4KChzaXplKnNpemVvZihTY2FsYXIpKS9zaXplb2YoTGlzdEVsKSk7CisgICAgICAgIG1fYnVmZmVyID0gbmV3IFNjYWxhcltzaXplXTsKKyAgICAgIH0KKyAgICAgIG1fc2l6ZSA9IGNvbnZlcnRfaW5kZXgoc2l6ZSk7CisgICAgICBtX3N0YXJ0ID0gMDsKKyAgICAgIG1fZW5kID0gbV9zaXplOworICAgIH0KKworICAgIHZvaWQgcmVhbGxvY2F0ZVNwYXJzZSgpCisgICAgeworICAgICAgSW5kZXggY29weUVsZW1lbnRzID0gbV9hbGxvY2F0ZWRFbGVtZW50czsKKyAgICAgIG1fYWxsb2NhdGVkRWxlbWVudHMgPSAoc3RkOjptaW4pKFN0b3JhZ2VJbmRleChtX2FsbG9jYXRlZEVsZW1lbnRzKjEuNSksbV9zaXplKTsKKyAgICAgIEluZGV4IGFsbG9jU2l6ZSA9IG1fYWxsb2NhdGVkRWxlbWVudHMgKiBzaXplb2YoTGlzdEVsKTsKKyAgICAgIGFsbG9jU2l6ZSA9IChhbGxvY1NpemUgKyBzaXplb2YoU2NhbGFyKSAtIDEpL3NpemVvZihTY2FsYXIpOworICAgICAgU2NhbGFyKiBuZXdCdWZmZXIgPSBuZXcgU2NhbGFyW2FsbG9jU2l6ZV07CisgICAgICBtZW1jcHkobmV3QnVmZmVyLCAgbV9idWZmZXIsICBjb3B5RWxlbWVudHMgKiBzaXplb2YoTGlzdEVsKSk7CisgICAgICBkZWxldGVbXSBtX2J1ZmZlcjsKKyAgICAgIG1fYnVmZmVyID0gbmV3QnVmZmVyOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgLy8gZWxlbWVudCB0eXBlIG9mIHRoZSBsaW5rZWQgbGlzdAorICAgIHN0cnVjdCBMaXN0RWwKKyAgICB7CisgICAgICBTdG9yYWdlSW5kZXggbmV4dDsKKyAgICAgIFN0b3JhZ2VJbmRleCBpbmRleDsKKyAgICAgIFNjYWxhciB2YWx1ZTsKKyAgICB9OworCisgICAgLy8gdXNlZCB0byBzdG9yZSBkYXRhIGluIGJvdGggbW9kZQorICAgIFNjYWxhciogbV9idWZmZXI7CisgICAgU2NhbGFyIG1femVybzsKKyAgICBTdG9yYWdlSW5kZXggbV9zaXplOworICAgIFN0b3JhZ2VJbmRleCBtX3N0YXJ0OworICAgIFN0b3JhZ2VJbmRleCBtX2VuZDsKKyAgICBTdG9yYWdlSW5kZXggbV9hbGxvY2F0ZWRTaXplOworICAgIFN0b3JhZ2VJbmRleCBtX2FsbG9jYXRlZEVsZW1lbnRzOworICAgIFN0b3JhZ2VJbmRleCBtX21vZGU7CisKKyAgICAvLyBsaW5rZWQgbGlzdCBtb2RlCisgICAgU3RvcmFnZUluZGV4IG1fbGxTdGFydDsKKyAgICBTdG9yYWdlSW5kZXggbV9sbEN1cnJlbnQ7CisgICAgU3RvcmFnZUluZGV4IG1fbGxTaXplOworfTsKKworLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm9zIGluIHRoZSBjdXJyZW50IHN1YiB2ZWN0b3IgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK0luZGV4IEFtYmlWZWN0b3I8X1NjYWxhcixfU3RvcmFnZUluZGV4Pjo6bm9uWmVyb3MoKSBjb25zdAoreworICBpZiAobV9tb2RlPT1Jc1NwYXJzZSkKKyAgICByZXR1cm4gbV9sbFNpemU7CisgIGVsc2UKKyAgICByZXR1cm4gbV9lbmQgLSBtX3N0YXJ0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+Cit2b2lkIEFtYmlWZWN0b3I8X1NjYWxhcixfU3RvcmFnZUluZGV4Pjo6aW5pdChkb3VibGUgZXN0aW1hdGVkRGVuc2l0eSkKK3sKKyAgaWYgKGVzdGltYXRlZERlbnNpdHk+MC4xKQorICAgIGluaXQoSXNEZW5zZSk7CisgIGVsc2UKKyAgICBpbml0KElzU3BhcnNlKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcix0eXBlbmFtZSBfU3RvcmFnZUluZGV4Pgordm9pZCBBbWJpVmVjdG9yPF9TY2FsYXIsX1N0b3JhZ2VJbmRleD46OmluaXQoaW50IG1vZGUpCit7CisgIG1fbW9kZSA9IG1vZGU7CisgIGlmIChtX21vZGU9PUlzU3BhcnNlKQorICB7CisgICAgbV9sbFNpemUgPSAwOworICAgIG1fbGxTdGFydCA9IC0xOworICB9Cit9CisKKy8qKiBNdXN0IGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBtaWdodCBwZXJmb3JtIGEgd3JpdGUgYWNjZXNzCisgICogd2l0aCBhbiBpbmRleCBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZS4KKyAgKgorICAqIERvbid0IHdvcnJ5LCB0aGlzIGZ1bmN0aW9uIGlzIGV4dHJlbWVseSBjaGVhcC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3ZvaWQgQW1iaVZlY3RvcjxfU2NhbGFyLF9TdG9yYWdlSW5kZXg+OjpyZXN0YXJ0KCkKK3sKKyAgbV9sbEN1cnJlbnQgPSBtX2xsU3RhcnQ7Cit9CisKKy8qKiBTZXQgYWxsIGNvZWZmaWNpZW50cyBvZiBjdXJyZW50IHN1YnZlY3RvciB0byB6ZXJvICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+Cit2b2lkIEFtYmlWZWN0b3I8X1NjYWxhcixfU3RvcmFnZUluZGV4Pjo6c2V0WmVybygpCit7CisgIGlmIChtX21vZGU9PUlzRGVuc2UpCisgIHsKKyAgICBmb3IgKEluZGV4IGk9bV9zdGFydDsgaTxtX2VuZDsgKytpKQorICAgICAgbV9idWZmZXJbaV0gPSBTY2FsYXIoMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1fbW9kZT09SXNTcGFyc2UpOworICAgIG1fbGxTaXplID0gMDsKKyAgICBtX2xsU3RhcnQgPSAtMTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitfU2NhbGFyJiBBbWJpVmVjdG9yPF9TY2FsYXIsX1N0b3JhZ2VJbmRleD46OmNvZWZmUmVmKEluZGV4IGkpCit7CisgIGlmIChtX21vZGU9PUlzRGVuc2UpCisgICAgcmV0dXJuIG1fYnVmZmVyW2ldOworICBlbHNlCisgIHsKKyAgICBMaXN0RWwqIEVJR0VOX1JFU1RSSUNUIGxsRWxlbWVudHMgPSByZWludGVycHJldF9jYXN0PExpc3RFbCo+KG1fYnVmZmVyKTsKKyAgICAvLyBUT0RPIGZhY3Rvcml6ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gcmVkdWNlIGNvZGUgZ2VuZXJhdGlvbgorICAgIGVpZ2VuX2Fzc2VydChtX21vZGU9PUlzU3BhcnNlKTsKKyAgICBpZiAobV9sbFNpemU9PTApCisgICAgeworICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgbV9sbFN0YXJ0ID0gMDsKKyAgICAgIG1fbGxDdXJyZW50ID0gMDsKKyAgICAgICsrbV9sbFNpemU7CisgICAgICBsbEVsZW1lbnRzWzBdLnZhbHVlID0gU2NhbGFyKDApOworICAgICAgbGxFbGVtZW50c1swXS5pbmRleCA9IGNvbnZlcnRfaW5kZXgoaSk7CisgICAgICBsbEVsZW1lbnRzWzBdLm5leHQgPSAtMTsKKyAgICAgIHJldHVybiBsbEVsZW1lbnRzWzBdLnZhbHVlOworICAgIH0KKyAgICBlbHNlIGlmIChpPGxsRWxlbWVudHNbbV9sbFN0YXJ0XS5pbmRleCkKKyAgICB7CisgICAgICAvLyB0aGlzIGlzIGdvaW5nIHRvIGJlIHRoZSBuZXcgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdAorICAgICAgTGlzdEVsJiBlbCA9IGxsRWxlbWVudHNbbV9sbFNpemVdOworICAgICAgZWwudmFsdWUgPSBTY2FsYXIoMCk7CisgICAgICBlbC5pbmRleCA9IGNvbnZlcnRfaW5kZXgoaSk7CisgICAgICBlbC5uZXh0ID0gbV9sbFN0YXJ0OworICAgICAgbV9sbFN0YXJ0ID0gbV9sbFNpemU7CisgICAgICArK21fbGxTaXplOworICAgICAgbV9sbEN1cnJlbnQgPSBtX2xsU3RhcnQ7CisgICAgICByZXR1cm4gZWwudmFsdWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBTdG9yYWdlSW5kZXggbmV4dGVsID0gbGxFbGVtZW50c1ttX2xsQ3VycmVudF0ubmV4dDsKKyAgICAgIGVpZ2VuX2Fzc2VydChpPj1sbEVsZW1lbnRzW21fbGxDdXJyZW50XS5pbmRleCAmJiAieW91IG11c3QgY2FsbCByZXN0YXJ0KCkgYmVmb3JlIGluc2VydGluZyBhbiBlbGVtZW50IHdpdGggbG93ZXIgb3IgZXF1YWwgaW5kZXgiKTsKKyAgICAgIHdoaWxlIChuZXh0ZWwgPj0gMCAmJiBsbEVsZW1lbnRzW25leHRlbF0uaW5kZXg8PWkpCisgICAgICB7CisgICAgICAgIG1fbGxDdXJyZW50ID0gbmV4dGVsOworICAgICAgICBuZXh0ZWwgPSBsbEVsZW1lbnRzW25leHRlbF0ubmV4dDsKKyAgICAgIH0KKworICAgICAgaWYgKGxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLmluZGV4PT1pKQorICAgICAgeworICAgICAgICAvLyB0aGUgY29lZmZpY2llbnQgYWxyZWFkeSBleGlzdHMgYW5kIHdlIGZvdW5kIGl0ICEKKyAgICAgICAgcmV0dXJuIGxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLnZhbHVlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAobV9sbFNpemU+PW1fYWxsb2NhdGVkRWxlbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICByZWFsbG9jYXRlU3BhcnNlKCk7CisgICAgICAgICAgbGxFbGVtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8TGlzdEVsKj4obV9idWZmZXIpOworICAgICAgICB9CisgICAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX2xsU2l6ZTxtX2FsbG9jYXRlZEVsZW1lbnRzICYmICJpbnRlcm5hbCBlcnJvcjogb3ZlcmZsb3cgaW4gc3BhcnNlIG1vZGUiKTsKKyAgICAgICAgLy8gbGV0J3MgaW5zZXJ0IGEgbmV3IGNvZWZmaWNpZW50CisgICAgICAgIExpc3RFbCYgZWwgPSBsbEVsZW1lbnRzW21fbGxTaXplXTsKKyAgICAgICAgZWwudmFsdWUgPSBTY2FsYXIoMCk7CisgICAgICAgIGVsLmluZGV4ID0gY29udmVydF9pbmRleChpKTsKKyAgICAgICAgZWwubmV4dCA9IGxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLm5leHQ7CisgICAgICAgIGxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLm5leHQgPSBtX2xsU2l6ZTsKKyAgICAgICAgKyttX2xsU2l6ZTsKKyAgICAgICAgcmV0dXJuIGVsLnZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitfU2NhbGFyJiBBbWJpVmVjdG9yPF9TY2FsYXIsX1N0b3JhZ2VJbmRleD46OmNvZWZmKEluZGV4IGkpCit7CisgIGlmIChtX21vZGU9PUlzRGVuc2UpCisgICAgcmV0dXJuIG1fYnVmZmVyW2ldOworICBlbHNlCisgIHsKKyAgICBMaXN0RWwqIEVJR0VOX1JFU1RSSUNUIGxsRWxlbWVudHMgPSByZWludGVycHJldF9jYXN0PExpc3RFbCo+KG1fYnVmZmVyKTsKKyAgICBlaWdlbl9hc3NlcnQobV9tb2RlPT1Jc1NwYXJzZSk7CisgICAgaWYgKChtX2xsU2l6ZT09MCkgfHwgKGk8bGxFbGVtZW50c1ttX2xsU3RhcnRdLmluZGV4KSkKKyAgICB7CisgICAgICByZXR1cm4gbV96ZXJvOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgSW5kZXggZWxpZCA9IG1fbGxTdGFydDsKKyAgICAgIHdoaWxlIChlbGlkID49IDAgJiYgbGxFbGVtZW50c1tlbGlkXS5pbmRleDxpKQorICAgICAgICBlbGlkID0gbGxFbGVtZW50c1tlbGlkXS5uZXh0OworCisgICAgICBpZiAobGxFbGVtZW50c1tlbGlkXS5pbmRleD09aSkKKyAgICAgICAgcmV0dXJuIGxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLnZhbHVlOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV96ZXJvOworICAgIH0KKyAgfQorfQorCisvKiogSXRlcmF0b3Igb3ZlciB0aGUgbm9uemVybyBjb2VmZmljaWVudHMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK2NsYXNzIEFtYmlWZWN0b3I8X1NjYWxhcixfU3RvcmFnZUluZGV4Pjo6SXRlcmF0b3IKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICogXHBhcmFtIHZlYyB0aGUgdmVjdG9yIG9uIHdoaWNoIHdlIGl0ZXJhdGUKKyAgICAgICogXHBhcmFtIGVwc2lsb24gdGhlIG1pbmltYWwgdmFsdWUgdXNlZCB0byBwcnVuZSB6ZXJvIGNvZWZmaWNpZW50cy4KKyAgICAgICogSW4gcHJhY3RpY2UsIGFsbCBjb2VmZmljaWVudHMgaGF2aW5nIGEgbWFnbml0dWRlIHNtYWxsZXIgdGhhbiBcYSBlcHNpbG9uCisgICAgICAqIGFyZSBza2lwcGVkLgorICAgICAgKi8KKyAgICBleHBsaWNpdCBJdGVyYXRvcihjb25zdCBBbWJpVmVjdG9yJiB2ZWMsIGNvbnN0IFJlYWxTY2FsYXImIGVwc2lsb24gPSAwKQorICAgICAgOiBtX3ZlY3Rvcih2ZWMpCisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBtX2Vwc2lsb24gPSBlcHNpbG9uOworICAgICAgbV9pc0RlbnNlID0gbV92ZWN0b3IubV9tb2RlPT1Jc0RlbnNlOworICAgICAgaWYgKG1faXNEZW5zZSkKKyAgICAgIHsKKyAgICAgICAgbV9jdXJyZW50RWwgPSAwOyAgIC8vIHRoaXMgaXMgdG8gYXZvaWQgYSBjb21waWxhdGlvbiB3YXJuaW5nCisgICAgICAgIG1fY2FjaGVkVmFsdWUgPSAwOyAvLyB0aGlzIGlzIHRvIGF2b2lkIGEgY29tcGlsYXRpb24gd2FybmluZworICAgICAgICBtX2NhY2hlZEluZGV4ID0gbV92ZWN0b3IubV9zdGFydC0xOworICAgICAgICArKygqdGhpcyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIExpc3RFbCogRUlHRU5fUkVTVFJJQ1QgbGxFbGVtZW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8TGlzdEVsKj4obV92ZWN0b3IubV9idWZmZXIpOworICAgICAgICBtX2N1cnJlbnRFbCA9IG1fdmVjdG9yLm1fbGxTdGFydDsKKyAgICAgICAgd2hpbGUgKG1fY3VycmVudEVsPj0wICYmIGFicyhsbEVsZW1lbnRzW21fY3VycmVudEVsXS52YWx1ZSk8PW1fZXBzaWxvbikKKyAgICAgICAgICBtX2N1cnJlbnRFbCA9IGxsRWxlbWVudHNbbV9jdXJyZW50RWxdLm5leHQ7CisgICAgICAgIGlmIChtX2N1cnJlbnRFbDwwKQorICAgICAgICB7CisgICAgICAgICAgbV9jYWNoZWRWYWx1ZSA9IDA7IC8vIHRoaXMgaXMgdG8gYXZvaWQgYSBjb21waWxhdGlvbiB3YXJuaW5nCisgICAgICAgICAgbV9jYWNoZWRJbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1fY2FjaGVkSW5kZXggPSBsbEVsZW1lbnRzW21fY3VycmVudEVsXS5pbmRleDsKKyAgICAgICAgICBtX2NhY2hlZFZhbHVlID0gbGxFbGVtZW50c1ttX2N1cnJlbnRFbF0udmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBTdG9yYWdlSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2NhY2hlZEluZGV4OyB9CisgICAgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZWRWYWx1ZTsgfQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkSW5kZXg+PTA7IH0KKworICAgIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgIGlmIChtX2lzRGVuc2UpCisgICAgICB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICArK21fY2FjaGVkSW5kZXg7CisgICAgICAgIH0gd2hpbGUgKG1fY2FjaGVkSW5kZXg8bV92ZWN0b3IubV9lbmQgJiYgYWJzKG1fdmVjdG9yLm1fYnVmZmVyW21fY2FjaGVkSW5kZXhdKTw9bV9lcHNpbG9uKTsKKyAgICAgICAgaWYgKG1fY2FjaGVkSW5kZXg8bV92ZWN0b3IubV9lbmQpCisgICAgICAgICAgbV9jYWNoZWRWYWx1ZSA9IG1fdmVjdG9yLm1fYnVmZmVyW21fY2FjaGVkSW5kZXhdOworICAgICAgICBlbHNlCisgICAgICAgICAgbV9jYWNoZWRJbmRleD0tMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTGlzdEVsKiBFSUdFTl9SRVNUUklDVCBsbEVsZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxMaXN0RWwqPihtX3ZlY3Rvci5tX2J1ZmZlcik7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBtX2N1cnJlbnRFbCA9IGxsRWxlbWVudHNbbV9jdXJyZW50RWxdLm5leHQ7CisgICAgICAgIH0gd2hpbGUgKG1fY3VycmVudEVsPj0wICYmIGFicyhsbEVsZW1lbnRzW21fY3VycmVudEVsXS52YWx1ZSk8PW1fZXBzaWxvbik7CisgICAgICAgIGlmIChtX2N1cnJlbnRFbDwwKQorICAgICAgICB7CisgICAgICAgICAgbV9jYWNoZWRJbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1fY2FjaGVkSW5kZXggPSBsbEVsZW1lbnRzW21fY3VycmVudEVsXS5pbmRleDsKKyAgICAgICAgICBtX2NhY2hlZFZhbHVlID0gbGxFbGVtZW50c1ttX2N1cnJlbnRFbF0udmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IEFtYmlWZWN0b3ImIG1fdmVjdG9yOyAvLyB0aGUgdGFyZ2V0IHZlY3RvcgorICAgIFN0b3JhZ2VJbmRleCBtX2N1cnJlbnRFbDsgICAvLyB0aGUgY3VycmVudCBlbGVtZW50IGluIHNwYXJzZS9saW5rZWQtbGlzdCBtb2RlCisgICAgUmVhbFNjYWxhciBtX2Vwc2lsb247ICAgICAgIC8vIGVwc2lsb24gdXNlZCB0byBwcnVuZSB6ZXJvIGNvZWZmaWNpZW50cworICAgIFN0b3JhZ2VJbmRleCBtX2NhY2hlZEluZGV4OyAvLyBjdXJyZW50IGNvb3JkaW5hdGUKKyAgICBTY2FsYXIgbV9jYWNoZWRWYWx1ZTsgICAgICAgLy8gY3VycmVudCB2YWx1ZQorICAgIGJvb2wgbV9pc0RlbnNlOyAgICAgICAgICAgICAvLyBtb2RlIG9mIHRoZSB2ZWN0b3IKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FNQklWRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQ29tcHJlc3NlZFN0b3JhZ2UuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NvbXByZXNzZWRTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5ZmEwZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NvbXByZXNzZWRTdG9yYWdlLmgKQEAgLTAsMCArMSwyNTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBSRVNTRURfU1RPUkFHRV9ICisjZGVmaW5lIEVJR0VOX0NPTVBSRVNTRURfU1RPUkFHRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogU3RvcmVzIGEgc3BhcnNlIHNldCBvZiB2YWx1ZXMgYXMgYSBsaXN0IG9mIHZhbHVlcyBhbmQgYSBsaXN0IG9mIGluZGljZXMuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK2NsYXNzIENvbXByZXNzZWRTdG9yYWdlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgcHVibGljOgorCisgICAgQ29tcHJlc3NlZFN0b3JhZ2UoKQorICAgICAgOiBtX3ZhbHVlcygwKSwgbV9pbmRpY2VzKDApLCBtX3NpemUoMCksIG1fYWxsb2NhdGVkU2l6ZSgwKQorICAgIHt9CisKKyAgICBleHBsaWNpdCBDb21wcmVzc2VkU3RvcmFnZShJbmRleCBzaXplKQorICAgICAgOiBtX3ZhbHVlcygwKSwgbV9pbmRpY2VzKDApLCBtX3NpemUoMCksIG1fYWxsb2NhdGVkU2l6ZSgwKQorICAgIHsKKyAgICAgIHJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICBDb21wcmVzc2VkU3RvcmFnZShjb25zdCBDb21wcmVzc2VkU3RvcmFnZSYgb3RoZXIpCisgICAgICA6IG1fdmFsdWVzKDApLCBtX2luZGljZXMoMCksIG1fc2l6ZSgwKSwgbV9hbGxvY2F0ZWRTaXplKDApCisgICAgeworICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICB9CisKKyAgICBDb21wcmVzc2VkU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IENvbXByZXNzZWRTdG9yYWdlJiBvdGhlcikKKyAgICB7CisgICAgICByZXNpemUob3RoZXIuc2l6ZSgpKTsKKyAgICAgIGlmKG90aGVyLnNpemUoKT4wKQorICAgICAgeworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX3ZhbHVlcywgIG90aGVyLm1fdmFsdWVzICArIG1fc2l6ZSwgbV92YWx1ZXMpOworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX2luZGljZXMsIG90aGVyLm1faW5kaWNlcyArIG1fc2l6ZSwgbV9pbmRpY2VzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIHN3YXAoQ29tcHJlc3NlZFN0b3JhZ2UmIG90aGVyKQorICAgIHsKKyAgICAgIHN0ZDo6c3dhcChtX3ZhbHVlcywgb3RoZXIubV92YWx1ZXMpOworICAgICAgc3RkOjpzd2FwKG1faW5kaWNlcywgb3RoZXIubV9pbmRpY2VzKTsKKyAgICAgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgICAgICBzdGQ6OnN3YXAobV9hbGxvY2F0ZWRTaXplLCBvdGhlci5tX2FsbG9jYXRlZFNpemUpOworICAgIH0KKworICAgIH5Db21wcmVzc2VkU3RvcmFnZSgpCisgICAgeworICAgICAgZGVsZXRlW10gbV92YWx1ZXM7CisgICAgICBkZWxldGVbXSBtX2luZGljZXM7CisgICAgfQorCisgICAgdm9pZCByZXNlcnZlKEluZGV4IHNpemUpCisgICAgeworICAgICAgSW5kZXggbmV3QWxsb2NhdGVkU2l6ZSA9IG1fc2l6ZSArIHNpemU7CisgICAgICBpZiAobmV3QWxsb2NhdGVkU2l6ZSA+IG1fYWxsb2NhdGVkU2l6ZSkKKyAgICAgICAgcmVhbGxvY2F0ZShuZXdBbGxvY2F0ZWRTaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHNxdWVlemUoKQorICAgIHsKKyAgICAgIGlmIChtX2FsbG9jYXRlZFNpemU+bV9zaXplKQorICAgICAgICByZWFsbG9jYXRlKG1fc2l6ZSk7CisgICAgfQorCisgICAgdm9pZCByZXNpemUoSW5kZXggc2l6ZSwgZG91YmxlIHJlc2VydmVTaXplRmFjdG9yID0gMCkKKyAgICB7CisgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplPHNpemUpCisgICAgICB7CisgICAgICAgIEluZGV4IHJlYWxsb2Nfc2l6ZSA9IChzdGQ6Om1pbjxJbmRleD4pKE51bVRyYWl0czxTdG9yYWdlSW5kZXg+OjpoaWdoZXN0KCksICBzaXplICsgSW5kZXgocmVzZXJ2ZVNpemVGYWN0b3IqZG91YmxlKHNpemUpKSk7CisgICAgICAgIGlmKHJlYWxsb2Nfc2l6ZTxzaXplKQorICAgICAgICAgIGludGVybmFsOjp0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgICAgICAgIHJlYWxsb2NhdGUocmVhbGxvY19zaXplKTsKKyAgICAgIH0KKyAgICAgIG1fc2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY29uc3QgU2NhbGFyJiB2LCBJbmRleCBpKQorICAgIHsKKyAgICAgIEluZGV4IGlkID0gbV9zaXplOworICAgICAgcmVzaXplKG1fc2l6ZSsxLCAxKTsKKyAgICAgIG1fdmFsdWVzW2lkXSA9IHY7CisgICAgICBtX2luZGljZXNbaWRdID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgIGlubGluZSBJbmRleCBhbGxvY2F0ZWRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9hbGxvY2F0ZWRTaXplOyB9CisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7IG1fc2l6ZSA9IDA7IH0KKworICAgIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIFNjYWxhciogdmFsdWVQdHIoKSB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIGNvbnN0IFN0b3JhZ2VJbmRleCogaW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKyAgICBTdG9yYWdlSW5kZXgqIGluZGV4UHRyKCkgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZShJbmRleCBpKSB7IGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX3ZhbHVlcyE9MCk7IHJldHVybiBtX3ZhbHVlc1tpXTsgfQorICAgIGlubGluZSBjb25zdCBTY2FsYXImIHZhbHVlKEluZGV4IGkpIGNvbnN0IHsgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG1fdmFsdWVzIT0wKTsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9CisKKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4JiBpbmRleChJbmRleCBpKSB7IGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX2luZGljZXMhPTApOyByZXR1cm4gbV9pbmRpY2VzW2ldOyB9CisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCYgaW5kZXgoSW5kZXggaSkgY29uc3QgeyBlaWdlbl9pbnRlcm5hbF9hc3NlcnQobV9pbmRpY2VzIT0wKTsgcmV0dXJuIG1faW5kaWNlc1tpXTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBsYXJnZXN0IFxjIGsgc3VjaCB0aGF0IGZvciBhbGwgXGMgaiBpbiBbMCxrKSBpbmRleFtcYyBqXVw8XGEga2V5ICovCisgICAgaW5saW5lIEluZGV4IHNlYXJjaExvd2VySW5kZXgoSW5kZXgga2V5KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBzZWFyY2hMb3dlckluZGV4KDAsIG1fc2l6ZSwga2V5KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGxhcmdlc3QgXGMgayBpbiBbc3RhcnQsZW5kKSBzdWNoIHRoYXQgZm9yIGFsbCBcYyBqIGluIFtzdGFydCxrKSBpbmRleFtcYyBqXVw8XGEga2V5ICovCisgICAgaW5saW5lIEluZGV4IHNlYXJjaExvd2VySW5kZXgoSW5kZXggc3RhcnQsIEluZGV4IGVuZCwgSW5kZXgga2V5KSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlKGVuZD5zdGFydCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggbWlkID0gKGVuZCtzdGFydCk+PjE7CisgICAgICAgIGlmIChtX2luZGljZXNbbWlkXTxrZXkpCisgICAgICAgICAgc3RhcnQgPSBtaWQrMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVuZCA9IG1pZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGFydDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHN0b3JlZCB2YWx1ZSBhdCBpbmRleCBcYSBrZXkKKyAgICAgICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSB2YWx1ZSBcYSBkZWZhdWx0VmFsdWUgaXMgcmV0dXJuZWQgd2l0aG91dCBhbnkgaW5zZXJ0aW9uLiAqLworICAgIGlubGluZSBTY2FsYXIgYXQoSW5kZXgga2V5LCBjb25zdCBTY2FsYXImIGRlZmF1bHRWYWx1ZSA9IFNjYWxhcigwKSkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9zaXplPT0wKQorICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgZWxzZSBpZiAoa2V5PT1tX2luZGljZXNbbV9zaXplLTFdKQorICAgICAgICByZXR1cm4gbV92YWx1ZXNbbV9zaXplLTFdOworICAgICAgLy8gXl4gIG9wdGltaXphdGlvbjogbGV0J3MgZmlyc3QgY2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgY29lZmZpY2llbnQKKyAgICAgIC8vICh2ZXJ5IGNvbW1vbiBpbiBoaWdoIGxldmVsIGFsZ29yaXRobXMpCisgICAgICBjb25zdCBJbmRleCBpZCA9IHNlYXJjaExvd2VySW5kZXgoMCxtX3NpemUtMSxrZXkpOworICAgICAgcmV0dXJuICgoaWQ8bV9zaXplKSAmJiAobV9pbmRpY2VzW2lkXT09a2V5KSkgPyBtX3ZhbHVlc1tpZF0gOiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLyoqIExpa2UgYXQoKSwgYnV0IHRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkIGluIHRoZSByYW5nZSBbc3RhcnQsZW5kKSAqLworICAgIGlubGluZSBTY2FsYXIgYXRJblJhbmdlKEluZGV4IHN0YXJ0LCBJbmRleCBlbmQsIEluZGV4IGtleSwgY29uc3QgU2NhbGFyICZkZWZhdWx0VmFsdWUgPSBTY2FsYXIoMCkpIGNvbnN0CisgICAgeworICAgICAgaWYgKHN0YXJ0Pj1lbmQpCisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICBlbHNlIGlmIChlbmQ+c3RhcnQgJiYga2V5PT1tX2luZGljZXNbZW5kLTFdKQorICAgICAgICByZXR1cm4gbV92YWx1ZXNbZW5kLTFdOworICAgICAgLy8gXl4gIG9wdGltaXphdGlvbjogbGV0J3MgZmlyc3QgY2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgY29lZmZpY2llbnQKKyAgICAgIC8vICh2ZXJ5IGNvbW1vbiBpbiBoaWdoIGxldmVsIGFsZ29yaXRobXMpCisgICAgICBjb25zdCBJbmRleCBpZCA9IHNlYXJjaExvd2VySW5kZXgoc3RhcnQsZW5kLTEsa2V5KTsKKyAgICAgIHJldHVybiAoKGlkPGVuZCkgJiYgKG1faW5kaWNlc1tpZF09PWtleSkpID8gbV92YWx1ZXNbaWRdIDogZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgYXQgaW5kZXggXGEga2V5CisgICAgICAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB0aGUgdmFsdWUgXGEgZGVmYXVsdFZhbHVlIGlzIGluc2VydGVkCisgICAgICAqIHN1Y2ggdGhhdCB0aGUga2V5cyBhcmUgc29ydGVkLiAqLworICAgIGlubGluZSBTY2FsYXImIGF0V2l0aEluc2VydGlvbihJbmRleCBrZXksIGNvbnN0IFNjYWxhciYgZGVmYXVsdFZhbHVlID0gU2NhbGFyKDApKQorICAgIHsKKyAgICAgIEluZGV4IGlkID0gc2VhcmNoTG93ZXJJbmRleCgwLG1fc2l6ZSxrZXkpOworICAgICAgaWYgKGlkPj1tX3NpemUgfHwgbV9pbmRpY2VzW2lkXSE9a2V5KQorICAgICAgeworICAgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplPG1fc2l6ZSsxKQorICAgICAgICB7CisgICAgICAgICAgbV9hbGxvY2F0ZWRTaXplID0gMioobV9zaXplKzEpOworICAgICAgICAgIGludGVybmFsOjpzY29wZWRfYXJyYXk8U2NhbGFyPiBuZXdWYWx1ZXMobV9hbGxvY2F0ZWRTaXplKTsKKyAgICAgICAgICBpbnRlcm5hbDo6c2NvcGVkX2FycmF5PFN0b3JhZ2VJbmRleD4gbmV3SW5kaWNlcyhtX2FsbG9jYXRlZFNpemUpOworCisgICAgICAgICAgLy8gY29weSBmaXJzdCBjaHVuaworICAgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1fdmFsdWVzLCAgbV92YWx1ZXMgK2lkLCBuZXdWYWx1ZXMucHRyKCkpOworICAgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1faW5kaWNlcywgbV9pbmRpY2VzK2lkLCBuZXdJbmRpY2VzLnB0cigpKTsKKworICAgICAgICAgIC8vIGNvcHkgdGhlIHJlc3QKKyAgICAgICAgICBpZihtX3NpemU+aWQpCisgICAgICAgICAgeworICAgICAgICAgICAgaW50ZXJuYWw6OnNtYXJ0X2NvcHkobV92YWx1ZXMgK2lkLCAgbV92YWx1ZXMgK21fc2l6ZSwgbmV3VmFsdWVzLnB0cigpICtpZCsxKTsKKyAgICAgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1faW5kaWNlcytpZCwgIG1faW5kaWNlcyttX3NpemUsIG5ld0luZGljZXMucHRyKCkraWQrMSk7CisgICAgICAgICAgfQorICAgICAgICAgIHN0ZDo6c3dhcChtX3ZhbHVlcyxuZXdWYWx1ZXMucHRyKCkpOworICAgICAgICAgIHN0ZDo6c3dhcChtX2luZGljZXMsbmV3SW5kaWNlcy5wdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihtX3NpemU+aWQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm5hbDo6c21hcnRfbWVtbW92ZShtX3ZhbHVlcyAraWQsIG1fdmFsdWVzICttX3NpemUsIG1fdmFsdWVzICtpZCsxKTsKKyAgICAgICAgICBpbnRlcm5hbDo6c21hcnRfbWVtbW92ZShtX2luZGljZXMraWQsIG1faW5kaWNlcyttX3NpemUsIG1faW5kaWNlcytpZCsxKTsKKyAgICAgICAgfQorICAgICAgICBtX3NpemUrKzsKKyAgICAgICAgbV9pbmRpY2VzW2lkXSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oa2V5KTsKKyAgICAgICAgbV92YWx1ZXNbaWRdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgcmV0dXJuIG1fdmFsdWVzW2lkXTsKKyAgICB9CisKKyAgICB2b2lkIHBydW5lKGNvbnN0IFNjYWxhciYgcmVmZXJlbmNlLCBjb25zdCBSZWFsU2NhbGFyJiBlcHNpbG9uID0gTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKKyAgICB7CisgICAgICBJbmRleCBrID0gMDsKKyAgICAgIEluZGV4IG4gPSBzaXplKCk7CisgICAgICBmb3IgKEluZGV4IGk9MDsgaTxuOyArK2kpCisgICAgICB7CisgICAgICAgIGlmICghaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKHZhbHVlKGkpLCByZWZlcmVuY2UsIGVwc2lsb24pKQorICAgICAgICB7CisgICAgICAgICAgdmFsdWUoaykgPSB2YWx1ZShpKTsKKyAgICAgICAgICBpbmRleChrKSA9IGluZGV4KGkpOworICAgICAgICAgICsrazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzaXplKGssMCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIGlubGluZSB2b2lkIHJlYWxsb2NhdGUoSW5kZXggc2l6ZSkKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fU1BBUlNFX0NPTVBSRVNTRURfU1RPUkFHRV9SRUFMTE9DQVRFX1BMVUdJTgorICAgICAgICBFSUdFTl9TUEFSU0VfQ09NUFJFU1NFRF9TVE9SQUdFX1JFQUxMT0NBVEVfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChzaXplIT1tX2FsbG9jYXRlZFNpemUpOworICAgICAgaW50ZXJuYWw6OnNjb3BlZF9hcnJheTxTY2FsYXI+IG5ld1ZhbHVlcyhzaXplKTsKKyAgICAgIGludGVybmFsOjpzY29wZWRfYXJyYXk8U3RvcmFnZUluZGV4PiBuZXdJbmRpY2VzKHNpemUpOworICAgICAgSW5kZXggY29weVNpemUgPSAoc3RkOjptaW4pKHNpemUsIG1fc2l6ZSk7CisgICAgICBpZiAoY29weVNpemU+MCkgeworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShtX3ZhbHVlcywgbV92YWx1ZXMrY29weVNpemUsIG5ld1ZhbHVlcy5wdHIoKSk7CisgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1faW5kaWNlcywgbV9pbmRpY2VzK2NvcHlTaXplLCBuZXdJbmRpY2VzLnB0cigpKTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3dhcChtX3ZhbHVlcyxuZXdWYWx1ZXMucHRyKCkpOworICAgICAgc3RkOjpzd2FwKG1faW5kaWNlcyxuZXdJbmRpY2VzLnB0cigpKTsKKyAgICAgIG1fYWxsb2NhdGVkU2l6ZSA9IHNpemU7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBTY2FsYXIqIG1fdmFsdWVzOworICAgIFN0b3JhZ2VJbmRleCogbV9pbmRpY2VzOworICAgIEluZGV4IG1fc2l6ZTsKKyAgICBJbmRleCBtX2FsbG9jYXRlZFNpemU7CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBSRVNTRURfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db25zZXJ2YXRpdmVTcGFyc2VTcGFyc2VQcm9kdWN0LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db25zZXJ2YXRpdmVTcGFyc2VTcGFyc2VQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyZWIwYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NvbnNlcnZhdGl2ZVNwYXJzZVNwYXJzZVByb2R1Y3QuaApAQCAtMCwwICsxLDM0NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09OU0VSVkFUSVZFU1BBUlNFU1BBUlNFUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX0NPTlNFUlZBVElWRVNQQVJTRVNQQVJTRVBST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdGF0aWMgdm9pZCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGwoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIGJvb2wgc29ydGVkSW5zZXJ0aW9uID0gZmFsc2UpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlOjpTY2FsYXIgU2NhbGFyOworCisgIC8vIG1ha2Ugc3VyZSB0byBjYWxsIGlubmVyU2l6ZS9vdXRlclNpemUgc2luY2Ugd2UgZmFrZSB0aGUgc3RvcmFnZSBvcmRlci4KKyAgSW5kZXggcm93cyA9IGxocy5pbm5lclNpemUoKTsKKyAgSW5kZXggY29scyA9IHJocy5vdXRlclNpemUoKTsKKyAgZWlnZW5fYXNzZXJ0KGxocy5vdXRlclNpemUoKSA9PSByaHMuaW5uZXJTaXplKCkpOworICAKKyAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKGJvb2wsICAgbWFzaywgICAgIHJvd3MsIDApOworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCB2YWx1ZXMsICAgcm93cywgMCk7CisgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShJbmRleCwgIGluZGljZXMsICByb3dzLCAwKTsKKyAgCisgIHN0ZDo6bWVtc2V0KG1hc2ssMCxzaXplb2YoYm9vbCkqcm93cyk7CisKKyAgZXZhbHVhdG9yPExocz4gbGhzRXZhbChsaHMpOworICBldmFsdWF0b3I8UmhzPiByaHNFdmFsKHJocyk7CisgIAorICAvLyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGVudHJpZXMKKyAgLy8gZ2l2ZW4gYSByaHMgY29sdW1uIGNvbnRhaW5pbmcgWSBub24gemVyb3MsIHdlIGFzc3VtZSB0aGF0IHRoZSByZXNwZWN0aXZlIFkgY29sdW1ucworICAvLyBvZiB0aGUgbGhzIGRpZmZlcnMgaW4gYXZlcmFnZSBvZiBvbmUgbm9uIHplcm9zLCB0aHVzIHRoZSBudW1iZXIgb2Ygbm9uIHplcm9zIGZvcgorICAvLyB0aGUgcHJvZHVjdCBvZiBhIHJocyBjb2x1bW4gd2l0aCB0aGUgbGhzIGlzIFgrWSB3aGVyZSBYIGlzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBub24gemVybworICAvLyBwZXIgY29sdW1uIG9mIHRoZSBsaHMuCisgIC8vIFRoZXJlZm9yZSwgd2UgaGF2ZSBubnoobGhzKnJocykgPSBubnoobGhzKSArIG5ueihyaHMpCisgIEluZGV4IGVzdGltYXRlZF9ubnpfcHJvZCA9IGxoc0V2YWwubm9uWmVyb3NFc3RpbWF0ZSgpICsgcmhzRXZhbC5ub25aZXJvc0VzdGltYXRlKCk7CisKKyAgcmVzLnNldFplcm8oKTsKKyAgcmVzLnJlc2VydmUoSW5kZXgoZXN0aW1hdGVkX25uel9wcm9kKSk7CisgIC8vIHdlIGNvbXB1dGUgZWFjaCBjb2x1bW4gb2YgdGhlIHJlc3VsdCwgb25lIGFmdGVyIHRoZSBvdGhlcgorICBmb3IgKEluZGV4IGo9MDsgajxjb2xzOyArK2opCisgIHsKKworICAgIHJlcy5zdGFydFZlYyhqKTsKKyAgICBJbmRleCBubnogPSAwOworICAgIGZvciAodHlwZW5hbWUgZXZhbHVhdG9yPFJocz46OklubmVySXRlcmF0b3IgcmhzSXQocmhzRXZhbCwgaik7IHJoc0l0OyArK3Joc0l0KQorICAgIHsKKyAgICAgIFNjYWxhciB5ID0gcmhzSXQudmFsdWUoKTsKKyAgICAgIEluZGV4IGsgPSByaHNJdC5pbmRleCgpOworICAgICAgZm9yICh0eXBlbmFtZSBldmFsdWF0b3I8TGhzPjo6SW5uZXJJdGVyYXRvciBsaHNJdChsaHNFdmFsLCBrKTsgbGhzSXQ7ICsrbGhzSXQpCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBsaHNJdC5pbmRleCgpOworICAgICAgICBTY2FsYXIgeCA9IGxoc0l0LnZhbHVlKCk7CisgICAgICAgIGlmKCFtYXNrW2ldKQorICAgICAgICB7CisgICAgICAgICAgbWFza1tpXSA9IHRydWU7CisgICAgICAgICAgdmFsdWVzW2ldID0geCAqIHk7CisgICAgICAgICAgaW5kaWNlc1tubnpdID0gaTsKKyAgICAgICAgICArK25uejsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgdmFsdWVzW2ldICs9IHggKiB5OworICAgICAgfQorICAgIH0KKyAgICBpZighc29ydGVkSW5zZXJ0aW9uKQorICAgIHsKKyAgICAgIC8vIHVub3JkZXJlZCBpbnNlcnRpb24KKyAgICAgIGZvcihJbmRleCBrPTA7IGs8bm56OyArK2spCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBpbmRpY2VzW2tdOworICAgICAgICByZXMuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lclVub3JkZXJlZChqLGkpID0gdmFsdWVzW2ldOworICAgICAgICBtYXNrW2ldID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBhbHRlcm5hdGl2ZSBvcmRlcmVkIGluc2VydGlvbiBjb2RlOgorICAgICAgY29uc3QgSW5kZXggdDIwMCA9IHJvd3MvMTE7IC8vIDExID09IChsb2cyKDIwMCkqMS4zOSkKKyAgICAgIGNvbnN0IEluZGV4IHQgPSAocm93cyoxMDApLzEzOTsKKworICAgICAgLy8gRklYTUUgcmVzZXJ2ZSBubnogbm9uIHplcm9zCisgICAgICAvLyBGSVhNRSBpbXBsZW1lbnQgZmFzdGVyIHNvcnRpbmcgYWxnb3JpdGhtcyBmb3IgdmVyeSBzbWFsbCBubnoKKyAgICAgIC8vIGlmIHRoZSByZXN1bHQgaXMgc3BhcnNlIGVub3VnaCA9PiB1c2UgYSBxdWljayBzb3J0CisgICAgICAvLyBvdGhlcndpc2UgPT4gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgdmVjdG9yCisgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCB0byBwZXJmb3JtIGFuIGV4cGVuc2l2ZSBsb2cyIHdoZW4gdGhlCisgICAgICAvLyByZXN1bHQgaXMgY2xlYXJseSB2ZXJ5IHNwYXJzZSB3ZSB1c2UgYSBsaW5lYXIgYm91bmQgdXAgdG8gMjAwLgorICAgICAgaWYoKG5uejwyMDAgJiYgbm56PHQyMDApIHx8IG5ueiAqIG51bWV4dDo6bG9nMihpbnQobm56KSkgPCB0KQorICAgICAgeworICAgICAgICBpZihubno+MSkgc3RkOjpzb3J0KGluZGljZXMsaW5kaWNlcytubnopOworICAgICAgICBmb3IoSW5kZXggaz0wOyBrPG5uejsgKytrKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggaSA9IGluZGljZXNba107CisgICAgICAgICAgcmVzLmluc2VydEJhY2tCeU91dGVySW5uZXIoaixpKSA9IHZhbHVlc1tpXTsKKyAgICAgICAgICBtYXNrW2ldID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gZGVuc2UgcGF0aAorICAgICAgICBmb3IoSW5kZXggaT0wOyBpPHJvd3M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGlmKG1hc2tbaV0pCisgICAgICAgICAgeworICAgICAgICAgICAgbWFza1tpXSA9IGZhbHNlOworICAgICAgICAgICAgcmVzLmluc2VydEJhY2tCeU91dGVySW5uZXIoaixpKSA9IHZhbHVlc1tpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmVzLmZpbmFsaXplKCk7Cit9CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlLAorICBpbnQgTGhzU3RvcmFnZU9yZGVyID0gKHRyYWl0czxMaHM+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICBpbnQgUmhzU3RvcmFnZU9yZGVyID0gKHRyYWl0czxSaHM+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICBpbnQgUmVzU3RvcmFnZU9yZGVyID0gKHRyYWl0czxSZXN1bHRUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxDb2xNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGUgTGhzQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNDbGVhbmVkOjpTY2FsYXIgU2NhbGFyOworCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixSb3dNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IFJvd01ham9yTWF0cml4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IENvbE1ham9yTWF0cml4QXV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3BhcnNlX2V2YWw8Q29sTWFqb3JNYXRyaXhBdXgsUmVzdWx0VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsUmVzdWx0VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsQ29sTWFqb3JNYXRyaXhBdXg6OkZsYWdzPjo6dHlwZSBDb2xNYWpvck1hdHJpeDsKKyAgICAKKyAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHRhbGwgYW5kIHRoaW4gKGluIHRoZSBleHRyZW1lIGNhc2UgYSBjb2x1bW4gdmVjdG9yKQorICAgIC8vIHRoZW4gaXQgaXMgZmFzdGVyIHRvIHNvcnQgdGhlIGNvZWZmaWNpZW50cyBpbnBsYWNlIGluc3RlYWQgb2YgdHJhbnNwb3NpbmcgdHdpY2UuCisgICAgLy8gRklYTUUsIHRoZSBmb2xsb3dpbmcgaGV1cmlzdGljIGlzIHByb2JhYmx5IG5vdCB2ZXJ5IGdvb2QuCisgICAgaWYobGhzLnJvd3MoKT5yaHMuY29scygpKQorICAgIHsKKyAgICAgIENvbE1ham9yTWF0cml4IHJlc0NvbChsaHMucm93cygpLHJocy5jb2xzKCkpOworICAgICAgLy8gcGVyZm9ybSBzb3J0ZWQgaW5zZXJ0aW9uCisgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9pbXBsPExocyxSaHMsQ29sTWFqb3JNYXRyaXg+KGxocywgcmhzLCByZXNDb2wsIHRydWUpOworICAgICAgcmVzID0gcmVzQ29sLm1hcmtBc1JWYWx1ZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ29sTWFqb3JNYXRyaXhBdXggcmVzQ29sKGxocy5yb3dzKCkscmhzLmNvbHMoKSk7CisgICAgICAvLyByZXNzb3J0IHRvIHRyYW5zcG9zZSB0byBzb3J0IHRoZSBlbnRyaWVzCisgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9pbXBsPExocyxSaHMsQ29sTWFqb3JNYXRyaXhBdXg+KGxocywgcmhzLCByZXNDb2wsIGZhbHNlKTsKKyAgICAgIFJvd01ham9yTWF0cml4IHJlc1JvdyhyZXNDb2wpOworICAgICAgcmVzID0gcmVzUm93Lm1hcmtBc1JWYWx1ZSgpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsQ29sTWFqb3IsQ29sTWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsUm93TWFqb3IsdHlwZW5hbWUgUmVzdWx0VHlwZTo6U3RvcmFnZUluZGV4PiBSb3dNYWpvck1hdHJpeDsKKyAgICAgUm93TWFqb3JNYXRyaXggcmhzUm93ID0gcmhzOworICAgICBSb3dNYWpvck1hdHJpeCByZXNSb3cobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisgICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8Um93TWFqb3JNYXRyaXgsTGhzLFJvd01ham9yTWF0cml4PihyaHNSb3csIGxocywgcmVzUm93KTsKKyAgICAgcmVzID0gcmVzUm93OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLFJvd01ham9yLHR5cGVuYW1lIFJlc3VsdFR5cGU6OlN0b3JhZ2VJbmRleD4gUm93TWFqb3JNYXRyaXg7CisgICAgUm93TWFqb3JNYXRyaXggbGhzUm93ID0gbGhzOworICAgIFJvd01ham9yTWF0cml4IHJlc1JvdyhsaHMucm93cygpLCByaHMuY29scygpKTsKKyAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9pbXBsPFJocyxSb3dNYWpvck1hdHJpeCxSb3dNYWpvck1hdHJpeD4ocmhzLCBsaHNSb3csIHJlc1Jvdyk7CisgICAgcmVzID0gcmVzUm93OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLFJvd01ham9yLHR5cGVuYW1lIFJlc3VsdFR5cGU6OlN0b3JhZ2VJbmRleD4gUm93TWFqb3JNYXRyaXg7CisgICAgUm93TWFqb3JNYXRyaXggcmVzUm93KGxocy5yb3dzKCksIHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8UmhzLExocyxSb3dNYWpvck1hdHJpeD4ocmhzLCBsaHMsIHJlc1Jvdyk7CisgICAgcmVzID0gcmVzUm93OworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLENvbE1ham9yLFJvd01ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU+OjpTY2FsYXIgU2NhbGFyOworCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IENvbE1ham9yTWF0cml4OworICAgIENvbE1ham9yTWF0cml4IHJlc0NvbChsaHMucm93cygpLCByaHMuY29scygpKTsKKyAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9pbXBsPExocyxSaHMsQ29sTWFqb3JNYXRyaXg+KGxocywgcmhzLCByZXNDb2wpOworICAgIHJlcyA9IHJlc0NvbDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsQ29sTWFqb3IsUm93TWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IENvbE1ham9yTWF0cml4OworICAgIENvbE1ham9yTWF0cml4IGxoc0NvbCA9IGxoczsKKyAgICBDb2xNYWpvck1hdHJpeCByZXNDb2wobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3RfaW1wbDxDb2xNYWpvck1hdHJpeCxSaHMsQ29sTWFqb3JNYXRyaXg+KGxoc0NvbCwgcmhzLCByZXNDb2wpOworICAgIHJlcyA9IHJlc0NvbDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsQ29sTWFqb3IsUm93TWFqb3IsUm93TWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IENvbE1ham9yTWF0cml4OworICAgIENvbE1ham9yTWF0cml4IHJoc0NvbCA9IHJoczsKKyAgICBDb2xNYWpvck1hdHJpeCByZXNDb2wobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3RfaW1wbDxMaHMsQ29sTWFqb3JNYXRyaXgsQ29sTWFqb3JNYXRyaXg+KGxocywgcmhzQ29sLCByZXNDb2wpOworICAgIHJlcyA9IHJlc0NvbDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsUm93TWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixSb3dNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IFJvd01ham9yTWF0cml4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IENvbE1ham9yTWF0cml4OworICAgIFJvd01ham9yTWF0cml4IHJlc1JvdyhsaHMucm93cygpLHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8UmhzLExocyxSb3dNYWpvck1hdHJpeD4ocmhzLCBsaHMsIHJlc1Jvdyk7CisgICAgLy8gc29ydCB0aGUgbm9uIHplcm9zOgorICAgIENvbE1ham9yTWF0cml4IHJlc0NvbChyZXNSb3cpOworICAgIHJlcyA9IHJlc0NvbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdGF0aWMgdm9pZCBzcGFyc2Vfc3BhcnNlX3RvX2RlbnNlX3Byb2R1Y3RfaW1wbChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU6OlNjYWxhciBTY2FsYXI7CisgIEluZGV4IGNvbHMgPSByaHMub3V0ZXJTaXplKCk7CisgIGVpZ2VuX2Fzc2VydChsaHMub3V0ZXJTaXplKCkgPT0gcmhzLmlubmVyU2l6ZSgpKTsKKworICBldmFsdWF0b3I8TGhzPiBsaHNFdmFsKGxocyk7CisgIGV2YWx1YXRvcjxSaHM+IHJoc0V2YWwocmhzKTsKKworICBmb3IgKEluZGV4IGo9MDsgajxjb2xzOyArK2opCisgIHsKKyAgICBmb3IgKHR5cGVuYW1lIGV2YWx1YXRvcjxSaHM+OjpJbm5lckl0ZXJhdG9yIHJoc0l0KHJoc0V2YWwsIGopOyByaHNJdDsgKytyaHNJdCkKKyAgICB7CisgICAgICBTY2FsYXIgeSA9IHJoc0l0LnZhbHVlKCk7CisgICAgICBJbmRleCBrID0gcmhzSXQuaW5kZXgoKTsKKyAgICAgIGZvciAodHlwZW5hbWUgZXZhbHVhdG9yPExocz46OklubmVySXRlcmF0b3IgbGhzSXQobGhzRXZhbCwgayk7IGxoc0l0OyArK2xoc0l0KQorICAgICAgeworICAgICAgICBJbmRleCBpID0gbGhzSXQuaW5kZXgoKTsKKyAgICAgICAgU2NhbGFyIHggPSBsaHNJdC52YWx1ZSgpOworICAgICAgICByZXMuY29lZmZSZWYoaSxqKSArPSB4ICogeTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGUsCisgIGludCBMaHNTdG9yYWdlT3JkZXIgPSAodHJhaXRzPExocz46OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgIGludCBSaHNTdG9yYWdlT3JkZXIgPSAodHJhaXRzPFJocz46OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3I+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV90b19kZW5zZV9wcm9kdWN0X3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3RvX2RlbnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLENvbE1ham9yPgoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMpCisgIHsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV90b19kZW5zZV9wcm9kdWN0X2ltcGw8TGhzLFJocyxSZXN1bHRUeXBlPihsaHMsIHJocywgcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV90b19kZW5zZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixDb2xNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yLHR5cGVuYW1lIFJlc3VsdFR5cGU6OlN0b3JhZ2VJbmRleD4gQ29sTWFqb3JNYXRyaXg7CisgICAgQ29sTWFqb3JNYXRyaXggbGhzQ29sKGxocyk7CisgICAgaW50ZXJuYWw6OnNwYXJzZV9zcGFyc2VfdG9fZGVuc2VfcHJvZHVjdF9pbXBsPENvbE1ham9yTWF0cml4LFJocyxSZXN1bHRUeXBlPihsaHNDb2wsIHJocywgcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV90b19kZW5zZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxDb2xNYWpvcixSb3dNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yLHR5cGVuYW1lIFJlc3VsdFR5cGU6OlN0b3JhZ2VJbmRleD4gQ29sTWFqb3JNYXRyaXg7CisgICAgQ29sTWFqb3JNYXRyaXggcmhzQ29sKHJocyk7CisgICAgaW50ZXJuYWw6OnNwYXJzZV9zcGFyc2VfdG9fZGVuc2VfcHJvZHVjdF9pbXBsPExocyxDb2xNYWpvck1hdHJpeCxSZXN1bHRUeXBlPihsaHMsIHJoc0NvbCwgcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV90b19kZW5zZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixSb3dNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgVHJhbnNwb3NlPFJlc3VsdFR5cGU+IHRyUmVzKHJlcyk7CisgICAgaW50ZXJuYWw6OnNwYXJzZV9zcGFyc2VfdG9fZGVuc2VfcHJvZHVjdF9pbXBsPFJocyxMaHMsVHJhbnNwb3NlPFJlc3VsdFR5cGU+ID4ocmhzLCBsaHMsIHRyUmVzKTsKKyAgfQorfTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT05TRVJWQVRJVkVTUEFSU0VTUEFSU0VQUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL01hcHBlZFNwYXJzZU1hdHJpeC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvTWFwcGVkU3BhcnNlTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3MThjOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL01hcHBlZFNwYXJzZU1hdHJpeC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BUFBFRF9TUEFSU0VNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9NQVBQRURfU1BBUlNFTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxkZXByZWNhdGVkIFVzZSBNYXA8U3BhcnNlTWF0cml4PD4gPgorICAqIFxjbGFzcyBNYXBwZWRTcGFyc2VNYXRyaXgKKyAgKgorICAqIFxicmllZiBTcGFyc2UgbWF0cml4CisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogU2VlIGh0dHA6Ly93d3cubmV0bGliLm9yZy9saW5hbGcvaHRtbF90ZW1wbGF0ZXMvbm9kZTkxLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIHN0b3JhZ2Ugc2NoZW1lLgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3N0cnVjdCB0cmFpdHM8TWFwcGVkU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9GbGFncywgX1N0b3JhZ2VJbmRleD4gPiA6IHRyYWl0czxTcGFyc2VNYXRyaXg8X1NjYWxhciwgX0ZsYWdzLCBfU3RvcmFnZUluZGV4PiA+Cit7fTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0ZsYWdzLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorY2xhc3MgTWFwcGVkU3BhcnNlTWF0cml4CisgIDogcHVibGljIE1hcDxTcGFyc2VNYXRyaXg8X1NjYWxhciwgX0ZsYWdzLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgICAgdHlwZWRlZiBNYXA8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9GbGFncywgX1N0b3JhZ2VJbmRleD4gPiBCYXNlOworCisgIHB1YmxpYzoKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworCisgICAgaW5saW5lIE1hcHBlZFNwYXJzZU1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBubnosIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0ciwgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyLCBTY2FsYXIqIHZhbHVlUHRyLCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0ciA9IDApCisgICAgICA6IEJhc2Uocm93cywgY29scywgbm56LCBvdXRlckluZGV4UHRyLCBpbm5lckluZGV4UHRyLCB2YWx1ZVB0ciwgaW5uZXJOb25aZXJvUHRyKQorICAgIHt9CisKKyAgICAvKiogRW1wdHkgZGVzdHJ1Y3RvciAqLworICAgIGlubGluZSB+TWFwcGVkU3BhcnNlTWF0cml4KCkge30KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3N0cnVjdCBldmFsdWF0b3I8TWFwcGVkU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gPgorICA6IGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxNYXBwZWRTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4PiA+ID4KK3sKKyAgdHlwZWRlZiBNYXBwZWRTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4PiBYcHJUeXBlOworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxYcHJUeXBlPiA+IEJhc2U7CisgIAorICBldmFsdWF0b3IoKSA6IEJhc2UoKSB7fQorICBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSAmbWF0KSA6IEJhc2UobWF0KSB7fQorfTsKKworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BUFBFRF9TUEFSU0VNQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQXNzaWduLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VBc3NpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM1MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQXNzaWduLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRUFTU0lHTl9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRUFTU0lHTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiAgICAKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0Rlcml2ZWQmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIC8vIFRPRE8gdXNlIHRoZSBldmFsdWF0b3IgbWVjaGFuaXNtCisgIG90aGVyLmV2YWxUbyhkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIERlcml2ZWQmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICAvLyBieSBkZWZhdWx0IHNwYXJzZSBldmFsdWF0aW9uIGRvIG5vdCBhbGlhcywgc28gd2UgY2FuIHNhZmVseSBieXBhc3MgdGhlIGdlbmVyaWMgY2FsbF9hc3NpZ25tZW50IHJvdXRpbmUKKyAgaW50ZXJuYWw6OkFzc2lnbm1lbnQ8RGVyaXZlZCxPdGhlckRlcml2ZWQsaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+ID4KKyAgICAgICAgICA6OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+KCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIERlcml2ZWQmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBEZXJpdmVkJiBvdGhlcikKK3sKKyAgaW50ZXJuYWw6OmNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBzdG9yYWdlX2tpbmRfdG9fZXZhbHVhdG9yX2tpbmQ8U3BhcnNlPiB7CisgIHR5cGVkZWYgSXRlcmF0b3JCYXNlZCBLaW5kOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IHN0b3JhZ2Vfa2luZF90b19zaGFwZTxTcGFyc2U+IHsKKyAgdHlwZWRlZiBTcGFyc2VTaGFwZSBTaGFwZTsKK307CisKK3N0cnVjdCBTcGFyc2UyU3BhcnNlIHt9Oworc3RydWN0IFNwYXJzZTJEZW5zZSAge307CisKK3RlbXBsYXRlPD4gc3RydWN0IEFzc2lnbm1lbnRLaW5kPFNwYXJzZVNoYXBlLCBTcGFyc2VTaGFwZT4gICAgICAgICAgIHsgdHlwZWRlZiBTcGFyc2UyU3BhcnNlIEtpbmQ7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxTcGFyc2VTaGFwZSwgU3BhcnNlVHJpYW5ndWxhclNoYXBlPiB7IHR5cGVkZWYgU3BhcnNlMlNwYXJzZSBLaW5kOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgQXNzaWdubWVudEtpbmQ8RGVuc2VTaGFwZSwgIFNwYXJzZVNoYXBlPiAgICAgICAgICAgeyB0eXBlZGVmIFNwYXJzZTJEZW5zZSAgS2luZDsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IEFzc2lnbm1lbnRLaW5kPERlbnNlU2hhcGUsICBTcGFyc2VUcmlhbmd1bGFyU2hhcGU+IHsgdHlwZWRlZiBTcGFyc2UyRGVuc2UgIEtpbmQ7IH07CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KK3ZvaWQgYXNzaWduX3NwYXJzZV90b19zcGFyc2UoRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdFhwclR5cGU+IERzdEV2YWx1YXRvclR5cGU7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmNYcHJUeXBlPiBTcmNFdmFsdWF0b3JUeXBlOworCisgIFNyY0V2YWx1YXRvclR5cGUgc3JjRXZhbHVhdG9yKHNyYyk7CisKKyAgY29uc3QgYm9vbCB0cmFuc3Bvc2UgPSAoRHN0RXZhbHVhdG9yVHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKFNyY0V2YWx1YXRvclR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpOworICBjb25zdCBJbmRleCBvdXRlckV2YWx1YXRpb25TaXplID0gKFNyY0V2YWx1YXRvclR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA/IHNyYy5yb3dzKCkgOiBzcmMuY29scygpOworICBpZiAoKCF0cmFuc3Bvc2UpICYmIHNyYy5pc1JWYWx1ZSgpKQorICB7CisgICAgLy8gZXZhbCB3aXRob3V0IHRlbXBvcmFyeQorICAgIGRzdC5yZXNpemUoc3JjLnJvd3MoKSwgc3JjLmNvbHMoKSk7CisgICAgZHN0LnNldFplcm8oKTsKKyAgICBkc3QucmVzZXJ2ZSgoc3RkOjptYXgpKHNyYy5yb3dzKCksc3JjLmNvbHMoKSkqMik7CisgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJFdmFsdWF0aW9uU2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGRzdC5zdGFydFZlYyhqKTsKKyAgICAgIGZvciAodHlwZW5hbWUgU3JjRXZhbHVhdG9yVHlwZTo6SW5uZXJJdGVyYXRvciBpdChzcmNFdmFsdWF0b3IsIGopOyBpdDsgKytpdCkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIHYgPSBpdC52YWx1ZSgpOworICAgICAgICBkc3QuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGl0LmluZGV4KCkpID0gdjsKKyAgICAgIH0KKyAgICB9CisgICAgZHN0LmZpbmFsaXplKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gZXZhbCB0aHJvdWdoIGEgdGVtcG9yYXJ5CisgICAgZWlnZW5fYXNzZXJ0KCggKChpbnRlcm5hbDo6dHJhaXRzPERzdFhwclR5cGU+OjpTdXBwb3J0ZWRBY2Nlc3NQYXR0ZXJucyAmIE91dGVyUmFuZG9tQWNjZXNzUGF0dGVybik9PU91dGVyUmFuZG9tQWNjZXNzUGF0dGVybikgfHwKKyAgICAgICAgICAgICAgKCEoKERzdEV2YWx1YXRvclR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpICE9IChTcmNFdmFsdWF0b3JUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSkpKSAmJgorICAgICAgICAgICAgICAidGhlIHRyYW5zcG9zZSBvcGVyYXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBpbiBTcGFyc2VNYXRyaXg6Om9wZXJhdG9yPSIpOworCisgICAgZW51bSB7IEZsaXAgPSAoRHN0RXZhbHVhdG9yVHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKFNyY0V2YWx1YXRvclR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpIH07CisKKyAgICAKKyAgICBEc3RYcHJUeXBlIHRlbXAoc3JjLnJvd3MoKSwgc3JjLmNvbHMoKSk7CisKKyAgICB0ZW1wLnJlc2VydmUoKHN0ZDo6bWF4KShzcmMucm93cygpLHNyYy5jb2xzKCkpKjIpOworICAgIGZvciAoSW5kZXggaj0wOyBqPG91dGVyRXZhbHVhdGlvblNpemU7ICsraikKKyAgICB7CisgICAgICB0ZW1wLnN0YXJ0VmVjKGopOworICAgICAgZm9yICh0eXBlbmFtZSBTcmNFdmFsdWF0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KHNyY0V2YWx1YXRvciwgaik7IGl0OyArK2l0KQorICAgICAgeworICAgICAgICBTY2FsYXIgdiA9IGl0LnZhbHVlKCk7CisgICAgICAgIHRlbXAuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihGbGlwP2l0LmluZGV4KCk6aixGbGlwP2o6aXQuaW5kZXgoKSkgPSB2OworICAgICAgfQorICAgIH0KKyAgICB0ZW1wLmZpbmFsaXplKCk7CisKKyAgICBkc3QgPSB0ZW1wLm1hcmtBc1JWYWx1ZSgpOworICB9Cit9CisKKy8vIEdlbmVyaWMgU3BhcnNlIHRvIFNwYXJzZSBhc3NpZ25tZW50Cit0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZSwgdHlwZW5hbWUgRnVuY3Rvcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFNyY1hwclR5cGUsIEZ1bmN0b3IsIFNwYXJzZTJTcGFyc2U+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPiAmLypmdW5jKi8pCisgIHsKKyAgICBhc3NpZ25fc3BhcnNlX3RvX3NwYXJzZShkc3QuZGVyaXZlZCgpLCBzcmMuZGVyaXZlZCgpKTsKKyAgfQorfTsKKworLy8gR2VuZXJpYyBTcGFyc2UgdG8gRGVuc2UgYXNzaWdubWVudAordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGUsIHR5cGVuYW1lIEZ1bmN0b3I+CitzdHJ1Y3QgQXNzaWdubWVudDxEc3RYcHJUeXBlLCBTcmNYcHJUeXBlLCBGdW5jdG9yLCBTcGFyc2UyRGVuc2U+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgRnVuY3RvciAmZnVuYykKKyAgeworICAgIGlmKGludGVybmFsOjppc19zYW1lPEZ1bmN0b3IsaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPiA+Ojp2YWx1ZSkKKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgCisgICAgaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmNYcHJUeXBlPiBzcmNFdmFsKHNyYyk7CisgICAgcmVzaXplX2lmX2FsbG93ZWQoZHN0LCBzcmMsIGZ1bmMpOworICAgIGludGVybmFsOjpldmFsdWF0b3I8RHN0WHByVHlwZT4gZHN0RXZhbChkc3QpOworICAgIAorICAgIGNvbnN0IEluZGV4IG91dGVyRXZhbHVhdGlvblNpemUgPSAoaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmNYcHJUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gc3JjLnJvd3MoKSA6IHNyYy5jb2xzKCk7CisgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJFdmFsdWF0aW9uU2l6ZTsgKytqKQorICAgICAgZm9yICh0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbHVhdG9yPFNyY1hwclR5cGU+OjpJbm5lckl0ZXJhdG9yIGkoc3JjRXZhbCxqKTsgaTsgKytpKQorICAgICAgICBmdW5jLmFzc2lnbkNvZWZmKGRzdEV2YWwuY29lZmZSZWYoaS5yb3coKSxpLmNvbCgpKSwgaS52YWx1ZSgpKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yICJkc3QgPSBkZWMuc29sdmUocmhzKSIKKy8vIE5PVEUgd2UgbmVlZCB0byBzcGVjaWFsaXplIGl0IGZvciBTcGFyc2UyU3BhcnNlIHRvIGF2b2lkIGFtYmlndW91cyBzcGVjaWFsaXphdGlvbiBlcnJvcgordGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgRGVjVHlwZSwgdHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU29sdmU8RGVjVHlwZSxSaHNUeXBlPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiwgU3BhcnNlMlNwYXJzZT4KK3sKKyAgdHlwZWRlZiBTb2x2ZTxEZWNUeXBlLFJoc1R5cGU+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsU2NhbGFyPiAmKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisKKyAgICBzcmMuZGVjKCkuX3NvbHZlX2ltcGwoc3JjLnJocygpLCBkc3QpOworICB9Cit9OworCitzdHJ1Y3QgRGlhZ29uYWwyU3BhcnNlIHt9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxTcGFyc2VTaGFwZSxEaWFnb25hbFNoYXBlPiB7IHR5cGVkZWYgRGlhZ29uYWwyU3BhcnNlIEtpbmQ7IH07CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlLCB0eXBlbmFtZSBGdW5jdG9yPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3JjWHByVHlwZSwgRnVuY3RvciwgRGlhZ29uYWwyU3BhcnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERzdFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBBcnJheTxTdG9yYWdlSW5kZXgsRHluYW1pYywxPiBBcnJheVhJOworICB0eXBlZGVmIEFycmF5PFNjYWxhcixEeW5hbWljLDE+IEFycmF5WFM7CisgIHRlbXBsYXRlPGludCBPcHRpb25zPgorICBzdGF0aWMgdm9pZCBydW4oU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zLFN0b3JhZ2VJbmRleD4gJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeworICAgIEluZGV4IGRzdFJvd3MgPSBzcmMucm93cygpOworICAgIEluZGV4IGRzdENvbHMgPSBzcmMuY29scygpOworICAgIGlmKChkc3Qucm93cygpIT1kc3RSb3dzKSB8fCAoZHN0LmNvbHMoKSE9ZHN0Q29scykpCisgICAgICBkc3QucmVzaXplKGRzdFJvd3MsIGRzdENvbHMpOworCisgICAgSW5kZXggc2l6ZSA9IHNyYy5kaWFnb25hbCgpLnNpemUoKTsKKyAgICBkc3QubWFrZUNvbXByZXNzZWQoKTsKKyAgICBkc3QucmVzaXplTm9uWmVyb3Moc2l6ZSk7CisgICAgTWFwPEFycmF5WEk+KGRzdC5pbm5lckluZGV4UHRyKCksIHNpemUpLnNldExpblNwYWNlZCgwLFN0b3JhZ2VJbmRleChzaXplKS0xKTsKKyAgICBNYXA8QXJyYXlYST4oZHN0Lm91dGVySW5kZXhQdHIoKSwgc2l6ZSsxKS5zZXRMaW5TcGFjZWQoMCxTdG9yYWdlSW5kZXgoc2l6ZSkpOworICAgIE1hcDxBcnJheVhTPihkc3QudmFsdWVQdHIoKSwgc2l6ZSkgPSBzcmMuZGlhZ29uYWwoKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0RGVyaXZlZD4KKyAgc3RhdGljIHZvaWQgcnVuKFNwYXJzZU1hdHJpeEJhc2U8RHN0RGVyaXZlZD4gJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeworICAgIGRzdC5kaWFnb25hbCgpID0gc3JjLmRpYWdvbmFsKCk7CisgIH0KKyAgCisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJi8qZnVuYyovKQorICB7IGRzdC5kaWFnb25hbCgpICs9IHNyYy5kaWFnb25hbCgpOyB9CisgIAorICBzdGF0aWMgdm9pZCBydW4oRHN0WHByVHlwZSAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjpzdWJfYXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeyBkc3QuZGlhZ29uYWwoKSAtPSBzcmMuZGlhZ29uYWwoKTsgfQorfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRUFTU0lHTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VCbG9jay5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFlOTJiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQmxvY2suaApAQCAtMCwwICsxLDYwMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0JMT0NLX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0JMT0NLX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLy8gU3Vic2V0IG9mIGNvbHVtbnMgb3Igcm93cwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgaW50IEJsb2NrUm93cywgaW50IEJsb2NrQ29scz4KK2NsYXNzIEJsb2NrSW1wbDxYcHJUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHMsdHJ1ZSxTcGFyc2U+CisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8QmxvY2s8WHByVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLHRydWU+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUgX01hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiBCbG9jazxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgdHJ1ZT4gQmxvY2tUeXBlOworcHVibGljOgorICAgIGVudW0geyBJc1Jvd01ham9yID0gaW50ZXJuYWw6OnRyYWl0czxCbG9ja1R5cGU+OjpJc1Jvd01ham9yIH07Citwcm90ZWN0ZWQ6CisgICAgZW51bSB7IE91dGVyU2l6ZSA9IElzUm93TWFqb3IgPyBCbG9ja1Jvd3MgOiBCbG9ja0NvbHMgfTsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeEJhc2U8QmxvY2tUeXBlPiBCYXNlOworICAgIHVzaW5nIEJhc2U6OmNvbnZlcnRfaW5kZXg7CitwdWJsaWM6CisgICAgRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoQmxvY2tUeXBlKQorCisgICAgaW5saW5lIEJsb2NrSW1wbChYcHJUeXBlJiB4cHIsIEluZGV4IGkpCisgICAgICA6IG1fbWF0cml4KHhwciksIG1fb3V0ZXJTdGFydChjb252ZXJ0X2luZGV4KGkpKSwgbV9vdXRlclNpemUoT3V0ZXJTaXplKQorICAgIHt9CisKKyAgICBpbmxpbmUgQmxvY2tJbXBsKFhwclR5cGUmIHhwciwgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLCBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKKyAgICAgIDogbV9tYXRyaXgoeHByKSwgbV9vdXRlclN0YXJ0KGNvbnZlcnRfaW5kZXgoSXNSb3dNYWpvciA/IHN0YXJ0Um93IDogc3RhcnRDb2wpKSwgbV9vdXRlclNpemUoY29udmVydF9pbmRleChJc1Jvd01ham9yID8gYmxvY2tSb3dzIDogYmxvY2tDb2xzKSkKKyAgICB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXJTaXplLnZhbHVlKCkgOiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9tYXRyaXguY29scygpIDogbV9vdXRlclNpemUudmFsdWUoKTsgfQorCisgICAgSW5kZXggbm9uWmVyb3MoKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgaW50ZXJuYWw6OmV2YWx1YXRvcjxYcHJUeXBlPiBFdmFsdWF0b3JUeXBlOworICAgICAgRXZhbHVhdG9yVHlwZSBtYXRFdmFsKG1fbWF0cml4KTsKKyAgICAgIEluZGV4IG5ueiA9IDA7CisgICAgICBJbmRleCBlbmQgPSBtX291dGVyU3RhcnQgKyBtX291dGVyU2l6ZS52YWx1ZSgpOworICAgICAgZm9yKEluZGV4IGo9bV9vdXRlclN0YXJ0OyBqPGVuZDsgKytqKQorICAgICAgICBmb3IodHlwZW5hbWUgRXZhbHVhdG9yVHlwZTo6SW5uZXJJdGVyYXRvciBpdChtYXRFdmFsLCBqKTsgaXQ7ICsraXQpCisgICAgICAgICAgKytubno7CisgICAgICByZXR1cm4gbm56OworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmKHJvdyArIChJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogMCksIGNvbCArIChJc1Jvd01ham9yID8gMCA6ICBtX291dGVyU3RhcnQpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogaW5kZXgsIElzUm93TWFqb3IgPyBpbmRleCA6ICBtX291dGVyU3RhcnQpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBYcHJUeXBlJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICBpbmxpbmUgWHByVHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4OyB9CisgICAgSW5kZXggc3RhcnRSb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogMDsgfQorICAgIEluZGV4IHN0YXJ0Q29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IDAgOiBtX291dGVyU3RhcnQ7IH0KKyAgICBJbmRleCBibG9ja1Jvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUudmFsdWUoKSA6IG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEluZGV4IGJsb2NrQ29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX21hdHJpeC5jb2xzKCkgOiBtX291dGVyU2l6ZS52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxYcHJUeXBlPjo6bm9uX2NvbnN0X3R5cGUgbV9tYXRyaXg7CisgICAgSW5kZXggbV9vdXRlclN0YXJ0OworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBPdXRlclNpemU+IG1fb3V0ZXJTaXplOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBEaXNhYmxlIGFzc2lnbm1lbnQgd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlLgorICAgIC8vIE5vdGUgdGhhdCBzaW1wbHkgcmVtb3Zpbmcgb3BlcmF0b3I9IHlpZWxkcyBjb21waWxhdGlvbiBlcnJvcnMgd2l0aCBJQ0MrTVNWQworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQmxvY2tJbXBsJiBvcGVyYXRvcj0oY29uc3QgVCYpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YoVCk9PTAsIFRISVNfU1BBUlNFX0JMT0NLX1NVQkVYUFJFU1NJT05fSVNfUkVBRF9PTkxZKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3BlY2lhbGl6YXRpb24gZm9yIFNwYXJzZU1hdHJpeAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzPgorY2xhc3Mgc3BhcnNlX21hdHJpeF9ibG9ja19pbXBsCisgIDogcHVibGljIFNwYXJzZUNvbXByZXNzZWRCYXNlPEJsb2NrPFNwYXJzZU1hdHJpeFR5cGUsQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgQmxvY2s8U3BhcnNlTWF0cml4VHlwZSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMsIHRydWU+IEJsb2NrVHlwZTsKKyAgICB0eXBlZGVmIFNwYXJzZUNvbXByZXNzZWRCYXNlPEJsb2NrPFNwYXJzZU1hdHJpeFR5cGUsQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiA+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29udmVydF9pbmRleDsKK3B1YmxpYzoKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IGludGVybmFsOjp0cmFpdHM8QmxvY2tUeXBlPjo6SXNSb3dNYWpvciB9OworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKEJsb2NrVHlwZSkKK3Byb3RlY3RlZDoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4VmVjdG9yIEluZGV4VmVjdG9yOworICAgIGVudW0geyBPdXRlclNpemUgPSBJc1Jvd01ham9yID8gQmxvY2tSb3dzIDogQmxvY2tDb2xzIH07CitwdWJsaWM6CisKKyAgICBpbmxpbmUgc3BhcnNlX21hdHJpeF9ibG9ja19pbXBsKFNwYXJzZU1hdHJpeFR5cGUmIHhwciwgSW5kZXggaSkKKyAgICAgIDogbV9tYXRyaXgoeHByKSwgbV9vdXRlclN0YXJ0KGNvbnZlcnRfaW5kZXgoaSkpLCBtX291dGVyU2l6ZShPdXRlclNpemUpCisgICAge30KKworICAgIGlubGluZSBzcGFyc2VfbWF0cml4X2Jsb2NrX2ltcGwoU3BhcnNlTWF0cml4VHlwZSYgeHByLCBJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wsIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQorICAgICAgOiBtX21hdHJpeCh4cHIpLCBtX291dGVyU3RhcnQoY29udmVydF9pbmRleChJc1Jvd01ham9yID8gc3RhcnRSb3cgOiBzdGFydENvbCkpLCBtX291dGVyU2l6ZShjb252ZXJ0X2luZGV4KElzUm93TWFqb3IgPyBibG9ja1Jvd3MgOiBibG9ja0NvbHMpKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIEJsb2NrVHlwZSYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWRNYXRyaXhUeXBlOworICAgICAgX05lc3RlZE1hdHJpeFR5cGUmIG1hdHJpeCA9IG1fbWF0cml4OworICAgICAgLy8gVGhpcyBhc3NpZ25tZW50IGlzIHNsb3cgaWYgdGhpcyB2ZWN0b3Igc2V0IGlzIG5vdCBlbXB0eQorICAgICAgLy8gYW5kL29yIGl0IGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBub256ZXJvcyBvZiB0aGUgdW5kZXJseWluZyBtYXRyaXguCisKKyAgICAgIC8vIDEgLSBldmFsIHRvIGEgdGVtcG9yYXJ5IHRvIGF2b2lkIHRyYW5zcG9zaXRpb24gYW5kL29yIGFsaWFzaW5nIGlzc3VlcworICAgICAgUmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxTY2FsYXIsIElzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLCBTdG9yYWdlSW5kZXg+ID4gdG1wKG90aGVyLmRlcml2ZWQoKSk7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQodG1wLm91dGVyU2l6ZSgpPT1tX291dGVyU2l6ZS52YWx1ZSgpKTsKKworICAgICAgLy8gMiAtIGxldCdzIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIGFsbG9jYXRlZCBtZW1vcnkKKyAgICAgIEluZGV4IG5ueiAgICAgICAgICAgPSB0bXAubm9uWmVyb3MoKTsKKyAgICAgIEluZGV4IHN0YXJ0ICAgICAgICAgPSBtX291dGVyU3RhcnQ9PTAgPyAwIDogbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydF07IC8vIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICBJbmRleCBlbmQgICAgICAgICAgID0gbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydCttX291dGVyU2l6ZS52YWx1ZSgpXTsgLy8gZW5kaW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICBJbmRleCBibG9ja19zaXplICAgID0gZW5kIC0gc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIHJvb20gaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgIEluZGV4IHRhaWxfc2l6ZSAgICAgPSBtX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9tYXRyaXgub3V0ZXJTaXplKCldIC0gZW5kOworCisgICAgICBJbmRleCBmcmVlX3NpemUgICAgID0gbV9tYXRyaXguaXNDb21wcmVzc2VkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbmRleChtYXRyaXguZGF0YSgpLmFsbG9jYXRlZFNpemUoKSkgKyBibG9ja19zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmxvY2tfc2l6ZTsKKworICAgICAgSW5kZXggdG1wX3N0YXJ0ID0gdG1wLm91dGVySW5kZXhQdHIoKVswXTsKKworICAgICAgYm9vbCB1cGRhdGVfdHJhaWxpbmdfcG9pbnRlcnMgPSBmYWxzZTsKKyAgICAgIGlmKG5uej5mcmVlX3NpemUpCisgICAgICB7CisgICAgICAgIC8vIHJlYWxsb2MgbWFudWFsbHkgdG8gcmVkdWNlIGNvcGllcworICAgICAgICB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTdG9yYWdlIG5ld2RhdGEobV9tYXRyaXguZGF0YSgpLmFsbG9jYXRlZFNpemUoKSAtIGJsb2NrX3NpemUgKyBubnopOworCisgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1fbWF0cml4LnZhbHVlUHRyKCksICAgICAgIG1fbWF0cml4LnZhbHVlUHRyKCkgKyBzdGFydCwgICAgICBuZXdkYXRhLnZhbHVlUHRyKCkpOworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShtX21hdHJpeC5pbm5lckluZGV4UHRyKCksICBtX21hdHJpeC5pbm5lckluZGV4UHRyKCkgKyBzdGFydCwgbmV3ZGF0YS5pbmRleFB0cigpKTsKKworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weSh0bXAudmFsdWVQdHIoKSArIHRtcF9zdGFydCwgICAgICB0bXAudmFsdWVQdHIoKSArIHRtcF9zdGFydCArIG5ueiwgICAgICAgbmV3ZGF0YS52YWx1ZVB0cigpICsgc3RhcnQpOworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weSh0bXAuaW5uZXJJbmRleFB0cigpICsgdG1wX3N0YXJ0LCB0bXAuaW5uZXJJbmRleFB0cigpICsgdG1wX3N0YXJ0ICsgbm56LCAgbmV3ZGF0YS5pbmRleFB0cigpICsgc3RhcnQpOworCisgICAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1hdHJpeC52YWx1ZVB0cigpK2VuZCwgICAgICAgbWF0cml4LnZhbHVlUHRyKCkrZW5kICsgdGFpbF9zaXplLCAgICAgIG5ld2RhdGEudmFsdWVQdHIoKStzdGFydCtubnopOworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShtYXRyaXguaW5uZXJJbmRleFB0cigpK2VuZCwgIG1hdHJpeC5pbm5lckluZGV4UHRyKCkrZW5kICsgdGFpbF9zaXplLCBuZXdkYXRhLmluZGV4UHRyKCkrc3RhcnQrbm56KTsKKworICAgICAgICBuZXdkYXRhLnJlc2l6ZShtX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9tYXRyaXgub3V0ZXJTaXplKCldIC0gYmxvY2tfc2l6ZSArIG5ueik7CisKKyAgICAgICAgbWF0cml4LmRhdGEoKS5zd2FwKG5ld2RhdGEpOworCisgICAgICAgIHVwZGF0ZV90cmFpbGluZ19wb2ludGVycyA9IHRydWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKG1fbWF0cml4LmlzQ29tcHJlc3NlZCgpKQorICAgICAgICB7CisgICAgICAgICAgLy8gbm8gbmVlZCB0byByZWFsbG9jLCBzaW1wbHkgY29weSB0aGUgdGFpbCBhdCBpdHMgcmVzcGVjdGl2ZSBwb3NpdGlvbiBhbmQgaW5zZXJ0IHRtcAorICAgICAgICAgIG1hdHJpeC5kYXRhKCkucmVzaXplKHN0YXJ0ICsgbm56ICsgdGFpbF9zaXplKTsKKworICAgICAgICAgIGludGVybmFsOjpzbWFydF9tZW1tb3ZlKG1hdHJpeC52YWx1ZVB0cigpK2VuZCwgICAgICBtYXRyaXgudmFsdWVQdHIoKSArIGVuZCt0YWlsX3NpemUsICAgICAgbWF0cml4LnZhbHVlUHRyKCkgKyBzdGFydCtubnopOworICAgICAgICAgIGludGVybmFsOjpzbWFydF9tZW1tb3ZlKG1hdHJpeC5pbm5lckluZGV4UHRyKCkrZW5kLCBtYXRyaXguaW5uZXJJbmRleFB0cigpICsgZW5kK3RhaWxfc2l6ZSwgbWF0cml4LmlubmVySW5kZXhQdHIoKSArIHN0YXJ0K25ueik7CisKKyAgICAgICAgICB1cGRhdGVfdHJhaWxpbmdfcG9pbnRlcnMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWw6OnNtYXJ0X2NvcHkodG1wLnZhbHVlUHRyKCkgKyB0bXBfc3RhcnQsICAgICAgdG1wLnZhbHVlUHRyKCkgKyB0bXBfc3RhcnQgKyBubnosICAgICAgIG1hdHJpeC52YWx1ZVB0cigpICsgc3RhcnQpOworICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weSh0bXAuaW5uZXJJbmRleFB0cigpICsgdG1wX3N0YXJ0LCB0bXAuaW5uZXJJbmRleFB0cigpICsgdG1wX3N0YXJ0ICsgbm56LCAgbWF0cml4LmlubmVySW5kZXhQdHIoKSArIHN0YXJ0KTsKKyAgICAgIH0KKworICAgICAgLy8gdXBkYXRlIG91dGVyIGluZGV4IHBvaW50ZXJzIGFuZCBpbm5lck5vblplcm9zCisgICAgICBpZihJc1ZlY3RvckF0Q29tcGlsZVRpbWUpCisgICAgICB7CisgICAgICAgIGlmKCFtX21hdHJpeC5pc0NvbXByZXNzZWQoKSkKKyAgICAgICAgICBtYXRyaXguaW5uZXJOb25aZXJvUHRyKClbbV9vdXRlclN0YXJ0XSA9IFN0b3JhZ2VJbmRleChubnopOworICAgICAgICBtYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydF0gPSBTdG9yYWdlSW5kZXgoc3RhcnQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTdG9yYWdlSW5kZXggcCA9IFN0b3JhZ2VJbmRleChzdGFydCk7CisgICAgICAgIGZvcihJbmRleCBrPTA7IGs8bV9vdXRlclNpemUudmFsdWUoKTsgKytrKQorICAgICAgICB7CisgICAgICAgICAgU3RvcmFnZUluZGV4IG5uel9rID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4Pih0bXAuaW5uZXJWZWN0b3Ioaykubm9uWmVyb3MoKSk7CisgICAgICAgICAgaWYoIW1fbWF0cml4LmlzQ29tcHJlc3NlZCgpKQorICAgICAgICAgICAgbWF0cml4LmlubmVyTm9uWmVyb1B0cigpW21fb3V0ZXJTdGFydCtrXSA9IG5uel9rOworICAgICAgICAgIG1hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0K2tdID0gcDsKKyAgICAgICAgICBwICs9IG5uel9rOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmKHVwZGF0ZV90cmFpbGluZ19wb2ludGVycykKKyAgICAgIHsKKyAgICAgICAgU3RvcmFnZUluZGV4IG9mZnNldCA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4obm56IC0gYmxvY2tfc2l6ZSk7CisgICAgICAgIGZvcihJbmRleCBrID0gbV9vdXRlclN0YXJ0ICsgbV9vdXRlclNpemUudmFsdWUoKTsgazw9bWF0cml4Lm91dGVyU2l6ZSgpOyArK2spCisgICAgICAgIHsKKyAgICAgICAgICBtYXRyaXgub3V0ZXJJbmRleFB0cigpW2tdICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgIGlubGluZSBCbG9ja1R5cGUmIG9wZXJhdG9yPShjb25zdCBCbG9ja1R5cGUmIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBvcGVyYXRvcj08QmxvY2tUeXBlPihvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fbWF0cml4LnZhbHVlUHRyKCk7IH0KKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpCisgICAgeyByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKTsgfQorCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0cigpIGNvbnN0CisgICAgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJJbmRleFB0cigpOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0cigpCisgICAgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJJbmRleFB0cigpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU3RvcmFnZUluZGV4KiBvdXRlckluZGV4UHRyKCkgY29uc3QKKyAgICB7IHJldHVybiBtX21hdHJpeC5vdXRlckluZGV4UHRyKCkgKyBtX291dGVyU3RhcnQ7IH0KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBvdXRlckluZGV4UHRyKCkKKyAgICB7IHJldHVybiBtX21hdHJpeC5vdXRlckluZGV4UHRyKCkgKyBtX291dGVyU3RhcnQ7IH0KKworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0cigpIGNvbnN0CisgICAgeyByZXR1cm4gaXNDb21wcmVzc2VkKCkgPyAwIDogKG1fbWF0cml4LmlubmVyTm9uWmVyb1B0cigpK21fb3V0ZXJTdGFydCk7IH0KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBpbm5lck5vblplcm9QdHIoKQorICAgIHsgcmV0dXJuIGlzQ29tcHJlc3NlZCgpID8gMCA6IChtX21hdHJpeC5pbm5lck5vblplcm9QdHIoKSttX291dGVyU3RhcnQpOyB9CisKKyAgICBib29sIGlzQ29tcHJlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmlubmVyTm9uWmVyb1B0cigpPT0wOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmZSZWYocm93ICsgKElzUm93TWFqb3IgPyBtX291dGVyU3RhcnQgOiAwKSwgY29sICsgKElzUm93TWFqb3IgPyAwIDogIG1fb3V0ZXJTdGFydCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmKHJvdyArIChJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogMCksIGNvbCArIChJc1Jvd01ham9yID8gMCA6ICBtX291dGVyU3RhcnQpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogaW5kZXgsIElzUm93TWFqb3IgPyBpbmRleCA6ICBtX291dGVyU3RhcnQpOworICAgIH0KKworICAgIGNvbnN0IFNjYWxhciYgbGFzdENvZWZmKCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKHNwYXJzZV9tYXRyaXhfYmxvY2tfaW1wbCk7CisgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bm9uWmVyb3MoKT4wKTsKKyAgICAgIGlmKG1fbWF0cml4LmlzQ29tcHJlc3NlZCgpKQorICAgICAgICByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0KzFdLTFdOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0XSttX21hdHJpeC5pbm5lck5vblplcm9QdHIoKVttX291dGVyU3RhcnRdLTFdOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyU2l6ZS52YWx1ZSgpIDogbV9tYXRyaXgucm93cygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fbWF0cml4LmNvbHMoKSA6IG1fb3V0ZXJTaXplLnZhbHVlKCk7IH0KKworICAgIGlubGluZSBjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4VHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4OyB9CisgICAgSW5kZXggc3RhcnRSb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclN0YXJ0IDogMDsgfQorICAgIEluZGV4IHN0YXJ0Q29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IDAgOiBtX291dGVyU3RhcnQ7IH0KKyAgICBJbmRleCBibG9ja1Jvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUudmFsdWUoKSA6IG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEluZGV4IGJsb2NrQ29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX21hdHJpeC5jb2xzKCkgOiBtX291dGVyU2l6ZS52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxTcGFyc2VNYXRyaXhUeXBlPjo6bm9uX2NvbnN0X3R5cGUgbV9tYXRyaXg7CisgICAgSW5kZXggbV9vdXRlclN0YXJ0OworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBPdXRlclNpemU+IG1fb3V0ZXJTaXplOworCit9OworCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXgsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitjbGFzcyBCbG9ja0ltcGw8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PixCbG9ja1Jvd3MsQmxvY2tDb2xzLHRydWUsU3BhcnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6c3BhcnNlX21hdHJpeF9ibG9ja19pbXBsPFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scz4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9TdG9yYWdlSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnNwYXJzZV9tYXRyaXhfYmxvY2tfaW1wbDxTcGFyc2VNYXRyaXhUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHM+IEJhc2U7CisgIGlubGluZSBCbG9ja0ltcGwoU3BhcnNlTWF0cml4VHlwZSYgeHByLCBJbmRleCBpKQorICAgIDogQmFzZSh4cHIsIGkpCisgIHt9CisKKyAgaW5saW5lIEJsb2NrSW1wbChTcGFyc2VNYXRyaXhUeXBlJiB4cHIsIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwgSW5kZXggYmxvY2tSb3dzLCBJbmRleCBibG9ja0NvbHMpCisgICAgOiBCYXNlKHhwciwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scykKKyAge30KKworICB1c2luZyBCYXNlOjpvcGVyYXRvcj07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXgsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitjbGFzcyBCbG9ja0ltcGw8Y29uc3QgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PixCbG9ja1Jvd3MsQmxvY2tDb2xzLHRydWUsU3BhcnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6c3BhcnNlX21hdHJpeF9ibG9ja19pbXBsPGNvbnN0IFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scz4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiBjb25zdCBTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9TdG9yYWdlSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnNwYXJzZV9tYXRyaXhfYmxvY2tfaW1wbDxTcGFyc2VNYXRyaXhUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHM+IEJhc2U7CisgIGlubGluZSBCbG9ja0ltcGwoU3BhcnNlTWF0cml4VHlwZSYgeHByLCBJbmRleCBpKQorICAgIDogQmFzZSh4cHIsIGkpCisgIHt9CisKKyAgaW5saW5lIEJsb2NrSW1wbChTcGFyc2VNYXRyaXhUeXBlJiB4cHIsIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwgSW5kZXggYmxvY2tSb3dzLCBJbmRleCBibG9ja0NvbHMpCisgICAgOiBCYXNlKHhwciwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scykKKyAge30KKworICB1c2luZyBCYXNlOjpvcGVyYXRvcj07Citwcml2YXRlOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBCbG9ja0ltcGwoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPiYgeHByLCBJbmRleCBpKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gQmxvY2tJbXBsKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD4mIHhwcik7Cit9OworCisvLy0tLS0tLS0tLS0KKworLyoqIFxyZXR1cm5zIHRoZSBcYSBvdXRlciAtdGggY29sdW1uIChyZXNwLiByb3cpIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMgaWYgXGMgKnRoaXMKKyAgKiBpcyBjb2wtbWFqb3IgKHJlc3AuIHJvdy1tYWpvcikuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordHlwZW5hbWUgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6SW5uZXJWZWN0b3JSZXR1cm5UeXBlIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OmlubmVyVmVjdG9yKEluZGV4IG91dGVyKQoreyByZXR1cm4gSW5uZXJWZWN0b3JSZXR1cm5UeXBlKGRlcml2ZWQoKSwgb3V0ZXIpOyB9CisKKy8qKiBccmV0dXJucyB0aGUgXGEgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IFxjICp0aGlzIGlmIFxjICp0aGlzCisgICogaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpLiBSZWFkLW9ubHkuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgdHlwZW5hbWUgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6Q29uc3RJbm5lclZlY3RvclJldHVyblR5cGUgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6aW5uZXJWZWN0b3IoSW5kZXggb3V0ZXIpIGNvbnN0Cit7IHJldHVybiBDb25zdElubmVyVmVjdG9yUmV0dXJuVHlwZShkZXJpdmVkKCksIG91dGVyKTsgfQorCisvKiogXHJldHVybnMgdGhlIFxhIG91dGVyIC10aCBjb2x1bW4gKHJlc3AuIHJvdykgb2YgdGhlIG1hdHJpeCBcYyAqdGhpcyBpZiBcYyAqdGhpcworICAqIGlzIGNvbC1tYWpvciAocmVzcC4gcm93LW1ham9yKS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0eXBlbmFtZSBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpJbm5lclZlY3RvcnNSZXR1cm5UeXBlCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojppbm5lclZlY3RvcnMoSW5kZXggb3V0ZXJTdGFydCwgSW5kZXggb3V0ZXJTaXplKQoreworICByZXR1cm4gQmxvY2s8RGVyaXZlZCxEeW5hbWljLER5bmFtaWMsdHJ1ZT4oZGVyaXZlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNSb3dNYWpvciA/IG91dGVyU3RhcnQgOiAwLCBJc1Jvd01ham9yID8gMCA6IG91dGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1Jvd01ham9yID8gb3V0ZXJTaXplIDogcm93cygpLCBJc1Jvd01ham9yID8gY29scygpIDogb3V0ZXJTaXplKTsKKworfQorCisvKiogXHJldHVybnMgdGhlIFxhIG91dGVyIC10aCBjb2x1bW4gKHJlc3AuIHJvdykgb2YgdGhlIG1hdHJpeCBcYyAqdGhpcyBpZiBcYyAqdGhpcworICAqIGlzIGNvbC1tYWpvciAocmVzcC4gcm93LW1ham9yKS4gUmVhZC1vbmx5LgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IHR5cGVuYW1lIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OkNvbnN0SW5uZXJWZWN0b3JzUmV0dXJuVHlwZQorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6aW5uZXJWZWN0b3JzKEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSkgY29uc3QKK3sKKyAgcmV0dXJuIEJsb2NrPGNvbnN0IERlcml2ZWQsRHluYW1pYyxEeW5hbWljLHRydWU+KGRlcml2ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNSb3dNYWpvciA/IG91dGVyU3RhcnQgOiAwLCBJc1Jvd01ham9yID8gMCA6IG91dGVyU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUm93TWFqb3IgPyBvdXRlclNpemUgOiByb3dzKCksIElzUm93TWFqb3IgPyBjb2xzKCkgOiBvdXRlclNpemUpOworCit9CisKKy8qKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHNwYXJzZSBCbG9jayBleHByZXNzaW9uLgorICAqIFJlYWwtb25seS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbD4KK2NsYXNzIEJsb2NrSW1wbDxYcHJUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHMsSW5uZXJQYW5lbCxTcGFyc2U+CisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8QmxvY2s8WHByVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLElubmVyUGFuZWw+ID4sIGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yCit7CisgICAgdHlwZWRlZiBCbG9jazxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbD4gQmxvY2tUeXBlOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4QmFzZTxCbG9ja1R5cGU+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29udmVydF9pbmRleDsKK3B1YmxpYzoKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IGludGVybmFsOjp0cmFpdHM8QmxvY2tUeXBlPjo6SXNSb3dNYWpvciB9OworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKEJsb2NrVHlwZSkKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKworICAgIC8qKiBDb2x1bW4gb3IgUm93IGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIGlubGluZSBCbG9ja0ltcGwoWHByVHlwZSYgeHByLCBJbmRleCBpKQorICAgICAgOiBtX21hdHJpeCh4cHIpLAorICAgICAgICBtX3N0YXJ0Um93KCAoQmxvY2tSb3dzPT0xKSAmJiAoQmxvY2tDb2xzPT1YcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgPyBjb252ZXJ0X2luZGV4KGkpIDogMCksCisgICAgICAgIG1fc3RhcnRDb2woIChCbG9ja1Jvd3M9PVhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSAmJiAoQmxvY2tDb2xzPT0xKSA/IGNvbnZlcnRfaW5kZXgoaSkgOiAwKSwKKyAgICAgICAgbV9ibG9ja1Jvd3MoQmxvY2tSb3dzPT0xID8gMSA6IHhwci5yb3dzKCkpLAorICAgICAgICBtX2Jsb2NrQ29scyhCbG9ja0NvbHM9PTEgPyAxIDogeHByLmNvbHMoKSkKKyAgICB7fQorCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBpbmxpbmUgQmxvY2tJbXBsKFhwclR5cGUmIHhwciwgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLCBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKKyAgICAgIDogbV9tYXRyaXgoeHByKSwgbV9zdGFydFJvdyhjb252ZXJ0X2luZGV4KHN0YXJ0Um93KSksIG1fc3RhcnRDb2woY29udmVydF9pbmRleChzdGFydENvbCkpLCBtX2Jsb2NrUm93cyhjb252ZXJ0X2luZGV4KGJsb2NrUm93cykpLCBtX2Jsb2NrQ29scyhjb252ZXJ0X2luZGV4KGJsb2NrQ29scykpCisgICAge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja1Jvd3MudmFsdWUoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja0NvbHMudmFsdWUoKTsgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmUmVmKHJvdyArIG1fc3RhcnRSb3cudmFsdWUoKSwgY29sICsgbV9zdGFydENvbC52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihyb3cgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbCArIG1fc3RhcnRDb2wudmFsdWUoKSk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmUmVmKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0Q29sLnZhbHVlKCkgKyAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IGluZGV4IDogMCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0Q29sLnZhbHVlKCkgKyAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IGluZGV4IDogMCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBYcHJUeXBlJiBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICBpbmxpbmUgWHByVHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4OyB9CisgICAgSW5kZXggc3RhcnRSb3coKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0Um93LnZhbHVlKCk7IH0KKyAgICBJbmRleCBzdGFydENvbCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRDb2wudmFsdWUoKTsgfQorICAgIEluZGV4IGJsb2NrUm93cygpIGNvbnN0IHsgcmV0dXJuIG1fYmxvY2tSb3dzLnZhbHVlKCk7IH0KKyAgICBJbmRleCBibG9ja0NvbHMoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrQ29scy52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorLy8gICAgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6R2VuZXJpY1NwYXJzZUJsb2NrSW5uZXJJdGVyYXRvckltcGw8WHByVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLElubmVyUGFuZWw+OworICAgIGZyaWVuZCBzdHJ1Y3QgaW50ZXJuYWw6OnVuYXJ5X2V2YWx1YXRvcjxCbG9jazxYcHJUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHMsSW5uZXJQYW5lbD4sIGludGVybmFsOjpJdGVyYXRvckJhc2VkLCBTY2FsYXIgPjsKKworICAgIEluZGV4IG5vblplcm9zKCkgY29uc3QgeyByZXR1cm4gRHluYW1pYzsgfQorCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxYcHJUeXBlPjo6bm9uX2NvbnN0X3R5cGUgbV9tYXRyaXg7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogRHluYW1pYz4gbV9zdGFydFJvdzsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSA/IDAgOiBEeW5hbWljPiBtX3N0YXJ0Q29sOworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzQXRDb21waWxlVGltZT4gbV9ibG9ja1Jvd3M7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIENvbHNBdENvbXBpbGVUaW1lPiBtX2Jsb2NrQ29sczsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gRGlzYWJsZSBhc3NpZ25tZW50IHdpdGggY2xlYXIgZXJyb3IgbWVzc2FnZS4KKyAgICAvLyBOb3RlIHRoYXQgc2ltcGx5IHJlbW92aW5nIG9wZXJhdG9yPSB5aWVsZHMgY29tcGlsYXRpb24gZXJyb3JzIHdpdGggSUNDK01TVkMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEJsb2NrSW1wbCYgb3BlcmF0b3I9KGNvbnN0IFQmKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKFQpPT0wLCBUSElTX1NQQVJTRV9CTE9DS19TVUJFWFBSRVNTSU9OX0lTX1JFQURfT05MWSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWw+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEJsb2NrPEFyZ1R5cGUsQmxvY2tSb3dzLEJsb2NrQ29scyxJbm5lclBhbmVsPiwgSXRlcmF0b3JCYXNlZCA+CisgOiBwdWJsaWMgZXZhbHVhdG9yX2Jhc2U8QmxvY2s8QXJnVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLElubmVyUGFuZWw+ID4KK3sKKyAgICBjbGFzcyBJbm5lclZlY3RvcklubmVySXRlcmF0b3I7CisgICAgY2xhc3MgT3V0ZXJWZWN0b3JJbm5lckl0ZXJhdG9yOworICBwdWJsaWM6CisgICAgdHlwZWRlZiBCbG9jazxBcmdUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHMsSW5uZXJQYW5lbD4gWHByVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgICAgZW51bSB7CisgICAgICBJc1Jvd01ham9yID0gWHByVHlwZTo6SXNSb3dNYWpvciwKKworICAgICAgT3V0ZXJWZWN0b3IgPSAgKEJsb2NrQ29scz09MSAmJiBBcmdUeXBlOjpJc1Jvd01ham9yKQorICAgICAgICAgICAgICAgICAgICB8IC8vIEZJWE1FIHwgaW5zdGVhZCBvZiB8fCB0byBwbGVhc2UgR0NDIDQuNC4wIHN0dXBpZCB3YXJuaW5nICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCAmJiIuCisgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IHRvIHx8IGFzIHNvb24gYXMgbm90IG5lZWRlZCBhbnltb3JlLgorICAgICAgICAgICAgICAgICAgICAgKEJsb2NrUm93cz09MSAmJiAhQXJnVHlwZTo6SXNSb3dNYWpvciksCisKKyAgICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgICBGbGFncyA9IFhwclR5cGU6OkZsYWdzCisgICAgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE91dGVyVmVjdG9yLE91dGVyVmVjdG9ySW5uZXJJdGVyYXRvcixJbm5lclZlY3RvcklubmVySXRlcmF0b3I+Ojp0eXBlIElubmVySXRlcmF0b3I7CisKKyAgICBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3ApCisgICAgICA6IG1fYXJnSW1wbChvcC5uZXN0ZWRFeHByZXNzaW9uKCkpLCBtX2Jsb2NrKG9wKQorICAgIHt9CisKKyAgICBpbmxpbmUgSW5kZXggbm9uWmVyb3NFc3RpbWF0ZSgpIGNvbnN0IHsKKyAgICAgIEluZGV4IG5ueiA9IG1fYmxvY2subm9uWmVyb3MoKTsKKyAgICAgIGlmKG5uejwwKQorICAgICAgICByZXR1cm4gbV9hcmdJbXBsLm5vblplcm9zRXN0aW1hdGUoKSAqIG1fYmxvY2suc2l6ZSgpIC8gbV9ibG9jay5uZXN0ZWRFeHByZXNzaW9uKCkuc2l6ZSgpOworICAgICAgcmV0dXJuIG5uejsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPEFyZ1R5cGU+OjpJbm5lckl0ZXJhdG9yIEV2YWxJdGVyYXRvcjsKKworICAgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7CisgICAgY29uc3QgWHByVHlwZSAmbV9ibG9jazsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbD4KK2NsYXNzIHVuYXJ5X2V2YWx1YXRvcjxCbG9jazxBcmdUeXBlLEJsb2NrUm93cyxCbG9ja0NvbHMsSW5uZXJQYW5lbD4sIEl0ZXJhdG9yQmFzZWQ+OjpJbm5lclZlY3RvcklubmVySXRlcmF0b3IKKyA6IHB1YmxpYyBFdmFsSXRlcmF0b3IKK3sKKyAgZW51bSB7IElzUm93TWFqb3IgPSB1bmFyeV9ldmFsdWF0b3I6OklzUm93TWFqb3IgfTsKKyAgY29uc3QgWHByVHlwZSYgbV9ibG9jazsKKyAgSW5kZXggbV9lbmQ7CitwdWJsaWM6CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBJbm5lclZlY3RvcklubmVySXRlcmF0b3IoY29uc3QgdW5hcnlfZXZhbHVhdG9yJiBhRXZhbCwgSW5kZXggb3V0ZXIpCisgICAgOiBFdmFsSXRlcmF0b3IoYUV2YWwubV9hcmdJbXBsLCBvdXRlciArIChJc1Jvd01ham9yID8gYUV2YWwubV9ibG9jay5zdGFydFJvdygpIDogYUV2YWwubV9ibG9jay5zdGFydENvbCgpKSksCisgICAgICBtX2Jsb2NrKGFFdmFsLm1fYmxvY2spLAorICAgICAgbV9lbmQoSXNSb3dNYWpvciA/IGFFdmFsLm1fYmxvY2suc3RhcnRDb2woKSthRXZhbC5tX2Jsb2NrLmJsb2NrQ29scygpIDogYUV2YWwubV9ibG9jay5zdGFydFJvdygpK2FFdmFsLm1fYmxvY2suYmxvY2tSb3dzKCkpCisgIHsKKyAgICB3aGlsZSggKEV2YWxJdGVyYXRvcjo6b3BlcmF0b3IgYm9vbCgpKSAmJiAoRXZhbEl0ZXJhdG9yOjppbmRleCgpIDwgKElzUm93TWFqb3IgPyBtX2Jsb2NrLnN0YXJ0Q29sKCkgOiBtX2Jsb2NrLnN0YXJ0Um93KCkpKSApCisgICAgICBFdmFsSXRlcmF0b3I6Om9wZXJhdG9yKysoKTsKKyAgfQorCisgIGlubGluZSBTdG9yYWdlSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBFdmFsSXRlcmF0b3I6OmluZGV4KCkgLSBjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oSXNSb3dNYWpvciA/IG1fYmxvY2suc3RhcnRDb2woKSA6IG1fYmxvY2suc3RhcnRSb3coKSk7IH0KKyAgaW5saW5lIEluZGV4IG91dGVyKCkgIGNvbnN0IHsgcmV0dXJuIEV2YWxJdGVyYXRvcjo6b3V0ZXIoKSAtIChJc1Jvd01ham9yID8gbV9ibG9jay5zdGFydFJvdygpIDogbV9ibG9jay5zdGFydENvbCgpKTsgfQorICBpbmxpbmUgSW5kZXggcm93KCkgICAgY29uc3QgeyByZXR1cm4gRXZhbEl0ZXJhdG9yOjpyb3coKSAgIC0gbV9ibG9jay5zdGFydFJvdygpOyB9CisgIGlubGluZSBJbmRleCBjb2woKSAgICBjb25zdCB7IHJldHVybiBFdmFsSXRlcmF0b3I6OmNvbCgpICAgLSBtX2Jsb2NrLnN0YXJ0Q29sKCk7IH0KKworICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIEV2YWxJdGVyYXRvcjo6b3BlcmF0b3IgYm9vbCgpICYmIEV2YWxJdGVyYXRvcjo6aW5kZXgoKSA8IG1fZW5kOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCBpbnQgQmxvY2tSb3dzLCBpbnQgQmxvY2tDb2xzLCBib29sIElubmVyUGFuZWw+CitjbGFzcyB1bmFyeV9ldmFsdWF0b3I8QmxvY2s8QXJnVHlwZSxCbG9ja1Jvd3MsQmxvY2tDb2xzLElubmVyUGFuZWw+LCBJdGVyYXRvckJhc2VkPjo6T3V0ZXJWZWN0b3JJbm5lckl0ZXJhdG9yCit7CisgIGVudW0geyBJc1Jvd01ham9yID0gdW5hcnlfZXZhbHVhdG9yOjpJc1Jvd01ham9yIH07CisgIGNvbnN0IHVuYXJ5X2V2YWx1YXRvciYgbV9ldmFsOworICBJbmRleCBtX291dGVyUG9zOworICBjb25zdCBJbmRleCBtX2lubmVySW5kZXg7CisgIEluZGV4IG1fZW5kOworICBFdmFsSXRlcmF0b3IgbV9pdDsKK3B1YmxpYzoKKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIE91dGVyVmVjdG9ySW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIGFFdmFsLCBJbmRleCBvdXRlcikKKyAgICA6IG1fZXZhbChhRXZhbCksCisgICAgICBtX291dGVyUG9zKCAoSXNSb3dNYWpvciA/IGFFdmFsLm1fYmxvY2suc3RhcnRDb2woKSA6IGFFdmFsLm1fYmxvY2suc3RhcnRSb3coKSkgKSwKKyAgICAgIG1faW5uZXJJbmRleChJc1Jvd01ham9yID8gYUV2YWwubV9ibG9jay5zdGFydFJvdygpIDogYUV2YWwubV9ibG9jay5zdGFydENvbCgpKSwKKyAgICAgIG1fZW5kKElzUm93TWFqb3IgPyBhRXZhbC5tX2Jsb2NrLnN0YXJ0Q29sKCkrYUV2YWwubV9ibG9jay5ibG9ja0NvbHMoKSA6IGFFdmFsLm1fYmxvY2suc3RhcnRSb3coKSthRXZhbC5tX2Jsb2NrLmJsb2NrUm93cygpKSwKKyAgICAgIG1faXQobV9ldmFsLm1fYXJnSW1wbCwgbV9vdXRlclBvcykKKyAgeworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvdXRlcik7CisgICAgZWlnZW5fYXNzZXJ0KG91dGVyPT0wKTsKKworICAgIHdoaWxlKG1faXQgJiYgbV9pdC5pbmRleCgpIDwgbV9pbm5lckluZGV4KSArK21faXQ7CisgICAgaWYoKCFtX2l0KSB8fCAobV9pdC5pbmRleCgpIT1tX2lubmVySW5kZXgpKQorICAgICAgKysoKnRoaXMpOworICB9CisKKyAgaW5saW5lIFN0b3JhZ2VJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtX291dGVyUG9zIC0gKElzUm93TWFqb3IgPyBtX2V2YWwubV9ibG9jay5zdGFydENvbCgpIDogbV9ldmFsLm1fYmxvY2suc3RhcnRSb3coKSkpOyB9CisgIGlubGluZSBJbmRleCBvdXRlcigpICBjb25zdCB7IHJldHVybiAwOyB9CisgIGlubGluZSBJbmRleCByb3coKSAgICBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gMCA6IGluZGV4KCk7IH0KKyAgaW5saW5lIEluZGV4IGNvbCgpICAgIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBpbmRleCgpIDogMDsgfQorCisgIGlubGluZSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2l0LnZhbHVlKCk7IH0KKyAgaW5saW5lIFNjYWxhciYgdmFsdWVSZWYoKSB7IHJldHVybiBtX2l0LnZhbHVlUmVmKCk7IH0KKworICBpbmxpbmUgT3V0ZXJWZWN0b3JJbm5lckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgeworICAgIC8vIHNlYXJjaCBuZXh0IG5vbi16ZXJvIGVudHJ5CisgICAgd2hpbGUoKyttX291dGVyUG9zPG1fZW5kKQorICAgIHsKKyAgICAgIC8vIFJlc3RhcnQgaXRlcmF0b3IgYXQgdGhlIG5leHQgaW5uZXItdmVjdG9yOgorICAgICAgbV9pdC5+RXZhbEl0ZXJhdG9yKCk7CisgICAgICA6Om5ldyAoJm1faXQpIEV2YWxJdGVyYXRvcihtX2V2YWwubV9hcmdJbXBsLCBtX291dGVyUG9zKTsKKyAgICAgIC8vIHNlYXJjaCBmb3IgdGhlIGtleSBtX2lubmVySW5kZXggaW4gdGhlIGN1cnJlbnQgb3V0ZXItdmVjdG9yCisgICAgICB3aGlsZShtX2l0ICYmIG1faXQuaW5kZXgoKSA8IG1faW5uZXJJbmRleCkgKyttX2l0OworICAgICAgaWYobV9pdCAmJiBtX2l0LmluZGV4KCk9PW1faW5uZXJJbmRleCkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlclBvcyA8IG1fZW5kOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXgsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEJsb2NrPFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiwgSXRlcmF0b3JCYXNlZD4KKyAgOiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8QmxvY2s8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PixCbG9ja1Jvd3MsQmxvY2tDb2xzLHRydWU+ID4gPgoreworICB0eXBlZGVmIEJsb2NrPFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiBYcHJUeXBlOworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxYcHJUeXBlPiA+IEJhc2U7CisgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlICZ4cHIpIDogQmFzZSh4cHIpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXgsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEJsb2NrPGNvbnN0IFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiwgSXRlcmF0b3JCYXNlZD4KKyAgOiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8QmxvY2s8Y29uc3QgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PixCbG9ja1Jvd3MsQmxvY2tDb2xzLHRydWU+ID4gPgoreworICB0eXBlZGVmIEJsb2NrPGNvbnN0IFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sQmxvY2tSb3dzLEJsb2NrQ29scyx0cnVlPiBYcHJUeXBlOworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxYcHJUeXBlPiA+IEJhc2U7CisgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlICZ4cHIpIDogQmFzZSh4cHIpIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9CTE9DS19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDb2xFdHJlZS5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ29sRXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUwMmQxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ29sRXRyZWUuaApAQCAtMCwwICsxLDIwNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKy8qIAorIAorICogTk9URTogVGhpcyBmaWxlIGlzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIG9mIHNwX2NvbGV0cmVlLmMgZmlsZSBpbiBTdXBlckxVIAorIAorICogLS0gU3VwZXJMVSByb3V0aW5lICh2ZXJzaW9uIDMuMSkgLS0KKyAqIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFhlcm94IFBhbG8gQWx0byBSZXNlYXJjaCBDZW50ZXIsCisgKiBhbmQgTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFiLgorICogQXVndXN0IDEsIDIwMDgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgYnkgWGVyb3ggQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQVMgSVMsIFdJVEggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQuICBBTlkgVVNFIElTIEFUIFlPVVIgT1dOIFJJU0suCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2Ugb3IgY29weSB0aGlzIHByb2dyYW0gZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzCisgKiBncmFudGVkLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0CisgKiB0aGUgY29kZSB3YXMgbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworI2lmbmRlZiBTUEFSU0VfQ09MRVRSRUVfSAorI2RlZmluZSBTUEFSU0VfQ09MRVRSRUVfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogRmluZCB0aGUgcm9vdCBvZiB0aGUgdHJlZS9zZXQgY29udGFpbmluZyB0aGUgdmVydGV4IGkgOiBVc2UgUGF0aCBoYWx2aW5nICovIAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIEluZGV4VmVjdG9yPgorSW5kZXggZXRyZWVfZmluZCAoSW5kZXggaSwgSW5kZXhWZWN0b3ImIHBwKQoreworICBJbmRleCBwID0gcHAoaSk7IC8vIFBhcmVudCAKKyAgSW5kZXggZ3AgPSBwcChwKTsgLy8gR3JhbmQgcGFyZW50IAorICB3aGlsZSAoZ3AgIT0gcCkgCisgIHsKKyAgICBwcChpKSA9IGdwOyAvLyBQYXJlbnQgcG9pbnRlciBvbiBmaW5kIHBhdGggaXMgY2hhbmdlZCB0byBmb3JtZXIgZ3JhbmQgcGFyZW50CisgICAgaSA9IGdwOyAKKyAgICBwID0gcHAoaSk7CisgICAgZ3AgPSBwcChwKTsKKyAgfQorICByZXR1cm4gcDsgCit9CisKKy8qKiBDb21wdXRlIHRoZSBjb2x1bW4gZWxpbWluYXRpb24gdHJlZSBvZiBhIHNwYXJzZSBtYXRyaXgKKyAgKiBccGFyYW0gbWF0IFRoZSBtYXRyaXggaW4gY29sdW1uLW1ham9yIGZvcm1hdC4gCisgICogXHBhcmFtIHBhcmVudCBUaGUgZWxpbWluYXRpb24gdHJlZQorICAqIFxwYXJhbSBmaXJzdFJvd0VsdCBUaGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIGVhY2ggcm93CisgICogXHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIHRvIGFwcGx5IHRvIHRoZSBjb2x1bW4gb2YgXGIgbWF0CisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgSW5kZXhWZWN0b3I+CitpbnQgY29sZXRyZWUoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgZmlyc3RSb3dFbHQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCAqcGVybT0wKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIFN0b3JhZ2VJbmRleCBuYyA9IGNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtYXQuY29scygpKTsgLy8gTnVtYmVyIG9mIGNvbHVtbnMKKyAgU3RvcmFnZUluZGV4IG0gPSBjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4obWF0LnJvd3MoKSk7CisgIFN0b3JhZ2VJbmRleCBkaWFnU2l6ZSA9IChzdGQ6Om1pbikobmMsbSk7CisgIEluZGV4VmVjdG9yIHJvb3QobmMpOyAvLyByb290IG9mIHN1YnRyZWUgb2YgZXRyZWUgCisgIHJvb3Quc2V0WmVybygpOworICBJbmRleFZlY3RvciBwcChuYyk7IC8vIGRpc2pvaW50IHNldHMgCisgIHBwLnNldFplcm8oKTsgLy8gSW5pdGlhbGl6ZSBkaXNqb2ludCBzZXRzIAorICBwYXJlbnQucmVzaXplKG1hdC5jb2xzKCkpOworICAvL0NvbXB1dGUgZmlyc3Qgbm9uemVybyBjb2x1bW4gaW4gZWFjaCByb3cgCisgIGZpcnN0Um93RWx0LnJlc2l6ZShtKTsKKyAgZmlyc3RSb3dFbHQuc2V0Q29uc3RhbnQobmMpOworICBmaXJzdFJvd0VsdC5zZWdtZW50KDAsIGRpYWdTaXplKS5zZXRMaW5TcGFjZWQoZGlhZ1NpemUsIDAsIGRpYWdTaXplLTEpOworICBib29sIGZvdW5kX2RpYWc7CisgIGZvciAoU3RvcmFnZUluZGV4IGNvbCA9IDA7IGNvbCA8IG5jOyBjb2wrKykKKyAgeworICAgIFN0b3JhZ2VJbmRleCBwY29sID0gY29sOworICAgIGlmKHBlcm0pIHBjb2wgID0gcGVybVtjb2xdOworICAgIGZvciAodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtYXQsIHBjb2wpOyBpdDsgKytpdCkKKyAgICB7IAorICAgICAgSW5kZXggcm93ID0gaXQucm93KCk7CisgICAgICBmaXJzdFJvd0VsdChyb3cpID0gKHN0ZDo6bWluKShmaXJzdFJvd0VsdChyb3cpLCBjb2wpOworICAgIH0KKyAgfQorICAvKiBDb21wdXRlIGV0cmVlIGJ5IExpdSdzIGFsZ29yaXRobSBmb3Igc3ltbWV0cmljIG1hdHJpY2VzLAorICAgICAgICAgIGV4Y2VwdCB1c2UgKGZpcnN0Um93RWx0W3JdLGMpIGluIHBsYWNlIG9mIGFuIGVkZ2UgKHIsYykgb2YgQS4KKyAgICBUaHVzIGVhY2ggcm93IGNsaXF1ZSBpbiBBJypBIGlzIHJlcGxhY2VkIGJ5IGEgc3RhcgorICAgIGNlbnRlcmVkIGF0IGl0cyBmaXJzdCB2ZXJ0ZXgsIHdoaWNoIGhhcyB0aGUgc2FtZSBmaWxsLiAqLworICBTdG9yYWdlSW5kZXggcnNldCwgY3NldCwgcnJvb3Q7CisgIGZvciAoU3RvcmFnZUluZGV4IGNvbCA9IDA7IGNvbCA8IG5jOyBjb2wrKykgCisgIHsKKyAgICBmb3VuZF9kaWFnID0gY29sPj1tOworICAgIHBwKGNvbCkgPSBjb2w7IAorICAgIGNzZXQgPSBjb2w7IAorICAgIHJvb3QoY3NldCkgPSBjb2w7IAorICAgIHBhcmVudChjb2wpID0gbmM7IAorICAgIC8qIFRoZSBkaWFnb25hbCBlbGVtZW50IGlzIHRyZWF0ZWQgaGVyZSBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXRyaXgKKyAgICAgKiBoZW5jZSB0aGUgbG9vcCBpcyBleGVjdXRlZCBvbmNlIG1vcmUgKi8gCisgICAgU3RvcmFnZUluZGV4IHBjb2wgPSBjb2w7CisgICAgaWYocGVybSkgcGNvbCAgPSBwZXJtW2NvbF07CisgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1hdCwgcGNvbCk7IGl0fHwhZm91bmRfZGlhZzsgKytpdCkKKyAgICB7IC8vICBBIHNlcXVlbmNlIG9mIGludGVybGVhdmVkIGZpbmQgYW5kIHVuaW9uIGlzIHBlcmZvcm1lZCAKKyAgICAgIEluZGV4IGkgPSBjb2w7CisgICAgICBpZihpdCkgaSA9IGl0LmluZGV4KCk7CisgICAgICBpZiAoaSA9PSBjb2wpIGZvdW5kX2RpYWcgPSB0cnVlOworICAgICAgCisgICAgICBTdG9yYWdlSW5kZXggcm93ID0gZmlyc3RSb3dFbHQoaSk7CisgICAgICBpZiAocm93ID49IGNvbCkgY29udGludWU7IAorICAgICAgcnNldCA9IGludGVybmFsOjpldHJlZV9maW5kKHJvdywgcHApOyAvLyBGaW5kIHRoZSBuYW1lIG9mIHRoZSBzZXQgY29udGFpbmluZyByb3cKKyAgICAgIHJyb290ID0gcm9vdChyc2V0KTsKKyAgICAgIGlmIChycm9vdCAhPSBjb2wpIAorICAgICAgeworICAgICAgICBwYXJlbnQocnJvb3QpID0gY29sOyAKKyAgICAgICAgcHAoY3NldCkgPSByc2V0OyAKKyAgICAgICAgY3NldCA9IHJzZXQ7IAorICAgICAgICByb290KGNzZXQpID0gY29sOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7ICAKK30KKworLyoqIAorICAqIERlcHRoLWZpcnN0IHNlYXJjaCBmcm9tIHZlcnRleCBuLiAgTm8gcmVjdXJzaW9uLgorICAqIFRoaXMgcm91dGluZSB3YXMgY29udHJpYnV0ZWQgYnkgQ8OpZHJpYyBEb3VjZXQsIENFRFJBVCBHcm91cCwgTWV5bGFuLCBGcmFuY2UuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VmVjdG9yPgordm9pZCBucl9ldGRmcyAodHlwZW5hbWUgSW5kZXhWZWN0b3I6OlNjYWxhciBuLCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgZmlyc3Rfa2lkLCBJbmRleFZlY3RvciYgbmV4dF9raWQsIEluZGV4VmVjdG9yJiBwb3N0LCB0eXBlbmFtZSBJbmRleFZlY3Rvcjo6U2NhbGFyIHBvc3RudW0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW5kZXhWZWN0b3I6OlNjYWxhciBTdG9yYWdlSW5kZXg7CisgIFN0b3JhZ2VJbmRleCBjdXJyZW50ID0gbiwgZmlyc3QsIG5leHQ7CisgIHdoaWxlIChwb3N0bnVtICE9IG4pIAorICB7CisgICAgLy8gTm8ga2lkIGZvciB0aGUgY3VycmVudCBub2RlCisgICAgZmlyc3QgPSBmaXJzdF9raWQoY3VycmVudCk7CisgICAgCisgICAgLy8gbm8ga2lkIGZvciB0aGUgY3VycmVudCBub2RlCisgICAgaWYgKGZpcnN0ID09IC0xKSAKKyAgICB7CisgICAgICAvLyBOdW1iZXJpbmcgdGhpcyBub2RlIGJlY2F1c2UgaXQgaGFzIG5vIGtpZCAKKyAgICAgIHBvc3QoY3VycmVudCkgPSBwb3N0bnVtKys7CisgICAgICAKKyAgICAgIC8vIGxvb2tpbmcgZm9yIHRoZSBuZXh0IGtpZCAKKyAgICAgIG5leHQgPSBuZXh0X2tpZChjdXJyZW50KTsgCisgICAgICB3aGlsZSAobmV4dCA9PSAtMSkgCisgICAgICB7CisgICAgICAgIC8vIE5vIG1vcmUga2lkcyA6IGJhY2sgdG8gdGhlIHBhcmVudCBub2RlCisgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQoY3VycmVudCk7IAorICAgICAgICAvLyBudW1iZXJpbmcgdGhlIHBhcmVudCBub2RlIAorICAgICAgICBwb3N0KGN1cnJlbnQpID0gcG9zdG51bSsrOworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGtpZCAKKyAgICAgICAgbmV4dCA9IG5leHRfa2lkKGN1cnJlbnQpOyAKKyAgICAgIH0KKyAgICAgIC8vIHN0b3BwaW5nIGNyaXRlcmlvbiAKKyAgICAgIGlmIChwb3N0bnVtID09IG4rMSkgcmV0dXJuOyAKKyAgICAgIAorICAgICAgLy8gVXBkYXRpbmcgY3VycmVudCBub2RlIAorICAgICAgY3VycmVudCA9IG5leHQ7IAorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIGN1cnJlbnQgPSBmaXJzdDsgCisgICAgfQorICB9Cit9CisKKworLyoqCisgICogXGJyaWVmIFBvc3Qgb3JkZXIgYSB0cmVlIAorICAqIFxwYXJhbSBuIHRoZSBudW1iZXIgb2Ygbm9kZXMKKyAgKiBccGFyYW0gcGFyZW50IElucHV0IHRyZWUKKyAgKiBccGFyYW0gcG9zdCBwb3N0b3JkZXJlZCB0cmVlCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhWZWN0b3I+Cit2b2lkIHRyZWVQb3N0b3JkZXIodHlwZW5hbWUgSW5kZXhWZWN0b3I6OlNjYWxhciBuLCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgcG9zdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmRleFZlY3Rvcjo6U2NhbGFyIFN0b3JhZ2VJbmRleDsKKyAgSW5kZXhWZWN0b3IgZmlyc3Rfa2lkLCBuZXh0X2tpZDsgLy8gTGlua2VkIGxpc3Qgb2YgY2hpbGRyZW4gCisgIFN0b3JhZ2VJbmRleCBwb3N0bnVtOyAKKyAgLy8gQWxsb2NhdGUgc3RvcmFnZSBmb3Igd29ya2luZyBhcnJheXMgYW5kIHJlc3VsdHMgCisgIGZpcnN0X2tpZC5yZXNpemUobisxKTsgCisgIG5leHRfa2lkLnNldFplcm8obisxKTsKKyAgcG9zdC5zZXRaZXJvKG4rMSk7CisgIAorICAvLyBTZXQgdXAgc3RydWN0dXJlIGRlc2NyaWJpbmcgY2hpbGRyZW4KKyAgZmlyc3Rfa2lkLnNldENvbnN0YW50KC0xKTsgCisgIGZvciAoU3RvcmFnZUluZGV4IHYgPSBuLTE7IHYgPj0gMDsgdi0tKSAKKyAgeworICAgIFN0b3JhZ2VJbmRleCBkYWQgPSBwYXJlbnQodik7CisgICAgbmV4dF9raWQodikgPSBmaXJzdF9raWQoZGFkKTsgCisgICAgZmlyc3Rfa2lkKGRhZCkgPSB2OyAKKyAgfQorICAKKyAgLy8gRGVwdGgtZmlyc3Qgc2VhcmNoIGZyb20gZHVtbXkgcm9vdCB2ZXJ0ZXggI24KKyAgcG9zdG51bSA9IDA7IAorICBpbnRlcm5hbDo6bnJfZXRkZnMobiwgcGFyZW50LCBmaXJzdF9raWQsIG5leHRfa2lkLCBwb3N0LCBwb3N0bnVtKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gU1BBUlNFX0NPTEVUUkVFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUNvbXByZXNzZWRCYXNlLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDb21wcmVzc2VkQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2I0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDb21wcmVzc2VkQmFzZS5oCkBAIC0wLDAgKzEsMzQxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0NPTVBSRVNTRURfQkFTRV9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DT01QUkVTU0VEX0JBU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgU3BhcnNlQ29tcHJlc3NlZEJhc2U7CisgIAorbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlQ29tcHJlc3NlZEJhc2U8RGVyaXZlZD4gPiA6IHRyYWl0czxEZXJpdmVkPgore307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKiBcY2xhc3MgU3BhcnNlQ29tcHJlc3NlZEJhc2UKKyAgKiBcYnJpZWYgQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHNwYXJzZSBbY29tcHJlc3NlZF0te3Jvd3xjb2x1bW59LXN0b3JhZ2UgZm9ybWF0LgorICAqCisgICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciBhbGwgZGVyaXZlZCBjbGFzc2VzIGltcGxlbWVudGluZyB0aGUgY29tcHJlc3NlZCBzcGFyc2Ugc3RvcmFnZSBmb3JtYXQsIHN1Y2ggYXM6CisgICogIC0gU3BhcnNlTWF0cml4CisgICogIC0gUmVmPFNwYXJzZU1hdHJpeFR5cGUsT3B0aW9ucz4KKyAgKiAgLSBNYXA8U3BhcnNlTWF0cml4VHlwZT4KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZUNvbXByZXNzZWRCYXNlCisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPiBCYXNlOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZUNvbXByZXNzZWRCYXNlKQorICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yPTsKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworICAgIAorICAgIGNsYXNzIElubmVySXRlcmF0b3I7CisgICAgY2xhc3MgUmV2ZXJzZUlubmVySXRlcmF0b3I7CisgICAgCisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4VmVjdG9yIEluZGV4VmVjdG9yOworICAgIEVpZ2VuOjpNYXA8SW5kZXhWZWN0b3I+IGlubmVyTm9uWmVyb3MoKSB7IHJldHVybiBFaWdlbjo6TWFwPEluZGV4VmVjdG9yPihpbm5lck5vblplcm9QdHIoKSwgaXNDb21wcmVzc2VkKCk/MDpkZXJpdmVkKCkub3V0ZXJTaXplKCkpOyB9CisgICAgY29uc3QgIEVpZ2VuOjpNYXA8Y29uc3QgSW5kZXhWZWN0b3I+IGlubmVyTm9uWmVyb3MoKSBjb25zdCB7IHJldHVybiBFaWdlbjo6TWFwPGNvbnN0IEluZGV4VmVjdG9yPihpbm5lck5vblplcm9QdHIoKSwgaXNDb21wcmVzc2VkKCk/MDpkZXJpdmVkKCkub3V0ZXJTaXplKCkpOyB9CisgICAgICAgIAorICBwdWJsaWM6CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm8gY29lZmZpY2llbnRzICovCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QKKyAgICB7CisgICAgICBpZihEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgb3V0ZXJJbmRleFB0cigpPT0wKQorICAgICAgICByZXR1cm4gZGVyaXZlZCgpLm5vblplcm9zKCk7CisgICAgICBlbHNlIGlmKGlzQ29tcHJlc3NlZCgpKQorICAgICAgICByZXR1cm4gb3V0ZXJJbmRleFB0cigpW2Rlcml2ZWQoKS5vdXRlclNpemUoKV0tb3V0ZXJJbmRleFB0cigpWzBdOworICAgICAgZWxzZSBpZihkZXJpdmVkKCkub3V0ZXJTaXplKCk9PTApCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gaW5uZXJOb25aZXJvcygpLnN1bSgpOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiB2YWx1ZXMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIGlubmVySW5kZXhQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkudmFsdWVQdHIoKTsgfQorICAgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiB2YWx1ZXMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIGlubmVySW5kZXhQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIFNjYWxhciogdmFsdWVQdHIoKSB7IHJldHVybiBkZXJpdmVkKCkudmFsdWVQdHIoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgaW5uZXIgaW5kaWNlcy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0cigpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5pbm5lckluZGV4UHRyKCk7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgaW5uZXIgaW5kaWNlcy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0cigpIHsgcmV0dXJuIGRlcml2ZWQoKS5pbm5lckluZGV4UHRyKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBzdGFydGluZyBwb3NpdGlvbnMgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHdhcm5pbmcgaXQgcmV0dXJucyB0aGUgbnVsbCBwb2ludGVyIDAgZm9yIFNwYXJzZVZlY3RvcgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgaW5uZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5vdXRlckluZGV4UHRyKCk7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIHN0YXJ0aW5nIHBvc2l0aW9ucyBvZiB0aGUgaW5uZXIgdmVjdG9ycy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcd2FybmluZyBpdCByZXR1cm5zIHRoZSBudWxsIHBvaW50ZXIgMCBmb3IgU3BhcnNlVmVjdG9yCisgICAgICAqIFxzYSB2YWx1ZVB0cigpLCBpbm5lckluZGV4UHRyKCkgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBvdXRlckluZGV4UHRyKCkgeyByZXR1cm4gZGVyaXZlZCgpLm91dGVySW5kZXhQdHIoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIG51bWJlciBvZiBub24gemVyb3Mgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHdhcm5pbmcgaXQgcmV0dXJucyB0aGUgbnVsbCBwb2ludGVyIDAgaW4gY29tcHJlc3NlZCBtb2RlICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogaW5uZXJOb25aZXJvUHRyKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmlubmVyTm9uWmVyb1B0cigpOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBudW1iZXIgb2Ygbm9uIHplcm9zIG9mIHRoZSBpbm5lciB2ZWN0b3JzLgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBsaWJyYXJpZXMuCisgICAgICAqIFx3YXJuaW5nIGl0IHJldHVybnMgdGhlIG51bGwgcG9pbnRlciAwIGluIGNvbXByZXNzZWQgbW9kZSAqLworICAgIGlubGluZSBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0cigpIHsgcmV0dXJuIGRlcml2ZWQoKS5pbm5lck5vblplcm9QdHIoKTsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyB3aGV0aGVyIFxjICp0aGlzIGlzIGluIGNvbXByZXNzZWQgZm9ybS4gKi8KKyAgICBpbmxpbmUgYm9vbCBpc0NvbXByZXNzZWQoKSBjb25zdCB7IHJldHVybiBpbm5lck5vblplcm9QdHIoKT09MDsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIHN0b3JlZCBjb2VmZmljaWVudHMgYXMgYSAxRCBhcnJheSBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyB0aGlzIG1ldGhvZCBpcyBmb3IgXGIgY29tcHJlc3NlZCBcYiBzdG9yYWdlIFxiIG9ubHksIGFuZCBpdCB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIG90aGVyd2lzZS4KKyAgICAgICoKKyAgICAgICogXHNhIHZhbHVlUHRyKCksIGlzQ29tcHJlc3NlZCgpICovCisgICAgY29uc3QgTWFwPGNvbnN0IEFycmF5PFNjYWxhcixEeW5hbWljLDE+ID4gY29lZmZzKCkgY29uc3QgeyBlaWdlbl9hc3NlcnQoaXNDb21wcmVzc2VkKCkpOyByZXR1cm4gQXJyYXk8U2NhbGFyLER5bmFtaWMsMT46Ok1hcCh2YWx1ZVB0cigpLG5vblplcm9zKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWFkLXdyaXRlIHZpZXcgb2YgdGhlIHN0b3JlZCBjb2VmZmljaWVudHMgYXMgYSAxRCBhcnJheSBleHByZXNzaW9uCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIHRoaXMgbWV0aG9kIGlzIGZvciBcYiBjb21wcmVzc2VkIFxiIHN0b3JhZ2UgXGIgb25seSwgYW5kIGl0IHdpbGwgdHJpZ2dlciBhbiBhc3NlcnRpb24gb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAqIFxpbmNsdWRlIFNwYXJzZU1hdHJpeF9jb2VmZnMuY3BwCisgICAgICAqIGFuZCB0aGUgb3V0cHV0IGlzOgorICAgICAgKiBcaW5jbHVkZSBTcGFyc2VNYXRyaXhfY29lZmZzLm91dAorICAgICAgKgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgaXNDb21wcmVzc2VkKCkgKi8KKyAgICBNYXA8QXJyYXk8U2NhbGFyLER5bmFtaWMsMT4gPiBjb2VmZnMoKSB7IGVpZ2VuX2Fzc2VydChpc0NvbXByZXNzZWQoKSk7IHJldHVybiBBcnJheTxTY2FsYXIsRHluYW1pYywxPjo6TWFwKHZhbHVlUHRyKCksbm9uWmVyb3MoKSk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuIERvIG5vdGhpbmcuICovCisgICAgU3BhcnNlQ29tcHJlc3NlZEJhc2UoKSB7fQorICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZXhwbGljaXQgU3BhcnNlQ29tcHJlc3NlZEJhc2UoY29uc3QgU3BhcnNlQ29tcHJlc3NlZEJhc2U8T3RoZXJEZXJpdmVkPiYpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZUNvbXByZXNzZWRCYXNlPERlcml2ZWQ+OjpJbm5lckl0ZXJhdG9yCit7CisgIHB1YmxpYzoKKyAgICBJbm5lckl0ZXJhdG9yKCkKKyAgICAgIDogbV92YWx1ZXMoMCksIG1faW5kaWNlcygwKSwgbV9vdXRlcigwKSwgbV9pZCgwKSwgbV9lbmQoMCkKKyAgICB7fQorCisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBJbm5lckl0ZXJhdG9yJiBvdGhlcikKKyAgICAgIDogbV92YWx1ZXMob3RoZXIubV92YWx1ZXMpLCBtX2luZGljZXMob3RoZXIubV9pbmRpY2VzKSwgbV9vdXRlcihvdGhlci5tX291dGVyKSwgbV9pZChvdGhlci5tX2lkKSwgbV9lbmQob3RoZXIubV9lbmQpCisgICAge30KKworICAgIElubmVySXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJbm5lckl0ZXJhdG9yJiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlcyA9IG90aGVyLm1fdmFsdWVzOworICAgICAgbV9pbmRpY2VzID0gb3RoZXIubV9pbmRpY2VzOworICAgICAgY29uc3RfY2FzdDxPdXRlclR5cGUmPihtX291dGVyKS5zZXRWYWx1ZShvdGhlci5tX291dGVyLnZhbHVlKCkpOworICAgICAgbV9pZCA9IG90aGVyLm1faWQ7CisgICAgICBtX2VuZCA9IG90aGVyLm1fZW5kOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIElubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlQ29tcHJlc3NlZEJhc2UmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fdmFsdWVzKG1hdC52YWx1ZVB0cigpKSwgbV9pbmRpY2VzKG1hdC5pbm5lckluZGV4UHRyKCkpLCBtX291dGVyKG91dGVyKQorICAgIHsKKyAgICAgIGlmKERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBtYXQub3V0ZXJJbmRleFB0cigpPT0wKQorICAgICAgeworICAgICAgICBtX2lkID0gMDsKKyAgICAgICAgbV9lbmQgPSBtYXQubm9uWmVyb3MoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbV9pZCA9IG1hdC5vdXRlckluZGV4UHRyKClbb3V0ZXJdOworICAgICAgICBpZihtYXQuaXNDb21wcmVzc2VkKCkpCisgICAgICAgICAgbV9lbmQgPSBtYXQub3V0ZXJJbmRleFB0cigpW291dGVyKzFdOworICAgICAgICBlbHNlCisgICAgICAgICAgbV9lbmQgPSBtX2lkICsgbWF0LmlubmVyTm9uWmVyb1B0cigpW291dGVyXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBleHBsaWNpdCBJbm5lckl0ZXJhdG9yKGNvbnN0IFNwYXJzZUNvbXByZXNzZWRCYXNlJiBtYXQpCisgICAgICA6IG1fdmFsdWVzKG1hdC52YWx1ZVB0cigpKSwgbV9pbmRpY2VzKG1hdC5pbm5lckluZGV4UHRyKCkpLCBtX291dGVyKDApLCBtX2lkKDApLCBtX2VuZChtYXQubm9uWmVyb3MoKSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpOworICAgIH0KKworICAgIGV4cGxpY2l0IElubmVySXRlcmF0b3IoY29uc3QgaW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixTdG9yYWdlSW5kZXg+JiBkYXRhKQorICAgICAgOiBtX3ZhbHVlcyhkYXRhLnZhbHVlUHRyKCkpLCBtX2luZGljZXMoZGF0YS5pbmRleFB0cigpKSwgbV9vdXRlcigwKSwgbV9pZCgwKSwgbV9lbmQoZGF0YS5zaXplKCkpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgbV9pZCsrOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXNbbV9pZF07IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZVJlZigpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyJj4obV92YWx1ZXNbbV9pZF0pOyB9CisKKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzW21faWRdOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlci52YWx1ZSgpOyB9CisgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyLnZhbHVlKCkgOiBpbmRleCgpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBpbmRleCgpIDogbV9vdXRlci52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtX2lkIDwgbV9lbmQpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFNjYWxhciogbV92YWx1ZXM7CisgICAgY29uc3QgU3RvcmFnZUluZGV4KiBtX2luZGljZXM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCxEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU/MDpEeW5hbWljPiBPdXRlclR5cGU7CisgICAgY29uc3QgT3V0ZXJUeXBlIG1fb3V0ZXI7CisgICAgSW5kZXggbV9pZDsKKyAgICBJbmRleCBtX2VuZDsKKyAgcHJpdmF0ZToKKyAgICAvLyBJZiB5b3UgZ2V0IGhlcmUsIHRoZW4geW91J3JlIG5vdCB1c2luZyB0aGUgcmlnaHQgSW5uZXJJdGVyYXRvciB0eXBlLCBlLmcuOgorICAgIC8vICAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gQTsKKyAgICAvLyAgIFNwYXJzZU1hdHJpeDxkb3VibGU+OjpJbm5lckl0ZXJhdG9yIGl0KEEsMCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQ+JiwgSW5kZXggb3V0ZXIpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZUNvbXByZXNzZWRCYXNlPERlcml2ZWQ+OjpSZXZlcnNlSW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgUmV2ZXJzZUlubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlQ29tcHJlc3NlZEJhc2UmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fdmFsdWVzKG1hdC52YWx1ZVB0cigpKSwgbV9pbmRpY2VzKG1hdC5pbm5lckluZGV4UHRyKCkpLCBtX291dGVyKG91dGVyKQorICAgIHsKKyAgICAgIGlmKERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBtYXQub3V0ZXJJbmRleFB0cigpPT0wKQorICAgICAgeworICAgICAgICBtX3N0YXJ0ID0gMDsKKyAgICAgICAgbV9pZCA9IG1hdC5ub25aZXJvcygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX3N0YXJ0ID0gbWF0Lm91dGVySW5kZXhQdHIoKVtvdXRlcl07CisgICAgICAgIGlmKG1hdC5pc0NvbXByZXNzZWQoKSkKKyAgICAgICAgICBtX2lkID0gbWF0Lm91dGVySW5kZXhQdHIoKVtvdXRlcisxXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1faWQgPSBtX3N0YXJ0ICsgbWF0LmlubmVyTm9uWmVyb1B0cigpW291dGVyXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBleHBsaWNpdCBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VDb21wcmVzc2VkQmFzZSYgbWF0KQorICAgICAgOiBtX3ZhbHVlcyhtYXQudmFsdWVQdHIoKSksIG1faW5kaWNlcyhtYXQuaW5uZXJJbmRleFB0cigpKSwgbV9vdXRlcigwKSwgbV9zdGFydCgwKSwgbV9pZChtYXQubm9uWmVyb3MoKSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpOworICAgIH0KKworICAgIGV4cGxpY2l0IFJldmVyc2VJbm5lckl0ZXJhdG9yKGNvbnN0IGludGVybmFsOjpDb21wcmVzc2VkU3RvcmFnZTxTY2FsYXIsU3RvcmFnZUluZGV4PiYgZGF0YSkKKyAgICAgIDogbV92YWx1ZXMoZGF0YS52YWx1ZVB0cigpKSwgbV9pbmRpY2VzKGRhdGEuaW5kZXhQdHIoKSksIG1fb3V0ZXIoMCksIG1fc3RhcnQoMCksIG1faWQoZGF0YS5zaXplKCkpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKTsKKyAgICB9CisKKyAgICBpbmxpbmUgUmV2ZXJzZUlubmVySXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0tbV9pZDsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW21faWQtMV07IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZVJlZigpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyJj4obV92YWx1ZXNbbV9pZC0xXSk7IH0KKworICAgIGlubGluZSBTdG9yYWdlSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXNbbV9pZC0xXTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXIudmFsdWUoKTsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlci52YWx1ZSgpIDogaW5kZXgoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fb3V0ZXIudmFsdWUoKTsgfQorCisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobV9pZCA+IG1fc3RhcnQpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFNjYWxhciogbV92YWx1ZXM7CisgICAgY29uc3QgU3RvcmFnZUluZGV4KiBtX2luZGljZXM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCxEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU/MDpEeW5hbWljPiBPdXRlclR5cGU7CisgICAgY29uc3QgT3V0ZXJUeXBlIG1fb3V0ZXI7CisgICAgSW5kZXggbV9zdGFydDsKKyAgICBJbmRleCBtX2lkOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8RGVyaXZlZD4gPgorICA6IGV2YWx1YXRvcl9iYXNlPERlcml2ZWQ+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbm5lckl0ZXJhdG9yIElubmVySXRlcmF0b3I7CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIEZsYWdzID0gRGVyaXZlZDo6RmxhZ3MKKyAgfTsKKyAgCisgIGV2YWx1YXRvcigpIDogbV9tYXRyaXgoMCksIG1femVybygwKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorICBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgRGVyaXZlZCAmbWF0KSA6IG1fbWF0cml4KCZtYXQpLCBtX3plcm8oMCkKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgCisgIGlubGluZSBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeworICAgIHJldHVybiBtX21hdHJpeC0+bm9uWmVyb3MoKTsKKyAgfQorICAKKyAgb3BlcmF0b3IgRGVyaXZlZCYoKSB7IHJldHVybiBtX21hdHJpeC0+Y29uc3RfY2FzdF9kZXJpdmVkKCk7IH0KKyAgb3BlcmF0b3IgY29uc3QgRGVyaXZlZCYoKSBjb25zdCB7IHJldHVybiAqbV9tYXRyaXg7IH0KKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsUmVhZE9ubHlBY2Nlc3NvcnM+OjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICB7CisgICAgSW5kZXggcCA9IGZpbmQocm93LGNvbCk7CisKKyAgICBpZihwPT1EeW5hbWljKQorICAgICAgcmV0dXJuIG1femVybzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbV9tYXRyaXgtPmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnZhbHVlUHRyKClbcF07CisgIH0KKworICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICB7CisgICAgSW5kZXggcCA9IGZpbmQocm93LGNvbCk7CisgICAgZWlnZW5fYXNzZXJ0KHAhPUR5bmFtaWMgJiYgIndyaXR0ZW4gY29lZmZpY2llbnQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICByZXR1cm4gbV9tYXRyaXgtPmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnZhbHVlUHRyKClbcF07CisgIH0KKworcHJvdGVjdGVkOgorCisgIEluZGV4IGZpbmQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93Pj0wICYmIHJvdzxtX21hdHJpeC0+cm93cygpICYmIGNvbD49MCAmJiBjb2w8bV9tYXRyaXgtPmNvbHMoKSk7CisKKyAgICBjb25zdCBJbmRleCBvdXRlciA9IERlcml2ZWQ6OklzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgY29uc3QgSW5kZXggaW5uZXIgPSBEZXJpdmVkOjpJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgSW5kZXggc3RhcnQgPSBtX21hdHJpeC0+b3V0ZXJJbmRleFB0cigpW291dGVyXTsKKyAgICBJbmRleCBlbmQgPSBtX21hdHJpeC0+aXNDb21wcmVzc2VkKCkgPyBtX21hdHJpeC0+b3V0ZXJJbmRleFB0cigpW291dGVyKzFdIDogbV9tYXRyaXgtPm91dGVySW5kZXhQdHIoKVtvdXRlcl0gKyBtX21hdHJpeC0+aW5uZXJOb25aZXJvUHRyKClbb3V0ZXJdOworICAgIGVpZ2VuX2Fzc2VydChlbmQ+PXN0YXJ0ICYmICJ5b3UgYXJlIHVzaW5nIGEgbm9uIGZpbmFsaXplZCBzcGFyc2UgbWF0cml4IG9yIHdyaXR0ZW4gY29lZmZpY2llbnQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICBjb25zdCBJbmRleCBwID0gc3RkOjpsb3dlcl9ib3VuZChtX21hdHJpeC0+aW5uZXJJbmRleFB0cigpK3N0YXJ0LCBtX21hdHJpeC0+aW5uZXJJbmRleFB0cigpK2VuZCxpbm5lcikgLSBtX21hdHJpeC0+aW5uZXJJbmRleFB0cigpOworCisgICAgcmV0dXJuICgocDxlbmQpICYmIChtX21hdHJpeC0+aW5uZXJJbmRleFB0cigpW3BdPT1pbm5lcikpID8gcCA6IER5bmFtaWM7CisgIH0KKworICBjb25zdCBEZXJpdmVkICptX21hdHJpeDsKKyAgY29uc3QgU2NhbGFyIG1femVybzsKK307CisKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQ09NUFJFU1NFRF9CQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUN3aXNlQmluYXJ5T3AuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUN3aXNlQmluYXJ5T3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE1ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VCaW5hcnlPcC5oCkBAIC0wLDAgKzEsNzI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfQ1dJU0VfQklOQVJZX09QX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0NXSVNFX0JJTkFSWV9PUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvLyBIZXJlIHdlIGhhdmUgdG8gaGFuZGxlIDMgY2FzZXM6CisvLyAgMSAtIHNwYXJzZSBvcCBkZW5zZQorLy8gIDIgLSBkZW5zZSBvcCBzcGFyc2UKKy8vICAzIC0gc3BhcnNlIG9wIHNwYXJzZQorLy8gV2UgYWxzbyBuZWVkIHRvIGltcGxlbWVudCBhIDR0aCBpdGVyYXRvciBmb3I6CisvLyAgNCAtIGRlbnNlIG9wIGRlbnNlCisvLyBGaW5hbGx5LCB3ZSBhbHNvIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgcHJvZHVjdCBhbmQgb3RoZXIgb3BlcmF0aW9ucyA6CisvLyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICAgICAgcmV0dXJuZWQgbW9kZQorLy8gIDEgLSBzcGFyc2Ugb3AgZGVuc2UgICAgcHJvZHVjdCAgICAgIHNwYXJzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgIGRlbnNlCisvLyAgMiAtIGRlbnNlIG9wIHNwYXJzZSAgICBwcm9kdWN0ICAgICAgc3BhcnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgZGVuc2UKKy8vICAzIC0gc3BhcnNlIG9wIHNwYXJzZSAgIHByb2R1Y3QgICAgICBzcGFyc2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICBzcGFyc2UKKy8vICA0IC0gZGVuc2Ugb3AgZGVuc2UgICAgIHByb2R1Y3QgICAgICBkZW5zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgIGRlbnNlCisvLworLy8gVE9ETyB0byBlYXNlIGNvbXBpbGVyIGpvYiwgd2UgY291bGQgc3BlY2lhbGl6ZSBwcm9kdWN0L3F1b3RpZW50IHdpdGggYSBzY2FsYXIKKy8vICAgICAgYW5kIGZhbGxiYWNrIHRvIGN3aXNlLXVuYXJ5IGV2YWx1YXRvciB1c2luZyBiaW5kMXN0X29wIGFuZCBiaW5kMm5kX29wLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBDd2lzZUJpbmFyeU9wSW1wbDxCaW5hcnlPcCwgTGhzLCBSaHMsIFNwYXJzZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gRGVyaXZlZDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShEZXJpdmVkKQorICAgIEN3aXNlQmluYXJ5T3BJbXBsKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCgKKyAgICAgICAgICAgICAgICAoIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kPjo6dmFsdWUpCisgICAgICAgICAgICB8fCAgKChpbnRlcm5hbDo6ZXZhbHVhdG9yPExocz46OkZsYWdzJlJvd01ham9yQml0KSA9PSAoaW50ZXJuYWw6OmV2YWx1YXRvcjxSaHM+OjpGbGFncyZSb3dNYWpvckJpdCkpKSwKKyAgICAgICAgICAgIFRIRV9TVE9SQUdFX09SREVSX09GX0JPVEhfU0lERVNfTVVTVF9NQVRDSCk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworICAKKy8vIEdlbmVyaWMgInNwYXJzZSBPUCBzcGFyc2UiCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiBzdHJ1Y3QgYmluYXJ5X3NwYXJzZV9ldmFsdWF0b3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiwgSXRlcmF0b3JCYXNlZCwgSXRlcmF0b3JCYXNlZD4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yICBMaHNJdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8UmhzPjo6SW5uZXJJdGVyYXRvciAgUmhzSXRlcmF0b3I7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CitwdWJsaWM6CisKKyAgY2xhc3MgSW5uZXJJdGVyYXRvcgorICB7CisgIHB1YmxpYzoKKyAgICAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgYmluYXJ5X2V2YWx1YXRvciYgYUV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2xoc0l0ZXIoYUV2YWwubV9saHNJbXBsLG91dGVyKSwgbV9yaHNJdGVyKGFFdmFsLm1fcmhzSW1wbCxvdXRlciksIG1fZnVuY3RvcihhRXZhbC5tX2Z1bmN0b3IpCisgICAgeworICAgICAgdGhpcy0+b3BlcmF0b3IrKygpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgaWYgKG1fbGhzSXRlciAmJiBtX3Joc0l0ZXIgJiYgKG1fbGhzSXRlci5pbmRleCgpID09IG1fcmhzSXRlci5pbmRleCgpKSkKKyAgICAgIHsKKyAgICAgICAgbV9pZCA9IG1fbGhzSXRlci5pbmRleCgpOworICAgICAgICBtX3ZhbHVlID0gbV9mdW5jdG9yKG1fbGhzSXRlci52YWx1ZSgpLCBtX3Joc0l0ZXIudmFsdWUoKSk7CisgICAgICAgICsrbV9saHNJdGVyOworICAgICAgICArK21fcmhzSXRlcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1fbGhzSXRlciAmJiAoIW1fcmhzSXRlciB8fCAobV9saHNJdGVyLmluZGV4KCkgPCBtX3Joc0l0ZXIuaW5kZXgoKSkpKQorICAgICAgeworICAgICAgICBtX2lkID0gbV9saHNJdGVyLmluZGV4KCk7CisgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IobV9saHNJdGVyLnZhbHVlKCksIFNjYWxhcigwKSk7CisgICAgICAgICsrbV9saHNJdGVyOworICAgICAgfQorICAgICAgZWxzZSBpZiAobV9yaHNJdGVyICYmICghbV9saHNJdGVyIHx8IChtX2xoc0l0ZXIuaW5kZXgoKSA+IG1fcmhzSXRlci5pbmRleCgpKSkpCisgICAgICB7CisgICAgICAgIG1faWQgPSBtX3Joc0l0ZXIuaW5kZXgoKTsKKyAgICAgICAgbV92YWx1ZSA9IG1fZnVuY3RvcihTY2FsYXIoMCksIG1fcmhzSXRlci52YWx1ZSgpKTsKKyAgICAgICAgKyttX3Joc0l0ZXI7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1fdmFsdWUgPSAwOyAvLyB0aGlzIGlzIHRvIGF2b2lkIGEgY29tcGlsYXRpb24gd2FybmluZworICAgICAgICBtX2lkID0gLTE7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFN0b3JhZ2VJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyLm91dGVyKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIExoczo6SXNSb3dNYWpvciA/IG1fbGhzSXRlci5yb3coKSA6IGluZGV4KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIExoczo6SXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX2xoc0l0ZXIuY29sKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ+PTA7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzSXRlcmF0b3IgbV9saHNJdGVyOworICAgIFJoc0l0ZXJhdG9yIG1fcmhzSXRlcjsKKyAgICBjb25zdCBCaW5hcnlPcCYgbV9mdW5jdG9yOworICAgIFNjYWxhciBtX3ZhbHVlOworICAgIFN0b3JhZ2VJbmRleCBtX2lkOworICB9OworICAKKyAgCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8TGhzPjo6Q29lZmZSZWFkQ29zdCArIGV2YWx1YXRvcjxSaHM+OjpDb2VmZlJlYWRDb3N0ICsgZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0LAorICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgfTsKKyAgCisgIGV4cGxpY2l0IGJpbmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogbV9mdW5jdG9yKHhwci5mdW5jdG9yKCkpLAorICAgICAgbV9saHNJbXBsKHhwci5saHMoKSksIAorICAgICAgbV9yaHNJbXBsKHhwci5yaHMoKSkgIAorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgCisgIGlubGluZSBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeworICAgIHJldHVybiBtX2xoc0ltcGwubm9uWmVyb3NFc3RpbWF0ZSgpICsgbV9yaHNJbXBsLm5vblplcm9zRXN0aW1hdGUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEJpbmFyeU9wIG1fZnVuY3RvcjsKKyAgZXZhbHVhdG9yPExocz4gbV9saHNJbXBsOworICBldmFsdWF0b3I8UmhzPiBtX3Joc0ltcGw7Cit9OworCisvLyBkZW5zZSBvcCBzcGFyc2UKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiwgSW5kZXhCYXNlZCwgSXRlcmF0b3JCYXNlZD4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxSaHM+OjpJbm5lckl0ZXJhdG9yICBSaHNJdGVyYXRvcjsKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKK3B1YmxpYzoKKworICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgIHsKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IChpbnQoUmhzOjpGbGFncykmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCB9OworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgYmluYXJ5X2V2YWx1YXRvciYgYUV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2xoc0V2YWwoYUV2YWwubV9saHNJbXBsKSwgbV9yaHNJdGVyKGFFdmFsLm1fcmhzSW1wbCxvdXRlciksIG1fZnVuY3RvcihhRXZhbC5tX2Z1bmN0b3IpLCBtX3ZhbHVlKDApLCBtX2lkKC0xKSwgbV9pbm5lclNpemUoYUV2YWwubV9leHByLnJocygpLmlubmVyU2l6ZSgpKQorICAgIHsKKyAgICAgIHRoaXMtPm9wZXJhdG9yKysoKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICsrbV9pZDsKKyAgICAgIGlmKG1faWQ8bV9pbm5lclNpemUpCisgICAgICB7CisgICAgICAgIFNjYWxhciBsaHNWYWwgPSBtX2xoc0V2YWwuY29lZmYoSXNSb3dNYWpvcj9tX3Joc0l0ZXIub3V0ZXIoKTptX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUm93TWFqb3I/bV9pZDptX3Joc0l0ZXIub3V0ZXIoKSk7CisgICAgICAgIGlmKG1fcmhzSXRlciAmJiBtX3Joc0l0ZXIuaW5kZXgoKT09bV9pZCkKKyAgICAgICAgeworICAgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IobGhzVmFsLCBtX3Joc0l0ZXIudmFsdWUoKSk7CisgICAgICAgICAgKyttX3Joc0l0ZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IobGhzVmFsLCBTY2FsYXIoMCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX2lkPG1faW5uZXJTaXplKTsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3RvcmFnZUluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggb3V0ZXIoKSBjb25zdCB7IHJldHVybiBtX3Joc0l0ZXIub3V0ZXIoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fcmhzSXRlci5vdXRlcigpIDogbV9pZDsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1faWQgOiBtX3Joc0l0ZXIub3V0ZXIoKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9pZDxtX2lubmVyU2l6ZTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBldmFsdWF0b3I8TGhzPiAmbV9saHNFdmFsOworICAgIFJoc0l0ZXJhdG9yIG1fcmhzSXRlcjsKKyAgICBjb25zdCBCaW5hcnlPcCYgbV9mdW5jdG9yOworICAgIFNjYWxhciBtX3ZhbHVlOworICAgIFN0b3JhZ2VJbmRleCBtX2lkOworICAgIFN0b3JhZ2VJbmRleCBtX2lubmVyU2l6ZTsKKyAgfTsKKworCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8TGhzPjo6Q29lZmZSZWFkQ29zdCArIGV2YWx1YXRvcjxSaHM+OjpDb2VmZlJlYWRDb3N0ICsgZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0LAorICAgIC8vIEV4cG9zZSBzdG9yYWdlIG9yZGVyIG9mIHRoZSBzcGFyc2UgZXhwcmVzc2lvbgorICAgIEZsYWdzID0gKFhwclR5cGU6OkZsYWdzICYgflJvd01ham9yQml0KSB8IChpbnQoUmhzOjpGbGFncykmUm93TWFqb3JCaXQpCisgIH07CisKKyAgZXhwbGljaXQgYmluYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX2Z1bmN0b3IoeHByLmZ1bmN0b3IoKSksCisgICAgICBtX2xoc0ltcGwoeHByLmxocygpKSwKKyAgICAgIG1fcmhzSW1wbCh4cHIucmhzKCkpLAorICAgICAgbV9leHByKHhwcikKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0KTsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICB9CisKKyAgaW5saW5lIEluZGV4IG5vblplcm9zRXN0aW1hdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZXhwci5zaXplKCk7CisgIH0KKworcHJvdGVjdGVkOgorICBjb25zdCBCaW5hcnlPcCBtX2Z1bmN0b3I7CisgIGV2YWx1YXRvcjxMaHM+IG1fbGhzSW1wbDsKKyAgZXZhbHVhdG9yPFJocz4gbV9yaHNJbXBsOworICBjb25zdCBYcHJUeXBlICZtX2V4cHI7Cit9OworCisvLyBzcGFyc2Ugb3AgZGVuc2UKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiwgSXRlcmF0b3JCYXNlZCwgSW5kZXhCYXNlZD4KKyAgOiBldmFsdWF0b3JfYmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yICBMaHNJdGVyYXRvcjsKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKK3B1YmxpYzoKKworICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgIHsKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IChpbnQoTGhzOjpGbGFncykmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCB9OworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgYmluYXJ5X2V2YWx1YXRvciYgYUV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2xoc0l0ZXIoYUV2YWwubV9saHNJbXBsLG91dGVyKSwgbV9yaHNFdmFsKGFFdmFsLm1fcmhzSW1wbCksIG1fZnVuY3RvcihhRXZhbC5tX2Z1bmN0b3IpLCBtX3ZhbHVlKDApLCBtX2lkKC0xKSwgbV9pbm5lclNpemUoYUV2YWwubV9leHByLmxocygpLmlubmVyU2l6ZSgpKQorICAgIHsKKyAgICAgIHRoaXMtPm9wZXJhdG9yKysoKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICsrbV9pZDsKKyAgICAgIGlmKG1faWQ8bV9pbm5lclNpemUpCisgICAgICB7CisgICAgICAgIFNjYWxhciByaHNWYWwgPSBtX3Joc0V2YWwuY29lZmYoSXNSb3dNYWpvcj9tX2xoc0l0ZXIub3V0ZXIoKTptX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUm93TWFqb3I/bV9pZDptX2xoc0l0ZXIub3V0ZXIoKSk7CisgICAgICAgIGlmKG1fbGhzSXRlciAmJiBtX2xoc0l0ZXIuaW5kZXgoKT09bV9pZCkKKyAgICAgICAgeworICAgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IobV9saHNJdGVyLnZhbHVlKCksIHJoc1ZhbCk7CisgICAgICAgICAgKyttX2xoc0l0ZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IoU2NhbGFyKDApLHJoc1ZhbCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG1faWQ8bV9pbm5lclNpemUpOyByZXR1cm4gbV92YWx1ZTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTdG9yYWdlSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lkOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBvdXRlcigpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5vdXRlcigpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9saHNJdGVyLm91dGVyKCkgOiBtX2lkOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9pZCA6IG1fbGhzSXRlci5vdXRlcigpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2lkPG1faW5uZXJTaXplOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIExoc0l0ZXJhdG9yIG1fbGhzSXRlcjsKKyAgICBjb25zdCBldmFsdWF0b3I8UmhzPiAmbV9yaHNFdmFsOworICAgIGNvbnN0IEJpbmFyeU9wJiBtX2Z1bmN0b3I7CisgICAgU2NhbGFyIG1fdmFsdWU7CisgICAgU3RvcmFnZUluZGV4IG1faWQ7CisgICAgU3RvcmFnZUluZGV4IG1faW5uZXJTaXplOworICB9OworCisKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxMaHM+OjpDb2VmZlJlYWRDb3N0ICsgZXZhbHVhdG9yPFJocz46OkNvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QsCisgICAgLy8gRXhwb3NlIHN0b3JhZ2Ugb3JkZXIgb2YgdGhlIHNwYXJzZSBleHByZXNzaW9uCisgICAgRmxhZ3MgPSAoWHByVHlwZTo6RmxhZ3MgJiB+Um93TWFqb3JCaXQpIHwgKGludChMaHM6OkZsYWdzKSZSb3dNYWpvckJpdCkKKyAgfTsKKworICBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IG1fZnVuY3Rvcih4cHIuZnVuY3RvcigpKSwKKyAgICAgIG1fbGhzSW1wbCh4cHIubGhzKCkpLAorICAgICAgbV9yaHNJbXBsKHhwci5yaHMoKSksCisgICAgICBtX2V4cHIoeHByKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKworICBpbmxpbmUgSW5kZXggbm9uWmVyb3NFc3RpbWF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9leHByLnNpemUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEJpbmFyeU9wIG1fZnVuY3RvcjsKKyAgZXZhbHVhdG9yPExocz4gbV9saHNJbXBsOworICBldmFsdWF0b3I8UmhzPiBtX3Joc0ltcGw7CisgIGNvbnN0IFhwclR5cGUgJm1fZXhwcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICB0eXBlbmFtZSBMaHNLaW5kICAgPSB0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPHR5cGVuYW1lIFQ6Okxocz46OktpbmQsCisgICAgICAgICB0eXBlbmFtZSBSaHNLaW5kICAgPSB0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPHR5cGVuYW1lIFQ6OlJocz46OktpbmQsCisgICAgICAgICB0eXBlbmFtZSBMaHNTY2FsYXIgPSB0eXBlbmFtZSB0cmFpdHM8dHlwZW5hbWUgVDo6TGhzPjo6U2NhbGFyLAorICAgICAgICAgdHlwZW5hbWUgUmhzU2NhbGFyID0gdHlwZW5hbWUgdHJhaXRzPHR5cGVuYW1lIFQ6OlJocz46OlNjYWxhcj4gc3RydWN0IHNwYXJzZV9jb25qdW5jdGlvbl9ldmFsdWF0b3I7CisKKy8vICJzcGFyc2UgLiogc3BhcnNlIgordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8c2NhbGFyX3Byb2R1Y3Rfb3A8VDEsVDI+LCBMaHMsIFJocz4sIEl0ZXJhdG9yQmFzZWQsIEl0ZXJhdG9yQmFzZWQ+CisgIDogc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlPiBCYXNlOworICBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBCYXNlKHhwcikge30KK307CisvLyAiZGVuc2UgLiogc3BhcnNlIgordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8c2NhbGFyX3Byb2R1Y3Rfb3A8VDEsVDI+LCBMaHMsIFJocz4sIEluZGV4QmFzZWQsIEl0ZXJhdG9yQmFzZWQ+CisgIDogc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlPiBCYXNlOworICBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBCYXNlKHhwcikge30KK307CisvLyAic3BhcnNlIC4qIGRlbnNlIgordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8c2NhbGFyX3Byb2R1Y3Rfb3A8VDEsVDI+LCBMaHMsIFJocz4sIEl0ZXJhdG9yQmFzZWQsIEluZGV4QmFzZWQ+CisgIDogc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPHNjYWxhcl9wcm9kdWN0X29wPFQxLFQyPiwgTGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlPiBCYXNlOworICBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBCYXNlKHhwcikge30KK307CisKKy8vICJzcGFyc2UgLi8gZGVuc2UiCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGJpbmFyeV9ldmFsdWF0b3I8Q3dpc2VCaW5hcnlPcDxzY2FsYXJfcXVvdGllbnRfb3A8VDEsVDI+LCBMaHMsIFJocz4sIEl0ZXJhdG9yQmFzZWQsIEluZGV4QmFzZWQ+CisgIDogc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9xdW90aWVudF9vcDxUMSxUMj4sIExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxzY2FsYXJfcXVvdGllbnRfb3A8VDEsVDI+LCBMaHMsIFJocz4gWHByVHlwZTsKKyAgdHlwZWRlZiBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yPFhwclR5cGU+IEJhc2U7CisgIGV4cGxpY2l0IGJpbmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKSA6IEJhc2UoeHByKSB7fQorfTsKKworLy8gInNwYXJzZSAmJiBzcGFyc2UiCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBiaW5hcnlfZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8c2NhbGFyX2Jvb2xlYW5fYW5kX29wLCBMaHMsIFJocz4sIEl0ZXJhdG9yQmFzZWQsIEl0ZXJhdG9yQmFzZWQ+CisgIDogc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9ib29sZWFuX2FuZF9vcCwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPHNjYWxhcl9ib29sZWFuX2FuZF9vcCwgTGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlPiBCYXNlOworICBleHBsaWNpdCBiaW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBCYXNlKHhwcikge30KK307CisvLyAiZGVuc2UgJiYgc3BhcnNlIgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgYmluYXJ5X2V2YWx1YXRvcjxDd2lzZUJpbmFyeU9wPHNjYWxhcl9ib29sZWFuX2FuZF9vcCwgTGhzLCBSaHM+LCBJbmRleEJhc2VkLCBJdGVyYXRvckJhc2VkPgorICA6IHNwYXJzZV9jb25qdW5jdGlvbl9ldmFsdWF0b3I8Q3dpc2VCaW5hcnlPcDxzY2FsYXJfYm9vbGVhbl9hbmRfb3AsIExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxzY2FsYXJfYm9vbGVhbl9hbmRfb3AsIExocywgUmhzPiBYcHJUeXBlOworICB0eXBlZGVmIHNwYXJzZV9jb25qdW5jdGlvbl9ldmFsdWF0b3I8WHByVHlwZT4gQmFzZTsKKyAgZXhwbGljaXQgYmluYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpIDogQmFzZSh4cHIpIHt9Cit9OworLy8gInNwYXJzZSAmJiBkZW5zZSIKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IGJpbmFyeV9ldmFsdWF0b3I8Q3dpc2VCaW5hcnlPcDxzY2FsYXJfYm9vbGVhbl9hbmRfb3AsIExocywgUmhzPiwgSXRlcmF0b3JCYXNlZCwgSW5kZXhCYXNlZD4KKyAgOiBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yPEN3aXNlQmluYXJ5T3A8c2NhbGFyX2Jvb2xlYW5fYW5kX29wLCBMaHMsIFJocz4gPgoreworICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8c2NhbGFyX2Jvb2xlYW5fYW5kX29wLCBMaHMsIFJocz4gWHByVHlwZTsKKyAgdHlwZWRlZiBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yPFhwclR5cGU+IEJhc2U7CisgIGV4cGxpY2l0IGJpbmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKSA6IEJhc2UoeHByKSB7fQorfTsKKworLy8gInNwYXJzZSBeIHNwYXJzZSIKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3Qgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlLCBJdGVyYXRvckJhc2VkLCBJdGVyYXRvckJhc2VkPgorICA6IGV2YWx1YXRvcl9iYXNlPFhwclR5cGU+Cit7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6RnVuY3RvciBCaW5hcnlPcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpMaHMgTGhzQXJnOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlJocyBSaHNBcmc7CisgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPExoc0FyZz46OklubmVySXRlcmF0b3IgIExoc0l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxSaHNBcmc+OjpJbm5lckl0ZXJhdG9yICBSaHNJdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKK3B1YmxpYzoKKworICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgIHsKKyAgcHVibGljOgorICAgIAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yJiBhRXZhbCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbGhzSXRlcihhRXZhbC5tX2xoc0ltcGwsb3V0ZXIpLCBtX3Joc0l0ZXIoYUV2YWwubV9yaHNJbXBsLG91dGVyKSwgbV9mdW5jdG9yKGFFdmFsLm1fZnVuY3RvcikKKyAgICB7CisgICAgICB3aGlsZSAobV9saHNJdGVyICYmIG1fcmhzSXRlciAmJiAobV9saHNJdGVyLmluZGV4KCkgIT0gbV9yaHNJdGVyLmluZGV4KCkpKQorICAgICAgeworICAgICAgICBpZiAobV9saHNJdGVyLmluZGV4KCkgPCBtX3Joc0l0ZXIuaW5kZXgoKSkKKyAgICAgICAgICArK21fbGhzSXRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICsrbV9yaHNJdGVyOworICAgICAgfQorICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgKyttX2xoc0l0ZXI7CisgICAgICArK21fcmhzSXRlcjsKKyAgICAgIHdoaWxlIChtX2xoc0l0ZXIgJiYgbV9yaHNJdGVyICYmIChtX2xoc0l0ZXIuaW5kZXgoKSAhPSBtX3Joc0l0ZXIuaW5kZXgoKSkpCisgICAgICB7CisgICAgICAgIGlmIChtX2xoc0l0ZXIuaW5kZXgoKSA8IG1fcmhzSXRlci5pbmRleCgpKQorICAgICAgICAgICsrbV9saHNJdGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgKyttX3Joc0l0ZXI7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yKG1fbGhzSXRlci52YWx1ZSgpLCBtX3Joc0l0ZXIudmFsdWUoKSk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3RvcmFnZUluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyLmluZGV4KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyLm91dGVyKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5yb3coKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyLmNvbCgpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobV9saHNJdGVyICYmIG1fcmhzSXRlcik7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzSXRlcmF0b3IgbV9saHNJdGVyOworICAgIFJoc0l0ZXJhdG9yIG1fcmhzSXRlcjsKKyAgICBjb25zdCBCaW5hcnlPcCYgbV9mdW5jdG9yOworICB9OworICAKKyAgCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8TGhzQXJnPjo6Q29lZmZSZWFkQ29zdCArIGV2YWx1YXRvcjxSaHNBcmc+OjpDb2VmZlJlYWRDb3N0ICsgZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0LAorICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgfTsKKyAgCisgIGV4cGxpY2l0IHNwYXJzZV9jb25qdW5jdGlvbl9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogbV9mdW5jdG9yKHhwci5mdW5jdG9yKCkpLAorICAgICAgbV9saHNJbXBsKHhwci5saHMoKSksIAorICAgICAgbV9yaHNJbXBsKHhwci5yaHMoKSkgIAorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgCisgIGlubGluZSBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeworICAgIHJldHVybiAoc3RkOjptaW4pKG1fbGhzSW1wbC5ub25aZXJvc0VzdGltYXRlKCksIG1fcmhzSW1wbC5ub25aZXJvc0VzdGltYXRlKCkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgQmluYXJ5T3AgbV9mdW5jdG9yOworICBldmFsdWF0b3I8TGhzQXJnPiBtX2xoc0ltcGw7CisgIGV2YWx1YXRvcjxSaHNBcmc+IG1fcmhzSW1wbDsKK307CisKKy8vICJkZW5zZSBeIHNwYXJzZSIKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3Qgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlLCBJbmRleEJhc2VkLCBJdGVyYXRvckJhc2VkPgorICA6IGV2YWx1YXRvcl9iYXNlPFhwclR5cGU+Cit7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6RnVuY3RvciBCaW5hcnlPcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpMaHMgTGhzQXJnOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlJocyBSaHNBcmc7CisgIHR5cGVkZWYgZXZhbHVhdG9yPExoc0FyZz4gTGhzRXZhbHVhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxSaHNBcmc+OjpJbm5lckl0ZXJhdG9yICBSaHNJdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKK3B1YmxpYzoKKworICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgIHsKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IChpbnQoUmhzQXJnOjpGbGFncykmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCB9OworCisgIHB1YmxpYzoKKyAgICAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3Qgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvciYgYUV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2xoc0V2YWwoYUV2YWwubV9saHNJbXBsKSwgbV9yaHNJdGVyKGFFdmFsLm1fcmhzSW1wbCxvdXRlciksIG1fZnVuY3RvcihhRXZhbC5tX2Z1bmN0b3IpLCBtX291dGVyKG91dGVyKQorICAgIHt9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICsrbV9yaHNJdGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHZhbHVlKCkgY29uc3QKKyAgICB7IHJldHVybiBtX2Z1bmN0b3IobV9saHNFdmFsLmNvZWZmKElzUm93TWFqb3I/bV9vdXRlcjptX3Joc0l0ZXIuaW5kZXgoKSxJc1Jvd01ham9yP21fcmhzSXRlci5pbmRleCgpOm1fb3V0ZXIpLCBtX3Joc0l0ZXIudmFsdWUoKSk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3RvcmFnZUluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9yaHNJdGVyLmluZGV4KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9yaHNJdGVyLm91dGVyKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzSXRlci5yb3coKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gbV9yaHNJdGVyLmNvbCgpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3Joc0l0ZXI7IH0KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IExoc0V2YWx1YXRvciAmbV9saHNFdmFsOworICAgIFJoc0l0ZXJhdG9yIG1fcmhzSXRlcjsKKyAgICBjb25zdCBCaW5hcnlPcCYgbV9mdW5jdG9yOworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgIH07CisgIAorICAKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxMaHNBcmc+OjpDb2VmZlJlYWRDb3N0ICsgZXZhbHVhdG9yPFJoc0FyZz46OkNvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QsCisgICAgLy8gRXhwb3NlIHN0b3JhZ2Ugb3JkZXIgb2YgdGhlIHNwYXJzZSBleHByZXNzaW9uCisgICAgRmxhZ3MgPSAoWHByVHlwZTo6RmxhZ3MgJiB+Um93TWFqb3JCaXQpIHwgKGludChSaHNBcmc6OkZsYWdzKSZSb3dNYWpvckJpdCkKKyAgfTsKKyAgCisgIGV4cGxpY2l0IHNwYXJzZV9jb25qdW5jdGlvbl9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogbV9mdW5jdG9yKHhwci5mdW5jdG9yKCkpLAorICAgICAgbV9saHNJbXBsKHhwci5saHMoKSksIAorICAgICAgbV9yaHNJbXBsKHhwci5yaHMoKSkgIAorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QpOworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgCisgIGlubGluZSBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeworICAgIHJldHVybiBtX3Joc0ltcGwubm9uWmVyb3NFc3RpbWF0ZSgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgQmluYXJ5T3AgbV9mdW5jdG9yOworICBldmFsdWF0b3I8TGhzQXJnPiBtX2xoc0ltcGw7CisgIGV2YWx1YXRvcjxSaHNBcmc+IG1fcmhzSW1wbDsKK307CisKKy8vICJzcGFyc2UgXiBkZW5zZSIKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3Qgc3BhcnNlX2Nvbmp1bmN0aW9uX2V2YWx1YXRvcjxYcHJUeXBlLCBJdGVyYXRvckJhc2VkLCBJbmRleEJhc2VkPgorICA6IGV2YWx1YXRvcl9iYXNlPFhwclR5cGU+Cit7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6RnVuY3RvciBCaW5hcnlPcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpMaHMgTGhzQXJnOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlJocyBSaHNBcmc7CisgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPExoc0FyZz46OklubmVySXRlcmF0b3IgTGhzSXRlcmF0b3I7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFJoc0FyZz4gUmhzRXZhbHVhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpTY2FsYXIgU2NhbGFyOworcHVibGljOgorCisgIGNsYXNzIElubmVySXRlcmF0b3IKKyAgeworICAgIGVudW0geyBJc1Jvd01ham9yID0gKGludChMaHNBcmc6OkZsYWdzKSZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0IH07CisKKyAgcHVibGljOgorICAgIAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yJiBhRXZhbCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbGhzSXRlcihhRXZhbC5tX2xoc0ltcGwsb3V0ZXIpLCBtX3Joc0V2YWwoYUV2YWwubV9yaHNJbXBsKSwgbV9mdW5jdG9yKGFFdmFsLm1fZnVuY3RvciksIG1fb3V0ZXIob3V0ZXIpCisgICAge30KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgKyttX2xoc0l0ZXI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fZnVuY3RvcihtX2xoc0l0ZXIudmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9yaHNFdmFsLmNvZWZmKElzUm93TWFqb3I/bV9vdXRlcjptX2xoc0l0ZXIuaW5kZXgoKSxJc1Jvd01ham9yP21fbGhzSXRlci5pbmRleCgpOm1fb3V0ZXIpKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTdG9yYWdlSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xoc0l0ZXIuaW5kZXgoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggb3V0ZXIoKSBjb25zdCB7IHJldHVybiBtX2xoc0l0ZXIub3V0ZXIoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyLnJvdygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBtX2xoc0l0ZXIuY29sKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlcjsgfQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgTGhzSXRlcmF0b3IgbV9saHNJdGVyOworICAgIGNvbnN0IGV2YWx1YXRvcjxSaHNBcmc+ICZtX3Joc0V2YWw7CisgICAgY29uc3QgQmluYXJ5T3AmIG1fZnVuY3RvcjsKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworICB9OworICAKKyAgCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8TGhzQXJnPjo6Q29lZmZSZWFkQ29zdCArIGV2YWx1YXRvcjxSaHNBcmc+OjpDb2VmZlJlYWRDb3N0ICsgZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0LAorICAgIC8vIEV4cG9zZSBzdG9yYWdlIG9yZGVyIG9mIHRoZSBzcGFyc2UgZXhwcmVzc2lvbgorICAgIEZsYWdzID0gKFhwclR5cGU6OkZsYWdzICYgflJvd01ham9yQml0KSB8IChpbnQoTGhzQXJnOjpGbGFncykmUm93TWFqb3JCaXQpCisgIH07CisgIAorICBleHBsaWNpdCBzcGFyc2VfY29uanVuY3Rpb25fZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IG1fZnVuY3Rvcih4cHIuZnVuY3RvcigpKSwKKyAgICAgIG1fbGhzSW1wbCh4cHIubGhzKCkpLCAKKyAgICAgIG1fcmhzSW1wbCh4cHIucmhzKCkpICAKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0KTsKKyAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICB9CisgIAorICBpbmxpbmUgSW5kZXggbm9uWmVyb3NFc3RpbWF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9saHNJbXBsLm5vblplcm9zRXN0aW1hdGUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbnN0IEJpbmFyeU9wIG1fZnVuY3RvcjsKKyAgZXZhbHVhdG9yPExoc0FyZz4gbV9saHNJbXBsOworICBldmFsdWF0b3I8UmhzQXJnPiBtX3Joc0ltcGw7Cit9OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgU3BhcnNlTWF0cml4QmFzZSBhbmQgU3BhcnNlQ3dpc2UgZnVuY3Rpb25zL29wZXJhdG9ycworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IrPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIGNhbGxfYXNzaWdubWVudChkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0Rlcml2ZWQmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLT0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBjYWxsX2Fzc2lnbm1lbnQoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIHJldHVybiBkZXJpdmVkKCkgPSBkZXJpdmVkKCkgLSBvdGhlci5kZXJpdmVkKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IrPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICByZXR1cm4gZGVyaXZlZCgpID0gZGVyaXZlZCgpICsgb3RoZXIuZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IrPShjb25zdCBEaWFnb25hbEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGNhbGxfYXNzaWdubWVudF9ub19hbGlhcyhkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0Rlcml2ZWQmIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLT0oY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj4oKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisgICAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBDd2lzZVByb2R1Y3REZW5zZVJldHVyblR5cGU8T3RoZXJEZXJpdmVkPjo6VHlwZQorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6Y3dpc2VQcm9kdWN0KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDd2lzZVByb2R1Y3REZW5zZVJldHVyblR5cGU8T3RoZXJEZXJpdmVkPjo6VHlwZShkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZCwgdHlwZW5hbWUgU3BhcnNlRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBEZW5zZURlcml2ZWQ6OlNjYWxhcix0eXBlbmFtZSBTcGFyc2VEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZW5zZURlcml2ZWQsIGNvbnN0IFNwYXJzZURlcml2ZWQ+CitvcGVyYXRvcisoY29uc3QgTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZURlcml2ZWQ+ICZiKQoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBEZW5zZURlcml2ZWQ6OlNjYWxhcix0eXBlbmFtZSBTcGFyc2VEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZW5zZURlcml2ZWQsIGNvbnN0IFNwYXJzZURlcml2ZWQ+KGEuZGVyaXZlZCgpLCBiLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZURlcml2ZWQsIHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkOjpTY2FsYXIsdHlwZW5hbWUgRGVuc2VEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBTcGFyc2VEZXJpdmVkLCBjb25zdCBEZW5zZURlcml2ZWQ+CitvcGVyYXRvcisoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VEZXJpdmVkPiAmYSwgY29uc3QgTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZiKQoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkOjpTY2FsYXIsdHlwZW5hbWUgRGVuc2VEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBTcGFyc2VEZXJpdmVkLCBjb25zdCBEZW5zZURlcml2ZWQ+KGEuZGVyaXZlZCgpLCBiLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZCwgdHlwZW5hbWUgU3BhcnNlRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8dHlwZW5hbWUgRGVuc2VEZXJpdmVkOjpTY2FsYXIsdHlwZW5hbWUgU3BhcnNlRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVuc2VEZXJpdmVkLCBjb25zdCBTcGFyc2VEZXJpdmVkPgorb3BlcmF0b3ItKGNvbnN0IE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiAmYSwgY29uc3QgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VEZXJpdmVkPiAmYikKK3sKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPHR5cGVuYW1lIERlbnNlRGVyaXZlZDo6U2NhbGFyLHR5cGVuYW1lIFNwYXJzZURlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlbnNlRGVyaXZlZCwgY29uc3QgU3BhcnNlRGVyaXZlZD4oYS5kZXJpdmVkKCksIGIuZGVyaXZlZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlRGVyaXZlZCwgdHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkOjpTY2FsYXIsdHlwZW5hbWUgRGVuc2VEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBTcGFyc2VEZXJpdmVkLCBjb25zdCBEZW5zZURlcml2ZWQ+CitvcGVyYXRvci0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VEZXJpdmVkPiAmYSwgY29uc3QgTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZiKQoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8dHlwZW5hbWUgU3BhcnNlRGVyaXZlZDo6U2NhbGFyLHR5cGVuYW1lIERlbnNlRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgU3BhcnNlRGVyaXZlZCwgY29uc3QgRGVuc2VEZXJpdmVkPihhLmRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9DV0lTRV9CSU5BUllfT1BfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VVbmFyeU9wLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDd2lzZVVuYXJ5T3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc5NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VVbmFyeU9wLmgKQEAgLTAsMCArMSwxNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9DV0lTRV9VTkFSWV9PUF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DV0lTRV9VTkFSWV9PUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEN3aXNlVW5hcnlPcDxVbmFyeU9wLEFyZ1R5cGU+LCBJdGVyYXRvckJhc2VkPgorICA6IHB1YmxpYyBldmFsdWF0b3JfYmFzZTxDd2lzZVVuYXJ5T3A8VW5hcnlPcCxBcmdUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBBcmdUeXBlPiBYcHJUeXBlOworCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICAKKyAgICBlbnVtIHsKKyAgICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxVbmFyeU9wPjo6Q29zdCwKKyAgICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgICB9OworICAgIAorICAgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCkgOiBtX2Z1bmN0b3Iob3AuZnVuY3RvcigpKSwgbV9hcmdJbXBsKG9wLm5lc3RlZEV4cHJlc3Npb24oKSkKKyAgICB7CisgICAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKGZ1bmN0b3JfdHJhaXRzPFVuYXJ5T3A+OjpDb3N0KTsKKyAgICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgICAgfQorICAgIAorICAgIGlubGluZSBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1fYXJnSW1wbC5ub25aZXJvc0VzdGltYXRlKCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxBcmdUeXBlPjo6SW5uZXJJdGVyYXRvciAgICAgICAgRXZhbEl0ZXJhdG9yOworICAgIAorICAgIGNvbnN0IFVuYXJ5T3AgbV9mdW5jdG9yOworICAgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBBcmdUeXBlPgorY2xhc3MgdW5hcnlfZXZhbHVhdG9yPEN3aXNlVW5hcnlPcDxVbmFyeU9wLEFyZ1R5cGU+LCBJdGVyYXRvckJhc2VkPjo6SW5uZXJJdGVyYXRvcgorICAgIDogcHVibGljIHVuYXJ5X2V2YWx1YXRvcjxDd2lzZVVuYXJ5T3A8VW5hcnlPcCxBcmdUeXBlPiwgSXRlcmF0b3JCYXNlZD46OkV2YWxJdGVyYXRvcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHVuYXJ5X2V2YWx1YXRvcjxDd2lzZVVuYXJ5T3A8VW5hcnlPcCxBcmdUeXBlPiwgSXRlcmF0b3JCYXNlZD46OkV2YWxJdGVyYXRvciBCYXNlOworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgdW5hcnlfZXZhbHVhdG9yJiB1bmFyeU9wLCBJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZSh1bmFyeU9wLm1fYXJnSW1wbCxvdXRlciksIG1fZnVuY3Rvcih1bmFyeU9wLm1fZnVuY3RvcikKKyAgICB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbm5lckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICB7IEJhc2U6Om9wZXJhdG9yKysoKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnVuY3RvcihCYXNlOjp2YWx1ZSgpKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBVbmFyeU9wIG1fZnVuY3RvcjsKKyAgcHJpdmF0ZToKKyAgICBTY2FsYXImIHZhbHVlUmVmKCk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWaWV3T3AsIHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPEN3aXNlVW5hcnlWaWV3PFZpZXdPcCxBcmdUeXBlPiwgSXRlcmF0b3JCYXNlZD4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yX2Jhc2U8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLEFyZ1R5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQ3dpc2VVbmFyeVZpZXc8Vmlld09wLCBBcmdUeXBlPiBYcHJUeXBlOworCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICAKKyAgICBlbnVtIHsKKyAgICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxWaWV3T3A+OjpDb3N0LAorICAgICAgRmxhZ3MgPSBYcHJUeXBlOjpGbGFncworICAgIH07CisgICAgCisgICAgZXhwbGljaXQgdW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wKSA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLCBtX2FyZ0ltcGwob3AubmVzdGVkRXhwcmVzc2lvbigpKQorICAgIHsKKyAgICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoZnVuY3Rvcl90cmFpdHM8Vmlld09wPjo6Q29zdCk7CisgICAgICBFSUdFTl9JTlRFUk5BTF9DSEVDS19DT1NUX1ZBTFVFKENvZWZmUmVhZENvc3QpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8QXJnVHlwZT46OklubmVySXRlcmF0b3IgICAgICAgIEV2YWxJdGVyYXRvcjsKKyAgICAKKyAgICBjb25zdCBWaWV3T3AgbV9mdW5jdG9yOworICAgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWaWV3T3AsIHR5cGVuYW1lIEFyZ1R5cGU+CitjbGFzcyB1bmFyeV9ldmFsdWF0b3I8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLEFyZ1R5cGU+LCBJdGVyYXRvckJhc2VkPjo6SW5uZXJJdGVyYXRvcgorICAgIDogcHVibGljIHVuYXJ5X2V2YWx1YXRvcjxDd2lzZVVuYXJ5VmlldzxWaWV3T3AsQXJnVHlwZT4sIEl0ZXJhdG9yQmFzZWQ+OjpFdmFsSXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmFyeV9ldmFsdWF0b3I8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLEFyZ1R5cGU+LCBJdGVyYXRvckJhc2VkPjo6RXZhbEl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIHVuYXJ5T3AsIEluZGV4IG91dGVyKQorICAgICAgOiBCYXNlKHVuYXJ5T3AubV9hcmdJbXBsLG91dGVyKSwgbV9mdW5jdG9yKHVuYXJ5T3AubV9mdW5jdG9yKQorICAgIHt9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsgQmFzZTo6b3BlcmF0b3IrKygpOyByZXR1cm4gKnRoaXM7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yKEJhc2U6OnZhbHVlKCkpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gbV9mdW5jdG9yKEJhc2U6OnZhbHVlUmVmKCkpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFZpZXdPcCBtX2Z1bmN0b3I7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKj0oY29uc3QgU2NhbGFyJiBvdGhlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+OjpJbm5lckl0ZXJhdG9yIEV2YWxJdGVyYXRvcjsKKyAgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPiB0aGlzRXZhbChkZXJpdmVkKCkpOworICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgIGZvciAoRXZhbEl0ZXJhdG9yIGkodGhpc0V2YWwsaik7IGk7ICsraSkKKyAgICAgIGkudmFsdWVSZWYoKSAqPSBvdGhlcjsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLz0oY29uc3QgU2NhbGFyJiBvdGhlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+OjpJbm5lckl0ZXJhdG9yIEV2YWxJdGVyYXRvcjsKKyAgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPiB0aGlzRXZhbChkZXJpdmVkKCkpOworICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgIGZvciAoRXZhbEl0ZXJhdG9yIGkodGhpc0V2YWwsaik7IGk7ICsraSkKKyAgICAgIGkudmFsdWVSZWYoKSAvPSBvdGhlcjsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQ1dJU0VfVU5BUllfT1BfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlRGVuc2VQcm9kdWN0LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEZW5zZVByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlRGVuc2VQcm9kdWN0LmgKQEAgLTAsMCArMSwzMjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRURFTlNFUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRURFTlNFUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxTcGFyc2UsRGVuc2UsIE91dGVyUHJvZHVjdD4geyB0eXBlZGVmIFNwYXJzZSByZXQ7IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcHJvZHVjdF9wcm9tb3RlX3N0b3JhZ2VfdHlwZTxEZW5zZSxTcGFyc2UsIE91dGVyUHJvZHVjdD4geyB0eXBlZGVmIFNwYXJzZSByZXQ7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZUxoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlLAorICAgICAgICAgdHlwZW5hbWUgQWxwaGFUeXBlLAorICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciA9ICgoU3BhcnNlTGhzVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgICAgYm9vbCBDb2xQZXJDb2wgPSAoKERlbnNlUmhzVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKSB8fCBEZW5zZVJoc1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT0xPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTGhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJlc1R5cGU+CitzdHJ1Y3Qgc3BhcnNlX3RpbWVfZGVuc2VfcHJvZHVjdF9pbXBsPFNwYXJzZUxoc1R5cGUsRGVuc2VSaHNUeXBlLERlbnNlUmVzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlOjpTY2FsYXIsIFJvd01ham9yLCB0cnVlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFNwYXJzZUxoc1R5cGU+Ojp0eXBlIExoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZW5zZVJoc1R5cGU+Ojp0eXBlIFJoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZW5zZVJlc1R5cGU+Ojp0eXBlIFJlczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8TGhzPjo6SW5uZXJJdGVyYXRvciBMaHNJbm5lckl0ZXJhdG9yOworICB0eXBlZGVmIGV2YWx1YXRvcjxMaHM+IExoc0V2YWw7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgY29uc3QgdHlwZW5hbWUgUmVzOjpTY2FsYXImIGFscGhhKQorICB7CisgICAgTGhzRXZhbCBsaHNFdmFsKGxocyk7CisgICAgCisgICAgSW5kZXggbiA9IGxocy5vdXRlclNpemUoKTsKKyNpZmRlZiBFSUdFTl9IQVNfT1BFTk1QCisgICAgRWlnZW46OmluaXRQYXJhbGxlbCgpOworICAgIEluZGV4IHRocmVhZHMgPSBFaWdlbjo6bmJUaHJlYWRzKCk7CisjZW5kaWYKKyAgICAKKyAgICBmb3IoSW5kZXggYz0wOyBjPHJocy5jb2xzKCk7ICsrYykKKyAgICB7CisjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAorICAgICAgLy8gVGhpcyAyMDAwMCB0aHJlc2hvbGQgaGFzIGJlZW4gZm91bmQgZXhwZXJpbWVudGFsbHkgb24gMkQgYW5kIDNEIFBvaXNzb24gcHJvYmxlbXMuCisgICAgICAvLyBJdCBiYXNpY2FsbHkgcmVwcmVzZW50cyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayB0byBiZSBkb25lIHRvIGJlIHdvcnRoIGl0LgorICAgICAgaWYodGhyZWFkcz4xICYmIGxoc0V2YWwubm9uWmVyb3NFc3RpbWF0ZSgpID4gMjAwMDApCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLChuK3RocmVhZHMqNC0xKS8odGhyZWFkcyo0KSkgbnVtX3RocmVhZHModGhyZWFkcykKKyAgICAgICAgZm9yKEluZGV4IGk9MDsgaTxuOyArK2kpCisgICAgICAgICAgcHJvY2Vzc1JvdyhsaHNFdmFsLHJocyxyZXMsYWxwaGEsaSxjKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeworICAgICAgICBmb3IoSW5kZXggaT0wOyBpPG47ICsraSkKKyAgICAgICAgICBwcm9jZXNzUm93KGxoc0V2YWwscmhzLHJlcyxhbHBoYSxpLGMpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgc3RhdGljIHZvaWQgcHJvY2Vzc1Jvdyhjb25zdCBMaHNFdmFsJiBsaHNFdmFsLCBjb25zdCBEZW5zZVJoc1R5cGUmIHJocywgRGVuc2VSZXNUeXBlJiByZXMsIGNvbnN0IHR5cGVuYW1lIFJlczo6U2NhbGFyJiBhbHBoYSwgSW5kZXggaSwgSW5kZXggY29sKQorICB7CisgICAgdHlwZW5hbWUgUmVzOjpTY2FsYXIgdG1wKDApOworICAgIGZvcihMaHNJbm5lckl0ZXJhdG9yIGl0KGxoc0V2YWwsaSk7IGl0IDsrK2l0KQorICAgICAgdG1wICs9IGl0LnZhbHVlKCkgKiByaHMuY29lZmYoaXQuaW5kZXgoKSxjb2wpOworICAgIHJlcy5jb2VmZlJlZihpLGNvbCkgKz0gYWxwaGEgKiB0bXA7CisgIH0KKyAgCit9OworCisvLyBGSVhNRTogd2hhdCBpcyB0aGUgcHVycG9zZSBvZiB0aGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uPyBJcyBpdCBmb3IgdGhlIEJsb2NrZWRTcGFyc2UgZm9ybWF0PworLy8gLT4gbGV0J3MgZGlzYWJsZSBpdCBmb3Igbm93IGFzIGl0IGlzIGNvbmZsaWN0aW5nIHdpdGggZ2VuZXJpYyBzY2FsYXIqbWF0cml4IGFuZCBtYXRyaXgqc2NhbGFyIG9wZXJhdG9ycworLy8gdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLyosIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0cmlkZVR5cGUqLz4KKy8vIHN0cnVjdCBTY2FsYXJCaW5hcnlPcFRyYWl0czxUMSwgUmVmPFQyLyosIF9PcHRpb25zLCBfU3RyaWRlVHlwZSovPiA+CisvLyB7CisvLyAgIGVudW0geworLy8gICAgIERlZmluZWQgPSAxCisvLyAgIH07CisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZTJfb3A8VDEsIHR5cGVuYW1lIFQyOjpTY2FsYXI+LCBUMj46OlBsYWluT2JqZWN0IFJldHVyblR5cGU7CisvLyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VMaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZSwgdHlwZW5hbWUgQWxwaGFUeXBlPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDxTcGFyc2VMaHNUeXBlLERlbnNlUmhzVHlwZSxEZW5zZVJlc1R5cGUsIEFscGhhVHlwZSwgQ29sTWFqb3IsIHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8U3BhcnNlTGhzVHlwZT46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmhzVHlwZT46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmVzVHlwZT46OnR5cGUgUmVzOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgY29uc3QgQWxwaGFUeXBlJiBhbHBoYSkKKyAgeworICAgIGV2YWx1YXRvcjxMaHM+IGxoc0V2YWwobGhzKTsKKyAgICBmb3IoSW5kZXggYz0wOyBjPHJocy5jb2xzKCk7ICsrYykKKyAgICB7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPGxocy5vdXRlclNpemUoKTsgKytqKQorICAgICAgeworLy8gICAgICAgIHR5cGVuYW1lIFJlczo6U2NhbGFyIHJoc19qID0gYWxwaGEgKiByaHMuY29lZmYoaixjKTsKKyAgICAgICAgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8QWxwaGFUeXBlLCB0eXBlbmFtZSBSaHM6OlNjYWxhcj46OlJldHVyblR5cGUgcmhzX2ooYWxwaGEgKiByaHMuY29lZmYoaixjKSk7CisgICAgICAgIGZvcihMaHNJbm5lckl0ZXJhdG9yIGl0KGxoc0V2YWwsaik7IGl0IDsrK2l0KQorICAgICAgICAgIHJlcy5jb2VmZlJlZihpdC5pbmRleCgpLGMpICs9IGl0LnZhbHVlKCkgKiByaHNfajsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZUxoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDxTcGFyc2VMaHNUeXBlLERlbnNlUmhzVHlwZSxEZW5zZVJlc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZTo6U2NhbGFyLCBSb3dNYWpvciwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8U3BhcnNlTGhzVHlwZT46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmhzVHlwZT46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmVzVHlwZT46OnR5cGUgUmVzOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgY29uc3QgdHlwZW5hbWUgUmVzOjpTY2FsYXImIGFscGhhKQorICB7CisgICAgZXZhbHVhdG9yPExocz4gbGhzRXZhbChsaHMpOworICAgIGZvcihJbmRleCBqPTA7IGo8bGhzLm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgdHlwZW5hbWUgUmVzOjpSb3dYcHIgcmVzX2oocmVzLnJvdyhqKSk7CisgICAgICBmb3IoTGhzSW5uZXJJdGVyYXRvciBpdChsaHNFdmFsLGopOyBpdCA7KytpdCkKKyAgICAgICAgcmVzX2ogKz0gKGFscGhhKml0LnZhbHVlKCkpICogcmhzLnJvdyhpdC5pbmRleCgpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZUxoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDxTcGFyc2VMaHNUeXBlLERlbnNlUmhzVHlwZSxEZW5zZVJlc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZTo6U2NhbGFyLCBDb2xNYWpvciwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8U3BhcnNlTGhzVHlwZT46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmhzVHlwZT46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmVzVHlwZT46OnR5cGUgUmVzOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgY29uc3QgdHlwZW5hbWUgUmVzOjpTY2FsYXImIGFscGhhKQorICB7CisgICAgZXZhbHVhdG9yPExocz4gbGhzRXZhbChsaHMpOworICAgIGZvcihJbmRleCBqPTA7IGo8bGhzLm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgdHlwZW5hbWUgUmhzOjpDb25zdFJvd1hwciByaHNfaihyaHMucm93KGopKTsKKyAgICAgIGZvcihMaHNJbm5lckl0ZXJhdG9yIGl0KGxoc0V2YWwsaik7IGl0IDsrK2l0KQorICAgICAgICByZXMucm93KGl0LmluZGV4KCkpICs9IChhbHBoYSppdC52YWx1ZSgpKSAqIHJoc19qOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTGhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJlc1R5cGUsdHlwZW5hbWUgQWxwaGFUeXBlPgoraW5saW5lIHZvaWQgc3BhcnNlX3RpbWVfZGVuc2VfcHJvZHVjdChjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgY29uc3QgQWxwaGFUeXBlJiBhbHBoYSkKK3sKKyAgc3BhcnNlX3RpbWVfZGVuc2VfcHJvZHVjdF9pbXBsPFNwYXJzZUxoc1R5cGUsRGVuc2VSaHNUeXBlLERlbnNlUmVzVHlwZSwgQWxwaGFUeXBlPjo6cnVuKGxocywgcmhzLCByZXMsIGFscGhhKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFR5cGU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVNoYXBlLCBEZW5zZVNoYXBlLCBQcm9kdWN0VHlwZT4KKyA6IGdlbmVyaWNfcHJvZHVjdF9pbXBsX2Jhc2U8TGhzLFJocyxnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsUmhzLFNwYXJzZVNoYXBlLERlbnNlU2hhcGUsUHJvZHVjdFR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PExocyxSaHM+OjpTY2FsYXIgU2NhbGFyOworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8TGhzLCgoUmhzOjpGbGFncyZSb3dNYWpvckJpdCk9PTApID8gMSA6IFJoczo6Q29sc0F0Q29tcGlsZVRpbWU+Ojp0eXBlIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPFJocywoKExoczo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKSA/IDEgOiBEeW5hbWljPjo6dHlwZSBSaHNOZXN0ZWQ7CisgICAgTGhzTmVzdGVkIGxoc05lc3RlZChsaHMpOworICAgIFJoc05lc3RlZCByaHNOZXN0ZWQocmhzKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3RpbWVfZGVuc2VfcHJvZHVjdChsaHNOZXN0ZWQsIHJoc05lc3RlZCwgZHN0LCBhbHBoYSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFR5cGU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVRyaWFuZ3VsYXJTaGFwZSwgRGVuc2VTaGFwZSwgUHJvZHVjdFR5cGU+CisgIDogZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVNoYXBlLCBEZW5zZVNoYXBlLCBQcm9kdWN0VHlwZT4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUeXBlPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzLCBEZW5zZVNoYXBlLCBTcGFyc2VTaGFwZSwgUHJvZHVjdFR5cGU+CisgIDogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxMaHMsUmhzLGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocyxSaHMsRGVuc2VTaGFwZSxTcGFyc2VTaGFwZSxQcm9kdWN0VHlwZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TGhzLFJocz46OlNjYWxhciBTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3Q+CisgIHN0YXRpYyB2b2lkIHNjYWxlQW5kQWRkVG8oRHN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8TGhzLCgoUmhzOjpGbGFncyZSb3dNYWpvckJpdCk9PTApID8gRHluYW1pYyA6IDE+Ojp0eXBlIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPFJocywoKExoczo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkgPyAxIDogTGhzOjpSb3dzQXRDb21waWxlVGltZT46OnR5cGUgUmhzTmVzdGVkOworICAgIExoc05lc3RlZCBsaHNOZXN0ZWQobGhzKTsKKyAgICBSaHNOZXN0ZWQgcmhzTmVzdGVkKHJocyk7CisgICAgCisgICAgLy8gdHJhbnNwb3NlIGV2ZXJ5dGhpbmcKKyAgICBUcmFuc3Bvc2U8RHN0PiBkc3RUKGRzdCk7CisgICAgaW50ZXJuYWw6OnNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3QocmhzTmVzdGVkLnRyYW5zcG9zZSgpLCBsaHNOZXN0ZWQudHJhbnNwb3NlKCksIGRzdFQsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VHlwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgRGVuc2VTaGFwZSwgU3BhcnNlVHJpYW5ndWxhclNoYXBlLCBQcm9kdWN0VHlwZT4KKyAgOiBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgRGVuc2VTaGFwZSwgU3BhcnNlU2hhcGUsIFByb2R1Y3RUeXBlPgore307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIHR5cGVuYW1lIFJoc1QsIGJvb2wgTmVlZFRvVHJhbnNwb3NlPgorc3RydWN0IHNwYXJzZV9kZW5zZV9vdXRlcl9wcm9kdWN0X2V2YWx1YXRvcgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPE5lZWRUb1RyYW5zcG9zZSxSaHNULExoc1Q+Ojp0eXBlIExoczE7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8TmVlZFRvVHJhbnNwb3NlLExoc1QsUmhzVD46OnR5cGUgQWN0dWFsUmhzOworICB0eXBlZGVmIFByb2R1Y3Q8TGhzVCxSaHNULERlZmF1bHRQcm9kdWN0PiBQcm9kWHByVHlwZTsKKyAgCisgIC8vIGlmIHRoZSBhY3R1YWwgbGVmdC1oYW5kIHNpZGUgaXMgYSBkZW5zZSB2ZWN0b3IsCisgIC8vIHRoZW4gYnVpbGQgYSBzcGFyc2UtdmlldyBzbyB0aGF0IHdlIGNhbiBzZWFtbGVzc2x5IGl0ZXJhdGUgb3ZlciBpdC4KKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxpc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzMT46OlN0b3JhZ2VLaW5kLFNwYXJzZT46OnZhbHVlLAorICAgICAgICAgICAgTGhzMSwgU3BhcnNlVmlldzxMaHMxPiA+Ojp0eXBlIEFjdHVhbExoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxpc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzMT46OlN0b3JhZ2VLaW5kLFNwYXJzZT46OnZhbHVlLAorICAgICAgICAgICAgTGhzMSBjb25zdCYsIFNwYXJzZVZpZXc8TGhzMT4gPjo6dHlwZSBMaHNBcmc7CisgICAgICAgICAgICAKKyAgdHlwZWRlZiBldmFsdWF0b3I8QWN0dWFsTGhzPiBMaHNFdmFsOworICB0eXBlZGVmIGV2YWx1YXRvcjxBY3R1YWxSaHM+IFJoc0V2YWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPEFjdHVhbExocz46OklubmVySXRlcmF0b3IgTGhzSXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIAorcHVibGljOgorICBlbnVtIHsKKyAgICBGbGFncyA9IE5lZWRUb1RyYW5zcG9zZSA/IFJvd01ham9yQml0IDogMCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gSHVnZUNvc3QKKyAgfTsKKyAgCisgIGNsYXNzIElubmVySXRlcmF0b3IgOiBwdWJsaWMgTGhzSXRlcmF0b3IKKyAgeworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBzcGFyc2VfZGVuc2Vfb3V0ZXJfcHJvZHVjdF9ldmFsdWF0b3IgJnhwckV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBMaHNJdGVyYXRvcih4cHJFdmFsLm1fbGhzWHBySW1wbCwgMCksCisgICAgICAgIG1fb3V0ZXIob3V0ZXIpLAorICAgICAgICBtX2VtcHR5KGZhbHNlKSwKKyAgICAgICAgbV9mYWN0b3IoZ2V0KHhwckV2YWwubV9yaHNYcHJJbXBsLCBvdXRlciwgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxBY3R1YWxSaHM+OjpTdG9yYWdlS2luZCgpICkpCisgICAge30KKyAgICAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlcjsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93KCkgICBjb25zdCB7IHJldHVybiBOZWVkVG9UcmFuc3Bvc2UgPyBtX291dGVyIDogTGhzSXRlcmF0b3I6OmluZGV4KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbCgpICAgY29uc3QgeyByZXR1cm4gTmVlZFRvVHJhbnNwb3NlID8gTGhzSXRlcmF0b3I6OmluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIExoc0l0ZXJhdG9yOjp2YWx1ZSgpICogbV9mYWN0b3I7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBMaHNJdGVyYXRvcjo6b3BlcmF0b3IgYm9vbCgpICYmICghbV9lbXB0eSk7IH0KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIFNjYWxhciBnZXQoY29uc3QgUmhzRXZhbCAmcmhzLCBJbmRleCBvdXRlciwgRGVuc2UgPSBEZW5zZSgpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiByaHMuY29lZmYob3V0ZXIpOworICAgIH0KKyAgICAKKyAgICBTY2FsYXIgZ2V0KGNvbnN0IFJoc0V2YWwgJnJocywgSW5kZXggb3V0ZXIsIFNwYXJzZSA9IFNwYXJzZSgpKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIFJoc0V2YWw6OklubmVySXRlcmF0b3IgaXQocmhzLCBvdXRlcik7CisgICAgICBpZiAoaXQgJiYgaXQuaW5kZXgoKT09MCAmJiBpdC52YWx1ZSgpIT1TY2FsYXIoMCkpCisgICAgICAgIHJldHVybiBpdC52YWx1ZSgpOworICAgICAgbV9lbXB0eSA9IHRydWU7CisgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgIH0KKyAgICAKKyAgICBJbmRleCBtX291dGVyOworICAgIGJvb2wgbV9lbXB0eTsKKyAgICBTY2FsYXIgbV9mYWN0b3I7CisgIH07CisgIAorICBzcGFyc2VfZGVuc2Vfb3V0ZXJfcHJvZHVjdF9ldmFsdWF0b3IoY29uc3QgTGhzMSAmbGhzLCBjb25zdCBBY3R1YWxSaHMgJnJocykKKyAgICAgOiBtX2xocyhsaHMpLCBtX2xoc1hwckltcGwobV9saHMpLCBtX3Joc1hwckltcGwocmhzKQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorICAKKyAgLy8gdHJhbnNwb3NlIGNhc2UKKyAgc3BhcnNlX2RlbnNlX291dGVyX3Byb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IEFjdHVhbFJocyAmcmhzLCBjb25zdCBMaHMxICZsaHMpCisgICAgIDogbV9saHMobGhzKSwgbV9saHNYcHJJbXBsKG1fbGhzKSwgbV9yaHNYcHJJbXBsKHJocykKKyAgeworICAgIEVJR0VOX0lOVEVSTkFMX0NIRUNLX0NPU1RfVkFMVUUoQ29lZmZSZWFkQ29zdCk7CisgIH0KKyAgICAKK3Byb3RlY3RlZDoKKyAgY29uc3QgTGhzQXJnIG1fbGhzOworICBldmFsdWF0b3I8QWN0dWFsTGhzPiBtX2xoc1hwckltcGw7CisgIGV2YWx1YXRvcjxBY3R1YWxSaHM+IG1fcmhzWHBySW1wbDsKK307CisKKy8vIHNwYXJzZSAqIGRlbnNlIG91dGVyIHByb2R1Y3QKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHByb2R1Y3RfZXZhbHVhdG9yPFByb2R1Y3Q8TGhzLCBSaHMsIERlZmF1bHRQcm9kdWN0PiwgT3V0ZXJQcm9kdWN0LCBTcGFyc2VTaGFwZSwgRGVuc2VTaGFwZT4KKyAgOiBzcGFyc2VfZGVuc2Vfb3V0ZXJfcHJvZHVjdF9ldmFsdWF0b3I8TGhzLFJocywgTGhzOjpJc1Jvd01ham9yPgoreworICB0eXBlZGVmIHNwYXJzZV9kZW5zZV9vdXRlcl9wcm9kdWN0X2V2YWx1YXRvcjxMaHMsUmhzLCBMaHM6OklzUm93TWFqb3I+IEJhc2U7CisgIAorICB0eXBlZGVmIFByb2R1Y3Q8TGhzLCBSaHM+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgZXhwbGljaXQgcHJvZHVjdF9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogQmFzZSh4cHIubGhzKCksIHhwci5yaHMoKSkKKyAge30KKyAgCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExocywgUmhzLCBEZWZhdWx0UHJvZHVjdD4sIE91dGVyUHJvZHVjdCwgRGVuc2VTaGFwZSwgU3BhcnNlU2hhcGU+CisgIDogc3BhcnNlX2RlbnNlX291dGVyX3Byb2R1Y3RfZXZhbHVhdG9yPExocyxSaHMsIFJoczo6SXNSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiBzcGFyc2VfZGVuc2Vfb3V0ZXJfcHJvZHVjdF9ldmFsdWF0b3I8TGhzLFJocywgUmhzOjpJc1Jvd01ham9yPiBCYXNlOworICAKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworCisgIGV4cGxpY2l0IHByb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IEJhc2UoeHByLmxocygpLCB4cHIucmhzKCkpCisgIHt9CisgIAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFREVOU0VQUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURpYWdvbmFsUHJvZHVjdC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlRGlhZ29uYWxQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYzAzYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURpYWdvbmFsUHJvZHVjdC5oCkBAIC0wLDAgKzEsMTM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfRElBR09OQUxfUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9ESUFHT05BTF9QUk9EVUNUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8vIFRoZSBwcm9kdWN0IG9mIGEgZGlhZ29uYWwgbWF0cml4IHdpdGggYSBzcGFyc2UgbWF0cml4IGNhbiBiZSBlYXNpbHkKKy8vIGltcGxlbWVudGVkIHVzaW5nIGV4cHJlc3Npb24gdGVtcGxhdGUuCisvLyBXZSBoYXZlIHR3byBjb25zaWRlciB2ZXJ5IGRpZmZlcmVudCBjYXNlczoKKy8vIDEgLSBkaWFnICogcm93LW1ham9yIHNwYXJzZQorLy8gICAgID0+IGVhY2ggaW5uZXIgdmVjdG9yIDw9PiBzY2FsYXIgKiBzcGFyc2UgdmVjdG9yIHByb2R1Y3QKKy8vICAgICA9PiBzbyB3ZSBjYW4gcmV1c2UgQ3dpc2VVbmFyeU9wOjpJbm5lckl0ZXJhdG9yCisvLyAyIC0gZGlhZyAqIGNvbC1tYWpvciBzcGFyc2UKKy8vICAgICA9PiBlYWNoIGlubmVyIHZlY3RvciA8PT4gZGVuc2V2ZWN0b3IgKiBzcGFyc2UgdmVjdG9yIGN3aXNlIHByb2R1Y3QKKy8vICAgICA9PiBhZ2Fpbiwgd2UgY2FuIHJldXNlIHNwZWNpYWxpemF0aW9uIG9mIEN3aXNlQmluYXJ5T3A6OklubmVySXRlcmF0b3IKKy8vICAgICAgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNhc2UKKy8vIFRoZSB0d28gb3RoZXIgY2FzZXMgYXJlIHN5bW1ldHJpYy4KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworZW51bSB7CisgIFNEUF9Bc1NjYWxhclByb2R1Y3QsCisgIFNEUF9Bc0N3aXNlUHJvZHVjdAorfTsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VYcHJUeXBlLCB0eXBlbmFtZSBEaWFnb25hbENvZWZmVHlwZSwgaW50IFNEUF9UYWc+CitzdHJ1Y3Qgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+LCBQcm9kdWN0VGFnLCBEaWFnb25hbFNoYXBlLCBTcGFyc2VTaGFwZT4KKyAgOiBwdWJsaWMgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yPFJocywgdHlwZW5hbWUgTGhzOjpEaWFnb25hbFZlY3RvclR5cGUsIFJoczo6RmxhZ3MmUm93TWFqb3JCaXQ/U0RQX0FzU2NhbGFyUHJvZHVjdDpTRFBfQXNDd2lzZVByb2R1Y3Q+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+IFhwclR5cGU7CisgIGVudW0geyBDb2VmZlJlYWRDb3N0ID0gSHVnZUNvc3QsIEZsYWdzID0gUmhzOjpGbGFncyZSb3dNYWpvckJpdCwgQWxpZ25tZW50ID0gMCB9OyAvLyBGSVhNRSBDb2VmZlJlYWRDb3N0ICYgRmxhZ3MKKyAgCisgIHR5cGVkZWYgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yPFJocywgdHlwZW5hbWUgTGhzOjpEaWFnb25hbFZlY3RvclR5cGUsIFJoczo6RmxhZ3MmUm93TWFqb3JCaXQ/U0RQX0FzU2NhbGFyUHJvZHVjdDpTRFBfQXNDd2lzZVByb2R1Y3Q+IEJhc2U7CisgIGV4cGxpY2l0IHByb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBCYXNlKHhwci5yaHMoKSwgeHByLmxocygpLmRpYWdvbmFsKCkpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUYWc+CitzdHJ1Y3QgcHJvZHVjdF9ldmFsdWF0b3I8UHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+LCBQcm9kdWN0VGFnLCBTcGFyc2VTaGFwZSwgRGlhZ29uYWxTaGFwZT4KKyAgOiBwdWJsaWMgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yPExocywgVHJhbnNwb3NlPGNvbnN0IHR5cGVuYW1lIFJoczo6RGlhZ29uYWxWZWN0b3JUeXBlPiwgTGhzOjpGbGFncyZSb3dNYWpvckJpdD9TRFBfQXNDd2lzZVByb2R1Y3Q6U0RQX0FzU2NhbGFyUHJvZHVjdD4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBEZWZhdWx0UHJvZHVjdD4gWHByVHlwZTsKKyAgZW51bSB7IENvZWZmUmVhZENvc3QgPSBIdWdlQ29zdCwgRmxhZ3MgPSBMaHM6OkZsYWdzJlJvd01ham9yQml0LCBBbGlnbm1lbnQgPSAwIH07IC8vIEZJWE1FIENvZWZmUmVhZENvc3QgJiBGbGFncworICAKKyAgdHlwZWRlZiBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3I8TGhzLCBUcmFuc3Bvc2U8Y29uc3QgdHlwZW5hbWUgUmhzOjpEaWFnb25hbFZlY3RvclR5cGU+LCBMaHM6OkZsYWdzJlJvd01ham9yQml0P1NEUF9Bc0N3aXNlUHJvZHVjdDpTRFBfQXNTY2FsYXJQcm9kdWN0PiBCYXNlOworICBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpIDogQmFzZSh4cHIubGhzKCksIHhwci5yaHMoKS5kaWFnb25hbCgpLnRyYW5zcG9zZSgpKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlWHByVHlwZSwgdHlwZW5hbWUgRGlhZ29uYWxDb2VmZlR5cGU+CitzdHJ1Y3Qgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yPFNwYXJzZVhwclR5cGUsIERpYWdvbmFsQ29lZmZUeXBlLCBTRFBfQXNTY2FsYXJQcm9kdWN0PgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxTcGFyc2VYcHJUeXBlPjo6SW5uZXJJdGVyYXRvciBTcGFyc2VYcHJJbm5lckl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIAorcHVibGljOgorICBjbGFzcyBJbm5lckl0ZXJhdG9yIDogcHVibGljIFNwYXJzZVhwcklubmVySXRlcmF0b3IKKyAgeworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3IgJnhwckV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBTcGFyc2VYcHJJbm5lckl0ZXJhdG9yKHhwckV2YWwubV9zcGFyc2VYcHJJbXBsLCBvdXRlciksCisgICAgICAgIG1fY29lZmYoeHByRXZhbC5tX2RpYWdDb2VmZkltcGwuY29lZmYob3V0ZXIpKQorICAgIHt9CisgICAgCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmICogU3BhcnNlWHBySW5uZXJJdGVyYXRvcjo6dmFsdWUoKTsgfQorICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgRGlhZ29uYWxDb2VmZlR5cGU6OlNjYWxhciBtX2NvZWZmOworICB9OworICAKKyAgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFNwYXJzZVhwclR5cGUgJnNwYXJzZVhwciwgY29uc3QgRGlhZ29uYWxDb2VmZlR5cGUgJmRpYWdDb2VmZikKKyAgICA6IG1fc3BhcnNlWHBySW1wbChzcGFyc2VYcHIpLCBtX2RpYWdDb2VmZkltcGwoZGlhZ0NvZWZmKQorICB7fQorCisgIEluZGV4IG5vblplcm9zRXN0aW1hdGUoKSBjb25zdCB7IHJldHVybiBtX3NwYXJzZVhwckltcGwubm9uWmVyb3NFc3RpbWF0ZSgpOyB9CisgICAgCitwcm90ZWN0ZWQ6CisgIGV2YWx1YXRvcjxTcGFyc2VYcHJUeXBlPiBtX3NwYXJzZVhwckltcGw7CisgIGV2YWx1YXRvcjxEaWFnb25hbENvZWZmVHlwZT4gbV9kaWFnQ29lZmZJbXBsOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VYcHJUeXBlLCB0eXBlbmFtZSBEaWFnQ29lZmZUeXBlPgorc3RydWN0IHNwYXJzZV9kaWFnb25hbF9wcm9kdWN0X2V2YWx1YXRvcjxTcGFyc2VYcHJUeXBlLCBEaWFnQ29lZmZUeXBlLCBTRFBfQXNDd2lzZVByb2R1Y3Q+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VYcHJUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxEaWFnQ29lZmZUeXBlLFNwYXJzZVhwclR5cGU6OklzUm93TWFqb3IgPyBTcGFyc2VYcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNwYXJzZVhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBEaWFnQ29lZmZOZXN0ZWQ7CisgIAorICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxTcGFyc2VYcHJUeXBlPjo6SW5uZXJJdGVyYXRvciBTcGFyc2VYcHJJdGVyOworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9ldmFsdWF0b3IgJnhwckV2YWwsIEluZGV4IG91dGVyKQorICAgICAgOiBtX3NwYXJzZUl0ZXIoeHByRXZhbC5tX3NwYXJzZVhwckV2YWwsIG91dGVyKSwgbV9kaWFnQ29lZmZOZXN0ZWQoeHByRXZhbC5tX2RpYWdDb2VmZk5lc3RlZCkKKyAgICB7fQorICAgIAorICAgIGlubGluZSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3NwYXJzZUl0ZXIudmFsdWUoKSAqIG1fZGlhZ0NvZWZmTmVzdGVkLmNvZWZmKGluZGV4KCkpOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCBpbmRleCgpIGNvbnN0ICB7IHJldHVybiBtX3NwYXJzZUl0ZXIuaW5kZXgoKTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlcigpIGNvbnN0ICB7IHJldHVybiBtX3NwYXJzZUl0ZXIub3V0ZXIoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCAgICB7IHJldHVybiBTcGFyc2VYcHJUeXBlOjpJc1Jvd01ham9yID8gbV9zcGFyc2VJdGVyLmluZGV4KCkgOiBtX3NwYXJzZUl0ZXIub3V0ZXIoKTsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCAgICB7IHJldHVybiBTcGFyc2VYcHJUeXBlOjpJc1Jvd01ham9yID8gbV9zcGFyc2VJdGVyLm91dGVyKCkgOiBtX3NwYXJzZUl0ZXIuaW5kZXgoKTsgfQorICAgIAorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgKyttX3NwYXJzZUl0ZXI7IHJldHVybiAqdGhpczsgfQorICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgIHsgcmV0dXJuIG1fc3BhcnNlSXRlcjsgfQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgU3BhcnNlWHBySXRlciBtX3NwYXJzZUl0ZXI7CisgICAgRGlhZ0NvZWZmTmVzdGVkIG1fZGlhZ0NvZWZmTmVzdGVkOworICB9OworICAKKyAgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfZXZhbHVhdG9yKGNvbnN0IFNwYXJzZVhwclR5cGUgJnNwYXJzZVhwciwgY29uc3QgRGlhZ0NvZWZmVHlwZSAmZGlhZ0NvZWZmKQorICAgIDogbV9zcGFyc2VYcHJFdmFsKHNwYXJzZVhwciksIG1fZGlhZ0NvZWZmTmVzdGVkKGRpYWdDb2VmZikKKyAge30KKworICBJbmRleCBub25aZXJvc0VzdGltYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zcGFyc2VYcHJFdmFsLm5vblplcm9zRXN0aW1hdGUoKTsgfQorICAgIAorcHJvdGVjdGVkOgorICBldmFsdWF0b3I8U3BhcnNlWHByVHlwZT4gbV9zcGFyc2VYcHJFdmFsOworICBEaWFnQ29lZmZOZXN0ZWQgbV9kaWFnQ29lZmZOZXN0ZWQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfRElBR09OQUxfUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEb3QuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEb3QuaApAQCAtMCwwICsxLDk4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0RPVF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9ET1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6ZG90KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9WRUNUT1JfU0laRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworICBlaWdlbl9hc3NlcnQoc2l6ZSgpID09IG90aGVyLnNpemUoKSk7CisgIGVpZ2VuX2Fzc2VydChvdGhlci5zaXplKCk+MCAmJiAieW91IGFyZSB1c2luZyBhIG5vbiBpbml0aWFsaXplZCB2ZWN0b3IiKTsKKworICBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+IHRoaXNFdmFsKGRlcml2ZWQoKSk7CisgIHR5cGVuYW1lIGludGVybmFsOjpldmFsdWF0b3I8RGVyaXZlZD46OklubmVySXRlcmF0b3IgaSh0aGlzRXZhbCwgMCk7CisgIFNjYWxhciByZXMoMCk7CisgIHdoaWxlIChpKQorICB7CisgICAgcmVzICs9IG51bWV4dDo6Y29uaihpLnZhbHVlKCkpICogb3RoZXIuY29lZmYoaS5pbmRleCgpKTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6ZG90KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9WRUNUT1JfU0laRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworICBlaWdlbl9hc3NlcnQoc2l6ZSgpID09IG90aGVyLnNpemUoKSk7CisKKyAgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPiB0aGlzRXZhbChkZXJpdmVkKCkpOworICB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbHVhdG9yPERlcml2ZWQ+OjpJbm5lckl0ZXJhdG9yIGkodGhpc0V2YWwsIDApOworICAKKyAgaW50ZXJuYWw6OmV2YWx1YXRvcjxPdGhlckRlcml2ZWQ+ICBvdGhlckV2YWwob3RoZXIuZGVyaXZlZCgpKTsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OmV2YWx1YXRvcjxPdGhlckRlcml2ZWQ+OjpJbm5lckl0ZXJhdG9yIGoob3RoZXJFdmFsLCAwKTsKKworICBTY2FsYXIgcmVzKDApOworICB3aGlsZSAoaSAmJiBqKQorICB7CisgICAgaWYgKGkuaW5kZXgoKT09ai5pbmRleCgpKQorICAgIHsKKyAgICAgIHJlcyArPSBudW1leHQ6OmNvbmooaS52YWx1ZSgpKSAqIGoudmFsdWUoKTsKKyAgICAgICsraTsgKytqOworICAgIH0KKyAgICBlbHNlIGlmIChpLmluZGV4KCk8ai5pbmRleCgpKQorICAgICAgKytpOworICAgIGVsc2UKKyAgICAgICsrajsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpzcXVhcmVkTm9ybSgpIGNvbnN0Cit7CisgIHJldHVybiBudW1leHQ6OnJlYWwoKCp0aGlzKS5jd2lzZUFiczIoKS5zdW0oKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om5vcm0oKSBjb25zdAoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHJldHVybiBzcXJ0KHNxdWFyZWROb3JtKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpibHVlTm9ybSgpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6Ymx1ZU5vcm1faW1wbCgqdGhpcyk7Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9ET1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlRnV6enkuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUZ1enp5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0N2ViOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUZ1enp5LmgKQEAgLTAsMCArMSwyOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0ZVWlpZX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0ZVWlpZX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorYm9vbCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc0FwcHJveChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCBjb25zdCBSZWFsU2NhbGFyICZwcmVjKSBjb25zdAoreworICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwyLFBsYWluT2JqZWN0Pjo6dHlwZSBhY3R1YWxBKGRlcml2ZWQoKSk7CisgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxib29sKElzUm93TWFqb3IpPT1ib29sKE90aGVyRGVyaXZlZDo6SXNSb3dNYWpvciksCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPE90aGVyRGVyaXZlZCwyLFBsYWluT2JqZWN0Pjo6dHlwZSwKKyAgICBjb25zdCBQbGFpbk9iamVjdD46OnR5cGUgYWN0dWFsQihvdGhlci5kZXJpdmVkKCkpOworCisgIHJldHVybiAoYWN0dWFsQSAtIGFjdHVhbEIpLnNxdWFyZWROb3JtKCkgPD0gcHJlYyAqIHByZWMgKiBudW1leHQ6Om1pbmkoYWN0dWFsQS5zcXVhcmVkTm9ybSgpLCBhY3R1YWxCLnNxdWFyZWROb3JtKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9GVVpaWV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXAuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWJlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXAuaApAQCAtMCwwICsxLDMwNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9NQVBfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfTUFQX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorc3RydWN0IHRyYWl0czxNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorICA6IHB1YmxpYyB0cmFpdHM8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiA+Cit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiBQbGFpbk9iamVjdFR5cGU7CisgIHR5cGVkZWYgdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4gVHJhaXRzQmFzZTsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBUcmFpdHNCYXNlOjpGbGFncyAmICh+TmVzdEJ5UmVmQml0KQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorc3RydWN0IHRyYWl0czxNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorICA6IHB1YmxpYyB0cmFpdHM8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiA+Cit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiBQbGFpbk9iamVjdFR5cGU7CisgIHR5cGVkZWYgdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4gVHJhaXRzQmFzZTsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBUcmFpdHNCYXNlOjpGbGFncyAmICh+IChOZXN0QnlSZWZCaXQgfCBMdmFsdWVCaXQpKQorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsCisgICAgICAgICBpbnQgTGV2ZWwgPSBpbnRlcm5hbDo6YWNjZXNzb3JzX2xldmVsPERlcml2ZWQ+OjpoYXNfd3JpdGVfYWNjZXNzID8gV3JpdGVBY2Nlc3NvcnMgOiBSZWFkT25seUFjY2Vzc29ycworPiBjbGFzcyBTcGFyc2VNYXBCYXNlOworCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKiBjbGFzcyBTcGFyc2VNYXBCYXNlCisgICogXGJyaWVmIENvbW1vbiBiYXNlIGNsYXNzIGZvciBNYXAgYW5kIFJlZiBpbnN0YW5jZSBvZiBzcGFyc2UgbWF0cml4IGFuZCB2ZWN0b3IuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgU3BhcnNlTWFwQmFzZTxEZXJpdmVkLFJlYWRPbmx5QWNjZXNzb3JzPgorICA6IHB1YmxpYyBTcGFyc2VDb21wcmVzc2VkQmFzZTxEZXJpdmVkPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VDb21wcmVzc2VkQmFzZTxEZXJpdmVkPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgZW51bSB7IElzUm93TWFqb3IgPSBCYXNlOjpJc1Jvd01ham9yIH07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbChpbnRlcm5hbDo6aXNfbHZhbHVlPERlcml2ZWQ+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyICosIGNvbnN0IFNjYWxhciAqPjo6dHlwZSBTY2FsYXJQb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2woaW50ZXJuYWw6OmlzX2x2YWx1ZTxEZXJpdmVkPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VJbmRleCAqLCBjb25zdCBTdG9yYWdlSW5kZXggKj46OnR5cGUgSW5kZXhQb2ludGVyOworCisgICAgSW5kZXggICBtX291dGVyU2l6ZTsKKyAgICBJbmRleCAgIG1faW5uZXJTaXplOworICAgIEFycmF5PFN0b3JhZ2VJbmRleCwyLDE+ICBtX3plcm9fbm56OworICAgIEluZGV4UG9pbnRlciAgbV9vdXRlckluZGV4OworICAgIEluZGV4UG9pbnRlciAgbV9pbm5lckluZGljZXM7CisgICAgU2NhbGFyUG9pbnRlciBtX3ZhbHVlczsKKyAgICBJbmRleFBvaW50ZXIgIG1faW5uZXJOb25aZXJvczsKKworICBwdWJsaWM6CisKKyAgICAvKiogXGNvcHlkb2MgU3BhcnNlTWF0cml4QmFzZTo6cm93cygpICovCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUgOiBtX2lubmVyU2l6ZTsgfQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXhCYXNlOjpjb2xzKCkgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX2lubmVyU2l6ZSA6IG1fb3V0ZXJTaXplOyB9CisgICAgLyoqIFxjb3B5ZG9jIFNwYXJzZU1hdHJpeEJhc2U6OmlubmVyU2l6ZSgpICovCisgICAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJTaXplOyB9CisgICAgLyoqIFxjb3B5ZG9jIFNwYXJzZU1hdHJpeEJhc2U6Om91dGVyU2l6ZSgpICovCisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXJTaXplOyB9CisgICAgLyoqIFxjb3B5ZG9jIFNwYXJzZUNvbXByZXNzZWRCYXNlOjpub25aZXJvcyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0IHsgcmV0dXJuIG1femVyb19ubnpbMV07IH0KKyAgICAKKyAgICAvKiogXGNvcHlkb2MgU3BhcnNlQ29tcHJlc3NlZEJhc2U6OmlzQ29tcHJlc3NlZCAqLworICAgIGJvb2wgaXNDb21wcmVzc2VkKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lck5vblplcm9zPT0wOyB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBkaXJlY3QgYWNjZXNzIGludGVyZmFjZQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OnZhbHVlUHRyICovCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OmlubmVySW5kZXhQdHIgKi8KKyAgICBpbmxpbmUgY29uc3QgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lckluZGljZXM7IH0KKyAgICAvKiogXGNvcHlkb2MgU3BhcnNlTWF0cml4OjpvdXRlckluZGV4UHRyICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXJJbmRleDsgfQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OmlubmVyTm9uWmVyb1B0ciAqLworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0cigpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJOb25aZXJvczsgfQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqIFxjb3B5ZG9jIFNwYXJzZU1hdHJpeDo6Y29lZmYgKi8KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgSW5kZXggc3RhcnQgPSBtX291dGVySW5kZXhbb3V0ZXJdOworICAgICAgSW5kZXggZW5kID0gaXNDb21wcmVzc2VkKCkgPyBtX291dGVySW5kZXhbb3V0ZXIrMV0gOiBzdGFydCArIG1faW5uZXJOb25aZXJvc1tvdXRlcl07CisgICAgICBpZiAoc3RhcnQ9PWVuZCkKKyAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICAgIGVsc2UgaWYgKGVuZD4wICYmIGlubmVyPT1tX2lubmVySW5kaWNlc1tlbmQtMV0pCisgICAgICAgIHJldHVybiBtX3ZhbHVlc1tlbmQtMV07CisgICAgICAvLyBeXiAgb3B0aW1pemF0aW9uOiBsZXQncyBmaXJzdCBjaGVjayBpZiBpdCBpcyB0aGUgbGFzdCBjb2VmZmljaWVudAorICAgICAgLy8gKHZlcnkgY29tbW9uIGluIGhpZ2ggbGV2ZWwgYWxnb3JpdGhtcykKKworICAgICAgY29uc3QgU3RvcmFnZUluZGV4KiByID0gc3RkOjpsb3dlcl9ib3VuZCgmbV9pbm5lckluZGljZXNbc3RhcnRdLCZtX2lubmVySW5kaWNlc1tlbmQtMV0saW5uZXIpOworICAgICAgY29uc3QgSW5kZXggaWQgPSByLSZtX2lubmVySW5kaWNlc1swXTsKKyAgICAgIHJldHVybiAoKCpyPT1pbm5lcikgJiYgKGlkPGVuZCkpID8gbV92YWx1ZXNbaWRdIDogU2NhbGFyKDApOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VNYXBCYXNlKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IG5ueiwgSW5kZXhQb2ludGVyIG91dGVySW5kZXhQdHIsIEluZGV4UG9pbnRlciBpbm5lckluZGV4UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyUG9pbnRlciB2YWx1ZVB0ciwgSW5kZXhQb2ludGVyIGlubmVyTm9uWmVyb3NQdHIgPSAwKQorICAgICAgOiBtX291dGVyU2l6ZShJc1Jvd01ham9yP3Jvd3M6Y29scyksIG1faW5uZXJTaXplKElzUm93TWFqb3I/Y29sczpyb3dzKSwgbV96ZXJvX25ueigwLGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4obm56KSksIG1fb3V0ZXJJbmRleChvdXRlckluZGV4UHRyKSwKKyAgICAgICAgbV9pbm5lckluZGljZXMoaW5uZXJJbmRleFB0ciksIG1fdmFsdWVzKHZhbHVlUHRyKSwgbV9pbm5lck5vblplcm9zKGlubmVyTm9uWmVyb3NQdHIpCisgICAge30KKworICAgIC8vIGZvciB2ZWN0b3JzCisgICAgaW5saW5lIFNwYXJzZU1hcEJhc2UoSW5kZXggc2l6ZSwgSW5kZXggbm56LCBJbmRleFBvaW50ZXIgaW5uZXJJbmRleFB0ciwgU2NhbGFyUG9pbnRlciB2YWx1ZVB0cikKKyAgICAgIDogbV9vdXRlclNpemUoMSksIG1faW5uZXJTaXplKHNpemUpLCBtX3plcm9fbm56KDAsaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihubnopKSwgbV9vdXRlckluZGV4KG1femVyb19ubnouZGF0YSgpKSwKKyAgICAgICAgbV9pbm5lckluZGljZXMoaW5uZXJJbmRleFB0ciksIG1fdmFsdWVzKHZhbHVlUHRyKSwgbV9pbm5lck5vblplcm9zKDApCisgICAge30KKworICAgIC8qKiBFbXB0eSBkZXN0cnVjdG9yICovCisgICAgaW5saW5lIH5TcGFyc2VNYXBCYXNlKCkge30KKworICBwcm90ZWN0ZWQ6CisgICAgaW5saW5lIFNwYXJzZU1hcEJhc2UoKSB7fQorfTsKKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogY2xhc3MgU3BhcnNlTWFwQmFzZQorICAqIFxicmllZiBDb21tb24gYmFzZSBjbGFzcyBmb3Igd3JpdGFibGUgTWFwIGFuZCBSZWYgaW5zdGFuY2Ugb2Ygc3BhcnNlIG1hdHJpeCBhbmQgdmVjdG9yLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZU1hcEJhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz4KKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxEZXJpdmVkLFJlYWRPbmx5QWNjZXNzb3JzPgoreworICAgIHR5cGVkZWYgTWFwQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gUmVhZE9ubHlNYXBCYXNlOworICAgIAorICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VNYXBCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgZW51bSB7IElzUm93TWFqb3IgPSBCYXNlOjpJc1Jvd01ham9yIH07CisgICAgCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworCisgIHB1YmxpYzoKKyAgICAKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBkaXJlY3QgYWNjZXNzIGludGVyZmFjZQorICAgIHVzaW5nIEJhc2U6OnZhbHVlUHRyOworICAgIHVzaW5nIEJhc2U6OmlubmVySW5kZXhQdHI7CisgICAgdXNpbmcgQmFzZTo6b3V0ZXJJbmRleFB0cjsKKyAgICB1c2luZyBCYXNlOjppbm5lck5vblplcm9QdHI7CisgICAgLyoqIFxjb3B5ZG9jIFNwYXJzZU1hdHJpeDo6dmFsdWVQdHIgKi8KKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpICAgICAgICAgICAgICB7IHJldHVybiBCYXNlOjptX3ZhbHVlczsgfQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OmlubmVySW5kZXhQdHIgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyKCkgICB7IHJldHVybiBCYXNlOjptX2lubmVySW5kaWNlczsgfQorICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6Om91dGVySW5kZXhQdHIgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBvdXRlckluZGV4UHRyKCkgICB7IHJldHVybiBCYXNlOjptX291dGVySW5kZXg7IH0KKyAgICAvKiogXGNvcHlkb2MgU3BhcnNlTWF0cml4Ojppbm5lck5vblplcm9QdHIgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBpbm5lck5vblplcm9QdHIoKSB7IHJldHVybiBCYXNlOjptX2lubmVyTm9uWmVyb3M7IH0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OmNvZWZmUmVmICovCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBJbmRleCBzdGFydCA9IEJhc2U6Om1fb3V0ZXJJbmRleFtvdXRlcl07CisgICAgICBJbmRleCBlbmQgPSBCYXNlOjppc0NvbXByZXNzZWQoKSA/IEJhc2U6Om1fb3V0ZXJJbmRleFtvdXRlcisxXSA6IHN0YXJ0ICsgQmFzZTo6bV9pbm5lck5vblplcm9zW291dGVyXTsKKyAgICAgIGVpZ2VuX2Fzc2VydChlbmQ+PXN0YXJ0ICYmICJ5b3UgcHJvYmFibHkgY2FsbGVkIGNvZWZmUmVmIG9uIGEgbm9uIGZpbmFsaXplZCBtYXRyaXgiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChlbmQ+c3RhcnQgJiYgImNvZWZmUmVmIGNhbm5vdCBiZSBjYWxsZWQgb24gYSB6ZXJvIGNvZWZmaWNpZW50Iik7CisgICAgICBTdG9yYWdlSW5kZXgqIHIgPSBzdGQ6Omxvd2VyX2JvdW5kKCZCYXNlOjptX2lubmVySW5kaWNlc1tzdGFydF0sJkJhc2U6Om1faW5uZXJJbmRpY2VzW2VuZF0saW5uZXIpOworICAgICAgY29uc3QgSW5kZXggaWQgPSByIC0gJkJhc2U6Om1faW5uZXJJbmRpY2VzWzBdOworICAgICAgZWlnZW5fYXNzZXJ0KCgqcj09aW5uZXIpICYmIChpZDxlbmQpICYmICJjb2VmZlJlZiBjYW5ub3QgYmUgY2FsbGVkIG9uIGEgemVybyBjb2VmZmljaWVudCIpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyKj4oQmFzZTo6bV92YWx1ZXMpW2lkXTsKKyAgICB9CisgICAgCisgICAgaW5saW5lIFNwYXJzZU1hcEJhc2UoSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggbm56LCBTdG9yYWdlSW5kZXgqIG91dGVySW5kZXhQdHIsIFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIqIHZhbHVlUHRyLCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb3NQdHIgPSAwKQorICAgICAgOiBCYXNlKHJvd3MsIGNvbHMsIG5ueiwgb3V0ZXJJbmRleFB0ciwgaW5uZXJJbmRleFB0ciwgdmFsdWVQdHIsIGlubmVyTm9uWmVyb3NQdHIpCisgICAge30KKworICAgIC8vIGZvciB2ZWN0b3JzCisgICAgaW5saW5lIFNwYXJzZU1hcEJhc2UoSW5kZXggc2l6ZSwgSW5kZXggbm56LCBTdG9yYWdlSW5kZXgqIGlubmVySW5kZXhQdHIsIFNjYWxhciogdmFsdWVQdHIpCisgICAgICA6IEJhc2Uoc2l6ZSwgbm56LCBpbm5lckluZGV4UHRyLCB2YWx1ZVB0cikKKyAgICB7fQorCisgICAgLyoqIEVtcHR5IGRlc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgflNwYXJzZU1hcEJhc2UoKSB7fQorCisgIHByb3RlY3RlZDoKKyAgICBpbmxpbmUgU3BhcnNlTWFwQmFzZSgpIHt9Cit9OworCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBTcGVjaWFsaXphdGlvbiBvZiBjbGFzcyBNYXAgZm9yIFNwYXJzZU1hdHJpeC1saWtlIHN0b3JhZ2UuCisgICoKKyAgKiBcdHBhcmFtIFNwYXJzZU1hdHJpeFR5cGUgdGhlIGVxdWl2YWxlbnQgc3BhcnNlIG1hdHJpeCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGRhdGEsIGl0IG11c3QgYmUgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBvZiBjbGFzcyBTcGFyc2VNYXRyaXguCisgICoKKyAgKiBcc2EgY2xhc3MgTWFwLCBjbGFzcyBTcGFyc2VNYXRyaXgsIGNsYXNzIFJlZjxTcGFyc2VNYXRyaXhUeXBlLE9wdGlvbnM+CisgICovCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRTY2FsYXIsIGludCBNYXRPcHRpb25zLCB0eXBlbmFtZSBNYXRJbmRleCwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitjbGFzcyBNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorI2Vsc2UKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+CitjbGFzcyBNYXA8U3BhcnNlTWF0cml4VHlwZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxEZXJpdmVkLFdyaXRlQWNjZXNzb3JzPgorI2VuZGlmCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNwYXJzZU1hcEJhc2U8TWFwPiBCYXNlOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKE1hcCkKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IEJhc2U6OklzUm93TWFqb3IgfTsKKworICBwdWJsaWM6CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHJlYWQtd3JpdGUgTWFwIHRvIGEgc3BhcnNlIG1hdHJpeCBvZiBzaXplIFxhIHJvd3MgeCBcYSBjb2xzLCBjb250YWluaW5nIFxhIG5ueiBub24temVybyBjb2VmZmljaWVudHMsCisgICAgICAqIHN0b3JlZCBhcyBhIHNwYXJzZSBmb3JtYXQgYXMgZGVmaW5lZCBieSB0aGUgcG9pbnRlcnMgXGEgb3V0ZXJJbmRleFB0ciwgXGEgaW5uZXJJbmRleFB0ciwgYW5kIFxhIHZhbHVlUHRyLgorICAgICAgKiBJZiB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIFxhIGlubmVyTm9uWmVyb3NQdHIgaXMgdGhlIG51bGwgcG9pbnRlciwgdGhlbiBhIHN0YW5kYXJkIGNvbXByZXNzZWQgZm9ybWF0IGlzIGFzc3VtZWQuCisgICAgICAqCisgICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYXZhaWxhYmxlIG9ubHkgaWYgXGMgU3BhcnNlTWF0cml4VHlwZSBpcyBub24tY29uc3QuCisgICAgICAqCisgICAgICAqIE1vcmUgZGV0YWlscyBvbiB0aGUgZXhwZWN0ZWQgc3RvcmFnZSBzY2hlbWVzIGFyZSBnaXZlbiBpbiB0aGUgXHJlZiBUdXRvcmlhbFNwYXJzZSAibWFudWFsIHBhZ2VzIi4KKyAgICAgICovCisgICAgaW5saW5lIE1hcChJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBubnosIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0ciwKKyAgICAgICAgICAgICAgIFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0ciwgU2NhbGFyKiB2YWx1ZVB0ciwgU3RvcmFnZUluZGV4KiBpbm5lck5vblplcm9zUHRyID0gMCkKKyAgICAgIDogQmFzZShyb3dzLCBjb2xzLCBubnosIG91dGVySW5kZXhQdHIsIGlubmVySW5kZXhQdHIsIHZhbHVlUHRyLCBpbm5lck5vblplcm9zUHRyKQorICAgIHt9CisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIEVtcHR5IGRlc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgfk1hcCgpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRTY2FsYXIsIGludCBNYXRPcHRpb25zLCB0eXBlbmFtZSBNYXRJbmRleCwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitjbGFzcyBNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VNYXBCYXNlPE1hcD4gQmFzZTsKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShNYXApCisgICAgZW51bSB7IElzUm93TWFqb3IgPSBCYXNlOjpJc1Jvd01ham9yIH07CisKKyAgcHVibGljOgorI2VuZGlmCisgICAgLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgdGhlIGFib3ZlIGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGF2YWlsYWJsZSBvbmx5IGlmIFxjIFNwYXJzZU1hdHJpeFR5cGUgaXMgY29uc3QsIGUuZy46CisgICAgICAqIFxjb2RlIE1hcDxjb25zdCBTcGFyc2VNYXRyaXg8ZG91YmxlPiA+ICBcZW5kY29kZQorICAgICAgKi8KKyAgICBpbmxpbmUgTWFwKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IG5ueiwgY29uc3QgU3RvcmFnZUluZGV4KiBvdXRlckluZGV4UHRyLAorICAgICAgICAgICAgICAgY29uc3QgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyLCBjb25zdCBTY2FsYXIqIHZhbHVlUHRyLCBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb3NQdHIgPSAwKQorICAgICAgOiBCYXNlKHJvd3MsIGNvbHMsIG5ueiwgb3V0ZXJJbmRleFB0ciwgaW5uZXJJbmRleFB0ciwgdmFsdWVQdHIsIGlubmVyTm9uWmVyb3NQdHIpCisgICAge30KKworICAgIC8qKiBFbXB0eSBkZXN0cnVjdG9yICovCisgICAgaW5saW5lIH5NYXAoKSB7fQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorc3RydWN0IGV2YWx1YXRvcjxNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorICA6IGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPiA+Cit7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFNwYXJzZUNvbXByZXNzZWRCYXNlPE1hcDxTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlPiA+ID4gQmFzZTsKKyAgdHlwZWRlZiBNYXA8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gWHByVHlwZTsgIAorICBldmFsdWF0b3IoKSA6IEJhc2UoKSB7fQorICBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSAmbWF0KSA6IEJhc2UobWF0KSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorc3RydWN0IGV2YWx1YXRvcjxNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorICA6IGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPiA+Cit7CisgIHR5cGVkZWYgZXZhbHVhdG9yPFNwYXJzZUNvbXByZXNzZWRCYXNlPE1hcDxjb25zdCBTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlPiA+ID4gQmFzZTsKKyAgdHlwZWRlZiBNYXA8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gWHByVHlwZTsgIAorICBldmFsdWF0b3IoKSA6IEJhc2UoKSB7fQorICBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSAmbWF0KSA6IEJhc2UobWF0KSB7fQorfTsKKworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9NQVBfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNjMjMyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwxNDAzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgU3BhcnNlTWF0cml4CisgICoKKyAgKiBcYnJpZWYgQSB2ZXJzYXRpYmxlIHNwYXJzZSBtYXRyaXggcmVwcmVzZW50YXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1vcmUgdmVyc2F0aWxlIHZhcmlhbnRzIG9mIHRoZSBjb21tb24gXGVtIGNvbXByZXNzZWQgcm93L2NvbHVtbiBzdG9yYWdlIGZvcm1hdC4KKyAgKiBFYWNoIGNvbG11bidzIChyZXNwLiByb3cpIG5vbiB6ZXJvcyBhcmUgc3RvcmVkIGFzIGEgcGFpciBvZiB2YWx1ZSB3aXRoIGFzc29jaWF0ZWQgcm93IChyZXNwLiBjb2xtaXVuKSBpbmRleC4KKyAgKiBBbGwgdGhlIG5vbiB6ZXJvcyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIGxhcmdlIGJ1ZmZlci4gVW5saWtlIHRoZSBcZW0gY29tcHJlc3NlZCBmb3JtYXQsIHRoZXJlIG1pZ2h0IGJlIGV4dHJhCisgICogc3BhY2UgaW5iZXR3ZWVuIHRoZSBub256ZXJvcyBvZiB0d28gc3VjY2Vzc2l2ZSBjb2xtdW5zIChyZXNwLiByb3dzKSBzdWNoIHRoYXQgaW5zZXJ0aW9uIG9mIG5ldyBub24temVybworICAqIGNhbiBiZSBkb25lIHdpdGggbGltaXRlZCBtZW1vcnkgcmVhbGxvY2F0aW9uIGFuZCBjb3BpZXMuCisgICoKKyAgKiBBIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIG1ha2VDb21wcmVzc2VkKCkgdHVybnMgdGhlIG1hdHJpeCBpbnRvIHRoZSBzdGFuZGFyZCBcZW0gY29tcHJlc3NlZCBmb3JtYXQKKyAgKiBjb21wYXRpYmxlIHdpdGggbWFueSBsaWJyYXJ5LgorICAqCisgICogTW9yZSBkZXRhaWxzIG9uIHRoaXMgc3RvcmFnZSBzY2VoZW1lIGFyZSBnaXZlbiBpbiB0aGUgXHJlZiBUdXRvcmlhbFNwYXJzZSAibWFudWFsIHBhZ2VzIi4KKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFx0cGFyYW0gX09wdGlvbnMgVW5pb24gb2YgYml0IGZsYWdzIGNvbnRyb2xsaW5nIHRoZSBzdG9yYWdlIHNjaGVtZS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmlsaXR5CisgICogICAgICAgICAgICAgICAgIGlzIENvbE1ham9yIG9yIFJvd01ham9yLiBUaGUgZGVmYXVsdCBpcyAwIHdoaWNoIG1lYW5zIGNvbHVtbi1tYWpvci4KKyAgKiBcdHBhcmFtIF9TdG9yYWdlSW5kZXggdGhlIHR5cGUgb2YgdGhlIGluZGljZXMuIEl0IGhhcyB0byBiZSBhIFxiIHNpZ25lZCB0eXBlIChlLmcuLCBzaG9ydCwgaW50LCBzdGQ6OnB0cmRpZmZfdCkuIERlZmF1bHQgaXMgXGMgaW50LgorICAqCisgICogXHdhcm5pbmcgSW4gJUVpZ2VuIDMuMiwgdGhlIHVuZG9jdW1lbnRlZCB0eXBlIFxjIFNwYXJzZU1hdHJpeDo6SW5kZXggd2FzIGltcHJvcGVybHkgZGVmaW5lZCBhcyB0aGUgc3RvcmFnZSBpbmRleCB0eXBlIChlLmcuLCBpbnQpLAorICAqICAgICAgICAgIHdoZXJlYXMgaXQgaXMgbm93IChzdGFydGluZyBmcm9tICVFaWdlbiAzLjMpIGRlcHJlY2F0ZWQgYW5kIGFsd2F5cyBkZWZpbmVkIGFzIEVpZ2VuOjpJbmRleC4KKyAgKiAgICAgICAgICBDb2RlcyBtYWtpbmcgdXNlIG9mIFxjIFNwYXJzZU1hdHJpeDo6SW5kZXgsIG1pZ2h0IHRodXMgbGlrZWx5IGhhdmUgdG8gYmUgY2hhbmdlZCB0byB1c2UgXGMgU3BhcnNlTWF0cml4OjpTdG9yYWdlSW5kZXggaW5zdGVhZC4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fU1BBUlNFTUFUUklYX1BMVUdJTi4KKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgRmxhZ3MgPSBfT3B0aW9ucyB8IE5lc3RCeVJlZkJpdCB8IEx2YWx1ZUJpdCB8IENvbXByZXNzZWRBY2Nlc3NCaXQsCisgICAgU3VwcG9ydGVkQWNjZXNzUGF0dGVybnMgPSBJbm5lclJhbmRvbUFjY2Vzc1BhdHRlcm4KKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleCwgaW50IERpYWdJbmRleD4KK3N0cnVjdCB0cmFpdHM8RGlhZ29uYWw8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiwgRGlhZ0luZGV4PiA+Cit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHJlZl9zZWxlY3RvcjxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgX01hdHJpeFR5cGVOZXN0ZWQ7CisKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBEZW5zZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBfU3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSAxLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IDEsCisgICAgRmxhZ3MgPSBMdmFsdWVCaXQKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleCwgaW50IERpYWdJbmRleD4KK3N0cnVjdCB0cmFpdHM8RGlhZ29uYWw8Y29uc3QgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiwgRGlhZ0luZGV4PiA+CisgOiBwdWJsaWMgdHJhaXRzPERpYWdvbmFsPFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4sIERpYWdJbmRleD4gPgoreworICBlbnVtIHsKKyAgICBGbGFncyA9IDAKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitjbGFzcyBTcGFyc2VNYXRyaXgKKyAgOiBwdWJsaWMgU3BhcnNlQ29tcHJlc3NlZEJhc2U8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgICAgdHlwZWRlZiBTcGFyc2VDb21wcmVzc2VkQmFzZTxTcGFyc2VNYXRyaXg+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29udmVydF9pbmRleDsKKyAgICBmcmllbmQgY2xhc3MgU3BhcnNlVmVjdG9yPF9TY2FsYXIsMCxfU3RvcmFnZUluZGV4PjsKKyAgcHVibGljOgorICAgIHVzaW5nIEJhc2U6OmlzQ29tcHJlc3NlZDsKKyAgICB1c2luZyBCYXNlOjpub25aZXJvczsKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VNYXRyaXgpCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvci09OworCisgICAgdHlwZWRlZiBNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzPiBNYXA7CisgICAgdHlwZWRlZiBEaWFnb25hbDxTcGFyc2VNYXRyaXg+IERpYWdvbmFsUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIERpYWdvbmFsPGNvbnN0IFNwYXJzZU1hdHJpeD4gQ29uc3REaWFnb25hbFJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbm5lckl0ZXJhdG9yIElubmVySXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpSZXZlcnNlSW5uZXJJdGVyYXRvciBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKyAgICAKKworICAgIHVzaW5nIEJhc2U6OklzUm93TWFqb3I7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Q29tcHJlc3NlZFN0b3JhZ2U8U2NhbGFyLFN0b3JhZ2VJbmRleD4gU3RvcmFnZTsKKyAgICBlbnVtIHsKKyAgICAgIE9wdGlvbnMgPSBfT3B0aW9ucworICAgIH07CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4VmVjdG9yIEluZGV4VmVjdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyVmVjdG9yIFNjYWxhclZlY3RvcjsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwoRmxhZ3MmflJvd01ham9yQml0KXwoSXNSb3dNYWpvcj9Sb3dNYWpvckJpdDowKT4gVHJhbnNwb3NlZFNwYXJzZU1hdHJpeDsKKworICAgIEluZGV4IG1fb3V0ZXJTaXplOworICAgIEluZGV4IG1faW5uZXJTaXplOworICAgIFN0b3JhZ2VJbmRleCogbV9vdXRlckluZGV4OworICAgIFN0b3JhZ2VJbmRleCogbV9pbm5lck5vblplcm9zOyAgICAgLy8gb3B0aW9uYWwsIGlmIG51bGwgdGhlbiB0aGUgZGF0YSBpcyBjb21wcmVzc2VkCisgICAgU3RvcmFnZSBtX2RhdGE7CisKKyAgcHVibGljOgorICAgIAorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXJTaXplIDogbV9pbm5lclNpemU7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX2lubmVyU2l6ZSA6IG1fb3V0ZXJTaXplOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIChyZXNwLiBjb2x1bW5zKSBvZiB0aGUgbWF0cml4IGlmIHRoZSBzdG9yYWdlIG9yZGVyIGNvbHVtbiBtYWpvciAocmVzcC4gcm93IG1ham9yKSAqLworICAgIGlubGluZSBJbmRleCBpbm5lclNpemUoKSBjb25zdCB7IHJldHVybiBtX2lubmVyU2l6ZTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKHJlc3AuIHJvd3MpIG9mIHRoZSBtYXRyaXggaWYgdGhlIHN0b3JhZ2Ugb3JkZXIgY29sdW1uIG1ham9yIChyZXNwLiByb3cgbWFqb3IpICovCisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXJTaXplOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBsaWJyYXJpZXMuCisgICAgICAqIFxzYSBpbm5lckluZGV4UHRyKCksIG91dGVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBjb25zdCBTY2FsYXIqIHZhbHVlUHRyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnZhbHVlUHRyKCk7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBsaWJyYXJpZXMuCisgICAgICAqIFxzYSBpbm5lckluZGV4UHRyKCksIG91dGVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBTY2FsYXIqIHZhbHVlUHRyKCkgeyByZXR1cm4gbV9kYXRhLnZhbHVlUHRyKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGlubmVyIGluZGljZXMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIHZhbHVlUHRyKCksIG91dGVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuaW5kZXhQdHIoKTsgfQorICAgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBpbm5lciBpbmRpY2VzLgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBsaWJyYXJpZXMuCisgICAgICAqIFxzYSB2YWx1ZVB0cigpLCBvdXRlckluZGV4UHRyKCkgKi8KKyAgICBpbmxpbmUgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyKCkgeyByZXR1cm4gbV9kYXRhLmluZGV4UHRyKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBzdGFydGluZyBwb3NpdGlvbnMgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIHZhbHVlUHRyKCksIGlubmVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIG91dGVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX291dGVySW5kZXg7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIHN0YXJ0aW5nIHBvc2l0aW9ucyBvZiB0aGUgaW5uZXIgdmVjdG9ycy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgaW5uZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIHsgcmV0dXJuIG1fb3V0ZXJJbmRleDsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIG51bWJlciBvZiBub24gemVyb3Mgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHdhcm5pbmcgaXQgcmV0dXJucyB0aGUgbnVsbCBwb2ludGVyIDAgaW4gY29tcHJlc3NlZCBtb2RlICovCisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogaW5uZXJOb25aZXJvUHRyKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lck5vblplcm9zOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBudW1iZXIgb2Ygbm9uIHplcm9zIG9mIHRoZSBpbm5lciB2ZWN0b3JzLgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBsaWJyYXJpZXMuCisgICAgICAqIFx3YXJuaW5nIGl0IHJldHVybnMgdGhlIG51bGwgcG9pbnRlciAwIGluIGNvbXByZXNzZWQgbW9kZSAqLworICAgIGlubGluZSBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0cigpIHsgcmV0dXJuIG1faW5uZXJOb25aZXJvczsgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIGlubGluZSBTdG9yYWdlJiBkYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9CisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIGlubGluZSBjb25zdCBTdG9yYWdlJiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXRyaXggYXQgcG9zaXRpb24gXGEgaSwgXGEgagorICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgU2NhbGFyKDApIGlmIHRoZSBlbGVtZW50IGlzIGFuIGV4cGxpY2l0IFxlbSB6ZXJvICovCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93Pj0wICYmIHJvdzxyb3dzKCkgJiYgY29sPj0wICYmIGNvbDxjb2xzKCkpOworICAgICAgCisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisgICAgICBJbmRleCBlbmQgPSBtX2lubmVyTm9uWmVyb3MgPyBtX291dGVySW5kZXhbb3V0ZXJdICsgbV9pbm5lck5vblplcm9zW291dGVyXSA6IG1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgIHJldHVybiBtX2RhdGEuYXRJblJhbmdlKG1fb3V0ZXJJbmRleFtvdXRlcl0sIGVuZCwgU3RvcmFnZUluZGV4KGlubmVyKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgb2YgdGhlIG1hdHJpeCBhdCBwb3NpdGlvbiBcYSBpLCBcYSBqCisgICAgICAqCisgICAgICAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHRoZW4gaXQgaXMgaW5zZXJ0ZWQgdmlhIHRoZSBpbnNlcnQoSW5kZXgsSW5kZXgpIGZ1bmN0aW9uCisgICAgICAqIHdoaWNoIGl0c2VsZiB0dXJucyB0aGUgbWF0cml4IGludG8gYSBub24gY29tcHJlc3NlZCBmb3JtIGlmIHRoYXQgd2FzIG5vdCB0aGUgY2FzZS4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBhIE8obG9nKG5uel9qKSkgb3BlcmF0aW9uIChiaW5hcnkgc2VhcmNoKSBwbHVzIHRoZSBjb3N0IG9mIGluc2VydChJbmRleCxJbmRleCkKKyAgICAgICogZnVuY3Rpb24gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgICAgICovCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHJvdz49MCAmJiByb3c8cm93cygpICYmIGNvbD49MCAmJiBjb2w8Y29scygpKTsKKyAgICAgIAorICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBJbmRleCBzdGFydCA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgICAgICBJbmRleCBlbmQgPSBtX2lubmVyTm9uWmVyb3MgPyBtX291dGVySW5kZXhbb3V0ZXJdICsgbV9pbm5lck5vblplcm9zW291dGVyXSA6IG1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgIGVpZ2VuX2Fzc2VydChlbmQ+PXN0YXJ0ICYmICJ5b3UgcHJvYmFibHkgY2FsbGVkIGNvZWZmUmVmIG9uIGEgbm9uIGZpbmFsaXplZCBtYXRyaXgiKTsKKyAgICAgIGlmKGVuZDw9c3RhcnQpCisgICAgICAgIHJldHVybiBpbnNlcnQocm93LGNvbCk7CisgICAgICBjb25zdCBJbmRleCBwID0gbV9kYXRhLnNlYXJjaExvd2VySW5kZXgoc3RhcnQsZW5kLTEsU3RvcmFnZUluZGV4KGlubmVyKSk7CisgICAgICBpZigocDxlbmQpICYmIChtX2RhdGEuaW5kZXgocCk9PWlubmVyKSkKKyAgICAgICAgcmV0dXJuIG1fZGF0YS52YWx1ZShwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGluc2VydChyb3csY29sKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBub3ZlbCBub24gemVybyBjb2VmZmljaWVudCB3aXRoIGNvb3JkaW5hdGVzIFxhIHJvdyB4IFxhIGNvbC4KKyAgICAgICogVGhlIG5vbiB6ZXJvIGNvZWZmaWNpZW50IG11c3QgXGIgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICAqCisgICAgICAqIElmIHRoZSBtYXRyaXggXGMgKnRoaXMgaXMgaW4gY29tcHJlc3NlZCBtb2RlLCB0aGVuIFxjICp0aGlzIGlzIHR1cm5lZCBpbnRvIHVuY29tcHJlc3NlZAorICAgICAgKiBtb2RlIHdoaWxlIHJlc2VydmluZyByb29tIGZvciAyIHggdGhpcy0+aW5uZXJTaXplKCkgbm9uIHplcm9zIGlmIHJlc2VydmUoSW5kZXgpIGhhcyBub3QgYmVlbiBjYWxsZWQgZWFybGllci4KKyAgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgaW5zZXJ0aW9uIHByb2NlZHVyZSBpcyBvcHRpbWl6ZWQgZm9yIGEgXGUgc2VxdWVudGlhbCBpbnNlcnRpb24gbW9kZSB3aGVyZSBlbGVtZW50cyBhcmUgYXNzdW1lZCB0byBiZQorICAgICAgKiBpbnNlcnRlZCBieSBpbmNyZWFzaW5nIG91dGVyLWluZGljZXMuCisgICAgICAqIAorICAgICAgKiBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCB0aGVuIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGVpdGhlciB1c2UgYSB0cmlwbGV0LWxpc3QgdG8gYXNzZW1ibGUgdGhlIG1hdHJpeCwgb3IgdG8gZmlyc3QKKyAgICAgICogY2FsbCByZXNlcnZlKGNvbnN0IFNpemVzVHlwZSAmKSB0byByZXNlcnZlIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygbm9uLXplcm8gZWxlbWVudHMgcGVyIGlubmVyIHZlY3Rvci4KKyAgICAgICoKKyAgICAgICogQXNzdW1pbmcgbWVtb3J5IGhhcyBiZWVuIGFwcHJvcHJpYXRlbHkgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzb3J0ZWQgaW5zZXJ0aW9uIGluIE8oMSkKKyAgICAgICogaWYgdGhlIGVsZW1lbnRzIG9mIGVhY2ggaW5uZXIgdmVjdG9yIGFyZSBpbnNlcnRlZCBpbiBpbmNyZWFzaW5nIGlubmVyIGluZGV4IG9yZGVyLCBhbmQgaW4gTyhubnpfaikgZm9yIGEgcmFuZG9tIGluc2VydGlvbi4KKyAgICAgICoKKyAgICAgICovCisgICAgU2NhbGFyJiBpbnNlcnQoSW5kZXggcm93LCBJbmRleCBjb2wpOworCisgIHB1YmxpYzoKKworICAgIC8qKiBSZW1vdmVzIGFsbCBub24gemVyb3MgYnV0IGtlZXAgYWxsb2NhdGVkIG1lbW9yeQorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGZyZWUgdGhlIGN1cnJlbnRseSBhbGxvY2F0ZWQgbWVtb3J5LiBUbyByZWxlYXNlIGFzIG11Y2ggYXMgbWVtb3J5IGFzIHBvc3NpYmxlLAorICAgICAgKiBjYWxsIFxjb2RlIG1hdC5kYXRhKCkuc3F1ZWV6ZSgpOyBcZW5kY29kZSBhZnRlciByZXNpemluZyBpdC4KKyAgICAgICogCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgsSW5kZXgpLCBkYXRhKCkKKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0WmVybygpCisgICAgeworICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICBtZW1zZXQobV9vdXRlckluZGV4LCAwLCAobV9vdXRlclNpemUrMSkqc2l6ZW9mKFN0b3JhZ2VJbmRleCkpOworICAgICAgaWYobV9pbm5lck5vblplcm9zKQorICAgICAgICBtZW1zZXQobV9pbm5lck5vblplcm9zLCAwLCAobV9vdXRlclNpemUpKnNpemVvZihTdG9yYWdlSW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogUHJlYWxsb2NhdGVzIFxhIHJlc2VydmVTaXplIG5vbiB6ZXJvcy4KKyAgICAgICoKKyAgICAgICogUHJlY29uZGl0aW9uOiB0aGUgbWF0cml4IG11c3QgYmUgaW4gY29tcHJlc3NlZCBtb2RlLiAqLworICAgIGlubGluZSB2b2lkIHJlc2VydmUoSW5kZXggcmVzZXJ2ZVNpemUpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGlzQ29tcHJlc3NlZCgpICYmICJUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1ha2Ugc2Vuc2UgaW4gbm9uIGNvbXByZXNzZWQgbW9kZS4iKTsKKyAgICAgIG1fZGF0YS5yZXNlcnZlKHJlc2VydmVTaXplKTsKKyAgICB9CisgICAgCisgICAgI2lmZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFByZWFsbG9jYXRlcyBcYSByZXNlcnZlU2l6ZVtcYyBqXSBub24gemVyb3MgZm9yIGVhY2ggY29sdW1uIChyZXNwLiByb3cpIFxjIGouCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIG1hdHJpeCBpbiBub24tY29tcHJlc3NlZCBtb2RlLgorICAgICAgKiAKKyAgICAgICogVGhlIHR5cGUgXGMgU2l6ZXNUeXBlIG11c3QgZXhwb3NlIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorICAgICAgICBcY29kZQorICAgICAgICB0eXBlZGVmIHZhbHVlX3R5cGU7CisgICAgICAgIGNvbnN0IHZhbHVlX3R5cGUmIG9wZXJhdG9yW10oaSkgY29uc3Q7CisgICAgICAgIFxlbmRjb2RlCisgICAgICAqIGZvciBcYyBpIGluIHRoZSBbMCx0aGlzLT5vdXRlclNpemUoKVsgcmFuZ2UuCisgICAgICAqIFR5cGljYWwgY2hvaWNlcyBpbmNsdWRlIHN0ZDo6dmVjdG9yPGludD4sIEVpZ2VuOjpWZWN0b3JYaSwgRWlnZW46OlZlY3RvclhpOjpDb25zdGFudCwgZXRjLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBTaXplc1R5cGU+CisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShjb25zdCBTaXplc1R5cGUmIHJlc2VydmVTaXplcyk7CisgICAgI2Vsc2UKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTaXplc1R5cGU+CisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShjb25zdCBTaXplc1R5cGUmIHJlc2VydmVTaXplcywgY29uc3QgdHlwZW5hbWUgU2l6ZXNUeXBlOjp2YWx1ZV90eXBlJiBlbmFibGVpZiA9CisgICAgI2lmICghRUlHRU5fQ09NUF9NU1ZDKSB8fCAoRUlHRU5fQ09NUF9NU1ZDPj0xNTAwKSAvLyBNU1ZDIDIwMDUgZmFpbHMgdG8gY29tcGlsZSB3aXRoIHRoaXMgdHlwZW5hbWUKKyAgICAgICAgdHlwZW5hbWUKKyAgICAjZW5kaWYKKyAgICAgICAgU2l6ZXNUeXBlOjp2YWx1ZV90eXBlKCkpCisgICAgeworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGVuYWJsZWlmKTsKKyAgICAgIHJlc2VydmVJbm5lclZlY3RvcnMocmVzZXJ2ZVNpemVzKTsKKyAgICB9CisgICAgI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTaXplc1R5cGU+CisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZUlubmVyVmVjdG9ycyhjb25zdCBTaXplc1R5cGUmIHJlc2VydmVTaXplcykKKyAgICB7CisgICAgICBpZihpc0NvbXByZXNzZWQoKSkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggdG90YWxSZXNlcnZlU2l6ZSA9IDA7CisgICAgICAgIC8vIHR1cm4gdGhlIG1hdHJpeCBpbnRvIG5vbi1jb21wcmVzc2VkIG1vZGUKKyAgICAgICAgbV9pbm5lck5vblplcm9zID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oc3RkOjptYWxsb2MobV9vdXRlclNpemUgKiBzaXplb2YoU3RvcmFnZUluZGV4KSkpOworICAgICAgICBpZiAoIW1faW5uZXJOb25aZXJvcykgaW50ZXJuYWw6OnRocm93X3N0ZF9iYWRfYWxsb2MoKTsKKyAgICAgICAgCisgICAgICAgIC8vIHRlbXBvcmFyaWx5IHVzZSBtX2lubmVyU2l6ZXMgdG8gaG9sZCB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50cy4KKyAgICAgICAgU3RvcmFnZUluZGV4KiBuZXdPdXRlckluZGV4ID0gbV9pbm5lck5vblplcm9zOworICAgICAgICAKKyAgICAgICAgU3RvcmFnZUluZGV4IGNvdW50ID0gMDsKKyAgICAgICAgZm9yKEluZGV4IGo9MDsgajxtX291dGVyU2l6ZTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgbmV3T3V0ZXJJbmRleFtqXSA9IGNvdW50OworICAgICAgICAgIGNvdW50ICs9IHJlc2VydmVTaXplc1tqXSArIChtX291dGVySW5kZXhbaisxXS1tX291dGVySW5kZXhbal0pOworICAgICAgICAgIHRvdGFsUmVzZXJ2ZVNpemUgKz0gcmVzZXJ2ZVNpemVzW2pdOworICAgICAgICB9CisgICAgICAgIG1fZGF0YS5yZXNlcnZlKHRvdGFsUmVzZXJ2ZVNpemUpOworICAgICAgICBTdG9yYWdlSW5kZXggcHJldmlvdXNPdXRlckluZGV4ID0gbV9vdXRlckluZGV4W21fb3V0ZXJTaXplXTsKKyAgICAgICAgZm9yKEluZGV4IGo9bV9vdXRlclNpemUtMTsgaj49MDsgLS1qKQorICAgICAgICB7CisgICAgICAgICAgU3RvcmFnZUluZGV4IGlubmVyTk5aID0gcHJldmlvdXNPdXRlckluZGV4IC0gbV9vdXRlckluZGV4W2pdOworICAgICAgICAgIGZvcihJbmRleCBpPWlubmVyTk5aLTE7IGk+PTA7IC0taSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX2RhdGEuaW5kZXgobmV3T3V0ZXJJbmRleFtqXStpKSA9IG1fZGF0YS5pbmRleChtX291dGVySW5kZXhbal0raSk7CisgICAgICAgICAgICBtX2RhdGEudmFsdWUobmV3T3V0ZXJJbmRleFtqXStpKSA9IG1fZGF0YS52YWx1ZShtX291dGVySW5kZXhbal0raSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByZXZpb3VzT3V0ZXJJbmRleCA9IG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgICBtX291dGVySW5kZXhbal0gPSBuZXdPdXRlckluZGV4W2pdOworICAgICAgICAgIG1faW5uZXJOb25aZXJvc1tqXSA9IGlubmVyTk5aOworICAgICAgICB9CisgICAgICAgIG1fb3V0ZXJJbmRleFttX291dGVyU2l6ZV0gPSBtX291dGVySW5kZXhbbV9vdXRlclNpemUtMV0gKyBtX2lubmVyTm9uWmVyb3NbbV9vdXRlclNpemUtMV0gKyByZXNlcnZlU2l6ZXNbbV9vdXRlclNpemUtMV07CisgICAgICAgIAorICAgICAgICBtX2RhdGEucmVzaXplKG1fb3V0ZXJJbmRleFttX291dGVyU2l6ZV0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTdG9yYWdlSW5kZXgqIG5ld091dGVySW5kZXggPSBzdGF0aWNfY2FzdDxTdG9yYWdlSW5kZXgqPihzdGQ6Om1hbGxvYygobV9vdXRlclNpemUrMSkqc2l6ZW9mKFN0b3JhZ2VJbmRleCkpKTsKKyAgICAgICAgaWYgKCFuZXdPdXRlckluZGV4KSBpbnRlcm5hbDo6dGhyb3dfc3RkX2JhZF9hbGxvYygpOworICAgICAgICAKKyAgICAgICAgU3RvcmFnZUluZGV4IGNvdW50ID0gMDsKKyAgICAgICAgZm9yKEluZGV4IGo9MDsgajxtX291dGVyU2l6ZTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgbmV3T3V0ZXJJbmRleFtqXSA9IGNvdW50OworICAgICAgICAgIFN0b3JhZ2VJbmRleCBhbHJlYWR5UmVzZXJ2ZWQgPSAobV9vdXRlckluZGV4W2orMV0tbV9vdXRlckluZGV4W2pdKSAtIG1faW5uZXJOb25aZXJvc1tqXTsKKyAgICAgICAgICBTdG9yYWdlSW5kZXggdG9SZXNlcnZlID0gc3RkOjptYXg8U3RvcmFnZUluZGV4PihyZXNlcnZlU2l6ZXNbal0sIGFscmVhZHlSZXNlcnZlZCk7CisgICAgICAgICAgY291bnQgKz0gdG9SZXNlcnZlICsgbV9pbm5lck5vblplcm9zW2pdOworICAgICAgICB9CisgICAgICAgIG5ld091dGVySW5kZXhbbV9vdXRlclNpemVdID0gY291bnQ7CisgICAgICAgIAorICAgICAgICBtX2RhdGEucmVzaXplKGNvdW50KTsKKyAgICAgICAgZm9yKEluZGV4IGo9bV9vdXRlclNpemUtMTsgaj49MDsgLS1qKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggb2Zmc2V0ID0gbmV3T3V0ZXJJbmRleFtqXSAtIG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgICBpZihvZmZzZXQ+MCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTdG9yYWdlSW5kZXggaW5uZXJOTlogPSBtX2lubmVyTm9uWmVyb3Nbal07CisgICAgICAgICAgICBmb3IoSW5kZXggaT1pbm5lck5OWi0xOyBpPj0wOyAtLWkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1fZGF0YS5pbmRleChuZXdPdXRlckluZGV4W2pdK2kpID0gbV9kYXRhLmluZGV4KG1fb3V0ZXJJbmRleFtqXStpKTsKKyAgICAgICAgICAgICAgbV9kYXRhLnZhbHVlKG5ld091dGVySW5kZXhbal0raSkgPSBtX2RhdGEudmFsdWUobV9vdXRlckluZGV4W2pdK2kpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RkOjpzd2FwKG1fb3V0ZXJJbmRleCwgbmV3T3V0ZXJJbmRleCk7CisgICAgICAgIHN0ZDo6ZnJlZShuZXdPdXRlckluZGV4KTsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgcHVibGljOgorCisgICAgLy8tLS0gbG93IGxldmVsIHB1cmVseSBjb2hlcmVudCBmaWxsaW5nIC0tLQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbm9uIHplcm8gY29lZmZpY2llbnQgYXQgcG9zaXRpb24gXGEgcm93LCBcYSBjb2wgYXNzdW1pbmcgdGhhdDoKKyAgICAgICogLSB0aGUgbm9uemVybyBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisgICAgICAqIC0gdGhlIG5ldyBjb2VmZmljaWVudCBpcyB0aGUgbGFzdCBvbmUgYWNjb3JkaW5nIHRvIHRoZSBzdG9yYWdlIG9yZGVyCisgICAgICAqCisgICAgICAqIEJlZm9yZSBmaWxsaW5nIGEgZ2l2ZW4gaW5uZXIgdmVjdG9yIHlvdSBtdXN0IGNhbGwgdGhlIHN0YXRWZWMoSW5kZXgpIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBBZnRlciBhbiBpbnNlcnRpb24gc2Vzc2lvbiwgeW91IHNob3VsZCBjYWxsIHRoZSBmaW5hbGl6ZSgpIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgaW5zZXJ0LCBpbnNlcnRCYWNrQnlPdXRlcklubmVyLCBzdGFydFZlYyAqLworICAgIGlubGluZSBTY2FsYXImIGluc2VydEJhY2soSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIGluc2VydEJhY2tCeU91dGVySW5uZXIoSXNSb3dNYWpvcj9yb3c6Y29sLCBJc1Jvd01ham9yP2NvbDpyb3cpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogXHNhIGluc2VydEJhY2ssIHN0YXJ0VmVjICovCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KEluZGV4KG1fb3V0ZXJJbmRleFtvdXRlcisxXSkgPT0gbV9kYXRhLnNpemUoKSAmJiAiSW52YWxpZCBvcmRlcmVkIGluc2VydGlvbiAoaW52YWxpZCBvdXRlciBpbmRleCkiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydCggKG1fb3V0ZXJJbmRleFtvdXRlcisxXS1tX291dGVySW5kZXhbb3V0ZXJdPT0wIHx8IG1fZGF0YS5pbmRleChtX2RhdGEuc2l6ZSgpLTEpPGlubmVyKSAmJiAiSW52YWxpZCBvcmRlcmVkIGluc2VydGlvbiAoaW52YWxpZCBpbm5lciBpbmRleCkiKTsKKyAgICAgIEluZGV4IHAgPSBtX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICArK21fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgIG1fZGF0YS5hcHBlbmQoU2NhbGFyKDApLCBpbm5lcik7CisgICAgICByZXR1cm4gbV9kYXRhLnZhbHVlKHApOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogXHdhcm5pbmcgdXNlIGl0IG9ubHkgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nICovCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lclVub3JkZXJlZChJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpCisgICAgeworICAgICAgSW5kZXggcCA9IG1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgICsrbV9vdXRlckluZGV4W291dGVyKzFdOworICAgICAgbV9kYXRhLmFwcGVuZChTY2FsYXIoMCksIGlubmVyKTsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUocCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcc2EgaW5zZXJ0QmFjaywgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lciAqLworICAgIGlubGluZSB2b2lkIHN0YXJ0VmVjKEluZGV4IG91dGVyKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX291dGVySW5kZXhbb3V0ZXJdPT1JbmRleChtX2RhdGEuc2l6ZSgpKSAmJiAiWW91IG11c3QgY2FsbCBzdGFydFZlYyBmb3IgZWFjaCBpbm5lciB2ZWN0b3Igc2VxdWVudGlhbGx5Iik7CisgICAgICBlaWdlbl9hc3NlcnQobV9vdXRlckluZGV4W291dGVyKzFdPT0wICYmICJZb3UgbXVzdCBjYWxsIHN0YXJ0VmVjIGZvciBlYWNoIGlubmVyIHZlY3RvciBzZXF1ZW50aWFsbHkiKTsKKyAgICAgIG1fb3V0ZXJJbmRleFtvdXRlcisxXSA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBpbnNlcnRpbmcgYSBzZXQgb2Ygbm9uIHplcm8gZW50cmllcyB1c2luZyB0aGUgbG93IGxldmVsIGNvbXByZXNzZWQgQVBJLgorICAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBmaW5hbGl6ZSgpCisgICAgeworICAgICAgaWYoaXNDb21wcmVzc2VkKCkpCisgICAgICB7CisgICAgICAgIFN0b3JhZ2VJbmRleCBzaXplID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihtX2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgSW5kZXggaSA9IG1fb3V0ZXJTaXplOworICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IGZpbGxlZCBjb2x1bW4KKyAgICAgICAgd2hpbGUgKGk+PTAgJiYgbV9vdXRlckluZGV4W2ldPT0wKQorICAgICAgICAgIC0taTsKKyAgICAgICAgKytpOworICAgICAgICB3aGlsZSAoaTw9bV9vdXRlclNpemUpCisgICAgICAgIHsKKyAgICAgICAgICBtX291dGVySW5kZXhbaV0gPSBzaXplOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vLS0tCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9ycz4KKyAgICB2b2lkIHNldEZyb21UcmlwbGV0cyhjb25zdCBJbnB1dEl0ZXJhdG9ycyYgYmVnaW4sIGNvbnN0IElucHV0SXRlcmF0b3JzJiBlbmQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcnMsdHlwZW5hbWUgRHVwRnVuY3Rvcj4KKyAgICB2b2lkIHNldEZyb21UcmlwbGV0cyhjb25zdCBJbnB1dEl0ZXJhdG9ycyYgYmVnaW4sIGNvbnN0IElucHV0SXRlcmF0b3JzJiBlbmQsIER1cEZ1bmN0b3IgZHVwX2Z1bmMpOworCisgICAgdm9pZCBzdW11cER1cGxpY2F0ZXMoKSB7IGNvbGxhcHNlRHVwbGljYXRlcyhpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPigpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRHVwRnVuY3Rvcj4KKyAgICB2b2lkIGNvbGxhcHNlRHVwbGljYXRlcyhEdXBGdW5jdG9yIGR1cF9mdW5jID0gRHVwRnVuY3RvcigpKTsKKworICAgIC8vLS0tCisgICAgCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBzYW1lIGFzIGluc2VydChJbmRleCxJbmRleCkgZXhjZXB0IHRoYXQgdGhlIGluZGljZXMgYXJlIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBzdG9yYWdlIG9yZGVyICovCisgICAgU2NhbGFyJiBpbnNlcnRCeU91dGVySW5uZXIoSW5kZXggaiwgSW5kZXggaSkKKyAgICB7CisgICAgICByZXR1cm4gaW5zZXJ0KElzUm93TWFqb3IgPyBqIDogaSwgSXNSb3dNYWpvciA/IGkgOiBqKTsKKyAgICB9CisKKyAgICAvKiogVHVybnMgdGhlIG1hdHJpeCBpbnRvIHRoZSBcZW0gY29tcHJlc3NlZCBmb3JtYXQuCisgICAgICAqLworICAgIHZvaWQgbWFrZUNvbXByZXNzZWQoKQorICAgIHsKKyAgICAgIGlmKGlzQ29tcHJlc3NlZCgpKQorICAgICAgICByZXR1cm47CisgICAgICAKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX291dGVySW5kZXghPTAgJiYgbV9vdXRlclNpemU+MCk7CisgICAgICAKKyAgICAgIEluZGV4IG9sZFN0YXJ0ID0gbV9vdXRlckluZGV4WzFdOworICAgICAgbV9vdXRlckluZGV4WzFdID0gbV9pbm5lck5vblplcm9zWzBdOworICAgICAgZm9yKEluZGV4IGo9MTsgajxtX291dGVyU2l6ZTsgKytqKQorICAgICAgeworICAgICAgICBJbmRleCBuZXh0T2xkU3RhcnQgPSBtX291dGVySW5kZXhbaisxXTsKKyAgICAgICAgSW5kZXggb2Zmc2V0ID0gb2xkU3RhcnQgLSBtX291dGVySW5kZXhbal07CisgICAgICAgIGlmKG9mZnNldD4wKQorICAgICAgICB7CisgICAgICAgICAgZm9yKEluZGV4IGs9MDsgazxtX2lubmVyTm9uWmVyb3Nbal07ICsraykKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX2RhdGEuaW5kZXgobV9vdXRlckluZGV4W2pdK2spID0gbV9kYXRhLmluZGV4KG9sZFN0YXJ0K2spOworICAgICAgICAgICAgbV9kYXRhLnZhbHVlKG1fb3V0ZXJJbmRleFtqXStrKSA9IG1fZGF0YS52YWx1ZShvbGRTdGFydCtrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9vdXRlckluZGV4W2orMV0gPSBtX291dGVySW5kZXhbal0gKyBtX2lubmVyTm9uWmVyb3Nbal07CisgICAgICAgIG9sZFN0YXJ0ID0gbmV4dE9sZFN0YXJ0OworICAgICAgfQorICAgICAgc3RkOjpmcmVlKG1faW5uZXJOb25aZXJvcyk7CisgICAgICBtX2lubmVyTm9uWmVyb3MgPSAwOworICAgICAgbV9kYXRhLnJlc2l6ZShtX291dGVySW5kZXhbbV9vdXRlclNpemVdKTsKKyAgICAgIG1fZGF0YS5zcXVlZXplKCk7CisgICAgfQorCisgICAgLyoqIFR1cm5zIHRoZSBtYXRyaXggaW50byB0aGUgdW5jb21wcmVzc2VkIG1vZGUgKi8KKyAgICB2b2lkIHVuY29tcHJlc3MoKQorICAgIHsKKyAgICAgIGlmKG1faW5uZXJOb25aZXJvcyAhPSAwKQorICAgICAgICByZXR1cm47IAorICAgICAgbV9pbm5lck5vblplcm9zID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oc3RkOjptYWxsb2MobV9vdXRlclNpemUgKiBzaXplb2YoU3RvcmFnZUluZGV4KSkpOworICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG1fb3V0ZXJTaXplOyBpKyspCisgICAgICB7CisgICAgICAgIG1faW5uZXJOb25aZXJvc1tpXSA9IG1fb3V0ZXJJbmRleFtpKzFdIC0gbV9vdXRlckluZGV4W2ldOyAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqIFN1cHByZXNzZXMgYWxsIG5vbnplcm9zIHdoaWNoIGFyZSBcYiBtdWNoIFxiIHNtYWxsZXIgXGIgdGhhbiBcYSByZWZlcmVuY2UgdW5kZXIgdGhlIHRvbGVyZW5jZSBcYSBlcHNpbG9uICovCisgICAgdm9pZCBwcnVuZShjb25zdCBTY2FsYXImIHJlZmVyZW5jZSwgY29uc3QgUmVhbFNjYWxhciYgZXBzaWxvbiA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCisgICAgeworICAgICAgcHJ1bmUoZGVmYXVsdF9wcnVubmluZ19mdW5jKHJlZmVyZW5jZSxlcHNpbG9uKSk7CisgICAgfQorICAgIAorICAgIC8qKiBUdXJucyB0aGUgbWF0cml4IGludG8gY29tcHJlc3NlZCBmb3JtYXQsIGFuZCBzdXBwcmVzc2VzIGFsbCBub256ZXJvcyB3aGljaCBkbyBub3Qgc2F0aXNmeSB0aGUgcHJlZGljYXRlIFxhIGtlZXAuCisgICAgICAqIFRoZSBmdW5jdG9yIHR5cGUgXGEgS2VlcEZ1bmMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKyAgICAgICogXGNvZGUKKyAgICAgICogYm9vbCBvcGVyYXRvcigpIChjb25zdCBJbmRleCYgcm93LCBjb25zdCBJbmRleCYgY29sLCBjb25zdCBTY2FsYXImIHZhbHVlKSBjb25zdDsKKyAgICAgICogXGVuZGNvZGUKKyAgICAgICogXHNhIHBydW5lKFNjYWxhcixSZWFsU2NhbGFyKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZWVwRnVuYz4KKyAgICB2b2lkIHBydW5lKGNvbnN0IEtlZXBGdW5jJiBrZWVwID0gS2VlcEZ1bmMoKSkKKyAgICB7CisgICAgICAvLyBUT0RPIG9wdGltaXplIHRoZSB1bmNvbXByZXNzZWQgbW9kZSB0byBhdm9pZCBtb3ZpbmcgYW5kIGFsbG9jYXRpbmcgdGhlIGRhdGEgdHdpY2UKKyAgICAgIG1ha2VDb21wcmVzc2VkKCk7CisKKyAgICAgIFN0b3JhZ2VJbmRleCBrID0gMDsKKyAgICAgIGZvcihJbmRleCBqPTA7IGo8bV9vdXRlclNpemU7ICsraikKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcHJldmlvdXNTdGFydCA9IG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgbV9vdXRlckluZGV4W2pdID0gazsKKyAgICAgICAgSW5kZXggZW5kID0gbV9vdXRlckluZGV4W2orMV07CisgICAgICAgIGZvcihJbmRleCBpPXByZXZpb3VzU3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBpZihrZWVwKElzUm93TWFqb3I/ajptX2RhdGEuaW5kZXgoaSksIElzUm93TWFqb3I/bV9kYXRhLmluZGV4KGkpOmosIG1fZGF0YS52YWx1ZShpKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgbV9kYXRhLnZhbHVlKGspID0gbV9kYXRhLnZhbHVlKGkpOworICAgICAgICAgICAgbV9kYXRhLmluZGV4KGspID0gbV9kYXRhLmluZGV4KGkpOworICAgICAgICAgICAgKytrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9vdXRlckluZGV4W21fb3V0ZXJTaXplXSA9IGs7CisgICAgICBtX2RhdGEucmVzaXplKGssMCk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBhIFxhIHJvd3MgeCBcYSBjb2xzIG1hdHJpeCBsZWF2aW5nIG9sZCB2YWx1ZXMgdW50b3VjaGVkLgorICAgICAgKgorICAgICAgKiBJZiB0aGUgc2l6ZXMgb2YgdGhlIG1hdHJpeCBhcmUgZGVjcmVhc2VkLCB0aGVuIHRoZSBtYXRyaXggaXMgdHVybmVkIHRvIFxiIHVuY29tcHJlc3NlZC1tb2RlCisgICAgICAqIGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUgb3V0IG9mIGJvdW5kcyBjb2VmZmljaWVudHMgaXMga2VwdCBhbmQgcmVzZXJ2ZWQuCisgICAgICAqIENhbGwgbWFrZUNvbXByZXNzZWQoKSB0byBwYWNrIHRoZSBlbnRyaWVzIGFuZCBzcXVlZXplIGV4dHJhIG1lbW9yeS4KKyAgICAgICoKKyAgICAgICogXHNhIHJlc2VydmUoKSwgc2V0WmVybygpLCBtYWtlQ29tcHJlc3NlZCgpCisgICAgICAqLworICAgIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIAorICAgIHsKKyAgICAgIC8vIE5vIGNoYW5nZQorICAgICAgaWYgKHRoaXMtPnJvd3MoKSA9PSByb3dzICYmIHRoaXMtPmNvbHMoKSA9PSBjb2xzKSByZXR1cm47CisgICAgICAKKyAgICAgIC8vIElmIG9uZSBkaW1lbnNpb24gaXMgbnVsbCwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIHByZXNlcnZlZAorICAgICAgaWYocm93cz09MCB8fCBjb2xzPT0wKSByZXR1cm4gcmVzaXplKHJvd3MsY29scyk7CisKKyAgICAgIEluZGV4IGlubmVyQ2hhbmdlID0gSXNSb3dNYWpvciA/IGNvbHMgLSB0aGlzLT5jb2xzKCkgOiByb3dzIC0gdGhpcy0+cm93cygpOworICAgICAgSW5kZXggb3V0ZXJDaGFuZ2UgPSBJc1Jvd01ham9yID8gcm93cyAtIHRoaXMtPnJvd3MoKSA6IGNvbHMgLSB0aGlzLT5jb2xzKCk7CisgICAgICBTdG9yYWdlSW5kZXggbmV3SW5uZXJTaXplID0gY29udmVydF9pbmRleChJc1Jvd01ham9yID8gY29scyA6IHJvd3MpOworCisgICAgICAvLyBEZWFscyB3aXRoIGlubmVyIG5vbiB6ZXJvcworICAgICAgaWYgKG1faW5uZXJOb25aZXJvcykKKyAgICAgIHsKKyAgICAgICAgLy8gUmVzaXplIG1faW5uZXJOb25aZXJvcworICAgICAgICBTdG9yYWdlSW5kZXggKm5ld0lubmVyTm9uWmVyb3MgPSBzdGF0aWNfY2FzdDxTdG9yYWdlSW5kZXgqPihzdGQ6OnJlYWxsb2MobV9pbm5lck5vblplcm9zLCAobV9vdXRlclNpemUgKyBvdXRlckNoYW5nZSkgKiBzaXplb2YoU3RvcmFnZUluZGV4KSkpOworICAgICAgICBpZiAoIW5ld0lubmVyTm9uWmVyb3MpIGludGVybmFsOjp0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgICAgICAgIG1faW5uZXJOb25aZXJvcyA9IG5ld0lubmVyTm9uWmVyb3M7CisgICAgICAgIAorICAgICAgICBmb3IoSW5kZXggaT1tX291dGVyU2l6ZTsgaTxtX291dGVyU2l6ZStvdXRlckNoYW5nZTsgaSsrKSAgICAgICAgICAKKyAgICAgICAgICBtX2lubmVyTm9uWmVyb3NbaV0gPSAwOworICAgICAgfSAKKyAgICAgIGVsc2UgaWYgKGlubmVyQ2hhbmdlIDwgMCkgCisgICAgICB7CisgICAgICAgIC8vIElubmVyIHNpemUgZGVjcmVhc2VkOiBhbGxvY2F0ZSBhIG5ldyBtX2lubmVyTm9uWmVyb3MKKyAgICAgICAgbV9pbm5lck5vblplcm9zID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oc3RkOjptYWxsb2MoKG1fb3V0ZXJTaXplK291dGVyQ2hhbmdlKzEpICogc2l6ZW9mKFN0b3JhZ2VJbmRleCkpKTsKKyAgICAgICAgaWYgKCFtX2lubmVyTm9uWmVyb3MpIGludGVybmFsOjp0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgICAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1fb3V0ZXJTaXplOyBpKyspCisgICAgICAgICAgbV9pbm5lck5vblplcm9zW2ldID0gbV9vdXRlckluZGV4W2krMV0gLSBtX291dGVySW5kZXhbaV07CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIENoYW5nZSB0aGUgbV9pbm5lck5vblplcm9zIGluIGNhc2Ugb2YgYSBkZWNyZWFzZSBvZiBpbm5lciBzaXplCisgICAgICBpZiAobV9pbm5lck5vblplcm9zICYmIGlubmVyQ2hhbmdlIDwgMCkKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbV9vdXRlclNpemUgKyAoc3RkOjptaW4pKG91dGVyQ2hhbmdlLCBJbmRleCgwKSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIFN0b3JhZ2VJbmRleCAmbiA9IG1faW5uZXJOb25aZXJvc1tpXTsKKyAgICAgICAgICBTdG9yYWdlSW5kZXggc3RhcnQgPSBtX291dGVySW5kZXhbaV07CisgICAgICAgICAgd2hpbGUgKG4gPiAwICYmIG1fZGF0YS5pbmRleChzdGFydCtuLTEpID49IG5ld0lubmVyU2l6ZSkgLS1uOyAKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICBtX2lubmVyU2l6ZSA9IG5ld0lubmVyU2l6ZTsKKworICAgICAgLy8gUmUtYWxsb2NhdGUgb3V0ZXIgaW5kZXggc3RydWN0dXJlIGlmIG5lY2Vzc2FyeQorICAgICAgaWYgKG91dGVyQ2hhbmdlID09IDApCisgICAgICAgIHJldHVybjsKKyAgICAgICAgICAKKyAgICAgIFN0b3JhZ2VJbmRleCAqbmV3T3V0ZXJJbmRleCA9IHN0YXRpY19jYXN0PFN0b3JhZ2VJbmRleCo+KHN0ZDo6cmVhbGxvYyhtX291dGVySW5kZXgsIChtX291dGVyU2l6ZSArIG91dGVyQ2hhbmdlICsgMSkgKiBzaXplb2YoU3RvcmFnZUluZGV4KSkpOworICAgICAgaWYgKCFuZXdPdXRlckluZGV4KSBpbnRlcm5hbDo6dGhyb3dfc3RkX2JhZF9hbGxvYygpOworICAgICAgbV9vdXRlckluZGV4ID0gbmV3T3V0ZXJJbmRleDsKKyAgICAgIGlmIChvdXRlckNoYW5nZSA+IDApCisgICAgICB7CisgICAgICAgIFN0b3JhZ2VJbmRleCBsYXN0ID0gbV9vdXRlclNpemUgPT0gMCA/IDAgOiBtX291dGVySW5kZXhbbV9vdXRlclNpemVdOworICAgICAgICBmb3IoSW5kZXggaT1tX291dGVyU2l6ZTsgaTxtX291dGVyU2l6ZStvdXRlckNoYW5nZSsxOyBpKyspICAgICAgICAgIAorICAgICAgICAgIG1fb3V0ZXJJbmRleFtpXSA9IGxhc3Q7IAorICAgICAgfQorICAgICAgbV9vdXRlclNpemUgKz0gb3V0ZXJDaGFuZ2U7CisgICAgfQorICAgIAorICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXggdG8gYSBcYSByb3dzIHggXGEgY29scyBtYXRyaXggYW5kIGluaXRpYWxpemVzIGl0IHRvIHplcm8uCisgICAgICAqIAorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGZyZWUgdGhlIGN1cnJlbnRseSBhbGxvY2F0ZWQgbWVtb3J5LiBUbyByZWxlYXNlIGFzIG11Y2ggYXMgbWVtb3J5IGFzIHBvc3NpYmxlLAorICAgICAgKiBjYWxsIFxjb2RlIG1hdC5kYXRhKCkuc3F1ZWV6ZSgpOyBcZW5kY29kZSBhZnRlciByZXNpemluZyBpdC4KKyAgICAgICogCisgICAgICAqIFxzYSByZXNlcnZlKCksIHNldFplcm8oKQorICAgICAgKi8KKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IElzUm93TWFqb3IgPyByb3dzIDogY29sczsKKyAgICAgIG1faW5uZXJTaXplID0gSXNSb3dNYWpvciA/IGNvbHMgOiByb3dzOworICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICBpZiAobV9vdXRlclNpemUgIT0gb3V0ZXJTaXplIHx8IG1fb3V0ZXJTaXplPT0wKQorICAgICAgeworICAgICAgICBzdGQ6OmZyZWUobV9vdXRlckluZGV4KTsKKyAgICAgICAgbV9vdXRlckluZGV4ID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oc3RkOjptYWxsb2MoKG91dGVyU2l6ZSArIDEpICogc2l6ZW9mKFN0b3JhZ2VJbmRleCkpKTsKKyAgICAgICAgaWYgKCFtX291dGVySW5kZXgpIGludGVybmFsOjp0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgICAgICAgIAorICAgICAgICBtX291dGVyU2l6ZSA9IG91dGVyU2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmKG1faW5uZXJOb25aZXJvcykKKyAgICAgIHsKKyAgICAgICAgc3RkOjpmcmVlKG1faW5uZXJOb25aZXJvcyk7CisgICAgICAgIG1faW5uZXJOb25aZXJvcyA9IDA7CisgICAgICB9CisgICAgICBtZW1zZXQobV9vdXRlckluZGV4LCAwLCAobV9vdXRlclNpemUrMSkqc2l6ZW9mKFN0b3JhZ2VJbmRleCkpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogUmVzaXplIHRoZSBub256ZXJvIHZlY3RvciB0byBcYSBzaXplICovCisgICAgdm9pZCByZXNpemVOb25aZXJvcyhJbmRleCBzaXplKQorICAgIHsKKyAgICAgIG1fZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgZXhwcmVzc2lvbiBvZiB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzLiAqLworICAgIGNvbnN0IENvbnN0RGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgY29uc3QgeyByZXR1cm4gQ29uc3REaWFnb25hbFJldHVyblR5cGUoKnRoaXMpOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVhZC13cml0ZSBleHByZXNzaW9uIG9mIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMuCisgICAgICAqIFx3YXJuaW5nIElmIHRoZSBkaWFnb25hbCBlbnRyaWVzIGFyZSB3cml0dGVuLCB0aGVuIGFsbCBkaWFnb25hbAorICAgICAgKiBlbnRyaWVzIFxiIG11c3QgYWxyZWFkeSBleGlzdCwgb3RoZXJ3aXNlIGFuIGFzc2VydGlvbiB3aWxsIGJlIHJhaXNlZC4KKyAgICAgICovCisgICAgRGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgeyByZXR1cm4gRGlhZ29uYWxSZXR1cm5UeXBlKCp0aGlzKTsgfQorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgeWllbGRpbmcgYW4gZW1wdHkgXGMgMCBcYyB4IFxjIDAgbWF0cml4ICovCisgICAgaW5saW5lIFNwYXJzZU1hdHJpeCgpCisgICAgICA6IG1fb3V0ZXJTaXplKC0xKSwgbV9pbm5lclNpemUoMCksIG1fb3V0ZXJJbmRleCgwKSwgbV9pbm5lck5vblplcm9zKDApCisgICAgeworICAgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAgICAgcmVzaXplKDAsIDApOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgXGEgcm93cyBcYyB4IFxhIGNvbHMgZW1wdHkgbWF0cml4ICovCisgICAgaW5saW5lIFNwYXJzZU1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX291dGVyU2l6ZSgwKSwgbV9pbm5lclNpemUoMCksIG1fb3V0ZXJJbmRleCgwKSwgbV9pbm5lck5vblplcm9zKDApCisgICAgeworICAgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAgICAgcmVzaXplKHJvd3MsIGNvbHMpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3BhcnNlIG1hdHJpeCBmcm9tIHRoZSBzcGFyc2UgZXhwcmVzc2lvbiBcYSBvdGhlciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1fb3V0ZXJTaXplKDApLCBtX2lubmVyU2l6ZSgwKSwgbV9vdXRlckluZGV4KDApLCBtX2lubmVyTm9uWmVyb3MoMCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKyAgICAgIGNvbnN0IGJvb2wgbmVlZFRvVHJhbnNwb3NlID0gKEZsYWdzICYgUm93TWFqb3JCaXQpICE9IChpbnRlcm5hbDo6ZXZhbHVhdG9yPE90aGVyRGVyaXZlZD46OkZsYWdzICYgUm93TWFqb3JCaXQpOworICAgICAgaWYgKG5lZWRUb1RyYW5zcG9zZSkKKyAgICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICNpZmRlZiBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgICAgICAgICBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXMoKnRoaXMsIG90aGVyLmRlcml2ZWQoKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3BhcnNlIG1hdHJpeCBmcm9tIHRoZSBzcGFyc2Ugc2VsZmFkam9pbnQgdmlldyBcYSBvdGhlciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgdW5zaWduZWQgaW50IFVwTG8+CisgICAgaW5saW5lIFNwYXJzZU1hdHJpeChjb25zdCBTcGFyc2VTZWxmQWRqb2ludFZpZXc8T3RoZXJEZXJpdmVkLCBVcExvPiYgb3RoZXIpCisgICAgICA6IG1fb3V0ZXJTaXplKDApLCBtX2lubmVyU2l6ZSgwKSwgbV9vdXRlckluZGV4KDApLCBtX2lubmVyTm9uWmVyb3MoMCkKKyAgICB7CisgICAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgICAgICBCYXNlOjpvcGVyYXRvcj0ob3RoZXIpOworICAgIH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIChpdCBwZXJmb3JtcyBhIGRlZXAgY29weSkgKi8KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeCYgb3RoZXIpCisgICAgICA6IEJhc2UoKSwgbV9vdXRlclNpemUoMCksIG1faW5uZXJTaXplKDApLCBtX291dGVySW5kZXgoMCksIG1faW5uZXJOb25aZXJvcygwKQorICAgIHsKKyAgICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKyAgICAgICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciB3aXRoIGluLXBsYWNlIGV2YWx1YXRpb24gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgU3BhcnNlTWF0cml4KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IEJhc2UoKSwgbV9vdXRlclNpemUoMCksIG1faW5uZXJTaXplKDApLCBtX291dGVySW5kZXgoMCksIG1faW5uZXJOb25aZXJvcygwKQorICAgIHsKKyAgICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsKKyAgICAgIGluaXRBc3NpZ25tZW50KG90aGVyKTsKKyAgICAgIG90aGVyLmV2YWxUbygqdGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciB3aXRoIGluLXBsYWNlIGV2YWx1YXRpb24gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgZXhwbGljaXQgU3BhcnNlTWF0cml4KGNvbnN0IERpYWdvbmFsQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICAgIDogQmFzZSgpLCBtX291dGVyU2l6ZSgwKSwgbV9pbm5lclNpemUoMCksIG1fb3V0ZXJJbmRleCgwKSwgbV9pbm5lck5vblplcm9zKDApCisgICAgeworICAgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFN3YXBzIHRoZSBjb250ZW50IG9mIHR3byBzcGFyc2UgbWF0cmljZXMgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICogVGhpcyBpcyBhIGZhc3Qgb3BlcmF0aW9uIHRoYXQgc2ltcGx5IHN3YXBzIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXJzIGFuZCBwYXJhbWV0ZXJzLiAqLworICAgIGlubGluZSB2b2lkIHN3YXAoU3BhcnNlTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICAvL0VJR0VOX0RCR19TUEFSU0Uoc3RkOjpjb3V0IDw8ICJTcGFyc2VNYXRyaXg6OiBzd2FwXG4iKTsKKyAgICAgIHN0ZDo6c3dhcChtX291dGVySW5kZXgsIG90aGVyLm1fb3V0ZXJJbmRleCk7CisgICAgICBzdGQ6OnN3YXAobV9pbm5lclNpemUsIG90aGVyLm1faW5uZXJTaXplKTsKKyAgICAgIHN0ZDo6c3dhcChtX291dGVyU2l6ZSwgb3RoZXIubV9vdXRlclNpemUpOworICAgICAgc3RkOjpzd2FwKG1faW5uZXJOb25aZXJvcywgb3RoZXIubV9pbm5lck5vblplcm9zKTsKKyAgICAgIG1fZGF0YS5zd2FwKG90aGVyLm1fZGF0YSk7CisgICAgfQorCisgICAgLyoqIFNldHMgKnRoaXMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeC4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIHR1cm5zIHRoZSBtYXRyaXggaW50byBjb21wcmVzc2VkIG1vZGUsIGFuZCBkcm9wIGFueSByZXNlcnZlZCBtZW1vcnkuICovCisgICAgaW5saW5lIHZvaWQgc2V0SWRlbnRpdHkoKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpICYmICJPTkxZIEZPUiBTUVVBUkVEIE1BVFJJQ0VTIik7CisgICAgICB0aGlzLT5tX2RhdGEucmVzaXplKHJvd3MoKSk7CisgICAgICBFaWdlbjo6TWFwPEluZGV4VmVjdG9yPih0aGlzLT5tX2RhdGEuaW5kZXhQdHIoKSwgcm93cygpKS5zZXRMaW5TcGFjZWQoMCwgU3RvcmFnZUluZGV4KHJvd3MoKS0xKSk7CisgICAgICBFaWdlbjo6TWFwPFNjYWxhclZlY3Rvcj4odGhpcy0+bV9kYXRhLnZhbHVlUHRyKCksIHJvd3MoKSkuc2V0T25lcygpOworICAgICAgRWlnZW46Ok1hcDxJbmRleFZlY3Rvcj4odGhpcy0+bV9vdXRlckluZGV4LCByb3dzKCkrMSkuc2V0TGluU3BhY2VkKDAsIFN0b3JhZ2VJbmRleChyb3dzKCkpKTsKKyAgICAgIHN0ZDo6ZnJlZShtX2lubmVyTm9uWmVyb3MpOworICAgICAgbV9pbm5lck5vblplcm9zID0gMDsKKyAgICB9CisgICAgaW5saW5lIFNwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeCYgb3RoZXIpCisgICAgeworICAgICAgaWYgKG90aGVyLmlzUlZhbHVlKCkpCisgICAgICB7CisgICAgICAgIHN3YXAob3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZih0aGlzIT0mb3RoZXIpCisgICAgICB7CisgICAgICAgICNpZmRlZiBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgICAgICAgICBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGluaXRBc3NpZ25tZW50KG90aGVyKTsKKyAgICAgICAgaWYob3RoZXIuaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX291dGVySW5kZXgsIG90aGVyLm1fb3V0ZXJJbmRleCArIG1fb3V0ZXJTaXplICsgMSwgbV9vdXRlckluZGV4KTsKKyAgICAgICAgICBtX2RhdGEgPSBvdGhlci5tX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOyB9CisjZW5kaWYgLy8gRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ET05UX0lOTElORSBTcGFyc2VNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgU3BhcnNlTWF0cml4JiBtKQorICAgIHsKKyAgICAgIEVJR0VOX0RCR19TUEFSU0UoCisgICAgICAgIHMgPDwgIk5vbnplcm8gZW50cmllczpcbiI7CisgICAgICAgIGlmKG0uaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKEluZGV4IGk9MDsgaTxtLm5vblplcm9zKCk7ICsraSkKKyAgICAgICAgICAgIHMgPDwgIigiIDw8IG0ubV9kYXRhLnZhbHVlKGkpIDw8ICIsIiA8PCBtLm1fZGF0YS5pbmRleChpKSA8PCAiKSAiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZvciAoSW5kZXggaT0wOyBpPG0ub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBJbmRleCBwID0gbS5tX291dGVySW5kZXhbaV07CisgICAgICAgICAgICBJbmRleCBwZSA9IG0ubV9vdXRlckluZGV4W2ldK20ubV9pbm5lck5vblplcm9zW2ldOworICAgICAgICAgICAgSW5kZXggaz1wOworICAgICAgICAgICAgZm9yICg7IGs8cGU7ICsraykgeworICAgICAgICAgICAgICBzIDw8ICIoIiA8PCBtLm1fZGF0YS52YWx1ZShrKSA8PCAiLCIgPDwgbS5tX2RhdGEuaW5kZXgoaykgPDwgIikgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOyBrPG0ubV9vdXRlckluZGV4W2krMV07ICsraykgeworICAgICAgICAgICAgICBzIDw8ICIoXyxfKSAiOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHMgPDwgIk91dGVyIHBvaW50ZXJzOlxuIjsKKyAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8bS5vdXRlclNpemUoKTsgKytpKSB7CisgICAgICAgICAgcyA8PCBtLm1fb3V0ZXJJbmRleFtpXSA8PCAiICI7CisgICAgICAgIH0KKyAgICAgICAgcyA8PCAiICQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgaWYoIW0uaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHsKKyAgICAgICAgICBzIDw8ICJJbm5lciBub24gemVyb3M6XG4iOworICAgICAgICAgIGZvciAoSW5kZXggaT0wOyBpPG0ub3V0ZXJTaXplKCk7ICsraSkgeworICAgICAgICAgICAgcyA8PCBtLm1faW5uZXJOb25aZXJvc1tpXSA8PCAiICI7CisgICAgICAgICAgfQorICAgICAgICAgIHMgPDwgIiAkIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgICApOworICAgICAgcyA8PCBzdGF0aWNfY2FzdDxjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZU1hdHJpeD4mPihtKTsKKyAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIC8qKiBEZXN0cnVjdG9yICovCisgICAgaW5saW5lIH5TcGFyc2VNYXRyaXgoKQorICAgIHsKKyAgICAgIHN0ZDo6ZnJlZShtX291dGVySW5kZXgpOworICAgICAgc3RkOjpmcmVlKG1faW5uZXJOb25aZXJvcyk7CisgICAgfQorCisgICAgLyoqIE92ZXJsb2FkZWQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgU2NhbGFyIHN1bSgpIGNvbnN0OworICAgIAorIyAgIGlmZGVmIEVJR0VOX1NQQVJTRU1BVFJJWF9QTFVHSU4KKyMgICAgIGluY2x1ZGUgRUlHRU5fU1BBUlNFTUFUUklYX1BMVUdJTgorIyAgIGVuZGlmCisKK3Byb3RlY3RlZDoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIHZvaWQgaW5pdEFzc2lnbm1lbnQoY29uc3QgT3RoZXImIG90aGVyKQorICAgIHsKKyAgICAgIHJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICBpZihtX2lubmVyTm9uWmVyb3MpCisgICAgICB7CisgICAgICAgIHN0ZDo6ZnJlZShtX2lubmVyTm9uWmVyb3MpOworICAgICAgICBtX2lubmVyTm9uWmVyb3MgPSAwOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogXHNhIGluc2VydChJbmRleCxJbmRleCkgKi8KKyAgICBFSUdFTl9ET05UX0lOTElORSBTY2FsYXImIGluc2VydENvbXByZXNzZWQoSW5kZXggcm93LCBJbmRleCBjb2wpOworCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBBIHZlY3RvciBvYmplY3QgdGhhdCBpcyBlcXVhbCB0byAwIGV2ZXJ5d2hlcmUgYnV0IHYgYXQgdGhlIHBvc2l0aW9uIGkgKi8KKyAgICBjbGFzcyBTaW5nbGV0b25WZWN0b3IKKyAgICB7CisgICAgICAgIFN0b3JhZ2VJbmRleCBtX2luZGV4OworICAgICAgICBTdG9yYWdlSW5kZXggbV92YWx1ZTsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBTdG9yYWdlSW5kZXggdmFsdWVfdHlwZTsKKyAgICAgICAgU2luZ2xldG9uVmVjdG9yKEluZGV4IGksIEluZGV4IHYpCisgICAgICAgICAgOiBtX2luZGV4KGNvbnZlcnRfaW5kZXgoaSkpLCBtX3ZhbHVlKGNvbnZlcnRfaW5kZXgodikpCisgICAgICAgIHt9CisKKyAgICAgICAgU3RvcmFnZUluZGV4IG9wZXJhdG9yW10oSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaT09bV9pbmRleCA/IG1fdmFsdWUgOiAwOyB9CisgICAgfTsKKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogXHNhIGluc2VydChJbmRleCxJbmRleCkgKi8KKyAgICBFSUdFTl9ET05UX0lOTElORSBTY2FsYXImIGluc2VydFVuY29tcHJlc3NlZChJbmRleCByb3csIEluZGV4IGNvbCk7CisKK3B1YmxpYzoKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxzYSBpbnNlcnQoSW5kZXgsSW5kZXgpICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGluc2VydEJhY2tVbmNvbXByZXNzZWQoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBlaWdlbl9hc3NlcnQoIWlzQ29tcHJlc3NlZCgpKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdPD0obV9vdXRlckluZGV4W291dGVyKzFdIC0gbV9vdXRlckluZGV4W291dGVyXSkpOworCisgICAgICBJbmRleCBwID0gbV9vdXRlckluZGV4W291dGVyXSArIG1faW5uZXJOb25aZXJvc1tvdXRlcl0rKzsKKyAgICAgIG1fZGF0YS5pbmRleChwKSA9IGNvbnZlcnRfaW5kZXgoaW5uZXIpOworICAgICAgcmV0dXJuIChtX2RhdGEudmFsdWUocCkgPSAwKTsKKyAgICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1UcmFpdHM8U3RvcmFnZUluZGV4Pjo6SXNTaWduZWQsVEhFX0lOREVYX1RZUEVfTVVTVF9CRV9BX1NJR05FRF9UWVBFKTsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChPcHRpb25zJihDb2xNYWpvcnxSb3dNYWpvcikpPT1PcHRpb25zLElOVkFMSURfTUFUUklYX1RFTVBMQVRFX1BBUkFNRVRFUlMpOworICB9CisKKyAgc3RydWN0IGRlZmF1bHRfcHJ1bm5pbmdfZnVuYyB7CisgICAgZGVmYXVsdF9wcnVubmluZ19mdW5jKGNvbnN0IFNjYWxhciYgcmVmLCBjb25zdCBSZWFsU2NhbGFyJiBlcHMpIDogcmVmZXJlbmNlKHJlZiksIGVwc2lsb24oZXBzKSB7fQorICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkgKGNvbnN0IEluZGV4JiwgY29uc3QgSW5kZXgmLCBjb25zdCBTY2FsYXImIHZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAhaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKHZhbHVlLCByZWZlcmVuY2UsIGVwc2lsb24pOworICAgIH0KKyAgICBTY2FsYXIgcmVmZXJlbmNlOworICAgIFJlYWxTY2FsYXIgZXBzaWxvbjsKKyAgfTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3IsIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsIHR5cGVuYW1lIER1cEZ1bmN0b3I+Cit2b2lkIHNldF9mcm9tX3RyaXBsZXRzKGNvbnN0IElucHV0SXRlcmF0b3ImIGJlZ2luLCBjb25zdCBJbnB1dEl0ZXJhdG9yJiBlbmQsIFNwYXJzZU1hdHJpeFR5cGUmIG1hdCwgRHVwRnVuY3RvciBkdXBfZnVuYykKK3sKKyAgZW51bSB7IElzUm93TWFqb3IgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICBTcGFyc2VNYXRyaXg8U2NhbGFyLElzUm93TWFqb3I/Q29sTWFqb3I6Um93TWFqb3IsU3RvcmFnZUluZGV4PiB0ck1hdChtYXQucm93cygpLG1hdC5jb2xzKCkpOworCisgIGlmKGJlZ2luIT1lbmQpCisgIHsKKyAgICAvLyBwYXNzIDE6IGNvdW50IHRoZSBubnogcGVyIGlubmVyLXZlY3RvcgorICAgIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OkluZGV4VmVjdG9yIHdpKHRyTWF0Lm91dGVyU2l6ZSgpKTsKKyAgICB3aS5zZXRaZXJvKCk7CisgICAgZm9yKElucHV0SXRlcmF0b3IgaXQoYmVnaW4pOyBpdCE9ZW5kOyArK2l0KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpdC0+cm93KCk+PTAgJiYgaXQtPnJvdygpPG1hdC5yb3dzKCkgJiYgaXQtPmNvbCgpPj0wICYmIGl0LT5jb2woKTxtYXQuY29scygpKTsKKyAgICAgIHdpKElzUm93TWFqb3IgPyBpdC0+Y29sKCkgOiBpdC0+cm93KCkpKys7CisgICAgfQorCisgICAgLy8gcGFzcyAyOiBpbnNlcnQgYWxsIHRoZSBlbGVtZW50cyBpbnRvIHRyTWF0CisgICAgdHJNYXQucmVzZXJ2ZSh3aSk7CisgICAgZm9yKElucHV0SXRlcmF0b3IgaXQoYmVnaW4pOyBpdCE9ZW5kOyArK2l0KQorICAgICAgdHJNYXQuaW5zZXJ0QmFja1VuY29tcHJlc3NlZChpdC0+cm93KCksaXQtPmNvbCgpKSA9IGl0LT52YWx1ZSgpOworCisgICAgLy8gcGFzcyAzOgorICAgIHRyTWF0LmNvbGxhcHNlRHVwbGljYXRlcyhkdXBfZnVuYyk7CisgIH0KKworICAvLyBwYXNzIDQ6IHRyYW5zcG9zZWQgY29weSAtPiBpbXBsaWNpdCBzb3J0aW5nCisgIG1hdCA9IHRyTWF0OworfQorCit9CisKKworLyoqIEZpbGwgdGhlIG1hdHJpeCBcYyAqdGhpcyB3aXRoIHRoZSBsaXN0IG9mIFxlbSB0cmlwbGV0cyBkZWZpbmVkIGJ5IHRoZSBpdGVyYXRvciByYW5nZSBcYSBiZWdpbiAtIFxhIGVuZC4KKyAgKgorICAqIEEgXGVtIHRyaXBsZXQgaXMgYSB0dXBsZSAoaSxqLHZhbHVlKSBkZWZpbmluZyBhIG5vbi16ZXJvIGVsZW1lbnQuCisgICogVGhlIGlucHV0IGxpc3Qgb2YgdHJpcGxldHMgZG9lcyBub3QgaGF2ZSB0byBiZSBzb3J0ZWQsIGFuZCBjYW4gY29udGFpbnMgZHVwbGljYXRlZCBlbGVtZW50cy4KKyAgKiBJbiBhbnkgY2FzZSwgdGhlIHJlc3VsdCBpcyBhIFxiIHNvcnRlZCBhbmQgXGIgY29tcHJlc3NlZCBzcGFyc2UgbWF0cml4IHdoZXJlIHRoZSBkdXBsaWNhdGVzIGhhdmUgYmVlbiBzdW1tZWQgdXAuCisgICogVGhpcyBpcyBhIFxlbSBPKG4pIG9wZXJhdGlvbiwgd2l0aCBcZW0gbiB0aGUgbnVtYmVyIG9mIHRyaXBsZXQgZWxlbWVudHMuCisgICogVGhlIGluaXRpYWwgY29udGVudHMgb2YgXGMgKnRoaXMgaXMgZGVzdHJveWVkLgorICAqIFRoZSBtYXRyaXggXGMgKnRoaXMgbXVzdCBiZSBwcm9wZXJseSByZXNpemVkIGJlZm9yZWhhbmQgdXNpbmcgdGhlIFNwYXJzZU1hdHJpeChJbmRleCxJbmRleCkgY29uc3RydWN0b3IsCisgICogb3IgdGhlIHJlc2l6ZShJbmRleCxJbmRleCkgbWV0aG9kLiBUaGUgc2l6ZXMgYXJlIG5vdCBleHRyYWN0ZWQgZnJvbSB0aGUgdHJpcGxldCBsaXN0LgorICAqCisgICogVGhlIFxhIElucHV0SXRlcmF0b3JzIHZhbHVlX3R5cGUgbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorICAqIFxjb2RlCisgICogU2NhbGFyIHZhbHVlKCkgY29uc3Q7IC8vIHRoZSB2YWx1ZQorICAqIFNjYWxhciByb3coKSBjb25zdDsgICAvLyB0aGUgcm93IGluZGV4IGkKKyAgKiBTY2FsYXIgY29sKCkgY29uc3Q7ICAgLy8gdGhlIGNvbHVtbiBpbmRleCBqCisgICogXGVuZGNvZGUKKyAgKiBTZWUgZm9yIGluc3RhbmNlIHRoZSBFaWdlbjo6VHJpcGxldCB0ZW1wbGF0ZSBjbGFzcy4KKyAgKgorICAqIEhlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CisgICogXGNvZGUKKyAgICB0eXBlZGVmIFRyaXBsZXQ8ZG91YmxlPiBUOworICAgIHN0ZDo6dmVjdG9yPFQ+IHRyaXBsZXRMaXN0OworICAgIHRyaXBsZXRzLnJlc2VydmUoZXN0aW1hdGlvbl9vZl9lbnRyaWVzKTsKKyAgICBmb3IoLi4uKQorICAgIHsKKyAgICAgIC8vIC4uLgorICAgICAgdHJpcGxldExpc3QucHVzaF9iYWNrKFQoaSxqLHZfaWopKTsKKyAgICB9CisgICAgU3BhcnNlTWF0cml4VHlwZSBtKHJvd3MsY29scyk7CisgICAgbS5zZXRGcm9tVHJpcGxldHModHJpcGxldExpc3QuYmVnaW4oKSwgdHJpcGxldExpc3QuZW5kKCkpOworICAgIC8vIG0gaXMgcmVhZHkgdG8gZ28hCisgICogXGVuZGNvZGUKKyAgKgorICAqIFx3YXJuaW5nIFRoZSBsaXN0IG9mIHRyaXBsZXRzIGlzIHJlYWQgbXVsdGlwbGUgdGltZXMgKGF0IGxlYXN0IHR3aWNlKS4gVGhlcmVmb3JlLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZGVmaW5lCisgICogYW4gYWJzdHJhY3QgaXRlcmF0b3Igb3ZlciBhIGNvbXBsZXggZGF0YS1zdHJ1Y3R1cmUgdGhhdCB3b3VsZCBiZSBleHBlbnNpdmUgdG8gZXZhbHVhdGUuIFRoZSB0cmlwbGV0cyBzaG91bGQgcmF0aGVyCisgICogYmUgZXhwbGljaXRlbHkgc3RvcmVkIGludG8gYSBzdGQ6OnZlY3RvciBmb3IgaW5zdGFuY2UuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3RlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3JzPgordm9pZCBTcGFyc2VNYXRyaXg8U2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+OjpzZXRGcm9tVHJpcGxldHMoY29uc3QgSW5wdXRJdGVyYXRvcnMmIGJlZ2luLCBjb25zdCBJbnB1dEl0ZXJhdG9ycyYgZW5kKQoreworICBpbnRlcm5hbDo6c2V0X2Zyb21fdHJpcGxldHM8SW5wdXRJdGVyYXRvcnMsIFNwYXJzZU1hdHJpeDxTY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gPihiZWdpbiwgZW5kLCAqdGhpcywgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLFNjYWxhcj4oKSk7Cit9CisKKy8qKiBUaGUgc2FtZSBhcyBzZXRGcm9tVHJpcGxldHMgYnV0IHdoZW4gZHVwbGljYXRlcyBhcmUgbWV0IHRoZSBmdW5jdG9yIFxhIGR1cF9mdW5jIGlzIGFwcGxpZWQ6CisgICogXGNvZGUKKyAgKiB2YWx1ZSA9IGR1cF9mdW5jKE9sZFZhbHVlLCBOZXdWYWx1ZSkKKyAgKiBcZW5kY29kZSAKKyAgKiBIZXJlIGlzIGEgQysrMTEgZXhhbXBsZSBrZWVwaW5nIHRoZSBsYXRlc3QgZW50cnkgb25seToKKyAgKiBcY29kZQorICAqIG1hdC5zZXRGcm9tVHJpcGxldHModHJpcGxldHMuYmVnaW4oKSwgdHJpcGxldHMuZW5kKCksIFtdIChjb25zdCBTY2FsYXImLGNvbnN0IFNjYWxhciAmYikgeyByZXR1cm4gYjsgfSk7CisgICogXGVuZGNvZGUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcnMsdHlwZW5hbWUgRHVwRnVuY3Rvcj4KK3ZvaWQgU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4Pjo6c2V0RnJvbVRyaXBsZXRzKGNvbnN0IElucHV0SXRlcmF0b3JzJiBiZWdpbiwgY29uc3QgSW5wdXRJdGVyYXRvcnMmIGVuZCwgRHVwRnVuY3RvciBkdXBfZnVuYykKK3sKKyAgaW50ZXJuYWw6OnNldF9mcm9tX3RyaXBsZXRzPElucHV0SXRlcmF0b3JzLCBTcGFyc2VNYXRyaXg8U2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+LCBEdXBGdW5jdG9yPihiZWdpbiwgZW5kLCAqdGhpcywgZHVwX2Z1bmMpOworfQorCisvKiogXGludGVybmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3RlbXBsYXRlPHR5cGVuYW1lIER1cEZ1bmN0b3I+Cit2b2lkIFNwYXJzZU1hdHJpeDxTY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46OmNvbGxhcHNlRHVwbGljYXRlcyhEdXBGdW5jdG9yIGR1cF9mdW5jKQoreworICBlaWdlbl9hc3NlcnQoIWlzQ29tcHJlc3NlZCgpKTsKKyAgLy8gVE9ETywgaW4gcHJhY3RpY2Ugd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIG1faW5uZXJOb25aZXJvcyBmb3IgdGhhdCB0YXNrCisgIEluZGV4VmVjdG9yIHdpKGlubmVyU2l6ZSgpKTsKKyAgd2kuZmlsbCgtMSk7CisgIFN0b3JhZ2VJbmRleCBjb3VudCA9IDA7CisgIC8vIGZvciBlYWNoIGlubmVyLXZlY3Rvciwgd2lbaW5uZXJfaW5kZXhdIHdpbGwgaG9sZCB0aGUgcG9zaXRpb24gb2YgZmlyc3QgZWxlbWVudCBpbnRvIHRoZSBpbmRleC92YWx1ZSBidWZmZXJzCisgIGZvcihJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgeworICAgIFN0b3JhZ2VJbmRleCBzdGFydCAgID0gY291bnQ7CisgICAgSW5kZXggb2xkRW5kICA9IG1fb3V0ZXJJbmRleFtqXSttX2lubmVyTm9uWmVyb3Nbal07CisgICAgZm9yKEluZGV4IGs9bV9vdXRlckluZGV4W2pdOyBrPG9sZEVuZDsgKytrKQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBtX2RhdGEuaW5kZXgoayk7CisgICAgICBpZih3aShpKT49c3RhcnQpCisgICAgICB7CisgICAgICAgIC8vIHdlIGFscmVhZHkgbWVldCB0aGlzIGVudHJ5ID0+IGFjY3VtdWxhdGUgaXQKKyAgICAgICAgbV9kYXRhLnZhbHVlKHdpKGkpKSA9IGR1cF9mdW5jKG1fZGF0YS52YWx1ZSh3aShpKSksIG1fZGF0YS52YWx1ZShrKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1fZGF0YS52YWx1ZShjb3VudCkgPSBtX2RhdGEudmFsdWUoayk7CisgICAgICAgIG1fZGF0YS5pbmRleChjb3VudCkgPSBtX2RhdGEuaW5kZXgoayk7CisgICAgICAgIHdpKGkpID0gY291bnQ7CisgICAgICAgICsrY291bnQ7CisgICAgICB9CisgICAgfQorICAgIG1fb3V0ZXJJbmRleFtqXSA9IHN0YXJ0OworICB9CisgIG1fb3V0ZXJJbmRleFttX291dGVyU2l6ZV0gPSBjb3VudDsKKworICAvLyB0dXJuIHRoZSBtYXRyaXggaW50byBjb21wcmVzc2VkIGZvcm0KKyAgc3RkOjpmcmVlKG1faW5uZXJOb25aZXJvcyk7CisgIG1faW5uZXJOb25aZXJvcyA9IDA7CisgIG1fZGF0YS5yZXNpemUobV9vdXRlckluZGV4W21fb3V0ZXJTaXplXSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fRE9OVF9JTkxJTkUgU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4PiYgU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4Pjo6b3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSksCisgICAgICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorCisgICNpZmRlZiBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgICBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4KKyAgI2VuZGlmCisgICAgICAKKyAgY29uc3QgYm9vbCBuZWVkVG9UcmFuc3Bvc2UgPSAoRmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKGludGVybmFsOjpldmFsdWF0b3I8T3RoZXJEZXJpdmVkPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCk7CisgIGlmIChuZWVkVG9UcmFuc3Bvc2UpCisgIHsKKyAgICAjaWZkZWYgRUlHRU5fU1BBUlNFX1RSQU5TUE9TRURfQ09QWV9QTFVHSU4KKyAgICAgIEVJR0VOX1NQQVJTRV9UUkFOU1BPU0VEX0NPUFlfUExVR0lOCisgICAgI2VuZGlmCisgICAgLy8gdHdvIHBhc3NlcyBhbGdvcml0aG06CisgICAgLy8gIDEgLSBjb21wdXRlIHRoZSBudW1iZXIgb2YgY29lZmZzIHBlciBkZXN0IGlubmVyIHZlY3RvcgorICAgIC8vICAyIC0gZG8gdGhlIGFjdHVhbCBjb3B5L2V2YWwKKyAgICAvLyBTaW5jZSBlYWNoIGNvZWZmIG9mIHRoZSByaHMgaGFzIHRvIGJlIGV2YWx1YXRlZCB0d2ljZSwgbGV0J3MgZXZhbHVhdGUgaXQgaWYgbmVlZGVkCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8T3RoZXJEZXJpdmVkLDIsdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPE90aGVyRGVyaXZlZD46OnR5cGUgPjo6dHlwZSBPdGhlckNvcHk7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxPdGhlckNvcHk+Ojp0eXBlIF9PdGhlckNvcHk7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6ZXZhbHVhdG9yPF9PdGhlckNvcHk+IE90aGVyQ29weUV2YWw7CisgICAgT3RoZXJDb3B5IG90aGVyQ29weShvdGhlci5kZXJpdmVkKCkpOworICAgIE90aGVyQ29weUV2YWwgb3RoZXJDb3B5RXZhbChvdGhlckNvcHkpOworCisgICAgU3BhcnNlTWF0cml4IGRlc3Qob3RoZXIucm93cygpLG90aGVyLmNvbHMoKSk7CisgICAgRWlnZW46Ok1hcDxJbmRleFZlY3Rvcj4gKGRlc3QubV9vdXRlckluZGV4LGRlc3Qub3V0ZXJTaXplKCkpLnNldFplcm8oKTsKKworICAgIC8vIHBhc3MgMQorICAgIC8vIEZJWE1FIHRoZSBhYm92ZSBjb3B5IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHRoYXQgcGFzcworICAgIGZvciAoSW5kZXggaj0wOyBqPG90aGVyQ29weS5vdXRlclNpemUoKTsgKytqKQorICAgICAgZm9yICh0eXBlbmFtZSBPdGhlckNvcHlFdmFsOjpJbm5lckl0ZXJhdG9yIGl0KG90aGVyQ29weUV2YWwsIGopOyBpdDsgKytpdCkKKyAgICAgICAgKytkZXN0Lm1fb3V0ZXJJbmRleFtpdC5pbmRleCgpXTsKKworICAgIC8vIHByZWZpeCBzdW0KKyAgICBTdG9yYWdlSW5kZXggY291bnQgPSAwOworICAgIEluZGV4VmVjdG9yIHBvc2l0aW9ucyhkZXN0Lm91dGVyU2l6ZSgpKTsKKyAgICBmb3IgKEluZGV4IGo9MDsgajxkZXN0Lm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgU3RvcmFnZUluZGV4IHRtcCA9IGRlc3QubV9vdXRlckluZGV4W2pdOworICAgICAgZGVzdC5tX291dGVySW5kZXhbal0gPSBjb3VudDsKKyAgICAgIHBvc2l0aW9uc1tqXSA9IGNvdW50OworICAgICAgY291bnQgKz0gdG1wOworICAgIH0KKyAgICBkZXN0Lm1fb3V0ZXJJbmRleFtkZXN0Lm91dGVyU2l6ZSgpXSA9IGNvdW50OworICAgIC8vIGFsbG9jCisgICAgZGVzdC5tX2RhdGEucmVzaXplKGNvdW50KTsKKyAgICAvLyBwYXNzIDIKKyAgICBmb3IgKFN0b3JhZ2VJbmRleCBqPTA7IGo8b3RoZXJDb3B5Lm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgZm9yICh0eXBlbmFtZSBPdGhlckNvcHlFdmFsOjpJbm5lckl0ZXJhdG9yIGl0KG90aGVyQ29weUV2YWwsIGopOyBpdDsgKytpdCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcG9zID0gcG9zaXRpb25zW2l0LmluZGV4KCldKys7CisgICAgICAgIGRlc3QubV9kYXRhLmluZGV4KHBvcykgPSBqOworICAgICAgICBkZXN0Lm1fZGF0YS52YWx1ZShwb3MpID0gaXQudmFsdWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcy0+c3dhcChkZXN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYob3RoZXIuaXNSVmFsdWUoKSkKKyAgICB7CisgICAgICBpbml0QXNzaWdubWVudChvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKyAgICAvLyB0aGVyZSBpcyBubyBzcGVjaWFsIG9wdGltaXphdGlvbgorICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+Cit0eXBlbmFtZSBTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4Pjo6U2NhbGFyJiBTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4Pjo6aW5zZXJ0KEluZGV4IHJvdywgSW5kZXggY29sKQoreworICBlaWdlbl9hc3NlcnQocm93Pj0wICYmIHJvdzxyb3dzKCkgJiYgY29sPj0wICYmIGNvbDxjb2xzKCkpOworICAKKyAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisgIAorICBpZihpc0NvbXByZXNzZWQoKSkKKyAgeworICAgIGlmKG5vblplcm9zKCk9PTApCisgICAgeworICAgICAgLy8gcmVzZXJ2ZSBzcGFjZSBpZiBub3QgYWxyZWFkeSBkb25lCisgICAgICBpZihtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpPT0wKQorICAgICAgICBtX2RhdGEucmVzZXJ2ZSgyKm1faW5uZXJTaXplKTsKKyAgICAgIAorICAgICAgLy8gdHVybiB0aGUgbWF0cml4IGludG8gbm9uLWNvbXByZXNzZWQgbW9kZQorICAgICAgbV9pbm5lck5vblplcm9zID0gc3RhdGljX2Nhc3Q8U3RvcmFnZUluZGV4Kj4oc3RkOjptYWxsb2MobV9vdXRlclNpemUgKiBzaXplb2YoU3RvcmFnZUluZGV4KSkpOworICAgICAgaWYoIW1faW5uZXJOb25aZXJvcykgaW50ZXJuYWw6OnRocm93X3N0ZF9iYWRfYWxsb2MoKTsKKyAgICAgIAorICAgICAgbWVtc2V0KG1faW5uZXJOb25aZXJvcywgMCwgKG1fb3V0ZXJTaXplKSpzaXplb2YoU3RvcmFnZUluZGV4KSk7CisgICAgICAKKyAgICAgIC8vIHBhY2sgYWxsIGlubmVyLXZlY3RvcnMgdG8gdGhlIGVuZCBvZiB0aGUgcHJlLWFsbG9jYXRlZCBzcGFjZQorICAgICAgLy8gYW5kIGFsbG9jYXRlIHRoZSBlbnRpcmUgZnJlZS1zcGFjZSB0byB0aGUgZmlyc3QgaW5uZXItdmVjdG9yCisgICAgICBTdG9yYWdlSW5kZXggZW5kID0gY29udmVydF9pbmRleChtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpKTsKKyAgICAgIGZvcihJbmRleCBqPTE7IGo8PW1fb3V0ZXJTaXplOyArK2opCisgICAgICAgIG1fb3V0ZXJJbmRleFtqXSA9IGVuZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIHR1cm4gdGhlIG1hdHJpeCBpbnRvIG5vbi1jb21wcmVzc2VkIG1vZGUKKyAgICAgIG1faW5uZXJOb25aZXJvcyA9IHN0YXRpY19jYXN0PFN0b3JhZ2VJbmRleCo+KHN0ZDo6bWFsbG9jKG1fb3V0ZXJTaXplICogc2l6ZW9mKFN0b3JhZ2VJbmRleCkpKTsKKyAgICAgIGlmKCFtX2lubmVyTm9uWmVyb3MpIGludGVybmFsOjp0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG1fb3V0ZXJTaXplOyArK2opCisgICAgICAgIG1faW5uZXJOb25aZXJvc1tqXSA9IG1fb3V0ZXJJbmRleFtqKzFdLW1fb3V0ZXJJbmRleFtqXTsKKyAgICB9CisgIH0KKyAgCisgIC8vIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGRvIGEgZmFzdCAicHVzaCBiYWNrIiBpbnNlcnRpb24KKyAgSW5kZXggZGF0YV9lbmQgPSBtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpOworICAKKyAgLy8gRmlyc3QgY2FzZTogd2UgYXJlIGZpbGxpbmcgYSBuZXcgaW5uZXIgdmVjdG9yIHdoaWNoIGlzIHBhY2tlZCBhdCB0aGUgZW5kLgorICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgcmVtYWluaW5nIGlubmVyLXZlY3RvcnMgYXJlIGFsc28gZW1wdHkgYW5kIHBhY2tlZCB0byB0aGUgZW5kLgorICBpZihtX291dGVySW5kZXhbb3V0ZXJdPT1kYXRhX2VuZCkKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdPT0wKTsKKyAgICAKKyAgICAvLyBwYWNrIHByZXZpb3VzIGVtcHR5IGlubmVyLXZlY3RvcnMgdG8gZW5kIG9mIHRoZSB1c2VkLXNwYWNlCisgICAgLy8gYW5kIGFsbG9jYXRlIHRoZSBlbnRpcmUgZnJlZS1zcGFjZSB0byB0aGUgY3VycmVudCBpbm5lci12ZWN0b3IuCisgICAgU3RvcmFnZUluZGV4IHAgPSBjb252ZXJ0X2luZGV4KG1fZGF0YS5zaXplKCkpOworICAgIEluZGV4IGogPSBvdXRlcjsKKyAgICB3aGlsZShqPj0wICYmIG1faW5uZXJOb25aZXJvc1tqXT09MCkKKyAgICAgIG1fb3V0ZXJJbmRleFtqLS1dID0gcDsKKyAgICAKKyAgICAvLyBwdXNoIGJhY2sgdGhlIG5ldyBlbGVtZW50CisgICAgKyttX2lubmVyTm9uWmVyb3Nbb3V0ZXJdOworICAgIG1fZGF0YS5hcHBlbmQoU2NhbGFyKDApLCBpbm5lcik7CisgICAgCisgICAgLy8gY2hlY2sgZm9yIHJlYWxsb2NhdGlvbgorICAgIGlmKGRhdGFfZW5kICE9IG1fZGF0YS5hbGxvY2F0ZWRTaXplKCkpCisgICAgeworICAgICAgLy8gbV9kYXRhIGhhcyBiZWVuIHJlYWxsb2NhdGVkCisgICAgICAvLyAgLT4gbW92ZSByZW1haW5pbmcgaW5uZXItdmVjdG9ycyBiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGZyZWUtc3BhY2UKKyAgICAgIC8vICAgICBzbyB0aGF0IHRoZSBlbnRpcmUgZnJlZS1zcGFjZSBpcyBhbGxvY2F0ZWQgdG8gdGhlIGN1cnJlbnQgaW5uZXItdmVjdG9yLgorICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGRhdGFfZW5kIDwgbV9kYXRhLmFsbG9jYXRlZFNpemUoKSk7CisgICAgICBTdG9yYWdlSW5kZXggbmV3X2VuZCA9IGNvbnZlcnRfaW5kZXgobV9kYXRhLmFsbG9jYXRlZFNpemUoKSk7CisgICAgICBmb3IoSW5kZXggaz1vdXRlcisxOyBrPD1tX291dGVyU2l6ZTsgKytrKQorICAgICAgICBpZihtX291dGVySW5kZXhba109PWRhdGFfZW5kKQorICAgICAgICAgIG1fb3V0ZXJJbmRleFtrXSA9IG5ld19lbmQ7CisgICAgfQorICAgIHJldHVybiBtX2RhdGEudmFsdWUocCk7CisgIH0KKyAgCisgIC8vIFNlY29uZCBjYXNlOiB0aGUgbmV4dCBpbm5lci12ZWN0b3IgaXMgcGFja2VkIHRvIHRoZSBlbmQKKyAgLy8gYW5kIHRoZSBjdXJyZW50IGlubmVyLXZlY3RvciBlbmQgbWF0Y2ggdGhlIHVzZWQtc3BhY2UuCisgIGlmKG1fb3V0ZXJJbmRleFtvdXRlcisxXT09ZGF0YV9lbmQgJiYgbV9vdXRlckluZGV4W291dGVyXSttX2lubmVyTm9uWmVyb3Nbb3V0ZXJdPT1tX2RhdGEuc2l6ZSgpKQorICB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG91dGVyKzE9PW1fb3V0ZXJTaXplIHx8IG1faW5uZXJOb25aZXJvc1tvdXRlcisxXT09MCk7CisgICAgCisgICAgLy8gYWRkIHNwYWNlIGZvciB0aGUgbmV3IGVsZW1lbnQKKyAgICArK21faW5uZXJOb25aZXJvc1tvdXRlcl07CisgICAgbV9kYXRhLnJlc2l6ZShtX2RhdGEuc2l6ZSgpKzEpOworICAgIAorICAgIC8vIGNoZWNrIGZvciByZWFsbG9jYXRpb24KKyAgICBpZihkYXRhX2VuZCAhPSBtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpKQorICAgIHsKKyAgICAgIC8vIG1fZGF0YSBoYXMgYmVlbiByZWFsbG9jYXRlZAorICAgICAgLy8gIC0+IG1vdmUgcmVtYWluaW5nIGlubmVyLXZlY3RvcnMgYmFjayB0byB0aGUgZW5kIG9mIHRoZSBmcmVlLXNwYWNlCisgICAgICAvLyAgICAgc28gdGhhdCB0aGUgZW50aXJlIGZyZWUtc3BhY2UgaXMgYWxsb2NhdGVkIHRvIHRoZSBjdXJyZW50IGlubmVyLXZlY3Rvci4KKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChkYXRhX2VuZCA8IG1fZGF0YS5hbGxvY2F0ZWRTaXplKCkpOworICAgICAgU3RvcmFnZUluZGV4IG5ld19lbmQgPSBjb252ZXJ0X2luZGV4KG1fZGF0YS5hbGxvY2F0ZWRTaXplKCkpOworICAgICAgZm9yKEluZGV4IGs9b3V0ZXIrMTsgazw9bV9vdXRlclNpemU7ICsraykKKyAgICAgICAgaWYobV9vdXRlckluZGV4W2tdPT1kYXRhX2VuZCkKKyAgICAgICAgICBtX291dGVySW5kZXhba10gPSBuZXdfZW5kOworICAgIH0KKyAgICAKKyAgICAvLyBhbmQgaW5zZXJ0IGl0IGF0IHRoZSByaWdodCBwb3NpdGlvbiAoc29ydGVkIGluc2VydGlvbikKKyAgICBJbmRleCBzdGFydElkID0gbV9vdXRlckluZGV4W291dGVyXTsKKyAgICBJbmRleCBwID0gbV9vdXRlckluZGV4W291dGVyXSttX2lubmVyTm9uWmVyb3Nbb3V0ZXJdLTE7CisgICAgd2hpbGUgKCAocCA+IHN0YXJ0SWQpICYmIChtX2RhdGEuaW5kZXgocC0xKSA+IGlubmVyKSApCisgICAgeworICAgICAgbV9kYXRhLmluZGV4KHApID0gbV9kYXRhLmluZGV4KHAtMSk7CisgICAgICBtX2RhdGEudmFsdWUocCkgPSBtX2RhdGEudmFsdWUocC0xKTsKKyAgICAgIC0tcDsKKyAgICB9CisgICAgCisgICAgbV9kYXRhLmluZGV4KHApID0gY29udmVydF9pbmRleChpbm5lcik7CisgICAgcmV0dXJuIChtX2RhdGEudmFsdWUocCkgPSAwKTsKKyAgfQorICAKKyAgaWYobV9kYXRhLnNpemUoKSAhPSBtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpKQorICB7CisgICAgLy8gbWFrZSBzdXJlIHRoZSBtYXRyaXggaXMgY29tcGF0aWJsZSB0byByYW5kb20gdW4tY29tcHJlc3NlZCBpbnNlcnRpb246CisgICAgbV9kYXRhLnJlc2l6ZShtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpKTsKKyAgICB0aGlzLT5yZXNlcnZlSW5uZXJWZWN0b3JzKEFycmF5PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+OjpDb25zdGFudChtX291dGVyU2l6ZSwgMikpOworICB9CisgIAorICByZXR1cm4gaW5zZXJ0VW5jb21wcmVzc2VkKHJvdyxjb2wpOworfQorICAgIAordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46OlNjYWxhciYgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46Omluc2VydFVuY29tcHJlc3NlZChJbmRleCByb3csIEluZGV4IGNvbCkKK3sKKyAgZWlnZW5fYXNzZXJ0KCFpc0NvbXByZXNzZWQoKSk7CisKKyAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICBjb25zdCBTdG9yYWdlSW5kZXggaW5uZXIgPSBjb252ZXJ0X2luZGV4KElzUm93TWFqb3IgPyBjb2wgOiByb3cpOworCisgIEluZGV4IHJvb20gPSBtX291dGVySW5kZXhbb3V0ZXIrMV0gLSBtX291dGVySW5kZXhbb3V0ZXJdOworICBTdG9yYWdlSW5kZXggaW5uZXJOTlogPSBtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdOworICBpZihpbm5lck5OWj49cm9vbSkKKyAgeworICAgIC8vIHRoaXMgaW5uZXIgdmVjdG9yIGlzIGZ1bGwsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgd2hvbGUgYnVmZmVyIDooCisgICAgcmVzZXJ2ZShTaW5nbGV0b25WZWN0b3Iob3V0ZXIsc3RkOjptYXg8U3RvcmFnZUluZGV4PigyLGlubmVyTk5aKSkpOworICB9CisKKyAgSW5kZXggc3RhcnRJZCA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgIEluZGV4IHAgPSBzdGFydElkICsgbV9pbm5lck5vblplcm9zW291dGVyXTsKKyAgd2hpbGUgKCAocCA+IHN0YXJ0SWQpICYmIChtX2RhdGEuaW5kZXgocC0xKSA+IGlubmVyKSApCisgIHsKKyAgICBtX2RhdGEuaW5kZXgocCkgPSBtX2RhdGEuaW5kZXgocC0xKTsKKyAgICBtX2RhdGEudmFsdWUocCkgPSBtX2RhdGEudmFsdWUocC0xKTsKKyAgICAtLXA7CisgIH0KKyAgZWlnZW5fYXNzZXJ0KChwPD1zdGFydElkIHx8IG1fZGF0YS5pbmRleChwLTEpIT1pbm5lcikgJiYgInlvdSBjYW5ub3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBhbHJlYWR5IGV4aXN0cywgeW91IG11c3QgY2FsbCBjb2VmZlJlZiB0byB0aGlzIGVuZCIpOworCisgIG1faW5uZXJOb25aZXJvc1tvdXRlcl0rKzsKKworICBtX2RhdGEuaW5kZXgocCkgPSBpbm5lcjsKKyAgcmV0dXJuIChtX2RhdGEudmFsdWUocCkgPSAwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46OlNjYWxhciYgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46Omluc2VydENvbXByZXNzZWQoSW5kZXggcm93LCBJbmRleCBjb2wpCit7CisgIGVpZ2VuX2Fzc2VydChpc0NvbXByZXNzZWQoKSk7CisKKyAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgSW5kZXggcHJldmlvdXNPdXRlciA9IG91dGVyOworICBpZiAobV9vdXRlckluZGV4W291dGVyKzFdPT0wKQorICB7CisgICAgLy8gd2Ugc3RhcnQgYSBuZXcgaW5uZXIgdmVjdG9yCisgICAgd2hpbGUgKHByZXZpb3VzT3V0ZXI+PTAgJiYgbV9vdXRlckluZGV4W3ByZXZpb3VzT3V0ZXJdPT0wKQorICAgIHsKKyAgICAgIG1fb3V0ZXJJbmRleFtwcmV2aW91c091dGVyXSA9IGNvbnZlcnRfaW5kZXgobV9kYXRhLnNpemUoKSk7CisgICAgICAtLXByZXZpb3VzT3V0ZXI7CisgICAgfQorICAgIG1fb3V0ZXJJbmRleFtvdXRlcisxXSA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgIH0KKworICAvLyBoZXJlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSB0cmlja3kgY2FzZSB3aGVyZSB0aGUgb3V0ZXJJbmRleCBhcnJheQorICAvLyBzdGFydHMgd2l0aDogWyAwIDAgMCAwIDAgMSAuLi5dIGFuZCB3ZSBhcmUgaW5zZXJ0ZWQgaW4sIGUuZy4sCisgIC8vIHRoZSAybmQgaW5uZXIgdmVjdG9yLi4uCisgIGJvb2wgaXNMYXN0VmVjID0gKCEocHJldmlvdXNPdXRlcj09LTEgJiYgbV9kYXRhLnNpemUoKSE9MCkpCisgICAgICAgICAgICAgICAgJiYgKHN0ZDo6c2l6ZV90KG1fb3V0ZXJJbmRleFtvdXRlcisxXSkgPT0gbV9kYXRhLnNpemUoKSk7CisKKyAgc3RkOjpzaXplX3Qgc3RhcnRJZCA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgIC8vIEZJWE1FIGxldCdzIG1ha2Ugc3VyZSBzaXplb2YobG9uZyBpbnQpID09IHNpemVvZihzdGQ6OnNpemVfdCkKKyAgc3RkOjpzaXplX3QgcCA9IG1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgKyttX291dGVySW5kZXhbb3V0ZXIrMV07CisKKyAgZG91YmxlIHJlYWxsb2NSYXRpbyA9IDE7CisgIGlmIChtX2RhdGEuYWxsb2NhdGVkU2l6ZSgpPD1tX2RhdGEuc2l6ZSgpKQorICB7CisgICAgLy8gaWYgdGhlcmUgaXMgbm8gcHJlYWxsb2NhdGVkIG1lbW9yeSwgbGV0J3MgcmVzZXJ2ZSBhIG1pbmltdW0gb2YgMzIgZWxlbWVudHMKKyAgICBpZiAobV9kYXRhLnNpemUoKT09MCkKKyAgICB7CisgICAgICBtX2RhdGEucmVzZXJ2ZSgzMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIGRhdGEsIHRvIHJlZHVjZSBtdWx0aXBsZSByZWFsbG9jYXRpb25zCisgICAgICAvLyB3ZSB1c2UgYSBzbWFydCByZXNpemUgYWxnb3JpdGhtIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpbGxpbmcgcmF0aW8KKyAgICAgIC8vIGluIGFkZGl0aW9uLCB3ZSB1c2UgZG91YmxlIHRvIGF2b2lkIGludGVnZXJzIG92ZXJmbG93cworICAgICAgZG91YmxlIG5uekVzdGltYXRlID0gZG91YmxlKG1fb3V0ZXJJbmRleFtvdXRlcl0pKmRvdWJsZShtX291dGVyU2l6ZSkvZG91YmxlKG91dGVyKzEpOworICAgICAgcmVhbGxvY1JhdGlvID0gKG5uekVzdGltYXRlLWRvdWJsZShtX2RhdGEuc2l6ZSgpKSkvZG91YmxlKG1fZGF0YS5zaXplKCkpOworICAgICAgLy8gZnVydGhlcm1vcmUgd2UgYm91bmQgdGhlIHJlYWxsb2MgcmF0aW8gdG86CisgICAgICAvLyAgIDEpIHJlZHVjZSBtdWx0aXBsZSBtaW5vciByZWFsbG9jIHdoZW4gdGhlIG1hdHJpeCBpcyBhbG1vc3QgZmlsbGVkCisgICAgICAvLyAgIDIpIGF2b2lkIHRvIGFsbG9jYXRlIHRvbyBtdWNoIG1lbW9yeSB3aGVuIHRoZSBtYXRyaXggaXMgYWxtb3N0IGVtcHR5CisgICAgICByZWFsbG9jUmF0aW8gPSAoc3RkOjptaW4pKChzdGQ6Om1heCkocmVhbGxvY1JhdGlvLDEuNSksOC4pOworICAgIH0KKyAgfQorICBtX2RhdGEucmVzaXplKG1fZGF0YS5zaXplKCkrMSxyZWFsbG9jUmF0aW8pOworCisgIGlmICghaXNMYXN0VmVjKQorICB7CisgICAgaWYgKHByZXZpb3VzT3V0ZXI9PS0xKQorICAgIHsKKyAgICAgIC8vIG9vcHMgd3JvbmcgZ3Vlc3MuCisgICAgICAvLyBsZXQncyBjb3JyZWN0IHRoZSBvdXRlciBvZmZzZXRzCisgICAgICBmb3IgKEluZGV4IGs9MDsgazw9KG91dGVyKzEpOyArK2spCisgICAgICAgIG1fb3V0ZXJJbmRleFtrXSA9IDA7CisgICAgICBJbmRleCBrPW91dGVyKzE7CisgICAgICB3aGlsZShtX291dGVySW5kZXhba109PTApCisgICAgICAgIG1fb3V0ZXJJbmRleFtrKytdID0gMTsKKyAgICAgIHdoaWxlIChrPD1tX291dGVyU2l6ZSAmJiBtX291dGVySW5kZXhba10hPTApCisgICAgICAgIG1fb3V0ZXJJbmRleFtrKytdKys7CisgICAgICBwID0gMDsKKyAgICAgIC0tazsKKyAgICAgIGsgPSBtX291dGVySW5kZXhba10tMTsKKyAgICAgIHdoaWxlIChrPjApCisgICAgICB7CisgICAgICAgIG1fZGF0YS5pbmRleChrKSA9IG1fZGF0YS5pbmRleChrLTEpOworICAgICAgICBtX2RhdGEudmFsdWUoaykgPSBtX2RhdGEudmFsdWUoay0xKTsKKyAgICAgICAgay0tOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gd2UgYXJlIG5vdCBpbnNlcnRpbmcgaW50byB0aGUgbGFzdCBpbm5lciB2ZWMKKyAgICAgIC8vIHVwZGF0ZSBvdXRlciBpbmRpY2VzOgorICAgICAgSW5kZXggaiA9IG91dGVyKzI7CisgICAgICB3aGlsZSAoajw9bV9vdXRlclNpemUgJiYgbV9vdXRlckluZGV4W2pdIT0wKQorICAgICAgICBtX291dGVySW5kZXhbaisrXSsrOworICAgICAgLS1qOworICAgICAgLy8gc2hpZnQgZGF0YSBvZiBsYXN0IHZlY3M6CisgICAgICBJbmRleCBrID0gbV9vdXRlckluZGV4W2pdLTE7CisgICAgICB3aGlsZSAoaz49SW5kZXgocCkpCisgICAgICB7CisgICAgICAgIG1fZGF0YS5pbmRleChrKSA9IG1fZGF0YS5pbmRleChrLTEpOworICAgICAgICBtX2RhdGEudmFsdWUoaykgPSBtX2RhdGEudmFsdWUoay0xKTsKKyAgICAgICAgay0tOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHdoaWxlICggKHAgPiBzdGFydElkKSAmJiAobV9kYXRhLmluZGV4KHAtMSkgPiBpbm5lcikgKQorICB7CisgICAgbV9kYXRhLmluZGV4KHApID0gbV9kYXRhLmluZGV4KHAtMSk7CisgICAgbV9kYXRhLnZhbHVlKHApID0gbV9kYXRhLnZhbHVlKHAtMSk7CisgICAgLS1wOworICB9CisKKyAgbV9kYXRhLmluZGV4KHApID0gaW5uZXI7CisgIHJldHVybiAobV9kYXRhLnZhbHVlKHApID0gMCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK3N0cnVjdCBldmFsdWF0b3I8U3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gPgorICA6IGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4PiA+ID4KK3sKKyAgdHlwZWRlZiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8U3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gPiA+IEJhc2U7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gU3BhcnNlTWF0cml4VHlwZTsKKyAgZXZhbHVhdG9yKCkgOiBCYXNlKCkge30KKyAgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUgJm1hdCkgOiBCYXNlKG1hdCkge30KK307CisKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VNQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4QmFzZS5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjU0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXRyaXhCYXNlLmgKQEAgLTAsMCArMSw0MDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VNQVRSSVhCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGNsYXNzIFNwYXJzZU1hdHJpeEJhc2UKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIG9mIGFueSBzcGFyc2UgbWF0cmljZXMgb3Igc3BhcnNlIGV4cHJlc3Npb25zCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgaXMgdGhlIGRlcml2ZWQgdHlwZSwgZS5nLiBhIHNwYXJzZSBtYXRyaXggdHlwZSwgb3IgYW4gZXhwcmVzc2lvbiwgZXRjLgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgcGx1Z2luIG1lY2hhbmlzbSBkZXNjcmliZWQgb24gdGhlIHBhZ2UKKyAgKiBccmVmIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucyBieSBkZWZpbmluZyB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBcYyBFSUdFTl9TUEFSU0VNQVRSSVhCQVNFX1BMVUdJTi4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZU1hdHJpeEJhc2UKKyAgOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICAKKyAgICAvKiogVGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbicgY29lZmZpY2llbnRzLCBlLmcuIGZsb2F0LCBkb3VibGUsIGludCBvciBzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBldGMuCisgICAgICAqCisgICAgICAqIEl0IGlzIGFuIGFsaWFzIGZvciB0aGUgU2NhbGFyIHR5cGUgKi8KKyAgICB0eXBlZGVmIFNjYWxhciB2YWx1ZV90eXBlOworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKworICAgIC8qKiBUaGUgaW50ZWdlciB0eXBlIHVzZWQgdG8gXGIgc3RvcmUgaW5kaWNlcyB3aXRoaW4gYSBTcGFyc2VNYXRyaXguCisgICAgICAqIEZvciBhIFxjIFNwYXJzZU1hdHJpeDxTY2FsYXIsT3B0aW9ucyxJbmRleFR5cGU+IGl0IGFuIGFsaWFzIG9mIHRoZSB0aGlyZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGMgSW5kZXhUeXBlLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX2lmX2FyaXRobWV0aWM8CisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworCisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXhCYXNlIFN0b3JhZ2VCYXNlVHlwZTsKKworICAgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IEluZGV4VmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFNjYWxhclZlY3RvcjsKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgICBlbnVtIHsKKworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJvd3MgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBDb2xzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBSb3dzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT46OnJldCksCisgICAgICAgIC8qKjwgVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgaS5lLiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiByb3dzIHRpbWVzIHRoZSBudW1iZXIgb2YgY29sdW1ucywgb3IgdG8gXGEgRHluYW1pYyBpZiB0aGlzIGlzIG5vdAorICAgICAgICAgICoga25vd24gYXQgY29tcGlsZS10aW1lLiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lICovCisKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorCisgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZT46OnJldCksCisKKyAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gMSwKKyAgICAgICAgLyoqPCBUaGlzIGlzIHNldCB0byB0cnVlIGlmIGVpdGhlciB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgdGhlIG51bWJlciBvZgorICAgICAgICAgICogY29sdW1ucyBpcyBrbm93biBhdCBjb21waWxlLXRpbWUgdG8gYmUgZXF1YWwgdG8gMS4gSW5kZWVkLCBpbiB0aGF0IGNhc2UsCisgICAgICAgICAgKiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sdW1uLXZlY3RvciAoaWYgdGhlcmUgaXMgb25seSBvbmUgY29sdW1uKSBvciB3aXRoCisgICAgICAgICAgKiBhIHJvdy12ZWN0b3IgKGlmIHRoZXJlIGlzIG9ubHkgb25lIHJvdykuICovCisKKyAgICAgIEZsYWdzID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsCisgICAgICAgIC8qKjwgVGhpcyBzdG9yZXMgZXhwcmVzc2lvbiBccmVmIGZsYWdzIGZsYWdzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGluaGVyaXRlZCBieSBuZXcgZXhwcmVzc2lvbnMKKyAgICAgICAgICAqIGNvbnN0cnVjdGVkIGZyb20gdGhpcyBvbmUuIFNlZSB0aGUgXHJlZiBmbGFncyAibGlzdCBvZiBmbGFncyIuCisgICAgICAgICAgKi8KKworICAgICAgSXNSb3dNYWpvciA9IEZsYWdzJlJvd01ham9yQml0ID8gMSA6IDAsCisgICAgICAKKyAgICAgIElubmVyU2l6ZUF0Q29tcGlsZVRpbWUgPSBpbnQoSXNWZWN0b3JBdENvbXBpbGVUaW1lKSA/IGludChTaXplQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoSXNSb3dNYWpvcikgPyBpbnQoQ29sc0F0Q29tcGlsZVRpbWUpIDogaW50KFJvd3NBdENvbXBpbGVUaW1lKSwKKworICAgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgICAgX0hhc0RpcmVjdEFjY2VzcyA9IChpbnQoRmxhZ3MpJkRpcmVjdEFjY2Vzc0JpdCkgPyAxIDogMCAvLyB3b3JrYXJvdW5kIHN1bkNDCisgICAgICAjZW5kaWYKKyAgICB9OworCisgICAgLyoqIFxpbnRlcm5hbCB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6YWRqb2ludCgpICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LCBFaWdlbjo6VHJhbnNwb3NlPGNvbnN0IERlcml2ZWQ+ID4sCisgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3Bvc2U8Y29uc3QgRGVyaXZlZD4KKyAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgQWRqb2ludFJldHVyblR5cGU7CisgICAgdHlwZWRlZiBUcmFuc3Bvc2U8RGVyaXZlZD4gVHJhbnNwb3NlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Q8VHJhbnNwb3NlPGNvbnN0IERlcml2ZWQ+ID46OnR5cGUgQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlOworCisgICAgLy8gRklYTUUgc3RvcmFnZSBvcmRlciBkbyBub3QgbWF0Y2ggZXZhbHVhdG9yIHN0b3JhZ2Ugb3JkZXIKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIEZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwgU3RvcmFnZUluZGV4PiBQbGFpbk9iamVjdDsKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIHRoZSAicmVhbCBzY2FsYXIiIHR5cGU7IGlmIHRoZSBcYSBTY2FsYXIgdHlwZSBpcyBhbHJlYWR5IHJlYWwgbnVtYmVycworICAgICAgKiAoZS5nLiBpbnQsIGZsb2F0IG9yIGRvdWJsZSkgdGhlbiBcYSBSZWFsU2NhbGFyIGlzIGp1c3QgdGhlIHNhbWUgYXMgXGEgU2NhbGFyLiBJZgorICAgICAgKiBcYSBTY2FsYXIgaXMgXGEgc3RkOjpjb21wbGV4PFQ+IHRoZW4gUmVhbFNjYWxhciBpcyBcYSBULgorICAgICAgKgorICAgICAgKiBcc2EgY2xhc3MgTnVtVHJhaXRzCisgICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIGNvZWZmKCkKKyAgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8X0hhc0RpcmVjdEFjY2VzcywgY29uc3QgU2NhbGFyJiwgU2NhbGFyPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICAvKiogXGludGVybmFsIFJlcHJlc2VudHMgYSBtYXRyaXggd2l0aCBhbGwgY29lZmZpY2llbnRzIGVxdWFsIHRvIG9uZSBhbm90aGVyKi8KKyAgICB0eXBlZGVmIEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gPiBDb25zdGFudFJldHVyblR5cGU7CisKKyAgICAvKiogdHlwZSBvZiB0aGUgZXF1aXZhbGVudCBkZW5zZSBtYXRyaXggKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWU+IERlbnNlTWF0cml4VHlwZTsKKyAgICAvKiogdHlwZSBvZiB0aGUgZXF1aXZhbGVudCBzcXVhcmUgbWF0cml4ICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fU0laRV9NQVgoUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWUpPiBTcXVhcmVNYXRyaXhUeXBlOworCisgICAgaW5saW5lIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGNvbnN0X2Nhc3RfZGVyaXZlZCgpIGNvbnN0CisgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPihjb25zdF9jYXN0PFNwYXJzZU1hdHJpeEJhc2UqPih0aGlzKSk7IH0KKworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworI2RlZmluZSBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUyBFaWdlbjo6U3BhcnNlTWF0cml4QmFzZQorI2lmZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisjZGVmaW5lIEVJR0VOX0RPQ19VTkFSWV9BRERPTlMoTUVUSE9ELE9QKSAgICAgICAgICAgLyoqIDxwPlRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSB0aGUgc3BhcnNpdHkgb2YgXGMgKnRoaXM6IHRoZSBPUCBpcyBhcHBsaWVkIHRvIGV4cGxpY2l0bHkgc3RvcmVkIGNvZWZmaWNpZW50cyBvbmx5LiBcc2EgU3BhcnNlQ29tcHJlc3NlZEJhc2U6OmNvZWZmcygpIDwvcD4gKi8KKyNkZWZpbmUgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwgICAgICAvKiogPHA+IFx3YXJuaW5nIFRoaXMgbWV0aG9kIHJldHVybnMgYSByZWFkLW9ubHkgZXhwcmVzc2lvbiBmb3IgYW55IHNwYXJzZSBtYXRyaWNlcy4gXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VfU3ViTWF0cmljZXMgIlNwYXJzZSBibG9jayBvcGVyYXRpb25zIiA8L3A+ICovCisjZGVmaW5lIEVJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYoQ09ORCkgLyoqIDxwPiBcd2FybmluZyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVhZC13cml0ZSBleHByZXNzaW9uIGZvciBDT05EIHNwYXJzZSBtYXRyaWNlcyBvbmx5LiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBleHByZXNzaW9uIGlzIHJlYWQtb25seS4gXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VfU3ViTWF0cmljZXMgIlNwYXJzZSBibG9jayBvcGVyYXRpb25zIiA8L3A+ICovCisjZWxzZQorI2RlZmluZSBFSUdFTl9ET0NfVU5BUllfQURET05TKFgsWSkKKyNkZWZpbmUgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKyNkZWZpbmUgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihDT05EKQorI2VuZGlmCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9Db21tb25Dd2lzZVVuYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9Db21tb25Dd2lzZUJpbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0Jsb2NrTWV0aG9kcy5oIgorIyAgIGlmZGVmIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfUExVR0lOCisjICAgICBpbmNsdWRlIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfUExVR0lOCisjICAgZW5kaWYKKyN1bmRlZiBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUworI3VuZGVmIEVJR0VOX0RPQ19VTkFSWV9BRERPTlMKKyN1bmRlZiBFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorI3VuZGVmIEVJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYKKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MuIFxzYSBjb2xzKCkgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5yb3dzKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zLiBcc2Egcm93cygpICovCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuY29scygpOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCB3aGljaCBpcyBcYSByb3dzKCkqY29scygpLgorICAgICAgKiBcc2Egcm93cygpLCBjb2xzKCkuICovCisgICAgaW5saW5lIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiByb3dzKCkgKiBjb2xzKCk7IH0KKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiByb3dzIG9yIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpcyBlcXVhbCB0byAxLgorICAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICAqIFxjb2RlIHJvd3MoKT09MSB8fCBjb2xzKCk9PTEgXGVuZGNvZGUKKyAgICAgICogXHNhIHJvd3MoKSwgY29scygpLCBJc1ZlY3RvckF0Q29tcGlsZVRpbWUuICovCisgICAgaW5saW5lIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7IHJldHVybiByb3dzKCk9PTEgfHwgY29scygpPT0xOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzdG9yYWdlIG1ham9yIGRpbWVuc2lvbiwKKyAgICAgICogaS5lLiwgdGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciBhIGNvbHVtbnMgbWFqb3IgbWF0cml4LCBhbmQgdGhlIG51bWJlciBvZiByb3dzIG90aGVyd2lzZSAqLworICAgIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIChpbnQoRmxhZ3MpJlJvd01ham9yQml0KSA/IHRoaXMtPnJvd3MoKSA6IHRoaXMtPmNvbHMoKTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW5uZXIgZGltZW5zaW9uIGFjY29yZGluZyB0byB0aGUgc3RvcmFnZSBvcmRlciwKKyAgICAgICogaS5lLiwgdGhlIG51bWJlciBvZiByb3dzIGZvciBhIGNvbHVtbnMgbWFqb3IgbWF0cml4LCBhbmQgdGhlIG51bWJlciBvZiBjb2xzIG90aGVyd2lzZSAqLworICAgIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIChpbnQoRmxhZ3MpJlJvd01ham9yQml0KSA/IHRoaXMtPmNvbHMoKSA6IHRoaXMtPnJvd3MoKTsgfQorCisgICAgYm9vbCBpc1JWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNSVmFsdWU7IH0KKyAgICBEZXJpdmVkJiBtYXJrQXNSVmFsdWUoKSB7IG1faXNSVmFsdWUgPSB0cnVlOyByZXR1cm4gZGVyaXZlZCgpOyB9CisKKyAgICBTcGFyc2VNYXRyaXhCYXNlKCkgOiBtX2lzUlZhbHVlKGZhbHNlKSB7IC8qIFRPRE8gY2hlY2sgZmxhZ3MgKi8gfQorCisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgaW5saW5lIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBEZXJpdmVkJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBEZXJpdmVkJiBhc3NpZ24oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIHZvaWQgYXNzaWduR2VuZXJpYyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKTsKKworICBwdWJsaWM6CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2UmIG0pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpOZXN0ZWQgTmVzdGVkOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxOZXN0ZWQ+Ojp0eXBlIE5lc3RlZENsZWFuZWQ7CisKKyAgICAgIGlmIChGbGFncyZSb3dNYWpvckJpdCkKKyAgICAgIHsKKyAgICAgICAgTmVzdGVkIG5tKG0uZGVyaXZlZCgpKTsKKyAgICAgICAgaW50ZXJuYWw6OmV2YWx1YXRvcjxOZXN0ZWRDbGVhbmVkPiB0aGlzRXZhbChubSk7CisgICAgICAgIGZvciAoSW5kZXggcm93PTA7IHJvdzxubS5vdXRlclNpemUoKTsgKytyb3cpCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBjb2wgPSAwOworICAgICAgICAgIGZvciAodHlwZW5hbWUgaW50ZXJuYWw6OmV2YWx1YXRvcjxOZXN0ZWRDbGVhbmVkPjo6SW5uZXJJdGVyYXRvciBpdCh0aGlzRXZhbCwgcm93KTsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yICggOyBjb2w8aXQuaW5kZXgoKTsgKytjb2wpCisgICAgICAgICAgICAgIHMgPDwgIjAgIjsKKyAgICAgICAgICAgIHMgPDwgaXQudmFsdWUoKSA8PCAiICI7CisgICAgICAgICAgICArK2NvbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yICggOyBjb2w8bS5jb2xzKCk7ICsrY29sKQorICAgICAgICAgICAgcyA8PCAiMCAiOworICAgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIE5lc3RlZCBubShtLmRlcml2ZWQoKSk7CisgICAgICAgIGludGVybmFsOjpldmFsdWF0b3I8TmVzdGVkQ2xlYW5lZD4gdGhpc0V2YWwobm0pOworICAgICAgICBpZiAobS5jb2xzKCkgPT0gMSkgeworICAgICAgICAgIEluZGV4IHJvdyA9IDA7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbHVhdG9yPE5lc3RlZENsZWFuZWQ+OjpJbm5lckl0ZXJhdG9yIGl0KHRoaXNFdmFsLCAwKTsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yICggOyByb3c8aXQuaW5kZXgoKTsgKytyb3cpCisgICAgICAgICAgICAgIHMgPDwgIjAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHMgPDwgaXQudmFsdWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICArK3JvdzsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yICggOyByb3c8bS5yb3dzKCk7ICsrcm93KQorICAgICAgICAgICAgcyA8PCAiMCIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsIFJvd01ham9yQml0LCBTdG9yYWdlSW5kZXg+IHRyYW5zID0gbTsKKyAgICAgICAgICBzIDw8IHN0YXRpY19jYXN0PGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3JCaXQsIFN0b3JhZ2VJbmRleD4gPiY+KHRyYW5zKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3ItPShjb25zdCBEaWFnb25hbEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3ItPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKTsKKyAgICBEZXJpdmVkJiBvcGVyYXRvci89KGNvbnN0IFNjYWxhciYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBzdHJ1Y3QgQ3dpc2VQcm9kdWN0RGVuc2VSZXR1cm5UeXBlIHsKKyAgICAgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8dHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6U2NhbGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OlJldHVyblR5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3RoZXJEZXJpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgID4gVHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgQ3dpc2VQcm9kdWN0RGVuc2VSZXR1cm5UeXBlPE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICBjd2lzZVByb2R1Y3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICAvLyBzcGFyc2UgKiBkaWFnb25hbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBQcm9kdWN0PERlcml2ZWQsT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yKihjb25zdCBEaWFnb25hbEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOyB9CisKKyAgICAvLyBkaWFnb25hbCAqIHNwYXJzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgY29uc3QgUHJvZHVjdDxPdGhlckRlcml2ZWQsRGVyaXZlZD4KKyAgICBvcGVyYXRvciooY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4gJmxocywgY29uc3QgU3BhcnNlTWF0cml4QmFzZSYgcmhzKQorICAgIHsgcmV0dXJuIFByb2R1Y3Q8T3RoZXJEZXJpdmVkLERlcml2ZWQ+KGxocy5kZXJpdmVkKCksIHJocy5kZXJpdmVkKCkpOyB9CisgICAgCisgICAgLy8gc3BhcnNlICogc3BhcnNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGNvbnN0IFByb2R1Y3Q8RGVyaXZlZCxPdGhlckRlcml2ZWQsQWxpYXNGcmVlUHJvZHVjdD4KKyAgICBvcGVyYXRvciooY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisgICAgCisgICAgLy8gc3BhcnNlICogZGVuc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBQcm9kdWN0PERlcml2ZWQsT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7IH0KKyAgICAKKyAgICAvLyBkZW5zZSAqIHNwYXJzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgY29uc3QgUHJvZHVjdDxPdGhlckRlcml2ZWQsRGVyaXZlZD4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZsaHMsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2UmIHJocykKKyAgICB7IHJldHVybiBQcm9kdWN0PE90aGVyRGVyaXZlZCxEZXJpdmVkPihsaHMuZGVyaXZlZCgpLCByaHMuZGVyaXZlZCgpKTsgfQorICAgIAorICAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBQIEggUF4tMSB3aGVyZSBIIGlzIHRoZSBtYXRyaXggcmVwcmVzZW50ZWQgYnkgXGMgKnRoaXMgKi8KKyAgICBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8RGVyaXZlZCxVcHBlcnxMb3dlcj4gdHdpc3RlZEJ5KGNvbnN0IFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxTdG9yYWdlSW5kZXg+JiBwZXJtKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8RGVyaXZlZCxVcHBlcnxMb3dlcj4oZGVyaXZlZCgpLCBwZXJtKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPGludCBNb2RlPgorICAgIGlubGluZSBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCBEZXJpdmVkLCBNb2RlPiB0cmlhbmd1bGFyVmlldygpIGNvbnN0OworICAgIAorICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPiBzdHJ1Y3QgU2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZSB7IHR5cGVkZWYgU3BhcnNlU2VsZkFkam9pbnRWaWV3PERlcml2ZWQsIFVwTG8+IFR5cGU7IH07CisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+IHN0cnVjdCBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGUgeyB0eXBlZGVmIGNvbnN0IFNwYXJzZVNlbGZBZGpvaW50Vmlldzxjb25zdCBEZXJpdmVkLCBVcExvPiBUeXBlOyB9OworCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+IGlubGluZSAKKyAgICB0eXBlbmFtZSBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGU8VXBMbz46OlR5cGUgc2VsZmFkam9pbnRWaWV3KCkgY29uc3Q7CisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+IGlubGluZQorICAgIHR5cGVuYW1lIFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGU8VXBMbz46OlR5cGUgc2VsZmFkam9pbnRWaWV3KCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IFNjYWxhciBkb3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBTY2FsYXIgZG90KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworICAgIFJlYWxTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIG5vcm0oKSAgY29uc3Q7CisgICAgUmVhbFNjYWxhciBibHVlTm9ybSgpIGNvbnN0OworCisgICAgVHJhbnNwb3NlUmV0dXJuVHlwZSB0cmFuc3Bvc2UoKSB7IHJldHVybiBUcmFuc3Bvc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKyAgICBjb25zdCBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUgdHJhbnNwb3NlKCkgY29uc3QgeyByZXR1cm4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKyAgICBjb25zdCBBZGpvaW50UmV0dXJuVHlwZSBhZGpvaW50KCkgY29uc3QgeyByZXR1cm4gQWRqb2ludFJldHVyblR5cGUodHJhbnNwb3NlKCkpOyB9CisKKyAgICAvLyBpbm5lci12ZWN0b3IKKyAgICB0eXBlZGVmIEJsb2NrPERlcml2ZWQsSXNSb3dNYWpvcj8xOkR5bmFtaWMsSXNSb3dNYWpvcj9EeW5hbWljOjEsdHJ1ZT4gICAgICAgSW5uZXJWZWN0b3JSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgQmxvY2s8Y29uc3QgRGVyaXZlZCxJc1Jvd01ham9yPzE6RHluYW1pYyxJc1Jvd01ham9yP0R5bmFtaWM6MSx0cnVlPiBDb25zdElubmVyVmVjdG9yUmV0dXJuVHlwZTsKKyAgICBJbm5lclZlY3RvclJldHVyblR5cGUgaW5uZXJWZWN0b3IoSW5kZXggb3V0ZXIpOworICAgIGNvbnN0IENvbnN0SW5uZXJWZWN0b3JSZXR1cm5UeXBlIGlubmVyVmVjdG9yKEluZGV4IG91dGVyKSBjb25zdDsKKworICAgIC8vIHNldCBvZiBpbm5lci12ZWN0b3JzCisgICAgdHlwZWRlZiBCbG9jazxEZXJpdmVkLER5bmFtaWMsRHluYW1pYyx0cnVlPiBJbm5lclZlY3RvcnNSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgQmxvY2s8Y29uc3QgRGVyaXZlZCxEeW5hbWljLER5bmFtaWMsdHJ1ZT4gQ29uc3RJbm5lclZlY3RvcnNSZXR1cm5UeXBlOworICAgIElubmVyVmVjdG9yc1JldHVyblR5cGUgaW5uZXJWZWN0b3JzKEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSk7CisgICAgY29uc3QgQ29uc3RJbm5lclZlY3RvcnNSZXR1cm5UeXBlIGlubmVyVmVjdG9ycyhJbmRleCBvdXRlclN0YXJ0LCBJbmRleCBvdXRlclNpemUpIGNvbnN0OworCisgICAgRGVuc2VNYXRyaXhUeXBlIHRvRGVuc2UoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBEZW5zZU1hdHJpeFR5cGUoZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgYm9vbCBpc0FwcHJveChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgYm9vbCBpc0FwcHJveChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgICB7IHJldHVybiB0b0RlbnNlKCkuaXNBcHByb3gob3RoZXIscHJlYyk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbWF0cml4IG9yIHZlY3RvciBvYnRhaW5lZCBieSBldmFsdWF0aW5nIHRoaXMgZXhwcmVzc2lvbi4KKyAgICAgICoKKyAgICAgICogTm90aWNlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYSBwbGFpbiBtYXRyaXggb3IgdmVjdG9yIChub3QgYW4gZXhwcmVzc2lvbikgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMKKyAgICAgICogYSBjb25zdCByZWZlcmVuY2UsIGluIG9yZGVyIHRvIGF2b2lkIGEgdXNlbGVzcyBjb3B5LgorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OmV2YWw8RGVyaXZlZD46OnR5cGUgZXZhbCgpIGNvbnN0CisgICAgeyByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmV2YWw8RGVyaXZlZD46OnR5cGUoZGVyaXZlZCgpKTsgfQorCisgICAgU2NhbGFyIHN1bSgpIGNvbnN0OworICAgIAorICAgIGlubGluZSBjb25zdCBTcGFyc2VWaWV3PERlcml2ZWQ+CisgICAgcHJ1bmVkKGNvbnN0IFNjYWxhciYgcmVmZXJlbmNlID0gU2NhbGFyKDApLCBjb25zdCBSZWFsU2NhbGFyJiBlcHNpbG9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICBib29sIG1faXNSVmFsdWU7CisKKyAgICBzdGF0aWMgaW5saW5lIFN0b3JhZ2VJbmRleCBjb252ZXJ0X2luZGV4KGNvbnN0IEluZGV4IGlkeCkgeworICAgICAgcmV0dXJuIGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oaWR4KTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCAmKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFTUFUUklYQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VQZXJtdXRhdGlvbi5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUGVybXV0YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM4MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUGVybXV0YXRpb24uaApAQCAtMCwwICsxLDE3OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9QRVJNVVRBVElPTl9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9QRVJNVVRBVElPTl9ICisKKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNwYXJzZSAqIHBlcm11dGF0aW9uIHByb2R1Y3RzCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD4KK3N0cnVjdCBwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxFeHByZXNzaW9uVHlwZSwgU2lkZSwgVHJhbnNwb3NlZCwgU3BhcnNlU2hhcGU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxFeHByZXNzaW9uVHlwZSwgMT46OnR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZUNsZWFuZWQ7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGVDbGVhbmVkOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZUNsZWFuZWQ6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIFNyY1N0b3JhZ2VPcmRlciA9IE1hdHJpeFR5cGVDbGVhbmVkOjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICBNb3ZlT3V0ZXIgPSBTcmNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gU2lkZT09T25UaGVMZWZ0IDogU2lkZT09T25UaGVSaWdodAorICAgIH07CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TW92ZU91dGVyLAorICAgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLFNyY1N0b3JhZ2VPcmRlcixTdG9yYWdlSW5kZXg+LAorICAgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLGludChTcmNTdG9yYWdlT3JkZXIpPT1Sb3dNYWpvcj9Db2xNYWpvcjpSb3dNYWpvcixTdG9yYWdlSW5kZXg+ID46OnR5cGUgUmV0dXJuVHlwZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3QsdHlwZW5hbWUgUGVybXV0YXRpb25UeXBlPgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVzdCYgZHN0LCBjb25zdCBQZXJtdXRhdGlvblR5cGUmIHBlcm0sIGNvbnN0IEV4cHJlc3Npb25UeXBlJiB4cHIpCisgICAgeworICAgICAgTWF0cml4VHlwZSBtYXQoeHByKTsKKyAgICAgIGlmKE1vdmVPdXRlcikKKyAgICAgIHsKKyAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcixTcmNTdG9yYWdlT3JkZXIsU3RvcmFnZUluZGV4PiB0bXAobWF0LnJvd3MoKSwgbWF0LmNvbHMoKSk7CisgICAgICAgIE1hdHJpeDxTdG9yYWdlSW5kZXgsRHluYW1pYywxPiBzaXplcyhtYXQub3V0ZXJTaXplKCkpOworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1hdC5vdXRlclNpemUoKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXgganAgPSBwZXJtLmluZGljZXMoKS5jb2VmZihqKTsKKyAgICAgICAgICBzaXplc1soKFNpZGU9PU9uVGhlTGVmdCkgXiBUcmFuc3Bvc2VkKSA/IGpwIDogal0gPSBTdG9yYWdlSW5kZXgobWF0LmlubmVyVmVjdG9yKCgoU2lkZT09T25UaGVSaWdodCkgXiBUcmFuc3Bvc2VkKSA/IGpwIDogaikubm9uWmVyb3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgdG1wLnJlc2VydmUoc2l6ZXMpOworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1hdC5vdXRlclNpemUoKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXgganAgPSBwZXJtLmluZGljZXMoKS5jb2VmZihqKTsKKyAgICAgICAgICBJbmRleCBqc3JjID0gKChTaWRlPT1PblRoZVJpZ2h0KSBeIFRyYW5zcG9zZWQpID8ganAgOiBqOworICAgICAgICAgIEluZGV4IGpkc3QgPSAoKFNpZGU9PU9uVGhlTGVmdCkgXiBUcmFuc3Bvc2VkKSA/IGpwIDogajsKKyAgICAgICAgICBmb3IodHlwZW5hbWUgTWF0cml4VHlwZUNsZWFuZWQ6OklubmVySXRlcmF0b3IgaXQobWF0LGpzcmMpOyBpdDsgKytpdCkKKyAgICAgICAgICAgIHRtcC5pbnNlcnRCeU91dGVySW5uZXIoamRzdCxpdC5pbmRleCgpKSA9IGl0LnZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ID0gdG1wOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLGludChTcmNTdG9yYWdlT3JkZXIpPT1Sb3dNYWpvcj9Db2xNYWpvcjpSb3dNYWpvcixTdG9yYWdlSW5kZXg+IHRtcChtYXQucm93cygpLCBtYXQuY29scygpKTsKKyAgICAgICAgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IHNpemVzKHRtcC5vdXRlclNpemUoKSk7CisgICAgICAgIHNpemVzLnNldFplcm8oKTsKKyAgICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLFN0b3JhZ2VJbmRleD4gcGVybV9jcHk7CisgICAgICAgIGlmKChTaWRlPT1PblRoZUxlZnQpIF4gVHJhbnNwb3NlZCkKKyAgICAgICAgICBwZXJtX2NweSA9IHBlcm07CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwZXJtX2NweSA9IHBlcm0udHJhbnNwb3NlKCk7CisKKyAgICAgICAgZm9yKEluZGV4IGo9MDsgajxtYXQub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgICBmb3IodHlwZW5hbWUgTWF0cml4VHlwZUNsZWFuZWQ6OklubmVySXRlcmF0b3IgaXQobWF0LGopOyBpdDsgKytpdCkKKyAgICAgICAgICAgIHNpemVzW3Blcm1fY3B5LmluZGljZXMoKS5jb2VmZihpdC5pbmRleCgpKV0rKzsKKyAgICAgICAgdG1wLnJlc2VydmUoc2l6ZXMpOworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1hdC5vdXRlclNpemUoKTsgKytqKQorICAgICAgICAgIGZvcih0eXBlbmFtZSBNYXRyaXhUeXBlQ2xlYW5lZDo6SW5uZXJJdGVyYXRvciBpdChtYXQsaik7IGl0OyArK2l0KQorICAgICAgICAgICAgdG1wLmluc2VydEJ5T3V0ZXJJbm5lcihwZXJtX2NweS5pbmRpY2VzKCkuY29lZmYoaXQuaW5kZXgoKSksaikgPSBpdC52YWx1ZSgpOworICAgICAgICBkc3QgPSB0bXA7CisgICAgICB9CisgICAgfQorfTsKKworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8aW50IFByb2R1Y3RUYWc+IHN0cnVjdCBwcm9kdWN0X3Byb21vdGVfc3RvcmFnZV90eXBlPFNwYXJzZSwgICAgICAgICAgICAgUGVybXV0YXRpb25TdG9yYWdlLCBQcm9kdWN0VGFnPiB7IHR5cGVkZWYgU3BhcnNlIHJldDsgfTsKK3RlbXBsYXRlIDxpbnQgUHJvZHVjdFRhZz4gc3RydWN0IHByb2R1Y3RfcHJvbW90ZV9zdG9yYWdlX3R5cGU8UGVybXV0YXRpb25TdG9yYWdlLCBTcGFyc2UsICAgICAgICAgICAgIFByb2R1Y3RUYWc+IHsgdHlwZWRlZiBTcGFyc2UgcmV0OyB9OworCisvLyBUT0RPLCB0aGUgZm9sbG93aW5nIHR3byBvdmVybG9hZHMgYXJlIG9ubHkgbmVlZGVkIHRvIGRlZmluZSB0aGUgcmlnaHQgdGVtcG9yYXJ5IHR5cGUgdGhyb3VnaCAKKy8vIHR5cGVuYW1lIHRyYWl0czxwZXJtdXRhdGlvbl9zcGFyc2VfbWF0cml4X3Byb2R1Y3Q8UmhzLExocyxPblRoZVJpZ2h0LGZhbHNlPiA+OjpSZXR1cm5UeXBlCisvLyB3aGVyZWFzIGl0IHNob3VsZCBiZSBjb3JyZWN0bHkgaGFuZGxlZCBieSB0cmFpdHM8UHJvZHVjdDw+ID46OlBsYWluT2JqZWN0CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExocywgUmhzLCBBbGlhc0ZyZWVQcm9kdWN0PiwgUHJvZHVjdFRhZywgUGVybXV0YXRpb25TaGFwZSwgU3BhcnNlU2hhcGU+CisgIDogcHVibGljIGV2YWx1YXRvcjx0eXBlbmFtZSBwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxSaHMsT25UaGVMZWZ0LGZhbHNlLFNwYXJzZVNoYXBlPjo6UmV0dXJuVHlwZT4KK3sKKyAgdHlwZWRlZiBQcm9kdWN0PExocywgUmhzLCBBbGlhc0ZyZWVQcm9kdWN0PiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0PFJocyxPblRoZUxlZnQsZmFsc2UsU3BhcnNlU2hhcGU+OjpSZXR1cm5UeXBlIFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKworICBlbnVtIHsKKyAgICBGbGFncyA9IEJhc2U6OkZsYWdzIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQKKyAgfTsKKworICBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX3Jlc3VsdCh4cHIucm93cygpLCB4cHIuY29scygpKQorICB7CisgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShtX3Jlc3VsdCk7CisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFBlcm11dGF0aW9uU2hhcGUsIFNwYXJzZVNoYXBlLCBQcm9kdWN0VGFnPjo6ZXZhbFRvKG1fcmVzdWx0LCB4cHIubGhzKCksIHhwci5yaHMoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExocywgUmhzLCBBbGlhc0ZyZWVQcm9kdWN0PiwgUHJvZHVjdFRhZywgU3BhcnNlU2hhcGUsIFBlcm11dGF0aW9uU2hhcGUgPgorICA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgcGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8TGhzLE9uVGhlUmlnaHQsZmFsc2UsU3BhcnNlU2hhcGU+OjpSZXR1cm5UeXBlPgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzLCBSaHMsIEFsaWFzRnJlZVByb2R1Y3Q+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8TGhzLE9uVGhlUmlnaHQsZmFsc2UsU3BhcnNlU2hhcGU+OjpSZXR1cm5UeXBlIFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKworICBlbnVtIHsKKyAgICBGbGFncyA9IEJhc2U6OkZsYWdzIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQKKyAgfTsKKworICBleHBsaWNpdCBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX3Jlc3VsdCh4cHIucm93cygpLCB4cHIuY29scygpKQorICB7CisgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShtX3Jlc3VsdCk7CisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVNoYXBlLCBQZXJtdXRhdGlvblNoYXBlLCBQcm9kdWN0VGFnPjo6ZXZhbFRvKG1fcmVzdWx0LCB4cHIubGhzKCksIHhwci5yaHMoKSk7CisgIH0KKworcHJvdGVjdGVkOgorICBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkLCB0eXBlbmFtZSBQZXJtRGVyaXZlZD4KK2lubGluZSBjb25zdCBQcm9kdWN0PFNwYXJzZURlcml2ZWQsIFBlcm1EZXJpdmVkLCBBbGlhc0ZyZWVQcm9kdWN0Pgorb3BlcmF0b3IqKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGVyaXZlZD4mIG1hdHJpeCwgY29uc3QgUGVybXV0YXRpb25CYXNlPFBlcm1EZXJpdmVkPiYgcGVybSkKK3sgcmV0dXJuIFByb2R1Y3Q8U3BhcnNlRGVyaXZlZCwgUGVybURlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+KG1hdHJpeC5kZXJpdmVkKCksIHBlcm0uZGVyaXZlZCgpKTsgfQorCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSByb3dzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkLCB0eXBlbmFtZSBQZXJtRGVyaXZlZD4KK2lubGluZSBjb25zdCBQcm9kdWN0PFBlcm1EZXJpdmVkLCBTcGFyc2VEZXJpdmVkLCBBbGlhc0ZyZWVQcm9kdWN0Pgorb3BlcmF0b3IqKCBjb25zdCBQZXJtdXRhdGlvbkJhc2U8UGVybURlcml2ZWQ+JiBwZXJtLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZURlcml2ZWQ+JiBtYXRyaXgpCit7IHJldHVybiAgUHJvZHVjdDxQZXJtRGVyaXZlZCwgU3BhcnNlRGVyaXZlZCwgQWxpYXNGcmVlUHJvZHVjdD4ocGVybS5kZXJpdmVkKCksIG1hdHJpeC5kZXJpdmVkKCkpOyB9CisKKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlRGVyaXZlZCwgdHlwZW5hbWUgUGVybXV0YXRpb25UeXBlPgoraW5saW5lIGNvbnN0IFByb2R1Y3Q8U3BhcnNlRGVyaXZlZCwgSW52ZXJzZTxQZXJtdXRhdGlvblR5cGU+LCBBbGlhc0ZyZWVQcm9kdWN0Pgorb3BlcmF0b3IqKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGVyaXZlZD4mIG1hdHJpeCwgY29uc3QgSW52ZXJzZUltcGw8UGVybXV0YXRpb25UeXBlLCBQZXJtdXRhdGlvblN0b3JhZ2U+JiB0cGVybSkKK3sKKyAgcmV0dXJuIFByb2R1Y3Q8U3BhcnNlRGVyaXZlZCwgSW52ZXJzZTxQZXJtdXRhdGlvblR5cGU+LCBBbGlhc0ZyZWVQcm9kdWN0PihtYXRyaXguZGVyaXZlZCgpLCB0cGVybS5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIHJvd3MuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkLCB0eXBlbmFtZSBQZXJtdXRhdGlvblR5cGU+CitpbmxpbmUgY29uc3QgUHJvZHVjdDxJbnZlcnNlPFBlcm11dGF0aW9uVHlwZT4sIFNwYXJzZURlcml2ZWQsIEFsaWFzRnJlZVByb2R1Y3Q+CitvcGVyYXRvciooY29uc3QgSW52ZXJzZUltcGw8UGVybXV0YXRpb25UeXBlLFBlcm11dGF0aW9uU3RvcmFnZT4mIHRwZXJtLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZURlcml2ZWQ+JiBtYXRyaXgpCit7CisgIHJldHVybiBQcm9kdWN0PEludmVyc2U8UGVybXV0YXRpb25UeXBlPiwgU3BhcnNlRGVyaXZlZCwgQWxpYXNGcmVlUHJvZHVjdD4odHBlcm0uZGVyaXZlZCgpLCBtYXRyaXguZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfU0VMRkFESk9JTlRWSUVXX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JmNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUHJvZHVjdC5oCkBAIC0wLDAgKzEsMTY5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VQUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgcHJvZHVjdCBvZiB0d28gc3BhcnNlIG1hdHJpY2VzLgorICAqIEJ5IGRlZmF1bHQgYSBjb25zZXJ2YXRpdmUgcHJvZHVjdCBwcmVzZXJ2aW5nIHRoZSBzeW1ib2xpYyBub24gemVyb3MgaXMgcGVyZm9ybWVkLgorICAqIFRoZSBhdXRvbWF0aWMgcHJ1bmluZyBvZiB0aGUgc21hbGwgdmFsdWVzIGNhbiBiZSBhY2hpZXZlZCBieSBjYWxsaW5nIHRoZSBwcnVuZWQoKSBmdW5jdGlvbgorICAqIGluIHdoaWNoIGNhc2UgYSB0b3RhbGx5IGRpZmZlcmVudCBwcm9kdWN0IGFsZ29yaXRobSBpcyBlbXBsb3llZDoKKyAgKiBcY29kZQorICAqIEMgPSAoQSpCKS5wcnVuZWQoKTsgICAgICAgICAgICAgLy8gc3VwcmVzcyBudW1lcmljYWwgemVyb3MgKGV4YWN0KQorICAqIEMgPSAoQSpCKS5wcnVuZWQocmVmKTsKKyAgKiBDID0gKEEqQikucHJ1bmVkKHJlZixlcHNpbG9uKTsKKyAgKiBcZW5kY29kZQorICAqIHdoZXJlIFxjIHJlZiBpcyBhIG1lYW5pbmdmdWwgbm9uIHplcm8gcmVmZXJlbmNlIHZhbHVlLgorICAqICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIGNvbnN0IFByb2R1Y3Q8RGVyaXZlZCxPdGhlckRlcml2ZWQsQWxpYXNGcmVlUHJvZHVjdD4KK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZCxBbGlhc0ZyZWVQcm9kdWN0PihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHNwYXJzZSAqIHNwYXJzZQordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VHlwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgU3BhcnNlU2hhcGUsIFNwYXJzZVNoYXBlLCBQcm9kdWN0VHlwZT4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgZXZhbFRvKGRzdCwgbGhzLCByaHMsIHR5cGVuYW1lIGV2YWx1YXRvcl90cmFpdHM8RGVzdD46OlNoYXBlKCkpOworICB9CisKKyAgLy8gZGVuc2UgKz0gc3BhcnNlICogc3BhcnNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3QsdHlwZW5hbWUgQWN0dWFsTGhzPgorICBzdGF0aWMgdm9pZCBhZGRUbyhEZXN0JiBkc3QsIGNvbnN0IEFjdHVhbExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3NhbWU8dHlwZW5hbWUgZXZhbHVhdG9yX3RyYWl0czxEZXN0Pjo6U2hhcGUsRGVuc2VTaGFwZT46OnZhbHVlLGludCo+Ojp0eXBlKiA9IDApCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPEFjdHVhbExocyxEeW5hbWljPjo6dHlwZSBMaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxSaHMsRHluYW1pYz46OnR5cGUgUmhzTmVzdGVkOworICAgIExoc05lc3RlZCBsaHNOZXN0ZWQobGhzKTsKKyAgICBSaHNOZXN0ZWQgcmhzTmVzdGVkKHJocyk7CisgICAgaW50ZXJuYWw6OnNwYXJzZV9zcGFyc2VfdG9fZGVuc2VfcHJvZHVjdF9zZWxlY3Rvcjx0eXBlbmFtZSByZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfYWxsPFJoc05lc3RlZD46OnR5cGUsIERlc3Q+OjpydW4obGhzTmVzdGVkLHJoc05lc3RlZCxkc3QpOworICB9CisKKyAgLy8gZGVuc2UgLT0gc3BhcnNlICogc3BhcnNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIHN1YlRvKERlc3QmIGRzdCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCB0eXBlbmFtZSBlbmFibGVfaWY8aXNfc2FtZTx0eXBlbmFtZSBldmFsdWF0b3JfdHJhaXRzPERlc3Q+OjpTaGFwZSxEZW5zZVNoYXBlPjo6dmFsdWUsaW50Kj46OnR5cGUqID0gMCkKKyAgeworICAgIGFkZFRvKGRzdCwgLWxocywgcmhzKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisKKyAgLy8gc3BhcnNlID0gc3BhcnNlICogc3BhcnNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIGV2YWxUbyhEZXN0JiBkc3QsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgU3BhcnNlU2hhcGUpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPExocyxEeW5hbWljPjo6dHlwZSBMaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxSaHMsRHluYW1pYz46OnR5cGUgUmhzTmVzdGVkOworICAgIExoc05lc3RlZCBsaHNOZXN0ZWQobGhzKTsKKyAgICBSaHNOZXN0ZWQgcmhzTmVzdGVkKHJocyk7CisgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8dHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9hbGw8UmhzTmVzdGVkPjo6dHlwZSwgRGVzdD46OnJ1bihsaHNOZXN0ZWQscmhzTmVzdGVkLGRzdCk7CisgIH0KKworICAvLyBkZW5zZSA9IHNwYXJzZSAqIHNwYXJzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBldmFsVG8oRGVzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIERlbnNlU2hhcGUpCisgIHsKKyAgICBkc3Quc2V0WmVybygpOworICAgIGFkZFRvKGRzdCwgbGhzLCByaHMpOworICB9Cit9OworCisvLyBzcGFyc2UgKiBzcGFyc2UtdHJpYW5ndWxhcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0VHlwZT4KK3N0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJocywgU3BhcnNlU2hhcGUsIFNwYXJzZVRyaWFuZ3VsYXJTaGFwZSwgUHJvZHVjdFR5cGU+CisgOiBwdWJsaWMgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVNoYXBlLCBTcGFyc2VTaGFwZSwgUHJvZHVjdFR5cGU+Cit7fTsKKworLy8gc3BhcnNlLXRyaWFuZ3VsYXIgKiBzcGFyc2UKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFR5cGU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHMsIFNwYXJzZVRyaWFuZ3VsYXJTaGFwZSwgU3BhcnNlU2hhcGUsIFByb2R1Y3RUeXBlPgorIDogcHVibGljIGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzLCBTcGFyc2VTaGFwZSwgU3BhcnNlU2hhcGUsIFByb2R1Y3RUeXBlPgore307CisKKy8vIGRlbnNlID0gc3BhcnNlLXByb2R1Y3QgKGNhbiBiZSBzcGFyc2Uqc3BhcnNlLCBzcGFyc2UqcGVybSwgZXRjLikKK3RlbXBsYXRlPCB0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFByb2R1Y3Q8TGhzLFJocyxBbGlhc0ZyZWVQcm9kdWN0PiwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+OjpTY2FsYXI+LCBTcGFyc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPiAmKQorICB7CisgICAgSW5kZXggZHN0Um93cyA9IHNyYy5yb3dzKCk7CisgICAgSW5kZXggZHN0Q29scyA9IHNyYy5jb2xzKCk7CisgICAgaWYoKGRzdC5yb3dzKCkhPWRzdFJvd3MpIHx8IChkc3QuY29scygpIT1kc3RDb2xzKSkKKyAgICAgIGRzdC5yZXNpemUoZHN0Um93cywgZHN0Q29scyk7CisgICAgCisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCBSaHM+OjpldmFsVG8oZHN0LHNyYy5saHMoKSxzcmMucmhzKCkpOworICB9Cit9OworCisvLyBkZW5zZSArPSBzcGFyc2UtcHJvZHVjdCAoY2FuIGJlIHNwYXJzZSpzcGFyc2UsIHNwYXJzZSpwZXJtLCBldGMuKQordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+LCBpbnRlcm5hbDo6YWRkX2Fzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+OjpTY2FsYXI+LCBTcGFyc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzPjo6YWRkVG8oZHN0LHNyYy5saHMoKSxzcmMucmhzKCkpOworICB9Cit9OworCisvLyBkZW5zZSAtPSBzcGFyc2UtcHJvZHVjdCAoY2FuIGJlIHNwYXJzZSpzcGFyc2UsIHNwYXJzZSpwZXJtLCBldGMuKQordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+LCBpbnRlcm5hbDo6c3ViX2Fzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+OjpTY2FsYXI+LCBTcGFyc2UyRGVuc2U+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsUmhzLEFsaWFzRnJlZVByb2R1Y3Q+IFNyY1hwclR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihEc3RYcHJUeXBlICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OnN1Yl9hc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzPjo6c3ViVG8oZHN0LHNyYy5saHMoKSxzcmMucmhzKCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE9wdGlvbnM+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPFNwYXJzZVZpZXc8UHJvZHVjdDxMaHMsIFJocywgT3B0aW9ucz4gPiwgSXRlcmF0b3JCYXNlZD4KKyA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgUHJvZHVjdDxMaHMsIFJocywgRGVmYXVsdFByb2R1Y3Q+OjpQbGFpbk9iamVjdD4KK3sKKyAgdHlwZWRlZiBTcGFyc2VWaWV3PFByb2R1Y3Q8TGhzLCBSaHMsIE9wdGlvbnM+ID4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgdHlwZWRlZiBldmFsdWF0b3I8UGxhaW5PYmplY3Q+IEJhc2U7CisKKyAgZXhwbGljaXQgdW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICA6IG1fcmVzdWx0KHhwci5yb3dzKCksIHhwci5jb2xzKCkpCisgIHsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICA6Om5ldyAoc3RhdGljX2Nhc3Q8QmFzZSo+KHRoaXMpKSBCYXNlKG1fcmVzdWx0KTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPExocyxEeW5hbWljPjo6dHlwZSBMaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxSaHMsRHluYW1pYz46OnR5cGUgUmhzTmVzdGVkOworICAgIExoc05lc3RlZCBsaHNOZXN0ZWQoeHByLm5lc3RlZEV4cHJlc3Npb24oKS5saHMoKSk7CisgICAgUmhzTmVzdGVkIHJoc05lc3RlZCh4cHIubmVzdGVkRXhwcmVzc2lvbigpLnJocygpKTsKKworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfYWxsPFJoc05lc3RlZD46OnR5cGUsIFBsYWluT2JqZWN0Pjo6cnVuKGxoc05lc3RlZCxyaHNOZXN0ZWQsbV9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoeHByLnJlZmVyZW5jZSgpKSp4cHIuZXBzaWxvbigpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFBsYWluT2JqZWN0IG1fcmVzdWx0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VSZWR1eC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUmVkdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg3NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUmVkdXguaApAQCAtMCwwICsxLDQ5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VSRURVWF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVJFRFVYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnN1bSgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCk+MCAmJiBjb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhIG5vbiBpbml0aWFsaXplZCBtYXRyaXgiKTsKKyAgU2NhbGFyIHJlcygwKTsKKyAgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPiB0aGlzRXZhbChkZXJpdmVkKCkpOworICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgIGZvciAodHlwZW5hbWUgaW50ZXJuYWw6OmV2YWx1YXRvcjxEZXJpdmVkPjo6SW5uZXJJdGVyYXRvciBpdGVyKHRoaXNFdmFsLGopOyBpdGVyOyArK2l0ZXIpCisgICAgICByZXMgKz0gaXRlci52YWx1ZSgpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8U3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX0luZGV4PiA+OjpTY2FsYXIKK1NwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD46OnN1bSgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCk+MCAmJiBjb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhIG5vbiBpbml0aWFsaXplZCBtYXRyaXgiKTsKKyAgaWYodGhpcy0+aXNDb21wcmVzc2VkKCkpCisgICAgcmV0dXJuIE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPjo6TWFwKG1fZGF0YS52YWx1ZVB0cigpLCBtX2RhdGEuc2l6ZSgpKS5zdW0oKTsKKyAgZWxzZQorICAgIHJldHVybiBCYXNlOjpzdW0oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLCBfSW5kZXg+ID46OlNjYWxhcgorU3BhcnNlVmVjdG9yPF9TY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6c3VtKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKT4wICYmIGNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGEgbm9uIGluaXRpYWxpemVkIG1hdHJpeCIpOworICByZXR1cm4gTWF0cml4PFNjYWxhciwxLER5bmFtaWM+OjpNYXAobV9kYXRhLnZhbHVlUHRyKCksIG1fZGF0YS5zaXplKCkpLnN1bSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVJFRFVYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVJlZi5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxZjM4ZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVJlZi5oCkBAIC0wLDAgKzEsMzk3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX1JFRl9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9SRUZfSAorCituYW1lc3BhY2UgRWlnZW4geworCitlbnVtIHsKKyAgU3RhbmRhcmRDb21wcmVzc2VkRm9ybWF0ID0gMiAvKio8IHVzZWQgYnkgUmVmPFNwYXJzZU1hdHJpeD4gdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBpbnB1dCBzdG9yYWdlIG11c3QgYmUgaW4gc3RhbmRhcmQgY29tcHJlc3NlZCBmb3JtICovCit9OworICAKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZVJlZkJhc2U7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdHJpZGVUeXBlPgorc3RydWN0IHRyYWl0czxSZWY8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgX09wdGlvbnMsIF9TdHJpZGVUeXBlPiA+CisgIDogcHVibGljIHRyYWl0czxTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+IFBsYWluT2JqZWN0VHlwZTsKKyAgZW51bSB7CisgICAgT3B0aW9ucyA9IF9PcHRpb25zLAorICAgIEZsYWdzID0gdHJhaXRzPFBsYWluT2JqZWN0VHlwZT46OkZsYWdzIHwgQ29tcHJlc3NlZEFjY2Vzc0JpdCB8IE5lc3RCeVJlZkJpdAorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBtYXRjaCB7CisgICAgZW51bSB7CisgICAgICBTdG9yYWdlT3JkZXJNYXRjaCA9IFBsYWluT2JqZWN0VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lIHx8IERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSB8fCAoKFBsYWluT2JqZWN0VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0oRGVyaXZlZDo6RmxhZ3MmUm93TWFqb3JCaXQpKSwKKyAgICAgIE1hdGNoQXRDb21waWxlVGltZSA9IChEZXJpdmVkOjpGbGFncyZDb21wcmVzc2VkQWNjZXNzQml0KSAmJiBTdG9yYWdlT3JkZXJNYXRjaAorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TWF0Y2hBdENvbXBpbGVUaW1lLGludGVybmFsOjp0cnVlX3R5cGUsaW50ZXJuYWw6OmZhbHNlX3R5cGU+Ojp0eXBlIHR5cGU7CisgIH07CisgIAorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0cmlkZVR5cGU+CitzdHJ1Y3QgdHJhaXRzPFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPFJlZjxTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KK3sKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAodHJhaXRzPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4gPjo6RmxhZ3MgfCBDb21wcmVzc2VkQWNjZXNzQml0IHwgTmVzdEJ5UmVmQml0KSAmIH5MdmFsdWVCaXQKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdHJpZGVUeXBlPgorc3RydWN0IHRyYWl0czxSZWY8U3BhcnNlVmVjdG9yPE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgX09wdGlvbnMsIF9TdHJpZGVUeXBlPiA+CisgIDogcHVibGljIHRyYWl0czxTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+IFBsYWluT2JqZWN0VHlwZTsKKyAgZW51bSB7CisgICAgT3B0aW9ucyA9IF9PcHRpb25zLAorICAgIEZsYWdzID0gdHJhaXRzPFBsYWluT2JqZWN0VHlwZT46OkZsYWdzIHwgQ29tcHJlc3NlZEFjY2Vzc0JpdCB8IE5lc3RCeVJlZkJpdAorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBtYXRjaCB7CisgICAgZW51bSB7CisgICAgICBNYXRjaEF0Q29tcGlsZVRpbWUgPSAoRGVyaXZlZDo6RmxhZ3MmQ29tcHJlc3NlZEFjY2Vzc0JpdCkgJiYgRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxNYXRjaEF0Q29tcGlsZVRpbWUsaW50ZXJuYWw6OnRydWVfdHlwZSxpbnRlcm5hbDo6ZmFsc2VfdHlwZT46OnR5cGUgdHlwZTsKKyAgfTsKKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0cmlkZVR5cGU+CitzdHJ1Y3QgdHJhaXRzPFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPFJlZjxTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBfT3B0aW9ucywgX1N0cmlkZVR5cGU+ID4KK3sKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAodHJhaXRzPFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4gPjo6RmxhZ3MgfCBDb21wcmVzc2VkQWNjZXNzQml0IHwgTmVzdEJ5UmVmQml0KSAmIH5MdmFsdWVCaXQKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVJlZkJhc2U8RGVyaXZlZD4gPiA6IHB1YmxpYyB0cmFpdHM8RGVyaXZlZD4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZVJlZkJhc2UKKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxEZXJpdmVkPgoreworcHVibGljOgorCisgIHR5cGVkZWYgU3BhcnNlTWFwQmFzZTxEZXJpdmVkPiBCYXNlOworICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VSZWZCYXNlKQorCisgIFNwYXJzZVJlZkJhc2UoKQorICAgIDogQmFzZShSb3dzQXRDb21waWxlVGltZT09RHluYW1pYz8wOlJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljPzA6Q29sc0F0Q29tcGlsZVRpbWUsIDAsIDAsIDAsIDAsIDApCisgIHt9CisgIAorcHJvdGVjdGVkOgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb24+CisgIHZvaWQgY29uc3RydWN0KEV4cHJlc3Npb24mIGV4cHIpCisgIHsKKyAgICBpZihleHByLm91dGVySW5kZXhQdHIoKT09MCkKKyAgICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UoZXhwci5zaXplKCksIGV4cHIubm9uWmVyb3MoKSwgZXhwci5pbm5lckluZGV4UHRyKCksIGV4cHIudmFsdWVQdHIoKSk7CisgICAgZWxzZQorICAgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShleHByLnJvd3MoKSwgZXhwci5jb2xzKCksIGV4cHIubm9uWmVyb3MoKSwgZXhwci5vdXRlckluZGV4UHRyKCksIGV4cHIuaW5uZXJJbmRleFB0cigpLCBleHByLnZhbHVlUHRyKCksIGV4cHIuaW5uZXJOb25aZXJvUHRyKCkpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKy8qKiAKKyAgKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEEgc3BhcnNlIG1hdHJpeCBleHByZXNzaW9uIHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIHNwYXJzZSBleHByZXNzaW9uCisgICoKKyAgKiBcdHBhcmFtIFNwYXJzZU1hdHJpeFR5cGUgdGhlIGVxdWl2YWxlbnQgc3BhcnNlIG1hdHJpeCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGRhdGEsIGl0IG11c3QgYmUgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBvZiBjbGFzcyBTcGFyc2VNYXRyaXguCisgICogXHRwYXJhbSBPcHRpb25zIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBhIHN0YW5kYXJkIGNvbXByZXNzZWQgZm9ybWF0IGlzIHJlcXVpcmVkIFxjIE9wdGlvbnMgaXMgIFxjICNTdGFuZGFyZENvbXByZXNzZWRGb3JtYXQsIG9yIFxjIDAuCisgICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgXGMgMC4KKyAgKgorICAqIFxzYSBjbGFzcyBSZWYKKyAgKi8KKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK2NsYXNzIFJlZjxTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlID4KKyAgOiBwdWJsaWMgaW50ZXJuYWw6OlNwYXJzZVJlZkJhc2U8UmVmPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGUgPiA+CisjZWxzZQordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZSwgaW50IE9wdGlvbnM+CitjbGFzcyBSZWY8U3BhcnNlTWF0cml4VHlwZSwgT3B0aW9ucz4KKyAgOiBwdWJsaWMgU3BhcnNlTWFwQmFzZTxEZXJpdmVkLFdyaXRlQWNjZXNzb3JzPiAvLyB5ZXMsIHRoYXQncyB3ZWlyZCB0byB1c2UgRGVyaXZlZCBoZXJlLCBidXQgdGhhdCB3b3JrcyEKKyNlbmRpZgoreworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiBQbGFpbk9iamVjdFR5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFJlZj4gVHJhaXRzOworICAgIHRlbXBsYXRlPGludCBPdGhlck9wdGlvbnM+CisgICAgaW5saW5lIFJlZihjb25zdCBTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE90aGVyT3B0aW9ucyxNYXRJbmRleD4mIGV4cHIpOworICAgIHRlbXBsYXRlPGludCBPdGhlck9wdGlvbnM+CisgICAgaW5saW5lIFJlZihjb25zdCBNYXBwZWRTcGFyc2VNYXRyaXg8TWF0U2NhbGFyLE90aGVyT3B0aW9ucyxNYXRJbmRleD4mIGV4cHIpOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpTcGFyc2VSZWZCYXNlPFJlZj4gQmFzZTsKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShSZWYpCisKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTxpbnQgT3RoZXJPcHRpb25zPgorICAgIGlubGluZSBSZWYoU3BhcnNlTWF0cml4PE1hdFNjYWxhcixPdGhlck9wdGlvbnMsTWF0SW5kZXg+JiBleHByKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsT3RoZXJPcHRpb25zLE1hdEluZGV4PiA+OjpNYXRjaEF0Q29tcGlsZVRpbWUpLCBTVE9SQUdFX0xBWU9VVF9ET0VTX05PVF9NQVRDSCk7CisgICAgICBlaWdlbl9hc3NlcnQoICgoT3B0aW9ucyAmIGludChTdGFuZGFyZENvbXByZXNzZWRGb3JtYXQpKT09MCkgfHwgKGV4cHIuaXNDb21wcmVzc2VkKCkpICk7CisgICAgICBCYXNlOjpjb25zdHJ1Y3QoZXhwci5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTxpbnQgT3RoZXJPcHRpb25zPgorICAgIGlubGluZSBSZWYoTWFwcGVkU3BhcnNlTWF0cml4PE1hdFNjYWxhcixPdGhlck9wdGlvbnMsTWF0SW5kZXg+JiBleHByKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChUcmFpdHM6OnRlbXBsYXRlIG1hdGNoPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsT3RoZXJPcHRpb25zLE1hdEluZGV4PiA+OjpNYXRjaEF0Q29tcGlsZVRpbWUpLCBTVE9SQUdFX0xBWU9VVF9ET0VTX05PVF9NQVRDSCk7CisgICAgICBlaWdlbl9hc3NlcnQoICgoT3B0aW9ucyAmIGludChTdGFuZGFyZENvbXByZXNzZWRGb3JtYXQpKT09MCkgfHwgKGV4cHIuaXNDb21wcmVzc2VkKCkpICk7CisgICAgICBCYXNlOjpjb25zdHJ1Y3QoZXhwci5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGlubGluZSBSZWYoY29uc3QgU3BhcnNlQ29tcHJlc3NlZEJhc2U8RGVyaXZlZD4mIGV4cHIpCisgICAgI2Vsc2UKKyAgICAvKiogSW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBhbnkgc3BhcnNlIGV4cHJlc3Npb24gKDJEIG1hdHJpeCBvciAxRCB2ZWN0b3IpICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBpbmxpbmUgUmVmKFNwYXJzZUNvbXByZXNzZWRCYXNlPERlcml2ZWQ+JiBleHByKQorICAgICNlbmRpZgorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChpbnRlcm5hbDo6aXNfbHZhbHVlPERlcml2ZWQ+Ojp2YWx1ZSksIFRISVNfRVhQUkVTU0lPTl9JU19OT1RfQV9MVkFMVUVfX0lUX0lTX1JFQURfT05MWSk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGJvb2woVHJhaXRzOjp0ZW1wbGF0ZSBtYXRjaDxEZXJpdmVkPjo6TWF0Y2hBdENvbXBpbGVUaW1lKSwgU1RPUkFHRV9MQVlPVVRfRE9FU19OT1RfTUFUQ0gpOworICAgICAgZWlnZW5fYXNzZXJ0KCAoKE9wdGlvbnMgJiBpbnQoU3RhbmRhcmRDb21wcmVzc2VkRm9ybWF0KSk9PTApIHx8IChleHByLmlzQ29tcHJlc3NlZCgpKSApOworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgIH0KK307CisKKy8vIHRoaXMgaXMgdGhlIGNvbnN0IHJlZiB2ZXJzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRTY2FsYXIsIGludCBNYXRPcHRpb25zLCB0eXBlbmFtZSBNYXRJbmRleCwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitjbGFzcyBSZWY8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4KKyAgOiBwdWJsaWMgaW50ZXJuYWw6OlNwYXJzZVJlZkJhc2U8UmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KK3sKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4gVFBsYWluT2JqZWN0VHlwZTsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8UmVmPiBUcmFpdHM7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlNwYXJzZVJlZkJhc2U8UmVmPiBCYXNlOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFJlZikKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgaW5saW5lIFJlZihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+JiBleHByKSA6IG1faGFzQ29weShmYWxzZSkKKyAgICB7CisgICAgICBjb25zdHJ1Y3QoZXhwci5kZXJpdmVkKCksIHR5cGVuYW1lIFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8RGVyaXZlZD46OnR5cGUoKSk7CisgICAgfQorCisgICAgaW5saW5lIFJlZihjb25zdCBSZWYmIG90aGVyKSA6IEJhc2Uob3RoZXIpLCBtX2hhc0NvcHkoZmFsc2UpIHsKKyAgICAgIC8vIGNvcHkgY29uc3RydWN0b3Igc2hhbGwgbm90IGNvcHkgdGhlIG1fb2JqZWN0LCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBtYWxsb2MgYW5kIGNvcHkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclJlZj4KKyAgICBpbmxpbmUgUmVmKGNvbnN0IFJlZkJhc2U8T3RoZXJSZWY+JiBvdGhlcikgOiBtX2hhc0NvcHkoZmFsc2UpIHsKKyAgICAgIGNvbnN0cnVjdChvdGhlci5kZXJpdmVkKCksIHR5cGVuYW1lIFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8T3RoZXJSZWY+Ojp0eXBlKCkpOworICAgIH0KKworICAgIH5SZWYoKSB7CisgICAgICBpZihtX2hhc0NvcHkpIHsKKyAgICAgICAgVFBsYWluT2JqZWN0VHlwZSogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxUUGxhaW5PYmplY3RUeXBlKj4obV9vYmplY3RfYnl0ZXMpOworICAgICAgICBvYmotPn5UUGxhaW5PYmplY3RUeXBlKCk7CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb24+CisgICAgdm9pZCBjb25zdHJ1Y3QoY29uc3QgRXhwcmVzc2lvbiYgZXhwcixpbnRlcm5hbDo6dHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIGlmKChPcHRpb25zICYgaW50KFN0YW5kYXJkQ29tcHJlc3NlZEZvcm1hdCkpICYmICghZXhwci5pc0NvbXByZXNzZWQoKSkpCisgICAgICB7CisgICAgICAgIFRQbGFpbk9iamVjdFR5cGUqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFBsYWluT2JqZWN0VHlwZSo+KG1fb2JqZWN0X2J5dGVzKTsKKyAgICAgICAgOjpuZXcgKG9iaikgVFBsYWluT2JqZWN0VHlwZShleHByKTsKKyAgICAgICAgbV9oYXNDb3B5ID0gdHJ1ZTsKKyAgICAgICAgQmFzZTo6Y29uc3RydWN0KCpvYmopOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBCYXNlOjpjb25zdHJ1Y3QoZXhwcik7CisgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvbj4KKyAgICB2b2lkIGNvbnN0cnVjdChjb25zdCBFeHByZXNzaW9uJiBleHByLCBpbnRlcm5hbDo6ZmFsc2VfdHlwZSkKKyAgICB7CisgICAgICBUUGxhaW5PYmplY3RUeXBlKiBvYmogPSByZWludGVycHJldF9jYXN0PFRQbGFpbk9iamVjdFR5cGUqPihtX29iamVjdF9ieXRlcyk7CisgICAgICA6Om5ldyAob2JqKSBUUGxhaW5PYmplY3RUeXBlKGV4cHIpOworICAgICAgbV9oYXNDb3B5ID0gdHJ1ZTsKKyAgICAgIEJhc2U6OmNvbnN0cnVjdCgqb2JqKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNoYXIgbV9vYmplY3RfYnl0ZXNbc2l6ZW9mKFRQbGFpbk9iamVjdFR5cGUpXTsKKyAgICBib29sIG1faGFzQ29weTsKK307CisKKworCisvKioKKyAgKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEEgc3BhcnNlIHZlY3RvciBleHByZXNzaW9uIHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIHNwYXJzZSB2ZWN0b3IgZXhwcmVzc2lvbgorICAqCisgICogXHRwYXJhbSBTcGFyc2VWZWN0b3JUeXBlIHRoZSBlcXVpdmFsZW50IHNwYXJzZSB2ZWN0b3IgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBkYXRhLCBpdCBtdXN0IGJlIGEgdGVtcGxhdGUgaW5zdGFuY2Ugb2YgY2xhc3MgU3BhcnNlVmVjdG9yLgorICAqCisgICogXHNhIGNsYXNzIFJlZgorICAqLworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgTWF0U2NhbGFyLCBpbnQgTWF0T3B0aW9ucywgdHlwZW5hbWUgTWF0SW5kZXgsIGludCBPcHRpb25zLCB0eXBlbmFtZSBTdHJpZGVUeXBlPgorY2xhc3MgUmVmPFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGUgPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6U3BhcnNlUmVmQmFzZTxSZWY8U3BhcnNlVmVjdG9yPE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZSA+ID4KKyNlbHNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VWZWN0b3JUeXBlPgorY2xhc3MgUmVmPFNwYXJzZVZlY3RvclR5cGU+CisgIDogcHVibGljIFNwYXJzZU1hcEJhc2U8RGVyaXZlZCxXcml0ZUFjY2Vzc29ycz4KKyNlbmRpZgoreworICAgIHR5cGVkZWYgU3BhcnNlVmVjdG9yPE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiBQbGFpbk9iamVjdFR5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFJlZj4gVHJhaXRzOworICAgIHRlbXBsYXRlPGludCBPdGhlck9wdGlvbnM+CisgICAgaW5saW5lIFJlZihjb25zdCBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE90aGVyT3B0aW9ucyxNYXRJbmRleD4mIGV4cHIpOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpTcGFyc2VSZWZCYXNlPFJlZj4gQmFzZTsKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShSZWYpCisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8aW50IE90aGVyT3B0aW9ucz4KKyAgICBpbmxpbmUgUmVmKFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsT3RoZXJPcHRpb25zLE1hdEluZGV4PiYgZXhwcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGJvb2woVHJhaXRzOjp0ZW1wbGF0ZSBtYXRjaDxTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE90aGVyT3B0aW9ucyxNYXRJbmRleD4gPjo6TWF0Y2hBdENvbXBpbGVUaW1lKSwgU1RPUkFHRV9MQVlPVVRfRE9FU19OT1RfTUFUQ0gpOworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGlubGluZSBSZWYoY29uc3QgU3BhcnNlQ29tcHJlc3NlZEJhc2U8RGVyaXZlZD4mIGV4cHIpCisgICAgI2Vsc2UKKyAgICAvKiogSW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBhbnkgMUQgc3BhcnNlIHZlY3RvciBleHByZXNzaW9uICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBpbmxpbmUgUmVmKFNwYXJzZUNvbXByZXNzZWRCYXNlPERlcml2ZWQ+JiBleHByKQorICAgICNlbmRpZgorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChpbnRlcm5hbDo6aXNfbHZhbHVlPERlcml2ZWQ+Ojp2YWx1ZSksIFRISVNfRVhQUkVTU0lPTl9JU19OT1RfQV9MVkFMVUVfX0lUX0lTX1JFQURfT05MWSk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGJvb2woVHJhaXRzOjp0ZW1wbGF0ZSBtYXRjaDxEZXJpdmVkPjo6TWF0Y2hBdENvbXBpbGVUaW1lKSwgU1RPUkFHRV9MQVlPVVRfRE9FU19OT1RfTUFUQ0gpOworICAgICAgQmFzZTo6Y29uc3RydWN0KGV4cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgIH0KK307CisKKy8vIHRoaXMgaXMgdGhlIGNvbnN0IHJlZiB2ZXJzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRTY2FsYXIsIGludCBNYXRPcHRpb25zLCB0eXBlbmFtZSBNYXRJbmRleCwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitjbGFzcyBSZWY8Y29uc3QgU3BhcnNlVmVjdG9yPE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4KKyAgOiBwdWJsaWMgaW50ZXJuYWw6OlNwYXJzZVJlZkJhc2U8UmVmPGNvbnN0IFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KK3sKKyAgICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4gVFBsYWluT2JqZWN0VHlwZTsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8UmVmPiBUcmFpdHM7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlNwYXJzZVJlZkJhc2U8UmVmPiBCYXNlOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFJlZikKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgaW5saW5lIFJlZihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+JiBleHByKSA6IG1faGFzQ29weShmYWxzZSkKKyAgICB7CisgICAgICBjb25zdHJ1Y3QoZXhwci5kZXJpdmVkKCksIHR5cGVuYW1lIFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8RGVyaXZlZD46OnR5cGUoKSk7CisgICAgfQorCisgICAgaW5saW5lIFJlZihjb25zdCBSZWYmIG90aGVyKSA6IEJhc2Uob3RoZXIpLCBtX2hhc0NvcHkoZmFsc2UpIHsKKyAgICAgIC8vIGNvcHkgY29uc3RydWN0b3Igc2hhbGwgbm90IGNvcHkgdGhlIG1fb2JqZWN0LCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBtYWxsb2MgYW5kIGNvcHkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclJlZj4KKyAgICBpbmxpbmUgUmVmKGNvbnN0IFJlZkJhc2U8T3RoZXJSZWY+JiBvdGhlcikgOiBtX2hhc0NvcHkoZmFsc2UpIHsKKyAgICAgIGNvbnN0cnVjdChvdGhlci5kZXJpdmVkKCksIHR5cGVuYW1lIFRyYWl0czo6dGVtcGxhdGUgbWF0Y2g8T3RoZXJSZWY+Ojp0eXBlKCkpOworICAgIH0KKworICAgIH5SZWYoKSB7CisgICAgICBpZihtX2hhc0NvcHkpIHsKKyAgICAgICAgVFBsYWluT2JqZWN0VHlwZSogb2JqID0gcmVpbnRlcnByZXRfY2FzdDxUUGxhaW5PYmplY3RUeXBlKj4obV9vYmplY3RfYnl0ZXMpOworICAgICAgICBvYmotPn5UUGxhaW5PYmplY3RUeXBlKCk7CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb24+CisgICAgdm9pZCBjb25zdHJ1Y3QoY29uc3QgRXhwcmVzc2lvbiYgZXhwcixpbnRlcm5hbDo6dHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIEJhc2U6OmNvbnN0cnVjdChleHByKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uPgorICAgIHZvaWQgY29uc3RydWN0KGNvbnN0IEV4cHJlc3Npb24mIGV4cHIsIGludGVybmFsOjpmYWxzZV90eXBlKQorICAgIHsKKyAgICAgIFRQbGFpbk9iamVjdFR5cGUqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VFBsYWluT2JqZWN0VHlwZSo+KG1fb2JqZWN0X2J5dGVzKTsKKyAgICAgIDo6bmV3IChvYmopIFRQbGFpbk9iamVjdFR5cGUoZXhwcik7CisgICAgICBtX2hhc0NvcHkgPSB0cnVlOworICAgICAgQmFzZTo6Y29uc3RydWN0KCpvYmopOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY2hhciBtX29iamVjdF9ieXRlc1tzaXplb2YoVFBsYWluT2JqZWN0VHlwZSldOworICAgIGJvb2wgbV9oYXNDb3B5OworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRklYTUUgc2hhbGwgd2UgaW50cm9kdWNlIGEgZ2VuZXJhbCBldmFsdWF0aW9yX3JlZiB0aGF0IHdlIGNhbiBzcGVjaWFsaXplIGZvciBhbnkgc3BhcnNlIG9iamVjdCBvbmNlLCBhbmQgdGh1cyByZW1vdmUgdGhpcyBjb3B5LXBhc3RhIHRoaW5nLi4uCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK3N0cnVjdCBldmFsdWF0b3I8UmVmPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KKyAgOiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8UmVmPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4gPgoreworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxSZWY8U3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPiA+IEJhc2U7CisgIHR5cGVkZWYgUmVmPFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+IFhwclR5cGU7ICAKKyAgZXZhbHVhdG9yKCkgOiBCYXNlKCkge30KKyAgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUgJm1hdCkgOiBCYXNlKG1hdCkge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK3N0cnVjdCBldmFsdWF0b3I8UmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KKyAgOiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8UmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4gPgoreworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxSZWY8Y29uc3QgU3BhcnNlTWF0cml4PE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPiA+IEJhc2U7CisgIHR5cGVkZWYgUmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+IFhwclR5cGU7ICAKKyAgZXZhbHVhdG9yKCkgOiBCYXNlKCkge30KKyAgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUgJm1hdCkgOiBCYXNlKG1hdCkge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdFNjYWxhciwgaW50IE1hdE9wdGlvbnMsIHR5cGVuYW1lIE1hdEluZGV4LCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK3N0cnVjdCBldmFsdWF0b3I8UmVmPFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4KKyAgOiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8UmVmPFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4gPgoreworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VDb21wcmVzc2VkQmFzZTxSZWY8U3BhcnNlVmVjdG9yPE1hdFNjYWxhcixNYXRPcHRpb25zLE1hdEluZGV4PiwgT3B0aW9ucywgU3RyaWRlVHlwZT4gPiA+IEJhc2U7CisgIHR5cGVkZWYgUmVmPFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+IFhwclR5cGU7CisgIGV2YWx1YXRvcigpIDogQmFzZSgpIHt9CisgIGV4cGxpY2l0IGV2YWx1YXRvcihjb25zdCBYcHJUeXBlICZtYXQpIDogQmFzZShtYXQpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRTY2FsYXIsIGludCBNYXRPcHRpb25zLCB0eXBlbmFtZSBNYXRJbmRleCwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yPFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlPiA+CisgIDogZXZhbHVhdG9yPFNwYXJzZUNvbXByZXNzZWRCYXNlPFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlPiA+ID4KK3sKKyAgdHlwZWRlZiBldmFsdWF0b3I8U3BhcnNlQ29tcHJlc3NlZEJhc2U8UmVmPGNvbnN0IFNwYXJzZVZlY3RvcjxNYXRTY2FsYXIsTWF0T3B0aW9ucyxNYXRJbmRleD4sIE9wdGlvbnMsIFN0cmlkZVR5cGU+ID4gPiBCYXNlOworICB0eXBlZGVmIFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8TWF0U2NhbGFyLE1hdE9wdGlvbnMsTWF0SW5kZXg+LCBPcHRpb25zLCBTdHJpZGVUeXBlPiBYcHJUeXBlOworICBldmFsdWF0b3IoKSA6IEJhc2UoKSB7fQorICBleHBsaWNpdCBldmFsdWF0b3IoY29uc3QgWHByVHlwZSAmbWF0KSA6IEJhc2UobWF0KSB7fQorfTsKKworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9SRUZfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU2VsZkFkam9pbnRWaWV3LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VTZWxmQWRqb2ludFZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI2NGYxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU2VsZkFkam9pbnRWaWV3LmgKQEAgLTAsMCArMSw2NTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9TRUxGQURKT0lOVFZJRVdfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfU0VMRkFESk9JTlRWSUVXX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisgIAorLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogXGNsYXNzIFNwYXJzZVNlbGZBZGpvaW50VmlldworICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHRvIG1hbmlwdWxhdGUgYSB0cmlhbmd1bGFyIHNwYXJzZSBtYXRyaXggYXMgYSBzZWxmYWRqb2ludCBtYXRyaXguCisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgZGVuc2UgbWF0cml4IHN0b3JpbmcgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBNb2RlIGNhbiBiZSBlaXRoZXIgXGMgI0xvd2VyIG9yIFxjICNVcHBlcgorICAqCisgICogVGhpcyBjbGFzcyBpcyBhbiBleHByZXNzaW9uIG9mIGEgc2VmbGFkam9pbnQgbWF0cml4IGZyb20gYSB0cmlhbmd1bGFyIHBhcnQgb2YgYSBtYXRyaXgKKyAgKiB3aXRoIGdpdmVuIGRlbnNlIHN0b3JhZ2Ugb2YgdGhlIGNvZWZmaWNpZW50cy4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OnNlbGZhZGpvaW50VmlldygpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgdGhhdCBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIFNwYXJzZU1hdHJpeEJhc2U6OnNlbGZhZGpvaW50VmlldygpCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgorc3RydWN0IHRyYWl0czxTcGFyc2VTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxNb2RlPiA+IDogdHJhaXRzPE1hdHJpeFR5cGU+IHsKK307CisKK3RlbXBsYXRlPGludCBTcmNNb2RlLGludCBEc3RNb2RlLHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IERlc3RPcmRlcj4KK3ZvaWQgcGVybXV0ZV9zeW1tX3RvX3N5bW0oY29uc3QgTWF0cml4VHlwZSYgbWF0LCBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLERlc3RPcmRlcix0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXg+JiBfZGVzdCwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4KiBwZXJtID0gMCk7CisKK3RlbXBsYXRlPGludCBNb2RlLHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IERlc3RPcmRlcj4KK3ZvaWQgcGVybXV0ZV9zeW1tX3RvX2Z1bGxzeW1tKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgU3BhcnNlTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcixEZXN0T3JkZXIsdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4PiYgX2Rlc3QsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCogcGVybSA9IDApOworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBfTW9kZT4gY2xhc3MgU3BhcnNlU2VsZkFkam9pbnRWaWV3CisgIDogcHVibGljIEVpZ2VuQmFzZTxTcGFyc2VTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxfTW9kZT4gPgoreworICBwdWJsaWM6CisgICAgCisgICAgZW51bSB7CisgICAgICBNb2RlID0gX01vZGUsCisgICAgICBUcmFuc3Bvc2VNb2RlID0gKChNb2RlICYgVXBwZXIpID8gTG93ZXIgOiAwKSB8ICgoTW9kZSAmIExvd2VyKSA/IFVwcGVyIDogMCksCisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlU2VsZkFkam9pbnRWaWV3Pjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlU2VsZkFkam9pbnRWaWV3Pjo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgICAgdHlwZWRlZiBFaWdlbkJhc2U8U3BhcnNlU2VsZkFkam9pbnRWaWV3PiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZWZfc2VsZWN0b3I8TWF0cml4VHlwZT46Om5vbl9jb25zdF90eXBlIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgICAKKyAgICBleHBsaWNpdCBpbmxpbmUgU3BhcnNlU2VsZkFkam9pbnRWaWV3KE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKT09Y29scygpICYmICJTZWxmQWRqb2ludFZpZXcgaXMgb25seSBmb3Igc3F1YXJlZCBtYXRyaWNlcyIpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIC8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG5lc3RlZCBtYXRyaXggKi8KKyAgICBjb25zdCBfTWF0cml4VHlwZU5lc3RlZCYgbWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSYgbWF0cml4KCkgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYXRyaXggcHJvZHVjdCBiZXR3ZWVuIGEgc3BhcnNlIHNlbGYtYWRqb2ludCBtYXRyaXggXGMgKnRoaXMgYW5kIGEgc3BhcnNlIG1hdHJpeCBcYSByaHMuCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBhbGdvcml0aG1pYyBhZHZhbnRhZ2Ugb2YgcGVyZm9ybWluZyBzdWNoIGEgcHJvZHVjdCBjb21wYXJlZCB0byBhIGdlbmVyYWwgc3BhcnNlLXNwYXJzZSBtYXRyaXggcHJvZHVjdC4KKyAgICAgICogSW5kZWVkLCB0aGUgU3BhcnNlU2VsZmFkam9pbnRWaWV3IG9wZXJhbmQgaXMgZmlyc3QgY29waWVkIGludG8gYSB0ZW1wb3JhcnkgU3BhcnNlTWF0cml4IGJlZm9yZSBjb21wdXRpbmcgdGhlIHByb2R1Y3QuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBQcm9kdWN0PFNwYXJzZVNlbGZBZGpvaW50VmlldywgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yKihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIHJocykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxTcGFyc2VTZWxmQWRqb2ludFZpZXcsIE90aGVyRGVyaXZlZD4oKnRoaXMsIHJocy5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYXRyaXggcHJvZHVjdCBiZXR3ZWVuIGEgc3BhcnNlIG1hdHJpeCBcYSBsaHMgYW5kIGEgc3BhcnNlIHNlbGYtYWRqb2ludCBtYXRyaXggXGEgcmhzLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gYWxnb3JpdGhtaWMgYWR2YW50YWdlIG9mIHBlcmZvcm1pbmcgc3VjaCBhIHByb2R1Y3QgY29tcGFyZWQgdG8gYSBnZW5lcmFsIHNwYXJzZS1zcGFyc2UgbWF0cml4IHByb2R1Y3QuCisgICAgICAqIEluZGVlZCwgdGhlIFNwYXJzZVNlbGZhZGpvaW50VmlldyBvcGVyYW5kIGlzIGZpcnN0IGNvcGllZCBpbnRvIGEgdGVtcG9yYXJ5IFNwYXJzZU1hdHJpeCBiZWZvcmUgY29tcHV0aW5nIHRoZSBwcm9kdWN0LgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIFByb2R1Y3Q8T3RoZXJEZXJpdmVkLCBTcGFyc2VTZWxmQWRqb2ludFZpZXc+CisgICAgb3BlcmF0b3IqKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgbGhzLCBjb25zdCBTcGFyc2VTZWxmQWRqb2ludFZpZXcmIHJocykKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxPdGhlckRlcml2ZWQsIFNwYXJzZVNlbGZBZGpvaW50Vmlldz4obGhzLmRlcml2ZWQoKSwgcmhzKTsKKyAgICB9CisgICAgCisgICAgLyoqIEVmZmljaWVudCBzcGFyc2Ugc2VsZi1hZGpvaW50IG1hdHJpeCB0aW1lcyBkZW5zZSB2ZWN0b3IvbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgUHJvZHVjdDxTcGFyc2VTZWxmQWRqb2ludFZpZXcsT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIHJocykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gUHJvZHVjdDxTcGFyc2VTZWxmQWRqb2ludFZpZXcsT3RoZXJEZXJpdmVkPigqdGhpcywgcmhzLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIEVmZmljaWVudCBkZW5zZSB2ZWN0b3IvbWF0cml4IHRpbWVzIHNwYXJzZSBzZWxmLWFkam9pbnQgbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIFByb2R1Y3Q8T3RoZXJEZXJpdmVkLFNwYXJzZVNlbGZBZGpvaW50Vmlldz4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBsaHMsIGNvbnN0IFNwYXJzZVNlbGZBZGpvaW50VmlldyYgcmhzKQorICAgIHsKKyAgICAgIHJldHVybiBQcm9kdWN0PE90aGVyRGVyaXZlZCxTcGFyc2VTZWxmQWRqb2ludFZpZXc+KGxocy5kZXJpdmVkKCksIHJocyk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm0gYSBzeW1tZXRyaWMgcmFuayBLIHVwZGF0ZSBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IFxjICp0aGlzOgorICAgICAgKiBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgKCB1IHVeKiApIFxmJCB3aGVyZSBcYSB1IGlzIGEgdmVjdG9yIG9yIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogVG8gcGVyZm9ybSBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgKCB1XiogdSApIFxmJCB5b3UgY2FuIHNpbXBseQorICAgICAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB1LmFkam9pbnQoKS4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFU+CisgICAgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiByYW5rVXBkYXRlKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZFU+JiB1LCBjb25zdCBTY2FsYXImIGFscGhhID0gU2NhbGFyKDEpKTsKKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBQIEggUF4tMSAqLworICAgIC8vIFRPRE8gaW1wbGVtZW50IHR3aXN0cyBpbiBhIG1vcmUgZXZhbHVhdG9yIGZyaWVuZGx5IGZhc2hpb24KKyAgICBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8X01hdHJpeFR5cGVOZXN0ZWQsTW9kZT4gdHdpc3RlZEJ5KGNvbnN0IFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxTdG9yYWdlSW5kZXg+JiBwZXJtKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8X01hdHJpeFR5cGVOZXN0ZWQsTW9kZT4obV9tYXRyaXgsIHBlcm0pOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNyY01hdHJpeFR5cGUsaW50IFNyY01vZGU+CisgICAgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PFNyY01hdHJpeFR5cGUsU3JjTW9kZT4mIHBlcm11dGVkTWF0cml4KQorICAgIHsKKyAgICAgIGludGVybmFsOjpjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXNfbm9fdHJhbnNwb3NlKCp0aGlzLCBwZXJtdXRlZE1hdHJpeCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiBzcmMpCisgICAgeworICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLFN0b3JhZ2VJbmRleD4gcG51bGw7CisgICAgICByZXR1cm4gKnRoaXMgPSBzcmMudHdpc3RlZEJ5KHBudWxsKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcmNNYXRyaXhUeXBlLHVuc2lnbmVkIGludCBTcmNNb2RlPgorICAgIFNwYXJzZVNlbGZBZGpvaW50VmlldyYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZVNlbGZBZGpvaW50VmlldzxTcmNNYXRyaXhUeXBlLFNyY01vZGU+JiBzcmMpCisgICAgeworICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLFN0b3JhZ2VJbmRleD4gcG51bGw7CisgICAgICByZXR1cm4gKnRoaXMgPSBzcmMudHdpc3RlZEJ5KHBudWxsKTsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHJvd3MpOworICAgICAgRUlHRU5fT05MWV9VU0VEX0ZPUl9ERUJVRyhjb2xzKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzID09IHRoaXMtPnJvd3MoKSAmJiBjb2xzID09IHRoaXMtPmNvbHMoKQorICAgICAgICAgICAgICAgICYmICJTcGFyc2VTZWxmYWRqb2ludFZpZXc6OnJlc2l6ZSgpIGRvZXMgbm90IGFjdHVhbGx5IGFsbG93IHRvIHJlc2l6ZS4iKTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKworICAgIE1hdHJpeFR5cGVOZXN0ZWQgbV9tYXRyaXg7CisgICAgLy9tdXRhYmxlIFZlY3RvckkgbV9jb3VudFBlclJvdzsKKyAgICAvL211dGFibGUgVmVjdG9ySSBtX2NvdW50UGVyQ29sOworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QgJikgY29uc3Q7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIFNwYXJzZU1hdHJpeEJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+Cit0eXBlbmFtZSBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGU8VXBMbz46OlR5cGUgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6c2VsZmFkam9pbnRWaWV3KCkgY29uc3QKK3sKKyAgcmV0dXJuIFNwYXJzZVNlbGZBZGpvaW50Vmlldzxjb25zdCBEZXJpdmVkLCBVcExvPihkZXJpdmVkKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+Cit0eXBlbmFtZSBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlIFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnNlbGZhZGpvaW50VmlldygpCit7CisgIHJldHVybiBTcGFyc2VTZWxmQWRqb2ludFZpZXc8RGVyaXZlZCwgVXBMbz4oZGVyaXZlZCgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBTcGFyc2VTZWxmQWRqb2ludFZpZXcgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRVPgorU3BhcnNlU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsTW9kZT4mCitTcGFyc2VTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxNb2RlPjo6cmFua1VwZGF0ZShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWRVPiYgdSwgY29uc3QgU2NhbGFyJiBhbHBoYSkKK3sKKyAgU3BhcnNlTWF0cml4PFNjYWxhciwoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpP1Jvd01ham9yOkNvbE1ham9yPiB0bXAgPSB1ICogdS5hZGpvaW50KCk7CisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgbV9tYXRyaXggPSB0bXAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsKKyAgZWxzZQorICAgIG1fbWF0cml4ICs9IGFscGhhICogdG1wLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKKy8vIFRPRE8gY3VycmVudGx5IGEgc2VsZmFkam9pbnQgZXhwcmVzc2lvbiBoYXMgdGhlIGZvcm0gU2VsZkFkam9pbnRWaWV3PC4sLj4KKy8vICAgICAgaW4gdGhlIGZ1dHVyZSBzZWxmYWRqb2ludC1uZXNzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBleHByZXNzaW9uIHRyYWl0cworLy8gICAgICBzdWNoIHRoYXQgVHJhbnNwb3NlPFNlbGZBZGpvaW50VmlldzwuLC4+ID4gaXMgdmFsaWQuIChjdXJyZW50bHkgVHJpYW5ndWxhckJhc2U6OnRyYW5zcG9zZSgpIGlzIG92ZXJsb2FkZWQgdG8gbWFrZSBpdCB3b3JrKQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+CitzdHJ1Y3QgZXZhbHVhdG9yX3RyYWl0czxTcGFyc2VTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxNb2RlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RvcmFnZV9raW5kX3RvX2V2YWx1YXRvcl9raW5kPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VLaW5kPjo6S2luZCBLaW5kOworICB0eXBlZGVmIFNwYXJzZVNlbGZBZGpvaW50U2hhcGUgU2hhcGU7Cit9OworCitzdHJ1Y3QgU3BhcnNlU2VsZkFkam9pbnQyU3BhcnNlIHt9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxTcGFyc2VTaGFwZSxTcGFyc2VTZWxmQWRqb2ludFNoYXBlPiB7IHR5cGVkZWYgU3BhcnNlU2VsZkFkam9pbnQyU3BhcnNlIEtpbmQ7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBBc3NpZ25tZW50S2luZDxTcGFyc2VTZWxmQWRqb2ludFNoYXBlLFNwYXJzZVNoYXBlPiB7IHR5cGVkZWYgU3BhcnNlMlNwYXJzZSBLaW5kOyB9OworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZSwgdHlwZW5hbWUgRnVuY3Rvcj4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFNyY1hwclR5cGUsIEZ1bmN0b3IsIFNwYXJzZVNlbGZBZGpvaW50MlNwYXJzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEc3RYcHJUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4gQXNzaWduT3BUeXBlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3RTY2FsYXIsaW50IFN0b3JhZ2VPcmRlcj4KKyAgc3RhdGljIHZvaWQgcnVuKFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLFN0b3JhZ2VPcmRlcixTdG9yYWdlSW5kZXg+ICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgQXNzaWduT3BUeXBlJi8qZnVuYyovKQorICB7CisgICAgaW50ZXJuYWw6OnBlcm11dGVfc3ltbV90b19mdWxsc3ltbTxTcmNYcHJUeXBlOjpNb2RlPihzcmMubWF0cml4KCksIGRzdCk7CisgIH0KKworICAvLyBGSVhNRTogdGhlIGhhbmRsaW5nIG9mICs9IGFuZCAtPSBpbiBzcGFyc2UgbWF0cmljZXMgc2hvdWxkIGJlIGNsZWFudXAgc28gdGhhdCBuZXh0IHR3byBvdmVybG9hZHMgY291bGQgYmUgcmVkdWNlZCB0bzoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFNjYWxhcixpbnQgU3RvcmFnZU9yZGVyLHR5cGVuYW1lIEFzc2lnbkZ1bmM+CisgIHN0YXRpYyB2b2lkIHJ1bihTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixTdG9yYWdlT3JkZXIsU3RvcmFnZUluZGV4PiAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IEFzc2lnbkZ1bmMmIGZ1bmMpCisgIHsKKyAgICBTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixTdG9yYWdlT3JkZXIsU3RvcmFnZUluZGV4PiB0bXAoc3JjLnJvd3MoKSxzcmMuY29scygpKTsKKyAgICBydW4odG1wLCBzcmMsIEFzc2lnbk9wVHlwZSgpKTsKKyAgICBjYWxsX2Fzc2lnbm1lbnRfbm9fYWxpYXNfbm9fdHJhbnNwb3NlKGRzdCwgdG1wLCBmdW5jKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3RTY2FsYXIsaW50IFN0b3JhZ2VPcmRlcj4KKyAgc3RhdGljIHZvaWQgcnVuKFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLFN0b3JhZ2VPcmRlcixTdG9yYWdlSW5kZXg+ICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjphZGRfYXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+JiAvKiBmdW5jICovKQorICB7CisgICAgU3BhcnNlTWF0cml4PERlc3RTY2FsYXIsU3RvcmFnZU9yZGVyLFN0b3JhZ2VJbmRleD4gdG1wKHNyYy5yb3dzKCksc3JjLmNvbHMoKSk7CisgICAgcnVuKHRtcCwgc3JjLCBBc3NpZ25PcFR5cGUoKSk7CisgICAgZHN0ICs9IHRtcDsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3RTY2FsYXIsaW50IFN0b3JhZ2VPcmRlcj4KKyAgc3RhdGljIHZvaWQgcnVuKFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLFN0b3JhZ2VPcmRlcixTdG9yYWdlSW5kZXg+ICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsOjpzdWJfYXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+JiAvKiBmdW5jICovKQorICB7CisgICAgU3BhcnNlTWF0cml4PERlc3RTY2FsYXIsU3RvcmFnZU9yZGVyLFN0b3JhZ2VJbmRleD4gdG1wKHNyYy5yb3dzKCksc3JjLmNvbHMoKSk7CisgICAgcnVuKHRtcCwgc3JjLCBBc3NpZ25PcFR5cGUoKSk7CisgICAgZHN0IC09IHRtcDsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFNjYWxhcj4KKyAgc3RhdGljIHZvaWQgcnVuKER5bmFtaWNTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+JiBkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgQXNzaWduT3BUeXBlJi8qZnVuYyovKQorICB7CisgICAgLy8gVE9ETyBkaXJlY3RseSBldmFsdWF0ZSBpbnRvIGRzdDsKKyAgICBTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+IHRtcChkc3Qucm93cygpLGRzdC5jb2xzKCkpOworICAgIGludGVybmFsOjpwZXJtdXRlX3N5bW1fdG9fZnVsbHN5bW08U3JjWHByVHlwZTo6TW9kZT4oc3JjLm1hdHJpeCgpLCB0bXApOworICAgIGRzdCA9IHRtcDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2Ygc3BhcnNlIHNlbGYtYWRqb2ludCB0aW1lIGRlbnNlIG1hdHJpeAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgU3BhcnNlTGhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJlc1R5cGUsIHR5cGVuYW1lIEFscGhhVHlwZT4KK2lubGluZSB2b2lkIHNwYXJzZV9zZWxmYWRqb2ludF90aW1lX2RlbnNlX3Byb2R1Y3QoY29uc3QgU3BhcnNlTGhzVHlwZSYgbGhzLCBjb25zdCBEZW5zZVJoc1R5cGUmIHJocywgRGVuc2VSZXNUeXBlJiByZXMsIGNvbnN0IEFscGhhVHlwZSYgYWxwaGEpCit7CisgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcoYWxwaGEpOworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8U3BhcnNlTGhzVHlwZSxEZW5zZVJoc1R5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBTcGFyc2VMaHNUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFNwYXJzZUxoc1R5cGVOZXN0ZWQ+Ojp0eXBlIFNwYXJzZUxoc1R5cGVOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIGV2YWx1YXRvcjxTcGFyc2VMaHNUeXBlTmVzdGVkQ2xlYW5lZD4gTGhzRXZhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNFdmFsOjpJbm5lckl0ZXJhdG9yIExoc0l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZUxoc1R5cGU6OlNjYWxhciBMaHNTY2FsYXI7CisgIAorICBlbnVtIHsKKyAgICBMaHNJc1Jvd01ham9yID0gKExoc0V2YWw6OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQsCisgICAgUHJvY2Vzc0ZpcnN0SGFsZiA9CisgICAgICAgICAgICAgICgoTW9kZSYoVXBwZXJ8TG93ZXIpKT09KFVwcGVyfExvd2VyKSkKKyAgICAgICAgICB8fCAoIChNb2RlJlVwcGVyKSAmJiAhTGhzSXNSb3dNYWpvcikKKyAgICAgICAgICB8fCAoIChNb2RlJkxvd2VyKSAmJiBMaHNJc1Jvd01ham9yKSwKKyAgICBQcm9jZXNzU2Vjb25kSGFsZiA9ICFQcm9jZXNzRmlyc3RIYWxmCisgIH07CisgIAorICBTcGFyc2VMaHNUeXBlTmVzdGVkIGxoc19uZXN0ZWQobGhzKTsKKyAgTGhzRXZhbCBsaHNFdmFsKGxoc19uZXN0ZWQpOworCisgIC8vIHdvcmsgb24gb25lIGNvbHVtbiBhdCBvbmNlCisgIGZvciAoSW5kZXggaz0wOyBrPHJocy5jb2xzKCk7ICsraykKKyAgeworICAgIGZvciAoSW5kZXggaj0wOyBqPGxocy5vdXRlclNpemUoKTsgKytqKQorICAgIHsKKyAgICAgIExoc0l0ZXJhdG9yIGkobGhzRXZhbCxqKTsKKyAgICAgIC8vIGhhbmRsZSBkaWFnb25hbCBjb2VmZgorICAgICAgaWYgKFByb2Nlc3NTZWNvbmRIYWxmKQorICAgICAgeworICAgICAgICB3aGlsZSAoaSAmJiBpLmluZGV4KCk8aikgKytpOworICAgICAgICBpZihpICYmIGkuaW5kZXgoKT09aikKKyAgICAgICAgeworICAgICAgICAgIHJlcyhqLGspICs9IGFscGhhICogaS52YWx1ZSgpICogcmhzKGosayk7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIHByZW11bHRpcGxpZWQgcmhzIGZvciBzY2F0dGVycworICAgICAgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8QWxwaGFUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGU6OlNjYWxhcj46OlJldHVyblR5cGUgcmhzX2ooYWxwaGEqcmhzKGosaykpOworICAgICAgLy8gYWNjdW11bGF0b3IgZm9yIHBhcnRpYWwgc2NhbGFyIHByb2R1Y3QKKyAgICAgIHR5cGVuYW1lIERlbnNlUmVzVHlwZTo6U2NhbGFyIHJlc19qKDApOworICAgICAgZm9yKDsgKFByb2Nlc3NGaXJzdEhhbGYgPyBpICYmIGkuaW5kZXgoKSA8IGogOiBpKSA7ICsraSkKKyAgICAgIHsKKyAgICAgICAgTGhzU2NhbGFyIGxoc19paiA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYoIUxoc0lzUm93TWFqb3IpIGxoc19paiA9IG51bWV4dDo6Y29uaihsaHNfaWopOworICAgICAgICByZXNfaiArPSBsaHNfaWogKiByaHMoaS5pbmRleCgpLGspOworICAgICAgICByZXMoaS5pbmRleCgpLGspICs9IG51bWV4dDo6Y29uaihsaHNfaWopICogcmhzX2o7CisgICAgICB9CisgICAgICByZXMoaixrKSArPSBhbHBoYSAqIHJlc19qOworCisgICAgICAvLyBoYW5kbGUgZGlhZ29uYWwgY29lZmYKKyAgICAgIGlmIChQcm9jZXNzRmlyc3RIYWxmICYmIGkgJiYgKGkuaW5kZXgoKT09aikpCisgICAgICAgIHJlcyhqLGspICs9IGFscGhhICogaS52YWx1ZSgpICogcmhzKGosayk7CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVmlldywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFR5cGU+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzVmlldywgUmhzLCBTcGFyc2VTZWxmQWRqb2ludFNoYXBlLCBEZW5zZVNoYXBlLCBQcm9kdWN0VHlwZT4KKzogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxMaHNWaWV3LCBSaHMsIGdlbmVyaWNfcHJvZHVjdF9pbXBsPExoc1ZpZXcsIFJocywgU3BhcnNlU2VsZkFkam9pbnRTaGFwZSwgRGVuc2VTaGFwZSwgUHJvZHVjdFR5cGU+ID4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIGNvbnN0IExoc1ZpZXcmIGxoc1ZpZXcsIGNvbnN0IFJocyYgcmhzLCBjb25zdCB0eXBlbmFtZSBEZXN0OjpTY2FsYXImIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3OjpfTWF0cml4VHlwZU5lc3RlZCBMaHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWRfZXZhbDxMaHMsRHluYW1pYz46OnR5cGUgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8UmhzLER5bmFtaWM+Ojp0eXBlIFJoc05lc3RlZDsKKyAgICBMaHNOZXN0ZWQgbGhzTmVzdGVkKGxoc1ZpZXcubWF0cml4KCkpOworICAgIFJoc05lc3RlZCByaHNOZXN0ZWQocmhzKTsKKyAgICAKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NlbGZhZGpvaW50X3RpbWVfZGVuc2VfcHJvZHVjdDxMaHNWaWV3OjpNb2RlPihsaHNOZXN0ZWQsIHJoc05lc3RlZCwgZHN0LCBhbHBoYSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzVmlldywgaW50IFByb2R1Y3RUeXBlPgorc3RydWN0IGdlbmVyaWNfcHJvZHVjdF9pbXBsPExocywgUmhzVmlldywgRGVuc2VTaGFwZSwgU3BhcnNlU2VsZkFkam9pbnRTaGFwZSwgUHJvZHVjdFR5cGU+Cis6IGdlbmVyaWNfcHJvZHVjdF9pbXBsX2Jhc2U8TGhzLCBSaHNWaWV3LCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxMaHMsIFJoc1ZpZXcsIERlbnNlU2hhcGUsIFNwYXJzZVNlbGZBZGpvaW50U2hhcGUsIFByb2R1Y3RUeXBlPiA+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHN0YXRpYyB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZHN0LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzVmlldyYgcmhzVmlldywgY29uc3QgdHlwZW5hbWUgRGVzdDo6U2NhbGFyJiBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzVmlldzo6X01hdHJpeFR5cGVOZXN0ZWQgUmhzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8TGhzLER5bmFtaWM+Ojp0eXBlIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPFJocyxEeW5hbWljPjo6dHlwZSBSaHNOZXN0ZWQ7CisgICAgTGhzTmVzdGVkIGxoc05lc3RlZChsaHMpOworICAgIFJoc05lc3RlZCByaHNOZXN0ZWQocmhzVmlldy5tYXRyaXgoKSk7CisgICAgCisgICAgLy8gdHJhbnNwb3NlIGV2ZXJ5dGhpbmcKKyAgICBUcmFuc3Bvc2U8RGVzdD4gZHN0VChkc3QpOworICAgIGludGVybmFsOjpzcGFyc2Vfc2VsZmFkam9pbnRfdGltZV9kZW5zZV9wcm9kdWN0PFJoc1ZpZXc6OlRyYW5zcG9zZU1vZGU+KHJoc05lc3RlZC50cmFuc3Bvc2UoKSwgbGhzTmVzdGVkLnRyYW5zcG9zZSgpLCBkc3RULCBhbHBoYSk7CisgIH0KK307CisKKy8vIE5PVEU6IHRoZXNlIHR3byBvdmVybG9hZHMgYXJlIG5lZWRlZCB0byBldmFsdWF0ZSB0aGUgc3BhcnNlIHNlbGZhZGpvaW50IHZpZXcgaW50byBhIGZ1bGwgc3BhcnNlIG1hdHJpeAorLy8gVE9ETzogbWF5YmUgdGhlIGNvcHkgY291bGQgYmUgaGFuZGxlZCBieSBnZW5lcmljX3Byb2R1Y3RfaW1wbCBzbyB0aGF0IHRoZXNlIG92ZXJsb2FkcyB3b3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVmlldywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdFRhZz4KK3N0cnVjdCBwcm9kdWN0X2V2YWx1YXRvcjxQcm9kdWN0PExoc1ZpZXcsIFJocywgRGVmYXVsdFByb2R1Y3Q+LCBQcm9kdWN0VGFnLCBTcGFyc2VTZWxmQWRqb2ludFNoYXBlLCBTcGFyc2VTaGFwZT4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yPHR5cGVuYW1lIFByb2R1Y3Q8dHlwZW5hbWUgUmhzOjpQbGFpbk9iamVjdCwgUmhzLCBEZWZhdWx0UHJvZHVjdD46OlBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIFByb2R1Y3Q8TGhzVmlldywgUmhzLCBEZWZhdWx0UHJvZHVjdD4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgdHlwZWRlZiBldmFsdWF0b3I8UGxhaW5PYmplY3Q+IEJhc2U7CisKKyAgcHJvZHVjdF9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKQorICAgIDogbV9saHMoeHByLmxocygpKSwgbV9yZXN1bHQoeHByLnJvd3MoKSwgeHByLmNvbHMoKSkKKyAgeworICAgIDo6bmV3IChzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykpIEJhc2UobV9yZXN1bHQpOworICAgIGdlbmVyaWNfcHJvZHVjdF9pbXBsPHR5cGVuYW1lIFJoczo6UGxhaW5PYmplY3QsIFJocywgU3BhcnNlU2hhcGUsIFNwYXJzZVNoYXBlLCBQcm9kdWN0VGFnPjo6ZXZhbFRvKG1fcmVzdWx0LCBtX2xocywgeHByLnJocygpKTsKKyAgfQorICAKK3Byb3RlY3RlZDoKKyAgdHlwZW5hbWUgUmhzOjpQbGFpbk9iamVjdCBtX2xoczsKKyAgUGxhaW5PYmplY3QgbV9yZXN1bHQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJoc1ZpZXcsIGludCBQcm9kdWN0VGFnPgorc3RydWN0IHByb2R1Y3RfZXZhbHVhdG9yPFByb2R1Y3Q8TGhzLCBSaHNWaWV3LCBEZWZhdWx0UHJvZHVjdD4sIFByb2R1Y3RUYWcsIFNwYXJzZVNoYXBlLCBTcGFyc2VTZWxmQWRqb2ludFNoYXBlPgorICA6IHB1YmxpYyBldmFsdWF0b3I8dHlwZW5hbWUgUHJvZHVjdDxMaHMsIHR5cGVuYW1lIExoczo6UGxhaW5PYmplY3QsIERlZmF1bHRQcm9kdWN0Pjo6UGxhaW5PYmplY3Q+Cit7CisgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJoc1ZpZXcsIERlZmF1bHRQcm9kdWN0PiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICB0eXBlZGVmIGV2YWx1YXRvcjxQbGFpbk9iamVjdD4gQmFzZTsKKworICBwcm9kdWN0X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCisgICAgOiBtX3Jocyh4cHIucmhzKCkpLCBtX3Jlc3VsdCh4cHIucm93cygpLCB4cHIuY29scygpKQorICB7CisgICAgOjpuZXcgKHN0YXRpY19jYXN0PEJhc2UqPih0aGlzKSkgQmFzZShtX3Jlc3VsdCk7CisgICAgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TGhzLCB0eXBlbmFtZSBMaHM6OlBsYWluT2JqZWN0LCBTcGFyc2VTaGFwZSwgU3BhcnNlU2hhcGUsIFByb2R1Y3RUYWc+OjpldmFsVG8obV9yZXN1bHQsIHhwci5saHMoKSwgbV9yaHMpOworICB9CisgIAorcHJvdGVjdGVkOgorICB0eXBlbmFtZSBMaHM6OlBsYWluT2JqZWN0IG1fcmhzOworICBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2Ygc3ltbWV0cmljIGNvcGllcyBhbmQgcGVybXV0YXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgTW9kZSx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBEZXN0T3JkZXI+Cit2b2lkIHBlcm11dGVfc3ltbV90b19mdWxsc3ltbShjb25zdCBNYXRyaXhUeXBlJiBtYXQsIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsRGVzdE9yZGVyLHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleD4mIF9kZXN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXgqIHBlcm0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsRGVzdE9yZGVyLFN0b3JhZ2VJbmRleD4gRGVzdDsKKyAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgdHlwZWRlZiBldmFsdWF0b3I8TWF0cml4VHlwZT4gTWF0RXZhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8TWF0cml4VHlwZT46OklubmVySXRlcmF0b3IgTWF0SXRlcmF0b3I7CisgIAorICBNYXRFdmFsIG1hdEV2YWwobWF0KTsKKyAgRGVzdCYgZGVzdChfZGVzdC5kZXJpdmVkKCkpOworICBlbnVtIHsKKyAgICBTdG9yYWdlT3JkZXJNYXRjaCA9IGludChEZXN0OjpJc1Jvd01ham9yKSA9PSBpbnQoTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgfTsKKyAgCisgIEluZGV4IHNpemUgPSBtYXQucm93cygpOworICBWZWN0b3JJIGNvdW50OworICBjb3VudC5yZXNpemUoc2l6ZSk7CisgIGNvdW50LnNldFplcm8oKTsKKyAgZGVzdC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgZm9yKEluZGV4IGogPSAwOyBqPHNpemU7ICsraikKKyAgeworICAgIEluZGV4IGpwID0gcGVybSA/IHBlcm1bal0gOiBqOworICAgIGZvcihNYXRJdGVyYXRvciBpdChtYXRFdmFsLGopOyBpdDsgKytpdCkKKyAgICB7CisgICAgICBJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIEluZGV4IHIgPSBpdC5yb3coKTsKKyAgICAgIEluZGV4IGMgPSBpdC5jb2woKTsKKyAgICAgIEluZGV4IGlwID0gcGVybSA/IHBlcm1baV0gOiBpOworICAgICAgaWYoTW9kZT09KFVwcGVyfExvd2VyKSkKKyAgICAgICAgY291bnRbU3RvcmFnZU9yZGVyTWF0Y2ggPyBqcCA6IGlwXSsrOworICAgICAgZWxzZSBpZihyPT1jKQorICAgICAgICBjb3VudFtpcF0rKzsKKyAgICAgIGVsc2UgaWYoKCBNb2RlPT1Mb3dlciAmJiByPmMpIHx8ICggTW9kZT09VXBwZXIgJiYgcjxjKSkKKyAgICAgIHsKKyAgICAgICAgY291bnRbaXBdKys7CisgICAgICAgIGNvdW50W2pwXSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBJbmRleCBubnogPSBjb3VudC5zdW0oKTsKKyAgCisgIC8vIHJlc2VydmUgc3BhY2UKKyAgZGVzdC5yZXNpemVOb25aZXJvcyhubnopOworICBkZXN0Lm91dGVySW5kZXhQdHIoKVswXSA9IDA7CisgIGZvcihJbmRleCBqPTA7IGo8c2l6ZTsgKytqKQorICAgIGRlc3Qub3V0ZXJJbmRleFB0cigpW2orMV0gPSBkZXN0Lm91dGVySW5kZXhQdHIoKVtqXSArIGNvdW50W2pdOworICBmb3IoSW5kZXggaj0wOyBqPHNpemU7ICsraikKKyAgICBjb3VudFtqXSA9IGRlc3Qub3V0ZXJJbmRleFB0cigpW2pdOworICAKKyAgLy8gY29weSBkYXRhCisgIGZvcihTdG9yYWdlSW5kZXggaiA9IDA7IGo8c2l6ZTsgKytqKQorICB7CisgICAgZm9yKE1hdEl0ZXJhdG9yIGl0KG1hdEV2YWwsaik7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCBpID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihpdC5pbmRleCgpKTsKKyAgICAgIEluZGV4IHIgPSBpdC5yb3coKTsKKyAgICAgIEluZGV4IGMgPSBpdC5jb2woKTsKKyAgICAgIAorICAgICAgU3RvcmFnZUluZGV4IGpwID0gcGVybSA/IHBlcm1bal0gOiBqOworICAgICAgU3RvcmFnZUluZGV4IGlwID0gcGVybSA/IHBlcm1baV0gOiBpOworICAgICAgCisgICAgICBpZihNb2RlPT0oVXBwZXJ8TG93ZXIpKQorICAgICAgeworICAgICAgICBJbmRleCBrID0gY291bnRbU3RvcmFnZU9yZGVyTWF0Y2ggPyBqcCA6IGlwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IFN0b3JhZ2VPcmRlck1hdGNoID8gaXAgOiBqcDsKKyAgICAgICAgZGVzdC52YWx1ZVB0cigpW2tdID0gaXQudmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYocj09YykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggayA9IGNvdW50W2lwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IGlwOworICAgICAgICBkZXN0LnZhbHVlUHRyKClba10gPSBpdC52YWx1ZSgpOworICAgICAgfQorICAgICAgZWxzZSBpZigoIChNb2RlJkxvd2VyKT09TG93ZXIgJiYgcj5jKSB8fCAoIChNb2RlJlVwcGVyKT09VXBwZXIgJiYgcjxjKSkKKyAgICAgIHsKKyAgICAgICAgaWYoIVN0b3JhZ2VPcmRlck1hdGNoKQorICAgICAgICAgIHN0ZDo6c3dhcChpcCxqcCk7CisgICAgICAgIEluZGV4IGsgPSBjb3VudFtqcF0rKzsKKyAgICAgICAgZGVzdC5pbm5lckluZGV4UHRyKClba10gPSBpcDsKKyAgICAgICAgZGVzdC52YWx1ZVB0cigpW2tdID0gaXQudmFsdWUoKTsKKyAgICAgICAgayA9IGNvdW50W2lwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IGpwOworICAgICAgICBkZXN0LnZhbHVlUHRyKClba10gPSBudW1leHQ6OmNvbmooaXQudmFsdWUoKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPGludCBfU3JjTW9kZSxpbnQgX0RzdE1vZGUsdHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgRHN0T3JkZXI+Cit2b2lkIHBlcm11dGVfc3ltbV90b19zeW1tKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgU3BhcnNlTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcixEc3RPcmRlcix0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXg+JiBfZGVzdCwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4KiBwZXJtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcixEc3RPcmRlcixTdG9yYWdlSW5kZXg+JiBkZXN0KF9kZXN0LmRlcml2ZWQoKSk7CisgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IFZlY3Rvckk7CisgIHR5cGVkZWYgZXZhbHVhdG9yPE1hdHJpeFR5cGU+IE1hdEV2YWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPE1hdHJpeFR5cGU+OjpJbm5lckl0ZXJhdG9yIE1hdEl0ZXJhdG9yOworCisgIGVudW0geworICAgIFNyY09yZGVyID0gTWF0cml4VHlwZTo6SXNSb3dNYWpvciA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgU3RvcmFnZU9yZGVyTWF0Y2ggPSBpbnQoU3JjT3JkZXIpID09IGludChEc3RPcmRlciksCisgICAgRHN0TW9kZSA9IERzdE9yZGVyPT1Sb3dNYWpvciA/IChfRHN0TW9kZT09VXBwZXIgPyBMb3dlciA6IFVwcGVyKSA6IF9Ec3RNb2RlLAorICAgIFNyY01vZGUgPSBTcmNPcmRlcj09Um93TWFqb3IgPyAoX1NyY01vZGU9PVVwcGVyID8gTG93ZXIgOiBVcHBlcikgOiBfU3JjTW9kZQorICB9OworCisgIE1hdEV2YWwgbWF0RXZhbChtYXQpOworICAKKyAgSW5kZXggc2l6ZSA9IG1hdC5yb3dzKCk7CisgIFZlY3RvckkgY291bnQoc2l6ZSk7CisgIGNvdW50LnNldFplcm8oKTsKKyAgZGVzdC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgZm9yKFN0b3JhZ2VJbmRleCBqID0gMDsgajxzaXplOyArK2opCisgIHsKKyAgICBTdG9yYWdlSW5kZXgganAgPSBwZXJtID8gcGVybVtqXSA6IGo7CisgICAgZm9yKE1hdEl0ZXJhdG9yIGl0KG1hdEV2YWwsaik7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIGlmKChpbnQoU3JjTW9kZSk9PWludChMb3dlcikgJiYgaTxqKSB8fCAoaW50KFNyY01vZGUpPT1pbnQoVXBwZXIpICYmIGk+aikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgCisgICAgICBTdG9yYWdlSW5kZXggaXAgPSBwZXJtID8gcGVybVtpXSA6IGk7CisgICAgICBjb3VudFtpbnQoRHN0TW9kZSk9PWludChMb3dlcikgPyAoc3RkOjptaW4pKGlwLGpwKSA6IChzdGQ6Om1heCkoaXAsanApXSsrOworICAgIH0KKyAgfQorICBkZXN0Lm91dGVySW5kZXhQdHIoKVswXSA9IDA7CisgIGZvcihJbmRleCBqPTA7IGo8c2l6ZTsgKytqKQorICAgIGRlc3Qub3V0ZXJJbmRleFB0cigpW2orMV0gPSBkZXN0Lm91dGVySW5kZXhQdHIoKVtqXSArIGNvdW50W2pdOworICBkZXN0LnJlc2l6ZU5vblplcm9zKGRlc3Qub3V0ZXJJbmRleFB0cigpW3NpemVdKTsKKyAgZm9yKEluZGV4IGo9MDsgajxzaXplOyArK2opCisgICAgY291bnRbal0gPSBkZXN0Lm91dGVySW5kZXhQdHIoKVtqXTsKKyAgCisgIGZvcihTdG9yYWdlSW5kZXggaiA9IDA7IGo8c2l6ZTsgKytqKQorICB7CisgICAgCisgICAgZm9yKE1hdEl0ZXJhdG9yIGl0KG1hdEV2YWwsaik7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIGlmKChpbnQoU3JjTW9kZSk9PWludChMb3dlcikgJiYgaTxqKSB8fCAoaW50KFNyY01vZGUpPT1pbnQoVXBwZXIpICYmIGk+aikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgCisgICAgICBTdG9yYWdlSW5kZXgganAgPSBwZXJtID8gcGVybVtqXSA6IGo7CisgICAgICBTdG9yYWdlSW5kZXggaXAgPSBwZXJtPyBwZXJtW2ldIDogaTsKKyAgICAgIAorICAgICAgSW5kZXggayA9IGNvdW50W2ludChEc3RNb2RlKT09aW50KExvd2VyKSA/IChzdGQ6Om1pbikoaXAsanApIDogKHN0ZDo6bWF4KShpcCxqcCldKys7CisgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IGludChEc3RNb2RlKT09aW50KExvd2VyKSA/IChzdGQ6Om1heCkoaXAsanApIDogKHN0ZDo6bWluKShpcCxqcCk7CisgICAgICAKKyAgICAgIGlmKCFTdG9yYWdlT3JkZXJNYXRjaCkgc3RkOjpzd2FwKGlwLGpwKTsKKyAgICAgIGlmKCAoKGludChEc3RNb2RlKT09aW50KExvd2VyKSAmJiBpcDxqcCkgfHwgKGludChEc3RNb2RlKT09aW50KFVwcGVyKSAmJiBpcD5qcCkpKQorICAgICAgICBkZXN0LnZhbHVlUHRyKClba10gPSBudW1leHQ6OmNvbmooaXQudmFsdWUoKSk7CisgICAgICBlbHNlCisgICAgICAgIGRlc3QudmFsdWVQdHIoKVtrXSA9IGl0LnZhbHVlKCk7CisgICAgfQorICB9Cit9CisKK30KKworLy8gVE9ETyBpbXBsZW1lbnQgdHdpc3RzIGluIGEgbW9yZSBldmFsdWF0b3IgZnJpZW5kbHkgZmFzaGlvbgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PE1hdHJpeFR5cGUsTW9kZT4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPiB7Cit9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IE1vZGU+CitjbGFzcyBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3QKKyAgOiBwdWJsaWMgRWlnZW5CYXNlPFNwYXJzZVN5bW1ldHJpY1Blcm11dGF0aW9uUHJvZHVjdDxNYXRyaXhUeXBlLE1vZGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0Pjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0Pjo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsU3RvcmFnZUluZGV4PiBQZXJtOworICBwdWJsaWM6CisgICAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBNYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKyAgICAKKyAgICBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3QoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBQZXJtJiBwZXJtKQorICAgICAgOiBtX21hdHJpeChtYXQpLCBtX3Blcm0ocGVybSkKKyAgICB7fQorICAgIAorICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICAgICAgCisgICAgY29uc3QgTmVzdGVkRXhwcmVzc2lvbiYgbWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgICBjb25zdCBQZXJtJiBwZXJtKCkgY29uc3QgeyByZXR1cm4gbV9wZXJtOyB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlTmVzdGVkIG1fbWF0cml4OworICAgIGNvbnN0IFBlcm0mIG1fcGVybTsKKworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgTW9kZSwgdHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PE1hdHJpeFR5cGUsTW9kZT4sIGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4sIFNwYXJzZTJTcGFyc2U+Cit7CisgIHR5cGVkZWYgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PE1hdHJpeFR5cGUsTW9kZT4gU3JjWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEc3RYcHJUeXBlOjpTdG9yYWdlSW5kZXggRHN0SW5kZXg7CisgIHRlbXBsYXRlPGludCBPcHRpb25zPgorICBzdGF0aWMgdm9pZCBydW4oU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zLERzdEluZGV4PiAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMsIGNvbnN0IGludGVybmFsOjphc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4gJikKKyAgeworICAgIC8vIGludGVybmFsOjpwZXJtdXRlX3N5bW1fdG9fZnVsbHN5bW08TW9kZT4obV9tYXRyaXgsX2Rlc3QsbV9wZXJtLmluZGljZXMoKS5kYXRhKCkpOworICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsKE9wdGlvbnMmUm93TWFqb3IpPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsIERzdEluZGV4PiB0bXA7CisgICAgaW50ZXJuYWw6OnBlcm11dGVfc3ltbV90b19mdWxsc3ltbTxNb2RlPihzcmMubWF0cml4KCksdG1wLHNyYy5wZXJtKCkuaW5kaWNlcygpLmRhdGEoKSk7CisgICAgZHN0ID0gdG1wOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0VHlwZSx1bnNpZ25lZCBpbnQgRGVzdE1vZGU+CisgIHN0YXRpYyB2b2lkIHJ1bihTcGFyc2VTZWxmQWRqb2ludFZpZXc8RGVzdFR5cGUsRGVzdE1vZGU+JiBkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYywgY29uc3QgaW50ZXJuYWw6OmFzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPiAmKQorICB7CisgICAgaW50ZXJuYWw6OnBlcm11dGVfc3ltbV90b19zeW1tPE1vZGUsRGVzdE1vZGU+KHNyYy5tYXRyaXgoKSxkc3QubWF0cml4KCksc3JjLnBlcm0oKS5pbmRpY2VzKCkuZGF0YSgpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFX1NFTEZBREpPSU5UVklFV19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VTb2x2ZXJCYXNlLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VTb2x2ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjOWE0MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVNvbHZlckJhc2UuaApAQCAtMCwwICsxLDEyNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVNPTFZFUkJBU0VfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VTT0xWRVJCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLyoqIFxpbnRlcm5hbAorICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gc29sdmUgd2l0aCBhIHNwYXJzZSByaWdodC1oYW5kLXNpZGUgYW5kIHJlc3VsdC4KKyAgKiBUaGUgcmhzIGlzIGRlY29tcG9zZWQgaW50byBzbWFsbCB2ZXJ0aWNhbCBwYW5lbHMgd2hpY2ggYXJlIHNvbHZlZCB0aHJvdWdoIGRlbnNlIHRlbXBvcmFyaWVzLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgordHlwZW5hbWUgZW5hYmxlX2lmPFJoczo6Q29sc0F0Q29tcGlsZVRpbWUhPTEgJiYgRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWUhPTE+Ojp0eXBlCitzb2x2ZV9zcGFyc2VfdGhyb3VnaF9kZW5zZV9wYW5lbHMoY29uc3QgRGVjb21wb3NpdGlvbiAmZGVjLCBjb25zdCBSaHMmIHJocywgRGVzdCAmZGVzdCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUyk7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIERlc3RTY2FsYXI7CisgIC8vIHdlIHByb2Nlc3MgdGhlIHNwYXJzZSByaHMgcGVyIGJsb2NrIG9mIE5iQ29sc0F0T25jZSBjb2x1bW5zIHRlbXBvcmFyaWx5IHN0b3JlZCBpbnRvIGEgZGVuc2UgbWF0cml4LgorICBzdGF0aWMgY29uc3QgSW5kZXggTmJDb2xzQXRPbmNlID0gNDsKKyAgSW5kZXggcmhzQ29scyA9IHJocy5jb2xzKCk7CisgIEluZGV4IHNpemUgPSByaHMucm93cygpOworICAvLyB0aGUgdGVtcG9yYXJ5IG1hdHJpY2VzIGRvIG5vdCBuZWVkIG1vcmUgY29sdW1ucyB0aGFuIE5iQ29sc0F0T25jZToKKyAgSW5kZXggdG1wQ29scyA9IChzdGQ6Om1pbikocmhzQ29scywgTmJDb2xzQXRPbmNlKTsgCisgIEVpZ2VuOjpNYXRyaXg8RGVzdFNjYWxhcixEeW5hbWljLER5bmFtaWM+IHRtcChzaXplLHRtcENvbHMpOworICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYyxEeW5hbWljPiB0bXBYKHNpemUsdG1wQ29scyk7CisgIGZvcihJbmRleCBrPTA7IGs8cmhzQ29sczsgays9TmJDb2xzQXRPbmNlKQorICB7CisgICAgSW5kZXggYWN0dWFsQ29scyA9IHN0ZDo6bWluPEluZGV4PihyaHNDb2xzLWssIE5iQ29sc0F0T25jZSk7CisgICAgdG1wLmxlZnRDb2xzKGFjdHVhbENvbHMpID0gcmhzLm1pZGRsZUNvbHMoayxhY3R1YWxDb2xzKTsKKyAgICB0bXBYLmxlZnRDb2xzKGFjdHVhbENvbHMpID0gZGVjLnNvbHZlKHRtcC5sZWZ0Q29scyhhY3R1YWxDb2xzKSk7CisgICAgZGVzdC5taWRkbGVDb2xzKGssYWN0dWFsQ29scykgPSB0bXBYLmxlZnRDb2xzKGFjdHVhbENvbHMpLnNwYXJzZVZpZXcoKTsKKyAgfQorfQorCisvLyBPdmVybG9hZCBmb3IgdmVjdG9yIGFzIHJocwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvbiwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgordHlwZW5hbWUgZW5hYmxlX2lmPFJoczo6Q29sc0F0Q29tcGlsZVRpbWU9PTEgfHwgRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWU9PTE+Ojp0eXBlCitzb2x2ZV9zcGFyc2VfdGhyb3VnaF9kZW5zZV9wYW5lbHMoY29uc3QgRGVjb21wb3NpdGlvbiAmZGVjLCBjb25zdCBSaHMmIHJocywgRGVzdCAmZGVzdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgRGVzdFNjYWxhcjsKKyAgSW5kZXggc2l6ZSA9IHJocy5yb3dzKCk7CisgIEVpZ2VuOjpNYXRyaXg8RGVzdFNjYWxhcixEeW5hbWljLDE+IHJoc19kZW5zZShyaHMpOworICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYywxPiBkZXN0X2RlbnNlKHNpemUpOworICBkZXN0X2RlbnNlID0gZGVjLnNvbHZlKHJoc19kZW5zZSk7CisgIGRlc3QgPSBkZXN0X2RlbnNlLnNwYXJzZVZpZXcoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcY2xhc3MgU3BhcnNlU29sdmVyQmFzZQorICAqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3Igc3BhcnNlIHNvbHZlcnMKKyAgKgorICAqIFx0cGFyYW0gRGVyaXZlZCB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIHNvbHZlci4KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZVNvbHZlckJhc2UgOiBpbnRlcm5hbDo6bm9uY29weWFibGUKK3sKKyAgcHVibGljOgorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KKyAgICBTcGFyc2VTb2x2ZXJCYXNlKCkKKyAgICAgIDogbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisKKyAgICB+U3BhcnNlU29sdmVyQmFzZSgpCisgICAge30KKworICAgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgU29sdmU8RGVyaXZlZCwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGRlcml2ZWQoKS5yb3dzKCk9PWIucm93cygpICYmICJzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxEZXJpdmVkLCBSaHM+KGRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgU29sdmU8RGVyaXZlZCwgUmhzPgorICAgIHNvbHZlKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGRlcml2ZWQoKS5yb3dzKCk9PWIucm93cygpICYmICJzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBTb2x2ZTxEZXJpdmVkLCBSaHM+KGRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFxpbnRlcm5hbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNvbHZpbmcgd2l0aCBhIHNwYXJzZSByaHMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiAmYiwgU3BhcnNlTWF0cml4QmFzZTxEZXN0PiAmZGVzdCkgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6c29sdmVfc3BhcnNlX3Rocm91Z2hfZGVuc2VfcGFuZWxzKGRlcml2ZWQoKSwgYi5kZXJpdmVkKCksIGRlc3QuZGVyaXZlZCgpKTsKKyAgICB9CisgICAgI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIG11dGFibGUgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVNPTFZFUkJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU3BhcnNlUHJvZHVjdFdpdGhQcnVuaW5nLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VTcGFyc2VQcm9kdWN0V2l0aFBydW5pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM0MTkwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU3BhcnNlUHJvZHVjdFdpdGhQcnVuaW5nLmgKQEAgLTAsMCArMSwxOTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVNQQVJTRVBST0RVQ1RXSVRIUFJVTklOR19ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVNQQVJTRVBST0RVQ1RXSVRIUFJVTklOR19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKKy8vIHBlcmZvcm0gYSBwc2V1ZG8gaW4tcGxhY2Ugc3BhcnNlICogc3BhcnNlIHByb2R1Y3QgYXNzdW1pbmcgYWxsIG1hdHJpY2VzIGFyZSBjb2wgbWFqb3IKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RhdGljIHZvaWQgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzLCBjb25zdCB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyJiB0b2xlcmFuY2UpCit7CisgIC8vIHJldHVybiBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGwyKGxocyxyaHMscmVzKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgLy8gbWFrZSBzdXJlIHRvIGNhbGwgaW5uZXJTaXplL291dGVyU2l6ZSBzaW5jZSB3ZSBmYWtlIHRoZSBzdG9yYWdlIG9yZGVyLgorICBJbmRleCByb3dzID0gbGhzLmlubmVyU2l6ZSgpOworICBJbmRleCBjb2xzID0gcmhzLm91dGVyU2l6ZSgpOworICAvL0luZGV4IHNpemUgPSBsaHMub3V0ZXJTaXplKCk7CisgIGVpZ2VuX2Fzc2VydChsaHMub3V0ZXJTaXplKCkgPT0gcmhzLmlubmVyU2l6ZSgpKTsKKworICAvLyBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIKKyAgQW1iaVZlY3RvcjxTY2FsYXIsU3RvcmFnZUluZGV4PiB0ZW1wVmVjdG9yKHJvd3MpOworCisgIC8vIG1pbWljcyBhIHJlc2l6ZUJ5SW5uZXJPdXRlcjoKKyAgaWYoUmVzdWx0VHlwZTo6SXNSb3dNYWpvcikKKyAgICByZXMucmVzaXplKGNvbHMsIHJvd3MpOworICBlbHNlCisgICAgcmVzLnJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgCisgIGV2YWx1YXRvcjxMaHM+IGxoc0V2YWwobGhzKTsKKyAgZXZhbHVhdG9yPFJocz4gcmhzRXZhbChyaHMpOworICAKKyAgLy8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBub24gemVybyBlbnRyaWVzCisgIC8vIGdpdmVuIGEgcmhzIGNvbHVtbiBjb250YWluaW5nIFkgbm9uIHplcm9zLCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVzcGVjdGl2ZSBZIGNvbHVtbnMKKyAgLy8gb2YgdGhlIGxocyBkaWZmZXJzIGluIGF2ZXJhZ2Ugb2Ygb25lIG5vbiB6ZXJvcywgdGh1cyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvcyBmb3IKKyAgLy8gdGhlIHByb2R1Y3Qgb2YgYSByaHMgY29sdW1uIHdpdGggdGhlIGxocyBpcyBYK1kgd2hlcmUgWCBpcyB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygbm9uIHplcm8KKyAgLy8gcGVyIGNvbHVtbiBvZiB0aGUgbGhzLgorICAvLyBUaGVyZWZvcmUsIHdlIGhhdmUgbm56KGxocypyaHMpID0gbm56KGxocykgKyBubnoocmhzKQorICBJbmRleCBlc3RpbWF0ZWRfbm56X3Byb2QgPSBsaHNFdmFsLm5vblplcm9zRXN0aW1hdGUoKSArIHJoc0V2YWwubm9uWmVyb3NFc3RpbWF0ZSgpOworCisgIHJlcy5yZXNlcnZlKGVzdGltYXRlZF9ubnpfcHJvZCk7CisgIGRvdWJsZSByYXRpb0NvbFJlcyA9IGRvdWJsZShlc3RpbWF0ZWRfbm56X3Byb2QpLyhkb3VibGUobGhzLnJvd3MoKSkqZG91YmxlKHJocy5jb2xzKCkpKTsKKyAgZm9yIChJbmRleCBqPTA7IGo8Y29sczsgKytqKQorICB7CisgICAgLy8gRklYTUU6CisgICAgLy9kb3VibGUgcmF0aW9Db2xSZXMgPSAoZG91YmxlKHJocy5pbm5lclZlY3RvcihqKS5ub25aZXJvcygpKSArIGRvdWJsZShsaHMubm9uWmVyb3MoKSkvZG91YmxlKGxocy5jb2xzKCkpKS9kb3VibGUobGhzLnJvd3MoKSk7CisgICAgLy8gbGV0J3MgZG8gYSBtb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgdGhlIG5ueiByYXRpbyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uIGogb2YgcmVzCisgICAgdGVtcFZlY3Rvci5pbml0KHJhdGlvQ29sUmVzKTsKKyAgICB0ZW1wVmVjdG9yLnNldFplcm8oKTsKKyAgICBmb3IgKHR5cGVuYW1lIGV2YWx1YXRvcjxSaHM+OjpJbm5lckl0ZXJhdG9yIHJoc0l0KHJoc0V2YWwsIGopOyByaHNJdDsgKytyaHNJdCkKKyAgICB7CisgICAgICAvLyBGSVhNRSBzaG91bGQgYmUgd3JpdHRlbiBsaWtlIHRoaXM6IHRtcCArPSByaHNJdC52YWx1ZSgpICogbGhzLmNvbChyaHNJdC5pbmRleCgpKQorICAgICAgdGVtcFZlY3Rvci5yZXN0YXJ0KCk7CisgICAgICBTY2FsYXIgeCA9IHJoc0l0LnZhbHVlKCk7CisgICAgICBmb3IgKHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIGxoc0l0KGxoc0V2YWwsIHJoc0l0LmluZGV4KCkpOyBsaHNJdDsgKytsaHNJdCkKKyAgICAgIHsKKyAgICAgICAgdGVtcFZlY3Rvci5jb2VmZlJlZihsaHNJdC5pbmRleCgpKSArPSBsaHNJdC52YWx1ZSgpICogeDsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzLnN0YXJ0VmVjKGopOworICAgIGZvciAodHlwZW5hbWUgQW1iaVZlY3RvcjxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6SXRlcmF0b3IgaXQodGVtcFZlY3Rvcix0b2xlcmFuY2UpOyBpdDsgKytpdCkKKyAgICAgIHJlcy5pbnNlcnRCYWNrQnlPdXRlcklubmVyKGosaXQuaW5kZXgoKSkgPSBpdC52YWx1ZSgpOworICB9CisgIHJlcy5maW5hbGl6ZSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZSwKKyAgaW50IExoc1N0b3JhZ2VPcmRlciA9IHRyYWl0czxMaHM+OjpGbGFncyZSb3dNYWpvckJpdCwKKyAgaW50IFJoc1N0b3JhZ2VPcmRlciA9IHRyYWl0czxSaHM+OjpGbGFncyZSb3dNYWpvckJpdCwKKyAgaW50IFJlc1N0b3JhZ2VPcmRlciA9IHRyYWl0czxSZXN1bHRUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQ+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsQ29sTWFqb3IsQ29sTWFqb3IsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSZXN1bHRUeXBlPjo6dHlwZSBfcmVzKHJlcy5yb3dzKCksIHJlcy5jb2xzKCkpOworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGw8TGhzLFJocyxSZXN1bHRUeXBlPihsaHMsIHJocywgX3JlcywgdG9sZXJhbmNlKTsKKyAgICByZXMuc3dhcChfcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsQ29sTWFqb3IsQ29sTWFqb3IsUm93TWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIGNvbnN0IFJlYWxTY2FsYXImIHRvbGVyYW5jZSkKKyAgeworICAgIC8vIHdlIG5lZWQgYSBjb2wtbWFqb3IgbWF0cml4IHRvIGhvbGQgdGhlIHJlc3VsdAorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBSZXN1bHRUeXBlOjpTdG9yYWdlSW5kZXg+IFNwYXJzZVRlbXBvcmFyeVR5cGU7CisgICAgU3BhcnNlVGVtcG9yYXJ5VHlwZSBfcmVzKHJlcy5yb3dzKCksIHJlcy5jb2xzKCkpOworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGw8TGhzLFJocyxTcGFyc2VUZW1wb3JhcnlUeXBlPihsaHMsIHJocywgX3JlcywgdG9sZXJhbmNlKTsKKyAgICByZXMgPSBfcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgLy8gbGV0J3MgdHJhbnNwb3NlIHRoZSBwcm9kdWN0IHRvIGdldCBhIGNvbHVtbiB4IGNvbHVtbiBwcm9kdWN0CisgICAgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSZXN1bHRUeXBlPjo6dHlwZSBfcmVzKHJlcy5yb3dzKCksIHJlcy5jb2xzKCkpOworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGw8UmhzLExocyxSZXN1bHRUeXBlPihyaHMsIGxocywgX3JlcywgdG9sZXJhbmNlKTsKKyAgICByZXMuc3dhcChfcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIGNvbnN0IFJlYWxTY2FsYXImIHRvbGVyYW5jZSkKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcix0eXBlbmFtZSBMaHM6OlN0b3JhZ2VJbmRleD4gQ29sTWFqb3JNYXRyaXhMaHM7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yLHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4PiBDb2xNYWpvck1hdHJpeFJoczsKKyAgICBDb2xNYWpvck1hdHJpeExocyBjb2xMaHMobGhzKTsKKyAgICBDb2xNYWpvck1hdHJpeFJocyBjb2xSaHMocmhzKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsPENvbE1ham9yTWF0cml4TGhzLENvbE1ham9yTWF0cml4UmhzLFJlc3VsdFR5cGU+KGNvbExocywgY29sUmhzLCByZXMsIHRvbGVyYW5jZSk7CisKKyAgICAvLyBsZXQncyB0cmFuc3Bvc2UgdGhlIHByb2R1Y3QgdG8gZ2V0IGEgY29sdW1uIHggY29sdW1uIHByb2R1Y3QKKy8vICAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXI+IFNwYXJzZVRlbXBvcmFyeVR5cGU7CisvLyAgICAgU3BhcnNlVGVtcG9yYXJ5VHlwZSBfcmVzKHJlcy5jb2xzKCksIHJlcy5yb3dzKCkpOworLy8gICAgIHNwYXJzZV9zcGFyc2VfcHJvZHVjdF93aXRoX3BydW5pbmdfaW1wbDxSaHMsTGhzLFNwYXJzZVRlbXBvcmFyeVR5cGU+KHJocywgbGhzLCBfcmVzKTsKKy8vICAgICByZXMgPSBfcmVzLnRyYW5zcG9zZSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxDb2xNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLFJvd01ham9yLHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4PiBSb3dNYWpvck1hdHJpeExoczsKKyAgICBSb3dNYWpvck1hdHJpeExocyByb3dMaHMobGhzKTsKKyAgICBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPFJvd01ham9yTWF0cml4TGhzLFJocyxSZXN1bHRUeXBlLFJvd01ham9yLFJvd01ham9yPihyb3dMaHMscmhzLHJlcyx0b2xlcmFuY2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLFJvd01ham9yLHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4PiBSb3dNYWpvck1hdHJpeFJoczsKKyAgICBSb3dNYWpvck1hdHJpeFJocyByb3dSaHMocmhzKTsKKyAgICBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSb3dNYWpvck1hdHJpeFJocyxSZXN1bHRUeXBlLFJvd01ham9yLFJvd01ham9yLFJvd01ham9yPihsaHMscm93UmhzLHJlcyx0b2xlcmFuY2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yLHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4PiBDb2xNYWpvck1hdHJpeFJoczsKKyAgICBDb2xNYWpvck1hdHJpeFJocyBjb2xSaHMocmhzKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsPExocyxDb2xNYWpvck1hdHJpeFJocyxSZXN1bHRUeXBlPihsaHMsIGNvbFJocywgcmVzLCB0b2xlcmFuY2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZXN1bHRUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgY29uc3QgUmVhbFNjYWxhciYgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yLHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4PiBDb2xNYWpvck1hdHJpeExoczsKKyAgICBDb2xNYWpvck1hdHJpeExocyBjb2xMaHMobGhzKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsPENvbE1ham9yTWF0cml4TGhzLFJocyxSZXN1bHRUeXBlPihjb2xMaHMsIHJocywgcmVzLCB0b2xlcmFuY2UpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VTUEFSU0VQUk9EVUNUV0lUSFBSVU5JTkdfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJhbnNwb3NlLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VUcmFuc3Bvc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU3ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJhbnNwb3NlLmgKQEAgLTAsMCArMSw5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFVFJBTlNQT1NFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFVFJBTlNQT1NFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IENvbXByZXNzZWRBY2Nlc3M9aW50KE1hdHJpeFR5cGU6OkZsYWdzJkNvbXByZXNzZWRBY2Nlc3NCaXQpPgorICBjbGFzcyBTcGFyc2VUcmFuc3Bvc2VJbXBsCisgICAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxUcmFuc3Bvc2U8TWF0cml4VHlwZT4gPgorICB7fTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIGNsYXNzIFNwYXJzZVRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxDb21wcmVzc2VkQWNjZXNzQml0PgorICAgIDogcHVibGljIFNwYXJzZUNvbXByZXNzZWRCYXNlPFRyYW5zcG9zZTxNYXRyaXhUeXBlPiA+CisgIHsKKyAgICB0eXBlZGVmIFNwYXJzZUNvbXByZXNzZWRCYXNlPFRyYW5zcG9zZTxNYXRyaXhUeXBlPiA+IEJhc2U7CisgIHB1YmxpYzoKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgICBpbmxpbmUgSW5kZXggbm9uWmVyb3MoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLm5vblplcm9zKCk7IH0KKyAgICAKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiB2YWx1ZVB0cigpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkudmFsdWVQdHIoKTsgfQorICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmlubmVySW5kZXhQdHIoKTsgfQorICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIG91dGVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLm91dGVySW5kZXhQdHIoKTsgfQorICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVyTm9uWmVyb1B0cigpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5uZXJOb25aZXJvUHRyKCk7IH0KKworICAgIGlubGluZSBTY2FsYXIqIHZhbHVlUHRyKCkgeyByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS52YWx1ZVB0cigpOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogaW5uZXJJbmRleFB0cigpIHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuaW5uZXJJbmRleFB0cigpOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIHsgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkub3V0ZXJJbmRleFB0cigpOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogaW5uZXJOb25aZXJvUHRyKCkgeyByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5pbm5lck5vblplcm9QdHIoKTsgfQorICB9OworfQorICAKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+CisgIDogcHVibGljIGludGVybmFsOjpTcGFyc2VUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGU+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIGludGVybmFsOjpTcGFyc2VUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGU+IEJhc2U7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfZXZhbHVhdG9yPFRyYW5zcG9zZTxBcmdUeXBlPiwgSXRlcmF0b3JCYXNlZD4KKyAgOiBwdWJsaWMgZXZhbHVhdG9yX2Jhc2U8VHJhbnNwb3NlPEFyZ1R5cGU+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxBcmdUeXBlPjo6SW5uZXJJdGVyYXRvciAgICAgICAgRXZhbEl0ZXJhdG9yOworICBwdWJsaWM6CisgICAgdHlwZWRlZiBUcmFuc3Bvc2U8QXJnVHlwZT4gWHByVHlwZTsKKyAgICAKKyAgICBpbmxpbmUgSW5kZXggbm9uWmVyb3NFc3RpbWF0ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtX2FyZ0ltcGwubm9uWmVyb3NFc3RpbWF0ZSgpOworICAgIH0KKworICAgIGNsYXNzIElubmVySXRlcmF0b3IgOiBwdWJsaWMgRXZhbEl0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIHVuYXJ5T3AsIEluZGV4IG91dGVyKQorICAgICAgICA6IEV2YWxJdGVyYXRvcih1bmFyeU9wLm1fYXJnSW1wbCxvdXRlcikKKyAgICAgIHt9CisgICAgICAKKyAgICAgIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIEV2YWxJdGVyYXRvcjo6Y29sKCk7IH0KKyAgICAgIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIEV2YWxJdGVyYXRvcjo6cm93KCk7IH0KKyAgICB9OworICAgIAorICAgIGVudW0geworICAgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCwKKyAgICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgICB9OworICAgIAorICAgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCkgOm1fYXJnSW1wbChvcC5uZXN0ZWRFeHByZXNzaW9uKCkpIHt9CisKKyAgcHJvdGVjdGVkOgorICAgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VUUkFOU1BPU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJpYW5ndWxhclZpZXcuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyaWFuZ3VsYXJWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMTIwMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyaWFuZ3VsYXJWaWV3LmgKQEAgLTAsMCArMSwxODkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9UUklBTkdVTEFSVklFV19ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9UUklBTkdVTEFSVklFV19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIGEgdHJpYW5ndWxhciBwYXJ0IGluIGEgXGIgc3BhcnNlIG1hdHJpeAorICAqCisgICogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGNsYXNzIFRyaWFuZ3VsYXJWaWV3LCBhbmQgb2JqZWN0cyBvZiB0eXBlIFRyaWFuZ3VsYXJWaWV3SW1wbCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAqIEl0IGV4dGVuZHMgY2xhc3MgVHJpYW5ndWxhclZpZXcgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3Igc3BhcnNlIGV4cHJlc3Npb25zIG9ubHkuCisgICoKKyAgKiBcc2EgY2xhc3MgVHJpYW5ndWxhclZpZXcsIFNwYXJzZU1hdHJpeEJhc2U6OnRyaWFuZ3VsYXJWaWV3KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPiBjbGFzcyBUcmlhbmd1bGFyVmlld0ltcGw8TWF0cml4VHlwZSxNb2RlLFNwYXJzZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+ID4KK3sKKyAgICBlbnVtIHsgU2tpcEZpcnN0ID0gKChNb2RlJkxvd2VyKSAmJiAhKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChNb2RlJlVwcGVyKSAmJiAgKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSksCisgICAgICAgICAgIFNraXBMYXN0ID0gIVNraXBGaXJzdCwKKyAgICAgICAgICAgU2tpcERpYWcgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwKKyAgICAgICAgICAgSGFzVW5pdERpYWcgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMAorICAgIH07CisgICAgCisgICAgdHlwZWRlZiBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+IFRyaWFuZ3VsYXJWaWV3VHlwZTsKKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIC8vIGR1bW15IHNvbHZlIGZ1bmN0aW9uIHRvIG1ha2UgVHJpYW5ndWxhclZpZXcgaGFwcHkuCisgICAgdm9pZCBzb2x2ZSgpIGNvbnN0OworCisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXhCYXNlPFRyaWFuZ3VsYXJWaWV3VHlwZT4gQmFzZTsKKyAgcHVibGljOgorICAgIAorICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFRyaWFuZ3VsYXJWaWV3VHlwZSkKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBNYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZE5vblJlZjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVHlwZSwgdHlwZW5hbWUgRHN0VHlwZT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHNUeXBlICZyaHMsIERzdFR5cGUgJmRzdCkgY29uc3QgeworICAgICAgaWYoIShpbnRlcm5hbDo6aXNfc2FtZTxSaHNUeXBlLERzdFR5cGU+Ojp2YWx1ZSAmJiBpbnRlcm5hbDo6ZXh0cmFjdF9kYXRhKGRzdCkgPT0gaW50ZXJuYWw6OmV4dHJhY3RfZGF0YShyaHMpKSkKKyAgICAgICAgZHN0ID0gcmhzOworICAgICAgdGhpcy0+c29sdmVJblBsYWNlKGRzdCk7CisgICAgfQorCisgICAgLyoqIEFwcGxpZXMgdGhlIGludmVyc2Ugb2YgXGMgKnRoaXMgdG8gdGhlIGRlbnNlIHZlY3RvciBvciBtYXRyaXggXGEgb3RoZXIsICJpbi1wbGFjZSIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHZvaWQgc29sdmVJblBsYWNlKE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgLyoqIEFwcGxpZXMgdGhlIGludmVyc2Ugb2YgXGMgKnRoaXMgdG8gdGhlIHNwYXJzZSB2ZWN0b3Igb3IgbWF0cml4IFxhIG90aGVyLCAiaW4tcGxhY2UiICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiB2b2lkIHNvbHZlSW5QbGFjZShTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKyAgCit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4KK3N0cnVjdCB1bmFyeV9ldmFsdWF0b3I8VHJpYW5ndWxhclZpZXc8QXJnVHlwZSxNb2RlPiwgSXRlcmF0b3JCYXNlZD4KKyA6IGV2YWx1YXRvcl9iYXNlPFRyaWFuZ3VsYXJWaWV3PEFyZ1R5cGUsTW9kZT4gPgoreworICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PEFyZ1R5cGUsTW9kZT4gWHByVHlwZTsKKyAgCitwcm90ZWN0ZWQ6CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8QXJnVHlwZT46OklubmVySXRlcmF0b3IgRXZhbEl0ZXJhdG9yOworICAKKyAgZW51bSB7IFNraXBGaXJzdCA9ICgoTW9kZSZMb3dlcikgJiYgIShBcmdUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoTW9kZSZVcHBlcikgJiYgIChBcmdUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkpLAorICAgICAgICAgU2tpcExhc3QgPSAhU2tpcEZpcnN0LAorICAgICAgICAgU2tpcERpYWcgPSAoTW9kZSZaZXJvRGlhZykgPyAxIDogMCwKKyAgICAgICAgIEhhc1VuaXREaWFnID0gKE1vZGUmVW5pdERpYWcpID8gMSA6IDAKKyAgfTsKKyAgCitwdWJsaWM6CisgIAorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZ1R5cGU+OjpDb2VmZlJlYWRDb3N0LAorICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgfTsKKyAgICAKKyAgZXhwbGljaXQgdW5hcnlfZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUgJnhwcikgOiBtX2FyZ0ltcGwoeHByLm5lc3RlZEV4cHJlc3Npb24oKSksIG1fYXJnKHhwci5uZXN0ZWRFeHByZXNzaW9uKCkpIHt9CisgIAorICBpbmxpbmUgSW5kZXggbm9uWmVyb3NFc3RpbWF0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9hcmdJbXBsLm5vblplcm9zRXN0aW1hdGUoKTsKKyAgfQorICAKKyAgY2xhc3MgSW5uZXJJdGVyYXRvciA6IHB1YmxpYyBFdmFsSXRlcmF0b3IKKyAgeworICAgICAgdHlwZWRlZiBFdmFsSXRlcmF0b3IgQmFzZTsKKyAgICBwdWJsaWM6CisKKyAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIHhwckV2YWwsIEluZGV4IG91dGVyKQorICAgICAgICA6IEJhc2UoeHByRXZhbC5tX2FyZ0ltcGwsb3V0ZXIpLCBtX3JldHVybk9uZShmYWxzZSksIG1fY29udGFpbnNEaWFnKEJhc2U6Om91dGVyKCk8eHByRXZhbC5tX2FyZy5pbm5lclNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgaWYoU2tpcEZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUoKCp0aGlzKSAmJiAoKEhhc1VuaXREaWFnfHxTa2lwRGlhZykgID8gdGhpcy0+aW5kZXgoKTw9b3V0ZXIgOiB0aGlzLT5pbmRleCgpPG91dGVyKSkKKyAgICAgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgICBpZihIYXNVbml0RGlhZykKKyAgICAgICAgICAgIG1fcmV0dXJuT25lID0gbV9jb250YWluc0RpYWc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihIYXNVbml0RGlhZyAmJiAoKCFCYXNlOjpvcGVyYXRvciBib29sKCkpIHx8IEJhc2U6OmluZGV4KCk+PUJhc2U6Om91dGVyKCkpKQorICAgICAgICB7CisgICAgICAgICAgaWYoKCFTa2lwRmlyc3QpICYmIEJhc2U6Om9wZXJhdG9yIGJvb2woKSkKKyAgICAgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgICBtX3JldHVybk9uZSA9IG1fY29udGFpbnNEaWFnOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgIGlmKEhhc1VuaXREaWFnICYmIG1fcmV0dXJuT25lKQorICAgICAgICAgIG1fcmV0dXJuT25lID0gZmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgICBpZihIYXNVbml0RGlhZyAmJiAoIVNraXBGaXJzdCkgJiYgKCghQmFzZTo6b3BlcmF0b3IgYm9vbCgpKSB8fCBCYXNlOjppbmRleCgpPj1CYXNlOjpvdXRlcigpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZigoIVNraXBGaXJzdCkgJiYgQmFzZTo6b3BlcmF0b3IgYm9vbCgpKQorICAgICAgICAgICAgICBCYXNlOjpvcGVyYXRvcisrKCk7CisgICAgICAgICAgICBtX3JldHVybk9uZSA9IG1fY29udGFpbnNEaWFnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmKEhhc1VuaXREaWFnICYmIG1fcmV0dXJuT25lKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZihTa2lwRmlyc3QpIHJldHVybiAgQmFzZTo6b3BlcmF0b3IgYm9vbCgpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoU2tpcERpYWcpIHJldHVybiAoQmFzZTo6b3BlcmF0b3IgYm9vbCgpICYmIHRoaXMtPmluZGV4KCkgPCB0aGlzLT5vdXRlcigpKTsKKyAgICAgICAgICBlbHNlIHJldHVybiAoQmFzZTo6b3BlcmF0b3IgYm9vbCgpICYmIHRoaXMtPmluZGV4KCkgPD0gdGhpcy0+b3V0ZXIoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworLy8gICAgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIChBcmdUeXBlOjpGbGFncyZSb3dNYWpvckJpdCA/IEJhc2U6Om91dGVyKCkgOiB0aGlzLT5pbmRleCgpKTsgfQorLy8gICAgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIChBcmdUeXBlOjpGbGFncyZSb3dNYWpvckJpdCA/IHRoaXMtPmluZGV4KCkgOiBCYXNlOjpvdXRlcigpKTsgfQorICAgICAgaW5saW5lIFN0b3JhZ2VJbmRleCBpbmRleCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmKEhhc1VuaXREaWFnICYmIG1fcmV0dXJuT25lKSAgcmV0dXJuIGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oQmFzZTo6b3V0ZXIoKSk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U6OmluZGV4KCk7CisgICAgICB9CisgICAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYoSGFzVW5pdERpYWcgJiYgbV9yZXR1cm5PbmUpICByZXR1cm4gU2NhbGFyKDEpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlOjp2YWx1ZSgpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgYm9vbCBtX3JldHVybk9uZTsKKyAgICAgIGJvb2wgbV9jb250YWluc0RpYWc7CisgICAgcHJpdmF0ZToKKyAgICAgIFNjYWxhciYgdmFsdWVSZWYoKTsKKyAgfTsKKyAgCitwcm90ZWN0ZWQ6CisgIGV2YWx1YXRvcjxBcmdUeXBlPiBtX2FyZ0ltcGw7CisgIGNvbnN0IEFyZ1R5cGUmIG1fYXJnOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgTW9kZT4KK2lubGluZSBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCBEZXJpdmVkLCBNb2RlPgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6dHJpYW5ndWxhclZpZXcoKSBjb25zdAoreworICByZXR1cm4gVHJpYW5ndWxhclZpZXc8Y29uc3QgRGVyaXZlZCwgTW9kZT4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfVFJJQU5HVUxBUlZJRVdfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVXRpbC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGYwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VVdGlsLmgKQEAgLTAsMCArMSwxNzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVVUSUxfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VVVElMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgRUlHRU5fREJHX1NQQVJTRShYKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fREJHX1NQQVJTRShYKSBYCisjZW5kaWYKKworI2RlZmluZSBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIE9wKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IFwKK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgb3BlcmF0b3IgT3AoY29uc3QgRWlnZW46OlNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIFwKK3sgXAorICByZXR1cm4gQmFzZTo6b3BlcmF0b3IgT3Aob3RoZXIuZGVyaXZlZCgpKTsgXAorfSBcCitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yIE9wKGNvbnN0IERlcml2ZWQmIG90aGVyKSBcCit7IFwKKyAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yIE9wKG90aGVyKTsgXAorfQorCisjZGVmaW5lIEVJR0VOX1NQQVJTRV9JTkhFUklUX1NDQUxBUl9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIE9wKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gXAorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvciBPcChjb25zdCBPdGhlciYgc2NhbGFyKSBcCit7IFwKKyAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yIE9wKHNjYWxhcik7IFwKK30KKworI2RlZmluZSBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhEZXJpdmVkKSBcCitFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsID0pCisKKworI2RlZmluZSBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShEZXJpdmVkKSBcCisgIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShEZXJpdmVkKQorCisgIAorY29uc3QgaW50IENvaGVyZW50QWNjZXNzUGF0dGVybiAgICAgPSAweDE7Citjb25zdCBpbnQgSW5uZXJSYW5kb21BY2Nlc3NQYXR0ZXJuICA9IDB4MiB8IENvaGVyZW50QWNjZXNzUGF0dGVybjsKK2NvbnN0IGludCBPdXRlclJhbmRvbUFjY2Vzc1BhdHRlcm4gID0gMHg0IHwgQ29oZXJlbnRBY2Nlc3NQYXR0ZXJuOworY29uc3QgaW50IFJhbmRvbUFjY2Vzc1BhdHRlcm4gICAgICAgPSAweDggfCBPdXRlclJhbmRvbUFjY2Vzc1BhdHRlcm4gfCBJbm5lclJhbmRvbUFjY2Vzc1BhdHRlcm47CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRmxhZ3MgPSAwLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4ID0gaW50PiAgY2xhc3MgU3BhcnNlTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDAsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXggPSBpbnQ+ICBjbGFzcyBEeW5hbWljU3BhcnNlTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDAsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXggPSBpbnQ+ICBjbGFzcyBTcGFyc2VWZWN0b3I7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0ZsYWdzID0gMCwgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleCA9IGludD4gIGNsYXNzIE1hcHBlZFNwYXJzZU1hdHJpeDsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+ICBjbGFzcyBTcGFyc2VTZWxmQWRqb2ludFZpZXc7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gICAgICAgICAgICAgIGNsYXNzIFNwYXJzZURpYWdvbmFsUHJvZHVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFNwYXJzZVZpZXc7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiAgICAgICAgY2xhc3MgU3BhcnNlU3BhcnNlUHJvZHVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiAgICAgICAgY2xhc3MgU3BhcnNlVGltZURlbnNlUHJvZHVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiAgICAgICAgY2xhc3MgRGVuc2VUaW1lU3BhcnNlUHJvZHVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBib29sIFRyYW5zcG9zZT4gY2xhc3MgU3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgU3BhcnNlU3BhcnNlUHJvZHVjdFJldHVyblR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywKKyAgICAgICAgIGludCBJbm5lclNpemUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoaW50ZXJuYWw6OnRyYWl0czxMaHM+OjpDb2xzQXRDb21waWxlVGltZSxpbnRlcm5hbDo6dHJhaXRzPFJocz46OlJvd3NBdENvbXBpbGVUaW1lKT4gc3RydWN0IERlbnNlU3BhcnNlUHJvZHVjdFJldHVyblR5cGU7CisgICAgICAgICAKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLAorICAgICAgICAgaW50IElubmVyU2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChpbnRlcm5hbDo6dHJhaXRzPExocz46OkNvbHNBdENvbXBpbGVUaW1lLGludGVybmFsOjp0cmFpdHM8UmhzPjo6Um93c0F0Q29tcGlsZVRpbWUpPiBzdHJ1Y3QgU3BhcnNlRGVuc2VQcm9kdWN0UmV0dXJuVHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IFVwTG8+IGNsYXNzIFNwYXJzZVN5bW1ldHJpY1Blcm11dGF0aW9uUHJvZHVjdDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgUm93cyxpbnQgQ29scyxpbnQgRmxhZ3M+IHN0cnVjdCBzcGFyc2VfZXZhbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGV2YWw8VCxTcGFyc2U+CisgIDogc3BhcnNlX2V2YWw8VCwgdHJhaXRzPFQ+OjpSb3dzQXRDb21waWxlVGltZSx0cmFpdHM8VD46OkNvbHNBdENvbXBpbGVUaW1lLHRyYWl0czxUPjo6RmxhZ3M+Cit7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgQ29scyxpbnQgRmxhZ3M+IHN0cnVjdCBzcGFyc2VfZXZhbDxULDEsQ29scyxGbGFncz4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFQ+OjpTY2FsYXIgX1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U3RvcmFnZUluZGV4IF9TdG9yYWdlSW5kZXg7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxfU2NhbGFyLCBSb3dNYWpvciwgX1N0b3JhZ2VJbmRleD4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsaW50IFJvd3MsaW50IEZsYWdzPiBzdHJ1Y3Qgc3BhcnNlX2V2YWw8VCxSb3dzLDEsRmxhZ3M+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlN0b3JhZ2VJbmRleCBfU3RvcmFnZUluZGV4OworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8X1NjYWxhciwgQ29sTWFqb3IsIF9TdG9yYWdlSW5kZXg+IHR5cGU7Cit9OworCisvLyBUT0RPIHRoaXMgc2VlbXMgYWxtb3N0IGlkZW50aWNhbCB0byBwbGFpbl9tYXRyaXhfdHlwZTxULCBTcGFyc2U+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULGludCBSb3dzLGludCBDb2xzLGludCBGbGFncz4gc3RydWN0IHNwYXJzZV9ldmFsIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlN0b3JhZ2VJbmRleCBfU3RvcmFnZUluZGV4OworICAgIGVudW0geyBfT3B0aW9ucyA9ICgoRmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yIH07CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsaW50IEZsYWdzPiBzdHJ1Y3Qgc3BhcnNlX2V2YWw8VCwxLDEsRmxhZ3M+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLCAxLCAxPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlPFQsU3BhcnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFQ+OjpTdG9yYWdlSW5kZXggX1N0b3JhZ2VJbmRleDsKKyAgZW51bSB7IF9PcHRpb25zID0gKChldmFsdWF0b3I8VD46OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciB9OworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9TdG9yYWdlSW5kZXg+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHBsYWluX29iamVjdF9ldmFsPFQsU3BhcnNlPgorICA6IHNwYXJzZV9ldmFsPFQsIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwgZXZhbHVhdG9yPFQ+OjpGbGFncz4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uLCB0eXBlbmFtZSBSaHNUeXBlPgorc3RydWN0IHNvbHZlX3RyYWl0czxEZWNvbXBvc2l0aW9uLFJoc1R5cGUsU3BhcnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHNwYXJzZV9ldmFsPFJoc1R5cGUsIFJoc1R5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBSaHNUeXBlOjpDb2xzQXRDb21waWxlVGltZSx0cmFpdHM8UmhzVHlwZT46OkZsYWdzPjo6dHlwZSBQbGFpbk9iamVjdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZ2VuZXJpY194cHJfYmFzZTxEZXJpdmVkLCBNYXRyaXhYcHIsIFNwYXJzZT4KK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+IHR5cGU7Cit9OworCitzdHJ1Y3QgU3BhcnNlVHJpYW5ndWxhclNoYXBlICB7IHN0YXRpYyBzdGQ6OnN0cmluZyBkZWJ1Z05hbWUoKSB7IHJldHVybiAiU3BhcnNlVHJpYW5ndWxhclNoYXBlIjsgfSB9Oworc3RydWN0IFNwYXJzZVNlbGZBZGpvaW50U2hhcGUgeyBzdGF0aWMgc3RkOjpzdHJpbmcgZGVidWdOYW1lKCkgeyByZXR1cm4gIlNwYXJzZVNlbGZBZGpvaW50U2hhcGUiOyB9IH07CisKK3RlbXBsYXRlPD4gc3RydWN0IGdsdWVfc2hhcGVzPFNwYXJzZVNoYXBlLFNlbGZBZGpvaW50U2hhcGU+IHsgdHlwZWRlZiBTcGFyc2VTZWxmQWRqb2ludFNoYXBlIHR5cGU7ICB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2x1ZV9zaGFwZXM8U3BhcnNlU2hhcGUsVHJpYW5ndWxhclNoYXBlID4geyB0eXBlZGVmIFNwYXJzZVRyaWFuZ3VsYXJTaGFwZSAgdHlwZTsgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmlwbGV0CisgICoKKyAgKiBcYnJpZWYgQSBzbWFsbCBzdHJ1Y3R1cmUgdG8gaG9sZCBhIG5vbiB6ZXJvIGFzIGEgdHJpcGxldCAoaSxqLHZhbHVlKS4KKyAgKgorICAqIFxzYSBTcGFyc2VNYXRyaXg6OnNldEZyb21UcmlwbGV0cygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD10eXBlbmFtZSBTcGFyc2VNYXRyaXg8U2NhbGFyPjo6U3RvcmFnZUluZGV4ID4KK2NsYXNzIFRyaXBsZXQKK3sKK3B1YmxpYzoKKyAgVHJpcGxldCgpIDogbV9yb3coMCksIG1fY29sKDApLCBtX3ZhbHVlKDApIHt9CisKKyAgVHJpcGxldChjb25zdCBTdG9yYWdlSW5kZXgmIGksIGNvbnN0IFN0b3JhZ2VJbmRleCYgaiwgY29uc3QgU2NhbGFyJiB2ID0gU2NhbGFyKDApKQorICAgIDogbV9yb3coaSksIG1fY29sKGopLCBtX3ZhbHVlKHYpCisgIHt9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgdGhlIGVsZW1lbnQgKi8KKyAgY29uc3QgU3RvcmFnZUluZGV4JiByb3coKSBjb25zdCB7IHJldHVybiBtX3JvdzsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBlbGVtZW50ICovCisgIGNvbnN0IFN0b3JhZ2VJbmRleCYgY29sKCkgY29uc3QgeyByZXR1cm4gbV9jb2w7IH0KKworICAvKiogXHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50ICovCisgIGNvbnN0IFNjYWxhciYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Citwcm90ZWN0ZWQ6CisgIFN0b3JhZ2VJbmRleCBtX3JvdywgbV9jb2w7CisgIFNjYWxhciBtX3ZhbHVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VVVElMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZlY3Rvci5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMGZiYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZlY3Rvci5oCkBAIC0wLDAgKzEsNDc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VWRUNUT1JfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VWRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogXGNsYXNzIFNwYXJzZVZlY3RvcgorICAqCisgICogXGJyaWVmIGEgc3BhcnNlIHZlY3RvciBjbGFzcworICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzCisgICoKKyAgKiBTZWUgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xpbmFsZy9odG1sX3RlbXBsYXRlcy9ub2RlOTEuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgc3RvcmFnZSBzY2hlbWUuCisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ19QbHVnaW5zIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX1NQQVJTRVZFQ1RPUl9QTFVHSU4uCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVZlY3RvcjxfU2NhbGFyLCBfT3B0aW9ucywgX1N0b3JhZ2VJbmRleD4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIF9TdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgZW51bSB7CisgICAgSXNDb2xWZWN0b3IgPSAoX09wdGlvbnMgJiBSb3dNYWpvckJpdCkgPyAwIDogMSwKKworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gSXNDb2xWZWN0b3IgPyBEeW5hbWljIDogMSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IElzQ29sVmVjdG9yID8gMSA6IER5bmFtaWMsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gX09wdGlvbnMgfCBOZXN0QnlSZWZCaXQgfCBMdmFsdWVCaXQgfCAoSXNDb2xWZWN0b3IgPyAwIDogUm93TWFqb3JCaXQpIHwgQ29tcHJlc3NlZEFjY2Vzc0JpdCwKKyAgICBTdXBwb3J0ZWRBY2Nlc3NQYXR0ZXJucyA9IElubmVyUmFuZG9tQWNjZXNzUGF0dGVybgorICB9OworfTsKKworLy8gU3BhcnNlLVZlY3Rvci1Bc3NpZ25tZW50IGtpbmRzOgorZW51bSB7CisgIFNWQV9SdW50aW1lU3dpdGNoLAorICBTVkFfSW5uZXIsCisgIFNWQV9PdXRlcgorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFNyYywKKyAgICAgICAgICBpbnQgQXNzaWdubWVudEtpbmQgPSAhYm9vbChTcmM6OklzVmVjdG9yQXRDb21waWxlVGltZSkgPyBTVkFfUnVudGltZVN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNyYzo6SW5uZXJTaXplQXRDb21waWxlVGltZT09MSA/IFNWQV9PdXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNWQV9Jbm5lcj4KK3N0cnVjdCBzcGFyc2VfdmVjdG9yX2Fzc2lnbl9zZWxlY3RvcjsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitjbGFzcyBTcGFyc2VWZWN0b3IKKyAgOiBwdWJsaWMgU3BhcnNlQ29tcHJlc3NlZEJhc2U8U3BhcnNlVmVjdG9yPF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgICAgdHlwZWRlZiBTcGFyc2VDb21wcmVzc2VkQmFzZTxTcGFyc2VWZWN0b3I+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29udmVydF9pbmRleDsKKyAgcHVibGljOgorICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZVZlY3RvcikKKyAgICBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKFNwYXJzZVZlY3RvciwgKz0pCisgICAgRUlHRU5fU1BBUlNFX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihTcGFyc2VWZWN0b3IsIC09KQorICAgIAorICAgIHR5cGVkZWYgaW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixTdG9yYWdlSW5kZXg+IFN0b3JhZ2U7CisgICAgZW51bSB7IElzQ29sVmVjdG9yID0gaW50ZXJuYWw6OnRyYWl0czxTcGFyc2VWZWN0b3I+OjpJc0NvbFZlY3RvciB9OworICAgIAorICAgIGVudW0geworICAgICAgT3B0aW9ucyA9IF9PcHRpb25zCisgICAgfTsKKyAgICAKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc0NvbFZlY3RvciA/IG1fc2l6ZSA6IDE7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBJc0NvbFZlY3RvciA/IDEgOiBtX3NpemU7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIqIHZhbHVlUHRyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnZhbHVlUHRyKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogdmFsdWVQdHIoKSB7IHJldHVybiBtX2RhdGEudmFsdWVQdHIoKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTdG9yYWdlSW5kZXgqIGlubmVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuaW5kZXhQdHIoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3RvcmFnZUluZGV4KiBpbm5lckluZGV4UHRyKCkgeyByZXR1cm4gbV9kYXRhLmluZGV4UHRyKCk7IH0KKworICAgIGlubGluZSBjb25zdCBTdG9yYWdlSW5kZXgqIG91dGVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIHsgcmV0dXJuIDA7IH0KKyAgICBpbmxpbmUgY29uc3QgU3RvcmFnZUluZGV4KiBpbm5lck5vblplcm9QdHIoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCogaW5uZXJOb25aZXJvUHRyKCkgeyByZXR1cm4gMDsgfQorICAgIAorICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgU3RvcmFnZSYgZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgY29uc3QgU3RvcmFnZSYgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoSXNDb2xWZWN0b3IgPyAoY29sPT0wICYmIHJvdz49MCAmJiByb3c8bV9zaXplKSA6IChyb3c9PTAgJiYgY29sPj0wICYmIGNvbDxtX3NpemUpKTsKKyAgICAgIHJldHVybiBjb2VmZihJc0NvbFZlY3RvciA/IHJvdyA6IGNvbCk7CisgICAgfQorICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggaSkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaT49MCAmJiBpPG1fc2l6ZSk7CisgICAgICByZXR1cm4gbV9kYXRhLmF0KFN0b3JhZ2VJbmRleChpKSk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KElzQ29sVmVjdG9yID8gKGNvbD09MCAmJiByb3c+PTAgJiYgcm93PG1fc2l6ZSkgOiAocm93PT0wICYmIGNvbD49MCAmJiBjb2w8bV9zaXplKSk7CisgICAgICByZXR1cm4gY29lZmZSZWYoSXNDb2xWZWN0b3IgPyByb3cgOiBjb2wpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29lZmZpY2llbnQgdmFsdWUgYXQgZ2l2ZW4gaW5kZXggXGEgaQorICAgICAgKiBUaGlzIG9wZXJhdGlvbiBpbnZvbGVzIGEgbG9nKHJobypzaXplKSBiaW5hcnkgc2VhcmNoLiBJZiB0aGUgY29lZmZpY2llbnQgZG9lcyBub3QKKyAgICAgICogZXhpc3QgeWV0LCB0aGVuIGEgc29ydGVkIGluc2VydGlvbiBpbnRvIGEgc2VxdWVudGlhbCBidWZmZXIgaXMgcGVyZm9ybWVkLgorICAgICAgKgorICAgICAgKiBUaGlzIGluc2VydGlvbiBtaWdodCBiZSB2ZXJ5IGNvc3RseSBpZiB0aGUgbnVtYmVyIG9mIG5vbnplcm9zIGFib3ZlIFxhIGkgaXMgbGFyZ2UuCisgICAgICAqLworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGkpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGk+PTAgJiYgaTxtX3NpemUpOworCisgICAgICByZXR1cm4gbV9kYXRhLmF0V2l0aEluc2VydGlvbihTdG9yYWdlSW5kZXgoaSkpOworICAgIH0KKworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OklubmVySXRlcmF0b3IgSW5uZXJJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlJldmVyc2VJbm5lckl0ZXJhdG9yIFJldmVyc2VJbm5lckl0ZXJhdG9yOworCisgICAgaW5saW5lIHZvaWQgc2V0WmVybygpIHsgbV9kYXRhLmNsZWFyKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0ICB7IHJldHVybiBtX2RhdGEuc2l6ZSgpOyB9CisKKyAgICBpbmxpbmUgdm9pZCBzdGFydFZlYyhJbmRleCBvdXRlcikKKyAgICB7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob3V0ZXIpOworICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyPT0wKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnRCYWNrQnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikKKyAgICB7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob3V0ZXIpOworICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyPT0wKTsKKyAgICAgIHJldHVybiBpbnNlcnRCYWNrKGlubmVyKTsKKyAgICB9CisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFjayhJbmRleCBpKQorICAgIHsKKyAgICAgIG1fZGF0YS5hcHBlbmQoMCwgaSk7CisgICAgICByZXR1cm4gbV9kYXRhLnZhbHVlKG1fZGF0YS5zaXplKCktMSk7CisgICAgfQorICAgIAorICAgIFNjYWxhciYgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lclVub3JkZXJlZChJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpCisgICAgeworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG91dGVyKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChvdXRlcj09MCk7CisgICAgICByZXR1cm4gaW5zZXJ0QmFja1Vub3JkZXJlZChpbm5lcik7CisgICAgfQorICAgIGlubGluZSBTY2FsYXImIGluc2VydEJhY2tVbm9yZGVyZWQoSW5kZXggaSkKKyAgICB7CisgICAgICBtX2RhdGEuYXBwZW5kKDAsIGkpOworICAgICAgcmV0dXJuIG1fZGF0YS52YWx1ZShtX2RhdGEuc2l6ZSgpLTEpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGluc2VydChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoSXNDb2xWZWN0b3IgPyAoY29sPT0wICYmIHJvdz49MCAmJiByb3c8bV9zaXplKSA6IChyb3c9PTAgJiYgY29sPj0wICYmIGNvbDxtX3NpemUpKTsKKyAgICAgIAorICAgICAgSW5kZXggaW5uZXIgPSBJc0NvbFZlY3RvciA/IHJvdyA6IGNvbDsKKyAgICAgIEluZGV4IG91dGVyID0gSXNDb2xWZWN0b3IgPyBjb2wgOiByb3c7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKG91dGVyKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChvdXRlcj09MCk7CisgICAgICByZXR1cm4gaW5zZXJ0KGlubmVyKTsKKyAgICB9CisgICAgU2NhbGFyJiBpbnNlcnQoSW5kZXggaSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaT49MCAmJiBpPG1fc2l6ZSk7CisgICAgICAKKyAgICAgIEluZGV4IHN0YXJ0SWQgPSAwOworICAgICAgSW5kZXggcCA9IEluZGV4KG1fZGF0YS5zaXplKCkpIC0gMTsKKyAgICAgIC8vIFRPRE8gc21hcnQgcmVhbGxvYworICAgICAgbV9kYXRhLnJlc2l6ZShwKzIsMSk7CisKKyAgICAgIHdoaWxlICggKHAgPj0gc3RhcnRJZCkgJiYgKG1fZGF0YS5pbmRleChwKSA+IGkpICkKKyAgICAgIHsKKyAgICAgICAgbV9kYXRhLmluZGV4KHArMSkgPSBtX2RhdGEuaW5kZXgocCk7CisgICAgICAgIG1fZGF0YS52YWx1ZShwKzEpID0gbV9kYXRhLnZhbHVlKHApOworICAgICAgICAtLXA7CisgICAgICB9CisgICAgICBtX2RhdGEuaW5kZXgocCsxKSA9IGNvbnZlcnRfaW5kZXgoaSk7CisgICAgICBtX2RhdGEudmFsdWUocCsxKSA9IDA7CisgICAgICByZXR1cm4gbV9kYXRhLnZhbHVlKHArMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICAqLworICAgIGlubGluZSB2b2lkIHJlc2VydmUoSW5kZXggcmVzZXJ2ZVNpemUpIHsgbV9kYXRhLnJlc2VydmUocmVzZXJ2ZVNpemUpOyB9CisKKworICAgIGlubGluZSB2b2lkIGZpbmFsaXplKCkge30KKworICAgIC8qKiBcY29weWRvYyBTcGFyc2VNYXRyaXg6OnBydW5lKGNvbnN0IFNjYWxhciYsY29uc3QgUmVhbFNjYWxhciYpICovCisgICAgdm9pZCBwcnVuZShjb25zdCBTY2FsYXImIHJlZmVyZW5jZSwgY29uc3QgUmVhbFNjYWxhciYgZXBzaWxvbiA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCisgICAgeworICAgICAgbV9kYXRhLnBydW5lKHJlZmVyZW5jZSxlcHNpbG9uKTsKKyAgICB9CisKKyAgICAvKiogUmVzaXplcyB0aGUgc3BhcnNlIHZlY3RvciB0byBcYSByb3dzIHggXGEgY29scworICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1hdHJpY2VzLgorICAgICAgKiBGb3IgYSBjb2x1bW4gdmVjdG9yLCBcYSBjb2xzIG11c3QgYmUgZXF1YWwgdG8gMS4KKyAgICAgICogRm9yIGEgcm93IHZlY3RvciwgXGEgcm93cyBtdXN0IGJlIGVxdWFsIHRvIDEuCisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgpCisgICAgICAqLworICAgIHZvaWQgcmVzaXplKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChJc0NvbFZlY3RvciA/IGNvbHMgOiByb3dzKT09MSAmJiAiT3V0ZXIgZGltZW5zaW9uIG11c3QgZXF1YWwgMSIpOworICAgICAgcmVzaXplKElzQ29sVmVjdG9yID8gcm93cyA6IGNvbHMpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBzcGFyc2UgdmVjdG9yIHRvIFxhIG5ld1NpemUKKyAgICAgICogVGhpcyBtZXRob2QgZGVsZXRlcyBhbGwgZW50cmllcywgdGh1cyBsZWF2aW5nIGFuIGVtcHR5IHNwYXJzZSB2ZWN0b3IKKyAgICAgICoKKyAgICAgICogXHNhICBjb25zZXJ2YXRpdmVSZXNpemUoKSwgc2V0WmVybygpICovCisgICAgdm9pZCByZXNpemUoSW5kZXggbmV3U2l6ZSkKKyAgICB7CisgICAgICBtX3NpemUgPSBuZXdTaXplOworICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIHNwYXJzZSB2ZWN0b3IgdG8gXGEgbmV3U2l6ZSwgd2hpbGUgbGVhdmluZyBvbGQgdmFsdWVzIHVudG91Y2hlZC4KKyAgICAgICoKKyAgICAgICogSWYgdGhlIHNpemUgb2YgdGhlIHZlY3RvciBpcyBkZWNyZWFzZWQsIHRoZW4gdGhlIHN0b3JhZ2Ugb2YgdGhlIG91dC1vZiBib3VuZHMgY29lZmZpY2llbnRzIGlzIGtlcHQgYW5kIHJlc2VydmVkLgorICAgICAgKiBDYWxsIC5kYXRhKCkuc3F1ZWV6ZSgpIHRvIGZyZWUgZXh0cmEgbWVtb3J5LgorICAgICAgKgorICAgICAgKiBcc2EgcmVzZXJ2ZSgpLCBzZXRaZXJvKCkKKyAgICAgICovCisgICAgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggbmV3U2l6ZSkKKyAgICB7CisgICAgICBpZiAobmV3U2l6ZSA8IG1fc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IDA7CisgICAgICAgIHdoaWxlIChpPG1fZGF0YS5zaXplKCkgJiYgbV9kYXRhLmluZGV4KGkpPG5ld1NpemUpICsraTsKKyAgICAgICAgbV9kYXRhLnJlc2l6ZShpKTsKKyAgICAgIH0KKyAgICAgIG1fc2l6ZSA9IG5ld1NpemU7CisgICAgfQorCisgICAgdm9pZCByZXNpemVOb25aZXJvcyhJbmRleCBzaXplKSB7IG1fZGF0YS5yZXNpemUoc2l6ZSk7IH0KKworICAgIGlubGluZSBTcGFyc2VWZWN0b3IoKSA6IG1fc2l6ZSgwKSB7IGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKTsgcmVzaXplKDApOyB9CisKKyAgICBleHBsaWNpdCBpbmxpbmUgU3BhcnNlVmVjdG9yKEluZGV4IHNpemUpIDogbV9zaXplKDApIHsgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOyByZXNpemUoc2l6ZSk7IH0KKworICAgIGlubGluZSBTcGFyc2VWZWN0b3IoSW5kZXggcm93cywgSW5kZXggY29scykgOiBtX3NpemUoMCkgeyBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7IHJlc2l6ZShyb3dzLGNvbHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZVZlY3Rvcihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgICAgOiBtX3NpemUoMCkKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fU1BBUlNFX0NSRUFURV9URU1QT1JBUllfUExVR0lOCisgICAgICAgIEVJR0VOX1NQQVJTRV9DUkVBVEVfVEVNUE9SQVJZX1BMVUdJTgorICAgICAgI2VuZGlmCisgICAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU3BhcnNlVmVjdG9yKGNvbnN0IFNwYXJzZVZlY3RvciYgb3RoZXIpCisgICAgICA6IEJhc2Uob3RoZXIpLCBtX3NpemUoMCkKKyAgICB7CisgICAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogU3dhcHMgdGhlIHZhbHVlcyBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIuCisgICAgICAqIE92ZXJsb2FkZWQgZm9yIHBlcmZvcm1hbmNlOiB0aGlzIHZlcnNpb24gcGVyZm9ybXMgYSBcZW0gc2hhbGxvdyBzd2FwIGJ5IHN3YXBpbmcgcG9pbnRlcnMgYW5kIGF0dHJpYnV0ZXMgb25seS4KKyAgICAgICogXHNhIFNwYXJzZU1hdHJpeEJhc2U6OnN3YXAoKQorICAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzd2FwKFNwYXJzZVZlY3RvciYgb3RoZXIpCisgICAgeworICAgICAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgICAgIG1fZGF0YS5zd2FwKG90aGVyLm1fZGF0YSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IE90aGVyT3B0aW9ucz4KKyAgICBpbmxpbmUgdm9pZCBzd2FwKFNwYXJzZU1hdHJpeDxTY2FsYXIsT3RoZXJPcHRpb25zLFN0b3JhZ2VJbmRleD4mIG90aGVyKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChvdGhlci5vdXRlclNpemUoKT09MSk7CisgICAgICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX2lubmVyU2l6ZSk7CisgICAgICBtX2RhdGEuc3dhcChvdGhlci5tX2RhdGEpOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBTcGFyc2VWZWN0b3ImIG90aGVyKQorICAgIHsKKyAgICAgIGlmIChvdGhlci5pc1JWYWx1ZSgpKQorICAgICAgeworICAgICAgICBzd2FwKG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmVzaXplKG90aGVyLnNpemUoKSk7CisgICAgICAgIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZVZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgU3BhcnNlVmVjdG9yIHRtcChvdGhlci5zaXplKCkpOworICAgICAgaW50ZXJuYWw6OnNwYXJzZV92ZWN0b3JfYXNzaWduX3NlbGVjdG9yPFNwYXJzZVZlY3RvcixPdGhlckRlcml2ZWQ+OjpydW4odG1wLG90aGVyLmRlcml2ZWQoKSk7CisgICAgICB0aGlzLT5zd2FwKHRtcCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBTcGFyc2VWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBTcGFyc2VTcGFyc2VQcm9kdWN0PExocyxSaHM+JiBwcm9kdWN0KQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ocHJvZHVjdCk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBTcGFyc2VWZWN0b3ImIG0pCisgICAgeworICAgICAgZm9yIChJbmRleCBpPTA7IGk8bS5ub25aZXJvcygpOyArK2kpCisgICAgICAgIHMgPDwgIigiIDw8IG0ubV9kYXRhLnZhbHVlKGkpIDw8ICIsIiA8PCBtLm1fZGF0YS5pbmRleChpKSA8PCAiKSAiOworICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKiogRGVzdHJ1Y3RvciAqLworICAgIGlubGluZSB+U3BhcnNlVmVjdG9yKCkge30KKworICAgIC8qKiBPdmVybG9hZGVkIGZvciBwZXJmb3JtYW5jZSAqLworICAgIFNjYWxhciBzdW0oKSBjb25zdDsKKworICBwdWJsaWM6CisKKyAgICAvKiogXGludGVybmFsIFxkZXByZWNhdGVkIHVzZSBzZXRaZXJvKCkgYW5kIHJlc2VydmUoKSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgdm9pZCBzdGFydEZpbGwoSW5kZXggcmVzZXJ2ZSkKKyAgICB7CisgICAgICBzZXRaZXJvKCk7CisgICAgICBtX2RhdGEucmVzZXJ2ZShyZXNlcnZlKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIFxkZXByZWNhdGVkIHVzZSBpbnNlcnRCYWNrKEluZGV4LEluZGV4KSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgU2NhbGFyJiBmaWxsKEluZGV4IHIsIEluZGV4IGMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHI9PTAgfHwgYz09MCk7CisgICAgICByZXR1cm4gZmlsbChJc0NvbFZlY3RvciA/IHIgOiBjKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIFxkZXByZWNhdGVkIHVzZSBpbnNlcnRCYWNrKEluZGV4KSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgU2NhbGFyJiBmaWxsKEluZGV4IGkpCisgICAgeworICAgICAgbV9kYXRhLmFwcGVuZCgwLCBpKTsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUobV9kYXRhLnNpemUoKS0xKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIFxkZXByZWNhdGVkIHVzZSBpbnNlcnQoSW5kZXgsSW5kZXgpICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBTY2FsYXImIGZpbGxyYW5kKEluZGV4IHIsIEluZGV4IGMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHI9PTAgfHwgYz09MCk7CisgICAgICByZXR1cm4gZmlsbHJhbmQoSXNDb2xWZWN0b3IgPyByIDogYyk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCBcZGVwcmVjYXRlZCB1c2UgaW5zZXJ0KEluZGV4KSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgU2NhbGFyJiBmaWxscmFuZChJbmRleCBpKQorICAgIHsKKyAgICAgIHJldHVybiBpbnNlcnQoaSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCBcZGVwcmVjYXRlZCB1c2UgZmluYWxpemUoKSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgdm9pZCBlbmRGaWxsKCkge30KKyAgICAKKyAgICAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIHdlcmUgaGVyZSBpbiB0aGUgMy4xIHJlbGVhc2UsIHNvIGxldCdzIGtlZXAgdGhlbSBpbiBjYXNlIHNvbWUgY29kZSByZWx5IG9uIHRoZW0uCisgICAgLyoqIFxpbnRlcm5hbCBcZGVwcmVjYXRlZCB1c2UgZGF0YSgpICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBTdG9yYWdlJiBfZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIC8qKiBcaW50ZXJuYWwgXGRlcHJlY2F0ZWQgdXNlIGRhdGEoKSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgY29uc3QgU3RvcmFnZSYgX2RhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKyAgICAKKyMgICBpZmRlZiBFSUdFTl9TUEFSU0VWRUNUT1JfUExVR0lOCisjICAgICBpbmNsdWRlIEVJR0VOX1NQQVJTRVZFQ1RPUl9QTFVHSU4KKyMgICBlbmRpZgorCitwcm90ZWN0ZWQ6CisgIAorICAgIHN0YXRpYyB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtVHJhaXRzPFN0b3JhZ2VJbmRleD46OklzU2lnbmVkLFRIRV9JTkRFWF9UWVBFX01VU1RfQkVfQV9TSUdORURfVFlQRSk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChfT3B0aW9ucyYoQ29sTWFqb3J8Um93TWFqb3IpKT09T3B0aW9ucyxJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTKTsKKyAgICB9CisgICAgCisgICAgU3RvcmFnZSBtX2RhdGE7CisgICAgSW5kZXggbV9zaXplOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitzdHJ1Y3QgZXZhbHVhdG9yPFNwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4gPgorICA6IGV2YWx1YXRvcl9iYXNlPFNwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4gPgoreworICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4gU3BhcnNlVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBldmFsdWF0b3JfYmFzZTxTcGFyc2VWZWN0b3JUeXBlPiBCYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVZlY3RvclR5cGU6OklubmVySXRlcmF0b3IgSW5uZXJJdGVyYXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VWZWN0b3JUeXBlOjpSZXZlcnNlSW5uZXJJdGVyYXRvciBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKyAgCisgIGVudW0geworICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8X1NjYWxhcj46OlJlYWRDb3N0LAorICAgIEZsYWdzID0gU3BhcnNlVmVjdG9yVHlwZTo6RmxhZ3MKKyAgfTsKKworICBldmFsdWF0b3IoKSA6IEJhc2UoKSB7fQorICAKKyAgZXhwbGljaXQgZXZhbHVhdG9yKGNvbnN0IFNwYXJzZVZlY3RvclR5cGUgJm1hdCkgOiBtX21hdHJpeCgmbWF0KQorICB7CisgICAgRUlHRU5fSU5URVJOQUxfQ0hFQ0tfQ09TVF9WQUxVRShDb2VmZlJlYWRDb3N0KTsKKyAgfQorICAKKyAgaW5saW5lIEluZGV4IG5vblplcm9zRXN0aW1hdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fbWF0cml4LT5ub25aZXJvcygpOworICB9CisgIAorICBvcGVyYXRvciBTcGFyc2VWZWN0b3JUeXBlJigpIHsgcmV0dXJuIG1fbWF0cml4LT5jb25zdF9jYXN0X2Rlcml2ZWQoKTsgfQorICBvcGVyYXRvciBjb25zdCBTcGFyc2VWZWN0b3JUeXBlJigpIGNvbnN0IHsgcmV0dXJuICptX21hdHJpeDsgfQorICAKKyAgY29uc3QgU3BhcnNlVmVjdG9yVHlwZSAqbV9tYXRyaXg7Cit9OworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgRGVzdCwgdHlwZW5hbWUgU3JjPgorc3RydWN0IHNwYXJzZV92ZWN0b3JfYXNzaWduX3NlbGVjdG9yPERlc3QsU3JjLFNWQV9Jbm5lcj4geworICBzdGF0aWMgdm9pZCBydW4oRGVzdCYgZHN0LCBjb25zdCBTcmMmIHNyYykgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChzcmMuaW5uZXJTaXplKCk9PXNyYy5zaXplKCkpOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+IFNyY0V2YWx1YXRvclR5cGU7CisgICAgU3JjRXZhbHVhdG9yVHlwZSBzcmNFdmFsKHNyYyk7CisgICAgZm9yKHR5cGVuYW1lIFNyY0V2YWx1YXRvclR5cGU6OklubmVySXRlcmF0b3IgaXQoc3JjRXZhbCwgMCk7IGl0OyArK2l0KQorICAgICAgZHN0Lmluc2VydChpdC5pbmRleCgpKSA9IGl0LnZhbHVlKCk7CisgIH0KK307CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBTcmM+CitzdHJ1Y3Qgc3BhcnNlX3ZlY3Rvcl9hc3NpZ25fc2VsZWN0b3I8RGVzdCxTcmMsU1ZBX091dGVyPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihEZXN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKSB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNyYy5vdXRlclNpemUoKT09c3JjLnNpemUoKSk7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6ZXZhbHVhdG9yPFNyYz4gU3JjRXZhbHVhdG9yVHlwZTsKKyAgICBTcmNFdmFsdWF0b3JUeXBlIHNyY0V2YWwoc3JjKTsKKyAgICBmb3IoSW5kZXggaT0wOyBpPHNyYy5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICB0eXBlbmFtZSBTcmNFdmFsdWF0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KHNyY0V2YWwsIGkpOworICAgICAgaWYoaXQpCisgICAgICAgIGRzdC5pbnNlcnQoaSkgPSBpdC52YWx1ZSgpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFNyYz4KK3N0cnVjdCBzcGFyc2VfdmVjdG9yX2Fzc2lnbl9zZWxlY3RvcjxEZXN0LFNyYyxTVkFfUnVudGltZVN3aXRjaD4geworICBzdGF0aWMgdm9pZCBydW4oRGVzdCYgZHN0LCBjb25zdCBTcmMmIHNyYykgeworICAgIGlmKHNyYy5vdXRlclNpemUoKT09MSkgIHNwYXJzZV92ZWN0b3JfYXNzaWduX3NlbGVjdG9yPERlc3QsU3JjLFNWQV9Jbm5lcj46OnJ1bihkc3QsIHNyYyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgc3BhcnNlX3ZlY3Rvcl9hc3NpZ25fc2VsZWN0b3I8RGVzdCxTcmMsU1ZBX091dGVyPjo6cnVuKGRzdCwgc3JjKTsKKyAgfQorfTsKKworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVZFQ1RPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VWaWV3LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0YWVhNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZpZXcuaApAQCAtMCwwICsxLDI1MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBEYW5pZWwgTG93ZW5ncnViIDxsb3dkYW5pZUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVZJRVdfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VWSUVXX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVZpZXc8TWF0cml4VHlwZT4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBGbGFncyA9IGludCh0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzKSAmIChSb3dNYWpvckJpdCkKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKiBcY2xhc3MgU3BhcnNlVmlldworICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBkZW5zZSBvciBzcGFyc2UgbWF0cml4IHdpdGggemVybyBvciB0b28gc21hbGwgdmFsdWVzIHJlbW92ZWQKKyAgKgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9mIHdoaWNoIHdlIGFyZSByZW1vdmluZyB0aGUgc21hbGwgZW50cmllcworICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgYSBnaXZlbiBkZW5zZSBvciBzcGFyc2UgbWF0cml4IHdpdGgKKyAgKiBlbnRyaWVzIHNtYWxsZXIgdGhhbiBcYyByZWZlcmVuY2UgKiBcYyBlcHNpbG9uIGFyZSByZW1vdmVkLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpzcGFyc2VWaWV3KCkgYW5kIFNwYXJzZU1hdHJpeEJhc2U6OnBydW5lZCgpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzcGFyc2VWaWV3KCksIFNwYXJzZU1hdHJpeEJhc2U6OnBydW5lZCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgU3BhcnNlVmlldyA6IHB1YmxpYyBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZVZpZXc8TWF0cml4VHlwZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlVmlldyA+IEJhc2U7CitwdWJsaWM6CisgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZVZpZXcpCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvbjsKKworICBleHBsaWNpdCBTcGFyc2VWaWV3KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgU2NhbGFyJiByZWZlcmVuY2UgPSBTY2FsYXIoMCksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAmZXBzaWxvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKKyAgICA6IG1fbWF0cml4KG1hdCksIG1fcmVmZXJlbmNlKHJlZmVyZW5jZSksIG1fZXBzaWxvbihlcHNpbG9uKSB7fQorCisgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisKKyAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmlubmVyU2l6ZSgpOyB9CisgIGlubGluZSBJbmRleCBvdXRlclNpemUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5vdXRlclNpemUoKTsgfQorICAKKyAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSYKKyAgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisgIAorICBTY2FsYXIgcmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gbV9yZWZlcmVuY2U7IH0KKyAgUmVhbFNjYWxhciBlcHNpbG9uKCkgY29uc3QgeyByZXR1cm4gbV9lcHNpbG9uOyB9CisgIAorcHJvdGVjdGVkOgorICBNYXRyaXhUeXBlTmVzdGVkIG1fbWF0cml4OworICBTY2FsYXIgbV9yZWZlcmVuY2U7CisgIFJlYWxTY2FsYXIgbV9lcHNpbG9uOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVE9ETyBmaW5kIGEgd2F5IHRvIHVuaWZ5IHRoZSB0d28gZm9sbG93aW5nIHZhcmlhbnRzCisvLyBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIGltcGxlbWVudGluZyBhbiBpbm5lciBpdGVyYXRvciBvbiB0b3Agb2YgYW4gSW5kZXhCYXNlZCBldmFsdWF0b3IgaXMKKy8vIG5vdCBlYXN5IGJlY2F1c2UgdGhlIGV2YWx1YXRvcnMgZG8gbm90IGV4cG9zZSB0aGUgc2l6ZXMgb2YgdGhlIHVuZGVybHlpbmcgZXhwcmVzc2lvbi4KKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlPgorc3RydWN0IHVuYXJ5X2V2YWx1YXRvcjxTcGFyc2VWaWV3PEFyZ1R5cGU+LCBJdGVyYXRvckJhc2VkPgorICA6IHB1YmxpYyBldmFsdWF0b3JfYmFzZTxTcGFyc2VWaWV3PEFyZ1R5cGU+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxBcmdUeXBlPjo6SW5uZXJJdGVyYXRvciBFdmFsSXRlcmF0b3I7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNwYXJzZVZpZXc8QXJnVHlwZT4gWHByVHlwZTsKKyAgICAKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yIDogcHVibGljIEV2YWxJdGVyYXRvcgorICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgICAgcHVibGljOgorCisgICAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIHN2ZSwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBFdmFsSXRlcmF0b3Ioc3ZlLm1fYXJnSW1wbCxvdXRlciksIG1fdmlldyhzdmUubV92aWV3KQorICAgICAgICB7CisgICAgICAgICAgaW5jcmVtZW50VG9Ob25aZXJvKCk7CisgICAgICAgIH0KKworICAgICAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgICAgICB7CisgICAgICAgICAgRXZhbEl0ZXJhdG9yOjpvcGVyYXRvcisrKCk7CisgICAgICAgICAgaW5jcmVtZW50VG9Ob25aZXJvKCk7CisgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdXNpbmcgRXZhbEl0ZXJhdG9yOjp2YWx1ZTsKKworICAgICAgcHJvdGVjdGVkOgorICAgICAgICBjb25zdCBYcHJUeXBlICZtX3ZpZXc7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgaW5jcmVtZW50VG9Ob25aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgIHdoaWxlKChib29sKCp0aGlzKSkgJiYgaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKHZhbHVlKCksIG1fdmlldy5yZWZlcmVuY2UoKSwgbV92aWV3LmVwc2lsb24oKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgRXZhbEl0ZXJhdG9yOjpvcGVyYXRvcisrKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBlbnVtIHsKKyAgICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgICBGbGFncyA9IFhwclR5cGU6OkZsYWdzCisgICAgfTsKKyAgICAKKyAgICBleHBsaWNpdCB1bmFyeV9ldmFsdWF0b3IoY29uc3QgWHByVHlwZSYgeHByKSA6IG1fYXJnSW1wbCh4cHIubmVzdGVkRXhwcmVzc2lvbigpKSwgbV92aWV3KHhwcikge30KKworICBwcm90ZWN0ZWQ6CisgICAgZXZhbHVhdG9yPEFyZ1R5cGU+IG1fYXJnSW1wbDsKKyAgICBjb25zdCBYcHJUeXBlICZtX3ZpZXc7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlPgorc3RydWN0IHVuYXJ5X2V2YWx1YXRvcjxTcGFyc2VWaWV3PEFyZ1R5cGU+LCBJbmRleEJhc2VkPgorICA6IHB1YmxpYyBldmFsdWF0b3JfYmFzZTxTcGFyc2VWaWV3PEFyZ1R5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3BhcnNlVmlldzxBcmdUeXBlPiBYcHJUeXBlOworICBwcm90ZWN0ZWQ6CisgICAgZW51bSB7IElzUm93TWFqb3IgPSAoWHByVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHB1YmxpYzoKKyAgICAKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yCisgICAgeworICAgICAgcHVibGljOgorCisgICAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCB1bmFyeV9ldmFsdWF0b3ImIHN2ZSwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBtX3N2ZShzdmUpLCBtX2lubmVyKDApLCBtX291dGVyKG91dGVyKSwgbV9lbmQoc3ZlLm1fdmlldy5pbm5lclNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgIGluY3JlbWVudFRvTm9uWmVybygpOworICAgICAgICB9CisKKyAgICAgICAgRUlHRU5fU1RST05HX0lOTElORSBJbm5lckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgeworICAgICAgICAgIG1faW5uZXIrKzsKKyAgICAgICAgICBpbmNyZW1lbnRUb05vblplcm8oKTsKKyAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gKElzUm93TWFqb3IpID8gbV9zdmUubV9hcmdJbXBsLmNvZWZmKG1fb3V0ZXIsIG1faW5uZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fc3ZlLm1fYXJnSW1wbC5jb2VmZihtX2lubmVyLCBtX291dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3RvcmFnZUluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbm5lcjsgfQorICAgICAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiBpbmRleCgpOyB9CisgICAgICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fb3V0ZXI7IH0KKworICAgICAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2lubmVyIDwgbV9lbmQgJiYgbV9pbm5lcj49MDsgfQorCisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IHVuYXJ5X2V2YWx1YXRvciAmbV9zdmU7CisgICAgICAgIEluZGV4IG1faW5uZXI7CisgICAgICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgICAgIGNvbnN0IEluZGV4IG1fZW5kOworCisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIGluY3JlbWVudFRvTm9uWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICB3aGlsZSgoYm9vbCgqdGhpcykpICYmIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbih2YWx1ZSgpLCBtX3N2ZS5tX3ZpZXcucmVmZXJlbmNlKCksIG1fc3ZlLm1fdmlldy5lcHNpbG9uKCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1faW5uZXIrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIGVudW0geworICAgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlPjo6Q29lZmZSZWFkQ29zdCwKKyAgICAgIEZsYWdzID0gWHByVHlwZTo6RmxhZ3MKKyAgICB9OworICAgIAorICAgIGV4cGxpY2l0IHVuYXJ5X2V2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpIDogbV9hcmdJbXBsKHhwci5uZXN0ZWRFeHByZXNzaW9uKCkpLCBtX3ZpZXcoeHByKSB7fQorCisgIHByb3RlY3RlZDoKKyAgICBldmFsdWF0b3I8QXJnVHlwZT4gbV9hcmdJbXBsOworICAgIGNvbnN0IFhwclR5cGUgJm1fdmlldzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxyZXR1cm5zIGEgc3BhcnNlIGV4cHJlc3Npb24gb2YgdGhlIGRlbnNlIGV4cHJlc3Npb24gXGMgKnRoaXMgd2l0aCB2YWx1ZXMgc21hbGxlciB0aGFuCisgICogXGEgcmVmZXJlbmNlICogXGEgZXBzaWxvbiByZW1vdmVkLgorICAqCisgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBwcm90b3R5cGluZyB0byBjb252ZXJ0IGEgcXVpY2tseSBhc3NlbWJsZWQgZGVuc2UgTWF0cml4IFxjIEQgdG8gYSBTcGFyc2VNYXRyaXggXGMgUzoKKyAgKiBcY29kZQorICAqIE1hdHJpeFhkIEQobixtKTsKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTOworICAqIFMgPSBELnNwYXJzZVZpZXcoKTsgICAgICAgICAgICAgLy8gc3VwcHJlc3MgbnVtZXJpY2FsIHplcm9zIChleGFjdCkKKyAgKiBTID0gRC5zcGFyc2VWaWV3KHJlZmVyZW5jZSk7CisgICogUyA9IEQuc3BhcnNlVmlldyhyZWZlcmVuY2UsZXBzaWxvbik7CisgICogXGVuZGNvZGUKKyAgKiB3aGVyZSBcYSByZWZlcmVuY2UgaXMgYSBtZWFuaW5nZnVsIG5vbiB6ZXJvIHJlZmVyZW5jZSB2YWx1ZSwKKyAgKiBhbmQgXGEgZXBzaWxvbiBpcyBhIHRvbGVyYW5jZSBmYWN0b3IgZGVmYXVsdGluZyB0byBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkuCisgICoKKyAgKiBcc2EgU3BhcnNlTWF0cml4QmFzZTo6cHJ1bmVkKCksIGNsYXNzIFNwYXJzZVZpZXcgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBTcGFyc2VWaWV3PERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNwYXJzZVZpZXcoY29uc3QgU2NhbGFyJiByZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIGVwc2lsb24pIGNvbnN0Cit7CisgIHJldHVybiBTcGFyc2VWaWV3PERlcml2ZWQ+KGRlcml2ZWQoKSwgcmVmZXJlbmNlLCBlcHNpbG9uKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgXGMgKnRoaXMgd2l0aCB2YWx1ZXMgc21hbGxlciB0aGFuCisgICogXGEgcmVmZXJlbmNlICogXGEgZXBzaWxvbiByZW1vdmVkLgorICAqCisgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJvZHVjdCBvZiB0d28gc3BhcnNlIG1hdHJpY2VzCisgICogdG8gYXV0b21hdGljYWxseSBwcnVuZSB0aGUgc21hbGxlc3QgdmFsdWVzIGFzIGZvbGxvd3M6CisgICogXGNvZGUKKyAgKiBDID0gKEEqQikucHJ1bmVkKCk7ICAgICAgICAgICAgIC8vIHN1cHByZXNzIG51bWVyaWNhbCB6ZXJvcyAoZXhhY3QpCisgICogQyA9IChBKkIpLnBydW5lZChyZWYpOworICAqIEMgPSAoQSpCKS5wcnVuZWQocmVmLGVwc2lsb24pOworICAqIFxlbmRjb2RlCisgICogd2hlcmUgXGMgcmVmIGlzIGEgbWVhbmluZ2Z1bCBub24gemVybyByZWZlcmVuY2UgdmFsdWUuCisgICogKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBTcGFyc2VWaWV3PERlcml2ZWQ+CitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpwcnVuZWQoY29uc3QgU2NhbGFyJiByZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgZXBzaWxvbikgY29uc3QKK3sKKyAgcmV0dXJuIFNwYXJzZVZpZXc8RGVyaXZlZD4oZGVyaXZlZCgpLCByZWZlcmVuY2UsIGVwc2lsb24pOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Ucmlhbmd1bGFyU29sdmVyLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Ucmlhbmd1bGFyU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNTZiYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1RyaWFuZ3VsYXJTb2x2ZXIuaApAQCAtMCwwICsxLDMxNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVRSSUFOR1VMQVJTT0xWRVJfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VUUklBTkdVTEFSU09MVkVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwKKyAgaW50IFVwTG8gPSAoTW9kZSAmIExvd2VyKQorICAgICAgICAgICA/IExvd2VyCisgICAgICAgICAgIDogKE1vZGUgJiBVcHBlcikKKyAgICAgICAgICAgPyBVcHBlcgorICAgICAgICAgICA6IC0xLAorICBpbnQgU3RvcmFnZU9yZGVyID0gaW50KHRyYWl0czxMaHM+OjpGbGFncykgJiBSb3dNYWpvckJpdD4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjsKKworLy8gZm9yd2FyZCBzdWJzdGl0dXRpb24sIHJvdy1tYWpvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlPgorc3RydWN0IHNwYXJzZV9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPExocyxSaHMsTW9kZSxMb3dlcixSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgZXZhbHVhdG9yPExocz4gTGhzRXZhbDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBldmFsdWF0b3I8TGhzPjo6SW5uZXJJdGVyYXRvciBMaHNJdGVyYXRvcjsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIG90aGVyKQorICB7CisgICAgTGhzRXZhbCBsaHNFdmFsKGxocyk7CisgICAgZm9yKEluZGV4IGNvbD0wIDsgY29sPG90aGVyLmNvbHMoKSA7ICsrY29sKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBpPTA7IGk8bGhzLnJvd3MoKTsgKytpKQorICAgICAgeworICAgICAgICBTY2FsYXIgdG1wID0gb3RoZXIuY29lZmYoaSxjb2wpOworICAgICAgICBTY2FsYXIgbGFzdFZhbCgwKTsKKyAgICAgICAgSW5kZXggbGFzdEluZGV4ID0gMDsKKyAgICAgICAgZm9yKExoc0l0ZXJhdG9yIGl0KGxoc0V2YWwsIGkpOyBpdDsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIGxhc3RWYWwgPSBpdC52YWx1ZSgpOworICAgICAgICAgIGxhc3RJbmRleCA9IGl0LmluZGV4KCk7CisgICAgICAgICAgaWYobGFzdEluZGV4PT1pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgdG1wIC09IGxhc3RWYWwgKiBvdGhlci5jb2VmZihsYXN0SW5kZXgsY29sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTW9kZSAmIFVuaXREaWFnKQorICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksY29sKSA9IHRtcDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGxhc3RJbmRleD09aSk7CisgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpID0gdG1wL2xhc3RWYWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIGJhY2t3YXJkIHN1YnN0aXR1dGlvbiwgcm93LW1ham9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TGhzLFJocyxNb2RlLFVwcGVyLFJvd01ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBldmFsdWF0b3I8TGhzPiBMaHNFdmFsOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIExoc0l0ZXJhdG9yOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgb3RoZXIpCisgIHsKKyAgICBMaHNFdmFsIGxoc0V2YWwobGhzKTsKKyAgICBmb3IoSW5kZXggY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgZm9yKEluZGV4IGk9bGhzLnJvd3MoKS0xIDsgaT49MCA7IC0taSkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIHRtcCA9IG90aGVyLmNvZWZmKGksY29sKTsKKyAgICAgICAgU2NhbGFyIGxfaWkoMCk7CisgICAgICAgIExoc0l0ZXJhdG9yIGl0KGxoc0V2YWwsIGkpOworICAgICAgICB3aGlsZShpdCAmJiBpdC5pbmRleCgpPGkpCisgICAgICAgICAgKytpdDsKKyAgICAgICAgaWYoIShNb2RlICYgVW5pdERpYWcpKQorICAgICAgICB7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0ICYmIGl0LmluZGV4KCk9PWkpOworICAgICAgICAgIGxfaWkgPSBpdC52YWx1ZSgpOworICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQuaW5kZXgoKSA9PSBpKQorICAgICAgICAgICsraXQ7CisgICAgICAgIGZvcig7IGl0OyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgdG1wIC09IGl0LnZhbHVlKCkgKiBvdGhlci5jb2VmZihpdC5pbmRleCgpLGNvbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTW9kZSAmIFVuaXREaWFnKSAgb3RoZXIuY29lZmZSZWYoaSxjb2wpID0gdG1wOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpID0gdG1wL2xfaWk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCisvLyBmb3J3YXJkIHN1YnN0aXR1dGlvbiwgY29sLW1ham9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TGhzLFJocyxNb2RlLExvd2VyLENvbE1ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBldmFsdWF0b3I8TGhzPiBMaHNFdmFsOworICB0eXBlZGVmIHR5cGVuYW1lIGV2YWx1YXRvcjxMaHM+OjpJbm5lckl0ZXJhdG9yIExoc0l0ZXJhdG9yOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgb3RoZXIpCisgIHsKKyAgICBMaHNFdmFsIGxoc0V2YWwobGhzKTsKKyAgICBmb3IoSW5kZXggY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgZm9yKEluZGV4IGk9MDsgaTxsaHMuY29scygpOyArK2kpCisgICAgICB7CisgICAgICAgIFNjYWxhciYgdG1wID0gb3RoZXIuY29lZmZSZWYoaSxjb2wpOworICAgICAgICBpZiAodG1wIT1TY2FsYXIoMCkpIC8vIG9wdGltaXphdGlvbiB3aGVuIG90aGVyIGlzIGFjdHVhbGx5IHNwYXJzZQorICAgICAgICB7CisgICAgICAgICAgTGhzSXRlcmF0b3IgaXQobGhzRXZhbCwgaSk7CisgICAgICAgICAgd2hpbGUoaXQgJiYgaXQuaW5kZXgoKTxpKQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICBpZighKE1vZGUgJiBVbml0RGlhZykpCisgICAgICAgICAgeworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0ICYmIGl0LmluZGV4KCk9PWkpOworICAgICAgICAgICAgdG1wIC89IGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpdCAmJiBpdC5pbmRleCgpPT1pKQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICBmb3IoOyBpdDsgKytpdCkKKyAgICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGl0LmluZGV4KCksIGNvbCkgLT0gdG1wICogaXQudmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLy8gYmFja3dhcmQgc3Vic3RpdHV0aW9uLCBjb2wtbWFqb3IKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZT4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxMaHMsUmhzLE1vZGUsVXBwZXIsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIGV2YWx1YXRvcjxMaHM+IExoc0V2YWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgZXZhbHVhdG9yPExocz46OklubmVySXRlcmF0b3IgTGhzSXRlcmF0b3I7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiBvdGhlcikKKyAgeworICAgIExoc0V2YWwgbGhzRXZhbChsaHMpOworICAgIGZvcihJbmRleCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKKyAgICB7CisgICAgICBmb3IoSW5kZXggaT1saHMuY29scygpLTE7IGk+PTA7IC0taSkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyJiB0bXAgPSBvdGhlci5jb2VmZlJlZihpLGNvbCk7CisgICAgICAgIGlmICh0bXAhPVNjYWxhcigwKSkgLy8gb3B0aW1pemF0aW9uIHdoZW4gb3RoZXIgaXMgYWN0dWFsbHkgc3BhcnNlCisgICAgICAgIHsKKyAgICAgICAgICBpZighKE1vZGUgJiBVbml0RGlhZykpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETyByZXBsYWNlIHRoaXMgYnkgYSBiaW5hcnkgc2VhcmNoLiBtYWtlIHN1cmUgdGhlIGJpbmFyeSBzZWFyY2ggaXMgc2FmZSBmb3IgcGFydGlhbGx5IHNvcnRlZCBlbGVtZW50cworICAgICAgICAgICAgTGhzSXRlcmF0b3IgaXQobGhzRXZhbCwgaSk7CisgICAgICAgICAgICB3aGlsZShpdCAmJiBpdC5pbmRleCgpIT1pKQorICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0ICYmIGl0LmluZGV4KCk9PWkpOworICAgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC89IGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIExoc0l0ZXJhdG9yIGl0KGxoc0V2YWwsIGkpOworICAgICAgICAgIGZvcig7IGl0ICYmIGl0LmluZGV4KCk8aTsgKytpdCkKKyAgICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGl0LmluZGV4KCksIGNvbCkgLT0gdG1wICogaXQudmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsdW5zaWduZWQgaW50IE1vZGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIFRyaWFuZ3VsYXJWaWV3SW1wbDxFeHByZXNzaW9uVHlwZSxNb2RlLFNwYXJzZT46OnNvbHZlSW5QbGFjZShNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQoZGVyaXZlZCgpLmNvbHMoKSA9PSBkZXJpdmVkKCkucm93cygpICYmIGRlcml2ZWQoKS5jb2xzKCkgPT0gb3RoZXIucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KCghKE1vZGUgJiBaZXJvRGlhZykpICYmIGJvb2woTW9kZSAmIChVcHBlcnxMb3dlcikpKTsKKworICBlbnVtIHsgY29weSA9IGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGNvcHksCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxPdGhlckRlcml2ZWQ+Ojp0eXBlLCBPdGhlckRlcml2ZWQmPjo6dHlwZSBPdGhlckNvcHk7CisgIE90aGVyQ29weSBvdGhlckNvcHkob3RoZXIuZGVyaXZlZCgpKTsKKworICBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8RXhwcmVzc2lvblR5cGUsIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPE90aGVyQ29weT46OnR5cGUsIE1vZGU+OjpydW4oZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSwgb3RoZXJDb3B5KTsKKworICBpZiAoY29weSkKKyAgICBvdGhlciA9IG90aGVyQ29weTsKK30KKyNlbmRpZgorCisvLyBwdXJlIHNwYXJzZSBwYXRoCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwKKyAgaW50IFVwTG8gPSAoTW9kZSAmIExvd2VyKQorICAgICAgICAgICA/IExvd2VyCisgICAgICAgICAgIDogKE1vZGUgJiBVcHBlcikKKyAgICAgICAgICAgPyBVcHBlcgorICAgICAgICAgICA6IC0xLAorICBpbnQgU3RvcmFnZU9yZGVyID0gaW50KExoczo6RmxhZ3MpICYgKFJvd01ham9yQml0KT4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zcGFyc2Vfc2VsZWN0b3I7CisKKy8vIGZvcndhcmQgc3Vic3RpdHV0aW9uLCBjb2wtbWFqb3IKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwgaW50IFVwTG8+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc3BhcnNlX3NlbGVjdG9yPExocyxSaHMsTW9kZSxVcExvLENvbE1ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPExocz46OlN0b3JhZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJocz46OlN0b3JhZ2VJbmRleD46OnR5cGUgU3RvcmFnZUluZGV4OworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgb3RoZXIpCisgIHsKKyAgICBjb25zdCBib29sIElzTG93ZXIgPSAoVXBMbz09TG93ZXIpOworICAgIEFtYmlWZWN0b3I8U2NhbGFyLFN0b3JhZ2VJbmRleD4gdGVtcFZlY3RvcihvdGhlci5yb3dzKCkqMik7CisgICAgdGVtcFZlY3Rvci5zZXRCb3VuZHMoMCxvdGhlci5yb3dzKCkpOworCisgICAgUmhzIHJlcyhvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgcmVzLnJlc2VydmUob3RoZXIubm9uWmVyb3MoKSk7CisKKyAgICBmb3IoSW5kZXggY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgLy8gRklYTUUgZXN0aW1hdGUgbnVtYmVyIG9mIG5vbiB6ZXJvcworICAgICAgdGVtcFZlY3Rvci5pbml0KC45OS8qZmxvYXQob3RoZXIuY29sKGNvbCkubm9uWmVyb3MoKSkvZmxvYXQob3RoZXIucm93cygpKSovKTsKKyAgICAgIHRlbXBWZWN0b3Iuc2V0WmVybygpOworICAgICAgdGVtcFZlY3Rvci5yZXN0YXJ0KCk7CisgICAgICBmb3IgKHR5cGVuYW1lIFJoczo6SW5uZXJJdGVyYXRvciByaHNJdChvdGhlciwgY29sKTsgcmhzSXQ7ICsrcmhzSXQpCisgICAgICB7CisgICAgICAgIHRlbXBWZWN0b3IuY29lZmZSZWYocmhzSXQuaW5kZXgoKSkgPSByaHNJdC52YWx1ZSgpOworICAgICAgfQorCisgICAgICBmb3IoSW5kZXggaT1Jc0xvd2VyPzA6bGhzLmNvbHMoKS0xOworICAgICAgICAgIElzTG93ZXI/aTxsaHMuY29scygpOmk+PTA7CisgICAgICAgICAgaSs9SXNMb3dlcj8xOi0xKQorICAgICAgeworICAgICAgICB0ZW1wVmVjdG9yLnJlc3RhcnQoKTsKKyAgICAgICAgU2NhbGFyJiBjaSA9IHRlbXBWZWN0b3IuY29lZmZSZWYoaSk7CisgICAgICAgIGlmIChjaSE9U2NhbGFyKDApKQorICAgICAgICB7CisgICAgICAgICAgLy8gZmluZAorICAgICAgICAgIHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBpdChsaHMsIGkpOworICAgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNMb3dlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0LmluZGV4KCk9PWkpOworICAgICAgICAgICAgICBjaSAvPSBpdC52YWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBjaSAvPSBsaHMuY29lZmYoaSxpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGVtcFZlY3Rvci5yZXN0YXJ0KCk7CisgICAgICAgICAgaWYgKElzTG93ZXIpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0LmluZGV4KCk9PWkpCisgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICBmb3IoOyBpdDsgKytpdCkKKyAgICAgICAgICAgICAgdGVtcFZlY3Rvci5jb2VmZlJlZihpdC5pbmRleCgpKSAtPSBjaSAqIGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IoOyBpdCAmJiBpdC5pbmRleCgpPGk7ICsraXQpCisgICAgICAgICAgICAgIHRlbXBWZWN0b3IuY29lZmZSZWYoaXQuaW5kZXgoKSkgLT0gY2kgKiBpdC52YWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICAgIC8vIEZJWE1FIGNvbXB1dGUgYSByZWZlcmVuY2UgdmFsdWUgdG8gZmlsdGVyIHplcm9zCisgICAgICBmb3IgKHR5cGVuYW1lIEFtYmlWZWN0b3I8U2NhbGFyLFN0b3JhZ2VJbmRleD46Okl0ZXJhdG9yIGl0KHRlbXBWZWN0b3IvKiwxZS0xMiovKTsgaXQ7ICsraXQpCisgICAgICB7CisgICAgICAgICsrIGNvdW50OworLy8gICAgICAgICBzdGQ6OmNlcnIgPDwgImZpbGwgIiA8PCBpdC5pbmRleCgpIDw8ICIsICIgPDwgY29sIDw8ICJcbiI7CisvLyAgICAgICAgIHN0ZDo6Y291dCA8PCBpdC52YWx1ZSgpIDw8ICIgICI7CisgICAgICAgIC8vIEZJWE1FIHVzZSBpbnNlcnRCYWNrCisgICAgICAgIHJlcy5pbnNlcnQoaXQuaW5kZXgoKSwgY29sKSA9IGl0LnZhbHVlKCk7CisgICAgICB9CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgInRlbXBWZWN0b3Iubm9uWmVyb3MoKSA9PSAiIDw8IGludChjb3VudCkgPDwgIiAvICIgPDwgKG90aGVyLnJvd3MoKSkgPDwgIlxuIjsKKyAgICB9CisgICAgcmVzLmZpbmFsaXplKCk7CisgICAgb3RoZXIgPSByZXMubWFya0FzUlZhbHVlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSx1bnNpZ25lZCBpbnQgTW9kZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3ZvaWQgVHJpYW5ndWxhclZpZXdJbXBsPEV4cHJlc3Npb25UeXBlLE1vZGUsU3BhcnNlPjo6c29sdmVJblBsYWNlKFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChkZXJpdmVkKCkuY29scygpID09IGRlcml2ZWQoKS5yb3dzKCkgJiYgZGVyaXZlZCgpLmNvbHMoKSA9PSBvdGhlci5yb3dzKCkpOworICBlaWdlbl9hc3NlcnQoICghKE1vZGUgJiBaZXJvRGlhZykpICYmIGJvb2woTW9kZSAmIChVcHBlcnxMb3dlcikpKTsKKworLy8gICBlbnVtIHsgY29weSA9IGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCB9OworCisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGNvcHksCisvLyAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxPdGhlckRlcml2ZWQ+Ojp0eXBlLCBPdGhlckRlcml2ZWQmPjo6dHlwZSBPdGhlckNvcHk7CisvLyAgIE90aGVyQ29weSBvdGhlckNvcHkob3RoZXIuZGVyaXZlZCgpKTsKKworICBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc3BhcnNlX3NlbGVjdG9yPEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQsIE1vZGU+OjpydW4oZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSwgb3RoZXIuZGVyaXZlZCgpKTsKKworLy8gICBpZiAoY29weSkKKy8vICAgICBvdGhlciA9IG90aGVyQ29weTsKK30KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVRSSUFOR1VMQVJTT0xWRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgzYWIzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVLmgKQEAgLTAsMCArMSw3NzUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0xVX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0xVX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfT3JkZXJpbmdUeXBlID0gQ09MQU1ET3JkZXJpbmc8dHlwZW5hbWUgX01hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleD4gPiBjbGFzcyBTcGFyc2VMVTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXBwZWRTcGFyc2VNYXRyaXhUeXBlPiBzdHJ1Y3QgU3BhcnNlTFVNYXRyaXhMUmV0dXJuVHlwZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhMVHlwZSwgdHlwZW5hbWUgTWF0cml4VVR5cGU+IHN0cnVjdCBTcGFyc2VMVU1hdHJpeFVSZXR1cm5UeXBlOworCisvKiogXGluZ3JvdXAgU3BhcnNlTFVfTW9kdWxlCisgICogXGNsYXNzIFNwYXJzZUxVCisgICogCisgICogXGJyaWVmIFNwYXJzZSBzdXBlcm5vZGFsIExVIGZhY3Rvcml6YXRpb24gZm9yIGdlbmVyYWwgbWF0cmljZXMKKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHN1cGVybm9kYWwgTFUgZmFjdG9yaXphdGlvbiBmb3IgZ2VuZXJhbCBtYXRyaWNlcy4KKyAgKiBJdCB1c2VzIHRoZSBtYWluIHRlY2huaXF1ZXMgZnJvbSB0aGUgc2VxdWVudGlhbCBTdXBlckxVIHBhY2thZ2UgCisgICogKGh0dHA6Ly9jcmQtbGVnYWN5LmxibC5nb3YvfnhpYW95ZS9TdXBlckxVLykuIEl0IGhhbmRsZXMgdHJhbnNwYXJlbnRseSByZWFsIAorICAqIGFuZCBjb21wbGV4IGFyaXRobWV0aWNzIHdpdGggc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uLCBkZXBlbmRpbmcgb24gdGhlIAorICAqIHNjYWxhciB0eXBlIG9mIHlvdXIgaW5wdXQgbWF0cml4LiAKKyAgKiBUaGUgY29kZSBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gcHJvdmlkZSBCTEFTLTMgb3BlcmF0aW9ucyBkdXJpbmcgc3VwZXJub2RlLXBhbmVsIHVwZGF0ZXMuIAorICAqIEl0IGJlbmVmaXRzIGRpcmVjdGx5IGZyb20gdGhlIGJ1aWx0LWluIGhpZ2gtcGVyZm9ybWFudCBFaWdlbiBCTEFTIHJvdXRpbmVzLiAKKyAgKiBNb3Jlb3Zlciwgd2hlbiB0aGUgc2l6ZSBvZiBhIHN1cGVybm9kZSBpcyB2ZXJ5IHNtYWxsLCB0aGUgQkxBUyBjYWxscyBhcmUgYXZvaWRlZCB0byAKKyAgKiBlbmFibGUgYSBiZXR0ZXIgb3B0aW1pemF0aW9uIGZyb20gdGhlIGNvbXBpbGVyLiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgCisgICogeW91IHNob3VsZCBjb21waWxlIGl0IHdpdGggTkRFQlVHIGZsYWcgdG8gYXZvaWQgdGhlIG51bWVyb3VzIGJvdW5kcyBjaGVja2luZyBvbiB2ZWN0b3JzLiAKKyAgKiAKKyAgKiBBbiBpbXBvcnRhbnQgcGFyYW1ldGVyIG9mIHRoaXMgY2xhc3MgaXMgdGhlIG9yZGVyaW5nIG1ldGhvZC4gSXQgaXMgdXNlZCB0byByZW9yZGVyIHRoZSBjb2x1bW5zIAorICAqIChhbmQgZXZlbnR1YWxseSB0aGUgcm93cykgb2YgdGhlIG1hdHJpeCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBuZXcgZWxlbWVudHMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgCisgICogbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24uIFRoZSBjaGVhcGVzdCBtZXRob2QgYXZhaWxhYmxlIGlzIENPTEFNRC4gCisgICogU2VlICBcbGluayBPcmRlcmluZ01ldGhvZHNfTW9kdWxlIHRoZSBPcmRlcmluZ01ldGhvZHMgbW9kdWxlIFxlbmRsaW5rIGZvciB0aGUgbGlzdCBvZiAKKyAgKiBidWlsdC1pbiBhbmQgZXh0ZXJuYWwgb3JkZXJpbmcgbWV0aG9kcy4gCisgICoKKyAgKiBTaW1wbGUgZXhhbXBsZSB3aXRoIGtleSBzdGVwcyAKKyAgKiBcY29kZQorICAqIFZlY3RvclhkIHgobiksIGIobik7CisgICogU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+IEE7CisgICogU3BhcnNlTFU8U3BhcnNlTWF0cml4PHNjYWxhciwgQ29sTWFqb3I+LCBDT0xBTURPcmRlcmluZzxJbmRleD4gPiAgIHNvbHZlcjsKKyAgKiAvLyBmaWxsIEEgYW5kIGI7CisgICogLy8gQ29tcHV0ZSB0aGUgb3JkZXJpbmcgcGVybXV0YXRpb24gdmVjdG9yIGZyb20gdGhlIHN0cnVjdHVyYWwgcGF0dGVybiBvZiBBCisgICogc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOyAKKyAgKiAvLyBDb21wdXRlIHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbiAKKyAgKiBzb2x2ZXIuZmFjdG9yaXplKEEpOyAKKyAgKiAvL1VzZSB0aGUgZmFjdG9ycyB0byBzb2x2ZSB0aGUgbGluZWFyIHN5c3RlbSAKKyAgKiB4ID0gc29sdmVyLnNvbHZlKGIpOyAKKyAgKiBcZW5kY29kZQorICAqIAorICAqIFx3YXJuaW5nIFRoZSBpbnB1dCBtYXRyaXggQSBzaG91bGQgYmUgaW4gYSBcYiBjb21wcmVzc2VkIGFuZCBcYiBjb2x1bW4tbWFqb3IgZm9ybS4KKyAgKiBPdGhlcndpc2UgYW4gZXhwZW5zaXZlIGNvcHkgd2lsbCBiZSBtYWRlLiBZb3UgY2FuIGNhbGwgdGhlIGluZXhwZW5zaXZlIG1ha2VDb21wcmVzc2VkKCkgdG8gZ2V0IGEgY29tcHJlc3NlZCBtYXRyaXguCisgICogCisgICogXG5vdGUgVW5saWtlIHRoZSBpbml0aWFsIFN1cGVyTFUgaW1wbGVtZW50YXRpb24sIHRoZXJlIGlzIG5vIHN0ZXAgdG8gZXF1aWxpYnJhdGUgdGhlIG1hdHJpeC4gCisgICogRm9yIGJhZGx5IHNjYWxlZCBtYXRyaWNlcywgdGhpcyBzdGVwIGNhbiBiZSB1c2VmdWwgdG8gcmVkdWNlIHRoZSBwaXZvdGluZyBkdXJpbmcgZmFjdG9yaXphdGlvbi4gCisgICogSWYgdGhpcyBpcyB0aGUgY2FzZSBmb3IgeW91ciBtYXRyaWNlcywgeW91IGNhbiB0cnkgdGhlIGJhc2ljIHNjYWxpbmcgbWV0aG9kIGF0CisgICogICJ1bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9TY2FsaW5nLmgiCisgICogCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSBUaGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeC4gSXQgbXVzdCBiZSBhIGNvbHVtbi1tYWpvciBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gX09yZGVyaW5nVHlwZSBUaGUgb3JkZXJpbmcgbWV0aG9kIHRvIHVzZSwgZWl0aGVyIEFNRCwgQ09MQU1EIG9yIE1FVElTLiBEZWZhdWx0IGlzIENPTE1BRAorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICogCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VTb2x2ZXJDb25jZXB0CisgICogXHNhIFxyZWYgT3JkZXJpbmdNZXRob2RzX01vZHVsZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfT3JkZXJpbmdUeXBlPgorY2xhc3MgU3BhcnNlTFUgOiBwdWJsaWMgU3BhcnNlU29sdmVyQmFzZTxTcGFyc2VMVTxfTWF0cml4VHlwZSxfT3JkZXJpbmdUeXBlPiA+LCBwdWJsaWMgaW50ZXJuYWw6OlNwYXJzZUxVSW1wbDx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyLCB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4PgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPFNwYXJzZUxVPF9NYXRyaXhUeXBlLF9PcmRlcmluZ1R5cGU+ID4gQVBJQmFzZTsKKyAgICB1c2luZyBBUElCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB1c2luZyBBUElCYXNlOjpfc29sdmVfaW1wbDsKKyAgICAKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7IAorICAgIHR5cGVkZWYgX09yZGVyaW5nVHlwZSBPcmRlcmluZ1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOyAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+IE5DTWF0cml4OworICAgIHR5cGVkZWYgaW50ZXJuYWw6Ok1hcHBlZFN1cGVyTm9kYWxNYXRyaXg8U2NhbGFyLCBTdG9yYWdlSW5kZXg+IFNDTWF0cml4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFNjYWxhclZlY3RvcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsRHluYW1pYywxPiBJbmRleFZlY3RvcjsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIFN0b3JhZ2VJbmRleD4gUGVybXV0YXRpb25UeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlNwYXJzZUxVSW1wbDxTY2FsYXIsIFN0b3JhZ2VJbmRleD4gQmFzZTsKKworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIAorICBwdWJsaWM6CisgICAgU3BhcnNlTFUoKTptX2xhc3RFcnJvcigiIiksbV9Vc3RvcmUoMCwwLDAsMCwwLDApLG1fc3ltbWV0cmljbW9kZShmYWxzZSksbV9kaWFncGl2b3R0aHJlc2goMS4wKSxtX2RldFBlcm1SKDEpCisgICAgeworICAgICAgaW5pdHBlcmZ2YWx1ZXMoKTsgCisgICAgfQorICAgIGV4cGxpY2l0IFNwYXJzZUxVKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9sYXN0RXJyb3IoIiIpLG1fVXN0b3JlKDAsMCwwLDAsMCwwKSxtX3N5bW1ldHJpY21vZGUoZmFsc2UpLG1fZGlhZ3Bpdm90dGhyZXNoKDEuMCksbV9kZXRQZXJtUigxKQorICAgIHsKKyAgICAgIGluaXRwZXJmdmFsdWVzKCk7IAorICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICB+U3BhcnNlTFUoKQorICAgIHsKKyAgICAgIC8vIEZyZWUgYWxsIGV4cGxpY2l0IGR5bmFtaWMgcG9pbnRlcnMgCisgICAgfQorICAgIAorICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4gKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgdm9pZCBmYWN0b3JpemUgKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgdm9pZCBzaW1wbGljaWFsZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgCisgICAgLyoqCisgICAgICAqIENvbXB1dGUgdGhlIHN5bWJvbGljIGFuZCBudW1lcmljIGZhY3Rvcml6YXRpb24gb2YgdGhlIGlucHV0IHNwYXJzZSBtYXRyaXguCisgICAgICAqIFRoZSBpbnB1dCBtYXRyaXggc2hvdWxkIGJlIGluIGNvbHVtbi1tYWpvciBzdG9yYWdlLiAKKyAgICAgICovCisgICAgdm9pZCBjb21wdXRlIChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgLy8gQW5hbHl6ZSAKKyAgICAgIGFuYWx5emVQYXR0ZXJuKG1hdHJpeCk7IAorICAgICAgLy9GYWN0b3JpemUKKyAgICAgIGZhY3Rvcml6ZShtYXRyaXgpOworICAgIH0gCisgICAgCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0LmNvbHMoKTsgfQorICAgIC8qKiBJbmRpY2F0ZSB0aGF0IHRoZSBwYXR0ZXJuIG9mIHRoZSBpbnB1dCBtYXRyaXggaXMgc3ltbWV0cmljICovCisgICAgdm9pZCBpc1N5bW1ldHJpYyhib29sIHN5bSkKKyAgICB7CisgICAgICBtX3N5bW1ldHJpY21vZGUgPSBzeW07CisgICAgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYXRyaXggTCwgaW50ZXJuYWxseSBzdG9yZWQgYXMgc3VwZXJub2RlcworICAgICAgKiBUaGUgb25seSBvcGVyYXRpb24gYXZhaWxhYmxlIHdpdGggdGhpcyBleHByZXNzaW9uIGlzIHRoZSB0cmlhbmd1bGFyIHNvbHZlCisgICAgICAqIFxjb2RlCisgICAgICAqIHkgPSBiOyBtYXRyaXhMKCkuc29sdmVJblBsYWNlKHkpOworICAgICAgKiBcZW5kY29kZQorICAgICAgKi8KKyAgICBTcGFyc2VMVU1hdHJpeExSZXR1cm5UeXBlPFNDTWF0cml4PiBtYXRyaXhMKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gU3BhcnNlTFVNYXRyaXhMUmV0dXJuVHlwZTxTQ01hdHJpeD4obV9Mc3RvcmUpOworICAgIH0KKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbWF0cml4IFUsCisgICAgICAqIFRoZSBvbmx5IG9wZXJhdGlvbiBhdmFpbGFibGUgd2l0aCB0aGlzIGV4cHJlc3Npb24gaXMgdGhlIHRyaWFuZ3VsYXIgc29sdmUKKyAgICAgICogXGNvZGUKKyAgICAgICogeSA9IGI7IG1hdHJpeFUoKS5zb2x2ZUluUGxhY2UoeSk7CisgICAgICAqIFxlbmRjb2RlCisgICAgICAqLworICAgIFNwYXJzZUxVTWF0cml4VVJldHVyblR5cGU8U0NNYXRyaXgsTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+ID4gbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFNwYXJzZUxVTWF0cml4VVJldHVyblR5cGU8U0NNYXRyaXgsIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsU3RvcmFnZUluZGV4PiA+KG1fTHN0b3JlLCBtX1VzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSByb3cgbWF0cml4IHBlcm11dGF0aW9uIFxmJCBQX3IgXGYkIHN1Y2ggdGhhdCBcZiRQX3IgQSBQX2NeVCA9IEwgVVxmJAorICAgICAgKiBcc2EgY29sc1Blcm11dGF0aW9uKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgcm93c1Blcm11dGF0aW9uKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9wZXJtX3I7CisgICAgfQorICAgIC8qKgorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29sdW1uIG1hdHJpeCBwZXJtdXRhdGlvblxmJCBQX2NeVCBcZiQgc3VjaCB0aGF0IFxmJFBfciBBIFBfY15UID0gTCBVXGYkCisgICAgICAqIFxzYSByb3dzUGVybXV0YXRpb24oKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUGVybXV0YXRpb25UeXBlJiBjb2xzUGVybXV0YXRpb24oKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3Blcm1fYzsKKyAgICB9CisgICAgLyoqIFNldCB0aGUgdGhyZXNob2xkIHVzZWQgZm9yIGEgZGlhZ29uYWwgZW50cnkgdG8gYmUgYW4gYWNjZXB0YWJsZSBwaXZvdC4gKi8KKyAgICB2b2lkIHNldFBpdm90VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaCkKKyAgICB7CisgICAgICBtX2RpYWdwaXZvdHRocmVzaCA9IHRocmVzaDsgCisgICAgfQorCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIFggb2YgXGYkIEEgWCA9IEIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCBYIGluIFggPSB0aGlzLT5zb2x2ZShCKSBtdXN0IGJlIGNvbG11bi1tYWpvci4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IFNvbHZlPFNwYXJzZUxVLCBSaHM+IHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgQikgY29uc3Q7CisjZW5kaWYgLy8gRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgTFUgZmFjdG9yaXphdGlvbiByZXBvcnRzIGEgcHJvYmxlbSwgemVybyBkaWFnb25hbCBmb3IgaW5zdGFuY2UKKyAgICAgICogICAgICAgICAgXGMgSW52YWxpZElucHV0IGlmIHRoZSBpbnB1dCBtYXRyaXggaXMgaW52YWxpZAorICAgICAgKgorICAgICAgKiBcc2EgaXBhcm0oKSAgICAgICAgICAKKyAgICAgICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkRlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICAqIFxyZXR1cm5zIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICAgICovCisgICAgc3RkOjpzdHJpbmcgbGFzdEVycm9yTWVzc2FnZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbGFzdEVycm9yOyAKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3Q+CisgICAgYm9vbCBfc29sdmVfaW1wbChjb25zdCBNYXRyaXhCYXNlPFJocz4gJkIsIE1hdHJpeEJhc2U8RGVzdD4gJlhfYmFzZSkgY29uc3QKKyAgICB7CisgICAgICBEZXN0JiBYKFhfYmFzZS5kZXJpdmVkKCkpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBtYXRyaXggc2hvdWxkIGJlIGZhY3Rvcml6ZWQgZmlyc3QiKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KT09MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUyk7CisgICAgICAKKyAgICAgIC8vIFBlcm11dGUgdGhlIHJpZ2h0IGhhbmQgc2lkZSB0byBmb3JtIFggPSBQcipCCisgICAgICAvLyBvbiByZXR1cm4sIFggaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbXB1dGVkIHNvbHV0aW9uCisgICAgICBYLnJlc2l6ZShCLnJvd3MoKSxCLmNvbHMoKSk7CisKKyAgICAgIC8vIHRoaXMgdWdseSBjb25zdF9jYXN0X2Rlcml2ZWQoKSBoZWxwcyB0byBkZXRlY3QgYWxpYXNpbmcgd2hlbiBhcHBseWluZyB0aGUgcGVybXV0YXRpb25zCisgICAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBCLmNvbHMoKTsgKytqKQorICAgICAgICBYLmNvbChqKSA9IHJvd3NQZXJtdXRhdGlvbigpICogQi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2woaik7CisgICAgICAKKyAgICAgIC8vRm9yd2FyZCBzdWJzdGl0dXRpb24gd2l0aCBMCisgICAgICB0aGlzLT5tYXRyaXhMKCkuc29sdmVJblBsYWNlKFgpOworICAgICAgdGhpcy0+bWF0cml4VSgpLnNvbHZlSW5QbGFjZShYKTsKKyAgICAgIAorICAgICAgLy8gUGVybXV0ZSBiYWNrIHRoZSBzb2x1dGlvbiAKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBCLmNvbHMoKTsgKytqKQorICAgICAgICBYLmNvbChqKSA9IGNvbHNQZXJtdXRhdGlvbigpLmludmVyc2UoKSAqIFguY29sKGopOworICAgICAgCisgICAgICByZXR1cm4gdHJ1ZTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAgKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIGEgZGV0ZXJtaW5hbnQgY2FuIGJlIHZlcnkgYmlnIG9yIHNtYWxsLCBzbyBmb3IgbWF0cmljZXMKKyAgICAgICogb2YgbGFyZ2UgZW5vdWdoIGRpbWVuc2lvbiwgdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdy4KKyAgICAgICogT25lIHdheSB0byB3b3JrIGFyb3VuZCB0aGF0IGlzIHRvIHVzZSBsb2dBYnNEZXRlcm1pbmFudCgpIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxzYSBsb2dBYnNEZXRlcm1pbmFudCgpLCBzaWduRGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICBTY2FsYXIgYWJzRGV0ZXJtaW5hbnQoKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YWJzOworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBtYXRyaXggc2hvdWxkIGJlIGZhY3Rvcml6ZWQgZmlyc3QuIik7CisgICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIGRldGVybWluYW50IG9mIHRoZSByb3cgbWF0cml4CisgICAgICBTY2FsYXIgZGV0ID0gU2NhbGFyKDEuKTsKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZGlhZ29uYWwgYmxvY2tzIG9mIFUgYXJlIHN0b3JlZCBpbiBzdXBlcm5vZGVzLAorICAgICAgLy8gd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgIEwgcGFydCA6KQorICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHRoaXMtPmNvbHMoKTsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKHR5cGVuYW1lIFNDTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KG1fTHN0b3JlLCBqKTsgaXQ7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpdC5pbmRleCgpID09IGopCisgICAgICAgICAgeworICAgICAgICAgICAgZGV0ICo9IGFicyhpdC52YWx1ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGRldDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5hdHVyYWwgbG9nIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeAorICAgICAgKiBvZiB3aGljaCAqKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIHRoZSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdyB0aGF0J3MKKyAgICAgICogaW5oZXJlbnQgdG8gdGhlIGRldGVybWluYW50IGNvbXB1dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgYWJzRGV0ZXJtaW5hbnQoKSwgc2lnbkRldGVybWluYW50KCkKKyAgICAgICovCisgICAgU2NhbGFyIGxvZ0Fic0RldGVybWluYW50KCkgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmxvZzsKKyAgICAgIHVzaW5nIHN0ZDo6YWJzOworCisgICAgICBlaWdlbl9hc3NlcnQobV9mYWN0b3JpemF0aW9uSXNPayAmJiAiVGhlIG1hdHJpeCBzaG91bGQgYmUgZmFjdG9yaXplZCBmaXJzdC4iKTsKKyAgICAgIFNjYWxhciBkZXQgPSBTY2FsYXIoMC4pOworICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHRoaXMtPmNvbHMoKTsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKHR5cGVuYW1lIFNDTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KG1fTHN0b3JlLCBqKTsgaXQ7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpdC5yb3coKSA8IGopIGNvbnRpbnVlOworICAgICAgICAgIGlmKGl0LnJvdygpID09IGopCisgICAgICAgICAgeworICAgICAgICAgICAgZGV0ICs9IGxvZyhhYnMoaXQudmFsdWUoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZGV0OworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBBIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHNpZ24gb2YgdGhlIGRldGVybWluYW50CisgICAgICAqCisgICAgICAqIFxzYSBhYnNEZXRlcm1pbmFudCgpLCBsb2dBYnNEZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIFNjYWxhciBzaWduRGV0ZXJtaW5hbnQoKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgbWF0cml4IHNob3VsZCBiZSBmYWN0b3JpemVkIGZpcnN0LiIpOworICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgcm93IG1hdHJpeAorICAgICAgSW5kZXggZGV0ID0gMTsKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZGlhZ29uYWwgYmxvY2tzIG9mIFUgYXJlIHN0b3JlZCBpbiBzdXBlcm5vZGVzLAorICAgICAgLy8gd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgIEwgcGFydCA6KQorICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHRoaXMtPmNvbHMoKTsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKHR5cGVuYW1lIFNDTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KG1fTHN0b3JlLCBqKTsgaXQ7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpdC5pbmRleCgpID09IGopCisgICAgICAgICAgeworICAgICAgICAgICAgaWYoaXQudmFsdWUoKTwwKQorICAgICAgICAgICAgICBkZXQgPSAtZGV0OworICAgICAgICAgICAgZWxzZSBpZihpdC52YWx1ZSgpPT0wKQorICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGRldCAqIG1fZGV0UGVybVIgKiBtX2RldFBlcm1DOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgVGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxzYSBhYnNEZXRlcm1pbmFudCgpLCBsb2dBYnNEZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIFNjYWxhciBkZXRlcm1pbmFudCgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBtYXRyaXggc2hvdWxkIGJlIGZhY3Rvcml6ZWQgZmlyc3QuIik7CisgICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIGRldGVybWluYW50IG9mIHRoZSByb3cgbWF0cml4CisgICAgICBTY2FsYXIgZGV0ID0gU2NhbGFyKDEuKTsKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZGlhZ29uYWwgYmxvY2tzIG9mIFUgYXJlIHN0b3JlZCBpbiBzdXBlcm5vZGVzLAorICAgICAgLy8gd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgIEwgcGFydCA6KQorICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHRoaXMtPmNvbHMoKTsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKHR5cGVuYW1lIFNDTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KG1fTHN0b3JlLCBqKTsgaXQ7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpdC5pbmRleCgpID09IGopCisgICAgICAgICAgeworICAgICAgICAgICAgZGV0ICo9IGl0LnZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAobV9kZXRQZXJtUiAqIG1fZGV0UGVybUMpID4gMCA/IGRldCA6IC1kZXQ7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICAvLyBGdW5jdGlvbnMgCisgICAgdm9pZCBpbml0cGVyZnZhbHVlcygpCisgICAgeworICAgICAgbV9wZXJmdi5wYW5lbF9zaXplID0gMTY7CisgICAgICBtX3BlcmZ2LnJlbGF4ID0gMTsgCisgICAgICBtX3BlcmZ2Lm1heHN1cGVyID0gMTI4OyAKKyAgICAgIG1fcGVyZnYucm93YmxrID0gMTY7IAorICAgICAgbV9wZXJmdi5jb2xibGsgPSA4OyAKKyAgICAgIG1fcGVyZnYuZmlsbGZhY3RvciA9IDIwOyAgCisgICAgfQorICAgICAgCisgICAgLy8gVmFyaWFibGVzIAorICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBib29sIG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgYm9vbCBtX2FuYWx5c2lzSXNPazsKKyAgICBzdGQ6OnN0cmluZyBtX2xhc3RFcnJvcjsKKyAgICBOQ01hdHJpeCBtX21hdDsgLy8gVGhlIGlucHV0IChwZXJtdXRlZCApIG1hdHJpeCAKKyAgICBTQ01hdHJpeCBtX0xzdG9yZTsgLy8gVGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IChzdXBlcm5vZGFsKQorICAgIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsU3RvcmFnZUluZGV4PiBtX1VzdG9yZTsgLy8gVGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4CisgICAgUGVybXV0YXRpb25UeXBlIG1fcGVybV9jOyAvLyBDb2x1bW4gcGVybXV0YXRpb24gCisgICAgUGVybXV0YXRpb25UeXBlIG1fcGVybV9yIDsgLy8gUm93IHBlcm11dGF0aW9uCisgICAgSW5kZXhWZWN0b3IgbV9ldHJlZTsgLy8gQ29sdW1uIGVsaW1pbmF0aW9uIHRyZWUgCisgICAgCisgICAgdHlwZW5hbWUgQmFzZTo6R2xvYmFsTFVfdCBtX2dsdTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgLy8gU3BhcnNlTFUgb3B0aW9ucyAKKyAgICBib29sIG1fc3ltbWV0cmljbW9kZTsKKyAgICAvLyB2YWx1ZXMgZm9yIHBlcmZvcm1hbmNlIAorICAgIGludGVybmFsOjpwZXJmdmFsdWVzIG1fcGVyZnY7CisgICAgUmVhbFNjYWxhciBtX2RpYWdwaXZvdHRocmVzaDsgLy8gU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdXNlZCBmb3IgYSBkaWFnb25hbCBlbnRyeSB0byBiZSBhbiBhY2NlcHRhYmxlIHBpdm90CisgICAgSW5kZXggbV9ubnpMLCBtX25uelU7IC8vIE5vbnplcm9zIGluIEwgYW5kIFUgZmFjdG9ycworICAgIEluZGV4IG1fZGV0UGVybVIsIG1fZGV0UGVybUM7IC8vIERldGVybWluYW50cyBvZiB0aGUgcGVybXV0YXRpb24gbWF0cmljZXMKKyAgcHJpdmF0ZToKKyAgICAvLyBEaXNhYmxlIGNvcHkgY29uc3RydWN0b3IgCisgICAgU3BhcnNlTFUgKGNvbnN0IFNwYXJzZUxVJiApOworICAKK307IC8vIEVuZCBjbGFzcyBTcGFyc2VMVQorCisKKworLy8gRnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgYW5heXNpcyBwaGFzZQorLyoqIAorICAqIENvbXB1dGUgdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiB0byBtaW5pbWl6ZSB0aGUgZmlsbC1pbgorICAqIAorICAqICAtIEFwcGx5IHRoaXMgcGVybXV0YXRpb24gdG8gdGhlIGlucHV0IG1hdHJpeCAtIAorICAqIAorICAqICAtIENvbXB1dGUgdGhlIGNvbHVtbiBlbGltaW5hdGlvbiB0cmVlIG9uIHRoZSBwZXJtdXRlZCBtYXRyaXggCisgICogCisgICogIC0gUG9zdG9yZGVyIHRoZSBlbGltaW5hdGlvbiB0cmVlIGFuZCB0aGUgY29sdW1uIHBlcm11dGF0aW9uCisgICogCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3JkZXJpbmdUeXBlPgordm9pZCBTcGFyc2VMVTxNYXRyaXhUeXBlLCBPcmRlcmluZ1R5cGU+OjphbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXQpCit7CisgIAorICAvL1RPRE8gIEl0IGlzIHBvc3NpYmxlIGFzIGluIFN1cGVyTFUgdG8gY29tcHV0ZSByb3cgYW5kIGNvbHVtbnMgc2NhbGluZyB2ZWN0b3JzIHRvIGVxdWlsaWJyYXRlIHRoZSBtYXRyaXggbWF0LgorICAKKyAgLy8gRmlyc3RseSwgY29weSB0aGUgd2hvbGUgaW5wdXQgbWF0cml4LiAKKyAgbV9tYXQgPSBtYXQ7CisgIAorICAvLyBDb21wdXRlIGZpbGwtaW4gb3JkZXJpbmcKKyAgT3JkZXJpbmdUeXBlIG9yZDsgCisgIG9yZChtX21hdCxtX3Blcm1fYyk7CisgIAorICAvLyBBcHBseSB0aGUgcGVybXV0YXRpb24gdG8gdGhlIGNvbHVtbiBvZiB0aGUgaW5wdXQgIG1hdHJpeAorICBpZiAobV9wZXJtX2Muc2l6ZSgpKQorICB7CisgICAgbV9tYXQudW5jb21wcmVzcygpOyAvL05PVEU6IFRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIGlzIG9ubHkgdG8gY3JlYXRlIHRoZSBJbm5lck5vbnplcm9zIHBvaW50ZXJzLiBGSVhNRSA6IFRoaXMgdmVjdG9yIGlzIGZpbGxlZCBidXQgbm90IHN1YnNlcXVlbnRseSB1c2VkLiAgCisgICAgLy8gVGhlbiwgcGVybXV0ZSBvbmx5IHRoZSBjb2x1bW4gcG9pbnRlcnMKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU3RvcmFnZUluZGV4LG91dGVySW5kZXhQdHIsbWF0LmNvbHMoKSsxLG1hdC5pc0NvbXByZXNzZWQoKT9jb25zdF9jYXN0PFN0b3JhZ2VJbmRleCo+KG1hdC5vdXRlckluZGV4UHRyKCkpOjApOworICAgIAorICAgIC8vIElmIHRoZSBpbnB1dCBtYXRyaXggJ21hdCcgaXMgdW5jb21wcmVzc2VkLCB0aGVuIHRoZSBvdXRlci1pbmRpY2VzIGRvIG5vdCBtYXRjaCB0aGUgb25lcyBvZiBtX21hdCwgYW5kIGEgY29weSBpcyB0aHVzIG5lZWRlZC4KKyAgICBpZighbWF0LmlzQ29tcHJlc3NlZCgpKSAKKyAgICAgIEluZGV4VmVjdG9yOjpNYXAob3V0ZXJJbmRleFB0ciwgbWF0LmNvbHMoKSsxKSA9IEluZGV4VmVjdG9yOjpNYXAobV9tYXQub3V0ZXJJbmRleFB0cigpLG1hdC5jb2xzKCkrMSk7CisgICAgCisgICAgLy8gQXBwbHkgdGhlIHBlcm11dGF0aW9uIGFuZCBjb21wdXRlIHRoZSBubnogcGVyIGNvbHVtbi4KKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbWF0LmNvbHMoKTsgaSsrKQorICAgIHsKKyAgICAgIG1fbWF0Lm91dGVySW5kZXhQdHIoKVttX3Blcm1fYy5pbmRpY2VzKCkoaSldID0gb3V0ZXJJbmRleFB0cltpXTsKKyAgICAgIG1fbWF0LmlubmVyTm9uWmVyb1B0cigpW21fcGVybV9jLmluZGljZXMoKShpKV0gPSBvdXRlckluZGV4UHRyW2krMV0gLSBvdXRlckluZGV4UHRyW2ldOworICAgIH0KKyAgfQorICAKKyAgLy8gQ29tcHV0ZSB0aGUgY29sdW1uIGVsaW1pbmF0aW9uIHRyZWUgb2YgdGhlIHBlcm11dGVkIG1hdHJpeCAKKyAgSW5kZXhWZWN0b3IgZmlyc3RSb3dFbHQ7CisgIGludGVybmFsOjpjb2xldHJlZShtX21hdCwgbV9ldHJlZSxmaXJzdFJvd0VsdCk7IAorICAgICAKKyAgLy8gSW4gc3ltbWV0cmljIG1vZGUsIGRvIG5vdCBkbyBwb3N0b3JkZXIgaGVyZQorICBpZiAoIW1fc3ltbWV0cmljbW9kZSkgeworICAgIEluZGV4VmVjdG9yIHBvc3QsIGl3b3JrOyAKKyAgICAvLyBQb3N0IG9yZGVyIGV0cmVlCisgICAgaW50ZXJuYWw6OnRyZWVQb3N0b3JkZXIoU3RvcmFnZUluZGV4KG1fbWF0LmNvbHMoKSksIG1fZXRyZWUsIHBvc3QpOyAKKyAgICAgIAorICAgCisgICAgLy8gUmVudW1iZXIgZXRyZWUgaW4gcG9zdG9yZGVyIAorICAgIEluZGV4IG0gPSBtX21hdC5jb2xzKCk7IAorICAgIGl3b3JrLnJlc2l6ZShtKzEpOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtOyArK2kpIGl3b3JrKHBvc3QoaSkpID0gcG9zdChtX2V0cmVlKGkpKTsKKyAgICBtX2V0cmVlID0gaXdvcms7CisgICAgCisgICAgLy8gUG9zdG11bHRpcGx5IEEqUGMgYnkgcG9zdCwgaS5lIHJlb3JkZXIgdGhlIG1hdHJpeCBhY2NvcmRpbmcgdG8gdGhlIHBvc3RvcmRlciBvZiB0aGUgZXRyZWUKKyAgICBQZXJtdXRhdGlvblR5cGUgcG9zdF9wZXJtKG0pOyAKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbTsgaSsrKSAKKyAgICAgIHBvc3RfcGVybS5pbmRpY2VzKCkoaSkgPSBwb3N0KGkpOyAKKyAgICAgICAgCisgICAgLy8gQ29tYmluZSB0aGUgdHdvIHBlcm11dGF0aW9ucyA6IHBvc3RvcmRlciB0aGUgcGVybXV0YXRpb24gZm9yIGZ1dHVyZSB1c2UKKyAgICBpZihtX3Blcm1fYy5zaXplKCkpIHsKKyAgICAgIG1fcGVybV9jID0gcG9zdF9wZXJtICogbV9wZXJtX2M7CisgICAgfQorICAgIAorICB9IC8vIGVuZCBwb3N0b3JkZXJpbmcgCisgIAorICBtX2FuYWx5c2lzSXNPayA9IHRydWU7IAorfQorCisvLyBGdW5jdGlvbnMgbmVlZGVkIGJ5IHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbiBwaGFzZQorCisKKy8qKiAKKyAgKiAgLSBOdW1lcmljYWwgZmFjdG9yaXphdGlvbiAKKyAgKiAgLSBJbnRlcmxlYXZlZCB3aXRoIHRoZSBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIAorICAqIE9uIGV4aXQsICBpbmZvIGlzIAorICAqIAorICAqICAgID0gMDogc3VjY2Vzc2Z1bCBmYWN0b3JpemF0aW9uCisgICogCisgICogICAgPiAwOiBpZiBpbmZvID0gaSwgYW5kIGkgaXMKKyAgKiAKKyAgKiAgICAgICA8PSBBLT5uY29sOiBVKGksaSkgaXMgZXhhY3RseSB6ZXJvLiBUaGUgZmFjdG9yaXphdGlvbiBoYXMKKyAgKiAgICAgICAgICBiZWVuIGNvbXBsZXRlZCwgYnV0IHRoZSBmYWN0b3IgVSBpcyBleGFjdGx5IHNpbmd1bGFyLAorICAqICAgICAgICAgIGFuZCBkaXZpc2lvbiBieSB6ZXJvIHdpbGwgb2NjdXIgaWYgaXQgaXMgdXNlZCB0byBzb2x2ZSBhCisgICogICAgICAgICAgc3lzdGVtIG9mIGVxdWF0aW9ucy4KKyAgKiAKKyAgKiAgICAgICA+IEEtPm5jb2w6IG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbgorICAqICAgICAgICAgZmFpbHVyZSBvY2N1cnJlZCwgcGx1cyBBLT5uY29sLiBJZiBsd29yayA9IC0xLCBpdCBpcworICAqICAgICAgICAgdGhlIGVzdGltYXRlZCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkLCBwbHVzIEEtPm5jb2wuICAKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPcmRlcmluZ1R5cGU+Cit2b2lkIFNwYXJzZUxVPE1hdHJpeFR5cGUsIE9yZGVyaW5nVHlwZT46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCit7CisgIHVzaW5nIGludGVybmFsOjplbXB0eUlkeExVOworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgImFuYWx5emVQYXR0ZXJuKCkgc2hvdWxkIGJlIGNhbGxlZCBmaXJzdCIpOyAKKyAgZWlnZW5fYXNzZXJ0KChtYXRyaXgucm93cygpID09IG1hdHJpeC5jb2xzKCkpICYmICJPbmx5IGZvciBzcXVhcmVkIG1hdHJpY2VzIik7CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIEluZGV4VmVjdG9yOjpTY2FsYXIgU3RvcmFnZUluZGV4OyAKKyAgCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIAorICAKKyAgLy8gQXBwbHkgdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiBjb21wdXRlZCBpbiBhbmFseXplcGF0dGVybigpCisgIC8vICAgbV9tYXQgPSBtYXRyaXggKiBtX3Blcm1fYy5pbnZlcnNlKCk7IAorICBtX21hdCA9IG1hdHJpeDsKKyAgaWYgKG1fcGVybV9jLnNpemUoKSkgCisgIHsKKyAgICBtX21hdC51bmNvbXByZXNzKCk7IC8vTk9URTogVGhlIGVmZmVjdCBvZiB0aGlzIGNvbW1hbmQgaXMgb25seSB0byBjcmVhdGUgdGhlIElubmVyTm9uemVyb3MgcG9pbnRlcnMuCisgICAgLy9UaGVuLCBwZXJtdXRlIG9ubHkgdGhlIGNvbHVtbiBwb2ludGVycworICAgIGNvbnN0IFN0b3JhZ2VJbmRleCAqIG91dGVySW5kZXhQdHI7CisgICAgaWYgKG1hdHJpeC5pc0NvbXByZXNzZWQoKSkgb3V0ZXJJbmRleFB0ciA9IG1hdHJpeC5vdXRlckluZGV4UHRyKCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cl90ID0gbmV3IFN0b3JhZ2VJbmRleFttYXRyaXguY29scygpKzFdOworICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDw9IG1hdHJpeC5jb2xzKCk7IGkrKykgb3V0ZXJJbmRleFB0cl90W2ldID0gbV9tYXQub3V0ZXJJbmRleFB0cigpW2ldOworICAgICAgb3V0ZXJJbmRleFB0ciA9IG91dGVySW5kZXhQdHJfdDsKKyAgICB9CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG1hdHJpeC5jb2xzKCk7IGkrKykKKyAgICB7CisgICAgICBtX21hdC5vdXRlckluZGV4UHRyKClbbV9wZXJtX2MuaW5kaWNlcygpKGkpXSA9IG91dGVySW5kZXhQdHJbaV07CisgICAgICBtX21hdC5pbm5lck5vblplcm9QdHIoKVttX3Blcm1fYy5pbmRpY2VzKCkoaSldID0gb3V0ZXJJbmRleFB0cltpKzFdIC0gb3V0ZXJJbmRleFB0cltpXTsKKyAgICB9CisgICAgaWYoIW1hdHJpeC5pc0NvbXByZXNzZWQoKSkgZGVsZXRlW10gb3V0ZXJJbmRleFB0cjsKKyAgfSAKKyAgZWxzZSAKKyAgeyAvL0ZJWE1FIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaWYgdGhlIGVtcHR5IHBlcm11dGF0aW9uIGlzIGhhbmRsZWQgdHJhbnNwYXJlbnRseQorICAgIG1fcGVybV9jLnJlc2l6ZShtYXRyaXguY29scygpKTsKKyAgICBmb3IoU3RvcmFnZUluZGV4IGkgPSAwOyBpIDwgbWF0cml4LmNvbHMoKTsgKytpKSBtX3Blcm1fYy5pbmRpY2VzKCkoaSkgPSBpOworICB9CisgIAorICBJbmRleCBtID0gbV9tYXQucm93cygpOworICBJbmRleCBuID0gbV9tYXQuY29scygpOworICBJbmRleCBubnogPSBtX21hdC5ub25aZXJvcygpOworICBJbmRleCBtYXhwYW5lbCA9IG1fcGVyZnYucGFuZWxfc2l6ZSAqIG07CisgIC8vIEFsbG9jYXRlIHdvcmtpbmcgc3RvcmFnZSBjb21tb24gdG8gdGhlIGZhY3RvciByb3V0aW5lcworICBJbmRleCBsd29yayA9IDA7CisgIEluZGV4IGluZm8gPSBCYXNlOjptZW1Jbml0KG0sIG4sIG5ueiwgbHdvcmssIG1fcGVyZnYuZmlsbGZhY3RvciwgbV9wZXJmdi5wYW5lbF9zaXplLCBtX2dsdSk7IAorICBpZiAoaW5mbykgCisgIHsKKyAgICBtX2xhc3RFcnJvciA9ICJVTkFCTEUgVE8gQUxMT0NBVEUgV09SS0lORyBNRU1PUllcblxuIiA7CisgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOworICAgIHJldHVybiA7IAorICB9CisgIAorICAvLyBTZXQgdXAgcG9pbnRlcnMgZm9yIGludGVnZXIgd29ya2luZyBhcnJheXMgCisgIEluZGV4VmVjdG9yIHNlZ3JlcChtKTsgc2VncmVwLnNldFplcm8oKTsKKyAgSW5kZXhWZWN0b3IgcGFyZW50KG0pOyBwYXJlbnQuc2V0WmVybygpOworICBJbmRleFZlY3RvciB4cGxvcmUobSk7IHhwbG9yZS5zZXRaZXJvKCk7CisgIEluZGV4VmVjdG9yIHJlcGZueihtYXhwYW5lbCk7CisgIEluZGV4VmVjdG9yIHBhbmVsX2xzdWIobWF4cGFuZWwpOworICBJbmRleFZlY3RvciB4cHJ1bmUobik7IHhwcnVuZS5zZXRaZXJvKCk7CisgIEluZGV4VmVjdG9yIG1hcmtlcihtKmludGVybmFsOjpMVU5vTWFya2VyKTsgbWFya2VyLnNldFplcm8oKTsKKyAgCisgIHJlcGZuei5zZXRDb25zdGFudCgtMSk7IAorICBwYW5lbF9sc3ViLnNldENvbnN0YW50KC0xKTsKKyAgCisgIC8vIFNldCB1cCBwb2ludGVycyBmb3Igc2NhbGFyIHdvcmtpbmcgYXJyYXlzIAorICBTY2FsYXJWZWN0b3IgZGVuc2U7IAorICBkZW5zZS5zZXRaZXJvKG1heHBhbmVsKTsKKyAgU2NhbGFyVmVjdG9yIHRlbXB2OyAKKyAgdGVtcHYuc2V0WmVybyhpbnRlcm5hbDo6TFVudW1UZW1wVihtLCBtX3BlcmZ2LnBhbmVsX3NpemUsIG1fcGVyZnYubWF4c3VwZXIsIC8qbV9wZXJmdi5yb3dibGsqL20pICk7CisgIAorICAvLyBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHBlcm1fYworICBQZXJtdXRhdGlvblR5cGUgaXBlcm1fYyhtX3Blcm1fYy5pbnZlcnNlKCkpOyAKKyAgCisgIC8vIElkZW50aWZ5IGluaXRpYWwgcmVsYXhlZCBzbm9kZXMKKyAgSW5kZXhWZWN0b3IgcmVsYXhfZW5kKG4pOworICBpZiAoIG1fc3ltbWV0cmljbW9kZSA9PSB0cnVlICkgCisgICAgQmFzZTo6aGVhcF9yZWxheF9zbm9kZShuLCBtX2V0cmVlLCBtX3BlcmZ2LnJlbGF4LCBtYXJrZXIsIHJlbGF4X2VuZCk7CisgIGVsc2UKKyAgICBCYXNlOjpyZWxheF9zbm9kZShuLCBtX2V0cmVlLCBtX3BlcmZ2LnJlbGF4LCBtYXJrZXIsIHJlbGF4X2VuZCk7CisgIAorICAKKyAgbV9wZXJtX3IucmVzaXplKG0pOyAKKyAgbV9wZXJtX3IuaW5kaWNlcygpLnNldENvbnN0YW50KC0xKTsKKyAgbWFya2VyLnNldENvbnN0YW50KC0xKTsKKyAgbV9kZXRQZXJtUiA9IDE7IC8vIFJlY29yZCB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIHJvdyBwZXJtdXRhdGlvbgorICAKKyAgbV9nbHUuc3Vwbm8oMCkgPSBlbXB0eUlkeExVOyBtX2dsdS54c3VwLnNldENvbnN0YW50KDApOworICBtX2dsdS54c3VwKDApID0gbV9nbHUueGxzdWIoMCkgPSBtX2dsdS54dXN1YigwKSA9IG1fZ2x1LnhsdXN1cCgwKSA9IEluZGV4KDApOworICAKKyAgLy8gV29yayBvbiBvbmUgJ3BhbmVsJyBhdCBhIHRpbWUuIEEgcGFuZWwgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgOgorICAvLyAgKGEpIGEgcmVsYXhlZCBzdXBlcm5vZGUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZXRyZWUsIG9yCisgIC8vICAoYikgcGFuZWxfc2l6ZSBjb250aWd1b3VzIGNvbHVtbnMsIDxwYW5lbF9zaXplPiBkZWZpbmVkIGJ5IHRoZSB1c2VyCisgIEluZGV4IGpjb2w7IAorICBJbmRleFZlY3RvciBwYW5lbF9oaXN0byhuKTsKKyAgSW5kZXggcGl2cm93OyAvLyBQaXZvdGFsIHJvdyBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHJvdyBtYXRyaXgKKyAgSW5kZXggbnNlZzE7IC8vIE51bWJlciBvZiBzZWdtZW50cyBpbiBVLWNvbHVtbiBhYm92ZSBwYW5lbCByb3cgamNvbAorICBJbmRleCBuc2VnOyAvLyBOdW1iZXIgb2Ygc2VnbWVudHMgaW4gZWFjaCBVLWNvbHVtbiAKKyAgSW5kZXggaXJlcDsgCisgIEluZGV4IGksIGssIGpqOyAKKyAgZm9yIChqY29sID0gMDsgamNvbCA8IG47ICkKKyAgeworICAgIC8vIEFkanVzdCBwYW5lbCBzaXplIHNvIHRoYXQgYSBwYW5lbCB3b24ndCBvdmVybGFwIHdpdGggdGhlIG5leHQgcmVsYXhlZCBzbm9kZS4gCisgICAgSW5kZXggcGFuZWxfc2l6ZSA9IG1fcGVyZnYucGFuZWxfc2l6ZTsgLy8gdXBwZXIgYm91bmQgb24gcGFuZWwgd2lkdGgKKyAgICBmb3IgKGsgPSBqY29sICsgMTsgayA8IChzdGQ6Om1pbikoamNvbCtwYW5lbF9zaXplLCBuKTsgaysrKQorICAgIHsKKyAgICAgIGlmIChyZWxheF9lbmQoaykgIT0gZW1wdHlJZHhMVSkgCisgICAgICB7CisgICAgICAgIHBhbmVsX3NpemUgPSBrIC0gamNvbDsgCisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGsgPT0gbikgCisgICAgICBwYW5lbF9zaXplID0gbiAtIGpjb2w7IAorICAgICAgCisgICAgLy8gU3ltYm9saWMgb3V0ZXIgZmFjdG9yaXphdGlvbiBvbiBhIHBhbmVsIG9mIGNvbHVtbnMgCisgICAgQmFzZTo6cGFuZWxfZGZzKG0sIHBhbmVsX3NpemUsIGpjb2wsIG1fbWF0LCBtX3Blcm1fci5pbmRpY2VzKCksIG5zZWcxLCBkZW5zZSwgcGFuZWxfbHN1Yiwgc2VncmVwLCByZXBmbnosIHhwcnVuZSwgbWFya2VyLCBwYXJlbnQsIHhwbG9yZSwgbV9nbHUpOyAKKyAgICAKKyAgICAvLyBOdW1lcmljIHN1cC1wYW5lbCB1cGRhdGVzIGluIHRvcG9sb2dpY2FsIG9yZGVyIAorICAgIEJhc2U6OnBhbmVsX2Jtb2QobSwgcGFuZWxfc2l6ZSwgamNvbCwgbnNlZzEsIGRlbnNlLCB0ZW1wdiwgc2VncmVwLCByZXBmbnosIG1fZ2x1KTsgCisgICAgCisgICAgLy8gU3BhcnNlIExVIHdpdGhpbiB0aGUgcGFuZWwsIGFuZCBiZWxvdyB0aGUgcGFuZWwgZGlhZ29uYWwgCisgICAgZm9yICggamogPSBqY29sOyBqajwgamNvbCArIHBhbmVsX3NpemU7IGpqKyspIAorICAgIHsKKyAgICAgIGsgPSAoamogLSBqY29sKSAqIG07IC8vIENvbHVtbiBpbmRleCBmb3Igdy13aWRlIGFycmF5cyAKKyAgICAgIAorICAgICAgbnNlZyA9IG5zZWcxOyAvLyBiZWdpbiBhZnRlciBhbGwgdGhlIHBhbmVsIHNlZ21lbnRzCisgICAgICAvL0RlcHRoLWZpcnN0LXNlYXJjaCBmb3IgdGhlIGN1cnJlbnQgY29sdW1uCisgICAgICBWZWN0b3JCbG9jazxJbmRleFZlY3Rvcj4gcGFuZWxfbHN1YmsocGFuZWxfbHN1YiwgaywgbSk7CisgICAgICBWZWN0b3JCbG9jazxJbmRleFZlY3Rvcj4gcmVwZm56X2socmVwZm56LCBrLCBtKTsgCisgICAgICBpbmZvID0gQmFzZTo6Y29sdW1uX2RmcyhtLCBqaiwgbV9wZXJtX3IuaW5kaWNlcygpLCBtX3BlcmZ2Lm1heHN1cGVyLCBuc2VnLCBwYW5lbF9sc3Viaywgc2VncmVwLCByZXBmbnpfaywgeHBydW5lLCBtYXJrZXIsIHBhcmVudCwgeHBsb3JlLCBtX2dsdSk7IAorICAgICAgaWYgKCBpbmZvICkgCisgICAgICB7CisgICAgICAgIG1fbGFzdEVycm9yID0gICJVTkFCTEUgVE8gRVhQQU5EIE1FTU9SWSBJTiBDT0xVTU5fREZTKCkgIjsKKyAgICAgICAgbV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7IAorICAgICAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gZmFsc2U7IAorICAgICAgICByZXR1cm47IAorICAgICAgfQorICAgICAgLy8gTnVtZXJpYyB1cGRhdGVzIHRvIHRoaXMgY29sdW1uIAorICAgICAgVmVjdG9yQmxvY2s8U2NhbGFyVmVjdG9yPiBkZW5zZV9rKGRlbnNlLCBrLCBtKTsgCisgICAgICBWZWN0b3JCbG9jazxJbmRleFZlY3Rvcj4gc2VncmVwX2soc2VncmVwLCBuc2VnMSwgbS1uc2VnMSk7IAorICAgICAgaW5mbyA9IEJhc2U6OmNvbHVtbl9ibW9kKGpqLCAobnNlZyAtIG5zZWcxKSwgZGVuc2VfaywgdGVtcHYsIHNlZ3JlcF9rLCByZXBmbnpfaywgamNvbCwgbV9nbHUpOyAKKyAgICAgIGlmICggaW5mbyApIAorICAgICAgeworICAgICAgICBtX2xhc3RFcnJvciA9ICJVTkFCTEUgVE8gRVhQQU5EIE1FTU9SWSBJTiBDT0xVTU5fQk1PRCgpICI7CisgICAgICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOyAKKyAgICAgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOyAKKyAgICAgICAgcmV0dXJuOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gQ29weSB0aGUgVS1zZWdtZW50cyB0byB1Y29sKCopCisgICAgICBpbmZvID0gQmFzZTo6Y29weV90b191Y29sKGpqLCBuc2VnLCBzZWdyZXAsIHJlcGZuel9rICxtX3Blcm1fci5pbmRpY2VzKCksIGRlbnNlX2ssIG1fZ2x1KTsgCisgICAgICBpZiAoIGluZm8gKSAKKyAgICAgIHsKKyAgICAgICAgbV9sYXN0RXJyb3IgPSAiVU5BQkxFIFRPIEVYUEFORCBNRU1PUlkgSU4gQ09QWV9UT19VQ09MKCkgIjsKKyAgICAgICAgbV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7IAorICAgICAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gZmFsc2U7IAorICAgICAgICByZXR1cm47IAorICAgICAgfQorICAgICAgCisgICAgICAvLyBGb3JtIHRoZSBMLXNlZ21lbnQgCisgICAgICBpbmZvID0gQmFzZTo6cGl2b3RMKGpqLCBtX2RpYWdwaXZvdHRocmVzaCwgbV9wZXJtX3IuaW5kaWNlcygpLCBpcGVybV9jLmluZGljZXMoKSwgcGl2cm93LCBtX2dsdSk7CisgICAgICBpZiAoIGluZm8gKSAKKyAgICAgIHsKKyAgICAgICAgbV9sYXN0RXJyb3IgPSAiVEhFIE1BVFJJWCBJUyBTVFJVQ1RVUkFMTFkgU0lOR1VMQVIgLi4uIFpFUk8gQ09MVU1OIEFUICI7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXR1cm5JbmZvOworICAgICAgICByZXR1cm5JbmZvIDw8IGluZm87IAorICAgICAgICBtX2xhc3RFcnJvciArPSByZXR1cm5JbmZvLnN0cigpOworICAgICAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsgCisgICAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsgCisgICAgICAgIHJldHVybjsgCisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFVwZGF0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIHJvdyBwZXJtdXRhdGlvbiBtYXRyaXgKKyAgICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbm90IGNvcnJlY3QsIHdlIHNob3VsZCBwcm9iYWJseSB0YWtlIGlwZXJtX2MgaW50byBhY2NvdW50IGFuZCBwaXZyb3cgaXMgbm90IGRpcmVjdGx5IHRoZSByb3cgcGl2b3QuCisgICAgICBpZiAocGl2cm93ICE9IGpqKSBtX2RldFBlcm1SID0gLW1fZGV0UGVybVI7CisKKyAgICAgIC8vIFBydW5lIGNvbHVtbnMgKDA6amotMSkgdXNpbmcgY29sdW1uIGpqCisgICAgICBCYXNlOjpwcnVuZUwoamosIG1fcGVybV9yLmluZGljZXMoKSwgcGl2cm93LCBuc2VnLCBzZWdyZXAsIHJlcGZuel9rLCB4cHJ1bmUsIG1fZ2x1KTsgCisgICAgICAKKyAgICAgIC8vIFJlc2V0IHJlcGZueiBmb3IgdGhpcyBjb2x1bW4gCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNlZzsgaSsrKQorICAgICAgeworICAgICAgICBpcmVwID0gc2VncmVwKGkpOyAKKyAgICAgICAgcmVwZm56X2soaXJlcCkgPSBlbXB0eUlkeExVOyAKKyAgICAgIH0KKyAgICB9IC8vIGVuZCBTcGFyc2VMVSB3aXRoaW4gdGhlIHBhbmVsICAKKyAgICBqY29sICs9IHBhbmVsX3NpemU7ICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHBhbmVsCisgIH0gLy8gZW5kIGZvciAtLSBlbmQgZWxpbWluYXRpb24gCisgIAorICBtX2RldFBlcm1SID0gbV9wZXJtX3IuZGV0ZXJtaW5hbnQoKTsKKyAgbV9kZXRQZXJtQyA9IG1fcGVybV9jLmRldGVybWluYW50KCk7CisgIAorICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIG5vbnplcm9zIGluIGZhY3RvcnMgCisgIEJhc2U6OmNvdW50bnoobiwgbV9ubnpMLCBtX25uelUsIG1fZ2x1KTsgCisgIC8vIEFwcGx5IHBlcm11dGF0aW9uICB0byB0aGUgTCBzdWJzY3JpcHRzIAorICBCYXNlOjpmaXh1cEwobiwgbV9wZXJtX3IuaW5kaWNlcygpLCBtX2dsdSk7CisgIAorICAvLyBDcmVhdGUgc3VwZXJub2RlIG1hdHJpeCBMIAorICBtX0xzdG9yZS5zZXRJbmZvcyhtLCBuLCBtX2dsdS5sdXN1cCwgbV9nbHUueGx1c3VwLCBtX2dsdS5sc3ViLCBtX2dsdS54bHN1YiwgbV9nbHUuc3Vwbm8sIG1fZ2x1LnhzdXApOyAKKyAgLy8gQ3JlYXRlIHRoZSBjb2x1bW4gbWFqb3IgdXBwZXIgc3BhcnNlIG1hdHJpeCAgVTsgCisgIG5ldyAoJm1fVXN0b3JlKSBNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvciwgU3RvcmFnZUluZGV4PiAoIG0sIG4sIG1fbm56VSwgbV9nbHUueHVzdWIuZGF0YSgpLCBtX2dsdS51c3ViLmRhdGEoKSwgbV9nbHUudWNvbC5kYXRhKCkgKTsKKyAgCisgIG1faW5mbyA9IFN1Y2Nlc3M7CisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXBwZWRTdXBlcm5vZGFsVHlwZT4KK3N0cnVjdCBTcGFyc2VMVU1hdHJpeExSZXR1cm5UeXBlIDogaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXBwZWRTdXBlcm5vZGFsVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZXhwbGljaXQgU3BhcnNlTFVNYXRyaXhMUmV0dXJuVHlwZShjb25zdCBNYXBwZWRTdXBlcm5vZGFsVHlwZSYgbWFwTCkgOiBtX21hcEwobWFwTCkKKyAgeyB9CisgIEluZGV4IHJvd3MoKSB7IHJldHVybiBtX21hcEwucm93cygpOyB9CisgIEluZGV4IGNvbHMoKSB7IHJldHVybiBtX21hcEwuY29scygpOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgc29sdmVJblBsYWNlKCBNYXRyaXhCYXNlPERlc3Q+ICZYKSBjb25zdAorICB7CisgICAgbV9tYXBMLnNvbHZlSW5QbGFjZShYKTsKKyAgfQorICBjb25zdCBNYXBwZWRTdXBlcm5vZGFsVHlwZSYgbV9tYXBMOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4TFR5cGUsIHR5cGVuYW1lIE1hdHJpeFVUeXBlPgorc3RydWN0IFNwYXJzZUxVTWF0cml4VVJldHVyblR5cGUgOiBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeExUeXBlOjpTY2FsYXIgU2NhbGFyOworICBTcGFyc2VMVU1hdHJpeFVSZXR1cm5UeXBlKGNvbnN0IE1hdHJpeExUeXBlJiBtYXBMLCBjb25zdCBNYXRyaXhVVHlwZSYgbWFwVSkKKyAgOiBtX21hcEwobWFwTCksbV9tYXBVKG1hcFUpCisgIHsgfQorICBJbmRleCByb3dzKCkgeyByZXR1cm4gbV9tYXBMLnJvd3MoKTsgfQorICBJbmRleCBjb2xzKCkgeyByZXR1cm4gbV9tYXBMLmNvbHMoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+ICAgdm9pZCBzb2x2ZUluUGxhY2UoTWF0cml4QmFzZTxEZXN0PiAmWCkgY29uc3QKKyAgeworICAgIEluZGV4IG5yaHMgPSBYLmNvbHMoKTsKKyAgICBJbmRleCBuICAgID0gWC5yb3dzKCk7CisgICAgLy8gQmFja3dhcmQgc29sdmUgd2l0aCBVCisgICAgZm9yIChJbmRleCBrID0gbV9tYXBMLm5zdXBlcigpOyBrID49IDA7IGstLSkKKyAgICB7CisgICAgICBJbmRleCBmc3VwYyA9IG1fbWFwTC5zdXBUb0NvbCgpW2tdOworICAgICAgSW5kZXggbGRhID0gbV9tYXBMLmNvbEluZGV4UHRyKClbZnN1cGMrMV0gLSBtX21hcEwuY29sSW5kZXhQdHIoKVtmc3VwY107IC8vIGxlYWRpbmcgZGltZW5zaW9uCisgICAgICBJbmRleCBuc3VwYyA9IG1fbWFwTC5zdXBUb0NvbCgpW2srMV0gLSBmc3VwYzsKKyAgICAgIEluZGV4IGx1cHRyID0gbV9tYXBMLmNvbEluZGV4UHRyKClbZnN1cGNdOworCisgICAgICBpZiAobnN1cGMgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG5yaHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIFgoZnN1cGMsIGopIC89IG1fbWFwTC52YWx1ZVB0cigpW2x1cHRyXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBNYXA8Y29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsIENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IEEoICYobV9tYXBMLnZhbHVlUHRyKClbbHVwdHJdKSwgbnN1cGMsIG5zdXBjLCBPdXRlclN0cmlkZTw+KGxkYSkgKTsKKyAgICAgICAgTWFwPCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWUsIENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IFUgKCYoWChmc3VwYywwKSksIG5zdXBjLCBucmhzLCBPdXRlclN0cmlkZTw+KG4pICk7CisgICAgICAgIFUgPSBBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKFUpOworICAgICAgfQorCisgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbnJoczsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGpjb2wgPSBmc3VwYzsgamNvbCA8IGZzdXBjICsgbnN1cGM7IGpjb2wrKykKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFVUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1fbWFwVSwgamNvbCk7CisgICAgICAgICAgZm9yICggOyBpdDsgKytpdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBJbmRleCBpcm93ID0gaXQuaW5kZXgoKTsKKyAgICAgICAgICAgIFgoaXJvdywgaikgLT0gWChqY29sLCBqKSAqIGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSAvLyBFbmQgRm9yIFUtc29sdmUKKyAgfQorICBjb25zdCBNYXRyaXhMVHlwZSYgbV9tYXBMOworICBjb25zdCBNYXRyaXhVVHlwZSYgbV9tYXBVOworfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIEVpZ2VuIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVUltcGwuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVUltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBjZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVSW1wbC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKyNpZm5kZWYgU1BBUlNFTFVfSU1QTF9ICisjZGVmaW5lIFNQQVJTRUxVX0lNUExfSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCisvKiogXGluZ3JvdXAgU3BhcnNlTFVfTW9kdWxlCisgICogXGNsYXNzIFNwYXJzZUxVSW1wbAorICAqIEJhc2UgY2xhc3MgZm9yIHNwYXJzZUxVCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+CitjbGFzcyBTcGFyc2VMVUltcGwKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFNjYWxhclZlY3RvcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsRHluYW1pYywxPiBJbmRleFZlY3RvcjsgCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gU2NhbGFyTWF0cml4OworICAgIHR5cGVkZWYgTWFwPFNjYWxhck1hdHJpeCwgMCwgIE91dGVyU3RyaWRlPD4gPiBNYXBwZWRNYXRyaXhCbG9jazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhclZlY3Rvcjo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyAKKyAgICB0eXBlZGVmIFJlZjxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBCbG9ja1NjYWxhclZlY3RvcjsKKyAgICB0eXBlZGVmIFJlZjxNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gPiBCbG9ja0luZGV4VmVjdG9yOworICAgIHR5cGVkZWYgTFVfR2xvYmFsTFVfdDxJbmRleFZlY3RvciwgU2NhbGFyVmVjdG9yPiBHbG9iYWxMVV90OyAKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsU3RvcmFnZUluZGV4PiBNYXRyaXhUeXBlOyAKKyAgICAKKyAgcHJvdGVjdGVkOgorICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgICAgSW5kZXggZXhwYW5kKFZlY3RvclR5cGUmIHZlYywgSW5kZXgmIGxlbmd0aCwgSW5kZXggbmJFbHRzLCBJbmRleCBrZWVwX3ByZXYsIEluZGV4JiBudW1fZXhwYW5zaW9ucyk7CisgICAgIEluZGV4IG1lbUluaXQoSW5kZXggbSwgSW5kZXggbiwgSW5kZXggYW5ueiwgSW5kZXggbHdvcmssIEluZGV4IGZpbGxyYXRpbywgSW5kZXggcGFuZWxfc2l6ZSwgIEdsb2JhbExVX3QmIGdsdSk7IAorICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgICAgSW5kZXggbWVtWHBhbmQoVmVjdG9yVHlwZSYgdmVjLCBJbmRleCYgbWF4bGVuLCBJbmRleCBuYkVsdHMsIE1lbVR5cGUgbWVtdHlwZSwgSW5kZXgmIG51bV9leHBhbnNpb25zKTsKKyAgICAgdm9pZCBoZWFwX3JlbGF4X3Nub2RlIChjb25zdCBJbmRleCBuLCBJbmRleFZlY3RvciYgZXQsIGNvbnN0IEluZGV4IHJlbGF4X2NvbHVtbnMsIEluZGV4VmVjdG9yJiBkZXNjZW5kYW50cywgSW5kZXhWZWN0b3ImIHJlbGF4X2VuZCk7IAorICAgICB2b2lkIHJlbGF4X3Nub2RlIChjb25zdCBJbmRleCBuLCBJbmRleFZlY3RvciYgZXQsIGNvbnN0IEluZGV4IHJlbGF4X2NvbHVtbnMsIEluZGV4VmVjdG9yJiBkZXNjZW5kYW50cywgSW5kZXhWZWN0b3ImIHJlbGF4X2VuZCk7IAorICAgICBJbmRleCBzbm9kZV9kZnMoY29uc3QgSW5kZXggamNvbCwgY29uc3QgSW5kZXgga2NvbCxjb25zdCBNYXRyaXhUeXBlJiBtYXQsICBJbmRleFZlY3RvciYgeHBydW5lLCBJbmRleFZlY3RvciYgbWFya2VyLCBHbG9iYWxMVV90JiBnbHUpOyAKKyAgICAgSW5kZXggc25vZGVfYm1vZCAoY29uc3QgSW5kZXggamNvbCwgY29uc3QgSW5kZXggZnN1cGMsIFNjYWxhclZlY3RvciYgZGVuc2UsIEdsb2JhbExVX3QmIGdsdSk7CisgICAgIEluZGV4IHBpdm90TChjb25zdCBJbmRleCBqY29sLCBjb25zdCBSZWFsU2NhbGFyJiBkaWFncGl2b3R0aHJlc2gsIEluZGV4VmVjdG9yJiBwZXJtX3IsIEluZGV4VmVjdG9yJiBpcGVybV9jLCBJbmRleCYgcGl2cm93LCBHbG9iYWxMVV90JiBnbHUpOworICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhaXRzPgorICAgICB2b2lkIGRmc19rZXJuZWwoY29uc3QgU3RvcmFnZUluZGV4IGpqLCBJbmRleFZlY3RvciYgcGVybV9yLAorICAgICAgICAgICAgICAgICAgICBJbmRleCYgbnNlZywgSW5kZXhWZWN0b3ImIHBhbmVsX2xzdWIsIEluZGV4VmVjdG9yJiBzZWdyZXAsCisgICAgICAgICAgICAgICAgICAgIFJlZjxJbmRleFZlY3Rvcj4gcmVwZm56X2NvbCwgSW5kZXhWZWN0b3ImIHhwcnVuZSwgUmVmPEluZGV4VmVjdG9yPiBtYXJrZXIsIEluZGV4VmVjdG9yJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIEluZGV4VmVjdG9yJiB4cGxvcmUsIEdsb2JhbExVX3QmIGdsdSwgSW5kZXgmIG5leHRsX2NvbCwgSW5kZXgga3JvdywgVHJhaXRzJiB0cmFpdHMpOworICAgICB2b2lkIHBhbmVsX2Rmcyhjb25zdCBJbmRleCBtLCBjb25zdCBJbmRleCB3LCBjb25zdCBJbmRleCBqY29sLCBNYXRyaXhUeXBlJiBBLCBJbmRleFZlY3RvciYgcGVybV9yLCBJbmRleCYgbnNlZywgU2NhbGFyVmVjdG9yJiBkZW5zZSwgSW5kZXhWZWN0b3ImIHBhbmVsX2xzdWIsIEluZGV4VmVjdG9yJiBzZWdyZXAsIEluZGV4VmVjdG9yJiByZXBmbnosIEluZGV4VmVjdG9yJiB4cHJ1bmUsIEluZGV4VmVjdG9yJiBtYXJrZXIsIEluZGV4VmVjdG9yJiBwYXJlbnQsIEluZGV4VmVjdG9yJiB4cGxvcmUsIEdsb2JhbExVX3QmIGdsdSk7CisgICAgCisgICAgIHZvaWQgcGFuZWxfYm1vZChjb25zdCBJbmRleCBtLCBjb25zdCBJbmRleCB3LCBjb25zdCBJbmRleCBqY29sLCBjb25zdCBJbmRleCBuc2VnLCBTY2FsYXJWZWN0b3ImIGRlbnNlLCBTY2FsYXJWZWN0b3ImIHRlbXB2LCBJbmRleFZlY3RvciYgc2VncmVwLCBJbmRleFZlY3RvciYgcmVwZm56LCBHbG9iYWxMVV90JiBnbHUpOworICAgICBJbmRleCBjb2x1bW5fZGZzKGNvbnN0IEluZGV4IG0sIGNvbnN0IEluZGV4IGpjb2wsIEluZGV4VmVjdG9yJiBwZXJtX3IsIEluZGV4IG1heHN1cGVyLCBJbmRleCYgbnNlZywgIEJsb2NrSW5kZXhWZWN0b3IgbHN1Yl9jb2wsIEluZGV4VmVjdG9yJiBzZWdyZXAsIEJsb2NrSW5kZXhWZWN0b3IgcmVwZm56LCBJbmRleFZlY3RvciYgeHBydW5lLCBJbmRleFZlY3RvciYgbWFya2VyLCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgeHBsb3JlLCBHbG9iYWxMVV90JiBnbHUpOworICAgICBJbmRleCBjb2x1bW5fYm1vZChjb25zdCBJbmRleCBqY29sLCBjb25zdCBJbmRleCBuc2VnLCBCbG9ja1NjYWxhclZlY3RvciBkZW5zZSwgU2NhbGFyVmVjdG9yJiB0ZW1wdiwgQmxvY2tJbmRleFZlY3RvciBzZWdyZXAsIEJsb2NrSW5kZXhWZWN0b3IgcmVwZm56LCBJbmRleCBmcGFuZWxjLCBHbG9iYWxMVV90JiBnbHUpOyAKKyAgICAgSW5kZXggY29weV90b191Y29sKGNvbnN0IEluZGV4IGpjb2wsIGNvbnN0IEluZGV4IG5zZWcsIEluZGV4VmVjdG9yJiBzZWdyZXAsIEJsb2NrSW5kZXhWZWN0b3IgcmVwZm56ICxJbmRleFZlY3RvciYgcGVybV9yLCBCbG9ja1NjYWxhclZlY3RvciBkZW5zZSwgR2xvYmFsTFVfdCYgZ2x1KTsgCisgICAgIHZvaWQgcHJ1bmVMKGNvbnN0IEluZGV4IGpjb2wsIGNvbnN0IEluZGV4VmVjdG9yJiBwZXJtX3IsIGNvbnN0IEluZGV4IHBpdnJvdywgY29uc3QgSW5kZXggbnNlZywgY29uc3QgSW5kZXhWZWN0b3ImIHNlZ3JlcCwgQmxvY2tJbmRleFZlY3RvciByZXBmbnosIEluZGV4VmVjdG9yJiB4cHJ1bmUsIEdsb2JhbExVX3QmIGdsdSk7CisgICAgIHZvaWQgY291bnRueihjb25zdCBJbmRleCBuLCBJbmRleCYgbm56TCwgSW5kZXgmIG5uelUsIEdsb2JhbExVX3QmIGdsdSk7IAorICAgICB2b2lkIGZpeHVwTChjb25zdCBJbmRleCBuLCBjb25zdCBJbmRleFZlY3RvciYgcGVybV9yLCBHbG9iYWxMVV90JiBnbHUpOyAKKyAgICAgCisgICAgIHRlbXBsYXRlPHR5cGVuYW1lICwgdHlwZW5hbWUgPgorICAgICBmcmllbmQgc3RydWN0IGNvbHVtbl9kZnNfdHJhaXRzOworfTsgCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfTWVtb3J5LmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjNDJlOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9NZW1vcnkuaApAQCAtMCwwICsxLDIyNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiAKKyAKKyAqIE5PVEU6IFRoaXMgZmlsZSBpcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBvZiBbcyxkLGMsel1tZW1vcnkuYyBmaWxlcyBpbiBTdXBlckxVIAorIAorICogLS0gU3VwZXJMVSByb3V0aW5lICh2ZXJzaW9uIDMuMSkgLS0KKyAqIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFhlcm94IFBhbG8gQWx0byBSZXNlYXJjaCBDZW50ZXIsCisgKiBhbmQgTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFiLgorICogQXVndXN0IDEsIDIwMDgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgYnkgWGVyb3ggQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQVMgSVMsIFdJVEggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQuICBBTlkgVVNFIElTIEFUIFlPVVIgT1dOIFJJU0suCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2Ugb3IgY29weSB0aGlzIHByb2dyYW0gZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzCisgKiBncmFudGVkLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0CisgKiB0aGUgY29kZSB3YXMgbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworCisjaWZuZGVmIEVJR0VOX1NQQVJTRUxVX01FTU9SWQorI2RlZmluZSBFSUdFTl9TUEFSU0VMVV9NRU1PUlkKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAorZW51bSB7IExVTm9NYXJrZXIgPSAzIH07CitlbnVtIHtlbXB0eUlkeExVID0gLTF9OworaW5saW5lIEluZGV4IExVbnVtVGVtcFYoSW5kZXgmIG0sIEluZGV4JiB3LCBJbmRleCYgdCwgSW5kZXgmIGIpCit7CisgIHJldHVybiAoc3RkOjptYXgpKG0sICh0K2IpKncpOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIEluZGV4IExVVGVtcFNwYWNlKEluZGV4Jm0sIEluZGV4JiB3KQoreworICByZXR1cm4gKDIqdyArIDQgKyBMVU5vTWFya2VyKSAqIG0gKiBzaXplb2YoSW5kZXgpICsgKHcgKyAxKSAqIG0gKiBzaXplb2YoU2NhbGFyKTsKK30KKworCisKKworLyoqIAorICAqIEV4cGFuZCB0aGUgZXhpc3Rpbmcgc3RvcmFnZSB0byBhY2NvbW9kYXRlIG1vcmUgZmlsbC1pbnMKKyAgKiBccGFyYW0gdmVjIFZhbGlkIHBvaW50ZXIgdG8gdGhlIHZlY3RvciB0byBhbGxvY2F0ZSBvciBleHBhbmQKKyAgKiBccGFyYW1baW4sb3V0XSBsZW5ndGggIEF0IGlucHV0LCBjb250YWluIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgdmVjdG9yIHRoYXQgaXMgdG8gYmUgaW5jcmVhc2VkLiBBdCBvdXRwdXQsIGxlbmd0aCBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIHZlY3RvcgorICAqIFxwYXJhbVtpbl0gbmJFbHRzIEN1cnJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmYWN0b3JzCisgICogXHBhcmFtIGtlZXBfcHJldiAgMTogdXNlIGxlbmd0aCAgYW5kIGRvIG5vdCBleHBhbmQgdGhlIHZlY3RvcjsgMDogY29tcHV0ZSBuZXdfbGVuIGFuZCBleHBhbmQKKyAgKiBccGFyYW1baW4sb3V0XSBudW1fZXhwYW5zaW9ucyBOdW1iZXIgb2YgdGltZXMgdGhlIG1lbW9yeSBoYXMgYmVlbiBleHBhbmRlZAorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGU+CitJbmRleCAgU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjpleHBhbmQoVmVjdG9yVHlwZSYgdmVjLCBJbmRleCYgbGVuZ3RoLCBJbmRleCBuYkVsdHMsIEluZGV4IGtlZXBfcHJldiwgSW5kZXgmIG51bV9leHBhbnNpb25zKSAKK3sKKyAgCisgIGZsb2F0IGFscGhhID0gMS41OyAvLyBSYXRpbyBvZiB0aGUgbWVtb3J5IGluY3JlYXNlIAorICBJbmRleCBuZXdfbGVuOyAvLyBOZXcgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICAKKyAgaWYobnVtX2V4cGFuc2lvbnMgPT0gMCB8fCBrZWVwX3ByZXYpIAorICAgIG5ld19sZW4gPSBsZW5ndGggOyAvLyBGaXJzdCB0aW1lIGFsbG9jYXRlIHJlcXVlc3RlZAorICBlbHNlIAorICAgIG5ld19sZW4gPSAoc3RkOjptYXgpKGxlbmd0aCsxLEluZGV4KGFscGhhICogbGVuZ3RoKSk7CisgIAorICBWZWN0b3JUeXBlIG9sZF92ZWM7IC8vIFRlbXBvcmFyeSB2ZWN0b3IgdG8gaG9sZCB0aGUgcHJldmlvdXMgdmFsdWVzICAgCisgIGlmIChuYkVsdHMgPiAwICkKKyAgICBvbGRfdmVjID0gdmVjLnNlZ21lbnQoMCxuYkVsdHMpOyAKKyAgCisgIC8vQWxsb2NhdGUgb3IgZXhwYW5kIHRoZSBjdXJyZW50IHZlY3RvcgorI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyAgdHJ5CisjZW5kaWYKKyAgeworICAgIHZlYy5yZXNpemUobmV3X2xlbik7IAorICB9CisjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworICBjYXRjaChzdGQ6OmJhZF9hbGxvYyYgKQorI2Vsc2UKKyAgaWYoIXZlYy5zaXplKCkpCisjZW5kaWYKKyAgeworICAgIGlmICghbnVtX2V4cGFuc2lvbnMpCisgICAgeworICAgICAgLy8gRmlyc3QgdGltZSB0byBhbGxvY2F0ZSBmcm9tIExVTWVtSW5pdCgpCisgICAgICAvLyBMZXQgTFVNZW1Jbml0KCkgZGVhbHMgd2l0aCBpdC4KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGtlZXBfcHJldikKKyAgICB7CisgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBtZW1vcnkgbGVuZ3RoIHNob3VsZCBub3Qgbm90IGJlIHJlZHVjZWQKKyAgICAgIHJldHVybiBuZXdfbGVuOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIC8vIFJlZHVjZSB0aGUgc2l6ZSBhbmQgaW5jcmVhc2UgYWdhaW4gCisgICAgICBJbmRleCB0cmllcyA9IDA7IC8vIE51bWJlciBvZiBhdHRlbXB0cworICAgICAgZG8gCisgICAgICB7CisgICAgICAgIGFscGhhID0gKGFscGhhICsgMSkvMjsKKyAgICAgICAgbmV3X2xlbiA9IChzdGQ6Om1heCkobGVuZ3RoKzEsSW5kZXgoYWxwaGEgKiBsZW5ndGgpKTsKKyNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgICAgIHRyeQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICB2ZWMucmVzaXplKG5ld19sZW4pOyAKKyAgICAgICAgfQorI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyAgICAgICAgY2F0Y2goc3RkOjpiYWRfYWxsb2MmICkKKyNlbHNlCisgICAgICAgIGlmICghdmVjLnNpemUoKSkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgdHJpZXMgKz0gMTsgCisgICAgICAgICAgaWYgKCB0cmllcyA+IDEwKSByZXR1cm4gbmV3X2xlbjsgCisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCF2ZWMuc2l6ZSgpKTsKKyAgICB9CisgIH0KKyAgLy9Db3B5IHRoZSBwcmV2aW91cyB2YWx1ZXMgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBzcGFjZSAKKyAgaWYgKG5iRWx0cyA+IDApCisgICAgdmVjLnNlZ21lbnQoMCwgbmJFbHRzKSA9IG9sZF92ZWM7ICAgCisgICAKKyAgCisgIGxlbmd0aCAgPSBuZXdfbGVuOworICBpZihudW1fZXhwYW5zaW9ucykgKytudW1fZXhwYW5zaW9uczsKKyAgcmV0dXJuIDA7IAorfQorCisvKioKKyAqIFxicmllZiAgQWxsb2NhdGUgdmFyaW91cyB3b3JraW5nIHNwYWNlIGZvciB0aGUgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24gcGhhc2UuCisgKiBccGFyYW0gbSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgaW5wdXQgbWF0cml4IAorICogXHBhcmFtIG4gbnVtYmVyIG9mIGNvbHVtbnMgCisgKiBccGFyYW0gYW5ueiBudW1iZXIgb2YgaW5pdGlhbCBub256ZXJvcyBpbiB0aGUgbWF0cml4IAorICogXHBhcmFtIGx3b3JrICBpZiBsd29yaz0tMSwgdGhpcyByb3V0aW5lIHJldHVybnMgYW4gZXN0aW1hdGVkIHNpemUgb2YgdGhlIHJlcXVpcmVkIG1lbW9yeQorICogXHBhcmFtIGdsdSBwZXJzaXN0ZW50IGRhdGEgdG8gZmFjaWxpdGF0ZSBtdWx0aXBsZSBmYWN0b3JzIDogd2lsbCBiZSBkZWxldGVkIGxhdGVyID8/CisgKiBccGFyYW0gZmlsbHJhdGlvIGVzdGltYXRlZCByYXRpbyBvZiBmaWxsIGluIHRoZSBmYWN0b3JzCisgKiBccGFyYW0gcGFuZWxfc2l6ZSBTaXplIG9mIGEgcGFuZWwKKyAqIFxyZXR1cm4gYW4gZXN0aW1hdGVkIHNpemUgb2YgdGhlIHJlcXVpcmVkIG1lbW9yeSBpZiBsd29yayA9IC0xOyBvdGhlcndpc2UsIHJldHVybiB0aGUgc2l6ZSBvZiBhY3R1YWxseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWxsb2NhdGlvbiBmYWlsZWQsIGFuZCAwIG9uIHN1Y2Nlc3MKKyAqIFxub3RlIFVubGlrZSBTdXBlckxVLCB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgc3VwcG9ydCBzdWNjZXNzaXZlIGZhY3Rvcml6YXRpb24gd2l0aCB0aGUgc2FtZSBwYXR0ZXJuIGFuZCB0aGUgc2FtZSByb3cgcGVybXV0YXRpb24KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgorSW5kZXggU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjptZW1Jbml0KEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGFubnosIEluZGV4IGx3b3JrLCBJbmRleCBmaWxscmF0aW8sIEluZGV4IHBhbmVsX3NpemUsICBHbG9iYWxMVV90JiBnbHUpCit7CisgIEluZGV4JiBudW1fZXhwYW5zaW9ucyA9IGdsdS5udW1fZXhwYW5zaW9uczsgLy9ObyBtZW1vcnkgZXhwYW5zaW9ucyBzbyBmYXIKKyAgbnVtX2V4cGFuc2lvbnMgPSAwOworICBnbHUubnp1bWF4ID0gZ2x1Lm56bHVtYXggPSAoc3RkOjptaW4pKGZpbGxyYXRpbyAqIChhbm56KzEpIC8gbiwgbSkgKiBuOyAvLyBlc3RpbWF0ZWQgbnVtYmVyIG9mIG5vbnplcm9zIGluIFUgCisgIGdsdS5uemxtYXggPSAoc3RkOjptYXgpKEluZGV4KDQpLCBmaWxscmF0aW8pICogKGFubnorMSkgLyA0OyAvLyBlc3RpbWF0ZWQgIG5ueiBpbiBMIGZhY3RvcgorICAvLyBSZXR1cm4gdGhlIGVzdGltYXRlZCBzaXplIHRvIHRoZSB1c2VyIGlmIG5lY2Vzc2FyeQorICBJbmRleCB0ZW1wU3BhY2U7CisgIHRlbXBTcGFjZSA9ICgyKnBhbmVsX3NpemUgKyA0ICsgTFVOb01hcmtlcikgKiBtICogc2l6ZW9mKEluZGV4KSArIChwYW5lbF9zaXplICsgMSkgKiBtICogc2l6ZW9mKFNjYWxhcik7CisgIGlmIChsd29yayA9PSBlbXB0eUlkeExVKSAKKyAgeworICAgIEluZGV4IGVzdGltYXRlZF9zaXplOworICAgIGVzdGltYXRlZF9zaXplID0gKDUgKiBuICsgNSkgKiBzaXplb2YoSW5kZXgpICArIHRlbXBTcGFjZQorICAgICAgICAgICAgICAgICAgICArIChnbHUubnpsbWF4ICsgZ2x1Lm56dW1heCkgKiBzaXplb2YoSW5kZXgpICsgKGdsdS5uemx1bWF4K2dsdS5uenVtYXgpICogIHNpemVvZihTY2FsYXIpICsgbjsgCisgICAgcmV0dXJuIGVzdGltYXRlZF9zaXplOworICB9CisgIAorICAvLyBTZXR1cCB0aGUgcmVxdWlyZWQgc3BhY2UgCisgIAorICAvLyBGaXJzdCBhbGxvY2F0ZSBJbnRlZ2VyIHBvaW50ZXJzIGZvciBMXFUgZmFjdG9ycworICBnbHUueHN1cC5yZXNpemUobisxKTsKKyAgZ2x1LnN1cG5vLnJlc2l6ZShuKzEpOworICBnbHUueGxzdWIucmVzaXplKG4rMSk7CisgIGdsdS54bHVzdXAucmVzaXplKG4rMSk7CisgIGdsdS54dXN1Yi5yZXNpemUobisxKTsKKworICAvLyBSZXNlcnZlIG1lbW9yeSBmb3IgTC9VIGZhY3RvcnMKKyAgZG8gCisgIHsKKyAgICBpZiggICAgIChleHBhbmQ8U2NhbGFyVmVjdG9yPihnbHUubHVzdXAsIGdsdS5uemx1bWF4LCAwLCAwLCBudW1fZXhwYW5zaW9ucyk8MCkKKyAgICAgICAgfHwgIChleHBhbmQ8U2NhbGFyVmVjdG9yPihnbHUudWNvbCwgIGdsdS5uenVtYXgsICAwLCAwLCBudW1fZXhwYW5zaW9ucyk8MCkKKyAgICAgICAgfHwgIChleHBhbmQ8SW5kZXhWZWN0b3I+IChnbHUubHN1YiwgIGdsdS5uemxtYXgsICAwLCAwLCBudW1fZXhwYW5zaW9ucyk8MCkKKyAgICAgICAgfHwgIChleHBhbmQ8SW5kZXhWZWN0b3I+IChnbHUudXN1YiwgIGdsdS5uenVtYXgsICAwLCAxLCBudW1fZXhwYW5zaW9ucyk8MCkgKQorICAgIHsKKyAgICAgIC8vUmVkdWNlIHRoZSBlc3RpbWF0ZWQgc2l6ZSBhbmQgcmV0cnkKKyAgICAgIGdsdS5uemx1bWF4IC89IDI7CisgICAgICBnbHUubnp1bWF4IC89IDI7CisgICAgICBnbHUubnpsbWF4IC89IDI7CisgICAgICBpZiAoZ2x1Lm56bHVtYXggPCBhbm56ICkgcmV0dXJuIGdsdS5uemx1bWF4OyAKKyAgICB9CisgIH0gd2hpbGUgKCFnbHUubHVzdXAuc2l6ZSgpIHx8ICFnbHUudWNvbC5zaXplKCkgfHwgIWdsdS5sc3ViLnNpemUoKSB8fCAhZ2x1LnVzdWIuc2l6ZSgpKTsKKyAgCisgICsrbnVtX2V4cGFuc2lvbnM7CisgIHJldHVybiAwOworICAKK30gLy8gZW5kIEx1TWVtSW5pdAorCisvKiogCisgKiBcYnJpZWYgRXhwYW5kIHRoZSBleGlzdGluZyBzdG9yYWdlIAorICogXHBhcmFtIHZlYyB2ZWN0b3IgdG8gZXhwYW5kIAorICogXHBhcmFtW2luLG91dF0gbWF4bGVuIE9uIGlucHV0LCBwcmV2aW91cyBzaXplIG9mIHZlYyAoTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkgKS4gb24gb3V0cHV0LCBuZXcgc2l6ZQorICogXHBhcmFtIG5iRWx0cyBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICogXHBhcmFtIG1lbXR5cGUgVHlwZSBvZiB0aGUgZWxlbWVudCB0byBleHBhbmQKKyAqIFxwYXJhbSBudW1fZXhwYW5zaW9ucyBOdW1iZXIgb2YgZXhwYW5zaW9ucyAKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzLCA+IDAgc2l6ZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBzbyBmYXIKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGU+CitJbmRleCBTcGFyc2VMVUltcGw8U2NhbGFyLFN0b3JhZ2VJbmRleD46Om1lbVhwYW5kKFZlY3RvclR5cGUmIHZlYywgSW5kZXgmIG1heGxlbiwgSW5kZXggbmJFbHRzLCBNZW1UeXBlIG1lbXR5cGUsIEluZGV4JiBudW1fZXhwYW5zaW9ucykKK3sKKyAgSW5kZXggZmFpbGVkX3NpemU7IAorICBpZiAobWVtdHlwZSA9PSBVU1VCKQorICAgICBmYWlsZWRfc2l6ZSA9IHRoaXMtPmV4cGFuZDxWZWN0b3JUeXBlPih2ZWMsIG1heGxlbiwgbmJFbHRzLCAxLCBudW1fZXhwYW5zaW9ucyk7CisgIGVsc2UKKyAgICBmYWlsZWRfc2l6ZSA9IHRoaXMtPmV4cGFuZDxWZWN0b3JUeXBlPih2ZWMsIG1heGxlbiwgbmJFbHRzLCAwLCBudW1fZXhwYW5zaW9ucyk7CisKKyAgaWYgKGZhaWxlZF9zaXplKQorICAgIHJldHVybiBmYWlsZWRfc2l6ZTsgCisgIAorICByZXR1cm4gMCA7ICAKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorI2VuZGlmIC8vIEVJR0VOX1NQQVJTRUxVX01FTU9SWQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX1N0cnVjdHMuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9TdHJ1Y3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1ZWM0NAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9TdHJ1Y3RzLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyogCisgKiBOT1RFOiBUaGlzIGZpbGUgY29tZXMgZnJvbSBhIHBhcnRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIGZpbGVzIHNsdV9bcyxkLGMsel1kZWZzLmgKKyAqIC0tIFN1cGVyTFUgcm91dGluZSAodmVyc2lvbiA0LjEpIC0tCisgKiBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBYZXJveCBQYWxvIEFsdG8gUmVzZWFyY2ggQ2VudGVyLAorICogYW5kIExhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYi4KKyAqIE5vdmVtYmVyLCAyMDEwCisgKiAKKyAqIEdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgdXNlZCBpbiBMVSBmYWN0b3JpemF0aW9uIC0KKyAqIAorICogICBuc3VwZXI6ICNzdXBlcm5vZGVzID0gbnN1cGVyICsgMSwgbnVtYmVyZWQgWzAsIG5zdXBlcl0uCisgKiAgICh4c3VwLHN1cG5vKTogc3Vwbm9baV0gaXMgdGhlIHN1cGVybm9kZSBubyB0byB3aGljaCBpIGJlbG9uZ3M7CisgKiAgeHN1cChzKSBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcy10aCBzdXBlcm5vZGUuCisgKiAgZS5nLiAgIHN1cG5vIDAgMSAyIDIgMyAzIDMgNCA0IDQgNCA0ICAgKG49MTIpCisgKiAgICAgICAgICB4c3VwIDAgMSAyIDQgNyAxMgorICogIE5vdGU6IGRmcyB3aWxsIGJlIHBlcmZvcm1lZCBvbiBzdXBlcm5vZGUgcmVwLiByZWxhdGl2ZSB0byB0aGUgbmV3IAorICogICAgICAgIHJvdyBwaXZvdGluZyBvcmRlcmluZworICoKKyAqICAgKHhsc3ViLGxzdWIpOiBsc3ViWypdIGNvbnRhaW5zIHRoZSBjb21wcmVzc2VkIHN1YnNjcmlwdCBvZgorICogIHJlY3Rhbmd1bGFyIHN1cGVybm9kZXM7IHhsc3ViW2pdIHBvaW50cyB0byB0aGUgc3RhcnRpbmcKKyAqICBsb2NhdGlvbiBvZiB0aGUgai10aCBjb2x1bW4gaW4gbHN1YlsqXS4gTm90ZSB0aGF0IHhsc3ViIAorICogIGlzIGluZGV4ZWQgYnkgY29sdW1uLgorICogIFN0b3JhZ2U6IG9yaWdpbmFsIHJvdyBzdWJzY3JpcHRzCisgKgorICogICAgICBEdXJpbmcgdGhlIGNvdXJzZSBvZiBzcGFyc2UgTFUgZmFjdG9yaXphdGlvbiwgd2UgYWxzbyB1c2UKKyAqICAoeGxzdWIsbHN1YikgZm9yIHRoZSBwdXJwb3NlIG9mIHN5bW1ldHJpYyBwcnVuaW5nLiBGb3IgZWFjaAorICogIHN1cGVybm9kZSB7cyxzKzEsLi4uLHQ9cytyfSB3aXRoIGZpcnN0IGNvbHVtbiBzIGFuZCBsYXN0CisgKiAgY29sdW1uIHQsIHRoZSBzdWJzY3JpcHQgc2V0CisgKiAgICBsc3ViW2pdLCBqPXhsc3ViW3NdLCAuLiwgeGxzdWJbcysxXS0xCisgKiAgaXMgdGhlIHN0cnVjdHVyZSBvZiBjb2x1bW4gcyAoaS5lLiBzdHJ1Y3R1cmUgb2YgdGhpcyBzdXBlcm5vZGUpLgorICogIEl0IGlzIHVzZWQgZm9yIHRoZSBzdG9yYWdlIG9mIG51bWVyaWNhbCB2YWx1ZXMuCisgKiAgRnVydGhlcm1vcmUsCisgKiAgICBsc3ViW2pdLCBqPXhsc3ViW3RdLCAuLiwgeGxzdWJbdCsxXS0xCisgKiAgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbGFzdCBjb2x1bW4gdCBvZiB0aGlzIHN1cGVybm9kZS4KKyAqICBJdCBpcyBmb3IgdGhlIHB1cnBvc2Ugb2Ygc3ltbWV0cmljIHBydW5pbmcuIFRoZXJlZm9yZSwgdGhlCisgKiAgc3RydWN0dXJhbCBzdWJzY3JpcHRzIGNhbiBiZSByZWFycmFuZ2VkIHdpdGhvdXQgbWFraW5nIHBoeXNpY2FsCisgKiAgaW50ZXJjaGFuZ2VzIGFtb25nIHRoZSBudW1lcmljYWwgdmFsdWVzLgorICoKKyAqICBIb3dldmVyLCBpZiB0aGUgc3VwZXJub2RlIGhhcyBvbmx5IG9uZSBjb2x1bW4sIHRoZW4gd2UKKyAqICBvbmx5IGtlZXAgb25lIHNldCBvZiBzdWJzY3JpcHRzLiBGb3IgYW55IHN1YnNjcmlwdCBpbnRlcmNoYW5nZQorICogIHBlcmZvcm1lZCwgc2ltaWxhciBpbnRlcmNoYW5nZSBtdXN0IGJlIGRvbmUgb24gdGhlIG51bWVyaWNhbAorICogIHZhbHVlcy4KKyAqCisgKiAgVGhlIGxhc3QgY29sdW1uIHN0cnVjdHVyZXMgKGZvciBwcnVuaW5nKSB3aWxsIGJlIHJlbW92ZWQKKyAqICBhZnRlciB0aGUgbnVtZXJjaWFsIExVIGZhY3Rvcml6YXRpb24gcGhhc2UuCisgKgorICogICAoeGx1c3VwLGx1c3VwKTogbHVzdXBbKl0gY29udGFpbnMgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlCisgKiAgcmVjdGFuZ3VsYXIgc3VwZXJub2RlczsgeGx1c3VwW2pdIHBvaW50cyB0byB0aGUgc3RhcnRpbmcKKyAqICBsb2NhdGlvbiBvZiB0aGUgai10aCBjb2x1bW4gaW4gc3RvcmFnZSB2ZWN0b3IgbHVzdXBbKl0KKyAqICBOb3RlOiB4bHVzdXAgaXMgaW5kZXhlZCBieSBjb2x1bW4uCisgKiAgRWFjaCByZWN0YW5ndWxhciBzdXBlcm5vZGUgaXMgc3RvcmVkIGJ5IGNvbHVtbi1tYWpvcgorICogIHNjaGVtZSwgY29uc2lzdGVudCB3aXRoIEZvcnRyYW4gMi1kaW0gYXJyYXkgc3RvcmFnZS4KKyAqCisgKiAgICh4dXN1Yix1Y29sLHVzdWIpOiB1Y29sWypdIHN0b3JlcyB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZgorICogIFUtY29sdW1ucyBvdXRzaWRlIHRoZSByZWN0YW5ndWxhciBzdXBlcm5vZGVzLiBUaGUgcm93CisgKiAgc3Vic2NyaXB0IG9mIG5vbnplcm8gdWNvbFtrXSBpcyBzdG9yZWQgaW4gdXN1YltrXS4KKyAqICB4dXN1YltpXSBwb2ludHMgdG8gdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGNvbHVtbiBpIGluIHVjb2wuCisgKiAgU3RvcmFnZTogbmV3IHJvdyBzdWJzY3JpcHRzOyB0aGF0IGlzIHN1YnNjcmlwdHMgb2YgUEEuCisgKi8KKworI2lmbmRlZiBFSUdFTl9MVV9TVFJVQ1RTCisjZGVmaW5lIEVJR0VOX0xVX1NUUlVDVFMKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3R5cGVkZWYgZW51bSB7TFVTVVAsIFVDT0wsIExTVUIsIFVTVUIsIExMVkwsIFVMVkx9IE1lbVR5cGU7IAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhWZWN0b3IsIHR5cGVuYW1lIFNjYWxhclZlY3Rvcj4KK3N0cnVjdCBMVV9HbG9iYWxMVV90IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmRleFZlY3Rvcjo6U2NhbGFyIFN0b3JhZ2VJbmRleDsgCisgIEluZGV4VmVjdG9yIHhzdXA7IC8vRmlyc3Qgc3VwZXJub2RlIGNvbHVtbiAuLi4geHN1cChzKSBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcy10aCBzdXBlcm5vZGUKKyAgSW5kZXhWZWN0b3Igc3Vwbm87IC8vIFN1cGVybm9kZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbHVtbiAoY29sdW1uIHRvIHN1cGVybm9kZSBtYXBwaW5nKQorICBTY2FsYXJWZWN0b3IgIGx1c3VwOyAvLyBub256ZXJvIHZhbHVlcyBvZiBMIG9yZGVyZWQgYnkgY29sdW1ucyAKKyAgSW5kZXhWZWN0b3IgbHN1YjsgLy8gQ29tcHJlc3NlZCByb3cgaW5kaWNlcyBvZiBMIHJlY3Rhbmd1bGFyIHN1cGVybm9kZXMuIAorICBJbmRleFZlY3RvciB4bHVzdXA7IC8vIHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjb2x1bW4gaW4gbHVzdXAKKyAgSW5kZXhWZWN0b3IgeGxzdWI7IC8vIHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjb2x1bW4gaW4gbHN1YgorICBJbmRleCAgIG56bG1heDsgLy8gQ3VycmVudCBtYXggc2l6ZSBvZiBsc3ViCisgIEluZGV4ICAgbnpsdW1heDsgLy8gQ3VycmVudCBtYXggc2l6ZSBvZiBsdXN1cAorICBTY2FsYXJWZWN0b3IgIHVjb2w7IC8vIG5vbnplcm8gdmFsdWVzIG9mIFUgb3JkZXJlZCBieSBjb2x1bW5zIAorICBJbmRleFZlY3RvciB1c3ViOyAvLyByb3cgaW5kaWNlcyBvZiBVIGNvbHVtbnMgaW4gdWNvbAorICBJbmRleFZlY3RvciB4dXN1YjsgLy8gUG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNvbHVtbiBvZiBVIGluIHVjb2wgCisgIEluZGV4ICAgbnp1bWF4OyAvLyBDdXJyZW50IG1heCBzaXplIG9mIHVjb2wKKyAgSW5kZXggICBuOyAvLyBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbWF0cml4ICAKKyAgSW5kZXggICBudW1fZXhwYW5zaW9uczsgCit9OworCisvLyBWYWx1ZXMgdG8gc2V0IGZvciBwZXJmb3JtYW5jZQorc3RydWN0IHBlcmZ2YWx1ZXMgeworICBJbmRleCBwYW5lbF9zaXplOyAvLyBhIHBhbmVsIGNvbnNpc3RzIG9mIGF0IG1vc3QgPHBhbmVsX3NpemU+IGNvbnNlY3V0aXZlIGNvbHVtbnMKKyAgSW5kZXggcmVsYXg7IC8vIFRvIGNvbnRyb2wgZGVncmVlIG9mIHJlbGF4aW5nIHN1cGVybm9kZXMuIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgKGNvbHVtbnMpIAorICAgICAgICAgICAgICAgIC8vIGluIGEgc3VidHJlZSBvZiB0aGUgZWxpbWluYXRpb24gdHJlZSBpcyBsZXNzIHRoYW4gcmVsYXgsIHRoaXMgc3VidHJlZSBpcyBjb25zaWRlcmVkIAorICAgICAgICAgICAgICAgIC8vIGFzIG9uZSBzdXBlcm5vZGUgcmVnYXJkbGVzcyBvZiB0aGUgcm93IHN0cnVjdHVyZXMgb2YgdGhvc2UgY29sdW1ucworICBJbmRleCBtYXhzdXBlcjsgLy8gVGhlIG1heGltdW0gc2l6ZSBmb3IgYSBzdXBlcm5vZGUgaW4gY29tcGxldGUgTFUKKyAgSW5kZXggcm93YmxrOyAvLyBUaGUgbWluaW11bSByb3cgZGltZW5zaW9uIGZvciAyLUQgYmxvY2tpbmcgdG8gYmUgdXNlZDsKKyAgSW5kZXggY29sYmxrOyAvLyBUaGUgbWluaW11bSBjb2x1bW4gZGltZW5zaW9uIGZvciAyLUQgYmxvY2tpbmcgdG8gYmUgdXNlZDsKKyAgSW5kZXggZmlsbGZhY3RvcjsgLy8gVGhlIGVzdGltYXRlZCBmaWxscyBmYWN0b3JzIGZvciBMIGFuZCBVLCBjb21wYXJlZCB3aXRoIEEKK307IAorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisjZW5kaWYgLy8gRUlHRU5fTFVfU1RSVUNUUwpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX1N1cGVybm9kYWxNYXRyaXguaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9TdXBlcm5vZGFsTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxZTE4OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9TdXBlcm5vZGFsTWF0cml4LmgKQEAgLTAsMCArMSwzMDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VMVV9TVVBFUk5PREFMX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRUxVX1NVUEVSTk9EQUxfTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW5ncm91cCBTcGFyc2VMVV9Nb2R1bGUKKyAqIFxicmllZiBhIGNsYXNzIHRvIG1hbmlwdWxhdGUgdGhlIEwgc3VwZXJub2RhbCBmYWN0b3IgZnJvbSB0aGUgU3BhcnNlTFUgZmFjdG9yaXphdGlvbgorICogCisgKiBUaGlzIGNsYXNzICBjb250YWluIHRoZSBkYXRhIHRvIGVhc2lseSBzdG9yZSAKKyAqIGFuZCBtYW5pcHVsYXRlIHRoZSBzdXBlcm5vZGVzIGR1cmluZyB0aGUgZmFjdG9yaXphdGlvbiBhbmQgc29sdXRpb24gcGhhc2Ugb2YgU3BhcnNlIExVLiAKKyAqIE9ubHkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IGhhcyBzdXBlcm5vZGVzLgorICogCisgKiBOT1RFIDogVGhpcyBjbGFzcyBjb3JyZXNwb25kcyB0byB0aGUgU0Nmb3JtYXQgc3RydWN0dXJlIGluIFN1cGVyTFUKKyAqIAorICovCisvKiBUT0RPCisgKiBJbm5lckl0ZXJhdG9yIGFzIGZvciBzcGFyc2VtYXRyaXggCisgKiBTdXBlcklubmVySXRlcmF0b3IgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdXBlcm5vZGVzIAorICogRnVuY3Rpb24gZm9yIHRyaWFuZ3VsYXIgc29sdmUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitjbGFzcyBNYXBwZWRTdXBlck5vZGFsTWF0cml4Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOyAKKyAgICB0eXBlZGVmIF9TdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IEluZGV4VmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFNjYWxhclZlY3RvcjsKKyAgcHVibGljOgorICAgIE1hcHBlZFN1cGVyTm9kYWxNYXRyaXgoKQorICAgIHsKKyAgICAgIAorICAgIH0KKyAgICBNYXBwZWRTdXBlck5vZGFsTWF0cml4KEluZGV4IG0sIEluZGV4IG4sICBTY2FsYXJWZWN0b3ImIG56dmFsLCBJbmRleFZlY3RvciYgbnp2YWxfY29scHRyLCBJbmRleFZlY3RvciYgcm93aW5kLAorICAgICAgICAgICAgIEluZGV4VmVjdG9yJiByb3dpbmRfY29scHRyLCBJbmRleFZlY3RvciYgY29sX3RvX3N1cCwgSW5kZXhWZWN0b3ImIHN1cF90b19jb2wgKQorICAgIHsKKyAgICAgIHNldEluZm9zKG0sIG4sIG56dmFsLCBuenZhbF9jb2xwdHIsIHJvd2luZCwgcm93aW5kX2NvbHB0ciwgY29sX3RvX3N1cCwgc3VwX3RvX2NvbCk7CisgICAgfQorICAgIAorICAgIH5NYXBwZWRTdXBlck5vZGFsTWF0cml4KCkKKyAgICB7CisgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogU2V0IGFwcHJvcHJpYXRlIHBvaW50ZXJzIGZvciB0aGUgbG93ZXIgdHJpYW5ndWxhciBzdXBlcm5vZGFsIG1hdHJpeAorICAgICAqIFRoZXNlIGluZm9zIGFyZSBhdmFpbGFibGUgYXQgdGhlIGVuZCBvZiB0aGUgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24KKyAgICAgKiBGSVhNRSBUaGlzIGNsYXNzIHdpbGwgYmUgbW9kaWZpZWQgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2UgaW4gdGhlIGNvdXJzZSAKKyAgICAgKiBvZiB0aGUgZmFjdG9yaXphdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHNldEluZm9zKEluZGV4IG0sIEluZGV4IG4sIFNjYWxhclZlY3RvciYgbnp2YWwsIEluZGV4VmVjdG9yJiBuenZhbF9jb2xwdHIsIEluZGV4VmVjdG9yJiByb3dpbmQsCisgICAgICAgICAgICAgSW5kZXhWZWN0b3ImIHJvd2luZF9jb2xwdHIsIEluZGV4VmVjdG9yJiBjb2xfdG9fc3VwLCBJbmRleFZlY3RvciYgc3VwX3RvX2NvbCApCisgICAgeworICAgICAgbV9yb3cgPSBtOworICAgICAgbV9jb2wgPSBuOyAKKyAgICAgIG1fbnp2YWwgPSBuenZhbC5kYXRhKCk7IAorICAgICAgbV9uenZhbF9jb2xwdHIgPSBuenZhbF9jb2xwdHIuZGF0YSgpOyAKKyAgICAgIG1fcm93aW5kID0gcm93aW5kLmRhdGEoKTsgCisgICAgICBtX3Jvd2luZF9jb2xwdHIgPSByb3dpbmRfY29scHRyLmRhdGEoKTsgCisgICAgICBtX25zdXBlciA9IGNvbF90b19zdXAobik7IAorICAgICAgbV9jb2xfdG9fc3VwID0gY29sX3RvX3N1cC5kYXRhKCk7IAorICAgICAgbV9zdXBfdG9fY29sID0gc3VwX3RvX2NvbC5kYXRhKCk7IAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2Ygcm93cworICAgICAqLworICAgIEluZGV4IHJvd3MoKSB7IHJldHVybiBtX3JvdzsgfQorICAgIAorICAgIC8qKgorICAgICAqIE51bWJlciBvZiBjb2x1bW5zCisgICAgICovCisgICAgSW5kZXggY29scygpIHsgcmV0dXJuIG1fY29sOyB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcnJheSBvZiBub256ZXJvIHZhbHVlcyBwYWNrZWQgYnkgY29sdW1uCisgICAgICogCisgICAgICogVGhlIHNpemUgaXMgbm56CisgICAgICovCisgICAgU2NhbGFyKiB2YWx1ZVB0cigpIHsgIHJldHVybiBtX256dmFsOyB9CisgICAgCisgICAgY29uc3QgU2NhbGFyKiB2YWx1ZVB0cigpIGNvbnN0IAorICAgIHsKKyAgICAgIHJldHVybiBtX256dmFsOyAKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY29sdW1uIGluIFxyZWYgdmFsdWVQdHIoKQorICAgICAqLworICAgIFN0b3JhZ2VJbmRleCogY29sSW5kZXhQdHIoKQorICAgIHsKKyAgICAgIHJldHVybiBtX256dmFsX2NvbHB0cjsgCisgICAgfQorICAgIAorICAgIGNvbnN0IFN0b3JhZ2VJbmRleCogY29sSW5kZXhQdHIoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX256dmFsX2NvbHB0cjsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgY29tcHJlc3NlZCByb3cgaW5kaWNlcyBvZiBhbGwgc3VwZXJub2RlcworICAgICAqLworICAgIFN0b3JhZ2VJbmRleCogcm93SW5kZXgoKSAgeyByZXR1cm4gbV9yb3dpbmQ7IH0KKyAgICAKKyAgICBjb25zdCBTdG9yYWdlSW5kZXgqIHJvd0luZGV4KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9yb3dpbmQ7IAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIGluIFxlbSByb3d2YWx1ZVB0cigpIHdoaWNoIHN0YXJ0cyBlYWNoIGNvbHVtbgorICAgICAqLworICAgIFN0b3JhZ2VJbmRleCogcm93SW5kZXhQdHIoKSB7IHJldHVybiBtX3Jvd2luZF9jb2xwdHI7IH0KKyAgICAKKyAgICBjb25zdCBTdG9yYWdlSW5kZXgqIHJvd0luZGV4UHRyKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9yb3dpbmRfY29scHRyOyAKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2YgY29sdW1uLXRvLXN1cGVybm9kZSBtYXBwaW5nIAorICAgICAqLworICAgIFN0b3JhZ2VJbmRleCogY29sVG9TdXAoKSAgeyByZXR1cm4gbV9jb2xfdG9fc3VwOyB9CisgICAgCisgICAgY29uc3QgU3RvcmFnZUluZGV4KiBjb2xUb1N1cCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fY29sX3RvX3N1cDsgICAgICAgCisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgb2Ygc3VwZXJub2RlLXRvLWNvbHVtbiBtYXBwaW5nCisgICAgICovCisgICAgU3RvcmFnZUluZGV4KiBzdXBUb0NvbCgpIHsgcmV0dXJuIG1fc3VwX3RvX2NvbDsgfQorICAgIAorICAgIGNvbnN0IFN0b3JhZ2VJbmRleCogc3VwVG9Db2woKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3N1cF90b19jb2w7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN1cGVybm9kZXMKKyAgICAgKi8KKyAgICBJbmRleCBuc3VwZXIoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX25zdXBlcjsgCisgICAgfQorICAgIAorICAgIGNsYXNzIElubmVySXRlcmF0b3I7IAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBzb2x2ZUluUGxhY2UoIE1hdHJpeEJhc2U8RGVzdD4mWCkgY29uc3Q7CisgICAgCisgICAgICAKKyAgICAgIAorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgSW5kZXggbV9yb3c7IC8vIE51bWJlciBvZiByb3dzCisgICAgSW5kZXggbV9jb2w7IC8vIE51bWJlciBvZiBjb2x1bW5zCisgICAgSW5kZXggbV9uc3VwZXI7IC8vIE51bWJlciBvZiBzdXBlcm5vZGVzCisgICAgU2NhbGFyKiBtX256dmFsOyAvL2FycmF5IG9mIG5vbnplcm8gdmFsdWVzIHBhY2tlZCBieSBjb2x1bW4KKyAgICBTdG9yYWdlSW5kZXgqIG1fbnp2YWxfY29scHRyOyAvL256dmFsX2NvbHB0cltqXSBTdG9yZXMgdGhlIGxvY2F0aW9uIGluIG56dmFsW10gd2hpY2ggc3RhcnRzIGNvbHVtbiBqCisgICAgU3RvcmFnZUluZGV4KiBtX3Jvd2luZDsgLy8gQXJyYXkgb2YgY29tcHJlc3NlZCByb3cgaW5kaWNlcyBvZiByZWN0YW5ndWxhciBzdXBlcm5vZGVzCisgICAgU3RvcmFnZUluZGV4KiBtX3Jvd2luZF9jb2xwdHI7IC8vcm93aW5kX2NvbHB0cltqXSBzdG9yZXMgdGhlIGxvY2F0aW9uIGluIHJvd2luZFtdIHdoaWNoIHN0YXJ0cyBjb2x1bW4gagorICAgIFN0b3JhZ2VJbmRleCogbV9jb2xfdG9fc3VwOyAvLyBjb2xfdG9fc3VwW2pdIGlzIHRoZSBzdXBlcm5vZGUgbnVtYmVyIHRvIHdoaWNoIGNvbHVtbiBqIGJlbG9uZ3MKKyAgICBTdG9yYWdlSW5kZXgqIG1fc3VwX3RvX2NvbDsgLy9zdXBfdG9fY29sW3NdIHBvaW50cyB0byB0aGUgc3RhcnRpbmcgY29sdW1uIG9mIHRoZSBzLXRoIHN1cGVybm9kZQorICAgIAorICBwcml2YXRlIDoKK307CisKKy8qKgorICAqIFxicmllZiBJbm5lckl0ZXJhdG9yIGNsYXNzIHRvIGl0ZXJhdGUgb3ZlciBub256ZXJvIHZhbHVlcyBvZiB0aGUgY3VycmVudCBjb2x1bW4gaW4gdGhlIHN1cGVybm9kYWwgbWF0cml4IEwKKyAgKiAKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgorY2xhc3MgTWFwcGVkU3VwZXJOb2RhbE1hdHJpeDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6SW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgIElubmVySXRlcmF0b3IoY29uc3QgTWFwcGVkU3VwZXJOb2RhbE1hdHJpeCYgbWF0LCBJbmRleCBvdXRlcikKKyAgICAgIDogbV9tYXRyaXgobWF0KSwKKyAgICAgICAgbV9vdXRlcihvdXRlciksCisgICAgICAgIG1fc3Vwbm8obWF0LmNvbFRvU3VwKClbb3V0ZXJdKSwKKyAgICAgICAgbV9pZHZhbChtYXQuY29sSW5kZXhQdHIoKVtvdXRlcl0pLAorICAgICAgICBtX3N0YXJ0aWR2YWwobV9pZHZhbCksCisgICAgICAgIG1fZW5kaWR2YWwobWF0LmNvbEluZGV4UHRyKClbb3V0ZXIrMV0pLAorICAgICAgICBtX2lkcm93KG1hdC5yb3dJbmRleFB0cigpW21hdC5zdXBUb0NvbCgpW21hdC5jb2xUb1N1cCgpW291dGVyXV1dKSwKKyAgICAgICAgbV9lbmRpZHJvdyhtYXQucm93SW5kZXhQdHIoKVttYXQuc3VwVG9Db2woKVttYXQuY29sVG9TdXAoKVtvdXRlcl1dKzFdKQorICAgIHt9CisgICAgaW5saW5lIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsgCisgICAgICBtX2lkdmFsKys7IAorICAgICAgbV9pZHJvdysrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX2lkdmFsXTsgfQorICAgIAorICAgIGlubGluZSBTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXImPihtX21hdHJpeC52YWx1ZVB0cigpW21faWR2YWxdKTsgfQorICAgIAorICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd0luZGV4KClbbV9pZHJvd107IH0KKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gaW5kZXgoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBtX291dGVyOyB9CisgICAgCisgICAgaW5saW5lIEluZGV4IHN1cEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zdXBubzsgfQorICAgIAorICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgCisgICAgeyAKKyAgICAgIHJldHVybiAoIChtX2lkdmFsIDwgbV9lbmRpZHZhbCkgJiYgKG1faWR2YWwgPj0gbV9zdGFydGlkdmFsKQorICAgICAgICAgICAgICAgICYmIChtX2lkcm93IDwgbV9lbmRpZHJvdykgKTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBNYXBwZWRTdXBlck5vZGFsTWF0cml4JiBtX21hdHJpeDsgLy8gU3VwZXJub2RhbCBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCAKKyAgICBjb25zdCBJbmRleCBtX291dGVyOyAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBjb2x1bW4gCisgICAgY29uc3QgSW5kZXggbV9zdXBubzsgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgU3VwZXJOb2RlIG51bWJlcgorICAgIEluZGV4IG1faWR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRleCB0byBicm93c2UgdGhlIHZhbHVlcyBpbiB0aGUgY3VycmVudCBjb2x1bW4KKyAgICBjb25zdCBJbmRleCBtX3N0YXJ0aWR2YWw7ICAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgdGhlIGNvbHVtbiB2YWx1ZQorICAgIGNvbnN0IEluZGV4IG1fZW5kaWR2YWw7ICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgdGhlIGNvbHVtbiB2YWx1ZQorICAgIEluZGV4IG1faWRyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRleCB0byBicm93c2UgdGhlIHJvdyBpbmRpY2VzIAorICAgIEluZGV4IG1fZW5kaWRyb3c7ICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmQgaW5kZXggb2Ygcm93IGluZGljZXMgb2YgdGhlIGN1cnJlbnQgY29sdW1uCit9OworCisvKioKKyAqIFxicmllZiBTb2x2ZSB3aXRoIHRoZSBzdXBlcm5vZGUgdHJpYW5ndWxhciBtYXRyaXgKKyAqIAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4Xz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlc3Q+Cit2b2lkIE1hcHBlZFN1cGVyTm9kYWxNYXRyaXg8U2NhbGFyLEluZGV4Xz46OnNvbHZlSW5QbGFjZSggTWF0cml4QmFzZTxEZXN0PiZYKSBjb25zdAoreworICAgIC8qIEV4cGxpY2l0IHR5cGUgY29udmVyc2lvbiBhcyB0aGUgSW5kZXggdHlwZSBvZiBNYXRyaXhCYXNlPERlc3Q+IG1heSBiZSB3aWRlciB0aGFuIEluZGV4ICovCisvLyAgICBlaWdlbl9hc3NlcnQoWC5yb3dzKCkgPD0gTnVtVHJhaXRzPEluZGV4Pjo6aGlnaGVzdCgpKTsKKy8vICAgIGVpZ2VuX2Fzc2VydChYLmNvbHMoKSA8PSBOdW1UcmFpdHM8SW5kZXg+OjpoaWdoZXN0KCkpOworICAgIEluZGV4IG4gICAgPSBpbnQoWC5yb3dzKCkpOworICAgIEluZGV4IG5yaHMgPSBJbmRleChYLmNvbHMoKSk7CisgICAgY29uc3QgU2NhbGFyICogTHZhbCA9IHZhbHVlUHRyKCk7ICAgICAgICAgICAgICAgICAvLyBOb256ZXJvIHZhbHVlcyAKKyAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWUsIENvbE1ham9yPiB3b3JrKG4sIG5yaHMpOyAgICAgLy8gd29ya2luZyB2ZWN0b3IKKyAgICB3b3JrLnNldFplcm8oKTsKKyAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDw9IG5zdXBlcigpOyBrICsrKQorICAgIHsKKyAgICAgIEluZGV4IGZzdXBjID0gc3VwVG9Db2woKVtrXTsgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvbHVtbiBvZiB0aGUgY3VycmVudCBzdXBlcm5vZGUgCisgICAgICBJbmRleCBpc3RhcnQgPSByb3dJbmRleFB0cigpW2ZzdXBjXTsgICAgICAgICAgICAvLyBQb2ludGVyIGluZGV4IHRvIHRoZSBzdWJzY3JpcHQgb2YgdGhlIGN1cnJlbnQgY29sdW1uCisgICAgICBJbmRleCBuc3VwciA9IHJvd0luZGV4UHRyKClbZnN1cGMrMV0gLSBpc3RhcnQ7ICAvLyBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgY3VycmVudCBzdXBlcm5vZGUKKyAgICAgIEluZGV4IG5zdXBjID0gc3VwVG9Db2woKVtrKzFdIC0gZnN1cGM7ICAgICAgICAgIC8vIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjdXJyZW50IHN1cGVybm9kZQorICAgICAgSW5kZXggbnJvdyA9IG5zdXByIC0gbnN1cGM7ICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJvd3MgaW4gdGhlIG5vbi1kaWFnb25hbCBwYXJ0IG9mIHRoZSBzdXBlcm5vZGUKKyAgICAgIEluZGV4IGlyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ3VycmVudCBpbmRleCByb3cKKyAgICAgIAorICAgICAgaWYgKG5zdXBjID09IDEgKQorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbnJoczsgaisrKQorICAgICAgICB7CisgICAgICAgICAgSW5uZXJJdGVyYXRvciBpdCgqdGhpcywgZnN1cGMpOworICAgICAgICAgICsraXQ7IC8vIFNraXAgdGhlIGRpYWdvbmFsIGVsZW1lbnQKKyAgICAgICAgICBmb3IgKDsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgaXJvdyA9IGl0LnJvdygpOworICAgICAgICAgICAgWChpcm93LCBqKSAtPSBYKGZzdXBjLCBqKSAqIGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFRoZSBzdXBlcm5vZGUgaGFzIG1vcmUgdGhhbiBvbmUgY29sdW1uIAorICAgICAgICBJbmRleCBsdXB0ciA9IGNvbEluZGV4UHRyKClbZnN1cGNdOyAKKyAgICAgICAgSW5kZXggbGRhID0gY29sSW5kZXhQdHIoKVtmc3VwYysxXSAtIGx1cHRyOworICAgICAgICAKKyAgICAgICAgLy8gVHJpYW5ndWxhciBzb2x2ZSAKKyAgICAgICAgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBBKCAmKEx2YWxbbHVwdHJdKSwgbnN1cGMsIG5zdXBjLCBPdXRlclN0cmlkZTw+KGxkYSkgKTsKKyAgICAgICAgTWFwPCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWUsIENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IFUgKCYoWChmc3VwYywwKSksIG5zdXBjLCBucmhzLCBPdXRlclN0cmlkZTw+KG4pICk7CisgICAgICAgIFUgPSBBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS5zb2x2ZShVKTsgCisgICAgICAgIAorICAgICAgICAvLyBNYXRyaXgtdmVjdG9yIHByb2R1Y3QgCisgICAgICAgIG5ldyAoJkEpIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYywgQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gKCAmKEx2YWxbbHVwdHIrbnN1cGNdKSwgbnJvdywgbnN1cGMsIE91dGVyU3RyaWRlPD4obGRhKSApOworICAgICAgICB3b3JrLnRvcFJvd3MobnJvdykubm9hbGlhcygpID0gQSAqIFU7CisgICAgICAgIAorICAgICAgICAvL0JlZ2luIFNjYXR0ZXIgCisgICAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBucmhzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBpcHRyID0gaXN0YXJ0ICsgbnN1cGM7IAorICAgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBucm93OyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgaXJvdyA9IHJvd0luZGV4KClbaXB0cl07IAorICAgICAgICAgICAgWChpcm93LCBqKSAtPSB3b3JrKGksIGopOyAvLyBTY2F0dGVyIG9wZXJhdGlvbgorICAgICAgICAgICAgd29yayhpLCBqKSA9IFNjYWxhcigwKTsgCisgICAgICAgICAgICBpcHRyKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSAKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFTFVfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9VdGlscy5oIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZGFiNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9VdGlscy5oCkBAIC0wLDAgKzEsODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjaWZuZGVmIEVJR0VOX1NQQVJTRUxVX1VUSUxTX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFTFVfVVRJTFNfSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqCisgKiBcYnJpZWYgQ291bnQgTm9uemVybyBlbGVtZW50cyBpbiB0aGUgZmFjdG9ycworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+Cit2b2lkIFNwYXJzZUxVSW1wbDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6Y291bnRueihjb25zdCBJbmRleCBuLCBJbmRleCYgbm56TCwgSW5kZXgmIG5uelUsIEdsb2JhbExVX3QmIGdsdSkKK3sKKyBubnpMID0gMDsgCisgbm56VSA9IChnbHUueHVzdWIpKG4pOyAKKyBJbmRleCBuc3VwZXIgPSAoZ2x1LnN1cG5vKShuKTsgCisgSW5kZXggamxlbjsgCisgSW5kZXggaSwgaiwgZnN1cGM7CisgaWYgKG4gPD0gMCApIHJldHVybjsgCisgLy8gRm9yIGVhY2ggc3VwZXJub2RlCisgZm9yIChpID0gMDsgaSA8PSBuc3VwZXI7IGkrKykKKyB7CisgICBmc3VwYyA9IGdsdS54c3VwKGkpOyAKKyAgIGpsZW4gPSBnbHUueGxzdWIoZnN1cGMrMSkgLSBnbHUueGxzdWIoZnN1cGMpOyAKKyAgIAorICAgZm9yIChqID0gZnN1cGM7IGogPCBnbHUueHN1cChpKzEpOyBqKyspCisgICB7CisgICAgIG5uekwgKz0gamxlbjsgCisgICAgIG5uelUgKz0gaiAtIGZzdXBjICsgMTsgCisgICAgIGpsZW4tLTsgCisgICB9CisgfQorfQorCisvKioKKyAqIFxicmllZiBGaXggdXAgdGhlIGRhdGEgc3RvcmFnZSBsc3ViIGZvciBMLXN1YnNjcmlwdHMuIAorICogCisgKiBJdCByZW1vdmVzIHRoZSBzdWJzY3JpcHRzIHNldHMgZm9yIHN0cnVjdHVyYWwgcHJ1bmluZywgCisgKiBhbmQgYXBwbGllcyBwZXJtdXRhdGlvbiB0byB0aGUgcmVtYWluaW5nIHN1YnNjcmlwdHMKKyAqIAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+Cit2b2lkIFNwYXJzZUxVSW1wbDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6Zml4dXBMKGNvbnN0IEluZGV4IG4sIGNvbnN0IEluZGV4VmVjdG9yJiBwZXJtX3IsIEdsb2JhbExVX3QmIGdsdSkKK3sKKyAgSW5kZXggZnN1cGMsIGksIGosIGssIGpzdGFydDsgCisgIAorICBTdG9yYWdlSW5kZXggbmV4dGwgPSAwOyAKKyAgSW5kZXggbnN1cGVyID0gKGdsdS5zdXBubykobik7IAorICAKKyAgLy8gRm9yIGVhY2ggc3VwZXJub2RlIAorICBmb3IgKGkgPSAwOyBpIDw9IG5zdXBlcjsgaSsrKQorICB7CisgICAgZnN1cGMgPSBnbHUueHN1cChpKTsgCisgICAganN0YXJ0ID0gZ2x1Lnhsc3ViKGZzdXBjKTsgCisgICAgZ2x1Lnhsc3ViKGZzdXBjKSA9IG5leHRsOyAKKyAgICBmb3IgKGogPSBqc3RhcnQ7IGogPCBnbHUueGxzdWIoZnN1cGMgKyAxKTsgaisrKQorICAgIHsKKyAgICAgIGdsdS5sc3ViKG5leHRsKSA9IHBlcm1fcihnbHUubHN1YihqKSk7IC8vIE5vdyBpbmRleGVkIGludG8gUCpBCisgICAgICBuZXh0bCsrOworICAgIH0KKyAgICBmb3IgKGsgPSBmc3VwYysxOyBrIDwgZ2x1LnhzdXAoaSsxKTsgaysrKQorICAgICAgZ2x1Lnhsc3ViKGspID0gbmV4dGw7IC8vIG90aGVyIGNvbHVtbnMgaW4gc3VwZXJub2RlIGkKKyAgfQorICAKKyAgZ2x1Lnhsc3ViKG4pID0gbmV4dGw7IAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFTFVfVVRJTFNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2NvbHVtbl9ibW9kLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfY29sdW1uX2Jtb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2NvbHVtbl9ibW9kLmgKQEAgLTAsMCArMSwxODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyogCisgCisgKiBOT1RFOiBUaGlzIGZpbGUgaXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gb2YgeGNvbHVtbl9ibW9kLmMgZmlsZSBpbiBTdXBlckxVIAorIAorICogLS0gU3VwZXJMVSByb3V0aW5lICh2ZXJzaW9uIDMuMCkgLS0KKyAqIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFhlcm94IFBhbG8gQWx0byBSZXNlYXJjaCBDZW50ZXIsCisgKiBhbmQgTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFiLgorICogT2N0b2JlciAxNSwgMjAwMworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBieSBYZXJveCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVEhJUyBNQVRFUklBTCBJUyBQUk9WSURFRCBBUyBJUywgV0lUSCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRC4gIEFOWSBVU0UgSVMgQVQgWU9VUiBPV04gUklTSy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSBvciBjb3B5IHRoaXMgcHJvZ3JhbSBmb3IgYW55CisgKiBwdXJwb3NlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQKKyAqIHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisjaWZuZGVmIFNQQVJTRUxVX0NPTFVNTl9CTU9EX0gKKyNkZWZpbmUgU1BBUlNFTFVfQ09MVU1OX0JNT0RfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLyoqCisgKiBcYnJpZWYgUGVyZm9ybXMgbnVtZXJpYyBibG9jayB1cGRhdGVzIChzdXAtY29sKSBpbiB0b3BvbG9naWNhbCBvcmRlcgorICogCisgKiBccGFyYW0gamNvbCBjdXJyZW50IGNvbHVtbiB0byB1cGRhdGUKKyAqIFxwYXJhbSBuc2VnIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgVSBwYXJ0CisgKiBccGFyYW0gZGVuc2UgU3RvcmUgdGhlIGZ1bGwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbHVtbgorICogXHBhcmFtIHRlbXB2IHdvcmtpbmcgYXJyYXkgCisgKiBccGFyYW0gc2VncmVwIHNlZ21lbnQgcmVwcmVzZW50YXRpdmUgLi4uCisgKiBccGFyYW0gcmVwZm56ID8/PyBGaXJzdCBub256ZXJvIGNvbHVtbiBpbiBlYWNoIHJvdyA/Pz8gIC4uLgorICogXHBhcmFtIGZwYW5lbGMgRmlyc3QgY29sdW1uIGluIHRoZSBjdXJyZW50IHBhbmVsCisgKiBccGFyYW0gZ2x1IEdsb2JhbCBMVSBkYXRhLiAKKyAqIFxyZXR1cm4gMCAtIHN1Y2Nlc3NmdWwgcmV0dXJuIAorICogICAgICAgICA+IDAgLSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHdoZW4gcnVuIG91dCBvZiBzcGFjZQorICogCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK0luZGV4IFNwYXJzZUxVSW1wbDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6Y29sdW1uX2Jtb2QoY29uc3QgSW5kZXggamNvbCwgY29uc3QgSW5kZXggbnNlZywgQmxvY2tTY2FsYXJWZWN0b3IgZGVuc2UsIFNjYWxhclZlY3RvciYgdGVtcHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrSW5kZXhWZWN0b3Igc2VncmVwLCBCbG9ja0luZGV4VmVjdG9yIHJlcGZueiwgSW5kZXggZnBhbmVsYywgR2xvYmFsTFVfdCYgZ2x1KQoreworICBJbmRleCAganN1cG5vLCBrLCBrc3ViLCBrcmVwLCBrc3Vwbm87IAorICBJbmRleCBscHRyLCBucm93LCBpc3ViLCBpcm93LCBuZXh0bHUsIG5ld19uZXh0LCB1Zmlyc3Q7IAorICBJbmRleCBmc3VwYywgbnN1cGMsIG5zdXByLCBsdXB0ciwga2Zueiwgbm9femVyb3M7IAorICAvKiBrcmVwID0gcmVwcmVzZW50YXRpdmUgb2YgY3VycmVudCBrLXRoIHN1cGVybm9kZQorICAgICogZnN1cGMgPSAgZmlyc3Qgc3VwZXJub2RhbCBjb2x1bW4KKyAgICAqIG5zdXBjID0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSBzdXBlcm5vZGUKKyAgICAqIG5zdXByID0gbnVtYmVyIG9mIHJvd3MgaW4gYSBzdXBlcm5vZGUKKyAgICAqIGx1cHRyID0gbG9jYXRpb24gb2Ygc3VwZXJub2RhbCBMVS1ibG9jayBpbiBzdG9yYWdlCisgICAgKiBrZm56ID0gZmlyc3Qgbm9ueiBpbiB0aGUgay10aCBzdXBlcm5vZGFsIHNlZ21lbnQKKyAgICAqIG5vX3plcm9zID0gbm8gbGYgbGVhZGluZyB6ZXJvcyBpbiBhIHN1cGVybm9kYWwgVS1zZWdtZW50CisgICAgKi8KKyAgCisgIGpzdXBubyA9IGdsdS5zdXBubyhqY29sKTsKKyAgLy8gRm9yIGVhY2ggbm9uemVybyBzdXBlcm5vZGUgc2VnbWVudCBvZiBVWyosal0gaW4gdG9wb2xvZ2ljYWwgb3JkZXIgCisgIGsgPSBuc2VnIC0gMTsgCisgIEluZGV4IGRfZnN1cGM7IC8vIGRpc3RhbmNlIGJldHdlZW4gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgY3VycmVudCBwYW5lbCBhbmQgdGhlIAorICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sdW1uIG9mIHRoZSBjdXJyZW50IHNub2RlCisgIEluZGV4IGZzdF9jb2w7IC8vIEZpcnN0IGNvbHVtbiB3aXRoaW4gc21hbGwgTFUgdXBkYXRlCisgIEluZGV4IHNlZ3NpemU7IAorICBmb3IgKGtzdWIgPSAwOyBrc3ViIDwgbnNlZzsga3N1YisrKQorICB7CisgICAga3JlcCA9IHNlZ3JlcChrKTsgay0tOyAKKyAgICBrc3Vwbm8gPSBnbHUuc3Vwbm8oa3JlcCk7IAorICAgIGlmIChqc3Vwbm8gIT0ga3N1cG5vICkKKyAgICB7CisgICAgICAvLyBvdXRzaWRlIHRoZSByZWN0YW5ndWxhciBzdXBlcm5vZGUgCisgICAgICBmc3VwYyA9IGdsdS54c3VwKGtzdXBubyk7IAorICAgICAgZnN0X2NvbCA9IChzdGQ6Om1heCkoZnN1cGMsIGZwYW5lbGMpOyAKKyAgICAgIAorICAgICAgLy8gRGlzdGFuY2UgZnJvbSB0aGUgY3VycmVudCBzdXBlcm5vZGUgdG8gdGhlIGN1cnJlbnQgcGFuZWw7IAorICAgICAgLy8gZF9mc3VwYyA9IDAgaWYgZnN1cGMgPiBmcGFuZWxjCisgICAgICBkX2ZzdXBjID0gZnN0X2NvbCAtIGZzdXBjOyAKKyAgICAgIAorICAgICAgbHVwdHIgPSBnbHUueGx1c3VwKGZzdF9jb2wpICsgZF9mc3VwYzsgCisgICAgICBscHRyID0gZ2x1Lnhsc3ViKGZzdXBjKSArIGRfZnN1cGM7IAorICAgICAgCisgICAgICBrZm56ID0gcmVwZm56KGtyZXApOyAKKyAgICAgIGtmbnogPSAoc3RkOjptYXgpKGtmbnosIGZwYW5lbGMpOyAKKyAgICAgIAorICAgICAgc2Vnc2l6ZSA9IGtyZXAgLSBrZm56ICsgMTsgCisgICAgICBuc3VwYyA9IGtyZXAgLSBmc3RfY29sICsgMTsgCisgICAgICBuc3VwciA9IGdsdS54bHN1Yihmc3VwYysxKSAtIGdsdS54bHN1Yihmc3VwYyk7IAorICAgICAgbnJvdyA9IG5zdXByIC0gZF9mc3VwYyAtIG5zdXBjOworICAgICAgSW5kZXggbGRhID0gZ2x1LnhsdXN1cChmc3RfY29sKzEpIC0gZ2x1LnhsdXN1cChmc3RfY29sKTsKKyAgICAgIAorICAgICAgCisgICAgICAvLyBQZXJmb3JtIGEgdHJpYW5ndWxhciBzb2x2ZXIgYW5kIGJsb2NrIHVwZGF0ZSwgCisgICAgICAvLyB0aGVuIHNjYXR0ZXIgdGhlIHJlc3VsdCBvZiBzdXAtY29sIHVwZGF0ZSB0byBkZW5zZQorICAgICAgbm9femVyb3MgPSBrZm56IC0gZnN0X2NvbDsgCisgICAgICBpZihzZWdzaXplPT0xKQorICAgICAgICBMVV9rZXJuZWxfYm1vZDwxPjo6cnVuKHNlZ3NpemUsIGRlbnNlLCB0ZW1wdiwgZ2x1Lmx1c3VwLCBsdXB0ciwgbGRhLCBucm93LCBnbHUubHN1YiwgbHB0ciwgbm9femVyb3MpOworICAgICAgZWxzZQorICAgICAgICBMVV9rZXJuZWxfYm1vZDxEeW5hbWljPjo6cnVuKHNlZ3NpemUsIGRlbnNlLCB0ZW1wdiwgZ2x1Lmx1c3VwLCBsdXB0ciwgbGRhLCBucm93LCBnbHUubHN1YiwgbHB0ciwgbm9femVyb3MpOworICAgIH0gLy8gZW5kIGlmIGpzdXBubyAKKyAgfSAvLyBlbmQgZm9yIGVhY2ggc2VnbWVudAorICAKKyAgLy8gUHJvY2VzcyB0aGUgc3VwZXJub2RhbCBwb3J0aW9uIG9mICBMXFVbKixqXQorICBuZXh0bHUgPSBnbHUueGx1c3VwKGpjb2wpOyAKKyAgZnN1cGMgPSBnbHUueHN1cChqc3Vwbm8pOworICAKKyAgLy8gY29weSB0aGUgU1BBIGRlbnNlIGludG8gTFxVWyosal0KKyAgSW5kZXggbWVtOyAKKyAgbmV3X25leHQgPSBuZXh0bHUgKyBnbHUueGxzdWIoZnN1cGMgKyAxKSAtIGdsdS54bHN1Yihmc3VwYyk7IAorICBJbmRleCBvZmZzZXQgPSBpbnRlcm5hbDo6Zmlyc3RfbXVsdGlwbGU8SW5kZXg+KG5ld19uZXh0LCBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplKSAtIG5ld19uZXh0OworICBpZihvZmZzZXQpCisgICAgbmV3X25leHQgKz0gb2Zmc2V0OworICB3aGlsZSAobmV3X25leHQgPiBnbHUubnpsdW1heCApCisgIHsKKyAgICBtZW0gPSBtZW1YcGFuZDxTY2FsYXJWZWN0b3I+KGdsdS5sdXN1cCwgZ2x1Lm56bHVtYXgsIG5leHRsdSwgTFVTVVAsIGdsdS5udW1fZXhwYW5zaW9ucyk7ICAKKyAgICBpZiAobWVtKSByZXR1cm4gbWVtOyAKKyAgfQorICAKKyAgZm9yIChpc3ViID0gZ2x1Lnhsc3ViKGZzdXBjKTsgaXN1YiA8IGdsdS54bHN1Yihmc3VwYysxKTsgaXN1YisrKQorICB7CisgICAgaXJvdyA9IGdsdS5sc3ViKGlzdWIpOworICAgIGdsdS5sdXN1cChuZXh0bHUpID0gZGVuc2UoaXJvdyk7CisgICAgZGVuc2UoaXJvdykgPSBTY2FsYXIoMC4wKTsgCisgICAgKytuZXh0bHU7IAorICB9CisgIAorICBpZihvZmZzZXQpCisgIHsKKyAgICBnbHUubHVzdXAuc2VnbWVudChuZXh0bHUsb2Zmc2V0KS5zZXRaZXJvKCk7CisgICAgbmV4dGx1ICs9IG9mZnNldDsKKyAgfQorICBnbHUueGx1c3VwKGpjb2wgKyAxKSA9IFN0b3JhZ2VJbmRleChuZXh0bHUpOyAgLy8gY2xvc2UgTFxVKCosamNvbCk7IAorICAKKyAgLyogRm9yIG1vcmUgdXBkYXRlcyB3aXRoaW4gdGhlIHBhbmVsIChhbHNvIHdpdGhpbiB0aGUgY3VycmVudCBzdXBlcm5vZGUpLAorICAgKiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBwYW5lbCwgb3IgdGhlIGZpcnN0IGNvbHVtbgorICAgKiBvZiB0aGUgc3VwZXJub2RlLCB3aGljaGV2ZXIgaXMgYmlnZ2VyLiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorICAgKiAgMSkgZnN1cGMgPCBmcGFuZWxjLCB0aGVuIGZzdF9jb2wgPC0tIGZwYW5lbGMKKyAgICogIDIpIGZzdXBjID49IGZwYW5lbGMsIHRoZW4gZnN0X2NvbCA8LS0gZnN1cGMKKyAgICovCisgIGZzdF9jb2wgPSAoc3RkOjptYXgpKGZzdXBjLCBmcGFuZWxjKTsgCisgIAorICBpZiAoZnN0X2NvbCAgPCBqY29sKQorICB7CisgICAgLy8gRGlzdGFuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBzdXBlcm5vZGUgYW5kIHRoZSBjdXJyZW50IHBhbmVsCisgICAgLy8gZF9mc3VwYyA9IDAgaWYgZnN1cGMgPj0gZnBhbmVsYworICAgIGRfZnN1cGMgPSBmc3RfY29sIC0gZnN1cGM7IAorICAgIAorICAgIGxwdHIgPSBnbHUueGxzdWIoZnN1cGMpICsgZF9mc3VwYzsgCisgICAgbHVwdHIgPSBnbHUueGx1c3VwKGZzdF9jb2wpICsgZF9mc3VwYzsgCisgICAgbnN1cHIgPSBnbHUueGxzdWIoZnN1cGMrMSkgLSBnbHUueGxzdWIoZnN1cGMpOyAvLyBsZWFkaW5nIGRpbWVuc2lvbgorICAgIG5zdXBjID0gamNvbCAtIGZzdF9jb2w7IC8vIGV4Y2x1ZGluZyBqY29sIAorICAgIG5yb3cgPSBuc3VwciAtIGRfZnN1cGMgLSBuc3VwYzsgCisgICAgCisgICAgLy8gcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgamNvbCBpbiBzbm9kZSBMXFUoanN1cG5vKSAKKyAgICB1Zmlyc3QgPSBnbHUueGx1c3VwKGpjb2wpICsgZF9mc3VwYzsgCisgICAgSW5kZXggbGRhID0gZ2x1LnhsdXN1cChqY29sKzEpIC0gZ2x1LnhsdXN1cChqY29sKTsKKyAgICBNYXBwZWRNYXRyaXhCbG9jayBBKCAmKGdsdS5sdXN1cC5kYXRhKClbbHVwdHJdKSwgbnN1cGMsIG5zdXBjLCBPdXRlclN0cmlkZTw+KGxkYSkgKTsKKyAgICBWZWN0b3JCbG9jazxTY2FsYXJWZWN0b3I+IHUoZ2x1Lmx1c3VwLCB1Zmlyc3QsIG5zdXBjKTsgCisgICAgdSA9IEEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlKHUpOyAKKyAgICAKKyAgICBuZXcgKCZBKSBNYXBwZWRNYXRyaXhCbG9jayAoICYoZ2x1Lmx1c3VwLmRhdGEoKVtsdXB0cituc3VwY10pLCBucm93LCBuc3VwYywgT3V0ZXJTdHJpZGU8PihsZGEpICk7CisgICAgVmVjdG9yQmxvY2s8U2NhbGFyVmVjdG9yPiBsKGdsdS5sdXN1cCwgdWZpcnN0K25zdXBjLCBucm93KTsgCisgICAgbC5ub2FsaWFzKCkgLT0gQSAqIHU7CisgICAgCisgIH0gLy8gRW5kIGlmIGZzdF9jb2wKKyAgcmV0dXJuIDA7IAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gU1BBUlNFTFVfQ09MVU1OX0JNT0RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2NvbHVtbl9kZnMuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9jb2x1bW5fZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4YjMwZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9jb2x1bW5fZGZzLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyogCisgCisgKiBOT1RFOiBUaGlzIGZpbGUgaXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gb2YgW3MsZCxjLHpdY29sdW1uX2Rmcy5jIGZpbGUgaW4gU3VwZXJMVSAKKyAKKyAqIC0tIFN1cGVyTFUgcm91dGluZSAodmVyc2lvbiAyLjApIC0tCisgKiBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBYZXJveCBQYWxvIEFsdG8gUmVzZWFyY2ggQ2VudGVyLAorICogYW5kIExhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYi4KKyAqIE5vdmVtYmVyIDE1LCAxOTk3CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IGJ5IFhlcm94IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcworICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdAorICogdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKyNpZm5kZWYgU1BBUlNFTFVfQ09MVU1OX0RGU19ICisjZGVmaW5lIFNQQVJTRUxVX0NPTFVNTl9ERlNfSAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+IGNsYXNzIFNwYXJzZUxVSW1wbDsKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4VmVjdG9yLCB0eXBlbmFtZSBTY2FsYXJWZWN0b3I+CitzdHJ1Y3QgY29sdW1uX2Rmc190cmFpdHMgOiBub19hc3NpZ25tZW50X29wZXJhdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyVmVjdG9yOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEluZGV4VmVjdG9yOjpTY2FsYXIgU3RvcmFnZUluZGV4OworICBjb2x1bW5fZGZzX3RyYWl0cyhJbmRleCBqY29sLCBJbmRleCYganN1cGVyLCB0eXBlbmFtZSBTcGFyc2VMVUltcGw8U2NhbGFyLCBTdG9yYWdlSW5kZXg+OjpHbG9iYWxMVV90JiBnbHUsIFNwYXJzZUxVSW1wbDxTY2FsYXIsIFN0b3JhZ2VJbmRleD4mIGx1SW1wbCkKKyAgIDogbV9qY29sKGpjb2wpLCBtX2pzdXBlcl9yZWYoanN1cGVyKSwgbV9nbHUoZ2x1KSwgbV9sdUltcGwobHVJbXBsKQorIHt9CisgIGJvb2wgdXBkYXRlX3NlZ3JlcChJbmRleCAvKmtyZXAqLywgSW5kZXggLypqaiovKQorICB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdm9pZCBtZW1fZXhwYW5kKEluZGV4VmVjdG9yJiBsc3ViLCBJbmRleCYgbmV4dGwsIEluZGV4IGNobWFyaykKKyAgeworICAgIGlmIChuZXh0bCA+PSBtX2dsdS5uemxtYXgpCisgICAgICBtX2x1SW1wbC5tZW1YcGFuZChsc3ViLCBtX2dsdS5uemxtYXgsIG5leHRsLCBMU1VCLCBtX2dsdS5udW1fZXhwYW5zaW9ucyk7IAorICAgIGlmIChjaG1hcmsgIT0gKG1famNvbC0xKSkgbV9qc3VwZXJfcmVmID0gZW1wdHlJZHhMVTsKKyAgfQorICBlbnVtIHsgRXhwYW5kTWVtID0gdHJ1ZSB9OworICAKKyAgSW5kZXggbV9qY29sOworICBJbmRleCYgbV9qc3VwZXJfcmVmOworICB0eXBlbmFtZSBTcGFyc2VMVUltcGw8U2NhbGFyLCBTdG9yYWdlSW5kZXg+OjpHbG9iYWxMVV90JiBtX2dsdTsKKyAgU3BhcnNlTFVJbXBsPFNjYWxhciwgU3RvcmFnZUluZGV4PiYgbV9sdUltcGw7Cit9OworCisKKy8qKgorICogXGJyaWVmIFBlcmZvcm1zIGEgc3ltYm9saWMgZmFjdG9yaXphdGlvbiBvbiBjb2x1bW4gamNvbCBhbmQgZGVjaWRlIHRoZSBzdXBlcm5vZGUgYm91bmRhcnkKKyAqIAorICogQSBzdXBlcm5vZGUgcmVwcmVzZW50YXRpdmUgaXMgdGhlIGxhc3QgY29sdW1uIG9mIGEgc3VwZXJub2RlLgorICogVGhlIG5vbnplcm9zIGluIFVbKixqXSBhcmUgc2VnbWVudHMgdGhhdCBlbmQgYXQgc3VwZXJub2RlcyByZXByZXNlbnRhdGl2ZXMuIAorICogVGhlIHJvdXRpbmUgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIHN1cGVybm9kYWwgcmVwcmVzZW50YXRpdmVzIAorICogaW4gdG9wb2xvZ2ljYWwgb3JkZXIgb2YgdGhlIGRmcyB0aGF0IGdlbmVyYXRlcyB0aGVtLiAKKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgbm9uemVybyBpbiBlYWNoIHN1cGVybm9kYWwgc2VnbWVudCAKKyAqIChzdXBlcm5vZGFsIGVudHJ5IGxvY2F0aW9uKSBpcyBhbHNvIHJldHVybmVkLiAKKyAqIAorICogXHBhcmFtIG0gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeAorICogXHBhcmFtIGpjb2wgQ3VycmVudCBjb2x1bW4gCisgKiBccGFyYW0gcGVybV9yIFJvdyBwZXJtdXRhdGlvbgorICogXHBhcmFtIG1heHN1cGVyICBNYXhpbXVtIG51bWJlciBvZiBjb2x1bW4gYWxsb3dlZCBpbiBhIHN1cGVybm9kZQorICogXHBhcmFtIFtpbixvdXRdIG5zZWcgTnVtYmVyIG9mIHNlZ21lbnRzIGluIGN1cnJlbnQgVVsqLGpdIC0gbmV3IHNlZ21lbnRzIGFwcGVuZGVkCisgKiBccGFyYW0gbHN1Yl9jb2wgZGVmaW5lcyB0aGUgcmhzIHZlY3RvciB0byBzdGFydCB0aGUgZGZzCisgKiBccGFyYW0gW2luLG91dF0gc2VncmVwIFNlZ21lbnQgcmVwcmVzZW50YXRpdmVzIC0gbmV3IHNlZ21lbnRzIGFwcGVuZGVkIAorICogXHBhcmFtIHJlcGZueiAgRmlyc3Qgbm9uemVybyBsb2NhdGlvbiBpbiBlYWNoIHJvdworICogXHBhcmFtIHhwcnVuZSAKKyAqIFxwYXJhbSBtYXJrZXIgIG1hcmtlcltpXSA9PSBqaiwgaWYgaSB3YXMgdmlzaXRlZCBkdXJpbmcgZGZzIG9mIGN1cnJlbnQgY29sdW1uIGpqOworICogXHBhcmFtIHBhcmVudAorICogXHBhcmFtIHhwbG9yZSB3b3JraW5nIGFycmF5CisgKiBccGFyYW0gZ2x1IGdsb2JhbCBMVSBkYXRhIAorICogXHJldHVybiAwIHN1Y2Nlc3MKKyAqICAgICAgICAgPiAwIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgd2hlbiBydW4gb3V0IG9mIHNwYWNlCisgKiAKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4PgorSW5kZXggU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+Ojpjb2x1bW5fZGZzKGNvbnN0IEluZGV4IG0sIGNvbnN0IEluZGV4IGpjb2wsIEluZGV4VmVjdG9yJiBwZXJtX3IsIEluZGV4IG1heHN1cGVyLCBJbmRleCYgbnNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0luZGV4VmVjdG9yIGxzdWJfY29sLCBJbmRleFZlY3RvciYgc2VncmVwLCBCbG9ja0luZGV4VmVjdG9yIHJlcGZueiwgSW5kZXhWZWN0b3ImIHhwcnVuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFZlY3RvciYgbWFya2VyLCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgeHBsb3JlLCBHbG9iYWxMVV90JiBnbHUpCit7CisgIAorICBJbmRleCBqc3VwZXIgPSBnbHUuc3Vwbm8oamNvbCk7IAorICBJbmRleCBuZXh0bCA9IGdsdS54bHN1YihqY29sKTsgCisgIFZlY3RvckJsb2NrPEluZGV4VmVjdG9yPiBtYXJrZXIyKG1hcmtlciwgMiptLCBtKTsgCisgIAorICAKKyAgY29sdW1uX2Rmc190cmFpdHM8SW5kZXhWZWN0b3IsIFNjYWxhclZlY3Rvcj4gdHJhaXRzKGpjb2wsIGpzdXBlciwgZ2x1LCAqdGhpcyk7CisgIAorICAvLyBGb3IgZWFjaCBub256ZXJvIGluIEEoKixqY29sKSBkbyBkZnMgCisgIGZvciAoSW5kZXggayA9IDA7ICgoayA8IG0pID8gbHN1Yl9jb2xba10gIT0gZW1wdHlJZHhMVSA6IGZhbHNlKSA7IGsrKykKKyAgeworICAgIEluZGV4IGtyb3cgPSBsc3ViX2NvbChrKTsgCisgICAgbHN1Yl9jb2woaykgPSBlbXB0eUlkeExVOyAKKyAgICBJbmRleCBrbWFyayA9IG1hcmtlcjIoa3Jvdyk7IAorICAgIAorICAgIC8vIGtyb3cgd2FzIHZpc2l0ZWQgYmVmb3JlLCBnbyB0byB0aGUgbmV4dCBub256OyAKKyAgICBpZiAoa21hcmsgPT0gamNvbCkgY29udGludWU7CisgICAgCisgICAgZGZzX2tlcm5lbChTdG9yYWdlSW5kZXgoamNvbCksIHBlcm1fciwgbnNlZywgZ2x1LmxzdWIsIHNlZ3JlcCwgcmVwZm56LCB4cHJ1bmUsIG1hcmtlcjIsIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICB4cGxvcmUsIGdsdSwgbmV4dGwsIGtyb3csIHRyYWl0cyk7CisgIH0gLy8gZm9yIGVhY2ggbm9uemVybyAuLi4gCisgIAorICBJbmRleCBmc3VwYzsKKyAgU3RvcmFnZUluZGV4IG5zdXBlciA9IGdsdS5zdXBubyhqY29sKTsKKyAgU3RvcmFnZUluZGV4IGpjb2xwMSA9IFN0b3JhZ2VJbmRleChqY29sKSArIDE7CisgIEluZGV4IGpjb2xtMSA9IGpjb2wgLSAxOworICAKKyAgLy8gY2hlY2sgdG8gc2VlIGlmIGogYmVsb25ncyBpbiB0aGUgc2FtZSBzdXBlcm5vZGUgYXMgai0xCisgIGlmICggamNvbCA9PSAwICkKKyAgeyAvLyBEbyBub3RoaW5nIGZvciBjb2x1bW4gMCAKKyAgICBuc3VwZXIgPSBnbHUuc3Vwbm8oMCkgPSAwIDsKKyAgfQorICBlbHNlIAorICB7CisgICAgZnN1cGMgPSBnbHUueHN1cChuc3VwZXIpOyAKKyAgICBTdG9yYWdlSW5kZXgganB0ciA9IGdsdS54bHN1YihqY29sKTsgLy8gTm90IHlldCBjb21wcmVzc2VkCisgICAgU3RvcmFnZUluZGV4IGptMXB0ciA9IGdsdS54bHN1YihqY29sbTEpOyAKKyAgICAKKyAgICAvLyBVc2Ugc3VwZXJub2RlcyBvZiB0eXBlIFQyIDogc2VlIFN1cGVyTFUgcGFwZXIKKyAgICBpZiAoIChuZXh0bC1qcHRyICE9IGpwdHItam0xcHRyLTEpICkganN1cGVyID0gZW1wdHlJZHhMVTsKKyAgICAKKyAgICAvLyBNYWtlIHN1cmUgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgc3VwZXJub2RlIGRvZXNuJ3QKKyAgICAvLyBleGNlZWQgdGhyZXNob2xkCisgICAgaWYgKCAoamNvbCAtIGZzdXBjKSA+PSBtYXhzdXBlcikganN1cGVyID0gZW1wdHlJZHhMVTsgCisgICAgCisgICAgLyogSWYgamNvbCBzdGFydHMgYSBuZXcgc3VwZXJub2RlLCByZWNsYWltIHN0b3JhZ2Ugc3BhY2UgaW4KKyAgICAgKiBnbHUubHN1YiBmcm9tIHByZXZpb3VzIHN1cGVybm9kZS4gTm90ZSB3ZSBvbmx5IHN0b3JlIAorICAgICAqIHRoZSBzdWJzY3JpcHQgc2V0IG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBjb2x1bW5zIG9mIAorICAgICAqIGEgc3VwZXJub2RlLiAoZmlyc3QgZm9yIG51bSB2YWx1ZXMsIGxhc3QgZm9yIHBydW5pbmcpCisgICAgICovCisgICAgaWYgKGpzdXBlciA9PSBlbXB0eUlkeExVKQorICAgIHsgLy8gc3RhcnRzIGEgbmV3IHN1cGVybm9kZSAKKyAgICAgIGlmICggKGZzdXBjIDwgamNvbG0xLTEpICkgCisgICAgICB7IC8vID49IDMgY29sdW1ucyBpbiBuc3VwZXIKKyAgICAgICAgU3RvcmFnZUluZGV4IGl0byA9IGdsdS54bHN1Yihmc3VwYysxKTsKKyAgICAgICAgZ2x1Lnhsc3ViKGpjb2xtMSkgPSBpdG87IAorICAgICAgICBTdG9yYWdlSW5kZXggaXN0b3AgPSBpdG8gKyBqcHRyIC0gam0xcHRyOyAKKyAgICAgICAgeHBydW5lKGpjb2xtMSkgPSBpc3RvcDsgLy8gaW50aWFsaXplIHhwcnVuZShqY29sLTEpCisgICAgICAgIGdsdS54bHN1YihqY29sKSA9IGlzdG9wOyAKKyAgICAgICAgCisgICAgICAgIGZvciAoU3RvcmFnZUluZGV4IGlmcm9tID0gam0xcHRyOyBpZnJvbSA8IG5leHRsOyArK2lmcm9tLCArK2l0bykKKyAgICAgICAgICBnbHUubHN1YihpdG8pID0gZ2x1LmxzdWIoaWZyb20pOyAKKyAgICAgICAgbmV4dGwgPSBpdG87ICAvLyA9IGlzdG9wICsgbGVuZ3RoKGpjb2wpCisgICAgICB9CisgICAgICBuc3VwZXIrKzsgCisgICAgICBnbHUuc3Vwbm8oamNvbCkgPSBuc3VwZXI7IAorICAgIH0gLy8gaWYgYSBuZXcgc3VwZXJub2RlIAorICB9IC8vIGVuZCBlbHNlOiAgamNvbCA+IDAKKyAgCisgIC8vIFRpZHkgdXAgdGhlIHBvaW50ZXJzIGJlZm9yZSBleGl0CisgIGdsdS54c3VwKG5zdXBlcisxKSA9IGpjb2xwMTsgCisgIGdsdS5zdXBubyhqY29scDEpID0gbnN1cGVyOyAKKyAgeHBydW5lKGpjb2wpID0gU3RvcmFnZUluZGV4KG5leHRsKTsgIC8vIEludGlhbGl6ZSB1cHBlciBib3VuZCBmb3IgcHJ1bmluZworICBnbHUueGxzdWIoamNvbHAxKSA9IFN0b3JhZ2VJbmRleChuZXh0bCk7IAorICAKKyAgcmV0dXJuIDA7IAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2NvcHlfdG9fdWNvbC5oIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2NvcHlfdG9fdWNvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmQ4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfY29weV90b191Y29sLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKy8qIAorIAorICogTk9URTogVGhpcyBmaWxlIGlzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIG9mIFtzLGQsYyx6XWNvcHlfdG9fdWNvbC5jIGZpbGUgaW4gU3VwZXJMVSAKKyAKKyAqIC0tIFN1cGVyTFUgcm91dGluZSAodmVyc2lvbiAyLjApIC0tCisgKiBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBYZXJveCBQYWxvIEFsdG8gUmVzZWFyY2ggQ2VudGVyLAorICogYW5kIExhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYi4KKyAqIE5vdmVtYmVyIDE1LCAxOTk3CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IGJ5IFhlcm94IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcworICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdAorICogdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKyNpZm5kZWYgU1BBUlNFTFVfQ09QWV9UT19VQ09MX0gKKyNkZWZpbmUgU1BBUlNFTFVfQ09QWV9UT19VQ09MX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKgorICogXGJyaWVmIFBlcmZvcm1zIG51bWVyaWMgYmxvY2sgdXBkYXRlcyAoc3VwLWNvbCkgaW4gdG9wb2xvZ2ljYWwgb3JkZXIKKyAqIAorICogXHBhcmFtIGpjb2wgY3VycmVudCBjb2x1bW4gdG8gdXBkYXRlCisgKiBccGFyYW0gbnNlZyBOdW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhlIFUgcGFydAorICogXHBhcmFtIHNlZ3JlcCBzZWdtZW50IHJlcHJlc2VudGF0aXZlIC4uLgorICogXHBhcmFtIHJlcGZueiBGaXJzdCBub256ZXJvIGNvbHVtbiBpbiBlYWNoIHJvdyAgLi4uCisgKiBccGFyYW0gcGVybV9yIFJvdyBwZXJtdXRhdGlvbiAKKyAqIFxwYXJhbSBkZW5zZSBTdG9yZSB0aGUgZnVsbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sdW1uCisgKiBccGFyYW0gZ2x1IEdsb2JhbCBMVSBkYXRhLiAKKyAqIFxyZXR1cm4gMCAtIHN1Y2Nlc3NmdWwgcmV0dXJuIAorICogICAgICAgICA+IDAgLSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHdoZW4gcnVuIG91dCBvZiBzcGFjZQorICogCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK0luZGV4IFNwYXJzZUxVSW1wbDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6Y29weV90b191Y29sKGNvbnN0IEluZGV4IGpjb2wsIGNvbnN0IEluZGV4IG5zZWcsIEluZGV4VmVjdG9yJiBzZWdyZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0luZGV4VmVjdG9yIHJlcGZueiAsSW5kZXhWZWN0b3ImIHBlcm1fciwgQmxvY2tTY2FsYXJWZWN0b3IgZGVuc2UsIEdsb2JhbExVX3QmIGdsdSkKK3sgIAorICBJbmRleCBrc3ViLCBrcmVwLCBrc3Vwbm87IAorICAgIAorICBJbmRleCBqc3Vwbm8gPSBnbHUuc3Vwbm8oamNvbCk7CisgIAorICAvLyBGb3IgZWFjaCBub256ZXJvIHN1cGVybm9kZSBzZWdtZW50IG9mIFVbKixqXSBpbiB0b3BvbG9naWNhbCBvcmRlciAKKyAgSW5kZXggayA9IG5zZWcgLSAxLCBpOyAKKyAgU3RvcmFnZUluZGV4IG5leHR1ID0gZ2x1Lnh1c3ViKGpjb2wpOyAKKyAgSW5kZXgga2ZueiwgaXN1Yiwgc2Vnc2l6ZTsgCisgIEluZGV4IG5ld19uZXh0LGlyb3c7IAorICBJbmRleCBmc3VwYywgbWVtOyAKKyAgZm9yIChrc3ViID0gMDsga3N1YiA8IG5zZWc7IGtzdWIrKykKKyAgeworICAgIGtyZXAgPSBzZWdyZXAoayk7IGstLTsgCisgICAga3N1cG5vID0gZ2x1LnN1cG5vKGtyZXApOyAKKyAgICBpZiAoanN1cG5vICE9IGtzdXBubyApIC8vIHNob3VsZCBnbyBpbnRvIHVjb2woKTsgCisgICAgeworICAgICAga2ZueiA9IHJlcGZueihrcmVwKTsgCisgICAgICBpZiAoa2ZueiAhPSBlbXB0eUlkeExVKQorICAgICAgeyAvLyBOb256ZXJvIFUtc2VnbWVudCAKKyAgICAgICAgZnN1cGMgPSBnbHUueHN1cChrc3Vwbm8pOyAKKyAgICAgICAgaXN1YiA9IGdsdS54bHN1Yihmc3VwYykgKyBrZm56IC0gZnN1cGM7IAorICAgICAgICBzZWdzaXplID0ga3JlcCAtIGtmbnogKyAxOyAKKyAgICAgICAgbmV3X25leHQgPSBuZXh0dSArIHNlZ3NpemU7IAorICAgICAgICB3aGlsZSAobmV3X25leHQgPiBnbHUubnp1bWF4KSAKKyAgICAgICAgeworICAgICAgICAgIG1lbSA9IG1lbVhwYW5kPFNjYWxhclZlY3Rvcj4oZ2x1LnVjb2wsIGdsdS5uenVtYXgsIG5leHR1LCBVQ09MLCBnbHUubnVtX2V4cGFuc2lvbnMpOyAKKyAgICAgICAgICBpZiAobWVtKSByZXR1cm4gbWVtOyAKKyAgICAgICAgICBtZW0gPSBtZW1YcGFuZDxJbmRleFZlY3Rvcj4oZ2x1LnVzdWIsIGdsdS5uenVtYXgsIG5leHR1LCBVU1VCLCBnbHUubnVtX2V4cGFuc2lvbnMpOyAKKyAgICAgICAgICBpZiAobWVtKSByZXR1cm4gbWVtOyAKKyAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlZ3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlyb3cgPSBnbHUubHN1Yihpc3ViKTsgCisgICAgICAgICAgZ2x1LnVzdWIobmV4dHUpID0gcGVybV9yKGlyb3cpOyAvLyBVbmxpa2UgdGhlIEwgcGFydCwgdGhlIFUgcGFydCBpcyBzdG9yZWQgaW4gaXRzIGZpbmFsIG9yZGVyCisgICAgICAgICAgZ2x1LnVjb2wobmV4dHUpID0gZGVuc2UoaXJvdyk7IAorICAgICAgICAgIGRlbnNlKGlyb3cpID0gU2NhbGFyKDAuMCk7IAorICAgICAgICAgIG5leHR1Kys7CisgICAgICAgICAgaXN1YisrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgfSAvLyBlbmQgbm9uemVybyBVLXNlZ21lbnQgCisgICAgICAKKyAgICB9IC8vIGVuZCBpZiBqc3Vwbm8gCisgICAgCisgIH0gLy8gZW5kIGZvciBlYWNoIHNlZ21lbnQKKyAgZ2x1Lnh1c3ViKGpjb2wgKyAxKSA9IG5leHR1OyAvLyBjbG9zZSBVKCosamNvbCkKKyAgcmV0dXJuIDA7IAorfQorCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBTUEFSU0VMVV9DT1BZX1RPX1VDT0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2dlbW1fa2VybmVsLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfZ2VtbV9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJhNzQxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2dlbW1fa2VybmVsLmgKQEAgLTAsMCArMSwyODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VMVV9HRU1NX0tFUk5FTF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRUxVX0dFTU1fS0VSTkVMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworCisvKiogXGludGVybmFsCisgICogQSBnZW5lcmFsIG1hdHJpeC1tYXRyaXggcHJvZHVjdCBrZXJuZWwgb3B0aW1pemVkIGZvciB0aGUgU3BhcnNlTFUgZmFjdG9yaXphdGlvbi4KKyAgKiAgLSBBLCBCLCBhbmQgQyBtdXN0IGJlIGNvbHVtbiBtYWpvcgorICAqICAtIGxkYSBhbmQgbGRjIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZSByZXNwZWN0aXZlIHBhY2tldCBzaXplCisgICogIC0gQyBtdXN0IGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIEEKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RPTlRfSU5MSU5FCit2b2lkIHNwYXJzZWx1X2dlbW0oSW5kZXggbSwgSW5kZXggbiwgSW5kZXggZCwgY29uc3QgU2NhbGFyKiBBLCBJbmRleCBsZGEsIGNvbnN0IFNjYWxhciogQiwgSW5kZXggbGRiLCBTY2FsYXIqIEMsIEluZGV4IGxkYykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOjppbnRlcm5hbDsKKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgZW51bSB7CisgICAgTnVtYmVyT2ZSZWdpc3RlcnMgPSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUywKKyAgICBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplLAorICAgIFBNID0gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlZWxpbmcgaW4gTQorICAgIFJOID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGJsb2NraW5nCisgICAgUksgPSBOdW1iZXJPZlJlZ2lzdGVycz49MTYgPyA0IDogMiwgLy8gcmVnaXN0ZXIgYmxvY2tpbmcKKyAgICBCTSA9IDQwOTYvc2l6ZW9mKFNjYWxhciksICAgICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBvZiBBLUMgcGVyIGNodW5rCisgICAgU00gPSBQTSpQYWNrZXRTaXplICAgICAgICAgICAgICAgICAgLy8gc3RlcCBhbG9uZyBNCisgIH07CisgIEluZGV4IGRfZW5kID0gKGQvUkspKlJLOyAgICAvLyBudW1iZXIgb2YgY29sdW1ucyBvZiBBIChyb3dzIG9mIEIpIHN1aXRhYmxlIGZvciBmdWxsIHJlZ2lzdGVyIGJsb2NraW5nCisgIEluZGV4IG5fZW5kID0gKG4vUk4pKlJOOyAgICAvLyBudW1iZXIgb2YgY29sdW1ucyBvZiBCLUMgc3VpdGFibGUgZm9yIHByb2Nlc3NpbmcgUk4gY29sdW1ucyBhdCBvbmNlCisgIEluZGV4IGkwID0gaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZChBLG0pOworICAKKyAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KCgobGRhJVBhY2tldFNpemUpPT0wKSAmJiAoKGxkYyVQYWNrZXRTaXplKT09MCkgJiYgKGkwPT1pbnRlcm5hbDo6Zmlyc3RfZGVmYXVsdF9hbGlnbmVkKEMsbSkpKTsKKyAgCisgIC8vIGhhbmRsZSB0aGUgbm9uIGFsaWduZWQgcm93cyBvZiBBIGFuZCBDIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbjoKKyAgZm9yKEluZGV4IGk9MDsgaTxpMDsgKytpKQorICB7CisgICAgZm9yKEluZGV4IGo9MDsgajxuOyArK2opCisgICAgeworICAgICAgU2NhbGFyIGMgPSBDW2kraipsZGNdOworICAgICAgZm9yKEluZGV4IGs9MDsgazxkOyArK2spCisgICAgICAgIGMgKz0gQltrK2oqbGRiXSAqIEFbaStrKmxkYV07CisgICAgICBDW2kraipsZGNdID0gYzsKKyAgICB9CisgIH0KKyAgLy8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgcGVyIGNodW5rIG9mIEJNIHJvd3MKKyAgZm9yKEluZGV4IGliPWkwOyBpYjxtOyBpYis9Qk0pCisgIHsKKyAgICBJbmRleCBhY3R1YWxfYiA9IHN0ZDo6bWluPEluZGV4PihCTSwgbS1pYik7ICAgICAgICAgICAgICAgICAvLyBhY3R1YWwgbnVtYmVyIG9mIHJvd3MKKyAgICBJbmRleCBhY3R1YWxfYl9lbmQxID0gKGFjdHVhbF9iL1NNKSpTTTsgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsIG51bWJlciBvZiByb3dzIHN1aXRhYmxlIGZvciBwZWVsaW5nCisgICAgSW5kZXggYWN0dWFsX2JfZW5kMiA9IChhY3R1YWxfYi9QYWNrZXRTaXplKSpQYWNrZXRTaXplOyAgIC8vIGFjdHVhbCBudW1iZXIgb2Ygcm93cyBzdWl0YWJsZSBmb3IgdmVjdG9yaXphdGlvbgorICAgIAorICAgIC8vIExldCdzIHByb2Nlc3MgdHdvIGNvbHVtbnMgb2YgQi1DIGF0IG9uY2UKKyAgICBmb3IoSW5kZXggaj0wOyBqPG5fZW5kOyBqKz1STikKKyAgICB7CisgICAgICBjb25zdCBTY2FsYXIqIEJjMCA9IEIrKGorMCkqbGRiOworICAgICAgY29uc3QgU2NhbGFyKiBCYzEgPSBCKyhqKzEpKmxkYjsKKyAgICAgIAorICAgICAgZm9yKEluZGV4IGs9MDsgazxkX2VuZDsgays9UkspCisgICAgICB7CisgICAgICAgIAorICAgICAgICAvLyBsb2FkIGFuZCBleHBhbmQgYSBSTiB4IFJLIGJsb2NrIG9mIEIKKyAgICAgICAgUGFja2V0IGIwMCwgYjEwLCBiMjAsIGIzMCwgYjAxLCBiMTEsIGIyMSwgYjMxOworICAgICAgICAgICAgICAgICAgeyBiMDAgPSBwc2V0MTxQYWNrZXQ+KEJjMFswXSk7IH0KKyAgICAgICAgICAgICAgICAgIHsgYjEwID0gcHNldDE8UGFja2V0PihCYzBbMV0pOyB9CisgICAgICAgIGlmKFJLPT00KSB7IGIyMCA9IHBzZXQxPFBhY2tldD4oQmMwWzJdKTsgfQorICAgICAgICBpZihSSz09NCkgeyBiMzAgPSBwc2V0MTxQYWNrZXQ+KEJjMFszXSk7IH0KKyAgICAgICAgICAgICAgICAgIHsgYjAxID0gcHNldDE8UGFja2V0PihCYzFbMF0pOyB9CisgICAgICAgICAgICAgICAgICB7IGIxMSA9IHBzZXQxPFBhY2tldD4oQmMxWzFdKTsgfQorICAgICAgICBpZihSSz09NCkgeyBiMjEgPSBwc2V0MTxQYWNrZXQ+KEJjMVsyXSk7IH0KKyAgICAgICAgaWYoUks9PTQpIHsgYjMxID0gcHNldDE8UGFja2V0PihCYzFbM10pOyB9CisgICAgICAgIAorICAgICAgICBQYWNrZXQgYTAsIGExLCBhMiwgYTMsIGMwLCBjMSwgdDAsIHQxOworICAgICAgICAKKyAgICAgICAgY29uc3QgU2NhbGFyKiBBMCA9IEEraWIrKGsrMCkqbGRhOworICAgICAgICBjb25zdCBTY2FsYXIqIEExID0gQStpYisoaysxKSpsZGE7CisgICAgICAgIGNvbnN0IFNjYWxhciogQTIgPSBBK2liKyhrKzIpKmxkYTsKKyAgICAgICAgY29uc3QgU2NhbGFyKiBBMyA9IEEraWIrKGsrMykqbGRhOworICAgICAgICAKKyAgICAgICAgU2NhbGFyKiBDMCA9IEMraWIrKGorMCkqbGRjOworICAgICAgICBTY2FsYXIqIEMxID0gQytpYisoaisxKSpsZGM7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgYTAgPSBwbG9hZDxQYWNrZXQ+KEEwKTsKKyAgICAgICAgICAgICAgICAgIGExID0gcGxvYWQ8UGFja2V0PihBMSk7CisgICAgICAgIGlmKFJLPT00KQorICAgICAgICB7CisgICAgICAgICAgYTIgPSBwbG9hZDxQYWNrZXQ+KEEyKTsKKyAgICAgICAgICBhMyA9IHBsb2FkPFBhY2tldD4oQTMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIHdvcmthcm91bmQgIm1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiIgd2FybmluZworICAgICAgICAgIGEyID0gYTMgPSBhMDsKKyAgICAgICAgfQorICAgICAgICAKKyNkZWZpbmUgS01BREQoYywgYSwgYiwgdG1wKSB7dG1wID0gYjsgdG1wID0gcG11bChhLHRtcCk7IGMgPSBwYWRkKGMsdG1wKTt9CisjZGVmaW5lIFdPUksoSSkgIFwKKyAgICAgICAgICAgICAgICAgICAgIGMwID0gcGxvYWQ8UGFja2V0PihDMCtpKyhJKSpQYWNrZXRTaXplKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgYzEgPSBwbG9hZDxQYWNrZXQ+KEMxK2krKEkpKlBhY2tldFNpemUpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICBLTUFERChjMCwgYTAsIGIwMCwgdDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEtNQUREKGMxLCBhMCwgYjAxLCB0MSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYTAgPSBwbG9hZDxQYWNrZXQ+KEEwK2krKEkrMSkqUGFja2V0U2l6ZSk7ICBcCisgICAgICAgICAgICAgICAgICAgICBLTUFERChjMCwgYTEsIGIxMCwgdDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEtNQUREKGMxLCBhMSwgYjExLCB0MSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgYTEgPSBwbG9hZDxQYWNrZXQ+KEExK2krKEkrMSkqUGFja2V0U2l6ZSk7ICBcCisgICAgICAgICAgaWYoUks9PTQpeyBLTUFERChjMCwgYTIsIGIyMCwgdDApICAgICAgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICBpZihSSz09NCl7IEtNQUREKGMxLCBhMiwgYjIxLCB0MSkgICAgICAgICAgICAgICAgICAgICB9XAorICAgICAgICAgIGlmKFJLPT00KXsgYTIgPSBwbG9hZDxQYWNrZXQ+KEEyK2krKEkrMSkqUGFja2V0U2l6ZSk7IH1cCisgICAgICAgICAgaWYoUks9PTQpeyBLTUFERChjMCwgYTMsIGIzMCwgdDApICAgICAgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICBpZihSSz09NCl7IEtNQUREKGMxLCBhMywgYjMxLCB0MSkgICAgICAgICAgICAgICAgICAgICB9XAorICAgICAgICAgIGlmKFJLPT00KXsgYTMgPSBwbG9hZDxQYWNrZXQ+KEEzK2krKEkrMSkqUGFja2V0U2l6ZSk7IH1cCisgICAgICAgICAgICAgICAgICAgICBwc3RvcmUoQzAraSsoSSkqUGFja2V0U2l6ZSwgYzApOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHBzdG9yZShDMStpKyhJKSpQYWNrZXRTaXplLCBjMSkKKyAgICAgICAgCisgICAgICAgIC8vIHByb2Nlc3Mgcm93cyBvZiBBJyAtIEMnIHdpdGggYWdncmVzc2l2ZSB2ZWN0b3JpemF0aW9uIGFuZCBwZWVsaW5nIAorICAgICAgICBmb3IoSW5kZXggaT0wOyBpPGFjdHVhbF9iX2VuZDE7IGkrPVBhY2tldFNpemUqOCkKKyAgICAgICAgeworICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJTUEFSU0VMVV9HRU1NTF9LRVJORUwxIik7CisgICAgICAgICAgICAgICAgICAgIHByZWZldGNoKChBMCtpKyg1KSpQYWNrZXRTaXplKSk7CisgICAgICAgICAgICAgICAgICAgIHByZWZldGNoKChBMStpKyg1KSpQYWNrZXRTaXplKSk7CisgICAgICAgICAgaWYoUks9PTQpIHByZWZldGNoKChBMitpKyg1KSpQYWNrZXRTaXplKSk7CisgICAgICAgICAgaWYoUks9PTQpIHByZWZldGNoKChBMytpKyg1KSpQYWNrZXRTaXplKSk7CisKKyAgICAgICAgICBXT1JLKDApOworICAgICAgICAgIFdPUksoMSk7CisgICAgICAgICAgV09SSygyKTsKKyAgICAgICAgICBXT1JLKDMpOworICAgICAgICAgIFdPUksoNCk7CisgICAgICAgICAgV09SSyg1KTsKKyAgICAgICAgICBXT1JLKDYpOworICAgICAgICAgIFdPUksoNyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3Mgd2l0aCB2ZWN0b3JpemF0aW9uIG9ubHkKKyAgICAgICAgZm9yKEluZGV4IGk9YWN0dWFsX2JfZW5kMTsgaTxhY3R1YWxfYl9lbmQyOyBpKz1QYWNrZXRTaXplKQorICAgICAgICB7CisgICAgICAgICAgV09SSygwKTsKKyAgICAgICAgfQorI3VuZGVmIFdPUksKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3Mgd2l0aG91dCB2ZWN0b3JpemF0aW9uCisgICAgICAgIGZvcihJbmRleCBpPWFjdHVhbF9iX2VuZDI7IGk8YWN0dWFsX2I7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGlmKFJLPT00KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEMwW2ldICs9IEEwW2ldKkJjMFswXStBMVtpXSpCYzBbMV0rQTJbaV0qQmMwWzJdK0EzW2ldKkJjMFszXTsKKyAgICAgICAgICAgIEMxW2ldICs9IEEwW2ldKkJjMVswXStBMVtpXSpCYzFbMV0rQTJbaV0qQmMxWzJdK0EzW2ldKkJjMVszXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEMwW2ldICs9IEEwW2ldKkJjMFswXStBMVtpXSpCYzBbMV07CisgICAgICAgICAgICBDMVtpXSArPSBBMFtpXSpCYzFbMF0rQTFbaV0qQmMxWzFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQmMwICs9IFJLOworICAgICAgICBCYzEgKz0gUks7CisgICAgICB9IC8vIHBlZWxlZCBsb29wIG9uIGsKKyAgICB9IC8vIHBlZWxlZCBsb29wIG9uIHRoZSBjb2x1bW5zIGoKKyAgICAvLyBwcm9jZXNzIHRoZSBsYXN0IGNvbHVtbiAod2Ugbm93IHBlcmZvcm0gYSBtYXRyaXgtdmVjdG9yIHByb2R1Y3QpCisgICAgaWYoKG4tbl9lbmQpPjApCisgICAgeworICAgICAgY29uc3QgU2NhbGFyKiBCYzAgPSBCKyhuLTEpKmxkYjsKKyAgICAgIAorICAgICAgZm9yKEluZGV4IGs9MDsgazxkX2VuZDsgays9UkspCisgICAgICB7CisgICAgICAgIAorICAgICAgICAvLyBsb2FkIGFuZCBleHBhbmQgYSAxIHggUksgYmxvY2sgb2YgQgorICAgICAgICBQYWNrZXQgYjAwLCBiMTAsIGIyMCwgYjMwOworICAgICAgICAgICAgICAgICAgYjAwID0gcHNldDE8UGFja2V0PihCYzBbMF0pOworICAgICAgICAgICAgICAgICAgYjEwID0gcHNldDE8UGFja2V0PihCYzBbMV0pOworICAgICAgICBpZihSSz09NCkgYjIwID0gcHNldDE8UGFja2V0PihCYzBbMl0pOworICAgICAgICBpZihSSz09NCkgYjMwID0gcHNldDE8UGFja2V0PihCYzBbM10pOworICAgICAgICAKKyAgICAgICAgUGFja2V0IGEwLCBhMSwgYTIsIGEzLCBjMCwgdDAvKiwgdDEqLzsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IFNjYWxhciogQTAgPSBBK2liKyhrKzApKmxkYTsKKyAgICAgICAgY29uc3QgU2NhbGFyKiBBMSA9IEEraWIrKGsrMSkqbGRhOworICAgICAgICBjb25zdCBTY2FsYXIqIEEyID0gQStpYisoaysyKSpsZGE7CisgICAgICAgIGNvbnN0IFNjYWxhciogQTMgPSBBK2liKyhrKzMpKmxkYTsKKyAgICAgICAgCisgICAgICAgIFNjYWxhciogQzAgPSBDK2liKyhuX2VuZCkqbGRjOworICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGEwID0gcGxvYWQ8UGFja2V0PihBMCk7CisgICAgICAgICAgICAgICAgICBhMSA9IHBsb2FkPFBhY2tldD4oQTEpOworICAgICAgICBpZihSSz09NCkKKyAgICAgICAgeworICAgICAgICAgIGEyID0gcGxvYWQ8UGFja2V0PihBMik7CisgICAgICAgICAgYTMgPSBwbG9hZDxQYWNrZXQ+KEEzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyB3b3JrYXJvdW5kICJtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24iIHdhcm5pbmcKKyAgICAgICAgICBhMiA9IGEzID0gYTA7CisgICAgICAgIH0KKyAgICAgICAgCisjZGVmaW5lIFdPUksoSSkgXAorICAgICAgICAgICAgICAgICAgIGMwID0gcGxvYWQ8UGFja2V0PihDMCtpKyhJKSpQYWNrZXRTaXplKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICBLTUFERChjMCwgYTAsIGIwMCwgdDApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgYTAgPSBwbG9hZDxQYWNrZXQ+KEEwK2krKEkrMSkqUGFja2V0U2l6ZSk7ICAgXAorICAgICAgICAgICAgICAgICAgIEtNQUREKGMwLCBhMSwgYjEwLCB0MCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBhMSA9IHBsb2FkPFBhY2tldD4oQTEraSsoSSsxKSpQYWNrZXRTaXplKTsgICBcCisgICAgICAgIGlmKFJLPT00KXsgS01BREQoYzAsIGEyLCBiMjAsIHQwKSAgICAgICAgICAgICAgICAgICAgICB9XAorICAgICAgICBpZihSSz09NCl7IGEyID0gcGxvYWQ8UGFja2V0PihBMitpKyhJKzEpKlBhY2tldFNpemUpOyAgfVwKKyAgICAgICAgaWYoUks9PTQpeyBLTUFERChjMCwgYTMsIGIzMCwgdDApICAgICAgICAgICAgICAgICAgICAgIH1cCisgICAgICAgIGlmKFJLPT00KXsgYTMgPSBwbG9hZDxQYWNrZXQ+KEEzK2krKEkrMSkqUGFja2V0U2l6ZSk7ICB9XAorICAgICAgICAgICAgICAgICAgIHBzdG9yZShDMCtpKyhJKSpQYWNrZXRTaXplLCBjMCk7CisgICAgICAgIAorICAgICAgICAvLyBhZ3Jlc3NpdmUgdmVjdG9yaXphdGlvbiBhbmQgcGVlbGluZworICAgICAgICBmb3IoSW5kZXggaT0wOyBpPGFjdHVhbF9iX2VuZDE7IGkrPVBhY2tldFNpemUqOCkKKyAgICAgICAgeworICAgICAgICAgIEVJR0VOX0FTTV9DT01NRU5UKCJTUEFSU0VMVV9HRU1NTF9LRVJORUwyIik7CisgICAgICAgICAgV09SSygwKTsKKyAgICAgICAgICBXT1JLKDEpOworICAgICAgICAgIFdPUksoMik7CisgICAgICAgICAgV09SSygzKTsKKyAgICAgICAgICBXT1JLKDQpOworICAgICAgICAgIFdPUksoNSk7CisgICAgICAgICAgV09SSyg2KTsKKyAgICAgICAgICBXT1JLKDcpOworICAgICAgICB9CisgICAgICAgIC8vIHZlY3Rvcml6YXRpb24gb25seQorICAgICAgICBmb3IoSW5kZXggaT1hY3R1YWxfYl9lbmQxOyBpPGFjdHVhbF9iX2VuZDI7IGkrPVBhY2tldFNpemUpCisgICAgICAgIHsKKyAgICAgICAgICBXT1JLKDApOworICAgICAgICB9CisgICAgICAgIC8vIHJlbWFpbmluZyBzY2FsYXJzCisgICAgICAgIGZvcihJbmRleCBpPWFjdHVhbF9iX2VuZDI7IGk8YWN0dWFsX2I7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGlmKFJLPT00KSAKKyAgICAgICAgICAgIEMwW2ldICs9IEEwW2ldKkJjMFswXStBMVtpXSpCYzBbMV0rQTJbaV0qQmMwWzJdK0EzW2ldKkJjMFszXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBDMFtpXSArPSBBMFtpXSpCYzBbMF0rQTFbaV0qQmMwWzFdOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBCYzAgKz0gUks7CisjdW5kZWYgV09SSworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBwcm9jZXNzIHRoZSBsYXN0IGNvbHVtbnMgb2YgQSwgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCByb3dzIG9mIEIKKyAgICBJbmRleCByZCA9IGQtZF9lbmQ7CisgICAgaWYocmQ+MCkKKyAgICB7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG47ICsraikKKyAgICAgIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgQWxpZ25tZW50ID0gUGFja2V0U2l6ZT4xID8gQWxpZ25lZCA6IDAKKyAgICAgICAgfTsKKyAgICAgICAgdHlwZWRlZiBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+LCBBbGlnbm1lbnQgPiBNYXBWZWN0b3I7CisgICAgICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiwgQWxpZ25tZW50ID4gQ29uc3RNYXBWZWN0b3I7CisgICAgICAgIGlmKHJkPT0xKSAgICAgICBNYXBWZWN0b3IoQytqKmxkYytpYixhY3R1YWxfYikgKz0gQlswK2RfZW5kK2oqbGRiXSAqIENvbnN0TWFwVmVjdG9yKEErKGRfZW5kKzApKmxkYStpYiwgYWN0dWFsX2IpOworICAgICAgICAKKyAgICAgICAgZWxzZSBpZihyZD09MikgIE1hcFZlY3RvcihDK2oqbGRjK2liLGFjdHVhbF9iKSArPSBCWzArZF9lbmQraipsZGJdICogQ29uc3RNYXBWZWN0b3IoQSsoZF9lbmQrMCkqbGRhK2liLCBhY3R1YWxfYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCWzErZF9lbmQraipsZGJdICogQ29uc3RNYXBWZWN0b3IoQSsoZF9lbmQrMSkqbGRhK2liLCBhY3R1YWxfYik7CisgICAgICAgIAorICAgICAgICBlbHNlICAgICAgICAgICAgTWFwVmVjdG9yKEMraipsZGMraWIsYWN0dWFsX2IpICs9IEJbMCtkX2VuZCtqKmxkYl0gKiBDb25zdE1hcFZlY3RvcihBKyhkX2VuZCswKSpsZGEraWIsIGFjdHVhbF9iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJbMStkX2VuZCtqKmxkYl0gKiBDb25zdE1hcFZlY3RvcihBKyhkX2VuZCsxKSpsZGEraWIsIGFjdHVhbF9iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJbMitkX2VuZCtqKmxkYl0gKiBDb25zdE1hcFZlY3RvcihBKyhkX2VuZCsyKSpsZGEraWIsIGFjdHVhbF9iKTsKKyAgICAgIH0KKyAgICB9CisgIAorICB9IC8vIGJsb2NraW5nIG9uIHRoZSByb3dzIG9mIEEgYW5kIEMKK30KKyN1bmRlZiBLTUFERAorCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFTFVfR0VNTV9LRVJORUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2hlYXBfcmVsYXhfc25vZGUuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9oZWFwX3JlbGF4X3Nub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3NWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9oZWFwX3JlbGF4X3Nub2RlLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBoZWFwX3JlbGF4X3Nub2RlLmMgZmlsZSBpbiBTdXBlckxVCisgKiAtLSBTdXBlckxVIHJvdXRpbmUgKHZlcnNpb24gMy4wKSAtLQorICogVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgWGVyb3ggUGFsbyBBbHRvIFJlc2VhcmNoIENlbnRlciwKKyAqIGFuZCBMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWIuCisgKiBPY3RvYmVyIDE1LCAyMDAzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IGJ5IFhlcm94IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcworICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdAorICogdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKworI2lmbmRlZiBTUEFSU0VMVV9IRUFQX1JFTEFYX1NOT0RFX0gKKyNkZWZpbmUgU1BBUlNFTFVfSEVBUF9SRUxBWF9TTk9ERV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogCisgKiBcYnJpZWYgSWRlbnRpZnkgdGhlIGluaXRpYWwgcmVsYXhlZCBzdXBlcm5vZGVzCisgKiAKKyAqIFRoaXMgcm91dGluZSBhcHBsaWVkIHRvIGEgc3ltbWV0cmljIGVsaW1pbmF0aW9uIHRyZWUuIAorICogSXQgYXNzdW1lcyB0aGF0IHRoZSBtYXRyaXggaGFzIGJlZW4gcmVvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgcG9zdG9yZGVyIG9mIHRoZSBldHJlZQorICogXHBhcmFtIG4gVGhlIG51bWJlciBvZiBjb2x1bW5zCisgKiBccGFyYW0gZXQgZWxpbWluYXRpb24gdHJlZSAKKyAqIFxwYXJhbSByZWxheF9jb2x1bW5zIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgYWxsb3dlZCBpbiBhIHJlbGF4ZWQgc25vZGUgCisgKiBccGFyYW0gZGVzY2VuZGFudHMgTnVtYmVyIG9mIGRlc2NlbmRhbnRzIG9mIGVhY2ggbm9kZSBpbiB0aGUgZXRyZWUKKyAqIFxwYXJhbSByZWxheF9lbmQgbGFzdCBjb2x1bW4gaW4gYSBzdXBlcm5vZGUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4Pgordm9pZCBTcGFyc2VMVUltcGw8U2NhbGFyLFN0b3JhZ2VJbmRleD46OmhlYXBfcmVsYXhfc25vZGUgKGNvbnN0IEluZGV4IG4sIEluZGV4VmVjdG9yJiBldCwgY29uc3QgSW5kZXggcmVsYXhfY29sdW1ucywgSW5kZXhWZWN0b3ImIGRlc2NlbmRhbnRzLCBJbmRleFZlY3RvciYgcmVsYXhfZW5kKQoreworICAKKyAgLy8gVGhlIGV0cmVlIG1heSBub3QgYmUgcG9zdG9yZGVyZWQsIGJ1dCBpdHMgaGVhcCBvcmRlcmVkICAKKyAgSW5kZXhWZWN0b3IgcG9zdDsKKyAgaW50ZXJuYWw6OnRyZWVQb3N0b3JkZXIoU3RvcmFnZUluZGV4KG4pLCBldCwgcG9zdCk7IC8vIFBvc3Qgb3JkZXIgZXRyZWUKKyAgSW5kZXhWZWN0b3IgaW52X3Bvc3QobisxKTsgCisgIGZvciAoU3RvcmFnZUluZGV4IGkgPSAwOyBpIDwgbisxOyArK2kpIGludl9wb3N0KHBvc3QoaSkpID0gaTsgLy8gaW52X3Bvc3QgPSBwb3N0LmludmVyc2UoKT8/PworICAKKyAgLy8gUmVudW1iZXIgZXRyZWUgaW4gcG9zdG9yZGVyIAorICBJbmRleFZlY3RvciBpd29yayhuKTsKKyAgSW5kZXhWZWN0b3IgZXRfc2F2ZShuKzEpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbjsgKytpKQorICB7CisgICAgaXdvcmsocG9zdChpKSkgPSBwb3N0KGV0KGkpKTsKKyAgfQorICBldF9zYXZlID0gZXQ7IC8vIFNhdmUgdGhlIG9yaWdpbmFsIGV0cmVlCisgIGV0ID0gaXdvcms7IAorICAKKyAgLy8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRlc2NlbmRhbnRzIG9mIGVhY2ggbm9kZSBpbiB0aGUgZXRyZWUKKyAgcmVsYXhfZW5kLnNldENvbnN0YW50KGVtcHR5SWR4TFUpOworICBJbmRleCBqLCBwYXJlbnQ7IAorICBkZXNjZW5kYW50cy5zZXRaZXJvKCk7CisgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIAorICB7CisgICAgcGFyZW50ID0gZXQoaik7CisgICAgaWYgKHBhcmVudCAhPSBuKSAvLyBub3QgdGhlIGR1bW15IHJvb3QKKyAgICAgIGRlc2NlbmRhbnRzKHBhcmVudCkgKz0gZGVzY2VuZGFudHMoaikgKyAxOworICB9CisgIC8vIElkZW50aWZ5IHRoZSByZWxheGVkIHN1cGVybm9kZXMgYnkgcG9zdG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZXRyZWUKKyAgSW5kZXggc25vZGVfc3RhcnQ7IC8vIGJlZ2lubmluZyBvZiBhIHNub2RlIAorICBTdG9yYWdlSW5kZXggazsKKyAgSW5kZXggbnN1cGVyX2V0X3Bvc3QgPSAwOyAvLyBOdW1iZXIgb2YgcmVsYXhlZCBzbm9kZXMgaW4gcG9zdG9yZGVyZWQgZXRyZWUgCisgIEluZGV4IG5zdXBlcl9ldCA9IDA7IC8vIE51bWJlciBvZiByZWxheGVkIHNub2RlcyBpbiB0aGUgb3JpZ2luYWwgZXRyZWUgCisgIFN0b3JhZ2VJbmRleCBsOyAKKyAgZm9yIChqID0gMDsgaiA8IG47ICkKKyAgeworICAgIHBhcmVudCA9IGV0KGopOworICAgIHNub2RlX3N0YXJ0ID0gajsgCisgICAgd2hpbGUgKCBwYXJlbnQgIT0gbiAmJiBkZXNjZW5kYW50cyhwYXJlbnQpIDwgcmVsYXhfY29sdW1ucyApIAorICAgIHsKKyAgICAgIGogPSBwYXJlbnQ7IAorICAgICAgcGFyZW50ID0gZXQoaik7CisgICAgfQorICAgIC8vIEZvdW5kIGEgc3VwZXJub2RlIGluIHBvc3RvcmRlcmVkIGV0cmVlLCBqIGlzIHRoZSBsYXN0IGNvbHVtbiAKKyAgICArK25zdXBlcl9ldF9wb3N0OworICAgIGsgPSBTdG9yYWdlSW5kZXgobik7CisgICAgZm9yIChJbmRleCBpID0gc25vZGVfc3RhcnQ7IGkgPD0gajsgKytpKQorICAgICAgayA9IChzdGQ6Om1pbikoaywgaW52X3Bvc3QoaSkpOworICAgIGwgPSBpbnZfcG9zdChqKTsKKyAgICBpZiAoIChsIC0gaykgPT0gKGogLSBzbm9kZV9zdGFydCkgKSAgLy8gU2FtZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgc25vZGUKKyAgICB7CisgICAgICAvLyBUaGlzIGlzIGFsc28gYSBzdXBlcm5vZGUgaW4gdGhlIG9yaWdpbmFsIGV0cmVlCisgICAgICByZWxheF9lbmQoaykgPSBsOyAvLyBSZWNvcmQgbGFzdCBjb2x1bW4gCisgICAgICArK25zdXBlcl9ldDsgCisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgZm9yIChJbmRleCBpID0gc25vZGVfc3RhcnQ7IGkgPD0gajsgKytpKSAKKyAgICAgIHsKKyAgICAgICAgbCA9IGludl9wb3N0KGkpOworICAgICAgICBpZiAoZGVzY2VuZGFudHMoaSkgPT0gMCkgCisgICAgICAgIHsKKyAgICAgICAgICByZWxheF9lbmQobCkgPSBsOworICAgICAgICAgICsrbnN1cGVyX2V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGorKzsKKyAgICAvLyBTZWFyY2ggZm9yIGEgbmV3IGxlYWYKKyAgICB3aGlsZSAoZGVzY2VuZGFudHMoaikgIT0gMCAmJiBqIDwgbikgaisrOworICB9IC8vIEVuZCBwb3N0b3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBldHJlZQorICAKKyAgLy8gUmVjb3ZlciB0aGUgb3JpZ2luYWwgZXRyZWUKKyAgZXQgPSBldF9zYXZlOyAKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorI2VuZGlmIC8vIFNQQVJTRUxVX0hFQVBfUkVMQVhfU05PREVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2tlcm5lbF9ibW9kLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfa2VybmVsX2Jtb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFiM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX2tlcm5lbF9ibW9kLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBTUEFSU0VMVV9LRVJORUxfQk1PRF9ICisjZGVmaW5lIFNQQVJTRUxVX0tFUk5FTF9CTU9EX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGUgPGludCBTZWdTaXplQXRDb21waWxlVGltZT4gc3RydWN0IExVX2tlcm5lbF9ibW9kCit7CisgIC8qKiBcaW50ZXJuYWwKKyAgICAqIFxicmllZiBQZXJmb3JtcyBudW1lcmljIGJsb2NrIHVwZGF0ZXMgZnJvbSBhIGdpdmVuIHN1cGVybm9kZSB0byBhIHNpbmdsZSBjb2x1bW4KKyAgICAqCisgICAgKiBccGFyYW0gc2Vnc2l6ZSBTaXplIG9mIHRoZSBzZWdtZW50IChhbmQgYmxvY2tzICkgdG8gdXNlIGZvciB1cGRhdGVzCisgICAgKiBccGFyYW1baW4sb3V0XSBkZW5zZSBQYWNrZWQgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgKKyAgICAqIFxwYXJhbSB0ZW1wdiB0ZW1wb3JhcnkgdmVjdG9yIHRvIHVzZSBmb3IgdXBkYXRlcworICAgICogXHBhcmFtIGx1c3VwIGFycmF5IGNvbnRhaW5pbmcgdGhlIHN1cGVybm9kZXMKKyAgICAqIFxwYXJhbSBsZGEgTGVhZGluZyBkaW1lbnNpb24gaW4gdGhlIHN1cGVybm9kZQorICAgICogXHBhcmFtIG5yb3cgTnVtYmVyIG9mIHJvd3MgaW4gdGhlIHJlY3Rhbmd1bGFyIHBhcnQgb2YgdGhlIHN1cGVybm9kZQorICAgICogXHBhcmFtIGxzdWIgY29tcHJlc3NlZCByb3cgc3Vic2NyaXB0cyBvZiBzdXBlcm5vZGVzCisgICAgKiBccGFyYW0gbHB0ciBwb2ludGVyIHRvIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlIGN1cnJlbnQgc3VwZXJub2RlIGluIGxzdWIKKyAgICAqIFxwYXJhbSBub196ZXJvcyBOdW1iZXIgb2Ygbm9uemVyb3MgZWxlbWVudHMgYmVmb3JlIHRoZSBkaWFnb25hbCBwYXJ0IG9mIHRoZSBzdXBlcm5vZGUKKyAgICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tTY2FsYXJWZWN0b3IsIHR5cGVuYW1lIFNjYWxhclZlY3RvciwgdHlwZW5hbWUgSW5kZXhWZWN0b3I+CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihjb25zdCBJbmRleCBzZWdzaXplLCBCbG9ja1NjYWxhclZlY3RvciYgZGVuc2UsIFNjYWxhclZlY3RvciYgdGVtcHYsIFNjYWxhclZlY3RvciYgbHVzdXAsIEluZGV4JiBsdXB0ciwgY29uc3QgSW5kZXggbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbnJvdywgSW5kZXhWZWN0b3ImIGxzdWIsIGNvbnN0IEluZGV4IGxwdHIsIGNvbnN0IEluZGV4IG5vX3plcm9zKTsKK307CisKK3RlbXBsYXRlIDxpbnQgU2VnU2l6ZUF0Q29tcGlsZVRpbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tTY2FsYXJWZWN0b3IsIHR5cGVuYW1lIFNjYWxhclZlY3RvciwgdHlwZW5hbWUgSW5kZXhWZWN0b3I+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIExVX2tlcm5lbF9ibW9kPFNlZ1NpemVBdENvbXBpbGVUaW1lPjo6cnVuKGNvbnN0IEluZGV4IHNlZ3NpemUsIEJsb2NrU2NhbGFyVmVjdG9yJiBkZW5zZSwgU2NhbGFyVmVjdG9yJiB0ZW1wdiwgU2NhbGFyVmVjdG9yJiBsdXN1cCwgSW5kZXgmIGx1cHRyLCBjb25zdCBJbmRleCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBucm93LCBJbmRleFZlY3RvciYgbHN1YiwgY29uc3QgSW5kZXggbHB0ciwgY29uc3QgSW5kZXggbm9femVyb3MpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyVmVjdG9yOjpTY2FsYXIgU2NhbGFyOworICAvLyBGaXJzdCwgY29weSBVWyosal0gc2VnbWVudCBmcm9tIGRlbnNlKCopIHRvIHRlbXB2KCopCisgIC8vIFRoZSByZXN1bHQgb2YgdHJpYW5ndWxhciBzb2x2ZSBpcyBpbiB0ZW1wdlsqXTsgCisgICAgLy8gVGhlIHJlc3VsdCBvZiBtYXRyaWMtdmVjdG9yIHVwZGF0ZSBpcyBpbiBkZW5zZVsqXQorICBJbmRleCBpc3ViID0gbHB0ciArIG5vX3plcm9zOyAKKyAgSW5kZXggaTsKKyAgSW5kZXggaXJvdzsKKyAgZm9yIChpID0gMDsgaSA8ICgoU2VnU2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMpP3NlZ3NpemU6U2VnU2l6ZUF0Q29tcGlsZVRpbWUpOyBpKyspCisgIHsKKyAgICBpcm93ID0gbHN1Yihpc3ViKTsgCisgICAgdGVtcHYoaSkgPSBkZW5zZShpcm93KTsgCisgICAgKytpc3ViOyAKKyAgfQorICAvLyBEZW5zZSB0cmlhbmd1bGFyIHNvbHZlIC0tIHN0YXJ0IGVmZmVjdGl2ZSB0cmlhbmdsZQorICBsdXB0ciArPSBsZGEgKiBub196ZXJvcyArIG5vX3plcm9zOyAKKyAgLy8gRm9ybSBFaWdlbiBtYXRyaXggYW5kIHZlY3RvciAKKyAgTWFwPE1hdHJpeDxTY2FsYXIsU2VnU2l6ZUF0Q29tcGlsZVRpbWUsU2VnU2l6ZUF0Q29tcGlsZVRpbWUsIENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IEEoICYobHVzdXAuZGF0YSgpW2x1cHRyXSksIHNlZ3NpemUsIHNlZ3NpemUsIE91dGVyU3RyaWRlPD4obGRhKSApOworICBNYXA8TWF0cml4PFNjYWxhcixTZWdTaXplQXRDb21waWxlVGltZSwxPiA+IHUodGVtcHYuZGF0YSgpLCBzZWdzaXplKTsKKyAgCisgIHUgPSBBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS5zb2x2ZSh1KTsgCisgIAorICAvLyBEZW5zZSBtYXRyaXgtdmVjdG9yIHByb2R1Y3QgeSA8LS0gQip4IAorICBsdXB0ciArPSBzZWdzaXplOworICBjb25zdCBJbmRleCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKKyAgSW5kZXggbGRsID0gaW50ZXJuYWw6OmZpcnN0X211bHRpcGxlKG5yb3csIFBhY2tldFNpemUpOworICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLFNlZ1NpemVBdENvbXBpbGVUaW1lLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBCKCAmKGx1c3VwLmRhdGEoKVtsdXB0cl0pLCBucm93LCBzZWdzaXplLCBPdXRlclN0cmlkZTw+KGxkYSkgKTsKKyAgSW5kZXggYWxpZ25lZF9vZmZzZXQgPSBpbnRlcm5hbDo6Zmlyc3RfZGVmYXVsdF9hbGlnbmVkKHRlbXB2LmRhdGEoKStzZWdzaXplLCBQYWNrZXRTaXplKTsKKyAgSW5kZXggYWxpZ25lZF93aXRoX0Jfb2Zmc2V0ID0gKFBhY2tldFNpemUtaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZChCLmRhdGEoKSwgUGFja2V0U2l6ZSkpJVBhY2tldFNpemU7CisgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4sIDAsIE91dGVyU3RyaWRlPD4gPiBsKHRlbXB2LmRhdGEoKStzZWdzaXplK2FsaWduZWRfb2Zmc2V0K2FsaWduZWRfd2l0aF9CX29mZnNldCwgbnJvdywgT3V0ZXJTdHJpZGU8PihsZGwpICk7CisgIAorICBsLnNldFplcm8oKTsKKyAgaW50ZXJuYWw6OnNwYXJzZWx1X2dlbW08U2NhbGFyPihsLnJvd3MoKSwgbC5jb2xzKCksIEIuY29scygpLCBCLmRhdGEoKSwgQi5vdXRlclN0cmlkZSgpLCB1LmRhdGEoKSwgdS5vdXRlclN0cmlkZSgpLCBsLmRhdGEoKSwgbC5vdXRlclN0cmlkZSgpKTsKKyAgCisgIC8vIFNjYXR0ZXIgdGVtcHZbXSBpbnRvIFNQQSBkZW5zZVtdIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgCisgIGlzdWIgPSBscHRyICsgbm9femVyb3M7CisgIGZvciAoaSA9IDA7IGkgPCAoKFNlZ1NpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljKT9zZWdzaXplOlNlZ1NpemVBdENvbXBpbGVUaW1lKTsgaSsrKQorICB7CisgICAgaXJvdyA9IGxzdWIoaXN1YisrKTsgCisgICAgZGVuc2UoaXJvdykgPSB0ZW1wdihpKTsKKyAgfQorICAKKyAgLy8gU2NhdHRlciBsIGludG8gU1BBIGRlbnNlW10KKyAgZm9yIChpID0gMDsgaSA8IG5yb3c7IGkrKykKKyAgeworICAgIGlyb3cgPSBsc3ViKGlzdWIrKyk7IAorICAgIGRlbnNlKGlyb3cpIC09IGwoaSk7CisgIH0gCit9CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBMVV9rZXJuZWxfYm1vZDwxPgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tTY2FsYXJWZWN0b3IsIHR5cGVuYW1lIFNjYWxhclZlY3RvciwgdHlwZW5hbWUgSW5kZXhWZWN0b3I+CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihjb25zdCBJbmRleCAvKnNlZ3NpemUqLywgQmxvY2tTY2FsYXJWZWN0b3ImIGRlbnNlLCBTY2FsYXJWZWN0b3ImIC8qdGVtcHYqLywgU2NhbGFyVmVjdG9yJiBsdXN1cCwgSW5kZXgmIGx1cHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbGRhLCBjb25zdCBJbmRleCBucm93LCBJbmRleFZlY3RvciYgbHN1YiwgY29uc3QgSW5kZXggbHB0ciwgY29uc3QgSW5kZXggbm9femVyb3MpOworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tTY2FsYXJWZWN0b3IsIHR5cGVuYW1lIFNjYWxhclZlY3RvciwgdHlwZW5hbWUgSW5kZXhWZWN0b3I+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIExVX2tlcm5lbF9ibW9kPDE+OjpydW4oY29uc3QgSW5kZXggLypzZWdzaXplKi8sIEJsb2NrU2NhbGFyVmVjdG9yJiBkZW5zZSwgU2NhbGFyVmVjdG9yJiAvKnRlbXB2Ki8sIFNjYWxhclZlY3RvciYgbHVzdXAsIEluZGV4JiBsdXB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBsZGEsIGNvbnN0IEluZGV4IG5yb3csIEluZGV4VmVjdG9yJiBsc3ViLCBjb25zdCBJbmRleCBscHRyLCBjb25zdCBJbmRleCBub196ZXJvcykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJWZWN0b3I6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW5kZXhWZWN0b3I6OlNjYWxhciBTdG9yYWdlSW5kZXg7CisgIFNjYWxhciBmID0gZGVuc2UobHN1YihscHRyICsgbm9femVyb3MpKTsKKyAgbHVwdHIgKz0gbGRhICogbm9femVyb3MgKyBub196ZXJvcyArIDE7CisgIGNvbnN0IFNjYWxhciogYShsdXN1cC5kYXRhKCkgKyBsdXB0cik7CisgIGNvbnN0IFN0b3JhZ2VJbmRleCogIGlyb3cobHN1Yi5kYXRhKCkrbHB0ciArIG5vX3plcm9zICsgMSk7CisgIEluZGV4IGkgPSAwOworICBmb3IgKDsgaSsxIDwgbnJvdzsgaSs9MikKKyAgeworICAgIEluZGV4IGkwID0gKihpcm93KyspOworICAgIEluZGV4IGkxID0gKihpcm93KyspOworICAgIFNjYWxhciBhMCA9ICooYSsrKTsKKyAgICBTY2FsYXIgYTEgPSAqKGErKyk7CisgICAgU2NhbGFyIGQwID0gZGVuc2UuY29lZmYoaTApOworICAgIFNjYWxhciBkMSA9IGRlbnNlLmNvZWZmKGkxKTsKKyAgICBkMCAtPSBmKmEwOworICAgIGQxIC09IGYqYTE7CisgICAgZGVuc2UuY29lZmZSZWYoaTApID0gZDA7CisgICAgZGVuc2UuY29lZmZSZWYoaTEpID0gZDE7CisgIH0KKyAgaWYoaTxucm93KQorICAgIGRlbnNlLmNvZWZmUmVmKCooaXJvdysrKSkgLT0gZiAqICooYSsrKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorI2VuZGlmIC8vIFNQQVJTRUxVX0tFUk5FTF9CTU9EX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9wYW5lbF9ibW9kLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcGFuZWxfYm1vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmNmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcGFuZWxfYm1vZC5oCkBAIC0wLDAgKzEsMjIzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIAorIAorICogTk9URTogVGhpcyBmaWxlIGlzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIG9mIFtzLGQsYyx6XXBhbmVsX2Jtb2QuYyBmaWxlIGluIFN1cGVyTFUgCisgCisgKiAtLSBTdXBlckxVIHJvdXRpbmUgKHZlcnNpb24gMy4wKSAtLQorICogVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgWGVyb3ggUGFsbyBBbHRvIFJlc2VhcmNoIENlbnRlciwKKyAqIGFuZCBMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWIuCisgKiBPY3RvYmVyIDE1LCAyMDAzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IGJ5IFhlcm94IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcworICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdAorICogdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKyNpZm5kZWYgU1BBUlNFTFVfUEFORUxfQk1PRF9ICisjZGVmaW5lIFNQQVJTRUxVX1BBTkVMX0JNT0RfSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqCisgKiBcYnJpZWYgUGVyZm9ybXMgbnVtZXJpYyBibG9jayB1cGRhdGVzIChzdXAtcGFuZWwpIGluIHRvcG9sb2dpY2FsIG9yZGVyLgorICogCisgKiBCZWZvcmUgZW50ZXJpbmcgdGhpcyByb3V0aW5lLCB0aGUgb3JpZ2luYWwgbm9uemVyb3MgaW4gdGhlIHBhbmVsCisgKiB3ZXJlIGFscmVhZHkgY29waWVkIGkgbnRvIHRoZSBzcGFbbSx3XQorICogCisgKiBccGFyYW0gbSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbWF0cml4CisgKiBccGFyYW0gdyBQYW5lbCBzaXplCisgKiBccGFyYW0gamNvbCBTdGFydGluZyAgY29sdW1uIG9mIHRoZSBwYW5lbAorICogXHBhcmFtIG5zZWcgTnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBVIHBhcnQKKyAqIFxwYXJhbSBkZW5zZSBTdG9yZSB0aGUgZnVsbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFuZWwgCisgKiBccGFyYW0gdGVtcHYgd29ya2luZyBhcnJheSAKKyAqIFxwYXJhbSBzZWdyZXAgc2VnbWVudCByZXByZXNlbnRhdGl2ZS4uLiBmaXJzdCByb3cgaW4gdGhlIHNlZ21lbnQKKyAqIFxwYXJhbSByZXBmbnogRmlyc3Qgbm9uemVybyByb3dzCisgKiBccGFyYW0gZ2x1IEdsb2JhbCBMVSBkYXRhLiAKKyAqIAorICogCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3ZvaWQgU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjpwYW5lbF9ibW9kKGNvbnN0IEluZGV4IG0sIGNvbnN0IEluZGV4IHcsIGNvbnN0IEluZGV4IGpjb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBuc2VnLCBTY2FsYXJWZWN0b3ImIGRlbnNlLCBTY2FsYXJWZWN0b3ImIHRlbXB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFZlY3RvciYgc2VncmVwLCBJbmRleFZlY3RvciYgcmVwZm56LCBHbG9iYWxMVV90JiBnbHUpCit7CisgIAorICBJbmRleCBrc3ViLGpqLG5leHRsX2NvbDsgCisgIEluZGV4IGZzdXBjLCBuc3VwYywgbnN1cHIsIG5yb3c7IAorICBJbmRleCBrcmVwLCBrZm56OyAKKyAgSW5kZXggbHB0cjsgLy8gcG9pbnRzIHRvIHRoZSByb3cgc3Vic2NyaXB0cyBvZiBhIHN1cGVybm9kZSAKKyAgSW5kZXggbHVwdHI7IC8vIC4uLgorICBJbmRleCBzZWdzaXplLG5vX3plcm9zIDsgCisgIC8vIEZvciBlYWNoIG5vbnogc3VwZXJub2RlIHNlZ21lbnQgb2YgVVsqLGpdIGluIHRvcG9sb2dpY2FsIG9yZGVyCisgIEluZGV4IGsgPSBuc2VnIC0gMTsgCisgIGNvbnN0IEluZGV4IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICAKKyAgZm9yIChrc3ViID0gMDsga3N1YiA8IG5zZWc7IGtzdWIrKykKKyAgeyAvLyBGb3IgZWFjaCB1cGRhdGluZyBzdXBlcm5vZGUKKyAgICAvKiBrcmVwID0gcmVwcmVzZW50YXRpdmUgb2YgY3VycmVudCBrLXRoIHN1cGVybm9kZQorICAgICAqIGZzdXBjID0gIGZpcnN0IHN1cGVybm9kYWwgY29sdW1uCisgICAgICogbnN1cGMgPSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHN1cGVybm9kZQorICAgICAqIG5zdXByID0gbnVtYmVyIG9mIHJvd3MgaW4gYSBzdXBlcm5vZGUKKyAgICAgKi8KKyAgICBrcmVwID0gc2VncmVwKGspOyBrLS07IAorICAgIGZzdXBjID0gZ2x1LnhzdXAoZ2x1LnN1cG5vKGtyZXApKTsgCisgICAgbnN1cGMgPSBrcmVwIC0gZnN1cGMgKyAxOyAKKyAgICBuc3VwciA9IGdsdS54bHN1Yihmc3VwYysxKSAtIGdsdS54bHN1Yihmc3VwYyk7IAorICAgIG5yb3cgPSBuc3VwciAtIG5zdXBjOyAKKyAgICBscHRyID0gZ2x1Lnhsc3ViKGZzdXBjKTsgCisgICAgCisgICAgLy8gbG9vcCBvdmVyIHRoZSBwYW5lbCBjb2x1bW5zIHRvIGRldGVjdCB0aGUgYWN0dWFsIG51bWJlciBvZiBjb2x1bW5zIGFuZCByb3dzCisgICAgSW5kZXggdV9yb3dzID0gMDsKKyAgICBJbmRleCB1X2NvbHMgPSAwOworICAgIGZvciAoamogPSBqY29sOyBqaiA8IGpjb2wgKyB3OyBqaisrKQorICAgIHsKKyAgICAgIG5leHRsX2NvbCA9IChqai1qY29sKSAqIG07IAorICAgICAgVmVjdG9yQmxvY2s8SW5kZXhWZWN0b3I+IHJlcGZuel9jb2wocmVwZm56LCBuZXh0bF9jb2wsIG0pOyAvLyBGaXJzdCBub256ZXJvIGNvbHVtbiBpbmRleCBmb3IgZWFjaCByb3cKKyAgICAgIAorICAgICAga2ZueiA9IHJlcGZuel9jb2woa3JlcCk7IAorICAgICAgaWYgKCBrZm56ID09IGVtcHR5SWR4TFUgKSAKKyAgICAgICAgY29udGludWU7IC8vIHNraXAgYW55IHplcm8gc2VnbWVudAorICAgICAgCisgICAgICBzZWdzaXplID0ga3JlcCAtIGtmbnogKyAxOworICAgICAgdV9jb2xzKys7CisgICAgICB1X3Jvd3MgPSAoc3RkOjptYXgpKHNlZ3NpemUsdV9yb3dzKTsKKyAgICB9CisgICAgCisgICAgaWYobnN1cGMgPj0gMikKKyAgICB7IAorICAgICAgSW5kZXggbGR1ID0gaW50ZXJuYWw6OmZpcnN0X211bHRpcGxlPEluZGV4Pih1X3Jvd3MsIFBhY2tldFNpemUpOworICAgICAgTWFwPFNjYWxhck1hdHJpeCwgQWxpZ25lZCwgIE91dGVyU3RyaWRlPD4gPiBVKHRlbXB2LmRhdGEoKSwgdV9yb3dzLCB1X2NvbHMsIE91dGVyU3RyaWRlPD4obGR1KSk7CisgICAgICAKKyAgICAgIC8vIGdhdGhlciBVCisgICAgICBJbmRleCB1X2NvbCA9IDA7CisgICAgICBmb3IgKGpqID0gamNvbDsgamogPCBqY29sICsgdzsgamorKykKKyAgICAgIHsKKyAgICAgICAgbmV4dGxfY29sID0gKGpqLWpjb2wpICogbTsgCisgICAgICAgIFZlY3RvckJsb2NrPEluZGV4VmVjdG9yPiByZXBmbnpfY29sKHJlcGZueiwgbmV4dGxfY29sLCBtKTsgLy8gRmlyc3Qgbm9uemVybyBjb2x1bW4gaW5kZXggZm9yIGVhY2ggcm93CisgICAgICAgIFZlY3RvckJsb2NrPFNjYWxhclZlY3Rvcj4gZGVuc2VfY29sKGRlbnNlLCBuZXh0bF9jb2wsIG0pOyAvLyBTY2F0dGVyL2dhdGhlciBlbnRpcmUgbWF0cml4IGNvbHVtbiBmcm9tL3RvIGhlcmUKKyAgICAgICAgCisgICAgICAgIGtmbnogPSByZXBmbnpfY29sKGtyZXApOyAKKyAgICAgICAgaWYgKCBrZm56ID09IGVtcHR5SWR4TFUgKSAKKyAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBhbnkgemVybyBzZWdtZW50CisgICAgICAgIAorICAgICAgICBzZWdzaXplID0ga3JlcCAtIGtmbnogKyAxOworICAgICAgICBsdXB0ciA9IGdsdS54bHVzdXAoZnN1cGMpOyAgICAKKyAgICAgICAgbm9femVyb3MgPSBrZm56IC0gZnN1cGM7IAorICAgICAgICAKKyAgICAgICAgSW5kZXggaXN1YiA9IGxwdHIgKyBub196ZXJvczsKKyAgICAgICAgSW5kZXggb2ZmID0gdV9yb3dzLXNlZ3NpemU7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBvZmY7IGkrKykgVShpLHVfY29sKSA9IDA7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzZWdzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBpcm93ID0gZ2x1LmxzdWIoaXN1Yik7IAorICAgICAgICAgIFUoaStvZmYsdV9jb2wpID0gZGVuc2VfY29sKGlyb3cpOyAKKyAgICAgICAgICArK2lzdWI7IAorICAgICAgICB9CisgICAgICAgIHVfY29sKys7CisgICAgICB9CisgICAgICAvLyBzb2x2ZSBVID0gQV4tMSBVCisgICAgICBsdXB0ciA9IGdsdS54bHVzdXAoZnN1cGMpOworICAgICAgSW5kZXggbGRhID0gZ2x1LnhsdXN1cChmc3VwYysxKSAtIGdsdS54bHVzdXAoZnN1cGMpOworICAgICAgbm9femVyb3MgPSAoa3JlcCAtIHVfcm93cyArIDEpIC0gZnN1cGM7CisgICAgICBsdXB0ciArPSBsZGEgKiBub196ZXJvcyArIG5vX3plcm9zOworICAgICAgTWFwcGVkTWF0cml4QmxvY2sgQShnbHUubHVzdXAuZGF0YSgpK2x1cHRyLCB1X3Jvd3MsIHVfcm93cywgT3V0ZXJTdHJpZGU8PihsZGEpICk7CisgICAgICBVID0gQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkuc29sdmUoVSk7CisgICAgICAKKyAgICAgIC8vIHVwZGF0ZQorICAgICAgbHVwdHIgKz0gdV9yb3dzOworICAgICAgTWFwcGVkTWF0cml4QmxvY2sgQihnbHUubHVzdXAuZGF0YSgpK2x1cHRyLCBucm93LCB1X3Jvd3MsIE91dGVyU3RyaWRlPD4obGRhKSApOworICAgICAgZWlnZW5fYXNzZXJ0KHRlbXB2LnNpemUoKT53KmxkdSArIG5yb3cqdyArIDEpOworICAgICAgCisgICAgICBJbmRleCBsZGwgPSBpbnRlcm5hbDo6Zmlyc3RfbXVsdGlwbGU8SW5kZXg+KG5yb3csIFBhY2tldFNpemUpOworICAgICAgSW5kZXggb2Zmc2V0ID0gKFBhY2tldFNpemUtaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZChCLmRhdGEoKSwgUGFja2V0U2l6ZSkpICUgUGFja2V0U2l6ZTsKKyAgICAgIE1hcHBlZE1hdHJpeEJsb2NrIEwodGVtcHYuZGF0YSgpK3cqbGR1K29mZnNldCwgbnJvdywgdV9jb2xzLCBPdXRlclN0cmlkZTw+KGxkbCkpOworICAgICAgCisgICAgICBMLnNldFplcm8oKTsKKyAgICAgIGludGVybmFsOjpzcGFyc2VsdV9nZW1tPFNjYWxhcj4oTC5yb3dzKCksIEwuY29scygpLCBCLmNvbHMoKSwgQi5kYXRhKCksIEIub3V0ZXJTdHJpZGUoKSwgVS5kYXRhKCksIFUub3V0ZXJTdHJpZGUoKSwgTC5kYXRhKCksIEwub3V0ZXJTdHJpZGUoKSk7CisgICAgICAKKyAgICAgIC8vIHNjYXR0ZXIgVSBhbmQgTAorICAgICAgdV9jb2wgPSAwOworICAgICAgZm9yIChqaiA9IGpjb2w7IGpqIDwgamNvbCArIHc7IGpqKyspCisgICAgICB7CisgICAgICAgIG5leHRsX2NvbCA9IChqai1qY29sKSAqIG07IAorICAgICAgICBWZWN0b3JCbG9jazxJbmRleFZlY3Rvcj4gcmVwZm56X2NvbChyZXBmbnosIG5leHRsX2NvbCwgbSk7IC8vIEZpcnN0IG5vbnplcm8gY29sdW1uIGluZGV4IGZvciBlYWNoIHJvdworICAgICAgICBWZWN0b3JCbG9jazxTY2FsYXJWZWN0b3I+IGRlbnNlX2NvbChkZW5zZSwgbmV4dGxfY29sLCBtKTsgLy8gU2NhdHRlci9nYXRoZXIgZW50aXJlIG1hdHJpeCBjb2x1bW4gZnJvbS90byBoZXJlCisgICAgICAgIAorICAgICAgICBrZm56ID0gcmVwZm56X2NvbChrcmVwKTsgCisgICAgICAgIGlmICgga2ZueiA9PSBlbXB0eUlkeExVICkgCisgICAgICAgICAgY29udGludWU7IC8vIHNraXAgYW55IHplcm8gc2VnbWVudAorICAgICAgICAKKyAgICAgICAgc2Vnc2l6ZSA9IGtyZXAgLSBrZm56ICsgMTsKKyAgICAgICAgbm9femVyb3MgPSBrZm56IC0gZnN1cGM7IAorICAgICAgICBJbmRleCBpc3ViID0gbHB0ciArIG5vX3plcm9zOworICAgICAgICAKKyAgICAgICAgSW5kZXggb2ZmID0gdV9yb3dzLXNlZ3NpemU7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzZWdzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBpcm93ID0gZ2x1LmxzdWIoaXN1YisrKTsgCisgICAgICAgICAgZGVuc2VfY29sKGlyb3cpID0gVS5jb2VmZihpK29mZix1X2NvbCk7CisgICAgICAgICAgVS5jb2VmZlJlZihpK29mZix1X2NvbCkgPSAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTY2F0dGVyIGwgaW50byBTUEEgZGVuc2VbXQorICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbnJvdzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggaXJvdyA9IGdsdS5sc3ViKGlzdWIrKyk7IAorICAgICAgICAgIGRlbnNlX2NvbChpcm93KSAtPSBMLmNvZWZmKGksdV9jb2wpOworICAgICAgICAgIEwuY29lZmZSZWYoaSx1X2NvbCkgPSAwOworICAgICAgICB9CisgICAgICAgIHVfY29sKys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gbGV2ZWwgMiBvbmx5CisgICAgeworICAgICAgLy8gU2VxdWVuY2UgdGhyb3VnaCBlYWNoIGNvbHVtbiBpbiB0aGUgcGFuZWwKKyAgICAgIGZvciAoamogPSBqY29sOyBqaiA8IGpjb2wgKyB3OyBqaisrKQorICAgICAgeworICAgICAgICBuZXh0bF9jb2wgPSAoamotamNvbCkgKiBtOyAKKyAgICAgICAgVmVjdG9yQmxvY2s8SW5kZXhWZWN0b3I+IHJlcGZuel9jb2wocmVwZm56LCBuZXh0bF9jb2wsIG0pOyAvLyBGaXJzdCBub256ZXJvIGNvbHVtbiBpbmRleCBmb3IgZWFjaCByb3cKKyAgICAgICAgVmVjdG9yQmxvY2s8U2NhbGFyVmVjdG9yPiBkZW5zZV9jb2woZGVuc2UsIG5leHRsX2NvbCwgbSk7IC8vIFNjYXR0ZXIvZ2F0aGVyIGVudGlyZSBtYXRyaXggY29sdW1uIGZyb20vdG8gaGVyZQorICAgICAgICAKKyAgICAgICAga2ZueiA9IHJlcGZuel9jb2woa3JlcCk7IAorICAgICAgICBpZiAoIGtmbnogPT0gZW1wdHlJZHhMVSApIAorICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGFueSB6ZXJvIHNlZ21lbnQKKyAgICAgICAgCisgICAgICAgIHNlZ3NpemUgPSBrcmVwIC0ga2ZueiArIDE7CisgICAgICAgIGx1cHRyID0gZ2x1LnhsdXN1cChmc3VwYyk7CisgICAgICAgIAorICAgICAgICBJbmRleCBsZGEgPSBnbHUueGx1c3VwKGZzdXBjKzEpLWdsdS54bHVzdXAoZnN1cGMpOy8vIG5zdXByCisgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgdHJpYW5nbGFyIHNvbHZlIGFuZCBibG9jayB1cGRhdGUsIAorICAgICAgICAvLyB0aGVuIHNjYXR0ZXIgdGhlIHJlc3VsdCBvZiBzdXAtY29sIHVwZGF0ZSB0byBkZW5zZVtdCisgICAgICAgIG5vX3plcm9zID0ga2ZueiAtIGZzdXBjOyAKKyAgICAgICAgICAgICAgaWYoc2Vnc2l6ZT09MSkgIExVX2tlcm5lbF9ibW9kPDE+OjpydW4oc2Vnc2l6ZSwgZGVuc2VfY29sLCB0ZW1wdiwgZ2x1Lmx1c3VwLCBsdXB0ciwgbGRhLCBucm93LCBnbHUubHN1YiwgbHB0ciwgbm9femVyb3MpOworICAgICAgICBlbHNlICBpZihzZWdzaXplPT0yKSAgTFVfa2VybmVsX2Jtb2Q8Mj46OnJ1bihzZWdzaXplLCBkZW5zZV9jb2wsIHRlbXB2LCBnbHUubHVzdXAsIGx1cHRyLCBsZGEsIG5yb3csIGdsdS5sc3ViLCBscHRyLCBub196ZXJvcyk7CisgICAgICAgIGVsc2UgIGlmKHNlZ3NpemU9PTMpICBMVV9rZXJuZWxfYm1vZDwzPjo6cnVuKHNlZ3NpemUsIGRlbnNlX2NvbCwgdGVtcHYsIGdsdS5sdXN1cCwgbHVwdHIsIGxkYSwgbnJvdywgZ2x1LmxzdWIsIGxwdHIsIG5vX3plcm9zKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIExVX2tlcm5lbF9ibW9kPER5bmFtaWM+OjpydW4oc2Vnc2l6ZSwgZGVuc2VfY29sLCB0ZW1wdiwgZ2x1Lmx1c3VwLCBsdXB0ciwgbGRhLCBucm93LCBnbHUubHN1YiwgbHB0ciwgbm9femVyb3MpOyAKKyAgICAgIH0gLy8gRW5kIGZvciBlYWNoIGNvbHVtbiBpbiB0aGUgcGFuZWwgCisgICAgfQorICAgIAorICB9IC8vIEVuZCBmb3IgZWFjaCB1cGRhdGluZyBzdXBlcm5vZGUKK30gLy8gZW5kIHBhbmVsIGJtb2QKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gU1BBUlNFTFVfUEFORUxfQk1PRF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcGFuZWxfZGZzLmggYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcGFuZWxfZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1ZGY3MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9wYW5lbF9kZnMuaApAQCAtMCwwICsxLDI1OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiAKKyAKKyAqIE5PVEU6IFRoaXMgZmlsZSBpcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBvZiBbcyxkLGMsel1wYW5lbF9kZnMuYyBmaWxlIGluIFN1cGVyTFUgCisgCisgKiAtLSBTdXBlckxVIHJvdXRpbmUgKHZlcnNpb24gMi4wKSAtLQorICogVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgWGVyb3ggUGFsbyBBbHRvIFJlc2VhcmNoIENlbnRlciwKKyAqIGFuZCBMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWIuCisgKiBOb3ZlbWJlciAxNSwgMTk5NworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBieSBYZXJveCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVEhJUyBNQVRFUklBTCBJUyBQUk9WSURFRCBBUyBJUywgV0lUSCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRC4gIEFOWSBVU0UgSVMgQVQgWU9VUiBPV04gUklTSy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSBvciBjb3B5IHRoaXMgcHJvZ3JhbSBmb3IgYW55CisgKiBwdXJwb3NlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQKKyAqIHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisjaWZuZGVmIFNQQVJTRUxVX1BBTkVMX0RGU19ICisjZGVmaW5lIFNQQVJTRUxVX1BBTkVMX0RGU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhWZWN0b3I+CitzdHJ1Y3QgcGFuZWxfZGZzX3RyYWl0cworeworICB0eXBlZGVmIHR5cGVuYW1lIEluZGV4VmVjdG9yOjpTY2FsYXIgU3RvcmFnZUluZGV4OworICBwYW5lbF9kZnNfdHJhaXRzKEluZGV4IGpjb2wsIFN0b3JhZ2VJbmRleCogbWFya2VyKQorICAgIDogbV9qY29sKGpjb2wpLCBtX21hcmtlcihtYXJrZXIpCisgIHt9CisgIGJvb2wgdXBkYXRlX3NlZ3JlcChJbmRleCBrcmVwLCBTdG9yYWdlSW5kZXggamopCisgIHsKKyAgICBpZihtX21hcmtlcltrcmVwXTxtX2pjb2wpCisgICAgeworICAgICAgbV9tYXJrZXJba3JlcF0gPSBqajsgCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHZvaWQgbWVtX2V4cGFuZChJbmRleFZlY3RvciYgLypnbHUubHN1YiovLCBJbmRleCAvKm5leHRsKi8sIEluZGV4IC8qY2htYXJrKi8pIHt9CisgIGVudW0geyBFeHBhbmRNZW0gPSBmYWxzZSB9OworICBJbmRleCBtX2pjb2w7CisgIFN0b3JhZ2VJbmRleCogbV9tYXJrZXI7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIFNwYXJzZUxVSW1wbDxTY2FsYXIsU3RvcmFnZUluZGV4Pjo6ZGZzX2tlcm5lbChjb25zdCBTdG9yYWdlSW5kZXggamosIEluZGV4VmVjdG9yJiBwZXJtX3IsCisgICAgICAgICAgICAgICAgICAgSW5kZXgmIG5zZWcsIEluZGV4VmVjdG9yJiBwYW5lbF9sc3ViLCBJbmRleFZlY3RvciYgc2VncmVwLAorICAgICAgICAgICAgICAgICAgIFJlZjxJbmRleFZlY3Rvcj4gcmVwZm56X2NvbCwgSW5kZXhWZWN0b3ImIHhwcnVuZSwgUmVmPEluZGV4VmVjdG9yPiBtYXJrZXIsIEluZGV4VmVjdG9yJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgSW5kZXhWZWN0b3ImIHhwbG9yZSwgR2xvYmFsTFVfdCYgZ2x1LAorICAgICAgICAgICAgICAgICAgIEluZGV4JiBuZXh0bF9jb2wsIEluZGV4IGtyb3csIFRyYWl0cyYgdHJhaXRzCisgICAgICAgICAgICAgICAgICApCit7CisgIAorICBTdG9yYWdlSW5kZXgga21hcmsgPSBtYXJrZXIoa3Jvdyk7CisgICAgICAKKyAgLy8gRm9yIGVhY2ggdW5tYXJrZWQga3JvdyBvZiBqagorICBtYXJrZXIoa3JvdykgPSBqajsgCisgIFN0b3JhZ2VJbmRleCBrcGVybSA9IHBlcm1fcihrcm93KTsgCisgIGlmIChrcGVybSA9PSBlbXB0eUlkeExVICkgeworICAgIC8vIGtyb3cgaXMgaW4gTCA6IHBsYWNlIGl0IGluIHN0cnVjdHVyZSBvZiBMKCosIGpqKQorICAgIHBhbmVsX2xzdWIobmV4dGxfY29sKyspID0gU3RvcmFnZUluZGV4KGtyb3cpOyAgLy8ga3JvdyBpcyBpbmRleGVkIGludG8gQQorICAgIAorICAgIHRyYWl0cy5tZW1fZXhwYW5kKHBhbmVsX2xzdWIsIG5leHRsX2NvbCwga21hcmspOworICB9CisgIGVsc2UgCisgIHsKKyAgICAvLyBrcm93IGlzIGluIFUgOiBpZiBpdHMgc3VwZXJub2RlLXJlcHJlc2VudGF0aXZlIGtyZXAKKyAgICAvLyBoYXMgYmVlbiBleHBsb3JlZCwgdXBkYXRlIHJlcGZueigqKQorICAgIC8vIGtyZXAgPSBzdXBlcm5vZGUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIGN1cnJlbnQgcm93CisgICAgU3RvcmFnZUluZGV4IGtyZXAgPSBnbHUueHN1cChnbHUuc3Vwbm8oa3Blcm0pKzEpIC0gMTsgCisgICAgLy8gRmlyc3Qgbm9uemVybyBlbGVtZW50IGluIHRoZSBjdXJyZW50IGNvbHVtbjoKKyAgICBTdG9yYWdlSW5kZXggbXlmbnogPSByZXBmbnpfY29sKGtyZXApOyAKKyAgICAKKyAgICBpZiAobXlmbnogIT0gZW1wdHlJZHhMVSApCisgICAgeworICAgICAgLy8gUmVwcmVzZW50YXRpdmUgdmlzaXRlZCBiZWZvcmUKKyAgICAgIGlmIChteWZueiA+IGtwZXJtICkgcmVwZm56X2NvbChrcmVwKSA9IGtwZXJtOyAKKyAgICAgIAorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIC8vIE90aGVyd2lzZSwgcGVyZm9ybSBkZnMgc3RhcnRpbmcgYXQga3JlcAorICAgICAgU3RvcmFnZUluZGV4IG9sZHJlcCA9IGVtcHR5SWR4TFU7IAorICAgICAgcGFyZW50KGtyZXApID0gb2xkcmVwOyAKKyAgICAgIHJlcGZuel9jb2woa3JlcCkgPSBrcGVybTsgCisgICAgICBTdG9yYWdlSW5kZXggeGRmcyA9ICBnbHUueGxzdWIoa3JlcCk7IAorICAgICAgSW5kZXggbWF4ZGZzID0geHBydW5lKGtyZXApOyAKKyAgICAgIAorICAgICAgU3RvcmFnZUluZGV4IGtwYXI7CisgICAgICBkbyAKKyAgICAgIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdW5tYXJrZWQga2NoaWxkIG9mIGtyZXAKKyAgICAgICAgd2hpbGUgKHhkZnMgPCBtYXhkZnMpIAorICAgICAgICB7CisgICAgICAgICAgU3RvcmFnZUluZGV4IGtjaGlsZCA9IGdsdS5sc3ViKHhkZnMpOyAKKyAgICAgICAgICB4ZGZzKys7IAorICAgICAgICAgIFN0b3JhZ2VJbmRleCBjaG1hcmsgPSBtYXJrZXIoa2NoaWxkKTsgCisgICAgICAgICAgCisgICAgICAgICAgaWYgKGNobWFyayAhPSBqaiApIAorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hcmtlcihrY2hpbGQpID0gamo7IAorICAgICAgICAgICAgU3RvcmFnZUluZGV4IGNocGVybSA9IHBlcm1fcihrY2hpbGQpOyAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNocGVybSA9PSBlbXB0eUlkeExVKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gY2FzZSBrY2hpbGQgaXMgaW4gTDogcGxhY2UgaXQgaW4gTCgqLCBqKQorICAgICAgICAgICAgICBwYW5lbF9sc3ViKG5leHRsX2NvbCsrKSA9IGtjaGlsZDsKKyAgICAgICAgICAgICAgdHJhaXRzLm1lbV9leHBhbmQocGFuZWxfbHN1YiwgbmV4dGxfY29sLCBjaG1hcmspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBjYXNlIGtjaGlsZCBpcyBpbiBVIDoKKyAgICAgICAgICAgICAgLy8gY2hyZXAgPSBpdHMgc3VwZXJub2RlLXJlcC4gSWYgaXRzIHJlcCBoYXMgYmVlbiBleHBsb3JlZCwgCisgICAgICAgICAgICAgIC8vIHVwZGF0ZSBpdHMgcmVwZm56KCopCisgICAgICAgICAgICAgIFN0b3JhZ2VJbmRleCBjaHJlcCA9IGdsdS54c3VwKGdsdS5zdXBubyhjaHBlcm0pKzEpIC0gMTsgCisgICAgICAgICAgICAgIG15Zm56ID0gcmVwZm56X2NvbChjaHJlcCk7IAorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKG15Zm56ICE9IGVtcHR5SWR4TFUpIAorICAgICAgICAgICAgICB7IC8vIFZpc2l0ZWQgYmVmb3JlIAorICAgICAgICAgICAgICAgIGlmIChteWZueiA+IGNocGVybSkgCisgICAgICAgICAgICAgICAgICByZXBmbnpfY29sKGNocmVwKSA9IGNocGVybTsgCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgeyAvLyBDb250LiBkZnMgYXQgc25vZGUtcmVwIG9mIGtjaGlsZAorICAgICAgICAgICAgICAgIHhwbG9yZShrcmVwKSA9IHhkZnM7IAorICAgICAgICAgICAgICAgIG9sZHJlcCA9IGtyZXA7IAorICAgICAgICAgICAgICAgIGtyZXAgPSBjaHJlcDsgLy8gR28gZGVlcGVyIGRvd24gRyhMKQorICAgICAgICAgICAgICAgIHBhcmVudChrcmVwKSA9IG9sZHJlcDsgCisgICAgICAgICAgICAgICAgcmVwZm56X2NvbChrcmVwKSA9IGNocGVybTsgCisgICAgICAgICAgICAgICAgeGRmcyA9IGdsdS54bHN1YihrcmVwKTsgCisgICAgICAgICAgICAgICAgbWF4ZGZzID0geHBydW5lKGtyZXApOyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgbXlmbnogIT0gLTEKKyAgICAgICAgICAgIH0gLy8gZW5kIGlmIGNocGVybSA9PSAtMSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9IC8vIGVuZCBpZiBjaG1hcmsgIT1qagorICAgICAgICB9IC8vIGVuZCB3aGlsZSB4ZGZzIDwgbWF4ZGZzCisgICAgICAgIAorICAgICAgICAvLyBrcm93IGhhcyBubyBtb3JlIHVuZXhwbG9yZWQgbmJycyA6CisgICAgICAgIC8vICAgIFBsYWNlIHNub2RlLXJlcCBrcmVwIGluIHBvc3RvcmRlciBERlMsIGlmIHRoaXMgCisgICAgICAgIC8vICAgIHNlZ21lbnQgaXMgc2VlbiBmb3IgdGhlIGZpcnN0IHRpbWUuIChOb3RlIHRoYXQgCisgICAgICAgIC8vICAgICJyZXBmbnooa3JlcCkiIG1heSBjaGFuZ2UgbGF0ZXIuKQorICAgICAgICAvLyAgICBCYWt0cmFjayBkZnMgdG8gaXRzIHBhcmVudAorICAgICAgICBpZih0cmFpdHMudXBkYXRlX3NlZ3JlcChrcmVwLGpqKSkKKyAgICAgICAgLy9pZiAobWFya2VyMShrcmVwKSA8IGpjb2wgKQorICAgICAgICB7CisgICAgICAgICAgc2VncmVwKG5zZWcpID0ga3JlcDsgCisgICAgICAgICAgKytuc2VnOyAKKyAgICAgICAgICAvL21hcmtlcjEoa3JlcCkgPSBqajsgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGtwYXIgPSBwYXJlbnQoa3JlcCk7IC8vIFBvcCByZWN1cnNpb24sIG1pbWljIHJlY3Vyc2lvbiAKKyAgICAgICAgaWYgKGtwYXIgPT0gZW1wdHlJZHhMVSkgCisgICAgICAgICAgYnJlYWs7IC8vIGRmcyBkb25lIAorICAgICAgICBrcmVwID0ga3BhcjsgCisgICAgICAgIHhkZnMgPSB4cGxvcmUoa3JlcCk7IAorICAgICAgICBtYXhkZnMgPSB4cHJ1bmUoa3JlcCk7IAorCisgICAgICB9IHdoaWxlIChrcGFyICE9IGVtcHR5SWR4TFUpOyAvLyBEbyB1bnRpbCBlbXB0eSBzdGFjayAKKyAgICAgIAorICAgIH0gLy8gZW5kIGlmIChteWZueiA9IC0xKQorCisgIH0gLy8gZW5kIGlmIChrcGVybSA9PSAtMSkgICAKK30KKworLyoqCisgKiBcYnJpZWYgUGVyZm9ybXMgYSBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIG9uIGEgcGFuZWwgb2YgY29sdW1ucyBbamNvbCwgamNvbCt3KQorICogCisgKiBBIHN1cGVybm9kZSByZXByZXNlbnRhdGl2ZSBpcyB0aGUgbGFzdCBjb2x1bW4gb2YgYSBzdXBlcm5vZGUuCisgKiBUaGUgbm9uemVyb3MgaW4gVVsqLGpdIGFyZSBzZWdtZW50cyB0aGF0IGVuZCBhdCBzdXBlcm5vZGVzIHJlcHJlc2VudGF0aXZlcworICogCisgKiBUaGUgcm91dGluZSByZXR1cm5zIGEgbGlzdCBvZiB0aGUgc3VwZXJub2RhbCByZXByZXNlbnRhdGl2ZXMgCisgKiBpbiB0b3BvbG9naWNhbCBvcmRlciBvZiB0aGUgZGZzIHRoYXQgZ2VuZXJhdGVzIHRoZW0uIFRoaXMgbGlzdCBpcyAKKyAqIGEgc3VwZXJzZXQgb2YgdGhlIHRvcG9sb2dpY2FsIG9yZGVyIG9mIGVhY2ggaW5kaXZpZHVhbCBjb2x1bW4gd2l0aGluIAorICogdGhlIHBhbmVsLgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBub256ZXJvIGluIGVhY2ggc3VwZXJub2RhbCBzZWdtZW50IAorICogKHN1cGVybm9kYWwgZW50cnkgbG9jYXRpb24pIGlzIGFsc28gcmV0dXJuZWQuIEVhY2ggY29sdW1uIGhhcyAKKyAqIGEgc2VwYXJhdGUgbGlzdCBmb3IgdGhpcyBwdXJwb3NlLiAKKyAqIAorICogVHdvIG1hcmtlcnMgYXJyYXlzIGFyZSB1c2VkIGZvciBkZnMgOgorICogICAgbWFya2VyW2ldID09IGpqLCBpZiBpIHdhcyB2aXNpdGVkIGR1cmluZyBkZnMgb2YgY3VycmVudCBjb2x1bW4gamo7CisgKiAgICBtYXJrZXIxW2ldID49IGpjb2wsIGlmIGkgd2FzIHZpc2l0ZWQgYnkgZWFybGllciBjb2x1bW5zIGluIHRoaXMgcGFuZWw7IAorICogCisgKiBccGFyYW1baW5dIG0gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeAorICogXHBhcmFtW2luXSB3IFBhbmVsIHNpemUKKyAqIFxwYXJhbVtpbl0gamNvbCBTdGFydGluZyAgY29sdW1uIG9mIHRoZSBwYW5lbAorICogXHBhcmFtW2luXSBBIElucHV0IG1hdHJpeCBpbiBjb2x1bW4tbWFqb3Igc3RvcmFnZQorICogXHBhcmFtW2luXSBwZXJtX3IgUm93IHBlcm11dGF0aW9uCisgKiBccGFyYW1bb3V0XSBuc2VnIE51bWJlciBvZiBVIHNlZ21lbnRzCisgKiBccGFyYW1bb3V0XSBkZW5zZSBBY2N1bXVsYXRlIHRoZSBjb2x1bW4gdmVjdG9ycyBvZiB0aGUgcGFuZWwKKyAqIFxwYXJhbVtvdXRdIHBhbmVsX2xzdWIgU3Vic2NyaXB0cyBvZiB0aGUgcm93IGluIHRoZSBwYW5lbCAKKyAqIFxwYXJhbVtvdXRdIHNlZ3JlcCBTZWdtZW50IHJlcHJlc2VudGF0aXZlIGkuZSBmaXJzdCBub256ZXJvIHJvdyBvZiBlYWNoIHNlZ21lbnQKKyAqIFxwYXJhbVtvdXRdIHJlcGZueiBGaXJzdCBub256ZXJvIGxvY2F0aW9uIGluIGVhY2ggcm93CisgKiBccGFyYW1bb3V0XSB4cHJ1bmUgVGhlIHBydW5lZCBlbGltaW5hdGlvbiB0cmVlCisgKiBccGFyYW1bb3V0XSBtYXJrZXIgd29yayB2ZWN0b3IKKyAqIFxwYXJhbSAgcGFyZW50IFRoZSBlbGltaW5hdGlvbiB0cmVlCisgKiBccGFyYW0geHBsb3JlIHdvcmsgdmVjdG9yCisgKiBccGFyYW0gZ2x1IFRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUKKyAqIAorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3ZvaWQgU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjpwYW5lbF9kZnMoY29uc3QgSW5kZXggbSwgY29uc3QgSW5kZXggdywgY29uc3QgSW5kZXggamNvbCwgTWF0cml4VHlwZSYgQSwgSW5kZXhWZWN0b3ImIHBlcm1fciwgSW5kZXgmIG5zZWcsIFNjYWxhclZlY3RvciYgZGVuc2UsIEluZGV4VmVjdG9yJiBwYW5lbF9sc3ViLCBJbmRleFZlY3RvciYgc2VncmVwLCBJbmRleFZlY3RvciYgcmVwZm56LCBJbmRleFZlY3RvciYgeHBydW5lLCBJbmRleFZlY3RvciYgbWFya2VyLCBJbmRleFZlY3RvciYgcGFyZW50LCBJbmRleFZlY3RvciYgeHBsb3JlLCBHbG9iYWxMVV90JiBnbHUpCit7CisgIEluZGV4IG5leHRsX2NvbDsgLy8gTmV4dCBhdmFpbGFibGUgcG9zaXRpb24gaW4gcGFuZWxfbHN1YlsqLGpqXSAKKyAgCisgIC8vIEluaXRpYWxpemUgcG9pbnRlcnMgCisgIFZlY3RvckJsb2NrPEluZGV4VmVjdG9yPiBtYXJrZXIxKG1hcmtlciwgbSwgbSk7IAorICBuc2VnID0gMDsgCisgIAorICBwYW5lbF9kZnNfdHJhaXRzPEluZGV4VmVjdG9yPiB0cmFpdHMoamNvbCwgbWFya2VyMS5kYXRhKCkpOworICAKKyAgLy8gRm9yIGVhY2ggY29sdW1uIGluIHRoZSBwYW5lbCAKKyAgZm9yIChTdG9yYWdlSW5kZXggamogPSBTdG9yYWdlSW5kZXgoamNvbCk7IGpqIDwgamNvbCArIHc7IGpqKyspIAorICB7CisgICAgbmV4dGxfY29sID0gKGpqIC0gamNvbCkgKiBtOyAKKyAgICAKKyAgICBWZWN0b3JCbG9jazxJbmRleFZlY3Rvcj4gcmVwZm56X2NvbChyZXBmbnosIG5leHRsX2NvbCwgbSk7IC8vIEZpcnN0IG5vbnplcm8gbG9jYXRpb24gaW4gZWFjaCByb3cKKyAgICBWZWN0b3JCbG9jazxTY2FsYXJWZWN0b3I+IGRlbnNlX2NvbChkZW5zZSxuZXh0bF9jb2wsIG0pOyAvLyBBY2N1bXVsYXRlIGEgY29sdW1uIHZlY3RvciBoZXJlCisgICAgCisgICAgCisgICAgLy8gRm9yIGVhY2ggbm56IGluIEFbKiwgampdIGRvIGRlcHRoIGZpcnN0IHNlYXJjaAorICAgIGZvciAodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChBLCBqaik7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIEluZGV4IGtyb3cgPSBpdC5yb3coKTsgCisgICAgICBkZW5zZV9jb2woa3JvdykgPSBpdC52YWx1ZSgpOworICAgICAgCisgICAgICBTdG9yYWdlSW5kZXgga21hcmsgPSBtYXJrZXIoa3Jvdyk7IAorICAgICAgaWYgKGttYXJrID09IGpqKSAKKyAgICAgICAgY29udGludWU7IC8vIGtyb3cgdmlzaXRlZCBiZWZvcmUsIGdvIHRvIHRoZSBuZXh0IG5vbnplcm8KKyAgICAgIAorICAgICAgZGZzX2tlcm5lbChqaiwgcGVybV9yLCBuc2VnLCBwYW5lbF9sc3ViLCBzZWdyZXAsIHJlcGZuel9jb2wsIHhwcnVuZSwgbWFya2VyLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgeHBsb3JlLCBnbHUsIG5leHRsX2NvbCwga3JvdywgdHJhaXRzKTsKKyAgICB9Ly8gZW5kIGZvciBub256ZXJvcyBpbiBjb2x1bW4gamoKKyAgICAKKyAgfSAvLyBlbmQgZm9yIGNvbHVtbiBqagorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gU1BBUlNFTFVfUEFORUxfREZTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9waXZvdEwuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9waXZvdEwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODZkYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX3Bpdm90TC5oCkBAIC0wLDAgKzEsMTM3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIAorIAorICogTk9URTogVGhpcyBmaWxlIGlzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIG9mIHhwaXZvdEwuYyBmaWxlIGluIFN1cGVyTFUgCisgCisgKiAtLSBTdXBlckxVIHJvdXRpbmUgKHZlcnNpb24gMy4wKSAtLQorICogVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgWGVyb3ggUGFsbyBBbHRvIFJlc2VhcmNoIENlbnRlciwKKyAqIGFuZCBMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWIuCisgKiBPY3RvYmVyIDE1LCAyMDAzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IGJ5IFhlcm94IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEFTIElTLCBXSVRIIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCBvbiBhbGwgY29waWVzLgorICogUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcworICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkLCBhbmQgYSBub3RpY2UgdGhhdAorICogdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UuCisgKi8KKyNpZm5kZWYgU1BBUlNFTFVfUElWT1RMX0gKKyNkZWZpbmUgU1BBUlNFTFVfUElWT1RMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAorLyoqCisgKiBcYnJpZWYgUGVyZm9ybXMgdGhlIG51bWVyaWNhbCBwaXZvdGluIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBvZiBMLCBhbmQgdGhlIENESVYgb3BlcmF0aW9uLgorICogCisgKiBQaXZvdCBwb2xpY3kgOgorICogKDEpIENvbXB1dGUgdGhyZXNoID0gdSAqIG1heF8oaT49aikgYWJzKEFfaWopOworICogKDIpIElGIHVzZXIgc3BlY2lmaWVzIHBpdm90IHJvdyBrIGFuZCBhYnMoQV9raikgPj0gdGhyZXNoIFRIRU4KKyAqICAgICAgICAgICBwaXZvdCByb3cgPSBrOworICogICAgICAgRUxTRSBJRiBhYnMoQV9qaikgPj0gdGhyZXNoIFRIRU4KKyAqICAgICAgICAgICBwaXZvdCByb3cgPSBqOworICogICAgICAgRUxTRQorICogICAgICAgICAgIHBpdm90IHJvdyA9IG07CisgKiAKKyAqICAgTm90ZTogSWYgeW91IGFic29sdXRlbHkgd2FudCB0byB1c2UgYSBnaXZlbiBwaXZvdCBvcmRlciwgdGhlbiBzZXQgdT0wLjAuCisgKiAKKyAqIFxwYXJhbSBqY29sIFRoZSBjdXJyZW50IGNvbHVtbiBvZiBMCisgKiBccGFyYW0gZGlhZ3Bpdm90dGhyZXNoIGRpYWdvbmFsIHBpdm90aW5nIHRocmVzaG9sZAorICogXHBhcmFtW2luLG91dF0gcGVybV9yIFJvdyBwZXJtdXRhdGlvbiAodGhyZXNob2xkIHBpdm90aW5nKQorICogXHBhcmFtW2luXSBpcGVybV9jIGNvbHVtbiBwZXJtdXRhdGlvbiAtIHVzZWQgdG8gZmluZiBkaWFnb25hbCBvZiBQYypBKlBjJworICogXHBhcmFtW291dF0gcGl2cm93ICBUaGUgcGl2b3Qgcm93CisgKiBccGFyYW0gZ2x1IEdsb2JhbCBMVSBkYXRhCisgKiBccmV0dXJuIDAgaWYgc3VjY2VzcywgaSA+IDAgaWYgVShpLGkpIGlzIGV4YWN0bHkgemVybyAKKyAqIAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+CitJbmRleCBTcGFyc2VMVUltcGw8U2NhbGFyLFN0b3JhZ2VJbmRleD46OnBpdm90TChjb25zdCBJbmRleCBqY29sLCBjb25zdCBSZWFsU2NhbGFyJiBkaWFncGl2b3R0aHJlc2gsIEluZGV4VmVjdG9yJiBwZXJtX3IsIEluZGV4VmVjdG9yJiBpcGVybV9jLCBJbmRleCYgcGl2cm93LCBHbG9iYWxMVV90JiBnbHUpCit7CisgIAorICBJbmRleCBmc3VwYyA9IChnbHUueHN1cCkoKGdsdS5zdXBubykoamNvbCkpOyAvLyBGaXJzdCBjb2x1bW4gaW4gdGhlIHN1cGVybm9kZSBjb250YWluaW5nIHRoZSBjb2x1bW4gamNvbAorICBJbmRleCBuc3VwYyA9IGpjb2wgLSBmc3VwYzsgLy8gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHN1cGVybm9kZSBwb3J0aW9uLCBleGNsdWRpbmcgamNvbDsgbnN1cGMgPj0wCisgIEluZGV4IGxwdHIgPSBnbHUueGxzdWIoZnN1cGMpOyAvLyBwb2ludGVyIHRvIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgcm93IHN1YnNjcmlwdHMgZm9yIHRoaXMgc3VwZXJub2RlIHBvcnRpb24KKyAgSW5kZXggbnN1cHIgPSBnbHUueGxzdWIoZnN1cGMrMSkgLSBscHRyOyAvLyBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgc3VwZXJub2RlCisgIEluZGV4IGxkYSA9IGdsdS54bHVzdXAoZnN1cGMrMSkgLSBnbHUueGx1c3VwKGZzdXBjKTsgLy8gbGVhZGluZyBkaW1lbnNpb24KKyAgU2NhbGFyKiBsdV9zdXBfcHRyID0gJihnbHUubHVzdXAuZGF0YSgpW2dsdS54bHVzdXAoZnN1cGMpXSk7IC8vIFN0YXJ0IG9mIHRoZSBjdXJyZW50IHN1cGVybm9kZQorICBTY2FsYXIqIGx1X2NvbF9wdHIgPSAmKGdsdS5sdXN1cC5kYXRhKClbZ2x1LnhsdXN1cChqY29sKV0pOyAvLyBTdGFydCBvZiBqY29sIGluIHRoZSBzdXBlcm5vZGUKKyAgU3RvcmFnZUluZGV4KiBsc3ViX3B0ciA9ICYoZ2x1LmxzdWIuZGF0YSgpW2xwdHJdKTsgLy8gU3RhcnQgb2Ygcm93IGluZGljZXMgb2YgdGhlIHN1cGVybm9kZQorICAKKyAgLy8gRGV0ZXJtaW5lIHRoZSBsYXJnZXN0IGFicyBudW1lcmljYWwgdmFsdWUgZm9yIHBhcnRpYWwgcGl2b3RpbmcgCisgIEluZGV4IGRpYWdpbmQgPSBpcGVybV9jKGpjb2wpOyAvLyBkaWFnb25hbCBpbmRleCAKKyAgUmVhbFNjYWxhciBwaXZtYXgoLTEuMCk7CisgIEluZGV4IHBpdnB0ciA9IG5zdXBjOyAKKyAgSW5kZXggZGlhZyA9IGVtcHR5SWR4TFU7IAorICBSZWFsU2NhbGFyIHJ0ZW1wOworICBJbmRleCBpc3ViLCBpY29sLCBpdGVtcCwgazsgCisgIGZvciAoaXN1YiA9IG5zdXBjOyBpc3ViIDwgbnN1cHI7ICsraXN1YikgeworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIHJ0ZW1wID0gYWJzKGx1X2NvbF9wdHJbaXN1Yl0pOworICAgIGlmIChydGVtcCA+IHBpdm1heCkgeworICAgICAgcGl2bWF4ID0gcnRlbXA7IAorICAgICAgcGl2cHRyID0gaXN1YjsKKyAgICB9IAorICAgIGlmIChsc3ViX3B0cltpc3ViXSA9PSBkaWFnaW5kKSBkaWFnID0gaXN1YjsKKyAgfQorICAKKyAgLy8gVGVzdCBmb3Igc2luZ3VsYXJpdHkKKyAgaWYgKCBwaXZtYXggPD0gUmVhbFNjYWxhcigwLjApICkgeworICAgIC8vIGlmIHBpdm1heCA9PSAtMSwgdGhlIGNvbHVtbiBpcyBzdHJ1Y3R1cmFsbHkgZW1wdHksIG90aGVyd2lzZSBpdCBpcyBvbmx5IG51bWVyaWNhbGx5IHplcm8KKyAgICBwaXZyb3cgPSBwaXZtYXggPCBSZWFsU2NhbGFyKDAuMCkgPyBkaWFnaW5kIDogbHN1Yl9wdHJbcGl2cHRyXTsKKyAgICBwZXJtX3IocGl2cm93KSA9IFN0b3JhZ2VJbmRleChqY29sKTsKKyAgICByZXR1cm4gKGpjb2wrMSk7CisgIH0KKyAgCisgIFJlYWxTY2FsYXIgdGhyZXNoID0gZGlhZ3Bpdm90dGhyZXNoICogcGl2bWF4OyAKKyAgCisgIC8vIENob29zZSBhcHByb3ByaWF0ZSBwaXZvdGFsIGVsZW1lbnQgCisgIAorICB7CisgICAgLy8gVGVzdCBpZiB0aGUgZGlhZ29uYWwgZWxlbWVudCBjYW4gYmUgdXNlZCBhcyBhIHBpdm90IChnaXZlbiB0aGUgdGhyZXNob2xkIHZhbHVlKQorICAgIGlmIChkaWFnID49IDAgKSAKKyAgICB7CisgICAgICAvLyBEaWFnb25hbCBlbGVtZW50IGV4aXN0cworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBydGVtcCA9IGFicyhsdV9jb2xfcHRyW2RpYWddKTsKKyAgICAgIGlmIChydGVtcCAhPSBSZWFsU2NhbGFyKDAuMCkgJiYgcnRlbXAgPj0gdGhyZXNoKSBwaXZwdHIgPSBkaWFnOworICAgIH0KKyAgICBwaXZyb3cgPSBsc3ViX3B0cltwaXZwdHJdOworICB9CisgIAorICAvLyBSZWNvcmQgcGl2b3Qgcm93CisgIHBlcm1fcihwaXZyb3cpID0gU3RvcmFnZUluZGV4KGpjb2wpOworICAvLyBJbnRlcmNoYW5nZSByb3cgc3Vic2NyaXB0cworICBpZiAocGl2cHRyICE9IG5zdXBjICkKKyAgeworICAgIHN0ZDo6c3dhcCggbHN1Yl9wdHJbcGl2cHRyXSwgbHN1Yl9wdHJbbnN1cGNdICk7CisgICAgLy8gSW50ZXJjaGFuZ2UgbnVtZXJpY2FsIHZhbHVlcyBhcyB3ZWxsLCBmb3IgdGhlIHR3byByb3dzIGluIHRoZSB3aG9sZSBzbm9kZQorICAgIC8vIHN1Y2ggdGhhdCBMIGlzIGluZGV4ZWQgdGhlIHNhbWUgd2F5IGFzIEEKKyAgICBmb3IgKGljb2wgPSAwOyBpY29sIDw9IG5zdXBjOyBpY29sKyspCisgICAgeworICAgICAgaXRlbXAgPSBwaXZwdHIgKyBpY29sICogbGRhOyAKKyAgICAgIHN0ZDo6c3dhcChsdV9zdXBfcHRyW2l0ZW1wXSwgbHVfc3VwX3B0cltuc3VwYyArIGljb2wgKiBsZGFdKTsKKyAgICB9CisgIH0KKyAgLy8gY2RpdiBvcGVyYXRpb25zCisgIFNjYWxhciB0ZW1wID0gU2NhbGFyKDEuMCkgLyBsdV9jb2xfcHRyW25zdXBjXTsKKyAgZm9yIChrID0gbnN1cGMrMTsgayA8IG5zdXByOyBrKyspCisgICAgbHVfY29sX3B0cltrXSAqPSB0ZW1wOyAKKyAgcmV0dXJuIDA7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBTUEFSU0VMVV9QSVZPVExfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX3BydW5lTC5oIGIvRWlnZW4vc3JjL1NwYXJzZUxVL1NwYXJzZUxVX3BydW5lTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcHJ1bmVMLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyogCisgCisgKiBOT1RFOiBUaGlzIGZpbGUgaXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gb2YgW3MsZCxjLHpdcHJ1bmVMLmMgZmlsZSBpbiBTdXBlckxVIAorIAorICogLS0gU3VwZXJMVSByb3V0aW5lICh2ZXJzaW9uIDIuMCkgLS0KKyAqIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFhlcm94IFBhbG8gQWx0byBSZXNlYXJjaCBDZW50ZXIsCisgKiBhbmQgTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFiLgorICogTm92ZW1iZXIgMTUsIDE5OTcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgYnkgWGVyb3ggQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQVMgSVMsIFdJVEggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQuICBBTlkgVVNFIElTIEFUIFlPVVIgT1dOIFJJU0suCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2Ugb3IgY29weSB0aGlzIHByb2dyYW0gZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQgdGhlIGFib3ZlIG5vdGljZXMgYXJlIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuCisgKiBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzCisgKiBncmFudGVkLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQsIGFuZCBhIG5vdGljZSB0aGF0CisgKiB0aGUgY29kZSB3YXMgbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZS4KKyAqLworI2lmbmRlZiBTUEFSU0VMVV9QUlVORUxfSAorI2RlZmluZSBTUEFSU0VMVV9QUlVORUxfSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqCisgKiBcYnJpZWYgUHJ1bmVzIHRoZSBMLXN0cnVjdHVyZS4KKyAqCisgKiBJdCBwcnVuZXMgdGhlIEwtc3RydWN0dXJlICBvZiBzdXBlcm5vZGVzIHdob3NlIEwtc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjdXJyZW50IHBpdm90IHJvdyAicGl2cm93IgorICogCisgKiAKKyAqIFxwYXJhbSBqY29sIFRoZSBjdXJyZW50IGNvbHVtbiBvZiBMCisgKiBccGFyYW1baW5dIHBlcm1fciBSb3cgcGVybXV0YXRpb24KKyAqIFxwYXJhbVtvdXRdIHBpdnJvdyAgVGhlIHBpdm90IHJvdworICogXHBhcmFtIG5zZWcgTnVtYmVyIG9mIHNlZ21lbnRzCisgKiBccGFyYW0gc2VncmVwIAorICogXHBhcmFtIHJlcGZuegorICogXHBhcmFtW291dF0geHBydW5lIAorICogXHBhcmFtIGdsdSBHbG9iYWwgTFUgZGF0YQorICogCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3ZvaWQgU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjpwcnVuZUwoY29uc3QgSW5kZXggamNvbCwgY29uc3QgSW5kZXhWZWN0b3ImIHBlcm1fciwgY29uc3QgSW5kZXggcGl2cm93LCBjb25zdCBJbmRleCBuc2VnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleFZlY3RvciYgc2VncmVwLCBCbG9ja0luZGV4VmVjdG9yIHJlcGZueiwgSW5kZXhWZWN0b3ImIHhwcnVuZSwgR2xvYmFsTFVfdCYgZ2x1KQoreworICAvLyBGb3IgZWFjaCBzdXBlcm5vZGUtcmVwIGlyZXAgaW4gVSgqLGpdCisgIEluZGV4IGpzdXBubyA9IGdsdS5zdXBubyhqY29sKTsgCisgIEluZGV4IGksaXJlcCxpcmVwMTsgCisgIGJvb2wgbW92bnVtLCBkb19wcnVuZSA9IGZhbHNlOyAKKyAgSW5kZXgga21pbiA9IDAsIGttYXggPSAwLCBtaW5sb2MsIG1heGxvYyxrcm93OyAKKyAgZm9yIChpID0gMDsgaSA8IG5zZWc7IGkrKykKKyAgeworICAgIGlyZXAgPSBzZWdyZXAoaSk7IAorICAgIGlyZXAxID0gaXJlcCArIDE7IAorICAgIGRvX3BydW5lID0gZmFsc2U7IAorICAgIAorICAgIC8vIERvbid0IHBydW5lIHdpdGggYSB6ZXJvIFUtc2VnbWVudCAKKyAgICBpZiAocmVwZm56KGlyZXApID09IGVtcHR5SWR4TFUpIGNvbnRpbnVlOyAKKyAgICAKKyAgICAvLyBJZiBhIHNub2RlIG92ZXJsYXBzIHdpdGggdGhlIG5leHQgcGFuZWwsIHRoZW4gdGhlIFUtc2VnbWVudAorICAgIC8vIGlzIGZyYWdtZW50ZWQgaW50byB0d28gcGFydHMgLS0gaXJlcCBhbmQgaXJlcDEuIFdlIHNob3VsZCBsZXQgCisgICAgLy8gcHJ1bmluZyBvY2N1ciBhdCB0aGUgcmVwLWNvbHVtbiBpbiBpcmVwMXMgc25vZGUuIAorICAgIGlmIChnbHUuc3Vwbm8oaXJlcCkgPT0gZ2x1LnN1cG5vKGlyZXAxKSApIGNvbnRpbnVlOyAvLyBkb24ndCBwcnVuZSAKKyAgICAKKyAgICAvLyBJZiBpdCBoYXMgbm90IGJlZW4gcHJ1bmVkICYgaXQgaGFzIGEgbm9ueiBpbiByb3cgTChwaXZyb3csaSkKKyAgICBpZiAoZ2x1LnN1cG5vKGlyZXApICE9IGpzdXBubyApCisgICAgeworICAgICAgaWYgKCB4cHJ1bmUgKGlyZXApID49IGdsdS54bHN1YihpcmVwMSkgKQorICAgICAgeworICAgICAgICBrbWluID0gZ2x1Lnhsc3ViKGlyZXApOworICAgICAgICBrbWF4ID0gZ2x1Lnhsc3ViKGlyZXAxKSAtIDE7IAorICAgICAgICBmb3IgKGtyb3cgPSBrbWluOyBrcm93IDw9IGttYXg7IGtyb3crKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChnbHUubHN1Yihrcm93KSA9PSBwaXZyb3cpIAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvX3BydW5lID0gdHJ1ZTsgCisgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChkb19wcnVuZSkgCisgICAgICB7CisgICAgICAgIC8vIGRvIGEgcXVpY2tzb3J0LXR5cGUgcGFydGl0aW9uCisgICAgICAgIC8vIG1vdm51bT10cnVlIG1lYW5zIHRoYXQgdGhlIG51bSB2YWx1ZXMgaGF2ZSB0byBiZSBleGNoYW5nZWQKKyAgICAgICAgbW92bnVtID0gZmFsc2U7IAorICAgICAgICBpZiAoaXJlcCA9PSBnbHUueHN1cChnbHUuc3Vwbm8oaXJlcCkpICkgLy8gU25vZGUgb2Ygc2l6ZSAxIAorICAgICAgICAgIG1vdm51bSA9IHRydWU7IAorICAgICAgICAKKyAgICAgICAgd2hpbGUgKGttaW4gPD0ga21heCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwZXJtX3IoZ2x1LmxzdWIoa21heCkpID09IGVtcHR5SWR4TFUpCisgICAgICAgICAgICBrbWF4LS07IAorICAgICAgICAgIGVsc2UgaWYgKCBwZXJtX3IoZ2x1LmxzdWIoa21pbikpICE9IGVtcHR5SWR4TFUpCisgICAgICAgICAgICBrbWluKys7CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBrbWluIGJlbG93IHBpdnJvdyAobm90IHlldCBwaXZvdGVkKSwgYW5kIGttYXgKKyAgICAgICAgICAgIC8vIGFib3ZlIHBpdnJvdzogaW50ZXJjaGFuZ2UgdGhlIHR3byBzdXNjcmlwdHMKKyAgICAgICAgICAgIHN0ZDo6c3dhcChnbHUubHN1YihrbWluKSwgZ2x1LmxzdWIoa21heCkpOyAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgdGhlIHN1cGVybm9kZSBoYXMgb25seSBvbmUgY29sdW1uLCB0aGVuIHdlIAorICAgICAgICAgICAgLy8gb25seSBrZWVwIG9uZSBzZXQgb2Ygc3Vic2NyaXB0cy4gRm9yIGFueSBzdWJzY3JpcHQKKyAgICAgICAgICAgIC8vIGludGVyY25haGdlIHBlcmZvcm1lZCwgc2ltaWxhciBpbnRlcmNoYW5nZSBtdXN0IGJlIAorICAgICAgICAgICAgLy8gZG9uZSBvbiB0aGUgbnVtZXJpY2FsIHZhbHVlcy4gCisgICAgICAgICAgICBpZiAobW92bnVtKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWlubG9jID0gZ2x1LnhsdXN1cChpcmVwKSArICgga21pbiAtIGdsdS54bHN1YihpcmVwKSApOyAKKyAgICAgICAgICAgICAgbWF4bG9jID0gZ2x1LnhsdXN1cChpcmVwKSArICgga21heCAtIGdsdS54bHN1YihpcmVwKSApOyAKKyAgICAgICAgICAgICAgc3RkOjpzd2FwKGdsdS5sdXN1cChtaW5sb2MpLCBnbHUubHVzdXAobWF4bG9jKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAga21pbisrOworICAgICAgICAgICAga21heC0tOworICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBlbmQgd2hpbGUgCisgICAgICAgIAorICAgICAgICB4cHJ1bmUoaXJlcCkgPSBTdG9yYWdlSW5kZXgoa21pbik7ICAvL1BydW5pbmcgCisgICAgICB9IC8vIGVuZCBpZiBkb19wcnVuZSAKKyAgICB9IC8vIGVuZCBwcnVuaW5nIAorICB9IC8vIEVuZCBmb3IgZWFjaCBVLXNlZ21lbnQKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIFNQQVJTRUxVX1BSVU5FTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcmVsYXhfc25vZGUuaCBiL0VpZ2VuL3NyYy9TcGFyc2VMVS9TcGFyc2VMVV9yZWxheF9zbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDhkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlTFUvU3BhcnNlTFVfcmVsYXhfc25vZGUuaApAQCAtMCwwICsxLDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgaGVhcF9yZWxheF9zbm9kZS5jIGZpbGUgaW4gU3VwZXJMVQorICogLS0gU3VwZXJMVSByb3V0aW5lICh2ZXJzaW9uIDMuMCkgLS0KKyAqIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFhlcm94IFBhbG8gQWx0byBSZXNlYXJjaCBDZW50ZXIsCisgKiBhbmQgTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFiLgorICogT2N0b2JlciAxNSwgMjAwMworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBieSBYZXJveCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVEhJUyBNQVRFUklBTCBJUyBQUk9WSURFRCBBUyBJUywgV0lUSCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRC4gIEFOWSBVU0UgSVMgQVQgWU9VUiBPV04gUklTSy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSBvciBjb3B5IHRoaXMgcHJvZ3JhbSBmb3IgYW55CisgKiBwdXJwb3NlLCBwcm92aWRlZCB0aGUgYWJvdmUgbm90aWNlcyBhcmUgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAqIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoZSBhYm92ZSBub3RpY2VzIGFyZSByZXRhaW5lZCwgYW5kIGEgbm90aWNlIHRoYXQKKyAqIHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLgorICovCisKKyNpZm5kZWYgU1BBUlNFTFVfUkVMQVhfU05PREVfSAorI2RlZmluZSBTUEFSU0VMVV9SRUxBWF9TTk9ERV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgCisvKiogCisgKiBcYnJpZWYgSWRlbnRpZnkgdGhlIGluaXRpYWwgcmVsYXhlZCBzdXBlcm5vZGVzCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyBhcHBsaWVkIHRvIGEgY29sdW1uIGVsaW1pbmF0aW9uIHRyZWUuIAorICogSXQgYXNzdW1lcyB0aGF0IHRoZSBtYXRyaXggaGFzIGJlZW4gcmVvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgcG9zdG9yZGVyIG9mIHRoZSBldHJlZQorICogXHBhcmFtIG4gIHRoZSBudW1iZXIgb2YgY29sdW1ucworICogXHBhcmFtIGV0IGVsaW1pbmF0aW9uIHRyZWUgCisgKiBccGFyYW0gcmVsYXhfY29sdW1ucyBNYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGFsbG93ZWQgaW4gYSByZWxheGVkIHNub2RlIAorICogXHBhcmFtIGRlc2NlbmRhbnRzIE51bWJlciBvZiBkZXNjZW5kYW50cyBvZiBlYWNoIG5vZGUgaW4gdGhlIGV0cmVlCisgKiBccGFyYW0gcmVsYXhfZW5kIGxhc3QgY29sdW1uIGluIGEgc3VwZXJub2RlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4KK3ZvaWQgU3BhcnNlTFVJbXBsPFNjYWxhcixTdG9yYWdlSW5kZXg+OjpyZWxheF9zbm9kZSAoY29uc3QgSW5kZXggbiwgSW5kZXhWZWN0b3ImIGV0LCBjb25zdCBJbmRleCByZWxheF9jb2x1bW5zLCBJbmRleFZlY3RvciYgZGVzY2VuZGFudHMsIEluZGV4VmVjdG9yJiByZWxheF9lbmQpCit7CisgIAorICAvLyBjb21wdXRlIHRoZSBudW1iZXIgb2YgZGVzY2VuZGFudHMgb2YgZWFjaCBub2RlIGluIHRoZSBldHJlZQorICBJbmRleCBwYXJlbnQ7IAorICByZWxheF9lbmQuc2V0Q29uc3RhbnQoZW1wdHlJZHhMVSk7CisgIGRlc2NlbmRhbnRzLnNldFplcm8oKTsKKyAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47IGorKykgCisgIHsKKyAgICBwYXJlbnQgPSBldChqKTsKKyAgICBpZiAocGFyZW50ICE9IG4pIC8vIG5vdCB0aGUgZHVtbXkgcm9vdAorICAgICAgZGVzY2VuZGFudHMocGFyZW50KSArPSBkZXNjZW5kYW50cyhqKSArIDE7CisgIH0KKyAgLy8gSWRlbnRpZnkgdGhlIHJlbGF4ZWQgc3VwZXJub2RlcyBieSBwb3N0b3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBldHJlZQorICBJbmRleCBzbm9kZV9zdGFydDsgLy8gYmVnaW5uaW5nIG9mIGEgc25vZGUgCisgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyApCisgIHsKKyAgICBwYXJlbnQgPSBldChqKTsKKyAgICBzbm9kZV9zdGFydCA9IGo7IAorICAgIHdoaWxlICggcGFyZW50ICE9IG4gJiYgZGVzY2VuZGFudHMocGFyZW50KSA8IHJlbGF4X2NvbHVtbnMgKSAKKyAgICB7CisgICAgICBqID0gcGFyZW50OyAKKyAgICAgIHBhcmVudCA9IGV0KGopOworICAgIH0KKyAgICAvLyBGb3VuZCBhIHN1cGVybm9kZSBpbiBwb3N0b3JkZXJlZCBldHJlZSwgaiBpcyB0aGUgbGFzdCBjb2x1bW4gCisgICAgcmVsYXhfZW5kKHNub2RlX3N0YXJ0KSA9IFN0b3JhZ2VJbmRleChqKTsgLy8gUmVjb3JkIGxhc3QgY29sdW1uCisgICAgaisrOworICAgIC8vIFNlYXJjaCBmb3IgYSBuZXcgbGVhZgorICAgIHdoaWxlIChkZXNjZW5kYW50cyhqKSAhPSAwICYmIGogPCBuKSBqKys7CisgIH0gLy8gRW5kIHBvc3RvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIGV0cmVlCisgIAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VRUi9TcGFyc2VRUi5oIGIvRWlnZW4vc3JjL1NwYXJzZVFSL1NwYXJzZVFSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0NDk4YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VRUi9TcGFyc2VRUi5oCkBAIC0wLDAgKzEsNzM5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIERlc2lyZSBOdWVudHNhIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfUVJfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfUVJfSAorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPcmRlcmluZ1R5cGU+IGNsYXNzIFNwYXJzZVFSOwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlUVJUeXBlPiBzdHJ1Y3QgU3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZVFSVHlwZT4gc3RydWN0IFNwYXJzZVFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VRUlR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBTcGFyc2VRUl9RUHJvZHVjdDsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGFyc2VRUlR5cGU+IHN0cnVjdCB0cmFpdHM8U3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZTxTcGFyc2VRUlR5cGU+ID4KKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlUVJUeXBlOjpNYXRyaXhUeXBlIFJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5UeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmV0dXJuVHlwZTo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMKKyAgICB9OworICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlUVJUeXBlPiBzdHJ1Y3QgdHJhaXRzPFNwYXJzZVFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPiA+CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVFSVHlwZTo6TWF0cml4VHlwZSBSZXR1cm5UeXBlOworICB9OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlUVJUeXBlLCB0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgdHJhaXRzPFNwYXJzZVFSX1FQcm9kdWN0PFNwYXJzZVFSVHlwZSwgRGVyaXZlZD4gPgorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOworICB9OworfSAvLyBFbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKgorICAqIFxpbmdyb3VwIFNwYXJzZVFSX01vZHVsZQorICAqIFxjbGFzcyBTcGFyc2VRUgorICAqIFxicmllZiBTcGFyc2UgbGVmdC1sb29raW5nIHJhbmstcmV2ZWFsaW5nIFFSIGZhY3Rvcml6YXRpb24KKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsZWZ0LWxvb2tpbmcgcmFuay1yZXZlYWxpbmcgUVIgZGVjb21wb3NpdGlvbiAKKyAgKiBvZiBzcGFyc2UgbWF0cmljZXMuIFdoZW4gYSBjb2x1bW4gaGFzIGEgbm9ybSBsZXNzIHRoYW4gYSBnaXZlbiB0b2xlcmFuY2UKKyAgKiBpdCBpcyBpbXBsaWNpdGx5IHBlcm11dGVkIHRvIHRoZSBlbmQuIFRoZSBRUiBmYWN0b3JpemF0aW9uIHRodXMgb2J0YWluZWQgaXMgCisgICogZ2l2ZW4gYnkgQSpQID0gUSpSIHdoZXJlIFIgaXMgdXBwZXIgdHJpYW5ndWxhciBvciB0cmFwZXpvaWRhbC4gCisgICogCisgICogUCBpcyB0aGUgY29sdW1uIHBlcm11dGF0aW9uIHdoaWNoIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBmaWxsLXJlZHVjaW5nIGFuZCB0aGUKKyAgKiByYW5rLXJldmVhbGluZyBwZXJtdXRhdGlvbnMuIFVzZSBjb2xzUGVybXV0YXRpb24oKSB0byBnZXQgaXQuCisgICogCisgICogUSBpcyB0aGUgb3J0aG9nb25hbCBtYXRyaXggcmVwcmVzZW50ZWQgYXMgcHJvZHVjdHMgb2YgSG91c2Vob2xkZXIgcmVmbGVjdG9ycy4gCisgICogVXNlIG1hdHJpeFEoKSB0byBnZXQgYW4gZXhwcmVzc2lvbiBhbmQgbWF0cml4USgpLnRyYW5zcG9zZSgpIHRvIGdldCB0aGUgdHJhbnNwb3NlLgorICAqIFlvdSBjYW4gdGhlbiBhcHBseSBpdCB0byBhIHZlY3Rvci4KKyAgKiAKKyAgKiBSIGlzIHRoZSBzcGFyc2UgdHJpYW5ndWxhciBvciB0cmFwZXpvaWRhbCBtYXRyaXguIFRoZSBsYXRlciBvY2N1cnMgd2hlbiBBIGlzIHJhbmstZGVmaWNpZW50LgorICAqIG1hdHJpeFIoKS50b3BMZWZ0Q29ybmVyKHJhbmsoKSwgcmFuaygpKSBhbHdheXMgcmV0dXJucyBhIHRyaWFuZ3VsYXIgZmFjdG9yIG9mIGZ1bGwgcmFuay4KKyAgKiAKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIFRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIG11c3QgYmUgYSBjb2x1bW4tbWFqb3IgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9PcmRlcmluZ1R5cGUgVGhlIGZpbGwtcmVkdWNpbmcgb3JkZXJpbmcgbWV0aG9kLiBTZWUgdGhlIFxsaW5rIE9yZGVyaW5nTWV0aG9kc19Nb2R1bGUgCisgICogIE9yZGVyaW5nTWV0aG9kcyBcZW5kbGluayBtb2R1bGUgZm9yIHRoZSBsaXN0IG9mIGJ1aWx0LWluIGFuZCBleHRlcm5hbCBvcmRlcmluZyBtZXRob2RzLgorICAqIAorICAqIFxpbXBsc3BhcnNlc29sdmVyY29uY2VwdAorICAqCisgICogXHdhcm5pbmcgVGhlIGlucHV0IHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIGluIGNvbXByZXNzZWQgbW9kZSAoc2VlIFNwYXJzZU1hdHJpeDo6bWFrZUNvbXByZXNzZWQoKSkuCisgICogCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX09yZGVyaW5nVHlwZT4KK2NsYXNzIFNwYXJzZVFSIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8U3BhcnNlUVI8X01hdHJpeFR5cGUsX09yZGVyaW5nVHlwZT4gPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPFNwYXJzZVFSPF9NYXRyaXhUeXBlLF9PcmRlcmluZ1R5cGU+ID4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB1c2luZyBCYXNlOjpfc29sdmVfaW1wbDsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBfT3JkZXJpbmdUeXBlIE9yZGVyaW5nVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixTdG9yYWdlSW5kZXg+IFFSTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsIER5bmFtaWMsIDE+IEluZGV4VmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gU2NhbGFyVmVjdG9yOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgU3RvcmFnZUluZGV4PiBQZXJtdXRhdGlvblR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICAKKyAgcHVibGljOgorICAgIFNwYXJzZVFSICgpIDogIG1fYW5hbHlzaXNJc29rKGZhbHNlKSwgbV9sYXN0RXJyb3IoIiIpLCBtX3VzZURlZmF1bHRUaHJlc2hvbGQodHJ1ZSksbV9pc1FTb3J0ZWQoZmFsc2UpLG1faXNFdHJlZU9rKGZhbHNlKQorICAgIHsgfQorICAgIAorICAgIC8qKiBDb25zdHJ1Y3QgYSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBtYXRyaXggXGEgbWF0LgorICAgICAgKiAKKyAgICAgICogXHdhcm5pbmcgVGhlIG1hdHJpeCBcYSBtYXQgbXVzdCBiZSBpbiBjb21wcmVzc2VkIG1vZGUgKHNlZSBTcGFyc2VNYXRyaXg6Om1ha2VDb21wcmVzc2VkKCkpLgorICAgICAgKiAKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICBleHBsaWNpdCBTcGFyc2VRUihjb25zdCBNYXRyaXhUeXBlJiBtYXQpIDogbV9hbmFseXNpc0lzb2soZmFsc2UpLCBtX2xhc3RFcnJvcigiIiksIG1fdXNlRGVmYXVsdFRocmVzaG9sZCh0cnVlKSxtX2lzUVNvcnRlZChmYWxzZSksbV9pc0V0cmVlT2soZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXQpOworICAgIH0KKyAgICAKKyAgICAvKiogQ29tcHV0ZXMgdGhlIFFSIGZhY3Rvcml6YXRpb24gb2YgdGhlIHNwYXJzZSBtYXRyaXggXGEgbWF0LgorICAgICAgKiAKKyAgICAgICogXHdhcm5pbmcgVGhlIG1hdHJpeCBcYSBtYXQgbXVzdCBiZSBpbiBjb21wcmVzc2VkIG1vZGUgKHNlZSBTcGFyc2VNYXRyaXg6Om1ha2VDb21wcmVzc2VkKCkpLgorICAgICAgKiAKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCksIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXQpCisgICAgeworICAgICAgYW5hbHl6ZVBhdHRlcm4obWF0KTsKKyAgICAgIGZhY3Rvcml6ZShtYXQpOworICAgIH0KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCk7CisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0KTsKKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSByZXByZXNlbnRlZCBtYXRyaXguIAorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcG1hdC5yb3dzKCk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSByZXByZXNlbnRlZCBtYXRyaXguIAorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcG1hdC5jb2xzKCk7fQorICAgIAorICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgXGIgc3BhcnNlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IFIgb2YgdGhlIFFSIGZhY3Rvcml6YXRpb24uCisgICAgICAqIFx3YXJuaW5nIFRoZSBlbnRyaWVzIG9mIHRoZSByZXR1cm5lZCBtYXRyaXggYXJlIG5vdCBzb3J0ZWQuIFRoaXMgbWVhbnMgdGhhdCB1c2luZyBpdCBpbiBhbGdvcml0aG1zCisgICAgICAqICAgICAgICAgIGV4cGVjdGluZyBzb3J0ZWQgZW50cmllcyB3aWxsIGZhaWwuIFRoaXMgaW5jbHVkZSByYW5kb20gY29lZmZpY2llbnQgYWNjZXNzZXMgKFNwYXNlTWF0cml4Ojpjb2VmZigpKSwKKyAgICAgICogICAgICAgICAgYW5kIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucy4gTWF0cml4IHByb2R1Y3RzIGFuZCB0cmlhbmd1bGFyIHNvbHZlcyBhcmUgZmluZSB0aG91Z2guCisgICAgICAqCisgICAgICAqIFRvIHNvcnQgdGhlIGVudHJpZXMsIHlvdSBjYW4gYXNzaWduIGl0IHRvIGEgcm93LW1ham9yIG1hdHJpeCwgYW5kIGlmIGEgY29sdW1uLW1ham9yIG1hdHJpeAorICAgICAgKiBpcyByZXF1aXJlZCwgeW91IGNhbiBjb3B5IGl0IGFnYWluOgorICAgICAgKiBcY29kZQorICAgICAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiAgICAgICAgICBSICA9IHFyLm1hdHJpeFIoKTsgIC8vIGNvbHVtbi1tYWpvciwgbm90IHNvcnRlZCEKKyAgICAgICogU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gUnIgPSBxci5tYXRyaXhSKCk7ICAvLyByb3ctbWFqb3IsIHNvcnRlZAorICAgICAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiAgICAgICAgICBSYyA9IFJyOyAgICAgICAgICAgIC8vIGNvbHVtbi1tYWpvciwgc29ydGVkCisgICAgICAqIFxlbmRjb2RlCisgICAgICAqLworICAgIGNvbnN0IFFSTWF0cml4VHlwZSYgbWF0cml4UigpIGNvbnN0IHsgcmV0dXJuIG1fUjsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiBsaW5lYXJseSBkZXBlbmRlbnQgY29sdW1ucyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBwaXZvdGluZyB0aHJlc2hvbGQuCisgICAgICAqCisgICAgICAqIFxzYSBzZXRQaXZvdFRocmVzaG9sZCgpCisgICAgICAqLworICAgIEluZGV4IHJhbmsoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRoZSBmYWN0b3JpemF0aW9uIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIHVzZSBjb21wdXRlKCkiKTsKKyAgICAgIHJldHVybiBtX25vbnplcm9waXZvdHM7IAorICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbWF0cml4IFEgYXMgcHJvZHVjdHMgb2Ygc3BhcnNlIEhvdXNlaG9sZGVyIHJlZmxlY3RvcnMuCisgICAgKiBUaGUgY29tbW9uIHVzYWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYXBwbHkgaXQgdG8gYSBkZW5zZSBtYXRyaXggb3IgdmVjdG9yCisgICAgKiBcY29kZQorICAgICogVmVjdG9yWGQgQjEsIEIyOworICAgICogLy8gSW5pdGlhbGl6ZSBCMQorICAgICogQjIgPSBtYXRyaXhRKCkgKiBCMTsKKyAgICAqIFxlbmRjb2RlCisgICAgKgorICAgICogVG8gZ2V0IGEgcGxhaW4gU3BhcnNlTWF0cml4IHJlcHJlc2VudGF0aW9uIG9mIFE6CisgICAgKiBcY29kZQorICAgICogU3BhcnNlTWF0cml4PGRvdWJsZT4gUTsKKyAgICAqIFEgPSBTcGFyc2VRUjxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+KEEpLm1hdHJpeFEoKTsKKyAgICAqIFxlbmRjb2RlCisgICAgKiBJbnRlcm5hbGx5LCB0aGlzIGNhbGwgc2ltcGx5IHBlcmZvcm1zIGEgc3BhcnNlIHByb2R1Y3QgYmV0d2VlbiB0aGUgbWF0cml4IFEKKyAgICAqIGFuZCBhIHNwYXJzZSBpZGVudGl0eSBtYXRyaXguIEhvd2V2ZXIsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBzcGFyc2UKKyAgICAqIHJlZmxlY3RvcnMgYXJlIHN0b3JlZCB1bnNvcnRlZCwgdHdvIHRyYW5zcG9zaXRpb25zIGFyZSBuZWVkZWQgdG8gc29ydAorICAgICogdGhlbSBiZWZvcmUgcGVyZm9ybWluZyB0aGUgcHJvZHVjdC4KKyAgICAqLworICAgIFNwYXJzZVFSTWF0cml4UVJldHVyblR5cGU8U3BhcnNlUVI+IG1hdHJpeFEoKSBjb25zdCAKKyAgICB7IHJldHVybiBTcGFyc2VRUk1hdHJpeFFSZXR1cm5UeXBlPFNwYXJzZVFSPigqdGhpcyk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiBwZXJtdXRhdGlvbiBQIHRoYXQgd2FzIGFwcGxpZWQgdG8gQSBzdWNoIHRoYXQgQSpQID0gUSpSCisgICAgICAqIEl0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgZmlsbC1pbiByZWR1Y2luZyBwZXJtdXRhdGlvbiBhbmQgbnVtZXJpY2FsIGNvbHVtbiBwaXZvdGluZy4KKyAgICAgICovCisgICAgY29uc3QgUGVybXV0YXRpb25UeXBlJiBjb2xzUGVybXV0YXRpb24oKSBjb25zdAorICAgIHsgCisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX291dHB1dFBlcm1fYzsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgZXJyb3IuCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIGVhc2UgZGVidWdnaW5nLCBub3QgdG8gaGFuZGxlIGVycm9ycy4KKyAgICAgICovCisgICAgc3RkOjpzdHJpbmcgbGFzdEVycm9yTWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdEVycm9yOyB9CisgICAgCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgICBib29sIF9zb2x2ZV9pbXBsKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiAmQiwgTWF0cml4QmFzZTxEZXN0PiAmZGVzdCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJUaGUgZmFjdG9yaXphdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCB1c2UgY29tcHV0ZSgpIik7CisgICAgICBlaWdlbl9hc3NlcnQodGhpcy0+cm93cygpID09IEIucm93cygpICYmICJTcGFyc2VRUjo6c29sdmUoKSA6IGludmFsaWQgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXgiKTsKKworICAgICAgSW5kZXggcmFuayA9IHRoaXMtPnJhbmsoKTsKKyAgICAgIAorICAgICAgLy8gQ29tcHV0ZSBRXlQgKiBiOworICAgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgeSwgYjsKKyAgICAgIHkgPSB0aGlzLT5tYXRyaXhRKCkudHJhbnNwb3NlKCkgKiBCOyAKKyAgICAgIGIgPSB5OworICAgICAgCisgICAgICAvLyBTb2x2ZSB3aXRoIHRoZSB0cmlhbmd1bGFyIG1hdHJpeCBSCisgICAgICB5LnJlc2l6ZSgoc3RkOjptYXg8SW5kZXg+KShjb2xzKCkseS5yb3dzKCkpLHkuY29scygpKTsKKyAgICAgIHkudG9wUm93cyhyYW5rKSA9IHRoaXMtPm1hdHJpeFIoKS50b3BMZWZ0Q29ybmVyKHJhbmssIHJhbmspLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKGIudG9wUm93cyhyYW5rKSk7CisgICAgICB5LmJvdHRvbVJvd3MoeS5yb3dzKCktcmFuaykuc2V0WmVybygpOworICAgICAgCisgICAgICAvLyBBcHBseSB0aGUgY29sdW1uIHBlcm11dGF0aW9uCisgICAgICBpZiAobV9wZXJtX2Muc2l6ZSgpKSAgZGVzdCA9IGNvbHNQZXJtdXRhdGlvbigpICogeS50b3BSb3dzKGNvbHMoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgZGVzdCA9IHkudG9wUm93cyhjb2xzKCkpOworICAgICAgCisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIFNldHMgdGhlIHRocmVzaG9sZCB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGxpbmVhcmx5IGRlcGVuZGVudCBjb2x1bW5zIGR1cmluZyB0aGUgZmFjdG9yaXphdGlvbi4KKyAgICAgICoKKyAgICAgICogSW4gcHJhY3RpY2UsIGlmIGR1cmluZyB0aGUgZmFjdG9yaXphdGlvbiB0aGUgbm9ybSBvZiB0aGUgY29sdW1uIHRoYXQgaGFzIHRvIGJlIGVsaW1pbmF0ZWQgaXMgYmVsb3cKKyAgICAgICogdGhpcyB0aHJlc2hvbGQsIHRoZW4gdGhlIGVudGlyZSBjb2x1bW4gaXMgdHJlYXRlZCBhcyB6ZXJvLCBhbmQgaXQgaXMgbW92ZWQgYXQgdGhlIGVuZC4KKyAgICAgICovCisgICAgdm9pZCBzZXRQaXZvdFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJiB0aHJlc2hvbGQpCisgICAgeworICAgICAgbV91c2VEZWZhdWx0VGhyZXNob2xkID0gZmFsc2U7CisgICAgICBtX3RocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiBYIG9mIFxmJCBBIFggPSBCIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBTb2x2ZTxTcGFyc2VRUiwgUmhzPiBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIEIpIGNvbnN0IAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRoZSBmYWN0b3JpemF0aW9uIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIHVzZSBjb21wdXRlKCkiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5yb3dzKCkgPT0gQi5yb3dzKCkgJiYgIlNwYXJzZVFSOjpzb2x2ZSgpIDogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBpbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCIpOworICAgICAgcmV0dXJuIFNvbHZlPFNwYXJzZVFSLCBSaHM+KCp0aGlzLCBCLmRlcml2ZWQoKSk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgU29sdmU8U3BhcnNlUVIsIFJocz4gc29sdmUoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxSaHM+JiBCKSBjb25zdAorICAgIHsKKyAgICAgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJUaGUgZmFjdG9yaXphdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCB1c2UgY29tcHV0ZSgpIik7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KHRoaXMtPnJvd3MoKSA9PSBCLnJvd3MoKSAmJiAiU3BhcnNlUVI6OnNvbHZlKCkgOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIGluIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4Iik7CisgICAgICAgICAgcmV0dXJuIFNvbHZlPFNwYXJzZVFSLCBSaHM+KCp0aGlzLCBCLmRlcml2ZWQoKSk7CisgICAgfQorICAgIAorICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgUVIgZmFjdG9yaXphdGlvbiByZXBvcnRzIGEgbnVtZXJpY2FsIHByb2JsZW0KKyAgICAgICogICAgICAgICAgXGMgSW52YWxpZElucHV0IGlmIHRoZSBpbnB1dCBtYXRyaXggaXMgaW52YWxpZAorICAgICAgKgorICAgICAgKiBcc2EgaXBhcm0oKSAgICAgICAgICAKKyAgICAgICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkRlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisKKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgdm9pZCBfc29ydF9tYXRyaXhfUSgpCisgICAgeworICAgICAgaWYodGhpcy0+bV9pc1FTb3J0ZWQpIHJldHVybjsKKyAgICAgIC8vIFRoZSBtYXRyaXggUSBpcyBzb3J0ZWQgZHVyaW5nIHRoZSB0cmFuc3Bvc2l0aW9uCisgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvciwgSW5kZXg+IG1Rcm0odGhpcy0+bV9RKTsKKyAgICAgIHRoaXMtPm1fUSA9IG1Rcm07CisgICAgICB0aGlzLT5tX2lzUVNvcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgCisgIHByb3RlY3RlZDoKKyAgICBib29sIG1fYW5hbHlzaXNJc29rOworICAgIGJvb2wgbV9mYWN0b3JpemF0aW9uSXNvazsKKyAgICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgICAgc3RkOjpzdHJpbmcgbV9sYXN0RXJyb3I7CisgICAgUVJNYXRyaXhUeXBlIG1fcG1hdDsgICAgICAgICAgICAvLyBUZW1wb3JhcnkgbWF0cml4CisgICAgUVJNYXRyaXhUeXBlIG1fUjsgICAgICAgICAgICAgICAvLyBUaGUgdHJpYW5ndWxhciBmYWN0b3IgbWF0cml4CisgICAgUVJNYXRyaXhUeXBlIG1fUTsgICAgICAgICAgICAgICAvLyBUaGUgb3J0aG9nb25hbCByZWZsZWN0b3JzCisgICAgU2NhbGFyVmVjdG9yIG1faGNvZWZmczsgICAgICAgICAvLyBUaGUgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzCisgICAgUGVybXV0YXRpb25UeXBlIG1fcGVybV9jOyAgICAgICAvLyBGaWxsLXJlZHVjaW5nICBDb2x1bW4gIHBlcm11dGF0aW9uCisgICAgUGVybXV0YXRpb25UeXBlIG1fcGl2b3RwZXJtOyAgICAvLyBUaGUgcGVybXV0YXRpb24gZm9yIHJhbmsgcmV2ZWFsaW5nCisgICAgUGVybXV0YXRpb25UeXBlIG1fb3V0cHV0UGVybV9jOyAvLyBUaGUgZmluYWwgY29sdW1uIHBlcm11dGF0aW9uCisgICAgUmVhbFNjYWxhciBtX3RocmVzaG9sZDsgICAgICAgICAvLyBUaHJlc2hvbGQgdG8gZGV0ZXJtaW5lIG51bGwgSG91c2Vob2xkZXIgcmVmbGVjdGlvbnMKKyAgICBib29sIG1fdXNlRGVmYXVsdFRocmVzaG9sZDsgICAgIC8vIFVzZSBkZWZhdWx0IHRocmVzaG9sZAorICAgIEluZGV4IG1fbm9uemVyb3Bpdm90czsgICAgICAgICAgLy8gTnVtYmVyIG9mIG5vbiB6ZXJvIHBpdm90cyBmb3VuZAorICAgIEluZGV4VmVjdG9yIG1fZXRyZWU7ICAgICAgICAgICAgLy8gQ29sdW1uIGVsaW1pbmF0aW9uIHRyZWUKKyAgICBJbmRleFZlY3RvciBtX2ZpcnN0Um93RWx0OyAgICAgIC8vIEZpcnN0IGVsZW1lbnQgaW4gZWFjaCByb3cKKyAgICBib29sIG1faXNRU29ydGVkOyAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgUSBpcyBzb3J0ZWQgb3Igbm90CisgICAgYm9vbCBtX2lzRXRyZWVPazsgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZSBlbGltaW5hdGlvbiB0cmVlIG1hdGNoIHRoZSBpbml0aWFsIGlucHV0IG1hdHJpeAorICAgIAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUgPiBmcmllbmQgc3RydWN0IFNwYXJzZVFSX1FQcm9kdWN0OworICAgIAorfTsKKworLyoqIFxicmllZiBQcmVwcm9jZXNzaW5nIHN0ZXAgb2YgYSBRUiBmYWN0b3JpemF0aW9uIAorICAqIAorICAqIFx3YXJuaW5nIFRoZSBtYXRyaXggXGEgbWF0IG11c3QgYmUgaW4gY29tcHJlc3NlZCBtb2RlIChzZWUgU3BhcnNlTWF0cml4OjptYWtlQ29tcHJlc3NlZCgpKS4KKyAgKiAKKyAgKiBJbiB0aGlzIHN0ZXAsIHRoZSBmaWxsLXJlZHVjaW5nIHBlcm11dGF0aW9uIGlzIGNvbXB1dGVkIGFuZCBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zIG9mIEEKKyAgKiBhbmQgdGhlIGNvbHVtbiBlbGltaW5hdGlvbiB0cmVlIGlzIGNvbXB1dGVkIGFzIHdlbGwuIE9ubHkgdGhlIHNwYXJzaXR5IHBhdHRlcm4gb2YgXGEgbWF0IGlzIGV4cGxvaXRlZC4KKyAgKiAKKyAgKiBcbm90ZSBJbiB0aGlzIHN0ZXAgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIGlzIG5vIGVtcHR5IHJvdyBpbiB0aGUgbWF0cml4IFxhIG1hdC4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPcmRlcmluZ1R5cGU+Cit2b2lkIFNwYXJzZVFSPE1hdHJpeFR5cGUsT3JkZXJpbmdUeXBlPjo6YW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0KQoreworICBlaWdlbl9hc3NlcnQobWF0LmlzQ29tcHJlc3NlZCgpICYmICJTcGFyc2VRUiByZXF1aXJlcyBhIHNwYXJzZSBtYXRyaXggaW4gY29tcHJlc3NlZCBtb2RlLiBDYWxsIC5tYWtlQ29tcHJlc3NlZCgpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIFNwYXJzZVFSIik7CisgIC8vIENvcHkgdG8gYSBjb2x1bW4gbWFqb3IgbWF0cml4IGlmIHRoZSBpbnB1dCBpcyByb3dtYWpvcgorICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TWF0cml4VHlwZTo6SXNSb3dNYWpvcixRUk1hdHJpeFR5cGUsY29uc3QgTWF0cml4VHlwZSY+Ojp0eXBlIG1hdENweShtYXQpOworICAvLyBDb21wdXRlIHRoZSBjb2x1bW4gZmlsbCByZWR1Y2luZyBvcmRlcmluZworICBPcmRlcmluZ1R5cGUgb3JkOyAKKyAgb3JkKG1hdENweSwgbV9wZXJtX2MpOyAKKyAgSW5kZXggbiA9IG1hdC5jb2xzKCk7CisgIEluZGV4IG0gPSBtYXQucm93cygpOworICBJbmRleCBkaWFnU2l6ZSA9IChzdGQ6Om1pbikobSxuKTsKKyAgCisgIGlmICghbV9wZXJtX2Muc2l6ZSgpKQorICB7CisgICAgbV9wZXJtX2MucmVzaXplKG4pOworICAgIG1fcGVybV9jLmluZGljZXMoKS5zZXRMaW5TcGFjZWQobiwgMCxTdG9yYWdlSW5kZXgobi0xKSk7CisgIH0KKyAgCisgIC8vIENvbXB1dGUgdGhlIGNvbHVtbiBlbGltaW5hdGlvbiB0cmVlIG9mIHRoZSBwZXJtdXRlZCBtYXRyaXgKKyAgbV9vdXRwdXRQZXJtX2MgPSBtX3Blcm1fYy5pbnZlcnNlKCk7CisgIGludGVybmFsOjpjb2xldHJlZShtYXRDcHksIG1fZXRyZWUsIG1fZmlyc3RSb3dFbHQsIG1fb3V0cHV0UGVybV9jLmluZGljZXMoKS5kYXRhKCkpOworICBtX2lzRXRyZWVPayA9IHRydWU7CisgIAorICBtX1IucmVzaXplKG0sIG4pOworICBtX1EucmVzaXplKG0sIGRpYWdTaXplKTsKKyAgCisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBub256ZXJvIGVsZW1lbnRzIDogcm91Z2ggZXN0aW1hdGlvbgorICBtX1IucmVzZXJ2ZSgyKm1hdC5ub25aZXJvcygpKTsgLy9GSVhNRSBHZXQgYSBtb3JlIGFjY3VyYXRlIGVzdGltYXRpb24gdGhyb3VnaCBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIHdpdGggdGhlIGV0cmVlCisgIG1fUS5yZXNlcnZlKDIqbWF0Lm5vblplcm9zKCkpOworICBtX2hjb2VmZnMucmVzaXplKGRpYWdTaXplKTsKKyAgbV9hbmFseXNpc0lzb2sgPSB0cnVlOworfQorCisvKiogXGJyaWVmIFBlcmZvcm1zIHRoZSBudW1lcmljYWwgUVIgZmFjdG9yaXphdGlvbiBvZiB0aGUgaW5wdXQgbWF0cml4CisgICogCisgICogVGhlIGZ1bmN0aW9uIFNwYXJzZVFSOjphbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJikgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZWhhbmQgd2l0aAorICAqIGEgbWF0cml4IGhhdmluZyB0aGUgc2FtZSBzcGFyc2l0eSBwYXR0ZXJuIHRoYW4gXGEgbWF0LgorICAqIAorICAqIFxwYXJhbSBtYXQgVGhlIHNwYXJzZSBjb2x1bW4tbWFqb3IgbWF0cml4CisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgT3JkZXJpbmdUeXBlPgordm9pZCBTcGFyc2VRUjxNYXRyaXhUeXBlLE9yZGVyaW5nVHlwZT46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBtYXQpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICAKKyAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc29rICYmICJhbmFseXplUGF0dGVybigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgc3RlcCIpOworICBTdG9yYWdlSW5kZXggbSA9IFN0b3JhZ2VJbmRleChtYXQucm93cygpKTsKKyAgU3RvcmFnZUluZGV4IG4gPSBTdG9yYWdlSW5kZXgobWF0LmNvbHMoKSk7CisgIFN0b3JhZ2VJbmRleCBkaWFnU2l6ZSA9IChzdGQ6Om1pbikobSxuKTsKKyAgSW5kZXhWZWN0b3IgbWFyaygoc3RkOjptYXgpKG0sbikpOyBtYXJrLnNldENvbnN0YW50KC0xKTsgIC8vIFJlY29yZCB0aGUgdmlzaXRlZCBub2RlcworICBJbmRleFZlY3RvciBSaWR4KG4pLCBRaWR4KG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGVtcG9yYXJpbHkgdGhlIHJvdyBpbmRleGVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4gb2YgUiBhbmQgUQorICBJbmRleCBuemNvbFIsIG56Y29sUTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG5vbnplcm8gZm9yIHRoZSBjdXJyZW50IGNvbHVtbiBvZiBSIGFuZCBRCisgIFNjYWxhclZlY3RvciB0dmFsKG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVuc2UgdmVjdG9yIHVzZWQgdG8gY29tcHV0ZSB0aGUgY3VycmVudCBjb2x1bW4KKyAgUmVhbFNjYWxhciBwaXZvdFRocmVzaG9sZCA9IG1fdGhyZXNob2xkOworICAKKyAgbV9SLnNldFplcm8oKTsKKyAgbV9RLnNldFplcm8oKTsKKyAgbV9wbWF0ID0gbWF0OworICBpZighbV9pc0V0cmVlT2spCisgIHsKKyAgICBtX291dHB1dFBlcm1fYyA9IG1fcGVybV9jLmludmVyc2UoKTsKKyAgICBpbnRlcm5hbDo6Y29sZXRyZWUobV9wbWF0LCBtX2V0cmVlLCBtX2ZpcnN0Um93RWx0LCBtX291dHB1dFBlcm1fYy5pbmRpY2VzKCkuZGF0YSgpKTsKKyAgICBtX2lzRXRyZWVPayA9IHRydWU7CisgIH0KKworICBtX3BtYXQudW5jb21wcmVzcygpOyAvLyBUbyBoYXZlIHRoZSBpbm5lck5vblplcm9QdHIgYWxsb2NhdGVkCisgIAorICAvLyBBcHBseSB0aGUgZmlsbC1pbiByZWR1Y2luZyBwZXJtdXRhdGlvbiBsYXppbHk6CisgIHsKKyAgICAvLyBJZiB0aGUgaW5wdXQgaXMgcm93IG1ham9yLCBjb3B5IHRoZSBvcmlnaW5hbCBjb2x1bW4gaW5kaWNlcywKKyAgICAvLyBvdGhlcndpc2UgZGlyZWN0bHkgdXNlIHRoZSBpbnB1dCBtYXRyaXgKKyAgICAvLyAKKyAgICBJbmRleFZlY3RvciBvcmlnaW5hbE91dGVySW5kaWNlc0NweTsKKyAgICBjb25zdCBTdG9yYWdlSW5kZXggKm9yaWdpbmFsT3V0ZXJJbmRpY2VzID0gbWF0Lm91dGVySW5kZXhQdHIoKTsKKyAgICBpZihNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgIHsKKyAgICAgIG9yaWdpbmFsT3V0ZXJJbmRpY2VzQ3B5ID0gSW5kZXhWZWN0b3I6Ok1hcChtX3BtYXQub3V0ZXJJbmRleFB0cigpLG4rMSk7CisgICAgICBvcmlnaW5hbE91dGVySW5kaWNlcyA9IG9yaWdpbmFsT3V0ZXJJbmRpY2VzQ3B5LmRhdGEoKTsKKyAgICB9CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgSW5kZXggcCA9IG1fcGVybV9jLnNpemUoKSA/IG1fcGVybV9jLmluZGljZXMoKShpKSA6IGk7CisgICAgICBtX3BtYXQub3V0ZXJJbmRleFB0cigpW3BdID0gb3JpZ2luYWxPdXRlckluZGljZXNbaV07IAorICAgICAgbV9wbWF0LmlubmVyTm9uWmVyb1B0cigpW3BdID0gb3JpZ2luYWxPdXRlckluZGljZXNbaSsxXSAtIG9yaWdpbmFsT3V0ZXJJbmRpY2VzW2ldOyAKKyAgICB9CisgIH0KKyAgCisgIC8qIENvbXB1dGUgdGhlIGRlZmF1bHQgdGhyZXNob2xkIGFzIGluIE1hdExhYiwgc2VlOgorICAgKiBUaW0gRGF2aXMsICJBbGdvcml0aG0gOTE1LCBTdWl0ZVNwYXJzZVFSOiBNdWx0aWZyb250YWwgTXVsdGl0aHJlYWRlZCBSYW5rLVJldmVhbGluZworICAgKiBTcGFyc2UgUVIgRmFjdG9yaXphdGlvbiwgQUNNIFRyYW5zLiBvbiBNYXRoLiBTb2Z0LiAzOCgxKSwgMjAxMSwgUGFnZSA4OjMgCisgICAqLworICBpZihtX3VzZURlZmF1bHRUaHJlc2hvbGQpIAorICB7CisgICAgUmVhbFNjYWxhciBtYXgyTm9ybSA9IDAuMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgbWF4Mk5vcm0gPSBudW1leHQ6Om1heGkobWF4Mk5vcm0sIG1fcG1hdC5jb2woaikubm9ybSgpKTsKKyAgICBpZihtYXgyTm9ybT09UmVhbFNjYWxhcigwKSkKKyAgICAgIG1heDJOb3JtID0gUmVhbFNjYWxhcigxKTsKKyAgICBwaXZvdFRocmVzaG9sZCA9IDIwICogKG0gKyBuKSAqIG1heDJOb3JtICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCk7CisgIH0KKyAgCisgIC8vIEluaXRpYWxpemUgdGhlIG51bWVyaWNhbCBwZXJtdXRhdGlvbgorICBtX3Bpdm90cGVybS5zZXRJZGVudGl0eShuKTsKKyAgCisgIFN0b3JhZ2VJbmRleCBub256ZXJvQ29sID0gMDsgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgdmFsaWQgcGl2b3RzCisgIG1fUS5zdGFydFZlYygwKTsKKworICAvLyBMZWZ0IGxvb2tpbmcgcmFuay1yZXZlYWxpbmcgUVIgZmFjdG9yaXphdGlvbjogY29tcHV0ZSBhIGNvbHVtbiBvZiBSIGFuZCBRIGF0IGEgdGltZQorICBmb3IgKFN0b3JhZ2VJbmRleCBjb2wgPSAwOyBjb2wgPCBuOyArK2NvbCkKKyAgeworICAgIG1hcmsuc2V0Q29uc3RhbnQoLTEpOworICAgIG1fUi5zdGFydFZlYyhjb2wpOworICAgIG1hcmsobm9uemVyb0NvbCkgPSBjb2w7CisgICAgUWlkeCgwKSA9IG5vbnplcm9Db2w7CisgICAgbnpjb2xSID0gMDsgbnpjb2xRID0gMTsKKyAgICBib29sIGZvdW5kX2RpYWcgPSBub256ZXJvQ29sPj1tOworICAgIHR2YWwuc2V0WmVybygpOyAKKyAgICAKKyAgICAvLyBTeW1ib2xpYyBmYWN0b3JpemF0aW9uOiBmaW5kIHRoZSBub256ZXJvIGxvY2F0aW9ucyBvZiB0aGUgY29sdW1uIGsgb2YgdGhlIGZhY3RvcnMgUiBhbmQgUSwgaS5lLiwKKyAgICAvLyBhbGwgdGhlIG5vZGVzICh3aXRoIGluZGV4ZXMgbG93ZXIgdGhhbiByYW5rKSByZWFjaGFibGUgdGhyb3VnaCB0aGUgY29sdW1uIGVsaW1pbmF0aW9uIHRyZWUgKGV0cmVlKSByb290ZWQgYXQgbm9kZSBrLgorICAgIC8vIE5vdGU6IGlmIHRoZSBkaWFnb25hbCBlbnRyeSBkb2VzIG5vdCBleGlzdCwgdGhlbiBpdHMgY29udHJpYnV0aW9uIG11c3QgYmUgZXhwbGljaXRseSBhZGRlZCwKKyAgICAvLyB0aHVzIHRoZSB0cmljayB3aXRoIGZvdW5kX2RpYWcgdGhhdCBwZXJtaXRzIHRvIGRvIG9uZSBtb3JlIGl0ZXJhdGlvbiBvbiB0aGUgZGlhZ29uYWwgZWxlbWVudCBpZiB0aGlzIG9uZSBoYXMgbm90IGJlZW4gZm91bmQuCisgICAgZm9yICh0eXBlbmFtZSBRUk1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXRwKG1fcG1hdCwgY29sKTsgaXRwIHx8ICFmb3VuZF9kaWFnOyArK2l0cCkKKyAgICB7CisgICAgICBTdG9yYWdlSW5kZXggY3VySWR4ID0gbm9uemVyb0NvbDsKKyAgICAgIGlmKGl0cCkgY3VySWR4ID0gU3RvcmFnZUluZGV4KGl0cC5yb3coKSk7CisgICAgICBpZihjdXJJZHggPT0gbm9uemVyb0NvbCkgZm91bmRfZGlhZyA9IHRydWU7CisgICAgICAKKyAgICAgIC8vIEdldCB0aGUgbm9uemVyb3MgaW5kZXhlcyBvZiB0aGUgY3VycmVudCBjb2x1bW4gb2YgUgorICAgICAgU3RvcmFnZUluZGV4IHN0ID0gbV9maXJzdFJvd0VsdChjdXJJZHgpOyAvLyBUaGUgdHJhdmVyc2FsIG9mIHRoZSBldHJlZSBzdGFydHMgaGVyZQorICAgICAgaWYgKHN0IDwgMCApCisgICAgICB7CisgICAgICAgIG1fbGFzdEVycm9yID0gIkVtcHR5IHJvdyBmb3VuZCBkdXJpbmcgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24iOworICAgICAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gVHJhdmVyc2UgdGhlIGV0cmVlIAorICAgICAgSW5kZXggYmkgPSBuemNvbFI7CisgICAgICBmb3IgKDsgbWFyayhzdCkgIT0gY29sOyBzdCA9IG1fZXRyZWUoc3QpKQorICAgICAgeworICAgICAgICBSaWR4KG56Y29sUikgPSBzdDsgIC8vIEFkZCB0aGlzIHJvdyB0byB0aGUgbGlzdCwKKyAgICAgICAgbWFyayhzdCkgPSBjb2w7ICAgICAvLyBhbmQgbWFyayB0aGlzIHJvdyBhcyB2aXNpdGVkCisgICAgICAgIG56Y29sUisrOworICAgICAgfQorCisgICAgICAvLyBSZXZlcnNlIHRoZSBsaXN0IHRvIGdldCB0aGUgdG9wb2xvZ2ljYWwgb3JkZXJpbmcKKyAgICAgIEluZGV4IG50ID0gbnpjb2xSLWJpOworICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbnQvMjsgaSsrKSBzdGQ6OnN3YXAoUmlkeChiaStpKSwgUmlkeChuemNvbFItaS0xKSk7CisgICAgICAgCisgICAgICAvLyBDb3B5IHRoZSBjdXJyZW50IChjdXJJZHgscGNvbCkgdmFsdWUgb2YgdGhlIGlucHV0IG1hdHJpeAorICAgICAgaWYoaXRwKSB0dmFsKGN1cklkeCkgPSBpdHAudmFsdWUoKTsKKyAgICAgIGVsc2UgICAgdHZhbChjdXJJZHgpID0gU2NhbGFyKDApOworICAgICAgCisgICAgICAvLyBDb21wdXRlIHRoZSBwYXR0ZXJuIG9mIFEoOixrKQorICAgICAgaWYoY3VySWR4ID4gbm9uemVyb0NvbCAmJiBtYXJrKGN1cklkeCkgIT0gY29sICkgCisgICAgICB7CisgICAgICAgIFFpZHgobnpjb2xRKSA9IGN1cklkeDsgIC8vIEFkZCB0aGlzIHJvdyB0byB0aGUgcGF0dGVybiBvZiBRLAorICAgICAgICBtYXJrKGN1cklkeCkgPSBjb2w7ICAgICAvLyBhbmQgbWFyayBpdCBhcyB2aXNpdGVkCisgICAgICAgIG56Y29sUSsrOworICAgICAgfQorICAgIH0KKworICAgIC8vIEJyb3dzZSBhbGwgdGhlIGluZGV4ZXMgb2YgUig6LGNvbCkgaW4gcmV2ZXJzZSBvcmRlcgorICAgIGZvciAoSW5kZXggaSA9IG56Y29sUi0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBJbmRleCBjdXJJZHggPSBSaWR4KGkpOworICAgICAgCisgICAgICAvLyBBcHBseSB0aGUgY3VySWR4LXRoIGhvdXNlaG9sZGVyIHZlY3RvciB0byB0aGUgY3VycmVudCBjb2x1bW4gKHRlbXBvcmFyaWx5IHN0b3JlZCBpbnRvIHR2YWwpCisgICAgICBTY2FsYXIgdGRvdCgwKTsKKyAgICAgIAorICAgICAgLy8gRmlyc3QgY29tcHV0ZSBxJyAqIHR2YWwKKyAgICAgIHRkb3QgPSBtX1EuY29sKGN1cklkeCkuZG90KHR2YWwpOworCisgICAgICB0ZG90ICo9IG1faGNvZWZmcyhjdXJJZHgpOworICAgICAgCisgICAgICAvLyBUaGVuIHVwZGF0ZSB0dmFsID0gdHZhbCAtIHEgKiB0YXUKKyAgICAgIC8vIEZJWE1FOiB0dmFsIC09IHRkb3QgKiBtX1EuY29sKGN1cklkeCkgc2hvdWxkIGFtb3VudCB0byB0aGUgc2FtZSAobmVlZCB0byBjaGVjay9hZGQgc3VwcG9ydCBmb3IgZWZmaWNpZW50ICJkZW5zZSA/PSBzcGFyc2UiKQorICAgICAgZm9yICh0eXBlbmFtZSBRUk1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXRxKG1fUSwgY3VySWR4KTsgaXRxOyArK2l0cSkKKyAgICAgICAgdHZhbChpdHEucm93KCkpIC09IGl0cS52YWx1ZSgpICogdGRvdDsKKworICAgICAgLy8gRGV0ZWN0IGZpbGwtaW4gZm9yIHRoZSBjdXJyZW50IGNvbHVtbiBvZiBRCisgICAgICBpZihtX2V0cmVlKFJpZHgoaSkpID09IG5vbnplcm9Db2wpCisgICAgICB7CisgICAgICAgIGZvciAodHlwZW5hbWUgUVJNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0cShtX1EsIGN1cklkeCk7IGl0cTsgKytpdHEpCisgICAgICAgIHsKKyAgICAgICAgICBTdG9yYWdlSW5kZXggaVEgPSBTdG9yYWdlSW5kZXgoaXRxLnJvdygpKTsKKyAgICAgICAgICBpZiAobWFyayhpUSkgIT0gY29sKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFFpZHgobnpjb2xRKyspID0gaVE7ICAvLyBBZGQgdGhpcyByb3cgdG8gdGhlIHBhdHRlcm4gb2YgUSwKKyAgICAgICAgICAgIG1hcmsoaVEpID0gY29sOyAgICAgICAvLyBhbmQgbWFyayBpdCBhcyB2aXNpdGVkCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSAvLyBFbmQgdXBkYXRlIGN1cnJlbnQgY29sdW1uCisgICAgCisgICAgU2NhbGFyIHRhdSA9IFJlYWxTY2FsYXIoMCk7CisgICAgUmVhbFNjYWxhciBiZXRhID0gMDsKKyAgICAKKyAgICBpZihub256ZXJvQ29sIDwgZGlhZ1NpemUpCisgICAgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiB0aGF0IGVsaW1pbmF0ZSB0aGUgY3VycmVudCBjb2x1bW4KKyAgICAgIC8vIEZJWE1FIHRoaXMgc3RlcCBzaG91bGQgY2FsbCB0aGUgSG91c2Vob2xkZXIgbW9kdWxlLgorICAgICAgU2NhbGFyIGMwID0gbnpjb2xRID8gdHZhbChRaWR4KDApKSA6IFNjYWxhcigwKTsKKyAgICAgIAorICAgICAgLy8gRmlyc3QsIHRoZSBzcXVhcmVkIG5vcm0gb2YgUSgoY29sKzEpOm0sIGNvbCkKKyAgICAgIFJlYWxTY2FsYXIgc3FyTm9ybSA9IDAuOworICAgICAgZm9yIChJbmRleCBpdHEgPSAxOyBpdHEgPCBuemNvbFE7ICsraXRxKSBzcXJOb3JtICs9IG51bWV4dDo6YWJzMih0dmFsKFFpZHgoaXRxKSkpOworICAgICAgaWYoc3FyTm9ybSA9PSBSZWFsU2NhbGFyKDApICYmIG51bWV4dDo6aW1hZyhjMCkgPT0gUmVhbFNjYWxhcigwKSkKKyAgICAgIHsKKyAgICAgICAgYmV0YSA9IG51bWV4dDo6cmVhbChjMCk7CisgICAgICAgIHR2YWwoUWlkeCgwKSkgPSAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgICAgIGJldGEgPSBzcXJ0KG51bWV4dDo6YWJzMihjMCkgKyBzcXJOb3JtKTsKKyAgICAgICAgaWYobnVtZXh0OjpyZWFsKGMwKSA+PSBSZWFsU2NhbGFyKDApKQorICAgICAgICAgIGJldGEgPSAtYmV0YTsKKyAgICAgICAgdHZhbChRaWR4KDApKSA9IDE7CisgICAgICAgIGZvciAoSW5kZXggaXRxID0gMTsgaXRxIDwgbnpjb2xROyArK2l0cSkKKyAgICAgICAgICB0dmFsKFFpZHgoaXRxKSkgLz0gKGMwIC0gYmV0YSk7CisgICAgICAgIHRhdSA9IG51bWV4dDo6Y29uaigoYmV0YS1jMCkgLyBiZXRhKTsKKyAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnNlcnQgdmFsdWVzIGluIFIKKyAgICBmb3IgKEluZGV4ICBpID0gbnpjb2xSLTE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIEluZGV4IGN1cklkeCA9IFJpZHgoaSk7CisgICAgICBpZihjdXJJZHggPCBub256ZXJvQ29sKSAKKyAgICAgIHsKKyAgICAgICAgbV9SLmluc2VydEJhY2tCeU91dGVySW5uZXJVbm9yZGVyZWQoY29sLCBjdXJJZHgpID0gdHZhbChjdXJJZHgpOworICAgICAgICB0dmFsKGN1cklkeCkgPSBTY2FsYXIoMC4pOworICAgICAgfQorICAgIH0KKworICAgIGlmKG5vbnplcm9Db2wgPCBkaWFnU2l6ZSAmJiBhYnMoYmV0YSkgPj0gcGl2b3RUaHJlc2hvbGQpCisgICAgeworICAgICAgbV9SLmluc2VydEJhY2tCeU91dGVySW5uZXIoY29sLCBub256ZXJvQ29sKSA9IGJldGE7CisgICAgICAvLyBUaGUgaG91c2Vob2xkZXIgY29lZmZpY2llbnQKKyAgICAgIG1faGNvZWZmcyhub256ZXJvQ29sKSA9IHRhdTsKKyAgICAgIC8vIFJlY29yZCB0aGUgaG91c2Vob2xkZXIgcmVmbGVjdGlvbnMKKyAgICAgIGZvciAoSW5kZXggaXRxID0gMDsgaXRxIDwgbnpjb2xROyArK2l0cSkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaVEgPSBRaWR4KGl0cSk7CisgICAgICAgIG1fUS5pbnNlcnRCYWNrQnlPdXRlcklubmVyVW5vcmRlcmVkKG5vbnplcm9Db2wsaVEpID0gdHZhbChpUSk7CisgICAgICAgIHR2YWwoaVEpID0gU2NhbGFyKDAuKTsKKyAgICAgIH0KKyAgICAgIG5vbnplcm9Db2wrKzsKKyAgICAgIGlmKG5vbnplcm9Db2w8ZGlhZ1NpemUpCisgICAgICAgIG1fUS5zdGFydFZlYyhub256ZXJvQ29sKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIFplcm8gcGl2b3QgZm91bmQ6IG1vdmUgaW1wbGljaXRseSB0aGlzIGNvbHVtbiB0byB0aGUgZW5kCisgICAgICBmb3IgKEluZGV4IGogPSBub256ZXJvQ29sOyBqIDwgbi0xOyBqKyspIAorICAgICAgICBzdGQ6OnN3YXAobV9waXZvdHBlcm0uaW5kaWNlcygpKGopLCBtX3Bpdm90cGVybS5pbmRpY2VzKClbaisxXSk7CisgICAgICAKKyAgICAgIC8vIFJlY29tcHV0ZSB0aGUgY29sdW1uIGVsaW1pbmF0aW9uIHRyZWUKKyAgICAgIGludGVybmFsOjpjb2xldHJlZShtX3BtYXQsIG1fZXRyZWUsIG1fZmlyc3RSb3dFbHQsIG1fcGl2b3RwZXJtLmluZGljZXMoKS5kYXRhKCkpOworICAgICAgbV9pc0V0cmVlT2sgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgCisgIG1faGNvZWZmcy50YWlsKGRpYWdTaXplLW5vbnplcm9Db2wpLnNldFplcm8oKTsKKyAgCisgIC8vIEZpbmFsaXplIHRoZSBjb2x1bW4gcG9pbnRlcnMgb2YgdGhlIHNwYXJzZSBtYXRyaWNlcyBSIGFuZCBRCisgIG1fUS5maW5hbGl6ZSgpOworICBtX1EubWFrZUNvbXByZXNzZWQoKTsKKyAgbV9SLmZpbmFsaXplKCk7CisgIG1fUi5tYWtlQ29tcHJlc3NlZCgpOworICBtX2lzUVNvcnRlZCA9IGZhbHNlOworCisgIG1fbm9uemVyb3Bpdm90cyA9IG5vbnplcm9Db2w7CisgIAorICBpZihub256ZXJvQ29sPG4pCisgIHsKKyAgICAvLyBQZXJtdXRlIHRoZSB0cmlhbmd1bGFyIGZhY3RvciB0byBwdXQgdGhlICdkZWFkJyBjb2x1bW5zIHRvIHRoZSBlbmQKKyAgICBRUk1hdHJpeFR5cGUgdGVtcFIobV9SKTsKKyAgICBtX1IgPSB0ZW1wUiAqIG1fcGl2b3RwZXJtOworICAgIAorICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIHBlcm11dGF0aW9uCisgICAgbV9vdXRwdXRQZXJtX2MgPSBtX291dHB1dFBlcm1fYyAqIG1fcGl2b3RwZXJtOworICB9CisgIAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyAKKyAgbV9mYWN0b3JpemF0aW9uSXNvayA9IHRydWU7CisgIG1faW5mbyA9IFN1Y2Nlc3M7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFyc2VRUlR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgU3BhcnNlUVJfUVByb2R1Y3QgOiBSZXR1cm5CeVZhbHVlPFNwYXJzZVFSX1FQcm9kdWN0PFNwYXJzZVFSVHlwZSwgRGVyaXZlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVFSVHlwZTo6UVJNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlUVJUeXBlOjpTY2FsYXIgU2NhbGFyOworICAvLyBHZXQgdGhlIHJlZmVyZW5jZXMgCisgIFNwYXJzZVFSX1FQcm9kdWN0KGNvbnN0IFNwYXJzZVFSVHlwZSYgcXIsIGNvbnN0IERlcml2ZWQmIG90aGVyLCBib29sIHRyYW5zcG9zZSkgOiAKKyAgbV9xcihxciksbV9vdGhlcihvdGhlciksbV90cmFuc3Bvc2UodHJhbnNwb3NlKSB7fQorICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNwb3NlID8gbV9xci5yb3dzKCkgOiBtX3FyLmNvbHMoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fb3RoZXIuY29scygpOyB9CisgIAorICAvLyBBc3NpZ24gdG8gYSB2ZWN0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzVHlwZT4KKyAgdm9pZCBldmFsVG8oRGVzVHlwZSYgcmVzKSBjb25zdAorICB7CisgICAgSW5kZXggbSA9IG1fcXIucm93cygpOworICAgIEluZGV4IG4gPSBtX3FyLmNvbHMoKTsKKyAgICBJbmRleCBkaWFnU2l6ZSA9IChzdGQ6Om1pbikobSxuKTsKKyAgICByZXMgPSBtX290aGVyOworICAgIGlmIChtX3RyYW5zcG9zZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9xci5tX1Eucm93cygpID09IG1fb3RoZXIucm93cygpICYmICJOb24gY29uZm9ybWluZyBvYmplY3Qgc2l6ZXMiKTsKKyAgICAgIC8vQ29tcHV0ZSByZXMgPSBRJyAqIG90aGVyIGNvbHVtbiBieSBjb2x1bW4KKyAgICAgIGZvcihJbmRleCBqID0gMDsgaiA8IHJlcy5jb2xzKCk7IGorKyl7CisgICAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBkaWFnU2l6ZTsgaysrKQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIHRhdSA9IFNjYWxhcigwKTsKKyAgICAgICAgICB0YXUgPSBtX3FyLm1fUS5jb2woaykuZG90KHJlcy5jb2woaikpOworICAgICAgICAgIGlmKHRhdT09U2NhbGFyKDApKSBjb250aW51ZTsKKyAgICAgICAgICB0YXUgPSB0YXUgKiBtX3FyLm1faGNvZWZmcyhrKTsKKyAgICAgICAgICByZXMuY29sKGopIC09IHRhdSAqIG1fcXIubV9RLmNvbChrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fcXIubV9RLnJvd3MoKSA9PSBtX290aGVyLnJvd3MoKSAmJiAiTm9uIGNvbmZvcm1pbmcgb2JqZWN0IHNpemVzIik7CisgICAgICAvLyBDb21wdXRlIHJlcyA9IFEgKiBvdGhlciBjb2x1bW4gYnkgY29sdW1uCisgICAgICBmb3IoSW5kZXggaiA9IDA7IGogPCByZXMuY29scygpOyBqKyspCisgICAgICB7CisgICAgICAgIGZvciAoSW5kZXggayA9IGRpYWdTaXplLTE7IGsgPj0wOyBrLS0pCisgICAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgdGF1ID0gU2NhbGFyKDApOworICAgICAgICAgIHRhdSA9IG1fcXIubV9RLmNvbChrKS5kb3QocmVzLmNvbChqKSk7CisgICAgICAgICAgaWYodGF1PT1TY2FsYXIoMCkpIGNvbnRpbnVlOworICAgICAgICAgIHRhdSA9IHRhdSAqIG1fcXIubV9oY29lZmZzKGspOworICAgICAgICAgIHJlcy5jb2woaikgLT0gdGF1ICogbV9xci5tX1EuY29sKGspOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBjb25zdCBTcGFyc2VRUlR5cGUmIG1fcXI7CisgIGNvbnN0IERlcml2ZWQmIG1fb3RoZXI7CisgIGJvb2wgbV90cmFuc3Bvc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VRUlR5cGU+CitzdHJ1Y3QgU3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZSA6IHB1YmxpYyBFaWdlbkJhc2U8U3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZTxTcGFyc2VRUlR5cGU+ID4KK3sgIAorICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVFSVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMKKyAgfTsKKyAgZXhwbGljaXQgU3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZShjb25zdCBTcGFyc2VRUlR5cGUmIHFyKSA6IG1fcXIocXIpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIFNwYXJzZVFSX1FQcm9kdWN0PFNwYXJzZVFSVHlwZSwgRGVyaXZlZD4gb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgcmV0dXJuIFNwYXJzZVFSX1FQcm9kdWN0PFNwYXJzZVFSVHlwZSxEZXJpdmVkPihtX3FyLG90aGVyLmRlcml2ZWQoKSxmYWxzZSk7CisgIH0KKyAgU3BhcnNlUVJNYXRyaXhRVHJhbnNwb3NlUmV0dXJuVHlwZTxTcGFyc2VRUlR5cGU+IGFkam9pbnQoKSBjb25zdAorICB7CisgICAgcmV0dXJuIFNwYXJzZVFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPihtX3FyKTsKKyAgfQorICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcXIucm93cygpOyB9CisgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gKHN0ZDo6bWluKShtX3FyLnJvd3MoKSxtX3FyLmNvbHMoKSk7IH0KKyAgLy8gVG8gdXNlIGZvciBvcGVyYXRpb25zIHdpdGggdGhlIHRyYW5zcG9zZSBvZiBRCisgIFNwYXJzZVFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPiB0cmFuc3Bvc2UoKSBjb25zdAorICB7CisgICAgcmV0dXJuIFNwYXJzZVFSTWF0cml4UVRyYW5zcG9zZVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPihtX3FyKTsKKyAgfQorICBjb25zdCBTcGFyc2VRUlR5cGUmIG1fcXI7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VRUlR5cGU+CitzdHJ1Y3QgU3BhcnNlUVJNYXRyaXhRVHJhbnNwb3NlUmV0dXJuVHlwZQoreworICBleHBsaWNpdCBTcGFyc2VRUk1hdHJpeFFUcmFuc3Bvc2VSZXR1cm5UeXBlKGNvbnN0IFNwYXJzZVFSVHlwZSYgcXIpIDogbV9xcihxcikge30KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgU3BhcnNlUVJfUVByb2R1Y3Q8U3BhcnNlUVJUeXBlLERlcml2ZWQ+IG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBvdGhlcikKKyAgeworICAgIHJldHVybiBTcGFyc2VRUl9RUHJvZHVjdDxTcGFyc2VRUlR5cGUsRGVyaXZlZD4obV9xcixvdGhlci5kZXJpdmVkKCksIHRydWUpOworICB9CisgIGNvbnN0IFNwYXJzZVFSVHlwZSYgbV9xcjsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlUVJUeXBlPgorc3RydWN0IGV2YWx1YXRvcl90cmFpdHM8U3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZTxTcGFyc2VRUlR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VRUlR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdG9yYWdlX2tpbmRfdG9fZXZhbHVhdG9yX2tpbmQ8dHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUtpbmQ+OjpLaW5kIEtpbmQ7CisgIHR5cGVkZWYgU3BhcnNlU2hhcGUgU2hhcGU7Cit9OworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3BhcnNlUVJUeXBlPgorc3RydWN0IEFzc2lnbm1lbnQ8RHN0WHByVHlwZSwgU3BhcnNlUVJNYXRyaXhRUmV0dXJuVHlwZTxTcGFyc2VRUlR5cGU+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXI+LCBTcGFyc2UyU3BhcnNlPgoreworICB0eXBlZGVmIFNwYXJzZVFSTWF0cml4UVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPiBTcmNYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeworICAgIHR5cGVuYW1lIERzdFhwclR5cGU6OlBsYWluT2JqZWN0IGlkTWF0KHNyYy5tX3FyLnJvd3MoKSwgc3JjLm1fcXIucm93cygpKTsKKyAgICBpZE1hdC5zZXRJZGVudGl0eSgpOworICAgIC8vIFNvcnQgdGhlIHNwYXJzZSBob3VzZWhvbGRlciByZWZsZWN0b3JzIGlmIG5lZWRlZAorICAgIGNvbnN0X2Nhc3Q8U3BhcnNlUVJUeXBlICo+KCZzcmMubV9xciktPl9zb3J0X21hdHJpeF9RKCk7CisgICAgZHN0ID0gU3BhcnNlUVJfUVByb2R1Y3Q8U3BhcnNlUVJUeXBlLCBEc3RYcHJUeXBlPihzcmMubV9xciwgaWRNYXQsIGZhbHNlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNwYXJzZVFSVHlwZT4KK3N0cnVjdCBBc3NpZ25tZW50PERzdFhwclR5cGUsIFNwYXJzZVFSTWF0cml4UVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyPiwgU3BhcnNlMkRlbnNlPgoreworICB0eXBlZGVmIFNwYXJzZVFSTWF0cml4UVJldHVyblR5cGU8U3BhcnNlUVJUeXBlPiBTcmNYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgc3RhdGljIHZvaWQgcnVuKERzdFhwclR5cGUgJmRzdCwgY29uc3QgU3JjWHByVHlwZSAmc3JjLCBjb25zdCBpbnRlcm5hbDo6YXNzaWduX29wPFNjYWxhcixTY2FsYXI+ICYvKmZ1bmMqLykKKyAgeworICAgIGRzdCA9IHNyYy5tX3FyLm1hdHJpeFEoKSAqIERzdFhwclR5cGU6OklkZW50aXR5KHNyYy5tX3FyLnJvd3MoKSwgc3JjLm1fcXIucm93cygpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZERlcXVlLmggYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9TdGREZXF1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9TdGREZXF1ZS5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnb29nbGVtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1REREVRVUVfSAorI2RlZmluZSBFSUdFTl9TVERERVFVRV9ICisKKyNpbmNsdWRlICJkZXRhaWxzLmgiCisKKy8qKgorICogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgY29udmVuaWVuY2UgTUFDUk8gd2hpY2ggYWxsb3dzIGFuIGVhc3kgc3BlY2lhbGl6YXRpb24gb2YKKyAqIHN0ZDo6ZGVxdWUgc3VjaCB0aGF0IGZvciBkYXRhIHR5cGVzIHdpdGggYWxpZ25tZW50IGlzc3VlcyB0aGUgY29ycmVjdCBhbGxvY2F0b3IKKyAqIGlzIHVzZWQgYXV0b21hdGljYWxseS4KKyAqLworI2RlZmluZSBFSUdFTl9ERUZJTkVfU1RMX0RFUVVFX1NQRUNJQUxJWkFUSU9OKC4uLikgXAorbmFtZXNwYWNlIHN0ZCBcCit7IFwKKyAgdGVtcGxhdGU8PiBcCisgIGNsYXNzIGRlcXVlPF9fVkFfQVJHU19fLCBzdGQ6OmFsbG9jYXRvcjxfX1ZBX0FSR1NfXz4gPiAgICAgICAgICAgXAorICAgIDogcHVibGljIGRlcXVlPF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiBcCisgIHsgXAorICAgIHR5cGVkZWYgZGVxdWU8X19WQV9BUkdTX18sIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPF9fVkFfQVJHU19fPiA+IGRlcXVlX2Jhc2U7IFwKKyAgcHVibGljOiBcCisgICAgdHlwZWRlZiBfX1ZBX0FSR1NfXyB2YWx1ZV90eXBlOyBcCisgICAgdHlwZWRlZiBkZXF1ZV9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgZGVxdWVfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIGRlcXVlX2Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOyAgXAorICAgIGV4cGxpY2l0IGRlcXVlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBkZXF1ZV9iYXNlKGEpIHt9ICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4gXAorICAgIGRlcXVlKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGRlcXVlX2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICBkZXF1ZShjb25zdCBkZXF1ZSYgYykgOiBkZXF1ZV9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIG51bSwgY29uc3QgdmFsdWVfdHlwZSYgdmFsID0gdmFsdWVfdHlwZSgpKSA6IGRlcXVlX2Jhc2UobnVtLCB2YWwpIHt9IFwKKyAgICBkZXF1ZShpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IGRlcXVlX2Jhc2Uoc3RhcnQsIGVuZCkge30gIFwKKyAgICBkZXF1ZSYgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiB4KSB7ICBcCisgICAgICBkZXF1ZV9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgICByZXR1cm4gKnRoaXM7ICBcCisgICAgfSBcCisgIH07IFwKK30KKworLy8gY2hlY2sgd2hldGhlciB3ZSByZWFsbHkgbmVlZCB0aGUgc3RkOjpkZXF1ZSBzcGVjaWFsaXphdGlvbgorI2lmICFFSUdFTl9IQVNfQ1hYMTFfQ09OVEFJTkVSUyAmJiAhKGRlZmluZWQoX0dMSUJDWFhfREVRVUUpICYmICghRUlHRU5fR05VQ19BVF9MRUFTVCg0LDEpKSkgLyogTm90ZSB0aGF0IGJlZm9yZSBnY2MtNC4xIHdlIGFscmVhZHkgaGF2ZTogc3RkOjpkZXF1ZTo6cmVzaXplKHNpemVfdHlwZSxjb25zdCBUJikuICovCisKK25hbWVzcGFjZSBzdGQgeworCisjZGVmaW5lIEVJR0VOX1NURF9ERVFVRV9TUEVDSUFMSVpBVElPTl9CT0RZIFwKKyAgcHVibGljOiAgXAorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBkZXF1ZV9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVxdWVfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRlcXVlX2Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOyAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVxdWVfYmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7ICBcCisgICAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGRlcXVlX2Jhc2UoYSkge30gIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPiBcCisgICAgZGVxdWUoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIFwKKyAgICA6IGRlcXVlX2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICBkZXF1ZShjb25zdCBkZXF1ZSYgYykgOiBkZXF1ZV9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIG51bSwgY29uc3QgdmFsdWVfdHlwZSYgdmFsID0gdmFsdWVfdHlwZSgpKSA6IGRlcXVlX2Jhc2UobnVtLCB2YWwpIHt9IFwKKyAgICBkZXF1ZShpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IGRlcXVlX2Jhc2Uoc3RhcnQsIGVuZCkge30gIFwKKyAgICBkZXF1ZSYgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiB4KSB7ICBcCisgICAgICBkZXF1ZV9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgICByZXR1cm4gKnRoaXM7ICBcCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIGRlcXVlPFQsRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8VD4gPgorICAgIDogcHVibGljIGRlcXVlPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKSwKKyAgICAgICAgICAgICAgICAgICBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb248RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpPiA+Cit7CisgIHR5cGVkZWYgZGVxdWU8RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpLAorICAgICAgICAgICAgICAgIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbjxFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCk+ID4gZGVxdWVfYmFzZTsKKyAgRUlHRU5fU1REX0RFUVVFX1NQRUNJQUxJWkFUSU9OX0JPRFkKKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpCisgIHsgcmVzaXplKG5ld19zaXplLCBUKCkpOyB9CisKKyNpZiBkZWZpbmVkKF9ERVFVRV8pCisgIC8vIHdvcmthcm91bmQgTVNWQyBzdGQ6OmRlcXVlIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChkZXF1ZV9iYXNlOjpzaXplKCkgPCBuZXdfc2l6ZSkKKyAgICAgIGRlcXVlX2Jhc2U6Ol9JbnNlcnRfbihkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICAgIGVsc2UgaWYgKG5ld19zaXplIDwgZGVxdWVfYmFzZTo6c2l6ZSgpKQorICAgICAgZGVxdWVfYmFzZTo6ZXJhc2UoZGVxdWVfYmFzZTo6YmVnaW4oKSArIG5ld19zaXplLCBkZXF1ZV9iYXNlOjplbmQoKSk7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyBkZXF1ZV9iYXNlOjpwdXNoX2JhY2soeCk7IH0gCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7IGRlcXVlX2Jhc2U6OnB1c2hfZnJvbnQoeCk7IH0KKyAgdXNpbmcgZGVxdWVfYmFzZTo6aW5zZXJ0OyAgCisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyByZXR1cm4gZGVxdWVfYmFzZTo6aW5zZXJ0KHBvc2l0aW9uLHgpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsgZGVxdWVfYmFzZTo6aW5zZXJ0KHBvc2l0aW9uLCBuZXdfc2l6ZSwgeCk7IH0KKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfREVRVUUpICYmIEVJR0VOX0dOVUNfQVRfTEVBU1QoNCwyKQorICAvLyB3b3JrYXJvdW5kIEdDQyBzdGQ6OmRlcXVlIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChuZXdfc2l6ZSA8IGRlcXVlX2Jhc2U6OnNpemUoKSkKKyAgICAgIGRlcXVlX2Jhc2U6Ol9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgbmV3X3NpemUpOworICAgIGVsc2UKKyAgICAgIGRlcXVlX2Jhc2U6Omluc2VydChkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICB9CisjZWxzZQorICAvLyBlaXRoZXIgR0NDIDQuMSBvciBub24tR0NDCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2hvdWxkIGFsd2F5cyB3b3JrLgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICBpZiAobmV3X3NpemUgPCBkZXF1ZV9iYXNlOjpzaXplKCkpCisgICAgICBkZXF1ZV9iYXNlOjplcmFzZShkZXF1ZV9iYXNlOjpiZWdpbigpICsgbmV3X3NpemUsIGRlcXVlX2Jhc2U6OmVuZCgpKTsKKyAgICBlbHNlIGlmIChuZXdfc2l6ZSA+IGRlcXVlX2Jhc2U6OnNpemUoKSkKKyAgICAgIGRlcXVlX2Jhc2U6Omluc2VydChkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICB9CisjZW5kaWYKKyAgfTsKK30KKworI2VuZGlmIC8vIGNoZWNrIHdoZXRoZXIgc3BlY2lhbGl6YXRpb24gaXMgYWN0dWFsbHkgcmVxdWlyZWQKKworI2VuZGlmIC8vIEVJR0VOX1NURERFUVVFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZExpc3QuaCBiL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZExpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWViYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkTGlzdC5oCkBAIC0wLDAgKzEsMTA2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnb29nbGVtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RETElTVF9ICisjZGVmaW5lIEVJR0VOX1NURExJU1RfSAorCisjaW5jbHVkZSAiZGV0YWlscy5oIgorCisvKioKKyAqIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIGNvbnZlbmllbmNlIE1BQ1JPIHdoaWNoIGFsbG93cyBhbiBlYXN5IHNwZWNpYWxpemF0aW9uIG9mCisgKiBzdGQ6Omxpc3Qgc3VjaCB0aGF0IGZvciBkYXRhIHR5cGVzIHdpdGggYWxpZ25tZW50IGlzc3VlcyB0aGUgY29ycmVjdCBhbGxvY2F0b3IKKyAqIGlzIHVzZWQgYXV0b21hdGljYWxseS4KKyAqLworI2RlZmluZSBFSUdFTl9ERUZJTkVfU1RMX0xJU1RfU1BFQ0lBTElaQVRJT04oLi4uKSBcCituYW1lc3BhY2Ugc3RkIFwKK3sgXAorICB0ZW1wbGF0ZTw+IFwKKyAgY2xhc3MgbGlzdDxfX1ZBX0FSR1NfXywgc3RkOjphbGxvY2F0b3I8X19WQV9BUkdTX18+ID4gICAgICAgICAgIFwKKyAgICA6IHB1YmxpYyBsaXN0PF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiBcCisgIHsgXAorICAgIHR5cGVkZWYgbGlzdDxfX1ZBX0FSR1NfXywgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8X19WQV9BUkdTX18+ID4gbGlzdF9iYXNlOyBcCisgIHB1YmxpYzogXAorICAgIHR5cGVkZWYgX19WQV9BUkdTX18gdmFsdWVfdHlwZTsgXAorICAgIHR5cGVkZWYgbGlzdF9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgbGlzdF9iYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOyAgXAorICAgIHR5cGVkZWYgbGlzdF9iYXNlOjppdGVyYXRvciBpdGVyYXRvcjsgIFwKKyAgICBleHBsaWNpdCBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBsaXN0X2Jhc2UoYSkge30gIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPiBcCisgICAgbGlzdChJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBsaXN0X2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICBsaXN0KGNvbnN0IGxpc3QmIGMpIDogbGlzdF9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgbnVtLCBjb25zdCB2YWx1ZV90eXBlJiB2YWwgPSB2YWx1ZV90eXBlKCkpIDogbGlzdF9iYXNlKG51bSwgdmFsKSB7fSBcCisgICAgbGlzdChpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IGxpc3RfYmFzZShzdGFydCwgZW5kKSB7fSAgXAorICAgIGxpc3QmIG9wZXJhdG9yPShjb25zdCBsaXN0JiB4KSB7ICBcCisgICAgICBsaXN0X2Jhc2U6Om9wZXJhdG9yPSh4KTsgIFwKKyAgICAgIHJldHVybiAqdGhpczsgIFwKKyAgICB9IFwKKyAgfTsgXAorfQorCisvLyBjaGVjayB3aGV0aGVyIHdlIHJlYWxseSBuZWVkIHRoZSBzdGQ6Omxpc3Qgc3BlY2lhbGl6YXRpb24KKyNpZiAhRUlHRU5fSEFTX0NYWDExX0NPTlRBSU5FUlMgJiYgIShkZWZpbmVkKF9HTElCQ1hYX0xJU1QpICYmICghRUlHRU5fR05VQ19BVF9MRUFTVCg0LDEpKSkgLyogTm90ZSB0aGF0IGJlZm9yZSBnY2MtNC4xIHdlIGFscmVhZHkgaGF2ZTogc3RkOjpsaXN0OjpyZXNpemUoc2l6ZV90eXBlLGNvbnN0IFQmKS4gKi8KKworbmFtZXNwYWNlIHN0ZAoreworCisjZGVmaW5lIEVJR0VOX1NURF9MSVNUX1NQRUNJQUxJWkFUSU9OX0JPRFkgXAorICBwdWJsaWM6ICBcCisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7IFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGxpc3RfYmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7IFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGxpc3RfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGxpc3RfYmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7ICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0X2Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOyAgXAorICAgIGV4cGxpY2l0IGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGxpc3RfYmFzZShhKSB7fSAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+IFwKKyAgICBsaXN0KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSBcCisgICAgOiBsaXN0X2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICBsaXN0KGNvbnN0IGxpc3QmIGMpIDogbGlzdF9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgbGlzdChzaXplX3R5cGUgbnVtLCBjb25zdCB2YWx1ZV90eXBlJiB2YWwgPSB2YWx1ZV90eXBlKCkpIDogbGlzdF9iYXNlKG51bSwgdmFsKSB7fSBcCisgICAgbGlzdChpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IGxpc3RfYmFzZShzdGFydCwgZW5kKSB7fSAgXAorICAgIGxpc3QmIG9wZXJhdG9yPShjb25zdCBsaXN0JiB4KSB7ICBcCisgICAgbGlzdF9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgcmV0dXJuICp0aGlzOyBcCisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjbGFzcyBsaXN0PFQsRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8VD4gPgorICAgIDogcHVibGljIGxpc3Q8RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpLAorICAgICAgICAgICAgICAgICAgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKT4gPgorICB7CisgICAgdHlwZWRlZiBsaXN0PEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKSwKKyAgICAgICAgICAgICAgICAgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKT4gPiBsaXN0X2Jhc2U7CisgICAgRUlHRU5fU1REX0xJU1RfU1BFQ0lBTElaQVRJT05fQk9EWQorCisgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKQorICAgIHsgcmVzaXplKG5ld19zaXplLCBUKCkpOyB9CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgICAgeworICAgICAgaWYgKGxpc3RfYmFzZTo6c2l6ZSgpIDwgbmV3X3NpemUpCisgICAgICAgIGxpc3RfYmFzZTo6aW5zZXJ0KGxpc3RfYmFzZTo6ZW5kKCksIG5ld19zaXplIC0gbGlzdF9iYXNlOjpzaXplKCksIHgpOworICAgICAgZWxzZQorICAgICAgICB3aGlsZSAobmV3X3NpemUgPCBsaXN0X2Jhc2U6OnNpemUoKSkgbGlzdF9iYXNlOjpwb3BfYmFjaygpOworICAgIH0KKworI2lmIGRlZmluZWQoX0xJU1RfKQorICAgIC8vIHdvcmthcm91bmQgTVNWQyBzdGQ6Omxpc3QgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiB4KQorICAgIHsgbGlzdF9iYXNlOjpwdXNoX2JhY2soeCk7IH0gCisgICAgdXNpbmcgbGlzdF9iYXNlOjppbnNlcnQ7ICAKKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgICAgeyByZXR1cm4gbGlzdF9iYXNlOjppbnNlcnQocG9zaXRpb24seCk7IH0KKyAgICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiB4KQorICAgIHsgbGlzdF9iYXNlOjppbnNlcnQocG9zaXRpb24sIG5ld19zaXplLCB4KTsgfQorI2VuZGlmCisgIH07Cit9CisKKyNlbmRpZiAvLyBjaGVjayB3aGV0aGVyIHNwZWNpYWxpemF0aW9uIGlzIGFjdHVhbGx5IHJlcXVpcmVkCisKKyNlbmRpZiAvLyBFSUdFTl9TVERMSVNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZFZlY3Rvci5oIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMjgyMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZFZlY3Rvci5oCkBAIC0wLDAgKzEsMTMxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnb29nbGVtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1REVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fU1REVkVDVE9SX0gKKworI2luY2x1ZGUgImRldGFpbHMuaCIKKworLyoqCisgKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBjb252ZW5pZW5jZSBNQUNSTyB3aGljaCBhbGxvd3MgYW4gZWFzeSBzcGVjaWFsaXphdGlvbiBvZgorICogc3RkOjp2ZWN0b3Igc3VjaCB0aGF0IGZvciBkYXRhIHR5cGVzIHdpdGggYWxpZ25tZW50IGlzc3VlcyB0aGUgY29ycmVjdCBhbGxvY2F0b3IKKyAqIGlzIHVzZWQgYXV0b21hdGljYWxseS4KKyAqLworI2RlZmluZSBFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTiguLi4pIFwKK25hbWVzcGFjZSBzdGQgXAoreyBcCisgIHRlbXBsYXRlPD4gXAorICBjbGFzcyB2ZWN0b3I8X19WQV9BUkdTX18sIHN0ZDo6YWxsb2NhdG9yPF9fVkFfQVJHU19fPiA+ICBcCisgICAgOiBwdWJsaWMgdmVjdG9yPF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiBcCisgIHsgXAorICAgIHR5cGVkZWYgdmVjdG9yPF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiB2ZWN0b3JfYmFzZTsgXAorICBwdWJsaWM6IFwKKyAgICB0eXBlZGVmIF9fVkFfQVJHU19fIHZhbHVlX3R5cGU7IFwKKyAgICB0eXBlZGVmIHZlY3Rvcl9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgdmVjdG9yX2Jhc2U6OnNpemVfdHlwZSBzaXplX3R5cGU7ICBcCisgICAgdHlwZWRlZiB2ZWN0b3JfYmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7ICBcCisgICAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiB2ZWN0b3JfYmFzZShhKSB7fSAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+IFwKKyAgICB2ZWN0b3IoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIDogdmVjdG9yX2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBjKSA6IHZlY3Rvcl9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBudW0sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCA9IHZhbHVlX3R5cGUoKSkgOiB2ZWN0b3JfYmFzZShudW0sIHZhbCkge30gXAorICAgIHZlY3RvcihpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IHZlY3Rvcl9iYXNlKHN0YXJ0LCBlbmQpIHt9ICBcCisgICAgdmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiB4KSB7ICBcCisgICAgICB2ZWN0b3JfYmFzZTo6b3BlcmF0b3I9KHgpOyAgXAorICAgICAgcmV0dXJuICp0aGlzOyAgXAorICAgIH0gXAorICB9OyBcCit9CisKKy8vIERvbid0IHNwZWNpYWxpemUgaWYgY29udGFpbmVycyBhcmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIEMrKzExCisjaWYgIUVJR0VOX0hBU19DWFgxMV9DT05UQUlORVJTCisKK25hbWVzcGFjZSBzdGQgeworCisjZGVmaW5lIEVJR0VOX1NURF9WRUNUT1JfU1BFQ0lBTElaQVRJT05fQk9EWSBcCisgIHB1YmxpYzogIFwKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgdmVjdG9yX2Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSB2ZWN0b3JfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHZlY3Rvcl9iYXNlOjppdGVyYXRvciBpdGVyYXRvcjsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHZlY3Rvcl9iYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsgIFwKKyAgICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IHZlY3Rvcl9iYXNlKGEpIHt9ICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4gXAorICAgIHZlY3RvcihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgXAorICAgIDogdmVjdG9yX2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBjKSA6IHZlY3Rvcl9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgdmVjdG9yKHNpemVfdHlwZSBudW0sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCA9IHZhbHVlX3R5cGUoKSkgOiB2ZWN0b3JfYmFzZShudW0sIHZhbCkge30gXAorICAgIHZlY3RvcihpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IHZlY3Rvcl9iYXNlKHN0YXJ0LCBlbmQpIHt9ICBcCisgICAgdmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiB4KSB7ICBcCisgICAgICB2ZWN0b3JfYmFzZTo6b3BlcmF0b3I9KHgpOyAgXAorICAgICAgcmV0dXJuICp0aGlzOyAgXAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjbGFzcyB2ZWN0b3I8VCxFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPiA+CisgICAgOiBwdWJsaWMgdmVjdG9yPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKSwKKyAgICAgICAgICAgICAgICAgICAgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKT4gPgoreworICB0eXBlZGVmIHZlY3RvcjxFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCksCisgICAgICAgICAgICAgICAgIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbjxFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCk+ID4gdmVjdG9yX2Jhc2U7CisgIEVJR0VOX1NURF9WRUNUT1JfU1BFQ0lBTElaQVRJT05fQk9EWQorCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSkKKyAgeyByZXNpemUobmV3X3NpemUsIFQoKSk7IH0KKworI2lmIGRlZmluZWQoX1ZFQ1RPUl8pCisgIC8vIHdvcmthcm91bmQgTVNWQyBzdGQ6OnZlY3RvciBpbXBsZW1lbnRhdGlvbgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICBpZiAodmVjdG9yX2Jhc2U6OnNpemUoKSA8IG5ld19zaXplKQorICAgICAgdmVjdG9yX2Jhc2U6Ol9JbnNlcnRfbih2ZWN0b3JfYmFzZTo6ZW5kKCksIG5ld19zaXplIC0gdmVjdG9yX2Jhc2U6OnNpemUoKSwgeCk7CisgICAgZWxzZSBpZiAobmV3X3NpemUgPCB2ZWN0b3JfYmFzZTo6c2l6ZSgpKQorICAgICAgdmVjdG9yX2Jhc2U6OmVyYXNlKHZlY3Rvcl9iYXNlOjpiZWdpbigpICsgbmV3X3NpemUsIHZlY3Rvcl9iYXNlOjplbmQoKSk7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyB2ZWN0b3JfYmFzZTo6cHVzaF9iYWNrKHgpOyB9IAorICB1c2luZyB2ZWN0b3JfYmFzZTo6aW5zZXJ0OyAgCisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyByZXR1cm4gdmVjdG9yX2Jhc2U6Omluc2VydChwb3NpdGlvbix4KTsgfQorICB2b2lkIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7IHZlY3Rvcl9iYXNlOjppbnNlcnQocG9zaXRpb24sIG5ld19zaXplLCB4KTsgfQorI2VsaWYgZGVmaW5lZChfR0xJQkNYWF9WRUNUT1IpICYmICghKEVJR0VOX0dOVUNfQVRfTEVBU1QoNCwxKSkpCisgIC8qIE5vdGUgdGhhdCBiZWZvcmUgZ2NjLTQuMSB3ZSBhbHJlYWR5IGhhdmU6IHN0ZDo6dmVjdG9yOjpyZXNpemUoc2l6ZV90eXBlLGNvbnN0IFQmKS4KKyAgICogSG93ZXZlciwgdGhpcyBzcGVjaWFsaXphdGlvbiBpcyBzdGlsbCBuZWVkZWQgdG8gbWFrZSB0aGUgYWJvdmUgRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04gdHJpY2sgdG8gd29yay4gKi8KKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7CisgICAgdmVjdG9yX2Jhc2U6OnJlc2l6ZShuZXdfc2l6ZSx4KTsKKyAgfQorI2VsaWYgZGVmaW5lZChfR0xJQkNYWF9WRUNUT1IpICYmIEVJR0VOX0dOVUNfQVRfTEVBU1QoNCwyKQorICAvLyB3b3JrYXJvdW5kIEdDQyBzdGQ6OnZlY3RvciBpbXBsZW1lbnRhdGlvbgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICBpZiAobmV3X3NpemUgPCB2ZWN0b3JfYmFzZTo6c2l6ZSgpKQorICAgICAgdmVjdG9yX2Jhc2U6Ol9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgbmV3X3NpemUpOworICAgIGVsc2UKKyAgICAgIHZlY3Rvcl9iYXNlOjppbnNlcnQodmVjdG9yX2Jhc2U6OmVuZCgpLCBuZXdfc2l6ZSAtIHZlY3Rvcl9iYXNlOjpzaXplKCksIHgpOworICB9CisjZWxzZQorICAvLyBlaXRoZXIgR0NDIDQuMSBvciBub24tR0NDCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2hvdWxkIGFsd2F5cyB3b3JrLgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICBpZiAobmV3X3NpemUgPCB2ZWN0b3JfYmFzZTo6c2l6ZSgpKQorICAgICAgdmVjdG9yX2Jhc2U6OmVyYXNlKHZlY3Rvcl9iYXNlOjpiZWdpbigpICsgbmV3X3NpemUsIHZlY3Rvcl9iYXNlOjplbmQoKSk7CisgICAgZWxzZSBpZiAobmV3X3NpemUgPiB2ZWN0b3JfYmFzZTo6c2l6ZSgpKQorICAgICAgdmVjdG9yX2Jhc2U6Omluc2VydCh2ZWN0b3JfYmFzZTo6ZW5kKCksIG5ld19zaXplIC0gdmVjdG9yX2Jhc2U6OnNpemUoKSwgeCk7CisgIH0KKyNlbmRpZgorICB9OworfQorI2VuZGlmIC8vICFFSUdFTl9IQVNfQ1hYMTFfQ09OVEFJTkVSUworCisKKyNlbmRpZiAvLyBFSUdFTl9TVERWRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZmQxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9kZXRhaWxzLmgKQEAgLTAsMCArMSw4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NUTF9ERVRBSUxTX0gKKyNkZWZpbmUgRUlHRU5fU1RMX0RFVEFJTFNfSAorCisjaWZuZGVmIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SCisgICNkZWZpbmUgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1IgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yCisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworICAvLyBUaGlzIG9uZSBpcyBuZWVkZWQgdG8gcHJldmVudCByZWltcGxlbWVudGluZyB0aGUgd2hvbGUgc3RkOjp2ZWN0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbiA6IHB1YmxpYyBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgVCogICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUKiAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQmICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUJiAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIHN0cnVjdCByZWJpbmQKKyAgICB7CisgICAgICB0eXBlZGVmIGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPFU+IG90aGVyOworICAgIH07CisKKyAgICBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbigpIHt9CisgICAgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24oY29uc3QgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24mICkgOiBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPigpIHt9CisgICAgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24oY29uc3QgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8VD4mICkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uKGNvbnN0IGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPFU+JiApIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgVT4KKyAgICBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbihjb25zdCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxVPiYgKSB7fQorICAgIH5hbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbigpIHt9CisgIH07CisKKyNpZiBFSUdFTl9DT01QX01TVkMKKworICAvLyBzb21ldGltZXMsIE1TVkMgZGV0ZWN0cywgYXQgY29tcGlsZSB0aW1lLCB0aGF0IHRoZSBhcmd1bWVudCB4CisgIC8vIGluIHN0ZDo6dmVjdG9yOjpyZXNpemUoc2l6ZV90IHMsVCB4KSB3b24ndCBiZSBhbGlnbmVkIGFuZCBnZW5lcmF0ZSBhbiBlcnJvcgorICAvLyBldmVuIGlmIHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkLiBXaGVuY2UgdGhpcyBsaXR0bGUgd3JhcHBlci4KKyNkZWZpbmUgRUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpIFwKKyAgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpjb25kaXRpb25hbDwgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6aXNfYXJpdGhtZXRpYzxUPjo6dmFsdWUsIFwKKyAgICBULCBcCisgICAgRWlnZW46OmludGVybmFsOjp3b3JrYXJvdW5kX21zdmNfc3RsX3N1cHBvcnQ8VD4gXAorICA+Ojp0eXBlCisKKyAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHdvcmthcm91bmRfbXN2Y19zdGxfc3VwcG9ydCA6IHB1YmxpYyBUCisgIHsKKyAgICBpbmxpbmUgd29ya2Fyb3VuZF9tc3ZjX3N0bF9zdXBwb3J0KCkgOiBUKCkge30KKyAgICBpbmxpbmUgd29ya2Fyb3VuZF9tc3ZjX3N0bF9zdXBwb3J0KGNvbnN0IFQmIG90aGVyKSA6IFQob3RoZXIpIHt9CisgICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxUKj4odGhpcyk7IH0KKyAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFQqPih0aGlzKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyVD4KKyAgICBpbmxpbmUgVCYgb3BlcmF0b3I9KGNvbnN0IE90aGVyVCYgb3RoZXIpCisgICAgeyBUOjpvcGVyYXRvcj0ob3RoZXIpOyByZXR1cm4gKnRoaXM7IH0KKyAgICBpbmxpbmUgd29ya2Fyb3VuZF9tc3ZjX3N0bF9zdXBwb3J0JiBvcGVyYXRvcj0oY29uc3Qgd29ya2Fyb3VuZF9tc3ZjX3N0bF9zdXBwb3J0JiBvdGhlcikKKyAgICB7IFQ6Om9wZXJhdG9yPShvdGhlcik7IHJldHVybiAqdGhpczsgfQorICB9OworICB9CisKKyNlbHNlCisKKyNkZWZpbmUgRUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpIFQKKworI2VuZGlmCisKK30KKworI2VuZGlmIC8vIEVJR0VOX1NUTF9ERVRBSUxTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TdXBlckxVU3VwcG9ydC9TdXBlckxVU3VwcG9ydC5oIGIvRWlnZW4vc3JjL1N1cGVyTFVTdXBwb3J0L1N1cGVyTFVTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhNjlmMwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TdXBlckxVU3VwcG9ydC9TdXBlckxVU3VwcG9ydC5oCkBAIC0wLDAgKzEsMTAyNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1VQRVJMVVNVUFBPUlRfSAorI2RlZmluZSBFSUdFTl9TVVBFUkxVU1VQUE9SVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKyNpZiBkZWZpbmVkKFNVUEVSTFVfTUFKT1JfVkVSU0lPTikgJiYgKFNVUEVSTFVfTUFKT1JfVkVSU0lPTiA+PSA1KQorI2RlZmluZSBERUNMX0dTU1ZYKFBSRUZJWCxGTE9BVFRZUEUsS0VZVFlQRSkJCVwKKyAgICBleHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleHRlcm4gdm9pZCBQUkVGSVgjI2dzc3Z4KHN1cGVybHVfb3B0aW9uc190ICosIFN1cGVyTWF0cml4ICosIGludCAqLCBpbnQgKiwgaW50ICosICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgU3VwZXJNYXRyaXggKiwgU3VwZXJNYXRyaXggKiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCBpbnQsIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgRkxPQVRUWVBFICosIEZMT0FUVFlQRSAqLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMVV90ICosIG1lbV91c2FnZV90ICosIFN1cGVyTFVTdGF0X3QgKiwgaW50ICopOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIGZsb2F0IFN1cGVyTFVfZ3Nzdngoc3VwZXJsdV9vcHRpb25zX3QgKm9wdGlvbnMsIFN1cGVyTWF0cml4ICpBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaW50ICpwZXJtX2MsIGludCAqcGVybV9yLCBpbnQgKmV0cmVlLCBjaGFyICplcXVlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEZMT0FUVFlQRSAqUiwgRkxPQVRUWVBFICpDLCBTdXBlck1hdHJpeCAqTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlck1hdHJpeCAqVSwgdm9pZCAqd29yaywgaW50IGx3b3JrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJNYXRyaXggKkIsIFN1cGVyTWF0cml4ICpYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEZMT0FUVFlQRSAqcmVjaXBfcGl2b3RfZ3Jvd3RoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBGTE9BVFRZUEUgKnJjb25kLCBGTE9BVFRZUEUgKmZlcnIsIEZMT0FUVFlQRSAqYmVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJMVVN0YXRfdCAqc3RhdHMsIGludCAqaW5mbywgS0VZVFlQRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1fdXNhZ2VfdCBtZW1fdXNhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR2xvYmFsTFVfdCBnTFU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBSRUZJWCMjZ3Nzdngob3B0aW9ucywgQSwgcGVybV9jLCBwZXJtX3IsIGV0cmVlLCBlcXVlZCwgUiwgQywgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFUsIHdvcmssIGx3b3JrLCBCLCBYLCByZWNpcF9waXZvdF9ncm93dGgsIHJjb25kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBmZXJyLCBiZXJyLCAmZ0xVLCAmbWVtX3VzYWdlLCBzdGF0cywgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBtZW1fdXNhZ2UuZm9yX2x1OyAvKiBieXRlcyB1c2VkIGJ5IHRoZSBmYWN0b3Igc3RvcmFnZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UgLy8gdmVyc2lvbiA8IDUuMAorI2RlZmluZSBERUNMX0dTU1ZYKFBSRUZJWCxGTE9BVFRZUEUsS0VZVFlQRSkJCVwKKyAgICBleHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleHRlcm4gdm9pZCBQUkVGSVgjI2dzc3Z4KHN1cGVybHVfb3B0aW9uc190ICosIFN1cGVyTWF0cml4ICosIGludCAqLCBpbnQgKiwgaW50ICosICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgU3VwZXJNYXRyaXggKiwgU3VwZXJNYXRyaXggKiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCBpbnQsIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgRkxPQVRUWVBFICosIEZMT0FUVFlQRSAqLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fdXNhZ2VfdCAqLCBTdXBlckxVU3RhdF90ICosIGludCAqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIGZsb2F0IFN1cGVyTFVfZ3Nzdngoc3VwZXJsdV9vcHRpb25zX3QgKm9wdGlvbnMsIFN1cGVyTWF0cml4ICpBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaW50ICpwZXJtX2MsIGludCAqcGVybV9yLCBpbnQgKmV0cmVlLCBjaGFyICplcXVlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEZMT0FUVFlQRSAqUiwgRkxPQVRUWVBFICpDLCBTdXBlck1hdHJpeCAqTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlck1hdHJpeCAqVSwgdm9pZCAqd29yaywgaW50IGx3b3JrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJNYXRyaXggKkIsIFN1cGVyTWF0cml4ICpYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEZMT0FUVFlQRSAqcmVjaXBfcGl2b3RfZ3Jvd3RoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBGTE9BVFRZUEUgKnJjb25kLCBGTE9BVFRZUEUgKmZlcnIsIEZMT0FUVFlQRSAqYmVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJMVVN0YXRfdCAqc3RhdHMsIGludCAqaW5mbywgS0VZVFlQRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1fdXNhZ2VfdCBtZW1fdXNhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFRklYIyNnc3N2eChvcHRpb25zLCBBLCBwZXJtX2MsIHBlcm1fciwgZXRyZWUsIGVxdWVkLCBSLCBDLCBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgVSwgd29yaywgbHdvcmssIEIsIFgsIHJlY2lwX3Bpdm90X2dyb3d0aCwgcmNvbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGZlcnIsIGJlcnIsICZtZW1fdXNhZ2UsIHN0YXRzLCBpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG1lbV91c2FnZS5mb3JfbHU7IC8qIGJ5dGVzIHVzZWQgYnkgdGhlIGZhY3RvciBzdG9yYWdlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYKKworREVDTF9HU1NWWChzLGZsb2F0LGZsb2F0KQorREVDTF9HU1NWWChjLGZsb2F0LHN0ZDo6Y29tcGxleDxmbG9hdD4pCitERUNMX0dTU1ZYKGQsZG91YmxlLGRvdWJsZSkKK0RFQ0xfR1NTVlgoeixkb3VibGUsc3RkOjpjb21wbGV4PGRvdWJsZT4pCisKKyNpZmRlZiBNSUxVX0FMUEhBCisjZGVmaW5lIEVJR0VOX1NVUEVSTFVfSEFTX0lMVQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9TVVBFUkxVX0hBU19JTFUKKworLy8gc2ltaWxhcmx5IGZvciB0aGUgaW5jb21wbGV0ZSBmYWN0b3JpemF0aW9uIHVzaW5nIGdzaXN4CisjZGVmaW5lIERFQ0xfR1NJU1goUFJFRklYLEZMT0FUVFlQRSxLRVlUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleHRlcm4gdm9pZCBQUkVGSVgjI2dzaXN4KHN1cGVybHVfb3B0aW9uc190ICosIFN1cGVyTWF0cml4ICosIGludCAqLCBpbnQgKiwgaW50ICosICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBGTE9BVFRZUEUgKiwgRkxPQVRUWVBFICosIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCBpbnQsIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX3VzYWdlX3QgKiwgU3VwZXJMVVN0YXRfdCAqLCBpbnQgKik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBmbG9hdCBTdXBlckxVX2dzaXN4KHN1cGVybHVfb3B0aW9uc190ICpvcHRpb25zLCBTdXBlck1hdHJpeCAqQSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaW50ICpwZXJtX2MsIGludCAqcGVybV9yLCBpbnQgKmV0cmVlLCBjaGFyICplcXVlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgRkxPQVRUWVBFICpSLCBGTE9BVFRZUEUgKkMsIFN1cGVyTWF0cml4ICpMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJNYXRyaXggKlUsIHZvaWQgKndvcmssIGludCBsd29yaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJNYXRyaXggKkIsIFN1cGVyTWF0cml4ICpYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgRkxPQVRUWVBFICpyZWNpcF9waXZvdF9ncm93dGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgRkxPQVRUWVBFICpyY29uZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU3VwZXJMVVN0YXRfdCAqc3RhdHMsIGludCAqaW5mbywgS0VZVFlQRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbV91c2FnZV90IG1lbV91c2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQUkVGSVgjI2dzaXN4KG9wdGlvbnMsIEEsIHBlcm1fYywgcGVybV9yLCBldHJlZSwgZXF1ZWQsIFIsIEMsIEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFUsIHdvcmssIGx3b3JrLCBCLCBYLCByZWNpcF9waXZvdF9ncm93dGgsIHJjb25kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICZtZW1fdXNhZ2UsIHN0YXRzLCBpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbWVtX3VzYWdlLmZvcl9sdTsgLyogYnl0ZXMgdXNlZCBieSB0aGUgZmFjdG9yIHN0b3JhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitERUNMX0dTSVNYKHMsZmxvYXQsZmxvYXQpCitERUNMX0dTSVNYKGMsZmxvYXQsc3RkOjpjb21wbGV4PGZsb2F0PikKK0RFQ0xfR1NJU1goZCxkb3VibGUsZG91YmxlKQorREVDTF9HU0lTWCh6LGRvdWJsZSxzdGQ6OmNvbXBsZXg8ZG91YmxlPikKKworI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgU2x1TWF0cml4TWFwSGVscGVyOworCisvKiogXGludGVybmFsCisgICoKKyAgKiBBIHdyYXBwZXIgY2xhc3MgZm9yIFN1cGVyTFUgbWF0cmljZXMuIEl0IHN1cHBvcnRzIG9ubHkgY29tcHJlc3NlZCBzcGFyc2UgbWF0cmljZXMKKyAgKiBhbmQgZGVuc2UgbWF0cmljZXMuIFN1cGVybm9kYWwgYW5kIG90aGVyIGZhbmN5IGZvcm1hdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHdyYXBwZXIuCisgICoKKyAgKiBUaGlzIHdyYXBwZXIgY2xhc3MgbWFpbmx5IGFpbXMgdG8gYXZvaWRzIHRoZSBuZWVkIG9mIGR5bmFtaWMgYWxsb2NhdGlvbiBvZiB0aGUgc3RvcmFnZSBzdHJ1Y3R1cmUuCisgICovCitzdHJ1Y3QgU2x1TWF0cml4IDogU3VwZXJNYXRyaXgKK3sKKyAgU2x1TWF0cml4KCkKKyAgeworICAgIFN0b3JlID0gJnN0b3JhZ2U7CisgIH0KKworICBTbHVNYXRyaXgoY29uc3QgU2x1TWF0cml4JiBvdGhlcikKKyAgICA6IFN1cGVyTWF0cml4KG90aGVyKQorICB7CisgICAgU3RvcmUgPSAmc3RvcmFnZTsKKyAgICBzdG9yYWdlID0gb3RoZXIuc3RvcmFnZTsKKyAgfQorCisgIFNsdU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFNsdU1hdHJpeCYgb3RoZXIpCisgIHsKKyAgICBTdXBlck1hdHJpeDo6b3BlcmF0b3I9KHN0YXRpY19jYXN0PGNvbnN0IFN1cGVyTWF0cml4Jj4ob3RoZXIpKTsKKyAgICBTdG9yZSA9ICZzdG9yYWdlOworICAgIHN0b3JhZ2UgPSBvdGhlci5zdG9yYWdlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0cnVjdAorICB7CisgICAgdW5pb24ge2ludCBubno7aW50IGxkYTt9OworICAgIHZvaWQgKnZhbHVlczsKKyAgICBpbnQgKmlubmVySW5kOworICAgIGludCAqb3V0ZXJJbmQ7CisgIH0gc3RvcmFnZTsKKworICB2b2lkIHNldFN0b3JhZ2VUeXBlKFN0eXBlX3QgdCkKKyAgeworICAgIFN0eXBlID0gdDsKKyAgICBpZiAodD09U0xVX05DIHx8IHQ9PVNMVV9OUiB8fCB0PT1TTFVfRE4pCisgICAgICBTdG9yZSA9ICZzdG9yYWdlOworICAgIGVsc2UKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInN0b3JhZ2UgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICBTdG9yZSA9IDA7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICB2b2lkIHNldFNjYWxhclR5cGUoKQorICB7CisgICAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixmbG9hdD46OnZhbHVlKQorICAgICAgRHR5cGUgPSBTTFVfUzsKKyAgICBlbHNlIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsZG91YmxlPjo6dmFsdWUpCisgICAgICBEdHlwZSA9IFNMVV9EOworICAgIGVsc2UgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnZhbHVlKQorICAgICAgRHR5cGUgPSBTTFVfQzsKKyAgICBlbHNlIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsc3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6dmFsdWUpCisgICAgICBEdHlwZSA9IFNMVV9aOworICAgIGVsc2UKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIlNjYWxhciB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgU3VwZXJMVSIpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBTbHVNYXRyaXggTWFwKE1hdHJpeEJhc2U8TWF0cml4VHlwZT4mIF9tYXQpCisgIHsKKyAgICBNYXRyaXhUeXBlJiBtYXQoX21hdC5kZXJpdmVkKCkpOworICAgIGVpZ2VuX2Fzc2VydCggKChNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkhPVJvd01ham9yQml0KSAmJiAicm93LW1ham9yIGRlbnNlIG1hdHJpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyTFUiKTsKKyAgICBTbHVNYXRyaXggcmVzOworICAgIHJlcy5zZXRTdG9yYWdlVHlwZShTTFVfRE4pOworICAgIHJlcy5zZXRTY2FsYXJUeXBlPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4oKTsKKyAgICByZXMuTXR5cGUgICAgID0gU0xVX0dFOworCisgICAgcmVzLm5yb3cgICAgICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGludD4obWF0LnJvd3MoKSk7CisgICAgcmVzLm5jb2wgICAgICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGludD4obWF0LmNvbHMoKSk7CisKKyAgICByZXMuc3RvcmFnZS5sZGEgICAgICAgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxpbnQ+KE1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSA/IG1hdC5zaXplKCkgOiBtYXQub3V0ZXJTdHJpZGUoKSk7CisgICAgcmVzLnN0b3JhZ2UudmFsdWVzICAgID0gKHZvaWQqKShtYXQuZGF0YSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgc3RhdGljIFNsdU1hdHJpeCBNYXAoU3BhcnNlTWF0cml4QmFzZTxNYXRyaXhUeXBlPiYgYV9tYXQpCisgIHsKKyAgICBNYXRyaXhUeXBlICZtYXQoYV9tYXQuZGVyaXZlZCgpKTsKKyAgICBTbHVNYXRyaXggcmVzOworICAgIGlmICgoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkKKyAgICB7CisgICAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX05SKTsKKyAgICAgIHJlcy5ucm93ICAgICAgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxpbnQ+KG1hdC5jb2xzKCkpOworICAgICAgcmVzLm5jb2wgICAgICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGludD4obWF0LnJvd3MoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX05DKTsKKyAgICAgIHJlcy5ucm93ICAgICAgPSBpbnRlcm5hbDo6Y29udmVydF9pbmRleDxpbnQ+KG1hdC5yb3dzKCkpOworICAgICAgcmVzLm5jb2wgICAgICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGludD4obWF0LmNvbHMoKSk7CisgICAgfQorCisgICAgcmVzLk10eXBlICAgICAgID0gU0xVX0dFOworCisgICAgcmVzLnN0b3JhZ2Uubm56ICAgICAgID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8aW50PihtYXQubm9uWmVyb3MoKSk7CisgICAgcmVzLnN0b3JhZ2UudmFsdWVzICAgID0gbWF0LnZhbHVlUHRyKCk7CisgICAgcmVzLnN0b3JhZ2UuaW5uZXJJbmQgID0gbWF0LmlubmVySW5kZXhQdHIoKTsKKyAgICByZXMuc3RvcmFnZS5vdXRlckluZCAgPSBtYXQub3V0ZXJJbmRleFB0cigpOworCisgICAgcmVzLnNldFNjYWxhclR5cGU8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPigpOworCisgICAgLy8gRklYTUUgdGhlIGZvbGxvd2luZyBpcyBub3QgdmVyeSBhY2N1cmF0ZQorICAgIGlmIChNYXRyaXhUeXBlOjpGbGFncyAmIFVwcGVyKQorICAgICAgcmVzLk10eXBlID0gU0xVX1RSVTsKKyAgICBpZiAoTWF0cml4VHlwZTo6RmxhZ3MgJiBMb3dlcikKKyAgICAgIHJlcy5NdHlwZSA9IFNMVV9UUkw7CisKKyAgICBlaWdlbl9hc3NlcnQoKChNYXRyaXhUeXBlOjpGbGFncyAmIFNlbGZBZGpvaW50KT09MCkgJiYgIlNlbGZBZGpvaW50IG1hdHJpeCBzaGFwZSBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyTFUiKTsKKworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgT3B0aW9ucywgaW50IE1Sb3dzLCBpbnQgTUNvbHM+CitzdHJ1Y3QgU2x1TWF0cml4TWFwSGVscGVyPE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzLE9wdGlvbnMsTVJvd3MsTUNvbHM+ID4KK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scyxPcHRpb25zLE1Sb3dzLE1Db2xzPiBNYXRyaXhUeXBlOworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbWF0LCBTbHVNYXRyaXgmIHJlcykKKyAgeworICAgIGVpZ2VuX2Fzc2VydCggKChPcHRpb25zJlJvd01ham9yKSE9Um93TWFqb3IpICYmICJyb3ctbWFqb3IgZGVuc2UgbWF0cmljZXMgaXMgbm90IHN1cHBvcnRlZCBieSBTdXBlckxVIik7CisgICAgcmVzLnNldFN0b3JhZ2VUeXBlKFNMVV9ETik7CisgICAgcmVzLnNldFNjYWxhclR5cGU8U2NhbGFyPigpOworICAgIHJlcy5NdHlwZSAgICAgPSBTTFVfR0U7CisKKyAgICByZXMubnJvdyAgICAgID0gbWF0LnJvd3MoKTsKKyAgICByZXMubmNvbCAgICAgID0gbWF0LmNvbHMoKTsKKworICAgIHJlcy5zdG9yYWdlLmxkYSAgICAgICA9IG1hdC5vdXRlclN0cmlkZSgpOworICAgIHJlcy5zdG9yYWdlLnZhbHVlcyAgICA9IG1hdC5kYXRhKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgU2x1TWF0cml4TWFwSGVscGVyPFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD4gPgoreworICB0eXBlZGVmIERlcml2ZWQgTWF0cml4VHlwZTsKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgU2x1TWF0cml4JiByZXMpCisgIHsKKyAgICBpZiAoKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQpCisgICAgeworICAgICAgcmVzLnNldFN0b3JhZ2VUeXBlKFNMVV9OUik7CisgICAgICByZXMubnJvdyAgICAgID0gbWF0LmNvbHMoKTsKKyAgICAgIHJlcy5uY29sICAgICAgPSBtYXQucm93cygpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmVzLnNldFN0b3JhZ2VUeXBlKFNMVV9OQyk7CisgICAgICByZXMubnJvdyAgICAgID0gbWF0LnJvd3MoKTsKKyAgICAgIHJlcy5uY29sICAgICAgPSBtYXQuY29scygpOworICAgIH0KKworICAgIHJlcy5NdHlwZSAgICAgICA9IFNMVV9HRTsKKworICAgIHJlcy5zdG9yYWdlLm5ueiAgICAgICA9IG1hdC5ub25aZXJvcygpOworICAgIHJlcy5zdG9yYWdlLnZhbHVlcyAgICA9IG1hdC52YWx1ZVB0cigpOworICAgIHJlcy5zdG9yYWdlLmlubmVySW5kICA9IG1hdC5pbm5lckluZGV4UHRyKCk7CisgICAgcmVzLnN0b3JhZ2Uub3V0ZXJJbmQgID0gbWF0Lm91dGVySW5kZXhQdHIoKTsKKworICAgIHJlcy5zZXRTY2FsYXJUeXBlPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4oKTsKKworICAgIC8vIEZJWE1FIHRoZSBmb2xsb3dpbmcgaXMgbm90IHZlcnkgYWNjdXJhdGUKKyAgICBpZiAoTWF0cml4VHlwZTo6RmxhZ3MgJiBVcHBlcikKKyAgICAgIHJlcy5NdHlwZSA9IFNMVV9UUlU7CisgICAgaWYgKE1hdHJpeFR5cGU6OkZsYWdzICYgTG93ZXIpCisgICAgICByZXMuTXR5cGUgPSBTTFVfVFJMOworCisgICAgZWlnZW5fYXNzZXJ0KCgoTWF0cml4VHlwZTo6RmxhZ3MgJiBTZWxmQWRqb2ludCk9PTApICYmICJTZWxmQWRqb2ludCBtYXRyaXggc2hhcGUgbm90IHN1cHBvcnRlZCBieSBTdXBlckxVIik7CisgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitTbHVNYXRyaXggYXNTbHVNYXRyaXgoTWF0cml4VHlwZSYgbWF0KQoreworICByZXR1cm4gU2x1TWF0cml4OjpNYXAobWF0KTsKK30KKworLyoqIFZpZXcgYSBTdXBlciBMVSBtYXRyaXggYXMgYW4gRWlnZW4gZXhwcmVzc2lvbiAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3MsIHR5cGVuYW1lIEluZGV4PgorTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncyxJbmRleD4gbWFwX3N1cGVybHUoU2x1TWF0cml4JiBzbHVNYXQpCit7CisgIGVpZ2VuX2Fzc2VydCgoRmxhZ3MmUm93TWFqb3IpPT1Sb3dNYWpvciAmJiBzbHVNYXQuU3R5cGUgPT0gU0xVX05SCisgICAgICAgICB8fCAoRmxhZ3MmQ29sTWFqb3IpPT1Db2xNYWpvciAmJiBzbHVNYXQuU3R5cGUgPT0gU0xVX05DKTsKKworICBJbmRleCBvdXRlclNpemUgPSAoRmxhZ3MmUm93TWFqb3IpPT1Sb3dNYWpvciA/IHNsdU1hdC5uY29sIDogc2x1TWF0Lm5yb3c7CisKKyAgcmV0dXJuIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3MsSW5kZXg+KAorICAgIHNsdU1hdC5ucm93LCBzbHVNYXQubmNvbCwgc2x1TWF0LnN0b3JhZ2Uub3V0ZXJJbmRbb3V0ZXJTaXplXSwKKyAgICBzbHVNYXQuc3RvcmFnZS5vdXRlckluZCwgc2x1TWF0LnN0b3JhZ2UuaW5uZXJJbmQsIHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4oc2x1TWF0LnN0b3JhZ2UudmFsdWVzKSApOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIFN1cGVyTFVTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBTdXBlckxVQmFzZQorICAqIFxicmllZiBUaGUgYmFzZSBjbGFzcyBmb3IgdGhlIGRpcmVjdCBhbmQgaW5jb21wbGV0ZSBMVSBmYWN0b3JpemF0aW9uIG9mIFN1cGVyTFUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgU3VwZXJMVUJhc2UgOiBwdWJsaWMgU3BhcnNlU29sdmVyQmFzZTxEZXJpdmVkPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3I7CisgICAgdHlwZWRlZiBNYXRyaXg8aW50LCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gSW50Um93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxpbnQsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBJbnRDb2xWZWN0b3JUeXBlOyAgICAKKyAgICB0eXBlZGVmIE1hcDxQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsaW50PiA+IFBlcm11dGF0aW9uTWFwOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTFVNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgIHB1YmxpYzoKKworICAgIFN1cGVyTFVCYXNlKCkge30KKworICAgIH5TdXBlckxVQmFzZSgpCisgICAgeworICAgICAgY2xlYXJGYWN0b3JzKCk7CisgICAgfQorICAgIAorICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFN1cGVyIExVIG9wdGlvbiBvYmplY3QgdG8gY29uZmlndXJlIHRoZSAgU3VwZXIgTFUgYWxnb3JpdGhtcy4gKi8KKyAgICBpbmxpbmUgc3VwZXJsdV9vcHRpb25zX3QmIG9wdGlvbnMoKSB7IHJldHVybiBtX3NsdU9wdGlvbnM7IH0KKyAgICAKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgbWF0cml4LmFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICB2b2lkIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGRlcml2ZWQoKS5hbmFseXplUGF0dGVybihtYXRyaXgpOworICAgICAgZGVyaXZlZCgpLmZhY3Rvcml6ZShtYXRyaXgpOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKiAKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgLyptYXRyaXgqLykKKyAgICB7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtPgorICAgIHZvaWQgZHVtcE1lbW9yeShTdHJlYW0mIC8qcyovKQorICAgIHt9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAKKyAgICB2b2lkIGluaXRGYWN0b3JpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmIGEpCisgICAgeworICAgICAgc2V0X2RlZmF1bHRfb3B0aW9ucygmdGhpcy0+bV9zbHVPcHRpb25zKTsKKyAgICAgIAorICAgICAgY29uc3QgSW5kZXggc2l6ZSA9IGEucm93cygpOworICAgICAgbV9tYXRyaXggPSBhOworCisgICAgICBtX3NsdUEgPSBpbnRlcm5hbDo6YXNTbHVNYXRyaXgobV9tYXRyaXgpOworICAgICAgY2xlYXJGYWN0b3JzKCk7CisKKyAgICAgIG1fcC5yZXNpemUoc2l6ZSk7CisgICAgICBtX3EucmVzaXplKHNpemUpOworICAgICAgbV9zbHVSc2NhbGUucmVzaXplKHNpemUpOworICAgICAgbV9zbHVDc2NhbGUucmVzaXplKHNpemUpOworICAgICAgbV9zbHVFdHJlZS5yZXNpemUoc2l6ZSk7CisKKyAgICAgIC8vIHNldCBlbXB0eSBCIGFuZCBYCisgICAgICBtX3NsdUIuc2V0U3RvcmFnZVR5cGUoU0xVX0ROKTsKKyAgICAgIG1fc2x1Qi5zZXRTY2FsYXJUeXBlPFNjYWxhcj4oKTsKKyAgICAgIG1fc2x1Qi5NdHlwZSAgICAgICAgICA9IFNMVV9HRTsKKyAgICAgIG1fc2x1Qi5zdG9yYWdlLnZhbHVlcyA9IDA7CisgICAgICBtX3NsdUIubnJvdyAgICAgICAgICAgPSAwOworICAgICAgbV9zbHVCLm5jb2wgICAgICAgICAgID0gMDsKKyAgICAgIG1fc2x1Qi5zdG9yYWdlLmxkYSAgICA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PGludD4oc2l6ZSk7CisgICAgICBtX3NsdVggICAgICAgICAgICAgICAgPSBtX3NsdUI7CisgICAgICAKKyAgICAgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgIG1fc2x1TC5TdG9yZSA9IDA7CisgICAgICBtX3NsdVUuU3RvcmUgPSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIGV4dHJhY3REYXRhKCkgY29uc3Q7CisKKyAgICB2b2lkIGNsZWFyRmFjdG9ycygpCisgICAgeworICAgICAgaWYobV9zbHVMLlN0b3JlKQorICAgICAgICBEZXN0cm95X1N1cGVyTm9kZV9NYXRyaXgoJm1fc2x1TCk7CisgICAgICBpZihtX3NsdVUuU3RvcmUpCisgICAgICAgIERlc3Ryb3lfQ29tcENvbF9NYXRyaXgoJm1fc2x1VSk7CisKKyAgICAgIG1fc2x1TC5TdG9yZSA9IDA7CisgICAgICBtX3NsdVUuU3RvcmUgPSAwOworCisgICAgICBtZW1zZXQoJm1fc2x1TCwwLHNpemVvZiBtX3NsdUwpOworICAgICAgbWVtc2V0KCZtX3NsdVUsMCxzaXplb2YgbV9zbHVVKTsKKyAgICB9CisKKyAgICAvLyBjYWNoZWQgZGF0YSB0byByZWR1Y2UgcmVhbGxvY2F0aW9uLCBldGMuCisgICAgbXV0YWJsZSBMVU1hdHJpeFR5cGUgbV9sOworICAgIG11dGFibGUgTFVNYXRyaXhUeXBlIG1fdTsKKyAgICBtdXRhYmxlIEludENvbFZlY3RvclR5cGUgbV9wOworICAgIG11dGFibGUgSW50Um93VmVjdG9yVHlwZSBtX3E7CisKKyAgICBtdXRhYmxlIExVTWF0cml4VHlwZSBtX21hdHJpeDsgIC8vIGNvcHkgb2YgdGhlIGZhY3Rvcml6ZWQgbWF0cml4CisgICAgbXV0YWJsZSBTbHVNYXRyaXggbV9zbHVBOworICAgIG11dGFibGUgU3VwZXJNYXRyaXggbV9zbHVMLCBtX3NsdVU7CisgICAgbXV0YWJsZSBTbHVNYXRyaXggbV9zbHVCLCBtX3NsdVg7CisgICAgbXV0YWJsZSBTdXBlckxVU3RhdF90IG1fc2x1U3RhdDsKKyAgICBtdXRhYmxlIHN1cGVybHVfb3B0aW9uc190IG1fc2x1T3B0aW9uczsKKyAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPGludD4gbV9zbHVFdHJlZTsKKyAgICBtdXRhYmxlIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsMT4gbV9zbHVSc2NhbGUsIG1fc2x1Q3NjYWxlOworICAgIG11dGFibGUgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPiBtX3NsdUZlcnIsIG1fc2x1QmVycjsKKyAgICBtdXRhYmxlIGNoYXIgbV9zbHVFcXVlZDsKKworICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBpbnQgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBpbnQgbV9hbmFseXNpc0lzT2s7CisgICAgbXV0YWJsZSBib29sIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5OworICAgIAorICBwcml2YXRlOgorICAgIFN1cGVyTFVCYXNlKFN1cGVyTFVCYXNlJiApIHsgfQorfTsKKworCisvKiogXGluZ3JvdXAgU3VwZXJMVVN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFN1cGVyTFUKKyAgKiBcYnJpZWYgQSBzcGFyc2UgZGlyZWN0IExVIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgU3VwZXJMVSBsaWJyYXJ5CisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhIGRpcmVjdCBMVSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIFN1cGVyTFUgbGlicmFyeS4gVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNxdWFyZWQgYW5kIGludmVydGlibGUuIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICoKKyAgKiBcd2FybmluZyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRoZSA0LnggdmVyc2lvbnMgb2YgU3VwZXJMVS4gVGhlIDMueCBhbmQgNS54IHZlcnNpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAqCisgICogXGltcGxzcGFyc2Vzb2x2ZXJjb25jZXB0CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQsIGNsYXNzIFNwYXJzZUxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4KK2NsYXNzIFN1cGVyTFUgOiBwdWJsaWMgU3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsU3VwZXJMVTxfTWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTdXBlckxVQmFzZTxfTWF0cml4VHlwZSxTdXBlckxVPiBCYXNlOworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW50Um93VmVjdG9yVHlwZSBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW50Q29sVmVjdG9yVHlwZSBJbnRDb2xWZWN0b3JUeXBlOyAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UGVybXV0YXRpb25NYXAgUGVybXV0YXRpb25NYXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpMVU1hdHJpeFR5cGUgTFVNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8TFVNYXRyaXhUeXBlLCBMb3dlcnxVbml0RGlhZz4gIExNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8TFVNYXRyaXhUeXBlLCAgVXBwZXI+ICAgICAgICAgIFVNYXRyaXhUeXBlOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBCYXNlOjpfc29sdmVfaW1wbDsKKworICAgIFN1cGVyTFUoKSA6IEJhc2UoKSB7IGluaXQoKTsgfQorCisgICAgZXhwbGljaXQgU3VwZXJMVShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgQmFzZTo6Y29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIH5TdXBlckxVKCkKKyAgICB7CisgICAgfQorICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKiAKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgQmFzZTo6YW5hbHl6ZVBhdHRlcm4obWF0cml4KTsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdDsKKyAgICAKKyAgICBpbmxpbmUgY29uc3QgTE1hdHJpeFR5cGUmIG1hdHJpeEwoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgdGhpcy0+ZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX2w7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFVNYXRyaXhUeXBlJiBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpIHRoaXMtPmV4dHJhY3REYXRhKCk7CisgICAgICByZXR1cm4gbV91OworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbnRDb2xWZWN0b3JUeXBlJiBwZXJtdXRhdGlvblAoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgdGhpcy0+ZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX3A7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IEludFJvd1ZlY3RvclR5cGUmIHBlcm11dGF0aW9uUSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KSB0aGlzLT5leHRyYWN0RGF0YSgpOworICAgICAgcmV0dXJuIG1fcTsKKyAgICB9CisgICAgCisgICAgU2NhbGFyIGRldGVybWluYW50KCkgY29uc3Q7CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAKKyAgICB1c2luZyBCYXNlOjptX21hdHJpeDsKKyAgICB1c2luZyBCYXNlOjptX3NsdU9wdGlvbnM7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVBOworICAgIHVzaW5nIEJhc2U6Om1fc2x1QjsKKyAgICB1c2luZyBCYXNlOjptX3NsdVg7CisgICAgdXNpbmcgQmFzZTo6bV9wOworICAgIHVzaW5nIEJhc2U6Om1fcTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUV0cmVlOworICAgIHVzaW5nIEJhc2U6Om1fc2x1RXF1ZWQ7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVSc2NhbGU7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVDc2NhbGU7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVMOworICAgIHVzaW5nIEJhc2U6Om1fc2x1VTsKKyAgICB1c2luZyBCYXNlOjptX3NsdVN0YXQ7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVGZXJyOworICAgIHVzaW5nIEJhc2U6Om1fc2x1QmVycjsKKyAgICB1c2luZyBCYXNlOjptX2w7CisgICAgdXNpbmcgQmFzZTo6bV91OworICAgIAorICAgIHVzaW5nIEJhc2U6Om1fYW5hbHlzaXNJc09rOworICAgIHVzaW5nIEJhc2U6Om1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgdXNpbmcgQmFzZTo6bV9leHRyYWN0ZWREYXRhQXJlRGlydHk7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIHVzaW5nIEJhc2U6Om1faW5mbzsKKyAgICAKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIEJhc2U6OmluaXQoKTsKKyAgICAgIAorICAgICAgc2V0X2RlZmF1bHRfb3B0aW9ucygmdGhpcy0+bV9zbHVPcHRpb25zKTsKKyAgICAgIG1fc2x1T3B0aW9ucy5QcmludFN0YXQgICAgICAgID0gTk87CisgICAgICBtX3NsdU9wdGlvbnMuQ29uZGl0aW9uTnVtYmVyICA9IE5POworICAgICAgbV9zbHVPcHRpb25zLlRyYW5zICAgICAgICAgICAgPSBOT1RSQU5TOworICAgICAgbV9zbHVPcHRpb25zLkNvbFBlcm0gICAgICAgICAgPSBDT0xBTUQ7CisgICAgfQorICAgIAorICAgIAorICBwcml2YXRlOgorICAgIFN1cGVyTFUoU3VwZXJMVSYgKSB7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIFN1cGVyTFU8TWF0cml4VHlwZT46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBpZighbV9hbmFseXNpc0lzT2spCisgIHsKKyAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgICAgcmV0dXJuOworICB9CisgIAorICB0aGlzLT5pbml0RmFjdG9yaXphdGlvbihhKTsKKyAgCisgIG1fc2x1T3B0aW9ucy5Db2xQZXJtID0gQ09MQU1EOworICBpbnQgaW5mbyA9IDA7CisgIFJlYWxTY2FsYXIgcmVjaXBfcGl2b3RfZ3Jvd3RoLCByY29uZDsKKyAgUmVhbFNjYWxhciBmZXJyLCBiZXJyOworCisgIFN0YXRJbml0KCZtX3NsdVN0YXQpOworICBTdXBlckxVX2dzc3Z4KCZtX3NsdU9wdGlvbnMsICZtX3NsdUEsIG1fcS5kYXRhKCksIG1fcC5kYXRhKCksICZtX3NsdUV0cmVlWzBdLAorICAgICAgICAgICAgICAgICZtX3NsdUVxdWVkLCAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJmZlcnIsICZiZXJyLAorICAgICAgICAgICAgICAgICZtX3NsdVN0YXQsICZpbmZvLCBTY2FsYXIoKSk7CisgIFN0YXRGcmVlKCZtX3NsdVN0YXQpOworCisgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gdHJ1ZTsKKworICAvLyBGSVhNRSBob3cgdG8gYmV0dGVyIGNoZWNrIGZvciBlcnJvcnMgPz8/CisgIG1faW5mbyA9IGluZm8gPT0gMCA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KK3ZvaWQgU3VwZXJMVTxNYXRyaXhUeXBlPjo6X3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+JiB4KSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9mYWN0b3JpemF0aW9uSXNPayAmJiAiVGhlIGRlY29tcG9zaXRpb24gaXMgbm90IGluIGEgdmFsaWQgc3RhdGUgZm9yIHNvbHZpbmcsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpL2ZhY3Rvcml6ZSgpIik7CisKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0cml4LnJvd3MoKTsKKyAgY29uc3QgSW5kZXggcmhzQ29scyA9IGIuY29scygpOworICBlaWdlbl9hc3NlcnQoc2l6ZT09Yi5yb3dzKCkpOworCisgIG1fc2x1T3B0aW9ucy5UcmFucyA9IE5PVFJBTlM7CisgIG1fc2x1T3B0aW9ucy5GYWN0ID0gRkFDVE9SRUQ7CisgIG1fc2x1T3B0aW9ucy5JdGVyUmVmaW5lID0gTk9SRUZJTkU7CisgIAorCisgIG1fc2x1RmVyci5yZXNpemUocmhzQ29scyk7CisgIG1fc2x1QmVyci5yZXNpemUocmhzQ29scyk7CisgIAorICBSZWY8Y29uc3QgTWF0cml4PHR5cGVuYW1lIFJoczo6U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gPiBiX3JlZihiKTsKKyAgUmVmPGNvbnN0IE1hdHJpeDx0eXBlbmFtZSBEZXN0OjpTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiA+IHhfcmVmKHgpOworICAKKyAgbV9zbHVCID0gU2x1TWF0cml4OjpNYXAoYl9yZWYuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICBtX3NsdVggPSBTbHVNYXRyaXg6Ok1hcCh4X3JlZi5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7CisgIAorICB0eXBlbmFtZSBSaHM6OlBsYWluT2JqZWN0IGJfY3B5OworICBpZihtX3NsdUVxdWVkIT0nTicpCisgIHsKKyAgICBiX2NweSA9IGI7CisgICAgbV9zbHVCID0gU2x1TWF0cml4OjpNYXAoYl9jcHkuY29uc3RfY2FzdF9kZXJpdmVkKCkpOyAgCisgIH0KKworICBTdGF0SW5pdCgmbV9zbHVTdGF0KTsKKyAgaW50IGluZm8gPSAwOworICBSZWFsU2NhbGFyIHJlY2lwX3Bpdm90X2dyb3d0aCwgcmNvbmQ7CisgIFN1cGVyTFVfZ3NzdngoJm1fc2x1T3B0aW9ucywgJm1fc2x1QSwKKyAgICAgICAgICAgICAgICBtX3EuZGF0YSgpLCBtX3AuZGF0YSgpLAorICAgICAgICAgICAgICAgICZtX3NsdUV0cmVlWzBdLCAmbV9zbHVFcXVlZCwKKyAgICAgICAgICAgICAgICAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJm1fc2x1RmVyclswXSwgJm1fc2x1QmVyclswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVTdGF0LCAmaW5mbywgU2NhbGFyKCkpOworICBTdGF0RnJlZSgmbV9zbHVTdGF0KTsKKyAgCisgIGlmKHguZGVyaXZlZCgpLmRhdGEoKSAhPSB4X3JlZi5kYXRhKCkpCisgICAgeCA9IHhfcmVmOworICAKKyAgbV9pbmZvID0gaW5mbz09MCA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKK30KKworLy8gdGhlIGNvZGUgb2YgdGhpcyBleHRyYWN0RGF0YSgpIGZ1bmN0aW9uIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgU3VwZXJMVSdzIE1hdGxhYiBzdXBwb3J0IGNvZGUsCisvLworLy8gIENvcHlyaWdodCAoYykgMTk5NCBieSBYZXJveCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQVMgSVMsIFdJVEggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWQorLy8gIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIFN1cGVyTFVCYXNlPE1hdHJpeFR5cGUsRGVyaXZlZD46OmV4dHJhY3REYXRhKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBleHRyYWN0aW5nIGZhY3RvcnMsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpL2ZhY3Rvcml6ZSgpIik7CisgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkKKyAgeworICAgIGludCAgICAgICAgIHVwcGVyOworICAgIGludCAgICAgICAgIGZzdXBjLCBpc3RhcnQsIG5zdXByOworICAgIGludCAgICAgICAgIGxhc3RsID0gMCwgbGFzdHUgPSAwOworICAgIFNDZm9ybWF0ICAgICpMc3RvcmUgPSBzdGF0aWNfY2FzdDxTQ2Zvcm1hdCo+KG1fc2x1TC5TdG9yZSk7CisgICAgTkNmb3JtYXQgICAgKlVzdG9yZSA9IHN0YXRpY19jYXN0PE5DZm9ybWF0Kj4obV9zbHVVLlN0b3JlKTsKKyAgICBTY2FsYXIgICAgICAqU05wdHI7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gbV9tYXRyaXgucm93cygpOworICAgIG1fbC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgICBtX2wucmVzaXplTm9uWmVyb3MoTHN0b3JlLT5ubnopOworICAgIG1fdS5yZXNpemUoc2l6ZSxzaXplKTsKKyAgICBtX3UucmVzaXplTm9uWmVyb3MoVXN0b3JlLT5ubnopOworCisgICAgaW50KiBMY29sID0gbV9sLm91dGVySW5kZXhQdHIoKTsKKyAgICBpbnQqIExyb3cgPSBtX2wuaW5uZXJJbmRleFB0cigpOworICAgIFNjYWxhciogTHZhbCA9IG1fbC52YWx1ZVB0cigpOworCisgICAgaW50KiBVY29sID0gbV91Lm91dGVySW5kZXhQdHIoKTsKKyAgICBpbnQqIFVyb3cgPSBtX3UuaW5uZXJJbmRleFB0cigpOworICAgIFNjYWxhciogVXZhbCA9IG1fdS52YWx1ZVB0cigpOworCisgICAgVWNvbFswXSA9IDA7CisgICAgVWNvbFswXSA9IDA7CisKKyAgICAvKiBmb3IgZWFjaCBzdXBlcm5vZGUgKi8KKyAgICBmb3IgKGludCBrID0gMDsgayA8PSBMc3RvcmUtPm5zdXBlcjsgKytrKQorICAgIHsKKyAgICAgIGZzdXBjICAgPSBMX0ZTVF9TVVBDKGspOworICAgICAgaXN0YXJ0ICA9IExfU1VCX1NUQVJUKGZzdXBjKTsKKyAgICAgIG5zdXByICAgPSBMX1NVQl9TVEFSVChmc3VwYysxKSAtIGlzdGFydDsKKyAgICAgIHVwcGVyICAgPSAxOworCisgICAgICAvKiBmb3IgZWFjaCBjb2x1bW4gaW4gdGhlIHN1cGVybm9kZSAqLworICAgICAgZm9yIChpbnQgaiA9IGZzdXBjOyBqIDwgTF9GU1RfU1VQQyhrKzEpOyArK2opCisgICAgICB7CisgICAgICAgIFNOcHRyID0gJigoU2NhbGFyKilMc3RvcmUtPm56dmFsKVtMX05aX1NUQVJUKGopXTsKKworICAgICAgICAvKiBFeHRyYWN0IFUgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IFVfTlpfU1RBUlQoaik7IGkgPCBVX05aX1NUQVJUKGorMSk7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIFV2YWxbbGFzdHVdID0gKChTY2FsYXIqKVVzdG9yZS0+bnp2YWwpW2ldOworICAgICAgICAgIC8qIE1hdGxhYiBkb2Vzbid0IGxpa2UgZXhwbGljaXQgemVyby4gKi8KKyAgICAgICAgICBpZiAoVXZhbFtsYXN0dV0gIT0gMC4wKQorICAgICAgICAgICAgVXJvd1tsYXN0dSsrXSA9IFVfU1VCKGkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXBwZXI7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHVwcGVyIHRyaWFuZ2xlIGluIHRoZSBzdXBlcm5vZGUgKi8KKyAgICAgICAgICBVdmFsW2xhc3R1XSA9IFNOcHRyW2ldOworICAgICAgICAgIC8qIE1hdGxhYiBkb2Vzbid0IGxpa2UgZXhwbGljaXQgemVyby4gKi8KKyAgICAgICAgICBpZiAoVXZhbFtsYXN0dV0gIT0gMC4wKQorICAgICAgICAgICAgVXJvd1tsYXN0dSsrXSA9IExfU1VCKGlzdGFydCtpKTsKKyAgICAgICAgfQorICAgICAgICBVY29sW2orMV0gPSBsYXN0dTsKKworICAgICAgICAvKiBFeHRyYWN0IEwgKi8KKyAgICAgICAgTHZhbFtsYXN0bF0gPSAxLjA7IC8qIHVuaXQgZGlhZ29uYWwgKi8KKyAgICAgICAgTHJvd1tsYXN0bCsrXSA9IExfU1VCKGlzdGFydCArIHVwcGVyIC0gMSk7CisgICAgICAgIGZvciAoaW50IGkgPSB1cHBlcjsgaSA8IG5zdXByOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBMdmFsW2xhc3RsXSA9IFNOcHRyW2ldOworICAgICAgICAgIC8qIE1hdGxhYiBkb2Vzbid0IGxpa2UgZXhwbGljaXQgemVyby4gKi8KKyAgICAgICAgICBpZiAoTHZhbFtsYXN0bF0gIT0gMC4wKQorICAgICAgICAgICAgTHJvd1tsYXN0bCsrXSA9IExfU1VCKGlzdGFydCtpKTsKKyAgICAgICAgfQorICAgICAgICBMY29sW2orMV0gPSBsYXN0bDsKKworICAgICAgICArK3VwcGVyOworICAgICAgfSAvKiBmb3IgaiAuLi4gKi8KKworICAgIH0gLyogZm9yIGsgLi4uICovCisKKyAgICAvLyBzcXVlZXplIHRoZSBtYXRyaWNlcyA6CisgICAgbV9sLnJlc2l6ZU5vblplcm9zKGxhc3RsKTsKKyAgICBtX3UucmVzaXplTm9uWmVyb3MobGFzdHUpOworCisgICAgbV9leHRyYWN0ZWREYXRhQXJlRGlydHkgPSBmYWxzZTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgU3VwZXJMVTxNYXRyaXhUeXBlPjo6U2NhbGFyIFN1cGVyTFU8TWF0cml4VHlwZT46OmRldGVybWluYW50KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBjb21wdXRpbmcgdGhlIGRldGVybWluYW50LCB5b3UgbXVzdCBmaXJzdCBjYWxsIGVpdGhlciBjb21wdXRlKCkgb3IgYW5hbHl6ZVBhdHRlcm4oKS9mYWN0b3JpemUoKSIpOworICAKKyAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KQorICAgIHRoaXMtPmV4dHJhY3REYXRhKCk7CisKKyAgU2NhbGFyIGRldCA9IFNjYWxhcigxKTsKKyAgZm9yIChpbnQgaj0wOyBqPG1fdS5jb2xzKCk7ICsraikKKyAgeworICAgIGlmIChtX3Uub3V0ZXJJbmRleFB0cigpW2orMV0tbV91Lm91dGVySW5kZXhQdHIoKVtqXSA+IDApCisgICAgeworICAgICAgaW50IGxhc3RJZCA9IG1fdS5vdXRlckluZGV4UHRyKClbaisxXS0xOworICAgICAgZWlnZW5fYXNzZXJ0KG1fdS5pbm5lckluZGV4UHRyKClbbGFzdElkXTw9aik7CisgICAgICBpZiAobV91LmlubmVySW5kZXhQdHIoKVtsYXN0SWRdPT1qKQorICAgICAgICBkZXQgKj0gbV91LnZhbHVlUHRyKClbbGFzdElkXTsKKyAgICB9CisgIH0KKyAgaWYoUGVybXV0YXRpb25NYXAobV9wLmRhdGEoKSxtX3Auc2l6ZSgpKS5kZXRlcm1pbmFudCgpKlBlcm11dGF0aW9uTWFwKG1fcS5kYXRhKCksbV9xLnNpemUoKSkuZGV0ZXJtaW5hbnQoKTwwKQorICAgIGRldCA9IC1kZXQ7CisgIGlmKG1fc2x1RXF1ZWQhPSdOJykKKyAgICByZXR1cm4gZGV0L21fc2x1UnNjYWxlLnByb2QoKS9tX3NsdUNzY2FsZS5wcm9kKCk7CisgIGVsc2UKKyAgICByZXR1cm4gZGV0OworfQorCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyNkZWZpbmUgRUlHRU5fU1VQRVJMVV9IQVNfSUxVCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1NVUEVSTFVfSEFTX0lMVQorCisvKiogXGluZ3JvdXAgU3VwZXJMVVN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFN1cGVySUxVCisgICogXGJyaWVmIEEgc3BhcnNlIGRpcmVjdCBcYiBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgU3VwZXJMVSBsaWJyYXJ5CisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgYW4gYXBwcm94aW1hdGUgc29sdXRpb24gb2YgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhbiBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgU3VwZXJMVSBsaWJyYXJ5LiBUaGlzIGNsYXNzIGlzIGFpbWVkIHRvIGJlIHVzZWQgYXMgYSBwcmVjb25kaXRpb25lciBvZiB0aGUgaXRlcmF0aXZlIGxpbmVhciBzb2x2ZXJzLgorICAqCisgICogXHdhcm5pbmcgVGhpcyBjbGFzcyBpcyBvbmx5IGZvciB0aGUgNC54IHZlcnNpb25zIG9mIFN1cGVyTFUuIFRoZSAzLnggYW5kIDUueCB2ZXJzaW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlU29sdmVyQ29uY2VwdCwgY2xhc3MgSW5jb21wbGV0ZUxVVCwgY2xhc3MgQ29uanVnYXRlR3JhZGllbnQsIGNsYXNzIEJpQ0dTVEFCCisgICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorY2xhc3MgU3VwZXJJTFUgOiBwdWJsaWMgU3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsU3VwZXJJTFU8X01hdHJpeFR5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsU3VwZXJJTFU+IEJhc2U7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgQmFzZTo6X3NvbHZlX2ltcGw7CisKKyAgICBTdXBlcklMVSgpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBTdXBlcklMVShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgQmFzZTo6Y29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIH5TdXBlcklMVSgpCisgICAgeworICAgIH0KKyAgICAKKyAgICAvKiogUGVyZm9ybXMgYSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIG9uIHRoZSBzcGFyY2l0eSBvZiBcYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHNvbHZpbmcgZm9yIHNldmVyYWwgcHJvYmxlbXMgaGF2aW5nIHRoZSBzYW1lIHN0cnVjdHVyZS4KKyAgICAgICogCisgICAgICAqIFxzYSBmYWN0b3JpemUoKQorICAgICAgKi8KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybihtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICAvKiogUGVyZm9ybXMgYSBudW1lcmljIGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4CisgICAgICAqCisgICAgICAqIFRoZSBnaXZlbiBtYXRyaXggbXVzdCBoYXMgdGhlIHNhbWUgc3BhcmNpdHkgdGhhbiB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKyAgICAKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdDsKKyAgICAjZW5kaWYgLy8gRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHVzaW5nIEJhc2U6Om1fbWF0cml4OworICAgIHVzaW5nIEJhc2U6Om1fc2x1T3B0aW9uczsKKyAgICB1c2luZyBCYXNlOjptX3NsdUE7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVCOworICAgIHVzaW5nIEJhc2U6Om1fc2x1WDsKKyAgICB1c2luZyBCYXNlOjptX3A7CisgICAgdXNpbmcgQmFzZTo6bV9xOworICAgIHVzaW5nIEJhc2U6Om1fc2x1RXRyZWU7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVFcXVlZDsKKyAgICB1c2luZyBCYXNlOjptX3NsdVJzY2FsZTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUNzY2FsZTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUw7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVVOworICAgIHVzaW5nIEJhc2U6Om1fc2x1U3RhdDsKKyAgICB1c2luZyBCYXNlOjptX3NsdUZlcnI7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVCZXJyOworICAgIHVzaW5nIEJhc2U6Om1fbDsKKyAgICB1c2luZyBCYXNlOjptX3U7CisgICAgCisgICAgdXNpbmcgQmFzZTo6bV9hbmFseXNpc0lzT2s7CisgICAgdXNpbmcgQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICB1c2luZyBCYXNlOjptX2V4dHJhY3RlZERhdGFBcmVEaXJ0eTsKKyAgICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CisgICAgdXNpbmcgQmFzZTo6bV9pbmZvOworCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBCYXNlOjppbml0KCk7CisgICAgICAKKyAgICAgIGlsdV9zZXRfZGVmYXVsdF9vcHRpb25zKCZtX3NsdU9wdGlvbnMpOworICAgICAgbV9zbHVPcHRpb25zLlByaW50U3RhdCAgICAgICAgPSBOTzsKKyAgICAgIG1fc2x1T3B0aW9ucy5Db25kaXRpb25OdW1iZXIgID0gTk87CisgICAgICBtX3NsdU9wdGlvbnMuVHJhbnMgICAgICAgICAgICA9IE5PVFJBTlM7CisgICAgICBtX3NsdU9wdGlvbnMuQ29sUGVybSAgICAgICAgICA9IE1NRF9BVF9QTFVTX0E7CisgICAgICAKKyAgICAgIC8vIG5vIGF0dGVtcHQgdG8gcHJlc2VydmUgY29sdW1uIHN1bQorICAgICAgbV9zbHVPcHRpb25zLklMVV9NSUxVID0gU0lMVTsKKyAgICAgIC8vIG9ubHkgYmFzaWMgSUxVKGspIHN1cHBvcnQgLS0gbm8gZGlyZWN0IGNvbnRyb2wgb3ZlciBtZW1vcnkgY29uc3VtcHRpb24KKyAgICAgIC8vIGJldHRlciB0byB1c2UgSUxVX0Ryb3BSdWxlID0gRFJPUF9CQVNJQyB8IERST1BfQVJFQQorICAgICAgLy8gYW5kIHNldCBJTFVfRmlsbEZhY3RvciB0byBtYXggbWVtb3J5IGdyb3d0aAorICAgICAgbV9zbHVPcHRpb25zLklMVV9Ecm9wUnVsZSA9IERST1BfQkFTSUM7CisgICAgICBtX3NsdU9wdGlvbnMuSUxVX0Ryb3BUb2wgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkqMTA7CisgICAgfQorICAgIAorICBwcml2YXRlOgorICAgIFN1cGVySUxVKFN1cGVySUxVJiApIHsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgU3VwZXJJTFU8TWF0cml4VHlwZT46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBpZighbV9hbmFseXNpc0lzT2spCisgIHsKKyAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgICAgcmV0dXJuOworICB9CisgIAorICB0aGlzLT5pbml0RmFjdG9yaXphdGlvbihhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIFJlYWxTY2FsYXIgcmVjaXBfcGl2b3RfZ3Jvd3RoLCByY29uZDsKKworICBTdGF0SW5pdCgmbV9zbHVTdGF0KTsKKyAgU3VwZXJMVV9nc2lzeCgmbV9zbHVPcHRpb25zLCAmbV9zbHVBLCBtX3EuZGF0YSgpLCBtX3AuZGF0YSgpLCAmbV9zbHVFdHJlZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVFcXVlZCwgJm1fc2x1UnNjYWxlWzBdLCAmbV9zbHVDc2NhbGVbMF0sCisgICAgICAgICAgICAgICAgJm1fc2x1TCwgJm1fc2x1VSwKKyAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICZtX3NsdUIsICZtX3NsdVgsCisgICAgICAgICAgICAgICAgJnJlY2lwX3Bpdm90X2dyb3d0aCwgJnJjb25kLAorICAgICAgICAgICAgICAgICZtX3NsdVN0YXQsICZpbmZvLCBTY2FsYXIoKSk7CisgIFN0YXRGcmVlKCZtX3NsdVN0YXQpOworCisgIC8vIEZJWE1FIGhvdyB0byBiZXR0ZXIgY2hlY2sgZm9yIGVycm9ycyA/Pz8KKyAgbV9pbmZvID0gaW5mbyA9PSAwID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlOworICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gdHJ1ZTsKK30KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0Pgordm9pZCBTdXBlcklMVTxNYXRyaXhUeXBlPjo6X3NvbHZlX2ltcGwoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+JiB4KSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9mYWN0b3JpemF0aW9uSXNPayAmJiAiVGhlIGRlY29tcG9zaXRpb24gaXMgbm90IGluIGEgdmFsaWQgc3RhdGUgZm9yIHNvbHZpbmcsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpL2ZhY3Rvcml6ZSgpIik7CisKKyAgY29uc3QgaW50IHNpemUgPSBtX21hdHJpeC5yb3dzKCk7CisgIGNvbnN0IGludCByaHNDb2xzID0gYi5jb2xzKCk7CisgIGVpZ2VuX2Fzc2VydChzaXplPT1iLnJvd3MoKSk7CisKKyAgbV9zbHVPcHRpb25zLlRyYW5zID0gTk9UUkFOUzsKKyAgbV9zbHVPcHRpb25zLkZhY3QgPSBGQUNUT1JFRDsKKyAgbV9zbHVPcHRpb25zLkl0ZXJSZWZpbmUgPSBOT1JFRklORTsKKworICBtX3NsdUZlcnIucmVzaXplKHJoc0NvbHMpOworICBtX3NsdUJlcnIucmVzaXplKHJoc0NvbHMpOworICAKKyAgUmVmPGNvbnN0IE1hdHJpeDx0eXBlbmFtZSBSaHM6OlNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+ID4gYl9yZWYoYik7CisgIFJlZjxjb25zdCBNYXRyaXg8dHlwZW5hbWUgRGVzdDo6U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gPiB4X3JlZih4KTsKKyAgCisgIG1fc2x1QiA9IFNsdU1hdHJpeDo6TWFwKGJfcmVmLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgbV9zbHVYID0gU2x1TWF0cml4OjpNYXAoeF9yZWYuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworCisgIHR5cGVuYW1lIFJoczo6UGxhaW5PYmplY3QgYl9jcHk7CisgIGlmKG1fc2x1RXF1ZWQhPSdOJykKKyAgeworICAgIGJfY3B5ID0gYjsKKyAgICBtX3NsdUIgPSBTbHVNYXRyaXg6Ok1hcChiX2NweS5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7ICAKKyAgfQorICAKKyAgaW50IGluZm8gPSAwOworICBSZWFsU2NhbGFyIHJlY2lwX3Bpdm90X2dyb3d0aCwgcmNvbmQ7CisKKyAgU3RhdEluaXQoJm1fc2x1U3RhdCk7CisgIFN1cGVyTFVfZ3Npc3goJm1fc2x1T3B0aW9ucywgJm1fc2x1QSwKKyAgICAgICAgICAgICAgICBtX3EuZGF0YSgpLCBtX3AuZGF0YSgpLAorICAgICAgICAgICAgICAgICZtX3NsdUV0cmVlWzBdLCAmbV9zbHVFcXVlZCwKKyAgICAgICAgICAgICAgICAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJm1fc2x1U3RhdCwgJmluZm8sIFNjYWxhcigpKTsKKyAgU3RhdEZyZWUoJm1fc2x1U3RhdCk7CisgIAorICBpZih4LmRlcml2ZWQoKS5kYXRhKCkgIT0geF9yZWYuZGF0YSgpKQorICAgIHggPSB4X3JlZjsKKworICBtX2luZm8gPSBpbmZvPT0wID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlOworfQorI2VuZGlmCisKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NVUEVSTFVTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9VbWZQYWNrU3VwcG9ydC9VbWZQYWNrU3VwcG9ydC5oIGIvRWlnZW4vc3JjL1VtZlBhY2tTdXBwb3J0L1VtZlBhY2tTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMDlhYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9VbWZQYWNrU3VwcG9ydC9VbWZQYWNrU3VwcG9ydC5oCkBAIC0wLDAgKzEsNTA2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9VTUZQQUNLU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX1VNRlBBQ0tTVVBQT1JUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyogVE9ETyBleHRyYWN0IEwsIGV4dHJhY3QgVSwgY29tcHV0ZSBkZXQsIGV0Yy4uLiAqLworCisvLyBnZW5lcmljIGRvdWJsZS9jb21wbGV4PGRvdWJsZT4gd3JhcHBlciBmdW5jdGlvbnM6CisKKworaW5saW5lIHZvaWQgdW1mcGFja19kZWZhdWx0cyhkb3VibGUgY29udHJvbFtVTUZQQUNLX0NPTlRST0xdLCBkb3VibGUpCit7IHVtZnBhY2tfZGlfZGVmYXVsdHMoY29udHJvbCk7IH0KKworaW5saW5lIHZvaWQgdW1mcGFja19kZWZhdWx0cyhkb3VibGUgY29udHJvbFtVTUZQQUNLX0NPTlRST0xdLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPikKK3sgdW1mcGFja196aV9kZWZhdWx0cyhjb250cm9sKTsgfQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX3JlcG9ydF9pbmZvKGRvdWJsZSBjb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sIGRvdWJsZSBpbmZvW1VNRlBBQ0tfSU5GT10sIGRvdWJsZSkKK3sgdW1mcGFja19kaV9yZXBvcnRfaW5mbyhjb250cm9sLCBpbmZvKTt9CisKK2lubGluZSB2b2lkIHVtZnBhY2tfcmVwb3J0X2luZm8oZG91YmxlIGNvbnRyb2xbVU1GUEFDS19DT05UUk9MXSwgZG91YmxlIGluZm9bVU1GUEFDS19JTkZPXSwgc3RkOjpjb21wbGV4PGRvdWJsZT4pCit7IHVtZnBhY2tfemlfcmVwb3J0X2luZm8oY29udHJvbCwgaW5mbyk7fQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX3JlcG9ydF9zdGF0dXMoZG91YmxlIGNvbnRyb2xbVU1GUEFDS19DT05UUk9MXSwgaW50IHN0YXR1cywgZG91YmxlKQoreyB1bWZwYWNrX2RpX3JlcG9ydF9zdGF0dXMoY29udHJvbCwgc3RhdHVzKTt9CisKK2lubGluZSB2b2lkIHVtZnBhY2tfcmVwb3J0X3N0YXR1cyhkb3VibGUgY29udHJvbFtVTUZQQUNLX0NPTlRST0xdLCBpbnQgc3RhdHVzLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPikKK3sgdW1mcGFja196aV9yZXBvcnRfc3RhdHVzKGNvbnRyb2wsIHN0YXR1cyk7fQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX3JlcG9ydF9jb250cm9sKGRvdWJsZSBjb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sIGRvdWJsZSkKK3sgdW1mcGFja19kaV9yZXBvcnRfY29udHJvbChjb250cm9sKTt9CisKK2lubGluZSB2b2lkIHVtZnBhY2tfcmVwb3J0X2NvbnRyb2woZG91YmxlIGNvbnRyb2xbVU1GUEFDS19DT05UUk9MXSwgc3RkOjpjb21wbGV4PGRvdWJsZT4pCit7IHVtZnBhY2tfemlfcmVwb3J0X2NvbnRyb2woY29udHJvbCk7fQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX2ZyZWVfbnVtZXJpYyh2b2lkICoqTnVtZXJpYywgZG91YmxlKQoreyB1bWZwYWNrX2RpX2ZyZWVfbnVtZXJpYyhOdW1lcmljKTsgKk51bWVyaWMgPSAwOyB9CisKK2lubGluZSB2b2lkIHVtZnBhY2tfZnJlZV9udW1lcmljKHZvaWQgKipOdW1lcmljLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPikKK3sgdW1mcGFja196aV9mcmVlX251bWVyaWMoTnVtZXJpYyk7ICpOdW1lcmljID0gMDsgfQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX2ZyZWVfc3ltYm9saWModm9pZCAqKlN5bWJvbGljLCBkb3VibGUpCit7IHVtZnBhY2tfZGlfZnJlZV9zeW1ib2xpYyhTeW1ib2xpYyk7ICpTeW1ib2xpYyA9IDA7IH0KKworaW5saW5lIHZvaWQgdW1mcGFja19mcmVlX3N5bWJvbGljKHZvaWQgKipTeW1ib2xpYywgc3RkOjpjb21wbGV4PGRvdWJsZT4pCit7IHVtZnBhY2tfemlfZnJlZV9zeW1ib2xpYyhTeW1ib2xpYyk7ICpTeW1ib2xpYyA9IDA7IH0KKworaW5saW5lIGludCB1bWZwYWNrX3N5bWJvbGljKGludCBuX3JvdyxpbnQgbl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBkb3VibGUgQXhbXSwgdm9pZCAqKlN5bWJvbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sIFtVTUZQQUNLX0NPTlRST0xdLCBkb3VibGUgSW5mbyBbVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfc3ltYm9saWMobl9yb3csbl9jb2wsQXAsQWksQXgsU3ltYm9saWMsQ29udHJvbCxJbmZvKTsKK30KKworaW5saW5lIGludCB1bWZwYWNrX3N5bWJvbGljKGludCBuX3JvdyxpbnQgbl9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBBeFtdLCB2b2lkICoqU3ltYm9saWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIENvbnRyb2wgW1VNRlBBQ0tfQ09OVFJPTF0sIGRvdWJsZSBJbmZvIFtVTUZQQUNLX0lORk9dKQoreworICByZXR1cm4gdW1mcGFja196aV9zeW1ib2xpYyhuX3JvdyxuX2NvbCxBcCxBaSwmbnVtZXh0OjpyZWFsX3JlZihBeFswXSksMCxTeW1ib2xpYyxDb250cm9sLEluZm8pOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfbnVtZXJpYyggY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBkb3VibGUgQXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpTeW1ib2xpYywgdm9pZCAqKk51bWVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIENvbnRyb2xbVU1GUEFDS19DT05UUk9MXSxkb3VibGUgSW5mbyBbVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfbnVtZXJpYyhBcCxBaSxBeCxTeW1ib2xpYyxOdW1lcmljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19udW1lcmljKCBjb25zdCBpbnQgQXBbXSwgY29uc3QgaW50IEFpW10sIGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+IEF4W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqU3ltYm9saWMsIHZvaWQgKipOdW1lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sZG91YmxlIEluZm8gW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX3ppX251bWVyaWMoQXAsQWksJm51bWV4dDo6cmVhbF9yZWYoQXhbMF0pLDAsU3ltYm9saWMsTnVtZXJpYyxDb250cm9sLEluZm8pOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfc29sdmUoIGludCBzeXMsIGNvbnN0IGludCBBcFtdLCBjb25zdCBpbnQgQWlbXSwgY29uc3QgZG91YmxlIEF4W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBYW10sIGNvbnN0IGRvdWJsZSBCW10sIHZvaWQgKk51bWVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sIGRvdWJsZSBJbmZvW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX2RpX3NvbHZlKHN5cyxBcCxBaSxBeCxYLEIsTnVtZXJpYyxDb250cm9sLEluZm8pOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfc29sdmUoIGludCBzeXMsIGNvbnN0IGludCBBcFtdLCBjb25zdCBpbnQgQWlbXSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gQXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4gWFtdLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBCW10sIHZvaWQgKk51bWVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sIGRvdWJsZSBJbmZvW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX3ppX3NvbHZlKHN5cyxBcCxBaSwmbnVtZXh0OjpyZWFsX3JlZihBeFswXSksMCwmbnVtZXh0OjpyZWFsX3JlZihYWzBdKSwwLCZudW1leHQ6OnJlYWxfcmVmKEJbMF0pLDAsTnVtZXJpYyxDb250cm9sLEluZm8pOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfZ2V0X2x1bnooaW50ICpsbnosIGludCAqdW56LCBpbnQgKm5fcm93LCBpbnQgKm5fY29sLCBpbnQgKm56X3VkaWFnLCB2b2lkICpOdW1lcmljLCBkb3VibGUpCit7CisgIHJldHVybiB1bWZwYWNrX2RpX2dldF9sdW56KGxueix1bnosbl9yb3csbl9jb2wsbnpfdWRpYWcsTnVtZXJpYyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19nZXRfbHVueihpbnQgKmxueiwgaW50ICp1bnosIGludCAqbl9yb3csIGludCAqbl9jb2wsIGludCAqbnpfdWRpYWcsIHZvaWQgKk51bWVyaWMsIHN0ZDo6Y29tcGxleDxkb3VibGU+KQoreworICByZXR1cm4gdW1mcGFja196aV9nZXRfbHVueihsbnosdW56LG5fcm93LG5fY29sLG56X3VkaWFnLE51bWVyaWMpOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfZ2V0X251bWVyaWMoaW50IExwW10sIGludCBMaltdLCBkb3VibGUgTHhbXSwgaW50IFVwW10sIGludCBVaVtdLCBkb3VibGUgVXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUFtdLCBpbnQgUVtdLCBkb3VibGUgRHhbXSwgaW50ICpkb19yZWNpcCwgZG91YmxlIFJzW10sIHZvaWQgKk51bWVyaWMpCit7CisgIHJldHVybiB1bWZwYWNrX2RpX2dldF9udW1lcmljKExwLExqLEx4LFVwLFVpLFV4LFAsUSxEeCxkb19yZWNpcCxScyxOdW1lcmljKTsKK30KKworaW5saW5lIGludCB1bWZwYWNrX2dldF9udW1lcmljKGludCBMcFtdLCBpbnQgTGpbXSwgc3RkOjpjb21wbGV4PGRvdWJsZT4gTHhbXSwgaW50IFVwW10sIGludCBVaVtdLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBVeFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBQW10sIGludCBRW10sIHN0ZDo6Y29tcGxleDxkb3VibGU+IER4W10sIGludCAqZG9fcmVjaXAsIGRvdWJsZSBSc1tdLCB2b2lkICpOdW1lcmljKQoreworICBkb3VibGUmIGx4MF9yZWFsID0gbnVtZXh0OjpyZWFsX3JlZihMeFswXSk7CisgIGRvdWJsZSYgdXgwX3JlYWwgPSBudW1leHQ6OnJlYWxfcmVmKFV4WzBdKTsKKyAgZG91YmxlJiBkeDBfcmVhbCA9IG51bWV4dDo6cmVhbF9yZWYoRHhbMF0pOworICByZXR1cm4gdW1mcGFja196aV9nZXRfbnVtZXJpYyhMcCxMaixMeD8mbHgwX3JlYWw6MCwwLFVwLFVpLFV4PyZ1eDBfcmVhbDowLDAsUCxRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeD8mZHgwX3JlYWw6MCwwLGRvX3JlY2lwLFJzLE51bWVyaWMpOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfZ2V0X2RldGVybWluYW50KGRvdWJsZSAqTXgsIGRvdWJsZSAqRXgsIHZvaWQgKk51bWVyaWNIYW5kbGUsIGRvdWJsZSBVc2VyX0luZm8gW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX2RpX2dldF9kZXRlcm1pbmFudChNeCxFeCxOdW1lcmljSGFuZGxlLFVzZXJfSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19nZXRfZGV0ZXJtaW5hbnQoc3RkOjpjb21wbGV4PGRvdWJsZT4gKk14LCBkb3VibGUgKkV4LCB2b2lkICpOdW1lcmljSGFuZGxlLCBkb3VibGUgVXNlcl9JbmZvIFtVTUZQQUNLX0lORk9dKQoreworICBkb3VibGUmIG14X3JlYWwgPSBudW1leHQ6OnJlYWxfcmVmKCpNeCk7CisgIHJldHVybiB1bWZwYWNrX3ppX2dldF9kZXRlcm1pbmFudCgmbXhfcmVhbCwwLEV4LE51bWVyaWNIYW5kbGUsVXNlcl9JbmZvKTsKK30KKworCisvKiogXGluZ3JvdXAgVW1mUGFja1N1cHBvcnRfTW9kdWxlCisgICogXGJyaWVmIEEgc3BhcnNlIExVIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiBVbWZQYWNrCisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhIExVIGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgVW1mUGFjayBsaWJyYXJ5LiBUaGUgc3BhcnNlIG1hdHJpeCBBIG11c3QgYmUgc3F1YXJlZCBhbmQgZnVsbCByYW5rLgorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBcd2FybmluZyBUaGUgaW5wdXQgbWF0cml4IEEgc2hvdWxkIGJlIGluIGEgXGIgY29tcHJlc3NlZCBhbmQgXGIgY29sdW1uLW1ham9yIGZvcm0uCisgICogT3RoZXJ3aXNlIGFuIGV4cGVuc2l2ZSBjb3B5IHdpbGwgYmUgbWFkZS4gWW91IGNhbiBjYWxsIHRoZSBpbmV4cGVuc2l2ZSBtYWtlQ29tcHJlc3NlZCgpIHRvIGdldCBhIGNvbXByZXNzZWQgbWF0cml4LgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICoKKyAgKiBcaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQKKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlU29sdmVyQ29uY2VwdCwgY2xhc3MgU3BhcnNlTFUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorY2xhc3MgVW1mUGFja0xVIDogcHVibGljIFNwYXJzZVNvbHZlckJhc2U8VW1mUGFja0xVPF9NYXRyaXhUeXBlPiA+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFNwYXJzZVNvbHZlckJhc2U8VW1mUGFja0xVPF9NYXRyaXhUeXBlPiA+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICBwdWJsaWM6CisgICAgdXNpbmcgQmFzZTo6X3NvbHZlX2ltcGw7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PGludCwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IEludFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8aW50LCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gSW50Q29sVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IExVTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsaW50PiBVbWZwYWNrTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFJlZjxjb25zdCBVbWZwYWNrTWF0cml4VHlwZSwgU3RhbmRhcmRDb21wcmVzc2VkRm9ybWF0PiBVbWZwYWNrTWF0cml4UmVmOworICAgIGVudW0geworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworCisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgQXJyYXk8ZG91YmxlLCBVTUZQQUNLX0NPTlRST0wsIDE+IFVtZnBhY2tDb250cm9sOworICAgIHR5cGVkZWYgQXJyYXk8ZG91YmxlLCBVTUZQQUNLX0lORk8sIDE+IFVtZnBhY2tJbmZvOworCisgICAgVW1mUGFja0xVKCkKKyAgICAgIDogbV9kdW1teSgwLDApLCBtcF9tYXRyaXgobV9kdW1teSkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRNYXRyaXhUeXBlPgorICAgIGV4cGxpY2l0IFVtZlBhY2tMVShjb25zdCBJbnB1dE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbXBfbWF0cml4KG1hdHJpeCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgflVtZlBhY2tMVSgpCisgICAgeworICAgICAgaWYobV9zeW1ib2xpYykgdW1mcGFja19mcmVlX3N5bWJvbGljKCZtX3N5bWJvbGljLFNjYWxhcigpKTsKKyAgICAgIGlmKG1fbnVtZXJpYykgIHVtZnBhY2tfZnJlZV9udW1lcmljKCZtX251bWVyaWMsU2NhbGFyKCkpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbXBfbWF0cml4LnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbXBfbWF0cml4LmNvbHMoKTsgfQorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBMVU1hdHJpeFR5cGUmIG1hdHJpeEwoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX2w7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IExVTWF0cml4VHlwZSYgbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KSBleHRyYWN0RGF0YSgpOworICAgICAgcmV0dXJuIG1fdTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW50Q29sVmVjdG9yVHlwZSYgcGVybXV0YXRpb25QKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpIGV4dHJhY3REYXRhKCk7CisgICAgICByZXR1cm4gbV9wOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbnRSb3dWZWN0b3JUeXBlJiBwZXJtdXRhdGlvblEoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX3E7CisgICAgfQorCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgKiAgTm90ZSB0aGF0IHRoZSBtYXRyaXggc2hvdWxkIGJlIGNvbHVtbi1tYWpvciwgYW5kIGluIGNvbXByZXNzZWQgZm9ybWF0IGZvciBiZXN0IHBlcmZvcm1hbmNlLgorICAgICAqICBcc2EgU3BhcnNlTWF0cml4OjptYWtlQ29tcHJlc3NlZCgpLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0TWF0cml4VHlwZT4KKyAgICB2b2lkIGNvbXB1dGUoY29uc3QgSW5wdXRNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgaWYobV9zeW1ib2xpYykgdW1mcGFja19mcmVlX3N5bWJvbGljKCZtX3N5bWJvbGljLFNjYWxhcigpKTsKKyAgICAgIGlmKG1fbnVtZXJpYykgIHVtZnBhY2tfZnJlZV9udW1lcmljKCZtX251bWVyaWMsU2NhbGFyKCkpOworICAgICAgZ3JhYihtYXRyaXguZGVyaXZlZCgpKTsKKyAgICAgIGFuYWx5emVQYXR0ZXJuX2ltcGwoKTsKKyAgICAgIGZhY3Rvcml6ZV9pbXBsKCk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcmNpdHkgb2YgXGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzb2x2aW5nIGZvciBzZXZlcmFsIHByb2JsZW1zIGhhdmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgICAgICAqCisgICAgICAqIFxzYSBmYWN0b3JpemUoKSwgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0TWF0cml4VHlwZT4KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IElucHV0TWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGlmKG1fc3ltYm9saWMpIHVtZnBhY2tfZnJlZV9zeW1ib2xpYygmbV9zeW1ib2xpYyxTY2FsYXIoKSk7CisgICAgICBpZihtX251bWVyaWMpICB1bWZwYWNrX2ZyZWVfbnVtZXJpYygmbV9udW1lcmljLFNjYWxhcigpKTsKKworICAgICAgZ3JhYihtYXRyaXguZGVyaXZlZCgpKTsKKworICAgICAgYW5hbHl6ZVBhdHRlcm5faW1wbCgpOworICAgIH0KKworICAgIC8qKiBQcm92aWRlcyB0aGUgcmV0dXJuIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IFVtZlBhY2sgZHVyaW5nIHRoZSBudW1lcmljCisgICAgICAqIGZhY3Rvcml6YXRpb24uCisgICAgICAqCisgICAgICAqIFxzYSBmYWN0b3JpemUoKSwgY29tcHV0ZSgpCisgICAgICAqLworICAgIGlubGluZSBpbnQgdW1mcGFja0ZhY3Rvcml6ZVJldHVybmNvZGUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX251bWVyaWMgJiYgIlVtZlBhY2tMVTogeW91IG11c3QgZmlyc3QgY2FsbCBmYWN0b3JpemUoKSIpOworICAgICAgcmV0dXJuIG1fZmFjdF9lcnJvckNvZGU7CisgICAgfQorCisgICAgLyoqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29udHJvbCBzZXR0aW5ncyBhcnJheSB1c2VkIGJ5IFVtZlBhY2suCisgICAgICAqCisgICAgICAqIElmIHRoaXMgYXJyYXkgY29udGFpbnMgTmFOJ3MsIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZC4KKyAgICAgICoKKyAgICAgICogU2VlIFVNRlBBQ0sgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IFVtZnBhY2tDb250cm9sJiB1bWZwYWNrQ29udHJvbCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fY29udHJvbDsKKyAgICB9CisKKyAgICAvKiogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjb250cm9sIHNldHRpbmdzIGFycmF5IHVzZWQgYnkgVW1mUGFjay4KKyAgICAgICoKKyAgICAgICogSWYgdGhpcyBhcnJheSBjb250YWlucyBOYU4ncywgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkLgorICAgICAgKgorICAgICAgKiBTZWUgVU1GUEFDSyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICAgICAgKi8KKyAgICBpbmxpbmUgVW1mcGFja0NvbnRyb2wmIHVtZnBhY2tDb250cm9sKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9jb250cm9sOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIG51bWVyaWMgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhlIGdpdmVuIG1hdHJpeCBtdXN0IGhhcyB0aGUgc2FtZSBzcGFyY2l0eSB0aGFuIHRoZSBtYXRyaXggb24gd2hpY2ggdGhlIHBhdHRlcm4gYW55bHlzaXMgaGFzIGJlZW4gcGVyZm9ybWVkLgorICAgICAgKgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKSwgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0TWF0cml4VHlwZT4KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBJbnB1dE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIlVtZlBhY2tMVTogeW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgICAgICBpZihtX251bWVyaWMpCisgICAgICAgIHVtZnBhY2tfZnJlZV9udW1lcmljKCZtX251bWVyaWMsU2NhbGFyKCkpOworCisgICAgICBncmFiKG1hdHJpeC5kZXJpdmVkKCkpOworCisgICAgICBmYWN0b3JpemVfaW1wbCgpOworICAgIH0KKworICAgIC8qKiBQcmludHMgdGhlIGN1cnJlbnQgVW1mUGFjayBjb250cm9sIHNldHRpbmdzLgorICAgICAgKgorICAgICAgKiBcc2EgdW1mcGFja0NvbnRyb2woKQorICAgICAgKi8KKyAgICB2b2lkIHVtZnBhY2tSZXBvcnRDb250cm9sKCkKKyAgICB7CisgICAgICB1bWZwYWNrX3JlcG9ydF9jb250cm9sKG1fY29udHJvbC5kYXRhKCksIFNjYWxhcigpKTsKKyAgICB9CisKKyAgICAvKiogUHJpbnRzIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5IFVtZlBhY2suCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpLCBjb21wdXRlKCkKKyAgICAgICovCisgICAgdm9pZCB1bWZwYWNrUmVwb3J0SW5mbygpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc09rICYmICJVbWZQYWNrTFU6IHlvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICAgICAgdW1mcGFja19yZXBvcnRfaW5mbyhtX2NvbnRyb2wuZGF0YSgpLCBtX3VtZnBhY2tJbmZvLmRhdGEoKSwgU2NhbGFyKCkpOworICAgIH0KKworICAgIC8qKiBQcmludHMgdGhlIHN0YXR1cyBvZiB0aGUgcHJldmlvdXMgZmFjdG9yaXphdGlvbiBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IFVtZlBhY2sgKHN5bWJvbGljIG9yIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uKS4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCksIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB2b2lkIHVtZnBhY2tSZXBvcnRTdGF0dXMoKSB7CisgICAgICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIlVtZlBhY2tMVTogeW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgICAgICB1bWZwYWNrX3JlcG9ydF9zdGF0dXMobV9jb250cm9sLmRhdGEoKSwgbV9mYWN0X2Vycm9yQ29kZSwgU2NhbGFyKCkpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCRGVyaXZlZCx0eXBlbmFtZSBYRGVyaXZlZD4KKyAgICBib29sIF9zb2x2ZV9pbXBsKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiAmeCkgY29uc3Q7CisKKyAgICBTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIHZvaWQgZXh0cmFjdERhdGEoKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIG1faW5mbyAgICAgICAgICAgICAgICAgID0gSW52YWxpZElucHV0OworICAgICAgbV9pc0luaXRpYWxpemVkICAgICAgICAgPSBmYWxzZTsKKyAgICAgIG1fbnVtZXJpYyAgICAgICAgICAgICAgID0gMDsKKyAgICAgIG1fc3ltYm9saWMgICAgICAgICAgICAgID0gMDsKKyAgICAgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gdHJ1ZTsKKworICAgICAgdW1mcGFja19kZWZhdWx0cyhtX2NvbnRyb2wuZGF0YSgpLCBTY2FsYXIoKSk7CisgICAgfQorCisgICAgdm9pZCBhbmFseXplUGF0dGVybl9pbXBsKCkKKyAgICB7CisgICAgICBtX2ZhY3RfZXJyb3JDb2RlID0gdW1mcGFja19zeW1ib2xpYyhpbnRlcm5hbDo6Y29udmVydF9pbmRleDxpbnQ+KG1wX21hdHJpeC5yb3dzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8aW50PihtcF9tYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX21hdHJpeC5vdXRlckluZGV4UHRyKCksIG1wX21hdHJpeC5pbm5lckluZGV4UHRyKCksIG1wX21hdHJpeC52YWx1ZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc3ltYm9saWMsIG1fY29udHJvbC5kYXRhKCksIG1fdW1mcGFja0luZm8uZGF0YSgpKTsKKworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIG1faW5mbyA9IG1fZmFjdF9lcnJvckNvZGUgPyBJbnZhbGlkSW5wdXQgOiBTdWNjZXNzOworICAgICAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICAgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOworICAgICAgbV9leHRyYWN0ZWREYXRhQXJlRGlydHkgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgZmFjdG9yaXplX2ltcGwoKQorICAgIHsKKworICAgICAgbV9mYWN0X2Vycm9yQ29kZSA9IHVtZnBhY2tfbnVtZXJpYyhtcF9tYXRyaXgub3V0ZXJJbmRleFB0cigpLCBtcF9tYXRyaXguaW5uZXJJbmRleFB0cigpLCBtcF9tYXRyaXgudmFsdWVQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW1ib2xpYywgJm1fbnVtZXJpYywgbV9jb250cm9sLmRhdGEoKSwgbV91bWZwYWNrSW5mby5kYXRhKCkpOworCisgICAgICBtX2luZm8gPSBtX2ZhY3RfZXJyb3JDb2RlID09IFVNRlBBQ0tfT0sgPyBTdWNjZXNzIDogTnVtZXJpY2FsSXNzdWU7CisgICAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gdHJ1ZTsKKyAgICAgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhEZXJpdmVkPgorICAgIHZvaWQgZ3JhYihjb25zdCBFaWdlbkJhc2U8TWF0cml4RGVyaXZlZD4gJkEpCisgICAgeworICAgICAgbXBfbWF0cml4Ln5VbWZwYWNrTWF0cml4UmVmKCk7CisgICAgICA6Om5ldyAoJm1wX21hdHJpeCkgVW1mcGFja01hdHJpeFJlZihBLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgdm9pZCBncmFiKGNvbnN0IFVtZnBhY2tNYXRyaXhSZWYgJkEpCisgICAgeworICAgICAgaWYoJihBLmRlcml2ZWQoKSkgIT0gJm1wX21hdHJpeCkKKyAgICAgIHsKKyAgICAgICAgbXBfbWF0cml4Ln5VbWZwYWNrTWF0cml4UmVmKCk7CisgICAgICAgIDo6bmV3ICgmbXBfbWF0cml4KSBVbWZwYWNrTWF0cml4UmVmKEEpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNhY2hlZCBkYXRhIHRvIHJlZHVjZSByZWFsbG9jYXRpb24sIGV0Yy4KKyAgICBtdXRhYmxlIExVTWF0cml4VHlwZSBtX2w7CisgICAgaW50IG1fZmFjdF9lcnJvckNvZGU7CisgICAgVW1mcGFja0NvbnRyb2wgbV9jb250cm9sOworICAgIG11dGFibGUgVW1mcGFja0luZm8gbV91bWZwYWNrSW5mbzsKKworICAgIG11dGFibGUgTFVNYXRyaXhUeXBlIG1fdTsKKyAgICBtdXRhYmxlIEludENvbFZlY3RvclR5cGUgbV9wOworICAgIG11dGFibGUgSW50Um93VmVjdG9yVHlwZSBtX3E7CisKKyAgICBVbWZwYWNrTWF0cml4VHlwZSBtX2R1bW15OworICAgIFVtZnBhY2tNYXRyaXhSZWYgbXBfbWF0cml4OworCisgICAgdm9pZCogbV9udW1lcmljOworICAgIHZvaWQqIG1fc3ltYm9saWM7CisKKyAgICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgICAgaW50IG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgaW50IG1fYW5hbHlzaXNJc09rOworICAgIG11dGFibGUgYm9vbCBtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eTsKKworICBwcml2YXRlOgorICAgIFVtZlBhY2tMVShjb25zdCBVbWZQYWNrTFUmICkgeyB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIFVtZlBhY2tMVTxNYXRyaXhUeXBlPjo6ZXh0cmFjdERhdGEoKSBjb25zdAoreworICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpCisgIHsKKyAgICAvLyBnZXQgc2l6ZSBvZiB0aGUgZGF0YQorICAgIGludCBsbnosIHVueiwgcm93cywgY29scywgbnpfdWRpYWc7CisgICAgdW1mcGFja19nZXRfbHVueigmbG56LCAmdW56LCAmcm93cywgJmNvbHMsICZuel91ZGlhZywgbV9udW1lcmljLCBTY2FsYXIoKSk7CisKKyAgICAvLyBhbGxvY2F0ZSBkYXRhCisgICAgbV9sLnJlc2l6ZShyb3dzLChzdGQ6Om1pbikocm93cyxjb2xzKSk7CisgICAgbV9sLnJlc2l6ZU5vblplcm9zKGxueik7CisKKyAgICBtX3UucmVzaXplKChzdGQ6Om1pbikocm93cyxjb2xzKSxjb2xzKTsKKyAgICBtX3UucmVzaXplTm9uWmVyb3ModW56KTsKKworICAgIG1fcC5yZXNpemUocm93cyk7CisgICAgbV9xLnJlc2l6ZShjb2xzKTsKKworICAgIC8vIGV4dHJhY3QKKyAgICB1bWZwYWNrX2dldF9udW1lcmljKG1fbC5vdXRlckluZGV4UHRyKCksIG1fbC5pbm5lckluZGV4UHRyKCksIG1fbC52YWx1ZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV91Lm91dGVySW5kZXhQdHIoKSwgbV91LmlubmVySW5kZXhQdHIoKSwgbV91LnZhbHVlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtX3AuZGF0YSgpLCBtX3EuZGF0YSgpLCAwLCAwLCAwLCBtX251bWVyaWMpOworCisgICAgbV9leHRyYWN0ZWREYXRhQXJlRGlydHkgPSBmYWxzZTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgVW1mUGFja0xVPE1hdHJpeFR5cGU+OjpTY2FsYXIgVW1mUGFja0xVPE1hdHJpeFR5cGU+OjpkZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIFNjYWxhciBkZXQ7CisgIHVtZnBhY2tfZ2V0X2RldGVybWluYW50KCZkZXQsIDAsIG1fbnVtZXJpYywgMCk7CisgIHJldHVybiBkZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCRGVyaXZlZCx0eXBlbmFtZSBYRGVyaXZlZD4KK2Jvb2wgVW1mUGFja0xVPE1hdHJpeFR5cGU+Ojpfc29sdmVfaW1wbChjb25zdCBNYXRyaXhCYXNlPEJEZXJpdmVkPiAmYiwgTWF0cml4QmFzZTxYRGVyaXZlZD4gJngpIGNvbnN0Cit7CisgIEluZGV4IHJoc0NvbHMgPSBiLmNvbHMoKTsKKyAgZWlnZW5fYXNzZXJ0KChCRGVyaXZlZDo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wICYmICJVbWZQYWNrTFUgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IG5vbiBjb2wtbWFqb3IgcmhzIHlldCIpOworICBlaWdlbl9hc3NlcnQoKFhEZXJpdmVkOjpGbGFncyZSb3dNYWpvckJpdCk9PTAgJiYgIlVtZlBhY2tMVSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgbm9uIGNvbC1tYWpvciByZXN1bHQgeWV0Iik7CisgIGVpZ2VuX2Fzc2VydChiLmRlcml2ZWQoKS5kYXRhKCkgIT0geC5kZXJpdmVkKCkuZGF0YSgpICYmICIgVW1mcGFjayBkb2VzIG5vdCBzdXBwb3J0IGlucGxhY2Ugc29sdmUiKTsKKworICBpbnQgZXJyb3JDb2RlOworICBTY2FsYXIqIHhfcHRyID0gMDsKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHhfdG1wOworICBpZih4LmlubmVyU3RyaWRlKCkhPTEpCisgIHsKKyAgICB4X3RtcC5yZXNpemUoeC5yb3dzKCkpOworICAgIHhfcHRyID0geF90bXAuZGF0YSgpOworICB9CisgIGZvciAoaW50IGo9MDsgajxyaHNDb2xzOyArK2opCisgIHsKKyAgICBpZih4LmlubmVyU3RyaWRlKCk9PTEpCisgICAgICB4X3B0ciA9ICZ4LmNvbChqKS5jb2VmZlJlZigwKTsKKyAgICBlcnJvckNvZGUgPSB1bWZwYWNrX3NvbHZlKFVNRlBBQ0tfQSwKKyAgICAgICAgbXBfbWF0cml4Lm91dGVySW5kZXhQdHIoKSwgbXBfbWF0cml4LmlubmVySW5kZXhQdHIoKSwgbXBfbWF0cml4LnZhbHVlUHRyKCksCisgICAgICAgIHhfcHRyLCAmYi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2woaikuY29lZmZSZWYoMCksIG1fbnVtZXJpYywgbV9jb250cm9sLmRhdGEoKSwgbV91bWZwYWNrSW5mby5kYXRhKCkpOworICAgIGlmKHguaW5uZXJTdHJpZGUoKSE9MSkKKyAgICAgIHguY29sKGopID0geF90bXA7CisgICAgaWYgKGVycm9yQ29kZSE9MCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1VNRlBBQ0tTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9taXNjL0ltYWdlLmggYi9FaWdlbi9zcmMvbWlzYy9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjhhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9JbWFnZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NSVNDX0lNQUdFX0gKKyNkZWZpbmUgRUlHRU5fTUlTQ19JTUFHRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGNsYXNzIGltYWdlX3JldHZhbF9iYXNlCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlPgorc3RydWN0IHRyYWl0czxpbWFnZV9yZXR2YWxfYmFzZTxEZWNvbXBvc2l0aW9uVHlwZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PAorICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwKKyAgICBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgLy8gdGhlIGltYWdlIGlzIGEgc3Vic3BhY2Ugb2YgdGhlIGRlc3RpbmF0aW9uIHNwYWNlLCB3aG9zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaW1lbnNpb24gaXMgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgKKyAgICBEeW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlIHRpbWUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgaW1hZ2UgKHRoZSByYW5rKQorICAgIE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIC8vIHRoZSBpbWFnZSBtYXRyaXggd2lsbCBjb25zaXN0IG9mIGNvbHVtbnMgZnJvbSB0aGUgb3JpZ2luYWwgbWF0cml4LAorICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lICAvLyBzbyBpdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHJvd3MgYW5kIGF0IG1vc3QgYXMgbWFueSBjb2x1bW5zLgorICA+IFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVjb21wb3NpdGlvblR5cGU+IHN0cnVjdCBpbWFnZV9yZXR2YWxfYmFzZQorIDogcHVibGljIFJldHVybkJ5VmFsdWU8aW1hZ2VfcmV0dmFsX2Jhc2U8X0RlY29tcG9zaXRpb25UeXBlPiA+Cit7CisgIHR5cGVkZWYgX0RlY29tcG9zaXRpb25UeXBlIERlY29tcG9zaXRpb25UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgUmV0dXJuQnlWYWx1ZTxpbWFnZV9yZXR2YWxfYmFzZT4gQmFzZTsKKworICBpbWFnZV9yZXR2YWxfYmFzZShjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgZGVjLCBjb25zdCBNYXRyaXhUeXBlJiBvcmlnaW5hbE1hdHJpeCkKKyAgICA6IG1fZGVjKGRlYyksIG1fcmFuayhkZWMucmFuaygpKSwKKyAgICAgIG1fY29scyhtX3JhbmsgPT0gMCA/IDEgOiBtX3JhbmspLAorICAgICAgbV9vcmlnaW5hbE1hdHJpeChvcmlnaW5hbE1hdHJpeCkKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjLnJvd3MoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQorICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0IHsgcmV0dXJuIG1fcmFuazsgfQorICBpbmxpbmUgY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjOyB9CisgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBvcmlnaW5hbE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luYWxNYXRyaXg7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgc3RhdGljX2Nhc3Q8Y29uc3QgaW1hZ2VfcmV0dmFsPERlY29tcG9zaXRpb25UeXBlPio+KHRoaXMpLT5ldmFsVG8oZHN0KTsKKyAgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgbV9kZWM7CisgICAgSW5kZXggbV9yYW5rLCBtX2NvbHM7CisgICAgY29uc3QgTWF0cml4VHlwZSYgbV9vcmlnaW5hbE1hdHJpeDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZGVmaW5lIEVJR0VOX01BS0VfSU1BR0VfSEVMUEVSUyhEZWNvbXBvc2l0aW9uVHlwZSkgXAorICB0eXBlZGVmIHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyBcCisgIHR5cGVkZWYgRWlnZW46OmludGVybmFsOjppbWFnZV9yZXR2YWxfYmFzZTxEZWNvbXBvc2l0aW9uVHlwZT4gQmFzZTsgXAorICB1c2luZyBCYXNlOjpkZWM7IFwKKyAgdXNpbmcgQmFzZTo6b3JpZ2luYWxNYXRyaXg7IFwKKyAgdXNpbmcgQmFzZTo6cmFuazsgXAorICB1c2luZyBCYXNlOjpyb3dzOyBcCisgIHVzaW5nIEJhc2U6OmNvbHM7IFwKKyAgaW1hZ2VfcmV0dmFsKGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBkZWMsIGNvbnN0IE1hdHJpeFR5cGUmIG9yaWdpbmFsTWF0cml4KSBcCisgICAgOiBCYXNlKGRlYywgb3JpZ2luYWxNYXRyaXgpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUlTQ19JTUFHRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9LZXJuZWwuaCBiL0VpZ2VuL3NyYy9taXNjL0tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjVkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9LZXJuZWwuaApAQCAtMCwwICsxLDc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUlTQ19LRVJORUxfSAorI2RlZmluZSBFSUdFTl9NSVNDX0tFUk5FTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGNsYXNzIGtlcm5lbF9yZXR2YWxfYmFzZQorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZT4KK3N0cnVjdCB0cmFpdHM8a2VybmVsX3JldHZhbF9iYXNlPERlY29tcG9zaXRpb25UeXBlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLAorICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAvLyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlICJrZXJuZWwgbWF0cml4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbnVtYmVyIG9mIGNvbHMgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBwcm9kdWN0ICJtYXRyaXggKiBrZXJuZWwgPSB6ZXJvIiBtYWtlcyBzZW5zZQorICAgIER5bmFtaWMsICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGF0IGNvbXBpbGUtdGltZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBrZXJuZWwKKyAgICBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLCAvLyBzZWUgZXhwbGFuYXRpb24gZm9yIDJuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAvLyB0aGUga2VybmVsIGlzIGEgc3Vic3BhY2Ugb2YgdGhlIGRvbWFpbiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSBkaW1lbnNpb24gaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgKKyAgPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3Qga2VybmVsX3JldHZhbF9iYXNlCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxrZXJuZWxfcmV0dmFsX2Jhc2U8X0RlY29tcG9zaXRpb25UeXBlPiA+Cit7CisgIHR5cGVkZWYgX0RlY29tcG9zaXRpb25UeXBlIERlY29tcG9zaXRpb25UeXBlOworICB0eXBlZGVmIFJldHVybkJ5VmFsdWU8a2VybmVsX3JldHZhbF9iYXNlPiBCYXNlOworCisgIGV4cGxpY2l0IGtlcm5lbF9yZXR2YWxfYmFzZShjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgZGVjKQorICAgIDogbV9kZWMoZGVjKSwKKyAgICAgIG1fcmFuayhkZWMucmFuaygpKSwKKyAgICAgIG1fY29scyhtX3Jhbms9PWRlYy5jb2xzKCkgPyAxIDogZGVjLmNvbHMoKSAtIG1fcmFuaykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjLmNvbHMoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQorICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0IHsgcmV0dXJuIG1fcmFuazsgfQorICBpbmxpbmUgY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIHN0YXRpY19jYXN0PGNvbnN0IGtlcm5lbF9yZXR2YWw8RGVjb21wb3NpdGlvblR5cGU+Kj4odGhpcyktPmV2YWxUbyhkc3QpOworICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBtX2RlYzsKKyAgICBJbmRleCBtX3JhbmssIG1fY29sczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZGVmaW5lIEVJR0VOX01BS0VfS0VSTkVMX0hFTFBFUlMoRGVjb21wb3NpdGlvblR5cGUpIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIEVpZ2VuOjppbnRlcm5hbDo6a2VybmVsX3JldHZhbF9iYXNlPERlY29tcG9zaXRpb25UeXBlPiBCYXNlOyBcCisgIHVzaW5nIEJhc2U6OmRlYzsgXAorICB1c2luZyBCYXNlOjpyYW5rOyBcCisgIHVzaW5nIEJhc2U6OnJvd3M7IFwKKyAgdXNpbmcgQmFzZTo6Y29sczsgXAorICBrZXJuZWxfcmV0dmFsKGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBkZWMpIDogQmFzZShkZWMpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUlTQ19LRVJORUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL21pc2MvUmVhbFN2ZDJ4Mi5oIGIvRWlnZW4vc3JjL21pc2MvUmVhbFN2ZDJ4Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjRkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9SZWFsU3ZkMngyLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SRUFMU1ZEMlgyX0gKKyNkZWZpbmUgRUlHRU5fUkVBTFNWRDJYMl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXIsIHR5cGVuYW1lIEluZGV4Pgordm9pZCByZWFsXzJ4Ml9qYWNvYmlfc3ZkKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgSW5kZXggcCwgSW5kZXggcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiAqal9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEphY29iaVJvdGF0aW9uPFJlYWxTY2FsYXI+ICpqX3JpZ2h0KQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICBNYXRyaXg8UmVhbFNjYWxhciwyLDI+IG07CisgIG0gPDwgbnVtZXh0OjpyZWFsKG1hdHJpeC5jb2VmZihwLHApKSwgbnVtZXh0OjpyZWFsKG1hdHJpeC5jb2VmZihwLHEpKSwKKyAgICAgICBudW1leHQ6OnJlYWwobWF0cml4LmNvZWZmKHEscCkpLCBudW1leHQ6OnJlYWwobWF0cml4LmNvZWZmKHEscSkpOworICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiByb3QxOworICBSZWFsU2NhbGFyIHQgPSBtLmNvZWZmKDAsMCkgKyBtLmNvZWZmKDEsMSk7CisgIFJlYWxTY2FsYXIgZCA9IG0uY29lZmYoMSwwKSAtIG0uY29lZmYoMCwxKTsKKworICBpZihhYnMoZCkgPCAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKQorICB7CisgICAgcm90MS5zKCkgPSBSZWFsU2NhbGFyKDApOworICAgIHJvdDEuYygpID0gUmVhbFNjYWxhcigxKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBJZiBkIT0wLCB0aGVuIHQvZCBjYW5ub3Qgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgbWFnbml0dWRlIG9mIHRoZQorICAgIC8vIGVudHJpZXMgZm9ybWluZyBkIGFyZSBub3QgdG9vIHNtYWxsIGNvbXBhcmVkIHRvIHRoZSBvbmVzIGZvcm1pbmcgdC4KKyAgICBSZWFsU2NhbGFyIHUgPSB0IC8gZDsKKyAgICBSZWFsU2NhbGFyIHRtcCA9IHNxcnQoUmVhbFNjYWxhcigxKSArIG51bWV4dDo6YWJzMih1KSk7CisgICAgcm90MS5zKCkgPSBSZWFsU2NhbGFyKDEpIC8gdG1wOworICAgIHJvdDEuYygpID0gdSAvIHRtcDsKKyAgfQorICBtLmFwcGx5T25UaGVMZWZ0KDAsMSxyb3QxKTsKKyAgal9yaWdodC0+bWFrZUphY29iaShtLDAsMSk7CisgICpqX2xlZnQgPSByb3QxICogal9yaWdodC0+dHJhbnNwb3NlKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFQUxTVkQyWDJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL21pc2MvYmxhcy5oIGIvRWlnZW4vc3JjL21pc2MvYmxhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjE1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9ibGFzLmgKQEAgLTAsMCArMSw0NDAgQEAKKyNpZm5kZWYgQkxBU19ICisjZGVmaW5lIEJMQVNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjZGVmaW5lIEJMQVNGVU5DKEZVTkMpIEZVTkMjI18KKworI2lmZGVmIF9fV0lONjRfXwordHlwZWRlZiBsb25nIGxvbmcgQkxBU0xPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCTEFTVUxPTkc7CisjZWxzZQordHlwZWRlZiBsb25nIEJMQVNMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIEJMQVNVTE9ORzsKKyNlbmRpZgorCitpbnQgICAgQkxBU0ZVTkMoeGVyYmxhKShjb25zdCBjaGFyICosIGludCAqaW5mbywgaW50KTsKKworZmxvYXQgIEJMQVNGVU5DKHNkb3QpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzZHNkb3QpKGludCAqLCBmbG9hdCAgKiwgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKKworZG91YmxlIEJMQVNGVU5DKGRzZG90KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkZG90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWRvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgIEJMQVNGVU5DKGNkb3R1dykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7CitpbnQgIEJMQVNGVU5DKGNkb3RjdykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7CitpbnQgIEJMQVNGVU5DKHpkb3R1dykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7CitpbnQgIEJMQVNGVU5DKHpkb3RjdykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7CisKK2ludCAgICBCTEFTRlVOQyhzYXhweSkgKGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRheHB5KSAoY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocWF4cHkpIChjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjYXhweSkgKGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpheHB5KSAoY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGF4cHkpIChjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjYXhweWMpKGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpheHB5YykoY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGF4cHljKShjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhkY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocWNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoc3N3YXApIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxc3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoY3N3YXApIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4c3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYXN1bSkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjYXN1bSkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFzdW0pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYXN1bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YXN1bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzYW1heCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWRhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcWFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljYW1heCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXphbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZG1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlxbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhpc2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpem1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc2FtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkYW1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYW1pbikgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWFtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNtYXgpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZG1heCkgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbWF4KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjbWF4KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHptYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeG1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc21pbikgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkbWluKSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtaW4pICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NtaW4pIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHFzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoenNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3NjYWwpKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemRzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhxc2NhbCkoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNucm0yKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2Nucm0yKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKKworZG91YmxlIEJMQVNGVU5DKGRucm0yKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocW5ybTIpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem5ybTIpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzcm90KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyhkcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhxcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3JvdCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyh6ZHJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyh4cXJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3RnKSAoZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKGNyb3RnKSAoZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKHpyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHhyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdG1nKShmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3RtZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3RtKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdG0pIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhxcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCisvKiBMZXZlbCAyIHJvdXRpbmVzICovCisKK2ludCBCTEFTRlVOQyhzZ2VyKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJ1KShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VyYykoaW50ICosICAgIGludCAqLCBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosCisJCSAgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXJ1KShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcmMpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3Ryc3YpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnN2KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ryc3YpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnN2KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJzdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cm12KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRybXYpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGN0cm12KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRybXYpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5bXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3ltdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3BtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3lyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXIyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3lyMikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyMikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3NwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICopOworaW50IEJMQVNGVU5DKGRzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxc3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhzc3ByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOworaW50IEJMQVNGVU5DKGRzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOworaW50IEJMQVNGVU5DKHpzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoemhwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeGhwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhjaGVyMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNocHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoemhwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4aHByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCitpbnQgQkxBU0ZVTkMoY2hlbXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpoZW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaHBtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpocG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aHBtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZG5vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKKy8qIExldmVsIDMgcm91dGluZXMgKi8KKworaW50IEJMQVNGVU5DKHNnZW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2dlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3Ryc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCAgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGludCAqLCBmbG9hdCAqLCAgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ryc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCAgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGludCAqLCBmbG9hdCAqLCAgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosICBjb25zdCBmbG9hdCAqLCAgY29uc3QgaW50ICosIGZsb2F0ICosICBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHF0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosICBjb25zdCBmbG9hdCAqLCAgY29uc3QgaW50ICosIGZsb2F0ICosICBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHh0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHFzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY3N5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3lyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlcmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hlcjJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpoZXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlcjJtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMm0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIybSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9sYXBhY2suaCBiL0VpZ2VuL3NyYy9taXNjL2xhcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWYzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9sYXBhY2suaApAQCAtMCwwICsxLDE1MiBAQAorI2lmbmRlZiBMQVBBQ0tfSAorI2RlZmluZSBMQVBBQ0tfSAorCisjaW5jbHVkZSAiYmxhcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCitpbnQgQkxBU0ZVTkMoY3N5bXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3ltdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CisKKworaW50IEJMQVNGVU5DKGNzcG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCisgICAgICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisgICAgICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisgICAgICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNzeXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKyAgICAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisgICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorICAgICAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY3NwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorICAgICAgICBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoenNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorICAgICAgICBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorICAgICAgICBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisgICAgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorICAgICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKyAgICAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisgICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKKyAgICAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKKyAgICAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2V0ZjIpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2V0ZjIpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2xhc3dwKShpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2xhc3dwKShpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZXN2KShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXN2KShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3BvdGYyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkcG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdGYyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6cG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNsYXV1MikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxbGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXV1MikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4bGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2xhdXVtKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkbGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2xhdXVtKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkcG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6cG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL21pc2MvbGFwYWNrZS5oIGIvRWlnZW4vc3JjL21pc2MvbGFwYWNrZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjN2U3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9sYXBhY2tlLmgKQEAgLTAsMCArMSwxNjI5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIENvcHlyaWdodCAoYykgMjAxMCwgSW50ZWwgQ29ycC4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb250ZW50czogTmF0aXZlIEMgaW50ZXJmYWNlIHRvIExBUEFDSworKiBBdXRob3I6IEludGVsIENvcnBvcmF0aW9uCisqIEdlbmVyYXRlZCBOb3ZlbWJlciwgMjAxMQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX01LTF9MQVBBQ0tFX0hfCisKKyNpZm5kZWYgX0xBUEFDS0VfSF8KKyNkZWZpbmUgX0xBUEFDS0VfSF8KKworLyoKKyogIFR1cm4gb24gSEFWRV9MQVBBQ0tfQ09ORklHX0ggdG8gcmVkZWZpbmUgQy1MQVBBQ0sgZGF0YXR5cGVzCisqLworI2lmZGVmIEhBVkVfTEFQQUNLX0NPTkZJR19ICisjaW5jbHVkZSAibGFwYWNrZV9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmbmRlZiBsYXBhY2tfaW50CisjZGVmaW5lIGxhcGFja19pbnQgICAgIGludAorI2VuZGlmCisKKyNpZm5kZWYgbGFwYWNrX2xvZ2ljYWwKKyNkZWZpbmUgbGFwYWNrX2xvZ2ljYWwgbGFwYWNrX2ludAorI2VuZGlmCisKKy8qIENvbXBsZXggdHlwZXMgYXJlIHN0cnVjdHVyZXMgZXF1aXZhbGVudCB0byB0aGUKKyogRm9ydHJhbiBjb21wbGV4IHR5cGVzIENPTVBMRVgoNCkgYW5kIENPTVBMRVgoOCkuCisqCisqIE9uZSBjYW4gYWxzbyByZWRlZmluZSB0aGUgdHlwZXMgd2l0aCBoaXMgb3duIHR5cGVzCisqIGZvciBleGFtcGxlIGJ5IGluY2x1ZGluZyBpbiB0aGUgY29kZSBkZWZpbml0aW9ucyBsaWtlCisqCisqICNkZWZpbmUgbGFwYWNrX2NvbXBsZXhfZmxvYXQgc3RkOjpjb21wbGV4PGZsb2F0PgorKiAjZGVmaW5lIGxhcGFja19jb21wbGV4X2RvdWJsZSBzdGQ6OmNvbXBsZXg8ZG91YmxlPgorKgorKiBvciBkZWZpbmUgdGhlc2UgdHlwZXMgaW4gdGhlIGNvbW1hbmQgbGluZToKKyoKKyogLURsYXBhY2tfY29tcGxleF9mbG9hdD0ic3RkOjpjb21wbGV4PGZsb2F0PiIKKyogLURsYXBhY2tfY29tcGxleF9kb3VibGU9InN0ZDo6Y29tcGxleDxkb3VibGU+IgorKi8KKworI2lmbmRlZiBMQVBBQ0tfQ09NUExFWF9DVVNUT00KKworLyogQ29tcGxleCB0eXBlIChzaW5nbGUgcHJlY2lzaW9uKSAqLworI2lmbmRlZiBsYXBhY2tfY29tcGxleF9mbG9hdAorI2luY2x1ZGUgPGNvbXBsZXguaD4KKyNkZWZpbmUgbGFwYWNrX2NvbXBsZXhfZmxvYXQgICAgZmxvYXQgX0NvbXBsZXgKKyNlbmRpZgorCisjaWZuZGVmIGxhcGFja19jb21wbGV4X2Zsb2F0X3JlYWwKKyNkZWZpbmUgbGFwYWNrX2NvbXBsZXhfZmxvYXRfcmVhbCh6KSAgICAgICAoY3JlYWwoeikpCisjZW5kaWYKKworI2lmbmRlZiBsYXBhY2tfY29tcGxleF9mbG9hdF9pbWFnCisjZGVmaW5lIGxhcGFja19jb21wbGV4X2Zsb2F0X2ltYWcoeikgICAgICAgKGNpbWFnKHopKQorI2VuZGlmCisKK2xhcGFja19jb21wbGV4X2Zsb2F0IGxhcGFja19tYWtlX2NvbXBsZXhfZmxvYXQoIGZsb2F0IHJlLCBmbG9hdCBpbSApOworCisvKiBDb21wbGV4IHR5cGUgKGRvdWJsZSBwcmVjaXNpb24pICovCisjaWZuZGVmIGxhcGFja19jb21wbGV4X2RvdWJsZQorI2luY2x1ZGUgPGNvbXBsZXguaD4KKyNkZWZpbmUgbGFwYWNrX2NvbXBsZXhfZG91YmxlICAgZG91YmxlIF9Db21wbGV4CisjZW5kaWYKKworI2lmbmRlZiBsYXBhY2tfY29tcGxleF9kb3VibGVfcmVhbAorI2RlZmluZSBsYXBhY2tfY29tcGxleF9kb3VibGVfcmVhbCh6KSAgICAgIChjcmVhbCh6KSkKKyNlbmRpZgorCisjaWZuZGVmIGxhcGFja19jb21wbGV4X2RvdWJsZV9pbWFnCisjZGVmaW5lIGxhcGFja19jb21wbGV4X2RvdWJsZV9pbWFnKHopICAgICAgIChjaW1hZyh6KSkKKyNlbmRpZgorCitsYXBhY2tfY29tcGxleF9kb3VibGUgbGFwYWNrX21ha2VfY29tcGxleF9kb3VibGUoIGRvdWJsZSByZSwgZG91YmxlIGltICk7CisKKyNlbmRpZgorCisjaWZuZGVmIExBUEFDS0VfbWFsbG9jCisjZGVmaW5lIExBUEFDS0VfbWFsbG9jKCBzaXplICkgbWFsbG9jKCBzaXplICkKKyNlbmRpZgorI2lmbmRlZiBMQVBBQ0tFX2ZyZWUKKyNkZWZpbmUgTEFQQUNLRV9mcmVlKCBwICkgICAgICBmcmVlKCBwICkKKyNlbmRpZgorCisjZGVmaW5lIExBUEFDS19DMklOVCggeCApIChsYXBhY2tfaW50KSgqKChmbG9hdCopJnggKSkKKyNkZWZpbmUgTEFQQUNLX1oySU5UKCB4ICkgKGxhcGFja19pbnQpKCooKGRvdWJsZSopJnggKSkKKworI2RlZmluZSBMQVBBQ0tfUk9XX01BSk9SICAgICAgICAgICAgICAgMTAxCisjZGVmaW5lIExBUEFDS19DT0xfTUFKT1IgICAgICAgICAgICAgICAxMDIKKworI2RlZmluZSBMQVBBQ0tfV09SS19NRU1PUllfRVJST1IgICAgICAgLTEwMTAKKyNkZWZpbmUgTEFQQUNLX1RSQU5TUE9TRV9NRU1PUllfRVJST1IgIC0xMDExCisKKy8qIENhbGxiYWNrIGxvZ2ljYWwgZnVuY3Rpb25zIG9mIG9uZSwgdHdvLCBvciB0aHJlZSBhcmd1bWVudHMgYXJlIHVzZWQKKyogIHRvIHNlbGVjdCBlaWdlbnZhbHVlcyB0byBzb3J0IHRvIHRoZSB0b3AgbGVmdCBvZiB0aGUgU2NodXIgZm9ybS4KKyogIFRoZSB2YWx1ZSBpcyBzZWxlY3RlZCBpZiBmdW5jdGlvbiByZXR1cm5zIFRSVUUgKG5vbi16ZXJvKS4gKi8KKwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19TX1NFTEVDVDIpICggY29uc3QgZmxvYXQqLCBjb25zdCBmbG9hdCogKTsKK3R5cGVkZWYgbGFwYWNrX2xvZ2ljYWwgKCpMQVBBQ0tfU19TRUxFQ1QzKQorICAgICggY29uc3QgZmxvYXQqLCBjb25zdCBmbG9hdCosIGNvbnN0IGZsb2F0KiApOwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19EX1NFTEVDVDIpICggY29uc3QgZG91YmxlKiwgY29uc3QgZG91YmxlKiApOwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19EX1NFTEVDVDMpCisgICAgKCBjb25zdCBkb3VibGUqLCBjb25zdCBkb3VibGUqLCBjb25zdCBkb3VibGUqICk7CisKK3R5cGVkZWYgbGFwYWNrX2xvZ2ljYWwgKCpMQVBBQ0tfQ19TRUxFQ1QxKSAoIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiApOwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19DX1NFTEVDVDIpCisgICAgKCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCosIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiApOwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19aX1NFTEVDVDEpICggY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiApOwordHlwZWRlZiBsYXBhY2tfbG9naWNhbCAoKkxBUEFDS19aX1NFTEVDVDIpCisgICAgKCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqICk7CisKKyNpbmNsdWRlICJsYXBhY2tlX21hbmdsaW5nLmgiCisKKyNkZWZpbmUgTEFQQUNLX2xzYW1lIExBUEFDS19HTE9CQUwobHNhbWUsTFNBTUUpCitsYXBhY2tfbG9naWNhbCBMQVBBQ0tfbHNhbWUoIGNoYXIqIGNhLCAgY2hhciogY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxjYSwgbGFwYWNrX2ludCBsY2IgKTsKKworLyogQy1MQVBBQ0sgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitsYXBhY2tfaW50IExBUEFDS0Vfc2Jkc2RjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgY29tcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHZ0LCBsYXBhY2tfaW50IGxkdnQsIGZsb2F0KiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kYmRzZGMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBkb3VibGUqIHZ0LCBsYXBhY2tfaW50IGxkdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHEsIGxhcGFja19pbnQqIGlxICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zYmRzcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuY3Z0LCBsYXBhY2tfaW50IG5ydSwgbGFwYWNrX2ludCBuY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LCBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kYmRzcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuY3Z0LCBsYXBhY2tfaW50IG5ydSwgbGFwYWNrX2ludCBuY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB1LCBsYXBhY2tfaW50IGxkdSwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jYmRzcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuY3Z0LCBsYXBhY2tfaW50IG5ydSwgbGFwYWNrX2ludCBuY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3piZHNxciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5jdnQsIGxhcGFja19pbnQgbnJ1LCBsYXBhY2tfaW50IG5jYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZ0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NkaXNuYSggY2hhciBqb2IsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzZXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZGlzbmEoIGNoYXIgam9iLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZCwgZG91YmxlKiBzZXAgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYmJyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGUsIGZsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwgZmxvYXQqIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHB0LCBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2JicmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5jYywgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga3UsIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwdCwgbGFwYWNrX2ludCBsZHB0LCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYmJyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogZCwgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcHQsIGxhcGFja19pbnQgbGRwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYmJyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBwdCwgbGFwYWNrX2ludCBsZHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2diY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Jjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYmNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCBhbm9ybSwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdiY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2JlcXUoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogY29sY25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnYmVxdSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcm93Y25kLCBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2diZXF1KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdiZXF1KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHIsIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2JlcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2JlcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiByLCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2JlcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYmVxdWIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2JyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLCBjb25zdCBmbG9hdCogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdicmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGRvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLCBsYXBhY2tfaW50IGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dicmZzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWZiLCBsYXBhY2tfaW50IGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBjLCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdicmZzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYywgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2JyZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogciwgY29uc3QgZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYnJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiByLCBjb25zdCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnYnN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dic3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdic3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhZmIsIGxhcGFja19pbnQgbGRhZmIsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBycGl2b3QgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2JzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJwaXZvdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYnN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByLCBmbG9hdCogYywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogcnBpdm90ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdic3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHIsIGRvdWJsZSogYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGRvdWJsZSogcnBpdm90ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Jzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Jzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWZiLCBsYXBhY2tfaW50IGxkYWZiLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Jzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogciwgZmxvYXQqIGMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogcnB2Z3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYnN2eHgoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByLCBkb3VibGUqIGMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIHJwdmdydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQgbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2J0cmYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdidHJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2J0cmYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYnRyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2didHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnYnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdidHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlYmFrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksIGNvbnN0IGZsb2F0KiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlYmFrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksIGNvbnN0IGRvdWJsZSogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGRvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2ViYWsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwgY29uc3QgZmxvYXQqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlYmFrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksIGNvbnN0IGRvdWJsZSogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2ViYWwoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlYmFsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlYmFsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGZsb2F0KiBzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWJhbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZG91YmxlKiBzY2FsZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlYnJkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdXEsIGZsb2F0KiB0YXVwICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlYnJkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVxLCBkb3VibGUqIHRhdXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VicmQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVwICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlYnJkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXVwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Vjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlZXF1KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VlcXUoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwgZG91YmxlKiBjb2xjbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VlcXUoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLCBmbG9hdCogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VlcXUoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwgZG91YmxlKiBjb2xjbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWVxdWIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByb3djbmQsIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlZXF1YiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWVxdWIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsIGZsb2F0KiBjb2xjbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VlcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VlcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2cywgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfU19TRUxFQ1QyIHNlbGVjdCwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIHNkaW0sIGZsb2F0KiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdpLCBmbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWVzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzLCBjaGFyIHNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExBUEFDS19EX1NFTEVDVDIgc2VsZWN0LCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIHNkaW0sIGRvdWJsZSogd3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd2ksIGRvdWJsZSogdnMsIGxhcGFja19pbnQgbGR2cyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWVzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzLCBjaGFyIHNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExBUEFDS19DX1NFTEVDVDEgc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2cywgbGFwYWNrX2ludCBsZHZzICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlZXMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1pfU0VMRUNUMSBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZzLCBsYXBhY2tfaW50IGxkdnMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWVzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2cywgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1NfU0VMRUNUMiBzZWxlY3QsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3ciwgZmxvYXQqIHdpLCBmbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Vlc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUEFDS19EX1NFTEVDVDIgc2VsZWN0LCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBzZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3ciwgZG91YmxlKiB3aSwgZG91YmxlKiB2cywgbGFwYWNrX2ludCBsZHZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlZXN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzLCBjaGFyIHNvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfQ19TRUxFQ1QxIHNlbGVjdCwgY2hhciBzZW5zZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Vlc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUEFDS19aX1NFTEVDVDEgc2VsZWN0LCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2cywgbGFwYWNrX2ludCBsZHZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdpLCBmbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwgZmxvYXQqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpLCBkb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsIGRvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWV2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZsLCBjaGFyIGpvYnZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWV2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZsLCBjaGFyIGpvYnZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB3ciwgZmxvYXQqIHdpLCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGZsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGZsb2F0KiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhYm5ybSwgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHdyLCBkb3VibGUqIHdpLCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZG91YmxlKiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWJucm0sIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlLCBmbG9hdCogYWJucm0sIGZsb2F0KiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlZXZ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idnIsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY2FsZSwgZG91YmxlKiBhYm5ybSwgZG91YmxlKiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlaHJkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VocmQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlaHJkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VocmQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vqc3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iYSwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnIsIGNoYXIgam9idCwgY2hhciBqb2JwLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHN2YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB1LCBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHN0YXQsIGxhcGFja19pbnQqIGlzdGF0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlanN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYmEsIGNoYXIgam9idSwgY2hhciBqb2J2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2JyLCBjaGFyIGpvYnQsIGNoYXIgam9icCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHN2YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdSwgbGFwYWNrX2ludCBsZHUsIGRvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHN0YXQsIGxhcGFja19pbnQqIGlzdGF0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VscTIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlbHEyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHEyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VscTIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VscWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlbHFmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHFmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VscWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VscyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VscyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWxzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vsc2QoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBzLCBmbG9hdCByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Vsc2QoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBzLCBkb3VibGUgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHNkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHMsIGZsb2F0IHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxzZCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBzLCBkb3VibGUgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vsc3MoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBzLCBmbG9hdCByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Vsc3MoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBzLCBkb3VibGUgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHNzKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHMsIGZsb2F0IHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxzcyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBzLCBkb3VibGUgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vsc3koIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIGpwdnQsIGZsb2F0IHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWxzeSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJjb25kLCBsYXBhY2tfaW50KiByYW5rICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHN5KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCoganB2dCwgZmxvYXQgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlbHN5KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfaW50KiBqcHZ0LCBkb3VibGUgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VxbGYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcWxmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcWxmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VxbGYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VxcDMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFwMyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcDMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoganB2dCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFwMyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoganB2dCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFwZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXBmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFwZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXBmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXIyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFyMiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFyMiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXIyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXJmcCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXJmcCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcmZwKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFyZnAoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VyZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGMsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VyZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBjLCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19ub3JtLCBkb3VibGUqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucGFyYW1zLCBkb3VibGUqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBjLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VyZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXJxZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VycWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VycWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXJxZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXNkZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdSwgbGFwYWNrX2ludCBsZHUsIGZsb2F0KiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXNkZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdSwgbGFwYWNrX2ludCBsZHUsIGRvdWJsZSogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VzZGQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZ0ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc2RkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VzdiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VzdiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNnZXN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXRlciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pjZ2VzdiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBsYXBhY2tfaW50KiBpdGVyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VzdmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LCBmbG9hdCogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnQsIGZsb2F0KiBzdXBlcmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VzdmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzLCBkb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LCBkb3VibGUqIHN1cGVyYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXN2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnQsIGZsb2F0KiBzdXBlcmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VzdmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCwgZG91YmxlKiBzdXBlcmIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXN2aiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2JhLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc3ZhLCBsYXBhY2tfaW50IG12LCBmbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc3RhdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXN2aiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2JhLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzdmEsIGxhcGFja19pbnQgbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LCBkb3VibGUqIHN0YXQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnBpdm90ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnBpdm90ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJwaXZvdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogciwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnBpdm90ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Vzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Vzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogciwgZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc3Z4eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBycHZncncsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dldGYyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXRmMiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dldGYyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2V0ZjIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXRyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2V0cmYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXRyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdldHJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2V0cmkoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXRyaSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXRyaSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXRyaSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2V0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2V0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ2JhayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLCBjb25zdCBmbG9hdCogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHJzY2FsZSwgbGFwYWNrX2ludCBtLCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnYmFrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksIGNvbnN0IGRvdWJsZSogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiByc2NhbGUsIGxhcGFja19pbnQgbSwgZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2diYWsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwgY29uc3QgZmxvYXQqIGxzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiByc2NhbGUsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ2JhayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLCBjb25zdCBkb3VibGUqIGxzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcnNjYWxlLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsIGxhcGFja19pbnQgbGR2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2diYWwoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2JhbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZG91YmxlKiBsc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2JhbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ2JhbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByc2NhbGUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ2VzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1NfU0VMRUNUMyBzZWxjdGcsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHNkaW0sIGZsb2F0KiBhbHBoYXIsIGZsb2F0KiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXRhLCBmbG9hdCogdnNsLCBsYXBhY2tfaW50IGxkdnNsLCBmbG9hdCogdnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnNyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnZXMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnNsLCBjaGFyIGpvYnZzciwgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfRF9TRUxFQ1QzIHNlbGN0ZywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBzZGltLCBkb3VibGUqIGFscGhhciwgZG91YmxlKiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2c2wsIGxhcGFja19pbnQgbGR2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnNyLCBsYXBhY2tfaW50IGxkdnNyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnZXMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnNsLCBjaGFyIGpvYnZzciwgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfQ19TRUxFQ1QyIHNlbGN0ZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZzbCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZzciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ2VzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1pfU0VMRUNUMiBzZWxjdGcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZzbCwgbGFwYWNrX2ludCBsZHZzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c3IsIGxhcGFja19pbnQgbGR2c3IgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ2VzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2c2wsIGNoYXIgam9idnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfU19TRUxFQ1QzIHNlbGN0ZywgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfaW50KiBzZGltLCBmbG9hdCogYWxwaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFscGhhaSwgZmxvYXQqIGJldGEsIGZsb2F0KiB2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnNsLCBmbG9hdCogdnNyLCBsYXBhY2tfaW50IGxkdnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2VzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2c2wsIGNoYXIgam9idnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfRF9TRUxFQ1QzIHNlbGN0ZywgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIHNkaW0sIGRvdWJsZSogYWxwaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYWksIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnNsLCBkb3VibGUqIHZzciwgbGFwYWNrX2ludCBsZHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2VzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2c2wsIGNoYXIgam9idnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfQ19TRUxFQ1QyIHNlbGN0ZywgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzbCwgbGFwYWNrX2ludCBsZHZzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2c3IsIGxhcGFja19pbnQgbGR2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmRlLCBmbG9hdCogcmNvbmR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnZXN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNvcnQsIExBUEFDS19aX1NFTEVDVDIgc2VsY3RnLCBjaGFyIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c2wsIGxhcGFja19pbnQgbGR2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZzciwgbGFwYWNrX2ludCBsZHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBhbHBoYXIsIGZsb2F0KiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXRhLCBmbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwgZmxvYXQqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIGFscGhhciwgZG91YmxlKiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2dldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZyICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnZXZ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idnIsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFscGhhciwgZmxvYXQqIGFscGhhaSwgZmxvYXQqIGJldGEsIGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2bCwgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIGxzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByc2NhbGUsIGZsb2F0KiBhYm5ybSwgZmxvYXQqIGJibnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2V2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYXIsIGRvdWJsZSogYWxwaGFpLCBkb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsIGRvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsc2NhbGUsIGRvdWJsZSogcnNjYWxlLCBkb3VibGUqIGFibnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiYm5ybSwgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnZXZ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idnIsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbHNjYWxlLCBmbG9hdCogcnNjYWxlLCBmbG9hdCogYWJucm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmJucm0sIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgYmFsYW5jLCBjaGFyIGpvYnZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2ciwgY2hhciBzZW5zZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByc2NhbGUsIGRvdWJsZSogYWJucm0sIGRvdWJsZSogYmJucm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kZSwgZG91YmxlKiByY29uZHYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ2dsbSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIGQsIGZsb2F0KiB4LCBmbG9hdCogeSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2dsbSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIGQsIGRvdWJsZSogeCwgZG91YmxlKiB5ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnZ2xtKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHkgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dnbG0oIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB5ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2docmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2docmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2hyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21wcSwgY2hhciBjb21weiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnaHJkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXBxLCBjaGFyIGNvbXB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dsc2UoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBjLCBmbG9hdCogZCwgZmxvYXQqIHggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dsc2UoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBjLCBkb3VibGUqIGQsIGRvdWJsZSogeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2xzZSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnbHNlKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dncXJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHRhdWIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dxcmYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXViICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dncXJmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1YiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ3FyZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXViICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dycWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0YXVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogdGF1YiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ3JxZiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdWEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdWIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2dycWYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXViICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdncnFmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ3N2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsIGNoYXIgam9icSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGEsIGZsb2F0KiBiZXRhLCBmbG9hdCogdSwgbGFwYWNrX2ludCBsZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsIGZsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnc3ZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYSwgZG91YmxlKiBiZXRhLCBkb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnc3ZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGEsIGZsb2F0KiBiZXRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ3N2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsIGNoYXIgam9icSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFscGhhLCBkb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnc3ZwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCB0b2xhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9sYiwgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwgZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnc3ZwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9sYSwgZG91YmxlIHRvbGIsIGxhcGFja19pbnQqIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsLCBkb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LCBkb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ3N2cCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsIGNoYXIgam9icSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0IHRvbGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b2xiLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdnc3ZwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvbGEsIGRvdWJsZSB0b2xiLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0Y29uKCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBkdSwgY29uc3QgZmxvYXQqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ3Rjb24oIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LCBjb25zdCBkb3VibGUqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ3Rjb24oIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pndGNvbiggY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlIGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0cmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBkbCwgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZHUsIGNvbnN0IGZsb2F0KiBkbGYsIGNvbnN0IGZsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkdWYsIGNvbnN0IGZsb2F0KiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ3RyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBkbCwgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkdSwgY29uc3QgZG91YmxlKiBkbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGRmLCBjb25zdCBkb3VibGUqIGR1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZHUyLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0cmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pndHJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0c3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGwsIGZsb2F0KiBkLCBmbG9hdCogZHUsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RndHN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkbCwgZG91YmxlKiBkLCBkb3VibGUqIGR1LCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0c3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pndHN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ3RzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGR1LCBmbG9hdCogZGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRmLCBmbG9hdCogZHVmLCBmbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ3RzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LCBkb3VibGUqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZGYsIGRvdWJsZSogZHVmLCBkb3VibGUqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ3RzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZGxmLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHVmLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemd0c3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NndHRyZiggbGFwYWNrX2ludCBuLCBmbG9hdCogZGwsIGZsb2F0KiBkLCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGd0dHJmKCBsYXBhY2tfaW50IG4sIGRvdWJsZSogZGwsIGRvdWJsZSogZCwgZG91YmxlKiBkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHUyLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0dHJmKCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemd0dHJmKCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBkbCwgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZHUsIGNvbnN0IGZsb2F0KiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ3R0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBkbCwgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkdSwgY29uc3QgZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z3R0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGJldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmV2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJldmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGJldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYmV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmdzdCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiYiwgbGFwYWNrX2ludCBsZGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhiZ3N0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmd2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGthLCBsYXBhY2tfaW50IGtiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLCBsYXBhY2tfaW50IGxkYmIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJndiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJiLCBsYXBhY2tfaW50IGxkYmIsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hiZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLCBsYXBhY2tfaW50IGxkYmIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhiZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmd2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiYiwgbGFwYWNrX2ludCBsZGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJndngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGthLCBsYXBhY2tfaW50IGtiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiYiwgbGFwYWNrX2ludCBsZGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGJ0cmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYnRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWVxdWIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWVxdWIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWV2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB3ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhlZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdyApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZXZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWV2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWV2ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0IHZsLCBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc3VwcHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVldnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlIHZsLCBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCB2bCwgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlIHZsLCBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWdzdCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhlZ3N0KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZ3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogdyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWd2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHcgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWd2ZCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB3ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhlZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHcgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZWd2eCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWd2eCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhlc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXN2eHgoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhlc3Z4eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBycHZncncsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcyApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hldHJkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGV0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hldHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGV0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGV0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZnJrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgZmxvYXQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGZyayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJldGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2hnZXF6KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwgY2hhciBjb21weiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGgsIGxhcGFja19pbnQgbGRoLCBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwgZmxvYXQqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGhnZXF6KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwgY2hhciBjb21weiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBoLCBsYXBhY2tfaW50IGxkaCwgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGFyLCBkb3VibGUqIGFscGhhaSwgZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaGdlcXooIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXBxLCBjaGFyIGNvbXB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogaCwgbGFwYWNrX2ludCBsZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZ2VxeiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgY29tcHEsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogaCwgbGFwYWNrX2ludCBsZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlIGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGV2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocGV2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBldmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwZ3N0KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBicCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGdzdCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBicCApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwZ3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJwLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwZ3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYnAsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJwLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGd2ZCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBndngoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmFuZ2UsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2bCwgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBndngoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmFuZ2UsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2bCwgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHByZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocHJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocHRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHB0cmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwdHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocHRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfaW50KiBpcGl2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHB0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocHRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Noc2VpbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgZWlnc3JjLCBjaGFyIGluaXR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRoLCBmbG9hdCogd3IsIGNvbnN0IGZsb2F0KiB3aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLCBmbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbGwsIGxhcGFja19pbnQqIGlmYWlsciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Roc2VpbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgZWlnc3JjLCBjaGFyIGluaXR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBoLCBsYXBhY2tfaW50IGxkaCwgZG91YmxlKiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogd2ksIGRvdWJsZSogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwgbGFwYWNrX2ludCBtbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIGlmYWlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Noc2VpbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgZWlnc3JjLCBjaGFyIGluaXR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGgsIGxhcGFja19pbnQgbGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2bCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZyLCBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHNlaW4oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGVpZ3NyYywgY2hhciBpbml0diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogaCwgbGFwYWNrX2ludCBsZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbGwsIGxhcGFja19pbnQqIGlmYWlsciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2hzZXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLCBmbG9hdCogaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRoLCBmbG9hdCogd3IsIGZsb2F0KiB3aSwgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Roc2VxciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwgZG91YmxlKiBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGgsIGRvdWJsZSogd3IsIGRvdWJsZSogd2ksIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2hzZXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGgsIGxhcGFja19pbnQgbGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHNlcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGgsIGxhcGFja19pbnQgbGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2xhY2d2KCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbmN4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhY2d2KCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaW5jeCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhY3B5KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhY3B5KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFjcHkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhY3B5KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV96bGFnMmMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBzYSwgbGFwYWNrX2ludCBsZHNhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFnMmQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNhLCBsYXBhY2tfaW50IGxkc2EsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFnMnMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHNhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFnMnooIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHNhLCBsYXBhY2tfaW50IGxkc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFnZ2UoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlzZWVkICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhZ2dlKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlzZWVkICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhZ2dlKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNlZWQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFnZ2UoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzZWVkICk7CisKK2Zsb2F0IExBUEFDS0Vfc2xhbWNoKCBjaGFyIGNtYWNoICk7Citkb3VibGUgTEFQQUNLRV9kbGFtY2goIGNoYXIgY21hY2ggKTsKKworZmxvYXQgTEFQQUNLRV9zbGFuZ2UoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2RvdWJsZSBMQVBBQ0tFX2RsYW5nZSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2Zsb2F0IExBUEFDS0VfY2xhbmdlKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworZG91YmxlIExBUEFDS0VfemxhbmdlKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEgKTsKKworZmxvYXQgTEFQQUNLRV9jbGFuaGUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2RvdWJsZSBMQVBBQ0tFX3psYW5oZSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworZmxvYXQgTEFQQUNLRV9zbGFuc3koIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2RvdWJsZSBMQVBBQ0tFX2RsYW5zeSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2Zsb2F0IExBUEFDS0VfY2xhbnN5KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7Citkb3VibGUgTEFQQUNLRV96bGFuc3koIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CisKK2Zsb2F0IExBUEFDS0Vfc2xhbnRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEgKTsKK2RvdWJsZSBMQVBBQ0tFX2RsYW50ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworZmxvYXQgTEFQQUNLRV9jbGFudHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworZG91YmxlIExBUEFDS0VfemxhbnRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CisKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJmYiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLCBjaGFyIGRpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc3RvcmV2LCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgY29uc3QgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhcmZiKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsIGNoYXIgZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdG9yZXYsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBjb25zdCBkb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFyZmIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywgY2hhciBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZmIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywgY2hhciBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJmZyggbGFwYWNrX2ludCBuLCBmbG9hdCogYWxwaGEsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbmN4LCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhcmZnKCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYWxwaGEsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaW5jeCwgZG91YmxlKiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFyZmcoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgaW5jeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZmcoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBpbmN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJmdCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGNvbnN0IGZsb2F0KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFyZnQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZGlyZWN0LCBjaGFyIHN0b3JldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBjb25zdCBkb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhcmZ0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGRpcmVjdCwgY2hhciBzdG9yZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZnQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZGlyZWN0LCBjaGFyIHN0b3JldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhcmZ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIHYsIGZsb2F0IHRhdSwgZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFyZngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIHYsIGRvdWJsZSB0YXUsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjLCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFyZngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0IHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUgdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFybnYoIGxhcGFja19pbnQgaWRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXJudiggbGFwYWNrX2ludCBpZGlzdCwgbGFwYWNrX2ludCogaXNlZWQsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYXJudiggbGFwYWNrX2ludCBpZGlzdCwgbGFwYWNrX2ludCogaXNlZWQsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemxhcm52KCBsYXBhY2tfaW50IGlkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFzZXQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXNldCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSBhbHBoYSwgZG91YmxlIGJldGEsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhc2V0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCBiZXRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemxhc2V0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlIGJldGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFzcnQoIGNoYXIgaWQsIGxhcGFja19pbnQgbiwgZmxvYXQqIGQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFzcnQoIGNoYXIgaWQsIGxhcGFja19pbnQgbiwgZG91YmxlKiBkICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFzd3AoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCBrMSwgbGFwYWNrX2ludCBrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgaW5jeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXN3cCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCBrMSwgbGFwYWNrX2ludCBrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgaW5jeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYXN3cCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrMSwgbGFwYWNrX2ludCBrMiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaW5jeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3psYXN3cCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgazEsIGxhcGFja19pbnQgazIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGluY3ggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXRtcyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBjaGFyIHN5bSwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1vZGUsIGZsb2F0IGNvbmQsIGZsb2F0IGRtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjaGFyIHBhY2ssIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGF0bXMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgY2hhciBzeW0sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW9kZSwgZG91YmxlIGNvbmQsIGRvdWJsZSBkbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY2hhciBwYWNrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYXRtcyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBjaGFyIHN5bSwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1vZGUsIGZsb2F0IGNvbmQsIGZsb2F0IGRtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjaGFyIHBhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGF0bXMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgY2hhciBzeW0sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW9kZSwgZG91YmxlIGNvbmQsIGRvdWJsZSBkbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY2hhciBwYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhdXVtKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXV1bSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhdXVtKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3psYXV1bSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3BndHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9wZ3RyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29wbXRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3BtdHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ2JyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9yZ2JyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NvcmdociggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWhpLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9yZ2hyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ2xxKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdscSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ3FsKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdxbCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ3FyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdxciggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ3JxKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdycSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ3RyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rvcmd0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29ybWJyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtYnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29ybWhyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9ybWhyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIGMsIGxhcGFja19pbnQgbGRjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtbHEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtbHEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nvcm1xbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rvcm1xbCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29ybXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBjb25zdCBmbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9ybXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGMsIGxhcGFja19pbnQgbGRjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtcnEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtcnEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nvcm1yeiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9ybXJ6KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nvcm10ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rvcm10ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BiY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwYmNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYW5vcm0sIGRvdWJsZSogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGJjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCBhbm9ybSwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBiY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BiZXF1KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJlcXUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGJlcXUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogcywgZmxvYXQqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJlcXUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcGJyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGZsb2F0KiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwYnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGRvdWJsZSogYWZiLCBsYXBhY2tfaW50IGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BicmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwYnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnN0ZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtiLCBmbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwYnN0ZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtiLCBkb3VibGUqIGJiLCBsYXBhY2tfaW50IGxkYmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGJzdGYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBic3RmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2IsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYmIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBic3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYnN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBic3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Bic3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBic3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGJzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwYnN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLCBsYXBhY2tfaW50IGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwYnRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGJ0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBidHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBidHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwYnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcGZ0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBmdHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGZ0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBmdHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwZnRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGZ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwZnRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGZ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BmdHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBmdHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcGZ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBmdHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9jb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb2NvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9jb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BvZXF1KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb2VxdSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvZXF1KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb2VxdSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9lcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogcywgZmxvYXQqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvZXF1YiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9lcXViKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBvZXF1YiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3JmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9yZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9yZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BvcmZzeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHMsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9yZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcywgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9yZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9yZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFyYW1zICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9zdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9zdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Nwb3N2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3N2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwb3N2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdGVyICk7CitsYXBhY2tfaW50IExBUEFDS0VfemNwb3N2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgbGFwYWNrX2ludCogaXRlciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Bvc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY2hhciogZXF1ZWQsIGZsb2F0KiBzLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb3N2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Nwb3N2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3N2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9zdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb3N2eHgoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBycHZncncsIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9zdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGZsb2F0KiBzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9zdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBycHZncncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19ub3JtLCBkb3VibGUqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucGFyYW1zLCBkb3VibGUqIHBhcmFtcyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BvdHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb3RyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvdHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3RyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG90cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG90cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBvdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3RycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb3RycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvdHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3RycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BwY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwcGNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUgYW5vcm0sIGRvdWJsZSogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHBjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcGNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHBlcXUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBmbG9hdCogcywgZmxvYXQqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBlcXUoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhcCwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BwZXF1KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBwZXF1KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHByZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBkb3VibGUqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHByZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHBzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGFwLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhcCwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcHN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHBzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhcCwgZmxvYXQqIGFmcCwgY2hhciogZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYXAsIGRvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwgY2hhciogZXF1ZWQsIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHBzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcHRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHB0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHB0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BwdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwcHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BwdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcHRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHN0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBwaXYsIGxhcGFja19pbnQqIHJhbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b2wgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHN0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogcGl2LCBsYXBhY2tfaW50KiByYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Nwc3RyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBwaXYsIGxhcGFja19pbnQqIHJhbmssIGZsb2F0IHRvbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwc3RyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcGl2LCBsYXBhY2tfaW50KiByYW5rLCBkb3VibGUgdG9sICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHRjb24oIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwdGNvbiggbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwdGNvbiggbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBmbG9hdCBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdGNvbiggbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwdGVxciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHRlcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3B0ZXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdGVxciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHRyZnMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBlLCBjb25zdCBmbG9hdCogZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZWYsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHB0cmZzKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZCwgY29uc3QgZG91YmxlKiBlLCBjb25zdCBkb3VibGUqIGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBlZiwgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwdHJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGUsIGNvbnN0IGZsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwgY29uc3QgZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHRzdiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHB0c3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwdHN2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHRzdiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHRzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGYsIGZsb2F0KiBlZiwgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHRzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZGYsIGRvdWJsZSogZWYsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHRzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBmbG9hdCogZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwgZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHR0cmYoIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHB0dHJmKCBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwgZG91YmxlKiBlICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3B0dHJmKCBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHRyZiggbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3B0dHJzKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwdHRycyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHR0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenB0dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NiZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNiZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2JldmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2JldmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2JldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZsLCBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NiZ3N0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBjb25zdCBmbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmdzdCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsIGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGRvdWJsZSogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmd2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGthLCBsYXBhY2tfaW50IGtiLCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGJiLCBsYXBhY2tfaW50IGxkYmIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2JndiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGJiLCBsYXBhY2tfaW50IGxkYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NiZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2JndmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGthLCBsYXBhY2tfaW50IGtiLCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGJiLCBsYXBhY2tfaW50IGxkYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmd2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmd2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYmIsIGRvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmwsIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2J0cmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZSwgZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNidHJkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzZnJrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgZmxvYXQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2ZyayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3Bjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzcGNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCBhbm9ybSwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfenNwY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3BldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYXAsIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZXZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZXZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgZG91YmxlKiB3LCBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3BldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYXAsIGZsb2F0IHZsLCBmbG9hdCB2dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYXAsIGRvdWJsZSB2bCwgZG91YmxlIHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZG91YmxlIGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Bnc3QoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogYnAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3Bnc3QoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhcCwgY29uc3QgZG91YmxlKiBicCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZ3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhcCwgZmxvYXQqIGJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZ3YoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYXAsIGRvdWJsZSogYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLCBmbG9hdCogYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZ3ZkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhcCwgZG91YmxlKiBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZ3Z4KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJwLCBmbG9hdCB2bCwgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGd2eCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJwLCBkb3VibGUgdmwsIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaXUsIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhcCwgY29uc3QgZG91YmxlKiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3ByZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Nwc3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwc3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYXAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3BzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3BzdiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Nwc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcHN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhcCwgZG91YmxlKiBhZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Nwc3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3BzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcHRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3B0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzcHRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3B0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzcHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3B0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3B0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzcHRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3B0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGVieiggY2hhciByYW5nZSwgY2hhciBvcmRlciwgbGFwYWNrX2ludCBuLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuc3BsaXQsIGZsb2F0KiB3LCBsYXBhY2tfaW50KiBpYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc3BsaXQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3RlYnooIGNoYXIgcmFuZ2UsIGNoYXIgb3JkZXIsIGxhcGFja19pbnQgbiwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuc3BsaXQsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlibG9jaywgbGFwYWNrX2ludCogaXNwbGl0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3RlZGMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZSwgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZWRjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVkYyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlZGMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZWdyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzdXBweiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGVnciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaXN1cHB6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N0ZWdyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlzdXBweiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzdGVnciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzdXBweiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZWluKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGUsIGxhcGFja19pbnQgbSwgY29uc3QgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpYmxvY2ssIGNvbnN0IGxhcGFja19pbnQqIGlzcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaWZhaWx2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZWluKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZSwgbGFwYWNrX2ludCBtLCBjb25zdCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpYmxvY2ssIGNvbnN0IGxhcGFja19pbnQqIGlzcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlmYWlsdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVpbiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBlLCBsYXBhY2tfaW50IG0sIGNvbnN0IGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaWJsb2NrLCBjb25zdCBsYXBhY2tfaW50KiBpc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlaW4oIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBlLCBsYXBhY2tfaW50IG0sIGNvbnN0IGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlibG9jaywgY29uc3QgbGFwYWNrX2ludCogaXNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZW1yKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQgbnpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBsYXBhY2tfbG9naWNhbCogdHJ5cmFjICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZW1yKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG56YywgbGFwYWNrX2ludCogaXN1cHB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHRyeXJhYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVtciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0IHZsLCBmbG9hdCB2dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuemMsIGxhcGFja19pbnQqIGlzdXBweiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiB0cnlyYWMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlbXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQgbnpjLCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogdHJ5cmFjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3RlcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZSwgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVxciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlcXIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZXJmKCBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGVyZiggbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGUsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGUsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGV2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGUsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2ZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZXZyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzdXBweiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaXN1cHB6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3RldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwgZmxvYXQgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3RldngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3ljb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeWNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlIGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzeWNvbiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCBhbm9ybSwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5Y29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3llcXViKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3llcXViKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5ZXF1YiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5ZXF1YiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N5ZXYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHcgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lldiggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB3ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lldmQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB3ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5ZXZkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB3ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lldnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc3VwcHogKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lldnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpc3VwcHogKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWV2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5ZXZ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWdzdCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lnc3QoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWd2KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHcgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lndiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB3ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lndmQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB3ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5Z3ZkKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogdyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N5Z3Z4KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lndngoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmFuZ2UsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5cmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3lyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lyZnN4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzeXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXJmc3goIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXN2KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5c3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5c3YoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXN2eCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lzdngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5c3Z4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXN2eHgoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiBzLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lzdnh4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogcnB2Z3J3LCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBhcmFtcyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXN2eHgoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3l0cmYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzeXRyZiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3l0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5dHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3l0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N5dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3l0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGJjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGNvbnN0IGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRiY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RiY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGJjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGJyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgY29uc3QgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRicmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgY29uc3QgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RicmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGJyZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGJ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0YnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGJ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0YnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0ZnNtKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhLCBjb25zdCBmbG9hdCogYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRmc20oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHNpZGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB0cmFucywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhLCBjb25zdCBkb3VibGUqIGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGZzbSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgc2lkZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0ZnNtKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGZ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGZ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RmdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHJpKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RmdHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYXJmLCBmbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGZ0dHAoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXJmLCBkb3VibGUqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RmdHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0ZnR0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGFyZiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0ZnR0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBhcmYsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RmdHRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z2V2YyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzLCBsYXBhY2tfaW50IGxkcywgY29uc3QgZmxvYXQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcCwgZmxvYXQqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwgbGFwYWNrX2ludCBtbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0gKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGdldmMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHMsIGxhcGFja19pbnQgbGRzLCBjb25zdCBkb3VibGUqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcCwgZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLCBsYXBhY2tfaW50IG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z2V2YyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBzLCBsYXBhY2tfaW50IGxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBwLCBsYXBhY2tfaW50IGxkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRnZXZjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBzLCBsYXBhY2tfaW50IGxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogcCwgbGFwYWNrX2ludCBsZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGdleGMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19sb2dpY2FsIHdhbnRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHosIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZnN0LCBsYXBhY2tfaW50KiBpbHN0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRnZXhjKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnR6LCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmc3QsIGxhcGFja19pbnQqIGlsc3QgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGdleGMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19sb2dpY2FsIHdhbnRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWZzdCwgbGFwYWNrX2ludCBpbHN0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRnZXhjKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnR6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpZnN0LCBsYXBhY2tfaW50IGlsc3QgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z3NlbiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHEsIGxhcGFja19sb2dpY2FsIHdhbnR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwgZmxvYXQqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHBsLCBmbG9hdCogcHIsIGZsb2F0KiBkaWYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGdzZW4oIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaWpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnRxLCBsYXBhY2tfbG9naWNhbCB3YW50eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFscGhhciwgZG91YmxlKiBhbHBoYWksIGRvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHBsLCBkb3VibGUqIHByLCBkb3VibGUqIGRpZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z3NlbiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHEsIGxhcGFja19sb2dpY2FsIHdhbnR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJldGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIG0sIGZsb2F0KiBwbCwgZmxvYXQqIHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRpZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0Z3NlbiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHEsIGxhcGFja19sb2dpY2FsIHdhbnR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHBsLCBkb3VibGUqIHByLCBkb3VibGUqIGRpZiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Rnc2phKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2ludCBsLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0IHRvbGEsIGZsb2F0IHRvbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGEsIGZsb2F0KiBiZXRhLCBmbG9hdCogdSwgbGFwYWNrX2ludCBsZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsIGZsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5jeWNsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0Z3NqYSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsIGNoYXIgam9icSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9sYSwgZG91YmxlIHRvbGIsIGRvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJldGEsIGRvdWJsZSogdSwgbGFwYWNrX2ludCBsZHUsIGRvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbmN5Y2xlICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Rnc2phKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2ludCBsLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCB0b2xhLCBmbG9hdCB0b2xiLCBmbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbmN5Y2xlICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRnc2phKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwgY2hhciBqb2JxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2ludCBsLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSB0b2xhLCBkb3VibGUgdG9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGEsIGRvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdSwgbGFwYWNrX2ludCBsZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5jeWNsZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Rnc25hKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGNvbnN0IGZsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRpZiwgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0Z3NuYSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGNvbnN0IGRvdWJsZSogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkaWYsIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0gKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGdzbmEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIGRpZiwgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0Z3NuYSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGRvdWJsZSogZGlmLCBsYXBhY2tfaW50IG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Rnc3lsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRkLCBjb25zdCBmbG9hdCogZSwgbGFwYWNrX2ludCBsZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZiwgbGFwYWNrX2ludCBsZGYsIGZsb2F0KiBzY2FsZSwgZmxvYXQqIGRpZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0Z3N5bCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBpam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGQsIGNvbnN0IGRvdWJsZSogZSwgbGFwYWNrX2ludCBsZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGYsIGxhcGFja19pbnQgbGRmLCBkb3VibGUqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkaWYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGdzeWwoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgaWpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsIGxhcGFja19pbnQgbGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGUsIGxhcGFja19pbnQgbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGYsIGxhcGFja19pbnQgbGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlLCBmbG9hdCogZGlmICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRnc3lsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZCwgbGFwYWNrX2ludCBsZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsIGxhcGFja19pbnQgbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBmLCBsYXBhY2tfaW50IGxkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NhbGUsIGRvdWJsZSogZGlmICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHBjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRwY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHBjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHByZnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgY29uc3QgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgY29uc3QgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRwcmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHB0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHB0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHB0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwdHRmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBhcmYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHB0dGYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXAsIGRvdWJsZSogYXJmICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwdHRmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXJmICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRwdHRmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcmYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cHR0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHR0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwdHRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cHR0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RyY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHJjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RyY29uKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogcmNvbmQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJjb24oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHJjb25kICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJldmMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQsIGZsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQgbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRyZXZjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2bCwgZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cmV2YyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRyZXZjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0gKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cmV4YyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21wcSwgbGFwYWNrX2ludCBuLCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZnN0LCBsYXBhY2tfaW50KiBpbHN0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRyZXhjKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXBxLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZzdCwgbGFwYWNrX2ludCogaWxzdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cmV4YyggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21wcSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpZnN0LCBsYXBhY2tfaW50IGlsc3QgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJleGMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpZnN0LCBsYXBhY2tfaW50IGlsc3QgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRycmZzKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cnJmcyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJzZW4oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsIGZsb2F0KiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3aSwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHMsIGZsb2F0KiBzZXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHJzZW4oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd3IsIGRvdWJsZSogd2ksIGxhcGFja19pbnQqIG0sIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2VwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Ryc2VuKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LCBsYXBhY2tfaW50KiBtLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzZXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJzZW4oIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2VwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJzbmEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwgY29uc3QgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBjb25zdCBmbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2VwLCBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRyc25hKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LCBjb25zdCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBjb25zdCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGRvdWJsZSogc2VwLCBsYXBhY2tfaW50IG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cnNuYSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2VwLCBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRyc25hKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzLCBkb3VibGUqIHNlcCwgbGFwYWNrX2ludCBtbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0gKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnN5bCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuYSwgY2hhciB0cmFuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaXNnbiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnN5bCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuYSwgY2hhciB0cmFuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaXNnbiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NhbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJzeWwoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbmEsIGNoYXIgdHJhbmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlzZ24sIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRyc3lsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5hLCBjaGFyIHRyYW5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpc2duLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NhbGUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnRyaSggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJ0cmkoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnRycyggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJ0cnMoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RydHRmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYXJmICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRydHRmKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcmYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0dGYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcmYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJ0dGYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFyZiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RydHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRydHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0dHAoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRydHRwKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHpyemYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHR6cnpmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3R6cnpmKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHpyemYoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5nYnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5nYnIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3VuZ2hyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5naHIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5nbHEoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ2xxKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5ncWwoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3FsKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5ncXIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3FyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5ncnEoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3JxKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5ndHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bmd0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1iciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1iciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3VubWhyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1ociggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1scSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tbHEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5tcWwoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVubXFsKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3VubXFyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1xciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1ycSggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tcnEoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5tcnooIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tcnooIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm10ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tdHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdXBndHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1cGd0ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdXBtdHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVwbXRyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYyApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2Jkc2RjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHZ0LCBsYXBhY2tfaW50IGxkdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBxLCBsYXBhY2tfaW50KiBpcSwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGJkc2RjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHEsIGxhcGFja19pbnQqIGlxLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zYmRzcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmN2dCwgbGFwYWNrX2ludCBucnUsIGxhcGFja19pbnQgbmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdSwgbGFwYWNrX2ludCBsZHUsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kYmRzcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmN2dCwgbGFwYWNrX2ludCBucnUsIGxhcGFja19pbnQgbmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZ0LCBkb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jYmRzcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmN2dCwgbGFwYWNrX2ludCBucnUsIGxhcGFja19pbnQgbmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZ0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96YmRzcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmN2dCwgbGFwYWNrX2ludCBucnUsIGxhcGFja19pbnQgbmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZ0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjLCBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NkaXNuYV93b3JrKCBjaGFyIGpvYiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBmbG9hdCogc2VwICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGRpc25hX3dvcmsoIGNoYXIgam9iLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBkb3VibGUqIHNlcCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2diYnJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGt1LCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwdCwgbGFwYWNrX2ludCBsZHB0LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdiYnJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGt1LCBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHB0LCBsYXBhY2tfaW50IGxkcHQsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYmJyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5jYywgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcHQsIGxhcGFja19pbnQgbGRwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdiYnJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbmNjLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGt1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHB0LCBsYXBhY2tfaW50IGxkcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2diY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdiY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0IGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Jjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYmVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2JlcXVfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiByLCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcm93Y25kLCBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2diZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogY29sY25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnYmVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYmVxdWJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByb3djbmQsIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdiZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogciwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2JlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2JlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogciwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnYnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2JyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdicmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2JyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogciwgY29uc3QgZmxvYXQqIGMsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2JyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGRvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogciwgY29uc3QgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2JyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiByLCBjb25zdCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdicmZzeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogciwgY29uc3QgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdic3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYnN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGt1LCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Jzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Jzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnYnN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByLCBmbG9hdCogYywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdic3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHIsIGRvdWJsZSogYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dic3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFmYiwgbGFwYWNrX2ludCBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Jzdnh4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dic3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogcnB2Z3J3LCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Jzdnh4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogciwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIHJwdmdydywgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFyYW1zLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2J0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdidHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2J0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdidHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnYnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnYnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2didHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdidHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWJha193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNjYWxlLCBsYXBhY2tfaW50IG0sIGZsb2F0KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWJha193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzY2FsZSwgbGFwYWNrX2ludCBtLCBkb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlYmFrX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc2NhbGUsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlYmFrX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNjYWxlLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWJhbF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogc2NhbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2ViYWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogc2NhbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2ViYWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlYmFsX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VicmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1cSwgZmxvYXQqIHRhdXAsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlYnJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVxLCBkb3VibGUqIHRhdXAsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWJyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VicmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Vjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsIGZsb2F0KiBjb2xjbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VlcXVfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogY29sY25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLCBmbG9hdCogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwgZG91YmxlKiBjb2xjbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWVzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfU19TRUxFQ1QyIHNlbGVjdCwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogc2RpbSwgZmxvYXQqIHdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3aSwgZmxvYXQqIHZzLCBsYXBhY2tfaW50IGxkdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlZXNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2cywgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUEFDS19EX1NFTEVDVDIgc2VsZWN0LCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogc2RpbSwgZG91YmxlKiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpLCBkb3VibGUqIHZzLCBsYXBhY2tfaW50IGxkdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiBid29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWVzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfQ19TRUxFQ1QxIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBzZGltLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19sb2dpY2FsKiBid29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWVzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfWl9TRUxFQ1QxIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnMsIGxhcGFja19pbnQgbGR2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vlc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2cywgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfU19TRUxFQ1QyIHNlbGVjdCwgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHNkaW0sIGZsb2F0KiB3ciwgZmxvYXQqIHdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cywgZmxvYXQqIHJjb25kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kdiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlZXN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX0RfU0VMRUNUMiBzZWxlY3QsIGNoYXIgc2Vuc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgZG91YmxlKiB3ciwgZG91YmxlKiB3aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2cywgbGFwYWNrX2ludCBsZHZzLCBkb3VibGUqIHJjb25kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZHYsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Vlc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2cywgY2hhciBzb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfQ19TRUxFQ1QxIHNlbGVjdCwgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnMsIGxhcGFja19pbnQgbGR2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlZXN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnMsIGNoYXIgc29ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1pfU0VMRUNUMSBzZWxlY3QsIGNoYXIgc2Vuc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZzLCBsYXBhY2tfaW50IGxkdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdyLCBmbG9hdCogd2ksIGZsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlZXZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3ciwgZG91YmxlKiB3aSwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGRvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Vldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZsLCBjaGFyIGpvYnZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idnIsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogd3IsIGZsb2F0KiB3aSwgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGZsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWJucm0sIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2ciwgY2hhciBzZW5zZSwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHdyLCBkb3VibGUqIHdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsIGRvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogc2NhbGUsIGRvdWJsZSogYWJucm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2ciwgY2hhciBzZW5zZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhYm5ybSwgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGJhbGFuYywgY2hhciBqb2J2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2ciwgY2hhciBzZW5zZSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZG91YmxlKiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhYm5ybSwgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWhyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWhyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWhyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWhyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlanN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iYSwgY2hhciBqb2J1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnYsIGNoYXIgam9iciwgY2hhciBqb2J0LCBjaGFyIGpvYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBzdmEsIGZsb2F0KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2Vqc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2JhLCBjaGFyIGpvYnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idiwgY2hhciBqb2JyLCBjaGFyIGpvYnQsIGNoYXIgam9icCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogc3ZhLCBkb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBkb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VscTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VscTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VscTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VscTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZWxxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWxxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWxxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlbHNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlbHNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbHNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Vsc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlbHNkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogcywgZmxvYXQgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmssIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWxzZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByY29uZCwgbGFwYWNrX2ludCogcmFuaywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWxzZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHMsIGZsb2F0IHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxzZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHMsIGRvdWJsZSByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlbHNzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogcywgZmxvYXQgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmssIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlbHNzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2Vsc3Nfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBzLCBmbG9hdCByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuaywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZWxzc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHMsIGRvdWJsZSByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuaywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vsc3lfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZWxzeV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmNvbmQsIGxhcGFja19pbnQqIHJhbmssIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZWxzeV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCoganB2dCwgZmxvYXQgcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmssIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Vsc3lfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCoganB2dCwgZG91YmxlIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiByYW5rLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFsZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFsZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFsZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFsZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXAzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXAzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcXAzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGpwdnQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VxcDNfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGpwdnQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFwZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFwZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCoganB2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFwZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXBmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VxcjJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VxcjJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcjJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VxcjJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXFyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXJmcF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXJmcF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcXJmcF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFyZnBfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHIsIGNvbnN0IGZsb2F0KiBjLCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcmZzeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiByLCBjb25zdCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFyYW1zLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXJmc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHIsIGNvbnN0IGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2VyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiByLCBjb25zdCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcnFmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcnFmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcnFmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcnFmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VzZGRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LCBmbG9hdCogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlc2RkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiB1LCBsYXBhY2tfaW50IGxkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlc2RkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LCBsYXBhY2tfaW50IGxkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZ0LCBsYXBhY2tfaW50IGxkdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc2RkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LCBsYXBhY2tfaW50IGxkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2dlc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogd29yaywgZmxvYXQqIHN3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdGVyICk7CitsYXBhY2tfaW50IExBUEFDS0VfemNnZXN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBzd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXRlciApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlc3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHMsIGZsb2F0KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHZ0LCBsYXBhY2tfaW50IGxkdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlc3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywgZG91YmxlKiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZG91YmxlKiB2dCwgbGFwYWNrX2ludCBsZHZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VzdmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXN2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2dCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2Vzdmpfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2JhLCBjaGFyIGpvYnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHN2YSwgbGFwYWNrX2ludCBtdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXN2al93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYmEsIGNoYXIgam9idSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2LCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzdmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbXYsIGRvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2Vzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXN2eHhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogcnB2Z3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQgbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZmxvYXQqIHBhcmFtcywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZXN2eHhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlc3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdlc3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXRmMl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdldGYyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dldGYyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2V0ZjJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdldHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dldHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2V0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2V0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2V0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdldHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2V0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdldHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dldHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnYmFrX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbHNjYWxlLCBjb25zdCBmbG9hdCogcnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGZsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2Jha193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBsc2NhbGUsIGNvbnN0IGRvdWJsZSogcnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGRvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2diYWtfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsc2NhbGUsIGNvbnN0IGZsb2F0KiByc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnYmFrX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGxzY2FsZSwgY29uc3QgZG91YmxlKiByc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnYmFsX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIGxzY2FsZSwgZmxvYXQqIHJzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2diYWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLCBkb3VibGUqIHJzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnYmFsX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIGxzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJzY2FsZSwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2diYWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbHNjYWxlLCBkb3VibGUqIHJzY2FsZSwgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dlc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfU19TRUxFQ1QzIHNlbGN0ZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIHNkaW0sIGZsb2F0KiBhbHBoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFscGhhaSwgZmxvYXQqIGJldGEsIGZsb2F0KiB2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZzbCwgZmxvYXQqIHZzciwgbGFwYWNrX2ludCBsZHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dlc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfRF9TRUxFQ1QzIHNlbGN0ZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogc2RpbSwgZG91YmxlKiBhbHBoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYWksIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZzbCwgZG91YmxlKiB2c3IsIGxhcGFja19pbnQgbGR2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiBid29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2VzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnNsLCBjaGFyIGpvYnZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNvcnQsIExBUEFDS19DX1NFTEVDVDIgc2VsY3RnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBzZGltLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzbCwgbGFwYWNrX2ludCBsZHZzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnNyLCBsYXBhY2tfaW50IGxkdnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnZXNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2c2wsIGNoYXIgam9idnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc29ydCwgTEFQQUNLX1pfU0VMRUNUMiBzZWxjdGcsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c2wsIGxhcGFja19pbnQgbGR2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c3IsIGxhcGFja19pbnQgbGR2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19sb2dpY2FsKiBid29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnZXN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnNsLCBjaGFyIGpvYnZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfU19TRUxFQ1QzIHNlbGN0ZywgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFscGhhciwgZmxvYXQqIGFscGhhaSwgZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2c2wsIGxhcGFja19pbnQgbGR2c2wsIGZsb2F0KiB2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2c3IsIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiBid29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2VzeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnZzbCwgY2hhciBqb2J2c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc29ydCwgTEFQQUNLX0RfU0VMRUNUMyBzZWxjdGcsIGNoYXIgc2Vuc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYXIsIGRvdWJsZSogYWxwaGFpLCBkb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnNsLCBsYXBhY2tfaW50IGxkdnNsLCBkb3VibGUqIHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZzciwgZG91YmxlKiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmR2LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnZXN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idnNsLCBjaGFyIGpvYnZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzb3J0LCBMQVBBQ0tfQ19TRUxFQ1QyIHNlbGN0ZywgY2hhciBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzbCwgbGFwYWNrX2ludCBsZHZzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzciwgbGFwYWNrX2ludCBsZHZzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dlc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2c2wsIGNoYXIgam9idnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNvcnQsIExBUEFDS19aX1NFTEVDVDIgc2VsY3RnLCBjaGFyIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c2wsIGxhcGFja19pbnQgbGR2c2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnNyLCBsYXBhY2tfaW50IGxkdnNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kZSwgZG91YmxlKiByY29uZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZ2V2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXRhLCBmbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2V2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogYWxwaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGFpLCBkb3VibGUqIGJldGEsIGRvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dnZXZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J2bCwgY2hhciBqb2J2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ2V2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idmwsIGNoYXIgam9idnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgYmFsYW5jLCBjaGFyIGpvYnZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBsYXBhY2tfaW50IGxkdmwsIGZsb2F0KiB2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZyLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIGxzY2FsZSwgZmxvYXQqIHJzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFibnJtLCBmbG9hdCogYmJucm0sIGZsb2F0KiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZHYsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgYmFsYW5jLCBjaGFyIGpvYnZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGFyLCBkb3VibGUqIGFscGhhaSwgZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsIGRvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLCBkb3VibGUqIHJzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhYm5ybSwgZG91YmxlKiBiYm5ybSwgZG91YmxlKiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmR2LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2dldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBiYWxhbmMsIGNoYXIgam9idmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idnIsIGNoYXIgc2Vuc2UsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGZsb2F0KiBsc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByc2NhbGUsIGZsb2F0KiBhYm5ybSwgZmxvYXQqIGJibnJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmRlLCBmbG9hdCogcmNvbmR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgYmFsYW5jLCBjaGFyIGpvYnZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnZyLCBjaGFyIHNlbnNlLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxzY2FsZSwgZG91YmxlKiByc2NhbGUsIGRvdWJsZSogYWJucm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmJucm0sIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dnbG1fd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBkLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHksIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnZ2xtX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogZCwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHksIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2dsbV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dnbG1fd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2docmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21wcSwgY2hhciBjb21weiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ2hyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXBxLCBjaGFyIGNvbXB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2hyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXBxLCBjaGFyIGNvbXB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdnaHJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dsc2Vfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBjLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdnbHNlX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogYywgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ2xzZV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dsc2Vfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dxcmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1YSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1YiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dxcmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdWIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ3FyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ3FyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dycWZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1YSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1YiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dycWZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdWIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ3JxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZ3JxZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2dzdmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB1LCBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZ3N2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2JxLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIGFscGhhLCBkb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdSwgbGFwYWNrX2ludCBsZHUsIGRvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGRvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2dzdmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LCBsYXBhY2tfaW50IGxkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemdnc3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnEsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGEsIGRvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LCBsYXBhY2tfaW50IGxkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dnc3ZwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idSwgY2hhciBqb2J2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnEsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCB0b2xhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b2xiLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdSwgbGFwYWNrX2ludCBsZHUsIGZsb2F0KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2dzdnBfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlIHRvbGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b2xiLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LCBkb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZ3N2cF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2JxLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQgdG9sYSwgZmxvYXQgdG9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z2dzdnBfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlIHRvbGEsIGRvdWJsZSB0b2xiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsIGxhcGFja19pbnQgbGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0Y29uX3dvcmsoIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkdTIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RndGNvbl93b3JrKCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0Y29uX3dvcmsoIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0IGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemd0Y29uX3dvcmsoIGNoYXIgbm9ybSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0cmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkbGYsIGNvbnN0IGZsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR1ZiwgY29uc3QgZmxvYXQqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGd0cmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZGxmLCBjb25zdCBkb3VibGUqIGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGR1ZiwgY29uc3QgZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0cmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pndHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ3Rzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGwsIGZsb2F0KiBkLCBmbG9hdCogZHUsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGd0c3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkbCwgZG91YmxlKiBkLCBkb3VibGUqIGR1LCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ3Rzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pndHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0c3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBkdSwgZmxvYXQqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRmLCBmbG9hdCogZHVmLCBmbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RndHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZHUsIGRvdWJsZSogZGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRmLCBkb3VibGUqIGR1ZiwgZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0c3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z3Rzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ3R0cmZfd29yayggbGFwYWNrX2ludCBuLCBmbG9hdCogZGwsIGZsb2F0KiBkLCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkdTIsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ3R0cmZfd29yayggbGFwYWNrX2ludCBuLCBkb3VibGUqIGRsLCBkb3VibGUqIGQsIGRvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHUyLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2d0dHJmX3dvcmsoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemd0dHJmX3dvcmsoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwgbGFwYWNrX2ludCogaXBpdiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2d0dHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkdTIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RndHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NndHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Z3R0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYmV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGJldmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJldmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hiZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZsLCBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGJldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmwsIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hiZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhiZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYmd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiYiwgbGFwYWNrX2ludCBsZGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hiZ3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYmd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGthLCBsYXBhY2tfaW50IGtiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsIGxhcGFja19pbnQgbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYmd2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGthLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYmIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poYmd2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGthLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZG91YmxlIHZsLCBkb3VibGUgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGRvdWJsZSBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoYnRyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhidHJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0IGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhlY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVlcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVldmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZXZyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmwsIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlzdXBweiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWV2cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmwsIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmwsIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmwsIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWdzdF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZ3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZ3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZWd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2bCwgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhlZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2bCwgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXJmc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hlc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhlc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGVzdnh4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhlc3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXRyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhldHJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hldHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhldHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaGV0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGV0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hmcmtfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0IGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGZya193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NoZ2Vxel93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGZsb2F0KiBoLCBsYXBhY2tfaW50IGxkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogYWxwaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwgZmxvYXQqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGhnZXF6X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGloaSwgZG91YmxlKiBoLCBsYXBhY2tfaW50IGxkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiBhbHBoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGFpLCBkb3VibGUqIGJldGEsIGRvdWJsZSogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZ2Vxel93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2Zsb2F0KiBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkaCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZ2Vxel93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2RvdWJsZSogaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGgsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBldmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwZXZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCB2bCwgZmxvYXQgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSB2bCwgZG91YmxlIHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBnc3Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJwICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBndl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBicCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHBndl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocGd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBicCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocGd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJwLCBmbG9hdCB2bCwgZmxvYXQgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYnAsIGRvdWJsZSB2bCwgZG91YmxlIHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHByZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhwcmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHBzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhwc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZnAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocHRyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCogZCwgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHB0cmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2hwdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHB0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NocHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pocHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jaHB0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHB0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2hzZWluX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGVpZ3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBpbml0diwgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogaCwgbGFwYWNrX2ludCBsZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3ciwgY29uc3QgZmxvYXQqIHdpLCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2bCwgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbGwsIGxhcGFja19pbnQqIGlmYWlsciApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Roc2Vpbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBlaWdzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgaW5pdHYsIGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBoLCBsYXBhY2tfaW50IGxkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3ciwgY29uc3QgZG91YmxlKiB3aSwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaHNlaW5fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgZWlnc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGluaXR2LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkaCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aHNlaW5fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgZWlnc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGluaXR2LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGgsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Noc2Vxcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21weiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywgbGFwYWNrX2ludCBpaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBoLCBsYXBhY2tfaW50IGxkaCwgZmxvYXQqIHdyLCBmbG9hdCogd2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kaHNlcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGgsIGxhcGFja19pbnQgbGRoLCBkb3VibGUqIHdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpLCBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaHNlcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgY29tcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sIGxhcGFja19pbnQgaWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogaCwgbGFwYWNrX2ludCBsZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhzZXFyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGNvbXB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaWxvLCBsYXBhY2tfaW50IGloaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBoLCBsYXBhY2tfaW50IGxkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYWNndl93b3JrKCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGluY3ggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFjZ3Zfd29yayggbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaW5jeCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhY3B5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhY3B5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFjcHlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFjcHlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0VfemxhZzJjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogc2EsIGxhcGFja19pbnQgbGRzYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhZzJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc2EsIGxhcGFja19pbnQgbGRzYSwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0VfZGxhZzJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRzYSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2xhZzJ6X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogc2EsIGxhcGFja19pbnQgbGRzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhZ2dlX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFnZ2Vfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYWdnZV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNlZWQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhZ2dlX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtsLCBsYXBhY2tfaW50IGt1LCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitsYXBhY2tfaW50IExBUEFDS0VfY2xhZ2hlX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFnaGVfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhZ3N5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc2VlZCwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFnc3lfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZCwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNlZWQsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYWdzeV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhZ3N5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXBtcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCBmb3J3cmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGxhcGFja19pbnQqIGsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFwbXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgZm9yd3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgbGFwYWNrX2ludCogayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYXBtcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCBmb3J3cmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFwbXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgZm9yd3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhcnRncF93b3JrKCBmbG9hdCBmLCBmbG9hdCBnLCBmbG9hdCogY3MsIGZsb2F0KiBzbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhcnRncF93b3JrKCBkb3VibGUgZiwgZG91YmxlIGcsIGRvdWJsZSogY3MsIGRvdWJsZSogc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJ0Z3Nfd29yayggZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgc2lnbWEsIGZsb2F0KiBjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzbiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXJ0Z3Nfd29yayggZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgc2lnbWEsIGRvdWJsZSogY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNuICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZmxvYXQgTEFQQUNLRV9zbGFweTJfd29yayggZmxvYXQgeCwgZmxvYXQgeSApOworZG91YmxlIExBUEFDS0VfZGxhcHkyX3dvcmsoIGRvdWJsZSB4LCBkb3VibGUgeSApOworCitmbG9hdCBMQVBBQ0tFX3NsYXB5M193b3JrKCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6ICk7Citkb3VibGUgTEFQQUNLRV9kbGFweTNfd29yayggZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiApOworCitmbG9hdCBMQVBBQ0tFX3NsYW1jaF93b3JrKCBjaGFyIGNtYWNoICk7Citkb3VibGUgTEFQQUNLRV9kbGFtY2hfd29yayggY2hhciBjbWFjaCApOworCitmbG9hdCBMQVBBQ0tFX3NsYW5nZV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7Citkb3VibGUgTEFQQUNLRV9kbGFuZ2Vfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrICk7CitmbG9hdCBMQVBBQ0tFX2NsYW5nZV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB3b3JrICk7Citkb3VibGUgTEFQQUNLRV96bGFuZ2Vfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB3b3JrICk7CisKK2Zsb2F0IExBUEFDS0VfY2xhbmhlX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHdvcmsgKTsKK2RvdWJsZSBMQVBBQ0tFX3psYW5oZV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHdvcmsgKTsKKworZmxvYXQgTEFQQUNLRV9zbGFuc3lfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS0VfZGxhbnN5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yayApOworZmxvYXQgTEFQQUNLRV9jbGFuc3lfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS0VfemxhbnN5X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogd29yayApOworCitmbG9hdCBMQVBBQ0tFX3NsYW50cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS0VfZGxhbnRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHdvcmsgKTsKK2Zsb2F0IExBUEFDS0VfY2xhbnRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7Citkb3VibGUgTEFQQUNLRV96bGFudHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhcmZiX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBjb25zdCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGNvbnN0IGZsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFyZmJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpcmVjdCwgY2hhciBzdG9yZXYsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGNvbnN0IGRvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGNvbnN0IGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFyZmJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpcmVjdCwgY2hhciBzdG9yZXYsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGxkd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3psYXJmYl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlyZWN0LCBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhcmZnX3dvcmsoIGxhcGFja19pbnQgbiwgZmxvYXQqIGFscGhhLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbmN4LCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhcmZnX3dvcmsoIGxhcGFja19pbnQgbiwgZG91YmxlKiBhbHBoYSwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGluY3gsIGRvdWJsZSogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhcmZnX3dvcmsoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBpbmN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhcmZnX3dvcmsoIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGluY3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFyZnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgY29uc3QgZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFyZnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgY29uc3QgZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFyZnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJmeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogdiwgZmxvYXQgdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhcmZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogdiwgZG91YmxlIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhcmZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFyZnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUgdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXJudl93b3JrKCBsYXBhY2tfaW50IGlkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogeCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXJudl93b3JrKCBsYXBhY2tfaW50IGlkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIHggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jbGFybnZfd29yayggbGFwYWNrX2ludCBpZGlzdCwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFybnZfd29yayggbGFwYWNrX2ludCBpZGlzdCwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFzZXRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQgYWxwaGEsIGZsb2F0IGJldGEsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXNldF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhc2V0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFzZXRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhc3J0X3dvcmsoIGNoYXIgaWQsIGxhcGFja19pbnQgbiwgZmxvYXQqIGQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFzcnRfd29yayggY2hhciBpZCwgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXN3cF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCBrMSwgbGFwYWNrX2ludCBrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCBpbmN4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhc3dwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCBrMSwgbGFwYWNrX2ludCBrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCBpbmN4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhc3dwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGsxLCBsYXBhY2tfaW50IGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50IGluY3ggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFzd3Bfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGsxLCBsYXBhY2tfaW50IGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50IGluY3ggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXRtc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgY2hhciBzeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBsYXBhY2tfaW50IG1vZGUsIGZsb2F0IGNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRtYXgsIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcGFjaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXRtc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgY2hhciBzeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgbGFwYWNrX2ludCBtb2RlLCBkb3VibGUgY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRtYXgsIGxhcGFja19pbnQga2wsIGxhcGFja19pbnQga3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcGFjaywgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhdG1zX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBjaGFyIHN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGxhcGFja19pbnQgbW9kZSwgZmxvYXQgY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZG1heCwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwYWNrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemxhdG1zX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBjaGFyIHN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBsYXBhY2tfaW50IG1vZGUsIGRvdWJsZSBjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZG1heCwgbGFwYWNrX2ludCBrbCwgbGFwYWNrX2ludCBrdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwYWNrLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXV1bV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGxhdXVtX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2xhdXVtX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGF1dW1fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NvcGd0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9wZ3RyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3BtdHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXAsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3BtdHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JnYnJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9yZ2JyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29yZ2hyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWhpLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9yZ2hyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWhpLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JnbHFfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdscV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JncWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdxbF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JncXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rvcmdxcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JncnFfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmdycV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JndHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JndHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nvcm1icl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGNoYXIgc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9ybWJyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtaHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWhpLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtaHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBpbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWhpLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtbHFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtbHFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtcWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtcWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JtcnFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JtcnFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zb3Jtcnpfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rvcm1yel93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc29ybXRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9ybXRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BiY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBiY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0IGFub3JtLCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYmVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBiZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BiZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJlcXVfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmYiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBicmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BicmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBicmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnN0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYiwgZmxvYXQqIGJiLCBsYXBhY2tfaW50IGxkYmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJzdGZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2IsIGRvdWJsZSogYmIsIGxhcGFja19pbnQgbGRiYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYnN0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJzdGZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2IsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Bic3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Bic3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwYnN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Bic3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZmIsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWZiLCBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYnN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLCBsYXBhY2tfaW50IGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwYnN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsIGxhcGFja19pbnQgbGRhZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwYnRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJ0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwYnRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJ0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BidHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGJ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BidHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGtkLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cGJ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2QsIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcGZ0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwZnRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwZnRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBmdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcGZ0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwZnRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwZnRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBmdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcGZ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcGZ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwZnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwZnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9jb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9jb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb2Nvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb2VxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9lcXVfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Nwb2VxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXggKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9lcXVfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BvZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb2VxdWJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb2VxdWJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcG9yZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvcmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9yZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3Jmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3Jmc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9yZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9yZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBvcmZzeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFmLCBjb25zdCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbl9lcnJfYm5kcywgZG91YmxlKiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhcmFtcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Bvc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcG9zdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwb3N2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3Bvc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiB3b3JrLCBmbG9hdCogc3dvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl0ZXIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96Y3Bvc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogc3dvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl0ZXIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3N2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9zdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Bvc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGZsb2F0KiBzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG9zdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3N2eHhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcG9zdnh4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Bvc3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBvc3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3RyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG90cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3RyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBvdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cG90cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwb3Ryc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2Rwb3Ryc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BvdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBvdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcGNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBmbG9hdCBhbm9ybSwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGRvdWJsZSBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcGNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBwY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3BwZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbWF4ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBwZXF1X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcGVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcGVxdV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXggKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhZnAsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwcHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFmcCwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHByZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBwcmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHBzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhcCwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYXAsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NwcHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwcHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHBzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhZnAsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHBzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFmcCwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHBzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZnAsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBwc3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZnAsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcHRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBwdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BwdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHB0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHBwdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BwdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHB0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwcHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwcHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenBwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3Nwc3RyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHJhbmssIGZsb2F0IHRvbCwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHN0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGxhcGFja19pbnQqIHBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcmFuaywgZG91YmxlIHRvbCwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3BzdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHBpdiwgbGFwYWNrX2ludCogcmFuaywgZmxvYXQgdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwc3RyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcGl2LCBsYXBhY2tfaW50KiByYW5rLCBkb3VibGUgdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwdGNvbl93b3JrKCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHRjb25fd29yayggbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFub3JtLCBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHRjb25fd29yayggbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGUsIGZsb2F0IGFub3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenB0Y29uX3dvcmsoIGxhcGFja19pbnQgbiwgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zcHRlcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHRlcXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3B0ZXFyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenB0ZXFyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3B0cmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsIGNvbnN0IGZsb2F0KiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGVmLCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwdHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZGYsIGNvbnN0IGRvdWJsZSogZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHRyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBjb25zdCBmbG9hdCogZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3B0c3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kcHRzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3B0c3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NwdHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkZiwgZmxvYXQqIGVmLCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHB0c3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBlLCBkb3VibGUqIGRmLCBkb3VibGUqIGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3B0c3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSwgZmxvYXQqIGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pwdHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwgZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3B0dHJmX3dvcmsoIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHB0dHJmX3dvcmsoIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHR0cmZfd29yayggbGFwYWNrX2ludCBuLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHR0cmZfd29yayggbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3B0dHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RwdHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGUsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jcHR0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96cHR0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBmbG9hdCB2bCwgZmxvYXQgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGZsb2F0IGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGRvdWJsZSB2bCwgZG91YmxlIHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2Jnc3Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGZsb2F0KiBiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNiZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwgY29uc3QgZG91YmxlKiBiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzYmd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWIsIGxhcGFja19pbnQgbGRhYiwgZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiYiwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzYmd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2JndmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwgbGFwYWNrX2ludCBrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNiZ3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsIGxhcGFja19pbnQga2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBiYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGJiLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2Jndnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrYiwgZmxvYXQqIGFiLCBsYXBhY2tfaW50IGxkYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiYiwgbGFwYWNrX2ludCBsZGJiLCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGZsb2F0IHZsLCBmbG9hdCB2dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNiZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQga2IsIGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiYiwgbGFwYWNrX2ludCBsZGJiLCBkb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBkb3VibGUgdmwsIGRvdWJsZSB2dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZG91YmxlIGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NidHJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2J0cmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwgZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc2Zya193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmV0YSwgZmxvYXQqIGMgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc2Zya193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSwgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmV0YSwgZG91YmxlKiBjICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Bjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5vcm0sIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYW5vcm0sIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3Bjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3Bjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Bldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhcCwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhcCwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZXZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhcCwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGFwLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Bldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGFwLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZ3N0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYXAsIGNvbnN0IGZsb2F0KiBicCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGdzdF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhcCwgY29uc3QgZG91YmxlKiBicCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3NwZ3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYXAsIGZsb2F0KiBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZ3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGFwLCBkb3VibGUqIGJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcGd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYXAsIGZsb2F0KiBicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcGd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGFwLCBkb3VibGUqIGJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Bndnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYnAsIGZsb2F0IHZsLCBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwZ3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYnAsIGRvdWJsZSB2bCwgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3ByZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWZwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3ByZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZnAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwcmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzcHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Nwc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBmbG9hdCogYXAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwc3Zfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBkb3VibGUqIGFwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3Bzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzcHN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3Bzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3Bzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZnAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzcHN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3B0cmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhcCwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogdGF1ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwdHJkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB0YXUgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHNwdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwdHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3B0cmZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19pbnQqIGlwaXYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenNwdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzcHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzcHRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3NwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenNwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGViel93b3JrKCBjaGFyIHJhbmdlLCBjaGFyIG9yZGVyLCBsYXBhY2tfaW50IG4sIGZsb2F0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWJzdG9sLCBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG5zcGxpdCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlibG9jaywgbGFwYWNrX2ludCogaXNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3RlYnpfd29yayggY2hhciByYW5nZSwgY2hhciBvcmRlciwgbGFwYWNrX2ludCBuLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic3RvbCwgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG5zcGxpdCwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpYmxvY2ssIGxhcGFja19pbnQqIGlzcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZWRjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3RlZGNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3RlZGNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBjb21weiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzdGVkY193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGVncl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaXN1cHB6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZWdyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaXN1cHB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVncl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN0ZWdyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZWluX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBlLCBsYXBhY2tfaW50IG0sIGNvbnN0IGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlzcGxpdCwgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGVpbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBlLCBsYXBhY2tfaW50IG0sIGNvbnN0IGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaWJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpc3BsaXQsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVpbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZSwgbGFwYWNrX2ludCBtLCBjb25zdCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaWJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbHYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlaW5fd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZSwgbGFwYWNrX2ludCBtLCBjb25zdCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbHYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGVtcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQgbnpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc3VwcHosIGxhcGFja19sb2dpY2FsKiB0cnlyYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3RlbXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50IG56YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBsYXBhY2tfbG9naWNhbCogdHJ5cmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVtcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnpjLCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiB0cnlyYWMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3RlbXJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2dSwgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG56YywgbGFwYWNrX2ludCogaXN1cHB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogdHJ5cmFjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZXFyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN0ZXFyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzdGVxcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzdGVxcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGNvbXB6LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBkb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGVyZl93b3JrKCBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGVyZl93b3JrKCBsYXBhY2tfaW50IG4sIGRvdWJsZSogZCwgZG91YmxlKiBlICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3Rldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N0ZXZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3RldnJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlzdXBweiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlzdXBweiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzdGV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdnUsIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzdGV2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3ljb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5Y29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3ljb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQgYW5vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3ljb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3llcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5ZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5ZXF1Yl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3llcXViX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lldl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWV2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5ZXZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWV2cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnosIGNoYXIgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0IHZsLCBmbG9hdCB2dSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpbCwgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lldnJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlIHZsLCBkb3VibGUgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGRvdWJsZSBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaXN1cHB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N5ZXZ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9ieiwgY2hhciByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQgdmwsIGZsb2F0IHZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlsLCBsYXBhY2tfaW50IGl1LCBmbG9hdCBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lldnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J6LCBjaGFyIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlIHZsLCBkb3VibGUgdnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWwsIGxhcGFja19pbnQgaXUsIGRvdWJsZSBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWdzdF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lnc3Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWd2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lndl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3N5Z3ZkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeWd2ZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGl0eXBlLCBjaGFyIGpvYnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lndnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpdHlwZSwgY2hhciBqb2J6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJhbmdlLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZsLCBmbG9hdCB2dSwgbGFwYWNrX2ludCBpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpdSwgZmxvYXQgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5Z3Z4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaXR5cGUsIGNoYXIgam9ieiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByYW5nZSwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2bCwgZG91YmxlIHZ1LCBsYXBhY2tfaW50IGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGl1LCBkb3VibGUgYWJzdG9sLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCBsZHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5cmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGRvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXJmc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzLCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lyZnN4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcywgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCBucGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYXJhbXMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5cmZzeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZXF1ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXJmc3hfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFyYW1zLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lzdl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXN2X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3lzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXN2eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYWYsIGxhcGFja19pbnQgbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3lzdnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXN2eHhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3lzdnh4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgZmFjdCwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50IG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5c3Z4eF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGZhY3QsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50IG5wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFyYW1zLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXN2eHhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBmYWN0LCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50IGxkYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIHJwdmdydywgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQgbnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFyYW1zLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zc3l0cmRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyZl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0YmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0YmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYWIsIGxhcGFja19pbnQgbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0YmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGJjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RicmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0YnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgY29uc3QgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGJyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0YnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RidHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQga2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0YnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhYiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0YnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGtkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGFiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGJ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYWIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0ZnNtX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1cGxvLCBjaGFyIHRyYW5zLCBjaGFyIGRpYWcsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0IGFscGhhLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGZzbV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdXBsbywgY2hhciB0cmFucywgY2hhciBkaWFnLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUgYWxwaGEsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Rmc21fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmc21fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsIGNoYXIgZGlhZywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGZ0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRmdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdGZ0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0ZnR0cF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhcmYsIGZsb2F0KiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0ZnR0cF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXJmLCBkb3VibGUqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RmdHRwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHRwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0ZnR0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhcmYsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0ZnR0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXJmLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RmdHRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRmdHRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z2V2Y193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzLCBsYXBhY2tfaW50IGxkcywgY29uc3QgZmxvYXQqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRwLCBmbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsIGxhcGFja19pbnQgbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRnZXZjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzLCBsYXBhY2tfaW50IGxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBwLCBsYXBhY2tfaW50IGxkcCwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z2V2Y193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBzLCBsYXBhY2tfaW50IGxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHAsIGxhcGFja19pbnQgbGRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGdldmNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHMsIGxhcGFja19pbnQgbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHAsIGxhcGFja19pbnQgbGRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdGdleGNfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgd2FudHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnR6LCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogaWZzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxzdCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGdleGNfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgd2FudHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnR6LCBsYXBhY2tfaW50IG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHosIGxhcGFja19pbnQqIGlmc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsc3QsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z2V4Y193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlmc3QsIGxhcGFja19pbnQgaWxzdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0Z2V4Y193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfbG9naWNhbCB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHosIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpZnN0LCBsYXBhY2tfaW50IGlsc3QgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z3Nlbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnRxLCBsYXBhY2tfbG9naWNhbCB3YW50eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIGFscGhhciwgZmxvYXQqIGFscGhhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJldGEsIGZsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR6LCBsYXBhY2tfaW50KiBtLCBmbG9hdCogcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwciwgZmxvYXQqIGRpZiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0Z3Nlbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsIHdhbnRxLCBsYXBhY2tfbG9naWNhbCB3YW50eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIGFscGhhciwgZG91YmxlKiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50IGxkeiwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwbCwgZG91YmxlKiBwciwgZG91YmxlKiBkaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgbGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3Rnc2VuX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgaWpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwgd2FudHEsIGxhcGFja19sb2dpY2FsIHdhbnR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50IGxkeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHBsLCBmbG9hdCogcHIsIGZsb2F0KiBkaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCBsaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGdzZW5fd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBpam9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCB3YW50cSwgbGFwYWNrX2xvZ2ljYWwgd2FudHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQgbGR6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHBsLCBkb3VibGUqIHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRpZiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z3NqYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2JxLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0IHRvbGEsIGZsb2F0IHRvbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsIGZsb2F0KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuY3ljbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdGdzamFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBsYXBhY2tfaW50IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSB0b2xhLCBkb3VibGUgdG9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYSwgZG91YmxlKiBiZXRhLCBkb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBkb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5jeWNsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z3NqYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUsIGNoYXIgam9idiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2JxLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvbGEsIGZsb2F0IHRvbGIsIGZsb2F0KiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJldGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuY3ljbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dGdzamFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1LCBjaGFyIGpvYnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9icSwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBsYXBhY2tfaW50IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b2xhLCBkb3VibGUgdG9sYiwgZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5jeWNsZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Rnc25hX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgY29uc3QgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdmwsIGNvbnN0IGZsb2F0KiB2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZyLCBmbG9hdCogcywgZmxvYXQqIGRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHdvcmssIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRnc25hX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdnIsIGxhcGFja19pbnQgbGR2ciwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRpZiwgbGFwYWNrX2ludCBtbSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z3NuYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQgbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBkaWYsIGxhcGFja19pbnQgbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGx3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0Z3NuYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGRvdWJsZSogcywgZG91YmxlKiBkaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0Z3N5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGQsIGNvbnN0IGZsb2F0KiBlLCBsYXBhY2tfaW50IGxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGYsIGxhcGFja19pbnQgbGRmLCBmbG9hdCogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkaWYsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0Z3N5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRkLCBjb25zdCBkb3VibGUqIGUsIGxhcGFja19pbnQgbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGYsIGxhcGFja19pbnQgbGRmLCBkb3VibGUqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRpZiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0Z3N5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZCwgbGFwYWNrX2ludCBsZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBsYXBhY2tfaW50IGxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGYsIGxhcGFja19pbnQgbGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NhbGUsIGZsb2F0KiBkaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0Z3N5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IGlqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsIGxhcGFja19pbnQgbGRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsIGxhcGFja19pbnQgbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGYsIGxhcGFja19pbnQgbGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlLCBkb3VibGUqIGRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cGNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cGNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwcmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHByZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBjb25zdCBkb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cHJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBmbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHB0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhcCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cHRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHB0cmlfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIGRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHB0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwdHJzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHB0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHB0dGZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBhcmYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHB0dGZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuc3IsIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGFyZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cHR0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFyZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cHR0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXJmICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHB0dHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRwdHRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RwdHRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cHR0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RyY29uX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgbm9ybSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJjb25fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBub3JtLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cmNvbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIG5vcm0sIGNoYXIgdXBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RyZXZjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2bCwgZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRyZXZjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cmV2Y193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLCBsYXBhY2tfaW50IGxkdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2ciwgbGFwYWNrX2ludCBsZHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRyZXZjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RyZXhjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGxhcGFja19pbnQqIGlmc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsc3QsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRyZXhjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkcSwgbGFwYWNrX2ludCogaWZzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxzdCwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RyZXhjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaWZzdCwgbGFwYWNrX2ludCBpbHN0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRyZXhjX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgY29tcHEsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpZnN0LCBsYXBhY2tfaW50IGlsc3QgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnJmc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBjb25zdCBmbG9hdCogeCwgbGFwYWNrX2ludCBsZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRycmZzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgbnJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB4LCBsYXBhY2tfaW50IGxkeCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJyZnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJzZW5fd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgY29tcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHEsIGZsb2F0KiB3ciwgZmxvYXQqIHdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogcywgZmxvYXQqIHNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnNlbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LCBkb3VibGUqIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRxLCBkb3VibGUqIHdyLCBkb3VibGUqIHdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHMsIGRvdWJsZSogc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50IGxpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cnNlbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50IGxkcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cnNlbl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBjb21wcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3Ryc25hX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9iLCBjaGFyIGhvd21ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsIGNvbnN0IGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLCBjb25zdCBmbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2ciwgZmxvYXQqIHMsIGZsb2F0KiBzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkd29yaywgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHJzbmFfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2IsIGNoYXIgaG93bW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB2ciwgbGFwYWNrX2ludCBsZHZyLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2VwLCBsYXBhY2tfaW50IG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbGR3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cnNuYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsIGxhcGFja19pbnQgbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50IGxkdnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzLCBmbG9hdCogc2VwLCBsYXBhY2tfaW50IG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHdvcmssIGZsb2F0KiByd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cnNuYV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYiwgY2hhciBob3dtbnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdnIsIGRvdWJsZSogcywgZG91YmxlKiBzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsZHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnN5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5hLCBjaGFyIHRyYW5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlzZ24sIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiwgZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NhbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHJzeWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuYSwgY2hhciB0cmFuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpc2duLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYywgZG91YmxlKiBzY2FsZSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cnN5bF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5hLCBjaGFyIHRyYW5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGlzZ24sIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NhbGUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHJzeWxfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFuYSwgY2hhciB0cmFuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpc2duLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY2FsZSApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RydHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RydHJpX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciBkaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cnRyaV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgZGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHJ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0cnNfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWcsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBucmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cnRyc193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZywgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IG5yaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnR0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFyZiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cnR0Zl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zciwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYXJmICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3RydHRmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXJmICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRydHRmX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnNyLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcmYgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3N0cnR0cF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHJ0dHBfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogYXAgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHJ0dHBfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRydHRwX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHpyemZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHpyemZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHpyemZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHpyemZfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmdicl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHZlY3QsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5nYnJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5naHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5naHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmdscV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ2xxX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmdxbF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3FsX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmdxcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3FyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmdycV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVuZ3JxX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bmd0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bmd0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3VubWJyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdmVjdCwgY2hhciBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tYnJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB2ZWN0LCBjaGFyIHNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1ocl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1ocl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGlsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpaGksIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1scV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1scV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1xbF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1xbF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1xcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1xcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1ycV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bm1ycV93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQgbGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2N1bm1yel93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVubXJ6X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5tdHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5tdHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHVwbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50IGxkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9jdXBndHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQgbGRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1cGd0cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCBsZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3VwbXRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenVwbXRyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB1cGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCBsZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0VfY2xhZ2hlKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpc2VlZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3psYWdoZSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfaW50KiBpc2VlZCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2xhZ3N5KCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc2VlZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYWdzeSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc2VlZCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYWdzeSggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXNlZWQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFnc3koIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2ludCogaXNlZWQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NsYXBtciggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgZm9yd3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGZsb2F0KiB4LCBsYXBhY2tfaW50IGxkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFwbXIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19sb2dpY2FsIGZvcndyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgbGFwYWNrX2ludCogayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NsYXBtciggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2xvZ2ljYWwgZm9yd3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgsIGxhcGFja19pbnQqIGsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96bGFwbXIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19sb2dpY2FsIGZvcndyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeCwgbGFwYWNrX2ludCogayApOworCisKK2Zsb2F0IExBUEFDS0Vfc2xhcHkyKCBmbG9hdCB4LCBmbG9hdCB5ICk7Citkb3VibGUgTEFQQUNLRV9kbGFweTIoIGRvdWJsZSB4LCBkb3VibGUgeSApOworCitmbG9hdCBMQVBBQ0tFX3NsYXB5MyggZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiApOworZG91YmxlIExBUEFDS0VfZGxhcHkzKCBkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFydGdwKCBmbG9hdCBmLCBmbG9hdCBnLCBmbG9hdCogY3MsIGZsb2F0KiBzbiwgZmxvYXQqIHIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kbGFydGdwKCBkb3VibGUgZiwgZG91YmxlIGcsIGRvdWJsZSogY3MsIGRvdWJsZSogc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zbGFydGdzKCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBzaWdtYSwgZmxvYXQqIGNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzbiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RsYXJ0Z3MoIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHNpZ21hLCBkb3VibGUqIGNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc24gKTsKKworCisvL0xBUEFDSyAzLjMuMAorbGFwYWNrX2ludCBMQVBBQ0tFX2NiYmNzZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IHEsIGZsb2F0KiB0aGV0YSwgZmxvYXQqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1MSwgbGFwYWNrX2ludCBsZHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUyLCBsYXBhY2tfaW50IGxkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdjF0LCBsYXBhY2tfaW50IGxkdjF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYydCwgbGFwYWNrX2ludCBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiMTFkLCBmbG9hdCogYjExZSwgZmxvYXQqIGIxMmQsIGZsb2F0KiBiMTJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIyMWQsIGZsb2F0KiBiMjFlLCBmbG9hdCogYjIyZCwgZmxvYXQqIGIyMmUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jYmJjc2Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGhldGEsIGZsb2F0KiBwaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1MSwgbGFwYWNrX2ludCBsZHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdTIsIGxhcGFja19pbnQgbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYxdCwgbGFwYWNrX2ludCBsZHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYydCwgbGFwYWNrX2ludCBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMWQsIGZsb2F0KiBiMTFlLCBmbG9hdCogYjEyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMmUsIGZsb2F0KiBiMjFkLCBmbG9hdCogYjIxZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIyMmQsIGZsb2F0KiBiMjJlLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2hlc3dhcHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpMiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXN3YXByX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaTIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaGV0cmkyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXRyaTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaGV0cmkyeCggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCBuYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NoZXRyaTJ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IG5iICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2hldHJzMiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jaGV0cnMyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3ljb252KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgd2F5LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3ljb252X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzeXN3YXByKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaTIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3lzd2Fwcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGkyICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJpMiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3l0cmkyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJpMngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgbmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jc3l0cmkyeF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBuYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NzeXRyczIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3N5dHJzMl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3VuYmRiKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIHNpZ25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeDEyLCBsYXBhY2tfaW50IGxkeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGhldGEsIGZsb2F0KiBwaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cTIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5iZGJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgY2hhciBzaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgxMSwgbGFwYWNrX2ludCBsZHgxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgxMiwgbGFwYWNrX2ludCBsZHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMiwgbGFwYWNrX2ludCBsZHgyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRoZXRhLCBmbG9hdCogcGhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdXExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfY3VuY3NkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUxLCBjaGFyIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLCBjaGFyIHNpZ25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeDEyLCBsYXBhY2tfaW50IGxkeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGhldGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdjF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYxdCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MnQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdW5jc2Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNpZ25zLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBxLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDExLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDEyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDIxLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDIyLCBmbG9hdCogdGhldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1MSwgbGFwYWNrX2ludCBsZHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdTIsIGxhcGFja19pbnQgbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYxdCwgbGFwYWNrX2ludCBsZHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYydCwgbGFwYWNrX2ludCBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCBscndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGJiY3NkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUxLCBjaGFyIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwgZG91YmxlKiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGhpLCBkb3VibGUqIHUxLCBsYXBhY2tfaW50IGxkdTEsIGRvdWJsZSogdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdTIsIGRvdWJsZSogdjF0LCBsYXBhY2tfaW50IGxkdjF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2MnQsIGxhcGFja19pbnQgbGR2MnQsIGRvdWJsZSogYjExZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYjExZSwgZG91YmxlKiBiMTJkLCBkb3VibGUqIGIxMmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIyMWQsIGRvdWJsZSogYjIxZSwgZG91YmxlKiBiMjJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiMjJlICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGJiY3NkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idTEsIGNoYXIgam9idTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0aGV0YSwgZG91YmxlKiBwaGksIGRvdWJsZSogdTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MSwgZG91YmxlKiB1MiwgbGFwYWNrX2ludCBsZHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHYxdCwgbGFwYWNrX2ludCBsZHYxdCwgZG91YmxlKiB2MnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MnQsIGRvdWJsZSogYjExZCwgZG91YmxlKiBiMTFlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIxMmQsIGRvdWJsZSogYjEyZSwgZG91YmxlKiBiMjFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIyMWUsIGRvdWJsZSogYjIyZCwgZG91YmxlKiBiMjJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kb3JiZGIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgc2lnbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4MTEsIGxhcGFja19pbnQgbGR4MTEsIGRvdWJsZSogeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgxMiwgZG91YmxlKiB4MjEsIGxhcGFja19pbnQgbGR4MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgyMiwgbGFwYWNrX2ludCBsZHgyMiwgZG91YmxlKiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGhpLCBkb3VibGUqIHRhdXAxLCBkb3VibGUqIHRhdXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXVxMSwgZG91YmxlKiB0YXVxMiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmJkYl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHRyYW5zLCBjaGFyIHNpZ25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgxMSwgbGFwYWNrX2ludCBsZHgxMSwgZG91YmxlKiB4MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4MTIsIGRvdWJsZSogeDIxLCBsYXBhY2tfaW50IGxkeDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgyMiwgbGFwYWNrX2ludCBsZHgyMiwgZG91YmxlKiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwaGksIGRvdWJsZSogdGF1cDEsIGRvdWJsZSogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1cTEsIGRvdWJsZSogdGF1cTIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RvcmNzZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywgY2hhciBzaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgxMSwgbGFwYWNrX2ludCBsZHgxMSwgZG91YmxlKiB4MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDEyLCBkb3VibGUqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeDIyLCBsYXBhY2tfaW50IGxkeDIyLCBkb3VibGUqIHRoZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB1MSwgbGFwYWNrX2ludCBsZHUxLCBkb3VibGUqIHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUyLCBkb3VibGUqIHYxdCwgbGFwYWNrX2ludCBsZHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdjJ0LCBsYXBhY2tfaW50IGxkdjJ0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZG9yY3NkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idTEsIGNoYXIgam9idTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzaWducywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcSwgZG91YmxlKiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeDEyLCBsYXBhY2tfaW50IGxkeDEyLCBkb3VibGUqIHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgyMSwgZG91YmxlKiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGhldGEsIGRvdWJsZSogdTEsIGxhcGFja19pbnQgbGR1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB1MiwgbGFwYWNrX2ludCBsZHUyLCBkb3VibGUqIHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYxdCwgZG91YmxlKiB2MnQsIGxhcGFja19pbnQgbGR2MnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3ljb252KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGNoYXIgd2F5LCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeWNvbnZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXN3YXByKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGkxLCBsYXBhY2tfaW50IGkyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5c3dhcHJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGkxLCBsYXBhY2tfaW50IGkyICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHN5dHJpMiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyaTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyaTJ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyaTJ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kc3l0cnMyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RzeXRyczJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwgZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc2JiY3NkKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUxLCBjaGFyIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwgZmxvYXQqIHRoZXRhLCBmbG9hdCogcGhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHUxLCBsYXBhY2tfaW50IGxkdTEsIGZsb2F0KiB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MiwgZmxvYXQqIHYxdCwgbGFwYWNrX2ludCBsZHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2MnQsIGxhcGFja19pbnQgbGR2MnQsIGZsb2F0KiBiMTFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMWUsIGZsb2F0KiBiMTJkLCBmbG9hdCogYjEyZSwgZmxvYXQqIGIyMWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYjIxZSwgZmxvYXQqIGIyMmQsIGZsb2F0KiBiMjJlICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc2JiY3NkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idTEsIGNoYXIgam9idTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRoZXRhLCBmbG9hdCogcGhpLCBmbG9hdCogdTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MSwgZmxvYXQqIHUyLCBsYXBhY2tfaW50IGxkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2MXQsIGxhcGFja19pbnQgbGR2MXQsIGZsb2F0KiB2MnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MnQsIGZsb2F0KiBiMTFkLCBmbG9hdCogYjExZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMmQsIGZsb2F0KiBiMTJlLCBmbG9hdCogYjIxZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIyMWUsIGZsb2F0KiBiMjJkLCBmbG9hdCogYjIyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9zb3JiZGIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgc2lnbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLCBmbG9hdCogeDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgxMSwgZmxvYXQqIHgxMiwgbGFwYWNrX2ludCBsZHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4MjEsIGxhcGFja19pbnQgbGR4MjEsIGZsb2F0KiB4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDIyLCBmbG9hdCogdGhldGEsIGZsb2F0KiBwaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1cDEsIGZsb2F0KiB0YXVwMiwgZmxvYXQqIHRhdXExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdXEyICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc29yYmRiX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgc2lnbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4MTEsIGxhcGFja19pbnQgbGR4MTEsIGZsb2F0KiB4MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4MTIsIGZsb2F0KiB4MjEsIGxhcGFja19pbnQgbGR4MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4MjIsIGxhcGFja19pbnQgbGR4MjIsIGZsb2F0KiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBoaSwgZmxvYXQqIHRhdXAxLCBmbG9hdCogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0YXVxMSwgZmxvYXQqIHRhdXEyLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3NvcmNzZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywgY2hhciBzaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IHEsIGZsb2F0KiB4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDExLCBmbG9hdCogeDEyLCBsYXBhY2tfaW50IGxkeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwgZmxvYXQqIHgyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4MjIsIGZsb2F0KiB0aGV0YSwgZmxvYXQqIHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUxLCBmbG9hdCogdTIsIGxhcGFja19pbnQgbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2MXQsIGxhcGFja19pbnQgbGR2MXQsIGZsb2F0KiB2MnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdjJ0ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc29yY3NkX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idTEsIGNoYXIgam9idTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzaWducywgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgcSwgZmxvYXQqIHgxMSwgbGFwYWNrX2ludCBsZHgxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgxMiwgbGFwYWNrX2ludCBsZHgxMiwgZmxvYXQqIHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgyMSwgZmxvYXQqIHgyMiwgbGFwYWNrX2ludCBsZHgyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRoZXRhLCBmbG9hdCogdTEsIGxhcGFja19pbnQgbGR1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHUyLCBsYXBhY2tfaW50IGxkdTIsIGZsb2F0KiB2MXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MXQsIGZsb2F0KiB2MnQsIGxhcGFja19pbnQgbGR2MnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeWNvbnYoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB3YXksIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9zc3ljb252X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgY2hhciB3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc3N5c3dhcHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBpMSwgbGFwYWNrX2ludCBpMiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXN3YXByX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGkxLCBsYXBhY2tfaW50IGkyICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc3N5dHJpMiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc3N5dHJpMl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3NzeXRyaTJ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iICk7CitsYXBhY2tfaW50IExBUEFDS0Vfc3N5dHJpMnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9zc3l0cnMyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9zc3l0cnMyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLCBmbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3piYmNzZCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgam9idjF0LCBjaGFyIGpvYnYydCwgY2hhciB0cmFucywgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBwLCBsYXBhY2tfaW50IHEsIGRvdWJsZSogdGhldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBoaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR1MiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2MXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdjF0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MnQsIGRvdWJsZSogYjExZCwgZG91YmxlKiBiMTFlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiMTJkLCBkb3VibGUqIGIxMmUsIGRvdWJsZSogYjIxZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYjIxZSwgZG91YmxlKiBiMjJkLCBkb3VibGUqIGIyMmUgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96YmJjc2Rfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBqb2J1MSwgY2hhciBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBqb2J2MXQsIGNoYXIgam9idjJ0LCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRoZXRhLCBkb3VibGUqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1MSwgbGFwYWNrX2ludCBsZHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUyLCBsYXBhY2tfaW50IGxkdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdjF0LCBsYXBhY2tfaW50IGxkdjF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYydCwgbGFwYWNrX2ludCBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiMTFkLCBkb3VibGUqIGIxMWUsIGRvdWJsZSogYjEyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiMTJlLCBkb3VibGUqIGIyMWQsIGRvdWJsZSogYjIxZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiMjJkLCBkb3VibGUqIGIyMmUsIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbHJ3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0Vfemhlc3dhcHIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaTIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGVzd2Fwcl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgaTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpMiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyaTIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyaTJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBsd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyaTJ4KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCBuYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3poZXRyaTJ4X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbmIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96aGV0cnMyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfemhldHJzMl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5Y29udiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHdheSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeWNvbnZfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBjaGFyIHdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3lzd2FwciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBpMiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXN3YXByX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGkyICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJpMiggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJpMl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50IGx3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJpMngoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50IG5iICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5dHJpMnhfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCBuYiApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pzeXRyczIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3l0cnMyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdXBsbywgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5iZGIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgdHJhbnMsIGNoYXIgc2lnbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgxMiwgbGFwYWNrX2ludCBsZHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDIxLCBsYXBhY2tfaW50IGxkeDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRoZXRhLCBkb3VibGUqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXVxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cTIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5iZGJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciB0cmFucywgY2hhciBzaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IHAsIGxhcGFja19pbnQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDEyLCBsYXBhY2tfaW50IGxkeDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgyMSwgbGFwYWNrX2ludCBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGhldGEsIGRvdWJsZSogcGhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dW5jc2QoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgam9idTEsIGNoYXIgam9idTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnYxdCwgY2hhciBqb2J2MnQsIGNoYXIgdHJhbnMsIGNoYXIgc2lnbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgcCwgbGFwYWNrX2ludCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MTEsIGxhcGFja19pbnQgbGR4MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgxMiwgbGFwYWNrX2ludCBsZHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDIxLCBsYXBhY2tfaW50IGxkeDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MjIsIGxhcGFja19pbnQgbGR4MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRoZXRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUxLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHUyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYxdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2MXQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdjJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYydCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p1bmNzZF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIGpvYnUxLCBjaGFyIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGpvYnYxdCwgY2hhciBqb2J2MnQsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc2lnbnMsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IHEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDExLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHgxMiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR4MjEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkeDIyLCBkb3VibGUqIHRoZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUxLCBsYXBhY2tfaW50IGxkdTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdTIsIGxhcGFja19pbnQgbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2MXQsIGxhcGFja19pbnQgbGR2MXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdjJ0LCBsYXBhY2tfaW50IGxkdjJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgbHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayApOworLy9MQVBBQ0sgMy40LjAKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VtcXJ0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBjb25zdCBmbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX2RnZW1xcnQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIsIGNvbnN0IGRvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlbXFydCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYyApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZW1xcnQoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFydCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VxcnQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiwgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcnQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFydCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFydDIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VxcnQyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcnQyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXJ0MiggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VxcnQzKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXJ0MyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcXJ0MyggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFydDMoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwbXFydCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLCBjb25zdCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHBtcXJ0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGxhcGFja19pbnQgbmIsIGNvbnN0IGRvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBtcXJ0KCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGxhcGFja19pbnQgbmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRwbXFydCggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHFydCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGxhcGFja19pbnQgbmIsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cHFydCggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGxhcGFja19pbnQgbmIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHBxcnQoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHBxcnQyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHBxcnQyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBxcnQyKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cHFydDIoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHByZmIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywgY2hhciBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwgY29uc3QgZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG15bGR3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRwcmZiKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsIGNoYXIgZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdG9yZXYsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBrLCBsYXBhY2tfaW50IGwsIGNvbnN0IGRvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbXlsZHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHByZmIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywgY2hhciBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbXlsZHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHByZmIoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywgY2hhciBkaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG15bGR3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VtcXJ0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBjb25zdCBmbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlbXFydF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiwgY29uc3QgZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjLCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VtcXJ0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRjLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZW1xcnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc2dlcXJ0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwgZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VxcnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbmIsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQsIGRvdWJsZSogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2NnZXFydF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXJ0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG5iLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX3NnZXFydDJfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kZ2VxcnQyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jZ2VxcnQyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfemdlcXJ0Ml93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0ICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zZ2VxcnQzX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfZGdlcXJ0M193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsIGRvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfY2dlcXJ0M193b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCApOworbGFwYWNrX2ludCBMQVBBQ0tFX3pnZXFydDNfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwbXFydF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLCBjb25zdCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR2LCBjb25zdCBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGZsb2F0KiB3b3JrICk7CitsYXBhY2tfaW50IExBUEFDS0VfZHRwbXFydF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLCBjb25zdCBkb3VibGUqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdiwgY29uc3QgZG91YmxlKiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZHQsIGRvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBtcXJ0X3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGwsIGxhcGFja19pbnQgbmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCBsZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX3p0cG1xcnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgbGFwYWNrX2ludCBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmsgKTsKKworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHFydF93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsLCBsYXBhY2tfaW50IG5iLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LCBkb3VibGUqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBxcnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgbGFwYWNrX2ludCBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGxkdCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHBxcnRfd29yayggaW50IG1hdHJpeF9vcmRlciwgbGFwYWNrX2ludCBtLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbCwgbGFwYWNrX2ludCBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICk7CisKK2xhcGFja19pbnQgTEFQQUNLRV9zdHBxcnQyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRiLCBmbG9hdCogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9kdHBxcnQyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBsZGIsIGRvdWJsZSogdCwgbGFwYWNrX2ludCBsZHQgKTsKK2xhcGFja19pbnQgTEFQQUNLRV9jdHBxcnQyX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGxhcGFja19pbnQgbSwgbGFwYWNrX2ludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQgbGR0ICk7CitsYXBhY2tfaW50IExBUEFDS0VfenRwcXJ0Ml93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBsYXBhY2tfaW50IG0sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCApOworCitsYXBhY2tfaW50IExBUEFDS0Vfc3RwcmZiX3dvcmsoIGludCBtYXRyaXhfb3JkZXIsIGNoYXIgc2lkZSwgY2hhciB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaXJlY3QsIGNoYXIgc3RvcmV2LCBsYXBhY2tfaW50IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbiwgbGFwYWNrX2ludCBrLCBsYXBhY2tfaW50IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB2LCBsYXBhY2tfaW50IGxkdiwgY29uc3QgZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGR0LCBmbG9hdCogYSwgbGFwYWNrX2ludCBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50IGxkYiwgY29uc3QgZmxvYXQqIG15d29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBteWxkd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2R0cHJmYl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlyZWN0LCBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgbGFwYWNrX2ludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHYsIGxhcGFja19pbnQgbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHQsIGxhcGFja19pbnQgbGR0LCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQgbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIG15d29yaywgbGFwYWNrX2ludCBteWxkd29yayApOworbGFwYWNrX2ludCBMQVBBQ0tFX2N0cHJmYl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHNpZGUsIGNoYXIgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlyZWN0LCBjaGFyIHN0b3JldiwgbGFwYWNrX2ludCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IG4sIGxhcGFja19pbnQgaywgbGFwYWNrX2ludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCBsZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgbGRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCBsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBteXdvcmssIGxhcGFja19pbnQgbXlsZHdvcmsgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96dHByZmJfd29yayggaW50IG1hdHJpeF9vcmRlciwgY2hhciBzaWRlLCBjaGFyIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpcmVjdCwgY2hhciBzdG9yZXYsIGxhcGFja19pbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCBuLCBsYXBhY2tfaW50IGssIGxhcGFja19pbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50IGxkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50IGxkdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50IGxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBteXdvcmssIGxhcGFja19pbnQgbXlsZHdvcmsgKTsKKy8vTEFQQUNLIDMuWC5YCitsYXBhY2tfaW50IExBUEFDS0VfY3N5ciggaW50IG1hdHJpeF9vcmRlciwgY2hhciB1cGxvLCBsYXBhY2tfaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCBpbmN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCBsZGEgKTsKK2xhcGFja19pbnQgTEFQQUNLRV96c3lyKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQgaW5jeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50IGxkYSApOworCitsYXBhY2tfaW50IExBUEFDS0VfY3N5cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50IGluY3gsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CitsYXBhY2tfaW50IExBUEFDS0VfenN5cl93b3JrKCBpbnQgbWF0cml4X29yZGVyLCBjaGFyIHVwbG8sIGxhcGFja19pbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgaW5jeCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgbGRhICk7CisKKworCisjZGVmaW5lIExBUEFDS19zZ2V0cmYgTEFQQUNLX0dMT0JBTChzZ2V0cmYsU0dFVFJGKQorI2RlZmluZSBMQVBBQ0tfZGdldHJmIExBUEFDS19HTE9CQUwoZGdldHJmLERHRVRSRikKKyNkZWZpbmUgTEFQQUNLX2NnZXRyZiBMQVBBQ0tfR0xPQkFMKGNnZXRyZixDR0VUUkYpCisjZGVmaW5lIExBUEFDS196Z2V0cmYgTEFQQUNLX0dMT0JBTCh6Z2V0cmYsWkdFVFJGKQorI2RlZmluZSBMQVBBQ0tfc2didHJmIExBUEFDS19HTE9CQUwoc2didHJmLFNHQlRSRikKKyNkZWZpbmUgTEFQQUNLX2RnYnRyZiBMQVBBQ0tfR0xPQkFMKGRnYnRyZixER0JUUkYpCisjZGVmaW5lIExBUEFDS19jZ2J0cmYgTEFQQUNLX0dMT0JBTChjZ2J0cmYsQ0dCVFJGKQorI2RlZmluZSBMQVBBQ0tfemdidHJmIExBUEFDS19HTE9CQUwoemdidHJmLFpHQlRSRikKKyNkZWZpbmUgTEFQQUNLX3NndHRyZiBMQVBBQ0tfR0xPQkFMKHNndHRyZixTR1RUUkYpCisjZGVmaW5lIExBUEFDS19kZ3R0cmYgTEFQQUNLX0dMT0JBTChkZ3R0cmYsREdUVFJGKQorI2RlZmluZSBMQVBBQ0tfY2d0dHJmIExBUEFDS19HTE9CQUwoY2d0dHJmLENHVFRSRikKKyNkZWZpbmUgTEFQQUNLX3pndHRyZiBMQVBBQ0tfR0xPQkFMKHpndHRyZixaR1RUUkYpCisjZGVmaW5lIExBUEFDS19zcG90cmYgTEFQQUNLX0dMT0JBTChzcG90cmYsU1BPVFJGKQorI2RlZmluZSBMQVBBQ0tfZHBvdHJmIExBUEFDS19HTE9CQUwoZHBvdHJmLERQT1RSRikKKyNkZWZpbmUgTEFQQUNLX2Nwb3RyZiBMQVBBQ0tfR0xPQkFMKGNwb3RyZixDUE9UUkYpCisjZGVmaW5lIExBUEFDS196cG90cmYgTEFQQUNLX0dMT0JBTCh6cG90cmYsWlBPVFJGKQorI2RlZmluZSBMQVBBQ0tfZHBzdHJmIExBUEFDS19HTE9CQUwoZHBzdHJmLERQU1RSRikKKyNkZWZpbmUgTEFQQUNLX3Nwc3RyZiBMQVBBQ0tfR0xPQkFMKHNwc3RyZixTUFNUUkYpCisjZGVmaW5lIExBUEFDS196cHN0cmYgTEFQQUNLX0dMT0JBTCh6cHN0cmYsWlBTVFJGKQorI2RlZmluZSBMQVBBQ0tfY3BzdHJmIExBUEFDS19HTE9CQUwoY3BzdHJmLENQU1RSRikKKyNkZWZpbmUgTEFQQUNLX2RwZnRyZiBMQVBBQ0tfR0xPQkFMKGRwZnRyZixEUEZUUkYpCisjZGVmaW5lIExBUEFDS19zcGZ0cmYgTEFQQUNLX0dMT0JBTChzcGZ0cmYsU1BGVFJGKQorI2RlZmluZSBMQVBBQ0tfenBmdHJmIExBUEFDS19HTE9CQUwoenBmdHJmLFpQRlRSRikKKyNkZWZpbmUgTEFQQUNLX2NwZnRyZiBMQVBBQ0tfR0xPQkFMKGNwZnRyZixDUEZUUkYpCisjZGVmaW5lIExBUEFDS19zcHB0cmYgTEFQQUNLX0dMT0JBTChzcHB0cmYsU1BQVFJGKQorI2RlZmluZSBMQVBBQ0tfZHBwdHJmIExBUEFDS19HTE9CQUwoZHBwdHJmLERQUFRSRikKKyNkZWZpbmUgTEFQQUNLX2NwcHRyZiBMQVBBQ0tfR0xPQkFMKGNwcHRyZixDUFBUUkYpCisjZGVmaW5lIExBUEFDS196cHB0cmYgTEFQQUNLX0dMT0JBTCh6cHB0cmYsWlBQVFJGKQorI2RlZmluZSBMQVBBQ0tfc3BidHJmIExBUEFDS19HTE9CQUwoc3BidHJmLFNQQlRSRikKKyNkZWZpbmUgTEFQQUNLX2RwYnRyZiBMQVBBQ0tfR0xPQkFMKGRwYnRyZixEUEJUUkYpCisjZGVmaW5lIExBUEFDS19jcGJ0cmYgTEFQQUNLX0dMT0JBTChjcGJ0cmYsQ1BCVFJGKQorI2RlZmluZSBMQVBBQ0tfenBidHJmIExBUEFDS19HTE9CQUwoenBidHJmLFpQQlRSRikKKyNkZWZpbmUgTEFQQUNLX3NwdHRyZiBMQVBBQ0tfR0xPQkFMKHNwdHRyZixTUFRUUkYpCisjZGVmaW5lIExBUEFDS19kcHR0cmYgTEFQQUNLX0dMT0JBTChkcHR0cmYsRFBUVFJGKQorI2RlZmluZSBMQVBBQ0tfY3B0dHJmIExBUEFDS19HTE9CQUwoY3B0dHJmLENQVFRSRikKKyNkZWZpbmUgTEFQQUNLX3pwdHRyZiBMQVBBQ0tfR0xPQkFMKHpwdHRyZixaUFRUUkYpCisjZGVmaW5lIExBUEFDS19zc3l0cmYgTEFQQUNLX0dMT0JBTChzc3l0cmYsU1NZVFJGKQorI2RlZmluZSBMQVBBQ0tfZHN5dHJmIExBUEFDS19HTE9CQUwoZHN5dHJmLERTWVRSRikKKyNkZWZpbmUgTEFQQUNLX2NzeXRyZiBMQVBBQ0tfR0xPQkFMKGNzeXRyZixDU1lUUkYpCisjZGVmaW5lIExBUEFDS196c3l0cmYgTEFQQUNLX0dMT0JBTCh6c3l0cmYsWlNZVFJGKQorI2RlZmluZSBMQVBBQ0tfY2hldHJmIExBUEFDS19HTE9CQUwoY2hldHJmLENIRVRSRikKKyNkZWZpbmUgTEFQQUNLX3poZXRyZiBMQVBBQ0tfR0xPQkFMKHpoZXRyZixaSEVUUkYpCisjZGVmaW5lIExBUEFDS19zc3B0cmYgTEFQQUNLX0dMT0JBTChzc3B0cmYsU1NQVFJGKQorI2RlZmluZSBMQVBBQ0tfZHNwdHJmIExBUEFDS19HTE9CQUwoZHNwdHJmLERTUFRSRikKKyNkZWZpbmUgTEFQQUNLX2NzcHRyZiBMQVBBQ0tfR0xPQkFMKGNzcHRyZixDU1BUUkYpCisjZGVmaW5lIExBUEFDS196c3B0cmYgTEFQQUNLX0dMT0JBTCh6c3B0cmYsWlNQVFJGKQorI2RlZmluZSBMQVBBQ0tfY2hwdHJmIExBUEFDS19HTE9CQUwoY2hwdHJmLENIUFRSRikKKyNkZWZpbmUgTEFQQUNLX3pocHRyZiBMQVBBQ0tfR0xPQkFMKHpocHRyZixaSFBUUkYpCisjZGVmaW5lIExBUEFDS19zZ2V0cnMgTEFQQUNLX0dMT0JBTChzZ2V0cnMsU0dFVFJTKQorI2RlZmluZSBMQVBBQ0tfZGdldHJzIExBUEFDS19HTE9CQUwoZGdldHJzLERHRVRSUykKKyNkZWZpbmUgTEFQQUNLX2NnZXRycyBMQVBBQ0tfR0xPQkFMKGNnZXRycyxDR0VUUlMpCisjZGVmaW5lIExBUEFDS196Z2V0cnMgTEFQQUNLX0dMT0JBTCh6Z2V0cnMsWkdFVFJTKQorI2RlZmluZSBMQVBBQ0tfc2didHJzIExBUEFDS19HTE9CQUwoc2didHJzLFNHQlRSUykKKyNkZWZpbmUgTEFQQUNLX2RnYnRycyBMQVBBQ0tfR0xPQkFMKGRnYnRycyxER0JUUlMpCisjZGVmaW5lIExBUEFDS19jZ2J0cnMgTEFQQUNLX0dMT0JBTChjZ2J0cnMsQ0dCVFJTKQorI2RlZmluZSBMQVBBQ0tfemdidHJzIExBUEFDS19HTE9CQUwoemdidHJzLFpHQlRSUykKKyNkZWZpbmUgTEFQQUNLX3NndHRycyBMQVBBQ0tfR0xPQkFMKHNndHRycyxTR1RUUlMpCisjZGVmaW5lIExBUEFDS19kZ3R0cnMgTEFQQUNLX0dMT0JBTChkZ3R0cnMsREdUVFJTKQorI2RlZmluZSBMQVBBQ0tfY2d0dHJzIExBUEFDS19HTE9CQUwoY2d0dHJzLENHVFRSUykKKyNkZWZpbmUgTEFQQUNLX3pndHRycyBMQVBBQ0tfR0xPQkFMKHpndHRycyxaR1RUUlMpCisjZGVmaW5lIExBUEFDS19zcG90cnMgTEFQQUNLX0dMT0JBTChzcG90cnMsU1BPVFJTKQorI2RlZmluZSBMQVBBQ0tfZHBvdHJzIExBUEFDS19HTE9CQUwoZHBvdHJzLERQT1RSUykKKyNkZWZpbmUgTEFQQUNLX2Nwb3RycyBMQVBBQ0tfR0xPQkFMKGNwb3RycyxDUE9UUlMpCisjZGVmaW5lIExBUEFDS196cG90cnMgTEFQQUNLX0dMT0JBTCh6cG90cnMsWlBPVFJTKQorI2RlZmluZSBMQVBBQ0tfZHBmdHJzIExBUEFDS19HTE9CQUwoZHBmdHJzLERQRlRSUykKKyNkZWZpbmUgTEFQQUNLX3NwZnRycyBMQVBBQ0tfR0xPQkFMKHNwZnRycyxTUEZUUlMpCisjZGVmaW5lIExBUEFDS196cGZ0cnMgTEFQQUNLX0dMT0JBTCh6cGZ0cnMsWlBGVFJTKQorI2RlZmluZSBMQVBBQ0tfY3BmdHJzIExBUEFDS19HTE9CQUwoY3BmdHJzLENQRlRSUykKKyNkZWZpbmUgTEFQQUNLX3NwcHRycyBMQVBBQ0tfR0xPQkFMKHNwcHRycyxTUFBUUlMpCisjZGVmaW5lIExBUEFDS19kcHB0cnMgTEFQQUNLX0dMT0JBTChkcHB0cnMsRFBQVFJTKQorI2RlZmluZSBMQVBBQ0tfY3BwdHJzIExBUEFDS19HTE9CQUwoY3BwdHJzLENQUFRSUykKKyNkZWZpbmUgTEFQQUNLX3pwcHRycyBMQVBBQ0tfR0xPQkFMKHpwcHRycyxaUFBUUlMpCisjZGVmaW5lIExBUEFDS19zcGJ0cnMgTEFQQUNLX0dMT0JBTChzcGJ0cnMsU1BCVFJTKQorI2RlZmluZSBMQVBBQ0tfZHBidHJzIExBUEFDS19HTE9CQUwoZHBidHJzLERQQlRSUykKKyNkZWZpbmUgTEFQQUNLX2NwYnRycyBMQVBBQ0tfR0xPQkFMKGNwYnRycyxDUEJUUlMpCisjZGVmaW5lIExBUEFDS196cGJ0cnMgTEFQQUNLX0dMT0JBTCh6cGJ0cnMsWlBCVFJTKQorI2RlZmluZSBMQVBBQ0tfc3B0dHJzIExBUEFDS19HTE9CQUwoc3B0dHJzLFNQVFRSUykKKyNkZWZpbmUgTEFQQUNLX2RwdHRycyBMQVBBQ0tfR0xPQkFMKGRwdHRycyxEUFRUUlMpCisjZGVmaW5lIExBUEFDS19jcHR0cnMgTEFQQUNLX0dMT0JBTChjcHR0cnMsQ1BUVFJTKQorI2RlZmluZSBMQVBBQ0tfenB0dHJzIExBUEFDS19HTE9CQUwoenB0dHJzLFpQVFRSUykKKyNkZWZpbmUgTEFQQUNLX3NzeXRycyBMQVBBQ0tfR0xPQkFMKHNzeXRycyxTU1lUUlMpCisjZGVmaW5lIExBUEFDS19kc3l0cnMgTEFQQUNLX0dMT0JBTChkc3l0cnMsRFNZVFJTKQorI2RlZmluZSBMQVBBQ0tfY3N5dHJzIExBUEFDS19HTE9CQUwoY3N5dHJzLENTWVRSUykKKyNkZWZpbmUgTEFQQUNLX3pzeXRycyBMQVBBQ0tfR0xPQkFMKHpzeXRycyxaU1lUUlMpCisjZGVmaW5lIExBUEFDS19jaGV0cnMgTEFQQUNLX0dMT0JBTChjaGV0cnMsQ0hFVFJTKQorI2RlZmluZSBMQVBBQ0tfemhldHJzIExBUEFDS19HTE9CQUwoemhldHJzLFpIRVRSUykKKyNkZWZpbmUgTEFQQUNLX3NzcHRycyBMQVBBQ0tfR0xPQkFMKHNzcHRycyxTU1BUUlMpCisjZGVmaW5lIExBUEFDS19kc3B0cnMgTEFQQUNLX0dMT0JBTChkc3B0cnMsRFNQVFJTKQorI2RlZmluZSBMQVBBQ0tfY3NwdHJzIExBUEFDS19HTE9CQUwoY3NwdHJzLENTUFRSUykKKyNkZWZpbmUgTEFQQUNLX3pzcHRycyBMQVBBQ0tfR0xPQkFMKHpzcHRycyxaU1BUUlMpCisjZGVmaW5lIExBUEFDS19jaHB0cnMgTEFQQUNLX0dMT0JBTChjaHB0cnMsQ0hQVFJTKQorI2RlZmluZSBMQVBBQ0tfemhwdHJzIExBUEFDS19HTE9CQUwoemhwdHJzLFpIUFRSUykKKyNkZWZpbmUgTEFQQUNLX3N0cnRycyBMQVBBQ0tfR0xPQkFMKHN0cnRycyxTVFJUUlMpCisjZGVmaW5lIExBUEFDS19kdHJ0cnMgTEFQQUNLX0dMT0JBTChkdHJ0cnMsRFRSVFJTKQorI2RlZmluZSBMQVBBQ0tfY3RydHJzIExBUEFDS19HTE9CQUwoY3RydHJzLENUUlRSUykKKyNkZWZpbmUgTEFQQUNLX3p0cnRycyBMQVBBQ0tfR0xPQkFMKHp0cnRycyxaVFJUUlMpCisjZGVmaW5lIExBUEFDS19zdHB0cnMgTEFQQUNLX0dMT0JBTChzdHB0cnMsU1RQVFJTKQorI2RlZmluZSBMQVBBQ0tfZHRwdHJzIExBUEFDS19HTE9CQUwoZHRwdHJzLERUUFRSUykKKyNkZWZpbmUgTEFQQUNLX2N0cHRycyBMQVBBQ0tfR0xPQkFMKGN0cHRycyxDVFBUUlMpCisjZGVmaW5lIExBUEFDS196dHB0cnMgTEFQQUNLX0dMT0JBTCh6dHB0cnMsWlRQVFJTKQorI2RlZmluZSBMQVBBQ0tfc3RidHJzIExBUEFDS19HTE9CQUwoc3RidHJzLFNUQlRSUykKKyNkZWZpbmUgTEFQQUNLX2R0YnRycyBMQVBBQ0tfR0xPQkFMKGR0YnRycyxEVEJUUlMpCisjZGVmaW5lIExBUEFDS19jdGJ0cnMgTEFQQUNLX0dMT0JBTChjdGJ0cnMsQ1RCVFJTKQorI2RlZmluZSBMQVBBQ0tfenRidHJzIExBUEFDS19HTE9CQUwoenRidHJzLFpUQlRSUykKKyNkZWZpbmUgTEFQQUNLX3NnZWNvbiBMQVBBQ0tfR0xPQkFMKHNnZWNvbixTR0VDT04pCisjZGVmaW5lIExBUEFDS19kZ2Vjb24gTEFQQUNLX0dMT0JBTChkZ2Vjb24sREdFQ09OKQorI2RlZmluZSBMQVBBQ0tfY2dlY29uIExBUEFDS19HTE9CQUwoY2dlY29uLENHRUNPTikKKyNkZWZpbmUgTEFQQUNLX3pnZWNvbiBMQVBBQ0tfR0xPQkFMKHpnZWNvbixaR0VDT04pCisjZGVmaW5lIExBUEFDS19zZ2Jjb24gTEFQQUNLX0dMT0JBTChzZ2Jjb24sU0dCQ09OKQorI2RlZmluZSBMQVBBQ0tfZGdiY29uIExBUEFDS19HTE9CQUwoZGdiY29uLERHQkNPTikKKyNkZWZpbmUgTEFQQUNLX2NnYmNvbiBMQVBBQ0tfR0xPQkFMKGNnYmNvbixDR0JDT04pCisjZGVmaW5lIExBUEFDS196Z2Jjb24gTEFQQUNLX0dMT0JBTCh6Z2Jjb24sWkdCQ09OKQorI2RlZmluZSBMQVBBQ0tfc2d0Y29uIExBUEFDS19HTE9CQUwoc2d0Y29uLFNHVENPTikKKyNkZWZpbmUgTEFQQUNLX2RndGNvbiBMQVBBQ0tfR0xPQkFMKGRndGNvbixER1RDT04pCisjZGVmaW5lIExBUEFDS19jZ3Rjb24gTEFQQUNLX0dMT0JBTChjZ3Rjb24sQ0dUQ09OKQorI2RlZmluZSBMQVBBQ0tfemd0Y29uIExBUEFDS19HTE9CQUwoemd0Y29uLFpHVENPTikKKyNkZWZpbmUgTEFQQUNLX3Nwb2NvbiBMQVBBQ0tfR0xPQkFMKHNwb2NvbixTUE9DT04pCisjZGVmaW5lIExBUEFDS19kcG9jb24gTEFQQUNLX0dMT0JBTChkcG9jb24sRFBPQ09OKQorI2RlZmluZSBMQVBBQ0tfY3BvY29uIExBUEFDS19HTE9CQUwoY3BvY29uLENQT0NPTikKKyNkZWZpbmUgTEFQQUNLX3pwb2NvbiBMQVBBQ0tfR0xPQkFMKHpwb2NvbixaUE9DT04pCisjZGVmaW5lIExBUEFDS19zcHBjb24gTEFQQUNLX0dMT0JBTChzcHBjb24sU1BQQ09OKQorI2RlZmluZSBMQVBBQ0tfZHBwY29uIExBUEFDS19HTE9CQUwoZHBwY29uLERQUENPTikKKyNkZWZpbmUgTEFQQUNLX2NwcGNvbiBMQVBBQ0tfR0xPQkFMKGNwcGNvbixDUFBDT04pCisjZGVmaW5lIExBUEFDS196cHBjb24gTEFQQUNLX0dMT0JBTCh6cHBjb24sWlBQQ09OKQorI2RlZmluZSBMQVBBQ0tfc3BiY29uIExBUEFDS19HTE9CQUwoc3BiY29uLFNQQkNPTikKKyNkZWZpbmUgTEFQQUNLX2RwYmNvbiBMQVBBQ0tfR0xPQkFMKGRwYmNvbixEUEJDT04pCisjZGVmaW5lIExBUEFDS19jcGJjb24gTEFQQUNLX0dMT0JBTChjcGJjb24sQ1BCQ09OKQorI2RlZmluZSBMQVBBQ0tfenBiY29uIExBUEFDS19HTE9CQUwoenBiY29uLFpQQkNPTikKKyNkZWZpbmUgTEFQQUNLX3NwdGNvbiBMQVBBQ0tfR0xPQkFMKHNwdGNvbixTUFRDT04pCisjZGVmaW5lIExBUEFDS19kcHRjb24gTEFQQUNLX0dMT0JBTChkcHRjb24sRFBUQ09OKQorI2RlZmluZSBMQVBBQ0tfY3B0Y29uIExBUEFDS19HTE9CQUwoY3B0Y29uLENQVENPTikKKyNkZWZpbmUgTEFQQUNLX3pwdGNvbiBMQVBBQ0tfR0xPQkFMKHpwdGNvbixaUFRDT04pCisjZGVmaW5lIExBUEFDS19zc3ljb24gTEFQQUNLX0dMT0JBTChzc3ljb24sU1NZQ09OKQorI2RlZmluZSBMQVBBQ0tfZHN5Y29uIExBUEFDS19HTE9CQUwoZHN5Y29uLERTWUNPTikKKyNkZWZpbmUgTEFQQUNLX2NzeWNvbiBMQVBBQ0tfR0xPQkFMKGNzeWNvbixDU1lDT04pCisjZGVmaW5lIExBUEFDS196c3ljb24gTEFQQUNLX0dMT0JBTCh6c3ljb24sWlNZQ09OKQorI2RlZmluZSBMQVBBQ0tfY2hlY29uIExBUEFDS19HTE9CQUwoY2hlY29uLENIRUNPTikKKyNkZWZpbmUgTEFQQUNLX3poZWNvbiBMQVBBQ0tfR0xPQkFMKHpoZWNvbixaSEVDT04pCisjZGVmaW5lIExBUEFDS19zc3Bjb24gTEFQQUNLX0dMT0JBTChzc3Bjb24sU1NQQ09OKQorI2RlZmluZSBMQVBBQ0tfZHNwY29uIExBUEFDS19HTE9CQUwoZHNwY29uLERTUENPTikKKyNkZWZpbmUgTEFQQUNLX2NzcGNvbiBMQVBBQ0tfR0xPQkFMKGNzcGNvbixDU1BDT04pCisjZGVmaW5lIExBUEFDS196c3Bjb24gTEFQQUNLX0dMT0JBTCh6c3Bjb24sWlNQQ09OKQorI2RlZmluZSBMQVBBQ0tfY2hwY29uIExBUEFDS19HTE9CQUwoY2hwY29uLENIUENPTikKKyNkZWZpbmUgTEFQQUNLX3pocGNvbiBMQVBBQ0tfR0xPQkFMKHpocGNvbixaSFBDT04pCisjZGVmaW5lIExBUEFDS19zdHJjb24gTEFQQUNLX0dMT0JBTChzdHJjb24sU1RSQ09OKQorI2RlZmluZSBMQVBBQ0tfZHRyY29uIExBUEFDS19HTE9CQUwoZHRyY29uLERUUkNPTikKKyNkZWZpbmUgTEFQQUNLX2N0cmNvbiBMQVBBQ0tfR0xPQkFMKGN0cmNvbixDVFJDT04pCisjZGVmaW5lIExBUEFDS196dHJjb24gTEFQQUNLX0dMT0JBTCh6dHJjb24sWlRSQ09OKQorI2RlZmluZSBMQVBBQ0tfc3RwY29uIExBUEFDS19HTE9CQUwoc3RwY29uLFNUUENPTikKKyNkZWZpbmUgTEFQQUNLX2R0cGNvbiBMQVBBQ0tfR0xPQkFMKGR0cGNvbixEVFBDT04pCisjZGVmaW5lIExBUEFDS19jdHBjb24gTEFQQUNLX0dMT0JBTChjdHBjb24sQ1RQQ09OKQorI2RlZmluZSBMQVBBQ0tfenRwY29uIExBUEFDS19HTE9CQUwoenRwY29uLFpUUENPTikKKyNkZWZpbmUgTEFQQUNLX3N0YmNvbiBMQVBBQ0tfR0xPQkFMKHN0YmNvbixTVEJDT04pCisjZGVmaW5lIExBUEFDS19kdGJjb24gTEFQQUNLX0dMT0JBTChkdGJjb24sRFRCQ09OKQorI2RlZmluZSBMQVBBQ0tfY3RiY29uIExBUEFDS19HTE9CQUwoY3RiY29uLENUQkNPTikKKyNkZWZpbmUgTEFQQUNLX3p0YmNvbiBMQVBBQ0tfR0xPQkFMKHp0YmNvbixaVEJDT04pCisjZGVmaW5lIExBUEFDS19zZ2VyZnMgTEFQQUNLX0dMT0JBTChzZ2VyZnMsU0dFUkZTKQorI2RlZmluZSBMQVBBQ0tfZGdlcmZzIExBUEFDS19HTE9CQUwoZGdlcmZzLERHRVJGUykKKyNkZWZpbmUgTEFQQUNLX2NnZXJmcyBMQVBBQ0tfR0xPQkFMKGNnZXJmcyxDR0VSRlMpCisjZGVmaW5lIExBUEFDS196Z2VyZnMgTEFQQUNLX0dMT0JBTCh6Z2VyZnMsWkdFUkZTKQorI2RlZmluZSBMQVBBQ0tfZGdlcmZzeCBMQVBBQ0tfR0xPQkFMKGRnZXJmc3gsREdFUkZTWCkKKyNkZWZpbmUgTEFQQUNLX3NnZXJmc3ggTEFQQUNLX0dMT0JBTChzZ2VyZnN4LFNHRVJGU1gpCisjZGVmaW5lIExBUEFDS196Z2VyZnN4IExBUEFDS19HTE9CQUwoemdlcmZzeCxaR0VSRlNYKQorI2RlZmluZSBMQVBBQ0tfY2dlcmZzeCBMQVBBQ0tfR0xPQkFMKGNnZXJmc3gsQ0dFUkZTWCkKKyNkZWZpbmUgTEFQQUNLX3NnYnJmcyBMQVBBQ0tfR0xPQkFMKHNnYnJmcyxTR0JSRlMpCisjZGVmaW5lIExBUEFDS19kZ2JyZnMgTEFQQUNLX0dMT0JBTChkZ2JyZnMsREdCUkZTKQorI2RlZmluZSBMQVBBQ0tfY2dicmZzIExBUEFDS19HTE9CQUwoY2dicmZzLENHQlJGUykKKyNkZWZpbmUgTEFQQUNLX3pnYnJmcyBMQVBBQ0tfR0xPQkFMKHpnYnJmcyxaR0JSRlMpCisjZGVmaW5lIExBUEFDS19kZ2JyZnN4IExBUEFDS19HTE9CQUwoZGdicmZzeCxER0JSRlNYKQorI2RlZmluZSBMQVBBQ0tfc2dicmZzeCBMQVBBQ0tfR0xPQkFMKHNnYnJmc3gsU0dCUkZTWCkKKyNkZWZpbmUgTEFQQUNLX3pnYnJmc3ggTEFQQUNLX0dMT0JBTCh6Z2JyZnN4LFpHQlJGU1gpCisjZGVmaW5lIExBUEFDS19jZ2JyZnN4IExBUEFDS19HTE9CQUwoY2dicmZzeCxDR0JSRlNYKQorI2RlZmluZSBMQVBBQ0tfc2d0cmZzIExBUEFDS19HTE9CQUwoc2d0cmZzLFNHVFJGUykKKyNkZWZpbmUgTEFQQUNLX2RndHJmcyBMQVBBQ0tfR0xPQkFMKGRndHJmcyxER1RSRlMpCisjZGVmaW5lIExBUEFDS19jZ3RyZnMgTEFQQUNLX0dMT0JBTChjZ3RyZnMsQ0dUUkZTKQorI2RlZmluZSBMQVBBQ0tfemd0cmZzIExBUEFDS19HTE9CQUwoemd0cmZzLFpHVFJGUykKKyNkZWZpbmUgTEFQQUNLX3Nwb3JmcyBMQVBBQ0tfR0xPQkFMKHNwb3JmcyxTUE9SRlMpCisjZGVmaW5lIExBUEFDS19kcG9yZnMgTEFQQUNLX0dMT0JBTChkcG9yZnMsRFBPUkZTKQorI2RlZmluZSBMQVBBQ0tfY3BvcmZzIExBUEFDS19HTE9CQUwoY3BvcmZzLENQT1JGUykKKyNkZWZpbmUgTEFQQUNLX3pwb3JmcyBMQVBBQ0tfR0xPQkFMKHpwb3JmcyxaUE9SRlMpCisjZGVmaW5lIExBUEFDS19kcG9yZnN4IExBUEFDS19HTE9CQUwoZHBvcmZzeCxEUE9SRlNYKQorI2RlZmluZSBMQVBBQ0tfc3BvcmZzeCBMQVBBQ0tfR0xPQkFMKHNwb3Jmc3gsU1BPUkZTWCkKKyNkZWZpbmUgTEFQQUNLX3pwb3Jmc3ggTEFQQUNLX0dMT0JBTCh6cG9yZnN4LFpQT1JGU1gpCisjZGVmaW5lIExBUEFDS19jcG9yZnN4IExBUEFDS19HTE9CQUwoY3BvcmZzeCxDUE9SRlNYKQorI2RlZmluZSBMQVBBQ0tfc3BwcmZzIExBUEFDS19HTE9CQUwoc3BwcmZzLFNQUFJGUykKKyNkZWZpbmUgTEFQQUNLX2RwcHJmcyBMQVBBQ0tfR0xPQkFMKGRwcHJmcyxEUFBSRlMpCisjZGVmaW5lIExBUEFDS19jcHByZnMgTEFQQUNLX0dMT0JBTChjcHByZnMsQ1BQUkZTKQorI2RlZmluZSBMQVBBQ0tfenBwcmZzIExBUEFDS19HTE9CQUwoenBwcmZzLFpQUFJGUykKKyNkZWZpbmUgTEFQQUNLX3NwYnJmcyBMQVBBQ0tfR0xPQkFMKHNwYnJmcyxTUEJSRlMpCisjZGVmaW5lIExBUEFDS19kcGJyZnMgTEFQQUNLX0dMT0JBTChkcGJyZnMsRFBCUkZTKQorI2RlZmluZSBMQVBBQ0tfY3BicmZzIExBUEFDS19HTE9CQUwoY3BicmZzLENQQlJGUykKKyNkZWZpbmUgTEFQQUNLX3pwYnJmcyBMQVBBQ0tfR0xPQkFMKHpwYnJmcyxaUEJSRlMpCisjZGVmaW5lIExBUEFDS19zcHRyZnMgTEFQQUNLX0dMT0JBTChzcHRyZnMsU1BUUkZTKQorI2RlZmluZSBMQVBBQ0tfZHB0cmZzIExBUEFDS19HTE9CQUwoZHB0cmZzLERQVFJGUykKKyNkZWZpbmUgTEFQQUNLX2NwdHJmcyBMQVBBQ0tfR0xPQkFMKGNwdHJmcyxDUFRSRlMpCisjZGVmaW5lIExBUEFDS196cHRyZnMgTEFQQUNLX0dMT0JBTCh6cHRyZnMsWlBUUkZTKQorI2RlZmluZSBMQVBBQ0tfc3N5cmZzIExBUEFDS19HTE9CQUwoc3N5cmZzLFNTWVJGUykKKyNkZWZpbmUgTEFQQUNLX2RzeXJmcyBMQVBBQ0tfR0xPQkFMKGRzeXJmcyxEU1lSRlMpCisjZGVmaW5lIExBUEFDS19jc3lyZnMgTEFQQUNLX0dMT0JBTChjc3lyZnMsQ1NZUkZTKQorI2RlZmluZSBMQVBBQ0tfenN5cmZzIExBUEFDS19HTE9CQUwoenN5cmZzLFpTWVJGUykKKyNkZWZpbmUgTEFQQUNLX2RzeXJmc3ggTEFQQUNLX0dMT0JBTChkc3lyZnN4LERTWVJGU1gpCisjZGVmaW5lIExBUEFDS19zc3lyZnN4IExBUEFDS19HTE9CQUwoc3N5cmZzeCxTU1lSRlNYKQorI2RlZmluZSBMQVBBQ0tfenN5cmZzeCBMQVBBQ0tfR0xPQkFMKHpzeXJmc3gsWlNZUkZTWCkKKyNkZWZpbmUgTEFQQUNLX2NzeXJmc3ggTEFQQUNLX0dMT0JBTChjc3lyZnN4LENTWVJGU1gpCisjZGVmaW5lIExBUEFDS19jaGVyZnMgTEFQQUNLX0dMT0JBTChjaGVyZnMsQ0hFUkZTKQorI2RlZmluZSBMQVBBQ0tfemhlcmZzIExBUEFDS19HTE9CQUwoemhlcmZzLFpIRVJGUykKKyNkZWZpbmUgTEFQQUNLX3poZXJmc3ggTEFQQUNLX0dMT0JBTCh6aGVyZnN4LFpIRVJGU1gpCisjZGVmaW5lIExBUEFDS19jaGVyZnN4IExBUEFDS19HTE9CQUwoY2hlcmZzeCxDSEVSRlNYKQorI2RlZmluZSBMQVBBQ0tfc3NwcmZzIExBUEFDS19HTE9CQUwoc3NwcmZzLFNTUFJGUykKKyNkZWZpbmUgTEFQQUNLX2RzcHJmcyBMQVBBQ0tfR0xPQkFMKGRzcHJmcyxEU1BSRlMpCisjZGVmaW5lIExBUEFDS19jc3ByZnMgTEFQQUNLX0dMT0JBTChjc3ByZnMsQ1NQUkZTKQorI2RlZmluZSBMQVBBQ0tfenNwcmZzIExBUEFDS19HTE9CQUwoenNwcmZzLFpTUFJGUykKKyNkZWZpbmUgTEFQQUNLX2NocHJmcyBMQVBBQ0tfR0xPQkFMKGNocHJmcyxDSFBSRlMpCisjZGVmaW5lIExBUEFDS196aHByZnMgTEFQQUNLX0dMT0JBTCh6aHByZnMsWkhQUkZTKQorI2RlZmluZSBMQVBBQ0tfc3RycmZzIExBUEFDS19HTE9CQUwoc3RycmZzLFNUUlJGUykKKyNkZWZpbmUgTEFQQUNLX2R0cnJmcyBMQVBBQ0tfR0xPQkFMKGR0cnJmcyxEVFJSRlMpCisjZGVmaW5lIExBUEFDS19jdHJyZnMgTEFQQUNLX0dMT0JBTChjdHJyZnMsQ1RSUkZTKQorI2RlZmluZSBMQVBBQ0tfenRycmZzIExBUEFDS19HTE9CQUwoenRycmZzLFpUUlJGUykKKyNkZWZpbmUgTEFQQUNLX3N0cHJmcyBMQVBBQ0tfR0xPQkFMKHN0cHJmcyxTVFBSRlMpCisjZGVmaW5lIExBUEFDS19kdHByZnMgTEFQQUNLX0dMT0JBTChkdHByZnMsRFRQUkZTKQorI2RlZmluZSBMQVBBQ0tfY3RwcmZzIExBUEFDS19HTE9CQUwoY3RwcmZzLENUUFJGUykKKyNkZWZpbmUgTEFQQUNLX3p0cHJmcyBMQVBBQ0tfR0xPQkFMKHp0cHJmcyxaVFBSRlMpCisjZGVmaW5lIExBUEFDS19zdGJyZnMgTEFQQUNLX0dMT0JBTChzdGJyZnMsU1RCUkZTKQorI2RlZmluZSBMQVBBQ0tfZHRicmZzIExBUEFDS19HTE9CQUwoZHRicmZzLERUQlJGUykKKyNkZWZpbmUgTEFQQUNLX2N0YnJmcyBMQVBBQ0tfR0xPQkFMKGN0YnJmcyxDVEJSRlMpCisjZGVmaW5lIExBUEFDS196dGJyZnMgTEFQQUNLX0dMT0JBTCh6dGJyZnMsWlRCUkZTKQorI2RlZmluZSBMQVBBQ0tfc2dldHJpIExBUEFDS19HTE9CQUwoc2dldHJpLFNHRVRSSSkKKyNkZWZpbmUgTEFQQUNLX2RnZXRyaSBMQVBBQ0tfR0xPQkFMKGRnZXRyaSxER0VUUkkpCisjZGVmaW5lIExBUEFDS19jZ2V0cmkgTEFQQUNLX0dMT0JBTChjZ2V0cmksQ0dFVFJJKQorI2RlZmluZSBMQVBBQ0tfemdldHJpIExBUEFDS19HTE9CQUwoemdldHJpLFpHRVRSSSkKKyNkZWZpbmUgTEFQQUNLX3Nwb3RyaSBMQVBBQ0tfR0xPQkFMKHNwb3RyaSxTUE9UUkkpCisjZGVmaW5lIExBUEFDS19kcG90cmkgTEFQQUNLX0dMT0JBTChkcG90cmksRFBPVFJJKQorI2RlZmluZSBMQVBBQ0tfY3BvdHJpIExBUEFDS19HTE9CQUwoY3BvdHJpLENQT1RSSSkKKyNkZWZpbmUgTEFQQUNLX3pwb3RyaSBMQVBBQ0tfR0xPQkFMKHpwb3RyaSxaUE9UUkkpCisjZGVmaW5lIExBUEFDS19kcGZ0cmkgTEFQQUNLX0dMT0JBTChkcGZ0cmksRFBGVFJJKQorI2RlZmluZSBMQVBBQ0tfc3BmdHJpIExBUEFDS19HTE9CQUwoc3BmdHJpLFNQRlRSSSkKKyNkZWZpbmUgTEFQQUNLX3pwZnRyaSBMQVBBQ0tfR0xPQkFMKHpwZnRyaSxaUEZUUkkpCisjZGVmaW5lIExBUEFDS19jcGZ0cmkgTEFQQUNLX0dMT0JBTChjcGZ0cmksQ1BGVFJJKQorI2RlZmluZSBMQVBBQ0tfc3BwdHJpIExBUEFDS19HTE9CQUwoc3BwdHJpLFNQUFRSSSkKKyNkZWZpbmUgTEFQQUNLX2RwcHRyaSBMQVBBQ0tfR0xPQkFMKGRwcHRyaSxEUFBUUkkpCisjZGVmaW5lIExBUEFDS19jcHB0cmkgTEFQQUNLX0dMT0JBTChjcHB0cmksQ1BQVFJJKQorI2RlZmluZSBMQVBBQ0tfenBwdHJpIExBUEFDS19HTE9CQUwoenBwdHJpLFpQUFRSSSkKKyNkZWZpbmUgTEFQQUNLX3NzeXRyaSBMQVBBQ0tfR0xPQkFMKHNzeXRyaSxTU1lUUkkpCisjZGVmaW5lIExBUEFDS19kc3l0cmkgTEFQQUNLX0dMT0JBTChkc3l0cmksRFNZVFJJKQorI2RlZmluZSBMQVBBQ0tfY3N5dHJpIExBUEFDS19HTE9CQUwoY3N5dHJpLENTWVRSSSkKKyNkZWZpbmUgTEFQQUNLX3pzeXRyaSBMQVBBQ0tfR0xPQkFMKHpzeXRyaSxaU1lUUkkpCisjZGVmaW5lIExBUEFDS19jaGV0cmkgTEFQQUNLX0dMT0JBTChjaGV0cmksQ0hFVFJJKQorI2RlZmluZSBMQVBBQ0tfemhldHJpIExBUEFDS19HTE9CQUwoemhldHJpLFpIRVRSSSkKKyNkZWZpbmUgTEFQQUNLX3NzcHRyaSBMQVBBQ0tfR0xPQkFMKHNzcHRyaSxTU1BUUkkpCisjZGVmaW5lIExBUEFDS19kc3B0cmkgTEFQQUNLX0dMT0JBTChkc3B0cmksRFNQVFJJKQorI2RlZmluZSBMQVBBQ0tfY3NwdHJpIExBUEFDS19HTE9CQUwoY3NwdHJpLENTUFRSSSkKKyNkZWZpbmUgTEFQQUNLX3pzcHRyaSBMQVBBQ0tfR0xPQkFMKHpzcHRyaSxaU1BUUkkpCisjZGVmaW5lIExBUEFDS19jaHB0cmkgTEFQQUNLX0dMT0JBTChjaHB0cmksQ0hQVFJJKQorI2RlZmluZSBMQVBBQ0tfemhwdHJpIExBUEFDS19HTE9CQUwoemhwdHJpLFpIUFRSSSkKKyNkZWZpbmUgTEFQQUNLX3N0cnRyaSBMQVBBQ0tfR0xPQkFMKHN0cnRyaSxTVFJUUkkpCisjZGVmaW5lIExBUEFDS19kdHJ0cmkgTEFQQUNLX0dMT0JBTChkdHJ0cmksRFRSVFJJKQorI2RlZmluZSBMQVBBQ0tfY3RydHJpIExBUEFDS19HTE9CQUwoY3RydHJpLENUUlRSSSkKKyNkZWZpbmUgTEFQQUNLX3p0cnRyaSBMQVBBQ0tfR0xPQkFMKHp0cnRyaSxaVFJUUkkpCisjZGVmaW5lIExBUEFDS19kdGZ0cmkgTEFQQUNLX0dMT0JBTChkdGZ0cmksRFRGVFJJKQorI2RlZmluZSBMQVBBQ0tfc3RmdHJpIExBUEFDS19HTE9CQUwoc3RmdHJpLFNURlRSSSkKKyNkZWZpbmUgTEFQQUNLX3p0ZnRyaSBMQVBBQ0tfR0xPQkFMKHp0ZnRyaSxaVEZUUkkpCisjZGVmaW5lIExBUEFDS19jdGZ0cmkgTEFQQUNLX0dMT0JBTChjdGZ0cmksQ1RGVFJJKQorI2RlZmluZSBMQVBBQ0tfc3RwdHJpIExBUEFDS19HTE9CQUwoc3RwdHJpLFNUUFRSSSkKKyNkZWZpbmUgTEFQQUNLX2R0cHRyaSBMQVBBQ0tfR0xPQkFMKGR0cHRyaSxEVFBUUkkpCisjZGVmaW5lIExBUEFDS19jdHB0cmkgTEFQQUNLX0dMT0JBTChjdHB0cmksQ1RQVFJJKQorI2RlZmluZSBMQVBBQ0tfenRwdHJpIExBUEFDS19HTE9CQUwoenRwdHJpLFpUUFRSSSkKKyNkZWZpbmUgTEFQQUNLX3NnZWVxdSBMQVBBQ0tfR0xPQkFMKHNnZWVxdSxTR0VFUVUpCisjZGVmaW5lIExBUEFDS19kZ2VlcXUgTEFQQUNLX0dMT0JBTChkZ2VlcXUsREdFRVFVKQorI2RlZmluZSBMQVBBQ0tfY2dlZXF1IExBUEFDS19HTE9CQUwoY2dlZXF1LENHRUVRVSkKKyNkZWZpbmUgTEFQQUNLX3pnZWVxdSBMQVBBQ0tfR0xPQkFMKHpnZWVxdSxaR0VFUVUpCisjZGVmaW5lIExBUEFDS19kZ2VlcXViIExBUEFDS19HTE9CQUwoZGdlZXF1YixER0VFUVVCKQorI2RlZmluZSBMQVBBQ0tfc2dlZXF1YiBMQVBBQ0tfR0xPQkFMKHNnZWVxdWIsU0dFRVFVQikKKyNkZWZpbmUgTEFQQUNLX3pnZWVxdWIgTEFQQUNLX0dMT0JBTCh6Z2VlcXViLFpHRUVRVUIpCisjZGVmaW5lIExBUEFDS19jZ2VlcXViIExBUEFDS19HTE9CQUwoY2dlZXF1YixDR0VFUVVCKQorI2RlZmluZSBMQVBBQ0tfc2diZXF1IExBUEFDS19HTE9CQUwoc2diZXF1LFNHQkVRVSkKKyNkZWZpbmUgTEFQQUNLX2RnYmVxdSBMQVBBQ0tfR0xPQkFMKGRnYmVxdSxER0JFUVUpCisjZGVmaW5lIExBUEFDS19jZ2JlcXUgTEFQQUNLX0dMT0JBTChjZ2JlcXUsQ0dCRVFVKQorI2RlZmluZSBMQVBBQ0tfemdiZXF1IExBUEFDS19HTE9CQUwoemdiZXF1LFpHQkVRVSkKKyNkZWZpbmUgTEFQQUNLX2RnYmVxdWIgTEFQQUNLX0dMT0JBTChkZ2JlcXViLERHQkVRVUIpCisjZGVmaW5lIExBUEFDS19zZ2JlcXViIExBUEFDS19HTE9CQUwoc2diZXF1YixTR0JFUVVCKQorI2RlZmluZSBMQVBBQ0tfemdiZXF1YiBMQVBBQ0tfR0xPQkFMKHpnYmVxdWIsWkdCRVFVQikKKyNkZWZpbmUgTEFQQUNLX2NnYmVxdWIgTEFQQUNLX0dMT0JBTChjZ2JlcXViLENHQkVRVUIpCisjZGVmaW5lIExBUEFDS19zcG9lcXUgTEFQQUNLX0dMT0JBTChzcG9lcXUsU1BPRVFVKQorI2RlZmluZSBMQVBBQ0tfZHBvZXF1IExBUEFDS19HTE9CQUwoZHBvZXF1LERQT0VRVSkKKyNkZWZpbmUgTEFQQUNLX2Nwb2VxdSBMQVBBQ0tfR0xPQkFMKGNwb2VxdSxDUE9FUVUpCisjZGVmaW5lIExBUEFDS196cG9lcXUgTEFQQUNLX0dMT0JBTCh6cG9lcXUsWlBPRVFVKQorI2RlZmluZSBMQVBBQ0tfZHBvZXF1YiBMQVBBQ0tfR0xPQkFMKGRwb2VxdWIsRFBPRVFVQikKKyNkZWZpbmUgTEFQQUNLX3Nwb2VxdWIgTEFQQUNLX0dMT0JBTChzcG9lcXViLFNQT0VRVUIpCisjZGVmaW5lIExBUEFDS196cG9lcXViIExBUEFDS19HTE9CQUwoenBvZXF1YixaUE9FUVVCKQorI2RlZmluZSBMQVBBQ0tfY3BvZXF1YiBMQVBBQ0tfR0xPQkFMKGNwb2VxdWIsQ1BPRVFVQikKKyNkZWZpbmUgTEFQQUNLX3NwcGVxdSBMQVBBQ0tfR0xPQkFMKHNwcGVxdSxTUFBFUVUpCisjZGVmaW5lIExBUEFDS19kcHBlcXUgTEFQQUNLX0dMT0JBTChkcHBlcXUsRFBQRVFVKQorI2RlZmluZSBMQVBBQ0tfY3BwZXF1IExBUEFDS19HTE9CQUwoY3BwZXF1LENQUEVRVSkKKyNkZWZpbmUgTEFQQUNLX3pwcGVxdSBMQVBBQ0tfR0xPQkFMKHpwcGVxdSxaUFBFUVUpCisjZGVmaW5lIExBUEFDS19zcGJlcXUgTEFQQUNLX0dMT0JBTChzcGJlcXUsU1BCRVFVKQorI2RlZmluZSBMQVBBQ0tfZHBiZXF1IExBUEFDS19HTE9CQUwoZHBiZXF1LERQQkVRVSkKKyNkZWZpbmUgTEFQQUNLX2NwYmVxdSBMQVBBQ0tfR0xPQkFMKGNwYmVxdSxDUEJFUVUpCisjZGVmaW5lIExBUEFDS196cGJlcXUgTEFQQUNLX0dMT0JBTCh6cGJlcXUsWlBCRVFVKQorI2RlZmluZSBMQVBBQ0tfZHN5ZXF1YiBMQVBBQ0tfR0xPQkFMKGRzeWVxdWIsRFNZRVFVQikKKyNkZWZpbmUgTEFQQUNLX3NzeWVxdWIgTEFQQUNLX0dMT0JBTChzc3llcXViLFNTWUVRVUIpCisjZGVmaW5lIExBUEFDS196c3llcXViIExBUEFDS19HTE9CQUwoenN5ZXF1YixaU1lFUVVCKQorI2RlZmluZSBMQVBBQ0tfY3N5ZXF1YiBMQVBBQ0tfR0xPQkFMKGNzeWVxdWIsQ1NZRVFVQikKKyNkZWZpbmUgTEFQQUNLX3poZWVxdWIgTEFQQUNLX0dMT0JBTCh6aGVlcXViLFpIRUVRVUIpCisjZGVmaW5lIExBUEFDS19jaGVlcXViIExBUEFDS19HTE9CQUwoY2hlZXF1YixDSEVFUVVCKQorI2RlZmluZSBMQVBBQ0tfc2dlc3YgTEFQQUNLX0dMT0JBTChzZ2VzdixTR0VTVikKKyNkZWZpbmUgTEFQQUNLX2RnZXN2IExBUEFDS19HTE9CQUwoZGdlc3YsREdFU1YpCisjZGVmaW5lIExBUEFDS19jZ2VzdiBMQVBBQ0tfR0xPQkFMKGNnZXN2LENHRVNWKQorI2RlZmluZSBMQVBBQ0tfemdlc3YgTEFQQUNLX0dMT0JBTCh6Z2VzdixaR0VTVikKKyNkZWZpbmUgTEFQQUNLX2RzZ2VzdiBMQVBBQ0tfR0xPQkFMKGRzZ2VzdixEU0dFU1YpCisjZGVmaW5lIExBUEFDS196Y2dlc3YgTEFQQUNLX0dMT0JBTCh6Y2dlc3YsWkNHRVNWKQorI2RlZmluZSBMQVBBQ0tfc2dlc3Z4IExBUEFDS19HTE9CQUwoc2dlc3Z4LFNHRVNWWCkKKyNkZWZpbmUgTEFQQUNLX2RnZXN2eCBMQVBBQ0tfR0xPQkFMKGRnZXN2eCxER0VTVlgpCisjZGVmaW5lIExBUEFDS19jZ2VzdnggTEFQQUNLX0dMT0JBTChjZ2VzdngsQ0dFU1ZYKQorI2RlZmluZSBMQVBBQ0tfemdlc3Z4IExBUEFDS19HTE9CQUwoemdlc3Z4LFpHRVNWWCkKKyNkZWZpbmUgTEFQQUNLX2RnZXN2eHggTEFQQUNLX0dMT0JBTChkZ2Vzdnh4LERHRVNWWFgpCisjZGVmaW5lIExBUEFDS19zZ2Vzdnh4IExBUEFDS19HTE9CQUwoc2dlc3Z4eCxTR0VTVlhYKQorI2RlZmluZSBMQVBBQ0tfemdlc3Z4eCBMQVBBQ0tfR0xPQkFMKHpnZXN2eHgsWkdFU1ZYWCkKKyNkZWZpbmUgTEFQQUNLX2NnZXN2eHggTEFQQUNLX0dMT0JBTChjZ2Vzdnh4LENHRVNWWFgpCisjZGVmaW5lIExBUEFDS19zZ2JzdiBMQVBBQ0tfR0xPQkFMKHNnYnN2LFNHQlNWKQorI2RlZmluZSBMQVBBQ0tfZGdic3YgTEFQQUNLX0dMT0JBTChkZ2JzdixER0JTVikKKyNkZWZpbmUgTEFQQUNLX2NnYnN2IExBUEFDS19HTE9CQUwoY2dic3YsQ0dCU1YpCisjZGVmaW5lIExBUEFDS196Z2JzdiBMQVBBQ0tfR0xPQkFMKHpnYnN2LFpHQlNWKQorI2RlZmluZSBMQVBBQ0tfc2dic3Z4IExBUEFDS19HTE9CQUwoc2dic3Z4LFNHQlNWWCkKKyNkZWZpbmUgTEFQQUNLX2RnYnN2eCBMQVBBQ0tfR0xPQkFMKGRnYnN2eCxER0JTVlgpCisjZGVmaW5lIExBUEFDS19jZ2JzdnggTEFQQUNLX0dMT0JBTChjZ2JzdngsQ0dCU1ZYKQorI2RlZmluZSBMQVBBQ0tfemdic3Z4IExBUEFDS19HTE9CQUwoemdic3Z4LFpHQlNWWCkKKyNkZWZpbmUgTEFQQUNLX2RnYnN2eHggTEFQQUNLX0dMT0JBTChkZ2Jzdnh4LERHQlNWWFgpCisjZGVmaW5lIExBUEFDS19zZ2Jzdnh4IExBUEFDS19HTE9CQUwoc2dic3Z4eCxTR0JTVlhYKQorI2RlZmluZSBMQVBBQ0tfemdic3Z4eCBMQVBBQ0tfR0xPQkFMKHpnYnN2eHgsWkdCU1ZYWCkKKyNkZWZpbmUgTEFQQUNLX2NnYnN2eHggTEFQQUNLX0dMT0JBTChjZ2Jzdnh4LENHQlNWWFgpCisjZGVmaW5lIExBUEFDS19zZ3RzdiBMQVBBQ0tfR0xPQkFMKHNndHN2LFNHVFNWKQorI2RlZmluZSBMQVBBQ0tfZGd0c3YgTEFQQUNLX0dMT0JBTChkZ3RzdixER1RTVikKKyNkZWZpbmUgTEFQQUNLX2NndHN2IExBUEFDS19HTE9CQUwoY2d0c3YsQ0dUU1YpCisjZGVmaW5lIExBUEFDS196Z3RzdiBMQVBBQ0tfR0xPQkFMKHpndHN2LFpHVFNWKQorI2RlZmluZSBMQVBBQ0tfc2d0c3Z4IExBUEFDS19HTE9CQUwoc2d0c3Z4LFNHVFNWWCkKKyNkZWZpbmUgTEFQQUNLX2RndHN2eCBMQVBBQ0tfR0xPQkFMKGRndHN2eCxER1RTVlgpCisjZGVmaW5lIExBUEFDS19jZ3RzdnggTEFQQUNLX0dMT0JBTChjZ3RzdngsQ0dUU1ZYKQorI2RlZmluZSBMQVBBQ0tfemd0c3Z4IExBUEFDS19HTE9CQUwoemd0c3Z4LFpHVFNWWCkKKyNkZWZpbmUgTEFQQUNLX3Nwb3N2IExBUEFDS19HTE9CQUwoc3Bvc3YsU1BPU1YpCisjZGVmaW5lIExBUEFDS19kcG9zdiBMQVBBQ0tfR0xPQkFMKGRwb3N2LERQT1NWKQorI2RlZmluZSBMQVBBQ0tfY3Bvc3YgTEFQQUNLX0dMT0JBTChjcG9zdixDUE9TVikKKyNkZWZpbmUgTEFQQUNLX3pwb3N2IExBUEFDS19HTE9CQUwoenBvc3YsWlBPU1YpCisjZGVmaW5lIExBUEFDS19kc3Bvc3YgTEFQQUNLX0dMT0JBTChkc3Bvc3YsRFNQT1NWKQorI2RlZmluZSBMQVBBQ0tfemNwb3N2IExBUEFDS19HTE9CQUwoemNwb3N2LFpDUE9TVikKKyNkZWZpbmUgTEFQQUNLX3Nwb3N2eCBMQVBBQ0tfR0xPQkFMKHNwb3N2eCxTUE9TVlgpCisjZGVmaW5lIExBUEFDS19kcG9zdnggTEFQQUNLX0dMT0JBTChkcG9zdngsRFBPU1ZYKQorI2RlZmluZSBMQVBBQ0tfY3Bvc3Z4IExBUEFDS19HTE9CQUwoY3Bvc3Z4LENQT1NWWCkKKyNkZWZpbmUgTEFQQUNLX3pwb3N2eCBMQVBBQ0tfR0xPQkFMKHpwb3N2eCxaUE9TVlgpCisjZGVmaW5lIExBUEFDS19kcG9zdnh4IExBUEFDS19HTE9CQUwoZHBvc3Z4eCxEUE9TVlhYKQorI2RlZmluZSBMQVBBQ0tfc3Bvc3Z4eCBMQVBBQ0tfR0xPQkFMKHNwb3N2eHgsU1BPU1ZYWCkKKyNkZWZpbmUgTEFQQUNLX3pwb3N2eHggTEFQQUNLX0dMT0JBTCh6cG9zdnh4LFpQT1NWWFgpCisjZGVmaW5lIExBUEFDS19jcG9zdnh4IExBUEFDS19HTE9CQUwoY3Bvc3Z4eCxDUE9TVlhYKQorI2RlZmluZSBMQVBBQ0tfc3Bwc3YgTEFQQUNLX0dMT0JBTChzcHBzdixTUFBTVikKKyNkZWZpbmUgTEFQQUNLX2RwcHN2IExBUEFDS19HTE9CQUwoZHBwc3YsRFBQU1YpCisjZGVmaW5lIExBUEFDS19jcHBzdiBMQVBBQ0tfR0xPQkFMKGNwcHN2LENQUFNWKQorI2RlZmluZSBMQVBBQ0tfenBwc3YgTEFQQUNLX0dMT0JBTCh6cHBzdixaUFBTVikKKyNkZWZpbmUgTEFQQUNLX3NwcHN2eCBMQVBBQ0tfR0xPQkFMKHNwcHN2eCxTUFBTVlgpCisjZGVmaW5lIExBUEFDS19kcHBzdnggTEFQQUNLX0dMT0JBTChkcHBzdngsRFBQU1ZYKQorI2RlZmluZSBMQVBBQ0tfY3Bwc3Z4IExBUEFDS19HTE9CQUwoY3Bwc3Z4LENQUFNWWCkKKyNkZWZpbmUgTEFQQUNLX3pwcHN2eCBMQVBBQ0tfR0xPQkFMKHpwcHN2eCxaUFBTVlgpCisjZGVmaW5lIExBUEFDS19zcGJzdiBMQVBBQ0tfR0xPQkFMKHNwYnN2LFNQQlNWKQorI2RlZmluZSBMQVBBQ0tfZHBic3YgTEFQQUNLX0dMT0JBTChkcGJzdixEUEJTVikKKyNkZWZpbmUgTEFQQUNLX2NwYnN2IExBUEFDS19HTE9CQUwoY3Bic3YsQ1BCU1YpCisjZGVmaW5lIExBUEFDS196cGJzdiBMQVBBQ0tfR0xPQkFMKHpwYnN2LFpQQlNWKQorI2RlZmluZSBMQVBBQ0tfc3Bic3Z4IExBUEFDS19HTE9CQUwoc3Bic3Z4LFNQQlNWWCkKKyNkZWZpbmUgTEFQQUNLX2RwYnN2eCBMQVBBQ0tfR0xPQkFMKGRwYnN2eCxEUEJTVlgpCisjZGVmaW5lIExBUEFDS19jcGJzdnggTEFQQUNLX0dMT0JBTChjcGJzdngsQ1BCU1ZYKQorI2RlZmluZSBMQVBBQ0tfenBic3Z4IExBUEFDS19HTE9CQUwoenBic3Z4LFpQQlNWWCkKKyNkZWZpbmUgTEFQQUNLX3NwdHN2IExBUEFDS19HTE9CQUwoc3B0c3YsU1BUU1YpCisjZGVmaW5lIExBUEFDS19kcHRzdiBMQVBBQ0tfR0xPQkFMKGRwdHN2LERQVFNWKQorI2RlZmluZSBMQVBBQ0tfY3B0c3YgTEFQQUNLX0dMT0JBTChjcHRzdixDUFRTVikKKyNkZWZpbmUgTEFQQUNLX3pwdHN2IExBUEFDS19HTE9CQUwoenB0c3YsWlBUU1YpCisjZGVmaW5lIExBUEFDS19zcHRzdnggTEFQQUNLX0dMT0JBTChzcHRzdngsU1BUU1ZYKQorI2RlZmluZSBMQVBBQ0tfZHB0c3Z4IExBUEFDS19HTE9CQUwoZHB0c3Z4LERQVFNWWCkKKyNkZWZpbmUgTEFQQUNLX2NwdHN2eCBMQVBBQ0tfR0xPQkFMKGNwdHN2eCxDUFRTVlgpCisjZGVmaW5lIExBUEFDS196cHRzdnggTEFQQUNLX0dMT0JBTCh6cHRzdngsWlBUU1ZYKQorI2RlZmluZSBMQVBBQ0tfc3N5c3YgTEFQQUNLX0dMT0JBTChzc3lzdixTU1lTVikKKyNkZWZpbmUgTEFQQUNLX2RzeXN2IExBUEFDS19HTE9CQUwoZHN5c3YsRFNZU1YpCisjZGVmaW5lIExBUEFDS19jc3lzdiBMQVBBQ0tfR0xPQkFMKGNzeXN2LENTWVNWKQorI2RlZmluZSBMQVBBQ0tfenN5c3YgTEFQQUNLX0dMT0JBTCh6c3lzdixaU1lTVikKKyNkZWZpbmUgTEFQQUNLX3NzeXN2eCBMQVBBQ0tfR0xPQkFMKHNzeXN2eCxTU1lTVlgpCisjZGVmaW5lIExBUEFDS19kc3lzdnggTEFQQUNLX0dMT0JBTChkc3lzdngsRFNZU1ZYKQorI2RlZmluZSBMQVBBQ0tfY3N5c3Z4IExBUEFDS19HTE9CQUwoY3N5c3Z4LENTWVNWWCkKKyNkZWZpbmUgTEFQQUNLX3pzeXN2eCBMQVBBQ0tfR0xPQkFMKHpzeXN2eCxaU1lTVlgpCisjZGVmaW5lIExBUEFDS19kc3lzdnh4IExBUEFDS19HTE9CQUwoZHN5c3Z4eCxEU1lTVlhYKQorI2RlZmluZSBMQVBBQ0tfc3N5c3Z4eCBMQVBBQ0tfR0xPQkFMKHNzeXN2eHgsU1NZU1ZYWCkKKyNkZWZpbmUgTEFQQUNLX3pzeXN2eHggTEFQQUNLX0dMT0JBTCh6c3lzdnh4LFpTWVNWWFgpCisjZGVmaW5lIExBUEFDS19jc3lzdnh4IExBUEFDS19HTE9CQUwoY3N5c3Z4eCxDU1lTVlhYKQorI2RlZmluZSBMQVBBQ0tfY2hlc3YgTEFQQUNLX0dMT0JBTChjaGVzdixDSEVTVikKKyNkZWZpbmUgTEFQQUNLX3poZXN2IExBUEFDS19HTE9CQUwoemhlc3YsWkhFU1YpCisjZGVmaW5lIExBUEFDS19jaGVzdnggTEFQQUNLX0dMT0JBTChjaGVzdngsQ0hFU1ZYKQorI2RlZmluZSBMQVBBQ0tfemhlc3Z4IExBUEFDS19HTE9CQUwoemhlc3Z4LFpIRVNWWCkKKyNkZWZpbmUgTEFQQUNLX3poZXN2eHggTEFQQUNLX0dMT0JBTCh6aGVzdnh4LFpIRVNWWFgpCisjZGVmaW5lIExBUEFDS19jaGVzdnh4IExBUEFDS19HTE9CQUwoY2hlc3Z4eCxDSEVTVlhYKQorI2RlZmluZSBMQVBBQ0tfc3Nwc3YgTEFQQUNLX0dMT0JBTChzc3BzdixTU1BTVikKKyNkZWZpbmUgTEFQQUNLX2RzcHN2IExBUEFDS19HTE9CQUwoZHNwc3YsRFNQU1YpCisjZGVmaW5lIExBUEFDS19jc3BzdiBMQVBBQ0tfR0xPQkFMKGNzcHN2LENTUFNWKQorI2RlZmluZSBMQVBBQ0tfenNwc3YgTEFQQUNLX0dMT0JBTCh6c3BzdixaU1BTVikKKyNkZWZpbmUgTEFQQUNLX3NzcHN2eCBMQVBBQ0tfR0xPQkFMKHNzcHN2eCxTU1BTVlgpCisjZGVmaW5lIExBUEFDS19kc3BzdnggTEFQQUNLX0dMT0JBTChkc3BzdngsRFNQU1ZYKQorI2RlZmluZSBMQVBBQ0tfY3Nwc3Z4IExBUEFDS19HTE9CQUwoY3Nwc3Z4LENTUFNWWCkKKyNkZWZpbmUgTEFQQUNLX3pzcHN2eCBMQVBBQ0tfR0xPQkFMKHpzcHN2eCxaU1BTVlgpCisjZGVmaW5lIExBUEFDS19jaHBzdiBMQVBBQ0tfR0xPQkFMKGNocHN2LENIUFNWKQorI2RlZmluZSBMQVBBQ0tfemhwc3YgTEFQQUNLX0dMT0JBTCh6aHBzdixaSFBTVikKKyNkZWZpbmUgTEFQQUNLX2NocHN2eCBMQVBBQ0tfR0xPQkFMKGNocHN2eCxDSFBTVlgpCisjZGVmaW5lIExBUEFDS196aHBzdnggTEFQQUNLX0dMT0JBTCh6aHBzdngsWkhQU1ZYKQorI2RlZmluZSBMQVBBQ0tfc2dlcXJmIExBUEFDS19HTE9CQUwoc2dlcXJmLFNHRVFSRikKKyNkZWZpbmUgTEFQQUNLX2RnZXFyZiBMQVBBQ0tfR0xPQkFMKGRnZXFyZixER0VRUkYpCisjZGVmaW5lIExBUEFDS19jZ2VxcmYgTEFQQUNLX0dMT0JBTChjZ2VxcmYsQ0dFUVJGKQorI2RlZmluZSBMQVBBQ0tfemdlcXJmIExBUEFDS19HTE9CQUwoemdlcXJmLFpHRVFSRikKKyNkZWZpbmUgTEFQQUNLX3NnZXFwZiBMQVBBQ0tfR0xPQkFMKHNnZXFwZixTR0VRUEYpCisjZGVmaW5lIExBUEFDS19kZ2VxcGYgTEFQQUNLX0dMT0JBTChkZ2VxcGYsREdFUVBGKQorI2RlZmluZSBMQVBBQ0tfY2dlcXBmIExBUEFDS19HTE9CQUwoY2dlcXBmLENHRVFQRikKKyNkZWZpbmUgTEFQQUNLX3pnZXFwZiBMQVBBQ0tfR0xPQkFMKHpnZXFwZixaR0VRUEYpCisjZGVmaW5lIExBUEFDS19zZ2VxcDMgTEFQQUNLX0dMT0JBTChzZ2VxcDMsU0dFUVAzKQorI2RlZmluZSBMQVBBQ0tfZGdlcXAzIExBUEFDS19HTE9CQUwoZGdlcXAzLERHRVFQMykKKyNkZWZpbmUgTEFQQUNLX2NnZXFwMyBMQVBBQ0tfR0xPQkFMKGNnZXFwMyxDR0VRUDMpCisjZGVmaW5lIExBUEFDS196Z2VxcDMgTEFQQUNLX0dMT0JBTCh6Z2VxcDMsWkdFUVAzKQorI2RlZmluZSBMQVBBQ0tfc29yZ3FyIExBUEFDS19HTE9CQUwoc29yZ3FyLFNPUkdRUikKKyNkZWZpbmUgTEFQQUNLX2RvcmdxciBMQVBBQ0tfR0xPQkFMKGRvcmdxcixET1JHUVIpCisjZGVmaW5lIExBUEFDS19zb3JtcXIgTEFQQUNLX0dMT0JBTChzb3JtcXIsU09STVFSKQorI2RlZmluZSBMQVBBQ0tfZG9ybXFyIExBUEFDS19HTE9CQUwoZG9ybXFyLERPUk1RUikKKyNkZWZpbmUgTEFQQUNLX2N1bmdxciBMQVBBQ0tfR0xPQkFMKGN1bmdxcixDVU5HUVIpCisjZGVmaW5lIExBUEFDS196dW5ncXIgTEFQQUNLX0dMT0JBTCh6dW5ncXIsWlVOR1FSKQorI2RlZmluZSBMQVBBQ0tfY3VubXFyIExBUEFDS19HTE9CQUwoY3VubXFyLENVTk1RUikKKyNkZWZpbmUgTEFQQUNLX3p1bm1xciBMQVBBQ0tfR0xPQkFMKHp1bm1xcixaVU5NUVIpCisjZGVmaW5lIExBUEFDS19zZ2VscWYgTEFQQUNLX0dMT0JBTChzZ2VscWYsU0dFTFFGKQorI2RlZmluZSBMQVBBQ0tfZGdlbHFmIExBUEFDS19HTE9CQUwoZGdlbHFmLERHRUxRRikKKyNkZWZpbmUgTEFQQUNLX2NnZWxxZiBMQVBBQ0tfR0xPQkFMKGNnZWxxZixDR0VMUUYpCisjZGVmaW5lIExBUEFDS196Z2VscWYgTEFQQUNLX0dMT0JBTCh6Z2VscWYsWkdFTFFGKQorI2RlZmluZSBMQVBBQ0tfc29yZ2xxIExBUEFDS19HTE9CQUwoc29yZ2xxLFNPUkdMUSkKKyNkZWZpbmUgTEFQQUNLX2RvcmdscSBMQVBBQ0tfR0xPQkFMKGRvcmdscSxET1JHTFEpCisjZGVmaW5lIExBUEFDS19zb3JtbHEgTEFQQUNLX0dMT0JBTChzb3JtbHEsU09STUxRKQorI2RlZmluZSBMQVBBQ0tfZG9ybWxxIExBUEFDS19HTE9CQUwoZG9ybWxxLERPUk1MUSkKKyNkZWZpbmUgTEFQQUNLX2N1bmdscSBMQVBBQ0tfR0xPQkFMKGN1bmdscSxDVU5HTFEpCisjZGVmaW5lIExBUEFDS196dW5nbHEgTEFQQUNLX0dMT0JBTCh6dW5nbHEsWlVOR0xRKQorI2RlZmluZSBMQVBBQ0tfY3VubWxxIExBUEFDS19HTE9CQUwoY3VubWxxLENVTk1MUSkKKyNkZWZpbmUgTEFQQUNLX3p1bm1scSBMQVBBQ0tfR0xPQkFMKHp1bm1scSxaVU5NTFEpCisjZGVmaW5lIExBUEFDS19zZ2VxbGYgTEFQQUNLX0dMT0JBTChzZ2VxbGYsU0dFUUxGKQorI2RlZmluZSBMQVBBQ0tfZGdlcWxmIExBUEFDS19HTE9CQUwoZGdlcWxmLERHRVFMRikKKyNkZWZpbmUgTEFQQUNLX2NnZXFsZiBMQVBBQ0tfR0xPQkFMKGNnZXFsZixDR0VRTEYpCisjZGVmaW5lIExBUEFDS196Z2VxbGYgTEFQQUNLX0dMT0JBTCh6Z2VxbGYsWkdFUUxGKQorI2RlZmluZSBMQVBBQ0tfc29yZ3FsIExBUEFDS19HTE9CQUwoc29yZ3FsLFNPUkdRTCkKKyNkZWZpbmUgTEFQQUNLX2RvcmdxbCBMQVBBQ0tfR0xPQkFMKGRvcmdxbCxET1JHUUwpCisjZGVmaW5lIExBUEFDS19jdW5ncWwgTEFQQUNLX0dMT0JBTChjdW5ncWwsQ1VOR1FMKQorI2RlZmluZSBMQVBBQ0tfenVuZ3FsIExBUEFDS19HTE9CQUwoenVuZ3FsLFpVTkdRTCkKKyNkZWZpbmUgTEFQQUNLX3Nvcm1xbCBMQVBBQ0tfR0xPQkFMKHNvcm1xbCxTT1JNUUwpCisjZGVmaW5lIExBUEFDS19kb3JtcWwgTEFQQUNLX0dMT0JBTChkb3JtcWwsRE9STVFMKQorI2RlZmluZSBMQVBBQ0tfY3VubXFsIExBUEFDS19HTE9CQUwoY3VubXFsLENVTk1RTCkKKyNkZWZpbmUgTEFQQUNLX3p1bm1xbCBMQVBBQ0tfR0xPQkFMKHp1bm1xbCxaVU5NUUwpCisjZGVmaW5lIExBUEFDS19zZ2VycWYgTEFQQUNLX0dMT0JBTChzZ2VycWYsU0dFUlFGKQorI2RlZmluZSBMQVBBQ0tfZGdlcnFmIExBUEFDS19HTE9CQUwoZGdlcnFmLERHRVJRRikKKyNkZWZpbmUgTEFQQUNLX2NnZXJxZiBMQVBBQ0tfR0xPQkFMKGNnZXJxZixDR0VSUUYpCisjZGVmaW5lIExBUEFDS196Z2VycWYgTEFQQUNLX0dMT0JBTCh6Z2VycWYsWkdFUlFGKQorI2RlZmluZSBMQVBBQ0tfc29yZ3JxIExBUEFDS19HTE9CQUwoc29yZ3JxLFNPUkdSUSkKKyNkZWZpbmUgTEFQQUNLX2RvcmdycSBMQVBBQ0tfR0xPQkFMKGRvcmdycSxET1JHUlEpCisjZGVmaW5lIExBUEFDS19jdW5ncnEgTEFQQUNLX0dMT0JBTChjdW5ncnEsQ1VOR1JRKQorI2RlZmluZSBMQVBBQ0tfenVuZ3JxIExBUEFDS19HTE9CQUwoenVuZ3JxLFpVTkdSUSkKKyNkZWZpbmUgTEFQQUNLX3Nvcm1ycSBMQVBBQ0tfR0xPQkFMKHNvcm1ycSxTT1JNUlEpCisjZGVmaW5lIExBUEFDS19kb3JtcnEgTEFQQUNLX0dMT0JBTChkb3JtcnEsRE9STVJRKQorI2RlZmluZSBMQVBBQ0tfY3VubXJxIExBUEFDS19HTE9CQUwoY3VubXJxLENVTk1SUSkKKyNkZWZpbmUgTEFQQUNLX3p1bm1ycSBMQVBBQ0tfR0xPQkFMKHp1bm1ycSxaVU5NUlEpCisjZGVmaW5lIExBUEFDS19zdHpyemYgTEFQQUNLX0dMT0JBTChzdHpyemYsU1RaUlpGKQorI2RlZmluZSBMQVBBQ0tfZHR6cnpmIExBUEFDS19HTE9CQUwoZHR6cnpmLERUWlJaRikKKyNkZWZpbmUgTEFQQUNLX2N0enJ6ZiBMQVBBQ0tfR0xPQkFMKGN0enJ6ZixDVFpSWkYpCisjZGVmaW5lIExBUEFDS196dHpyemYgTEFQQUNLX0dMT0JBTCh6dHpyemYsWlRaUlpGKQorI2RlZmluZSBMQVBBQ0tfc29ybXJ6IExBUEFDS19HTE9CQUwoc29ybXJ6LFNPUk1SWikKKyNkZWZpbmUgTEFQQUNLX2Rvcm1yeiBMQVBBQ0tfR0xPQkFMKGRvcm1yeixET1JNUlopCisjZGVmaW5lIExBUEFDS19jdW5tcnogTEFQQUNLX0dMT0JBTChjdW5tcnosQ1VOTVJaKQorI2RlZmluZSBMQVBBQ0tfenVubXJ6IExBUEFDS19HTE9CQUwoenVubXJ6LFpVTk1SWikKKyNkZWZpbmUgTEFQQUNLX3NnZ3FyZiBMQVBBQ0tfR0xPQkFMKHNnZ3FyZixTR0dRUkYpCisjZGVmaW5lIExBUEFDS19kZ2dxcmYgTEFQQUNLX0dMT0JBTChkZ2dxcmYsREdHUVJGKQorI2RlZmluZSBMQVBBQ0tfY2dncXJmIExBUEFDS19HTE9CQUwoY2dncXJmLENHR1FSRikKKyNkZWZpbmUgTEFQQUNLX3pnZ3FyZiBMQVBBQ0tfR0xPQkFMKHpnZ3FyZixaR0dRUkYpCisjZGVmaW5lIExBUEFDS19zZ2dycWYgTEFQQUNLX0dMT0JBTChzZ2dycWYsU0dHUlFGKQorI2RlZmluZSBMQVBBQ0tfZGdncnFmIExBUEFDS19HTE9CQUwoZGdncnFmLERHR1JRRikKKyNkZWZpbmUgTEFQQUNLX2NnZ3JxZiBMQVBBQ0tfR0xPQkFMKGNnZ3JxZixDR0dSUUYpCisjZGVmaW5lIExBUEFDS196Z2dycWYgTEFQQUNLX0dMT0JBTCh6Z2dycWYsWkdHUlFGKQorI2RlZmluZSBMQVBBQ0tfc2dlYnJkIExBUEFDS19HTE9CQUwoc2dlYnJkLFNHRUJSRCkKKyNkZWZpbmUgTEFQQUNLX2RnZWJyZCBMQVBBQ0tfR0xPQkFMKGRnZWJyZCxER0VCUkQpCisjZGVmaW5lIExBUEFDS19jZ2VicmQgTEFQQUNLX0dMT0JBTChjZ2VicmQsQ0dFQlJEKQorI2RlZmluZSBMQVBBQ0tfemdlYnJkIExBUEFDS19HTE9CQUwoemdlYnJkLFpHRUJSRCkKKyNkZWZpbmUgTEFQQUNLX3NnYmJyZCBMQVBBQ0tfR0xPQkFMKHNnYmJyZCxTR0JCUkQpCisjZGVmaW5lIExBUEFDS19kZ2JicmQgTEFQQUNLX0dMT0JBTChkZ2JicmQsREdCQlJEKQorI2RlZmluZSBMQVBBQ0tfY2diYnJkIExBUEFDS19HTE9CQUwoY2diYnJkLENHQkJSRCkKKyNkZWZpbmUgTEFQQUNLX3pnYmJyZCBMQVBBQ0tfR0xPQkFMKHpnYmJyZCxaR0JCUkQpCisjZGVmaW5lIExBUEFDS19zb3JnYnIgTEFQQUNLX0dMT0JBTChzb3JnYnIsU09SR0JSKQorI2RlZmluZSBMQVBBQ0tfZG9yZ2JyIExBUEFDS19HTE9CQUwoZG9yZ2JyLERPUkdCUikKKyNkZWZpbmUgTEFQQUNLX3Nvcm1iciBMQVBBQ0tfR0xPQkFMKHNvcm1icixTT1JNQlIpCisjZGVmaW5lIExBUEFDS19kb3JtYnIgTEFQQUNLX0dMT0JBTChkb3JtYnIsRE9STUJSKQorI2RlZmluZSBMQVBBQ0tfY3VuZ2JyIExBUEFDS19HTE9CQUwoY3VuZ2JyLENVTkdCUikKKyNkZWZpbmUgTEFQQUNLX3p1bmdiciBMQVBBQ0tfR0xPQkFMKHp1bmdicixaVU5HQlIpCisjZGVmaW5lIExBUEFDS19jdW5tYnIgTEFQQUNLX0dMT0JBTChjdW5tYnIsQ1VOTUJSKQorI2RlZmluZSBMQVBBQ0tfenVubWJyIExBUEFDS19HTE9CQUwoenVubWJyLFpVTk1CUikKKyNkZWZpbmUgTEFQQUNLX3NiZHNxciBMQVBBQ0tfR0xPQkFMKHNiZHNxcixTQkRTUVIpCisjZGVmaW5lIExBUEFDS19kYmRzcXIgTEFQQUNLX0dMT0JBTChkYmRzcXIsREJEU1FSKQorI2RlZmluZSBMQVBBQ0tfY2Jkc3FyIExBUEFDS19HTE9CQUwoY2Jkc3FyLENCRFNRUikKKyNkZWZpbmUgTEFQQUNLX3piZHNxciBMQVBBQ0tfR0xPQkFMKHpiZHNxcixaQkRTUVIpCisjZGVmaW5lIExBUEFDS19zYmRzZGMgTEFQQUNLX0dMT0JBTChzYmRzZGMsU0JEU0RDKQorI2RlZmluZSBMQVBBQ0tfZGJkc2RjIExBUEFDS19HTE9CQUwoZGJkc2RjLERCRFNEQykKKyNkZWZpbmUgTEFQQUNLX3NzeXRyZCBMQVBBQ0tfR0xPQkFMKHNzeXRyZCxTU1lUUkQpCisjZGVmaW5lIExBUEFDS19kc3l0cmQgTEFQQUNLX0dMT0JBTChkc3l0cmQsRFNZVFJEKQorI2RlZmluZSBMQVBBQ0tfc29yZ3RyIExBUEFDS19HTE9CQUwoc29yZ3RyLFNPUkdUUikKKyNkZWZpbmUgTEFQQUNLX2Rvcmd0ciBMQVBBQ0tfR0xPQkFMKGRvcmd0cixET1JHVFIpCisjZGVmaW5lIExBUEFDS19zb3JtdHIgTEFQQUNLX0dMT0JBTChzb3JtdHIsU09STVRSKQorI2RlZmluZSBMQVBBQ0tfZG9ybXRyIExBUEFDS19HTE9CQUwoZG9ybXRyLERPUk1UUikKKyNkZWZpbmUgTEFQQUNLX2NoZXRyZCBMQVBBQ0tfR0xPQkFMKGNoZXRyZCxDSEVUUkQpCisjZGVmaW5lIExBUEFDS196aGV0cmQgTEFQQUNLX0dMT0JBTCh6aGV0cmQsWkhFVFJEKQorI2RlZmluZSBMQVBBQ0tfY3VuZ3RyIExBUEFDS19HTE9CQUwoY3VuZ3RyLENVTkdUUikKKyNkZWZpbmUgTEFQQUNLX3p1bmd0ciBMQVBBQ0tfR0xPQkFMKHp1bmd0cixaVU5HVFIpCisjZGVmaW5lIExBUEFDS19jdW5tdHIgTEFQQUNLX0dMT0JBTChjdW5tdHIsQ1VOTVRSKQorI2RlZmluZSBMQVBBQ0tfenVubXRyIExBUEFDS19HTE9CQUwoenVubXRyLFpVTk1UUikKKyNkZWZpbmUgTEFQQUNLX3NzcHRyZCBMQVBBQ0tfR0xPQkFMKHNzcHRyZCxTU1BUUkQpCisjZGVmaW5lIExBUEFDS19kc3B0cmQgTEFQQUNLX0dMT0JBTChkc3B0cmQsRFNQVFJEKQorI2RlZmluZSBMQVBBQ0tfc29wZ3RyIExBUEFDS19HTE9CQUwoc29wZ3RyLFNPUEdUUikKKyNkZWZpbmUgTEFQQUNLX2RvcGd0ciBMQVBBQ0tfR0xPQkFMKGRvcGd0cixET1BHVFIpCisjZGVmaW5lIExBUEFDS19zb3BtdHIgTEFQQUNLX0dMT0JBTChzb3BtdHIsU09QTVRSKQorI2RlZmluZSBMQVBBQ0tfZG9wbXRyIExBUEFDS19HTE9CQUwoZG9wbXRyLERPUE1UUikKKyNkZWZpbmUgTEFQQUNLX2NocHRyZCBMQVBBQ0tfR0xPQkFMKGNocHRyZCxDSFBUUkQpCisjZGVmaW5lIExBUEFDS196aHB0cmQgTEFQQUNLX0dMT0JBTCh6aHB0cmQsWkhQVFJEKQorI2RlZmluZSBMQVBBQ0tfY3VwZ3RyIExBUEFDS19HTE9CQUwoY3VwZ3RyLENVUEdUUikKKyNkZWZpbmUgTEFQQUNLX3p1cGd0ciBMQVBBQ0tfR0xPQkFMKHp1cGd0cixaVVBHVFIpCisjZGVmaW5lIExBUEFDS19jdXBtdHIgTEFQQUNLX0dMT0JBTChjdXBtdHIsQ1VQTVRSKQorI2RlZmluZSBMQVBBQ0tfenVwbXRyIExBUEFDS19HTE9CQUwoenVwbXRyLFpVUE1UUikKKyNkZWZpbmUgTEFQQUNLX3NzYnRyZCBMQVBBQ0tfR0xPQkFMKHNzYnRyZCxTU0JUUkQpCisjZGVmaW5lIExBUEFDS19kc2J0cmQgTEFQQUNLX0dMT0JBTChkc2J0cmQsRFNCVFJEKQorI2RlZmluZSBMQVBBQ0tfY2hidHJkIExBUEFDS19HTE9CQUwoY2hidHJkLENIQlRSRCkKKyNkZWZpbmUgTEFQQUNLX3poYnRyZCBMQVBBQ0tfR0xPQkFMKHpoYnRyZCxaSEJUUkQpCisjZGVmaW5lIExBUEFDS19zc3RlcmYgTEFQQUNLX0dMT0JBTChzc3RlcmYsU1NURVJGKQorI2RlZmluZSBMQVBBQ0tfZHN0ZXJmIExBUEFDS19HTE9CQUwoZHN0ZXJmLERTVEVSRikKKyNkZWZpbmUgTEFQQUNLX3NzdGVxciBMQVBBQ0tfR0xPQkFMKHNzdGVxcixTU1RFUVIpCisjZGVmaW5lIExBUEFDS19kc3RlcXIgTEFQQUNLX0dMT0JBTChkc3RlcXIsRFNURVFSKQorI2RlZmluZSBMQVBBQ0tfY3N0ZXFyIExBUEFDS19HTE9CQUwoY3N0ZXFyLENTVEVRUikKKyNkZWZpbmUgTEFQQUNLX3pzdGVxciBMQVBBQ0tfR0xPQkFMKHpzdGVxcixaU1RFUVIpCisjZGVmaW5lIExBUEFDS19zc3RlbXIgTEFQQUNLX0dMT0JBTChzc3RlbXIsU1NURU1SKQorI2RlZmluZSBMQVBBQ0tfZHN0ZW1yIExBUEFDS19HTE9CQUwoZHN0ZW1yLERTVEVNUikKKyNkZWZpbmUgTEFQQUNLX2NzdGVtciBMQVBBQ0tfR0xPQkFMKGNzdGVtcixDU1RFTVIpCisjZGVmaW5lIExBUEFDS196c3RlbXIgTEFQQUNLX0dMT0JBTCh6c3RlbXIsWlNURU1SKQorI2RlZmluZSBMQVBBQ0tfc3N0ZWRjIExBUEFDS19HTE9CQUwoc3N0ZWRjLFNTVEVEQykKKyNkZWZpbmUgTEFQQUNLX2RzdGVkYyBMQVBBQ0tfR0xPQkFMKGRzdGVkYyxEU1RFREMpCisjZGVmaW5lIExBUEFDS19jc3RlZGMgTEFQQUNLX0dMT0JBTChjc3RlZGMsQ1NURURDKQorI2RlZmluZSBMQVBBQ0tfenN0ZWRjIExBUEFDS19HTE9CQUwoenN0ZWRjLFpTVEVEQykKKyNkZWZpbmUgTEFQQUNLX3NzdGVnciBMQVBBQ0tfR0xPQkFMKHNzdGVncixTU1RFR1IpCisjZGVmaW5lIExBUEFDS19kc3RlZ3IgTEFQQUNLX0dMT0JBTChkc3RlZ3IsRFNURUdSKQorI2RlZmluZSBMQVBBQ0tfY3N0ZWdyIExBUEFDS19HTE9CQUwoY3N0ZWdyLENTVEVHUikKKyNkZWZpbmUgTEFQQUNLX3pzdGVnciBMQVBBQ0tfR0xPQkFMKHpzdGVncixaU1RFR1IpCisjZGVmaW5lIExBUEFDS19zcHRlcXIgTEFQQUNLX0dMT0JBTChzcHRlcXIsU1BURVFSKQorI2RlZmluZSBMQVBBQ0tfZHB0ZXFyIExBUEFDS19HTE9CQUwoZHB0ZXFyLERQVEVRUikKKyNkZWZpbmUgTEFQQUNLX2NwdGVxciBMQVBBQ0tfR0xPQkFMKGNwdGVxcixDUFRFUVIpCisjZGVmaW5lIExBUEFDS196cHRlcXIgTEFQQUNLX0dMT0JBTCh6cHRlcXIsWlBURVFSKQorI2RlZmluZSBMQVBBQ0tfc3N0ZWJ6IExBUEFDS19HTE9CQUwoc3N0ZWJ6LFNTVEVCWikKKyNkZWZpbmUgTEFQQUNLX2RzdGVieiBMQVBBQ0tfR0xPQkFMKGRzdGVieixEU1RFQlopCisjZGVmaW5lIExBUEFDS19zc3RlaW4gTEFQQUNLX0dMT0JBTChzc3RlaW4sU1NURUlOKQorI2RlZmluZSBMQVBBQ0tfZHN0ZWluIExBUEFDS19HTE9CQUwoZHN0ZWluLERTVEVJTikKKyNkZWZpbmUgTEFQQUNLX2NzdGVpbiBMQVBBQ0tfR0xPQkFMKGNzdGVpbixDU1RFSU4pCisjZGVmaW5lIExBUEFDS196c3RlaW4gTEFQQUNLX0dMT0JBTCh6c3RlaW4sWlNURUlOKQorI2RlZmluZSBMQVBBQ0tfc2Rpc25hIExBUEFDS19HTE9CQUwoc2Rpc25hLFNESVNOQSkKKyNkZWZpbmUgTEFQQUNLX2RkaXNuYSBMQVBBQ0tfR0xPQkFMKGRkaXNuYSxERElTTkEpCisjZGVmaW5lIExBUEFDS19zc3lnc3QgTEFQQUNLX0dMT0JBTChzc3lnc3QsU1NZR1NUKQorI2RlZmluZSBMQVBBQ0tfZHN5Z3N0IExBUEFDS19HTE9CQUwoZHN5Z3N0LERTWUdTVCkKKyNkZWZpbmUgTEFQQUNLX2NoZWdzdCBMQVBBQ0tfR0xPQkFMKGNoZWdzdCxDSEVHU1QpCisjZGVmaW5lIExBUEFDS196aGVnc3QgTEFQQUNLX0dMT0JBTCh6aGVnc3QsWkhFR1NUKQorI2RlZmluZSBMQVBBQ0tfc3NwZ3N0IExBUEFDS19HTE9CQUwoc3NwZ3N0LFNTUEdTVCkKKyNkZWZpbmUgTEFQQUNLX2RzcGdzdCBMQVBBQ0tfR0xPQkFMKGRzcGdzdCxEU1BHU1QpCisjZGVmaW5lIExBUEFDS19jaHBnc3QgTEFQQUNLX0dMT0JBTChjaHBnc3QsQ0hQR1NUKQorI2RlZmluZSBMQVBBQ0tfemhwZ3N0IExBUEFDS19HTE9CQUwoemhwZ3N0LFpIUEdTVCkKKyNkZWZpbmUgTEFQQUNLX3NzYmdzdCBMQVBBQ0tfR0xPQkFMKHNzYmdzdCxTU0JHU1QpCisjZGVmaW5lIExBUEFDS19kc2Jnc3QgTEFQQUNLX0dMT0JBTChkc2Jnc3QsRFNCR1NUKQorI2RlZmluZSBMQVBBQ0tfY2hiZ3N0IExBUEFDS19HTE9CQUwoY2hiZ3N0LENIQkdTVCkKKyNkZWZpbmUgTEFQQUNLX3poYmdzdCBMQVBBQ0tfR0xPQkFMKHpoYmdzdCxaSEJHU1QpCisjZGVmaW5lIExBUEFDS19zcGJzdGYgTEFQQUNLX0dMT0JBTChzcGJzdGYsU1BCU1RGKQorI2RlZmluZSBMQVBBQ0tfZHBic3RmIExBUEFDS19HTE9CQUwoZHBic3RmLERQQlNURikKKyNkZWZpbmUgTEFQQUNLX2NwYnN0ZiBMQVBBQ0tfR0xPQkFMKGNwYnN0ZixDUEJTVEYpCisjZGVmaW5lIExBUEFDS196cGJzdGYgTEFQQUNLX0dMT0JBTCh6cGJzdGYsWlBCU1RGKQorI2RlZmluZSBMQVBBQ0tfc2dlaHJkIExBUEFDS19HTE9CQUwoc2dlaHJkLFNHRUhSRCkKKyNkZWZpbmUgTEFQQUNLX2RnZWhyZCBMQVBBQ0tfR0xPQkFMKGRnZWhyZCxER0VIUkQpCisjZGVmaW5lIExBUEFDS19jZ2VocmQgTEFQQUNLX0dMT0JBTChjZ2VocmQsQ0dFSFJEKQorI2RlZmluZSBMQVBBQ0tfemdlaHJkIExBUEFDS19HTE9CQUwoemdlaHJkLFpHRUhSRCkKKyNkZWZpbmUgTEFQQUNLX3NvcmdociBMQVBBQ0tfR0xPQkFMKHNvcmdocixTT1JHSFIpCisjZGVmaW5lIExBUEFDS19kb3JnaHIgTEFQQUNLX0dMT0JBTChkb3JnaHIsRE9SR0hSKQorI2RlZmluZSBMQVBBQ0tfc29ybWhyIExBUEFDS19HTE9CQUwoc29ybWhyLFNPUk1IUikKKyNkZWZpbmUgTEFQQUNLX2Rvcm1ociBMQVBBQ0tfR0xPQkFMKGRvcm1ocixET1JNSFIpCisjZGVmaW5lIExBUEFDS19jdW5naHIgTEFQQUNLX0dMT0JBTChjdW5naHIsQ1VOR0hSKQorI2RlZmluZSBMQVBBQ0tfenVuZ2hyIExBUEFDS19HTE9CQUwoenVuZ2hyLFpVTkdIUikKKyNkZWZpbmUgTEFQQUNLX2N1bm1ociBMQVBBQ0tfR0xPQkFMKGN1bm1ocixDVU5NSFIpCisjZGVmaW5lIExBUEFDS196dW5taHIgTEFQQUNLX0dMT0JBTCh6dW5taHIsWlVOTUhSKQorI2RlZmluZSBMQVBBQ0tfc2dlYmFsIExBUEFDS19HTE9CQUwoc2dlYmFsLFNHRUJBTCkKKyNkZWZpbmUgTEFQQUNLX2RnZWJhbCBMQVBBQ0tfR0xPQkFMKGRnZWJhbCxER0VCQUwpCisjZGVmaW5lIExBUEFDS19jZ2ViYWwgTEFQQUNLX0dMT0JBTChjZ2ViYWwsQ0dFQkFMKQorI2RlZmluZSBMQVBBQ0tfemdlYmFsIExBUEFDS19HTE9CQUwoemdlYmFsLFpHRUJBTCkKKyNkZWZpbmUgTEFQQUNLX3NnZWJhayBMQVBBQ0tfR0xPQkFMKHNnZWJhayxTR0VCQUspCisjZGVmaW5lIExBUEFDS19kZ2ViYWsgTEFQQUNLX0dMT0JBTChkZ2ViYWssREdFQkFLKQorI2RlZmluZSBMQVBBQ0tfY2dlYmFrIExBUEFDS19HTE9CQUwoY2dlYmFrLENHRUJBSykKKyNkZWZpbmUgTEFQQUNLX3pnZWJhayBMQVBBQ0tfR0xPQkFMKHpnZWJhayxaR0VCQUspCisjZGVmaW5lIExBUEFDS19zaHNlcXIgTEFQQUNLX0dMT0JBTChzaHNlcXIsU0hTRVFSKQorI2RlZmluZSBMQVBBQ0tfZGhzZXFyIExBUEFDS19HTE9CQUwoZGhzZXFyLERIU0VRUikKKyNkZWZpbmUgTEFQQUNLX2Noc2VxciBMQVBBQ0tfR0xPQkFMKGNoc2VxcixDSFNFUVIpCisjZGVmaW5lIExBUEFDS196aHNlcXIgTEFQQUNLX0dMT0JBTCh6aHNlcXIsWkhTRVFSKQorI2RlZmluZSBMQVBBQ0tfc2hzZWluIExBUEFDS19HTE9CQUwoc2hzZWluLFNIU0VJTikKKyNkZWZpbmUgTEFQQUNLX2Roc2VpbiBMQVBBQ0tfR0xPQkFMKGRoc2VpbixESFNFSU4pCisjZGVmaW5lIExBUEFDS19jaHNlaW4gTEFQQUNLX0dMT0JBTChjaHNlaW4sQ0hTRUlOKQorI2RlZmluZSBMQVBBQ0tfemhzZWluIExBUEFDS19HTE9CQUwoemhzZWluLFpIU0VJTikKKyNkZWZpbmUgTEFQQUNLX3N0cmV2YyBMQVBBQ0tfR0xPQkFMKHN0cmV2YyxTVFJFVkMpCisjZGVmaW5lIExBUEFDS19kdHJldmMgTEFQQUNLX0dMT0JBTChkdHJldmMsRFRSRVZDKQorI2RlZmluZSBMQVBBQ0tfY3RyZXZjIExBUEFDS19HTE9CQUwoY3RyZXZjLENUUkVWQykKKyNkZWZpbmUgTEFQQUNLX3p0cmV2YyBMQVBBQ0tfR0xPQkFMKHp0cmV2YyxaVFJFVkMpCisjZGVmaW5lIExBUEFDS19zdHJzbmEgTEFQQUNLX0dMT0JBTChzdHJzbmEsU1RSU05BKQorI2RlZmluZSBMQVBBQ0tfZHRyc25hIExBUEFDS19HTE9CQUwoZHRyc25hLERUUlNOQSkKKyNkZWZpbmUgTEFQQUNLX2N0cnNuYSBMQVBBQ0tfR0xPQkFMKGN0cnNuYSxDVFJTTkEpCisjZGVmaW5lIExBUEFDS196dHJzbmEgTEFQQUNLX0dMT0JBTCh6dHJzbmEsWlRSU05BKQorI2RlZmluZSBMQVBBQ0tfc3RyZXhjIExBUEFDS19HTE9CQUwoc3RyZXhjLFNUUkVYQykKKyNkZWZpbmUgTEFQQUNLX2R0cmV4YyBMQVBBQ0tfR0xPQkFMKGR0cmV4YyxEVFJFWEMpCisjZGVmaW5lIExBUEFDS19jdHJleGMgTEFQQUNLX0dMT0JBTChjdHJleGMsQ1RSRVhDKQorI2RlZmluZSBMQVBBQ0tfenRyZXhjIExBUEFDS19HTE9CQUwoenRyZXhjLFpUUkVYQykKKyNkZWZpbmUgTEFQQUNLX3N0cnNlbiBMQVBBQ0tfR0xPQkFMKHN0cnNlbixTVFJTRU4pCisjZGVmaW5lIExBUEFDS19kdHJzZW4gTEFQQUNLX0dMT0JBTChkdHJzZW4sRFRSU0VOKQorI2RlZmluZSBMQVBBQ0tfY3Ryc2VuIExBUEFDS19HTE9CQUwoY3Ryc2VuLENUUlNFTikKKyNkZWZpbmUgTEFQQUNLX3p0cnNlbiBMQVBBQ0tfR0xPQkFMKHp0cnNlbixaVFJTRU4pCisjZGVmaW5lIExBUEFDS19zdHJzeWwgTEFQQUNLX0dMT0JBTChzdHJzeWwsU1RSU1lMKQorI2RlZmluZSBMQVBBQ0tfZHRyc3lsIExBUEFDS19HTE9CQUwoZHRyc3lsLERUUlNZTCkKKyNkZWZpbmUgTEFQQUNLX2N0cnN5bCBMQVBBQ0tfR0xPQkFMKGN0cnN5bCxDVFJTWUwpCisjZGVmaW5lIExBUEFDS196dHJzeWwgTEFQQUNLX0dMT0JBTCh6dHJzeWwsWlRSU1lMKQorI2RlZmluZSBMQVBBQ0tfc2dnaHJkIExBUEFDS19HTE9CQUwoc2dnaHJkLFNHR0hSRCkKKyNkZWZpbmUgTEFQQUNLX2RnZ2hyZCBMQVBBQ0tfR0xPQkFMKGRnZ2hyZCxER0dIUkQpCisjZGVmaW5lIExBUEFDS19jZ2docmQgTEFQQUNLX0dMT0JBTChjZ2docmQsQ0dHSFJEKQorI2RlZmluZSBMQVBBQ0tfemdnaHJkIExBUEFDS19HTE9CQUwoemdnaHJkLFpHR0hSRCkKKyNkZWZpbmUgTEFQQUNLX3NnZ2JhbCBMQVBBQ0tfR0xPQkFMKHNnZ2JhbCxTR0dCQUwpCisjZGVmaW5lIExBUEFDS19kZ2diYWwgTEFQQUNLX0dMT0JBTChkZ2diYWwsREdHQkFMKQorI2RlZmluZSBMQVBBQ0tfY2dnYmFsIExBUEFDS19HTE9CQUwoY2dnYmFsLENHR0JBTCkKKyNkZWZpbmUgTEFQQUNLX3pnZ2JhbCBMQVBBQ0tfR0xPQkFMKHpnZ2JhbCxaR0dCQUwpCisjZGVmaW5lIExBUEFDS19zZ2diYWsgTEFQQUNLX0dMT0JBTChzZ2diYWssU0dHQkFLKQorI2RlZmluZSBMQVBBQ0tfZGdnYmFrIExBUEFDS19HTE9CQUwoZGdnYmFrLERHR0JBSykKKyNkZWZpbmUgTEFQQUNLX2NnZ2JhayBMQVBBQ0tfR0xPQkFMKGNnZ2JhayxDR0dCQUspCisjZGVmaW5lIExBUEFDS196Z2diYWsgTEFQQUNLX0dMT0JBTCh6Z2diYWssWkdHQkFLKQorI2RlZmluZSBMQVBBQ0tfc2hnZXF6IExBUEFDS19HTE9CQUwoc2hnZXF6LFNIR0VRWikKKyNkZWZpbmUgTEFQQUNLX2RoZ2VxeiBMQVBBQ0tfR0xPQkFMKGRoZ2VxeixESEdFUVopCisjZGVmaW5lIExBUEFDS19jaGdlcXogTEFQQUNLX0dMT0JBTChjaGdlcXosQ0hHRVFaKQorI2RlZmluZSBMQVBBQ0tfemhnZXF6IExBUEFDS19HTE9CQUwoemhnZXF6LFpIR0VRWikKKyNkZWZpbmUgTEFQQUNLX3N0Z2V2YyBMQVBBQ0tfR0xPQkFMKHN0Z2V2YyxTVEdFVkMpCisjZGVmaW5lIExBUEFDS19kdGdldmMgTEFQQUNLX0dMT0JBTChkdGdldmMsRFRHRVZDKQorI2RlZmluZSBMQVBBQ0tfY3RnZXZjIExBUEFDS19HTE9CQUwoY3RnZXZjLENUR0VWQykKKyNkZWZpbmUgTEFQQUNLX3p0Z2V2YyBMQVBBQ0tfR0xPQkFMKHp0Z2V2YyxaVEdFVkMpCisjZGVmaW5lIExBUEFDS19zdGdleGMgTEFQQUNLX0dMT0JBTChzdGdleGMsU1RHRVhDKQorI2RlZmluZSBMQVBBQ0tfZHRnZXhjIExBUEFDS19HTE9CQUwoZHRnZXhjLERUR0VYQykKKyNkZWZpbmUgTEFQQUNLX2N0Z2V4YyBMQVBBQ0tfR0xPQkFMKGN0Z2V4YyxDVEdFWEMpCisjZGVmaW5lIExBUEFDS196dGdleGMgTEFQQUNLX0dMT0JBTCh6dGdleGMsWlRHRVhDKQorI2RlZmluZSBMQVBBQ0tfc3Rnc2VuIExBUEFDS19HTE9CQUwoc3Rnc2VuLFNUR1NFTikKKyNkZWZpbmUgTEFQQUNLX2R0Z3NlbiBMQVBBQ0tfR0xPQkFMKGR0Z3NlbixEVEdTRU4pCisjZGVmaW5lIExBUEFDS19jdGdzZW4gTEFQQUNLX0dMT0JBTChjdGdzZW4sQ1RHU0VOKQorI2RlZmluZSBMQVBBQ0tfenRnc2VuIExBUEFDS19HTE9CQUwoenRnc2VuLFpUR1NFTikKKyNkZWZpbmUgTEFQQUNLX3N0Z3N5bCBMQVBBQ0tfR0xPQkFMKHN0Z3N5bCxTVEdTWUwpCisjZGVmaW5lIExBUEFDS19kdGdzeWwgTEFQQUNLX0dMT0JBTChkdGdzeWwsRFRHU1lMKQorI2RlZmluZSBMQVBBQ0tfY3Rnc3lsIExBUEFDS19HTE9CQUwoY3Rnc3lsLENUR1NZTCkKKyNkZWZpbmUgTEFQQUNLX3p0Z3N5bCBMQVBBQ0tfR0xPQkFMKHp0Z3N5bCxaVEdTWUwpCisjZGVmaW5lIExBUEFDS19zdGdzbmEgTEFQQUNLX0dMT0JBTChzdGdzbmEsU1RHU05BKQorI2RlZmluZSBMQVBBQ0tfZHRnc25hIExBUEFDS19HTE9CQUwoZHRnc25hLERUR1NOQSkKKyNkZWZpbmUgTEFQQUNLX2N0Z3NuYSBMQVBBQ0tfR0xPQkFMKGN0Z3NuYSxDVEdTTkEpCisjZGVmaW5lIExBUEFDS196dGdzbmEgTEFQQUNLX0dMT0JBTCh6dGdzbmEsWlRHU05BKQorI2RlZmluZSBMQVBBQ0tfc2dnc3ZwIExBUEFDS19HTE9CQUwoc2dnc3ZwLFNHR1NWUCkKKyNkZWZpbmUgTEFQQUNLX2RnZ3N2cCBMQVBBQ0tfR0xPQkFMKGRnZ3N2cCxER0dTVlApCisjZGVmaW5lIExBUEFDS19jZ2dzdnAgTEFQQUNLX0dMT0JBTChjZ2dzdnAsQ0dHU1ZQKQorI2RlZmluZSBMQVBBQ0tfemdnc3ZwIExBUEFDS19HTE9CQUwoemdnc3ZwLFpHR1NWUCkKKyNkZWZpbmUgTEFQQUNLX3N0Z3NqYSBMQVBBQ0tfR0xPQkFMKHN0Z3NqYSxTVEdTSkEpCisjZGVmaW5lIExBUEFDS19kdGdzamEgTEFQQUNLX0dMT0JBTChkdGdzamEsRFRHU0pBKQorI2RlZmluZSBMQVBBQ0tfY3Rnc2phIExBUEFDS19HTE9CQUwoY3Rnc2phLENUR1NKQSkKKyNkZWZpbmUgTEFQQUNLX3p0Z3NqYSBMQVBBQ0tfR0xPQkFMKHp0Z3NqYSxaVEdTSkEpCisjZGVmaW5lIExBUEFDS19zZ2VscyBMQVBBQ0tfR0xPQkFMKHNnZWxzLFNHRUxTKQorI2RlZmluZSBMQVBBQ0tfZGdlbHMgTEFQQUNLX0dMT0JBTChkZ2VscyxER0VMUykKKyNkZWZpbmUgTEFQQUNLX2NnZWxzIExBUEFDS19HTE9CQUwoY2dlbHMsQ0dFTFMpCisjZGVmaW5lIExBUEFDS196Z2VscyBMQVBBQ0tfR0xPQkFMKHpnZWxzLFpHRUxTKQorI2RlZmluZSBMQVBBQ0tfc2dlbHN5IExBUEFDS19HTE9CQUwoc2dlbHN5LFNHRUxTWSkKKyNkZWZpbmUgTEFQQUNLX2RnZWxzeSBMQVBBQ0tfR0xPQkFMKGRnZWxzeSxER0VMU1kpCisjZGVmaW5lIExBUEFDS19jZ2Vsc3kgTEFQQUNLX0dMT0JBTChjZ2Vsc3ksQ0dFTFNZKQorI2RlZmluZSBMQVBBQ0tfemdlbHN5IExBUEFDS19HTE9CQUwoemdlbHN5LFpHRUxTWSkKKyNkZWZpbmUgTEFQQUNLX3NnZWxzcyBMQVBBQ0tfR0xPQkFMKHNnZWxzcyxTR0VMU1MpCisjZGVmaW5lIExBUEFDS19kZ2Vsc3MgTEFQQUNLX0dMT0JBTChkZ2Vsc3MsREdFTFNTKQorI2RlZmluZSBMQVBBQ0tfY2dlbHNzIExBUEFDS19HTE9CQUwoY2dlbHNzLENHRUxTUykKKyNkZWZpbmUgTEFQQUNLX3pnZWxzcyBMQVBBQ0tfR0xPQkFMKHpnZWxzcyxaR0VMU1MpCisjZGVmaW5lIExBUEFDS19zZ2Vsc2QgTEFQQUNLX0dMT0JBTChzZ2Vsc2QsU0dFTFNEKQorI2RlZmluZSBMQVBBQ0tfZGdlbHNkIExBUEFDS19HTE9CQUwoZGdlbHNkLERHRUxTRCkKKyNkZWZpbmUgTEFQQUNLX2NnZWxzZCBMQVBBQ0tfR0xPQkFMKGNnZWxzZCxDR0VMU0QpCisjZGVmaW5lIExBUEFDS196Z2Vsc2QgTEFQQUNLX0dMT0JBTCh6Z2Vsc2QsWkdFTFNEKQorI2RlZmluZSBMQVBBQ0tfc2dnbHNlIExBUEFDS19HTE9CQUwoc2dnbHNlLFNHR0xTRSkKKyNkZWZpbmUgTEFQQUNLX2RnZ2xzZSBMQVBBQ0tfR0xPQkFMKGRnZ2xzZSxER0dMU0UpCisjZGVmaW5lIExBUEFDS19jZ2dsc2UgTEFQQUNLX0dMT0JBTChjZ2dsc2UsQ0dHTFNFKQorI2RlZmluZSBMQVBBQ0tfemdnbHNlIExBUEFDS19HTE9CQUwoemdnbHNlLFpHR0xTRSkKKyNkZWZpbmUgTEFQQUNLX3NnZ2dsbSBMQVBBQ0tfR0xPQkFMKHNnZ2dsbSxTR0dHTE0pCisjZGVmaW5lIExBUEFDS19kZ2dnbG0gTEFQQUNLX0dMT0JBTChkZ2dnbG0sREdHR0xNKQorI2RlZmluZSBMQVBBQ0tfY2dnZ2xtIExBUEFDS19HTE9CQUwoY2dnZ2xtLENHR0dMTSkKKyNkZWZpbmUgTEFQQUNLX3pnZ2dsbSBMQVBBQ0tfR0xPQkFMKHpnZ2dsbSxaR0dHTE0pCisjZGVmaW5lIExBUEFDS19zc3lldiBMQVBBQ0tfR0xPQkFMKHNzeWV2LFNTWUVWKQorI2RlZmluZSBMQVBBQ0tfZHN5ZXYgTEFQQUNLX0dMT0JBTChkc3lldixEU1lFVikKKyNkZWZpbmUgTEFQQUNLX2NoZWV2IExBUEFDS19HTE9CQUwoY2hlZXYsQ0hFRVYpCisjZGVmaW5lIExBUEFDS196aGVldiBMQVBBQ0tfR0xPQkFMKHpoZWV2LFpIRUVWKQorI2RlZmluZSBMQVBBQ0tfc3N5ZXZkIExBUEFDS19HTE9CQUwoc3N5ZXZkLFNTWUVWRCkKKyNkZWZpbmUgTEFQQUNLX2RzeWV2ZCBMQVBBQ0tfR0xPQkFMKGRzeWV2ZCxEU1lFVkQpCisjZGVmaW5lIExBUEFDS19jaGVldmQgTEFQQUNLX0dMT0JBTChjaGVldmQsQ0hFRVZEKQorI2RlZmluZSBMQVBBQ0tfemhlZXZkIExBUEFDS19HTE9CQUwoemhlZXZkLFpIRUVWRCkKKyNkZWZpbmUgTEFQQUNLX3NzeWV2eCBMQVBBQ0tfR0xPQkFMKHNzeWV2eCxTU1lFVlgpCisjZGVmaW5lIExBUEFDS19kc3lldnggTEFQQUNLX0dMT0JBTChkc3lldngsRFNZRVZYKQorI2RlZmluZSBMQVBBQ0tfY2hlZXZ4IExBUEFDS19HTE9CQUwoY2hlZXZ4LENIRUVWWCkKKyNkZWZpbmUgTEFQQUNLX3poZWV2eCBMQVBBQ0tfR0xPQkFMKHpoZWV2eCxaSEVFVlgpCisjZGVmaW5lIExBUEFDS19zc3lldnIgTEFQQUNLX0dMT0JBTChzc3lldnIsU1NZRVZSKQorI2RlZmluZSBMQVBBQ0tfZHN5ZXZyIExBUEFDS19HTE9CQUwoZHN5ZXZyLERTWUVWUikKKyNkZWZpbmUgTEFQQUNLX2NoZWV2ciBMQVBBQ0tfR0xPQkFMKGNoZWV2cixDSEVFVlIpCisjZGVmaW5lIExBUEFDS196aGVldnIgTEFQQUNLX0dMT0JBTCh6aGVldnIsWkhFRVZSKQorI2RlZmluZSBMQVBBQ0tfc3NwZXYgTEFQQUNLX0dMT0JBTChzc3BldixTU1BFVikKKyNkZWZpbmUgTEFQQUNLX2RzcGV2IExBUEFDS19HTE9CQUwoZHNwZXYsRFNQRVYpCisjZGVmaW5lIExBUEFDS19jaHBldiBMQVBBQ0tfR0xPQkFMKGNocGV2LENIUEVWKQorI2RlZmluZSBMQVBBQ0tfemhwZXYgTEFQQUNLX0dMT0JBTCh6aHBldixaSFBFVikKKyNkZWZpbmUgTEFQQUNLX3NzcGV2ZCBMQVBBQ0tfR0xPQkFMKHNzcGV2ZCxTU1BFVkQpCisjZGVmaW5lIExBUEFDS19kc3BldmQgTEFQQUNLX0dMT0JBTChkc3BldmQsRFNQRVZEKQorI2RlZmluZSBMQVBBQ0tfY2hwZXZkIExBUEFDS19HTE9CQUwoY2hwZXZkLENIUEVWRCkKKyNkZWZpbmUgTEFQQUNLX3pocGV2ZCBMQVBBQ0tfR0xPQkFMKHpocGV2ZCxaSFBFVkQpCisjZGVmaW5lIExBUEFDS19zc3BldnggTEFQQUNLX0dMT0JBTChzc3BldngsU1NQRVZYKQorI2RlZmluZSBMQVBBQ0tfZHNwZXZ4IExBUEFDS19HTE9CQUwoZHNwZXZ4LERTUEVWWCkKKyNkZWZpbmUgTEFQQUNLX2NocGV2eCBMQVBBQ0tfR0xPQkFMKGNocGV2eCxDSFBFVlgpCisjZGVmaW5lIExBUEFDS196aHBldnggTEFQQUNLX0dMT0JBTCh6aHBldngsWkhQRVZYKQorI2RlZmluZSBMQVBBQ0tfc3NiZXYgTEFQQUNLX0dMT0JBTChzc2JldixTU0JFVikKKyNkZWZpbmUgTEFQQUNLX2RzYmV2IExBUEFDS19HTE9CQUwoZHNiZXYsRFNCRVYpCisjZGVmaW5lIExBUEFDS19jaGJldiBMQVBBQ0tfR0xPQkFMKGNoYmV2LENIQkVWKQorI2RlZmluZSBMQVBBQ0tfemhiZXYgTEFQQUNLX0dMT0JBTCh6aGJldixaSEJFVikKKyNkZWZpbmUgTEFQQUNLX3NzYmV2ZCBMQVBBQ0tfR0xPQkFMKHNzYmV2ZCxTU0JFVkQpCisjZGVmaW5lIExBUEFDS19kc2JldmQgTEFQQUNLX0dMT0JBTChkc2JldmQsRFNCRVZEKQorI2RlZmluZSBMQVBBQ0tfY2hiZXZkIExBUEFDS19HTE9CQUwoY2hiZXZkLENIQkVWRCkKKyNkZWZpbmUgTEFQQUNLX3poYmV2ZCBMQVBBQ0tfR0xPQkFMKHpoYmV2ZCxaSEJFVkQpCisjZGVmaW5lIExBUEFDS19zc2JldnggTEFQQUNLX0dMT0JBTChzc2JldngsU1NCRVZYKQorI2RlZmluZSBMQVBBQ0tfZHNiZXZ4IExBUEFDS19HTE9CQUwoZHNiZXZ4LERTQkVWWCkKKyNkZWZpbmUgTEFQQUNLX2NoYmV2eCBMQVBBQ0tfR0xPQkFMKGNoYmV2eCxDSEJFVlgpCisjZGVmaW5lIExBUEFDS196aGJldnggTEFQQUNLX0dMT0JBTCh6aGJldngsWkhCRVZYKQorI2RlZmluZSBMQVBBQ0tfc3N0ZXYgTEFQQUNLX0dMT0JBTChzc3RldixTU1RFVikKKyNkZWZpbmUgTEFQQUNLX2RzdGV2IExBUEFDS19HTE9CQUwoZHN0ZXYsRFNURVYpCisjZGVmaW5lIExBUEFDS19zc3RldmQgTEFQQUNLX0dMT0JBTChzc3RldmQsU1NURVZEKQorI2RlZmluZSBMQVBBQ0tfZHN0ZXZkIExBUEFDS19HTE9CQUwoZHN0ZXZkLERTVEVWRCkKKyNkZWZpbmUgTEFQQUNLX3NzdGV2eCBMQVBBQ0tfR0xPQkFMKHNzdGV2eCxTU1RFVlgpCisjZGVmaW5lIExBUEFDS19kc3RldnggTEFQQUNLX0dMT0JBTChkc3RldngsRFNURVZYKQorI2RlZmluZSBMQVBBQ0tfc3N0ZXZyIExBUEFDS19HTE9CQUwoc3N0ZXZyLFNTVEVWUikKKyNkZWZpbmUgTEFQQUNLX2RzdGV2ciBMQVBBQ0tfR0xPQkFMKGRzdGV2cixEU1RFVlIpCisjZGVmaW5lIExBUEFDS19zZ2VlcyBMQVBBQ0tfR0xPQkFMKHNnZWVzLFNHRUVTKQorI2RlZmluZSBMQVBBQ0tfZGdlZXMgTEFQQUNLX0dMT0JBTChkZ2VlcyxER0VFUykKKyNkZWZpbmUgTEFQQUNLX2NnZWVzIExBUEFDS19HTE9CQUwoY2dlZXMsQ0dFRVMpCisjZGVmaW5lIExBUEFDS196Z2VlcyBMQVBBQ0tfR0xPQkFMKHpnZWVzLFpHRUVTKQorI2RlZmluZSBMQVBBQ0tfc2dlZXN4IExBUEFDS19HTE9CQUwoc2dlZXN4LFNHRUVTWCkKKyNkZWZpbmUgTEFQQUNLX2RnZWVzeCBMQVBBQ0tfR0xPQkFMKGRnZWVzeCxER0VFU1gpCisjZGVmaW5lIExBUEFDS19jZ2Vlc3ggTEFQQUNLX0dMT0JBTChjZ2Vlc3gsQ0dFRVNYKQorI2RlZmluZSBMQVBBQ0tfemdlZXN4IExBUEFDS19HTE9CQUwoemdlZXN4LFpHRUVTWCkKKyNkZWZpbmUgTEFQQUNLX3NnZWV2IExBUEFDS19HTE9CQUwoc2dlZXYsU0dFRVYpCisjZGVmaW5lIExBUEFDS19kZ2VldiBMQVBBQ0tfR0xPQkFMKGRnZWV2LERHRUVWKQorI2RlZmluZSBMQVBBQ0tfY2dlZXYgTEFQQUNLX0dMT0JBTChjZ2VldixDR0VFVikKKyNkZWZpbmUgTEFQQUNLX3pnZWV2IExBUEFDS19HTE9CQUwoemdlZXYsWkdFRVYpCisjZGVmaW5lIExBUEFDS19zZ2VldnggTEFQQUNLX0dMT0JBTChzZ2VldngsU0dFRVZYKQorI2RlZmluZSBMQVBBQ0tfZGdlZXZ4IExBUEFDS19HTE9CQUwoZGdlZXZ4LERHRUVWWCkKKyNkZWZpbmUgTEFQQUNLX2NnZWV2eCBMQVBBQ0tfR0xPQkFMKGNnZWV2eCxDR0VFVlgpCisjZGVmaW5lIExBUEFDS196Z2VldnggTEFQQUNLX0dMT0JBTCh6Z2VldngsWkdFRVZYKQorI2RlZmluZSBMQVBBQ0tfc2dlc3ZkIExBUEFDS19HTE9CQUwoc2dlc3ZkLFNHRVNWRCkKKyNkZWZpbmUgTEFQQUNLX2RnZXN2ZCBMQVBBQ0tfR0xPQkFMKGRnZXN2ZCxER0VTVkQpCisjZGVmaW5lIExBUEFDS19jZ2VzdmQgTEFQQUNLX0dMT0JBTChjZ2VzdmQsQ0dFU1ZEKQorI2RlZmluZSBMQVBBQ0tfemdlc3ZkIExBUEFDS19HTE9CQUwoemdlc3ZkLFpHRVNWRCkKKyNkZWZpbmUgTEFQQUNLX3NnZXNkZCBMQVBBQ0tfR0xPQkFMKHNnZXNkZCxTR0VTREQpCisjZGVmaW5lIExBUEFDS19kZ2VzZGQgTEFQQUNLX0dMT0JBTChkZ2VzZGQsREdFU0REKQorI2RlZmluZSBMQVBBQ0tfY2dlc2RkIExBUEFDS19HTE9CQUwoY2dlc2RkLENHRVNERCkKKyNkZWZpbmUgTEFQQUNLX3pnZXNkZCBMQVBBQ0tfR0xPQkFMKHpnZXNkZCxaR0VTREQpCisjZGVmaW5lIExBUEFDS19kZ2Vqc3YgTEFQQUNLX0dMT0JBTChkZ2Vqc3YsREdFSlNWKQorI2RlZmluZSBMQVBBQ0tfc2dlanN2IExBUEFDS19HTE9CQUwoc2dlanN2LFNHRUpTVikKKyNkZWZpbmUgTEFQQUNLX2RnZXN2aiBMQVBBQ0tfR0xPQkFMKGRnZXN2aixER0VTVkopCisjZGVmaW5lIExBUEFDS19zZ2VzdmogTEFQQUNLX0dMT0JBTChzZ2VzdmosU0dFU1ZKKQorI2RlZmluZSBMQVBBQ0tfc2dnc3ZkIExBUEFDS19HTE9CQUwoc2dnc3ZkLFNHR1NWRCkKKyNkZWZpbmUgTEFQQUNLX2RnZ3N2ZCBMQVBBQ0tfR0xPQkFMKGRnZ3N2ZCxER0dTVkQpCisjZGVmaW5lIExBUEFDS19jZ2dzdmQgTEFQQUNLX0dMT0JBTChjZ2dzdmQsQ0dHU1ZEKQorI2RlZmluZSBMQVBBQ0tfemdnc3ZkIExBUEFDS19HTE9CQUwoemdnc3ZkLFpHR1NWRCkKKyNkZWZpbmUgTEFQQUNLX3NzeWd2IExBUEFDS19HTE9CQUwoc3N5Z3YsU1NZR1YpCisjZGVmaW5lIExBUEFDS19kc3lndiBMQVBBQ0tfR0xPQkFMKGRzeWd2LERTWUdWKQorI2RlZmluZSBMQVBBQ0tfY2hlZ3YgTEFQQUNLX0dMT0JBTChjaGVndixDSEVHVikKKyNkZWZpbmUgTEFQQUNLX3poZWd2IExBUEFDS19HTE9CQUwoemhlZ3YsWkhFR1YpCisjZGVmaW5lIExBUEFDS19zc3lndmQgTEFQQUNLX0dMT0JBTChzc3lndmQsU1NZR1ZEKQorI2RlZmluZSBMQVBBQ0tfZHN5Z3ZkIExBUEFDS19HTE9CQUwoZHN5Z3ZkLERTWUdWRCkKKyNkZWZpbmUgTEFQQUNLX2NoZWd2ZCBMQVBBQ0tfR0xPQkFMKGNoZWd2ZCxDSEVHVkQpCisjZGVmaW5lIExBUEFDS196aGVndmQgTEFQQUNLX0dMT0JBTCh6aGVndmQsWkhFR1ZEKQorI2RlZmluZSBMQVBBQ0tfc3N5Z3Z4IExBUEFDS19HTE9CQUwoc3N5Z3Z4LFNTWUdWWCkKKyNkZWZpbmUgTEFQQUNLX2RzeWd2eCBMQVBBQ0tfR0xPQkFMKGRzeWd2eCxEU1lHVlgpCisjZGVmaW5lIExBUEFDS19jaGVndnggTEFQQUNLX0dMT0JBTChjaGVndngsQ0hFR1ZYKQorI2RlZmluZSBMQVBBQ0tfemhlZ3Z4IExBUEFDS19HTE9CQUwoemhlZ3Z4LFpIRUdWWCkKKyNkZWZpbmUgTEFQQUNLX3NzcGd2IExBUEFDS19HTE9CQUwoc3NwZ3YsU1NQR1YpCisjZGVmaW5lIExBUEFDS19kc3BndiBMQVBBQ0tfR0xPQkFMKGRzcGd2LERTUEdWKQorI2RlZmluZSBMQVBBQ0tfY2hwZ3YgTEFQQUNLX0dMT0JBTChjaHBndixDSFBHVikKKyNkZWZpbmUgTEFQQUNLX3pocGd2IExBUEFDS19HTE9CQUwoemhwZ3YsWkhQR1YpCisjZGVmaW5lIExBUEFDS19zc3BndmQgTEFQQUNLX0dMT0JBTChzc3BndmQsU1NQR1ZEKQorI2RlZmluZSBMQVBBQ0tfZHNwZ3ZkIExBUEFDS19HTE9CQUwoZHNwZ3ZkLERTUEdWRCkKKyNkZWZpbmUgTEFQQUNLX2NocGd2ZCBMQVBBQ0tfR0xPQkFMKGNocGd2ZCxDSFBHVkQpCisjZGVmaW5lIExBUEFDS196aHBndmQgTEFQQUNLX0dMT0JBTCh6aHBndmQsWkhQR1ZEKQorI2RlZmluZSBMQVBBQ0tfc3NwZ3Z4IExBUEFDS19HTE9CQUwoc3NwZ3Z4LFNTUEdWWCkKKyNkZWZpbmUgTEFQQUNLX2RzcGd2eCBMQVBBQ0tfR0xPQkFMKGRzcGd2eCxEU1BHVlgpCisjZGVmaW5lIExBUEFDS19jaHBndnggTEFQQUNLX0dMT0JBTChjaHBndngsQ0hQR1ZYKQorI2RlZmluZSBMQVBBQ0tfemhwZ3Z4IExBUEFDS19HTE9CQUwoemhwZ3Z4LFpIUEdWWCkKKyNkZWZpbmUgTEFQQUNLX3NzYmd2IExBUEFDS19HTE9CQUwoc3NiZ3YsU1NCR1YpCisjZGVmaW5lIExBUEFDS19kc2JndiBMQVBBQ0tfR0xPQkFMKGRzYmd2LERTQkdWKQorI2RlZmluZSBMQVBBQ0tfY2hiZ3YgTEFQQUNLX0dMT0JBTChjaGJndixDSEJHVikKKyNkZWZpbmUgTEFQQUNLX3poYmd2IExBUEFDS19HTE9CQUwoemhiZ3YsWkhCR1YpCisjZGVmaW5lIExBUEFDS19zc2JndmQgTEFQQUNLX0dMT0JBTChzc2JndmQsU1NCR1ZEKQorI2RlZmluZSBMQVBBQ0tfZHNiZ3ZkIExBUEFDS19HTE9CQUwoZHNiZ3ZkLERTQkdWRCkKKyNkZWZpbmUgTEFQQUNLX2NoYmd2ZCBMQVBBQ0tfR0xPQkFMKGNoYmd2ZCxDSEJHVkQpCisjZGVmaW5lIExBUEFDS196aGJndmQgTEFQQUNLX0dMT0JBTCh6aGJndmQsWkhCR1ZEKQorI2RlZmluZSBMQVBBQ0tfc3NiZ3Z4IExBUEFDS19HTE9CQUwoc3NiZ3Z4LFNTQkdWWCkKKyNkZWZpbmUgTEFQQUNLX2RzYmd2eCBMQVBBQ0tfR0xPQkFMKGRzYmd2eCxEU0JHVlgpCisjZGVmaW5lIExBUEFDS19jaGJndnggTEFQQUNLX0dMT0JBTChjaGJndngsQ0hCR1ZYKQorI2RlZmluZSBMQVBBQ0tfemhiZ3Z4IExBUEFDS19HTE9CQUwoemhiZ3Z4LFpIQkdWWCkKKyNkZWZpbmUgTEFQQUNLX3NnZ2VzIExBUEFDS19HTE9CQUwoc2dnZXMsU0dHRVMpCisjZGVmaW5lIExBUEFDS19kZ2dlcyBMQVBBQ0tfR0xPQkFMKGRnZ2VzLERHR0VTKQorI2RlZmluZSBMQVBBQ0tfY2dnZXMgTEFQQUNLX0dMT0JBTChjZ2dlcyxDR0dFUykKKyNkZWZpbmUgTEFQQUNLX3pnZ2VzIExBUEFDS19HTE9CQUwoemdnZXMsWkdHRVMpCisjZGVmaW5lIExBUEFDS19zZ2dlc3ggTEFQQUNLX0dMT0JBTChzZ2dlc3gsU0dHRVNYKQorI2RlZmluZSBMQVBBQ0tfZGdnZXN4IExBUEFDS19HTE9CQUwoZGdnZXN4LERHR0VTWCkKKyNkZWZpbmUgTEFQQUNLX2NnZ2VzeCBMQVBBQ0tfR0xPQkFMKGNnZ2VzeCxDR0dFU1gpCisjZGVmaW5lIExBUEFDS196Z2dlc3ggTEFQQUNLX0dMT0JBTCh6Z2dlc3gsWkdHRVNYKQorI2RlZmluZSBMQVBBQ0tfc2dnZXYgTEFQQUNLX0dMT0JBTChzZ2dldixTR0dFVikKKyNkZWZpbmUgTEFQQUNLX2RnZ2V2IExBUEFDS19HTE9CQUwoZGdnZXYsREdHRVYpCisjZGVmaW5lIExBUEFDS19jZ2dldiBMQVBBQ0tfR0xPQkFMKGNnZ2V2LENHR0VWKQorI2RlZmluZSBMQVBBQ0tfemdnZXYgTEFQQUNLX0dMT0JBTCh6Z2dldixaR0dFVikKKyNkZWZpbmUgTEFQQUNLX3NnZ2V2eCBMQVBBQ0tfR0xPQkFMKHNnZ2V2eCxTR0dFVlgpCisjZGVmaW5lIExBUEFDS19kZ2dldnggTEFQQUNLX0dMT0JBTChkZ2dldngsREdHRVZYKQorI2RlZmluZSBMQVBBQ0tfY2dnZXZ4IExBUEFDS19HTE9CQUwoY2dnZXZ4LENHR0VWWCkKKyNkZWZpbmUgTEFQQUNLX3pnZ2V2eCBMQVBBQ0tfR0xPQkFMKHpnZ2V2eCxaR0dFVlgpCisjZGVmaW5lIExBUEFDS19kc2ZyayBMQVBBQ0tfR0xPQkFMKGRzZnJrLERTRlJLKQorI2RlZmluZSBMQVBBQ0tfc3NmcmsgTEFQQUNLX0dMT0JBTChzc2ZyayxTU0ZSSykKKyNkZWZpbmUgTEFQQUNLX3poZnJrIExBUEFDS19HTE9CQUwoemhmcmssWkhGUkspCisjZGVmaW5lIExBUEFDS19jaGZyayBMQVBBQ0tfR0xPQkFMKGNoZnJrLENIRlJLKQorI2RlZmluZSBMQVBBQ0tfZHRmc20gTEFQQUNLX0dMT0JBTChkdGZzbSxEVEZTTSkKKyNkZWZpbmUgTEFQQUNLX3N0ZnNtIExBUEFDS19HTE9CQUwoc3Rmc20sU1RGU00pCisjZGVmaW5lIExBUEFDS196dGZzbSBMQVBBQ0tfR0xPQkFMKHp0ZnNtLFpURlNNKQorI2RlZmluZSBMQVBBQ0tfY3Rmc20gTEFQQUNLX0dMT0JBTChjdGZzbSxDVEZTTSkKKyNkZWZpbmUgTEFQQUNLX2R0ZnR0cCBMQVBBQ0tfR0xPQkFMKGR0ZnR0cCxEVEZUVFApCisjZGVmaW5lIExBUEFDS19zdGZ0dHAgTEFQQUNLX0dMT0JBTChzdGZ0dHAsU1RGVFRQKQorI2RlZmluZSBMQVBBQ0tfenRmdHRwIExBUEFDS19HTE9CQUwoenRmdHRwLFpURlRUUCkKKyNkZWZpbmUgTEFQQUNLX2N0ZnR0cCBMQVBBQ0tfR0xPQkFMKGN0ZnR0cCxDVEZUVFApCisjZGVmaW5lIExBUEFDS19kdGZ0dHIgTEFQQUNLX0dMT0JBTChkdGZ0dHIsRFRGVFRSKQorI2RlZmluZSBMQVBBQ0tfc3RmdHRyIExBUEFDS19HTE9CQUwoc3RmdHRyLFNURlRUUikKKyNkZWZpbmUgTEFQQUNLX3p0ZnR0ciBMQVBBQ0tfR0xPQkFMKHp0ZnR0cixaVEZUVFIpCisjZGVmaW5lIExBUEFDS19jdGZ0dHIgTEFQQUNLX0dMT0JBTChjdGZ0dHIsQ1RGVFRSKQorI2RlZmluZSBMQVBBQ0tfZHRwdHRmIExBUEFDS19HTE9CQUwoZHRwdHRmLERUUFRURikKKyNkZWZpbmUgTEFQQUNLX3N0cHR0ZiBMQVBBQ0tfR0xPQkFMKHN0cHR0ZixTVFBUVEYpCisjZGVmaW5lIExBUEFDS196dHB0dGYgTEFQQUNLX0dMT0JBTCh6dHB0dGYsWlRQVFRGKQorI2RlZmluZSBMQVBBQ0tfY3RwdHRmIExBUEFDS19HTE9CQUwoY3RwdHRmLENUUFRURikKKyNkZWZpbmUgTEFQQUNLX2R0cHR0ciBMQVBBQ0tfR0xPQkFMKGR0cHR0cixEVFBUVFIpCisjZGVmaW5lIExBUEFDS19zdHB0dHIgTEFQQUNLX0dMT0JBTChzdHB0dHIsU1RQVFRSKQorI2RlZmluZSBMQVBBQ0tfenRwdHRyIExBUEFDS19HTE9CQUwoenRwdHRyLFpUUFRUUikKKyNkZWZpbmUgTEFQQUNLX2N0cHR0ciBMQVBBQ0tfR0xPQkFMKGN0cHR0cixDVFBUVFIpCisjZGVmaW5lIExBUEFDS19kdHJ0dGYgTEFQQUNLX0dMT0JBTChkdHJ0dGYsRFRSVFRGKQorI2RlZmluZSBMQVBBQ0tfc3RydHRmIExBUEFDS19HTE9CQUwoc3RydHRmLFNUUlRURikKKyNkZWZpbmUgTEFQQUNLX3p0cnR0ZiBMQVBBQ0tfR0xPQkFMKHp0cnR0ZixaVFJUVEYpCisjZGVmaW5lIExBUEFDS19jdHJ0dGYgTEFQQUNLX0dMT0JBTChjdHJ0dGYsQ1RSVFRGKQorI2RlZmluZSBMQVBBQ0tfZHRydHRwIExBUEFDS19HTE9CQUwoZHRydHRwLERUUlRUUCkKKyNkZWZpbmUgTEFQQUNLX3N0cnR0cCBMQVBBQ0tfR0xPQkFMKHN0cnR0cCxTVFJUVFApCisjZGVmaW5lIExBUEFDS196dHJ0dHAgTEFQQUNLX0dMT0JBTCh6dHJ0dHAsWlRSVFRQKQorI2RlZmluZSBMQVBBQ0tfY3RydHRwIExBUEFDS19HTE9CQUwoY3RydHRwLENUUlRUUCkKKyNkZWZpbmUgTEFQQUNLX3NnZXFyZnAgTEFQQUNLX0dMT0JBTChzZ2VxcmZwLFNHRVFSRlApCisjZGVmaW5lIExBUEFDS19kZ2VxcmZwIExBUEFDS19HTE9CQUwoZGdlcXJmcCxER0VRUkZQKQorI2RlZmluZSBMQVBBQ0tfY2dlcXJmcCBMQVBBQ0tfR0xPQkFMKGNnZXFyZnAsQ0dFUVJGUCkKKyNkZWZpbmUgTEFQQUNLX3pnZXFyZnAgTEFQQUNLX0dMT0JBTCh6Z2VxcmZwLFpHRVFSRlApCisjZGVmaW5lIExBUEFDS19jbGFjZ3YgTEFQQUNLX0dMT0JBTChjbGFjZ3YsQ0xBQ0dWKQorI2RlZmluZSBMQVBBQ0tfemxhY2d2IExBUEFDS19HTE9CQUwoemxhY2d2LFpMQUNHVikKKyNkZWZpbmUgTEFQQUNLX3NsYXJudiBMQVBBQ0tfR0xPQkFMKHNsYXJudixTTEFSTlYpCisjZGVmaW5lIExBUEFDS19kbGFybnYgTEFQQUNLX0dMT0JBTChkbGFybnYsRExBUk5WKQorI2RlZmluZSBMQVBBQ0tfY2xhcm52IExBUEFDS19HTE9CQUwoY2xhcm52LENMQVJOVikKKyNkZWZpbmUgTEFQQUNLX3psYXJudiBMQVBBQ0tfR0xPQkFMKHpsYXJudixaTEFSTlYpCisjZGVmaW5lIExBUEFDS19zZ2VxcjIgTEFQQUNLX0dMT0JBTChzZ2VxcjIsU0dFUVIyKQorI2RlZmluZSBMQVBBQ0tfZGdlcXIyIExBUEFDS19HTE9CQUwoZGdlcXIyLERHRVFSMikKKyNkZWZpbmUgTEFQQUNLX2NnZXFyMiBMQVBBQ0tfR0xPQkFMKGNnZXFyMixDR0VRUjIpCisjZGVmaW5lIExBUEFDS196Z2VxcjIgTEFQQUNLX0dMT0JBTCh6Z2VxcjIsWkdFUVIyKQorI2RlZmluZSBMQVBBQ0tfc2xhY3B5IExBUEFDS19HTE9CQUwoc2xhY3B5LFNMQUNQWSkKKyNkZWZpbmUgTEFQQUNLX2RsYWNweSBMQVBBQ0tfR0xPQkFMKGRsYWNweSxETEFDUFkpCisjZGVmaW5lIExBUEFDS19jbGFjcHkgTEFQQUNLX0dMT0JBTChjbGFjcHksQ0xBQ1BZKQorI2RlZmluZSBMQVBBQ0tfemxhY3B5IExBUEFDS19HTE9CQUwoemxhY3B5LFpMQUNQWSkKKyNkZWZpbmUgTEFQQUNLX3NnZXRmMiBMQVBBQ0tfR0xPQkFMKHNnZXRmMixTR0VURjIpCisjZGVmaW5lIExBUEFDS19kZ2V0ZjIgTEFQQUNLX0dMT0JBTChkZ2V0ZjIsREdFVEYyKQorI2RlZmluZSBMQVBBQ0tfY2dldGYyIExBUEFDS19HTE9CQUwoY2dldGYyLENHRVRGMikKKyNkZWZpbmUgTEFQQUNLX3pnZXRmMiBMQVBBQ0tfR0xPQkFMKHpnZXRmMixaR0VURjIpCisjZGVmaW5lIExBUEFDS19zbGFzd3AgTEFQQUNLX0dMT0JBTChzbGFzd3AsU0xBU1dQKQorI2RlZmluZSBMQVBBQ0tfZGxhc3dwIExBUEFDS19HTE9CQUwoZGxhc3dwLERMQVNXUCkKKyNkZWZpbmUgTEFQQUNLX2NsYXN3cCBMQVBBQ0tfR0xPQkFMKGNsYXN3cCxDTEFTV1ApCisjZGVmaW5lIExBUEFDS196bGFzd3AgTEFQQUNLX0dMT0JBTCh6bGFzd3AsWkxBU1dQKQorI2RlZmluZSBMQVBBQ0tfc2xhbmdlIExBUEFDS19HTE9CQUwoc2xhbmdlLFNMQU5HRSkKKyNkZWZpbmUgTEFQQUNLX2RsYW5nZSBMQVBBQ0tfR0xPQkFMKGRsYW5nZSxETEFOR0UpCisjZGVmaW5lIExBUEFDS19jbGFuZ2UgTEFQQUNLX0dMT0JBTChjbGFuZ2UsQ0xBTkdFKQorI2RlZmluZSBMQVBBQ0tfemxhbmdlIExBUEFDS19HTE9CQUwoemxhbmdlLFpMQU5HRSkKKyNkZWZpbmUgTEFQQUNLX2NsYW5oZSBMQVBBQ0tfR0xPQkFMKGNsYW5oZSxDTEFOSEUpCisjZGVmaW5lIExBUEFDS196bGFuaGUgTEFQQUNLX0dMT0JBTCh6bGFuaGUsWkxBTkhFKQorI2RlZmluZSBMQVBBQ0tfc2xhbnN5IExBUEFDS19HTE9CQUwoc2xhbnN5LFNMQU5TWSkKKyNkZWZpbmUgTEFQQUNLX2RsYW5zeSBMQVBBQ0tfR0xPQkFMKGRsYW5zeSxETEFOU1kpCisjZGVmaW5lIExBUEFDS19jbGFuc3kgTEFQQUNLX0dMT0JBTChjbGFuc3ksQ0xBTlNZKQorI2RlZmluZSBMQVBBQ0tfemxhbnN5IExBUEFDS19HTE9CQUwoemxhbnN5LFpMQU5TWSkKKyNkZWZpbmUgTEFQQUNLX3NsYW50ciBMQVBBQ0tfR0xPQkFMKHNsYW50cixTTEFOVFIpCisjZGVmaW5lIExBUEFDS19kbGFudHIgTEFQQUNLX0dMT0JBTChkbGFudHIsRExBTlRSKQorI2RlZmluZSBMQVBBQ0tfY2xhbnRyIExBUEFDS19HTE9CQUwoY2xhbnRyLENMQU5UUikKKyNkZWZpbmUgTEFQQUNLX3psYW50ciBMQVBBQ0tfR0xPQkFMKHpsYW50cixaTEFOVFIpCisjZGVmaW5lIExBUEFDS19zbGFtY2ggTEFQQUNLX0dMT0JBTChzbGFtY2gsU0xBTUNIKQorI2RlZmluZSBMQVBBQ0tfZGxhbWNoIExBUEFDS19HTE9CQUwoZGxhbWNoLERMQU1DSCkKKyNkZWZpbmUgTEFQQUNLX3NnZWxxMiBMQVBBQ0tfR0xPQkFMKHNnZWxxMixTR0VMUTIpCisjZGVmaW5lIExBUEFDS19kZ2VscTIgTEFQQUNLX0dMT0JBTChkZ2VscTIsREdFTFEyKQorI2RlZmluZSBMQVBBQ0tfY2dlbHEyIExBUEFDS19HTE9CQUwoY2dlbHEyLENHRUxRMikKKyNkZWZpbmUgTEFQQUNLX3pnZWxxMiBMQVBBQ0tfR0xPQkFMKHpnZWxxMixaR0VMUTIpCisjZGVmaW5lIExBUEFDS19zbGFyZmIgTEFQQUNLX0dMT0JBTChzbGFyZmIsU0xBUkZCKQorI2RlZmluZSBMQVBBQ0tfZGxhcmZiIExBUEFDS19HTE9CQUwoZGxhcmZiLERMQVJGQikKKyNkZWZpbmUgTEFQQUNLX2NsYXJmYiBMQVBBQ0tfR0xPQkFMKGNsYXJmYixDTEFSRkIpCisjZGVmaW5lIExBUEFDS196bGFyZmIgTEFQQUNLX0dMT0JBTCh6bGFyZmIsWkxBUkZCKQorI2RlZmluZSBMQVBBQ0tfc2xhcmZnIExBUEFDS19HTE9CQUwoc2xhcmZnLFNMQVJGRykKKyNkZWZpbmUgTEFQQUNLX2RsYXJmZyBMQVBBQ0tfR0xPQkFMKGRsYXJmZyxETEFSRkcpCisjZGVmaW5lIExBUEFDS19jbGFyZmcgTEFQQUNLX0dMT0JBTChjbGFyZmcsQ0xBUkZHKQorI2RlZmluZSBMQVBBQ0tfemxhcmZnIExBUEFDS19HTE9CQUwoemxhcmZnLFpMQVJGRykKKyNkZWZpbmUgTEFQQUNLX3NsYXJmdCBMQVBBQ0tfR0xPQkFMKHNsYXJmdCxTTEFSRlQpCisjZGVmaW5lIExBUEFDS19kbGFyZnQgTEFQQUNLX0dMT0JBTChkbGFyZnQsRExBUkZUKQorI2RlZmluZSBMQVBBQ0tfY2xhcmZ0IExBUEFDS19HTE9CQUwoY2xhcmZ0LENMQVJGVCkKKyNkZWZpbmUgTEFQQUNLX3psYXJmdCBMQVBBQ0tfR0xPQkFMKHpsYXJmdCxaTEFSRlQpCisjZGVmaW5lIExBUEFDS19zbGFyZnggTEFQQUNLX0dMT0JBTChzbGFyZngsU0xBUkZYKQorI2RlZmluZSBMQVBBQ0tfZGxhcmZ4IExBUEFDS19HTE9CQUwoZGxhcmZ4LERMQVJGWCkKKyNkZWZpbmUgTEFQQUNLX2NsYXJmeCBMQVBBQ0tfR0xPQkFMKGNsYXJmeCxDTEFSRlgpCisjZGVmaW5lIExBUEFDS196bGFyZnggTEFQQUNLX0dMT0JBTCh6bGFyZngsWkxBUkZYKQorI2RlZmluZSBMQVBBQ0tfc2xhdG1zIExBUEFDS19HTE9CQUwoc2xhdG1zLFNMQVRNUykKKyNkZWZpbmUgTEFQQUNLX2RsYXRtcyBMQVBBQ0tfR0xPQkFMKGRsYXRtcyxETEFUTVMpCisjZGVmaW5lIExBUEFDS19jbGF0bXMgTEFQQUNLX0dMT0JBTChjbGF0bXMsQ0xBVE1TKQorI2RlZmluZSBMQVBBQ0tfemxhdG1zIExBUEFDS19HTE9CQUwoemxhdG1zLFpMQVRNUykKKyNkZWZpbmUgTEFQQUNLX3NsYWcyZCBMQVBBQ0tfR0xPQkFMKHNsYWcyZCxTTEFHMkQpCisjZGVmaW5lIExBUEFDS19kbGFnMnMgTEFQQUNLX0dMT0JBTChkbGFnMnMsRExBRzJTKQorI2RlZmluZSBMQVBBQ0tfY2xhZzJ6IExBUEFDS19HTE9CQUwoY2xhZzJ6LENMQUcyWikKKyNkZWZpbmUgTEFQQUNLX3psYWcyYyBMQVBBQ0tfR0xPQkFMKHpsYWcyYyxaTEFHMkMpCisjZGVmaW5lIExBUEFDS19zbGF1dW0gTEFQQUNLX0dMT0JBTChzbGF1dW0sU0xBVVVNKQorI2RlZmluZSBMQVBBQ0tfZGxhdXVtIExBUEFDS19HTE9CQUwoZGxhdXVtLERMQVVVTSkKKyNkZWZpbmUgTEFQQUNLX2NsYXV1bSBMQVBBQ0tfR0xPQkFMKGNsYXV1bSxDTEFVVU0pCisjZGVmaW5lIExBUEFDS196bGF1dW0gTEFQQUNLX0dMT0JBTCh6bGF1dW0sWkxBVVVNKQorI2RlZmluZSBMQVBBQ0tfc2xhZ2dlIExBUEFDS19HTE9CQUwoc2xhZ2dlLFNMQUdHRSkKKyNkZWZpbmUgTEFQQUNLX2RsYWdnZSBMQVBBQ0tfR0xPQkFMKGRsYWdnZSxETEFHR0UpCisjZGVmaW5lIExBUEFDS19jbGFnZ2UgTEFQQUNLX0dMT0JBTChjbGFnZ2UsQ0xBR0dFKQorI2RlZmluZSBMQVBBQ0tfemxhZ2dlIExBUEFDS19HTE9CQUwoemxhZ2dlLFpMQUdHRSkKKyNkZWZpbmUgTEFQQUNLX3NsYXNldCBMQVBBQ0tfR0xPQkFMKHNsYXNldCxTTEFTRVQpCisjZGVmaW5lIExBUEFDS19kbGFzZXQgTEFQQUNLX0dMT0JBTChkbGFzZXQsRExBU0VUKQorI2RlZmluZSBMQVBBQ0tfY2xhc2V0IExBUEFDS19HTE9CQUwoY2xhc2V0LENMQVNFVCkKKyNkZWZpbmUgTEFQQUNLX3psYXNldCBMQVBBQ0tfR0xPQkFMKHpsYXNldCxaTEFTRVQpCisjZGVmaW5lIExBUEFDS19zbGFzcnQgTEFQQUNLX0dMT0JBTChzbGFzcnQsU0xBU1JUKQorI2RlZmluZSBMQVBBQ0tfZGxhc3J0IExBUEFDS19HTE9CQUwoZGxhc3J0LERMQVNSVCkKKyNkZWZpbmUgTEFQQUNLX3NsYWdzeSBMQVBBQ0tfR0xPQkFMKHNsYWdzeSxTTEFHU1kpCisjZGVmaW5lIExBUEFDS19kbGFnc3kgTEFQQUNLX0dMT0JBTChkbGFnc3ksRExBR1NZKQorI2RlZmluZSBMQVBBQ0tfY2xhZ3N5IExBUEFDS19HTE9CQUwoY2xhZ3N5LENMQUdTWSkKKyNkZWZpbmUgTEFQQUNLX3psYWdzeSBMQVBBQ0tfR0xPQkFMKHpsYWdzeSxaTEFHU1kpCisjZGVmaW5lIExBUEFDS19jbGFnaGUgTEFQQUNLX0dMT0JBTChjbGFnaGUsQ0xBR0hFKQorI2RlZmluZSBMQVBBQ0tfemxhZ2hlIExBUEFDS19HTE9CQUwoemxhZ2hlLFpMQUdIRSkKKyNkZWZpbmUgTEFQQUNLX3NsYXBtciBMQVBBQ0tfR0xPQkFMKHNsYXBtcixTTEFQTVIpCisjZGVmaW5lIExBUEFDS19kbGFwbXIgTEFQQUNLX0dMT0JBTChkbGFwbXIsRExBUE1SKQorI2RlZmluZSBMQVBBQ0tfY2xhcG1yIExBUEFDS19HTE9CQUwoY2xhcG1yLENMQVBNUikKKyNkZWZpbmUgTEFQQUNLX3psYXBtciBMQVBBQ0tfR0xPQkFMKHpsYXBtcixaTEFQTVIpCisjZGVmaW5lIExBUEFDS19zbGFweTIgTEFQQUNLX0dMT0JBTChzbGFweTIsU0xBUFkyKQorI2RlZmluZSBMQVBBQ0tfZGxhcHkyIExBUEFDS19HTE9CQUwoZGxhcHkyLERMQVBZMikKKyNkZWZpbmUgTEFQQUNLX3NsYXB5MyBMQVBBQ0tfR0xPQkFMKHNsYXB5MyxTTEFQWTMpCisjZGVmaW5lIExBUEFDS19kbGFweTMgTEFQQUNLX0dMT0JBTChkbGFweTMsRExBUFkzKQorI2RlZmluZSBMQVBBQ0tfc2xhcnRncCBMQVBBQ0tfR0xPQkFMKHNsYXJ0Z3AsU0xBUlRHUCkKKyNkZWZpbmUgTEFQQUNLX2RsYXJ0Z3AgTEFQQUNLX0dMT0JBTChkbGFydGdwLERMQVJUR1ApCisjZGVmaW5lIExBUEFDS19zbGFydGdzIExBUEFDS19HTE9CQUwoc2xhcnRncyxTTEFSVEdTKQorI2RlZmluZSBMQVBBQ0tfZGxhcnRncyBMQVBBQ0tfR0xPQkFMKGRsYXJ0Z3MsRExBUlRHUykKKy8vIExBUEFDSyAzLjMuMAorI2RlZmluZSBMQVBBQ0tfY2JiY3NkIExBUEFDS19HTE9CQUwoY2JiY3NkLENCQkNTRCkKKyNkZWZpbmUgTEFQQUNLX2NoZXN3YXByIExBUEFDS19HTE9CQUwoY2hlc3dhcHIsQ0hFU1dBUFIpCisjZGVmaW5lIExBUEFDS19jaGV0cmkyIExBUEFDS19HTE9CQUwoY2hldHJpMixDSEVUUkkyKQorI2RlZmluZSBMQVBBQ0tfY2hldHJpMnggTEFQQUNLX0dMT0JBTChjaGV0cmkyeCxDSEVUUkkyWCkKKyNkZWZpbmUgTEFQQUNLX2NoZXRyczIgTEFQQUNLX0dMT0JBTChjaGV0cnMyLENIRVRSUzIpCisjZGVmaW5lIExBUEFDS19jc3ljb252IExBUEFDS19HTE9CQUwoY3N5Y29udixDU1lDT05WKQorI2RlZmluZSBMQVBBQ0tfY3N5c3dhcHIgTEFQQUNLX0dMT0JBTChjc3lzd2FwcixDU1lTV0FQUikKKyNkZWZpbmUgTEFQQUNLX2NzeXRyaTIgTEFQQUNLX0dMT0JBTChjc3l0cmkyLENTWVRSSTIpCisjZGVmaW5lIExBUEFDS19jc3l0cmkyeCBMQVBBQ0tfR0xPQkFMKGNzeXRyaTJ4LENTWVRSSTJYKQorI2RlZmluZSBMQVBBQ0tfY3N5dHJzMiBMQVBBQ0tfR0xPQkFMKGNzeXRyczIsQ1NZVFJTMikKKyNkZWZpbmUgTEFQQUNLX2N1bmJkYiBMQVBBQ0tfR0xPQkFMKGN1bmJkYixDVU5CREIpCisjZGVmaW5lIExBUEFDS19jdW5jc2QgTEFQQUNLX0dMT0JBTChjdW5jc2QsQ1VOQ1NEKQorI2RlZmluZSBMQVBBQ0tfZGJiY3NkIExBUEFDS19HTE9CQUwoZGJiY3NkLERCQkNTRCkKKyNkZWZpbmUgTEFQQUNLX2RvcmJkYiBMQVBBQ0tfR0xPQkFMKGRvcmJkYixET1JCREIpCisjZGVmaW5lIExBUEFDS19kb3Jjc2QgTEFQQUNLX0dMT0JBTChkb3Jjc2QsRE9SQ1NEKQorI2RlZmluZSBMQVBBQ0tfZHN5Y29udiBMQVBBQ0tfR0xPQkFMKGRzeWNvbnYsRFNZQ09OVikKKyNkZWZpbmUgTEFQQUNLX2RzeXN3YXByIExBUEFDS19HTE9CQUwoZHN5c3dhcHIsRFNZU1dBUFIpCisjZGVmaW5lIExBUEFDS19kc3l0cmkyIExBUEFDS19HTE9CQUwoZHN5dHJpMixEU1lUUkkyKQorI2RlZmluZSBMQVBBQ0tfZHN5dHJpMnggTEFQQUNLX0dMT0JBTChkc3l0cmkyeCxEU1lUUkkyWCkKKyNkZWZpbmUgTEFQQUNLX2RzeXRyczIgTEFQQUNLX0dMT0JBTChkc3l0cnMyLERTWVRSUzIpCisjZGVmaW5lIExBUEFDS19zYmJjc2QgTEFQQUNLX0dMT0JBTChzYmJjc2QsU0JCQ1NEKQorI2RlZmluZSBMQVBBQ0tfc29yYmRiIExBUEFDS19HTE9CQUwoc29yYmRiLFNPUkJEQikKKyNkZWZpbmUgTEFQQUNLX3NvcmNzZCBMQVBBQ0tfR0xPQkFMKHNvcmNzZCxTT1JDU0QpCisjZGVmaW5lIExBUEFDS19zc3ljb252IExBUEFDS19HTE9CQUwoc3N5Y29udixTU1lDT05WKQorI2RlZmluZSBMQVBBQ0tfc3N5c3dhcHIgTEFQQUNLX0dMT0JBTChzc3lzd2FwcixTU1lTV0FQUikKKyNkZWZpbmUgTEFQQUNLX3NzeXRyaTIgTEFQQUNLX0dMT0JBTChzc3l0cmkyLFNTWVRSSTIpCisjZGVmaW5lIExBUEFDS19zc3l0cmkyeCBMQVBBQ0tfR0xPQkFMKHNzeXRyaTJ4LFNTWVRSSTJYKQorI2RlZmluZSBMQVBBQ0tfc3N5dHJzMiBMQVBBQ0tfR0xPQkFMKHNzeXRyczIsU1NZVFJTMikKKyNkZWZpbmUgTEFQQUNLX3piYmNzZCBMQVBBQ0tfR0xPQkFMKHpiYmNzZCxaQkJDU0QpCisjZGVmaW5lIExBUEFDS196aGVzd2FwciBMQVBBQ0tfR0xPQkFMKHpoZXN3YXByLFpIRVNXQVBSKQorI2RlZmluZSBMQVBBQ0tfemhldHJpMiBMQVBBQ0tfR0xPQkFMKHpoZXRyaTIsWkhFVFJJMikKKyNkZWZpbmUgTEFQQUNLX3poZXRyaTJ4IExBUEFDS19HTE9CQUwoemhldHJpMngsWkhFVFJJMlgpCisjZGVmaW5lIExBUEFDS196aGV0cnMyIExBUEFDS19HTE9CQUwoemhldHJzMixaSEVUUlMyKQorI2RlZmluZSBMQVBBQ0tfenN5Y29udiBMQVBBQ0tfR0xPQkFMKHpzeWNvbnYsWlNZQ09OVikKKyNkZWZpbmUgTEFQQUNLX3pzeXN3YXByIExBUEFDS19HTE9CQUwoenN5c3dhcHIsWlNZU1dBUFIpCisjZGVmaW5lIExBUEFDS196c3l0cmkyIExBUEFDS19HTE9CQUwoenN5dHJpMixaU1lUUkkyKQorI2RlZmluZSBMQVBBQ0tfenN5dHJpMnggTEFQQUNLX0dMT0JBTCh6c3l0cmkyeCxaU1lUUkkyWCkKKyNkZWZpbmUgTEFQQUNLX3pzeXRyczIgTEFQQUNLX0dMT0JBTCh6c3l0cnMyLFpTWVRSUzIpCisjZGVmaW5lIExBUEFDS196dW5iZGIgTEFQQUNLX0dMT0JBTCh6dW5iZGIsWlVOQkRCKQorI2RlZmluZSBMQVBBQ0tfenVuY3NkIExBUEFDS19HTE9CQUwoenVuY3NkLFpVTkNTRCkKKy8vIExBUEFDSyAzLjQuMAorI2RlZmluZSBMQVBBQ0tfc2dlbXFydCBMQVBBQ0tfR0xPQkFMKHNnZW1xcnQsU0dFTVFSVCkKKyNkZWZpbmUgTEFQQUNLX2RnZW1xcnQgTEFQQUNLX0dMT0JBTChkZ2VtcXJ0LERHRU1RUlQpCisjZGVmaW5lIExBUEFDS19jZ2VtcXJ0IExBUEFDS19HTE9CQUwoY2dlbXFydCxDR0VNUVJUKQorI2RlZmluZSBMQVBBQ0tfemdlbXFydCBMQVBBQ0tfR0xPQkFMKHpnZW1xcnQsWkdFTVFSVCkKKyNkZWZpbmUgTEFQQUNLX3NnZXFydCBMQVBBQ0tfR0xPQkFMKHNnZXFydCxTR0VRUlQpCisjZGVmaW5lIExBUEFDS19kZ2VxcnQgTEFQQUNLX0dMT0JBTChkZ2VxcnQsREdFUVJUKQorI2RlZmluZSBMQVBBQ0tfY2dlcXJ0IExBUEFDS19HTE9CQUwoY2dlcXJ0LENHRVFSVCkKKyNkZWZpbmUgTEFQQUNLX3pnZXFydCBMQVBBQ0tfR0xPQkFMKHpnZXFydCxaR0VRUlQpCisjZGVmaW5lIExBUEFDS19zZ2VxcnQyIExBUEFDS19HTE9CQUwoc2dlcXJ0MixTR0VRUlQyKQorI2RlZmluZSBMQVBBQ0tfZGdlcXJ0MiBMQVBBQ0tfR0xPQkFMKGRnZXFydDIsREdFUVJUMikKKyNkZWZpbmUgTEFQQUNLX2NnZXFydDIgTEFQQUNLX0dMT0JBTChjZ2VxcnQyLENHRVFSVDIpCisjZGVmaW5lIExBUEFDS196Z2VxcnQyIExBUEFDS19HTE9CQUwoemdlcXJ0MixaR0VRUlQyKQorI2RlZmluZSBMQVBBQ0tfc2dlcXJ0MyBMQVBBQ0tfR0xPQkFMKHNnZXFydDMsU0dFUVJUMykKKyNkZWZpbmUgTEFQQUNLX2RnZXFydDMgTEFQQUNLX0dMT0JBTChkZ2VxcnQzLERHRVFSVDMpCisjZGVmaW5lIExBUEFDS19jZ2VxcnQzIExBUEFDS19HTE9CQUwoY2dlcXJ0MyxDR0VRUlQzKQorI2RlZmluZSBMQVBBQ0tfemdlcXJ0MyBMQVBBQ0tfR0xPQkFMKHpnZXFydDMsWkdFUVJUMykKKyNkZWZpbmUgTEFQQUNLX3N0cG1xcnQgTEFQQUNLX0dMT0JBTChzdHBtcXJ0LFNUUE1RUlQpCisjZGVmaW5lIExBUEFDS19kdHBtcXJ0IExBUEFDS19HTE9CQUwoZHRwbXFydCxEVFBNUVJUKQorI2RlZmluZSBMQVBBQ0tfY3RwbXFydCBMQVBBQ0tfR0xPQkFMKGN0cG1xcnQsQ1RQTVFSVCkKKyNkZWZpbmUgTEFQQUNLX3p0cG1xcnQgTEFQQUNLX0dMT0JBTCh6dHBtcXJ0LFpUUE1RUlQpCisjZGVmaW5lIExBUEFDS19kdHBxcnQgTEFQQUNLX0dMT0JBTChkdHBxcnQsRFRQUVJUKQorI2RlZmluZSBMQVBBQ0tfY3RwcXJ0IExBUEFDS19HTE9CQUwoY3RwcXJ0LENUUFFSVCkKKyNkZWZpbmUgTEFQQUNLX3p0cHFydCBMQVBBQ0tfR0xPQkFMKHp0cHFydCxaVFBRUlQpCisjZGVmaW5lIExBUEFDS19zdHBxcnQyIExBUEFDS19HTE9CQUwoc3RwcXJ0MixTVFBRUlQyKQorI2RlZmluZSBMQVBBQ0tfZHRwcXJ0MiBMQVBBQ0tfR0xPQkFMKGR0cHFydDIsRFRQUVJUMikKKyNkZWZpbmUgTEFQQUNLX2N0cHFydDIgTEFQQUNLX0dMT0JBTChjdHBxcnQyLENUUFFSVDIpCisjZGVmaW5lIExBUEFDS196dHBxcnQyIExBUEFDS19HTE9CQUwoenRwcXJ0MixaVFBRUlQyKQorI2RlZmluZSBMQVBBQ0tfc3RwcmZiIExBUEFDS19HTE9CQUwoc3RwcmZiLFNUUFJGQikKKyNkZWZpbmUgTEFQQUNLX2R0cHJmYiBMQVBBQ0tfR0xPQkFMKGR0cHJmYixEVFBSRkIpCisjZGVmaW5lIExBUEFDS19jdHByZmIgTEFQQUNLX0dMT0JBTChjdHByZmIsQ1RQUkZCKQorI2RlZmluZSBMQVBBQ0tfenRwcmZiIExBUEFDS19HTE9CQUwoenRwcmZiLFpUUFJGQikKKy8vIExBUEFDSyAzLlguWAorI2RlZmluZSBMQVBBQ0tfY3N5ciBMQVBBQ0tfR0xPQkFMKGNzeXIsQ1NZUikKKyNkZWZpbmUgTEFQQUNLX3pzeXIgTEFQQUNLX0dMT0JBTCh6c3lyLFpTWVIpCisKKwordm9pZCBMQVBBQ0tfc2dldHJmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2V0cmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2V0cmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXRyZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYnRyZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnYnRyZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2J0cmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2J0cmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2d0dHJmKCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZGwsIGZsb2F0KiBkLCBmbG9hdCogZHUsIGZsb2F0KiBkdTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RndHRyZiggbGFwYWNrX2ludCogbiwgZG91YmxlKiBkbCwgZG91YmxlKiBkLCBkb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGR1MiwgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2d0dHJmKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdTIsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pndHRyZiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BvdHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcG90cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcG90cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwb3RyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Rwc3RyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHBpdiwgbGFwYWNrX2ludCogcmFuaywgZG91YmxlKiB0b2wsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BzdHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBwaXYsIGxhcGFja19pbnQqIHJhbmssIGZsb2F0KiB0b2wsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHN0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBwaXYsIGxhcGFja19pbnQqIHJhbmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9sLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Nwc3RyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogcGl2LCBsYXBhY2tfaW50KiByYW5rLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9sLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBmdHJmKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BmdHJmKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cGZ0cmYoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcGZ0cmYoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwcHRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGFwLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcHB0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYXAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwcHRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHB0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwYnRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBidHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BidHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cGJ0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHR0cmYoIGxhcGFja19pbnQqIG4sIGZsb2F0KiBkLCBmbG9hdCogZSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHB0dHJmKCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3B0dHJmKCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwdHRyZiggbGFwYWNrX2ludCogbiwgZG91YmxlKiBkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeXRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3l0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3l0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5dHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hldHJmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZXRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzcHRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGFwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3B0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYXAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzcHRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3B0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocHRyZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aHB0cmYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXRycyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXRycyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dldHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdldHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2J0cnMoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdidHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2didHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnYnRycyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NndHRycyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkbCwgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBkdSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGd0dHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkbCwgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NndHRycyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemd0dHJzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb3RycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvdHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Nwb3RycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBvdHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwZnRycyggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcGZ0cnMoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwZnRycyggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcGZ0cnMoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwcHRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcHB0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHB0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBwdHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BidHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcGJ0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BidHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cGJ0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3B0dHJzKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGUsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwdHRycyggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGUsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHR0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenB0dHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeXRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5dHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzeXRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5dHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZXRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhldHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzcHRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3B0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3B0cnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenNwdHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwdHJzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocHRycyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cnRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cnRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RydHJzKCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRydHJzKCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHB0cnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBmbG9hdCogYXAsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cHRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGRvdWJsZSogYXAsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHB0cnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cHRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdGJ0cnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGJ0cnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0YnRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0YnRycyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlY29uKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYW5vcm0sIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2Vjb24oIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFub3JtLCBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2Vjb24oIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2Vjb24oIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYmNvbiggY2hhciogbm9ybSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnYmNvbiggY2hhciogbm9ybSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFub3JtLCBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2Jjb24oIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYW5vcm0sIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdiY29uKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYW5vcm0sIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2d0Y29uKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogZGwsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZHUsIGNvbnN0IGZsb2F0KiBkdTIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RndGNvbiggY2hhciogbm9ybSwgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGR1LCBjb25zdCBkb3VibGUqIGR1MiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2d0Y29uKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdTIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemd0Y29uKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFub3JtLCBkb3VibGUqIHJjb25kLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb2NvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFub3JtLCBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BvY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYW5vcm0sIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBvY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHBjb24oIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIGFub3JtLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBwY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGFub3JtLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHBjb24oIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFub3JtLCBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwcGNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcGJjb24oIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwYmNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsIGNvbnN0IGRvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGRvdWJsZSogYW5vcm0sIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYmNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFub3JtLCBmbG9hdCogcmNvbmQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwYmNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYW5vcm0sIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3B0Y29uKCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsIGZsb2F0KiBhbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHB0Y29uKCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHRjb24oIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSwgZmxvYXQqIGFub3JtLCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHRjb24oIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLCBkb3VibGUqIGFub3JtLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeWNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGFub3JtLCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5Y29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N5Y29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYW5vcm0sCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pzeWNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYW5vcm0sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYW5vcm0sCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZWNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYW5vcm0sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzcGNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3NwY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBhbm9ybSwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenNwY29uKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGFub3JtLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocGNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYW5vcm0sIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGNvbiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBhbm9ybSwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHJjb24oIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiByY29uZCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHJjb24oIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJjb24oIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRyY29uKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHBjb24oIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cGNvbiggY2hhciogbm9ybSwgY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhcCwgZG91YmxlKiByY29uZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RwY29uKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRwY29uKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0YmNvbiggY2hhciogbm9ybSwgY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2QsIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0YmNvbiggY2hhciogbm9ybSwgY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2QsIGNvbnN0IGRvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0YmNvbiggY2hhciogbm9ybSwgY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2QsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIHJjb25kLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dGJjb24oIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtkLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXJmcyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXJmcyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VyZnMoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlcmZzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcmZzeCggY2hhciogdHJhbnMsIGNoYXIqIGVxdWVkLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGRvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIHIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGMsIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCogbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VyZnN4KCBjaGFyKiB0cmFucywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBjb25zdCBmbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBjLCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXJmc3goIGNoYXIqIHRyYW5zLCBjaGFyKiBlcXVlZCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogciwgY29uc3QgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VyZnN4KCBjaGFyKiB0cmFucywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHIsIGNvbnN0IGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYnJmcyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnYnJmcyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhZmIsIGxhcGFja19pbnQqIGxkYWZiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2JyZnMoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdicmZzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdicmZzeCggY2hhciogdHJhbnMsIGNoYXIqIGVxdWVkLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgY29uc3QgZG91YmxlKiBhZmIsIGxhcGFja19pbnQqIGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiByLCBjb25zdCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dicmZzeCggY2hhciogdHJhbnMsIGNoYXIqIGVxdWVkLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBjb25zdCBmbG9hdCogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiByLCBjb25zdCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnBhcmFtcywgZmxvYXQqIHBhcmFtcywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdicmZzeCggY2hhciogdHJhbnMsIGNoYXIqIGVxdWVkLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogciwgY29uc3QgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2JyZnN4KCBjaGFyKiB0cmFucywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiByLCBjb25zdCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCogbnBhcmFtcywgZmxvYXQqIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ3RyZnMoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZGwsIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkbGYsIGNvbnN0IGZsb2F0KiBkZiwgY29uc3QgZmxvYXQqIGR1ZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RndHJmcyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZGwsIGNvbnN0IGRvdWJsZSogZCwgY29uc3QgZG91YmxlKiBkdSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkbGYsIGNvbnN0IGRvdWJsZSogZGYsIGNvbnN0IGRvdWJsZSogZHVmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGR1MiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2d0cmZzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGR1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGxmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdTIsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemd0cmZzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb3JmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZiwgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BvcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBvcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcG9yZnN4KCBjaGFyKiB1cGxvLCBjaGFyKiBlcXVlZCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZiwgY29uc3QgZG91YmxlKiBzLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19ub3JtLCBkb3VibGUqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucGFyYW1zLCBkb3VibGUqIHBhcmFtcywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb3Jmc3goIGNoYXIqIHVwbG8sIGNoYXIqIGVxdWVkLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZmxvYXQqIGFmLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZiwgY29uc3QgZmxvYXQqIHMsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCogbnBhcmFtcywgZmxvYXQqIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBvcmZzeCggY2hhciogdXBsbywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BvcmZzeCggY2hhciogdXBsbywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BwcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXAsIGNvbnN0IGZsb2F0KiBhZnAsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcHByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGNvbnN0IGRvdWJsZSogYWZwLCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwYnJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwgY29uc3QgZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcGJyZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBjb25zdCBkb3VibGUqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYnJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwgbGFwYWNrX2ludCogbGRhZmIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBicmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsIGxhcGFja19pbnQqIGxkYWZiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwdHJmcyggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBlLCBjb25zdCBmbG9hdCogZGYsIGNvbnN0IGZsb2F0KiBlZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHB0cmZzKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZSwgY29uc3QgZG91YmxlKiBkZiwgY29uc3QgZG91YmxlKiBlZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHRyZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSwgY29uc3QgZmxvYXQqIGRmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenB0cmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkZiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3lyZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeXJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGRvdWJsZSogYWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzeXJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pzeXJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5cmZzeCggY2hhciogdXBsbywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiBhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCogbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3lyZnN4KCBjaGFyKiB1cGxvLCBjaGFyKiBlcXVlZCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiBhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWYsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3lyZnN4KCBjaGFyKiB1cGxvLCBjaGFyKiBlcXVlZCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N5cmZzeCggY2hhciogdXBsbywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhlcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGVyZnN4KCBjaGFyKiB1cGxvLCBjaGFyKiBlcXVlZCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlcmZzeCggY2hhciogdXBsbywgY2hhciogZXF1ZWQsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsIGZsb2F0KiBlcnJfYm5kc19ub3JtLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwcmZzKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXAsIGNvbnN0IGZsb2F0KiBhZnAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3ByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXAsIGNvbnN0IGRvdWJsZSogYWZwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3ByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmcCwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3ByZnMoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocHJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogZmVyciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocHJmcyggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZnAsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RycmZzKCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgY29uc3QgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cnJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgY29uc3QgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJyZnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cnJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cHJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBhcCwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgY29uc3QgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cHJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGRvdWJsZSogYXAsIGNvbnN0IGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBjb25zdCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0cHJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHByZnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0YnJmcyggY2hhciogdXBsbywgY2hhciogdHJhbnMsIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBmbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGJyZnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywgY29uc3QgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RicmZzKCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2QsIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXJyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dGJyZnMoIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2V0cmkoIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdldHJpKCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dldHJpKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXRyaSggbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb3RyaSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BvdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cG90cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcGZ0cmkoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcGZ0cmkoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwZnRyaSggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwZnRyaSggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BwdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYXAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwcHRyaSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3BwdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwcHRyaSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5dHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5dHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3l0cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3l0cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZXRyaSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZXRyaSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3B0cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3NwdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3B0cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwdHJpKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aHB0cmkoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RydHJpKCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHJ0cmkoIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJ0cmkoIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cnRyaSggY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0ZnRyaSggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0ZnRyaSggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRmdHJpKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RmdHJpKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHB0cmkoIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRwdHJpKCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHB0cmkoIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRwdHJpKCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWVxdSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogciwgZG91YmxlKiBjLCBkb3VibGUqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb2xjbmQsIGRvdWJsZSogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlZXF1KCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWVxdWIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb2xjbmQsIGRvdWJsZSogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlZXF1YiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIHJvd2NuZCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VlcXViKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogciwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsIGRvdWJsZSogY29sY25kLCBkb3VibGUqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VlcXViKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHIsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYywgZmxvYXQqIHJvd2NuZCwgZmxvYXQqIGNvbGNuZCwgZmxvYXQqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2JlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2JlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogcm93Y25kLCBkb3VibGUqIGNvbGNuZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2JlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjb2xjbmQsIGZsb2F0KiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2JlcXUoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogcm93Y25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2JlcXViKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBjb25zdCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByLCBkb3VibGUqIGMsIGRvdWJsZSogcm93Y25kLCBkb3VibGUqIGNvbGNuZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2diZXF1YiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHIsIGZsb2F0KiBjLCBmbG9hdCogcm93Y25kLCBmbG9hdCogY29sY25kLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnYmVxdWIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIHIsIGRvdWJsZSogYywgZG91YmxlKiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbGNuZCwgZG91YmxlKiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2JlcXViKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiByb3djbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogY29sY25kLCBmbG9hdCogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BvZXF1KCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvZXF1KCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Nwb2VxdSggbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwb2VxdSggbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcG9lcXViKCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcG9lcXViKCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwb2VxdWIoIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcG9lcXViKCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHBlcXUoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwcGVxdSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBhcCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwcGVxdSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBwZXF1KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3BiZXF1KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgY29uc3QgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBiZXF1KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgY29uc3QgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYmVxdSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwYmVxdSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3llcXViKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogcywgZG91YmxlKiBzY29uZCwgZG91YmxlKiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3llcXViKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBzY29uZCwgZmxvYXQqIGFtYXgsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5ZXF1YiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHMsIGRvdWJsZSogc2NvbmQsIGRvdWJsZSogYW1heCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N5ZXF1YiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBzLCBmbG9hdCogc2NvbmQsIGZsb2F0KiBhbWF4LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZWVxdWIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzLCBkb3VibGUqIHNjb25kLCBkb3VibGUqIGFtYXgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZWVxdWIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogcywgZmxvYXQqIHNjb25kLCBmbG9hdCogYW1heCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VzdiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VzdiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2dlc3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogd29yaywgZmxvYXQqIHN3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdGVyLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Y2dlc3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHN3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpdGVyLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogciwgZmxvYXQqIGMsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiByLCBkb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlc3Z4eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlc3Z4eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2Vzdnh4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJwdmdydywgZG91YmxlKiBiZXJyLCBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlcnJfYm5kc19ub3JtLCBkb3VibGUqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucGFyYW1zLCBkb3VibGUqIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXN2eHgoIGNoYXIqIGZhY3QsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogciwgZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYnN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdic3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnYnN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdic3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGxhcGFja19pbnQqIGlwaXYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYnN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdic3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIGFmYiwgbGFwYWNrX2ludCogbGRhZmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dic3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWZiLCBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdic3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBsYXBhY2tfaW50KiBucmhzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2Jzdnh4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGRvdWJsZSogYWZiLCBsYXBhY2tfaW50KiBsZGFmYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBkb3VibGUqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX2NvbXAsIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dic3Z4eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGxhcGFja19pbnQqIG5yaHMsIGZsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiBhZmIsIGxhcGFja19pbnQqIGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbl9lcnJfYm5kcywgZmxvYXQqIGVycl9ibmRzX25vcm0sCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfY29tcCwgbGFwYWNrX2ludCogbnBhcmFtcywgZmxvYXQqIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdic3Z4eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZmIsIGxhcGFja19pbnQqIGxkYWZiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogciwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dic3Z4eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGxhcGFja19pbnQqIG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZmIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmYiwgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGZsb2F0KiByLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnB2Z3J3LCBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2d0c3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGZsb2F0KiBkbCwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIGR1LCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ3RzdiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBkbCwgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHUsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ3RzdiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemd0c3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogZGwsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NndHN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkbCwgY29uc3QgZmxvYXQqIGQsIGNvbnN0IGZsb2F0KiBkdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRsZiwgZmxvYXQqIGRmLCBmbG9hdCogZHVmLCBmbG9hdCogZHUyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ3RzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGRsLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZHUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZGxmLCBkb3VibGUqIGRmLCBkb3VibGUqIGR1ZiwgZG91YmxlKiBkdTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NndHN2eCggY2hhciogZmFjdCwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGRmLCBsYXBhY2tfY29tcGxleF9mbG9hdCogZHVmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZHUyLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemd0c3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGR1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGRsZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkZiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkdWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZHUyLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nwb3N2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Nwb3N2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBvc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNwb3N2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHdvcmssIGZsb2F0KiBzd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXRlciwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemNwb3N2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19jb21wbGV4X2Zsb2F0KiBzd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCogaXRlciwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Bvc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmVyciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Bvc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwb3N2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBvc3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwgZG91YmxlKiBycHZncncsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Bvc3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLCBmbG9hdCogZXJyX2JuZHNfbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19jb21wLCBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cG9zdnh4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmLCBsYXBhY2tfaW50KiBsZGFmLCBjaGFyKiBlcXVlZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Bvc3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsIGNoYXIqIGVxdWVkLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnB2Z3J3LCBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Bwc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcHBzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Bwc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwcHN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwcHN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBmbG9hdCogYWZwLCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwcHN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgZG91YmxlKiBhZnAsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwcHN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHBzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NwYnN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHBic3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYnN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBic3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Bic3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogYWZiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmYiwgY2hhciogZXF1ZWQsIGZsb2F0KiBzLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcGJzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYnN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhZmIsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwYnN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5yaHMsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmYiwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHRzdiggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwdHN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3B0c3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pwdHN2KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHRzdngoIGNoYXIqIGZhY3QsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZSwgZmxvYXQqIGRmLCBmbG9hdCogZWYsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHB0c3Z4KCBjaGFyKiBmYWN0LCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwgZG91YmxlKiBkZiwgZG91YmxlKiBlZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jcHRzdngoIGNoYXIqIGZhY3QsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogZSwgZmxvYXQqIGRmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogZWYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196cHRzdngoIGNoYXIqIGZhY3QsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogZCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBlLCBkb3VibGUqIGRmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGVmLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeXN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3lzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogaXBpdiwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3lzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pzeXN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5c3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWYsIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3lzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGFmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFmLCBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGRvdWJsZSogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N5c3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5c3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5c3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY2hhciogZXF1ZWQsIGRvdWJsZSogcywgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5c3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGZsb2F0KiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBycHZncncsIGZsb2F0KiBiZXJyLCBsYXBhY2tfaW50KiBuX2Vycl9ibmRzLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGVycl9ibmRzX25vcm0sIGZsb2F0KiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnBhcmFtcywgZmxvYXQqIHBhcmFtcywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5c3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBycHZncncsIGRvdWJsZSogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZXJyX2JuZHNfbm9ybSwgZG91YmxlKiBlcnJfYm5kc19jb21wLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnBhcmFtcywgZG91YmxlKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3lzdnh4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZiwgbGFwYWNrX2ludCogbGRhZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNoYXIqIGVxdWVkLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBmbG9hdCogcmNvbmQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnB2Z3J3LCBmbG9hdCogYmVyciwgbGFwYWNrX2ludCogbl9lcnJfYm5kcywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlcnJfYm5kc19ub3JtLCBmbG9hdCogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGVzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZXN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFmLCBsYXBhY2tfaW50KiBsZGFmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZXN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgZG91YmxlKiBmZXJyLCBkb3VibGUqIGJlcnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZXN2eHgoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiByY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcnB2Z3J3LCBkb3VibGUqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGVycl9ibmRzX25vcm0sIGRvdWJsZSogZXJyX2JuZHNfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5wYXJhbXMsIGRvdWJsZSogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlc3Z4eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWYsIGxhcGFja19pbnQqIGxkYWYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjaGFyKiBlcXVlZCwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHJjb25kLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJwdmdydywgZmxvYXQqIGJlcnIsIGxhcGFja19pbnQqIG5fZXJyX2JuZHMsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXJyX2JuZHNfbm9ybSwgZmxvYXQqIGVycl9ibmRzX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucGFyYW1zLCBmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzcHN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3BzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3BzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenNwc3YoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3BzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBmbG9hdCogZmVyciwgZmxvYXQqIGJlcnIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNwc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFwLCBkb3VibGUqIGFmcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4LCBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Nwc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhZnAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlwaXYsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgZmxvYXQqIGZlcnIsIGZsb2F0KiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3BzdngoIGNoYXIqIGZhY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWZwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGRvdWJsZSogZmVyciwgZG91YmxlKiBiZXJyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocHN2KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aHBzdiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocHN2eCggY2hhciogZmFjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYWZwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpcGl2LCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGZsb2F0KiBmZXJyLCBmbG9hdCogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhwc3Z4KCBjaGFyKiBmYWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFmcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBkb3VibGUqIGZlcnIsIGRvdWJsZSogYmVyciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VxcmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcXJmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXFyZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VxcmYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlcXBmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcXBmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoganB2dCwgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlcXBmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VxcGYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VxcDMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGpwdnQsIGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcXAzKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoganB2dCwgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXFwMyggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCoganB2dCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXFwMyggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JncXIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9yZ3FyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nvcm1xciggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9ybXFyKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3VuZ3FyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bmdxciggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5tcXIoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bm1xciggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWxxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VscWYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlbHFmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWxxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JnbHEoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9yZ2xxKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nvcm1scSggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9ybWxxKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgY29uc3QgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3VuZ2xxKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bmdscSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5tbHEoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bm1scSggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXFsZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VxbGYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlcWxmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXFsZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JncWwoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9yZ3FsKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bmdxbCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5ncWwoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29ybXFsKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3JtcWwoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5tcWwoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bm1xbCggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXJxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VycWYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlcnFmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXJxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JncnEoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9yZ3JxKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bmdycSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5ncnEoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29ybXJxKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3JtcnEoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5tcnEoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p1bm1ycSggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0enJ6ZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHpyemYoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3R6cnpmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0enJ6ZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JtcnooIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Rvcm1yeiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bm1yeiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenVubXJ6KCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dncXJmKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogdGF1YSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdWIsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdncXJmKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB0YXVhLCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0YXViLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2dxcmYoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1YiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2dxcmYoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZ3JxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHRhdWEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0YXViLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ3JxZiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogdGF1YSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1YiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dncnFmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdncnFmKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXVhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXViLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VicmQoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIHRhdXEsIGZsb2F0KiB0YXVwLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWJyZCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHRhdXEsIGRvdWJsZSogdGF1cCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlYnJkKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogZCwgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVxLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VicmQoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXVxLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnYmJyZCggY2hhciogdmVjdCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmNjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsIGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogcHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkcHQsIGZsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2JicmQoIGNoYXIqIHZlY3QsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5jYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2wsIGxhcGFja19pbnQqIGt1LCBkb3VibGUqIGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogcHQsIGxhcGFja19pbnQqIGxkcHQsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnYmJyZCggY2hhciogdmVjdCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmNjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcHQsIGxhcGFja19pbnQqIGxkcHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnYmJyZCggY2hhciogdmVjdCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmNjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBwdCwgbGFwYWNrX2ludCogbGRwdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29yZ2JyKCBjaGFyKiB2ZWN0LCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RvcmdiciggY2hhciogdmVjdCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JtYnIoIGNoYXIqIHZlY3QsIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Rvcm1iciggY2hhciogdmVjdCwgY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bmdiciggY2hhciogdmVjdCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5nYnIoIGNoYXIqIHZlY3QsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3VubWJyKCBjaGFyKiB2ZWN0LCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5tYnIoIGNoYXIqIHZlY3QsIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zYmRzcXIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5jdnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5ydSwgbGFwYWNrX2ludCogbmNjLCBmbG9hdCogZCwgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2dCwgbGFwYWNrX2ludCogbGR2dCwgZmxvYXQqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RiZHNxciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmN2dCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJ1LCBsYXBhY2tfaW50KiBuY2MsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LCBkb3VibGUqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2Jkc3FyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBuY3Z0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucnUsIGxhcGFja19pbnQqIG5jYywgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnQsIGxhcGFja19pbnQqIGxkdnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196YmRzcXIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5jdnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5ydSwgbGFwYWNrX2ludCogbmNjLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2dCwgbGFwYWNrX2ludCogbGR2dCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NiZHNkYyggY2hhciogdXBsbywgY2hhciogY29tcHEsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHUsIGxhcGFja19pbnQqIGxkdSwgZmxvYXQqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcSwgbGFwYWNrX2ludCogaXEsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGJkc2RjKCBjaGFyKiB1cGxvLCBjaGFyKiBjb21wcSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGUsIGRvdWJsZSogdSwgbGFwYWNrX2ludCogbGR1LCBkb3VibGUqIHZ0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZ0LCBkb3VibGUqIHEsIGxhcGFja19pbnQqIGlxLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3l0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3l0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Nvcmd0ciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3JndHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29ybXRyKCBjaGFyKiBzaWRlLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3JtdHIoIGNoYXIqIHNpZGUsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB0YXUsIGRvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGV0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGV0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bmd0ciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5ndHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3VubXRyKCBjaGFyKiBzaWRlLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5tdHIoIGNoYXIqIHNpZGUsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3B0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhcCwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdGF1LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3B0cmQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYXAsIGRvdWJsZSogZCwgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29wZ3RyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3BndHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdGF1LCBkb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3BtdHIoIGNoYXIqIHNpZGUsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYXAsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3BtdHIoIGNoYXIqIHNpZGUsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGFwLCBjb25zdCBkb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwdHJkKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkLCBmbG9hdCogZSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhwdHJkKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGQsIGRvdWJsZSogZSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1cGd0ciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRxLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenVwZ3RyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3VwbXRyKCBjaGFyKiBzaWRlLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LCBsYXBhY2tfY29tcGxleF9mbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenVwbXRyKCBjaGFyKiBzaWRlLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzYnRyZCggY2hhciogdmVjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNidHJkKCBjaGFyKiB2ZWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoYnRyZCggY2hhciogdmVjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlLCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhidHJkKCBjaGFyKiB2ZWN0LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzdGVyZiggbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3RlcmYoIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwgZG91YmxlKiBlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3RlcXIoIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3RlcXIoIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N0ZXFyKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN0ZXFyKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzdGVtciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBmbG9hdCogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG56YywgbGFwYWNrX2ludCogaXN1cHB6LCBsYXBhY2tfbG9naWNhbCogdHJ5cmFjLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGVtciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXUsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19pbnQqIG56YywgbGFwYWNrX2ludCogaXN1cHB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogdHJ5cmFjLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3RlbXIoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZCwgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2bCwgZmxvYXQqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBuemMsIGxhcGFja19pbnQqIGlzdXBweiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHRyeXJhYywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3RlbXIoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZSwgZG91YmxlKiB2bCwgZG91YmxlKiB2dSwgbGFwYWNrX2ludCogaWwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl1LCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBuemMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzdXBweiwgbGFwYWNrX2xvZ2ljYWwqIHRyeXJhYywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N0ZWRjKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGVkYyggY2hhciogY29tcHosIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwgZG91YmxlKiBlLCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N0ZWRjKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3RlZGMoIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N0ZWdyKCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmwsIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2ludCogaXN1cHB6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGVnciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzdGVnciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBmbG9hdCogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzdXBweiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3RlZ3IoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZSwgZG91YmxlKiB2bCwgZG91YmxlKiB2dSwgbGFwYWNrX2ludCogaWwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl1LCBkb3VibGUqIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcHRlcXIoIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kcHRlcXIoIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3B0ZXFyKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenB0ZXFyKCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzdGVieiggY2hhciogcmFuZ2UsIGNoYXIqIG9yZGVyLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5zcGxpdCwgZmxvYXQqIHcsIGxhcGFja19pbnQqIGlibG9jaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNwbGl0LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGVieiggY2hhciogcmFuZ2UsIGNoYXIqIG9yZGVyLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnNwbGl0LCBkb3VibGUqIHcsIGxhcGFja19pbnQqIGlibG9jaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNwbGl0LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3RlaW4oIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBkLCBjb25zdCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgY29uc3QgZmxvYXQqIHcsIGNvbnN0IGxhcGFja19pbnQqIGlibG9jaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXNwbGl0LCBmbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN0ZWluKCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGQsIGNvbnN0IGRvdWJsZSogZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgY29uc3QgZG91YmxlKiB3LCBjb25zdCBsYXBhY2tfaW50KiBpYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlzcGxpdCwgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3N0ZWluKCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogZCwgY29uc3QgZmxvYXQqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGNvbnN0IGZsb2F0KiB3LCBjb25zdCBsYXBhY2tfaW50KiBpYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlzcGxpdCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbHYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pzdGVpbiggbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBkLCBjb25zdCBkb3VibGUqIGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGNvbnN0IGRvdWJsZSogdywgY29uc3QgbGFwYWNrX2ludCogaWJsb2NrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpc3BsaXQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbHYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NkaXNuYSggY2hhciogam9iLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNlcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGRpc25hKCBjaGFyKiBqb2IsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzZXAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeWdzdCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeWdzdCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlZ3N0KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhlZ3N0KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3Bnc3QoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBicCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNwZ3N0KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBicCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwZ3N0KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYnAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGdzdCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYnAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzYmdzdCggY2hhciogdmVjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2EsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiYiwgbGFwYWNrX2ludCogbGRiYiwgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzYmdzdCggY2hhciogdmVjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2EsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGJiLCBsYXBhY2tfaW50KiBsZGJiLCBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeCwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGJnc3QoIGNoYXIqIHZlY3QsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGthLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmIsIGxhcGFja19pbnQqIGxkYmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poYmdzdCggY2hhciogdmVjdCwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2EsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJiLCBsYXBhY2tfaW50KiBsZGJiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgsIGxhcGFja19pbnQqIGxkeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zcGJzdGYoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtiLCBmbG9hdCogYmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYmIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RwYnN0ZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2IsIGRvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYmIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NwYnN0ZiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2IsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiYiwgbGFwYWNrX2ludCogbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenBic3RmKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiYiwgbGFwYWNrX2ludCogbGRiYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlaHJkKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VocmQoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB0YXUsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZWhyZCggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlaHJkKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zb3JnaHIoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBmbG9hdCogdGF1LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RvcmdociggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc29ybWhyKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGNvbnN0IGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGZsb2F0KiB0YXUsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGMsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9ybWhyKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBkb3VibGUqIHRhdSwgZG91YmxlKiBjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N1bmdociggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenVuZ2hyKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5taHIoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5taHIoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlYmFsKCBjaGFyKiBqb2IsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWJhbCggY2hhciogam9iLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZWJhbCggY2hhciogam9iLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2ViYWwoIGNoYXIqIGpvYiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2ViYWsoIGNoYXIqIGpvYiwgY2hhciogc2lkZSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGNvbnN0IGZsb2F0KiBzY2FsZSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlYmFrKCBjaGFyKiBqb2IsIGNoYXIqIHNpZGUsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBjb25zdCBkb3VibGUqIHNjYWxlLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHYsIGxhcGFja19pbnQqIGxkdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlYmFrKCBjaGFyKiBqb2IsIGNoYXIqIHNpZGUsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBjb25zdCBmbG9hdCogc2NhbGUsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWJhayggY2hhciogam9iLCBjaGFyKiBzaWRlLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgY29uc3QgZG91YmxlKiBzY2FsZSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Noc2VxciggY2hhciogam9iLCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGZsb2F0KiBoLCBsYXBhY2tfaW50KiBsZGgsIGZsb2F0KiB3ciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdpLCBmbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Roc2VxciggY2hhciogam9iLCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogaCwgbGFwYWNrX2ludCogbGRoLCBkb3VibGUqIHdyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpLCBkb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hzZXFyKCBjaGFyKiBqb2IsIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGgsIGxhcGFja19pbnQqIGxkaCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhzZXFyKCBjaGFyKiBqb2IsIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBoLCBsYXBhY2tfaW50KiBsZGgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3Noc2VpbiggY2hhciogam9iLCBjaGFyKiBlaWdzcmMsIGNoYXIqIGluaXR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogaCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRoLCBmbG9hdCogd3IsIGNvbnN0IGZsb2F0KiB3aSwgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBmbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Roc2VpbiggY2hhciogam9iLCBjaGFyKiBlaWdzcmMsIGNoYXIqIGluaXR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkaCwgZG91YmxlKiB3ciwgY29uc3QgZG91YmxlKiB3aSwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2bCwgZG91YmxlKiB2ciwgbGFwYWNrX2ludCogbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbW0sIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWxsLCBsYXBhY2tfaW50KiBpZmFpbHIsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2Noc2VpbiggY2hhciogam9iLCBjaGFyKiBlaWdzcmMsIGNoYXIqIGluaXR2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogaCwgbGFwYWNrX2ludCogbGRoLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbGwsIGxhcGFja19pbnQqIGlmYWlsciwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhzZWluKCBjaGFyKiBqb2IsIGNoYXIqIGVpZ3NyYywgY2hhciogaW5pdHYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogaCwgbGFwYWNrX2ludCogbGRoLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdmwsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsbCwgbGFwYWNrX2ludCogaWZhaWxyLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHJldmMoIGNoYXIqIHNpZGUsIGNoYXIqIGhvd21ueSwgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBmbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRyZXZjKCBjaGFyKiBzaWRlLCBjaGFyKiBob3dtbnksIGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogdCwgbGFwYWNrX2ludCogbGR0LCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBkb3VibGUqIHZyLCBsYXBhY2tfaW50KiBsZHZyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtbSwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJldmMoIGNoYXIqIHNpZGUsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLCBsYXBhY2tfaW50KiBsZHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIG1tLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHJldmMoIGNoYXIqIHNpZGUsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsIGxhcGFja19pbnQqIGxkdmwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIG1tLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cnNuYSggY2hhciogam9iLCBjaGFyKiBob3dtbnksIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB2bCwgbGFwYWNrX2ludCogbGR2bCwgY29uc3QgZmxvYXQqIHZyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZyLCBmbG9hdCogcywgZmxvYXQqIHNlcCwgbGFwYWNrX2ludCogbW0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsZHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHJzbmEoIGNoYXIqIGpvYiwgY2hhciogaG93bW55LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB2bCwgbGFwYWNrX2ludCogbGR2bCwgY29uc3QgZG91YmxlKiB2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgZG91YmxlKiBzLCBkb3VibGUqIHNlcCwgbGFwYWNrX2ludCogbW0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbGR3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Ryc25hKCBjaGFyKiBqb2IsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnIsIGZsb2F0KiBzLCBmbG9hdCogc2VwLCBsYXBhY2tfaW50KiBtbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkd29yaywgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHJzbmEoIGNoYXIqIGpvYiwgY2hhciogaG93bW55LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2bCwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgZG91YmxlKiBzLCBkb3VibGUqIHNlcCwgbGFwYWNrX2ludCogbW0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHJleGMoIGNoYXIqIGNvbXBxLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBsYXBhY2tfaW50KiBpZnN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbHN0LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRyZXhjKCBjaGFyKiBjb21wcSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLCBsYXBhY2tfaW50KiBpZnN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbHN0LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0cmV4YyggY2hhciogY29tcHEsIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmc3QsIGxhcGFja19pbnQqIGlsc3QsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cmV4YyggY2hhciogY29tcHEsIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR0LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZzdCwgbGFwYWNrX2ludCogaWxzdCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Ryc2VuKCBjaGFyKiBqb2IsIGNoYXIqIGNvbXBxLCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBmbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LCBmbG9hdCogcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogd3IsIGZsb2F0KiB3aSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBzZXAsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRyc2VuKCBjaGFyKiBqb2IsIGNoYXIqIGNvbXBxLCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogd3IsIGRvdWJsZSogd2ksIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBzZXAsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0cnNlbiggY2hhciogam9iLCBjaGFyKiBjb21wcSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHcsIGxhcGFja19pbnQqIG0sIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2VwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cnNlbiggY2hhciogam9iLCBjaGFyKiBjb21wcSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHcsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzZXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cnN5bCggY2hhciogdHJhbmEsIGNoYXIqIHRyYW5iLCBsYXBhY2tfaW50KiBpc2duLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NhbGUsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cnN5bCggY2hhciogdHJhbmEsIGNoYXIqIHRyYW5iLCBsYXBhY2tfaW50KiBpc2duLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHNjYWxlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJzeWwoIGNoYXIqIHRyYW5hLCBjaGFyKiB0cmFuYiwgbGFwYWNrX2ludCogaXNnbiwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHJzeWwoIGNoYXIqIHRyYW5hLCBjaGFyKiB0cmFuYiwgbGFwYWNrX2ludCogaXNnbiwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY2FsZSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dnaHJkKCBjaGFyKiBjb21wcSwgY2hhciogY29tcHosIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2docmQoIGNoYXIqIGNvbXBxLCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiBxLCBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2docmQoIGNoYXIqIGNvbXBxLCBjaGFyKiBjb21weiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZ2hyZCggY2hhciogY29tcHEsIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZ2JhbCggY2hhciogam9iLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxzY2FsZSwgZmxvYXQqIHJzY2FsZSwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ2JhbCggY2hhciogam9iLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBkb3VibGUqIGxzY2FsZSwgZG91YmxlKiByc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dnYmFsKCBjaGFyKiBqb2IsIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnNjYWxlLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdnYmFsKCBjaGFyKiBqb2IsIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJzY2FsZSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2diYWsoIGNoYXIqIGpvYiwgY2hhciogc2lkZSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGNvbnN0IGZsb2F0KiBsc2NhbGUsIGNvbnN0IGZsb2F0KiByc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ2JhayggY2hhciogam9iLCBjaGFyKiBzaWRlLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBpbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGloaSwgY29uc3QgZG91YmxlKiBsc2NhbGUsIGNvbnN0IGRvdWJsZSogcnNjYWxlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHYsIGxhcGFja19pbnQqIGxkdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dnYmFrKCBjaGFyKiBqb2IsIGNoYXIqIHNpZGUsIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBjb25zdCBmbG9hdCogbHNjYWxlLCBjb25zdCBmbG9hdCogcnNjYWxlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2diYWsoIGNoYXIqIGpvYiwgY2hhciogc2lkZSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaWxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpaGksIGNvbnN0IGRvdWJsZSogbHNjYWxlLCBjb25zdCBkb3VibGUqIHJzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NoZ2VxeiggY2hhciogam9iLCBjaGFyKiBjb21wcSwgY2hhciogY29tcHosIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogaCwgbGFwYWNrX2ludCogbGRoLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LCBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmV0YSwgZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kaGdlcXooIGNoYXIqIGpvYiwgY2hhciogY29tcHEsIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgZG91YmxlKiBoLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGgsIGRvdWJsZSogdCwgbGFwYWNrX2ludCogbGR0LCBkb3VibGUqIGFscGhhciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYWksIGRvdWJsZSogYmV0YSwgZG91YmxlKiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGdlcXooIGNoYXIqIGpvYiwgY2hhciogY29tcHEsIGNoYXIqIGNvbXB6LCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkaCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZ2VxeiggY2hhciogam9iLCBjaGFyKiBjb21wcSwgY2hhciogY29tcHosIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGgsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkaCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdGdldmMoIGNoYXIqIHNpZGUsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIHMsIGxhcGFja19pbnQqIGxkcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHAsIGxhcGFja19pbnQqIGxkcCwgZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBmbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRnZXZjKCBjaGFyKiBzaWRlLCBjaGFyKiBob3dtbnksIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogcywgbGFwYWNrX2ludCogbGRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHAsIGxhcGFja19pbnQqIGxkcCwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2bCwgZG91YmxlKiB2ciwgbGFwYWNrX2ludCogbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbW0sIGxhcGFja19pbnQqIG0sIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RnZXZjKCBjaGFyKiBzaWRlLCBjaGFyKiBob3dtbnksIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHMsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHAsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2bCwgbGFwYWNrX2ludCogbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50KiBsZHZyLCBsYXBhY2tfaW50KiBtbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRnZXZjKCBjaGFyKiBzaWRlLCBjaGFyKiBob3dtbnksIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRzLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkcCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2bCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgbGFwYWNrX2ludCogbW0sIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RnZXhjKCBsYXBhY2tfbG9naWNhbCogd2FudHEsIGxhcGFja19sb2dpY2FsKiB3YW50eiwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZzdCwgbGFwYWNrX2ludCogaWxzdCwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGdleGMoIGxhcGFja19sb2dpY2FsKiB3YW50cSwgbGFwYWNrX2xvZ2ljYWwqIHdhbnR6LCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLCBkb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZzdCwgbGFwYWNrX2ludCogaWxzdCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RnZXhjKCBsYXBhY2tfbG9naWNhbCogd2FudHEsIGxhcGFja19sb2dpY2FsKiB3YW50eiwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2ludCogaWZzdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxzdCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRnZXhjKCBsYXBhY2tfbG9naWNhbCogd2FudHEsIGxhcGFja19sb2dpY2FsKiB3YW50eiwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosIGxhcGFja19pbnQqIGlmc3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsc3QsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0Z3NlbiggbGFwYWNrX2ludCogaWpvYiwgbGFwYWNrX2xvZ2ljYWwqIHdhbnRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogd2FudHosIGNvbnN0IGxhcGFja19sb2dpY2FsKiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiBhbHBoYXIsIGZsb2F0KiBhbHBoYWksIGZsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogcGwsIGZsb2F0KiBwciwgZmxvYXQqIGRpZiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGdzZW4oIGxhcGFja19pbnQqIGlqb2IsIGxhcGFja19sb2dpY2FsKiB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHdhbnR6LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogYWxwaGFyLCBkb3VibGUqIGFscGhhaSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXRhLCBkb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19pbnQqIG0sIGRvdWJsZSogcGwsIGRvdWJsZSogcHIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZGlmLCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdGdzZW4oIGxhcGFja19pbnQqIGlqb2IsIGxhcGFja19sb2dpY2FsKiB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHdhbnR6LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGwsIGZsb2F0KiBwciwgZmxvYXQqIGRpZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dGdzZW4oIGxhcGFja19pbnQqIGlqb2IsIGxhcGFja19sb2dpY2FsKiB3YW50cSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIHdhbnR6LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBsLCBkb3VibGUqIHByLCBkb3VibGUqIGRpZiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Rnc3lsKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogaWpvYiwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgY29uc3QgZmxvYXQqIGQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkZCwgY29uc3QgZmxvYXQqIGUsIGxhcGFja19pbnQqIGxkZSwgZmxvYXQqIGYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkZiwgZmxvYXQqIHNjYWxlLCBmbG9hdCogZGlmLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGdzeWwoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBpam9iLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgY29uc3QgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGQsIGxhcGFja19pbnQqIGxkZCwgY29uc3QgZG91YmxlKiBlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGUsIGRvdWJsZSogZiwgbGFwYWNrX2ludCogbGRmLCBkb3VibGUqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRpZiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0Z3N5bCggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIGlqb2IsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLCBsYXBhY2tfaW50KiBsZGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBlLCBsYXBhY2tfaW50KiBsZGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBmLCBsYXBhY2tfaW50KiBsZGYsIGZsb2F0KiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRpZiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRnc3lsKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogaWpvYiwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBkLCBsYXBhY2tfaW50KiBsZGQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogZSwgbGFwYWNrX2ludCogbGRlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGYsIGxhcGFja19pbnQqIGxkZiwgZG91YmxlKiBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkaWYsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdGdzbmEoIGNoYXIqIGpvYiwgY2hhciogaG93bW55LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBjb25zdCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdmwsIGNvbnN0IGZsb2F0KiB2ciwgbGFwYWNrX2ludCogbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHMsIGZsb2F0KiBkaWYsIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGdzbmEoIGNoYXIqIGpvYiwgY2hhciogaG93bW55LCBjb25zdCBsYXBhY2tfbG9naWNhbCogc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGNvbnN0IGRvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdmwsIGNvbnN0IGRvdWJsZSogdnIsIGxhcGFja19pbnQqIGxkdnIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcywgZG91YmxlKiBkaWYsIGxhcGFja19pbnQqIG1tLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Rnc25hKCBjaGFyKiBqb2IsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnIsIGZsb2F0KiBzLCBmbG9hdCogZGlmLCBsYXBhY2tfaW50KiBtbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRnc25hKCBjaGFyKiBqb2IsIGNoYXIqIGhvd21ueSwgY29uc3QgbGFwYWNrX2xvZ2ljYWwqIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZyLCBkb3VibGUqIHMsIGRvdWJsZSogZGlmLCBsYXBhY2tfaW50KiBtbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZ3N2cCggY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9icSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHRvbGEsIGZsb2F0KiB0b2xiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLCBmbG9hdCogdSwgbGFwYWNrX2ludCogbGR1LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LCBmbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ3N2cCggY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9icSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHRvbGEsIGRvdWJsZSogdG9sYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwgZG91YmxlKiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdiwgbGFwYWNrX2ludCogbGR2LCBkb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGRvdWJsZSogdGF1LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZ3N2cCggY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9icSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvbGEsIGZsb2F0KiB0b2xiLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdSwgbGFwYWNrX2ludCogbGR1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdnc3ZwKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9sYSwgZG91YmxlKiB0b2xiLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0YXUsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3Rnc2phKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9sYSwgZmxvYXQqIHRvbGIsIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsIGZsb2F0KiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBuY3ljbGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0Z3NqYSggY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9icSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvbGEsIGRvdWJsZSogdG9sYiwgZG91YmxlKiBhbHBoYSwgZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHUsIGxhcGFja19pbnQqIGxkdSwgZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG5jeWNsZSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3Rnc2phKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogdG9sYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvbGIsIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBuY3ljbGUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0Z3NqYSggY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9icSwgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHRvbGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9sYiwgZG91YmxlKiBhbHBoYSwgZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIG5jeWNsZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlbHMoIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VscyggY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZWxzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWxzKCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWxzeSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoganB2dCwgZmxvYXQqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWxzeSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBqcHZ0LCBkb3VibGUqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2Vsc3koIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQqIGpwdnQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZCwgbGFwYWNrX2ludCogcmFuaywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWxzeSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBsYXBhY2tfaW50KiBqcHZ0LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2Vsc3MoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiBzLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmQsIGxhcGFja19pbnQqIHJhbmssIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlbHNzKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2ludCogcmFuaywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlbHNzKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlbHNzKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZCwgbGFwYWNrX2ludCogcmFuaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlbHNkKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2Vsc2QoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5yaHMsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiBzLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlbHNkKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBucmhzLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kLCBsYXBhY2tfaW50KiByYW5rLCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWxzZCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmQsIGxhcGFja19pbnQqIHJhbmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2dsc2UoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIHAsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogZCwgZmxvYXQqIHgsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdnbHNlKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBwLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogYywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkLCBkb3VibGUqIHgsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZ2xzZSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2dsc2UoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIHAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dnZ2xtKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGZsb2F0KiB5LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ2dsbSggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIGQsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgZG91YmxlKiB5LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2dnbG0oIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBkLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHksIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdnZ2xtKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHksIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeWV2KCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB3LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5ZXYoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogdywgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGVldiggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGVldiggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5ZXZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogdywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3lldmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHcsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZWV2ZCggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZWV2ZCggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCogbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3lldngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogdmwsIGZsb2F0KiB2dSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeWV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZWV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGZsb2F0KiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGVldngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB2bCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBkb3VibGUqIGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3lldnIoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogdmwsIGZsb2F0KiB2dSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXN1cHB6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeWV2ciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc3VwcHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZWV2ciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGZsb2F0KiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZWV2ciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwZXYoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhcCwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzcGV2KCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGFwLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwZXYoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGV2KCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwZXZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYXAsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzcGV2ZCggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhcCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3LCBkb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwZXZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogbHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aHBldmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwZXZ4KCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFwLCBmbG9hdCogdmwsIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNwZXZ4KCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgZG91YmxlKiB2bCwgZG91YmxlKiB2dSwgbGFwYWNrX2ludCogaWwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl1LCBkb3VibGUqIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NocGV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgZmxvYXQqIHZsLCBmbG9hdCogdnUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwgZmxvYXQqIGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhwZXZ4KCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhcCwgZG91YmxlKiB2bCwgZG91YmxlKiB2dSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBkb3VibGUqIGFic3RvbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzYmV2KCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiB3LCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2JldiggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2QsCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiB3LCBkb3VibGUqIHosCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoYmV2KCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhiZXYoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NiZXZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2JldmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGJldmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGJldmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzYmV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtkLCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGZsb2F0KiB2bCwgZmxvYXQqIHZ1LCBsYXBhY2tfaW50KiBpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXUsIGZsb2F0KiBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2JldngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogdmwsIGRvdWJsZSogdnUsIGxhcGFja19pbnQqIGlsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdSwgZG91YmxlKiBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGJldngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLCBmbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGJldngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBxLCBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwgZG91YmxlKiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3RldiggY2hhciogam9ieiwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLCBmbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3RldiggY2hhciogam9ieiwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBkLCBkb3VibGUqIGUsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N0ZXZkKCBjaGFyKiBqb2J6LCBsYXBhY2tfaW50KiBuLCBmbG9hdCogZCwgZmxvYXQqIGUsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN0ZXZkKCBjaGFyKiBqb2J6LCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGQsIGRvdWJsZSogZSwgZG91YmxlKiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzdGV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBkLCBmbG9hdCogZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBmbG9hdCogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGV2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N0ZXZyKCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGZsb2F0KiBlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmwsIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeiwgbGFwYWNrX2ludCogaXN1cHB6LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzdGV2ciggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBlLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfaW50KiBpc3VwcHosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWVzKCBjaGFyKiBqb2J2cywgY2hhciogc29ydCwgTEFQQUNLX1NfU0VMRUNUMiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogd3IsIGZsb2F0KiB3aSwgZmxvYXQqIHZzLCBsYXBhY2tfaW50KiBsZHZzLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWVzKCBjaGFyKiBqb2J2cywgY2hhciogc29ydCwgTEFQQUNLX0RfU0VMRUNUMiBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3ciwgZG91YmxlKiB3aSwgZG91YmxlKiB2cywgbGFwYWNrX2ludCogbGR2cywKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlZXMoIGNoYXIqIGpvYnZzLCBjaGFyKiBzb3J0LCBMQVBBQ0tfQ19TRUxFQ1QxIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHNkaW0sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2cywgbGFwYWNrX2ludCogbGR2cywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWVzKCBjaGFyKiBqb2J2cywgY2hhciogc29ydCwgTEFQQUNLX1pfU0VMRUNUMSBzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnMsIGxhcGFja19pbnQqIGxkdnMsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWVzeCggY2hhciogam9idnMsIGNoYXIqIHNvcnQsIExBUEFDS19TX1NFTEVDVDIgc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzZW5zZSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgZmxvYXQqIHdyLCBmbG9hdCogd2ksIGZsb2F0KiB2cywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2cywgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWVzeCggY2hhciogam9idnMsIGNoYXIqIHNvcnQsIExBUEFDS19EX1NFTEVDVDIgc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzZW5zZSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHNkaW0sIGRvdWJsZSogd3IsIGRvdWJsZSogd2ksIGRvdWJsZSogdnMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnMsIGRvdWJsZSogcmNvbmRlLCBkb3VibGUqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2Vlc3goIGNoYXIqIGpvYnZzLCBjaGFyKiBzb3J0LCBMQVBBQ0tfQ19TRUxFQ1QxIHNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogc2Vuc2UsIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIHNkaW0sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnMsIGxhcGFja19pbnQqIGxkdnMsIGZsb2F0KiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByY29uZHYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWVzeCggY2hhciogam9idnMsIGNoYXIqIHNvcnQsIExBUEFDS19aX1NFTEVDVDEgc2VsZWN0LAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzZW5zZSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIHNkaW0sIGxhcGFja19jb21wbGV4X2RvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2cywgbGFwYWNrX2ludCogbGR2cywgZG91YmxlKiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWV2KCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHdyLCBmbG9hdCogd2ksIGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBmbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VldiggY2hhciogam9idmwsIGNoYXIqIGpvYnZyLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHdyLCBkb3VibGUqIHdpLCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdmwsIGRvdWJsZSogdnIsIGxhcGFja19pbnQqIGxkdnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlZXYoIGNoYXIqIGpvYnZsLCBjaGFyKiBqb2J2ciwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2bCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50KiBsZHZyLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWV2KCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdmwsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VldngoIGNoYXIqIGJhbGFuYywgY2hhciogam9idmwsIGNoYXIqIGpvYnZyLCBjaGFyKiBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHdyLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd2ksIGZsb2F0KiB2bCwgbGFwYWNrX2ludCogbGR2bCwgZmxvYXQqIHZyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZyLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlLCBmbG9hdCogYWJucm0sIGZsb2F0KiByY29uZGUsIGZsb2F0KiByY29uZHYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWV2eCggY2hhciogYmFsYW5jLCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGNoYXIqIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB3ciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aSwgZG91YmxlKiB2bCwgbGFwYWNrX2ludCogbGR2bCwgZG91YmxlKiB2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogc2NhbGUsIGRvdWJsZSogYWJucm0sIGRvdWJsZSogcmNvbmRlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJjb25kdiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZWV2eCggY2hhciogYmFsYW5jLCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGNoYXIqIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdywgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogc2NhbGUsIGZsb2F0KiBhYm5ybSwgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWV2eCggY2hhciogYmFsYW5jLCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGNoYXIqIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZsLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZyLCBsYXBhY2tfaW50KiBpbG8sIGxhcGFja19pbnQqIGloaSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBzY2FsZSwgZG91YmxlKiBhYm5ybSwgZG91YmxlKiByY29uZGUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmNvbmR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VzdmQoIGNoYXIqIGpvYnUsIGNoYXIqIGpvYnZ0LCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogcywgZmxvYXQqIHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdSwgZmxvYXQqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXN2ZCggY2hhciogam9idSwgY2hhciogam9idnQsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHMsIGRvdWJsZSogdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR1LCBkb3VibGUqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VzdmQoIGNoYXIqIGpvYnUsIGNoYXIqIGpvYnZ0LCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogcywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlc3ZkKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2dCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogcywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnQsIGxhcGFja19pbnQqIGxkdnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXNkZCggY2hhciogam9ieiwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHMsIGZsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2dCwgbGFwYWNrX2ludCogbGR2dCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlc2RkKCBjaGFyKiBqb2J6LCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzLCBkb3VibGUqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2dCwgbGFwYWNrX2ludCogbGR2dCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXNkZCggY2hhciogam9ieiwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2dCwgbGFwYWNrX2ludCogbGR2dCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VzZGQoIGNoYXIqIGpvYnosIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdSwgbGFwYWNrX2ludCogbGR1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZ0LCBsYXBhY2tfaW50KiBsZHZ0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlanN2KCBjaGFyKiBqb2JhLCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JyLCBjaGFyKiBqb2J0LAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBqb2JwLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzdmEsIGRvdWJsZSogdSwgbGFwYWNrX2ludCogbGR1LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHYsIGxhcGFja19pbnQqIGxkdiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZWpzdiggY2hhciogam9iYSwgY2hhciogam9idSwgY2hhciogam9idiwgY2hhciogam9iciwgY2hhciogam9idCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogam9icCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHN2YSwgZmxvYXQqIHUsIGxhcGFja19pbnQqIGxkdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlc3ZqKCBjaGFyKiBqb2JhLCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBzdmEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG12LCBkb3VibGUqIHYsIGxhcGFja19pbnQqIGxkdiwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlc3ZqKCBjaGFyKiBqb2JhLCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogc3ZhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtdiwgZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwgZmxvYXQqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2dzdmQoIGNoYXIqIGpvYnUsIGNoYXIqIGpvYnYsIGNoYXIqIGpvYnEsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIHAsIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbHBoYSwgZmxvYXQqIGJldGEsIGZsb2F0KiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2LCBsYXBhY2tfaW50KiBsZHYsIGZsb2F0KiBxLCBsYXBhY2tfaW50KiBsZHEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdnc3ZkKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGEsIGRvdWJsZSogYmV0YSwgZG91YmxlKiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdiwgbGFwYWNrX2ludCogbGR2LCBkb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dnc3ZkKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdSwgbGFwYWNrX2ludCogbGR1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdnc3ZkKCBjaGFyKiBqb2J1LCBjaGFyKiBqb2J2LCBjaGFyKiBqb2JxLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB1LCBsYXBhY2tfaW50KiBsZHUsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5Z3YoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIHcsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHN5Z3YoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIHcsIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlZ3YoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhlZ3YoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zc3lndmQoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdywgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3lndmQoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlZ3ZkKCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3poZWd2ZCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB3LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeWd2eCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogdmwsIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeWd2eCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGRvdWJsZSogdmwsIGRvdWJsZSogdnUsIGxhcGFja19pbnQqIGlsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdSwgZG91YmxlKiBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hlZ3Z4KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB2bCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGZsb2F0KiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGVndngoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHZsLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzcGd2KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogYXAsIGZsb2F0KiBicCwgZmxvYXQqIHcsIGZsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzcGd2KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBkb3VibGUqIGJwLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hwZ3YoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcCwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJwLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBmbG9hdCogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGd2KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBkb3VibGUqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzcGd2ZCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhcCwgZmxvYXQqIGJwLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3BndmQoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFwLCBkb3VibGUqIGJwLCBkb3VibGUqIHcsIGRvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaHBndmQoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBicCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHcsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBscndvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBsaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGd2ZCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYnAsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdywgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NwZ3Z4KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhcCwgZmxvYXQqIGJwLCBmbG9hdCogdmwsIGZsb2F0KiB2dSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LCBmbG9hdCogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNwZ3Z4KCBsYXBhY2tfaW50KiBpdHlwZSwgY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYXAsIGRvdWJsZSogYnAsIGRvdWJsZSogdmwsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwgZG91YmxlKiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGlmYWlsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaHBndngoIGxhcGFja19pbnQqIGl0eXBlLCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYnAsIGZsb2F0KiB2bCwgZmxvYXQqIHZ1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGZsb2F0KiBhYnN0b2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGZsb2F0KiB3LCBsYXBhY2tfY29tcGxleF9mbG9hdCogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pocGd2eCggbGFwYWNrX2ludCogaXR5cGUsIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJwLCBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsIGRvdWJsZSogYWJzdG9sLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR6LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NiZ3YoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGthLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsIGZsb2F0KiBiYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGJiLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHNiZ3YoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGthLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBkb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLCBkb3VibGUqIGJiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYmIsIGRvdWJsZSogdywgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGJndiggY2hhciogam9ieiwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2EsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2IsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYmIsIGxhcGFja19pbnQqIGxkYmIsIGZsb2F0KiB3LAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhiZ3YoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGthLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGtiLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFiLCBsYXBhY2tfaW50KiBsZGFiLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsIGxhcGFja19pbnQqIGxkYmIsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NiZ3ZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2IsIGZsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGJiLCBmbG9hdCogdywgZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2JndmQoIGNoYXIqIGpvYnosIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGthLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrYiwgZG91YmxlKiBhYiwgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBiYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiYiwgZG91YmxlKiB3LCBkb3VibGUqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hiZ3ZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2IsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwgbGFwYWNrX2ludCogbGRhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLCBsYXBhY2tfaW50KiBsZGJiLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssIGxhcGFja19pbnQqIGxpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhiZ3ZkKCBjaGFyKiBqb2J6LCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2IsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsIGxhcGFja19pbnQqIGxkYmIsIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3NiZ3Z4KCBjaGFyKiBqb2J6LCBjaGFyKiByYW5nZSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga2EsIGxhcGFja19pbnQqIGtiLCBmbG9hdCogYWIsIGxhcGFja19pbnQqIGxkYWIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiYiwgbGFwYWNrX2ludCogbGRiYiwgZmxvYXQqIHEsIGxhcGFja19pbnQqIGxkcSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBmbG9hdCogdnUsIGxhcGFja19pbnQqIGlsLCBsYXBhY2tfaW50KiBpdSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFic3RvbCwgbGFwYWNrX2ludCogbSwgZmxvYXQqIHcsIGZsb2F0KiB6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHosIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWZhaWwsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzYmd2eCggY2hhciogam9ieiwgY2hhciogcmFuZ2UsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGthLCBsYXBhY2tfaW50KiBrYiwgZG91YmxlKiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgZG91YmxlKiBiYiwgbGFwYWNrX2ludCogbGRiYiwgZG91YmxlKiBxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHEsIGRvdWJsZSogdmwsIGRvdWJsZSogdnUsIGxhcGFja19pbnQqIGlsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpdSwgZG91YmxlKiBhYnN0b2wsIGxhcGFja19pbnQqIG0sIGRvdWJsZSogdywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB6LCBsYXBhY2tfaW50KiBsZHosIGRvdWJsZSogd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jaGJndngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrYSwgbGFwYWNrX2ludCoga2IsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhYiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGJiLCBsYXBhY2tfY29tcGxleF9mbG9hdCogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmwsIGZsb2F0KiB2dSwgbGFwYWNrX2ludCogaWwsIGxhcGFja19pbnQqIGl1LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBmbG9hdCogdywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHosIGxhcGFja19pbnQqIGxkeiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlmYWlsLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGJndngoIGNoYXIqIGpvYnosIGNoYXIqIHJhbmdlLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrYSwgbGFwYWNrX2ludCoga2IsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYWIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYmIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogcSwgbGFwYWNrX2ludCogbGRxLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZsLCBkb3VibGUqIHZ1LCBsYXBhY2tfaW50KiBpbCwgbGFwYWNrX2ludCogaXUsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWJzdG9sLCBsYXBhY2tfaW50KiBtLCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeiwgbGFwYWNrX2ludCogbGR6LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGRvdWJsZSogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfaW50KiBpZmFpbCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dnZXMoIGNoYXIqIGpvYnZzbCwgY2hhciogam9idnNyLCBjaGFyKiBzb3J0LAorICAgICAgICAgICAgICAgICAgIExBUEFDS19TX1NFTEVDVDMgc2VsY3RnLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFscGhhciwgZmxvYXQqIGFscGhhaSwgZmxvYXQqIGJldGEsIGZsb2F0KiB2c2wsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2c2wsIGZsb2F0KiB2c3IsIGxhcGFja19pbnQqIGxkdnNyLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ2VzKCBjaGFyKiBqb2J2c2wsIGNoYXIqIGpvYnZzciwgY2hhciogc29ydCwKKyAgICAgICAgICAgICAgICAgICBMQVBBQ0tfRF9TRUxFQ1QzIHNlbGN0ZywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogc2RpbSwgZG91YmxlKiBhbHBoYXIsIGRvdWJsZSogYWxwaGFpLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2c2wsIGxhcGFja19pbnQqIGxkdnNsLCBkb3VibGUqIHZzciwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZzciwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZ2VzKCBjaGFyKiBqb2J2c2wsIGNoYXIqIGpvYnZzciwgY2hhciogc29ydCwKKyAgICAgICAgICAgICAgICAgICBMQVBBQ0tfQ19TRUxFQ1QyIHNlbGN0ZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQqIHNkaW0sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnNsLCBsYXBhY2tfaW50KiBsZHZzbCwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnNyLCBsYXBhY2tfaW50KiBsZHZzciwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfbG9naWNhbCogYndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZ2VzKCBjaGFyKiBqb2J2c2wsIGNoYXIqIGpvYnZzciwgY2hhciogc29ydCwKKyAgICAgICAgICAgICAgICAgICBMQVBBQ0tfWl9TRUxFQ1QyIHNlbGN0ZywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFscGhhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGJldGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2c2wsIGxhcGFja19pbnQqIGxkdnNsLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnNyLCBsYXBhY2tfaW50KiBsZHZzciwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19sb2dpY2FsKiBid29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dnZXN4KCBjaGFyKiBqb2J2c2wsIGNoYXIqIGpvYnZzciwgY2hhciogc29ydCwKKyAgICAgICAgICAgICAgICAgICAgTEFQQUNLX1NfU0VMRUNUMyBzZWxjdGcsIGNoYXIqIHNlbnNlLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBzZGltLCBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZzbCwgbGFwYWNrX2ludCogbGR2c2wsIGZsb2F0KiB2c3IsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdnNyLCBmbG9hdCogcmNvbmRlLCBmbG9hdCogcmNvbmR2LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssIGxhcGFja19pbnQqIGl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsaXdvcmssIGxhcGFja19sb2dpY2FsKiBid29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdnZXN4KCBjaGFyKiBqb2J2c2wsIGNoYXIqIGpvYnZzciwgY2hhciogc29ydCwKKyAgICAgICAgICAgICAgICAgICAgTEFQQUNLX0RfU0VMRUNUMyBzZWxjdGcsIGNoYXIqIHNlbnNlLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIHNkaW0sIGRvdWJsZSogYWxwaGFyLCBkb3VibGUqIGFscGhhaSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiZXRhLCBkb3VibGUqIHZzbCwgbGFwYWNrX2ludCogbGR2c2wsIGRvdWJsZSogdnNyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHZzciwgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZ2VzeCggY2hhciogam9idnNsLCBjaGFyKiBqb2J2c3IsIGNoYXIqIHNvcnQsCisgICAgICAgICAgICAgICAgICAgIExBUEFDS19DX1NFTEVDVDIgc2VsY3RnLCBjaGFyKiBzZW5zZSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZzbCwgbGFwYWNrX2ludCogbGR2c2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2c3IsIGxhcGFja19pbnQqIGxkdnNyLCBmbG9hdCogcmNvbmRlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmNvbmR2LCBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmssIGZsb2F0KiByd29yaywgbGFwYWNrX2ludCogaXdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxpd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2dlc3goIGNoYXIqIGpvYnZzbCwgY2hhciogam9idnNyLCBjaGFyKiBzb3J0LAorICAgICAgICAgICAgICAgICAgICBMQVBBQ0tfWl9TRUxFQ1QyIHNlbGN0ZywgY2hhciogc2Vuc2UsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgbGFwYWNrX2ludCogc2RpbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHZzbCwgbGFwYWNrX2ludCogbGR2c2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdnNyLCBsYXBhY2tfaW50KiBsZHZzciwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZ2V2KCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwgZmxvYXQqIGFscGhhciwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwgZmxvYXQqIHZsLCBsYXBhY2tfaW50KiBsZHZsLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2ciwgbGFwYWNrX2ludCogbGR2ciwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZ2V2KCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIGFscGhhciwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFscGhhaSwgZG91YmxlKiBiZXRhLCBkb3VibGUqIHZsLCBsYXBhY2tfaW50KiBsZHZsLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdnIsIGxhcGFja19pbnQqIGxkdnIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dnZXYoIGNoYXIqIGpvYnZsLCBjaGFyKiBqb2J2ciwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdmwsIGxhcGFja19pbnQqIGxkdmwsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZyLCBsYXBhY2tfaW50KiBsZHZyLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywgZmxvYXQqIHJ3b3JrLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZ2V2KCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdmwsIGxhcGFja19pbnQqIGxkdmwsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCogbGR2ciwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcndvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZ2V2eCggY2hhciogYmFsYW5jLCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGNoYXIqIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBmbG9hdCogYWxwaGFyLCBmbG9hdCogYWxwaGFpLCBmbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZsLCBsYXBhY2tfaW50KiBsZHZsLCBmbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlsbywgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcnNjYWxlLCBmbG9hdCogYWJucm0sIGZsb2F0KiBiYm5ybSwgZmxvYXQqIHJjb25kZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJjb25kdiwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2dldngoIGNoYXIqIGJhbGFuYywgY2hhciogam9idmwsIGNoYXIqIGpvYnZyLCBjaGFyKiBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIGFscGhhciwgZG91YmxlKiBhbHBoYWksCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYmV0YSwgZG91YmxlKiB2bCwgbGFwYWNrX2ludCogbGR2bCwgZG91YmxlKiB2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2ciwgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbHNjYWxlLCBkb3VibGUqIHJzY2FsZSwgZG91YmxlKiBhYm5ybSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBiYm5ybSwgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2LCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBsYXBhY2tfaW50KiBpd29yaywgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2dldngoIGNoYXIqIGJhbGFuYywgY2hhciogam9idmwsIGNoYXIqIGpvYnZyLCBjaGFyKiBzZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHZsLCBsYXBhY2tfaW50KiBsZHZsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdnIsIGxhcGFja19pbnQqIGxkdnIsIGxhcGFja19pbnQqIGlsbywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWhpLCBmbG9hdCogbHNjYWxlLCBmbG9hdCogcnNjYWxlLCBmbG9hdCogYWJucm0sCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiYm5ybSwgZmxvYXQqIHJjb25kZSwgZmxvYXQqIHJjb25kdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrLCBsYXBhY2tfbG9naWNhbCogYndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZ2V2eCggY2hhciogYmFsYW5jLCBjaGFyKiBqb2J2bCwgY2hhciogam9idnIsIGNoYXIqIHNlbnNlLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2bCwgbGFwYWNrX2ludCogbGR2bCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2ciwgbGFwYWNrX2ludCogbGR2ciwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaWxvLCBsYXBhY2tfaW50KiBpaGksIGRvdWJsZSogbHNjYWxlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJzY2FsZSwgZG91YmxlKiBhYm5ybSwgZG91YmxlKiBiYm5ybSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByY29uZGUsIGRvdWJsZSogcmNvbmR2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGx3b3JrLCBkb3VibGUqIHJ3b3JrLCBsYXBhY2tfaW50KiBpd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2xvZ2ljYWwqIGJ3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc2ZyayggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBkb3VibGUqIGFscGhhLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGJldGEsIGRvdWJsZSogYyApOwordm9pZCBMQVBBQ0tfc3NmcmsoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgZmxvYXQqIGFscGhhLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiZXRhLCBmbG9hdCogYyApOwordm9pZCBMQVBBQ0tfemhmcmsoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgZG91YmxlKiBhbHBoYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiZXRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMgKTsKK3ZvaWQgTEFQQUNLX2NoZnJrKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGZsb2F0KiBhbHBoYSwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYmV0YSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMgKTsKK3ZvaWQgTEFQQUNLX2R0ZnNtKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHNpZGUsIGNoYXIqIHVwbG8sIGNoYXIqIHRyYW5zLAorICAgICAgICAgICAgICAgICAgIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBhLCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiApOwordm9pZCBMQVBBQ0tfc3Rmc20oIGNoYXIqIHRyYW5zciwgY2hhciogc2lkZSwgY2hhciogdXBsbywgY2hhciogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgY2hhciogZGlhZywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhLCBmbG9hdCogYiwgbGFwYWNrX2ludCogbGRiICk7Cit2b2lkIExBUEFDS196dGZzbSggY2hhciogdHJhbnNyLCBjaGFyKiBzaWRlLCBjaGFyKiB1cGxvLCBjaGFyKiB0cmFucywKKyAgICAgICAgICAgICAgICAgICBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiApOwordm9pZCBMQVBBQ0tfY3Rmc20oIGNoYXIqIHRyYW5zciwgY2hhciogc2lkZSwgY2hhciogdXBsbywgY2hhciogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgY2hhciogZGlhZywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYWxwaGEsIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIgKTsKK3ZvaWQgTEFQQUNLX2R0ZnR0cCggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RmdHRwKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhcmYsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRmdHRwKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXJmLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdGZ0dHAoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFyZiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdGZ0dHIoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiBhcmYsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdGZ0dHIoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGFyZiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRmdHRyKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXJmLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RmdHRyKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhcmYsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cHR0ZiggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFyZiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RwdHRmKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhcCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFyZiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRwdHRmKCBjaGFyKiB0cmFuc3IsIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXJmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHB0dGYoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXJmLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHB0dHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYXAsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zdHB0dHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGZsb2F0KiBhcCwgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenRwdHRyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RwdHRyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cnR0ZiggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBhcmYsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cnR0ZiggY2hhciogdHJhbnNyLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYXJmLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHJ0dGYoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXJmLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHJ0dGYoIGNoYXIqIHRyYW5zciwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFyZiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZHRydHRwKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhcCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RydHRwKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYXAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cnR0cCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogYXAsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0cnR0cCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VxcmZwKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcXJmcCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXFyZnAoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlcXJmcCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jbGFjZ3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBpbmN4ICk7Cit2b2lkIExBUEFDS196bGFjZ3YoIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogeCwgbGFwYWNrX2ludCogaW5jeCApOwordm9pZCBMQVBBQ0tfc2xhcm52KCBsYXBhY2tfaW50KiBpZGlzdCwgbGFwYWNrX2ludCogaXNlZWQsIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB4ICk7Cit2b2lkIExBUEFDS19kbGFybnYoIGxhcGFja19pbnQqIGlkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4ICk7Cit2b2lkIExBUEFDS19jbGFybnYoIGxhcGFja19pbnQqIGlkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHggKTsKK3ZvaWQgTEFQQUNLX3psYXJudiggbGFwYWNrX2ludCogaWRpc3QsIGxhcGFja19pbnQqIGlzZWVkLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHggKTsKK3ZvaWQgTEFQQUNLX3NnZXFyMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXFyMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXFyMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXFyMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NsYWNweSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiApOwordm9pZCBMQVBBQ0tfZGxhY3B5KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIgKTsKK3ZvaWQgTEFQQUNLX2NsYWNweSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiApOwordm9pZCBMQVBBQ0tfemxhY3B5KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIgKTsKK3ZvaWQgTEFQQUNLX3NnZXRmMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdldGYyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dldGYyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2V0ZjIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zbGFzd3AoIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGsxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrMiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwgbGFwYWNrX2ludCogaW5jeCApOwordm9pZCBMQVBBQ0tfZGxhc3dwKCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogazEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGsyLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBsYXBhY2tfaW50KiBpbmN4ICk7Cit2b2lkIExBUEFDS19jbGFzd3AoIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGsxLCBsYXBhY2tfaW50KiBrMiwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaW5jeCApOwordm9pZCBMQVBBQ0tfemxhc3dwKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogazEsIGxhcGFja19pbnQqIGsyLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpbmN4ICk7CitmbG9hdCBMQVBBQ0tfc2xhbmdlKCBjaGFyKiBub3JtLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS19kbGFuZ2UoIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHdvcmsgKTsKK2Zsb2F0IExBUEFDS19jbGFuZ2UoIGNoYXIqIG5vcm0sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB3b3JrICk7Citkb3VibGUgTEFQQUNLX3psYW5nZSggY2hhciogbm9ybSwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogd29yayApOworZmxvYXQgTEFQQUNLX2NsYW5oZSggY2hhciogbm9ybSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHdvcmsgKTsKK2RvdWJsZSBMQVBBQ0tfemxhbmhlKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB3b3JrICk7CitmbG9hdCBMQVBBQ0tfc2xhbnN5KCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS19kbGFuc3koIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIHdvcmsgKTsKK2Zsb2F0IExBUEFDS19jbGFuc3koIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB3b3JrICk7Citkb3VibGUgTEFQQUNLX3psYW5zeSggY2hhciogbm9ybSwgY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogd29yayApOworZmxvYXQgTEFQQUNLX3NsYW50ciggY2hhciogbm9ybSwgY2hhciogdXBsbywgY2hhciogZGlhZywgbGFwYWNrX2ludCogbSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgY29uc3QgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIHdvcmsgKTsKK2RvdWJsZSBMQVBBQ0tfZGxhbnRyKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB3b3JrICk7CitmbG9hdCBMQVBBQ0tfY2xhbnRyKCBjaGFyKiBub3JtLCBjaGFyKiB1cGxvLCBjaGFyKiBkaWFnLCBsYXBhY2tfaW50KiBtLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yayApOworZG91YmxlIExBUEFDS196bGFudHIoIGNoYXIqIG5vcm0sIGNoYXIqIHVwbG8sIGNoYXIqIGRpYWcsIGxhcGFja19pbnQqIG0sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmsgKTsKK2Zsb2F0IExBUEFDS19zbGFtY2goIGNoYXIqIGNtYWNoICk7Citkb3VibGUgTEFQQUNLX2RsYW1jaCggY2hhciogY21hY2ggKTsKK3ZvaWQgTEFQQUNLX3NnZWxxMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZWxxMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1LCBkb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZWxxMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZWxxMiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NsYXJmYiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGNoYXIqIGRpcmVjdCwgY2hhciogc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBjb25zdCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2LCBjb25zdCBmbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LCBmbG9hdCogYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbGR3b3JrICk7Cit2b2lkIExBUEFDS19kbGFyZmIoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsIGNvbnN0IGRvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR0LCBkb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHdvcmsgKTsKK3ZvaWQgTEFQQUNLX2NsYXJmYiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGNoYXIqIGRpcmVjdCwgY2hhciogc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbGR3b3JrICk7Cit2b2lkIExBUEFDS196bGFyZmIoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsZHdvcmsgKTsKK3ZvaWQgTEFQQUNLX3NsYXJmZyggbGFwYWNrX2ludCogbiwgZmxvYXQqIGFscGhhLCBmbG9hdCogeCwgbGFwYWNrX2ludCogaW5jeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSApOwordm9pZCBMQVBBQ0tfZGxhcmZnKCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGFscGhhLCBkb3VibGUqIHgsIGxhcGFja19pbnQqIGluY3gsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1ICk7Cit2b2lkIExBUEFDS19jbGFyZmcoIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgsIGxhcGFja19pbnQqIGluY3gsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXUgKTsKK3ZvaWQgTEFQQUNLX3psYXJmZyggbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBpbmN4LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSApOwordm9pZCBMQVBBQ0tfc2xhcmZ0KCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwgY29uc3QgZmxvYXQqIHRhdSwgZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCApOwordm9pZCBMQVBBQ0tfZGxhcmZ0KCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsIGNvbnN0IGRvdWJsZSogdGF1LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCApOwordm9pZCBMQVBBQ0tfY2xhcmZ0KCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCApOwordm9pZCBMQVBBQ0tfemxhcmZ0KCBjaGFyKiBkaXJlY3QsIGNoYXIqIHN0b3JldiwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCApOwordm9pZCBMQVBBQ0tfc2xhcmZ4KCBjaGFyKiBzaWRlLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogdiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdSwgZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywgZmxvYXQqIHdvcmsgKTsKK3ZvaWQgTEFQQUNLX2RsYXJmeCggY2hhciogc2lkZSwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgY29uc3QgZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRhdSwgZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsIGRvdWJsZSogd29yayApOwordm9pZCBMQVBBQ0tfY2xhcmZ4KCBjaGFyKiBzaWRlLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGMsIGxhcGFja19pbnQqIGxkYywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgKTsKK3ZvaWQgTEFQQUNLX3psYXJmeCggY2hhciogc2lkZSwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yayApOwordm9pZCBMQVBBQ0tfc2xhdG1zKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjaGFyKiBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogc3ltLCBmbG9hdCogZCwgbGFwYWNrX2ludCogbW9kZSwgZmxvYXQqIGNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkbWF4LCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsIGNoYXIqIHBhY2ssCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kbGF0bXMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNoYXIqIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzeW0sIGRvdWJsZSogZCwgbGFwYWNrX2ludCogbW9kZSwgZG91YmxlKiBjb25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRtYXgsIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwgY2hhciogcGFjaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2xhdG1zKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjaGFyKiBkaXN0LCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogc3ltLCBmbG9hdCogZCwgbGFwYWNrX2ludCogbW9kZSwgZmxvYXQqIGNvbmQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkbWF4LCBsYXBhY2tfaW50KiBrbCwgbGFwYWNrX2ludCoga3UsIGNoYXIqIHBhY2ssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196bGF0bXMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNoYXIqIGRpc3QsIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzeW0sIGRvdWJsZSogZCwgbGFwYWNrX2ludCogbW9kZSwgZG91YmxlKiBjb25kLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRtYXgsIGxhcGFja19pbnQqIGtsLCBsYXBhY2tfaW50KiBrdSwgY2hhciogcGFjaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2xhZzJkKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBjb25zdCBmbG9hdCogc2EsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkc2EsIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kbGFnMnMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGNvbnN0IGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogc2EsIGxhcGFja19pbnQqIGxkc2EsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NsYWcyeiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHNhLCBsYXBhY2tfaW50KiBsZHNhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemxhZzJjKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHNhLCBsYXBhY2tfaW50KiBsZHNhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zbGF1dW0oIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RsYXV1bSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NsYXV1bSggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemxhdXVtKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2xhZ2dlKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGNvbnN0IGZsb2F0KiBkLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc2VlZCwgZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RsYWdnZSggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCoga2wsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGt1LCBjb25zdCBkb3VibGUqIGQsIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpc2VlZCwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jbGFnZ2UoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGtsLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrdSwgY29uc3QgZmxvYXQqIGQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemxhZ2dlKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrbCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCoga3UsIGNvbnN0IGRvdWJsZSogZCwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlzZWVkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NsYXNldCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmV0YSwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSApOwordm9pZCBMQVBBQ0tfZGxhc2V0KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJldGEsIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhICk7Cit2b2lkIExBUEFDS19jbGFzZXQoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhbHBoYSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGJldGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEgKTsKK3ZvaWQgTEFQQUNLX3psYXNldCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhbHBoYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiZXRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSApOwordm9pZCBMQVBBQ0tfc2xhc3J0KCBjaGFyKiBpZCwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGQsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RsYXNydCggY2hhciogaWQsIGxhcGFja19pbnQqIG4sIGRvdWJsZSogZCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2xhZ2hlKCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBjb25zdCBmbG9hdCogZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2ludCogaXNlZWQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196bGFnaGUoIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGNvbnN0IGRvdWJsZSogZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGlzZWVkLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NsYWdzeSggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywgY29uc3QgZmxvYXQqIGQsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19pbnQqIGlzZWVkLCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGxhZ3N5KCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBjb25zdCBkb3VibGUqIGQsIGRvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpc2VlZCwgZG91YmxlKiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jbGFnc3koIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGNvbnN0IGZsb2F0KiBkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfaW50KiBpc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3psYWdzeSggbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogaywgY29uc3QgZG91YmxlKiBkLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXNlZWQsIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2xhcG1yKCBsYXBhY2tfbG9naWNhbCogZm9yd3JkLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCwgbGFwYWNrX2ludCogbGR4LCBsYXBhY2tfaW50KiBrICk7Cit2b2lkIExBUEFDS19kbGFwbXIoIGxhcGFja19sb2dpY2FsKiBmb3J3cmQsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeCwgbGFwYWNrX2ludCogbGR4LCBsYXBhY2tfaW50KiBrICk7Cit2b2lkIExBUEFDS19jbGFwbXIoIGxhcGFja19sb2dpY2FsKiBmb3J3cmQsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBsZHgsIGxhcGFja19pbnQqIGsgKTsKK3ZvaWQgTEFQQUNLX3psYXBtciggbGFwYWNrX2xvZ2ljYWwqIGZvcndyZCwgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBsZHgsIGxhcGFja19pbnQqIGsgKTsKK2Zsb2F0IExBUEFDS19zbGFweTIoIGZsb2F0KiB4LCBmbG9hdCogeSApOworZG91YmxlIExBUEFDS19kbGFweTIoIGRvdWJsZSogeCwgZG91YmxlKiB5ICk7CitmbG9hdCBMQVBBQ0tfc2xhcHkzKCBmbG9hdCogeCwgZmxvYXQqIHksIGZsb2F0KiB6ICk7Citkb3VibGUgTEFQQUNLX2RsYXB5MyggZG91YmxlKiB4LCBkb3VibGUqIHksIGRvdWJsZSogeiApOwordm9pZCBMQVBBQ0tfc2xhcnRncCggZmxvYXQqIGYsIGZsb2F0KiBnLCBmbG9hdCogY3MsIGZsb2F0KiBzbiwgZmxvYXQqIHIgKTsKK3ZvaWQgTEFQQUNLX2RsYXJ0Z3AoIGRvdWJsZSogZiwgZG91YmxlKiBnLCBkb3VibGUqIGNzLCBkb3VibGUqIHNuLCBkb3VibGUqIHIgKTsKK3ZvaWQgTEFQQUNLX3NsYXJ0Z3MoIGZsb2F0KiB4LCBmbG9hdCogeSwgZmxvYXQqIHNpZ21hLCBmbG9hdCogY3MsIGZsb2F0KiBzbiApOwordm9pZCBMQVBBQ0tfZGxhcnRncyggZG91YmxlKiB4LCBkb3VibGUqIHksIGRvdWJsZSogc2lnbWEsIGRvdWJsZSogY3MsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNuICk7CisvLyBMQVBBQ0sgMy4zLjAKK3ZvaWQgTEFQQUNLX2NiYmNzZCggY2hhciogam9idTEsIGNoYXIqIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBqb2J2MXQsIGNoYXIqIGpvYnYydCwgY2hhciogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsIGxhcGFja19pbnQqIHEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aGV0YSwgZmxvYXQqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUxLCBsYXBhY2tfaW50KiBsZHUxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdTIsIGxhcGFja19pbnQqIGxkdTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2MXQsIGxhcGFja19pbnQqIGxkdjF0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdjJ0LCBsYXBhY2tfaW50KiBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMWQsIGZsb2F0KiBiMTFlLCBmbG9hdCogYjEyZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIxMmUsIGZsb2F0KiBiMjFkLCBmbG9hdCogYjIxZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGIyMmQsIGZsb2F0KiBiMjJlLCBmbG9hdCogcndvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxyd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZXN3YXByKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBpMSwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpMiApOwordm9pZCBMQVBBQ0tfY2hldHJpMiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2hldHJpMngoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBuYiAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NoZXRyczIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzeWNvbnYoIGNoYXIqIHVwbG8sIGNoYXIqIHdheSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3lzd2FwciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogaTEsCisgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaTIgKTsKK3ZvaWQgTEFQQUNLX2NzeXRyaTIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NzeXRyaTJ4KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbmIgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jc3l0cnMyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5iZGIoIGNoYXIqIHRyYW5zLCBjaGFyKiBzaWducywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogcSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgxMSwgbGFwYWNrX2ludCogbGR4MTEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MTIsIGxhcGFja19pbnQqIGxkeDEyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogeDIxLCBsYXBhY2tfaW50KiBsZHgyMSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMiwgbGFwYWNrX2ludCogbGR4MjIsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aGV0YSwgZmxvYXQqIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdXAxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0YXVxMSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHRhdXEyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdW5jc2QoIGNoYXIqIGpvYnUxLCBjaGFyKiBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogam9idjF0LCBjaGFyKiBqb2J2MnQsIGNoYXIqIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzaWducywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgxMSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4MTEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB4MTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeDEyLCBsYXBhY2tfY29tcGxleF9mbG9hdCogeDIxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgyMSwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHgyMiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4MjIsIGZsb2F0KiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHUxLCBsYXBhY2tfaW50KiBsZHUxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdTIsIGxhcGFja19pbnQqIGxkdTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB2MXQsIGxhcGFja19pbnQqIGxkdjF0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogdjJ0LCBsYXBhY2tfaW50KiBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcndvcmssIGxhcGFja19pbnQqIGxyd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kYmJjc2QoIGNoYXIqIGpvYnUxLCBjaGFyKiBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogam9idjF0LCBjaGFyKiBqb2J2MnQsIGNoYXIqIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBxLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRoZXRhLCBkb3VibGUqIHBoaSwgZG91YmxlKiB1MSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR1MSwgZG91YmxlKiB1MiwgbGFwYWNrX2ludCogbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB2MXQsIGxhcGFja19pbnQqIGxkdjF0LCBkb3VibGUqIHYydCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2MnQsIGRvdWJsZSogYjExZCwgZG91YmxlKiBiMTFlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIxMmQsIGRvdWJsZSogYjEyZSwgZG91YmxlKiBiMjFkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIyMWUsIGRvdWJsZSogYjIyZCwgZG91YmxlKiBiMjJlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZG9yYmRiKCBjaGFyKiB0cmFucywgY2hhciogc2lnbnMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsIGxhcGFja19pbnQqIHEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeDExLCBsYXBhY2tfaW50KiBsZHgxMSwgZG91YmxlKiB4MTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeDEyLCBkb3VibGUqIHgyMSwgbGFwYWNrX2ludCogbGR4MjEsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeDIyLCBsYXBhY2tfaW50KiBsZHgyMiwgZG91YmxlKiB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwaGksIGRvdWJsZSogdGF1cDEsIGRvdWJsZSogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdGF1cTEsIGRvdWJsZSogdGF1cTIsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kb3Jjc2QoIGNoYXIqIGpvYnUxLCBjaGFyKiBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogam9idjF0LCBjaGFyKiBqb2J2MnQsIGNoYXIqIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzaWducywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcSwgZG91YmxlKiB4MTEsIGxhcGFja19pbnQqIGxkeDExLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgxMiwgbGFwYWNrX2ludCogbGR4MTIsIGRvdWJsZSogeDIxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgyMSwgZG91YmxlKiB4MjIsIGxhcGFja19pbnQqIGxkeDIyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRoZXRhLCBkb3VibGUqIHUxLCBsYXBhY2tfaW50KiBsZHUxLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHUyLCBsYXBhY2tfaW50KiBsZHUyLCBkb3VibGUqIHYxdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2MXQsIGRvdWJsZSogdjJ0LCBsYXBhY2tfaW50KiBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaXdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kc3ljb252KCBjaGFyKiB1cGxvLCBjaGFyKiB3YXksCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeXN3YXByKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogaTEsIGxhcGFja19pbnQqIGkyICk7Cit2b2lkIExBUEFDS19kc3l0cmkyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeXRyaTJ4KCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuYiAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RzeXRyczIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2JiY3NkKCBjaGFyKiBqb2J1MSwgY2hhciogam9idTIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIGpvYnYxdCwgY2hhciogam9idjJ0LCBjaGFyKiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogcSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRoZXRhLCBmbG9hdCogcGhpLCBmbG9hdCogdTEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdTEsIGZsb2F0KiB1MiwgbGFwYWNrX2ludCogbGR1MiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHYxdCwgbGFwYWNrX2ludCogbGR2MXQsIGZsb2F0KiB2MnQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdjJ0LCBmbG9hdCogYjExZCwgZmxvYXQqIGIxMWUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiMTJkLCBmbG9hdCogYjEyZSwgZmxvYXQqIGIyMWQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiMjFlLCBmbG9hdCogYjIyZCwgZmxvYXQqIGIyMmUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50KiBsd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NvcmJkYiggY2hhciogdHJhbnMsIGNoYXIqIHNpZ25zLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLCBsYXBhY2tfaW50KiBxLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogeDExLCBsYXBhY2tfaW50KiBsZHgxMSwgZmxvYXQqIHgxMiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4MTIsIGZsb2F0KiB4MjEsIGxhcGFja19pbnQqIGxkeDIxLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogeDIyLCBsYXBhY2tfaW50KiBsZHgyMiwgZmxvYXQqIHRoZXRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGhpLCBmbG9hdCogdGF1cDEsIGZsb2F0KiB0YXVwMiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRhdXExLCBmbG9hdCogdGF1cTIsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NvcmNzZCggY2hhciogam9idTEsIGNoYXIqIGpvYnUyLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBqb2J2MXQsIGNoYXIqIGpvYnYydCwgY2hhciogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHNpZ25zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBwLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBxLCBmbG9hdCogeDExLCBsYXBhY2tfaW50KiBsZHgxMSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgxMiwgbGFwYWNrX2ludCogbGR4MTIsIGZsb2F0KiB4MjEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeDIxLCBmbG9hdCogeDIyLCBsYXBhY2tfaW50KiBsZHgyMiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRoZXRhLCBmbG9hdCogdTEsIGxhcGFja19pbnQqIGxkdTEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB1MiwgbGFwYWNrX2ludCogbGR1MiwgZmxvYXQqIHYxdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2MXQsIGZsb2F0KiB2MnQsIGxhcGFja19pbnQqIGxkdjJ0LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogd29yaywgbGFwYWNrX2ludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGl3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5Y29udiggY2hhciogdXBsbywgY2hhciogd2F5LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19pbnQqIGlwaXYsIGZsb2F0KiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5c3dhcHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQqIGkxLCBsYXBhY2tfaW50KiBpMiApOwordm9pZCBMQVBBQ0tfc3N5dHJpMiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQqIGx3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3N5dHJpMngoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LCBmbG9hdCogd29yaywKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBuYiAsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NzeXRyczIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBucmhzLCBjb25zdCBmbG9hdCogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemJiY3NkKCBjaGFyKiBqb2J1MSwgY2hhciogam9idTIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIGpvYnYxdCwgY2hhciogam9idjJ0LCBjaGFyKiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwgbGFwYWNrX2ludCogcSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0aGV0YSwgZG91YmxlKiBwaGksCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdTEsIGxhcGFja19pbnQqIGxkdTEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdTIsIGxhcGFja19pbnQqIGxkdTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdjF0LCBsYXBhY2tfaW50KiBsZHYxdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2MnQsIGxhcGFja19pbnQqIGxkdjJ0LAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIxMWQsIGRvdWJsZSogYjExZSwgZG91YmxlKiBiMTJkLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIxMmUsIGRvdWJsZSogYjIxZCwgZG91YmxlKiBiMjFlLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGIyMmQsIGRvdWJsZSogYjIyZSwgZG91YmxlKiByd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbHJ3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemhlc3dhcHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBpMSwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpMiApOwordm9pZCBMQVBBQ0tfemhldHJpMiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGV0cmkyeCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbmIgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196aGV0cnMyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5Y29udiggY2hhciogdXBsbywgY2hhciogd2F5LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenN5c3dhcHIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBpMSwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpMiApOwordm9pZCBMQVBBQ0tfenN5dHJpMiggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3l0cmkyeCggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfaW50KiBpcGl2LAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbmIgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196c3l0cnMyKCBjaGFyKiB1cGxvLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbnJocywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2ludCogaXBpdiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrICwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfenVuYmRiKCBjaGFyKiB0cmFucywgY2hhciogc2lnbnMsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIHAsIGxhcGFja19pbnQqIHEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDExLCBsYXBhY2tfaW50KiBsZHgxMSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MTIsIGxhcGFja19pbnQqIGxkeDEyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgyMSwgbGFwYWNrX2ludCogbGR4MjEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDIyLCBsYXBhY2tfaW50KiBsZHgyMiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0aGV0YSwgZG91YmxlKiBwaGksCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cDEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cDIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cTEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdGF1cTIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCogbHdvcmsgLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dW5jc2QoIGNoYXIqIGpvYnUxLCBjaGFyKiBqb2J1MiwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogam9idjF0LCBjaGFyKiBqb2J2MnQsIGNoYXIqIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiBzaWducywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogcCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogcSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MTEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeDExLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHgxMiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR4MTIsIGxhcGFja19jb21wbGV4X2RvdWJsZSogeDIxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHgyMSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4MjIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkeDIyLCBkb3VibGUqIHRoZXRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUxLCBsYXBhY2tfaW50KiBsZHUxLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHUyLCBsYXBhY2tfaW50KiBsZHUyLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYxdCwgbGFwYWNrX2ludCogbGR2MXQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogdjJ0LCBsYXBhY2tfaW50KiBsZHYydCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByd29yaywgbGFwYWNrX2ludCogbHJ3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBpd29yayAsIGxhcGFja19pbnQgKmluZm8gKTsKKy8vIExBUEFDSyAzLjQuMAordm9pZCBMQVBBQ0tfc2dlbXFydCggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBuYiwgY29uc3QgZmxvYXQqIHYsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZHYsIGNvbnN0IGZsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsIGZsb2F0KiBjLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRjLCBmbG9hdCogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlbXFydCggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBuYiwgY29uc3QgZG91YmxlKiB2LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR2LCBjb25zdCBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYywgbGFwYWNrX2ludCogbGRjLCBkb3VibGUqIHdvcmssCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jZ2VtcXJ0KCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIG5iLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYywgbGFwYWNrX2ludCogbGRjLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZW1xcnQoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbmIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHYsIGxhcGFja19pbnQqIGxkdiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBjLCBsYXBhY2tfaW50KiBsZGMsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3NnZXFydCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmIsIGZsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGZsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsIGZsb2F0KiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kZ2VxcnQoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIG5iLCBkb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlcXJ0KCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBuYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3pnZXFydCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19zZ2VxcnQyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfZGdlcXJ0MiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY2dlcXJ0MiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196Z2VxcnQyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIGEsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGEsIGxhcGFja19jb21wbGV4X2RvdWJsZSogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc2dlcXJ0MyggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2RnZXFydDMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2NnZXFydDMoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfemdlcXJ0MyggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cG1xcnQoIGNoYXIqIHNpZGUsIGNoYXIqIHRyYW5zLCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogaywgbGFwYWNrX2ludCogbCwgbGFwYWNrX2ludCogbmIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LCBjb25zdCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwgZmxvYXQqIGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHBtcXJ0KCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGxhcGFja19pbnQqIG5iLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsIGNvbnN0IGRvdWJsZSogdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYiwgZG91YmxlKiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19jdHBtcXJ0KCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGxhcGFja19pbnQqIG5iLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHYsIGxhcGFja19pbnQqIGxkdiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiB3b3JrLCBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS196dHBtcXJ0KCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsIGxhcGFja19pbnQqIG5iLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB2LCBsYXBhY2tfaW50KiBsZHYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2R0cHFydCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbCwgbGFwYWNrX2ludCogbmIsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLCBkb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsIGRvdWJsZSogd29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfY3RwcXJ0KCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBsLCBsYXBhY2tfaW50KiBuYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19jb21wbGV4X2Zsb2F0KiBiLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBsZGIsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHdvcmssIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cHFydCggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgbGFwYWNrX2ludCogbCwgbGFwYWNrX2ludCogbmIsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIGIsIGxhcGFja19pbnQqIGxkYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogd29yaywgbGFwYWNrX2ludCAqaW5mbyApOwordm9pZCBMQVBBQ0tfc3RwcXJ0MiggbGFwYWNrX2ludCogbSwgbGFwYWNrX2ludCogbiwgZmxvYXQqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiLCBsYXBhY2tfaW50KiBsZGIsIGZsb2F0KiB0LCBsYXBhY2tfaW50KiBsZHQsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50ICppbmZvICk7Cit2b2lkIExBUEFDS19kdHBxcnQyKCBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBkb3VibGUqIGEsIGxhcGFja19pbnQqIGxkYSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLCBkb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX2N0cHFydDIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRhLCBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3p0cHFydDIoIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkYSwgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBiLCBsYXBhY2tfaW50KiBsZGIsCisgICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQgKmluZm8gKTsKK3ZvaWQgTEFQQUNLX3N0cHJmYiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGNoYXIqIGRpcmVjdCwgY2hhciogc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LCBjb25zdCBmbG9hdCogdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGR0LCBmbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLCBmbG9hdCogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBjb25zdCBmbG9hdCogbXl3b3JrLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBteWxkd29yayApOwordm9pZCBMQVBBQ0tfZHRwcmZiKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgY2hhciogZGlyZWN0LCBjaGFyKiBzdG9yZXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdiwgbGFwYWNrX2ludCogbGR2LCBjb25zdCBkb3VibGUqIHQsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIGxkdCwgZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsIGRvdWJsZSogYiwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbGRiLCBjb25zdCBkb3VibGUqIG15d29yaywKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2ludCogbXlsZHdvcmsgKTsKK3ZvaWQgTEFQQUNLX2N0cHJmYiggY2hhciogc2lkZSwgY2hhciogdHJhbnMsIGNoYXIqIGRpcmVjdCwgY2hhciogc3RvcmV2LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfaW50KiBtLCBsYXBhY2tfaW50KiBuLCBsYXBhY2tfaW50KiBrLCBsYXBhY2tfaW50KiBsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9mbG9hdCogdCwgbGFwYWNrX2ludCogbGR0LAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYSwgbGFwYWNrX2ludCogbGRhLAorICAgICAgICAgICAgICAgICAgICBsYXBhY2tfY29tcGxleF9mbG9hdCogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbXl3b3JrLCBsYXBhY2tfaW50KiBteWxkd29yayApOwordm9pZCBMQVBBQ0tfenRwcmZiKCBjaGFyKiBzaWRlLCBjaGFyKiB0cmFucywgY2hhciogZGlyZWN0LCBjaGFyKiBzdG9yZXYsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19pbnQqIG0sIGxhcGFja19pbnQqIG4sIGxhcGFja19pbnQqIGssIGxhcGFja19pbnQqIGwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2RvdWJsZSogdiwgbGFwYWNrX2ludCogbGR2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXBhY2tfY29tcGxleF9kb3VibGUqIHQsIGxhcGFja19pbnQqIGxkdCwKKyAgICAgICAgICAgICAgICAgICAgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiBhLCBsYXBhY2tfaW50KiBsZGEsCisgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYiwgbGFwYWNrX2ludCogbGRiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIG15d29yaywgbGFwYWNrX2ludCogbXlsZHdvcmsgKTsKKy8vIExBUEFDSyAzLlguWAordm9pZCBMQVBBQ0tfY3N5ciggY2hhciogdXBsbywgbGFwYWNrX2ludCogbiwgbGFwYWNrX2NvbXBsZXhfZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhcGFja19jb21wbGV4X2Zsb2F0KiB4LCBsYXBhY2tfaW50KiBpbmN4LAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2Zsb2F0KiBhLCBsYXBhY2tfaW50KiBsZGEgKTsKK3ZvaWQgTEFQQUNLX3pzeXIoIGNoYXIqIHVwbG8sIGxhcGFja19pbnQqIG4sIGxhcGFja19jb21wbGV4X2RvdWJsZSogYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFwYWNrX2NvbXBsZXhfZG91YmxlKiB4LCBsYXBhY2tfaW50KiBpbmN4LAorICAgICAgICAgICAgICAgICAgICAgIGxhcGFja19jb21wbGV4X2RvdWJsZSogYSwgbGFwYWNrX2ludCogbGRhICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTEFQQUNLRV9IXyAqLworCisjZW5kaWYgLyogX01LTF9MQVBBQ0tFX0hfICovCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9sYXBhY2tlX21hbmdsaW5nLmggYi9FaWdlbi9zcmMvbWlzYy9sYXBhY2tlX21hbmdsaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxMWZkMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9taXNjL2xhcGFja2VfbWFuZ2xpbmcuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIExBUEFDS19IRUFERVJfSU5DTFVERUQKKyNkZWZpbmUgTEFQQUNLX0hFQURFUl9JTkNMVURFRAorCisjaWZuZGVmIExBUEFDS19HTE9CQUwKKyNpZiBkZWZpbmVkKExBUEFDS19HTE9CQUxfUEFUVEVSTl9MQykgfHwgZGVmaW5lZChBRERfKQorI2RlZmluZSBMQVBBQ0tfR0xPQkFMKGxjbmFtZSxVQ05BTUUpICBsY25hbWUjI18KKyNlbGlmIGRlZmluZWQoTEFQQUNLX0dMT0JBTF9QQVRURVJOX1VDKSB8fCBkZWZpbmVkKFVQUEVSKQorI2RlZmluZSBMQVBBQ0tfR0xPQkFMKGxjbmFtZSxVQ05BTUUpICBVQ05BTUUKKyNlbGlmIGRlZmluZWQoTEFQQUNLX0dMT0JBTF9QQVRURVJOX01DKSB8fCBkZWZpbmVkKE5PQ0hBTkdFKQorI2RlZmluZSBMQVBBQ0tfR0xPQkFMKGxjbmFtZSxVQ05BTUUpICBsY25hbWUKKyNlbHNlCisjZGVmaW5lIExBUEFDS19HTE9CQUwobGNuYW1lLFVDTkFNRSkgIGxjbmFtZSMjXworI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9wbHVnaW5zL0FycmF5Q3dpc2VCaW5hcnlPcHMuaCBiL0VpZ2VuL3NyYy9wbHVnaW5zL0FycmF5Q3dpc2VCaW5hcnlPcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhhNTMxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL3BsdWdpbnMvQXJyYXlDd2lzZUJpbmFyeU9wcy5oCkBAIC0wLDAgKzEsMzMyIEBACisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudCB3aXNlIHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6Y3dpc2VQcm9kdWN0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9DV0lTRV9CSU5BUllfUkVUVVJOX1RZUEUoRGVyaXZlZCxPdGhlckRlcml2ZWQscHJvZHVjdCkKK29wZXJhdG9yKihjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTkFSWV9SRVRVUk5fVFlQRShEZXJpdmVkLE90aGVyRGVyaXZlZCxwcm9kdWN0KShkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudCB3aXNlIHF1b3RpZW50IG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmN3aXNlUXVvdGllbnQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CitvcGVyYXRvci8oY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1pbiBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX21pbi5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9taW4ub3V0CisgICoKKyAgKiBcc2EgbWF4KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG1pbixtaW4pCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1pbiBvZiBcYyAqdGhpcyBhbmQgc2NhbGFyIFxhIG90aGVyCisgICoKKyAgKiBcc2EgbWF4KCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9taW5fb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBQbGFpbk9iamVjdD4gPgorI2lmZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCittaW4KKyNlbHNlCisobWluKQorI2VuZGlmCisoY29uc3QgU2NhbGFyICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIChtaW4pKERlcml2ZWQ6OlBsYWluT2JqZWN0OjpDb25zdGFudChyb3dzKCksIGNvbHMoKSwgb3RoZXIpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbWF4IG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbWF4LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX21heC5vdXQKKyAgKgorICAqIFxzYSBtaW4oKQorICAqLworRUlHRU5fTUFLRV9DV0lTRV9CSU5BUllfT1AobWF4LG1heCkKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbWF4IG9mIFxjICp0aGlzIGFuZCBzY2FsYXIgXGEgb3RoZXIKKyAgKgorICAqIFxzYSBtaW4oKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21heF9vcDxTY2FsYXIsU2NhbGFyPiwgY29uc3QgRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sIFBsYWluT2JqZWN0PiA+CisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK21heAorI2Vsc2UKKyhtYXgpCisjZW5kaWYKKyhjb25zdCBTY2FsYXIgJm90aGVyKSBjb25zdAoreworICByZXR1cm4gKG1heCkoRGVyaXZlZDo6UGxhaW5PYmplY3Q6OkNvbnN0YW50KHJvd3MoKSwgY29scygpLCBvdGhlcikpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBwb3dlciBvZiBcYyAqdGhpcyB0byB0aGUgZ2l2ZW4gYXJyYXkgb2YgXGEgZXhwb25lbnRzLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29lZmZpY2llbnQtd2lzZSBwb3dlci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2FycmF5X3Bvd2VyX2FycmF5LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2FycmF5X3Bvd2VyX2FycmF5Lm91dAorICAqLworRUlHRU5fTUFLRV9DV0lTRV9CSU5BUllfT1AocG93LHBvdykKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorRUlHRU5fTUFLRV9TQ0FMQVJfQklOQVJZX09QX09OVEhFUklHSFQocG93LHBvdykKKyNlbHNlCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnRzIG9mIFxjICp0aGlzIHJhc2llZCB0byB0aGUgY29uc3RhbnQgcG93ZXIgXGEgZXhwb25lbnQKKyAgKgorICAqIFx0cGFyYW0gVCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgZXhwb25lbnQuIEl0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgcG93ZXIuIFRoZSBmdW5jdGlvbiBNYXRyaXhCYXNlOjpwb3coKSBpbiB0aGUKKyAgKiB1bnN1cHBvcnRlZCBtb2R1bGUgTWF0cml4RnVuY3Rpb25zIGNvbXB1dGVzIHRoZSBtYXRyaXggcG93ZXIuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9wb3cuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfcG93Lm91dAorICAqCisgICogXHNhIEFycmF5QmFzZTo6cG93KEFycmF5QmFzZSksIHNxdWFyZSgpLCBjdWJlKCksIGV4cCgpLCBsb2coKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wb3dfb3A8U2NhbGFyLFQ+LERlcml2ZWQsQ29uc3RhbnQ8VD4gPiBwb3coY29uc3QgVCYgZXhwb25lbnQpIGNvbnN0OworI2VuZGlmCisKKworLy8gVE9ETyBjb2RlIGdlbmVyYXRpbmcgbWFjcm9zIGNvdWxkIGJlIG1vdmVkIHRvIE1hY3Jvcy5oIGFuZCBjb3VsZCBpbmNsdWRlIGdlbmVyYXRpb24gb2YgZG9jdW1lbnRhdGlvbgorI2RlZmluZSBFSUdFTl9NQUtFX0NXSVNFX0NPTVBfT1AoT1AsIENPTVBBUkFUT1IpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gXAorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIsIGludGVybmFsOjpjbXBfICMjIENPTVBBUkFUT1I+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+IFwKK09QKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdCBcCit7IFwKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhciwgaW50ZXJuYWw6OmNtcF8gIyMgQ09NUEFSQVRPUj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOyBcCit9XAordHlwZWRlZiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhcixTY2FsYXIsIGludGVybmFsOjpjbXBfICMjIENPTVBBUkFUT1I+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sIFBsYWluT2JqZWN0PiA+IENtcCAjIyBDT01QQVJBVE9SICMjIFJldHVyblR5cGU7IFwKK3R5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsU2NhbGFyLCBpbnRlcm5hbDo6Y21wXyAjIyBDT01QQVJBVE9SPiwgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBQbGFpbk9iamVjdD4sIGNvbnN0IERlcml2ZWQgPiBSQ21wICMjIENPTVBBUkFUT1IgIyMgUmV0dXJuVHlwZTsgXAorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDbXAgIyMgQ09NUEFSQVRPUiAjIyBSZXR1cm5UeXBlIFwKK09QKGNvbnN0IFNjYWxhciYgcykgY29uc3QgeyBcCisgIHJldHVybiB0aGlzLT5PUChEZXJpdmVkOjpQbGFpbk9iamVjdDo6Q29uc3RhbnQocm93cygpLCBjb2xzKCksIHMpKTsgXAorfSBcCitFSUdFTl9ERVZJQ0VfRlVOQyBmcmllbmQgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBSQ21wICMjIENPTVBBUkFUT1IgIyMgUmV0dXJuVHlwZSBcCitPUChjb25zdCBTY2FsYXImIHMsIGNvbnN0IERlcml2ZWQmIGQpIHsgXAorICByZXR1cm4gRGVyaXZlZDo6UGxhaW5PYmplY3Q6OkNvbnN0YW50KGQucm93cygpLCBkLmNvbHMoKSwgcykuT1AoZCk7IFwKK30KKworI2RlZmluZSBFSUdFTl9NQUtFX0NXSVNFX0NPTVBfUl9PUChPUCwgUl9PUCwgUkNPTVBBUkFUT1IpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gXAorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfIyNSQ09NUEFSQVRPUj4sIGNvbnN0IE90aGVyRGVyaXZlZCwgY29uc3QgRGVyaXZlZD4gXAorT1AoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0IFwKK3sgXAorICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDx0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wXyMjUkNPTVBBUkFUT1I+LCBjb25zdCBPdGhlckRlcml2ZWQsIGNvbnN0IERlcml2ZWQ+KG90aGVyLmRlcml2ZWQoKSwgZGVyaXZlZCgpKTsgXAorfSBcCitFSUdFTl9ERVZJQ0VfRlVOQyBcCitpbmxpbmUgY29uc3QgUkNtcCAjIyBSQ09NUEFSQVRPUiAjIyBSZXR1cm5UeXBlIFwKK09QKGNvbnN0IFNjYWxhciYgcykgY29uc3QgeyBcCisgIHJldHVybiBEZXJpdmVkOjpQbGFpbk9iamVjdDo6Q29uc3RhbnQocm93cygpLCBjb2xzKCksIHMpLlJfT1AoKnRoaXMpOyBcCit9IFwKK2ZyaWVuZCBpbmxpbmUgY29uc3QgQ21wICMjIFJDT01QQVJBVE9SICMjIFJldHVyblR5cGUgXAorT1AoY29uc3QgU2NhbGFyJiBzLCBjb25zdCBEZXJpdmVkJiBkKSB7IFwKKyAgcmV0dXJuIGQuUl9PUChEZXJpdmVkOjpQbGFpbk9iamVjdDo6Q29uc3RhbnQoZC5yb3dzKCksIGQuY29scygpLCBzKSk7IFwKK30KKworCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIFw8IG9wZXJhdG9yIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbGVzcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9sZXNzLm91dAorICAqCisgICogXHNhIGFsbCgpLCBhbnkoKSwgb3BlcmF0b3I+KCksIG9wZXJhdG9yPD0oKQorICAqLworRUlHRU5fTUFLRV9DV0lTRV9DT01QX09QKG9wZXJhdG9yPCwgTFQpCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIFw8PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2xlc3NfZXF1YWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbGVzc19lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPj0oKSwgb3BlcmF0b3I8KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQ09NUF9PUChvcGVyYXRvcjw9LCBMRSkKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgXD4gb3BlcmF0b3Igb2YgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9ncmVhdGVyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2dyZWF0ZXIub3V0CisgICoKKyAgKiBcc2EgYWxsKCksIGFueSgpLCBvcGVyYXRvcj49KCksIG9wZXJhdG9yPCgpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0NPTVBfUl9PUChvcGVyYXRvcj4sIG9wZXJhdG9yPCwgTFQpCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIFw+PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2dyZWF0ZXJfZXF1YWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfZ3JlYXRlcl9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPigpLCBvcGVyYXRvcjw9KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQ09NUF9SX09QKG9wZXJhdG9yPj0sIG9wZXJhdG9yPD0sIExFKQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSA9PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgcGVyZm9ybXMgYW4gZXhhY3QgY29tcGFyaXNvbiwgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgYmFkIGlkZWEgd2l0aCBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgKiBJbiBvcmRlciB0byBjaGVjayBmb3IgZXF1YWxpdHkgYmV0d2VlbiB0d28gdmVjdG9ycyBvciBtYXRyaWNlcyB3aXRoIGZsb2F0aW5nLXBvaW50IGNvZWZmaWNpZW50cywgaXQgaXMKKyAgKiBnZW5lcmFsbHkgYSBmYXIgYmV0dGVyIGlkZWEgdG8gdXNlIGEgZnV6enkgY29tcGFyaXNvbiBhcyBwcm92aWRlZCBieSBpc0FwcHJveCgpIGFuZAorICAqIGlzTXVjaFNtYWxsZXJUaGFuKCkuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9lcXVhbF9lcXVhbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9lcXVhbF9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIGlzQXBwcm94KCksIGlzTXVjaFNtYWxsZXJUaGFuKCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQ09NUF9PUChvcGVyYXRvcj09LCBFUSkKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgIT0gb3BlcmF0b3Igb2YgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBcd2FybmluZyB0aGlzIHBlcmZvcm1zIGFuIGV4YWN0IGNvbXBhcmlzb24sIHdoaWNoIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhIHdpdGggZmxvYXRpbmctcG9pbnQgdHlwZXMuCisgICogSW4gb3JkZXIgdG8gY2hlY2sgZm9yIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZlY3RvcnMgb3IgbWF0cmljZXMgd2l0aCBmbG9hdGluZy1wb2ludCBjb2VmZmljaWVudHMsIGl0IGlzCisgICogZ2VuZXJhbGx5IGEgZmFyIGJldHRlciBpZGVhIHRvIHVzZSBhIGZ1enp5IGNvbXBhcmlzb24gYXMgcHJvdmlkZWQgYnkgaXNBcHByb3goKSBhbmQKKyAgKiBpc011Y2hTbWFsbGVyVGhhbigpLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfbm90X2VxdWFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX25vdF9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIGlzQXBwcm94KCksIGlzTXVjaFNtYWxsZXJUaGFuKCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQ09NUF9PUChvcGVyYXRvciE9LCBORVEpCisKKworI3VuZGVmIEVJR0VOX01BS0VfQ1dJU0VfQ09NUF9PUAorI3VuZGVmIEVJR0VOX01BS0VfQ1dJU0VfQ09NUF9SX09QCisKKy8vIHNjYWxhciBhZGRpdGlvbgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorRUlHRU5fTUFLRV9TQ0FMQVJfQklOQVJZX09QKG9wZXJhdG9yKyxzdW0pCisjZWxzZQorLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgXGMgKnRoaXMgd2l0aCBlYWNoIGNvZWZmIGluY3JlbWVudGVkIGJ5IHRoZSBjb25zdGFudCBcYSBzY2FsYXIKKyAgKgorICAqIFx0cGFyYW0gVCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgc2NhbGFyLiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9wbHVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3BsdXMub3V0CisgICoKKyAgKiBcc2Egb3BlcmF0b3IrPSgpLCBvcGVyYXRvci0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLFQ+LERlcml2ZWQsQ29uc3RhbnQ8VD4gPiBvcGVyYXRvcisoY29uc3QgVCYgc2NhbGFyKSBjb25zdDsKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIFxhIGV4cHIgd2l0aCBlYWNoIGNvZWZmIGluY3JlbWVudGVkIGJ5IHRoZSBjb25zdGFudCBcYSBzY2FsYXIKKyAgKgorICAqIFx0cGFyYW0gVCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgc2NhbGFyLiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQKK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8VCxTY2FsYXI+LENvbnN0YW50PFQ+LERlcml2ZWQ+IG9wZXJhdG9yKyhjb25zdCBUJiBzY2FsYXIsIGNvbnN0IFN0b3JhZ2VCYXNlVHlwZSYgZXhwcik7CisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorRUlHRU5fTUFLRV9TQ0FMQVJfQklOQVJZX09QKG9wZXJhdG9yLSxkaWZmZXJlbmNlKQorI2Vsc2UKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIFxjICp0aGlzIHdpdGggZWFjaCBjb2VmZiBkZWNyZW1lbnRlZCBieSB0aGUgY29uc3RhbnQgXGEgc2NhbGFyCisgICoKKyAgKiBcdHBhcmFtIFQgaXMgdGhlIHNjYWxhciB0eXBlIG9mIFxhIHNjYWxhci4gSXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbWludXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbWludXMub3V0CisgICoKKyAgKiBcc2Egb3BlcmF0b3IrPSgpLCBvcGVyYXRvci0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFNjYWxhcixUPixEZXJpdmVkLENvbnN0YW50PFQ+ID4gb3BlcmF0b3ItKGNvbnN0IFQmIHNjYWxhcikgY29uc3Q7CisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29uc3RhbnQgbWF0cml4IG9mIHZhbHVlIFxhIHNjYWxhciBkZWNyZW1lbnRlZCBieSB0aGUgY29lZmZpY2llbnRzIG9mIFxhIGV4cHIKKyAgKgorICAqIFx0cGFyYW0gVCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgc2NhbGFyLiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQKK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFQsU2NhbGFyPixDb25zdGFudDxUPixEZXJpdmVkPiBvcGVyYXRvci0oY29uc3QgVCYgc2NhbGFyLCBjb25zdCBTdG9yYWdlQmFzZVR5cGUmIGV4cHIpOworI2VuZGlmCisKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICBFSUdFTl9NQUtFX1NDQUxBUl9CSU5BUllfT1BfT05USEVMRUZUKG9wZXJhdG9yLyxxdW90aWVudCkKKyNlbHNlCisgIC8qKgorICAgICogXGJyaWVmIENvbXBvbmVudC13aXNlIGRpdmlzaW9uIG9mIHRoZSBzY2FsYXIgXGEgcyBieSBhcnJheSBlbGVtZW50cyBvZiBcYSBhLgorICAgICoKKyAgICAqIFx0cGFyYW0gU2NhbGFyIGlzIHRoZSBzY2FsYXIgdHlwZSBvZiBcYSB4LiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGFycmF5IGV4cHJlc3Npb24gKFxjIERlcml2ZWQ6OlNjYWxhcikuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kCisgIGlubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8VCxTY2FsYXI+LENvbnN0YW50PFQ+LERlcml2ZWQ+CisgIG9wZXJhdG9yLyhjb25zdCBUJiBzLGNvbnN0IFN0b3JhZ2VCYXNlVHlwZSYgYSk7CisjZW5kaWYKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgXiBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAqCisgKiBcd2FybmluZyB0aGlzIG9wZXJhdG9yIGlzIGZvciBleHByZXNzaW9uIG9mIGJvb2wgb25seS4KKyAqCisgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9ib29sZWFuX3hvci5jcHAKKyAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2Jvb2xlYW5feG9yLm91dAorICoKKyAqIFxzYSBvcGVyYXRvciYmKCksIHNlbGVjdCgpCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5feG9yX29wLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CitvcGVyYXRvcl4oY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPGJvb2wsU2NhbGFyPjo6dmFsdWUgJiYgaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCx0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19PRl9CT09MKTsKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX3hvcl9vcCwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLy8gTk9URSBkaXNhYmxlZCB1bnRpbCB3ZSBhZ3JlZSBvbiBhcmd1bWVudCBvcmRlcgorI2lmIDAKKy8qKiBcY3BwMTEgXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBwb2x5Z2FtbWEgZnVuY3Rpb24uCisgICoKKyAgKiBcc3BlY2lhbGZ1bmN0aW9uc19tb2R1bGUKKyAgKgorICAqIEl0IHJldHVybnMgdGhlIFxhIG4gLXRoIGRlcml2YXRpdmUgb2YgdGhlIGRpZ2FtbWEocHNpKSBldmFsdWF0ZWQgYXQgXGMgKnRoaXMuCisgICoKKyAgKiBcd2FybmluZyBCZSBjYXJlZnVsIHdpdGggdGhlIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzOiB4LnBvbHlnYW1tYShuKSBpcyBlcXVpdmFsZW50IHRvIHBvbHlnYW1tYShuLHgpCisgICoKKyAgKiBcc2EgRWlnZW46OnBvbHlnYW1tYSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkTj4KK2lubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcG9seWdhbW1hX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWROLCBjb25zdCBEZXJpdmVkPgorcG9seWdhbW1hKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPERlcml2ZWROPiAmbikgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wb2x5Z2FtbWFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZE4sIGNvbnN0IERlcml2ZWQ+KG4uZGVyaXZlZCgpLCB0aGlzLT5kZXJpdmVkKCkpOworfQorI2VuZGlmCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHpldGEgZnVuY3Rpb24uCisgICoKKyAgKiBcc3BlY2lhbGZ1bmN0aW9uc19tb2R1bGUKKyAgKgorICAqIEl0IHJldHVybnMgdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIFxjICp0aGlzIGFuZCBcYSBxOgorICAqCisgICogXHBhcmFtICp0aGlzIGlzIHRoZSBleHBvc2VudCwgaXQgbXVzdCBiZSA+IDEKKyAgKiBccGFyYW0gcSBpcyB0aGUgc2hpZnQsIGl0IG11c3QgYmUgPiAwCisgICoKKyAgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgZmxvYXQgYW5kIGRvdWJsZSBzY2FsYXIgdHlwZXMuIFRvIHN1cHBvcnQgb3RoZXIgc2NhbGFyIHR5cGVzLCB0aGUgdXNlciBoYXMKKyAgKiB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiB6ZXRhKFQsVCkgZm9yIGFueSBzY2FsYXIgdHlwZSBUIHRvIGJlIHN1cHBvcnRlZC4KKyAgKgorICAqIFRoaXMgbWV0aG9kIGlzIGFuIGFsaWFzIGZvciB6ZXRhKCp0aGlzLHEpOworICAqCisgICogXHNhIEVpZ2VuOjp6ZXRhKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWRRPgoraW5saW5lIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl96ZXRhX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IERlcml2ZWRRPgoremV0YShjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxEZXJpdmVkUT4gJnEpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfemV0YV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBEZXJpdmVkUT4odGhpcy0+ZGVyaXZlZCgpLCBxLmRlcml2ZWQoKSk7Cit9CmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlVW5hcnlPcHMuaCBiL0VpZ2VuL3NyYy9wbHVnaW5zL0FycmF5Q3dpc2VVbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWEzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlVW5hcnlPcHMuaApAQCAtMCwwICsxLDU1MiBAQAorCisKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWJzX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEFic1JldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FyZ19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBBcmdSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hYnMyX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEFiczJSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zcXJ0X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IFNxcnRSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9yc3FydF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBSc3FydFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3NpZ25fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gU2lnblJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gSW52ZXJzZVJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5fbm90X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEJvb2xlYW5Ob3RSZXR1cm5UeXBlOworCit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2V4cF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBFeHBSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9sb2dfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gTG9nUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbG9nMXBfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gTG9nMXBSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9sb2cxMF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBMb2cxMFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvc19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBDb3NSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zaW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gU2luUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfdGFuX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IFRhblJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Fjb3Nfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQWNvc1JldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FzaW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQXNpblJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2F0YW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQXRhblJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Rhbmhfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gVGFuaFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Npbmhfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gU2luaFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvc2hfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQ29zaFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3NxdWFyZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBTcXVhcmVSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jdWJlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEN1YmVSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9yb3VuZF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBSb3VuZFJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Zsb29yX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEZsb29yUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY2VpbF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBDZWlsUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaXNuYW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gSXNOYU5SZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9pc2luZl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBJc0luZlJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2lzZmluaXRlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IElzRmluaXRlUmV0dXJuVHlwZTsKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYWJzb2x1dGUgdmFsdWUgb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2Ficy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9hYnMub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2FicyI+TWF0aCBmdW5jdGlvbnM8L2E+LCBhYnMyKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEFic1JldHVyblR5cGUKK2FicygpIGNvbnN0Cit7CisgIHJldHVybiBBYnNSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHBoYXNlIGFuZ2xlIG9mIFxjICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9hcmcuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfYXJnLm91dAorICAqCisgICogXHNhIGFicygpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBBcmdSZXR1cm5UeXBlCithcmcoKSBjb25zdAoreworICByZXR1cm4gQXJnUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBzcXVhcmVkIGFic29sdXRlIHZhbHVlIG9mIFxjICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9hYnMyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2FiczIub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2FiczIiPk1hdGggZnVuY3Rpb25zPC9hPiwgYWJzKCksIHNxdWFyZSgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBBYnMyUmV0dXJuVHlwZQorYWJzMigpIGNvbnN0Cit7CisgIHJldHVybiBBYnMyUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBleHBvbmVudGlhbCBvZiAqdGhpcy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgZXhwb25lbnRpYWwuIFRoZSBmdW5jdGlvbiBNYXRyaXhCYXNlOjpleHAoKSBpbiB0aGUKKyAgKiB1bnN1cHBvcnRlZCBtb2R1bGUgTWF0cml4RnVuY3Rpb25zIGNvbXB1dGVzIHRoZSBtYXRyaXggZXhwb25lbnRpYWwuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9leHAuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfZXhwLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9leHAiPk1hdGggZnVuY3Rpb25zPC9hPiwgcG93KCksIGxvZygpLCBzaW4oKSwgY29zKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgRXhwUmV0dXJuVHlwZQorZXhwKCkgY29uc3QKK3sKKyAgcmV0dXJuIEV4cFJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbG9nYXJpdGhtIG9mICp0aGlzLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29lZmZpY2llbnQtd2lzZSBsb2dhcml0aG0uIFRoZSBmdW5jdGlvbiBNYXRyaXhCYXNlOjpsb2coKSBpbiB0aGUKKyAgKiB1bnN1cHBvcnRlZCBtb2R1bGUgTWF0cml4RnVuY3Rpb25zIGNvbXB1dGVzIHRoZSBtYXRyaXggbG9nYXJpdGhtLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbG9nLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2xvZy5vdXQKKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfbG9nIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGV4cCgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IExvZ1JldHVyblR5cGUKK2xvZygpIGNvbnN0Cit7CisgIHJldHVybiBMb2dSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGxvZ2FyaXRobSBvZiAxIHBsdXMgXGMgKnRoaXMuCisgICoKKyAgKiBJbiBleGFjdCBhcml0aG1ldGljLCBcYyB4LmxvZygpIGlzIGVxdWl2YWxlbnQgdG8gXGMgKHgrMSkubG9nKCksCisgICogaG93ZXZlciwgd2l0aCBmaW5pdGUgcHJlY2lzaW9uLCB0aGlzIGZ1bmN0aW9uIGlzIG11Y2ggbW9yZSBhY2N1cmF0ZSB3aGVuIFxjIHggaXMgY2xvc2UgdG8gemVyby4KKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfbG9nMXAiPk1hdGggZnVuY3Rpb25zPC9hPiwgbG9nKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgTG9nMXBSZXR1cm5UeXBlCitsb2cxcCgpIGNvbnN0Cit7CisgIHJldHVybiBMb2cxcFJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYmFzZS0xMCBsb2dhcml0aG0gb2YgKnRoaXMuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBjb2VmZmljaWVudC13aXNlIGJhc2UtMTAgbG9nYXJpdGhtLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbG9nMTAuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbG9nMTAub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2xvZzEwIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGxvZygpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IExvZzEwUmV0dXJuVHlwZQorbG9nMTAoKSBjb25zdAoreworICByZXR1cm4gTG9nMTBSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHNxdWFyZSByb290IG9mICp0aGlzLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29lZmZpY2llbnQtd2lzZSBzcXVhcmUgcm9vdC4gVGhlIGZ1bmN0aW9uIE1hdHJpeEJhc2U6OnNxcnQoKSBpbiB0aGUKKyAgKiB1bnN1cHBvcnRlZCBtb2R1bGUgTWF0cml4RnVuY3Rpb25zIGNvbXB1dGVzIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9zcXJ0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3NxcnQub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX3NxcnQiPk1hdGggZnVuY3Rpb25zPC9hPiwgcG93KCksIHNxdWFyZSgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IFNxcnRSZXR1cm5UeXBlCitzcXJ0KCkgY29uc3QKK3sKKyAgcmV0dXJuIFNxcnRSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGludmVyc2Ugc3F1YXJlIHJvb3Qgb2YgKnRoaXMuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBjb2VmZmljaWVudC13aXNlIGludmVyc2Ugc3F1YXJlIHJvb3QuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9zcXJ0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3NxcnQub3V0CisgICoKKyAgKiBcc2EgcG93KCksIHNxdWFyZSgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IFJzcXJ0UmV0dXJuVHlwZQorcnNxcnQoKSBjb25zdAoreworICByZXR1cm4gUnNxcnRSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHNpZ251bSBvZiAqdGhpcy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc2lnbnVtLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfc2lnbi5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9zaWduLm91dAorICAqCisgICogXHNhIHBvdygpLCBzcXVhcmUoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBTaWduUmV0dXJuVHlwZQorc2lnbigpIGNvbnN0Cit7CisgIHJldHVybiBTaWduUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGNvc2luZSBvZiAqdGhpcy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgY29zaW5lLiBUaGUgZnVuY3Rpb24gTWF0cml4QmFzZTo6Y29zKCkgaW4gdGhlCisgICogdW5zdXBwb3J0ZWQgbW9kdWxlIE1hdHJpeEZ1bmN0aW9ucyBjb21wdXRlcyB0aGUgbWF0cml4IGNvc2luZS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2Nvcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9jb3Mub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2NvcyI+TWF0aCBmdW5jdGlvbnM8L2E+LCBzaW4oKSwgYWNvcygpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IENvc1JldHVyblR5cGUKK2NvcygpIGNvbnN0Cit7CisgIHJldHVybiBDb3NSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc2luZSBvZiAqdGhpcy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc2luZS4gVGhlIGZ1bmN0aW9uIE1hdHJpeEJhc2U6OnNpbigpIGluIHRoZQorICAqIHVuc3VwcG9ydGVkIG1vZHVsZSBNYXRyaXhGdW5jdGlvbnMgY29tcHV0ZXMgdGhlIG1hdHJpeCBzaW5lLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfc2luLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3Npbi5vdXQKKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfc2luIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGNvcygpLCBhc2luKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgU2luUmV0dXJuVHlwZQorc2luKCkgY29uc3QKK3sKKyAgcmV0dXJuIFNpblJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgdGFuIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfdGFuLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3Rhbi5vdXQKKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfdGFuIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGNvcygpLCBzaW4oKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBUYW5SZXR1cm5UeXBlCit0YW4oKSBjb25zdAoreworICByZXR1cm4gVGFuUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBhcmMgdGFuIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYXRhbi5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9hdGFuLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9hdGFuIj5NYXRoIGZ1bmN0aW9uczwvYT4sIHRhbigpLCBhc2luKCksIGFjb3MoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBBdGFuUmV0dXJuVHlwZQorYXRhbigpIGNvbnN0Cit7CisgIHJldHVybiBBdGFuUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBhcmMgY29zaW5lIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYWNvcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9hY29zLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9hY29zIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGNvcygpLCBhc2luKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgQWNvc1JldHVyblR5cGUKK2Fjb3MoKSBjb25zdAoreworICByZXR1cm4gQWNvc1JldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYXJjIHNpbmUgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9hc2luLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2FzaW4ub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2FzaW4iPk1hdGggZnVuY3Rpb25zPC9hPiwgc2luKCksIGFjb3MoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBBc2luUmV0dXJuVHlwZQorYXNpbigpIGNvbnN0Cit7CisgIHJldHVybiBBc2luUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBoeXBlcmJvbGljIHRhbiBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX3RhbmguY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfdGFuaC5vdXQKKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfdGFuaCI+TWF0aCBmdW5jdGlvbnM8L2E+LCB0YW4oKSwgc2luaCgpLCBjb3NoKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgVGFuaFJldHVyblR5cGUKK3RhbmgoKSBjb25zdAoreworICByZXR1cm4gVGFuaFJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgaHlwZXJib2xpYyBzaW4gb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9zaW5oLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3Npbmgub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX3NpbmgiPk1hdGggZnVuY3Rpb25zPC9hPiwgc2luKCksIHRhbmgoKSwgY29zaCgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IFNpbmhSZXR1cm5UeXBlCitzaW5oKCkgY29uc3QKK3sKKyAgcmV0dXJuIFNpbmhSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGh5cGVyYm9saWMgY29zIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfY29zaC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9jb3NoLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9jb3NoIj5NYXRoIGZ1bmN0aW9uczwvYT4sIHRhbigpLCBzaW5oKCksIGNvc2goKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDb3NoUmV0dXJuVHlwZQorY29zaCgpIGNvbnN0Cit7CisgIHJldHVybiBDb3NoUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBpbnZlcnNlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfaW52ZXJzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9pbnZlcnNlLm91dAorICAqCisgICogXHNhIG9wZXJhdG9yLygpLCBvcGVyYXRvciooKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBJbnZlcnNlUmV0dXJuVHlwZQoraW52ZXJzZSgpIGNvbnN0Cit7CisgIHJldHVybiBJbnZlcnNlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBzcXVhcmUgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9zcXVhcmUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2Vfc3F1YXJlLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9zcXVhcmVFIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGFiczIoKSwgY3ViZSgpLCBwb3coKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBTcXVhcmVSZXR1cm5UeXBlCitzcXVhcmUoKSBjb25zdAoreworICByZXR1cm4gU3F1YXJlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBjdWJlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfY3ViZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9jdWJlLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9jdWJlIj5NYXRoIGZ1bmN0aW9uczwvYT4sIHNxdWFyZSgpLCBwb3coKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDdWJlUmV0dXJuVHlwZQorY3ViZSgpIGNvbnN0Cit7CisgIHJldHVybiBDdWJlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSByb3VuZCBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX3JvdW5kLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3JvdW5kLm91dAorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9yb3VuZCI+TWF0aCBmdW5jdGlvbnM8L2E+LCBjZWlsKCksIGZsb29yKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgUm91bmRSZXR1cm5UeXBlCityb3VuZCgpIGNvbnN0Cit7CisgIHJldHVybiBSb3VuZFJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgZmxvb3Igb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9mbG9vci5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9mbG9vci5vdXQKKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfZmxvb3IiPk1hdGggZnVuY3Rpb25zPC9hPiwgY2VpbCgpLCByb3VuZCgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEZsb29yUmV0dXJuVHlwZQorZmxvb3IoKSBjb25zdAoreworICByZXR1cm4gRmxvb3JSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGNlaWwgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9jZWlsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2NlaWwub3V0CisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2NlaWwiPk1hdGggZnVuY3Rpb25zPC9hPiwgZmxvb3IoKSwgcm91bmQoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDZWlsUmV0dXJuVHlwZQorY2VpbCgpIGNvbnN0Cit7CisgIHJldHVybiBDZWlsUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBpc25hbiBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2lzTmFOLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2lzTmFOLm91dAorICAqCisgICogXHNhIGlzZmluaXRlKCksIGlzaW5mKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgSXNOYU5SZXR1cm5UeXBlCitpc05hTigpIGNvbnN0Cit7CisgIHJldHVybiBJc05hTlJldHVyblR5cGUoZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgaXNpbmYgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9pc0luZi5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9pc0luZi5vdXQKKyAgKgorICAqIFxzYSBpc25hbigpLCBpc2Zpbml0ZSgpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IElzSW5mUmV0dXJuVHlwZQoraXNJbmYoKSBjb25zdAoreworICByZXR1cm4gSXNJbmZSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGlzZmluaXRlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfaXNGaW5pdGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfaXNGaW5pdGUub3V0CisgICoKKyAgKiBcc2EgaXNuYW4oKSwgaXNpbmYoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBJc0Zpbml0ZVJldHVyblR5cGUKK2lzRmluaXRlKCkgY29uc3QKK3sKKyAgcmV0dXJuIElzRmluaXRlUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSAhIG9wZXJhdG9yIG9mICp0aGlzCisgICoKKyAgKiBcd2FybmluZyB0aGlzIG9wZXJhdG9yIGlzIGZvciBleHByZXNzaW9uIG9mIGJvb2wgb25seS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2Jvb2xlYW5fbm90LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2Jvb2xlYW5fbm90Lm91dAorICAqCisgICogXHNhIG9wZXJhdG9yIT0oKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBCb29sZWFuTm90UmV0dXJuVHlwZQorb3BlcmF0b3IhKCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCxTY2FsYXI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfRVhQUkVTU0lPTlNfT0ZfQk9PTCk7CisgIHJldHVybiBCb29sZWFuTm90UmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisKKy8vIC0tLSBTcGVjaWFsRnVuY3Rpb25zIG1vZHVsZSAtLS0KKwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9sZ2FtbWFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gTGdhbW1hUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlnYW1tYV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBEaWdhbW1hUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZXJmX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEVyZlJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2VyZmNfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gRXJmY1JldHVyblR5cGU7CisKKy8qKiBcY3BwMTEgXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBsbih8Z2FtbWEoKnRoaXMpfCkuCisgICoKKyAgKiBcc3BlY2lhbGZ1bmN0aW9uc19tb2R1bGUKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2xnYW1tYS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9sZ2FtbWEub3V0CisgICoKKyAgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgZmxvYXQgYW5kIGRvdWJsZSBzY2FsYXIgdHlwZXMgaW4gYysrMTEgbW9kZS4gVG8gc3VwcG9ydCBvdGhlciBzY2FsYXIgdHlwZXMsCisgICogb3IgZmxvYXQvZG91YmxlIGluIG5vbiBjKysxMSBtb2RlLCB0aGUgdXNlciBoYXMgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGdhbW1hKFQpIGZvciBhbnkgc2NhbGFyCisgICogdHlwZSBUIHRvIGJlIHN1cHBvcnRlZC4KKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfbGdhbW1hIj5NYXRoIGZ1bmN0aW9uczwvYT4sIGRpZ2FtbWEoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBMZ2FtbWFSZXR1cm5UeXBlCitsZ2FtbWEoKSBjb25zdAoreworICByZXR1cm4gTGdhbW1hUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBkaWdhbW1hIChwc2ksIGRlcml2YXRpdmUgb2YgbGdhbW1hKS4KKyAgKgorICAqIFxzcGVjaWFsZnVuY3Rpb25zX21vZHVsZQorICAqCisgICogXG5vdGUgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBvbmx5IGZsb2F0IGFuZCBkb3VibGUgc2NhbGFyIHR5cGVzLiBUbyBzdXBwb3J0IG90aGVyIHNjYWxhciB0eXBlcywKKyAgKiB0aGUgdXNlciBoYXMgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgZGlnYW1tYShUKSBmb3IgYW55IHNjYWxhcgorICAqIHR5cGUgVCB0byBiZSBzdXBwb3J0ZWQuCisgICoKKyAgKiBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2RpZ2FtbWEiPk1hdGggZnVuY3Rpb25zPC9hPiwgRWlnZW46OmRpZ2FtbWEoKSwgRWlnZW46OnBvbHlnYW1tYSgpLCBsZ2FtbWEoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBEaWdhbW1hUmV0dXJuVHlwZQorZGlnYW1tYSgpIGNvbnN0Cit7CisgIHJldHVybiBEaWdhbW1hUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXGNwcDExIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgR2F1c3MgZXJyb3IKKyAgKiBmdW5jdGlvbiBvZiAqdGhpcy4KKyAgKgorICAqIFxzcGVjaWFsZnVuY3Rpb25zX21vZHVsZQorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfZXJmLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2VyZi5vdXQKKyAgKgorICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBmbG9hdCBhbmQgZG91YmxlIHNjYWxhciB0eXBlcyBpbiBjKysxMSBtb2RlLiBUbyBzdXBwb3J0IG90aGVyIHNjYWxhciB0eXBlcywKKyAgKiBvciBmbG9hdC9kb3VibGUgaW4gbm9uIGMrKzExIG1vZGUsIHRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBlcmYoVCkgZm9yIGFueSBzY2FsYXIKKyAgKiB0eXBlIFQgdG8gYmUgc3VwcG9ydGVkLgorICAqCisgICogXHNhIDxhIGhyZWY9Imdyb3VwX19Db2VmZndpc2VNYXRoRnVuY3Rpb25zLmh0bWwjY3dpc2V0YWJsZV9lcmYiPk1hdGggZnVuY3Rpb25zPC9hPiwgZXJmYygpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEVyZlJldHVyblR5cGUKK2VyZigpIGNvbnN0Cit7CisgIHJldHVybiBFcmZSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBcY3BwMTEgXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBDb21wbGVtZW50YXJ5IGVycm9yCisgICogZnVuY3Rpb24gb2YgKnRoaXMuCisgICoKKyAgKiBcc3BlY2lhbGZ1bmN0aW9uc19tb2R1bGUKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2VyZmMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfZXJmYy5vdXQKKyAgKgorICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBmbG9hdCBhbmQgZG91YmxlIHNjYWxhciB0eXBlcyBpbiBjKysxMSBtb2RlLiBUbyBzdXBwb3J0IG90aGVyIHNjYWxhciB0eXBlcywKKyAgKiBvciBmbG9hdC9kb3VibGUgaW4gbm9uIGMrKzExIG1vZGUsIHRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBlcmZjKFQpIGZvciBhbnkgc2NhbGFyCisgICogdHlwZSBUIHRvIGJlIHN1cHBvcnRlZC4KKyAgKgorICAqIFxzYSA8YSBocmVmPSJncm91cF9fQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucy5odG1sI2N3aXNldGFibGVfZXJmYyI+TWF0aCBmdW5jdGlvbnM8L2E+LCBlcmYoKQorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBFcmZjUmV0dXJuVHlwZQorZXJmYygpIGNvbnN0Cit7CisgIHJldHVybiBFcmZjUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL3BsdWdpbnMvQmxvY2tNZXRob2RzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9CbG9ja01ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM1YTAwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL3BsdWdpbnMvQmxvY2tNZXRob2RzLmgKQEAgLTAsMCArMSwxMDU4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKy8vLyBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgY29sdW1uICovCit0eXBlZGVmIEJsb2NrPERlcml2ZWQsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLCAxLCAhSXNSb3dNYWpvcj4gQ29sWHByOwordHlwZWRlZiBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgMSwgIUlzUm93TWFqb3I+IENvbnN0Q29sWHByOworLy8vIFxpbnRlcm5hbCBleHByZXNzaW9uIHR5cGUgb2YgYSByb3cgKi8KK3R5cGVkZWYgQmxvY2s8RGVyaXZlZCwgMSwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsIElzUm93TWFqb3I+IFJvd1hwcjsKK3R5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZCwgMSwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsIElzUm93TWFqb3I+IENvbnN0Um93WHByOworLy8vIFxpbnRlcm5hbCBleHByZXNzaW9uIHR5cGUgb2YgYSBibG9jayBvZiB3aG9sZSBjb2x1bW5zICovCit0eXBlZGVmIEJsb2NrPERlcml2ZWQsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLCBEeW5hbWljLCAhSXNSb3dNYWpvcj4gQ29sc0Jsb2NrWHByOwordHlwZWRlZiBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgRHluYW1pYywgIUlzUm93TWFqb3I+IENvbnN0Q29sc0Jsb2NrWHByOworLy8vIFxpbnRlcm5hbCBleHByZXNzaW9uIHR5cGUgb2YgYSBibG9jayBvZiB3aG9sZSByb3dzICovCit0eXBlZGVmIEJsb2NrPERlcml2ZWQsIER5bmFtaWMsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBSb3dzQmxvY2tYcHI7Cit0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIER5bmFtaWMsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBDb25zdFJvd3NCbG9ja1hwcjsKKy8vLyBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgYmxvY2sgb2Ygd2hvbGUgY29sdW1ucyAqLwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBOQ29sc0Jsb2NrWHByIHsgdHlwZWRlZiBCbG9jazxEZXJpdmVkLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgTiwgIUlzUm93TWFqb3I+IFR5cGU7IH07Cit0ZW1wbGF0ZTxpbnQgTj4gc3RydWN0IENvbnN0TkNvbHNCbG9ja1hwciB7IHR5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZCwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIE4sICFJc1Jvd01ham9yPiBUeXBlOyB9OworLy8vIFxpbnRlcm5hbCBleHByZXNzaW9uIHR5cGUgb2YgYSBibG9jayBvZiB3aG9sZSByb3dzICovCit0ZW1wbGF0ZTxpbnQgTj4gc3RydWN0IE5Sb3dzQmxvY2tYcHIgeyB0eXBlZGVmIEJsb2NrPERlcml2ZWQsIE4sIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBUeXBlOyB9OwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBDb25zdE5Sb3dzQmxvY2tYcHIgeyB0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIE4sIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBUeXBlOyB9OworLy8vIFxpbnRlcm5hbCBleHByZXNzaW9uIG9mIGEgYmxvY2sgKi8KK3R5cGVkZWYgQmxvY2s8RGVyaXZlZD4gQmxvY2tYcHI7Cit0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQ+IENvbnN0QmxvY2tYcHI7CisvLy8gXGludGVybmFsIGV4cHJlc3Npb24gb2YgYSBibG9jayBvZiBmaXhlZCBzaXplcyAqLwordGVtcGxhdGU8aW50IFJvd3MsIGludCBDb2xzPiBzdHJ1Y3QgRml4ZWRCbG9ja1hwciB7IHR5cGVkZWYgQmxvY2s8RGVyaXZlZCxSb3dzLENvbHM+IFR5cGU7IH07Cit0ZW1wbGF0ZTxpbnQgUm93cywgaW50IENvbHM+IHN0cnVjdCBDb25zdEZpeGVkQmxvY2tYcHIgeyB0eXBlZGVmIEJsb2NrPGNvbnN0IERlcml2ZWQsUm93cyxDb2xzPiBUeXBlOyB9OworCit0eXBlZGVmIFZlY3RvckJsb2NrPERlcml2ZWQ+IFNlZ21lbnRSZXR1cm5UeXBlOwordHlwZWRlZiBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPiBDb25zdFNlZ21lbnRSZXR1cm5UeXBlOwordGVtcGxhdGU8aW50IFNpemU+IHN0cnVjdCBGaXhlZFNlZ21lbnRSZXR1cm5UeXBlIHsgdHlwZWRlZiBWZWN0b3JCbG9jazxEZXJpdmVkLCBTaXplPiBUeXBlOyB9OwordGVtcGxhdGU8aW50IFNpemU+IHN0cnVjdCBDb25zdEZpeGVkU2VnbWVudFJldHVyblR5cGUgeyB0eXBlZGVmIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIFNpemU+IFR5cGU7IH07CisKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworLy8vIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgYSBibG9jayBpbiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBzdGFydFJvdyB0aGUgZmlyc3Qgcm93IGluIHRoZSBibG9jaworLy8vIFxwYXJhbSBzdGFydENvbCB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSBibG9jaworLy8vIFxwYXJhbSBibG9ja1Jvd3MgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBibG9jaworLy8vIFxwYXJhbSBibG9ja0NvbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jaworLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9ibG9ja19pbnRfaW50X2ludF9pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ibG9ja19pbnRfaW50X2ludF9pbnQub3V0CisvLy8KKy8vLyBcbm90ZSBFdmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZQorLy8vIHdoZW4gaXQgaXMgYXBwbGllZCB0byBhIGZpeGVkLXNpemUgbWF0cml4LCBpdCBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSwKKy8vLyB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcgaXQgZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCkKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBCbG9ja1hwciBibG9jayhJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wsIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQoreworICByZXR1cm4gQmxvY2tYcHIoZGVyaXZlZCgpLCBzdGFydFJvdywgc3RhcnRDb2wsIGJsb2NrUm93cywgYmxvY2tDb2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpLiAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDb25zdEJsb2NrWHByIGJsb2NrKEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwgSW5kZXggYmxvY2tSb3dzLCBJbmRleCBibG9ja0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdEJsb2NrWHByKGRlcml2ZWQoKSwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scyk7Cit9CisKKworCisKKy8vLyBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIGEgdG9wLXJpZ2h0IGNvcm5lciBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBjUm93cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGNvcm5lcgorLy8vIFxwYXJhbSBjQ29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGNvcm5lcgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgQmxvY2tYcHIgdG9wUmlnaHRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKQoreworICByZXR1cm4gQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBjQ29scywgY1Jvd3MsIGNDb2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgdG9wUmlnaHRDb3JuZXIoSW5kZXgsIEluZGV4KS4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgQ29uc3RCbG9ja1hwciB0b3BSaWdodENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdEJsb2NrWHByKGRlcml2ZWQoKSwgMCwgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7Cit9CisKKy8vLyBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgZml4ZWQtc2l6ZSB0b3AtcmlnaHQgY29ybmVyIG9mICp0aGlzLgorLy8vCisvLy8gXHRwYXJhbSBDUm93cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGNvcm5lcgorLy8vIFx0cGFyYW0gQ0NvbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjb3JuZXIKKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXIub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfTk9UX0lOTkVSX1BBTkVMCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrPGludCxpbnQ+KEluZGV4LEluZGV4KQorLy8vCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUgdG9wUmlnaHRDb3JuZXIoKQoreworICByZXR1cm4gdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUoZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBDQ29scyk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcFJpZ2h0Q29ybmVyPGludCwgaW50PigpLgordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUgdG9wUmlnaHRDb3JuZXIoKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZShkZXJpdmVkKCksIDAsIGNvbHMoKSAtIENDb2xzKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSB0b3AtcmlnaHQgY29ybmVyIG9mICp0aGlzLgorLy8vCisvLy8gXHRwYXJhbSBDUm93cyBudW1iZXIgb2Ygcm93cyBpbiBjb3JuZXIgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFx0cGFyYW0gQ0NvbHMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gIGNSb3dzIG51bWJlciBvZiByb3dzIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLyBccGFyYW0gIGNDb2xzIG51bWJlciBvZiBjb2x1bW5zIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWZ1bCBmb3IgY29ybmVycyB3aGVyZSB0aGUgbnVtYmVyIG9mIHJvd3MgaXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaXMgc3BlY2lmaWVkIGF0IHJ1bi10aW1lLCBvciB2aWNlIHZlcnNhLiBUaGUgY29tcGlsZS10aW1lIGFuZCBydW4tdGltZQorLy8vIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsIFxhIGNSb3dzIHNob3VsZCBlcXVhbCBcYSBDUm93cyB1bmxlc3MKKy8vLyBcYSBDUm93cyBpcyBcYSBEeW5hbWljLCBhbmQgdGhlIHNhbWUgZm9yIHRoZSBudW1iZXIgb2YgY29sdW1ucy4KKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lcl9pbnRfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrCisvLy8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIHRvcFJpZ2h0Q29ybmVyKEluZGV4IGNSb3dzLCBJbmRleCBjQ29scykKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgMCwgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcFJpZ2h0Q29ybmVyPGludCwgaW50PihJbmRleCwgSW5kZXgpLgordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZSB0b3BSaWdodENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDb25zdEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgMCwgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBkeW5hbWljLXNpemUgZXhwcmVzc2lvbiBvZiBhIHRvcC1sZWZ0IGNvcm5lciBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBjUm93cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGNvcm5lcgorLy8vIFxwYXJhbSBjQ29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGNvcm5lcgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90b3BMZWZ0Q29ybmVyX2ludF9pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90b3BMZWZ0Q29ybmVyX2ludF9pbnQub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfTk9UX0lOTkVSX1BBTkVMCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIEJsb2NrWHByIHRvcExlZnRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKQoreworICByZXR1cm4gQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCAwLCBjUm93cywgY0NvbHMpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0b3BMZWZ0Q29ybmVyKEluZGV4LCBJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IENvbnN0QmxvY2tYcHIgdG9wTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdEJsb2NrWHByKGRlcml2ZWQoKSwgMCwgMCwgY1Jvd3MsIGNDb2xzKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIHRvcC1sZWZ0IGNvcm5lciBvZiAqdGhpcy4KKy8vLworLy8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIENSb3dzIGFuZCBDQ29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGluIHRoZSBjb3JuZXIuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZSB0b3BMZWZ0Q29ybmVyKCkKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgMCwgMCk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcExlZnRDb3JuZXI8aW50LCBpbnQ+KCkuCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZSB0b3BMZWZ0Q29ybmVyKCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUoZGVyaXZlZCgpLCAwLCAwKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSB0b3AtbGVmdCBjb3JuZXIgb2YgKnRoaXMuCisvLy8KKy8vLyBcdHBhcmFtIENSb3dzIG51bWJlciBvZiByb3dzIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHRwYXJhbSBDQ29scyBudW1iZXIgb2YgY29sdW1ucyBpbiBjb3JuZXIgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFxwYXJhbSAgY1Jvd3MgbnVtYmVyIG9mIHJvd3MgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vIFxwYXJhbSAgY0NvbHMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZnVsIGZvciBjb3JuZXJzIHdoZXJlIHRoZSBudW1iZXIgb2Ygcm93cyBpcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUsIG9yIHZpY2UgdmVyc2EuIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lCisvLy8gaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBjb250cmFkaWN0LiBJbiBvdGhlciB3b3JkcywgXGEgY1Jvd3Mgc2hvdWxkIGVxdWFsIFxhIENSb3dzIHVubGVzcworLy8vIFxhIENSb3dzIGlzIFxhIER5bmFtaWMsIGFuZCB0aGUgc2FtZSBmb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lcl9pbnRfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrCisvLy8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIHRvcExlZnRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKQoreworICByZXR1cm4gdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUoZGVyaXZlZCgpLCAwLCAwLCBjUm93cywgY0NvbHMpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0b3BMZWZ0Q29ybmVyPGludCwgaW50PihJbmRleCwgSW5kZXgpLgordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZSB0b3BMZWZ0Q29ybmVyKEluZGV4IGNSb3dzLCBJbmRleCBjQ29scykgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUoZGVyaXZlZCgpLCAwLCAwLCBjUm93cywgY0NvbHMpOworfQorCisKKworLy8vIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgYSBib3R0b20tcmlnaHQgY29ybmVyIG9mICp0aGlzLgorLy8vCisvLy8gXHBhcmFtIGNSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29ybmVyCisvLy8gXHBhcmFtIGNDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29ybmVyCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBCbG9ja1hwciBib3R0b21SaWdodENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpCit7CisgIHJldHVybiBCbG9ja1hwcihkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCBjb2xzKCkgLSBjQ29scywgY1Jvd3MsIGNDb2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tUmlnaHRDb3JuZXIoSW5kZXgsIEluZGV4KS4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgQ29uc3RCbG9ja1hwciBib3R0b21SaWdodENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdEJsb2NrWHByKGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIGNvbHMoKSAtIGNDb2xzLCBjUm93cywgY0NvbHMpOworfQorCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiAqdGhpcy4KKy8vLworLy8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIENSb3dzIGFuZCBDQ29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGluIHRoZSBjb3JuZXIuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXIuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbVJpZ2h0Q29ybmVyLm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIGJvdHRvbVJpZ2h0Q29ybmVyKCkKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgcm93cygpIC0gQ1Jvd3MsIGNvbHMoKSAtIENDb2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tUmlnaHRDb3JuZXI8aW50LCBpbnQ+KCkuCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZSBib3R0b21SaWdodENvcm5lcigpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDb25zdEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgcm93cygpIC0gQ1Jvd3MsIGNvbHMoKSAtIENDb2xzKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBib3R0b20tcmlnaHQgY29ybmVyIG9mICp0aGlzLgorLy8vCisvLy8gXHRwYXJhbSBDUm93cyBudW1iZXIgb2Ygcm93cyBpbiBjb3JuZXIgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFx0cGFyYW0gQ0NvbHMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gIGNSb3dzIG51bWJlciBvZiByb3dzIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLyBccGFyYW0gIGNDb2xzIG51bWJlciBvZiBjb2x1bW5zIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWZ1bCBmb3IgY29ybmVycyB3aGVyZSB0aGUgbnVtYmVyIG9mIHJvd3MgaXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaXMgc3BlY2lmaWVkIGF0IHJ1bi10aW1lLCBvciB2aWNlIHZlcnNhLiBUaGUgY29tcGlsZS10aW1lIGFuZCBydW4tdGltZQorLy8vIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsIFxhIGNSb3dzIHNob3VsZCBlcXVhbCBcYSBDUm93cyB1bmxlc3MKKy8vLyBcYSBDUm93cyBpcyBcYSBEeW5hbWljLCBhbmQgdGhlIHNhbWUgZm9yIHRoZSBudW1iZXIgb2YgY29sdW1ucy4KKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50LmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrCisvLy8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIGJvdHRvbVJpZ2h0Q29ybmVyKEluZGV4IGNSb3dzLCBJbmRleCBjQ29scykKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIGNvbHMoKSAtIGNDb2xzLCBjUm93cywgY0NvbHMpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21SaWdodENvcm5lcjxpbnQsIGludD4oSW5kZXgsIEluZGV4KS4KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUgYm90dG9tUmlnaHRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZShkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCBjb2xzKCkgLSBjQ29scywgY1Jvd3MsIGNDb2xzKTsKK30KKworCisKKy8vLyBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIGEgYm90dG9tLWxlZnQgY29ybmVyIG9mICp0aGlzLgorLy8vCisvLy8gXHBhcmFtIGNSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29ybmVyCisvLy8gXHBhcmFtIGNDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29ybmVyCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgQmxvY2tYcHIgYm90dG9tTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpCit7CisgIHJldHVybiBCbG9ja1hwcihkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCAwLCBjUm93cywgY0NvbHMpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21MZWZ0Q29ybmVyKEluZGV4LCBJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IENvbnN0QmxvY2tYcHIgYm90dG9tTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdEJsb2NrWHByKGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIDAsIGNSb3dzLCBjQ29scyk7Cit9CisKKy8vLyBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgZml4ZWQtc2l6ZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgKnRoaXMuCisvLy8KKy8vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycyBDUm93cyBhbmQgQ0NvbHMgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgY29ybmVyLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXIuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXIub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfTk9UX0lOTkVSX1BBTkVMCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUgYm90dG9tTGVmdENvcm5lcigpCit7CisgIHJldHVybiB0eXBlbmFtZSBGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZShkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCAwKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tTGVmdENvcm5lcjxpbnQsIGludD4oKS4KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCB0eXBlbmFtZSBDb25zdEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIGJvdHRvbUxlZnRDb3JuZXIoKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPENSb3dzLENDb2xzPjo6VHlwZShkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCAwKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBib3R0b20tbGVmdCBjb3JuZXIgb2YgKnRoaXMuCisvLy8KKy8vLyBcdHBhcmFtIENSb3dzIG51bWJlciBvZiByb3dzIGluIGNvcm5lciBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHRwYXJhbSBDQ29scyBudW1iZXIgb2YgY29sdW1ucyBpbiBjb3JuZXIgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFxwYXJhbSAgY1Jvd3MgbnVtYmVyIG9mIHJvd3MgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vIFxwYXJhbSAgY0NvbHMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gY29ybmVyIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZnVsIGZvciBjb3JuZXJzIHdoZXJlIHRoZSBudW1iZXIgb2Ygcm93cyBpcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUsIG9yIHZpY2UgdmVyc2EuIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lCisvLy8gaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBjb250cmFkaWN0LiBJbiBvdGhlciB3b3JkcywgXGEgY1Jvd3Mgc2hvdWxkIGVxdWFsIFxhIENSb3dzIHVubGVzcworLy8vIFxhIENSb3dzIGlzIFxhIER5bmFtaWMsIGFuZCB0aGUgc2FtZSBmb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lcl9pbnRfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrCisvLy8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlIGJvdHRvbUxlZnRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKQoreworICByZXR1cm4gdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUoZGVyaXZlZCgpLCByb3dzKCkgLSBjUm93cywgMCwgY1Jvd3MsIGNDb2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tTGVmdENvcm5lcjxpbnQsIGludD4oSW5kZXgsIEluZGV4KS4KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxDUm93cyxDQ29scz46OlR5cGUgYm90dG9tTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDb25zdEZpeGVkQmxvY2tYcHI8Q1Jvd3MsQ0NvbHM+OjpUeXBlKGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIDAsIGNSb3dzLCBjQ29scyk7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSB0b3Agcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBuIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgYmxvY2sKKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdG9wUm93c19pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90b3BSb3dzX2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihyb3ctbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIFJvd3NCbG9ja1hwciB0b3BSb3dzKEluZGV4IG4pCit7CisgIHJldHVybiBSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0b3BSb3dzKEluZGV4KS4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgQ29uc3RSb3dzQmxvY2tYcHIgdG9wUm93cyhJbmRleCBuKSBjb25zdAoreworICByZXR1cm4gQ29uc3RSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSB0b3Agcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vCisvLy8gVGhlIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBjb250cmFkaWN0LiBJbiBvdGhlciB3b3JkcywKKy8vLyBcYSBuIHNob3VsZCBlcXVhbCBcYSBOIHVubGVzcyBcYSBOIGlzIFxhIER5bmFtaWMuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF90b3BSb3dzLmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3RvcFJvd3Mub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYocm93LW1ham9yKQorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgdG9wUm93cyhJbmRleCBuID0gTikKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCAwLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0b3BSb3dzPGludD4oKS4KK3RlbXBsYXRlPGludCBOPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBDb25zdE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgdG9wUm93cyhJbmRleCBuID0gTikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TlJvd3NCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIDAsIG4sIGNvbHMoKSk7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSBib3R0b20gcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBuIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgYmxvY2sKKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfYm90dG9tUm93c19pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ib3R0b21Sb3dzX2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihyb3ctbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIFJvd3NCbG9ja1hwciBib3R0b21Sb3dzKEluZGV4IG4pCit7CisgIHJldHVybiBSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCByb3dzKCkgLSBuLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21Sb3dzKEluZGV4KS4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgQ29uc3RSb3dzQmxvY2tYcHIgYm90dG9tUm93cyhJbmRleCBuKSBjb25zdAoreworICByZXR1cm4gQ29uc3RSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCByb3dzKCkgLSBuLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSBib3R0b20gcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vCisvLy8gVGhlIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgaW5mb3JtYXRpb24gc2hvdWxkIG5vdCBjb250cmFkaWN0LiBJbiBvdGhlciB3b3JkcywKKy8vLyBcYSBuIHNob3VsZCBlcXVhbCBcYSBOIHVubGVzcyBcYSBOIGlzIFxhIER5bmFtaWMuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9ib3R0b21Sb3dzLmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2JvdHRvbVJvd3Mub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYocm93LW1ham9yKQorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgYm90dG9tUm93cyhJbmRleCBuID0gTikKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCByb3dzKCkgLSBuLCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21Sb3dzPGludD4oKS4KK3RlbXBsYXRlPGludCBOPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBDb25zdE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgYm90dG9tUm93cyhJbmRleCBuID0gTikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TlJvd3NCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIHJvd3MoKSAtIG4sIDAsIG4sIGNvbHMoKSk7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2Ygcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBzdGFydFJvdyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHJvdyBpbiB0aGUgYmxvY2sKKy8vLyBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX0lOTkVSX1BBTkVMX0lGKHJvdy1tYWpvcikKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgUm93c0Jsb2NrWHByIG1pZGRsZVJvd3MoSW5kZXggc3RhcnRSb3csIEluZGV4IG4pCit7CisgIHJldHVybiBSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCBzdGFydFJvdywgMCwgbiwgY29scygpKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlkZGxlUm93cyhJbmRleCxJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbnN0Um93c0Jsb2NrWHByIG1pZGRsZVJvd3MoSW5kZXggc3RhcnRSb3csIEluZGV4IG4pIGNvbnN0Cit7CisgIHJldHVybiBDb25zdFJvd3NCbG9ja1hwcihkZXJpdmVkKCksIHN0YXJ0Um93LCAwLCBuLCBjb2xzKCkpOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2Ygcm93cyBvZiAqdGhpcy4KKy8vLworLy8vIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gc3RhcnRSb3cgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgaW4gdGhlIGJsb2NrCisvLy8gXHBhcmFtIG4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBibG9jayBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsCisvLy8gXGEgbiBzaG91bGQgZXF1YWwgXGEgTiB1bmxlc3MgXGEgTiBpcyBcYSBEeW5hbWljLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVSb3dzLmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihyb3ctbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgTlJvd3NCbG9ja1hwcjxOPjo6VHlwZSBtaWRkbGVSb3dzKEluZGV4IHN0YXJ0Um93LCBJbmRleCBuID0gTikKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCBzdGFydFJvdywgMCwgbiwgY29scygpKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlkZGxlUm93czxpbnQ+KCkuCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgQ29uc3ROUm93c0Jsb2NrWHByPE4+OjpUeXBlIG1pZGRsZVJvd3MoSW5kZXggc3RhcnRSb3csIEluZGV4IG4gPSBOKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3ROUm93c0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgc3RhcnRSb3csIDAsIG4sIGNvbHMoKSk7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSBsZWZ0IGNvbHVtbnMgb2YgKnRoaXMuCisvLy8KKy8vLyBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJsb2NrCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2xlZnRDb2xzX2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2xlZnRDb2xzX2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihjb2x1bW4tbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbHNCbG9ja1hwciBsZWZ0Q29scyhJbmRleCBuKQoreworICByZXR1cm4gQ29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgMCwgcm93cygpLCBuKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbGVmdENvbHMoSW5kZXgpLgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBDb25zdENvbHNCbG9ja1hwciBsZWZ0Q29scyhJbmRleCBuKSBjb25zdAoreworICByZXR1cm4gQ29uc3RDb2xzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCAwLCByb3dzKCksIG4pOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSBsZWZ0IGNvbHVtbnMgb2YgKnRoaXMuCisvLy8KKy8vLyBcdHBhcmFtIE4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jayBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jayBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsCisvLy8gXGEgbiBzaG91bGQgZXF1YWwgXGEgTiB1bmxlc3MgXGEgTiBpcyBcYSBEeW5hbWljLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfbGVmdENvbHMuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfbGVmdENvbHMub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYoY29sdW1uLW1ham9yKQorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUgbGVmdENvbHMoSW5kZXggbiA9IE4pCit7CisgIHJldHVybiB0eXBlbmFtZSBOQ29sc0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgMCwgMCwgcm93cygpLCBuKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbGVmdENvbHM8aW50PigpLgordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZSBsZWZ0Q29scyhJbmRleCBuID0gTikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIDAsIHJvd3MoKSwgbik7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSByaWdodCBjb2x1bW5zIG9mICp0aGlzLgorLy8vCisvLy8gXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jaworLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9yaWdodENvbHNfaW50LmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmlnaHRDb2xzX2ludC5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihjb2x1bW4tbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbHNCbG9ja1hwciByaWdodENvbHMoSW5kZXggbikKK3sKKyAgcmV0dXJuIENvbHNCbG9ja1hwcihkZXJpdmVkKCksIDAsIGNvbHMoKSAtIG4sIHJvd3MoKSwgbik7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJpZ2h0Q29scyhJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbnN0Q29sc0Jsb2NrWHByIHJpZ2h0Q29scyhJbmRleCBuKSBjb25zdAoreworICByZXR1cm4gQ29uc3RDb2xzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBuLCByb3dzKCksIG4pOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSByaWdodCBjb2x1bW5zIG9mICp0aGlzLgorLy8vCisvLy8gXHRwYXJhbSBOIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFxwYXJhbSBuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sgYXMgc3BlY2lmaWVkIGF0IHJ1bi10aW1lCisvLy8KKy8vLyBUaGUgY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGNvbnRyYWRpY3QuIEluIG90aGVyIHdvcmRzLAorLy8vIFxhIG4gc2hvdWxkIGVxdWFsIFxhIE4gdW5sZXNzIFxhIE4gaXMgXGEgRHluYW1pYy4KKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3JpZ2h0Q29scy5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9yaWdodENvbHMub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYoY29sdW1uLW1ham9yKQorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUgcmlnaHRDb2xzKEluZGV4IG4gPSBOKQoreworICByZXR1cm4gdHlwZW5hbWUgTkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIGNvbHMoKSAtIG4sIHJvd3MoKSwgbik7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJpZ2h0Q29sczxpbnQ+KCkuCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlIHJpZ2h0Q29scyhJbmRleCBuID0gTikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIGNvbHMoKSAtIG4sIHJvd3MoKSwgbik7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2YgY29sdW1ucyBvZiAqdGhpcy4KKy8vLworLy8vIFxwYXJhbSBzdGFydENvbCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGUgYmxvY2sKKy8vLyBccGFyYW0gbnVtQ29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJsb2NrCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfbWlkZGxlQ29sc19pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGVuc2VCYXNlX21pZGRsZUNvbHNfaW50Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX0lOTkVSX1BBTkVMX0lGKGNvbHVtbi1tYWpvcikKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgQ29sc0Jsb2NrWHByIG1pZGRsZUNvbHMoSW5kZXggc3RhcnRDb2wsIEluZGV4IG51bUNvbHMpCit7CisgIHJldHVybiBDb2xzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCBzdGFydENvbCwgcm93cygpLCBudW1Db2xzKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlkZGxlQ29scyhJbmRleCxJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbnN0Q29sc0Jsb2NrWHByIG1pZGRsZUNvbHMoSW5kZXggc3RhcnRDb2wsIEluZGV4IG51bUNvbHMpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdENvbHNCbG9ja1hwcihkZXJpdmVkKCksIDAsIHN0YXJ0Q29sLCByb3dzKCksIG51bUNvbHMpOworfQorCisvLy8gXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2YgY29sdW1ucyBvZiAqdGhpcy4KKy8vLworLy8vIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gc3RhcnRDb2wgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIGJsb2NrCisvLy8gXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jayBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsCisvLy8gXGEgbiBzaG91bGQgZXF1YWwgXGEgTiB1bmxlc3MgXGEgTiBpcyBcYSBEeW5hbWljLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlQ29scy5vdXQKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRihjb2x1bW4tbWFqb3IpCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorLy8vCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgTkNvbHNCbG9ja1hwcjxOPjo6VHlwZSBtaWRkbGVDb2xzKEluZGV4IHN0YXJ0Q29sLCBJbmRleCBuID0gTikKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCAwLCBzdGFydENvbCwgcm93cygpLCBuKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlkZGxlQ29sczxpbnQ+KCkuCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlIG1pZGRsZUNvbHMoSW5kZXggc3RhcnRDb2wsIEluZGV4IG4gPSBOKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgMCwgc3RhcnRDb2wsIHJvd3MoKSwgbik7Cit9CisKKworCisvLy8gXHJldHVybnMgYSBmaXhlZC1zaXplIGV4cHJlc3Npb24gb2YgYSBibG9jayBpbiAqdGhpcy4KKy8vLworLy8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIFxhIE5Sb3dzIGFuZCBcYSBOQ29scyBhcmUgdGhlIG51bWJlciBvZgorLy8vIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGJsb2NrLgorLy8vCisvLy8gXHBhcmFtIHN0YXJ0Um93IHRoZSBmaXJzdCByb3cgaW4gdGhlIGJsb2NrCisvLy8gXHBhcmFtIHN0YXJ0Q29sIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIGJsb2NrCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ibG9ja19pbnRfaW50Lm91dAorLy8vCisvLy8gXG5vdGUgc2luY2UgYmxvY2sgaXMgYSB0ZW1wbGF0ZWQgbWVtYmVyLCB0aGUga2V5d29yZCB0ZW1wbGF0ZSBoYXMgdG8gYmUgdXNlZAorLy8vIGlmIHRoZSBtYXRyaXggdHlwZSBpcyBhbHNvIGEgdGVtcGxhdGUgcGFyYW1ldGVyOiBcY29kZSBtLnRlbXBsYXRlIGJsb2NrPDMsMz4oMSwxKTsgXGVuZGNvZGUKKy8vLworRUlHRU5fRE9DX0JMT0NLX0FERE9OU19OT1RfSU5ORVJfUEFORUwKKy8vLworLy8vIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisvLy8KK3RlbXBsYXRlPGludCBOUm93cywgaW50IE5Db2xzPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBGaXhlZEJsb2NrWHByPE5Sb3dzLE5Db2xzPjo6VHlwZSBibG9jayhJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wpCit7CisgIHJldHVybiB0eXBlbmFtZSBGaXhlZEJsb2NrWHByPE5Sb3dzLE5Db2xzPjo6VHlwZShkZXJpdmVkKCksIHN0YXJ0Um93LCBzdGFydENvbCk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGJsb2NrPD4oSW5kZXgsIEluZGV4KS4gKi8KK3RlbXBsYXRlPGludCBOUm93cywgaW50IE5Db2xzPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCB0eXBlbmFtZSBDb25zdEZpeGVkQmxvY2tYcHI8TlJvd3MsTkNvbHM+OjpUeXBlIGJsb2NrKEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0Rml4ZWRCbG9ja1hwcjxOUm93cyxOQ29scz46OlR5cGUoZGVyaXZlZCgpLCBzdGFydFJvdywgc3RhcnRDb2wpOworfQorCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGJsb2NrIGluICp0aGlzLgorLy8vCisvLy8gXHRwYXJhbSBOUm93cyBudW1iZXIgb2Ygcm93cyBpbiBibG9jayBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHRwYXJhbSBOQ29scyBudW1iZXIgb2YgY29sdW1ucyBpbiBibG9jayBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHBhcmFtICBzdGFydFJvdyAgdGhlIGZpcnN0IHJvdyBpbiB0aGUgYmxvY2sKKy8vLyBccGFyYW0gIHN0YXJ0Q29sICB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSBibG9jaworLy8vIFxwYXJhbSAgYmxvY2tSb3dzIG51bWJlciBvZiByb3dzIGluIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vIFxwYXJhbSAgYmxvY2tDb2xzIG51bWJlciBvZiBjb2x1bW5zIGluIGJsb2NrIGFzIHNwZWNpZmllZCBhdCBydW4tdGltZQorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZnVsIGZvciBibG9ja3Mgd2hlcmUgdGhlIG51bWJlciBvZiByb3dzIGlzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGlzIHNwZWNpZmllZCBhdCBydW4tdGltZSwgb3IgdmljZSB2ZXJzYS4gVGhlIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUKKy8vLyBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGNvbnRyYWRpY3QuIEluIG90aGVyIHdvcmRzLCBcYSBibG9ja1Jvd3Mgc2hvdWxkIGVxdWFsIFxhIE5Sb3dzIHVubGVzcworLy8vIFxhIE5Sb3dzIGlzIFxhIER5bmFtaWMsIGFuZCB0aGUgc2FtZSBmb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2Jsb2NrX2ludF9pbnRfaW50X2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKy8vLwordGVtcGxhdGU8aW50IE5Sb3dzLCBpbnQgTkNvbHM+CitpbmxpbmUgdHlwZW5hbWUgRml4ZWRCbG9ja1hwcjxOUm93cyxOQ29scz46OlR5cGUgYmxvY2soSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkQmxvY2tYcHI8TlJvd3MsTkNvbHM+OjpUeXBlKGRlcml2ZWQoKSwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scyk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGJsb2NrPD4oSW5kZXgsIEluZGV4LCBJbmRleCwgSW5kZXgpLgordGVtcGxhdGU8aW50IE5Sb3dzLCBpbnQgTkNvbHM+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPE5Sb3dzLE5Db2xzPjo6VHlwZSBibG9jayhJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZEJsb2NrWHByPE5Sb3dzLE5Db2xzPjo6VHlwZShkZXJpdmVkKCksIHN0YXJ0Um93LCBzdGFydENvbCwgYmxvY2tSb3dzLCBibG9ja0NvbHMpOworfQorCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgXGEgaS10aCBjb2x1bW4gb2YgKnRoaXMuIE5vdGUgdGhhdCB0aGUgbnVtYmVyaW5nIHN0YXJ0cyBhdCAwLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jb2wuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jb2wub3V0CisvLy8KK0VJR0VOX0RPQ19CTE9DS19BRERPTlNfSU5ORVJfUEFORUxfSUYoY29sdW1uLW1ham9yKQorLyoqCisgICogXHNhIHJvdygpLCBjbGFzcyBCbG9jayAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBDb2xYcHIgY29sKEluZGV4IGkpCit7CisgIHJldHVybiBDb2xYcHIoZGVyaXZlZCgpLCBpKTsKK30KKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgY29sKCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbnN0Q29sWHByIGNvbChJbmRleCBpKSBjb25zdAoreworICByZXR1cm4gQ29uc3RDb2xYcHIoZGVyaXZlZCgpLCBpKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIFxhIGktdGggcm93IG9mICp0aGlzLiBOb3RlIHRoYXQgdGhlIG51bWJlcmluZyBzdGFydHMgYXQgMC4KKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfcm93LmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfcm93Lm91dAorLy8vCitFSUdFTl9ET0NfQkxPQ0tfQURET05TX0lOTkVSX1BBTkVMX0lGKHJvdy1tYWpvcikKKy8qKgorICAqIFxzYSBjb2woKSwgY2xhc3MgQmxvY2sgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgUm93WHByIHJvdyhJbmRleCBpKQoreworICByZXR1cm4gUm93WHByKGRlcml2ZWQoKSwgaSk7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJvdygpLiAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBDb25zdFJvd1hwciByb3coSW5kZXggaSkgY29uc3QKK3sKKyAgcmV0dXJuIENvbnN0Um93WHByKGRlcml2ZWQoKSwgaSk7Cit9CisKKy8vLyBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIGEgc2VnbWVudCAoaS5lLiBhIHZlY3RvciBibG9jaykgaW4gKnRoaXMuCisvLy8KKy8vLyBcb25seV9mb3JfdmVjdG9ycworLy8vCisvLy8gXHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBjb2VmZmljaWVudCBpbiB0aGUgc2VnbWVudAorLy8vIFxwYXJhbSBuIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBzZWdtZW50CisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3NlZ21lbnRfaW50X2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NlZ21lbnRfaW50X2ludC5vdXQKKy8vLworLy8vIFxub3RlIEV2ZW4gdGhvdWdoIHRoZSByZXR1cm5lZCBleHByZXNzaW9uIGhhcyBkeW5hbWljIHNpemUsIGluIHRoZSBjYXNlCisvLy8gd2hlbiBpdCBpcyBhcHBsaWVkIHRvIGEgZml4ZWQtc2l6ZSB2ZWN0b3IsIGl0IGluaGVyaXRzIGEgZml4ZWQgbWF4aW1hbCBzaXplLAorLy8vIHdoaWNoIG1lYW5zIHRoYXQgZXZhbHVhdGluZyBpdCBkb2VzIG5vdCBjYXVzZSBhIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2ssIHNlZ21lbnQoSW5kZXgpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgU2VnbWVudFJldHVyblR5cGUgc2VnbWVudChJbmRleCBzdGFydCwgSW5kZXggbikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gU2VnbWVudFJldHVyblR5cGUoZGVyaXZlZCgpLCBzdGFydCwgbik7Cit9CisKKworLy8vIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2Ygc2VnbWVudChJbmRleCxJbmRleCkuCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbnN0U2VnbWVudFJldHVyblR5cGUgc2VnbWVudChJbmRleCBzdGFydCwgSW5kZXggbikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQ29uc3RTZWdtZW50UmV0dXJuVHlwZShkZXJpdmVkKCksIHN0YXJ0LCBuKTsKK30KKworLy8vIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgdGhlIGZpcnN0IGNvZWZmaWNpZW50cyBvZiAqdGhpcy4KKy8vLworLy8vIFxvbmx5X2Zvcl92ZWN0b3JzCisvLy8KKy8vLyBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgc2VnbWVudAorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zdGFydF9pbnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9zdGFydF9pbnQub3V0CisvLy8KKy8vLyBcbm90ZSBFdmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZQorLy8vIHdoZW4gaXQgaXMgYXBwbGllZCB0byBhIGZpeGVkLXNpemUgdmVjdG9yLCBpdCBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSwKKy8vLyB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcgaXQgZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCkKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBTZWdtZW50UmV0dXJuVHlwZSBoZWFkKEluZGV4IG4pCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFNlZ21lbnRSZXR1cm5UeXBlKGRlcml2ZWQoKSwgMCwgbik7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGhlYWQoSW5kZXgpLgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBDb25zdFNlZ21lbnRSZXR1cm5UeXBlIGhlYWQoSW5kZXggbikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQ29uc3RTZWdtZW50UmV0dXJuVHlwZShkZXJpdmVkKCksIDAsIG4pOworfQorCisvLy8gXHJldHVybnMgYSBkeW5hbWljLXNpemUgZXhwcmVzc2lvbiBvZiB0aGUgbGFzdCBjb2VmZmljaWVudHMgb2YgKnRoaXMuCisvLy8KKy8vLyBcb25seV9mb3JfdmVjdG9ycworLy8vCisvLy8gXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaW4gdGhlIHNlZ21lbnQKKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZW5kX2ludC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2VuZF9pbnQub3V0CisvLy8KKy8vLyBcbm90ZSBFdmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZQorLy8vIHdoZW4gaXQgaXMgYXBwbGllZCB0byBhIGZpeGVkLXNpemUgdmVjdG9yLCBpdCBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSwKKy8vLyB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcgaXQgZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCkKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBTZWdtZW50UmV0dXJuVHlwZSB0YWlsKEluZGV4IG4pCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFNlZ21lbnRSZXR1cm5UeXBlKGRlcml2ZWQoKSwgdGhpcy0+c2l6ZSgpIC0gbiwgbik7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRhaWwoSW5kZXgpLgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBDb25zdFNlZ21lbnRSZXR1cm5UeXBlIHRhaWwoSW5kZXggbikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQ29uc3RTZWdtZW50UmV0dXJuVHlwZShkZXJpdmVkKCksIHRoaXMtPnNpemUoKSAtIG4sIG4pOworfQorCisvLy8gXHJldHVybnMgYSBmaXhlZC1zaXplIGV4cHJlc3Npb24gb2YgYSBzZWdtZW50IChpLmUuIGEgdmVjdG9yIGJsb2NrKSBpbiBcYyAqdGhpcworLy8vCisvLy8gXG9ubHlfZm9yX3ZlY3RvcnMKKy8vLworLy8vIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgc2VnbWVudCBhcyBzcGVjaWZpZWQgYXQgY29tcGlsZS10aW1lCisvLy8gXHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VnbWVudAorLy8vIFxwYXJhbSBuIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBzZWdtZW50IGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLworLy8vIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsCisvLy8gXGEgbiBzaG91bGQgZXF1YWwgXGEgTiB1bmxlc3MgXGEgTiBpcyBcYSBEeW5hbWljLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc2VnbWVudC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9zZWdtZW50Lm91dAorLy8vCisvLy8gXHNhIGNsYXNzIEJsb2NrCisvLy8KK3RlbXBsYXRlPGludCBOPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPE4+OjpUeXBlIHNlZ21lbnQoSW5kZXggc3RhcnQsIEluZGV4IG4gPSBOKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiB0eXBlbmFtZSBGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPE4+OjpUeXBlKGRlcml2ZWQoKSwgc3RhcnQsIG4pOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBzZWdtZW50PGludD4oSW5kZXgpLgordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxOPjo6VHlwZSBzZWdtZW50KEluZGV4IHN0YXJ0LCBJbmRleCBuID0gTikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPE4+OjpUeXBlKGRlcml2ZWQoKSwgc3RhcnQsIG4pOworfQorCisvLy8gXHJldHVybnMgYSBmaXhlZC1zaXplIGV4cHJlc3Npb24gb2YgdGhlIGZpcnN0IGNvZWZmaWNpZW50cyBvZiAqdGhpcy4KKy8vLworLy8vIFxvbmx5X2Zvcl92ZWN0b3JzCisvLy8KKy8vLyBcdHBhcmFtIE4gdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaW4gdGhlIHNlZ21lbnQgYXMgc3BlY2lmaWVkIGF0IGNvbXBpbGUtdGltZQorLy8vIFxwYXJhbSAgbiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgc2VnbWVudCBhcyBzcGVjaWZpZWQgYXQgcnVuLXRpbWUKKy8vLworLy8vIFRoZSBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGluZm9ybWF0aW9uIHNob3VsZCBub3QgY29udHJhZGljdC4gSW4gb3RoZXIgd29yZHMsCisvLy8gXGEgbiBzaG91bGQgZXF1YWwgXGEgTiB1bmxlc3MgXGEgTiBpcyBcYSBEeW5hbWljLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQub3V0CisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2sKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIEZpeGVkU2VnbWVudFJldHVyblR5cGU8Tj46OlR5cGUgaGVhZChJbmRleCBuID0gTikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxOPjo6VHlwZShkZXJpdmVkKCksIDAsIG4pOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBoZWFkPGludD4oKS4KK3RlbXBsYXRlPGludCBOPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSB0eXBlbmFtZSBDb25zdEZpeGVkU2VnbWVudFJldHVyblR5cGU8Tj46OlR5cGUgaGVhZChJbmRleCBuID0gTikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPE4+OjpUeXBlKGRlcml2ZWQoKSwgMCwgbik7Cit9CisKKy8vLyBccmV0dXJucyBhIGZpeGVkLXNpemUgZXhwcmVzc2lvbiBvZiB0aGUgbGFzdCBjb2VmZmljaWVudHMgb2YgKnRoaXMuCisvLy8KKy8vLyBcb25seV9mb3JfdmVjdG9ycworLy8vCisvLy8gXHRwYXJhbSBOIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBzZWdtZW50IGFzIHNwZWNpZmllZCBhdCBjb21waWxlLXRpbWUKKy8vLyBccGFyYW0gIG4gdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaW4gdGhlIHNlZ21lbnQgYXMgc3BlY2lmaWVkIGF0IHJ1bi10aW1lCisvLy8KKy8vLyBUaGUgY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGNvbnRyYWRpY3QuIEluIG90aGVyIHdvcmRzLAorLy8vIFxhIG4gc2hvdWxkIGVxdWFsIFxhIE4gdW5sZXNzIFxhIE4gaXMgXGEgRHluYW1pYy4KKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2VuZC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9lbmQub3V0CisvLy8KKy8vLyBcc2EgY2xhc3MgQmxvY2sKKy8vLwordGVtcGxhdGU8aW50IE4+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIHR5cGVuYW1lIEZpeGVkU2VnbWVudFJldHVyblR5cGU8Tj46OlR5cGUgdGFpbChJbmRleCBuID0gTikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxOPjo6VHlwZShkZXJpdmVkKCksIHNpemUoKSAtIG4pOworfQorCisvLy8gVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0YWlsPGludD4uCit0ZW1wbGF0ZTxpbnQgTj4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPE4+OjpUeXBlIHRhaWwoSW5kZXggbiA9IE4pIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxOPjo6VHlwZShkZXJpdmVkKCksIHNpemUoKSAtIG4pOworfQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL3BsdWdpbnMvQ29tbW9uQ3dpc2VCaW5hcnlPcHMuaCBiL0VpZ2VuL3NyYy9wbHVnaW5zL0NvbW1vbkN3aXNlQmluYXJ5T3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2NzMwZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9wbHVnaW5zL0NvbW1vbkN3aXNlQmluYXJ5T3BzLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgZmlsZSBpcyBhIGJhc2UgY2xhc3MgcGx1Z2luIGNvbnRhaW5pbmcgY29tbW9uIGNvZWZmaWNpZW50IHdpc2UgZnVuY3Rpb25zLgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZGlmZmVyZW5jZSBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFxub3RlIElmIHlvdSB3YW50IHRvIHN1YnN0cmFjdCBhIGdpdmVuIHNjYWxhciBmcm9tIGFsbCBjb2VmZmljaWVudHMsIHNlZSBDd2lzZTo6b3BlcmF0b3ItKCkuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgb3BlcmF0b3ItPSgpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChvcGVyYXRvci0sZGlmZmVyZW5jZSkKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHN1bSBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFxub3RlIElmIHlvdSB3YW50IHRvIGFkZCBhIGdpdmVuIHNjYWxhciB0byBhbGwgY29lZmZpY2llbnRzLCBzZWUgQ3dpc2U6Om9wZXJhdG9yKygpLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG9wZXJhdG9yKz0oKQorICAqLworRUlHRU5fTUFLRV9DV0lTRV9CSU5BUllfT1Aob3BlcmF0b3IrLHN1bSkKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBjdXN0b20gY29lZmZpY2llbnQtd2lzZSBvcGVyYXRvciBcYSBmdW5jIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21CaW5hcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3RvcgorICAqIG9mIHRoZSBjdXN0b20gb3BlcmF0b3IgKHNlZSBjbGFzcyBDd2lzZUJpbmFyeU9wIGZvciBhbiBleGFtcGxlKQorICAqCisgICogSGVyZSBpcyBhbiBleGFtcGxlIGlsbHVzdHJhdGluZyB0aGUgdXNlIG9mIGN1c3RvbSBmdW5jdG9yczoKKyAgKiBcaW5jbHVkZSBjbGFzc19Dd2lzZUJpbmFyeU9wLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0N3aXNlQmluYXJ5T3Aub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgb3BlcmF0b3IrKCksIG9wZXJhdG9yLSgpLCBjd2lzZVByb2R1Y3QoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tQmluYXJ5T3AsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8Q3VzdG9tQmluYXJ5T3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2JpbmFyeUV4cHIoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIsIGNvbnN0IEN1c3RvbUJpbmFyeU9wJiBmdW5jID0gQ3VzdG9tQmluYXJ5T3AoKSkgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8Q3VzdG9tQmluYXJ5T3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGZ1bmMpOworfQorCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK0VJR0VOX01BS0VfU0NBTEFSX0JJTkFSWV9PUChvcGVyYXRvcioscHJvZHVjdCkKKyNlbHNlCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBcYyAqdGhpcyBzY2FsZWQgYnkgdGhlIHNjYWxhciBmYWN0b3IgXGEgc2NhbGFyCisgICoKKyAgKiBcdHBhcmFtIFQgaXMgdGhlIHNjYWxhciB0eXBlIG9mIFxhIHNjYWxhci4gSXQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcixUPixEZXJpdmVkLENvbnN0YW50PFQ+ID4gb3BlcmF0b3IqKGNvbnN0IFQmIHNjYWxhcikgY29uc3Q7CisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBcYSBleHByIHNjYWxlZCBieSB0aGUgc2NhbGFyIGZhY3RvciBcYSBzY2FsYXIKKyAgKgorICAqIFx0cGFyYW0gVCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgc2NhbGFyLiBJdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQKK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFQsU2NhbGFyPixDb25zdGFudDxUPixEZXJpdmVkPiBvcGVyYXRvciooY29uc3QgVCYgc2NhbGFyLCBjb25zdCBTdG9yYWdlQmFzZVR5cGUmIGV4cHIpOworI2VuZGlmCisKKworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCitFSUdFTl9NQUtFX1NDQUxBUl9CSU5BUllfT1BfT05USEVSSUdIVChvcGVyYXRvci8scXVvdGllbnQpCisjZWxzZQorLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgXGMgKnRoaXMgZGl2aWRlZCBieSB0aGUgc2NhbGFyIHZhbHVlIFxhIHNjYWxhcgorICAqCisgICogXHRwYXJhbSBUIGlzIHRoZSBzY2FsYXIgdHlwZSBvZiBcYSBzY2FsYXIuIEl0IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyLFQ+LERlcml2ZWQsQ29uc3RhbnQ8VD4gPiBvcGVyYXRvci8oY29uc3QgVCYgc2NhbGFyKSBjb25zdDsKKyNlbmRpZgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBib29sZWFuIFxiIGFuZCBvcGVyYXRvciBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgb3BlcmF0b3IgaXMgZm9yIGV4cHJlc3Npb24gb2YgYm9vbCBvbmx5LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9hbmQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9hbmQub3V0CisgICoKKyAgKiBcc2Egb3BlcmF0b3J8fCgpLCBzZWxlY3QoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYm9vbGVhbl9hbmRfb3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK29wZXJhdG9yJiYoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPGJvb2wsU2NhbGFyPjo6dmFsdWUgJiYgaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCx0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19PRl9CT09MKTsKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX2FuZF9vcCwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYm9vbGVhbiBcYiBvciBvcGVyYXRvciBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgb3BlcmF0b3IgaXMgZm9yIGV4cHJlc3Npb24gb2YgYm9vbCBvbmx5LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9vci5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9ib29sZWFuX29yLm91dAorICAqCisgICogXHNhIG9wZXJhdG9yJiYoKSwgc2VsZWN0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5fb3Jfb3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK29wZXJhdG9yfHwoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPGJvb2wsU2NhbGFyPjo6dmFsdWUgJiYgaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCx0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19PRl9CT09MKTsKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX29yX29wLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSxvdGhlci5kZXJpdmVkKCkpOworfQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL3BsdWdpbnMvQ29tbW9uQ3dpc2VVbmFyeU9wcy5oIGIvRWlnZW4vc3JjL3BsdWdpbnMvQ29tbW9uQ3dpc2VVbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjRmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9Db21tb25Dd2lzZVVuYXJ5T3BzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgZmlsZSBpcyBhIGJhc2UgY2xhc3MgcGx1Z2luIGNvbnRhaW5pbmcgY29tbW9uIGNvZWZmaWNpZW50IHdpc2UgZnVuY3Rpb25zLgorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKy8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIGNvbmp1Z2F0ZSgpICovCit0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlcml2ZWQmCisgICAgICAgICAgICAgICAgICA+Ojp0eXBlIENvbmp1Z2F0ZVJldHVyblR5cGU7CisvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiByZWFsKCkgY29uc3QgKi8KK3R5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3JlYWxfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlcml2ZWQmCisgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFJlYWxSZXR1cm5UeXBlOworLyoqIFxpbnRlcm5hbCB0aGUgcmV0dXJuIHR5cGUgb2YgcmVhbCgpICovCit0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICAgICAgICAgICAgICBDd2lzZVVuYXJ5VmlldzxpbnRlcm5hbDo6c2NhbGFyX3JlYWxfcmVmX29wPFNjYWxhcj4sIERlcml2ZWQ+LAorICAgICAgICAgICAgICAgICAgICBEZXJpdmVkJgorICAgICAgICAgICAgICAgICAgPjo6dHlwZSBOb25Db25zdFJlYWxSZXR1cm5UeXBlOworLyoqIFxpbnRlcm5hbCB0aGUgcmV0dXJuIHR5cGUgb2YgaW1hZygpIGNvbnN0ICovCit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ltYWdfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gSW1hZ1JldHVyblR5cGU7CisvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiBpbWFnKCkgKi8KK3R5cGVkZWYgQ3dpc2VVbmFyeVZpZXc8aW50ZXJuYWw6OnNjYWxhcl9pbWFnX3JlZl9vcDxTY2FsYXI+LCBEZXJpdmVkPiBOb25Db25zdEltYWdSZXR1cm5UeXBlOworCit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IE5lZ2F0aXZlUmV0dXJuVHlwZTsKKworI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgb3Bwb3NpdGUgb2YgXGMgKnRoaXMKKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhvcGVyYXRvci0sb3Bwb3NpdGUpCisvLy8KK0VJR0VOX0RFVklDRV9GVU5DCitpbmxpbmUgY29uc3QgTmVnYXRpdmVSZXR1cm5UeXBlCitvcGVyYXRvci0oKSBjb25zdCB7IHJldHVybiBOZWdhdGl2ZVJldHVyblR5cGUoZGVyaXZlZCgpKTsgfQorCisKK3RlbXBsYXRlPGNsYXNzIE5ld1R5cGU+IHN0cnVjdCBDYXN0WHByIHsgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxEZXJpdmVkLGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8U2NhbGFyLCBOZXdUeXBlPiwgY29uc3QgRGVyaXZlZD4gPjo6dHlwZSBUeXBlOyB9OworCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBcYyAqdGhpcyB3aXRoIHRoZSBcYSBTY2FsYXIgdHlwZSBjYXN0ZWQgdG8KKy8vLyBcYSBOZXdTY2FsYXIuCisvLy8KKy8vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIE5ld1NjYWxhciBpcyB0aGUgdHlwZSB3ZSBhcmUgY2FzdGluZyB0aGUgc2NhbGFycyB0by4KKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhjYXN0LGNvbnZlcnNpb24gZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE5ld1R5cGU+CitFSUdFTl9ERVZJQ0VfRlVOQwordHlwZW5hbWUgQ2FzdFhwcjxOZXdUeXBlPjo6VHlwZQorY2FzdCgpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDYXN0WHByPE5ld1R5cGU+OjpUeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8vLyBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBcYyAqdGhpcy4KKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhjb25qdWdhdGUsY29tcGxleCBjb25qdWdhdGUpCisvLy8KKy8vLyBcc2EgPGEgaHJlZj0iZ3JvdXBfX0NvZWZmd2lzZU1hdGhGdW5jdGlvbnMuaHRtbCNjd2lzZXRhYmxlX2NvbmoiPk1hdGggZnVuY3Rpb25zPC9hPiwgTWF0cml4QmFzZTo6YWRqb2ludCgpCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIENvbmp1Z2F0ZVJldHVyblR5cGUKK2Nvbmp1Z2F0ZSgpIGNvbnN0Cit7CisgIHJldHVybiBDb25qdWdhdGVSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8vLyBccmV0dXJucyBhIHJlYWQtb25seSBleHByZXNzaW9uIG9mIHRoZSByZWFsIHBhcnQgb2YgXGMgKnRoaXMuCisvLy8KK0VJR0VOX0RPQ19VTkFSWV9BRERPTlMocmVhbCxyZWFsIHBhcnQgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgaW1hZygpCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIFJlYWxSZXR1cm5UeXBlCityZWFsKCkgY29uc3QgeyByZXR1cm4gUmVhbFJldHVyblR5cGUoZGVyaXZlZCgpKTsgfQorCisvLy8gXHJldHVybnMgYW4gcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIFxjICp0aGlzLgorLy8vCitFSUdFTl9ET0NfVU5BUllfQURET05TKGltYWcsaW1hZ2luYXJ5IHBhcnQgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgcmVhbCgpCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEltYWdSZXR1cm5UeXBlCitpbWFnKCkgY29uc3QgeyByZXR1cm4gSW1hZ1JldHVyblR5cGUoZGVyaXZlZCgpKTsgfQorCisvLy8gXGJyaWVmIEFwcGx5IGEgdW5hcnkgb3BlcmF0b3IgY29lZmZpY2llbnQtd2lzZQorLy8vIFxwYXJhbVtpbl0gIGZ1bmMgIEZ1bmN0b3IgaW1wbGVtZW50aW5nIHRoZSB1bmFyeSBvcGVyYXRvcgorLy8vIFx0cGFyYW0gIEN1c3RvbVVuYXJ5T3AgVHlwZSBvZiBcYSBmdW5jCisvLy8gXHJldHVybnMgQW4gZXhwcmVzc2lvbiBvZiBhIGN1c3RvbSBjb2VmZmljaWVudC13aXNlIHVuYXJ5IG9wZXJhdG9yIFxhIGZ1bmMgb2YgKnRoaXMKKy8vLworLy8vIFRoZSBmdW5jdGlvbiBcYyBwdHJfZnVuKCkgZnJvbSB0aGUgQysrIHN0YW5kYXJkIGxpYnJhcnkgY2FuIGJlIHVzZWQgdG8gbWFrZSBmdW5jdG9ycyBvdXQgb2Ygbm9ybWFsIGZ1bmN0aW9ucy4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gXGluY2x1ZGUgY2xhc3NfQ3dpc2VVbmFyeU9wX3B0cmZ1bi5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBjbGFzc19Dd2lzZVVuYXJ5T3BfcHRyZnVuLm91dAorLy8vCisvLy8gR2VudWluZSBmdW5jdG9ycyBhbGxvdyBmb3IgbW9yZSBwb3NzaWJpbGl0aWVzLCBmb3IgaW5zdGFuY2UgaXQgbWF5IGNvbnRhaW4gYSBzdGF0ZS4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gXGluY2x1ZGUgY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcAorLy8vIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0N3aXNlVW5hcnlPcC5vdXQKKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyh1bmFyeUV4cHIsdW5hcnkgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgdW5hcnlWaWV3RXhwciwgYmluYXJ5RXhwciwgY2xhc3MgQ3dpc2VVbmFyeU9wCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbVVuYXJ5T3A+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxDdXN0b21VbmFyeU9wLCBjb25zdCBEZXJpdmVkPgordW5hcnlFeHByKGNvbnN0IEN1c3RvbVVuYXJ5T3AmIGZ1bmMgPSBDdXN0b21VbmFyeU9wKCkpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVVuYXJ5T3A8Q3VzdG9tVW5hcnlPcCwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBmdW5jKTsKK30KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBjdXN0b20gY29lZmZpY2llbnQtd2lzZSB1bmFyeSBvcGVyYXRvciBcYSBmdW5jIG9mICp0aGlzCisvLy8KKy8vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIEN1c3RvbVVuYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IKKy8vLyBvZiB0aGUgY3VzdG9tIHVuYXJ5IG9wZXJhdG9yLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyBcaW5jbHVkZSBjbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgY2xhc3NfQ3dpc2VVbmFyeU9wLm91dAorLy8vCitFSUdFTl9ET0NfVU5BUllfQURET05TKHVuYXJ5Vmlld0V4cHIsdW5hcnkgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgdW5hcnlFeHByLCBiaW5hcnlFeHByIGNsYXNzIEN3aXNlVW5hcnlPcAorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21WaWV3T3A+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlWaWV3PEN1c3RvbVZpZXdPcCwgY29uc3QgRGVyaXZlZD4KK3VuYXJ5Vmlld0V4cHIoY29uc3QgQ3VzdG9tVmlld09wJiBmdW5jID0gQ3VzdG9tVmlld09wKCkpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVVuYXJ5VmlldzxDdXN0b21WaWV3T3AsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZnVuYyk7Cit9CisKKy8vLyBccmV0dXJucyBhIG5vbiBjb25zdCBleHByZXNzaW9uIG9mIHRoZSByZWFsIHBhcnQgb2YgXGMgKnRoaXMuCisvLy8KK0VJR0VOX0RPQ19VTkFSWV9BRERPTlMocmVhbCxyZWFsIHBhcnQgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgaW1hZygpCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIE5vbkNvbnN0UmVhbFJldHVyblR5cGUKK3JlYWwoKSB7IHJldHVybiBOb25Db25zdFJlYWxSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworLy8vIFxyZXR1cm5zIGEgbm9uIGNvbnN0IGV4cHJlc3Npb24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIFxjICp0aGlzLgorLy8vCitFSUdFTl9ET0NfVU5BUllfQURET05TKGltYWcsaW1hZ2luYXJ5IHBhcnQgZnVuY3Rpb24pCisvLy8KKy8vLyBcc2EgcmVhbCgpCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIE5vbkNvbnN0SW1hZ1JldHVyblR5cGUKK2ltYWcoKSB7IHJldHVybiBOb25Db25zdEltYWdSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9wbHVnaW5zL01hdHJpeEN3aXNlQmluYXJ5T3BzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9NYXRyaXhDd2lzZUJpbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDg0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9NYXRyaXhDd2lzZUJpbmFyeU9wcy5oCkBAIC0wLDAgKzEsMTUyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGlzIGZpbGUgaXMgYSBiYXNlIGNsYXNzIHBsdWdpbiBjb250YWluaW5nIG1hdHJpeCBzcGVjaWZpY3MgY29lZmZpY2llbnQgd2lzZSBmdW5jdGlvbnMuCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBTY2h1ciBwcm9kdWN0IChjb2VmZmljaWVudCB3aXNlIHByb2R1Y3QpIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZVByb2R1Y3QuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZVByb2R1Y3Qub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgY3dpc2VBYnMyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9DV0lTRV9CSU5BUllfUkVUVVJOX1RZUEUoRGVyaXZlZCxPdGhlckRlcml2ZWQscHJvZHVjdCkKK2N3aXNlUHJvZHVjdChjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTkFSWV9SRVRVUk5fVFlQRShEZXJpdmVkLE90aGVyRGVyaXZlZCxwcm9kdWN0KShkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlID09IG9wZXJhdG9yIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogXHdhcm5pbmcgdGhpcyBwZXJmb3JtcyBhbiBleGFjdCBjb21wYXJpc29uLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBlcXVhbGl0eSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9yIG1hdHJpY2VzIHdpdGggZmxvYXRpbmctcG9pbnQgY29lZmZpY2llbnRzLCBpdCBpcworICAqIGdlbmVyYWxseSBhIGZhciBiZXR0ZXIgaWRlYSB0byB1c2UgYSBmdXp6eSBjb21wYXJpc29uIGFzIHByb3ZpZGVkIGJ5IGlzQXBwcm94KCkgYW5kCisgICogaXNNdWNoU21hbGxlclRoYW4oKS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlRXF1YWwub3V0CisgICoKKyAgKiBcc2EgY3dpc2VOb3RFcXVhbCgpLCBpc0FwcHJveCgpLCBpc011Y2hTbWFsbGVyVGhhbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEN3aXNlQmluYXJ5T3A8c3RkOjplcXVhbF90bzxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+Citjd2lzZUVxdWFsKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxzdGQ6OmVxdWFsX3RvPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSAhPSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgcGVyZm9ybXMgYW4gZXhhY3QgY29tcGFyaXNvbiwgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgYmFkIGlkZWEgd2l0aCBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgKiBJbiBvcmRlciB0byBjaGVjayBmb3IgZXF1YWxpdHkgYmV0d2VlbiB0d28gdmVjdG9ycyBvciBtYXRyaWNlcyB3aXRoIGZsb2F0aW5nLXBvaW50IGNvZWZmaWNpZW50cywgaXQgaXMKKyAgKiBnZW5lcmFsbHkgYSBmYXIgYmV0dGVyIGlkZWEgdG8gdXNlIGEgZnV6enkgY29tcGFyaXNvbiBhcyBwcm92aWRlZCBieSBpc0FwcHJveCgpIGFuZAorICAqIGlzTXVjaFNtYWxsZXJUaGFuKCkuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTm90RXF1YWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLm91dAorICAqCisgICogXHNhIGN3aXNlRXF1YWwoKSwgaXNBcHByb3goKSwgaXNNdWNoU21hbGxlclRoYW4oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPHN0ZDo6bm90X2VxdWFsX3RvPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2N3aXNlTm90RXF1YWwoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPHN0ZDo6bm90X2VxdWFsX3RvPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtaW4gb2YgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTWluLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VNaW4ub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgbWF4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9taW5fb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2N3aXNlTWluKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXIsU2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1pbiBvZiAqdGhpcyBhbmQgc2NhbGFyIFxhIG90aGVyCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgbWluKCkKKyAgKi8KK0VJR0VOX0RFVklDRV9GVU5DCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9taW5fb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZT4KK2N3aXNlTWluKGNvbnN0IFNjYWxhciAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBjd2lzZU1pbihEZXJpdmVkOjpDb25zdGFudChyb3dzKCksIGNvbHMoKSwgb3RoZXIpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbWF4IG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZU1heC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTWF4Lm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1pbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWF4X29wPFNjYWxhcixTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+Citjd2lzZU1heChjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tYXhfb3A8U2NhbGFyLFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtYXggb2YgKnRoaXMgYW5kIHNjYWxhciBcYSBvdGhlcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1pbigpCisgICovCitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWF4X29wPFNjYWxhcixTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDb25zdGFudFJldHVyblR5cGU+Citjd2lzZU1heChjb25zdCBTY2FsYXIgJm90aGVyKSBjb25zdAoreworICByZXR1cm4gY3dpc2VNYXgoRGVyaXZlZDo6Q29uc3RhbnQocm93cygpLCBjb2xzKCksIG90aGVyKSk7Cit9CisKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgcXVvdGllbnQgb2YgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZVF1b3RpZW50Lm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIGN3aXNlUHJvZHVjdCgpLCBjd2lzZUludmVyc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fREVWSUNFX0ZVTkMKK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2N3aXNlUXVvdGllbnQoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK3R5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsU2NhbGFyLGludGVybmFsOjpjbXBfRVE+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDb25zdGFudFJldHVyblR5cGU+IEN3aXNlU2NhbGFyRXF1YWxSZXR1cm5UeXBlOworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSA9PSBvcGVyYXRvciBvZiBcYyAqdGhpcyBhbmQgYSBzY2FsYXIgXGEgcworICAqCisgICogXHdhcm5pbmcgdGhpcyBwZXJmb3JtcyBhbiBleGFjdCBjb21wYXJpc29uLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBlcXVhbGl0eSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9yIG1hdHJpY2VzIHdpdGggZmxvYXRpbmctcG9pbnQgY29lZmZpY2llbnRzLCBpdCBpcworICAqIGdlbmVyYWxseSBhIGZhciBiZXR0ZXIgaWRlYSB0byB1c2UgYSBmdXp6eSBjb21wYXJpc29uIGFzIHByb3ZpZGVkIGJ5IGlzQXBwcm94KCkgYW5kCisgICogaXNNdWNoU21hbGxlclRoYW4oKS4KKyAgKgorICAqIFxzYSBjd2lzZUVxdWFsKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmKSBjb25zdAorICAqLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDd2lzZVNjYWxhckVxdWFsUmV0dXJuVHlwZQorY3dpc2VFcXVhbChjb25zdCBTY2FsYXImIHMpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVNjYWxhckVxdWFsUmV0dXJuVHlwZShkZXJpdmVkKCksIERlcml2ZWQ6OkNvbnN0YW50KHJvd3MoKSwgY29scygpLCBzKSwgaW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLFNjYWxhcixpbnRlcm5hbDo6Y21wX0VRPigpKTsKK30KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9wbHVnaW5zL01hdHJpeEN3aXNlVW5hcnlPcHMuaCBiL0VpZ2VuL3NyYy9wbHVnaW5zL01hdHJpeEN3aXNlVW5hcnlPcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJlM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oCkBAIC0wLDAgKzEsODUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBpbnRvIHRoZSBib2R5IG9mIHRoZSBiYXNlIGNsYXNzZXMgc3VwcG9ydGluZyBtYXRyaXggc3BlY2lmaWMgY29lZmZpY2llbnQtd2lzZSBmdW5jdGlvbnMuCisvLyBUaGlzIGluY2x1ZGUgTWF0cml4QmFzZSBhbmQgU3BhcnNlTWF0cml4QmFzZS4KKworCit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Fic19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBDd2lzZUFic1JldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FiczJfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQ3dpc2VBYnMyUmV0dXJuVHlwZTsKK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3FydF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBDd2lzZVNxcnRSZXR1cm5UeXBlOwordHlwZWRlZiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zaWduX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IEN3aXNlU2lnblJldHVyblR5cGU7Cit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gQ3dpc2VJbnZlcnNlUmV0dXJuVHlwZTsKKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYWJzb2x1dGUgdmFsdWUgb2YgXGMgKnRoaXMKKy8vLworLy8vIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VBYnMuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFicy5vdXQKKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhjd2lzZUFicyxhYnNvbHV0ZSB2YWx1ZSkKKy8vLworLy8vIFxzYSBjd2lzZUFiczIoKQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUFic1JldHVyblR5cGUKK2N3aXNlQWJzKCkgY29uc3QgeyByZXR1cm4gQ3dpc2VBYnNSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlZCBhYnNvbHV0ZSB2YWx1ZSBvZiBcYyAqdGhpcworLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFiczIub3V0CisvLy8KK0VJR0VOX0RPQ19VTkFSWV9BRERPTlMoY3dpc2VBYnMyLHNxdWFyZWQgYWJzb2x1dGUgdmFsdWUpCisvLy8KKy8vLyBcc2EgY3dpc2VBYnMoKQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUFiczJSZXR1cm5UeXBlCitjd2lzZUFiczIoKSBjb25zdCB7IHJldHVybiBDd2lzZUFiczJSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworLy8vIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlIHJvb3Qgb2YgKnRoaXMuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU3FydC5vdXQKKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhjd2lzZVNxcnQsc3F1YXJlLXJvb3QpCisvLy8KKy8vLyBcc2EgY3dpc2VQb3coKSwgY3dpc2VTcXVhcmUoKQorLy8vCitFSUdFTl9ERVZJQ0VfRlVOQworaW5saW5lIGNvbnN0IEN3aXNlU3FydFJldHVyblR5cGUKK2N3aXNlU3FydCgpIGNvbnN0IHsgcmV0dXJuIEN3aXNlU3FydFJldHVyblR5cGUoZGVyaXZlZCgpKTsgfQorCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBzaWdudW0gb2YgKnRoaXMuCisvLy8KKy8vLyBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU2lnbi5jcHAKKy8vLyBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU2lnbi5vdXQKKy8vLworRUlHRU5fRE9DX1VOQVJZX0FERE9OUyhjd2lzZVNpZ24sc2lnbiBmdW5jdGlvbikKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDd2lzZVNpZ25SZXR1cm5UeXBlCitjd2lzZVNpZ24oKSBjb25zdCB7IHJldHVybiBDd2lzZVNpZ25SZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworCisvLy8gXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBpbnZlcnNlIG9mICp0aGlzLgorLy8vCisvLy8gRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUludmVyc2UuY3BwCisvLy8gT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUludmVyc2Uub3V0CisvLy8KK0VJR0VOX0RPQ19VTkFSWV9BRERPTlMoY3dpc2VJbnZlcnNlLGludmVyc2UpCisvLy8KKy8vLyBcc2EgY3dpc2VQcm9kdWN0KCkKKy8vLworRUlHRU5fREVWSUNFX0ZVTkMKK2lubGluZSBjb25zdCBDd2lzZUludmVyc2VSZXR1cm5UeXBlCitjd2lzZUludmVyc2UoKSBjb25zdCB7IHJldHVybiBDd2lzZUludmVyc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7IH0KKworCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcxN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDM1IEBACitJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBFaWdlbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRXhwbGFuYXRpb24gYmVmb3JlIHN0YXJ0aW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRWlnZW4gY29uc2lzdHMgb25seSBvZiBoZWFkZXIgZmlsZXMsIGhlbmNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGlsZQorYmVmb3JlIHlvdSBjYW4gdXNlIGl0LiBNb3Jlb3ZlciwgdGhlc2UgaGVhZGVyIGZpbGVzIGRvIG5vdCBkZXBlbmQgb24geW91cgorcGxhdGZvcm0sIHRoZXkgYXJlIHRoZSBzYW1lIGZvciBldmVyeWJvZHkuCisKK01ldGhvZCAxLiBJbnN0YWxsaW5nIHdpdGhvdXQgdXNpbmcgQ01ha2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworWW91IGNhbiB1c2UgcmlnaHQgYXdheSB0aGUgaGVhZGVycyBpbiB0aGUgRWlnZW4vIHN1YmRpcmVjdG9yeS4gSW4gb3JkZXIKK3RvIGluc3RhbGwsIGp1c3QgY29weSB0aGlzIEVpZ2VuLyBzdWJkaXJlY3RvcnkgdG8geW91ciBmYXZvcml0ZSBsb2NhdGlvbi4KK0lmIHlvdSBhbHNvIHdhbnQgdGhlIHVuc3VwcG9ydGVkIGZlYXR1cmVzLCBjb3B5IHRoZSB1bnN1cHBvcnRlZC8KK3N1YmRpcmVjdG9yeSB0b28uCisKK01ldGhvZCAyLiBJbnN0YWxsaW5nIHVzaW5nIENNYWtlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitMZXQncyBjYWxsIHRoaXMgZGlyZWN0b3J5ICdzb3VyY2VfZGlyJyAod2hlcmUgdGhpcyBJTlNUQUxMIGZpbGUgaXMpLgorQmVmb3JlIHN0YXJ0aW5nLCBjcmVhdGUgYW5vdGhlciBkaXJlY3Rvcnkgd2hpY2ggd2Ugd2lsbCBjYWxsICdidWlsZF9kaXInLgorCitEbzoKKworICBjZCBidWlsZF9kaXIKKyAgY21ha2Ugc291cmNlX2RpcgorICBtYWtlIGluc3RhbGwKKworVGhlICJtYWtlIGluc3RhbGwiIHN0ZXAgbWF5IHJlcXVpcmUgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLgorCitZb3UgY2FuIGFkanVzdCB0aGUgaW5zdGFsbGF0aW9uIGRlc3RpbmF0aW9uICh0aGUgInByZWZpeCIpCitieSBwYXNzaW5nIHRoZSAtRENNQUtFX0lOU1RBTExfUFJFRklYPW15cHJlZml4IG9wdGlvbiB0byBjbWFrZSwgYXMgaXMKK2V4cGxhaW5lZCBpbiB0aGUgbWVzc2FnZSB0aGF0IGNtYWtlIHByaW50cyBhdCB0aGUgZW5kLgpkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfTVBMMiBiL01PRFVMRV9MSUNFTlNFX01QTDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL01PRFVMRV9MSUNFTlNFX01QTDIKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGUyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEsMzczIEBACitNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEuIERlZmluaXRpb25zCistLS0tLS0tLS0tLS0tLQorCisxLjEuICJDb250cmlidXRvciIKKyAgICBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IHRoYXQgY3JlYXRlcywgY29udHJpYnV0ZXMgdG8KKyAgICB0aGUgY3JlYXRpb24gb2YsIG9yIG93bnMgQ292ZXJlZCBTb2Z0d2FyZS4KKworMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIKKyAgICBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbnMgb2Ygb3RoZXJzIChpZiBhbnkpIHVzZWQKKyAgICBieSBhIENvbnRyaWJ1dG9yIGFuZCB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IncyBDb250cmlidXRpb24uCisKKzEuMy4gIkNvbnRyaWJ1dGlvbiIKKyAgICBtZWFucyBDb3ZlcmVkIFNvZnR3YXJlIG9mIGEgcGFydGljdWxhciBDb250cmlidXRvci4KKworMS40LiAiQ292ZXJlZCBTb2Z0d2FyZSIKKyAgICBtZWFucyBTb3VyY2UgQ29kZSBGb3JtIHRvIHdoaWNoIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGhhcyBhdHRhY2hlZAorICAgIHRoZSBub3RpY2UgaW4gRXhoaWJpdCBBLCB0aGUgRXhlY3V0YWJsZSBGb3JtIG9mIHN1Y2ggU291cmNlIENvZGUKKyAgICBGb3JtLCBhbmQgTW9kaWZpY2F0aW9ucyBvZiBzdWNoIFNvdXJjZSBDb2RlIEZvcm0sIGluIGVhY2ggY2FzZQorICAgIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgorCisxLjUuICJJbmNvbXBhdGlibGUgV2l0aCBTZWNvbmRhcnkgTGljZW5zZXMiCisgICAgbWVhbnMKKworICAgIChhKSB0aGF0IHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGhhcyBhdHRhY2hlZCB0aGUgbm90aWNlIGRlc2NyaWJlZAorICAgICAgICBpbiBFeGhpYml0IEIgdG8gdGhlIENvdmVyZWQgU29mdHdhcmU7IG9yCisKKyAgICAoYikgdGhhdCB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB3YXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgICAgICAgIHZlcnNpb24gMS4xIG9yIGVhcmxpZXIgb2YgdGhlIExpY2Vuc2UsIGJ1dCBub3QgYWxzbyB1bmRlciB0aGUKKyAgICAgICAgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZS4KKworMS42LiAiRXhlY3V0YWJsZSBGb3JtIgorICAgIG1lYW5zIGFueSBmb3JtIG9mIHRoZSB3b3JrIG90aGVyIHRoYW4gU291cmNlIENvZGUgRm9ybS4KKworMS43LiAiTGFyZ2VyIFdvcmsiCisgICAgbWVhbnMgYSB3b3JrIHRoYXQgY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIG1hdGVyaWFsLCBpbiAKKyAgICBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMsIHRoYXQgaXMgbm90IENvdmVyZWQgU29mdHdhcmUuCisKKzEuOC4gIkxpY2Vuc2UiCisgICAgbWVhbnMgdGhpcyBkb2N1bWVudC4KKworMS45LiAiTGljZW5zYWJsZSIKKyAgICBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsCisgICAgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHksIGFueSBhbmQKKyAgICBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCisKKzEuMTAuICJNb2RpZmljYXRpb25zIgorICAgIG1lYW5zIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgKGEpIGFueSBmaWxlIGluIFNvdXJjZSBDb2RlIEZvcm0gdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sCisgICAgICAgIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgQ292ZXJlZAorICAgICAgICBTb2Z0d2FyZTsgb3IKKworICAgIChiKSBhbnkgbmV3IGZpbGUgaW4gU291cmNlIENvZGUgRm9ybSB0aGF0IGNvbnRhaW5zIGFueSBDb3ZlcmVkCisgICAgICAgIFNvZnR3YXJlLgorCisxLjExLiAiUGF0ZW50IENsYWltcyIgb2YgYSBDb250cmlidXRvcgorICAgIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwKKyAgICBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IHN1Y2gKKyAgICBDb250cmlidXRvciB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCwgYnV0IGZvciB0aGUgZ3JhbnQgb2YgdGhlCisgICAgTGljZW5zZSwgYnkgdGhlIG1ha2luZywgdXNpbmcsIHNlbGxpbmcsIG9mZmVyaW5nIGZvciBzYWxlLCBoYXZpbmcKKyAgICBtYWRlLCBpbXBvcnQsIG9yIHRyYW5zZmVyIG9mIGVpdGhlciBpdHMgQ29udHJpYnV0aW9ucyBvciBpdHMKKyAgICBDb250cmlidXRvciBWZXJzaW9uLgorCisxLjEyLiAiU2Vjb25kYXJ5IExpY2Vuc2UiCisgICAgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLjAsIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLjEsIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwKKyAgICBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAzLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aG9zZQorICAgIGxpY2Vuc2VzLgorCisxLjEzLiAiU291cmNlIENvZGUgRm9ybSIKKyAgICBtZWFucyB0aGUgZm9ybSBvZiB0aGUgd29yayBwcmVmZXJyZWQgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLgorCisxLjE0LiAiWW91IiAob3IgIllvdXIiKQorICAgIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcworICAgIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB0aGF0CisgICAgY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IKKyAgICBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3QKKyAgICBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LAorICAgIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbgorICAgIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsCisgICAgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisyLiBMaWNlbnNlIEdyYW50cyBhbmQgQ29uZGl0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMi4xLiBHcmFudHMKKworRWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKK25vbi1leGNsdXNpdmUgbGljZW5zZToKKworKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykKKyAgICBMaWNlbnNhYmxlIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1ha2UgYXZhaWxhYmxlLAorICAgIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgZGlzdHJpYnV0ZSwgYW5kIG90aGVyd2lzZSBleHBsb2l0IGl0cworICAgIENvbnRyaWJ1dGlvbnMsIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIE1vZGlmaWNhdGlvbnMsIG9yCisgICAgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKKworKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgb2Ygc3VjaCBDb250cmlidXRvciB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyCisgICAgZm9yIHNhbGUsIGhhdmUgbWFkZSwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIGVpdGhlciBpdHMKKyAgICBDb250cmlidXRpb25zIG9yIGl0cyBDb250cmlidXRvciBWZXJzaW9uLgorCisyLjIuIEVmZmVjdGl2ZSBEYXRlCisKK1RoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb24gMi4xIHdpdGggcmVzcGVjdCB0byBhbnkgQ29udHJpYnV0aW9uCitiZWNvbWUgZWZmZWN0aXZlIGZvciBlYWNoIENvbnRyaWJ1dGlvbiBvbiB0aGUgZGF0ZSB0aGUgQ29udHJpYnV0b3IgZmlyc3QKK2Rpc3RyaWJ1dGVzIHN1Y2ggQ29udHJpYnV0aW9uLgorCisyLjMuIExpbWl0YXRpb25zIG9uIEdyYW50IFNjb3BlCisKK1RoZSBsaWNlbnNlcyBncmFudGVkIGluIHRoaXMgU2VjdGlvbiAyIGFyZSB0aGUgb25seSByaWdodHMgZ3JhbnRlZCB1bmRlcgordGhpcyBMaWNlbnNlLiBObyBhZGRpdGlvbmFsIHJpZ2h0cyBvciBsaWNlbnNlcyB3aWxsIGJlIGltcGxpZWQgZnJvbSB0aGUKK2Rpc3RyaWJ1dGlvbiBvciBsaWNlbnNpbmcgb2YgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCitOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgYnkgYQorQ29udHJpYnV0b3I6CisKKyhhKSBmb3IgYW55IGNvZGUgdGhhdCBhIENvbnRyaWJ1dG9yIGhhcyByZW1vdmVkIGZyb20gQ292ZXJlZCBTb2Z0d2FyZTsKKyAgICBvcgorCisoYikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgWW91ciBhbmQgYW55IG90aGVyIHRoaXJkIHBhcnR5J3MKKyAgICBtb2RpZmljYXRpb25zIG9mIENvdmVyZWQgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIGl0cworICAgIENvbnRyaWJ1dGlvbnMgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgaXRzIENvbnRyaWJ1dG9yCisgICAgVmVyc2lvbik7IG9yCisKKyhjKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mCisgICAgaXRzIENvbnRyaWJ1dGlvbnMuCisKK1RoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBhbnkgcmlnaHRzIGluIHRoZSB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLAorb3IgbG9nb3Mgb2YgYW55IENvbnRyaWJ1dG9yIChleGNlcHQgYXMgbWF5IGJlIG5lY2Vzc2FyeSB0byBjb21wbHkgd2l0aAordGhlIG5vdGljZSByZXF1aXJlbWVudHMgaW4gU2VjdGlvbiAzLjQpLgorCisyLjQuIFN1YnNlcXVlbnQgTGljZW5zZXMKKworTm8gQ29udHJpYnV0b3IgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgYXMgYSByZXN1bHQgb2YgWW91ciBjaG9pY2UgdG8KK2Rpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgYSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhpcworTGljZW5zZSAoc2VlIFNlY3Rpb24gMTAuMikgb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmCitwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMy4zKS4KKworMi41LiBSZXByZXNlbnRhdGlvbgorCitFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0aGUgQ29udHJpYnV0b3IgYmVsaWV2ZXMgaXRzCitDb250cmlidXRpb25zIGFyZSBpdHMgb3JpZ2luYWwgY3JlYXRpb24ocykgb3IgaXQgaGFzIHN1ZmZpY2llbnQgcmlnaHRzCit0byBncmFudCB0aGUgcmlnaHRzIHRvIGl0cyBDb250cmlidXRpb25zIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKworMi42LiBGYWlyIFVzZQorCitUaGlzIExpY2Vuc2UgaXMgbm90IGludGVuZGVkIHRvIGxpbWl0IGFueSByaWdodHMgWW91IGhhdmUgdW5kZXIKK2FwcGxpY2FibGUgY29weXJpZ2h0IGRvY3RyaW5lcyBvZiBmYWlyIHVzZSwgZmFpciBkZWFsaW5nLCBvciBvdGhlcgorZXF1aXZhbGVudHMuCisKKzIuNy4gQ29uZGl0aW9ucworCitTZWN0aW9ucyAzLjEsIDMuMiwgMy4zLCBhbmQgMy40IGFyZSBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkCitpbiBTZWN0aW9uIDIuMS4KKworMy4gUmVzcG9uc2liaWxpdGllcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCiszLjEuIERpc3RyaWJ1dGlvbiBvZiBTb3VyY2UgRm9ybQorCitBbGwgZGlzdHJpYnV0aW9uIG9mIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgRm9ybSwgaW5jbHVkaW5nIGFueQorTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUsIG11c3QgYmUgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIHRoYXQgdGhlIFNvdXJjZQorQ29kZSBGb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlLCBhbmQgaG93IHRoZXkgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbWF5IG5vdAorYXR0ZW1wdCB0byBhbHRlciBvciByZXN0cmljdCB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZQorRm9ybS4KKworMy4yLiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBGb3JtCisKK0lmIFlvdSBkaXN0cmlidXRlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBGb3JtIHRoZW46CisKKyhhKSBzdWNoIENvdmVyZWQgU29mdHdhcmUgbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlCisgICAgRm9ybSwgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4xLCBhbmQgWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YKKyAgICB0aGUgRXhlY3V0YWJsZSBGb3JtIGhvdyB0aGV5IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHN1Y2ggU291cmNlIENvZGUKKyAgICBGb3JtIGJ5IHJlYXNvbmFibGUgbWVhbnMgaW4gYSB0aW1lbHkgbWFubmVyLCBhdCBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBkaXN0cmlidXRpb24gdG8gdGhlIHJlY2lwaWVudDsgYW5kCisKKyhiKSBZb3UgbWF5IGRpc3RyaWJ1dGUgc3VjaCBFeGVjdXRhYmxlIEZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKKyAgICBMaWNlbnNlLCBvciBzdWJsaWNlbnNlIGl0IHVuZGVyIGRpZmZlcmVudCB0ZXJtcywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgICBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBGb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIKKyAgICB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBGb3JtIHVuZGVyIHRoaXMgTGljZW5zZS4KKworMy4zLiBEaXN0cmlidXRpb24gb2YgYSBMYXJnZXIgV29yaworCitZb3UgbWF5IGNyZWF0ZSBhbmQgZGlzdHJpYnV0ZSBhIExhcmdlciBXb3JrIHVuZGVyIHRlcm1zIG9mIFlvdXIgY2hvaWNlLAorcHJvdmlkZWQgdGhhdCBZb3UgYWxzbyBjb21wbHkgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBmb3IKK3RoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgTGFyZ2VyIFdvcmsgaXMgYSBjb21iaW5hdGlvbiBvZiBDb3ZlcmVkCitTb2Z0d2FyZSB3aXRoIGEgd29yayBnb3Zlcm5lZCBieSBvbmUgb3IgbW9yZSBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZCB0aGUKK0NvdmVyZWQgU29mdHdhcmUgaXMgbm90IEluY29tcGF0aWJsZSBXaXRoIFNlY29uZGFyeSBMaWNlbnNlcywgdGhpcworTGljZW5zZSBwZXJtaXRzIFlvdSB0byBhZGRpdGlvbmFsbHkgZGlzdHJpYnV0ZSBzdWNoIENvdmVyZWQgU29mdHdhcmUKK3VuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoIFNlY29uZGFyeSBMaWNlbnNlKHMpLCBzbyB0aGF0IHRoZSByZWNpcGllbnQgb2YKK3RoZSBMYXJnZXIgV29yayBtYXksIGF0IHRoZWlyIG9wdGlvbiwgZnVydGhlciBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkCitTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoaXMgTGljZW5zZSBvciBzdWNoIFNlY29uZGFyeQorTGljZW5zZShzKS4KKworMy40LiBOb3RpY2VzCisKK1lvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciB0aGUgc3Vic3RhbmNlIG9mIGFueSBsaWNlbnNlIG5vdGljZXMKKyhpbmNsdWRpbmcgY29weXJpZ2h0IG5vdGljZXMsIHBhdGVudCBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwKK29yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eSkgY29udGFpbmVkIHdpdGhpbiB0aGUgU291cmNlIENvZGUgRm9ybSBvZgordGhlIENvdmVyZWQgU29mdHdhcmUsIGV4Y2VwdCB0aGF0IFlvdSBtYXkgYWx0ZXIgYW55IGxpY2Vuc2Ugbm90aWNlcyB0bwordGhlIGV4dGVudCByZXF1aXJlZCB0byByZW1lZHkga25vd24gZmFjdHVhbCBpbmFjY3VyYWNpZXMuCisKKzMuNS4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcworCitZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LAoraW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQKK1NvZnR3YXJlLiBIb3dldmVyLCBZb3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uCitiZWhhbGYgb2YgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkKK3N1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSwgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQorWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueQorbGlhYmlsaXR5IGluY3VycmVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsCitpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4gWW91IG1heSBpbmNsdWRlIGFkZGl0aW9uYWwKK2Rpc2NsYWltZXJzIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9ucyBvZiBsaWFiaWxpdHkgc3BlY2lmaWMgdG8gYW55CitqdXJpc2RpY3Rpb24uCisKKzQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIGl0IGlzIGltcG9zc2libGUgZm9yIFlvdSB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvIHNvbWUgb3IgYWxsIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGR1ZSB0bworc3RhdHV0ZSwganVkaWNpYWwgb3JkZXIsIG9yIHJlZ3VsYXRpb24gdGhlbiBZb3UgbXVzdDogKGEpIGNvbXBseSB3aXRoCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZTsgYW5kIChiKQorZGVzY3JpYmUgdGhlIGxpbWl0YXRpb25zIGFuZCB0aGUgY29kZSB0aGV5IGFmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbiBtdXN0CitiZSBwbGFjZWQgaW4gYSB0ZXh0IGZpbGUgaW5jbHVkZWQgd2l0aCBhbGwgZGlzdHJpYnV0aW9ucyBvZiB0aGUgQ292ZXJlZAorU29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUKK29yIHJlZ3VsYXRpb24sIHN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZSBzdWZmaWNpZW50bHkgZGV0YWlsZWQgZm9yIGEKK3JlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgaXQuCisKKzUuIFRlcm1pbmF0aW9uCistLS0tLS0tLS0tLS0tLQorCis1LjEuIFRoZSByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseQoraWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggYW55IG9mIGl0cyB0ZXJtcy4gSG93ZXZlciwgaWYgWW91IGJlY29tZQorY29tcGxpYW50LCB0aGVuIHRoZSByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIKK0NvbnRyaWJ1dG9yIGFyZSByZWluc3RhdGVkIChhKSBwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHN1Y2gKK0NvbnRyaWJ1dG9yIGV4cGxpY2l0bHkgYW5kIGZpbmFsbHkgdGVybWluYXRlcyBZb3VyIGdyYW50cywgYW5kIChiKSBvbiBhbgorb25nb2luZyBiYXNpcywgaWYgc3VjaCBDb250cmlidXRvciBmYWlscyB0byBub3RpZnkgWW91IG9mIHRoZQorbm9uLWNvbXBsaWFuY2UgYnkgc29tZSByZWFzb25hYmxlIG1lYW5zIHByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgWW91IGhhdmUKK2NvbWUgYmFjayBpbnRvIGNvbXBsaWFuY2UuIE1vcmVvdmVyLCBZb3VyIGdyYW50cyBmcm9tIGEgcGFydGljdWxhcgorQ29udHJpYnV0b3IgYXJlIHJlaW5zdGF0ZWQgb24gYW4gb25nb2luZyBiYXNpcyBpZiBzdWNoIENvbnRyaWJ1dG9yCitub3RpZmllcyBZb3Ugb2YgdGhlIG5vbi1jb21wbGlhbmNlIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUKK2ZpcnN0IHRpbWUgWW91IGhhdmUgcmVjZWl2ZWQgbm90aWNlIG9mIG5vbi1jb21wbGlhbmNlIHdpdGggdGhpcyBMaWNlbnNlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBZb3UgYmVjb21lIGNvbXBsaWFudCBwcmlvciB0byAzMCBkYXlzIGFmdGVyCitZb3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworNS4yLiBJZiBZb3UgaW5pdGlhdGUgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgYnkgYXNzZXJ0aW5nIGEgcGF0ZW50CitpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zLAorY291bnRlci1jbGFpbXMsIGFuZCBjcm9zcy1jbGFpbXMpIGFsbGVnaW5nIHRoYXQgYSBDb250cmlidXRvciBWZXJzaW9uCitkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIHRoZSByaWdodHMgZ3JhbnRlZCB0bworWW91IGJ5IGFueSBhbmQgYWxsIENvbnRyaWJ1dG9ycyBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgU2VjdGlvbgorMi4xIG9mIHRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUuCisKKzUuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDUuMSBvciA1LjIgYWJvdmUsIGFsbAorZW5kIHVzZXIgbGljZW5zZSBhZ3JlZW1lbnRzIChleGNsdWRpbmcgZGlzdHJpYnV0b3JzIGFuZCByZXNlbGxlcnMpIHdoaWNoCitoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBZb3VyIGRpc3RyaWJ1dG9ycyB1bmRlciB0aGlzIExpY2Vuc2UKK3ByaW9yIHRvIHRlcm1pbmF0aW9uIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICA2LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBDb3ZlcmVkIFNvZnR3YXJlIGlzIHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZSBvbiBhbiAiYXMgaXMiICAgICAgICoKKyogIGJhc2lzLCB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzc2VkLCBpbXBsaWVkLCBvciAgKgorKiAgc3RhdHV0b3J5LCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgd2FycmFudGllcyB0aGF0IHRoZSAgICAgICAqCisqICBDb3ZlcmVkIFNvZnR3YXJlIGlzIGZyZWUgb2YgZGVmZWN0cywgbWVyY2hhbnRhYmxlLCBmaXQgZm9yIGEgICAgICAgICoKKyogIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2luZy4gVGhlIGVudGlyZSByaXNrIGFzIHRvIHRoZSAgICAgKgorKiAgcXVhbGl0eSBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgaXMgd2l0aCBZb3UuICAgICAgICAqCisqICBTaG91bGQgYW55IENvdmVyZWQgU29mdHdhcmUgcHJvdmUgZGVmZWN0aXZlIGluIGFueSByZXNwZWN0LCBZb3UgICAgICoKKyogIChub3QgYW55IENvbnRyaWJ1dG9yKSBhc3N1bWUgdGhlIGNvc3Qgb2YgYW55IG5lY2Vzc2FyeSBzZXJ2aWNpbmcsICAgKgorKiAgcmVwYWlyLCBvciBjb3JyZWN0aW9uLiBUaGlzIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgY29uc3RpdHV0ZXMgYW4gICAqCisqICBlc3NlbnRpYWwgcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIHVzZSBvZiBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBpcyAgICoKKyogIGF1dGhvcml6ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGV4Y2VwdCB1bmRlciB0aGlzIGRpc2NsYWltZXIuICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIDcuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwgd2hldGhlciB0b3J0ICAgICAgKgorKiAgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwgc2hhbGwgYW55ICAgICAgICAgICAqCisqICBDb250cmlidXRvciwgb3IgYW55b25lIHdobyBkaXN0cmlidXRlcyBDb3ZlcmVkIFNvZnR3YXJlIGFzICAgICAgICAgICoKKyogIHBlcm1pdHRlZCBhYm92ZSwgYmUgbGlhYmxlIHRvIFlvdSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsICAgICAgICAgKgorKiAgc3BlY2lhbCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgICAgICAqCisqICBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zdCBwcm9maXRzLCBsb3NzIG9mICAgICoKKyogIGdvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgICAgKgorKiAgYW5kIGFsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLCBldmVuIGlmIHN1Y2ggcGFydHkgICAgICAqCisqICBzaGFsbCBoYXZlIGJlZW4gaW5mb3JtZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4gVGhpcyAgICoKKyogIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHNoYWxsIG5vdCBhcHBseSB0byBsaWFiaWxpdHkgZm9yIGRlYXRoIG9yICAgKgorKiAgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZyBmcm9tIHN1Y2ggcGFydHkncyBuZWdsaWdlbmNlIHRvIHRoZSAgICAgICAqCisqICBleHRlbnQgYXBwbGljYWJsZSBsYXcgcHJvaGliaXRzIHN1Y2ggbGltaXRhdGlvbi4gU29tZSAgICAgICAgICAgICAgICoKKyogIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IgbGltaXRhdGlvbiBvZiAgICAgICAgICAgKgorKiAgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uIGFuZCAgICAgICAgICAqCisqICBsaW1pdGF0aW9uIG1heSBub3QgYXBwbHkgdG8gWW91LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzguIExpdGlnYXRpb24KKy0tLS0tLS0tLS0tLS0KKworQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIG1heSBiZSBicm91Z2h0IG9ubHkgaW4gdGhlCitjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24gd2hlcmUgdGhlIGRlZmVuZGFudCBtYWludGFpbnMgaXRzIHByaW5jaXBhbAorcGxhY2Ugb2YgYnVzaW5lc3MgYW5kIHN1Y2ggbGl0aWdhdGlvbiBzaGFsbCBiZSBnb3Zlcm5lZCBieSBsYXdzIG9mIHRoYXQKK2p1cmlzZGljdGlvbiwgd2l0aG91dCByZWZlcmVuY2UgdG8gaXRzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLgorTm90aGluZyBpbiB0aGlzIFNlY3Rpb24gc2hhbGwgcHJldmVudCBhIHBhcnR5J3MgYWJpbGl0eSB0byBicmluZworY3Jvc3MtY2xhaW1zIG9yIGNvdW50ZXItY2xhaW1zLgorCis5LiBNaXNjZWxsYW5lb3VzCistLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyB0aGUgc3ViamVjdAorbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQordW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50CituZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzCit0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyCitzaGFsbCBub3QgYmUgdXNlZCB0byBjb25zdHJ1ZSB0aGlzIExpY2Vuc2UgYWdhaW5zdCBhIENvbnRyaWJ1dG9yLgorCisxMC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxMC4xLiBOZXcgVmVyc2lvbnMKKworTW96aWxsYSBGb3VuZGF0aW9uIGlzIHRoZSBsaWNlbnNlIHN0ZXdhcmQuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uCisxMC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IG9yCitwdWJsaXNoIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEKK2Rpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLgorCisxMC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24KK29mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLAorb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlCitzdGV3YXJkLgorCisxMC4zLiBNb2RpZmllZCBWZXJzaW9ucworCitJZiB5b3UgY3JlYXRlIHNvZnR3YXJlIG5vdCBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UsIGFuZCB5b3Ugd2FudCB0bworY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIHN1Y2ggc29mdHdhcmUsIHlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYQorbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgeW91IHJlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlCithbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0CitzdWNoIG1vZGlmaWVkIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSkuCisKKzEwLjQuIERpc3RyaWJ1dGluZyBTb3VyY2UgQ29kZSBGb3JtIHRoYXQgaXMgSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5CitMaWNlbnNlcworCitJZiBZb3UgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgU291cmNlIENvZGUgRm9ybSB0aGF0IGlzIEluY29tcGF0aWJsZSBXaXRoCitTZWNvbmRhcnkgTGljZW5zZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgdGhlCitub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQiBvZiB0aGlzIExpY2Vuc2UgbXVzdCBiZSBhdHRhY2hlZC4KKworRXhoaWJpdCBBIC0gU291cmNlIENvZGUgRm9ybSBMaWNlbnNlIE5vdGljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKKyAgTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcworICBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCitJZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhcgorZmlsZSwgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRQorZmlsZSBpbiBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sKK2ZvciBzdWNoIGEgbm90aWNlLgorCitZb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC4KKworRXhoaWJpdCBCIC0gIkluY29tcGF0aWJsZSBXaXRoIFNlY29uZGFyeSBMaWNlbnNlcyIgTm90aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgIkluY29tcGF0aWJsZSBXaXRoIFNlY29uZGFyeSBMaWNlbnNlcyIsIGFzCisgIGRlZmluZWQgYnkgdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UsIHYuIDIuMC4KZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Q2ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorbWlhb3dhbmdAZ29vZ2xlLmNvbQordGltbXVycmF5QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL1JFQURNRS5hbmRyb2lkIGIvUkVBRE1FLmFuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YTY4NQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5hbmRyb2lkCkBAIC0wLDAgKzEsMTMgQEAKK0VpZ2VuIDMuMi4yCistLS0tLS0tLS0tLQorCitFaWdlbiBpcyBhIEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5IGZvciBsaW5lYXIgYWxnZWJyYTogbWF0cmljZXMsIHZlY3RvcnMsCitudW1lcmljYWwgc29sdmVycywgYW5kIHJlbGF0ZWQgYWxnb3JpdGhtcy4KKworV2Vic2l0ZTogaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvCisKK3YzLjIuMi4gUmVsZWFzZWQgb24gQXVndXN0IDQsIDIwMTQuIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBmcm9tIGh0dHA6Ly9iaXRidWNrZXQub3JnL2VpZ2VuL2VpZ2VuL2dldC8zLjIuMi50YXIuYnoyLgorCitOb24gTVBMMiBsaWNlbnNlIGNvZGUgaXMgZGlzYWJsZWQuIFRyeWluZyB0byBpbmNsdWRlIHN1Y2ggZmlsZXMgd2lsbAorbGVhZCB0byBhbiBlcnJvci4gU2VlIC4vRWlnZW4vc3JjL0NvcmUvdXRpbC9Ob25NUEwyLmggZm9yIGRldGFpbHMuCmRpZmYgLS1naXQgYS9SRUFETUUudmVyc2lvbiBiL1JFQURNRS52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzRiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUudmVyc2lvbgpAQCAtMCwwICsxLDMgQEAKK1VSTDogaHR0cDovL2JpdGJ1Y2tldC5vcmcvZWlnZW4vZWlnZW4vZ2V0LzMuMy4zLnRhci5iejIKK1ZlcnNpb246IDMuMy4zCitCdWdDb21wb25lbnQ6IDk5MDIzCmRpZmYgLS1naXQgYS9iZW5jaC9CZW5jaFNwYXJzZVV0aWwuaCBiL2JlbmNoL0JlbmNoU3BhcnNlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTgxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9CZW5jaFNwYXJzZVV0aWwuaApAQCAtMCwwICsxLDE0OSBAQAorCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlPgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KKyNpbmNsdWRlIDxzZXQ+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMjQKKyNlbmRpZgorCisjaWZuZGVmIERFTlNJVFkKKyNkZWZpbmUgREVOU0lUWSAwLjAxCisjZW5kaWYKKworI2lmbmRlZiBTQ0FMQVIKKyNkZWZpbmUgU0NBTEFSIGRvdWJsZQorI2VuZGlmCisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7Cit0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IEVpZ2VuU3BhcnNlTWF0cml4OworCit2b2lkIGZpbGxNYXRyaXgoZmxvYXQgZGVuc2l0eSwgaW50IHJvd3MsIGludCBjb2xzLCAgRWlnZW5TcGFyc2VNYXRyaXgmIGRzdCkKK3sKKyAgZHN0LnJlc2VydmUoZG91YmxlKHJvd3MpKmNvbHMqZGVuc2l0eSk7CisgIGZvcihpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspCisgIHsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKQorICAgIHsKKyAgICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogMDsKKyAgICAgIGlmICh2IT0wKQorICAgICAgICBkc3QuaW5zZXJ0KGksaikgPSB2OworICAgIH0KKyAgfQorICBkc3QuZmluYWxpemUoKTsKK30KKwordm9pZCBmaWxsTWF0cml4MihpbnQgbm56UGVyQ29sLCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZU1hdHJpeCYgZHN0KQoreworLy8gICBzdGQ6OmNvdXQgPDwgImFsbG9jICIgPDwgbm56UGVyQ29sKmNvbHMgPDwgIlxuIjsKKyAgZHN0LnJlc2VydmUobm56UGVyQ29sKmNvbHMpOworICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQorICB7CisgICAgc3RkOjpzZXQ8aW50PiBhdXg7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG5uelBlckNvbDsgaSsrKQorICAgIHsKKyAgICAgIGludCBrID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICAgIHdoaWxlIChhdXguZmluZChrKSE9YXV4LmVuZCgpKQorICAgICAgICBrID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICAgIGF1eC5pbnNlcnQoayk7CisKKyAgICAgIGRzdC5pbnNlcnQoayxqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIH0KKyAgfQorICBkc3QuZmluYWxpemUoKTsKK30KKwordm9pZCBlaVRvRGVuc2UoY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNyYywgRGVuc2VNYXRyaXgmIGRzdCkKK3sKKyAgZHN0LnNldFplcm8oKTsKKyAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkKKyAgICAgIGRzdChpdC5pbmRleCgpLGopID0gaXQudmFsdWUoKTsKK30KKworI2lmbmRlZiBOT0dNTQorI2luY2x1ZGUgImdtbS9nbW0uaCIKK3R5cGVkZWYgZ21tOjpjc2NfbWF0cml4PFNjYWxhcj4gR21tU3BhcnNlOwordHlwZWRlZiBnbW06OmNvbF9tYXRyaXg8IGdtbTo6d3N2ZWN0b3I8U2NhbGFyPiA+IEdtbUR5blNwYXJzZTsKK3ZvaWQgZWlUb0dtbShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBHbW1TcGFyc2UmIGRzdCkKK3sKKyAgR21tRHluU3BhcnNlIHRtcChzcmMucm93cygpLCBzcmMuY29scygpKTsKKyAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkKKyAgICAgIHRtcChpdC5pbmRleCgpLGopID0gaXQudmFsdWUoKTsKKyAgZ21tOjpjb3B5KHRtcCwgZHN0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIE5PTVRMCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9tdGwvbXRsLmhwcD4KK3R5cGVkZWYgbXRsOjpjb21wcmVzc2VkMkQ8U2NhbGFyLCBtdGw6Om1hdHJpeDo6cGFyYW1ldGVyczxtdGw6OnRhZzo6Y29sX21ham9yPiA+IE10bFNwYXJzZTsKK3R5cGVkZWYgbXRsOjpjb21wcmVzc2VkMkQ8U2NhbGFyLCBtdGw6Om1hdHJpeDo6cGFyYW1ldGVyczxtdGw6OnRhZzo6cm93X21ham9yPiA+IE10bFNwYXJzZVJvd01ham9yOwordm9pZCBlaVRvTXRsKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIE10bFNwYXJzZSYgZHN0KQoreworICBtdGw6Om1hdHJpeDo6aW5zZXJ0ZXI8TXRsU3BhcnNlPiBpbnMoZHN0KTsKKyAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkKKyAgICAgIGluc1tpdC5pbmRleCgpXVtqXSA9IGl0LnZhbHVlKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIENTUEFSU0UKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImNzLmgiCit9Cit2b2lkIGVpVG9DU3BhcnNlKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIGNzKiAmZHN0KQoreworICBjcyogYXV4ID0gY3Nfc3BhbGxvYyAoMCwgMCwgMSwgMSwgMSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCisgICAgICBpZiAoIWNzX2VudHJ5KGF1eCwgaXQuaW5kZXgoKSwgaiwgaXQudmFsdWUoKSkpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiY3NfZW50cnkgZXJyb3JcbiI7CisgICAgICAgIGV4aXQoMik7CisgICAgICB9CisgICBkc3QgPSBjc19jb21wcmVzcyhhdXgpOworLy8gICAgY3Nfc3BmcmVlKGF1eCk7Cit9CisjZW5kaWYgLy8gQ1NQQVJTRQorCisjaWZuZGVmIE5PVUJMQVMKKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy9tYXRyaXguaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvaW8uaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdHJpYW5ndWxhci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy92ZWN0b3Jfc3BhcnNlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL21hdHJpeF9zcGFyc2UuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yX29mX3ZlY3Rvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy9vcGVyYXRpb24uaHBwPgorCit0eXBlZGVmIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6Y29tcHJlc3NlZF9tYXRyaXg8U2NhbGFyLGJvb3N0OjpudW1lcmljOjp1Ymxhczo6Y29sdW1uX21ham9yPiBVQmxhc1NwYXJzZTsKKwordm9pZCBlaVRvVWJsYXMoY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNyYywgVUJsYXNTcGFyc2UmIGRzdCkKK3sKKyAgZHN0LnJlc2l6ZShzcmMucm93cygpLCBzcmMuY29scygpLCBmYWxzZSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCisgICAgICBkc3QoaXQuaW5kZXgoKSxqKSA9IGl0LnZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFaWdlblR5cGUsIHR5cGVuYW1lIFVibGFzVHlwZT4KK3ZvaWQgZWlUb1VibGFzVmVjKGNvbnN0IEVpZ2VuVHlwZSYgc3JjLCBVYmxhc1R5cGUmIGRzdCkKK3sKKyAgZHN0LnJlc2l6ZShzcmMuc2l6ZSgpKTsKKyAgZm9yIChpbnQgaj0wOyBqPHNyYy5zaXplKCk7ICsraikKKyAgICAgIGRzdFtqXSA9IHNyYy5jb2VmZihqKTsKK30KKyNlbmRpZgorCisjaWZkZWYgT1NLSQorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8b3NraS9vc2tpLmg+Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL0JlbmNoVGltZXIuaCBiL2JlbmNoL0JlbmNoVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI4NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvQmVuY2hUaW1lci5oCkBAIC0wLDAgKzEsMTk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CRU5DSF9USU1FUlJfSAorI2RlZmluZSBFSUdFTl9CRU5DSF9USU1FUlJfSAorCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgaWZuZGVmIE5PTUlOTUFYCisjICAgZGVmaW5lIE5PTUlOTUFYCisjICAgZGVmaW5lIEVJR0VOX0JUX1VOREVGX05PTUlOTUFYCisjIGVuZGlmCisjIGlmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICBkZWZpbmUgRUlHRU5fQlRfVU5ERUZfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBlbmRpZgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgZXNjYXBlKHZvaWQgKnApIHsKKyAgYXNtIHZvbGF0aWxlKCIiIDogOiAiZyIocCkgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyB2b2lkIGNsb2JiZXIoKSB7CisgIGFzbSB2b2xhdGlsZSgiIiA6IDogOiAibWVtb3J5Iik7Cit9CisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCituYW1lc3BhY2UgRWlnZW4KK3sKKworZW51bSB7CisgIENQVV9USU1FUiA9IDAsCisgIFJFQUxfVElNRVIgPSAxCit9OworCisvKiogRWxhcHNlZCB0aW1lIHRpbWVyIGtlZXBpbmcgdGhlIGJlc3QgdHJ5LgorICAqCisgICogT24gUE9TSVggcGxhdGZvcm1zIHdlIHVzZSBjbG9ja19nZXR0aW1lIHdpdGggQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELgorICAqIE9uIFdpbmRvd3Mgd2UgdXNlIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCisgICoKKyAgKiBJbXBvcnRhbnQ6IG9uIGxpbnV4LCB5b3UgbXVzdCBsaW5rIHdpdGggLWxydAorICAqLworY2xhc3MgQmVuY2hUaW1lcgoreworcHVibGljOgorCisgIEJlbmNoVGltZXIoKQorICB7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcSk7CisgICAgbV9mcmVxdWVuY3kgPSAoZG91YmxlKWZyZXEuUXVhZFBhcnQ7CisjZW5kaWYKKyAgICByZXNldCgpOworICB9CisKKyAgfkJlbmNoVGltZXIoKSB7fQorCisgIGlubGluZSB2b2lkIHJlc2V0KCkKKyAgeworICAgIG1fYmVzdHMuZmlsbCgxZTkpOworICAgIG1fd29yc3RzLmZpbGwoMCk7CisgICAgbV90b3RhbHMuc2V0WmVybygpOworICB9CisgIGlubGluZSB2b2lkIHN0YXJ0KCkKKyAgeworICAgIG1fc3RhcnRzW0NQVV9USU1FUl0gID0gZ2V0Q3B1VGltZSgpOworICAgIG1fc3RhcnRzW1JFQUxfVElNRVJdID0gZ2V0UmVhbFRpbWUoKTsKKyAgfQorICBpbmxpbmUgdm9pZCBzdG9wKCkKKyAgeworICAgIG1fdGltZXNbQ1BVX1RJTUVSXSA9IGdldENwdVRpbWUoKSAtIG1fc3RhcnRzW0NQVV9USU1FUl07CisgICAgbV90aW1lc1tSRUFMX1RJTUVSXSA9IGdldFJlYWxUaW1lKCkgLSBtX3N0YXJ0c1tSRUFMX1RJTUVSXTsKKyAgICAjaWYgRUlHRU5fVkVSU0lPTl9BVF9MRUFTVCgyLDkwLDApCisgICAgbV9iZXN0cyA9IG1fYmVzdHMuY3dpc2VNaW4obV90aW1lcyk7CisgICAgbV93b3JzdHMgPSBtX3dvcnN0cy5jd2lzZU1heChtX3RpbWVzKTsKKyAgICAjZWxzZQorICAgIG1fYmVzdHMoMCkgPSBzdGQ6Om1pbihtX2Jlc3RzKDApLG1fdGltZXMoMCkpOworICAgIG1fYmVzdHMoMSkgPSBzdGQ6Om1pbihtX2Jlc3RzKDEpLG1fdGltZXMoMSkpOworICAgIG1fd29yc3RzKDApID0gc3RkOjptYXgobV93b3JzdHMoMCksbV90aW1lcygwKSk7CisgICAgbV93b3JzdHMoMSkgPSBzdGQ6Om1heChtX3dvcnN0cygxKSxtX3RpbWVzKDEpKTsKKyAgICAjZW5kaWYKKyAgICBtX3RvdGFscyArPSBtX3RpbWVzOworICB9CisKKyAgLyoqIFJldHVybiB0aGUgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMgYmV0d2VlbiB0aGUgbGFzdCBzdGFydC9zdG9wIHBhaXIKKyAgICAqLworICBpbmxpbmUgZG91YmxlIHZhbHVlKGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QKKyAgeworICAgIHJldHVybiBtX3RpbWVzW1RJTUVSXTsKKyAgfQorCisgIC8qKiBSZXR1cm4gdGhlIGJlc3QgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMKKyAgICAqLworICBpbmxpbmUgZG91YmxlIGJlc3QoaW50IFRJTUVSID0gQ1BVX1RJTUVSKSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYmVzdHNbVElNRVJdOworICB9CisKKyAgLyoqIFJldHVybiB0aGUgd29yc3QgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMKKyAgICAqLworICBpbmxpbmUgZG91YmxlIHdvcnN0KGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QKKyAgeworICAgIHJldHVybiBtX3dvcnN0c1tUSU1FUl07CisgIH0KKworICAvKiogUmV0dXJuIHRoZSB0b3RhbCBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcy4KKyAgICAqLworICBpbmxpbmUgZG91YmxlIHRvdGFsKGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QKKyAgeworICAgIHJldHVybiBtX3RvdGFsc1tUSU1FUl07CisgIH0KKworICBpbmxpbmUgZG91YmxlIGdldENwdVRpbWUoKSBjb25zdAorICB7CisjaWZkZWYgX1dJTjMyCisgICAgTEFSR0VfSU5URUdFUiBxdWVyeV90aWNrczsKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmcXVlcnlfdGlja3MpOworICAgIHJldHVybiBxdWVyeV90aWNrcy5RdWFkUGFydC9tX2ZyZXF1ZW5jeTsKKyNlbGlmIF9fQVBQTEVfXworICAgIHJldHVybiBkb3VibGUobWFjaF9hYnNvbHV0ZV90aW1lKCkpKjFlLTk7CisjZWxzZQorICAgIHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmdHMpOworICAgIHJldHVybiBkb3VibGUodHMudHZfc2VjKSArIDFlLTkgKiBkb3VibGUodHMudHZfbnNlYyk7CisjZW5kaWYKKyAgfQorCisgIGlubGluZSBkb3VibGUgZ2V0UmVhbFRpbWUoKSBjb25zdAorICB7CisjaWZkZWYgX1dJTjMyCisgICAgU1lTVEVNVElNRSBzdDsKKyAgICBHZXRTeXN0ZW1UaW1lKCZzdCk7CisgICAgcmV0dXJuIChkb3VibGUpc3Qud1NlY29uZCArIDEuZS0zICogKGRvdWJsZSlzdC53TWlsbGlzZWNvbmRzOworI2VsaWYgX19BUFBMRV9fCisgICAgcmV0dXJuIGRvdWJsZShtYWNoX2Fic29sdXRlX3RpbWUoKSkqMWUtOTsKKyNlbHNlCisgICAgdGltZXNwZWMgdHM7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICByZXR1cm4gZG91YmxlKHRzLnR2X3NlYykgKyAxZS05ICogZG91YmxlKHRzLnR2X25zZWMpOworI2VuZGlmCisgIH0KKworcHJvdGVjdGVkOgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIGRvdWJsZSBtX2ZyZXF1ZW5jeTsKKyNlbmRpZgorICBWZWN0b3IyZCBtX3N0YXJ0czsKKyAgVmVjdG9yMmQgbV90aW1lczsKKyAgVmVjdG9yMmQgbV9iZXN0czsKKyAgVmVjdG9yMmQgbV93b3JzdHM7CisgIFZlY3RvcjJkIG1fdG90YWxzOworCitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKK307CisKKyNkZWZpbmUgQkVOQ0goVElNRVIsVFJJRVMsUkVQLENPREUpIHsgXAorICAgIFRJTUVSLnJlc2V0KCk7IFwKKyAgICBmb3IoaW50IHVnbHl2YXJuYW1lMT0wOyB1Z2x5dmFybmFtZTE8VFJJRVM7ICsrdWdseXZhcm5hbWUxKXsgXAorICAgICAgVElNRVIuc3RhcnQoKTsgXAorICAgICAgZm9yKGludCB1Z2x5dmFybmFtZTI9MDsgdWdseXZhcm5hbWUyPFJFUDsgKyt1Z2x5dmFybmFtZTIpeyBcCisgICAgICAgIENPREU7IFwKKyAgICAgIH0gXAorICAgICAgVElNRVIuc3RvcCgpOyBcCisgICAgICBjbG9iYmVyKCk7IFwKKyAgICB9IFwKKyAgfQorCit9CisKKy8vIGNsZWFuICNkZWZpbmVkIHRva2VucworI2lmZGVmIEVJR0VOX0JUX1VOREVGX05PTUlOTUFYCisjIHVuZGVmIEVJR0VOX0JUX1VOREVGX05PTUlOTUFYCisjIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX0JUX1VOREVGX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgdW5kZWYgRUlHRU5fQlRfVU5ERUZfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyB1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworI2VuZGlmIC8vIEVJR0VOX0JFTkNIX1RJTUVSUl9ICmRpZmYgLS1naXQgYS9iZW5jaC9CZW5jaFV0aWwuaCBiL2JlbmNoL0JlbmNoVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODNhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9CZW5jaFV0aWwuaApAQCAtMCwwICsxLDkyIEBACisKKyNpZm5kZWYgRUlHRU5fQkVOQ0hfVVRJTF9ICisjZGVmaW5lIEVJR0VOX0JFTkNIX1VUSUxfSAorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlICJCZW5jaFRpbWVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9lbnVtX3BhcmFtcy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9zZXEuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9hcnJheS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2FyaXRobWV0aWMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9jb21wYXJpc29uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcHVuY3R1YXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9wdW5jdHVhdGlvbi9jb21tYS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3N0cmluZ2l6ZS5ocHA+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW5pdE1hdHJpeF9yYW5kb20oTWF0cml4VHlwZSYgbWF0KSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbml0TWF0cml4X3JhbmRvbShNYXRyaXhUeXBlJiBtYXQpCit7CisgIG1hdC5zZXRSYW5kb20oKTsvLyA9IE1hdHJpeFR5cGU6OnJhbmRvbShtYXQucm93cygpLCBtYXQuY29scygpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbml0TWF0cml4X2lkZW50aXR5KE1hdHJpeFR5cGUmIG1hdCkgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW5pdE1hdHJpeF9pZGVudGl0eShNYXRyaXhUeXBlJiBtYXQpCit7CisgIG1hdC5zZXRJZGVudGl0eSgpOworfQorCisjaWZuZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICB7IFwKKyAgaW50IGF1eDsgXAorICBhc20oIFwKKyAgInN0bXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKKyAgIm9ybCAgICAgICAkMzI4MzIsICVbYXV4XSAgIFxuXHQiIFwKKyAgImxkbXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKKyAgOiA6IFthdXhdICJtIiAoYXV4KSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIERJU0FCTEVfU1NFX0VYQ0VQVElPTlMoKSAgCisjZW5kaWYKKworI2lmZGVmIEJFTkNIX0dNTQorI2luY2x1ZGUgPGdtbS9nbW0uaD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFaWdlbk1hdHJpeFR5cGUsIHR5cGVuYW1lIEdtbU1hdHJpeFR5cGU+Cit2b2lkIGVpVG9HbW0oY29uc3QgRWlnZW5NYXRyaXhUeXBlJiBzcmMsIEdtbU1hdHJpeFR5cGUmIGRzdCkKK3sKKyAgZHN0LnJlc2l6ZShzcmMucm93cygpLHNyYy5jb2xzKCkpOworICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoaW50IGk9MDsgaTxzcmMucm93cygpOyArK2kpCisgICAgICBkc3QoaSxqKSA9IHNyYy5jb2VmZihpLGopOworfQorI2VuZGlmCisKKworI2lmZGVmIEJFTkNIX0dTTAorI2luY2x1ZGUgPGdzbC9nc2xfbWF0cml4Lmg+CisjaW5jbHVkZSA8Z3NsL2dzbF9saW5hbGcuaD4KKyNpbmNsdWRlIDxnc2wvZ3NsX2VpZ2VuLmg+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWlnZW5NYXRyaXhUeXBlPgordm9pZCBlaVRvR3NsKGNvbnN0IEVpZ2VuTWF0cml4VHlwZSYgc3JjLCBnc2xfbWF0cml4KiogZHN0KQoreworICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoaW50IGk9MDsgaTxzcmMucm93cygpOyArK2kpCisgICAgICBnc2xfbWF0cml4X3NldCgqZHN0LCBpLCBqLCBzcmMuY29lZmYoaSxqKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIEJFTkNIX1VCTEFTCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy9tYXRyaXguaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFaWdlbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFVibGFzTWF0cml4VHlwZT4KK3ZvaWQgZWlUb1VibGFzKGNvbnN0IEVpZ2VuTWF0cml4VHlwZSYgc3JjLCBVYmxhc01hdHJpeFR5cGUmIGRzdCkKK3sKKyAgZHN0LnJlc2l6ZShzcmMucm93cygpLHNyYy5jb2xzKCkpOworICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoaW50IGk9MDsgaTxzcmMucm93cygpOyArK2kpCisgICAgICBkc3QoaSxqKSA9IHNyYy5jb2VmZihpLGopOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVpZ2VuVHlwZSwgdHlwZW5hbWUgVWJsYXNUeXBlPgordm9pZCBlaVRvVWJsYXNWZWMoY29uc3QgRWlnZW5UeXBlJiBzcmMsIFVibGFzVHlwZSYgZHN0KQoreworICBkc3QucmVzaXplKHNyYy5zaXplKCkpOworICBmb3IgKGludCBqPTA7IGo8c3JjLnNpemUoKTsgKytqKQorICAgICAgZHN0W2pdID0gc3JjLmNvZWZmKGopOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9CRU5DSF9VVElMX0gKZGlmZiAtLWdpdCBhL2JlbmNoL1JFQURNRS50eHQgYi9iZW5jaC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODMxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTUgQEAKKworVGhpcyBmb2xkZXIgY29udGFpbnMgYSBjb3VwbGUgb2YgYmVuY2htYXJrIHV0aXRpZXMgYW5kIEVpZ2VuIGJlbmNobWFya3MuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogYmVuY2hfbXVsdGlfY29tcGlsZXJzLnNoICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworVGhpcyBzY3JpcHQgYWxsb3dzIHRvIHJ1biBhIGJlbmNobWFyayBvbiBhIHNldCBvZiBkaWZmZXJlbnQgY29tcGlsZXJzL2NvbXBpbGVyIG9wdGlvbnMuCitJdCB0YWtlcyB0d28gYXJndW1lbnRzOgorIC0gYSBmaWxlIGRlZmluaW5nIHRoZSBsaXN0IG9mIHRoZSBjb21waWxlcnMgd2l0aCB0aGVpciBvcHRpb25zCisgLSB0aGUgLmNwcCBmaWxlIG9mIHRoZSBiZW5jaG1hcmsKKworRXhhbXBsZXM6CisKKyQgLi9iZW5jaF9tdWx0aV9jb21waWxlcnMuc2ggYmFzaWNiZW5jaC5jeHhsaXN0IGJhc2ljYmVuY2htYXJrLmNwcAorCisgICAgZysrLTQuMSAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MTAwMDAKKyAgICAzZC0zeDMgICAvICAgNGQtNHg0ICAgLyAgIFhkLTR4NCAgIC8gICBYZC0yMHgyMCAgIC8KKyAgICAwLjI3MTEwMiAgIDAuMTMxNDE2ICAgMC40MjIzMjIgICAwLjE5ODYzMworICAgIDAuMjAxNjU4ICAgMC4xMDI0MzYgICAwLjM5NzU2NiAgIDAuMjA3MjgyCisKKyAgICBnKystNC4yIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0xMDAwMAorICAgIDNkLTN4MyAgIC8gICA0ZC00eDQgICAvICAgWGQtNHg0ICAgLyAgIFhkLTIweDIwICAgLworICAgIDAuMTA3ODA1ICAgMC4wODkwNTc5ICAgMC4zMDI2NSAgIDAuMTYxODQzCisgICAgMC4xMjcxNTcgICAwLjA3MTI1ODEgICAwLjI3ODM0MSAgIDAuMTkxMDI5CisKKyAgICBnKystNC4zIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0xMDAwMAorICAgIDNkLTN4MyAgIC8gICA0ZC00eDQgICAvICAgWGQtNHg0ICAgLyAgIFhkLTIweDIwICAgLworICAgIDAuMTM0MzE4ICAgMC4xMDUyOTEgICAwLjM3MDQgICAwLjE4MDk2NgorICAgIDAuMTM3NzAzICAgMC4wNzMyNDcyICAgMC4zMTIyNSAgIDAuMjAyMjA0CisKKyAgICBpY3BjIC1mYXN0IC1ETkRFQlVHIC1mbm8tZXhjZXB0aW9ucyAtbm8taW5saW5lLW1heC1zaXplCisgICAgM2QtM3gzICAgLyAgIDRkLTR4NCAgIC8gICBYZC00eDQgICAvICAgWGQtMjB4MjAgICAvCisgICAgMC4yMjYxNDUgICAwLjA5NDEzMTkgICAwLjM3MTg3MyAgIDAuMTU5NDMzCisgICAgMC4xMDkzMDIgICAwLjA4Mzc1MzggICAwLjMyODEwMiAgIDAuMTczODkxCisKKworJCAuL2JlbmNoX211bHRpX2NvbXBpbGVycy5zaCBvbXBiZW5jaC5jeHhsaXN0IG9tcGJlbmNobWFyay5jcHAKKworICAgIGcrKy00LjIgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTEwMDAwIC1mb3Blbm1wCisgICAgZG91YmxlLCBmaXhlZC1zaXplIDR4NDogMC4wMDE2NTEwNXMgIDAuMDc3ODczOXMKKyAgICBkb3VibGUsIDMyeDMyOiAwLjA2NTQ3NjlzIDAuMDc1Mjg5cyAgPT4geDAuODY5Njc0ICgyKQorICAgIGRvdWJsZSwgMTI4eDEyODogMC4wNTQxNDhzIDAuMDQxOTY2OXMgID0+IHgxLjI5MDI1ICgyKQorICAgIGRvdWJsZSwgNTEyeDUxMjogMC45MTM3OTlzIDAuNDI4NTMzcyAgPT4geDIuMTMyMzkgKDIpCisgICAgZG91YmxlLCAxMDI0eDEwMjQ6IDE0LjU5NzJzIDkuMzU0MnMgID0+IHgxLjU2MDUgKDIpCisKKyAgICBpY3BjIC1mYXN0IC1ETkRFQlVHIC1mbm8tZXhjZXB0aW9ucyAtbm8taW5saW5lLW1heC1zaXplIC1vcGVubXAKKyAgICBkb3VibGUsIGZpeGVkLXNpemUgNHg0OiAwLjAwMDU4OTg0OHMgIDAuMDE5OTQ5cworICAgIGRvdWJsZSwgMzJ4MzI6IDAuMDY4Mjc4MXMgMC4wNDQ5NzIycyAgPT4geDEuNTE4MjMgKDIpCisgICAgZG91YmxlLCAxMjh4MTI4OiAwLjA1NDc1MDlzIDAuMDQzNTUxOXMgID0+IHgxLjI1NzE0ICgyKQorICAgIGRvdWJsZSwgNTEyeDUxMjogMC44Mjk0MzZzIDAuNDI0NDM4cyAgPT4geDEuOTU0MiAoMikKKyAgICBkb3VibGUsIDEwMjR4MTAyNDogMTQuNTI0M3MgMTAuNzczNXMgID0+IHgxLjM0ODE1ICgyKQorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYW5hbHl6ZS1ibG9ja2luZy1zaXplcy5jcHAgYi9iZW5jaC9hbmFseXplLWJsb2NraW5nLXNpemVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYzYTFkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYW5hbHl6ZS1ibG9ja2luZy1zaXplcy5jcHAKQEAgLTAsMCArMSw4NzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBKYWNvYiA8YmVub2l0amFjb2JAZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY29uc3QgaW50IGRlZmF1bHRfcHJlY2lzaW9uID0gNDsKKworLy8gc2VlIC0tb25seS1jdWJpYy1zaXplcworYm9vbCBvbmx5X2N1YmljX3NpemVzID0gZmFsc2U7CisKKy8vIHNlZSAtLWR1bXAtdGFibGVzCitib29sIGR1bXBfdGFibGVzID0gZmFsc2U7CisKK3VpbnQ4X3QgbG9nMl9wb3Qoc2l6ZV90IHgpIHsKKyAgc2l6ZV90IGwgPSAwOworICB3aGlsZSAoeCA+Pj0gMSkgbCsrOworICByZXR1cm4gbDsKK30KKwordWludDE2X3QgY29tcGFjdF9zaXplX3RyaXBsZShzaXplX3Qgaywgc2l6ZV90IG0sIHNpemVfdCBuKQoreworICByZXR1cm4gKGxvZzJfcG90KGspIDw8IDgpIHwgKGxvZzJfcG90KG0pIDw8IDQpIHwgbG9nMl9wb3Qobik7Cit9CisKKy8vIGp1c3QgYSBoZWxwZXIgdG8gc3RvcmUgYSB0cmlwbGUgb2YgSyxNLE4gc2l6ZXMgZm9yIG1hdHJpeCBwcm9kdWN0CitzdHJ1Y3Qgc2l6ZV90cmlwbGVfdAoreworICB1aW50MTZfdCBrLCBtLCBuOworICBzaXplX3RyaXBsZV90KCkgOiBrKDApLCBtKDApLCBuKDApIHt9CisgIHNpemVfdHJpcGxlX3Qoc2l6ZV90IF9rLCBzaXplX3QgX20sIHNpemVfdCBfbikgOiBrKF9rKSwgbShfbSksIG4oX24pIHt9CisgIHNpemVfdHJpcGxlX3QoY29uc3Qgc2l6ZV90cmlwbGVfdCYgbykgOiBrKG8uayksIG0oby5tKSwgbihvLm4pIHt9CisgIHNpemVfdHJpcGxlX3QodWludDE2X3QgY29tcGFjdCkKKyAgeworICAgIGsgPSAxIDw8ICgoY29tcGFjdCAmIDB4ZjAwKSA+PiA4KTsKKyAgICBtID0gMSA8PCAoKGNvbXBhY3QgJiAweDBmMCkgPj4gNCk7CisgICAgbiA9IDEgPDwgKChjb21wYWN0ICYgMHgwMGYpID4+IDApOworICB9CisgIGJvb2wgaXNfY3ViaWMoKSBjb25zdCB7IHJldHVybiBrID09IG0gJiYgbSA9PSBuOyB9Cit9OworCitvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIHMsIGNvbnN0IHNpemVfdHJpcGxlX3QmIHQpCit7CisgIHJldHVybiBzIDw8ICIoIiA8PCB0LmsgPDwgIiwgIiA8PCB0Lm0gPDwgIiwgIiA8PCB0Lm4gPDwgIikiOworfQorCitzdHJ1Y3QgaW5wdXRmaWxlX2VudHJ5X3QKK3sKKyAgdWludDE2X3QgcHJvZHVjdF9zaXplOworICB1aW50MTZfdCBwb3RfYmxvY2tfc2l6ZTsKKyAgc2l6ZV90cmlwbGVfdCBub25wb3RfYmxvY2tfc2l6ZTsKKyAgZmxvYXQgZ2Zsb3BzOworfTsKKworc3RydWN0IGlucHV0ZmlsZV90Cit7CisgIGVudW0gY2xhc3MgdHlwZV90IHsKKyAgICB1bmtub3duLAorICAgIGFsbF9wb3Rfc2l6ZXMsCisgICAgZGVmYXVsdF9zaXplcworICB9OworCisgIHN0cmluZyBmaWxlbmFtZTsKKyAgdmVjdG9yPGlucHV0ZmlsZV9lbnRyeV90PiBlbnRyaWVzOworICB0eXBlX3QgdHlwZTsKKworICBpbnB1dGZpbGVfdChjb25zdCBzdHJpbmcmIGZuYW1lKQorICAgIDogZmlsZW5hbWUoZm5hbWUpCisgICAgLCB0eXBlKHR5cGVfdDo6dW5rbm93bikKKyAgeworICAgIGlmc3RyZWFtIHN0cmVhbShmaWxlbmFtZSk7CisgICAgaWYgKCFzdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICBjZXJyIDw8ICJjb3VsZG4ndCBvcGVuIGlucHV0IGZpbGU6ICIgPDwgZmlsZW5hbWUgPDwgZW5kbDsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHN0cmluZyBsaW5lOworICAgIHdoaWxlIChnZXRsaW5lKHN0cmVhbSwgbGluZSkpIHsKKyAgICAgIGlmIChsaW5lLmVtcHR5KCkpIGNvbnRpbnVlOworICAgICAgaWYgKGxpbmUuZmluZCgiQkVHSU4gTUVBU1VSRU1FTlRTIEFMTCBQT1QgU0laRVMiKSA9PSAwKSB7CisgICAgICAgIGlmICh0eXBlICE9IHR5cGVfdDo6dW5rbm93bikgeworICAgICAgICAgIGNlcnIgPDwgIklucHV0IGZpbGUgIiA8PCBmaWxlbmFtZSA8PCAiIGNvbnRhaW5zIHJlZHVuZGFudCBCRUdJTiBNRUFTVVJFTUVOVFMgbGluZXMiOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgdHlwZSA9IHR5cGVfdDo6YWxsX3BvdF9zaXplczsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAobGluZS5maW5kKCJCRUdJTiBNRUFTVVJFTUVOVFMgREVGQVVMVCBTSVpFUyIpID09IDApIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gdHlwZV90Ojp1bmtub3duKSB7CisgICAgICAgICAgY2VyciA8PCAiSW5wdXQgZmlsZSAiIDw8IGZpbGVuYW1lIDw8ICIgY29udGFpbnMgcmVkdW5kYW50IEJFR0lOIE1FQVNVUkVNRU5UUyBsaW5lcyI7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICB0eXBlID0gdHlwZV90OjpkZWZhdWx0X3NpemVzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorCisgICAgICBpZiAodHlwZSA9PSB0eXBlX3Q6OnVua25vd24pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIHR5cGVfdDo6YWxsX3BvdF9zaXplczogeworICAgICAgICAgIHVuc2lnbmVkIGludCBwcm9kdWN0X3NpemUsIGJsb2NrX3NpemU7CisgICAgICAgICAgZmxvYXQgZ2Zsb3BzOworICAgICAgICAgIGludCBzc2NhbmZfcmVzdWx0ID0KKyAgICAgICAgICAgIHNzY2FuZihsaW5lLmNfc3RyKCksICIleCAleCAlZiIsCisgICAgICAgICAgICAgICAgICAgJnByb2R1Y3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAmYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAmZ2Zsb3BzKTsKKyAgICAgICAgICBpZiAoMyAhPSBzc2NhbmZfcmVzdWx0IHx8CisgICAgICAgICAgICAgICFwcm9kdWN0X3NpemUgfHwKKyAgICAgICAgICAgICAgcHJvZHVjdF9zaXplID4gMHhmZmYgfHwKKyAgICAgICAgICAgICAgIWJsb2NrX3NpemUgfHwKKyAgICAgICAgICAgICAgYmxvY2tfc2l6ZSA+IDB4ZmZmIHx8CisgICAgICAgICAgICAgICFpc2Zpbml0ZShnZmxvcHMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNlcnIgPDwgImlsbC1mb3JtZWQgaW5wdXQgZmlsZTogIiA8PCBmaWxlbmFtZSA8PCBlbmRsOworICAgICAgICAgICAgY2VyciA8PCAib2ZmZW5kaW5nIGxpbmU6IiA8PCBlbmRsIDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChvbmx5X2N1YmljX3NpemVzICYmICFzaXplX3RyaXBsZV90KHByb2R1Y3Rfc2l6ZSkuaXNfY3ViaWMoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlucHV0ZmlsZV9lbnRyeV90IGVudHJ5OworICAgICAgICAgIGVudHJ5LnByb2R1Y3Rfc2l6ZSA9IHVpbnQxNl90KHByb2R1Y3Rfc2l6ZSk7CisgICAgICAgICAgZW50cnkucG90X2Jsb2NrX3NpemUgPSB1aW50MTZfdChibG9ja19zaXplKTsKKyAgICAgICAgICBlbnRyeS5nZmxvcHMgPSBnZmxvcHM7CisgICAgICAgICAgZW50cmllcy5wdXNoX2JhY2soZW50cnkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgdHlwZV90OjpkZWZhdWx0X3NpemVzOiB7CisgICAgICAgICAgdW5zaWduZWQgaW50IHByb2R1Y3Rfc2l6ZTsKKyAgICAgICAgICBmbG9hdCBnZmxvcHM7CisgICAgICAgICAgaW50IGJrLCBibSwgYm47CisgICAgICAgICAgaW50IHNzY2FuZl9yZXN1bHQgPQorICAgICAgICAgICAgc3NjYW5mKGxpbmUuY19zdHIoKSwgIiV4IGRlZmF1bHQoJWQsICVkLCAlZCkgJWYiLAorICAgICAgICAgICAgICAgICAgICZwcm9kdWN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgJmJrLCAmYm0sICZibiwKKyAgICAgICAgICAgICAgICAgICAmZ2Zsb3BzKTsKKyAgICAgICAgICBpZiAoNSAhPSBzc2NhbmZfcmVzdWx0IHx8CisgICAgICAgICAgICAgICFwcm9kdWN0X3NpemUgfHwKKyAgICAgICAgICAgICAgcHJvZHVjdF9zaXplID4gMHhmZmYgfHwKKyAgICAgICAgICAgICAgIWlzZmluaXRlKGdmbG9wcykpCisgICAgICAgICAgeworICAgICAgICAgICAgY2VyciA8PCAiaWxsLWZvcm1lZCBpbnB1dCBmaWxlOiAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7CisgICAgICAgICAgICBjZXJyIDw8ICJvZmZlbmRpbmcgbGluZToiIDw8IGVuZGwgPDwgbGluZSA8PCBlbmRsOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG9ubHlfY3ViaWNfc2l6ZXMgJiYgIXNpemVfdHJpcGxlX3QocHJvZHVjdF9zaXplKS5pc19jdWJpYygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5wdXRmaWxlX2VudHJ5X3QgZW50cnk7CisgICAgICAgICAgZW50cnkucHJvZHVjdF9zaXplID0gdWludDE2X3QocHJvZHVjdF9zaXplKTsKKyAgICAgICAgICBlbnRyeS5wb3RfYmxvY2tfc2l6ZSA9IDA7CisgICAgICAgICAgZW50cnkubm9ucG90X2Jsb2NrX3NpemUgPSBzaXplX3RyaXBsZV90KGJrLCBibSwgYm4pOworICAgICAgICAgIGVudHJ5LmdmbG9wcyA9IGdmbG9wczsKKyAgICAgICAgICBlbnRyaWVzLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHN0cmVhbS5jbG9zZSgpOworICAgIGlmICh0eXBlID09IHR5cGVfdDo6dW5rbm93bikgeworICAgICAgY2VyciA8PCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgIiA8PCBmaWxlbmFtZSA8PCBlbmRsOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKGVudHJpZXMuZW1wdHkoKSkgeworICAgICAgY2VyciA8PCAiZGlkbid0IGZpbmQgYW55IG1lYXN1cmVtZW50cyBpbiBpbnB1dCBmaWxlOiAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorfTsKKworc3RydWN0IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfZW50cnlfdAoreworICB1aW50MTZfdCBwcm9kdWN0X3NpemU7CisgIHVpbnQxNl90IGJsb2NrX3NpemU7CisKKyAgZmxvYXQgZWZmaWNpZW5jeTsKK307CisKK2Jvb2wgbG93ZXJfZWZmaWNpZW5jeShjb25zdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX2VudHJ5X3QmIGUxLCBjb25zdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX2VudHJ5X3QmIGUyKQoreworICByZXR1cm4gZTEuZWZmaWNpZW5jeSA8IGUyLmVmZmljaWVuY3k7Cit9CisKK3N0cnVjdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3QKK3sKKyAgc3RyaW5nIGZpbGVuYW1lOworICB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV9lbnRyeV90PiBlbnRyaWVzOworCisgIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdChjb25zdCBpbnB1dGZpbGVfdCYgaW5wdXRmaWxlKQorICAgIDogZmlsZW5hbWUoaW5wdXRmaWxlLmZpbGVuYW1lKQorICB7CisgICAgaWYgKGlucHV0ZmlsZS50eXBlICE9IGlucHV0ZmlsZV90Ojp0eXBlX3Q6OmFsbF9wb3Rfc2l6ZXMpIHsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICAgIGF1dG8gaXQgPSBpbnB1dGZpbGUuZW50cmllcy5iZWdpbigpOworICAgIGF1dG8gaXRfZmlyc3Rfd2l0aF9naXZlbl9wcm9kdWN0X3NpemUgPSBpdDsKKyAgICB3aGlsZSAoaXQgIT0gaW5wdXRmaWxlLmVudHJpZXMuZW5kKCkpIHsKKyAgICAgICsraXQ7CisgICAgICBpZiAoaXQgPT0gaW5wdXRmaWxlLmVudHJpZXMuZW5kKCkgfHwKKyAgICAgICAgaXQtPnByb2R1Y3Rfc2l6ZSAhPSBpdF9maXJzdF93aXRoX2dpdmVuX3Byb2R1Y3Rfc2l6ZS0+cHJvZHVjdF9zaXplKQorICAgICAgeworICAgICAgICBpbXBvcnRfaW5wdXRfZmlsZV9yYW5nZV9vbmVfcHJvZHVjdF9zaXplKGl0X2ZpcnN0X3dpdGhfZ2l2ZW5fcHJvZHVjdF9zaXplLCBpdCk7CisgICAgICAgIGl0X2ZpcnN0X3dpdGhfZ2l2ZW5fcHJvZHVjdF9zaXplID0gaXQ7CisgICAgICB9CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW1wb3J0X2lucHV0X2ZpbGVfcmFuZ2Vfb25lX3Byb2R1Y3Rfc2l6ZSgKKyAgICBjb25zdCB2ZWN0b3I8aW5wdXRmaWxlX2VudHJ5X3Q+Ojpjb25zdF9pdGVyYXRvciYgYmVnaW4sCisgICAgY29uc3QgdmVjdG9yPGlucHV0ZmlsZV9lbnRyeV90Pjo6Y29uc3RfaXRlcmF0b3ImIGVuZCkKKyAgeworICAgIHVpbnQxNl90IHByb2R1Y3Rfc2l6ZSA9IGJlZ2luLT5wcm9kdWN0X3NpemU7CisgICAgZmxvYXQgbWF4X2dmbG9wcyA9IDAuMGY7CisgICAgZm9yIChhdXRvIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgaWYgKGl0LT5wcm9kdWN0X3NpemUgIT0gcHJvZHVjdF9zaXplKSB7CisgICAgICAgIGNlcnIgPDwgIlVuZXhwZWN0ZWQgb3JkZXJpbmcgb2YgZW50cmllcyBpbiAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7CisgICAgICAgIGNlcnIgPDwgIihFeHBlY3RlZCBhbGwgZW50cmllcyBmb3IgcHJvZHVjdCBzaXplICIgPDwgaGV4IDw8IHByb2R1Y3Rfc2l6ZSA8PCBkZWMgPDwgIiB0byBiZSBncm91cGVkKSIgPDwgZW5kbDsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIG1heF9nZmxvcHMgPSBtYXgobWF4X2dmbG9wcywgaXQtPmdmbG9wcyk7CisgICAgfQorICAgIGZvciAoYXV0byBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfZW50cnlfdCBlbnRyeTsKKyAgICAgIGVudHJ5LnByb2R1Y3Rfc2l6ZSA9IGl0LT5wcm9kdWN0X3NpemU7CisgICAgICBlbnRyeS5ibG9ja19zaXplID0gaXQtPnBvdF9ibG9ja19zaXplOworICAgICAgZW50cnkuZWZmaWNpZW5jeSA9IGl0LT5nZmxvcHMgLyBtYXhfZ2Zsb3BzOworICAgICAgZW50cmllcy5wdXNoX2JhY2soZW50cnkpOworICAgIH0KKyAgfQorfTsKKwordm9pZCBjaGVja19hbGxfZmlsZXNfaW5fc2FtZV9leGFjdF9vcmRlcigKKyAgICAgICBjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMpCit7CisgIGlmIChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90JiBmaXJzdF9maWxlID0gcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbMF07CisgIGNvbnN0IHNpemVfdCBudW1fZW50cmllcyA9IGZpcnN0X2ZpbGUuZW50cmllcy5zaXplKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcy5zaXplKCk7IGkrKykgeworICAgIGlmIChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlc1tpXS5lbnRyaWVzLnNpemUoKSAhPSBudW1fZW50cmllcykgeworICAgICAgY2VyciA8PCAidGhlc2UgZmlsZXMgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXM6ICIKKyAgICAgICAgICAgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbaV0uZmlsZW5hbWUKKyAgICAgICAgICAgPDwgIiBhbmQgIgorICAgICAgICAgICA8PCBmaXJzdF9maWxlLmZpbGVuYW1lCisgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorCisgIGZvciAoc2l6ZV90IGVudHJ5X2luZGV4ID0gMDsgZW50cnlfaW5kZXggPCBudW1fZW50cmllczsgZW50cnlfaW5kZXgrKykgeworICAgIGNvbnN0IHVpbnQxNl90IGVudHJ5X3Byb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1tlbnRyeV9pbmRleF0ucHJvZHVjdF9zaXplOworICAgIGNvbnN0IHVpbnQxNl90IGVudHJ5X2Jsb2NrX3NpemUgPSBmaXJzdF9maWxlLmVudHJpZXNbZW50cnlfaW5kZXhdLmJsb2NrX3NpemU7CisgICAgZm9yIChzaXplX3QgZmlsZV9pbmRleCA9IDA7IGZpbGVfaW5kZXggPCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcy5zaXplKCk7IGZpbGVfaW5kZXgrKykgeworICAgICAgY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90JiBjdXJfZmlsZSA9IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzW2ZpbGVfaW5kZXhdOworICAgICAgaWYgKGN1cl9maWxlLmVudHJpZXNbZW50cnlfaW5kZXhdLnByb2R1Y3Rfc2l6ZSAhPSBlbnRyeV9wcm9kdWN0X3NpemUgfHwKKyAgICAgICAgICBjdXJfZmlsZS5lbnRyaWVzW2VudHJ5X2luZGV4XS5ibG9ja19zaXplICE9IGVudHJ5X2Jsb2NrX3NpemUpCisgICAgICB7CisgICAgICAgIGNlcnIgPDwgImVudHJpZXMgbm90IGluIHNhbWUgb3JkZXIgYmV0d2VlbiB0aGVzZSBmaWxlczogIgorICAgICAgICAgICAgIDw8IGZpcnN0X2ZpbGUuZmlsZW5hbWUKKyAgICAgICAgICAgICA8PCAiIGFuZCAiCisgICAgICAgICAgICAgPDwgY3VyX2ZpbGUuZmlsZW5hbWUKKyAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitmbG9hdCBlZmZpY2llbmN5X29mX3N1YnNldCgKKyAgICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAorICAgICAgICBjb25zdCB2ZWN0b3I8c2l6ZV90PiYgc3Vic2V0KQoreworICBpZiAoc3Vic2V0LnNpemUoKSA8PSAxKSB7CisgICAgcmV0dXJuIDEuMGY7CisgIH0KKyAgY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90JiBmaXJzdF9maWxlID0gcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbc3Vic2V0WzBdXTsKKyAgY29uc3Qgc2l6ZV90IG51bV9lbnRyaWVzID0gZmlyc3RfZmlsZS5lbnRyaWVzLnNpemUoKTsKKyAgZmxvYXQgZWZmaWNpZW5jeSA9IDEuMGY7CisgIHNpemVfdCBlbnRyeV9pbmRleCA9IDA7CisgIHNpemVfdCBmaXJzdF9lbnRyeV9pbmRleF93aXRoX3RoaXNfcHJvZHVjdF9zaXplID0gMDsKKyAgdWludDE2X3QgcHJvZHVjdF9zaXplID0gZmlyc3RfZmlsZS5lbnRyaWVzWzBdLnByb2R1Y3Rfc2l6ZTsKKyAgd2hpbGUgKGVudHJ5X2luZGV4IDwgbnVtX2VudHJpZXMpIHsKKyAgICArK2VudHJ5X2luZGV4OworICAgIGlmIChlbnRyeV9pbmRleCA9PSBudW1fZW50cmllcyB8fAorICAgICAgICBmaXJzdF9maWxlLmVudHJpZXNbZW50cnlfaW5kZXhdLnByb2R1Y3Rfc2l6ZSAhPSBwcm9kdWN0X3NpemUpCisgICAgeworICAgICAgZmxvYXQgZWZmaWNpZW5jeV90aGlzX3Byb2R1Y3Rfc2l6ZSA9IDAuMGY7CisgICAgICBmb3IgKHNpemVfdCBlID0gZmlyc3RfZW50cnlfaW5kZXhfd2l0aF90aGlzX3Byb2R1Y3Rfc2l6ZTsgZSA8IGVudHJ5X2luZGV4OyBlKyspIHsKKyAgICAgICAgZmxvYXQgZWZmaWNpZW5jeV90aGlzX2VudHJ5ID0gMS4wZjsKKyAgICAgICAgZm9yIChhdXRvIGkgPSBzdWJzZXQuYmVnaW4oKTsgaSAhPSBzdWJzZXQuZW5kKCk7ICsraSkgeworICAgICAgICAgIGVmZmljaWVuY3lfdGhpc19lbnRyeSA9IG1pbihlZmZpY2llbmN5X3RoaXNfZW50cnksIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzWyppXS5lbnRyaWVzW2VdLmVmZmljaWVuY3kpOworICAgICAgICB9CisgICAgICAgIGVmZmljaWVuY3lfdGhpc19wcm9kdWN0X3NpemUgPSBtYXgoZWZmaWNpZW5jeV90aGlzX3Byb2R1Y3Rfc2l6ZSwgZWZmaWNpZW5jeV90aGlzX2VudHJ5KTsKKyAgICAgIH0KKyAgICAgIGVmZmljaWVuY3kgPSBtaW4oZWZmaWNpZW5jeSwgZWZmaWNpZW5jeV90aGlzX3Byb2R1Y3Rfc2l6ZSk7CisgICAgICBpZiAoZW50cnlfaW5kZXggPCBudW1fZW50cmllcykgeworICAgICAgICBmaXJzdF9lbnRyeV9pbmRleF93aXRoX3RoaXNfcHJvZHVjdF9zaXplID0gZW50cnlfaW5kZXg7CisgICAgICAgIHByb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1tlbnRyeV9pbmRleF0ucHJvZHVjdF9zaXplOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBlZmZpY2llbmN5OworfQorCit2b2lkIGR1bXBfdGFibGVfZm9yX3N1YnNldCgKKyAgICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAorICAgICAgICBjb25zdCB2ZWN0b3I8c2l6ZV90PiYgc3Vic2V0KQoreworICBjb25zdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3QmIGZpcnN0X2ZpbGUgPSBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlc1tzdWJzZXRbMF1dOworICBjb25zdCBzaXplX3QgbnVtX2VudHJpZXMgPSBmaXJzdF9maWxlLmVudHJpZXMuc2l6ZSgpOworICBzaXplX3QgZW50cnlfaW5kZXggPSAwOworICBzaXplX3QgZmlyc3RfZW50cnlfaW5kZXhfd2l0aF90aGlzX3Byb2R1Y3Rfc2l6ZSA9IDA7CisgIHVpbnQxNl90IHByb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1swXS5wcm9kdWN0X3NpemU7CisgIHNpemVfdCBpID0gMDsKKyAgc2l6ZV90cmlwbGVfdCBtaW5fcHJvZHVjdF9zaXplKGZpcnN0X2ZpbGUuZW50cmllcy5mcm9udCgpLnByb2R1Y3Rfc2l6ZSk7CisgIHNpemVfdHJpcGxlX3QgbWF4X3Byb2R1Y3Rfc2l6ZShmaXJzdF9maWxlLmVudHJpZXMuYmFjaygpLnByb2R1Y3Rfc2l6ZSk7CisgIGlmICghbWluX3Byb2R1Y3Rfc2l6ZS5pc19jdWJpYygpIHx8ICFtYXhfcHJvZHVjdF9zaXplLmlzX2N1YmljKCkpIHsKKyAgICBhYm9ydCgpOworICB9CisgIGlmIChvbmx5X2N1YmljX3NpemVzKSB7CisgICAgY2VyciA8PCAiQ2FuJ3QgZ2VuZXJhdGUgdGFibGVzIHdpdGggLS1vbmx5LWN1YmljLXNpemVzLiIgPDwgZW5kbDsKKyAgICBhYm9ydCgpOworICB9CisgIGNvdXQgPDwgInN0cnVjdCBMb29rdXBUYWJsZSB7IiA8PCBlbmRsOworICBjb3V0IDw8ICIgIHN0YXRpYyBjb25zdCBzaXplX3QgQmFzZVNpemUgPSAiIDw8IG1pbl9wcm9kdWN0X3NpemUuayA8PCAiOyIgPDwgZW5kbDsKKyAgY29uc3Qgc2l6ZV90IE51bVNpemVzID0gbG9nMl9wb3QobWF4X3Byb2R1Y3Rfc2l6ZS5rIC8gbWluX3Byb2R1Y3Rfc2l6ZS5rKSArIDE7CisgIGNvbnN0IHNpemVfdCBUYWJsZVNpemUgPSBOdW1TaXplcyAqIE51bVNpemVzICogTnVtU2l6ZXM7CisgIGNvdXQgPDwgIiAgc3RhdGljIGNvbnN0IHNpemVfdCBOdW1TaXplcyA9ICIgPDwgTnVtU2l6ZXMgPDwgIjsiIDw8IGVuZGw7CisgIGNvdXQgPDwgIiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBEYXRhKCkgeyIgPDwgZW5kbDsKKyAgY291dCA8PCAiICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYXRhWyIgPDwgVGFibGVTaXplIDw8ICJdID0geyI7CisgIHdoaWxlIChlbnRyeV9pbmRleCA8IG51bV9lbnRyaWVzKSB7CisgICAgKytlbnRyeV9pbmRleDsKKyAgICBpZiAoZW50cnlfaW5kZXggPT0gbnVtX2VudHJpZXMgfHwKKyAgICAgICAgZmlyc3RfZmlsZS5lbnRyaWVzW2VudHJ5X2luZGV4XS5wcm9kdWN0X3NpemUgIT0gcHJvZHVjdF9zaXplKQorICAgIHsKKyAgICAgIGZsb2F0IGJlc3RfZWZmaWNpZW5jeV90aGlzX3Byb2R1Y3Rfc2l6ZSA9IDAuMGY7CisgICAgICB1aW50MTZfdCBiZXN0X2Jsb2NrX3NpemVfdGhpc19wcm9kdWN0X3NpemUgPSAwOworICAgICAgZm9yIChzaXplX3QgZSA9IGZpcnN0X2VudHJ5X2luZGV4X3dpdGhfdGhpc19wcm9kdWN0X3NpemU7IGUgPCBlbnRyeV9pbmRleDsgZSsrKSB7CisgICAgICAgIGZsb2F0IGVmZmljaWVuY3lfdGhpc19lbnRyeSA9IDEuMGY7CisgICAgICAgIGZvciAoYXV0byBpID0gc3Vic2V0LmJlZ2luKCk7IGkgIT0gc3Vic2V0LmVuZCgpOyArK2kpIHsKKyAgICAgICAgICBlZmZpY2llbmN5X3RoaXNfZW50cnkgPSBtaW4oZWZmaWNpZW5jeV90aGlzX2VudHJ5LCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlc1sqaV0uZW50cmllc1tlXS5lZmZpY2llbmN5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWZmaWNpZW5jeV90aGlzX2VudHJ5ID4gYmVzdF9lZmZpY2llbmN5X3RoaXNfcHJvZHVjdF9zaXplKSB7CisgICAgICAgICAgYmVzdF9lZmZpY2llbmN5X3RoaXNfcHJvZHVjdF9zaXplID0gZWZmaWNpZW5jeV90aGlzX2VudHJ5OworICAgICAgICAgIGJlc3RfYmxvY2tfc2l6ZV90aGlzX3Byb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1tlXS5ibG9ja19zaXplOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKGkrKykgJSBOdW1TaXplcykgeworICAgICAgICBjb3V0IDw8ICIgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvdXQgPDwgZW5kbCA8PCAiICAgICAgIjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIjB4IiA8PCBoZXggPDwgYmVzdF9ibG9ja19zaXplX3RoaXNfcHJvZHVjdF9zaXplIDw8IGRlYzsKKyAgICAgIGlmIChlbnRyeV9pbmRleCA8IG51bV9lbnRyaWVzKSB7CisgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICBmaXJzdF9lbnRyeV9pbmRleF93aXRoX3RoaXNfcHJvZHVjdF9zaXplID0gZW50cnlfaW5kZXg7CisgICAgICAgIHByb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1tlbnRyeV9pbmRleF0ucHJvZHVjdF9zaXplOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoaSAhPSBUYWJsZVNpemUpIHsKKyAgICBjZXJyIDw8IGVuZGwgPDwgIldyb3RlICIgPDwgaSA8PCAiIHRhYmxlIGVudHJpZXMsIGV4cGVjdGVkICIgPDwgVGFibGVTaXplIDw8IGVuZGw7CisgICAgYWJvcnQoKTsKKyAgfQorICBjb3V0IDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbDsKKyAgY291dCA8PCAiICAgIHJldHVybiBkYXRhOyIgPDwgZW5kbDsKKyAgY291dCA8PCAiICB9IiA8PCBlbmRsOworICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKK30KKworZmxvYXQgZWZmaWNpZW5jeV9vZl9wYXJ0aXRpb24oCisgICAgICAgIGNvbnN0IHZlY3RvcjxwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3Q+JiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywKKyAgICAgICAgY29uc3QgdmVjdG9yPHZlY3RvcjxzaXplX3Q+PiYgcGFydGl0aW9uKQoreworICBmbG9hdCBlZmZpY2llbmN5ID0gMS4wZjsKKyAgZm9yIChhdXRvIHMgPSBwYXJ0aXRpb24uYmVnaW4oKTsgcyAhPSBwYXJ0aXRpb24uZW5kKCk7ICsrcykgeworICAgIGVmZmljaWVuY3kgPSBtaW4oZWZmaWNpZW5jeSwgZWZmaWNpZW5jeV9vZl9zdWJzZXQocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsICpzKSk7CisgIH0KKyAgcmV0dXJuIGVmZmljaWVuY3k7Cit9CisKK3ZvaWQgbWFrZV9maXJzdF9zdWJzZXQoc2l6ZV90IHN1YnNldF9zaXplLCB2ZWN0b3I8c2l6ZV90PiYgb3V0X3N1YnNldCwgc2l6ZV90IHNldF9zaXplKQoreworICBhc3NlcnQoc3Vic2V0X3NpemUgPj0gMSAmJiBzdWJzZXRfc2l6ZSA8PSBzZXRfc2l6ZSk7CisgIG91dF9zdWJzZXQucmVzaXplKHN1YnNldF9zaXplKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJzZXRfc2l6ZTsgaSsrKSB7CisgICAgb3V0X3N1YnNldFtpXSA9IGk7CisgIH0KK30KKworYm9vbCBpc19sYXN0X3N1YnNldChjb25zdCB2ZWN0b3I8c2l6ZV90PiYgc3Vic2V0LCBzaXplX3Qgc2V0X3NpemUpCit7CisgIHJldHVybiBzdWJzZXRbMF0gPT0gc2V0X3NpemUgLSBzdWJzZXQuc2l6ZSgpOworfQorCit2b2lkIG5leHRfc3Vic2V0KHZlY3RvcjxzaXplX3Q+JiBpbm91dF9zdWJzZXQsIHNpemVfdCBzZXRfc2l6ZSkKK3sKKyAgaWYgKGlzX2xhc3Rfc3Vic2V0KGlub3V0X3N1YnNldCwgc2V0X3NpemUpKSB7CisgICAgY2VyciA8PCAiaXRlcmF0aW5nIHBhc3QgdGhlIGxhc3Qgc3Vic2V0IiA8PCBlbmRsOworICAgIGFib3J0KCk7CisgIH0KKyAgc2l6ZV90IGkgPSAxOworICB3aGlsZSAoaW5vdXRfc3Vic2V0W2lub3V0X3N1YnNldC5zaXplKCkgLSBpXSA9PSBzZXRfc2l6ZSAtIGkpIHsKKyAgICBpKys7CisgICAgYXNzZXJ0KGkgPD0gaW5vdXRfc3Vic2V0LnNpemUoKSk7CisgIH0KKyAgc2l6ZV90IGZpcnN0X2luZGV4X3RvX2NoYW5nZSA9IGlub3V0X3N1YnNldC5zaXplKCkgLSBpOworICBpbm91dF9zdWJzZXRbZmlyc3RfaW5kZXhfdG9fY2hhbmdlXSsrOworICBzaXplX3QgcCA9IGlub3V0X3N1YnNldFtmaXJzdF9pbmRleF90b19jaGFuZ2VdOworICBmb3IgKHNpemVfdCBqID0gZmlyc3RfaW5kZXhfdG9fY2hhbmdlICsgMTsgaiA8IGlub3V0X3N1YnNldC5zaXplKCk7IGorKykgeworICAgIGlub3V0X3N1YnNldFtqXSA9ICsrcDsKKyAgfQorfQorCitjb25zdCBzaXplX3QgbnVtYmVyX29mX3N1YnNldHNfbGltaXQgPSAxMDA7Citjb25zdCBzaXplX3QgYWx3YXlzX3NlYXJjaF9zdWJzZXRzX29mX3NpemVfYXRfbGVhc3QgPSAyOworCitib29sIGlzX251bWJlcl9vZl9zdWJzZXRzX2ZlYXNpYmxlKHNpemVfdCBuLCBzaXplX3QgcCkKK3sgCisgIGFzc2VydChuPjAgJiYgcD4wICYmIHA8PW4pOworICB1aW50NjRfdCBudW1lcmF0b3IgPSAxLCBkZW5vbWluYXRvciA9IDE7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcDsgaSsrKSB7CisgICAgbnVtZXJhdG9yICo9IG4gLSBpOworICAgIGRlbm9taW5hdG9yICo9IGkgKyAxOworICAgIGlmIChudW1lcmF0b3IgPiBkZW5vbWluYXRvciAqIG51bWJlcl9vZl9zdWJzZXRzX2xpbWl0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgbWF4X2ZlYXNpYmxlX3N1YnNldF9zaXplKHNpemVfdCBuKQoreworICBhc3NlcnQobiA+IDApOworICBjb25zdCBzaXplX3QgbWlucmVzdWx0ID0gbWluPHNpemVfdD4obi0xLCBhbHdheXNfc2VhcmNoX3N1YnNldHNfb2Zfc2l6ZV9hdF9sZWFzdCk7CisgIGZvciAoc2l6ZV90IHAgPSAxOyBwIDw9IG4gLSAxOyBwKyspIHsKKyAgICBpZiAoIWlzX251bWJlcl9vZl9zdWJzZXRzX2ZlYXNpYmxlKG4sIHArMSkpIHsKKyAgICAgIHJldHVybiBtYXgocCwgbWlucmVzdWx0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG4gLSAxOworfQorCit2b2lkIGZpbmRfc3Vic2V0X3dpdGhfZWZmaWNpZW5jeV9oaWdoZXJfdGhhbigKKyAgICAgICBjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICAgZmxvYXQgcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0LAorICAgICAgIHZlY3RvcjxzaXplX3Q+JiBpbm91dF9yZW1haW5kZXIsCisgICAgICAgdmVjdG9yPHNpemVfdD4mIG91dF9zdWJzZXQpCit7CisgIG91dF9zdWJzZXQucmVzaXplKDApOworCisgIGlmIChyZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQgPj0gMS4wZikgeworICAgIGNlcnIgPDwgImNhbid0IGJlYXQgZWZmaWNpZW5jeSAxLiIgPDwgZW5kbDsKKyAgICBhYm9ydCgpOworICB9CisKKyAgd2hpbGUgKCFpbm91dF9yZW1haW5kZXIuZW1wdHkoKSkgeworCisgICAgdmVjdG9yPHNpemVfdD4gY2FuZGlkYXRlX2luZGljZXMoaW5vdXRfcmVtYWluZGVyLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW5kaWRhdGVfaW5kaWNlcy5zaXplKCk7IGkrKykgeworICAgICAgY2FuZGlkYXRlX2luZGljZXNbaV0gPSBpOworICAgIH0KKworICAgIHNpemVfdCBjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXRfc2l6ZSA9IG1heF9mZWFzaWJsZV9zdWJzZXRfc2l6ZShjYW5kaWRhdGVfaW5kaWNlcy5zaXplKCkpOworICAgIHdoaWxlIChjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXRfc2l6ZSA+PSAxKSB7CisgICAgICB2ZWN0b3I8c2l6ZV90PiBjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQ7CisgICAgICBtYWtlX2ZpcnN0X3N1YnNldChjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRpY2VzLnNpemUoKSk7CisKKyAgICAgIHZlY3RvcjxzaXplX3Q+IGJlc3RfY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0OworICAgICAgZmxvYXQgYmVzdF9lZmZpY2llbmN5ID0gMC4wZjsKKyAgICAgIHZlY3RvcjxzaXplX3Q+IHRyaWFsX3N1YnNldCA9IG91dF9zdWJzZXQ7CisgICAgICB0cmlhbF9zdWJzZXQucmVzaXplKG91dF9zdWJzZXQuc2l6ZSgpICsgY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0X3NpemUpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0X3NpemU7IGkrKykgeworICAgICAgICAgIHRyaWFsX3N1YnNldFtvdXRfc3Vic2V0LnNpemUoKSArIGldID0gaW5vdXRfcmVtYWluZGVyW2NhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldFtpXV07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZsb2F0IHRyaWFsX2VmZmljaWVuY3kgPSBlZmZpY2llbmN5X29mX3N1YnNldChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywgdHJpYWxfc3Vic2V0KTsKKyAgICAgICAgaWYgKHRyaWFsX2VmZmljaWVuY3kgPiBiZXN0X2VmZmljaWVuY3kpIHsKKyAgICAgICAgICBiZXN0X2VmZmljaWVuY3kgPSB0cmlhbF9lZmZpY2llbmN5OworICAgICAgICAgIGJlc3RfY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0ID0gY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0OworICAgICAgICB9CisgICAgICAgIGlmIChpc19sYXN0X3N1YnNldChjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQsIGNhbmRpZGF0ZV9pbmRpY2VzLnNpemUoKSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuZXh0X3N1YnNldChjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQsIGNhbmRpZGF0ZV9pbmRpY2VzLnNpemUoKSk7CisgICAgICB9CisgICAgICAgCisgICAgICBpZiAoYmVzdF9lZmZpY2llbmN5ID4gcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmVzdF9jYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBjYW5kaWRhdGVfaW5kaWNlc1tpXSA9IGNhbmRpZGF0ZV9pbmRpY2VzW2Jlc3RfY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0W2ldXTsKKyAgICAgICAgfQorICAgICAgICBjYW5kaWRhdGVfaW5kaWNlcy5yZXNpemUoYmVzdF9jYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQuc2l6ZSgpKTsKKyAgICAgIH0KKyAgICAgIGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplLS07CisgICAgfQorICAgICAgCisgICAgc2l6ZV90IGNhbmRpZGF0ZV9pbmRleCA9IGNhbmRpZGF0ZV9pbmRpY2VzWzBdOworICAgIGF1dG8gY2FuZGlkYXRlX2l0ZXJhdG9yID0gaW5vdXRfcmVtYWluZGVyLmJlZ2luKCkgKyBjYW5kaWRhdGVfaW5kZXg7CisgICAgdmVjdG9yPHNpemVfdD4gdHJpYWxfc3Vic2V0ID0gb3V0X3N1YnNldDsKKworICAgIHRyaWFsX3N1YnNldC5wdXNoX2JhY2soKmNhbmRpZGF0ZV9pdGVyYXRvcik7CisgICAgZmxvYXQgdHJpYWxfZWZmaWNpZW5jeSA9IGVmZmljaWVuY3lfb2Zfc3Vic2V0KHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCB0cmlhbF9zdWJzZXQpOworICAgIGlmICh0cmlhbF9lZmZpY2llbmN5ID4gcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0KSB7CisgICAgICBvdXRfc3Vic2V0LnB1c2hfYmFjaygqY2FuZGlkYXRlX2l0ZXJhdG9yKTsKKyAgICAgIGlub3V0X3JlbWFpbmRlci5lcmFzZShjYW5kaWRhdGVfaXRlcmF0b3IpOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBmaW5kX3BhcnRpdGlvbl93aXRoX2VmZmljaWVuY3lfaGlnaGVyX3RoYW4oCisgICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAorICAgICAgIGZsb2F0IHJlcXVpcmVkX2VmZmljaWVuY3lfdG9fYmVhdCwKKyAgICAgICB2ZWN0b3I8dmVjdG9yPHNpemVfdD4+JiBvdXRfcGFydGl0aW9uKQoreworICBvdXRfcGFydGl0aW9uLnJlc2l6ZSgwKTsKKworICB2ZWN0b3I8c2l6ZV90PiByZW1haW5kZXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICByZW1haW5kZXIucHVzaF9iYWNrKGkpOworICB9CisKKyAgd2hpbGUgKCFyZW1haW5kZXIuZW1wdHkoKSkgeworICAgIHZlY3RvcjxzaXplX3Q+IG5ld19zdWJzZXQ7CisgICAgZmluZF9zdWJzZXRfd2l0aF9lZmZpY2llbmN5X2hpZ2hlcl90aGFuKAorICAgICAgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQsCisgICAgICByZW1haW5kZXIsCisgICAgICBuZXdfc3Vic2V0KTsKKyAgICBvdXRfcGFydGl0aW9uLnB1c2hfYmFjayhuZXdfc3Vic2V0KTsKKyAgfQorfQorCit2b2lkIHByaW50X3BhcnRpdGlvbigKKyAgICAgICBjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICAgY29uc3QgdmVjdG9yPHZlY3RvcjxzaXplX3Q+PiYgcGFydGl0aW9uKQoreworICBmbG9hdCBlZmZpY2llbmN5ID0gZWZmaWNpZW5jeV9vZl9wYXJ0aXRpb24ocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsIHBhcnRpdGlvbik7CisgIGNvdXQgPDwgIlBhcnRpdGlvbiBpbnRvICIgPDwgcGFydGl0aW9uLnNpemUoKSA8PCAiIHN1YnNldHMgZm9yICIgPDwgZWZmaWNpZW5jeSAqIDEwMC4wZiA8PCAiJSBlZmZpY2llbmN5IiAgPDwgZW5kbDsKKyAgZm9yIChhdXRvIHN1YnNldCA9IHBhcnRpdGlvbi5iZWdpbigpOyBzdWJzZXQgIT0gcGFydGl0aW9uLmVuZCgpOyArK3N1YnNldCkgeworICAgIGNvdXQgPDwgIiAgU3Vic2V0ICIgPDwgKHN1YnNldCAtIHBhcnRpdGlvbi5iZWdpbigpKQorICAgICAgICAgPDwgIiwgZWZmaWNpZW5jeSAiIDw8IGVmZmljaWVuY3lfb2Zfc3Vic2V0KHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCAqc3Vic2V0KSAqIDEwMC4wZiA8PCAiJToiCisgICAgICAgICA8PCBlbmRsOworICAgIGZvciAoYXV0byBmaWxlID0gc3Vic2V0LT5iZWdpbigpOyBmaWxlICE9IHN1YnNldC0+ZW5kKCk7ICsrZmlsZSkgeworICAgICAgY291dCA8PCAiICAgICIgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbKmZpbGVdLmZpbGVuYW1lIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChkdW1wX3RhYmxlcykgeworICAgICAgY291dCA8PCAiICBUYWJsZToiIDw8IGVuZGw7CisgICAgICBkdW1wX3RhYmxlX2Zvcl9zdWJzZXQocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsICpzdWJzZXQpOworICAgIH0KKyAgfQorICBjb3V0IDw8IGVuZGw7Cit9CisKK3N0cnVjdCBhY3Rpb25fdAoreworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IHsgYWJvcnQoKTsgcmV0dXJuIG51bGxwdHI7IH0KKyAgdmlydHVhbCB2b2lkIHJ1bihjb25zdCB2ZWN0b3I8c3RyaW5nPiYpIGNvbnN0IHsgYWJvcnQoKTsgfQorICB2aXJ0dWFsIH5hY3Rpb25fdCgpIHt9Cit9OworCitzdHJ1Y3QgcGFydGl0aW9uX2FjdGlvbl90IDogYWN0aW9uX3QKK3sKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBpbnZva2F0aW9uX25hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAicGFydGl0aW9uIjsgfQorICB2aXJ0dWFsIHZvaWQgcnVuKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBpbnB1dF9maWxlbmFtZXMpIGNvbnN0IG92ZXJyaWRlCisgIHsKKyAgICB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlczsKKworICAgIGlmIChpbnB1dF9maWxlbmFtZXMuZW1wdHkoKSkgeworICAgICAgY2VyciA8PCAiVGhlICIgPDwgaW52b2thdGlvbl9uYW1lKCkgPDwgIiBhY3Rpb24gbmVlZHMgYSBsaXN0IG9mIGlucHV0IGZpbGVzLiIgPDwgZW5kbDsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZm9yIChhdXRvIGl0ID0gaW5wdXRfZmlsZW5hbWVzLmJlZ2luKCk7IGl0ICE9IGlucHV0X2ZpbGVuYW1lcy5lbmQoKTsgKytpdCkgeworICAgICAgaW5wdXRmaWxlX3QgaW5wdXRmaWxlKCppdCk7CisgICAgICBzd2l0Y2ggKGlucHV0ZmlsZS50eXBlKSB7CisgICAgICAgIGNhc2UgaW5wdXRmaWxlX3Q6OnR5cGVfdDo6YWxsX3BvdF9zaXplczoKKyAgICAgICAgICBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcy5lbXBsYWNlX2JhY2soaW5wdXRmaWxlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBpbnB1dGZpbGVfdDo6dHlwZV90OjpkZWZhdWx0X3NpemVzOgorICAgICAgICAgIGNlcnIgPDwgIlRoZSAiIDw8IGludm9rYXRpb25fbmFtZSgpIDw8ICIgYWN0aW9uIG9ubHkgdXNlcyBtZWFzdXJlbWVudHMgZm9yIGFsbCBwb3Qgc2l6ZXMsIGFuZCAiCisgICAgICAgICAgICAgICA8PCAiaGFzIG5vIHVzZSBmb3IgIiA8PCAqaXQgPDwgIiB3aGljaCBjb250YWlucyBtZWFzdXJlbWVudHMgZm9yIGRlZmF1bHQgc2l6ZXMuIiA8PCBlbmRsOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2VyciA8PCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGU6ICIgPDwgKml0IDw8IGVuZGw7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja19hbGxfZmlsZXNfaW5fc2FtZV9leGFjdF9vcmRlcihwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcyk7CisKKyAgICBmbG9hdCByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQgPSAwLjBmOworICAgIHZlY3Rvcjx2ZWN0b3I8dmVjdG9yPHNpemVfdD4+PiBwYXJ0aXRpb25zOworICAgIGNlcnIgPDwgInNlYXJjaGluZyBmb3IgcGFydGl0aW9ucy4uLlxyIiA8PCBmbHVzaDsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICB2ZWN0b3I8dmVjdG9yPHNpemVfdD4+IHBhcnRpdGlvbjsKKyAgICAgIGZpbmRfcGFydGl0aW9uX3dpdGhfZWZmaWNpZW5jeV9oaWdoZXJfdGhhbigKKyAgICAgICAgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICAgIHJlcXVpcmVkX2VmZmljaWVuY3lfdG9fYmVhdCwKKyAgICAgICAgcGFydGl0aW9uKTsKKyAgICAgIGZsb2F0IGFjdHVhbF9lZmZpY2llbmN5ID0gZWZmaWNpZW5jeV9vZl9wYXJ0aXRpb24ocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsIHBhcnRpdGlvbik7CisgICAgICBjZXJyIDw8ICJwYXJ0aXRpb24gIiA8PCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcy5zaXplKCkgPDwgIiBmaWxlcyBpbnRvICIgPDwgcGFydGl0aW9uLnNpemUoKQorICAgICAgICAgICA8PCAiIHN1YnNldHMgZm9yICIgPDwgMTAwLjBmICogYWN0dWFsX2VmZmljaWVuY3kKKyAgICAgICAgICAgPDwgIiAlIGVmZmljaWVuY3kiCisgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICBcciIgPDwgZmx1c2g7CisgICAgICBwYXJ0aXRpb25zLnB1c2hfYmFjayhwYXJ0aXRpb24pOworICAgICAgaWYgKHBhcnRpdGlvbi5zaXplKCkgPT0gcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpIHx8IGFjdHVhbF9lZmZpY2llbmN5ID09IDEuMGYpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQgPSBhY3R1YWxfZWZmaWNpZW5jeTsKKyAgICB9CisgICAgY2VyciA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBlbmRsOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBib29sIHJlcGVhdCA9IGZhbHNlOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLnNpemUoKSAtIDE7IGkrKykgeworICAgICAgICBpZiAocGFydGl0aW9uc1tpXS5zaXplKCkgPj0gcGFydGl0aW9uc1tpKzFdLnNpemUoKSkgeworICAgICAgICAgIHBhcnRpdGlvbnMuZXJhc2UocGFydGl0aW9ucy5iZWdpbigpICsgaSk7CisgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFyZXBlYXQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byBpdCA9IHBhcnRpdGlvbnMuYmVnaW4oKTsgaXQgIT0gcGFydGl0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgcHJpbnRfcGFydGl0aW9uKHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCAqaXQpOworICAgIH0KKyAgfQorfTsKKworc3RydWN0IGV2YWx1YXRlX2RlZmF1bHRzX2FjdGlvbl90IDogYWN0aW9uX3QKK3sKKyAgc3RydWN0IHJlc3VsdHNfZW50cnlfdCB7CisgICAgdWludDE2X3QgcHJvZHVjdF9zaXplOworICAgIHNpemVfdHJpcGxlX3QgZGVmYXVsdF9ibG9ja19zaXplOworICAgIHVpbnQxNl90IGJlc3RfcG90X2Jsb2NrX3NpemU7CisgICAgZmxvYXQgZGVmYXVsdF9nZmxvcHM7CisgICAgZmxvYXQgYmVzdF9wb3RfZ2Zsb3BzOworICAgIGZsb2F0IGRlZmF1bHRfZWZmaWNpZW5jeTsKKyAgfTsKKyAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgcywgY29uc3QgcmVzdWx0c19lbnRyeV90JiBlbnRyeSkKKyAgeworICAgIHJldHVybiBzCisgICAgICA8PCAiUHJvZHVjdCBzaXplICIgPDwgc2l6ZV90cmlwbGVfdChlbnRyeS5wcm9kdWN0X3NpemUpCisgICAgICA8PCAiOiBkZWZhdWx0IGJsb2NrIHNpemUgIiA8PCBlbnRyeS5kZWZhdWx0X2Jsb2NrX3NpemUKKyAgICAgIDw8ICIgLT4gIiA8PCBlbnRyeS5kZWZhdWx0X2dmbG9wcworICAgICAgPDwgIiBHRmxvcC9zID0gIiA8PCBlbnRyeS5kZWZhdWx0X2VmZmljaWVuY3kgKiAxMDAuMGYgPDwgIiAlIgorICAgICAgPDwgIiBvZiBiZXN0IFBPVCBibG9jayBzaXplICIgPDwgc2l6ZV90cmlwbGVfdChlbnRyeS5iZXN0X3BvdF9ibG9ja19zaXplKQorICAgICAgPDwgIiAtPiAiIDw8IGVudHJ5LmJlc3RfcG90X2dmbG9wcworICAgICAgPDwgIiBHRmxvcC9zIiA8PCBkZWM7CisgIH0KKyAgc3RhdGljIGJvb2wgbG93ZXJfZWZmaWNpZW5jeShjb25zdCByZXN1bHRzX2VudHJ5X3QmIGUxLCBjb25zdCByZXN1bHRzX2VudHJ5X3QmIGUyKSB7CisgICAgcmV0dXJuIGUxLmRlZmF1bHRfZWZmaWNpZW5jeSA8IGUyLmRlZmF1bHRfZWZmaWNpZW5jeTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJldmFsdWF0ZS1kZWZhdWx0cyI7IH0KKyAgdm9pZCBzaG93X3VzYWdlX2FuZF9leGl0KCkgY29uc3QKKyAgeworICAgIGNlcnIgPDwgInVzYWdlOiAiIDw8IGludm9rYXRpb25fbmFtZSgpIDw8ICIgZGVmYXVsdC1zaXplcy1kYXRhIGFsbC1wb3Qtc2l6ZXMtZGF0YSIgPDwgZW5kbDsKKyAgICBjZXJyIDw8ICJjaGVja3MgaG93IHdlbGwgdGhlIHBlcmZvcm1hbmNlIHdpdGggZGVmYXVsdCBzaXplcyBjb21wYXJlcyB0byB0aGUgYmVzdCAiCisgICAgICAgICA8PCAicGVyZm9ybWFuY2UgbWVhc3VyZWQgb3ZlciBhbGwgUE9UIHNpemVzLiIgPDwgZW5kbDsKKyAgICBleGl0KDEpOworICB9CisgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgdmVjdG9yPHN0cmluZz4mIGlucHV0X2ZpbGVuYW1lcykgY29uc3Qgb3ZlcnJpZGUKKyAgeworICAgIGlmIChpbnB1dF9maWxlbmFtZXMuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHNob3dfdXNhZ2VfYW5kX2V4aXQoKTsKKyAgICB9CisgICAgaW5wdXRmaWxlX3QgaW5wdXRmaWxlX2RlZmF1bHRfc2l6ZXMoaW5wdXRfZmlsZW5hbWVzWzBdKTsKKyAgICBpbnB1dGZpbGVfdCBpbnB1dGZpbGVfYWxsX3BvdF9zaXplcyhpbnB1dF9maWxlbmFtZXNbMV0pOworICAgIGlmIChpbnB1dGZpbGVfZGVmYXVsdF9zaXplcy50eXBlICE9IGlucHV0ZmlsZV90Ojp0eXBlX3Q6OmRlZmF1bHRfc2l6ZXMpIHsKKyAgICAgIGNlcnIgPDwgaW5wdXRmaWxlX2RlZmF1bHRfc2l6ZXMuZmlsZW5hbWUgPDwgIiBpcyBub3QgYW4gaW5wdXQgZmlsZSB3aXRoIGRlZmF1bHQgc2l6ZXMuIiA8PCBlbmRsOworICAgICAgc2hvd191c2FnZV9hbmRfZXhpdCgpOworICAgIH0KKyAgICBpZiAoaW5wdXRmaWxlX2FsbF9wb3Rfc2l6ZXMudHlwZSAhPSBpbnB1dGZpbGVfdDo6dHlwZV90OjphbGxfcG90X3NpemVzKSB7CisgICAgICBjZXJyIDw8IGlucHV0ZmlsZV9hbGxfcG90X3NpemVzLmZpbGVuYW1lIDw8ICIgaXMgbm90IGFuIGlucHV0IGZpbGUgd2l0aCBhbGwgUE9UIHNpemVzLiIgPDwgZW5kbDsKKyAgICAgIHNob3dfdXNhZ2VfYW5kX2V4aXQoKTsKKyAgICB9CisgICAgdmVjdG9yPHJlc3VsdHNfZW50cnlfdD4gcmVzdWx0czsKKyAgICB2ZWN0b3I8cmVzdWx0c19lbnRyeV90PiBjdWJpY19yZXN1bHRzOworICAgIAorICAgIHVpbnQxNl90IHByb2R1Y3Rfc2l6ZSA9IDA7CisgICAgYXV0byBpdF9hbGxfcG90X3NpemVzID0gaW5wdXRmaWxlX2FsbF9wb3Rfc2l6ZXMuZW50cmllcy5iZWdpbigpOworICAgIGZvciAoYXV0byBpdF9kZWZhdWx0X3NpemVzID0gaW5wdXRmaWxlX2RlZmF1bHRfc2l6ZXMuZW50cmllcy5iZWdpbigpOworICAgICAgICAgaXRfZGVmYXVsdF9zaXplcyAhPSBpbnB1dGZpbGVfZGVmYXVsdF9zaXplcy5lbnRyaWVzLmVuZCgpOworICAgICAgICAgKytpdF9kZWZhdWx0X3NpemVzKQorICAgIHsKKyAgICAgIGlmIChpdF9kZWZhdWx0X3NpemVzLT5wcm9kdWN0X3NpemUgPT0gcHJvZHVjdF9zaXplKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcHJvZHVjdF9zaXplID0gaXRfZGVmYXVsdF9zaXplcy0+cHJvZHVjdF9zaXplOworICAgICAgd2hpbGUgKGl0X2FsbF9wb3Rfc2l6ZXMgIT0gaW5wdXRmaWxlX2FsbF9wb3Rfc2l6ZXMuZW50cmllcy5lbmQoKSAmJgorICAgICAgICAgICAgIGl0X2FsbF9wb3Rfc2l6ZXMtPnByb2R1Y3Rfc2l6ZSAhPSBwcm9kdWN0X3NpemUpCisgICAgICB7CisgICAgICAgICsraXRfYWxsX3BvdF9zaXplczsKKyAgICAgIH0KKyAgICAgIGlmIChpdF9hbGxfcG90X3NpemVzID09IGlucHV0ZmlsZV9hbGxfcG90X3NpemVzLmVudHJpZXMuZW5kKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB1aW50MTZfdCBiZXN0X3BvdF9ibG9ja19zaXplID0gMDsKKyAgICAgIGZsb2F0IGJlc3RfcG90X2dmbG9wcyA9IDA7CisgICAgICBmb3IgKGF1dG8gaXQgPSBpdF9hbGxfcG90X3NpemVzOworICAgICAgICAgICBpdCAhPSBpbnB1dGZpbGVfYWxsX3BvdF9zaXplcy5lbnRyaWVzLmVuZCgpICYmIGl0LT5wcm9kdWN0X3NpemUgPT0gcHJvZHVjdF9zaXplOworICAgICAgICAgICArK2l0KQorICAgICAgeworICAgICAgICBpZiAoaXQtPmdmbG9wcyA+IGJlc3RfcG90X2dmbG9wcykgeworICAgICAgICAgIGJlc3RfcG90X2dmbG9wcyA9IGl0LT5nZmxvcHM7CisgICAgICAgICAgYmVzdF9wb3RfYmxvY2tfc2l6ZSA9IGl0LT5wb3RfYmxvY2tfc2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzdWx0c19lbnRyeV90IGVudHJ5OworICAgICAgZW50cnkucHJvZHVjdF9zaXplID0gcHJvZHVjdF9zaXplOworICAgICAgZW50cnkuZGVmYXVsdF9ibG9ja19zaXplID0gaXRfZGVmYXVsdF9zaXplcy0+bm9ucG90X2Jsb2NrX3NpemU7CisgICAgICBlbnRyeS5iZXN0X3BvdF9ibG9ja19zaXplID0gYmVzdF9wb3RfYmxvY2tfc2l6ZTsKKyAgICAgIGVudHJ5LmRlZmF1bHRfZ2Zsb3BzID0gaXRfZGVmYXVsdF9zaXplcy0+Z2Zsb3BzOworICAgICAgZW50cnkuYmVzdF9wb3RfZ2Zsb3BzID0gYmVzdF9wb3RfZ2Zsb3BzOworICAgICAgZW50cnkuZGVmYXVsdF9lZmZpY2llbmN5ID0gZW50cnkuZGVmYXVsdF9nZmxvcHMgLyBlbnRyeS5iZXN0X3BvdF9nZmxvcHM7CisgICAgICByZXN1bHRzLnB1c2hfYmFjayhlbnRyeSk7CisKKyAgICAgIHNpemVfdHJpcGxlX3QgdChwcm9kdWN0X3NpemUpOworICAgICAgaWYgKHQuayA9PSB0Lm0gJiYgdC5tID09IHQubikgeworICAgICAgICBjdWJpY19yZXN1bHRzLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICB9CisgICAgfQorCisgICAgY291dCA8PCAiQWxsIHJlc3VsdHM6IiA8PCBlbmRsOworICAgIGZvciAoYXV0byBpdCA9IHJlc3VsdHMuYmVnaW4oKTsgaXQgIT0gcmVzdWx0cy5lbmQoKTsgKytpdCkgeworICAgICAgY291dCA8PCAqaXQgPDwgZW5kbDsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworCisgICAgc29ydChyZXN1bHRzLmJlZ2luKCksIHJlc3VsdHMuZW5kKCksIGxvd2VyX2VmZmljaWVuY3kpOworICAgIAorICAgIGNvbnN0IHNpemVfdCBuID0gbWluPHNpemVfdD4oMjAsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICBjb3V0IDw8IG4gPDwgIiB3b3JzdCByZXN1bHRzOiIgPDwgZW5kbDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgY291dCA8PCByZXN1bHRzW2ldIDw8IGVuZGw7CisgICAgfQorICAgIGNvdXQgPDwgZW5kbDsKKworICAgIGNvdXQgPDwgImN1YmljIHJlc3VsdHM6IiA8PCBlbmRsOworICAgIGZvciAoYXV0byBpdCA9IGN1YmljX3Jlc3VsdHMuYmVnaW4oKTsgaXQgIT0gY3ViaWNfcmVzdWx0cy5lbmQoKTsgKytpdCkgeworICAgICAgY291dCA8PCAqaXQgPDwgZW5kbDsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworCisgICAgc29ydChjdWJpY19yZXN1bHRzLmJlZ2luKCksIGN1YmljX3Jlc3VsdHMuZW5kKCksIGxvd2VyX2VmZmljaWVuY3kpOworICAgIAorICAgIGNvdXQucHJlY2lzaW9uKDIpOworICAgIHZlY3RvcjxmbG9hdD4gYSA9IHswLjVmLCAwLjIwZiwgMC4xMGYsIDAuMDVmLCAwLjAyZiwgMC4wMWZ9OworICAgIGZvciAoYXV0byBpdCA9IGEuYmVnaW4oKTsgaXQgIT0gYS5lbmQoKTsgKytpdCkgeworICAgICAgc2l6ZV90IG4gPSBtaW4ocmVzdWx0cy5zaXplKCkgLSAxLCBzaXplX3QoKml0ICogcmVzdWx0cy5zaXplKCkpKTsKKyAgICAgIGNvdXQgPDwgKDEwMC4wZiAqIG4gLyAocmVzdWx0cy5zaXplKCkgLSAxKSkKKyAgICAgICAgICAgPDwgIiAlIG9mIHByb2R1Y3Qgc2l6ZXMgaGF2ZSBkZWZhdWx0IGVmZmljaWVuY3kgPD0gIgorICAgICAgICAgICA8PCAxMDAuMGYgKiByZXN1bHRzW25dLmRlZmF1bHRfZWZmaWNpZW5jeSA8PCAiICUiIDw8IGVuZGw7CisgICAgfQorICAgIGNvdXQucHJlY2lzaW9uKGRlZmF1bHRfcHJlY2lzaW9uKTsKKyAgfQorfTsKKworCit2b2lkIHNob3dfdXNhZ2VfYW5kX2V4aXQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dW5pcXVlX3B0cjxhY3Rpb25fdD4+JiBhdmFpbGFibGVfYWN0aW9ucykKK3sKKyAgY2VyciA8PCAidXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIDxhY3Rpb24+IFtvcHRpb25zLi4uXSA8aW5wdXQgZmlsZXMuLi4+IiA8PCBlbmRsOworICBjZXJyIDw8ICJhdmFpbGFibGUgYWN0aW9uczoiIDw8IGVuZGw7CisgIGZvciAoYXV0byBpdCA9IGF2YWlsYWJsZV9hY3Rpb25zLmJlZ2luKCk7IGl0ICE9IGF2YWlsYWJsZV9hY3Rpb25zLmVuZCgpOyArK2l0KSB7CisgICAgY2VyciA8PCAiICAiIDw8ICgqaXQpLT5pbnZva2F0aW9uX25hbWUoKSA8PCBlbmRsOworICB9IAorICBjZXJyIDw8ICJ0aGUgaW5wdXQgZmlsZXMgc2hvdWxkIGVhY2ggY29udGFpbiBhbiBvdXRwdXQgb2YgYmVuY2htYXJrLWJsb2NraW5nLXNpemVzIiA8PCBlbmRsOworICBleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICBjb3V0LnByZWNpc2lvbihkZWZhdWx0X3ByZWNpc2lvbik7CisgIGNlcnIucHJlY2lzaW9uKGRlZmF1bHRfcHJlY2lzaW9uKTsKKworICB2ZWN0b3I8dW5pcXVlX3B0cjxhY3Rpb25fdD4+IGF2YWlsYWJsZV9hY3Rpb25zOworICBhdmFpbGFibGVfYWN0aW9ucy5lbXBsYWNlX2JhY2sobmV3IHBhcnRpdGlvbl9hY3Rpb25fdCk7CisgIGF2YWlsYWJsZV9hY3Rpb25zLmVtcGxhY2VfYmFjayhuZXcgZXZhbHVhdGVfZGVmYXVsdHNfYWN0aW9uX3QpOworCisgIHZlY3RvcjxzdHJpbmc+IGlucHV0X2ZpbGVuYW1lczsKKworICBhY3Rpb25fdCogYWN0aW9uID0gbnVsbHB0cjsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBzaG93X3VzYWdlX2FuZF9leGl0KGFyZ2MsIGFyZ3YsIGF2YWlsYWJsZV9hY3Rpb25zKTsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIGJvb2wgYXJnX2hhbmRsZWQgPSBmYWxzZTsKKyAgICAvLyBTdGVwIDEuIFRyeSB0byBtYXRjaCBhY3Rpb24gaW52b2thdGlvbiBuYW1lcy4KKyAgICBmb3IgKGF1dG8gaXQgPSBhdmFpbGFibGVfYWN0aW9ucy5iZWdpbigpOyBpdCAhPSBhdmFpbGFibGVfYWN0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgKCppdCktPmludm9rYXRpb25fbmFtZSgpKSkgeworICAgICAgICBpZiAoIWFjdGlvbikgeworICAgICAgICAgIGFjdGlvbiA9IGl0LT5nZXQoKTsKKyAgICAgICAgICBhcmdfaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2VyciA8PCAiY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGFjdGlvbiEiIDw8IGVuZGw7CisgICAgICAgICAgc2hvd191c2FnZV9hbmRfZXhpdChhcmdjLCBhcmd2LCBhdmFpbGFibGVfYWN0aW9ucyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ19oYW5kbGVkKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gU3RlcCAyLiBUcnkgdG8gbWF0Y2ggb3B0aW9uIG5hbWVzLgorICAgIGlmIChhcmd2W2ldWzBdID09ICctJykgeworICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tb25seS1jdWJpYy1zaXplcyIpKSB7CisgICAgICAgIG9ubHlfY3ViaWNfc2l6ZXMgPSB0cnVlOworICAgICAgICBhcmdfaGFuZGxlZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1kdW1wLXRhYmxlcyIpKSB7CisgICAgICAgIGR1bXBfdGFibGVzID0gdHJ1ZTsKKyAgICAgICAgYXJnX2hhbmRsZWQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKCFhcmdfaGFuZGxlZCkgeworICAgICAgICBjZXJyIDw8ICJVbnJlY29nbml6ZWQgb3B0aW9uOiAiIDw8IGFyZ3ZbaV0gPDwgZW5kbDsKKyAgICAgICAgc2hvd191c2FnZV9hbmRfZXhpdChhcmdjLCBhcmd2LCBhdmFpbGFibGVfYWN0aW9ucyk7CisgICAgICB9CisgICAgfQorICAgIGlmIChhcmdfaGFuZGxlZCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIFN0ZXAgMy4gRGVmYXVsdCB0byBpbnRlcnByZXRpbmcgYXJncyBhcyBpbnB1dCBmaWxlbmFtZXMuCisgICAgaW5wdXRfZmlsZW5hbWVzLmVtcGxhY2VfYmFjayhhcmd2W2ldKTsKKyAgfQorCisgIGlmIChkdW1wX3RhYmxlcyAmJiBvbmx5X2N1YmljX3NpemVzKSB7CisgICAgY2VyciA8PCAiSW5jb21wYXRpYmxlIG9wdGlvbnM6IC0tb25seS1jdWJpYy1zaXplcyBhbmQgLS1kdW1wLXRhYmxlcy4iIDw8IGVuZGw7CisgICAgc2hvd191c2FnZV9hbmRfZXhpdChhcmdjLCBhcmd2LCBhdmFpbGFibGVfYWN0aW9ucyk7CisgIH0KKworICBpZiAoIWFjdGlvbikgeworICAgIHNob3dfdXNhZ2VfYW5kX2V4aXQoYXJnYywgYXJndiwgYXZhaWxhYmxlX2FjdGlvbnMpOworICB9CisKKyAgYWN0aW9uLT5ydW4oaW5wdXRfZmlsZW5hbWVzKTsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2Jhc2ljYmVuY2guY3h4bGlzdCBiL2JlbmNoL2Jhc2ljYmVuY2guY3h4bGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGFiMzRlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmFzaWNiZW5jaC5jeHhsaXN0CkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ0xJU1RbKChnKyspKV09ImcrKy0zLjQgLU8zIC1ETkRFQlVHIgorIyBDTElTVFsoKGcrKykpXT0iZysrLTMuNCAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAiCisKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjEgLU8zIC1ETkRFQlVHIgorI0NMSVNUWygoZysrKSldPSJnKystNC4xIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0yMDAwMCIKKworIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMiAtTzMgLUROREVCVUciCisjQ0xJU1RbKChnKyspKV09ImcrKy00LjIgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIgorIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMiAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAgLWZwcm9maWxlLWdlbmVyYXRlIgorIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMiAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAgLWZwcm9maWxlLXVzZSIKKworIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMyAtTzMgLUROREVCVUciCisjQ0xJU1RbKChnKyspKV09ImcrKy00LjMgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIgorIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMyAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAgLWZwcm9maWxlLWdlbmVyYXRlIgorIyBDTElTVFsoKGcrKykpXT0iZysrLTQuMyAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAgLWZwcm9maWxlLXVzZSIKKworIyBDTElTVFsoKGcrKykpXT0iaWNwYyAtZmFzdCAtRE5ERUJVRyAtZm5vLWV4Y2VwdGlvbnMgLW5vLWlubGluZS1tYXgtc2l6ZSAtcHJvZi1nZW54IgorIyBDTElTVFsoKGcrKykpXT0iaWNwYyAtZmFzdCAtRE5ERUJVRyAtZm5vLWV4Y2VwdGlvbnMgLW5vLWlubGluZS1tYXgtc2l6ZSAtcHJvZi11c2UiCisKKyNDTElTVFsoKGcrKykpXT0iL29wdC9pbnRlbC9Db21waWxlci8xMS4xLzA3Mi9iaW4vaW50ZWw2NC9pY3BjIC1mYXN0IC1ETkRFQlVHIC1mbm8tZXhjZXB0aW9ucyAtbm8taW5saW5lLW1heC1zaXplIC1scnQiCitDTElTVFsoKGcrKykpXT0iL2hvbWUvb3J6ZWwvc3ZuL2xsdm0vUmVsZWFzZS9iaW4vY2xhbmcrKyAtTzMgLUROREVCVUcgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtbHJ0IgorQ0xJU1RbKChnKyspKV09Ii9ob21lL29yemVsL3N2bi9sbHZtL1JlbGVhc2UvYmluL2NsYW5nKysgLU8zIC1ETkRFQlVHIC1scnQiCitDTElTVFsoKGcrKykpXT0iZysrLTQuNC40IC1PMyAtRE5ERUJVRyAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIC1scnQiCitDTElTVFsoKGcrKykpXT0iZysrLTQuNC40IC1PMyAtRE5ERUJVRyAtbHJ0IgorQ0xJU1RbKChnKyspKV09ImcrKy00LjUuMCAtTzMgLUROREVCVUcgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtbHJ0IgorQ0xJU1RbKChnKyspKV09ImcrKy00LjUuMCAtTzMgLUROREVCVUcgLWxydCIKZGlmZiAtLWdpdCBhL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmNwcCBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZlYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmFzaWNiZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgIkJlbmNoVXRpbC5oIgorI2luY2x1ZGUgImJhc2ljYmVuY2htYXJrLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIERJU0FCTEVfU1NFX0VYQ0VQVElPTlMoKTsKKworICAvLyB0aGlzIGlzIHRoZSBsaXN0IG9mIG1hdHJpeCB0eXBlIGFuZCBzaXplIHdlIHdhbnQgdG8gYmVuY2g6CisgIC8vICgoc3VmZml4KSAobWF0cml4IHNpemUpIChudW1iZXIgb2YgaXRlcmF0aW9ucykpCisgICNkZWZpbmUgTU9ERVMgKCgzZCkoMykoNDAwMDAwMCkpICgoNGQpKDQpKDEwMDAwMDApKSAoKFhkKSg0KSgxMDAwMDAwKSkgKChYZCkoMjApKDEwMDAwKSkKKy8vICAgI2RlZmluZSBNT0RFUyAoKFhkKSgyMCkoMTAwMDApKQorCisgICNkZWZpbmUgX0dFTkVSQVRFX0hFQURFUihSLEFSRyxFTCkgPDwgQk9PU1RfUFBfU1RSSU5HSVpFKEJPT1NUX1BQX1NFUV9IRUFEKEVMKSkgPDwgIi0iIFwKKyAgICA8PCBCT09TVF9QUF9TVFJJTkdJWkUoQk9PU1RfUFBfU0VRX0VMRU0oMSxFTCkpIDw8ICJ4IiBcCisgICAgPDwgQk9PU1RfUFBfU1RSSU5HSVpFKEJPT1NUX1BQX1NFUV9FTEVNKDEsRUwpKSA8PCAiICAgLyAgICIKKworICBzdGQ6OmNvdXQgQk9PU1RfUFBfU0VRX0ZPUl9FQUNIKF9HRU5FUkFURV9IRUFERVIsIH4sIE1PREVTICkgPDwgZW5kbDsKKworICBjb25zdCBpbnQgdHJpZXMgPSAxMDsKKworICAjZGVmaW5lIF9SVU5fQkVOQ0goUixBUkcsRUwpIFwKKyAgICBzdGQ6OmNvdXQgPDwgQVJHKCBcCisgICAgICBCT09TVF9QUF9DQVQoTWF0cml4LCBCT09TVF9QUF9TRVFfSEVBRChFTCkpIChcCisgICAgICAgICBCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSxCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSksIEJPT1NUX1BQX1NFUV9FTEVNKDIsRUwpLCB0cmllcykgXAorICAgIDw8ICIgICAiOworCisgIEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfUlVOX0JFTkNILCBiZW5jaEJhc2ljPExhenlFdmFsPiwgTU9ERVMgKTsKKyAgc3RkOjpjb3V0IDw8IGVuZGw7CisgIEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfUlVOX0JFTkNILCBiZW5jaEJhc2ljPEVhcmx5RXZhbD4sIE1PREVTICk7CisgIHN0ZDo6Y291dCA8PCBlbmRsOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmFzaWNiZW5jaG1hcmsuaCBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYzM1NwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmgKQEAgLTAsMCArMSw2MyBAQAorCisjaWZuZGVmIEVJR0VOX0JFTkNIX0JBU0lDQkVOQ0hfSAorI2RlZmluZSBFSUdFTl9CRU5DSF9CQVNJQ0JFTkNIX0gKKworZW51bSB7TGF6eUV2YWwsIEVhcmx5RXZhbCwgT21wRXZhbH07CisKK3RlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBiZW5jaEJhc2ljX2xvb3AoY29uc3QgTWF0cml4VHlwZSYgSSwgTWF0cml4VHlwZSYgbSwgaW50IGl0ZXJhdGlvbnMpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CisKK3RlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBiZW5jaEJhc2ljX2xvb3AoY29uc3QgTWF0cml4VHlwZSYgSSwgTWF0cml4VHlwZSYgbSwgaW50IGl0ZXJhdGlvbnMpCit7CisgIGZvcihpbnQgYSA9IDA7IGEgPCBpdGVyYXRpb25zOyBhKyspCisgIHsKKyAgICBpZiAoTW9kZT09TGF6eUV2YWwpCisgICAgeworICAgICAgYXNtKCIjYmVnaW5fYmVuY2hfbG9vcCBMYXp5RXZhbCIpOworICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1FaWdlbjo6RHluYW1pYykgYXNtKCIjZml4ZWRzaXplIik7CisgICAgICBtID0gKEkgKyAwLjAwMDA1ICogKG0gKyBtLmxhenkoKSAqIG0pKS5ldmFsKCk7CisgICAgfQorICAgIGVsc2UgaWYgKE1vZGU9PU9tcEV2YWwpCisgICAgeworICAgICAgYXNtKCIjYmVnaW5fYmVuY2hfbG9vcCBPbXBFdmFsIik7CisgICAgICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUVpZ2VuOjpEeW5hbWljKSBhc20oIiNmaXhlZHNpemUiKTsKKyAgICAgIG0gPSAoSSArIDAuMDAwMDUgKiAobSArIG0ubGF6eSgpICogbSkpLmV2YWxPTVAoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzbSgiI2JlZ2luX2JlbmNoX2xvb3AgRWFybHlFdmFsIik7CisgICAgICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUVpZ2VuOjpEeW5hbWljKSBhc20oIiNmaXhlZHNpemUiKTsKKyAgICAgIG0gPSBJICsgMC4wMDAwNSAqIChtICsgbSAqIG0pOworICAgIH0KKyAgICBhc20oIiNlbmRfYmVuY2hfbG9vcCIpOworICB9Cit9CisKK3RlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorZG91YmxlIGJlbmNoQmFzaWMoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBpbnQgc2l6ZSwgaW50IHRyaWVzKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK2RvdWJsZSBiZW5jaEJhc2ljKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgaW50IGl0ZXJhdGlvbnMsIGludCB0cmllcykKK3sKKyAgY29uc3QgaW50IHJvd3MgPSBtYXQucm93cygpOworICBjb25zdCBpbnQgY29scyA9IG1hdC5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBJKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworCisgIGluaXRNYXRyaXhfaWRlbnRpdHkoSSk7CisKKyAgRWlnZW46OkJlbmNoVGltZXIgdGltZXI7CisgIGZvcih1aW50IHQ9MDsgdDx0cmllczsgKyt0KQorICB7CisgICAgaW5pdE1hdHJpeF9yYW5kb20obSk7CisgICAgdGltZXIuc3RhcnQoKTsKKyAgICBiZW5jaEJhc2ljX2xvb3A8TW9kZT4oSSwgbSwgaXRlcmF0aW9ucyk7CisgICAgdGltZXIuc3RvcCgpOworICAgIGNlcnIgPDwgbTsKKyAgfQorICByZXR1cm4gdGltZXIudmFsdWUoKTsKK307CisKKyNlbmRpZiAvLyBFSUdFTl9CRU5DSF9CQVNJQ0JFTkNIX0gKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoQmxhc0dlbW0uY3BwIGIvYmVuY2gvYmVuY2hCbGFzR2VtbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwODZhNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoQmxhc0dlbW0uY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvLyBnKysgLU8zIC1ETkRFQlVHIC1JLi4gLUwgL3Vzci9saWI2NC9hdGxhcy8gYmVuY2hCbGFzR2VtbS5jcHAgLW8gYmVuY2hCbGFzR2VtbSAtbHJ0IC1sY2JsYXMKKy8vIHBvc3NpYmxlIG9wdGlvbnM6CisvLyAgICAtREVJR0VOX0RPTlRfVkVDVE9SSVpFCisvLyAgICAtbXNzZTIKKworLy8gI2RlZmluZSBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorI2RlZmluZSBfRkxPQVQKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlICJCZW5jaFRpbWVyLmgiCisKKy8vIGluY2x1ZGUgdGhlIEJMQVMgaGVhZGVycworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8Y2JsYXMuaD4KK30KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZmRlZiBfRkxPQVQKK3R5cGVkZWYgZmxvYXQgU2NhbGFyOworI2RlZmluZSBDQkxBU19HRU1NIGNibGFzX3NnZW1tCisjZWxzZQordHlwZWRlZiBkb3VibGUgU2NhbGFyOworI2RlZmluZSBDQkxBU19HRU1NIGNibGFzX2RnZW1tCisjZW5kaWYKKworCit0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8U2NhbGFyLEVpZ2VuOjpEeW5hbWljLEVpZ2VuOjpEeW5hbWljPiBNeU1hdHJpeDsKK3ZvaWQgYmVuY2hfZWlnZW5nZW1tKE15TWF0cml4JiBtYywgY29uc3QgTXlNYXRyaXgmIG1hLCBjb25zdCBNeU1hdHJpeCYgbWIsIGludCBuYmxvb3BzKTsKK3ZvaWQgY2hlY2tfcHJvZHVjdChpbnQgTSwgaW50IE4sIGludCBLKTsKK3ZvaWQgY2hlY2tfcHJvZHVjdCh2b2lkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgLy8gZGlzYWJsZSBTU0UgZXhjZXB0aW9ucworICAjaWZkZWYgX19HTlVDX18KKyAgeworICAgIGludCBhdXg7CisgICAgYXNtKAorICAgICJzdG14Y3NyICAgJVthdXhdICAgICAgICAgICBcblx0IgorICAgICJvcmwgICAgICAgJDMyODMyLCAlW2F1eF0gICBcblx0IgorICAgICJsZG14Y3NyICAgJVthdXhdICAgICAgICAgICBcblx0IgorICAgIDogOiBbYXV4XSAibSIgKGF1eCkpOworICB9CisgICNlbmRpZgorCisgIGludCBuYnRyaWVzPTEsIG5ibG9vcHM9MSwgTSwgTiwgSzsKKworICBpZiAoYXJnYz09MikKKyAgeworICAgIGlmIChzdGQ6OnN0cmluZyhhcmd2WzFdKT09ImNoZWNrIikKKyAgICAgIGNoZWNrX3Byb2R1Y3QoKTsKKyAgICBlbHNlCisgICAgICBNID0gTiA9IEsgPSBhdG9pKGFyZ3ZbMV0pOworICB9CisgIGVsc2UgaWYgKChhcmdjPT0zKSAmJiAoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgIHsKKyAgICBNID0gTiA9IEsgPSBhdG9pKGFyZ3ZbMl0pOworICAgIG5ibG9vcHMgPSAxMDAwMDAwMDAwLyhNKk0qTSk7CisgICAgaWYgKG5ibG9vcHM8MSkKKyAgICAgIG5ibG9vcHMgPSAxOworICAgIG5idHJpZXMgPSA2OworICB9CisgIGVsc2UgaWYgKGFyZ2M9PTQpCisgIHsKKyAgICBNID0gTiA9IEsgPSBhdG9pKGFyZ3ZbMV0pOworICAgIG5ibG9vcHMgPSBhdG9pKGFyZ3ZbMl0pOworICAgIG5idHJpZXMgPSBhdG9pKGFyZ3ZbM10pOworICB9CisgIGVsc2UgaWYgKGFyZ2M9PTYpCisgIHsKKyAgICBNID0gYXRvaShhcmd2WzFdKTsKKyAgICBOID0gYXRvaShhcmd2WzJdKTsKKyAgICBLID0gYXRvaShhcmd2WzNdKTsKKyAgICBuYmxvb3BzID0gYXRvaShhcmd2WzRdKTsKKyAgICBuYnRyaWVzID0gYXRvaShhcmd2WzVdKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBzaXplICBcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgYXV0byBzaXplXG4iOworICAgIHN0ZDo6Y291dCA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIHNpemUgbmJsb29wcyBuYnRyaWVzXG4iOworICAgIHN0ZDo6Y291dCA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIE0gTiBLIG5ibG9vcHMgbmJ0cmllc1xuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBjaGVja1xuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIk9wdGlvbnM6XG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIHNpemUgICAgICAgdW5pcXVlIHNpemUgb2YgdGhlIDIgbWF0cmljZXMgKGludGVnZXIpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIGF1dG8gICAgICAgYXV0b21hdGljYWxseSBzZXQgdGhlIG51bWJlciBvZiByZXBldGl0aW9ucyBhbmQgdHJpZXNcbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgbmJsb29wcyAgICBudW1iZXIgb2YgdGltZXMgdGhlIEdFTU0gcm91dGluZXMgaXMgZXhlY3V0ZWRcbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgbmJ0cmllcyAgICBudW1iZXIgb2YgdGltZXMgdGhlIGxvb3AgaXMgYmVuY2hlZCAocmV0dXJuIHRoZSBiZXN0IHRyeSlcbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgTSBOIEsgICAgICBzaXplcyBvZiB0aGUgbWF0cmljZXM6IE14TiAgPSAgTXhLICogS3hOIChpbnRlZ2VycylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICIgICAgY2hlY2sgICAgICBjaGVjayBlaWdlbiBwcm9kdWN0IHVzaW5nIGNibGFzIGFzIGEgcmVmZXJlbmNlXG4iOworICAgIGV4aXQoMSk7CisgIH0KKworICBkb3VibGUgbmJtYWQgPSBkb3VibGUoTSkgKiBkb3VibGUoTikgKiBkb3VibGUoSykgKiBkb3VibGUobmJsb29wcyk7CisKKyAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgICAgc3RkOjpjb3V0IDw8IE0gPDwgIiB4ICIgPDwgTiA8PCAiIHggIiA8PCBLIDw8ICJcbiI7CisKKyAgU2NhbGFyIGFscGhhLCBiZXRhOworICBNeU1hdHJpeCBtYShNLEspLCBtYihLLE4pLCBtYyhNLE4pOworICBtYSA9IE15TWF0cml4OjpSYW5kb20oTSxLKTsKKyAgbWIgPSBNeU1hdHJpeDo6UmFuZG9tKEssTik7CisgIG1jID0gTXlNYXRyaXg6OlJhbmRvbShNLE4pOworCisgIEVpZ2VuOjpCZW5jaFRpbWVyIHRpbWVyOworCisgIC8vIHdlIHNpbXBseSBjb21wdXRlIGMgKz0gYSpiLCBzbzoKKyAgYWxwaGEgPSAxOworICBiZXRhID0gMTsKKworICAvLyBiZW5jaCBjYmxhcworICAvLyBST1dTX0EsIENPTFNfQiwgQ09MU19BLCAxLjAsICBBLCBDT0xTX0EsIEIsIENPTFNfQiwgMC4wLCBDLCBDT0xTX0IpOworICBpZiAoIShzdGQ6OnN0cmluZyhhcmd2WzFdKT09ImF1dG8iKSkKKyAgeworICAgIHRpbWVyLnJlc2V0KCk7CisgICAgZm9yICh1aW50IGs9MCA7IGs8bmJ0cmllcyA7ICsraykKKyAgICB7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgIGZvciAodWludCBqPTAgOyBqPG5ibG9vcHMgOyArK2opCisgICAgICAgICAgICAgICNpZmRlZiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorICAgICAgICAgICAgICBDQkxBU19HRU1NKENibGFzUm93TWFqb3IsIENibGFzTm9UcmFucywgQ2JsYXNOb1RyYW5zLCBNLCBOLCBLLCBhbHBoYSwgbWEuZGF0YSgpLCBLLCBtYi5kYXRhKCksIE4sIGJldGEsIG1jLmRhdGEoKSwgTik7CisgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNOb1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIGFscGhhLCBtYS5kYXRhKCksIE0sIG1iLmRhdGEoKSwgSywgYmV0YSwgbWMuZGF0YSgpLCBNKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICB9CisgICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgICAgICBzdGQ6OmNvdXQgPDwgImNibGFzOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoIiA8PCAxZS0zKmZsb29yKDFlLTYqbmJtYWQvdGltZXIudmFsdWUoKSkgPDwgIiBHRmxvcHMvcylcbiI7CisgICAgZWxzZQorICAgICAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgOyAiIDw8IDFlLTMqZmxvb3IoMWUtNipuYm1hZC90aW1lci52YWx1ZSgpKSA8PCAiXG4iOworICB9CisKKyAgLy8gY2xlYXIKKyAgbWEgPSBNeU1hdHJpeDo6UmFuZG9tKE0sSyk7CisgIG1iID0gTXlNYXRyaXg6OlJhbmRvbShLLE4pOworICBtYyA9IE15TWF0cml4OjpSYW5kb20oTSxOKTsKKworICAvLyBlaWdlbgorLy8gICBpZiAoIShzdGQ6OnN0cmluZyhhcmd2WzFdKT09ImF1dG8iKSkKKyAgeworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIGZvciAodWludCBrPTAgOyBrPG5idHJpZXMgOyArK2spCisgICAgICB7CisgICAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgICBiZW5jaF9laWdlbmdlbW0obWMsIG1hLCBtYiwgbmJsb29wcyk7CisgICAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgfQorICAgICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgICAgICAgIHN0ZDo6Y291dCA8PCAiZWlnZW4gOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoIiA8PCAxZS0zKmZsb29yKDFlLTYqbmJtYWQvdGltZXIudmFsdWUoKSkgPDwgIiBHRmxvcHMvcylcbiI7CisgICAgICBlbHNlCisgICAgICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiA7ICIgPDwgMWUtMypmbG9vcigxZS02Km5ibWFkL3RpbWVyLnZhbHVlKCkpIDw8ICJcbiI7CisgIH0KKworICBzdGQ6OmNvdXQgPDwgImwxOiAiIDw8IEVpZ2VuOjpsMUNhY2hlU2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJsMjogIiA8PCBFaWdlbjo6bDJDYWNoZVNpemUoKSA8PCBzdGQ6OmVuZGw7CisgIAorCisgIHJldHVybiAwOworfQorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgYmVuY2hfZWlnZW5nZW1tKE15TWF0cml4JiBtYywgY29uc3QgTXlNYXRyaXgmIG1hLCBjb25zdCBNeU1hdHJpeCYgbWIsIGludCBuYmxvb3BzKQoreworICBmb3IgKHVpbnQgaj0wIDsgajxuYmxvb3BzIDsgKytqKQorICAgICAgbWMubm9hbGlhcygpICs9IG1hICogbWI7Cit9CisKKyNkZWZpbmUgTVlWRVJJRlkoQSxNKSBpZiAoIShBKSkgeyBcCisgICAgc3RkOjpjb3V0IDw8ICJGQUlMOiAiIDw8IE0gPDwgIlxuIjsgXAorICB9Cit2b2lkIGNoZWNrX3Byb2R1Y3QoaW50IE0sIGludCBOLCBpbnQgSykKK3sKKyAgTXlNYXRyaXggbWEoTSxLKSwgbWIoSyxOKSwgbWMoTSxOKSwgbWFUKEssTSksIG1iVChOLEspLCBtZWlnZW4oTSxOKSwgbXJlZihNLE4pOworICBtYSA9IE15TWF0cml4OjpSYW5kb20oTSxLKTsKKyAgbWIgPSBNeU1hdHJpeDo6UmFuZG9tKEssTik7CisgIG1hVCA9IG1hLnRyYW5zcG9zZSgpOworICBtYlQgPSBtYi50cmFuc3Bvc2UoKTsKKyAgbWMgPSBNeU1hdHJpeDo6UmFuZG9tKE0sTik7CisKKyAgTXlNYXRyaXg6OlNjYWxhciBlcHMgPSAxZS00OworCisgIG1laWdlbiA9IG1yZWYgPSBtYzsKKyAgQ0JMQVNfR0VNTShDYmxhc0NvbE1ham9yLCBDYmxhc05vVHJhbnMsIENibGFzTm9UcmFucywgTSwgTiwgSywgMSwgbWEuZGF0YSgpLCBNLCBtYi5kYXRhKCksIEssIDEsIG1yZWYuZGF0YSgpLCBNKTsKKyAgbWVpZ2VuICs9IG1hICogbWI7CisgIE1ZVkVSSUZZKG1laWdlbi5pc0FwcHJveChtcmVmLCBlcHMpLCIuICogLiIpOworCisgIG1laWdlbiA9IG1yZWYgPSBtYzsKKyAgQ0JMQVNfR0VNTShDYmxhc0NvbE1ham9yLCBDYmxhc1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIDEsIG1hVC5kYXRhKCksIEssIG1iLmRhdGEoKSwgSywgMSwgbXJlZi5kYXRhKCksIE0pOworICBtZWlnZW4gKz0gbWFULnRyYW5zcG9zZSgpICogbWI7CisgIE1ZVkVSSUZZKG1laWdlbi5pc0FwcHJveChtcmVmLCBlcHMpLCJUICogLiIpOworCisgIG1laWdlbiA9IG1yZWYgPSBtYzsKKyAgQ0JMQVNfR0VNTShDYmxhc0NvbE1ham9yLCBDYmxhc1RyYW5zLCBDYmxhc1RyYW5zLCBNLCBOLCBLLCAxLCBtYVQuZGF0YSgpLCBLLCBtYlQuZGF0YSgpLCBOLCAxLCBtcmVmLmRhdGEoKSwgTSk7CisgIG1laWdlbiArPSAobWFULnRyYW5zcG9zZSgpKSAqIChtYlQudHJhbnNwb3NlKCkpOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwiVCAqIFQiKTsKKworICBtZWlnZW4gPSBtcmVmID0gbWM7CisgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNOb1RyYW5zLCBDYmxhc1RyYW5zLCBNLCBOLCBLLCAxLCBtYS5kYXRhKCksIE0sIG1iVC5kYXRhKCksIE4sIDEsIG1yZWYuZGF0YSgpLCBNKTsKKyAgbWVpZ2VuICs9IG1hICogbWJULnRyYW5zcG9zZSgpOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwiLiAqIFQiKTsKK30KKwordm9pZCBjaGVja19wcm9kdWN0KHZvaWQpCit7CisgIGludCBNLCBOLCBLOworICBmb3IgKHVpbnQgaT0wOyBpPDEwMDA7ICsraSkKKyAgeworICAgIE0gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw2NCk7CisgICAgTiA9IGludGVybmFsOjpyYW5kb208aW50PigxLDc2OCk7CisgICAgSyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDc2OCk7CisgICAgTSA9ICgwICsgTSkgKiAxOworICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgeCAiIDw8IE4gPDwgIiB4ICIgPDwgSyA8PCAiXG4iOworICAgIGNoZWNrX3Byb2R1Y3QoTSwgTiwgSyk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAgYi9iZW5jaC9iZW5jaENob2xlc2t5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThlN2NmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKworLy8gZysrIC1ETkRFQlVHIC1PMyAtSS4uIGJlbmNoTExULmNwcCAgLW8gYmVuY2hMTFQgJiYgLi9iZW5jaExMVAorLy8gb3B0aW9uczoKKy8vICAtREJFTkNIX0dTTCAtbGdzbCAvdXNyL2xpYi9saWJjYmxhcy5zby4zCisvLyAgLURFSUdFTl9ET05UX1ZFQ1RPUklaRQorLy8gIC1tc3NlMgorLy8gIC1EUkVQRUFUPTEwMAorLy8gIC1EVFJJRVM9MTAKKy8vICAtRFNDQUxBUj1kb3VibGUKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFV0aWwuaD4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEwMDAwCisjZW5kaWYKKworI2lmbmRlZiBUUklFUworI2RlZmluZSBUUklFUyAxMAorI2VuZGlmCisKK3R5cGVkZWYgZmxvYXQgU2NhbGFyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK19fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hMTFQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKworICBkb3VibGUgY29zdCA9IDA7CisgIGZvciAoaW50IGo9MDsgajxyb3dzOyArK2opCisgIHsKKyAgICBpbnQgciA9IHN0ZDo6bWF4KHJvd3MgLSBqIC0xLDApOworICAgIGNvc3QgKz0gMioocipqK3Iraik7CisgIH0KKworICBpbnQgcmVwZWF0cyA9IChSRVBFQVQqMTAwMCkvKHJvd3Mqcm93cyk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBjb3ZNYXQgPSAgYSAqIGEuYWRqb2ludCgpOworCisgIEJlbmNoVGltZXIgdGltZXJOb1NxcnQsIHRpbWVyU3FydDsKKworICBTY2FsYXIgYWNjID0gMDsKKyAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb3ZNYXQucm93cygpLTEpOworICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvdk1hdC5jb2xzKCktMSk7CisgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQorICB7CisgICAgdGltZXJOb1NxcnQuc3RhcnQoKTsKKyAgICBmb3IgKGludCBrPTA7IGs8cmVwZWF0czsgKytrKQorICAgIHsKKyAgICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZT4gY2hvbG5vc3FydChjb3ZNYXQpOworICAgICAgYWNjICs9IGNob2xub3NxcnQubWF0cml4TCgpLmNvZWZmKHIsYyk7CisgICAgfQorICAgIHRpbWVyTm9TcXJ0LnN0b3AoKTsKKyAgfQorCisgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQorICB7CisgICAgdGltZXJTcXJ0LnN0YXJ0KCk7CisgICAgZm9yIChpbnQgaz0wOyBrPHJlcGVhdHM7ICsraykKKyAgICB7CisgICAgICBMTFQ8U3F1YXJlTWF0cml4VHlwZT4gY2hvbChjb3ZNYXQpOworICAgICAgYWNjICs9IGNob2wubWF0cml4TCgpLmNvZWZmKHIsYyk7CisgICAgfQorICAgIHRpbWVyU3FydC5zdG9wKCk7CisgIH0KKworICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgc3RkOjpjb3V0IDw8ICJkeW4gICAiOworICBlbHNlCisgICAgc3RkOjpjb3V0IDw8ICJmaXhlZCAiOworICBzdGQ6OmNvdXQgPDwgY292TWF0LnJvd3MoKSA8PCAiIFx0IgorICAgICAgICAgICAgPDwgKHRpbWVyTm9TcXJ0LmJlc3QoKSkgLyByZXBlYXRzIDw8ICJzICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCAxZS05ICogY29zdCpyZXBlYXRzL3RpbWVyTm9TcXJ0LmJlc3QoKSA8PCAiIEdGTE9QUylcdCIKKyAgICAgICAgICAgIDw8ICh0aW1lclNxcnQuYmVzdCgpKSAvIHJlcGVhdHMgPDwgInMgIgorICAgICAgICAgICAgPDwgIigiIDw8IDFlLTkgKiBjb3N0KnJlcGVhdHMvdGltZXJTcXJ0LmJlc3QoKSA8PCAiIEdGTE9QUylcbiI7CisKKworICAjaWZkZWYgQkVOQ0hfR1NMCisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIHRpbWVyU3FydC5yZXNldCgpOworCisgICAgZ3NsX21hdHJpeCogZ3NsQ292TWF0ID0gZ3NsX21hdHJpeF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF9tYXRyaXgqIGdzbENvcHkgPSBnc2xfbWF0cml4X2FsbG9jKGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7CisKKyAgICBlaVRvR3NsKGNvdk1hdCwgJmdzbENvdk1hdCk7CisgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisgICAgeworICAgICAgdGltZXJTcXJ0LnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8cmVwZWF0czsgKytrKQorICAgICAgeworICAgICAgICBnc2xfbWF0cml4X21lbWNweShnc2xDb3B5LGdzbENvdk1hdCk7CisgICAgICAgIGdzbF9saW5hbGdfY2hvbGVza3lfZGVjb21wKGdzbENvcHkpOworICAgICAgICBhY2MgKz0gZ3NsX21hdHJpeF9nZXQoZ3NsQ29weSxyLGMpOworICAgICAgfQorICAgICAgdGltZXJTcXJ0LnN0b3AoKTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IgorICAgICAgICAgICAgICA8PCB0aW1lclNxcnQudmFsdWUoKSAqIFJFUEVBVCAvIHJlcGVhdHMgPDwgInMiOworCisgICAgZ3NsX21hdHJpeF9mcmVlKGdzbENvdk1hdCk7CisgIH0KKyAgI2VuZGlmCisgIHN0ZDo6Y291dCA8PCAiXG4iOworICAvLyBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IG9wdGltaXplIHRvbyBtdWNoCisgIGlmIChhY2M9PTEyMykKKyAgICBzdGQ6OmNvdXQgPDwgYWNjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICBjb25zdCBpbnQgZHluc2l6ZXNbXSA9IHs0LDYsOCwxNiwyNCwzMiw0OSw2NCwxMjgsMjU2LDUxMiw5MDAsMTUwMCwwfTsKKyAgc3RkOjpjb3V0IDw8ICJzaXplICAgICAgICAgICAgTERMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFQiOworLy8gICAjaWZkZWYgQkVOQ0hfR1NMCisvLyAgIHN0ZDo6Y291dCA8PCAiICAgICAgIEdTTCAoc3RhbmRhcmQgKyBkb3VibGUgKyBBVExBUykgICI7CisvLyAgICNlbmRpZgorICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgZm9yIChpbnQgaT0wOyBkeW5zaXplc1tpXT4wOyArK2kpCisgICAgYmVuY2hMTFQoTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+KGR5bnNpemVzW2ldLGR5bnNpemVzW2ldKSk7CisKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwyLDI+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDMsMz4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsNCw0PigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciw1LDU+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDYsNj4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsNyw3PigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciw4LDg+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDEyLDEyPigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwxNiwxNj4oKSk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaEVpZ2VuU29sdmVyLmNwcCBiL2JlbmNoL2JlbmNoRWlnZW5Tb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzhjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaEVpZ2VuU29sdmVyLmNwcApAQCAtMCwwICsxLDIxMiBAQAorCisvLyBnKysgLUROREVCVUcgLU8zIC1JLi4gYmVuY2hFaWdlblNvbHZlci5jcHAgIC1vIGJlbmNoRWlnZW5Tb2x2ZXIgJiYgLi9iZW5jaEVpZ2VuU29sdmVyCisvLyBvcHRpb25zOgorLy8gIC1EQkVOQ0hfR01NCisvLyAgLURCRU5DSF9HU0wgLWxnc2wgL3Vzci9saWIvbGliY2JsYXMuc28uMworLy8gIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUKKy8vICAtbXNzZTIKKy8vICAtRFJFUEVBVD0xMDAKKy8vICAtRFRSSUVTPTEwCisvLyAgLURTQ0FMQVI9ZG91YmxlCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hVdGlsLmg+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxMDAwCisjZW5kaWYKKworI2lmbmRlZiBUUklFUworI2RlZmluZSBUUklFUyA0CisjZW5kaWYKKworI2lmbmRlZiBTQ0FMQVIKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CisjZW5kaWYKKwordHlwZWRlZiBTQ0FMQVIgU2NhbGFyOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK19fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIGludCBzdGRSZXBlYXRzID0gc3RkOjptYXgoMSxpbnQoKFJFUEVBVCoxMDAwKS8ocm93cypyb3dzKnNxcnQocm93cykpKSk7CisgIGludCBzYVJlcGVhdHMgPSBzdGRSZXBlYXRzICogNDsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBTcXVhcmVNYXRyaXhUeXBlIGNvdk1hdCA9ICBhICogYS5hZGpvaW50KCk7CisKKyAgQmVuY2hUaW1lciB0aW1lclNhLCB0aW1lclN0ZDsKKworICBTY2FsYXIgYWNjID0gMDsKKyAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb3ZNYXQucm93cygpLTEpOworICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvdk1hdC5jb2xzKCktMSk7CisgIHsKKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPFNxdWFyZU1hdHJpeFR5cGU+IGVpKGNvdk1hdCk7CisgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisgICAgeworICAgICAgdGltZXJTYS5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHNhUmVwZWF0czsgKytrKQorICAgICAgeworICAgICAgICBlaS5jb21wdXRlKGNvdk1hdCk7CisgICAgICAgIGFjYyArPSBlaS5laWdlbnZlY3RvcnMoKS5jb2VmZihyLGMpOworICAgICAgfQorICAgICAgdGltZXJTYS5zdG9wKCk7CisgICAgfQorICB9CisKKyAgeworICAgIEVpZ2VuU29sdmVyPFNxdWFyZU1hdHJpeFR5cGU+IGVpKGNvdk1hdCk7CisgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisgICAgeworICAgICAgdGltZXJTdGQuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxzdGRSZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGVpLmNvbXB1dGUoY292TWF0KTsKKyAgICAgICAgYWNjICs9IGVpLmVpZ2VudmVjdG9ycygpLmNvZWZmKHIsYyk7CisgICAgICB9CisgICAgICB0aW1lclN0ZC5zdG9wKCk7CisgICAgfQorICB9CisKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgIHN0ZDo6Y291dCA8PCAiZHluICAgIjsKKyAgZWxzZQorICAgIHN0ZDo6Y291dCA8PCAiZml4ZWQgIjsKKyAgc3RkOjpjb3V0IDw8IGNvdk1hdC5yb3dzKCkgPDwgIiBcdCIKKyAgICAgICAgICAgIDw8IHRpbWVyU2EudmFsdWUoKSAqIFJFUEVBVCAvIHNhUmVwZWF0cyA8PCAicyBcdCIKKyAgICAgICAgICAgIDw8IHRpbWVyU3RkLnZhbHVlKCkgKiBSRVBFQVQgLyBzdGRSZXBlYXRzIDw8ICJzIjsKKworICAjaWZkZWYgQkVOQ0hfR01NCisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIHRpbWVyU2EucmVzZXQoKTsKKyAgICB0aW1lclN0ZC5yZXNldCgpOworCisgICAgZ21tOjpkZW5zZV9tYXRyaXg8U2NhbGFyPiBnbW1Db3ZNYXQoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKyAgICBnbW06OmRlbnNlX21hdHJpeDxTY2FsYXI+IGVpZ3ZlY3QoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKyAgICBzdGQ6OnZlY3RvcjxTY2FsYXI+IGVpZ3ZhbChjb3ZNYXQucm93cygpKTsKKyAgICBlaVRvR21tKGNvdk1hdCwgZ21tQ292TWF0KTsKKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclNhLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8c2FSZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGdtbTo6c3ltbWV0cmljX3FyX2FsZ29yaXRobShnbW1Db3ZNYXQsIGVpZ3ZhbCwgZWlndmVjdCk7CisgICAgICAgIGFjYyArPSBlaWd2ZWN0KHIsYyk7CisgICAgICB9CisgICAgICB0aW1lclNhLnN0b3AoKTsKKyAgICB9CisgICAgLy8gdGhlIG5vbi1zZWxmYWRqb2ludCBzb2x2ZXIgZG9lcyBub3QgY29tcHV0ZSB0aGUgZWlnZW4gdmVjdG9ycworLy8gICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQorLy8gICAgIHsKKy8vICAgICAgIHRpbWVyU3RkLnN0YXJ0KCk7CisvLyAgICAgICBmb3IgKGludCBrPTA7IGs8c3RkUmVwZWF0czsgKytrKQorLy8gICAgICAgeworLy8gICAgICAgICBnbW06OmltcGxpY2l0X3FyX2FsZ29yaXRobShnbW1Db3ZNYXQsIGVpZ3ZhbCwgZWlndmVjdCk7CisvLyAgICAgICAgIGFjYyArPSBlaWd2ZWN0KHIsYyk7CisvLyAgICAgICB9CisvLyAgICAgICB0aW1lclN0ZC5zdG9wKCk7CisvLyAgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICIgfCBcdCIKKyAgICAgICAgICAgICAgPDwgdGltZXJTYS52YWx1ZSgpICogUkVQRUFUIC8gc2FSZXBlYXRzIDw8ICJzIgorICAgICAgICAgICAgICA8PCAvKnRpbWVyU3RkLnZhbHVlKCkgKiBSRVBFQVQgLyBzdGRSZXBlYXRzIDw8ICJzIiovICIgICBuYSAgICI7CisgIH0KKyAgI2VuZGlmCisKKyAgI2lmZGVmIEJFTkNIX0dTTAorICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgIHsKKyAgICB0aW1lclNhLnJlc2V0KCk7CisgICAgdGltZXJTdGQucmVzZXQoKTsKKworICAgIGdzbF9tYXRyaXgqIGdzbENvdk1hdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKyAgICBnc2xfbWF0cml4KiBnc2xDb3B5ID0gZ3NsX21hdHJpeF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF9tYXRyaXgqIGVpZ3ZlY3QgPSBnc2xfbWF0cml4X2FsbG9jKGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX3ZlY3RvciogZWlndmFsICA9IGdzbF92ZWN0b3JfYWxsb2MoY292TWF0LnJvd3MoKSk7CisgICAgZ3NsX2VpZ2VuX3N5bW12X3dvcmtzcGFjZSogZWlzeW1tID0gZ3NsX2VpZ2VuX3N5bW12X2FsbG9jKGNvdk1hdC5yb3dzKCkpOworICAgIAorICAgIGdzbF9tYXRyaXhfY29tcGxleCogZWlndmVjdHogPSBnc2xfbWF0cml4X2NvbXBsZXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKyAgICBnc2xfdmVjdG9yX2NvbXBsZXgqIGVpZ3ZhbHogID0gZ3NsX3ZlY3Rvcl9jb21wbGV4X2FsbG9jKGNvdk1hdC5yb3dzKCkpOworICAgIGdzbF9laWdlbl9ub25zeW1tdl93b3Jrc3BhY2UqIGVpbm9uc3ltbSA9IGdzbF9laWdlbl9ub25zeW1tdl9hbGxvYyhjb3ZNYXQucm93cygpKTsKKyAgICAKKyAgICBlaVRvR3NsKGNvdk1hdCwgJmdzbENvdk1hdCk7CisgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisgICAgeworICAgICAgdGltZXJTYS5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHNhUmVwZWF0czsgKytrKQorICAgICAgeworICAgICAgICBnc2xfbWF0cml4X21lbWNweShnc2xDb3B5LGdzbENvdk1hdCk7CisgICAgICAgIGdzbF9laWdlbl9zeW1tdihnc2xDb3B5LCBlaWd2YWwsIGVpZ3ZlY3QsIGVpc3ltbSk7CisgICAgICAgIGFjYyArPSBnc2xfbWF0cml4X2dldChlaWd2ZWN0LHIsYyk7CisgICAgICB9CisgICAgICB0aW1lclNhLnN0b3AoKTsKKyAgICB9CisgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisgICAgeworICAgICAgdGltZXJTdGQuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxzdGRSZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGdzbF9tYXRyaXhfbWVtY3B5KGdzbENvcHksZ3NsQ292TWF0KTsKKyAgICAgICAgZ3NsX2VpZ2VuX25vbnN5bW12KGdzbENvcHksIGVpZ3ZhbHosIGVpZ3ZlY3R6LCBlaW5vbnN5bW0pOworICAgICAgICBhY2MgKz0gR1NMX1JFQUwoZ3NsX21hdHJpeF9jb21wbGV4X2dldChlaWd2ZWN0eixyLGMpKTsKKyAgICAgIH0KKyAgICAgIHRpbWVyU3RkLnN0b3AoKTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IgorICAgICAgICAgICAgICA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMgXHQiCisgICAgICAgICAgICAgIDw8IHRpbWVyU3RkLnZhbHVlKCkgKiBSRVBFQVQgLyBzdGRSZXBlYXRzIDw8ICJzIjsKKworICAgIGdzbF9tYXRyaXhfZnJlZShnc2xDb3ZNYXQpOworICAgIGdzbF92ZWN0b3JfZnJlZShnc2xDb3B5KTsKKyAgICBnc2xfbWF0cml4X2ZyZWUoZWlndmVjdCk7CisgICAgZ3NsX3ZlY3Rvcl9mcmVlKGVpZ3ZhbCk7CisgICAgZ3NsX21hdHJpeF9jb21wbGV4X2ZyZWUoZWlndmVjdHopOworICAgIGdzbF92ZWN0b3JfY29tcGxleF9mcmVlKGVpZ3ZhbHopOworICAgIGdzbF9laWdlbl9zeW1tdl9mcmVlKGVpc3ltbSk7CisgICAgZ3NsX2VpZ2VuX25vbnN5bW12X2ZyZWUoZWlub25zeW1tKTsKKyAgfQorICAjZW5kaWYKKworICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgCisgIC8vIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgb3B0aW1pemUgdG9vIG11Y2gKKyAgaWYgKGFjYz09MTIzKQorICAgIHN0ZDo6Y291dCA8PCBhY2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIGNvbnN0IGludCBkeW5zaXplc1tdID0gezQsNiw4LDEyLDE2LDI0LDMyLDY0LDEyOCwyNTYsNTEyLDB9OworICBzdGQ6OmNvdXQgPDwgInNpemUgICAgICAgICAgICBzZWxmYWRqb2ludCAgICAgICBnZW5lcmljIjsKKyAgI2lmZGVmIEJFTkNIX0dNTQorICBzdGQ6OmNvdXQgPDwgIiAgICAgICAgR01NKysgICAgICAgICAgIjsKKyAgI2VuZGlmCisgICNpZmRlZiBCRU5DSF9HU0wKKyAgc3RkOjpjb3V0IDw8ICIgICAgICAgR1NMIChkb3VibGUgKyBBVExBUykgICI7CisgICNlbmRpZgorICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgZm9yICh1aW50IGk9MDsgZHluc2l6ZXNbaV0+MDsgKytpKQorICAgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+KGR5bnNpemVzW2ldLGR5bnNpemVzW2ldKSk7CisKKyAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDIsMj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwzLDM+KCkpOworICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsNCw0PigpKTsKKyAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDYsNj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciw4LDg+KCkpOworICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsMTIsMTI+KCkpOworICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsMTYsMTY+KCkpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hGRlQuY3BwIGIvYmVuY2gvYmVuY2hGRlQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaEZGVC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IE1hcmsgQm9yZ2VyZGluZyBtYXJrIGEgYm9yZ2VyZGluZyBuZXQKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGJlbmNoL0JlbmNoVXRpbC5oPgorI2luY2x1ZGUgPGNvbXBsZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9GRlQ+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJpbmcgbmFtZW9mKCk7CisKK3RlbXBsYXRlIDw+IHN0cmluZyBuYW1lb2Y8ZmxvYXQ+KCkge3JldHVybiAiZmxvYXQiO30KK3RlbXBsYXRlIDw+IHN0cmluZyBuYW1lb2Y8ZG91YmxlPigpIHtyZXR1cm4gImRvdWJsZSI7fQordGVtcGxhdGUgPD4gc3RyaW5nIG5hbWVvZjxsb25nIGRvdWJsZT4oKSB7cmV0dXJuICJsb25nIGRvdWJsZSI7fQorCisjaWZuZGVmIFRZUEUKKyNkZWZpbmUgVFlQRSBmbG9hdAorI2VuZGlmCisKKyNpZm5kZWYgTkZGVAorI2RlZmluZSBORkZUIDEwMjQKKyNlbmRpZgorI2lmbmRlZiBOREFUQQorI2RlZmluZSBOREFUQSAxMDAwMDAwCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgYmVuY2goaW50IG5mZnQsYm9vbCBmd2QsYm9vbCB1bnNjYWxlZD1mYWxzZSwgYm9vbCBoYWxmc3BlYz1mYWxzZSkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBDb21wbGV4OworICAgIGludCBuaXRzID0gTkRBVEEvbmZmdDsKKyAgICB2ZWN0b3I8VD4gaW5idWYobmZmdCk7CisgICAgdmVjdG9yPENvbXBsZXggPiBvdXRidWYobmZmdCk7CisgICAgRkZUPCBTY2FsYXIgPiBmZnQ7CisKKyAgICBpZiAodW5zY2FsZWQpIHsKKyAgICAgICAgZmZ0LlNldEZsYWcoZmZ0LlVuc2NhbGVkKTsKKyAgICAgICAgY291dCA8PCAidW5zY2FsZWQgIjsKKyAgICB9CisgICAgaWYgKGhhbGZzcGVjKSB7CisgICAgICAgIGZmdC5TZXRGbGFnKGZmdC5IYWxmU3BlY3RydW0pOworICAgICAgICBjb3V0IDw8ICJoYWxmc3BlYyAiOworICAgIH0KKworCisgICAgc3RkOjpmaWxsKGluYnVmLmJlZ2luKCksaW5idWYuZW5kKCksMCk7CisgICAgZmZ0LmZ3ZCggb3V0YnVmICwgaW5idWYpOworCisgICAgQmVuY2hUaW1lciB0aW1lcjsKKyAgICB0aW1lci5yZXNldCgpOworICAgIGZvciAoaW50IGs9MDtrPDg7KytrKSB7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgIGlmIChmd2QpCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbml0czsgaSsrKQorICAgICAgICAgICAgICAgIGZmdC5md2QoIG91dGJ1ZiAsIGluYnVmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG5pdHM7IGkrKykKKyAgICAgICAgICAgICAgICBmZnQuaW52KGluYnVmLG91dGJ1Zik7CisgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICB9CisKKyAgICBjb3V0IDw8IG5hbWVvZjxTY2FsYXI+KCkgPDwgIiAiOworICAgIGRvdWJsZSBtZmxvcHMgPSA1LipuZmZ0KmxvZzIoKGRvdWJsZSluZmZ0KSAvICgxZTYgKiB0aW1lci52YWx1ZSgpIC8gKGRvdWJsZSluaXRzICk7CisgICAgaWYgKCBOdW1UcmFpdHM8VD46OklzQ29tcGxleCApIHsKKyAgICAgICAgY291dCA8PCAiY29tcGxleCI7CisgICAgfWVsc2V7CisgICAgICAgIGNvdXQgPDwgInJlYWwgICAiOworICAgICAgICBtZmxvcHMgLz0gMjsKKyAgICB9CisKKworICAgIGlmIChmd2QpCisgICAgICAgIGNvdXQgPDwgIiBmd2QiOworICAgIGVsc2UKKyAgICAgICAgY291dCA8PCAiIGludiI7CisKKyAgICBjb3V0IDw8ICIgTkZGVD0iIDw8IG5mZnQgPDwgIiAgIiA8PCAoZG91YmxlKDFlLTYqbmZmdCpuaXRzKS90aW1lci52YWx1ZSgpKSA8PCAiIE1TL3MgICIgPDwgbWZsb3BzIDw8ICJNRkxPUFNcbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiogYXJndikKK3sKKyAgICBiZW5jaDxjb21wbGV4PGZsb2F0PiA+KE5GRlQsdHJ1ZSk7CisgICAgYmVuY2g8Y29tcGxleDxmbG9hdD4gPihORkZULGZhbHNlKTsKKyAgICBiZW5jaDxmbG9hdD4oTkZGVCx0cnVlKTsKKyAgICBiZW5jaDxmbG9hdD4oTkZGVCxmYWxzZSk7CisgICAgYmVuY2g8ZmxvYXQ+KE5GRlQsZmFsc2UsdHJ1ZSk7CisgICAgYmVuY2g8ZmxvYXQ+KE5GRlQsZmFsc2UsdHJ1ZSx0cnVlKTsKKworICAgIGJlbmNoPGNvbXBsZXg8ZG91YmxlPiA+KE5GRlQsdHJ1ZSk7CisgICAgYmVuY2g8Y29tcGxleDxkb3VibGU+ID4oTkZGVCxmYWxzZSk7CisgICAgYmVuY2g8ZG91YmxlPihORkZULHRydWUpOworICAgIGJlbmNoPGRvdWJsZT4oTkZGVCxmYWxzZSk7CisgICAgYmVuY2g8Y29tcGxleDxsb25nIGRvdWJsZT4gPihORkZULHRydWUpOworICAgIGJlbmNoPGNvbXBsZXg8bG9uZyBkb3VibGU+ID4oTkZGVCxmYWxzZSk7CisgICAgYmVuY2g8bG9uZyBkb3VibGU+KE5GRlQsdHJ1ZSk7CisgICAgYmVuY2g8bG9uZyBkb3VibGU+KE5GRlQsZmFsc2UpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hHZW9tZXRyeS5jcHAgYi9iZW5jaC9iZW5jaEdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTE2YzAzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hHZW9tZXRyeS5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAwMAorI2VuZGlmCisKK2VudW0gZnVuY19vcHQKK3sKKyAgICBUViwKKyAgICBUTUFUViwKKyAgICBUTUFUVk1BVCwKK307CisKKwordGVtcGxhdGUgPGNsYXNzIHJlcywgY2xhc3MgYXJnMSwgY2xhc3MgYXJnMiwgaW50IG9wdD4KK3N0cnVjdCBmdW5jOworCit0ZW1wbGF0ZSA8Y2xhc3MgcmVzLCBjbGFzcyBhcmcxLCBjbGFzcyBhcmcyPgorc3RydWN0IGZ1bmM8cmVzLCBhcmcxLCBhcmcyLCBUVj4KK3sKKyAgICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgcmVzIHJ1biggYXJnMSYgYTEsIGFyZzImIGEyICkKKyAgICB7CisJYXNtICgiIik7CisJcmV0dXJuIGExICogYTI7CisgICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIHJlcywgY2xhc3MgYXJnMSwgY2xhc3MgYXJnMj4KK3N0cnVjdCBmdW5jPHJlcywgYXJnMSwgYXJnMiwgVE1BVFY+Cit7CisgICAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHJlcyBydW4oIGFyZzEmIGExLCBhcmcyJiBhMiApCisgICAgeworCWFzbSAoIiIpOworCXJldHVybiBhMS5tYXRyaXgoKSAqIGEyOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyByZXMsIGNsYXNzIGFyZzEsIGNsYXNzIGFyZzI+CitzdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRNQVRWTUFUPgoreworICAgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKCBhcmcxJiBhMSwgYXJnMiYgYTIgKQorICAgIHsKKwlhc20gKCIiKTsKKwlyZXR1cm4gcmVzKGExLm1hdHJpeCgpICogYTIubWF0cml4KCkpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBmdW5jLCBjbGFzcyBhcmcxLCBjbGFzcyBhcmcyPgorc3RydWN0IHRlc3RfdHJhbnNmb3JtCit7CisgICAgc3RhdGljIHZvaWQgcnVuKCkKKyAgICB7CisJYXJnMSBhMTsKKwlhMS5zZXRJZGVudGl0eSgpOworCWFyZzIgYTI7CisJYTIuc2V0SWRlbnRpdHkoKTsKKworCUJlbmNoVGltZXIgdGltZXI7CisJdGltZXIucmVzZXQoKTsKKwlmb3IgKGludCBrPTA7IGs8MTA7ICsraykKKwl7CisJICAgIHRpbWVyLnN0YXJ0KCk7CisJICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKwkJYTIgPSBmdW5jOjpydW4oIGExLCBhMiApOworCSAgICB0aW1lci5zdG9wKCk7CisJfQorCWNvdXQgPDwgc2V0cHJlY2lzaW9uKDQpIDw8IGZpeGVkIDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICIgPDwgZW5kbDs7CisgICAgfQorfTsKKworCisjZGVmaW5lIHJ1bl92ZWMoIG9wLCBzY2FsYXIsIG1vZGUsIG9wdGlvbiwgdnNpemUgKSBcCisgICAgc3RkOjpjb3V0IDw8ICNzY2FsYXIgPDwgIlx0ICIgPDwgI21vZGUgPDwgIlx0ICIgPDwgI29wdGlvbiA8PCAiICIgPDwgI3ZzaXplICIgIjsgXAorICAgIHtcCisJdHlwZWRlZiBUcmFuc2Zvcm08c2NhbGFyLCAzLCBtb2RlLCBvcHRpb24+IFRyYW5zO1wKKwl0eXBlZGVmIE1hdHJpeDxzY2FsYXIsIHZzaXplLCAxLCBvcHRpb24+IFZlYztcCisJdHlwZWRlZiBmdW5jPFZlYyxUcmFucyxWZWMsb3A+IEZ1bmM7XAorCXRlc3RfdHJhbnNmb3JtPCBGdW5jLCBUcmFucywgVmVjID46OnJ1bigpO1wKKyAgICB9CisKKyNkZWZpbmUgcnVuX3RyYW5zKCBvcCwgc2NhbGFyLCBtb2RlLCBvcHRpb24gKSBcCisgICAgc3RkOjpjb3V0IDw8ICNzY2FsYXIgPDwgIlx0ICIgPDwgI21vZGUgPDwgIlx0ICIgPDwgI29wdGlvbiA8PCAiICAgIjsgXAorICAgIHtcCisJdHlwZWRlZiBUcmFuc2Zvcm08c2NhbGFyLCAzLCBtb2RlLCBvcHRpb24+IFRyYW5zO1wKKwl0eXBlZGVmIGZ1bmM8VHJhbnMsVHJhbnMsVHJhbnMsb3A+IEZ1bmM7XAorCXRlc3RfdHJhbnNmb3JtPCBGdW5jLCBUcmFucywgVHJhbnMgPjo6cnVuKCk7XAorICAgIH0KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgICBjb3V0IDw8ICJ2ZWMgPSB0cmFucyAqIHZlYyIgPDwgZW5kbDsKKyAgICBydW5fdmVjKFRWLCBmbG9hdCwgIElzb21ldHJ5LCBBdXRvQWxpZ24sIDMpOworICAgIHJ1bl92ZWMoVFYsIGZsb2F0LCAgSXNvbWV0cnksIERvbnRBbGlnbiwgMyk7CisgICAgcnVuX3ZlYyhUViwgZmxvYXQsICBJc29tZXRyeSwgQXV0b0FsaWduLCA0KTsKKyAgICBydW5fdmVjKFRWLCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24sIDQpOworICAgIHJ1bl92ZWMoVFYsIGZsb2F0LCAgUHJvamVjdGl2ZSwgQXV0b0FsaWduLCA0KTsKKyAgICBydW5fdmVjKFRWLCBmbG9hdCwgIFByb2plY3RpdmUsIERvbnRBbGlnbiwgNCk7CisgICAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgQXV0b0FsaWduLCAzKTsKKyAgICBydW5fdmVjKFRWLCBkb3VibGUsIElzb21ldHJ5LCBEb250QWxpZ24sIDMpOworICAgIHJ1bl92ZWMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbiwgNCk7CisgICAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCA0KTsKKyAgICBydW5fdmVjKFRWLCBkb3VibGUsIFByb2plY3RpdmUsIEF1dG9BbGlnbiwgNCk7CisgICAgcnVuX3ZlYyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBEb250QWxpZ24sIDQpOworCisgICAgY291dCA8PCAidmVjID0gdHJhbnMubWF0cml4KCkgKiB2ZWMiIDw8IGVuZGw7CisgICAgcnVuX3ZlYyhUTUFUViwgZmxvYXQsICBJc29tZXRyeSwgQXV0b0FsaWduLCA0KTsKKyAgICBydW5fdmVjKFRNQVRWLCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24sIDQpOworICAgIHJ1bl92ZWMoVE1BVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbiwgNCk7CisgICAgcnVuX3ZlYyhUTUFUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCA0KTsKKworICAgIGNvdXQgPDwgInRyYW5zID0gdHJhbnMxICogdHJhbnMiIDw8IGVuZGw7CisgICAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgIElzb21ldHJ5LCBBdXRvQWxpZ24pOworICAgIHJ1bl90cmFucyhUViwgZmxvYXQsICBJc29tZXRyeSwgRG9udEFsaWduKTsKKyAgICBydW5fdHJhbnMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgICAgcnVuX3RyYW5zKFRWLCBkb3VibGUsIElzb21ldHJ5LCBEb250QWxpZ24pOworICAgIHJ1bl90cmFucyhUViwgZmxvYXQsICBQcm9qZWN0aXZlLCBBdXRvQWxpZ24pOworICAgIHJ1bl90cmFucyhUViwgZmxvYXQsICBQcm9qZWN0aXZlLCBEb250QWxpZ24pOworICAgIHJ1bl90cmFucyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBBdXRvQWxpZ24pOworICAgIHJ1bl90cmFucyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBEb250QWxpZ24pOworCisgICAgY291dCA8PCAidHJhbnMgPSB0cmFuczEubWF0cml4KCkgKiB0cmFucy5tYXRyaXgoKSIgPDwgZW5kbDsKKyAgICBydW5fdHJhbnMoVE1BVFZNQVQsIGZsb2F0LCAgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgICAgcnVuX3RyYW5zKFRNQVRWTUFULCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24pOworICAgIHJ1bl90cmFucyhUTUFUVk1BVCwgZG91YmxlLCBJc29tZXRyeSwgQXV0b0FsaWduKTsKKyAgICBydW5fdHJhbnMoVE1BVFZNQVQsIGRvdWJsZSwgSXNvbWV0cnksIERvbnRBbGlnbik7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoVmVjQWRkLmNwcCBiL2JlbmNoL2JlbmNoVmVjQWRkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThlMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hWZWNBZGQuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgNTAKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAKKyNlbmRpZgorCit0eXBlZGVmIGZsb2F0IFNjYWxhcjsKKworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdm9pZCBiZW5jaFZlYyhTY2FsYXIqIGEsIFNjYWxhciogYiwgU2NhbGFyKiBjLCBpbnQgc2l6ZSk7CitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoVmVjKE1hdHJpeFhmJiBhLCBNYXRyaXhYZiYgYiwgTWF0cml4WGYmIGMpOworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdm9pZCBiZW5jaFZlYyhWZWN0b3JYZiYgYSwgVmVjdG9yWGYmIGIsIFZlY3RvclhmJiBjKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgICBpbnQgc2l6ZSA9IFNJWkUgKiA4OworICAgIGludCBzaXplMiA9IHNpemUgKiBzaXplOworICAgIFNjYWxhciogYSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUyKTsKKyAgICBTY2FsYXIqIGIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMis0KSsxOworICAgIFNjYWxhciogYyA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUyKTsgCisgICAgCisgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICAgIGFbaV0gPSBiW2ldID0gY1tpXSA9IDA7CisgICAgfQorICAgIAorICAgIEJlbmNoVGltZXIgdGltZXI7CisgICAgCisgICAgdGltZXIucmVzZXQoKTsKKyAgICBmb3IgKGludCBrPTA7IGs8MTA7ICsraykKKyAgICB7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgIGJlbmNoVmVjKGEsIGIsIGMsIHNpemUyKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgdGltZXIudmFsdWUoKSA8PCAicyAgIiA8PCAoZG91YmxlKHNpemUyKlJFUEVBVCkvdGltZXIudmFsdWUoKSkvKDEwMjQuKjEwMjQuKjEwMjQuKSA8PCAiIEdGbG9wc1xuIjsKKyAgICByZXR1cm4gMDsKKyAgICBmb3IgKGludCBpbm5lcnNpemUgPSBzaXplOyBpbm5lcnNpemU+MiA7IC0taW5uZXJzaXplKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUyJWlubmVyc2l6ZT09MCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG91dGVyc2l6ZSA9IHNpemUyL2lubmVyc2l6ZTsKKyAgICAgICAgICAgIE1hdHJpeFhmIG1hID0gTWFwPE1hdHJpeFhmPihhLCBpbm5lcnNpemUsIG91dGVyc2l6ZSApOworICAgICAgICAgICAgTWF0cml4WGYgbWIgPSBNYXA8TWF0cml4WGY+KGIsIGlubmVyc2l6ZSwgb3V0ZXJzaXplICk7CisgICAgICAgICAgICBNYXRyaXhYZiBtYyA9IE1hcDxNYXRyaXhYZj4oYywgaW5uZXJzaXplLCBvdXRlcnNpemUgKTsKKyAgICAgICAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8MzsgKytrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgYmVuY2hWZWMobWEsIG1iLCBtYyk7CisgICAgICAgICAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGlubmVyc2l6ZSA8PCAiIHggIiA8PCBvdXRlcnNpemUgPDwgIiAgIiA8PCB0aW1lci52YWx1ZSgpIDw8ICJzICAgIiA8PCAoZG91YmxlKHNpemUyKlJFUEVBVCkvdGltZXIudmFsdWUoKSkvKDEwMjQuKjEwMjQuKjEwMjQuKSA8PCAiIEdGbG9wc1xuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBWZWN0b3JYZiB2YSA9IE1hcDxWZWN0b3JYZj4oYSwgc2l6ZTIpOworICAgIFZlY3RvclhmIHZiID0gTWFwPFZlY3RvclhmPihiLCBzaXplMik7CisgICAgVmVjdG9yWGYgdmMgPSBNYXA8VmVjdG9yWGY+KGMsIHNpemUyKTsKKyAgICB0aW1lci5yZXNldCgpOworICAgIGZvciAoaW50IGs9MDsgazwzOyArK2spCisgICAgeworICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICBiZW5jaFZlYyh2YSwgdmIsIHZjKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgdGltZXIudmFsdWUoKSA8PCAicyAgICIgPDwgKGRvdWJsZShzaXplMipSRVBFQVQpL3RpbWVyLnZhbHVlKCkpLygxMDI0LioxMDI0LioxMDI0LikgPDwgIiBHRmxvcHNcbiI7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBiZW5jaFZlYyhNYXRyaXhYZiYgYSwgTWF0cml4WGYmIGIsIE1hdHJpeFhmJiBjKQoreworICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgYSA9IGEgKyBiOworfQorCit2b2lkIGJlbmNoVmVjKFZlY3RvclhmJiBhLCBWZWN0b3JYZiYgYiwgVmVjdG9yWGYmIGMpCit7CisgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBhID0gYSArIGI7Cit9CisKK3ZvaWQgYmVuY2hWZWMoU2NhbGFyKiBhLCBTY2FsYXIqIGIsIFNjYWxhciogYywgaW50IHNpemUpCit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgICAgUGFja2V0U2NhbGFyIGEwLCBhMSwgYTIsIGEzLCBiMCwgYjEsIGIyLCBiMzsKKyAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKz1QYWNrZXRTaXplKjgpCisgICAgICAgIHsKKy8vICAgICAgICAgICAgIGEwID0gaW50ZXJuYWw6OnBsb2FkKCZhW2ldKTsKKy8vICAgICAgICAgICAgIGIwID0gaW50ZXJuYWw6OnBsb2FkKCZiW2ldKTsKKy8vICAgICAgICAgICAgIGExID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krMSpQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBiMSA9IGludGVybmFsOjpwbG9hZCgmYltpKzEqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYTIgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSsyKlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGIyID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krMipQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBhMyA9IGludGVybmFsOjpwbG9hZCgmYVtpKzMqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYjMgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSszKlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaV0sIGludGVybmFsOjpwYWRkKGEwLCBiMCkpOworLy8gICAgICAgICAgICAgYTAgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSs0KlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGIwID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krNCpQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICAKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSsxKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMSwgYjEpKTsKKy8vICAgICAgICAgICAgIGExID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNSpQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBiMSA9IGludGVybmFsOjpwbG9hZCgmYltpKzUqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgCisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krMipQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTIsIGIyKSk7CisvLyAgICAgICAgICAgICBhMiA9IGludGVybmFsOjpwbG9hZCgmYVtpKzYqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYjIgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSs2KlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIAorLy8gICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzMqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGEzLCBiMykpOworLy8gICAgICAgICAgICAgYTMgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSs3KlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGIzID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krNypQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICAKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs0KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMCwgYjApKTsKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs1KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMSwgYjEpKTsKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs2KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMiwgYjIpKTsKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs3KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMywgYjMpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzIqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSsyKlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzIqUGFja2V0U2l6ZV0pKSk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krMypQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzMqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krMypQYWNrZXRTaXplXSkpKTsKKyAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs0KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krNCpQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSs0KlBhY2tldFNpemVdKSkpOworICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzUqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSs1KlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzUqUGFja2V0U2l6ZV0pKSk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNipQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzYqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krNipQYWNrZXRTaXplXSkpKTsKKyAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs3KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krNypQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSs3KlBhY2tldFNpemVdKSkpOworICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9nZW1tLmNwcCBiL2JlbmNoL2JlbmNoX2dlbW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjhjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaF9nZW1tLmNwcApAQCAtMCwwICsxLDM0MCBAQAorCisvLyBnKystNC40IGJlbmNoX2dlbW0uY3BwIC1JIC4uIC1PMiAtRE5ERUJVRyAtbHJ0IC1mb3Blbm1wICYmIE9NUF9OVU1fVEhSRUFEUz0yICAuL2Eub3V0CisvLyBpY3BjIGJlbmNoX2dlbW0uY3BwIC1JIC4uIC1PMyAtRE5ERUJVRyAtbHJ0IC1vcGVubXAgICYmIE9NUF9OVU1fVEhSRUFEUz0yICAuL2Eub3V0CisKKy8vIENvbXBpbGF0aW9uIG9wdGlvbnM6CisvLyAKKy8vIC1EU0NBTEFSPXN0ZDo6Y29tcGxleDxkb3VibGU+CisvLyAtRFNDQUxBUkE9ZG91YmxlIG9yIC1EU0NBTEFSQj1kb3VibGUKKy8vIC1ESEFWRV9CTEFTCisvLyAtRERFQ09VUExFRAorLy8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFNDQUxBUgorLy8gI2RlZmluZSBTQ0FMQVIgc3RkOjpjb21wbGV4PGZsb2F0PgorI2RlZmluZSBTQ0FMQVIgZmxvYXQKKyNlbmRpZgorCisjaWZuZGVmIFNDQUxBUkEKKyNkZWZpbmUgU0NBTEFSQSBTQ0FMQVIKKyNlbmRpZgorCisjaWZuZGVmIFNDQUxBUkIKKyNkZWZpbmUgU0NBTEFSQiBTQ0FMQVIKKyNlbmRpZgorCit0eXBlZGVmIFNDQUxBUiBTY2FsYXI7Cit0eXBlZGVmIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Cit0eXBlZGVmIE1hdHJpeDxTQ0FMQVJBLER5bmFtaWMsRHluYW1pYz4gQTsKK3R5cGVkZWYgTWF0cml4PFNDQUxBUkIsRHluYW1pYyxEeW5hbWljPiBCOwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQzsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNOworCisjaWZkZWYgSEFWRV9CTEFTCisKK2V4dGVybiAiQyIgeworICAjaW5jbHVkZSA8RWlnZW4vc3JjL21pc2MvYmxhcy5oPgorfQorCitzdGF0aWMgZmxvYXQgZm9uZSA9IDE7CitzdGF0aWMgZmxvYXQgZnplcm8gPSAwOworc3RhdGljIGRvdWJsZSBkb25lID0gMTsKK3N0YXRpYyBkb3VibGUgc3plcm8gPSAwOworc3RhdGljIHN0ZDo6Y29tcGxleDxmbG9hdD4gY2ZvbmUgPSAxOworc3RhdGljIHN0ZDo6Y29tcGxleDxmbG9hdD4gY2Z6ZXJvID0gMDsKK3N0YXRpYyBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBjZG9uZSA9IDE7CitzdGF0aWMgc3RkOjpjb21wbGV4PGRvdWJsZT4gY2R6ZXJvID0gMDsKK3N0YXRpYyBjaGFyIG5vdHJhbnMgPSAnTic7CitzdGF0aWMgY2hhciB0cmFucyA9ICdUJzsgIAorc3RhdGljIGNoYXIgbm9udW5pdCA9ICdOJzsKK3N0YXRpYyBjaGFyIGxvd2VyID0gJ0wnOworc3RhdGljIGNoYXIgcmlnaHQgPSAnUic7CitzdGF0aWMgaW50IGludG9uZSA9IDE7CisKK3ZvaWQgYmxhc19nZW1tKGNvbnN0IE1hdHJpeFhmJiBhLCBjb25zdCBNYXRyaXhYZiYgYiwgTWF0cml4WGYmIGMpCit7CisgIGludCBNID0gYy5yb3dzKCk7IGludCBOID0gYy5jb2xzKCk7IGludCBLID0gYS5jb2xzKCk7CisgIGludCBsZGEgPSBhLnJvd3MoKTsgaW50IGxkYiA9IGIucm93cygpOyBpbnQgbGRjID0gYy5yb3dzKCk7CisKKyAgc2dlbW1fKCZub3RyYW5zLCZub3RyYW5zLCZNLCZOLCZLLCZmb25lLAorICAgICAgICAgY29uc3RfY2FzdDxmbG9hdCo+KGEuZGF0YSgpKSwmbGRhLAorICAgICAgICAgY29uc3RfY2FzdDxmbG9hdCo+KGIuZGF0YSgpKSwmbGRiLCZmb25lLAorICAgICAgICAgYy5kYXRhKCksJmxkYyk7Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYmxhc19nZW1tKGNvbnN0IE1hdHJpeFhkJiBhLCBjb25zdCBNYXRyaXhYZCYgYiwgTWF0cml4WGQmIGMpCit7CisgIGludCBNID0gYy5yb3dzKCk7IGludCBOID0gYy5jb2xzKCk7IGludCBLID0gYS5jb2xzKCk7CisgIGludCBsZGEgPSBhLnJvd3MoKTsgaW50IGxkYiA9IGIucm93cygpOyBpbnQgbGRjID0gYy5yb3dzKCk7CisKKyAgZGdlbW1fKCZub3RyYW5zLCZub3RyYW5zLCZNLCZOLCZLLCZkb25lLAorICAgICAgICAgY29uc3RfY2FzdDxkb3VibGUqPihhLmRhdGEoKSksJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oYi5kYXRhKCkpLCZsZGIsJmRvbmUsCisgICAgICAgICBjLmRhdGEoKSwmbGRjKTsKK30KKwordm9pZCBibGFzX2dlbW0oY29uc3QgTWF0cml4WGNmJiBhLCBjb25zdCBNYXRyaXhYY2YmIGIsIE1hdHJpeFhjZiYgYykKK3sKKyAgaW50IE0gPSBjLnJvd3MoKTsgaW50IE4gPSBjLmNvbHMoKTsgaW50IEsgPSBhLmNvbHMoKTsKKyAgaW50IGxkYSA9IGEucm93cygpOyBpbnQgbGRiID0gYi5yb3dzKCk7IGludCBsZGMgPSBjLnJvd3MoKTsKKworICBjZ2VtbV8oJm5vdHJhbnMsJm5vdHJhbnMsJk0sJk4sJkssKGZsb2F0KikmY2ZvbmUsCisgICAgICAgICBjb25zdF9jYXN0PGZsb2F0Kj4oKGNvbnN0IGZsb2F0KilhLmRhdGEoKSksJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPigoY29uc3QgZmxvYXQqKWIuZGF0YSgpKSwmbGRiLChmbG9hdCopJmNmb25lLAorICAgICAgICAgKGZsb2F0KiljLmRhdGEoKSwmbGRjKTsKK30KKwordm9pZCBibGFzX2dlbW0oY29uc3QgTWF0cml4WGNkJiBhLCBjb25zdCBNYXRyaXhYY2QmIGIsIE1hdHJpeFhjZCYgYykKK3sKKyAgaW50IE0gPSBjLnJvd3MoKTsgaW50IE4gPSBjLmNvbHMoKTsgaW50IEsgPSBhLmNvbHMoKTsKKyAgaW50IGxkYSA9IGEucm93cygpOyBpbnQgbGRiID0gYi5yb3dzKCk7IGludCBsZGMgPSBjLnJvd3MoKTsKKworICB6Z2VtbV8oJm5vdHJhbnMsJm5vdHJhbnMsJk0sJk4sJkssKGRvdWJsZSopJmNkb25lLAorICAgICAgICAgY29uc3RfY2FzdDxkb3VibGUqPigoY29uc3QgZG91YmxlKilhLmRhdGEoKSksJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oKGNvbnN0IGRvdWJsZSopYi5kYXRhKCkpLCZsZGIsKGRvdWJsZSopJmNkb25lLAorICAgICAgICAgKGRvdWJsZSopYy5kYXRhKCksJmxkYyk7Cit9CisKKworCisjZW5kaWYKKwordm9pZCBtYXRsYWJfY3BseF9jcGx4KGNvbnN0IE0mIGFyLCBjb25zdCBNJiBhaSwgY29uc3QgTSYgYnIsIGNvbnN0IE0mIGJpLCBNJiBjciwgTSYgY2kpCit7CisgIGNyLm5vYWxpYXMoKSArPSBhciAqIGJyOworICBjci5ub2FsaWFzKCkgLT0gYWkgKiBiaTsKKyAgY2kubm9hbGlhcygpICs9IGFyICogYmk7CisgIGNpLm5vYWxpYXMoKSArPSBhaSAqIGJyOworfQorCit2b2lkIG1hdGxhYl9yZWFsX2NwbHgoY29uc3QgTSYgYSwgY29uc3QgTSYgYnIsIGNvbnN0IE0mIGJpLCBNJiBjciwgTSYgY2kpCit7CisgIGNyLm5vYWxpYXMoKSArPSBhICogYnI7CisgIGNpLm5vYWxpYXMoKSArPSBhICogYmk7Cit9CisKK3ZvaWQgbWF0bGFiX2NwbHhfcmVhbChjb25zdCBNJiBhciwgY29uc3QgTSYgYWksIGNvbnN0IE0mIGIsIE0mIGNyLCBNJiBjaSkKK3sKKyAgY3Iubm9hbGlhcygpICs9IGFyICogYjsKKyAgY2kubm9hbGlhcygpICs9IGFpICogYjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgQz4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBDJiBjKQoreworIGMubm9hbGlhcygpICs9IGEgKiBiOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICBzdGQ6OnB0cmRpZmZfdCBsMSA9IGludGVybmFsOjpxdWVyeUwxQ2FjaGVTaXplKCk7CisgIHN0ZDo6cHRyZGlmZl90IGwyID0gaW50ZXJuYWw6OnF1ZXJ5VG9wTGV2ZWxDYWNoZVNpemUoKTsKKyAgc3RkOjpjb3V0IDw8ICJMMSBjYWNoZSBzaXplICAgICA9ICIgPDwgKGwxPjAgPyBsMS8xMDI0IDogLTEpIDw8ICIgS0JcbiI7CisgIHN0ZDo6Y291dCA8PCAiTDIvTDMgY2FjaGUgc2l6ZSAgPSAiIDw8IChsMj4wID8gbDIvMTAyNCA6IC0xKSA8PCAiIEtCXG4iOworICB0eXBlZGVmIGludGVybmFsOjpnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgIHN0ZDo6Y291dCA8PCAiUmVnaXN0ZXIgYmxvY2tpbmcgPSAiIDw8IFRyYWl0czo6bXIgPDwgIiB4ICIgPDwgVHJhaXRzOjpuciA8PCAiXG4iOworCisgIGludCByZXAgPSAxOyAgICAvLyBudW1iZXIgb2YgcmVwZXRpdGlvbnMgcGVyIHRyeQorICBpbnQgdHJpZXMgPSAyOyAgLy8gbnVtYmVyIG9mIHRyaWVzLCB3ZSBrZWVwIHRoZSBiZXN0CisKKyAgaW50IHMgPSAyMDQ4OworICBpbnQgbSA9IHM7CisgIGludCBuID0gczsKKyAgaW50IHAgPSBzOworICBpbnQgY2FjaGVfc2l6ZTE9LTEsIGNhY2hlX3NpemUyPWwyLCBjYWNoZV9zaXplMyA9IDA7CisKKyAgYm9vbCBuZWVkX2hlbHAgPSBmYWxzZTsKKyAgZm9yIChpbnQgaT0xOyBpPGFyZ2M7KQorICB7CisgICAgaWYoYXJndltpXVswXT09Jy0nKQorICAgIHsKKyAgICAgIGlmKGFyZ3ZbaV1bMV09PSdzJykKKyAgICAgIHsKKyAgICAgICAgKytpOworICAgICAgICBzID0gYXRvaShhcmd2W2krK10pOworICAgICAgICBtID0gbiA9IHAgPSBzOworICAgICAgICBpZihhcmd2W2ldWzBdIT0nLScpCisgICAgICAgIHsKKyAgICAgICAgICBuID0gYXRvaShhcmd2W2krK10pOworICAgICAgICAgIHAgPSBhdG9pKGFyZ3ZbaSsrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoYXJndltpXVsxXT09J2MnKQorICAgICAgeworICAgICAgICArK2k7CisgICAgICAgIGNhY2hlX3NpemUxID0gYXRvaShhcmd2W2krK10pOworICAgICAgICBpZihhcmd2W2ldWzBdIT0nLScpCisgICAgICAgIHsKKyAgICAgICAgICBjYWNoZV9zaXplMiA9IGF0b2koYXJndltpKytdKTsKKyAgICAgICAgICBpZihhcmd2W2ldWzBdIT0nLScpCisgICAgICAgICAgICBjYWNoZV9zaXplMyA9IGF0b2koYXJndltpKytdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZihhcmd2W2ldWzFdPT0ndCcpCisgICAgICB7CisgICAgICAgICsraTsKKyAgICAgICAgdHJpZXMgPSBhdG9pKGFyZ3ZbaSsrXSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGFyZ3ZbaV1bMV09PSdwJykKKyAgICAgIHsKKyAgICAgICAgKytpOworICAgICAgICByZXAgPSBhdG9pKGFyZ3ZbaSsrXSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBuZWVkX2hlbHAgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYobmVlZF9oZWxwKQorICB7CisgICAgc3RkOjpjb3V0IDw8IGFyZ3ZbMF0gPDwgIiAtcyA8bWF0cml4IHNpemVzPiAtYyA8Y2FjaGUgc2l6ZXM+IC10IDxuYiB0cmllcz4gLXAgPG5iIHJlcGVhdHM+XG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgPG1hdHJpeCBzaXplcz4gOiBzaXplXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgPG1hdHJpeCBzaXplcz4gOiByb3dzIGNvbHVtbnMgZGVwdGhcbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworI2lmIEVJR0VOX1ZFUlNJT05fQVRfTEVBU1QoMywyLDkwKQorICBpZihjYWNoZV9zaXplMT4wKQorICAgIHNldENwdUNhY2hlU2l6ZXMoY2FjaGVfc2l6ZTEsY2FjaGVfc2l6ZTIsY2FjaGVfc2l6ZTMpOworI2VuZGlmCisgIAorICBBIGEobSxwKTsgYS5zZXRSYW5kb20oKTsKKyAgQiBiKHAsbik7IGIuc2V0UmFuZG9tKCk7CisgIEMgYyhtLG4pOyBjLnNldE9uZXMoKTsKKyAgQyByYyA9IGM7CisKKyAgc3RkOjpjb3V0IDw8ICJNYXRyaXggc2l6ZXMgPSAiIDw8IG0gPDwgIngiIDw8IHAgPDwgIiAqICIgPDwgcCA8PCAieCIgPDwgbiA8PCAiXG4iOworICBzdGQ6OnB0cmRpZmZfdCBtYyhtKSwgbmMobiksIGtjKHApOworICBpbnRlcm5hbDo6Y29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPFNjYWxhcixTY2FsYXI+KGtjLCBtYywgbmMpOworICBzdGQ6OmNvdXQgPDwgImJsb2NraW5nIHNpemUgKG1jIHgga2MpID0gIiA8PCBtYyA8PCAiIHggIiA8PCBrYyA8PCAiXG4iOworCisgIEMgciA9IGM7CisKKyAgLy8gY2hlY2sgdGhlIHBhcmFsbGVsIHByb2R1Y3QgaXMgY29ycmVjdAorICAjaWYgZGVmaW5lZCBFSUdFTl9IQVNfT1BFTk1QCisgIEVpZ2VuOjppbml0UGFyYWxsZWwoKTsKKyAgaW50IHByb2NzID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICBpZihwcm9jcz4xKQorICB7CisgICAgI2lmZGVmIEhBVkVfQkxBUworICAgIGJsYXNfZ2VtbShhLGIscik7CisgICAgI2Vsc2UKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDEpOworICAgIHIubm9hbGlhcygpICs9IGEgKiBiOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMocHJvY3MpOworICAgICNlbmRpZgorICAgIGMubm9hbGlhcygpICs9IGEgKiBiOworICAgIGlmKCFyLmlzQXBwcm94KGMpKSBzdGQ6OmNlcnIgPDwgIldhcm5pbmcsIHlvdXIgcGFyYWxsZWwgcHJvZHVjdCBpcyBjcmFwIVxuXG4iOworICB9CisgICNlbGlmIGRlZmluZWQgSEFWRV9CTEFTCisgICAgYmxhc19nZW1tKGEsYixyKTsKKyAgICBjLm5vYWxpYXMoKSArPSBhICogYjsKKyAgICBpZighci5pc0FwcHJveChjKSkgeworICAgICAgc3RkOjpjb3V0IDw8IHIgIC0gYyA8PCAiXG4iOworICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKKyAgICB9CisgICNlbHNlCisgICAgaWYoMS4qbSpuKnA8MjAwMC4qMjAwMCoyMDAwKQorICAgIHsKKyAgICAgIGdlbW0oYSxiLGMpOworICAgICAgci5ub2FsaWFzKCkgKz0gYS5jYXN0PFNjYWxhcj4oKSAubGF6eVByb2R1Y3QoIGIuY2FzdDxTY2FsYXI+KCkgKTsKKyAgICAgIGlmKCFyLmlzQXBwcm94KGMpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCByIC0gYyA8PCAiXG4iOworICAgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmcsIHlvdXIgcHJvZHVjdCBpcyBjcmFwIVxuXG4iOworICAgICAgfQorICAgIH0KKyAgI2VuZGlmCisKKyAgI2lmZGVmIEhBVkVfQkxBUworICBCZW5jaFRpbWVyIHRibGFzOworICBjID0gcmM7CisgIEJFTkNIKHRibGFzLCB0cmllcywgcmVwLCBibGFzX2dlbW0oYSxiLGMpKTsKKyAgc3RkOjpjb3V0IDw8ICJibGFzICBjcHUgICAgICAgICAiIDw8IHRibGFzLmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdGJsYXMuYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0Ymxhcy50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmxhcyAgcmVhbCAgICAgICAgIiA8PCB0Ymxhcy5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RibGFzLmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdGJsYXMudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworICAjZW5kaWYKKworICBCZW5jaFRpbWVyIHRtdDsKKyAgYyA9IHJjOworICBCRU5DSCh0bXQsIHRyaWVzLCByZXAsIGdlbW0oYSxiLGMpKTsKKyAgc3RkOjpjb3V0IDw8ICJlaWdlbiBjcHUgICAgICAgICAiIDw8IHRtdC5iZXN0KENQVV9USU1FUikvcmVwICA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RtdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgIHN0ZDo6Y291dCA8PCAiZWlnZW4gcmVhbCAgICAgICAgIiA8PCB0bXQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90bXQuYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bXQudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworCisgICNpZmRlZiBFSUdFTl9IQVNfT1BFTk1QCisgIGlmKHByb2NzPjEpCisgIHsKKyAgICBCZW5jaFRpbWVyIHRtb25vOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMSk7CisgICAgRWlnZW46OnNldE5iVGhyZWFkcygxKTsKKyAgICBjID0gcmM7CisgICAgQkVOQ0godG1vbm8sIHRyaWVzLCByZXAsIGdlbW0oYSxiLGMpKTsKKyAgICBzdGQ6OmNvdXQgPDwgImVpZ2VuIG1vbm8gY3B1ICAgICIgPDwgdG1vbm8uYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90bW9uby5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtb25vLnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImVpZ2VuIG1vbm8gcmVhbCAgICIgPDwgdG1vbm8uYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90bW9uby5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtb25vLnRvdGFsKFJFQUxfVElNRVIpIDw8ICJzKVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIm10IHNwZWVkIHVwIHgiIDw8IHRtb25vLmJlc3QoQ1BVX1RJTUVSKSAvIHRtdC5iZXN0KFJFQUxfVElNRVIpICA8PCAiID0+ICIgPDwgKDEwMC4wKnRtb25vLmJlc3QoQ1BVX1RJTUVSKSAvIHRtdC5iZXN0KFJFQUxfVElNRVIpKS9wcm9jcyA8PCAiJVxuIjsKKyAgfQorICAjZW5kaWYKKyAgCisgIGlmKDEuKm0qbipwPDMwKjMwKjMwKQorICB7CisgICAgICBCZW5jaFRpbWVyIHRtdDsKKyAgICAgIGMgPSByYzsKKyAgICAgIEJFTkNIKHRtdCwgdHJpZXMsIHJlcCwgYy5ub2FsaWFzKCkrPWEubGF6eVByb2R1Y3QoYikpOworICAgICAgc3RkOjpjb3V0IDw8ICJsYXp5IGNwdSAgICAgICAgICIgPDwgdG10LmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG10LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdG10LnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKKyAgICAgIHN0ZDo6Y291dCA8PCAibGF6eSByZWFsICAgICAgICAiIDw8IHRtdC5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RtdC5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgIH0KKyAgCisgICNpZmRlZiBERUNPVVBMRUQKKyAgaWYoKE51bVRyYWl0czxBOjpTY2FsYXI+OjpJc0NvbXBsZXgpICYmIChOdW1UcmFpdHM8Qjo6U2NhbGFyPjo6SXNDb21wbGV4KSkKKyAgeworICAgIE0gYXIobSxwKTsgYXIuc2V0UmFuZG9tKCk7CisgICAgTSBhaShtLHApOyBhaS5zZXRSYW5kb20oKTsKKyAgICBNIGJyKHAsbik7IGJyLnNldFJhbmRvbSgpOworICAgIE0gYmkocCxuKTsgYmkuc2V0UmFuZG9tKCk7CisgICAgTSBjcihtLG4pOyBjci5zZXRSYW5kb20oKTsKKyAgICBNIGNpKG0sbik7IGNpLnNldFJhbmRvbSgpOworICAgIAorICAgIEJlbmNoVGltZXIgdDsKKyAgICBCRU5DSCh0LCB0cmllcywgcmVwLCBtYXRsYWJfY3BseF9jcGx4KGFyLGFpLGJyLGJpLGNyLGNpKSk7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIGNwdSAgICAiIDw8IHQuYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIHJlYWwgICAiIDw8IHQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgIH0KKyAgaWYoKCFOdW1UcmFpdHM8QTo6U2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoTnVtVHJhaXRzPEI6OlNjYWxhcj46OklzQ29tcGxleCkpCisgIHsKKyAgICBNIGEobSxwKTsgIGEuc2V0UmFuZG9tKCk7CisgICAgTSBicihwLG4pOyBici5zZXRSYW5kb20oKTsKKyAgICBNIGJpKHAsbik7IGJpLnNldFJhbmRvbSgpOworICAgIE0gY3IobSxuKTsgY3Iuc2V0UmFuZG9tKCk7CisgICAgTSBjaShtLG4pOyBjaS5zZXRSYW5kb20oKTsKKyAgICAKKyAgICBCZW5jaFRpbWVyIHQ7CisgICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbWF0bGFiX3JlYWxfY3BseChhLGJyLGJpLGNyLGNpKSk7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIGNwdSAgICAiIDw8IHQuYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIHJlYWwgICAiIDw8IHQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgIH0KKyAgaWYoKE51bVRyYWl0czxBOjpTY2FsYXI+OjpJc0NvbXBsZXgpICYmICghTnVtVHJhaXRzPEI6OlNjYWxhcj46OklzQ29tcGxleCkpCisgIHsKKyAgICBNIGFyKG0scCk7IGFyLnNldFJhbmRvbSgpOworICAgIE0gYWkobSxwKTsgYWkuc2V0UmFuZG9tKCk7CisgICAgTSBiKHAsbik7ICBiLnNldFJhbmRvbSgpOworICAgIE0gY3IobSxuKTsgY3Iuc2V0UmFuZG9tKCk7CisgICAgTSBjaShtLG4pOyBjaS5zZXRSYW5kb20oKTsKKyAgICAKKyAgICBCZW5jaFRpbWVyIHQ7CisgICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbWF0bGFiX2NwbHhfcmVhbChhcixhaSxiLGNyLGNpKSk7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIGNwdSAgICAiIDw8IHQuYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIHJlYWwgICAiIDw8IHQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgIH0KKyAgI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX211bHRpX2NvbXBpbGVycy5zaCBiL2JlbmNoL2JlbmNoX211bHRpX2NvbXBpbGVycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2U5MWYxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfbXVsdGlfY29tcGlsZXJzLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK2lmICgoJCMgPCAyKSk7IHRoZW4KKyAgICBlY2hvICJVc2FnZTogJDAgY29tcGlsZXJsaXN0LnR4dCBiZW5jaGZpbGUuY3BwIgorZWxzZQorCitjb21waWxlcmxpc3Q9JDEKK2JlbmNoZmlsZT0kMgorCitnPTAKK3NvdXJjZSAkY29tcGlsZXJsaXN0CisKKyMgZm9yIGVhY2ggY29tcGlsZXIsIGNvbXBpbGUgYmVuY2hmaWxlIGFuZCBydW4gdGhlIGJlbmNobWFyaworZm9yICgoIGk9MCA7IGk8ZyA7ICsraSApKSA7IGRvCisgICMgY2hlY2sgdGhlIGNvbXBpbGVyIGV4aXN0cworICBjb21waWxlcj1gZWNobyAke0NMSVNUWyRpXX0gfCBjdXQgLWQgIiAiIC1mIDFgCisgIGlmIFsgLWUgYHdoaWNoICRjb21waWxlcmAgXTsgdGhlbgorICAgIGVjaG8gIiR7Q0xJU1RbJGldfSIKKyMgICAgIGVjaG8gIiR7Q0xJU1RbJGldfSAkYmVuY2hmaWxlIC1JLi4gLW8gYmVuY2h+IgorIyAgICAgaWYgWyAtZSAuLy5iZW5jaCBdIDsgdGhlbiBybSAuYmVuY2g7IGZpCisgICAgJHtDTElTVFskaV19ICRiZW5jaGZpbGUgLUkuLiAtbyAuYmVuY2ggJiYgLi8uYmVuY2ggMj4gL2Rldi9udWxsCisgICAgZWNobyAiIgorICBlbHNlCisgICAgZWNobyAiY29tcGlsZXIgbm90IGZvdW5kOiAkY29tcGlsZXIiCisgIGZpCitkb25lCisKK2ZpCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9ub3JtLmNwcCBiL2JlbmNoL2JlbmNoX25vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaF9ub3JtLmNwcApAQCAtMCwwICsxLDM2MCBAQAorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSAiQmVuY2hUaW1lci5oIgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBzcXN1bU5vcm0oVCYgdikKK3sKKyAgcmV0dXJuIHYubm9ybSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIHN0YWJsZU5vcm0oVCYgdikKK3sKKyAgcmV0dXJuIHYuc3RhYmxlTm9ybSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGh5cG90Tm9ybShUJiB2KQoreworICByZXR1cm4gdi5oeXBvdE5vcm0oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBibHVlTm9ybShUJiB2KQoreworICByZXR1cm4gdi5ibHVlTm9ybSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGxhcGFja05vcm0oVCYgdikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOworICBpbnQgbiA9IHYuc2l6ZSgpOworICBTY2FsYXIgc2NhbGUgPSAwOworICBTY2FsYXIgc3NxID0gMTsKKyAgZm9yIChpbnQgaT0wO2k8bjsrK2kpCisgIHsKKyAgICBTY2FsYXIgYXggPSBzdGQ6OmFicyh2LmNvZWZmKGkpKTsKKyAgICBpZiAoc2NhbGUgPj0gYXgpCisgICAgeworICAgICAgc3NxICs9IG51bWV4dDo6YWJzMihheC9zY2FsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzc3EgPSBTY2FsYXIoMSkgKyBzc3EgKiBudW1leHQ6OmFiczIoc2NhbGUvYXgpOworICAgICAgc2NhbGUgPSBheDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNjYWxlICogc3RkOjpzcXJ0KHNzcSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgdHdvcGFzc05vcm0oVCYgdikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOworICBTY2FsYXIgcyA9IHYuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpOworICByZXR1cm4gcyoodi9zKS5ub3JtKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgYmwycGFzc05vcm0oVCYgdikKK3sKKyAgcmV0dXJuIHYuc3RhYmxlTm9ybSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGRpdmFjTm9ybShUJiB2KQoreworICBpbnQgbiA9di5zaXplKCkgLyAyOworICBmb3IgKGludCBpPTA7aTxuOysraSkKKyAgICB2KGkpID0gdigyKmkpKnYoMippKSArIHYoMippKzEpKnYoMippKzEpOworICBuID0gbi8yOworICB3aGlsZSAobj4wKQorICB7CisgICAgZm9yIChpbnQgaT0wO2k8bjsrK2kpCisgICAgICB2KGkpID0gdigyKmkpICsgdigyKmkrMSk7CisgICAgbiA9IG4vMjsKKyAgfQorICByZXR1cm4gc3RkOjpzcXJ0KHYoMCkpOworfQorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKK1BhY2tldDRmIHBsdChjb25zdCBQYWNrZXQ0ZiYgYSwgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9jbXBsdF9wcyhhLGIpOyB9CitQYWNrZXQyZCBwbHQoY29uc3QgUGFja2V0MmQmIGEsIFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fY21wbHRfcGQoYSxiKTsgfQorCitQYWNrZXQ0ZiBwYW5kbm90KGNvbnN0IFBhY2tldDRmJiBhLCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wcyhhLGIpOyB9CitQYWNrZXQyZCBwYW5kbm90KGNvbnN0IFBhY2tldDJkJiBhLCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wZChhLGIpOyB9CisjZW5kaWYKK30KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBwYmx1ZU5vcm0oY29uc3QgVCYgdikKK3sKKyAgI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgcmV0dXJuIHYuYmx1ZU5vcm0oKTsKKyAgI2Vsc2UKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOworCisgIHN0YXRpYyBpbnQgbm1heCA9IDA7CisgIHN0YXRpYyBTY2FsYXIgYjEsIGIyLCBzMW0sIHMybSwgb3ZlcmZsLCByYmlnLCByZWxlcnI7CisgIGludCBuOworCisgIGlmKG5tYXggPD0gMCkKKyAgeworICAgIGludCBuYmlnLCBpYmV0YSwgaXQsIGllbWluLCBpZW1heCwgaWV4cDsKKyAgICBTY2FsYXIgYWJpZywgZXBzOworCisgICAgbmJpZyAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOyAgICAgICAgICAgIC8vIGxhcmdlc3QgaW50ZWdlcgorICAgIGliZXRhID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpyYWRpeDsgLy9OdW1UcmFpdHM8U2NhbGFyPjo6QmFzZTsgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMKKyAgICBpdCAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6ZGlnaXRzOyAvL051bVRyYWl0czxTY2FsYXI+OjpNYW50aXNzYTsgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhc2UtYmV0YSBkaWdpdHMgaW4gbWFudGlzc2EKKyAgICBpZW1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluX2V4cG9uZW50OyAgLy8gbWluaW11bSBleHBvbmVudAorICAgIGllbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQ7ICAvLyBtYXhpbXVtIGV4cG9uZW50CisgICAgcmJpZyAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1heCgpOyAgICAgICAgIC8vIGxhcmdlc3QgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisKKyAgICAvLyBDaGVjayB0aGUgYmFzaWMgbWFjaGluZS1kZXBlbmRlbnQgY29uc3RhbnRzLgorICAgIGlmKGllbWluID4gMSAtIDIqaXQgfHwgMStpdD5pZW1heCB8fCAoaXQ9PTIgJiYgaWJldGE8NSkKKyAgICAgIHx8IChpdDw9NCAmJiBpYmV0YSA8PSAzICkgfHwgaXQ8MikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInRoZSBhbGdvcml0aG0gY2Fubm90IGJlIGd1YXJhbnRlZWQgb24gdGhpcyBjb21wdXRlciIpOworICAgIH0KKyAgICBpZXhwICA9IC0oKDEtaWVtaW4pLzIpOworICAgIGIxICAgID0gc3RkOjpwb3coaWJldGEsIGlleHApOyAgLy8gbG93ZXIgYm91bmRhcnkgb2YgbWlkcmFuZ2UKKyAgICBpZXhwICA9IChpZW1heCArIDEgLSBpdCkvMjsKKyAgICBiMiAgICA9IHN0ZDo6cG93KGliZXRhLGlleHApOyAgIC8vIHVwcGVyIGJvdW5kYXJ5IG9mIG1pZHJhbmdlCisKKyAgICBpZXhwICA9ICgyLWllbWluKS8yOworICAgIHMxbSAgID0gc3RkOjpwb3coaWJldGEsaWV4cCk7ICAgLy8gc2NhbGluZyBmYWN0b3IgZm9yIGxvd2VyIHJhbmdlCisgICAgaWV4cCAgPSAtICgoaWVtYXgraXQpLzIpOworICAgIHMybSAgID0gc3RkOjpwb3coaWJldGEsaWV4cCk7ICAgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHVwcGVyIHJhbmdlCisKKyAgICBvdmVyZmwgID0gcmJpZypzMm07ICAgICAgICAgIC8vIG92ZXJmb3cgYm91bmRhcnkgZm9yIGFiaWcKKyAgICBlcHMgICAgID0gc3RkOjpwb3coaWJldGEsIDEtaXQpOworICAgIHJlbGVyciAgPSBzdGQ6OnNxcnQoZXBzKTsgICAgICAvLyB0b2xlcmFuY2UgZm9yIG5lZ2xlY3RpbmcgYXNtbAorICAgIGFiaWcgICAgPSAxLjAvZXBzIC0gMS4wOworICAgIGlmIChTY2FsYXIobmJpZyk+YWJpZykgIG5tYXggPSBhYmlnOyAgLy8gbGFyZ2VzdCBzYWZlIG4KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICBubWF4ID0gbmJpZzsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGNvbnN0IGludCBwcyA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIFBhY2tldCBwYXNtbCA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KFNjYWxhcigwKSk7CisgIFBhY2tldCBwYW1lZCA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KFNjYWxhcigwKSk7CisgIFBhY2tldCBwYWJpZyA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KFNjYWxhcigwKSk7CisgIFBhY2tldCBwczJtID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4oczJtKTsKKyAgUGFja2V0IHBzMW0gPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihzMW0pOworICBQYWNrZXQgcGIyICA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KGIyKTsKKyAgUGFja2V0IHBiMSAgPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihiMSk7CisgIGZvcihpbnQgaj0wOyBqPHYuc2l6ZSgpOyBqKz1wcykKKyAgeworICAgIFBhY2tldCBheCA9IGludGVybmFsOjpwYWJzKHYudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KGopKTsKKyAgICBQYWNrZXQgYXhfczJtID0gaW50ZXJuYWw6OnBtdWwoYXgscHMybSk7CisgICAgUGFja2V0IGF4X3MxbSA9IGludGVybmFsOjpwbXVsKGF4LHBzMW0pOworICAgIFBhY2tldCBtYXNrQmlnID0gaW50ZXJuYWw6OnBsdChwYjIsYXgpOworICAgIFBhY2tldCBtYXNrU21sID0gaW50ZXJuYWw6OnBsdChheCxwYjEpOworCisvLyAgICAgUGFja2V0IG1hc2tNZWQgPSBpbnRlcm5hbDo6cGFuZChtYXNrU21sLG1hc2tCaWcpOworLy8gICAgIFBhY2tldCBzY2FsZSA9IGludGVybmFsOjpwc2V0MShTY2FsYXIoMCkpOworLy8gICAgIHNjYWxlID0gaW50ZXJuYWw6OnBvcihzY2FsZSwgaW50ZXJuYWw6OnBhbmQobWFza0JpZyxwczJtKSk7CisvLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLHBzMW0pKTsKKy8vICAgICBzY2FsZSA9IGludGVybmFsOjpwb3Ioc2NhbGUsIGludGVybmFsOjpwYW5kbm90KGludGVybmFsOjpwc2V0MShTY2FsYXIoMSkpLG1hc2tNZWQpKTsKKy8vICAgICBheCA9IGludGVybmFsOjpwbXVsKGF4LHNjYWxlKTsKKy8vICAgICBheCA9IGludGVybmFsOjpwbXVsKGF4LGF4KTsKKy8vICAgICBwYWJpZyA9IGludGVybmFsOjpwYWRkKHBhYmlnLCBpbnRlcm5hbDo6cGFuZChtYXNrQmlnLCBheCkpOworLy8gICAgIHBhc21sID0gaW50ZXJuYWw6OnBhZGQocGFzbWwsIGludGVybmFsOjpwYW5kKG1hc2tTbWwsIGF4KSk7CisvLyAgICAgcGFtZWQgPSBpbnRlcm5hbDo6cGFkZChwYW1lZCwgaW50ZXJuYWw6OnBhbmRub3QoYXgsbWFza01lZCkpOworCisKKyAgICBwYWJpZyA9IGludGVybmFsOjpwYWRkKHBhYmlnLCBpbnRlcm5hbDo6cGFuZChtYXNrQmlnLCBpbnRlcm5hbDo6cG11bChheF9zMm0sYXhfczJtKSkpOworICAgIHBhc21sID0gaW50ZXJuYWw6OnBhZGQocGFzbWwsIGludGVybmFsOjpwYW5kKG1hc2tTbWwsIGludGVybmFsOjpwbXVsKGF4X3MxbSxheF9zMW0pKSk7CisgICAgcGFtZWQgPSBpbnRlcm5hbDo6cGFkZChwYW1lZCwgaW50ZXJuYWw6OnBhbmRub3QoaW50ZXJuYWw6OnBtdWwoYXgsYXgpLGludGVybmFsOjpwYW5kKG1hc2tTbWwsbWFza0JpZykpKTsKKyAgfQorICBTY2FsYXIgYWJpZyA9IGludGVybmFsOjpwcmVkdXgocGFiaWcpOworICBTY2FsYXIgYXNtbCA9IGludGVybmFsOjpwcmVkdXgocGFzbWwpOworICBTY2FsYXIgYW1lZCA9IGludGVybmFsOjpwcmVkdXgocGFtZWQpOworICBpZihhYmlnID4gU2NhbGFyKDApKQorICB7CisgICAgYWJpZyA9IHN0ZDo6c3FydChhYmlnKTsKKyAgICBpZihhYmlnID4gb3ZlcmZsKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAib3ZlcmZsb3ciKTsKKyAgICAgIHJldHVybiByYmlnOworICAgIH0KKyAgICBpZihhbWVkID4gU2NhbGFyKDApKQorICAgIHsKKyAgICAgIGFiaWcgPSBhYmlnL3MybTsKKyAgICAgIGFtZWQgPSBzdGQ6OnNxcnQoYW1lZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gYWJpZy9zMm07CisgICAgfQorCisgIH0KKyAgZWxzZSBpZihhc21sID4gU2NhbGFyKDApKQorICB7CisgICAgaWYgKGFtZWQgPiBTY2FsYXIoMCkpCisgICAgeworICAgICAgYWJpZyA9IHN0ZDo6c3FydChhbWVkKTsKKyAgICAgIGFtZWQgPSBzdGQ6OnNxcnQoYXNtbCkgLyBzMW07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjpzcXJ0KGFzbWwpL3MxbTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIHN0ZDo6c3FydChhbWVkKTsKKyAgfQorICBhc21sID0gc3RkOjptaW4oYWJpZywgYW1lZCk7CisgIGFiaWcgPSBzdGQ6Om1heChhYmlnLCBhbWVkKTsKKyAgaWYoYXNtbCA8PSBhYmlnKnJlbGVycikKKyAgICByZXR1cm4gYWJpZzsKKyAgZWxzZQorICAgIHJldHVybiBhYmlnICogc3RkOjpzcXJ0KFNjYWxhcigxKSArIG51bWV4dDo6YWJzMihhc21sL2FiaWcpKTsKKyAgI2VuZGlmCit9CisKKyNkZWZpbmUgQkVOQ0hfUEVSRihOUk0pIHsgXAorICBmbG9hdCBhZiA9IDA7IGRvdWJsZSBhZCA9IDA7IHN0ZDo6Y29tcGxleDxmbG9hdD4gYWMgPSAwOyBcCisgIEVpZ2VuOjpCZW5jaFRpbWVyIHRmLCB0ZCwgdGNmOyB0Zi5yZXNldCgpOyB0ZC5yZXNldCgpOyB0Y2YucmVzZXQoKTtcCisgIGZvciAoaW50IGs9MDsgazx0cmllczsgKytrKSB7IFwKKyAgICB0Zi5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIHsgYWYgKz0gTlJNKHZmKTsgfSBcCisgICAgdGYuc3RvcCgpOyBcCisgIH0gXAorICBmb3IgKGludCBrPTA7IGs8dHJpZXM7ICsraykgeyBcCisgICAgdGQuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IGk9MDsgaTxpdGVyczsgKytpKSB7IGFkICs9IE5STSh2ZCk7IH0gXAorICAgIHRkLnN0b3AoKTsgXAorICB9IFwKKyAgLypmb3IgKGludCBrPTA7IGs8c3RkOjptYXgoMSx0cmllcy8zKTsgKytrKSB7IFwKKyAgICB0Y2Yuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IGk9MDsgaTxpdGVyczsgKytpKSB7IGFjICs9IE5STSh2Y2YpOyB9IFwKKyAgICB0Y2Yuc3RvcCgpOyBcCisgIH0gKi9cCisgIHN0ZDo6Y291dCA8PCAjTlJNIDw8ICJcdCIgPDwgdGYudmFsdWUoKSA8PCAiICAgIiA8PCB0ZC52YWx1ZSgpIDw8ICAiICAgICIgPDwgdGNmLnZhbHVlKCkgPDwgIlxuIjsgXAorfQorCit2b2lkIGNoZWNrX2FjY3VyYWN5KGRvdWJsZSBiYXNlZiwgZG91YmxlIGJhc2VkLCBpbnQgcykKK3sKKyAgZG91YmxlIHlmID0gYmFzZWYgKiBzdGQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSk7CisgIGRvdWJsZSB5ZCA9IGJhc2VkICogc3RkOjphYnMoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpOworICBWZWN0b3JYZiB2ZiA9IFZlY3RvclhmOjpPbmVzKHMpICogeWY7CisgIFZlY3RvclhkIHZkID0gVmVjdG9yWGQ6Ok9uZXMocykgKiB5ZDsKKworICBzdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBzdGQ6OnNxcnQoZG91YmxlKHMpKSp5ZiA8PCAiXHQiIDw8IHN0ZDo6c3FydChkb3VibGUocykpKnlkIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAic3FzdW1Ob3JtXHQiIDw8IHNxc3VtTm9ybSh2ZikgPDwgIlx0IiA8PCBzcXN1bU5vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiaHlwb3ROb3JtXHQiIDw8IGh5cG90Tm9ybSh2ZikgPDwgIlx0IiA8PCBoeXBvdE5vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmx1ZU5vcm1cdCIgPDwgYmx1ZU5vcm0odmYpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAicGJsdWVOb3JtXHQiIDw8IHBibHVlTm9ybSh2ZikgPDwgIlx0IiA8PCBwYmx1ZU5vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAibGFwYWNrTm9ybVx0IiA8PCBsYXBhY2tOb3JtKHZmKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAidHdvcGFzc05vcm1cdCIgPDwgdHdvcGFzc05vcm0odmYpIDw8ICJcdCIgPDwgdHdvcGFzc05vcm0odmQpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmwycGFzc05vcm1cdCIgPDwgYmwycGFzc05vcm0odmYpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmQpIDw8ICJcbiI7Cit9CisKK3ZvaWQgY2hlY2tfYWNjdXJhY3lfdmFyKGludCBlZjAsIGludCBlZjEsIGludCBlZDAsIGludCBlZDEsIGludCBzKQoreworICBWZWN0b3JYZiB2ZihzKTsKKyAgVmVjdG9yWGQgdmQocyk7CisgIGZvciAoaW50IGk9MDsgaTxzOyArK2kpCisgIHsKKyAgICB2ZltpXSA9IHN0ZDo6YWJzKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKSAqIHN0ZDo6cG93KGRvdWJsZSgxMCksIGludGVybmFsOjpyYW5kb208aW50PihlZjAsZWYxKSk7CisgICAgdmRbaV0gPSBzdGQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSkgKiBzdGQ6OnBvdyhkb3VibGUoMTApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oZWQwLGVkMSkpOworICB9CisKKyAgLy9zdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBpbnRlcm5hbDo6c3FydChkb3VibGUocykpKnlmIDw8ICJcdCIgPDwgaW50ZXJuYWw6OnNxcnQoZG91YmxlKHMpKSp5ZCA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInNxc3VtTm9ybVx0IiAgPDwgc3FzdW1Ob3JtKHZmKSAgPDwgIlx0IiA8PCBzcXN1bU5vcm0odmQpICA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImh5cG90Tm9ybVx0IiAgPDwgaHlwb3ROb3JtKHZmKSAgPDwgIlx0IiA8PCBoeXBvdE5vcm0odmQpICA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImJsdWVOb3JtXHQiICAgPDwgYmx1ZU5vcm0odmYpICAgPDwgIlx0IiA8PCBibHVlTm9ybSh2ZCkgICA8PCAiXHQiIDw8IGJsdWVOb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJwYmx1ZU5vcm1cdCIgIDw8IHBibHVlTm9ybSh2ZikgIDw8ICJcdCIgPDwgcGJsdWVOb3JtKHZkKSAgPDwgIlx0IiA8PCBibHVlTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGJsdWVOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAibGFwYWNrTm9ybVx0IiA8PCBsYXBhY2tOb3JtKHZmKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmQpIDw8ICJcdCIgPDwgbGFwYWNrTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJ0d29wYXNzTm9ybVx0IiA8PCB0d29wYXNzTm9ybSh2ZikgPDwgIlx0IiA8PCB0d29wYXNzTm9ybSh2ZCkgPDwgIlx0IiA8PCB0d29wYXNzTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisvLyAgIHN0ZDo6Y291dCA8PCAiYmwycGFzc05vcm1cdCIgPDwgYmwycGFzc05vcm0odmYpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmQpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCB0cmllcyA9IDEwOworICBpbnQgaXRlcnMgPSAxMDAwMDA7CisgIGRvdWJsZSB5ID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZTEyICogaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7CisgIFZlY3RvclhmIHYgPSBWZWN0b3JYZjo6T25lcygxMDI0KSAqIHk7CisKKy8vIHJldHVybiAwOworICBpbnQgcyA9IDEwMDAwOworICBkb3VibGUgYmFzZWZfb2sgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlMTU7CisgIGRvdWJsZSBiYXNlZF9vayA9IDEuMTM0NTc0MzIzMzQ1NTc4NTQ1Njc4OGU5NTsKKworICBkb3VibGUgYmFzZWZfdW5kZXIgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlLTI3OworICBkb3VibGUgYmFzZWRfdW5kZXIgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlLTMwMzsKKworICBkb3VibGUgYmFzZWZfb3ZlciA9IDEuMTM0NTc0MzIzMzQ1NTc4NTQ1Njc4OGUrMjc7CisgIGRvdWJsZSBiYXNlZF9vdmVyID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZSszMDI7CisKKyAgc3RkOjpjb3V0LnByZWNpc2lvbigyMCk7CisKKyAgc3RkOjpjZXJyIDw8ICJcbk5vIHVuZGVyL292ZXJmbG93OlxuIjsKKyAgY2hlY2tfYWNjdXJhY3koYmFzZWZfb2ssIGJhc2VkX29rLCBzKTsKKworICBzdGQ6OmNlcnIgPDwgIlxuVW5kZXJmbG93OlxuIjsKKyAgY2hlY2tfYWNjdXJhY3koYmFzZWZfdW5kZXIsIGJhc2VkX3VuZGVyLCBzKTsKKworICBzdGQ6OmNlcnIgPDwgIlxuT3ZlcmZsb3c6XG4iOworICBjaGVja19hY2N1cmFjeShiYXNlZl9vdmVyLCBiYXNlZF9vdmVyLCBzKTsKKworICBzdGQ6OmNlcnIgPDwgIlxuVmFyeWluZyAob3Zlcik6XG4iOworICBmb3IgKGludCBrPTA7IGs8MTsgKytrKQorICB7CisgICAgY2hlY2tfYWNjdXJhY3lfdmFyKDIwLDI3LDE5MCwzMDIscyk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0KKworICBzdGQ6OmNlcnIgPDwgIlxuVmFyeWluZyAodW5kZXIpOlxuIjsKKyAgZm9yIChpbnQgaz0wOyBrPDE7ICsraykKKyAgeworICAgIGNoZWNrX2FjY3VyYWN5X3ZhcigtMjcsMjAsLTMwMiwtMTkwLHMpOworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICB9CisKKyAgeSA9IDE7CisgIHN0ZDo6Y291dC5wcmVjaXNpb24oNCk7CisgIGludCBzMSA9IDEwMjQqMTAyNCozMjsKKyAgc3RkOjpjZXJyIDw8ICJQZXJmb3JtYW5jZSAob3V0IG9mIGNhY2hlLCAiIDw8IHMxIDw8ICIpOlxuIjsKKyAgeworICAgIGludCBpdGVycyA9IDE7CisgICAgVmVjdG9yWGYgdmYgPSBWZWN0b3JYZjo6UmFuZG9tKHMxKSAqIHk7CisgICAgVmVjdG9yWGQgdmQgPSBWZWN0b3JYZDo6UmFuZG9tKHMxKSAqIHk7CisgICAgVmVjdG9yWGNmIHZjZiA9IFZlY3RvclhjZjo6UmFuZG9tKHMxKSAqIHk7CisgICAgQkVOQ0hfUEVSRihzcXN1bU5vcm0pOworICAgIEJFTkNIX1BFUkYoc3RhYmxlTm9ybSk7CisgICAgQkVOQ0hfUEVSRihibHVlTm9ybSk7CisgICAgQkVOQ0hfUEVSRihwYmx1ZU5vcm0pOworICAgIEJFTkNIX1BFUkYobGFwYWNrTm9ybSk7CisgICAgQkVOQ0hfUEVSRihoeXBvdE5vcm0pOworICAgIEJFTkNIX1BFUkYodHdvcGFzc05vcm0pOworICAgIEJFTkNIX1BFUkYoYmwycGFzc05vcm0pOworICB9CisKKyAgc3RkOjpjZXJyIDw8ICJcblBlcmZvcm1hbmNlIChpbiBjYWNoZSwgIiA8PCA1MTIgPDwgIik6XG4iOworICB7CisgICAgaW50IGl0ZXJzID0gMTAwMDAwOworICAgIFZlY3RvclhmIHZmID0gVmVjdG9yWGY6OlJhbmRvbSg1MTIpICogeTsKKyAgICBWZWN0b3JYZCB2ZCA9IFZlY3RvclhkOjpSYW5kb20oNTEyKSAqIHk7CisgICAgVmVjdG9yWGNmIHZjZiA9IFZlY3RvclhjZjo6UmFuZG9tKDUxMikgKiB5OworICAgIEJFTkNIX1BFUkYoc3FzdW1Ob3JtKTsKKyAgICBCRU5DSF9QRVJGKHN0YWJsZU5vcm0pOworICAgIEJFTkNIX1BFUkYoYmx1ZU5vcm0pOworICAgIEJFTkNIX1BFUkYocGJsdWVOb3JtKTsKKyAgICBCRU5DSF9QRVJGKGxhcGFja05vcm0pOworICAgIEJFTkNIX1BFUkYoaHlwb3ROb3JtKTsKKyAgICBCRU5DSF9QRVJGKHR3b3Bhc3NOb3JtKTsKKyAgICBCRU5DSF9QRVJGKGJsMnBhc3NOb3JtKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hfcmV2ZXJzZS5jcHAgYi9iZW5jaC9iZW5jaF9yZXZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTY5Y2ExCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfcmV2ZXJzZS5jcHAKQEAgLTAsMCArMSw4NCBAQAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFV0aWwuaD4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgVFJJRVMKKyNkZWZpbmUgVFJJRVMgMjAKKyNlbmRpZgorCit0eXBlZGVmIGRvdWJsZSBTY2FsYXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdm9pZCBiZW5jaF9yZXZlcnNlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisgIGludCBzaXplID0gbS5zaXplKCk7CisKKyAgaW50IHJlcGVhdHMgPSAoUkVQRUFUKjEwMDApL3NpemU7CisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKworICBCZW5jaFRpbWVyIHRpbWVyQiwgdGltZXJILCB0aW1lclY7CisKKyAgU2NhbGFyIGFjYyA9IDA7CisgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgeworICAgIHRpbWVyQi5zdGFydCgpOworICAgIGZvciAoaW50IGs9MDsgazxyZXBlYXRzOyArK2spCisgICAgeworICAgICAgYXNtKCIjYmVnaW4gZm9vIik7CisgICAgICBiID0gYS5yZXZlcnNlKCk7CisgICAgICBhc20oIiNlbmQgZm9vIik7CisgICAgICBhY2MgKz0gYi5jb2VmZihyLGMpOworICAgIH0KKyAgICB0aW1lckIuc3RvcCgpOworICB9CisKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgIHN0ZDo6Y291dCA8PCAiZHluICAgIjsKKyAgZWxzZQorICAgIHN0ZDo6Y291dCA8PCAiZml4ZWQgIjsKKyAgc3RkOjpjb3V0IDw8IHJvd3MgPDwgIiB4ICIgPDwgY29scyA8PCAiIFx0IgorICAgICAgICAgICAgPDwgKHRpbWVyQi52YWx1ZSgpICogUkVQRUFUKSAvIHJlcGVhdHMgPDwgInMgIgorICAgICAgICAgICAgPDwgIigiIDw8IDFlLTYgKiBzaXplKnJlcGVhdHMvdGltZXJCLnZhbHVlKCkgPDwgIiBNRkxPUFMpXHQiOworCisgIHN0ZDo6Y291dCA8PCAiXG4iOworICAvLyBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IG9wdGltaXplIHRvbyBtdWNoCisgIGlmIChhY2M9PTEyMykKKyAgICBzdGQ6OmNvdXQgPDwgYWNjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICBjb25zdCBpbnQgZHluc2l6ZXNbXSA9IHs0LDYsOCwxNiwyNCwzMiw0OSw2NCwxMjgsMjU2LDUxMiw5MDAsMH07CisgIHN0ZDo6Y291dCA8PCAic2l6ZSAgICAgICAgICAgIG5vIHNxcnQgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCI7CisvLyAgICNpZmRlZiBCRU5DSF9HU0wKKy8vICAgc3RkOjpjb3V0IDw8ICIgICAgICAgR1NMIChzdGFuZGFyZCArIGRvdWJsZSArIEFUTEFTKSAgIjsKKy8vICAgI2VuZGlmCisgIHN0ZDo6Y291dCA8PCAiXG4iOworICBmb3IgKHVpbnQgaT0wOyBkeW5zaXplc1tpXT4wOyArK2kpCisgIHsKKyAgICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPihkeW5zaXplc1tpXSxkeW5zaXplc1tpXSkpOworICAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhcixEeW5hbWljLDE+KGR5bnNpemVzW2ldKmR5bnNpemVzW2ldKSk7CisgIH0KKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDIsMj4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciwzLDM+KCkpOworLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNCw0PigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDUsNT4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciw2LDY+KCkpOworLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNyw3PigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDgsOD4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciwxMiwxMj4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciwxNiwxNj4oKSk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9zdW0uY3BwIGIvYmVuY2gvYmVuY2hfc3VtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q5MjVlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfc3VtLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkgCit7CisgIHR5cGVkZWYgTWF0cml4PFNDQUxBUixFaWdlbjo6RHluYW1pYywxPiBWZWM7CisgIFZlYyB2KFNJWkUpOworICB2LnNldFplcm8oKTsKKyAgdlswXSA9IDE7CisgIHZbMV0gPSAyOworICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwMDAwMDsgaSsrKQorICB7CisgICAgdi5jb2VmZlJlZigwKSArPSB2LnN1bSgpICogU0NBTEFSKDFlLTIwKTsKKyAgfQorICBjb3V0IDw8IHYuc3VtKCkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX3Vucm9sbGluZyBiL2JlbmNoL2JlbmNoX3Vucm9sbGluZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjY0NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfdW5yb2xsaW5nCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9iYXNoCisKKyMgZ2NjIDogQ1hYPSJnKysgIC1maW5saW5lLWxpbWl0PTEwMDAwIC1mdGVtcGxhdGUtZGVwdGgtMjAwMCAtLXBhcmFtIG1heC1pbmxpbmUtcmVjdXJzaXZlLWRlcHRoPTIwMDAiCisjIGljYyA6IENYWD0iaWNwYyAtZmFzdCAtbm8taW5saW5lLW1heC1zaXplIC1mbm8tZXhjZXB0aW9ucyIKK0NYWD0ke0NYWC1nKysgIC1maW5saW5lLWxpbWl0PTEwMDAwIC1mdGVtcGxhdGUtZGVwdGgtMjAwMCAtLXBhcmFtIG1heC1pbmxpbmUtcmVjdXJzaXZlLWRlcHRoPTIwMDB9ICMgZGVmYXVsdCB2YWx1ZQorCitmb3IgKChpPTE7IGk8MTY7ICsraSkpOyBkbworICAgIGVjaG8gIk1hdHJpeCBzaXplOiAkaSB4ICRpIDoiCisgICAgJENYWCAtTzMgLUkuLiAtRE5ERUJVRyAgYmVuY2htYXJrLmNwcCAtRE1BVFNJWkU9JGkgLURFSUdFTl9VTlJPTExJTkdfTElNSVQ9NDAwIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKKyAgICAkQ1hYIC1PMyAtSS4uIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTEwMDAwIGJlbmNobWFyay5jcHAgLURNQVRTSVpFPSRpIC1ERUlHRU5fRE9OVF9VU0VfVU5ST0xMRURfTE9PUFM9MSAtbyBiZW5jaG1hcmsgJiYgdGltZSAuL2JlbmNobWFyayA+L2Rldi9udWxsCisgICAgZWNobyAiICIKK2RvbmUKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNobWFyay1ibG9ja2luZy1zaXplcy5jcHAgYi9iZW5jaC9iZW5jaG1hcmstYmxvY2tpbmctc2l6ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyN2JlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaG1hcmstYmxvY2tpbmctc2l6ZXMuY3BwCkBAIC0wLDAgKzEsNjc3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBCZW5vaXQgSmFjb2IgPGJlbm9pdGphY29iQGdvb2dsZS5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxjc3RkaW8+CisKK2Jvb2wgZWlnZW5fdXNlX3NwZWNpZmljX2Jsb2NrX3NpemU7CitpbnQgZWlnZW5fYmxvY2tfc2l6ZV9rLCBlaWdlbl9ibG9ja19zaXplX20sIGVpZ2VuX2Jsb2NrX3NpemVfbjsKKyNkZWZpbmUgRUlHRU5fVEVTVF9TUEVDSUZJQ19CTE9DS0lOR19TSVpFUyBlaWdlbl91c2Vfc3BlY2lmaWNfYmxvY2tfc2l6ZQorI2RlZmluZSBFSUdFTl9URVNUX1NQRUNJRklDX0JMT0NLSU5HX1NJWkVfSyBlaWdlbl9ibG9ja19zaXplX2sKKyNkZWZpbmUgRUlHRU5fVEVTVF9TUEVDSUZJQ19CTE9DS0lOR19TSVpFX00gZWlnZW5fYmxvY2tfc2l6ZV9tCisjZGVmaW5lIEVJR0VOX1RFU1RfU1BFQ0lGSUNfQkxPQ0tJTkdfU0laRV9OIGVpZ2VuX2Jsb2NrX3NpemVfbgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3N0YXRpYyBCZW5jaFRpbWVyIHRpbWVyOworCisvLyBob3cgbWFueSB0aW1lcyB3ZSByZXBlYXQgZWFjaCBtZWFzdXJlbWVudC4KKy8vIG1lYXN1cmVtZW50cyBhcmUgcmFuZG9tbHkgc2h1ZmZsZWQgLSB3ZSdyZSBub3QgZG9pbmcKKy8vIGFsbCBOIGlkZW50aWNhbCBtZWFzdXJlbWVudHMgaW4gYSByb3cuCitjb25zdCBpbnQgbWVhc3VyZW1lbnRfcmVwZXRpdGlvbnMgPSAzOworCisvLyBUaW1pbmdzIGJlbG93IHRoaXMgdmFsdWUgYXJlIHRvbyBzaG9ydCB0byBiZSBhY2N1cmF0ZSwKKy8vIHdlJ2xsIHJlcGVhdCBtZWFzdXJlbWVudHMgd2l0aCBtb3JlIGl0ZXJhdGlvbnMgdW50aWwKKy8vIHdlIGdldCBhIHRpbWluZyBhYm92ZSB0aGF0IHRocmVzaG9sZC4KK2NvbnN0IGZsb2F0IG1pbl9hY2N1cmF0ZV90aW1lID0gMWUtMmY7CisKKy8vIFNlZSAtLW1pbi13b3JraW5nLXNldC1zaXplIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuCitzaXplX3QgbWluX3dvcmtpbmdfc2V0X3NpemUgPSAwOworCitmbG9hdCBtYXhfY2xvY2tfc3BlZWQgPSAwLjBmOworCisvLyByYW5nZSBvZiBzaXplcyB0aGF0IHdlIHdpbGwgYmVuY2htYXJrIChpbiBhbGwgMyBLLE0sTiBkaW1lbnNpb25zKQorY29uc3Qgc2l6ZV90IG1heHNpemUgPSAyMDQ4OworY29uc3Qgc2l6ZV90IG1pbnNpemUgPSAxNjsKKwordHlwZWRlZiBNYXRyaXhYZiBNYXRyaXhUeXBlOwordHlwZWRlZiBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwordHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKworc3RhdGljX2Fzc2VydCgobWF4c2l6ZSAmIChtYXhzaXplIC0gMSkpID09IDAsICJtYXhzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28iKTsKK3N0YXRpY19hc3NlcnQoKG1pbnNpemUgJiAobWluc2l6ZSAtIDEpKSA9PSAwLCAibWluc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIik7CitzdGF0aWNfYXNzZXJ0KG1heHNpemUgPiBtaW5zaXplLCAibWF4c2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIG1pbnNpemUiKTsKK3N0YXRpY19hc3NlcnQobWF4c2l6ZSA8IChtaW5zaXplIDw8IDE2KSwgIm1heHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gKG1pbnNpemU8PDE2KSIpOworCisvLyBqdXN0IGEgaGVscGVyIHRvIHN0b3JlIGEgdHJpcGxlIG9mIEssTSxOIHNpemVzIGZvciBtYXRyaXggcHJvZHVjdAorc3RydWN0IHNpemVfdHJpcGxlX3QKK3sKKyAgc2l6ZV90IGssIG0sIG47CisgIHNpemVfdHJpcGxlX3QoKSA6IGsoMCksIG0oMCksIG4oMCkge30KKyAgc2l6ZV90cmlwbGVfdChzaXplX3QgX2ssIHNpemVfdCBfbSwgc2l6ZV90IF9uKSA6IGsoX2spLCBtKF9tKSwgbihfbikge30KKyAgc2l6ZV90cmlwbGVfdChjb25zdCBzaXplX3RyaXBsZV90JiBvKSA6IGsoby5rKSwgbShvLm0pLCBuKG8ubikge30KKyAgc2l6ZV90cmlwbGVfdCh1aW50MTZfdCBjb21wYWN0KQorICB7CisgICAgayA9IDEgPDwgKChjb21wYWN0ICYgMHhmMDApID4+IDgpOworICAgIG0gPSAxIDw8ICgoY29tcGFjdCAmIDB4MGYwKSA+PiA0KTsKKyAgICBuID0gMSA8PCAoKGNvbXBhY3QgJiAweDAwZikgPj4gMCk7CisgIH0KK307CisKK3VpbnQ4X3QgbG9nMl9wb3Qoc2l6ZV90IHgpIHsKKyAgc2l6ZV90IGwgPSAwOworICB3aGlsZSAoeCA+Pj0gMSkgbCsrOworICByZXR1cm4gbDsKK30KKworLy8gQ29udmVydCBiZXR3ZWVuIHNpemUgdHJpcGVzIGFuZCBhIGNvbXBhY3QgZm9ybSBmaXR0aW5nIGluIDEyIGJpdHMKKy8vIHdoZXJlIGVhY2ggc2l6ZSwgd2hpY2ggbXVzdCBiZSBhIFBPVCwgaXMgZW5jb2RlZCBhcyBpdHMgbG9nMiwgb24gNCBiaXRzCisvLyBzbyB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHNpemUgaXMgMl4xNSA9PSAzMmsgIC4uLiBiaWcgZW5vdWdoLgordWludDE2X3QgY29tcGFjdF9zaXplX3RyaXBsZShzaXplX3Qgaywgc2l6ZV90IG0sIHNpemVfdCBuKQoreworICByZXR1cm4gKGxvZzJfcG90KGspIDw8IDgpIHwgKGxvZzJfcG90KG0pIDw8IDQpIHwgbG9nMl9wb3Qobik7Cit9CisKK3VpbnQxNl90IGNvbXBhY3Rfc2l6ZV90cmlwbGUoY29uc3Qgc2l6ZV90cmlwbGVfdCYgdCkKK3sKKyAgcmV0dXJuIGNvbXBhY3Rfc2l6ZV90cmlwbGUodC5rLCB0Lm0sIHQubik7Cit9CisKKy8vIEEgc2luZ2xlIGJlbmNobWFyay4gSW5pdGlhbGx5IG9ubHkgY29udGFpbnMgYmVuY2htYXJrIHBhcmFtcy4KKy8vIFRoZW4gY2FsbCBydW4oKSwgd2hpY2ggc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIGdmbG9wcyBmaWVsZC4KK3N0cnVjdCBiZW5jaG1hcmtfdAoreworICB1aW50MTZfdCBjb21wYWN0X3Byb2R1Y3Rfc2l6ZTsKKyAgdWludDE2X3QgY29tcGFjdF9ibG9ja19zaXplOworICBib29sIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemU7CisgIGZsb2F0IGdmbG9wczsKKyAgYmVuY2htYXJrX3QoKQorICAgIDogY29tcGFjdF9wcm9kdWN0X3NpemUoMCkKKyAgICAsIGNvbXBhY3RfYmxvY2tfc2l6ZSgwKQorICAgICwgdXNlX2RlZmF1bHRfYmxvY2tfc2l6ZShmYWxzZSkKKyAgICAsIGdmbG9wcygwKQorICB7CisgIH0KKyAgYmVuY2htYXJrX3Qoc2l6ZV90IHBrLCBzaXplX3QgcG0sIHNpemVfdCBwbiwKKyAgICAgICAgICAgICAgc2l6ZV90IGJrLCBzaXplX3QgYm0sIHNpemVfdCBibikKKyAgICA6IGNvbXBhY3RfcHJvZHVjdF9zaXplKGNvbXBhY3Rfc2l6ZV90cmlwbGUocGssIHBtLCBwbikpCisgICAgLCBjb21wYWN0X2Jsb2NrX3NpemUoY29tcGFjdF9zaXplX3RyaXBsZShiaywgYm0sIGJuKSkKKyAgICAsIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUoZmFsc2UpCisgICAgLCBnZmxvcHMoMCkKKyAge30KKyAgYmVuY2htYXJrX3Qoc2l6ZV90IHBrLCBzaXplX3QgcG0sIHNpemVfdCBwbikKKyAgICA6IGNvbXBhY3RfcHJvZHVjdF9zaXplKGNvbXBhY3Rfc2l6ZV90cmlwbGUocGssIHBtLCBwbikpCisgICAgLCBjb21wYWN0X2Jsb2NrX3NpemUoMCkKKyAgICAsIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUodHJ1ZSkKKyAgICAsIGdmbG9wcygwKQorICB7fQorCisgIHZvaWQgcnVuKCk7Cit9OworCitvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIHMsIGNvbnN0IGJlbmNobWFya190JiBiKQoreworICBzIDw8IGhleCA8PCBiLmNvbXBhY3RfcHJvZHVjdF9zaXplIDw8IGRlYzsKKyAgaWYgKGIudXNlX2RlZmF1bHRfYmxvY2tfc2l6ZSkgeworICAgIHNpemVfdHJpcGxlX3QgdChiLmNvbXBhY3RfcHJvZHVjdF9zaXplKTsKKyAgICBJbmRleCBrID0gdC5rLCBtID0gdC5tLCBuID0gdC5uOworICAgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8U2NhbGFyLCBTY2FsYXI+KGssIG0sIG4pOworICAgIHMgPDwgIiBkZWZhdWx0KCIgPDwgayA8PCAiLCAiIDw8IG0gPDwgIiwgIiA8PCBuIDw8ICIpIjsKKyAgfSBlbHNlIHsKKyAgICBzIDw8ICIgIiA8PCBoZXggPDwgYi5jb21wYWN0X2Jsb2NrX3NpemUgPDwgZGVjOworICB9CisgIHMgPDwgIiAiIDw8IGIuZ2Zsb3BzOworICByZXR1cm4gczsKK30KKworLy8gV2Ugc29ydCBmaXJzdCBieSBpbmNyZWFzaW5nIGJlbmNobWFyayBwYXJhbWV0ZXJzLAorLy8gdGhlbiBieSBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlLgorYm9vbCBvcGVyYXRvcjwoY29uc3QgYmVuY2htYXJrX3QmIGIxLCBjb25zdCBiZW5jaG1hcmtfdCYgYjIpCit7IAorICByZXR1cm4gYjEuY29tcGFjdF9wcm9kdWN0X3NpemUgPCBiMi5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSB8fAorICAgICAgICAgICAoYjEuY29tcGFjdF9wcm9kdWN0X3NpemUgPT0gYjIuY29tcGFjdF9wcm9kdWN0X3NpemUgJiYgKAorICAgICAgICAgICAgIChiMS5jb21wYWN0X2Jsb2NrX3NpemUgPCBiMi5jb21wYWN0X2Jsb2NrX3NpemUgfHwgKAorICAgICAgICAgICAgICAgYjEuY29tcGFjdF9ibG9ja19zaXplID09IGIyLmNvbXBhY3RfYmxvY2tfc2l6ZSAmJgorICAgICAgICAgICAgICAgICBiMS5nZmxvcHMgPiBiMi5nZmxvcHMpKSkpOworfQorCit2b2lkIGJlbmNobWFya190OjpydW4oKQoreworICBzaXplX3RyaXBsZV90IHByb2R1Y3RzaXplcyhjb21wYWN0X3Byb2R1Y3Rfc2l6ZSk7CisKKyAgaWYgKHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUpIHsKKyAgICBlaWdlbl91c2Vfc3BlY2lmaWNfYmxvY2tfc2l6ZSA9IGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIGZlZWQgZWlnZW4gd2l0aCBvdXIgY3VzdG9tIGJsb2NraW5nIHBhcmFtcworICAgIGVpZ2VuX3VzZV9zcGVjaWZpY19ibG9ja19zaXplID0gdHJ1ZTsKKyAgICBzaXplX3RyaXBsZV90IGJsb2Nrc2l6ZXMoY29tcGFjdF9ibG9ja19zaXplKTsKKyAgICBlaWdlbl9ibG9ja19zaXplX2sgPSBibG9ja3NpemVzLms7CisgICAgZWlnZW5fYmxvY2tfc2l6ZV9tID0gYmxvY2tzaXplcy5tOworICAgIGVpZ2VuX2Jsb2NrX3NpemVfbiA9IGJsb2Nrc2l6ZXMubjsKKyAgfQorCisgIC8vIHNldCB1cCB0aGUgbWF0cml4IHBvb2wKKworICBjb25zdCBzaXplX3QgY29tYmluZWRfdGhyZWVfbWF0cmljZXNfc2l6ZXMgPQorICAgIHNpemVvZihTY2FsYXIpICoKKyAgICAgIChwcm9kdWN0c2l6ZXMuayAqIHByb2R1Y3RzaXplcy5tICsKKyAgICAgICBwcm9kdWN0c2l6ZXMuayAqIHByb2R1Y3RzaXplcy5uICsKKyAgICAgICBwcm9kdWN0c2l6ZXMubSAqIHByb2R1Y3RzaXplcy5uKTsKKworICAvLyA2NCBNIGlzIGxhcmdlIGVub3VnaCB0aGF0IG5vYm9keSBoYXMgYSBjYWNoZSBiaWdnZXIgdGhhbiB0aGF0LAorICAvLyB3aGlsZSBzdGlsbCBiZWluZyBzbWFsbCBlbm91Z2ggdGhhdCBldmVyeWJvZHkgaGFzIHRoaXMgbXVjaCBSQU0sCisgIC8vIHNvIGNvbnZlbmllbnRseSB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwtY2FzZSBwbGF0Zm9ybXMgaGVyZS4KKyAgY29uc3Qgc2l6ZV90IHVubGlrZWx5X2xhcmdlX2NhY2hlX3NpemUgPSA2NCA8PCAyMDsKKworICBjb25zdCBzaXplX3Qgd29ya2luZ19zZXRfc2l6ZSA9CisgICAgbWluX3dvcmtpbmdfc2V0X3NpemUgPyBtaW5fd29ya2luZ19zZXRfc2l6ZSA6IHVubGlrZWx5X2xhcmdlX2NhY2hlX3NpemU7CisKKyAgY29uc3Qgc2l6ZV90IG1hdHJpeF9wb29sX3NpemUgPQorICAgIDEgKyB3b3JraW5nX3NldF9zaXplIC8gY29tYmluZWRfdGhyZWVfbWF0cmljZXNfc2l6ZXM7CisKKyAgTWF0cml4VHlwZSAqbGhzID0gbmV3IE1hdHJpeFR5cGVbbWF0cml4X3Bvb2xfc2l6ZV07CisgIE1hdHJpeFR5cGUgKnJocyA9IG5ldyBNYXRyaXhUeXBlW21hdHJpeF9wb29sX3NpemVdOworICBNYXRyaXhUeXBlICpkc3QgPSBuZXcgTWF0cml4VHlwZVttYXRyaXhfcG9vbF9zaXplXTsKKyAgCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0cml4X3Bvb2xfc2l6ZTsgaSsrKSB7CisgICAgbGhzW2ldID0gTWF0cml4VHlwZTo6WmVybyhwcm9kdWN0c2l6ZXMubSwgcHJvZHVjdHNpemVzLmspOworICAgIHJoc1tpXSA9IE1hdHJpeFR5cGU6Olplcm8ocHJvZHVjdHNpemVzLmssIHByb2R1Y3RzaXplcy5uKTsKKyAgICBkc3RbaV0gPSBNYXRyaXhUeXBlOjpaZXJvKHByb2R1Y3RzaXplcy5tLCBwcm9kdWN0c2l6ZXMubik7CisgIH0KKworICAvLyBtYWluIGJlbmNobWFyayBsb29wCisKKyAgaW50IGl0ZXJzX2F0X2FfdGltZSA9IDE7CisgIGZsb2F0IHRpbWVfcGVyX2l0ZXIgPSAwLjBmOworICBzaXplX3QgbWF0cml4X2luZGV4ID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIGRvdWJsZSBzdGFydHRpbWUgPSB0aW1lci5nZXRDcHVUaW1lKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyc19hdF9hX3RpbWU7IGkrKykgeworICAgICAgZHN0W21hdHJpeF9pbmRleF0ubm9hbGlhcygpID0gbGhzW21hdHJpeF9pbmRleF0gKiByaHNbbWF0cml4X2luZGV4XTsKKyAgICAgIG1hdHJpeF9pbmRleCsrOworICAgICAgaWYgKG1hdHJpeF9pbmRleCA9PSBtYXRyaXhfcG9vbF9zaXplKSB7CisgICAgICAgIG1hdHJpeF9pbmRleCA9IDA7CisgICAgICB9CisgICAgfQorICAgIGRvdWJsZSBlbmR0aW1lID0gdGltZXIuZ2V0Q3B1VGltZSgpOworCisgICAgY29uc3QgZmxvYXQgdGltaW5nID0gZmxvYXQoZW5kdGltZSAtIHN0YXJ0dGltZSk7CisKKyAgICBpZiAodGltaW5nID49IG1pbl9hY2N1cmF0ZV90aW1lKSB7CisgICAgICB0aW1lX3Blcl9pdGVyID0gdGltaW5nIC8gaXRlcnNfYXRfYV90aW1lOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaXRlcnNfYXRfYV90aW1lICo9IDI7CisgIH0KKworICBkZWxldGVbXSBsaHM7CisgIGRlbGV0ZVtdIHJoczsKKyAgZGVsZXRlW10gZHN0OworCisgIGdmbG9wcyA9IDJlLTkgKiBwcm9kdWN0c2l6ZXMuayAqIHByb2R1Y3RzaXplcy5tICogcHJvZHVjdHNpemVzLm4gLyB0aW1lX3Blcl9pdGVyOworfQorCit2b2lkIHByaW50X2NwdWluZm8oKQoreworI2lmZGVmIF9fbGludXhfXworICBjb3V0IDw8ICJjb250ZW50cyBvZiAvcHJvYy9jcHVpbmZvOiIgPDwgZW5kbDsKKyAgc3RyaW5nIGxpbmU7CisgIGlmc3RyZWFtIGNwdWluZm8oIi9wcm9jL2NwdWluZm8iKTsKKyAgaWYgKGNwdWluZm8uaXNfb3BlbigpKSB7CisgICAgd2hpbGUgKGdldGxpbmUoY3B1aW5mbywgbGluZSkpIHsKKyAgICAgIGNvdXQgPDwgbGluZSA8PCBlbmRsOworICAgIH0KKyAgICBjcHVpbmZvLmNsb3NlKCk7CisgIH0KKyAgY291dCA8PCBlbmRsOworI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KKyAgY291dCA8PCAib3V0cHV0IG9mIHN5c2N0bCBodzoiIDw8IGVuZGw7CisgIHN5c3RlbSgic3lzY3RsIGh3Iik7CisgIGNvdXQgPDwgZW5kbDsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyB0eXBlX25hbWUoKQoreworICByZXR1cm4gInVua25vd24iOworfQorCit0ZW1wbGF0ZTw+CitzdHJpbmcgdHlwZV9uYW1lPGZsb2F0PigpCit7CisgIHJldHVybiAiZmxvYXQiOworfQorCit0ZW1wbGF0ZTw+CitzdHJpbmcgdHlwZV9uYW1lPGRvdWJsZT4oKQoreworICByZXR1cm4gImRvdWJsZSI7Cit9CisKK3N0cnVjdCBhY3Rpb25fdAoreworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IHsgYWJvcnQoKTsgcmV0dXJuIG51bGxwdHI7IH0KKyAgdmlydHVhbCB2b2lkIHJ1bigpIGNvbnN0IHsgYWJvcnQoKTsgfQorICB2aXJ0dWFsIH5hY3Rpb25fdCgpIHt9Cit9OworCit2b2lkIHNob3dfdXNhZ2VfYW5kX2V4aXQoaW50IC8qYXJnYyovLCBjaGFyKiBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHVuaXF1ZV9wdHI8YWN0aW9uX3Q+PiYgYXZhaWxhYmxlX2FjdGlvbnMpCit7CisgIGNlcnIgPDwgInVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiA8YWN0aW9uPiBbb3B0aW9ucy4uLl0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgY2VyciA8PCAiYXZhaWxhYmxlIGFjdGlvbnM6IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZvciAoYXV0byBpdCA9IGF2YWlsYWJsZV9hY3Rpb25zLmJlZ2luKCk7IGl0ICE9IGF2YWlsYWJsZV9hY3Rpb25zLmVuZCgpOyArK2l0KSB7CisgICAgY2VyciA8PCAiICAiIDw8ICgqaXQpLT5pbnZva2F0aW9uX25hbWUoKSA8PCBlbmRsOworICB9CisgIGNlcnIgPDwgZW5kbDsKKyAgY2VyciA8PCAib3B0aW9uczoiIDw8IGVuZGwgPDwgZW5kbDsKKyAgY2VyciA8PCAiICAtLW1pbi13b3JraW5nLXNldC1zaXplPU46IiA8PCBlbmRsOworICBjZXJyIDw8ICIgICAgICAgU2V0IHRoZSBtaW5pbXVtIHdvcmtpbmcgc2V0IHNpemUgdG8gTiBieXRlcy4iIDw8IGVuZGw7CisgIGNlcnIgPDwgIiAgICAgICBUaGlzIGlzIHJvdW5kZWQgdXAgYXMgbmVlZGVkIHRvIGEgbXVsdGlwbGUgb2YgbWF0cml4IHNpemUuIiA8PCBlbmRsOworICBjZXJyIDw8ICIgICAgICAgQSBsYXJnZXIgd29ya2luZyBzZXQgbG93ZXJzIHRoZSBjaGFuY2Ugb2YgYSB3YXJtIGNhY2hlLiIgPDwgZW5kbDsKKyAgY2VyciA8PCAiICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIDAgbWVhbnMgdXNlIGEgbGFyZ2UgZW5vdWdoIHdvcmtpbmciIDw8IGVuZGw7CisgIGNlcnIgPDwgIiAgICAgICBzZXQgdG8gbGlrZWx5IG91dHNpemUgY2FjaGVzLiIgPDwgZW5kbDsKKyAgY2VyciA8PCAiICAgICAgIEEgdmFsdWUgb2YgMSAodGhhdCBpcywgMSBieXRlKSB3b3VsZCBtZWFuIGRvbid0IGRvIGFueXRoaW5nIHRvIiA8PCBlbmRsOworICBjZXJyIDw8ICIgICAgICAgYXZvaWQgd2FybSBjYWNoZXMuIiA8PCBlbmRsOworICBleGl0KDEpOworfQorICAgICAKK2Zsb2F0IG1lYXN1cmVfY2xvY2tfc3BlZWQoKQoreworICBjZXJyIDw8ICJNZWFzdXJpbmcgY2xvY2sgc3BlZWQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcciIgPDwgZmx1c2g7CisgICAgICAgICAgCisgIHZlY3RvcjxmbG9hdD4gYWxsX2dmbG9wczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICBiZW5jaG1hcmtfdCBiKDEwMjQsIDEwMjQsIDEwMjQpOworICAgIGIucnVuKCk7CisgICAgYWxsX2dmbG9wcy5wdXNoX2JhY2soYi5nZmxvcHMpOworICB9CisKKyAgc29ydChhbGxfZ2Zsb3BzLmJlZ2luKCksIGFsbF9nZmxvcHMuZW5kKCkpOworICBmbG9hdCBzdGFibGVfZXN0aW1hdGUgPSBhbGxfZ2Zsb3BzWzJdICsgYWxsX2dmbG9wc1szXSArIGFsbF9nZmxvcHNbNF0gKyBhbGxfZ2Zsb3BzWzVdOworCisgIC8vIG11bHRpcGx5IGJ5IGFuIGFyYml0cmFyeSBjb25zdGFudCB0byBkaXNjb3VyYWdlIHRyeWluZyBkb2luZyBhbnl0aGluZyB3aXRoIHRoZQorICAvLyByZXR1cm5lZCB2YWx1ZXMgYmVzaWRlcyBqdXN0IGNvbXBhcmluZyB0aGVtIHdpdGggZWFjaCBvdGhlci4KKyAgZmxvYXQgcmVzdWx0ID0gc3RhYmxlX2VzdGltYXRlICogMTIzLjQ1NmY7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGh1bWFuX2R1cmF0aW9uX3QKK3sKKyAgaW50IHNlY29uZHM7CisgIGh1bWFuX2R1cmF0aW9uX3QoaW50IHMpIDogc2Vjb25kcyhzKSB7fQorfTsKKworb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBzLCBjb25zdCBodW1hbl9kdXJhdGlvbl90JiBkKQoreworICBpbnQgcmVtYWluZGVyID0gZC5zZWNvbmRzOworICBpZiAocmVtYWluZGVyID4gMzYwMCkgeworICAgIGludCBob3VycyA9IHJlbWFpbmRlciAvIDM2MDA7CisgICAgcyA8PCBob3VycyA8PCAiIGggIjsKKyAgICByZW1haW5kZXIgLT0gaG91cnMgKiAzNjAwOworICB9CisgIGlmIChyZW1haW5kZXIgPiA2MCkgeworICAgIGludCBtaW51dGVzID0gcmVtYWluZGVyIC8gNjA7CisgICAgcyA8PCBtaW51dGVzIDw8ICIgbWluICI7CisgICAgcmVtYWluZGVyIC09IG1pbnV0ZXMgKiA2MDsKKyAgfQorICBpZiAoZC5zZWNvbmRzIDwgNjAwKSB7CisgICAgcyA8PCByZW1haW5kZXIgPDwgIiBzIjsKKyAgfQorICByZXR1cm4gczsKK30KKworY29uc3QgY2hhciBzZXNzaW9uX2ZpbGVuYW1lW10gPSAiL2RhdGEvbG9jYWwvdG1wL2JlbmNobWFyay1ibG9ja2luZy1zaXplcy1zZXNzaW9uLmRhdGEiOworCit2b2lkIHNlcmlhbGl6ZV9iZW5jaG1hcmtzKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzLCBzaXplX3QgZmlyc3RfYmVuY2htYXJrX3RvX3J1bikKK3sKKyAgRklMRSogZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworICBpZiAoIWZpbGUpIHsKKyAgICBjZXJyIDw8ICJDb3VsZCBub3Qgb3BlbiBmaWxlICIgPDwgZmlsZW5hbWUgPDwgIiBmb3Igd3JpdGluZy4iIDw8IGVuZGw7CisgICAgY2VyciA8PCAiRG8geW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgb24gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk/IiA8PCBlbmRsOworICAgIGV4aXQoMSk7CisgIH0KKyAgc2l6ZV90IGJlbmNobWFya3NfdmVjdG9yX3NpemUgPSBiZW5jaG1hcmtzLnNpemUoKTsKKyAgZndyaXRlKCZtYXhfY2xvY2tfc3BlZWQsIHNpemVvZihtYXhfY2xvY2tfc3BlZWQpLCAxLCBmaWxlKTsKKyAgZndyaXRlKCZiZW5jaG1hcmtzX3ZlY3Rvcl9zaXplLCBzaXplb2YoYmVuY2htYXJrc192ZWN0b3Jfc2l6ZSksIDEsIGZpbGUpOworICBmd3JpdGUoJmZpcnN0X2JlbmNobWFya190b19ydW4sIHNpemVvZihmaXJzdF9iZW5jaG1hcmtfdG9fcnVuKSwgMSwgZmlsZSk7CisgIGZ3cml0ZShiZW5jaG1hcmtzLmRhdGEoKSwgc2l6ZW9mKGJlbmNobWFya190KSwgYmVuY2htYXJrcy5zaXplKCksIGZpbGUpOworICBmY2xvc2UoZmlsZSk7Cit9CisKK2Jvb2wgZGVzZXJpYWxpemVfYmVuY2htYXJrcyhjb25zdCBjaGFyKiBmaWxlbmFtZSwgdmVjdG9yPGJlbmNobWFya190PiYgYmVuY2htYXJrcywgc2l6ZV90JiBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuKQoreworICBGSUxFKiBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgIGlmICghZmlsZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoMSAhPSBmcmVhZCgmbWF4X2Nsb2NrX3NwZWVkLCBzaXplb2YobWF4X2Nsb2NrX3NwZWVkKSwgMSwgZmlsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IGJlbmNobWFya3NfdmVjdG9yX3NpemUgPSAwOworICBpZiAoMSAhPSBmcmVhZCgmYmVuY2htYXJrc192ZWN0b3Jfc2l6ZSwgc2l6ZW9mKGJlbmNobWFya3NfdmVjdG9yX3NpemUpLCAxLCBmaWxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoMSAhPSBmcmVhZCgmZmlyc3RfYmVuY2htYXJrX3RvX3J1biwgc2l6ZW9mKGZpcnN0X2JlbmNobWFya190b19ydW4pLCAxLCBmaWxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBiZW5jaG1hcmtzLnJlc2l6ZShiZW5jaG1hcmtzX3ZlY3Rvcl9zaXplKTsKKyAgaWYgKGJlbmNobWFya3Muc2l6ZSgpICE9IGZyZWFkKGJlbmNobWFya3MuZGF0YSgpLCBzaXplb2YoYmVuY2htYXJrX3QpLCBiZW5jaG1hcmtzLnNpemUoKSwgZmlsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5saW5rKGZpbGVuYW1lKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgdHJ5X3J1bl9zb21lX2JlbmNobWFya3MoCisgIHZlY3RvcjxiZW5jaG1hcmtfdD4mIGJlbmNobWFya3MsCisgIGRvdWJsZSB0aW1lX3N0YXJ0LAorICBzaXplX3QmIGZpcnN0X2JlbmNobWFya190b19ydW4pCit7CisgIGlmIChmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID09IGJlbmNobWFya3Muc2l6ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIHRpbWVfbGFzdF9wcm9ncmVzc191cGRhdGUgPSAwOworICBkb3VibGUgdGltZV9sYXN0X2Nsb2NrX3NwZWVkX21lYXN1cmVtZW50ID0gMDsKKyAgZG91YmxlIHRpbWVfbm93ID0gMDsKKworICBzaXplX3QgYmVuY2htYXJrX2luZGV4ID0gZmlyc3RfYmVuY2htYXJrX3RvX3J1bjsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGZsb2F0IHJhdGlvX2RvbmUgPSBmbG9hdChiZW5jaG1hcmtfaW5kZXgpIC8gYmVuY2htYXJrcy5zaXplKCk7CisgICAgdGltZV9ub3cgPSB0aW1lci5nZXRSZWFsVGltZSgpOworCisgICAgLy8gV2UgY2hlY2sgY2xvY2sgc3BlZWQgZXZlcnkgbWludXRlIGFuZCBhdCB0aGUgZW5kLgorICAgIGlmIChiZW5jaG1hcmtfaW5kZXggPT0gYmVuY2htYXJrcy5zaXplKCkgfHwKKyAgICAgICAgdGltZV9ub3cgPiB0aW1lX2xhc3RfY2xvY2tfc3BlZWRfbWVhc3VyZW1lbnQgKyA2MC4wZikKKyAgICB7CisgICAgICB0aW1lX2xhc3RfY2xvY2tfc3BlZWRfbWVhc3VyZW1lbnQgPSB0aW1lX25vdzsKKworICAgICAgLy8gRW5zdXJlIHRoYXQgY2xvY2sgc3BlZWQgaXMgYXMgZXhwZWN0ZWQKKyAgICAgIGZsb2F0IGN1cnJlbnRfY2xvY2tfc3BlZWQgPSBtZWFzdXJlX2Nsb2NrX3NwZWVkKCk7CisKKyAgICAgIC8vIFRoZSB0b2xlcmFuY2UgbmVlZHMgdG8gYmUgc21hbGxlciB0aGFuIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgIC8vIGNsb2NrIHNwZWVkcyB0aGF0IGEgZGV2aWNlIGNvdWxkIG9wZXJhdGUgdW5kZXIuCisgICAgICAvLyBJdCBzZWVtcyB1bmxpa2VseSB0aGF0IGEgZGV2aWNlIHdvdWxkIGJlIHRocm90dGxpbmcgY2xvY2sgc3BlZWRzIGJ5CisgICAgICAvLyBhbW91bnRzIHNtYWxsZXIgdGhhbiAyJS4KKyAgICAgIC8vIFdpdGggYSB2YWx1ZSBvZiAxJSwgSSB3YXMgZ2V0dGluZyB3aXRoaW4gbm9pc2Ugb24gYSBTYW5keSBCcmlkZ2UuCisgICAgICBjb25zdCBmbG9hdCBjbG9ja19zcGVlZF90b2xlcmFuY2UgPSAwLjAyZjsKKworICAgICAgaWYgKGN1cnJlbnRfY2xvY2tfc3BlZWQgPiAoMSArIGNsb2NrX3NwZWVkX3RvbGVyYW5jZSkgKiBtYXhfY2xvY2tfc3BlZWQpIHsKKyAgICAgICAgLy8gQ2xvY2sgc3BlZWQgaXMgbm93IGhpZ2hlciB0aGFuIHdlIHByZXZpb3VzbHkgbWVhc3VyZWQuCisgICAgICAgIC8vIEVpdGhlciBvdXIgaW5pdGlhbCBtZWFzdXJlbWVudCB3YXMgaW5hY2N1cmF0ZSwgd2hpY2ggd29uJ3QgaGFwcGVuCisgICAgICAgIC8vIHRvbyBtYW55IHRpbWVzIGFzIHdlIGFyZSBrZWVwaW5nIHRoZSBiZXN0IGNsb2NrIHNwZWVkIHZhbHVlIGFuZAorICAgICAgICAvLyBhbmQgYWxsb3dpbmcgc29tZSB0b2xlcmFuY2U7IG9yIHNvbWV0aGluZyByZWFsbHkgd2VpcmQgaGFwcGVuZWQsCisgICAgICAgIC8vIHdoaWNoIGludmFsaWRhdGVzIGFsbCBiZW5jaG1hcmsgcmVzdWx0cyBjb2xsZWN0ZWQgc28gZmFyLgorICAgICAgICAvLyBFaXRoZXIgd2F5LCB3ZSBiZXR0ZXIgcmVzdGFydCBhbGwgb3ZlciBhZ2FpbiBub3cuCisgICAgICAgIGlmIChiZW5jaG1hcmtfaW5kZXgpIHsKKyAgICAgICAgICBjZXJyIDw8ICJSZXN0YXJ0aW5nIGF0ICIgPDwgMTAwLjBmICogcmF0aW9fZG9uZQorICAgICAgICAgICAgICAgPDwgIiAlIGJlY2F1c2UgY2xvY2sgc3BlZWQgaW5jcmVhc2VkLiAgICAgICAgICAiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgbWF4X2Nsb2NrX3NwZWVkID0gY3VycmVudF9jbG9ja19zcGVlZDsKKyAgICAgICAgZmlyc3RfYmVuY2htYXJrX3RvX3J1biA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYm9vbCByZXJ1bl9sYXN0X3Rlc3RzID0gZmFsc2U7CisKKyAgICAgIGlmIChjdXJyZW50X2Nsb2NrX3NwZWVkIDwgKDEgLSBjbG9ja19zcGVlZF90b2xlcmFuY2UpICogbWF4X2Nsb2NrX3NwZWVkKSB7CisgICAgICAgIGNlcnIgPDwgIk1lYXN1cmVtZW50cyBjb21wbGV0ZWQgc28gZmFyOiAiCisgICAgICAgICAgICAgPDwgMTAwLjBmICogcmF0aW9fZG9uZQorICAgICAgICAgICAgIDw8ICIgJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBlbmRsOworICAgICAgICBjZXJyIDw8ICJDbG9jayBzcGVlZCBzZWVtcyB0byBiZSBvbmx5ICIKKyAgICAgICAgICAgICA8PCBjdXJyZW50X2Nsb2NrX3NwZWVkL21heF9jbG9ja19zcGVlZAorICAgICAgICAgICAgIDw8ICIgdGltZXMgd2hhdCBpdCB1c2VkIHRvIGJlLiIgPDwgZW5kbDsKKworICAgICAgICB1bnNpZ25lZCBpbnQgc2Vjb25kc190b19zbGVlcF9pZl9sb3dlcl9jbG9ja19zcGVlZCA9IDE7CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRfY2xvY2tfc3BlZWQgPCAoMSAtIGNsb2NrX3NwZWVkX3RvbGVyYW5jZSkgKiBtYXhfY2xvY2tfc3BlZWQpIHsKKyAgICAgICAgICBpZiAoc2Vjb25kc190b19zbGVlcF9pZl9sb3dlcl9jbG9ja19zcGVlZCA+IDMyKSB7CisgICAgICAgICAgICBjZXJyIDw8ICJTbGVlcGluZyBsb25nZXIgcHJvYmFibHkgd29uJ3QgbWFrZSBhIGRpZmZlcmVuY2UuIiA8PCBlbmRsOworICAgICAgICAgICAgY2VyciA8PCAiU2VyaWFsaXppbmcgYmVuY2htYXJrcyB0byAiIDw8IHNlc3Npb25fZmlsZW5hbWUgPDwgZW5kbDsKKyAgICAgICAgICAgIHNlcmlhbGl6ZV9iZW5jaG1hcmtzKHNlc3Npb25fZmlsZW5hbWUsIGJlbmNobWFya3MsIGZpcnN0X2JlbmNobWFya190b19ydW4pOworICAgICAgICAgICAgY2VyciA8PCAiTm93IHJlc3RhcnQgdGhpcyBiZW5jaG1hcmssIGFuZCBpdCBzaG91bGQgcGljayB1cCB3aGVyZSB3ZSBsZWZ0LiIgPDwgZW5kbDsKKyAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgICAgfQorICAgICAgICAgIHJlcnVuX2xhc3RfdGVzdHMgPSB0cnVlOworICAgICAgICAgIGNlcnIgPDwgIlNsZWVwaW5nICIKKyAgICAgICAgICAgICAgIDw8IHNlY29uZHNfdG9fc2xlZXBfaWZfbG93ZXJfY2xvY2tfc3BlZWQKKyAgICAgICAgICAgICAgIDw8ICIgcy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHIiIDw8IGVuZGw7CisgICAgICAgICAgc2xlZXAoc2Vjb25kc190b19zbGVlcF9pZl9sb3dlcl9jbG9ja19zcGVlZCk7CisgICAgICAgICAgY3VycmVudF9jbG9ja19zcGVlZCA9IG1lYXN1cmVfY2xvY2tfc3BlZWQoKTsKKyAgICAgICAgICBzZWNvbmRzX3RvX3NsZWVwX2lmX2xvd2VyX2Nsb2NrX3NwZWVkICo9IDI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJlcnVuX2xhc3RfdGVzdHMpIHsKKyAgICAgICAgY2VyciA8PCAiUmVkb2luZyB0aGUgbGFzdCAiCisgICAgICAgICAgICAgPDwgMTAwLjBmICogZmxvYXQoYmVuY2htYXJrX2luZGV4IC0gZmlyc3RfYmVuY2htYXJrX3RvX3J1bikgLyBiZW5jaG1hcmtzLnNpemUoKQorICAgICAgICAgICAgIDw8ICIgJSBiZWNhdXNlIGNsb2NrIHNwZWVkIGhhZCBiZWVuIGxvdy4gICAiIDw8IGVuZGw7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gbm90aGluZyB3cm9uZyB3aXRoIHRoZSBjbG9jayBzcGVlZCBzbyBmYXIsIHNvIHRoZXJlIHdvbid0IGJlIGEgbmVlZCB0byByZXJ1bgorICAgICAgLy8gYmVuY2htYXJrcyBydW4gc28gZmFyIGluIGNhc2Ugd2UgbGF0ZXIgZW5jb3VudGVyIGEgbG93ZXIgY2xvY2sgc3BlZWQuCisgICAgICBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID0gYmVuY2htYXJrX2luZGV4OworICAgIH0KKworICAgIGlmIChiZW5jaG1hcmtfaW5kZXggPT0gYmVuY2htYXJrcy5zaXplKCkpIHsKKyAgICAgIC8vIFdlJ3JlIGRvbmUhCisgICAgICBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID0gYmVuY2htYXJrcy5zaXplKCk7CisgICAgICAvLyBFcmFzZSBwcm9ncmVzcyBpbmZvCisgICAgICBjZXJyIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGlzcGxheSBwcm9ncmVzcyBpbmZvIG9uIHN0ZGVycgorICAgIGlmICh0aW1lX25vdyA+IHRpbWVfbGFzdF9wcm9ncmVzc191cGRhdGUgKyAxLjBmKSB7CisgICAgICB0aW1lX2xhc3RfcHJvZ3Jlc3NfdXBkYXRlID0gdGltZV9ub3c7CisgICAgICBjZXJyIDw8ICJNZWFzdXJlbWVudHMuLi4gIiA8PCAxMDAuMGYgKiByYXRpb19kb25lCisgICAgICAgICAgIDw8ICIgJSwgRVRBICIKKyAgICAgICAgICAgPDwgaHVtYW5fZHVyYXRpb25fdChmbG9hdCh0aW1lX25vdyAtIHRpbWVfc3RhcnQpICogKDEuMGYgLSByYXRpb19kb25lKSAvIHJhdGlvX2RvbmUpCisgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyIiA8PCBmbHVzaDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHdlIGFjdHVhbGx5IHJ1biBhIGJlbmNobWFyayEKKyAgICBiZW5jaG1hcmtzW2JlbmNobWFya19pbmRleF0ucnVuKCk7CisgICAgYmVuY2htYXJrX2luZGV4Kys7CisgIH0KK30KKwordm9pZCBydW5fYmVuY2htYXJrcyh2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzKQoreworICBzaXplX3QgZmlyc3RfYmVuY2htYXJrX3RvX3J1bjsKKyAgdmVjdG9yPGJlbmNobWFya190PiBkZXNlcmlhbGl6ZWRfYmVuY2htYXJrczsKKyAgYm9vbCB1c2VfZGVzZXJpYWxpemVkX2JlbmNobWFya3MgPSBmYWxzZTsKKyAgaWYgKGRlc2VyaWFsaXplX2JlbmNobWFya3Moc2Vzc2lvbl9maWxlbmFtZSwgZGVzZXJpYWxpemVkX2JlbmNobWFya3MsIGZpcnN0X2JlbmNobWFya190b19ydW4pKSB7CisgICAgY2VyciA8PCAiRm91bmQgc2VyaWFsaXplZCBzZXNzaW9uIHdpdGggIgorICAgICAgICAgPDwgMTAwLjBmICogZmlyc3RfYmVuY2htYXJrX3RvX3J1biAvIGRlc2VyaWFsaXplZF9iZW5jaG1hcmtzLnNpemUoKQorICAgICAgICAgPDwgIiAlIGFscmVhZHkgZG9uZSIgPDwgZW5kbDsKKyAgICBpZiAoZGVzZXJpYWxpemVkX2JlbmNobWFya3Muc2l6ZSgpID09IGJlbmNobWFya3Muc2l6ZSgpICYmCisgICAgICAgIGZpcnN0X2JlbmNobWFya190b19ydW4gPiAwICYmCisgICAgICAgIGZpcnN0X2JlbmNobWFya190b19ydW4gPCBiZW5jaG1hcmtzLnNpemUoKSkKKyAgICB7CisgICAgICB1c2VfZGVzZXJpYWxpemVkX2JlbmNobWFya3MgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmICh1c2VfZGVzZXJpYWxpemVkX2JlbmNobWFya3MpIHsKKyAgICBiZW5jaG1hcmtzID0gZGVzZXJpYWxpemVkX2JlbmNobWFya3M7CisgIH0gZWxzZSB7CisgICAgLy8gbm90IHVzaW5nIGRlc2VyaWFsaXplZCBiZW5jaG1hcmtzLCBzdGFydGluZyBmcm9tIHNjcmF0Y2gKKyAgICBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID0gMDsKKworICAgIC8vIFJhbmRvbWx5IHNodWZmbGluZyBiZW5jaG1hcmtzIGFsbG93cyB1cyB0byBnZXQgYWNjdXJhdGUgZW5vdWdoIHByb2dyZXNzIGluZm8sCisgICAgLy8gYXMgbm93IHRoZSBjaGVhcC9leHBlbnNpdmUgYmVuY2htYXJrcyBhcmUgcmFuZG9tbHkgbWl4ZWQgc28gdGhleSBhdmVyYWdlIG91dC4KKyAgICAvLyBJdCBhbHNvIG1lYW5zIHRoYXQgaWYgZGF0YSBpcyBjb3JydXB0ZWQgZm9yIHNvbWUgdGltZSBzcGFuLCB0aGUgb2RkcyBhcmUgdGhhdAorICAgIC8vIG5vdCBhbGwgcmVwZXRpdGlvbnMgb2YgYSBnaXZlbiBiZW5jaG1hcmsgd2lsbCBiZSBjb3JydXB0ZWQuCisgICAgcmFuZG9tX3NodWZmbGUoYmVuY2htYXJrcy5iZWdpbigpLCBiZW5jaG1hcmtzLmVuZCgpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgbWF4X2Nsb2NrX3NwZWVkID0gbWF4KG1heF9jbG9ja19zcGVlZCwgbWVhc3VyZV9jbG9ja19zcGVlZCgpKTsKKyAgfQorICAKKyAgZG91YmxlIHRpbWVfc3RhcnQgPSAwLjA7CisgIHdoaWxlIChmaXJzdF9iZW5jaG1hcmtfdG9fcnVuIDwgYmVuY2htYXJrcy5zaXplKCkpIHsKKyAgICBpZiAoZmlyc3RfYmVuY2htYXJrX3RvX3J1biA9PSAwKSB7CisgICAgICB0aW1lX3N0YXJ0ID0gdGltZXIuZ2V0UmVhbFRpbWUoKTsKKyAgICB9CisgICAgdHJ5X3J1bl9zb21lX2JlbmNobWFya3MoYmVuY2htYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2JlbmNobWFya190b19ydW4pOworICB9CisKKyAgLy8gU29ydCB0aW1pbmdzIGJ5IGluY3JlYXNpbmcgYmVuY2htYXJrIHBhcmFtZXRlcnMsIGFuZCBkZWNyZWFzaW5nIGdmbG9wcy4KKyAgLy8gVGhlIGxhdHRlciBpcyB2ZXJ5IGltcG9ydGFudC4gSXQgbWVhbnMgdGhhdCB3ZSBjYW4gaWdub3JlIGFsbCBidXQgdGhlIGZpcnN0CisgIC8vIGJlbmNobWFyayB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuCisgIHNvcnQoYmVuY2htYXJrcy5iZWdpbigpLCBiZW5jaG1hcmtzLmVuZCgpKTsKKworICAvLyBDb2xsZWN0IGJlc3QgKGkuZS4gbm93IGZpcnN0KSByZXN1bHRzIGZvciBlYWNoIHBhcmFtZXRlciB2YWx1ZXMuCisgIHZlY3RvcjxiZW5jaG1hcmtfdD4gYmVzdF9iZW5jaG1hcmtzOworICBmb3IgKGF1dG8gaXQgPSBiZW5jaG1hcmtzLmJlZ2luKCk7IGl0ICE9IGJlbmNobWFya3MuZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoYmVzdF9iZW5jaG1hcmtzLmVtcHR5KCkgfHwKKyAgICAgICAgYmVzdF9iZW5jaG1hcmtzLmJhY2soKS5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSAhPSBpdC0+Y29tcGFjdF9wcm9kdWN0X3NpemUgfHwKKyAgICAgICAgYmVzdF9iZW5jaG1hcmtzLmJhY2soKS5jb21wYWN0X2Jsb2NrX3NpemUgIT0gaXQtPmNvbXBhY3RfYmxvY2tfc2l6ZSkKKyAgICB7CisgICAgICBiZXN0X2JlbmNobWFya3MucHVzaF9iYWNrKCppdCk7CisgICAgfQorICB9CisKKyAgLy8ga2VlcCBhbmQgcmV0dXJuIG9ubHkgdGhlIGJlc3QgYmVuY2htYXJrcworICBiZW5jaG1hcmtzID0gYmVzdF9iZW5jaG1hcmtzOworfQorCitzdHJ1Y3QgbWVhc3VyZV9hbGxfcG90X3NpemVzX2FjdGlvbl90IDogYWN0aW9uX3QKK3sKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBpbnZva2F0aW9uX25hbWUoKSBjb25zdCB7IHJldHVybiAiYWxsLXBvdC1zaXplcyI7IH0KKyAgdmlydHVhbCB2b2lkIHJ1bigpIGNvbnN0CisgIHsKKyAgICB2ZWN0b3I8YmVuY2htYXJrX3Q+IGJlbmNobWFya3M7CisgICAgZm9yIChpbnQgcmVwZXRpdGlvbiA9IDA7IHJlcGV0aXRpb24gPCBtZWFzdXJlbWVudF9yZXBldGl0aW9uczsgcmVwZXRpdGlvbisrKSB7CisgICAgICBmb3IgKHNpemVfdCBrc2l6ZSA9IG1pbnNpemU7IGtzaXplIDw9IG1heHNpemU7IGtzaXplICo9IDIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgbXNpemUgPSBtaW5zaXplOyBtc2l6ZSA8PSBtYXhzaXplOyBtc2l6ZSAqPSAyKSB7CisgICAgICAgICAgZm9yIChzaXplX3QgbnNpemUgPSBtaW5zaXplOyBuc2l6ZSA8PSBtYXhzaXplOyBuc2l6ZSAqPSAyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBrYmxvY2sgPSBtaW5zaXplOyBrYmxvY2sgPD0ga3NpemU7IGtibG9jayAqPSAyKSB7CisgICAgICAgICAgICAgIGZvciAoc2l6ZV90IG1ibG9jayA9IG1pbnNpemU7IG1ibG9jayA8PSBtc2l6ZTsgbWJsb2NrICo9IDIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBuYmxvY2sgPSBtaW5zaXplOyBuYmxvY2sgPD0gbnNpemU7IG5ibG9jayAqPSAyKSB7CisgICAgICAgICAgICAgICAgICBiZW5jaG1hcmtzLmVtcGxhY2VfYmFjayhrc2l6ZSwgbXNpemUsIG5zaXplLCBrYmxvY2ssIG1ibG9jaywgbmJsb2NrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBydW5fYmVuY2htYXJrcyhiZW5jaG1hcmtzKTsKKworICAgIGNvdXQgPDwgIkJFR0lOIE1FQVNVUkVNRU5UUyBBTEwgUE9UIFNJWkVTIiA8PCBlbmRsOworICAgIGZvciAoYXV0byBpdCA9IGJlbmNobWFya3MuYmVnaW4oKTsgaXQgIT0gYmVuY2htYXJrcy5lbmQoKTsgKytpdCkgeworICAgICAgY291dCA8PCAqaXQgPDwgZW5kbDsKKyAgICB9CisgIH0KK307CisKK3N0cnVjdCBtZWFzdXJlX2RlZmF1bHRfc2l6ZXNfYWN0aW9uX3QgOiBhY3Rpb25fdAoreworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJkZWZhdWx0LXNpemVzIjsgfQorICB2aXJ0dWFsIHZvaWQgcnVuKCkgY29uc3QKKyAgeworICAgIHZlY3RvcjxiZW5jaG1hcmtfdD4gYmVuY2htYXJrczsKKyAgICBmb3IgKGludCByZXBldGl0aW9uID0gMDsgcmVwZXRpdGlvbiA8IG1lYXN1cmVtZW50X3JlcGV0aXRpb25zOyByZXBldGl0aW9uKyspIHsKKyAgICAgIGZvciAoc2l6ZV90IGtzaXplID0gbWluc2l6ZTsga3NpemUgPD0gbWF4c2l6ZTsga3NpemUgKj0gMikgeworICAgICAgICBmb3IgKHNpemVfdCBtc2l6ZSA9IG1pbnNpemU7IG1zaXplIDw9IG1heHNpemU7IG1zaXplICo9IDIpIHsKKyAgICAgICAgICBmb3IgKHNpemVfdCBuc2l6ZSA9IG1pbnNpemU7IG5zaXplIDw9IG1heHNpemU7IG5zaXplICo9IDIpIHsKKyAgICAgICAgICAgIGJlbmNobWFya3MuZW1wbGFjZV9iYWNrKGtzaXplLCBtc2l6ZSwgbnNpemUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJ1bl9iZW5jaG1hcmtzKGJlbmNobWFya3MpOworCisgICAgY291dCA8PCAiQkVHSU4gTUVBU1VSRU1FTlRTIERFRkFVTFQgU0laRVMiIDw8IGVuZGw7CisgICAgZm9yIChhdXRvIGl0ID0gYmVuY2htYXJrcy5iZWdpbigpOyBpdCAhPSBiZW5jaG1hcmtzLmVuZCgpOyArK2l0KSB7CisgICAgICBjb3V0IDw8ICppdCA8PCBlbmRsOworICAgIH0KKyAgfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgZG91YmxlIHRpbWVfc3RhcnQgPSB0aW1lci5nZXRSZWFsVGltZSgpOworICBjb3V0LnByZWNpc2lvbig0KTsKKyAgY2Vyci5wcmVjaXNpb24oNCk7CisKKyAgdmVjdG9yPHVuaXF1ZV9wdHI8YWN0aW9uX3Q+PiBhdmFpbGFibGVfYWN0aW9uczsKKyAgYXZhaWxhYmxlX2FjdGlvbnMuZW1wbGFjZV9iYWNrKG5ldyBtZWFzdXJlX2FsbF9wb3Rfc2l6ZXNfYWN0aW9uX3QpOworICBhdmFpbGFibGVfYWN0aW9ucy5lbXBsYWNlX2JhY2sobmV3IG1lYXN1cmVfZGVmYXVsdF9zaXplc19hY3Rpb25fdCk7CisKKyAgYXV0byBhY3Rpb24gPSBhdmFpbGFibGVfYWN0aW9ucy5lbmQoKTsKKworICBpZiAoYXJnYyA8PSAxKSB7CisgICAgc2hvd191c2FnZV9hbmRfZXhpdChhcmdjLCBhcmd2LCBhdmFpbGFibGVfYWN0aW9ucyk7CisgIH0KKyAgZm9yIChhdXRvIGl0ID0gYXZhaWxhYmxlX2FjdGlvbnMuYmVnaW4oKTsgaXQgIT0gYXZhaWxhYmxlX2FjdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoIXN0cmNtcChhcmd2WzFdLCAoKml0KS0+aW52b2thdGlvbl9uYW1lKCkpKSB7CisgICAgICBhY3Rpb24gPSBpdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChhY3Rpb24gPT0gYXZhaWxhYmxlX2FjdGlvbnMuZW5kKCkpIHsKKyAgICBzaG93X3VzYWdlX2FuZF9leGl0KGFyZ2MsIGFyZ3YsIGF2YWlsYWJsZV9hY3Rpb25zKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAyOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgaWYgKGFyZ3ZbaV0gPT0gc3Ryc3RyKGFyZ3ZbaV0sICItLW1pbi13b3JraW5nLXNldC1zaXplPSIpKSB7CisgICAgICBjb25zdCBjaGFyKiBlcXVhbHNfc2lnbiA9IHN0cmNocihhcmd2W2ldLCAnPScpOworICAgICAgbWluX3dvcmtpbmdfc2V0X3NpemUgPSBzdHJ0b3VsKGVxdWFsc19zaWduKzEsIG51bGxwdHIsIDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgY2VyciA8PCAidW5yZWNvZ25pemVkIG9wdGlvbjogIiA8PCBhcmd2W2ldIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIHNob3dfdXNhZ2VfYW5kX2V4aXQoYXJnYywgYXJndiwgYXZhaWxhYmxlX2FjdGlvbnMpOworICAgIH0KKyAgfQorCisgIHByaW50X2NwdWluZm8oKTsKKworICBjb3V0IDw8ICJiZW5jaG1hcmsgcGFyYW1ldGVyczoiIDw8IGVuZGw7CisgIGNvdXQgPDwgInBvaW50ZXIgc2l6ZTogIiA8PCA4KnNpemVvZih2b2lkKikgPDwgIiBiaXRzIiA8PCBlbmRsOworICBjb3V0IDw8ICJzY2FsYXIgdHlwZTogIiA8PCB0eXBlX25hbWU8U2NhbGFyPigpIDw8IGVuZGw7CisgIGNvdXQgPDwgInBhY2tldCBzaXplOiAiIDw8IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPE1hdHJpeFR5cGU6OlNjYWxhcj46OnNpemUgPDwgZW5kbDsKKyAgY291dCA8PCAibWluc2l6ZSA9ICIgPDwgbWluc2l6ZSA8PCBlbmRsOworICBjb3V0IDw8ICJtYXhzaXplID0gIiA8PCBtYXhzaXplIDw8IGVuZGw7CisgIGNvdXQgPDwgIm1lYXN1cmVtZW50X3JlcGV0aXRpb25zID0gIiA8PCBtZWFzdXJlbWVudF9yZXBldGl0aW9ucyA8PCBlbmRsOworICBjb3V0IDw8ICJtaW5fYWNjdXJhdGVfdGltZSA9ICIgPDwgbWluX2FjY3VyYXRlX3RpbWUgPDwgZW5kbDsKKyAgY291dCA8PCAibWluX3dvcmtpbmdfc2V0X3NpemUgPSAiIDw8IG1pbl93b3JraW5nX3NldF9zaXplOworICBpZiAobWluX3dvcmtpbmdfc2V0X3NpemUgPT0gMCkgeworICAgIGNvdXQgPDwgIiAodHJ5IHRvIG91dHNpemUgY2FjaGVzKSI7CisgIH0KKyAgY291dCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgKCphY3Rpb24pLT5ydW4oKTsKKworICBkb3VibGUgdGltZV9lbmQgPSB0aW1lci5nZXRSZWFsVGltZSgpOworICBjZXJyIDw8ICJGaW5pc2hlZCBpbiAiIDw8IGh1bWFuX2R1cmF0aW9uX3QodGltZV9lbmQgLSB0aW1lX3N0YXJ0KSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrLmNwcCBiL2JlbmNoL2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyMWI5MAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gZysrIC1PMyAtRE5ERUJVRyAtRE1BVFNJWkU9PHg+IGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworI2lmbmRlZiBNQVRTSVpFCisjZGVmaW5lIE1BVFNJWkUgMworI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCA0MDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgU0NBTEFSCisjZGVmaW5lIFNDQUxBUiBkb3VibGUKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPiBJID0gTWF0cml4PFNDQUxBUixNQVRTSVpFLE1BVFNJWkU+OjpPbmVzKCk7CisgICAgTWF0cml4PFNDQUxBUixNQVRTSVpFLE1BVFNJWkU+IG07CisgICAgZm9yKGludCBpID0gMDsgaSA8IE1BVFNJWkU7IGkrKykKKyAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IE1BVFNJWkU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbShpLGopID0gKGkrTUFUU0laRSpqKTsKKyAgICAgICAgfQorICAgIGFzbSgiI2JlZ2luIik7CisgICAgZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorICAgIHsKKyAgICAgICAgbSA9IE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPjo6T25lcygpICsgMC4wMDAwNSAqIChtICsgKG0qbSkpOworICAgIH0KKyAgICBhc20oIiNlbmQiKTsKKyAgICBjb3V0IDw8IG0gPDwgZW5kbDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNobWFya1NsaWNlLmNwcCBiL2JlbmNoL2JlbmNobWFya1NsaWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI4OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2htYXJrU2xpY2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIGcrKyAtTzMgLUROREVCVUcgYmVuY2htYXJrWC5jcHAgLW8gYmVuY2htYXJrWCAmJiB0aW1lIC4vYmVuY2htYXJrWAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIFNDQUxBUgorI2RlZmluZSBTQ0FMQVIgZmxvYXQKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0eXBlZGVmIE1hdHJpeDxTQ0FMQVIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0OworICBNYXQgbSgxMDAsIDEwMCk7CisgIG0uc2V0UmFuZG9tKCk7CisKKyAgZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorICB7CisgICAgaW50IHIsIGMsIG5yLCBuYzsKKyAgICByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDEwKTsKKyAgICBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDEwKTsKKyAgICBuciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oNTAsODApOworICAgIG5jID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50Pig1MCw4MCk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpICs9IE1hdDo6T25lcyhucixuYyk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpICo9IFNDQUxBUigxMCk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpIC09IE1hdDo6Y29uc3RhbnQobnIsbmMsMTApOworICAgIG0uYmxvY2socixjLG5yLG5jKSAvPSBTQ0FMQVIoMTApOworICB9CisgIGNvdXQgPDwgbVswXSA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNobWFya1guY3BwIGIvYmVuY2gvYmVuY2htYXJrWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNobWFya1guY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIGcrKyAtZm9wZW5tcCAtSSAuLiAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MTAwMCBiZW5jaG1hcmtYLmNwcCAtbyBiICYmIHRpbWUgLi9iCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgTUFUVFlQRQorI2RlZmluZSBNQVRUWVBFIE1hdHJpeFhMZAorI2VuZGlmCisKKyNpZm5kZWYgTUFUU0laRQorI2RlZmluZSBNQVRTSVpFIDQwMAorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxMDAKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCU1BVFRZUEUgSSA9IE1BVFRZUEU6Ok9uZXMoTUFUU0laRSxNQVRTSVpFKTsKKwlNQVRUWVBFIG0oTUFUU0laRSxNQVRTSVpFKTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgTUFUU0laRTsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgTUFUU0laRTsgaisrKQorCXsKKwkJbShpLGopID0gKGkraisxKS8oTUFUU0laRSpNQVRTSVpFKTsKKwl9CisJZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorCXsKKwkJbSA9IEkgKyAwLjAwMDEgKiAobSArIG0qbSk7CisJfQorCWNvdXQgPDwgbSgwLDApIDw8IGVuZGw7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaG1hcmtYY3dpc2UuY3BwIGIvYmVuY2gvYmVuY2htYXJrWGN3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQzNzQzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2htYXJrWGN3aXNlLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBnKysgLU8zIC1ETkRFQlVHIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1gKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgVkVDVFlQRQorI2RlZmluZSBWRUNUWVBFIFZlY3RvclhMZAorI2VuZGlmCisKKyNpZm5kZWYgVkVDU0laRQorI2RlZmluZSBWRUNTSVpFIDEwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMAorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVkVDVFlQRSBJID0gVkVDVFlQRTo6T25lcyhWRUNTSVpFKTsKKwlWRUNUWVBFIG0oVkVDU0laRSwxKTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgVkVDU0laRTsgaSsrKQorCXsKKwkJbVtpXSA9IDAuMSAqIGkvVkVDU0laRTsKKwl9CisJZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorCXsKKwkJbSA9IFZFQ1RZUEU6Ok9uZXMoVkVDU0laRSkgKyAwLjAwMDA1ICogKG0uY3dpc2UoKS5zcXVhcmUoKSArIG0vNCk7CisJfQorCWNvdXQgPDwgbVswXSA8PCBlbmRsOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrX3N1aXRlIGIvYmVuY2gvYmVuY2htYXJrX3N1aXRlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMjFkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaG1hcmtfc3VpdGUKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL2Jhc2gKK0NYWD0ke0NYWC1nKyt9ICMgZGVmYXVsdCB2YWx1ZSB1bmxlc3MgY2FsbGVyIGhhcyBkZWZpbmVkIENYWAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIGNvbHVtbi1tYWpvciwgLUROREVCVUciCiskQ1hYIC1PMyAtSSAuLiAtRE5ERUJVRyBiZW5jaG1hcmsuY3BwIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKK2VjaG8gIkZpeGVkIHNpemUgM3gzLCBjb2x1bW4tbWFqb3IsIHdpdGggYXNzZXJ0cyIKKyRDWFggLU8zIC1JIC4uIGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsgPi9kZXYvbnVsbAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIHJvdy1tYWpvciwgLUROREVCVUciCiskQ1hYIC1PMyAtSSAuLiAtREVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SIC1ETkRFQlVHIGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsgPi9kZXYvbnVsbAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIHJvdy1tYWpvciwgd2l0aCBhc3NlcnRzIgorJENYWCAtTzMgLUkgLi4gLURFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiBiZW5jaG1hcmsuY3BwIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKK2VjaG8gIkR5bmFtaWMgc2l6ZSAyMHgyMCwgY29sdW1uLW1ham9yLCAtRE5ERUJVRyIKKyRDWFggLU8zIC1JIC4uIC1ETkRFQlVHIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbAorZWNobyAiRHluYW1pYyBzaXplIDIweDIwLCBjb2x1bW4tbWFqb3IsIHdpdGggYXNzZXJ0cyIKKyRDWFggLU8zIC1JIC4uIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbAorZWNobyAiRHluYW1pYyBzaXplIDIweDIwLCByb3ctbWFqb3IsIC1ETkRFQlVHIgorJENYWCAtTzMgLUkgLi4gLURFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiAtRE5ERUJVRyBiZW5jaG1hcmtYLmNwcCAtbyBiZW5jaG1hcmtYICYmIHRpbWUgLi9iZW5jaG1hcmtYID4vZGV2L251bGwKK2VjaG8gIkR5bmFtaWMgc2l6ZSAyMHgyMCwgcm93LW1ham9yLCB3aXRoIGFzc2VydHMiCiskQ1hYIC1PMyAtSSAuLiAtREVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmY5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMDcgQEAKK1BST0pFQ1QoQlRMKQorCitDTUFLRV9NSU5JTVVNX1JFUVVJUkVEKFZFUlNJT04gMi42LjIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke1BST0pFQ1RfU09VUkNFX0RJUn0vY21ha2UgJHtFaWdlbl9TT1VSQ0VfRElSfS9jbWFrZSkKK2luY2x1ZGUoTWFjcm9PcHRpb25hbEFkZFN1YmRpcmVjdG9yeSkKKworT1BUSU9OKEJUTF9OT1ZFQyAiRGlzYWJsZSBTU0UvQWx0aXZlYyBvcHRpbWl6YXRpb25zIHdoZW4gcG9zc2libGUiIE9GRikKKworU0VUKENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKK3N0cmluZyhSRUdFWCBNQVRDSCBpY3BjIElTX0lDUEMgJHtDTUFLRV9DWFhfQ09NUElMRVJ9KQorSUYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIE9SIElTX0lDUEMpCisgIFNFVChDTUFLRV9DWFhfRkxBR1MgIi1nMCAtTzMgLUROREVCVUcgJHtDTUFLRV9DWFhfRkxBR1N9IikKKyAgU0VUKENNQUtFX0ZvcnRyYW5fRkxBR1MgIi1nMCAtTzMgLUROREVCVUcgJHtDTUFLRV9Gb3J0cmFuX0ZMQUdTfSIpCisgIElGKEJUTF9OT1ZFQykKKyAgICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLURFSUdFTl9ET05UX1ZFQ1RPUklaRSIpCisgIEVORElGKEJUTF9OT1ZFQykKK0VORElGKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBPUiBJU19JQ1BDKQorCitJRihNU1ZDKQorICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIgL08yIC9PdCAvR0wgL2ZwOmZhc3QgLUROREVCVUciKQorIyAgIFNFVChDTUFLRV9Gb3J0cmFuX0ZMQUdTICItZzAgLU8zIC1ETkRFQlVHIikKKyAgSUYoQlRMX05PVkVDKQorICAgIFNFVChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIikKKyAgRU5ESUYoQlRMX05PVkVDKQorRU5ESUYoTVNWQykKKworaWYoSVNfSUNQQykKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiLWZhc3QgJHtDTUFLRV9DWFhfRkxBR1N9IikKKyAgc2V0KENNQUtFX0ZvcnRyYW5fRkxBR1MgIi1mYXN0ICR7Q01BS0VfRm9ydHJhbl9GTEFHU30iKQorZW5kaWYoSVNfSUNQQykKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2FjdGlvbnMKKyAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2dlbmVyaWNfYmVuY2gKKyAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2dlbmVyaWNfYmVuY2gvdXRpbHMKKyAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYnMvU1RMKQorCisjIGZpbmRfcGFja2FnZShNS0wpCisjIGlmIChNS0xfRk9VTkQpCisjICAgYWRkX2RlZmluaXRpb25zKC1ESEFWRV9NS0wpCisjICAgc2V0KERFRkFVTFRfTElCUkFSSUVTICR7TUtMX0xJQlJBUklFU30pCisjIGVuZGlmIChNS0xfRk9VTkQpCisKK2ZpbmRfbGlicmFyeShFSUdFTl9CVExfUlRfTElCUkFSWSBydCkKKyMgaWYgd2UgY2Fubm90IGZpbmQgaXQgZWFzaWx5LCB0aGVuIHdlIGRvbid0IG5lZWQgaXQhCitpZihOT1QgRUlHRU5fQlRMX1JUX0xJQlJBUlkpCisgIHNldChFSUdFTl9CVExfUlRfTElCUkFSWSAiIikKK2VuZGlmKCkKKworTUFDUk8oQlRMX0FERF9CRU5DSCB0YXJnZXRuYW1lKQorCisgIGZvcmVhY2goX2N1cnJlbnRfdmFyICR7QVJHTn0pCisgICAgc2V0KF9sYXN0X3ZhciAke19jdXJyZW50X3Zhcn0pCisgIGVuZGZvcmVhY2goX2N1cnJlbnRfdmFyKQorCisgIHNldChfc291cmNlcyAke0FSR059KQorICBsaXN0KExFTkdUSCBfc291cmNlcyBfYXJnbl9sZW5ndGgpCisKKyAgbGlzdChSRU1PVkVfSVRFTSBfc291cmNlcyBPTiBPRkYgVFJVRSBGQUxTRSkKKworICBsaXN0KExFTkdUSCBfc291cmNlcyBfc3JjX2xlbmd0aCkKKworICBpZiAoJHtfYXJnbl9sZW5ndGh9IEVRVUFMICR7X3NyY19sZW5ndGh9KQorICAgIHNldChfbGFzdF92YXIgT04pCisgIGVuZGlmICgke19hcmduX2xlbmd0aH0gRVFVQUwgJHtfc3JjX2xlbmd0aH0pCisKKyAgT1BUSU9OKEJVSUxEXyR7dGFyZ2V0bmFtZX0gIkJ1aWxkIGJlbmNobWFyayAke3RhcmdldG5hbWV9IiAke19sYXN0X3Zhcn0pCisKKyAgSUYoQlVJTERfJHt0YXJnZXRuYW1lfSkKKyAgICBBRERfRVhFQ1VUQUJMRSgke3RhcmdldG5hbWV9ICR7X3NvdXJjZXN9KQorICAgIEFERF9URVNUKCR7dGFyZ2V0bmFtZX0gIiR7dGFyZ2V0bmFtZX0iKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7REVGQVVMVF9MSUJSQVJJRVN9ICR7RUlHRU5fQlRMX1JUX0xJQlJBUll9KQorICBFTkRJRihCVUlMRF8ke3RhcmdldG5hbWV9KQorCitFTkRNQUNSTyhCVExfQUREX0JFTkNIKQorCittYWNybyhidGxfYWRkX3RhcmdldF9wcm9wZXJ0eSB0YXJnZXQgcHJvcCB2YWx1ZSkKKworICBpZihCVUlMRF8ke3RhcmdldH0pCisgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eShwcmV2aW91cyAke3RhcmdldH0gJHtwcm9wfSkKKyAgICBpZihOT1QgcHJldmlvdXMpCisgICAgICBzZXQocHJldmlvdXMgIiIpCisgICAgZW5kaWYoKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke3RhcmdldH0gUFJPUEVSVElFUyAke3Byb3B9ICIke3ByZXZpb3VzfSAke3ZhbHVlfSIpCisgIGVuZGlmKCkKKworZW5kbWFjcm8oYnRsX2FkZF90YXJnZXRfcHJvcGVydHkpCisKK0VOQUJMRV9URVNUSU5HKCkKKworYWRkX3N1YmRpcmVjdG9yeShsaWJzL2VpZ2VuMykKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9laWdlbjIpCithZGRfc3ViZGlyZWN0b3J5KGxpYnMvdGVuc29ycykKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9CTEFTKQorYWRkX3N1YmRpcmVjdG9yeShsaWJzL3VibGFzKQorYWRkX3N1YmRpcmVjdG9yeShsaWJzL2dtbSkKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9tdGw0KQorYWRkX3N1YmRpcmVjdG9yeShsaWJzL2JsaXR6KQorYWRkX3N1YmRpcmVjdG9yeShsaWJzL3R2bWV0KQorYWRkX3N1YmRpcmVjdG9yeShsaWJzL1NUTCkKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9ibGF6ZSkKKworYWRkX3N1YmRpcmVjdG9yeShkYXRhKQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9DT1BZSU5HIGIvYmVuY2gvYnRsL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2NDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisgICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9SRUFETUUgYi9iZW5jaC9idGwvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjVmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvUkVBRE1FCkBAIC0wLDAgKzEsMTU0IEBACitCZW5jaCBUZW1wbGF0ZSBMaWJyYXJ5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0ludHJvZHVjdGlvbiA6CisKK1RoZSBhaW0gb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGNvbXBhcmUgdGhlIHBlcmZvcm1hbmNlCitvZiBhdmFpbGFibGUgbnVtZXJpY2FsIGxpYnJhcmllcy4gVGhlIGNvZGUgaXMgZGVzaWduZWQKK2FzIGdlbmVyaWMgYW5kIG1vZHVsYXIgYXMgcG9zc2libGUuIFRodXMsIGFkZGluZyBuZXcKK251bWVyaWNhbCBsaWJyYXJpZXMgb3IgbmV3IG51bWVyaWNhbCB0ZXN0cyBzaG91bGQKK3JlcXVpcmUgbWluaW1hbCBlZmZvcnQuCisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworSW5zdGFsbGF0aW9uIDoKKworQlRMIHVzZXMgY21ha2UgLyBjdGVzdDoKKworMSAtIGNyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeToKKworICAkIG1rZGlyIGJ1aWxkCisgICQgY2QgYnVpbGQKKworMiAtIGNvbmZpZ3VyZToKKworICAkIGNjbWFrZSAuLgorCiszIC0gcnVuIHRoZSBiZW5jaCB1c2luZyBjdGVzdDoKKworICAkIGN0ZXN0IC1WCisKK1lvdSBjYW4gcnVuIHRoZSBiZW5jaG1hcmtzIG9ubHkgb24gbGlicmFyaWVzIG1hdGNoaW5nIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uOgorICBjdGVzdCAtViAtUiA8cmVnZXhwPgorRm9yIGluc3RhbmNlOgorICBjdGVzdCAtViAtUiBlaWdlbjIKKworWW91IGNhbiBhbHNvIHNlbGVjdCBhIGdpdmVuIHNldCBvZiBhY3Rpb25zIGRlZmluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBCVExfQ09ORklHIHRoaXMgd2F5OgorICBCVExfQ09ORklHPSItYSBhY3Rpb24xezphY3Rpb24yfSoiIGN0ZXN0IC1WCitBbiBleGVtcGxlOgorICBCVExfQ09ORklHPSItYSBheHB5OnZlY3Rvcl9tYXRyaXg6dHJpc29sdmU6YXRhIiBjdGVzdCAtViAtUiBlaWdlbjIKKworRmluYWxseSwgaWYgYmVuY2ggcmVzdWx0cyBhbHJlYWR5IGV4aXN0ICh0aGUgYmVuY2gqLmRhdCBmaWxlcykgdGhlbiB0aGV5IG1lcmdlcyBieSBrZWVwaW5nIHRoZSBiZXN0IGZvciBlYWNoIG1hdHJpeCBzaXplLiBJZiB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIG9uZXMgeW91IGNhbiBzaW1wbHkgYWRkIHRoZSAiLS1vdmVyd3JpdGUiIG9wdGlvbjoKKyAgQlRMX0NPTkZJRz0iLWEgYXhweTp2ZWN0b3JfbWF0cml4OnRyaXNvbHZlOmF0YSAtLW92ZXJ3cml0ZSIgY3Rlc3QgLVYgLVIgZWlnZW4yCisKKzQgOiBBbmFseXplIHRoZSByZXN1bHQuIGRpZmZlcmVudCBkYXRhIGZpbGVzICguZGF0KSBhcmUgcHJvZHVjZWQgaW4gZWFjaCBsaWJzIGRpcmVjdG9yaWVzLgorIElmIGdudXBsb3QgaXMgYXZhaWxhYmxlLCBjaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgZGF0YSBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIHJlc3VsdHMgYW5kIHR5cGU6CisgICAgICAgICQgY2QgZGF0YQorICAgICAgICAkIG1rZGlyIG15X2RpcmVjdG9yeQorICAgICAgICAkIGNwIC4uL2xpYnMvKi8qLmRhdCBteV9kaXJlY3RvcnkKKyBCdWlsZCB0aGUgZGF0YSB1dGlsaXRpZXMgaW4gdGhpcyAoZGF0YSkgZGlyZWN0b3J5CisgICAgICAgIG1ha2UKKyBUaGVuIHlvdSBjYW4gbG9vayB0aGUgcmF3IGRhdGEsCisgICAgICAgIGdvX21lYW4gbXlfZGlyZWN0b3J5Cisgb3Igc21vb3RoIHRoZSBkYXRhIGZpcnN0IDoKKwlzbW9vdGhfYWxsLnNoIG15X2RpcmVjdG9yeQorCWdvX21lYW4gbXlfZGlyZWN0b3J5X3Ntb290aAorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRmlsZXMgYW5kIGRpcmVjdG9yaWVzIDoKKworIGdlbmVyaWNfYmVuY2ggOiBhbGwgdGhlIGJlbmNoIHNvdXJjZXMgY29tbW9uIHRvIGFsbCBsaWJyYXJpZXMKKworIGFjdGlvbnMgOiBzb3VyY2VzIGZvciBkaWZmZXJlbnQgYWN0aW9uIHdyYXBwZXJzIChheHB5LCBtYXRyaXgtbWF0cml4IHByb2R1Y3QpIHRvIGJlIHRlc3RlZC4KKworIGxpYnMvKiA6IGJlbmNoIHNvdXJjZXMgc3BlY2lmaWMgdG8gZWFjaCB0ZXN0ZWQgbGlicmFyaWVzLgorCisgbWFjaGluZV9kZXAgOiBkaXJlY3RvcnkgdXNlZCB0byBzdG9yZSBtYWNoaW5lIHNwZWNpZmljIE1ha2VmaWxlLmluCisKKyBkYXRhIDogZGlyZWN0b3J5IHVzZWQgdG8gc3RvcmUgZ251cGxvdCBzY3JpcHRzIGFuZCBkYXRhIGFuYWx5c2lzIHV0aWxpdGllcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitQcmluY2lwbGVzIDogdGhlIGNvZGUgbW9kdWxhcml0eSBpcyBhY2hpZXZlZCBieSBkZWZpbmluZyB0d28gY29uY2VwdHMgOgorCisgKioqKioqIEFjdGlvbiBjb25jZXB0IDogVGhpcyBpcyBhIGNsYXNzIGRlZmluaW5nIHdoaWNoIGtpbmQKKyAgb2YgdGVzdCBtdXN0IGJlIHBlcmZvcm1lZCAoZS5nLiBhIG1hdHJpeF92ZWN0b3JfcHJvZHVjdCkuCisJQW4gQWN0aW9uIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtZXRob2RzIDoKKworICAgICAgICAqKiogQ3RvciB1c2luZyB0aGUgc2l6ZSBvZiB0aGUgcHJvYmxlbSAobWF0cml4IG9yIHZlY3RvciBzaXplKSBhcyBhbiBhcmd1bWVudAorCSAgICBBY3Rpb24gYWN0aW9uKHNpemUpOworICAgICAgICAqKiogaW5pdGlhbGl6ZSA6IHRoaXMgbWV0aG9kIGluaXRpYWxpemUgdGhlIGNhbGN1bGF0aW9uIChlLmcuIGluaXRpYWxpemUgdGhlIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIGFyZ3VtZW50cykKKwkgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKwkqKiogY2FsY3VsYXRlIDogdGhpcyBtZXRob2QgYWN0dWFsbHkgbGF1bmNoIHRoZSBjYWxjdWxhdGlvbiB0byBiZSBiZW5jaG1hcmtlZAorCSAgICBhY3Rpb24uY2FsY3VsYXRlOworCSoqKiBuYl9vcF9iYXNlKCkgOiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBjYWxjdWxhdGUgbWV0aG9kIChhbGxvd2luZyB0aGUgbWZsb3BzIGV2YWx1YXRpb24pCisgICAgICAgICoqKiBuYW1lKCkgOiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gKHN0ZDo6c3RyaW5nKQorCisgKioqKioqIEludGVyZmFjZSBjb25jZXB0IDogVGhpcyBpcyBhIGNsYXNzIG9yIG5hbWVzcGFjZSBkZWZpbmluZyBob3cgdG8gdXNlIGEgZ2l2ZW4gbGlicmFyeSBhbmQKKyAgaXRzIHNwZWNpZmljIGNvbnRhaW5lcnMgKG1hdHJpeCBhbmQgdmVjdG9yKS4gVXAgdG8gbm93IGFuIGludGVyZmFjZSBzaG91bGQgZm9sbG93aW5nIHR5cGVzCisKKwkqKiogcmVhbF90eXBlIDoga2luZCBvZiBmbG9hdCB0byBiZSB1c2VkIChmbG9hdCBvciBkb3VibGUpCisJKioqIHN0bF92ZWN0b3IgOiBtdXN0IGNvcnJlc3BvbmQgdG8gc3RkOjp2ZWN0b3I8cmVhbF90eXBlPgorCSoqKiBzdGxfbWF0cml4IDogbXVzdCBjb3JyZXNwb25kIHRvIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+CisJKioqIGdlbmVfdmVjdG9yIDogdGhlIHZlY3RvciB0eXBlIGZvciB0aGlzIGludGVyZmFjZSAgICAgICAgLS0+IGUuZy4gKHJlYWxfdHlwZSAqKSBmb3IgdGhlIENfaW50ZXJmYWNlCisJKioqIGdlbmVfbWF0cml4IDogdGhlIG1hdHJpeCB0eXBlIGZvciB0aGlzIGludGVyZmFjZSAgICAgICAgLS0+IGUuZy4gKGdlbmVfdmVjdG9yICopIGZvciB0aGUgQ19pbnRlcmZhY2UKKworCSsgdGhlIGZvbGxvd2luZyBjb21tb24gbWV0aG9kcworCisgICAgICAgICoqKiBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKSAgZGVhbG9jYXRpb24gb2YgYSBOIHNpemVkIGdlbmVfbWF0cml4IEEKKyAgICAgICAgKioqIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQikgIGRlYWxvY2F0aW9uIG9mIGEgTiBzaXplZCBnZW5lX3ZlY3RvciBCCisgICAgICAgICoqKiBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpIGNvcHkgdGhlIGNvbnRlbnQgb2YgYW4gc3RsX21hdHJpeCBBX3N0bCBpbnRvIGEgZ2VuZV9tYXRyaXggQS4KKwkgICAgIFRoZSBhbGxvY2F0aW9uIG9mIEEgaXMgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uLgorCSoqKiB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKSAgY29weSB0aGUgY29udGVudCBvZiBhbiBzdGxfdmVjdG9yIEJfc3RsIGludG8gYSBnZW5lX3ZlY3RvciBCLgorCSAgICAgVGhlIGFsbG9jYXRpb24gb2YgQiBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICoqKiBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKSBjb3B5IHRoZSBjb250ZW50IG9mIGFuIGdlbmVfbWF0cml4IEEgaW50byBhbiBzdGxfbWF0cml4IEFfc3RsLgorICAgICAgICAgICAgIFRoZSBzaXplIG9mIEFfU1RMIG11c3QgY29ycmVzcG9uZHMgdG8gdGhlIHNpemUgb2YgQS4KKyAgICAgICAgKioqIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBBLCBzdGxfdmVjdG9yICYgQV9zdGwpIGNvcHkgdGhlIGNvbnRlbnQgb2YgYW4gZ2VuZV92ZWN0b3IgQSBpbnRvIGFuIHN0bF92ZWN0b3IgQV9zdGwuCisgICAgICAgICAgICAgVGhlIHNpemUgb2YgQl9TVEwgbXVzdCBjb3JyZXNwb25kcyB0byB0aGUgc2l6ZSBvZiBCLgorCSoqKiBjb3B5X21hdHJpeChnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4pIDogY29weSB0aGUgY29udGVudCBvZiBzb3VyY2UgaW4gY2libGUuIEJvdGggc291cmNlCisJCWFuZCBjaWJsZSBtdXN0IGJlIHNpemVkIE54Ti4KKwkqKiogY29weV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKSA6IGNvcHkgdGhlIGNvbnRlbnQgb2Ygc291cmNlIGluIGNpYmxlLiBCb3RoIHNvdXJjZQorIAkJYW5kIGNpYmxlIG11c3QgYmUgc2l6ZWQgTi4KKworCWFuZCB0aGUgZm9sbG93aW5nIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhY3Rpb24gb25lIHdhbnRzIHRvIGJlIGJlbmNobWFya2VkIDoKKworCSoqKiAgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQorCSoqKiAgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQorICAgICAgICAqKiogIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKwkqKiogIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKyAgICAgICAgKioqICBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKQorCisgVGhlIGJlbmNoIGFsZ29yaXRobSAoZ2VuZXJpY19iZW5jaC9iZW5jaC5oaCkgaXMgdGVtcGxhdGVkIHdpdGggYW4gYWN0aW9uIGl0c2VsZiB0ZW1wbGF0ZWQgd2l0aAorIGFuIGludGVyZmFjZS4gQSB0eXBpY2FsIG1haW4uY3BwIHNvdXJjZSBzdG9yZWQgaW4gYSBnaXZlbiBsaWJyYXJ5IGRpcmVjdG9yeSBsaWJzL0FfTElCCisgbG9va3MgbGlrZSA6CisKKyBiZW5jaDwgQU5fQUNUSU9OIDwgQU5fSU5URVJGQUNFID4gPiggMTAgLCAxMDAwICwgNTAgKSA7CisKKyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZSBYWSBkYXRhIGZpbGUgY29udGFpbmluZyBtZWFzdXJlZCAgbWZsb3BzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIHNpemUgZm9yIDUwCisgc2l6ZXMgYmV0d2VlbiAxMCBhbmQgMTAwMDAuCisKKyBUaGlzIGFsZ29yaXRobSBjYW4gYmUgYWRhcHRlZCBieSBwcm92aWRpbmcgYSBnaXZlbiBQZXJmX0FuYWx5emVyIG9iamVjdCB3aGljaCBkZXRlcm1pbmVzIGhvdyB0aGUgdGltZQorIG1lYXN1cmVtZW50cyBtdXN0IGJlIGRvbmUuIEZvciBleGFtcGxlLCB0aGUgWDg2X1BlcmZfQW5hbHl6ZXIgdXNlIHRoZSBhc20gcmR0c2MgZnVuY3Rpb24gYW5kIHByb3ZpZGVzCisgYSB2ZXJ5IGZhc3QgYW5kIGFjY3VyYXRlIChidXQgbGVzcyBwb3J0YWJsZSkgdGltaW5nIG1ldGhvZC4gVGhlIGRlZmF1bHQgaXMgdGhlIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIKKyBzbworCisgYmVuY2g8IEFOX0FDVElPTiA8IEFOX0lOVEVSRkFDRSA+ID4oIDEwICwgMTAwMCAsIDUwICkgOworCisgaXMgZXF1aXZhbGVudCB0bworCisgYmVuY2g8IFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQU5fQUNUSU9OIDwgQU5fSU5URVJGQUNFID4gPiggMTAgLCAxMDAwICwgNTAgKSA7CisKKyBJZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBpdCB3ZSBzdWdnZXN0IHRvIHVzZSBhIG1peGVkIGltcGxlbWVudGF0aW9uIChYODZfcGVyZl9BbmFseXplcitQb3J0YWJsZV9QZXJmX0FuYWx5emVyKS4KKyByZXBsYWNlCisgICAgIGJlbmNoPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7Cisgd2l0aAorICAgICBiZW5jaDxNaXhlZF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOworIGluIGdlbmVyaWMvYmVuY2guaGgKKworLgorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2FhdF9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2FhdF9wcm9kdWN0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWIzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYWF0X3Byb2R1Y3QuaGgKQEAgLTAsMCArMSwxNDUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fYWF0X3Byb2R1Y3QuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fQUFUX1BST0RVQ1QKKyNkZWZpbmUgQUNUSU9OX0FBVF9QUk9EVUNUCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2FhdF9wcm9kdWN0IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX2FhdF9wcm9kdWN0KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fYWF0X3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fYWF0X3Byb2R1Y3QgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9hYXRfcHJvZHVjdCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fYWF0X3Byb2R1Y3QoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9hYXRfcHJvZHVjdCBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworCisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImFhdF8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gZG91YmxlKF9zaXplKSpkb3VibGUoX3NpemUpKmRvdWJsZShfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKworICAgICAgSW50ZXJmYWNlOjphYXRfcHJvZHVjdChBLFgsX3NpemUpOworCisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmFhdF9wcm9kdWN0KEFfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBleGl0KDEpOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM2NGZlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0YV9wcm9kdWN0LmhoCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2F0YV9wcm9kdWN0LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0FUQV9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9BVEFfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9hdGFfcHJvZHVjdCB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9hdGFfcHJvZHVjdCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2F0YV9wcm9kdWN0IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX2F0YV9wcm9kdWN0KCBjb25zdCAgQWN0aW9uX2F0YV9wcm9kdWN0ICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fYXRhX3Byb2R1Y3QgQ29weSBDdG9yIik7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX2F0YV9wcm9kdWN0KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXRhX3Byb2R1Y3QgRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJhdGFfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZSpfc2l6ZTsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKKworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworCisgICAgICBJbnRlcmZhY2U6OmF0YV9wcm9kdWN0KEEsWCxfc2l6ZSk7CisKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXRhX3Byb2R1Y3QoQV9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworCisKKyAgaW50IF9zaXplOworCit9OworCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0dl9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0dl9wcm9kdWN0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjM0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXR2X3Byb2R1Y3QuaGgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fYXR2X3Byb2R1Y3QuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fQVRWX1BST0RVQ1QKKyNkZWZpbmUgQUNUSU9OX0FUVl9QUk9EVUNUCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2F0dl9wcm9kdWN0IHsKKworcHVibGljIDoKKworICBBY3Rpb25fYXR2X3Byb2R1Y3QoIGludCBzaXplICkgOiBfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2F0dl9wcm9kdWN0IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisgIEFjdGlvbl9hdHZfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hdHZfcHJvZHVjdCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F0dl9wcm9kdWN0IENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICB+QWN0aW9uX2F0dl9wcm9kdWN0KCB2b2lkICkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9hdHZfcHJvZHVjdCBEdG9yIik7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQl9yZWYpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOworICB9CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCkgeyByZXR1cm4gImF0dl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApIHsgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICBCVExfQVNNX0NPTU1FTlQoImJlZ2luIGF0diIpOworICAgIEludGVyZmFjZTo6YXR2X3Byb2R1Y3QoQSxCLFgsX3NpemUpOworICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIGF0diIpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKQorICB7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphdHZfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHBieS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHBieS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRkMGNjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F4cGJ5LmhoCkBAIC0wLDAgKzEsMTI3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2F4cGJ5LmhoCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9BWFBCWQorI2RlZmluZSBBQ1RJT05fQVhQQlkKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fYXhwYnkgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKyAgQWN0aW9uX2F4cGJ5KCBpbnQgc2l6ZSApOl9hbHBoYSgwLjUpLF9iZXRhKDAuOTUpLF9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXhwYnkgQ3RvciIpOworCisgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihZX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZixZX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZLFlfc3RsKTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisgIEFjdGlvbl9heHBieSggY29uc3QgIEFjdGlvbl9heHBieSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F4cGJ5IENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisgIH5BY3Rpb25fYXhwYnkoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXhwYnkgRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihZX3JlZik7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWSk7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJheHBieV8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gMy4wKl9zaXplOworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihZX3JlZixZLF9zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICBCVExfQVNNX0NPTU1FTlQoIm15YmVnaW4gYXhwYnkiKTsKKyAgICBJbnRlcmZhY2U6OmF4cGJ5KF9hbHBoYSxYLF9iZXRhLFksX3NpemUpOworICAgIEJUTF9BU01fQ09NTUVOVCgibXllbmQgYXhwYnkiKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFkscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF4cGJ5KF9hbHBoYSxYX3N0bCxfYmV0YSxZX3N0bCxfc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWV9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgZXhpdCgyKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFlfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBZOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIF9hbHBoYTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgX2JldGE7CisKKyAgaW50IF9zaXplOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhweS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWJlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhweS5oaApAQCAtMCwwICsxLDEzOSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9heHB5LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0FYUFkKKyNkZWZpbmUgQUNUSU9OX0FYUFkKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fYXhweSB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9heHB5KCBpbnQgc2l6ZSApOl9jb2VmKDEuMCksX3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9heHB5IEN0b3IiKTsKKworICAgIC8vIFNUTCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihZX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFlfcmVmLFlfc3RsKTsKKworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFksWV9zdGwpOworCisKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX2F4cHkoIGNvbnN0ICBBY3Rpb25fYXhweSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F4cHkgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX2F4cHkoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9heHB5IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihZX3JlZik7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWSk7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImF4cHlfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDIuMCpfc2l6ZTsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWV9yZWYsWSxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgQlRMX0FTTV9DT01NRU5UKCJteWJlZ2luIGF4cHkiKTsKKyAgICBJbnRlcmZhY2U6OmF4cHkoX2NvZWYsWCxZLF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoIm15ZW5kIGF4cHkiKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWSxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXhweShfY29lZixYX3N0bCxZX3N0bCxfc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWV9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgZXhpdCgwKTsKKyAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBZX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWF9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWV9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFk7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgX2NvZWY7CisKKyAgaW50IF9zaXplOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fY2hvbGVza3kuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fY2hvbGVza3kuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NmQxMQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9jaG9sZXNreS5oaApAQCAtMCwwICsxLDEyOCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9jaG9sZXNreS5oaAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fQ0hPTEVTS1kKKyNkZWZpbmUgQUNUSU9OX0NIT0xFU0tZCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2Nob2xlc2t5IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX2Nob2xlc2t5KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fY2hvbGVza3kgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdC92ZWMgaW5pdGlhbGl6YXRpb24KKyAgICBpbml0X21hdHJpeF9zeW1tPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihDX3N0bCxfc2l6ZSk7CisKKyAgICAvLyBtYWtlIHN1cmUgWCBpcyBpbnZlcnRpYmxlCisgICAgZm9yIChpbnQgaT0wOyBpPF9zaXplOyArK2kpCisgICAgICBYX3N0bFtpXVtpXSA9IHN0ZDo6YWJzKFhfc3RsW2ldW2ldKSAqIDFlMiArIDEwMDsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQyxDX3N0bCk7CisKKyAgICBfY29zdCA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCisgICAgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heChfc2l6ZSAtIGogLTEsMCk7CisgICAgICBfY29zdCArPSAyKihyKmorcitqKTsKKyAgICB9CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9jaG9sZXNreSggY29uc3QgIEFjdGlvbl9jaG9sZXNreSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2Nob2xlc2t5IENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl9jaG9sZXNreSggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX2Nob2xlc2t5IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLF9zaXplKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiY2hvbGVza3lfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OmNob2xlc2t5KFgsQyxfc2l6ZSk7CisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmNob2xlc2t5KFhfc3RsLENfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQzsKKworICBpbnQgX3NpemU7CisgIGRvdWJsZSBfY29zdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2dlci5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9nZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NjZlZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9nZXIuaGgKQEAgLTAsMCArMSwxMjggQEAKKworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9HRVIKKyNkZWZpbmUgQUNUSU9OX0dFUgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9nZXIgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9nZXIoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9nZXIgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHRtcDsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorICBBY3Rpb25fZ2VyKCBjb25zdCAgQWN0aW9uX2dlciAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2dlciBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9nZXIoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJBY3Rpb25fZ2VyIER0b3IiKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiZ2VyXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gZ2VyIik7CisgICAgSW50ZXJmYWNlOjpnZXIoQSxCLFgsX3NpemUpOworICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIGdlciIpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6Z2VyKEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTMpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAgICAgICBleGl0KDApOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKyAgaW50IF9zaXplOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9oZXNzZW5iZXJnLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2hlc3NlbmJlcmcuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMGViZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9oZXNzZW5iZXJnLmhoCkBAIC0wLDAgKzEsMjMzIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2hlc3NlbmJlcmcuaGgKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0hFU1NFTkJFUkcKKyNkZWZpbmUgQUNUSU9OX0hFU1NFTkJFUkcKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25faGVzc2VuYmVyZyB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9oZXNzZW5iZXJnKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25faGVzc2VuYmVyZyBDdG9yIik7CisKKyAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOworCisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQyxDX3N0bCk7CisKKyAgICBfY29zdCA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplLTI7ICsraikKKyAgICB7CisgICAgICBkb3VibGUgciA9IHN0ZDo6bWF4KDAsX3NpemUtai0xKTsKKyAgICAgIGRvdWJsZSBiID0gc3RkOjptYXgoMCxfc2l6ZS1qLTIpOworICAgICAgX2Nvc3QgKz0gNiArIDMqYiArIHIqcio0ICsgcipfc2l6ZSo0OworICAgIH0KKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX2hlc3NlbmJlcmcoIGNvbnN0ICBBY3Rpb25faGVzc2VuYmVyZyAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2hlc3NlbmJlcmcgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX2hlc3NlbmJlcmcoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9oZXNzZW5iZXJnIER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLF9zaXplKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiaGVzc2VuYmVyZ18iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gX2Nvc3Q7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEludGVyZmFjZTo6aGVzc2VuYmVyZyhYLEMsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChDLHJlc3Vfc3RsKTsKKworLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpoZXNzZW5iZXJnKFhfc3RsLENfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBDOworCisgIGludCBfc2l6ZTsKKyAgZG91YmxlIF9jb3N0OworfTsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24oIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24gQ3RvciIpOworCisgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICAKKyAgICBmb3IoaW50IGk9MDsgaTxfc2l6ZTsgKytpKQorICAgIHsKKyAgICAgIGZvcihpbnQgaj0wOyBqPGk7ICsraikKKyAgICAgICAgWF9zdGxbaV1bal0gPSBYX3N0bFtqXVtpXTsKKyAgICB9CisgICAgCisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQyxDX3N0bCk7CisKKyAgICBfY29zdCA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplLTI7ICsraikKKyAgICB7CisgICAgICBkb3VibGUgciA9IHN0ZDo6bWF4KDAsX3NpemUtai0xKTsKKyAgICAgIGRvdWJsZSBiID0gc3RkOjptYXgoMCxfc2l6ZS1qLTIpOworICAgICAgX2Nvc3QgKz0gNi4gKyAzLipiICsgcipyKjguOworICAgIH0KKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiggY29uc3QgIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24gJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24gQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApIHsgcmV0dXJuICJ0cmlkaWFnb25hbGl6YXRpb25fIitJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OnRyaWRpYWdvbmFsaXphdGlvbihYLEMsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChDLHJlc3Vfc3RsKTsKKworLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojp0cmlkaWFnb25hbGl6YXRpb24oWF9zdGwsQ19zdGwsX3NpemUpOworLy8KKy8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKy8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQ19zdGwscmVzdV9zdGwpOworLy8KKy8vICAgICBpZiAoZXJyb3I+MS5lLTYpeworLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAgICAgICBleGl0KDApOworLy8gICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IENfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEM7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9kZWNvbXAuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfZGVjb21wLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDhlODIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfZGVjb21wLmhoCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2x1X2RlY29tcC5oaAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fTFVfREVDT01QCisjZGVmaW5lIEFDVElPTl9MVV9ERUNPTVAKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fbHVfZGVjb21wIHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX2x1X2RlY29tcCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2x1X2RlY29tcCBDdG9yIik7CisKKyAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOworCisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQyxDX3N0bCk7CisKKyAgICBfY29zdCA9IDIuMCpzaXplKnNpemUqc2l6ZS8zLjAgKyBzaXplKnNpemU7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9sdV9kZWNvbXAoIGNvbnN0ICBBY3Rpb25fbHVfZGVjb21wICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fbHVfZGVjb21wIENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl9sdV9kZWNvbXAoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9sdV9kZWNvbXAgRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEMsX3NpemUpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJjb21wbGV0ZV9sdV9kZWNvbXBfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6Omx1X2RlY29tcChYLEMsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChDLHJlc3Vfc3RsKTsKKworLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpsdV9kZWNvbXAoWF9zdGwsQ19zdGwsX3NpemUpOworLy8KKy8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKy8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQ19zdGwscmVzdV9zdGwpOworLy8KKy8vICAgICBpZiAoZXJyb3I+MS5lLTYpeworLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAgICAgICBleGl0KDApOworLy8gICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IENfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEM7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9zb2x2ZS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9zb2x2ZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTgxZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X3NvbHZlLmhoCkBAIC0wLDAgKzEsMTM2IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2x1X3NvbHZlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBBQ1RJT05fTFVfU09MVkUKKyNkZWZpbmUgQUNUSU9OX0xVX1NPTFZFCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2x1X3NvbHZlIAoreworCitwdWJsaWMgOgorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImx1X3NvbHZlXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKyAgCisgIHN0YXRpYyBkb3VibGUgbmJfb3BfYmFzZShpbnQgc2l6ZSl7CisgICAgcmV0dXJuIDIuMCpzaXplKnNpemUqc2l6ZS8zLjA7ICAvLyBxdWVzdGlvbmFibGUgYnV0IG5vdCByZWFsbHkgaW1wb3J0YW50CisgIH0KKworCisgIHN0YXRpYyBkb3VibGUgY2FsY3VsYXRlKCBpbnQgbmJfY2FsYywgaW50IHNpemUgKSB7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICAKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLHNpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLHNpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLHNpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IExVOyAKKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKExVLEFfc3RsKTsKKyAgCisgICAgLy8gbG9jYWwgdmFyaWFibGUgOgorCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpQaXZvdF9WZWN0b3IgcGl2b3Q7IC8vIHBpdm90IHZlY3RvcgorICAgIEludGVyZmFjZTo6bmV3X1Bpdm90X1ZlY3RvcihwaXZvdCxzaXplKTsKKyAgICAKKyAgICAvLyB0aW1lciB1dGlsaXRpZXMKKworICAgIFBvcnRhYmxlX1RpbWVyIGNocm9ub3M7CisKKyAgICAvLyB0aW1lIG1lYXN1cmVtZW50CisKKyAgICBjaHJvbm9zLnN0YXJ0KCk7CisgICAgCisgICAgZm9yIChpbnQgaWk9MDtpaTxuYl9jYWxjO2lpKyspeworCisgICAgICAvLyBMVSBmYWN0b3JpemF0aW9uCisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEEsTFUsc2l6ZSk7CisgICAgICBJbnRlcmZhY2U6OkxVX2ZhY3RvcihMVSxwaXZvdCxzaXplKTsKKyAgICAgIAorICAgICAgLy8gTFUgc29sdmUKKworICAgICAgSW50ZXJmYWNlOjpMVV9zb2x2ZShMVSxwaXZvdCxCLFgsc2l6ZSk7CisKKyAgICB9CisKKyAgICAvLyBUaW1lIHN0b3AKKworICAgIGNocm9ub3Muc3RvcCgpOworCisgICAgZG91YmxlIHRpbWU9Y2hyb25vcy51c2VyX3RpbWUoKTsKKyAgCisgICAgLy8gY2hlY2sgcmVzdWx0IDoKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX25ld19zdGwoc2l6ZSk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgsWF9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF92ZWN0b3JfcHJvZHVjdChBX3N0bCxYX3N0bCxCX25ld19zdGwsc2l6ZSk7IAorICAKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQl9zdGwsQl9uZXdfc3RsKTsKKyAgICAKKyAgICBpZiAoZXJyb3I+MS5lLTUpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6ZGlzcGxheV92ZWN0b3IoQl9zdGwpOworICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmRpc3BsYXlfdmVjdG9yKEJfbmV3X3N0bCk7CisgICAgICBleGl0KDApOworICAgIH0KKyAgICAKKyAgICAvLyBkZWFsbG9jYXRpb24gYW5kIHJldHVybiB0aW1lCisgICAgCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLHNpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfUGl2b3RfVmVjdG9yKHBpdm90KTsKKworICAgIHJldHVybiB0aW1lOworICB9CisKK307CisgIAorCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWVlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCkBAIC0wLDAgKzEsMTUwIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9NQVRSSVhfTUFUUklYX1BST0RVQ1QKKyNkZWZpbmUgQUNUSU9OX01BVFJJWF9NQVRSSVhfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KCBjb25zdCAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEJfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJtYXRyaXhfbWF0cml4XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemUqX3NpemUqX3NpemU7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKKworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgSW50ZXJmYWNlOjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQSxCLFgsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgaWYgKF9zaXplPDIwMCkKKyAgICB7CisgICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKyAgICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworCisKKyAgaW50IF9zaXplOworCit9OworCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0X2Jpcy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWMxMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKQEAgLTAsMCArMSwxNTIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0X2Jpcy5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9NQVRSSVhfTUFUUklYX1BST0RVQ1RfQklTCisjZGVmaW5lIEFDVElPTl9NQVRSSVhfTUFUUklYX1BST0RVQ1RfQklTCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJTVExfdGltZXIuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3RfYmlzIHsKKworcHVibGljIDoKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJtYXRyaXhfbWF0cml4XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBzdGF0aWMgZG91YmxlIG5iX29wX2Jhc2UoaW50IHNpemUpeworICAgIHJldHVybiAyLjAqc2l6ZSpzaXplKnNpemU7CisgIH0KKworICBzdGF0aWMgZG91YmxlIGNhbGN1bGF0ZSggaW50IG5iX2NhbGMsIGludCBzaXplICkgeworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEJfc3RsOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLHNpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLHNpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLHNpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEJfcmVmOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKworCisgICAgLy8gU1RMX3RpbWVyIHV0aWxpdGllcworCisgICAgU1RMX3RpbWVyIGNocm9ub3M7CisKKyAgICAvLyBCYXNlbGluZSBldmFsdWF0aW9uCisKKyAgICBjaHJvbm9zLnN0YXJ0X2Jhc2VsaW5lKG5iX2NhbGMpOworCisgICAgZG8geworCisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsc2l6ZSk7CisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEJfcmVmLEIsc2l6ZSk7CisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsc2l6ZSk7CisKKworICAgICAgLy8gICAgICBJbnRlcmZhY2U6Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBLEIsWCxzaXplKTsgVGhpcyBsaW5lIG11c3QgYmUgY29tbWVudGVkICEhISEKKyAgICB9CisgICAgd2hpbGUoY2hyb25vcy5jaGVjaygpKTsKKworICAgIGNocm9ub3MucmVwb3J0KHRydWUpOworCisgICAgLy8gVGltZSBtZWFzdXJlbWVudAorCisgICAgY2hyb25vcy5zdGFydChuYl9jYWxjKTsKKworICAgIGRvIHsKKworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLHNpemUpOworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZixCLHNpemUpOworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLHNpemUpOworCisgICAgICBJbnRlcmZhY2U6Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBLEIsWCxzaXplKTsgLy8gaGVyZSBpdCBpcyBub3QgY29tbWVudGVkICEhISEKKyAgICB9CisgICAgd2hpbGUoY2hyb25vcy5jaGVjaygpKTsKKworICAgIGNocm9ub3MucmVwb3J0KHRydWUpOworCisgICAgZG91YmxlIHRpbWU9Y2hyb25vcy5jYWxjdWxhdGVkX3RpbWUvMjAwMC4wOworCisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCByZXN1X3N0bChzaXplKTsKKworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBkZWFsbG9jYXRpb24gYW5kIHJldHVybiB0aW1lCisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLHNpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxzaXplKTsKKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixzaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLHNpemUpOworCisgICAgcmV0dXJuIHRpbWU7CisgIH0KKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWI3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCkBAIC0wLDAgKzEsMTUzIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9NQVRSSVhfVkVDVE9SX1BST0RVQ1QKKyNkZWZpbmUgQUNUSU9OX01BVFJJWF9WRUNUT1JfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBCVExfRE9OVF9JTkxJTkUgQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworCisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0ICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJtYXRyaXhfdmVjdG9yXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gbWF0cml4X3ZlY3Rvcl9wcm9kdWN0Iik7CisgICAgICBJbnRlcmZhY2U6Om1hdHJpeF92ZWN0b3JfcHJvZHVjdChBLEIsWCxfc2l6ZSk7CisgICAgICBCVExfQVNNX0NPTU1FTlQoImVuZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QiKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworCisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNSl7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9wYXJ0aWFsX2x1LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3BhcnRpYWxfbHUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwZWExZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9wYXJ0aWFsX2x1LmhoCkBAIC0wLDAgKzEsMTI1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2x1X2RlY29tcC5oaAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fUEFSVElBTF9MVQorI2RlZmluZSBBQ1RJT05fUEFSVElBTF9MVQorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9wYXJ0aWFsX2x1IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX3BhcnRpYWxfbHUoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9wYXJ0aWFsX2x1IEN0b3IiKTsKKworICAgIC8vIFNUTCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOworCisgICAgLy8gbWFrZSBzdXJlIFggaXMgaW52ZXJ0aWJsZQorICAgIGZvciAoaW50IGk9MDsgaTxfc2l6ZTsgKytpKQorICAgICAgWF9zdGxbaV1baV0gPSBYX3N0bFtpXVtpXSAqIDFlMiArIDE7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworCisgICAgX2Nvc3QgPSAyLjAqc2l6ZSpzaXplKnNpemUvMy4wICsgc2l6ZSpzaXplOworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fcGFydGlhbF9sdSggY29uc3QgIEFjdGlvbl9wYXJ0aWFsX2x1ICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fcGFydGlhbF9sdSBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fcGFydGlhbF9sdSggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX3BhcnRpYWxfbHUgRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEMsX3NpemUpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJwYXJ0aWFsX2x1X2RlY29tcF8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gX2Nvc3Q7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEludGVyZmFjZTo6cGFydGlhbF9sdV9kZWNvbXAoWCxDLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKy8vICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisKKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bHVfZGVjb21wKFhfc3RsLENfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQzsKKworICBpbnQgX3NpemU7CisgIGRvdWJsZSBfY29zdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3JvdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9yb3QuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MjJhNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9yb3QuaGgKQEAgLTAsMCArMSwxMTYgQEAKKworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9ST1QKKyNkZWZpbmUgQUNUSU9OX1JPVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9yb3QgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9yb3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9yb3QgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHRtcDsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorICBBY3Rpb25fcm90KCBjb25zdCAgQWN0aW9uX3JvdCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3JvdCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9yb3QoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJBY3Rpb25fcm90IER0b3IiKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEEpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihBX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJyb3RfIiArIEludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gNi4wKl9zaXplOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FICB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gcm90Iik7CisgICAgSW50ZXJmYWNlOjpyb3QoQSxCLDAuNSwwLjYsX3NpemUpOworICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHJvdCIpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKy8vICAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisKKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6cm90KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKy8vICAgICBpZiAoZXJyb3I+MS5lLTMpeworLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAgICAgICBleGl0KDApOworLy8gICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQl9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisKKyAgaW50IF9zaXplOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeW12LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3N5bXYuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYjlkZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeW12LmhoCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX3N5bXYuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fU1lNVgorI2RlZmluZSBBQ1RJT05fU1lNVgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9zeW12IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9zeW12KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fc3ltdiBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBpbml0X21hdHJpeF9zeW1tPHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fc3ltdiggY29uc3QgIEFjdGlvbl9zeW12ICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fc3ltdiBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9zeW12KCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gInN5bXZfIiArIEludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FICB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZixCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOworCisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBCVExfQVNNX0NPTU1FTlQoIiNiZWdpbiBzeW12Iik7CisgICAgICBJbnRlcmZhY2U6OnN5bXYoQSxCLFgsX3NpemUpOworICAgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgc3ltdiIpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnN5bXYoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNSl7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeXIyLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3N5cjIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2NzEyYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeXIyLmhoCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX3N5cjIuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fU1lSMgorI2RlZmluZSBBQ1RJT05fU1lSMgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9zeXIyIHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9zeXIyKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggdG1wOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisgIEFjdGlvbl9zeXIyKCBjb25zdCAgQWN0aW9uX3N5cjIgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9zeXIyIENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisgIEJUTF9ET05UX0lOTElORSB+QWN0aW9uX3N5cjIoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAic3lyMl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemUqX3NpemU7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZixCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gc3lyMiIpOworICAgICAgSW50ZXJmYWNlOjpzeXIyKEEsQixYLF9zaXplKTsKKyAgICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHN5cjIiKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnN5cjIoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtMyl7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKy8vICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmYwYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RyaXNvbHZlLmhoCkBAIC0wLDAgKzEsMTM3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX3RyaXNvbHZlLmhoCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9UUklTT0xWRQorI2RlZmluZSBBQ1RJT05fVFJJU09MVkUKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fdHJpc29sdmUgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fdHJpc29sdmUoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl90cmlzb2x2ZSBDdG9yIik7CisKKyAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oTF9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCisgICAgeworICAgICAgZm9yIChpbnQgaT0wOyBpPGo7ICsraSkKKyAgICAgICAgTF9zdGxbal1baV0gPSAwOworICAgICAgTF9zdGxbal1bal0gKz0gMzsKKyAgICB9CisKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoTCxMX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7CisKKyAgICBfY29zdCA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCisgICAgeworICAgICAgX2Nvc3QgKz0gMipqICsgMTsKKyAgICB9CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl90cmlzb2x2ZSggY29uc3QgIEFjdGlvbl90cmlzb2x2ZSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3RyaXNvbHZlIENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl90cmlzb2x2ZSggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX3RyaXNvbHZlIER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoTCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJ0cmlzb2x2ZV92ZWN0b3JfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIC8vSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEludGVyZmFjZTo6dHJpc29sdmVfbG93ZXIoTCxCLFgsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoKXsKKyAgICBpZiAoX3NpemU+MTI4KSByZXR1cm47CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6dHJpc29sdmVfbG93ZXIoTF9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNCl7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMik7CisgICAgfSAvL2Vsc2UgSU5GT1MoIkNBTENVTEFUSU9OIE9LLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggTF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBMOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKKworICBpbnQgX3NpemU7CisgIGRvdWJsZSBfY29zdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RyaXNvbHZlX21hdHJpeC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjMmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgKQEAgLTAsMCArMSwxNjUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX1RSSVNPTFZFX01BVFJJWF9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9UUklTT0xWRV9NQVRSSVhfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl90cmlzb2x2ZV9tYXRyaXggeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fdHJpc29sdmVfbWF0cml4KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmVfbWF0cml4IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCisgICAgeworICAgICAgZm9yIChpbnQgaT0wOyBpPGo7ICsraSkKKyAgICAgICAgQV9zdGxbal1baV0gPSAwOworICAgICAgQV9zdGxbal1bal0gKz0gMzsKKyAgICB9CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworCisgICAgX2Nvc3QgPSAwOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIF9jb3N0ICs9IDIqaiArIDE7CisgICAgfQorICAgIF9jb3N0ICo9IF9zaXplOworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fdHJpc29sdmVfbWF0cml4KCBjb25zdCAgQWN0aW9uX3RyaXNvbHZlX21hdHJpeCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3RyaXNvbHZlX21hdHJpeCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fdHJpc29sdmVfbWF0cml4KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmVfbWF0cml4IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEJfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJ0cmlzb2x2ZV9tYXRyaXhfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworCisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEJfcmVmLEIsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEludGVyZmFjZTo6dHJpc29sdmVfbG93ZXJfbWF0cml4KEEsQixYLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisvLyAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworLy8KKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gLy8gICAgICAgZXhpdCgxKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworCisgIGludCBfc2l6ZTsKKyAgZG91YmxlIF9jb3N0OworCit9OworCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RybW0uaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJtbS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc4MTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RybW0uaGgKQEAgLTAsMCArMSwxNjUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX1RSTU0KKyNkZWZpbmUgQUNUSU9OX1RSTU0KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fdHJtbSB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl90cm1tKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJtbSBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxqOyArK2kpCisgICAgICAgIEFfc3RsW2pdW2ldID0gMDsKKyAgICAgIEFfc3RsW2pdW2pdICs9IDM7CisgICAgfQorCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKworICAgIF9jb3N0ID0gMDsKKyAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKKyAgICB7CisgICAgICBfY29zdCArPSAyKmogKyAxOworICAgIH0KKyAgICBfY29zdCAqPSBfc2l6ZTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX3RybW0oIGNvbnN0ICBBY3Rpb25fdHJtbSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3RybW0gQ29weSBDdG9yIik7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX3RybW0oIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl90cm1tIER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEJfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJ0cm1tXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZixCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworCisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OnRybW0oQSxCLFgsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisKKy8vICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisvLworLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworLy8KKy8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKy8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworLy8KKy8vICAgICBpZiAoZXJyb3I+MS5lLTYpeworLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAvLyAgICAgICBleGl0KDEpOworLy8gICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7CisKK307CisKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9iYXNpY19hY3Rpb25zLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYmFzaWNfYWN0aW9ucy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzMzM2VhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYmFzaWNfYWN0aW9ucy5oaApAQCAtMCwwICsxLDIxIEBACisKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhwYnkuaGgiCisKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hdHZfcHJvZHVjdC5oaCIKKworI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgiCisvLyAjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKKworI2luY2x1ZGUgImFjdGlvbl90cmlzb2x2ZS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fdHJtbS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fc3ltdi5oaCIKKy8vICNpbmNsdWRlICJhY3Rpb25fc3ltbS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fc3lyMi5oaCIKKyNpbmNsdWRlICJhY3Rpb25fZ2VyLmhoIgorI2luY2x1ZGUgImFjdGlvbl9yb3QuaGgiCisKKy8vICNpbmNsdWRlICJhY3Rpb25fbHVfc29sdmUuaGgiCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kQUNNTC5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQUNNTC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg5ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRBQ01MLmNtYWtlCkBAIC0wLDAgKzEsNTEgQEAKKworaWYgKEFDTUxfTElCUkFSSUVTKQorICBzZXQoQUNNTF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChBQ01MX0xJQlJBUklFUykKKworZmluZF9saWJyYXJ5KEFDTUxfTElCUkFSSUVTCisgIE5BTUVTCisgIGFjbWxfbXAgYWNtbF9tdgorICBQQVRIUworICAkRU5We0FDTUxESVJ9L2xpYgorICAkRU5We0FDTUxfRElSfS9saWIKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2ZpbmRfZmlsZShBQ01MX0xJQlJBUklFUworICBOQU1FUworICBsaWJhY21sX21wLnNvCisgIFBBVEhTCisgIC91c3IvbGliCisgIC91c3IvbGliNjQKKyAgJEVOVntBQ01MRElSfS9saWIKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2lmKE5PVCBBQ01MX0xJQlJBUklFUykKKyAgICBtZXNzYWdlKFNUQVRVUyAiTXVsdGktdGhyZWFkZWQgbGlicmFyeSBub3QgZm91bmQsIGxvb2tpbmcgZm9yIHNpbmdsZS10aHJlYWRlZCIpCisgICAgZmluZF9saWJyYXJ5KEFDTUxfTElCUkFSSUVTCisgICAgICAgIE5BTUVTCisgICAgICAgIGFjbWwgYWNtbF9tdgorICAgICAgICBQQVRIUworICAgICAgICAkRU5We0FDTUxESVJ9L2xpYgorICAgICAgICAkRU5We0FDTUxfRElSfS9saWIKKyAgICAgICAgJHtMSUJfSU5TVEFMTF9ESVJ9CisgICAgICAgICkKKyAgICBmaW5kX2ZpbGUoQUNNTF9MSUJSQVJJRVMKKyAgICAgICAgbGliYWNtbC5zbyBsaWJhY21sX212LnNvCisgICAgICAgIFBBVEhTCisgICAgICAgIC91c3IvbGliCisgICAgICAgIC91c3IvbGliNjQKKyAgICAgICAgJEVOVntBQ01MRElSfS9saWIKKyAgICAgICAgJHtMSUJfSU5TVEFMTF9ESVJ9CisgICAgICAgICkKK2VuZGlmKCkKKworCisKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBQ01MIERFRkFVTFRfTVNHIEFDTUxfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKEFDTUxfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRBVExBUy5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQVRMQVMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNmE5OAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQVRMQVMuY21ha2UKQEAgLTAsMCArMSwzMSBAQAorCitpZiAoQVRMQVNfTElCUkFSSUVTKQorICBzZXQoQVRMQVNfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoQVRMQVNfTElCUkFSSUVTKQorCitmaW5kX2ZpbGUoQVRMQVNfTElCIGxpYmF0bGFzLnNvLjMgUEFUSFMgL3Vzci9saWIgL3Vzci9saWIvYXRsYXMgL3Vzci9saWI2NCAvdXNyL2xpYjY0L2F0bGFzICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKK2ZpbmRfbGlicmFyeShBVExBU19MSUIgc2F0bGFzIFBBVEhTICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworZmluZF9maWxlKEFUTEFTX0xBUEFDSyBOQU1FUyBsaWJsYXBhY2tfYXRsYXMuc28uMyBsaWJsYXBhY2suc28uMyBQQVRIUyAvdXNyL2xpYiAvdXNyL2xpYi9hdGxhcyAvdXNyL2xpYjY0IC91c3IvbGliNjQvYXRsYXMgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZmluZF9saWJyYXJ5KEFUTEFTX0xBUEFDSyBOQU1FUyBsYXBhY2tfYXRsYXMgbGFwYWNrIFBBVEhTICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworZmluZF9maWxlKEFUTEFTX0Y3N0JMQVMgbGliZjc3Ymxhcy5zby4zIFBBVEhTIC91c3IvbGliIC91c3IvbGliL2F0bGFzIC91c3IvbGliNjQgL3Vzci9saWI2NC9hdGxhcyAkRU5We0FUTEFTRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCitmaW5kX2xpYnJhcnkoQVRMQVNfRjc3QkxBUyBmNzdibGFzIFBBVEhTICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaWYoQVRMQVNfTElCIEFORCBBVExBU19DQkxBUyBBTkQgQVRMQVNfTEFQQUNLIEFORCBBVExBU19GNzdCTEFTKQorCisgIHNldChBVExBU19MSUJSQVJJRVMgJHtBVExBU19MQVBBQ0t9ICAke0FUTEFTX0xJQn0pCisgIAorICAjIHNlYXJjaCB0aGUgZGVmYXVsdCBsYXBhY2sgbGliIGxpbmsgdG8gaXQKKyAgZmluZF9maWxlKEFUTEFTX1JFRkVSRU5DRV9MQVBBQ0sgbGlibGFwYWNrLnNvLjMgUEFUSFMgL3Vzci9saWIgL3Vzci9saWI2NCkKKyAgZmluZF9saWJyYXJ5KEFUTEFTX1JFRkVSRU5DRV9MQVBBQ0sgTkFNRVMgbGFwYWNrKQorIyAgIGlmKEFUTEFTX1JFRkVSRU5DRV9MQVBBQ0spCisjICAgICBzZXQoQVRMQVNfTElCUkFSSUVTICR7QVRMQVNfTElCUkFSSUVTfSAke0FUTEFTX1JFRkVSRU5DRV9MQVBBQ0t9KQorIyAgIGVuZGlmKCkKKyAgCitlbmRpZihBVExBU19MSUIgQU5EIEFUTEFTX0NCTEFTIEFORCBBVExBU19MQVBBQ0sgQU5EIEFUTEFTX0Y3N0JMQVMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQVRMQVMgREVGQVVMVF9NU0cgQVRMQVNfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKEFUTEFTX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kQkxBWkUuY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZEJMQVpFLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZEJMQVpFLmNtYWtlCkBAIC0wLDAgKzEsMzEgQEAKKyMgLSBUcnkgdG8gZmluZCBlaWdlbjIgaGVhZGVycworIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgQkxBWkVfRk9VTkQgLSBzeXN0ZW0gaGFzIGJsYXplIGxpYgorIyAgQkxBWkVfSU5DTFVERV9ESVIgLSB0aGUgYmxhemUgaW5jbHVkZSBkaXJlY3RvcnkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorIyBBZGFwdGVkIGZyb20gRmluZEVpZ2VuLmNtYWtlOgorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTW9udGVsIExhdXJlbnQsIDxtb250ZWxAa2RlLm9yZz4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIyBGb3IgZGV0YWlscyBzZWUgdGhlIGFjY29tcGFueWluZyBDT1BZSU5HLUNNQUtFLVNDUklQVFMgZmlsZS4KKworaWYgKEJMQVpFX0lOQ0xVREVfRElSKQorCisgICMgaW4gY2FjaGUgYWxyZWFkeQorICBzZXQoQkxBWkVfRk9VTkQgVFJVRSkKKworZWxzZSAoQkxBWkVfSU5DTFVERV9ESVIpCisKK2ZpbmRfcGF0aChCTEFaRV9JTkNMVURFX0RJUiBOQU1FUyBibGF6ZS9CbGF6ZS5oCisgICAgIFBBVEhTCisgICAgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhCTEFaRSBERUZBVUxUX01TRyBCTEFaRV9JTkNMVURFX0RJUikKKworbWFya19hc19hZHZhbmNlZChCTEFaRV9JTkNMVURFX0RJUikKKworZW5kaWYoQkxBWkVfSU5DTFVERV9ESVIpCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kQmxpdHouY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZEJsaXR6LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODgwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZEJsaXR6LmNtYWtlCkBAIC0wLDAgKzEsNDAgQEAKKyMgLSBUcnkgdG8gZmluZCBibGl0eiBsaWIKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEJMSVRaX0ZPVU5EIC0gc3lzdGVtIGhhcyBibGl0eiBsaWIKKyMgIEJMSVRaX0lOQ0xVREVTIC0gdGhlIGJsaXR6IGluY2x1ZGUgZGlyZWN0b3J5CisjICBCTElUWl9MSUJSQVJJRVMgLSBUaGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgYmxpdHoKKworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIE1vbnRlbCBMYXVyZW50LCA8bW9udGVsQGtkZS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwNywgQWxsZW4gV2ludGVyLCA8d2ludGVyQGtkZS5vcmc+CisjIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIyBGb3IgZGV0YWlscyBzZWUgdGhlIGFjY29tcGFueWluZyBDT1BZSU5HLUNNQUtFLVNDUklQVFMgZmlsZS4KKworIyBpbmNsdWRlKEZpbmRMaWJyYXJ5V2l0aERlYnVnKQorCitpZiAoQkxJVFpfSU5DTFVERVMgQU5EIEJMSVRaX0xJQlJBUklFUykKKyAgc2V0KEJsaXR6X0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKEJMSVRaX0lOQ0xVREVTIEFORCBCTElUWl9MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChCTElUWl9JTkNMVURFUworICBOQU1FUworICBibGl0ei9hcnJheS5oCisgIFBBVEhfU1VGRklYRVMgYmxpdHoqCisgIFBBVEhTCisgICRFTlZ7QkxJVFpESVJ9L2luY2x1ZGUKKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoQkxJVFpfTElCUkFSSUVTCisgIGJsaXR6CisgIFBBVEhTCisgICRFTlZ7QkxJVFpESVJ9L2xpYgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhCbGl0eiBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMSVRaX0lOQ0xVREVTIEJMSVRaX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChCTElUWl9JTkNMVURFUyBCTElUWl9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZENCTEFTLmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRDQkxBUy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBmMmYyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRDQkxBUy5jbWFrZQpAQCAtMCwwICsxLDM1IEBACisjIGluY2x1ZGUoRmluZExpYnJhcnlXaXRoRGVidWcpCisKK2lmIChDQkxBU19JTkNMVURFUyBBTkQgQ0JMQVNfTElCUkFSSUVTKQorICBzZXQoQ0JMQVNfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoQ0JMQVNfSU5DTFVERVMgQU5EIENCTEFTX0xJQlJBUklFUykKKworZmluZF9wYXRoKENCTEFTX0lOQ0xVREVTCisgIE5BTUVTCisgIGNibGFzLmgKKyAgUEFUSFMKKyAgJEVOVntDQkxBU0RJUn0vaW5jbHVkZQorICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CispCisKK2ZpbmRfbGlicmFyeShDQkxBU19MSUJSQVJJRVMKKyAgY2JsYXMKKyAgUEFUSFMKKyAgJEVOVntDQkxBU0RJUn0vbGliCisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitmaW5kX2ZpbGUoQ0JMQVNfTElCUkFSSUVTCisgIGxpYmNibGFzLnNvLjMKKyAgUEFUSFMKKyAgL3Vzci9saWIKKyAgL3Vzci9saWI2NAorICAkRU5We0NCTEFTRElSfS9saWIKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQ0JMQVMgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkxBU19JTkNMVURFUyBDQkxBU19MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoQ0JMQVNfSU5DTFVERVMgQ0JMQVNfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRHTU0uY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZEdNTS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDQ5YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRHTU0uY21ha2UKQEAgLTAsMCArMSwxNyBAQAoraWYgKEdNTV9JTkNMVURFX0RJUikKKyAgIyBpbiBjYWNoZSBhbHJlYWR5CisgIHNldChHTU1fRk9VTkQgVFJVRSkKK2Vsc2UgKEdNTV9JTkNMVURFX0RJUikKKworZmluZF9wYXRoKEdNTV9JTkNMVURFX0RJUiBOQU1FUyBnbW0vZ21tLmgKKyAgICAgUEFUSFMKKyAgICAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorICAgICAke0dNTV9JTkNMVURFX1BBVEh9CisgICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoR01NIERFRkFVTFRfTVNHIEdNTV9JTkNMVURFX0RJUiApCisKK21hcmtfYXNfYWR2YW5jZWQoR01NX0lOQ0xVREVfRElSKQorCitlbmRpZihHTU1fSU5DTFVERV9ESVIpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZE1LTC5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kTUtMLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDdjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZE1LTC5jbWFrZQpAQCAtMCwwICsxLDY1IEBACisKK2lmIChNS0xfTElCUkFSSUVTKQorICBzZXQoTUtMX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKE1LTF9MSUJSQVJJRVMpCisKK2lmKENNQUtFX01JTk9SX1ZFUlNJT04gR1JFQVRFUiA0KQorCitpZigke0NNQUtFX0hPU1RfU1lTVEVNX1BST0NFU1NPUn0gU1RSRVFVQUwgIng4Nl82NCIpCisKK2ZpbmRfbGlicmFyeShNS0xfTElCUkFSSUVTCisgIG1rbF9jb3JlCisgIFBBVEhTCisgICRFTlZ7TUtMTElCfQorICAvb3B0L2ludGVsL21rbC8qL2xpYi9lbTY0dAorICAvb3B0L2ludGVsL0NvbXBpbGVyLyovKi9ta2wvbGliL2VtNjR0CisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoTUtMX0dVSURFCisgIGd1aWRlCisgIFBBVEhTCisgICRFTlZ7TUtMTElCfQorICAvb3B0L2ludGVsL21rbC8qL2xpYi9lbTY0dAorICAvb3B0L2ludGVsL0NvbXBpbGVyLyovKi9ta2wvbGliL2VtNjR0CisgIC9vcHQvaW50ZWwvQ29tcGlsZXIvKi8qL2xpYi9pbnRlbDY0CisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitpZihNS0xfTElCUkFSSUVTIEFORCBNS0xfR1VJREUpCisgIHNldChNS0xfTElCUkFSSUVTICR7TUtMX0xJQlJBUklFU30gbWtsX2ludGVsX2xwNjQgbWtsX3NlcXVlbnRpYWwgJHtNS0xfR1VJREV9IHB0aHJlYWQpCitlbmRpZigpCisKK2Vsc2UoJHtDTUFLRV9IT1NUX1NZU1RFTV9QUk9DRVNTT1J9IFNUUkVRVUFMICJ4ODZfNjQiKQorCitmaW5kX2xpYnJhcnkoTUtMX0xJQlJBUklFUworICBta2xfY29yZQorICBQQVRIUworICAkRU5We01LTExJQn0KKyAgL29wdC9pbnRlbC9ta2wvKi9saWIvMzIKKyAgL29wdC9pbnRlbC9Db21waWxlci8qLyovbWtsL2xpYi8zMgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworZmluZF9saWJyYXJ5KE1LTF9HVUlERQorICBndWlkZQorICBQQVRIUworICAkRU5We01LTExJQn0KKyAgL29wdC9pbnRlbC9ta2wvKi9saWIvMzIKKyAgL29wdC9pbnRlbC9Db21waWxlci8qLyovbWtsL2xpYi8zMgorICAvb3B0L2ludGVsL0NvbXBpbGVyLyovKi9saWIvaW50ZWwzMgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworaWYoTUtMX0xJQlJBUklFUyBBTkQgTUtMX0dVSURFKQorICBzZXQoTUtMX0xJQlJBUklFUyAke01LTF9MSUJSQVJJRVN9IG1rbF9pbnRlbCBta2xfc2VxdWVudGlhbCAke01LTF9HVUlERX0gcHRocmVhZCkKK2VuZGlmKCkKKworZW5kaWYoJHtDTUFLRV9IT1NUX1NZU1RFTV9QUk9DRVNTT1J9IFNUUkVRVUFMICJ4ODZfNjQiKQorCitlbmRpZihDTUFLRV9NSU5PUl9WRVJTSU9OIEdSRUFURVIgNCkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhNS0wgREVGQVVMVF9NU0cgTUtMX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChNS0xfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRNVEw0LmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRNVEw0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTQ5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZE1UTDQuY21ha2UKQEAgLTAsMCArMSwzMSBAQAorIyAtIFRyeSB0byBmaW5kIGVpZ2VuMiBoZWFkZXJzCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBNVEw0X0ZPVU5EIC0gc3lzdGVtIGhhcyBlaWdlbjIgbGliCisjICBNVEw0X0lOQ0xVREVfRElSIC0gdGhlIGVpZ2VuMiBpbmNsdWRlIGRpcmVjdG9yeQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisjIEFkYXB0ZWQgZnJvbSBGaW5kRWlnZW4uY21ha2U6CisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCitpZiAoTVRMNF9JTkNMVURFX0RJUikKKworICAjIGluIGNhY2hlIGFscmVhZHkKKyAgc2V0KE1UTDRfRk9VTkQgVFJVRSkKKworZWxzZSAoTVRMNF9JTkNMVURFX0RJUikKKworZmluZF9wYXRoKE1UTDRfSU5DTFVERV9ESVIgTkFNRVMgYm9vc3QvbnVtZXJpYy9tdGwvbXRsLmhwcAorICAgICBQQVRIUworICAgICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoTVRMNCBERUZBVUxUX01TRyBNVEw0X0lOQ0xVREVfRElSKQorCittYXJrX2FzX2FkdmFuY2VkKE1UTDRfSU5DTFVERV9ESVIpCisKK2VuZGlmKE1UTDRfSU5DTFVERV9ESVIpCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kT1BFTkJMQVMuY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZE9QRU5CTEFTLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDkxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZE9QRU5CTEFTLmNtYWtlCkBAIC0wLDAgKzEsMTcgQEAKKworaWYgKE9QRU5CTEFTX0xJQlJBUklFUykKKyAgc2V0KE9QRU5CTEFTX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKE9QRU5CTEFTX0xJQlJBUklFUykKKworZmluZF9maWxlKE9QRU5CTEFTX0xJQlJBUklFUyBOQU1FUyBsaWJvcGVuYmxhcy5zbyBsaWJvcGVuYmxhcy5zby4wIFBBVEhTIC91c3IvbGliIC91c3IvbGliNjQgJEVOVntPUEVOQkxBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZmluZF9saWJyYXJ5KE9QRU5CTEFTX0xJQlJBUklFUyBvcGVuYmxhcyBQQVRIUyAkRU5We09QRU5CTEFTRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2lmKE9QRU5CTEFTX0xJQlJBUklFUyBBTkQgQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICBzZXQoT1BFTkJMQVNfTElCUkFSSUVTICR7T1BFTkJMQVNfTElCUkFSSUVTfSAiLWxwdGhyZWFkIC1sZ2ZvcnRyYW4iKQorZW5kaWYoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE9QRU5CTEFTIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTkJMQVNfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKE9QRU5CTEFTX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncy5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjEyMmVkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzLmNtYWtlCkBAIC0wLDAgKzEsNjAgQEAKKyMgRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKE5BTUUgKERFRkFVTFRfTVNHfCJDdXN0b20gZmFpbHVyZSBtZXNzYWdlIikgVkFSMSAuLi4gKQorIworIyBUaGlzIG1hY3JvIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gRmluZFhYWC5jbWFrZSBtb2R1bGVzIGZpbGVzLgorIyBJdCBoYW5kbGVzIHRoZSBSRVFVSVJFRCBhbmQgUVVJRVQgYXJndW1lbnQgdG8gRklORF9QQUNLQUdFKCkgYW5kCisjIGl0IGFsc28gc2V0cyB0aGUgPFVQUEVSQ0FTRURfTkFNRT5fRk9VTkQgdmFyaWFibGUuCisjIFRoZSBwYWNrYWdlIGlzIGZvdW5kIGlmIGFsbCB2YXJpYWJsZXMgbGlzdGVkIGFyZSBUUlVFLgorIyBFeGFtcGxlOgorIworIyAgICBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoTGliWG1sMiBERUZBVUxUX01TRyBMSUJYTUwyX0xJQlJBUklFUyBMSUJYTUwyX0lOQ0xVREVfRElSKQorIworIyBMaWJYbWwyIGlzIGNvbnNpZGVyZWQgdG8gYmUgZm91bmQsIGlmIGJvdGggTElCWE1MMl9MSUJSQVJJRVMgYW5kIAorIyBMSUJYTUwyX0lOQ0xVREVfRElSIGFyZSB2YWxpZC4gVGhlbiBhbHNvIExJQlhNTDJfRk9VTkQgaXMgc2V0IHRvIFRSVUUuCisjIElmIGl0IGlzIG5vdCBmb3VuZCBhbmQgUkVRVUlSRUQgd2FzIHVzZWQsIGl0IGZhaWxzIHdpdGggRkFUQUxfRVJST1IsIAorIyBpbmRlcGVuZGVudCB3aGV0aGVyIFFVSUVUIHdhcyB1c2VkIG9yIG5vdC4KKyMKKyMgSWYgaXQgaXMgZm91bmQsIHRoZSBsb2NhdGlvbiBpcyByZXBvcnRlZCB1c2luZyB0aGUgVkFSMSBhcmd1bWVudCwgc28gCisjIGhlcmUgYSBtZXNzYWdlICJGb3VuZCBMaWJYbWwyOiAvdXNyL2xpYi9saWJ4bWwyLnNvIiB3aWxsIGJlIHByaW50ZWQgb3V0LgorIyBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIERFRkFVTFRfTVNHLCB0aGUgbWVzc2FnZSBpbiB0aGUgZmFpbHVyZSBjYXNlIHdpbGwgCisjIGJlICJDb3VsZCBOT1QgZmluZCBMaWJYbWwyIiwgaWYgeW91IGRvbid0IGxpa2UgdGhpcyBtZXNzYWdlIHlvdSBjYW4gc3BlY2lmeQorIyB5b3VyIG93biBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIHRoZXJlLgorCitNQUNSTyhGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MgX05BTUUgX0ZBSUxfTVNHIF9WQVIxICkKKworICBJRigiJHtfRkFJTF9NU0d9IiBTVFJFUVVBTCAiREVGQVVMVF9NU0ciKQorICAgIElGICgke19OQU1FfV9GSU5EX1JFUVVJUkVEKQorICAgICAgU0VUKF9GQUlMX01FU1NBR0UgIkNvdWxkIG5vdCBmaW5kIFJFUVVJUkVEIHBhY2thZ2UgJHtfTkFNRX0iKQorICAgIEVMU0UgKCR7X05BTUV9X0ZJTkRfUkVRVUlSRUQpCisgICAgICBTRVQoX0ZBSUxfTUVTU0FHRSAiQ291bGQgbm90IGZpbmQgT1BUSU9OQUwgcGFja2FnZSAke19OQU1FfSIpCisgICAgRU5ESUYgKCR7X05BTUV9X0ZJTkRfUkVRVUlSRUQpCisgIEVMU0UoIiR7X0ZBSUxfTVNHfSIgU1RSRVFVQUwgIkRFRkFVTFRfTVNHIikKKyAgICBTRVQoX0ZBSUxfTUVTU0FHRSAiJHtfRkFJTF9NU0d9IikKKyAgRU5ESUYoIiR7X0ZBSUxfTVNHfSIgU1RSRVFVQUwgIkRFRkFVTFRfTVNHIikKKworICBTVFJJTkcoVE9VUFBFUiAke19OQU1FfSBfTkFNRV9VUFBFUikKKworICBTRVQoJHtfTkFNRV9VUFBFUn1fRk9VTkQgVFJVRSkKKyAgSUYoTk9UICR7X1ZBUjF9KQorICAgIFNFVCgke19OQU1FX1VQUEVSfV9GT1VORCBGQUxTRSkKKyAgRU5ESUYoTk9UICR7X1ZBUjF9KQorCisgIEZPUkVBQ0goX0NVUlJFTlRfVkFSICR7QVJHTn0pCisgICAgSUYoTk9UICR7X0NVUlJFTlRfVkFSfSkKKyAgICAgIFNFVCgke19OQU1FX1VQUEVSfV9GT1VORCBGQUxTRSkKKyAgICBFTkRJRihOT1QgJHtfQ1VSUkVOVF9WQVJ9KQorICBFTkRGT1JFQUNIKF9DVVJSRU5UX1ZBUikKKworICBJRiAoJHtfTkFNRV9VUFBFUn1fRk9VTkQpCisgICAgSUYgKE5PVCAke19OQU1FfV9GSU5EX1FVSUVUTFkpCisgICAgICAgIE1FU1NBR0UoU1RBVFVTICJGb3VuZCAke19OQU1FfTogJHske19WQVIxfX0iKQorICAgIEVORElGIChOT1QgJHtfTkFNRX1fRklORF9RVUlFVExZKQorICBFTFNFICgke19OQU1FX1VQUEVSfV9GT1VORCkKKyAgICBJRiAoJHtfTkFNRX1fRklORF9SRVFVSVJFRCkKKyAgICAgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiJHtfRkFJTF9NRVNTQUdFfSIpCisgICAgRUxTRSAoJHtfTkFNRX1fRklORF9SRVFVSVJFRCkKKyAgICAgIElGIChOT1QgJHtfTkFNRX1fRklORF9RVUlFVExZKQorICAgICAgICBNRVNTQUdFKFNUQVRVUyAiJHtfRkFJTF9NRVNTQUdFfSIpCisgICAgICBFTkRJRiAoTk9UICR7X05BTUV9X0ZJTkRfUVVJRVRMWSkKKyAgICBFTkRJRiAoJHtfTkFNRX1fRklORF9SRVFVSVJFRCkKKyAgRU5ESUYgKCR7X05BTUVfVVBQRVJ9X0ZPVU5EKQorRU5ETUFDUk8oRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRUdm1ldC5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kVHZtZXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMjlkOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kVHZtZXQuY21ha2UKQEAgLTAsMCArMSwzMiBAQAorIyAtIFRyeSB0byBmaW5kIHR2bWV0IGhlYWRlcnMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIFRWTUVUX0ZPVU5EIC0gc3lzdGVtIGhhcyB0dm1ldCBsaWIKKyMgIFRWTUVUX0lOQ0xVREVfRElSIC0gdGhlIHR2bWV0IGluY2x1ZGUgZGlyZWN0b3J5CisjCisjIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKyMgQWRhcHRlZCBmcm9tIEZpbmRFaWdlbi5jbWFrZToKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE1vbnRlbCBMYXVyZW50LCA8bW9udGVsQGtkZS5vcmc+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKK2lmIChUVk1FVF9JTkNMVURFX0RJUikKKworICAjIGluIGNhY2hlIGFscmVhZHkKKyAgc2V0KFRWTUVUX0ZPVU5EIFRSVUUpCisKK2Vsc2UgKFRWTUVUX0lOQ0xVREVfRElSKQorCitmaW5kX3BhdGgoVFZNRVRfSU5DTFVERV9ESVIgTkFNRVMgdHZtZXQvdHZtZXQuaAorICAgICBQQVRIUworICAgICAke1RWTUVURElSfS8KKyAgICAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorICAgKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFR2bWV0IERFRkFVTFRfTVNHIFRWTUVUX0lOQ0xVREVfRElSKQorCittYXJrX2FzX2FkdmFuY2VkKFRWTUVUX0lOQ0xVREVfRElSKQorCitlbmRpZihUVk1FVF9JTkNMVURFX0RJUikKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL01hY3JvT3B0aW9uYWxBZGRTdWJkaXJlY3RvcnkuY21ha2UgYi9iZW5jaC9idGwvY21ha2UvTWFjcm9PcHRpb25hbEFkZFN1YmRpcmVjdG9yeS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUwNDhiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL01hY3JvT3B0aW9uYWxBZGRTdWJkaXJlY3RvcnkuY21ha2UKQEAgLTAsMCArMSwzMSBAQAorIyAtIE1BQ1JPX09QVElPTkFMX0FERF9TVUJESVJFQ1RPUlkoKSBjb21iaW5lcyBBRERfU1VCRElSRUNUT1JZKCkgd2l0aCBhbiBPUFRJT04oKQorIyBNQUNST19PUFRJT05BTF9BRERfU1VCRElSRUNUT1JZKCA8ZGlyPiApCisjIElmIHlvdSB1c2UgTUFDUk9fT1BUSU9OQUxfQUREX1NVQkRJUkVDVE9SWSgpIGluc3RlYWQgb2YgQUREX1NVQkRJUkVDVE9SWSgpLAorIyB0aGlzIHdpbGwgaGF2ZSB0d28gZWZmZWN0cworIyAxIC0gQ01ha2Ugd2lsbCBub3QgY29tcGxhaW4gaWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0CisjICAgICBUaGlzIG1ha2VzIHNlbnNlIGlmIHlvdSB3YW50IHRvIGRpc3RyaWJ1dGUganVzdCBvbmUgb2YgdGhlIHN1YmRpcnMKKyMgICAgIGluIGEgc291cmNlIHBhY2thZ2UsIGUuZy4ganVzdCBvbmUgb2YgdGhlIHN1YmRpcnMgaW4ga2RlZXh0cmFnZWFyLgorIyAyIC0gSWYgdGhlIGRpcmVjdG9yeSBleGlzdHMsIGl0IHdpbGwgb2ZmZXIgYW4gb3B0aW9uIHRvIHNraXAgdGhlIAorIyAgICAgc3ViZGlyZWN0b3J5LgorIyAgICAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBvbmx5IGEgc3Vic2V0IG9mIGFsbAorIyAgICAgZGlyZWN0b3JpZXMuCisKKyMgQ29weXJpZ2h0IChjKSAyMDA3LCBBbGV4YW5kZXIgTmV1bmRvcmYsIDxuZXVuZG9yZkBrZGUub3JnPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCisKK01BQ1JPIChNQUNST19PUFRJT05BTF9BRERfU1VCRElSRUNUT1JZIF9kaXIgKQorICAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChfZnVsbFBhdGggJHtfZGlyfSBBQlNPTFVURSkKKyAgIElGKEVYSVNUUyAke19mdWxsUGF0aH0pCisgICAgICBJRigke0FSR0N9IEVRVUFMIDIpCisgICAgICAgIE9QVElPTihCVUlMRF8ke19kaXJ9ICJCdWlsZCBkaXJlY3RvcnkgJHtfZGlyfSIgJHtBUkdWMX0pCisgICAgICBFTFNFKCR7QVJHQ30gRVFVQUwgMikKKyAgICAgICAgT1BUSU9OKEJVSUxEXyR7X2Rpcn0gIkJ1aWxkIGRpcmVjdG9yeSAke19kaXJ9IiBUUlVFKQorICAgICAgRU5ESUYoJHtBUkdDfSBFUVVBTCAyKQorICAgICAgSUYoQlVJTERfJHtfZGlyfSkKKyAgICAgICAgIEFERF9TVUJESVJFQ1RPUlkoJHtfZGlyfSkKKyAgICAgIEVORElGKEJVSUxEXyR7X2Rpcn0pCisgICBFTkRJRihFWElTVFMgJHtfZnVsbFBhdGh9KQorRU5ETUFDUk8gKE1BQ1JPX09QVElPTkFMX0FERF9TVUJESVJFQ1RPUlkpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9kYXRhL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjJhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMyIEBACisKK0FERF9DVVNUT01fVEFSR0VUKGNvcHlfc2NyaXB0cykKKworU0VUKHNjcmlwdF9maWxlcyBnb19tZWFuIG1rX21lYW5fc2NyaXB0LnNoIG1rX25ld19nbnVwbG90LnNoCisgICAgcGVybGliX3Bsb3Rfc2V0dGluZ3MudHh0IGFjdGlvbl9zZXR0aW5ncy50eHQgZ251cGxvdF9jb21tb25fc2V0dGluZ3MuaGggKQorCitGT1JFQUNIKHNjcmlwdF9maWxlICR7c2NyaXB0X2ZpbGVzfSkKK0FERF9DVVNUT01fQ09NTUFORCgKKyAgVEFSR0VUIGNvcHlfc2NyaXB0cworICBQT1NUX0JVSUxECisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke3NjcmlwdF9maWxlfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vCisgIEFSR1MKKykKK0VOREZPUkVBQ0goc2NyaXB0X2ZpbGUpCisKK0FERF9DVVNUT01fQ09NTUFORCgKKyAgVEFSR0VUIGNvcHlfc2NyaXB0cworICBQT1NUX0JVSUxECisgIENPTU1BTkQgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IC0tdmVyc2lvbiB8IGhlYWQgLW4gMSA+ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jb21waWxlcl92ZXJzaW9uLnR4dAorICBBUkdTCispCitBRERfQ1VTVE9NX0NPTU1BTkQoCisgIFRBUkdFVCBjb3B5X3NjcmlwdHMKKyAgUE9TVF9CVUlMRAorICBDT01NQU5EIGVjaG8gIiR7RWlnZW5fU09VUkNFX0RJUn0iID4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2VpZ2VuX3Jvb3RfZGlyLnR4dAorICBBUkdTCispCisKK2FkZF9leGVjdXRhYmxlKHNtb290aCBzbW9vdGguY3h4KQorYWRkX2V4ZWN1dGFibGUocmVndWxhcml6ZSByZWd1bGFyaXplLmN4eCkKK2FkZF9leGVjdXRhYmxlKG1haW4gbWVhbi5jeHgpCithZGRfZGVwZW5kZW5jaWVzKG1haW4gY29weV9zY3JpcHRzKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvYWN0aW9uX3NldHRpbmdzLnR4dCBiL2JlbmNoL2J0bC9kYXRhL2FjdGlvbl9zZXR0aW5ncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL2FjdGlvbl9zZXR0aW5ncy50eHQKQEAgLTAsMCArMSwxOSBAQAorYWF0IDsgInsvKjEuNSBBIHggQV5UfSIgOyAibWF0cml4IHNpemUiIDsgNDo1MDAwCithdGEgOyAiey8qMS41IEFeVCB4IEF9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjUwMDAKK2F0diA7ICJ7LyoxLjUgbWF0cml4XlQgeCB2ZWN0b3J9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjUwMDAKK2F4cGJ5IDsgInsvKjEuNSBZID0gYWxwaGEgWCArIGJldGEgWX0iIDsgInZlY3RvciBzaXplIiA7IDU6MTAwMDAwMAorYXhweSA7ICJ7LyoxLjUgWSArPSBhbHBoYSBYfSIgOyAidmVjdG9yIHNpemUiIDsgNToxMDAwMDAwCittYXRyaXhfbWF0cml4IDsgInsvKjEuNSBtYXRyaXggbWF0cml4IHByb2R1Y3R9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjUwMDAKK21hdHJpeF92ZWN0b3IgOyAiey8qMS41IG1hdHJpeCB2ZWN0b3IgcHJvZHVjdH0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6NTAwMAordHJtbSA7ICJ7LyoxLjUgdHJpYW5ndWxhciBtYXRyaXggbWF0cml4IHByb2R1Y3R9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjUwMDAKK3RyaXNvbHZlX3ZlY3RvciA7ICJ7LyoxLjUgdHJpYW5ndWxhciBzb2x2ZXIgLSB2ZWN0b3IgKFggPSBpbnYoTCkgWCl9IiA7ICJzaXplIiA7IDQ6NTAwMAordHJpc29sdmVfbWF0cml4IDsgInsvKjEuNSB0cmlhbmd1bGFyIHNvbHZlciAtIG1hdHJpeCAoTSA9IGludihMKSBNKX0iIDsgInNpemUiIDsgNDo1MDAwCitjaG9sZXNreSA7ICJ7LyoxLjUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbn0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6NTAwMAorY29tcGxldGVfbHVfZGVjb21wIDsgInsvKjEuNSBDb21wbGV0ZSBMVSBkZWNvbXBvc2l0aW9ufSIgOyAibWF0cml4IHNpemUiIDsgNDo1MDAwCitwYXJ0aWFsX2x1X2RlY29tcCA7ICJ7LyoxLjUgUGFydGlhbCBMVSBkZWNvbXBvc2l0aW9ufSIgOyAibWF0cml4IHNpemUiIDsgNDo1MDAwCit0cmlkaWFnb25hbGl6YXRpb24gOyAiey8qMS41IFRyaWRpYWdvbmFsaXphdGlvbn0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6NTAwMAoraGVzc2VuYmVyZyA7ICJ7LyoxLjUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9ufSIgOyAibWF0cml4IHNpemUiIDsgNDo1MDAwCitzeW12IDsgInsvKjEuNSBzeW1tZXRyaWMgbWF0cml4IHZlY3RvciBwcm9kdWN0fSIgOyAibWF0cml4IHNpemUiIDsgNDo1MDAwCitzeXIyIDsgInsvKjEuNSBzeW1tcmV0cmljIHJhbmstMiB1cGRhdGUgKEEgKz0gdV5UIHYgKyB1IHZeVCl9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjUwMDAKK2dlciA7ICJ7LyoxLjUgZ2VuZXJhbCByYW5rLTEgdXBkYXRlIChBICs9IHUgdl5UKX0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6NTAwMAorcm90IDsgInsvKjEuNSBhcHBseSByb3RhdGlvbiBpbiB0aGUgcGxhbmV9IiA7ICJ2ZWN0b3Igc2l6ZSIgOyA0OjEwMDAwMDAKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9kYXRhL2dudXBsb3RfY29tbW9uX3NldHRpbmdzLmhoIGIvYmVuY2gvYnRsL2RhdGEvZ251cGxvdF9jb21tb25fc2V0dGluZ3MuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NzdkZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL2dudXBsb3RfY29tbW9uX3NldHRpbmdzLmhoCkBAIC0wLDAgKzEsODcgQEAKK3NldCBub2NsaXAgcG9pbnRzCitzZXQgY2xpcCBvbmUKK3NldCBub2NsaXAgdHdvCitzZXQgYmFyIDEuMDAwMDAwCitzZXQgYm9yZGVyIDMxIGx0IC0xIGx3IDEuMDAwCitzZXQgeGRhdGEKK3NldCB5ZGF0YQorc2V0IHpkYXRhCitzZXQgeDJkYXRhCitzZXQgeTJkYXRhCitzZXQgYm94d2lkdGgKK3NldCBkdW1teSB4LHkKK3NldCBmb3JtYXQgeCAiJWciCitzZXQgZm9ybWF0IHkgIiVnIgorc2V0IGZvcm1hdCB4MiAiJWciCitzZXQgZm9ybWF0IHkyICIlZyIKK3NldCBmb3JtYXQgeiAiJWciCitzZXQgYW5nbGVzIHJhZGlhbnMKK3NldCBub2dyaWQKK3NldCBrZXkgdGl0bGUgIiIKK3NldCBrZXkgbGVmdCB0b3AgUmlnaHQgbm9yZXZlcnNlIGJveCBsaW5ldHlwZSAtMiBsaW5ld2lkdGggMS4wMDAgc2FtcGxlbiA0IHNwYWNpbmcgMSB3aWR0aCAwCitzZXQgbm9sYWJlbAorc2V0IG5vYXJyb3cKKyMgc2V0IG5vbGluZXN0eWxlICMgZGVwcmVjYXRlZAorc2V0IG5vbG9nc2NhbGUKK3NldCBsb2dzY2FsZSB4IDEwCitzZXQgb2Zmc2V0cyAwLCAwLCAwLCAwCitzZXQgcG9pbnRzaXplIDEKK3NldCBlbmNvZGluZyBkZWZhdWx0CitzZXQgbm9wb2xhcgorc2V0IG5vcGFyYW1ldHJpYworc2V0IHZpZXcgNjAsIDMwLCAxLCAxCitzZXQgc2FtcGxlcyAxMDAsIDEwMAorc2V0IGlzb3NhbXBsZXMgMTAsIDEwCitzZXQgc3VyZmFjZQorc2V0IG5vY29udG91cgorc2V0IGNsYWJlbCAnJTguM2cnCitzZXQgbWFwcGluZyBjYXJ0ZXNpYW4KK3NldCBub2hpZGRlbjNkCitzZXQgY250cnBhcmFtIG9yZGVyIDQKK3NldCBjbnRycGFyYW0gbGluZWFyCitzZXQgY250cnBhcmFtIGxldmVscyBhdXRvIDUKK3NldCBjbnRycGFyYW0gcG9pbnRzIDUKK3NldCBzaXplIHJhdGlvIDAgMSwxCitzZXQgb3JpZ2luIDAsMAorIyBzZXQgZGF0YSBzdHlsZSBsaW5lcworIyBzZXQgZnVuY3Rpb24gc3R5bGUgbGluZXMKK3NldCB4emVyb2F4aXMgbHQgLTIgbHcgMS4wMDAKK3NldCB4Mnplcm9heGlzIGx0IC0yIGx3IDEuMDAwCitzZXQgeXplcm9heGlzIGx0IC0yIGx3IDEuMDAwCitzZXQgeTJ6ZXJvYXhpcyBsdCAtMiBsdyAxLjAwMAorc2V0IHRpY3MgaW4KK3NldCB0aWNzbGV2ZWwgMC41CitzZXQgdGljcyBzY2FsZSAxLCAwLjUKK3NldCBteHRpY3MgZGVmYXVsdAorc2V0IG15dGljcyBkZWZhdWx0CitzZXQgbXgydGljcyBkZWZhdWx0CitzZXQgbXkydGljcyBkZWZhdWx0CitzZXQgeHRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcQorc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB6dGljcyBib3JkZXIgbm9taXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCBub3gydGljcworc2V0IG5veTJ0aWNzCitzZXQgdGltZXN0YW1wICIiIGJvdHRvbSBub3JvdGF0ZSBvZmZzZXQgMCwwCitzZXQgcnJhbmdlIFsgKiA6ICogXSBub3JldmVyc2Ugbm93cml0ZWJhY2sgICMgKGN1cnJlbnRseSBbLTA6MTBdICkKK3NldCB0cmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstNTo1XSApCitzZXQgdXJhbmdlIFsgKiA6ICogXSBub3JldmVyc2Ugbm93cml0ZWJhY2sgICMgKGN1cnJlbnRseSBbLTU6NV0gKQorc2V0IHZyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy01OjVdICkKK3NldCB4bGFiZWwgIm1hdHJpeCBzaXplIiBvZmZzZXQgMCwwCitzZXQgeDJsYWJlbCAiIiBvZmZzZXQgMCwwCitzZXQgdGltZWZtdCAiJWQvJW0vJXlcbiVIOiVNIgorc2V0IHhyYW5nZSBbIDEwIDogMTAwMCBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjaworc2V0IHgycmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstMTA6MTBdICkKK3NldCB5bGFiZWwgIk1GTE9QUyIgb2Zmc2V0IDAsMAorc2V0IHkybGFiZWwgIiIgb2Zmc2V0IDAsMAorc2V0IHlyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy0xMDoxMF0gKQorc2V0IHkycmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstMTA6MTBdICkKK3NldCB6bGFiZWwgIiIgb2Zmc2V0IDAsMAorc2V0IHpyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy0xMDoxMF0gKQorc2V0IHplcm8gMWUtMDgKK3NldCBsbWFyZ2luIC0xCitzZXQgYm1hcmdpbiAtMQorc2V0IHJtYXJnaW4gLTEKK3NldCB0bWFyZ2luIC0xCitzZXQgbG9jYWxlICJDIgorc2V0IHhyYW5nZSBbNDoxMDI0XQorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9nb19tZWFuIGIvYmVuY2gvYnRsL2RhdGEvZ29fbWVhbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjMzOGNhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvZ29fbWVhbgpAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vYmFzaAorCitpZiBbICQjIDwgMSBdOyB0aGVuCisgIGVjaG8gIlVzYWdlOiAkMCB3b3JraW5nX2RpcmVjdG9yeSBbdGlueXxsYXJnZSBbcHJlZml4XV0iCitlbHNlCisKK21rZGlyIC1wICQxCisjI2NwIC4uL2xpYnMvKi8qLmRhdCAkMQorCittb2RlPWxhcmdlCitpZiBbICQjID4gMiBdOyB0aGVuCisgIG1vZGU9JDIKK2ZpCitpZiBbICQjID4gMyBdOyB0aGVuCisgIHByZWZpeD0kMworZmkKKworRUlHRU5ESVI9YGNhdCBlaWdlbl9yb290X2Rpci50eHRgCisKK3dlYnBhZ2VmaWxlbmFtZT0kMS9pbmRleC5odG1sCittZWFuc3RhdHNmaWxlbmFtZT0kMS9tZWFuLmh0bWwKKworZWNobyAnJyAgPiAkbWVhbnN0YXRzZmlsZW5hbWUKK2VjaG8gJycgID4gJHdlYnBhZ2VmaWxlbmFtZQorZWNobyAnPHA+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+ICAkV0hBVC5nbnVwbG90CisKK2dudXBsb3QgLXBlcnNpc3QgPCAkV0hBVC5nbnVwbG90CisKK3JtICRXSEFULmdudXBsb3QKKworcHMycGRmIC4uLyR7RElSfS8kV0hBVC5wcyAuLi8ke0RJUn0vJFdIQVQucGRmCitjb252ZXJ0IC1iYWNrZ3JvdW5kIHdoaXRlIC1kZW5zaXR5IDEyMCAtcm90YXRlIDkwIC1yZXNpemUgODAwICtkaXRoZXIgLWNvbG9ycyAyNTYgLXF1YWxpdHkgMCAuLi8ke0RJUn0vJFdIQVQucHMgLWJhY2tncm91bmQgd2hpdGUgLWZsYXR0ZW4gIC4uLyR7RElSfS8kV0hBVC5wbmcKKworIyBwc3RvZWRpdCAtcm90YXRlIC05MCAteHNjYWxlIDAuOCAteXNjYWxlIDAuOCAtY2VudGVyZWQgLXlzaGlmdCAtNTAgLXhzaGlmdCAtMTAwICAtZiBwbG90LXN2ZyBhYXQucHMgIGFhdDIuc3ZnCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9wZXJsaWJfcGxvdF9zZXR0aW5ncy50eHQgYi9iZW5jaC9idGwvZGF0YS9wZXJsaWJfcGxvdF9zZXR0aW5ncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyM2NmZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL3BlcmxpYl9wbG90X3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDE2IEBACitlaWdlbjMgOyAgICAgICAgICB3aXRoIGxpbmVzIGx3IDQgbHQgMSBsYyByZ2Jjb2xvciAiYmxhY2siCitlaWdlbjIgOyAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiIzk5OTk5OSIKK0VpZ2VuQkxBUyA7ICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAzIGxjIHJnYmNvbG9yICIjOTk5OTk5IgorZWlnZW4zX25vdmVjIDsgICAgd2l0aCBsaW5lcyBsdyAyIGx0IDEgbGMgcmdiY29sb3IgIiM5OTk5OTkiCitlaWdlbjNfbm9nY2N2ZWMgOyB3aXRoIGxpbmVzIGx3IDIgbHQgMiBsYyByZ2Jjb2xvciAiIzk5MTAxMCIKK0lOVEVMX01LTCA7ICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAxIGxjIHJnYmNvbG9yICIjZmYwMDAwIgorQVRMQVMgOyAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiMwMDgwMDAiCitnbW0gOyAgICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiIzAwMDBmZiIKK3VibGFzIDsgICAgICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAxIGxjIHJnYmNvbG9yICIjMDBiN2ZmIgorbXRsNCA7ICAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiNkMTg4NDciCitibGl0eiA7ICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiI2ZmMDBmZiIKK0Y3NyA7ICAgICAgICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAzIGxjIHJnYmNvbG9yICIjZTZlNjRjIgorT1BFTkJMQVMgOyAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiNDMDU2MDAiCitDIDsgICAgICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMyBsYyByZ2Jjb2xvciAiI2U2YmQ5NiIKK0FDTUwgOyAgICAgICAgICAgIHdpdGggbGluZXMgbHcgMiBsdCAzIGxjIHJnYmNvbG9yICIjZTZlNjRjIgorYmxhemUgOyAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiNmZjAwZmYiCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9yZWd1bGFyaXplLmN4eCBiL2JlbmNoL2J0bC9kYXRhL3JlZ3VsYXJpemUuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9yZWd1bGFyaXplLmN4eApAQCAtMCwwICsxLDEzMSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHJlZ3VsYXJpemUuY3h4CisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE1IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcyk7Cit2b2lkIHJlZ3VsYXJpemVfY3VydmUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsCisJCSAgICAgIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgCisJCSAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCAKKwkJICAgICAgaW50IHN0YXJ0X2N1dF9zaXplLCBpbnQgc3RvcF9jdXRfc2l6ZSk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtYWluKCBpbnQgYXJnYyAsIGNoYXIgKmFyZ3ZbXSApCit7CisKKyAgLy8gaW5wdXQgZGF0YQorCisgIGlmIChhcmdjPDQpeworICAgIElORk9TKCIhISEgRXJyb3IgLi4uIHVzYWdlIDogbWFpbiBmaWxlbmFtZSBzdGFydF9jdXRfc2l6ZSBzdG9wX2N1dF9zaXplIHJlZ3VsYXJpemVfZmlsZW5hbWUiKTsKKyAgICBleGl0KDApOworICB9CisgIElORk9TKGFyZ2MpOworCisgIGludCBzdGFydF9jdXRfc2l6ZT1hdG9pKGFyZ3ZbMl0pOworICBpbnQgc3RvcF9jdXRfc2l6ZT1hdG9pKGFyZ3ZbM10pOworCisgIHN0cmluZyBmaWxlbmFtZT1hcmd2WzFdOworICBzdHJpbmcgcmVndWxhcml6ZV9maWxlbmFtZT1hcmd2WzRdOworICAKKyAgSU5GT1MoZmlsZW5hbWUpOworICBJTkZPUygic3RhcnRfY3V0X3NpemU9Ijw8c3RhcnRfY3V0X3NpemUpOworCisgIHZlY3RvcjxpbnQ+IHRhYl9zaXplczsKKyAgdmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKKworICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsdGFiX3NpemVzLHRhYl9tZmxvcHMpOworCisgIC8vIHJlZ3VsYXJpemVpbmcKKworICByZWd1bGFyaXplX2N1cnZlKHJlZ3VsYXJpemVfZmlsZW5hbWUsdGFiX21mbG9wcyx0YWJfc2l6ZXMsc3RhcnRfY3V0X3NpemUsc3RvcF9jdXRfc2l6ZSk7CisgIAorCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgcmVndWxhcml6ZV9jdXJ2ZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwKKwkJICAgICAgY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCAKKwkJICAgICAgY29uc3QgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIAorCQkgICAgICBpbnQgc3RhcnRfY3V0X3NpemUsIGludCBzdG9wX2N1dF9zaXplKQoreworICBpbnQgc2l6ZT10YWJfbWZsb3BzLnNpemUoKTsKKyAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjpvdXQpIDsKKworICBpbnQgaT0wOworCisgIHdoaWxlKHRhYl9zaXplc1tpXTxzdGFydF9jdXRfc2l6ZSl7CisgICAgCisgICAgb3V0cHV0X2ZpbGUgPDwgdGFiX3NpemVzW2ldIDw8ICIgIiA8PCAgdGFiX21mbG9wc1tpXSA8PCBlbmRsIDsKKyAgICBpKys7CisKKyAgfQorICAgIAorICBvdXRwdXRfZmlsZSA8PCBlbmRsIDsKKworICB3aGlsZSh0YWJfc2l6ZXNbaV08c3RvcF9jdXRfc2l6ZSl7CisgICAgCisgICAgaSsrOworCisgIH0KKworICB3aGlsZShpPHNpemUpeworICAgIAorICAgIG91dHB1dF9maWxlIDw8IHRhYl9zaXplc1tpXSA8PCAiICIgPDwgIHRhYl9tZmxvcHNbaV0gPDwgZW5kbCA7CisgICAgaSsrOworCisgIH0KKworICBvdXRwdXRfZmlsZS5jbG9zZSgpOworCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpeworCisgIGlmc3RyZWFtIGlucHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjppbikgOworCisgIGlmICghaW5wdXRfZmlsZSl7CisgICAgSU5GT1MoIiEhISBFcnJvciBvcGVuaW5nICI8PGZpbGVuYW1lKTsKKyAgICBleGl0KDApOworICB9CisgIAorICBpbnQgbmJfcG9pbnQ9MDsKKyAgaW50IHNpemU9MDsKKyAgZG91YmxlIG1mbG9wcz0wOworCisgIHdoaWxlIChpbnB1dF9maWxlID4+IHNpemUgPj4gbWZsb3BzICl7CisgICAgbmJfcG9pbnQrKzsKKyAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgIHRhYl9tZmxvcHMucHVzaF9iYWNrKG1mbG9wcyk7CisgIH0KKyAgU0NSVVRFKG5iX3BvaW50KTsKKworICBpbnB1dF9maWxlLmNsb3NlKCk7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9kYXRhL3Ntb290aC5jeHggYi9iZW5jaC9idGwvZGF0YS9zbW9vdGguY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjcwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9zbW9vdGguY3h4CkBAIC0wLDAgKzEsMTk4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgc21vb3RoLmN4eAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgorI2luY2x1ZGUgPHNldD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpOwordm9pZCB3cml0ZV94eV9maWxlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKTsKK3ZvaWQgc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpOwordm9pZCBjZW50ZXJlZF9zbW9vdGhfY3VydmUoY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmIHNtb290aF90YWJfbWZsb3BzLGludCB3aW5kb3dfaGFsZl93aWR0aCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG1haW4oIGludCBhcmdjICwgY2hhciAqYXJndltdICkKK3sKKworICAvLyBpbnB1dCBkYXRhCisKKyAgaWYgKGFyZ2M8Myl7CisgICAgSU5GT1MoIiEhISBFcnJvciAuLi4gdXNhZ2UgOiBtYWluIGZpbGVuYW1lIHdpbmRvd19oYWxmX3dpZHRoIHNtb290aF9maWxlbmFtZSIpOworICAgIGV4aXQoMCk7CisgIH0KKyAgSU5GT1MoYXJnYyk7CisKKyAgaW50IHdpbmRvd19oYWxmX3dpZHRoPWF0b2koYXJndlsyXSk7CisKKyAgc3RyaW5nIGZpbGVuYW1lPWFyZ3ZbMV07CisgIHN0cmluZyBzbW9vdGhfZmlsZW5hbWU9YXJndlszXTsKKyAgCisgIElORk9TKGZpbGVuYW1lKTsKKyAgSU5GT1MoIndpbmRvd19oYWxmX3dpZHRoPSI8PHdpbmRvd19oYWxmX3dpZHRoKTsKKworICB2ZWN0b3I8aW50PiB0YWJfc2l6ZXM7CisgIHZlY3Rvcjxkb3VibGU+IHRhYl9tZmxvcHM7CisKKyAgcmVhZF94eV9maWxlKGZpbGVuYW1lLHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKKworICAvLyBzbW9vdGhpbmcKKworICB2ZWN0b3I8ZG91YmxlPiBzbW9vdGhfdGFiX21mbG9wczsKKworICAvL3Ntb290aF9jdXJ2ZSh0YWJfbWZsb3BzLHNtb290aF90YWJfbWZsb3BzLHdpbmRvd19oYWxmX3dpZHRoKTsKKyAgY2VudGVyZWRfc21vb3RoX2N1cnZlKHRhYl9tZmxvcHMsc21vb3RoX3RhYl9tZmxvcHMsd2luZG93X2hhbGZfd2lkdGgpOworCisgIC8vIG91dHB1dCByZXN1bHQKKworICB3cml0ZV94eV9maWxlKHNtb290aF9maWxlbmFtZSx0YWJfc2l6ZXMsc21vb3RoX3RhYl9tZmxvcHMpOworICAKKworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlPGNsYXNzIFZFQ1RPUj4KK2RvdWJsZSB3ZWlnaHRlZF9tZWFuKGNvbnN0IFZFQ1RPUiAmIGRhdGEpCit7CisKKyAgZG91YmxlIG1lYW49MC4wOworICAKKyAgZm9yIChpbnQgaT0wIDsgaTxkYXRhLnNpemUoKSA7IGkrKyl7CisKKyAgICBtZWFuKz1kYXRhW2ldOworCisgIH0KKworICByZXR1cm4gbWVhbi9kb3VibGUoZGF0YS5zaXplKCkpIDsKKworfSAgICAKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3ZvaWQgc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpeworICAKKyAgaW50IHdpbmRvd193aWR0aD0yKndpbmRvd19oYWxmX3dpZHRoKzE7CisKKyAgaW50IHNpemU9dGFiX21mbG9wcy5zaXplKCk7CisKKyAgdmVjdG9yPGRvdWJsZT4gc2FtcGxlKHdpbmRvd193aWR0aCk7CisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgc2l6ZSA7IGkrKyl7CisgICAgCisgICAgZm9yICggaW50IGo9MCA7IGogPCB3aW5kb3dfd2lkdGggOyBqKysgKXsKKyAgICAgIAorICAgICAgaW50IHNoaWZ0ZWRfaW5kZXg9aStqLXdpbmRvd19oYWxmX3dpZHRoOworICAgICAgaWYgKHNoaWZ0ZWRfaW5kZXg8MCkgc2hpZnRlZF9pbmRleD0wOworICAgICAgaWYgKHNoaWZ0ZWRfaW5kZXg+c2l6ZS0xKSBzaGlmdGVkX2luZGV4PXNpemUtMTsKKyAgICAgIHNhbXBsZVtqXT10YWJfbWZsb3BzW3NoaWZ0ZWRfaW5kZXhdOworICAgICAgCisgICAgfQorCisgICAgc21vb3RoX3RhYl9tZmxvcHMucHVzaF9iYWNrKHdlaWdodGVkX21lYW4oc2FtcGxlKSk7CisKKyAgfQorCit9CisKK3ZvaWQgY2VudGVyZWRfc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpeworICAKKyAgaW50IG1heF93aW5kb3dfd2lkdGg9Mip3aW5kb3dfaGFsZl93aWR0aCsxOworCisgIGludCBzaXplPXRhYl9tZmxvcHMuc2l6ZSgpOworCisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgc2l6ZSA7IGkrKyl7CisKKyAgICBkZXF1ZTxkb3VibGU+IHNhbXBsZTsKKworICAgIAorICAgIHNhbXBsZS5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisKKyAgICBmb3IgKCBpbnQgaj0xIDsgaiA8PSB3aW5kb3dfaGFsZl93aWR0aCA7IGorKyApeworICAgICAgCisgICAgICBpbnQgYmVmb3JlPWktajsKKyAgICAgIGludCBhZnRlcj1pK2o7CisgICAgICAKKyAgICAgIGlmICgoYmVmb3JlPj0wKSYmKGFmdGVyPHNpemUpKSAvLyBpbnNpZGUgb2YgdGhlIHZlY3RvcgorCXsgCisJICBzYW1wbGUucHVzaF9mcm9udCh0YWJfbWZsb3BzW2JlZm9yZV0pOworCSAgc2FtcGxlLnB1c2hfYmFjayh0YWJfbWZsb3BzW2FmdGVyXSk7CisJfQorICAgIH0KKyAgICAKKyAgICBzbW9vdGhfdGFiX21mbG9wcy5wdXNoX2JhY2sod2VpZ2h0ZWRfbWVhbihzYW1wbGUpKTsKKyAgICAKKyAgfQorCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIHdyaXRlX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpeworCisgIG9mc3RyZWFtIG91dHB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6b3V0KSA7CisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgdGFiX3NpemVzLnNpemUoKSA7IGkrKykKKyAgICB7CisgICAgICBvdXRwdXRfZmlsZSA8PCB0YWJfc2l6ZXNbaV0gPDwgIiAiIDw8ICB0YWJfbWZsb3BzW2ldIDw8IGVuZGwgOworICAgIH0KKyAgCisgIG91dHB1dF9maWxlLmNsb3NlKCk7CisKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgcmVhZF94eV9maWxlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKXsKKworICBpZnN0cmVhbSBpbnB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6aW4pIDsKKworICBpZiAoIWlucHV0X2ZpbGUpeworICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiPDxmaWxlbmFtZSk7CisgICAgZXhpdCgwKTsKKyAgfQorICAKKyAgaW50IG5iX3BvaW50PTA7CisgIGludCBzaXplPTA7CisgIGRvdWJsZSBtZmxvcHM9MDsKKworICB3aGlsZSAoaW5wdXRfZmlsZSA+PiBzaXplID4+IG1mbG9wcyApeworICAgIG5iX3BvaW50Kys7CisgICAgdGFiX3NpemVzLnB1c2hfYmFjayhzaXplKTsKKyAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhtZmxvcHMpOworICB9CisgIFNDUlVURShuYl9wb2ludCk7CisKKyAgaW5wdXRfZmlsZS5jbG9zZSgpOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9zbW9vdGhfYWxsLnNoIGIvYmVuY2gvYnRsL2RhdGEvc21vb3RoX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTViZmRmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvc21vb3RoX2FsbC5zaApAQCAtMCwwICsxLDY4IEBACisjISAvYmluL2Jhc2gKK09SSUdfRElSPSQxCitTTU9PVEhfRElSPSR7T1JJR19ESVJ9X3Ntb290aAorbWtkaXIgJHtTTU9PVEhfRElSfQorCitBWFBZX0ZJTEU9YGZpbmQgJHtPUklHX0RJUn0gLW5hbWUgIiouZGF0IiB8IGdyZXAgYXhweWAKK2ZvciBGSUxFIGluICR7QVhQWV9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIC4vc21vb3RoICR7T1JJR19ESVJ9LyR7QkFTRX0gNCAke1NNT09USF9ESVJ9LyR7QkFTRX1fdG1wCisgICAgLi9yZWd1bGFyaXplICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAgMjUwMCAxNTAwMCAke1NNT09USF9ESVJ9LyR7QkFTRX0KKyAgICBybSAtZiAgJHtTTU9PVEhfRElSfS8ke0JBU0V9X3RtcAorZG9uZQorCisKK01BVFJJWF9WRUNUT1JfRklMRT1gZmluZCAke09SSUdfRElSfSAtbmFtZSAiKi5kYXQiIHwgZ3JlcCBtYXRyaXhfdmVjdG9yYAorZm9yIEZJTEUgaW4gJHtNQVRSSVhfVkVDVE9SX0ZJTEV9CitkbworICAgIGVjaG8gJEZJTEUKKyAgICBCQVNFPSR7RklMRSMjKi99CisgICAgLi9zbW9vdGggJHtPUklHX0RJUn0vJHtCQVNFfSA0ICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAKKyAgICAuL3JlZ3VsYXJpemUgJHtTTU9PVEhfRElSfS8ke0JBU0V9X3RtcCA1MCAxODAgJHtTTU9PVEhfRElSfS8ke0JBU0V9CisgICAgcm0gLWYgICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAKK2RvbmUKKworTUFUUklYX01BVFJJWF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIG1hdHJpeF9tYXRyaXhgCitmb3IgRklMRSBpbiAke01BVFJJWF9NQVRSSVhfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICAuL3Ntb290aCAke09SSUdfRElSfS8ke0JBU0V9IDQgJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCisKK0FBVF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIF9hYXRgCitmb3IgRklMRSBpbiAke0FBVF9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIC4vc21vb3RoICR7T1JJR19ESVJ9LyR7QkFTRX0gNCAke1NNT09USF9ESVJ9LyR7QkFTRX0KK2RvbmUKKworCitBVEFfRklMRT1gZmluZCAke09SSUdfRElSfSAtbmFtZSAiKi5kYXQiIHwgZ3JlcCBfYXRhYAorZm9yIEZJTEUgaW4gJHtBVEFfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICAuL3Ntb290aCAke09SSUdfRElSfS8ke0JBU0V9IDQgJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCisKKyMjIyBubyBzbW9vdGhpbmcgZm9yIHRpbnl2ZWN0b3IgYW5kIG1hdHJpY2VzIGxpYnMKKworVElOWV9CTElUWl9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIHRpbnlfYmxpdHpgCitmb3IgRklMRSBpbiAke1RJTllfQkxJVFpfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICBjcCAke09SSUdfRElSfS8ke0JBU0V9ICR7U01PT1RIX0RJUn0vJHtCQVNFfQorZG9uZQorCitUVk1FVF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIHR2bWV0YAorZm9yIEZJTEUgaW4gJHtUVk1FVF9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIGNwICR7T1JJR19ESVJ9LyR7QkFTRX0gJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2I5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaApAQCAtMCwwICsxLDE2OCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJlbmNoLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNiBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQkVOQ0hfSEgKKyNkZWZpbmUgQkVOQ0hfSEgKKworI2luY2x1ZGUgImJ0bC5oaCIKKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAic2l6ZV9saW5fbG9nLmhoIgorI2luY2x1ZGUgInh5X2ZpbGUuaGgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgiCisvLyAjaW5jbHVkZSAidGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoIgorI2lmZGVmIEhBVkVfTUtMCitleHRlcm4gIkMiIHZvaWQgY2JsYXNfc2F4cHkoY29uc3QgaW50LCBjb25zdCBmbG9hdCwgY29uc3QgZmxvYXQqLCBjb25zdCBpbnQsIGZsb2F0ICosIGNvbnN0IGludCk7CisjZW5kaWYKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgY2xhc3MgQWN0aW9uPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goIGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQgKQoreworICBpZiAoQnRsQ29uZmlnOjpza2lwQWN0aW9uKEFjdGlvbjo6bmFtZSgpKSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIGZpbGVuYW1lPSJiZW5jaF8iK0FjdGlvbjo6bmFtZSgpKyIuZGF0IjsKKworICBJTkZPUygic3RhcnRpbmcgIiA8PGZpbGVuYW1lKTsKKworICAvLyB1dGlsaXRpZXMKKworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRhYl9tZmxvcHMobmJfcG9pbnQpOworICBzdGQ6OnZlY3RvcjxpbnQ+IHRhYl9zaXplcyhuYl9wb2ludCk7CisKKyAgLy8gbWF0cmljZXMgYW5kIHZlY3RvciBzaXplIGNhbGN1bGF0aW9ucworICBzaXplX2xpbl9sb2cobmJfcG9pbnQsc2l6ZV9taW4sc2l6ZV9tYXgsdGFiX3NpemVzKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IG9sZFNpemVzOworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IG9sZEZsb3BzOworICBib29sIGhhc09sZFJlc3VsdHMgPSByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsIG9sZFNpemVzLCBvbGRGbG9wcywgdHJ1ZSk7CisgIGludCBvbGRpID0gb2xkU2l6ZXMuc2l6ZSgpIC0gMTsKKworICAvLyBsb29wIG9uIG1hdHJpeCBzaXplCisgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPiBwZXJmX2FjdGlvbjsKKyAgZm9yIChpbnQgaT1uYl9wb2ludC0xO2k+PTA7aS0tKQorICB7CisgICAgLy9JTkZPUygic2l6ZT0iIDw8dGFiX3NpemVzW2ldPDwiICAgKCI8PG5iX3BvaW50LWk8PCIvIjw8bmJfcG9pbnQ8PCIpIik7CisgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCAic2l6ZSA9ICIgPDwgdGFiX3NpemVzW2ldIDw8ICIgICIgPDwgc3RkOjpmbHVzaDsKKworICAgIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCk7CisgICAgI2lmZGVmIEhBVkVfTUtMCisgICAgeworICAgICAgZmxvYXQgZHVtbXk7CisgICAgICBjYmxhc19zYXhweSgxLDAsJmR1bW15LDEsJmR1bW15LDEpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHRhYl9tZmxvcHNbaV0gPSBwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyh0YWJfc2l6ZXNbaV0pOworICAgIHN0ZDo6Y291dCA8PCB0YWJfbWZsb3BzW2ldOworICAgIAorICAgIGlmIChoYXNPbGRSZXN1bHRzKQorICAgIHsKKyAgICAgIHdoaWxlIChvbGRpPj0wICYmIG9sZFNpemVzW29sZGldPnRhYl9zaXplc1tpXSkKKyAgICAgICAgLS1vbGRpOworICAgICAgaWYgKG9sZGk+PTAgJiYgb2xkU2l6ZXNbb2xkaV09PXRhYl9zaXplc1tpXSkKKyAgICAgIHsKKyAgICAgICAgaWYgKG9sZEZsb3BzW29sZGldPHRhYl9tZmxvcHNbaV0pCisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdCA+ICI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0IDwgIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG9sZEZsb3BzW29sZGldOworICAgICAgfQorICAgICAgLS1vbGRpOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgIiBNRmxvcHMgICAgKCIgPDwgbmJfcG9pbnQtaSA8PCAiLyIgPDwgbmJfcG9pbnQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIGlmICghQnRsQ29uZmlnOjpJbnN0YW5jZS5vdmVyd3JpdGVSZXN1bHRzKQorICB7CisgICAgaWYgKGhhc09sZFJlc3VsdHMpCisgICAgeworICAgICAgLy8gbWVyZ2UgdGhlIHR3byBkYXRhCisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG5ld1NpemVzOworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBuZXdGbG9wczsKKyAgICAgIHVuc2lnbmVkIGludCBpPTA7CisgICAgICB1bnNpZ25lZCBpbnQgaj0wOworICAgICAgd2hpbGUgKGk8dGFiX3NpemVzLnNpemUoKSAmJiBqPG9sZFNpemVzLnNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHRhYl9zaXplc1tpXSA9PSBvbGRTaXplc1tqXSkKKyAgICAgICAgeworICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOworICAgICAgICAgIG5ld0Zsb3BzLnB1c2hfYmFjayhzdGQ6Om1heCh0YWJfbWZsb3BzW2ldLCBvbGRGbG9wc1tqXSkpOworICAgICAgICAgICsraTsKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGFiX3NpemVzW2ldIDwgb2xkU2l6ZXNbal0pCisgICAgICAgIHsKKyAgICAgICAgICBuZXdTaXplcy5wdXNoX2JhY2sodGFiX3NpemVzW2ldKTsKKyAgICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayhvbGRTaXplc1tqXSk7CisgICAgICAgICAgbmV3RmxvcHMucHVzaF9iYWNrKG9sZEZsb3BzW2pdKTsKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlIChpPHRhYl9zaXplcy5zaXplKCkpCisgICAgICB7CisgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOworICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChqPG9sZFNpemVzLnNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgbmV3U2l6ZXMucHVzaF9iYWNrKG9sZFNpemVzW2pdKTsKKyAgICAgICAgbmV3RmxvcHMucHVzaF9iYWNrKG9sZEZsb3BzW2pdKTsKKyAgICAgICAgKytqOworICAgICAgfQorICAgICAgdGFiX21mbG9wcyA9IG5ld0Zsb3BzOworICAgICAgdGFiX3NpemVzID0gbmV3U2l6ZXM7CisgICAgfQorICB9CisKKyAgLy8gZHVtcCB0aGUgcmVzdWx0IGluIGEgZmlsZSAgOgorICBkdW1wX3h5X2ZpbGUodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOworCit9CisKKy8vIGRlZmF1bHQgUGVyZiBBbmFseXplcgorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goIGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQgKXsKKworICAvLyBpZiB0aGUgcmR0c2MgaXMgbm90IGF2YWlsYWJsZSA6CisgIGJlbmNoPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CisgIC8vIGlmIHRoZSByZHRzYyBpcyBhdmFpbGFibGUgOgorLy8gICAgYmVuY2g8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKKworCisgIC8vIE9ubHkgZm9yIHNtYWxsIHByb2JsZW0gc2l6ZS4gT3RoZXJ3aXplIGl0IHdpbGwgYmUgdG9vIGxvbmcKKy8vICAgYmVuY2g8WDg2X1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CisvLyAgIGJlbmNoPFNUTF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDExNDkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaF9wYXJhbWV0ZXIuaGgKQEAgLTAsMCArMSw1MyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJlbmNoX3BhcmFtZXRlci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTYgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEJFTkNIX1BBUkFNRVRFUl9ISAorI2RlZmluZSBCRU5DSF9QQVJBTUVURVJfSEgKKworLy8gbWluaW1hbCB0aW1lIGZvciBlYWNoIG1lYXN1cmVtZW50CisjZGVmaW5lIFJFQUxfVFlQRSBmbG9hdAorLy8gbWluaW1hbCB0aW1lIGZvciBlYWNoIG1lYXN1cmVtZW50CisjZGVmaW5lIE1JTl9USU1FIDAuMgorLy8gbmIgb2YgcG9pbnQgb24gYmVuY2ggY3VydmVzCisjZGVmaW5lIE5CX1BPSU5UIDEwMAorLy8gbWluIHZlY3RvciBzaXplIGZvciBheHB5IGJlbmNoCisjZGVmaW5lIE1JTl9BWFBZIDUKKy8vIG1heCB2ZWN0b3Igc2l6ZSBmb3IgYXhweSBiZW5jaAorI2RlZmluZSBNQVhfQVhQWSAzMDAwMDAwCisvLyBtaW4gbWF0cml4IHNpemUgZm9yIG1hdHJpeCB2ZWN0b3IgcHJvZHVjdCBiZW5jaAorI2RlZmluZSBNSU5fTVYgNQorLy8gbWF4IG1hdHJpeCBzaXplIGZvciBtYXRyaXggdmVjdG9yIHByb2R1Y3QgYmVuY2gKKyNkZWZpbmUgTUFYX01WIDUwMDAKKy8vIG1pbiBtYXRyaXggc2l6ZSBmb3IgbWF0cml4IG1hdHJpeCBwcm9kdWN0IGJlbmNoCisjZGVmaW5lIE1JTl9NTSA1CisvLyBtYXggbWF0cml4IHNpemUgZm9yIG1hdHJpeCBtYXRyaXggcHJvZHVjdCBiZW5jaAorI2RlZmluZSBNQVhfTU0gTUFYX01WCisvLyBtaW4gbWF0cml4IHNpemUgZm9yIExVIGJlbmNoCisjZGVmaW5lIE1JTl9MVSA1CisvLyBtYXggbWF0cml4IHNpemUgZm9yIExVIGJlbmNoCisjZGVmaW5lIE1BWF9MVSAzMDAwCisvLyBtYXggc2l6ZSBmb3IgdGlueSB2ZWN0b3IgYW5kIG1hdHJpeAorI2RlZmluZSBUSU5ZX01WX01BWF9TSVpFIDE2CisvLyBkZWZhdWx0IG5iX3NhbXBsZSBmb3IgeDg2IHRpbWVyCisjZGVmaW5lIERFRkFVTFRfTkJfU0FNUExFIDEwMDAKKworLy8gaG93IG1hbnkgdGltZXMgd2UgcnVuIGEgc2luZ2xlIGJlbmNoIChrZWVwIHRoZSBiZXN0IHBlcmYpCisjZGVmaW5lIERFRkFVTFRfTkJfVFJJRVMgMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2J0bC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2J0bC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZiMDBmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYnRsLmhoCkBAIC0wLDAgKzEsMjQyIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYnRsLmhoCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEJUTF9ISAorI2RlZmluZSBCVExfSEgKKworI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKworI2lmIChkZWZpbmVkIF9fR05VQ19fKQorI2RlZmluZSBCVExfQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgaW5saW5lCisjZWxzZQorI2RlZmluZSBCVExfQUxXQVlTX0lOTElORSBpbmxpbmUKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisjZGVmaW5lIEJUTF9ET05UX0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZWxzZQorI2RlZmluZSBCVExfRE9OVF9JTkxJTkUKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisjZGVmaW5lIEJUTF9BU01fQ09NTUVOVChYKSAgYXNtKCIjIiBYKQorI2Vsc2UKKyNkZWZpbmUgQlRMX0FTTV9DT01NRU5UKFgpCisjZW5kaWYKKworI2lmZGVmIF9fU1NFX18KKyNpbmNsdWRlICJ4bW1pbnRyaW4uaCIKKy8vIFRoaXMgZW5hYmxlcyBmbHVzaCB0byB6ZXJvIChGVFopIGFuZCBkZW5vcm1hbHMgYXJlIHplcm8gKERBWikgbW9kZXM6CisjZGVmaW5lIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCkgIHsgX21tX3NldGNzcihfbW1fZ2V0Y3NyKCkgfCAweDgwNDApOyB9CisjZWxzZQorI2RlZmluZSBCVExfRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpCisjZW5kaWYKKworLyoqIEVuaGFuY2VkIHN0ZDo6c3RyaW5nCisqLworY2xhc3MgQnRsU3RyaW5nIDogcHVibGljIHN0ZDo6c3RyaW5nCit7CitwdWJsaWM6CisgICAgQnRsU3RyaW5nKCkgOiBzdGQ6OnN0cmluZygpIHt9CisgICAgQnRsU3RyaW5nKGNvbnN0IEJ0bFN0cmluZyYgc3RyKSA6IHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c3RyaW5nJj4oc3RyKSkge30KKyAgICBCdGxTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgOiBzdGQ6OnN0cmluZyhzdHIpIHt9CisgICAgQnRsU3RyaW5nKGNvbnN0IGNoYXIqIHN0cikgOiBzdGQ6OnN0cmluZyhzdHIpIHt9CisKKyAgICBvcGVyYXRvciBjb25zdCBjaGFyKiAoKSBjb25zdCB7IHJldHVybiBjX3N0cigpOyB9CisKKyAgICB2b2lkIHRyaW0oIGJvb2wgbGVmdCA9IHRydWUsIGJvb2wgcmlnaHQgPSB0cnVlICkKKyAgICB7CisgICAgICAgIGludCBsc3BhY2VzLCByc3BhY2VzLCBsZW4gPSBsZW5ndGgoKSwgaTsKKyAgICAgICAgbHNwYWNlcyA9IHJzcGFjZXMgPSAwOworCisgICAgICAgIGlmICggbGVmdCApCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW4gJiYgKGF0KGkpPT0nICd8fGF0KGkpPT0nXHQnfHxhdChpKT09J1xyJ3x8YXQoaSk9PSdcbicpOyArK2xzcGFjZXMsKytpKTsKKworICAgICAgICBpZiAoIHJpZ2h0ICYmIGxzcGFjZXMgPCBsZW4gKQorICAgICAgICAgICAgZm9yKGk9bGVuLTE7IGk+PTAgJiYgKGF0KGkpPT0nICd8fGF0KGkpPT0nXHQnfHxhdChpKT09J1xyJ3x8YXQoaSk9PSdcbicpOyByc3BhY2VzKyssaS0tKTsKKworICAgICAgICAqdGhpcyA9IHN1YnN0cihsc3BhY2VzLCBsZW4tbHNwYWNlcy1yc3BhY2VzKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IHNwbGl0KCBjb25zdCBCdGxTdHJpbmcmIGRlbGltcyA9ICJcdFxuICIpIGNvbnN0CisgICAgeworICAgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IHJldDsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVNwbGl0cyA9IDA7CisgICAgICAgIHNpemVfdCBzdGFydCwgcG9zOworICAgICAgICBzdGFydCA9IDA7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IGZpbmRfZmlyc3Rfb2YoZGVsaW1zLCBzdGFydCk7CisgICAgICAgICAgICBpZiAocG9zID09IHN0YXJ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldC5wdXNoX2JhY2soIiIpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBvcyA9PSBucG9zKQorICAgICAgICAgICAgICAgIHJldC5wdXNoX2JhY2soIHN1YnN0cihzdGFydCkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQucHVzaF9iYWNrKCBzdWJzdHIoc3RhcnQsIHBvcyAtIHN0YXJ0KSApOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc3RhcnQgPSBmaW5kX2ZpcnN0X25vdF9vZihkZWxpbXMsIHN0YXJ0KTsKKyAgICAgICAgICAgICsrbnVtU3BsaXRzOworICAgICAgICB9IHdoaWxlIChwb3MgIT0gbnBvcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYm9vbCBlbmRzV2l0aChjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QKKyAgICB7CisgICAgICAgIGlmKHN0ci5zaXplKCk+dGhpcy0+c2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy0+c3Vic3RyKHRoaXMtPnNpemUoKS1zdHIuc2l6ZSgpLHN0ci5zaXplKCkpID09IHN0cjsKKyAgICB9CisgICAgYm9vbCBjb250YWlucyhjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT5maW5kKHN0cik8dGhpcy0+c2l6ZSgpOworICAgIH0KKyAgICBib29sIGJlZ2luc1dpdGgoY29uc3QgQnRsU3RyaW5nJiBzdHIpIGNvbnN0CisgICAgeworICAgICAgICBpZihzdHIuc2l6ZSgpPnRoaXMtPnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPnN1YnN0cigwLHN0ci5zaXplKCkpID09IHN0cjsKKyAgICB9CisKKyAgICBCdGxTdHJpbmcgdG9Mb3dlckNhc2UoIHZvaWQgKQorICAgIHsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4oKSwgZW5kKCksIGJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPig6OnRvbG93ZXIpICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnRsU3RyaW5nIHRvVXBwZXJDYXNlKCB2b2lkICkKKyAgICB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKGJlZ2luKCksIGVuZCgpLCBiZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4oOjp0b3VwcGVyKSApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIENhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4KKyAgICAqLworICAgIGJvb2wgaXNFcXVpdihjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QKKyAgICB7CisgICAgICAgIEJ0bFN0cmluZyBzdHIwID0gKnRoaXM7CisgICAgICAgIHN0cjAudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgQnRsU3RyaW5nIHN0cjEgPSBzdHI7CisgICAgICAgIHN0cjEudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIHN0cjAgPT0gc3RyMTsKKyAgICB9CisKKyAgICAvKiogRGVjb21wb3NlIHRoZSBjdXJyZW50IHN0cmluZyBhcyBhIHBhdGggYW5kIGEgZmlsZS4KKyAgICAgICAgRm9yIGluc3RhbmNlOiAiZGlyMS9kaXIyL2ZpbGUuZXh0IiBsZWFkcyB0byBwYXRoPSJkaXIxL2RpcjIvIiBhbmQgZmlsZW5hbWU9ImZpbGUuZXh0IgorICAgICovCisgICAgdm9pZCBkZWNvbXBvc2VQYXRoQW5kRmlsZShCdGxTdHJpbmcmIHBhdGgsIEJ0bFN0cmluZyYgZmlsZW5hbWUpIGNvbnN0CisgICAgeworICAgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IGVsZW1lbnRzID0gdGhpcy0+c3BsaXQoIi9cXCIpOworICAgICAgICBwYXRoID0gIiI7CisgICAgICAgIGZpbGVuYW1lID0gZWxlbWVudHMuYmFjaygpOworICAgICAgICBlbGVtZW50cy5wb3BfYmFjaygpOworICAgICAgICBpZiAodGhpcy0+YXQoMCk9PScvJykKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8ZWxlbWVudHMuc2l6ZSgpIDsgKytpKQorICAgICAgICAgICAgcGF0aCArPSBlbGVtZW50c1tpXSArICIvIjsKKyAgICB9Cit9OworCitjbGFzcyBCdGxDb25maWcKK3sKK3B1YmxpYzoKKyAgQnRsQ29uZmlnKCkKKyAgICA6IG92ZXJ3cml0ZVJlc3VsdHMoZmFsc2UpLCBjaGVja1Jlc3VsdHModHJ1ZSksIHJlYWxjbG9jayhmYWxzZSksIHRyaWVzKERFRkFVTFRfTkJfVFJJRVMpCisgIHsKKyAgICBjaGFyICogX2NvbmZpZzsKKyAgICBfY29uZmlnID0gZ2V0ZW52ICgiQlRMX0NPTkZJRyIpOworICAgIGlmIChfY29uZmlnIT1OVUxMKQorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEJ0bFN0cmluZz4gY29uZmlnID0gQnRsU3RyaW5nKF9jb25maWcpLnNwbGl0KCIgXHRcbiIpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGk8Y29uZmlnLnNpemUoKTsgaSsrKQorICAgICAgeworICAgICAgICBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi1hIikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSsxPT1jb25maWcuc2l6ZSgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiZXJyb3IgcHJvY2Vzc2luZyBvcHRpb246ICIgPDwgY29uZmlnW2ldIDw8ICJcbiI7CisgICAgICAgICAgICBleGl0KDIpOworICAgICAgICAgIH0KKyAgICAgICAgICBJbnN0YW5jZS5tX3NlbGVjdGVkQWN0aW9uTmFtZXMgPSBjb25maWdbaSsxXS5zcGxpdCgiOiIpOworCisgICAgICAgICAgaSArPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItdCIpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkrMT09Y29uZmlnLnNpemUoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgImVycm9yIHByb2Nlc3Npbmcgb3B0aW9uOiAiIDw8IGNvbmZpZ1tpXSA8PCAiXG4iOworICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgSW5zdGFuY2UudHJpZXMgPSBhdG9pKGNvbmZpZ1tpKzFdLmNfc3RyKCkpOworCisgICAgICAgICAgaSArPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItLW92ZXJ3cml0ZSIpKQorICAgICAgICB7CisgICAgICAgICAgSW5zdGFuY2Uub3ZlcndyaXRlUmVzdWx0cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tbm9jaGVjayIpKQorICAgICAgICB7CisgICAgICAgICAgSW5zdGFuY2UuY2hlY2tSZXN1bHRzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tcmVhbCIpKQorICAgICAgICB7CisgICAgICAgICAgSW5zdGFuY2UucmVhbGNsb2NrID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCk7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgc3RhdGljIGJvb2wgc2tpcEFjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUpCisgIHsKKyAgICBpZiAoSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCdGxTdHJpbmcgbmFtZShfbmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEluc3RhbmNlLm1fc2VsZWN0ZWRBY3Rpb25OYW1lcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChuYW1lLmNvbnRhaW5zKEluc3RhbmNlLm1fc2VsZWN0ZWRBY3Rpb25OYW1lc1tpXSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RhdGljIEJ0bENvbmZpZyBJbnN0YW5jZTsKKyAgYm9vbCBvdmVyd3JpdGVSZXN1bHRzOworICBib29sIGNoZWNrUmVzdWx0czsKKyAgYm9vbCByZWFsY2xvY2s7CisgIGludCB0cmllczsKKworcHJvdGVjdGVkOgorICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IG1fc2VsZWN0ZWRBY3Rpb25OYW1lczsKK307CisKKyNkZWZpbmUgQlRMX01BSU4gXAorICBCdGxDb25maWcgQnRsQ29uZmlnOjpJbnN0YW5jZQorCisjZW5kaWYgLy8gQlRMX0hICmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2N2NiNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9mdW5jdGlvbi5oaApAQCAtMCwwICsxLDU0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgaW5pdF9mdW5jdGlvbi5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgSU5JVF9GVU5DVElPTl9ISAorI2RlZmluZSBJTklUX0ZVTkNUSU9OX0hICisKK2RvdWJsZSBzaW1wbGVfZnVuY3Rpb24oaW50IGluZGV4KQoreworICByZXR1cm4gaW5kZXg7Cit9CisKK2RvdWJsZSBzaW1wbGVfZnVuY3Rpb24oaW50IGluZGV4X2ksIGludCBpbmRleF9qKQoreworICByZXR1cm4gaW5kZXhfaStpbmRleF9qOworfQorCitkb3VibGUgcHNldWRvX3JhbmRvbShpbnQgLyppbmRleCovKQoreworICByZXR1cm4gc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKTsKK30KKworZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qaW5kZXhfaSovLCBpbnQgLyppbmRleF9qKi8pCit7CisgIHJldHVybiBzdGQ6OnJhbmQoKS9kb3VibGUoUkFORF9NQVgpOworfQorCisKK2RvdWJsZSBudWxsX2Z1bmN0aW9uKGludCAvKmluZGV4Ki8pCit7CisgIHJldHVybiAwLjA7Cit9CisKK2RvdWJsZSBudWxsX2Z1bmN0aW9uKGludCAvKmluZGV4X2kqLywgaW50IC8qaW5kZXhfaiovKQoreworICByZXR1cm4gMC4wOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9tYXRyaXguaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfbWF0cml4LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfbWF0cml4LmhoCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBpbml0X21hdHJpeC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIElOSVRfTUFUUklYX0hICisjZGVmaW5lIElOSVRfTUFUUklYX0hICisKKy8vIFRoZSBWZWN0b3IgY2xhc3MgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgcGFydCBvZiBTVEwgdmVjdG9yIGNvbmNlcHQgOgorLy8gICAgICAgICAgICByZXNpemUoKSBtZXRob2QKKy8vICAgICAgICAgICAgW10gb3BlcmF0b3IgZm9yIHNldHRpbmcgZWxlbWVudAorLy8gICAgICAgICAgICB2YWx1ZV90eXBlIGRlZmluZWQKK3RlbXBsYXRlPGRvdWJsZSBpbml0X2Z1bmN0aW9uKGludCxpbnQpLCBjbGFzcyBWZWN0b3I+CitCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0X3JvdyhWZWN0b3IgJiBYLCBpbnQgc2l6ZSwgaW50IHJvdyl7CisKKyAgWC5yZXNpemUoc2l6ZSk7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaj0wO2o8WC5zaXplKCk7aisrKXsKKyAgICBYW2pdPXR5cGVuYW1lIFZlY3Rvcjo6dmFsdWVfdHlwZShpbml0X2Z1bmN0aW9uKHJvdyxqKSk7CisgIH0KK30KKworCisvLyBNYXRyaXggaXMgYSBWZWN0b3Igb2YgVmVjdG9yCisvLyBUaGUgTWF0cml4IGNsYXNzIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgU1RMIHZlY3RvciBjb25jZXB0IDoKKy8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCisvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIHJvd3MKK3RlbXBsYXRlPGRvdWJsZSBpbml0X2Z1bmN0aW9uKGludCxpbnQpLGNsYXNzIFZlY3Rvcj4KK0JUTF9ET05UX0lOTElORSB2b2lkIGluaXRfbWF0cml4KFZlY3RvciAmICBBLCBpbnQgc2l6ZSl7CisgIEEucmVzaXplKHNpemUpOworICBmb3IgKHVuc2lnbmVkIGludCByb3c9MDsgcm93PEEuc2l6ZSgpIDsgcm93KyspeworICAgIGluaXRfcm93PGluaXRfZnVuY3Rpb24+KEFbcm93XSxzaXplLHJvdyk7CisgIH0KK30KKwordGVtcGxhdGU8ZG91YmxlIGluaXRfZnVuY3Rpb24oaW50LGludCksY2xhc3MgTWF0cml4PgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgaW5pdF9tYXRyaXhfc3ltbShNYXRyaXgmICBBLCBpbnQgc2l6ZSl7CisgIEEucmVzaXplKHNpemUpOworICBmb3IgKHVuc2lnbmVkIGludCByb3c9MDsgcm93PEEuc2l6ZSgpIDsgcm93KyspCisgICAgQVtyb3ddLnJlc2l6ZShzaXplKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgcm93PTA7IHJvdzxBLnNpemUoKSA7IHJvdysrKXsKKyAgICBBW3Jvd11bcm93XSA9IGluaXRfZnVuY3Rpb24ocm93LHJvdyk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgY29sPTA7IGNvbDxyb3cgOyBjb2wrKyl7CisgICAgICBkb3VibGUgeCA9IGluaXRfZnVuY3Rpb24ocm93LGNvbCk7CisgICAgICBBW3Jvd11bY29sXSA9IEFbY29sXVtyb3ddID0geDsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfdmVjdG9yLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThlODdkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaApAQCAtMCwwICsxLDM3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgaW5pdF92ZWN0b3IuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE4IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBJTklUX1ZFQ1RPUl9ISAorI2RlZmluZSBJTklUX1ZFQ1RPUl9ISAorCisvLyBUaGUgVmVjdG9yIGNsYXNzIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgU1RMIHZlY3RvciBjb25jZXB0IDoKKy8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCisvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIGVsZW1lbnQKKy8vICAgICAgICAgICAgdmFsdWVfdHlwZSBkZWZpbmVkCit0ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQpLCBjbGFzcyBWZWN0b3I+Cit2b2lkIGluaXRfdmVjdG9yKFZlY3RvciAmIFgsIGludCBzaXplKXsKKworICBYLnJlc2l6ZShzaXplKTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpPTA7aTxYLnNpemUoKTtpKyspeworICAgIFhbaV09dHlwZW5hbWUgVmVjdG9yOjp2YWx1ZV90eXBlKGluaXRfZnVuY3Rpb24oaSkpOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL2JlbmNoX3N0YXRpYy5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiNTVlYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGgKQEAgLTAsMCArMSw4MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJlbmNoX3N0YXRpYy5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTYgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEJFTkNIX1NUQVRJQ19ISAorI2RlZmluZSBCRU5DSF9TVEFUSUNfSEgKKworI2luY2x1ZGUgImJ0bC5oaCIKKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAieHlfZmlsZS5oaCIKKyNpbmNsdWRlICJzdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoIgorI2luY2x1ZGUgInRpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoIgorLy8gI2luY2x1ZGUgInRpbWVycy9taXhlZF9wZXJmX2FuYWx5emVyLmhoIgorLy8gI2luY2x1ZGUgInRpbWVycy94ODZfcGVyZl9hbmFseXplci5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPgorQlRMX0RPTlRfSU5MSU5FICB2b2lkIGJlbmNoX3N0YXRpYyh2b2lkKQoreworICBpZiAoQnRsQ29uZmlnOjpza2lwQWN0aW9uKEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLDEwPiA+OjpuYW1lKCkpKQorICAgIHJldHVybjsKKworICBzdHJpbmcgZmlsZW5hbWUgPSAiYmVuY2hfIiArIEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLDEwPiA+OjpuYW1lKCkgKyAiLmRhdCI7CisKKyAgSU5GT1MoInN0YXJ0aW5nICIgPDwgZmlsZW5hbWUpOworCisgIGNvbnN0IGludCBtYXhfc2l6ZSA9IFRJTllfTVZfTUFYX1NJWkU7CisKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfbWZsb3BzOworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRhYl9zaXplczsKKworICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8bWF4X3NpemUsUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPjo6Z28odGFiX3NpemVzLHRhYl9tZmxvcHMpOworCisgIGR1bXBfeHlfZmlsZSh0YWJfc2l6ZXMsdGFiX21mbG9wcyxmaWxlbmFtZSk7Cit9CisKKy8vIGRlZmF1bHQgUGVyZiBBbmFseXplcgordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPgorQlRMX0RPTlRfSU5MSU5FICB2b2lkIGJlbmNoX3N0YXRpYyh2b2lkKQoreworICBiZW5jaF9zdGF0aWM8UG9ydGFibGVfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOworICAvL2JlbmNoX3N0YXRpYzxNaXhlZF9QZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+KCk7CisgIC8vYmVuY2hfc3RhdGljPFg4Nl9QZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+KCk7Cit9CisKKyNlbmRpZgorCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL2ludGVsX2JlbmNoX2ZpeGVkX3NpemUuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvaW50ZWxfYmVuY2hfZml4ZWRfc2l6ZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGVkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL2ludGVsX2JlbmNoX2ZpeGVkX3NpemUuaGgKQEAgLTAsMCArMSw2NiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGludGVsX2JlbmNoX2ZpeGVkX3NpemUuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk6WMgMyAxODo1OTozNyBDRVQgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBfQkVOQ0hfRklYRURfU0laRV9ISF8KKyNkZWZpbmUgX0JFTkNIX0ZJWEVEX1NJWkVfSEhfCisKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJmdW5jdGlvbl90aW1lLmhoIgorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorZG91YmxlIGJlbmNoX2ZpeGVkX3NpemUoaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyAgJiBuYl9jYWxjLHVuc2lnbmVkIGxvbmcgbG9uZyAmIG5iX2luaXQpCit7CisgIAorICBBY3Rpb24gYWN0aW9uKHNpemUpOworICAKKyAgZG91YmxlIHRpbWVfYmFzZWxpbmU9dGltZV9pbml0KG5iX2luaXQsYWN0aW9uKTsKKworICB3aGlsZSAodGltZV9iYXNlbGluZSA8IE1JTl9USU1FKSB7CisKKyAgICAvL0lORk9TKCJuYl9pbml0PSI8PG5iX2luaXQpOworICAgIC8vSU5GT1MoInRpbWVfYmFzZWxpbmU9Ijw8dGltZV9iYXNlbGluZSk7CisgICAgbmJfaW5pdCo9MjsKKyAgICB0aW1lX2Jhc2VsaW5lPXRpbWVfaW5pdChuYl9pbml0LGFjdGlvbik7CisgIH0KKyAgCisgIHRpbWVfYmFzZWxpbmU9dGltZV9iYXNlbGluZS8oZG91YmxlKG5iX2luaXQpKTsKKyAgCisgIGRvdWJsZSB0aW1lX2FjdGlvbj10aW1lX2NhbGN1bGF0ZShuYl9jYWxjLGFjdGlvbik7CisgIAorICB3aGlsZSAodGltZV9hY3Rpb24gPCBNSU5fVElNRSkgeworICAgIAorICAgIG5iX2NhbGMqPTI7CisgICAgdGltZV9hY3Rpb249dGltZV9jYWxjdWxhdGUobmJfY2FsYyxhY3Rpb24pOworICB9CisKKyAgSU5GT1MoIm5iX2luaXQ9Ijw8bmJfaW5pdCk7CisgIElORk9TKCJuYl9jYWxjPSI8PG5iX2NhbGMpOworICAKKyAgCisgIHRpbWVfYWN0aW9uPXRpbWVfYWN0aW9uLyhkb3VibGUobmJfY2FsYykpOworICAKKyAgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOworICAKKyAgdGltZV9hY3Rpb249dGltZV9hY3Rpb24tdGltZV9iYXNlbGluZTsKKworICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMTAwMDAwMC4wKTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDJkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoCkBAIC0wLDAgKzEsNTcgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk6WMgMyAxODo1OTozNiBDRVQgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBfU1RBVElDX1NJWkVfR0VORVJBVE9SX0hICisjZGVmaW5lIF9TVEFUSUNfU0laRV9HRU5FUkFUT1JfSEgKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vcmVjdXJzaXZlIGdlbmVyYXRpb24gb2Ygc3RhdGljYWxseSBkZWZpbmVkIG1hdHJpeCBhbmQgdmVjdG9yIHNpemVzCisKK3RlbXBsYXRlIDxpbnQgU0laRSx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwgdGVtcGxhdGU8Y2xhc3MsaW50PiBjbGFzcyBJbnRlcmZhY2U+IAorc3RydWN0IHN0YXRpY19zaXplX2dlbmVyYXRvcnsKKyAgc3RhdGljIHZvaWQgZ28odmVjdG9yPGRvdWJsZT4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcykKKyAgeworICAgIHRhYl9zaXplcy5wdXNoX2JhY2soU0laRSk7CisgICAgc3RkOjpjb3V0IDw8IHRhYl9zaXplcy5iYWNrKCkgPDwgIiBcdCIgPDwgc3RkOjpmbHVzaDsKKyAgICBQZXJmX0FuYWx5emVyPEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLFNJWkU+ID4gPiBwZXJmX2FjdGlvbjsKKyAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyhTSVpFKSk7CisgICAgc3RkOjpjb3V0IDw8IHRhYl9tZmxvcHMuYmFjaygpIDw8ICIgTUZsb3BzIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RhdGljX3NpemVfZ2VuZXJhdG9yPFNJWkUtMSxQZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+Ojpnbyh0YWJfc2l6ZXMsdGFiX21mbG9wcyk7CisgIH07Cit9OworCisvL3JlY3Vyc2lvbiBlbmQKKwordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBQZXJmX0FuYWx5emVyLCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZTxjbGFzcyxpbnQ+IGNsYXNzIEludGVyZmFjZT4gCitzdHJ1Y3Qgc3RhdGljX3NpemVfZ2VuZXJhdG9yPDEsUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPnsgIAorICBzdGF0aWMgIHZvaWQgZ28odmVjdG9yPGRvdWJsZT4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcykKKyAgeworICAgIHRhYl9zaXplcy5wdXNoX2JhY2soMSk7CisgICAgUGVyZl9BbmFseXplcjxBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxPiA+ID4gcGVyZl9hY3Rpb247CisgICAgdGFiX21mbG9wcy5wdXNoX2JhY2socGVyZl9hY3Rpb24uZXZhbF9tZmxvcHMoMSkpOworICB9OworfTsKKworI2VuZGlmCisgIAorICAKKyAgCisgIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Zjg5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvU1RMX3BlcmZfYW5hbHl6ZXIuaGgKQEAgLTAsMCArMSw4MiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIFNUTF9wZXJmX2FuYWx5emVyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzUgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgX1NUTF9QRVJGX0FOQUxZU0VSX0hICisjZGVmaW5lIF9TVExfUEVSRl9BTkFMWVNFUl9ISAorCisjaW5jbHVkZSAiU1RMX3RpbWVyLmhoIgorI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKKwordGVtcGxhdGU8Y2xhc3MgQUNUSU9OPgorY2xhc3MgU1RMX1BlcmZfQW5hbHl6ZXJ7CitwdWJsaWM6ICAKKyAgU1RMX1BlcmZfQW5hbHl6ZXIodW5zaWduZWQgbG9uZyBsb25nIG5iX3NhbXBsZT1ERUZBVUxUX05CX1NBTVBMRSk6X25iX3NhbXBsZShuYl9zYW1wbGUpLF9jaHJvbm9zKCkKKyAgeworICAgIE1FU1NBR0UoIlNUTF9QZXJmX0FuYWx5emVyIEN0b3IiKTsKKyAgfTsgCisgIFNUTF9QZXJmX0FuYWx5emVyKCBjb25zdCBTVExfUGVyZl9BbmFseXplciAmICl7CisgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBleGl0KDApOworICB9OworICB+U1RMX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJTVExfUGVyZl9BbmFseXplciBEdG9yIik7CisgIH07CisgIAorICAKKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKKyAgeworCisgICAgQUNUSU9OIGFjdGlvbihzaXplKTsKKworICAgIF9jaHJvbm9zLnN0YXJ0X2Jhc2VsaW5lKF9uYl9zYW1wbGUpOworICAgICAgCisgICAgZG8geworCisgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgIH0gd2hpbGUgKF9jaHJvbm9zLmNoZWNrKCkpOworCisgICAgZG91YmxlIGJhc2VsaW5lX3RpbWU9X2Nocm9ub3MuZ2V0X3RpbWUoKTsKKworICAgIF9jaHJvbm9zLnN0YXJ0KF9uYl9zYW1wbGUpOworICAgIGRvIHsKKyAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgICBhY3Rpb24uY2FsY3VsYXRlKCk7CisgICAgfSB3aGlsZSAoX2Nocm9ub3MuY2hlY2soKSk7CisKKyAgICBkb3VibGUgY2FsY3VsYXRlX3RpbWU9X2Nocm9ub3MuZ2V0X3RpbWUoKTsKKworICAgIGRvdWJsZSBjb3JyZWN0ZWRfdGltZT1jYWxjdWxhdGVfdGltZS1iYXNlbGluZV90aW1lOworICAgIAorICAgIC8vICAgIGNvdXQgPDwgc2l6ZSA8PCIgIjw8YmFzZWxpbmVfdGltZTw8IiAiPDxjYWxjdWxhdGVfdGltZTw8IiAiPDxjb3JyZWN0ZWRfdGltZTw8IiAiPDxhY3Rpb24ubmJfb3BfYmFzZSgpIDw8IGVuZGw7ICAgIAorICAgIAorICAgIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjb3JyZWN0ZWRfdGltZSoxMDAwMDAwLjApOworICAgIC8vcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKGNhbGN1bGF0ZV90aW1lKjEwMDAwMDAuMCk7CisgICAgCisgIH0KK3ByaXZhdGU6CisKKyAgU1RMX1RpbWVyIF9jaHJvbm9zOworICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX3NhbXBsZTsKKworICAKK307CisKKyAgCisgIAorI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvU1RMX3RpbWVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF90aW1lci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM1NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF90aW1lci5oaApAQCAtMCwwICsxLDc4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgU1RMX1RpbWVyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzUgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKy8vIFNUTCBUaW1lciBDbGFzcy4gQWRhcHRlZCAoTC5QLikgZnJvbSB0aGUgdGltZXIgY2xhc3MgYnkgTXVzc2VyIGV0IEFsCisvLyBkZXNjcmliZWQgaW50IHRoZSBCb29rIDogU1RMIFR1dG9yaWFsIGFuZCByZWZlcmVuY2UgZ3VpZGUuCisvLyBEZWZpbmUgYSB0aW1lciBjbGFzcyBmb3IgYW5hbHl6aW5nIGFsZ29yaXRobSBwZXJmb3JtYW5jZS4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgU1RMX1RpbWVyIHsKK3B1YmxpYzoKKyAgU1RMX1RpbWVyKCl7IGJhc2VsaW5lID0gZmFsc2U7IH07ICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIC8vIFN0YXJ0IGEgc2VyaWVzIG9mIHIgdHJpYWxzOgorICB2b2lkIHN0YXJ0KHVuc2lnbmVkIGludCByKXsKKyAgICByZXBzID0gcjsKKyAgICBjb3VudCA9IDA7CisgICAgaXRlcmF0aW9ucy5jbGVhcigpOworICAgIGl0ZXJhdGlvbnMucmVzZXJ2ZShyZXBzKTsKKyAgICBpbml0aWFsID0gdGltZSgwKTsKKyAgfTsKKyAgLy8gU3RhcnQgYSBzZXJpZXMgb2YgciB0cmlhbHMgdG8gZGV0ZXJtaW5lIGJhc2VsaW5lIHRpbWU6CisgIHZvaWQgc3RhcnRfYmFzZWxpbmUodW5zaWduZWQgaW50IHIpCisgIHsKKyAgICBiYXNlbGluZSA9IHRydWU7CisgICAgc3RhcnQocik7CisgIH0KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0cmlhbHMgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgZWxzZSBmYWxzZQorICBib29sIGNoZWNrKCkKKyAgeworICAgICsrY291bnQ7CisgICAgZmluYWwgPSB0aW1lKDApOworICAgIGlmIChpbml0aWFsIDwgZmluYWwpIHsKKyAgICAgIGl0ZXJhdGlvbnMucHVzaF9iYWNrKGNvdW50KTsgIAorICAgICAgaW5pdGlhbCA9IGZpbmFsOworICAgICAgY291bnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gKGl0ZXJhdGlvbnMuc2l6ZSgpIDwgcmVwcyk7CisgIH07CisgIC8vIFJldHVybnMgdGhlIHJlc3VsdHMgZm9yIGV4dGVybmFsIHVzZQorICBkb3VibGUgZ2V0X3RpbWUoIHZvaWQgKQorICB7CisgICAgc29ydChpdGVyYXRpb25zLmJlZ2luKCksIGl0ZXJhdGlvbnMuZW5kKCkpOworICAgIHJldHVybiAxLjAvaXRlcmF0aW9uc1tyZXBzLzJdOworICB9OworcHJpdmF0ZToKKyAgdW5zaWduZWQgaW50IHJlcHM7ICAvLyBOdW1iZXIgb2YgdHJpYWxzCisgIC8vIEZvciBzdG9yaW5nIGxvb3AgaXRlcmF0aW9ucyBvZiBhIHRyaWFsCisgIHZlY3Rvcjxsb25nPiBpdGVyYXRpb25zOworICAvLyBGb3Igc2F2aW5nIGluaXRpYWwgYW5kIGZpbmFsIHRpbWVzIG9mIGEgdHJpYWwKKyAgdGltZV90IGluaXRpYWwsIGZpbmFsOworICAvLyBGb3IgY291bnRpbmcgbG9vcCBpdGVyYXRpb25zIG9mIGEgdHJpYWwKKyAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgLy8gdHJ1ZSBpZiB0aGlzIGlzIGEgYmFzZWxpbmUgY29tcHV0YXRpb24sIGZhbHNlIG90aGVyd2lzZQorICBib29sIGJhc2VsaW5lOworICAvLyBGb3IgcmVjb3JkaW5nIHRoZSBiYXNlbGluZSB0aW1lIAorICBkb3VibGUgYmFzZWxpbmVfdGltZTsKK307CisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9taXhlZF9wZXJmX2FuYWx5emVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL21peGVkX3BlcmZfYW5hbHl6ZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MDIzNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9taXhlZF9wZXJmX2FuYWx5emVyLmhoCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBtaXhlZF9wZXJmX2FuYWx5emVyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzYgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgX01JWEVEX1BFUkZfQU5BTFlTRVJfSEgKKyNkZWZpbmUgX01JWEVEX1BFUkZfQU5BTFlTRVJfSEgKKworI2luY2x1ZGUgIng4Nl9wZXJmX2FuYWx5emVyLmhoIgorI2luY2x1ZGUgInBvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgiCisKKy8vIGNob29zZSBwb3J0YWJsZSBwZXJmIGFuYWx5emVyIGZvciBsb25nIGNhbGN1bGF0aW9ucyBhbmQgeDg2IGFuYWx5c2VyIGZvciBzaG9ydCBvbmVzCisKKwordGVtcGxhdGU8Y2xhc3MgQWN0aW9uPgorY2xhc3MgTWl4ZWRfUGVyZl9BbmFseXplcnsKKyAgCitwdWJsaWM6ICAKKyAgTWl4ZWRfUGVyZl9BbmFseXplciggdm9pZCApOl94ODZwYSgpLF9wcGEoKSxfdXNlX3BwYSh0cnVlKQorICB7CisgICAgTUVTU0FHRSgiTWl4ZWRfUGVyZl9BbmFseXplciBDdG9yIik7CisgIH07IAorICBNaXhlZF9QZXJmX0FuYWx5emVyKCBjb25zdCBNaXhlZF9QZXJmX0FuYWx5emVyICYgKXsKKyAgICBJTkZPUygiQ29weSBDdG9yIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIGV4aXQoMCk7CisgIH07CisgIH5NaXhlZF9QZXJmX0FuYWx5emVyKCB2b2lkICl7CisgICAgTUVTU0FHRSgiTWl4ZWRfUGVyZl9BbmFseXplciBEdG9yIik7CisgIH07CisgICAgCisgIAorICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQorICB7CisKKyAgICBkb3VibGUgcmVzdWx0PTAuMDsKKyAgICBpZiAoX3VzZV9wcGEpeyAgICAgIAorICAgICAgcmVzdWx0PV9wcGEuZXZhbF9tZmxvcHMoc2l6ZSk7CisgICAgICBpZiAoX3BwYS5nZXRfbmJfY2FsYygpPkRFRkFVTFRfTkJfU0FNUExFKXtfdXNlX3BwYT1mYWxzZTt9ICAgICAgCisgICAgfQorICAgIGVsc2V7ICAgICAgCisgICAgICByZXN1bHQ9X3g4NnBhLmV2YWxfbWZsb3BzKHNpemUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworcHJpdmF0ZToKKworICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyPEFjdGlvbj4gX3BwYTsKKyAgWDg2X1BlcmZfQW5hbHl6ZXI8QWN0aW9uPiBfeDg2cGE7CisgIGJvb2wgX3VzZV9wcGE7CisKK307CisKKyNlbmRpZgorCisgIAorICAgIAorICAKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1NzlmYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgcG9ydGFibGVfcGVyZl9hbmFseXplci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk77+9YyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIF9QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICisjZGVmaW5lIF9QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICisKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0aW1lcnMvcG9ydGFibGVfdGltZXIuaGgiCisKK3RlbXBsYXRlIDxjbGFzcyBBY3Rpb24+CitjbGFzcyBQb3J0YWJsZV9QZXJmX0FuYWx5emVyeworcHVibGljOgorICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKCApOl9uYl9jYWxjKDApLCBtX3RpbWVfYWN0aW9uKDApLCBfY2hyb25vcygpeworICAgIE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgQ3RvciIpOworICB9OworICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKCBjb25zdCBQb3J0YWJsZV9QZXJmX0FuYWx5emVyICYgKXsKKyAgICBJTkZPUygiQ29weSBDdG9yIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIGV4aXQoMCk7CisgIH07CisgIH5Qb3J0YWJsZV9QZXJmX0FuYWx5emVyKCl7CisgICAgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBEdG9yIik7CisgIH07CisKKyAgQlRMX0RPTlRfSU5MSU5FIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKKyAgeworICAgIEFjdGlvbiBhY3Rpb24oc2l6ZSk7CisKKy8vICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworLy8gICAgIHRpbWVfYWN0aW9uID0gdGltZV9jYWxjdWxhdGUoYWN0aW9uKTsKKyAgICB3aGlsZSAobV90aW1lX2FjdGlvbiA8IE1JTl9USU1FKQorICAgIHsKKyAgICAgIGlmKF9uYl9jYWxjPT0wKSBfbmJfY2FsYyA9IDE7CisgICAgICBlbHNlICAgICAgICAgICAgX25iX2NhbGMgKj0gMjsKKyAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgICBtX3RpbWVfYWN0aW9uID0gdGltZV9jYWxjdWxhdGUoYWN0aW9uKTsKKyAgICB9CisKKyAgICAvLyBvcHRpbWl6ZQorICAgIGZvciAoaW50IGk9MTsgaTxCdGxDb25maWc6Okluc3RhbmNlLnRyaWVzOyArK2kpCisgICAgeworICAgICAgQWN0aW9uIF9hY3Rpb24oc2l6ZSk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAiIDw8IF9hY3Rpb24ubmJfb3BfYmFzZSgpKl9uYl9jYWxjLyhtX3RpbWVfYWN0aW9uKjFlNikgPDwgIiAiOworICAgICAgX2FjdGlvbi5pbml0aWFsaXplKCk7CisgICAgICBtX3RpbWVfYWN0aW9uID0gc3RkOjptaW4obV90aW1lX2FjdGlvbiwgdGltZV9jYWxjdWxhdGUoX2FjdGlvbikpOworICAgIH0KKworICAgIGRvdWJsZSB0aW1lX2FjdGlvbiA9IG1fdGltZV9hY3Rpb24gLyAoZG91YmxlKF9uYl9jYWxjKSk7CisKKyAgICAvLyBjaGVjaworICAgIGlmIChCdGxDb25maWc6Okluc3RhbmNlLmNoZWNrUmVzdWx0cyAmJiBzaXplPDEyOCkKKyAgICB7CisgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOworICAgICAgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOworICAgIH0KKyAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMWU2KTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSBkb3VibGUgdGltZV9jYWxjdWxhdGUoQWN0aW9uICYgYWN0aW9uKQorICB7CisgICAgLy8gdGltZSBtZWFzdXJlbWVudAorICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKKyAgICBfY2hyb25vcy5zdGFydCgpOworICAgIGZvciAodW5zaWduZWQgaW50IGlpPTA7aWk8X25iX2NhbGM7aWkrKykKKyAgICB7CisgICAgICBhY3Rpb24uY2FsY3VsYXRlKCk7CisgICAgfQorICAgIF9jaHJvbm9zLnN0b3AoKTsKKyAgICByZXR1cm4gX2Nocm9ub3MudXNlcl90aW1lKCk7CisgIH0KKworICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X25iX2NhbGMoKQorICB7CisgICAgcmV0dXJuIF9uYl9jYWxjOworICB9CisKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9jYWxjOworICBkb3VibGUgbV90aW1lX2FjdGlvbjsKKyAgUG9ydGFibGVfVGltZXIgX2Nocm9ub3M7CisKK307CisKKyNlbmRpZiAvL19QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyX29sZC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyX29sZC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UzNzgxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXJfb2xkLmhoCkBAIC0wLDAgKzEsMTM0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgcG9ydGFibGVfcGVyZl9hbmFseXplci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk77+9YyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIF9QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICisjZGVmaW5lIF9QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICisKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0aW1lcnMvcG9ydGFibGVfdGltZXIuaGgiCisKK3RlbXBsYXRlIDxjbGFzcyBBY3Rpb24+CitjbGFzcyBQb3J0YWJsZV9QZXJmX0FuYWx5emVyeworcHVibGljOgorICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKCB2b2lkICk6X25iX2NhbGMoMSksX25iX2luaXQoMSksX2Nocm9ub3MoKXsKKyAgICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIEN0b3IiKTsKKyAgfTsKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplciggY29uc3QgUG9ydGFibGVfUGVyZl9BbmFseXplciAmICl7CisgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBleGl0KDApOworICB9OworICB+UG9ydGFibGVfUGVyZl9BbmFseXplciggdm9pZCApeworICAgIE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgRHRvciIpOworICB9OworCisKKworICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQorICB7CisKKyAgICBBY3Rpb24gYWN0aW9uKHNpemUpOworCisvLyAgICAgZG91YmxlIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2luaXQoYWN0aW9uKTsKKy8vICAgICB3aGlsZSAodGltZV9iYXNlbGluZSA8IE1JTl9USU1FX0lOSVQpCisvLyAgICAgeworLy8gICAgICAgX25iX2luaXQgKj0gMjsKKy8vICAgICAgIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2luaXQoYWN0aW9uKTsKKy8vICAgICB9CisvLworLy8gICAgIC8vIG9wdGltaXplCisvLyAgICAgZm9yIChpbnQgaT0xOyBpPE5CX1RSSUVTOyArK2kpCisvLyAgICAgICB0aW1lX2Jhc2VsaW5lID0gc3RkOjptaW4odGltZV9iYXNlbGluZSwgdGltZV9pbml0KGFjdGlvbikpOworLy8KKy8vICAgICB0aW1lX2Jhc2VsaW5lID0gdGltZV9iYXNlbGluZS8oZG91YmxlKF9uYl9pbml0KSk7CisKKyAgICBkb3VibGUgdGltZV9hY3Rpb24gPSB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pOworICAgIHdoaWxlICh0aW1lX2FjdGlvbiA8IE1JTl9USU1FKQorICAgIHsKKyAgICAgIF9uYl9jYWxjICo9IDI7CisgICAgICB0aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKGFjdGlvbik7CisgICAgfQorCisgICAgLy8gb3B0aW1pemUKKyAgICBmb3IgKGludCBpPTE7IGk8TkJfVFJJRVM7ICsraSkKKyAgICAgIHRpbWVfYWN0aW9uID0gc3RkOjptaW4odGltZV9hY3Rpb24sIHRpbWVfY2FsY3VsYXRlKGFjdGlvbikpOworCisvLyAgICAgSU5GT1MoInNpemU9Ijw8c2l6ZSk7CisvLyAgICAgSU5GT1MoIl9uYl9pbml0PSI8PF9uYl9pbml0KTsKKy8vICAgICBJTkZPUygiX25iX2NhbGM9Ijw8X25iX2NhbGMpOworCisgICAgdGltZV9hY3Rpb24gPSB0aW1lX2FjdGlvbiAvIChkb3VibGUoX25iX2NhbGMpKTsKKworICAgIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKKworCisgICAgZG91YmxlIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2luaXQoYWN0aW9uKTsKKyAgICBmb3IgKGludCBpPTE7IGk8TkJfVFJJRVM7ICsraSkKKyAgICAgIHRpbWVfYmFzZWxpbmUgPSBzdGQ6Om1pbih0aW1lX2Jhc2VsaW5lLCB0aW1lX2luaXQoYWN0aW9uKSk7CisgICAgdGltZV9iYXNlbGluZSA9IHRpbWVfYmFzZWxpbmUvKGRvdWJsZShfbmJfaW5pdCkpOworCisKKworLy8gICAgIElORk9TKCJ0aW1lX2Jhc2VsaW5lPSI8PHRpbWVfYmFzZWxpbmUpOworLy8gICAgIElORk9TKCJ0aW1lX2FjdGlvbj0iPDx0aW1lX2FjdGlvbik7CisKKyAgICB0aW1lX2FjdGlvbiA9IHRpbWVfYWN0aW9uIC0gdGltZV9iYXNlbGluZTsKKworLy8gICAgIElORk9TKCJ0aW1lX2NvcnJlY3RlZD0iPDx0aW1lX2FjdGlvbik7CisKKyAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMTAwMDAwMC4wKTsKKyAgfQorCisgIGlubGluZSBkb3VibGUgdGltZV9pbml0KEFjdGlvbiAmIGFjdGlvbikKKyAgeworICAgIC8vIHRpbWUgbWVhc3VyZW1lbnQKKyAgICBfY2hyb25vcy5zdGFydCgpOworICAgIGZvciAoaW50IGlpPTA7IGlpPF9uYl9pbml0OyBpaSsrKQorICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKyAgICBfY2hyb25vcy5zdG9wKCk7CisgICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOworICB9CisKKworICBpbmxpbmUgZG91YmxlIHRpbWVfY2FsY3VsYXRlKEFjdGlvbiAmIGFjdGlvbikKKyAgeworICAgIC8vIHRpbWUgbWVhc3VyZW1lbnQKKyAgICBfY2hyb25vcy5zdGFydCgpOworICAgIGZvciAoaW50IGlpPTA7aWk8X25iX2NhbGM7aWkrKykKKyAgICB7CisgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOworICAgIH0KKyAgICBfY2hyb25vcy5zdG9wKCk7CisgICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOworICB9CisKKyAgdW5zaWduZWQgbG9uZyBsb25nIGdldF9uYl9jYWxjKCB2b2lkICkKKyAgeworICAgIHJldHVybiBfbmJfY2FsYzsKKyAgfQorCisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfY2FsYzsKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9pbml0OworICBQb3J0YWJsZV9UaW1lciBfY2hyb25vczsKKworfTsKKworI2VuZGlmIC8vX1BPUlRBQkxFX1BFUkZfQU5BTFlaRVJfSEgKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV90aW1lci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV90aW1lci5oaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTk5ODExCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoCkBAIC0wLDAgKzEsMTg3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgcG9ydGFibGVfdGltZXIuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+IGZyb20gYm9vc3QgbGliCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE3IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworLy8gIHNpbXBsZV90aW1lIGV4dHJhY3RlZCBmcm9tIHRoZSBib29zdCBsaWJyYXJ5CisvLworI2lmbmRlZiBfUE9SVEFCTEVfVElNRVJfSEgKKyNkZWZpbmUgX1BPUlRBQkxFX1RJTUVSX0hICisKKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8dGltZS5oPgorCisKKyNkZWZpbmUgVVNFQ19JTl9TRUMgMTAwMDAwMAorCisKKy8vICB0aW1lciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vICBBIHRpbWVyIG9iamVjdCBtZWFzdXJlcyBDUFUgdGltZS4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorCisjZGVmaW5lIE5PTUlOTUFYCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKiNpZm5kZWYgaHJfdGltZXIKKyNpbmNsdWRlICJocl90aW1lLmgiCisjZGVmaW5lIGhyX3RpbWVyCisjZW5kaWYqLworCisgY2xhc3MgUG9ydGFibGVfVGltZXIKKyB7CisgIHB1YmxpYzoKKworICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgIExBUkdFX0lOVEVHRVIgc3RhcnQ7CisgICAgTEFSR0VfSU5URUdFUiBzdG9wOworICAgfSBzdG9wV2F0Y2g7CisKKworICAgUG9ydGFibGVfVGltZXIoKQorICAgeworCSBzdGFydFZhbC5RdWFkUGFydCA9IDA7CisJIHN0b3BWYWwuUXVhZFBhcnQgPSAwOworCSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxdWVuY3kpOworICAgfQorCisgICB2b2lkIHN0YXJ0KCkgeyBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmc3RhcnRWYWwpOyB9CisKKyAgIHZvaWQgc3RvcCgpIHsgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnN0b3BWYWwpOyB9CisKKyAgIGRvdWJsZSBlbGFwc2VkKCkgeworCSBMQVJHRV9JTlRFR0VSIHRpbWU7CisgICAgIHRpbWUuUXVhZFBhcnQgPSBzdG9wVmFsLlF1YWRQYXJ0IC0gc3RhcnRWYWwuUXVhZFBhcnQ7CisgICAgIHJldHVybiBMSVRvU2Vjcyh0aW1lKTsKKyAgIH0KKworICAgZG91YmxlIHVzZXJfdGltZSgpIHsgcmV0dXJuIGVsYXBzZWQoKTsgfQorCisKKyBwcml2YXRlOgorCisgICBkb3VibGUgTElUb1NlY3MoTEFSR0VfSU5URUdFUiYgTCkgeworICAgICByZXR1cm4gKChkb3VibGUpTC5RdWFkUGFydCAvKGRvdWJsZSlmcmVxdWVuY3kuUXVhZFBhcnQpIDsKKyAgIH0KKworICAgTEFSR0VfSU5URUdFUiBzdGFydFZhbDsKKyAgIExBUkdFX0lOVEVHRVIgc3RvcFZhbDsKKyAgIExBUkdFX0lOVEVHRVIgZnJlcXVlbmN5OworCisKKyB9OyAvLyBQb3J0YWJsZV9UaW1lcgorCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoX3RpbWUuaD4KKworCitjbGFzcyBQb3J0YWJsZV9UaW1lcgoreworIHB1YmxpYzoKKworICBQb3J0YWJsZV9UaW1lcigpCisgIHsKKyAgfQorCisgIHZvaWQgc3RhcnQoKQorICB7CisgICAgbV9zdGFydF90aW1lID0gZG91YmxlKG1hY2hfYWJzb2x1dGVfdGltZSgpKSoxZS05OzsKKworICB9CisKKyAgdm9pZCBzdG9wKCkKKyAgeworICAgIG1fc3RvcF90aW1lID0gZG91YmxlKG1hY2hfYWJzb2x1dGVfdGltZSgpKSoxZS05OzsKKworICB9CisKKyAgZG91YmxlIGVsYXBzZWQoKQorICB7CisgICAgcmV0dXJuICB1c2VyX3RpbWUoKTsKKyAgfQorCisgIGRvdWJsZSB1c2VyX3RpbWUoKQorICB7CisgICAgcmV0dXJuIG1fc3RvcF90aW1lIC0gbV9zdGFydF90aW1lOworICB9CisKKworcHJpdmF0ZToKKworICBkb3VibGUgbV9zdG9wX3RpbWUsIG1fc3RhcnRfdGltZTsKKworfTsgLy8gUG9ydGFibGVfVGltZXIgKEFwcGxlKQorCisjZWxzZQorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKworY2xhc3MgUG9ydGFibGVfVGltZXIKK3sKKyBwdWJsaWM6CisKKyAgUG9ydGFibGVfVGltZXIoKQorICB7CisgICAgbV9jbGtpZCA9IEJ0bENvbmZpZzo6SW5zdGFuY2UucmVhbGNsb2NrID8gQ0xPQ0tfUkVBTFRJTUUgOiBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ7CisgIH0KKworICBQb3J0YWJsZV9UaW1lcihpbnQgY2xraWQpIDogbV9jbGtpZChjbGtpZCkKKyAge30KKworICB2b2lkIHN0YXJ0KCkKKyAgeworICAgIHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUobV9jbGtpZCwgJnRzKTsKKyAgICBtX3N0YXJ0X3RpbWUgPSBkb3VibGUodHMudHZfc2VjKSArIDFlLTkgKiBkb3VibGUodHMudHZfbnNlYyk7CisKKyAgfQorCisgIHZvaWQgc3RvcCgpCisgIHsKKyAgICB0aW1lc3BlYyB0czsKKyAgICBjbG9ja19nZXR0aW1lKG1fY2xraWQsICZ0cyk7CisgICAgbV9zdG9wX3RpbWUgPSBkb3VibGUodHMudHZfc2VjKSArIDFlLTkgKiBkb3VibGUodHMudHZfbnNlYyk7CisKKyAgfQorCisgIGRvdWJsZSBlbGFwc2VkKCkKKyAgeworICAgIHJldHVybiAgdXNlcl90aW1lKCk7CisgIH0KKworICBkb3VibGUgdXNlcl90aW1lKCkKKyAgeworICAgIHJldHVybiBtX3N0b3BfdGltZSAtIG1fc3RhcnRfdGltZTsKKyAgfQorCisKK3ByaXZhdGU6CisKKyAgaW50IG1fY2xraWQ7CisgIGRvdWJsZSBtX3N0b3BfdGltZSwgbV9zdGFydF90aW1lOworCit9OyAvLyBQb3J0YWJsZV9UaW1lciAoTGludXgpCisKKyNlbmRpZgorCisjZW5kaWYgIC8vIFBPUlRBQkxFX1RJTUVSX0hQUApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWEyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICB4ODZfcGVyZl9hbmFseXplci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk77+9YyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIF9YODZfUEVSRl9BTkFMWVNFUl9ISAorI2RlZmluZSBfWDg2X1BFUkZfQU5BTFlTRVJfSEgKKworI2luY2x1ZGUgIng4Nl90aW1lci5oaCIKKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisKK3RlbXBsYXRlPGNsYXNzIEFDVElPTj4KK2NsYXNzIFg4Nl9QZXJmX0FuYWx5emVyeworcHVibGljOgorICBYODZfUGVyZl9BbmFseXplciggdW5zaWduZWQgbG9uZyBsb25nIG5iX3NhbXBsZT1ERUZBVUxUX05CX1NBTVBMRSk6X25iX3NhbXBsZShuYl9zYW1wbGUpLF9jaHJvbm9zKCkKKyAgeworICAgIE1FU1NBR0UoIlg4Nl9QZXJmX0FuYWx5emVyIEN0b3IiKTsKKyAgICBfY2hyb25vcy5maW5kX2ZyZXF1ZW5jeSgpOworICB9OworICBYODZfUGVyZl9BbmFseXplciggY29uc3QgWDg2X1BlcmZfQW5hbHl6ZXIgJiApeworICAgIElORk9TKCJDb3B5IEN0b3Igbm90IGltcGxlbWVudGVkIik7CisgICAgZXhpdCgwKTsKKyAgfTsKKyAgflg4Nl9QZXJmX0FuYWx5emVyKCB2b2lkICl7CisgICAgTUVTU0FHRSgiWDg2X1BlcmZfQW5hbHl6ZXIgRHRvciIpOworICB9OworCisKKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKKyAgeworCisgICAgQUNUSU9OIGFjdGlvbihzaXplKTsKKworICAgIGludCBuYl9sb29wPTU7CisgICAgZG91YmxlIGNhbGN1bGF0ZV90aW1lPTAuMDsKKyAgICBkb3VibGUgYmFzZWxpbmVfdGltZT0wLjA7CisKKyAgICBmb3IgKGludCBqPTAgOyBqIDwgbmJfbG9vcCA7IGorKyl7CisKKyAgICAgIF9jaHJvbm9zLmNsZWFyKCk7CisKKyAgICAgIGZvcihpbnQgaT0wIDsgaSA8IF9uYl9zYW1wbGUgIDsgaSsrKQorICAgICAgeworICAgICAgICBfY2hyb25vcy5zdGFydCgpOworICAgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgICBhY3Rpb24uY2FsY3VsYXRlKCk7CisgICAgICAgIF9jaHJvbm9zLnN0b3AoKTsKKyAgICAgICAgX2Nocm9ub3MuYWRkX2dldF9jbGljaygpOworICAgICAgfQorCisgICAgICBjYWxjdWxhdGVfdGltZSArPSBkb3VibGUoX2Nocm9ub3MuZ2V0X3Nob3J0ZXN0X2NsaWNrcygpKS9fY2hyb25vcy5mcmVxdWVuY3koKTsKKworICAgICAgaWYgKGo9PTApIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKKworICAgICAgX2Nocm9ub3MuY2xlYXIoKTsKKworICAgICAgZm9yKGludCBpPTAgOyBpIDwgX25iX3NhbXBsZSAgOyBpKyspCisgICAgICB7CisgICAgICAgIF9jaHJvbm9zLnN0YXJ0KCk7CisgICAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgICAgIF9jaHJvbm9zLnN0b3AoKTsKKyAgICAgICAgX2Nocm9ub3MuYWRkX2dldF9jbGljaygpOworCisgICAgICB9CisKKyAgICAgIGJhc2VsaW5lX3RpbWUrPWRvdWJsZShfY2hyb25vcy5nZXRfc2hvcnRlc3RfY2xpY2tzKCkpL19jaHJvbm9zLmZyZXF1ZW5jeSgpOworCisgICAgfQorCisgICAgZG91YmxlIGNvcnJlY3RlZF90aW1lID0gKGNhbGN1bGF0ZV90aW1lLWJhc2VsaW5lX3RpbWUpL2RvdWJsZShuYl9sb29wKTsKKworCisvLyAgICAgSU5GT1MoIl9uYl9zYW1wbGU9Ijw8X25iX3NhbXBsZSk7CisvLyAgICAgSU5GT1MoImJhc2VsaW5lX3RpbWU9Ijw8YmFzZWxpbmVfdGltZSk7CisvLyAgICAgSU5GT1MoImNhbGN1bGF0ZV90aW1lPSI8PGNhbGN1bGF0ZV90aW1lKTsKKy8vICAgICBJTkZPUygiY29ycmVjdGVkX3RpbWU9Ijw8Y29ycmVjdGVkX3RpbWUpOworCisvLyAgICBjb3V0IDw8IHNpemUgPDwiICI8PGJhc2VsaW5lX3RpbWU8PCIgIjw8Y2FsY3VsYXRlX3RpbWU8PCIgIjw8Y29ycmVjdGVkX3RpbWU8PCIgIjw8YWN0aW9uLm5iX29wX2Jhc2UoKSA8PCBlbmRsOworCisgICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKGNvcnJlY3RlZF90aW1lKjEwMDAwMDAuMCk7CisgICAgLy9yZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8oY2FsY3VsYXRlX3RpbWUqMTAwMDAwMC4wKTsKKyAgfQorCitwcml2YXRlOgorCisgIFg4Nl9UaW1lciBfY2hyb25vczsKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9zYW1wbGU7CisKKworfTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiNWVlOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGgKQEAgLTAsMCArMSwyNDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICB4ODZfdGltZXIuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk77+9YyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIF9YODZfVElNRVJfSEgKKyNkZWZpbmUgX1g4Nl9USU1FUl9ISAorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKy8vI2luY2x1ZGUgInN5c3RlbV90aW1lLmgiCisjZGVmaW5lIHUzMiB1bnNpZ25lZCBpbnQKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvLyBmcmVxdWVuY2UgZGUgbGEgYmVjYW5uZSBlbiBIegorLy8jZGVmaW5lIEZSRVFVRU5DWSA2NDgwMDAwMDAKKy8vI2RlZmluZSBGUkVRVUVOQ1kgMTQwMDAwMDAwMAorI2RlZmluZSBGUkVRVUVOQ1kgMTY5NTAwMDAwMAorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK2NsYXNzIFg4Nl9UaW1lciB7CisKK3B1YmxpYyA6CisKKyAgWDg2X1RpbWVyKCB2b2lkICk6X2ZyZXF1ZW5jeShGUkVRVUVOQ1kpLF9uYl9zYW1wbGUoMCkKKyAgeworICAgIE1FU1NBR0UoIlg4Nl9UaW1lciBEZWZhdWx0IEN0b3IiKTsgICAgCisgIH0KKworICBpbmxpbmUgdm9pZCBzdGFydCggdm9pZCApeworCisgICAgcmR0c2MoX2NsaWNrX3N0YXJ0Lm4zMlswXSxfY2xpY2tfc3RhcnQubjMyWzFdKTsKKworICB9CisKKworICBpbmxpbmUgdm9pZCBzdG9wKCB2b2lkICl7CisKKyAgICByZHRzYyhfY2xpY2tfc3RvcC5uMzJbMF0sX2NsaWNrX3N0b3AubjMyWzFdKTsKKworICB9CisgIAorCisgIGlubGluZSBkb3VibGUgZnJlcXVlbmN5KCB2b2lkICl7CisgICAgcmV0dXJuIF9mcmVxdWVuY3k7CisgIH0KKworICBkb3VibGUgZ2V0X2VsYXBzZWRfdGltZV9pbl9zZWNvbmQoIHZvaWQgKXsKKworICAgIHJldHVybiAoX2NsaWNrX3N0b3AubjY0LV9jbGlja19zdGFydC5uNjQpL2RvdWJsZShGUkVRVUVOQ1kpOworCisKKyAgfSAgICAKKworICB1bnNpZ25lZCBsb25nIGxvbmcgIGdldF9jbGljayggdm9pZCApeworICAgIAorICAgIHJldHVybiAoX2NsaWNrX3N0b3AubjY0LV9jbGlja19zdGFydC5uNjQpOworCisgIH0gICAgCisKKyAgaW5saW5lIHZvaWQgZmluZF9mcmVxdWVuY3koIHZvaWQgKXsKKworICAgIHRpbWVfdCBpbml0aWFsLCBmaW5hbDsKKyAgICBpbnQgZHVtbXk9MjsKKworICAgIGluaXRpYWwgPSB0aW1lKDApOworICAgIHN0YXJ0KCk7CisgICAgZG8geworICAgICAgZHVtbXkrPTI7CisgICAgfQorICAgIHdoaWxlKHRpbWUoMCk9PWluaXRpYWwpOworICAgIC8vIE9uIGVzdCBhdSBkZWJ1dCBkJ3VuIGN5Y2xlIGQndW5lIHNlY29uZGUgISEhCisgICAgaW5pdGlhbCA9IHRpbWUoMCk7CisgICAgc3RhcnQoKTsKKyAgICBkbyB7CisgICAgICBkdW1teSs9MjsKKyAgICB9CisgICAgd2hpbGUodGltZSgwKT09aW5pdGlhbCk7CisgICAgZmluYWw9dGltZSgwKTsKKyAgICBzdG9wKCk7CisgICAgLy8gICAgSU5GT1MoImZpbmUgZ3JhaW5lZCB0aW1lIDogIjw8ICBnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpKTsKKyAgICAvLyAgSU5GT1MoImNvYXJzZSBncmFpbmVkIHRpbWUgOiAiPDwgIGZpbmFsLWluaXRpYWwpOworICAgIF9mcmVxdWVuY3k9X2ZyZXF1ZW5jeSpnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpL2RvdWJsZShmaW5hbC1pbml0aWFsKTsKKyAgICAvLy8gIElORk9TKCJDUFUgZnJlcXVlbmN5IDogIjw8ICBfZnJlcXVlbmN5KTsgICAgICAgIAorCisgIH0KKworICB2b2lkICBhZGRfZ2V0X2NsaWNrKCB2b2lkICl7CisgICAgICAgCisgICAgX25iX3NhbXBsZSsrOworICAgIF9jb3VudGVkX2NsaWNrc1tnZXRfY2xpY2soKV0rKzsKKyAgICBmaWxsX2hpc3RvcnlfY2xpY2tzKCk7CisKKyAgfSAgICAKKworICB2b2lkIGR1bXBfc3RhdGlzdGljcyhzdHJpbmcgZmlsZW1hbmUpeworICAgIAorICAgIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVtYW5lLmNfc3RyKCksaW9zOjpvdXQpIDsKKworICAgIHN0ZDo6bWFwPHVuc2lnbmVkIGxvbmcgbG9uZyAsIHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKKyAgICBmb3IoaXRyPV9jb3VudGVkX2NsaWNrcy5iZWdpbigpIDsgaXRyIT1fY291bnRlZF9jbGlja3MuZW5kKCkgIDsgaXRyKyspCisgICAgICB7ICAgICAgCisgICAgICBvdXRmaWxlICA8PCAoKml0cikuZmlyc3QgPDwgIiAgIiA8PCAoKml0cikuc2Vjb25kIDw8IGVuZGwgOyAgICAgICAKKyAgICAgIH0gICAgICAKKyAgICAKKyAgICBvdXRmaWxlLmNsb3NlKCk7CisKKyAgfQorCisgIHZvaWQgZHVtcF9oaXN0b3J5KHN0cmluZyBmaWxlbWFuZSl7CisgICAgCisgICAgb2ZzdHJlYW0gb3V0ZmlsZSAoZmlsZW1hbmUuY19zdHIoKSxpb3M6Om91dCkgOworCisKKworICAgIGZvcihpbnQgaT0wIDsgaTxfaGlzdG9yeV9tZWFuX2NsaWNrcy5zaXplKCkgOyBpKyspCisgICAgICB7ICAgICAgCisJb3V0ZmlsZSAgPDwgaSA8PCAiICIgCisJCSA8PCBfaGlzdG9yeV9tZWFuX2NsaWNrc1tpXSA8PCAiICIgCisJCSA8PCBfaGlzdG9yeV9zaG9ydGVzdF9jbGlja3NbaV0gPDwgIiAiIAorCQkgPDwgX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrc1tpXSA8PCBlbmRsIDsKKyAgICAgIH0gICAgICAKKyAgICAKKyAgICBvdXRmaWxlLmNsb3NlKCk7CisKKyAgfQorICAgICAKKworCisgIGRvdWJsZSBnZXRfbWVhbl9jbGlja3MoIHZvaWQgKXsKKyAgICAKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOworICAgIAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtZWFuX2NsaWNrcz0wOworCisgICAgZm9yKGl0cj1fY291bnRlZF9jbGlja3MuYmVnaW4oKSA7IGl0ciE9X2NvdW50ZWRfY2xpY2tzLmVuZCgpICA7IGl0cisrKQorICAgICAgeyAgICAgIAorCQorCW1lYW5fY2xpY2tzKz0oKml0cikuc2Vjb25kKigqaXRyKS5maXJzdDsKKyAgICAgIH0gICAgICAKKworICAgIHJldHVybiBtZWFuX2NsaWNrcy9kb3VibGUoX25iX3NhbXBsZSk7CisKKyAgfQorCisgIGRvdWJsZSBnZXRfc2hvcnRlc3RfY2xpY2tzKCB2b2lkICl7CisgICAgCisgICAgcmV0dXJuIGRvdWJsZSgoKl9jb3VudGVkX2NsaWNrcy5iZWdpbigpKS5maXJzdCk7CisKKyAgfQorCisgIHZvaWQgZmlsbF9oaXN0b3J5X2NsaWNrcyggdm9pZCApeworCisgICAgX2hpc3RvcnlfbWVhbl9jbGlja3MucHVzaF9iYWNrKGdldF9tZWFuX2NsaWNrcygpKTsKKyAgICBfaGlzdG9yeV9zaG9ydGVzdF9jbGlja3MucHVzaF9iYWNrKGdldF9zaG9ydGVzdF9jbGlja3MoKSk7CisgICAgX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrcy5wdXNoX2JhY2soZ2V0X21vc3Rfb2NjdXJlZF9jbGlja3MoKSk7CisKKyAgfQorCisKKyAgZG91YmxlIGdldF9tb3N0X29jY3VyZWRfY2xpY2tzKCB2b2lkICl7CisKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbW9jPTA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG1heF9vY2N1cmVuY2U9MDsKKworICAgIHN0ZDo6bWFwPHVuc2lnbmVkIGxvbmcgbG9uZyx1bnNpZ25lZCBsb25nIGxvbmc+OjppdGVyYXRvciBpdHI7CisKKyAgICBmb3IoaXRyPV9jb3VudGVkX2NsaWNrcy5iZWdpbigpIDsgaXRyIT1fY291bnRlZF9jbGlja3MuZW5kKCkgIDsgaXRyKyspCisgICAgICB7ICAgICAgCisJCisJaWYgKG1heF9vY2N1cmVuY2U8PSgqaXRyKS5zZWNvbmQpeworCSAgbWF4X29jY3VyZW5jZT0oKml0cikuc2Vjb25kOworCSAgbW9jPSgqaXRyKS5maXJzdDsKKwl9CisgICAgICB9ICAgICAgCisgICAgCisgICAgcmV0dXJuIGRvdWJsZShtb2MpOyAgICAKKworICB9CisgIAorICB2b2lkIGNsZWFyKCB2b2lkICkKKyAgeworICAgIF9jb3VudGVkX2NsaWNrcy5jbGVhcigpOworCisgICAgX2hpc3RvcnlfbWVhbl9jbGlja3MuY2xlYXIoKTsKKyAgICBfaGlzdG9yeV9zaG9ydGVzdF9jbGlja3MuY2xlYXIoKTsKKyAgICBfaGlzdG9yeV9tb3N0X29jY3VyZWRfY2xpY2tzLmNsZWFyKCk7CisKKyAgICBfbmJfc2FtcGxlPTA7CisgIH0KKworCisgICAgCitwcml2YXRlIDoKKyAgCisgIHVuaW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBuMzJbMl0gOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBuNjQgOworICB9IF9jbGlja19zdGFydDsKKworICB1bmlvbgorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgbjMyWzJdIDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjY0IDsKKyAgfSBfY2xpY2tfc3RvcDsKKworICBkb3VibGUgX2ZyZXF1ZW5jeSA7CisKKyAgbWFwPHVuc2lnbmVkIGxvbmcgbG9uZyx1bnNpZ25lZCBsb25nIGxvbmc+IF9jb3VudGVkX2NsaWNrczsKKworICB2ZWN0b3I8ZG91YmxlPiBfaGlzdG9yeV9tZWFuX2NsaWNrczsKKyAgdmVjdG9yPGRvdWJsZT4gX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzOworICB2ZWN0b3I8ZG91YmxlPiBfaGlzdG9yeV9tb3N0X29jY3VyZWRfY2xpY2tzOworCisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfc2FtcGxlOworCisgIAorCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9saW5fbG9nLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9saW5fbG9nLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzlmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xpbl9sb2cuaGgKQEAgLTAsMCArMSw3MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHNpemVfbGluX2xvZy5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM3IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIFNJWkVfTElOX0xPRworI2RlZmluZSBTSVpFX0xJTl9MT0cKKworI2luY2x1ZGUgInNpemVfbG9nLmhoIgorCit0ZW1wbGF0ZTxjbGFzcyBWZWN0b3I+Cit2b2lkIHNpemVfbGluX2xvZyhjb25zdCBpbnQgbmJfcG9pbnQsIGNvbnN0IGludCAvKnNpemVfbWluKi8sIGNvbnN0IGludCBzaXplX21heCwgVmVjdG9yICYgWCkKK3sKKyAgaW50IHRlbj0xMDsKKyAgaW50IG5pbmU9OTsKKworICBYLnJlc2l6ZShuYl9wb2ludCk7CisKKyAgaWYgKG5iX3BvaW50PnRlbil7CisKKyAgICBmb3IgKGludCBpPTA7aTxuaW5lO2krKyl7CisgICAgICAKKyAgICAgIFhbaV09aSsxOworCisgICAgfQorCisgICAgVmVjdG9yIGxvZ19zaXplOworICAgIHNpemVfbG9nKG5iX3BvaW50LW5pbmUsdGVuLHNpemVfbWF4LGxvZ19zaXplKTsKKworICAgIGZvciAoaW50IGk9MDtpPG5iX3BvaW50LW5pbmU7aSsrKXsKKyAgICAgIAorICAgICAgWFtpK25pbmVdPWxvZ19zaXplW2ldOworCisgICAgfQorICB9CisgIGVsc2V7CisKKyAgICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspeworICAgICAgCisgICAgICBYW2ldPWkrMTsKKworICAgIH0KKyAgfQorCisgLy8gIGZvciAoaW50IGk9MDtpPG5iX3BvaW50O2krKyl7CisgICAgCisvLyAgICAgICAgSU5GT1MoImNvbXB1dGVkIHNpemVzIDogWFsiPDxpPDwiXT0iPDxYW2ldKTsKKyAgICAKKy8vICAgfQorCit9CisgIAorI2VuZGlmCisgICAgCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9sb2cuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xvZy5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EzZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9sb2cuaGgKQEAgLTAsMCArMSw1NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHNpemVfbG9nLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE3IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBTSVpFX0xPRworI2RlZmluZSBTSVpFX0xPRworCisjaW5jbHVkZSAibWF0aC5oIgorLy8gVGhlIFZlY3RvciBjbGFzcyBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIFNUTCB2ZWN0b3IgY29uY2VwdCA6CisvLyAgICAgICAgICAgIHJlc2l6ZSgpIG1ldGhvZAorLy8gICAgICAgICAgICBbXSBvcGVyYXRvciBmb3Igc2V0aW5nIGVsZW1lbnQKKy8vIHRoZSB2ZWN0b3IgZWxlbWVudCBhcmUgaW50IGNvbXBhdGlibGUuCit0ZW1wbGF0ZTxjbGFzcyBWZWN0b3I+Cit2b2lkIHNpemVfbG9nKGNvbnN0IGludCBuYl9wb2ludCwgY29uc3QgaW50IHNpemVfbWluLCBjb25zdCBpbnQgc2l6ZV9tYXgsIFZlY3RvciAmIFgpCit7CisgIFgucmVzaXplKG5iX3BvaW50KTsKKworICBmbG9hdCBsc19taW49bG9nKGZsb2F0KHNpemVfbWluKSk7CisgIGZsb2F0IGxzX21heD1sb2coZmxvYXQoc2l6ZV9tYXgpKTsKKworICBmbG9hdCBscz0wLjA7CisKKyAgZmxvYXQgZGVsdGFfbHM9KGxzX21heC1sc19taW4pLyhmbG9hdChuYl9wb2ludC0xKSk7CisKKyAgaW50IHNpemU9MDsKKworICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspeworCisgICAgbHMgPSBsc19taW4gKyBmbG9hdChpKSpkZWx0YV9scyA7CisgICAgCisgICAgc2l6ZT1pbnQoZXhwKGxzKSk7IAorCisgICAgWFtpXT1zaXplOworICB9CisKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3V0aWxpdGllcy5oIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvdXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzMzBkMAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3V0aWxpdGllcy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICAgICA6IHV0aWxpdGllcy5oCisvLyBDcmVhdGVkICAgOiBtYXIganVuIDE5IDEzOjE4OjE0IENFU1QgMjAwMQorLy8gQXV0aG9yICAgIDogQW50b2luZSBZRVNTQVlBTiwgUGF1bCBSQVNDTEUsIEVERgorLy8gUHJvamVjdCAgIDogU0FMT01FCisvLyBDb3B5cmlnaHQgOiBFREYgMjAwMQorLy8gJEhlYWRlciQKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyogLS0tICBEZWZpbml0aW9uIG1hY3JvcyBmaWxlIHRvIHByaW50IGluZm9ybWF0aW9uIGlmIF9ERUJVR18gaXMgZGVmaW5lZCAtLS0gKi8KKworIyBpZm5kZWYgVVRJTElUSUVTX0gKKyMgZGVmaW5lIFVUSUxJVElFU19ICisKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisvLyMgaW5jbHVkZSA8aW9zdHJlYW0+IG9rIGZvciBnY2MzLjAxCisjIGluY2x1ZGUgPGlvc3RyZWFtPgorCisvKiAtLS0gIElORk9TIGlzIGFsd2F5cyBkZWZpbmVkICh3aXRob3V0IF9ERUJVR18pOiB0byBiZSB1c2VkIGZvciB3YXJuaW5ncywgd2l0aCByZWxlYXNlIHZlcnNpb24gLS0tICovCisKKyMgZGVmaW5lIEhFUkVXRUFSRSBjb3V0PDxmbHVzaCA7IGNlcnIgPDwgX19GSUxFX18gPDwgIiBbIiA8PCBfX0xJTkVfXyA8PCAiXSA6ICIgPDwgZmx1c2ggOworIyBkZWZpbmUgSU5GT1MoY2hhaW4pIHtIRVJFV0VBUkUgOyBjZXJyIDw8IGNoYWluIDw8IGVuZGwgO30KKyMgZGVmaW5lIFBZU0NSSVBUKGNoYWluKSB7Y291dDw8Zmx1c2ggOyBjZXJyIDw8ICItLS1QWVNDUklQVC0tLSAiIDw8IGNoYWluIDw8IGVuZGwgO30KKworLyogLS0tIFRvIHByaW50IGRhdGUgYW5kIHRpbWUgb2YgY29tcGlsYXRpb24gb2YgY3VycmVudCBzb3VyY2Ugb24gc3Rkb3V0IC0tLSAqLworCisjIGlmIGRlZmluZWQgKCBfX0dOVUNfXyApCisjIGRlZmluZSBDT01QSUxFUgkJImcrKyIgOworIyBlbGlmIGRlZmluZWQgKCBfX3N1biApCisjIGRlZmluZSBDT01QSUxFUgkJIkNDIiA7CisjIGVsaWYgZGVmaW5lZCAoIF9fS0NDICkKKyMgZGVmaW5lIENPTVBJTEVSCQkiS0NDIiA7CisjIGVsaWYgZGVmaW5lZCAoIF9fUEdJICkKKyMgZGVmaW5lIENPTVBJTEVSCQkicGdDQyIgOworIyBlbHNlCisjIGRlZmluZSBDT01QSUxFUgkJInVuZGVmaW5lZCIgOworIyBlbmRpZgorCisjIGlmZGVmIElORk9TX0NPTVBJTEFUSU9OCisjIGVycm9yIElORk9TX0NPTVBJTEFUSU9OIGFscmVhZHkgZGVmaW5lZAorIyBlbmRpZgorIyBkZWZpbmUgSU5GT1NfQ09NUElMQVRJT04Je1wKKwkJCQkJY2VyciA8PCBmbHVzaDtcCisJCQkJCWNvdXQgPDwgX19GSUxFX18gO1wKKwkJCQkJY291dCA8PCAiIFsiIDw8IF9fTElORV9fIDw8ICJdIDogIiA7XAorCQkJCQljb3V0IDw8ICJDT01QSUxFRCB3aXRoICIgPDwgQ09NUElMRVIgO1wKKwkJCQkJY291dCA8PCAiLCAiIDw8IF9fREFURV9fIDsgXAorCQkJCQljb3V0IDw8ICIgYXQgIiA8PCBfX1RJTUVfXyA8PCBlbmRsIDtcCisJCQkJCWNvdXQgPDwgIlxuXG4iIDtcCisJCQkJCWNvdXQgPDwgZmx1c2ggO1wKKwkJCQl9CisKKyMgaWZkZWYgX0RFQlVHXworCisvKiAtLS0gdGhlIGZvbGxvd2luZyBNQUNST1MgYXJlIHVzZWZ1bCBhdCBkZWJ1ZyB0aW1lIC0tLSAqLworCisjIGRlZmluZSBIRVJFIGNvdXQ8PGZsdXNoIDsgY2VyciA8PCAiLSBUcmFjZSAiIDw8IF9fRklMRV9fIDw8ICIgWyIgPDwgX19MSU5FX18gPDwgIl0gOiAiIDw8IGZsdXNoIDsKKyMgZGVmaW5lIFNDUlVURSh2YXIpIEhFUkUgOyBjZXJyIDw8ICN2YXIgPDwgIj0iIDw8IHZhciA8PCBlbmRsIDsKKyMgZGVmaW5lIE1FU1NBR0UoY2hhaW4pIHtIRVJFIDsgY2VyciA8PCBjaGFpbiA8PCBlbmRsIDt9CisjIGRlZmluZSBJTlRFUlJVUFRJT04oY29kZSkgSEVSRSA7IGNlcnIgPDwgIklOVEVSUlVQVElPTiByZXR1cm4gY29kZT0gIiA8PCBjb2RlIDw8IGVuZGwgOyBleGl0KGNvZGUpIDsKKworIyBpZm5kZWYgQVNTRVJUCisjIGRlZmluZSBBU1NFUlQoY29uZGl0aW9uKSBpZiAoIShjb25kaXRpb24pKXsgSEVSRSA7IGNlcnIgPDwgIkNPTkRJVElPTiAiIDw8ICNjb25kaXRpb24gPDwgIiBOT1QgVkVSSUZJRUQiPDwgZW5kbCA7IElOVEVSUlVQVElPTigxKSA7fQorIyBlbmRpZiAvKiBBU1NFUlQgKi8KKworI2RlZmluZSBSRVBFUkUgY291dDw8Zmx1c2ggOyBjZXJyIDw8ICIgICAtLS0tLS0tLS0tLS0tLSIgPDwgZW5kbCA8PCBmbHVzaCA7CisjZGVmaW5lIEJFR0lOX09GKGNoYWluKSB7UkVQRVJFIDsgSEVSRSA7IGNlcnIgPDwgIkJlZ2luIG9mOiAiIDw8IGNoYWluIDw8IGVuZGwgOyBSRVBFUkUgOyB9CisjZGVmaW5lIEVORF9PRihjaGFpbikge1JFUEVSRSA7IEhFUkUgOyBjZXJyIDw8ICJOb3JtYWwgZW5kIG9mOiAiIDw8IGNoYWluIDw8IGVuZGwgOyBSRVBFUkUgOyB9CisKKworCisjIGVsc2UgLyogaWZkZWYgX0RFQlVHXyovCisKKyMgZGVmaW5lIEhFUkUKKyMgZGVmaW5lIFNDUlVURSh2YXIpCisjIGRlZmluZSBNRVNTQUdFKGNoYWluKQorIyBkZWZpbmUgSU5URVJSVVBUSU9OKGNvZGUpCisKKyMgaWZuZGVmIEFTU0VSVAorIyBkZWZpbmUgQVNTRVJUKGNvbmRpdGlvbikKKyMgZW5kaWYgLyogQVNTRVJUICovCisKKyNkZWZpbmUgUkVQRVJFCisjZGVmaW5lIEJFR0lOX09GKGNoYWluKQorI2RlZmluZSBFTkRfT0YoY2hhaW4pCisKKworIyBlbmRpZiAvKiBpZmRlZiBfREVCVUdfKi8KKworIyBlbmRpZiAvKiBpZm5kZWYgVVRJTElUSUVTX0ggKi8KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3h5X2ZpbGUuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy94eV9maWxlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzFiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy94eV9maWxlLmhoCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBkdW1wX2ZpbGVfeF95LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjIwIENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBYWV9GSUxFX0hICisjZGVmaW5lIFhZX0ZJTEVfSEgKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitib29sIHJlYWRfeHlfZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVuYW1lLCBzdGQ6OnZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIGJvb2wgcXVpZXQgPSBmYWxzZSkKK3sKKworICBzdGQ6Omlmc3RyZWFtIGlucHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksc3RkOjppb3M6OmluKTsKKworICBpZiAoIWlucHV0X2ZpbGUpeworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiPDxmaWxlbmFtZSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCBuYl9wb2ludD0wOworICBpbnQgc2l6ZT0wOworICBkb3VibGUgbWZsb3BzPTA7CisKKyAgd2hpbGUgKGlucHV0X2ZpbGUgPj4gc2l6ZSA+PiBtZmxvcHMgKXsKKyAgICBuYl9wb2ludCsrOworICAgIHRhYl9zaXplcy5wdXNoX2JhY2soc2l6ZSk7CisgICAgdGFiX21mbG9wcy5wdXNoX2JhY2sobWZsb3BzKTsKKyAgfQorICBTQ1JVVEUobmJfcG9pbnQpOworCisgIGlucHV0X2ZpbGUuY2xvc2UoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZSBWZWN0b3IgY2xhc3MgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgcGFydCBvZiBTVEwgdmVjdG9yIGNvbmNlcHQgOgorLy8gICAgICAgICAgICByZXNpemUoKSBtZXRob2QKKy8vICAgICAgICAgICAgW10gb3BlcmF0b3IgZm9yIHNldGluZyBlbGVtZW50CisvLyB0aGUgdmVjdG9yIGVsZW1lbnQgbXVzdCBoYXZlIHRoZSA8PCBvcGVyYXRvciBkZWZpbmUKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgVmVjdG9yX0EsIGNsYXNzIFZlY3Rvcl9CPgordm9pZCBkdW1wX3h5X2ZpbGUoY29uc3QgVmVjdG9yX0EgJiBYLCBjb25zdCBWZWN0b3JfQiAmIFksIGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZW5hbWUpeworICAKKyAgb2ZzdHJlYW0gb3V0ZmlsZSAoZmlsZW5hbWUuY19zdHIoKSxpb3M6Om91dCkgOworICBpbnQgc2l6ZT1YLnNpemUoKTsKKyAgCisgIGZvciAoaW50IGk9MDtpPHNpemU7aSsrKQorICAgIG91dGZpbGUgPDwgWFtpXSA8PCAiICIgPDwgWVtpXSA8PCBlbmRsOworCisgIG91dGZpbGUuY2xvc2UoKTsKK30gCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3MmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL0JMQVMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0NyBAQAorCitmaW5kX3BhY2thZ2UoQVRMQVMpCitpZiAoQVRMQVNfRk9VTkQpCisgIGJ0bF9hZGRfYmVuY2goYnRsX2F0bGFzIG1haW4uY3BwKQorICBpZihCVUlMRF9idGxfYXRsYXMpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9hdGxhcyAke0FUTEFTX0xJQlJBUklFU30pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ0bF9hdGxhcyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1EQ0JMQVNOQU1FPUFUTEFTIC1ESEFTX0xBUEFDSz0xIikKKyAgZW5kaWYoQlVJTERfYnRsX2F0bGFzKQorZW5kaWYgKEFUTEFTX0ZPVU5EKQorCitmaW5kX3BhY2thZ2UoTUtMKQoraWYgKE1LTF9GT1VORCkKKyAgYnRsX2FkZF9iZW5jaChidGxfbWtsIG1haW4uY3BwKQorICBpZihCVUlMRF9idGxfbWtsKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfbWtsICR7TUtMX0xJQlJBUklFU30pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ0bF9ta2wgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1JTlRFTF9NS0wgLURIQVNfTEFQQUNLPTEiKQorICBlbmRpZihCVUlMRF9idGxfbWtsKQorZW5kaWYgKE1LTF9GT1VORCkKKworCitmaW5kX3BhY2thZ2UoT1BFTkJMQVMpCitpZiAoT1BFTkJMQVNfRk9VTkQpCisgIGJ0bF9hZGRfYmVuY2goYnRsX29wZW5ibGFzIG1haW4uY3BwKQorICBpZihCVUlMRF9idGxfb3BlbmJsYXMpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9vcGVuYmxhcyAke09QRU5CTEFTX0xJQlJBUklFU30gKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidGxfb3BlbmJsYXMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1PUEVOQkxBUyIpCisgIGVuZGlmKEJVSUxEX2J0bF9vcGVuYmxhcykKK2VuZGlmIChPUEVOQkxBU19GT1VORCkKKworZmluZF9wYWNrYWdlKEFDTUwpCitpZiAoQUNNTF9GT1VORCkKKyAgYnRsX2FkZF9iZW5jaChidGxfYWNtbCBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2FjbWwpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9hY21sICR7QUNNTF9MSUJSQVJJRVN9ICkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoYnRsX2FjbWwgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1BQ01MIC1ESEFTX0xBUEFDSz0xIikKKyAgZW5kaWYoQlVJTERfYnRsX2FjbWwpCitlbmRpZiAoQUNNTF9GT1VORCkKKworaWYoRWlnZW5fU09VUkNFX0RJUiBBTkQgQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKyAgIyB3ZSBhcmUgaW5zaWRlIEVpZ2VuIGFuZCBibGFzL2xhcGFjayBpbnRlcmZhY2UgaXMgY29tcGlsYWJsZQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7RWlnZW5fU09VUkNFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuYmxhcyBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2VpZ2VuYmxhcykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnRsX2VpZ2VuYmxhcyBlaWdlbl9ibGFzIGVpZ2VuX2xhcGFjayApCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ0bF9laWdlbmJsYXMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1FaWdlbkJMQVMiKQorICBlbmRpZigpCitlbmRpZigpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjNhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaApAQCAtMCwwICsxLDY3NSBAQAorI2lmbmRlZiBCTEFTX0gKKyNkZWZpbmUgQkxBU19ICisKKyNkZWZpbmUgQkxBU0ZVTkMoRlVOQykgRlVOQyMjXworCisjaWZkZWYgX19XSU42NF9fCit0eXBlZGVmIGxvbmcgbG9uZyBCTEFTTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJMQVNVTE9ORzsKKyNlbHNlCit0eXBlZGVmIGxvbmcgQkxBU0xPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQkxBU1VMT05HOworI2VuZGlmCisKK2ludCAgICBCTEFTRlVOQyh4ZXJibGEpKGNvbnN0IGNoYXIgKiwgaW50ICppbmZvLCBpbnQpOworCitmbG9hdCAgQkxBU0ZVTkMoc2RvdCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNkc2RvdCkoaW50ICosIGZsb2F0ICAqLCAgICAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworCitkb3VibGUgQkxBU0ZVTkMoZHNkb3QpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRkb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxZG90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKKyNpZiBkZWZpbmVkKEZfSU5URVJGQUNFX0dGT1JUKSAmJiAhZGVmaW5lZChfXzY0QklUX18pCitpbnQgICBCTEFTRlVOQyhjZG90dSkgIChpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7CitpbnQgICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosICBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh6ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoemRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3ZvaWQgIEJMQVNGVU5DKHhkb3R1KSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh4ZG90YykgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOworI2VsaWYgIGRlZmluZWQoRl9JTlRFUkZBQ0VfRjJDKSB8fCBcCisgICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfUEdJKSB8fCBcCisgICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfR0ZPUlQpIHx8IFwKKyAgICAoZGVmaW5lZChGX0lOVEVSRkFDRV9QQVRIU0NBTEUpICYmIGRlZmluZWQoX182NEJJVF9fKSkKK3ZvaWQgIEJMQVNGVU5DKGNkb3R1KSAgKGZsb2F0ICosICBpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyhjZG90YykgIChmbG9hdCAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoemRvdHUpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3ZvaWQgIEJMQVNGVU5DKHpkb3RjKSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh4ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoeGRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKKyNlbHNlCitzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICAgQkxBU0ZVTkMoY2RvdHUpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK3N0ZDo6Y29tcGxleDxmbG9hdD4gICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworc3RkOjpjb21wbGV4PGRvdWJsZT4gIEJMQVNGVU5DKHpkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3N0ZDo6Y29tcGxleDxkb3VibGU+ICBCTEFTRlVOQyh6ZG90YykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Citkb3VibGUgIEJMQVNGVU5DKHhkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK2RvdWJsZSAgQkxBU0ZVTkMoeGRvdGMpICAoaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOworI2VuZGlmCisKK2ludCAgQkxBU0ZVTkMoY2RvdHV3KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQqKTsKK2ludCAgQkxBU0ZVTkMoY2RvdGN3KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQqKTsKK2ludCAgQkxBU0ZVTkMoemRvdHV3KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUqKTsKK2ludCAgQkxBU0ZVTkMoemRvdGN3KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUqKTsKKworaW50ICAgIEJMQVNGVU5DKHNheHB5KSAoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZGF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxYXhweSkgKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNheHB5KSAoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4YXhweSkgKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNheHB5YykoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemF4cHljKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4YXhweWMpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoc2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoY2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZHN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHFzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoenN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNhc3VtKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2Nhc3VtKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkYXN1bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhc3VtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHphc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeGFzdW0pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlxYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhpc21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpY21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWRhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcWFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYW1heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY2FtYXgpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNhbWluKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYW1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc21heCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkbWF4KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtYXgpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzbWluKSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRtaW4pICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocW1pbikgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY21pbikgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6bWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhkc2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocXNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6c2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNzc2NhbCkoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6ZHNjYWwpKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeHFzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc25ybTIpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY25ybTIpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworCitkb3VibGUgQkxBU0ZVTkMoZG5ybTIpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbnJtMikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6bnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhucm0yKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3QpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKGNzcm90KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKHpkcm90KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHhxcm90KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMocXJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMoY3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoenJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMoeHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CisKK2ludCAgICBCTEFTRlVOQyhzcm90bWcpKGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdG1nKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdG0pIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyhkcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3RtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKKy8qIExldmVsIDIgcm91dGluZXMgKi8KKworaW50IEJMQVNGVU5DKHNnZXIpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAorCQkgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlcnUpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAorCQkgICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJjKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VydSkoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXJjKShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ltdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3NwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzcG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5cjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoZHNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHFzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoenNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKHNzcHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoZHNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxc3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKGNzcHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoenNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4c3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCitpbnQgQkxBU0ZVTkMoY2hlcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaHByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCBCTEFTRlVOQyh6aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCBCTEFTRlVOQyh6aHByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhocHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhjaGVtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaHBtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpocG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aHBtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZG5vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKKy8qIExldmVsIDMgcm91dGluZXMgKi8KKworaW50IEJMQVNGVU5DKHNnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMm0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlcjJtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VzdikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VzdikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxcG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkcG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6cG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxbGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4bGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxcG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTA1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsODMgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGFzX2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MjggQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIGJsYXNfUFJPRFVJVF9NQVRSSUNFX1ZFQ1RFVVJfSEgKKyNkZWZpbmUgYmxhc19QUk9EVUlUX01BVFJJQ0VfVkVDVEVVUl9ISAorCisjaW5jbHVkZSA8Y19pbnRlcmZhY2VfYmFzZS5oPgorI2luY2x1ZGUgPGNvbXBsZXg+CitleHRlcm4gIkMiCit7CisjaW5jbHVkZSAiYmxhcy5oIgorCisgIC8vIENob2xlc2t5IEZhY3Rvcml6YXRpb24KKy8vICAgdm9pZCBzcG90cmZfKGNvbnN0IGNoYXIqIHVwbG8sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaW5mbyk7CisvLyAgIHZvaWQgZHBvdHJmXyhjb25zdCBjaGFyKiB1cGxvLCBjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50KiBsZCwgaW50KiBpbmZvKTsKKyAgdm9pZCBzc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZmxvYXQgKmEsIGNvbnN0IGludCAqbGRhLCBmbG9hdCAqZCwgZmxvYXQgKmUsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKKyAgdm9pZCBkc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICpkLCBkb3VibGUgKmUsIGRvdWJsZSAqdGF1LCBkb3VibGUgKndvcmssIGludCAqbHdvcmssIGludCAqaW5mbyApOworICB2b2lkIHNnZWhyZF8oIGNvbnN0IGludCAqbiwgaW50ICppbG8sIGludCAqaWhpLCBmbG9hdCAqYSwgY29uc3QgaW50ICpsZGEsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKKyAgdm9pZCBkZ2VocmRfKCBjb25zdCBpbnQgKm4sIGludCAqaWxvLCBpbnQgKmloaSwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICp0YXUsIGRvdWJsZSAqd29yaywgaW50ICpsd29yaywgaW50ICppbmZvICk7CisKKyAgLy8gTFUgcm93IHBpdm90aW5nCisvLyAgIHZvaWQgZGdldHJmXyggaW50ICptLCBpbnQgKm4sIGRvdWJsZSAqYSwgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICppbmZvICk7CisvLyAgIHZvaWQgc2dldHJmXyhjb25zdCBpbnQqIG0sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaXBpdm90LCBpbnQqIGluZm8pOworICAvLyBMVSBmdWxsIHBpdm90aW5nCisgIHZvaWQgc2dldGMyXyhjb25zdCBpbnQqIG4sIGZsb2F0ICphLCBjb25zdCBpbnQgKmxkYSwgaW50ICppcGl2LCBpbnQgKmpwaXYsIGludCppbmZvICk7CisgIHZvaWQgZGdldGMyXyhjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICpqcGl2LCBpbnQqaW5mbyApOworI2lmZGVmIEhBU19MQVBBQ0sKKyNlbmRpZgorfQorCisjZGVmaW5lIE1BS0VfU1RSSU5HMihTKSAjUworI2RlZmluZSBNQUtFX1NUUklORyhTKSBNQUtFX1NUUklORzIoUykKKworI2RlZmluZSBDQVQyKEEsQikgQSMjQgorI2RlZmluZSBDQVQoQSxCKSBDQVQyKEEsQikKKworCit0ZW1wbGF0ZTxjbGFzcyByZWFsPiBjbGFzcyBibGFzX2ludGVyZmFjZTsKKworCitzdGF0aWMgY2hhciBub3RyYW5zID0gJ04nOworc3RhdGljIGNoYXIgdHJhbnMgPSAnVCc7CitzdGF0aWMgY2hhciBub251bml0ID0gJ04nOworc3RhdGljIGNoYXIgbG93ZXIgPSAnTCc7CitzdGF0aWMgY2hhciByaWdodCA9ICdSJzsKK3N0YXRpYyBjaGFyIGxlZnQgPSAnTCc7CitzdGF0aWMgaW50IGludG9uZSA9IDE7CisKKworCisjZGVmaW5lIFNDQUxBUiAgICAgICAgZmxvYXQKKyNkZWZpbmUgU0NBTEFSX1BSRUZJWCBzCisjaW5jbHVkZSAiYmxhc19pbnRlcmZhY2VfaW1wbC5oaCIKKyN1bmRlZiBTQ0FMQVIKKyN1bmRlZiBTQ0FMQVJfUFJFRklYCisKKworI2RlZmluZSBTQ0FMQVIgICAgICAgIGRvdWJsZQorI2RlZmluZSBTQ0FMQVJfUFJFRklYIGQKKyNpbmNsdWRlICJibGFzX2ludGVyZmFjZV9pbXBsLmhoIgorI3VuZGVmIFNDQUxBUgorI3VuZGVmIFNDQUxBUl9QUkVGSVgKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlX2ltcGwuaGggYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlX2ltcGwuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2VfaW1wbC5oaApAQCAtMCwwICsxLDE0NyBAQAorCisjZGVmaW5lIEJMQVNfRlVOQyhOQU1FKSBDQVQoQ0FUKFNDQUxBUl9QUkVGSVgsTkFNRSksXykKKwordGVtcGxhdGU8PiBjbGFzcyBibGFzX2ludGVyZmFjZTxTQ0FMQVI+IDogcHVibGljIGNfaW50ZXJmYWNlX2Jhc2U8U0NBTEFSPgoreworCitwdWJsaWMgOgorICAKKyAgc3RhdGljIFNDQUxBUiBmb25lOworICBzdGF0aWMgU0NBTEFSIGZ6ZXJvOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpCisgIHsKKyAgICByZXR1cm4gTUFLRV9TVFJJTkcoQ0JMQVNOQU1FKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIEJMQVNfRlVOQyhnZW12KSgmbm90cmFucywmTiwmTiwmZm9uZSxBLCZOLEIsJmludG9uZSwmZnplcm8sWCwmaW50b25lKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeW12KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3ltdikoJmxvd2VyLCAmTiwmZm9uZSxBLCZOLEIsJmludG9uZSwmZnplcm8sWCwmaW50b25lKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeXIyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3lyMikoJmxvd2VyLCZOLCZmb25lLEIsJmludG9uZSxYLCZpbnRvbmUsQSwmTik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoZ2VyKSgmTiwmTiwmZm9uZSxYLCZpbnRvbmUsWSwmaW50b25lLEEsJk4pOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHJvdChnZW5lX3ZlY3RvciAmIEEsICBnZW5lX3ZlY3RvciAmIEIsIFNDQUxBUiBjLCBTQ0FMQVIgcywgaW50IE4peworICAgIEJMQVNfRlVOQyhyb3QpKCZOLEEsJmludG9uZSxCLCZpbnRvbmUsJmMsJnMpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoZ2VtdikoJnRyYW5zLCZOLCZOLCZmb25lLEEsJk4sQiwmaW50b25lLCZmemVybyxYLCZpbnRvbmUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgQkxBU19GVU5DKGdlbW0pKCZub3RyYW5zLCZub3RyYW5zLCZOLCZOLCZOLCZmb25lLEEsJk4sQiwmTiwmZnplcm8sWCwmTik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIEJMQVNfRlVOQyhnZW1tKSgmbm90cmFucywmbm90cmFucywmTiwmTiwmTiwmZm9uZSxBLCZOLEIsJk4sJmZ6ZXJvLFgsJk4pOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisvLyAgICAgc3N5cmtfKCZsb3dlciwmdHJhbnMsJk4sJk4sJmZvbmUsQSwmTiwmZnplcm8sWCwmTik7CisvLyAgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3lyaykoJmxvd2VyLCZub3RyYW5zLCZOLCZOLCZmb25lLEEsJk4sJmZ6ZXJvLFgsJk4pOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoU0NBTEFSIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgQkxBU19GVU5DKGF4cHkpKCZOLCZjb2VmLFgsJmludG9uZSxZLCZpbnRvbmUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KFNDQUxBUiBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIFNDQUxBUiBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc2NhbCkoJk4sJmIsWSwmaW50b25lKTsKKyAgICBCTEFTX0ZVTkMoYXhweSkoJk4sJmEsWCwmaW50b25lLFksJmludG9uZSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBpbnQgTjIgPSBOKk47CisgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmludG9uZSwgQywgJmludG9uZSk7CisgICAgY2hhciB1cGxvID0gJ0wnOworICAgIGludCBpbmZvID0gMDsKKyAgICBCTEFTX0ZVTkMocG90cmYpKCZ1cGxvLCAmTiwgQywgJk4sICZpbmZvKTsKKyAgICBpZihpbmZvIT0wKSBzdGQ6OmNlcnIgPDwgInBvdHJmXyBlcnJvciAiIDw8IGluZm8gPDwgIlxuIjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aWFsX2x1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIGludCBOMiA9IE4qTjsKKyAgICBCTEFTX0ZVTkMoY29weSkoJk4yLCBYLCAmaW50b25lLCBDLCAmaW50b25lKTsKKyAgICBpbnQgaW5mbyA9IDA7CisgICAgaW50ICogaXBpdiA9IChpbnQqKWFsbG9jYShzaXplb2YoaW50KSpOKTsKKyAgICBCTEFTX0ZVTkMoZ2V0cmYpKCZOLCAmTiwgQywgJk4sIGlwaXYsICZpbmZvKTsKKyAgICBpZihpbmZvIT0wKSBzdGQ6OmNlcnIgPDwgImdldHJmXyBlcnJvciAiIDw8IGluZm8gPDwgIlxuIjsKKyAgfQorICAKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIEJMQVNfRlVOQyhjb3B5KSgmTiwgQiwgJmludG9uZSwgWCwgJmludG9uZSk7CisgICAgQkxBU19GVU5DKHRyc3YpKCZsb3dlciwgJm5vdHJhbnMsICZub251bml0LCAmTiwgTCwgJk4sIFgsICZpbnRvbmUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyX21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoY29weSkoJk4sIEIsICZpbnRvbmUsIFgsICZpbnRvbmUpOworICAgIEJMQVNfRlVOQyh0cnNtKSgmcmlnaHQsICZsb3dlciwgJm5vdHJhbnMsICZub251bml0LCAmTiwgJk4sICZmb25lLCBMLCAmTiwgWCwgJk4pOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRybW0oZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgLypYKi8sIGludCBOKXsKKyAgICBCTEFTX0ZVTkModHJtbSkoJmxlZnQsICZsb3dlciwgJm5vdHJhbnMsJm5vbnVuaXQsICZOLCZOLCZmb25lLEEsJk4sQiwmTik7CisgIH0KKworICAjaWZkZWYgSEFTX0xBUEFDSworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBsdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBpbnQgTjIgPSBOKk47CisgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmludG9uZSwgQywgJmludG9uZSk7CisgICAgaW50IGluZm8gPSAwOworICAgIGludCAqIGlwaXYgPSAoaW50KilhbGxvY2Eoc2l6ZW9mKGludCkqTik7CisgICAgaW50ICoganBpdiA9IChpbnQqKWFsbG9jYShzaXplb2YoaW50KSpOKTsKKyAgICBCTEFTX0ZVTkMoZ2V0YzIpKCZOLCBDLCAmTiwgaXBpdiwganBpdiwgJmluZm8pOworICB9CisKKworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgeworICAgICAgaW50IE4yID0gTipOOworICAgICAgaW50IGluYyA9IDE7CisgICAgICBCTEFTX0ZVTkMoY29weSkoJk4yLCBYLCAmaW5jLCBDLCAmaW5jKTsKKyAgICB9CisgICAgaW50IGluZm8gPSAwOworICAgIGludCBpbG8gPSAxOworICAgIGludCBpaGkgPSBOOworICAgIGludCBic2l6ZSA9IDY0OworICAgIGludCB3b3Jrc2l6ZSA9IE4qYnNpemU7CisgICAgU0NBTEFSKiBkID0gbmV3IFNDQUxBUltOK3dvcmtzaXplXTsKKyAgICBCTEFTX0ZVTkMoZ2VocmQpKCZOLCAmaWxvLCAmaWhpLCBDLCAmTiwgZCwgZCtOLCAmd29ya3NpemUsICZpbmZvKTsKKyAgICBkZWxldGVbXSBkOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIHsKKyAgICAgIGludCBOMiA9IE4qTjsKKyAgICAgIGludCBpbmMgPSAxOworICAgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmluYywgQywgJmluYyk7CisgICAgfQorICAgIGNoYXIgdXBsbyA9ICdVJzsKKyAgICBpbnQgaW5mbyA9IDA7CisgICAgaW50IGJzaXplID0gNjQ7CisgICAgaW50IHdvcmtzaXplID0gTipic2l6ZTsKKyAgICBTQ0FMQVIqIGQgPSBuZXcgU0NBTEFSWzMqTit3b3Jrc2l6ZV07CisgICAgQkxBU19GVU5DKHN5dHJkKSgmdXBsbywgJk4sIEMsICZOLCBkLCBkK04sIGQrMipOLCBkKzMqTiwgJndvcmtzaXplLCAmaW5mbyk7CisgICAgZGVsZXRlW10gZDsKKyAgfQorICAKKyAgI2VuZGlmIC8vIEhBU19MQVBBQ0sKKworfTsKKworU0NBTEFSIGJsYXNfaW50ZXJmYWNlPFNDQUxBUj46OmZvbmUgPSBTQ0FMQVIoMSk7CitTQ0FMQVIgYmxhc19pbnRlcmZhY2U8U0NBTEFSPjo6Znplcm8gPSBTQ0FMQVIoMCk7CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvY19pbnRlcmZhY2VfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjEzODAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaApAQCAtMCwwICsxLDczIEBACisKKyNpZm5kZWYgQlRMX0NfSU5URVJGQUNFX0JBU0VfSAorI2RlZmluZSBCVExfQ19JTlRFUkZBQ0VfQkFTRV9ICisKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+IGNsYXNzIGNfaW50ZXJmYWNlX2Jhc2UKK3sKKworcHVibGljOgorCisgIHR5cGVkZWYgcmVhbCAgICAgICAgICAgICAgICAgICAgICByZWFsX3R5cGU7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gICAgICAgICBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3IgPiAgc3RsX21hdHJpeDsKKworICB0eXBlZGVmIHJlYWwqIGdlbmVfbWF0cml4OworICB0eXBlZGVmIHJlYWwqIGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IC8qTiovKXsKKyAgICBkZWxldGVbXSBBOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKKyAgICBkZWxldGVbXSBCOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE4gPSBBX3N0bC5zaXplKCk7CisgICAgQSA9IG5ldyByZWFsW04qTl07CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQVtpK04qal0gPSBBX3N0bFtqXVtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGludCBOID0gQl9zdGwuc2l6ZSgpOworICAgIEIgPSBuZXcgcmVhbFtOXTsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgIEJbaV0gPSBCX3N0bFtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBpbnQgTiA9IEJfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgIEJfc3RsW2ldID0gQltpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQV9zdGxbal1baV0gPSBBW2krTipqXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgIGNpYmxlW2ldPXNvdXJjZVtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgICAgY2libGVbaStOKmpdID0gc291cmNlW2krTipqXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvQkxBUy9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjRkNTVlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvQkxBUy9tYWluLmNwcApAQCAtMCwwICsxLDczIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgbWFpbi5jcHAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjI4IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImJsYXNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2x1X2RlY29tcC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fcGFydGlhbF9sdS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fdHJpc29sdmVfbWF0cml4LmhoIgorCisjaWZkZWYgSEFTX0xBUEFDSworI2luY2x1ZGUgImFjdGlvbl9oZXNzZW5iZXJnLmhoIgorI2VuZGlmCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5bXY8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeXIyPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9nZXI8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9yb3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlX21hdHJpeDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fdHJtbTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fY2hvbGVza3k8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworCisgICNpZmRlZiBIQVNfTEFQQUNLCisvLyAgIGJlbmNoPEFjdGlvbl9sdV9kZWNvbXA8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9oZXNzZW5iZXJnPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICAjZW5kaWYKKworICAvL2JlbmNoPEFjdGlvbl9sdV9zb2x2ZTxibGFzX0xVX3NvbHZlX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9TVEwvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9TVEwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmYzJkYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL1NUTC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIgQEAKKworYnRsX2FkZF9iZW5jaChidGxfU1RMIG1haW4uY3BwIE9GRikKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL1NUTC9TVExfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvU1RML1NUTF9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0Y2M5MgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL1NUTC9TVExfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMjQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgU1RMX2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MjQgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIFNUTF9JTlRFUkZBQ0VfSEgKKyNkZWZpbmUgU1RMX0lOVEVSRkFDRV9ISAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBTVExfaW50ZXJmYWNleworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiBzdGxfbWF0cml4IGdlbmVfbWF0cml4OworCisgIHR5cGVkZWYgc3RsX3ZlY3RvciBnZW5lX3ZlY3RvcjsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJTVEwiOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiAvKkEqLywgaW50IC8qTiovKXt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiAvKkIqLyl7fQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIEEgPSBBX3N0bDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIgPSBCX3N0bDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCX3N0bCA9IEIgOworICB9CisKKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQV9zdGwgPSBBIDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgIGNpYmxlW2ldPXNvdXJjZVtpXTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgICAgIGNpYmxlW2ldW2pdPXNvdXJjZVtpXVtqXTsKKyAgfQorCisvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisvLyAgIHsKKy8vICAgICByZWFsIHNvbW1lOworLy8gICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKy8vICAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKy8vICAgICAgICAgc29tbWU9MC4wOworLy8gICAgICAgICBmb3IgKGludCBrPTA7azxOO2srKykKKy8vICAgICAgICAgICBzb21tZSArPSBBW2ldW2tdKkFbal1ba107CisvLyAgICAgICAgIFhbal1baV09c29tbWU7CisvLyAgICAgICB9CisvLyAgICAgfQorLy8gICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKyAgeworICAgIHJlYWwgc29tbWU7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBzb21tZT0wLjA7CisgICAgICAgIGlmKGk+PWopCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGludCBrPTA7azxOO2srKyl7CisgICAgICAgICAgICBzb21tZSs9QVtrXVtpXSpBW2tdW2pdOworICAgICAgICAgIH0KKyAgICAgICAgICBYW2pdW2ldPXNvbW1lOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQorICB7CisgICAgcmVhbCBzb21tZTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICAgIHNvbW1lPTAuMDsKKyAgICAgICAgZm9yIChpbnQgaz0wO2s8TjtrKyspCisgICAgICAgICAgc29tbWUrPUFba11baV0qQltqXVtrXTsKKyAgICAgICAgWFtqXVtpXT1zb21tZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQorICB7CisgICAgcmVhbCBzb21tZTsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICBzb21tZT0wLjA7CisgICAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICAgICAgc29tbWUrPUFbal1baV0qQltqXTsKKyAgICAgIFhbaV09c29tbWU7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHN5bXYoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCisgIHsKKyAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQorICAgICAgWFtqXSA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPE47ICsraikKKyAgICB7CisgICAgICByZWFsIHQxID0gQltqXTsKKyAgICAgIHJlYWwgdDIgPSAwOworICAgICAgWFtqXSArPSB0MSAqIEFbal1bal07CisgICAgICBmb3IgKGludCBpPWorMTsgaTxOOyArK2kpIHsKKyAgICAgICAgWFtpXSArPSB0MSAqIEFbal1baV07CisgICAgICAgIHQyICs9IEFbal1baV0gKiBCW2ldOworICAgICAgfQorICAgICAgWFtqXSArPSB0MjsKKyAgICB9CisgIH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeXIyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQorICB7CisgICAgZm9yIChpbnQgaj0wOyBqPE47ICsraikKKyAgICB7CisgICAgICBmb3IgKGludCBpPWo7IGk8TjsgKytpKQorICAgICAgICBBW2pdW2ldICs9IEJbaV0qWFtqXSArIEJbal0qWFtpXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKQorICB7CisgICAgZm9yIChpbnQgaj0wOyBqPE47ICsraikKKyAgICB7CisgICAgICBmb3IgKGludCBpPWo7IGk8TjsgKytpKQorICAgICAgICBBW2pdW2ldICs9IFhbaV0qWVtqXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCisgIHsKKyAgICByZWFsIHNvbW1lOworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgIHNvbW1lID0gMC4wOworICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgICAgIHNvbW1lICs9IEFbaV1bal0qQltqXTsKKyAgICAgIFhbaV0gPSBzb21tZTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCisgICAgICBZW2ldKz1jb2VmKlhbaV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCisgICAgICBZW2ldID0gYSpYW2ldICsgYipZW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBjb3B5X3ZlY3RvcihCLFgsTik7CisgICAgZm9yKGludCBpPTA7IGk8TjsgKytpKQorICAgIHsKKyAgICAgIFhbaV0gLz0gTFtpXVtpXTsKKyAgICAgIHJlYWwgdG1wID0gWFtpXTsKKyAgICAgIGZvciAoaW50IGo9aSsxOyBqPE47ICsraikKKyAgICAgICAgWFtqXSAtPSB0bXAgKiBMW2ldW2pdOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBub3JtX2RpZmYoY29uc3Qgc3RsX3ZlY3RvciAmIEEsIGNvbnN0IHN0bF92ZWN0b3IgJiBCKQorICB7CisgICAgaW50IE49QS5zaXplKCk7CisgICAgcmVhbCBzb21tZT0wLjA7CisgICAgcmVhbCBzb21tZTI9MC4wOworCisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgcmVhbCBkaWZmPUFbaV0tQltpXTsKKyAgICAgIHNvbW1lKz1kaWZmKmRpZmY7CisgICAgICBzb21tZTIrPUFbaV0qQVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHNvbW1lL3NvbW1lMjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBub3JtX2RpZmYoY29uc3Qgc3RsX21hdHJpeCAmIEEsIGNvbnN0IHN0bF9tYXRyaXggJiBCKQorICB7CisgICAgaW50IE49QVswXS5zaXplKCk7CisgICAgcmVhbCBzb21tZT0wLjA7CisgICAgcmVhbCBzb21tZTI9MC4wOworCisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgICByZWFsIGRpZmY9QVtpXVtqXSAtIEJbaV1bal07CisgICAgICAgIHNvbW1lICs9IGRpZmYqZGlmZjsKKyAgICAgICAgc29tbWUyICs9IEFbaV1bal0qQVtpXVtqXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc29tbWUvc29tbWUyOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYXlfdmVjdG9yKGNvbnN0IHN0bF92ZWN0b3IgJiBBKQorICB7CisgICAgaW50IE49QS5zaXplKCk7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgSU5GT1MoIkFbIjw8aTw8Il09Ijw8QVtpXTw8ZW5kbCk7CisgICAgfQorICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvU1RML21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvU1RML21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzMzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9TVEwvbWFpbi5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyMyBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9heHB5PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeW12PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeXIyPFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsYXplL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YTA4NQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsYXplL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworZmluZF9wYWNrYWdlKEJMQVpFKQorZmluZF9wYWNrYWdlKEJvb3N0IENPTVBPTkVOVFMgc3lzdGVtKQoraWYgKEJMQVpFX0ZPVU5EIEFORCBCb29zdF9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0JMQVpFX0lOQ0xVREVfRElSfSAke0Jvb3N0X0lOQ0xVREVfRElSU30pCisgIGJ0bF9hZGRfYmVuY2goYnRsX2JsYXplIG1haW4uY3BwKQorICAjIE5vdGU6IFRoZSBuZXdlc3QgYmxhemUgdmVyc2lvbiByZXF1aXJlcyBDKysxNC4KKyAgIyBJZGVhbGx5LCB3ZSBzaG91bGQgc2V0IHRoaXMgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIEJsYXplIHdlIGZvdW5kCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgYnRsX2JsYXplIFBST1BFUlRZIENYWF9TVEFOREFSRCAxNCkKKyAgaWYoQlVJTERfYnRsX2JsYXplKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfYmxhemUgJHtCb29zdF9MSUJSQVJJRVN9KQorICBlbmRpZigpCitlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxhemUvYmxhemVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvYmxhemVfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTUyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9ibGF6ZS9ibGF6ZV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQkxBWkVfSU5URVJGQUNFX0hICisjZGVmaW5lIEJMQVpFX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8YmxhemUvTWF0aC5oPgorI2luY2x1ZGUgPGJsYXplL0JsYXplLmg+CisvLyB1c2luZyBuYW1lc3BhY2UgYmxhemU7CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGF6ZV9pbnRlcmZhY2UgeworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gICAgICAgIHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiBibGF6ZTo6RHluYW1pY01hdHJpeDxyZWFsLGJsYXplOjpjb2x1bW5NYWpvcj4gIGdlbmVfbWF0cml4OworICB0eXBlZGVmIGJsYXplOjpEeW5hbWljVmVjdG9yPHJlYWw+ICBnZW5lX3ZlY3RvcjsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAiYmxhemUiOyB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTil7CisgICAgcmV0dXJuIDsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7CisgICAgcmV0dXJuIDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspeworICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7CisgICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSk7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCW2ldID0gQl9zdGxbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV0gPSBCW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTj1BX3N0bC5zaXplKCk7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAodHJhbnMoQSkqdHJhbnMoQikpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9ICh0cmFucyhBKSpBKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAoQSp0cmFucyhBKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSAodHJhbnMoQSkqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZID0gYSpYICsgYipZOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisvLyAgICAgQyA9IFg7CisvLyAgICAgcmVjdXJzaXZlX2Nob2xlc2t5KEMpOworLy8gICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4peworLy8gICAgIFIgPSBYOworLy8gICAgIHN0ZDo6dmVjdG9yPGludD4gaXB2dChOKTsKKy8vICAgICBsdV9mYWN0b3IoUiwgaXB2dCk7CisvLyAgIH0KKworLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisvLyAgICAgWCA9IGxvd2VyX3RyaXNvbHZlKEwsIEIpOworLy8gICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsYXplL21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlOGY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsYXplL21haW4uY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJibGF6ZV9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaDxBY3Rpb25fYXhweTxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8YmxhemVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBhYjczCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNyBAQAorCitmaW5kX3BhY2thZ2UoQmxpdHopCisKK2lmIChCTElUWl9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0JMSVRaX0lOQ0xVREVTfSkKKworICBidGxfYWRkX2JlbmNoKGJ0bF9ibGl0eiBidGxfYmxpdHouY3BwKQorICBpZiAoQlVJTERfYnRsX2JsaXR6KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfYmxpdHogJHtCTElUWl9MSUJSQVJJRVN9KQorICBlbmRpZiAoQlVJTERfYnRsX2JsaXR6KQorCisgIGJ0bF9hZGRfYmVuY2goYnRsX3RpbnlfYmxpdHogYnRsX3RpbnlfYmxpdHouY3BwIE9GRikKKyAgaWYgKEJVSUxEX2J0bF90aW55X2JsaXR6KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfdGlueV9ibGl0eiAke0JMSVRaX0xJQlJBUklFU30pCisgIGVuZGlmIChCVUlMRF9idGxfdGlueV9ibGl0eikKKworZW5kaWYgKEJMSVRaX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjlmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9ibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxOTIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzEgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAorI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgImJsaXR6L2FycmF5LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UgOiBwdWJsaWMgYmxpdHpfaW50ZXJmYWNlPHJlYWw+Cit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CisKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKworICBpbmxpbmUgc3RhdGljIHZvaWQgbmV3X1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCxpbnQgTikKKyAgeworCisgICAgcGl2b3QucmVzaXplKE4pOworCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QpCisgIHsKKyAgICAKKyAgICByZXR1cm47CisKKyAgfQorCisKKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCkKKyAgeworICAgIAorICAgIHJlYWwgc29tbWU9MC47CisgICAgCisgICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7CisJCisJc29tbWUrPUEocm93LGopKkIoaik7CisJCisgICAgfQorCisgICAgcmV0dXJuIHNvbW1lOworCisgIH0KKworCisKKworICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmIEEsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBnZW5lX21hdHJpeCAmIEIsIGludCByb3dfc2hpZnQsIGludCBjb2wgKQorICB7CisgICAgCisgICAgcmVhbCBzb21tZT0wLjsKKyAgICAKKyAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKKwkKKwlzb21tZSs9QShyb3csaikqQihqK3Jvd19zaGlmdCxjb2wpOworCQorICAgIH0KKworICAgIHJldHVybiBzb21tZTsKKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmIExVLCBQaXZvdF9WZWN0b3IgJiBwaXZvdCwgaW50IE4pCisgIHsKKworICAgIEFTU0VSVCggTFUucm93cygpPT1MVS5jb2xzKCkgKSA7CisgICAgaW50IGluZGV4X21heCA9IDAgOworICAgIHJlYWwgYmlnID0gMC4gOworICAgIHJlYWwgdGhlU3VtID0gMC4gOworICAgIHJlYWwgZHVtID0gMC4gOworICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6CisgICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOworICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgeworCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgICAgfQorICAgICAgaWYoIGJpZz09MC4gKSB7CisJSU5GT1MoICJibGl0el9MVV9mYWN0b3I6OlNpbmd1bGFyIG1hdHJpeCIgKSA7CisJZXhpdCggMCApIDsKKyAgICAgIH0KKyAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICB9CisgICAgLy8gTG9vcCBvdmVyIGNvbHVtbnMgb2YgQ3JvdXQncyBtZXRob2QgOgorICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7CisgICAgICBmb3IoIGludCBpPTA7IGk8ajsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCA6CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBpPWo7IGk8TjsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBqLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisJaWYoIChJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApKT49YmlnICkgeworCSAgZHVtID0gSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSA7CisJICBiaWcgPSBkdW0gOworCSAgaW5kZXhfbWF4ID0gaSA7CisJfQorICAgICAgfQorICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKKyAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7CisJZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKKwkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7CisJICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKKwkgIExVKCBqLCBrICkgPSBkdW0gOworCX0KKwlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgfQorICAgICAgcGl2b3QoIGogKSA9IGluZGV4X21heCA7CisgICAgICBpZiAoIExVKCBqLCBqICk9PTAuICkgTFUoIGosIGogKSA9IDEuZS0yMCA7CisgICAgICAvLyBEaXZpZGUgYnkgdGhlIHBpdm90IGVsZW1lbnQgOgorICAgICAgaWYoIGo8TiApIHsKKwlkdW0gPSAxLi9MVSggaiwgaiApIDsKKwlmb3IoIGludCBpPWorMTsgaTxOOyBpKysgKSBMVSggaSwgaiApICo9IGR1bSA7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJiBMVSwgY29uc3QgUGl2b3RfVmVjdG9yIHBpdm90LCBnZW5lX3ZlY3RvciAmQiwgZ2VuZV92ZWN0b3IgWCwgaW50IE4pCisgIHsKKworICAgIC8vIFBvdXIgY29uc2VydmVyIGxlIG1lbWUgaGVhZGVyLCBvbiB0cmF2YWlsbGUgc3VyIFgsIGNvcGllIGR1IHNlY29uZC1tZW1icmUgQgorICAgIFggPSBCLmNvcHkoKSA7CisgICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKKyAgICBmaXJzdEluZGV4IGluZEkgOworICAgIC8vIEZvcndhcmQgc3Vic3RpdHV0aW9uIDoKKyAgICBpbnQgaWkgPSAwIDsKKyAgICByZWFsIHRoZVN1bSA9IDAuIDsKKyAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgeworICAgICAgaW50IGlwID0gcGl2b3QoIGkgKSA7CisgICAgICB0aGVTdW0gPSBYKCBpcCApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7CisgICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7CisgICAgICBpZiggaWkgKSB7CisJdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKKwlpaSA9IGkrMSA7CisgICAgICB9CisgICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0gOworICAgIH0KKyAgICAvLyBCYWNrc3Vic3RpdHV0aW9uIDoKKyAgICBmb3IoIGludCBpPU4tMTsgaT49MDsgaS0tICkgeworICAgICAgdGhlU3VtID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpYKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqQiggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOworICAgICAgLy8gU3RvcmUgYSBjb21wb25lbnQgb2YgdGhlIHNvbHV0aW9uIHZlY3RvciA6CisgICAgICBYKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CisgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICB9CisKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdjNDdjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTQ3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYmxpdHpfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQkxJVFpfSU5URVJGQUNFX0hICisjZGVmaW5lIEJMSVRaX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8YmxpdHovYmxpdHouaD4KKyNpbmNsdWRlIDxibGl0ei9hcnJheS5oPgorI2luY2x1ZGUgPGJsaXR6L3ZlY3Rvci1ldC5oPgorI2luY2x1ZGUgPGJsaXR6L3ZlY3doZXJlLmg+CisjaW5jbHVkZSA8YmxpdHovbWF0cml4Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9pbnRlcmZhY2V7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIGJsaXR6OjpBcnJheTxyZWFsLCAyPiAgZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgYmxpdHo6OkFycmF5PHJlYWwsIDE+ICBnZW5lX3ZlY3RvcjsKKy8vICAgdHlwZWRlZiBibGl0ejo6TWF0cml4PHJlYWwsIGJsaXR6OjpDb2x1bW5NYWpvcj4gIGdlbmVfbWF0cml4OworLy8gICB0eXBlZGVmIGJsaXR6OjpWZWN0b3I8cmVhbD4gZ2VuZV92ZWN0b3I7CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCkgeyByZXR1cm4gImJsaXR6IjsgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pe30KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpe30KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBLnJlc2l6ZShBX3N0bFswXS5zaXplKCksQV9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspeworICAgICAgICBBKGksaik9QV9zdGxbal1baV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQi5yZXNpemUoQl9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEIoaSk9Ql9zdGxbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV09QihpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIHNlY29uZEluZGV4IGo7CisgICAgdGhpcmRJbmRleCBrOworICAgIFggPSBzdW0oQShpLGspICogQihrLGopLCBrKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisgIHsKKyAgICBmaXJzdEluZGV4IGk7CisgICAgc2Vjb25kSW5kZXggajsKKyAgICB0aGlyZEluZGV4IGs7CisgICAgWCA9IHN1bShBKGssaSkgKiBBKGssaiksIGspOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKyAgeworICAgIGZpcnN0SW5kZXggaTsKKyAgICBzZWNvbmRJbmRleCBqOworICAgIHRoaXJkSW5kZXggazsKKyAgICBYID0gc3VtKEEoaSxrKSAqIEEoaixrKSwgayk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIHNlY29uZEluZGV4IGo7CisgICAgWCA9IHN1bShBKGksaikqQihqKSxqKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKKyAgeworICAgIGZpcnN0SW5kZXggaTsKKyAgICBzZWNvbmRJbmRleCBqOworICAgIFggPSBzdW0oQShqLGkpICogQihqKSxqKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIFkgPSBZKGkpICsgY29lZiAqIFgoaSk7CisgICAgLy9ZICs9IGNvZWYgKiBYOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgICAgLy9jaWJsZS50ZW1wbGF0ZSBvcGVyYXRvcj08Z2VuZV9tYXRyaXg+KHNvdXJjZSk7CisvLyAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworLy8gICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworLy8gICAgICAgICBjaWJsZShpLGopPXNvdXJjZShpLGopOworLy8gICAgICAgfQorLy8gICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIC8vY2libGUudGVtcGxhdGUgb3BlcmF0b3I9PGdlbmVfdmVjdG9yPihzb3VyY2UpOworICAgIGNpYmxlID0gc291cmNlOworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX2JsaXR6LmNwcCBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF9ibGl0ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF9ibGl0ei5jcHAKQEAgLTAsMCArMSw1MSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJibGl0el9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbHVfc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXR2X3Byb2R1Y3QuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8YmxpdHpfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKworICAvL2JlbmNoPEFjdGlvbl9sdV9zb2x2ZTxibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX3RpbnlfYmxpdHouY3BwIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX3RpbnlfYmxpdHouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGRkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfdGlueV9ibGl0ei5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0aW55X2JsaXR6X2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJzdGF0aWMvYmVuY2hfc3RhdGljLmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9heHB5LHRpbnlfYmxpdHpfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCx0aW55X2JsaXR6X2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsdGlueV9ibGl0el9pbnRlcmZhY2U+KCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9ibGl0ei90aW55X2JsaXR6X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI2ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICB0aW55X2JsaXR6X2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzAgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIFRJTllfQkxJVFpfSU5URVJGQUNFX0hICisjZGVmaW5lIFRJTllfQkxJVFpfSU5URVJGQUNFX0hICisKKyNpbmNsdWRlICJibGl0ei9hcnJheS5oIgorI2luY2x1ZGUgImJsaXR6L3RpbnkuaCIKKyNpbmNsdWRlICJibGl0ei90aW55bWF0LmgiCisjaW5jbHVkZSAiYmxpdHovdGlueXZlYy5oIgorI2luY2x1ZGUgPGJsaXR6L3Rpbnl2ZWMtZXQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQorCit0ZW1wbGF0ZTxjbGFzcyByZWFsLCBpbnQgU0laRT4KK2NsYXNzIHRpbnlfYmxpdHpfaW50ZXJmYWNlCit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIFRpbnlWZWN0b3I8cmVhbCxTSVpFPiBnZW5lX3ZlY3RvcjsKKyAgdHlwZWRlZiBUaW55TWF0cml4PHJlYWwsU0laRSxTSVpFPiBnZW5lX21hdHJpeDsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAidGlueV9ibGl0eiI7IH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXt9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKykKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspCisgICAgICAgIEEoaSxqKT1BX3N0bFtqXVtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspCisgICAgICBCKGkpID0gQl9zdGxbaV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKykKKyAgICAgIEJfc3RsW2ldID0gQihpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICB7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgY2libGUoaSxqKSA9IHNvdXJjZShpLGopOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgY2libGUoaSkgPSBzb3VyY2UoaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IHByb2R1Y3QoQSxCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSBwcm9kdWN0KEEsQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZThmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOSBAQAorCitmaW5kX3BhY2thZ2UoRWlnZW4yKQorCitpZihFSUdFTjJfRk9VTkQpCisKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyhCRUZPUkUgJHtFSUdFTjJfSU5DTFVERV9ESVJ9KQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjJfbGluZWFyIG1haW5fbGluZWFyLmNwcCkKKyAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4yX3ZlY21hdCBtYWluX3ZlY21hdC5jcHApCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuMl9tYXRtYXQgbWFpbl9tYXRtYXQuY3BwKQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjJfYWR2IG1haW5fYWR2LmNwcCAgICAgICkKKworICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4yX2xpbmVhciBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMiIpCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjJfdmVjbWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9ZWlnZW4yIikKKyAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuMl9tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1EQlRMX1BSRUZJWD1laWdlbjIiKQorICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4yX2FkdiAgICBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMiIpCisKKyAgYnRsX2FkZF9iZW5jaChidGxfdGlueV9laWdlbjIgYnRsX3RpbnlfZWlnZW4yLmNwcCBPRkYpCisKK2VuZGlmKCkgIyBFSUdFTjJfRk9VTkQKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL2J0bF90aW55X2VpZ2VuMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MTViZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInN0YXRpYy9iZW5jaF9zdGF0aWMuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9heHB5LmhoIgorI2luY2x1ZGUgImFjdGlvbl9sdV9zb2x2ZS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXRhX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2FhdF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hdHZfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworCisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F0dl9wcm9kdWN0LGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fY2hvbGVza3ksZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl90cmlzb2x2ZSxlaWdlbjJfaW50ZXJmYWNlPigpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL2VpZ2VuMl9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlYWJkYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTY4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgRUlHRU4yX0lOVEVSRkFDRV9ISAorI2RlZmluZSBFSUdFTjJfSU5URVJGQUNFX0hICisvLyAjaW5jbHVkZSA8Y2JsYXMuaD4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJidGwuaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbCwgaW50IFNJWkU9RHluYW1pYz4KK2NsYXNzIGVpZ2VuMl9pbnRlcmZhY2UKK3sKKworcHVibGljIDoKKworICBlbnVtIHtJc0ZpeGVkU2l6ZSA9IChTSVpFIT1EeW5hbWljKX07CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLFNJWkU+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLDE+IGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKQorICAgIGlmIChTSVpFPT1EeW5hbWljKSByZXR1cm4gImVpZ2VuMiI7IGVsc2UgcmV0dXJuICJ0aW55X2VpZ2VuMiI7CisgICAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQykgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfVlNYKQorICAgIGlmIChTSVpFPT1EeW5hbWljKSByZXR1cm4gImVpZ2VuMiI7IGVsc2UgcmV0dXJuICJ0aW55X2VpZ2VuMiI7CisgICAgI2Vsc2UKKyAgICBpZiAoU0laRT09RHluYW1pYykgcmV0dXJuICJlaWdlbjJfbm92ZWMiOyBlbHNlIHJldHVybiAidGlueV9laWdlbjJfbm92ZWMiOworICAgICNlbmRpZgorICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTikge30KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpIHt9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQS5yZXNpemUoQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpOworCisgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKyl7CisgICAgICBmb3IgKGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKXsKKyAgICAgICAgQS5jb2VmZlJlZihpLGopID0gQV9zdGxbal1baV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSwxKTsKKworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQi5jb2VmZlJlZihpKSA9IEJfc3RsW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCX3N0bFtpXSA9IEIuY29lZmYoaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTj1BX3N0bC5zaXplKCk7CisKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICAgIEFfc3RsW2pdW2ldID0gQS5jb2VmZihpLGopOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAoQSpCKS5sYXp5KCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAoQS50cmFuc3Bvc2UoKSpCLnRyYW5zcG9zZSgpKS5sYXp5KCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gKEEudHJhbnNwb3NlKCkqQSkubGF6eSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IChBKkEudHJhbnNwb3NlKCkpLmxhenkoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSAoQSpCKS8qLmxhenkoKSovOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYID0gKEEudHJhbnNwb3NlKCkqQikvKi5sYXp5KCkqLzsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZICs9IGNvZWYgKiBYOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkgPSBhKlggKyBiKlk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGNpYmxlID0gc291cmNlOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTil7CisgICAgWCA9IEwudGVtcGxhdGUgbWFya2VkPExvd2VyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIoQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXJfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgTil7CisgICAgWCA9IEwudGVtcGxhdGUgbWFya2VkPExvd2VyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIoQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBDID0gWC5sbHQoKS5tYXRyaXhMKCk7CisvLyAgICAgQyA9IFg7CisvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZShDKTsKKy8vICAgICBDaG9sZXNreTxnZW5lX21hdHJpeD46OmNvbXB1dGVJblBsYWNlQmxvY2soQyk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgQyA9IFgubHUoKS5tYXRyaXhMVSgpOworLy8gICAgIEMgPSBYLmludmVyc2UoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBDID0gVHJpZGlhZ29uYWxpemF0aW9uPGdlbmVfbWF0cml4PihYKS5wYWNrZWRNYXRyaXgoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgQyA9IEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPGdlbmVfbWF0cml4PihYKS5wYWNrZWRNYXRyaXgoKTsKKyAgfQorCisKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9hZHYuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fYWR2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMzNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fYWR2LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiZWlnZW4yX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fdHJpc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlX21hdHJpeC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2hlc3NlbmJlcmcuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2x1X2RlY29tcC5oaCIKKy8vICNpbmNsdWRlICJhY3Rpb25fcGFydGlhbF9sdS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZV9tYXRyaXg8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9sdV9kZWNvbXA8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25faGVzc2VuYmVyZzxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fbGluZWFyLmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2xpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3ZDE2YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2xpbmVhci5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuMl9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaDxBY3Rpb25fYXhweTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICAKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fbWF0bWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX21hdG1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZGM5YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX21hdG1hdC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuMl9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl90cm1tPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fdmVjbWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX3ZlY21hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2NmNkMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX3ZlY21hdC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuMl9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX3N5bXY8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX3N5cjI8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2dlcjxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNhZTIzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjUgQEAKKworCitpZigoTk9UIEVJR0VOM19JTkNMVURFX0RJUikgQU5EIEVpZ2VuX1NPVVJDRV9ESVIpCisgICMgdW5sZXNzIEVJR0VOM19JTkNMVURFX0RJUiBpcyBkZWZpbmVkLCBsZXQncyB1c2UgY3VycmVudCBFaWdlbiB2ZXJzaW9uCisgIHNldChFSUdFTjNfSU5DTFVERV9ESVIgJHtFaWdlbl9TT1VSQ0VfRElSfSkKKyAgc2V0KEVJR0VOM19GT1VORCBUUlVFKQorZWxzZSgpCisgIGZpbmRfcGFja2FnZShFaWdlbjMpCitlbmRpZigpCisKK2lmIChFSUdFTjNfRk9VTkQpCisKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0VJR0VOM19JTkNMVURFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19saW5lYXIgbWFpbl9saW5lYXIuY3BwKQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfdmVjbWF0IG1haW5fdmVjbWF0LmNwcCkKKyAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4zX21hdG1hdCBtYWluX21hdG1hdC5jcHApCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19hZHYgbWFpbl9hZHYuY3BwICAgICAgKQorCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbGluZWFyIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9ZWlnZW4zIikKKyAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM192ZWNtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1EQlRMX1BSRUZJWD1laWdlbjMiKQorICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX21hdG1hdCBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMyIpCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfYWR2ICAgIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9ZWlnZW4zIikKKworICBvcHRpb24oQlRMX0JFTkNIX05PR0NDVkVDICJhbHNvIGJlbmNoIEVpZ2VuIGV4cGxpY2l0IHZlYyB3aXRob3V0IEdDQydzIGF1dG8gdmVjIiBPRkYpCisgIGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBBTkQgQlRMX0JFTkNIX05PR0NDVkVDKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub2djY3ZlY19saW5lYXIgbWFpbl9saW5lYXIuY3BwKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub2djY3ZlY192ZWNtYXQgbWFpbl92ZWNtYXQuY3BwKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub2djY3ZlY19tYXRtYXQgbWFpbl9tYXRtYXQuY3BwKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub2djY3ZlY19hZHYgICAgbWFpbl9hZHYuY3BwICAgKQorCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM19ub2djY3ZlY19saW5lYXIgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPWVpZ2VuM19ub2djY3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM19ub2djY3ZlY192ZWNtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPWVpZ2VuM19ub2djY3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM19ub2djY3ZlY19tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPWVpZ2VuM19ub2djY3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM19ub2djY3ZlY19hZHYgICAgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPWVpZ2VuM19ub2djY3ZlYyIpCisgIGVuZGlmKCkKKworCisgIGlmKE5PVCBCVExfTk9WRUMpCisgICAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4zX25vdmVjX2xpbmVhciBtYWluX2xpbmVhci5jcHAgT0ZGKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub3ZlY192ZWNtYXQgbWFpbl92ZWNtYXQuY3BwIE9GRikKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm92ZWNfbWF0bWF0IG1haW5fbWF0bWF0LmNwcCBPRkYpCisgICAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4zX25vdmVjX2FkdiBtYWluX2Fkdi5jcHAgICAgICAgT0ZGKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm92ZWNfbGluZWFyIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIC1EQlRMX1BSRUZJWD1laWdlbjNfbm92ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm92ZWNfdmVjbWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIC1EQlRMX1BSRUZJWD1laWdlbjNfbm92ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm92ZWNfbWF0bWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIC1EQlRMX1BSRUZJWD1laWdlbjNfbm92ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm92ZWNfYWR2ICAgIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIC1EQlRMX1BSRUZJWD1laWdlbjNfbm92ZWMiKQorCisjICAgICBpZihCVUlMRF9idGxfZWlnZW4zX2FkdikKKyMgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9laWdlbjNfYWR2ICR7TUtMX0xJQlJBUklFU30pCisjICAgICBlbmRpZihCVUlMRF9idGxfZWlnZW4zX2FkdikKKworICBlbmRpZihOT1QgQlRMX05PVkVDKQorCisgIGJ0bF9hZGRfYmVuY2goYnRsX3RpbnlfZWlnZW4zIGJ0bF90aW55X2VpZ2VuMy5jcHAgT0ZGKQorCisgIGlmKE5PVCBCVExfTk9WRUMpCisgICAgYnRsX2FkZF9iZW5jaChidGxfdGlueV9laWdlbjNfbm92ZWMgYnRsX3RpbnlfZWlnZW4zLmNwcCBPRkYpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RpbnlfZWlnZW4zX25vdmVjICAgIENPTVBJTEVfRkxBR1MgIi1EQlRMX1BSRUZJWD1laWdlbjNfdGlueSIpCisKKyAgICBpZihCVUlMRF9idGxfdGlueV9laWdlbjNfbm92ZWMpCisgICAgICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfdGlueV9laWdlbjNfbm92ZWMgICAgQ09NUElMRV9GTEFHUyAiLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtREJUTF9QUkVGSVg9ZWlnZW4zX3Rpbnlfbm92ZWMiKQorICAgIGVuZGlmKEJVSUxEX2J0bF90aW55X2VpZ2VuM19ub3ZlYykKKyAgZW5kaWYoTk9UIEJUTF9OT1ZFQykKKworZW5kaWYgKEVJR0VOM19GT1VORCkKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9idGxfdGlueV9laWdlbjMuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2J0bF90aW55X2VpZ2VuMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MTViZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9idGxfdGlueV9laWdlbjMuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInN0YXRpYy9iZW5jaF9zdGF0aWMuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9heHB5LmhoIgorI2luY2x1ZGUgImFjdGlvbl9sdV9zb2x2ZS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXRhX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2FhdF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hdHZfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworCisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F0dl9wcm9kdWN0LGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fY2hvbGVza3ksZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl90cmlzb2x2ZSxlaWdlbjJfaW50ZXJmYWNlPigpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9laWdlbjNfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2VpZ2VuM19pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyMWZkNwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9laWdlbjNfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMjQwIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEVJR0VOM19JTlRFUkZBQ0VfSEgKKyNkZWZpbmUgRUlHRU4zX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8RWlnZW4vRWlnZW4+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImJ0bC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZTxjbGFzcyByZWFsLCBpbnQgU0laRT1EeW5hbWljPgorY2xhc3MgZWlnZW4zX2ludGVyZmFjZQoreworCitwdWJsaWMgOgorCisgIGVudW0ge0lzRml4ZWRTaXplID0gKFNJWkUhPUR5bmFtaWMpfTsKKworICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OworCisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxyZWFsLFNJWkUsU0laRT4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxyZWFsLFNJWkUsMT4gZ2VuZV92ZWN0b3I7CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiBFSUdFTl9NQUtFU1RSSU5HKEJUTF9QUkVGSVgpOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiAvKkEqLywgaW50IC8qTiovKSB7fQorCisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgLypCKi8pIHt9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQS5yZXNpemUoQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKyl7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKXsKKyAgICAgICAgQS5jb2VmZlJlZihpLGopID0gQV9zdGxbal1baV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSwxKTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQi5jb2VmZlJlZihpKSA9IEJfc3RsW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCX3N0bFtpXSA9IEIuY29lZmYoaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgIE49QV9zdGwuc2l6ZSgpOworCisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEuY29lZmYoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCAgLypOKi8peworICAgIFgubm9hbGlhcygpID0gQSpCOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZWRfbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCAgLypOKi8peworICAgIFgubm9hbGlhcygpID0gQS50cmFuc3Bvc2UoKSpCLnRyYW5zcG9zZSgpOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgIC8qTiovKXsKKy8vICAgICBYLm5vYWxpYXMoKSA9IEEudHJhbnNwb3NlKCkqQTsKKy8vICAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50ICAvKk4qLyl7CisgICAgWC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgWC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShBKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50ICAvKk4qLyl7CisgICAgWC5ub2FsaWFzKCkgPSBBKkI7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgc3ltdihjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgIC8qTiovKXsKKyAgICBYLm5vYWxpYXMoKSA9IChBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIEIpOworLy8gICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcjxyZWFsLDAsTG93ZXJUcmlhbmd1bGFyQml0LGZhbHNlLGZhbHNlPihOLEEuZGF0YSgpLE4sIEIuZGF0YSgpLCAxLCBYLmRhdGEoKSwgMSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBTcmM+IHN0YXRpYyB2b2lkIHRyaWFzc2lnbihEZXN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBzaXplb2YoUGFja2V0KS9zaXplb2YoU2NhbGFyKTsKKyAgICBpbnQgc2l6ZSA9IGRzdC5jb2xzKCk7CisgICAgZm9yKGludCBqPTA7IGo8c2l6ZTsgais9MSkKKyAgICB7CisvLyAgICAgICBjb25zdCBpbnQgYWxpZ25lZEVuZCA9IGFsaWduZWRTdGFydCArICgoaW5uZXJTaXplLWFsaWduZWRTdGFydCkgJiB+cGFja2V0QWxpZ25lZE1hc2spOworICAgICAgU2NhbGFyKiBBMCA9IGRzdC5kYXRhKCkgKyBqKmRzdC5zdHJpZGUoKTsKKyAgICAgIGludCBzdGFydGkgPSBqOworICAgICAgaW50IGFsaWduZWRFbmQgPSBzdGFydGk7CisgICAgICBpbnQgYWxpZ25lZFN0YXJ0ID0gKHN0YXJ0aSkgKyBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmQTBbc3RhcnRpXSwgc2l6ZS1zdGFydGkpOworICAgICAgYWxpZ25lZEVuZCA9IGFsaWduZWRTdGFydCArICgoc2l6ZS1hbGlnbmVkU3RhcnQpLygyKlBhY2tldFNpemUpKSooUGFja2V0U2l6ZSoyKTsKKworICAgICAgLy8gZG8gdGhlIG5vbi12ZWN0b3JpemFibGUgcGFydCBvZiB0aGUgYXNzaWdubWVudAorICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydGk7IGluZGV4PGFsaWduZWRTdGFydCA7ICsraW5kZXgpCisgICAgICB7CisgICAgICAgIGlmKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOworICAgICAgfQorCisgICAgICAvLyBkbyB0aGUgdmVjdG9yaXphYmxlIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQKKyAgICAgIGZvciAoaW50IGluZGV4ID0gYWxpZ25lZFN0YXJ0OyBpbmRleDxhbGlnbmVkRW5kOyBpbmRleCs9UGFja2V0U2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpCisgICAgICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8U3JjLCBBbGlnbmVkLCBVbmFsaWduZWQ+KGosIGluZGV4LCBzcmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8U3JjLCBBbGlnbmVkLCBVbmFsaWduZWQ+KGluZGV4LCBqLCBzcmMpOworICAgICAgfQorCisgICAgICAvLyBkbyB0aGUgbm9uLXZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IgKGludCBpbmRleCA9IGFsaWduZWRFbmQ7IGluZGV4PHNpemU7ICsraW5kZXgpCisgICAgICB7CisgICAgICAgIGlmKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOworICAgICAgfQorICAgICAgLy9kc3QuY29sKGopLnRhaWwoTi1qKSA9IHNyYy5jb2woaikudGFpbChOLWopOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHN5cjIoZ2VuZV9tYXRyaXggJiBBLCAgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCAgTil7CisgICAgLy8gaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfcmFuazJfdXBkYXRlPHJlYWwsMCxMb3dlclRyaWFuZ3VsYXJCaXQ+KE4sQS5kYXRhKCksTiwgWC5kYXRhKCksIDEsIFkuZGF0YSgpLCAxLCAtMSk7CisgICAgZm9yKGludCBqPTA7IGo8TjsgKytqKQorICAgICAgQS5jb2woaikudGFpbChOLWopICs9IFhbal0gKiBZLnRhaWwoTi1qKSArIFlbal0gKiBYLnRhaWwoTi1qKTsKKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlcihnZW5lX21hdHJpeCAmIEEsICBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50ICBOKXsKKyAgICBmb3IoaW50IGo9MDsgajxOOyArK2opCisgICAgICBBLmNvbChqKSArPSBYICogWVtqXTsKKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJvdChnZW5lX3ZlY3RvciAmIEEsICBnZW5lX3ZlY3RvciAmIEIsIHJlYWwgYywgcmVhbCBzLCBpbnQgIC8qTiovKXsKKyAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKEEsIEIsIEphY29iaVJvdGF0aW9uPHJlYWw+KGMscykpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCAgLypOKi8peworICAgIFgubm9hbGlhcygpID0gKEEudHJhbnNwb3NlKCkqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgIC8qTiovKXsKKyAgICBZICs9IGNvZWYgKiBYOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50ICAvKk4qLyl7CisgICAgWSA9IGEqWCArIGIqWTsKKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50ICAvKk4qLyl7CisgICAgWCA9IEwudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUoQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXJfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgIC8qTiovKXsKKyAgICBYID0gTC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cm1tKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgIC8qTiovKXsKKyAgICBYLm5vYWxpYXMoKSA9IEwudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBCOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgIC8qTiovKXsKKyAgICBDID0gWDsKKyAgICBpbnRlcm5hbDo6bGx0X2lucGxhY2U8cmVhbCxMb3dlcj46OmJsb2NrZWQoQyk7CisgICAgLy9DID0gWC5sbHQoKS5tYXRyaXhMKCk7CisvLyAgICAgQyA9IFg7CisvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZShDKTsKKy8vICAgICBDaG9sZXNreTxnZW5lX21hdHJpeD46OmNvbXB1dGVJblBsYWNlQmxvY2soQyk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgIC8qTiovKXsKKyAgICBDID0gWC5mdWxsUGl2THUoKS5tYXRyaXhMVSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHBhcnRpYWxfbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgIE4peworICAgIE1hdHJpeDxEZW5zZUluZGV4LDEsRHluYW1pYz4gcGl2KE4pOworICAgIERlbnNlSW5kZXggbmI7CisgICAgQyA9IFg7CisgICAgaW50ZXJuYWw6OnBhcnRpYWxfbHVfaW5wbGFjZShDLHBpdixuYik7CisvLyAgICAgQyA9IFgucGFydGlhbFBpdkx1KCkubWF0cml4TFUoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCAgTil7CisgICAgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uPGdlbmVfbWF0cml4Pjo6Q29lZmZWZWN0b3JUeXBlIGF1eChOLTEpOworICAgIEMgPSBYOworICAgIGludGVybmFsOjp0cmlkaWFnb25hbGl6YXRpb25faW5wbGFjZShDLCBhdXgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCAgLypOKi8peworICAgIEMgPSBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxnZW5lX21hdHJpeD4oWCkucGFja2VkTWF0cml4KCk7CisgIH0KKworCisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fYWR2LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2Fkdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4NjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2Fkdi5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuM19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlLmhoIgorI2luY2x1ZGUgImFjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgiCisjaW5jbHVkZSAiYWN0aW9uX2Nob2xlc2t5LmhoIgorI2luY2x1ZGUgImFjdGlvbl9oZXNzZW5iZXJnLmhoIgorI2luY2x1ZGUgImFjdGlvbl9sdV9kZWNvbXAuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3BhcnRpYWxfbHUuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmVfbWF0cml4PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9jaG9sZXNreTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fbHVfZGVjb21wPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisKKy8vICAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2xpbmVhci5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9saW5lYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTM4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9saW5lYXIuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3JvdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX21hdG1hdC5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9tYXRtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmZhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9tYXRtYXQuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJtbTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX3ZlY21hdC5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl92ZWNtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl92ZWNtYXQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeW12PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeXIyPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9nZXI8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9nbW0vQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9nbW0vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNTg2MgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2dtbS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKKworZmluZF9wYWNrYWdlKEdNTSkKK2lmIChHTU1fRk9VTkQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtHTU1fSU5DTFVERVN9KQorICBidGxfYWRkX2JlbmNoKGJ0bF9nbW0gbWFpbi5jcHApCitlbmRpZiAoR01NX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9MVV9zb2x2ZV9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9nbW0vZ21tX0xVX3NvbHZlX2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I5ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxOTIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzEgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAorI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgImJsaXR6L2FycmF5LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UgOiBwdWJsaWMgYmxpdHpfaW50ZXJmYWNlPHJlYWw+Cit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CisKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKworICBpbmxpbmUgc3RhdGljIHZvaWQgbmV3X1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCxpbnQgTikKKyAgeworCisgICAgcGl2b3QucmVzaXplKE4pOworCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QpCisgIHsKKyAgICAKKyAgICByZXR1cm47CisKKyAgfQorCisKKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCkKKyAgeworICAgIAorICAgIHJlYWwgc29tbWU9MC47CisgICAgCisgICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7CisJCisJc29tbWUrPUEocm93LGopKkIoaik7CisJCisgICAgfQorCisgICAgcmV0dXJuIHNvbW1lOworCisgIH0KKworCisKKworICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmIEEsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBnZW5lX21hdHJpeCAmIEIsIGludCByb3dfc2hpZnQsIGludCBjb2wgKQorICB7CisgICAgCisgICAgcmVhbCBzb21tZT0wLjsKKyAgICAKKyAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKKwkKKwlzb21tZSs9QShyb3csaikqQihqK3Jvd19zaGlmdCxjb2wpOworCQorICAgIH0KKworICAgIHJldHVybiBzb21tZTsKKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmIExVLCBQaXZvdF9WZWN0b3IgJiBwaXZvdCwgaW50IE4pCisgIHsKKworICAgIEFTU0VSVCggTFUucm93cygpPT1MVS5jb2xzKCkgKSA7CisgICAgaW50IGluZGV4X21heCA9IDAgOworICAgIHJlYWwgYmlnID0gMC4gOworICAgIHJlYWwgdGhlU3VtID0gMC4gOworICAgIHJlYWwgZHVtID0gMC4gOworICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6CisgICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOworICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgeworCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgICAgfQorICAgICAgaWYoIGJpZz09MC4gKSB7CisJSU5GT1MoICJibGl0el9MVV9mYWN0b3I6OlNpbmd1bGFyIG1hdHJpeCIgKSA7CisJZXhpdCggMCApIDsKKyAgICAgIH0KKyAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICB9CisgICAgLy8gTG9vcCBvdmVyIGNvbHVtbnMgb2YgQ3JvdXQncyBtZXRob2QgOgorICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7CisgICAgICBmb3IoIGludCBpPTA7IGk8ajsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCA6CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBpPWo7IGk8TjsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBqLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisJaWYoIChJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApKT49YmlnICkgeworCSAgZHVtID0gSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSA7CisJICBiaWcgPSBkdW0gOworCSAgaW5kZXhfbWF4ID0gaSA7CisJfQorICAgICAgfQorICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKKyAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7CisJZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKKwkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7CisJICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKKwkgIExVKCBqLCBrICkgPSBkdW0gOworCX0KKwlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgfQorICAgICAgcGl2b3QoIGogKSA9IGluZGV4X21heCA7CisgICAgICBpZiAoIExVKCBqLCBqICk9PTAuICkgTFUoIGosIGogKSA9IDEuZS0yMCA7CisgICAgICAvLyBEaXZpZGUgYnkgdGhlIHBpdm90IGVsZW1lbnQgOgorICAgICAgaWYoIGo8TiApIHsKKwlkdW0gPSAxLi9MVSggaiwgaiApIDsKKwlmb3IoIGludCBpPWorMTsgaTxOOyBpKysgKSBMVSggaSwgaiApICo9IGR1bSA7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJiBMVSwgY29uc3QgUGl2b3RfVmVjdG9yIHBpdm90LCBnZW5lX3ZlY3RvciAmQiwgZ2VuZV92ZWN0b3IgWCwgaW50IE4pCisgIHsKKworICAgIC8vIFBvdXIgY29uc2VydmVyIGxlIG1lbWUgaGVhZGVyLCBvbiB0cmF2YWlsbGUgc3VyIFgsIGNvcGllIGR1IHNlY29uZC1tZW1icmUgQgorICAgIFggPSBCLmNvcHkoKSA7CisgICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKKyAgICBmaXJzdEluZGV4IGluZEkgOworICAgIC8vIEZvcndhcmQgc3Vic3RpdHV0aW9uIDoKKyAgICBpbnQgaWkgPSAwIDsKKyAgICByZWFsIHRoZVN1bSA9IDAuIDsKKyAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgeworICAgICAgaW50IGlwID0gcGl2b3QoIGkgKSA7CisgICAgICB0aGVTdW0gPSBYKCBpcCApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7CisgICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7CisgICAgICBpZiggaWkgKSB7CisJdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKKwlpaSA9IGkrMSA7CisgICAgICB9CisgICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0gOworICAgIH0KKyAgICAvLyBCYWNrc3Vic3RpdHV0aW9uIDoKKyAgICBmb3IoIGludCBpPU4tMTsgaT49MDsgaS0tICkgeworICAgICAgdGhlU3VtID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpYKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqQiggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOworICAgICAgLy8gU3RvcmUgYSBjb21wb25lbnQgb2YgdGhlIHNvbHV0aW9uIHZlY3RvciA6CisgICAgICBYKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CisgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICB9CisKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1faW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhMzAzYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1faW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEdNTV9JTlRFUkZBQ0VfSEgKKyNkZWZpbmUgR01NX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8Z21tL2dtbS5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIGdtbTsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbD4KK2NsYXNzIGdtbV9pbnRlcmZhY2UgeworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiBnbW06OmRlbnNlX21hdHJpeDxyZWFsPiBnZW5lX21hdHJpeDsKKyAgdHlwZWRlZiBzdGxfdmVjdG9yIGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImdtbSI7CisgIH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXsKKyAgICByZXR1cm4gOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKKyAgICByZXR1cm4gOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQS5yZXNpemUoQV9zdGxbMF0uc2l6ZSgpLEFfc3RsLnNpemUoKSk7CisKKyAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspeworICAgICAgICBBKGksaikgPSBBX3N0bFtqXVtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCID0gQl9zdGw7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQl9zdGwgPSBCOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIGludCBOPUFfc3RsLnNpemUoKTsKKworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgZ21tOjptdWx0KEEsQiwgWCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQoQSksZ21tOjp0cmFuc3Bvc2VkKEIpLCBYKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQoQSksQSwgWCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBnbW06Om11bHQoQSxnbW06OnRyYW5zcG9zZWQoQSksIFgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgZ21tOjptdWx0KEEsQixYKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChBKSxCLFgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIGdtbTo6YWRkKGdtbTo6c2NhbGVkKFgsY29lZiksIFkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIGdtbTo6YWRkKGdtbTo6c2NhbGVkKFgsYSksIGdtbTo6c2NhbGVkKFksYiksIFkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgZ21tOjpjb3B5KHNvdXJjZSxjaWJsZSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBnbW06OmNvcHkoc291cmNlLGNpYmxlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBnbW06OmNvcHkoQixYKTsKKyAgICBnbW06Omxvd2VyX3RyaV9zb2x2ZShMLCBYLCBmYWxzZSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgcGFydGlhbF9sdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIFIsIGludCBOKXsKKyAgICBnbW06OmNvcHkoWCxSKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlwdnQoTik7CisgICAgZ21tOjpsdV9mYWN0b3IoUiwgaXB2dCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgaGVzc2VuYmVyZyhjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4peworICAgIGdtbTo6Y29weShYLFIpOworICAgIGdtbTo6SGVzc2VuYmVyZ19yZWR1Y3Rpb24oUixYLGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIFIsIGludCBOKXsKKyAgICBnbW06OmNvcHkoWCxSKTsKKyAgICBnbW06OkhvdXNlaG9sZGVyX3RyaWRpYWdvbmFsaXphdGlvbihSLFgsZmFsc2UpOworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZ21tL21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvZ21tL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGMwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9nbW0vbWFpbi5jcHAKQEAgLTAsMCArMSw1MSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImdtbV9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKyNpbmNsdWRlICJhY3Rpb25faGVzc2VuYmVyZy5oaCIKKyNpbmNsdWRlICJhY3Rpb25fcGFydGlhbF9sdS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaDxBY3Rpb25fYXhweTxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIC8vYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fcGFydGlhbF9sdTxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICAKKyAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL210bDQvLmtkYmdyYy5tYWluIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC8ua2RiZ3JjLm1haW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMDgyZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvLmtkYmdyYy5tYWluCkBAIC0wLDAgKzEsMTIgQEAKK1tHZW5lcmFsXQorRGVidWdnZXJDbWRTdHI9CitEcml2ZXJOYW1lPUdEQgorRmlsZVZlcnNpb249MQorT3B0aW9uc1NlbGVjdGVkPQorUHJvZ3JhbUFyZ3M9CitUVFlMZXZlbD03CitXb3JraW5nRGlyZWN0b3J5PQorCitbTWVtb3J5XQorQ29sdW1uV2lkdGhzPTgwLDAKK051bUV4cHJzPTAKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL210bDQvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9tdGw0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9tdGw0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorCitmaW5kX3BhY2thZ2UoTVRMNCkKK2lmIChNVEw0X0ZPVU5EKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TVRMNF9JTkNMVURFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX210bDQgbWFpbi5jcHApCitlbmRpZiAoTVRMNF9GT1VORCkKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL210bDQvbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy9tdGw0L21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZmNmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9tdGw0L21haW4uY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJtdGw0X2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJiYXNpY19hY3Rpb25zLmhoIgorI2luY2x1ZGUgImFjdGlvbl9jaG9sZXNreS5oaCIKKy8vICNpbmNsdWRlICJhY3Rpb25fbHVfZGVjb21wLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworCisgIGJlbmNoPEFjdGlvbl9heHB5PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fbHVfZGVjb21wPG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9MVV9zb2x2ZV9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfTFVfc29sdmVfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjlmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfTFVfc29sdmVfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTkyIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjMxIENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2lmbmRlZiBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKKyNkZWZpbmUgQkxJVFpfTFVfU09MVkVfSU5URVJGQUNFX0hICisKKyNpbmNsdWRlICJibGl0ei9hcnJheS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQorCit0ZW1wbGF0ZTxjbGFzcyByZWFsPgorY2xhc3MgYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlIDogcHVibGljIGJsaXR6X2ludGVyZmFjZTxyZWFsPgoreworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgdHlwZW5hbWUgYmxpdHpfaW50ZXJmYWNlPHJlYWw+OjpnZW5lX21hdHJpeCBnZW5lX21hdHJpeDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfdmVjdG9yIGdlbmVfdmVjdG9yOworCisgIHR5cGVkZWYgYmxpdHo6OkFycmF5PGludCwxPiBQaXZvdF9WZWN0b3I7CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIG5ld19QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QsaW50IE4pCisgIHsKKworICAgIHBpdm90LnJlc2l6ZShOKTsKKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIGZyZWVfUGl2b3RfVmVjdG9yKFBpdm90X1ZlY3RvciAmIHBpdm90KQorICB7CisgICAgCisgICAgcmV0dXJuOworCisgIH0KKworCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgQiwgaW50IHJvdywgaW50IGNvbF9zdGFydCwgaW50IGNvbF9lbmQpCisgIHsKKyAgICAKKyAgICByZWFsIHNvbW1lPTAuOworICAgIAorICAgIGZvciAoaW50IGo9Y29sX3N0YXJ0IDsgajxjb2xfZW5kKzEgOyBqKyspeworCQorCXNvbW1lKz1BKHJvdyxqKSpCKGopOworCQorICAgIH0KKworICAgIHJldHVybiBzb21tZTsKKworICB9CisKKworCisKKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoZ2VuZV9tYXRyaXggJiBBLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCwgZ2VuZV9tYXRyaXggJiBCLCBpbnQgcm93X3NoaWZ0LCBpbnQgY29sICkKKyAgeworICAgIAorICAgIHJlYWwgc29tbWU9MC47CisgICAgCisgICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7CisJCisJc29tbWUrPUEocm93LGopKkIoaityb3dfc2hpZnQsY29sKTsKKwkKKyAgICB9CisKKyAgICByZXR1cm4gc29tbWU7CisKKyAgfQorCisgIGlubGluZSBzdGF0aWMgdm9pZCBMVV9mYWN0b3IoZ2VuZV9tYXRyaXggJiBMVSwgUGl2b3RfVmVjdG9yICYgcGl2b3QsIGludCBOKQorICB7CisKKyAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOworICAgIGludCBpbmRleF9tYXggPSAwIDsKKyAgICByZWFsIGJpZyA9IDAuIDsKKyAgICByZWFsIHRoZVN1bSA9IDAuIDsKKyAgICByZWFsIGR1bSA9IDAuIDsKKyAgICAvLyBHZXQgdGhlIGltcGxpY2l0IHNjYWxpbmcgaW5mb3JtYXRpb24gOgorICAgIGdlbmVfdmVjdG9yIEltcGxpY2l0U2NhbGluZyggTiApIDsKKyAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgeworICAgICAgYmlnID0gMC4gOworICAgICAgZm9yKCBpbnQgaj0wOyBqPE47IGorKyApIHsKKwlpZiggYWJzKCBMVSggaSwgaiApICk+PWJpZyApIGJpZyA9IGFicyggTFUoIGksIGogKSApIDsKKyAgICAgIH0KKyAgICAgIGlmKCBiaWc9PTAuICkgeworCUlORk9TKCAiYmxpdHpfTFVfZmFjdG9yOjpTaW5ndWxhciBtYXRyaXgiICkgOworCWV4aXQoIDAgKSA7CisgICAgICB9CisgICAgICBJbXBsaWNpdFNjYWxpbmcoIGkgKSA9IDEuL2JpZyA7CisgICAgfQorICAgIC8vIExvb3Agb3ZlciBjb2x1bW5zIG9mIENyb3V0J3MgbWV0aG9kIDoKKyAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgeworICAgICAgZm9yKCBpbnQgaT0wOyBpPGo7IGkrKyApIHsKKwl0aGVTdW0gPSBMVSggaSwgaiApIDsKKwl0aGVTdW0gLT0gbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChMVSwgaSwgMCwgaS0xLCBMVSwgMCwgaikgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggZnJvbVN0YXJ0LCBpLTEgKSApKkxVKCBSYW5nZSggZnJvbVN0YXJ0LCBpLTEgKSwgaiApICkgOworCUxVKCBpLCBqICkgPSB0aGVTdW0gOworICAgICAgfQorICAgICAgCisgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBsYXJnZXN0IHBpdm90IGVsZW1lbnQgOgorICAgICAgYmlnID0gMC4gOworICAgICAgZm9yKCBpbnQgaT1qOyBpPE47IGkrKyApIHsKKwl0aGVTdW0gPSBMVSggaSwgaiApIDsKKwl0aGVTdW0gLT0gbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChMVSwgaSwgMCwgai0xLCBMVSwgMCwgaikgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggZnJvbVN0YXJ0LCBqLTEgKSApKkxVKCBSYW5nZSggZnJvbVN0YXJ0LCBqLTEgKSwgaiApICkgOworCUxVKCBpLCBqICkgPSB0aGVTdW0gOworCWlmKCAoSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSk+PWJpZyApIHsKKwkgIGR1bSA9IEltcGxpY2l0U2NhbGluZyggaSApKmFicyggdGhlU3VtICkgOworCSAgYmlnID0gZHVtIDsKKwkgIGluZGV4X21heCA9IGkgOworCX0KKyAgICAgIH0KKyAgICAgIC8vIEludGVyY2hhbmdpbmcgcm93cyBhbmQgdGhlIHNjYWxlIGZhY3RvciA6CisgICAgICBpZiggaiE9aW5kZXhfbWF4ICkgeworCWZvciggaW50IGs9MDsgazxOOyBrKysgKSB7CisJICBkdW0gPSBMVSggaW5kZXhfbWF4LCBrICkgOworCSAgTFUoIGluZGV4X21heCwgayApID0gTFUoIGosIGsgKSA7CisJICBMVSggaiwgayApID0gZHVtIDsKKwl9CisJSW1wbGljaXRTY2FsaW5nKCBpbmRleF9tYXggKSA9IEltcGxpY2l0U2NhbGluZyggaiApIDsKKyAgICAgIH0KKyAgICAgIHBpdm90KCBqICkgPSBpbmRleF9tYXggOworICAgICAgaWYgKCBMVSggaiwgaiApPT0wLiApIExVKCBqLCBqICkgPSAxLmUtMjAgOworICAgICAgLy8gRGl2aWRlIGJ5IHRoZSBwaXZvdCBlbGVtZW50IDoKKyAgICAgIGlmKCBqPE4gKSB7CisJZHVtID0gMS4vTFUoIGosIGogKSA7CisJZm9yKCBpbnQgaT1qKzE7IGk8TjsgaSsrICkgTFUoIGksIGogKSAqPSBkdW0gOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX3NvbHZlKGNvbnN0IGdlbmVfbWF0cml4ICYgTFUsIGNvbnN0IFBpdm90X1ZlY3RvciBwaXZvdCwgZ2VuZV92ZWN0b3IgJkIsIGdlbmVfdmVjdG9yIFgsIGludCBOKQorICB7CisKKyAgICAvLyBQb3VyIGNvbnNlcnZlciBsZSBtZW1lIGhlYWRlciwgb24gdHJhdmFpbGxlIHN1ciBYLCBjb3BpZSBkdSBzZWNvbmQtbWVtYnJlIEIKKyAgICBYID0gQi5jb3B5KCkgOworICAgIEFTU0VSVCggTFUucm93cygpPT1MVS5jb2xzKCkgKSA7CisgICAgZmlyc3RJbmRleCBpbmRJIDsKKyAgICAvLyBGb3J3YXJkIHN1YnN0aXR1dGlvbiA6CisgICAgaW50IGlpID0gMCA7CisgICAgcmVhbCB0aGVTdW0gPSAwLiA7CisgICAgZm9yKCBpbnQgaT0wOyBpPE47IGkrKyApIHsKKyAgICAgIGludCBpcCA9IHBpdm90KCBpICkgOworICAgICAgdGhlU3VtID0gWCggaXAgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSA9IEIoIGlwICkgOworICAgICAgWCggaXAgKSA9IFgoIGkgKSA7CisgICAgICAvLyAgICAgIEIoIGlwICkgPSBCKCBpICkgOworICAgICAgaWYoIGlpICkgeworCXRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpaS0xLCBpLTEpIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqWCggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpaS0xLCBpLTEgKSApKkIoIFJhbmdlKCBpaS0xLCBpLTEgKSApICkgOworICAgICAgfSBlbHNlIGlmKCB0aGVTdW0gKSB7CisJaWkgPSBpKzEgOworICAgICAgfQorICAgICAgWCggaSApID0gdGhlU3VtIDsKKyAgICAgIC8vICAgICAgQiggaSApID0gdGhlU3VtIDsKKyAgICB9CisgICAgLy8gQmFja3N1YnN0aXR1dGlvbiA6CisgICAgZm9yKCBpbnQgaT1OLTE7IGk+PTA7IGktLSApIHsKKyAgICAgIHRoZVN1bSA9IFgoIGkgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSA9IEIoIGkgKSA7CisgICAgICB0aGVTdW0gLT0gbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChMVSwgWCwgaSwgaSsxLCBOKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqWCggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOworICAgICAgLy8gICAgICB0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGkrMSwgdG9FbmQgKSApKkIoIFJhbmdlKCBpKzEsIHRvRW5kICkgKSApIDsKKyAgICAgIC8vIFN0b3JlIGEgY29tcG9uZW50IG9mIHRoZSBzb2x1dGlvbiB2ZWN0b3IgOgorICAgICAgWCggaSApID0gdGhlU3VtL0xVKCBpLCBpICkgOworICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CisgICAgfQorCisgIH0KKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC9tdGw0X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk1YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC9tdGw0X2ludGVyZmFjZS5oaApAQCAtMCwwICsxLDE0NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBNVEw0X0lOVEVSRkFDRV9ISAorI2RlZmluZSBNVEw0X0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9tdGwvbXRsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL210bC91dGlsaXR5L3JhbmdlX2dlbmVyYXRvci5ocHA+CisvLyAjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9tdGwvb3BlcmF0aW9uL2Nob2xlc2t5LmhwcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIG5hbWVzcGFjZSBtdGw7CisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBtdGw0X2ludGVyZmFjZSB7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIG10bDo6ZGVuc2UyRDxyZWFsLCBtdGw6Om1hdHJpeDo6cGFyYW1ldGVyczxtdGw6OnRhZzo6Y29sX21ham9yPiA+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIG10bDo6ZGVuc2VfdmVjdG9yPHJlYWw+ICBnZW5lX3ZlY3RvcjsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAibXRsNCI7IH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXsKKyAgICByZXR1cm4gOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKKyAgICByZXR1cm4gOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQS5jaGFuZ2VfZGltKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspeworICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7CisgICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIuY2hhbmdlX2RpbShCX3N0bC5zaXplKCkpOworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQltpXSA9IEJfc3RsW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEJfc3RsW2ldID0gQltpXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IChBKkIpOworLy8gICAgIG1vcnRvbl9kZW5zZTxkb3VibGUsIGRvcHBsZWRfNjRfcm93X21hc2s+IEMoTixOKTsKKy8vICAgICBDID0gQjsKKy8vICAgICBYID0gKEEqQyk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAodHJhbnMoQSkqdHJhbnMoQikpOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisvLyAgICAgWCA9ICh0cmFucyhBKSpBKTsKKy8vICAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAoQSp0cmFucyhBKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSAodHJhbnMoQSkqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZID0gYSpYICsgYipZOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisvLyAgICAgQyA9IFg7CisvLyAgICAgcmVjdXJzaXZlX2Nob2xlc2t5KEMpOworLy8gICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4peworLy8gICAgIFIgPSBYOworLy8gICAgIHN0ZDo6dmVjdG9yPGludD4gaXB2dChOKTsKKy8vICAgICBsdV9mYWN0b3IoUiwgaXB2dCk7CisvLyAgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9IGxvd2VyX3RyaXNvbHZlKEwsIEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDZkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDQgQEAKKworCitpZigoTk9UIFRFTlNPUl9JTkNMVURFX0RJUikgQU5EIEVpZ2VuX1NPVVJDRV9ESVIpCisgICMgdW5sZXNzIFRFTlNPUl9JTkNMVURFX0RJUiBpcyBkZWZpbmVkLCBsZXQncyB1c2UgY3VycmVudCBFaWdlbiB2ZXJzaW9uCisgIHNldChURU5TT1JfSU5DTFVERV9ESVIgJHtFaWdlbl9TT1VSQ0VfRElSfSkKKyAgc2V0KFRFTlNPUl9GT1VORCBUUlVFKQorZWxzZSgpCisgIGZpbmRfcGFja2FnZShUZW5zb3IpCitlbmRpZigpCisKK2lmIChURU5TT1JfRk9VTkQpCisKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1RFTlNPUl9JTkNMVURFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX3RlbnNvcl9saW5lYXIgbWFpbl9saW5lYXIuY3BwKQorICBidGxfYWRkX2JlbmNoKGJ0bF90ZW5zb3JfdmVjbWF0IG1haW5fdmVjbWF0LmNwcCkKKyAgYnRsX2FkZF9iZW5jaChidGxfdGVuc29yX21hdG1hdCBtYWluX21hdG1hdC5jcHApCisKKyAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9saW5lYXIgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1EQlRMX1BSRUZJWD10ZW5zb3IiKQorICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfdGVuc29yX3ZlY21hdCBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPXRlbnNvciIpCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF90ZW5zb3JfbWF0bWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9dGVuc29yIikKKworICBvcHRpb24oQlRMX0JFTkNIX05PR0NDVkVDICJhbHNvIGJlbmNoIEVpZ2VuIGV4cGxpY2l0IHZlYyB3aXRob3V0IEdDQydzIGF1dG8gdmVjIiBPRkYpCisgIGlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBBTkQgQlRMX0JFTkNIX05PR0NDVkVDKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX3RlbnNvcl9ub2djY3ZlY19saW5lYXIgbWFpbl9saW5lYXIuY3BwKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX3RlbnNvcl9ub2djY3ZlY192ZWNtYXQgbWFpbl92ZWNtYXQuY3BwKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX3RlbnNvcl9ub2djY3ZlY19tYXRtYXQgbWFpbl9tYXRtYXQuY3BwKQorCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub2djY3ZlY19saW5lYXIgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPXRlbnNvcl9ub2djY3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub2djY3ZlY192ZWNtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPXRlbnNvcl9ub2djY3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub2djY3ZlY19tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1mbm8tdHJlZS12ZWN0b3JpemUgLURCVExfUFJFRklYPXRlbnNvcl9ub2djY3ZlYyIpCisgIGVuZGlmKCkKKworCisgIGlmKE5PVCBCVExfTk9WRUMpCisgICAgYnRsX2FkZF9iZW5jaChidGxfdGVuc29yX25vdmVjX2xpbmVhciBtYWluX2xpbmVhci5jcHAgT0ZGKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX3RlbnNvcl9ub3ZlY192ZWNtYXQgbWFpbl92ZWNtYXQuY3BwIE9GRikKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF90ZW5zb3Jfbm92ZWNfbWF0bWF0IG1haW5fbWF0bWF0LmNwcCBPRkYpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub3ZlY19saW5lYXIgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLURCVExfUFJFRklYPXRlbnNvcl9ub3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub3ZlY192ZWNtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLURCVExfUFJFRklYPXRlbnNvcl9ub3ZlYyIpCisgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RlbnNvcl9ub3ZlY19tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLURCVExfUFJFRklYPXRlbnNvcl9ub3ZlYyIpCisKKyAgZW5kaWYoTk9UIEJUTF9OT1ZFQykKKworZW5kaWYgKFRFTlNPUl9GT1VORCkKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9saW5lYXIuY3BwIGIvYmVuY2gvYnRsL2xpYnMvdGVuc29ycy9tYWluX2xpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1N2YxZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9saW5lYXIuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9heHB5PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8dGVuc29yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbWF0bWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9tYXRtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWZjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbWF0bWF0LmNwcApAQCAtMCwwICsxLDIxIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidGVuc29yX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJiYXNpY19hY3Rpb25zLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fdmVjbWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl92ZWNtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjAwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fdmVjbWF0LmNwcApAQCAtMCwwICsxLDIxIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidGVuc29yX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJiYXNpY19hY3Rpb25zLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL3RlbnNvcl9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL3RlbnNvcl9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiOGUwZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvdGVuc29yX2ludGVyZmFjZS5oaApAQCAtMCwwICsxLDEwNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisvLworI2lmbmRlZiBURU5TT1JfSU5URVJGQUNFX0hICisjZGVmaW5lIFRFTlNPUl9JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYnRsLmhoIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyB0ZW5zb3JfaW50ZXJmYWNlCit7CitwdWJsaWMgOgorICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpUZW5zb3I8cmVhbCwyPjo6SW5kZXggSW5kZXg7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiBFaWdlbjo6VGVuc29yPHJlYWwsMj4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgRWlnZW46OlRlbnNvcjxyZWFsLDE+IGdlbmVfdmVjdG9yOworCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiBFSUdFTl9NQUtFU1RSSU5HKEJUTF9QUkVGSVgpOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiAvKkEqLywgaW50IC8qTiovKSB7fQorCisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgLypCKi8pIHt9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQS5yZXNpemUoRWlnZW46OmFycmF5PEluZGV4LDI+KEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspeworICAgICAgICBBLmNvZWZmUmVmKEVpZ2VuOjphcnJheTxJbmRleCwyPihpLGopKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCLmNvZWZmUmVmKGkpID0gQl9zdGxbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEJfc3RsW2ldID0gQi5jb2VmZihpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FICB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIGludCAgTj1BX3N0bC5zaXplKCk7CisKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICAgIEFfc3RsW2pdW2ldID0gQS5jb2VmZihFaWdlbjo6YXJyYXk8SW5kZXgsMj4oaSxqKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgIC8qTiovKXsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpUZW5zb3I8cmVhbF90eXBlLCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICAgIGNvbnN0IEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zKERpbVBhaXIoMSwgMCkpOworICAgIFgvKi5ub2FsaWFzKCkqLyA9IEEuY29udHJhY3QoQiwgZGltcyk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCAgLypOKi8peworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlRlbnNvcjxyZWFsX3R5cGUsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisgICAgY29uc3QgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMoRGltUGFpcigxLCAwKSk7CisgICAgWC8qLm5vYWxpYXMoKSovID0gQS5jb250cmFjdChCLCBkaW1zKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCAgLypOKi8peworICAgIFkgKz0gWC5jb25zdGFudChjb2VmKSAqIFg7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgIC8qTiovKXsKKyAgICBZID0gWC5jb25zdGFudChhKSpYICsgWS5jb25zdGFudChiKSpZOworICB9CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCAgLypOKi8peworICAgIGNpYmxlID0gc291cmNlOworICB9CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCAgLypOKi8peworICAgIGNpYmxlID0gc291cmNlOworICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3R2bWV0L0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNTY1YgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL3R2bWV0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorCitmaW5kX3BhY2thZ2UoVHZtZXQpCitpZiAoVFZNRVRfRk9VTkQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtUVk1FVF9JTkNMVURFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX3R2bWV0IG1haW4uY3BwIE9GRikKK2VuZGlmIChUVk1FVF9GT1VORCkKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3R2bWV0L21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMjE1YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL3R2bWV0L21haW4uY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBtYWluLmNwcAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzAgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidHZtZXRfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInN0YXRpYy9iZW5jaF9zdGF0aWMuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hdHZfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9heHB5LHR2bWV0X2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXR2X3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlPigpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3R2bWV0L3R2bWV0X2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL3R2bWV0L3R2bWV0X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQxYWRhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvdHZtZXRfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTA0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgdHZtZXRfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgVFZNRVRfSU5URVJGQUNFX0hICisjZGVmaW5lIFRWTUVUX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8dHZtZXQvdHZtZXQuaD4KKyNpbmNsdWRlIDx0dm1ldC9WZWN0b3IuaD4KKyNpbmNsdWRlIDx0dm1ldC9NYXRyaXguaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIHR2bWV0OworCit0ZW1wbGF0ZTxjbGFzcyByZWFsLCBpbnQgU0laRT4KK2NsYXNzIHR2bWV0X2ludGVyZmFjZXsKKworcHVibGljIDoKKworICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+ICBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3IgPiBzdGxfbWF0cml4OworCisgIHR5cGVkZWYgVmVjdG9yPHJlYWwsU0laRT4gZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgTWF0cml4PHJlYWwsU0laRSxTSVpFPiBnZW5lX21hdHJpeDsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAidGlueV90dm1ldCI7IH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXt9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKykKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspCisgICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKykKKyAgICAgIEJbaV09Ql9zdGxbaV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCX3N0bFtpXT1CW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgfQorICB9CisKKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGNpYmxlID0gc291cmNlOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IHByb2QoQSxCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSBwcm9kKEEsQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSBwcm9kKHRyYW5zKEEpLEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkrPWNvZWYqWDsKKyAgfQorCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdWJsYXMvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy91Ymxhcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI1OGJlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdWJsYXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3IEBACisKK2ZpbmRfcGFja2FnZShCb29zdCkKK2lmIChCb29zdF9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0Jvb3N0X0lOQ0xVREVfRElSU30pCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtCb29zdF9JTkNMVURFU30pCisgIGJ0bF9hZGRfYmVuY2goYnRsX3VibGFzIG1haW4uY3BwKQorZW5kaWYgKEJvb3N0X0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdWJsYXMvbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy91Ymxhcy9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU3N2VlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdWJsYXMvbWFpbi5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyNyBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ1Ymxhc19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX2F4cHk8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy91Ymxhcy91Ymxhc19pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy91Ymxhcy91Ymxhc19pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjYWQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaApAQCAtMCwwICsxLDE0MSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHVibGFzX2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MjcgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIFVCTEFTX0lOVEVSRkFDRV9ISAorI2RlZmluZSBVQkxBU19JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL21hdHJpeC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy9pby5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy90cmlhbmd1bGFyLmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOworCit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KK2NsYXNzIHVibGFzX2ludGVyZmFjZXsKKworcHVibGljIDoKKworICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6bWF0cml4PHJlYWwsYm9vc3Q6Om51bWVyaWM6OnVibGFzOjpjb2x1bW5fbWFqb3I+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dmVjdG9yPHJlYWw+IGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApIHsgcmV0dXJuICJ1YmxhcyI7IH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKSB7fQorCisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQikge30KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBLnJlc2l6ZShBX3N0bC5zaXplKCksQV9zdGxbMF0uc2l6ZSgpKTsKKyAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKQorICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKykKKyAgICAgICAgQShpLGopPUFfc3RsW2pdW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQi5yZXNpemUoQl9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQorICAgICAgQihpKT1CX3N0bFtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQorICAgICAgQl9zdGxbaV09QihpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTj1BX3N0bC5zaXplKCk7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCisgICAgICAgIEFfc3RsW2pdW2ldPUEoaSxqKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICBjaWJsZShpKSA9IHNvdXJjZShpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICAgIGNpYmxlKGksaikgPSBzb3VyY2UoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3Nsb3coZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSAgcHJvZChBLEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbG93KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gIHByb2QoQSxCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5X3Nsb3coY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkrPWNvZWYqWDsKKyAgfQorCisgIC8vIGFsaWFzIGZyZWUgYXNzaWduZW1lbnRzCisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWC5hc3NpZ24ocHJvZChBLEIpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWC5hc3NpZ24ocHJvZCh0cmFucyhBKSxCKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYLmFzc2lnbihwcm9kKEEsQikpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkucGx1c19hc3NpZ24oY29lZipYKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZID0gYSpYICsgYipZOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgLy8gWCA9ICBwcm9kKHRyYW5zKEEpLEEpOworICAgIFguYXNzaWduKHByb2QodHJhbnMoQSksQSkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgLy8gWCA9ICBwcm9kKEEsdHJhbnMoQSkpOworICAgIFguYXNzaWduKHByb2QoQSx0cmFucyhBKSkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSBzb2x2ZShMLCBCLCB1Ymxhczo6bG93ZXJfdGFnICgpKTsKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2NoZWNrX2NhY2hlX3F1ZXJpZXMuY3BwIGIvYmVuY2gvY2hlY2tfY2FjaGVfcXVlcmllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZDQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2NoZWNrX2NhY2hlX3F1ZXJpZXMuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisKKyNkZWZpbmUgRUlHRU5fSU5URVJOQUxfREVCVUdfQ0FDSEVfUVVFUlkKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjZGVmaW5lIERVTVBfQ1BVSUQoQ09ERSkge1wKKyAgaW50IGFiY2RbNF07IFwKKyAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7XAorICBFSUdFTl9DUFVJRChhYmNkLCBDT0RFLCAwKTsgXAorICBzdGQ6OmNvdXQgPDwgIlRoZSBjb2RlICIgPDwgQ09ERSA8PCAiIGdpdmVzICIgXAorICAgICAgICAgICAgICA8PCAoaW50KikoYWJjZFswXSkgPDwgIiAiIDw8IChpbnQqKShhYmNkWzFdKSA8PCAiICIgXAorICAgICAgICAgICAgICA8PCAoaW50KikoYWJjZFsyXSkgPDwgIiAiIDw8IChpbnQqKShhYmNkWzNdKSA8PCAiICIgPDwgc3RkOjplbmRsOyBcCisgIH0KKyAgCitpbnQgbWFpbigpCit7CisgIGNvdXQgPDwgIkVpZ2VuJ3MgTDEgICAgPSAiIDw8IGludGVybmFsOjpxdWVyeUwxQ2FjaGVTaXplKCkgPDwgZW5kbDsKKyAgY291dCA8PCAiRWlnZW4ncyBMMi9MMyA9ICIgPDwgaW50ZXJuYWw6OnF1ZXJ5VG9wTGV2ZWxDYWNoZVNpemUoKSA8PCBlbmRsOworICBpbnQgbDEsIGwyLCBsMzsKKyAgaW50ZXJuYWw6OnF1ZXJ5Q2FjaGVTaXplcyhsMSwgbDIsIGwzKTsKKyAgY291dCA8PCAiRWlnZW4ncyBMMSwgTDIsIEwzICAgICAgID0gIiA8PCBsMSA8PCAiICIgPDwgbDIgPDwgIiAiIDw8IGwzIDw8IGVuZGw7CisgIAorICAjaWZkZWYgRUlHRU5fQ1BVSUQKKworICBpbnQgYWJjZFs0XTsKKyAgaW50IHN0cmluZ1s4XTsKKyAgY2hhciogc3RyaW5nX2NoYXIgPSAoY2hhciopKHN0cmluZyk7CisKKyAgLy8gdmVuZG9yIElECisgIEVJR0VOX0NQVUlEKGFiY2QsMHgwLDApOworICBzdHJpbmdbMF0gPSBhYmNkWzFdOworICBzdHJpbmdbMV0gPSBhYmNkWzNdOworICBzdHJpbmdbMl0gPSBhYmNkWzJdOworICBzdHJpbmdbM10gPSAwOworICBjb3V0IDw8IGVuZGw7CisgIGNvdXQgPDwgInZlbmRvciBpZCA9ICIgPDwgc3RyaW5nX2NoYXIgPDwgZW5kbDsKKyAgY291dCA8PCBlbmRsOworICBpbnQgbWF4X2Z1bmNzID0gYWJjZFswXTsKKworICBpbnRlcm5hbDo6cXVlcnlDYWNoZVNpemVzX2ludGVsX2NvZGVzKGwxLCBsMiwgbDMpOworICBjb3V0IDw8ICJFaWdlbidzIGludGVsIGNvZGVzIEwxLCBMMiwgTDMgPSAiIDw8IGwxIDw8ICIgIiA8PCBsMiA8PCAiICIgPDwgbDMgPDwgZW5kbDsKKyAgaWYobWF4X2Z1bmNzPj00KQorICB7CisgICAgaW50ZXJuYWw6OnF1ZXJ5Q2FjaGVTaXplc19pbnRlbF9kaXJlY3QobDEsIGwyLCBsMyk7CisgICAgY291dCA8PCAiRWlnZW4ncyBpbnRlbCBkaXJlY3QgTDEsIEwyLCBMMyA9ICIgPDwgbDEgPDwgIiAiIDw8IGwyIDw8ICIgIiA8PCBsMyA8PCBlbmRsOworICB9CisgIGludGVybmFsOjpxdWVyeUNhY2hlU2l6ZXNfYW1kKGwxLCBsMiwgbDMpOworICBjb3V0IDw8ICJFaWdlbidzIGFtZCBMMSwgTDIsIEwzICAgICAgICAgPSAiIDw8IGwxIDw8ICIgIiA8PCBsMiA8PCAiICIgPDwgbDMgPDwgZW5kbDsKKyAgY291dCA8PCBlbmRsOworICAKKyAgLy8gZHVtcCBJbnRlbCBkaXJlY3QgbWV0aG9kCisgIGlmKG1heF9mdW5jcz49NCkKKyAgeworICAgIGwxID0gbDIgPSBsMyA9IDA7CisgICAgaW50IGNhY2hlX2lkID0gMDsKKyAgICBpbnQgY2FjaGVfdHlwZSA9IDA7CisgICAgZG8geworICAgICAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7CisgICAgICBFSUdFTl9DUFVJRChhYmNkLDB4NCxjYWNoZV9pZCk7CisgICAgICBjYWNoZV90eXBlICA9IChhYmNkWzBdICYgMHgwRikgPj4gMDsKKyAgICAgIGludCBjYWNoZV9sZXZlbCA9IChhYmNkWzBdICYgMHhFMCkgPj4gNTsgIC8vIEFbNzo1XQorICAgICAgaW50IHdheXMgICAgICAgID0gKGFiY2RbMV0gJiAweEZGQzAwMDAwKSA+PiAyMjsgLy8gQlszMToyMl0KKyAgICAgIGludCBwYXJ0aXRpb25zICA9IChhYmNkWzFdICYgMHgwMDNGRjAwMCkgPj4gMTI7IC8vIEJbMjE6MTJdCisgICAgICBpbnQgbGluZV9zaXplICAgPSAoYWJjZFsxXSAmIDB4MDAwMDBGRkYpID4+ICAwOyAvLyBCWzExOjBdCisgICAgICBpbnQgc2V0cyAgICAgICAgPSAoYWJjZFsyXSk7ICAgICAgICAgICAgICAgICAgICAvLyBDWzMxOjBdCisgICAgICBpbnQgY2FjaGVfc2l6ZSA9ICh3YXlzKzEpICogKHBhcnRpdGlvbnMrMSkgKiAobGluZV9zaXplKzEpICogKHNldHMrMSk7CisgICAgICAKKyAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0udHlwZSAgICAgICA9ICIgPDwgY2FjaGVfdHlwZSA8PCAiXG4iOworICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS5sZXZlbCAgICAgID0gIiA8PCBjYWNoZV9sZXZlbCA8PCAiXG4iOworICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS53YXlzICAgICAgID0gIiA8PCB3YXlzIDw8ICJcbiI7CisgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLnBhcnRpdGlvbnMgPSAiIDw8IHBhcnRpdGlvbnMgPDwgIlxuIjsKKyAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0ubGluZV9zaXplICA9ICIgPDwgbGluZV9zaXplIDw8ICJcbiI7CisgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLnNldHMgICAgICAgPSAiIDw8IHNldHMgPDwgIlxuIjsKKyAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0uc2l6ZSAgICAgICA9ICIgPDwgY2FjaGVfc2l6ZSA8PCAiXG4iOworICAgICAgCisgICAgICBjYWNoZV9pZCsrOworICAgIH0gd2hpbGUoY2FjaGVfdHlwZT4wICYmIGNhY2hlX2lkPDE2KTsKKyAgfQorICAKKyAgLy8gZHVtcCBldmVyeXRoaW5nCisgIHN0ZDo6Y291dCA8PCBlbmRsIDw8IlJhdyBkdW1wOiIgPDwgZW5kbDsKKyAgZm9yKGludCBpPTA7IGk8bWF4X2Z1bmNzOyArK2kpCisgICAgRFVNUF9DUFVJRChpKTsKKworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDApOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDEpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDIpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDMpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDQpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDUpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDYpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDcpOworICBEVU1QX0NQVUlEKDB4ODAwMDAwMDgpOworICAjZWxzZQorICBjb3V0IDw8ICJFSUdFTl9DUFVJRCBpcyBub3QgZGVmaW5lZCIgPDwgZW5kbDsKKyAgI2VuZGlmCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvZGVuc2Vfc29sdmVycy5jcHAgYi9iZW5jaC9kZW5zZV9zb2x2ZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM0M2RjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvZGVuc2Vfc29sdmVycy5jcHAKQEAgLTAsMCArMSwxODYgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJCZW5jaFRpbWVyLmgiCisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworc3RkOjptYXA8c3RkOjpzdHJpbmcsQXJyYXk8ZmxvYXQsMSw4LERvbnRBbGlnbnxSb3dNYWpvcj4gPiByZXN1bHRzOworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxhYmVsczsKK3N0ZDo6dmVjdG9yPEFycmF5Mmk+IHNpemVzOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsdHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX0RPTlRfSU5MSU5FCit2b2lkIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihTb2x2ZXIgJnNvbHZlciwgY29uc3QgTWF0cml4VHlwZSAmQSkgeworICBpZihBLnJvd3MoKSE9QS5jb2xzKCkpCisgICAgc29sdmVyLmNvbXB1dGUoQS50cmFuc3Bvc2UoKSpBKTsKKyAgZWxzZQorICAgIHNvbHZlci5jb21wdXRlKEEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsdHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX0RPTlRfSU5MSU5FCit2b2lkIGNvbXB1dGUoU29sdmVyICZzb2x2ZXIsIGNvbnN0IE1hdHJpeFR5cGUgJkEpIHsKKyAgc29sdmVyLmNvbXB1dGUoQSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZT4KK3ZvaWQgYmVuY2goaW50IGlkLCBpbnQgcm93cywgaW50IHNpemUgPSBTaXplKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxTaXplPiBNYXQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdER5bjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZT4gTWF0U3F1YXJlOworICBNYXQgQShyb3dzLHNpemUpOworICBBLnNldFJhbmRvbSgpOworICBpZihyb3dzPT1zaXplKQorICAgIEEgPSBBKkEuYWRqb2ludCgpOworICBCZW5jaFRpbWVyIHRfbGx0LCB0X2xkbHQsIHRfbHUsIHRfZnBsdSwgdF9xciwgdF9jcHFyLCB0X2NvZCwgdF9mcHFyLCB0X2pzdmQsIHRfYmRjc3ZkOworCisgIGludCBzdmRfb3B0ID0gQ29tcHV0ZVRoaW5VfENvbXB1dGVUaGluVjsKKyAgCisgIGludCB0cmllcyA9IDU7CisgIGludCByZXAgPSAxMDAwL3NpemU7CisgIGlmKHJlcD09MCkgcmVwID0gMTsKKy8vICAgcmVwID0gcmVwKnJlcDsKKyAgCisgIExMVDxNYXRTcXVhcmU+IGxsdChzaXplKTsKKyAgTERMVDxNYXRTcXVhcmU+IGxkbHQoc2l6ZSk7CisgIFBhcnRpYWxQaXZMVTxNYXRTcXVhcmU+IGx1KHNpemUpOworICBGdWxsUGl2TFU8TWF0U3F1YXJlPiBmcGx1KHNpemUsc2l6ZSk7CisgIEhvdXNlaG9sZGVyUVI8TWF0PiBxcihBLnJvd3MoKSxBLmNvbHMoKSk7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0PiBjcHFyKEEucm93cygpLEEuY29scygpKTsKKyAgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXQ+IGNvZChBLnJvd3MoKSxBLmNvbHMoKSk7CisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdD4gZnBxcihBLnJvd3MoKSxBLmNvbHMoKSk7CisgIEphY29iaVNWRDxNYXREeW4+IGpzdmQoQS5yb3dzKCksQS5jb2xzKCkpOworICBCRENTVkQ8TWF0RHluPiBiZGNzdmQoQS5yb3dzKCksQS5jb2xzKCkpOworICAKKyAgQkVOQ0godF9sbHQsIHRyaWVzLCByZXAsIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihsbHQsQSkpOworICBCRU5DSCh0X2xkbHQsIHRyaWVzLCByZXAsIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihsZGx0LEEpKTsKKyAgQkVOQ0godF9sdSwgdHJpZXMsIHJlcCwgY29tcHV0ZV9ub3JtX2VxdWF0aW9uKGx1LEEpKTsKKyAgaWYoc2l6ZTw9MTAwMCkKKyAgICBCRU5DSCh0X2ZwbHUsIHRyaWVzLCByZXAsIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihmcGx1LEEpKTsKKyAgQkVOQ0godF9xciwgdHJpZXMsIHJlcCwgY29tcHV0ZShxcixBKSk7CisgIEJFTkNIKHRfY3BxciwgdHJpZXMsIHJlcCwgY29tcHV0ZShjcHFyLEEpKTsKKyAgQkVOQ0godF9jb2QsIHRyaWVzLCByZXAsIGNvbXB1dGUoY29kLEEpKTsKKyAgaWYoc2l6ZSpyb3dzPD0xMDAwMDAwMCkKKyAgICBCRU5DSCh0X2ZwcXIsIHRyaWVzLCByZXAsIGNvbXB1dGUoZnBxcixBKSk7CisgIGlmKHNpemU8NTAwKSAvLyBKYWNvYmlTVkQgaXMgcmVhbGx5IHRvbyBzbG93IGZvciB0b28gbGFyZ2UgbWF0cmljZXMKKyAgICBCRU5DSCh0X2pzdmQsIHRyaWVzLCByZXAsIGpzdmQuY29tcHV0ZShBLHN2ZF9vcHQpKTsKKy8vICAgaWYoc2l6ZSpyb3dzPD0yMDAwMDAwMCkKKyAgICBCRU5DSCh0X2JkY3N2ZCwgdHJpZXMsIHJlcCwgYmRjc3ZkLmNvbXB1dGUoQSxzdmRfb3B0KSk7CisgIAorICByZXN1bHRzWyJMTFQiXVtpZF0gPSB0X2xsdC5iZXN0KCk7CisgIHJlc3VsdHNbIkxETFQiXVtpZF0gPSB0X2xkbHQuYmVzdCgpOworICByZXN1bHRzWyJQYXJ0aWFsUGl2TFUiXVtpZF0gPSB0X2x1LmJlc3QoKTsKKyAgcmVzdWx0c1siRnVsbFBpdkxVIl1baWRdID0gdF9mcGx1LmJlc3QoKTsKKyAgcmVzdWx0c1siSG91c2Vob2xkZXJRUiJdW2lkXSA9IHRfcXIuYmVzdCgpOworICByZXN1bHRzWyJDb2xQaXZIb3VzZWhvbGRlclFSIl1baWRdID0gdF9jcHFyLmJlc3QoKTsKKyAgcmVzdWx0c1siQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiJdW2lkXSA9IHRfY29kLmJlc3QoKTsKKyAgcmVzdWx0c1siRnVsbFBpdkhvdXNlaG9sZGVyUVIiXVtpZF0gPSB0X2ZwcXIuYmVzdCgpOworICByZXN1bHRzWyJKYWNvYmlTVkQiXVtpZF0gPSB0X2pzdmQuYmVzdCgpOworICByZXN1bHRzWyJCRENTVkQiXVtpZF0gPSB0X2JkY3N2ZC5iZXN0KCk7Cit9CisKKworaW50IG1haW4oKQoreworICBsYWJlbHMucHVzaF9iYWNrKCJMTFQiKTsKKyAgbGFiZWxzLnB1c2hfYmFjaygiTERMVCIpOworICBsYWJlbHMucHVzaF9iYWNrKCJQYXJ0aWFsUGl2TFUiKTsKKyAgbGFiZWxzLnB1c2hfYmFjaygiRnVsbFBpdkxVIik7CisgIGxhYmVscy5wdXNoX2JhY2soIkhvdXNlaG9sZGVyUVIiKTsKKyAgbGFiZWxzLnB1c2hfYmFjaygiQ29sUGl2SG91c2Vob2xkZXJRUiIpOworICBsYWJlbHMucHVzaF9iYWNrKCJDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uIik7CisgIGxhYmVscy5wdXNoX2JhY2soIkZ1bGxQaXZIb3VzZWhvbGRlclFSIik7CisgIGxhYmVscy5wdXNoX2JhY2soIkphY29iaVNWRCIpOworICBsYWJlbHMucHVzaF9iYWNrKCJCRENTVkQiKTsKKworICBmb3IoaW50IGk9MDsgaTxsYWJlbHMuc2l6ZSgpOyArK2kpCisgICAgcmVzdWx0c1tsYWJlbHNbaV1dLmZpbGwoLTEpOworCisgIGNvbnN0IGludCBzbWFsbCA9IDg7CisgIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKHNtYWxsLHNtYWxsKSk7CisgIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMCwxMDApKTsKKyAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoMTAwMCwxMDAwKSk7CisgIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDQwMDAsNDAwMCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCxzbWFsbCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCwxMDApKTsKKyAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoMTAwMDAsMTAwMCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCw0MDAwKSk7CisKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworICBmb3IoaW50IGs9MDsgazxzaXplcy5zaXplKCk7ICsraykKKyAgeworICAgIGNvdXQgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpIDw8ICIuLi5cbiI7CisgICAgYmVuY2g8ZmxvYXQsRHluYW1pYz4oayxzaXplc1trXSgwKSxzaXplc1trXSgxKSk7CisgIH0KKworICBjb3V0LndpZHRoKDMyKTsKKyAgY291dCA8PCAic29sdmVyL3NpemUiOworICBjb3V0IDw8ICIgICI7CisgIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQorICB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpOworICAgIGNvdXQud2lkdGgoMTApOyBjb3V0IDw8IHNzLnN0cigpOyBjb3V0IDw8ICIgIjsKKyAgfQorICBjb3V0IDw8IGVuZGw7CisKKworICBmb3IoaW50IGk9MDsgaTxsYWJlbHMuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBjb3V0LndpZHRoKDMyKTsgY291dCA8PCBsYWJlbHNbaV07IGNvdXQgPDwgIiAgIjsKKyAgICBBcnJheVhmIHIgPSAocmVzdWx0c1tsYWJlbHNbaV1dKjEwMDAwMC5mKS5mbG9vcigpLzEwMC5mOworICAgIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQorICAgIHsKKyAgICAgIGNvdXQud2lkdGgoMTApOworICAgICAgaWYocihrKT49MWU2KSAgY291dCA8PCAiLSI7CisgICAgICBlbHNlICAgICAgICAgICBjb3V0IDw8IHIoayk7CisgICAgICBjb3V0IDw8ICIgIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworICB9CisKKyAgLy8gSFRNTCBvdXRwdXQKKyAgY291dCA8PCAiPHRhYmxlIGNsYXNzPVwibWFudWFsXCI+IiA8PCBlbmRsOworICBjb3V0IDw8ICI8dHI+PHRoPnNvbHZlci9zaXplPC90aD4iIDw8IGVuZGw7CisgIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQorICAgIGNvdXQgPDwgIiAgPHRoPiIgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpIDw8ICI8L3RoPiI7CisgIGNvdXQgPDwgIjwvdHI+IiA8PCBlbmRsOworICBmb3IoaW50IGk9MDsgaTxsYWJlbHMuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBjb3V0IDw8ICI8dHIiOworICAgIGlmKGklMj09MSkgY291dCA8PCAiIGNsYXNzPVwiYWx0XCIiOworICAgIGNvdXQgPDwgIj48dGQ+IiA8PCBsYWJlbHNbaV0gPDwgIjwvdGQ+IjsKKyAgICBBcnJheVhmIHIgPSAocmVzdWx0c1tsYWJlbHNbaV1dKjEwMDAwMC5mKS5mbG9vcigpLzEwMC5mOworICAgIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQorICAgIHsKKyAgICAgIGlmKHIoayk+PTFlNikgY291dCA8PCAiPHRkPi08L3RkPiI7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGNvdXQgPDwgIjx0ZD4iIDw8IHIoayk7CisgICAgICAgIGlmKGk+MCkKKyAgICAgICAgICBjb3V0IDw8ICIgKHgiIDw8IG51bWV4dDo6cm91bmQoMTAuZipyZXN1bHRzW2xhYmVsc1tpXV0oaykvcmVzdWx0c1siTExUIl0oaykpLzEwLmYgPDwgIikiOworICAgICAgICBpZihpPDQgJiYgc2l6ZXNba10oMCkhPXNpemVzW2tdKDEpKQorICAgICAgICAgIGNvdXQgPDwgIiA8c3VwPjxhIGhyZWY9XCIjbm90ZV9sc1wiPio8L2E+PC9zdXA+IjsKKyAgICAgICAgY291dCA8PCAiPC90ZD4iOworICAgICAgfQorICAgIH0KKyAgICBjb3V0IDw8ICI8L3RyPiIgPDwgZW5kbDsKKyAgfQorICBjb3V0IDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKKworLy8gICBjb3V0IDw8ICJMTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtcykgICIgPDwgKHJlc3VsdHNbIkxMVCJdKjEwMDAuKS5mb3JtYXQoZm10KSA8PCAiXG4iOworLy8gICBjb3V0IDw8ICJMRExUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkxETFQiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKy8vICAgY291dCA8PCAiUGFydGlhbFBpdkxVICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJQYXJ0aWFsUGl2TFUiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKy8vICAgY291dCA8PCAiRnVsbFBpdkxVICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJGdWxsUGl2TFUiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKy8vICAgY291dCA8PCAiSG91c2Vob2xkZXJRUiAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJIb3VzZWhvbGRlclFSIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7CisvLyAgIGNvdXQgPDwgIkNvbFBpdkhvdXNlaG9sZGVyUVIgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siQ29sUGl2SG91c2Vob2xkZXJRUiJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOworLy8gICBjb3V0IDw8ICJDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uICAoJSkgICIgPDwgKHJlc3VsdHNbIkNvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24iXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKy8vICAgY291dCA8PCAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJGdWxsUGl2SG91c2Vob2xkZXJRUiJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOworLy8gICBjb3V0IDw8ICJKYWNvYmlTVkQgICAgICAgICAgICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkphY29iaVNWRCJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOworLy8gICBjb3V0IDw8ICJCRENTVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkJEQ1NWRCJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvZWlnMzMuY3BwIGIvYmVuY2gvZWlnMzMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OTQ3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9laWczMy5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gVGhlIGNvbXB1dGVSb290cyBmdW5jdGlvbiBpbmNsdWRlZCBpbiB0aGlzIGlzIGJhc2VkIG9uIG1hdGVyaWFscworLy8gY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZToKKy8vIAorLy8gR2VvbWV0cmljIFRvb2xzLCBMTEMKKy8vIENvcHlyaWdodCAoYykgMTk5OC0yMDEwCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisvLyAKKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgorLy8gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKKy8vIHRoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAorLy8gZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKKy8vIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCisvLyBkbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKKy8vIAorLy8gVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKKy8vIHRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisvLyBtdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKKy8vIGFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKKy8vIHdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQorLy8gYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgorLy8gCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCisvLyBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCisvLyBGT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKy8vIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorLy8gREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeCwgdHlwZW5hbWUgUm9vdHM+CitpbmxpbmUgdm9pZCBjb21wdXRlUm9vdHMoY29uc3QgTWF0cml4JiBtLCBSb290cyYgcm9vdHMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4OjpTY2FsYXIgU2NhbGFyOworICBjb25zdCBTY2FsYXIgc19pbnYzID0gMS4wLzMuMDsKKyAgY29uc3QgU2NhbGFyIHNfc3FydDMgPSBzdGQ6OnNxcnQoU2NhbGFyKDMuMCkpOworCisgIC8vIFRoZSBjaGFyYWN0ZXJpc3RpYyBlcXVhdGlvbiBpcyB4XjMgLSBjMip4XjIgKyBjMSp4IC0gYzAgPSAwLiAgVGhlCisgIC8vIGVpZ2VudmFsdWVzIGFyZSB0aGUgcm9vdHMgdG8gdGhpcyBlcXVhdGlvbiwgYWxsIGd1YXJhbnRlZWQgdG8gYmUKKyAgLy8gcmVhbC12YWx1ZWQsIGJlY2F1c2UgdGhlIG1hdHJpeCBpcyBzeW1tZXRyaWMuCisgIFNjYWxhciBjMCA9IG0oMCwwKSptKDEsMSkqbSgyLDIpICsgU2NhbGFyKDIpKm0oMCwxKSptKDAsMikqbSgxLDIpIC0gbSgwLDApKm0oMSwyKSptKDEsMikgLSBtKDEsMSkqbSgwLDIpKm0oMCwyKSAtIG0oMiwyKSptKDAsMSkqbSgwLDEpOworICBTY2FsYXIgYzEgPSBtKDAsMCkqbSgxLDEpIC0gbSgwLDEpKm0oMCwxKSArIG0oMCwwKSptKDIsMikgLSBtKDAsMikqbSgwLDIpICsgbSgxLDEpKm0oMiwyKSAtIG0oMSwyKSptKDEsMik7CisgIFNjYWxhciBjMiA9IG0oMCwwKSArIG0oMSwxKSArIG0oMiwyKTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlcnMgdXNlZCBpbiBjbGFzc2lmeWluZyB0aGUgcm9vdHMgb2YgdGhlIGVxdWF0aW9uCisgIC8vIGFuZCBpbiBzb2x2aW5nIHRoZSBlcXVhdGlvbiBmb3IgdGhlIHJvb3RzIGluIGNsb3NlZCBmb3JtLgorICBTY2FsYXIgYzJfb3Zlcl8zID0gYzIqc19pbnYzOworICBTY2FsYXIgYV9vdmVyXzMgPSAoYzEgLSBjMipjMl9vdmVyXzMpKnNfaW52MzsKKyAgaWYgKGFfb3Zlcl8zID4gU2NhbGFyKDApKQorICAgIGFfb3Zlcl8zID0gU2NhbGFyKDApOworCisgIFNjYWxhciBoYWxmX2IgPSBTY2FsYXIoMC41KSooYzAgKyBjMl9vdmVyXzMqKFNjYWxhcigyKSpjMl9vdmVyXzMqYzJfb3Zlcl8zIC0gYzEpKTsKKworICBTY2FsYXIgcSA9IGhhbGZfYipoYWxmX2IgKyBhX292ZXJfMyphX292ZXJfMyphX292ZXJfMzsKKyAgaWYgKHEgPiBTY2FsYXIoMCkpCisgICAgcSA9IFNjYWxhcigwKTsKKworICAvLyBDb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBieSBzb2x2aW5nIGZvciB0aGUgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwuCisgIFNjYWxhciByaG8gPSBzdGQ6OnNxcnQoLWFfb3Zlcl8zKTsKKyAgU2NhbGFyIHRoZXRhID0gc3RkOjphdGFuMihzdGQ6OnNxcnQoLXEpLGhhbGZfYikqc19pbnYzOworICBTY2FsYXIgY29zX3RoZXRhID0gc3RkOjpjb3ModGhldGEpOworICBTY2FsYXIgc2luX3RoZXRhID0gc3RkOjpzaW4odGhldGEpOworICByb290cygyKSA9IGMyX292ZXJfMyArIFNjYWxhcigyKSpyaG8qY29zX3RoZXRhOworICByb290cygwKSA9IGMyX292ZXJfMyAtIHJobyooY29zX3RoZXRhICsgc19zcXJ0MypzaW5fdGhldGEpOworICByb290cygxKSA9IGMyX292ZXJfMyAtIHJobyooY29zX3RoZXRhIC0gc19zcXJ0MypzaW5fdGhldGEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXgsIHR5cGVuYW1lIFZlY3Rvcj4KK3ZvaWQgZWlnZW4zMyhjb25zdCBNYXRyaXgmIG1hdCwgTWF0cml4JiBldmVjcywgVmVjdG9yJiBldmFscykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXg6OlNjYWxhciBTY2FsYXI7CisgIC8vIFNjYWxlIHRoZSBtYXRyaXggc28gaXRzIGVudHJpZXMgYXJlIGluIFstMSwxXS4gIFRoZSBzY2FsaW5nIGlzIGFwcGxpZWQKKyAgLy8gb25seSB3aGVuIGF0IGxlYXN0IG9uZSBtYXRyaXggZW50cnkgaGFzIG1hZ25pdHVkZSBsYXJnZXIgdGhhbiAxLgorCisgIFNjYWxhciBzaGlmdCA9IG1hdC50cmFjZSgpLzM7CisgIE1hdHJpeCBzY2FsZWRNYXQgPSBtYXQ7CisgIHNjYWxlZE1hdC5kaWFnb25hbCgpLmFycmF5KCkgLT0gc2hpZnQ7CisgIFNjYWxhciBzY2FsZSA9IHNjYWxlZE1hdC5jd2lzZUFicygpLyoudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkqLy5tYXhDb2VmZigpOworICBzY2FsZSA9IHN0ZDo6bWF4KHNjYWxlLFNjYWxhcigxKSk7CisgIHNjYWxlZE1hdC89c2NhbGU7CisKKyAgLy8gQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKKy8vICAgc2NhbGVkTWF0LnNldFplcm8oKTsKKyAgY29tcHV0ZVJvb3RzKHNjYWxlZE1hdCxldmFscyk7CisKKyAgLy8gY29tcHV0ZSB0aGUgZWlnZW4gdmVjdG9ycworICAvLyAqKmhlcmUgd2UgYXNzdW1lIDMgZGlmZmVyZW50cyBlaWdlbnZhbHVlcyoqCisKKyAgLy8gIm9wdGltaXplZCB2ZXJzaW9uIiB3aGljaCBhcHBlYXJzIHRvIGJlIHNsb3dlciB3aXRoIGdjYyEKKy8vICAgICBWZWN0b3IgYmFzZTsKKy8vICAgICBTY2FsYXIgYWxwaGEsIGJldGE7CisvLyAgICAgYmFzZSA8PCAgIHNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDIsMSksCisvLyAgICAgICAgICAgICAgIHNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDIsMCksCisvLyAgICAgICAgICAgICAgLXNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDEsMCk7CisvLyAgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKQorLy8gICAgIHsKKy8vICAgICAgIGFscGhhID0gc2NhbGVkTWF0KDAsMCkgLSBldmFscyhrKTsKKy8vICAgICAgIGJldGEgID0gc2NhbGVkTWF0KDEsMSkgLSBldmFscyhrKTsKKy8vICAgICAgIGV2ZWNzLmNvbChrKSA9IChiYXNlICsgVmVjdG9yKC1iZXRhKnNjYWxlZE1hdCgyLDApLCAtYWxwaGEqc2NhbGVkTWF0KDIsMSksIGFscGhhKmJldGEpKS5ub3JtYWxpemVkKCk7CisvLyAgICAgfQorLy8gICAgIGV2ZWNzLmNvbCgyKSA9IGV2ZWNzLmNvbCgwKS5jcm9zcyhldmVjcy5jb2woMSkpLm5vcm1hbGl6ZWQoKTsKKworLy8gICAvLyBuYWl2ZSB2ZXJzaW9uCisvLyAgIE1hdHJpeCB0bXA7CisvLyAgIHRtcCA9IHNjYWxlZE1hdDsKKy8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygwKTsKKy8vICAgZXZlY3MuY29sKDApID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDEpKS5ub3JtYWxpemVkKCk7CisvLyAKKy8vICAgdG1wID0gc2NhbGVkTWF0OworLy8gICB0bXAuZGlhZ29uYWwoKS5hcnJheSgpIC09IGV2YWxzKDEpOworLy8gICBldmVjcy5jb2woMSkgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKKy8vIAorLy8gICB0bXAgPSBzY2FsZWRNYXQ7CisvLyAgIHRtcC5kaWFnb25hbCgpLmFycmF5KCkgLT0gZXZhbHMoMik7CisvLyAgIGV2ZWNzLmNvbCgyKSA9IHRtcC5yb3coMCkuY3Jvc3ModG1wLnJvdygxKSkubm9ybWFsaXplZCgpOworICAKKyAgLy8gYSBtb3JlIHN0YWJsZSB2ZXJzaW9uOgorICBpZigoZXZhbHMoMiktZXZhbHMoMCkpPD1FaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgeworICAgIGV2ZWNzLnNldElkZW50aXR5KCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgTWF0cml4IHRtcDsKKyAgICB0bXAgPSBzY2FsZWRNYXQ7CisgICAgdG1wLmRpYWdvbmFsICgpLmFycmF5ICgpIC09IGV2YWxzICgyKTsKKyAgICBldmVjcy5jb2wgKDIpID0gdG1wLnJvdyAoMCkuY3Jvc3MgKHRtcC5yb3cgKDEpKS5ub3JtYWxpemVkICgpOworICAgIAorICAgIHRtcCA9IHNjYWxlZE1hdDsKKyAgICB0bXAuZGlhZ29uYWwgKCkuYXJyYXkgKCkgLT0gZXZhbHMgKDEpOworICAgIGV2ZWNzLmNvbCgxKSA9IHRtcC5yb3cgKDApLmNyb3NzKHRtcC5yb3cgKDEpKTsKKyAgICBTY2FsYXIgbjEgPSBldmVjcy5jb2woMSkubm9ybSgpOworICAgIGlmKG4xPD1FaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICAgIGV2ZWNzLmNvbCgxKSA9IGV2ZWNzLmNvbCgyKS51bml0T3J0aG9nb25hbCgpOworICAgIGVsc2UKKyAgICAgIGV2ZWNzLmNvbCgxKSAvPSBuMTsKKyAgICAKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBldmVjc1sxXSBpcyBvcnRob2dvbmFsIHRvIGV2ZWNzWzJdCisgICAgZXZlY3MuY29sKDEpID0gZXZlY3MuY29sKDIpLmNyb3NzKGV2ZWNzLmNvbCgxKS5jcm9zcyhldmVjcy5jb2woMikpKS5ub3JtYWxpemVkKCk7CisgICAgZXZlY3MuY29sKDApID0gZXZlY3MuY29sKDIpLmNyb3NzKGV2ZWNzLmNvbCgxKSk7CisgIH0KKyAgCisgIC8vIFJlc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZS4KKyAgZXZhbHMgKj0gc2NhbGU7CisgIGV2YWxzLmFycmF5KCkrPXNoaWZ0OworfQorCitpbnQgbWFpbigpCit7CisgIEJlbmNoVGltZXIgdDsKKyAgaW50IHRyaWVzID0gMTA7CisgIGludCByZXAgPSA0MDAwMDA7CisgIHR5cGVkZWYgTWF0cml4M2QgTWF0OworICB0eXBlZGVmIFZlY3RvcjNkIFZlYzsKKyAgTWF0IEEgPSBNYXQ6OlJhbmRvbSgzLDMpOworICBBID0gQS5hZGpvaW50KCkgKiBBOworLy8gICBNYXQgUSA9IEEuaG91c2Vob2xkZXJRcigpLmhvdXNlaG9sZGVyUSgpOworLy8gICBBID0gUSAqIFZlYygyLjI0MjQ1NjcsMi4yNDI0NTY2LDcuNDU0MzUzKS5hc0RpYWdvbmFsKCkgKiBRLnRyYW5zcG9zZSgpOworCisgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0PiBlaWcoQSk7CisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGVpZy5jb21wdXRlKEEpKTsKKyAgc3RkOjpjb3V0IDw8ICJFaWdlbiBpdGVyYXRpdmU6ICAiIDw8IHQuYmVzdCgpIDw8ICJzXG4iOworICAKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgZWlnLmNvbXB1dGVEaXJlY3QoQSkpOworICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGRpcmVjdCAgIDogICIgPDwgdC5iZXN0KCkgPDwgInNcbiI7CisKKyAgTWF0IGV2ZWNzOworICBWZWMgZXZhbHM7CisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGVpZ2VuMzMoQSxldmVjcyxldmFscykpOworICBzdGQ6OmNvdXQgPDwgIkRpcmVjdDogIiA8PCB0LmJlc3QoKSA8PCAic1xuXG4iOworCisvLyAgIHN0ZDo6Y2VyciA8PCAiRWlnZW52YWx1ZS9laWdlbnZlY3RvciBkaWZmczpcbiI7CisvLyAgIHN0ZDo6Y2VyciA8PCAoZXZhbHMgLSBlaWcuZWlnZW52YWx1ZXMoKSkudHJhbnNwb3NlKCkgPDwgIlxuIjsKKy8vICAgZm9yKGludCBrPTA7azwzOysraykKKy8vICAgICBpZihldmVjcy5jb2woaykuZG90KGVpZy5laWdlbnZlY3RvcnMoKS5jb2woaykpPDApCisvLyAgICAgICBldmVjcy5jb2woaykgPSAtZXZlY3MuY29sKGspOworLy8gICBzdGQ6OmNlcnIgPDwgZXZlY3MgLSBlaWcuZWlnZW52ZWN0b3JzKCkgPDwgIlxuXG4iOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvZ2VvbWV0cnkuY3BwIGIvYmVuY2gvZ2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODdhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9nZW9tZXRyeS5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBTQ0FMQVIKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CisjZW5kaWYKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgOAorI2VuZGlmCisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKK3R5cGVkZWYgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBBOwordHlwZWRlZiBNYXRyaXg8LypSZWFsKi9TY2FsYXIsRHluYW1pYyxEeW5hbWljPiBCOwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQzsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1hdGlvbiwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0LCBEYXRhJiBkYXRhKQoreworICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4iKTsKKyAgZGF0YSA9IHQgKiBkYXRhOworICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFF1YXRlcm5pb248U2NhbGFyPiYgdCwgRGF0YSYgZGF0YSkKK3sKKyAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHF1YXQiKTsKKyAgZm9yKGludCBpPTA7aTxkYXRhLmNvbHMoKTsrK2kpCisgICAgZGF0YS5jb2woaSkgPSB0ICogZGF0YS5jb2woaSk7CisgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQgcXVhdCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXIKK3sKKyAgZW51bSB7RGltID0gVDo6RGltfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOworICBUb1JvdGF0aW9uTWF0cml4V3JhcHBlcihjb25zdCBUJiBvKSA6IG9iamVjdChvKSB7fQorICBUIG9iamVjdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFFUeXBlLCB0eXBlbmFtZSBEYXRhPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXI8UVR5cGU+JiB0LCBEYXRhJiBkYXRhKQoreworICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gcXVhdCB2aWEgbWF0Iik7CisgIGRhdGEgPSB0Lm9iamVjdC50b1JvdGF0aW9uTWF0cml4KCkgKiBkYXRhOworICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIHF1YXQgdmlhIG1hdCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIHR5cGVuYW1lIERhdGE+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlPiYgdCwgRGF0YSYgZGF0YSkKK3sKKyAgZGF0YSA9ICh0ICogZGF0YS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkudGVtcGxhdGUgYmxvY2s8RGltLERhdGE6OkNvbHNBdENvbXBpbGVUaW1lPigwLDApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZ2V0X2RpbSB7IGVudW0geyBEaW0gPSBUOjpEaW0gfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBSLCBpbnQgQywgaW50IE8sIGludCBNUiwgaW50IE1DPgorc3RydWN0IGdldF9kaW08TWF0cml4PFMsUixDLE8sTVIsTUM+ID4geyBlbnVtIHsgRGltID0gUiB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1hdGlvbiwgaW50IE4+CitzdHJ1Y3QgYmVuY2hfaW1wbAoreworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oY29uc3QgVHJhbnNmb3JtYXRpb24mIHQpCisgIHsKKyAgICBNYXRyaXg8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb246OlNjYWxhcixnZXRfZGltPFRyYW5zZm9ybWF0aW9uPjo6RGltLE4+IGRhdGE7CisgICAgZGF0YS5zZXRSYW5kb20oKTsKKyAgICBiZW5jaF9pbXBsPFRyYW5zZm9ybWF0aW9uLE4tMT46OnJ1bih0KTsKKyAgICBCZW5jaFRpbWVyIHRpbWVyOworICAgIEJFTkNIKHRpbWVyLDEwLDEwMDAwMCx0cmFuc2Zvcm0odCxkYXRhKSk7CisgICAgY291dC53aWR0aCg5KTsKKyAgICBjb3V0IDw8IHRpbWVyLmJlc3QoKSA8PCAiICI7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24+CitzdHJ1Y3QgYmVuY2hfaW1wbDxUcmFuc2Zvcm1hdGlvbiwwPgoreworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oY29uc3QgVHJhbnNmb3JtYXRpb24mKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGJlbmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2csIGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0KQoreworICBjb3V0IDw8IG1zZyA8PCAiICI7CisgIGJlbmNoX2ltcGw8VHJhbnNmb3JtYXRpb24sU0laRT46OnJ1bih0KTsKKyAgc3RkOjpjb3V0IDw8ICJcbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisgIE1hdHJpeDxTY2FsYXIsMyw0PiBtYXQzNDsgbWF0MzQuc2V0UmFuZG9tKCk7CisgIFRyYW5zZm9ybTxTY2FsYXIsMyxJc29tZXRyeT4gaXNvMyhtYXQzNCk7CisgIFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+IGFmZjMobWF0MzQpOworICBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lQ29tcGFjdD4gY2FmZjMobWF0MzQpOworICBUcmFuc2Zvcm08U2NhbGFyLDMsUHJvamVjdGl2ZT4gcHJvajMobWF0MzQpOworICBRdWF0ZXJuaW9uPFNjYWxhcj4gcXVhdDtxdWF0LnNldElkZW50aXR5KCk7CisgIFRvUm90YXRpb25NYXRyaXhXcmFwcGVyPFF1YXRlcm5pb248U2NhbGFyPiA+IHF1YXRtYXQocXVhdCk7CisgIE1hdHJpeDxTY2FsYXIsMywzPiBtYXQzMzsgbWF0MzMuc2V0UmFuZG9tKCk7CisgIAorICBjb3V0LnByZWNpc2lvbig0KTsKKyAgc3RkOjpjb3V0CisgICAgIDw8ICJOICAgICAgICAgICI7CisgIGZvcihpbnQgaT0wO2k8U0laRTsrK2kpCisgIHsKKyAgICBjb3V0LndpZHRoKDkpOworICAgIGNvdXQgPDwgaSsxIDw8ICIgIjsKKyAgfQorICBjb3V0IDw8ICJcbiI7CisgIAorICBiZW5jaCgibWF0cml4IDN4MyIsIG1hdDMzKTsKKyAgYmVuY2goInF1YXRlcm5pb24iLCBxdWF0KTsKKyAgYmVuY2goInF1YXQtbWF0ICAiLCBxdWF0bWF0KTsKKyAgYmVuY2goImlzb21ldHJ5MyAiLCBpc28zKTsKKyAgYmVuY2goImFmZmluZTMgICAiLCBhZmYzKTsKKyAgYmVuY2goImMgYWZmaW5lMyAiLCBjYWZmMyk7CisgIGJlbmNoKCJwcm9qMyAgICAgIiwgcHJvajMpOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9jaGFuZ2VzZXRzLnR4dCBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL2NoYW5nZXNldHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGViOWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9jaGFuZ2VzZXRzLnR4dApAQCAtMCwwICsxLDYxIEBACisjMy4wLjEKKyMzLjEuMQorIzMuMi4wCiszLjIuNAorIzU3NDU6MzdmNTllNjVlYjZjCis1ODkxOmQ4NjUyNzA5MzQ1ZCAgIyBpbnRyb2R1Y2UgQVZYCisjNTg5MzoyNGI0ZGM5MmM2ZDMgICMgbWVyZ2UKKzU4OTU6OTk3YzJlZjlmYzhiICAjIGludHJvZHVjZSBGTUEKKyM1OTA0OmUxZWFmZDE0ZWFhMSAgIyBjb21wbGV4IGFuZCBBVlgKKzU5MDg6ZjhlZTNjNzIxMjUxICAjIGltcHJvdmUgcGFja2luZyB3aXRoIHB0cmFuc3Bvc2UKKyM1OTIxOmNhODA4YmI0NTZiMCAgIyBtZXJnZQorIzU5Mjc6OGIxMDAxZjllM2FjCis1OTM3OjVhNGNhMWFkOGM1MyAgIyBOZXcgZ2VicCBrZXJuZWwgaGFuZGxpbmcgdXAgdG8gMyBwYWNrZXRzIHggNCByZWdpc3Rlci1sZXZlbCBibG9ja3MKKyM1OTQ5OmYzNDg4ZjRlNDViMiAgIyBtZXJnZQorIzU5Njk6ZTA5MDMxZGNjZmQ5ICAjIERpc2FibGUgM3BYNCBrZXJuZWwgb24gQWx0aXZlYworIzU5OTI6NGE0MjlmNWUwNDgzICAjIG1lcmdlCitiZWZvcmUtZXZhbHVhdG9ycworIzYzMzQ6ZjZhNDVlNWI4YjdjICAjIEltcGxlbWVudCBldmFsdWF0b3IgZm9yIHNwYXJzZSBvdXRlciBwcm9kdWN0cworIzY2Mzk6YzkxMjFjNjBiNWM3CisjNjY1NTowNmYxNjNiNTIyMWYgICMgUHJvcGVybHkgZGV0ZWN0IEZNQSBzdXBwb3J0IG9uIEFSTQorIzY2Nzc6NzAwZTAyMzA0NGU3ICAgIyBGTUEgaGFzIGJlZW4gd3JvbmdseSBkaXNhYmxlZAorIzY2ODE6MTFkMzFkYWZiMGUzCisjNjY5OTo1ZTZlOGUxMGFhZDEgICAjIG1lcmdlIGRlZmF1bHQgdG8gdGVuc29ycworIzY3MjY6ZmYyZDIzODhlN2I5ICAgIyBtZXJnZSBkZWZhdWx0IHRvIHRlbnNvcnMKKyM2NzQyOjBjYmQ2MTk1ZTgyOSAgICMgbWVyZ2UgZGVmYXVsdCB0byB0ZW5zb3JzCisjNjc0Nzo4NTNkMmJhZmViOGYgICAjIEdlbmVyYWxpemVkIHRoZSBnZWJwIGFwaXMKKzY3NjU6NzE1ODRmZDU1NzYyICAgIyBNYWRlIHRoZSBibG9ja2luZyBjb21wdXRhdGlvbiBhd2FyZSBvZiB0aGUgbDMgY2FjaGU7IEFsc28gb3B0aW1pemVkIHRoZSBibG9ja2luZyBwYXJhbWV0ZXJzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB1c2VkIGZvciBhIGNvbXB1dGF0aW9uCisjNjc4MTo5Y2M1YTkzMWIyYzYgICAjIGdlbmVyYWxpemVkIGdlbXYKKyM2NzkyOmY2ZTFkYWFiNjAwYSAgICMgZW5zdXJlZCB0aGF0IGNvbnRyYWN0aW9ucyB0aGF0IGNhbiBiZSByZWR1Y2VkIHRvIGEgbWF0cml4IHZlY3RvciBwcm9kdWN0CisjNjg0NDowMzllZmQ4NmI3NWMgICAjIG1lcmdlIHRlbnNvcgorNjg0NTo3MzMzZWQ0MGM2ZWYgICAjIGNoYW5nZSBwcmVmZXRjaGluZyBpbiBnZWJwCisjNjg1NjpiNWJlNWUxMGViN2YgICAjIG1lcmdlIGluZGV4IGNvbnZlcnNpb24KKyM2ODkzOmMzYTY0YWJhN2M3MCAgICMgY2xlYW4gYmxvY2tpbmcgc2l6ZSBjb21wdXRhdGlvbgorIzY4OTg6NmZiMzFlYmU2NDkyICAgIyByb3RhdGluZyBrZXJuZWwgZm9yIEFSTQorNjg5OTo4NzdmYWNhY2U3NDYgICAjIHJvdGF0aW5nIGtlcm5lbCBmb3IgQVJNIG9ubHkKKyM2OTA0OmMyNTA2MjNhZTlmYSAgICMgcmVzdWx0X29mCis2OTIxOjkxNWYxYjFmYzE1OCAgICMgZml4IHByZWZldGNoaW5nIGNoYW5nZSBmb3IgQVJNCis2OTIzOjlmZjI1ZjZkYWNjNiAgICMgcHJlZmV0Y2hpbmcKKzY5MzM6NTI1NzJlNjBiNWQzICAgIyBibG9ja2luZyBzaXplIHN0cmF0ZWd5Cis2OTM3OmM4YzA0MmYyODZiMiAgICMgYXZvaWQgcmVkdW5kYW50IHBhY2tfcmhzCis2OTgxOjdlNWQ2Zjc4ZGE1OSAgICMgZHluYW1pYyBsb29wIHN3YXBwaW5nCis2OTg0OjQ1ZjI2ODY2YzA5MSAgICMgcm0gZHluYW1pYyBsb29wIHN3YXBwaW5nLCBhZGp1c3QgbGhzJ3MgbWljcm8gcGFuZWwgaGVpZ2h0IHRvIGZ1bGx5IGV4cGxvaXQgTDEgY2FjaGUKKzY5ODY6YTY3NWQwNWI2ZjhmICAgIyBibG9ja2luZyBoZXVyaXN0aWM6IGJsb2NrIG9uIHRoZSByaHMgaW4gTDEgaWYgdGhlIGxocyBmaXQgaW4gTDEuCis3MDEzOmY4NzVlNzVmMDdlNSAgICMgb3JnYW5pemUgYSBsaXR0bGUgb3VyIGRlZmF1bHQgY2FjaGUgc2l6ZXMsIGFuZCB1c2UgYSBzYW5lciBkZWZhdWx0IEwxIG91dHNpZGUgb2YgeDg2ICgxMCUgZmFzdGVyIG9uIE5leHVzIDUpCis3MDE1OjhhYWQ4ZjM1Yzk1NSAgICMgUmVmYWN0b3IgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHVzaW5nIGxvb2t1cCB0YWJsZXMKKzcwMTY6YTU4ZDI1M2U4YzkxICAgIyBQb2xpc2ggbG9va3VwIHRhYmxlcyBnZW5lcmF0aW9uCis3MDE4OjliMjcyOTRhODE4NiAgICMgYWN0dWFsX3BhbmVsX3Jvd3MgY29tcHV0YXRpb24gc2hvdWxkIGFsd2F5cyBiZSByZXNpbGllbnQgdG8gcGFyYW1ldGVycyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBrbm93biBMMSBjYWNoZSBzaXplLCBzZWUgY29tbWVudAorNzAxOTpjNzU4YjFlMmMwNzMgICAjIFByb3ZpZGUgYSBlbXBpcmljYWwgbG9va3VwIHRhYmxlIGZvciBibG9ja2luZyBzaXplcyBtZWFzdXJlZCBvbiBhIE5leHVzIDUuIE9ubHkgZm9yIGZsb2F0LCBvbmx5IGZvciBBbmRyb2lkIG9uIEFSTSAzMmJpdCBmb3Igbm93LgorNzA4NTo2MjdlMDM5ZmJhNjggICAjIEJ1ZyA5ODY6IGFkZCBzdXBwb3J0IGZvciBjb2VmZmljaWVudC1iYXNlZCBwcm9kdWN0IHdpdGggMCBkZXB0aC4KKzcwOTg6YjZmMWRiOWNmOWVjICAgIyBCdWcgOTkyOiBkb24ndCBzZWxlY3QgYSAzcCBHRU1NIHBhdGggd2l0aCBub24tdmVjdG9yaXphYmxlIHNjYWxhciB0eXBlcywgdGhpcyBoaXRzIHVuc3VwcG9ydGVkIHBhdGhzIGluIHN5bW0vdHJpYW5ndWxhciBwcm9kdWN0cyBjb2RlCis3NTkxOjA5YThlMjE4NjYxMCAgICMgMy4zLWFscGhhMQorNzY1MDpiMGYzYzhmNDMwMjUgICAjIGhlbHAgY2xhbmcgaW5saW5pbmcKKyM4NzQ0Ojc0Yjc4OWFkYTkyYSAgICMgSW1wcm92ZWQgdGhlIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiBibG9ja2luZyBpbiB0aGUgY2FzZSB3aGVyZSBtciBpcyBub3QgYSBwb3dlciBvZiAyIChlLmcgb24gSGFzd2VsbCBDUFVzKQorODc4OTplZmNiOTEyZTQzNTYgICAjIE1hZGUgdGhlIGluZGV4IHR5cGUgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdG8gZXZhbHVhdGVQcm9kdWN0QmxvY2tpbmdTaXplcy4gVXNlIG51bWV4dDo6bWluaSBhbmQgbnVtZXh0OjptYXhpIGluc3RlYWQgb2Ygc3RkOjptaW4vc3RkOjptYXggdG8gY29tcHV0ZSBibG9ja2luZyBzaXplcworODk3Mjo4MWQ1M2M3MTE3NzUgICAjIERvbid0IG9wdGltaXplIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBsYXN0IHJvd3Mgb2YgYSBtYXRyaXggbWF0cml4IHByb2R1Y3QgaW4gY2FzZXMgdGhhdCB2aW9sYXRlIHRoZSBhc3N1bXB0aW9ucyBtYWRlIGJ5IHRoZSBvcHRpbWl6ZWQgY29kZSBwYXRoCis4OTg1OmQ5MzVkZjIxYTA4MiAgICMgUmVtb3ZlIHRoZSByb3RhdGluZyBrZXJuZWwuCis4OTg4OjZjMmRjNTZlNzNiMyAgICMgQnVnIDI1NjogZW5hYmxlIHZlY3Rvcml6YXRpb24gd2l0aCB1bmFsaWduZWQgbG9hZHMvc3RvcmVzLgorOTE0ODpiOGI4YzQyMWUzNmMgICAjIFJlbGF4IG1peGluZy10eXBlIGNvbnN0cmFpbnRzIGZvciBiaW5hcnkgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRvcnMKKzkxNzQ6ZDIyOGJjMjgyYWM5ICAgIyBtZXJnZQorOTIxMjpjOTAwOThhZmZhN2IgICAjIEZpeCBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gY2hhbmdlc2V0IDhhYWQ4ZjM1Yzk1NQorOTIxMzo5ZjFjMTRlNDY5NGIgICAjIEZpeCBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIGRnZW1tIGludHJvZHVjZWQgYnkgY2hhbmdlc2V0IDgxZDUzYzcxMTc3NQpkaWZmIC0tZ2l0IGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vZ2VtbS5jcHAgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9nZW1tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRiZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vZ2VtbS5jcHAKQEAgLTAsMCArMSw2NyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSAiLi4vLi4vQmVuY2hUaW1lci5oIgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFNDQUxBUgorI2Vycm9yIFNDQUxBUiBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorCit0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CisKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdDsKKworRUlHRU5fRE9OVF9JTkxJTkUKK3ZvaWQgZ2VtbShjb25zdCBNYXQgJkEsIGNvbnN0IE1hdCAmQiwgTWF0ICZDKQoreworICBDLm5vYWxpYXMoKSArPSBBICogQjsKK30KKworRUlHRU5fRE9OVF9JTkxJTkUKK2RvdWJsZSBiZW5jaChsb25nIG0sIGxvbmcgbiwgbG9uZyBrKQoreworICBNYXQgQShtLGspOworICBNYXQgQihrLG4pOworICBNYXQgQyhtLG4pOworICBBLnNldFJhbmRvbSgpOworICBCLnNldFJhbmRvbSgpOworICBDLnNldFplcm8oKTsKKyAgCisgIEJlbmNoVGltZXIgdDsKKyAgCisgIGRvdWJsZSB1cCA9IDFlOCo0L3NpemVvZihTY2FsYXIpOworICBkb3VibGUgdG0wID0gNCwgdG0xID0gMTA7CisgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgIHsKKyAgICB1cCAvPSA0OworICAgIHRtMCA9IDI7CisgICAgdG0xID0gNDsKKyAgfQorICAKKyAgZG91YmxlIGZsb3BzID0gMi4gKiBtICogbiAqIGs7CisgIGxvbmcgcmVwID0gc3RkOjptYXgoMS4sIHN0ZDo6bWluKDEwMC4sIHVwL2Zsb3BzKSApOworICBsb25nIHRyaWVzID0gc3RkOjptYXgodG0wLCBzdGQ6Om1pbih0bTEsIHVwL2Zsb3BzKSApOworICAKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgZ2VtbShBLEIsQykpOworICAKKyAgcmV0dXJuIDFlLTkgKiByZXAgKiBmbG9wcyAvIHQuYmVzdCgpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcmVzdWx0czsKKyAgCisgIHN0ZDo6aWZzdHJlYW0gc2V0dGluZ3MoImdlbW1fc2V0dGluZ3MudHh0Iik7CisgIGxvbmcgbSwgbiwgazsKKyAgd2hpbGUoc2V0dGluZ3MgPj4gbSA+PiBuID4+IGspCisgIHsKKyAgICAvL3N0ZDo6Y2VyciA8PCAiICBUZXN0aW5nICIgPDwgbSA8PCAiICIgPDwgbiA8PCAiICIgPDwgayA8PCBzdGQ6OmVuZGw7CisgICAgcmVzdWx0cy5wdXNoX2JhY2soIGJlbmNoKG0sIG4sIGspICk7CisgIH0KKyAgCisgIHN0ZDo6Y291dCA8PCBSb3dWZWN0b3JYZDo6TWFwKHJlc3VsdHMuZGF0YSgpLCByZXN1bHRzLnNpemUoKSk7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL2dlbW1fc2V0dGluZ3MudHh0IGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vZ2VtbV9zZXR0aW5ncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0M2UxYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL2dlbW1fc2V0dGluZ3MudHh0CkBAIC0wLDAgKzEsMTUgQEAKKzggOCA4Cis5IDkgOQorMjQgMjQgMjQKKzIzOSAyMzkgMjM5CisyNDAgMjQwIDI0MAorMjQwMCAyNCAyNAorMjQgMjQwMCAyNAorMjQgMjQgMjQwMAorMjQgMjQwMCAyNDAwCisyNDAwIDI0IDI0MDAKKzI0MDAgMjQwMCAyNAorMjQwMCAyNDAwIDY0Cis0ODAwIDIzIDE2MAorMjMgNDgwMCAxNjAKKzI0MDAgMjQwMCAyNDAwCmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9sYXp5X2dlbW0uY3BwIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vbGF6eV9nZW1tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGMzNzAxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vbGF6eV9nZW1tLmNwcApAQCAtMCwwICsxLDk4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlICIuLi8uLi9CZW5jaFRpbWVyLmgiCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0NBTEFSCisjZXJyb3IgU0NBTEFSIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgTWF0QiwgdHlwZW5hbWUgTWF0Qz4KK0VJR0VOX0RPTlRfSU5MSU5FCit2b2lkIGxhenlfZ2VtbShjb25zdCBNYXRBICZBLCBjb25zdCBNYXRCICZCLCBNYXRDICZDKQoreworLy8gICBlc2NhcGUoKHZvaWQqKUEuZGF0YSgpKTsKKy8vICAgZXNjYXBlKCh2b2lkKilCLmRhdGEoKSk7CisgIEMubm9hbGlhcygpICs9IEEubGF6eVByb2R1Y3QoQik7CisvLyAgIGVzY2FwZSgodm9pZCopQy5kYXRhKCkpOworfQorCit0ZW1wbGF0ZTxpbnQgbSwgaW50IG4sIGludCBrLCBpbnQgVEE+CitFSUdFTl9ET05UX0lOTElORQorZG91YmxlIGJlbmNoKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLG0sayxUQT4gTWF0QTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLGssbj4gTWF0QjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLG0sbj4gTWF0QzsKKworICBNYXRBIEEobSxrKTsKKyAgTWF0QiBCKGssbik7CisgIE1hdEMgQyhtLG4pOworICBBLnNldFJhbmRvbSgpOworICBCLnNldFJhbmRvbSgpOworICBDLnNldFplcm8oKTsKKworICBCZW5jaFRpbWVyIHQ7CisKKyAgZG91YmxlIHVwID0gMWU3KjQvc2l6ZW9mKFNjYWxhcik7CisgIGRvdWJsZSB0bTAgPSAxMCwgdG0xID0gMjA7CisKKyAgZG91YmxlIGZsb3BzID0gMi4gKiBtICogbiAqIGs7CisgIGxvbmcgcmVwID0gc3RkOjptYXgoMTAuLCBzdGQ6Om1pbigxMDAwMC4sIHVwL2Zsb3BzKSApOworICBsb25nIHRyaWVzID0gc3RkOjptYXgodG0wLCBzdGQ6Om1pbih0bTEsIHVwL2Zsb3BzKSApOworCisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGxhenlfZ2VtbShBLEIsQykpOworCisgIHJldHVybiAxZS05ICogcmVwICogZmxvcHMgLyB0LmJlc3QoKTsKK30KKwordGVtcGxhdGU8aW50IG0sIGludCBuLCBpbnQgaz4KK2RvdWJsZSBiZW5jaF90KGludCB0KQoreworICBpZih0KQorICAgIHJldHVybiBiZW5jaDxtLG4sayxSb3dNYWpvcj4oKTsKKyAgZWxzZQorICAgIHJldHVybiBiZW5jaDxtLG4saywwPigpOworfQorCitFSUdFTl9ET05UX0lOTElORQorZG91YmxlIGJlbmNoX21uayhpbnQgbSwgaW50IG4sIGludCBrLCBpbnQgdCkKK3sKKyAgaW50IGlkID0gbSoxMDAwMCArIG4qMTAwICsgazsKKyAgc3dpdGNoKGlkKSB7CisgICAgY2FzZSAgMTAxMDEgOiByZXR1cm4gYmVuY2hfdDwgMSwgMSwgMT4odCk7IGJyZWFrOworICAgIGNhc2UgIDIwMjAyIDogcmV0dXJuIGJlbmNoX3Q8IDIsIDIsIDI+KHQpOyBicmVhazsKKyAgICBjYXNlICAzMDMwMyA6IHJldHVybiBiZW5jaF90PCAzLCAzLCAzPih0KTsgYnJlYWs7CisgICAgY2FzZSAgNDA0MDQgOiByZXR1cm4gYmVuY2hfdDwgNCwgNCwgND4odCk7IGJyZWFrOworICAgIGNhc2UgIDUwNTA1IDogcmV0dXJuIGJlbmNoX3Q8IDUsIDUsIDU+KHQpOyBicmVhazsKKyAgICBjYXNlICA2MDYwNiA6IHJldHVybiBiZW5jaF90PCA2LCA2LCA2Pih0KTsgYnJlYWs7CisgICAgY2FzZSAgNzA3MDcgOiByZXR1cm4gYmVuY2hfdDwgNywgNywgNz4odCk7IGJyZWFrOworICAgIGNhc2UgIDgwODA4IDogcmV0dXJuIGJlbmNoX3Q8IDgsIDgsIDg+KHQpOyBicmVhazsKKyAgICBjYXNlICA5MDkwOSA6IHJldHVybiBiZW5jaF90PCA5LCA5LCA5Pih0KTsgYnJlYWs7CisgICAgY2FzZSAxMDEwMTAgOiByZXR1cm4gYmVuY2hfdDwxMCwxMCwxMD4odCk7IGJyZWFrOworICAgIGNhc2UgMTExMTExIDogcmV0dXJuIGJlbmNoX3Q8MTEsMTEsMTE+KHQpOyBicmVhazsKKyAgICBjYXNlIDEyMTIxMiA6IHJldHVybiBiZW5jaF90PDEyLDEyLDEyPih0KTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZXN1bHRzOworICAKKyAgc3RkOjppZnN0cmVhbSBzZXR0aW5ncygibGF6eV9nZW1tX3NldHRpbmdzLnR4dCIpOworICBsb25nIG0sIG4sIGssIHQ7CisgIHdoaWxlKHNldHRpbmdzID4+IG0gPj4gbiA+PiBrID4+IHQpCisgIHsKKyAgICAvL3N0ZDo6Y2VyciA8PCAiICBUZXN0aW5nICIgPDwgbSA8PCAiICIgPDwgbiA8PCAiICIgPDwgayA8PCBzdGQ6OmVuZGw7CisgICAgcmVzdWx0cy5wdXNoX2JhY2soIGJlbmNoX21uayhtLCBuLCBrLCB0KSApOworICB9CisgIAorICBzdGQ6OmNvdXQgPDwgUm93VmVjdG9yWGQ6Ok1hcChyZXN1bHRzLmRhdGEoKSwgcmVzdWx0cy5zaXplKCkpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9sYXp5X2dlbW1fc2V0dGluZ3MudHh0IGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vbGF6eV9nZW1tX3NldHRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDdkNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vbGF6eV9nZW1tX3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDE1IEBACisxIDEgMSAwCisyIDIgMiAwCiszIDMgMyAwCis0IDQgNCAwCis0IDQgNCAxCis1IDUgNSAwCis2IDYgNiAwCis3IDcgNyAwCis3IDcgNyAxCis4IDggOCAwCis5IDkgOSAwCisxMCAxMCAxMCAwCisxMSAxMSAxMSAwCisxMiAxMiAxMiAwCisxMiAxMiAxMiAxCmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9tYWtlX3Bsb3Quc2ggYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS9tYWtlX3Bsb3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2QzMjE0YQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL21ha2VfcGxvdC5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vYmFzaAorCisjIGJhc2UgbmFtZSBvZiB0aGUgYmVuY2gKKyMgaXQgcmVhZHMgJDEub3V0CisjIGFuZCBnZW5lcmF0ZXMgJDEucGRmCitXSEFUPSQxCitiZW5jaD0kMgorCitoZWFkZXI9InJldiAiCit3aGlsZSByZWFkIGxpbmUKK2RvCisgIGlmIFsgISAteiAnJGxpbmUnIF07IHRoZW4KKyAgICBoZWFkZXI9IiRoZWFkZXIgIFwiJGxpbmVcIiIKKyAgZmkKK2RvbmUgPCAkYmVuY2giX3NldHRpbmdzLnR4dCIKKworZWNobyAkaGVhZGVyID4gJFdIQVQub3V0LmhlYWRlcgorY2F0ICRXSEFULm91dCA+PiAkV0hBVC5vdXQuaGVhZGVyCisKKworZWNobyAic2V0IHRpdGxlICckV0hBVCciID4gJFdIQVQuZ251cGxvdAorZWNobyAic2V0IGtleSBhdXRvdGl0bGUgY29sdW1uaGVhZCBvdXRzaWRlICIgPj4gJFdIQVQuZ251cGxvdAorZWNobyAic2V0IHh0aWNzIHJvdGF0ZSAxIiA+PiAkV0hBVC5nbnVwbG90CisKK2VjaG8gInNldCB0ZXJtIHBkZiBjb2xvciByb3VuZGVkIGVuaGFuY2VkIGZvbnRzY2FsZSAwLjM1IHNpemUgN2luLDVpbiIgPj4gJFdIQVQuZ251cGxvdAorZWNobyBzZXQgb3V0cHV0ICInIiRXSEFULnBkZiInIiA+PiAkV0hBVC5nbnVwbG90CisKK2NvbD1gY2F0ICRiZW5jaCJfc2V0dGluZ3MudHh0IiB8IHdjIC1sYAorZWNobyAicGxvdCBmb3IgW2NvbD0yOiRjb2wrMV0gJyRXSEFULm91dC5oZWFkZXInIHVzaW5nIDA6Y29sOnh0aWNsYWJlbHMoMSkgd2l0aCBsaW5lcyIgPj4gJFdIQVQuZ251cGxvdAorZWNobyAiICIgPj4gICRXSEFULmdudXBsb3QKKworZ251cGxvdCAtcGVyc2lzdCA8ICRXSEFULmdudXBsb3QKKworIyBnZW5lcmF0ZSBhIHBuZyBmaWxlCisjIGNvbnZlcnQgLWJhY2tncm91bmQgd2hpdGUgLWRlbnNpdHkgMTIwIC1yb3RhdGUgOTAgLXJlc2l6ZSA4MDAgK2RpdGhlciAtY29sb3JzIDI1NiAtcXVhbGl0eSAwICRXSEFULnBzIC1iYWNrZ3JvdW5kIHdoaXRlIC1mbGF0dGVuICAuJFdIQVQucG5nCisKKyMgY2xlYW4KK3JtICRXSEFULm91dC5oZWFkZXIgJFdIQVQuZ251cGxvdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL3J1bi5zaCBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tL3J1bi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZDZlZTQwCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0vcnVuLnNoCkBAIC0wLDAgKzEsMTU2IEBACisjIS9iaW4vYmFzaAorCisjIC4vcnVuLnNoIGdlbW0KKyMgLi9ydW4uc2ggbGF6eV9nZW1tCisKKyMgRXhhbXBsZXMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIHNldDoKKyMgICBQUkVGSVg9Imhhc3dlbGwtZm1hLSIKKyMgICBDWFhfRkxBR1M9Ii1tZm1hIgorCisjIE9wdGlvbnM6CisjICAgLXVwIDogZW5mb3JjZSB0aGUgcmVjb21wdXRhdGlvbiBvZiBleGlzdGluZyBkYXRhLCBhbmQga2VlcCBiZXN0IHJlc3VsdHMgYXMgYSBtZXJnaW5nIHN0cmF0ZWd5CisjICAgLXMgIDogcmVjb21wdXRlIHNlbGVjdGVkIGNoYW5nZXNldHMgb25seSBhbmQga2VlcCBiZXN0cworCitiZW5jaD0kMQorCitpZiBlY2hvICIkKiIgfCBncmVwICdcLXVwJyA+IC9kZXYvbnVsbDsgdGhlbgorICB1cGRhdGU9dHJ1ZQorZWxzZQorICB1cGRhdGU9ZmFsc2UKK2ZpCisKK2lmIGVjaG8gIiQqIiB8IGdyZXAgJ1wtcycgPiAvZGV2L251bGw7IHRoZW4KKyAgc2VsZWN0ZWQ9dHJ1ZQorZWxzZQorICBzZWxlY3RlZD1mYWxzZQorZmkKKworZ2xvYmFsX2FyZ3M9IiQqIgorCitpZiBbICRzZWxlY3RlZCA9PSB0cnVlIF07IHRoZW4KKyBlY2hvICJSZWNvbXB1dGUgc2VsZWN0ZWQgY2hhbmdlc2V0cyBvbmx5IGFuZCBrZWVwIGJlc3RzIgorZWxpZiBbICR1cGRhdGUgPT0gdHJ1ZSBdOyB0aGVuCisgZWNobyAiKFJlLSlDb21wdXRlIGFsbCBjaGFuZ2VzZXRzIGFuZCBrZWVwIGJlc3RzIgorZWxzZQorIGVjaG8gIlNraXAgcHJldmlvdXNseSBjb21wdXRlZCBjaGFuZ2VzZXRzIgorZmkKKworCisKK2lmIFsgISAtZCAiZWlnZW5fc3JjIiBdOyB0aGVuCisgIGhnIGNsb25lIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9laWdlbi9laWdlbiBlaWdlbl9zcmMKK2Vsc2UKKyAgY2QgZWlnZW5fc3JjCisgIGhnIHB1bGwgLXUKKyAgY2QgLi4KK2ZpCisKK2lmIFsgISAteiAnJENYWCcgXTsgdGhlbgorICBDWFg9ZysrCitmaQorCitmdW5jdGlvbiBtYWtlX2JhY2t1cAoreworICBpZiBbIC1mICIkMS5vdXQiIF07IHRoZW4KKyAgICBtdiAiJDEub3V0IiAiJDEuYmFja3VwIgorICBmaQorfQorCitmdW5jdGlvbiBtZXJnZQoreworICBjb3VudDE9YGVjaG8gJDEgfCAgd2MgLXdgCisgIGNvdW50Mj1gZWNobyAkMiB8ICB3YyAtd2AKKyAgCisgIGlmIFsgJGNvdW50MSA9PSAkY291bnQyIF07IHRoZW4KKyAgICBhPSggJDEgKTsgYj0oICQyICkKKyAgICByZXM9IiIKKyAgICBmb3IgKCggaT0wIDsgaTwkY291bnQxIDsgaSsrICkpOyBkbworICAgICAgYWk9JHthWyRpXX07IGJpPSR7YlskaV19CisgICAgICB0bXA9YGVjaG8gImlmICgkYWkgPiAkYmkpICRhaSBlbHNlICRiaSAiIHwgYmMgLWxgCisgICAgICByZXM9IiRyZXMgJHRtcCIKKyAgICBkb25lCisgICAgZWNobyAkcmVzCisKKyAgZWxzZQorICAgIGVjaG8gJDEKKyAgZmkKK30KKworZnVuY3Rpb24gdGVzdF9jdXJyZW50IAoreworICByZXY9JDEKKyAgc2NhbGFyPSQyCisgIG5hbWU9JDMKKyAgCisgIHByZXY9IiIKKyAgaWYgWyAtZSAiJG5hbWUuYmFja3VwIiBdOyB0aGVuCisgICAgcHJldj1gZ3JlcCAkcmV2ICIkbmFtZS5iYWNrdXAiIHwgY3V0IC1jIDE0LWAKKyAgZmkKKyAgcmVzPSRwcmV2CisgIGNvdW50X3Jldj1gZWNobyAkcHJldiB8ICB3YyAtd2AKKyAgY291bnRfcmVmPWBjYXQgJGJlbmNoIl9zZXR0aW5ncy50eHQiIHwgIHdjIC1sYAorICBpZiBlY2hvICIkZ2xvYmFsX2FyZ3MiIHwgZ3JlcCAiJHJldiIgPiAvZGV2L251bGw7IHRoZW4KKyAgICByZXZfZm91bmQ9dHJ1ZQorICBlbHNlCisgICAgcmV2X2ZvdW5kPWZhbHNlCisgIGZpCisjICBlY2hvICR1cGRhdGUgZXQgJHNlbGVjdGVkIGV0ICRyZXZfZm91bmQgYmVjYXVzZSAkcmV2IGV0ICIkZ2xvYmFsX2FyZ3MiCisjICBlY2hvICRjb3VudF9yZXYgZXQgJGNvdW50X3JlZgorICBpZiBbICR1cGRhdGUgPT0gdHJ1ZSBdIHx8IFsgJGNvdW50X3JldiAhPSAkY291bnRfcmVmIF0gfHwgKFsgJHNlbGVjdGVkID09IHRydWUgXSAmJiAgWyAkcmV2X2ZvdW5kID09IHRydWUgXSk7IHRoZW4KKyAgICBpZiAkQ1hYIC1PMiAtRE5ERUJVRyAtbWFyY2g9bmF0aXZlICRDWFhfRkxBR1MgLUkgZWlnZW5fc3JjICRiZW5jaC5jcHAgLURTQ0FMQVI9JHNjYWxhciAtbyAkbmFtZTsgdGhlbgorICAgICAgY3Vycj1gLi8kbmFtZWAKKyAgICAgIGlmIFsgJGNvdW50X3JldiA9PSAkY291bnRfcmVmIF07IHRoZW4KKyAgICAgICAgZWNobyAibWVyZ2UgcHJldmlvdXMgJHByZXYiCisgICAgICAgIGVjaG8gIndpdGggbmV3ICAgICAgICRjdXJyIgorICAgICAgZWxzZQorICAgICAgICBlY2hvICJnb3QgICAgICAgICAgICAkY3VyciIKKyAgICAgIGZpCisgICAgICByZXM9YG1lcmdlICIkY3VyciIgIiRwcmV2ImAKKyMgICAgICAgZWNobyAkcmVzCisgICAgICBlY2hvICIkcmV2ICRyZXMiID4+ICRuYW1lLm91dAorICAgIGVsc2UKKyAgICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgc2tpcCByZXYgJHJldiIKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiU2tpcCBleGlzdGluZyByZXN1bHRzIGZvciAkcmV2IC8gJG5hbWUiCisgICAgZWNobyAiJHJldiAkcmVzIiA+PiAkbmFtZS5vdXQKKyAgZmkKK30KKworbWFrZV9iYWNrdXAgJFBSRUZJWCJzIiRiZW5jaAorbWFrZV9iYWNrdXAgJFBSRUZJWCJkIiRiZW5jaAorbWFrZV9iYWNrdXAgJFBSRUZJWCJjIiRiZW5jaAorCitjdXQgLWYxIC1kIiMiIDwgY2hhbmdlc2V0cy50eHQgfCBncmVwIC1FICdbWzphbG51bTpdXScgfCB3aGlsZSByZWFkIHJldgorZG8KKyAgaWYgWyAhIC16ICckcmV2JyBdOyB0aGVuCisgICAgZWNobyAiVGVzdGluZyByZXYgJHJldiIKKyAgICBjZCBlaWdlbl9zcmMKKyAgICBoZyB1cCAtQyAkcmV2ID4gL2Rldi9udWxsCisgICAgYWN0dWFsX3Jldj1gaGcgaWRlbnRpZnkgfCBjdXQgLWYxIC1kJyAnYAorICAgIGNkIC4uCisgICAgCisgICAgdGVzdF9jdXJyZW50ICRhY3R1YWxfcmV2IGZsb2F0ICAgICAgICAgICAgICAgICAgJFBSRUZJWCJzIiRiZW5jaAorICAgIHRlc3RfY3VycmVudCAkYWN0dWFsX3JldiBkb3VibGUgICAgICAgICAgICAgICAgICRQUkVGSVgiZCIkYmVuY2gKKyAgICB0ZXN0X2N1cnJlbnQgJGFjdHVhbF9yZXYgInN0ZDo6Y29tcGxleDxkb3VibGU+IiAkUFJFRklYImMiJGJlbmNoCisgIGZpCisgIAorZG9uZQorCitlY2hvICJGbG9hdDoiCitjYXQgJFBSRUZJWCJzIiIkYmVuY2gub3V0IgorZWNobyAiICIKKworZWNobyAiRG91YmxlOiIKK2NhdCAkUFJFRklYImQiIiRiZW5jaC5vdXQiCitlY2hvICIiCisKK2VjaG8gIkNvbXBsZXg6IgorY2F0ICRQUkVGSVgiYyIiJGJlbmNoLm91dCIKK2VjaG8gIiIKKworLi9tYWtlX3Bsb3Quc2ggJFBSRUZJWCJzIiRiZW5jaCAkYmVuY2gKKy4vbWFrZV9wbG90LnNoICRQUkVGSVgiZCIkYmVuY2ggJGJlbmNoCisuL21ha2VfcGxvdC5zaCAkUFJFRklYImMiJGJlbmNoICRiZW5jaAorCisKZGlmZiAtLWdpdCBhL2JlbmNoL3Byb2R1Y3RfdGhyZXNob2xkLmNwcCBiL2JlbmNoL3Byb2R1Y3RfdGhyZXNob2xkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZkMTVhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcHJvZHVjdF90aHJlc2hvbGQuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBFTkQgOQorCit0ZW1wbGF0ZTxpbnQgUz4gc3RydWN0IG1hcF9zaXplIHsgZW51bSB7IHJldCA9IFMgfTsgfTsKK3RlbXBsYXRlPD4gIHN0cnVjdCBtYXBfc2l6ZTwxMD4geyBlbnVtIHsgcmV0ID0gMjAgfTsgfTsKK3RlbXBsYXRlPD4gIHN0cnVjdCBtYXBfc2l6ZTwxMT4geyBlbnVtIHsgcmV0ID0gNTAgfTsgfTsKK3RlbXBsYXRlPD4gIHN0cnVjdCBtYXBfc2l6ZTwxMj4geyBlbnVtIHsgcmV0ID0gMTAwIH07IH07Cit0ZW1wbGF0ZTw+ICBzdHJ1Y3QgbWFwX3NpemU8MTM+IHsgZW51bSB7IHJldCA9IDMwMCB9OyB9OworCit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4saW50IEs+IHN0cnVjdCBhbHRfcHJvZAoreworICBlbnVtIHsKKyAgICByZXQgPSBNPT0xICYmIE49PTEgPyBJbm5lclByb2R1Y3QKKyAgICAgICAgOiBLPT0xID8gT3V0ZXJQcm9kdWN0CisgICAgICAgIDogTT09MSA/IEdlbXZQcm9kdWN0CisgICAgICAgIDogTj09MSA/IEdlbXZQcm9kdWN0CisgICAgICAgIDogR2VtbVByb2R1Y3QKKyAgfTsKK307CisgICAgICAgIAordm9pZCBwcmludF9tb2RlKGludCBtb2RlKQoreworICBpZihtb2RlPT1Jbm5lclByb2R1Y3QpIHN0ZDo6Y291dCA8PCAiaSI7CisgIGlmKG1vZGU9PU91dGVyUHJvZHVjdCkgc3RkOjpjb3V0IDw8ICJvIjsKKyAgaWYobW9kZT09Q29lZmZCYXNlZFByb2R1Y3RNb2RlKSBzdGQ6OmNvdXQgPDwgImMiOworICBpZihtb2RlPT1MYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlKSBzdGQ6OmNvdXQgPDwgImwiOworICBpZihtb2RlPT1HZW12UHJvZHVjdCkgc3RkOjpjb3V0IDw8ICJ2IjsKKyAgaWYobW9kZT09R2VtbVByb2R1Y3QpIHN0ZDo6Y291dCA8PCAibSI7Cit9CisKK3RlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBwcm9kKGNvbnN0IExocyYgYSwgY29uc3QgUmhzJiBiLCBSZXMmIGMpCit7CisgIGMubm9hbGlhcygpICs9IHR5cGVuYW1lIFByb2R1Y3RSZXR1cm5UeXBlPExocyxSaHMsTW9kZT46OlR5cGUoYSxiKTsKK30KKwordGVtcGxhdGU8aW50IE0sIGludCBOLCBpbnQgSywgdHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2hfcHJvZCgpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixNLEs+IExoczsgTGhzIGE7IGEuc2V0UmFuZG9tKCk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixLLE4+IFJoczsgUmhzIGI7IGIuc2V0UmFuZG9tKCk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixNLE4+IFJlczsgUmVzIGM7IGMuc2V0UmFuZG9tKCk7CisKKyAgQmVuY2hUaW1lciB0OworICBkb3VibGUgbiA9IDIuKmRvdWJsZShNKSpkb3VibGUoTikqZG91YmxlKEspOworICBpbnQgcmVwID0gMTAwMDAwLi9uOworICByZXAgLz0gMjsKKyAgaWYocmVwPDEpIHJlcCA9IDE7CisgIGRvIHsKKyAgICByZXAgKj0gMjsKKyAgICB0LnJlc2V0KCk7CisgICAgQkVOQ0godCwxLHJlcCxwcm9kPENvZWZmQmFzZWRQcm9kdWN0TW9kZT4oYSxiLGMpKTsKKyAgfSB3aGlsZSh0LmJlc3QoKTwwLjEpOworICAKKyAgdC5yZXNldCgpOworICBCRU5DSCh0LDUscmVwLHByb2Q8TW9kZT4oYSxiLGMpKTsKKworICBwcmludF9tb2RlKE1vZGUpOworICBzdGQ6OmNvdXQgPDwgaW50KDFlLTYqbipyZXAvdC5iZXN0KCkpIDw8ICJcdCI7Cit9CisKK3RlbXBsYXRlPGludCBOPiBzdHJ1Y3QgcHJpbnRfbjsKK3RlbXBsYXRlPGludCBNLCBpbnQgTiwgaW50IEs+IHN0cnVjdCBsb29wX29uX207Cit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLLCB0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlPiBzdHJ1Y3QgbG9vcF9vbl9uOworCit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLPgorc3RydWN0IGxvb3Bfb25faworeworICBzdGF0aWMgdm9pZCBydW4oKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJLPSIgPDwgSyA8PCAiXHQiOworICAgIHByaW50X248Tj46OnJ1bigpOworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworCisgICAgbG9vcF9vbl9tPE0sTixLPjo6cnVuKCk7CisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKworICAgIGxvb3Bfb25fazxNLE4sSysxPjo6cnVuKCk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBNLCBpbnQgTj4KK3N0cnVjdCBsb29wX29uX2s8TSxOLEVORD4geyBzdGF0aWMgdm9pZCBydW4oKXt9IH07CisKKwordGVtcGxhdGU8aW50IE0sIGludCBOLCBpbnQgSz4KK3N0cnVjdCBsb29wX29uX20KK3sKKyAgc3RhdGljIHZvaWQgcnVuKCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCBNIDw8ICJmXHQiOworICAgIGxvb3Bfb25fbjxNLE4sSyxmbG9hdCxDb2VmZkJhc2VkUHJvZHVjdE1vZGU+OjpydW4oKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAKKyAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiZlx0IjsKKyAgICBsb29wX29uX248TSxOLEssZmxvYXQsLTE+OjpydW4oKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKworICAgIGxvb3Bfb25fbTxNKzEsTixLPjo6cnVuKCk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBOLCBpbnQgSz4KK3N0cnVjdCBsb29wX29uX208RU5ELE4sSz4geyBzdGF0aWMgdm9pZCBydW4oKXt9IH07CisKK3RlbXBsYXRlPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+CitzdHJ1Y3QgbG9vcF9vbl9uCit7CisgIHN0YXRpYyB2b2lkIHJ1bigpCisgIHsKKyAgICBiZW5jaF9wcm9kPE0sTixLLFNjYWxhcixNb2RlPT0tMT8gYWx0X3Byb2Q8TSxOLEs+OjpyZXQgOiBNb2RlPigpOworICAgIAorICAgIGxvb3Bfb25fbjxNLE4rMSxLLFNjYWxhcixNb2RlPjo6cnVuKCk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBNLCBpbnQgSywgdHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZT4KK3N0cnVjdCBsb29wX29uX248TSxFTkQsSyxTY2FsYXIsTW9kZT4geyBzdGF0aWMgdm9pZCBydW4oKXt9IH07CisKK3RlbXBsYXRlPGludCBOPiBzdHJ1Y3QgcHJpbnRfbgoreworICBzdGF0aWMgdm9pZCBydW4oKQorICB7CisgICAgc3RkOjpjb3V0IDw8IG1hcF9zaXplPE4+OjpyZXQgPDwgIlx0IjsKKyAgICBwcmludF9uPE4rMT46OnJ1bigpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwcmludF9uPEVORD4geyBzdGF0aWMgdm9pZCBydW4oKXt9IH07CisKK2ludCBtYWluKCkKK3sKKyAgbG9vcF9vbl9rPDEsMSwxPjo6cnVuKCk7CisgIAorICByZXR1cm4gMDsgCit9CmRpZmYgLS1naXQgYS9iZW5jaC9xdWF0X3NsZXJwLmNwcCBiL2JlbmNoL3F1YXRfc2xlcnAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZmIzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9xdWF0X3NsZXJwLmNwcApAQCAtMCwwICsxLDI0NyBAQAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFE+CitFSUdFTl9ET05UX0lOTElORSBRIG5sZXJwKGNvbnN0IFEmIGEsIGNvbnN0IFEmIGIsIHR5cGVuYW1lIFE6OlNjYWxhciB0KQoreworICByZXR1cm4gUSgoYS5jb2VmZnMoKSAqICgxLjAtdCkgKyBiLmNvZWZmcygpICogdCkubm9ybWFsaXplZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfZWlnZW4oY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCit7CisgIHJldHVybiBhLnNsZXJwKHQsYik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFE+CitFSUdFTl9ET05UX0lOTElORSBRIHNsZXJwX2xlZ2FjeShjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOworICBzdGF0aWMgY29uc3QgU2NhbGFyIG9uZSA9IFNjYWxhcigxKSAtIGR1bW15X3ByZWNpc2lvbjxTY2FsYXI+KCk7CisgIFNjYWxhciBkID0gYS5kb3QoYik7CisgIFNjYWxhciBhYnNEID0gaW50ZXJuYWw6OmFicyhkKTsKKyAgaWYgKGFic0Q+PW9uZSkKKyAgICByZXR1cm4gYTsKKworICAvLyB0aGV0YSBpcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgMiBxdWF0ZXJuaW9ucworICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CisgIFNjYWxhciBzaW5UaGV0YSA9IGludGVybmFsOjpzaW4odGhldGEpOworCisgIFNjYWxhciBzY2FsZTAgPSBpbnRlcm5hbDo6c2luKCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpblRoZXRhOworICBTY2FsYXIgc2NhbGUxID0gaW50ZXJuYWw6OnNpbiggKCB0ICogdGhldGEpICkgLyBzaW5UaGV0YTsKKyAgaWYgKGQ8MCkKKyAgICBzY2FsZTEgPSAtc2NhbGUxOworCisgIHJldHVybiBRKHNjYWxlMCAqIGEuY29lZmZzKCkgKyBzY2FsZTEgKiBiLmNvZWZmcygpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfbGVnYWN5X25sZXJwKGNvbnN0IFEmIGEsIGNvbnN0IFEmIGIsIHR5cGVuYW1lIFE6OlNjYWxhciB0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFE6OlNjYWxhciBTY2FsYXI7CisgIHN0YXRpYyBjb25zdCBTY2FsYXIgb25lID0gU2NhbGFyKDEpIC0gZXBzaWxvbjxTY2FsYXI+KCk7CisgIFNjYWxhciBkID0gYS5kb3QoYik7CisgIFNjYWxhciBhYnNEID0gaW50ZXJuYWw6OmFicyhkKTsKKyAgCisgIFNjYWxhciBzY2FsZTA7CisgIFNjYWxhciBzY2FsZTE7CisgIAorICBpZiAoYWJzRD49b25lKQorICB7CisgICAgc2NhbGUwID0gU2NhbGFyKDEpIC0gdDsKKyAgICBzY2FsZTEgPSB0OworICB9CisgIGVsc2UKKyAgeworICAgIC8vIHRoZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSAyIHF1YXRlcm5pb25zCisgICAgU2NhbGFyIHRoZXRhID0gc3RkOjphY29zKGFic0QpOworICAgIFNjYWxhciBzaW5UaGV0YSA9IGludGVybmFsOjpzaW4odGhldGEpOworCisgICAgc2NhbGUwID0gaW50ZXJuYWw6OnNpbiggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKKyAgICBzY2FsZTEgPSBpbnRlcm5hbDo6c2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOworICAgIGlmIChkPDApCisgICAgICBzY2FsZTEgPSAtc2NhbGUxOworICB9CisKKyAgcmV0dXJuIFEoc2NhbGUwICogYS5jb2VmZnMoKSArIHNjYWxlMSAqIGIuY29lZmZzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIFQgc2luX292ZXJfeChUIHgpCit7CisgIGlmIChUKDEpICsgeCp4ID09IFQoMSkpCisgICAgcmV0dXJuIFQoMSk7CisgIGVsc2UKKyAgICByZXR1cm4gc3RkOjpzaW4oeCkveDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfcncoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUTo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIFNjYWxhciBkID0gYS5kb3QoYik7CisgIFNjYWxhciB0aGV0YTsKKyAgaWYgKGQ8MC4wKQorICAgIHRoZXRhID0gLypNX1BJIC0qLyBTY2FsYXIoMikqc3RkOjphc2luKCAoYS5jb2VmZnMoKStiLmNvZWZmcygpKS5ub3JtKCkvMiApOworICBlbHNlCisgICAgdGhldGEgPSBTY2FsYXIoMikqc3RkOjphc2luKCAoYS5jb2VmZnMoKS1iLmNvZWZmcygpKS5ub3JtKCkvMiApOworICAKKyAgLy8gdGhldGEgaXMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIDIgcXVhdGVybmlvbnMKKy8vICAgU2NhbGFyIHRoZXRhID0gc3RkOjphY29zKGFic0QpOworICBTY2FsYXIgc2luT3ZlclRoZXRhID0gc2luX292ZXJfeCh0aGV0YSk7CisKKyAgU2NhbGFyIHNjYWxlMCA9IChTY2FsYXIoMSktdCkqc2luX292ZXJfeCggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5PdmVyVGhldGE7CisgIFNjYWxhciBzY2FsZTEgPSB0ICogc2luX292ZXJfeCggKCB0ICogdGhldGEpICkgLyBzaW5PdmVyVGhldGE7CisgIGlmIChkPDApCisgICAgc2NhbGUxID0gLXNjYWxlMTsKKworICByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KHNjYWxlMCAqIGEuY29lZmZzKCkgKyBzY2FsZTEgKiBiLmNvZWZmcygpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfZ2FlbChjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOworICAKKyAgU2NhbGFyIGQgPSBhLmRvdChiKTsKKyAgU2NhbGFyIHRoZXRhOworLy8gICB0aGV0YSA9IFNjYWxhcigyKSAqIGF0YW4yKChhLmNvZWZmcygpLWIuY29lZmZzKCkpLm5vcm0oKSwoYS5jb2VmZnMoKStiLmNvZWZmcygpKS5ub3JtKCkpOworLy8gICBpZiAoZDwwLjApCisvLyAgICAgdGhldGEgPSBNX1BJLXRoZXRhOworICAKKyAgaWYgKGQ8MC4wKQorICAgIHRoZXRhID0gLypNX1BJIC0qLyBTY2FsYXIoMikqc3RkOjphc2luKCAoLWEuY29lZmZzKCktYi5jb2VmZnMoKSkubm9ybSgpLzIgKTsKKyAgZWxzZQorICAgIHRoZXRhID0gU2NhbGFyKDIpKnN0ZDo6YXNpbiggKGEuY29lZmZzKCktYi5jb2VmZnMoKSkubm9ybSgpLzIgKTsKKyAgCisgIAorICBTY2FsYXIgc2NhbGUwOworICBTY2FsYXIgc2NhbGUxOworICBpZih0aGV0YSp0aGV0YS1TY2FsYXIoNik9PS1TY2FsYXIoNikpCisgIHsKKyAgICBzY2FsZTAgPSBTY2FsYXIoMSkgLSB0OworICAgIHNjYWxlMSA9IHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgU2NhbGFyIHNpblRoZXRhID0gc3RkOjpzaW4odGhldGEpOworICAgIHNjYWxlMCA9IGludGVybmFsOjpzaW4oICggU2NhbGFyKDEpIC0gdCApICogdGhldGEpIC8gc2luVGhldGE7CisgICAgc2NhbGUxID0gaW50ZXJuYWw6OnNpbiggKCB0ICogdGhldGEpICkgLyBzaW5UaGV0YTsKKyAgICBpZiAoZDwwKQorICAgICAgc2NhbGUxID0gLXNjYWxlMTsKKyAgfQorCisgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oc2NhbGUwICogYS5jb2VmZnMoKSArIHNjYWxlMSAqIGIuY29lZmZzKCkpOworfQorCitpbnQgbWFpbigpCit7CisgIHR5cGVkZWYgZG91YmxlIFJlZlNjYWxhcjsKKyAgdHlwZWRlZiBmbG9hdCBUZXN0U2NhbGFyOworICAKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFJlZlNjYWxhcj4gIFFkOworICB0eXBlZGVmIFF1YXRlcm5pb248VGVzdFNjYWxhcj4gUWY7CisgIAorICB1bnNpZ25lZCBpbnQgZ19zZWVkID0gKHVuc2lnbmVkIGludCkgdGltZShOVUxMKTsKKyAgc3RkOjpjb3V0IDw8IGdfc2VlZCA8PCAiXG4iOworLy8gICBnX3NlZWQgPSAxMjU5OTMyNDk2OworICBzcmFuZChnX3NlZWQpOworICAKKyAgTWF0cml4PFJlZlNjYWxhcixEeW5hbWljLDE+IG1heGVycig3KTsKKyAgbWF4ZXJyLnNldFplcm8oKTsKKyAgCisgIE1hdHJpeDxSZWZTY2FsYXIsRHluYW1pYywxPiBhdmdlcnIoNyk7CisgIGF2Z2Vyci5zZXRaZXJvKCk7CisgIAorICBjb3V0IDw8ICJkb3VibGU9PmZsb2F0PT5kb3VibGUgICAgICAgbmxlcnAgICAgICAgIGVpZ2VuICAgICAgICBsZWdhY3koc25hcCkgICAgICAgICBsZWdhY3kobmxlcnApICAgICAgICByaWdodHdheSAgICAgICAgIGdhZWwncyBjcml0ZXJpYVxuIjsKKyAgCisgIGludCByZXAgPSAxMDA7CisgIGludCBpdGVycyA9IDQwOworICBmb3IgKGludCB3PTA7IHc8cmVwOyArK3cpCisgIHsKKyAgICBRZiBhLCBiOworICAgIGEuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgICAgYS5ub3JtYWxpemUoKTsKKyAgICBiLmNvZWZmcygpLnNldFJhbmRvbSgpOworICAgIGIubm9ybWFsaXplKCk7CisgICAgCisgICAgUWYgY1s2XTsKKyAgICAKKyAgICBRZCBhcihhLmNhc3Q8UmVmU2NhbGFyPigpKTsKKyAgICBRZCBicihiLmNhc3Q8UmVmU2NhbGFyPigpKTsKKyAgICBRZCBjcjsKKyAgICAKKyAgICAKKyAgICAKKyAgICBjb3V0LnByZWNpc2lvbig4KTsKKyAgICBjb3V0IDw8IHN0ZDo6c2NpZW50aWZpYzsKKyAgICBmb3IgKGludCBpPTA7IGk8aXRlcnM7ICsraSkKKyAgICB7CisgICAgICBSZWZTY2FsYXIgdCA9IDAuNjU7CisgICAgICBjciA9IHNsZXJwX3J3KGFyLGJyLHQpOworICAgICAgCisgICAgICBRZiByZWZjID0gY3IuY2FzdDxUZXN0U2NhbGFyPigpOworICAgICAgY1swXSA9IG5sZXJwKGEsYix0KTsKKyAgICAgIGNbMV0gPSBzbGVycF9laWdlbihhLGIsdCk7CisgICAgICBjWzJdID0gc2xlcnBfbGVnYWN5KGEsYix0KTsKKyAgICAgIGNbM10gPSBzbGVycF9sZWdhY3lfbmxlcnAoYSxiLHQpOworICAgICAgY1s0XSA9IHNsZXJwX3J3KGEsYix0KTsKKyAgICAgIGNbNV0gPSBzbGVycF9nYWVsKGEsYix0KTsKKyAgICAgIAorICAgICAgVmVjdG9yWGQgZXJyKDcpOworICAgICAgZXJyWzBdID0gKGNyLmNvZWZmcygpLXJlZmMuY2FzdDxSZWZTY2FsYXI+KCkuY29lZmZzKCkpLm5vcm0oKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCBlcnJbMF0gPDwgIiAgICAiOworICAgICAgZm9yIChpbnQgaz0wOyBrPDY7ICsraykKKyAgICAgIHsKKyAgICAgICAgZXJyW2srMV0gPSAoY1trXS5jb2VmZnMoKS1yZWZjLmNvZWZmcygpKS5ub3JtKCk7CisvLyAgICAgICAgIHN0ZDo6Y291dCA8PCBlcnJbaysxXSA8PCAiICAgICI7CisgICAgICB9CisgICAgICBtYXhlcnIgPSBtYXhlcnIuY3dpc2UoKS5tYXgoZXJyKTsKKyAgICAgIGF2Z2VyciArPSBlcnI7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAgIGIgPSBjci5jYXN0PFRlc3RTY2FsYXI+KCk7CisgICAgICBiciA9IGNyOworICAgIH0KKy8vICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgfQorICBhdmdlcnIgLz0gUmVmU2NhbGFyKHJlcCppdGVycyk7CisgIGNvdXQgPDwgIlxuXG5BY2N1cmFjeTpcbiIKKyAgICAgICA8PCAiICBtYXg6ICIgPDwgbWF4ZXJyLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgIGNvdXQgPDwgIiAgYXZnOiAiIDw8IGF2Z2Vyci50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAKKyAgLy8gcGVyZiBiZW5jaAorICBRdWF0ZXJuaW9uZiBhLGI7CisgIGEuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgIGEubm9ybWFsaXplKCk7CisgIGIuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgIGIubm9ybWFsaXplKCk7CisgIC8vYiA9IGE7CisgIGZsb2F0IHMgPSAwLjY1OworICAgIAorICAjZGVmaW5lIEJFTkNIKEZVTkMpIHtcCisgICAgQmVuY2hUaW1lciB0OyBcCisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSB7XAorICAgICAgdC5zdGFydCgpOyBcCisgICAgICBmb3IoaW50IGk9MDsgaTwxMDAwMDAwOyArK2kpIFwKKyAgICAgICAgRlVOQyhhLGIscyk7IFwKKyAgICAgIHQuc3RvcCgpOyBcCisgICAgfSBcCisgICAgY291dCA8PCAiICAiIDw8ICNGVU5DIDw8ICIgPT4gXHQgIiA8PCB0LnZhbHVlKCkgPDwgInNcbiI7IFwKKyAgfQorICAKKyAgY291dCA8PCAiXG5TcGVlZDpcbiIgPDwgc3RkOjpmaXhlZDsKKyAgQkVOQ0gobmxlcnApOworICBCRU5DSChzbGVycF9laWdlbik7CisgIEJFTkNIKHNsZXJwX2xlZ2FjeSk7CisgIEJFTkNIKHNsZXJwX2xlZ2FjeV9ubGVycCk7CisgIEJFTkNIKHNsZXJwX3J3KTsKKyAgQkVOQ0goc2xlcnBfZ2FlbCk7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3F1YXRtdWwuY3BwIGIvYmVuY2gvcXVhdG11bC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5ZDc5MgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3F1YXRtdWwuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOyAKKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdD4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcXVhdG11bF9kZWZhdWx0KGNvbnN0IFF1YXQmIGEsIGNvbnN0IFF1YXQmIGIsIFF1YXQmIGMpCit7CisgIGMgPSBhICogYjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdD4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcXVhdG11bF9ub3ZlYyhjb25zdCBRdWF0JiBhLCBjb25zdCBRdWF0JiBiLCBRdWF0JiBjKQoreworICBjID0gaW50ZXJuYWw6OnF1YXRfcHJvZHVjdDwwLCBRdWF0LCBRdWF0LCB0eXBlbmFtZSBRdWF0OjpTY2FsYXIsIEFsaWduZWQ+OjpydW4oYSxiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdD4gdm9pZCBiZW5jaChjb25zdCBzdGQ6OnN0cmluZyYgbGFiZWwpCit7CisgIGludCB0cmllcyA9IDEwOworICBpbnQgcmVwID0gMTAwMDAwMDsKKyAgQmVuY2hUaW1lciB0OworICAKKyAgUXVhdCBhKDQsIDEsIDIsIDMpOworICBRdWF0IGIoMiwgMywgNCwgNSk7CisgIFF1YXQgYzsKKyAgCisgIHN0ZDo6Y291dC5wcmVjaXNpb24oMyk7CisgIAorICBCRU5DSCh0LCB0cmllcywgcmVwLCBxdWF0bXVsX2RlZmF1bHQoYSxiLGMpKTsKKyAgc3RkOjpjb3V0IDw8IGxhYmVsIDw8ICIgZGVmYXVsdCAiIDw8IDFlMyp0LmJlc3QoQ1BVX1RJTUVSKSA8PCAibXMgIFx0IiA8PCAxZS02KmRvdWJsZShyZXApLyh0LmJlc3QoQ1BVX1RJTUVSKSkgPDwgIiBNIG11bC9zXG4iOworICAKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgcXVhdG11bF9ub3ZlYyhhLGIsYykpOworICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBub3ZlYyAgICIgPDwgMWUzKnQuYmVzdChDUFVfVElNRVIpIDw8ICJtcyAgXHQiIDw8IDFlLTYqZG91YmxlKHJlcCkvKHQuYmVzdChDUFVfVElNRVIpKSA8PCAiIE0gbXVsL3NcbiI7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8UXVhdGVybmlvbmY+KCJmbG9hdCAiKTsKKyAgYmVuY2g8UXVhdGVybmlvbmQ+KCJkb3VibGUiKTsKKworICByZXR1cm4gMDsKKworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfY2hvbGVza3kuY3BwIGIvYmVuY2gvc3BhcnNlX2Nob2xlc2t5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IyMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX2Nob2xlc2t5LmNwcApAQCAtMCwwICsxLDIxNiBAQAorLy8gI2RlZmluZSBFSUdFTl9UQVVDU19TVVBQT1JUCisvLyAjZGVmaW5lIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKworLy8gZysrIC1EU0laRT0xMDAwMCAtRERFTlNJVFk9MC4wMDEgIHNwYXJzZV9jaG9sZXNreS5jcHAgLUkuLiAtRERFTlNFTUFUUkkgLU8zIC1nMCAtRE5ERUJVRyAgIC1ETkJUUklFUz0xIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvdGF1Y3NfZnVsbC9zcmMvIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS90YXVjc19mdWxsL2J1aWxkL2xpbnV4LyAgLUwvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL3RhdWNzX2Z1bGwvbGliL2xpbnV4LyAtbHRhdWNzIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvR290b0JMQVMvbGliZ290by5hIC1scHRocmVhZCAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NIT0xNT0QvSW5jbHVkZS8gJENIT0xMSUIgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9VRmNvbmZpZy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DQ09MQU1EL0xpYi9saWJjY29sYW1kLmEgICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NIT0xNT0QvTGliL2xpYmNob2xtb2QuYSAtbG1ldGlzIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQU1EL0xpYi9saWJhbWQuYSAgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DQU1EL0xpYi9saWJjYW1kLmEgICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NDT0xBTUQvTGliL2xpYmNjb2xhbWQuYSAgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DT0xBTUQvTGliL2xpYmNvbGFtZC5hIC1sbGFwYWNrICYmIC4vYS5vdXQKKworI2RlZmluZSBOT0dNTQorI2RlZmluZSBOT01UTAorCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMAorI2VuZGlmCisKKyNpZm5kZWYgREVOU0lUWQorI2RlZmluZSBERU5TSVRZIDAuMDEKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMQorI2VuZGlmCisKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2lmbmRlZiBNSU5ERU5TSVRZCisjZGVmaW5lIE1JTkRFTlNJVFkgMC4wMDA0CisjZW5kaWYKKworI2lmbmRlZiBOQlRSSUVTCisjZGVmaW5lIE5CVFJJRVMgMTAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNIKFgpIFwKKyAgdGltZXIucmVzZXQoKTsgXAorICBmb3IgKGludCBfaj0wOyBfajxOQlRSSUVTOyArK19qKSB7IFwKKyAgICB0aW1lci5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgX2s9MDsgX2s8UkVQRUFUOyArK19rKSB7IFwKKyAgICAgICAgWCAgXAorICB9IHRpbWVyLnN0b3AoKTsgfQorCisvLyB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsVXBwZXJUcmlhbmd1bGFyPiBFaWdlblNwYXJzZVRyaU1hdHJpeDsKK3R5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixTZWxmQWRqb2ludHxMb3dlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXg7CisKK3ZvaWQgZmlsbFNwZE1hdHJpeChmbG9hdCBkZW5zaXR5LCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZVNlbGZBZGpvaW50TWF0cml4JiBkc3QpCit7CisgIGRzdC5zdGFydEZpbGwocm93cypjb2xzKmRlbnNpdHkpOworICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQorICB7CisgICAgZHN0LmZpbGwoaixqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigxMCwyMCk7CisgICAgZm9yKGludCBpID0gaisxOyBpIDwgcm93czsgaSsrKQorICAgIHsKKyAgICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogMDsKKyAgICAgIGlmICh2IT0wKQorICAgICAgICBkc3QuZmlsbChpLGopID0gdjsKKyAgICB9CisKKyAgfQorICBkc3QuZW5kRmlsbCgpOworfQorCisjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisKK3RlbXBsYXRlPGludCBCYWNrZW5kPgordm9pZCBkb0VpZ2VuKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXgmIHNtMSwgaW50IGZsYWdzID0gMCkKK3sKKyAgc3RkOjpjb3V0IDw8IG5hbWUgPDwgIi4uLiIgPDwgc3RkOjpmbHVzaDsKKyAgQmVuY2hUaW1lciB0aW1lcjsKKyAgdGltZXIuc3RhcnQoKTsKKyAgU3BhcnNlTExUPEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXgsQmFja2VuZD4gY2hvbChzbTEsIGZsYWdzKTsKKyAgdGltZXIuc3RvcCgpOworICBzdGQ6OmNvdXQgPDwgIjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgIHN0ZDo6Y291dCA8PCAiICBubno6ICIgPDwgc20xLm5vblplcm9zKCkgPDwgIiA9PiAiIDw8IGNob2wubWF0cml4TCgpLm5vblplcm9zKCkgPDwgIlxuIjsKKy8vICAgc3RkOjpjb3V0IDw8ICJzcGFyc2VcbiIgPDwgY2hvbC5tYXRyaXhMKCkgPDwgIiVcbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKKyAgQmVuY2hUaW1lciB0aW1lcjsKKworICBWZWN0b3JYZiBiID0gVmVjdG9yWGY6OlJhbmRvbShjb2xzKTsKKyAgVmVjdG9yWGYgeCA9IFZlY3RvclhmOjpSYW5kb20oY29scyk7CisKKyAgYm9vbCBkZW5zZWRvbmUgPSBmYWxzZTsKKworICAvL2ZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHk+PU1JTkRFTlNJVFk7IGRlbnNpdHkqPTAuNSkKKy8vICAgZmxvYXQgZGVuc2l0eSA9IDAuNTsKKyAgeworICAgIEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXggc20xKHJvd3MsIGNvbHMpOworICAgIHN0ZDo6Y291dCA8PCAiR2VuZXJhdGUgc3BhcnNlIG1hdHJpeCAobWlnaHQgdGFrZSBhIHdoaWxlKS4uLlxuIjsKKyAgICBmaWxsU3BkTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CisgICAgc3RkOjpjb3V0IDw8ICJET05FXG5cbiI7CisKKyAgICAvLyBkZW5zZSBtYXRyaWNlcworICAgICNpZmRlZiBERU5TRU1BVFJJWAorICAgIGlmICghZGVuc2Vkb25lKQorICAgIHsKKyAgICAgIGRlbnNlZG9uZSA9IHRydWU7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKKyAgICAgIG0xID0gKG0xICsgbTEudHJhbnNwb3NlKCkpLmV2YWwoKTsKKyAgICAgIG0xLmRpYWdvbmFsKCkgKj0gMC41OworCisvLyAgICAgICBCRU5DSChMTFQ8RGVuc2VNYXRyaXg+IGNob2wobTEpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworICAgICAgQmVuY2hUaW1lciB0aW1lcjsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBMTFQ8RGVuc2VNYXRyaXg+IGNob2wobTEpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICJkZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgICAgICAgIGZvciAoaW50IGk9ajsgaTxyb3dzOyArK2kpCisgICAgICAgICAgaWYgKCFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oaW50ZXJuYWw6OmFicyhjaG9sLm1hdHJpeEwoKShpLGopKSwgMC4xKSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICBzdGQ6OmNvdXQgPDwgImRlbnNlOiAiIDw8ICJubnogPSAiIDw8IGNvdW50IDw8ICJcbiI7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgImRlbnNlOlxuIiA8PCBtMSA8PCAiXG5cbiIgPDwgY2hvbC5tYXRyaXhMKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKKyAgICBkb0VpZ2VuPEVpZ2VuOjpEZWZhdWx0QmFja2VuZD4oIkVpZ2VuL1NwYXJzZSIsIHNtMSwgRWlnZW46OkluY29tcGxldGVGYWN0b3JpemF0aW9uKTsKKworICAgICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKyAgICBkb0VpZ2VuPEVpZ2VuOjpDaG9sbW9kPigiRWlnZW4vQ2hvbG1vZCIsIHNtMSwgRWlnZW46OkluY29tcGxldGVGYWN0b3JpemF0aW9uKTsKKyAgICAjZW5kaWYKKworICAgICNpZmRlZiBFSUdFTl9UQVVDU19TVVBQT1JUCisgICAgZG9FaWdlbjxFaWdlbjo6VGF1Y3M+KCJFaWdlbi9UYXVjcyIsIHNtMSwgRWlnZW46OkluY29tcGxldGVGYWN0b3JpemF0aW9uKTsKKyAgICAjZW5kaWYKKworICAgICNpZiAwCisgICAgLy8gVEFVQ1MKKyAgICB7CisgICAgICB0YXVjc19jY3NfbWF0cml4IEEgPSBzbTEuYXNUYXVjc01hdHJpeCgpOworCisgICAgICAvL0JFTkNIKHRhdWNzX2Njc19tYXRyaXgqIGNob2wgPSB0YXVjc19jY3NfZmFjdG9yX2xsdCgmQSwgMCwgMCk7KQorLy8gICAgICAgQkVOQ0godGF1Y3Nfc3VwZXJub2RhbF9mYWN0b3JfdG9fY2NzKHRhdWNzX2Njc19mYWN0b3JfbGx0X2xsKCZBKSk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJ0YXVjczpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICB0YXVjc19jY3NfbWF0cml4KiBjaG9sID0gdGF1Y3NfY2NzX2ZhY3Rvcl9sbHQoJkEsIDAsIDApOworCisgICAgICBmb3IgKGludCBqPTA7IGo8Y29sczsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKGludCBpPWNob2wtPmNvbHB0cltqXTsgaTxjaG9sLT5jb2xwdHJbaisxXTsgKytpKQorICAgICAgICAgIHN0ZDo6Y291dCA8PCBjaG9sLT52YWx1ZXMuZFtpXSA8PCAiICI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ0hPTE1PRAorICAgICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKyAgICB7CisgICAgICBjaG9sbW9kX2NvbW1vbiBjOworICAgICAgY2hvbG1vZF9zdGFydCAoJmMpOworICAgICAgY2hvbG1vZF9zcGFyc2UgQTsKKyAgICAgIGNob2xtb2RfZmFjdG9yICpMOworCisgICAgICBBID0gc20xLmFzQ2hvbG1vZE1hdHJpeCgpOworICAgICAgQmVuY2hUaW1lciB0aW1lcjsKKy8vICAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwZXJtKGNvbHMpOworLy8gICAgICAgc3RkOjp2ZWN0b3I8aW50PiBzZXQobmNvbHMpOworICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbHM7ICsraSkKKyAgICAgICAgcGVybVtpXSA9IGk7CisvLyAgICAgICBjLm5tZXRob2RzID0gMTsKKy8vICAgICAgIGMubWV0aG9kWzBdID0gMTsKKworICAgICAgYy5ubWV0aG9kcyA9IDE7CisgICAgICBjLm1ldGhvZCBbMF0ub3JkZXJpbmcgPSBDSE9MTU9EX05BVFVSQUw7CisgICAgICBjLnBvc3RvcmRlciA9IDA7CisgICAgICBjLmZpbmFsX2xsID0gMTsKKworICAgICAgTCA9IGNob2xtb2RfYW5hbHl6ZV9wKCZBLCAmcGVybVswXSwgJnBlcm1bMF0sIGNvbHMsICZjKTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiY2hvbG1vZC9hbmFseXplOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGNob2xtb2RfZmFjdG9yaXplKCZBLCBMLCAmYyk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgImNob2xtb2QvZmFjdG9yaXplOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIGNob2xtb2Rfc3BhcnNlKiBjaG9sbWF0ID0gY2hvbG1vZF9mYWN0b3JfdG9fc3BhcnNlKEwsICZjKTsKKworICAgICAgY2hvbG1vZF9wcmludF9mYWN0b3IoTCwgIkZhY3RvcnMiLCAmYyk7CisKKyAgICAgIGNob2xtb2RfcHJpbnRfc3BhcnNlKGNob2xtYXQsICJDaG9sIiwgJmMpOworICAgICAgY2hvbG1vZF93cml0ZV9zcGFyc2Uoc3Rkb3V0LCBjaG9sbWF0LCAwLCAwLCAmYyk7CisvLworLy8gICAgICAgY2hvbG1vZF9wcmludF9zcGFyc2UoJkEsICJBIiwgJmMpOworLy8gICAgICAgY2hvbG1vZF93cml0ZV9zcGFyc2Uoc3Rkb3V0LCAmQSwgMCwgMCwgJmMpOworCisKKy8vICAgICAgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisvLyAgICAgICB7CisvLyAgICAgICAgICAgZm9yIChpbnQgaT1jaG9sLT5jb2xwdHJbal07IGk8Y2hvbC0+Y29scHRyW2orMV07ICsraSkKKy8vICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBjaG9sLT52YWx1ZXMuc1tpXSA8PCAiICI7CisvLyAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisgICAgI2VuZGlmCisKKworCisgIH0KKworCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfZGVuc2VfcHJvZHVjdC5jcHAgYi9iZW5jaC9zcGFyc2VfZGVuc2VfcHJvZHVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmNTE5NAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYXJzZV9kZW5zZV9wcm9kdWN0LmNwcApAQCAtMCwwICsxLDE4NyBAQAorCisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJiAuL2Eub3V0CisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUgLURTSVpFPTIwMDAgJiYgLi9hLm91dAorLy8gLUROT0dNTSAtRE5PTVRMIC1EQ1NQQVJTRQorLy8gLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSA2NTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIERFTlNJVFkKKyNkZWZpbmUgREVOU0lUWSAwLjAxCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiQmVuY2hTcGFyc2VVdGlsLmgiCisKKyNpZm5kZWYgTUlOREVOU0lUWQorI2RlZmluZSBNSU5ERU5TSVRZIDAuMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgTkJUUklFUworI2RlZmluZSBOQlRSSUVTIDEwCisjZW5kaWYKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKworCisjaWZkZWYgQ1NQQVJTRQorY3MqIGNzX3NvcnRlZF9tdWx0aXBseShjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpCit7CisgIGNzKiBBID0gY3NfdHJhbnNwb3NlIChhLCAxKSA7CisgIGNzKiBCID0gY3NfdHJhbnNwb3NlIChiLCAxKSA7CisgIGNzKiBEID0gY3NfbXVsdGlwbHkgKEIsQSkgOyAgIC8qIEQgPSBCJypBJyAqLworICBjc19zcGZyZWUgKEEpIDsKKyAgY3Nfc3BmcmVlIChCKSA7CisgIGNzX2Ryb3B6ZXJvcyAoRCkgOyAgICAgIC8qIGRyb3AgemVyb3MgZnJvbSBEICovCisgIGNzKiBDID0gY3NfdHJhbnNwb3NlIChELCAxKSA7ICAgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCisgIGNzX3NwZnJlZSAoRCkgOworICByZXR1cm4gQzsKK30KKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcm93cyA9IFNJWkU7CisgIGludCBjb2xzID0gU0laRTsKKyAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CisKKyAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyk7CisgIERlbnNlVmVjdG9yIHYxKGNvbHMpLCB2Mihjb2xzKTsKKyAgdjEuc2V0UmFuZG9tKCk7CisKKyAgQmVuY2hUaW1lciB0aW1lcjsKKyAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorICB7CisgICAgLy9maWxsTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CisgICAgZmlsbE1hdHJpeDIoNywgcm93cywgY29scywgc20xKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBlaVRvRGVuc2Uoc20xLCBtMSk7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICB2MiA9IG0xICogdjE7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkgPDwgIiAgIiA8PCBkb3VibGUoUkVQRUFUKS90aW1lci5iZXN0KCkgPDwgIiAqIC8gc2VjICIgPDwgZW5kbDsKKworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIHYyID0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHNwYXJzZVx0IiA8PCBzbTEubm9uWmVyb3MoKS9mbG9hdChzbTEucm93cygpKnNtMS5jb2xzKCkpKjEwMCA8PCAiJVxuIjsKKworICAgICAgQkVOQ0goYXNtKCIjbXljIik7IHYyID0gc20xICogdjE7IGFzbSgiI215ZCIpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLmJlc3QoKS9SRVBFQVQgPDwgIiAgIiA8PCBkb3VibGUoUkVQRUFUKS90aW1lci5iZXN0KFJFQUxfVElNRVIpIDw8ICIgKiAvIHNlYyAiIDw8IGVuZGw7CisKKworICAgICAgQkVOQ0goIHsgYXNtKCIjbXlhIik7IHYyID0gc20xLnRyYW5zcG9zZSgpICogdjE7IGFzbSgiI215YiIpOyB9KQorCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogdjpcdCIgPDwgdGltZXIuYmVzdCgpL1JFUEVBVCA8PCBlbmRsOworICAgIH0KKworLy8gICAgIHsKKy8vICAgICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBtMShzbTEpOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkeW4tc3BhcnNlXHQiIDw8IG0xLm5vblplcm9zKCkvZmxvYXQobTEucm93cygpKm0xLmNvbHMoKSkqMTAwIDw8ICIlXG4iOworLy8KKy8vICAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgdjIgPSBtMSAqIHYxOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vCisvLyAgICAgICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIHYyID0gbTEudHJhbnNwb3NlKCkgKiB2MTspCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgIH0KKworICAgIC8vIEdNTSsrCisgICAgI2lmbmRlZiBOT0dNTQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiR01NKysgc3BhcnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgLy9HbW1EeW5TcGFyc2UgIGdtbVQzKHJvd3MsY29scyk7CisgICAgICBHbW1TcGFyc2UgbTEocm93cyxjb2xzKTsKKyAgICAgIGVpVG9HbW0oc20xLCBtMSk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tVjEoY29scyksIGdtbVYyKGNvbHMpOworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMVswXSwgY29scykgPSB2MTsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tVjJbMF0sIGNvbHMpID0gdjI7CisKKyAgICAgIEJFTkNIKCBhc20oIiNteXgiKTsgZ21tOjptdWx0KG0xLCBnbW1WMSwgZ21tVjIpOyBhc20oIiNteXkiKTsgKQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICBCRU5DSCggZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChtMSksIGdtbVYxLCBnbW1WMik7ICkKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgICNpZm5kZWYgTk9VQkxBUworICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgc3BhcnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgVUJsYXNTcGFyc2UgbTEocm93cyxjb2xzKTsKKyAgICAgIGVpVG9VYmxhcyhzbTEsIG0xKTsKKyAgICAgIAorICAgICAgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjp2ZWN0b3I8U2NhbGFyPiB1djEsIHV2MjsKKyAgICAgIGVpVG9VYmxhc1ZlYyh2MSx1djEpOworICAgICAgZWlUb1VibGFzVmVjKHYyLHV2Mik7CisKKy8vICAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tVjEoY29scyksIGdtbVYyKGNvbHMpOworLy8gICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMVswXSwgY29scykgPSB2MTsKKy8vICAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tVjJbMF0sIGNvbHMpID0gdjI7CisKKyAgICAgIEJFTkNIKCB1djIgPSBib29zdDo6bnVtZXJpYzo6dWJsYXM6OnByb2QobTEsIHV2MSk7ICkKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgQkVOQ0goIGJvb3N0Ojp1Ymxhczo6cHJvZChnbW06OnRyYW5zcG9zZWQobTEpLCBnbW1WMSwgZ21tVjIpOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyk7CisgICAgICBlaVRvTXRsKHNtMSwgbTEpOworICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtdGxWMShjb2xzLCAxLjApOworICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtdGxWMihjb2xzLCAxLjApOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgbXRsVjIgPSBtMSAqIG10bFYxOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgbXRsVjIgPSB0cmFucyhtMSkgKiBtdGxWMTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfbHUuY3BwIGIvYmVuY2gvc3BhcnNlX2x1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc1MDAxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX2x1LmNwcApAQCAtMCwwICsxLDEzMiBAQAorCisvLyBnKysgLUkuLiBzcGFyc2VfbHUuY3BwIC1PMyAtZzAgLUkgL3Vzci9pbmNsdWRlL3N1cGVybHUvIC1sc3VwZXJsdSAtbGdmb3J0cmFuIC1EU0laRT0xMDAwIC1EREVOU0lUWT0uMDUgJiYgLi9hLm91dAorCisjZGVmaW5lIEVJR0VOX1NVUEVSTFVfU1VQUE9SVAorI2RlZmluZSBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisKKyNkZWZpbmUgTk9HTU0KKyNkZWZpbmUgTk9NVEwKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTAKKyNlbmRpZgorCisjaWZuZGVmIERFTlNJVFkKKyNkZWZpbmUgREVOU0lUWSAwLjAxCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiQmVuY2hTcGFyc2VVdGlsLmgiCisKKyNpZm5kZWYgTUlOREVOU0lUWQorI2RlZmluZSBNSU5ERU5TSVRZIDAuMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgTkJUUklFUworI2RlZmluZSBOQlRSSUVTIDEwCisjZW5kaWYKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yWDsKKworI2luY2x1ZGUgPEVpZ2VuL0xVPgorCit0ZW1wbGF0ZTxpbnQgQmFja2VuZD4KK3ZvaWQgZG9FaWdlbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc20xLCBjb25zdCBWZWN0b3JYJiBiLCBWZWN0b3JYJiB4LCBpbnQgZmxhZ3MgPSAwKQoreworICBzdGQ6OmNvdXQgPDwgbmFtZSA8PCAiLi4uIiA8PCBzdGQ6OmZsdXNoOworICBCZW5jaFRpbWVyIHRpbWVyOyB0aW1lci5zdGFydCgpOworICBTcGFyc2VMVTxFaWdlblNwYXJzZU1hdHJpeCxCYWNrZW5kPiBsdShzbTEsIGZsYWdzKTsKKyAgdGltZXIuc3RvcCgpOworICBpZiAobHUuc3VjY2VlZGVkKCkpCisgICAgc3RkOjpjb3V0IDw8ICI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgZWxzZQorICB7CisgICAgc3RkOjpjb3V0IDw8ICI6XHQgRkFJTEVEIiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGJvb2wgb2s7CisgIHRpbWVyLnJlc2V0KCk7IHRpbWVyLnN0YXJ0KCk7CisgIG9rID0gbHUuc29sdmUoYiwmeCk7CisgIHRpbWVyLnN0b3AoKTsKKyAgaWYgKG9rKQorICAgIHN0ZDo6Y291dCA8PCAiICBzb2x2ZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICBlbHNlCisgICAgc3RkOjpjb3V0IDw8ICIgIHNvbHZlOlx0IiA8PCAiIEZBSUxFRCIgPDwgZW5kbDsKKworICAvL3N0ZDo6Y291dCA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKKyAgQmVuY2hUaW1lciB0aW1lcjsKKworICBWZWN0b3JYIGIgPSBWZWN0b3JYOjpSYW5kb20oY29scyk7CisgIFZlY3RvclggeCA9IFZlY3Rvclg6OlJhbmRvbShjb2xzKTsKKworICBib29sIGRlbnNlZG9uZSA9IGZhbHNlOworCisgIC8vZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorLy8gICBmbG9hdCBkZW5zaXR5ID0gMC41OworICB7CisgICAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsIGNvbHMpOworICAgIGZpbGxNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgaWYgKCFkZW5zZWRvbmUpCisgICAgeworICAgICAgZGVuc2Vkb25lID0gdHJ1ZTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOworICAgICAgZWlUb0RlbnNlKHNtMSwgbTEpOworCisgICAgICBCZW5jaFRpbWVyIHRpbWVyOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIEZ1bGxQaXZMVTxEZW5zZU1hdHJpeD4gbHUobTEpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbi9kZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGx1LnNvbHZlKGIsJngpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgIHNvbHZlOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgYi50cmFuc3Bvc2UoKSA8PCAiXG4iOworLy8gICAgICAgc3RkOjpjb3V0IDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWZkZWYgRUlHRU5fVU1GUEFDS19TVVBQT1JUCisgICAgeC5zZXRaZXJvKCk7CisgICAgZG9FaWdlbjxFaWdlbjo6VW1mUGFjaz4oIkVpZ2VuL1VtZlBhY2sgKGF1dG8pIiwgc20xLCBiLCB4LCAwKTsKKyAgICAjZW5kaWYKKworICAgICNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKKyAgICB4LnNldFplcm8oKTsKKyAgICBkb0VpZ2VuPEVpZ2VuOjpTdXBlckxVPigiRWlnZW4vU3VwZXJMVSAobmF0KSIsIHNtMSwgYiwgeCwgRWlnZW46Ok5hdHVyYWxPcmRlcmluZyk7CisvLyAgICAgZG9FaWdlbjxFaWdlbjo6U3VwZXJMVT4oIkVpZ2VuL1N1cGVyTFUgKE1EIEFUK0EpIiwgc20xLCBiLCB4LCBFaWdlbjo6TWluaW11bURlZ3JlZV9BVF9QTFVTX0EpOworLy8gICAgIGRvRWlnZW48RWlnZW46OlN1cGVyTFU+KCJFaWdlbi9TdXBlckxVIChNRCBBVEEpIiwgc20xLCBiLCB4LCBFaWdlbjo6TWluaW11bURlZ3JlZV9BVEEpOworICAgIGRvRWlnZW48RWlnZW46OlN1cGVyTFU+KCJFaWdlbi9TdXBlckxVIChDT0xBTUQpIiwgc20xLCBiLCB4LCBFaWdlbjo6Q29sQXBwcm94TWluaW11bURlZ3JlZSk7CisgICAgI2VuZGlmCisKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfcHJvZHVjdC5jcHAgYi9iZW5jaC9zcGFyc2VfcHJvZHVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmYzQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYXJzZV9wcm9kdWN0LmNwcApAQCAtMCwwICsxLDMyMyBAQAorCisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJiAuL2Eub3V0CisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUgLURTSVpFPTIwMDAgJiYgLi9hLm91dAorLy8gLUROT0dNTSAtRE5PTVRMIC1EQ1NQQVJTRQorLy8gLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgTk5aUEVSQ09MCisjZGVmaW5lIE5OWlBFUkNPTCA2CisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKKyNpbmNsdWRlICJCZW5jaFV0aWwuaCIKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2lmbmRlZiBOQlRSSUVTCisjZGVmaW5lIE5CVFJJRVMgMQorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKKy8vICNpZmRlZiBNS0wKKy8vCisvLyAjaW5jbHVkZSAibWtsX3R5cGVzLmgiCisvLyAjaW5jbHVkZSAibWtsX3NwYmxhcy5oIgorLy8KKy8vIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgUmVzPgorLy8gdm9pZCBta2xfbXVsdGlwbHkoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXMmIHJlcykKKy8vIHsKKy8vICAgY2hhciBuID0gJ04nOworLy8gICBmbG9hdCBhbHBoYSA9IDE7CisvLyAgIGNoYXIgbWF0ZGVzY3JhWzZdOworLy8gICBtYXRkZXNjcmFbMF0gPSAnRyc7CisvLyAgIG1hdGRlc2NyYVsxXSA9IDA7CisvLyAgIG1hdGRlc2NyYVsyXSA9IDA7CisvLyAgIG1hdGRlc2NyYVszXSA9ICdDJzsKKy8vICAgbWtsX3Njc2NtbSgmbiwgbGhzLnJvd3MoKSwgcmhzLmNvbHMoKSwgbGhzLmNvbHMoKSwgJmFscGhhLCBtYXRkZXNjcmEsCisvLyAgICAgICAgICAgICAgbGhzLl92YWx1ZVB0cigpLCBsaHMuX2lubmVySW5kZXhQdHIoKSwgbGhzLm91dGVySW5kZXhQdHIoKSwKKy8vICAgICAgICAgICAgICBwbnRyZSwgYiwgJmxkYiwgJmJldGEsIGMsICZsZGMpOworLy8gLy8gICBta2xfc29tYXRjb3B5KCdDJywgJ1QnLCBsaHMucm93cygpLCBsaHMuY29scygpLCAxLAorLy8gLy8gICAgICAgICAgICAgICAgIGxocy5fdmFsdWVQdHIoKSwgbGhzLnJvd3MoKSwgRFNULCBkc3Rfc3RyaWRlKTsKKy8vIH0KKy8vCisvLyAjZW5kaWYKKworCisjaWZkZWYgQ1NQQVJTRQorY3MqIGNzX3NvcnRlZF9tdWx0aXBseShjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpCit7CisvLyAgIHJldHVybiBjc19tdWx0aXBseShhLGIpOworCisgIGNzKiBBID0gY3NfdHJhbnNwb3NlKGEsIDEpOworICBjcyogQiA9IGNzX3RyYW5zcG9zZShiLCAxKTsKKyAgY3MqIEQgPSBjc19tdWx0aXBseShCLEEpOyAgIC8qIEQgPSBCJypBJyAqLworICBjc19zcGZyZWUgKEEpIDsKKyAgY3Nfc3BmcmVlIChCKSA7CisgIGNzX2Ryb3B6ZXJvcyAoRCkgOyAgICAgIC8qIGRyb3AgemVyb3MgZnJvbSBEICovCisgIGNzKiBDID0gY3NfdHJhbnNwb3NlIChELCAxKSA7ICAgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCisgIGNzX3NwZnJlZSAoRCkgOworICByZXR1cm4gQzsKKworLy8gICBjcyogQSA9IGNzX3RyYW5zcG9zZShhLCAxKTsKKy8vICAgY3MqIEMgPSBjc190cmFuc3Bvc2UoQSwgMSk7CisvLyAgIHJldHVybiBDOworfQorCitjcyogY3Nfc29ydGVkX211bHRpcGx5Mihjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpCit7CisgIGNzKiBEID0gY3NfbXVsdGlwbHkoYSxiKTsKKyAgY3MqIEUgPSBjc190cmFuc3Bvc2UoRCwxKTsKKyAgY3Nfc3BmcmVlKEQpOworICBjcyogQyA9IGNzX3RyYW5zcG9zZShFLDEpOworICBjc19zcGZyZWUoRSk7CisgIHJldHVybiBDOworfQorI2VuZGlmCisKK3ZvaWQgYmVuY2hfc29ydCgpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworLy8gICBiZW5jaF9zb3J0KCk7CisKKyAgaW50IHJvd3MgPSBTSVpFOworICBpbnQgY29scyA9IFNJWkU7CisgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOworCisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtMShyb3dzLGNvbHMpLCBzbTIocm93cyxjb2xzKSwgc20zKHJvd3MsY29scyksIHNtNChyb3dzLGNvbHMpOworCisgIEJlbmNoVGltZXIgdGltZXI7CisgIGZvciAoaW50IG5uelBlckNvbCA9IE5OWlBFUkNPTDsgbm56UGVyQ29sPjE7IG5uelBlckNvbC89MS4xKQorICB7CisgICAgc20xLnNldFplcm8oKTsKKyAgICBzbTIuc2V0WmVybygpOworICAgIGZpbGxNYXRyaXgyKG5uelBlckNvbCwgcm93cywgY29scywgc20xKTsKKyAgICBmaWxsTWF0cml4MihubnpQZXJDb2wsIHJvd3MsIGNvbHMsIHNtMik7CisvLyAgICAgc3RkOjpjZXJyIDw8ICJmaWxsaW5nIE9LXG4iOworCisgICAgLy8gZGVuc2UgbWF0cmljZXMKKyAgICAjaWZkZWYgREVOU0VNQVRSSVgKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyksIG0yKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBlaVRvRGVuc2Uoc20xLCBtMSk7CisgICAgICBlaVRvRGVuc2Uoc20yLCBtMik7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtMyA9IG0xICogbTI7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTI7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgbTMgPSBtMS50cmFuc3Bvc2UoKSAqIG0yLnRyYW5zcG9zZSgpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtMyA9IG0xICogbTIudHJhbnNwb3NlKCk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcworICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gc3BhcnNlXHQiIDw8IHNtMS5ub25aZXJvcygpLyhmbG9hdChzbTEucm93cygpKSpmbG9hdChzbTEuY29scygpKSkqMTAwIDw8ICIlICogIgorICAgICAgICAgICAgICAgIDw8IHNtMi5ub25aZXJvcygpLyhmbG9hdChzbTIucm93cygpKSpmbG9hdChzbTIuY29scygpKSkqMTAwIDw8ICIlXG4iOworCisgICAgICBCRU5DSChzbTMgPSBzbTEgKiBzbTI7ICkKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgQkVOQ0goc20zID0gc20xLnRyYW5zcG9zZSgpICogc20yOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gLy8KKy8vICAgICAgIEJFTkNIKHNtMyA9IHNtMS50cmFuc3Bvc2UoKSAqIHNtMi50cmFuc3Bvc2UoKTsgKQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAvLworLy8gICAgICAgQkVOQ0goc20zID0gc20xICogc20yLnRyYW5zcG9zZSgpOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKy8vCisvLyAgICAgICBCRU5DSCggc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMSwgc20yKTsgKQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8KKy8vICAgICAgIEJFTkNIKHNtMy5fZXhwZXJpbWVudGFsTmV3UHJvZHVjdChzbTEudHJhbnNwb3NlKCksc20yKTsgKQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vIC8vCisvLyAgICAgICBCRU5DSChzbTMuX2V4cGVyaW1lbnRhbE5ld1Byb2R1Y3Qoc20xLnRyYW5zcG9zZSgpLHNtMi50cmFuc3Bvc2UoKSk7ICkKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gLy8KKy8vICAgICAgIEJFTkNIKHNtMy5fZXhwZXJpbWVudGFsTmV3UHJvZHVjdChzbTEsIHNtMi50cmFuc3Bvc2UoKSk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYicgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gZWlnZW4gZHluLXNwYXJzZSBtYXRyaWNlcworICAgIC8qeworICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG0xKHNtMSksIG0yKHNtMiksIG0zKHNtMyk7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGR5bi1zcGFyc2VcdCIgPDwgbTEubm9uWmVyb3MoKS8oZmxvYXQobTEucm93cygpKSpmbG9hdChtMS5jb2xzKCkpKSoxMDAgPDwgIiUgKiAiCisgICAgICAgICAgICAgICAgPDwgbTIubm9uWmVyb3MoKS8oZmxvYXQobTIucm93cygpKSpmbG9hdChtMi5jb2xzKCkpKSoxMDAgPDwgIiVcbiI7CisKKy8vICAgICAgIHRpbWVyLnJlc2V0KCk7CisvLyAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xICogbTI7KQorLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjb3V0IDw8IHNtMyA8PCAiXG4iOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCAidHJhbnNwb3NlLi4uXG4iOworLy8gICAgICAgRWlnZW5TcGFyc2VNYXRyaXggc200ID0gc20xLnRyYW5zcG9zZSgpOworLy8gICAgICAgc3RkOjpjb3V0IDw8IHNtNC5ub25aZXJvcygpIDw8ICIgPT0gIiA8PCBzbTEubm9uWmVyb3MoKSA8PCAiXG4iOworLy8gICAgICAgZXhpdCgxKTsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCAidHJhbnNwb3NlIE9LXG4iOworLy8gICAgICAgc3RkOjpjb3V0IDw8IHNtMSA8PCAiXG5cbiIgPDwgc20xLnRyYW5zcG9zZSgpIDw8ICJcblxuIiA8PCBzbTQudHJhbnNwb3NlKCkgPDwgIlxuXG4iOworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTI7KQorLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgdGltZXIucmVzZXQoKTsKKy8vICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBCRU5DSCggZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTIudHJhbnNwb3NlKCk7ICkKKy8vICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICB0aW1lci5yZXNldCgpOworLy8gICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIEJFTkNIKCBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEgKiBtMi50cmFuc3Bvc2UoKTsgKQorLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYicgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfSovCisKKyAgICAvLyBDU3BhcnNlCisgICAgI2lmZGVmIENTUEFSU0UKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkNTcGFyc2UgXHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKKyAgICAgIGNzICptMSwgKm0yLCAqbTM7CisgICAgICBlaVRvQ1NwYXJzZShzbTEsIG0xKTsKKyAgICAgIGVpVG9DU3BhcnNlKHNtMiwgbTIpOworCisgICAgICBCRU5DSCgKKyAgICAgIHsKKyAgICAgICAgbTMgPSBjc19zb3J0ZWRfbXVsdGlwbHkobTEsIG0yKTsKKyAgICAgICAgaWYgKCFtMykKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiY3NfbXVsdGlwbHkgZmFpbGVkXG4iOworICAgICAgICB9CisvLyAgICAgICAgIGNzX3ByaW50KG0zLCAwKTsKKyAgICAgICAgY3Nfc3BmcmVlKG0zKTsKKyAgICAgIH0KKyAgICAgICk7CisvLyAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKy8vICAgICAgIEJFTkNIKCB7IG0zID0gY3Nfc29ydGVkX211bHRpcGx5MihtMSwgbTIpOyBjc19zcGZyZWUobTMpOyB9ICk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgI2lmbmRlZiBOT1VCTEFTCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJ1Ymxhc1x0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7CisgICAgICBVQmxhc1NwYXJzZSBtMShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb1VibGFzKHNtMSwgbTEpOworICAgICAgZWlUb1VibGFzKHNtMiwgbTIpOworCisgICAgICBCRU5DSChib29zdDo6bnVtZXJpYzo6dWJsYXM6OnByb2QobTEsIG0yLCBtMyk7KTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBHTU0rKworICAgICNpZm5kZWYgTk9HTU0KKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrIHNwYXJzZVx0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7CisgICAgICBHbW1EeW5TcGFyc2UgIGdtbVQzKHJvd3MsY29scyk7CisgICAgICBHbW1TcGFyc2UgbTEocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIGVpVG9HbW0oc20xLCBtMSk7CisgICAgICBlaVRvR21tKHNtMiwgbTIpOworCisgICAgICBCRU5DSChnbW06Om11bHQobTEsIG0yLCBnbW1UMyk7KTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgQkVOQ0goZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChtMSksIG0yLCBnbW1UMyk7KTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLworLy8gICAgICAgaWYgKHJvd3M8NTAwKQorLy8gICAgICAgeworLy8gICAgICAgICBCRU5DSChnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgZ21tOjp0cmFuc3Bvc2VkKG0yKSwgZ21tVDMpOyk7CisvLyAgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8KKy8vICAgICAgICAgQkVOQ0goZ21tOjptdWx0KG0xLCBnbW06OnRyYW5zcG9zZWQobTIpLCBnbW1UMyk7KTsKKy8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIH0KKy8vICAgICAgIGVsc2UKKy8vICAgICAgIHsKKy8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCAiZm9yZXZlciIgPDwgZW5kbDsKKy8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYic6XHQiIDw8ICJmb3JldmVyIiA8PCBlbmRsOworLy8gICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKKyAgICAgIE10bFNwYXJzZSBtMShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb010bChzbTEsIG0xKTsKKyAgICAgIGVpVG9NdGwoc20yLCBtMik7CisKKyAgICAgIEJFTkNIKG0zID0gbTEgKiBtMjspOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICBCRU5DSChtMyA9IHRyYW5zKG0xKSAqIG0yOyk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8KKy8vICAgICAgIEJFTkNIKG0zID0gdHJhbnMobTEpICogdHJhbnMobTIpOyk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8KKy8vICAgICAgIEJFTkNIKG0zID0gbTEgKiB0cmFucyhtMik7KTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0ZDo6Y291dCA8PCAiXG5cbiI7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9yYW5kb21zZXR0ZXIuY3BwIGIvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNzZlMwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYXJzZV9yYW5kb21zZXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisKKyNkZWZpbmUgTk9HTU0KKyNkZWZpbmUgTk9NVEwKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxleHQvaGFzaF9tYXA+CisjaW5jbHVkZSA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPgorI2luY2x1ZGUgPGdvb2dsZS9zcGFyc2VfaGFzaF9tYXA+CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMDAwCisjZW5kaWYKKworI2lmbmRlZiBERU5TSVRZCisjZGVmaW5lIERFTlNJVFkgMC4wMQorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxCisjZW5kaWYKKworI2luY2x1ZGUgIkJlbmNoU3BhcnNlVXRpbC5oIgorCisjaWZuZGVmIE1JTkRFTlNJVFkKKyNkZWZpbmUgTUlOREVOU0lUWSAwLjAwMDQKKyNlbmRpZgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAxMAorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKKworc3RhdGljIGRvdWJsZSBydGltZTsKK3N0YXRpYyBkb3VibGUgbmVudHJpZXM7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNldHRlclR5cGU+Cit2b2lkIGRvc3R1ZmYoY29uc3QgY2hhciogbmFtZSwgRWlnZW5TcGFyc2VNYXRyaXgmIHNtMSkKK3sKKyAgaW50IHJvd3MgPSBzbTEucm93cygpOworICBpbnQgY29scyA9IHNtMS5jb2xzKCk7CisgIHNtMS5zZXRaZXJvKCk7CisgIEJlbmNoVGltZXIgdDsKKyAgU2V0dGVyVHlwZSogc2V0MSA9IG5ldyBTZXR0ZXJUeXBlKHNtMSk7CisgIHQucmVzZXQoKTsgdC5zdGFydCgpOworICBmb3IgKGludCBrPTA7IGs8bmVudHJpZXM7ICsraykKKyAgICAoKnNldDEpKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKSkgKz0gMTsKKyAgdC5zdG9wKCk7CisgIHN0ZDo6Y291dCA8PCAic3RkOjptYXAgPT4gICAgICBcdCIgPDwgdC52YWx1ZSgpLXJ0aW1lCisgICAgICAgICAgICA8PCAiIG5uej0iIDw8IHNldDEtPm5vblplcm9zKCkgPDwgc3RkOjpmbHVzaDsKKworICAvLyBnZXRjaGFyKCk7CisKKyAgdC5yZXNldCgpOyB0LnN0YXJ0KCk7IGRlbGV0ZSBzZXQxOyB0LnN0b3AoKTsKKyAgc3RkOjpjb3V0IDw8ICIgIGJhY2s6IFx0IiA8PCB0LnZhbHVlKCkgPDwgIlxuIjsKK30KKyAgICAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKKworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cyxjb2xzKSwgc20yKHJvd3MsY29scyk7CisKKworICBuZW50cmllcyA9IHJvd3MqY29scypkZW5zaXR5OworICBzdGQ6OmNvdXQgPDwgIm4gPSAiIDw8IG5lbnRyaWVzIDw8ICJcbiI7CisgIGludCBkdW1teTsKKyAgQmVuY2hUaW1lciB0OworCisgIHQucmVzZXQoKTsgdC5zdGFydCgpOworICBmb3IgKGludCBrPTA7IGs8bmVudHJpZXM7ICsraykKKyAgICBkdW1teSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSkgKyBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICB0LnN0b3AoKTsKKyAgcnRpbWUgPSB0LnZhbHVlKCk7CisgIHN0ZDo6Y291dCA8PCAicnRpbWUgPSAiIDw8IHJ0aW1lIDw8ICIgKCIgPDwgZHVtbXkgPDwgIilcblxuIjsKKyAgY29uc3QgaW50IEJpdHMgPSA2OworICBmb3IgKDs7KQorICB7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsU3RkTWFwVHJhaXRzLEJpdHM+ID4oInN0ZDo6bWFwICAgICAiLCBzbTEpOworICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdudUhhc2hNYXBUcmFpdHMsQml0cz4gPigiZ251OjpoYXNoX21hcCIsIHNtMSk7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzLEJpdHM+ID4oImdvb2dsZTo6ZGVuc2UiLCBzbTEpOworICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHMsQml0cz4gPigiZ29vZ2xlOjpzcGFyc2UiLCBzbTEpOworCisvLyAgICAgeworLy8gICAgICAgUmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdudUhhc2hNYXBUcmFpdHMsQml0cz4gc2V0MShzbTEpOworLy8gICAgICAgdC5yZXNldCgpOyB0LnN0YXJ0KCk7CisvLyAgICAgICBmb3IgKGludCBrPTA7IGs8bjsgKytrKQorLy8gICAgICAgICBzZXQxKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKSkgKz0gMTsKKy8vICAgICAgIHQuc3RvcCgpOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICJnbnU6Omhhc2hfbWFwID0+IFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKKy8vICAgICAgICAgICAgICAgICA8PCAiIG5uej0iIDw8IHNldDEubm9uWmVyb3MoKSA8PCAiXG4iO2dldGNoYXIoKTsKKy8vICAgICB9CisvLyAgICAgeworLy8gICAgICAgUmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdvb2dsZURlbnNlSGFzaE1hcFRyYWl0cyxCaXRzPiBzZXQxKHNtMSk7CisvLyAgICAgICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKKy8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCisvLyAgICAgICAgIHNldDEoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSArPSAxOworLy8gICAgICAgdC5zdG9wKCk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgImdvb2dsZTo6ZGVuc2UgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQorLy8gICAgICAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS5ub25aZXJvcygpIDw8ICJcbiI7Z2V0Y2hhcigpOworLy8gICAgIH0KKy8vICAgICB7CisvLyAgICAgICBSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cyxCaXRzPiBzZXQxKHNtMSk7CisvLyAgICAgICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKKy8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCisvLyAgICAgICAgIHNldDEoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSArPSAxOworLy8gICAgICAgdC5zdG9wKCk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgImdvb2dsZTo6c3BhcnNlID0+IFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKKy8vICAgICAgICAgICAgICAgICA8PCAiIG5uej0iIDw8IHNldDEubm9uWmVyb3MoKSA8PCAiXG4iO2dldGNoYXIoKTsKKy8vICAgICB9CisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2Vfc2V0dGVyLmNwcCBiL2JlbmNoL3NwYXJzZV9zZXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjBiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGFyc2Vfc2V0dGVyLmNwcApAQCAtMCwwICsxLDQ4NSBAQAorCisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJiAuL2Eub3V0CisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUgLURTSVpFPTIwMDAgJiYgLi9hLm91dAorLy8gLUROT0dNTSAtRE5PTVRMIC1EQ1NQQVJTRQorLy8gLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIE5CUEVSUk9XCisjZGVmaW5lIE5CUEVSUk9XIDI0CisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDIKKyNlbmRpZgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAyCisjZW5kaWYKKworI2lmbmRlZiBLSworI2RlZmluZSBLSyAxMAorI2VuZGlmCisKKyNpZm5kZWYgTk9HT09HTEUKKyNkZWZpbmUgRUlHRU5fR09PR0xFSEFTSF9TVVBQT1JUCisjaW5jbHVkZSA8Z29vZ2xlL3NwYXJzZV9oYXNoX21hcD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQmVuY2hTcGFyc2VVdGlsLmgiCisKKyNkZWZpbmUgQ0hFQ0tfTUVNCisvLyAjZGVmaW5lIENIRUNLX01FTSAgc3RkLyoqLzo6Y291dCA8PCAiY2hlY2sgbWVtXG4iOyBnZXRjaGFyKCk7CisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IENvb3JkaW5hdGVzOwordHlwZWRlZiBzdGQ6OnZlY3RvcjxmbG9hdD4gVmFsdWVzOworCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldGlubmVycmFuZF9laWdlbihjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2R5bmFtaWMoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fc3VtZXEoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9nbnVfaGFzaChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dvb2dsZV9kZW5zZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dvb2dsZV9zcGFyc2UoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9zY2lweShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX21hcHBlZChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX2Nvb3JkKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfY29tcHJlc3NlZChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX2dlbnZlYyhjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX210bChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcm93cyA9IFNJWkU7CisgIGludCBjb2xzID0gU0laRTsKKyAgYm9vbCBmdWxseXJhbmQgPSB0cnVlOworCisgIEJlbmNoVGltZXIgdGltZXI7CisgIENvb3JkaW5hdGVzIGNvb3JkczsKKyAgVmFsdWVzIHZhbHVlczsKKyAgaWYoZnVsbHlyYW5kKQorICB7CisgICAgQ29vcmRpbmF0ZXMgcG9vbDsKKyAgICBwb29sLnJlc2VydmUoY29scypOQlBFUlJPVyk7CisgICAgc3RkOjpjZXJyIDw8ICJmaWxsIHBvb2wiIDw8ICJcbiI7CisgICAgZm9yIChpbnQgaT0wOyBpPGNvbHMqTkJQRVJST1c7ICkKKyAgICB7CisvLyAgICAgICBEeW5hbWljU3BhcnNlTWF0cml4PGludD4gc3RlbmNpbChTSVpFLFNJWkUpOworICAgICAgVmVjdG9yMmkgaWooaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKTsKKy8vICAgICAgIGlmKHN0ZW5jaWwuY29lZmZSZWYoaWoueCgpLCBpai55KCkpPT0wKQorICAgICAgeworLy8gICAgICAgICBzdGVuY2lsLmNvZWZmUmVmKGlqLngoKSwgaWoueSgpKSA9IDE7CisgICAgICAgIHBvb2wucHVzaF9iYWNrKGlqKTsKKworICAgICAgfQorICAgICAgKytpOworICAgIH0KKyAgICBzdGQ6OmNlcnIgPDwgInBvb2wgb2siIDw8ICJcbiI7CisgICAgaW50IG4gPSBjb2xzKk5CUEVSUk9XKktLOworICAgIGNvb3Jkcy5yZXNlcnZlKG4pOworICAgIHZhbHVlcy5yZXNlcnZlKG4pOworICAgIGZvciAoaW50IGk9MDsgaTxuOyArK2kpCisgICAgeworICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxwb29sLnNpemUoKSk7CisgICAgICBjb29yZHMucHVzaF9iYWNrKHBvb2xbaV0pOworICAgICAgdmFsdWVzLnB1c2hfYmFjayhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgICAgZm9yIChpbnQgaT0wOyBpPE5CUEVSUk9XOyArK2kpCisgICAgeworICAgICAgY29vcmRzLnB1c2hfYmFjayhWZWN0b3IyaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGopKTsKKyAgICAgIHZhbHVlcy5wdXNoX2JhY2soaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkpOworICAgIH0KKyAgfQorICBzdGQ6OmNvdXQgPDwgIm5ueiA9ICIgPDwgY29vcmRzLnNpemUoKSAgPDwgIlxuIjsKKyAgQ0hFQ0tfTUVNCisKKyAgICAvLyBkZW5zZSBtYXRyaWNlcworICAgICNpZmRlZiBERU5TRU1BVFJJWAorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZGVuc2UoY29vcmRzLHZhbHVlcyk7KQorICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCisvLyAgICAgaWYgKCFmdWxseXJhbmQpCisvLyAgICAgeworLy8gICAgICAgQkVOQ0goc2V0aW5uZXJyYW5kX2VpZ2VuKGNvb3Jkcyx2YWx1ZXMpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZmlsbHJhbmRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworLy8gICAgIH0KKyAgICB7CisgICAgICBCRU5DSChzZXRyYW5kX2VpZ2VuX2R5bmFtaWMoY29vcmRzLHZhbHVlcyk7KQorICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkeW5hbWljXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisvLyAgICAgeworLy8gICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvb3Jkcyx2YWx1ZXMpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gY29tcGFjdFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisvLyAgICAgfQorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fc3VtZXEoY29vcmRzLHZhbHVlcyk7KQorICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzdW1lcVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgIHsKKy8vICAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ251X2hhc2goY29vcmRzLHZhbHVlcyk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzdGQ6Om1hcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfc2NpcHkoY29vcmRzLHZhbHVlcyk7KQorICAgICAgc3RkOjpjb3V0IDw8ICJzY2lweVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNpZm5kZWYgTk9HT09HTEUKKyAgICB7CisgICAgICBCRU5DSChzZXRyYW5kX2VpZ2VuX2dvb2dsZV9kZW5zZShjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGdvb2dsZSBkZW5zZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGdvb2dsZSBzcGFyc2VcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZm5kZWYgTk9VQkxBUworICAgIHsKKy8vICAgICAgIEJFTkNIKHNldHJhbmRfdWJsYXNfbWFwcGVkKGNvb3Jkcyx2YWx1ZXMpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgbWFwcGVkXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF91Ymxhc19nZW52ZWMoY29vcmRzLHZhbHVlcyk7KQorICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyB2ZWNvZnZlY1x0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgIC8qeworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIHNldHJhbmRfdWJsYXNfY29tcHJlc3NlZChjb29yZHMsdmFsdWVzKTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgY29tcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgIHsKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBzZXRyYW5kX3VibGFzX2Nvb3JkKGNvb3Jkcyx2YWx1ZXMpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyBjb29yZFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfSovCisgICAgI2VuZGlmCisKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF9tdGwoY29vcmRzLHZhbHVlcykpOworICAgICAgc3RkOjpjb3V0IDw8ICJNVExcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworICAgIH0KKyAgICAjZW5kaWYKKworICByZXR1cm4gMDsKK30KKworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRpbm5lcnJhbmRfZWlnZW4oY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICAvL21hdC5zdGFydEZpbGwoMjAwMDAwMC8qY29vcmRzLnNpemUoKSovKTsKKyAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIG1hdC5pbnNlcnQoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgPSB2YWxzW2ldOworICB9CisgIG1hdC5maW5hbGl6ZSgpOworICBDSEVDS19NRU07CisgIHJldHVybiAwOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZHluYW1pYyhjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICBtYXQucmVzZXJ2ZShjb29yZHMuc2l6ZSgpLzEwKTsKKyAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIG1hdC5jb2VmZlJlZihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOworICB9CisgIG1hdC5maW5hbGl6ZSgpOworICBDSEVDS19NRU07CisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fc3VtZXEoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisgIGludCBuID0gY29vcmRzLnNpemUoKS9LSzsKKyAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICBmb3IgKGludCBqPTA7IGo8S0s7ICsraikKKyAgeworICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBhdXgoU0laRSxTSVpFKTsKKyAgICBtYXQucmVzZXJ2ZShuKTsKKyAgICBmb3IgKGludCBpPWoqbjsgaTwoaisxKSpuOyArK2kpCisgICAgeworICAgICAgYXV4Lmluc2VydChjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOworICAgIH0KKyAgICBhdXguZmluYWxpemUoKTsKKyAgICBtYXQgKz0gYXV4OworICB9CisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fY29tcGFjdChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IHNldHRlcihTSVpFLFNJWkUpOworICBzZXR0ZXIucmVzZXJ2ZShjb29yZHMuc2l6ZSgpLzEwKTsKKyAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIHNldHRlci5jb2VmZlJlZihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOworICB9CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdCA9IHNldHRlcjsKKyAgQ0hFQ0tfTUVNOworICByZXR1cm4gJm1hdC5jb2VmZlJlZihjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKK30KKworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dudV9oYXNoKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgeworICAgIFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXg8U2NhbGFyPiwgU3RkTWFwVHJhaXRzID4gc2V0dGVyKG1hdCk7CisgICAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICBzZXR0ZXIoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgICB9CisgICAgQ0hFQ0tfTUVNOworICB9CisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCisjaWZuZGVmIE5PR09PR0xFCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX2RlbnNlKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgeworICAgIFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXg8U2NhbGFyPiwgR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzPiBzZXR0ZXIobWF0KTsKKyAgICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICAgICAgc2V0dGVyKGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgICAgQ0hFQ0tfTUVNOworICB9CisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsU0laRSk7CisgIHsKKyAgICBSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4PFNjYWxhcj4sIEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHM+IHNldHRlcihtYXQpOworICAgIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCisgICAgICBzZXR0ZXIoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgICBDSEVDS19NRU07CisgIH0KKyAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisjZW5kaWYKKworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgY29vX3RvY3NyKGNvbnN0IGludCBuX3JvdywKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBuX2NvbCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBubnosCisgICAgICAgICAgICAgICBjb25zdCBDb29yZGluYXRlcyBBaWosCisgICAgICAgICAgICAgICBjb25zdCBWYWx1ZXMgQXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgQnBbXSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBCaltdLAorICAgICAgICAgICAgICAgICAgICAgVCBCeFtdKQoreworICAgIC8vY29tcHV0ZSBudW1iZXIgb2Ygbm9uLXplcm8gZW50cmllcyBwZXIgcm93IG9mIEEgY29vX3RvY3NyCisgICAgc3RkOjpmaWxsKEJwLCBCcCArIG5fcm93LCAwKTsKKworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbm56OyBuKyspeworICAgICAgICBCcFtBaWpbbl0ueCgpXSsrOworICAgIH0KKworICAgIC8vY3Vtc3VtIHRoZSBubnogcGVyIHJvdyB0byBnZXQgQnBbXQorICAgIGZvcihpbnQgaSA9IDAsIGN1bXN1bSA9IDA7IGkgPCBuX3JvdzsgaSsrKXsKKyAgICAgICAgaW50IHRlbXAgPSBCcFtpXTsKKyAgICAgICAgQnBbaV0gPSBjdW1zdW07CisgICAgICAgIGN1bXN1bSArPSB0ZW1wOworICAgIH0KKyAgICBCcFtuX3Jvd10gPSBubno7CisKKyAgICAvL3dyaXRlIEFqLEF4IGludG8gQmosQngKKyAgICBmb3IoaW50IG4gPSAwOyBuIDwgbm56OyBuKyspeworICAgICAgICBpbnQgcm93ICA9IEFpaltuXS54KCk7CisgICAgICAgIGludCBkZXN0ID0gQnBbcm93XTsKKworICAgICAgICBCaltkZXN0XSA9IEFpaltuXS55KCk7CisgICAgICAgIEJ4W2Rlc3RdID0gQXhbbl07CisKKyAgICAgICAgQnBbcm93XSsrOworICAgIH0KKworICAgIGZvcihpbnQgaSA9IDAsIGxhc3QgPSAwOyBpIDw9IG5fcm93OyBpKyspeworICAgICAgICBpbnQgdGVtcCA9IEJwW2ldOworICAgICAgICBCcFtpXSAgPSBsYXN0OworICAgICAgICBsYXN0ICAgPSB0ZW1wOworICAgIH0KKworICAgIC8vbm93IEJwLEJqLEJ4IGZvcm0gYSBDU1IgcmVwcmVzZW50YXRpb24gKHdpdGggcG9zc2libGUgZHVwbGljYXRlcykKK30KKwordGVtcGxhdGU8IGNsYXNzIFQxLCBjbGFzcyBUMiA+Citib29sIGt2X3BhaXJfbGVzcyhjb25zdCBzdGQ6OnBhaXI8VDEsVDI+JiB4LCBjb25zdCBzdGQ6OnBhaXI8VDEsVDI+JiB5KXsKKyAgICByZXR1cm4geC5maXJzdCA8IHkuZmlyc3Q7Cit9CisKKwordGVtcGxhdGU8Y2xhc3MgSSwgY2xhc3MgVD4KK3ZvaWQgY3NyX3NvcnRfaW5kaWNlcyhjb25zdCBJIG5fcm93LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEkgQXBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIEFqW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBBeFtdKQoreworICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8SSxUPiA+IHRlbXA7CisKKyAgICBmb3IoSSBpID0gMDsgaSA8IG5fcm93OyBpKyspeworICAgICAgICBJIHJvd19zdGFydCA9IEFwW2ldOworICAgICAgICBJIHJvd19lbmQgICA9IEFwW2krMV07CisKKyAgICAgICAgdGVtcC5jbGVhcigpOworCisgICAgICAgIGZvcihJIGpqID0gcm93X3N0YXJ0OyBqaiA8IHJvd19lbmQ7IGpqKyspeworICAgICAgICAgICAgdGVtcC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQWpbampdLEF4W2pqXSkpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzb3J0KHRlbXAuYmVnaW4oKSx0ZW1wLmVuZCgpLGt2X3BhaXJfbGVzczxJLFQ+KTsKKworICAgICAgICBmb3IoSSBqaiA9IHJvd19zdGFydCwgbiA9IDA7IGpqIDwgcm93X2VuZDsgamorKywgbisrKXsKKyAgICAgICAgICAgIEFqW2pqXSA9IHRlbXBbbl0uZmlyc3Q7CisgICAgICAgICAgICBBeFtqal0gPSB0ZW1wW25dLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEksIGNsYXNzIFQ+Cit2b2lkIGNzcl9zdW1fZHVwbGljYXRlcyhjb25zdCBJIG5fcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSSBuX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgQXBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgQWpbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgQXhbXSkKK3sKKyAgICBJIG5ueiA9IDA7CisgICAgSSByb3dfZW5kID0gMDsKKyAgICBmb3IoSSBpID0gMDsgaSA8IG5fcm93OyBpKyspeworICAgICAgICBJIGpqID0gcm93X2VuZDsKKyAgICAgICAgcm93X2VuZCA9IEFwW2krMV07CisgICAgICAgIHdoaWxlKCBqaiA8IHJvd19lbmQgKXsKKyAgICAgICAgICAgIEkgaiA9IEFqW2pqXTsKKyAgICAgICAgICAgIFQgeCA9IEF4W2pqXTsKKyAgICAgICAgICAgIGpqKys7CisgICAgICAgICAgICB3aGlsZSggamogPCByb3dfZW5kICYmIEFqW2pqXSA9PSBqICl7CisgICAgICAgICAgICAgICAgeCArPSBBeFtqal07CisgICAgICAgICAgICAgICAgamorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFqW25uel0gPSBqOworICAgICAgICAgICAgQXhbbm56XSA9IHg7CisgICAgICAgICAgICBubnorKzsKKyAgICAgICAgfQorICAgICAgICBBcFtpKzFdID0gbm56OworICAgIH0KK30KKworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3NjaXB5KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgbWF0LnJlc2l6ZU5vblplcm9zKGNvb3Jkcy5zaXplKCkpOworLy8gICBzdGQ6OmNlcnIgPDwgInNldHJhbmRfc2NpcHkuLi5cbiI7CisgIGNvb190b2NzcjxTY2FsYXI+KFNJWkUsU0laRSwgY29vcmRzLnNpemUoKSwgY29vcmRzLCB2YWxzLCBtYXQuX291dGVySW5kZXhQdHIoKSwgbWF0Ll9pbm5lckluZGV4UHRyKCksIG1hdC5fdmFsdWVQdHIoKSk7CisvLyAgIHN0ZDo6Y2VyciA8PCAiY29vX3RvY3NyIG9rXG4iOworCisgIGNzcl9zb3J0X2luZGljZXMoU0laRSwgbWF0Ll9vdXRlckluZGV4UHRyKCksIG1hdC5faW5uZXJJbmRleFB0cigpLCBtYXQuX3ZhbHVlUHRyKCkpOworCisgIGNzcl9zdW1fZHVwbGljYXRlcyhTSVpFLCBTSVpFLCBtYXQuX291dGVySW5kZXhQdHIoKSwgbWF0Ll9pbm5lckluZGV4UHRyKCksIG1hdC5fdmFsdWVQdHIoKSk7CisKKyAgbWF0LnJlc2l6ZU5vblplcm9zKG1hdC5fb3V0ZXJJbmRleFB0cigpW1NJWkVdKTsKKworICByZXR1cm4gJm1hdC5jb2VmZlJlZihjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKK30KKworCisjaWZuZGVmIE5PVUJMQVMKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19tYXBwZWQoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOjp1YmxhczsKKyAgbWFwcGVkX21hdHJpeDxTY2FsYXI+IGF1eChTSVpFLFNJWkUpOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgYXV4KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgIH0KKyAgQ0hFQ0tfTUVNOworICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXI+IG1hdChhdXgpOworICByZXR1cm4gMDsvLyAmbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorLypFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfY29vcmQoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOjp1YmxhczsKKyAgY29vcmRpbmF0ZV9tYXRyaXg8U2NhbGFyPiBhdXgoU0laRSxTSVpFKTsKKyAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIGF1eChjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSA9IHZhbHNbaV07CisgIH0KKyAgY29tcHJlc3NlZF9tYXRyaXg8U2NhbGFyPiBtYXQoYXV4KTsKKyAgcmV0dXJuIDA7Ly8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX2NvbXByZXNzZWQoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOjp1YmxhczsKKyAgY29tcHJlc3NlZF9tYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIG1hdChjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSA9IHZhbHNbaV07CisgIH0KKyAgcmV0dXJuIDA7Ly8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfSovCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfZ2VudmVjKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzo6dWJsYXM7CisKKy8vICAgdWJsYXM6OnZlY3Rvcjxjb29yZGluYXRlX3ZlY3RvcjxTY2FsYXI+ID4gZm9vOworICBnZW5lcmFsaXplZF92ZWN0b3Jfb2ZfdmVjdG9yPFNjYWxhciwgcm93X21ham9yLCB1Ymxhczo6dmVjdG9yPGNvb3JkaW5hdGVfdmVjdG9yPFNjYWxhcj4gPiA+IGF1eChTSVpFLFNJWkUpOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgYXV4KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgIH0KKyAgQ0hFQ0tfTUVNOworICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXIscm93X21ham9yPiBtYXQoYXV4KTsKKyAgcmV0dXJuIDA7Ly8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTk9NVEwKK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgc2V0cmFuZF9tdGwoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfdHJhbnNwb3NlLmNwcCBiL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWFjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGFyc2VfdHJhbnNwb3NlLmNwcApAQCAtMCwwICsxLDEwNCBAQAorCisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfdHJhbnNwb3NlLmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKKy8vIC1ETk9HTU0gLUROT01UTAorLy8gLURDU1BBUlNFIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9JbmNsdWRlLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvTGliL2xpYmNzcGFyc2UuYQorCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgREVOU0lUWQorI2RlZmluZSBERU5TSVRZIDAuMDEKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMQorI2VuZGlmCisKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2lmbmRlZiBNSU5ERU5TSVRZCisjZGVmaW5lIE1JTkRFTlNJVFkgMC4wMDA0CisjZW5kaWYKKworI2lmbmRlZiBOQlRSSUVTCisjZGVmaW5lIE5CVFJJRVMgMTAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNIKFgpIFwKKyAgdGltZXIucmVzZXQoKTsgXAorICBmb3IgKGludCBfaj0wOyBfajxOQlRSSUVTOyArK19qKSB7IFwKKyAgICB0aW1lci5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgX2s9MDsgX2s8UkVQRUFUOyArK19rKSB7IFwKKyAgICAgICAgWCAgXAorICB9IHRpbWVyLnN0b3AoKTsgfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcm93cyA9IFNJWkU7CisgIGludCBjb2xzID0gU0laRTsKKyAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CisKKyAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyksIHNtMyhyb3dzLGNvbHMpOworCisgIEJlbmNoVGltZXIgdGltZXI7CisgIGZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHk+PU1JTkRFTlNJVFk7IGRlbnNpdHkqPTAuNSkKKyAgeworICAgIGZpbGxNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgeworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKKyAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMS50cmFuc3Bvc2UoKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgRWlnZW4gZGVuc2U6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBzdGQ6OmNvdXQgPDwgIk5vbiB6ZXJvczogIiA8PCBzbTEubm9uWmVyb3MoKS9mbG9hdChzbTEucm93cygpKnNtMS5jb2xzKCkpKjEwMCA8PCAiJVxuIjsKKworICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcworICAgIHsKKyAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgc20zID0gc20xLnRyYW5zcG9zZSgpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICBFaWdlbjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENTcGFyc2UKKyAgICAjaWZkZWYgQ1NQQVJTRQorICAgIHsKKyAgICAgIGNzICptMSwgKm0zOworICAgICAgZWlUb0NTcGFyc2Uoc20xLCBtMSk7CisKKyAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgeyBtMyA9IGNzX3RyYW5zcG9zZShtMSwxKTsgY3Nfc3BmcmVlKG0zKTt9KQorICAgICAgc3RkOjpjb3V0IDw8ICIgIENTcGFyc2U6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBHTU0rKworICAgICNpZm5kZWYgTk9HTU0KKyAgICB7CisgICAgICBHbW1EeW5TcGFyc2UgIGdtbVQzKHJvd3MsY29scyk7CisgICAgICBHbW1TcGFyc2UgbTEocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIGVpVG9HbW0oc20xLCBtMSk7CisgICAgICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIGdtbTo6Y29weShnbW06OnRyYW5zcG9zZWQobTEpLG0zKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgR01NOlx0XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBNVEw0CisgICAgI2lmbmRlZiBOT01UTAorICAgIHsKKyAgICAgIE10bFNwYXJzZSBtMShyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb010bChzbTEsIG0xKTsKKyAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSB0cmFucyhtMSk7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgIE1UTDQ6XHRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0ZDo6Y291dCA8PCAiXG5cbiI7CisgIH0KKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2gvc3BhcnNlX3RyaXNvbHZlci5jcHAgYi9iZW5jaC9zcGFyc2VfdHJpc29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y0ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX3RyaXNvbHZlci5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKworLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjAwNSAtRFNJWkU9MTAwMDAgJiYgLi9hLm91dAorLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjA1IC1EU0laRT0yMDAwICYmIC4vYS5vdXQKKy8vIC1ETk9HTU0gLUROT01UTAorLy8gLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMDAwCisjZW5kaWYKKworI2lmbmRlZiBERU5TSVRZCisjZGVmaW5lIERFTlNJVFkgMC4wMQorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxCisjZW5kaWYKKworI2luY2x1ZGUgIkJlbmNoU3BhcnNlVXRpbC5oIgorCisjaWZuZGVmIE1JTkRFTlNJVFkKKyNkZWZpbmUgTUlOREVOU0lUWSAwLjAwMDQKKyNlbmRpZgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAxMAorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKK3R5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixVcHBlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlVHJpTWF0cml4OwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLFJvd01ham9yQml0fFVwcGVyVHJpYW5ndWxhcj4gRWlnZW5TcGFyc2VUcmlNYXRyaXhSb3c7CisKK3ZvaWQgZmlsbE1hdHJpeChmbG9hdCBkZW5zaXR5LCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZVRyaU1hdHJpeCYgZHN0KQoreworICBkc3Quc3RhcnRGaWxsKHJvd3MqY29scypkZW5zaXR5KTsKKyAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgeworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBqOyBpKyspCisgICAgeworICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiAwOworICAgICAgaWYgKHYhPTApCisgICAgICAgIGRzdC5maWxsKGksaikgPSB2OworICAgIH0KKyAgICBkc3QuZmlsbChqLGopID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIH0KKyAgZHN0LmVuZEZpbGwoKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJvd3MgPSBTSVpFOworICBpbnQgY29scyA9IFNJWkU7CisgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOworICBCZW5jaFRpbWVyIHRpbWVyOworICAjaWYgMQorICBFaWdlblNwYXJzZVRyaU1hdHJpeCBzbTEocm93cyxjb2xzKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIERlbnNlVmVjdG9yIGIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKGNvbHMpOworICBEZW5zZVZlY3RvciB4ID0gRGVuc2VWZWN0b3I6OlJhbmRvbShjb2xzKTsKKworICBib29sIGRlbnNlZG9uZSA9IGZhbHNlOworCisgIGZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHk+PU1JTkRFTlNJVFk7IGRlbnNpdHkqPTAuNSkKKyAgeworICAgIEVpZ2VuU3BhcnNlVHJpTWF0cml4IHNtMShyb3dzLCBjb2xzKTsKKyAgICBmaWxsTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CisKKyAgICAvLyBkZW5zZSBtYXRyaWNlcworICAgICNpZmRlZiBERU5TRU1BVFJJWAorICAgIGlmICghZGVuc2Vkb25lKQorICAgIHsKKyAgICAgIGRlbnNlZG9uZSA9IHRydWU7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvckJpdD4gbTIocm93cyxjb2xzKTsKKyAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKKyAgICAgIG0yID0gbTE7CisKKyAgICAgIEJFTkNIKHggPSBtMS5tYXJrZWQ8VXBwZXJUcmlhbmd1bGFyPigpLnNvbHZlVHJpYW5ndWxhcihiKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKworICAgICAgQkVOQ0goeCA9IG0yLm1hcmtlZDxVcHBlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKGIpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcworICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gc3BhcnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgRWlnZW5TcGFyc2VUcmlNYXRyaXhSb3cgc20yID0gc20xOworCisgICAgICBCRU5DSCh4ID0gc20xLnNvbHZlVHJpYW5ndWxhcihiKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKworICAgICAgQkVOQ0goeCA9IHNtMi5zb2x2ZVRyaWFuZ3VsYXIoYik7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisKKy8vICAgICAgIHggPSBiOworLy8gICAgICAgQkVOQ0goc20xLmludmVyc2VQcm9kdWN0SW5QbGFjZSh4KTspCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiIChpbnBsYWNlKSIgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisvLworLy8gICAgICAgeCA9IGI7CisvLyAgICAgICBCRU5DSChzbTIuaW52ZXJzZVByb2R1Y3RJblBsYWNlKHgpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKGlucGxhY2UpIiA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgICB9CisKKworCisgICAgLy8gQ1NwYXJzZQorICAgICNpZmRlZiBDU1BBUlNFCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJDU3BhcnNlIFx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKKyAgICAgIGNzICptMTsKKyAgICAgIGVpVG9DU3BhcnNlKHNtMSwgbTEpOworCisgICAgICBCRU5DSCh4ID0gYjsgaWYgKCFjc19sc29sdmUgKG0xLCB4LmRhdGEoKSkpe3N0ZDo6Y2VyciA8PCAiY3NfbHNvbHZlIGZhaWxlZFxuIjsgYnJlYWs7fTsgKQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBjb2xtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBHTU0rKworICAgICNpZm5kZWYgTk9HTU0KKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrIHNwYXJzZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpOworICAgICAgZ21tOjpjc3JfbWF0cml4PFNjYWxhcj4gbTI7CisgICAgICBlaVRvR21tKHNtMSwgbTEpOworICAgICAgZ21tOjpjb3B5KG0xLG0yKTsKKyAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tWChjb2xzKSwgZ21tQihjb2xzKTsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tWFswXSwgY29scykgPSB4OworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1CWzBdLCBjb2xzKSA9IGI7CisKKyAgICAgIGdtbVggPSBnbW1COworICAgICAgQkVOQ0goZ21tOjp1cHBlcl90cmlfc29sdmUobTEsIGdtbVgsIGZhbHNlKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tWFswXSwgY29scykudHJhbnNwb3NlKCkgPDwgIlxuIjsKKworICAgICAgZ21tWCA9IGdtbUI7CisgICAgICBCRU5DSChnbW06OnVwcGVyX3RyaV9zb2x2ZShtMiwgZ21tWCwgZmFsc2UpOykKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1YWzBdLCBjb2xzKS50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyk7CisgICAgICBNdGxTcGFyc2VSb3dNYWpvciBtMihyb3dzLGNvbHMpOworICAgICAgZWlUb010bChzbTEsIG0xKTsKKyAgICAgIG0yID0gbTE7CisgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IHgocm93cywgMS4wKTsKKyAgICAgIG10bDo6ZGVuc2VfdmVjdG9yPFNjYWxhcj4gYihyb3dzLCAxLjApOworCisgICAgICBCRU5DSCh4ID0gbXRsOjp1cHBlcl90cmlzb2x2ZShtMSxiKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHggPDwgIlxuIjsKKworICAgICAgQkVOQ0goeCA9IG10bDo6dXBwZXJfdHJpc29sdmUobTIsYik7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCB4IDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisKKyAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOworICB9CisgICNlbmRpZgorCisgICNpZiAwCisgICAgLy8gYmVuY2ggc21hbGwgbWF0cmljZXMgKGluLXBsYWNlIHZlcnN1cyByZXR1cm4gYnllIHZhbHVlKQorICAgIHsKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICBmb3IgKGludCBfaj0wOyBfajwxMDsgKytfaikgeworICAgICAgICBNYXRyaXg0ZiBtID0gTWF0cml4NGY6OlJhbmRvbSgpOworICAgICAgICBWZWN0b3I0ZiBiID0gVmVjdG9yNGY6OlJhbmRvbSgpOworICAgICAgICBWZWN0b3I0ZiB4ID0gVmVjdG9yNGY6OlJhbmRvbSgpOworICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICBmb3IgKGludCBfaz0wOyBfazwxMDAwMDAwOyArK19rKSB7CisgICAgICAgICAgYiA9IG0uaW52ZXJzZVByb2R1Y3QoYik7CisgICAgICAgIH0KKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgfQorICAgICAgc3RkOjpjb3V0IDw8ICI0eDQgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorCisgICAgeworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIGZvciAoaW50IF9qPTA7IF9qPDEwOyArK19qKSB7CisgICAgICAgIE1hdHJpeDRmIG0gPSBNYXRyaXg0Zjo6UmFuZG9tKCk7CisgICAgICAgIFZlY3RvcjRmIGIgPSBWZWN0b3I0Zjo6UmFuZG9tKCk7CisgICAgICAgIFZlY3RvcjRmIHggPSBWZWN0b3I0Zjo6UmFuZG9tKCk7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgIGZvciAoaW50IF9rPTA7IF9rPDEwMDAwMDA7ICsrX2spIHsKKyAgICAgICAgICBtLmludmVyc2VQcm9kdWN0SW5QbGFjZSh4KTsKKyAgICAgICAgfQorICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgIjR4NCBJUCA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICNlbmRpZgorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvc3BiZW5jaC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI3MzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BiZW5jaC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg1IEBACisKKworc2V0KEJMQVNfRk9VTkQgVFJVRSkKK3NldChMQVBBQ0tfRk9VTkQgVFJVRSkKK3NldChCTEFTX0xJQlJBUklFUyBlaWdlbl9ibGFzX3N0YXRpYykKK3NldChMQVBBQ0tfTElCUkFSSUVTIGVpZ2VuX2xhcGFja19zdGF0aWMpCisKK3NldChTUEFSU0VfTElCUyAiIikKKworIyBmaW5kX2xpYnJhcnkoUEFSRElTT19MSUJSQVJJRVMgcGFyZGlzbzQxMi1HTlU0NTAtWDg2LTY0KQorIyBpZihQQVJESVNPX0xJQlJBUklFUykKKyMgICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fUEFSRElTT19TVVBQT1JUIikKKyMgICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtQQVJESVNPX0xJQlJBUklFU30pCisjIGVuZGlmKFBBUkRJU09fTElCUkFSSUVTKQorCitmaW5kX3BhY2thZ2UoQ2hvbG1vZCkKK2lmKENIT0xNT0RfRk9VTkQgQU5EIEJMQVNfRk9VTkQgQU5EIExBUEFDS19GT1VORCkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX0NIT0xNT0RfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDSE9MTU9EX0lOQ0xVREVTfSkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7QkxBU19MSUJSQVJJRVN9ICR7TEFQQUNLX0xJQlJBUklFU30pCisgIHNldChDSE9MTU9EX0FMTF9MSUJTICAke0NIT0xNT0RfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSAke0xBUEFDS19MSUJSQVJJRVN9KQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoVW1mcGFjaykKK2lmKFVNRlBBQ0tfRk9VTkQgQU5EIEJMQVNfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9VTUZQQUNLX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7VU1GUEFDS19JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1VNRlBBQ0tfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKKyAgc2V0KFVNRlBBQ0tfQUxMX0xJQlMgJHtVTUZQQUNLX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShTdXBlckxVIDQuMCkKK2lmKFNVUEVSTFVfRk9VTkQgQU5EIEJMQVNfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9TVVBFUkxVX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U1VQRVJMVV9JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1NVUEVSTFVfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKKyAgc2V0KFNVUEVSTFVfQUxMX0xJQlMgJHtTVVBFUkxVX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCitlbmRpZigpCisKKworZmluZF9wYWNrYWdlKFBBU1RJWCBRVUlFVCBDT01QT05FTlRTIE1FVElTIFNDT1RDSCkKKyMgY2hlY2sgdGhhdCB0aGUgUEFTVElYIGZvdW5kIGlzIGEgdmVyc2lvbiB3aXRob3V0IE1QSQorZmluZF9wYXRoKFBBU1RJWF9wYXN0aXhfbm9tcGkuaF9JTkNMVURFX0RJUlMKKyAgTkFNRVMgcGFzdGl4X25vbXBpLmgKKyAgSElOVFMgJHtQQVNUSVhfSU5DTFVERV9ESVJTfQorKQoraWYgKE5PVCBQQVNUSVhfcGFzdGl4X25vbXBpLmhfSU5DTFVERV9ESVJTKQorICBtZXNzYWdlKFNUQVRVUyAiQSB2ZXJzaW9uIG9mIFBhc3RpeCBoYXMgYmVlbiBmb3VuZCBidXQgcGFzdGl4X25vbXBpLmggZG9lcyBub3QgZXhpc3QgaW4gdGhlIGluY2x1ZGUgZGlyZWN0b3J5LiIKKyAgICAgICAgICAgICAgICAgIiBCZWNhdXNlIEVpZ2VuIHRlc3RzIHJlcXVpcmUgYSB2ZXJzaW9uIHdpdGhvdXQgTVBJLCB3ZSBkaXNhYmxlIHRoZSBQYXN0aXggYmFja2VuZC4iKQorZW5kaWYoKQoraWYoUEFTVElYX0ZPVU5EIEFORCBQQVNUSVhfcGFzdGl4X25vbXBpLmhfSU5DTFVERV9ESVJTIEFORCBCTEFTX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fUEFTVElYX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UEFTVElYX0lOQ0xVREVfRElSU19ERVB9KQorICBpZihTQ09UQ0hfRk9VTkQpCisgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1NDT1RDSF9JTkNMVURFX0RJUlN9KQorICAgIHNldChQQVNUSVhfTElCUkFSSUVTICR7UEFTVElYX0xJQlJBUklFU30gJHtTQ09UQ0hfTElCUkFSSUVTfSkKKyAgZWxzZWlmKE1FVElTX0ZPVU5EKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNRVRJU19JTkNMVURFX0RJUlN9KQorICAgIHNldChQQVNUSVhfTElCUkFSSUVTICR7UEFTVElYX0xJQlJBUklFU30gJHtNRVRJU19MSUJSQVJJRVN9KSAgCisgIGVuZGlmKFNDT1RDSF9GT1VORCkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7UEFTVElYX0xJQlJBUklFU19ERVB9ICR7T1JERVJJTkdfTElCUkFSSUVTfSkKKyAgc2V0KFBBU1RJWF9BTExfTElCUyAke1BBU1RJWF9MSUJSQVJJRVNfREVQfSkKK2VuZGlmKFBBU1RJWF9GT1VORCBBTkQgQkxBU19GT1VORCkKKworaWYoTUVUSVNfRk9VTkQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNRVRJU19JTkNMVURFX0RJUlN9KQorICBzZXQgKFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7TUVUSVNfTElCUkFSSUVTfSkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX01FVElTX1NVUFBPUlQiKQorZW5kaWYoTUVUSVNfRk9VTkQpCisKK2ZpbmRfbGlicmFyeShSVF9MSUJSQVJZIHJ0KQoraWYoUlRfTElCUkFSWSkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7UlRfTElCUkFSWX0pCitlbmRpZihSVF9MSUJSQVJZKQorCithZGRfZXhlY3V0YWJsZShzcGJlbmNoc29sdmVyIHNwYmVuY2hzb2x2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChzcGJlbmNoc29sdmVyICR7U1BBUlNFX0xJQlN9KQorCithZGRfZXhlY3V0YWJsZShzcHNvbHZlciBzcF9zb2x2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChzcHNvbHZlciAke1NQQVJTRV9MSUJTfSkKKworCithZGRfZXhlY3V0YWJsZSh0ZXN0X3NwYXJzZUxVIHRlc3Rfc3BhcnNlTFUuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzICh0ZXN0X3NwYXJzZUxVICR7U1BBUlNFX0xJQlN9KQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL3NwX3NvbHZlci5jcHAgYi9iZW5jaC9zcGJlbmNoL3NwX3NvbHZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNGJhYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYmVuY2gvc3Bfc29sdmVyLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gU21hbGwgYmVuY2ggcm91dGluZSBmb3IgRWlnZW4gYXZhaWxhYmxlIGluIEVpZ2VuCisvLyAoQykgRGVzaXJlIE5VRU5UU0EgV0FLQU0sIElOUklBCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8RWlnZW4vSmFjb2JpPgorI2luY2x1ZGUgPEVpZ2VuL0hvdXNlaG9sZGVyPgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+CisvLyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KKyNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KKy8vICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9TY2FsaW5nLmg+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3MpCit7CisgIFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiBBOyAKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj46OkluZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIDE+IERlbnNlUmhzOworICBWZWN0b3JYZCBiLCB4LCB0bXA7CisgIEJlbmNoVGltZXIgdGltZXIsdG90YWx0aW1lOyAKKyAgLy9TcGFyc2VMVTxTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4gPiAgIHNvbHZlcjsKKy8vICAgU3VwZXJMVTxTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4gPiAgIHNvbHZlcjsKKyAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+LCBMb3dlcixJbmNvbXBsZXRlQ2hvbGVza3k8ZG91YmxlLExvd2VyPiA+IHNvbHZlcjsgCisgIGlmc3RyZWFtIG1hdHJpeF9maWxlOyAKKyAgc3RyaW5nIGxpbmU7CisgIGludCAgbjsKKyAgLy8gU2V0IHBhcmFtZXRlcnMKKy8vICAgc29sdmVyLmlwYXJtKElQQVJNX1RIUkVBRF9OQlIpID0gNDsKKyAgLyogRmlsbCB0aGUgbWF0cml4IHdpdGggc3BhcnNlIG1hdHJpeCBzdG9yZWQgaW4gTWF0cml4LU1hcmtldCBjb29yZGluYXRlIGNvbHVtbi1vcmllbnRlZCBmb3JtYXQgKi8KKyAgaWYgKGFyZ2MgPCAyKSBhc3NlcnQoZmFsc2UgJiYgInBsZWFzZSwgZ2l2ZSB0aGUgbWF0cml4IG1hcmtldCBmaWxlICIpOworICAKKyAgdGltZXIuc3RhcnQoKTsKKyAgdG90YWx0aW1lLnN0YXJ0KCk7CisgIGxvYWRNYXJrZXQoQSwgYXJnc1sxXSk7CisgIGNvdXQgPDwgIkVuZCBjaGFyZ2luZyBtYXRyaXggIiA8PCBlbmRsOworICBib29sIGlzY29tcGxleD1mYWxzZSwgaXN2ZWN0b3I9ZmFsc2U7CisgIGludCBzeW07CisgIGdldE1hcmtldEhlYWRlcihhcmdzWzFdLCBzeW0sIGlzY29tcGxleCwgaXN2ZWN0b3IpOworICBpZiAoaXNjb21wbGV4KSB7IGNvdXQ8PCAiIE5vdCBmb3IgY29tcGxleCBtYXRyaWNlcyBcbiI7IHJldHVybiAtMTsgfQorICBpZiAoaXN2ZWN0b3IpIHsgY291dCA8PCAiVGhlIHByb3ZpZGVkIGZpbGUgaXMgbm90IGEgbWF0cml4IGZpbGVcbiI7IHJldHVybiAtMTt9CisgIGlmIChzeW0gIT0gMCkgeyAvLyBzeW1tZXRyaWMgbWF0cmljZXMsIG9ubHkgdGhlIGxvd2VyIHBhcnQgaXMgc3RvcmVkCisgICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+IHRlbXA7IAorICAgIHRlbXAgPSBBOworICAgIEEgPSB0ZW1wLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgfQorICB0aW1lci5zdG9wKCk7CisgIAorICBuID0gQS5jb2xzKCk7CisgIC8vID09PT09PSBURVNUUyBGT1IgU1BBUlNFIFRVVE9SSUFMID09PT09PQorLy8gICBjb3V0PDwgIk91dGVyU2l6ZSAiIDw8IEEub3V0ZXJTaXplKCkgPDwgIiBpbm5lciAiIDw8IEEuaW5uZXJTaXplKCkgPDwgZW5kbDsgCisvLyAgIFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yPiBtYXQxKEEpOyAKKy8vICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3I+IG1hdDI7CisvLyAgIGNvdXQgPDwgIiBub3JtIG9mIEEgIiA8PCBtYXQxLm5vcm0oKSA8PCBlbmRsOyA7CisvLyAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIGludD4gcGVybShuKTsKKy8vICAgcGVybS5yZXNpemUobiwxKTsKKy8vICAgcGVybS5pbmRpY2VzKCkuc2V0TGluU3BhY2VkKG4sIDAsIG4tMSk7CisvLyAgIG1hdDIgPSBwZXJtICogbWF0MTsKKy8vICAgbWF0LnN1YnJvd3MoKTsKKy8vICAgbWF0Mi5yZXNpemUobixuKTsgCisvLyAgIG1hdDIucmVzZXJ2ZSgxMCk7CisvLyAgIG1hdDIuc2V0Q29uc3RhbnQoKTsKKy8vICAgc3RkOjpjb3V0PDwgIk5PUk0gIiA8PCBtYXQxLnNxdWFyZWROb3JtKCk8PCBlbmRsOyAgCisKKyAgY291dDw8ICJUaW1lIHRvIGxvYWQgdGhlIG1hdHJpeCAiIDw8IHRpbWVyLnZhbHVlKCkgPDxlbmRsOworICAvKiBGaWxsIHRoZSByaWdodCBoYW5kIHNpZGUgKi8KKworLy8gICBzb2x2ZXIuc2V0X3Jlc3RhcnQoMzc0KTsKKyAgaWYgKGFyZ2MgPiAyKQorICAgIGxvYWRNYXJrZXRWZWN0b3IoYiwgYXJnc1syXSk7CisgIGVsc2UgCisgIHsKKyAgICBiLnJlc2l6ZShuKTsKKyAgICB0bXAucmVzaXplKG4pOworLy8gICAgICAgdG1wLnNldFJhbmRvbSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB0bXAoaSkgPSBpOyAKKyAgICBiID0gQSAqIHRtcCA7CisgIH0KKy8vICAgU2NhbGluZzxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNjYWw7IAorLy8gICBzY2FsLmNvbXB1dGVSZWYoQSk7CisvLyAgIGIgPSBzY2FsLkxlZnRTY2FsaW5nKCkuY3dpc2VQcm9kdWN0KGIpOworCisgIC8qIENvbXB1dGUgdGhlIGZhY3Rvcml6YXRpb24gKi8KKyAgY291dDw8ICJTdGFydGluZyB0aGUgZmFjdG9yaXphdGlvbiAiPDwgZW5kbDsgCisgIHRpbWVyLnJlc2V0KCk7CisgIHRpbWVyLnN0YXJ0KCk7IAorICBjb3V0PDwgIlNpemUgb2YgSW5wdXQgTWF0cml4ICI8PCBiLnNpemUoKTw8IlxuXG4iOworICBjb3V0PDwgIlJvd3MgYW5kIGNvbHVtbnMgIjw8IEEucm93cygpIDw8IiAiIDw8QS5jb2xzKCkgPDwiXG4iOworICBzb2x2ZXIuY29tcHV0ZShBKTsKKy8vICAgc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOworLy8gICBzb2x2ZXIuZmFjdG9yaXplKEEpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CisgICAgc3RkOjpjb3V0PDwgIlRoZSBzb2x2ZXIgZmFpbGVkIFxuIjsKKyAgICByZXR1cm4gLTE7IAorICB9CisgIHRpbWVyLnN0b3AoKTsgCisgIGZsb2F0IHRpbWVfY29tcCA9IHRpbWVyLnZhbHVlKCk7IAorICBjb3V0IDw8IiBDb21wdXRlIFRpbWUgIiA8PCB0aW1lX2NvbXA8PCBlbmRsOyAKKyAgCisgIHRpbWVyLnJlc2V0KCk7CisgIHRpbWVyLnN0YXJ0KCk7CisgIHggPSBzb2x2ZXIuc29sdmUoYik7CisvLyAgIHggPSBzY2FsLlJpZ2h0U2NhbGluZygpLmN3aXNlUHJvZHVjdCh4KTsKKyAgdGltZXIuc3RvcCgpOworICBmbG9hdCB0aW1lX3NvbHZlID0gdGltZXIudmFsdWUoKTsgCisgIGNvdXQ8PCAiIFRpbWUgdG8gc29sdmUgIiA8PCB0aW1lX3NvbHZlIDw8IGVuZGw7IAorIAorICAvKiBDaGVjayB0aGUgYWNjdXJhY3kgKi8KKyAgVmVjdG9yWGQgdG1wMiA9IGIgLSBBKng7CisgIGRvdWJsZSB0ZW1wTm9ybSA9IHRtcDIubm9ybSgpL2Iubm9ybSgpOworICBjb3V0IDw8ICJSZWxhdGl2ZSBub3JtIG9mIHRoZSBjb21wdXRlZCBzb2x1dGlvbiA6ICIgPDwgdGVtcE5vcm0gPDwiXG4iOworLy8gICBjb3V0IDw8ICJJdGVyYXRpb25zIDogIiA8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8ICJcbiI7IAorICAKKyAgdG90YWx0aW1lLnN0b3AoKTsKKyAgY291dCA8PCAiVG90YWwgdGltZSAiIDw8IHRvdGFsdGltZS52YWx1ZSgpIDw8ICJcbiI7CisvLyAgc3RkOjpjb3V0PDx4LnRyYW5zcG9zZSgpPDwiXG4iOworICAKKyAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmVuY2gvc3BiZW5jaC9zcGJlbmNoLmR0ZCBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaC5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTFiOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaC5kdGQKQEAgLTAsMCArMSwzMSBAQAorPCFFTEVNRU5UIEJFTkNIIChBVkFJTFNPTFZFUissTElORUFSU1lTVEVNKyk+CisgIDwhRUxFTUVOVCBBVkFJTFNPTFZFUiAoU09MVkVSKyk+CisgICAgPCFFTEVNRU5UIFNPTFZFUiAoVFlQRSxQQUNLQUdFKT4KKyAgICAgIDwhRUxFTUVOVCBUWVBFICgjUENEQVRBKT4gIDwhLS0gT25lIG9mIExVLCBMTFQsIExETFQsIElURVIgLS0+CisgICAgICA8IUVMRU1FTlQgUEFDS0FHRSAoI1BDREFUQSk+ICA8IS0tIERlcml2ZWQgZnJvbSBhIGxpYnJhcnkgLS0+CisgIDwhRUxFTUVOVCBMSU5FQVJTWVNURU0gKE1BVFJJWCxTT0xWRVJfU1RBVCssQkVTVF9TT0xWRVIsR0xPQkFMX1BBUkFNUyopPgorICAgIDwhRUxFTUVOVCBNQVRSSVggKE5BTUUsU0laRSxFTlRSSUVTLFBBVFRFUk4/LFNZTU1FVFJZLFBPU0RFRj8sQVJJVEhNRVRJQyxSSFMqKT4KKyAgICAgIDwhRUxFTUVOVCBOQU1FICgjUENEQVRBKT4KKyAgICAgIDwhRUxFTUVOVCBTSVpFICgjUENEQVRBKT4KKyAgICAgIDwhRUxFTUVOVCBFTlRSSUVTICgjUENEQVRBKT4gPCEtLSBUaGUgbnVtYmVyIG9mIG5vbnplcm9zIGVsZW1lbnRzIC0tPgorICAgICAgPCFFTEVNRU5UIFBBVFRFUk4gKCNQQ0RBVEEpPiAgPCEtLSBJcyBzdHJ1Y3R1cmFsIHBhdHRlcm4gc3ltbWV0cmljIG9yIG5vdCAtLT4KKyAgICAgIDwhRUxFTUVOVCBTWU1NRVRSWSAoI1BDREFUQSk+IDwhLS0gc3ltbW1ldHJ5IHdpdGggbnVtZXJpY2FsIHZhbHVlcyAtLT4KKyAgICAgIDwhRUxFTUVOVCBQT1NERUYgKCNQQ0RBVEEpPiA8IS0tIElzIHRoZSBtYXRyaXggcG9zaXRpdmUgZGVmaW5pdGUgb3Igbm90IC0tPgorICAgICAgPCFFTEVNRU5UIEFSSVRITUVUSUMgKCNQQ0RBVEEpPiAKKyAgICAgIDwhRUxFTUVOVCBSSFMgKFNPVVJDRSk+ICA8IS0tIEEgbWF0cml4IGNhbiBoYXZlIG9uZSBvciBtb3JlIHJpZ2h0IGhhbmQgc2lkZSBhc3NvY2lhdGVkLiAtLT4KKyAgICAgICAgPCFFTEVNRU5UIFNPVVJDRSAoI1BDREFUQSk+IDwhLS0gU291cmNlIG9mIHRoZSByaWdodCBoYW5kIHNpZGUsIGVpdGhlciBnZW5lcmF0ZWQgb3IgcHJvdmlkZWQgLS0+CisgICAgPCFFTEVNRU5UIFNPTFZFUl9TVEFUIChQQVJBTVMqLFRJTUUsRVJST1IsSVRFUj8pPgorICAgICAgPCFFTEVNRU5UIFBBUkFNUyAoI1BDREFUQSk+CisgICAgICA8IUVMRU1FTlQgVElNRSAoQ09NUFVURSxTT0xWRSxUT1RBTCk+CisgICAgICAgIDwhRUxFTUVOVCBDT01QVVRFICgjUENEQVRBKT4gPCEtLSBUaW1lIHRvIGFuYWx5emUsdG8gZmFjdG9yaXplLCBvciB0byBzZXR1cCB0aGUgcHJlY29uZGl0aW9uZXItLT4KKyAgICAgICAgPCFFTEVNRU5UIFNPTFZFICgjUENEQVRBKT4gPCEtLSBUaW1lIHRvIHNvbHZlIHdpdGggYWxsIHRoZSBhdmFpbGFibGUgcmhzIC0tPgorICAgICAgICA8IUVMRU1FTlQgVE9UQUwgKCNQQ0RBVEEpPgorICAgICAgPCFFTEVNRU5UIEVSUk9SICgjUENEQVRBKT4gPCEtLSBFaXRoZXIgdGhlIHJlbGF0aXZlIGVycm9yIG9yIHRoZSByZWxhdGl2ZSByZXNpZHVhbCBub3JtIC0tPgorICAgICAgPCFFTEVNRU5UIElURVIgKCNQQ0RBVEEpPiA8IS0tIE51bWJlciBvZiBpdGVyYXRpb25zIC0tPgorICAgIDwhRUxFTUVOVCBCRVNUX1NPTFZFUiBDREFUQT4gPCEtLSBJZCBvZiB0aGUgYmVzdCBzb2x2ZXIgLS0+CisgICAgPCFFTEVNRU5UIEdMT0JBTF9QQVJBTVMgKCNQQ0RBVEEpPiA8IS0tIFBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCBzb2x2ZXJzIC0tPgorCis8IUFUVExJU1QgU09MVkVSIElEIENEQVRBICNSRVFVSVJFRD4KKzwhQVRUTElTVCBTT0xWRVJfU1RBVCBJRCBDREFUQSAjUkVRVUlSRUQ+Cis8IUFUVExJU1QgQkVTVF9TT0xWRVIgSUQgQ0RBVEEgI1JFUVVJUkVEPgorPCFBVFRMSVNUIFJIUyBJRCBDREFUQSAjSU1QTElFRD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuY3BwIGIvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWNkMDAzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmNwcApAQCAtMCwwICsxLDg3IEBACisjaW5jbHVkZSA8YmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmg+CisKK3ZvaWQgYmVuY2hfcHJpbnRoZWxwKCkKK3sKKyAgICBjb3V0PDwgIiBcbmJlbmNoc29sdmVyIDogcGVyZm9ybXMgYSBiZW5jaG1hcmsgb2YgYWxsIHRoZSBzb2x2ZXJzIGF2YWlsYWJsZSBpbiBFaWdlbiBcblxuIjsKKyAgICBjb3V0PDwgIiBNQVRSSVggRk9MREVSIDogXG4iOworICAgIGNvdXQ8PCAiIFRoZSBtYXRyaWNlcyBmb3IgdGhlIGJlbmNobWFyayBzaG91bGQgYmUgY29sbGVjdGVkIGluIGEgZm9sZGVyIHNwZWNpZmllZCB3aXRoIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEVJR0VOX01BVFJJWERJUiBcbiI7CisgICAgY291dDw8ICIgVGhlIG1hdHJpY2VzIGFyZSBzdG9yZWQgdXNpbmcgdGhlIG1hdHJpeCBtYXJrZXQgY29vcmRpbmF0ZSBmb3JtYXQgXG4iOworICAgIGNvdXQ8PCAiIFRoZSBtYXRyaXggYW5kIGFzc29jaWF0ZWQgcmlnaHQtaGFuZCBzaWRlIChyaHMpIGZpbGVzIGFyZSBuYW1lZCByZXNwZWN0aXZlbHkgXG4iOworICAgIGNvdXQ8PCAiIGFzIE1hdHJpeE5hbWUubXR4IGFuZCBNYXRyaXhOYW1lX2IubXR4LiBJZiB0aGUgcmhzIGRvZXMgbm90IGV4aXN0LCBhIHJhbmRvbSBvbmUgaXMgZ2VuZXJhdGVkLiBcbiI7CisgICAgY291dDw8ICIgSWYgYSBtYXRyaXggaXMgU1BELCB0aGUgbWF0cml4IHNob3VsZCBiZSBuYW1lZCBhcyBNYXRyaXhOYW1lX1NQRC5tdHggXG4iOworICAgIGNvdXQ8PCAiIElmIGEgdHJ1ZSBzb2x1dGlvbiBleGlzdHMsIGl0IHNob3VsZCBiZSBuYW1lZCBhcyBNYXRyaXhOYW1lX3gubXR4OyBcbiIgICAgIDsKKyAgICBjb3V0PDwgIiBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbm9ybSBvZiB0aGUgZXJyb3IgcmVsYXRpdmUgdG8gdGhlIGNvbXB1dGVkIHNvbHV0aW9uc1xuXG4iOworICAgIGNvdXQ8PCAiIE9QVElPTlMgOiBcbiI7IAorICAgIGNvdXQ8PCAiIC1oIG9yIC0taGVscCBcbiAgICBwcmludCB0aGlzIGhlbHAgYW5kIHJldHVyblxuXG4iOworICAgIGNvdXQ8PCAiIC1kIG1hdHJpeGRpciBcbiAgICBVc2UgbWF0cml4ZGlyIGFzIHRoZSBtYXRyaXggZm9sZGVyIGluc3RlYWQgb2YgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVJR0VOX01BVFJJWERJUlxuXG4iOyAKKyAgICBjb3V0PDwgIiAtbyBvdXRwdXRmaWxlLnhtbCBcbiAgICBPdXRwdXQgdGhlIHN0YXRpc3RpY3MgdG8gYSB4bWwgZmlsZSBcblxuIjsKKyAgICBjb3V0PDwgIiAtLWVwcyA8UmVsRXJyPiBTZXRzIHRoZSByZWxhdGl2ZSB0b2xlcmFuY2UgZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzIChkZWZhdWx0IDFlLTA4KSBcblxuIjsKKyAgICBjb3V0PDwgIiAtLW1heGl0cyA8TWF4SXRzPiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIChkZWZhdWx0IDEwMDApIFxuXG4iOworICAgIAorfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJncykKK3sKKyAgCisgIGJvb2wgaGVscCA9ICggZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi1oIikgfHwgZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi0taGVscCIpICk7CisgIGlmKGhlbHApIHsKKyAgICBiZW5jaF9wcmludGhlbHAoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHRlc3QgbWF0cmljZXMKKyAgc3RyaW5nIG1hdHJpeF9kaXI7CisgIGlmICghZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi1kIiwgJm1hdHJpeF9kaXIpKQorICB7CisgICAgaWYoZ2V0ZW52KCJFSUdFTl9NQVRSSVhESVIiKSA9PSBOVUxMKXsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiUGxlYXNlLCBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0cmljZXMgd2l0aCAtZCBtYXRfZm9sZGVyIG9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFSUdFTl9NQVRSSVhESVIgXG4iOworICAgICAgc3RkOjpjZXJyIDw8ICIgUnVuIHdpdGggLS1oZWxwIHRvIHNlZSB0aGUgbGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIFxuIjsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWF0cml4X2RpciA9IGdldGVudigiRUlHRU5fTUFUUklYRElSIik7CisgIH0KKyAgICAgCisgIHN0ZDo6b2ZzdHJlYW0gc3RhdGJ1ZjsKKyAgc3RyaW5nIHN0YXRGaWxlIDsKKyAgCisgIC8vIEdldCB0aGUgZmlsZSB0byB3cml0ZSB0aGUgc3RhdGlzdGljcworICBib29sIHN0YXRGaWxlRXhpc3RzID0gZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi1vIiwgJnN0YXRGaWxlKTsKKyAgaWYoc3RhdEZpbGVFeGlzdHMpCisgIHsKKyAgICBzdGF0YnVmLm9wZW4oc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6Om91dCk7CisgICAgaWYoc3RhdGJ1Zi5nb29kKCkpeworICAgICAgc3RhdEZpbGVFeGlzdHMgPSB0cnVlOyAKKyAgICAgIHByaW50U3RhdGhlYWRlcihzdGF0YnVmKTsKKyAgICAgIHN0YXRidWYuY2xvc2UoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gb3BlbiB0aGUgcHJvdmlkZWQgZmlsZSBmb3Igd3JpdHRpbmcuLi4gXG4iOworICB9ICAgICAgIAorICAKKyAgLy8gR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGFuZCB0aGUgdG9sZXJhbmNlCisgIGludCBtYXhpdGVycyA9IDEwMDA7IAorICBkb3VibGUgdG9sID0gMWUtMDg7IAorICBzdHJpbmcgaW52YWw7IAorICBpZiAoZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi0tZXBzIiwgJmludmFsKSkKKyAgICB0b2wgPSBhdG9mKGludmFsLmNfc3RyKCkpOyAKKyAgaWYoZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi0tbWF4aXRzIiwgJmludmFsKSkKKyAgICBtYXhpdGVycyA9IGF0b2koaW52YWwuY19zdHIoKSk7IAorICAKKyAgc3RyaW5nIGN1cnJlbnRfZGlyOyAKKyAgLy8gVGVzdCB0aGUgcmVhbC1hcml0aG1ldGljcyBtYXRyaWNlcworICBCcm93c2VfTWF0cmljZXM8ZG91YmxlPihtYXRyaXhfZGlyLCBzdGF0RmlsZUV4aXN0cywgc3RhdEZpbGUsbWF4aXRlcnMsIHRvbCk7CisgIAorICAvLyBUZXN0IHRoZSBjb21wbGV4LWFyaXRobWV0aWNzIG1hdHJpY2VzCisgIEJyb3dzZV9NYXRyaWNlczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KG1hdHJpeF9kaXIsIHN0YXRGaWxlRXhpc3RzLCBzdGF0RmlsZSwgbWF4aXRlcnMsIHRvbCk7IAorICAKKyAgaWYoc3RhdEZpbGVFeGlzdHMpCisgIHsKKyAgICBzdGF0YnVmLm9wZW4oc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6OmFwcCk7IAorICAgIHN0YXRidWYgPDwgIjwvQkVOQ0g+IFxuIjsKKyAgICBjb3V0IDw8ICJcbiBPdXRwdXQgd3JpdHRlbiBpbiAiIDw8IHN0YXRGaWxlIDw8ICIgLi4uXG4iOworICAgIHN0YXRidWYuY2xvc2UoKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisgICAgICAKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5oIGIvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNzE5YwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5oCkBAIC0wLDAgKzEsNTU0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlQ29yZT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisjaW5jbHVkZSA8RWlnZW4vSmFjb2JpPgorI2luY2x1ZGUgPEVpZ2VuL0hvdXNlaG9sZGVyPgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vSXRlcmF0aXZlU29sdmVycz4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYT4KKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KKworI2luY2x1ZGUgInNwYmVuY2hzdHlsZS5oIgorCisjaWZkZWYgRUlHRU5fTUVUSVNfU1VQUE9SVAorI2luY2x1ZGUgPEVpZ2VuL01ldGlzU3VwcG9ydD4KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fQ0hPTE1PRF9TVVBQT1JUCisjaW5jbHVkZSA8RWlnZW4vQ2hvbG1vZFN1cHBvcnQ+CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1VNRlBBQ0tfU1VQUE9SVAorI2luY2x1ZGUgPEVpZ2VuL1VtZlBhY2tTdXBwb3J0PgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9QQVJESVNPX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9QYXJkaXNvU3VwcG9ydD4KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisjaW5jbHVkZSA8RWlnZW4vU3VwZXJMVVN1cHBvcnQ+CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCisjaW5jbHVkZSA8RWlnZW4vUGFTdGlYU3VwcG9ydD4KKyNlbmRpZgorCisvLyBDT05TVEFOVFMKKyNkZWZpbmUgRUlHRU5fVU1GUEFDSyAgMTAKKyNkZWZpbmUgRUlHRU5fU1VQRVJMVSAgMjAKKyNkZWZpbmUgRUlHRU5fUEFTVElYICAzMAorI2RlZmluZSBFSUdFTl9QQVJESVNPICA0MAorI2RlZmluZSBFSUdFTl9TUEFSU0VMVV9DT0xBTUQgNTAKKyNkZWZpbmUgRUlHRU5fU1BBUlNFTFVfTUVUSVMgNTEKKyNkZWZpbmUgRUlHRU5fQklDR1NUQUIgIDYwCisjZGVmaW5lIEVJR0VOX0JJQ0dTVEFCX0lMVVQgIDYxCisjZGVmaW5lIEVJR0VOX0dNUkVTIDcwCisjZGVmaW5lIEVJR0VOX0dNUkVTX0lMVVQgNzEKKyNkZWZpbmUgRUlHRU5fU0lNUExJQ0lBTF9MRExUICA4MAorI2RlZmluZSBFSUdFTl9DSE9MTU9EX0xETFQgIDkwCisjZGVmaW5lIEVJR0VOX1BBU1RJWF9MRExUICAxMDAKKyNkZWZpbmUgRUlHRU5fUEFSRElTT19MRExUICAxMTAKKyNkZWZpbmUgRUlHRU5fU0lNUExJQ0lBTF9MTFQgIDEyMAorI2RlZmluZSBFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExUICAxMzAKKyNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9TSU1QTElDSUFMX0xMVCAgMTQwCisjZGVmaW5lIEVJR0VOX1BBU1RJWF9MTFQgIDE1MAorI2RlZmluZSBFSUdFTl9QQVJESVNPX0xMVCAgMTYwCisjZGVmaW5lIEVJR0VOX0NHICAxNzAKKyNkZWZpbmUgRUlHRU5fQ0dfUFJFQ09ORCAgMTgwCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7IAorCisKKy8vIEdsb2JhbCB2YXJpYWJsZXMgZm9yIGlucHV0IHBhcmFtZXRlcnMKK2ludCBNYXhpbXVtSXRlcnM7IC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKK2RvdWJsZSBSZWxFcnI7IC8vIFJlbGF0aXZlIGVycm9yIG9mIHRoZSBjb21wdXRlZCBzb2x1dGlvbgorZG91YmxlIGJlc3RfdGltZV92YWw7IC8vIEN1cnJlbnQgYmVzdCB0aW1lIG92ZXJhbGwgc29sdmVycyAKK2ludCBiZXN0X3RpbWVfaWQ7IC8vICBpZCBvZiB0aGUgYmVzdCBzb2x2ZXIgZm9yIHRoZSBjdXJyZW50IHN5c3RlbSAKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpIHsgcmV0dXJuIDFlLTNmOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAordGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSB7IHJldHVybiAxZS02OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit0ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQordGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCk7IH0KKwordm9pZCBwcmludFN0YXRoZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0KQoreworICAvLyBQcmludCBYTUwgaGVhZGVyCisgIC8vIE5PVEUgSXQgd291bGQgaGF2ZSBiZWVuIG11Y2ggZWFzaWVyIHRvIHdyaXRlIHRoZXNlIFhNTCBkb2N1bWVudHMgdXNpbmcgZXh0ZXJuYWwgbGlicmFyaWVzIGxpa2UgdGlueVhNTCBvciBYZXJjZXMtQysrLgorICAKKyAgb3V0IDw8ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiBcbiI7CisgIG91dCA8PCAiPD94bWwtc3R5bGVzaGVldCB0eXBlPSd0ZXh0L3hzbCcgaHJlZj0nI3N0eWxlc2hlZXQnID8+IFxuIjsgCisgIG91dCA8PCAiPCFET0NUWVBFIEJFTkNIICBbXG48IUFUVExJU1QgeHNsOnN0eWxlc2hlZXRcbiBpZFx0IElEICAjUkVRVUlSRUQ+XG5dPiI7CisgIG91dCA8PCAiXG5cbjwhLS0gR2VuZXJhdGVkIGJ5IHRoZSBFaWdlbiBsaWJyYXJ5IC0tPlxuIjsgCisgIAorICBvdXQgPDwgIlxuPEJFTkNIPiBcbiIgOyAvL3Jvb3QgWE1MIGVsZW1lbnQgCisgIC8vIFByaW50IHRoZSB4c2wgc3R5bGUgc2VjdGlvbgorICBwcmludEJlbmNoU3R5bGUob3V0KTsgCisgIC8vIExpc3QgYWxsIGF2YWlsYWJsZSBzb2x2ZXJzIAorICBvdXQgPDwgIiA8QVZBSUxTT0xWRVI+IFxuIjsKKyNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9VTUZQQUNLIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExVIDwvVFlQRT4gXG4iOworICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBVTUZQQUNLIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorI2VuZGlmCisjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisgIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU1VQRVJMVSA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMVSA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gU1VQRVJMVSA8L1BBQ0tBR0U+IFxuIjsgCisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyNlbmRpZgorI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfU0lNUExJQ0lBTF9MTFQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8VFlQRT4gTExUIFNQPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IENIT0xNT0QgPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyAgCisgIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fQ0hPTE1PRF9TVVBFUk5PREFMX0xMVCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMTFQ8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gQ0hPTE1PRCA8L1BBQ0tBR0U+IFxuIjsKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7CisgIAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfTERMVCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMRExUIDwvVFlQRT4gXG4iOworICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBDSE9MTU9EIDwvUEFDS0FHRT4gXG4iOyAgCisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyNlbmRpZgorI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBUkRJU08gPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8VFlQRT4gTFUgPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBUkRJU08gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBUkRJU09fTExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExMVCA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFSRElTTyA8L1BBQ0tBR0U+IFxuIjsgCisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyAgCisgIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFSRElTT19MRExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExETFQgPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBUkRJU08gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisjZW5kaWYKKyNpZmRlZiBFSUdFTl9QQVNUSVhfU1VQUE9SVAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBU1RJWCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMVSA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFTVElYIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICAKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVNUSVhfTExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExMVCA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFTVElYIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICAKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVNUSVhfTERMVCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMRExUIDwvVFlQRT4gXG4iOworICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBQQVNUSVggPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisjZW5kaWYKKyAgCisgIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fQklDR1NUQUIgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8VFlQRT4gQklDR1NUQUIgPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICAKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9CSUNHU1RBQl9JTFVUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IEJJQ0dTVEFCX0lMVVQgPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICAKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9HTVJFU19JTFVUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IEdNUkVTX0lMVVQgPC9UWVBFPiBcbiI7CisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOyAKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICAKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9TSU1QTElDSUFMX0xETFQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8VFlQRT4gTERMVCA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1NJTVBMSUNJQUxfTExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExMVCA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIAorICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NHIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IENHIDwvVFlQRT4gXG4iOworICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBFSUdFTiA8L1BBQ0tBR0U+IFxuIjsgCisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyAgCisgIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU1BBUlNFTFVfQ09MQU1EIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFRZUEU+IExVX0NPTEFNRCA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIAorI2lmZGVmIEVJR0VOX01FVElTX1NVUFBPUlQKKyAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9TUEFSU0VMVV9NRVRJUyA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxUWVBFPiBMVV9NRVRJUyA8L1RZUEU+IFxuIjsKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAorICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisjZW5kaWYKKyAgb3V0IDw8ICIgPC9BVkFJTFNPTFZFUj4gXG4iOyAKKyAgCit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGNhbGxfc29sdmVyKFNvbHZlciAmc29sdmVyLCBjb25zdCBpbnQgc29sdmVyX2lkLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCxzdGQ6Om9mc3RyZWFtJiBzdGF0YnVmKQoreworICAKKyAgZG91YmxlIHRvdGFsX3RpbWU7CisgIGRvdWJsZSBjb21wdXRlX3RpbWU7CisgIGRvdWJsZSBzb2x2ZV90aW1lOyAKKyAgZG91YmxlIHJlbF9lcnJvcjsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4geDsgCisgIEJlbmNoVGltZXIgdGltZXI7IAorICB0aW1lci5yZXNldCgpOworICB0aW1lci5zdGFydCgpOworICBzb2x2ZXIuY29tcHV0ZShBKTsgCisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlNvbHZlciBmYWlsZWQgLi4uIFxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgdGltZXIuc3RvcCgpOworICBjb21wdXRlX3RpbWUgPSB0aW1lci52YWx1ZSgpOworICBzdGF0YnVmIDw8ICIgICAgPFRJTUU+XG4iOyAKKyAgc3RhdGJ1ZiA8PCAiICAgICA8Q09NUFVURT4gIiA8PCB0aW1lci52YWx1ZSgpIDw8ICI8L0NPTVBVVEU+XG4iOworICBzdGQ6OmNvdXQ8PCAiQ09NUFVURSBUSU1FIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8c3RkOjplbmRsOyAKKyAgICAKKyAgdGltZXIucmVzZXQoKTsKKyAgdGltZXIuc3RhcnQoKTsKKyAgeCA9IHNvbHZlci5zb2x2ZShiKTsgCisgIGlmIChzb2x2ZXIuaW5mbygpID09IE51bWVyaWNhbElzc3VlKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJTb2x2ZXIgZmFpbGVkIC4uLiBcbiI7CisgICAgcmV0dXJuOworICB9CisgIHRpbWVyLnN0b3AoKTsKKyAgc29sdmVfdGltZSA9IHRpbWVyLnZhbHVlKCk7CisgIHN0YXRidWYgPDwgIiAgICAgPFNPTFZFPiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIjwvU09MVkU+XG4iOyAKKyAgc3RkOjpjb3V0PDwgIlNPTFZFIFRJTUUgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDxzdGQ6OmVuZGw7IAorICAKKyAgdG90YWxfdGltZSA9IHNvbHZlX3RpbWUgKyBjb21wdXRlX3RpbWU7CisgIHN0YXRidWYgPDwgIiAgICAgPFRPVEFMPiAiIDw8IHRvdGFsX3RpbWUgPDwgIjwvVE9UQUw+XG4iOyAKKyAgc3RkOjpjb3V0PDwgIlRPVEFMIFRJTUUgOiAiIDw8IHRvdGFsX3RpbWUgPDxzdGQ6OmVuZGw7IAorICBzdGF0YnVmIDw8ICIgICAgPC9USU1FPlxuIjsgCisgIAorICAvLyBWZXJpZnkgdGhlIHJlbGF0aXZlIGVycm9yCisgIGlmKHJlZlguc2l6ZSgpICE9IDApCisgICAgcmVsX2Vycm9yID0gKHJlZlggLSB4KS5ub3JtKCkvcmVmWC5ub3JtKCk7CisgIGVsc2UgCisgIHsKKyAgICAvLyBDb21wdXRlIHRoZSByZWxhdGl2ZSByZXNpZHVhbCBub3JtCisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gdGVtcDsgCisgICAgdGVtcCA9IEEgKiB4OyAKKyAgICByZWxfZXJyb3IgPSAoYi10ZW1wKS5ub3JtKCkvYi5ub3JtKCk7CisgIH0KKyAgc3RhdGJ1ZiA8PCAiICAgIDxFUlJPUj4gIiA8PCByZWxfZXJyb3IgPDwgIjwvRVJST1I+XG4iOyAKKyAgc3RkOjpjb3V0PDwgIlJFTC4gRVJST1IgOiAiIDw8IHJlbF9lcnJvciA8PCAiXG5cbiIgOworICBpZiAoIHJlbF9lcnJvciA8PSBSZWxFcnIgKQorICB7CisgICAgLy8gY2hlY2sgdGhlIGJlc3QgdGltZSBpZiBjb252ZXJnZW5jZQorICAgIGlmKCFiZXN0X3RpbWVfdmFsIHx8IChiZXN0X3RpbWVfdmFsID4gdG90YWxfdGltZSkpCisgICAgeworICAgICAgYmVzdF90aW1lX3ZhbCA9IHRvdGFsX3RpbWU7CisgICAgICBiZXN0X3RpbWVfaWQgPSBzb2x2ZXJfaWQ7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgordm9pZCBjYWxsX2RpcmVjdHNvbHZlcihTb2x2ZXImIHNvbHZlciwgY29uc3QgaW50IHNvbHZlcl9pZCwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgYiwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlgsIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSkKK3sKKyAgICBzdGQ6Om9mc3RyZWFtIHN0YXRidWYoc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6OmFwcCk7CisgICAgc3RhdGJ1ZiA8PCAiICAgPFNPTFZFUl9TVEFUIElEPSciIDw8IHNvbHZlcl9pZCA8PCInPlxuIjsgCisgICAgY2FsbF9zb2x2ZXIoc29sdmVyLCBzb2x2ZXJfaWQsIEEsIGIsIHJlZlgsc3RhdGJ1Zik7CisgICAgc3RhdGJ1ZiA8PCAiICAgPC9TT0xWRVJfU1RBVD5cbiI7CisgICAgc3RhdGJ1Zi5jbG9zZSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2FsbF9pdGVyc29sdmVyKFNvbHZlciAmc29sdmVyLCBjb25zdCBpbnQgc29sdmVyX2lkLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCwgc3RkOjpzdHJpbmcmIHN0YXRGaWxlKQoreworICBzb2x2ZXIuc2V0VG9sZXJhbmNlKFJlbEVycik7IAorICBzb2x2ZXIuc2V0TWF4SXRlcmF0aW9ucyhNYXhpbXVtSXRlcnMpOworICAKKyAgc3RkOjpvZnN0cmVhbSBzdGF0YnVmKHN0YXRGaWxlLmNfc3RyKCksIHN0ZDo6aW9zOjphcHApOworICBzdGF0YnVmIDw8ICIgPFNPTFZFUl9TVEFUIElEPSciIDw8IHNvbHZlcl9pZCA8PCInPlxuIjsgCisgIGNhbGxfc29sdmVyKHNvbHZlciwgc29sdmVyX2lkLCBBLCBiLCByZWZYLHN0YXRidWYpOyAKKyAgc3RhdGJ1ZiA8PCAiICAgPElURVI+ICI8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8ICI8L0lURVI+XG4iOworICBzdGF0YnVmIDw8ICIgPC9TT0xWRVJfU1RBVD5cbiI7CisgIHN0ZDo6Y291dCA8PCAiSVRFUkFUSU9OUyA6ICIgPDwgc29sdmVyLml0ZXJhdGlvbnMoKSA8PCJcblxuXG4iOyAKKyAgCit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgU2VsZWN0U29sdmVycyhjb25zdCBTcGFyc2VNYXRyaXg8U2NhbGFyPiZBLCB1bnNpZ25lZCBpbnQgc3ltLCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgYiwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlgsIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSkKK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4gU3BNYXQ7IAorICAvLyBGaXJzdCwgZGVhbCB3aXRoIE5vbnN5bW1ldHJpYyBhbmQgc3ltbWV0cmljIG1hdHJpY2VzCisgIGJlc3RfdGltZV9pZCA9IDA7IAorICBiZXN0X3RpbWVfdmFsID0gMC4wOworICAvL1VNRlBBQ0sKKyAgI2lmZGVmIEVJR0VOX1VNRlBBQ0tfU1VQUE9SVAorICB7CisgICAgY291dCA8PCAiU29sdmluZyB3aXRoIFVNRlBBQ0sgTFUgLi4uIFxuIjsgCisgICAgVW1mUGFja0xVPFNwTWF0PiBzb2x2ZXI7IAorICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fVU1GUEFDSywgQSwgYiwgcmVmWCxzdGF0RmlsZSk7IAorICB9CisgICNlbmRpZgorICAgIC8vU3VwZXJMVQorICAjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisgIHsKKyAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTVVBFUkxVIC4uLiBcbiI7IAorICAgIFN1cGVyTFU8U3BNYXQ+IHNvbHZlcjsKKyAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NVUEVSTFUsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgfQorICAjZW5kaWYKKyAgICAKKyAgIC8vIFBhU3RpeCBMVQorICAjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKKyAgeworICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBU1RJWCBMVSAuLi4gXG4iOyAKKyAgICBQYXN0aXhMVTxTcE1hdD4gc29sdmVyOyAKKyAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1BBU1RJWCwgQSwgYiwgcmVmWCxzdGF0RmlsZSkgOworICB9CisgICNlbmRpZgorCisgICAvL1BBUkRJU08gTFUKKyAgI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFSRElTTyBMVSAuLi4gXG4iOyAKKyAgICBQYXJkaXNvTFU8U3BNYXQ+ICBzb2x2ZXI7IAorICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fUEFSRElTTywgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgIH0KKyAgI2VuZGlmCisgIAorICAvLyBFaWdlbiBTcGFyc2VMVSBNRVRJUworICBjb3V0IDw8ICJcbiBTb2x2aW5nIHdpdGggU3BhcnNlIExVIEFORCBDT0xBTUQgLi4uIFxuIjsKKyAgU3BhcnNlTFU8U3BNYXQsIENPTEFNRE9yZGVyaW5nPGludD4gPiAgIHNvbHZlcjsKKyAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9TUEFSU0VMVV9DT0xBTUQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsgCisgIC8vIEVpZ2VuIFNwYXJzZUxVIE1FVElTCisgICNpZmRlZiBFSUdFTl9NRVRJU19TVVBQT1JUCisgIHsKKyAgICBjb3V0IDw8ICJcbiBTb2x2aW5nIHdpdGggU3BhcnNlIExVIEFORCBNRVRJUyAuLi4gXG4iOworICAgIFNwYXJzZUxVPFNwTWF0LCBNZXRpc09yZGVyaW5nPGludD4gPiAgIHNvbHZlcjsKKyAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NQQVJTRUxVX01FVElTLCBBLCBiLCByZWZYLCBzdGF0RmlsZSk7IAorICB9CisgICNlbmRpZgorICAKKyAgLy9CaUNHU1RBQgorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQmlDR1NUQUIgLi4uIFxuIjsgCisgICAgQmlDR1NUQUI8U3BNYXQ+IHNvbHZlcjsgCisgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fQklDR1NUQUIsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOworICB9CisgIC8vQmlDR1NUQUIrSUxVVAorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQmlDR1NUQUIgYW5kIElMVVQgLi4uIFxuIjsgCisgICAgQmlDR1NUQUI8U3BNYXQsIEluY29tcGxldGVMVVQ8U2NhbGFyPiA+IHNvbHZlcjsgCisgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fQklDR1NUQUJfSUxVVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7IAorICB9CisgIAorICAgCisgIC8vR01SRVMKKy8vICAgeworLy8gICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIEdNUkVTIC4uLiBcbiI7IAorLy8gICAgIEdNUkVTPFNwTWF0PiBzb2x2ZXI7IAorLy8gICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsIEVJR0VOX0dNUkVTLCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisvLyAgIH0KKyAgLy9HTVJFUytJTFVUCisgIHsKKyAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBHTVJFUyBhbmQgSUxVVCAuLi4gXG4iOyAKKyAgICBHTVJFUzxTcE1hdCwgSW5jb21wbGV0ZUxVVDxTY2FsYXI+ID4gc29sdmVyOyAKKyAgICBjYWxsX2l0ZXJzb2x2ZXIoc29sdmVyLCBFSUdFTl9HTVJFU19JTFVULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsKKyAgfQorICAKKyAgLy8gSGVybWl0aWFuIGFuZCBub3QgbmVjZXNzYXJpbHkgcG9zaXRpdmUtZGVmaW5pdGVzCisgIGlmIChzeW0gIT0gTm9uU3ltbWV0cmljKQorICB7CisgICAgLy8gSW50ZXJuYWwgQ2hvbGVza3kKKyAgICB7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTaW1wbGljaWFsIExETFQgLi4uIFxuIjsgCisgICAgICBTaW1wbGljaWFsTERMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsKKyAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fU0lNUExJQ0lBTF9MRExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisgICAgfQorICAgIAorICAgIC8vIENIT0xNT0QKKyAgICAjaWZkZWYgRUlHRU5fQ0hPTE1PRF9TVVBQT1JUCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0hPTE1PRCBMRExUIC4uLiBcbiI7IAorICAgICAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BNYXQsIExvd2VyPiBzb2x2ZXI7CisgICAgICBzb2x2ZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7CisgICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX0NIT0xNT0RfTERMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8vUEFTVElYIExMVAorICAgICNpZmRlZiBFSUdFTl9QQVNUSVhfU1VQUE9SVAorICAgIHsKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBU1RJWCBMRExUIC4uLiBcbiI7IAorICAgICAgUGFzdGl4TERMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fUEFTVElYX0xETFQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgLy9QQVJESVNPIExMVAorICAgICNpZmRlZiBFSUdFTl9QQVJESVNPX1NVUFBPUlQKKyAgICB7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVJESVNPIExETFQgLi4uIFxuIjsgCisgICAgICBQYXJkaXNvTERMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fUEFSRElTT19MRExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisgICAgfQorICAgICNlbmRpZgorICB9CisKKyAgIC8vIE5vdywgc3ltbWV0cmljIFBPU0lUSVZFIERFRklOSVRFIG1hdHJpY2VzCisgIGlmIChzeW0gPT0gU1BEKQorICB7CisgICAgCisgICAgLy9JbnRlcm5hbCBTcGFyc2UgQ2hvbGVza3kKKyAgICB7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTSU1QTElDSUFMIExMVCAuLi4gXG4iOyAKKyAgICAgIFNpbXBsaWNpYWxMTFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7IAorICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX1NJTVBMSUNJQUxfTExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisgICAgfQorICAgIAorICAgIC8vIENIT0xNT0QKKyAgICAjaWZkZWYgRUlHRU5fQ0hPTE1PRF9TVVBQT1JUCisgICAgeworICAgICAgLy8gQ2hvbE1PRCBTdXBlck5vZGFsIExMVAorICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0hPTE1PRCBMTFQgKFN1cGVybm9kYWwpLi4uIFxuIjsgCisgICAgICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcE1hdCwgTG93ZXI+IHNvbHZlcjsKKyAgICAgIHNvbHZlci5zZXRNb2RlKENob2xtb2RTdXBlcm5vZGFsTEx0KTsKKyAgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fQ0hPTE1PRF9TVVBFUk5PREFMX0xMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgICAvLyBDaG9sTW9kIFNpbXBsaWNpYWwgTExUCisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDSE9MTU9EIExMVCAoU2ltcGxpY2lhbCkgLi4uIFxuIjsgCisgICAgICBzb2x2ZXIuc2V0TW9kZShDaG9sbW9kU2ltcGxpY2lhbExMdCk7CisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fQ0hPTE1PRF9TSU1QTElDSUFMX0xMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8vUEFTVElYIExMVAorICAgICNpZmRlZiBFSUdFTl9QQVNUSVhfU1VQUE9SVAorICAgIHsKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBU1RJWCBMTFQgLi4uIFxuIjsgCisgICAgICBQYXN0aXhMTFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7IAorICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX1BBU1RJWF9MTFQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAKKyAgICAvL1BBUkRJU08gTExUCisgICAgI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAorICAgIHsKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTExUIC4uLiBcbiI7IAorICAgICAgUGFyZGlzb0xMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fUEFSRElTT19MTFQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgLy8gSW50ZXJuYWwgQ0cKKyAgICB7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDRyAuLi4gXG4iOyAKKyAgICAgIENvbmp1Z2F0ZUdyYWRpZW50PFNwTWF0LCBMb3dlcj4gc29sdmVyOyAKKyAgICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsRUlHRU5fQ0csIEEsIGIsIHJlZlgsc3RhdEZpbGUpOworICAgIH0KKyAgICAvL0NHK0lkZW50aXR5UHJlY29uZGl0aW9uZXIKKy8vICAgICB7CisvLyAgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDRyBhbmQgSWRlbnRpdHlQcmVjb25kaXRpb25lciAuLi4gXG4iOyAKKy8vICAgICAgIENvbmp1Z2F0ZUdyYWRpZW50PFNwTWF0LCBMb3dlciwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gc29sdmVyOyAKKy8vICAgICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsRUlHRU5fQ0dfUFJFQ09ORCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisvLyAgICAgfQorICB9IC8vIEVuZCBTUEQgbWF0cmljZXMgCit9CisKKy8qIEJyb3dzZSBhbGwgdGhlIG1hdHJpY2VzIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciAKKyAqIGFuZCBzb2x2ZSB0aGUgYXNzb2NpYXRlZCBsaW5lYXIgc3lzdGVtLgorICogVGhlIHJlc3VsdHMgb2YgZWFjaCBzb2x2ZSBhcmUgcHJpbnRlZCBpbiB0aGUgc3RhbmRhcmQgb3V0cHV0CisgKiBhbmQgb3B0aW9uYWxseSBpbiB0aGUgcHJvdmlkZWQgaHRtbCBmaWxlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIEJyb3dzZV9NYXRyaWNlcyhjb25zdCBzdHJpbmcgZm9sZGVyLCBib29sIHN0YXRGaWxlRXhpc3RzLCBzdGQ6OnN0cmluZyYgc3RhdEZpbGUsIGludCBtYXhpdGVycywgZG91YmxlIHRvbCkKK3sKKyAgTWF4aW11bUl0ZXJzID0gbWF4aXRlcnM7IC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIGdsb2JhbCB2YXJpYWJsZSAKKyAgUmVsRXJyID0gdG9sOyAgLy9SZWxhdGl2ZSByZXNpZHVhbCBlcnJvciAgYXMgc3RvcHBpbmcgY3JpdGVyaW9uIGZvciBpdGVyYXRpdmUgc29sdmVycworICBNYXRyaXhNYXJrZXRJdGVyYXRvcjxTY2FsYXI+IGl0KGZvbGRlcik7CisgIGZvciAoIDsgaXQ7ICsraXQpCisgIHsKKyAgICAvL3ByaW50IHRoZSBpbmZvcyBmb3IgdGhpcyBsaW5lYXIgc3lzdGVtIAorICAgIGlmKHN0YXRGaWxlRXhpc3RzKQorICAgIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gc3RhdGJ1ZihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6YXBwKTsKKyAgICAgIHN0YXRidWYgPDwgIjxMSU5FQVJTWVNURU0+IFxuIjsKKyAgICAgIHN0YXRidWYgPDwgIiAgIDxNQVRSSVg+IFxuIjsKKyAgICAgIHN0YXRidWYgPDwgIiAgICAgPE5BTUU+ICIgPDwgaXQubWF0bmFtZSgpIDw8ICIgPC9OQU1FPlxuIjsgCisgICAgICBzdGF0YnVmIDw8ICIgICAgIDxTSVpFPiAiIDw8IGl0Lm1hdHJpeCgpLnJvd3MoKSA8PCAiIDwvU0laRT5cbiI7IAorICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8RU5UUklFUz4gIiA8PCBpdC5tYXRyaXgoKS5ub25aZXJvcygpIDw8ICI8L0VOVFJJRVM+XG4iOworICAgICAgaWYgKGl0LnN5bSgpIT1Ob25TeW1tZXRyaWMpCisgICAgICB7CisgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFNZTU1FVFJZPiBTeW1tZXRyaWMgPC9TWU1NRVRSWT5cbiIgOyAKKyAgICAgICAgaWYgKGl0LnN5bSgpID09IFNQRCkgCisgICAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8UE9TREVGPiBZRVMgPC9QT1NERUY+XG4iOyAKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICBzdGF0YnVmIDw8ICIgICAgIDxQT1NERUY+IE5PIDwvUE9TREVGPlxuIjsgCisgICAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFNZTU1FVFJZPiBOb25TeW1tZXRyaWMgPC9TWU1NRVRSWT5cbiIgOyAKKyAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8UE9TREVGPiBOTyA8L1BPU0RFRj5cbiI7IAorICAgICAgfQorICAgICAgc3RhdGJ1ZiA8PCAiICAgPC9NQVRSSVg+IFxuIjsKKyAgICAgIHN0YXRidWYuY2xvc2UoKTsKKyAgICB9CisgICAgCisgICAgY291dDw8ICJcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gXG4iOworICAgIGNvdXQ8PCAiID09PT09PSAgU09MVklORyBXSVRIIE1BVFJJWCAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiID09PT1cbiI7CisgICAgY291dDw8ICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFxuXG4iOworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IHJlZlg7CisgICAgaWYoaXQuaGFzcmVmWCgpKSByZWZYID0gaXQucmVmWCgpOworICAgIC8vIENhbGwgYWxsIHN1aXRhYmxlIHNvbHZlcnMgZm9yIHRoaXMgbGluZWFyIHN5c3RlbSAKKyAgICBTZWxlY3RTb2x2ZXJzPFNjYWxhcj4oaXQubWF0cml4KCksIGl0LnN5bSgpLCBpdC5yaHMoKSwgcmVmWCwgc3RhdEZpbGUpOworICAgIAorICAgIGlmKHN0YXRGaWxlRXhpc3RzKQorICAgIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gc3RhdGJ1ZihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6YXBwKTsKKyAgICAgIHN0YXRidWYgPDwgIiAgPEJFU1RfU09MVkVSIElEPSciPDwgYmVzdF90aW1lX2lkCisgICAgICAgICAgICAgIDw8ICInPjwvQkVTVF9TT0xWRVI+XG4iOyAKKyAgICAgIHN0YXRidWYgPDwgIiA8L0xJTkVBUlNZU1RFTT4gXG4iOyAKKyAgICAgIHN0YXRidWYuY2xvc2UoKTsKKyAgICB9CisgIH0gCit9IAorCitib29sIGdldF9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJncywgc3RyaW5nIG9wdGlvbiwgc3RyaW5nKiB2YWx1ZT0wKQoreworICBpbnQgaWR4ID0gMSwgZm91bmQ9ZmFsc2U7IAorICB3aGlsZSAoaWR4PGFyZ2MgJiYgIWZvdW5kKXsKKyAgICBpZiAob3B0aW9uLmNvbXBhcmUoYXJnc1tpZHhdKSA9PSAwKXsKKyAgICAgIGZvdW5kID0gdHJ1ZTsgCisgICAgICBpZih2YWx1ZSkgKnZhbHVlID0gYXJnc1tpZHgrMV07CisgICAgfQorICAgIGlkeCs9MjsKKyAgfQorICByZXR1cm4gZm91bmQ7IAorfQpkaWZmIC0tZ2l0IGEvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc3R5bGUuaCBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHN0eWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhOTgxNwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHN0eWxlLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIFNQQkVOQ0hTVFlMRV9ICisjZGVmaW5lIFNQQkVOQ0hTVFlMRV9ICisKK3ZvaWQgcHJpbnRCZW5jaFN0eWxlKHN0ZDo6b2ZzdHJlYW0mIG91dCkKK3sKKyAgb3V0IDw8ICI8eHNsOnN0eWxlc2hlZXQgaWQ9J3N0eWxlc2hlZXQnIHZlcnNpb249JzEuMCcgXAorICAgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nID5cbiBcCisgICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSd4c2w6c3R5bGVzaGVldCcgLz5cbiBcCisgICAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPScvJz4gPCEtLSBSb290IG9mIHRoZSBkb2N1bWVudCAtLT5cbiBcCisgICAgICA8aHRtbD5cbiBcCisgICAgICAgIDxoZWFkPiBcbiBcCisgICAgICAgICAgPHN0eWxlIHR5cGU9J3RleHQvY3NzJz4gXG4gXAorICAgICAgICAgICAgdGQgeyB3aGl0ZS1zcGFjZTogbm93cmFwO31cbiBcCisgICAgICAgICAgPC9zdHlsZT5cbiBcCisgICAgICAgIDwvaGVhZD5cbiBcCisgICAgICAgIDxib2R5PiI7CisgIG91dDw8Ijx0YWJsZSBib3JkZXI9JzEnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzEwMCUnPlxuIFwKKyAgICAgICAgPFRSPiA8IS0tIFdyaXRlIHRoZSB0YWJsZSBoZWFkZXIgLS0+XG4gXAorICAgICAgICA8VEg+TWF0cml4PC9USD4gPFRIPk48L1RIPiA8VEg+IE5OWjwvVEg+ICA8VEg+IFN5bTwvVEg+ICA8VEg+IFNQRDwvVEg+IDxUSD4gPC9USD5cbiBcCisgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J0JFTkNIL0FWQUlMU09MVkVSL1NPTFZFUic+XG4gXAorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0nQElEJyBkYXRhLXR5cGU9J251bWJlcicvPlxuIFwKKyAgICAgICAgICAgIDxUSD5cbiBcCisgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdUWVBFJyAvPlxuIFwKKyAgICAgICAgICAgICAgPHhzbDp0ZXh0PjwveHNsOnRleHQ+XG4gXAorICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nUEFDS0FHRScgLz5cbiBcCisgICAgICAgICAgICAgIDx4c2w6dGV4dD48L3hzbDp0ZXh0PlxuIFwKKyAgICAgICAgICAgIDwvVEg+XG4gXAorICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgICAgPC9UUj4iOworICAgICAgICAKKyAgb3V0PDwiICA8eHNsOmZvci1lYWNoIHNlbGVjdD0nQkVOQ0gvTElORUFSU1lTVEVNJz5cbiBcCisgICAgICAgICAgPFRSPiA8IS0tIHByaW50IHN0YXRpc3RpY3MgZm9yIG9uZSBsaW5lYXIgc3lzdGVtLS0+XG4gXAorICAgICAgICAgICAgPFRIIHJvd3NwYW49JzQnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nTUFUUklYL05BTUUnIC8+IDwvVEg+XG4gXAorICAgICAgICAgICAgPFREIHJvd3NwYW49JzQnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nTUFUUklYL1NJWkUnIC8+IDwvVEQ+XG4gXAorICAgICAgICAgICAgPFREIHJvd3NwYW49JzQnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nTUFUUklYL0VOVFJJRVMnIC8+IDwvVEQ+XG4gXAorICAgICAgICAgICAgPFREIHJvd3NwYW49JzQnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nTUFUUklYL1NZTU1FVFJZJyAvPiA8L1REPlxuIFwKKyAgICAgICAgICAgIDxURCByb3dzcGFuPSc0Jz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J01BVFJJWC9QT1NERUYnIC8+IDwvVEQ+XG4gXAorICAgICAgICAgICAgPFRIPiBDb21wdXRlIFRpbWUgPC9USD5cbiBcCisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0nU09MVkVSX1NUQVQnPlxuIFwKKyAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0nQElEJyBkYXRhLXR5cGU9J251bWJlcicvPlxuIFwKKyAgICAgICAgICAgICAgPFREPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nVElNRS9DT01QVVRFJyAvPiA8L1REPlxuIFwKKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgICAgICA8L1RSPiI7CisgIG91dDw8IiAgPFRSPlxuIFwKKyAgICAgICAgICAgIDxUSD4gU29sdmUgVGltZSA8L1RIPlxuIFwKKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSdTT0xWRVJfU1RBVCc+XG4gXAorICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSdASUQnIGRhdGEtdHlwZT0nbnVtYmVyJy8+XG4gXAorICAgICAgICAgICAgICA8VEQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdUSU1FL1NPTFZFJyAvPiA8L1REPlxuIFwKKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgICAgICA8L1RSPlxuIFwKKyAgICAgICAgICA8VFI+XG4gXAorICAgICAgICAgICAgPFRIPiBUb3RhbCBUaW1lIDwvVEg+XG4gXAorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J1NPTFZFUl9TVEFUJz5cbiBcCisgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9J0BJRCcgZGF0YS10eXBlPSdudW1iZXInLz5cbiBcCisgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPlxuIFwKKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0nQElEPS4uL0JFU1RfU09MVkVSL0BJRCc+XG4gXAorICAgICAgICAgICAgICAgICAgPFREIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOnJlZCc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdUSU1FL1RPVEFMJyAvPiAgPC9URD5cbiBcCisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj5cbiBcCisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+XG4gXAorICAgICAgICAgICAgICAgICAgPFREPiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J1RJTUUvVE9UQUwnIC8+PC9URD5cbiBcCisgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPlxuIFwKKyAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPlxuIFwKKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgICAgICA8L1RSPiI7CisgIG91dDw8IiAgPFRSPlxuIFwKKyAgICAgICAgICAgICAgPFRIPiBFcnJvciA8L1RIPlxuIFwKKyAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J1NPTFZFUl9TVEFUJz5cbiBcCisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0nQElEJyBkYXRhLXR5cGU9J251bWJlcicvPlxuIFwKKyAgICAgICAgICAgICAgICA8VEQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdFUlJPUicgLz5cbiBcCisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSdJVEVSJz5cbiBcCisgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KDwveHNsOnRleHQ+XG4gXAorICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0lURVInIC8+XG4gXAorICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pik8L3hzbDp0ZXh0PlxuIFwKKyAgICAgICAgICAgICAgICA8L3hzbDppZj4gPC9URD5cbiBcCisgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgICAgICAgIDwvVFI+XG4gXAorICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKKyAgICAgIDwvdGFibGU+XG4gXAorICAgIDwvYm9keT5cbiBcCisgICAgPC9odG1sPlxuIFwKKyAgPC94c2w6dGVtcGxhdGU+XG4gXAorICA8L3hzbDpzdHlsZXNoZWV0PlxuXG4iOworICAKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL3Rlc3Rfc3BhcnNlTFUuY3BwIGIvYmVuY2gvc3BiZW5jaC90ZXN0X3NwYXJzZUxVLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGVjYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BiZW5jaC90ZXN0X3NwYXJzZUxVLmNwcApAQCAtMCwwICsxLDkzIEBACisvLyBTbWFsbCBiZW5jaCByb3V0aW5lIGZvciBFaWdlbiBhdmFpbGFibGUgaW4gRWlnZW4KKy8vIChDKSBEZXNpcmUgTlVFTlRTQSBXQUtBTSwgSU5SSUEKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYT4KKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisjaWZkZWYgRUlHRU5fTUVUSVNfU1VQUE9SVAorI2luY2x1ZGUgPEVpZ2VuL01ldGlzU3VwcG9ydD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3MpCit7CisvLyAgIHR5cGVkZWYgY29tcGxleDxkb3VibGU+IHNjYWxhcjsgCisgIHR5cGVkZWYgZG91YmxlIHNjYWxhcjsgCisgIFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiBBOyAKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj46OkluZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeDxzY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxzY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlUmhzOworICBNYXRyaXg8c2NhbGFyLCBEeW5hbWljLCAxPiBiLCB4LCB0bXA7CisvLyAgIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiwgQU1ET3JkZXJpbmc8aW50PiA+ICAgc29sdmVyOworLy8gI2lmZGVmIEVJR0VOX01FVElTX1NVUFBPUlQKKy8vICAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PHNjYWxhciwgQ29sTWFqb3I+LCBNZXRpc09yZGVyaW5nPGludD4gPiBzb2x2ZXI7IAorLy8gICBzdGQ6OmNvdXQ8PCAiT1JERVJJTkcgOiBNRVRJU1xuIjsgCisvLyAjZWxzZQorICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj4sIENPTEFNRE9yZGVyaW5nPGludD4gPiAgc29sdmVyOworICBzdGQ6OmNvdXQ8PCAiT1JERVJJTkcgOiBDT0xBTURcbiI7IAorLy8gI2VuZGlmCisgIAorICBpZnN0cmVhbSBtYXRyaXhfZmlsZTsgCisgIHN0cmluZyBsaW5lOworICBpbnQgIG47CisgIEJlbmNoVGltZXIgdGltZXI7IAorICAKKyAgLy8gU2V0IHBhcmFtZXRlcnMKKyAgLyogRmlsbCB0aGUgbWF0cml4IHdpdGggc3BhcnNlIG1hdHJpeCBzdG9yZWQgaW4gTWF0cml4LU1hcmtldCBjb29yZGluYXRlIGNvbHVtbi1vcmllbnRlZCBmb3JtYXQgKi8KKyAgaWYgKGFyZ2MgPCAyKSBhc3NlcnQoZmFsc2UgJiYgInBsZWFzZSwgZ2l2ZSB0aGUgbWF0cml4IG1hcmtldCBmaWxlICIpOworICBsb2FkTWFya2V0KEEsIGFyZ3NbMV0pOworICBjb3V0IDw8ICJFbmQgY2hhcmdpbmcgbWF0cml4ICIgPDwgZW5kbDsKKyAgYm9vbCBpc2NvbXBsZXg9ZmFsc2UsIGlzdmVjdG9yPWZhbHNlOworICBpbnQgc3ltOworICBnZXRNYXJrZXRIZWFkZXIoYXJnc1sxXSwgc3ltLCBpc2NvbXBsZXgsIGlzdmVjdG9yKTsKKy8vICAgaWYgKGlzY29tcGxleCkgeyBjb3V0PDwgIiBOb3QgZm9yIGNvbXBsZXggbWF0cmljZXMgXG4iOyByZXR1cm4gLTE7IH0KKyAgaWYgKGlzdmVjdG9yKSB7IGNvdXQgPDwgIlRoZSBwcm92aWRlZCBmaWxlIGlzIG5vdCBhIG1hdHJpeCBmaWxlXG4iOyByZXR1cm4gLTE7fQorICBpZiAoc3ltICE9IDApIHsgLy8gc3ltbWV0cmljIG1hdHJpY2VzLCBvbmx5IHRoZSBsb3dlciBwYXJ0IGlzIHN0b3JlZAorICAgIFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiB0ZW1wOyAKKyAgICB0ZW1wID0gQTsKKyAgICBBID0gdGVtcC5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgIH0KKyAgbiA9IEEuY29scygpOworICAvKiBGaWxsIHRoZSByaWdodCBoYW5kIHNpZGUgKi8KKworICBpZiAoYXJnYyA+IDIpCisgICAgbG9hZE1hcmtldFZlY3RvcihiLCBhcmdzWzJdKTsKKyAgZWxzZSAKKyAgeworICAgIGIucmVzaXplKG4pOworICAgIHRtcC5yZXNpemUobik7CisvLyAgICAgICB0bXAuc2V0UmFuZG9tKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHRtcChpKSA9IGk7IAorICAgIGIgPSBBICogdG1wIDsKKyAgfQorCisgIC8qIENvbXB1dGUgdGhlIGZhY3Rvcml6YXRpb24gKi8KKy8vICAgc29sdmVyLmlzU3ltbWV0cmljKHRydWUpOworICB0aW1lci5zdGFydCgpOyAKKy8vICAgc29sdmVyLmNvbXB1dGUoQSk7CisgIHNvbHZlci5hbmFseXplUGF0dGVybihBKTsgCisgIHRpbWVyLnN0b3AoKTsgCisgIGNvdXQgPDwgIlRpbWUgdG8gYW5hbHl6ZSAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgc3RkOjplbmRsOworICB0aW1lci5yZXNldCgpOyAKKyAgdGltZXIuc3RhcnQoKTsgCisgIHNvbHZlci5mYWN0b3JpemUoQSk7IAorICB0aW1lci5zdG9wKCk7IAorICBjb3V0IDw8ICJGYWN0b3JpemUgVGltZSAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgc3RkOjplbmRsOworICB0aW1lci5yZXNldCgpOyAKKyAgdGltZXIuc3RhcnQoKTsgCisgIHggPSBzb2x2ZXIuc29sdmUoYik7CisgIHRpbWVyLnN0b3AoKTsKKyAgY291dCA8PCAic29sdmUgdGltZSAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgc3RkOjplbmRsOyAKKyAgLyogQ2hlY2sgdGhlIGFjY3VyYWN5ICovCisgIE1hdHJpeDxzY2FsYXIsIER5bmFtaWMsIDE+IHRtcDIgPSBiIC0gQSp4OworICBzY2FsYXIgdGVtcE5vcm0gPSB0bXAyLm5vcm0oKS9iLm5vcm0oKTsKKyAgY291dCA8PCAiUmVsYXRpdmUgbm9ybSBvZiB0aGUgY29tcHV0ZWQgc29sdXRpb24gOiAiIDw8IHRlbXBOb3JtIDw8IlxuIjsKKyAgY291dCA8PCAiTnVtYmVyIG9mIG5vbnplcm9zIGluIHRoZSBmYWN0b3IgOiAiIDw8IHNvbHZlci5ubnpMKCkgKyBzb2x2ZXIubm56VSgpIDw8IHN0ZDo6ZW5kbDsgCisgIAorICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iZW5jaC9zcG12LmNwcCBiL2JlbmNoL3NwbXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWJhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcG12LmNwcApAQCAtMCwwICsxLDIzMyBAQAorCisvL2crKy00LjQgLUROT01UTCAgLVdsLC1ycGF0aCAvdXNyL2xvY2FsL2xpYi9vc2tpIC1MIC91c3IvbG9jYWwvbGliL29za2kvIC1sIG9za2kgLWwgb3NraV91dGlsIC1sIG9za2lfdXRpbF9UaWQgIC1ET1NLSSAtSSB+L0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvICBzcG12LmNwcCAgLUkgLi4gLU8yIC1ETkRFQlVHIC1scnQgIC1sbSAtbCBvc2tpX21hdF9DU0NfVGlkICAtbG9za2lsdCAmJiAuL2Eub3V0IHIyMDAwMDAgYzIwMDAwMCBuMTAwIHQxIHAxCisKKyNkZWZpbmUgU0NBTEFSIGRvdWJsZQorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2RlZmluZSBTUE1WX0JFTkNIKENPREUpIEJFTkNIKHQsdHJpZXMscmVwZWF0cyxDT0RFKTsKKworLy8gI2lmZGVmIE1LTAorLy8KKy8vICNpbmNsdWRlICJta2xfdHlwZXMuaCIKKy8vICNpbmNsdWRlICJta2xfc3BibGFzLmgiCisvLworLy8gdGVtcGxhdGU8dHlwZW5hbWUgTGhzLHR5cGVuYW1lIFJocyx0eXBlbmFtZSBSZXM+CisvLyB2b2lkIG1rbF9tdWx0aXBseShjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlcyYgcmVzKQorLy8geworLy8gICBjaGFyIG4gPSAnTic7CisvLyAgIGZsb2F0IGFscGhhID0gMTsKKy8vICAgY2hhciBtYXRkZXNjcmFbNl07CisvLyAgIG1hdGRlc2NyYVswXSA9ICdHJzsKKy8vICAgbWF0ZGVzY3JhWzFdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzJdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzNdID0gJ0MnOworLy8gICBta2xfc2NzY21tKCZuLCBsaHMucm93cygpLCByaHMuY29scygpLCBsaHMuY29scygpLCAmYWxwaGEsIG1hdGRlc2NyYSwKKy8vICAgICAgICAgICAgICBsaHMuX3ZhbHVlUHRyKCksIGxocy5faW5uZXJJbmRleFB0cigpLCBsaHMub3V0ZXJJbmRleFB0cigpLAorLy8gICAgICAgICAgICAgIHBudHJlLCBiLCAmbGRiLCAmYmV0YSwgYywgJmxkYyk7CisvLyAvLyAgIG1rbF9zb21hdGNvcHkoJ0MnLCAnVCcsIGxocy5yb3dzKCksIGxocy5jb2xzKCksIDEsCisvLyAvLyAgICAgICAgICAgICAgICAgbGhzLl92YWx1ZVB0cigpLCBsaHMucm93cygpLCBEU1QsIGRzdF9zdHJpZGUpOworLy8gfQorLy8KKy8vICNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgc2l6ZSA9IDEwMDAwOworICBpbnQgcm93cyA9IHNpemU7CisgIGludCBjb2xzID0gc2l6ZTsKKyAgaW50IG5uelBlckNvbCA9IDQwOworICBpbnQgdHJpZXMgPSAyOworICBpbnQgcmVwZWF0cyA9IDI7CisKKyAgYm9vbCBuZWVkX2hlbHAgPSBmYWxzZTsKKyAgZm9yKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgeworICAgIGlmKGFyZ3ZbaV1bMF0gPT0gJ3InKQorICAgIHsKKyAgICAgIHJvd3MgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAnYycpCisgICAgeworICAgICAgY29scyA9IGF0b2koYXJndltpXSsxKTsKKyAgICB9CisgICAgZWxzZSBpZihhcmd2W2ldWzBdID09ICduJykKKyAgICB7CisgICAgICBubnpQZXJDb2wgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAndCcpCisgICAgeworICAgICAgdHJpZXMgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAncCcpCisgICAgeworICAgICAgcmVwZWF0cyA9IGF0b2koYXJndltpXSsxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG5lZWRfaGVscCA9IHRydWU7CisgICAgfQorICB9CisgIGlmKG5lZWRfaGVscCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCBhcmd2WzBdIDw8ICIgcjxuYiByb3dzPiBjPG5iIGNvbHVtbnM+IG48bm9uIHplcm9zIHBlciBjb2x1bW4+IHQ8bmIgdHJpZXM+IHA8bmIgcmVwZWF0cz5cbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdGQ6OmNvdXQgPDwgIlNwTVYgIiA8PCByb3dzIDw8ICIgeCAiIDw8IGNvbHMgPDwgIiB3aXRoICIgPDwgbm56UGVyQ29sIDw8ICIgbm9uIHplcm9zIHBlciBjb2x1bW4uICgiIDw8IHJlcGVhdHMgPDwgIiByZXBlYXRzLCBhbmQgIiA8PCB0cmllcyA8PCAiIHRyaWVzKVxuXG4iOworCisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtKHJvd3MsY29scyk7CisgIERlbnNlVmVjdG9yIGR2KGNvbHMpLCByZXMocm93cyk7CisgIGR2LnNldFJhbmRvbSgpOworCisgIEJlbmNoVGltZXIgdDsKKyAgd2hpbGUgKG5uelBlckNvbD49NCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAibm56OiAiIDw8IG5uelBlckNvbCA8PCAiXG4iOworICAgIHNtLnNldFplcm8oKTsKKyAgICBmaWxsTWF0cml4MihubnpQZXJDb2wsIHJvd3MsIGNvbHMsIHNtKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgeworICAgICAgRGVuc2VNYXRyaXggZG0ocm93cyxjb2xzKSwgKHJvd3MsY29scyk7CisgICAgICBlaVRvRGVuc2Uoc20sIGRtKTsKKworICAgICAgU1BNVl9CRU5DSChyZXMgPSBkbSAqIHNtKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRGVuc2UgICAgICAgIiA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCAiXHQiOworCisgICAgICBTUE1WX0JFTkNIKHJlcyA9IGRtLnRyYW5zcG9zZSgpICogc20pOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCisgICAgeworICAgICAgU1BNVl9CRU5DSChyZXMubm9hbGlhcygpICs9IHNtICogZHY7ICkKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gICAgICAgIiA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCAiXHQiOworCisgICAgICBTUE1WX0JFTkNIKHJlcy5ub2FsaWFzKCkgKz0gc20udHJhbnNwb3NlKCkgKiBkdjsgKQorICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ1NwYXJzZQorICAgICNpZmRlZiBDU1BBUlNFCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJDU3BhcnNlIFxuIjsKKyAgICAgIGNzICpjc207CisgICAgICBlaVRvQ1NwYXJzZShzbSwgY3NtKTsKKworLy8gICAgICAgQkVOQ0goKTsKKy8vICAgICAgIHRpbWVyLnN0b3AoKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgQkVOQ0goIHsgbTMgPSBjc19zb3J0ZWRfbXVsdGlwbHkyKG0xLCBtMik7IGNzX3NwZnJlZShtMyk7IH0gKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWZkZWYgT1NLSQorICAgIHsKKyAgICAgIG9za2lfbWF0cml4X3Qgb207CisgICAgICBvc2tpX3ZlY3ZpZXdfdCBvdiwgb3JlczsKKyAgICAgIG9za2lfSW5pdCgpOworICAgICAgb20gPSBvc2tpX0NyZWF0ZU1hdENTQyhzbS5fb3V0ZXJJbmRleFB0cigpLCBzbS5faW5uZXJJbmRleFB0cigpLCBzbS5fdmFsdWVQdHIoKSwgcm93cywgY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkVfSU5QVVRNQVQsIDEsIElOREVYX1pFUk9fQkFTRUQpOworICAgICAgb3YgPSBvc2tpX0NyZWF0ZVZlY1ZpZXcoZHYuZGF0YSgpLCBjb2xzLCBTVFJJREVfVU5JVCk7CisgICAgICBvcmVzID0gb3NraV9DcmVhdGVWZWNWaWV3KHJlcy5kYXRhKCksIHJvd3MsIFNUUklERV9VTklUKTsKKworICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9OT1JNQUwsIDEsIG92LCAwLCBvcmVzKSApOworICAgICAgc3RkOjpjb3V0IDw8ICJPU0tJICAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0goIG9za2lfTWF0TXVsdChvbSwgT1BfVFJBTlMsIDEsIG92LCAwLCBvcmVzKSApOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcbiI7CisKKyAgICAgIC8vIHR1bmUKKyAgICAgIHQucmVzZXQoKTsKKyAgICAgIHQuc3RhcnQoKTsKKyAgICAgIG9za2lfU2V0SGludE1hdE11bHQob20sIE9QX05PUk1BTCwgMS4wLCBTWU1CT0xJQ19WRUMsIDAuMCwgU1lNQk9MSUNfVkVDLCBBTFdBWVNfVFVORV9BR0dSRVNTSVZFTFkpOworICAgICAgb3NraV9UdW5lTWF0KG9tKTsKKyAgICAgIHQuc3RvcCgpOworICAgICAgZG91YmxlIHR1bmluZyA9IHQudmFsdWUoKTsKKworICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9OT1JNQUwsIDEsIG92LCAwLCBvcmVzKSApOworICAgICAgc3RkOjpjb3V0IDw8ICJPU0tJIHR1bmVkICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0goIG9za2lfTWF0TXVsdChvbSwgT1BfVFJBTlMsIDEsIG92LCAwLCBvcmVzKSApOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCgiIDw8IHR1bmluZyA8PCAgIilcbiI7CisKKworICAgICAgb3NraV9EZXN0cm95TWF0KG9tKTsKKyAgICAgIG9za2lfRGVzdHJveVZlY1ZpZXcob3YpOworICAgICAgb3NraV9EZXN0cm95VmVjVmlldyhvcmVzKTsKKyAgICAgIG9za2lfQ2xvc2UoKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWZuZGVmIE5PVUJMQVMKKyAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM7CisgICAgICBVYmxhc01hdHJpeCB1bShyb3dzLGNvbHMpOworICAgICAgZWlUb1VibGFzKHNtLCB1bSk7CisKKyAgICAgIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dmVjdG9yPFNjYWxhcj4gdXYoY29scyksIHVyZXMocm93cyk7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJnV2WzBdLCBjb2xzKSA9IGR2OworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZ1cmVzWzBdLCByb3dzKSA9IHJlczsKKworICAgICAgU1BNVl9CRU5DSCh1Ymxhczo6YXhweV9wcm9kKHVtLCB1diwgdXJlcywgdHJ1ZSkpOworICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0godWJsYXM6OmF4cHlfcHJvZChib29zdDo6bnVtZXJpYzo6dWJsYXM6OnRyYW5zKHVtKSwgdXYsIHVyZXMsIHRydWUpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIEdNTSsrCisgICAgI2lmbmRlZiBOT0dNTQorICAgIHsKKyAgICAgIEdtbVNwYXJzZSBnbShyb3dzLGNvbHMpOworICAgICAgZWlUb0dtbShzbSwgZ20pOworCisgICAgICBzdGQ6OnZlY3RvcjxTY2FsYXI+IGd2KGNvbHMpLCBncmVzKHJvd3MpOworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZndlswXSwgY29scykgPSBkdjsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ3Jlc1swXSwgcm93cykgPSByZXM7CisKKyAgICAgIFNQTVZfQkVOQ0goZ21tOjptdWx0KGdtLCBndiwgZ3JlcykpOworICAgICAgc3RkOjpjb3V0IDw8ICJHTU0rKyAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0goZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChnbSksIGd2LCBncmVzKSk7CisgICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBNVEw0CisgICAgI2lmbmRlZiBOT01UTAorICAgIHsKKyAgICAgIE10bFNwYXJzZSBtbShyb3dzLGNvbHMpOworICAgICAgZWlUb010bChzbSwgbW0pOworICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtdihjb2xzLCAxLjApOworICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtcmVzKHJvd3MsIDEuMCk7CisKKyAgICAgIFNQTVZfQkVOQ0gobXJlcyA9IG1tICogbXYpOworICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0ICAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0gobXJlcyA9IHRyYW5zKG1tKSAqIG12KTsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworCisgICAgaWYobm56UGVyQ29sPT0xKQorICAgICAgYnJlYWs7CisgICAgbm56UGVyQ29sIC09IG5uelBlckNvbC8yOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworCmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL1JFQURNRSBiL2JlbmNoL3RlbnNvcnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWZkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC90ZW5zb3JzL1JFQURNRQpAQCAtMCwwICsxLDIxIEBACitUaGUgdGVuc29yIGJlbmNobWFyayBzdWl0ZSBpcyBtYWRlIG9mIHNldmVyYWwgcGFydHMuCisKK1RoZSBmaXJzdCBwYXJ0IGlzIGEgZ2VuZXJpYyBzdWl0ZSwgaW4gd2hpY2ggZWFjaCBiZW5jaG1hcmsgY29tZXMgaW4gMiBmbGF2b3JzOiBvbmUgdGhhdCBydW5zIG9uIENQVSwgYW5kIG9uZSB0aGF0IHJ1bnMgb24gR1BVLgorCitUbyBjb21waWxlIHRoZSBmbG9hdGluZyBwb2ludCBDUFUgYmVuY2htYXJrcywgc2ltcGx5IGNhbGw6CitnKysgdGVuc29yX2JlbmNobWFya3NfY3B1LmNjIGJlbmNobWFya19tYWluLmNjIC1JIC4uLy4uLyAtc3RkPWMrKzExIC1PMyAtRE5ERUJVRyAtcHRocmVhZCAtbWF2eCAtbyBiZW5jaG1hcmtzX2NwdQorCitUbyBjb21waWxlIHRoZSBmbG9hdGluZyBwb2ludCBHUFUgYmVuY2htYXJrcywgc2ltcGx5IGNhbGw6CitudmNjIHRlbnNvcl9iZW5jaG1hcmtzX2dwdS5jdSBiZW5jaG1hcmtfbWFpbi5jYyAtSSAuLi8uLi8gLXN0ZD1jKysxMSAtTzIgLUROREVCVUcgLXVzZV9mYXN0X21hdGggLWZ0ej10cnVlIC1hcmNoIGNvbXB1dGVfMzUgLW8gYmVuY2htYXJrc19ncHUKKworV2UgYWxzbyBwcm92aWRlIGEgdmVyc2lvbiBvZiB0aGUgZ2VuZXJpYyBHUFUgdGVuc29yIGJlbmNobWFya3MgdGhhdCB1c2VzIGhhbGYgZmxvYXRzIChha2EgZnAxNikgaW5zdGVhZCBvZiByZWd1bGFyIGZsb2F0cy4gVG8gY29tcGlsZSB0aGVzZSBiZW5jaG1hcmtzLCBzaW1wbHkgY2FsbCB0aGUgY29tbWFuZCBsaW5lIGJlbG93LiBZb3UnbGwgbmVlZCBhIHJlY2VudCBHUFUgdGhhdCBzdXBwb3J0cyBjb21wdXRlIGNhcGFiaWxpdHkgNS4zIG9yIGhpZ2hlciB0byBydW4gdGhlbSBhbmQgbnZjYyA3LjUgb3IgaGlnaGVyIHRvIGNvbXBpbGUgdGhlIGNvZGUuCitudmNjIHRlbnNvcl9iZW5jaG1hcmtzX2ZwMTZfZ3B1LmN1IGJlbmNobWFya19tYWluLmNjIC1JIC4uLy4uLyAtc3RkPWMrKzExIC1PMiAtRE5ERUJVRyAtdXNlX2Zhc3RfbWF0aCAtZnR6PXRydWUgLWFyY2ggY29tcHV0ZV81MyAtbyBiZW5jaG1hcmtzX2ZwMTZfZ3B1CisKK2xhc3QgYnV0IG5vdCBsZWFzdCwgd2UgYWxzbyBwcm92aWRlIGEgc3VpdGUgb2YgYmVuY2htYXJrcyB0byBtZWFzdXJlIHRoZSBzY2FsYWJpbGl0eSBvZiB0aGUgY29udHJhY3Rpb24gY29kZSBvbiBDUFUuIFRvIGNvbXBpbGUgdGhlc2UgYmVuY2htYXJrcywgY2FsbAorZysrIGNvbnRyYWN0aW9uX2JlbmNobWFya3NfY3B1LmNjIGJlbmNobWFya19tYWluLmNjIC1JIC4uLy4uLyAtc3RkPWMrKzExIC1PMyAtRE5ERUJVRyAtcHRocmVhZCAtbWF2eCAtbyBiZW5jaG1hcmtzX2NwdQorCitUbyBjb21waWxlIHRoZSBiZW5jaG1hcmsgZm9yIFNZQ0wsIHVzaW5nIENvbXB1dGVDcHAgeW91IGN1cnJlbnRseSBuZWVkIDIgcGFzc2VzIChvbmx5IGZvciB0cmFuc2xhdGlvbiB1bml0cyBjb250YWluaW5nIGRldmljZSBjb2RlKToKKzEuIFRoZSBkZXZpY2UgY29tcGlsYXRpb24gcGFzcyB0aGF0IGdlbmVyYXRlcyB0aGUgZGV2aWNlIGNvZGUgKFNZQ0wga2VybmVscyBhbmQgcmVmZXJlbmNlZCBkZXZpY2UgZnVuY3Rpb25zKSBhbmQgZ2x1ZSBjb2RlIG5lZWRlZCBieSB0aGUgaG9zdCBjb21waWxlciB0byByZWZlcmVuY2UgdGhlIGRldmljZSBjb2RlIGZyb20gaG9zdCBjb2RlLgore0NvbXB1dGVDcHBfUk9PVH0vYmluL2NvbXB1dGUrKyAtSSAuLi8uLi8gLUkge0NvbXB1dGVDcHBfUk9PVH0vaW5jbHVkZS8gLXN0ZD1jKysxMSAtbWxsdm0gLWlubGluZS10aHJlc2hvbGQ9MTAwMCAtV25vLWlnbm9yZWQtYXR0cmlidXRlcyAtc3ljbCAtaW50ZWxzcGlybWV0YWRhdGEgLWVtaXQtbGx2bSAtbm8tc2VyaWFsLW1lbW9wIC1zeWNsLWNvbXByZXNzLW5hbWUgLURCVUlMRF9QTEFURk9STV9TUElSIC1ETkRCVUcgLU8zIC1jIHRlbnNvcl9iZW5jaG1hcmtzX3N5Y2wuY2MKKzIuIFRoZSBob3N0IGNvbXBpbGF0aW9uIHBhc3MgdGhhdCBnZW5lcmF0ZXMgdGhlIGZpbmFsIGhvc3QgYmluYXJ5LgorY2xhbmcrKy0zLjcgLWluY2x1ZGUgdGVuc29yX2JlbmNobWFya3Nfc3ljbC5zeWNsIGJlbmNobWFya19tYWluLmNjIHRlbnNvcl9iZW5jaG1hcmtzX3N5Y2wuY2MgLXB0aHJlYWQgLUkgLi4vLi4vIC1JIHtDb21wdXRlQ3BwX1JPT1R9L2luY2x1ZGUvIC1MIHtDb21wdXRlQ3BwX1JPT1R9L2xpYi8gLWxDb21wdXRlQ3BwIC1sT3BlbkNMIC1EX0dMSUJDWFhfVVNFX0NYWDExX0FCST0wIC1zdGQ9YysrMTEgLW8gdGVuc29yX2JlbmNobWFya19zeWNsCmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL2JlbmNobWFyay5oIGIvYmVuY2gvdGVuc29ycy9iZW5jaG1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE1YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdGVuc29ycy9iZW5jaG1hcmsuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKK2NsYXNzIEJlbmNobWFyayB7CisgcHVibGljOgorICBCZW5jaG1hcmsoY29uc3QgY2hhciogbmFtZSwgdm9pZCAoKmZuKShpbnQpKSB7CisgICAgUmVnaXN0ZXIobmFtZSwgZm4sIE5VTEwpOworICB9CisgIEJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkICgqZm5fcmFuZ2UpKGludCwgaW50KSkgeworICAgIFJlZ2lzdGVyKG5hbWUsIE5VTEwsIGZuX3JhbmdlKTsKKyAgfQorICBCZW5jaG1hcmsqIEFyZyhpbnQgeCk7CisgIEJlbmNobWFyayogUmFuZ2UoaW50IGxvLCBpbnQgaGkpOworICBjb25zdCBjaGFyKiBOYW1lKCk7CisgIGJvb2wgU2hvdWxkUnVuKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworICB2b2lkIFJ1bigpOworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIqIG5hbWVfOworICB2b2lkICgqZm5fKShpbnQpOworICB2b2lkICgqZm5fcmFuZ2VfKShpbnQsIGludCk7CisgIHN0ZDo6dmVjdG9yPGludD4gYXJnc187CisgIHZvaWQgUmVnaXN0ZXIoY29uc3QgY2hhciogbmFtZSwgdm9pZCAoKmZuKShpbnQpLCB2b2lkICgqZm5fcmFuZ2UpKGludCwgaW50KSk7CisgIHZvaWQgUnVuUmVwZWF0ZWRseVdpdGhBcmcoaW50IGl0ZXJhdGlvbnMsIGludCBhcmcpOworICB2b2lkIFJ1bldpdGhBcmcoaW50IGFyZyk7Cit9OworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK3ZvaWQgU2V0QmVuY2htYXJrRmxvcHNQcm9jZXNzZWQoaW50NjRfdCk7Cit2b2lkIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsKK3ZvaWQgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyNkZWZpbmUgQkVOQ0hNQVJLKGYpIFwKKyAgICBzdGF0aWMgOjp0ZXN0aW5nOjpCZW5jaG1hcmsqIF9iZW5jaG1hcmtfIyNmIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gXAorICAgICAgICAobmV3IDo6dGVzdGluZzo6QmVuY2htYXJrKCNmLCBmKSkKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvYmVuY2htYXJrX21haW4uY2MgYi9iZW5jaC90ZW5zb3JzL2JlbmNobWFya19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmEwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC90ZW5zb3JzL2JlbmNobWFya19tYWluLmNjCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJiZW5jaG1hcmsuaCIKKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hcD4KKworc3RhdGljIGludDY0X3QgZ19mbG9wc19wcm9jZXNzZWQ7CitzdGF0aWMgaW50NjRfdCBnX2JlbmNobWFya190b3RhbF90aW1lX25zOworc3RhdGljIGludDY0X3QgZ19iZW5jaG1hcmtfc3RhcnRfdGltZV9uczsKK3R5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIDo6dGVzdGluZzo6QmVuY2htYXJrKj4gQmVuY2htYXJrTWFwOwordHlwZWRlZiBCZW5jaG1hcmtNYXA6Oml0ZXJhdG9yIEJlbmNobWFya01hcEl0OworCitCZW5jaG1hcmtNYXAmIGdCZW5jaG1hcmtzKCkgeworICBzdGF0aWMgQmVuY2htYXJrTWFwIGdfYmVuY2htYXJrczsKKyAgcmV0dXJuIGdfYmVuY2htYXJrczsKK30KKworc3RhdGljIGludCBnX25hbWVfY29sdW1uX3dpZHRoID0gMjA7CisKK3N0YXRpYyBpbnQgUm91bmQoaW50IG4pIHsKKyAgaW50IGJhc2UgPSAxOworICB3aGlsZSAoYmFzZSoxMCA8IG4pIHsKKyAgICBiYXNlICo9IDEwOworICB9CisgIGlmIChuIDwgMipiYXNlKSB7CisgICAgcmV0dXJuIDIqYmFzZTsKKyAgfQorICBpZiAobiA8IDUqYmFzZSkgeworICAgIHJldHVybiA1KmJhc2U7CisgIH0KKyAgcmV0dXJuIDEwKmJhc2U7Cit9CisKKyNpZmRlZiBfX0FQUExFX18KKyAgI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisgIHN0YXRpYyBtYWNoX3RpbWViYXNlX2luZm9fZGF0YV90IGdfdGltZV9pbmZvOworICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIGluaXRfaW5mbygpIHsKKyAgICBtYWNoX3RpbWViYXNlX2luZm8oJmdfdGltZV9pbmZvKTsKKyAgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQ2NF90IE5hbm9UaW1lKCkgeworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICB1aW50NjRfdCB0ID0gbWFjaF9hYnNvbHV0ZV90aW1lKCk7CisgIHJldHVybiB0ICogZ190aW1lX2luZm8ubnVtZXIgLyBnX3RpbWVfaW5mby5kZW5vbTsKKyNlbHNlCisgIHN0cnVjdCB0aW1lc3BlYyB0OworICB0LnR2X3NlYyA9IHQudHZfbnNlYyA9IDA7CisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0LnR2X3NlYykgKiAxMDAwMDAwMDAwTEwgKyB0LnR2X25zZWM7CisjZW5kaWYKK30KKworbmFtZXNwYWNlIHRlc3RpbmcgeworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZyhpbnQgYXJnKSB7CisgIGFyZ3NfLnB1c2hfYmFjayhhcmcpOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJhbmdlKGludCBsbywgaW50IGhpKSB7CisgIGNvbnN0IGludCBrUmFuZ2VNdWx0aXBsaWVyID0gODsKKyAgaWYgKGhpIDwgbG8pIHsKKyAgICBpbnQgdGVtcCA9IGhpOworICAgIGhpID0gbG87CisgICAgbG8gPSB0ZW1wOworICB9CisgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgYXJnc18ucHVzaF9iYWNrKGxvKTsKKyAgICBsbyAqPSBrUmFuZ2VNdWx0aXBsaWVyOworICB9CisgIC8vIFdlIGFsd2F5cyBydW4gdGhlIGhpIG51bWJlci4KKyAgYXJnc18ucHVzaF9iYWNrKGhpKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2NvbnN0IGNoYXIqIEJlbmNobWFyazo6TmFtZSgpIHsKKyAgcmV0dXJuIG5hbWVfOworfQorYm9vbCBCZW5jaG1hcms6OlNob3VsZFJ1bihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICByZXR1cm4gdHJ1ZTsgIC8vIFdpdGggbm8gYXJndW1lbnRzLCB3ZSBydW4gYWxsIGJlbmNobWFya3MuCisgIH0KKyAgLy8gT3RoZXJ3aXNlLCB3ZSBpbnRlcnByZXQgZWFjaCBhcmd1bWVudCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQKKyAgLy8gc2VlIGlmIGFueSBvZiBvdXIgYmVuY2htYXJrcyBtYXRjaC4KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICByZWdleF90IHJlOworICAgIGlmIChyZWdjb21wKCZyZSwgYXJndltpXSwgMCkgIT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBjb21waWxlIFwiJXNcIiBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiFcbiIsIGFyZ3ZbaV0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgICBpbnQgbWF0Y2ggPSByZWdleGVjKCZyZSwgbmFtZV8sIDAsIE5VTEwsIDApOworICAgIHJlZ2ZyZWUoJnJlKTsKKyAgICBpZiAobWF0Y2ggIT0gUkVHX05PTUFUQ0gpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9Cit2b2lkIEJlbmNobWFyazo6UmVnaXN0ZXIoY29uc3QgY2hhciogbmFtZSwgdm9pZCAoKmZuKShpbnQpLCB2b2lkICgqZm5fcmFuZ2UpKGludCwgaW50KSkgeworICBuYW1lXyA9IG5hbWU7CisgIGZuXyA9IGZuOworICBmbl9yYW5nZV8gPSBmbl9yYW5nZTsKKyAgaWYgKGZuXyA9PSBOVUxMICYmIGZuX3JhbmdlXyA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogbWlzc2luZyBmdW5jdGlvblxuIiwgbmFtZV8pOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBnQmVuY2htYXJrcygpLmluc2VydChzdGQ6Om1ha2VfcGFpcihuYW1lLCB0aGlzKSk7Cit9Cit2b2lkIEJlbmNobWFyazo6UnVuKCkgeworICBpZiAoZm5fICE9IE5VTEwpIHsKKyAgICBSdW5XaXRoQXJnKDApOworICB9IGVsc2UgeworICAgIGlmIChhcmdzXy5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBubyBhcmdzIVxuIiwgbmFtZV8pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3NfLnNpemUoKTsgKytpKSB7CisgICAgICBSdW5XaXRoQXJnKGFyZ3NfW2ldKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQmVuY2htYXJrOjpSdW5SZXBlYXRlZGx5V2l0aEFyZyhpbnQgaXRlcmF0aW9ucywgaW50IGFyZykgeworICBnX2Zsb3BzX3Byb2Nlc3NlZCA9IDA7CisgIGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMgPSAwOworICBnX2JlbmNobWFya19zdGFydF90aW1lX25zID0gTmFub1RpbWUoKTsKKyAgaWYgKGZuXyAhPSBOVUxMKSB7CisgICAgZm5fKGl0ZXJhdGlvbnMpOworICB9IGVsc2UgeworICAgIGZuX3JhbmdlXyhpdGVyYXRpb25zLCBhcmcpOworICB9CisgIGlmIChnX2JlbmNobWFya19zdGFydF90aW1lX25zICE9IDApIHsKKyAgICBnX2JlbmNobWFya190b3RhbF90aW1lX25zICs9IE5hbm9UaW1lKCkgLSBnX2JlbmNobWFya19zdGFydF90aW1lX25zOworICB9Cit9Cit2b2lkIEJlbmNobWFyazo6UnVuV2l0aEFyZyhpbnQgYXJnKSB7CisgIC8vIHJ1biBvbmNlIGluIGNhc2UgaXQncyBleHBlbnNpdmUKKyAgaW50IGl0ZXJhdGlvbnMgPSAxOworICBSdW5SZXBlYXRlZGx5V2l0aEFyZyhpdGVyYXRpb25zLCBhcmcpOworICB3aGlsZSAoZ19iZW5jaG1hcmtfdG90YWxfdGltZV9ucyA8IDFlOSAmJiBpdGVyYXRpb25zIDwgMWU5KSB7CisgICAgaW50IGxhc3QgPSBpdGVyYXRpb25zOworICAgIGlmIChnX2JlbmNobWFya190b3RhbF90aW1lX25zL2l0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgaXRlcmF0aW9ucyA9IDFlOTsKKyAgICB9IGVsc2UgeworICAgICAgaXRlcmF0aW9ucyA9IDFlOSAvIChnX2JlbmNobWFya190b3RhbF90aW1lX25zL2l0ZXJhdGlvbnMpOworICAgIH0KKyAgICBpdGVyYXRpb25zID0gc3RkOjptYXgobGFzdCArIDEsIHN0ZDo6bWluKGl0ZXJhdGlvbnMgKyBpdGVyYXRpb25zLzIsIDEwMCpsYXN0KSk7CisgICAgaXRlcmF0aW9ucyA9IFJvdW5kKGl0ZXJhdGlvbnMpOworICAgIFJ1blJlcGVhdGVkbHlXaXRoQXJnKGl0ZXJhdGlvbnMsIGFyZyk7CisgIH0KKyAgY2hhciB0aHJvdWdocHV0WzEwMF07CisgIHRocm91Z2hwdXRbMF0gPSAnXDAnOworICBpZiAoZ19iZW5jaG1hcmtfdG90YWxfdGltZV9ucyA+IDAgJiYgZ19mbG9wc19wcm9jZXNzZWQgPiAwKSB7CisgICAgZG91YmxlIG1mbG9wc19wcm9jZXNzZWQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGdfZmxvcHNfcHJvY2Vzc2VkKS8xZTY7CisgICAgZG91YmxlIHNlY29uZHMgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMpLzFlOTsKKyAgICBzbnByaW50Zih0aHJvdWdocHV0LCBzaXplb2YodGhyb3VnaHB1dCksICIgJTguMmYgTUZsb3BzL3MiLCBtZmxvcHNfcHJvY2Vzc2VkL3NlY29uZHMpOworICB9CisgIGNoYXIgZnVsbF9uYW1lWzEwMF07CisgIGlmIChmbl9yYW5nZV8gIT0gTlVMTCkgeworICAgIGlmIChhcmcgPj0gKDE8PDIwKSkgeworICAgICAgc25wcmludGYoZnVsbF9uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSwgIiVzLyVkTSIsIG5hbWVfLCBhcmcvKDE8PDIwKSk7CisgICAgfSBlbHNlIGlmIChhcmcgPj0gKDE8PDEwKSkgeworICAgICAgc25wcmludGYoZnVsbF9uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSwgIiVzLyVkSyIsIG5hbWVfLCBhcmcvKDE8PDEwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNucHJpbnRmKGZ1bGxfbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSksICIlcy8lZCIsIG5hbWVfLCBhcmcpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzbnByaW50ZihmdWxsX25hbWUsIHNpemVvZihmdWxsX25hbWUpLCAiJXMiLCBuYW1lXyk7CisgIH0KKyAgcHJpbnRmKCIlLSpzICUxMGQgJTEwIiBQUklkNjQgIiVzXG4iLCBnX25hbWVfY29sdW1uX3dpZHRoLCBmdWxsX25hbWUsCisgICAgICAgICBpdGVyYXRpb25zLCBnX2JlbmNobWFya190b3RhbF90aW1lX25zL2l0ZXJhdGlvbnMsIHRocm91Z2hwdXQpOworICBmZmx1c2goc3Rkb3V0KTsKK30KK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit2b2lkIFNldEJlbmNobWFya0Zsb3BzUHJvY2Vzc2VkKGludDY0X3QgeCkgeworICBnX2Zsb3BzX3Byb2Nlc3NlZCA9IHg7Cit9Cit2b2lkIFN0b3BCZW5jaG1hcmtUaW1pbmcoKSB7CisgIGlmIChnX2JlbmNobWFya19zdGFydF90aW1lX25zICE9IDApIHsKKyAgICBnX2JlbmNobWFya190b3RhbF90aW1lX25zICs9IE5hbm9UaW1lKCkgLSBnX2JlbmNobWFya19zdGFydF90aW1lX25zOworICB9CisgIGdfYmVuY2htYXJrX3N0YXJ0X3RpbWVfbnMgPSAwOworfQordm9pZCBTdGFydEJlbmNobWFya1RpbWluZygpIHsKKyAgaWYgKGdfYmVuY2htYXJrX3N0YXJ0X3RpbWVfbnMgPT0gMCkgeworICAgIGdfYmVuY2htYXJrX3N0YXJ0X3RpbWVfbnMgPSBOYW5vVGltZSgpOworICB9Cit9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGlmIChnQmVuY2htYXJrcygpLmVtcHR5KCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGJlbmNobWFya3MgcmVnaXN0ZXJlZCFcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBmb3IgKEJlbmNobWFya01hcEl0IGl0ID0gZ0JlbmNobWFya3MoKS5iZWdpbigpOyBpdCAhPSBnQmVuY2htYXJrcygpLmVuZCgpOyArK2l0KSB7CisgICAgaW50IG5hbWVfd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihpdC0+c2Vjb25kLT5OYW1lKCkpKTsKKyAgICBnX25hbWVfY29sdW1uX3dpZHRoID0gc3RkOjptYXgoZ19uYW1lX2NvbHVtbl93aWR0aCwgbmFtZV93aWR0aCk7CisgIH0KKyAgYm9vbCBuZWVkX2hlYWRlciA9IHRydWU7CisgIGZvciAoQmVuY2htYXJrTWFwSXQgaXQgPSBnQmVuY2htYXJrcygpLmJlZ2luKCk7IGl0ICE9IGdCZW5jaG1hcmtzKCkuZW5kKCk7ICsraXQpIHsKKyAgICA6OnRlc3Rpbmc6OkJlbmNobWFyayogYiA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKGItPlNob3VsZFJ1bihhcmdjLCBhcmd2KSkgeworICAgICAgaWYgKG5lZWRfaGVhZGVyKSB7CisgICAgICAgIHByaW50ZigiJS0qcyAlMTBzICUxMHNcbiIsIGdfbmFtZV9jb2x1bW5fd2lkdGgsICIiLCAiaXRlcmF0aW9ucyIsICJucy9vcCIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgbmVlZF9oZWFkZXIgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGItPlJ1bigpOworICAgIH0KKyAgfQorICBpZiAobmVlZF9oZWFkZXIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG1hdGNoaW5nIGJlbmNobWFya3MhXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBiZW5jaG1hcmtzOlxuIik7CisgICAgZm9yIChCZW5jaG1hcmtNYXBJdCBpdCA9IGdCZW5jaG1hcmtzKCkuYmVnaW4oKTsgaXQgIT0gZ0JlbmNobWFya3MoKS5lbmQoKTsgKytpdCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIgICVzXG4iLCBpdC0+c2Vjb25kLT5OYW1lKCkpOworICAgIH0KKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL2NvbnRyYWN0aW9uX2JlbmNobWFya3NfY3B1LmNjIGIvYmVuY2gvdGVuc29ycy9jb250cmFjdGlvbl9iZW5jaG1hcmtzX2NwdS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU1N2FkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdGVuc29ycy9jb250cmFjdGlvbl9iZW5jaG1hcmtzX2NwdS5jYwpAQCAtMCwwICsxLDM5IEBACisjZGVmaW5lIEVJR0VOX1VTRV9USFJFQURTCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0ZW5zb3JfYmVuY2htYXJrcy5oIgorCisjZGVmaW5lIENSRUFURV9USFJFQURfUE9PTCh0aHJlYWRzKSAgICAgICAgICAgICBcCitFaWdlbjo6VGhyZWFkUG9vbCBwb29sKHRocmVhZHMpOyAgICAgICAgICAgICAgICBcCitFaWdlbjo6VGhyZWFkUG9vbERldmljZSBkZXZpY2UoJnBvb2wsIHRocmVhZHMpOworCisKKy8vIENvbnRyYWN0aW9ucyBmb3IgbnVtYmVyIG9mIHRocmVhZHMgcmFuZ2luZyBmcm9tIDEgdG8gMzIKKy8vIERpbWVuc2lvbnMgYXJlIFJvd3MsIENvbHMsIERlcHRoCisjZGVmaW5lIEJNX0NvbnRyYWN0aW9uQ1BVKEQxLCBEMiwgRDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEJNXyMjQ29udHJhY3Rpb24jI18jI0QxIyN4IyNEMiMjeCMjRDMoaW50IGl0ZXJzLCBpbnQgVGhyZWFkcykgeyBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JFQVRFX1RIUkVBRF9QT09MKFRocmVhZHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OlRocmVhZFBvb2xEZXZpY2UsIGZsb2F0PiBzdWl0ZShkZXZpY2UsIEQxLCBEMiwgRDMpOyBcCisgICAgc3VpdGUuY29udHJhY3Rpb24oaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19SQU5HRShCTV8jI0NvbnRyYWN0aW9uIyNfIyNEMSMjeCMjRDIjI3gjI0QzLCAxLCAzMik7CisKKworLy8gVmVjdG9yIE1hdHJpeCBhbmQgTWF0cml4IFZlY3RvciBwcm9kdWN0cworQk1fQ29udHJhY3Rpb25DUFUoMSwgMjAwMCwgNTAwKTsKK0JNX0NvbnRyYWN0aW9uQ1BVKDIwMDAsIDEsIDUwMCk7CisKKy8vIFZhcmlvdXMgc2tpbm55IG1hdHJpY2VzCitCTV9Db250cmFjdGlvbkNQVSgyNTAsIDMsIDUxMik7CitCTV9Db250cmFjdGlvbkNQVSgxNTAwLCAzLCA1MTIpOworCitCTV9Db250cmFjdGlvbkNQVSg1MTIsIDgwMCwgNCk7CitCTV9Db250cmFjdGlvbkNQVSg1MTIsIDgwLCA4MDApOworQk1fQ29udHJhY3Rpb25DUFUoNTEyLCA4MCwgMTM1MjIpOworQk1fQ29udHJhY3Rpb25DUFUoMSwgODAsIDEzNTIyKTsKKworQk1fQ29udHJhY3Rpb25DUFUoMzIwMCwgNTEyLCA0KTsKK0JNX0NvbnRyYWN0aW9uQ1BVKDMyMDAsIDUxMiwgODApOworQk1fQ29udHJhY3Rpb25DUFUoMzIwMCwgODAsIDUxMik7CmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzLmggYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmYjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3MuaApAQCAtMCwwICsxLDQ3OCBAQAorI2lmbmRlZiBUSElSRF9QQVJUWV9FSUdFTjNfVEVOU09SX0JFTkNITUFSS1NfSF8KKyNkZWZpbmUgVEhJUkRfUEFSVFlfRUlHRU4zX1RFTlNPUl9CRU5DSE1BUktTX0hfCisKK3R5cGVkZWYgaW50IFRlbnNvckluZGV4OworI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50CisKKyNpbmNsdWRlICJ1bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UZW5zb3IiCisjaW5jbHVkZSAiYmVuY2htYXJrLmgiCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1JBTkdFKGJlbmNoLCBsbywgaGkpIFwKKyAgQkVOQ0hNQVJLKGJlbmNoKS0+UmFuZ2UobG8sIGhpKQorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OlRlbnNvck1hcDsKKworLy8gVE9ETyhic3RlaW5lcik6IGFsc28gdGVtcGxhdGl6ZSBvbiB0aGUgaW5wdXQgdHlwZSBzaW5jZSB3ZSBoYXZlIHVzZXJzCisvLyBmb3IgaW50OCBhcyB3ZWxsIGFzIGZsb2F0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXZpY2UsIHR5cGVuYW1lIFQ+IGNsYXNzIEJlbmNobWFya1N1aXRlIHsKKyBwdWJsaWM6CisgIEJlbmNobWFya1N1aXRlKGNvbnN0IERldmljZSYgZGV2aWNlLCBzaXplX3QgbSwgc2l6ZV90IGssIHNpemVfdCBuKQorICAgICAgOiBtXyhtKSwga18oayksIG5fKG4pLCBkZXZpY2VfKGRldmljZSkgeworICAgIGluaXRpYWxpemUoKTsKKyAgfQorCisgIEJlbmNobWFya1N1aXRlKGNvbnN0IERldmljZSYgZGV2aWNlLCBzaXplX3QgbSkKKyAgICAgIDogbV8obSksIGtfKG0pLCBuXyhtKSwgZGV2aWNlXyhkZXZpY2UpIHsKKyAgICBpbml0aWFsaXplKCk7CisgIH0KKworICB+QmVuY2htYXJrU3VpdGUoKSB7CisgICAgZGV2aWNlXy5kZWFsbG9jYXRlKGFfKTsKKyAgICBkZXZpY2VfLmRlYWxsb2NhdGUoYl8pOworICAgIGRldmljZV8uZGVhbGxvY2F0ZShjXyk7CisgIH0KKworICB2b2lkIG1lbWNweShpbnQgbnVtX2l0ZXJzKSB7CisgICAgZWlnZW5fYXNzZXJ0KG1fID09IGtfICYmIGtfID09IG5fKTsKKyAgICBTdGFydEJlbmNobWFya1RpbWluZygpOworICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKKyAgICAgIGRldmljZV8ubWVtY3B5KGNfLCBhXywgbV8gKiBtXyAqIHNpemVvZihUKSk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBjb3BpZWQgcGVyIHNlY29uZAorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KG1fKSAqIG1fICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIHZvaWQgdHlwZUNhc3RpbmcoaW50IG51bV9pdGVycykgeworICAgIGVpZ2VuX2Fzc2VydChtXyA9PSBuXyk7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplczsKKyAgICBpZiAoc2l6ZW9mKFQpID49IHNpemVvZihpbnQpKSB7CisgICAgICBzaXplc1swXSA9IG1fOworICAgICAgc2l6ZXNbMV0gPSBrXzsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZXNbMF0gPSBtXyAqIHNpemVvZihUKSAvIHNpemVvZihpbnQpOworICAgICAgc2l6ZXNbMV0gPSBrXyAqIHNpemVvZihUKSAvIHNpemVvZihpbnQpOworICAgIH0KKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPGludCwgMiwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQSgoaW50KilhXywgc2l6ZXMpOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMiwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgc2l6ZXMpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBCLmRldmljZShkZXZpY2VfKSA9IEEudGVtcGxhdGUgY2FzdDxUPigpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiB2YWx1ZXMgY29waWVkIHBlciBzZWNvbmQKKyAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihtXykgKiBrXyAqIG51bV9pdGVycyk7CisgIH0KKworICB2b2lkIHJhbmRvbShpbnQgbnVtX2l0ZXJzKSB7CisgICAgZWlnZW5fYXNzZXJ0KG1fID09IGtfICYmIGtfID09IG5fKTsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVzOworICAgIHNpemVzWzBdID0gbV87CisgICAgc2l6ZXNbMV0gPSBtXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgc2l6ZXMpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEMucmFuZG9tKCk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIGdlbmVyYXRlZCBwZXIgc2Vjb25kCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICogbV8gKiBudW1faXRlcnMpOworICB9CisKKyAgdm9pZCBzbGljaW5nKGludCBudW1faXRlcnMpIHsKKyAgICBlaWdlbl9hc3NlcnQobV8gPT0ga18gJiYga18gPT0gbl8pOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZXM7CisgICAgc2l6ZXNbMF0gPSBtXzsKKyAgICBzaXplc1sxXSA9IG1fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplcyk7CisgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVzKTsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgc2l6ZXMpOworCisgICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gcXVhcnRlcl9zaXplcyhtXy8yLCBtXy8yKTsKKyAgICBjb25zdCBFaWdlbjo6RFNpemVzPFRlbnNvckluZGV4LCAyPiBmaXJzdF9xdWFkcmFudCgwLCAwKTsKKyAgICBjb25zdCBFaWdlbjo6RFNpemVzPFRlbnNvckluZGV4LCAyPiBzZWNvbmRfcXVhZHJhbnQoMCwgbV8vMik7CisgICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gdGhpcmRfcXVhZHJhbnQobV8vMiwgMCk7CisgICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gZm91cnRoX3F1YWRyYW50KG1fLzIsIG1fLzIpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLnNsaWNlKGZpcnN0X3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPQorICAgICAgICAgIEEuc2xpY2UoZmlyc3RfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOworICAgICAgQy5zbGljZShzZWNvbmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9CisgICAgICAgICAgQi5zbGljZShzZWNvbmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOworICAgICAgQy5zbGljZSh0aGlyZF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcykuZGV2aWNlKGRldmljZV8pID0KKyAgICAgICAgICBBLnNsaWNlKHRoaXJkX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICAgIEMuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPQorICAgICAgICAgIEIuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgdmFsdWVzIGNvcGllZCBmcm9tIHRoZSByaHMgc2xpY2UgdG8gdGhlIGxocyBzbGljZQorICAgIC8vIGVhY2ggc2Vjb25kCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICogbV8gKiBudW1faXRlcnMpOworICB9CisKKyAgdm9pZCByb3dDaGlwKGludCBudW1faXRlcnMpIHsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IGlucHV0X3NpemU7CisgICAgaW5wdXRfc2l6ZVswXSA9IGtfOworICAgIGlucHV0X3NpemVbMV0gPSBuXzsKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIGlucHV0X3NpemUpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMT4gb3V0cHV0X3NpemU7CisgICAgb3V0cHV0X3NpemVbMF0gPSBuXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDEsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIG91dHB1dF9zaXplKTsKKworICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgeworICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBCLmNoaXAoaXRlciAlIGtfLCAwKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgdmFsdWVzIGNvcGllZCBmcm9tIHRoZSByaHMgY2hpcCB0byB0aGUgbGhzLgorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KG5fKSAqIG51bV9pdGVycyk7CisgIH0KKworICB2b2lkIGNvbENoaXAoaW50IG51bV9pdGVycykgeworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gaW5wdXRfc2l6ZTsKKyAgICBpbnB1dF9zaXplWzBdID0ga187CisgICAgaW5wdXRfc2l6ZVsxXSA9IG5fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMiwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgaW5wdXRfc2l6ZSk7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAxPiBvdXRwdXRfc2l6ZTsKKyAgICBvdXRwdXRfc2l6ZVswXSA9IG5fOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMSwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgb3V0cHV0X3NpemUpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEIuY2hpcChpdGVyICUgbl8sIDEpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiB2YWx1ZXMgY29waWVkIGZyb20gdGhlIHJocyBjaGlwIHRvIHRoZSBsaHMuCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obl8pICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIHZvaWQgc2h1ZmZsaW5nKGludCBudW1faXRlcnMpIHsKKyAgICBlaWdlbl9hc3NlcnQobV8gPT0gbl8pOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZV9hOworICAgIHNpemVfYVswXSA9IG1fOworICAgIHNpemVfYVsxXSA9IGtfOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplX2EpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZV9iOworICAgIHNpemVfYlswXSA9IGtfOworICAgIHNpemVfYlsxXSA9IG1fOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBzaXplX2IpOworCisgICAgRWlnZW46OmFycmF5PGludCwgMj4gc2h1ZmZsZTsKKyAgICBzaHVmZmxlWzBdID0gMTsKKyAgICBzaHVmZmxlWzFdID0gMDsKKworICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgeworICAgICAgQi5kZXZpY2UoZGV2aWNlXykgPSBBLnNodWZmbGUoc2h1ZmZsZSk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBzaHVmZmxlZCBmcm9tIEEgYW5kIGNvcGllZCB0byBCIGVhY2ggc2Vjb25kCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICoga18gKiBudW1faXRlcnMpOworICB9CisKKyB2b2lkIHBhZGRpbmcoaW50IG51bV9pdGVycykgeworICAgIGVpZ2VuX2Fzc2VydChtXyA9PSBrXyk7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2E7CisgICAgc2l6ZV9hWzBdID0gbV87CisgICAgc2l6ZV9hWzFdID0ga18tMzsKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQShhXywgc2l6ZV9hKTsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVfYjsKKyAgICBzaXplX2JbMF0gPSBrXzsKKyAgICBzaXplX2JbMV0gPSBtXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgc2l6ZV9iKTsKKworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0lOREVYX0xJU1QpCisgICAgRWlnZW46OkluZGV4UGFpckxpc3Q8RWlnZW46OnR5cGUyaW5kZXhwYWlyPDAsIDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwyLCAxPiA+IHBhZGRpbmdzOworI2Vsc2UKKyAgICBFaWdlbjo6YXJyYXk8RWlnZW46OkluZGV4UGFpcjxUZW5zb3JJbmRleD4sIDI+IHBhZGRpbmdzOworICAgIHBhZGRpbmdzWzBdID0gRWlnZW46OkluZGV4UGFpcjxUZW5zb3JJbmRleD4oMCwgMCk7CisgICAgcGFkZGluZ3NbMV0gPSBFaWdlbjo6SW5kZXhQYWlyPFRlbnNvckluZGV4PigyLCAxKTsKKyNlbmRpZgorCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBCLmRldmljZShkZXZpY2VfKSA9IEEucGFkKHBhZGRpbmdzKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgdmFsdWVzIGNvcGllZCBmcm9tIHRoZSBwYWRkZWQgdGVuc29yIEEgZWFjaCBzZWNvbmQKKyAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihtXykgKiBrXyAqIG51bV9pdGVycyk7CisgIH0KKworIHZvaWQgc3RyaWRpbmcoaW50IG51bV9pdGVycykgeworICAgIGVpZ2VuX2Fzc2VydChtXyA9PSBrXyk7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2E7CisgICAgc2l6ZV9hWzBdID0gbV87CisgICAgc2l6ZV9hWzFdID0ga187CisgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEEoYV8sIHNpemVfYSk7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2I7CisgICAgc2l6ZV9iWzBdID0gbV87CisgICAgc2l6ZV9iWzFdID0ga18vMjsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgc2l6ZV9iKTsKKworI2lmbmRlZiBFSUdFTl9IQVNfSU5ERVhfTElTVAorICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc3RyaWRlczsKKyAgICBzdHJpZGVzWzBdID0gMTsKKyAgICBzdHJpZGVzWzFdID0gMjsKKyNlbHNlCisgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgY3h4MTEgdG8gZ2l2ZSB0aGUgY29tcGlsZXIgaW5mb3JtYXRpb24gaXQgY2FuIHVzZSB0bworICAgIC8vIG9wdGltaXplIHRoZSBjb2RlLgorICAgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+ID4gc3RyaWRlczsKKyNlbmRpZgorCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBCLmRldmljZShkZXZpY2VfKSA9IEEuc3RyaWRlKHN0cmlkZXMpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiB2YWx1ZXMgY29waWVkIGZyb20gdGhlIHBhZGRlZCB0ZW5zb3IgQSBlYWNoIHNlY29uZAorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KG1fKSAqIGtfICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIHZvaWQgYnJvYWRjYXN0aW5nKGludCBudW1faXRlcnMpIHsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVfYTsKKyAgICBzaXplX2FbMF0gPSBtXzsKKyAgICBzaXplX2FbMV0gPSAxOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplX2EpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZV9jOworICAgIHNpemVfY1swXSA9IG1fOworICAgIHNpemVfY1sxXSA9IG5fOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCBzaXplX2MpOworCisjaWZuZGVmIEVJR0VOX0hBU19JTkRFWF9MSVNUCisgICAgRWlnZW46OmFycmF5PGludCwgMj4gYnJvYWRjYXN0OworICAgIGJyb2FkY2FzdFswXSA9IDE7CisgICAgYnJvYWRjYXN0WzFdID0gbl87CisjZWxzZQorICAgIC8vIFRha2UgYWR2YW50YWdlIG9mIGN4eDExIHRvIGdpdmUgdGhlIGNvbXBpbGVyIGluZm9ybWF0aW9uIGl0IGNhbiB1c2UgdG8KKyAgICAvLyBvcHRpbWl6ZSB0aGUgY29kZS4KKyAgICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDE+LCBpbnQ+IGJyb2FkY2FzdDsKKyAgICBicm9hZGNhc3Quc2V0KDEsIG5fKTsKKyNlbmRpZgorCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEEuYnJvYWRjYXN0KGJyb2FkY2FzdCk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBicm9hZGNhc3RlZCBmcm9tIEEgYW5kIGNvcGllZCB0byBDIGVhY2ggc2Vjb25kCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICogbl8gKiBudW1faXRlcnMpOworICB9CisKKyAgdm9pZCBjb2VmZldpc2VPcChpbnQgbnVtX2l0ZXJzKSB7CisgICAgZWlnZW5fYXNzZXJ0KG1fID09IGtfICYmIGtfID09IG5fKTsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVzOworICAgIHNpemVzWzBdID0gbV87CisgICAgc2l6ZXNbMV0gPSBtXzsKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQShhXywgc2l6ZXMpOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBzaXplcyk7CisgICAgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIHNpemVzKTsKKworICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgeworICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBICogQS5jb25zdGFudChzdGF0aWNfY2FzdDxUPigzLjE0KSkgKyBCICogQi5jb25zdGFudChzdGF0aWNfY2FzdDxUPigyLjcpKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgRkxPUCBleGVjdXRlZCBwZXIgc2Vjb25kICgyIG11bHRpcGxpY2F0aW9ucyBhbmQKKyAgICAvLyAxIGFkZGl0aW9uIHBlciB2YWx1ZSkKKyAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PigzKSAqIG1fICogbV8gKiBudW1faXRlcnMpOworICB9CisKKyAgdm9pZCBhbGdlYnJhaWNGdW5jKGludCBudW1faXRlcnMpIHsKKyAgICBlaWdlbl9hc3NlcnQobV8gPT0ga18gJiYga18gPT0gbl8pOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZXM7CisgICAgc2l6ZXNbMF0gPSBtXzsKKyAgICBzaXplc1sxXSA9IG1fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplcyk7CisgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVzKTsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgc2l6ZXMpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEEucnNxcnQoKSArIEIuc3FydCgpICogQi5zcXVhcmUoKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgRkxPUCBleGVjdXRlZCBwZXIgc2Vjb25kIChhc3N1bWluZyBvbmUgb3BlcmF0aW9uCisgICAgLy8gcGVyIHZhbHVlKQorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KG1fKSAqIG1fICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIHZvaWQgdHJhbnNjZW5kZW50YWxGdW5jKGludCBudW1faXRlcnMpIHsKKyAgICBlaWdlbl9hc3NlcnQobV8gPT0ga18gJiYga18gPT0gbl8pOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZXM7CisgICAgc2l6ZXNbMF0gPSBtXzsKKyAgICBzaXplc1sxXSA9IG1fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplcyk7CisgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVzKTsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgc2l6ZXMpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEEuZXhwKCkgKyBCLmxvZygpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiBGTE9QIGV4ZWN1dGVkIHBlciBzZWNvbmQgKGFzc3VtaW5nIG9uZSBvcGVyYXRpb24KKyAgICAvLyBwZXIgdmFsdWUpCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICogbV8gKiBudW1faXRlcnMpOworICB9CisKKyAvLyBSb3cgcmVkdWN0aW9uCisgIHZvaWQgcm93UmVkdWN0aW9uKGludCBudW1faXRlcnMpIHsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IGlucHV0X3NpemU7CisgICAgaW5wdXRfc2l6ZVswXSA9IGtfOworICAgIGlucHV0X3NpemVbMV0gPSBuXzsKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIGlucHV0X3NpemUpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMT4gb3V0cHV0X3NpemU7CisgICAgb3V0cHV0X3NpemVbMF0gPSBuXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDEsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIG91dHB1dF9zaXplKTsKKworI2lmbmRlZiBFSUdFTl9IQVNfSU5ERVhfTElTVAorICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMT4gc3VtX2Fsb25nX2RpbTsKKyAgICBzdW1fYWxvbmdfZGltWzBdID0gMDsKKyNlbHNlCisgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgY3h4MTEgdG8gZ2l2ZSB0aGUgY29tcGlsZXIgaW5mb3JtYXRpb24gaXQgY2FuIHVzZSB0bworICAgIC8vIG9wdGltaXplIHRoZSBjb2RlLgorICAgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MD4+IHN1bV9hbG9uZ19kaW07CisjZW5kaWYKKworICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgeworICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBCLnN1bShzdW1fYWxvbmdfZGltKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgRkxPUCBleGVjdXRlZCBwZXIgc2Vjb25kIChhc3N1bWluZyBvbmUgb3BlcmF0aW9uCisgICAgLy8gcGVyIHZhbHVlKQorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KGtfKSAqIG5fICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIC8vIENvbHVtbiByZWR1Y3Rpb24KKyAgdm9pZCBjb2xSZWR1Y3Rpb24oaW50IG51bV9pdGVycykgeworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gaW5wdXRfc2l6ZTsKKyAgICBpbnB1dF9zaXplWzBdID0ga187CisgICAgaW5wdXRfc2l6ZVsxXSA9IG5fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMiwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQigKKyAgICAgICAgYl8sIGlucHV0X3NpemUpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMT4gb3V0cHV0X3NpemU7CisgICAgb3V0cHV0X3NpemVbMF0gPSBrXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDEsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEMoCisgICAgICAgIGNfLCBvdXRwdXRfc2l6ZSk7CisKKyNpZm5kZWYgRUlHRU5fSEFTX0lOREVYX0xJU1QKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDE+IHN1bV9hbG9uZ19kaW07CisgICAgc3VtX2Fsb25nX2RpbVswXSA9IDE7CisjZWxzZQorICAgIC8vIFRha2UgYWR2YW50YWdlIG9mIGN4eDExIHRvIGdpdmUgdGhlIGNvbXBpbGVyIGluZm9ybWF0aW9uIGl0IGNhbiB1c2UgdG8KKyAgICAvLyBvcHRpbWl6ZSB0aGUgY29kZS4KKyAgICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDE+PiBzdW1fYWxvbmdfZGltOworI2VuZGlmCisKKyAgICBTdGFydEJlbmNobWFya1RpbWluZygpOworICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKKyAgICAgIEMuZGV2aWNlKGRldmljZV8pID0gQi5zdW0oc3VtX2Fsb25nX2RpbSk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIEZMT1AgZXhlY3V0ZWQgcGVyIHNlY29uZCAoYXNzdW1pbmcgb25lIG9wZXJhdGlvbgorICAgIC8vIHBlciB2YWx1ZSkKKyAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihrXykgKiBuXyAqIG51bV9pdGVycyk7CisgIH0KKworICAvLyBGdWxsIHJlZHVjdGlvbgorICB2b2lkIGZ1bGxSZWR1Y3Rpb24oaW50IG51bV9pdGVycykgeworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gaW5wdXRfc2l6ZTsKKyAgICBpbnB1dF9zaXplWzBdID0ga187CisgICAgaW5wdXRfc2l6ZVsxXSA9IG5fOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMiwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQigKKyAgICAgICAgYl8sIGlucHV0X3NpemUpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMD4gb3V0cHV0X3NpemU7CisgICAgVGVuc29yTWFwPFRlbnNvcjxULCAwLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBDKAorICAgICAgICBjXywgb3V0cHV0X3NpemUpOworCisgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CisgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEIuc3VtKCk7CisgICAgfQorICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIEZMT1AgZXhlY3V0ZWQgcGVyIHNlY29uZCAoYXNzdW1pbmcgb25lIG9wZXJhdGlvbgorICAgIC8vIHBlciB2YWx1ZSkKKyAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihrXykgKiBuXyAqIG51bV9pdGVycyk7CisgIH0KKworICAvLyBkbyBhIGNvbnRyYWN0aW9uIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBtYXRyaXggbXVsdGlwbGljYXRpb24KKyAgdm9pZCBjb250cmFjdGlvbihpbnQgbnVtX2l0ZXJzKSB7CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplQTsKKyAgICBzaXplQVswXSA9IG1fOworICAgIHNpemVBWzFdID0ga187CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplQjsKKyAgICBzaXplQlswXSA9IGtfOworICAgIHNpemVCWzFdID0gbl87CisgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplQzsKKyAgICBzaXplQ1swXSA9IG1fOworICAgIHNpemVDWzFdID0gbl87CisKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQShhXywgc2l6ZUEpOworICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBzaXplQik7CisgICAgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIHNpemVDKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPFQsIDI+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisgICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXM7CisgICAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7CisKKyAgICBTdGFydEJlbmNobWFya1RpbWluZygpOworICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKKyAgICAgIEMuZGV2aWNlKGRldmljZV8pID0gQS5jb250cmFjdChCLCBkaW1zKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgRkxPUCBleGVjdXRlZCBwZXIgc2Vjb25kIChzaXplXyBtdWx0aXBsaWNhdGlvbnMgYW5kCisgICAgLy8gYWRkaXRpb25zIGZvciBlYWNoIHZhbHVlIGluIHRoZSByZXN1bHRpbmcgdGVuc29yKQorICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KDIpICogbV8gKiBuXyAqIGtfICogbnVtX2l0ZXJzKTsKKyAgfQorCisgIHZvaWQgY29udm9sdXRpb24oaW50IG51bV9pdGVycywgaW50IGtlcm5lbF94LCBpbnQga2VybmVsX3kpIHsKKyAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IGlucHV0X3NpemVzOworICAgIGlucHV0X3NpemVzWzBdID0gbV87CisgICAgaW5wdXRfc2l6ZXNbMV0gPSBuXzsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQShhXywgaW5wdXRfc2l6ZXMpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4ga2VybmVsX3NpemVzOworICAgIGtlcm5lbF9zaXplc1swXSA9IGtlcm5lbF94OworICAgIGtlcm5lbF9zaXplc1sxXSA9IGtlcm5lbF95OworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBrZXJuZWxfc2l6ZXMpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gcmVzdWx0X3NpemVzOworICAgIHJlc3VsdF9zaXplc1swXSA9IG1fIC0ga2VybmVsX3ggKyAxOworICAgIHJlc3VsdF9zaXplc1sxXSA9IG5fIC0ga2VybmVsX3kgKyAxOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCByZXN1bHRfc2l6ZXMpOworICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gZGltczsKKyAgICBkaW1zWzBdID0gMDsKKyAgICBkaW1zWzFdID0gMTsKKworICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgeworICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmNvbnZvbHZlKEIsIGRpbXMpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIG51bWJlciBvZiBGTE9QIGV4ZWN1dGVkIHBlciBzZWNvbmQgKGtlcm5lbF9zaXplCisgICAgLy8gbXVsdGlwbGljYXRpb25zIGFuZCBhZGRpdGlvbnMgZm9yIGVhY2ggdmFsdWUgaW4gdGhlIHJlc3VsdGluZyB0ZW5zb3IpCisgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4oMikgKgorICAgICAgICAobV8gLSBrZXJuZWxfeCArIDEpICogKG5fIC0ga2VybmVsX3kgKyAxKSAqIGtlcm5lbF94ICoga2VybmVsX3kgKiBudW1faXRlcnMpOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgYV8gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKG1fICoga18gKiBzaXplb2YoVCkpOworICAgIGJfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShrXyAqIG5fICogc2l6ZW9mKFQpKTsKKyAgICBjXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUobV8gKiBuXyAqIHNpemVvZihUKSk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZW50IG9mIHRoZSBtZW1vcnkgcG9vbHMgdG8gcHJldmVudCBhc2FuIGZyb20KKyAgICAvLyBjb21wbGFpbmluZy4KKyAgICBkZXZpY2VfLm1lbXNldChhXywgMTIsIG1fICoga18gKiBzaXplb2YoVCkpOworICAgIGRldmljZV8ubWVtc2V0KGJfLCAyMywga18gKiBuXyAqIHNpemVvZihUKSk7CisgICAgZGV2aWNlXy5tZW1zZXQoY18sIDMxLCBtXyAqIG5fICogc2l6ZW9mKFQpKTsKKworICAgIC8vQmVuY2htYXJrVXNlUmVhbFRpbWUoKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGZpbmFsaXplQmVuY2htYXJrKGludDY0X3QgbnVtX2l0ZW1zKSB7CisjaWYgZGVmaW5lZChFSUdFTl9VU0VfR1BVKSAmJiBkZWZpbmVkKF9fQ1VEQUNDX18pCisgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNfc2FtZTxEZXZpY2UsIEVpZ2VuOjpHcHVEZXZpY2U+Ojp2YWx1ZSkgeworICAgICAgZGV2aWNlXy5zeW5jaHJvbml6ZSgpOworICAgIH0KKyNlbmRpZgorICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsKKyAgICBTZXRCZW5jaG1hcmtGbG9wc1Byb2Nlc3NlZChudW1faXRlbXMpOworICB9CisKKworICBUZW5zb3JJbmRleCBtXzsKKyAgVGVuc29ySW5kZXgga187CisgIFRlbnNvckluZGV4IG5fOworICBUKiBhXzsKKyAgVCogYl87CisgIFQqIGNfOworICBEZXZpY2UgZGV2aWNlXzsKK307CisjZW5kaWYgIC8vIFRISVJEX1BBUlRZX0VJR0VOM19URU5TT1JfQkVOQ0hNQVJLU19IXwpkaWZmIC0tZ2l0IGEvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19jcHUuY2MgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2NwdS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ3ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19jcHUuY2MKQEAgLTAsMCArMSwxNjggQEAKKyNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInRlbnNvcl9iZW5jaG1hcmtzLmgiCisKKyNkZWZpbmUgQ1JFQVRFX1RIUkVBRF9QT09MKHRocmVhZHMpICAgICAgICAgICAgIFwKK0VpZ2VuOjpUaHJlYWRQb29sIHBvb2wodGhyZWFkcyk7ICAgICAgICAgICAgICAgIFwKK0VpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIGRldmljZSgmcG9vbCwgdGhyZWFkcyk7CisKKy8vIFNpbXBsZSBmdW5jdGlvbnMKKyNkZWZpbmUgQk1fRnVuY0NQVShGVU5DLCBUSFJFQURTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNUSFJFQURTIyNUKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgIFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUkVBVEVfVEhSRUFEX1BPT0woVEhSRUFEUyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6VGhyZWFkUG9vbERldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgTik7IFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQkVOQ0hNQVJLX1JBTkdFKEJNXyMjRlVOQyMjXyMjVEhSRUFEUyMjVCwgMTAsIDUwMDApOworCitCTV9GdW5jQ1BVKG1lbWNweSwgNCk7CitCTV9GdW5jQ1BVKG1lbWNweSwgOCk7CitCTV9GdW5jQ1BVKG1lbWNweSwgMTIpOworCitCTV9GdW5jQ1BVKHR5cGVDYXN0aW5nLCA0KTsKK0JNX0Z1bmNDUFUodHlwZUNhc3RpbmcsIDgpOworQk1fRnVuY0NQVSh0eXBlQ2FzdGluZywgMTIpOworCitCTV9GdW5jQ1BVKHJhbmRvbSwgNCk7CitCTV9GdW5jQ1BVKHJhbmRvbSwgOCk7CitCTV9GdW5jQ1BVKHJhbmRvbSwgMTIpOworCitCTV9GdW5jQ1BVKHNsaWNpbmcsIDQpOworQk1fRnVuY0NQVShzbGljaW5nLCA4KTsKK0JNX0Z1bmNDUFUoc2xpY2luZywgMTIpOworCitCTV9GdW5jQ1BVKHJvd0NoaXAsIDQpOworQk1fRnVuY0NQVShyb3dDaGlwLCA4KTsKK0JNX0Z1bmNDUFUocm93Q2hpcCwgMTIpOworCitCTV9GdW5jQ1BVKGNvbENoaXAsIDQpOworQk1fRnVuY0NQVShjb2xDaGlwLCA4KTsKK0JNX0Z1bmNDUFUoY29sQ2hpcCwgMTIpOworCitCTV9GdW5jQ1BVKHNodWZmbGluZywgNCk7CitCTV9GdW5jQ1BVKHNodWZmbGluZywgOCk7CitCTV9GdW5jQ1BVKHNodWZmbGluZywgMTIpOworCitCTV9GdW5jQ1BVKHBhZGRpbmcsIDQpOworQk1fRnVuY0NQVShwYWRkaW5nLCA4KTsKK0JNX0Z1bmNDUFUocGFkZGluZywgMTIpOworCitCTV9GdW5jQ1BVKHN0cmlkaW5nLCA0KTsKK0JNX0Z1bmNDUFUoc3RyaWRpbmcsIDgpOworQk1fRnVuY0NQVShzdHJpZGluZywgMTIpOworCitCTV9GdW5jQ1BVKGJyb2FkY2FzdGluZywgNCk7CitCTV9GdW5jQ1BVKGJyb2FkY2FzdGluZywgOCk7CitCTV9GdW5jQ1BVKGJyb2FkY2FzdGluZywgMTIpOworCitCTV9GdW5jQ1BVKGNvZWZmV2lzZU9wLCA0KTsKK0JNX0Z1bmNDUFUoY29lZmZXaXNlT3AsIDgpOworQk1fRnVuY0NQVShjb2VmZldpc2VPcCwgMTIpOworCitCTV9GdW5jQ1BVKGFsZ2VicmFpY0Z1bmMsIDQpOworQk1fRnVuY0NQVShhbGdlYnJhaWNGdW5jLCA4KTsKK0JNX0Z1bmNDUFUoYWxnZWJyYWljRnVuYywgMTIpOworCitCTV9GdW5jQ1BVKHRyYW5zY2VuZGVudGFsRnVuYywgNCk7CitCTV9GdW5jQ1BVKHRyYW5zY2VuZGVudGFsRnVuYywgOCk7CitCTV9GdW5jQ1BVKHRyYW5zY2VuZGVudGFsRnVuYywgMTIpOworCitCTV9GdW5jQ1BVKHJvd1JlZHVjdGlvbiwgNCk7CitCTV9GdW5jQ1BVKHJvd1JlZHVjdGlvbiwgOCk7CitCTV9GdW5jQ1BVKHJvd1JlZHVjdGlvbiwgMTIpOworCitCTV9GdW5jQ1BVKGNvbFJlZHVjdGlvbiwgNCk7CitCTV9GdW5jQ1BVKGNvbFJlZHVjdGlvbiwgOCk7CitCTV9GdW5jQ1BVKGNvbFJlZHVjdGlvbiwgMTIpOworCisKKy8vIENvbnRyYWN0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aElucHV0RGltc0NQVShGVU5DLCBEMSwgRDIsIEQzLCBUSFJFQURTKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRDEjI3gjI0QyIyN4IyNEMyMjXyMjVEhSRUFEUyMjVChpbnQgaXRlcnMsIGludCBOKSB7IFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUSFJFQURTID09IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBFaWdlbjo6RGVmYXVsdERldmljZSBkZXZpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpEZWZhdWx0RGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBEMSwgRDIsIEQzKTsgICAgXAorICAgICAgc3VpdGUuRlVOQyhpdGVycyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENSRUFURV9USFJFQURfUE9PTChUSFJFQURTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OlRocmVhZFBvb2xEZXZpY2UsIGZsb2F0PiBzdWl0ZShkZXZpY2UsIEQxLCBEMiwgRDMpOyBcCisgICAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMjI18jI0QxIyN4IyNEMiMjeCMjRDMjI18jI1RIUkVBRFMjI1QsIDEwLCA1MDAwKTsKKworCitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgMSk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgNCk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgOCk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgMTIpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIE4sIE4sIDE2KTsKKworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDY0LCBOLCBOLCAxKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCA2NCwgTiwgTiwgNCk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgNjQsIE4sIE4sIDgpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDY0LCBOLCBOLCAxMik7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgNjQsIE4sIE4sIDE2KTsKKworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIDY0LCBOLCAxKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCA2NCwgTiwgNCk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgNjQsIE4sIDgpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIDY0LCBOLCAxMik7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgNjQsIE4sIDE2KTsKKworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIE4sIDY0LCAxKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCA2NCwgNCk7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgNjQsIDgpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIE4sIDY0LCAxMik7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgNjQsIDE2KTsKKworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDEsIE4sIE4sIDEpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDEsIE4sIE4sIDQpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDEsIE4sIE4sIDgpOworQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIDEsIE4sIE4sIDEyKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCAxLCBOLCBOLCAxNik7CisKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCAxLCAxKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCAxLCA0KTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCAxLCA4KTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCAxLCAxMik7CitCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgMSwgMTYpOworCisKKy8vIENvbnZvbHV0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoRlVOQywgRElNMSwgRElNMiwgVEhSRUFEUykgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yIyNfIyNUSFJFQURTIyNUKGludCBpdGVycywgaW50IE4pIHsgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSRUFURV9USFJFQURfUE9PTChUSFJFQURTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6VGhyZWFkUG9vbERldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgTik7CSAgICAgICBcCisgICAgc3VpdGUuRlVOQyhpdGVycywgRElNMSwgRElNMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQkVOQ0hNQVJLX1JBTkdFKEJNXyMjRlVOQyMjXyMjRElNMSMjeCMjRElNMiMjXyMjVEhSRUFEUyMjVCwgMTI4LCA1MDAwKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCA3LCAxLCA0KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNywgMSwgOCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDcsIDEsIDEyKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCAxLCA3LCA0KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgMSwgNywgOCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDEsIDcsIDEyKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCA3LCA0LCA0KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNywgNCwgOCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDcsIDQsIDEyKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCA0LCA3LCA0KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNCwgNywgOCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDQsIDcsIDEyKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCA3LCA2NCwgNCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDcsIDY0LCA4KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNywgNjQsIDEyKTsKKworQk1fRnVuY1dpdGhLZXJuZWxEaW1zQ1BVKGNvbnZvbHV0aW9uLCA2NCwgNywgNCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoY29udm9sdXRpb24sIDY0LCA3LCA4KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNjQsIDcsIDEyKTsKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3NfZnAxNl9ncHUuY3UgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2ZwMTZfZ3B1LmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Nzg0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2ZwMTZfZ3B1LmN1CkBAIC0wLDAgKzEsNzcgQEAKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaW5jbHVkZSA8Y3VkYS5oPgorI2luY2x1ZGUgPGN1ZGFfcnVudGltZS5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGVuc29yX2JlbmNobWFya3MuaCIKKworLy8gU2ltcGxlIGZ1bmN0aW9ucworI2RlZmluZSBCTV9GdW5jR1BVKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgRWlnZW46OmhhbGY+IHN1aXRlKGRldmljZSwgTik7ICAgICAgICAgICAgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DLCAxMCwgNTAwMCk7CisKK0JNX0Z1bmNHUFUobWVtY3B5KTsKK0JNX0Z1bmNHUFUodHlwZUNhc3RpbmcpOworLy9CTV9GdW5jR1BVKHJhbmRvbSk7CitCTV9GdW5jR1BVKHNsaWNpbmcpOworQk1fRnVuY0dQVShyb3dDaGlwKTsKK0JNX0Z1bmNHUFUoY29sQ2hpcCk7CitCTV9GdW5jR1BVKHNodWZmbGluZyk7CitCTV9GdW5jR1BVKHBhZGRpbmcpOworQk1fRnVuY0dQVShzdHJpZGluZyk7CitCTV9GdW5jR1BVKGJyb2FkY2FzdGluZyk7CitCTV9GdW5jR1BVKGNvZWZmV2lzZU9wKTsKK0JNX0Z1bmNHUFUoYWxnZWJyYWljRnVuYyk7CitCTV9GdW5jR1BVKHRyYW5zY2VuZGVudGFsRnVuYyk7CitCTV9GdW5jR1BVKHJvd1JlZHVjdGlvbik7CitCTV9GdW5jR1BVKGNvbFJlZHVjdGlvbik7CitCTV9GdW5jR1BVKGZ1bGxSZWR1Y3Rpb24pOworCisKKy8vIENvbnRyYWN0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aElucHV0RGltc0dQVShGVU5DLCBEMSwgRDIsIEQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgRWlnZW46OmhhbGY+IHN1aXRlKGRldmljZSwgRDEsIEQyLCBEMyk7ICAgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzLCAxMCwgNTAwMCk7CisKKworQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIE4sIE4sIE4pOworQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIDY0LCBOLCBOKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uLCBOLCA2NCwgTik7CitCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvbiwgTiwgTiwgNjQpOworCisKKy8vIENvbnZvbHV0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoRlVOQywgRElNMSwgRElNMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgRWlnZW46OmhhbGY+IHN1aXRlKGRldmljZSwgTik7ICAgICAgICAgICAgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzLCBESU0xLCBESU0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yLCAxMjgsIDUwMDApOworCisvKgorQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKGNvbnZvbHV0aW9uLCA3LCAxKTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0dQVShjb252b2x1dGlvbiwgMSwgNyk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoY29udm9sdXRpb24sIDcsIDQpOworQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKGNvbnZvbHV0aW9uLCA0LCA3KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0dQVShjb252b2x1dGlvbiwgNywgNjQpOworQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKGNvbnZvbHV0aW9uLCA2NCwgNyk7CisqLwpkaWZmIC0tZ2l0IGEvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19ncHUuY3UgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2dwdS5jdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ2OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19ncHUuY3UKQEAgLTAsMCArMSw3NSBAQAorI2RlZmluZSBFSUdFTl9VU0VfR1BVCisKKyNpbmNsdWRlIDxjdWRhLmg+CisjaW5jbHVkZSA8Y3VkYV9ydW50aW1lLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0ZW5zb3JfYmVuY2htYXJrcy5oIgorCisvLyBTaW1wbGUgZnVuY3Rpb25zCisjZGVmaW5lIEJNX0Z1bmNHUFUoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2aWNlKCZzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6R3B1RGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBOKTsgICAgICAgICAgICAgICAgICBcCisgICAgY3VkYURldmljZVN5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN1aXRlLkZVTkMoaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMsIDEwLCA1MDAwKTsKKworQk1fRnVuY0dQVShtZW1jcHkpOworQk1fRnVuY0dQVSh0eXBlQ2FzdGluZyk7CitCTV9GdW5jR1BVKHJhbmRvbSk7CitCTV9GdW5jR1BVKHNsaWNpbmcpOworQk1fRnVuY0dQVShyb3dDaGlwKTsKK0JNX0Z1bmNHUFUoY29sQ2hpcCk7CitCTV9GdW5jR1BVKHNodWZmbGluZyk7CitCTV9GdW5jR1BVKHBhZGRpbmcpOworQk1fRnVuY0dQVShzdHJpZGluZyk7CitCTV9GdW5jR1BVKGJyb2FkY2FzdGluZyk7CitCTV9GdW5jR1BVKGNvZWZmV2lzZU9wKTsKK0JNX0Z1bmNHUFUoYWxnZWJyYWljRnVuYyk7CitCTV9GdW5jR1BVKHRyYW5zY2VuZGVudGFsRnVuYyk7CitCTV9GdW5jR1BVKHJvd1JlZHVjdGlvbik7CitCTV9GdW5jR1BVKGNvbFJlZHVjdGlvbik7CitCTV9GdW5jR1BVKGZ1bGxSZWR1Y3Rpb24pOworCisKKy8vIENvbnRyYWN0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aElucHV0RGltc0dQVShGVU5DLCBEMSwgRDIsIEQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgRDEsIEQyLCBEMyk7ICAgICAgICAgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzLCAxMCwgNTAwMCk7CisKKworQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIE4sIE4sIE4pOworQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIDY0LCBOLCBOKTsKK0JNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uLCBOLCA2NCwgTik7CitCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvbiwgTiwgTiwgNjQpOworCisKKy8vIENvbnZvbHV0aW9ucworI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoRlVOQywgRElNMSwgRElNMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgTik7ICAgICAgICAgICAgICAgICAgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzLCBESU0xLCBESU0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yLCAxMjgsIDUwMDApOworCitCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoY29udm9sdXRpb24sIDcsIDEpOworQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKGNvbnZvbHV0aW9uLCAxLCA3KTsKK0JNX0Z1bmNXaXRoS2VybmVsRGltc0dQVShjb252b2x1dGlvbiwgNywgNCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoY29udm9sdXRpb24sIDQsIDcpOworQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKGNvbnZvbHV0aW9uLCA3LCA2NCk7CitCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoY29udm9sdXRpb24sIDY0LCA3KTsKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3Nfc3ljbC5jYyBiL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3Nfc3ljbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNhNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19zeWNsLmNjCkBAIC0wLDAgKzEsMzcgQEAKKyNkZWZpbmUgRUlHRU5fVVNFX1NZQ0wKKworI2luY2x1ZGUgPFNZQ0wvc3ljbC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0ZW5zb3JfYmVuY2htYXJrcy5oIgorCit1c2luZyBFaWdlbjo6YXJyYXk7Cit1c2luZyBFaWdlbjo6U3ljbERldmljZTsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yTWFwOworLy8gU2ltcGxlIGZ1bmN0aW9ucwordGVtcGxhdGUgPHR5cGVuYW1lIGRldmljZV9zZWxlY3Rvcj4KK2NsOjpzeWNsOjpxdWV1ZSBzeWNsX3F1ZXVlKCkgeworICByZXR1cm4gY2w6OnN5Y2w6OnF1ZXVlKGRldmljZV9zZWxlY3RvcigpLCBbPV0oY2w6OnN5Y2w6OmV4Y2VwdGlvbl9saXN0IGwpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBsKSB7CisgICAgICB0cnkgeworICAgICAgICBzdGQ6OnJldGhyb3dfZXhjZXB0aW9uKGUpOworICAgICAgfSBjYXRjaCAoY2w6OnN5Y2w6OmV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgfQorICB9KTsKK30KKworI2RlZmluZSBCTV9GdW5jR1BVKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsOjpzeWNsOjpxdWV1ZSBxID0gc3ljbF9xdWV1ZTxjbDo6c3ljbDo6Z3B1X3NlbGVjdG9yPigpOyAgXAorICAgIEVpZ2VuOjpTeWNsRGV2aWNlIGRldmljZShxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpTeWNsRGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBOKTsgXAorICAgIHN1aXRlLkZVTkMoaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DLCAxMCwgNTAwMCk7CisKK0JNX0Z1bmNHUFUoYnJvYWRjYXN0aW5nKTsKK0JNX0Z1bmNHUFUoY29lZmZXaXNlT3ApOwpkaWZmIC0tZ2l0IGEvYmVuY2gvdmR3X25ldy5jcHAgYi9iZW5jaC92ZHdfbmV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjYwNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvdmR3X25ldy5jcHAKQEAgLTAsMCArMSw1NiBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBTQ0FMQVIKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CisjZW5kaWYKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAKKyNlbmRpZgorCit0eXBlZGVmIE1hdHJpeDxTQ0FMQVIsIEVpZ2VuOjpEeW5hbWljLCAxPiBWZWM7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK1NDQUxBUiBFX1ZEVyhjb25zdCBWZWMgJmludGVyYWN0aW9uczEsIGNvbnN0IFZlYyAmaW50ZXJhY3Rpb25zMikKK3sKKyAgcmV0dXJuIChpbnRlcmFjdGlvbnMyLmN3aXNlKCkvaW50ZXJhY3Rpb25zMSkKKyAgICAgICAgIC5jd2lzZSgpLmN1YmUoKQorICAgICAgICAgLmN3aXNlKCkuc3F1YXJlKCkKKyAgICAgICAgIC5jd2lzZSgpLnNxdWFyZSgpCisgICAgICAgICAuc3VtKCk7Cit9CisKK2ludCBtYWluKCkgCit7CisgIC8vCisgIC8vICAgICAgICAgIDEgICAyICAgMyAgIDQgIC4uLiAoaW50ZXJhY3Rpb25zKQorICAvLyBrYSAgICAgICAuICAgLiAgIC4gICAuICAuLi4KKyAgLy8gcmFiICAgICAgLiAgIC4gICAuICAgLiAgLi4uCisgIC8vIGVuZXJneSAgIC4gICAuICAgLiAgIC4gIC4uLgorICAvLyAuLi4gICAgIC4uLiAuLi4gLi4uIC4uLiAuLi4KKyAgLy8gKHZhcmlhYmxlcworICAvLyAgICBmb3IKKyAgLy8gaW50ZXJhY3Rpb24pCisgIC8vCisgIFZlYyBpbnRlcmFjdGlvbnMxKFNJWkUpLCBpbnRlcmFjdGlvbnMyKFNJWkUpOyAvLyBTSVpFIGlzIHRoZSBudW1iZXIgb2YgdmR3IGludGVyYWN0aW9ucyBpbiBvdXIgc3lzdGVtCisgIC8vIFNldHVwQ2FsY3VsYXRpb25zKCkKKyAgU0NBTEFSIHJhYiA9IDEuMDsgIAorICBpbnRlcmFjdGlvbnMxLnNldENvbnN0YW50KDIuNCk7CisgIGludGVyYWN0aW9uczIuc2V0Q29uc3RhbnQocmFiKTsKKyAgCisgIC8vIEVuZXJneSgpCisgIFNDQUxBUiBlbmVyZ3kgPSAwLjA7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpPFJFUEVBVDsgKytpKSB7CisgICAgZW5lcmd5ICs9IEVfVkRXKGludGVyYWN0aW9uczEsIGludGVyYWN0aW9uczIpOworICAgIGVuZXJneSAqPSAxICsgMWUtMjAgKiBpOyAvLyBwcmV2ZW50IGNvbXBpbGVyIGZyb20gb3B0aW1pemluZyB0aGUgbG9vcAorICB9CisgIGNvdXQgPDwgImVuZXJneSA9ICIgPDwgZW5lcmd5IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9ibGFzL0FuZHJvaWQuYnAgYi9ibGFzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhZjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJlaWdlbi1kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgICAgICJkb3VibGUuY3BwIiwKKyAgICAgICAgImNvbXBsZXhfc2luZ2xlLmNwcCIsCisgICAgICAgICJjb21wbGV4X2RvdWJsZS5jcHAiLAorICAgICAgICAieGVyYmxhLmNwcCIsCisgICAgICAgICJmMmMvY29tcGxleGRvdHMuYyIsCisgICAgICAgICJmMmMvc3JvdG0uYyIsCisgICAgICAgICJmMmMvc3JvdG1nLmMiLAorICAgICAgICAiZjJjL2Ryb3RtLmMiLAorICAgICAgICAiZjJjL2Ryb3RtZy5jIiwKKyAgICAgICAgImYyYy9sc2FtZS5jIiwKKyAgICAgICAgImYyYy9kc3Btdi5jIiwKKyAgICAgICAgImYyYy9zc2Jtdi5jIiwKKyAgICAgICAgImYyYy9jaGJtdi5jIiwKKyAgICAgICAgImYyYy9zc3Btdi5jIiwKKyAgICAgICAgImYyYy96aGJtdi5jIiwKKyAgICAgICAgImYyYy9jaHBtdi5jIiwKKyAgICAgICAgImYyYy9kc2Jtdi5jIiwKKyAgICAgICAgImYyYy96aHBtdi5jIiwKKyAgICAgICAgImYyYy9kdGJtdi5jIiwKKyAgICAgICAgImYyYy9zdGJtdi5jIiwKKyAgICAgICAgImYyYy9jdGJtdi5jIiwKKyAgICAgICAgImYyYy96dGJtdi5jIiwKKyAgICAgICAgImYyYy9kX2NuamcuYyIsCisgICAgICAgICJmMmMvcl9jbmpnLmMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIKKyAgICBdLAorICAgIHRpZHlfY2hlY2tzOiBbCisgICAgICAgICItZ29vZ2xlLWdsb2JhbC1uYW1lcy1pbi1oZWFkZXJzIiwKKyAgICAgICAgIi1taXNjLW1hY3JvLXBhcmVudGhlc2VzIiwKKyAgICAgICAgIi1taXNjLW1pc3BsYWNlZC13aWRlbmluZy1jYXN0IiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYkY3N2JsYXMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiZWlnZW4tZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworLy8gQnVpbGQgRWlnZW4gdXNpbmcgQVBJIDkgdG9vbGNoYWluIGZvciBSUyBTdXBwb3J0IGxpYi4KK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliRjc3Ymxhc1Y4IiwKKyAgICBkZWZhdWx0czogWyJlaWdlbi1kZWZhdWx0cyJdLAorICAgIHNka192ZXJzaW9uOiAiOSIsCisgICAgc3RsOiAiYysrX3N0YXRpYyIsCit9CmRpZmYgLS1naXQgYS9ibGFzL0FuZHJvaWQubWsgYi9ibGFzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0YWU5NgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU2IEBACisjIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorZWlnZW5fU1JDX0ZJTEVTOj0gXAorCXNpbmdsZS5jcHAgXAorCWRvdWJsZS5jcHAgXAorCWNvbXBsZXhfc2luZ2xlLmNwcCBcCisJY29tcGxleF9kb3VibGUuY3BwIFwKKwl4ZXJibGEuY3BwIFwKKwlmMmMvY29tcGxleGRvdHMuY1wKKwlmMmMvc3JvdG0uYyBcCisJZjJjL3Nyb3RtZy5jIFwKKwlmMmMvZHJvdG0uYyBcCisJZjJjL2Ryb3RtZy5jIFwKKwlmMmMvbHNhbWUuYyAgXAorCWYyYy9kc3Btdi5jIFwKKwlmMmMvc3NibXYuYyBcCisJZjJjL2NoYm12LmMgIFwKKwlmMmMvc3NwbXYuYyBcCisJZjJjL3poYm12LmMgIFwKKwlmMmMvY2hwbXYuYyBcCisJZjJjL2RzYm12LmMgXAorCWYyYy96aHBtdi5jIFwKKwlmMmMvZHRibXYuYyBcCisJZjJjL3N0Ym12LmMgXAorCWYyYy9jdGJtdi5jIFwKKwlmMmMvenRibXYuYyBcCisJZjJjL2RfY25qZy5jIFwKKwlmMmMvcl9jbmpnLmMKK0xPQ0FMX0NMQU5HIDo9IHRydWUKK0xPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX01PRFVMRSA6PSBsaWJGNzdibGFzCitMT0NBTF9TUkNfRklMRVMgOj0gJChlaWdlbl9TUkNfRklMRVMpCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL2VpZ2VuLworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorIyBCdWlsZCBFaWdlbiB1c2luZyBBUEkgOSB0b29sY2hhaW4gZm9yIFJTIFN1cHBvcnQgbGliLgoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DTEFORyA6PSB0cnVlCitMT0NBTF9NT0RVTEUgOj0gbGliRjc3Ymxhc1Y4CitMT0NBTF9TREtfVkVSU0lPTiA6PSA5CitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gYysrX3N0YXRpYworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZWlnZW5fU1JDX0ZJTEVTKQorTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9laWdlbi8KK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2JsYXMvQmFuZFRyaWFuZ3VsYXJTb2x2ZXIuaCBiL2JsYXMvQmFuZFRyaWFuZ3VsYXJTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJkNzRkCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9CYW5kVHJpYW5ndWxhclNvbHZlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CQU5EX1RSSUFOR1VMQVJTT0xWRVJfSAorI2RlZmluZSBFSUdFTl9CQU5EX1RSSUFOR1VMQVJTT0xWRVJfSAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisgLyogXGludGVybmFsCisgICogU29sdmUgQXg9YiB3aXRoIEEgYSBiYW5kIHRyaWFuZ3VsYXIgbWF0cml4CisgICogVE9ETzogZXh0ZW5kIGl0IHRvIG1hdHJpY2VzIGZvciB4IGFiZCBiICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgYmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yOworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsUm93TWFqb3I+Cit7CisgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IExoc01hcDsKKyAgdHlwZWRlZiBNYXA8TWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4gUmhzTWFwOworICBlbnVtIHsgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA/IDEgOiAwIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBrLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgUmhzU2NhbGFyKiBfb3RoZXIpCisgIHsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMsc2l6ZSxrKzEsT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsKKyAgICBSaHNNYXAgb3RoZXIoX290aGVyLHNpemUsMSk7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25qTGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDd2lzZVVuYXJ5T3A8dHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8TGhzU2NhbGFyPixMaHNNYXA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaHNNYXAmPgorICAgICAgICAgICAgICAgICAgICAgICAgOjp0eXBlIGNqTGhzKGxocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBmb3IoaW50IGNvbD0wIDsgY29sPG90aGVyLmNvbHMoKSA7ICsrY29sKQorICAgIHsKKyAgICAgIGZvcihpbnQgaWk9MDsgaWk8c2l6ZTsgKytpaSkKKyAgICAgIHsKKyAgICAgICAgaW50IGkgPSBJc0xvd2VyID8gaWkgOiBzaXplLWlpLTE7CisgICAgICAgIGludCBhY3R1YWxfayA9IChzdGQ6Om1pbikoayxpaSk7CisgICAgICAgIGludCBhY3R1YWxfc3RhcnQgPSBJc0xvd2VyID8gay1hY3R1YWxfayA6IDE7CisgICAgICAgIAorICAgICAgICBpZihhY3R1YWxfaz4wKQorICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksY29sKSAtPSBjakxocy5yb3coaSkuc2VnbWVudChhY3R1YWxfc3RhcnQsYWN0dWFsX2spLnRyYW5zcG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmN3aXNlUHJvZHVjdChvdGhlci5jb2woY29sKS5zZWdtZW50KElzTG93ZXIgPyBpLWFjdHVhbF9rIDogaSsxLGFjdHVhbF9rKSkuc3VtKCk7CisKKyAgICAgICAgaWYoKE1vZGUmVW5pdERpYWcpPT0wKQorICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksY29sKSAvPSBjakxocyhpLElzTG93ZXIgPyBrIDogMCk7CisgICAgICB9CisgICAgfQorICB9CisgIAorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxJbmRleCxNb2RlLExoc1NjYWxhcixDb25qTGhzLFJoc1NjYWxhcixDb2xNYWpvcj4KK3sKKyAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTGhzTWFwOworICB0eXBlZGVmIE1hcDxNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPiBSaHNNYXA7CisgIGVudW0geyBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID8gMSA6IDAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIEluZGV4IGssIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIF9vdGhlcikKKyAgeworICAgIGNvbnN0IExoc01hcCBsaHMoX2xocyxrKzEsc2l6ZSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworICAgIFJoc01hcCBvdGhlcihfb3RoZXIsc2l6ZSwxKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmpMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LExoc01hcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExoc01hcCY+CisgICAgICAgICAgICAgICAgICAgICAgICA6OnR5cGUgY2pMaHMobGhzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvcihpbnQgY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgZm9yKGludCBpaT0wOyBpaTxzaXplOyArK2lpKQorICAgICAgeworICAgICAgICBpbnQgaSA9IElzTG93ZXIgPyBpaSA6IHNpemUtaWktMTsKKyAgICAgICAgaW50IGFjdHVhbF9rID0gKHN0ZDo6bWluKShrLHNpemUtaWktMSk7CisgICAgICAgIGludCBhY3R1YWxfc3RhcnQgPSBJc0xvd2VyID8gMSA6IGstYWN0dWFsX2s7CisgICAgICAgIAorICAgICAgICBpZigoTW9kZSZVbml0RGlhZyk9PTApCisgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC89IGNqTGhzKElzTG93ZXIgPyAwIDogaywgaSk7CisKKyAgICAgICAgaWYoYWN0dWFsX2s+MCkKKyAgICAgICAgICBvdGhlci5jb2woY29sKS5zZWdtZW50KElzTG93ZXIgPyBpKzEgOiBpLWFjdHVhbF9rLCBhY3R1YWxfaykKKyAgICAgICAgICAgICAgLT0gb3RoZXIuY29lZmYoaSxjb2wpICogY2pMaHMuY29sKGkpLnNlZ21lbnQoYWN0dWFsX3N0YXJ0LGFjdHVhbF9rKTsKKyAgICAgICAgCisgICAgICB9CisgICAgfQorICB9Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgLy8gRUlHRU5fQkFORF9UUklBTkdVTEFSU09MVkVSX0gKZGlmZiAtLWdpdCBhL2JsYXMvQ01ha2VMaXN0cy50eHQgYi9ibGFzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWZiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTUgQEAKKworcHJvamVjdChFaWdlbkJsYXMgQ1hYKQorCitpbmNsdWRlKCIuLi9jbWFrZS9sYW5ndWFnZV9zdXBwb3J0LmNtYWtlIikKKword29ya2Fyb3VuZF85MjIwKEZvcnRyYW4gRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKworaWYoRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKyAgZW5hYmxlX2xhbmd1YWdlKEZvcnRyYW4gT1BUSU9OQUwpCisgIGlmKE5PVCBDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSKQorICAgIHNldChFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTIE9GRikKKyAgZW5kaWYoKQorZW5kaWYoKQorCithZGRfY3VzdG9tX3RhcmdldChibGFzKQorCitzZXQoRWlnZW5CbGFzX1NSQ1MgIHNpbmdsZS5jcHAgZG91YmxlLmNwcCBjb21wbGV4X3NpbmdsZS5jcHAgY29tcGxleF9kb3VibGUuY3BwIHhlcmJsYS5jcHAKKyAgICAgICAgICAgICAgICAgICAgZjJjL3Nyb3RtLmMgICBmMmMvc3JvdG1nLmMgIGYyYy9kcm90bS5jIGYyYy9kcm90bWcuYworICAgICAgICAgICAgICAgICAgICBmMmMvbHNhbWUuYyAgIGYyYy9kc3Btdi5jICAgZjJjL3NzYm12LmMgZjJjL2NoYm12LmMKKyAgICAgICAgICAgICAgICAgICAgZjJjL3NzcG12LmMgICBmMmMvemhibXYuYyAgIGYyYy9jaHBtdi5jIGYyYy9kc2Jtdi5jCisgICAgICAgICAgICAgICAgICAgIGYyYy96aHBtdi5jICAgZjJjL2R0Ym12LmMgICBmMmMvc3RibXYuYyBmMmMvY3RibXYuYworICAgICAgICAgICAgICAgICAgICBmMmMvenRibXYuYyAgIGYyYy9kX2NuamcuYyAgZjJjL3JfY25qZy5jCisgICApCisKK2lmIChFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorICBzZXQoRWlnZW5CbGFzX1NSQ1MgJHtFaWdlbkJsYXNfU1JDU30gZm9ydHJhbi9jb21wbGV4ZG90cy5mKQorZWxzZSgpCisgIHNldChFaWdlbkJsYXNfU1JDUyAke0VpZ2VuQmxhc19TUkNTfSBmMmMvY29tcGxleGRvdHMuYykKK2VuZGlmKCkKKworYWRkX2xpYnJhcnkoZWlnZW5fYmxhc19zdGF0aWMgJHtFaWdlbkJsYXNfU1JDU30pCithZGRfbGlicmFyeShlaWdlbl9ibGFzIFNIQVJFRCAke0VpZ2VuQmxhc19TUkNTfSkKKworaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhlaWdlbl9ibGFzX3N0YXRpYyAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGVpZ2VuX2JsYXMgICAgICAgICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorZW5kaWYoKQorCithZGRfZGVwZW5kZW5jaWVzKGJsYXMgZWlnZW5fYmxhcyBlaWdlbl9ibGFzX3N0YXRpYykKKworaW5zdGFsbChUQVJHRVRTIGVpZ2VuX2JsYXMgZWlnZW5fYmxhc19zdGF0aWMKKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4KKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiBsaWIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiBsaWIpCisKK2lmKEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MpCisKK2lmKEVJR0VOX0xFQVZFX1RFU1RfSU5fQUxMX1RBUkdFVCkKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0aW5nKSAjIGNhbid0IGRvIEVYQ0xVREVfRlJPTV9BTEwgaGVyZSwgYnJlYWtzIENUZXN0CitlbHNlKCkKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0aW5nIEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZigpCisKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvYmxhcy9HZW5lcmFsUmFuazFVcGRhdGUuaCBiL2JsYXMvR2VuZXJhbFJhbmsxVXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMzg4YwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvR2VuZXJhbFJhbmsxVXBkYXRlLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUkFMX1JBTksxVVBEQVRFX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJBTF9SQU5LMVVQREFURV9ICisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qIE9wdGltaXplZCBtYXRyaXggKz0gYWxwaGEgKiB1dicgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgorc3RydWN0IGdlbmVyYWxfcmFuazFfdXBkYXRlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsQ29sTWFqb3IsQ29uakxocyxDb25qUmhzPgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IE90aGVyTWFwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpMaHMsT3RoZXJNYXA+Ojp0eXBlIENvbmpSaHNUeXBlOworICAgIGNvbmpfaWY8Q29ualJocz4gY2o7CisKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxjb2xzOyArK2kpCisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4obWF0K3N0cmlkZSppLHJvd3MpICs9IGFscGhhICogY2oodltpXSkgKiBDb25qUmhzVHlwZShPdGhlck1hcCh1LHJvd3MpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3QgZ2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LFJvd01ham9yLENvbmpMaHMsQ29ualJocz4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIFNjYWxhciogbWF0LCBJbmRleCBzdHJpZGUsIGNvbnN0IFNjYWxhciogdSwgY29uc3QgU2NhbGFyKiB2LCBTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsQ29sTWFqb3IsQ29ualJocyxDb25qUmhzPjo6cnVuKHJvd3MsY29scyxtYXQsc3RyaWRlLHUsdixhbHBoYSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9SQU5LMVVQREFURV9ICmRpZmYgLS1naXQgYS9ibGFzL1BhY2tlZFNlbGZhZGpvaW50UHJvZHVjdC5oIGIvYmxhcy9QYWNrZWRTZWxmYWRqb2ludFByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMyN2EyCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9QYWNrZWRTZWxmYWRqb2ludFByb2R1Y3QuaApAQCAtMCwwICsxLDUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBDaGVuLVBhbmcgSGUgPGpkaDhAbXM2My5oaW5ldC5uZXQ+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEZBREpPSU5UX1BBQ0tFRF9QUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRfUEFDS0VEX1BST0RVQ1RfSAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgbWF0cml4ICs9IGFscGhhICogdXYnCisgKiBUaGUgbWF0cml4IGlzIGluIHBhY2tlZCBmb3JtLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8sIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgorc3RydWN0IHNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LENvbE1ham9yLFVwTG8sQ29uakxocyxDb25qUmhzPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBTY2FsYXIqIG1hdCwgY29uc3QgU2NhbGFyKiB2ZWMsIFJlYWxTY2FsYXIgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBPdGhlck1hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLE90aGVyTWFwPjo6dHlwZSBDb25qUmhzVHlwZTsKKyAgICBjb25qX2lmPENvbmpSaHM+IGNqOworCisgICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQsIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpICs9IGFscGhhICogY2oodmVjW2ldKSAqIENvbmpSaHNUeXBlKE90aGVyTWFwKHZlYysoVXBMbz09TG93ZXIgPyBpIDogMCksIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpKTsKKyAgICAgIC8vRklYTUUgVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBvdXRzaWRlLgorICAgICAgbWF0W1VwTG89PUxvd2VyID8gMCA6IGldID0gbnVtZXh0OjpyZWFsKG1hdFtVcExvPT1Mb3dlciA/IDAgOiBpXSk7CisgICAgICBtYXQgKz0gVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBzZWxmYWRqb2ludF9wYWNrZWRfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxSb3dNYWpvcixVcExvLENvbmpMaHMsQ29ualJocz4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIGNvbnN0IFNjYWxhciogdmVjLCBSZWFsU2NhbGFyIGFscGhhKQorICB7CisgICAgc2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsQ29sTWFqb3IsVXBMbz09TG93ZXI/VXBwZXI6TG93ZXIsQ29ualJocyxDb25qTGhzPjo6cnVuKHNpemUsbWF0LHZlYyxhbHBoYSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfUEFDS0VEX1BST0RVQ1RfSApkaWZmIC0tZ2l0IGEvYmxhcy9QYWNrZWRUcmlhbmd1bGFyTWF0cml4VmVjdG9yLmggYi9ibGFzL1BhY2tlZFRyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM5NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9QYWNrZWRUcmlhbmd1bGFyTWF0cml4VmVjdG9yLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQUNLRURfVFJJQU5HVUxBUl9NQVRSSVhfVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fUEFDS0VEX1RSSUFOR1VMQVJfTUFUUklYX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qUmhzLCBpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHM+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LE1vZGUsTGhzU2NhbGFyLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHMsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKyAgZW51bSB7CisgICAgSXNMb3dlciAgICAgPSAoTW9kZSAmIExvd2VyKSAgID09TG93ZXIsCisgICAgSGFzVW5pdERpYWcgPSAoTW9kZSAmIFVuaXREaWFnKT09VW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKT09WmVyb0RpYWcKKyAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogbGhzLCBjb25zdCBSaHNTY2FsYXIqIHJocywgUmVzU2NhbGFyKiByZXMsIFJlc1NjYWxhciBhbHBoYSkKKyAgeworICAgIGludGVybmFsOjpjb25qX2lmPENvbmpSaHM+IGNqOworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYywxPiA+IExoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLExoc01hcD46OnR5cGUgQ29uakxoc1R5cGU7CisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+ID4gUmVzTWFwOworCisgICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIEluZGV4IHMgPSBJc0xvd2VyJiYoSGFzVW5pdERpYWd8fEhhc1plcm9EaWFnKSA/IDEgOiAwOworICAgICAgSW5kZXggciA9IElzTG93ZXIgPyBzaXplLWk6IGkrMTsKKyAgICAgIGlmIChFSUdFTl9JTVBMSUVTKEhhc1VuaXREaWFnfHxIYXNaZXJvRGlhZywgKC0tcik+MCkpCisJUmVzTWFwKHJlcysoSXNMb3dlciA/IHMraSA6IDApLHIpICs9IGFscGhhICogY2oocmhzW2ldKSAqIENvbmpMaHNUeXBlKExoc01hcChsaHMrcyxyKSk7CisgICAgICBpZiAoSGFzVW5pdERpYWcpCisJcmVzW2ldICs9IGFscGhhICogY2oocmhzW2ldKTsKKyAgICAgIGxocyArPSBJc0xvd2VyID8gc2l6ZS1pOiBpKzE7CisgICAgfQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHM+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LE1vZGUsTGhzU2NhbGFyLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHMsUm93TWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2NhbGFyQmluYXJ5T3BUcmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKyAgZW51bSB7CisgICAgSXNMb3dlciAgICAgPSAoTW9kZSAmIExvd2VyKSAgID09TG93ZXIsCisgICAgSGFzVW5pdERpYWcgPSAoTW9kZSAmIFVuaXREaWFnKT09VW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKT09WmVyb0RpYWcKKyAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogbGhzLCBjb25zdCBSaHNTY2FsYXIqIHJocywgUmVzU2NhbGFyKiByZXMsIFJlc1NjYWxhciBhbHBoYSkKKyAgeworICAgIGludGVybmFsOjpjb25qX2lmPENvbmpSaHM+IGNqOworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYywxPiA+IExoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLExoc01hcD46OnR5cGUgQ29uakxoc1R5cGU7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4gUmhzTWFwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpSaHMsUmhzTWFwPjo6dHlwZSBDb25qUmhzVHlwZTsKKworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICBJbmRleCBzID0gIUlzTG93ZXImJihIYXNVbml0RGlhZ3x8SGFzWmVyb0RpYWcpID8gMSA6IDA7CisgICAgICBJbmRleCByID0gSXNMb3dlciA/IGkrMSA6IHNpemUtaTsKKyAgICAgIGlmIChFSUdFTl9JTVBMSUVTKEhhc1VuaXREaWFnfHxIYXNaZXJvRGlhZywgKC0tcik+MCkpCisJcmVzW2ldICs9IGFscGhhICogKENvbmpMaHNUeXBlKExoc01hcChsaHMrcyxyKSkuY3dpc2VQcm9kdWN0KENvbmpSaHNUeXBlKFJoc01hcChyaHMrKElzTG93ZXIgPyAwIDogcytpKSxyKSkpKS5zdW0oKTsKKyAgICAgIGlmIChIYXNVbml0RGlhZykKKwlyZXNbaV0gKz0gYWxwaGEgKiBjaihyaHNbaV0pOworICAgICAgbGhzICs9IElzTG93ZXIgPyBpKzEgOiBzaXplLWk7CisgICAgfQorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRURfVFJJQU5HVUxBUl9NQVRSSVhfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2JsYXMvUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oIGIvYmxhcy9QYWNrZWRUcmlhbmd1bGFyU29sdmVyVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwYmI0YgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIENoZW4tUGFuZyBIZSA8amRoOEBtczYzLmhpbmV0Lm5ldD4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFDS0VEX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFRF9UUklBTkdVTEFSX1NPTFZFUl9WRUNUT1JfSAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTaWRlLCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yOworCisvLyBmb3J3YXJkIGFuZCBiYWNrd2FyZCBzdWJzdGl0dXRpb24sIHJvdy1tYWpvciwgcmhzIGlzIGEgdmVjdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZT4KK3N0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIEluZGV4LCBPblRoZUxlZnQsIE1vZGUsIENvbmp1Z2F0ZSwgUm93TWFqb3I+Cit7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcik9PUxvd2VyCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIGxocywgUmhzU2NhbGFyKiByaHMpCisgIHsKKyAgICBpbnRlcm5hbDo6Y29ual9pZjxDb25qdWdhdGU+IGNqOworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYywxPiA+IExoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qdWdhdGUsTGhzTWFwPjo6dHlwZSBDb25qTGhzVHlwZTsKKworICAgIGxocyArPSBJc0xvd2VyID8gMCA6IChzaXplKihzaXplKzEpPj4xKS0xOworICAgIGZvcihJbmRleCBwaT0wOyBwaTxzaXplOyArK3BpKQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBJc0xvd2VyID8gcGkgOiBzaXplLXBpLTE7CisgICAgICBJbmRleCBzID0gSXNMb3dlciA/IDAgOiAxOworICAgICAgaWYgKHBpPjApCisJcmhzW2ldIC09IChDb25qTGhzVHlwZShMaHNNYXAobGhzK3MscGkpKQorCSAgICAuY3dpc2VQcm9kdWN0KE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPihyaHMrKElzTG93ZXIgPyAwIDogaSsxKSxwaSkpKS5zdW0oKTsKKyAgICAgIGlmICghKE1vZGUgJiBVbml0RGlhZykpCisJcmhzW2ldIC89IGNqKGxoc1tJc0xvd2VyID8gaSA6IDBdKTsKKyAgICAgIElzTG93ZXIgPyBsaHMgKz0gcGkrMSA6IGxocyAtPSBwaSsyOworICAgIH0KKyAgfQorfTsKKworLy8gZm9yd2FyZCBhbmQgYmFja3dhcmQgc3Vic3RpdHV0aW9uLCBjb2x1bW4tbWFqb3IsIHJocyBpcyBhIHZlY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGU+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVMZWZ0LCBNb2RlLCBDb25qdWdhdGUsIENvbE1ham9yPgoreworICBlbnVtIHsKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpPT1Mb3dlcgorICB9OworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBsaHMsIFJoc1NjYWxhciogcmhzKQorICB7CisgICAgaW50ZXJuYWw6OmNvbmpfaWY8Q29uanVnYXRlPiBjajsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsMT4gPiBMaHNNYXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29uanVnYXRlLExoc01hcD46OnR5cGUgQ29uakxoc1R5cGU7CisKKyAgICBsaHMgKz0gSXNMb3dlciA/IDAgOiBzaXplKihzaXplLTEpPj4xOworICAgIGZvcihJbmRleCBwaT0wOyBwaTxzaXplOyArK3BpKQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBJc0xvd2VyID8gcGkgOiBzaXplLXBpLTE7CisgICAgICBJbmRleCByID0gc2l6ZSAtIHBpIC0gMTsKKyAgICAgIGlmICghKE1vZGUgJiBVbml0RGlhZykpCisJcmhzW2ldIC89IGNqKGxoc1tJc0xvd2VyID8gMCA6IGldKTsKKyAgICAgIGlmIChyPjApCisJTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+KHJocysoSXNMb3dlcj8gaSsxIDogMCkscikgLT0KKwkgICAgcmhzW2ldICogQ29uakxoc1R5cGUoTGhzTWFwKGxocysoSXNMb3dlcj8gMSA6IDApLHIpKTsKKyAgICAgIElzTG93ZXIgPyBsaHMgKz0gc2l6ZS1waSA6IGxocyAtPSByOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVSaWdodCwgTW9kZSwgQ29uanVnYXRlLCBTdG9yYWdlT3JkZXI+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIGxocywgUmhzU2NhbGFyKiByaHMpCisgIHsKKyAgICBwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8TGhzU2NhbGFyLFJoc1NjYWxhcixJbmRleCxPblRoZUxlZnQsCisJKChNb2RlJlVwcGVyKT09VXBwZXIgPyBMb3dlciA6IFVwcGVyKSB8IChNb2RlJlVuaXREaWFnKSwKKwlDb25qdWdhdGUsU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcj9Db2xNYWpvcjpSb3dNYWpvcgorICAgICAgPjo6cnVuKHNpemUsIGxocywgcmhzKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAvLyBFSUdFTl9QQUNLRURfVFJJQU5HVUxBUl9TT0xWRVJfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2JsYXMvUkVBRE1FLnR4dCBiL2JsYXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E1MjAzCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNiBAQAorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIEJMQVMgbGlicmFyeSBidWlsdCBvbiB0b3Agb2YgRWlnZW4uCisKK1RoaXMgbW9kdWxlIGlzIG5vdCBidWlsdCBieSBkZWZhdWx0LiBJbiBvcmRlciB0byBjb21waWxlIGl0LCB5b3UgbmVlZCB0bwordHlwZSAnbWFrZSBibGFzJyBmcm9tIHdpdGhpbiB5b3VyIGJ1aWxkIGRpci4KKwpkaWZmIC0tZ2l0IGEvYmxhcy9SYW5rMlVwZGF0ZS5oIGIvYmxhcy9SYW5rMlVwZGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQ3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL1JhbmsyVXBkYXRlLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SQU5LMlVQREFURV9ICisjZGVmaW5lIEVJR0VOX1JBTksyVVBEQVRFX0gKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyogT3B0aW1pemVkIHNlbGZhZGpvaW50IG1hdHJpeCArPSBhbHBoYSAqIHV2JyArIGNvbmooYWxwaGEpKnZ1JworICogVGhpcyBpcyB0aGUgbG93LWxldmVsIHZlcnNpb24gb2YgU2VsZmFkam9pbnRSYW5rMlVwZGF0ZS5oCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvPgorc3RydWN0IHJhbmsyX3VwZGF0ZV9zZWxlY3RvcgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IE90aGVyTWFwOworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4obWF0K3N0cmlkZSppKyhVcExvPT1Mb3dlciA/IGkgOiAwKSwgVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSkgKz0KKyAgICAgIG51bWV4dDo6Y29uaihhbHBoYSkgKiBudW1leHQ6OmNvbmoodVtpXSkgKiBPdGhlck1hcCh2KyhVcExvPT1Mb3dlciA/IGkgOiAwKSwgVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSkKKyAgICAgICAgICAgICAgICArIGFscGhhICogbnVtZXh0Ojpjb25qKHZbaV0pICogT3RoZXJNYXAodSsoVXBMbz09TG93ZXIgPyBpIDogMCksIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpOworICAgIH0KKyAgfQorfTsKKworLyogT3B0aW1pemVkIHNlbGZhZGpvaW50IG1hdHJpeCArPSBhbHBoYSAqIHV2JyArIGNvbmooYWxwaGEpKnZ1JworICogVGhlIG1hdHJpeCBpcyBpbiBwYWNrZWQgZm9ybS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8+CitzdHJ1Y3QgcGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvcgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIGNvbnN0IFNjYWxhciogdSwgY29uc3QgU2NhbGFyKiB2LCBTY2FsYXIgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBPdGhlck1hcDsKKyAgICBJbmRleCBvZmZzZXQgPSAwOworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICB7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4obWF0K29mZnNldCwgVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSkgKz0KKyAgICAgIG51bWV4dDo6Y29uaihhbHBoYSkgKiBudW1leHQ6OmNvbmoodVtpXSkgKiBPdGhlck1hcCh2KyhVcExvPT1Mb3dlciA/IGkgOiAwKSwgVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSkKKyAgICAgICAgICAgICAgICArIGFscGhhICogbnVtZXh0Ojpjb25qKHZbaV0pICogT3RoZXJNYXAodSsoVXBMbz09TG93ZXIgPyBpIDogMCksIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpOworICAgICAgLy9GSVhNRSBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIG91dHNpZGUuCisgICAgICBtYXRbb2Zmc2V0KyhVcExvPT1Mb3dlciA/IDAgOiBpKV0gPSBudW1leHQ6OnJlYWwobWF0W29mZnNldCsoVXBMbz09TG93ZXIgPyAwIDogaSldKTsKKyAgICAgIG9mZnNldCArPSBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpOworICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAvLyBFSUdFTl9SQU5LMlVQREFURV9ICmRpZmYgLS1naXQgYS9ibGFzL2NvbW1vbi5oIGIvYmxhcy9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ4MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jb21tb24uaApAQCAtMCwwICsxLDE2MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkxBU19DT01NT05fSAorI2RlZmluZSBFSUdFTl9CTEFTX0NPTU1PTl9ICisKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorI2luY2x1ZGUgIi4uL0VpZ2VuL0phY29iaSIKKworI2luY2x1ZGUgPGNvbXBsZXg+CisKKyNpZm5kZWYgU0NBTEFSCisjZXJyb3IgdGhlIHRva2VuIFNDQUxBUiBtdXN0IGJlIGRlZmluZWQgdG8gY29tcGlsZSB0aGlzIGZpbGUKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vRWlnZW4vc3JjL21pc2MvYmxhcy5oIgorCisjZGVmaW5lIE5PVFIgICAgMAorI2RlZmluZSBUUiAgICAgIDEKKyNkZWZpbmUgQURKICAgICAyCisKKyNkZWZpbmUgTEVGVCAgICAwCisjZGVmaW5lIFJJR0hUICAgMQorCisjZGVmaW5lIFVQICAgICAgMAorI2RlZmluZSBMTyAgICAgIDEKKworI2RlZmluZSBOVU5JVCAgIDAKKyNkZWZpbmUgVU5JVCAgICAxCisKKyNkZWZpbmUgSU5WQUxJRCAweGZmCisKKyNkZWZpbmUgT1AoWCkgICAoICAgKChYKT09J04nIHx8IChYKT09J24nKSA/IE5PVFIgICBcCisgICAgICAgICAgICAgICAgICA6ICgoWCk9PSdUJyB8fCAoWCk9PSd0JykgPyBUUiAgICAgXAorICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nQycgfHwgKFgpPT0nYycpID8gQURKICAgIFwKKyAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKworI2RlZmluZSBTSURFKFgpICggICAoKFgpPT0nTCcgfHwgKFgpPT0nbCcpID8gTEVGVCAgIFwKKyAgICAgICAgICAgICAgICAgIDogKChYKT09J1InIHx8IChYKT09J3InKSA/IFJJR0hUICBcCisgICAgICAgICAgICAgICAgICA6IElOVkFMSUQpCisKKyNkZWZpbmUgVVBMTyhYKSAoICAgKChYKT09J1UnIHx8IChYKT09J3UnKSA/IFVQICAgICBcCisgICAgICAgICAgICAgICAgICA6ICgoWCk9PSdMJyB8fCAoWCk9PSdsJykgPyBMTyAgICAgXAorICAgICAgICAgICAgICAgICAgOiBJTlZBTElEKQorCisjZGVmaW5lIERJQUcoWCkgKCAgICgoWCk9PSdOJyB8fCAoWCk9PSduJykgPyBOVU5JVCAgXAorICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nVScgfHwgKFgpPT0ndScpID8gVU5JVCAgIFwKKyAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKworCitpbmxpbmUgYm9vbCBjaGVja19vcChjb25zdCBjaGFyKiBvcCkKK3sKKyAgcmV0dXJuIE9QKCpvcCkhPTB4ZmY7Cit9CisKK2lubGluZSBib29sIGNoZWNrX3NpZGUoY29uc3QgY2hhciogc2lkZSkKK3sKKyAgcmV0dXJuIFNJREUoKnNpZGUpIT0weGZmOworfQorCitpbmxpbmUgYm9vbCBjaGVja191cGxvKGNvbnN0IGNoYXIqIHVwbG8pCit7CisgIHJldHVybiBVUExPKCp1cGxvKSE9MHhmZjsKK30KKworCituYW1lc3BhY2UgRWlnZW4geworI2luY2x1ZGUgIkJhbmRUcmlhbmd1bGFyU29sdmVyLmgiCisjaW5jbHVkZSAiR2VuZXJhbFJhbmsxVXBkYXRlLmgiCisjaW5jbHVkZSAiUGFja2VkU2VsZmFkam9pbnRQcm9kdWN0LmgiCisjaW5jbHVkZSAiUGFja2VkVHJpYW5ndWxhck1hdHJpeFZlY3Rvci5oIgorI2luY2x1ZGUgIlBhY2tlZFRyaWFuZ3VsYXJTb2x2ZXJWZWN0b3IuaCIKKyNpbmNsdWRlICJSYW5rMlVwZGF0ZS5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKK3R5cGVkZWYgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKK3R5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXg7CisKK2VudW0KK3sKKyAgSXNDb21wbGV4ID0gRWlnZW46Ok51bVRyYWl0czxTQ0FMQVI+OjpJc0NvbXBsZXgsCisgIENvbmogPSBJc0NvbXBsZXgKK307CisKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IFBsYWluTWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IE1hdHJpeFR5cGU7Cit0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBDb25zdE1hdHJpeFR5cGU7Cit0eXBlZGVmIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gU3RyaWRlZFZlY3RvclR5cGU7Cit0eXBlZGVmIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBDb21wYWN0VmVjdG9yVHlwZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK01hcDxNYXRyaXg8VCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4KK21hdHJpeChUKiBkYXRhLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBzdHJpZGUpCit7CisgIHJldHVybiBNYXA8TWF0cml4PFQsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+KGRhdGEsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oc3RyaWRlKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitNYXA8Y29uc3QgTWF0cml4PFQsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+CittYXRyaXgoY29uc3QgVCogZGF0YSwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgc3RyaWRlKQoreworICByZXR1cm4gTWFwPGNvbnN0IE1hdHJpeDxULER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPihkYXRhLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KHN0cmlkZSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorTWFwPE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFrZV92ZWN0b3IoVCogZGF0YSwgaW50IHNpemUsIGludCBpbmNyKQoreworICByZXR1cm4gTWFwPE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4oZGF0YSwgc2l6ZSwgSW5uZXJTdHJpZGU8RHluYW1pYz4oaW5jcikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorTWFwPGNvbnN0IE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFrZV92ZWN0b3IoY29uc3QgVCogZGF0YSwgaW50IHNpemUsIGludCBpbmNyKQoreworICByZXR1cm4gTWFwPGNvbnN0IE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4oZGF0YSwgc2l6ZSwgSW5uZXJTdHJpZGU8RHluYW1pYz4oaW5jcikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorTWFwPE1hdHJpeDxULER5bmFtaWMsMT4gPiBtYWtlX3ZlY3RvcihUKiBkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgcmV0dXJuIE1hcDxNYXRyaXg8VCxEeW5hbWljLDE+ID4oZGF0YSwgc2l6ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitNYXA8Y29uc3QgTWF0cml4PFQsRHluYW1pYywxPiA+IG1ha2VfdmVjdG9yKGNvbnN0IFQqIGRhdGEsIGludCBzaXplKQoreworICByZXR1cm4gTWFwPGNvbnN0IE1hdHJpeDxULER5bmFtaWMsMT4gPihkYXRhLCBzaXplKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QqIGdldF9jb21wYWN0X3ZlY3RvcihUKiB4LCBpbnQgbiwgaW50IGluY3gpCit7CisgIGlmKGluY3g9PTEpCisgICAgcmV0dXJuIHg7CisKKyAgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfY29uc3Q8VD46OnR5cGUqIHJldCA9IG5ldyBTY2FsYXJbbl07CisgIGlmKGluY3g8MCkgbWFrZV92ZWN0b3IocmV0LG4pID0gbWFrZV92ZWN0b3IoeCxuLC1pbmN4KS5yZXZlcnNlKCk7CisgIGVsc2UgICAgICAgbWFrZV92ZWN0b3IocmV0LG4pID0gbWFrZV92ZWN0b3IoeCxuLCBpbmN4KTsKKyAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QqIGNvcHlfYmFjayhUKiB4X2NweSwgVCogeCwgaW50IG4sIGludCBpbmN4KQoreworICBpZih4X2NweT09eCkKKyAgICByZXR1cm4gMDsKKworICBpZihpbmN4PDApIG1ha2VfdmVjdG9yKHgsbiwtaW5jeCkucmV2ZXJzZSgpID0gbWFrZV92ZWN0b3IoeF9jcHksbik7CisgIGVsc2UgICAgICAgbWFrZV92ZWN0b3IoeCxuLCBpbmN4KSAgICAgICAgICAgPSBtYWtlX3ZlY3Rvcih4X2NweSxuKTsKKyAgcmV0dXJuIHhfY3B5OworfQorCisjZGVmaW5lIEVJR0VOX0JMQVNfRlVOQyhYKSBFSUdFTl9DQVQoU0NBTEFSX1NVRkZJWCxYIyNfKQorCisjZW5kaWYgLy8gRUlHRU5fQkxBU19DT01NT05fSApkaWZmIC0tZ2l0IGEvYmxhcy9jb21wbGV4X2RvdWJsZS5jcHAgYi9ibGFzL2NvbXBsZXhfZG91YmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhjNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jb21wbGV4X2RvdWJsZS5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIFNDQUxBUiAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4KKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCB6CisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIloiCisjZGVmaW5lIFJFQUxfU0NBTEFSX1NVRkZJWCBkCisjZGVmaW5lIElTQ09NUExFWCAgICAgMQorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvY29tcGxleF9zaW5nbGUuY3BwIGIvYmxhcy9jb21wbGV4X3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4NjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvY29tcGxleF9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBTQ0FMQVIgICAgICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4KKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBjCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkMiCisjZGVmaW5lIFJFQUxfU0NBTEFSX1NVRkZJWCBzCisjZGVmaW5lIElTQ09NUExFWCAgICAgMQorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvZG91YmxlLmNwcCBiL2JsYXMvZG91YmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTViMWQxCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kb3VibGUuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIENoZW4tUGFuZyBIZSA8amRoOEBtczYzLmhpbmV0Lm5ldD4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBkb3VibGUKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBkCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkQiCisjZGVmaW5lIElTQ09NUExFWCAgICAgMAorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKKworZG91YmxlIEJMQVNGVU5DKGRzZG90KShpbnQqIG4sIGZsb2F0KiB4LCBpbnQqIGluY3gsIGZsb2F0KiB5LCBpbnQqIGluY3kpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkgICAgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuKS5jYXN0PGRvdWJsZT4oKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbikuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpLmNhc3Q8ZG91YmxlPigpKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpLmNhc3Q8ZG91YmxlPigpKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmNhc3Q8ZG91YmxlPigpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpLmNhc3Q8ZG91YmxlPigpKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKKyAgZWxzZSByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JsYXMvZjJjL2NoYm12LmMgYi9ibGFzL2YyYy9jaGJtdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMThmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9jaGJtdi5jCkBAIC0wLDAgKzEsNDg3IEBACisvKiBjaGJtdi5mIC0tIHRyYW5zbGF0ZWQgYnkgZjJjICh2ZXJzaW9uIDIwMTAwODI3KS4KKyAgIFlvdSBtdXN0IGxpbmsgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aXRoIGxpYmYyYzoKKwlvbiBNaWNyb3NvZnQgV2luZG93cyBzeXN0ZW0sIGxpbmsgd2l0aCBsaWJmMmMubGliOworCW9uIExpbnV4IG9yIFVuaXggc3lzdGVtcywgbGluayB3aXRoIC4uLi9wYXRoL3RvL2xpYmYyYy5hIC1sbQorCW9yLCBpZiB5b3UgaW5zdGFsbCBsaWJmMmMuYSBpbiBhIHN0YW5kYXJkIHBsYWNlLCB3aXRoIC1sZjJjIC1sbQorCS0tIGluIHRoYXQgb3JkZXIsIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4KKwkJY2MgKi5vIC1sZjJjIC1sbQorCVNvdXJjZSBmb3IgbGliZjJjIGlzIGluIC9uZXRsaWIvZjJjL2xpYmYyYy56aXAsIGUuZy4sCisKKwkJaHR0cDovL3d3dy5uZXRsaWIub3JnL2YyYy9saWJmMmMuemlwCisqLworCisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiCisKKy8qIFN1YnJvdXRpbmUgKi8gaW50IGNoYm12XyhjaGFyICp1cGxvLCBpbnRlZ2VyICpuLCBpbnRlZ2VyICprLCBjb21wbGV4ICoKKwlhbHBoYSwgY29tcGxleCAqYSwgaW50ZWdlciAqbGRhLCBjb21wbGV4ICp4LCBpbnRlZ2VyICppbmN4LCBjb21wbGV4ICoKKwliZXRhLCBjb21wbGV4ICp5LCBpbnRlZ2VyICppbmN5LCBmdG5sZW4gdXBsb19sZW4pCit7CisgICAgLyogU3lzdGVtIGdlbmVyYXRlZCBsb2NhbHMgKi8KKyAgICBpbnRlZ2VyIGFfZGltMSwgYV9vZmZzZXQsIGlfXzEsIGlfXzIsIGlfXzMsIGlfXzQsIGlfXzU7CisgICAgcmVhbCByX18xOworICAgIGNvbXBsZXggcV9fMSwgcV9fMiwgcV9fMywgcV9fNDsKKworICAgIC8qIEJ1aWx0aW4gZnVuY3Rpb25zICovCisgICAgdm9pZCByX2NuamcoY29tcGxleCAqLCBjb21wbGV4ICopOworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgaW50ZWdlciBpX18sIGosIGwsIGl4LCBpeSwgangsIGp5LCBreCwga3ksIGluZm87CisgICAgY29tcGxleCB0ZW1wMSwgdGVtcDI7CisgICAgZXh0ZXJuIGxvZ2ljYWwgbHNhbWVfKGNoYXIgKiwgY2hhciAqLCBmdG5sZW4sIGZ0bmxlbik7CisgICAgaW50ZWdlciBrcGx1czE7CisgICAgZXh0ZXJuIC8qIFN1YnJvdXRpbmUgKi8gaW50IHhlcmJsYV8oY2hhciAqLCBpbnRlZ2VyICosIGZ0bmxlbik7CisKKy8qICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgUHVycG9zZSAqLworLyogID09PT09PT0gKi8KKworLyogIENIQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uICovCisKKy8qICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwgKi8KKworLyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgKi8KKy8qICBBIGlzIGFuIG4gYnkgbiBoZXJtaXRpYW4gYmFuZCBtYXRyaXgsIHdpdGggayBzdXBlci1kaWFnb25hbHMuICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGJhbmQgbWF0cml4IEEgaXMgYmVpbmcgc3VwcGxpZWQgYXMgKi8KKy8qICAgICAgICAgICBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSyAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdXBlci1kaWFnb25hbHMgb2YgdGhlICovCisvKiAgICAgICAgICAgbWF0cml4IEEuIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEFMUEhBICAtIENPTVBMRVggICAgICAgICAuICovCisvKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQSAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93ICovCisvKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0ICovCisvKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlICovCisvKiAgICAgICAgICAgb2YgdGhlIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciB0aGUgdXBwZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBoZXJtaXRpYW4gYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgKi8KKy8qICAgICAgICAgICBmdWxsIG1hdHJpeCBzdG9yYWdlIHRvIGJhbmQgc3RvcmFnZTogKi8KKworLyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTiAqLworLyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSiAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKSAqLworLyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFICovCisvKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUgKi8KKworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkgKi8KKy8qICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyICovCisvKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBjb2x1bW4gYnkgKi8KKy8qICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZiAqLworLyogICAgICAgICAgIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1Yi1kaWFnb25hbCBzdGFydGluZyBhdCBwb3NpdGlvbiAxIGluICovCisvKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlICovCisvKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4gKi8KKy8qICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIHRoZSBsb3dlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiBhIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCAqLworLyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZCAqLworLyogICAgICAgICAgIG5vdCBiZSBzZXQgYW5kIGFyZSBhc3N1bWVkIHRvIGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBMREEgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZCAqLworLyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCBrICsgMSApLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgKi8KKy8qICAgICAgICAgICB2ZWN0b3IgeC4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIElOQ1ggICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEJFVEEgICAtIENPTVBMRVggICAgICAgICAuICovCisvKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFkgICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlICovCisvKiAgICAgICAgICAgdmVjdG9yIHkuIE9uIGV4aXQsIFkgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZWQgdmVjdG9yIHkuICovCisKKy8qICBJTkNZICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBGdXJ0aGVyIERldGFpbHMgKi8KKy8qICA9PT09PT09PT09PT09PT0gKi8KKworLyogIExldmVsIDIgQmxhcyByb3V0aW5lLiAqLworCisvKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuICovCisvKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuICovCisvKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuICovCisKKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogICAgIC4uIFBhcmFtZXRlcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIGFfZGltMSA9ICpsZGE7CisgICAgYV9vZmZzZXQgPSAxICsgYV9kaW0xOworICAgIGEgLT0gYV9vZmZzZXQ7CisgICAgLS14OworICAgIC0teTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICgqbiA8IDApIHsKKwlpbmZvID0gMjsKKyAgICB9IGVsc2UgaWYgKCprIDwgMCkgeworCWluZm8gPSAzOworICAgIH0gZWxzZSBpZiAoKmxkYSA8ICprICsgMSkgeworCWluZm8gPSA2OworICAgIH0gZWxzZSBpZiAoKmluY3ggPT0gMCkgeworCWluZm8gPSA4OworICAgIH0gZWxzZSBpZiAoKmluY3kgPT0gMCkgeworCWluZm8gPSAxMTsKKyAgICB9CisgICAgaWYgKGluZm8gIT0gMCkgeworCXhlcmJsYV8oIkNIQk1WICIsICZpbmZvLCAoZnRubGVuKTYpOworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4gKi8KKworICAgIGlmICgqbiA9PSAwIHx8IChhbHBoYS0+ciA9PSAwLmYgJiYgYWxwaGEtPmkgPT0gMC5mICYmIChiZXRhLT5yID09IDEuZiAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YS0+aSA9PSAwLmYpKSkgeworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuICovCisKKyAgICBpZiAoKmluY3ggPiAwKSB7CisJa3ggPSAxOworICAgIH0gZWxzZSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9CisgICAgaWYgKCppbmN5ID4gMCkgeworCWt5ID0gMTsKKyAgICB9IGVsc2UgeworCWt5ID0gMSAtICgqbiAtIDEpICogKmluY3k7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEgKi8KKy8qICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLiAqLworCisvKiAgICAgRmlyc3QgZm9ybSAgeSA6PSBiZXRhKnkuICovCisKKyAgICBpZiAoYmV0YS0+ciAhPSAxLmYgfHwgYmV0YS0+aSAhPSAwLmYpIHsKKwlpZiAoKmluY3kgPT0gMSkgeworCSAgICBpZiAoYmV0YS0+ciA9PSAwLmYgJiYgYmV0YS0+aSA9PSAwLmYpIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIHlbaV9fMl0uciA9IDAuZiwgeVtpX18yXS5pID0gMC5mOworLyogTDEwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIGlfXzIgPSBpX187CisJCSAgICBpX18zID0gaV9fOworCQkgICAgcV9fMS5yID0gYmV0YS0+ciAqIHlbaV9fM10uciAtIGJldGEtPmkgKiB5W2lfXzNdLmksIAorCQkJICAgIHFfXzEuaSA9IGJldGEtPnIgKiB5W2lfXzNdLmkgKyBiZXRhLT5pICogeVtpX18zXQorCQkJICAgIC5yOworCQkgICAgeVtpX18yXS5yID0gcV9fMS5yLCB5W2lfXzJdLmkgPSBxX18xLmk7CisvKiBMMjA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGl5ID0ga3k7CisJICAgIGlmIChiZXRhLT5yID09IDAuZiAmJiBiZXRhLT5pID09IDAuZikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaXk7CisJCSAgICB5W2lfXzJdLnIgPSAwLmYsIHlbaV9fMl0uaSA9IDAuZjsKKwkJICAgIGl5ICs9ICppbmN5OworLyogTDMwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIGlfXzIgPSBpeTsKKwkJICAgIGlfXzMgPSBpeTsKKwkJICAgIHFfXzEuciA9IGJldGEtPnIgKiB5W2lfXzNdLnIgLSBiZXRhLT5pICogeVtpX18zXS5pLCAKKwkJCSAgICBxX18xLmkgPSBiZXRhLT5yICogeVtpX18zXS5pICsgYmV0YS0+aSAqIHlbaV9fM10KKwkJCSAgICAucjsKKwkJICAgIHlbaV9fMl0uciA9IHFfXzEuciwgeVtpX18yXS5pID0gcV9fMS5pOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNDA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGFscGhhLT5yID09IDAuZiAmJiBhbHBoYS0+aSA9PSAwLmYpIHsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgRm9ybSAgeSAgd2hlbiB1cHBlciB0cmlhbmdsZSBvZiBBIGlzIHN0b3JlZC4gKi8KKworCWtwbHVzMSA9ICprICsgMTsKKwlpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKSB7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJaV9fMiA9IGo7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCWlfXzIgPSAxLCBpX18zID0gaiAtICprOworCQlpX180ID0gaiAtIDE7CisJCWZvciAoaV9fID0gbWF4KGlfXzIsaV9fMyk7IGlfXyA8PSBpX180OyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzMgPSBpX187CisJCSAgICBpX181ID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCSAgICBxX18yLnIgPSB0ZW1wMS5yICogYVtpX181XS5yIC0gdGVtcDEuaSAqIGFbaV9fNV0uaSwgCisJCQkgICAgcV9fMi5pID0gdGVtcDEuciAqIGFbaV9fNV0uaSArIHRlbXAxLmkgKiBhW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICBxX18xLnIgPSB5W2lfXzNdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fM10uaSArIHFfXzIuaTsKKwkJICAgIHlbaV9fMl0uciA9IHFfXzEuciwgeVtpX18yXS5pID0gcV9fMS5pOworCQkgICAgcl9jbmpnKCZxX18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fMl0uciAtIHFfXzMuaSAqIHhbaV9fMl0uaSwgcV9fMi5pID0KKwkJCSAgICAgcV9fMy5yICogeFtpX18yXS5pICsgcV9fMy5pICogeFtpX18yXS5yOworCQkgICAgcV9fMS5yID0gdGVtcDIuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcDIuaSArIHFfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSBxX18xLnIsIHRlbXAyLmkgPSBxX18xLmk7CisvKiBMNTA6ICovCisJCX0KKwkJaV9fNCA9IGo7CisJCWlfXzIgPSBqOworCQlpX18zID0ga3BsdXMxICsgaiAqIGFfZGltMTsKKwkJcl9fMSA9IGFbaV9fM10ucjsKKwkJcV9fMy5yID0gcl9fMSAqIHRlbXAxLnIsIHFfXzMuaSA9IHJfXzEgKiB0ZW1wMS5pOworCQlxX18yLnIgPSB5W2lfXzJdLnIgKyBxX18zLnIsIHFfXzIuaSA9IHlbaV9fMl0uaSArIHFfXzMuaTsKKwkJcV9fNC5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCBxX180LmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJcV9fMS5yID0gcV9fMi5yICsgcV9fNC5yLCBxX18xLmkgPSBxX18yLmkgKyBxX180Lmk7CisJCXlbaV9fNF0uciA9IHFfXzEuciwgeVtpX180XS5pID0gcV9fMS5pOworLyogTDYwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX180ID0gang7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX180XS5yIC0gYWxwaGEtPmkgKiB4W2lfXzRdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzRdLmkgKyBhbHBoYS0+aSAqIHhbaV9fNF0ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJaXggPSBreDsKKwkJaXkgPSBreTsKKwkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCWlfXzQgPSAxLCBpX18yID0gaiAtICprOworCQlpX18zID0gaiAtIDE7CisJCWZvciAoaV9fID0gbWF4KGlfXzQsaV9fMik7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkgICAgaV9fNCA9IGl5OworCQkgICAgaV9fMiA9IGl5OworCQkgICAgaV9fNSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkgICAgcV9fMi5yID0gdGVtcDEuciAqIGFbaV9fNV0uciAtIHRlbXAxLmkgKiBhW2lfXzVdLmksIAorCQkJICAgIHFfXzIuaSA9IHRlbXAxLnIgKiBhW2lfXzVdLmkgKyB0ZW1wMS5pICogYVtpX181XQorCQkJICAgIC5yOworCQkgICAgcV9fMS5yID0geVtpX18yXS5yICsgcV9fMi5yLCBxX18xLmkgPSB5W2lfXzJdLmkgKyBxX18yLmk7CisJCSAgICB5W2lfXzRdLnIgPSBxX18xLnIsIHlbaV9fNF0uaSA9IHFfXzEuaTsKKwkJICAgIHJfY25qZygmcV9fMywgJmFbbCArIGlfXyArIGogKiBhX2RpbTFdKTsKKwkJICAgIGlfXzQgPSBpeDsKKwkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fNF0uciAtIHFfXzMuaSAqIHhbaV9fNF0uaSwgcV9fMi5pID0KKwkJCSAgICAgcV9fMy5yICogeFtpX180XS5pICsgcV9fMy5pICogeFtpX180XS5yOworCQkgICAgcV9fMS5yID0gdGVtcDIuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcDIuaSArIHFfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSBxX18xLnIsIHRlbXAyLmkgPSBxX18xLmk7CisJCSAgICBpeCArPSAqaW5jeDsKKwkJICAgIGl5ICs9ICppbmN5OworLyogTDcwOiAqLworCQl9CisJCWlfXzMgPSBqeTsKKwkJaV9fNCA9IGp5OworCQlpX18yID0ga3BsdXMxICsgaiAqIGFfZGltMTsKKwkJcl9fMSA9IGFbaV9fMl0ucjsKKwkJcV9fMy5yID0gcl9fMSAqIHRlbXAxLnIsIHFfXzMuaSA9IHJfXzEgKiB0ZW1wMS5pOworCQlxX18yLnIgPSB5W2lfXzRdLnIgKyBxX18zLnIsIHFfXzIuaSA9IHlbaV9fNF0uaSArIHFfXzMuaTsKKwkJcV9fNC5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCBxX180LmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJcV9fMS5yID0gcV9fMi5yICsgcV9fNC5yLCBxX18xLmkgPSBxX18yLmkgKyBxX180Lmk7CisJCXlbaV9fM10uciA9IHFfXzEuciwgeVtpX18zXS5pID0gcV9fMS5pOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisJCWlmIChqID4gKmspIHsKKwkJICAgIGt4ICs9ICppbmN4OworCQkgICAga3kgKz0gKmluY3k7CisJCX0KKy8qIEw4MDogKi8KKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCisvKiAgICAgICAgRm9ybSAgeSAgd2hlbiBsb3dlciB0cmlhbmdsZSBvZiBBIGlzIHN0b3JlZC4gKi8KKworCWlmICgqaW5jeCA9PSAxICYmICppbmN5ID09IDEpIHsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18zID0gajsKKwkJcV9fMS5yID0gYWxwaGEtPnIgKiB4W2lfXzNdLnIgLSBhbHBoYS0+aSAqIHhbaV9fM10uaSwgcV9fMS5pID0KKwkJCSBhbHBoYS0+ciAqIHhbaV9fM10uaSArIGFscGhhLT5pICogeFtpX18zXS5yOworCQl0ZW1wMS5yID0gcV9fMS5yLCB0ZW1wMS5pID0gcV9fMS5pOworCQl0ZW1wMi5yID0gMC5mLCB0ZW1wMi5pID0gMC5mOworCQlpX18zID0gajsKKwkJaV9fNCA9IGo7CisJCWlfXzIgPSBqICogYV9kaW0xICsgMTsKKwkJcl9fMSA9IGFbaV9fMl0ucjsKKwkJcV9fMi5yID0gcl9fMSAqIHRlbXAxLnIsIHFfXzIuaSA9IHJfXzEgKiB0ZW1wMS5pOworCQlxX18xLnIgPSB5W2lfXzRdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fNF0uaSArIHFfXzIuaTsKKwkJeVtpX18zXS5yID0gcV9fMS5yLCB5W2lfXzNdLmkgPSBxX18xLmk7CisJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJaV9fNCA9ICpuLCBpX18yID0gaiArICprOworCQlpX18zID0gbWluKGlfXzQsaV9fMik7CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkgICAgaV9fNCA9IGlfXzsKKwkJICAgIGlfXzIgPSBpX187CisJCSAgICBpX181ID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCSAgICBxX18yLnIgPSB0ZW1wMS5yICogYVtpX181XS5yIC0gdGVtcDEuaSAqIGFbaV9fNV0uaSwgCisJCQkgICAgcV9fMi5pID0gdGVtcDEuciAqIGFbaV9fNV0uaSArIHRlbXAxLmkgKiBhW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICBxX18xLnIgPSB5W2lfXzJdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fMl0uaSArIHFfXzIuaTsKKwkJICAgIHlbaV9fNF0uciA9IHFfXzEuciwgeVtpX180XS5pID0gcV9fMS5pOworCQkgICAgcl9jbmpnKCZxX18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkgICAgaV9fNCA9IGlfXzsKKwkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fNF0uciAtIHFfXzMuaSAqIHhbaV9fNF0uaSwgcV9fMi5pID0KKwkJCSAgICAgcV9fMy5yICogeFtpX180XS5pICsgcV9fMy5pICogeFtpX180XS5yOworCQkgICAgcV9fMS5yID0gdGVtcDIuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcDIuaSArIHFfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSBxX18xLnIsIHRlbXAyLmkgPSBxX18xLmk7CisvKiBMOTA6ICovCisJCX0KKwkJaV9fMyA9IGo7CisJCWlfXzQgPSBqOworCQlxX18yLnIgPSBhbHBoYS0+ciAqIHRlbXAyLnIgLSBhbHBoYS0+aSAqIHRlbXAyLmksIHFfXzIuaSA9IAorCQkJYWxwaGEtPnIgKiB0ZW1wMi5pICsgYWxwaGEtPmkgKiB0ZW1wMi5yOworCQlxX18xLnIgPSB5W2lfXzRdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fNF0uaSArIHFfXzIuaTsKKwkJeVtpX18zXS5yID0gcV9fMS5yLCB5W2lfXzNdLmkgPSBxX18xLmk7CisvKiBMMTAwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18zID0gang7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX18zXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzNdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzNdLmkgKyBhbHBoYS0+aSAqIHhbaV9fM10ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJaV9fMyA9IGp5OworCQlpX180ID0gank7CisJCWlfXzIgPSBqICogYV9kaW0xICsgMTsKKwkJcl9fMSA9IGFbaV9fMl0ucjsKKwkJcV9fMi5yID0gcl9fMSAqIHRlbXAxLnIsIHFfXzIuaSA9IHJfXzEgKiB0ZW1wMS5pOworCQlxX18xLnIgPSB5W2lfXzRdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fNF0uaSArIHFfXzIuaTsKKwkJeVtpX18zXS5yID0gcV9fMS5yLCB5W2lfXzNdLmkgPSBxX18xLmk7CisJCWwgPSAxIC0gajsKKwkJaXggPSBqeDsKKwkJaXkgPSBqeTsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJaV9fNCA9ICpuLCBpX18yID0gaiArICprOworCQlpX18zID0gbWluKGlfXzQsaV9fMik7CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKwkJICAgIGlfXzQgPSBpeTsKKwkJICAgIGlfXzIgPSBpeTsKKwkJICAgIGlfXzUgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJICAgIHFfXzIuciA9IHRlbXAxLnIgKiBhW2lfXzVdLnIgLSB0ZW1wMS5pICogYVtpX181XS5pLCAKKwkJCSAgICBxX18yLmkgPSB0ZW1wMS5yICogYVtpX181XS5pICsgdGVtcDEuaSAqIGFbaV9fNV0KKwkJCSAgICAucjsKKwkJICAgIHFfXzEuciA9IHlbaV9fMl0uciArIHFfXzIuciwgcV9fMS5pID0geVtpX18yXS5pICsgcV9fMi5pOworCQkgICAgeVtpX180XS5yID0gcV9fMS5yLCB5W2lfXzRdLmkgPSBxX18xLmk7CisJCSAgICByX2NuamcoJnFfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCSAgICBpX180ID0gaXg7CisJCSAgICBxX18yLnIgPSBxX18zLnIgKiB4W2lfXzRdLnIgLSBxX18zLmkgKiB4W2lfXzRdLmksIHFfXzIuaSA9CisJCQkgICAgIHFfXzMuciAqIHhbaV9fNF0uaSArIHFfXzMuaSAqIHhbaV9fNF0ucjsKKwkJICAgIHFfXzEuciA9IHRlbXAyLnIgKyBxX18yLnIsIHFfXzEuaSA9IHRlbXAyLmkgKyBxX18yLmk7CisJCSAgICB0ZW1wMi5yID0gcV9fMS5yLCB0ZW1wMi5pID0gcV9fMS5pOworLyogTDExMDogKi8KKwkJfQorCQlpX18zID0gank7CisJCWlfXzQgPSBqeTsKKwkJcV9fMi5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCBxX18yLmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJcV9fMS5yID0geVtpX180XS5yICsgcV9fMi5yLCBxX18xLmkgPSB5W2lfXzRdLmkgKyBxX18yLmk7CisJCXlbaV9fM10uciA9IHFfXzEuciwgeVtpX18zXS5pID0gcV9fMS5pOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisvKiBMMTIwOiAqLworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIENIQk1WIC4gKi8KKworfSAvKiBjaGJtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvY2hwbXYuYyBiL2JsYXMvZjJjL2NocG12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViYWIxYwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL2NocG12LmMKQEAgLTAsMCArMSw0MzggQEAKKy8qIGNocG12LmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgY2hwbXZfKGNoYXIgKnVwbG8sIGludGVnZXIgKm4sIGNvbXBsZXggKmFscGhhLCBjb21wbGV4ICoKKwlhcCwgY29tcGxleCAqeCwgaW50ZWdlciAqaW5jeCwgY29tcGxleCAqYmV0YSwgY29tcGxleCAqeSwgaW50ZWdlciAqCisJaW5jeSwgZnRubGVuIHVwbG9fbGVuKQoreworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgaW50ZWdlciBpX18xLCBpX18yLCBpX18zLCBpX180LCBpX181OworICAgIHJlYWwgcl9fMTsKKyAgICBjb21wbGV4IHFfXzEsIHFfXzIsIHFfXzMsIHFfXzQ7CisKKyAgICAvKiBCdWlsdGluIGZ1bmN0aW9ucyAqLworICAgIHZvaWQgcl9jbmpnKGNvbXBsZXggKiwgY29tcGxleCAqKTsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBrLCBraywgaXgsIGl5LCBqeCwganksIGt4LCBreSwgaW5mbzsKKyAgICBjb21wbGV4IHRlbXAxLCB0ZW1wMjsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgQ0hQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbiAqLworCisvKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICovCisKKy8qICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kICovCisvKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQgKi8KKy8qICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQUxQSEEgIC0gQ09NUExFWCAgICAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBUCAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QgKi8KKy8qICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXggKi8KKy8qICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgKi8KKy8qICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkgKi8KKy8qICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdCAqLworLyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgaGVybWl0aWFuIG1hdHJpeCAqLworLyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSAqLworLyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKSAqLworLyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uICovCisvKiAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBpbWFnaW5hcnkgcGFydHMgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG5lZWQgKi8KKy8qICAgICAgICAgICBub3QgYmUgc2V0IGFuZCBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbiAqLworLyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBJTkNYICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBCRVRBICAgLSBDT01QTEVYICAgICAgICAgLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBCRVRBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGJldGEuIFdoZW4gQkVUQSBpcyAqLworLyogICAgICAgICAgIHN1cHBsaWVkIGFzIHplcm8gdGhlbiBZIG5lZWQgbm90IGJlIHNldCBvbiBpbnB1dC4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFkgICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlIG4gKi8KKy8qICAgICAgICAgICBlbGVtZW50IHZlY3RvciB5LiBPbiBleGl0LCBZIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cGRhdGVkICovCisvKiAgICAgICAgICAgdmVjdG9yIHkuICovCisKKy8qICBJTkNZICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBGdXJ0aGVyIERldGFpbHMgKi8KKy8qICA9PT09PT09PT09PT09PT0gKi8KKworLyogIExldmVsIDIgQmxhcyByb3V0aW5lLiAqLworCisvKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuICovCisvKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuICovCisvKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuICovCisKKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogICAgIC4uIFBhcmFtZXRlcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIC0teTsKKyAgICAtLXg7CisgICAgLS1hcDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICgqbiA8IDApIHsKKwlpbmZvID0gMjsKKyAgICB9IGVsc2UgaWYgKCppbmN4ID09IDApIHsKKwlpbmZvID0gNjsKKyAgICB9IGVsc2UgaWYgKCppbmN5ID09IDApIHsKKwlpbmZvID0gOTsKKyAgICB9CisgICAgaWYgKGluZm8gIT0gMCkgeworCXhlcmJsYV8oIkNIUE1WICIsICZpbmZvLCAoZnRubGVuKTYpOworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4gKi8KKworICAgIGlmICgqbiA9PSAwIHx8IChhbHBoYS0+ciA9PSAwLmYgJiYgYWxwaGEtPmkgPT0gMC5mICYmIChiZXRhLT5yID09IDEuZiAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YS0+aSA9PSAwLmYpKSkgeworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuICovCisKKyAgICBpZiAoKmluY3ggPiAwKSB7CisJa3ggPSAxOworICAgIH0gZWxzZSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9CisgICAgaWYgKCppbmN5ID4gMCkgeworCWt5ID0gMTsKKyAgICB9IGVsc2UgeworCWt5ID0gMSAtICgqbiAtIDEpICogKmluY3k7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQICovCisvKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuICovCisKKy8qICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4gKi8KKworICAgIGlmIChiZXRhLT5yICE9IDEuZiB8fCBiZXRhLT5pICE9IDAuZikgeworCWlmICgqaW5jeSA9PSAxKSB7CisJICAgIGlmIChiZXRhLT5yID09IDAuZiAmJiBiZXRhLT5pID09IDAuZikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaV9fOworCQkgICAgeVtpX18yXS5yID0gMC5mLCB5W2lfXzJdLmkgPSAwLmY7CisvKiBMMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzMgPSBpX187CisJCSAgICBxX18xLnIgPSBiZXRhLT5yICogeVtpX18zXS5yIC0gYmV0YS0+aSAqIHlbaV9fM10uaSwgCisJCQkgICAgcV9fMS5pID0gYmV0YS0+ciAqIHlbaV9fM10uaSArIGJldGEtPmkgKiB5W2lfXzNdCisJCQkgICAgLnI7CisJCSAgICB5W2lfXzJdLnIgPSBxX18xLnIsIHlbaV9fMl0uaSA9IHFfXzEuaTsKKy8qIEwyMDogKi8KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXkgPSBreTsKKwkgICAgaWYgKGJldGEtPnIgPT0gMC5mICYmIGJldGEtPmkgPT0gMC5mKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIGlfXzIgPSBpeTsKKwkJICAgIHlbaV9fMl0uciA9IDAuZiwgeVtpX18yXS5pID0gMC5mOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMMzA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgaV9fMiA9IGl5OworCQkgICAgaV9fMyA9IGl5OworCQkgICAgcV9fMS5yID0gYmV0YS0+ciAqIHlbaV9fM10uciAtIGJldGEtPmkgKiB5W2lfXzNdLmksIAorCQkJICAgIHFfXzEuaSA9IGJldGEtPnIgKiB5W2lfXzNdLmkgKyBiZXRhLT5pICogeVtpX18zXQorCQkJICAgIC5yOworCQkgICAgeVtpX18yXS5yID0gcV9fMS5yLCB5W2lfXzJdLmkgPSBxX18xLmk7CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw0MDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAoYWxwaGEtPnIgPT0gMC5mICYmIGFscGhhLT5pID09IDAuZikgeworCXJldHVybiAwOworICAgIH0KKyAgICBrayA9IDE7CisgICAgaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgRm9ybSAgeSAgd2hlbiBBUCBjb250YWlucyB0aGUgdXBwZXIgdHJpYW5nbGUuICovCisKKwlpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKSB7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJaV9fMiA9IGo7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJayA9IGtrOworCQlpX18yID0gaiAtIDE7CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzI7ICsraV9fKSB7CisJCSAgICBpX18zID0gaV9fOworCQkgICAgaV9fNCA9IGlfXzsKKwkJICAgIGlfXzUgPSBrOworCQkgICAgcV9fMi5yID0gdGVtcDEuciAqIGFwW2lfXzVdLnIgLSB0ZW1wMS5pICogYXBbaV9fNV0uaSwgCisJCQkgICAgcV9fMi5pID0gdGVtcDEuciAqIGFwW2lfXzVdLmkgKyB0ZW1wMS5pICogYXBbaV9fNV0KKwkJCSAgICAucjsKKwkJICAgIHFfXzEuciA9IHlbaV9fNF0uciArIHFfXzIuciwgcV9fMS5pID0geVtpX180XS5pICsgcV9fMi5pOworCQkgICAgeVtpX18zXS5yID0gcV9fMS5yLCB5W2lfXzNdLmkgPSBxX18xLmk7CisJCSAgICByX2NuamcoJnFfXzMsICZhcFtrXSk7CisJCSAgICBpX18zID0gaV9fOworCQkgICAgcV9fMi5yID0gcV9fMy5yICogeFtpX18zXS5yIC0gcV9fMy5pICogeFtpX18zXS5pLCBxX18yLmkgPQorCQkJICAgICBxX18zLnIgKiB4W2lfXzNdLmkgKyBxX18zLmkgKiB4W2lfXzNdLnI7CisJCSAgICBxX18xLnIgPSB0ZW1wMi5yICsgcV9fMi5yLCBxX18xLmkgPSB0ZW1wMi5pICsgcV9fMi5pOworCQkgICAgdGVtcDIuciA9IHFfXzEuciwgdGVtcDIuaSA9IHFfXzEuaTsKKwkJICAgICsrazsKKy8qIEw1MDogKi8KKwkJfQorCQlpX18yID0gajsKKwkJaV9fMyA9IGo7CisJCWlfXzQgPSBrayArIGogLSAxOworCQlyX18xID0gYXBbaV9fNF0ucjsKKwkJcV9fMy5yID0gcl9fMSAqIHRlbXAxLnIsIHFfXzMuaSA9IHJfXzEgKiB0ZW1wMS5pOworCQlxX18yLnIgPSB5W2lfXzNdLnIgKyBxX18zLnIsIHFfXzIuaSA9IHlbaV9fM10uaSArIHFfXzMuaTsKKwkJcV9fNC5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCBxX180LmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJcV9fMS5yID0gcV9fMi5yICsgcV9fNC5yLCBxX18xLmkgPSBxX18yLmkgKyBxX180Lmk7CisJCXlbaV9fMl0uciA9IHFfXzEuciwgeVtpX18yXS5pID0gcV9fMS5pOworCQlrayArPSBqOworLyogTDYwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18yID0gang7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJaXggPSBreDsKKwkJaXkgPSBreTsKKwkJaV9fMiA9IGtrICsgaiAtIDI7CisJCWZvciAoayA9IGtrOyBrIDw9IGlfXzI7ICsraykgeworCQkgICAgaV9fMyA9IGl5OworCQkgICAgaV9fNCA9IGl5OworCQkgICAgaV9fNSA9IGs7CisJCSAgICBxX18yLnIgPSB0ZW1wMS5yICogYXBbaV9fNV0uciAtIHRlbXAxLmkgKiBhcFtpX181XS5pLCAKKwkJCSAgICBxX18yLmkgPSB0ZW1wMS5yICogYXBbaV9fNV0uaSArIHRlbXAxLmkgKiBhcFtpX181XQorCQkJICAgIC5yOworCQkgICAgcV9fMS5yID0geVtpX180XS5yICsgcV9fMi5yLCBxX18xLmkgPSB5W2lfXzRdLmkgKyBxX18yLmk7CisJCSAgICB5W2lfXzNdLnIgPSBxX18xLnIsIHlbaV9fM10uaSA9IHFfXzEuaTsKKwkJICAgIHJfY25qZygmcV9fMywgJmFwW2tdKTsKKwkJICAgIGlfXzMgPSBpeDsKKwkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fM10uciAtIHFfXzMuaSAqIHhbaV9fM10uaSwgcV9fMi5pID0KKwkJCSAgICAgcV9fMy5yICogeFtpX18zXS5pICsgcV9fMy5pICogeFtpX18zXS5yOworCQkgICAgcV9fMS5yID0gdGVtcDIuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcDIuaSArIHFfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSBxX18xLnIsIHRlbXAyLmkgPSBxX18xLmk7CisJCSAgICBpeCArPSAqaW5jeDsKKwkJICAgIGl5ICs9ICppbmN5OworLyogTDcwOiAqLworCQl9CisJCWlfXzIgPSBqeTsKKwkJaV9fMyA9IGp5OworCQlpX180ID0ga2sgKyBqIC0gMTsKKwkJcl9fMSA9IGFwW2lfXzRdLnI7CisJCXFfXzMuciA9IHJfXzEgKiB0ZW1wMS5yLCBxX18zLmkgPSByX18xICogdGVtcDEuaTsKKwkJcV9fMi5yID0geVtpX18zXS5yICsgcV9fMy5yLCBxX18yLmkgPSB5W2lfXzNdLmkgKyBxX18zLmk7CisJCXFfXzQuciA9IGFscGhhLT5yICogdGVtcDIuciAtIGFscGhhLT5pICogdGVtcDIuaSwgcV9fNC5pID0gCisJCQlhbHBoYS0+ciAqIHRlbXAyLmkgKyBhbHBoYS0+aSAqIHRlbXAyLnI7CisJCXFfXzEuciA9IHFfXzIuciArIHFfXzQuciwgcV9fMS5pID0gcV9fMi5pICsgcV9fNC5pOworCQl5W2lfXzJdLnIgPSBxX18xLnIsIHlbaV9fMl0uaSA9IHFfXzEuaTsKKwkJanggKz0gKmluY3g7CisJCWp5ICs9ICppbmN5OworCQlrayArPSBqOworLyogTDgwOiAqLworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisKKy8qICAgICAgICBGb3JtICB5ICB3aGVuIEFQIGNvbnRhaW5zIHRoZSBsb3dlciB0cmlhbmdsZS4gKi8KKworCWlmICgqaW5jeCA9PSAxICYmICppbmN5ID09IDEpIHsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18yID0gajsKKwkJcV9fMS5yID0gYWxwaGEtPnIgKiB4W2lfXzJdLnIgLSBhbHBoYS0+aSAqIHhbaV9fMl0uaSwgcV9fMS5pID0KKwkJCSBhbHBoYS0+ciAqIHhbaV9fMl0uaSArIGFscGhhLT5pICogeFtpX18yXS5yOworCQl0ZW1wMS5yID0gcV9fMS5yLCB0ZW1wMS5pID0gcV9fMS5pOworCQl0ZW1wMi5yID0gMC5mLCB0ZW1wMi5pID0gMC5mOworCQlpX18yID0gajsKKwkJaV9fMyA9IGo7CisJCWlfXzQgPSBrazsKKwkJcl9fMSA9IGFwW2lfXzRdLnI7CisJCXFfXzIuciA9IHJfXzEgKiB0ZW1wMS5yLCBxX18yLmkgPSByX18xICogdGVtcDEuaTsKKwkJcV9fMS5yID0geVtpX18zXS5yICsgcV9fMi5yLCBxX18xLmkgPSB5W2lfXzNdLmkgKyBxX18yLmk7CisJCXlbaV9fMl0uciA9IHFfXzEuciwgeVtpX18yXS5pID0gcV9fMS5pOworCQlrID0ga2sgKyAxOworCQlpX18yID0gKm47CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIGlfXzQgPSBpX187CisJCSAgICBpX181ID0gazsKKwkJICAgIHFfXzIuciA9IHRlbXAxLnIgKiBhcFtpX181XS5yIC0gdGVtcDEuaSAqIGFwW2lfXzVdLmksIAorCQkJICAgIHFfXzIuaSA9IHRlbXAxLnIgKiBhcFtpX181XS5pICsgdGVtcDEuaSAqIGFwW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICBxX18xLnIgPSB5W2lfXzRdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fNF0uaSArIHFfXzIuaTsKKwkJICAgIHlbaV9fM10uciA9IHFfXzEuciwgeVtpX18zXS5pID0gcV9fMS5pOworCQkgICAgcl9jbmpnKCZxX18zLCAmYXBba10pOworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fM10uciAtIHFfXzMuaSAqIHhbaV9fM10uaSwgcV9fMi5pID0KKwkJCSAgICAgcV9fMy5yICogeFtpX18zXS5pICsgcV9fMy5pICogeFtpX18zXS5yOworCQkgICAgcV9fMS5yID0gdGVtcDIuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcDIuaSArIHFfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSBxX18xLnIsIHRlbXAyLmkgPSBxX18xLmk7CisJCSAgICArK2s7CisvKiBMOTA6ICovCisJCX0KKwkJaV9fMiA9IGo7CisJCWlfXzMgPSBqOworCQlxX18yLnIgPSBhbHBoYS0+ciAqIHRlbXAyLnIgLSBhbHBoYS0+aSAqIHRlbXAyLmksIHFfXzIuaSA9IAorCQkJYWxwaGEtPnIgKiB0ZW1wMi5pICsgYWxwaGEtPmkgKiB0ZW1wMi5yOworCQlxX18xLnIgPSB5W2lfXzNdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fM10uaSArIHFfXzIuaTsKKwkJeVtpX18yXS5yID0gcV9fMS5yLCB5W2lfXzJdLmkgPSBxX18xLmk7CisJCWtrICs9ICpuIC0gaiArIDE7CisvKiBMMTAwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18yID0gang7CisJCXFfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHFfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHFfXzEuciwgdGVtcDEuaSA9IHFfXzEuaTsKKwkJdGVtcDIuciA9IDAuZiwgdGVtcDIuaSA9IDAuZjsKKwkJaV9fMiA9IGp5OworCQlpX18zID0gank7CisJCWlfXzQgPSBrazsKKwkJcl9fMSA9IGFwW2lfXzRdLnI7CisJCXFfXzIuciA9IHJfXzEgKiB0ZW1wMS5yLCBxX18yLmkgPSByX18xICogdGVtcDEuaTsKKwkJcV9fMS5yID0geVtpX18zXS5yICsgcV9fMi5yLCBxX18xLmkgPSB5W2lfXzNdLmkgKyBxX18yLmk7CisJCXlbaV9fMl0uciA9IHFfXzEuciwgeVtpX18yXS5pID0gcV9fMS5pOworCQlpeCA9IGp4OworCQlpeSA9IGp5OworCQlpX18yID0ga2sgKyAqbiAtIGo7CisJCWZvciAoayA9IGtrICsgMTsgayA8PSBpX18yOyArK2spIHsKKwkJICAgIGl4ICs9ICppbmN4OworCQkgICAgaXkgKz0gKmluY3k7CisJCSAgICBpX18zID0gaXk7CisJCSAgICBpX180ID0gaXk7CisJCSAgICBpX181ID0gazsKKwkJICAgIHFfXzIuciA9IHRlbXAxLnIgKiBhcFtpX181XS5yIC0gdGVtcDEuaSAqIGFwW2lfXzVdLmksIAorCQkJICAgIHFfXzIuaSA9IHRlbXAxLnIgKiBhcFtpX181XS5pICsgdGVtcDEuaSAqIGFwW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICBxX18xLnIgPSB5W2lfXzRdLnIgKyBxX18yLnIsIHFfXzEuaSA9IHlbaV9fNF0uaSArIHFfXzIuaTsKKwkJICAgIHlbaV9fM10uciA9IHFfXzEuciwgeVtpX18zXS5pID0gcV9fMS5pOworCQkgICAgcl9jbmpnKCZxX18zLCAmYXBba10pOworCQkgICAgaV9fMyA9IGl4OworCQkgICAgcV9fMi5yID0gcV9fMy5yICogeFtpX18zXS5yIC0gcV9fMy5pICogeFtpX18zXS5pLCBxX18yLmkgPQorCQkJICAgICBxX18zLnIgKiB4W2lfXzNdLmkgKyBxX18zLmkgKiB4W2lfXzNdLnI7CisJCSAgICBxX18xLnIgPSB0ZW1wMi5yICsgcV9fMi5yLCBxX18xLmkgPSB0ZW1wMi5pICsgcV9fMi5pOworCQkgICAgdGVtcDIuciA9IHFfXzEuciwgdGVtcDIuaSA9IHFfXzEuaTsKKy8qIEwxMTA6ICovCisJCX0KKwkJaV9fMiA9IGp5OworCQlpX18zID0gank7CisJCXFfXzIuciA9IGFscGhhLT5yICogdGVtcDIuciAtIGFscGhhLT5pICogdGVtcDIuaSwgcV9fMi5pID0gCisJCQlhbHBoYS0+ciAqIHRlbXAyLmkgKyBhbHBoYS0+aSAqIHRlbXAyLnI7CisJCXFfXzEuciA9IHlbaV9fM10uciArIHFfXzIuciwgcV9fMS5pID0geVtpX18zXS5pICsgcV9fMi5pOworCQl5W2lfXzJdLnIgPSBxX18xLnIsIHlbaV9fMl0uaSA9IHFfXzEuaTsKKwkJanggKz0gKmluY3g7CisJCWp5ICs9ICppbmN5OworCQlrayArPSAqbiAtIGogKyAxOworLyogTDEyMDogKi8KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworLyogICAgIEVuZCBvZiBDSFBNViAuICovCisKK30gLyogY2hwbXZfICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL2NvbXBsZXhkb3RzLmMgYi9ibGFzL2YyYy9jb21wbGV4ZG90cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTZhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9jb21wbGV4ZG90cy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCB0byB1c2UgdGhlIHN0YW5kYXJkIGdmb3J0cmFuIGNhbGxpbmcKKyAgIGNvbnZlbnRpb24sIHJhdGhlciB0aGFuIHRoZSBmMmMgY2FsbGluZyBjb252ZW50aW9uLgorCisgICBJdCBkb2VzIG5vdCByZXF1aXJlIC1mZjJjIHdoZW4gY29tcGlsZWQgd2l0aCBnZm9ydHJhbi4KKyovCisKKy8qIGNvbXBsZXhkb3RzLmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworY29tcGxleCBjZG90Y18oaW50ZWdlciAqbiwgY29tcGxleCAqY3gsIGludGVnZXIgCisJKmluY3gsIGNvbXBsZXggKmN5LCBpbnRlZ2VyICppbmN5KQoreworICAgIGNvbXBsZXggcmVzOworICAgIGV4dGVybiAvKiBTdWJyb3V0aW5lICovIGludCBjZG90Y3dfKGludGVnZXIgKiwgY29tcGxleCAqLCBpbnRlZ2VyICosIAorCSAgICBjb21wbGV4ICosIGludGVnZXIgKiwgY29tcGxleCAqKTsKKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIC0tY3k7CisgICAgLS1jeDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjZG90Y3dfKG4sICZjeFsxXSwgaW5jeCwgJmN5WzFdLCBpbmN5LCAmcmVzKTsKKyAgICByZXR1cm4gcmVzOworfSAvKiBjZG90Y18gKi8KKworY29tcGxleCBjZG90dV8oaW50ZWdlciAqbiwgY29tcGxleCAqY3gsIGludGVnZXIgCisJKmluY3gsIGNvbXBsZXggKmN5LCBpbnRlZ2VyICppbmN5KQoreworICAgIGNvbXBsZXggcmVzOworICAgIGV4dGVybiAvKiBTdWJyb3V0aW5lICovIGludCBjZG90dXdfKGludGVnZXIgKiwgY29tcGxleCAqLCBpbnRlZ2VyICosIAorCSAgICBjb21wbGV4ICosIGludGVnZXIgKiwgY29tcGxleCAqKTsKKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIC0tY3k7CisgICAgLS1jeDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjZG90dXdfKG4sICZjeFsxXSwgaW5jeCwgJmN5WzFdLCBpbmN5LCAmcmVzKTsKKyAgICByZXR1cm4gcmVzOworfSAvKiBjZG90dV8gKi8KKworZG91YmxlY29tcGxleCB6ZG90Y18oaW50ZWdlciAqbiwgZG91YmxlY29tcGxleCAqY3gsIGludGVnZXIgKmluY3gsIAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlY29tcGxleCAqY3ksIGludGVnZXIgKmluY3kpCit7CisgICAgZG91YmxlY29tcGxleCByZXM7CisgICAgZXh0ZXJuIC8qIFN1YnJvdXRpbmUgKi8gaW50IHpkb3Rjd18oaW50ZWdlciAqLCBkb3VibGVjb21wbGV4ICosIGludGVnZXIgKiwKKwkgICAgIGRvdWJsZWNvbXBsZXggKiwgaW50ZWdlciAqLCBkb3VibGVjb21wbGV4ICopOworCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgLS1jeTsKKyAgICAtLWN4OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIHpkb3Rjd18obiwgJmN4WzFdLCBpbmN4LCAmY3lbMV0sIGluY3ksICZyZXMpOworICAgIHJldHVybiByZXM7Cit9IC8qIHpkb3RjXyAqLworCitkb3VibGVjb21wbGV4IHpkb3R1XyhpbnRlZ2VyICpuLCBkb3VibGVjb21wbGV4ICpjeCwgaW50ZWdlciAqaW5jeCwgCisgICAgICAgICAgICAgICAgICAgICBkb3VibGVjb21wbGV4ICpjeSwgaW50ZWdlciAqaW5jeSkKK3sKKyAgICBkb3VibGVjb21wbGV4IHJlczsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgemRvdHV3XyhpbnRlZ2VyICosIGRvdWJsZWNvbXBsZXggKiwgaW50ZWdlciAqLAorCSAgICAgZG91YmxlY29tcGxleCAqLCBpbnRlZ2VyICosIGRvdWJsZWNvbXBsZXggKik7CisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICAtLWN5OworICAgIC0tY3g7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgemRvdHV3XyhuLCAmY3hbMV0sIGluY3gsICZjeVsxXSwgaW5jeSwgJnJlcyk7CisgICAgcmV0dXJuIHJlczsKK30gLyogemRvdHVfICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL2N0Ym12LmMgYi9ibGFzL2YyYy9jdGJtdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MGZkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9jdGJtdi5jCkBAIC0wLDAgKzEsNjQ3IEBACisvKiBjdGJtdi5mIC0tIHRyYW5zbGF0ZWQgYnkgZjJjICh2ZXJzaW9uIDIwMTAwODI3KS4KKyAgIFlvdSBtdXN0IGxpbmsgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aXRoIGxpYmYyYzoKKwlvbiBNaWNyb3NvZnQgV2luZG93cyBzeXN0ZW0sIGxpbmsgd2l0aCBsaWJmMmMubGliOworCW9uIExpbnV4IG9yIFVuaXggc3lzdGVtcywgbGluayB3aXRoIC4uLi9wYXRoL3RvL2xpYmYyYy5hIC1sbQorCW9yLCBpZiB5b3UgaW5zdGFsbCBsaWJmMmMuYSBpbiBhIHN0YW5kYXJkIHBsYWNlLCB3aXRoIC1sZjJjIC1sbQorCS0tIGluIHRoYXQgb3JkZXIsIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4KKwkJY2MgKi5vIC1sZjJjIC1sbQorCVNvdXJjZSBmb3IgbGliZjJjIGlzIGluIC9uZXRsaWIvZjJjL2xpYmYyYy56aXAsIGUuZy4sCisKKwkJaHR0cDovL3d3dy5uZXRsaWIub3JnL2YyYy9saWJmMmMuemlwCisqLworCisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiCisKKy8qIFN1YnJvdXRpbmUgKi8gaW50IGN0Ym12XyhjaGFyICp1cGxvLCBjaGFyICp0cmFucywgY2hhciAqZGlhZywgaW50ZWdlciAqbiwgCisJaW50ZWdlciAqaywgY29tcGxleCAqYSwgaW50ZWdlciAqbGRhLCBjb21wbGV4ICp4LCBpbnRlZ2VyICppbmN4LCAKKwlmdG5sZW4gdXBsb19sZW4sIGZ0bmxlbiB0cmFuc19sZW4sIGZ0bmxlbiBkaWFnX2xlbikKK3sKKyAgICAvKiBTeXN0ZW0gZ2VuZXJhdGVkIGxvY2FscyAqLworICAgIGludGVnZXIgYV9kaW0xLCBhX29mZnNldCwgaV9fMSwgaV9fMiwgaV9fMywgaV9fNCwgaV9fNTsKKyAgICBjb21wbGV4IHFfXzEsIHFfXzIsIHFfXzM7CisKKyAgICAvKiBCdWlsdGluIGZ1bmN0aW9ucyAqLworICAgIHZvaWQgcl9jbmpnKGNvbXBsZXggKiwgY29tcGxleCAqKTsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBsLCBpeCwgangsIGt4LCBpbmZvOworICAgIGNvbXBsZXggdGVtcDsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBpbnRlZ2VyIGtwbHVzMTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKyAgICBsb2dpY2FsIG5vY29uaiwgbm91bml0OworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICBDVEJNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMgKi8KKworLyogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LCAgIG9yICAgeCA6PSBjb25qZyggQScgKSp4LCAqLworCisvKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsICovCisvKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkgZGlhZ29uYWxzLiAqLworCisvKiAgQXJndW1lbnRzICovCisvKiAgPT09PT09PT09PSAqLworCisvKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuICovCisvKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvciAqLworLyogICAgICAgICAgIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IGFzIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIEEgaXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIEEgaXMgYSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeC4gKi8KKworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgVFJBTlMgIC0gQ0hBUkFDVEVSKjEuICovCisvKiAgICAgICAgICAgT24gZW50cnksIFRSQU5TIHNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhcyAqLworLyogICAgICAgICAgIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICB4IDo9IEEqeC4gKi8KKworLyogICAgICAgICAgICAgIFRSQU5TID0gJ1QnIG9yICd0JyAgIHggOj0gQScqeC4gKi8KKworLyogICAgICAgICAgICAgIFRSQU5TID0gJ0MnIG9yICdjJyAgIHggOj0gY29uamcoIEEnICkqeC4gKi8KKworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuICovCisvKiAgICAgICAgICAgT24gZW50cnksIERJQUcgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IEEgaXMgdW5pdCAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgYXMgZm9sbG93czogKi8KKworLyogICAgICAgICAgICAgIERJQUcgPSAnVScgb3IgJ3UnICAgQSBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgdHJpYW5ndWxhci4gKi8KKworLyogICAgICAgICAgICAgIERJQUcgPSAnTicgb3IgJ24nICAgQSBpcyBub3QgYXNzdW1lZCB0byBiZSB1bml0ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSyAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCBLIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mICovCisvKiAgICAgICAgICAgc3VwZXItZGlhZ29uYWxzIG9mIHRoZSBtYXRyaXggQS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCBLIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mICovCisvKiAgICAgICAgICAgc3ViLWRpYWdvbmFscyBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgSyBtdXN0IHNhdGlzZnkgIDAgLmxlLiBLLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQSAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cywgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93ICovCisvKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0ICovCisvKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlICovCisvKiAgICAgICAgICAgb2YgdGhlIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhbiB1cHBlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgZnVsbCBtYXRyaXggc3RvcmFnZSAqLworLyogICAgICAgICAgIHRvIGJhbmQgc3RvcmFnZTogKi8KKworLyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTiAqLworLyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSiAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKSAqLworLyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFICovCisvKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUgKi8KKworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkgKi8KKy8qICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyICovCisvKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkgKi8KKy8qICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZiAqLworLyogICAgICAgICAgIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1Yi1kaWFnb25hbCBzdGFydGluZyBhdCBwb3NpdGlvbiAxIGluICovCisvKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlICovCisvKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4gKi8KKy8qICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIGEgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UgKi8KKy8qICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6ICovCisKKy8qICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4gKi8KKy8qICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IEosIE1JTiggTiwgSiArIEsgKSAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKSAqLworLyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFICovCisvKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUgKi8KKworLyogICAgICAgICAgIE5vdGUgdGhhdCB3aGVuIERJQUcgPSAnVScgb3IgJ3UnIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQSAqLworLyogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXggYXJlIG5vdCAqLworLyogICAgICAgICAgIHJlZmVyZW5jZWQsIGJ1dCBhcmUgYXNzdW1lZCB0byBiZSB1bml0eS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIExEQSAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkICovCisvKiAgICAgICAgICAgaW4gdGhlIGNhbGxpbmcgKHN1YikgcHJvZ3JhbS4gTERBIG11c3QgYmUgYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIGsgKyAxICkuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBYICAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuICovCisvKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4gT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSAqLworLyogICAgICAgICAgIHRyYW5mb3JtZWQgdmVjdG9yIHguICovCisKKy8qICBJTkNYICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBGdXJ0aGVyIERldGFpbHMgKi8KKy8qICA9PT09PT09PT09PT09PT0gKi8KKworLyogIExldmVsIDIgQmxhcyByb3V0aW5lLiAqLworCisvKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuICovCisvKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuICovCisvKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuICovCisKKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogICAgIC4uIFBhcmFtZXRlcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIGFfZGltMSA9ICpsZGE7CisgICAgYV9vZmZzZXQgPSAxICsgYV9kaW0xOworICAgIGEgLT0gYV9vZmZzZXQ7CisgICAgLS14OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGluZm8gPSAwOworICAgIGlmICghIGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh1cGxvLCAiTCIsICgKKwkgICAgZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMTsKKyAgICB9IGVsc2UgaWYgKCEgbHNhbWVfKHRyYW5zLCAiTiIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh0cmFucywgCisJICAgICJUIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpICYmICEgbHNhbWVfKHRyYW5zLCAiQyIsIChmdG5sZW4pMSwgKAorCSAgICBmdG5sZW4pMSkpIHsKKwlpbmZvID0gMjsKKyAgICB9IGVsc2UgaWYgKCEgbHNhbWVfKGRpYWcsICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpICYmICEgbHNhbWVfKGRpYWcsIAorCSAgICAiTiIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCWluZm8gPSAzOworICAgIH0gZWxzZSBpZiAoKm4gPCAwKSB7CisJaW5mbyA9IDQ7CisgICAgfSBlbHNlIGlmICgqayA8IDApIHsKKwlpbmZvID0gNTsKKyAgICB9IGVsc2UgaWYgKCpsZGEgPCAqayArIDEpIHsKKwlpbmZvID0gNzsKKyAgICB9IGVsc2UgaWYgKCppbmN4ID09IDApIHsKKwlpbmZvID0gOTsKKyAgICB9CisgICAgaWYgKGluZm8gIT0gMCkgeworCXhlcmJsYV8oIkNUQk1WICIsICZpbmZvLCAoZnRubGVuKTYpOworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4gKi8KKworICAgIGlmICgqbiA9PSAwKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbm9jb25qID0gbHNhbWVfKHRyYW5zLCAiVCIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKTsKKyAgICBub3VuaXQgPSBsc2FtZV8oZGlhZywgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSk7CisKKy8qICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMgKi8KKy8qICAgICB3aWxsIGJlICAoIE4gLSAxICkqSU5DWCAgIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4gKi8KKworICAgIGlmICgqaW5jeCA8PSAwKSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9IGVsc2UgaWYgKCppbmN4ICE9IDEpIHsKKwlreCA9IDE7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQSBhcmUgKi8KKy8qICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuICovCisKKyAgICBpZiAobHNhbWVfKHRyYW5zLCAiTiIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgIEZvcm0gIHggOj0gQSp4LiAqLworCisJaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCSAgICBrcGx1czEgPSAqayArIDE7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJICAgIGlfXzIgPSBqOworCQkgICAgaWYgKHhbaV9fMl0uciAhPSAwLmYgfHwgeFtpX18yXS5pICE9IDAuZikgeworCQkJaV9fMiA9IGo7CisJCQl0ZW1wLnIgPSB4W2lfXzJdLnIsIHRlbXAuaSA9IHhbaV9fMl0uaTsKKwkJCWwgPSBrcGx1czEgLSBqOworLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fMiA9IDEsIGlfXzMgPSBqIC0gKms7CisJCQlpX180ID0gaiAtIDE7CisJCQlmb3IgKGlfXyA9IG1heChpX18yLGlfXzMpOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICBpX18yID0gaV9fOworCQkJICAgIGlfXzMgPSBpX187CisJCQkgICAgaV9fNSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIHFfXzIuciA9IHRlbXAuciAqIGFbaV9fNV0uciAtIHRlbXAuaSAqIGFbaV9fNV0uaSwgCisJCQkJICAgIHFfXzIuaSA9IHRlbXAuciAqIGFbaV9fNV0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzVdLnI7CisJCQkgICAgcV9fMS5yID0geFtpX18zXS5yICsgcV9fMi5yLCBxX18xLmkgPSB4W2lfXzNdLmkgKyAKKwkJCQkgICAgcV9fMi5pOworCQkJICAgIHhbaV9fMl0uciA9IHFfXzEuciwgeFtpX18yXS5pID0gcV9fMS5pOworLyogTDEwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzQgPSBqOworCQkJICAgIGlfXzIgPSBqOworCQkJICAgIGlfXzMgPSBrcGx1czEgKyBqICogYV9kaW0xOworCQkJICAgIHFfXzEuciA9IHhbaV9fMl0uciAqIGFbaV9fM10uciAtIHhbaV9fMl0uaSAqIGFbCisJCQkJICAgIGlfXzNdLmksIHFfXzEuaSA9IHhbaV9fMl0uciAqIGFbaV9fM10uaSArIAorCQkJCSAgICB4W2lfXzJdLmkgKiBhW2lfXzNdLnI7CisJCQkgICAgeFtpX180XS5yID0gcV9fMS5yLCB4W2lfXzRdLmkgPSBxX18xLmk7CisJCQl9CisJCSAgICB9CisvKiBMMjA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJanggPSBreDsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQkgICAgaV9fNCA9IGp4OworCQkgICAgaWYgKHhbaV9fNF0uciAhPSAwLmYgfHwgeFtpX180XS5pICE9IDAuZikgeworCQkJaV9fNCA9IGp4OworCQkJdGVtcC5yID0geFtpX180XS5yLCB0ZW1wLmkgPSB4W2lfXzRdLmk7CisJCQlpeCA9IGt4OworCQkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMiA9IGogLSAqazsKKwkJCWlfXzMgPSBqIC0gMTsKKwkJCWZvciAoaV9fID0gbWF4KGlfXzQsaV9fMik7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkJICAgIGlfXzQgPSBpeDsKKwkJCSAgICBpX18yID0gaXg7CisJCQkgICAgaV9fNSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIHFfXzIuciA9IHRlbXAuciAqIGFbaV9fNV0uciAtIHRlbXAuaSAqIGFbaV9fNV0uaSwgCisJCQkJICAgIHFfXzIuaSA9IHRlbXAuciAqIGFbaV9fNV0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzVdLnI7CisJCQkgICAgcV9fMS5yID0geFtpX18yXS5yICsgcV9fMi5yLCBxX18xLmkgPSB4W2lfXzJdLmkgKyAKKwkJCQkgICAgcV9fMi5pOworCQkJICAgIHhbaV9fNF0uciA9IHFfXzEuciwgeFtpX180XS5pID0gcV9fMS5pOworCQkJICAgIGl4ICs9ICppbmN4OworLyogTDMwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzMgPSBqeDsKKwkJCSAgICBpX180ID0gang7CisJCQkgICAgaV9fMiA9IGtwbHVzMSArIGogKiBhX2RpbTE7CisJCQkgICAgcV9fMS5yID0geFtpX180XS5yICogYVtpX18yXS5yIC0geFtpX180XS5pICogYVsKKwkJCQkgICAgaV9fMl0uaSwgcV9fMS5pID0geFtpX180XS5yICogYVtpX18yXS5pICsgCisJCQkJICAgIHhbaV9fNF0uaSAqIGFbaV9fMl0ucjsKKwkJCSAgICB4W2lfXzNdLnIgPSBxX18xLnIsIHhbaV9fM10uaSA9IHFfXzEuaTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGp4ICs9ICppbmN4OworCQkgICAgaWYgKGogPiAqaykgeworCQkJa3ggKz0gKmluY3g7CisJCSAgICB9CisvKiBMNDA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgaV9fMSA9IGo7CisJCSAgICBpZiAoeFtpX18xXS5yICE9IDAuZiB8fCB4W2lfXzFdLmkgIT0gMC5mKSB7CisJCQlpX18xID0gajsKKwkJCXRlbXAuciA9IHhbaV9fMV0uciwgdGVtcC5pID0geFtpX18xXS5pOworCQkJbCA9IDEgLSBqOworLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18zID0gaiArICprOworCQkJaV9fNCA9IGogKyAxOworCQkJZm9yIChpX18gPSBtaW4oaV9fMSxpX18zKTsgaV9fID49IGlfXzQ7IC0taV9fKSB7CisJCQkgICAgaV9fMSA9IGlfXzsKKwkJCSAgICBpX18zID0gaV9fOworCQkJICAgIGlfXzIgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJCSAgICBxX18yLnIgPSB0ZW1wLnIgKiBhW2lfXzJdLnIgLSB0ZW1wLmkgKiBhW2lfXzJdLmksIAorCQkJCSAgICBxX18yLmkgPSB0ZW1wLnIgKiBhW2lfXzJdLmkgKyB0ZW1wLmkgKiBhWworCQkJCSAgICBpX18yXS5yOworCQkJICAgIHFfXzEuciA9IHhbaV9fM10uciArIHFfXzIuciwgcV9fMS5pID0geFtpX18zXS5pICsgCisJCQkJICAgIHFfXzIuaTsKKwkJCSAgICB4W2lfXzFdLnIgPSBxX18xLnIsIHhbaV9fMV0uaSA9IHFfXzEuaTsKKy8qIEw1MDogKi8KKwkJCX0KKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICBpX180ID0gajsKKwkJCSAgICBpX18xID0gajsKKwkJCSAgICBpX18zID0gaiAqIGFfZGltMSArIDE7CisJCQkgICAgcV9fMS5yID0geFtpX18xXS5yICogYVtpX18zXS5yIC0geFtpX18xXS5pICogYVsKKwkJCQkgICAgaV9fM10uaSwgcV9fMS5pID0geFtpX18xXS5yICogYVtpX18zXS5pICsgCisJCQkJICAgIHhbaV9fMV0uaSAqIGFbaV9fM10ucjsKKwkJCSAgICB4W2lfXzRdLnIgPSBxX18xLnIsIHhbaV9fNF0uaSA9IHFfXzEuaTsKKwkJCX0KKwkJICAgIH0KKy8qIEw2MDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlreCArPSAoKm4gLSAxKSAqICppbmN4OworCQlqeCA9IGt4OworCQlmb3IgKGogPSAqbjsgaiA+PSAxOyAtLWopIHsKKwkJICAgIGlfXzQgPSBqeDsKKwkJICAgIGlmICh4W2lfXzRdLnIgIT0gMC5mIHx8IHhbaV9fNF0uaSAhPSAwLmYpIHsKKwkJCWlfXzQgPSBqeDsKKwkJCXRlbXAuciA9IHhbaV9fNF0uciwgdGVtcC5pID0geFtpX180XS5pOworCQkJaXggPSBreDsKKwkJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzQgPSAqbiwgaV9fMSA9IGogKyAqazsKKwkJCWlfXzMgPSBqICsgMTsKKwkJCWZvciAoaV9fID0gbWluKGlfXzQsaV9fMSk7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIGlfXzQgPSBpeDsKKwkJCSAgICBpX18xID0gaXg7CisJCQkgICAgaV9fMiA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIHFfXzIuciA9IHRlbXAuciAqIGFbaV9fMl0uciAtIHRlbXAuaSAqIGFbaV9fMl0uaSwgCisJCQkJICAgIHFfXzIuaSA9IHRlbXAuciAqIGFbaV9fMl0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzJdLnI7CisJCQkgICAgcV9fMS5yID0geFtpX18xXS5yICsgcV9fMi5yLCBxX18xLmkgPSB4W2lfXzFdLmkgKyAKKwkJCQkgICAgcV9fMi5pOworCQkJICAgIHhbaV9fNF0uciA9IHFfXzEuciwgeFtpX180XS5pID0gcV9fMS5pOworCQkJICAgIGl4IC09ICppbmN4OworLyogTDcwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzMgPSBqeDsKKwkJCSAgICBpX180ID0gang7CisJCQkgICAgaV9fMSA9IGogKiBhX2RpbTEgKyAxOworCQkJICAgIHFfXzEuciA9IHhbaV9fNF0uciAqIGFbaV9fMV0uciAtIHhbaV9fNF0uaSAqIGFbCisJCQkJICAgIGlfXzFdLmksIHFfXzEuaSA9IHhbaV9fNF0uciAqIGFbaV9fMV0uaSArIAorCQkJCSAgICB4W2lfXzRdLmkgKiBhW2lfXzFdLnI7CisJCQkgICAgeFtpX18zXS5yID0gcV9fMS5yLCB4W2lfXzNdLmkgPSBxX18xLmk7CisJCQl9CisJCSAgICB9CisJCSAgICBqeCAtPSAqaW5jeDsKKwkJICAgIGlmICgqbiAtIGogPj0gKmspIHsKKwkJCWt4IC09ICppbmN4OworCQkgICAgfQorLyogTDgwOiAqLworCQl9CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKworLyogICAgICAgIEZvcm0gIHggOj0gQScqeCAgb3IgIHggOj0gY29uamcoIEEnICkqeC4gKi8KKworCWlmIChsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwkgICAga3BsdXMxID0gKmsgKyAxOworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlmb3IgKGogPSAqbjsgaiA+PSAxOyAtLWopIHsKKwkJICAgIGlfXzMgPSBqOworCQkgICAgdGVtcC5yID0geFtpX18zXS5yLCB0ZW1wLmkgPSB4W2lfXzNdLmk7CisJCSAgICBsID0ga3BsdXMxIC0gajsKKwkJICAgIGlmIChub2NvbmopIHsKKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICBpX18zID0ga3BsdXMxICsgaiAqIGFfZGltMTsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKiBhW2lfXzNdLnIgLSB0ZW1wLmkgKiBhW2lfXzNdLmksIAorCQkJCSAgICBxX18xLmkgPSB0ZW1wLnIgKiBhW2lfXzNdLmkgKyB0ZW1wLmkgKiBhWworCQkJCSAgICBpX18zXS5yOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fNCA9IDEsIGlfXzEgPSBqIC0gKms7CisJCQlpX18zID0gbWF4KGlfXzQsaV9fMSk7CisJCQlmb3IgKGlfXyA9IGogLSAxOyBpX18gPj0gaV9fMzsgLS1pX18pIHsKKwkJCSAgICBpX180ID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgaV9fMSA9IGlfXzsKKwkJCSAgICBxX18yLnIgPSBhW2lfXzRdLnIgKiB4W2lfXzFdLnIgLSBhW2lfXzRdLmkgKiB4WworCQkJCSAgICBpX18xXS5pLCBxX18yLmkgPSBhW2lfXzRdLnIgKiB4W2lfXzFdLmkgKyAKKwkJCQkgICAgYVtpX180XS5pICogeFtpX18xXS5yOworCQkJICAgIHFfXzEuciA9IHRlbXAuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHFfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSBxX18xLnIsIHRlbXAuaSA9IHFfXzEuaTsKKy8qIEw5MDogKi8KKwkJCX0KKwkJICAgIH0gZWxzZSB7CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgcl9jbmpnKCZxX18yLCAmYVtrcGx1czEgKyBqICogYV9kaW0xXSk7CisJCQkgICAgcV9fMS5yID0gdGVtcC5yICogcV9fMi5yIC0gdGVtcC5pICogcV9fMi5pLCAKKwkJCQkgICAgcV9fMS5pID0gdGVtcC5yICogcV9fMi5pICsgdGVtcC5pICogCisJCQkJICAgIHFfXzIucjsKKwkJCSAgICB0ZW1wLnIgPSBxX18xLnIsIHRlbXAuaSA9IHFfXzEuaTsKKwkJCX0KKy8qIENvbXB1dGluZyBNQVggKi8KKwkJCWlfXzQgPSAxLCBpX18xID0gaiAtICprOworCQkJaV9fMyA9IG1heChpX180LGlfXzEpOworCQkJZm9yIChpX18gPSBqIC0gMTsgaV9fID49IGlfXzM7IC0taV9fKSB7CisJCQkgICAgcl9jbmpnKCZxX18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkJICAgIGlfXzQgPSBpX187CisJCQkgICAgcV9fMi5yID0gcV9fMy5yICogeFtpX180XS5yIC0gcV9fMy5pICogeFtpX180XS5pLCAKKwkJCQkgICAgcV9fMi5pID0gcV9fMy5yICogeFtpX180XS5pICsgcV9fMy5pICogeFsKKwkJCQkgICAgaV9fNF0ucjsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKyBxX18yLnIsIHFfXzEuaSA9IHRlbXAuaSArIAorCQkJCSAgICBxX18yLmk7CisJCQkgICAgdGVtcC5yID0gcV9fMS5yLCB0ZW1wLmkgPSBxX18xLmk7CisvKiBMMTAwOiAqLworCQkJfQorCQkgICAgfQorCQkgICAgaV9fMyA9IGo7CisJCSAgICB4W2lfXzNdLnIgPSB0ZW1wLnIsIHhbaV9fM10uaSA9IHRlbXAuaTsKKy8qIEwxMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJa3ggKz0gKCpuIC0gMSkgKiAqaW5jeDsKKwkJanggPSBreDsKKwkJZm9yIChqID0gKm47IGogPj0gMTsgLS1qKSB7CisJCSAgICBpX18zID0gang7CisJCSAgICB0ZW1wLnIgPSB4W2lfXzNdLnIsIHRlbXAuaSA9IHhbaV9fM10uaTsKKwkJICAgIGt4IC09ICppbmN4OworCQkgICAgaXggPSBreDsKKwkJICAgIGwgPSBrcGx1czEgLSBqOworCQkgICAgaWYgKG5vY29uaikgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzMgPSBrcGx1czEgKyBqICogYV9kaW0xOworCQkJICAgIHFfXzEuciA9IHRlbXAuciAqIGFbaV9fM10uciAtIHRlbXAuaSAqIGFbaV9fM10uaSwgCisJCQkJICAgIHFfXzEuaSA9IHRlbXAuciAqIGFbaV9fM10uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzNdLnI7CisJCQkgICAgdGVtcC5yID0gcV9fMS5yLCB0ZW1wLmkgPSBxX18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMSA9IGogLSAqazsKKwkJCWlfXzMgPSBtYXgoaV9fNCxpX18xKTsKKwkJCWZvciAoaV9fID0gaiAtIDE7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIGlfXzQgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJCSAgICBpX18xID0gaXg7CisJCQkgICAgcV9fMi5yID0gYVtpX180XS5yICogeFtpX18xXS5yIC0gYVtpX180XS5pICogeFsKKwkJCQkgICAgaV9fMV0uaSwgcV9fMi5pID0gYVtpX180XS5yICogeFtpX18xXS5pICsgCisJCQkJICAgIGFbaV9fNF0uaSAqIHhbaV9fMV0ucjsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKyBxX18yLnIsIHFfXzEuaSA9IHRlbXAuaSArIAorCQkJCSAgICBxX18yLmk7CisJCQkgICAgdGVtcC5yID0gcV9fMS5yLCB0ZW1wLmkgPSBxX18xLmk7CisJCQkgICAgaXggLT0gKmluY3g7CisvKiBMMTIwOiAqLworCQkJfQorCQkgICAgfSBlbHNlIHsKKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICByX2NuamcoJnFfXzIsICZhW2twbHVzMSArIGogKiBhX2RpbTFdKTsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKiBxX18yLnIgLSB0ZW1wLmkgKiBxX18yLmksIAorCQkJCSAgICBxX18xLmkgPSB0ZW1wLnIgKiBxX18yLmkgKyB0ZW1wLmkgKiAKKwkJCQkgICAgcV9fMi5yOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fNCA9IDEsIGlfXzEgPSBqIC0gKms7CisJCQlpX18zID0gbWF4KGlfXzQsaV9fMSk7CisJCQlmb3IgKGlfXyA9IGogLSAxOyBpX18gPj0gaV9fMzsgLS1pX18pIHsKKwkJCSAgICByX2NuamcoJnFfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCQkgICAgaV9fNCA9IGl4OworCQkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fNF0uciAtIHFfXzMuaSAqIHhbaV9fNF0uaSwgCisJCQkJICAgIHFfXzIuaSA9IHFfXzMuciAqIHhbaV9fNF0uaSArIHFfXzMuaSAqIHhbCisJCQkJICAgIGlfXzRdLnI7CisJCQkgICAgcV9fMS5yID0gdGVtcC5yICsgcV9fMi5yLCBxX18xLmkgPSB0ZW1wLmkgKyAKKwkJCQkgICAgcV9fMi5pOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJICAgIGl4IC09ICppbmN4OworLyogTDEzMDogKi8KKwkJCX0KKwkJICAgIH0KKwkJICAgIGlfXzMgPSBqeDsKKwkJICAgIHhbaV9fM10uciA9IHRlbXAuciwgeFtpX18zXS5pID0gdGVtcC5pOworCQkgICAganggLT0gKmluY3g7CisvKiBMMTQwOiAqLworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlpX18zID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMzsgKytqKSB7CisJCSAgICBpX180ID0gajsKKwkJICAgIHRlbXAuciA9IHhbaV9fNF0uciwgdGVtcC5pID0geFtpX180XS5pOworCQkgICAgbCA9IDEgLSBqOworCQkgICAgaWYgKG5vY29uaikgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzQgPSBqICogYV9kaW0xICsgMTsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKiBhW2lfXzRdLnIgLSB0ZW1wLmkgKiBhW2lfXzRdLmksIAorCQkJCSAgICBxX18xLmkgPSB0ZW1wLnIgKiBhW2lfXzRdLmkgKyB0ZW1wLmkgKiBhWworCQkJCSAgICBpX180XS5yOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18yID0gaiArICprOworCQkJaV9fNCA9IG1pbihpX18xLGlfXzIpOworCQkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzQ7ICsraV9fKSB7CisJCQkgICAgaV9fMSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIGlfXzIgPSBpX187CisJCQkgICAgcV9fMi5yID0gYVtpX18xXS5yICogeFtpX18yXS5yIC0gYVtpX18xXS5pICogeFsKKwkJCQkgICAgaV9fMl0uaSwgcV9fMi5pID0gYVtpX18xXS5yICogeFtpX18yXS5pICsgCisJCQkJICAgIGFbaV9fMV0uaSAqIHhbaV9fMl0ucjsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKyBxX18yLnIsIHFfXzEuaSA9IHRlbXAuaSArIAorCQkJCSAgICBxX18yLmk7CisJCQkgICAgdGVtcC5yID0gcV9fMS5yLCB0ZW1wLmkgPSBxX18xLmk7CisvKiBMMTUwOiAqLworCQkJfQorCQkgICAgfSBlbHNlIHsKKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICByX2NuamcoJnFfXzIsICZhW2ogKiBhX2RpbTEgKyAxXSk7CisJCQkgICAgcV9fMS5yID0gdGVtcC5yICogcV9fMi5yIC0gdGVtcC5pICogcV9fMi5pLCAKKwkJCQkgICAgcV9fMS5pID0gdGVtcC5yICogcV9fMi5pICsgdGVtcC5pICogCisJCQkJICAgIHFfXzIucjsKKwkJCSAgICB0ZW1wLnIgPSBxX18xLnIsIHRlbXAuaSA9IHFfXzEuaTsKKwkJCX0KKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzEgPSAqbiwgaV9fMiA9IGogKyAqazsKKwkJCWlfXzQgPSBtaW4oaV9fMSxpX18yKTsKKwkJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX180OyArK2lfXykgeworCQkJICAgIHJfY25qZygmcV9fMywgJmFbbCArIGlfXyArIGogKiBhX2RpbTFdKTsKKwkJCSAgICBpX18xID0gaV9fOworCQkJICAgIHFfXzIuciA9IHFfXzMuciAqIHhbaV9fMV0uciAtIHFfXzMuaSAqIHhbaV9fMV0uaSwgCisJCQkJICAgIHFfXzIuaSA9IHFfXzMuciAqIHhbaV9fMV0uaSArIHFfXzMuaSAqIHhbCisJCQkJICAgIGlfXzFdLnI7CisJCQkgICAgcV9fMS5yID0gdGVtcC5yICsgcV9fMi5yLCBxX18xLmkgPSB0ZW1wLmkgKyAKKwkJCQkgICAgcV9fMi5pOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworLyogTDE2MDogKi8KKwkJCX0KKwkJICAgIH0KKwkJICAgIGlfXzQgPSBqOworCQkgICAgeFtpX180XS5yID0gdGVtcC5yLCB4W2lfXzRdLmkgPSB0ZW1wLmk7CisvKiBMMTcwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWp4ID0ga3g7CisJCWlfXzMgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18zOyArK2opIHsKKwkJICAgIGlfXzQgPSBqeDsKKwkJICAgIHRlbXAuciA9IHhbaV9fNF0uciwgdGVtcC5pID0geFtpX180XS5pOworCQkgICAga3ggKz0gKmluY3g7CisJCSAgICBpeCA9IGt4OworCQkgICAgbCA9IDEgLSBqOworCQkgICAgaWYgKG5vY29uaikgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzQgPSBqICogYV9kaW0xICsgMTsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKiBhW2lfXzRdLnIgLSB0ZW1wLmkgKiBhW2lfXzRdLmksIAorCQkJCSAgICBxX18xLmkgPSB0ZW1wLnIgKiBhW2lfXzRdLmkgKyB0ZW1wLmkgKiBhWworCQkJCSAgICBpX180XS5yOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18yID0gaiArICprOworCQkJaV9fNCA9IG1pbihpX18xLGlfXzIpOworCQkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzQ7ICsraV9fKSB7CisJCQkgICAgaV9fMSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIGlfXzIgPSBpeDsKKwkJCSAgICBxX18yLnIgPSBhW2lfXzFdLnIgKiB4W2lfXzJdLnIgLSBhW2lfXzFdLmkgKiB4WworCQkJCSAgICBpX18yXS5pLCBxX18yLmkgPSBhW2lfXzFdLnIgKiB4W2lfXzJdLmkgKyAKKwkJCQkgICAgYVtpX18xXS5pICogeFtpX18yXS5yOworCQkJICAgIHFfXzEuciA9IHRlbXAuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHFfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSBxX18xLnIsIHRlbXAuaSA9IHFfXzEuaTsKKwkJCSAgICBpeCArPSAqaW5jeDsKKy8qIEwxODA6ICovCisJCQl9CisJCSAgICB9IGVsc2UgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIHJfY25qZygmcV9fMiwgJmFbaiAqIGFfZGltMSArIDFdKTsKKwkJCSAgICBxX18xLnIgPSB0ZW1wLnIgKiBxX18yLnIgLSB0ZW1wLmkgKiBxX18yLmksIAorCQkJCSAgICBxX18xLmkgPSB0ZW1wLnIgKiBxX18yLmkgKyB0ZW1wLmkgKiAKKwkJCQkgICAgcV9fMi5yOworCQkJICAgIHRlbXAuciA9IHFfXzEuciwgdGVtcC5pID0gcV9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18yID0gaiArICprOworCQkJaV9fNCA9IG1pbihpX18xLGlfXzIpOworCQkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzQ7ICsraV9fKSB7CisJCQkgICAgcl9jbmpnKCZxX18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkJICAgIGlfXzEgPSBpeDsKKwkJCSAgICBxX18yLnIgPSBxX18zLnIgKiB4W2lfXzFdLnIgLSBxX18zLmkgKiB4W2lfXzFdLmksIAorCQkJCSAgICBxX18yLmkgPSBxX18zLnIgKiB4W2lfXzFdLmkgKyBxX18zLmkgKiB4WworCQkJCSAgICBpX18xXS5yOworCQkJICAgIHFfXzEuciA9IHRlbXAuciArIHFfXzIuciwgcV9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHFfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSBxX18xLnIsIHRlbXAuaSA9IHFfXzEuaTsKKwkJCSAgICBpeCArPSAqaW5jeDsKKy8qIEwxOTA6ICovCisJCQl9CisJCSAgICB9CisJCSAgICBpX180ID0gang7CisJCSAgICB4W2lfXzRdLnIgPSB0ZW1wLnIsIHhbaV9fNF0uaSA9IHRlbXAuaTsKKwkJICAgIGp4ICs9ICppbmN4OworLyogTDIwMDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIENUQk1WIC4gKi8KKworfSAvKiBjdGJtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvZF9jbmpnLmMgYi9ibGFzL2YyYy9kX2NuamcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMwOTBjCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9mMmMvZF9jbmpnLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiICAgIAorCit2b2lkIGRfY25qZyhkb3VibGVjb21wbGV4ICpyLCBkb3VibGVjb21wbGV4ICp6KSB7CisgICAgci0+ciA9IHotPnI7CisgICAgci0+aSA9IC0oei0+aSk7Cit9CmRpZmYgLS1naXQgYS9ibGFzL2YyYy9kYXRhdHlwZXMuaCBiL2JsYXMvZjJjL2RhdGF0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjMyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9kYXRhdHlwZXMuaApAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIGNvbnRhaW5zIGEgbGltaXRlZCBzdWJzZXQgb2YgdGhlIHR5cGVkZWZzIGV4cG9zZWQgYnkgZjJjCisgICBmb3IgdXNlIGJ5IHRoZSBFaWdlbiBCTEFTIEMtb25seSBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19FSUdFTl9EQVRBVFlQRVNfSF9fCisjZGVmaW5lIF9fRUlHRU5fREFUQVRZUEVTX0hfXworCit0eXBlZGVmIGludCBpbnRlZ2VyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludGVnZXI7Cit0eXBlZGVmIGZsb2F0IHJlYWw7Cit0eXBlZGVmIGRvdWJsZSBkb3VibGVyZWFsOwordHlwZWRlZiBzdHJ1Y3QgeyByZWFsIHIsIGk7IH0gY29tcGxleDsKK3R5cGVkZWYgc3RydWN0IHsgZG91YmxlcmVhbCByLCBpOyB9IGRvdWJsZWNvbXBsZXg7Cit0eXBlZGVmIGludCBmdG5sZW47Cit0eXBlZGVmIGludCBsb2dpY2FsOworCisjZGVmaW5lIGFicyh4KSAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQorI2RlZmluZSBkYWJzKHgpIChkb3VibGVyZWFsKWFicyh4KQorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgbWF4KGEsYikgKChhKSA+PSAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIGRtaW4oYSxiKSAoZG91YmxlcmVhbCltaW4oYSxiKQorI2RlZmluZSBkbWF4KGEsYikgKGRvdWJsZXJlYWwpbWF4KGEsYikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ibGFzL2YyYy9kcm90bS5jIGIvYmxhcy9mMmMvZHJvdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E3NzliCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9mMmMvZHJvdG0uYwpAQCAtMCwwICsxLDIxNSBAQAorLyogZHJvdG0uZiAtLSB0cmFuc2xhdGVkIGJ5IGYyYyAodmVyc2lvbiAyMDEwMDgyNykuCisgICBZb3UgbXVzdCBsaW5rIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2l0aCBsaWJmMmM6CisJb24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtLCBsaW5rIHdpdGggbGliZjJjLmxpYjsKKwlvbiBMaW51eCBvciBVbml4IHN5c3RlbXMsIGxpbmsgd2l0aCAuLi4vcGF0aC90by9saWJmMmMuYSAtbG0KKwlvciwgaWYgeW91IGluc3RhbGwgbGliZjJjLmEgaW4gYSBzdGFuZGFyZCBwbGFjZSwgd2l0aCAtbGYyYyAtbG0KKwktLSBpbiB0aGF0IG9yZGVyLCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluCisJCWNjICoubyAtbGYyYyAtbG0KKwlTb3VyY2UgZm9yIGxpYmYyYyBpcyBpbiAvbmV0bGliL2YyYy9saWJmMmMuemlwLCBlLmcuLAorCisJCWh0dHA6Ly93d3cubmV0bGliLm9yZy9mMmMvbGliZjJjLnppcAorKi8KKworI2luY2x1ZGUgImRhdGF0eXBlcy5oIgorCisvKiBTdWJyb3V0aW5lICovIGludCBkcm90bV8oaW50ZWdlciAqbiwgZG91YmxlcmVhbCAqZHgsIGludGVnZXIgKmluY3gsIAorCWRvdWJsZXJlYWwgKmR5LCBpbnRlZ2VyICppbmN5LCBkb3VibGVyZWFsICpkcGFyYW0pCit7CisgICAgLyogSW5pdGlhbGl6ZWQgZGF0YSAqLworCisgICAgc3RhdGljIGRvdWJsZXJlYWwgemVybyA9IDAuOworICAgIHN0YXRpYyBkb3VibGVyZWFsIHR3byA9IDIuOworCisgICAgLyogU3lzdGVtIGdlbmVyYXRlZCBsb2NhbHMgKi8KKyAgICBpbnRlZ2VyIGlfXzEsIGlfXzI7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnRlZ2VyIGlfXzsKKyAgICBkb3VibGVyZWFsIHcsIHpfXzsKKyAgICBpbnRlZ2VyIGt4LCBreTsKKyAgICBkb3VibGVyZWFsIGRoMTEsIGRoMTIsIGRoMjEsIGRoMjIsIGRmbGFnOworICAgIGludGVnZXIgbnN0ZXBzOworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICAgICBBUFBMWSBUSEUgTU9ESUZJRUQgR0lWRU5TIFRSQU5TRk9STUFUSU9OLCBILCBUTyBUSEUgMiBCWSBOIE1BVFJJWCAqLworCisvKiAgICAgKERYKipUKSAsIFdIRVJFICoqVCBJTkRJQ0FURVMgVFJBTlNQT1NFLiBUSEUgRUxFTUVOVFMgT0YgRFggQVJFIElOICovCisvKiAgICAgKERZKipUKSAqLworCisvKiAgICAgRFgoTFgrSSpJTkNYKSwgSSA9IDAgVE8gTi0xLCBXSEVSRSBMWCA9IDEgSUYgSU5DWCAuR0UuIDAsIEVMU0UgKi8KKy8qICAgICBMWCA9ICgtSU5DWCkqTiwgQU5EIFNJTUlMQVJMWSBGT1IgU1kgVVNJTkcgTFkgQU5EIElOQ1kuICovCisvKiAgICAgV0lUSCBEUEFSQU0oMSk9REZMQUcsIEggSEFTIE9ORSBPRiBUSEUgRk9MTE9XSU5HIEZPUk1TLi4gKi8KKworLyogICAgIERGTEFHPS0xLkQwICAgICBERkxBRz0wLkQwICAgICAgICBERkxBRz0xLkQwICAgICBERkxBRz0tMi5EMCAqLworCisvKiAgICAgICAoREgxMSAgREgxMikgICAgKDEuRDAgIERIMTIpICAgIChESDExICAxLkQwKSAgICAoMS5EMCAgMC5EMCkgKi8KKy8qICAgICBIPSggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKSAqLworLyogICAgICAgKERIMjEgIERIMjIpLCAgIChESDIxICAxLkQwKSwgICAoLTEuRDAgREgyMiksICAgKDAuRDAgIDEuRDApLiAqLworLyogICAgIFNFRSBEUk9UTUcgRk9SIEEgREVTQ1JJUFRJT04gT0YgREFUQSBTVE9SQUdFIElOIERQQVJBTS4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PSAqLworCisvKiAgTiAgICAgIChpbnB1dCkgSU5URUdFUiAqLworLyogICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gaW5wdXQgdmVjdG9yKHMpICovCisKKy8qICBEWCAgICAgKGlucHV0L291dHB1dCkgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIE4gKi8KKy8qICAgICAgICAgZG91YmxlIHByZWNpc2lvbiB2ZWN0b3Igd2l0aCBOIGVsZW1lbnRzICovCisKKy8qICBJTkNYICAgKGlucHV0KSBJTlRFR0VSICovCisvKiAgICAgICAgIHN0b3JhZ2Ugc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9mIERYICovCisKKy8qICBEWSAgICAgKGlucHV0L291dHB1dCkgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIE4gKi8KKy8qICAgICAgICAgZG91YmxlIHByZWNpc2lvbiB2ZWN0b3Igd2l0aCBOIGVsZW1lbnRzICovCisKKy8qICBJTkNZICAgKGlucHV0KSBJTlRFR0VSICovCisvKiAgICAgICAgIHN0b3JhZ2Ugc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9mIERZICovCisKKy8qICBEUEFSQU0gKGlucHV0L291dHB1dCkgIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbiA1ICovCisvKiAgICAgRFBBUkFNKDEpPURGTEFHICovCisvKiAgICAgRFBBUkFNKDIpPURIMTEgKi8KKy8qICAgICBEUEFSQU0oMyk9REgyMSAqLworLyogICAgIERQQVJBTSg0KT1ESDEyICovCisvKiAgICAgRFBBUkFNKDUpPURIMjIgKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uICovCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgLS1kcGFyYW07CisgICAgLS1keTsKKyAgICAtLWR4OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworLyogICAgIC4uICovCisKKyAgICBkZmxhZyA9IGRwYXJhbVsxXTsKKyAgICBpZiAoKm4gPD0gMCB8fCBkZmxhZyArIHR3byA9PSB6ZXJvKSB7CisJZ290byBMMTQwOworICAgIH0KKyAgICBpZiAoISAoKmluY3ggPT0gKmluY3kgJiYgKmluY3ggPiAwKSkgeworCWdvdG8gTDcwOworICAgIH0KKworICAgIG5zdGVwcyA9ICpuICogKmluY3g7CisgICAgaWYgKGRmbGFnIDwgMC4pIHsKKwlnb3RvIEw1MDsKKyAgICB9IGVsc2UgaWYgKGRmbGFnID09IDApIHsKKwlnb3RvIEwxMDsKKyAgICB9IGVsc2UgeworCWdvdG8gTDMwOworICAgIH0KK0wxMDoKKyAgICBkaDEyID0gZHBhcmFtWzRdOworICAgIGRoMjEgPSBkcGFyYW1bM107CisgICAgaV9fMSA9IG5zdGVwczsKKyAgICBpX18yID0gKmluY3g7CisgICAgZm9yIChpX18gPSAxOyBpX18yIDwgMCA/IGlfXyA+PSBpX18xIDogaV9fIDw9IGlfXzE7IGlfXyArPSBpX18yKSB7CisJdyA9IGR4W2lfX107CisJel9fID0gZHlbaV9fXTsKKwlkeFtpX19dID0gdyArIHpfXyAqIGRoMTI7CisJZHlbaV9fXSA9IHcgKiBkaDIxICsgel9fOworLyogTDIwOiAqLworICAgIH0KKyAgICBnb3RvIEwxNDA7CitMMzA6CisgICAgZGgxMSA9IGRwYXJhbVsyXTsKKyAgICBkaDIyID0gZHBhcmFtWzVdOworICAgIGlfXzIgPSBuc3RlcHM7CisgICAgaV9fMSA9ICppbmN4OworICAgIGZvciAoaV9fID0gMTsgaV9fMSA8IDAgPyBpX18gPj0gaV9fMiA6IGlfXyA8PSBpX18yOyBpX18gKz0gaV9fMSkgeworCXcgPSBkeFtpX19dOworCXpfXyA9IGR5W2lfX107CisJZHhbaV9fXSA9IHcgKiBkaDExICsgel9fOworCWR5W2lfX10gPSAtdyArIGRoMjIgKiB6X187CisvKiBMNDA6ICovCisgICAgfQorICAgIGdvdG8gTDE0MDsKK0w1MDoKKyAgICBkaDExID0gZHBhcmFtWzJdOworICAgIGRoMTIgPSBkcGFyYW1bNF07CisgICAgZGgyMSA9IGRwYXJhbVszXTsKKyAgICBkaDIyID0gZHBhcmFtWzVdOworICAgIGlfXzEgPSBuc3RlcHM7CisgICAgaV9fMiA9ICppbmN4OworICAgIGZvciAoaV9fID0gMTsgaV9fMiA8IDAgPyBpX18gPj0gaV9fMSA6IGlfXyA8PSBpX18xOyBpX18gKz0gaV9fMikgeworCXcgPSBkeFtpX19dOworCXpfXyA9IGR5W2lfX107CisJZHhbaV9fXSA9IHcgKiBkaDExICsgel9fICogZGgxMjsKKwlkeVtpX19dID0gdyAqIGRoMjEgKyB6X18gKiBkaDIyOworLyogTDYwOiAqLworICAgIH0KKyAgICBnb3RvIEwxNDA7CitMNzA6CisgICAga3ggPSAxOworICAgIGt5ID0gMTsKKyAgICBpZiAoKmluY3ggPCAwKSB7CisJa3ggPSAoMSAtICpuKSAqICppbmN4ICsgMTsKKyAgICB9CisgICAgaWYgKCppbmN5IDwgMCkgeworCWt5ID0gKDEgLSAqbikgKiAqaW5jeSArIDE7CisgICAgfQorCisgICAgaWYgKGRmbGFnIDwgMC4pIHsKKwlnb3RvIEwxMjA7CisgICAgfSBlbHNlIGlmIChkZmxhZyA9PSAwKSB7CisJZ290byBMODA7CisgICAgfSBlbHNlIHsKKwlnb3RvIEwxMDA7CisgICAgfQorTDgwOgorICAgIGRoMTIgPSBkcGFyYW1bNF07CisgICAgZGgyMSA9IGRwYXJhbVszXTsKKyAgICBpX18yID0gKm47CisgICAgZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMjsgKytpX18pIHsKKwl3ID0gZHhba3hdOworCXpfXyA9IGR5W2t5XTsKKwlkeFtreF0gPSB3ICsgel9fICogZGgxMjsKKwlkeVtreV0gPSB3ICogZGgyMSArIHpfXzsKKwlreCArPSAqaW5jeDsKKwlreSArPSAqaW5jeTsKKy8qIEw5MDogKi8KKyAgICB9CisgICAgZ290byBMMTQwOworTDEwMDoKKyAgICBkaDExID0gZHBhcmFtWzJdOworICAgIGRoMjIgPSBkcGFyYW1bNV07CisgICAgaV9fMiA9ICpuOworICAgIGZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzI7ICsraV9fKSB7CisJdyA9IGR4W2t4XTsKKwl6X18gPSBkeVtreV07CisJZHhba3hdID0gdyAqIGRoMTEgKyB6X187CisJZHlba3ldID0gLXcgKyBkaDIyICogel9fOworCWt4ICs9ICppbmN4OworCWt5ICs9ICppbmN5OworLyogTDExMDogKi8KKyAgICB9CisgICAgZ290byBMMTQwOworTDEyMDoKKyAgICBkaDExID0gZHBhcmFtWzJdOworICAgIGRoMTIgPSBkcGFyYW1bNF07CisgICAgZGgyMSA9IGRwYXJhbVszXTsKKyAgICBkaDIyID0gZHBhcmFtWzVdOworICAgIGlfXzIgPSAqbjsKKyAgICBmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCXcgPSBkeFtreF07CisJel9fID0gZHlba3ldOworCWR4W2t4XSA9IHcgKiBkaDExICsgel9fICogZGgxMjsKKwlkeVtreV0gPSB3ICogZGgyMSArIHpfXyAqIGRoMjI7CisJa3ggKz0gKmluY3g7CisJa3kgKz0gKmluY3k7CisvKiBMMTMwOiAqLworICAgIH0KK0wxNDA6CisgICAgcmV0dXJuIDA7Cit9IC8qIGRyb3RtXyAqLworCmRpZmYgLS1naXQgYS9ibGFzL2YyYy9kcm90bWcuYyBiL2JsYXMvZjJjL2Ryb3RtZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2M2ViMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9kcm90bWcuYwpAQCAtMCwwICsxLDI5MyBAQAorLyogZHJvdG1nLmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgZHJvdG1nXyhkb3VibGVyZWFsICpkZDEsIGRvdWJsZXJlYWwgKmRkMiwgZG91YmxlcmVhbCAqCisJZHgxLCBkb3VibGVyZWFsICpkeTEsIGRvdWJsZXJlYWwgKmRwYXJhbSkKK3sKKyAgICAvKiBJbml0aWFsaXplZCBkYXRhICovCisKKyAgICBzdGF0aWMgZG91YmxlcmVhbCB6ZXJvID0gMC47CisgICAgc3RhdGljIGRvdWJsZXJlYWwgb25lID0gMS47CisgICAgc3RhdGljIGRvdWJsZXJlYWwgdHdvID0gMi47CisgICAgc3RhdGljIGRvdWJsZXJlYWwgZ2FtID0gNDA5Ni47CisgICAgc3RhdGljIGRvdWJsZXJlYWwgZ2Ftc3EgPSAxNjc3NzIxNi47CisgICAgc3RhdGljIGRvdWJsZXJlYWwgcmdhbXNxID0gNS45NjA0NjQ1ZS04OworCisgICAgLyogRm9ybWF0IHN0cmluZ3MgKi8KKyAgICBzdGF0aWMgY2hhciBmbXRfMTIwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMTUwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMTgwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMjEwW10gPSAiIjsKKworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgZG91YmxlcmVhbCBkX18xOworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgZG91YmxlcmVhbCBkdSwgZHAxLCBkcDIsIGRxMSwgZHEyLCBkaDExLCBkaDEyLCBkaDIxLCBkaDIyOworICAgIGludGVnZXIgaWdvOworICAgIGRvdWJsZXJlYWwgZGZsYWcsIGR0ZW1wOworCisgICAgLyogQXNzaWduZWQgZm9ybWF0IHZhcmlhYmxlcyAqLworICAgIHN0YXRpYyBjaGFyICppZ29fZm10OworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICAgICBDT05TVFJVQ1QgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiBNQVRSSVggSCBXSElDSCBaRVJPUyAqLworLyogICAgIFRIRSBTRUNPTkQgQ09NUE9ORU5UIE9GIFRIRSAyLVZFQ1RPUiAgKERTUVJUKEREMSkqRFgxLERTUVJUKEREMikqICovCisvKiAgICAgRFkyKSoqVC4gKi8KKy8qICAgICBXSVRIIERQQVJBTSgxKT1ERkxBRywgSCBIQVMgT05FIE9GIFRIRSBGT0xMT1dJTkcgRk9STVMuLiAqLworCisvKiAgICAgREZMQUc9LTEuRDAgICAgIERGTEFHPTAuRDAgICAgICAgIERGTEFHPTEuRDAgICAgIERGTEFHPS0yLkQwICovCisKKy8qICAgICAgIChESDExICBESDEyKSAgICAoMS5EMCAgREgxMikgICAgKERIMTEgIDEuRDApICAgICgxLkQwICAwLkQwKSAqLworLyogICAgIEg9KCAgICAgICAgICApICAgICggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICovCisvKiAgICAgICAoREgyMSAgREgyMiksICAgKERIMjEgIDEuRDApLCAgICgtMS5EMCBESDIyKSwgICAoMC5EMCAgMS5EMCkuICovCisvKiAgICAgTE9DQVRJT05TIDItNCBPRiBEUEFSQU0gQ09OVEFJTiBESDExLCBESDIxLCBESDEyLCBBTkQgREgyMiAqLworLyogICAgIFJFU1BFQ1RJVkVMWS4gKFZBTFVFUyBPRiAxLkQwLCAtMS5EMCwgT1IgMC5EMCBJTVBMSUVEIEJZIFRIRSAqLworLyogICAgIFZBTFVFIE9GIERQQVJBTSgxKSBBUkUgTk9UIFNUT1JFRCBJTiBEUEFSQU0uKSAqLworCisvKiAgICAgVEhFIFZBTFVFUyBPRiBHQU1TUSBBTkQgUkdBTVNRIFNFVCBJTiBUSEUgREFUQSBTVEFURU1FTlQgTUFZIEJFICovCisvKiAgICAgSU5FWEFDVC4gIFRISVMgSVMgT0sgQVMgVEhFWSBBUkUgT05MWSBVU0VEIEZPUiBURVNUSU5HIFRIRSBTSVpFICovCisvKiAgICAgT0YgREQxIEFORCBERDIuICBBTEwgQUNUVUFMIFNDQUxJTkcgT0YgREFUQSBJUyBET05FIFVTSU5HIEdBTS4gKi8KKworCisvKiAgQXJndW1lbnRzICovCisvKiAgPT09PT09PT09ICovCisKKy8qICBERDEgICAgKGlucHV0L291dHB1dCkgRE9VQkxFIFBSRUNJU0lPTiAqLworCisvKiAgREQyICAgIChpbnB1dC9vdXRwdXQpIERPVUJMRSBQUkVDSVNJT04gKi8KKworLyogIERYMSAgICAoaW5wdXQvb3V0cHV0KSBET1VCTEUgUFJFQ0lTSU9OICovCisKKy8qICBEWTEgICAgKGlucHV0KSBET1VCTEUgUFJFQ0lTSU9OICovCisKKy8qICBEUEFSQU0gKGlucHV0L291dHB1dCkgIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbiA1ICovCisvKiAgICAgRFBBUkFNKDEpPURGTEFHICovCisvKiAgICAgRFBBUkFNKDIpPURIMTEgKi8KKy8qICAgICBEUEFSQU0oMyk9REgyMSAqLworLyogICAgIERQQVJBTSg0KT1ESDEyICovCisvKiAgICAgRFBBUkFNKDUpPURIMjIgKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uICovCisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICAtLWRwYXJhbTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKy8qICAgICAuLiAqLworICAgIGlmICghICgqZGQxIDwgemVybykpIHsKKwlnb3RvIEwxMDsKKyAgICB9CisvKiAgICAgICBHTyBaRVJPLUgtRC1BTkQtRFgxLi4gKi8KKyAgICBnb3RvIEw2MDsKK0wxMDoKKy8qICAgICBDQVNFLUREMS1OT05ORUdBVElWRSAqLworICAgIGRwMiA9ICpkZDIgKiAqZHkxOworICAgIGlmICghIChkcDIgPT0gemVybykpIHsKKwlnb3RvIEwyMDsKKyAgICB9CisgICAgZGZsYWcgPSAtdHdvOworICAgIGdvdG8gTDI2MDsKKy8qICAgICBSRUdVTEFSLUNBU0UuLiAqLworTDIwOgorICAgIGRwMSA9ICpkZDEgKiAqZHgxOworICAgIGRxMiA9IGRwMiAqICpkeTE7CisgICAgZHExID0gZHAxICogKmR4MTsKKworICAgIGlmICghIChhYnMoZHExKSA+IGFicyhkcTIpKSkgeworCWdvdG8gTDQwOworICAgIH0KKyAgICBkaDIxID0gLSgqZHkxKSAvICpkeDE7CisgICAgZGgxMiA9IGRwMiAvIGRwMTsKKworICAgIGR1ID0gb25lIC0gZGgxMiAqIGRoMjE7CisKKyAgICBpZiAoISAoZHUgPD0gemVybykpIHsKKwlnb3RvIEwzMDsKKyAgICB9CisvKiAgICAgICAgIEdPIFpFUk8tSC1ELUFORC1EWDEuLiAqLworICAgIGdvdG8gTDYwOworTDMwOgorICAgIGRmbGFnID0gemVybzsKKyAgICAqZGQxIC89IGR1OworICAgICpkZDIgLz0gZHU7CisgICAgKmR4MSAqPSBkdTsKKy8qICAgICAgICAgR08gU0NBTEUtQ0hFQ0suLiAqLworICAgIGdvdG8gTDEwMDsKK0w0MDoKKyAgICBpZiAoISAoZHEyIDwgemVybykpIHsKKwlnb3RvIEw1MDsKKyAgICB9CisvKiAgICAgICAgIEdPIFpFUk8tSC1ELUFORC1EWDEuLiAqLworICAgIGdvdG8gTDYwOworTDUwOgorICAgIGRmbGFnID0gb25lOworICAgIGRoMTEgPSBkcDEgLyBkcDI7CisgICAgZGgyMiA9ICpkeDEgLyAqZHkxOworICAgIGR1ID0gb25lICsgZGgxMSAqIGRoMjI7CisgICAgZHRlbXAgPSAqZGQyIC8gZHU7CisgICAgKmRkMiA9ICpkZDEgLyBkdTsKKyAgICAqZGQxID0gZHRlbXA7CisgICAgKmR4MSA9ICpkeTEgKiBkdTsKKy8qICAgICAgICAgR08gU0NBTEUtQ0hFQ0sgKi8KKyAgICBnb3RvIEwxMDA7CisvKiAgICAgUFJPQ0VEVVJFLi5aRVJPLUgtRC1BTkQtRFgxLi4gKi8KK0w2MDoKKyAgICBkZmxhZyA9IC1vbmU7CisgICAgZGgxMSA9IHplcm87CisgICAgZGgxMiA9IHplcm87CisgICAgZGgyMSA9IHplcm87CisgICAgZGgyMiA9IHplcm87CisKKyAgICAqZGQxID0gemVybzsKKyAgICAqZGQyID0gemVybzsKKyAgICAqZHgxID0gemVybzsKKy8qICAgICAgICAgUkVUVVJOLi4gKi8KKyAgICBnb3RvIEwyMjA7CisvKiAgICAgUFJPQ0VEVVJFLi5GSVgtSC4uICovCitMNzA6CisgICAgaWYgKCEgKGRmbGFnID49IHplcm8pKSB7CisJZ290byBMOTA7CisgICAgfQorCisgICAgaWYgKCEgKGRmbGFnID09IHplcm8pKSB7CisJZ290byBMODA7CisgICAgfQorICAgIGRoMTEgPSBvbmU7CisgICAgZGgyMiA9IG9uZTsKKyAgICBkZmxhZyA9IC1vbmU7CisgICAgZ290byBMOTA7CitMODA6CisgICAgZGgyMSA9IC1vbmU7CisgICAgZGgxMiA9IG9uZTsKKyAgICBkZmxhZyA9IC1vbmU7CitMOTA6CisgICAgc3dpdGNoIChpZ28pIHsKKwljYXNlIDA6IGdvdG8gTDEyMDsKKwljYXNlIDE6IGdvdG8gTDE1MDsKKwljYXNlIDI6IGdvdG8gTDE4MDsKKwljYXNlIDM6IGdvdG8gTDIxMDsKKyAgICB9CisvKiAgICAgUFJPQ0VEVVJFLi5TQ0FMRS1DSEVDSyAqLworTDEwMDoKK0wxMTA6CisgICAgaWYgKCEgKCpkZDEgPD0gcmdhbXNxKSkgeworCWdvdG8gTDEzMDsKKyAgICB9CisgICAgaWYgKCpkZDEgPT0gemVybykgeworCWdvdG8gTDE2MDsKKyAgICB9CisgICAgaWdvID0gMDsKKyAgICBpZ29fZm10ID0gZm10XzEyMDsKKy8qICAgICAgICAgICAgICBGSVgtSC4uICovCisgICAgZ290byBMNzA7CitMMTIwOgorLyogQ29tcHV0aW5nIDJuZCBwb3dlciAqLworICAgIGRfXzEgPSBnYW07CisgICAgKmRkMSAqPSBkX18xICogZF9fMTsKKyAgICAqZHgxIC89IGdhbTsKKyAgICBkaDExIC89IGdhbTsKKyAgICBkaDEyIC89IGdhbTsKKyAgICBnb3RvIEwxMTA7CitMMTMwOgorTDE0MDoKKyAgICBpZiAoISAoKmRkMSA+PSBnYW1zcSkpIHsKKwlnb3RvIEwxNjA7CisgICAgfQorICAgIGlnbyA9IDE7CisgICAgaWdvX2ZtdCA9IGZtdF8xNTA7CisvKiAgICAgICAgICAgICAgRklYLUguLiAqLworICAgIGdvdG8gTDcwOworTDE1MDoKKy8qIENvbXB1dGluZyAybmQgcG93ZXIgKi8KKyAgICBkX18xID0gZ2FtOworICAgICpkZDEgLz0gZF9fMSAqIGRfXzE7CisgICAgKmR4MSAqPSBnYW07CisgICAgZGgxMSAqPSBnYW07CisgICAgZGgxMiAqPSBnYW07CisgICAgZ290byBMMTQwOworTDE2MDoKK0wxNzA6CisgICAgaWYgKCEgKGFicygqZGQyKSA8PSByZ2Ftc3EpKSB7CisJZ290byBMMTkwOworICAgIH0KKyAgICBpZiAoKmRkMiA9PSB6ZXJvKSB7CisJZ290byBMMjIwOworICAgIH0KKyAgICBpZ28gPSAyOworICAgIGlnb19mbXQgPSBmbXRfMTgwOworLyogICAgICAgICAgICAgIEZJWC1ILi4gKi8KKyAgICBnb3RvIEw3MDsKK0wxODA6CisvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgZF9fMSA9IGdhbTsKKyAgICAqZGQyICo9IGRfXzEgKiBkX18xOworICAgIGRoMjEgLz0gZ2FtOworICAgIGRoMjIgLz0gZ2FtOworICAgIGdvdG8gTDE3MDsKK0wxOTA6CitMMjAwOgorICAgIGlmICghIChhYnMoKmRkMikgPj0gZ2Ftc3EpKSB7CisJZ290byBMMjIwOworICAgIH0KKyAgICBpZ28gPSAzOworICAgIGlnb19mbXQgPSBmbXRfMjEwOworLyogICAgICAgICAgICAgIEZJWC1ILi4gKi8KKyAgICBnb3RvIEw3MDsKK0wyMTA6CisvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgZF9fMSA9IGdhbTsKKyAgICAqZGQyIC89IGRfXzEgKiBkX18xOworICAgIGRoMjEgKj0gZ2FtOworICAgIGRoMjIgKj0gZ2FtOworICAgIGdvdG8gTDIwMDsKK0wyMjA6CisgICAgaWYgKGRmbGFnIDwgMC4pIHsKKwlnb3RvIEwyNTA7CisgICAgfSBlbHNlIGlmIChkZmxhZyA9PSAwKSB7CisJZ290byBMMjMwOworICAgIH0gZWxzZSB7CisJZ290byBMMjQwOworICAgIH0KK0wyMzA6CisgICAgZHBhcmFtWzNdID0gZGgyMTsKKyAgICBkcGFyYW1bNF0gPSBkaDEyOworICAgIGdvdG8gTDI2MDsKK0wyNDA6CisgICAgZHBhcmFtWzJdID0gZGgxMTsKKyAgICBkcGFyYW1bNV0gPSBkaDIyOworICAgIGdvdG8gTDI2MDsKK0wyNTA6CisgICAgZHBhcmFtWzJdID0gZGgxMTsKKyAgICBkcGFyYW1bM10gPSBkaDIxOworICAgIGRwYXJhbVs0XSA9IGRoMTI7CisgICAgZHBhcmFtWzVdID0gZGgyMjsKK0wyNjA6CisgICAgZHBhcmFtWzFdID0gZGZsYWc7CisgICAgcmV0dXJuIDA7Cit9IC8qIGRyb3RtZ18gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvZHNibXYuYyBiL2JsYXMvZjJjL2RzYm12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiNGIyMQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL2RzYm12LmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qIGRzYm12LmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgZHNibXZfKGNoYXIgKnVwbG8sIGludGVnZXIgKm4sIGludGVnZXIgKmssIGRvdWJsZXJlYWwgKgorCWFscGhhLCBkb3VibGVyZWFsICphLCBpbnRlZ2VyICpsZGEsIGRvdWJsZXJlYWwgKngsIGludGVnZXIgKmluY3gsIAorCWRvdWJsZXJlYWwgKmJldGEsIGRvdWJsZXJlYWwgKnksIGludGVnZXIgKmluY3ksIGZ0bmxlbiB1cGxvX2xlbikKK3sKKyAgICAvKiBTeXN0ZW0gZ2VuZXJhdGVkIGxvY2FscyAqLworICAgIGludGVnZXIgYV9kaW0xLCBhX29mZnNldCwgaV9fMSwgaV9fMiwgaV9fMywgaV9fNDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBsLCBpeCwgaXksIGp4LCBqeSwga3gsIGt5LCBpbmZvOworICAgIGRvdWJsZXJlYWwgdGVtcDEsIHRlbXAyOworICAgIGV4dGVybiBsb2dpY2FsIGxzYW1lXyhjaGFyICosIGNoYXIgKiwgZnRubGVuLCBmdG5sZW4pOworICAgIGludGVnZXIga3BsdXMxOworICAgIGV4dGVybiAvKiBTdWJyb3V0aW5lICovIGludCB4ZXJibGFfKGNoYXIgKiwgaW50ZWdlciAqLCBmdG5sZW4pOworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICBEU0JNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3IgIG9wZXJhdGlvbiAqLworCisvKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICovCisKKy8qICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kICovCisvKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLiAqLworCisvKiAgQXJndW1lbnRzICovCisvKiAgPT09PT09PT09PSAqLworCisvKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuICovCisvKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBiYW5kIG1hdHJpeCBBIGlzIGJlaW5nIHN1cHBsaWVkIGFzICovCisvKiAgICAgICAgICAgZm9sbG93czogKi8KKworLyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzdXBwbGllZC4gKi8KKworLyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzdXBwbGllZC4gKi8KKworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgTiAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4gKi8KKy8qICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEsgICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3VwZXItZGlhZ29uYWxzIG9mIHRoZSAqLworLyogICAgICAgICAgIG1hdHJpeCBBLiBLIG11c3Qgc2F0aXNmeSAgMCAubGUuIEsuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBTFBIQSAgLSBET1VCTEUgUFJFQ0lTSU9OLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEEgICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgRElNRU5TSU9OICggTERBLCBuICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKSAqLworLyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgKi8KKy8qICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGNvbHVtbiBieSAqLworLyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAqLworLyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdCAqLworLyogICAgICAgICAgIHBvc2l0aW9uIDIgaW4gcm93IGssIGFuZCBzbyBvbi4gVGhlIHRvcCBsZWZ0IGsgYnkgayB0cmlhbmdsZSAqLworLyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLiAqLworLyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIHVwcGVyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIGEgc3ltbWV0cmljIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsICovCisvKiAgICAgICAgICAgZnVsbCBtYXRyaXggc3RvcmFnZSB0byBiYW5kIHN0b3JhZ2U6ICovCisKKy8qICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4gKi8KKy8qICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBNQVgoIDEsIEogLSBLICksIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93IDEgb2YgKi8KKy8qICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbiAqLworLyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZSAqLworLyogICAgICAgICAgIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciB0aGUgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgKi8KKy8qICAgICAgICAgICBmdWxsIG1hdHJpeCBzdG9yYWdlIHRvIGJhbmQgc3RvcmFnZTogKi8KKworLyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTiAqLworLyogICAgICAgICAgICAgICAgICAgIE0gPSAxIC0gSiAqLworLyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApICovCisvKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUgKi8KKy8qICAgICAgICAgICAgICAyMCBDT05USU5VRSAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBMREEgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZCAqLworLyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCBrICsgMSApLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgKi8KKy8qICAgICAgICAgICB2ZWN0b3IgeC4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIElOQ1ggICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEJFVEEgICAtIERPVUJMRSBQUkVDSVNJT04uICovCisvKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFkgICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlICovCisvKiAgICAgICAgICAgdmVjdG9yIHkuIE9uIGV4aXQsIFkgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZWQgdmVjdG9yIHkuICovCisKKy8qICBJTkNZICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKworLyogIExldmVsIDIgQmxhcyByb3V0aW5lLiAqLworCisvKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuICovCisvKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuICovCisvKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuICovCisKKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogICAgIC4uIFBhcmFtZXRlcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIGFfZGltMSA9ICpsZGE7CisgICAgYV9vZmZzZXQgPSAxICsgYV9kaW0xOworICAgIGEgLT0gYV9vZmZzZXQ7CisgICAgLS14OworICAgIC0teTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICgqbiA8IDApIHsKKwlpbmZvID0gMjsKKyAgICB9IGVsc2UgaWYgKCprIDwgMCkgeworCWluZm8gPSAzOworICAgIH0gZWxzZSBpZiAoKmxkYSA8ICprICsgMSkgeworCWluZm8gPSA2OworICAgIH0gZWxzZSBpZiAoKmluY3ggPT0gMCkgeworCWluZm8gPSA4OworICAgIH0gZWxzZSBpZiAoKmluY3kgPT0gMCkgeworCWluZm8gPSAxMTsKKyAgICB9CisgICAgaWYgKGluZm8gIT0gMCkgeworCXhlcmJsYV8oIkRTQk1WICIsICZpbmZvLCAoZnRubGVuKTYpOworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4gKi8KKworICAgIGlmICgqbiA9PSAwIHx8ICgqYWxwaGEgPT0gMC4gJiYgKmJldGEgPT0gMS4pKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gIFggIGFuZCAgWS4gKi8KKworICAgIGlmICgqaW5jeCA+IDApIHsKKwlreCA9IDE7CisgICAgfSBlbHNlIHsKKwlreCA9IDEgLSAoKm4gLSAxKSAqICppbmN4OworICAgIH0KKyAgICBpZiAoKmluY3kgPiAwKSB7CisJa3kgPSAxOworICAgIH0gZWxzZSB7CisJa3kgPSAxIC0gKCpuIC0gMSkgKiAqaW5jeTsKKyAgICB9CisKKy8qICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQSAqLworLyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuICovCisKKy8qICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4gKi8KKworICAgIGlmICgqYmV0YSAhPSAxLikgeworCWlmICgqaW5jeSA9PSAxKSB7CisJICAgIGlmICgqYmV0YSA9PSAwLikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2lfX10gPSAwLjsKKy8qIEwxMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2lfX10gPSAqYmV0YSAqIHlbaV9fXTsKKy8qIEwyMDogKi8KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXkgPSBreTsKKwkgICAgaWYgKCpiZXRhID09IDAuKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIHlbaXldID0gMC47CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEwzMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2l5XSA9ICpiZXRhICogeVtpeV07CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw0MDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAoKmFscGhhID09IDAuKSB7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gdXBwZXIgdHJpYW5nbGUgb2YgQSBpcyBzdG9yZWQuICovCisKKwlrcGx1czEgPSAqayArIDE7CisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLjsKKwkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCWlfXzIgPSAxLCBpX18zID0gaiAtICprOworCQlpX180ID0gaiAtIDE7CisJCWZvciAoaV9fID0gbWF4KGlfXzIsaV9fMyk7IGlfXyA8PSBpX180OyArK2lfXykgeworCQkgICAgeVtpX19dICs9IHRlbXAxICogYVtsICsgaV9fICsgaiAqIGFfZGltMV07CisJCSAgICB0ZW1wMiArPSBhW2wgKyBpX18gKyBqICogYV9kaW0xXSAqIHhbaV9fXTsKKy8qIEw1MDogKi8KKwkJfQorCQl5W2pdID0geVtqXSArIHRlbXAxICogYVtrcGx1czEgKyBqICogYV9kaW0xXSArICphbHBoYSAqIHRlbXAyOworLyogTDYwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQl0ZW1wMSA9ICphbHBoYSAqIHhbanhdOworCQl0ZW1wMiA9IDAuOworCQlpeCA9IGt4OworCQlpeSA9IGt5OworCQlsID0ga3BsdXMxIC0gajsKKy8qIENvbXB1dGluZyBNQVggKi8KKwkJaV9fNCA9IDEsIGlfXzIgPSBqIC0gKms7CisJCWlfXzMgPSBqIC0gMTsKKwkJZm9yIChpX18gPSBtYXgoaV9fNCxpX18yKTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCSAgICB5W2l5XSArPSB0ZW1wMSAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworCQkgICAgdGVtcDIgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2l4XTsKKwkJICAgIGl4ICs9ICppbmN4OworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNzA6ICovCisJCX0KKwkJeVtqeV0gPSB5W2p5XSArIHRlbXAxICogYVtrcGx1czEgKyBqICogYV9kaW0xXSArICphbHBoYSAqIAorCQkJdGVtcDI7CisJCWp4ICs9ICppbmN4OworCQlqeSArPSAqaW5jeTsKKwkJaWYgKGogPiAqaykgeworCQkgICAga3ggKz0gKmluY3g7CisJCSAgICBreSArPSAqaW5jeTsKKwkJfQorLyogTDgwOiAqLworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisKKy8qICAgICAgICBGb3JtICB5ICB3aGVuIGxvd2VyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLjsKKwkJeVtqXSArPSB0ZW1wMSAqIGFbaiAqIGFfZGltMSArIDFdOworCQlsID0gMSAtIGo7CisvKiBDb21wdXRpbmcgTUlOICovCisJCWlfXzQgPSAqbiwgaV9fMiA9IGogKyAqazsKKwkJaV9fMyA9IG1pbihpX180LGlfXzIpOworCQlmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fMzsgKytpX18pIHsKKwkJICAgIHlbaV9fXSArPSB0ZW1wMSAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworCQkgICAgdGVtcDIgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2lfX107CisvKiBMOTA6ICovCisJCX0KKwkJeVtqXSArPSAqYWxwaGEgKiB0ZW1wMjsKKy8qIEwxMDA6ICovCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBqeCA9IGt4OworCSAgICBqeSA9IGt5OworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqeF07CisJCXRlbXAyID0gMC47CisJCXlbanldICs9IHRlbXAxICogYVtqICogYV9kaW0xICsgMV07CisJCWwgPSAxIC0gajsKKwkJaXggPSBqeDsKKwkJaXkgPSBqeTsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJaV9fNCA9ICpuLCBpX18yID0gaiArICprOworCQlpX18zID0gbWluKGlfXzQsaV9fMik7CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKwkJICAgIHlbaXldICs9IHRlbXAxICogYVtsICsgaV9fICsgaiAqIGFfZGltMV07CisJCSAgICB0ZW1wMiArPSBhW2wgKyBpX18gKyBqICogYV9kaW0xXSAqIHhbaXhdOworLyogTDExMDogKi8KKwkJfQorCQl5W2p5XSArPSAqYWxwaGEgKiB0ZW1wMjsKKwkJanggKz0gKmluY3g7CisJCWp5ICs9ICppbmN5OworLyogTDEyMDogKi8KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworLyogICAgIEVuZCBvZiBEU0JNViAuICovCisKK30gLyogZHNibXZfICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL2RzcG12LmMgYi9ibGFzL2YyYy9kc3Btdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGU5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9kc3Btdi5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiBkc3Btdi5mIC0tIHRyYW5zbGF0ZWQgYnkgZjJjICh2ZXJzaW9uIDIwMTAwODI3KS4KKyAgIFlvdSBtdXN0IGxpbmsgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aXRoIGxpYmYyYzoKKwlvbiBNaWNyb3NvZnQgV2luZG93cyBzeXN0ZW0sIGxpbmsgd2l0aCBsaWJmMmMubGliOworCW9uIExpbnV4IG9yIFVuaXggc3lzdGVtcywgbGluayB3aXRoIC4uLi9wYXRoL3RvL2xpYmYyYy5hIC1sbQorCW9yLCBpZiB5b3UgaW5zdGFsbCBsaWJmMmMuYSBpbiBhIHN0YW5kYXJkIHBsYWNlLCB3aXRoIC1sZjJjIC1sbQorCS0tIGluIHRoYXQgb3JkZXIsIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4KKwkJY2MgKi5vIC1sZjJjIC1sbQorCVNvdXJjZSBmb3IgbGliZjJjIGlzIGluIC9uZXRsaWIvZjJjL2xpYmYyYy56aXAsIGUuZy4sCisKKwkJaHR0cDovL3d3dy5uZXRsaWIub3JnL2YyYy9saWJmMmMuemlwCisqLworCisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiCisKKy8qIFN1YnJvdXRpbmUgKi8gaW50IGRzcG12XyhjaGFyICp1cGxvLCBpbnRlZ2VyICpuLCBkb3VibGVyZWFsICphbHBoYSwgCisJZG91YmxlcmVhbCAqYXAsIGRvdWJsZXJlYWwgKngsIGludGVnZXIgKmluY3gsIGRvdWJsZXJlYWwgKmJldGEsIAorCWRvdWJsZXJlYWwgKnksIGludGVnZXIgKmluY3ksIGZ0bmxlbiB1cGxvX2xlbikKK3sKKyAgICAvKiBTeXN0ZW0gZ2VuZXJhdGVkIGxvY2FscyAqLworICAgIGludGVnZXIgaV9fMSwgaV9fMjsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBrLCBraywgaXgsIGl5LCBqeCwganksIGt4LCBreSwgaW5mbzsKKyAgICBkb3VibGVyZWFsIHRlbXAxLCB0ZW1wMjsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgRFNQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbiAqLworCisvKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICovCisKKy8qICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kICovCisvKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQgKi8KKy8qICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQUxQSEEgIC0gRE9VQkxFIFBSRUNJU0lPTi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBUCAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QgKi8KKy8qICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIHN5bW1ldHJpYyBtYXRyaXggKi8KKy8qICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgKi8KKy8qICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkgKi8KKy8qICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdCAqLworLyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCAqLworLyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSAqLworLyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKSAqLworLyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBYICAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuICovCisvKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIElOQ1ggICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEJFVEEgICAtIERPVUJMRSBQUkVDSVNJT04uICovCisvKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4gV2hlbiBCRVRBIGlzICovCisvKiAgICAgICAgICAgc3VwcGxpZWQgYXMgemVybyB0aGVuIFkgbmVlZCBub3QgYmUgc2V0IG9uIGlucHV0LiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWSAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgbiAqLworLyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHkuIE9uIGV4aXQsIFkgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZWQgKi8KKy8qICAgICAgICAgICB2ZWN0b3IgeS4gKi8KKworLyogIElOQ1kgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEZ1cnRoZXIgRGV0YWlscyAqLworLyogID09PT09PT09PT09PT09PSAqLworCisvKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuICovCisKKy8qICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4gKi8KKy8qICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4gKi8KKy8qICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4gKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gUGFyYW1ldGVycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLiAqLworLyogICAgIC4uICovCisKKy8qICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLiAqLworCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgLS15OworICAgIC0teDsKKyAgICAtLWFwOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGluZm8gPSAwOworICAgIGlmICghIGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh1cGxvLCAiTCIsICgKKwkgICAgZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMTsKKyAgICB9IGVsc2UgaWYgKCpuIDwgMCkgeworCWluZm8gPSAyOworICAgIH0gZWxzZSBpZiAoKmluY3ggPT0gMCkgeworCWluZm8gPSA2OworICAgIH0gZWxzZSBpZiAoKmluY3kgPT0gMCkgeworCWluZm8gPSA5OworICAgIH0KKyAgICBpZiAoaW5mbyAhPSAwKSB7CisJeGVyYmxhXygiRFNQTVYgIiwgJmluZm8sIChmdG5sZW4pNik7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLiAqLworCisgICAgaWYgKCpuID09IDAgfHwgKCphbHBoYSA9PSAwLiAmJiAqYmV0YSA9PSAxLikpIHsKKwlyZXR1cm4gMDsKKyAgICB9CisKKy8qICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50cyBpbiAgWCAgYW5kICBZLiAqLworCisgICAgaWYgKCppbmN4ID4gMCkgeworCWt4ID0gMTsKKyAgICB9IGVsc2UgeworCWt4ID0gMSAtICgqbiAtIDEpICogKmluY3g7CisgICAgfQorICAgIGlmICgqaW5jeSA+IDApIHsKKwlreSA9IDE7CisgICAgfSBlbHNlIHsKKwlreSA9IDEgLSAoKm4gLSAxKSAqICppbmN5OworICAgIH0KKworLyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBUCAqLworLyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLiAqLworCisvKiAgICAgRmlyc3QgZm9ybSAgeSA6PSBiZXRhKnkuICovCisKKyAgICBpZiAoKmJldGEgIT0gMS4pIHsKKwlpZiAoKmluY3kgPT0gMSkgeworCSAgICBpZiAoKmJldGEgPT0gMC4pIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpX19dID0gMC47CisvKiBMMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpX19dID0gKmJldGEgKiB5W2lfX107CisvKiBMMjA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGl5ID0ga3k7CisJICAgIGlmICgqYmV0YSA9PSAwLikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2l5XSA9IDAuOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMMzA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpeV0gPSAqYmV0YSAqIHlbaXldOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNDA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKCphbHBoYSA9PSAwLikgeworCXJldHVybiAwOworICAgIH0KKyAgICBrayA9IDE7CisgICAgaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgRm9ybSAgeSAgd2hlbiBBUCBjb250YWlucyB0aGUgdXBwZXIgdHJpYW5nbGUuICovCisKKwlpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKSB7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJdGVtcDEgPSAqYWxwaGEgKiB4W2pdOworCQl0ZW1wMiA9IDAuOworCQlrID0ga2s7CisJCWlfXzIgPSBqIC0gMTsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMjsgKytpX18pIHsKKwkJICAgIHlbaV9fXSArPSB0ZW1wMSAqIGFwW2tdOworCQkgICAgdGVtcDIgKz0gYXBba10gKiB4W2lfX107CisJCSAgICArK2s7CisvKiBMNTA6ICovCisJCX0KKwkJeVtqXSA9IHlbal0gKyB0ZW1wMSAqIGFwW2trICsgaiAtIDFdICsgKmFscGhhICogdGVtcDI7CisJCWtrICs9IGo7CisvKiBMNjA6ICovCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBqeCA9IGt4OworCSAgICBqeSA9IGt5OworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqeF07CisJCXRlbXAyID0gMC47CisJCWl4ID0ga3g7CisJCWl5ID0ga3k7CisJCWlfXzIgPSBrayArIGogLSAyOworCQlmb3IgKGsgPSBrazsgayA8PSBpX18yOyArK2spIHsKKwkJICAgIHlbaXldICs9IHRlbXAxICogYXBba107CisJCSAgICB0ZW1wMiArPSBhcFtrXSAqIHhbaXhdOworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw3MDogKi8KKwkJfQorCQl5W2p5XSA9IHlbanldICsgdGVtcDEgKiBhcFtrayArIGogLSAxXSArICphbHBoYSAqIHRlbXAyOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisJCWtrICs9IGo7CisvKiBMODA6ICovCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIGxvd2VyIHRyaWFuZ2xlLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLjsKKwkJeVtqXSArPSB0ZW1wMSAqIGFwW2trXTsKKwkJayA9IGtrICsgMTsKKwkJaV9fMiA9ICpuOworCQlmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fMjsgKytpX18pIHsKKwkJICAgIHlbaV9fXSArPSB0ZW1wMSAqIGFwW2tdOworCQkgICAgdGVtcDIgKz0gYXBba10gKiB4W2lfX107CisJCSAgICArK2s7CisvKiBMOTA6ICovCisJCX0KKwkJeVtqXSArPSAqYWxwaGEgKiB0ZW1wMjsKKwkJa2sgKz0gKm4gLSBqICsgMTsKKy8qIEwxMDA6ICovCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBqeCA9IGt4OworCSAgICBqeSA9IGt5OworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqeF07CisJCXRlbXAyID0gMC47CisJCXlbanldICs9IHRlbXAxICogYXBba2tdOworCQlpeCA9IGp4OworCQlpeSA9IGp5OworCQlpX18yID0ga2sgKyAqbiAtIGo7CisJCWZvciAoayA9IGtrICsgMTsgayA8PSBpX18yOyArK2spIHsKKwkJICAgIGl4ICs9ICppbmN4OworCQkgICAgaXkgKz0gKmluY3k7CisJCSAgICB5W2l5XSArPSB0ZW1wMSAqIGFwW2tdOworCQkgICAgdGVtcDIgKz0gYXBba10gKiB4W2l4XTsKKy8qIEwxMTA6ICovCisJCX0KKwkJeVtqeV0gKz0gKmFscGhhICogdGVtcDI7CisJCWp4ICs9ICppbmN4OworCQlqeSArPSAqaW5jeTsKKwkJa2sgKz0gKm4gLSBqICsgMTsKKy8qIEwxMjA6ICovCisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKKy8qICAgICBFbmQgb2YgRFNQTVYgLiAqLworCit9IC8qIGRzcG12XyAqLworCmRpZmYgLS1naXQgYS9ibGFzL2YyYy9kdGJtdi5jIGIvYmxhcy9mMmMvZHRibXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY3M2ViCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9mMmMvZHRibXYuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogZHRibXYuZiAtLSB0cmFuc2xhdGVkIGJ5IGYyYyAodmVyc2lvbiAyMDEwMDgyNykuCisgICBZb3UgbXVzdCBsaW5rIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2l0aCBsaWJmMmM6CisJb24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtLCBsaW5rIHdpdGggbGliZjJjLmxpYjsKKwlvbiBMaW51eCBvciBVbml4IHN5c3RlbXMsIGxpbmsgd2l0aCAuLi4vcGF0aC90by9saWJmMmMuYSAtbG0KKwlvciwgaWYgeW91IGluc3RhbGwgbGliZjJjLmEgaW4gYSBzdGFuZGFyZCBwbGFjZSwgd2l0aCAtbGYyYyAtbG0KKwktLSBpbiB0aGF0IG9yZGVyLCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluCisJCWNjICoubyAtbGYyYyAtbG0KKwlTb3VyY2UgZm9yIGxpYmYyYyBpcyBpbiAvbmV0bGliL2YyYy9saWJmMmMuemlwLCBlLmcuLAorCisJCWh0dHA6Ly93d3cubmV0bGliLm9yZy9mMmMvbGliZjJjLnppcAorKi8KKworI2luY2x1ZGUgImRhdGF0eXBlcy5oIgorCisvKiBTdWJyb3V0aW5lICovIGludCBkdGJtdl8oY2hhciAqdXBsbywgY2hhciAqdHJhbnMsIGNoYXIgKmRpYWcsIGludGVnZXIgKm4sIAorCWludGVnZXIgKmssIGRvdWJsZXJlYWwgKmEsIGludGVnZXIgKmxkYSwgZG91YmxlcmVhbCAqeCwgaW50ZWdlciAqaW5jeCwKKwkgZnRubGVuIHVwbG9fbGVuLCBmdG5sZW4gdHJhbnNfbGVuLCBmdG5sZW4gZGlhZ19sZW4pCit7CisgICAgLyogU3lzdGVtIGdlbmVyYXRlZCBsb2NhbHMgKi8KKyAgICBpbnRlZ2VyIGFfZGltMSwgYV9vZmZzZXQsIGlfXzEsIGlfXzIsIGlfXzMsIGlfXzQ7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnRlZ2VyIGlfXywgaiwgbCwgaXgsIGp4LCBreCwgaW5mbzsKKyAgICBkb3VibGVyZWFsIHRlbXA7CisgICAgZXh0ZXJuIGxvZ2ljYWwgbHNhbWVfKGNoYXIgKiwgY2hhciAqLCBmdG5sZW4sIGZ0bmxlbik7CisgICAgaW50ZWdlciBrcGx1czE7CisgICAgZXh0ZXJuIC8qIFN1YnJvdXRpbmUgKi8gaW50IHhlcmJsYV8oY2hhciAqLCBpbnRlZ2VyICosIGZ0bmxlbik7CisgICAgbG9naWNhbCBub3VuaXQ7CisKKy8qICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgUHVycG9zZSAqLworLyogID09PT09PT0gKi8KKworLyogIERUQk1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucyAqLworCisvKiAgICAgeCA6PSBBKngsICAgb3IgICB4IDo9IEEnKngsICovCisKKy8qICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwgKi8KKy8qICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIGJhbmQgbWF0cml4LCB3aXRoICggayArIDEgKSBkaWFnb25hbHMuICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IGlzIGFuIHVwcGVyIG9yICovCisvKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czogKi8KKworLyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4gKi8KKworLyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBUUkFOUyAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVFJBTlMgc3BlY2lmaWVzIHRoZSBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkIGFzICovCisvKiAgICAgICAgICAgZm9sbG93czogKi8KKworLyogICAgICAgICAgICAgIFRSQU5TID0gJ04nIG9yICduJyAgIHggOj0gQSp4LiAqLworCisvKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgeCA6PSBBJyp4LiAqLworCisvKiAgICAgICAgICAgICAgVFJBTlMgPSAnQycgb3IgJ2MnICAgeCA6PSBBJyp4LiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBESUFHICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0ICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgRElBRyA9ICdVJyBvciAndScgICBBIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCB0cmlhbmd1bGFyLiAqLworCisvKiAgICAgICAgICAgICAgRElBRyA9ICdOJyBvciAnbicgICBBIGlzIG5vdCBhc3N1bWVkIHRvIGJlIHVuaXQgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXIuICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIE4gICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBLICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgKi8KKy8qICAgICAgICAgICBzdXBlci1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgKi8KKy8qICAgICAgICAgICBzdWItZGlhZ29uYWxzIG9mIHRoZSBtYXRyaXggQS4gKi8KKy8qICAgICAgICAgICBLIG11c3Qgc2F0aXNmeSAgMCAubGUuIEsuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBICAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiAoIExEQSwgbiApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkgKi8KKy8qICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyICovCisvKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkgKi8KKy8qICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgKi8KKy8qICAgICAgICAgICAoIGsgKyAxICkgb2YgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3VwZXItZGlhZ29uYWwgc3RhcnRpbmcgYXQgKi8KKy8qICAgICAgICAgICBwb3NpdGlvbiAyIGluIHJvdyBrLCBhbmQgc28gb24uIFRoZSB0b3AgbGVmdCBrIGJ5IGsgdHJpYW5nbGUgKi8KKy8qICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4gKi8KKy8qICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIGFuIHVwcGVyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlICovCisvKiAgICAgICAgICAgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IEsgKyAxIC0gSiAqLworLyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gTUFYKCAxLCBKIC0gSyApLCBKICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApICovCisvKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUgKi8KKy8qICAgICAgICAgICAgICAyMCBDT05USU5VRSAqLworCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBsZWFkaW5nICggayArIDEgKSAqLworLyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgKi8KKy8qICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudHMsIHN1cHBsaWVkIGNvbHVtbiBieSAqLworLyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAxIG9mICovCisvKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4gKi8KKy8qICAgICAgICAgICByb3cgMiwgYW5kIHNvIG9uLiBUaGUgYm90dG9tIHJpZ2h0IGsgYnkgayB0cmlhbmdsZSBvZiB0aGUgKi8KKy8qICAgICAgICAgICBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLiAqLworLyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgYSBsb3dlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgZnVsbCBtYXRyaXggc3RvcmFnZSAqLworLyogICAgICAgICAgIHRvIGJhbmQgc3RvcmFnZTogKi8KKworLyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTiAqLworLyogICAgICAgICAgICAgICAgICAgIE0gPSAxIC0gSiAqLworLyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApICovCisvKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUgKi8KKy8qICAgICAgICAgICAgICAyMCBDT05USU5VRSAqLworCisvKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gRElBRyA9ICdVJyBvciAndScgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBICovCisvKiAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBhcmUgbm90ICovCisvKiAgICAgICAgICAgcmVmZXJlbmNlZCwgYnV0IGFyZSBhc3N1bWVkIHRvIGJlIHVuaXR5LiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgTERBICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgTERBIHNwZWNpZmllcyB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIEEgYXMgZGVjbGFyZWQgKi8KKy8qICAgICAgICAgICBpbiB0aGUgY2FsbGluZyAoc3ViKSBwcm9ncmFtLiBMREEgbXVzdCBiZSBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggayArIDEgKS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFggICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4gKi8KKy8qICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlICovCisvKiAgICAgICAgICAgdHJhbmZvcm1lZCB2ZWN0b3IgeC4gKi8KKworLyogIElOQ1ggICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEZ1cnRoZXIgRGV0YWlscyAqLworLyogID09PT09PT09PT09PT09PSAqLworCisvKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuICovCisKKy8qICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4gKi8KKy8qICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4gKi8KKy8qICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4gKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gUGFyYW1ldGVycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisKKy8qICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLiAqLworCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgYV9kaW0xID0gKmxkYTsKKyAgICBhX29mZnNldCA9IDEgKyBhX2RpbTE7CisgICAgYSAtPSBhX29mZnNldDsKKyAgICAtLXg7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgaW5mbyA9IDA7CisgICAgaWYgKCEgbHNhbWVfKHVwbG8sICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpICYmICEgbHNhbWVfKHVwbG8sICJMIiwgKAorCSAgICBmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCWluZm8gPSAxOworICAgIH0gZWxzZSBpZiAoISBsc2FtZV8odHJhbnMsICJOIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpICYmICEgbHNhbWVfKHRyYW5zLCAKKwkgICAgIlQiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odHJhbnMsICJDIiwgKGZ0bmxlbikxLCAoCisJICAgIGZ0bmxlbikxKSkgeworCWluZm8gPSAyOworICAgIH0gZWxzZSBpZiAoISBsc2FtZV8oZGlhZywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8oZGlhZywgCisJICAgICJOIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDM7CisgICAgfSBlbHNlIGlmICgqbiA8IDApIHsKKwlpbmZvID0gNDsKKyAgICB9IGVsc2UgaWYgKCprIDwgMCkgeworCWluZm8gPSA1OworICAgIH0gZWxzZSBpZiAoKmxkYSA8ICprICsgMSkgeworCWluZm8gPSA3OworICAgIH0gZWxzZSBpZiAoKmluY3ggPT0gMCkgeworCWluZm8gPSA5OworICAgIH0KKyAgICBpZiAoaW5mbyAhPSAwKSB7CisJeGVyYmxhXygiRFRCTVYgIiwgJmluZm8sIChmdG5sZW4pNik7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLiAqLworCisgICAgaWYgKCpuID09IDApIHsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBub3VuaXQgPSBsc2FtZV8oZGlhZywgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSk7CisKKy8qICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMgKi8KKy8qICAgICB3aWxsIGJlICAoIE4gLSAxICkqSU5DWCAgIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4gKi8KKworICAgIGlmICgqaW5jeCA8PSAwKSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9IGVsc2UgaWYgKCppbmN4ICE9IDEpIHsKKwlreCA9IDE7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQSBhcmUgKi8KKy8qICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuICovCisKKyAgICBpZiAobHNhbWVfKHRyYW5zLCAiTiIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgIEZvcm0gIHggOj0gQSp4LiAqLworCisJaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCSAgICBrcGx1czEgPSAqayArIDE7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJICAgIGlmICh4W2pdICE9IDAuKSB7CisJCQl0ZW1wID0geFtqXTsKKwkJCWwgPSBrcGx1czEgLSBqOworLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fMiA9IDEsIGlfXzMgPSBqIC0gKms7CisJCQlpX180ID0gaiAtIDE7CisJCQlmb3IgKGlfXyA9IG1heChpX18yLGlfXzMpOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICB4W2lfX10gKz0gdGVtcCAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworLyogTDEwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIHhbal0gKj0gYVtrcGx1czEgKyBqICogYV9kaW0xXTsKKwkJCX0KKwkJICAgIH0KKy8qIEwyMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlqeCA9IGt4OworCQlpX18xID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCSAgICBpZiAoeFtqeF0gIT0gMC4pIHsKKwkJCXRlbXAgPSB4W2p4XTsKKwkJCWl4ID0ga3g7CisJCQlsID0ga3BsdXMxIC0gajsKKy8qIENvbXB1dGluZyBNQVggKi8KKwkJCWlfXzQgPSAxLCBpX18yID0gaiAtICprOworCQkJaV9fMyA9IGogLSAxOworCQkJZm9yIChpX18gPSBtYXgoaV9fNCxpX18yKTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCQkgICAgeFtpeF0gKz0gdGVtcCAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworCQkJICAgIGl4ICs9ICppbmN4OworLyogTDMwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIHhbanhdICo9IGFba3BsdXMxICsgaiAqIGFfZGltMV07CisJCQl9CisJCSAgICB9CisJCSAgICBqeCArPSAqaW5jeDsKKwkJICAgIGlmIChqID4gKmspIHsKKwkJCWt4ICs9ICppbmN4OworCQkgICAgfQorLyogTDQwOiAqLworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlmb3IgKGogPSAqbjsgaiA+PSAxOyAtLWopIHsKKwkJICAgIGlmICh4W2pdICE9IDAuKSB7CisJCQl0ZW1wID0geFtqXTsKKwkJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzEgPSAqbiwgaV9fMyA9IGogKyAqazsKKwkJCWlfXzQgPSBqICsgMTsKKwkJCWZvciAoaV9fID0gbWluKGlfXzEsaV9fMyk7IGlfXyA+PSBpX180OyAtLWlfXykgeworCQkJICAgIHhbaV9fXSArPSB0ZW1wICogYVtsICsgaV9fICsgaiAqIGFfZGltMV07CisvKiBMNTA6ICovCisJCQl9CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgeFtqXSAqPSBhW2ogKiBhX2RpbTEgKyAxXTsKKwkJCX0KKwkJICAgIH0KKy8qIEw2MDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlreCArPSAoKm4gLSAxKSAqICppbmN4OworCQlqeCA9IGt4OworCQlmb3IgKGogPSAqbjsgaiA+PSAxOyAtLWopIHsKKwkJICAgIGlmICh4W2p4XSAhPSAwLikgeworCQkJdGVtcCA9IHhbanhdOworCQkJaXggPSBreDsKKwkJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzQgPSAqbiwgaV9fMSA9IGogKyAqazsKKwkJCWlfXzMgPSBqICsgMTsKKwkJCWZvciAoaV9fID0gbWluKGlfXzQsaV9fMSk7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIHhbaXhdICs9IHRlbXAgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJCSAgICBpeCAtPSAqaW5jeDsKKy8qIEw3MDogKi8KKwkJCX0KKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICB4W2p4XSAqPSBhW2ogKiBhX2RpbTEgKyAxXTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGp4IC09ICppbmN4OworCQkgICAgaWYgKCpuIC0gaiA+PSAqaykgeworCQkJa3ggLT0gKmluY3g7CisJCSAgICB9CisvKiBMODA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCisvKiAgICAgICAgRm9ybSAgeCA6PSBBJyp4LiAqLworCisJaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCSAgICBrcGx1czEgPSAqayArIDE7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgdGVtcCA9IHhbal07CisJCSAgICBsID0ga3BsdXMxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtrcGx1czEgKyBqICogYV9kaW0xXTsKKwkJICAgIH0KKy8qIENvbXB1dGluZyBNQVggKi8KKwkJICAgIGlfXzQgPSAxLCBpX18xID0gaiAtICprOworCQkgICAgaV9fMyA9IG1heChpX180LGlfXzEpOworCQkgICAgZm9yIChpX18gPSBqIC0gMTsgaV9fID49IGlfXzM7IC0taV9fKSB7CisJCQl0ZW1wICs9IGFbbCArIGlfXyArIGogKiBhX2RpbTFdICogeFtpX19dOworLyogTDkwOiAqLworCQkgICAgfQorCQkgICAgeFtqXSA9IHRlbXA7CisvKiBMMTAwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWt4ICs9ICgqbiAtIDEpICogKmluY3g7CisJCWp4ID0ga3g7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgdGVtcCA9IHhbanhdOworCQkgICAga3ggLT0gKmluY3g7CisJCSAgICBpeCA9IGt4OworCQkgICAgbCA9IGtwbHVzMSAtIGo7CisJCSAgICBpZiAobm91bml0KSB7CisJCQl0ZW1wICo9IGFba3BsdXMxICsgaiAqIGFfZGltMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUFYICovCisJCSAgICBpX180ID0gMSwgaV9fMSA9IGogLSAqazsKKwkJICAgIGlfXzMgPSBtYXgoaV9fNCxpX18xKTsKKwkJICAgIGZvciAoaV9fID0gaiAtIDE7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJdGVtcCArPSBhW2wgKyBpX18gKyBqICogYV9kaW0xXSAqIHhbaXhdOworCQkJaXggLT0gKmluY3g7CisvKiBMMTEwOiAqLworCQkgICAgfQorCQkgICAgeFtqeF0gPSB0ZW1wOworCQkgICAganggLT0gKmluY3g7CisvKiBMMTIwOiAqLworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlpX18zID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMzsgKytqKSB7CisJCSAgICB0ZW1wID0geFtqXTsKKwkJICAgIGwgPSAxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtqICogYV9kaW0xICsgMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUlOICovCisJCSAgICBpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCSAgICBpX180ID0gbWluKGlfXzEsaV9fMik7CisJCSAgICBmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCXRlbXAgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2lfX107CisvKiBMMTMwOiAqLworCQkgICAgfQorCQkgICAgeFtqXSA9IHRlbXA7CisvKiBMMTQwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWp4ID0ga3g7CisJCWlfXzMgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18zOyArK2opIHsKKwkJICAgIHRlbXAgPSB4W2p4XTsKKwkJICAgIGt4ICs9ICppbmN4OworCQkgICAgaXggPSBreDsKKwkJICAgIGwgPSAxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtqICogYV9kaW0xICsgMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUlOICovCisJCSAgICBpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCSAgICBpX180ID0gbWluKGlfXzEsaV9fMik7CisJCSAgICBmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCXRlbXAgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2l4XTsKKwkJCWl4ICs9ICppbmN4OworLyogTDE1MDogKi8KKwkJICAgIH0KKwkJICAgIHhbanhdID0gdGVtcDsKKwkJICAgIGp4ICs9ICppbmN4OworLyogTDE2MDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIERUQk1WIC4gKi8KKworfSAvKiBkdGJtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvbHNhbWUuYyBiL2JsYXMvZjJjL2xzYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzMjRkOQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL2xzYW1lLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIGxzYW1lLmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworbG9naWNhbCBsc2FtZV8oY2hhciAqY2EsIGNoYXIgKmNiLCBmdG5sZW4gY2FfbGVuLCBmdG5sZW4gY2JfbGVuKQoreworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgbG9naWNhbCByZXRfdmFsOworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgaW50ZWdlciBpbnRhLCBpbnRiLCB6Y29kZTsKKworCisvKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuMSkgLS0gKi8KKy8qICAgICBVbml2LiBvZiBUZW5uZXNzZWUsIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgYW5kIE5BRyBMdGQuLiAqLworLyogICAgIE5vdmVtYmVyIDIwMDYgKi8KKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgUHVycG9zZSAqLworLyogID09PT09PT0gKi8KKworLyogIExTQU1FIHJldHVybnMgLlRSVUUuIGlmIENBIGlzIHRoZSBzYW1lIGxldHRlciBhcyBDQiByZWdhcmRsZXNzIG9mICovCisvKiAgY2FzZS4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PSAqLworCisvKiAgQ0EgICAgICAoaW5wdXQpIENIQVJBQ1RFUioxICovCisKKy8qICBDQiAgICAgIChpbnB1dCkgQ0hBUkFDVEVSKjEgKi8KKy8qICAgICAgICAgIENBIGFuZCBDQiBzcGVjaWZ5IHRoZSBzaW5nbGUgY2hhcmFjdGVycyB0byBiZSBjb21wYXJlZC4gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogICAgIFRlc3QgaWYgdGhlIGNoYXJhY3RlcnMgYXJlIGVxdWFsICovCisKKyAgICByZXRfdmFsID0gKih1bnNpZ25lZCBjaGFyICopY2EgPT0gKih1bnNpZ25lZCBjaGFyICopY2I7CisgICAgaWYgKHJldF92YWwpIHsKKwlyZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKy8qICAgICBOb3cgdGVzdCBmb3IgZXF1aXZhbGVuY2UgaWYgYm90aCBjaGFyYWN0ZXJzIGFyZSBhbHBoYWJldGljLiAqLworCisgICAgemNvZGUgPSAnWic7CisKKy8qICAgICBVc2UgJ1onIHJhdGhlciB0aGFuICdBJyBzbyB0aGF0IEFTQ0lJIGNhbiBiZSBkZXRlY3RlZCBvbiBQcmltZSAqLworLyogICAgIG1hY2hpbmVzLCBvbiB3aGljaCBJQ0hBUiByZXR1cm5zIGEgdmFsdWUgd2l0aCBiaXQgOCBzZXQuICovCisvKiAgICAgSUNIQVIoJ0EnKSBvbiBQcmltZSBtYWNoaW5lcyByZXR1cm5zIDE5MyB3aGljaCBpcyB0aGUgc2FtZSBhcyAqLworLyogICAgIElDSEFSKCdBJykgb24gYW4gRUJDRElDIG1hY2hpbmUuICovCisKKyAgICBpbnRhID0gKih1bnNpZ25lZCBjaGFyICopY2E7CisgICAgaW50YiA9ICoodW5zaWduZWQgY2hhciAqKWNiOworCisgICAgaWYgKHpjb2RlID09IDkwIHx8IHpjb2RlID09IDEyMikgeworCisvKiAgICAgICAgQVNDSUkgaXMgYXNzdW1lZCAtIFpDT0RFIGlzIHRoZSBBU0NJSSBjb2RlIG9mIGVpdGhlciBsb3dlciBvciAqLworLyogICAgICAgIHVwcGVyIGNhc2UgJ1onLiAqLworCisJaWYgKGludGEgPj0gOTcgJiYgaW50YSA8PSAxMjIpIHsKKwkgICAgaW50YSArPSAtMzI7CisJfQorCWlmIChpbnRiID49IDk3ICYmIGludGIgPD0gMTIyKSB7CisJICAgIGludGIgKz0gLTMyOworCX0KKworICAgIH0gZWxzZSBpZiAoemNvZGUgPT0gMjMzIHx8IHpjb2RlID09IDE2OSkgeworCisvKiAgICAgICAgRUJDRElDIGlzIGFzc3VtZWQgLSBaQ09ERSBpcyB0aGUgRUJDRElDIGNvZGUgb2YgZWl0aGVyIGxvd2VyIG9yICovCisvKiAgICAgICAgdXBwZXIgY2FzZSAnWicuICovCisKKwlpZiAoKGludGEgPj0gMTI5ICYmIGludGEgPD0gMTM3KSB8fCAoaW50YSA+PSAxNDUgJiYgaW50YSA8PSAxNTMpIHx8IAorICAgICAgICAgICAgKGludGEgPj0gMTYyICYmIGludGEgPD0gMTY5KSkgeworCSAgICBpbnRhICs9IDY0OworCX0KKwlpZiAoKGludGIgPj0gMTI5ICYmIGludGIgPD0gMTM3KSB8fCAoaW50YiA+PSAxNDUgJiYgaW50YiA8PSAxNTMpIHx8IAorICAgICAgICAgICAgKGludGIgPj0gMTYyICYmIGludGIgPD0gMTY5KSkgeworCSAgICBpbnRiICs9IDY0OworCX0KKworICAgIH0gZWxzZSBpZiAoemNvZGUgPT0gMjE4IHx8IHpjb2RlID09IDI1MCkgeworCisvKiAgICAgICAgQVNDSUkgaXMgYXNzdW1lZCwgb24gUHJpbWUgbWFjaGluZXMgLSBaQ09ERSBpcyB0aGUgQVNDSUkgY29kZSAqLworLyogICAgICAgIHBsdXMgMTI4IG9mIGVpdGhlciBsb3dlciBvciB1cHBlciBjYXNlICdaJy4gKi8KKworCWlmIChpbnRhID49IDIyNSAmJiBpbnRhIDw9IDI1MCkgeworCSAgICBpbnRhICs9IC0zMjsKKwl9CisJaWYgKGludGIgPj0gMjI1ICYmIGludGIgPD0gMjUwKSB7CisJICAgIGludGIgKz0gLTMyOworCX0KKyAgICB9CisgICAgcmV0X3ZhbCA9IGludGEgPT0gaW50YjsKKworLyogICAgIFJFVFVSTiAqLworCisvKiAgICAgRW5kIG9mIExTQU1FICovCisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30gLyogbHNhbWVfICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL3JfY25qZy5jIGIvYmxhcy9mMmMvcl9jbmpnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3JfY25qZy5jCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgImRhdGF0eXBlcy5oIiAgICAKKwordm9pZCByX2NuamcoY29tcGxleCAqciwgY29tcGxleCAqeikgeworICAgIHItPnIgPSB6LT5yOworICAgIHItPmkgPSAtKHotPmkpOworfQpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvc3JvdG0uYyBiL2JsYXMvZjJjL3Nyb3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1OTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3Nyb3RtLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIHNyb3RtLmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgc3JvdG1fKGludGVnZXIgKm4sIHJlYWwgKnN4LCBpbnRlZ2VyICppbmN4LCByZWFsICpzeSwgCisJaW50ZWdlciAqaW5jeSwgcmVhbCAqc3BhcmFtKQoreworICAgIC8qIEluaXRpYWxpemVkIGRhdGEgKi8KKworICAgIHN0YXRpYyByZWFsIHplcm8gPSAwLmY7CisgICAgc3RhdGljIHJlYWwgdHdvID0gMi5mOworCisgICAgLyogU3lzdGVtIGdlbmVyYXRlZCBsb2NhbHMgKi8KKyAgICBpbnRlZ2VyIGlfXzEsIGlfXzI7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnRlZ2VyIGlfXzsKKyAgICByZWFsIHcsIHpfXzsKKyAgICBpbnRlZ2VyIGt4LCBreTsKKyAgICByZWFsIHNoMTEsIHNoMTIsIHNoMjEsIHNoMjIsIHNmbGFnOworICAgIGludGVnZXIgbnN0ZXBzOworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICAgICBBUFBMWSBUSEUgTU9ESUZJRUQgR0lWRU5TIFRSQU5TRk9STUFUSU9OLCBILCBUTyBUSEUgMiBCWSBOIE1BVFJJWCAqLworCisvKiAgICAgKFNYKipUKSAsIFdIRVJFICoqVCBJTkRJQ0FURVMgVFJBTlNQT1NFLiBUSEUgRUxFTUVOVFMgT0YgU1ggQVJFIElOICovCisvKiAgICAgKERYKipUKSAqLworCisvKiAgICAgU1goTFgrSSpJTkNYKSwgSSA9IDAgVE8gTi0xLCBXSEVSRSBMWCA9IDEgSUYgSU5DWCAuR0UuIDAsIEVMU0UgKi8KKy8qICAgICBMWCA9ICgtSU5DWCkqTiwgQU5EIFNJTUlMQVJMWSBGT1IgU1kgVVNJTkcgVVNJTkcgTFkgQU5EIElOQ1kuICovCisvKiAgICAgV0lUSCBTUEFSQU0oMSk9U0ZMQUcsIEggSEFTIE9ORSBPRiBUSEUgRk9MTE9XSU5HIEZPUk1TLi4gKi8KKworLyogICAgIFNGTEFHPS0xLkUwICAgICBTRkxBRz0wLkUwICAgICAgICBTRkxBRz0xLkUwICAgICBTRkxBRz0tMi5FMCAqLworCisvKiAgICAgICAoU0gxMSAgU0gxMikgICAgKDEuRTAgIFNIMTIpICAgIChTSDExICAxLkUwKSAgICAoMS5FMCAgMC5FMCkgKi8KKy8qICAgICBIPSggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKSAqLworLyogICAgICAgKFNIMjEgIFNIMjIpLCAgIChTSDIxICAxLkUwKSwgICAoLTEuRTAgU0gyMiksICAgKDAuRTAgIDEuRTApLiAqLworLyogICAgIFNFRSAgU1JPVE1HIEZPUiBBIERFU0NSSVBUSU9OIE9GIERBVEEgU1RPUkFHRSBJTiBTUEFSQU0uICovCisKKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PSAqLworCisvKiAgTiAgICAgIChpbnB1dCkgSU5URUdFUiAqLworLyogICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gaW5wdXQgdmVjdG9yKHMpICovCisKKy8qICBTWCAgICAgKGlucHV0L291dHB1dCkgUkVBTCBhcnJheSwgZGltZW5zaW9uIE4gKi8KKy8qICAgICAgICAgZG91YmxlIHByZWNpc2lvbiB2ZWN0b3Igd2l0aCBOIGVsZW1lbnRzICovCisKKy8qICBJTkNYICAgKGlucHV0KSBJTlRFR0VSICovCisvKiAgICAgICAgIHN0b3JhZ2Ugc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9mIFNYICovCisKKy8qICBTWSAgICAgKGlucHV0L291dHB1dCkgUkVBTCBhcnJheSwgZGltZW5zaW9uIE4gKi8KKy8qICAgICAgICAgZG91YmxlIHByZWNpc2lvbiB2ZWN0b3Igd2l0aCBOIGVsZW1lbnRzICovCisKKy8qICBJTkNZICAgKGlucHV0KSBJTlRFR0VSICovCisvKiAgICAgICAgIHN0b3JhZ2Ugc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9mIFNZICovCisKKy8qICBTUEFSQU0gKGlucHV0L291dHB1dCkgIFJFQUwgYXJyYXksIGRpbWVuc2lvbiA1ICovCisvKiAgICAgU1BBUkFNKDEpPVNGTEFHICovCisvKiAgICAgU1BBUkFNKDIpPVNIMTEgKi8KKy8qICAgICBTUEFSQU0oMyk9U0gyMSAqLworLyogICAgIFNQQVJBTSg0KT1TSDEyICovCisvKiAgICAgU1BBUkFNKDUpPVNIMjIgKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uICovCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgLS1zcGFyYW07CisgICAgLS1zeTsKKyAgICAtLXN4OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworLyogICAgIC4uICovCisKKyAgICBzZmxhZyA9IHNwYXJhbVsxXTsKKyAgICBpZiAoKm4gPD0gMCB8fCBzZmxhZyArIHR3byA9PSB6ZXJvKSB7CisJZ290byBMMTQwOworICAgIH0KKyAgICBpZiAoISAoKmluY3ggPT0gKmluY3kgJiYgKmluY3ggPiAwKSkgeworCWdvdG8gTDcwOworICAgIH0KKworICAgIG5zdGVwcyA9ICpuICogKmluY3g7CisgICAgaWYgKHNmbGFnIDwgMC5mKSB7CisJZ290byBMNTA7CisgICAgfSBlbHNlIGlmIChzZmxhZyA9PSAwKSB7CisJZ290byBMMTA7CisgICAgfSBlbHNlIHsKKwlnb3RvIEwzMDsKKyAgICB9CitMMTA6CisgICAgc2gxMiA9IHNwYXJhbVs0XTsKKyAgICBzaDIxID0gc3BhcmFtWzNdOworICAgIGlfXzEgPSBuc3RlcHM7CisgICAgaV9fMiA9ICppbmN4OworICAgIGZvciAoaV9fID0gMTsgaV9fMiA8IDAgPyBpX18gPj0gaV9fMSA6IGlfXyA8PSBpX18xOyBpX18gKz0gaV9fMikgeworCXcgPSBzeFtpX19dOworCXpfXyA9IHN5W2lfX107CisJc3hbaV9fXSA9IHcgKyB6X18gKiBzaDEyOworCXN5W2lfX10gPSB3ICogc2gyMSArIHpfXzsKKy8qIEwyMDogKi8KKyAgICB9CisgICAgZ290byBMMTQwOworTDMwOgorICAgIHNoMTEgPSBzcGFyYW1bMl07CisgICAgc2gyMiA9IHNwYXJhbVs1XTsKKyAgICBpX18yID0gbnN0ZXBzOworICAgIGlfXzEgPSAqaW5jeDsKKyAgICBmb3IgKGlfXyA9IDE7IGlfXzEgPCAwID8gaV9fID49IGlfXzIgOiBpX18gPD0gaV9fMjsgaV9fICs9IGlfXzEpIHsKKwl3ID0gc3hbaV9fXTsKKwl6X18gPSBzeVtpX19dOworCXN4W2lfX10gPSB3ICogc2gxMSArIHpfXzsKKwlzeVtpX19dID0gLXcgKyBzaDIyICogel9fOworLyogTDQwOiAqLworICAgIH0KKyAgICBnb3RvIEwxNDA7CitMNTA6CisgICAgc2gxMSA9IHNwYXJhbVsyXTsKKyAgICBzaDEyID0gc3BhcmFtWzRdOworICAgIHNoMjEgPSBzcGFyYW1bM107CisgICAgc2gyMiA9IHNwYXJhbVs1XTsKKyAgICBpX18xID0gbnN0ZXBzOworICAgIGlfXzIgPSAqaW5jeDsKKyAgICBmb3IgKGlfXyA9IDE7IGlfXzIgPCAwID8gaV9fID49IGlfXzEgOiBpX18gPD0gaV9fMTsgaV9fICs9IGlfXzIpIHsKKwl3ID0gc3hbaV9fXTsKKwl6X18gPSBzeVtpX19dOworCXN4W2lfX10gPSB3ICogc2gxMSArIHpfXyAqIHNoMTI7CisJc3lbaV9fXSA9IHcgKiBzaDIxICsgel9fICogc2gyMjsKKy8qIEw2MDogKi8KKyAgICB9CisgICAgZ290byBMMTQwOworTDcwOgorICAgIGt4ID0gMTsKKyAgICBreSA9IDE7CisgICAgaWYgKCppbmN4IDwgMCkgeworCWt4ID0gKDEgLSAqbikgKiAqaW5jeCArIDE7CisgICAgfQorICAgIGlmICgqaW5jeSA8IDApIHsKKwlreSA9ICgxIC0gKm4pICogKmluY3kgKyAxOworICAgIH0KKworICAgIGlmIChzZmxhZyA8IDAuZikgeworCWdvdG8gTDEyMDsKKyAgICB9IGVsc2UgaWYgKHNmbGFnID09IDApIHsKKwlnb3RvIEw4MDsKKyAgICB9IGVsc2UgeworCWdvdG8gTDEwMDsKKyAgICB9CitMODA6CisgICAgc2gxMiA9IHNwYXJhbVs0XTsKKyAgICBzaDIxID0gc3BhcmFtWzNdOworICAgIGlfXzIgPSAqbjsKKyAgICBmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCXcgPSBzeFtreF07CisJel9fID0gc3lba3ldOworCXN4W2t4XSA9IHcgKyB6X18gKiBzaDEyOworCXN5W2t5XSA9IHcgKiBzaDIxICsgel9fOworCWt4ICs9ICppbmN4OworCWt5ICs9ICppbmN5OworLyogTDkwOiAqLworICAgIH0KKyAgICBnb3RvIEwxNDA7CitMMTAwOgorICAgIHNoMTEgPSBzcGFyYW1bMl07CisgICAgc2gyMiA9IHNwYXJhbVs1XTsKKyAgICBpX18yID0gKm47CisgICAgZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMjsgKytpX18pIHsKKwl3ID0gc3hba3hdOworCXpfXyA9IHN5W2t5XTsKKwlzeFtreF0gPSB3ICogc2gxMSArIHpfXzsKKwlzeVtreV0gPSAtdyArIHNoMjIgKiB6X187CisJa3ggKz0gKmluY3g7CisJa3kgKz0gKmluY3k7CisvKiBMMTEwOiAqLworICAgIH0KKyAgICBnb3RvIEwxNDA7CitMMTIwOgorICAgIHNoMTEgPSBzcGFyYW1bMl07CisgICAgc2gxMiA9IHNwYXJhbVs0XTsKKyAgICBzaDIxID0gc3BhcmFtWzNdOworICAgIHNoMjIgPSBzcGFyYW1bNV07CisgICAgaV9fMiA9ICpuOworICAgIGZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzI7ICsraV9fKSB7CisJdyA9IHN4W2t4XTsKKwl6X18gPSBzeVtreV07CisJc3hba3hdID0gdyAqIHNoMTEgKyB6X18gKiBzaDEyOworCXN5W2t5XSA9IHcgKiBzaDIxICsgel9fICogc2gyMjsKKwlreCArPSAqaW5jeDsKKwlreSArPSAqaW5jeTsKKy8qIEwxMzA6ICovCisgICAgfQorTDE0MDoKKyAgICByZXR1cm4gMDsKK30gLyogc3JvdG1fICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL3Nyb3RtZy5jIGIvYmxhcy9mMmMvc3JvdG1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNzg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3Nyb3RtZy5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiBzcm90bWcuZiAtLSB0cmFuc2xhdGVkIGJ5IGYyYyAodmVyc2lvbiAyMDEwMDgyNykuCisgICBZb3UgbXVzdCBsaW5rIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2l0aCBsaWJmMmM6CisJb24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtLCBsaW5rIHdpdGggbGliZjJjLmxpYjsKKwlvbiBMaW51eCBvciBVbml4IHN5c3RlbXMsIGxpbmsgd2l0aCAuLi4vcGF0aC90by9saWJmMmMuYSAtbG0KKwlvciwgaWYgeW91IGluc3RhbGwgbGliZjJjLmEgaW4gYSBzdGFuZGFyZCBwbGFjZSwgd2l0aCAtbGYyYyAtbG0KKwktLSBpbiB0aGF0IG9yZGVyLCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluCisJCWNjICoubyAtbGYyYyAtbG0KKwlTb3VyY2UgZm9yIGxpYmYyYyBpcyBpbiAvbmV0bGliL2YyYy9saWJmMmMuemlwLCBlLmcuLAorCisJCWh0dHA6Ly93d3cubmV0bGliLm9yZy9mMmMvbGliZjJjLnppcAorKi8KKworI2luY2x1ZGUgImRhdGF0eXBlcy5oIgorCisvKiBTdWJyb3V0aW5lICovIGludCBzcm90bWdfKHJlYWwgKnNkMSwgcmVhbCAqc2QyLCByZWFsICpzeDEsIHJlYWwgKnN5MSwgcmVhbCAKKwkqc3BhcmFtKQoreworICAgIC8qIEluaXRpYWxpemVkIGRhdGEgKi8KKworICAgIHN0YXRpYyByZWFsIHplcm8gPSAwLmY7CisgICAgc3RhdGljIHJlYWwgb25lID0gMS5mOworICAgIHN0YXRpYyByZWFsIHR3byA9IDIuZjsKKyAgICBzdGF0aWMgcmVhbCBnYW0gPSA0MDk2LmY7CisgICAgc3RhdGljIHJlYWwgZ2Ftc3EgPSAxNjc3NzIwMC5mOworICAgIHN0YXRpYyByZWFsIHJnYW1zcSA9IDUuOTYwNDZlLThmOworCisgICAgLyogRm9ybWF0IHN0cmluZ3MgKi8KKyAgICBzdGF0aWMgY2hhciBmbXRfMTIwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMTUwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMTgwW10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmbXRfMjEwW10gPSAiIjsKKworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgcmVhbCByX18xOworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgcmVhbCBzdSwgc3AxLCBzcDIsIHNxMSwgc3EyLCBzaDExLCBzaDEyLCBzaDIxLCBzaDIyOworICAgIGludGVnZXIgaWdvOworICAgIHJlYWwgc2ZsYWcsIHN0ZW1wOworCisgICAgLyogQXNzaWduZWQgZm9ybWF0IHZhcmlhYmxlcyAqLworICAgIHN0YXRpYyBjaGFyICppZ29fZm10OworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICAgICBDT05TVFJVQ1QgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiBNQVRSSVggSCBXSElDSCBaRVJPUyAqLworLyogICAgIFRIRSBTRUNPTkQgQ09NUE9ORU5UIE9GIFRIRSAyLVZFQ1RPUiAgKFNRUlQoU0QxKSpTWDEsU1FSVChTRDIpKiAqLworLyogICAgIFNZMikqKlQuICovCisvKiAgICAgV0lUSCBTUEFSQU0oMSk9U0ZMQUcsIEggSEFTIE9ORSBPRiBUSEUgRk9MTE9XSU5HIEZPUk1TLi4gKi8KKworLyogICAgIFNGTEFHPS0xLkUwICAgICBTRkxBRz0wLkUwICAgICAgICBTRkxBRz0xLkUwICAgICBTRkxBRz0tMi5FMCAqLworCisvKiAgICAgICAoU0gxMSAgU0gxMikgICAgKDEuRTAgIFNIMTIpICAgIChTSDExICAxLkUwKSAgICAoMS5FMCAgMC5FMCkgKi8KKy8qICAgICBIPSggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKSAqLworLyogICAgICAgKFNIMjEgIFNIMjIpLCAgIChTSDIxICAxLkUwKSwgICAoLTEuRTAgU0gyMiksICAgKDAuRTAgIDEuRTApLiAqLworLyogICAgIExPQ0FUSU9OUyAyLTQgT0YgU1BBUkFNIENPTlRBSU4gU0gxMSxTSDIxLFNIMTIsIEFORCBTSDIyICovCisvKiAgICAgUkVTUEVDVElWRUxZLiAoVkFMVUVTIE9GIDEuRTAsIC0xLkUwLCBPUiAwLkUwIElNUExJRUQgQlkgVEhFICovCisvKiAgICAgVkFMVUUgT0YgU1BBUkFNKDEpIEFSRSBOT1QgU1RPUkVEIElOIFNQQVJBTS4pICovCisKKy8qICAgICBUSEUgVkFMVUVTIE9GIEdBTVNRIEFORCBSR0FNU1EgU0VUIElOIFRIRSBEQVRBIFNUQVRFTUVOVCBNQVkgQkUgKi8KKy8qICAgICBJTkVYQUNULiAgVEhJUyBJUyBPSyBBUyBUSEVZIEFSRSBPTkxZIFVTRUQgRk9SIFRFU1RJTkcgVEhFIFNJWkUgKi8KKy8qICAgICBPRiBTRDEgQU5EIFNEMi4gIEFMTCBBQ1RVQUwgU0NBTElORyBPRiBEQVRBIElTIERPTkUgVVNJTkcgR0FNLiAqLworCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT0gKi8KKworCisvKiAgU0QxICAgIChpbnB1dC9vdXRwdXQpIFJFQUwgKi8KKworLyogIFNEMiAgICAoaW5wdXQvb3V0cHV0KSBSRUFMICovCisKKy8qICBTWDEgICAgKGlucHV0L291dHB1dCkgUkVBTCAqLworCisvKiAgU1kxICAgIChpbnB1dCkgUkVBTCAqLworCisKKy8qICBTUEFSQU0gKGlucHV0L291dHB1dCkgIFJFQUwgYXJyYXksIGRpbWVuc2lvbiA1ICovCisvKiAgICAgU1BBUkFNKDEpPVNGTEFHICovCisvKiAgICAgU1BBUkFNKDIpPVNIMTEgKi8KKy8qICAgICBTUEFSQU0oMyk9U0gyMSAqLworLyogICAgIFNQQVJBTSg0KT1TSDEyICovCisvKiAgICAgU1BBUkFNKDUpPVNIMjIgKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uICovCisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICAtLXNwYXJhbTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKy8qICAgICAuLiAqLworICAgIGlmICghICgqc2QxIDwgemVybykpIHsKKwlnb3RvIEwxMDsKKyAgICB9CisvKiAgICAgICBHTyBaRVJPLUgtRC1BTkQtU1gxLi4gKi8KKyAgICBnb3RvIEw2MDsKK0wxMDoKKy8qICAgICBDQVNFLVNEMS1OT05ORUdBVElWRSAqLworICAgIHNwMiA9ICpzZDIgKiAqc3kxOworICAgIGlmICghIChzcDIgPT0gemVybykpIHsKKwlnb3RvIEwyMDsKKyAgICB9CisgICAgc2ZsYWcgPSAtdHdvOworICAgIGdvdG8gTDI2MDsKKy8qICAgICBSRUdVTEFSLUNBU0UuLiAqLworTDIwOgorICAgIHNwMSA9ICpzZDEgKiAqc3gxOworICAgIHNxMiA9IHNwMiAqICpzeTE7CisgICAgc3ExID0gc3AxICogKnN4MTsKKworICAgIGlmICghIChkYWJzKHNxMSkgPiBkYWJzKHNxMikpKSB7CisJZ290byBMNDA7CisgICAgfQorICAgIHNoMjEgPSAtKCpzeTEpIC8gKnN4MTsKKyAgICBzaDEyID0gc3AyIC8gc3AxOworCisgICAgc3UgPSBvbmUgLSBzaDEyICogc2gyMTsKKworICAgIGlmICghIChzdSA8PSB6ZXJvKSkgeworCWdvdG8gTDMwOworICAgIH0KKy8qICAgICAgICAgR08gWkVSTy1ILUQtQU5ELVNYMS4uICovCisgICAgZ290byBMNjA7CitMMzA6CisgICAgc2ZsYWcgPSB6ZXJvOworICAgICpzZDEgLz0gc3U7CisgICAgKnNkMiAvPSBzdTsKKyAgICAqc3gxICo9IHN1OworLyogICAgICAgICBHTyBTQ0FMRS1DSEVDSy4uICovCisgICAgZ290byBMMTAwOworTDQwOgorICAgIGlmICghIChzcTIgPCB6ZXJvKSkgeworCWdvdG8gTDUwOworICAgIH0KKy8qICAgICAgICAgR08gWkVSTy1ILUQtQU5ELVNYMS4uICovCisgICAgZ290byBMNjA7CitMNTA6CisgICAgc2ZsYWcgPSBvbmU7CisgICAgc2gxMSA9IHNwMSAvIHNwMjsKKyAgICBzaDIyID0gKnN4MSAvICpzeTE7CisgICAgc3UgPSBvbmUgKyBzaDExICogc2gyMjsKKyAgICBzdGVtcCA9ICpzZDIgLyBzdTsKKyAgICAqc2QyID0gKnNkMSAvIHN1OworICAgICpzZDEgPSBzdGVtcDsKKyAgICAqc3gxID0gKnN5MSAqIHN1OworLyogICAgICAgICBHTyBTQ0FMRS1DSEVDSyAqLworICAgIGdvdG8gTDEwMDsKKy8qICAgICBQUk9DRURVUkUuLlpFUk8tSC1ELUFORC1TWDEuLiAqLworTDYwOgorICAgIHNmbGFnID0gLW9uZTsKKyAgICBzaDExID0gemVybzsKKyAgICBzaDEyID0gemVybzsKKyAgICBzaDIxID0gemVybzsKKyAgICBzaDIyID0gemVybzsKKworICAgICpzZDEgPSB6ZXJvOworICAgICpzZDIgPSB6ZXJvOworICAgICpzeDEgPSB6ZXJvOworLyogICAgICAgICBSRVRVUk4uLiAqLworICAgIGdvdG8gTDIyMDsKKy8qICAgICBQUk9DRURVUkUuLkZJWC1ILi4gKi8KK0w3MDoKKyAgICBpZiAoISAoc2ZsYWcgPj0gemVybykpIHsKKwlnb3RvIEw5MDsKKyAgICB9CisKKyAgICBpZiAoISAoc2ZsYWcgPT0gemVybykpIHsKKwlnb3RvIEw4MDsKKyAgICB9CisgICAgc2gxMSA9IG9uZTsKKyAgICBzaDIyID0gb25lOworICAgIHNmbGFnID0gLW9uZTsKKyAgICBnb3RvIEw5MDsKK0w4MDoKKyAgICBzaDIxID0gLW9uZTsKKyAgICBzaDEyID0gb25lOworICAgIHNmbGFnID0gLW9uZTsKK0w5MDoKKyAgICBzd2l0Y2ggKGlnbykgeworCWNhc2UgMDogZ290byBMMTIwOworCWNhc2UgMTogZ290byBMMTUwOworCWNhc2UgMjogZ290byBMMTgwOworCWNhc2UgMzogZ290byBMMjEwOworICAgIH0KKy8qICAgICBQUk9DRURVUkUuLlNDQUxFLUNIRUNLICovCitMMTAwOgorTDExMDoKKyAgICBpZiAoISAoKnNkMSA8PSByZ2Ftc3EpKSB7CisJZ290byBMMTMwOworICAgIH0KKyAgICBpZiAoKnNkMSA9PSB6ZXJvKSB7CisJZ290byBMMTYwOworICAgIH0KKyAgICBpZ28gPSAwOworICAgIGlnb19mbXQgPSBmbXRfMTIwOworLyogICAgICAgICAgICAgIEZJWC1ILi4gKi8KKyAgICBnb3RvIEw3MDsKK0wxMjA6CisvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgcl9fMSA9IGdhbTsKKyAgICAqc2QxICo9IHJfXzEgKiByX18xOworICAgICpzeDEgLz0gZ2FtOworICAgIHNoMTEgLz0gZ2FtOworICAgIHNoMTIgLz0gZ2FtOworICAgIGdvdG8gTDExMDsKK0wxMzA6CitMMTQwOgorICAgIGlmICghICgqc2QxID49IGdhbXNxKSkgeworCWdvdG8gTDE2MDsKKyAgICB9CisgICAgaWdvID0gMTsKKyAgICBpZ29fZm10ID0gZm10XzE1MDsKKy8qICAgICAgICAgICAgICBGSVgtSC4uICovCisgICAgZ290byBMNzA7CitMMTUwOgorLyogQ29tcHV0aW5nIDJuZCBwb3dlciAqLworICAgIHJfXzEgPSBnYW07CisgICAgKnNkMSAvPSByX18xICogcl9fMTsKKyAgICAqc3gxICo9IGdhbTsKKyAgICBzaDExICo9IGdhbTsKKyAgICBzaDEyICo9IGdhbTsKKyAgICBnb3RvIEwxNDA7CitMMTYwOgorTDE3MDoKKyAgICBpZiAoISAoZGFicygqc2QyKSA8PSByZ2Ftc3EpKSB7CisJZ290byBMMTkwOworICAgIH0KKyAgICBpZiAoKnNkMiA9PSB6ZXJvKSB7CisJZ290byBMMjIwOworICAgIH0KKyAgICBpZ28gPSAyOworICAgIGlnb19mbXQgPSBmbXRfMTgwOworLyogICAgICAgICAgICAgIEZJWC1ILi4gKi8KKyAgICBnb3RvIEw3MDsKK0wxODA6CisvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgcl9fMSA9IGdhbTsKKyAgICAqc2QyICo9IHJfXzEgKiByX18xOworICAgIHNoMjEgLz0gZ2FtOworICAgIHNoMjIgLz0gZ2FtOworICAgIGdvdG8gTDE3MDsKK0wxOTA6CitMMjAwOgorICAgIGlmICghIChkYWJzKCpzZDIpID49IGdhbXNxKSkgeworCWdvdG8gTDIyMDsKKyAgICB9CisgICAgaWdvID0gMzsKKyAgICBpZ29fZm10ID0gZm10XzIxMDsKKy8qICAgICAgICAgICAgICBGSVgtSC4uICovCisgICAgZ290byBMNzA7CitMMjEwOgorLyogQ29tcHV0aW5nIDJuZCBwb3dlciAqLworICAgIHJfXzEgPSBnYW07CisgICAgKnNkMiAvPSByX18xICogcl9fMTsKKyAgICBzaDIxICo9IGdhbTsKKyAgICBzaDIyICo9IGdhbTsKKyAgICBnb3RvIEwyMDA7CitMMjIwOgorICAgIGlmIChzZmxhZyA8IDAuZikgeworCWdvdG8gTDI1MDsKKyAgICB9IGVsc2UgaWYgKHNmbGFnID09IDApIHsKKwlnb3RvIEwyMzA7CisgICAgfSBlbHNlIHsKKwlnb3RvIEwyNDA7CisgICAgfQorTDIzMDoKKyAgICBzcGFyYW1bM10gPSBzaDIxOworICAgIHNwYXJhbVs0XSA9IHNoMTI7CisgICAgZ290byBMMjYwOworTDI0MDoKKyAgICBzcGFyYW1bMl0gPSBzaDExOworICAgIHNwYXJhbVs1XSA9IHNoMjI7CisgICAgZ290byBMMjYwOworTDI1MDoKKyAgICBzcGFyYW1bMl0gPSBzaDExOworICAgIHNwYXJhbVszXSA9IHNoMjE7CisgICAgc3BhcmFtWzRdID0gc2gxMjsKKyAgICBzcGFyYW1bNV0gPSBzaDIyOworTDI2MDoKKyAgICBzcGFyYW1bMV0gPSBzZmxhZzsKKyAgICByZXR1cm4gMDsKK30gLyogc3JvdG1nXyAqLworCmRpZmYgLS1naXQgYS9ibGFzL2YyYy9zc2Jtdi5jIGIvYmxhcy9mMmMvc3NibXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk5MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9mMmMvc3NibXYuYwpAQCAtMCwwICsxLDM2OCBAQAorLyogc3NibXYuZiAtLSB0cmFuc2xhdGVkIGJ5IGYyYyAodmVyc2lvbiAyMDEwMDgyNykuCisgICBZb3UgbXVzdCBsaW5rIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2l0aCBsaWJmMmM6CisJb24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtLCBsaW5rIHdpdGggbGliZjJjLmxpYjsKKwlvbiBMaW51eCBvciBVbml4IHN5c3RlbXMsIGxpbmsgd2l0aCAuLi4vcGF0aC90by9saWJmMmMuYSAtbG0KKwlvciwgaWYgeW91IGluc3RhbGwgbGliZjJjLmEgaW4gYSBzdGFuZGFyZCBwbGFjZSwgd2l0aCAtbGYyYyAtbG0KKwktLSBpbiB0aGF0IG9yZGVyLCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluCisJCWNjICoubyAtbGYyYyAtbG0KKwlTb3VyY2UgZm9yIGxpYmYyYyBpcyBpbiAvbmV0bGliL2YyYy9saWJmMmMuemlwLCBlLmcuLAorCisJCWh0dHA6Ly93d3cubmV0bGliLm9yZy9mMmMvbGliZjJjLnppcAorKi8KKworI2luY2x1ZGUgImRhdGF0eXBlcy5oIgorCisvKiBTdWJyb3V0aW5lICovIGludCBzc2Jtdl8oY2hhciAqdXBsbywgaW50ZWdlciAqbiwgaW50ZWdlciAqaywgcmVhbCAqYWxwaGEsIAorCXJlYWwgKmEsIGludGVnZXIgKmxkYSwgcmVhbCAqeCwgaW50ZWdlciAqaW5jeCwgcmVhbCAqYmV0YSwgcmVhbCAqeSwgCisJaW50ZWdlciAqaW5jeSwgZnRubGVuIHVwbG9fbGVuKQoreworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgaW50ZWdlciBhX2RpbTEsIGFfb2Zmc2V0LCBpX18xLCBpX18yLCBpX18zLCBpX180OworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgaW50ZWdlciBpX18sIGosIGwsIGl4LCBpeSwgangsIGp5LCBreCwga3ksIGluZm87CisgICAgcmVhbCB0ZW1wMSwgdGVtcDI7CisgICAgZXh0ZXJuIGxvZ2ljYWwgbHNhbWVfKGNoYXIgKiwgY2hhciAqLCBmdG5sZW4sIGZ0bmxlbik7CisgICAgaW50ZWdlciBrcGx1czE7CisgICAgZXh0ZXJuIC8qIFN1YnJvdXRpbmUgKi8gaW50IHhlcmJsYV8oY2hhciAqLCBpbnRlZ2VyICosIGZ0bmxlbik7CisKKy8qICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgUHVycG9zZSAqLworLyogID09PT09PT0gKi8KKworLyogIFNTQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uICovCisKKy8qICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwgKi8KKworLyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgKi8KKy8qICBBIGlzIGFuIG4gYnkgbiBzeW1tZXRyaWMgYmFuZCBtYXRyaXgsIHdpdGggayBzdXBlci1kaWFnb25hbHMuICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGJhbmQgbWF0cml4IEEgaXMgYmVpbmcgc3VwcGxpZWQgYXMgKi8KKy8qICAgICAgICAgICBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSyAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdXBlci1kaWFnb25hbHMgb2YgdGhlICovCisvKiAgICAgICAgICAgbWF0cml4IEEuIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEFMUEhBICAtIFJFQUwgICAgICAgICAgICAuICovCisvKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQSAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93ICovCisvKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0ICovCisvKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlICovCisvKiAgICAgICAgICAgb2YgdGhlIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciB0aGUgdXBwZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgKi8KKy8qICAgICAgICAgICBmdWxsIG1hdHJpeCBzdG9yYWdlIHRvIGJhbmQgc3RvcmFnZTogKi8KKworLyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTiAqLworLyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSiAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKSAqLworLyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFICovCisvKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUgKi8KKworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkgKi8KKy8qICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyICovCisvKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBjb2x1bW4gYnkgKi8KKy8qICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZiAqLworLyogICAgICAgICAgIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1Yi1kaWFnb25hbCBzdGFydGluZyBhdCBwb3NpdGlvbiAxIGluICovCisvKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlICovCisvKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4gKi8KKy8qICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIHRoZSBsb3dlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiBhIHN5bW1ldHJpYyBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCAqLworLyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIExEQSAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkICovCisvKiAgICAgICAgICAgaW4gdGhlIGNhbGxpbmcgKHN1YikgcHJvZ3JhbS4gTERBIG11c3QgYmUgYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIGsgKyAxICkuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSAqLworLyogICAgICAgICAgIHZlY3RvciB4LiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSU5DWCAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQkVUQSAgIC0gUkVBTCAgICAgICAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQkVUQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBiZXRhLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWSAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgKi8KKy8qICAgICAgICAgICB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZCB2ZWN0b3IgeS4gKi8KKworLyogIElOQ1kgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEZ1cnRoZXIgRGV0YWlscyAqLworLyogID09PT09PT09PT09PT09PSAqLworCisvKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuICovCisKKy8qICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4gKi8KKy8qICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4gKi8KKy8qICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4gKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gUGFyYW1ldGVycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisKKy8qICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLiAqLworCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgYV9kaW0xID0gKmxkYTsKKyAgICBhX29mZnNldCA9IDEgKyBhX2RpbTE7CisgICAgYSAtPSBhX29mZnNldDsKKyAgICAtLXg7CisgICAgLS15OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGluZm8gPSAwOworICAgIGlmICghIGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh1cGxvLCAiTCIsICgKKwkgICAgZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMTsKKyAgICB9IGVsc2UgaWYgKCpuIDwgMCkgeworCWluZm8gPSAyOworICAgIH0gZWxzZSBpZiAoKmsgPCAwKSB7CisJaW5mbyA9IDM7CisgICAgfSBlbHNlIGlmICgqbGRhIDwgKmsgKyAxKSB7CisJaW5mbyA9IDY7CisgICAgfSBlbHNlIGlmICgqaW5jeCA9PSAwKSB7CisJaW5mbyA9IDg7CisgICAgfSBlbHNlIGlmICgqaW5jeSA9PSAwKSB7CisJaW5mbyA9IDExOworICAgIH0KKyAgICBpZiAoaW5mbyAhPSAwKSB7CisJeGVyYmxhXygiU1NCTVYgIiwgJmluZm8sIChmdG5sZW4pNik7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLiAqLworCisgICAgaWYgKCpuID09IDAgfHwgKCphbHBoYSA9PSAwLmYgJiYgKmJldGEgPT0gMS5mKSkgeworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuICovCisKKyAgICBpZiAoKmluY3ggPiAwKSB7CisJa3ggPSAxOworICAgIH0gZWxzZSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9CisgICAgaWYgKCppbmN5ID4gMCkgeworCWt5ID0gMTsKKyAgICB9IGVsc2UgeworCWt5ID0gMSAtICgqbiAtIDEpICogKmluY3k7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEgKi8KKy8qICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLiAqLworCisvKiAgICAgRmlyc3QgZm9ybSAgeSA6PSBiZXRhKnkuICovCisKKyAgICBpZiAoKmJldGEgIT0gMS5mKSB7CisJaWYgKCppbmN5ID09IDEpIHsKKwkgICAgaWYgKCpiZXRhID09IDAuZikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2lfX10gPSAwLmY7CisvKiBMMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpX19dID0gKmJldGEgKiB5W2lfX107CisvKiBMMjA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGl5ID0ga3k7CisJICAgIGlmICgqYmV0YSA9PSAwLmYpIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpeV0gPSAwLmY7CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEwzMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICB5W2l5XSA9ICpiZXRhICogeVtpeV07CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw0MDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiAoKmFscGhhID09IDAuZikgeworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobHNhbWVfKHVwbG8sICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisKKy8qICAgICAgICBGb3JtICB5ICB3aGVuIHVwcGVyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLiAqLworCisJa3BsdXMxID0gKmsgKyAxOworCWlmICgqaW5jeCA9PSAxICYmICppbmN5ID09IDEpIHsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQl0ZW1wMSA9ICphbHBoYSAqIHhbal07CisJCXRlbXAyID0gMC5mOworCQlsID0ga3BsdXMxIC0gajsKKy8qIENvbXB1dGluZyBNQVggKi8KKwkJaV9fMiA9IDEsIGlfXzMgPSBqIC0gKms7CisJCWlfXzQgPSBqIC0gMTsKKwkJZm9yIChpX18gPSBtYXgoaV9fMixpX18zKTsgaV9fIDw9IGlfXzQ7ICsraV9fKSB7CisJCSAgICB5W2lfX10gKz0gdGVtcDEgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJICAgIHRlbXAyICs9IGFbbCArIGlfXyArIGogKiBhX2RpbTFdICogeFtpX19dOworLyogTDUwOiAqLworCQl9CisJCXlbal0gPSB5W2pdICsgdGVtcDEgKiBhW2twbHVzMSArIGogKiBhX2RpbTFdICsgKmFscGhhICogdGVtcDI7CisvKiBMNjA6ICovCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBqeCA9IGt4OworCSAgICBqeSA9IGt5OworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqeF07CisJCXRlbXAyID0gMC5mOworCQlpeCA9IGt4OworCQlpeSA9IGt5OworCQlsID0ga3BsdXMxIC0gajsKKy8qIENvbXB1dGluZyBNQVggKi8KKwkJaV9fNCA9IDEsIGlfXzIgPSBqIC0gKms7CisJCWlfXzMgPSBqIC0gMTsKKwkJZm9yIChpX18gPSBtYXgoaV9fNCxpX18yKTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCSAgICB5W2l5XSArPSB0ZW1wMSAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworCQkgICAgdGVtcDIgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2l4XTsKKwkJICAgIGl4ICs9ICppbmN4OworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNzA6ICovCisJCX0KKwkJeVtqeV0gPSB5W2p5XSArIHRlbXAxICogYVtrcGx1czEgKyBqICogYV9kaW0xXSArICphbHBoYSAqIAorCQkJdGVtcDI7CisJCWp4ICs9ICppbmN4OworCQlqeSArPSAqaW5jeTsKKwkJaWYgKGogPiAqaykgeworCQkgICAga3ggKz0gKmluY3g7CisJCSAgICBreSArPSAqaW5jeTsKKwkJfQorLyogTDgwOiAqLworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisKKy8qICAgICAgICBGb3JtICB5ICB3aGVuIGxvd2VyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLmY7CisJCXlbal0gKz0gdGVtcDEgKiBhW2ogKiBhX2RpbTEgKyAxXTsKKwkJbCA9IDEgLSBqOworLyogQ29tcHV0aW5nIE1JTiAqLworCQlpX180ID0gKm4sIGlfXzIgPSBqICsgKms7CisJCWlfXzMgPSBtaW4oaV9fNCxpX18yKTsKKwkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCSAgICB5W2lfX10gKz0gdGVtcDEgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJICAgIHRlbXAyICs9IGFbbCArIGlfXyArIGogKiBhX2RpbTFdICogeFtpX19dOworLyogTDkwOiAqLworCQl9CisJCXlbal0gKz0gKmFscGhhICogdGVtcDI7CisvKiBMMTAwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQl0ZW1wMSA9ICphbHBoYSAqIHhbanhdOworCQl0ZW1wMiA9IDAuZjsKKwkJeVtqeV0gKz0gdGVtcDEgKiBhW2ogKiBhX2RpbTEgKyAxXTsKKwkJbCA9IDEgLSBqOworCQlpeCA9IGp4OworCQlpeSA9IGp5OworLyogQ29tcHV0aW5nIE1JTiAqLworCQlpX180ID0gKm4sIGlfXzIgPSBqICsgKms7CisJCWlfXzMgPSBtaW4oaV9fNCxpX18yKTsKKwkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCSAgICBpeCArPSAqaW5jeDsKKwkJICAgIGl5ICs9ICppbmN5OworCQkgICAgeVtpeV0gKz0gdGVtcDEgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJICAgIHRlbXAyICs9IGFbbCArIGlfXyArIGogKiBhX2RpbTFdICogeFtpeF07CisvKiBMMTEwOiAqLworCQl9CisJCXlbanldICs9ICphbHBoYSAqIHRlbXAyOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisvKiBMMTIwOiAqLworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIFNTQk1WIC4gKi8KKworfSAvKiBzc2Jtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvc3NwbXYuYyBiL2JsYXMvZjJjL3NzcG12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4NThlYwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3NzcG12LmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIHNzcG12LmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgc3NwbXZfKGNoYXIgKnVwbG8sIGludGVnZXIgKm4sIHJlYWwgKmFscGhhLCByZWFsICphcCwgCisJcmVhbCAqeCwgaW50ZWdlciAqaW5jeCwgcmVhbCAqYmV0YSwgcmVhbCAqeSwgaW50ZWdlciAqaW5jeSwgZnRubGVuIAorCXVwbG9fbGVuKQoreworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgaW50ZWdlciBpX18xLCBpX18yOworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgaW50ZWdlciBpX18sIGosIGssIGtrLCBpeCwgaXksIGp4LCBqeSwga3gsIGt5LCBpbmZvOworICAgIHJlYWwgdGVtcDEsIHRlbXAyOworICAgIGV4dGVybiBsb2dpY2FsIGxzYW1lXyhjaGFyICosIGNoYXIgKiwgZnRubGVuLCBmdG5sZW4pOworICAgIGV4dGVybiAvKiBTdWJyb3V0aW5lICovIGludCB4ZXJibGFfKGNoYXIgKiwgaW50ZWdlciAqLCBmdG5sZW4pOworCisvKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogIFB1cnBvc2UgKi8KKy8qICA9PT09PT09ICovCisKKy8qICBTU1BNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9uICovCisKKy8qICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwgKi8KKworLyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgKi8KKy8qICBBIGlzIGFuIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PT0gKi8KKworLyogIFVQTE8gICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IEEgaXMgc3VwcGxpZWQgaW4gdGhlIHBhY2tlZCAqLworLyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIE4gICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBTFBIQSAgLSBSRUFMICAgICAgICAgICAgLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEFQICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAoIG4qKCBuICsgMSApICkvMiApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdCAqLworLyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCAqLworLyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSAqLworLyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKSAqLworLyogICAgICAgICAgIGFuZCBhKCAyLCAyICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBhcnJheSBBUCBtdXN0ICovCisvKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4ICovCisvKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApICovCisvKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApICovCisvKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFggICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4gKi8KKy8qICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSU5DWCAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQkVUQSAgIC0gUkVBTCAgICAgICAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQkVUQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBiZXRhLiBXaGVuIEJFVEEgaXMgKi8KKy8qICAgICAgICAgICBzdXBwbGllZCBhcyB6ZXJvIHRoZW4gWSBuZWVkIG5vdCBiZSBzZXQgb24gaW5wdXQuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBZICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFkgbXVzdCBjb250YWluIHRoZSBuICovCisvKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZCAqLworLyogICAgICAgICAgIHZlY3RvciB5LiAqLworCisvKiAgSU5DWSAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWS4gSU5DWSBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgRnVydGhlciBEZXRhaWxzICovCisvKiAgPT09PT09PT09PT09PT09ICovCisKKy8qICBMZXZlbCAyIEJsYXMgcm91dGluZS4gKi8KKworLyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LiAqLworLyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLiAqLworLyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLiAqLworCisvKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qICAgICAuLiBQYXJhbWV0ZXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uICovCisvKiAgICAgLi4gKi8KKworLyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICAtLXk7CisgICAgLS14OworICAgIC0tYXA7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgaW5mbyA9IDA7CisgICAgaWYgKCEgbHNhbWVfKHVwbG8sICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpICYmICEgbHNhbWVfKHVwbG8sICJMIiwgKAorCSAgICBmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCWluZm8gPSAxOworICAgIH0gZWxzZSBpZiAoKm4gPCAwKSB7CisJaW5mbyA9IDI7CisgICAgfSBlbHNlIGlmICgqaW5jeCA9PSAwKSB7CisJaW5mbyA9IDY7CisgICAgfSBlbHNlIGlmICgqaW5jeSA9PSAwKSB7CisJaW5mbyA9IDk7CisgICAgfQorICAgIGlmIChpbmZvICE9IDApIHsKKwl4ZXJibGFfKCJTU1BNViAiLCAmaW5mbywgKGZ0bmxlbik2KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKy8qICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuICovCisKKyAgICBpZiAoKm4gPT0gMCB8fCAoKmFscGhhID09IDAuZiAmJiAqYmV0YSA9PSAxLmYpKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gIFggIGFuZCAgWS4gKi8KKworICAgIGlmICgqaW5jeCA+IDApIHsKKwlreCA9IDE7CisgICAgfSBlbHNlIHsKKwlreCA9IDEgLSAoKm4gLSAxKSAqICppbmN4OworICAgIH0KKyAgICBpZiAoKmluY3kgPiAwKSB7CisJa3kgPSAxOworICAgIH0gZWxzZSB7CisJa3kgPSAxIC0gKCpuIC0gMSkgKiAqaW5jeTsKKyAgICB9CisKKy8qICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQVAgKi8KKy8qICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4gKi8KKworLyogICAgIEZpcnN0IGZvcm0gIHkgOj0gYmV0YSp5LiAqLworCisgICAgaWYgKCpiZXRhICE9IDEuZikgeworCWlmICgqaW5jeSA9PSAxKSB7CisJICAgIGlmICgqYmV0YSA9PSAwLmYpIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpX19dID0gMC5mOworLyogTDEwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIHlbaV9fXSA9ICpiZXRhICogeVtpX19dOworLyogTDIwOiAqLworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpeSA9IGt5OworCSAgICBpZiAoKmJldGEgPT0gMC5mKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIHlbaXldID0gMC5mOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMMzA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgeVtpeV0gPSAqYmV0YSAqIHlbaXldOworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNDA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKCphbHBoYSA9PSAwLmYpIHsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAga2sgPSAxOworICAgIGlmIChsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIHVwcGVyIHRyaWFuZ2xlLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLmY7CisJCWsgPSBrazsKKwkJaV9fMiA9IGogLSAxOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCQkgICAgeVtpX19dICs9IHRlbXAxICogYXBba107CisJCSAgICB0ZW1wMiArPSBhcFtrXSAqIHhbaV9fXTsKKwkJICAgICsrazsKKy8qIEw1MDogKi8KKwkJfQorCQl5W2pdID0geVtqXSArIHRlbXAxICogYXBba2sgKyBqIC0gMV0gKyAqYWxwaGEgKiB0ZW1wMjsKKwkJa2sgKz0gajsKKy8qIEw2MDogKi8KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGp4ID0ga3g7CisJICAgIGp5ID0ga3k7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJdGVtcDEgPSAqYWxwaGEgKiB4W2p4XTsKKwkJdGVtcDIgPSAwLmY7CisJCWl4ID0ga3g7CisJCWl5ID0ga3k7CisJCWlfXzIgPSBrayArIGogLSAyOworCQlmb3IgKGsgPSBrazsgayA8PSBpX18yOyArK2spIHsKKwkJICAgIHlbaXldICs9IHRlbXAxICogYXBba107CisJCSAgICB0ZW1wMiArPSBhcFtrXSAqIHhbaXhdOworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw3MDogKi8KKwkJfQorCQl5W2p5XSA9IHlbanldICsgdGVtcDEgKiBhcFtrayArIGogLSAxXSArICphbHBoYSAqIHRlbXAyOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisJCWtrICs9IGo7CisvKiBMODA6ICovCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIGxvd2VyIHRyaWFuZ2xlLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCXRlbXAxID0gKmFscGhhICogeFtqXTsKKwkJdGVtcDIgPSAwLmY7CisJCXlbal0gKz0gdGVtcDEgKiBhcFtra107CisJCWsgPSBrayArIDE7CisJCWlfXzIgPSAqbjsKKwkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzI7ICsraV9fKSB7CisJCSAgICB5W2lfX10gKz0gdGVtcDEgKiBhcFtrXTsKKwkJICAgIHRlbXAyICs9IGFwW2tdICogeFtpX19dOworCQkgICAgKytrOworLyogTDkwOiAqLworCQl9CisJCXlbal0gKz0gKmFscGhhICogdGVtcDI7CisJCWtrICs9ICpuIC0gaiArIDE7CisvKiBMMTAwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQl0ZW1wMSA9ICphbHBoYSAqIHhbanhdOworCQl0ZW1wMiA9IDAuZjsKKwkJeVtqeV0gKz0gdGVtcDEgKiBhcFtra107CisJCWl4ID0gang7CisJCWl5ID0gank7CisJCWlfXzIgPSBrayArICpuIC0gajsKKwkJZm9yIChrID0ga2sgKyAxOyBrIDw9IGlfXzI7ICsraykgeworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKwkJICAgIHlbaXldICs9IHRlbXAxICogYXBba107CisJCSAgICB0ZW1wMiArPSBhcFtrXSAqIHhbaXhdOworLyogTDExMDogKi8KKwkJfQorCQl5W2p5XSArPSAqYWxwaGEgKiB0ZW1wMjsKKwkJanggKz0gKmluY3g7CisJCWp5ICs9ICppbmN5OworCQlrayArPSAqbiAtIGogKyAxOworLyogTDEyMDogKi8KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworLyogICAgIEVuZCBvZiBTU1BNViAuICovCisKK30gLyogc3NwbXZfICovCisKZGlmZiAtLWdpdCBhL2JsYXMvZjJjL3N0Ym12LmMgYi9ibGFzL2YyYy9zdGJtdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjljZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2YyYy9zdGJtdi5jCkBAIC0wLDAgKzEsNDI4IEBACisvKiBzdGJtdi5mIC0tIHRyYW5zbGF0ZWQgYnkgZjJjICh2ZXJzaW9uIDIwMTAwODI3KS4KKyAgIFlvdSBtdXN0IGxpbmsgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aXRoIGxpYmYyYzoKKwlvbiBNaWNyb3NvZnQgV2luZG93cyBzeXN0ZW0sIGxpbmsgd2l0aCBsaWJmMmMubGliOworCW9uIExpbnV4IG9yIFVuaXggc3lzdGVtcywgbGluayB3aXRoIC4uLi9wYXRoL3RvL2xpYmYyYy5hIC1sbQorCW9yLCBpZiB5b3UgaW5zdGFsbCBsaWJmMmMuYSBpbiBhIHN0YW5kYXJkIHBsYWNlLCB3aXRoIC1sZjJjIC1sbQorCS0tIGluIHRoYXQgb3JkZXIsIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4KKwkJY2MgKi5vIC1sZjJjIC1sbQorCVNvdXJjZSBmb3IgbGliZjJjIGlzIGluIC9uZXRsaWIvZjJjL2xpYmYyYy56aXAsIGUuZy4sCisKKwkJaHR0cDovL3d3dy5uZXRsaWIub3JnL2YyYy9saWJmMmMuemlwCisqLworCisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiCisKKy8qIFN1YnJvdXRpbmUgKi8gaW50IHN0Ym12XyhjaGFyICp1cGxvLCBjaGFyICp0cmFucywgY2hhciAqZGlhZywgaW50ZWdlciAqbiwgCisJaW50ZWdlciAqaywgcmVhbCAqYSwgaW50ZWdlciAqbGRhLCByZWFsICp4LCBpbnRlZ2VyICppbmN4LCBmdG5sZW4gCisJdXBsb19sZW4sIGZ0bmxlbiB0cmFuc19sZW4sIGZ0bmxlbiBkaWFnX2xlbikKK3sKKyAgICAvKiBTeXN0ZW0gZ2VuZXJhdGVkIGxvY2FscyAqLworICAgIGludGVnZXIgYV9kaW0xLCBhX29mZnNldCwgaV9fMSwgaV9fMiwgaV9fMywgaV9fNDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBsLCBpeCwgangsIGt4LCBpbmZvOworICAgIHJlYWwgdGVtcDsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBpbnRlZ2VyIGtwbHVzMTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKyAgICBsb2dpY2FsIG5vdW5pdDsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgU1RCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zICovCisKKy8qICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwgKi8KKworLyogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LCAqLworLyogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXgsIHdpdGggKCBrICsgMSApIGRpYWdvbmFscy4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PT0gKi8KKworLyogIFVQTE8gICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggaXMgYW4gdXBwZXIgb3IgKi8KKy8qICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFRSQU5TICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgYXMgKi8KKy8qICAgICAgICAgICBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVFJBTlMgPSAnTicgb3IgJ24nICAgeCA6PSBBKnguICovCisKKy8qICAgICAgICAgICAgICBUUkFOUyA9ICdUJyBvciAndCcgICB4IDo9IEEnKnguICovCisKKy8qICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICB4IDo9IEEnKnguICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIERJQUcgICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuICovCisKKy8qICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5ndWxhci4gKi8KKworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgTiAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4gKi8KKy8qICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEsgICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiAqLworLyogICAgICAgICAgIHN1cGVyLWRpYWdvbmFscyBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiAqLworLyogICAgICAgICAgIHN1Yi1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEEgICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OICggTERBLCBuICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKSAqLworLyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgKi8KKy8qICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudHMsIHN1cHBsaWVkIGNvbHVtbiBieSAqLworLyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAqLworLyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdCAqLworLyogICAgICAgICAgIHBvc2l0aW9uIDIgaW4gcm93IGssIGFuZCBzbyBvbi4gVGhlIHRvcCBsZWZ0IGsgYnkgayB0cmlhbmdsZSAqLworLyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLiAqLworLyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgYW4gdXBwZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UgKi8KKy8qICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6ICovCisKKy8qICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4gKi8KKy8qICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBNQVgoIDEsIEogLSBLICksIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cywgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93IDEgb2YgKi8KKy8qICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbiAqLworLyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZSAqLworLyogICAgICAgICAgIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhIGxvd2VyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlICovCisvKiAgICAgICAgICAgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBOb3RlIHRoYXQgd2hlbiBESUFHID0gJ1UnIG9yICd1JyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEgKi8KKy8qICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGFyZSBub3QgKi8KKy8qICAgICAgICAgICByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBMREEgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZCAqLworLyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCBrICsgMSApLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbiAqLworLyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguIE9uIGV4aXQsIFggaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgKi8KKy8qICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LiAqLworCisvKiAgSU5DWCAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgRnVydGhlciBEZXRhaWxzICovCisvKiAgPT09PT09PT09PT09PT09ICovCisKKy8qICBMZXZlbCAyIEJsYXMgcm91dGluZS4gKi8KKworLyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LiAqLworLyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLiAqLworLyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLiAqLworCisvKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qICAgICAuLiBQYXJhbWV0ZXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKworLyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICBhX2RpbTEgPSAqbGRhOworICAgIGFfb2Zmc2V0ID0gMSArIGFfZGltMTsKKyAgICBhIC09IGFfb2Zmc2V0OworICAgIC0teDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICghIGxzYW1lXyh0cmFucywgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odHJhbnMsIAorCSAgICAiVCIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh0cmFucywgIkMiLCAoZnRubGVuKTEsICgKKwkgICAgZnRubGVuKTEpKSB7CisJaW5mbyA9IDI7CisgICAgfSBlbHNlIGlmICghIGxzYW1lXyhkaWFnLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyhkaWFnLCAKKwkgICAgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMzsKKyAgICB9IGVsc2UgaWYgKCpuIDwgMCkgeworCWluZm8gPSA0OworICAgIH0gZWxzZSBpZiAoKmsgPCAwKSB7CisJaW5mbyA9IDU7CisgICAgfSBlbHNlIGlmICgqbGRhIDwgKmsgKyAxKSB7CisJaW5mbyA9IDc7CisgICAgfSBlbHNlIGlmICgqaW5jeCA9PSAwKSB7CisJaW5mbyA9IDk7CisgICAgfQorICAgIGlmIChpbmZvICE9IDApIHsKKwl4ZXJibGFfKCJTVEJNViAiLCAmaW5mbywgKGZ0bmxlbik2KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKy8qICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuICovCisKKyAgICBpZiAoKm4gPT0gMCkgeworCXJldHVybiAwOworICAgIH0KKworICAgIG5vdW5pdCA9IGxzYW1lXyhkaWFnLCAiTiIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKTsKKworLyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4gVGhpcyAqLworLyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICAgdG9vIHNtYWxsIGZvciBkZXNjZW5kaW5nIGxvb3BzLiAqLworCisgICAgaWYgKCppbmN4IDw9IDApIHsKKwlreCA9IDEgLSAoKm4gLSAxKSAqICppbmN4OworICAgIH0gZWxzZSBpZiAoKmluY3ggIT0gMSkgeworCWt4ID0gMTsKKyAgICB9CisKKy8qICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiBBIGFyZSAqLworLyogICAgIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQS4gKi8KKworICAgIGlmIChsc2FtZV8odHJhbnMsICJOIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisKKy8qICAgICAgICAgRm9ybSAgeCA6PSBBKnguICovCisKKwlpZiAobHNhbWVfKHVwbG8sICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJICAgIGtwbHVzMSA9ICprICsgMTsKKwkgICAgaWYgKCppbmN4ID09IDEpIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQkgICAgaWYgKHhbal0gIT0gMC5mKSB7CisJCQl0ZW1wID0geFtqXTsKKwkJCWwgPSBrcGx1czEgLSBqOworLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fMiA9IDEsIGlfXzMgPSBqIC0gKms7CisJCQlpX180ID0gaiAtIDE7CisJCQlmb3IgKGlfXyA9IG1heChpX18yLGlfXzMpOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICB4W2lfX10gKz0gdGVtcCAqIGFbbCArIGlfXyArIGogKiBhX2RpbTFdOworLyogTDEwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIHhbal0gKj0gYVtrcGx1czEgKyBqICogYV9kaW0xXTsKKwkJCX0KKwkJICAgIH0KKy8qIEwyMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlqeCA9IGt4OworCQlpX18xID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCSAgICBpZiAoeFtqeF0gIT0gMC5mKSB7CisJCQl0ZW1wID0geFtqeF07CisJCQlpeCA9IGt4OworCQkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMiA9IGogLSAqazsKKwkJCWlfXzMgPSBqIC0gMTsKKwkJCWZvciAoaV9fID0gbWF4KGlfXzQsaV9fMik7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkJICAgIHhbaXhdICs9IHRlbXAgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJCSAgICBpeCArPSAqaW5jeDsKKy8qIEwzMDogKi8KKwkJCX0KKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICB4W2p4XSAqPSBhW2twbHVzMSArIGogKiBhX2RpbTFdOworCQkJfQorCQkgICAgfQorCQkgICAganggKz0gKmluY3g7CisJCSAgICBpZiAoaiA+ICprKSB7CisJCQlreCArPSAqaW5jeDsKKwkJICAgIH0KKy8qIEw0MDogKi8KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKCppbmN4ID09IDEpIHsKKwkJZm9yIChqID0gKm47IGogPj0gMTsgLS1qKSB7CisJCSAgICBpZiAoeFtqXSAhPSAwLmYpIHsKKwkJCXRlbXAgPSB4W2pdOworCQkJbCA9IDEgLSBqOworLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18zID0gaiArICprOworCQkJaV9fNCA9IGogKyAxOworCQkJZm9yIChpX18gPSBtaW4oaV9fMSxpX18zKTsgaV9fID49IGlfXzQ7IC0taV9fKSB7CisJCQkgICAgeFtpX19dICs9IHRlbXAgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKy8qIEw1MDogKi8KKwkJCX0KKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICB4W2pdICo9IGFbaiAqIGFfZGltMSArIDFdOworCQkJfQorCQkgICAgfQorLyogTDYwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWt4ICs9ICgqbiAtIDEpICogKmluY3g7CisJCWp4ID0ga3g7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgaWYgKHhbanhdICE9IDAuZikgeworCQkJdGVtcCA9IHhbanhdOworCQkJaXggPSBreDsKKwkJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzQgPSAqbiwgaV9fMSA9IGogKyAqazsKKwkJCWlfXzMgPSBqICsgMTsKKwkJCWZvciAoaV9fID0gbWluKGlfXzQsaV9fMSk7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIHhbaXhdICs9IHRlbXAgKiBhW2wgKyBpX18gKyBqICogYV9kaW0xXTsKKwkJCSAgICBpeCAtPSAqaW5jeDsKKy8qIEw3MDogKi8KKwkJCX0KKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICB4W2p4XSAqPSBhW2ogKiBhX2RpbTEgKyAxXTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGp4IC09ICppbmN4OworCQkgICAgaWYgKCpuIC0gaiA+PSAqaykgeworCQkJa3ggLT0gKmluY3g7CisJCSAgICB9CisvKiBMODA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCisvKiAgICAgICAgRm9ybSAgeCA6PSBBJyp4LiAqLworCisJaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCSAgICBrcGx1czEgPSAqayArIDE7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgdGVtcCA9IHhbal07CisJCSAgICBsID0ga3BsdXMxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtrcGx1czEgKyBqICogYV9kaW0xXTsKKwkJICAgIH0KKy8qIENvbXB1dGluZyBNQVggKi8KKwkJICAgIGlfXzQgPSAxLCBpX18xID0gaiAtICprOworCQkgICAgaV9fMyA9IG1heChpX180LGlfXzEpOworCQkgICAgZm9yIChpX18gPSBqIC0gMTsgaV9fID49IGlfXzM7IC0taV9fKSB7CisJCQl0ZW1wICs9IGFbbCArIGlfXyArIGogKiBhX2RpbTFdICogeFtpX19dOworLyogTDkwOiAqLworCQkgICAgfQorCQkgICAgeFtqXSA9IHRlbXA7CisvKiBMMTAwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWt4ICs9ICgqbiAtIDEpICogKmluY3g7CisJCWp4ID0ga3g7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgdGVtcCA9IHhbanhdOworCQkgICAga3ggLT0gKmluY3g7CisJCSAgICBpeCA9IGt4OworCQkgICAgbCA9IGtwbHVzMSAtIGo7CisJCSAgICBpZiAobm91bml0KSB7CisJCQl0ZW1wICo9IGFba3BsdXMxICsgaiAqIGFfZGltMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUFYICovCisJCSAgICBpX180ID0gMSwgaV9fMSA9IGogLSAqazsKKwkJICAgIGlfXzMgPSBtYXgoaV9fNCxpX18xKTsKKwkJICAgIGZvciAoaV9fID0gaiAtIDE7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJdGVtcCArPSBhW2wgKyBpX18gKyBqICogYV9kaW0xXSAqIHhbaXhdOworCQkJaXggLT0gKmluY3g7CisvKiBMMTEwOiAqLworCQkgICAgfQorCQkgICAgeFtqeF0gPSB0ZW1wOworCQkgICAganggLT0gKmluY3g7CisvKiBMMTIwOiAqLworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlpX18zID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMzsgKytqKSB7CisJCSAgICB0ZW1wID0geFtqXTsKKwkJICAgIGwgPSAxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtqICogYV9kaW0xICsgMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUlOICovCisJCSAgICBpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCSAgICBpX180ID0gbWluKGlfXzEsaV9fMik7CisJCSAgICBmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCXRlbXAgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2lfX107CisvKiBMMTMwOiAqLworCQkgICAgfQorCQkgICAgeFtqXSA9IHRlbXA7CisvKiBMMTQwOiAqLworCQl9CisJICAgIH0gZWxzZSB7CisJCWp4ID0ga3g7CisJCWlfXzMgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18zOyArK2opIHsKKwkJICAgIHRlbXAgPSB4W2p4XTsKKwkJICAgIGt4ICs9ICppbmN4OworCQkgICAgaXggPSBreDsKKwkJICAgIGwgPSAxIC0gajsKKwkJICAgIGlmIChub3VuaXQpIHsKKwkJCXRlbXAgKj0gYVtqICogYV9kaW0xICsgMV07CisJCSAgICB9CisvKiBDb21wdXRpbmcgTUlOICovCisJCSAgICBpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCSAgICBpX180ID0gbWluKGlfXzEsaV9fMik7CisJCSAgICBmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCXRlbXAgKz0gYVtsICsgaV9fICsgaiAqIGFfZGltMV0gKiB4W2l4XTsKKwkJCWl4ICs9ICppbmN4OworLyogTDE1MDogKi8KKwkJICAgIH0KKwkJICAgIHhbanhdID0gdGVtcDsKKwkJICAgIGp4ICs9ICppbmN4OworLyogTDE2MDogKi8KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIFNUQk1WIC4gKi8KKworfSAvKiBzdGJtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvemhibXYuYyBiL2JsYXMvZjJjL3poYm12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYTEzZAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3poYm12LmMKQEAgLTAsMCArMSw0ODggQEAKKy8qIHpoYm12LmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgemhibXZfKGNoYXIgKnVwbG8sIGludGVnZXIgKm4sIGludGVnZXIgKmssIGRvdWJsZWNvbXBsZXggCisJKmFscGhhLCBkb3VibGVjb21wbGV4ICphLCBpbnRlZ2VyICpsZGEsIGRvdWJsZWNvbXBsZXggKngsIGludGVnZXIgKgorCWluY3gsIGRvdWJsZWNvbXBsZXggKmJldGEsIGRvdWJsZWNvbXBsZXggKnksIGludGVnZXIgKmluY3ksIGZ0bmxlbiAKKwl1cGxvX2xlbikKK3sKKyAgICAvKiBTeXN0ZW0gZ2VuZXJhdGVkIGxvY2FscyAqLworICAgIGludGVnZXIgYV9kaW0xLCBhX29mZnNldCwgaV9fMSwgaV9fMiwgaV9fMywgaV9fNCwgaV9fNTsKKyAgICBkb3VibGVyZWFsIGRfXzE7CisgICAgZG91YmxlY29tcGxleCB6X18xLCB6X18yLCB6X18zLCB6X180OworCisgICAgLyogQnVpbHRpbiBmdW5jdGlvbnMgKi8KKyAgICB2b2lkIGRfY25qZyhkb3VibGVjb21wbGV4ICosIGRvdWJsZWNvbXBsZXggKik7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnRlZ2VyIGlfXywgaiwgbCwgaXgsIGl5LCBqeCwganksIGt4LCBreSwgaW5mbzsKKyAgICBkb3VibGVjb21wbGV4IHRlbXAxLCB0ZW1wMjsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBpbnRlZ2VyIGtwbHVzMTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgWkhCTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yICBvcGVyYXRpb24gKi8KKworLyogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LCAqLworCisvKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCAqLworLyogIEEgaXMgYW4gbiBieSBuIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCwgd2l0aCBrIHN1cGVyLWRpYWdvbmFscy4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PT0gKi8KKworLyogIFVQTE8gICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgYmFuZCBtYXRyaXggQSBpcyBiZWluZyBzdXBwbGllZCBhcyAqLworLyogICAgICAgICAgIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuICovCisKKy8qICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIE4gICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBLICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBLIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN1cGVyLWRpYWdvbmFscyBvZiB0aGUgKi8KKy8qICAgICAgICAgICBtYXRyaXggQS4gSyBtdXN0IHNhdGlzZnkgIDAgLmxlLiBLLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQUxQSEEgIC0gQ09NUExFWCoxNiAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiAoIExEQSwgbiApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkgKi8KKy8qICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyICovCisvKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBjb2x1bW4gYnkgKi8KKy8qICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgKi8KKy8qICAgICAgICAgICAoIGsgKyAxICkgb2YgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3VwZXItZGlhZ29uYWwgc3RhcnRpbmcgYXQgKi8KKy8qICAgICAgICAgICBwb3NpdGlvbiAyIGluIHJvdyBrLCBhbmQgc28gb24uIFRoZSB0b3AgbGVmdCBrIGJ5IGsgdHJpYW5nbGUgKi8KKy8qICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4gKi8KKy8qICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIHRoZSB1cHBlciAqLworLyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiBhIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCAqLworLyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IEsgKyAxIC0gSiAqLworLyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gTUFYKCAxLCBKIC0gSyApLCBKICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApICovCisvKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUgKi8KKy8qICAgICAgICAgICAgICAyMCBDT05USU5VRSAqLworCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBsZWFkaW5nICggayArIDEgKSAqLworLyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgKi8KKy8qICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXgsIHN1cHBsaWVkIGNvbHVtbiBieSAqLworLyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAxIG9mICovCisvKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4gKi8KKy8qICAgICAgICAgICByb3cgMiwgYW5kIHNvIG9uLiBUaGUgYm90dG9tIHJpZ2h0IGsgYnkgayB0cmlhbmdsZSBvZiB0aGUgKi8KKy8qICAgICAgICAgICBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLiAqLworLyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIGxvd2VyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIGEgaGVybWl0aWFuIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsICovCisvKiAgICAgICAgICAgZnVsbCBtYXRyaXggc3RvcmFnZSB0byBiYW5kIHN0b3JhZ2U6ICovCisKKy8qICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4gKi8KKy8qICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IEosIE1JTiggTiwgSiArIEsgKSAqLworLyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKSAqLworLyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFICovCisvKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUgKi8KKworLyogICAgICAgICAgIE5vdGUgdGhhdCB0aGUgaW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBkaWFnb25hbCBlbGVtZW50cyBuZWVkICovCisvKiAgICAgICAgICAgbm90IGJlIHNldCBhbmQgYXJlIGFzc3VtZWQgdG8gYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIExEQSAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkICovCisvKiAgICAgICAgICAgaW4gdGhlIGNhbGxpbmcgKHN1YikgcHJvZ3JhbS4gTERBIG11c3QgYmUgYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIGsgKyAxICkuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBYICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSAqLworLyogICAgICAgICAgIHZlY3RvciB4LiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgSU5DWCAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQkVUQSAgIC0gQ09NUExFWCoxNiAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQkVUQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBiZXRhLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWSAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgKi8KKy8qICAgICAgICAgICB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZCB2ZWN0b3IgeS4gKi8KKworLyogIElOQ1kgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZiAqLworLyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEZ1cnRoZXIgRGV0YWlscyAqLworLyogID09PT09PT09PT09PT09PSAqLworCisvKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuICovCisKKy8qICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4gKi8KKy8qICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4gKi8KKy8qICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLiAqLworLyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4gKi8KKworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAgICAgLi4gUGFyYW1ldGVycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisKKy8qICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLiAqLworCisgICAgLyogUGFyYW1ldGVyIGFkanVzdG1lbnRzICovCisgICAgYV9kaW0xID0gKmxkYTsKKyAgICBhX29mZnNldCA9IDEgKyBhX2RpbTE7CisgICAgYSAtPSBhX29mZnNldDsKKyAgICAtLXg7CisgICAgLS15OworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGluZm8gPSAwOworICAgIGlmICghIGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh1cGxvLCAiTCIsICgKKwkgICAgZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMTsKKyAgICB9IGVsc2UgaWYgKCpuIDwgMCkgeworCWluZm8gPSAyOworICAgIH0gZWxzZSBpZiAoKmsgPCAwKSB7CisJaW5mbyA9IDM7CisgICAgfSBlbHNlIGlmICgqbGRhIDwgKmsgKyAxKSB7CisJaW5mbyA9IDY7CisgICAgfSBlbHNlIGlmICgqaW5jeCA9PSAwKSB7CisJaW5mbyA9IDg7CisgICAgfSBlbHNlIGlmICgqaW5jeSA9PSAwKSB7CisJaW5mbyA9IDExOworICAgIH0KKyAgICBpZiAoaW5mbyAhPSAwKSB7CisJeGVyYmxhXygiWkhCTVYgIiwgJmluZm8sIChmdG5sZW4pNik7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLiAqLworCisgICAgaWYgKCpuID09IDAgfHwgKGFscGhhLT5yID09IDAuICYmIGFscGhhLT5pID09IDAuICYmIChiZXRhLT5yID09IDEuICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YS0+aSA9PSAwLikpKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisvKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gIFggIGFuZCAgWS4gKi8KKworICAgIGlmICgqaW5jeCA+IDApIHsKKwlreCA9IDE7CisgICAgfSBlbHNlIHsKKwlreCA9IDEgLSAoKm4gLSAxKSAqICppbmN4OworICAgIH0KKyAgICBpZiAoKmluY3kgPiAwKSB7CisJa3kgPSAxOworICAgIH0gZWxzZSB7CisJa3kgPSAxIC0gKCpuIC0gMSkgKiAqaW5jeTsKKyAgICB9CisKKy8qICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQSAqLworLyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuICovCisKKy8qICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4gKi8KKworICAgIGlmIChiZXRhLT5yICE9IDEuIHx8IGJldGEtPmkgIT0gMC4pIHsKKwlpZiAoKmluY3kgPT0gMSkgeworCSAgICBpZiAoYmV0YS0+ciA9PSAwLiAmJiBiZXRhLT5pID09IDAuKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIGlfXzIgPSBpX187CisJCSAgICB5W2lfXzJdLnIgPSAwLiwgeVtpX18yXS5pID0gMC47CisvKiBMMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzMgPSBpX187CisJCSAgICB6X18xLnIgPSBiZXRhLT5yICogeVtpX18zXS5yIC0gYmV0YS0+aSAqIHlbaV9fM10uaSwgCisJCQkgICAgel9fMS5pID0gYmV0YS0+ciAqIHlbaV9fM10uaSArIGJldGEtPmkgKiB5W2lfXzNdCisJCQkgICAgLnI7CisJCSAgICB5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKy8qIEwyMDogKi8KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXkgPSBreTsKKwkgICAgaWYgKGJldGEtPnIgPT0gMC4gJiYgYmV0YS0+aSA9PSAwLikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaXk7CisJCSAgICB5W2lfXzJdLnIgPSAwLiwgeVtpX18yXS5pID0gMC47CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEwzMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaXk7CisJCSAgICBpX18zID0gaXk7CisJCSAgICB6X18xLnIgPSBiZXRhLT5yICogeVtpX18zXS5yIC0gYmV0YS0+aSAqIHlbaV9fM10uaSwgCisJCQkgICAgel9fMS5pID0gYmV0YS0+ciAqIHlbaV9fM10uaSArIGJldGEtPmkgKiB5W2lfXzNdCisJCQkgICAgLnI7CisJCSAgICB5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKwkJICAgIGl5ICs9ICppbmN5OworLyogTDQwOiAqLworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChhbHBoYS0+ciA9PSAwLiAmJiBhbHBoYS0+aSA9PSAwLikgeworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobHNhbWVfKHVwbG8sICJVIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisKKy8qICAgICAgICBGb3JtICB5ICB3aGVuIHVwcGVyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLiAqLworCisJa3BsdXMxID0gKmsgKyAxOworCWlmICgqaW5jeCA9PSAxICYmICppbmN5ID09IDEpIHsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18yID0gajsKKwkJel9fMS5yID0gYWxwaGEtPnIgKiB4W2lfXzJdLnIgLSBhbHBoYS0+aSAqIHhbaV9fMl0uaSwgel9fMS5pID0KKwkJCSBhbHBoYS0+ciAqIHhbaV9fMl0uaSArIGFscGhhLT5pICogeFtpX18yXS5yOworCQl0ZW1wMS5yID0gel9fMS5yLCB0ZW1wMS5pID0gel9fMS5pOworCQl0ZW1wMi5yID0gMC4sIHRlbXAyLmkgPSAwLjsKKwkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCWlfXzIgPSAxLCBpX18zID0gaiAtICprOworCQlpX180ID0gaiAtIDE7CisJCWZvciAoaV9fID0gbWF4KGlfXzIsaV9fMyk7IGlfXyA8PSBpX180OyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzMgPSBpX187CisJCSAgICBpX181ID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCSAgICB6X18yLnIgPSB0ZW1wMS5yICogYVtpX181XS5yIC0gdGVtcDEuaSAqIGFbaV9fNV0uaSwgCisJCQkgICAgel9fMi5pID0gdGVtcDEuciAqIGFbaV9fNV0uaSArIHRlbXAxLmkgKiBhW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICB6X18xLnIgPSB5W2lfXzNdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fM10uaSArIHpfXzIuaTsKKwkJICAgIHlbaV9fMl0uciA9IHpfXzEuciwgeVtpX18yXS5pID0gel9fMS5pOworCQkgICAgZF9jbmpnKCZ6X18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIHpfXzIuciA9IHpfXzMuciAqIHhbaV9fMl0uciAtIHpfXzMuaSAqIHhbaV9fMl0uaSwgel9fMi5pID0KKwkJCSAgICAgel9fMy5yICogeFtpX18yXS5pICsgel9fMy5pICogeFtpX18yXS5yOworCQkgICAgel9fMS5yID0gdGVtcDIuciArIHpfXzIuciwgel9fMS5pID0gdGVtcDIuaSArIHpfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSB6X18xLnIsIHRlbXAyLmkgPSB6X18xLmk7CisvKiBMNTA6ICovCisJCX0KKwkJaV9fNCA9IGo7CisJCWlfXzIgPSBqOworCQlpX18zID0ga3BsdXMxICsgaiAqIGFfZGltMTsKKwkJZF9fMSA9IGFbaV9fM10ucjsKKwkJel9fMy5yID0gZF9fMSAqIHRlbXAxLnIsIHpfXzMuaSA9IGRfXzEgKiB0ZW1wMS5pOworCQl6X18yLnIgPSB5W2lfXzJdLnIgKyB6X18zLnIsIHpfXzIuaSA9IHlbaV9fMl0uaSArIHpfXzMuaTsKKwkJel9fNC5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCB6X180LmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJel9fMS5yID0gel9fMi5yICsgel9fNC5yLCB6X18xLmkgPSB6X18yLmkgKyB6X180Lmk7CisJCXlbaV9fNF0uciA9IHpfXzEuciwgeVtpX180XS5pID0gel9fMS5pOworLyogTDYwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX180ID0gang7CisJCXpfXzEuciA9IGFscGhhLT5yICogeFtpX180XS5yIC0gYWxwaGEtPmkgKiB4W2lfXzRdLmksIHpfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzRdLmkgKyBhbHBoYS0+aSAqIHhbaV9fNF0ucjsKKwkJdGVtcDEuciA9IHpfXzEuciwgdGVtcDEuaSA9IHpfXzEuaTsKKwkJdGVtcDIuciA9IDAuLCB0ZW1wMi5pID0gMC47CisJCWl4ID0ga3g7CisJCWl5ID0ga3k7CisJCWwgPSBrcGx1czEgLSBqOworLyogQ29tcHV0aW5nIE1BWCAqLworCQlpX180ID0gMSwgaV9fMiA9IGogLSAqazsKKwkJaV9fMyA9IGogLSAxOworCQlmb3IgKGlfXyA9IG1heChpX180LGlfXzIpOyBpX18gPD0gaV9fMzsgKytpX18pIHsKKwkJICAgIGlfXzQgPSBpeTsKKwkJICAgIGlfXzIgPSBpeTsKKwkJICAgIGlfXzUgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhW2lfXzVdLnIgLSB0ZW1wMS5pICogYVtpX181XS5pLCAKKwkJCSAgICB6X18yLmkgPSB0ZW1wMS5yICogYVtpX181XS5pICsgdGVtcDEuaSAqIGFbaV9fNV0KKwkJCSAgICAucjsKKwkJICAgIHpfXzEuciA9IHlbaV9fMl0uciArIHpfXzIuciwgel9fMS5pID0geVtpX18yXS5pICsgel9fMi5pOworCQkgICAgeVtpX180XS5yID0gel9fMS5yLCB5W2lfXzRdLmkgPSB6X18xLmk7CisJCSAgICBkX2NuamcoJnpfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCSAgICBpX180ID0gaXg7CisJCSAgICB6X18yLnIgPSB6X18zLnIgKiB4W2lfXzRdLnIgLSB6X18zLmkgKiB4W2lfXzRdLmksIHpfXzIuaSA9CisJCQkgICAgIHpfXzMuciAqIHhbaV9fNF0uaSArIHpfXzMuaSAqIHhbaV9fNF0ucjsKKwkJICAgIHpfXzEuciA9IHRlbXAyLnIgKyB6X18yLnIsIHpfXzEuaSA9IHRlbXAyLmkgKyB6X18yLmk7CisJCSAgICB0ZW1wMi5yID0gel9fMS5yLCB0ZW1wMi5pID0gel9fMS5pOworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEw3MDogKi8KKwkJfQorCQlpX18zID0gank7CisJCWlfXzQgPSBqeTsKKwkJaV9fMiA9IGtwbHVzMSArIGogKiBhX2RpbTE7CisJCWRfXzEgPSBhW2lfXzJdLnI7CisJCXpfXzMuciA9IGRfXzEgKiB0ZW1wMS5yLCB6X18zLmkgPSBkX18xICogdGVtcDEuaTsKKwkJel9fMi5yID0geVtpX180XS5yICsgel9fMy5yLCB6X18yLmkgPSB5W2lfXzRdLmkgKyB6X18zLmk7CisJCXpfXzQuciA9IGFscGhhLT5yICogdGVtcDIuciAtIGFscGhhLT5pICogdGVtcDIuaSwgel9fNC5pID0gCisJCQlhbHBoYS0+ciAqIHRlbXAyLmkgKyBhbHBoYS0+aSAqIHRlbXAyLnI7CisJCXpfXzEuciA9IHpfXzIuciArIHpfXzQuciwgel9fMS5pID0gel9fMi5pICsgel9fNC5pOworCQl5W2lfXzNdLnIgPSB6X18xLnIsIHlbaV9fM10uaSA9IHpfXzEuaTsKKwkJanggKz0gKmluY3g7CisJCWp5ICs9ICppbmN5OworCQlpZiAoaiA+ICprKSB7CisJCSAgICBreCArPSAqaW5jeDsKKwkJICAgIGt5ICs9ICppbmN5OworCQl9CisvKiBMODA6ICovCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gbG93ZXIgdHJpYW5nbGUgb2YgQSBpcyBzdG9yZWQuICovCisKKwlpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKSB7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJaV9fMyA9IGo7CisJCXpfXzEuciA9IGFscGhhLT5yICogeFtpX18zXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzNdLmksIHpfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzNdLmkgKyBhbHBoYS0+aSAqIHhbaV9fM10ucjsKKwkJdGVtcDEuciA9IHpfXzEuciwgdGVtcDEuaSA9IHpfXzEuaTsKKwkJdGVtcDIuciA9IDAuLCB0ZW1wMi5pID0gMC47CisJCWlfXzMgPSBqOworCQlpX180ID0gajsKKwkJaV9fMiA9IGogKiBhX2RpbTEgKyAxOworCQlkX18xID0gYVtpX18yXS5yOworCQl6X18yLnIgPSBkX18xICogdGVtcDEuciwgel9fMi5pID0gZF9fMSAqIHRlbXAxLmk7CisJCXpfXzEuciA9IHlbaV9fNF0uciArIHpfXzIuciwgel9fMS5pID0geVtpX180XS5pICsgel9fMi5pOworCQl5W2lfXzNdLnIgPSB6X18xLnIsIHlbaV9fM10uaSA9IHpfXzEuaTsKKwkJbCA9IDEgLSBqOworLyogQ29tcHV0aW5nIE1JTiAqLworCQlpX180ID0gKm4sIGlfXzIgPSBqICsgKms7CisJCWlfXzMgPSBtaW4oaV9fNCxpX18yKTsKKwkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzM7ICsraV9fKSB7CisJCSAgICBpX180ID0gaV9fOworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzUgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhW2lfXzVdLnIgLSB0ZW1wMS5pICogYVtpX181XS5pLCAKKwkJCSAgICB6X18yLmkgPSB0ZW1wMS5yICogYVtpX181XS5pICsgdGVtcDEuaSAqIGFbaV9fNV0KKwkJCSAgICAucjsKKwkJICAgIHpfXzEuciA9IHlbaV9fMl0uciArIHpfXzIuciwgel9fMS5pID0geVtpX18yXS5pICsgel9fMi5pOworCQkgICAgeVtpX180XS5yID0gel9fMS5yLCB5W2lfXzRdLmkgPSB6X18xLmk7CisJCSAgICBkX2NuamcoJnpfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCSAgICBpX180ID0gaV9fOworCQkgICAgel9fMi5yID0gel9fMy5yICogeFtpX180XS5yIC0gel9fMy5pICogeFtpX180XS5pLCB6X18yLmkgPQorCQkJICAgICB6X18zLnIgKiB4W2lfXzRdLmkgKyB6X18zLmkgKiB4W2lfXzRdLnI7CisJCSAgICB6X18xLnIgPSB0ZW1wMi5yICsgel9fMi5yLCB6X18xLmkgPSB0ZW1wMi5pICsgel9fMi5pOworCQkgICAgdGVtcDIuciA9IHpfXzEuciwgdGVtcDIuaSA9IHpfXzEuaTsKKy8qIEw5MDogKi8KKwkJfQorCQlpX18zID0gajsKKwkJaV9fNCA9IGo7CisJCXpfXzIuciA9IGFscGhhLT5yICogdGVtcDIuciAtIGFscGhhLT5pICogdGVtcDIuaSwgel9fMi5pID0gCisJCQlhbHBoYS0+ciAqIHRlbXAyLmkgKyBhbHBoYS0+aSAqIHRlbXAyLnI7CisJCXpfXzEuciA9IHlbaV9fNF0uciArIHpfXzIuciwgel9fMS5pID0geVtpX180XS5pICsgel9fMi5pOworCQl5W2lfXzNdLnIgPSB6X18xLnIsIHlbaV9fM10uaSA9IHpfXzEuaTsKKy8qIEwxMDA6ICovCisJICAgIH0KKwl9IGVsc2UgeworCSAgICBqeCA9IGt4OworCSAgICBqeSA9IGt5OworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCWlfXzMgPSBqeDsKKwkJel9fMS5yID0gYWxwaGEtPnIgKiB4W2lfXzNdLnIgLSBhbHBoYS0+aSAqIHhbaV9fM10uaSwgel9fMS5pID0KKwkJCSBhbHBoYS0+ciAqIHhbaV9fM10uaSArIGFscGhhLT5pICogeFtpX18zXS5yOworCQl0ZW1wMS5yID0gel9fMS5yLCB0ZW1wMS5pID0gel9fMS5pOworCQl0ZW1wMi5yID0gMC4sIHRlbXAyLmkgPSAwLjsKKwkJaV9fMyA9IGp5OworCQlpX180ID0gank7CisJCWlfXzIgPSBqICogYV9kaW0xICsgMTsKKwkJZF9fMSA9IGFbaV9fMl0ucjsKKwkJel9fMi5yID0gZF9fMSAqIHRlbXAxLnIsIHpfXzIuaSA9IGRfXzEgKiB0ZW1wMS5pOworCQl6X18xLnIgPSB5W2lfXzRdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fNF0uaSArIHpfXzIuaTsKKwkJeVtpX18zXS5yID0gel9fMS5yLCB5W2lfXzNdLmkgPSB6X18xLmk7CisJCWwgPSAxIC0gajsKKwkJaXggPSBqeDsKKwkJaXkgPSBqeTsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJaV9fNCA9ICpuLCBpX18yID0gaiArICprOworCQlpX18zID0gbWluKGlfXzQsaV9fMik7CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkgICAgaXggKz0gKmluY3g7CisJCSAgICBpeSArPSAqaW5jeTsKKwkJICAgIGlfXzQgPSBpeTsKKwkJICAgIGlfXzIgPSBpeTsKKwkJICAgIGlfXzUgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhW2lfXzVdLnIgLSB0ZW1wMS5pICogYVtpX181XS5pLCAKKwkJCSAgICB6X18yLmkgPSB0ZW1wMS5yICogYVtpX181XS5pICsgdGVtcDEuaSAqIGFbaV9fNV0KKwkJCSAgICAucjsKKwkJICAgIHpfXzEuciA9IHlbaV9fMl0uciArIHpfXzIuciwgel9fMS5pID0geVtpX18yXS5pICsgel9fMi5pOworCQkgICAgeVtpX180XS5yID0gel9fMS5yLCB5W2lfXzRdLmkgPSB6X18xLmk7CisJCSAgICBkX2NuamcoJnpfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCSAgICBpX180ID0gaXg7CisJCSAgICB6X18yLnIgPSB6X18zLnIgKiB4W2lfXzRdLnIgLSB6X18zLmkgKiB4W2lfXzRdLmksIHpfXzIuaSA9CisJCQkgICAgIHpfXzMuciAqIHhbaV9fNF0uaSArIHpfXzMuaSAqIHhbaV9fNF0ucjsKKwkJICAgIHpfXzEuciA9IHRlbXAyLnIgKyB6X18yLnIsIHpfXzEuaSA9IHRlbXAyLmkgKyB6X18yLmk7CisJCSAgICB0ZW1wMi5yID0gel9fMS5yLCB0ZW1wMi5pID0gel9fMS5pOworLyogTDExMDogKi8KKwkJfQorCQlpX18zID0gank7CisJCWlfXzQgPSBqeTsKKwkJel9fMi5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCB6X18yLmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJel9fMS5yID0geVtpX180XS5yICsgel9fMi5yLCB6X18xLmkgPSB5W2lfXzRdLmkgKyB6X18yLmk7CisJCXlbaV9fM10uciA9IHpfXzEuciwgeVtpX18zXS5pID0gel9fMS5pOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisvKiBMMTIwOiAqLworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworCisvKiAgICAgRW5kIG9mIFpIQk1WIC4gKi8KKworfSAvKiB6aGJtdl8gKi8KKwpkaWZmIC0tZ2l0IGEvYmxhcy9mMmMvemhwbXYuYyBiL2JsYXMvZjJjL3pocG12LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlMmY0MgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZjJjL3pocG12LmMKQEAgLTAsMCArMSw0MzggQEAKKy8qIHpocG12LmYgLS0gdHJhbnNsYXRlZCBieSBmMmMgKHZlcnNpb24gMjAxMDA4MjcpLgorICAgWW91IG11c3QgbGluayB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlIHdpdGggbGliZjJjOgorCW9uIE1pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSwgbGluayB3aXRoIGxpYmYyYy5saWI7CisJb24gTGludXggb3IgVW5peCBzeXN0ZW1zLCBsaW5rIHdpdGggLi4uL3BhdGgvdG8vbGliZjJjLmEgLWxtCisJb3IsIGlmIHlvdSBpbnN0YWxsIGxpYmYyYy5hIGluIGEgc3RhbmRhcmQgcGxhY2UsIHdpdGggLWxmMmMgLWxtCisJLS0gaW4gdGhhdCBvcmRlciwgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLCBhcyBpbgorCQljYyAqLm8gLWxmMmMgLWxtCisJU291cmNlIGZvciBsaWJmMmMgaXMgaW4gL25ldGxpYi9mMmMvbGliZjJjLnppcCwgZS5nLiwKKworCQlodHRwOi8vd3d3Lm5ldGxpYi5vcmcvZjJjL2xpYmYyYy56aXAKKyovCisKKyNpbmNsdWRlICJkYXRhdHlwZXMuaCIKKworLyogU3Vicm91dGluZSAqLyBpbnQgemhwbXZfKGNoYXIgKnVwbG8sIGludGVnZXIgKm4sIGRvdWJsZWNvbXBsZXggKmFscGhhLCAKKwlkb3VibGVjb21wbGV4ICphcCwgZG91YmxlY29tcGxleCAqeCwgaW50ZWdlciAqaW5jeCwgZG91YmxlY29tcGxleCAqCisJYmV0YSwgZG91YmxlY29tcGxleCAqeSwgaW50ZWdlciAqaW5jeSwgZnRubGVuIHVwbG9fbGVuKQoreworICAgIC8qIFN5c3RlbSBnZW5lcmF0ZWQgbG9jYWxzICovCisgICAgaW50ZWdlciBpX18xLCBpX18yLCBpX18zLCBpX180LCBpX181OworICAgIGRvdWJsZXJlYWwgZF9fMTsKKyAgICBkb3VibGVjb21wbGV4IHpfXzEsIHpfXzIsIHpfXzMsIHpfXzQ7CisKKyAgICAvKiBCdWlsdGluIGZ1bmN0aW9ucyAqLworICAgIHZvaWQgZF9jbmpnKGRvdWJsZWNvbXBsZXggKiwgZG91YmxlY29tcGxleCAqKTsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGludGVnZXIgaV9fLCBqLCBrLCBraywgaXgsIGl5LCBqeCwganksIGt4LCBreSwgaW5mbzsKKyAgICBkb3VibGVjb21wbGV4IHRlbXAxLCB0ZW1wMjsKKyAgICBleHRlcm4gbG9naWNhbCBsc2FtZV8oY2hhciAqLCBjaGFyICosIGZ0bmxlbiwgZnRubGVuKTsKKyAgICBleHRlcm4gLyogU3Vicm91dGluZSAqLyBpbnQgeGVyYmxhXyhjaGFyICosIGludGVnZXIgKiwgZnRubGVuKTsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgWkhQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbiAqLworCisvKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICovCisKKy8qICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kICovCisvKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uICovCisKKy8qICBBcmd1bWVudHMgKi8KKy8qICA9PT09PT09PT09ICovCisKKy8qICBVUExPICAgLSBDSEFSQUNURVIqMS4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQgKi8KKy8qICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLiAqLworCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBOICAgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgQUxQSEEgIC0gQ09NUExFWCoxNiAgICAgIC4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBBUCAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdCAqLworLyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QgKi8KKy8qICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXggKi8KKy8qICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgKi8KKy8qICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkgKi8KKy8qICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiAqLworLyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdCAqLworLyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgaGVybWl0aWFuIG1hdHJpeCAqLworLyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSAqLworLyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKSAqLworLyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uICovCisvKiAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBpbWFnaW5hcnkgcGFydHMgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG5lZWQgKi8KKy8qICAgICAgICAgICBub3QgYmUgc2V0IGFuZCBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbiAqLworLyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBJTkNYICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBCRVRBICAgLSBDT01QTEVYKjE2ICAgICAgLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBCRVRBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGJldGEuIFdoZW4gQkVUQSBpcyAqLworLyogICAgICAgICAgIHN1cHBsaWVkIGFzIHplcm8gdGhlbiBZIG5lZWQgbm90IGJlIHNldCBvbiBpbnB1dC4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFkgICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlIG4gKi8KKy8qICAgICAgICAgICBlbGVtZW50IHZlY3RvciB5LiBPbiBleGl0LCBZIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cGRhdGVkICovCisvKiAgICAgICAgICAgdmVjdG9yIHkuICovCisKKy8qICBJTkNZICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YgKi8KKy8qICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBGdXJ0aGVyIERldGFpbHMgKi8KKy8qICA9PT09PT09PT09PT09PT0gKi8KKworLyogIExldmVsIDIgQmxhcyByb3V0aW5lLiAqLworCisvKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuICovCisvKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuICovCisvKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4gKi8KKy8qICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuICovCisKKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogICAgIC4uIFBhcmFtZXRlcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLiAqLworLyogICAgIC4uICovCisvKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworCisvKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFBhcmFtZXRlciBhZGp1c3RtZW50cyAqLworICAgIC0teTsKKyAgICAtLXg7CisgICAgLS1hcDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICgqbiA8IDApIHsKKwlpbmZvID0gMjsKKyAgICB9IGVsc2UgaWYgKCppbmN4ID09IDApIHsKKwlpbmZvID0gNjsKKyAgICB9IGVsc2UgaWYgKCppbmN5ID09IDApIHsKKwlpbmZvID0gOTsKKyAgICB9CisgICAgaWYgKGluZm8gIT0gMCkgeworCXhlcmJsYV8oIlpIUE1WICIsICZpbmZvLCAoZnRubGVuKTYpOworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4gKi8KKworICAgIGlmICgqbiA9PSAwIHx8IChhbHBoYS0+ciA9PSAwLiAmJiBhbHBoYS0+aSA9PSAwLiAmJiAoYmV0YS0+ciA9PSAxLiAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldGEtPmkgPT0gMC4pKSkgeworCXJldHVybiAwOworICAgIH0KKworLyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuICovCisKKyAgICBpZiAoKmluY3ggPiAwKSB7CisJa3ggPSAxOworICAgIH0gZWxzZSB7CisJa3ggPSAxIC0gKCpuIC0gMSkgKiAqaW5jeDsKKyAgICB9CisgICAgaWYgKCppbmN5ID4gMCkgeworCWt5ID0gMTsKKyAgICB9IGVsc2UgeworCWt5ID0gMSAtICgqbiAtIDEpICogKmluY3k7CisgICAgfQorCisvKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQICovCisvKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuICovCisKKy8qICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4gKi8KKworICAgIGlmIChiZXRhLT5yICE9IDEuIHx8IGJldGEtPmkgIT0gMC4pIHsKKwlpZiAoKmluY3kgPT0gMSkgeworCSAgICBpZiAoYmV0YS0+ciA9PSAwLiAmJiBiZXRhLT5pID09IDAuKSB7CisJCWlfXzEgPSAqbjsKKwkJZm9yIChpX18gPSAxOyBpX18gPD0gaV9fMTsgKytpX18pIHsKKwkJICAgIGlfXzIgPSBpX187CisJCSAgICB5W2lfXzJdLnIgPSAwLiwgeVtpX18yXS5pID0gMC47CisvKiBMMTA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaV9fMSA9ICpuOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18xOyArK2lfXykgeworCQkgICAgaV9fMiA9IGlfXzsKKwkJICAgIGlfXzMgPSBpX187CisJCSAgICB6X18xLnIgPSBiZXRhLT5yICogeVtpX18zXS5yIC0gYmV0YS0+aSAqIHlbaV9fM10uaSwgCisJCQkgICAgel9fMS5pID0gYmV0YS0+ciAqIHlbaV9fM10uaSArIGJldGEtPmkgKiB5W2lfXzNdCisJCQkgICAgLnI7CisJCSAgICB5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKy8qIEwyMDogKi8KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXkgPSBreTsKKwkgICAgaWYgKGJldGEtPnIgPT0gMC4gJiYgYmV0YS0+aSA9PSAwLikgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaXk7CisJCSAgICB5W2lfXzJdLnIgPSAwLiwgeVtpX18yXS5pID0gMC47CisJCSAgICBpeSArPSAqaW5jeTsKKy8qIEwzMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlpX18xID0gKm47CisJCWZvciAoaV9fID0gMTsgaV9fIDw9IGlfXzE7ICsraV9fKSB7CisJCSAgICBpX18yID0gaXk7CisJCSAgICBpX18zID0gaXk7CisJCSAgICB6X18xLnIgPSBiZXRhLT5yICogeVtpX18zXS5yIC0gYmV0YS0+aSAqIHlbaV9fM10uaSwgCisJCQkgICAgel9fMS5pID0gYmV0YS0+ciAqIHlbaV9fM10uaSArIGJldGEtPmkgKiB5W2lfXzNdCisJCQkgICAgLnI7CisJCSAgICB5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKwkJICAgIGl5ICs9ICppbmN5OworLyogTDQwOiAqLworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChhbHBoYS0+ciA9PSAwLiAmJiBhbHBoYS0+aSA9PSAwLikgeworCXJldHVybiAwOworICAgIH0KKyAgICBrayA9IDE7CisgICAgaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCisvKiAgICAgICAgRm9ybSAgeSAgd2hlbiBBUCBjb250YWlucyB0aGUgdXBwZXIgdHJpYW5nbGUuICovCisKKwlpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKSB7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJaV9fMiA9IGo7CisJCXpfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHpfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHpfXzEuciwgdGVtcDEuaSA9IHpfXzEuaTsKKwkJdGVtcDIuciA9IDAuLCB0ZW1wMi5pID0gMC47CisJCWsgPSBrazsKKwkJaV9fMiA9IGogLSAxOworCQlmb3IgKGlfXyA9IDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIGlfXzQgPSBpX187CisJCSAgICBpX181ID0gazsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhcFtpX181XS5yIC0gdGVtcDEuaSAqIGFwW2lfXzVdLmksIAorCQkJICAgIHpfXzIuaSA9IHRlbXAxLnIgKiBhcFtpX181XS5pICsgdGVtcDEuaSAqIGFwW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICB6X18xLnIgPSB5W2lfXzRdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fNF0uaSArIHpfXzIuaTsKKwkJICAgIHlbaV9fM10uciA9IHpfXzEuciwgeVtpX18zXS5pID0gel9fMS5pOworCQkgICAgZF9jbmpnKCZ6X18zLCAmYXBba10pOworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIHpfXzIuciA9IHpfXzMuciAqIHhbaV9fM10uciAtIHpfXzMuaSAqIHhbaV9fM10uaSwgel9fMi5pID0KKwkJCSAgICAgel9fMy5yICogeFtpX18zXS5pICsgel9fMy5pICogeFtpX18zXS5yOworCQkgICAgel9fMS5yID0gdGVtcDIuciArIHpfXzIuciwgel9fMS5pID0gdGVtcDIuaSArIHpfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSB6X18xLnIsIHRlbXAyLmkgPSB6X18xLmk7CisJCSAgICArK2s7CisvKiBMNTA6ICovCisJCX0KKwkJaV9fMiA9IGo7CisJCWlfXzMgPSBqOworCQlpX180ID0ga2sgKyBqIC0gMTsKKwkJZF9fMSA9IGFwW2lfXzRdLnI7CisJCXpfXzMuciA9IGRfXzEgKiB0ZW1wMS5yLCB6X18zLmkgPSBkX18xICogdGVtcDEuaTsKKwkJel9fMi5yID0geVtpX18zXS5yICsgel9fMy5yLCB6X18yLmkgPSB5W2lfXzNdLmkgKyB6X18zLmk7CisJCXpfXzQuciA9IGFscGhhLT5yICogdGVtcDIuciAtIGFscGhhLT5pICogdGVtcDIuaSwgel9fNC5pID0gCisJCQlhbHBoYS0+ciAqIHRlbXAyLmkgKyBhbHBoYS0+aSAqIHRlbXAyLnI7CisJCXpfXzEuciA9IHpfXzIuciArIHpfXzQuciwgel9fMS5pID0gel9fMi5pICsgel9fNC5pOworCQl5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKwkJa2sgKz0gajsKKy8qIEw2MDogKi8KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGp4ID0ga3g7CisJICAgIGp5ID0ga3k7CisJICAgIGlfXzEgPSAqbjsKKwkgICAgZm9yIChqID0gMTsgaiA8PSBpX18xOyArK2opIHsKKwkJaV9fMiA9IGp4OworCQl6X18xLnIgPSBhbHBoYS0+ciAqIHhbaV9fMl0uciAtIGFscGhhLT5pICogeFtpX18yXS5pLCB6X18xLmkgPQorCQkJIGFscGhhLT5yICogeFtpX18yXS5pICsgYWxwaGEtPmkgKiB4W2lfXzJdLnI7CisJCXRlbXAxLnIgPSB6X18xLnIsIHRlbXAxLmkgPSB6X18xLmk7CisJCXRlbXAyLnIgPSAwLiwgdGVtcDIuaSA9IDAuOworCQlpeCA9IGt4OworCQlpeSA9IGt5OworCQlpX18yID0ga2sgKyBqIC0gMjsKKwkJZm9yIChrID0ga2s7IGsgPD0gaV9fMjsgKytrKSB7CisJCSAgICBpX18zID0gaXk7CisJCSAgICBpX180ID0gaXk7CisJCSAgICBpX181ID0gazsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhcFtpX181XS5yIC0gdGVtcDEuaSAqIGFwW2lfXzVdLmksIAorCQkJICAgIHpfXzIuaSA9IHRlbXAxLnIgKiBhcFtpX181XS5pICsgdGVtcDEuaSAqIGFwW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICB6X18xLnIgPSB5W2lfXzRdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fNF0uaSArIHpfXzIuaTsKKwkJICAgIHlbaV9fM10uciA9IHpfXzEuciwgeVtpX18zXS5pID0gel9fMS5pOworCQkgICAgZF9jbmpnKCZ6X18zLCAmYXBba10pOworCQkgICAgaV9fMyA9IGl4OworCQkgICAgel9fMi5yID0gel9fMy5yICogeFtpX18zXS5yIC0gel9fMy5pICogeFtpX18zXS5pLCB6X18yLmkgPQorCQkJICAgICB6X18zLnIgKiB4W2lfXzNdLmkgKyB6X18zLmkgKiB4W2lfXzNdLnI7CisJCSAgICB6X18xLnIgPSB0ZW1wMi5yICsgel9fMi5yLCB6X18xLmkgPSB0ZW1wMi5pICsgel9fMi5pOworCQkgICAgdGVtcDIuciA9IHpfXzEuciwgdGVtcDIuaSA9IHpfXzEuaTsKKwkJICAgIGl4ICs9ICppbmN4OworCQkgICAgaXkgKz0gKmluY3k7CisvKiBMNzA6ICovCisJCX0KKwkJaV9fMiA9IGp5OworCQlpX18zID0gank7CisJCWlfXzQgPSBrayArIGogLSAxOworCQlkX18xID0gYXBbaV9fNF0ucjsKKwkJel9fMy5yID0gZF9fMSAqIHRlbXAxLnIsIHpfXzMuaSA9IGRfXzEgKiB0ZW1wMS5pOworCQl6X18yLnIgPSB5W2lfXzNdLnIgKyB6X18zLnIsIHpfXzIuaSA9IHlbaV9fM10uaSArIHpfXzMuaTsKKwkJel9fNC5yID0gYWxwaGEtPnIgKiB0ZW1wMi5yIC0gYWxwaGEtPmkgKiB0ZW1wMi5pLCB6X180LmkgPSAKKwkJCWFscGhhLT5yICogdGVtcDIuaSArIGFscGhhLT5pICogdGVtcDIucjsKKwkJel9fMS5yID0gel9fMi5yICsgel9fNC5yLCB6X18xLmkgPSB6X18yLmkgKyB6X180Lmk7CisJCXlbaV9fMl0uciA9IHpfXzEuciwgeVtpX18yXS5pID0gel9fMS5pOworCQlqeCArPSAqaW5jeDsKKwkJankgKz0gKmluY3k7CisJCWtrICs9IGo7CisvKiBMODA6ICovCisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKworLyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIGxvd2VyIHRyaWFuZ2xlLiAqLworCisJaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkgeworCSAgICBpX18xID0gKm47CisJICAgIGZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCWlfXzIgPSBqOworCQl6X18xLnIgPSBhbHBoYS0+ciAqIHhbaV9fMl0uciAtIGFscGhhLT5pICogeFtpX18yXS5pLCB6X18xLmkgPQorCQkJIGFscGhhLT5yICogeFtpX18yXS5pICsgYWxwaGEtPmkgKiB4W2lfXzJdLnI7CisJCXRlbXAxLnIgPSB6X18xLnIsIHRlbXAxLmkgPSB6X18xLmk7CisJCXRlbXAyLnIgPSAwLiwgdGVtcDIuaSA9IDAuOworCQlpX18yID0gajsKKwkJaV9fMyA9IGo7CisJCWlfXzQgPSBrazsKKwkJZF9fMSA9IGFwW2lfXzRdLnI7CisJCXpfXzIuciA9IGRfXzEgKiB0ZW1wMS5yLCB6X18yLmkgPSBkX18xICogdGVtcDEuaTsKKwkJel9fMS5yID0geVtpX18zXS5yICsgel9fMi5yLCB6X18xLmkgPSB5W2lfXzNdLmkgKyB6X18yLmk7CisJCXlbaV9fMl0uciA9IHpfXzEuciwgeVtpX18yXS5pID0gel9fMS5pOworCQlrID0ga2sgKyAxOworCQlpX18yID0gKm47CisJCWZvciAoaV9fID0gaiArIDE7IGlfXyA8PSBpX18yOyArK2lfXykgeworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIGlfXzQgPSBpX187CisJCSAgICBpX181ID0gazsKKwkJICAgIHpfXzIuciA9IHRlbXAxLnIgKiBhcFtpX181XS5yIC0gdGVtcDEuaSAqIGFwW2lfXzVdLmksIAorCQkJICAgIHpfXzIuaSA9IHRlbXAxLnIgKiBhcFtpX181XS5pICsgdGVtcDEuaSAqIGFwW2lfXzVdCisJCQkgICAgLnI7CisJCSAgICB6X18xLnIgPSB5W2lfXzRdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fNF0uaSArIHpfXzIuaTsKKwkJICAgIHlbaV9fM10uciA9IHpfXzEuciwgeVtpX18zXS5pID0gel9fMS5pOworCQkgICAgZF9jbmpnKCZ6X18zLCAmYXBba10pOworCQkgICAgaV9fMyA9IGlfXzsKKwkJICAgIHpfXzIuciA9IHpfXzMuciAqIHhbaV9fM10uciAtIHpfXzMuaSAqIHhbaV9fM10uaSwgel9fMi5pID0KKwkJCSAgICAgel9fMy5yICogeFtpX18zXS5pICsgel9fMy5pICogeFtpX18zXS5yOworCQkgICAgel9fMS5yID0gdGVtcDIuciArIHpfXzIuciwgel9fMS5pID0gdGVtcDIuaSArIHpfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSB6X18xLnIsIHRlbXAyLmkgPSB6X18xLmk7CisJCSAgICArK2s7CisvKiBMOTA6ICovCisJCX0KKwkJaV9fMiA9IGo7CisJCWlfXzMgPSBqOworCQl6X18yLnIgPSBhbHBoYS0+ciAqIHRlbXAyLnIgLSBhbHBoYS0+aSAqIHRlbXAyLmksIHpfXzIuaSA9IAorCQkJYWxwaGEtPnIgKiB0ZW1wMi5pICsgYWxwaGEtPmkgKiB0ZW1wMi5yOworCQl6X18xLnIgPSB5W2lfXzNdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fM10uaSArIHpfXzIuaTsKKwkJeVtpX18yXS5yID0gel9fMS5yLCB5W2lfXzJdLmkgPSB6X18xLmk7CisJCWtrICs9ICpuIC0gaiArIDE7CisvKiBMMTAwOiAqLworCSAgICB9CisJfSBlbHNlIHsKKwkgICAganggPSBreDsKKwkgICAgankgPSBreTsKKwkgICAgaV9fMSA9ICpuOworCSAgICBmb3IgKGogPSAxOyBqIDw9IGlfXzE7ICsraikgeworCQlpX18yID0gang7CisJCXpfXzEuciA9IGFscGhhLT5yICogeFtpX18yXS5yIC0gYWxwaGEtPmkgKiB4W2lfXzJdLmksIHpfXzEuaSA9CisJCQkgYWxwaGEtPnIgKiB4W2lfXzJdLmkgKyBhbHBoYS0+aSAqIHhbaV9fMl0ucjsKKwkJdGVtcDEuciA9IHpfXzEuciwgdGVtcDEuaSA9IHpfXzEuaTsKKwkJdGVtcDIuciA9IDAuLCB0ZW1wMi5pID0gMC47CisJCWlfXzIgPSBqeTsKKwkJaV9fMyA9IGp5OworCQlpX180ID0ga2s7CisJCWRfXzEgPSBhcFtpX180XS5yOworCQl6X18yLnIgPSBkX18xICogdGVtcDEuciwgel9fMi5pID0gZF9fMSAqIHRlbXAxLmk7CisJCXpfXzEuciA9IHlbaV9fM10uciArIHpfXzIuciwgel9fMS5pID0geVtpX18zXS5pICsgel9fMi5pOworCQl5W2lfXzJdLnIgPSB6X18xLnIsIHlbaV9fMl0uaSA9IHpfXzEuaTsKKwkJaXggPSBqeDsKKwkJaXkgPSBqeTsKKwkJaV9fMiA9IGtrICsgKm4gLSBqOworCQlmb3IgKGsgPSBrayArIDE7IGsgPD0gaV9fMjsgKytrKSB7CisJCSAgICBpeCArPSAqaW5jeDsKKwkJICAgIGl5ICs9ICppbmN5OworCQkgICAgaV9fMyA9IGl5OworCQkgICAgaV9fNCA9IGl5OworCQkgICAgaV9fNSA9IGs7CisJCSAgICB6X18yLnIgPSB0ZW1wMS5yICogYXBbaV9fNV0uciAtIHRlbXAxLmkgKiBhcFtpX181XS5pLCAKKwkJCSAgICB6X18yLmkgPSB0ZW1wMS5yICogYXBbaV9fNV0uaSArIHRlbXAxLmkgKiBhcFtpX181XQorCQkJICAgIC5yOworCQkgICAgel9fMS5yID0geVtpX180XS5yICsgel9fMi5yLCB6X18xLmkgPSB5W2lfXzRdLmkgKyB6X18yLmk7CisJCSAgICB5W2lfXzNdLnIgPSB6X18xLnIsIHlbaV9fM10uaSA9IHpfXzEuaTsKKwkJICAgIGRfY25qZygmel9fMywgJmFwW2tdKTsKKwkJICAgIGlfXzMgPSBpeDsKKwkJICAgIHpfXzIuciA9IHpfXzMuciAqIHhbaV9fM10uciAtIHpfXzMuaSAqIHhbaV9fM10uaSwgel9fMi5pID0KKwkJCSAgICAgel9fMy5yICogeFtpX18zXS5pICsgel9fMy5pICogeFtpX18zXS5yOworCQkgICAgel9fMS5yID0gdGVtcDIuciArIHpfXzIuciwgel9fMS5pID0gdGVtcDIuaSArIHpfXzIuaTsKKwkJICAgIHRlbXAyLnIgPSB6X18xLnIsIHRlbXAyLmkgPSB6X18xLmk7CisvKiBMMTEwOiAqLworCQl9CisJCWlfXzIgPSBqeTsKKwkJaV9fMyA9IGp5OworCQl6X18yLnIgPSBhbHBoYS0+ciAqIHRlbXAyLnIgLSBhbHBoYS0+aSAqIHRlbXAyLmksIHpfXzIuaSA9IAorCQkJYWxwaGEtPnIgKiB0ZW1wMi5pICsgYWxwaGEtPmkgKiB0ZW1wMi5yOworCQl6X18xLnIgPSB5W2lfXzNdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHlbaV9fM10uaSArIHpfXzIuaTsKKwkJeVtpX18yXS5yID0gel9fMS5yLCB5W2lfXzJdLmkgPSB6X18xLmk7CisJCWp4ICs9ICppbmN4OworCQlqeSArPSAqaW5jeTsKKwkJa2sgKz0gKm4gLSBqICsgMTsKKy8qIEwxMjA6ICovCisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKKy8qICAgICBFbmQgb2YgWkhQTVYgLiAqLworCit9IC8qIHpocG12XyAqLworCmRpZmYgLS1naXQgYS9ibGFzL2YyYy96dGJtdi5jIGIvYmxhcy9mMmMvenRibXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2RjZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9mMmMvenRibXYuYwpAQCAtMCwwICsxLDY0NyBAQAorLyogenRibXYuZiAtLSB0cmFuc2xhdGVkIGJ5IGYyYyAodmVyc2lvbiAyMDEwMDgyNykuCisgICBZb3UgbXVzdCBsaW5rIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUgd2l0aCBsaWJmMmM6CisJb24gTWljcm9zb2Z0IFdpbmRvd3Mgc3lzdGVtLCBsaW5rIHdpdGggbGliZjJjLmxpYjsKKwlvbiBMaW51eCBvciBVbml4IHN5c3RlbXMsIGxpbmsgd2l0aCAuLi4vcGF0aC90by9saWJmMmMuYSAtbG0KKwlvciwgaWYgeW91IGluc3RhbGwgbGliZjJjLmEgaW4gYSBzdGFuZGFyZCBwbGFjZSwgd2l0aCAtbGYyYyAtbG0KKwktLSBpbiB0aGF0IG9yZGVyLCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUsIGFzIGluCisJCWNjICoubyAtbGYyYyAtbG0KKwlTb3VyY2UgZm9yIGxpYmYyYyBpcyBpbiAvbmV0bGliL2YyYy9saWJmMmMuemlwLCBlLmcuLAorCisJCWh0dHA6Ly93d3cubmV0bGliLm9yZy9mMmMvbGliZjJjLnppcAorKi8KKworI2luY2x1ZGUgImRhdGF0eXBlcy5oIgorCisvKiBTdWJyb3V0aW5lICovIGludCB6dGJtdl8oY2hhciAqdXBsbywgY2hhciAqdHJhbnMsIGNoYXIgKmRpYWcsIGludGVnZXIgKm4sIAorCWludGVnZXIgKmssIGRvdWJsZWNvbXBsZXggKmEsIGludGVnZXIgKmxkYSwgZG91YmxlY29tcGxleCAqeCwgaW50ZWdlciAKKwkqaW5jeCwgZnRubGVuIHVwbG9fbGVuLCBmdG5sZW4gdHJhbnNfbGVuLCBmdG5sZW4gZGlhZ19sZW4pCit7CisgICAgLyogU3lzdGVtIGdlbmVyYXRlZCBsb2NhbHMgKi8KKyAgICBpbnRlZ2VyIGFfZGltMSwgYV9vZmZzZXQsIGlfXzEsIGlfXzIsIGlfXzMsIGlfXzQsIGlfXzU7CisgICAgZG91YmxlY29tcGxleCB6X18xLCB6X18yLCB6X18zOworCisgICAgLyogQnVpbHRpbiBmdW5jdGlvbnMgKi8KKyAgICB2b2lkIGRfY25qZyhkb3VibGVjb21wbGV4ICosIGRvdWJsZWNvbXBsZXggKik7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnRlZ2VyIGlfXywgaiwgbCwgaXgsIGp4LCBreCwgaW5mbzsKKyAgICBkb3VibGVjb21wbGV4IHRlbXA7CisgICAgZXh0ZXJuIGxvZ2ljYWwgbHNhbWVfKGNoYXIgKiwgY2hhciAqLCBmdG5sZW4sIGZ0bmxlbik7CisgICAgaW50ZWdlciBrcGx1czE7CisgICAgZXh0ZXJuIC8qIFN1YnJvdXRpbmUgKi8gaW50IHhlcmJsYV8oY2hhciAqLCBpbnRlZ2VyICosIGZ0bmxlbik7CisgICAgbG9naWNhbCBub2NvbmosIG5vdW5pdDsKKworLyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLiAqLworLyogICAgIC4uICovCisKKy8qICBQdXJwb3NlICovCisvKiAgPT09PT09PSAqLworCisvKiAgWlRCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zICovCisKKy8qICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwgICBvciAgIHggOj0gY29uamcoIEEnICkqeCwgKi8KKworLyogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LCAqLworLyogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXgsIHdpdGggKCBrICsgMSApIGRpYWdvbmFscy4gKi8KKworLyogIEFyZ3VtZW50cyAqLworLyogID09PT09PT09PT0gKi8KKworLyogIFVQTE8gICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggaXMgYW4gdXBwZXIgb3IgKi8KKy8qICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLworCisvKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIFRSQU5TICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgYXMgKi8KKy8qICAgICAgICAgICBmb2xsb3dzOiAqLworCisvKiAgICAgICAgICAgICAgVFJBTlMgPSAnTicgb3IgJ24nICAgeCA6PSBBKnguICovCisKKy8qICAgICAgICAgICAgICBUUkFOUyA9ICdUJyBvciAndCcgICB4IDo9IEEnKnguICovCisKKy8qICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICB4IDo9IGNvbmpnKCBBJyApKnguICovCisKKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIERJQUcgICAtIENIQVJBQ1RFUioxLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6ICovCisKKy8qICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuICovCisKKy8qICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5ndWxhci4gKi8KKworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgTiAgICAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4gKi8KKy8qICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEsgICAgICAtIElOVEVHRVIuICovCisvKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiAqLworLyogICAgICAgICAgIHN1cGVyLWRpYWdvbmFscyBvZiB0aGUgbWF0cml4IEEuICovCisvKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiAqLworLyogICAgICAgICAgIHN1Yi1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLiAqLworLyogICAgICAgICAgIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4gKi8KKy8qICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4gKi8KKworLyogIEEgICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OICggTERBLCBuICkuICovCisvKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKSAqLworLyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgKi8KKy8qICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudHMsIHN1cHBsaWVkIGNvbHVtbiBieSAqLworLyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAqLworLyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdCAqLworLyogICAgICAgICAgIHBvc2l0aW9uIDIgaW4gcm93IGssIGFuZCBzbyBvbi4gVGhlIHRvcCBsZWZ0IGsgYnkgayB0cmlhbmdsZSAqLworLyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLiAqLworLyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgYW4gdXBwZXIgKi8KKy8qICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UgKi8KKy8qICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6ICovCisKKy8qICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4gKi8KKy8qICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBNQVgoIDEsIEogLSBLICksIEogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGxlYWRpbmcgKCBrICsgMSApICovCisvKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciAqLworLyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cywgc3VwcGxpZWQgY29sdW1uIGJ5ICovCisvKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93IDEgb2YgKi8KKy8qICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbiAqLworLyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZSAqLworLyogICAgICAgICAgIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuICovCisvKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhIGxvd2VyICovCisvKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlICovCisvKiAgICAgICAgICAgdG8gYmFuZCBzdG9yYWdlOiAqLworCisvKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOICovCisvKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKICovCisvKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkgKi8KKy8qICAgICAgICAgICAgICAxMCAgICBDT05USU5VRSAqLworLyogICAgICAgICAgICAgIDIwIENPTlRJTlVFICovCisKKy8qICAgICAgICAgICBOb3RlIHRoYXQgd2hlbiBESUFHID0gJ1UnIG9yICd1JyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEgKi8KKy8qICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGFyZSBub3QgKi8KKy8qICAgICAgICAgICByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuICovCisvKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuICovCisKKy8qICBMREEgICAgLSBJTlRFR0VSLiAqLworLyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZCAqLworLyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0ICovCisvKiAgICAgICAgICAgKCBrICsgMSApLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgWCAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QgKi8KKy8qICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4gKi8KKy8qICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbiAqLworLyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguIE9uIGV4aXQsIFggaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgKi8KKy8qICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LiAqLworCisvKiAgSU5DWCAgIC0gSU5URUdFUi4gKi8KKy8qICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mICovCisvKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLiAqLworLyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LiAqLworCisvKiAgRnVydGhlciBEZXRhaWxzICovCisvKiAgPT09PT09PT09PT09PT09ICovCisKKy8qICBMZXZlbCAyIEJsYXMgcm91dGluZS4gKi8KKworLyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LiAqLworLyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLiAqLworLyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuICovCisvKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLiAqLworCisvKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qICAgICAuLiBQYXJhbWV0ZXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4gKi8KKy8qICAgICAuLiAqLworLyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uICovCisvKiAgICAgLi4gKi8KKy8qICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uICovCisvKiAgICAgLi4gKi8KKworLyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgYWRqdXN0bWVudHMgKi8KKyAgICBhX2RpbTEgPSAqbGRhOworICAgIGFfb2Zmc2V0ID0gMSArIGFfZGltMTsKKyAgICBhIC09IGFfb2Zmc2V0OworICAgIC0teDsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBpbmZvID0gMDsKKyAgICBpZiAoISBsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odXBsbywgIkwiLCAoCisJICAgIGZ0bmxlbikxLCAoZnRubGVuKTEpKSB7CisJaW5mbyA9IDE7CisgICAgfSBlbHNlIGlmICghIGxzYW1lXyh0cmFucywgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSkgJiYgISBsc2FtZV8odHJhbnMsIAorCSAgICAiVCIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyh0cmFucywgIkMiLCAoZnRubGVuKTEsICgKKwkgICAgZnRubGVuKTEpKSB7CisJaW5mbyA9IDI7CisgICAgfSBlbHNlIGlmICghIGxzYW1lXyhkaWFnLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSAmJiAhIGxzYW1lXyhkaWFnLCAKKwkgICAgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwlpbmZvID0gMzsKKyAgICB9IGVsc2UgaWYgKCpuIDwgMCkgeworCWluZm8gPSA0OworICAgIH0gZWxzZSBpZiAoKmsgPCAwKSB7CisJaW5mbyA9IDU7CisgICAgfSBlbHNlIGlmICgqbGRhIDwgKmsgKyAxKSB7CisJaW5mbyA9IDc7CisgICAgfSBlbHNlIGlmICgqaW5jeCA9PSAwKSB7CisJaW5mbyA9IDk7CisgICAgfQorICAgIGlmIChpbmZvICE9IDApIHsKKwl4ZXJibGFfKCJaVEJNViAiLCAmaW5mbywgKGZ0bmxlbik2KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKy8qICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuICovCisKKyAgICBpZiAoKm4gPT0gMCkgeworCXJldHVybiAwOworICAgIH0KKworICAgIG5vY29uaiA9IGxzYW1lXyh0cmFucywgIlQiLCAoZnRubGVuKTEsIChmdG5sZW4pMSk7CisgICAgbm91bml0ID0gbHNhbWVfKGRpYWcsICJOIiwgKGZ0bmxlbikxLCAoZnRubGVuKTEpOworCisvKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludCBpbiBYIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IHVuaXR5LiBUaGlzICovCisvKiAgICAgd2lsbCBiZSAgKCBOIC0gMSApKklOQ1ggICB0b28gc21hbGwgZm9yIGRlc2NlbmRpbmcgbG9vcHMuICovCisKKyAgICBpZiAoKmluY3ggPD0gMCkgeworCWt4ID0gMSAtICgqbiAtIDEpICogKmluY3g7CisgICAgfSBlbHNlIGlmICgqaW5jeCAhPSAxKSB7CisJa3ggPSAxOworICAgIH0KKworLyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIEEgYXJlICovCisvKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLiAqLworCisgICAgaWYgKGxzYW1lXyh0cmFucywgIk4iLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKworLyogICAgICAgICBGb3JtICB4IDo9IEEqeC4gKi8KKworCWlmIChsc2FtZV8odXBsbywgIlUiLCAoZnRubGVuKTEsIChmdG5sZW4pMSkpIHsKKwkgICAga3BsdXMxID0gKmsgKyAxOworCSAgICBpZiAoKmluY3ggPT0gMSkgeworCQlpX18xID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCSAgICBpX18yID0gajsKKwkJICAgIGlmICh4W2lfXzJdLnIgIT0gMC4gfHwgeFtpX18yXS5pICE9IDAuKSB7CisJCQlpX18yID0gajsKKwkJCXRlbXAuciA9IHhbaV9fMl0uciwgdGVtcC5pID0geFtpX18yXS5pOworCQkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX18yID0gMSwgaV9fMyA9IGogLSAqazsKKwkJCWlfXzQgPSBqIC0gMTsKKwkJCWZvciAoaV9fID0gbWF4KGlfXzIsaV9fMyk7IGlfXyA8PSBpX180OyArK2lfXykgeworCQkJICAgIGlfXzIgPSBpX187CisJCQkgICAgaV9fMyA9IGlfXzsKKwkJCSAgICBpX181ID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMi5yID0gdGVtcC5yICogYVtpX181XS5yIC0gdGVtcC5pICogYVtpX181XS5pLCAKKwkJCQkgICAgel9fMi5pID0gdGVtcC5yICogYVtpX181XS5pICsgdGVtcC5pICogYVsKKwkJCQkgICAgaV9fNV0ucjsKKwkJCSAgICB6X18xLnIgPSB4W2lfXzNdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHhbaV9fM10uaSArIAorCQkJCSAgICB6X18yLmk7CisJCQkgICAgeFtpX18yXS5yID0gel9fMS5yLCB4W2lfXzJdLmkgPSB6X18xLmk7CisvKiBMMTA6ICovCisJCQl9CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fNCA9IGo7CisJCQkgICAgaV9fMiA9IGo7CisJCQkgICAgaV9fMyA9IGtwbHVzMSArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMS5yID0geFtpX18yXS5yICogYVtpX18zXS5yIC0geFtpX18yXS5pICogYVsKKwkJCQkgICAgaV9fM10uaSwgel9fMS5pID0geFtpX18yXS5yICogYVtpX18zXS5pICsgCisJCQkJICAgIHhbaV9fMl0uaSAqIGFbaV9fM10ucjsKKwkJCSAgICB4W2lfXzRdLnIgPSB6X18xLnIsIHhbaV9fNF0uaSA9IHpfXzEuaTsKKwkJCX0KKwkJICAgIH0KKy8qIEwyMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlqeCA9IGt4OworCQlpX18xID0gKm47CisJCWZvciAoaiA9IDE7IGogPD0gaV9fMTsgKytqKSB7CisJCSAgICBpX180ID0gang7CisJCSAgICBpZiAoeFtpX180XS5yICE9IDAuIHx8IHhbaV9fNF0uaSAhPSAwLikgeworCQkJaV9fNCA9IGp4OworCQkJdGVtcC5yID0geFtpX180XS5yLCB0ZW1wLmkgPSB4W2lfXzRdLmk7CisJCQlpeCA9IGt4OworCQkJbCA9IGtwbHVzMSAtIGo7CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMiA9IGogLSAqazsKKwkJCWlfXzMgPSBqIC0gMTsKKwkJCWZvciAoaV9fID0gbWF4KGlfXzQsaV9fMik7IGlfXyA8PSBpX18zOyArK2lfXykgeworCQkJICAgIGlfXzQgPSBpeDsKKwkJCSAgICBpX18yID0gaXg7CisJCQkgICAgaV9fNSA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIHpfXzIuciA9IHRlbXAuciAqIGFbaV9fNV0uciAtIHRlbXAuaSAqIGFbaV9fNV0uaSwgCisJCQkJICAgIHpfXzIuaSA9IHRlbXAuciAqIGFbaV9fNV0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzVdLnI7CisJCQkgICAgel9fMS5yID0geFtpX18yXS5yICsgel9fMi5yLCB6X18xLmkgPSB4W2lfXzJdLmkgKyAKKwkJCQkgICAgel9fMi5pOworCQkJICAgIHhbaV9fNF0uciA9IHpfXzEuciwgeFtpX180XS5pID0gel9fMS5pOworCQkJICAgIGl4ICs9ICppbmN4OworLyogTDMwOiAqLworCQkJfQorCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzMgPSBqeDsKKwkJCSAgICBpX180ID0gang7CisJCQkgICAgaV9fMiA9IGtwbHVzMSArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMS5yID0geFtpX180XS5yICogYVtpX18yXS5yIC0geFtpX180XS5pICogYVsKKwkJCQkgICAgaV9fMl0uaSwgel9fMS5pID0geFtpX180XS5yICogYVtpX18yXS5pICsgCisJCQkJICAgIHhbaV9fNF0uaSAqIGFbaV9fMl0ucjsKKwkJCSAgICB4W2lfXzNdLnIgPSB6X18xLnIsIHhbaV9fM10uaSA9IHpfXzEuaTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGp4ICs9ICppbmN4OworCQkgICAgaWYgKGogPiAqaykgeworCQkJa3ggKz0gKmluY3g7CisJCSAgICB9CisvKiBMNDA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgaV9fMSA9IGo7CisJCSAgICBpZiAoeFtpX18xXS5yICE9IDAuIHx8IHhbaV9fMV0uaSAhPSAwLikgeworCQkJaV9fMSA9IGo7CisJCQl0ZW1wLnIgPSB4W2lfXzFdLnIsIHRlbXAuaSA9IHhbaV9fMV0uaTsKKwkJCWwgPSAxIC0gajsKKy8qIENvbXB1dGluZyBNSU4gKi8KKwkJCWlfXzEgPSAqbiwgaV9fMyA9IGogKyAqazsKKwkJCWlfXzQgPSBqICsgMTsKKwkJCWZvciAoaV9fID0gbWluKGlfXzEsaV9fMyk7IGlfXyA+PSBpX180OyAtLWlfXykgeworCQkJICAgIGlfXzEgPSBpX187CisJCQkgICAgaV9fMyA9IGlfXzsKKwkJCSAgICBpX18yID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMi5yID0gdGVtcC5yICogYVtpX18yXS5yIC0gdGVtcC5pICogYVtpX18yXS5pLCAKKwkJCQkgICAgel9fMi5pID0gdGVtcC5yICogYVtpX18yXS5pICsgdGVtcC5pICogYVsKKwkJCQkgICAgaV9fMl0ucjsKKwkJCSAgICB6X18xLnIgPSB4W2lfXzNdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHhbaV9fM10uaSArIAorCQkJCSAgICB6X18yLmk7CisJCQkgICAgeFtpX18xXS5yID0gel9fMS5yLCB4W2lfXzFdLmkgPSB6X18xLmk7CisvKiBMNTA6ICovCisJCQl9CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fNCA9IGo7CisJCQkgICAgaV9fMSA9IGo7CisJCQkgICAgaV9fMyA9IGogKiBhX2RpbTEgKyAxOworCQkJICAgIHpfXzEuciA9IHhbaV9fMV0uciAqIGFbaV9fM10uciAtIHhbaV9fMV0uaSAqIGFbCisJCQkJICAgIGlfXzNdLmksIHpfXzEuaSA9IHhbaV9fMV0uciAqIGFbaV9fM10uaSArIAorCQkJCSAgICB4W2lfXzFdLmkgKiBhW2lfXzNdLnI7CisJCQkgICAgeFtpX180XS5yID0gel9fMS5yLCB4W2lfXzRdLmkgPSB6X18xLmk7CisJCQl9CisJCSAgICB9CisvKiBMNjA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJa3ggKz0gKCpuIC0gMSkgKiAqaW5jeDsKKwkJanggPSBreDsKKwkJZm9yIChqID0gKm47IGogPj0gMTsgLS1qKSB7CisJCSAgICBpX180ID0gang7CisJCSAgICBpZiAoeFtpX180XS5yICE9IDAuIHx8IHhbaV9fNF0uaSAhPSAwLikgeworCQkJaV9fNCA9IGp4OworCQkJdGVtcC5yID0geFtpX180XS5yLCB0ZW1wLmkgPSB4W2lfXzRdLmk7CisJCQlpeCA9IGt4OworCQkJbCA9IDEgLSBqOworLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fNCA9ICpuLCBpX18xID0gaiArICprOworCQkJaV9fMyA9IGogKyAxOworCQkJZm9yIChpX18gPSBtaW4oaV9fNCxpX18xKTsgaV9fID49IGlfXzM7IC0taV9fKSB7CisJCQkgICAgaV9fNCA9IGl4OworCQkJICAgIGlfXzEgPSBpeDsKKwkJCSAgICBpX18yID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMi5yID0gdGVtcC5yICogYVtpX18yXS5yIC0gdGVtcC5pICogYVtpX18yXS5pLCAKKwkJCQkgICAgel9fMi5pID0gdGVtcC5yICogYVtpX18yXS5pICsgdGVtcC5pICogYVsKKwkJCQkgICAgaV9fMl0ucjsKKwkJCSAgICB6X18xLnIgPSB4W2lfXzFdLnIgKyB6X18yLnIsIHpfXzEuaSA9IHhbaV9fMV0uaSArIAorCQkJCSAgICB6X18yLmk7CisJCQkgICAgeFtpX180XS5yID0gel9fMS5yLCB4W2lfXzRdLmkgPSB6X18xLmk7CisJCQkgICAgaXggLT0gKmluY3g7CisvKiBMNzA6ICovCisJCQl9CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fMyA9IGp4OworCQkJICAgIGlfXzQgPSBqeDsKKwkJCSAgICBpX18xID0gaiAqIGFfZGltMSArIDE7CisJCQkgICAgel9fMS5yID0geFtpX180XS5yICogYVtpX18xXS5yIC0geFtpX180XS5pICogYVsKKwkJCQkgICAgaV9fMV0uaSwgel9fMS5pID0geFtpX180XS5yICogYVtpX18xXS5pICsgCisJCQkJICAgIHhbaV9fNF0uaSAqIGFbaV9fMV0ucjsKKwkJCSAgICB4W2lfXzNdLnIgPSB6X18xLnIsIHhbaV9fM10uaSA9IHpfXzEuaTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGp4IC09ICppbmN4OworCQkgICAgaWYgKCpuIC0gaiA+PSAqaykgeworCQkJa3ggLT0gKmluY3g7CisJCSAgICB9CisvKiBMODA6ICovCisJCX0KKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCisvKiAgICAgICAgRm9ybSAgeCA6PSBBJyp4ICBvciAgeCA6PSBjb25qZyggQScgKSp4LiAqLworCisJaWYgKGxzYW1lXyh1cGxvLCAiVSIsIChmdG5sZW4pMSwgKGZ0bmxlbikxKSkgeworCSAgICBrcGx1czEgPSAqayArIDE7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWZvciAoaiA9ICpuOyBqID49IDE7IC0taikgeworCQkgICAgaV9fMyA9IGo7CisJCSAgICB0ZW1wLnIgPSB4W2lfXzNdLnIsIHRlbXAuaSA9IHhbaV9fM10uaTsKKwkJICAgIGwgPSBrcGx1czEgLSBqOworCQkgICAgaWYgKG5vY29uaikgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGlfXzMgPSBrcGx1czEgKyBqICogYV9kaW0xOworCQkJICAgIHpfXzEuciA9IHRlbXAuciAqIGFbaV9fM10uciAtIHRlbXAuaSAqIGFbaV9fM10uaSwgCisJCQkJICAgIHpfXzEuaSA9IHRlbXAuciAqIGFbaV9fM10uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzNdLnI7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMSA9IGogLSAqazsKKwkJCWlfXzMgPSBtYXgoaV9fNCxpX18xKTsKKwkJCWZvciAoaV9fID0gaiAtIDE7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIGlfXzQgPSBsICsgaV9fICsgaiAqIGFfZGltMTsKKwkJCSAgICBpX18xID0gaV9fOworCQkJICAgIHpfXzIuciA9IGFbaV9fNF0uciAqIHhbaV9fMV0uciAtIGFbaV9fNF0uaSAqIHhbCisJCQkJICAgIGlfXzFdLmksIHpfXzIuaSA9IGFbaV9fNF0uciAqIHhbaV9fMV0uaSArIAorCQkJCSAgICBhW2lfXzRdLmkgKiB4W2lfXzFdLnI7CisJCQkgICAgel9fMS5yID0gdGVtcC5yICsgel9fMi5yLCB6X18xLmkgPSB0ZW1wLmkgKyAKKwkJCQkgICAgel9fMi5pOworCQkJICAgIHRlbXAuciA9IHpfXzEuciwgdGVtcC5pID0gel9fMS5pOworLyogTDkwOiAqLworCQkJfQorCQkgICAgfSBlbHNlIHsKKwkJCWlmIChub3VuaXQpIHsKKwkJCSAgICBkX2NuamcoJnpfXzIsICZhW2twbHVzMSArIGogKiBhX2RpbTFdKTsKKwkJCSAgICB6X18xLnIgPSB0ZW1wLnIgKiB6X18yLnIgLSB0ZW1wLmkgKiB6X18yLmksIAorCQkJCSAgICB6X18xLmkgPSB0ZW1wLnIgKiB6X18yLmkgKyB0ZW1wLmkgKiAKKwkJCQkgICAgel9fMi5yOworCQkJICAgIHRlbXAuciA9IHpfXzEuciwgdGVtcC5pID0gel9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1BWCAqLworCQkJaV9fNCA9IDEsIGlfXzEgPSBqIC0gKms7CisJCQlpX18zID0gbWF4KGlfXzQsaV9fMSk7CisJCQlmb3IgKGlfXyA9IGogLSAxOyBpX18gPj0gaV9fMzsgLS1pX18pIHsKKwkJCSAgICBkX2NuamcoJnpfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCQkgICAgaV9fNCA9IGlfXzsKKwkJCSAgICB6X18yLnIgPSB6X18zLnIgKiB4W2lfXzRdLnIgLSB6X18zLmkgKiB4W2lfXzRdLmksIAorCQkJCSAgICB6X18yLmkgPSB6X18zLnIgKiB4W2lfXzRdLmkgKyB6X18zLmkgKiB4WworCQkJCSAgICBpX180XS5yOworCQkJICAgIHpfXzEuciA9IHRlbXAuciArIHpfXzIuciwgel9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHpfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSB6X18xLnIsIHRlbXAuaSA9IHpfXzEuaTsKKy8qIEwxMDA6ICovCisJCQl9CisJCSAgICB9CisJCSAgICBpX18zID0gajsKKwkJICAgIHhbaV9fM10uciA9IHRlbXAuciwgeFtpX18zXS5pID0gdGVtcC5pOworLyogTDExMDogKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlreCArPSAoKm4gLSAxKSAqICppbmN4OworCQlqeCA9IGt4OworCQlmb3IgKGogPSAqbjsgaiA+PSAxOyAtLWopIHsKKwkJICAgIGlfXzMgPSBqeDsKKwkJICAgIHRlbXAuciA9IHhbaV9fM10uciwgdGVtcC5pID0geFtpX18zXS5pOworCQkgICAga3ggLT0gKmluY3g7CisJCSAgICBpeCA9IGt4OworCQkgICAgbCA9IGtwbHVzMSAtIGo7CisJCSAgICBpZiAobm9jb25qKSB7CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fMyA9IGtwbHVzMSArIGogKiBhX2RpbTE7CisJCQkgICAgel9fMS5yID0gdGVtcC5yICogYVtpX18zXS5yIC0gdGVtcC5pICogYVtpX18zXS5pLCAKKwkJCQkgICAgel9fMS5pID0gdGVtcC5yICogYVtpX18zXS5pICsgdGVtcC5pICogYVsKKwkJCQkgICAgaV9fM10ucjsKKwkJCSAgICB0ZW1wLnIgPSB6X18xLnIsIHRlbXAuaSA9IHpfXzEuaTsKKwkJCX0KKy8qIENvbXB1dGluZyBNQVggKi8KKwkJCWlfXzQgPSAxLCBpX18xID0gaiAtICprOworCQkJaV9fMyA9IG1heChpX180LGlfXzEpOworCQkJZm9yIChpX18gPSBqIC0gMTsgaV9fID49IGlfXzM7IC0taV9fKSB7CisJCQkgICAgaV9fNCA9IGwgKyBpX18gKyBqICogYV9kaW0xOworCQkJICAgIGlfXzEgPSBpeDsKKwkJCSAgICB6X18yLnIgPSBhW2lfXzRdLnIgKiB4W2lfXzFdLnIgLSBhW2lfXzRdLmkgKiB4WworCQkJCSAgICBpX18xXS5pLCB6X18yLmkgPSBhW2lfXzRdLnIgKiB4W2lfXzFdLmkgKyAKKwkJCQkgICAgYVtpX180XS5pICogeFtpX18xXS5yOworCQkJICAgIHpfXzEuciA9IHRlbXAuciArIHpfXzIuciwgel9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHpfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSB6X18xLnIsIHRlbXAuaSA9IHpfXzEuaTsKKwkJCSAgICBpeCAtPSAqaW5jeDsKKy8qIEwxMjA6ICovCisJCQl9CisJCSAgICB9IGVsc2UgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGRfY25qZygmel9fMiwgJmFba3BsdXMxICsgaiAqIGFfZGltMV0pOworCQkJICAgIHpfXzEuciA9IHRlbXAuciAqIHpfXzIuciAtIHRlbXAuaSAqIHpfXzIuaSwgCisJCQkJICAgIHpfXzEuaSA9IHRlbXAuciAqIHpfXzIuaSArIHRlbXAuaSAqIAorCQkJCSAgICB6X18yLnI7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUFYICovCisJCQlpX180ID0gMSwgaV9fMSA9IGogLSAqazsKKwkJCWlfXzMgPSBtYXgoaV9fNCxpX18xKTsKKwkJCWZvciAoaV9fID0gaiAtIDE7IGlfXyA+PSBpX18zOyAtLWlfXykgeworCQkJICAgIGRfY25qZygmel9fMywgJmFbbCArIGlfXyArIGogKiBhX2RpbTFdKTsKKwkJCSAgICBpX180ID0gaXg7CisJCQkgICAgel9fMi5yID0gel9fMy5yICogeFtpX180XS5yIC0gel9fMy5pICogeFtpX180XS5pLCAKKwkJCQkgICAgel9fMi5pID0gel9fMy5yICogeFtpX180XS5pICsgel9fMy5pICogeFsKKwkJCQkgICAgaV9fNF0ucjsKKwkJCSAgICB6X18xLnIgPSB0ZW1wLnIgKyB6X18yLnIsIHpfXzEuaSA9IHRlbXAuaSArIAorCQkJCSAgICB6X18yLmk7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQkgICAgaXggLT0gKmluY3g7CisvKiBMMTMwOiAqLworCQkJfQorCQkgICAgfQorCQkgICAgaV9fMyA9IGp4OworCQkgICAgeFtpX18zXS5yID0gdGVtcC5yLCB4W2lfXzNdLmkgPSB0ZW1wLmk7CisJCSAgICBqeCAtPSAqaW5jeDsKKy8qIEwxNDA6ICovCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICgqaW5jeCA9PSAxKSB7CisJCWlfXzMgPSAqbjsKKwkJZm9yIChqID0gMTsgaiA8PSBpX18zOyArK2opIHsKKwkJICAgIGlfXzQgPSBqOworCQkgICAgdGVtcC5yID0geFtpX180XS5yLCB0ZW1wLmkgPSB4W2lfXzRdLmk7CisJCSAgICBsID0gMSAtIGo7CisJCSAgICBpZiAobm9jb25qKSB7CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fNCA9IGogKiBhX2RpbTEgKyAxOworCQkJICAgIHpfXzEuciA9IHRlbXAuciAqIGFbaV9fNF0uciAtIHRlbXAuaSAqIGFbaV9fNF0uaSwgCisJCQkJICAgIHpfXzEuaSA9IHRlbXAuciAqIGFbaV9fNF0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzRdLnI7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUlOICovCisJCQlpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCQlpX180ID0gbWluKGlfXzEsaV9fMik7CisJCQlmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICBpX18xID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgaV9fMiA9IGlfXzsKKwkJCSAgICB6X18yLnIgPSBhW2lfXzFdLnIgKiB4W2lfXzJdLnIgLSBhW2lfXzFdLmkgKiB4WworCQkJCSAgICBpX18yXS5pLCB6X18yLmkgPSBhW2lfXzFdLnIgKiB4W2lfXzJdLmkgKyAKKwkJCQkgICAgYVtpX18xXS5pICogeFtpX18yXS5yOworCQkJICAgIHpfXzEuciA9IHRlbXAuciArIHpfXzIuciwgel9fMS5pID0gdGVtcC5pICsgCisJCQkJICAgIHpfXzIuaTsKKwkJCSAgICB0ZW1wLnIgPSB6X18xLnIsIHRlbXAuaSA9IHpfXzEuaTsKKy8qIEwxNTA6ICovCisJCQl9CisJCSAgICB9IGVsc2UgeworCQkJaWYgKG5vdW5pdCkgeworCQkJICAgIGRfY25qZygmel9fMiwgJmFbaiAqIGFfZGltMSArIDFdKTsKKwkJCSAgICB6X18xLnIgPSB0ZW1wLnIgKiB6X18yLnIgLSB0ZW1wLmkgKiB6X18yLmksIAorCQkJCSAgICB6X18xLmkgPSB0ZW1wLnIgKiB6X18yLmkgKyB0ZW1wLmkgKiAKKwkJCQkgICAgel9fMi5yOworCQkJICAgIHRlbXAuciA9IHpfXzEuciwgdGVtcC5pID0gel9fMS5pOworCQkJfQorLyogQ29tcHV0aW5nIE1JTiAqLworCQkJaV9fMSA9ICpuLCBpX18yID0gaiArICprOworCQkJaV9fNCA9IG1pbihpX18xLGlfXzIpOworCQkJZm9yIChpX18gPSBqICsgMTsgaV9fIDw9IGlfXzQ7ICsraV9fKSB7CisJCQkgICAgZF9jbmpnKCZ6X18zLCAmYVtsICsgaV9fICsgaiAqIGFfZGltMV0pOworCQkJICAgIGlfXzEgPSBpX187CisJCQkgICAgel9fMi5yID0gel9fMy5yICogeFtpX18xXS5yIC0gel9fMy5pICogeFtpX18xXS5pLCAKKwkJCQkgICAgel9fMi5pID0gel9fMy5yICogeFtpX18xXS5pICsgel9fMy5pICogeFsKKwkJCQkgICAgaV9fMV0ucjsKKwkJCSAgICB6X18xLnIgPSB0ZW1wLnIgKyB6X18yLnIsIHpfXzEuaSA9IHRlbXAuaSArIAorCQkJCSAgICB6X18yLmk7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisvKiBMMTYwOiAqLworCQkJfQorCQkgICAgfQorCQkgICAgaV9fNCA9IGo7CisJCSAgICB4W2lfXzRdLnIgPSB0ZW1wLnIsIHhbaV9fNF0uaSA9IHRlbXAuaTsKKy8qIEwxNzA6ICovCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJanggPSBreDsKKwkJaV9fMyA9ICpuOworCQlmb3IgKGogPSAxOyBqIDw9IGlfXzM7ICsraikgeworCQkgICAgaV9fNCA9IGp4OworCQkgICAgdGVtcC5yID0geFtpX180XS5yLCB0ZW1wLmkgPSB4W2lfXzRdLmk7CisJCSAgICBreCArPSAqaW5jeDsKKwkJICAgIGl4ID0ga3g7CisJCSAgICBsID0gMSAtIGo7CisJCSAgICBpZiAobm9jb25qKSB7CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgaV9fNCA9IGogKiBhX2RpbTEgKyAxOworCQkJICAgIHpfXzEuciA9IHRlbXAuciAqIGFbaV9fNF0uciAtIHRlbXAuaSAqIGFbaV9fNF0uaSwgCisJCQkJICAgIHpfXzEuaSA9IHRlbXAuciAqIGFbaV9fNF0uaSArIHRlbXAuaSAqIGFbCisJCQkJICAgIGlfXzRdLnI7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUlOICovCisJCQlpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCQlpX180ID0gbWluKGlfXzEsaV9fMik7CisJCQlmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICBpX18xID0gbCArIGlfXyArIGogKiBhX2RpbTE7CisJCQkgICAgaV9fMiA9IGl4OworCQkJICAgIHpfXzIuciA9IGFbaV9fMV0uciAqIHhbaV9fMl0uciAtIGFbaV9fMV0uaSAqIHhbCisJCQkJICAgIGlfXzJdLmksIHpfXzIuaSA9IGFbaV9fMV0uciAqIHhbaV9fMl0uaSArIAorCQkJCSAgICBhW2lfXzFdLmkgKiB4W2lfXzJdLnI7CisJCQkgICAgel9fMS5yID0gdGVtcC5yICsgel9fMi5yLCB6X18xLmkgPSB0ZW1wLmkgKyAKKwkJCQkgICAgel9fMi5pOworCQkJICAgIHRlbXAuciA9IHpfXzEuciwgdGVtcC5pID0gel9fMS5pOworCQkJICAgIGl4ICs9ICppbmN4OworLyogTDE4MDogKi8KKwkJCX0KKwkJICAgIH0gZWxzZSB7CisJCQlpZiAobm91bml0KSB7CisJCQkgICAgZF9jbmpnKCZ6X18yLCAmYVtqICogYV9kaW0xICsgMV0pOworCQkJICAgIHpfXzEuciA9IHRlbXAuciAqIHpfXzIuciAtIHRlbXAuaSAqIHpfXzIuaSwgCisJCQkJICAgIHpfXzEuaSA9IHRlbXAuciAqIHpfXzIuaSArIHRlbXAuaSAqIAorCQkJCSAgICB6X18yLnI7CisJCQkgICAgdGVtcC5yID0gel9fMS5yLCB0ZW1wLmkgPSB6X18xLmk7CisJCQl9CisvKiBDb21wdXRpbmcgTUlOICovCisJCQlpX18xID0gKm4sIGlfXzIgPSBqICsgKms7CisJCQlpX180ID0gbWluKGlfXzEsaV9fMik7CisJCQlmb3IgKGlfXyA9IGogKyAxOyBpX18gPD0gaV9fNDsgKytpX18pIHsKKwkJCSAgICBkX2NuamcoJnpfXzMsICZhW2wgKyBpX18gKyBqICogYV9kaW0xXSk7CisJCQkgICAgaV9fMSA9IGl4OworCQkJICAgIHpfXzIuciA9IHpfXzMuciAqIHhbaV9fMV0uciAtIHpfXzMuaSAqIHhbaV9fMV0uaSwgCisJCQkJICAgIHpfXzIuaSA9IHpfXzMuciAqIHhbaV9fMV0uaSArIHpfXzMuaSAqIHhbCisJCQkJICAgIGlfXzFdLnI7CisJCQkgICAgel9fMS5yID0gdGVtcC5yICsgel9fMi5yLCB6X18xLmkgPSB0ZW1wLmkgKyAKKwkJCQkgICAgel9fMi5pOworCQkJICAgIHRlbXAuciA9IHpfXzEuciwgdGVtcC5pID0gel9fMS5pOworCQkJICAgIGl4ICs9ICppbmN4OworLyogTDE5MDogKi8KKwkJCX0KKwkJICAgIH0KKwkJICAgIGlfXzQgPSBqeDsKKwkJICAgIHhbaV9fNF0uciA9IHRlbXAuciwgeFtpX180XS5pID0gdGVtcC5pOworCQkgICAganggKz0gKmluY3g7CisvKiBMMjAwOiAqLworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKKy8qICAgICBFbmQgb2YgWlRCTVYgLiAqLworCit9IC8qIHp0Ym12XyAqLworCmRpZmYgLS1naXQgYS9ibGFzL2ZvcnRyYW4vY29tcGxleGRvdHMuZiBiL2JsYXMvZm9ydHJhbi9jb21wbGV4ZG90cy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGE1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2ZvcnRyYW4vY29tcGxleGRvdHMuZgpAQCAtMCwwICsxLDQzIEBACisgICAgICBDT01QTEVYIEZVTkNUSU9OIENET1RDKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgQ09NUExFWCBDWCgqKSxDWSgqKQorICAgICAgQ09NUExFWCBSRVMKKyAgICAgIEVYVEVSTkFMIENET1RDVworICAgICAgCisgICAgICBDQUxMIENET1RDVyhOLENYLElOQ1gsQ1ksSU5DWSxSRVMpCisgICAgICBDRE9UQyA9IFJFUworICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIAorICAgICAgQ09NUExFWCBGVU5DVElPTiBDRE9UVShOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyAgICAgIENPTVBMRVggQ1goKiksQ1koKikKKyAgICAgIENPTVBMRVggUkVTCisgICAgICBFWFRFUk5BTCBDRE9UVVcKKyAgICAgIAorICAgICAgQ0FMTCBDRE9UVVcoTixDWCxJTkNYLENZLElOQ1ksUkVTKQorICAgICAgQ0RPVFUgPSBSRVMKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICAKKyAgICAgIERPVUJMRSBDT01QTEVYIEZVTkNUSU9OIFpET1RDKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgRE9VQkxFIENPTVBMRVggQ1goKiksQ1koKikKKyAgICAgIERPVUJMRSBDT01QTEVYIFJFUworICAgICAgRVhURVJOQUwgWkRPVENXCisgICAgICAKKyAgICAgIENBTEwgWkRPVENXKE4sQ1gsSU5DWCxDWSxJTkNZLFJFUykKKyAgICAgIFpET1RDID0gUkVTCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgCisgICAgICBET1VCTEUgQ09NUExFWCBGVU5DVElPTiBaRE9UVShOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyAgICAgIERPVUJMRSBDT01QTEVYIENYKCopLENZKCopCisgICAgICBET1VCTEUgQ09NUExFWCBSRVMKKyAgICAgIEVYVEVSTkFMIFpET1RVVworICAgICAgCisgICAgICBDQUxMIFpET1RVVyhOLENYLElOQ1gsQ1ksSU5DWSxSRVMpCisgICAgICBaRE9UVSA9IFJFUworICAgICAgUkVUVVJOCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvbGV2ZWwxX2NwbHhfaW1wbC5oIGIvYmxhcy9sZXZlbDFfY3BseF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5ZjViYQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvbGV2ZWwxX2NwbHhfaW1wbC5oCkBAIC0wLDAgKzEsMTMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitzdHJ1Y3Qgc2NhbGFyX25vcm0xX29wIHsKKyAgdHlwZWRlZiBSZWFsU2NhbGFyIHJlc3VsdF90eXBlOworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfbm9ybTFfb3ApCisgIGlubGluZSBSZWFsU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gbnVtZXh0Ojpub3JtMShhKTsgfQorfTsKK25hbWVzcGFjZSBFaWdlbiB7CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX25vcm0xX29wID4KKyAgICB7CisgICAgICBlbnVtIHsgQ29zdCA9IDMgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gMCB9OworICAgIH07CisgIH0KK30KKworLy8gY29tcHV0ZXMgdGhlIHN1bSBvZiBtYWduaXR1ZGVzIG9mIGFsbCB2ZWN0b3IgZWxlbWVudHMgb3IsIGZvciBhIGNvbXBsZXggdmVjdG9yIHgsIHRoZSBzdW0KKy8vIHJlcyA9IHxSZXgxfCArIHxJbXgxfCArIHxSZXgyfCArIHxJbXgyfCArIC4uLiArIHxSZXhufCArIHxJbXhufCwgd2hlcmUgeCBpcyBhIHZlY3RvciBvZiBvcmRlciBuCitSZWFsU2NhbGFyIEVJR0VOX0NBVChFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLFNDQUxBUl9TVUZGSVgpLGFzdW1fKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX19hc3VtICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CisgIENvbXBsZXgqIHggPSByZWludGVycHJldF9jYXN0PENvbXBsZXgqPihweCk7CisKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIGlmKCppbmN4PT0xKSAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4pLnVuYXJ5RXhwcjxzY2FsYXJfbm9ybTFfb3A+KCkuc3VtKCk7CisgIGVsc2UgICAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKS51bmFyeUV4cHI8c2NhbGFyX25vcm0xX29wPigpLnN1bSgpOworfQorCisvLyBjb21wdXRlcyBhIGRvdCBwcm9kdWN0IG9mIGEgY29uanVnYXRlZCB2ZWN0b3Igd2l0aCBhbm90aGVyIHZlY3Rvci4KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZG90Y3cpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciogcHJlcykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfZG90YyAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKKyAgU2NhbGFyKiByZXMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHByZXMpOworCisgIGlmKCpuPD0wKQorICB7CisgICAgKnJlcyA9IFNjYWxhcigwKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKworICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuKS5kb3QobWFrZV92ZWN0b3IoeSwqbikpKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApICpyZXMgPSAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkuZG90KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuZG90KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmRvdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuZG90KG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkpKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGNvbXB1dGVzIGEgdmVjdG9yLXZlY3RvciBkb3QgcHJvZHVjdCB3aXRob3V0IGNvbXBsZXggY29uanVnYXRpb24uCitpbnQgRUlHRU5fQkxBU19GVU5DKGRvdHV3KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIqIHByZXMpCit7CisgIFNjYWxhciogcmVzID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwcmVzKTsKKworICBpZigqbjw9MCkKKyAgeworICAgICpyZXMgPSBTY2FsYXIoMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgICpyZXMgPSAobWFrZV92ZWN0b3IoeCwqbikuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4pKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeT4wKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k8MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CisgIHJldHVybiAwOworfQorCitSZWFsU2NhbGFyIEVJR0VOX0NBVChFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLFNDQUxBUl9TVUZGSVgpLG5ybTJfKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX19ucm0yICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKworICBpZigqaW5jeD09MSkKKyAgICByZXR1cm4gbWFrZV92ZWN0b3IoeCwqbikuc3RhYmxlTm9ybSgpOworCisgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5zdGFibGVOb3JtKCk7Cit9CisKK2ludCBFSUdFTl9DQVQoRUlHRU5fQ0FUKFNDQUxBUl9TVUZGSVgsUkVBTF9TQ0FMQVJfU1VGRklYKSxyb3RfKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBjLCBSZWFsU2NhbGFyICpwcykKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgUmVhbFNjYWxhciBjID0gKnBjOworICBSZWFsU2NhbGFyIHMgPSAqcHM7CisKKyAgU3RyaWRlZFZlY3RvclR5cGUgdngobWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpKTsKKyAgU3RyaWRlZFZlY3RvclR5cGUgdnkobWFrZV92ZWN0b3IoeSwqbixzdGQ6OmFicygqaW5jeSkpKTsKKworICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydngodngpOworICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydnkodnkpOworCisgIC8vIFRPRE8gaW1wbGVtZW50IG1peGVkIHJlYWwtc2NhbGFyIHJvdGF0aW9ucworICAgICAgIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShydngsIHZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgcnZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgdnksICBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworCisgIHJldHVybiAwOworfQorCitpbnQgRUlHRU5fQ0FUKEVJR0VOX0NBVChTQ0FMQVJfU1VGRklYLFJFQUxfU0NBTEFSX1NVRkZJWCksc2NhbF8pKGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQoreworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcGFscGhhOworCisvLyAgIHN0ZDo6Y2VyciA8PCAiX19zY2FsICIgPDwgKm4gPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworCisgIGlmKCppbmN4PT0xKSAgbWFrZV92ZWN0b3IoeCwqbikgKj0gYWxwaGE7CisgIGVsc2UgICAgICAgICAgbWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpICo9IGFscGhhOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDFfaW1wbC5oIGIvYmxhcy9sZXZlbDFfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTdiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMV9pbXBsLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoYXhweSkoY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnB4LCBjb25zdCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBjb25zdCBpbnQgKmluY3kpCit7CisgIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGFscGhhICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIGlmKCppbmN4PT0xICYmICppbmN5PT0xKSAgICBtYWtlX3ZlY3Rvcih5LCpuKSArPSBhbHBoYSAqIG1ha2VfdmVjdG9yKHgsKm4pOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k+MCkgbWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIG1ha2VfdmVjdG9yKHksKm4sKmluY3kpICs9IGFscGhhICogbWFrZV92ZWN0b3IoeCwqbiwtKmluY3gpLnJldmVyc2UoKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpOworCisgIHJldHVybiAwOworfQorCitpbnQgRUlHRU5fQkxBU19GVU5DKGNvcHkpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKworICAvLyBiZSBjYXJlZnVsbCwgKmluY3g9PTAgaXMgYWxsb3dlZCAhIQorICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkKKyAgICBtYWtlX3ZlY3Rvcih5LCpuKSA9IG1ha2VfdmVjdG9yKHgsKm4pOworICBlbHNlCisgIHsKKyAgICBpZigqaW5jeDwwKSB4ID0geCAtICgqbi0xKSooKmluY3gpOworICAgIGlmKCppbmN5PDApIHkgPSB5IC0gKCpuLTEpKigqaW5jeSk7CisgICAgZm9yKGludCBpPTA7aTwqbjsrK2kpCisgICAgeworICAgICAgKnkgPSAqeDsKKyAgICAgIHggKz0gKmluY3g7CisgICAgICB5ICs9ICppbmN5OworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgRUlHRU5fQ0FUKEVJR0VOX0NBVChpLFNDQUxBUl9TVUZGSVgpLGFtYXhfKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisKKyAgRGVuc2VJbmRleCByZXQ7CisgIGlmKCppbmN4PT0xKSAgbWFrZV92ZWN0b3IoeCwqbikuY3dpc2VBYnMoKS5tYXhDb2VmZigmcmV0KTsKKyAgZWxzZSAgICAgICAgICBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuY3dpc2VBYnMoKS5tYXhDb2VmZigmcmV0KTsKKyAgcmV0dXJuIGludChyZXQpKzE7Cit9CisKK2ludCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGksU0NBTEFSX1NVRkZJWCksYW1pbl8pKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKworICBEZW5zZUluZGV4IHJldDsKKyAgaWYoKmluY3g9PTEpICBtYWtlX3ZlY3Rvcih4LCpuKS5jd2lzZUFicygpLm1pbkNvZWZmKCZyZXQpOworICBlbHNlICAgICAgICAgIG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKS5jd2lzZUFicygpLm1pbkNvZWZmKCZyZXQpOworICByZXR1cm4gaW50KHJldCkrMTsKK30KKworaW50IEVJR0VOX0JMQVNfRlVOQyhyb3RnKShSZWFsU2NhbGFyICpwYSwgUmVhbFNjYWxhciAqcGIsIFJlYWxTY2FsYXIgKnBjLCBSZWFsU2NhbGFyICpwcykKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKworICBTY2FsYXImIGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciYgYiA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgUmVhbFNjYWxhciogYyA9IHBjOworICBTY2FsYXIqIHMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBzKTsKKworICAjaWYgIUlTQ09NUExFWAorICBTY2FsYXIgcix6OworICBTY2FsYXIgYWEgPSBhYnMoYSk7CisgIFNjYWxhciBhYiA9IGFicyhiKTsKKyAgaWYoKGFhK2FiKT09U2NhbGFyKDApKQorICB7CisgICAgKmMgPSAxOworICAgICpzID0gMDsKKyAgICByID0gMDsKKyAgICB6ID0gMDsKKyAgfQorICBlbHNlCisgIHsKKyAgICByID0gc3FydChhKmEgKyBiKmIpOworICAgIFNjYWxhciBhbWF4ID0gYWE+YWIgPyBhIDogYjsKKyAgICByID0gYW1heD4wID8gciA6IC1yOworICAgICpjID0gYS9yOworICAgICpzID0gYi9yOworICAgIHogPSAxOworICAgIGlmIChhYSA+IGFiKSB6ID0gKnM7CisgICAgaWYgKGFiID4gYWEgJiYgKmMhPVJlYWxTY2FsYXIoMCkpCisgICAgICB6ID0gU2NhbGFyKDEpLyAqYzsKKyAgfQorICAqcGEgPSByOworICAqcGIgPSB6OworICAjZWxzZQorICBTY2FsYXIgYWxwaGE7CisgIFJlYWxTY2FsYXIgbm9ybSxzY2FsZTsKKyAgaWYoYWJzKGEpPT1SZWFsU2NhbGFyKDApKQorICB7CisgICAgKmMgPSBSZWFsU2NhbGFyKDApOworICAgICpzID0gU2NhbGFyKDEpOworICAgIGEgPSBiOworICB9CisgIGVsc2UKKyAgeworICAgIHNjYWxlID0gYWJzKGEpICsgYWJzKGIpOworICAgIG5vcm0gPSBzY2FsZSpzcXJ0KChudW1leHQ6OmFiczIoYS9zY2FsZSkpICsgKG51bWV4dDo6YWJzMihiL3NjYWxlKSkpOworICAgIGFscGhhID0gYS9hYnMoYSk7CisgICAgKmMgPSBhYnMoYSkvbm9ybTsKKyAgICAqcyA9IGFscGhhKm51bWV4dDo6Y29uaihiKS9ub3JtOworICAgIGEgPSBhbHBoYSpub3JtOworICB9CisgICNlbmRpZgorCisvLyAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gcjsKKy8vICAgci5tYWtlR2l2ZW5zKGEsYik7CisvLyAgICpjID0gci5jKCk7CisvLyAgICpzID0gci5zKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc2NhbCkoaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKworICBpZigqaW5jeD09MSkgIG1ha2VfdmVjdG9yKHgsKm4pICo9IGFscGhhOworICBlbHNlICAgICAgICAgIG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKSAqPSBhbHBoYTsKKworICByZXR1cm4gMDsKK30KKworaW50IEVJR0VOX0JMQVNfRlVOQyhzd2FwKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgIG1ha2VfdmVjdG9yKHksKm4pLnN3YXAobWFrZV92ZWN0b3IoeCwqbikpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k+MCkgbWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkuc3dhcChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KSk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSBtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpLnN3YXAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgbWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkuc3dhcChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkuc3dhcChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oIGIvYmxhcy9sZXZlbDFfcmVhbF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1ODZkNQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvLyBjb21wdXRlcyB0aGUgc3VtIG9mIG1hZ25pdHVkZXMgb2YgYWxsIHZlY3RvciBlbGVtZW50cyBvciwgZm9yIGEgY29tcGxleCB2ZWN0b3IgeCwgdGhlIHN1bQorLy8gcmVzID0gfFJleDF8ICsgfElteDF8ICsgfFJleDJ8ICsgfElteDJ8ICsgLi4uICsgfFJleG58ICsgfElteG58LCB3aGVyZSB4IGlzIGEgdmVjdG9yIG9mIG9yZGVyIG4KK1JlYWxTY2FsYXIgRUlHRU5fQkxBU19GVU5DKGFzdW0pKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfYXN1bSAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworCisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBpZigqaW5jeD09MSkgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuKS5jd2lzZUFicygpLnN1bSgpOworICBlbHNlICAgICAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuY3dpc2VBYnMoKS5zdW0oKTsKK30KKworLy8gY29tcHV0ZXMgYSB2ZWN0b3ItdmVjdG9yIGRvdCBwcm9kdWN0LgorU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhkb3QpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfZG90ICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICIgIiA8PCAqaW5jeSA8PCAiXG4iOworCisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbikuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4pKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeT4wKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k8MCkgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CisgIGVsc2UgcmV0dXJuIDA7Cit9CisKKy8vIGNvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbm9ybSBvZiBhIHZlY3Rvci4KKy8vIEZJWE1FCitTY2FsYXIgRUlHRU5fQkxBU19GVU5DKG5ybTIpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfbnJtMiAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisKKyAgaWYoKmluY3g9PTEpICByZXR1cm4gbWFrZV92ZWN0b3IoeCwqbikuc3RhYmxlTm9ybSgpOworICBlbHNlICAgICAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuc3RhYmxlTm9ybSgpOworfQorCitpbnQgRUlHRU5fQkxBU19GVU5DKHJvdCkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYywgUmVhbFNjYWxhciAqcHMpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX3JvdCAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGMgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHMpOworCisgIFN0cmlkZWRWZWN0b3JUeXBlIHZ4KG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKSk7CisgIFN0cmlkZWRWZWN0b3JUeXBlIHZ5KG1ha2VfdmVjdG9yKHksKm4sc3RkOjphYnMoKmluY3kpKSk7CisKKyAgUmV2ZXJzZTxTdHJpZGVkVmVjdG9yVHlwZT4gcnZ4KHZ4KTsKKyAgUmV2ZXJzZTxTdHJpZGVkVmVjdG9yVHlwZT4gcnZ5KHZ5KTsKKworICAgICAgIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShydngsIHZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgcnZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgdnksICBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMscykpOworCisKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisvLyBwZXJmb3JtcyByb3RhdGlvbiBvZiBwb2ludHMgaW4gdGhlIG1vZGlmaWVkIHBsYW5lLgoraW50IEVJR0VOX0JMQVNfRlVOQyhyb3RtKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBhcmFtKQoreworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgLy8gVE9ETworCisgIHJldHVybiAwOworfQorCisvLyBjb21wdXRlcyB0aGUgbW9kaWZpZWQgcGFyYW1ldGVycyBmb3IgYSBHaXZlbnMgcm90YXRpb24uCitpbnQgRUlHRU5fQkxBU19GVU5DKHJvdG1nKShSZWFsU2NhbGFyICpkMSwgUmVhbFNjYWxhciAqZDIsIFJlYWxTY2FsYXIgKngxLCBSZWFsU2NhbGFyICp4MiwgUmVhbFNjYWxhciAqcGFyYW0pCit7CisgIC8vIFRPRE8KKworICByZXR1cm4gMDsKK30KKyovCmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMl9jcGx4X2ltcGwuaCBiL2JsYXMvbGV2ZWwyX2NwbHhfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2U2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMl9jcGx4X2ltcGwuaApAQCAtMCwwICsxLDM2MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyoqICBaSEVNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3IgIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeC4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoaGVtdikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnB5LCBjb25zdCBpbnQgKmluY3kpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGNvbnN0IFNjYWxhciosIGludCwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKiwgU2NhbGFyKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7CisgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgKGludGVybmFsOjpzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U2NhbGFyLGludCxDb2xNYWpvcixVcHBlcixmYWxzZSxmYWxzZT46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgKGludGVybmFsOjpzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U2NhbGFyLGludCxDb2xNYWpvcixMb3dlcixmYWxzZSxmYWxzZT46OnJ1biksCisgIH07CisKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGFscGhhICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYmV0YSk7CisKKyAgLy8gY2hlY2sgYXJndW1lbnRzCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICBpbmZvID0gMTA7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRU1WICIsJmluZm8sNik7CisKKyAgaWYoKm49PTApCisgICAgcmV0dXJuIDE7CisKKyAgY29uc3QgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgU2NhbGFyKiBhY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICBpZihiZXRhIT1TY2FsYXIoMSkpCisgIHsKKyAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1ha2VfdmVjdG9yKGFjdHVhbF95LCAqbikuc2V0WmVybygpOworICAgIGVsc2UgICAgICAgICAgICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3ksICpuKSAqPSBiZXRhOworICB9CisKKyAgaWYoYWxwaGEhPVNjYWxhcigwKSkKKyAgeworICAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7CisgICAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBmdW5jW2NvZGVdKCpuLCBhLCAqbGRhLCBhY3R1YWxfeCwgYWN0dWFsX3ksIGFscGhhKTsKKyAgfQorCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKKyAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LCpuLCppbmN5KTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBaSEJNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3IgIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLgorICAqLworLy8gaW50IEVJR0VOX0JMQVNfRlVOQyhoYm12KShjaGFyICp1cGxvLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmEsIGludCAqbGRhLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKKy8vIHsKKy8vICAgcmV0dXJuIDE7CisvLyB9CisKKy8qKiAgWkhQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhwbXYpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKKy8vIHsKKy8vICAgcmV0dXJuIDE7CisvLyB9CisKKy8qKiAgWkhQUiAgICBwZXJmb3JtcyB0aGUgaGVybWl0aWFuIHJhbmsgMSBvcGVyYXRpb24KKyAgKgorICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgorICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGhwcikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnBhcCkKK3sKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgUmVhbFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLENvbmo+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLExvd2VyLGZhbHNlLENvbmo+OjpydW4pLAorICB9OworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBSZWFsU2NhbGFyIGFscGhhID0gKnBhbHBoYTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIUFIgICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVNjYWxhcigwKSkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICpuLCAqaW5jeCk7CisKKyAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKKyAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQorICAgIHJldHVybiAwOworCisgIGZ1bmNbY29kZV0oKm4sIGFwLCB4X2NweSwgYWxwaGEpOworCisgIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiAgWkhQUjIgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAyIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIGNvbmpnKCBhbHBoYSApKnkqY29uamcoIHgnICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbgorICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGhwcjIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYXApCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChpbnRlcm5hbDo6cGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsaW50LFVwcGVyPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAoaW50ZXJuYWw6OnBhY2tlZF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLGludCxMb3dlcj46OnJ1biksCisgIH07CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkhQUjIgIiwmaW5mbyw2KTsKKworICBpZihhbHBoYT09U2NhbGFyKDApKQorICAgIHJldHVybiAxOworCisgIFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCAqbiwgKmluY3kpOworCisgIGludCBjb2RlID0gVVBMTygqdXBsbyk7CisgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCBhcCwgeF9jcHksIHlfY3B5LCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBaSEVSICAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDEgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB4JyApICsgQSwKKyAgKgorICAqICB3aGVyZSBhbHBoYSBpcyBhIHJlYWwgc2NhbGFyLCB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kIEEgaXMgYW4KKyAgKiAgbiBieSBuIGhlcm1pdGlhbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGhlcikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSkKK3sKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgU2NhbGFyKiwgaW50LCBjb25zdCBTY2FsYXIqLCBjb25zdCBTY2FsYXIqLCBjb25zdCBTY2FsYXImKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7CisgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgKHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLENvbmo+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixMb3dlcixmYWxzZSxDb25qPjo6cnVuKSwKKyAgfTsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxSZWFsU2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVIgICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVJlYWxTY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworCisgIGludCBjb2RlID0gVVBMTygqdXBsbyk7CisgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCBhLCAqbGRhLCB4X2NweSwgeF9jcHksIGFscGhhKTsKKworICBtYXRyaXgoYSwqbiwqbiwqbGRhKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBaSEVSMiAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDIgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB5JyApICsgY29uamcoIGFscGhhICkqeSpjb25qZyggeCcgKSArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4KKyAgKiAgYnkgbiBoZXJtaXRpYW4gbWF0cml4LgorICAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsVXBwZXI+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsTG93ZXI+OjpydW4pLAorICB9OworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVSMiAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CisKKyAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKKyAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQorICAgIHJldHVybiAwOworCisgIGZ1bmNbY29kZV0oKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOworCisgIG1hdHJpeChhLCpuLCpuLCpsZGEpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworICBpZih5X2NweSE9eSkgIGRlbGV0ZVtdIHlfY3B5OworCisgIHJldHVybiAxOworfQorCisvKiogIFpHRVJVICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKKyAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGdlcnUpKGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSkKK3sKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJHRVJVICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVNjYWxhcigwKSkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm0sKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksKm4sKmluY3kpOworCisgIGludGVybmFsOjpnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLGZhbHNlLGZhbHNlPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgeF9jcHksIHlfY3B5LCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBaR0VSQyAgcGVyZm9ybXMgdGhlIHJhbmsgMSBvcGVyYXRpb24KKyAgKgorICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHknICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGlzIGFuIG0gZWxlbWVudCB2ZWN0b3IsIHkgaXMgYW4gbiBlbGVtZW50CisgICogIHZlY3RvciBhbmQgQSBpcyBhbiBtIGJ5IG4gbWF0cml4LgorICAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhnZXJjKShpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEpCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICAgICAgIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VSQyAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCptLCppbmN4KTsKKyAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICBpbnRlcm5hbDo6Z2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixmYWxzZSxDb25qPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgeF9jcHksIHlfY3B5LCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2JsYXMvbGV2ZWwyX2ltcGwuaCBiL2JsYXMvbGV2ZWwyX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzNmNDBiCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9sZXZlbDJfaW1wbC5oCkBAIC0wLDAgKzEsNTUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgYm9vbCBDb25qdWdhdGVSaHM+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfd3JhcHBlcgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scyxjb25zdCBTY2FsYXIgKmxocywgSW5kZXggbGhzU3RyaWRlLCBjb25zdCBTY2FsYXIgKnJocywgSW5kZXggcmhzSW5jciwgU2NhbGFyKiByZXMsIEluZGV4IHJlc0luY3IsIFNjYWxhciBhbHBoYSkKKyAgeworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LFN0b3JhZ2VPcmRlcj4gTGhzTWFwcGVyOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LFJvd01ham9yPiBSaHNNYXBwZXI7CisgICAgCisgICAgaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICAgIDxJbmRleCxTY2FsYXIsTGhzTWFwcGVyLFN0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsU2NhbGFyLFJoc01hcHBlcixDb25qdWdhdGVSaHM+OjpydW4oCisgICAgICAgIHJvd3MsIGNvbHMsIExoc01hcHBlcihsaHMsIGxoc1N0cmlkZSksIFJoc01hcHBlcihyaHMsIHJoc0luY3IpLCByZXMsIHJlc0luY3IsIGFscGhhKTsKKyAgfQorfTsKKworaW50IEVJR0VOX0JMQVNfRlVOQyhnZW12KShjb25zdCBjaGFyICpvcGEsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqaW5jYiwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmluY2MpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCAsIFNjYWxhciAqLCBpbnQsIFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzRdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSCisgICAgKGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3dyYXBwZXI8aW50LFNjYWxhcixDb2xNYWpvcixmYWxzZSxmYWxzZT46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAKKyAgICAoZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfd3JhcHBlcjxpbnQsU2NhbGFyLFJvd01ham9yLGZhbHNlLGZhbHNlPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKIAorICAgIChnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF93cmFwcGVyPGludCxTY2FsYXIsUm93TWFqb3IsQ29uaiAsZmFsc2U+OjpydW4pLAorICAgIDAKKyAgfTsKKworICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKKyAgY29uc3QgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYik7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKworICAvLyBjaGVjayBhcmd1bWVudHMKKyAgaW50IGluZm8gPSAwOworICBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgIGluZm8gPSA2OworICBlbHNlIGlmKCppbmNiPT0wKSAgICAgICAgICAgICAgIGluZm8gPSA4OworICBlbHNlIGlmKCppbmNjPT0wKSAgICAgICAgICAgICAgIGluZm8gPSAxMTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFTVYgIiwmaW5mbyw2KTsKKworICBpZigqbT09MCB8fCAqbj09MCB8fCAoYWxwaGE9PVNjYWxhcigwKSAmJiBiZXRhPT1TY2FsYXIoMSkpKQorICAgIHJldHVybiAwOworCisgIGludCBhY3R1YWxfbSA9ICptOworICBpbnQgYWN0dWFsX24gPSAqbjsKKyAgaW50IGNvZGUgPSBPUCgqb3BhKTsKKyAgaWYoY29kZSE9Tk9UUikKKyAgICBzdGQ6OnN3YXAoYWN0dWFsX20sYWN0dWFsX24pOworCisgIGNvbnN0IFNjYWxhciogYWN0dWFsX2IgPSBnZXRfY29tcGFjdF92ZWN0b3IoYixhY3R1YWxfbiwqaW5jYik7CisgIFNjYWxhciogYWN0dWFsX2MgPSBnZXRfY29tcGFjdF92ZWN0b3IoYyxhY3R1YWxfbSwqaW5jYyk7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYWtlX3ZlY3RvcihhY3R1YWxfYywgYWN0dWFsX20pLnNldFplcm8oKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF9jLCBhY3R1YWxfbSkgKj0gYmV0YTsKKyAgfQorCisgIGlmKGNvZGU+PTQgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKGFjdHVhbF9tLCBhY3R1YWxfbiwgYSwgKmxkYSwgYWN0dWFsX2IsIDEsIGFjdHVhbF9jLCAxLCBhbHBoYSk7CisKKyAgaWYoYWN0dWFsX2IhPWIpIGRlbGV0ZVtdIGFjdHVhbF9iOworICBpZihhY3R1YWxfYyE9YykgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF9jLGMsYWN0dWFsX20sKmluY2MpOworCisgIHJldHVybiAxOworfQorCitpbnQgRUlHRU5fQkxBU19GVU5DKHRyc3YpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wYSwgY29uc3QgY2hhciAqZGlhZywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmluY2IpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGNvbnN0IFNjYWxhciAqLCBpbnQsIFNjYWxhciAqKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMTZdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgIGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgQ29uaiwgUm93TWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgIGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBDb25qLCBSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLENvbmosIFJvd01ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3I+OjpydW4pLAorICAgIDAKKyAgfTsKKworICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA2OworICBlbHNlIGlmKCppbmNiPT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA4OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiVFJTViAiLCZpbmZvLDYpOworCisgIFNjYWxhciogYWN0dWFsX2IgPSBnZXRfY29tcGFjdF92ZWN0b3IoYiwqbiwqaW5jYik7CisKKyAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKKyAgZnVuY1tjb2RlXSgqbiwgYSwgKmxkYSwgYWN0dWFsX2IpOworCisgIGlmKGFjdHVhbF9iIT1iKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2IsYiwqbiwqaW5jYik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgRUlHRU5fQkxBU19GVU5DKHRybXYpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wYSwgY29uc3QgY2hhciAqZGlhZywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmluY2IpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyJik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzE2XSA9IHsKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLENvbmosIFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAwCisgIH07CisKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNjsKKyAgZWxzZSBpZigqaW5jYj09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gODsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSTVYgIiwmaW5mbyw2KTsKKworICBpZigqbj09MCkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIGFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsKm4sKmluY2IpOworICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gcmVzKCpuKTsKKyAgcmVzLnNldFplcm8oKTsKKworICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOworICBpZihjb2RlPj0xNiB8fCBmdW5jW2NvZGVdPT0wKQorICAgIHJldHVybiAwOworCisgIGZ1bmNbY29kZV0oKm4sICpuLCBhLCAqbGRhLCBhY3R1YWxfYiwgMSwgcmVzLmRhdGEoKSwgMSwgU2NhbGFyKDEpKTsKKworICBjb3B5X2JhY2socmVzLmRhdGEoKSxiLCpuLCppbmNiKTsKKyAgaWYoYWN0dWFsX2IhPWIpIGRlbGV0ZVtdIGFjdHVhbF9iOworCisgIHJldHVybiAxOworfQorCisvKiogIEdCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCisgICoKKyAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICAgb3IgICB5IDo9IGFscGhhKkEnKnggKyBiZXRhKnksCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIHZlY3RvcnMgYW5kIEEgaXMgYW4KKyAgKiAgbSBieSBuIGJhbmQgbWF0cml4LCB3aXRoIGtsIHN1Yi1kaWFnb25hbHMgYW5kIGt1IHN1cGVyLWRpYWdvbmFscy4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2JtdikoY2hhciAqdHJhbnMsIGludCAqbSwgaW50ICpuLCBpbnQgKmtsLCBpbnQgKmt1LCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBjb25zdCBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworICBpbnQgY29lZmZfcm93cyA9ICprbCsqa3UrMTsKKworICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoT1AoKnRyYW5zKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKmtsPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmt1PDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxjb2VmZl9yb3dzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDg7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEwOworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMzsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdCTVYgIiwmaW5mbyw2KTsKKworICBpZigqbT09MCB8fCAqbj09MCB8fCAoYWxwaGE9PVNjYWxhcigwKSAmJiBiZXRhPT1TY2FsYXIoMSkpKQorICAgIHJldHVybiAwOworCisgIGludCBhY3R1YWxfbSA9ICptOworICBpbnQgYWN0dWFsX24gPSAqbjsKKyAgaWYoT1AoKnRyYW5zKSE9Tk9UUikKKyAgICBzdGQ6OnN3YXAoYWN0dWFsX20sYWN0dWFsX24pOworCisgIGNvbnN0IFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCxhY3R1YWxfbiwqaW5jeCk7CisgIFNjYWxhciogYWN0dWFsX3kgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSxhY3R1YWxfbSwqaW5jeSk7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYWtlX3ZlY3RvcihhY3R1YWxfeSwgYWN0dWFsX20pLnNldFplcm8oKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCBhY3R1YWxfbSkgKj0gYmV0YTsKKyAgfQorCisgIENvbnN0TWF0cml4VHlwZSBtYXRfY29lZmZzKGEsY29lZmZfcm93cywqbiwqbGRhKTsKKworICBpbnQgbmIgPSBzdGQ6Om1pbigqbiwoKm0pKygqa3UpKTsKKyAgZm9yKGludCBqPTA7IGo8bmI7ICsraikKKyAgeworICAgIGludCBzdGFydCA9IHN0ZDo6bWF4KDAsaiAtICprdSk7CisgICAgaW50IGVuZCA9IHN0ZDo6bWluKCgqbSktMSxqICsgKmtsKTsKKyAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQgKyAxOworICAgIGludCBvZmZzZXQgPSAoKmt1KSAtIGogKyBzdGFydDsKKyAgICBpZihPUCgqdHJhbnMpPT1OT1RSKQorICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3krc3RhcnQsbGVuKSArPSAoYWxwaGEqYWN0dWFsX3hbal0pICogbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKTsKKyAgICBlbHNlIGlmKE9QKCp0cmFucyk9PVRSKQorICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikudHJhbnNwb3NlKCkgKiBtYWtlX3ZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgICBlbHNlCisgICAgICBhY3R1YWxfeVtqXSArPSBhbHBoYSAqICggbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKS5hZGpvaW50KCkgICAqIG1ha2VfdmVjdG9yKGFjdHVhbF94K3N0YXJ0LGxlbikgKS52YWx1ZSgpOworICB9CisKKyAgaWYoYWN0dWFsX3ghPXgpIGRlbGV0ZVtdIGFjdHVhbF94OworICBpZihhY3R1YWxfeSE9eSkgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF95LHksYWN0dWFsX20sKmluY3kpOworCisgIHJldHVybiAwOworfQorCisjaWYgMAorLyoqICBUQk1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucworICAqCisgICogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LAorICAqCisgICogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LAorICAqICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIGJhbmQgbWF0cml4LCB3aXRoICggayArIDEgKSBkaWFnb25hbHMuCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKHRibXYpKGNoYXIgKnVwbG8sIGNoYXIgKm9wYSwgY2hhciAqZGlhZywgaW50ICpuLCBpbnQgKmssIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBpbnQgY29lZmZfcm93cyA9ICprICsgMTsKKworICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxjb2VmZl9yb3dzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUQk1WICIsJmluZm8sNik7CisKKyAgaWYoKm49PTApCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGFjdHVhbF9uID0gKm47CisKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LGFjdHVhbF9uLCppbmN4KTsKKworICBNYXRyaXhUeXBlIG1hdF9jb2VmZnMoYSxjb2VmZl9yb3dzLCpuLCpsZGEpOworCisgIGludCBrdSA9IFVQTE8oKnVwbG8pPT1VUFBFUiA/ICprIDogMDsKKyAgaW50IGtsID0gVVBMTygqdXBsbyk9PUxPV0VSID8gKmsgOiAwOworCisgIGZvcihpbnQgaj0wOyBqPCpuOyArK2opCisgIHsKKyAgICBpbnQgc3RhcnQgPSBzdGQ6Om1heCgwLGogLSBrdSk7CisgICAgaW50IGVuZCA9IHN0ZDo6bWluKCgqbSktMSxqICsga2wpOworICAgIGludCBsZW4gPSBlbmQgLSBzdGFydCArIDE7CisgICAgaW50IG9mZnNldCA9IChrdSkgLSBqICsgc3RhcnQ7CisKKyAgICBpZihPUCgqdHJhbnMpPT1OT1RSKQorICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3krc3RhcnQsbGVuKSArPSAoYWxwaGEqYWN0dWFsX3hbal0pICogbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKTsKKyAgICBlbHNlIGlmKE9QKCp0cmFucyk9PVRSKQorICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikudHJhbnNwb3NlKCkgKiBtYWtlX3ZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgICBlbHNlCisgICAgICBhY3R1YWxfeVtqXSArPSBhbHBoYSAqICggbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKS5hZGpvaW50KCkgICAqIG1ha2VfdmVjdG9yKGFjdHVhbF94K3N0YXJ0LGxlbikgKS52YWx1ZSgpOworICB9CisKKyAgaWYoYWN0dWFsX3ghPXgpIGRlbGV0ZVtdIGFjdHVhbF94OworICBpZihhY3R1YWxfeSE9eSkgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF95LHksYWN0dWFsX20sKmluY3kpOworCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qKiAgRFRCU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCisgICoKKyAgKiAgICAgQSp4ID0gYiwgICBvciAgIEEnKnggPSBiLAorICAqCisgICogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgorICAqICBub24tdW5pdCwgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkKKyAgKiAgZGlhZ29uYWxzLgorICAqCisgICogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcworICAqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkModGJzdikoY2hhciAqdXBsbywgY2hhciAqb3AsIGNoYXIgKmRpYWcsIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICopOworICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1sxNl0gPSB7CisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLENvbmosIFNjYWxhcixSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsQ29uaiwgU2NhbGFyLFJvd01ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixDb25qLCBTY2FsYXIsUm93TWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLENvbmosIFNjYWxhcixSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgfTsKKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIGludCBjb2VmZl9yb3dzID0gKmsrMTsKKworICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxjb2VmZl9yb3dzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUQlNWICIsJmluZm8sNik7CisKKyAgaWYoKm49PTAgfHwgKCprPT0wICYmIERJQUcoKmRpYWcpPT1VTklUKSkKKyAgICByZXR1cm4gMDsKKworICBpbnQgYWN0dWFsX24gPSAqbjsKKworICBTY2FsYXIqIGFjdHVhbF94ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsYWN0dWFsX24sKmluY3gpOworCisgIGludCBjb2RlID0gT1AoKm9wKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKKyAgaWYoY29kZT49MTYgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCAqaywgYSwgKmxkYSwgYWN0dWFsX3gpOworCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3gseCxhY3R1YWxfbiwqaW5jeCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKiAgRFRQTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCisgICoKKyAgKiAgICAgeCA6PSBBKngsICAgb3IgICB4IDo9IEEnKngsCisgICoKKyAgKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsCisgICogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkModHBtdikoY2hhciAqdXBsbywgY2hhciAqb3BhLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhcCwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKiwgU2NhbGFyKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMTZdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8MCwgICAgICAgU2NhbGFyLENvbmosIFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfFVuaXREaWFnLFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIDAKKyAgfTsKKworICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUUE1WICIsJmluZm8sNik7CisKKyAgaWYoKm49PTApCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHJlcygqbik7CisgIHJlcy5zZXRaZXJvKCk7CisKKyAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKKyAgaWYoY29kZT49MTYgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCBhcCwgYWN0dWFsX3gsIHJlcy5kYXRhKCksIFNjYWxhcigxKSk7CisKKyAgY29weV9iYWNrKHJlcy5kYXRhKCkseCwqbiwqaW5jeCk7CisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKKworICByZXR1cm4gMTsKK30KKworLyoqICBEVFBTViAgc29sdmVzIG9uZSBvZiB0aGUgc3lzdGVtcyBvZiBlcXVhdGlvbnMKKyAgKgorICAqICAgICBBKnggPSBiLCAgIG9yICAgQScqeCA9IGIsCisgICoKKyAgKiAgd2hlcmUgYiBhbmQgeCBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yCisgICogIG5vbi11bml0LCB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICoKKyAgKiAgTm8gdGVzdCBmb3Igc2luZ3VsYXJpdHkgb3IgbmVhci1zaW5ndWxhcml0eSBpcyBpbmNsdWRlZCBpbiB0aGlzCisgICogIHJvdXRpbmUuIFN1Y2ggdGVzdHMgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICAqLworaW50IEVJR0VOX0JMQVNfRlVOQyh0cHN2KShjaGFyICp1cGxvLCBjaGFyICpvcGEsIGNoYXIgKmRpYWcsIGludCAqbiwgUmVhbFNjYWxhciAqcGFwLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIqLCBTY2FsYXIqKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMTZdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgQ29uaiwgUm93TWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBmYWxzZSxSb3dNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBDb25qLCBSb3dNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLENvbmosIFJvd01ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3I+OjpydW4pLAorICAgIDAKKyAgfTsKKworICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUUFNWICIsJmluZm8sNik7CisKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKKworICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOworICBmdW5jW2NvZGVdKCpuLCBhcCwgYWN0dWFsX3gpOworCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3gseCwqbiwqaW5jeCk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMl9yZWFsX2ltcGwuaCBiL2JsYXMvbGV2ZWwyX3JlYWxfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjBmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMl9yZWFsX2ltcGwuaApAQCAtMCwwICsxLDMwNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLy8geSA9IGFscGhhKkEqeCArIGJldGEqeQoraW50IEVJR0VOX0JMQVNfRlVOQyhzeW12KSAoY29uc3QgY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnB4LCBjb25zdCBpbnQgKmluY3gsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpweSwgY29uc3QgaW50ICppbmN5KQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIFNjYWxhciosIFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhcixpbnQsQ29sTWFqb3IsVXBwZXIsZmFsc2UsZmFsc2U+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhcixpbnQsQ29sTWFqb3IsTG93ZXIsZmFsc2UsZmFsc2U+OjpydW4pLAorICB9OworCisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBjb25zdCBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciBhbHBoYSAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOworICBTY2FsYXIgYmV0YSAgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworCisgIC8vIGNoZWNrIGFyZ3VtZW50cworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgaW5mbyA9IDEwOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lNViAiLCZpbmZvLDYpOworCisgIGlmKCpuPT0wKQorICAgIHJldHVybiAwOworCisgIGNvbnN0IFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7CisgIFNjYWxhciogYWN0dWFsX3kgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwqbiwqaW5jeSk7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYWtlX3ZlY3RvcihhY3R1YWxfeSwgKm4pLnNldFplcm8oKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCAqbikgKj0gYmV0YTsKKyAgfQorCisgIGludCBjb2RlID0gVVBMTygqdXBsbyk7CisgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCBhLCAqbGRhLCBhY3R1YWxfeCwgYWN0dWFsX3ksIGFscGhhKTsKKworICBpZihhY3R1YWxfeCE9eCkgZGVsZXRlW10gYWN0dWFsX3g7CisgIGlmKGFjdHVhbF95IT15KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3kseSwqbiwqaW5jeSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEMgOj0gYWxwaGEqeCp4JyArIEMKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyKShjb25zdCBjaGFyICp1cGxvLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQoreworCisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGludCwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyJik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixVcHBlcixmYWxzZSxDb25qPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAoc2VsZmFkam9pbnRfcmFuazFfdXBkYXRlPFNjYWxhcixpbnQsQ29sTWFqb3IsTG93ZXIsZmFsc2UsQ29uaj46OnJ1biksCisgIH07CisKKyAgY29uc3QgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihweCk7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZUiAgIiwmaW5mbyw2KTsKKworICBpZigqbj09MCB8fCBhbHBoYT09U2NhbGFyKDApKSByZXR1cm4gMTsKKworICAvLyBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCAxLCBsZXQncyBjb3B5IGl0IHRvIGEgdGVtcG9yYXJ5IHZlY3RvciB0byBlbmFibGUgdmVjdG9yaXphdGlvbgorICBjb25zdCBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm4sKmluY3gpOworCisgIGludCBjb2RlID0gVVBMTygqdXBsbyk7CisgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCBjLCAqbGRjLCB4X2NweSwgeF9jcHksIGFscGhhKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworCisgIHJldHVybiAxOworfQorCisvLyBDIDo9IGFscGhhKngqeScgKyBhbHBoYSp5KngnICsgQworaW50IEVJR0VOX0JMQVNfRlVOQyhzeXIyKShjb25zdCBjaGFyICp1cGxvLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgY29uc3QgUmVhbFNjYWxhciAqcHksIGNvbnN0IGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIFNjYWxhcik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsVXBwZXI+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsTG93ZXI+OjpydW4pLAorICB9OworCisgIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOworICBjb25zdCBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGM8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lSMiAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgY29uc3QgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgY29uc3QgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOworICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCisgICAgcmV0dXJuIDA7CisKKyAgZnVuY1tjb2RlXSgqbiwgYywgKmxkYywgeF9jcHksIHlfY3B5LCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworLy8gICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOworLy8gICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCisvLyAgICAgcmV0dXJuIDA7CisKKy8vICAgZnVuY1tjb2RlXSgqbiwgYSwgKmluY2EsIGIsICppbmNiLCBjLCAqbGRjLCBhbHBoYSk7CisgIHJldHVybiAxOworfQorCisvKiogIERTQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorICAqICBBIGlzIGFuIG4gYnkgbiBzeW1tZXRyaWMgYmFuZCBtYXRyaXgsIHdpdGggayBzdXBlci1kaWFnb25hbHMuCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKHNibXYpKCBjaGFyICp1cGxvLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmEsIGludCAqbGRhLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqeCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpiZXRhLCBSZWFsU2NhbGFyICp5LCBpbnQgKmluY3kpCisvLyB7CisvLyAgIHJldHVybiAxOworLy8gfQorCisKKy8qKiAgRFNQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICoKKyAgKi8KKy8vIGludCBFSUdFTl9CTEFTX0ZVTkMoc3BtdikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqYXAsIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqYmV0YSwgUmVhbFNjYWxhciAqeSwgaW50ICppbmN5KQorLy8geworLy8gICByZXR1cm4gMTsKKy8vIH0KKworLyoqICBEU1BSICAgIHBlcmZvcm1zIHRoZSBzeW1tZXRyaWMgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp4JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCisgICogIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3ByKShjaGFyICp1cGxvLCBpbnQgKm4sIFNjYWxhciAqcGFscGhhLCBTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFNjYWxhciAqcGFwKQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBjb25zdCBTY2FsYXIqLCBTY2FsYXIpOworICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1syXSA9IHsKKyAgICAvLyBhcnJheSBpbmRleDogVVAKKyAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixVcHBlcixmYWxzZSxmYWxzZT46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgKGludGVybmFsOjpzZWxmYWRqb2ludF9wYWNrZWRfcmFuazFfdXBkYXRlPFNjYWxhcixpbnQsQ29sTWFqb3IsTG93ZXIsZmFsc2UsZmFsc2U+OjpydW4pLAorICB9OworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNQUiAgIiwmaW5mbyw2KTsKKworICBpZihhbHBoYT09U2NhbGFyKDApKQorICAgIHJldHVybiAxOworCisgIFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKworICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOworICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCisgICAgcmV0dXJuIDA7CisKKyAgZnVuY1tjb2RlXSgqbiwgYXAsIHhfY3B5LCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBEU1BSMiAgcGVyZm9ybXMgdGhlIHN5bW1ldHJpYyByYW5rIDIgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgQSA6PSBhbHBoYSp4KnknICsgYWxwaGEqeSp4JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuCisgICogIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3ByMikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBhcCkKK3sKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7CisgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgKGludGVybmFsOjpwYWNrZWRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsVXBwZXI+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgIChpbnRlcm5hbDo6cGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsaW50LExvd2VyPjo6cnVuKSwKKyAgfTsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciogYXAgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhcCk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1BSMiAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CisKKyAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKKyAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQorICAgIHJldHVybiAwOworCisgIGZ1bmNbY29kZV0oKm4sIGFwLCB4X2NweSwgeV9jcHksIGFscGhhKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworICBpZih5X2NweSE9eSkgIGRlbGV0ZVtdIHlfY3B5OworCisgIHJldHVybiAxOworfQorCisvKiogIERHRVIgICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKKyAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGdlcikoaW50ICptLCBpbnQgKm4sIFNjYWxhciAqcGFscGhhLCBTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFNjYWxhciAqcHksIGludCAqaW5jeSwgU2NhbGFyICpwYSwgaW50ICpsZGEpCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICAgICAgIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VSICAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCptLCppbmN4KTsKKyAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICBpbnRlcm5hbDo6Z2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixmYWxzZSxmYWxzZT46OnJ1bigqbSwgKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOworCisgIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7CisgIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsM19pbXBsLmggYi9ibGFzL2xldmVsM19pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvbGV2ZWwzX2ltcGwuaApAQCAtMCwwICsxLDcwMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAiY29tbW9uLmgiCisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VtbSkoY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpvcGIsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBpbnQgKmssIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLCBjb25zdCBSZWFsU2NhbGFyICpwYiwgY29uc3QgaW50ICpsZGIsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gZ2VtbSAiIDw8ICpvcGEgPDwgIiAiIDw8ICpvcGIgPDwgIiAiIDw8ICptIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGIgPDwgIiAiIDw8ICpsZGMgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIiAiIDw8ICpwYmV0YSA8PCAiXG4iOworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyLCBpbnRlcm5hbDo6bGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiwgRWlnZW46OmludGVybmFsOjpHZW1tUGFyYWxsZWxJbmZvPERlbnNlSW5kZXg+Kik7CisgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzEyXSA9IHsKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTk9UUiA8PCAyKQorICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTk9UUiA8PCAyKQorICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTk9UUiA8PCAyKQorICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChUUiAgIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixDb2xNYWpvcixmYWxzZSxTY2FsYXIsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChUUiAgIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixmYWxzZSxTY2FsYXIsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChUUiAgIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKEFESiAgPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKEFESiAgPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKEFESiAgPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLENvbmosIFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1biksCisgICAgMAorICB9OworCisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBjb25zdCBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiKTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBhbHBoYSAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOworICBTY2FsYXIgYmV0YSAgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3BiKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcGEpPT1OT1RSKT8qbToqaykpICAgICAgICAgICAgICAgICAgICBpbmZvID0gODsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKE9QKCpvcGIpPT1OT1RSKT8qazoqbikpICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTA7CisgIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEzOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VNTSAiLCZpbmZvLDYpOworCisgIGlmICgqbSA9PSAwIHx8ICpuID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOworICB9CisKKyAgaWYoKmsgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBibG9ja2luZygqbSwqbiwqaywxLHRydWUpOworCisgIGludCBjb2RlID0gT1AoKm9wYSkgfCAoT1AoKm9wYikgPDwgMik7CisgIGZ1bmNbY29kZV0oKm0sICpuLCAqaywgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFSUdFTl9CTEFTX0ZVTkModHJzbSkoY29uc3QgY2hhciAqc2lkZSwgY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpkaWFnLCBjb25zdCBpbnQgKm0sIGNvbnN0IGludCAqbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCAgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLCBSZWFsU2NhbGFyICpwYiwgY29uc3QgaW50ICpsZGIpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gdHJzbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wYSA8PCAiICIgPDwgKmRpYWcgPDwgIiAiIDw8ICptIDw8ICIsIiA8PCAqbiA8PCAiICIgPDwgKnBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKmxkYjw8ICJcbiI7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgICAgIGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgICAgQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLFwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LExvd2VyfDAsICAgICAgICAgIGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8MCwgICAgICAgICAgQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICAgICBDb25qLCBSb3dNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxSb3dNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfDAsICAgICAgICAgIENvbmosIFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxMb3dlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIFVwcGVyfFVuaXREaWFnLENvbmosIFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pLAorICAgIDAKKyAgfTsKKworICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisgIFNjYWxhciAgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoU0lERSgqc2lkZSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNjsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKFNJREUoKnNpZGUpPT1MRUZUKT8qbToqbikpICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTE7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUUlNNICIsJmluZm8sNik7CisKKyAgaWYoKm09PTAgfHwgKm49PTApCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChTSURFKCpzaWRlKSA8PCAyKSB8IChVUExPKCp1cGxvKSA8PCAzKSB8IChESUFHKCpkaWFnKSA8PCA0KTsKKworICBpZihTSURFKCpzaWRlKT09TEVGVCkKKyAgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsND4gYmxvY2tpbmcoKm0sKm4sKm0sMSxmYWxzZSk7CisgICAgZnVuY1tjb2RlXSgqbSwgKm4sIGEsICpsZGEsIGIsICpsZGIsIGJsb2NraW5nKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLDQ+IGJsb2NraW5nKCptLCpuLCpuLDEsZmFsc2UpOworICAgIGZ1bmNbY29kZV0oKm4sICptLCBhLCAqbGRhLCBiLCAqbGRiLCBibG9ja2luZyk7CisgIH0KKworICBpZihhbHBoYSE9U2NhbGFyKDEpKQorICAgIG1hdHJpeChiLCptLCpuLCpsZGIpICo9IGFscGhhOworCisgIHJldHVybiAwOworfQorCisKKy8vIGIgPSBhbHBoYSpvcChhKSpiICBmb3Igc2lkZSA9ICdMJ29yJ2wnCisvLyBiID0gYWxwaGEqYipvcChhKSAgZm9yIHNpZGUgPSAnUidvcidyJworaW50IEVJR0VOX0JMQVNfRlVOQyh0cm1tKShjb25zdCBjaGFyICpzaWRlLCBjb25zdCBjaGFyICp1cGxvLCBjb25zdCBjaGFyICpvcGEsIGNvbnN0IGNoYXIgKmRpYWcsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiKQoreworLy8gICBzdGQ6OmNlcnIgPDwgImluIHRybW0gIiA8PCAqc2lkZSA8PCAiICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcGEgPDwgIiAiIDw8ICpkaWFnIDw8ICIgIiA8PCAqbSA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGIgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIlxuIjsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMzJdID0geworICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgdHJ1ZSwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgdHJ1ZSwgUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgdHJ1ZSwgUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIHRydWUsIENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfDAsICAgICAgICAgIHRydWUsIFJvd01ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfDAsICAgICAgICAgIHRydWUsIFJvd01ham9yLENvbmosIENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyx0cnVlLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyx0cnVlLCBSb3dNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyx0cnVlLCBSb3dNYWpvcixDb25qLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLENvbmosIENvbE1ham9yPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsdHJ1ZSwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8VW5pdERpYWcsdHJ1ZSwgUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8VW5pdERpYWcsdHJ1ZSwgUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1biksCisgICAgMAorICB9OworCisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgU2NhbGFyICBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihTSURFKCpzaWRlKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA2OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoU0lERSgqc2lkZSk9PUxFRlQpPyptOipuKSkgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBlbHNlIGlmKCpsZGI8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSTU0gIiwmaW5mbyw2KTsKKworICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFNJREUoKnNpZGUpIDw8IDIpIHwgKFVQTE8oKnVwbG8pIDw8IDMpIHwgKERJQUcoKmRpYWcpIDw8IDQpOworCisgIGlmKCptPT0wIHx8ICpuPT0wKQorICAgIHJldHVybiAxOworCisgIC8vIEZJWE1FIGZpbmQgYSB3YXkgdG8gYXZvaWQgdGhpcyBjb3B5CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiB0bXAgPSBtYXRyaXgoYiwqbSwqbiwqbGRiKTsKKyAgbWF0cml4KGIsKm0sKm4sKmxkYikuc2V0WmVybygpOworCisgIGlmKFNJREUoKnNpZGUpPT1MRUZUKQorICB7CisgICAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYyw0PiBibG9ja2luZygqbSwqbiwqbSwxLGZhbHNlKTsKKyAgICBmdW5jW2NvZGVdKCptLCAqbiwgKm0sIGEsICpsZGEsIHRtcC5kYXRhKCksIHRtcC5vdXRlclN0cmlkZSgpLCBiLCAqbGRiLCBhbHBoYSwgYmxvY2tpbmcpOworICB9CisgIGVsc2UKKyAgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsND4gYmxvY2tpbmcoKm0sKm4sKm4sMSxmYWxzZSk7CisgICAgZnVuY1tjb2RlXSgqbSwgKm4sICpuLCB0bXAuZGF0YSgpLCB0bXAub3V0ZXJTdHJpZGUoKSwgYSwgKmxkYSwgYiwgKmxkYiwgYWxwaGEsIGJsb2NraW5nKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gYyA9IGFscGhhKmEqYiArIGJldGEqYyAgZm9yIHNpZGUgPSAnTCdvcidsJworLy8gYyA9IGFscGhhKmIqYSArIGJldGEqYyAgZm9yIHNpZGUgPSAnUidvcidyCitpbnQgRUlHRU5fQkxBU19GVU5DKHN5bW0pKGNvbnN0IGNoYXIgKnNpZGUsIGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQoreworLy8gICBzdGQ6OmNlcnIgPDwgImluIHN5bW0gIiA8PCAqc2lkZSA8PCAiICIgPDwgKnVwbG8gPDwgIiAiIDw8ICptIDw8ICJ4IiA8PCAqbiA8PCAiIGxkYToiIDw8ICpsZGEgPDwgIiBsZGI6IiA8PCAqbGRiIDw8ICIgbGRjOiIgPDwgKmxkYyA8PCAiIGFscGhhOiIgPDwgKnBhbHBoYSA8PCAiIGJldGE6IiA8PCAqcGJldGEgPDwgIlxuIjsKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIGNvbnN0IFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoU0lERSgqc2lkZSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKFNJREUoKnNpZGUpPT1MRUZUKT8qbToqbikpICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWU1NICIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOworICB9CisKKyAgaWYoKm09PTAgfHwgKm49PTApCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGludCBzaXplID0gKFNJREUoKnNpZGUpPT1MRUZUKSA/ICgqbSkgOiAoKm4pOworICAjaWYgSVNDT01QTEVYCisgIC8vIEZJWE1FIGFkZCBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY29tcGxleCBtYXRyaXgKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IG1hdEEoc2l6ZSxzaXplKTsKKyAgaWYoVVBMTygqdXBsbyk9PVVQKQorICB7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKTsKKyAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gbWF0cml4KGEsc2l6ZSxzaXplLCpsZGEpLnRyYW5zcG9zZSgpOworICB9CisgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICB7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKTsKKyAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gbWF0cml4KGEsc2l6ZSxzaXplLCpsZGEpLnRyYW5zcG9zZSgpOworICB9CisgIGlmKFNJREUoKnNpZGUpPT1MRUZUKQorICAgIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpICs9IGFscGhhICogbWF0QSAqIG1hdHJpeChiLCAqbSwgKm4sICpsZGIpOworICBlbHNlIGlmKFNJREUoKnNpZGUpPT1SSUdIVCkKKyAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSArPSBhbHBoYSAqIG1hdHJpeChiLCAqbSwgKm4sICpsZGIpICogbWF0QTsKKyAgI2Vsc2UKKyAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYz4gYmxvY2tpbmcoKm0sKm4sc2l6ZSwxLGZhbHNlKTsKKworICBpZihTSURFKCpzaWRlKT09TEVGVCkKKyAgICBpZihVUExPKCp1cGxvKT09VVApICAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFJvd01ham9yLHRydWUsZmFsc2UsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvcj46OnJ1bigqbSwgKm4sIGEsICpsZGEsIGIsICpsZGIsIGMsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBDb2xNYWpvcix0cnVlLGZhbHNlLCBDb2xNYWpvcixmYWxzZSxmYWxzZSwgQ29sTWFqb3I+OjpydW4oKm0sICpuLCBhLCAqbGRhLCBiLCAqbGRiLCBjLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYoU0lERSgqc2lkZSk9PVJJR0hUKQorICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkgICAgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIFJvd01ham9yLHRydWUsZmFsc2UsIENvbE1ham9yPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvcix0cnVlLGZhbHNlLCBDb2xNYWpvcj46OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAwOworICAjZW5kaWYKKworICByZXR1cm4gMDsKK30KKworLy8gYyA9IGFscGhhKmEqYScgKyBiZXRhKmMgIGZvciBvcCA9ICdOJ29yJ24nCisvLyBjID0gYWxwaGEqYScqYSArIGJldGEqYyAgZm9yIG9wID0gJ1Qnb3IndCcsJ0Mnb3InYycKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJpbiBzeXJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCAqcGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqcGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKKyAgI2lmICFJU0NPTVBMRVgKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbOF0gPSB7CisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb2xNYWpvcixDb25qLCBVcHBlcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLGZhbHNlLFNjYWxhcixDb2xNYWpvcixDb2xNYWpvcixDb25qLCBVcHBlcj46OnJ1biksCisgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLENvbmosIFNjYWxhcixDb2xNYWpvcixDb2xNYWpvcixmYWxzZSxVcHBlcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbE1ham9yLENvbmosIExvd2VyPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLENvbE1ham9yLENvbmosIExvd2VyPjo6cnVuKSwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLENvbE1ham9yLGZhbHNlLExvd2VyPjo6cnVuKSwKKyAgICAwCisgIH07CisgICNlbmRpZgorCisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3ApPT1JTlZBTElEIHx8IChJU0NPTVBMRVggJiYgT1AoKm9wKT09QURKKSApICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTA7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWVJLICIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICo9IGJldGE7CisgIH0KKworICBpZigqbj09MCB8fCAqaz09MCkKKyAgICByZXR1cm4gMDsKKworICAjaWYgSVNDT01QTEVYCisgIC8vIEZJWE1FIGFkZCBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY29tcGxleCBtYXRyaXgKKyAgaWYoVVBMTygqdXBsbyk9PVVQKQorICB7CisgICAgaWYoT1AoKm9wKT09Tk9UUikKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IGFscGhhICogbWF0cml4KGEsKm4sKmssKmxkYSkgKiBtYXRyaXgoYSwqbiwqaywqbGRhKS50cmFuc3Bvc2UoKTsKKyAgICBlbHNlCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSBhbHBoYSAqIG1hdHJpeChhLCprLCpuLCpsZGEpLnRyYW5zcG9zZSgpICogbWF0cml4KGEsKmssKm4sKmxkYSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoT1AoKm9wKT09Tk9UUikKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IGFscGhhICogbWF0cml4KGEsKm4sKmssKmxkYSkgKiBtYXRyaXgoYSwqbiwqaywqbGRhKS50cmFuc3Bvc2UoKTsKKyAgICBlbHNlCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBhbHBoYSAqIG1hdHJpeChhLCprLCpuLCpsZGEpLnRyYW5zcG9zZSgpICogbWF0cml4KGEsKmssKm4sKmxkYSk7CisgIH0KKyAgI2Vsc2UKKyAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYz4gYmxvY2tpbmcoKm4sKm4sKmssMSxmYWxzZSk7CisKKyAgaW50IGNvZGUgPSBPUCgqb3ApIHwgKFVQTE8oKnVwbG8pIDw8IDIpOworICBmdW5jW2NvZGVdKCpuLCAqaywgYSwgKmxkYSwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmInICsgYWxwaGEqYiphJyArIGJldGEqYyAgZm9yIG9wID0gJ04nb3InbicKKy8vIGMgPSBhbHBoYSphJypiICsgYWxwaGEqYicqYSArIGJldGEqYyAgZm9yIG9wID0gJ1Qnb3IndCcKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyMmspKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBpbnQgKm4sIGNvbnN0IGludCAqaywgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLCBjb25zdCBSZWFsU2NhbGFyICpwYiwgY29uc3QgaW50ICpsZGIsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCit7CisgIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOworICBjb25zdCBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiKTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKworLy8gICBzdGQ6OmNlcnIgPDwgImluIHN5cjJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKmxkYiA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3ApPT1JTlZBTElEIHx8IChJU0NPTVBMRVggJiYgT1AoKm9wKT09QURKKSApICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWVIySyIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICo9IGJldGE7CisgIH0KKworICBpZigqaz09MCkKKyAgICByZXR1cm4gMTsKKworICBpZihPUCgqb3ApPT1OT1RSKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgIHsKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICs9IGFscGhhICptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKQorICAgICAgICArICBhbHBoYSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS50cmFuc3Bvc2UoKTsKKyAgICB9CisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICArPSBhbHBoYSptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKQorICAgICAgICArICBhbHBoYSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS50cmFuc3Bvc2UoKTsKKyAgfQorICBlbHNlIGlmKE9QKCpvcCk9PVRSIHx8IE9QKCpvcCk9PUFESikKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICs9IGFscGhhKm1hdHJpeChhLCAqaywgKm4sICpsZGEpLnRyYW5zcG9zZSgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCisgICAgICAgICsgIGFscGhhKm1hdHJpeChiLCAqaywgKm4sICpsZGIpLnRyYW5zcG9zZSgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKKyAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkudHJhbnNwb3NlKCkqbWF0cml4KGIsICprLCAqbiwgKmxkYikKKyAgICAgICAgKyAgYWxwaGEqbWF0cml4KGIsICprLCAqbiwgKmxkYikudHJhbnNwb3NlKCkqbWF0cml4KGEsICprLCAqbiwgKmxkYSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisjaWYgSVNDT01QTEVYCisKKy8vIGMgPSBhbHBoYSphKmIgKyBiZXRhKmMgIGZvciBzaWRlID0gJ0wnb3InbCcKKy8vIGMgPSBhbHBoYSpiKmEgKyBiZXRhKmMgIGZvciBzaWRlID0gJ1Inb3IncgoraW50IEVJR0VOX0JMQVNfRlVOQyhoZW1tKShjb25zdCBjaGFyICpzaWRlLCBjb25zdCBjaGFyICp1cGxvLCBjb25zdCBpbnQgKm0sIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmxkYiwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKK3sKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIGNvbnN0IFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworCisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVtbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm0gPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoU0lERSgqc2lkZSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKFNJREUoKnNpZGUpPT1MRUZUKT8qbToqbikpICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRU1NICIsJmluZm8sNik7CisKKyAgaWYoYmV0YT09U2NhbGFyKDApKSAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgIGVsc2UgaWYoYmV0YSE9U2NhbGFyKDEpKSAgbWF0cml4KGMsICptLCAqbiwgKmxkYykgKj0gYmV0YTsKKworICBpZigqbT09MCB8fCAqbj09MCkKKyAgeworICAgIHJldHVybiAxOworICB9CisKKyAgaW50IHNpemUgPSAoU0lERSgqc2lkZSk9PUxFRlQpID8gKCptKSA6ICgqbik7CisgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+IGJsb2NraW5nKCptLCpuLHNpemUsMSxmYWxzZSk7CisKKyAgaWYoU0lERSgqc2lkZSk9PUxFRlQpCisgIHsKKyAgICBpZihVUExPKCp1cGxvKT09VVApICAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxSb3dNYWpvcix0cnVlLENvbmosICBDb2xNYWpvcixmYWxzZSxmYWxzZSwgQ29sTWFqb3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxDb2xNYWpvcix0cnVlLGZhbHNlLCBDb2xNYWpvcixmYWxzZSxmYWxzZSwgQ29sTWFqb3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UgaWYoU0lERSgqc2lkZSk9PVJJR0hUKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKSAgICAgICBtYXRyaXgoYywqbSwqbiwqbGRjKSArPSBhbHBoYSAqIG1hdHJpeChiLCptLCpuLCpsZGIpICogbWF0cml4KGEsKm4sKm4sKmxkYSkuc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOy8qaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LENvbE1ham9yLGZhbHNlLGZhbHNlLCBSb3dNYWpvcix0cnVlLENvbmosICBDb2xNYWpvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpydW4oKm0sICpuLCBiLCAqbGRiLCBhLCAqbGRhLCBjLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcpOyovCisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvLyBjID0gYWxwaGEqYSpjb25qKGEnKSArIGJldGEqYyAgZm9yIG9wID0gJ04nb3InbicKKy8vIGMgPSBhbHBoYSpjb25qKGEnKSphICsgYmV0YSpjICBmb3Igb3AgID0gJ0Mnb3InYycKK2ludCBFSUdFTl9CTEFTX0ZVTkMoaGVyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJpbiBoZXJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCAqcGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqcGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKKworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyJiwgaW50ZXJuYWw6OmxldmVsM19ibG9ja2luZzxTY2FsYXIsU2NhbGFyPiYpOworICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1s4XSA9IHsKKyAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosIENvbE1ham9yLFVwcGVyPjo6cnVuKSwKKyAgICAwLAorICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKQorICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsVXBwZXI+OjpydW4pLAorICAgIDAsCisgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpCisgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvcixMb3dlcj46OnJ1biksCisgICAgMCwKKyAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikKKyAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yLExvd2VyPjo6cnVuKSwKKyAgICAwCisgIH07CisKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBSZWFsU2NhbGFyIGFscGhhID0gKnBhbHBoYTsKKyAgUmVhbFNjYWxhciBiZXRhICA9ICpwYmV0YTsKKworLy8gICBzdGQ6OmNlcnIgPDwgImluIGhlcmsgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKChPUCgqb3ApPT1JTlZBTElEKSB8fCAoT1AoKm9wKT09VFIpKSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCprPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoT1AoKm9wKT09Tk9UUik/Km46KmspKSAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGM8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMDsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkhFUksgIiwmaW5mbyw2KTsKKworICBpbnQgY29kZSA9IE9QKCpvcCkgfCAoVVBMTygqdXBsbykgPDwgMik7CisKKyAgaWYoYmV0YSE9UmVhbFNjYWxhcigxKSkKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgKj0gYmV0YTsKKworICAgIGlmKGJldGEhPVNjYWxhcigwKSkKKyAgICB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLnJlYWwoKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOworICAgIH0KKyAgfQorCisgIGlmKCprPjAgJiYgYWxwaGEhPVJlYWxTY2FsYXIoMCkpCisgIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBibG9ja2luZygqbiwqbiwqaywxLGZhbHNlKTsKKyAgICBmdW5jW2NvZGVdKCpuLCAqaywgYSwgKmxkYSwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmNvbmooYicpICsgY29uaihhbHBoYSkqYipjb25qKGEnKSArIGJldGEqYywgIGZvciBvcCA9ICdOJ29yJ24nCisvLyBjID0gYWxwaGEqY29uaihhJykqYiArIGNvbmooYWxwaGEpKmNvbmooYicpKmEgKyBiZXRhKmMsICBmb3Igb3AgPSAnQydvcidjJworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmxkYiwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKK3sKKyAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7CisgIGNvbnN0IFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgUmVhbFNjYWxhciBiZXRhICA9ICpwYmV0YTsKKworLy8gICBzdGQ6OmNlcnIgPDwgImluIGhlcjJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKmxkYiA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigoT1AoKm9wKT09SU5WQUxJRCkgfHwgKE9QKCpvcCk9PVRSKSkgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVIySyIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9UmVhbFNjYWxhcigxKSkKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgKj0gYmV0YTsKKworICAgIGlmKGJldGEhPVNjYWxhcigwKSkKKyAgICB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLnJlYWwoKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOworICAgIH0KKyAgfQorICBlbHNlIGlmKCprPjAgJiYgYWxwaGEhPVNjYWxhcigwKSkKKyAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CisKKyAgaWYoKms9PTApCisgICAgcmV0dXJuIDE7CisKKyAgaWYoT1AoKm9wKT09Tk9UUikKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgICArPSAgICAgICAgICAgIGFscGhhICptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS5hZGpvaW50KCkKKyAgICAgICAgKyAgbnVtZXh0Ojpjb25qKGFscGhhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS5hZGpvaW50KCk7CisgICAgfQorICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKKyAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICpuLCAqaywgKmxkYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikuYWRqb2ludCgpCisgICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikqbWF0cml4KGEsICpuLCAqaywgKmxkYSkuYWRqb2ludCgpOworICB9CisgIGVsc2UgaWYoT1AoKm9wKT09QURKKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgICAgKz0gICAgICAgICAgICAgYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCisgICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICprLCAqbiwgKmxkYikuYWRqb2ludCgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKKyAgICAgICAgKz0gICAgICAgICAgICAgYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCisgICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICprLCAqbiwgKmxkYikuYWRqb2ludCgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvLyBJU0NPTVBMRVgKZGlmZiAtLWdpdCBhL2JsYXMvc2luZ2xlLmNwcCBiL2JsYXMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGVhNTdkCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBTQ0FMQVIgICAgICAgIGZsb2F0CisjZGVmaW5lIFNDQUxBUl9TVUZGSVggcworI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJTIgorI2RlZmluZSBJU0NPTVBMRVggICAgIDAKKworI2luY2x1ZGUgImxldmVsMV9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwxX3JlYWxfaW1wbC5oIgorI2luY2x1ZGUgImxldmVsMl9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX3JlYWxfaW1wbC5oIgorI2luY2x1ZGUgImxldmVsM19pbXBsLmgiCisKK2Zsb2F0IEJMQVNGVU5DKHNkc2RvdCkoaW50KiBuLCBmbG9hdCogYWxwaGEsIGZsb2F0KiB4LCBpbnQqIGluY3gsIGZsb2F0KiB5LCBpbnQqIGluY3kpCit7IHJldHVybiBkb3VibGUoKmFscGhhKSArIEJMQVNGVU5DKGRzZG90KShuLCB4LCBpbmN4LCB5LCBpbmN5KTsgfQpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL0NNYWtlTGlzdHMudHh0IGIvYmxhcy90ZXN0aW5nL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjgwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MCBAQAorCittYWNybyhlaV9hZGRfYmxhc190ZXN0IHRlc3RuYW1lKQorCisgIHNldCh0YXJnZXRuYW1lICR7dGVzdG5hbWV9KQorCisgIHNldChmaWxlbmFtZSAke3Rlc3RuYW1lfS5mKQorICBhZGRfZXhlY3V0YWJsZSgke3RhcmdldG5hbWV9ICR7ZmlsZW5hbWV9KQorCisgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9IGVpZ2VuX2JsYXMpCisKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIGVuZGlmKCkKKworICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VYVEVSTkFMX0xJQlN9KQorCisgIGFkZF90ZXN0KCR7dGVzdG5hbWV9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2JsYXMvdGVzdGluZy9ydW5ibGFzdGVzdC5zaCIgIiR7dGVzdG5hbWV9IiAiJHtFaWdlbl9TT1VSQ0VfRElSfS9ibGFzL3Rlc3RpbmcvJHt0ZXN0bmFtZX0uZGF0IikKKyAgYWRkX2RlcGVuZGVuY2llcyhidWlsZHRlc3RzICR7dGFyZ2V0bmFtZX0pCisgIAorZW5kbWFjcm8oZWlfYWRkX2JsYXNfdGVzdCkKKworZWlfYWRkX2JsYXNfdGVzdChzYmxhdDEpCitlaV9hZGRfYmxhc190ZXN0KHNibGF0MikKK2VpX2FkZF9ibGFzX3Rlc3Qoc2JsYXQzKQorCitlaV9hZGRfYmxhc190ZXN0KGRibGF0MSkKK2VpX2FkZF9ibGFzX3Rlc3QoZGJsYXQyKQorZWlfYWRkX2JsYXNfdGVzdChkYmxhdDMpCisKK2VpX2FkZF9ibGFzX3Rlc3QoY2JsYXQxKQorZWlfYWRkX2JsYXNfdGVzdChjYmxhdDIpCitlaV9hZGRfYmxhc190ZXN0KGNibGF0MykKKworZWlfYWRkX2JsYXNfdGVzdCh6YmxhdDEpCitlaV9hZGRfYmxhc190ZXN0KHpibGF0MikKK2VpX2FkZF9ibGFzX3Rlc3QoemJsYXQzKQorCisjIGFkZF9jdXN0b21fdGFyZ2V0KGxldmVsMSkKKyMgYWRkX2RlcGVuZGVuY2llcyhsZXZlbDEgc2JsYXQxKQorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvY2JsYXQxLmYgYi9ibGFzL3Rlc3RpbmcvY2JsYXQxLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhNjdmYgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9jYmxhdDEuZgpAQCAtMCwwICsxLDcyNCBAQAorKj4gXGJyaWVmIFxiIENCTEFUMQorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgUFJPR1JBTSBDQkxBVDEKKyogCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gICAgVGVzdCBwcm9ncmFtIGZvciB0aGUgQ09NUExFWCBMZXZlbCAxIEJMQVMuCisqPiAgICBCYXNlZCB1cG9uIHRoZSBvcmlnaW5hbCBCTEFTIHRlc3Qgcm91dGluZSB0b2dldGhlciB3aXRoOgorKj4KKyo+ICAgIEYwNkdBRiBFeGFtcGxlIFByb2dyYW0gVGV4dAorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgY29tcGxleF9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBDQkxBVDEKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIElDCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBDSEVDSzEsIENIRUNLMiwgSEVBREVSCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBTRkFDLzkuNzY1NjI1RS00LworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIERPIDIwIElDID0gMSwgMTAKKyAgICAgICAgIElDQVNFID0gSUMKKyAgICAgICAgIENBTEwgSEVBREVSCisqCisqICAgICAgICBJbml0aWFsaXplIFBBU1MsIElOQ1gsIElOQ1ksIGFuZCBNT0RFIGZvciBhIG5ldyBjYXNlLgorKiAgICAgICAgVGhlIHZhbHVlIDk5OTkgZm9yIElOQ1gsIElOQ1kgb3IgTU9ERSB3aWxsIGFwcGVhciBpbiB0aGUKKyogICAgICAgIGRldGFpbGVkICBvdXRwdXQsIGlmIGFueSwgZm9yIGNhc2VzIHRoYXQgZG8gbm90IGludm9sdmUKKyogICAgICAgIHRoZXNlIHBhcmFtZXRlcnMuCisqCisgICAgICAgICBQQVNTID0gLlRSVUUuCisgICAgICAgICBJTkNYID0gOTk5OQorICAgICAgICAgSU5DWSA9IDk5OTkKKyAgICAgICAgIE1PREUgPSA5OTk5CisgICAgICAgICBJRiAoSUNBU0UuTEUuNSkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzIoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkdFLjYpIFRIRU4KKyAgICAgICAgICAgIENBTEwgQ0hFQ0sxKFNGQUMpCisgICAgICAgICBFTkQgSUYKKyogICAgICAgIC0tIFByaW50CisgICAgICAgICBJRiAoUEFTUykgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCBDT05USU5VRQorICAgICAgU1RPUAorKgorOTk5OTkgRk9STUFUICgnIENvbXBsZXggQkxBUyBUZXN0IFByb2dyYW0gUmVzdWx0cycsLzFYKQorOTk5OTggRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0gUEFTUyAtLS0tLScpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSEVBREVSCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ0hBUkFDVEVSKjYgICAgICBMKDEwKQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxKS8nQ0RPVEMgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgyKS8nQ0RPVFUgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgzKS8nQ0FYUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg0KS8nQ0NPUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg1KS8nQ1NXQVAgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg2KS8nU0NOUk0yJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg3KS8nU0NBU1VNJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg4KS8nQ1NDQUwgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg5KS8nQ1NTQ0FMJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMCkvJ0lDQU1BWCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KSBJQ0FTRSwgTChJQ0FTRSkKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgvJyBUZXN0IG9mIHN1YnByb2dyYW0gbnVtYmVyJyxJMywxMlgsQTYpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0sxKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDQQorICAgICAgUkVBTCAgICAgICAgICAgICAgU0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIExFTiwgTlAxCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgIENUUlVFNSg4LDUsMiksIENUUlVFNig4LDUsMiksIENWKDgsNSwyKSwgQ1goOCksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BDUyg1KSwgTVdQQ1QoNSkKKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNUUlVFMig1KSwgU1RSVUU0KDUpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJVFJVRTMoNSkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0NBU1VNLCBTQ05STTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQU1BWAorICAgICAgRVhURVJOQUwgICAgICAgICAgU0NBU1VNLCBTQ05STTIsIElDQU1BWAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENTQ0FMLCBDU1NDQUwsIENURVNULCBJVEVTVDEsIFNURVNUMQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgTUFYCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNBLCBDQS8wLjNFMCwgKDAuNEUwLC0wLjdFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgwLjNFMCwtMC40RTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRTAsLTAuM0UwKSwgKDAuNUUwLC0wLjFFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwgKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC42RTAsMC4xRTApLCAoMC4xRTAsLTAuM0UwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBFMCw4LjBFMCksICg3LjBFMCw4LjBFMCksICg3LjBFMCw4LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsOC4wRTApLCAoMC4zRTAsMC4xRTApLCAoMC41RTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuNUUwKSwgKDAuMEUwLDAuMkUwKSwgKDIuMEUwLDMuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwyKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKDQuMEUwLDUuMEUwKSwgKDQuMEUwLDUuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICgwLjNFMCwtMC40RTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRTAsLTAuM0UwKSwgKDguMEUwLDkuMEUwKSwgKDAuNUUwLC0wLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEUwLDUuMEUwKSwgKDIuMEUwLDUuMEUwKSwgKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw2LjBFMCksICgtMC42RTAsMC4xRTApLCAoNC4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMUUwLC0wLjNFMCksICg3LjBFMCwyLjBFMCksICg3LjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsMi4wRTApLCAoMC4zRTAsMC4xRTApLCAoNS4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNUUwLDAuMEUwKSwgKDYuMEUwLDkuMEUwKSwgKDAuMEUwLDAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBFMCwzLjBFMCksICgwLjBFMCwwLjJFMCksICg5LjBFMCw0LjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBTVFJVRTIvMC4wRTAsIDAuNUUwLCAwLjZFMCwgMC43RTAsIDAuOEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1RSVUU0LzAuMEUwLCAwLjdFMCwgMS4wRTAsIDEuM0UwLCAxLjZFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1RSVUU1KEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgtMC4xNkUwLC0wLjM3RTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMTdFMCwtMC4xOUUwKSwgKDAuMTNFMCwtMC4zOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTFFMCwtMC4wM0UwKSwgKC0wLjE3RTAsMC40NkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoNy4wRTAsOC4wRTApLCAoNy4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE5RTAsLTAuMTdFMCksICgwLjIwRTAsLTAuMzVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zNUUwLDAuMjBFMCksICgwLjE0RTAsMC4wOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsMy4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTUoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKC0wLjE2RTAsLTAuMzdFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoOC4wRTAsOS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTNFMCwtMC4zOUUwKSwgKDIuMEUwLDUuMEUwKSwgKDIuMEUwLDUuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xMUUwLC0wLjAzRTApLCAoMy4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RTAsMC40NkUwKSwgKDQuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoNy4wRTAsMi4wRTApLCAoNy4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDIuMEUwKSwgKDAuMTlFMCwtMC4xN0UwKSwgKDUuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjIwRTAsLTAuMzVFMCksICg2LjBFMCw5LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zNUUwLDAuMjBFMCksICg4LjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xNEUwLDAuMDhFMCksICg5LjBFMCw0LjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUUlVFNihJLEosMSksST0xLDgpLEo9MSw1KS8oMC4xRTAsMC4xRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgxLjBFMCwyLjBFMCksICgxLjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMC4wOUUwLC0wLjEyRTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLC0wLjA5RTApLCAoMC4xNUUwLC0wLjAzRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLDAuMDNFMCksICgtMC4xOEUwLDAuMDNFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLC0wLjA5RTApLCAoNy4wRTAsOC4wRTApLCAoNy4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjA5RTAsMC4wM0UwKSwgKDAuMTVFMCwwLjAwRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDBFMCwwLjE1RTApLCAoMC4wMEUwLDAuMDZFMCksICgyLjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsMy4wRTApLCAoMi4wRTAsMy4wRTApLCAoMi4wRTAsMy4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTYoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKDAuMDlFMCwtMC4xMkUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC4wOUUwKSwgKDguMEUwLDkuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE1RTAsLTAuMDNFMCksICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwwLjAzRTApLCAoMy4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE4RTAsMC4wM0UwKSwgKDQuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRTAsLTAuMDlFMCksICg3LjBFMCwyLjBFMCksICg3LjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsMi4wRTApLCAoMC4wOUUwLDAuMDNFMCksICg1LjBFMCw4LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xNUUwLDAuMDBFMCksICg2LjBFMCw5LjBFMCksICgwLjAwRTAsMC4xNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBFMCwzLjBFMCksICgwLjAwRTAsMC4wNkUwKSwgKDkuMEUwLDQuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElUUlVFMy8wLCAxLCAyLCAyLCAyLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBJTkNYID0gMSwgMgorICAgICAgICAgRE8gNDAgTlAxID0gMSwgNQorICAgICAgICAgICAgTiA9IE5QMSAtIDEKKyAgICAgICAgICAgIExFTiA9IDIqTUFYKE4sMSkKKyogICAgICAgICAgIC4uIFNldCB2ZWN0b3IgYXJndW1lbnRzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICAgICAgICBDWChJKSA9IENWKEksTlAxLElOQ1gpCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjYpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNDTlJNMiAuLgorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU0NOUk0yKE4sQ1gsSU5DWCksU1RSVUUyKE5QMSksU1RSVUUyKE5QMSksCisgICAgICsgICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNykgVEhFTgorKiAgICAgICAgICAgICAgLi4gU0NBU1VNIC4uCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShTQ0FTVU0oTixDWCxJTkNYKSxTVFJVRTQoTlAxKSxTVFJVRTQoTlAxKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDU0NBTCAuLgorICAgICAgICAgICAgICAgQ0FMTCBDU0NBTChOLENBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTUoMSxOUDEsSU5DWCksQ1RSVUU1KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gQ1NTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIENTU0NBTChOLFNBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTYoMSxOUDEsSU5DWCksQ1RSVUU2KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMTApIFRIRU4KKyogICAgICAgICAgICAgIC4uIElDQU1BWCAuLgorICAgICAgICAgICAgICAgQ0FMTCBJVEVTVDEoSUNBTUFYKE4sQ1gsSU5DWCksSVRSVUUzKE5QMSkpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzEnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDQwICAgIENPTlRJTlVFCisgICA2MCBDT05USU5VRQorKgorICAgICAgSU5DWCA9IDEKKyAgICAgIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICBDU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIENBID0gKDAuMEUwLDAuMEUwKQorICAgICAgICAgRE8gODAgSSA9IDEsIDUKKyAgICAgICAgICAgIE1XUENUKEkpID0gKDAuMEUwLDAuMEUwKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSAoMS4wRTAsMS4wRTApCisgICA4MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBDU0NBTCg1LENBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjkpIFRIRU4KKyogICAgICAgIENTU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIFNBID0gMC4wRTAKKyAgICAgICAgIERPIDEwMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAoMC4wRTAsMC4wRTApCisgICAgICAgICAgICBNV1BDUyhJKSA9ICgxLjBFMCwxLjBFMCkKKyAgMTAwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIENTU0NBTCg1LFNBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyogICAgICAgIEFkZCBhIHRlc3QgZm9yIGFscGhhIGVxdWFsIHRvIG9uZS4KKyAgICAgICAgIFNBID0gMS4wRTAKKyAgICAgICAgIERPIDEyMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSBDWChJKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSBDWChJKQorICAxMjAgICAgQ09OVElOVUUKKyAgICAgICAgIENBTEwgQ1NTQ0FMKDUsU0EsQ1gsSU5DWCkKKyAgICAgICAgIENBTEwgQ1RFU1QoNSxDWCxNV1BDVCxNV1BDUyxTRkFDKQorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gbWludXMgb25lLgorICAgICAgICAgU0EgPSAtMS4wRTAKKyAgICAgICAgIERPIDE0MCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAtQ1goSSkKKyAgICAgICAgICAgIE1XUENTKEkpID0gLUNYKEkpCisgIDE0MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBDU1NDQUwoNSxTQSxDWCxJTkNYKQorICAgICAgICAgQ0FMTCBDVEVTVCg1LENYLE1XUENULE1XUENTLFNGQUMpCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMihTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgQ0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIEtJLCBLTiwgS1NJWkUsIExFTlgsIExFTlksIE1YLCBNWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDRE9UKDEpLCBDU0laRTEoNCksIENTSVpFMig3LDIpLCBDU0laRTMoMTQpLAorICAgICArICAgICAgICAgICAgICAgICAgQ1QxMFgoNyw0LDQpLCBDVDEwWSg3LDQsNCksIENUNig0LDQpLCBDVDcoNCw0KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIENUOCg3LDQsNCksIENYKDcpLCBDWDEoNyksIENZKDcpLCBDWTEoNykKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDRE9UQywgQ0RPVFUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENET1RDLCBDRE9UVQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENBWFBZLCBDQ09QWSwgQ1NXQVAsIENURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBDQS8oMC40RTAsLTAuN0UwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBDWDEvKDAuN0UwLC0wLjhFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRTAsLTAuOUUwKSwgKDAuMkUwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLC0wLjRFMCksICgwLjFFMCwwLjRFMCksICgtMC42RTAsMC42RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1kxLygwLjZFMCwtMC42RTApLCAoLTAuOUUwLDAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC42RTApLCAoMC4xRTAsLTAuNUUwKSwgKC0wLjFFMCwtMC4yRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjVFMCwtMC4zRTApLCAoMC44RTAsLTAuN0UwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwxKSxJPTEsNyksSj0xLDQpLygwLjZFMCwtMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkUwLC0xLjQxRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjMyRTAsLTEuNDFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTEuNTVFMCwwLjVFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJFMCwtMS40MUUwKSwgKC0xLjU1RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC44OUUwKSwgKC0wLjM4RTAsLTAuOTZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRTAsLTEuNDFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjA3RTAsLTAuODlFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLDAuNUUwKSwgKDAuNDJFMCwtMS40MUUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43OEUwLDAuMDZFMCksICgtMC45RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDZFMCwtMC4xM0UwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdFMCwtMC40OUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNTJFMCwtMS41MUUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwzKSxJPTEsNyksSj0xLDQpLygwLjZFMCwtMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkUwLC0xLjQxRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgtMC4wN0UwLC0wLjg5RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0xLjE4RTAsLTAuMzFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNzhFMCwwLjA2RTApLCAoLTEuNTRFMCwwLjk3RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC44OUUwKSwgKC0wLjE4RTAsLTEuMzFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRTAsLTEuNDFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMzJFMCwtMS40MUUwKSwgKC0wLjlFMCwwLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wNUUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4zMkUwLC0xLjQxRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlFMCwwLjVFMCksICgwLjA1RTAsLTAuNkUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdFMCwtMC40OUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJFMCwtMS4xNkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNy8oMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjY1RTAsLTAuNDdFMCksICgtMC4zNEUwLC0xLjIyRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjA2RTAsLTAuOTBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNTlFMCwtMS40NkUwKSwgKC0xLjA0RTAsLTAuMDRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC44M0UwLDAuNTlFMCksICgwLjA3RTAsLTAuMzdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC43NkUwLC0xLjE1RTApLCAoLTEuMzNFMCwtMS44MkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNi8oMC4wRTAsMC4wRTApLCAoMC45MEUwLDAuMDZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC45MUUwLC0wLjc3RTApLCAoMS44MEUwLC0wLjEwRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuOTBFMCwwLjA2RTApLCAoMS40NUUwLDAuNzRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4yMEUwLDAuOTBFMCksICgwLjBFMCwwLjBFMCksICgwLjkwRTAsMC4wNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC41NUUwLDAuMjNFMCksICgwLjgzRTAsLTAuMzlFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC45MEUwLDAuMDZFMCksICgxLjA0RTAsMC43OUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjk1RTAsMS4yMkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjZFMCwtMC42RTApLCAoLTAuOUUwLDAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsMC41RTApLCAoMC43RTAsLTAuNkUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMiksST0xLDcpLEo9MSw0KS8oMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjZFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuOEUwLC0wLjdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgtMC4xRTAsLTAuMkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJFMCwtMC44RTApLCAoMC43RTAsLTAuNkUwKSwgKDAuMUUwLDAuNEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMyksST0xLDcpLEo9MSw0KS8oMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjlFMCwwLjVFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgwLjdFMCwtMC42RTApLCAoMC4yRTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsMC41RTApLCAoMC4xRTAsMC40RTApLCAoMC42RTAsLTAuNkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjZFMCwtMC42RTApLCAoMC43RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC42RTApLCAoLTAuMUUwLC0wLjJFMCksICgwLjhFMCwtMC43RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjdFMCwtMC44RTApLCAoLTAuNEUwLC0wLjdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgtMC4xRTAsLTAuOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgtMC4xRTAsLTAuOUUwKSwgKC0wLjlFMCwwLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RTAsLTAuOEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgtMC42RTAsMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlFMCwwLjVFMCksICgtMC45RTAsLTAuNEUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMUUwLC0wLjlFMCksICgtMC41RTAsLTAuM0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosMyksST0xLDcpLEo9MSw0KS8oMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjFFMCwtMC45RTApLCAoMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoLTAuNkUwLDAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsLTAuNEUwKSwgKC0wLjFFMCwtMC45RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosNCksST0xLDcpLEo9MSw0KS8oMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksICgtMC45RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjRFMCwtMC43RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLDAuNUUwKSwgKC0wLjRFMCwtMC43RTApLCAoMC4xRTAsLTAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRTAsLTAuOUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMkUwLC0wLjhFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDU0laRTEvKDAuMEUwLDAuMEUwKSwgKDAuOUUwLDAuOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjYzRTAsMS43M0UwKSwgKDIuOTBFMCwyLjc4RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUzLygwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDEuMTdFMCwxLjE3RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMTdFMCwxLjE3RTApLCAoMS4xN0UwLDEuMTdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4xN0UwLDEuMTdFMCksICgxLjE3RTAsMS4xN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjE3RTAsMS4xN0UwKSwgKDEuMTdFMCwxLjE3RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUyLygwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDEuNTRFMCwxLjU0RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuNTRFMCwxLjU0RTApLCAoMS41NEUwLDEuNTRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS41NEUwLDEuNTRFMCksICgxLjU0RTAsMS41NEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjU0RTAsMS41NEUwKSwgKDEuNTRFMCwxLjU0RTApLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBLSSA9IDEsIDQKKyAgICAgICAgIElOQ1ggPSBJTkNYUyhLSSkKKyAgICAgICAgIElOQ1kgPSBJTkNZUyhLSSkKKyAgICAgICAgIE1YID0gQUJTKElOQ1gpCisgICAgICAgICBNWSA9IEFCUyhJTkNZKQorKgorICAgICAgICAgRE8gNDAgS04gPSAxLCA0CisgICAgICAgICAgICBOID0gTlMoS04pCisgICAgICAgICAgICBLU0laRSA9IE1JTigyLEtOKQorICAgICAgICAgICAgTEVOWCA9IExFTlMoS04sTVgpCisgICAgICAgICAgICBMRU5ZID0gTEVOUyhLTixNWSkKKyogICAgICAgICAgIC4uIGluaXRpYWxpemUgYWxsIGFyZ3VtZW50IGFycmF5cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgIENYKEkpID0gQ1gxKEkpCisgICAgICAgICAgICAgICBDWShJKSA9IENZMShJKQorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS4xKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDRE9UQyAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IENET1RDKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q2KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4yKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDRE9UVSAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IENET1RVKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q3KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4zKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDQVhQWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBDQVhQWShOLENBLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDgoMSxLTixLSSksQ1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS40KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDQ09QWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBDQ09QWShOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDEwWSgxLEtOLEtJKSxDU0laRTMsMS4wRTApCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS41KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDU1dBUCAuLgorICAgICAgICAgICAgICAgQ0FMTCBDU1dBUChOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWCxDWCxDVDEwWCgxLEtOLEtJKSxDU0laRTMsMS4wRTApCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTlksQ1ksQ1QxMFkoMSxLTixLSSksQ1NJWkUzLDEuMEUwKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0syJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisqCisgICA0MCAgICBDT05USU5VRQorICAgNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUKExFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBSRUFMICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NiwgWkVSTz0wLjBFMCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTQ09NUChMRU4pLCBTU0laRShMRU4pLCBTVFJVRShMRU4pCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgIFNECisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRElGRgorICAgICAgRVhURVJOQUwgICAgICAgICBTRElGRgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBQlMKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICBTRCA9IFNDT01QKEkpIC0gU1RSVUUoSSkKKyAgICAgICAgIElGIChBQlMoU0ZBQypTRCkgLkxFLiBBQlMoU1NJWkUoSSkpKkVQU0lMT04oWkVSTykpCisgICAgICsgICAgICAgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgICAgU0NPTVAoSSkgSVMgTk9UIENMT1NFIFRPIFNUUlVFKEkpLgorKgorICAgICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgSSwgU0NPTVAoSSksCisgICAgICsgICAgIFNUUlVFKEkpLCBTRCwgU1NJWkUoSSkKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QKEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKEkpICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAnICAgICBTSVpFKEkpJywvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSxJMywyRTM2LjgsMkUxMi40KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUMShTQ09NUDEsU1RSVUUxLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBJUyBBTiBJTlRFUkZBQ0UgU1VCUk9VVElORSBUTyBBQ0NPTU9EQVRFIFRIRSBGT1JUUkFOCisqICAgICBSRVFVSVJFTUVOVCBUSEFUIFdIRU4gQSBEVU1NWSBBUkdVTUVOVCBJUyBBTiBBUlJBWSwgVEhFCisqICAgICBBQ1RVQUwgQVJHVU1FTlQgTVVTVCBBTFNPIEJFIEFOIEFSUkFZIE9SIEFOIEFSUkFZIEVMRU1FTlQuCisqCisqICAgICBDLkwuIExBV1NPTiwgSlBMLCAxOTc4IERFQyA2CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUDEsIFNGQUMsIFNUUlVFMQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTU0laRSgqKQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUCgxKSwgU1RSVUUoMSkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTVEVTVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBTQ09NUCgxKSA9IFNDT01QMQorICAgICAgU1RSVUUoMSkgPSBTVFJVRTEKKyAgICAgIENBTEwgU1RFU1QoMSxTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0RJRkYoU0EsU0IpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0RJRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgIENPTVBVVEVTIERJRkZFUkVOQ0UgT0YgVFdPIE5VTUJFUlMuICBDLiBMLiBMQVdTT04sIEpQTCAxOTc0IEZFQiAxNQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQSwgU0IKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgU0RJRkYgPSBTQSAtIFNCCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDVEVTVChMRU4sQ0NPTVAsQ1RSVUUsQ1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ1RFU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIEMuTC4gTEFXU09OLCBKUEwsIDE5NzggREVDIDYKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICBDQ09NUChMRU4pLCBDU0laRShMRU4pLCBDVFJVRShMRU4pCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTQ09NUCgyMCksIFNTSVpFKDIwKSwgU1RSVUUoMjApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBTVEVTVAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBSU1BRywgUkVBTAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICBTQ09NUCgyKkktMSkgPSBSRUFMKENDT01QKEkpKQorICAgICAgICAgU0NPTVAoMipJKSA9IEFJTUFHKENDT01QKEkpKQorICAgICAgICAgU1RSVUUoMipJLTEpID0gUkVBTChDVFJVRShJKSkKKyAgICAgICAgIFNUUlVFKDIqSSkgPSBBSU1BRyhDVFJVRShJKSkKKyAgICAgICAgIFNTSVpFKDIqSS0xKSA9IFJFQUwoQ1NJWkUoSSkpCisgICAgICAgICBTU0laRSgyKkkpID0gQUlNQUcoQ1NJWkUoSSkpCisgICAyMCBDT05USU5VRQorKgorICAgICAgQ0FMTCBTVEVTVCgyKkxFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSVRFU1QxKElDT01QLElUUlVFKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlJPVVRJTkUgQ09NUEFSRVMgVEhFIFZBUklBQkxFUyBJQ09NUCBBTkQgSVRSVUUgRk9SCisqICAgICBFUVVBTElUWS4KKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDT01QLCBJVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJRAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiAoSUNPTVAuRVEuSVRSVUUpIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgSUNPTVAgSVMgTk9UIEVRVUFMIFRPIElUUlVFLgorKgorICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIElEID0gSUNPTVAgLSBJVFJVRQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBJQ09NUCwgSVRSVUUsIElECisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAgICAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywzSTUsMkkzNixJMTIpCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9jYmxhdDIuZGF0IGIvYmxhcy90ZXN0aW5nL2NibGF0Mi5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ODczMAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9jYmxhdDIuZGF0CkBAIC0wLDAgKzEsMzUgQEAKKydjYmxhdDIuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnY2JsYXQyLnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSworMCAxIDIgNCAgICAgICAgICAgVkFMVUVTIE9GIEsKKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMSAyIC0xIC0yICAgICAgICAgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCitDR0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0dCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NHRVJDICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDR0VSVSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hFUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIUFIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEVSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hQUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9jYmxhdDIuZiBiL2JsYXMvdGVzdGluZy9jYmxhdDIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMzZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL2NibGF0Mi5mCkBAIC0wLDAgKzEsMzI3OSBAQAorKj4gXGJyaWVmIFxiIENCTEFUMgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgUFJPR1JBTSBDQkxBVDIKKyogCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gVGVzdCBwcm9ncmFtIGZvciB0aGUgQ09NUExFWCAgICAgICAgICBMZXZlbCAyIEJsYXMuCisqPgorKj4gVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxOCByZWNvcmRzCisqPiBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCAxNyByZWNvcmRzCisqPiBhcmUgcmVhZCB1c2luZyB0aGUgZm9ybWF0ICggQTYsIEwyICkuIEFuIGFubm90YXRlZCBleGFtcGxlIG9mIGEgZGF0YQorKj4gZmlsZSBjYW4gYmUgb2J0YWluZWQgYnkgZGVsZXRpbmcgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBmcm9tIHRoZQorKj4gZm9sbG93aW5nIDM1IGxpbmVzOgorKj4gJ2NibGF0Mi5vdXQnICAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCisqPiA2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyo+ICdDQkxBMlQuU05BUCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKyo+IC0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorKj4gVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisqPiAxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworKj4gNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCisqPiAwIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorKj4gNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCisqPiAwIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworKj4gNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqPiAxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKj4gKDAuMCwwLjApICgxLjAsMC4wKSAoMC43LC0wLjkpICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqPiAoMC4wLDAuMCkgKDEuMCwwLjApICgxLjMsLTEuMSkgICAgICAgVkFMVUVTIE9GIEJFVEEKKyo+IENHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ0hFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENIQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDSFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ1RSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ1RSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ0dFUkMgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENHRVJVICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDSEVSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ0hQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENIRVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDSFBSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4KKyo+IEZ1cnRoZXIgRGV0YWlscworKj4gPT09PT09PT09PT09PT09CisqPgorKj4gICAgU2VlOgorKj4KKyo+ICAgICAgIERvbmdhcnJhIEouIEouLCBEdSBDcm96IEouIEouLCBIYW1tYXJsaW5nIFMuICBhbmQgSGFuc29uIFIuIEouLgorKj4gICAgICAgQW4gIGV4dGVuZGVkICBzZXQgb2YgRm9ydHJhbiAgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqPgorKj4gICAgICAgVGVjaG5pY2FsICBNZW1vcmFuZGEgIE5vcy4gNDEgKHJldmlzaW9uIDMpIGFuZCA4MSwgIE1hdGhlbWF0aWNzCisqPiAgICAgICBhbmQgIENvbXB1dGVyIFNjaWVuY2UgIERpdmlzaW9uLCAgQXJnb25uZSAgTmF0aW9uYWwgTGFib3JhdG9yeSwKKyo+ICAgICAgIDk3MDAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyo+CisqPiAgICAgICBPcgorKj4KKyo+ICAgICAgIE5BRyAgVGVjaG5pY2FsIFJlcG9ydHMgVFIzLzg3IGFuZCBUUjQvODcsICBOdW1lcmljYWwgQWxnb3JpdGhtcworKj4gICAgICAgR3JvdXAgIEx0ZC4sICBOQUcgIENlbnRyYWwgIE9mZmljZSwgIDI1NiAgQmFuYnVyeSAgUm9hZCwgT3hmb3JkCisqPiAgICAgICBPWDIgN0RFLCBVSywgIGFuZCAgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgSW5jLiwgIDExMDEgIDMxc3QKKyo+ICAgICAgIFN0cmVldCwgIFN1aXRlIDEwMCwgIERvd25lcnMgR3JvdmUsICBJbGxpbm9pcyA2MDUxNS0xMjYzLCAgVVNBLgorKj4KKyo+CisqPiAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKj4gICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKj4gICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyo+CisqPiAgICAxMC05LTAwOiAgQ2hhbmdlIFNUQVRVUz0nTkVXJyB0byAnVU5LTk9XTicgc28gdGhhdCB0aGUgdGVzdGVycworKj4gICAgICAgICAgICAgIGNhbiBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aG91dCBkZWxldGluZyBnZW5lcmF0ZWQKKyo+ICAgICAgICAgICAgICBvdXRwdXQgZmlsZXMgKHN1c2FuKQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgY29tcGxleF9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBDQkxBVDIKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDE3ICkKKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOTUFYLCBJTkNNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5NQVggPSA2NSwgSU5DTUFYID0gMiApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklOTUFYLCBOSURNQVgsIE5LQk1BWCwgTkFMTUFYLCBOQkVNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTk1BWCA9IDcsIE5JRE1BWCA9IDksIE5LQk1BWCA9IDcsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFMTUFYID0gNywgTkJFTUFYID0gNyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBFUlIsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElTTlVNLCBKLCBOLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTFRFU1RULCBSRVdJLCBTQU1FLCBTRkFUQUwsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgIFRTVEVSUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVUCisgICAgICBDSEFSQUNURVIqMzIgICAgICAgU05BUFMsIFNVTU1SWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxNQVggKSwgQVMoIE5NQVgqTk1BWCApLCBCRVQoIE5CRU1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggMipOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURNQVggKSwgSU5DKCBOSU5NQVggKSwgS0IoIE5LQk1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0RJRkYsIExDRQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDQ0hLMSwgQ0NISzIsIENDSEszLCBDQ0hLNCwgQ0NISzUsIENDSEs2LAorICAgICAkICAgICAgICAgICAgICAgICAgIENDSEtFLCBDTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ0NHRU1WICcsICdDR0JNViAnLCAnQ0hFTVYgJywgJ0NIQk1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0NIUE1WICcsICdDVFJNViAnLCAnQ1RCTVYgJywgJ0NUUE1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0NUUlNWICcsICdDVEJTViAnLCAnQ1RQU1YgJywgJ0NHRVJDICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0NHRVJVICcsICdDSEVSICAnLCAnQ0hQUiAgJywgJ0NIRVIyICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0NIUFIyICcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdVTktOT1dOJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ1VOS05PV04nICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFJaRVJPKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUVQUworKgorKiAgICAgQ2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIENNVkNIIHVzaW5nIGV4YWN0IGRhdGEuCisqCisgICAgICBOID0gTUlOKCAzMiwgTk1BWCApCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDExMCBJID0gMSwgTgorICAgICAgICAgICAgQSggSSwgSiApID0gTUFYKCBJIC0gSiArIDEsIDAgKQorICAxMTAgICAgQ09OVElOVUUKKyAgICAgICAgIFgoIEogKSA9IEoKKyAgICAgICAgIFkoIEogKSA9IFpFUk8KKyAgMTIwIENPTlRJTlVFCisgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgIFlZKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDEzMCBDT05USU5VRQorKiAgICAgWVkgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIENNVkNIIFlUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IENNVkNILgorICAgICAgVFJBTlMgPSAnTicKKyAgICAgIENBTEwgQ01WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsIDEsIFpFUk8sIFksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMQ0UoIFlZLCBZVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKVRSQU5TLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlMgPSAnVCcKKyAgICAgIENBTEwgQ01WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsIC0xLCBaRVJPLCBZLCAtMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExDRSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjEwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIENDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNDAsIDE1MCwgMTUwLCAxNTAsIDE2MCwgMTYwLAorICAgICAkICAgICAgICAgICAgICAxNjAsIDE2MCwgMTYwLCAxNjAsIDE3MCwgMTcwLCAxODAsCisgICAgICQgICAgICAgICAgICAgIDE4MCwgMTkwLCAxOTAgKUlTTlVNCisqICAgICAgICAgICBUZXN0IENHRU1WLCAwMSwgYW5kIENHQk1WLCAwMi4KKyAgMTQwICAgICAgIENBTEwgQ0NISzEoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsCisgICAgICQgICAgICAgICAgICAgICAgICBOQkVULCBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IENIRU1WLCAwMywgQ0hCTVYsIDA0LCBhbmQgQ0hQTVYsIDA1LgorICAxNTAgICAgICAgQ0FMTCBDQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgQ1RSTVYsIDA2LCBDVEJNViwgMDcsIENUUE1WLCAwOCwKKyogICAgICAgICAgIENUUlNWLCAwOSwgQ1RCU1YsIDEwLCBhbmQgQ1RQU1YsIDExLgorICAxNjAgICAgICAgQ0FMTCBDQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBZLCBZWSwgWVMsIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBDR0VSQywgMTIsIENHRVJVLCAxMy4KKyAgMTcwICAgICAgIENBTEwgQ0NISzQoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBDSEVSLCAxNCwgYW5kIENIUFIsIDE1LgorICAxODAgICAgICAgQ0FMTCBDQ0hLNSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IENIRVIyLCAxNiwgYW5kIENIUFIyLCAxNy4KKyAgMTkwICAgICAgIENBTEwgQ0NISzYoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyoKKyAgMjAwICAgICAgIElGKCBGQVRBTC5BTkQuU0ZBVEFMICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIyMAorICAgICAgICAgRU5EIElGCisgIDIxMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODIgKQorICAgICAgR08gVE8gMjQwCisqCisgIDIyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODEgKQorICAgICAgR08gVE8gMjQwCisqCisgIDIzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODcgKQorKgorICAyNDAgQ09OVElOVUUKKyAgICAgIElGKCBUUkFDRSApCisgICAgICQgICBDTE9TRSAoIE5UUkEgKQorICAgICAgQ0xPU0UgKCBOT1VUICkKKyAgICAgIFNUT1AKKyoKKyA5OTk5IEZPUk1BVCggJyBST1VUSU5FUyBQQVNTIENPTVBVVEFUSU9OQUwgVEVTVFMgSUYgVEVTVCBSQVRJTyBJUyBMRVMnLAorICAgICAkICAgICAgJ1MgVEhBTicsIEY4LjIgKQorIDk5OTggRk9STUFUKCAnIFJFTEFUSVZFIE1BQ0hJTkUgUFJFQ0lTSU9OIElTIFRBS0VOIFRPIEJFJywgMVAsIEU5LjEgKQorIDk5OTcgRk9STUFUKCAnIE5VTUJFUiBPRiBWQUxVRVMgT0YgJywgQSwgJyBJUyBMRVNTIFRIQU4gMSBPUiBHUkVBVEVSICcsCisgICAgICQgICAgICAnVEhBTiAnLCBJMiApCisgOTk5NiBGT1JNQVQoICcgVkFMVUUgT0YgTiBJUyBMRVNTIFRIQU4gMCBPUiBHUkVBVEVSIFRIQU4gJywgSTIgKQorIDk5OTUgRk9STUFUKCAnIFZBTFVFIE9GIEsgSVMgTEVTUyBUSEFOIDAnICkKKyA5OTk0IEZPUk1BVCggJyBBQlNPTFVURSBWQUxVRSBPRiBJTkNYIE9SIElOQ1kgSVMgMCBPUiBHUkVBVEVSIFRIQU4gJywKKyAgICAgJCAgICAgIEkyICkKKyA5OTkzIEZPUk1BVCggJyBURVNUUyBPRiBUSEUgQ09NUExFWCAgICAgICAgICBMRVZFTCAyIEJMQVMnLCAvLycgVEhFIEYnLAorICAgICAkICAgICAgJ09MTE9XSU5HIFBBUkFNRVRFUiBWQUxVRVMgV0lMTCBCRSBVU0VEOicgKQorIDk5OTIgRk9STUFUKCAnICAgRk9SIE4gICAgICAgICAgICAgICcsIDlJNiApCisgOTk5MSBGT1JNQVQoICcgICBGT1IgSyAgICAgICAgICAgICAgJywgN0k2ICkKKyA5OTkwIEZPUk1BVCggJyAgIEZPUiBJTkNYIEFORCBJTkNZICAnLCA3STYgKQorIDk5ODkgRk9STUFUKCAnICAgRk9SIEFMUEhBICAgICAgICAgICcsCisgICAgICQgICAgICA3KCAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgICcsIDogKSApCisgOTk4OCBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTg3IEZPUk1BVCggJyBBTUVORCBEQVRBIEZJTEUgT1IgSU5DUkVBU0UgQVJSQVkgU0laRVMgSU4gUFJPR1JBTScsCisgICAgICQgICAgICAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NiBGT1JNQVQoICcgU1VCUFJPR1JBTSBOQU1FICcsIEE2LCAnIE5PVCBSRUNPR05JWkVEJywgLycgKioqKioqKiBUJywKKyAgICAgJCAgICAgICdFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NSBGT1JNQVQoICcgRVJST1IgSU4gQ01WQ0ggLSAgSU4tTElORSBET1QgUFJPRFVDVFMgQVJFIEJFSU5HIEVWQUxVJywKKyAgICAgJCAgICAgICdBVEVEIFdST05HTFkuJywgLycgQ01WQ0ggV0FTIENBTExFRCBXSVRIIFRSQU5TID0gJywgQTEsCisgICAgICQgICAgICAnIEFORCBSRVRVUk5FRCBTQU1FID0gJywgTDEsICcgQU5EIEVSUiA9ICcsIEYxMi4zLCAnLicsIC8KKyAgICAgJCAgICcgVEhJUyBNQVkgQkUgRFVFIFRPIEZBVUxUUyBJTiBUSEUgQVJJVEhNRVRJQyBPUiBUSEUgQ09NUElMRVIuJworICAgICAkICAgICAgLCAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NCBGT1JNQVQoIEE2LCBMMiApCisgOTk4MyBGT1JNQVQoIDFYLCBBNiwgJyBXQVMgTk9UIFRFU1RFRCcgKQorIDk5ODIgRk9STUFUKCAvJyBFTkQgT0YgVEVTVFMnICkKKyA5OTgxIEZPUk1BVCggLycgKioqKioqKiBGQVRBTCBFUlJPUiAtIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4MCBGT1JNQVQoICcgRVJST1ItRVhJVFMgV0lMTCBOT1QgQkUgVEVTVEVEJyApCisqCisqICAgICBFbmQgb2YgQ0JMQVQyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENDSEsxKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsIE5CRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorKgorKiAgVGVzdHMgQ0dFTVYgYW5kIENHQk1WLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgSEFMRiA9ICggMC41LCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKSwgS0IoIE5LQiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBUUkFOU0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLVSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLTCwgS0xTLCBLVSwgS1VTLCBMQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREFTLCBMWCwgTFksIE0sIE1MLCBNUywgTiwgTkFSR1MsIE5DLCBORCwgTkssCisgICAgICQgICAgICAgICAgICAgICAgICAgTkwsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENHQk1WLCBDR0VNViwgQ01BS0UsIENNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTMKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDEyMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorICAgICAgICAgTkQgPSBOLzIgKyAxCisqCisgICAgICAgICBETyAxMTAgSU0gPSAxLCAyCisgICAgICAgICAgICBJRiggSU0uRVEuMSApCisgICAgICQgICAgICAgICBNID0gTUFYKCBOIC0gTkQsIDAgKQorICAgICAgICAgICAgSUYoIElNLkVRLjIgKQorICAgICAkICAgICAgICAgTSA9IE1JTiggTiArIE5ELCBOTUFYICkKKyoKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIElLVSA9IDEsIE5LCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBLVSA9IEtCKCBJS1UgKQorICAgICAgICAgICAgICAgICAgS0wgPSBNQVgoIEtVIC0gMSwgMCApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLVSA9IE4gLSAxCisgICAgICAgICAgICAgICAgICBLTCA9IE0gLSAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgTERBID0gS0wgKyBLVSArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIExEQSA9IE0KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEtMLCBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICBETyA5MCBJQyA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE4KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgTUwgPSBNCisgICAgICAgICAgICAgICAgICAgICBOTCA9IE4KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk5MCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTkwsIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE5MIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICAgICBJRiggTkwuR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgWCggTkwvMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE5MLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk1MCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBNTCwgWSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBBQlMoIElOQ1kgKSwgMCwgTUwgLSAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMUyA9IEtMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVVMgPSBLVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTVYoIFRSQU5TLCBNLCBOLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYLCBCRVRBLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBLTCwgS1UsIEFMUEhBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDR0JNViggVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBYWCwgSU5DWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TLkVRLlRSQU5TUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS0xTLkVRLktMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1VTLkVRLktVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMQ0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMQ0VSRVMoICdHRScsICcgJywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUwsIFlTLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goIFRSQU5TLCBNLCBOLCBBTFBIQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTS5sZS4wIG9yCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNDAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlMsIE0sIE4sIEtMLCBLVSwKKyAgICAgJCAgICAgIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCA0KCBJMywgJywnICksICcoJywKKyAgICAgJCAgICAgIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBZLCcsIEkyLCAnKSAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDIoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzEuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzIoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBDSEVNViwgQ0hCTVYgYW5kIENIUE1WLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgSEFMRiA9ICggMC41LCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKSwgS0IoIE5LQiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBUUkFOU0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgSU5DWVMsIElYLCBJWSwgSywgS1MsIExBQSwgTERBLCBMREFTLCBMWCwgTFksCisgICAgICQgICAgICAgICAgICAgICAgICAgTiwgTkFSR1MsIE5DLCBOSywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hCTVYsIENIRU1WLCBDSFBNViwgQ01BS0UsIENNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsIE5NQVgsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgTERBLCBLLCBLLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIRU1WKCBVUExPLCBOLCBBTFBIQSwgQUEsIExEQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgSywgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIQk1WKCBVUExPLCBOLCBLLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBJTkNYLCBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIUE1WKCBVUExPLCBOLCBBTFBIQSwgQUEsIFhYLCBJTkNYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMQ0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMQ0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMQ0VSRVMoICdHRScsICcgJywgMSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0VSRVMoICdHRScsICcgJywgMSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goICdOJywgTiwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBZLCBJTkNZLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgQ09OVElOVUUKKyoKKyAgMTEwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgTERBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBLLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwKKyAgICAgJCAgICAgIEJFVEEsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIEFQLCBYLCcsIEkyLCAnLCgnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBZLCcsIEkyLAorICAgICAkICAgICAgJykgICAgICAgICAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCAyKCBJMywgJywnICksICcoJywKKyAgICAgJCAgICAgIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBZLCcsIEkyLCAnKSAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCgnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCAnLAorICAgICAkICAgICAgJ1ksJywgSTIsICcpICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENDSEsyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENDSEszKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBYVCwgRywgWiApCisqCisqICBUZXN0cyBDVFJNViwgQ1RCTVYsIENUUE1WLCBDVFJTViwgQ1RCU1YgYW5kIENUUFNWLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFQoIE5NQVggKSwgWFgoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBUUkFOU0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDRCwgSUNULCBJQ1UsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgIEtTLCBMQUEsIExEQSwgTERBUywgTFgsIE4sIE5BUkdTLCBOQywgTkssIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENNQUtFLCBDTVZDSCwgQ1RCTVYsIENUQlNWLCBDVFBNViwgQ1RQU1YsCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1RSTVYsIENUUlNWCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVS8nVUwnLywgSUNIVC8nTlRDJy8sIElDSEQvJ1VOJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1InCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKiAgICAgU2V0IHVwIHplcm8gdmVjdG9yIGZvciBDTVZDSC4KKyAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICBaKCBJICkgPSBaRVJPCisgICAxMCBDT05USU5VRQorKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgRElBRywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RSTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENUQk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RQTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVFJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RCU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVFBTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gRElBRy5FUS5ESUFHUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMQ0VSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTENFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWiwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsIHZlY3Rvci4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYWCggMSArICggSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWCApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFgsIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwKKyAgICAgJCAgICAgIElOQ1gKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssCisgICAgICQgICAgICBMREEsIElOQ1gKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQVAsICcsCisgICAgICQgICAgICAnWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJyBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBLCcsCisgICAgICQgICAgICBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIENHRVJDIGFuZCBDR0VSVS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgSEFMRiA9ICggMC41LCAwLjAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBUUkFOU0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJTSwgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLCBJTkNZUywgSVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgSVksIEosIExBQSwgTERBLCBMREFTLCBMWCwgTFksIE0sIE1TLCBOLCBOQVJHUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQywgTkQsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQ09OSiwgTlVMTCwgUkVTRVQsIFNBTUUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFcoIDEgKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENHRVJDLCBDR0VSVSwgQ01BS0UsIENNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBDT05KRywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDU6IDUgKS5FUS4nQycKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIE5BUkdTID0gOQorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDEyMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorICAgICAgICAgTkQgPSBOLzIgKyAxCisqCisgICAgICAgICBETyAxMTAgSU0gPSAxLCAyCisgICAgICAgICAgICBJRiggSU0uRVEuMSApCisgICAgICQgICAgICAgICBNID0gTUFYKCBOIC0gTkQsIDAgKQorICAgICAgICAgICAgSUYoIElNLkVRLjIgKQorICAgICAkICAgICAgICAgTSA9IE1JTiggTiArIE5ELCBOTUFYICkKKyoKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisgICAgICAgICAgICBETyAxMDAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk0KKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBNLCBYLCAxLCBYWCwgQUJTKCBJTkNYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAwLCBNIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICBJRiggTS5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICBYKCBNLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBNLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gOTAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBZKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFlZKCAxICsgQUJTKCBJTkNZICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gODAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggU05BTUUoIDI6IDMgKSwgJyAnLCAnICcsIE0sIE4sIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBNIC0gMSwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBNLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENHRVJDKCBNLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VSVSggTSwgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0VSRVMoICdHRScsICcgJywgTSwgTiwgQVMsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREFTLkVRLkxEQQorKgorKiAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIE0gLSBJICsgMSApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWSggSiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBOIC0gSiArIDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBDT05KRyggVyggMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goICdOJywgTSwgMSwgQUxQSEEsIFosIE5NQVgsIFcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEoIDEsIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggMSArICggSiAtIDEgKSpMREEgKSwgRVBTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgIDcwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IgTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTUwCisqCisgIDEzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCBJMywgJywnICksICcoJywgRjQuMSwgJywnLCBGNC4xLAorICAgICAkICAgICAgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgQ0hFUiBhbmQgQ0hQUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgSEFMRiA9ICggMC41LCAwLjAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgVFJBTlNMCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgsIFJBTFBIQSwgUkFMUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQywgSU4sIElOQ1gsIElOQ1hTLCBJWCwgSiwgSkEsIEpKLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMSiwgTFgsIE4sIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEVSLCBDSFBSLCBDTUFLRSwgQ01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIENNUExYLCBDT05KRywgTUFYLCBSRUFMCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNgorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA3MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgIFJBTFBIQSA9IFJFQUwoIEFMRiggSUEgKSApCisgICAgICAgICAgICAgICAgICBBTFBIQSA9IENNUExYKCBSQUxQSEEsIFJaRVJPICkKKyAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuUkFMUEhBLkVRLlJaRVJPCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgUkFMUyA9IFJBTFBIQQorICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgUkFMUEhBLCBJTkNYLCBMREEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIENIRVIoIFVQTE8sIE4sIFJBTFBIQSwgWFgsIElOQ1gsIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJBTFBIQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hQUiggVVBMTywgTiwgUkFMUEhBLCBYWCwgSU5DWCwgQUEgKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBSQUxTLkVRLlJBTFBIQQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0VSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sIE4sIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5QQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTiAtIEkgKyAxICkKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIEpBID0gMQorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IENPTkpHKCBaKCBKICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNVkNIKCAnTicsIExKLCAxLCBBTFBIQSwgWiggSkogKSwgTEosIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBPTkUsIEEoIEpKLCBKICksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyBpZiBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDExMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBSQUxQSEEsIElOQ1gsIExEQQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBSQUxQSEEsIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBYLCcsCisgICAgICQgICAgICBJMiwgJywgQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzYoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgQ0hFUjIgYW5kIENIUFIyLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYLCAyICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBBTFMsIFRSQU5TTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgSkEsIEpKLCBMQUEsIExEQSwgTERBUywgTEosIExYLCBMWSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgVyggMiApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hFUjIsIENIUFIyLCBDTUFLRSwgQ01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIENPTkpHLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDkKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA4CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxNDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERBID0gTgorICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDE0MAorICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIERPIDEzMCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyAxMjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwgQUJTKCBJTkNYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gMTEwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFkuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWSwgMSwgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWSggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBZWSggMSArIEFCUyggSU5DWSApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLkFMUEhBLkVRLlpFUk8KKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIE4gLSAxLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIRVIyKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIUFIyKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTYwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMSApID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIE4gLSBJICsgMSApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMiApID0gWSggSSApCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gODAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIE4gLSBJICsgMSApCisgICA4MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBBTFBIQSpDT05KRyggWiggSiwgMiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDIgKSA9IENPTkpHKCBBTFBIQSApKkNPTkpHKCBaKCBKLCAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNVkNIKCAnTicsIExKLCAyLCBPTkUsIFooIEpKLCAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBXLCAxLCBPTkUsIEEoIEpKLCBKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVCwgRywgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgOTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgICAgQ09OVElOVUUKKyoKKyAgMTMwICAgIENPTlRJTlVFCisqCisgIDE0MCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTcwCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTYwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwKKyAgICAgJCAgICAgIElOQ1ksIExEQQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE3MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgWCwnLCBJMiwgJywgWSwnLCBJMiwgJywgQVApICAgICAgICAgICAgICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NIS0UoIElTTlVNLCBTUk5BTVQsIE5PVVQgKQorKgorKiAgVGVzdHMgdGhlIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQmxhcy4KKyogIFJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBlcnJvci1oYW5kbGluZyByb3V0aW5lIFhFUkJMQS4KKyogIEFMUEhBLCBSQUxQSEEsIEJFVEEsIEEsIFggYW5kIFkgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGRlZmluZWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJU05VTSwgTk9VVAorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBSRUFMICAgICAgICAgICAgICAgUkFMUEhBCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCAxLCAxICksIFgoIDEgKSwgWSggMSApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENHQk1WLCBDR0VNViwgQ0dFUkMsIENHRVJVLCBDSEJNViwgQ0hFTVYsIENIRVIsCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0hFUjIsIENIS1hFUiwgQ0hQTVYsIENIUFIsIENIUFIyLCBDVEJNViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDVEJTViwgQ1RQTVYsIENUUFNWLCBDVFJNViwgQ1RSU1YKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIEdPIFRPICggMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLAorICAgICAkICAgICAgICA5MCwgMTAwLCAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwgMTYwLAorICAgICAkICAgICAgICAxNzAgKUlTTlVNCisgICAxMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0dFTVYoICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDR0VNViggJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNViggJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDR0VNViggJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1WKCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENHRU1WKCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBDR0JNViggJy8nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENHQk1WKCAnTicsIC0xLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHQk1WKCAnTicsIDAsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHQk1WKCAnTicsIDAsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHQk1WKCAnTicsIDIsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHQk1WKCAnTicsIDAsIDAsIDEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHQk1WKCAnTicsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHQk1WKCAnTicsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVNViggJy8nLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIRU1WKCAnVScsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENIRU1WKCAnVScsIDIsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFTVYoICdVJywgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0hFTVYoICdVJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgNDAgSU5GT1QgPSAxCisgICAgICBDQUxMIENIQk1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hCTVYoICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hCTVYoICdVJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ0hCTVYoICdVJywgMCwgMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDSEJNViggJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDSEJNViggJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hQTVYoICcvJywgMCwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSFBNViggJ1UnLCAtMSwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDSFBNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIUE1WKCAnVScsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDYwIElORk9UID0gMQorICAgICAgQ0FMTCBDVFJNViggJy8nLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUUk1WKCAnVScsICcvJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RSTVYoICdVJywgJ04nLCAnLycsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVFJNViggJ1UnLCAnTicsICdOJywgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNViggJ1UnLCAnTicsICdOJywgMiwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENUUk1WKCAnVScsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDcwIElORk9UID0gMQorICAgICAgQ0FMTCBDVEJNViggJy8nLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUQk1WKCAnVScsICcvJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RCTVYoICdVJywgJ04nLCAnLycsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVEJNViggJ1UnLCAnTicsICdOJywgLTEsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVEJNViggJ1UnLCAnTicsICdOJywgMCwgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDVEJNViggJ1UnLCAnTicsICdOJywgMCwgMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUQk1WKCAnVScsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDgwIElORk9UID0gMQorICAgICAgQ0FMTCBDVFBNViggJy8nLCAnTicsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUUE1WKCAnVScsICcvJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RQTVYoICdVJywgJ04nLCAnLycsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVFBNViggJ1UnLCAnTicsICdOJywgLTEsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDVFBNViggJ1UnLCAnTicsICdOJywgMCwgQSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA5MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1RSU1YoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDVFJTViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENUUlNWKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1RSU1YoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU1YoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDVFJTViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDEwMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1RCU1YoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDVEJTViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENUQlNWKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1RCU1YoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RCU1YoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1RCU1YoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVEJTViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDExMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1RQU1YoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDVFBTViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENUUFNWKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1RQU1YoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1RQU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMjAgSU5GT1QgPSAxCisgICAgICBDQUxMIENHRVJDKCAtMSwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDR0VSQyggMCwgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFUkMoIDAsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0dFUkMoIDAsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0dFUkMoIDIsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTMwIElORk9UID0gMQorICAgICAgQ0FMTCBDR0VSVSggLTEsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0dFUlUoIDAsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRVJVKCAwLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENHRVJVKCAwLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENHRVJVKCAyLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hFUiggJy8nLCAwLCBSQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSEVSKCAnVScsIC0xLCBSQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDSEVSKCAnVScsIDAsIFJBTFBIQSwgWCwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVIoICdVJywgMiwgUkFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTUwIElORk9UID0gMQorICAgICAgQ0FMTCBDSFBSKCAnLycsIDAsIFJBTFBIQSwgWCwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIUFIoICdVJywgLTEsIFJBTFBIQSwgWCwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENIUFIoICdVJywgMCwgUkFMUEhBLCBYLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTYwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVSMiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIRVIyKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENIRVIyKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUjIoICdVJywgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVSMiggJ1UnLCAyLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hQUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSFBSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDSFBSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIUFIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDE4MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgS0wsCisgICAgICQgICAgICAgICAgICAgICAgICBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisqICBHZW5lcmF0ZXMgdmFsdWVzIGZvciBhbiBNIGJ5IE4gbWF0cml4IEEgd2l0aGluIHRoZSBiYW5kd2lkdGgKKyogIGRlZmluZWQgYnkgS0wgYW5kIEtVLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnR0InLCAnSEUnLCAnSEInLCAnSFAnLCAnVFInLCAnVEInIE9SICdUUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBDT01QTEVYICAgICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gKCAtMS4wRTEwLCAxLjBFMTAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJST0dVRSA9IC0xLjBFMTAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEtMLCBLVSwgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSTEsIEkyLCBJMywgSUJFRywgSUVORCwgSU9GRiwgSiwgSkosIEtLCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgR0VOLCBMT1dFUiwgU1lNLCBUUkksIFVOSVQsIFVQUEVSCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBDQkVHCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0JFRworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENNUExYLCBDT05KRywgTUFYLCBNSU4sIFJFQUwKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRSggMTogMSApLkVRLidHJworICAgICAgU1lNID0gVFlQRSggMTogMSApLkVRLidIJworICAgICAgVFJJID0gVFlQRSggMTogMSApLkVRLidUJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBJRiggKCBJLkxFLkouQU5ELkogLSBJLkxFLktVICkuT1IuCisgICAgICQgICAgICAgICAgICAgKCBJLkdFLkouQU5ELkkgLSBKLkxFLktMICkgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IENCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIEkuTkUuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gQ09OSkcoIEEoIEksIEogKSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBUUkkgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTkQgSUYKKyAgIDEwICAgIENPTlRJTlVFCisgICAgICAgICBJRiggU1lNICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IENNUExYKCBSRUFMKCBBKCBKLCBKICkgKSwgUlpFUk8gKQorICAgICAgICAgSUYoIFRSSSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBBKCBKLCBKICkgKyBPTkUKKyAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IE9ORQorICAgMjAgQ09OVElOVUUKKyoKKyogICAgIFN0b3JlIGVsZW1lbnRzIGluIGFycmF5IEFTIGluIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHJvdXRpbmUuCisqCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nR0InIClUSEVOCisgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gNjAgSTEgPSAxLCBLVSArIDEgLSBKCisgICAgICAgICAgICAgICBBQSggSTEgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkyID0gSTEsIE1JTiggS0wgKyBLVSArIDEsIEtVICsgMSArIE0gLSBKICkKKyAgICAgICAgICAgICAgIEFBKCBJMiArICggSiAtIDEgKSpMREEgKSA9IEEoIEkyICsgSiAtIEtVIC0gMSwgSiApCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gODAgSTMgPSBJMiwgTERBCisgICAgICAgICAgICAgICBBQSggSTMgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nVFInIClUSEVOCisgICAgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDEwMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTAwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgIDExMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTIwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDEyMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgSkogPSBKICsgKCBKIC0gMSApKkxEQQorICAgICAgICAgICAgICAgQUEoIEpKICkgPSBDTVBMWCggUkVBTCggQUEoIEpKICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgIEVORCBJRgorICAxMzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hCJy5PUi5UWVBFLkVRLidUQicgKVRIRU4KKyAgICAgICAgIERPIDE3MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBLSyA9IEtMICsgMQorICAgICAgICAgICAgICAgSUJFRyA9IE1BWCggMSwgS0wgKyAyIC0gSiApCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wgKyAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSAyCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTUlOKCBLTCArIDEsIDEgKyBNIC0gSiApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE0MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTQwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSArIEogLSBLSywgSiApCisgIDE1MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTYwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgSkogPSBLSyArICggSiAtIDEgKSpMREEKKyAgICAgICAgICAgICAgIEFBKCBKSiApID0gQ01QTFgoIFJFQUwoIEFBKCBKSiApICksIFJST0dVRSApCisgICAgICAgICAgICBFTkQgSUYKKyAgMTcwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIUCcuT1IuVFlQRS5FUS4nVFAnIClUSEVOCisgICAgICAgICBJT0ZGID0gMAorICAgICAgICAgRE8gMTkwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE4MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgSU9GRiA9IElPRkYgKyAxCisgICAgICAgICAgICAgICBBQSggSU9GRiApID0gQSggSSwgSiApCisgICAgICAgICAgICAgICBJRiggSS5FUS5KIClUSEVOCisgICAgICAgICAgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICAgICAgICAgICBBQSggSU9GRiApID0gUk9HVUUKKyAgICAgICAgICAgICAgICAgIElGKCBTWU0gKQorICAgICAkICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IENNUExYKCBSRUFMKCBBQSggSU9GRiApICksIFJST0dVRSApCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgMTgwICAgICAgIENPTlRJTlVFCisgIDE5MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDTUFLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDTVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLCBOTUFYLCBYLCBJTkNYLCBCRVRBLCBZLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DWSwgWVQsIEcsIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIE1WICkKKyoKKyogIENoZWNrcyB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcHV0YXRpb25hbCB0ZXN0cy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCwgUk9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEJFVEEKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIEVSUgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIElOQ1ksIE0sIE4sIE5NQVgsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgKiApLCBYKCAqICksIFkoICogKSwgWVQoICogKSwgWVkoICogKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEMKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSU5DWEwsIElOQ1lMLCBJWSwgSiwgSlgsIEtYLCBLWSwgTUwsIE5MCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQ1RSQU4sIFRSQU4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIEFJTUFHLCBDT05KRywgTUFYLCBSRUFMLCBTUVJUCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUJTMQorKiAgICAgLi4gU3RhdGVtZW50IEZ1bmN0aW9uIGRlZmluaXRpb25zIC4uCisgICAgICBBQlMxKCBDICkgPSBBQlMoIFJFQUwoIEMgKSApICsgQUJTKCBBSU1BRyggQyApICkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJworICAgICAgQ1RSQU4gPSBUUkFOUy5FUS4nQycKKyAgICAgIElGKCBUUkFOLk9SLkNUUkFOIClUSEVOCisgICAgICAgICBNTCA9IE4KKyAgICAgICAgIE5MID0gTQorICAgICAgRUxTRQorICAgICAgICAgTUwgPSBNCisgICAgICAgICBOTCA9IE4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1guTFQuMCApVEhFTgorICAgICAgICAgS1ggPSBOTAorICAgICAgICAgSU5DWEwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1ggPSAxCisgICAgICAgICBJTkNYTCA9IDEKKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1kuTFQuMCApVEhFTgorICAgICAgICAgS1kgPSBNTAorICAgICAgICAgSU5DWUwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1kgPSAxCisgICAgICAgICBJTkNZTCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQgaW4gWVQgdXNpbmcgZGF0YSBpbiBBLCBYIGFuZCBZLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIElZID0gS1kKKyAgICAgIERPIDQwIEkgPSAxLCBNTAorICAgICAgICAgWVQoIElZICkgPSBaRVJPCisgICAgICAgICBHKCBJWSApID0gUlpFUk8KKyAgICAgICAgIEpYID0gS1gKKyAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICBETyAxMCBKID0gMSwgTkwKKyAgICAgICAgICAgICAgIFlUKCBJWSApID0gWVQoIElZICkgKyBBKCBKLCBJICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMxKCBBKCBKLCBJICkgKSpBQlMxKCBYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIENUUkFOIClUSEVOCisgICAgICAgICAgICBETyAyMCBKID0gMSwgTkwKKyAgICAgICAgICAgICAgIFlUKCBJWSApID0gWVQoIElZICkgKyBDT05KRyggQSggSiwgSSApICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMxKCBBKCBKLCBJICkgKSpBQlMxKCBYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIERPIDMwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEksIEogKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEksIEogKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBZVCggSVkgKSA9IEFMUEhBKllUKCBJWSApICsgQkVUQSpZKCBJWSApCisgICAgICAgICBHKCBJWSApID0gQUJTMSggQUxQSEEgKSpHKCBJWSApICsgQUJTMSggQkVUQSApKkFCUzEoIFkoIElZICkgKQorICAgICAgICAgSVkgPSBJWSArIElOQ1lMCisgICA0MCBDT05USU5VRQorKgorKiAgICAgQ29tcHV0ZSB0aGUgZXJyb3IgcmF0aW8gZm9yIHRoaXMgcmVzdWx0LgorKgorICAgICAgRVJSID0gWkVSTworICAgICAgRE8gNTAgSSA9IDEsIE1MCisgICAgICAgICBFUlJJID0gQUJTKCBZVCggSSApIC0gWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSApL0VQUworICAgICAgICAgSUYoIEcoIEkgKS5ORS5SWkVSTyApCisgICAgICQgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuUk9ORSApCisgICAgICQgICAgICBHTyBUTyA2MAorICAgNTAgQ09OVElOVUUKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyA4MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAgNjAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDcwIEkgPSAxLCBNTAorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgWVQoIEkgKSwKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSwgWVQoIEkgKQorICAgICAgICAgRU5EIElGCisgICA3MCBDT05USU5VRQorKgorICAgODAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEIFJFJywKKyAgICAgJCAgICAgICdTVUxUICAgICAgICAgICAgICAgICAgICBDT01QVVRFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyKCAnICAoJywgRzE1LjYsICcsJywgRzE1LjYsICcpJyApICkKKyoKKyogICAgIEVuZCBvZiBDTVZDSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMQ0UoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExDRSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMQ0UgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMQ0UuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTENFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0hFJyBvciAnSFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgICAgTENFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExDRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExDRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgQ09NUExFWCBGVU5DVElPTiBDQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDLCBKLCBNSSwgTUoKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENNUExYCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCBSRVNFVCApVEhFTgorKiAgICAgICAgSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCisgICAgICAgICBNSSA9IDg5MQorICAgICAgICAgTUogPSA0NTcKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBKID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIG9yIEogaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gMSwyLDMsNiw3IG9yIDksIHRoZSBwZXJpb2Qgd2lsbCBiZSA1MC4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgb3IgSiA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgb3IgSgorKiAgICAgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSiA9IEoqTUoKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBKID0gSiAtIDEwMDAqKCBKLzEwMDAgKQorICAgICAgSUYoIElDLkdFLjUgKVRIRU4KKyAgICAgICAgIElDID0gMAorICAgICAgICAgR08gVE8gMTAKKyAgICAgIEVORCBJRgorICAgICAgQ0JFRyA9IENNUExYKCAoIEkgLSA1MDAgKS8xMDAxLjAsICggSiAtIDUwMCApLzEwMDEuMCApCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDQkVHLgorKgorICAgICAgRU5ECisgICAgICBSRUFMIEZVTkNUSU9OIFNESUZGKCBYLCBZICkKKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCwgWQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFggLSBZCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTRElGRi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyogIFRlc3RzIHdoZXRoZXIgWEVSQkxBIGhhcyBkZXRlY3RlZCBhbiBlcnJvciB3aGVuIGl0IHNob3VsZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvY2JsYXQzLmRhdCBiL2JsYXMvdGVzdGluZy9jYmxhdDMuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODgxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvY2JsYXQzLmRhdApAQCAtMCwwICsxLDIzIEBACisnY2JsYXQzLnN1bW0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKzYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorJ2NibGF0My5zbmFwJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKzE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCis2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKzAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisoMC4wLDAuMCkgKDEuMCwwLjApICgwLjcsLTAuOSkgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDEuMywtMS4xKSAgICAgICBWQUxVRVMgT0YgQkVUQQorQ0dFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEVSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1NZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2NibGF0My5mIGIvYmxhcy90ZXN0aW5nL2NibGF0My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjJjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvY2JsYXQzLmYKQEAgLTAsMCArMSwzNDkyIEBACisqPiBcYnJpZWYgXGIgQ0JMQVQzCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBQUk9HUkFNIENCTEFUMworKiAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBUZXN0IHByb2dyYW0gZm9yIHRoZSBDT01QTEVYICAgICAgICAgIExldmVsIDMgQmxhcy4KKyo+CisqPiBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE0IHJlY29yZHMKKyo+IG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDkgcmVjb3JkcworKj4gYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyo+IGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyo+IGZvbGxvd2luZyAyMyBsaW5lczoKKyo+ICdjYmxhdDMub3V0JyAgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKj4gNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqPiAnQ0JMQVQzLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqPiAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyo+IFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKj4gMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyo+IDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKj4gMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyo+ICgwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKj4gKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCisqPiBDR0VNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ0hFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ1RSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENIRVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBDU1lSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gQ0hFUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IENTWVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPgorKj4gRnVydGhlciBEZXRhaWxzCisqPiA9PT09PT09PT09PT09PT0KKyo+CisqPiBTZWU6CisqPgorKj4gICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIER1ZmYgSS4gUy4gYW5kIEhhbW1hcmxpbmcgUy4KKyo+ICAgIEEgU2V0IG9mIExldmVsIDMgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqPgorKj4gICAgVGVjaG5pY2FsIE1lbW9yYW5kdW0gTm8uODggKFJldmlzaW9uIDEpLCBNYXRoZW1hdGljcyBhbmQKKyo+ICAgIENvbXB1dGVyIFNjaWVuY2UgRGl2aXNpb24sIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeSwgOTcwMAorKj4gICAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyo+CisqPiAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyo+ICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyo+ICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKj4gICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyo+ICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKj4KKyo+ICAgIDEwLTktMDA6ICBDaGFuZ2UgU1RBVFVTPSdORVcnIHRvICdVTktOT1dOJyBzbyB0aGF0IHRoZSB0ZXN0ZXJzCisqPiAgICAgICAgICAgICAgY2FuIGJlIHJ1biBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGRlbGV0aW5nIGdlbmVyYXRlZAorKj4gICAgICAgICAgICAgIG91dHB1dCBmaWxlcyAoc3VzYW4pCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBjb21wbGV4X2JsYXNfdGVzdGluZworKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBQUk9HUkFNIENCTEFUMworKgorKiAgLS0gUmVmZXJlbmNlIEJMQVMgdGVzdCByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gUmVmZXJlbmNlIEJMQVMgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIEFwcmlsIDIwMTIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gOSApCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBPTkUgPSAoIDEuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1ICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSURNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSURNQVggPSA5LCBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIE5NQVgsIDIqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQlMoIE5NQVgqTk1BWCApLCBDKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0MoIE5NQVgqTk1BWCApLCBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgVyggMipOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURNQVggKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExURVNUKCBOU1VCUyApCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVTKCBOU1VCUyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBTRElGRgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRQorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNESUZGLCBMQ0UKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0NISzEsIENDSEsyLCBDQ0hLMywgQ0NISzQsIENDSEs1LCBDQ0hLRSwgQ01NQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIFNOQU1FUy8nQ0dFTU0gJywgJ0NIRU1NICcsICdDU1lNTSAnLCAnQ1RSTU0gJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ1RSU00gJywgJ0NIRVJLICcsICdDU1lSSyAnLCAnQ0hFUjJLJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ1NZUjJLJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUyApCisgICAgICBFTkQgSUYKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHJld2luZGluZyBvZiB0aGUgc25hcHNob3QgZmlsZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApUkVXSQorICAgICAgUkVXSSA9IFJFV0kuQU5ELlRSQUNFCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyBzdG9wcGluZyBvbiBhbnkgZmFpbHVyZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU0ZBVEFMCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgZXhpdHMgYXJlIHRvIGJlIHRlc3RlZC4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVFNURVJSCisqICAgICBSZWFkIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgdGhlIHRlc3QgcmF0aW8KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVEhSRVNICisqCisqICAgICBSZWFkIGFuZCBjaGVjayB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHRlc3RzLgorKgorKiAgICAgVmFsdWVzIG9mIE4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklESU0KKyAgICAgIElGKCBOSURJTS5MVC4xLk9SLk5JRElNLkdULk5JRE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdOJywgTklETUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIERPIDEwIEkgPSAxLCBOSURJTQorICAgICAgICAgSUYoIElESU0oIEkgKS5MVC4wLk9SLklESU0oIEkgKS5HVC5OTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApTk1BWAorICAgICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgIDEwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODQgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyAyMCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICAyMCBDT05USU5VRQorICAgMzAgUkVBRCggTklOLCBGTVQgPSA5OTg4LCBFTkQgPSA2MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDQwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwIClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDUwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDMwCisqCisgICA2MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFJaRVJPKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUVQUworKgorKiAgICAgQ2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIENNTUNIIHVzaW5nIGV4YWN0IGRhdGEuCisqCisgICAgICBOID0gTUlOKCAzMiwgTk1BWCApCisgICAgICBETyAxMDAgSiA9IDEsIE4KKyAgICAgICAgIERPIDkwIEkgPSAxLCBOCisgICAgICAgICAgICBBQiggSSwgSiApID0gTUFYKCBJIC0gSiArIDEsIDAgKQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgICAgIEFCKCBKLCBOTUFYICsgMSApID0gSgorICAgICAgICAgQUIoIDEsIE5NQVggKyBKICkgPSBKCisgICAgICAgICBDKCBKLCAxICkgPSBaRVJPCisgIDEwMCBDT05USU5VRQorICAgICAgRE8gMTEwIEogPSAxLCBOCisgICAgICAgICBDQyggSiApID0gSiooICggSiArIDEgKSpKICkvMiAtICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMTAgQ09OVElOVUUKKyogICAgIENDIGhvbGRzIHRoZSBleGFjdCByZXN1bHQuIE9uIGV4aXQgZnJvbSBDTU1DSCBDVCBob2xkcworKiAgICAgdGhlIHJlc3VsdCBjb21wdXRlZCBieSBDTU1DSC4KKyAgICAgIFRSQU5TQSA9ICdOJworICAgICAgVFJBTlNCID0gJ04nCisgICAgICBDQUxMIENNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTENFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdDJworICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExDRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyAgICAgICAgIEFCKCBKLCBOTUFYICsgMSApID0gTiAtIEogKyAxCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IE4gLSBKICsgMQorICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgQ0MoIE4gLSBKICsgMSApID0gSiooICggSiArIDEgKSpKICkvMiAtCisgICAgICQgICAgICAgICAgICAgICAgICAgICAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisgICAgICBUUkFOU0EgPSAnQycKKyAgICAgIFRSQU5TQiA9ICdOJworICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExDRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOU0IgPSAnQycKKyAgICAgIENBTEwgQ01NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMQ0UoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorKgorKiAgICAgVGVzdCBlYWNoIHN1YnJvdXRpbmUgaW4gdHVybi4KKyoKKyAgICAgIERPIDIwMCBJU05VTSA9IDEsIE5TVUJTCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBJRiggLk5PVC5MVEVTVCggSVNOVU0gKSApVEhFTgorKiAgICAgICAgICAgU3VicHJvZ3JhbSBpcyBub3QgdG8gYmUgdGVzdGVkLgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODcgKVNOQU1FUyggSVNOVU0gKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgU1JOQU1UID0gU05BTUVTKCBJU05VTSApCisqICAgICAgICAgICBUZXN0IGVycm9yIGV4aXRzLgorICAgICAgICAgICAgSUYoIFRTVEVSUiApVEhFTgorICAgICAgICAgICAgICAgQ0FMTCBDQ0hLRSggSVNOVU0sIFNOQU1FUyggSVNOVU0gKSwgTk9VVCApCisgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFRlc3QgY29tcHV0YXRpb25zLgorICAgICAgICAgICAgSU5GT1QgPSAwCisgICAgICAgICAgICBPSyA9IC5UUlVFLgorICAgICAgICAgICAgRkFUQUwgPSAuRkFMU0UuCisgICAgICAgICAgICBHTyBUTyAoIDE0MCwgMTUwLCAxNTAsIDE2MCwgMTYwLCAxNzAsIDE3MCwKKyAgICAgJCAgICAgICAgICAgICAgMTgwLCAxODAgKUlTTlVNCisqICAgICAgICAgICBUZXN0IENHRU1NLCAwMS4KKyAgMTQwICAgICAgIENBTEwgQ0NISzEoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBDSEVNTSwgMDIsIENTWU1NLCAwMy4KKyAgMTUwICAgICAgIENBTEwgQ0NISzIoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBDVFJNTSwgMDQsIENUUlNNLCAwNS4KKyAgMTYwICAgICAgIENBTEwgQ0NISzMoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5NQVgsIEFCLAorICAgICAkICAgICAgICAgICAgICAgICAgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDVCwgRywgQyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgQ0hFUkssIDA2LCBDU1lSSywgMDcuCisgIDE3MCAgICAgICBDQUxMIENDSEs0KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgQ0hFUjJLLCAwOCwgQ1NZUjJLLCAwOS4KKyAgMTgwICAgICAgIENBTEwgQ0NISzUoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyoKKyAgMTkwICAgICAgIElGKCBGQVRBTC5BTkQuU0ZBVEFMICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIxMAorICAgICAgICAgRU5EIElGCisgIDIwMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODYgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIxMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTEgKQorKgorICAyMzAgQ09OVElOVUUKKyAgICAgIElGKCBUUkFDRSApCisgICAgICQgICBDTE9TRSAoIE5UUkEgKQorICAgICAgQ0xPU0UgKCBOT1VUICkKKyAgICAgIFNUT1AKKyoKKyA5OTk5IEZPUk1BVCggJyBST1VUSU5FUyBQQVNTIENPTVBVVEFUSU9OQUwgVEVTVFMgSUYgVEVTVCBSQVRJTyBJUyBMRVMnLAorICAgICAkICAgICAgJ1MgVEhBTicsIEY4LjIgKQorIDk5OTggRk9STUFUKCAnIFJFTEFUSVZFIE1BQ0hJTkUgUFJFQ0lTSU9OIElTIFRBS0VOIFRPIEJFJywgMVAsIEU5LjEgKQorIDk5OTcgRk9STUFUKCAnIE5VTUJFUiBPRiBWQUxVRVMgT0YgJywgQSwgJyBJUyBMRVNTIFRIQU4gMSBPUiBHUkVBVEVSICcsCisgICAgICQgICAgICAnVEhBTiAnLCBJMiApCisgOTk5NiBGT1JNQVQoICcgVkFMVUUgT0YgTiBJUyBMRVNTIFRIQU4gMCBPUiBHUkVBVEVSIFRIQU4gJywgSTIgKQorIDk5OTUgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBDT01QTEVYICAgICAgICAgIExFVkVMIDMgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5NCBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkzIEZPUk1BVCggJyAgIEZPUiBBTFBIQSAgICAgICAgICAnLAorICAgICAkICAgICAgNyggJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICAnLCA6ICkgKQorIDk5OTIgRk9STUFUKCAnICAgRk9SIEJFVEEgICAgICAgICAgICcsCisgICAgICQgICAgICA3KCAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgICcsIDogKSApCisgOTk5MSBGT1JNQVQoICcgQU1FTkQgREFUQSBGSUxFIE9SIElOQ1JFQVNFIEFSUkFZIFNJWkVTIElOIFBST0dSQU0nLAorICAgICAkICAgICAgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5OTAgRk9STUFUKCAnIFNVQlBST0dSQU0gTkFNRSAnLCBBNiwgJyBOT1QgUkVDT0dOSVpFRCcsIC8nICoqKioqKiogVCcsCisgICAgICQgICAgICAnRVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODkgRk9STUFUKCAnIEVSUk9SIElOIENNTUNIIC0gIElOLUxJTkUgRE9UIFBST0RVQ1RTIEFSRSBCRUlORyBFVkFMVScsCisgICAgICQgICAgICAnQVRFRCBXUk9OR0xZLicsIC8nIENNTUNIIFdBUyBDQUxMRUQgV0lUSCBUUkFOU0EgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFRSQU5TQiA9ICcsIEExLCAvJyBBTkQgUkVUVVJORUQgU0FNRSA9ICcsIEwxLCAnIEFORCAnLAorICAgICAkICAgICAgJ0VSUiA9ICcsIEYxMi4zLCAnLicsIC8nIFRISVMgTUFZIEJFIERVRSBUTyBGQVVMVFMgSU4gVEhFICcsCisgICAgICQgICAgICAnQVJJVEhNRVRJQyBPUiBUSEUgQ09NUElMRVIuJywgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgJywKKyAgICAgJCAgICAgICcqKioqKioqJyApCisgOTk4OCBGT1JNQVQoIEE2LCBMMiApCisgOTk4NyBGT1JNQVQoIDFYLCBBNiwgJyBXQVMgTk9UIFRFU1RFRCcgKQorIDk5ODYgRk9STUFUKCAvJyBFTkQgT0YgVEVTVFMnICkKKyA5OTg1IEZPUk1BVCggLycgKioqKioqKiBGQVRBTCBFUlJPUiAtIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NCBGT1JNQVQoICcgRVJST1ItRVhJVFMgV0lMTCBOT1QgQkUgVEVTVEVEJyApCisqCisqICAgICBFbmQgb2YgQ0JMQVQzLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENDSEsxKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEEsIEFBLCBBUywgQiwgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHICkKKyoKKyogIFRlc3RzIENHRU1NLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDQSwgSUNCLCBJSywgSU0sIElOLCBLLCBLUywgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgIE1BLCBNQiwgTVMsIE4sIE5BLCBOQVJHUywgTkIsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOQSwgVFJBTkIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOQVMsIFRSQU5CUywgVFJBTlNBLCBUUkFOU0IKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENHRU1NLCBDTUFLRSwgQ01NQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydOVEMnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEzCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTEwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERDID0gTQorICAgICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJSyA9IDEsIE5JRElNCisgICAgICAgICAgICAgICBLID0gSURJTSggSUsgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNBID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlNBID0gSUNIKCBJQ0E6IElDQSApCisgICAgICAgICAgICAgICAgICBUUkFOQSA9IFRSQU5TQS5FUS4nVCcuT1IuVFJBTlNBLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU5BIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgTUEgPSBNCisgICAgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEEsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0IgPSAxLCAzCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0IgPSBJQ0goIElDQjogSUNCICkKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5CID0gVFJBTlNCLkVRLidUJy5PUi5UUkFOU0IuRVEuJ0MnCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTkIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIE1CID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgTkIgPSBLCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBNQiA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5CID0gTgorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgICAgICAgIExEQiA9IE1CCisgICAgICAgICAgICAgICAgICAgICBJRiggTERCLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgICAgTERCID0gTERCICsgMQorKiAgICAgICAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICAgICAgICBJRiggTERCLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgICAgR08gVE8gNzAKKyAgICAgICAgICAgICAgICAgICAgIExCQiA9IExEQipOQgorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE1CLCBOQiwgQiwgTk1BWCwgQkIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREIsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQVMgPSBUUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5CUyA9IFRSQU5TQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENHRU1NKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBUUkFOU0EuRVEuVFJBTkFTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNCLkVRLlRSQU5CUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTENFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMQ0UoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTENFUkVTKCAnR0UnLCAnICcsIE0sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEzICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEsIE5NQVgsIEIsIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLCBOTUFYLCBDVCwgRywgQ0MsIExEQywgRVBTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgQ09OVElOVUUKKyoKKyAgMTEwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLAorICAgICAkICAgQUxQSEEsIExEQSwgTERCLCBCRVRBLCBMREMKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJycnLCBBMSwgJycnLCcsCisgICAgICQgICAgICAzKCBJMywgJywnICksICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywKKyAgICAgJCAgICAgICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEMsJywgSTMsICcpLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzEuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzIoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgQ0hFTU0gYW5kIENTWU1NLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDUywgSUNVLCBJTSwgSU4sIExBQSwgTEJCLCBMQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIExEQywgTERDUywgTSwgTVMsIE4sIE5BLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDT05KLCBMRUZULCBOVUxMLCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFNJREUsIFNJREVTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFMsIElDSFUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENIRU1NLCBDTUFLRSwgQ01NQ0gsIENTWU1NCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFMvJ0xSJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgQ09OSiA9IFNOQU1FKCAyOiAzICkuRVEuJ0hFJworKgorICAgICAgTkFSR1MgPSAxMgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDEwMCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gOTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERDID0gTQorICAgICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDkwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyogICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERCID0gTQorICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDkwCisgICAgICAgICAgICBMQkIgPSBMREIqTgorKgorKiAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEIsIE5NQVgsIEJCLCBMREIsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgWkVSTyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1MgPSAxLCAyCisgICAgICAgICAgICAgICBTSURFID0gSUNIUyggSUNTOiBJQ1MgKQorICAgICAgICAgICAgICAgTEVGVCA9IFNJREUuRVEuJ0wnCisqCisgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBOQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgaGVybWl0aWFuIG9yIHN5bW1ldHJpYyBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTkEsIE5BLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwgQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hFTU0oIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENTWU1NKCBTSURFLCBVUExPLCBNLCBOLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gU0lERVMuRVEuU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExDRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMQ0VSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goICdOJywgJ04nLCBNLCBOLCBNLCBBTFBIQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEIsIE5NQVgsIEJFVEEsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVCwgRywgQ0MsIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goICdOJywgJ04nLCBNLCBOLCBOLCBBTFBIQSwgQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEEsIE5NQVgsIEJFVEEsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVCwgRywgQ0MsIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTIwCisqCisgIDExMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLCBVUExPLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgTERCLCBCRVRBLCBMREMKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCgnLCBGNC4xLAorICAgICAkICAgICAgJywnLCBGNC4xLCAnKSwgQywnLCBJMywgJykgICAgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgQiwgQkIsIEJTLCBDVCwgRywgQyApCisqCisqICBUZXN0cyBDVFJNTSBhbmQgQ1RSU00uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUNELCBJQ1MsIElDVCwgSUNVLCBJTSwgSU4sIEosIExBQSwgTEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTERCLCBMREJTLCBNLCBNUywgTiwgTkEsIE5BUkdTLCBOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFNJREUsIFNJREVTLCBUUkFOQVMsIFRSQU5TQSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSEQsIElDSFMsIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDTUFLRSwgQ01NQ0gsIENUUk1NLCBDVFJTTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hVLydVTCcvLCBJQ0hULydOVEMnLywgSUNIRC8nVU4nLywgSUNIUy8nTFInLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDExCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKiAgICAgU2V0IHVwIHplcm8gbWF0cml4IGZvciBDTU1DSC4KKyAgICAgIERPIDIwIEogPSAxLCBOTUFYCisgICAgICAgICBETyAxMCBJID0gMSwgTk1BWAorICAgICAgICAgICAgQyggSSwgSiApID0gWkVSTworICAgMTAgICAgQ09OVElOVUUKKyAgIDIwIENPTlRJTlVFCisqCisgICAgICBETyAxNDAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDEzMCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREIgPSBNCisgICAgICAgICAgICBJRiggTERCLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERCID0gTERCICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERCLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICBMQkIgPSBMREIqTgorICAgICAgICAgICAgTlVMTCA9IE0uTEUuMC5PUi5OLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDEyMCBJQ1MgPSAxLCAyCisgICAgICAgICAgICAgICBTSURFID0gSUNIUyggSUNTOiBJQ1MgKQorICAgICAgICAgICAgICAgTEVGVCA9IFNJREUuRVEuJ0wnCisgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBOQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisgICAgICAgICAgICAgICBETyAxMTAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0EgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA5MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gODAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ1RSJywgVVBMTywgRElBRywgTkEsIE5BLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQUEsIExEQSwgUkVTRVQsIFpFUk8gKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEIsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTSURFUyA9IFNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkFTID0gVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFHUyA9IERJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTU0nIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwgTiwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIEFMUEhBLCBBQSwgTERBLCBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NNJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sIE4sIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENUUlNNKCBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBBTFBIQSwgQUEsIExEQSwgQkIsIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBTSURFUy5FUS5TSURFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IFRSQU5BUy5FUS5UUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBESUFHUy5FUS5ESUFHCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTENFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExDRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBCUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTERCUy5FUS5MREIKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNTScgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCAnTicsIE0sIE4sIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSwgTk1BWCwgQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEMsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goICdOJywgVFJBTlNBLCBNLCBOLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEIsIE5NQVgsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBDLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NNJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXguCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEksIEogKSA9IEJCKCBJICsgKCBKIC0gMSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCKCBJICsgKCBKIC0gMSApKkxEQiApID0gQUxQSEEqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKCBJLCBKICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICA3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goIFRSQU5TQSwgJ04nLCBNLCBOLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBBLCBOTUFYLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQiwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuRkFMU0UuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goICdOJywgVFJBTlNBLCBNLCBOLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBDLCBOTUFYLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQiwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuRkFMU0UuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgICAgQ09OVElOVUUKKyoKKyAgMTMwICAgIENPTlRJTlVFCisqCisgIDE0MCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTYwCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sCisgICAgICQgICBOLCBBTFBIQSwgTERBLCBMREIKKyoKKyAgMTYwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCA0KCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnKSAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzQoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgQ0hFUksgYW5kIENTWVJLLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBST05FLCBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9ORSA9IDEuMCwgUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkVUUworICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYLCBSQUxQSEEsIFJBTFMsIFJCRVRBLCBSQkVUUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBLLCBLUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMQUEsIExDQywgTERBLCBMREFTLCBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFRSQU5TVCwgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hULCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEVSSywgQ01BS0UsIENNTUNILCBDU1lSSworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENNUExYLCBNQVgsIFJFQUwKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVC8nTkMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDI6IDMgKS5FUS4nSEUnCisqCisgICAgICBOQVJHUyA9IDEwCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQyA9IE4KKyAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIExDQyA9IExEQypOCisqCisgICAgICAgICBETyA5MCBJSyA9IDEsIE5JRElNCisgICAgICAgICAgICBLID0gSURJTSggSUsgKQorKgorICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMgorICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ0MnCisgICAgICAgICAgICAgICBJRiggVFJBTi5BTkQuLk5PVC5DT05KICkKKyAgICAgJCAgICAgICAgICAgIFRSQU5TID0gJ1QnCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE1BID0gTgorICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBSQUxQSEEgPSBSRUFMKCBBTFBIQSApCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IENNUExYKCBSQUxQSEEsIFJaRVJPICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVEEgPSBSRUFMKCBCRVRBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBDTVBMWCggUkJFVEEsIFJaRVJPICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMAorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE5VTEwuT1IuKCAoIEsuTEUuMC5PUi5SQUxQSEEuRVEuCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlpFUk8gKS5BTkQuUkJFVEEuRVEuUk9ORSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDQywgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFMUyA9IFJBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVFMgPSBSQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIFJBTFBIQSwgTERBLCBSQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDSEVSSyggVVBMTywgVFJBTlMsIE4sIEssIFJBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFJCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1NZUksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIEJFVEEsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TUy5FUS5UUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IFJBTFMuRVEuUkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBSQkVUUy5FUS5SQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExDRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExDRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBDUywgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnQycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TVCA9ICdUJworICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNTUNIKCBUUkFOU1QsICdOJywgTEosIDEsIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSggMSwgSkogKSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIDEsIEogKSwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goICdOJywgVFJBTlNULCBMSiwgMSwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBKCBKSiwgMSApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggSiwgMSApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIFJBTFBIQSwKKyAgICAgJCAgICAgIExEQSwgUkJFVEEsIExEQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBCRVRBLCBMREMKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgICAgICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgLCBBLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsIEY0LjEsCisgICAgICQgICAgICAnKSwgQywnLCBJMywgJykgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyoKKyogIFRlc3RzIENIRVIySyBhbmQgQ1NZUjJLLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUk9ORSwgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPTkUgPSAxLjAsIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIDIqTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxGICksIEFTKCBOTUFYKk5NQVggKSwgQkIoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBXKCAyKk5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCRVRTCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgsIFJCRVRBLCBSQkVUUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBKSkFCLAorICAgICAkICAgICAgICAgICAgICAgICAgIEssIEtTLCBMQUEsIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDT05KLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTiwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTLCBUUkFOU1QsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVCwgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hFUjJLLCBDTUFLRSwgQ01NQ0gsIENTWVIySworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENNUExYLCBDT05KRywgTUFYLCBSRUFMCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFQvJ05DJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgQ09OSiA9IFNOQU1FKCAyOiAzICkuRVEuJ0hFJworKgorICAgICAgTkFSR1MgPSAxMgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDEzMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREMgPSBOCisgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTMwCisgICAgICAgICBMQ0MgPSBMREMqTgorKgorICAgICAgICAgRE8gMTIwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyAxMTAgSUNUID0gMSwgMgorICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ0MnCisgICAgICAgICAgICAgICBJRiggVFJBTi5BTkQuLk5PVC5DT05KICkKKyAgICAgJCAgICAgICAgICAgIFRSQU5TID0gJ1QnCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE1BID0gTgorICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCLCAyKk5NQVgsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgICAgTERCID0gTERBCisgICAgICAgICAgICAgICBMQkIgPSBMQUEKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiggSyArIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIDIqTk1BWCwgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIoIEsqTk1BWCArIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gMTAwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisgICAgICAgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICAgICAgICBETyA5MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUQSA9IFJFQUwoIEJFVEEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IENNUExYKCBSQkVUQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTlVMTC5PUi4oICggSy5MRS4wLk9SLkFMUEhBLkVRLgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8gKS5BTkQuUkJFVEEuRVEuUk9ORSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDQywgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUUyA9IFJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgQUxQSEEsIExEQSwgTERCLCBSQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDSEVSMksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBCQiwgTERCLCBSQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1NZUjJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNTLkVRLlRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBSQkVUUy5FUS5SQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTENFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExDRVJFUyggJ0hFJywgVVBMTywgTiwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNUID0gJ0MnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnVCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpBQiggKCBKIC0gMSApKjIqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYICsgSyArIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBDT05KRyggQUxQSEEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBKIC0gMSApKjIqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCArIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEogLSAxICkqMioKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYICsgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNTUNIKCBUUkFOU1QsICdOJywgTEosIDEsIDIqSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQUIoIEpKQUIgKSwgMipOTUFYLCBXLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCRVRBLCBDKCBKSiwgSiApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQ1QsIEcsIENDKCBKQyApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpDT05KRyggQUIoICggSyArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIC0gMSApKk5NQVggKyBKICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IENPTkpHKCBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpBQiggKCBLICsgSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCAnTicsIExKLCAxLCAyKkssIE9ORSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCBKSiApLCBOTUFYLCBXLCAyKk5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBDKCBKSiwgSiApLCBOTUFYLCBDVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcsIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKQUIgPSBKSkFCICsgMipOTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgQ09OVElOVUUKKyoKKyAgMTMwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBMREIsIFJCRVRBLCBMREMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgIEVORCBJRgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcsJywgRjQuMSwKKyAgICAgJCAgICAgICcsIEMsJywgSTMsICcpICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJywoJywgRjQuMSwKKyAgICAgJCAgICAgICcsJywgRjQuMSwgJyksIEMsJywgSTMsICcpICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENDSEs1LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBLCBCIGFuZCBDIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogIDMtMTktOTI6ICBJbml0aWFsaXplIEFMUEhBLCBCRVRBLCBSQUxQSEEsIGFuZCBSQkVUQSAgKGVjYSkKKyogIDMtMTktOTI6ICBGaXggYXJndW1lbnQgMTIgaW4gY2FsbHMgdG8gQ1NZTU0gYW5kIENIRU1NCisqICAgICAgICAgICAgd2l0aCBJTkZPVCA9IDkgIChlY2EpCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBPTkUsIFRXTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRTAsIFRXTyA9IDIuMEUwICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJBTFBIQSwgUkJFVEEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIDIsIDEgKSwgQiggMiwgMSApLCBDKCAyLCAxICkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dFTU0sIENIRU1NLCBDSEVSMkssIENIRVJLLCBDSEtYRVIsIENTWU1NLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTWVIySywgQ1NZUkssIENUUk1NLCBDVFJTTQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIE9LIGlzIHNldCB0byAuRkFMU0UuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIG9yIGJ5IENIS1hFUgorKiAgICAgaWYgYW55dGhpbmcgaXMgd3JvbmcuCisgICAgICBPSyA9IC5UUlVFLgorKiAgICAgTEVSUiBpcyBzZXQgdG8gLlRSVUUuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIGVhY2ggdGltZQorKiAgICAgaXQgaXMgY2FsbGVkLCBhbmQgaXMgdGhlbiB0ZXN0ZWQgYW5kIHJlLXNldCBieSBDSEtYRVIuCisgICAgICBMRVJSID0gLkZBTFNFLgorKgorKiAgICAgSW5pdGlhbGl6ZSBBTFBIQSwgQkVUQSwgUkFMUEhBLCBhbmQgUkJFVEEuCisqCisgICAgICBBTFBIQSA9IENNUExYKCBPTkUsIC1PTkUgKQorICAgICAgQkVUQSA9IENNUExYKCBUV08sIC1UV08gKQorICAgICAgUkFMUEhBID0gT05FCisgICAgICBSQkVUQSA9IFRXTworKgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsCisgICAgICQgICAgICAgIDkwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIENHRU1NKCAnLycsICdOJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBDR0VNTSggJy8nLCAnQycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0dFTU0oICcvJywgJ1QnLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENHRU1NKCAnTicsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnLycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ0MnLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ0MnLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnVCcsICdOJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ0MnLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ0MnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ0MnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnVCcsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ0MnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ0MnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ0MnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ0MnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnQycsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ1QnLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnQycsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ1QnLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnQycsICdDJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ0MnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnQycsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ1QnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnTicsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnQycsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnVCcsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hFTU0oICcvJywgJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIRU1NKCAnTCcsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRU1NKCAnUicsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ0wnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRU1NKCAnTCcsICdVJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnTCcsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRU1NKCAnUicsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRU1NKCAnUicsICdVJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ0wnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRU1NKCAnTCcsICdVJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRU1NKCAnUicsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENIRU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICAzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1NZTU0oICcvJywgJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENTWU1NKCAnTCcsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENTWU1NKCAnUicsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ0wnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWU1NKCAnTCcsICdVJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnTCcsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWU1NKCAnUicsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWU1NKCAnUicsICdVJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ0wnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWU1NKCAnTCcsICdVJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWU1NKCAnUicsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1RSTU0oICcvJywgJ1UnLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnLycsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnTicsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIENUUlNNKCAnLycsICdVJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJy8nLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ04nLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnQycsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnQycsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnQycsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnQycsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnQycsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnQycsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnQycsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnQycsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDYwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVSSyggJy8nLCAnTicsIDAsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnVCcsIDAsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnTicsIC0xLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ0MnLCAtMSwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRVJLKCAnTCcsICdOJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSSyggJ0wnLCAnQycsIC0xLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ04nLCAwLCAtMSwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRVJLKCAnVScsICdDJywgMCwgLTEsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVSSyggJ0wnLCAnTicsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUksoICdMJywgJ0MnLCAwLCAtMSwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVJLKCAnVScsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVJLKCAnVScsICdDJywgMCwgMiwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVJLKCAnTCcsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVJLKCAnTCcsICdDJywgMCwgMiwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnTicsIDIsIDAsIFJBTFBIQSwgQSwgMiwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ0MnLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENIRVJLKCAnTCcsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDSEVSSyggJ0wnLCAnQycsIDIsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgNzAgSU5GT1QgPSAxCisgICAgICBDQUxMIENTWVJLKCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnQycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENTWVJLKCAnTCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWVJLKCAnVScsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSSyggJ0wnLCAnVCcsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWVJLKCAnVScsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWVJLKCAnTCcsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ1NZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENTWVJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA4MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hFUjJLKCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdUJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnQycsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFUjJLKCAnTCcsICdDJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ0MnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUjJLKCAnTCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnQycsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ0MnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ0MnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgUkJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ0MnLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgUkJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ0MnLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDIsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnQycsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFUjJLKCAnTCcsICdDJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDkwIElORk9UID0gMQorICAgICAgQ0FMTCBDU1lSMksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnQycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorICAxMDAgSUYoIE9LIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU1JOQU1UCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1UCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMnICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMgKioqKionLAorICAgICAkICAgICAgJyoqJyApCisqCisqICAgICBFbmQgb2YgQ0NIS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ01BS0UoIFRZUEUsIFVQTE8sIERJQUcsIE0sIE4sIEEsIE5NQVgsIEFBLCBMREEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyogIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIGFuIE0gYnkgTiBtYXRyaXggQS4KKyogIFN0b3JlcyB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBBQSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQKKyogIGJ5IHRoZSByb3V0aW5lLCB3aXRoIHVud2FudGVkIGVsZW1lbnRzIHNldCB0byByb2d1ZSB2YWx1ZS4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0hFJywgJ1NZJyBvciAnVFInLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBDT01QTEVYICAgICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gKCAtMS4wRTEwLCAxLjBFMTAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJST0dVRSA9IC0xLjBFMTAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIExEQSwgTSwgTiwgTk1BWAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsICogKSwgQUEoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElCRUcsIElFTkQsIEosIEpKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgR0VOLCBIRVIsIExPV0VSLCBTWU0sIFRSSSwgVU5JVCwgVVBQRVIKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIENCRUcKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDQkVHCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgsIENPTkpHLCBSRUFMCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEdFTiA9IFRZUEUuRVEuJ0dFJworICAgICAgSEVSID0gVFlQRS5FUS4nSEUnCisgICAgICBTWU0gPSBUWVBFLkVRLidTWScKKyAgICAgIFRSSSA9IFRZUEUuRVEuJ1RSJworICAgICAgVVBQRVIgPSAoIEhFUi5PUi5TWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ1UnCisgICAgICBMT1dFUiA9ICggSEVSLk9SLlNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nTCcKKyAgICAgIFVOSVQgPSBUUkkuQU5ELkRJQUcuRVEuJ1UnCisqCisqICAgICBHZW5lcmF0ZSBkYXRhIGluIGFycmF5IEEuCisqCisgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIElGKCBHRU4uT1IuKCBVUFBFUi5BTkQuSS5MRS5KICkuT1IuKCBMT1dFUi5BTkQuSS5HRS5KICkgKQorICAgICAkICAgICAgICAgIFRIRU4KKyAgICAgICAgICAgICAgIEEoIEksIEogKSA9IENCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIElGKCBJLk5FLkogKVRIRU4KKyogICAgICAgICAgICAgICAgIFNldCBzb21lIGVsZW1lbnRzIHRvIHplcm8KKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjMuQU5ELkouRVEuTi8yICkKKyAgICAgJCAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIElGKCBIRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IENPTkpHKCBBKCBJLCBKICkgKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBIRVIgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQ01QTFgoIFJFQUwoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nU1knLk9SLlRZUEUuRVEuJ1RSJyApVEhFTgorICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDYwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDgwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIEhFUiApVEhFTgorICAgICAgICAgICAgICAgSkogPSBKICsgKCBKIC0gMSApKkxEQQorICAgICAgICAgICAgICAgQUEoIEpKICkgPSBDTVBMWCggUkVBTCggQUEoIEpKICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgIEVORCBJRgorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgQ01BS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ01NQ0goIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLSywgQUxQSEEsIEEsIExEQSwgQiwgTERCLAorICAgICAkICAgICAgICAgICAgICAgICAgQkVUQSwgQywgTERDLCBDVCwgRywgQ0MsIExEQ0MsIEVQUywgRVJSLCBGQVRBTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5PVVQsIE1WICkKKyoKKyogIENoZWNrcyB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcHV0YXRpb25hbCB0ZXN0cy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8sIFJPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wLCBST05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0ssIExEQSwgTERCLCBMREMsIExEQ0MsIE0sIE4sIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTERBLCAqICksIEIoIExEQiwgKiApLCBDKCBMREMsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTERDQywgKiApLCBDVCggKiApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQ0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENUUkFOQSwgQ1RSQU5CLCBUUkFOQSwgVFJBTkIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIEFJTUFHLCBDT05KRywgTUFYLCBSRUFMLCBTUVJUCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUJTMQorKiAgICAgLi4gU3RhdGVtZW50IEZ1bmN0aW9uIGRlZmluaXRpb25zIC4uCisgICAgICBBQlMxKCBDTCApID0gQUJTKCBSRUFMKCBDTCApICkgKyBBQlMoIEFJTUFHKCBDTCApICkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVFJBTkEgPSBUUkFOU0EuRVEuJ1QnLk9SLlRSQU5TQS5FUS4nQycKKyAgICAgIFRSQU5CID0gVFJBTlNCLkVRLidUJy5PUi5UUkFOU0IuRVEuJ0MnCisgICAgICBDVFJBTkEgPSBUUkFOU0EuRVEuJ0MnCisgICAgICBDVFJBTkIgPSBUUkFOU0IuRVEuJ0MnCisqCisqICAgICBDb21wdXRlIGV4cGVjdGVkIHJlc3VsdCwgb25lIGNvbHVtbiBhdCBhIHRpbWUsIGluIENUIHVzaW5nIGRhdGEKKyogICAgIGluIEEsIEIgYW5kIEMuCisqICAgICBDb21wdXRlIGdhdWdlcyBpbiBHLgorKgorICAgICAgRE8gMjIwIEogPSAxLCBOCisqCisgICAgICAgICBETyAxMCBJID0gMSwgTQorICAgICAgICAgICAgQ1QoIEkgKSA9IFpFUk8KKyAgICAgICAgICAgIEcoIEkgKSA9IFJaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIC5OT1QuVFJBTkEuQU5ELi5OT1QuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDMwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSSwgSyApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSSwgSyApICkqQUJTMSggQiggSywgSiApICkKKyAgIDIwICAgICAgICAgIENPTlRJTlVFCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELi5OT1QuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIElGKCBDVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgIERPIDUwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQ09OSkcoIEEoIEssIEkgKSApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBLLCBKICkgKQorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBETyA3MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTMSggQiggSywgSiApICkKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisgICA3MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTFNFIElGKCAuTk9ULlRSQU5BLkFORC5UUkFOQiApVEhFTgorICAgICAgICAgICAgSUYoIENUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgRE8gOTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDExMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5BIClUSEVOCisgICAgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQ09OSkcoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkpHKCBCKCBKLCBLICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxMjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyAxNTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxNDAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQ09OSkcoIEEoIEssIEkgKSApKkIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTUwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBDVFJBTkIgKVRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE3MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDE2MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDE5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE4MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDE4MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxOTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDIwMCBJID0gMSwgTQorICAgICAgICAgICAgQ1QoIEkgKSA9IEFMUEhBKkNUKCBJICkgKyBCRVRBKkMoIEksIEogKQorICAgICAgICAgICAgRyggSSApID0gQUJTMSggQUxQSEEgKSpHKCBJICkgKworICAgICAkICAgICAgICAgICAgICAgQUJTMSggQkVUQSApKkFCUzEoIEMoIEksIEogKSApCisgIDIwMCAgICBDT05USU5VRQorKgorKiAgICAgICAgQ29tcHV0ZSB0aGUgZXJyb3IgcmF0aW8gZm9yIHRoaXMgcmVzdWx0LgorKgorICAgICAgICAgRVJSID0gWkVSTworICAgICAgICAgRE8gMjEwIEkgPSAxLCBNCisgICAgICAgICAgICBFUlJJID0gQUJTMSggQ1QoIEkgKSAtIENDKCBJLCBKICkgKS9FUFMKKyAgICAgICAgICAgIElGKCBHKCBJICkuTkUuUlpFUk8gKQorICAgICAkICAgICAgICAgRVJSSSA9IEVSUkkvRyggSSApCisgICAgICAgICAgICBFUlIgPSBNQVgoIEVSUiwgRVJSSSApCisgICAgICAgICAgICBJRiggRVJSKlNRUlQoIEVQUyApLkdFLlJPTkUgKQorICAgICAkICAgICAgICAgR08gVE8gMjMwCisgIDIxMCAgICBDT05USU5VRQorKgorICAyMjAgQ09OVElOVUUKKyoKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyAyNTAKKyoKKyogICAgIFJlcG9ydCBmYXRhbCBlcnJvci4KKyoKKyAgMjMwIEZBVEFMID0gLlRSVUUuCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApCisgICAgICBETyAyNDAgSSA9IDEsIE0KKyAgICAgICAgIElGKCBNViApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIENUKCBJICksIENDKCBJLCBKICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBDQyggSSwgSiApLCBDVCggSSApCisgICAgICAgICBFTkQgSUYKKyAgMjQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClKCisqCisgIDI1MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIENPTVBVVEVEIFJFU1VMVCBJUyBMRVNTIFRIQU4gSEFMJywKKyAgICAgJCAgICAgICdGIEFDQ1VSQVRFICoqKioqKionLCAvJyAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNURUQgUkUnLAorICAgICAkICAgICAgJ1NVTFQgICAgICAgICAgICAgICAgICAgIENPTVBVVEVEIFJFU1VMVCcgKQorIDk5OTggRk9STUFUKCAxWCwgSTcsIDIoICcgICgnLCBHMTUuNiwgJywnLCBHMTUuNiwgJyknICkgKQorIDk5OTcgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorKgorKiAgICAgRW5kIG9mIENNTUNILgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExDRSggUkksIFJKLCBMUiApCisqCisqICBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExSCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBSSSggKiApLCBSSiggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAxMCBJID0gMSwgTFIKKyAgICAgICAgIElGKCBSSSggSSApLk5FLlJKKCBJICkgKQorICAgICAkICAgICAgR08gVE8gMjAKKyAgIDEwIENPTlRJTlVFCisgICAgICBMQ0UgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDMwCisgICAyMCBDT05USU5VRQorICAgICAgTENFID0gLkZBTFNFLgorICAgMzAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTENFLgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExDRVJFUyggVFlQRSwgVVBMTywgTSwgTiwgQUEsIEFTLCBMREEgKQorKgorKiAgVGVzdHMgaWYgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdHdvIGFycmF5cyBhcmUgZXF1YWwuCisqCisqICBUWVBFIGlzICdHRScgb3IgJ0hFJyBvciAnU1knLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJy5PUi5UWVBFLkVRLidTWScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgICAgTENFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExDRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExDRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgQ09NUExFWCBGVU5DVElPTiBDQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gU2F2ZSBzdGF0ZW1lbnQgLi4KKyAgICAgIFNBVkUgICAgICAgICAgICAgICBJLCBJQywgSiwgTUksIE1KCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBNSiA9IDQ1NworICAgICAgICAgSSA9IDcKKyAgICAgICAgIEogPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgb3IgSiBpcyBib3VuZGVkIGJldHdlZW4gMSBhbmQgOTk5LgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNSwgdGhlIHBlcmlvZCB3aWxsIGJlIDEwLgorKiAgICAgSUMgaXMgdXNlZCB0byBicmVhayB1cCB0aGUgcGVyaW9kIGJ5IHNraXBwaW5nIDEgdmFsdWUgb2YgSSBvciBKCisqICAgICBpbiA2LgorKgorICAgICAgSUMgPSBJQyArIDEKKyAgIDEwIEkgPSBJKk1JCisgICAgICBKID0gSipNSgorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIEogPSBKIC0gMTAwMCooIEovMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBDQkVHID0gQ01QTFgoICggSSAtIDUwMCApLzEwMDEuMCwgKCBKIC0gNTAwICkvMTAwMS4wICkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENCRUcuCisqCisgICAgICBFTkQKKyAgICAgIFJFQUwgRlVOQ1RJT04gU0RJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFNESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvZGJsYXQxLmYgYi9ibGFzL3Rlc3RpbmcvZGJsYXQxLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2OTFmOQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9kYmxhdDEuZgpAQCAtMCwwICsxLDEwNjUgQEAKKyo+IFxicmllZiBcYiBEQkxBVDEKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFBST0dSQU0gREJMQVQxCisqIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+ICAgIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIERPVUJMRSBQUkVDSVNJT04gTGV2ZWwgMSBCTEFTLgorKj4KKyo+ICAgIEJhc2VkIHVwb24gdGhlIG9yaWdpbmFsIEJMQVMgdGVzdCByb3V0aW5lIHRvZ2V0aGVyIHdpdGg6CisqPiAgICBGMDZFQUYgRXhhbXBsZSBQcm9ncmFtIFRleHQKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGRvdWJsZV9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBEQkxBVDEKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIElDCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBDSEVDSzAsIENIRUNLMSwgQ0hFQ0syLCBDSEVDSzMsIEhFQURFUgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgU0ZBQy85Ljc2NTYyNUQtNC8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBETyAyMCBJQyA9IDEsIDEzCisgICAgICAgICBJQ0FTRSA9IElDCisgICAgICAgICBDQUxMIEhFQURFUgorKgorKiAgICAgICAgLi4gSW5pdGlhbGl6ZSAgUEFTUywgIElOQ1gsICBhbmQgSU5DWSBmb3IgYSBuZXcgY2FzZS4gLi4KKyogICAgICAgIC4uIHRoZSB2YWx1ZSA5OTk5IGZvciBJTkNYIG9yIElOQ1kgd2lsbCBhcHBlYXIgaW4gdGhlIC4uCisqICAgICAgICAuLiBkZXRhaWxlZCAgb3V0cHV0LCBpZiBhbnksIGZvciBjYXNlcyAgdGhhdCBkbyBub3QgaW52b2x2ZSAuLgorKiAgICAgICAgLi4gdGhlc2UgcGFyYW1ldGVycyAuLgorKgorICAgICAgICAgUEFTUyA9IC5UUlVFLgorICAgICAgICAgSU5DWCA9IDk5OTkKKyAgICAgICAgIElOQ1kgPSA5OTk5CisgICAgICAgICBJRiAoSUNBU0UuRVEuMyAuT1IuIElDQVNFLkVRLjExKSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMChTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNyAuT1IuIElDQVNFLkVRLjggLk9SLiBJQ0FTRS5FUS45IC5PUi4KKyAgICAgKyAgICAgICAgICAgIElDQVNFLkVRLjEwKSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMShTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMSAuT1IuIElDQVNFLkVRLjIgLk9SLiBJQ0FTRS5FUS41IC5PUi4KKyAgICAgKyAgICAgICAgICAgIElDQVNFLkVRLjYgLk9SLiBJQ0FTRS5FUS4xMiAuT1IuIElDQVNFLkVRLjEzKSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMihTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNCkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzMoU0ZBQykKKyAgICAgICAgIEVORCBJRgorKiAgICAgICAgLS0gUHJpbnQKKyAgICAgICAgIElGIChQQVNTKSBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIENPTlRJTlVFCisgICAgICBTVE9QCisqCis5OTk5OSBGT1JNQVQgKCcgUmVhbCBCTEFTIFRlc3QgUHJvZ3JhbSBSZXN1bHRzJywvMVgpCis5OTk5OCBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLSBQQVNTIC0tLS0tJykKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBIRUFERVIKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDSEFSQUNURVIqNiAgICAgIEwoMTMpCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBMKDEpLycgRERPVCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDIpLydEQVhQWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDMpLydEUk9URyAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDQpLycgRFJPVCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDUpLydEQ09QWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDYpLydEU1dBUCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDcpLydETlJNMiAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDgpLydEQVNVTSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDkpLydEU0NBTCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDEwKS8nSURBTUFYJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMSkvJ0RST1RNRycvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMTIpLydEUk9UTSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDEzKS8nRFNET1QgJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpIElDQVNFLCBMKElDQVNFKQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKC8nIFRlc3Qgb2Ygc3VicHJvZ3JhbSBudW1iZXInLEkzLDEyWCxBNikKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzAoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNBLCBTQiwgU0MsIFNTLCBEMTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEsKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgREExKDgpLCBEQVRSVUUoOCksIERCMSg4KSwgREJUUlVFKDgpLCBEQzEoOCksCisgICAgICQgICAgICAgICAgICAgICAgICBEUzEoOCksIERBQig0LDkpLCBEVEVNUCg5KSwgRFRSVUUoOSw5KQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIERST1RHLCBEUk9UTUcsIFNURVNUMQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBEQTEvMC4zRDAsIDAuNEQwLCAtMC4zRDAsIC0wLjREMCwgLTAuM0QwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERCMS8wLjREMCwgMC4zRDAsIDAuNEQwLCAwLjNEMCwgLTAuNEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMEQwLCAwLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERDMS8wLjZEMCwgMC44RDAsIC0wLjZEMCwgMC44RDAsIDAuNkQwLCAxLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERTMS8wLjhEMCwgMC42RDAsIDAuOEQwLCAtMC42RDAsIDAuOEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMEQwLCAwLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERBVFJVRS8wLjVEMCwgMC41RDAsIDAuNUQwLCAtMC41RDAsIC0wLjVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjBEMCwgMS4wRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQlRSVUUvMC4wRDAsIDAuNkQwLCAwLjBEMCwgLTAuNkQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjBEMCwgMC4wRDAvCisqICAgICBJTlBVVCBGT1IgTU9ESUZJRUQgR0lWRU5TCisgICAgICBEQVRBIERBQi8gLjFEMCwuM0QwLDEuMkQwLC4yRDAsCisgICAgIEEgICAgICAgICAgLjdEMCwgLjJEMCwgLjZEMCwgNC4yRDAsCisgICAgIEIgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQyAgICAgICAgICA0LkQwLCAtMS5EMCwgMi5EMCwgNC5EMCwKKyAgICAgRCAgICAgICAgICA2LkQtMTAsIDIuRC0yLCAxLkQ1LCAxMC5EMCwKKyAgICAgRSAgICAgICAgICA0LkQxMCwgMi5ELTIsIDEuRC01LCAxMC5EMCwKKyAgICAgRiAgICAgICAgICAyLkQtMTAsIDQuRC0yLCAxLkQ1LCAxMC5EMCwKKyAgICAgRyAgICAgICAgICAyLkQxMCwgNC5ELTIsIDEuRC01LCAxMC5EMCwKKyAgICAgSCAgICAgICAgICA0LkQwLCAtMi5EMCwgOC5EMCwgNC5EMCAgICAvCisqICAgIFRSVUUgUkVTVUxUUyBGT1IgTU9ESUZJRUQgR0lWRU5TCisgICAgICBEQVRBIERUUlVFLzAuRDAsMC5EMCwgMS4zRDAsIC4yRDAsIDAuRDAsMC5EMCwwLkQwLCAuNUQwLCAwLkQwLAorICAgICBBICAgICAgICAgICAwLkQwLDAuRDAsIDQuNUQwLCA0LjJEMCwgMS5EMCwgLjVEMCwgMC5EMCwwLkQwLDAuRDAsCisgICAgIEIgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsIC0yLkQwLCAwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBDICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwgNC5EMCwgLTEuRDAsIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEQgICAgICAgICAgIDAuRDAsIDE1LkQtMywgMC5EMCwgMTAuRDAsIC0xLkQwLCAwLkQwLCAtMS5ELTQsCisgICAgIEUgICAgICAgICAgIDAuRDAsIDEuRDAsCisgICAgIEYgICAgICAgICAgIDAuRDAsMC5EMCwgNjE0NC5ELTUsIDEwLkQwLCAtMS5EMCwgNDA5Ni5EMCwgLTEuRDYsCisgICAgIEcgICAgICAgICAgIDAuRDAsIDEuRDAsCisgICAgIEggICAgICAgICAgIDAuRDAsMC5EMCwxNS5EMCwxMC5EMCwtMS5EMCwgNS5ELTUsIDAuRDAsMS5EMCwwLkQwLAorICAgICBJICAgICAgICAgICAwLkQwLDAuRDAsIDE1LkQwLCAxMC5EMCwgLTEuIEQwLCA1LkQ1LCAtNDA5Ni5EMCwKKyAgICAgSiAgICAgICAgICAgMS5EMCwgNDA5Ni5ELTYsCisgICAgIEsgICAgICAgICAgIDAuRDAsMC5EMCwgNy5EMCwgNC5EMCwgMC5EMCwwLkQwLCAtLjVEMCwgLS4yNUQwLCAwLkQwLworKiAgICAgICAgICAgICAgICAgICA0MDk2ID0gMiAqKiAxMgorICAgICAgREFUQSBEMTIgIC80MDk2LkQwLworICAgICAgRFRSVUUoMSwxKSA9IDEyLkQwIC8gMTMwLkQwCisgICAgICBEVFJVRSgyLDEpID0gMzYuRDAgLyAxMzAuRDAKKyAgICAgIERUUlVFKDcsMSkgPSAtMS5EMCAvIDYuRDAKKyAgICAgIERUUlVFKDEsMikgPSAxNC5EMCAvIDc1LkQwCisgICAgICBEVFJVRSgyLDIpID0gNDkuRDAgLyA3NS5EMAorICAgICAgRFRSVUUoOSwyKSA9IDEuRDAgLyA3LkQwCisgICAgICBEVFJVRSgxLDUpID0gNDUuRC0xMSAqIChEMTIgKiBEMTIpCisgICAgICBEVFJVRSgzLDUpID0gNC5ENSAvICgzLkQwICogRDEyKQorICAgICAgRFRSVUUoNiw1KSA9IDEuRDAgLyBEMTIKKyAgICAgIERUUlVFKDgsNSkgPSAxLkQ0IC8gKDMuRDAgKiBEMTIpCisgICAgICBEVFJVRSgxLDYpID0gNC5EMTAgLyAoMS41RDAgKiBEMTIgKiBEMTIpCisgICAgICBEVFJVRSgyLDYpID0gMi5ELTIgLyAxLjVEMAorICAgICAgRFRSVUUoOCw2KSA9IDUuRC03ICogRDEyCisgICAgICBEVFJVRSgxLDcpID0gNC5EMCAvIDE1MC5EMAorICAgICAgRFRSVUUoMiw3KSA9ICgyLkQtMTAgLyAxLjVEMCkgKiAoRDEyICogRDEyKQorICAgICAgRFRSVUUoNyw3KSA9IC1EVFJVRSg2LDUpCisgICAgICBEVFJVRSg5LDcpID0gMS5ENCAvIEQxMgorICAgICAgRFRSVUUoMSw4KSA9IERUUlVFKDEsNykKKyAgICAgIERUUlVFKDIsOCkgPSAyLkQxMCAvICgxLjVEMCAqIEQxMiAqIEQxMikKKyAgICAgIERUUlVFKDEsOSkgPSAzMi5EMCAvIDcuRDAKKyAgICAgIERUUlVFKDIsOSkgPSAtMTYuRDAgLyA3LkQwCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIENvbXB1dGUgdHJ1ZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHByZXN0b3JlZAorKiAgICAgaW4gZGVjaW1hbCBub3RhdGlvbgorKgorICAgICAgREJUUlVFKDEpID0gMS4wRDAvMC42RDAKKyAgICAgIERCVFJVRSgzKSA9IC0xLjBEMC8wLjZEMAorICAgICAgREJUUlVFKDUpID0gMS4wRDAvMC42RDAKKyoKKyAgICAgIERPIDIwIEsgPSAxLCA4CisqICAgICAgICAuLiBTZXQgTj1LIGZvciBpZGVudGlmaWNhdGlvbiBpbiBvdXRwdXQgaWYgYW55IC4uCisgICAgICAgICBOID0gSworICAgICAgICAgSUYgKElDQVNFLkVRLjMpIFRIRU4KKyogICAgICAgICAgIC4uIERST1RHIC4uCisgICAgICAgICAgICBJRiAoSy5HVC44KSBHTyBUTyA0MAorICAgICAgICAgICAgU0EgPSBEQTEoSykKKyAgICAgICAgICAgIFNCID0gREIxKEspCisgICAgICAgICAgICBDQUxMIERST1RHKFNBLFNCLFNDLFNTKQorICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU0EsREFUUlVFKEspLERBVFJVRShLKSxTRkFDKQorICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU0IsREJUUlVFKEspLERCVFJVRShLKSxTRkFDKQorICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU0MsREMxKEspLERDMShLKSxTRkFDKQorICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU1MsRFMxKEspLERTMShLKSxTRkFDKQorICAgICAgICAgRUxTRUlGIChJQ0FTRS5FUS4xMSkgVEhFTgorKiAgICAgICAgICAgLi4gRFJPVE1HIC4uCisgICAgICAgICAgICBETyBJPTEsNAorICAgICAgICAgICAgICAgRFRFTVAoSSk9IERBQihJLEspCisgICAgICAgICAgICAgICBEVEVNUChJKzQpID0gMC4wCisgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgIERURU1QKDkpID0gMC4wCisgICAgICAgICAgICBDQUxMIERST1RNRyhEVEVNUCgxKSxEVEVNUCgyKSxEVEVNUCgzKSxEVEVNUCg0KSxEVEVNUCg1KSkKKyAgICAgICAgICAgIENBTEwgU1RFU1QoOSxEVEVNUCxEVFJVRSgxLEspLERUUlVFKDEsSyksU0ZBQykKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMCcKKyAgICAgICAgICAgIFNUT1AKKyAgICAgICAgIEVORCBJRgorICAgMjAgQ09OVElOVUUKKyAgIDQwIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMShTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgTEVOLCBOUDEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgRFRSVUUxKDUpLCBEVFJVRTMoNSksIERUUlVFNSg4LDUsMiksIERWKDgsNSwyKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIFNBKDEwKSwgU1RFTVAoMSksIFNUUlVFKDgpLCBTWCg4KQorICAgICAgSU5URUdFUiAgICAgICAgICAgSVRSVUUyKDUpCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIERBU1VNLCBETlJNMgorICAgICAgSU5URUdFUiAgICAgICAgICAgSURBTUFYCisgICAgICBFWFRFUk5BTCAgICAgICAgICBEQVNVTSwgRE5STTIsIElEQU1BWAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIElURVNUMSwgRFNDQUwsIFNURVNULCBTVEVTVDEKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgIE1BWAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBTQS8wLjNEMCwgLTEuMEQwLCAwLjBEMCwgMS4wRDAsIDAuM0QwLCAwLjNEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuM0QwLCAwLjNEMCwgMC4zRDAsIDAuM0QwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFYvMC4xRDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEQwLCAyLjBEMCwgMC4zRDAsIDMuMEQwLCAzLjBEMCwgMy4wRDAsIDMuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMy4wRDAsIDMuMEQwLCAzLjBEMCwgMC4zRDAsIC0wLjREMCwgNC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA0LjBEMCwgNC4wRDAsIDQuMEQwLCA0LjBEMCwgNC4wRDAsIDAuMkQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNkQwLCAwLjNEMCwgNS4wRDAsIDUuMEQwLCA1LjBEMCwgNS4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA1LjBEMCwgMC4xRDAsIC0wLjNEMCwgMC41RDAsIC0wLjFEMCwgNi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA2LjBEMCwgNi4wRDAsIDYuMEQwLCAwLjFEMCwgOC4wRDAsIDguMEQwLCA4LjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDguMEQwLCA4LjBEMCwgOC4wRDAsIDguMEQwLCAwLjNEMCwgOS4wRDAsIDkuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgOS4wRDAsIDkuMEQwLCA5LjBEMCwgOS4wRDAsIDkuMEQwLCAwLjNEMCwgMi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMkQwLCAzLjBEMCwgLTAuNkQwLCA1LjBEMCwgMC4zRDAsIDIuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMi4wRDAsIDIuMEQwLCAwLjFEMCwgNC4wRDAsIC0wLjNEMCwgNi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC41RDAsIDcuMEQwLCAtMC4xRDAsIDMuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFRSVUUxLzAuMEQwLCAwLjNEMCwgMC41RDAsIDAuN0QwLCAwLjZEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUUlVFMy8wLjBEMCwgMC4zRDAsIDAuN0QwLCAxLjFEMCwgMS4wRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVFJVRTUvMC4xMEQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEQwLCAyLjBEMCwgMi4wRDAsIC0wLjNEMCwgMy4wRDAsIDMuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMy4wRDAsIDMuMEQwLCAzLjBEMCwgMy4wRDAsIDMuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA0LjBEMCwgNC4wRDAsIDQuMEQwLCA0LjBEMCwgNC4wRDAsIDQuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4yMEQwLCAtMC42MEQwLCAwLjMwRDAsIDUuMEQwLCA1LjBEMCwgNS4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA1LjBEMCwgNS4wRDAsIDAuMDNEMCwgLTAuMDlEMCwgMC4xNUQwLCAtMC4wM0QwLAorICAgICArICAgICAgICAgICAgICAgICAgNi4wRDAsIDYuMEQwLCA2LjBEMCwgNi4wRDAsIDAuMTBEMCwgOC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA4LjBEMCwgOC4wRDAsIDguMEQwLCA4LjBEMCwgOC4wRDAsIDguMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wOUQwLCA5LjBEMCwgOS4wRDAsIDkuMEQwLCA5LjBEMCwgOS4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA5LjBEMCwgOS4wRDAsIDAuMDlEMCwgMi4wRDAsIC0wLjEyRDAsIDIuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMi4wRDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsIDAuMDZEMCwgMy4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xOEQwLCA1LjBEMCwgMC4wOUQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wM0QwLCA0LjBEMCwgLTAuMDlEMCwgNi4wRDAsIC0wLjE1RDAsIDcuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMDNEMCwgMy4wRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBJVFJVRTIvMCwgMSwgMiwgMiwgMy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gODAgSU5DWCA9IDEsIDIKKyAgICAgICAgIERPIDYwIE5QMSA9IDEsIDUKKyAgICAgICAgICAgIE4gPSBOUDEgLSAxCisgICAgICAgICAgICBMRU4gPSAyKk1BWChOLDEpCisqICAgICAgICAgICAuLiBTZXQgdmVjdG9yIGFyZ3VtZW50cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExFTgorICAgICAgICAgICAgICAgU1goSSkgPSBEVihJLE5QMSxJTkNYKQorICAgMjAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS43KSBUSEVOCisqICAgICAgICAgICAgICAuLiBETlJNMiAuLgorICAgICAgICAgICAgICAgU1RFTVAoMSkgPSBEVFJVRTEoTlAxKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoRE5STTIoTixTWCxJTkNYKSxTVEVNUCgxKSxTVEVNUCxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gREFTVU0gLi4KKyAgICAgICAgICAgICAgIFNURU1QKDEpID0gRFRSVUUzKE5QMSkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKERBU1VNKE4sU1gsSU5DWCksU1RFTVAoMSksU1RFTVAsU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjkpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIERTQ0FMKE4sU0EoKElOQ1gtMSkqNStOUDEpLFNYLElOQ1gpCisgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICAgICAgICAgICBTVFJVRShJKSA9IERUUlVFNShJLE5QMSxJTkNYKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOLFNYLFNUUlVFLFNUUlVFLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4xMCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gSURBTUFYIC4uCisgICAgICAgICAgICAgICBDQUxMIElURVNUMShJREFNQVgoTixTWCxJTkNYKSxJVFJVRTIoTlAxKSkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMScKKyAgICAgICAgICAgICAgIFNUT1AKKyAgICAgICAgICAgIEVORCBJRgorICAgNjAgICAgQ09OVElOVUUKKyAgIDgwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzIoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNBCisgICAgICBJTlRFR0VSICAgICAgICAgICBJLCBKLCBLSSwgS04sIEtOSSwgS1BBUiwgS1NJWkUsIExFTlgsIExFTlksCisgICAgICQgICAgICAgICAgICAgICAgICBNWCwgTVkgCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIERUMTBYKDcsNCw0KSwgRFQxMFkoNyw0LDQpLCBEVDcoNCw0KSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIERUOCg3LDQsNCksIERYMSg3KSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIERZMSg3KSwgU1NJWkUxKDQpLCBTU0laRTIoMTQsMiksIFNTSVpFKDcpLAorICAgICAkICAgICAgICAgICAgICAgICAgU1RYKDcpLCBTVFkoNyksIFNYKDcpLCBTWSg3KSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIERQQVIoNSw0KSwgRFQxOVgoNyw0LDE2KSxEVDE5WEEoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVhCKDcsNCw0KSwgRFQxOVhDKDcsNCw0KSxEVDE5WEQoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVkoNyw0LDE2KSwgRFQxOVlBKDcsNCw0KSxEVDE5WUIoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVlDKDcsNCw0KSwgRFQxOVlEKDcsNCw0KSwgRFRFTVAoNSkKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBERE9ULCBEU0RPVAorICAgICAgRVhURVJOQUwgICAgICAgICAgRERPVCwgRFNET1QKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBEQVhQWSwgRENPUFksIERST1RNLCBEU1dBUCwgU1RFU1QsIFNURVNUMQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgQUJTLCBNSU4KKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgRVFVSVZBTEVOQ0UgKERUMTlYKDEsMSwxKSxEVDE5WEEoMSwxLDEpKSwoRFQxOVgoMSwxLDUpLAorICAgICBBICAgRFQxOVhCKDEsMSwxKSksKERUMTlYKDEsMSw5KSxEVDE5WEMoMSwxLDEpKSwKKyAgICAgQiAgIChEVDE5WCgxLDEsMTMpLERUMTlYRCgxLDEsMSkpCisgICAgICBFUVVJVkFMRU5DRSAoRFQxOVkoMSwxLDEpLERUMTlZQSgxLDEsMSkpLChEVDE5WSgxLDEsNSksCisgICAgIEEgICBEVDE5WUIoMSwxLDEpKSwoRFQxOVkoMSwxLDkpLERUMTlZQygxLDEsMSkpLAorICAgICBCICAgKERUMTlZKDEsMSwxMyksRFQxOVlEKDEsMSwxKSkKKworICAgICAgREFUQSAgICAgICAgICAgICAgU0EvMC4zRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBJTkNYUy8xLCAyLCAtMiwgLTEvCisgICAgICBEQVRBICAgICAgICAgICAgICBJTkNZUy8xLCAtMiwgMSwgLTIvCisgICAgICBEQVRBICAgICAgICAgICAgICBMRU5TLzEsIDEsIDIsIDQsIDEsIDEsIDMsIDcvCisgICAgICBEQVRBICAgICAgICAgICAgICBOUy8wLCAxLCAyLCA0LworICAgICAgREFUQSAgICAgICAgICAgICAgRFgxLzAuNkQwLCAwLjFEMCwgLTAuNUQwLCAwLjhEMCwgMC45RDAsIC0wLjNEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjREMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERZMS8wLjVEMCwgLTAuOUQwLCAwLjNEMCwgMC43RDAsIC0wLjZEMCwgMC4yRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjhEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUNy8wLjBEMCwgMC4zMEQwLCAwLjIxRDAsIDAuNjJEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjMwRDAsIC0wLjA3RDAsIDAuODVEMCwgMC4wRDAsIDAuMzBEMCwgLTAuNzlEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjc0RDAsIDAuMEQwLCAwLjMwRDAsIDAuMzNEMCwgMS4yN0QwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ4LzAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC42OEQwLCAtMC44N0QwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjY4RDAsIC0wLjg3RDAsIDAuMTVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuOTREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjY4RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4zNUQwLCAtMC45RDAsIDAuNDhEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjM4RDAsIC0wLjlEMCwgMC41N0QwLCAwLjdEMCwgLTAuNzVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMkQwLCAwLjk4RDAsIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42OEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4zNUQwLCAtMC43MkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjM4RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC42M0QwLCAwLjE1RDAsIDAuODhEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42OEQwLCAtMC45RDAsIDAuMzNEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjY4RDAsIC0wLjlEMCwgMC4zM0QwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjc1RDAsIDAuMkQwLCAxLjA0RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDEwWC8wLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC41RDAsIC0wLjlEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC41RDAsIC0wLjlEMCwgMC4zRDAsIDAuN0QwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuM0QwLCAwLjFEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC44RDAsIDAuMUQwLCAtMC42RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjhEMCwgMC4zRDAsIC0wLjNEMCwgMC41RDAsIDAuNkQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAtMC45RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMUQwLCAwLjNEMCwgMC44RDAsIC0wLjlEMCwgLTAuM0QwLCAwLjVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjVEMCwgMC4zRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUQwLCAwLjNEMCwgLTAuNkQwLCAwLjhEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDEwWS8wLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42RDAsIDAuMUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjZEMCwgMC4xRDAsIC0wLjVEMCwgMC44RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgLTAuNUQwLCAtMC45RDAsIDAuNkQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIC0wLjREMCwgLTAuOUQwLCAwLjlEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuN0QwLCAtMC41RDAsIDAuMkQwLCAwLjZEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjZEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIC0wLjVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RDAsIDAuOUQwLCAtMC41RDAsIDAuNkQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNkQwLCAtMC45RDAsIDAuMUQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuNkQwLCAtMC45RDAsIDAuMUQwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjVEMCwgMC4yRDAsIDAuOEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1NJWkUxLzAuMEQwLCAwLjNEMCwgMS42RDAsIDMuMkQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1NJWkUyLzAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgRFJPVE0KKyoKKyAgICAgIERBVEEgRFBBUi8tMi5EMCwgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEEgICAgICAgICAgLTEuRDAsICAyLkQwLCAtMy5EMCwgLTQuRDAsICA1LkQwLAorICAgICBCICAgICAgICAgICAwLkQwLCAgMC5EMCwgIDIuRDAsIC0zLkQwLCAgMC5EMCwKKyAgICAgQyAgICAgICAgICAgMS5EMCwgIDUuRDAsICAyLkQwLCAgMC5EMCwgLTQuRDAvCisqICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSBYIFJFU1VMVFMgRjBSIFJPVEFUSU9OUyBEUk9UTQorICAgICAgREFUQSBEVDE5WEEvLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQSAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEIgICAgICAgICAgICAuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBDICAgICAgICAgICAgLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRCAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEUgICAgICAgICAgIC0uOEQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBGICAgICAgICAgICAtLjlEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRyAgICAgICAgICAgMy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEggICAgICAgICAgICAuNkQwLCAgIC4xRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSSAgICAgICAgICAgLS44RDAsICAzLjhEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBKICAgICAgICAgICAtLjlEMCwgIDIuOEQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEsgICAgICAgICAgIDMuNUQwLCAgLS40RDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgTCAgICAgICAgICAgIC42RDAsICAgLjFEMCwgIC0uNUQwLCAgIC44RDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLAorICAgICBNICAgICAgICAgICAtLjhEMCwgIDMuOEQwLCAtMi4yRDAsIC0xLjJEMCwgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsCisgICAgIE4gICAgICAgICAgIC0uOUQwLCAgMi44RDAsIC0xLjREMCwgLTEuM0QwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwKKyAgICAgTyAgICAgICAgICAgMy41RDAsICAtLjREMCwgLTIuMkQwLCAgNC43RDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLworKgorICAgICAgREFUQSBEVDE5WEIvLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQSAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEIgICAgICAgICAgICAuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBDICAgICAgICAgICAgLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRCAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEUgICAgICAgICAgIC0uOEQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBGICAgICAgICAgICAtLjlEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRyAgICAgICAgICAgMy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEggICAgICAgICAgICAuNkQwLCAgIC4xRDAsICAtLjVEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSSAgICAgICAgICAgMC5EMCwgICAgLjFEMCwgLTMuMEQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBKICAgICAgICAgICAtLjNEMCwgICAuMUQwLCAtMi4wRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEsgICAgICAgICAgIDMuM0QwLCAgIC4xRDAsIC0yLjBEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgTCAgICAgICAgICAgIC42RDAsICAgLjFEMCwgIC0uNUQwLCAgIC44RDAsICAgLjlEMCwgIC0uM0QwLCAgLS40RDAsCisgICAgIE0gICAgICAgICAgLTIuMEQwLCAgIC4xRDAsICAxLjREMCwgICAuOEQwLCAgIC42RDAsICAtLjNEMCwgLTIuOEQwLAorICAgICBOICAgICAgICAgIC0xLjhEMCwgICAuMUQwLCAgMS4zRDAsICAgLjhEMCwgIDAuRDAsICAgLS4zRDAsIC0xLjlEMCwKKyAgICAgTyAgICAgICAgICAgMy44RDAsICAgLjFEMCwgLTMuMUQwLCAgIC44RDAsICA0LjhEMCwgIC0uM0QwLCAtMS41RDAgLworKgorICAgICAgREFUQSBEVDE5WEMvLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQSAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEIgICAgICAgICAgICAuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBDICAgICAgICAgICAgLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRCAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEUgICAgICAgICAgIC0uOEQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBGICAgICAgICAgICAtLjlEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRyAgICAgICAgICAgMy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEggICAgICAgICAgICAuNkQwLCAgIC4xRDAsICAtLjVEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSSAgICAgICAgICAgNC44RDAsICAgLjFEMCwgLTMuMEQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBKICAgICAgICAgICAzLjNEMCwgICAuMUQwLCAtMi4wRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEsgICAgICAgICAgIDIuMUQwLCAgIC4xRDAsIC0yLjBEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgTCAgICAgICAgICAgIC42RDAsICAgLjFEMCwgIC0uNUQwLCAgIC44RDAsICAgLjlEMCwgIC0uM0QwLCAgLS40RDAsCisgICAgIE0gICAgICAgICAgLTEuNkQwLCAgIC4xRDAsIC0yLjJEMCwgICAuOEQwLCAgNS40RDAsICAtLjNEMCwgLTIuOEQwLAorICAgICBOICAgICAgICAgIC0xLjVEMCwgICAuMUQwLCAtMS40RDAsICAgLjhEMCwgIDMuNkQwLCAgLS4zRDAsIC0xLjlEMCwKKyAgICAgTyAgICAgICAgICAgMy43RDAsICAgLjFEMCwgLTIuMkQwLCAgIC44RDAsICAzLjZEMCwgIC0uM0QwLCAtMS41RDAgLworKgorICAgICAgREFUQSBEVDE5WEQvLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQSAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEIgICAgICAgICAgICAuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBDICAgICAgICAgICAgLjZEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRCAgICAgICAgICAgIC42RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEUgICAgICAgICAgIC0uOEQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBGICAgICAgICAgICAtLjlEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRyAgICAgICAgICAgMy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEggICAgICAgICAgICAuNkQwLCAgIC4xRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSSAgICAgICAgICAgLS44RDAsIC0xLjBEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBKICAgICAgICAgICAtLjlEMCwgIC0uOEQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEsgICAgICAgICAgIDMuNUQwLCAgIC44RDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgTCAgICAgICAgICAgIC42RDAsICAgLjFEMCwgIC0uNUQwLCAgIC44RDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLAorICAgICBNICAgICAgICAgICAtLjhEMCwgLTEuMEQwLCAgMS40RDAsIC0xLjZEMCwgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsCisgICAgIE4gICAgICAgICAgIC0uOUQwLCAgLS44RDAsICAxLjNEMCwgLTEuNkQwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwKKyAgICAgTyAgICAgICAgICAgMy41RDAsICAgLjhEMCwgLTMuMUQwLCAgNC44RDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLworKiAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgWSBSRVNVTFRTIEZPUiBST1RBVElPTlMgRFJPVE0KKyAgICAgIERBVEEgRFQxOVlBLy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEEgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBCICAgICAgICAgICAgLjVEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQyAgICAgICAgICAgIC41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEQgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBFICAgICAgICAgICAgLjdEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRiAgICAgICAgICAgMS43RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEcgICAgICAgICAgLTIuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBIICAgICAgICAgICAgLjVEMCwgIC0uOUQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEkgICAgICAgICAgICAuN0QwLCAtNC44RDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSiAgICAgICAgICAgMS43RDAsICAtLjdEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBLICAgICAgICAgIC0yLjZEMCwgIDMuNUQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEwgICAgICAgICAgICAuNUQwLCAgLS45RDAsICAgLjNEMCwgICAuN0QwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwKKyAgICAgTSAgICAgICAgICAgIC43RDAsIC00LjhEMCwgIDMuMEQwLCAgMS4xRDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLAorICAgICBOICAgICAgICAgICAxLjdEMCwgIC0uN0QwLCAgLS43RDAsICAyLjNEMCwgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsCisgICAgIE8gICAgICAgICAgLTIuNkQwLCAgMy41RDAsICAtLjdEMCwgLTMuNkQwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMC8KKyoKKyAgICAgIERBVEEgRFQxOVlCLy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEEgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBCICAgICAgICAgICAgLjVEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQyAgICAgICAgICAgIC41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEQgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBFICAgICAgICAgICAgLjdEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRiAgICAgICAgICAgMS43RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEcgICAgICAgICAgLTIuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBIICAgICAgICAgICAgLjVEMCwgIC0uOUQwLCAgIC4zRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEkgICAgICAgICAgIDQuMEQwLCAgLS45RDAsICAtLjNEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSiAgICAgICAgICAgLS41RDAsICAtLjlEMCwgIDEuNUQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBLICAgICAgICAgIC0xLjVEMCwgIC0uOUQwLCAtMS44RDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEwgICAgICAgICAgICAuNUQwLCAgLS45RDAsICAgLjNEMCwgICAuN0QwLCAgLS42RDAsICAgLjJEMCwgICAuOEQwLAorICAgICBNICAgICAgICAgICAzLjdEMCwgIC0uOUQwLCAtMS4yRDAsICAgLjdEMCwgLTEuNUQwLCAgIC4yRDAsICAyLjJEMCwKKyAgICAgTiAgICAgICAgICAgLS4zRDAsICAtLjlEMCwgIDIuMUQwLCAgIC43RDAsIC0xLjZEMCwgICAuMkQwLCAgMi4wRDAsCisgICAgIE8gICAgICAgICAgLTEuNkQwLCAgLS45RDAsIC0yLjFEMCwgICAuN0QwLCAgMi45RDAsICAgLjJEMCwgLTMuOEQwIC8KKyoKKyAgICAgIERBVEEgRFQxOVlDLy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEEgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBCICAgICAgICAgICAgLjVEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQyAgICAgICAgICAgIC41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEQgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBFICAgICAgICAgICAgLjdEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRiAgICAgICAgICAgMS43RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEcgICAgICAgICAgLTIuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBIICAgICAgICAgICAgLjVEMCwgIC0uOUQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEkgICAgICAgICAgIDQuMEQwLCAtNi4zRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSiAgICAgICAgICAgLS41RDAsICAgLjNEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBLICAgICAgICAgIC0xLjVEMCwgIDMuMEQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEwgICAgICAgICAgICAuNUQwLCAgLS45RDAsICAgLjNEMCwgICAuN0QwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwKKyAgICAgTSAgICAgICAgICAgMy43RDAsIC03LjJEMCwgIDMuMEQwLCAgMS43RDAsICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLAorICAgICBOICAgICAgICAgICAtLjNEMCwgICAuOUQwLCAgLS43RDAsICAxLjlEMCwgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsCisgICAgIE8gICAgICAgICAgLTEuNkQwLCAgMi43RDAsICAtLjdEMCwgLTMuNEQwLCAgICAgICAgICAwLkQwLDAuRDAsMC5EMC8KKyoKKyAgICAgIERBVEEgRFQxOVlELy41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEEgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBCICAgICAgICAgICAgLjVEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgQyAgICAgICAgICAgIC41RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEQgICAgICAgICAgICAuNUQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBFICAgICAgICAgICAgLjdEMCwgICAgICAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgRiAgICAgICAgICAgMS43RDAsICAgICAgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEcgICAgICAgICAgLTIuNkQwLCAgICAgICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBIICAgICAgICAgICAgLjVEMCwgIC0uOUQwLCAgIC4zRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEkgICAgICAgICAgICAuN0QwLCAgLS45RDAsICAxLjJEMCwgICAgICAgICAgICAgMC5EMCwwLkQwLDAuRDAsMC5EMCwKKyAgICAgSiAgICAgICAgICAgMS43RDAsICAtLjlEMCwgICAuNUQwLCAgICAgICAgICAgICAwLkQwLDAuRDAsMC5EMCwwLkQwLAorICAgICBLICAgICAgICAgIC0yLjZEMCwgIC0uOUQwLCAtMS4zRDAsICAgICAgICAgICAgIDAuRDAsMC5EMCwwLkQwLDAuRDAsCisgICAgIEwgICAgICAgICAgICAuNUQwLCAgLS45RDAsICAgLjNEMCwgICAuN0QwLCAgLS42RDAsICAgLjJEMCwgICAuOEQwLAorICAgICBNICAgICAgICAgICAgLjdEMCwgIC0uOUQwLCAgMS4yRDAsICAgLjdEMCwgLTEuNUQwLCAgIC4yRDAsICAxLjZEMCwKKyAgICAgTiAgICAgICAgICAgMS43RDAsICAtLjlEMCwgICAuNUQwLCAgIC43RDAsIC0xLjZEMCwgICAuMkQwLCAgMi40RDAsCisgICAgIE8gICAgICAgICAgLTIuNkQwLCAgLS45RDAsIC0xLjNEMCwgICAuN0QwLCAgMi45RDAsICAgLjJEMCwgLTQuMEQwIC8KKyogICAgCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIERPIDEyMCBLSSA9IDEsIDQKKyAgICAgICAgIElOQ1ggPSBJTkNYUyhLSSkKKyAgICAgICAgIElOQ1kgPSBJTkNZUyhLSSkKKyAgICAgICAgIE1YID0gQUJTKElOQ1gpCisgICAgICAgICBNWSA9IEFCUyhJTkNZKQorKgorICAgICAgICAgRE8gMTAwIEtOID0gMSwgNAorICAgICAgICAgICAgTiA9IE5TKEtOKQorICAgICAgICAgICAgS1NJWkUgPSBNSU4oMixLTikKKyAgICAgICAgICAgIExFTlggPSBMRU5TKEtOLE1YKQorICAgICAgICAgICAgTEVOWSA9IExFTlMoS04sTVkpCisqICAgICAgICAgICAuLiBJbml0aWFsaXplIGFsbCBhcmd1bWVudCBhcnJheXMgLi4KKyAgICAgICAgICAgIERPIDIwIEkgPSAxLCA3CisgICAgICAgICAgICAgICBTWChJKSA9IERYMShJKQorICAgICAgICAgICAgICAgU1koSSkgPSBEWTEoSSkKKyAgIDIwICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuMSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gRERPVCAuLgorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoRERPVChOLFNYLElOQ1gsU1ksSU5DWSksRFQ3KEtOLEtJKSxTU0laRTEoS04pCisgICAgICsgICAgICAgICAgICAgICAgICAgICAsU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjIpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERBWFBZIC4uCisgICAgICAgICAgICAgICBDQUxMIERBWFBZKE4sU0EsU1gsSU5DWCxTWSxJTkNZKQorICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsIExFTlkKKyAgICAgICAgICAgICAgICAgIFNUWShKKSA9IERUOChKLEtOLEtJKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWSxTWSxTVFksU1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS41KSBUSEVOCisqICAgICAgICAgICAgICAuLiBEQ09QWSAuLgorICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgICAgIFNUWShJKSA9IERUMTBZKEksS04sS0kpCisgICA2MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgQ0FMTCBEQ09QWShOLFNYLElOQ1gsU1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWSxTWSxTVFksU1NJWkUyKDEsMSksMS4wRDApCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS42KSBUSEVOCisqICAgICAgICAgICAgICAuLiBEU1dBUCAuLgorICAgICAgICAgICAgICAgQ0FMTCBEU1dBUChOLFNYLElOQ1gsU1ksSU5DWSkKKyAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCA3CisgICAgICAgICAgICAgICAgICBTVFgoSSkgPSBEVDEwWChJLEtOLEtJKQorICAgICAgICAgICAgICAgICAgU1RZKEkpID0gRFQxMFkoSSxLTixLSSkKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlgsU1gsU1RYLFNTSVpFMigxLDEpLDEuMEQwKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5ZLFNZLFNUWSxTU0laRTIoMSwxKSwxLjBEMCkKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjEyKSBUSEVOCisqICAgICAgICAgICAgICAuLiBEUk9UTSAuLgorICAgICAgICAgICAgICAgS05JPUtOKzQqKEtJLTEpCisgICAgICAgICAgICAgICBETyBLUEFSPTEsNAorICAgICAgICAgICAgICAgICAgRE8gST0xLDcKKyAgICAgICAgICAgICAgICAgICAgIFNYKEkpID0gRFgxKEkpCisgICAgICAgICAgICAgICAgICAgICBTWShJKSA9IERZMShJKQorICAgICAgICAgICAgICAgICAgICAgU1RYKEkpPSBEVDE5WChJLEtQQVIsS05JKQorICAgICAgICAgICAgICAgICAgICAgU1RZKEkpPSBEVDE5WShJLEtQQVIsS05JKQorICAgICAgICAgICAgICAgICAgRU5EIERPCisqCisgICAgICAgICAgICAgICAgICBETyBJPTEsNQorICAgICAgICAgICAgICAgICAgICAgRFRFTVAoSSkgPSBEUEFSKEksS1BBUikKKyAgICAgICAgICAgICAgICAgIEVORCBETworKgorICAgICAgICAgICAgICAgICAgRE8gIEk9MSxMRU5YCisgICAgICAgICAgICAgICAgICAgICBTU0laRShJKT1TVFgoSSkKKyAgICAgICAgICAgICAgICAgIEVORCBETworKiAgICAgICAgICAgICAgICAgICBTRUUgUkVNQVJLIEFCT1ZFIEFCT1VUIERUMTFYKDEsMiw3KQorKiAgICAgICAgICAgICAgICAgICAgICAgQU5EIERUMTFYKDUsMyw4KS4KKyAgICAgICAgICAgICAgICAgIElGICgoS1BBUiAuRVEuIDIpIC5BTkQuIChLTkkgLkVRLiA3KSkKKyAgICAgJCAgICAgICAgICAgICAgIFNTSVpFKDEpID0gMi40RDAKKyAgICAgICAgICAgICAgICAgIElGICgoS1BBUiAuRVEuIDMpIC5BTkQuIChLTkkgLkVRLiA4KSkKKyAgICAgJCAgICAgICAgICAgICAgIFNTSVpFKDUpID0gMS44RDAKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgICBEUk9UTShOLFNYLElOQ1gsU1ksSU5DWSxEVEVNUCkKKyAgICAgICAgICAgICAgICAgIENBTEwgICBTVEVTVChMRU5YLFNYLFNUWCxTU0laRSxTRkFDKQorICAgICAgICAgICAgICAgICAgQ0FMTCAgIFNURVNUKExFTlksU1ksU1RZLFNUWSxTRkFDKQorICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4xMykgVEhFTgorKiAgICAgICAgICAgICAgLi4gRFNET1QgLi4KKyAgICAgICAgICAgIENBTEwgVEVTVERTRE9UKFJFQUwoRFNET1QoTixSRUFMKFNYKSxJTkNYLFJFQUwoU1kpLElOQ1kpKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgUkVBTChEVDcoS04sS0kpKSxSRUFMKFNTSVpFMShLTikpLCAuMzEyNUUtMSkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMicKKyAgICAgICAgICAgICAgIFNUT1AKKyAgICAgICAgICAgIEVORCBJRgorICAxMDAgICAgQ09OVElOVUUKKyAgMTIwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzMoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNDLCBTUworICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgSywgS0ksIEtOLCBLU0laRSwgTEVOWCwgTEVOWSwgTVgsIE1ZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIENPUFlYKDUpLCBDT1BZWSg1KSwgRFQ5WCg3LDQsNCksIERUOVkoNyw0LDQpLAorICAgICArICAgICAgICAgICAgICAgICAgRFgxKDcpLCBEWTEoNyksIE1XUEMoMTEpLCBNV1BTKDExKSwgTVdQU1RYKDUpLAorICAgICArICAgICAgICAgICAgICAgICAgTVdQU1RZKDUpLCBNV1BUWCgxMSw1KSwgTVdQVFkoMTEsNSksIE1XUFgoNSksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BZKDUpLCBTU0laRTIoMTQsMiksIFNUWCg3KSwgU1RZKDcpLCBTWCg3KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIFNZKDcpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJTkNYUyg0KSwgSU5DWVMoNCksIExFTlMoNCwyKSwgTVdQSU5YKDExKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIE1XUElOWSgxMSksIE1XUE4oMTEpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIERST1QsIFNURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBJTkNYUy8xLCAyLCAtMiwgLTEvCisgICAgICBEQVRBICAgICAgICAgICAgICBJTkNZUy8xLCAtMiwgMSwgLTIvCisgICAgICBEQVRBICAgICAgICAgICAgICBMRU5TLzEsIDEsIDIsIDQsIDEsIDEsIDMsIDcvCisgICAgICBEQVRBICAgICAgICAgICAgICBOUy8wLCAxLCAyLCA0LworICAgICAgREFUQSAgICAgICAgICAgICAgRFgxLzAuNkQwLCAwLjFEMCwgLTAuNUQwLCAwLjhEMCwgMC45RDAsIC0wLjNEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjREMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERZMS8wLjVEMCwgLTAuOUQwLCAwLjNEMCwgMC43RDAsIC0wLjZEMCwgMC4yRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjhEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNDLCBTUy8wLjhEMCwgMC42RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDlYLzAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC43OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC43OEQwLCAtMC40NkQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjc4RDAsIC0wLjQ2RDAsIC0wLjIyRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjA2RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNkQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43OEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNjZEMCwgMC4xRDAsIC0wLjFEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjk2RDAsIDAuMUQwLCAtMC43NkQwLCAwLjhEMCwgMC45MEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuM0QwLCAtMC4wMkQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNzhEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIC0wLjA2RDAsIDAuMUQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC45MEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4xRDAsIC0wLjIyRDAsIDAuOEQwLCAwLjE4RDAsIC0wLjNEMCwgLTAuMDJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC43OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC43OEQwLCAwLjI2RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuNzhEMCwgMC4yNkQwLCAtMC43NkQwLCAxLjEyRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ5WS8wLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMDREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMDREMCwgLTAuNzhEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wNEQwLCAtMC43OEQwLCAwLjU0RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjA4RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNUQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wNEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC45RDAsIC0wLjEyRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42NEQwLCAtMC45RDAsIC0wLjMwRDAsIDAuN0QwLCAtMC4xOEQwLCAwLjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMjhEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjA0RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjdEMCwgLTEuMDhEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42NEQwLCAtMS4yNkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41NEQwLCAwLjIwRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNUQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMDREMCwgLTAuOUQwLCAwLjE4RDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wNEQwLCAtMC45RDAsIDAuMThEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xOEQwLCAwLjJEMCwgMC4xNkQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1NJWkUyLzAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyA2MCBLSSA9IDEsIDQKKyAgICAgICAgIElOQ1ggPSBJTkNYUyhLSSkKKyAgICAgICAgIElOQ1kgPSBJTkNZUyhLSSkKKyAgICAgICAgIE1YID0gQUJTKElOQ1gpCisgICAgICAgICBNWSA9IEFCUyhJTkNZKQorKgorICAgICAgICAgRE8gNDAgS04gPSAxLCA0CisgICAgICAgICAgICBOID0gTlMoS04pCisgICAgICAgICAgICBLU0laRSA9IE1JTigyLEtOKQorICAgICAgICAgICAgTEVOWCA9IExFTlMoS04sTVgpCisgICAgICAgICAgICBMRU5ZID0gTEVOUyhLTixNWSkKKyoKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS40KSBUSEVOCisqICAgICAgICAgICAgICAuLiBEUk9UIC4uCisgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgNworICAgICAgICAgICAgICAgICAgU1goSSkgPSBEWDEoSSkKKyAgICAgICAgICAgICAgICAgIFNZKEkpID0gRFkxKEkpCisgICAgICAgICAgICAgICAgICBTVFgoSSkgPSBEVDlYKEksS04sS0kpCisgICAgICAgICAgICAgICAgICBTVFkoSSkgPSBEVDlZKEksS04sS0kpCisgICAyMCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgQ0FMTCBEUk9UKE4sU1gsSU5DWCxTWSxJTkNZLFNDLFNTKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5YLFNYLFNUWCxTU0laRTIoMSxLU0laRSksU0ZBQykKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWSxTWSxTVFksU1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzMnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyAgIDQwICAgIENPTlRJTlVFCisgICA2MCBDT05USU5VRQorKgorICAgICAgTVdQQygxKSA9IDEKKyAgICAgIERPIDgwIEkgPSAyLCAxMQorICAgICAgICAgTVdQQyhJKSA9IDAKKyAgIDgwIENPTlRJTlVFCisgICAgICBNV1BTKDEpID0gMAorICAgICAgRE8gMTAwIEkgPSAyLCA2CisgICAgICAgICBNV1BTKEkpID0gMQorICAxMDAgQ09OVElOVUUKKyAgICAgIERPIDEyMCBJID0gNywgMTEKKyAgICAgICAgIE1XUFMoSSkgPSAtMQorICAxMjAgQ09OVElOVUUKKyAgICAgIE1XUElOWCgxKSA9IDEKKyAgICAgIE1XUElOWCgyKSA9IDEKKyAgICAgIE1XUElOWCgzKSA9IDEKKyAgICAgIE1XUElOWCg0KSA9IC0xCisgICAgICBNV1BJTlgoNSkgPSAxCisgICAgICBNV1BJTlgoNikgPSAtMQorICAgICAgTVdQSU5YKDcpID0gMQorICAgICAgTVdQSU5YKDgpID0gMQorICAgICAgTVdQSU5YKDkpID0gLTEKKyAgICAgIE1XUElOWCgxMCkgPSAxCisgICAgICBNV1BJTlgoMTEpID0gLTEKKyAgICAgIE1XUElOWSgxKSA9IDEKKyAgICAgIE1XUElOWSgyKSA9IDEKKyAgICAgIE1XUElOWSgzKSA9IC0xCisgICAgICBNV1BJTlkoNCkgPSAtMQorICAgICAgTVdQSU5ZKDUpID0gMgorICAgICAgTVdQSU5ZKDYpID0gMQorICAgICAgTVdQSU5ZKDcpID0gMQorICAgICAgTVdQSU5ZKDgpID0gLTEKKyAgICAgIE1XUElOWSg5KSA9IC0xCisgICAgICBNV1BJTlkoMTApID0gMgorICAgICAgTVdQSU5ZKDExKSA9IDEKKyAgICAgIERPIDE0MCBJID0gMSwgMTEKKyAgICAgICAgIE1XUE4oSSkgPSA1CisgIDE0MCBDT05USU5VRQorICAgICAgTVdQTig1KSA9IDMKKyAgICAgIE1XUE4oMTApID0gMworICAgICAgRE8gMTYwIEkgPSAxLCA1CisgICAgICAgICBNV1BYKEkpID0gSQorICAgICAgICAgTVdQWShJKSA9IEkKKyAgICAgICAgIE1XUFRYKDEsSSkgPSBJCisgICAgICAgICBNV1BUWSgxLEkpID0gSQorICAgICAgICAgTVdQVFgoMixJKSA9IEkKKyAgICAgICAgIE1XUFRZKDIsSSkgPSAtSQorICAgICAgICAgTVdQVFgoMyxJKSA9IDYgLSBJCisgICAgICAgICBNV1BUWSgzLEkpID0gSSAtIDYKKyAgICAgICAgIE1XUFRYKDQsSSkgPSBJCisgICAgICAgICBNV1BUWSg0LEkpID0gLUkKKyAgICAgICAgIE1XUFRYKDYsSSkgPSA2IC0gSQorICAgICAgICAgTVdQVFkoNixJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWCg3LEkpID0gLUkKKyAgICAgICAgIE1XUFRZKDcsSSkgPSBJCisgICAgICAgICBNV1BUWCg4LEkpID0gSSAtIDYKKyAgICAgICAgIE1XUFRZKDgsSSkgPSA2IC0gSQorICAgICAgICAgTVdQVFgoOSxJKSA9IC1JCisgICAgICAgICBNV1BUWSg5LEkpID0gSQorICAgICAgICAgTVdQVFgoMTEsSSkgPSBJIC0gNgorICAgICAgICAgTVdQVFkoMTEsSSkgPSA2IC0gSQorICAxNjAgQ09OVElOVUUKKyAgICAgIE1XUFRYKDUsMSkgPSAxCisgICAgICBNV1BUWCg1LDIpID0gMworICAgICAgTVdQVFgoNSwzKSA9IDUKKyAgICAgIE1XUFRYKDUsNCkgPSA0CisgICAgICBNV1BUWCg1LDUpID0gNQorICAgICAgTVdQVFkoNSwxKSA9IC0xCisgICAgICBNV1BUWSg1LDIpID0gMgorICAgICAgTVdQVFkoNSwzKSA9IC0yCisgICAgICBNV1BUWSg1LDQpID0gNAorICAgICAgTVdQVFkoNSw1KSA9IC0zCisgICAgICBNV1BUWCgxMCwxKSA9IC0xCisgICAgICBNV1BUWCgxMCwyKSA9IC0zCisgICAgICBNV1BUWCgxMCwzKSA9IC01CisgICAgICBNV1BUWCgxMCw0KSA9IDQKKyAgICAgIE1XUFRYKDEwLDUpID0gNQorICAgICAgTVdQVFkoMTAsMSkgPSAxCisgICAgICBNV1BUWSgxMCwyKSA9IDIKKyAgICAgIE1XUFRZKDEwLDMpID0gMgorICAgICAgTVdQVFkoMTAsNCkgPSA0CisgICAgICBNV1BUWSgxMCw1KSA9IDMKKyAgICAgIERPIDIwMCBJID0gMSwgMTEKKyAgICAgICAgIElOQ1ggPSBNV1BJTlgoSSkKKyAgICAgICAgIElOQ1kgPSBNV1BJTlkoSSkKKyAgICAgICAgIERPIDE4MCBLID0gMSwgNQorICAgICAgICAgICAgQ09QWVgoSykgPSBNV1BYKEspCisgICAgICAgICAgICBDT1BZWShLKSA9IE1XUFkoSykKKyAgICAgICAgICAgIE1XUFNUWChLKSA9IE1XUFRYKEksSykKKyAgICAgICAgICAgIE1XUFNUWShLKSA9IE1XUFRZKEksSykKKyAgMTgwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIERST1QoTVdQTihJKSxDT1BZWCxJTkNYLENPUFlZLElOQ1ksTVdQQyhJKSxNV1BTKEkpKQorICAgICAgICAgQ0FMTCBTVEVTVCg1LENPUFlYLE1XUFNUWCxNV1BTVFgsU0ZBQykKKyAgICAgICAgIENBTEwgU1RFU1QoNSxDT1BZWSxNV1BTVFksTVdQU1RZLFNGQUMpCisgIDIwMCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU1RFU1QoTEVOLFNDT01QLFNUUlVFLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU1RFU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgU1VCUiBDT01QQVJFUyBBUlJBWVMgIFNDT01QKCkgQU5EIFNUUlVFKCkgT0YgTEVOR1RIIExFTiBUTworKiAgICAgU0VFIElGIFRIRSBURVJNIEJZIFRFUk0gRElGRkVSRU5DRVMsIE1VTFRJUExJRUQgQlkgU0ZBQywgQVJFCisqICAgICBORUdMSUdJQkxFLgorKgorKiAgICAgQy4gTC4gTEFXU09OLCBKUEwsIDE5NzQgREVDIDEwCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02LCBaRVJPPTAuMEQwKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIExFTgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNDT01QKExFTiksIFNTSVpFKExFTiksIFNUUlVFKExFTikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0QKKyAgICAgIElOVEVHRVIgICAgICAgICAgSQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNESUZGCisgICAgICBFWFRFUk5BTCAgICAgICAgIFNESUZGCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgIEFCUworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBQQVNTCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIERPIDQwIEkgPSAxLCBMRU4KKyAgICAgICAgIFNEID0gU0NPTVAoSSkgLSBTVFJVRShJKQorICAgICAgICAgSUYgKEFCUyhTRkFDKlNEKSAuTEUuIEFCUyhTU0laRShJKSkqRVBTSUxPTihaRVJPKSkKKyAgICAgKyAgICAgICBHTyBUTyA0MAorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSRSAgICBTQ09NUChJKSBJUyBOT1QgQ0xPU0UgVE8gU1RSVUUoSSkuCisqCisgICAgICAgICBJRiAoIC5OT1QuIFBBU1MpIEdPIFRPIDIwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVCBGQUlMIE1FU1NBR0UgQU5EIEhFQURFUi4KKyAgICAgICAgIFBBU1MgPSAuRkFMU0UuCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgICAgIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBJLCBTQ09NUChJKSwKKyAgICAgKyAgICAgU1RSVUUoSSksIFNELCBTU0laRShJKQorICAgNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCcpCis5OTk5OCBGT1JNQVQgKC8nIENBU0UgIE4gSU5DWCBJTkNZICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QKEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKEkpICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAnICAgICBTSVpFKEkpJywvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDJJNSxJMywyRDM2LjgsMkQxMi40KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFRFU1REU0RPVChTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBSRUFMICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NiwgWkVSTz0wLjBFMCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQywgU0NPTVAsIFNTSVpFLCBTVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBQlMKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICAgICBTRCA9IFNDT01QIC0gU1RSVUUKKyAgICAgICAgIElGIChBQlMoU0ZBQypTRCkgLkxFLiBBQlMoU1NJWkUpICogRVBTSUxPTihaRVJPKSkKKyAgICAgKyAgICAgICBHTyBUTyA0MAorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSRSAgICBTQ09NUChJKSBJUyBOT1QgQ0xPU0UgVE8gU1RSVUUoSSkuCisqCisgICAgICAgICBJRiAoIC5OT1QuIFBBU1MpIEdPIFRPIDIwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVCBGQUlMIE1FU1NBR0UgQU5EIEhFQURFUi4KKyAgICAgICAgIFBBU1MgPSAuRkFMU0UuCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgICAgIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBTQ09NUCwKKyAgICAgKyAgICAgU1RSVUUsIFNELCBTU0laRQorICAgNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCcpCis5OTk5OCBGT1JNQVQgKC8nIENBU0UgIE4gSU5DWCBJTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgJywKKyAgICAgKyAgICAgICAnIENPTVAoSSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUoSSkgIERJRkZFUkVOQ0UnLAorICAgICArICAgICAgICcgICAgIFNJWkUoSSknLC8xWCkKKzk5OTk3IEZPUk1BVCAoMVgsSTQsSTMsMUk1LEkzLDJFMzYuOCwyRTEyLjQpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU1RFU1QxKFNDT01QMSxTVFJVRTEsU1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKiogU1RFU1QxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIElTIEFOIElOVEVSRkFDRSBTVUJST1VUSU5FIFRPIEFDQ09NT0RBVEUgVEhFIEZPUlRSQU4KKyogICAgIFJFUVVJUkVNRU5UIFRIQVQgV0hFTiBBIERVTU1ZIEFSR1VNRU5UIElTIEFOIEFSUkFZLCBUSEUKKyogICAgIEFDVFVBTCBBUkdVTUVOVCBNVVNUIEFMU08gQkUgQU4gQVJSQVkgT1IgQU4gQVJSQVkgRUxFTUVOVC4KKyoKKyogICAgIEMuTC4gTEFXU09OLCBKUEwsIDE5NzggREVDIDYKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNDT01QMSwgU0ZBQywgU1RSVUUxCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNTSVpFKCopCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNDT01QKDEpLCBTVFJVRSgxKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNURVNUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIFNDT01QKDEpID0gU0NPTVAxCisgICAgICBTVFJVRSgxKSA9IFNUUlVFMQorICAgICAgQ0FMTCBTVEVTVCgxLFNDT01QLFNUUlVFLFNTSVpFLFNGQUMpCisqCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBTRElGRihTQSxTQikKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTRElGRiAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgQ09NUFVURVMgRElGRkVSRU5DRSBPRiBUV08gTlVNQkVSUy4gIEMuIEwuIExBV1NPTiwgSlBMIDE5NzQgRkVCIDE1CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgICAgICAgICAgICAgIFNBLCBTQgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFNBIC0gU0IKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIElURVNUMShJQ09NUCxJVFJVRSkKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJVEVTVDEgKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBTVUJST1VUSU5FIENPTVBBUkVTIFRIRSBWQVJJQUJMRVMgSUNPTVAgQU5EIElUUlVFIEZPUgorKiAgICAgRVFVQUxJVFkuCisqICAgICBDLiBMLiBMQVdTT04sIEpQTCwgMTk3NCBERUMgMTAKKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ09NUCwgSVRSVUUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYgKElDT01QLkVRLklUUlVFKSBHTyBUTyA0MAorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVJFIElDT01QIElTIE5PVCBFUVVBTCBUTyBJVFJVRS4KKyoKKyAgICAgIElGICggLk5PVC4gUEFTUykgR08gVE8gMjAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UIEZBSUwgTUVTU0FHRSBBTkQgSEVBREVSLgorICAgICAgUEFTUyA9IC5GQUxTRS4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCBJRCA9IElDT01QIC0gSVRSVUUKKyAgICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgSUNPTVAsIElUUlVFLCBJRAorICAgNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCcpCis5OTk5OCBGT1JNQVQgKC8nIENBU0UgIE4gSU5DWCBJTkNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICAgICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDJJNSwySTM2LEkxMikKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2RibGF0Mi5kYXQgYi9ibGFzL3Rlc3RpbmcvZGJsYXQyLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU1YjgzCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL2RibGF0Mi5kYXQKQEAgLTAsMCArMSwzNCBAQAorJ2RibGF0Mi5zdW1tJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCis2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKydkYmxhdDIuc25hcCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKy0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCiswIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCiswIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorMC4wIDEuMCAwLjcgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKzAuMCAxLjAgMC45ICAgICAgIFZBTFVFUyBPRiBCRVRBCitER0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorREdCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFNQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RHRVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1lSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFNQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1BSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2RibGF0Mi5mIGIvYmxhcy90ZXN0aW5nL2RibGF0Mi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTgwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvZGJsYXQyLmYKQEAgLTAsMCArMSwzMTc2IEBACisqPiBcYnJpZWYgXGIgREJMQVQyCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBQUk9HUkFNIERCTEFUMgorKiAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBUZXN0IHByb2dyYW0gZm9yIHRoZSBET1VCTEUgUFJFQ0lTSU9OIExldmVsIDIgQmxhcy4KKyo+CisqPiBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE4IHJlY29yZHMKKyo+IG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDE2IHJlY29yZHMKKyo+IGFyZSByZWFkIHVzaW5nIHRoZSBmb3JtYXQgKCBBNiwgTDIgKS4gQW4gYW5ub3RhdGVkIGV4YW1wbGUgb2YgYSBkYXRhCisqPiBmaWxlIGNhbiBiZSBvYnRhaW5lZCBieSBkZWxldGluZyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIGZyb20gdGhlCisqPiBmb2xsb3dpbmcgMzQgbGluZXM6CisqPiAnZGJsYXQyLm91dCcgICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKyo+IDYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorKj4gJ0RCTEFUMi5TTkFQJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorKj4gLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorKj4gRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorKj4gRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCisqPiBUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKyo+IDE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCisqPiA2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKyo+IDAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCisqPiA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEsKKyo+IDAgMSAyIDQgICAgICAgICAgIFZBTFVFUyBPRiBLCisqPiA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKyo+IDEgMiAtMSAtMiAgICAgICAgIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqPiAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisqPiAwLjAgMS4wIDAuNyAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKj4gMC4wIDEuMCAwLjkgICAgICAgVkFMVUVTIE9GIEJFVEFDCisqPiBER0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gREdCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERTWU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEU0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gRFNQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gRFRQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gRFRQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERHRVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEU1lSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gRFNQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERTWVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEU1BSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4KKyo+IEZ1cnRoZXIgRGV0YWlscworKj4gPT09PT09PT09PT09PT09CisqPgorKj4gICAgU2VlOgorKj4KKyo+ICAgICAgIERvbmdhcnJhIEouIEouLCBEdSBDcm96IEouIEouLCBIYW1tYXJsaW5nIFMuICBhbmQgSGFuc29uIFIuIEouLgorKj4gICAgICAgQW4gIGV4dGVuZGVkICBzZXQgb2YgRm9ydHJhbiAgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqPgorKj4gICAgICAgVGVjaG5pY2FsICBNZW1vcmFuZGEgIE5vcy4gNDEgKHJldmlzaW9uIDMpIGFuZCA4MSwgIE1hdGhlbWF0aWNzCisqPiAgICAgICBhbmQgIENvbXB1dGVyIFNjaWVuY2UgIERpdmlzaW9uLCAgQXJnb25uZSAgTmF0aW9uYWwgTGFib3JhdG9yeSwKKyo+ICAgICAgIDk3MDAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyo+CisqPiAgICAgICBPcgorKj4KKyo+ICAgICAgIE5BRyAgVGVjaG5pY2FsIFJlcG9ydHMgVFIzLzg3IGFuZCBUUjQvODcsICBOdW1lcmljYWwgQWxnb3JpdGhtcworKj4gICAgICAgR3JvdXAgIEx0ZC4sICBOQUcgIENlbnRyYWwgIE9mZmljZSwgIDI1NiAgQmFuYnVyeSAgUm9hZCwgT3hmb3JkCisqPiAgICAgICBPWDIgN0RFLCBVSywgIGFuZCAgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgSW5jLiwgIDExMDEgIDMxc3QKKyo+ICAgICAgIFN0cmVldCwgIFN1aXRlIDEwMCwgIERvd25lcnMgR3JvdmUsICBJbGxpbm9pcyA2MDUxNS0xMjYzLCAgVVNBLgorKj4KKyo+CisqPiAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKj4gICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKj4gICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyo+CisqPiAgICAxMC05LTAwOiAgQ2hhbmdlIFNUQVRVUz0nTkVXJyB0byAnVU5LTk9XTicgc28gdGhhdCB0aGUgdGVzdGVycworKj4gICAgICAgICAgICAgIGNhbiBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aG91dCBkZWxldGluZyBnZW5lcmF0ZWQKKyo+ICAgICAgICAgICAgICBvdXRwdXQgZmlsZXMgKHN1c2FuKQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgZG91YmxlX2JsYXNfdGVzdGluZworKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBQUk9HUkFNIERCTEFUMgorKgorKiAgLS0gUmVmZXJlbmNlIEJMQVMgdGVzdCByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gUmVmZXJlbmNlIEJMQVMgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIEFwcmlsIDIwMTIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gMTYgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWCwgSU5DTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUsIElOQ01BWCA9IDIgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTk1BWCwgTklETUFYLCBOS0JNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSU5NQVggPSA3LCBOSURNQVggPSA5LCBOS0JNQVggPSA3LAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggMipOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURNQVggKSwgSU5DKCBOSU5NQVggKSwgS0IoIE5LQk1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIERESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRERJRkYsIExERQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBEQ0hLMSwgRENISzIsIERDSEszLCBEQ0hLNCwgRENISzUsIERDSEs2LAorICAgICAkICAgICAgICAgICAgICAgICAgIERDSEtFLCBETVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ0RHRU1WICcsICdER0JNViAnLCAnRFNZTVYgJywgJ0RTQk1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTUE1WICcsICdEVFJNViAnLCAnRFRCTVYgJywgJ0RUUE1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RUUlNWICcsICdEVEJTViAnLCAnRFRQU1YgJywgJ0RHRVIgICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTWVIgICcsICdEU1BSICAnLCAnRFNZUjIgJywgJ0RTUFIyICcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdVTktOT1dOJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ1VOS05PV04nICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgRE1WQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTEwIEkgPSAxLCBOCisgICAgICAgICAgICBBKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgIDExMCAgICBDT05USU5VRQorICAgICAgICAgWCggSiApID0gSgorICAgICAgICAgWSggSiApID0gWkVSTworICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgWVkoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisqICAgICBZWSBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gRE1WQ0ggWVQgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgRE1WQ0guCisgICAgICBUUkFOUyA9ICdOJworICAgICAgQ0FMTCBETVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgMSwgWkVSTywgWSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExERSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TID0gJ1QnCisgICAgICBDQUxMIERNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLCAtMSwgWkVSTywgWSwgLTEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMREUoIFlZLCBZVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjEwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIERDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNDAsIDE1MCwgMTUwLCAxNTAsIDE2MCwgMTYwLAorICAgICAkICAgICAgICAgICAgICAxNjAsIDE2MCwgMTYwLCAxNjAsIDE3MCwgMTgwLCAxODAsCisgICAgICQgICAgICAgICAgICAgIDE5MCwgMTkwIClJU05VTQorKiAgICAgICAgICAgVGVzdCBER0VNViwgMDEsIGFuZCBER0JNViwgMDIuCisgIDE0MCAgICAgICBDQUxMIERDSEsxKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBEU1lNViwgMDMsIERTQk1WLCAwNCwgYW5kIERTUE1WLCAwNS4KKyAgMTUwICAgICAgIENBTEwgRENISzIoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsCisgICAgICQgICAgICAgICAgICAgICAgICBOQkVULCBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IERUUk1WLCAwNiwgRFRCTVYsIDA3LCBEVFBNViwgMDgsCisqICAgICAgICAgICBEVFJTViwgMDksIERUQlNWLCAxMCwgYW5kIERUUFNWLCAxMS4KKyAgMTYwICAgICAgIENBTEwgRENISzMoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWSwgWVksIFlTLCBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgREdFUiwgMTIuCisgIDE3MCAgICAgICBDQUxMIERDSEs0KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgRFNZUiwgMTMsIGFuZCBEU1BSLCAxNC4KKyAgMTgwICAgICAgIENBTEwgRENISzUoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBEU1lSMiwgMTUsIGFuZCBEU1BSMiwgMTYuCisgIDE5MCAgICAgICBDQUxMIERDSEs2KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisqCisgIDIwMCAgICAgICBJRiggRkFUQUwuQU5ELlNGQVRBTCApCisgICAgICQgICAgICAgICBHTyBUTyAyMjAKKyAgICAgICAgIEVORCBJRgorICAyMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgyICkKKyAgICAgIEdPIFRPIDI0MAorKgorICAyMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgxICkKKyAgICAgIEdPIFRPIDI0MAorKgorICAyMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg3ICkKKyoKKyAgMjQwIENPTlRJTlVFCisgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgQ0xPU0UgKCBOVFJBICkKKyAgICAgIENMT1NFICggTk9VVCApCisgICAgICBTVE9QCisqCisgOTk5OSBGT1JNQVQoICcgUk9VVElORVMgUEFTUyBDT01QVVRBVElPTkFMIFRFU1RTIElGIFRFU1QgUkFUSU8gSVMgTEVTJywKKyAgICAgJCAgICAgICdTIFRIQU4nLCBGOC4yICkKKyA5OTk4IEZPUk1BVCggJyBSRUxBVElWRSBNQUNISU5FIFBSRUNJU0lPTiBJUyBUQUtFTiBUTyBCRScsIDFQLCBEOS4xICkKKyA5OTk3IEZPUk1BVCggJyBOVU1CRVIgT0YgVkFMVUVTIE9GICcsIEEsICcgSVMgTEVTUyBUSEFOIDEgT1IgR1JFQVRFUiAnLAorICAgICAkICAgICAgJ1RIQU4gJywgSTIgKQorIDk5OTYgRk9STUFUKCAnIFZBTFVFIE9GIE4gSVMgTEVTUyBUSEFOIDAgT1IgR1JFQVRFUiBUSEFOICcsIEkyICkKKyA5OTk1IEZPUk1BVCggJyBWQUxVRSBPRiBLIElTIExFU1MgVEhBTiAwJyApCisgOTk5NCBGT1JNQVQoICcgQUJTT0xVVEUgVkFMVUUgT0YgSU5DWCBPUiBJTkNZIElTIDAgT1IgR1JFQVRFUiBUSEFOICcsCisgICAgICQgICAgICBJMiApCisgOTk5MyBGT1JNQVQoICcgVEVTVFMgT0YgVEhFIERPVUJMRSBQUkVDSVNJT04gTEVWRUwgMiBCTEFTJywgLy8nIFRIRSBGJywKKyAgICAgJCAgICAgICdPTExPV0lORyBQQVJBTUVURVIgVkFMVUVTIFdJTEwgQkUgVVNFRDonICkKKyA5OTkyIEZPUk1BVCggJyAgIEZPUiBOICAgICAgICAgICAgICAnLCA5STYgKQorIDk5OTEgRk9STUFUKCAnICAgRk9SIEsgICAgICAgICAgICAgICcsIDdJNiApCisgOTk5MCBGT1JNQVQoICcgICBGT1IgSU5DWCBBTkQgSU5DWSAgJywgN0k2ICkKKyA5OTg5IEZPUk1BVCggJyAgIEZPUiBBTFBIQSAgICAgICAgICAnLCA3RjYuMSApCisgOTk4OCBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywgN0Y2LjEgKQorIDk5ODcgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg2IEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg1IEZPUk1BVCggJyBFUlJPUiBJTiBETVZDSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBETVZDSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlMgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgRVJSID0gJywgRjEyLjMsICcuJywgLworICAgICAkICAgJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSBBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nCisgICAgICQgICAgICAsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggQTYsIEwyICkKKyA5OTgzIEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4MiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODEgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTgwIEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBEQkxBVDIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBER0VNViBhbmQgREdCTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIEhBTEYgPSAwLjVEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgRyggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDLCBJS1UsIElNLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgSU5DWVMsIElYLCBJWSwgS0wsIEtMUywgS1UsIEtVUywgTEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBUywgTFgsIExZLCBNLCBNTCwgTVMsIE4sIE5BUkdTLCBOQywgTkQsIE5LLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5MLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBER0JNViwgREdFTVYsIERNQUtFLCBETVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydOVEMnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIEJBTkRFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ0InCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEzCisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEyMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorICAgICAgICAgTkQgPSBOLzIgKyAxCisqCisgICAgICAgICBETyAxMTAgSU0gPSAxLCAyCisgICAgICAgICAgICBJRiggSU0uRVEuMSApCisgICAgICQgICAgICAgICBNID0gTUFYKCBOIC0gTkQsIDAgKQorICAgICAgICAgICAgSUYoIElNLkVRLjIgKQorICAgICAkICAgICAgICAgTSA9IE1JTiggTiArIE5ELCBOTUFYICkKKyoKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIElLVSA9IDEsIE5LCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBLVSA9IEtCKCBJS1UgKQorICAgICAgICAgICAgICAgICAgS0wgPSBNQVgoIEtVIC0gMSwgMCApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLVSA9IE4gLSAxCisgICAgICAgICAgICAgICAgICBLTCA9IE0gLSAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgTERBID0gS0wgKyBLVSArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIExEQSA9IE0KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICBDQUxMIERNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEtMLCBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICBETyA5MCBJQyA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE4KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgTUwgPSBNCisgICAgICAgICAgICAgICAgICAgICBOTCA9IE4KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk5MCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTkwsIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE5MIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICAgICBJRiggTkwuR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgWCggTkwvMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE5MLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk1MCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBNTCwgWSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBBQlMoIElOQ1kgKSwgMCwgTUwgLSAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMUyA9IEtMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVVMgPSBLVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgREdFTVYoIFRSQU5TLCBNLCBOLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYLCBCRVRBLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBLTCwgS1UsIEFMUEhBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBER0JNViggVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBYWCwgSU5DWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TLkVRLlRSQU5TUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExERSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS0xTLkVRLktMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1VTLkVRLktVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMREUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMREVSRVMoICdHRScsICcgJywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUwsIFlTLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1WQ0goIFRSQU5TLCBNLCBOLCBBTFBIQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTS5sZS4wIG9yCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNDAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlMsIE0sIE4sIEtMLCBLVSwKKyAgICAgJCAgICAgIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCA0KCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsICcpIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCBGNC4xLAorICAgICAkICAgICAgJywgQSwnLCBJMywgJywgWCwnLCBJMiwgJywnLCBGNC4xLCAnLCBZLCcsIEkyLAorICAgICAkICAgICAgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIERTWU1WLCBEU0JNViBhbmQgRFNQTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIEhBTEYgPSAwLjVEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgRyggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDLCBJSywgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgIElOQ1lTLCBJWCwgSVksIEssIEtTLCBMQUEsIExEQSwgTERBUywgTFgsIExZLAorICAgICAkICAgICAgICAgICAgICAgICAgIE4sIE5BUkdTLCBOQywgTkssIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERNQUtFLCBETVZDSCwgRFNCTVYsIERTUE1WLCBEU1lNVgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nWScKKyAgICAgIEJBTkRFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ0InCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTAKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDkKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICBDQUxMIERNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsIE5NQVgsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgTERBLCBLLCBLLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERTWU1WKCBVUExPLCBOLCBBTFBIQSwgQUEsIExEQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgSywgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERTQk1WKCBVUExPLCBOLCBLLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBJTkNYLCBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERTUE1WKCBVUExPLCBOLCBBTFBIQSwgQUEsIFhYLCBJTkNYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREVSRVMoICdHRScsICcgJywgMSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREVSRVMoICdHRScsICcgJywgMSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1WQ0goICdOJywgTiwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBZLCBJTkNZLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgQ09OVElOVUUKKyoKKyAgMTEwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgTERBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBLLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwKKyAgICAgJCAgICAgIEJFVEEsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBBUCcsCisgICAgICQgICAgICAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsICcpICAgICAgICAgICAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCBGNC4xLAorICAgICAkICAgICAgJywgQSwnLCBJMywgJywgWCwnLCBJMiwgJywnLCBGNC4xLCAnLCBZLCcsIEkyLAorICAgICAkICAgICAgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIEEsJywKKyAgICAgJCAgICAgIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsICcpICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEsyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEszKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBYVCwgRywgWiApCisqCisqICBUZXN0cyBEVFJNViwgRFRCTVYsIERUUE1WLCBEVFJTViwgRFRCU1YgYW5kIERUUFNWLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIEhBTEYgPSAwLjVEMCwgT05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOSURJTSwgTklOQywgTktCLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgRyggTk1BWCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUNELCBJQ1QsIElDVSwgSUssIElOLCBJTkNYLCBJTkNYUywgSVgsIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgS1MsIExBQSwgTERBLCBMREFTLCBMWCwgTiwgTkFSR1MsIE5DLCBOSywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgVFJBTlMsIFRSQU5TUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hELCBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNVkNILCBEVEJNViwgRFRCU1YsIERUUE1WLCBEVFBTViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBEVFJNViwgRFRSU1YKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hVLydVTCcvLCBJQ0hULydOVEMnLywgSUNIRC8nVU4nLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nUicKKyAgICAgIEJBTkRFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ0InCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDkKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyogICAgIFNldCB1cCB6ZXJvIHZlY3RvciBmb3IgRE1WQ0guCisgICAgICBETyAxMCBJID0gMSwgTk1BWAorICAgICAgICAgWiggSSApID0gWkVSTworICAgMTAgQ09OVElOVUUKKyoKKyAgICAgIERPIDExMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKgorICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgRU5EIElGCisgICAgICAgICBETyAxMDAgSUsgPSAxLCBOSworICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgSyA9IEtCKCBJSyApCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBLID0gTiAtIDEKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBMREEgPSBLICsgMQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgTERBID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICBMQUEgPSAoIE4qKCBOICsgMSApICkvMgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMAorKgorICAgICAgICAgICAgRE8gOTAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TID0gSUNIVCggSUNUOiBJQ1QgKQorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSUNEID0gMSwgMgorICAgICAgICAgICAgICAgICAgICAgRElBRyA9IElDSEQoIElDRDogSUNEICkKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sIERJQUcsIE4sIE4sIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBLLCBLLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQUdTID0gRElBRworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERUUk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSywgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEVEJNViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERUUE1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRSU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERUQlNWKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRQU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TLkVRLlRSQU5TUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IERJQUcuRVEuRElBR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREVSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTVYnIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFosIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgYXBwcm94aW1hdGlvbiB0byBvcmlnaW5hbCB2ZWN0b3IuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWFgoIDEgKyAoIEkgLSAxICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArICggSSAtIDEgKSpBQlMoIElOQ1ggKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFosCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBaRVJPLCBYLCBJTkNYLCBYVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRkFMU0UuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBMREEsCisgICAgICQgICAgICBJTkNYCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLAorICAgICAkICAgICAgTERBLCBJTkNYCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICBFTkQgSUYKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgSTMsICcsIEFQLCAnLAorICAgICAkICAgICAgJ1gsJywgSTIsICcpICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnIEEsJywgSTMsICcsIFgsJywgSTIsICcpICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBLCcsCisgICAgICQgICAgICBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLNCggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBER0VSLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIEhBTEYgPSAwLjVEMCwgT05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElNLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgTEFBLCBMREEsIExEQVMsIExYLCBMWSwgTSwgTVMsIE4sIE5BUkdTLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5DLCBORCwgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBOVUxMLCBSRVNFVCwgU0FNRQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVyggMSApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgREdFUiwgRE1BS0UsIERNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIE5BUkdTID0gOQorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREEgPSBNCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDEwMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE0sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE0gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBNLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE0vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE0vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA5MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE0gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBER0VSKCBNLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERVJFUyggJ0dFJywgJyAnLCBNLCBOLCBBUywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTSAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIE4gLSBKICsgMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1WQ0goICdOJywgTSwgMSwgQUxQSEEsIFosIE5NQVgsIFcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEoIDEsIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggMSArICggSiAtIDEgKSpMREEgKSwgRVBTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgIDcwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IgTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTUwCisqCisgIDEzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCBJMywgJywnICksIEY0LjEsICcsIFgsJywgSTIsCisgICAgICQgICAgICAnLCBZLCcsIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEs0LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEs1KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIERTWVIgYW5kIERTUFIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEcoIE5NQVggKSwgWCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhTKCBOTUFYKklOQ01BWCApLCBYWCggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZKCBOTUFYICksIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUMsIElOLCBJTkNYLCBJTkNYUywgSVgsIEosIEpBLCBKSiwgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTEosIExYLCBOLCBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVyggMSApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNVkNILCBEU1BSLCBEU1lSCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidZJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDcKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA2CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREEgPSBOCisgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTAwCisgICAgICAgICBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICBMQUEgPSAoIE4qKCBOICsgMSApICkvMgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRE8gOTAgSUMgPSAxLCAyCisgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwgQUJTKCBJTkNYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gNzAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5BTFBIQS5FUS5aRVJPCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorKgorKiAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBMREEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERTWVIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERTUFIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgQUEgKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLCBOLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIE4gLSBJICsgMSApCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBKQSA9IDEKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBaKCBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggJ04nLCBMSiwgMSwgQUxQSEEsIFooIEpKICksIExKLCBXLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgT05FLCBBKCBKSiwgSiApLCAxLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBKCBKQSApLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExKCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgaWYgTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgSUYoIE4uTEUuMCApCisgICAgICQgICAgICAgICAgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsIExEQQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEs1LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEs2KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIERTWVIyIGFuZCBEU1BSMi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBIQUxGID0gMC41RDAsIE9ORSA9IDEuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgRyggTk1BWCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVgsIDIgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQywgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLCBJTkNZUywgSVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgSVksIEosIEpBLCBKSiwgTEFBLCBMREEsIExEQVMsIExKLCBMWCwgTFksIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUsIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFcoIDIgKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERNQUtFLCBETVZDSCwgRFNQUjIsIERTWVIyCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidZJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDkKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA4CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDE0MCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREEgPSBOCisgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTQwCisgICAgICAgICBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICBMQUEgPSAoIE4qKCBOICsgMSApICkvMgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRE8gMTMwIElDID0gMSwgMgorICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgIERPIDEyMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyAxMTAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBZKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFlZKCAxICsgQUJTKCBJTkNZICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuQUxQSEEuRVEuWkVSTworKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQUEsIExEQSwgTiAtIDEsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNZUjIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNQUjIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREVSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMsIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5QQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTYwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMSApID0gWCggTiAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNZLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBJICkKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMiApID0gWSggTiAtIEkgKyAxICkKKyAgIDgwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFooIEosIDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMiApID0gWiggSiwgMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1WQ0goICdOJywgTEosIDIsIEFMUEhBLCBaKCBKSiwgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgVywgMSwgT05FLCBBKCBKSiwgSiApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVQsIEcsIEFBKCBKQSApLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgIDkwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE3MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE2MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsCisgICAgICQgICAgICBJTkNZLCBMREEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBYLCcsCisgICAgICQgICAgICBJMiwgJywgWSwnLCBJMiwgJywgQVApICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBYLCcsCisgICAgICQgICAgICBJMiwgJywgWSwnLCBJMiwgJywgQSwnLCBJMywgJykgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLNi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLRSggSVNOVU0sIFNSTkFNVCwgTk9VVCApCisqCisqICBUZXN0cyB0aGUgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMiBCbGFzLgorKiAgUmVxdWlyZXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIGVycm9yLWhhbmRsaW5nIHJvdXRpbmUgWEVSQkxBLgorKiAgQUxQSEEsIEJFVEEsIEEsIFggYW5kIFkgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGRlZmluZWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJU05VTSwgTk9VVAorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBCRVRBCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCAxLCAxICksIFgoIDEgKSwgWSggMSApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENIS1hFUiwgREdCTVYsIERHRU1WLCBER0VSLCBEU0JNViwgRFNQTVYsIERTUFIsCisgICAgICQgICAgICAgICAgICAgICAgICAgRFNQUjIsIERTWU1WLCBEU1lSLCBEU1lSMiwgRFRCTVYsIERUQlNWLCBEVFBNViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBEVFBTViwgRFRSTVYsIERUUlNWCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgT0sgaXMgc2V0IHRvIC5GQUxTRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgb3IgYnkgQ0hLWEVSCisqICAgICBpZiBhbnl0aGluZyBpcyB3cm9uZy4KKyAgICAgIE9LID0gLlRSVUUuCisqICAgICBMRVJSIGlzIHNldCB0byAuVFJVRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgZWFjaCB0aW1lCisqICAgICBpdCBpcyBjYWxsZWQsIGFuZCBpcyB0aGVuIHRlc3RlZCBhbmQgcmUtc2V0IGJ5IENIS1hFUi4KKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAsIDEwMCwgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsCisgICAgICQgICAgICAgIDE2MCApSVNOVU0KKyAgIDEwIElORk9UID0gMQorICAgICAgQ0FMTCBER0VNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERHRU1WKCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERHRU1WKCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERHRU1WKCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgREdFTVYoICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgREdFTVYoICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgMjAgSU5GT1QgPSAxCisgICAgICBDQUxMIERHQk1WKCAnLycsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgREdCTVYoICdOJywgLTEsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgREdCTVYoICdOJywgMCwgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgREdCTVYoICdOJywgMCwgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdCTVYoICdOJywgMiwgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgREdCTVYoICdOJywgMCwgMCwgMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgREdCTVYoICdOJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgREdCTVYoICdOJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTWU1WKCAnLycsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZTVYoICdVJywgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFNZTVYoICdVJywgMiwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lNViggJ1UnLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBEU1lNViggJ1UnLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNCTVYoICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEU0JNViggJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU0JNViggJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBEU0JNViggJ1UnLCAwLCAxLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIERTQk1WKCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIERTQk1WKCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDUwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1BNViggJy8nLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTUE1WKCAnVScsIC0xLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERTUE1WKCAnVScsIDAsIEFMUEhBLCBBLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUk1WKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRSTVYoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFJNViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUk1WKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUk1WKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgRFRSTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgNzAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUQk1WKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRCTVYoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVEJNViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUQk1WKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUQk1WKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERUQk1WKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRCTVYoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgODAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUE1WKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRQTVYoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFBNViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUE1WKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERUUE1WKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDkwIElORk9UID0gMQorICAgICAgQ0FMTCBEVFJTViggJy8nLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERUUlNWKCAnVScsICcvJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFRSU1YoICdVJywgJ04nLCAnLycsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEVFJTViggJ1UnLCAnTicsICdOJywgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBEVFJTViggJ1UnLCAnTicsICdOJywgMiwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIERUUlNWKCAnVScsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTAwIElORk9UID0gMQorICAgICAgQ0FMTCBEVEJTViggJy8nLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERUQlNWKCAnVScsICcvJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFRCU1YoICdVJywgJ04nLCAnLycsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEVEJTViggJ1UnLCAnTicsICdOJywgLTEsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEVEJTViggJ1UnLCAnTicsICdOJywgMCwgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEVEJTViggJ1UnLCAnTicsICdOJywgMCwgMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUQlNWKCAnVScsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTEwIElORk9UID0gMQorICAgICAgQ0FMTCBEVFBTViggJy8nLCAnTicsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERUUFNWKCAnVScsICcvJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFRQU1YoICdVJywgJ04nLCAnLycsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEVFBTViggJ1UnLCAnTicsICdOJywgLTEsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEVFBTViggJ1UnLCAnTicsICdOJywgMCwgQSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDEyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgREdFUiggLTEsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgREdFUiggMCwgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdFUiggMCwgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBER0VSKCAwLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERHRVIoIDIsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTMwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1lSKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZUiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEU1lSKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUiggJ1UnLCAyLCBBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDE0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNQUiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTUFIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFNQUiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDE1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNZUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEU1lSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEU1lSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWVIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZUjIoICdVJywgMiwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTUFIyKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNQUjIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFNQUjIoICdVJywgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1BSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorICAxNzAgSUYoIE9LIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU1JOQU1UCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1UCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMnICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMgKioqKionLAorICAgICAkICAgICAgJyoqJyApCisqCisqICAgICBFbmQgb2YgRENIS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRE1BS0UoIFRZUEUsIFVQTE8sIERJQUcsIE0sIE4sIEEsIE5NQVgsIEFBLCBMREEsIEtMLAorICAgICAkICAgICAgICAgICAgICAgICAgS1UsIFJFU0VULCBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBIHdpdGhpbiB0aGUgYmFuZHdpZHRoCisqICBkZWZpbmVkIGJ5IEtMIGFuZCBLVS4KKyogIFN0b3JlcyB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBBQSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQKKyogIGJ5IHRoZSByb3V0aW5lLCB3aXRoIHVud2FudGVkIGVsZW1lbnRzIHNldCB0byByb2d1ZSB2YWx1ZS4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0dCJywgJ1NZJywgJ1NCJywgJ1NQJywgJ1RSJywgJ1RCJyBPUiAnVFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIE9ORSA9IDEuMEQwICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAtMS4wRDEwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLTCwgS1UsIExEQSwgTSwgTiwgTk1BWAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsICogKSwgQUEoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEkxLCBJMiwgSTMsIElCRUcsIElFTkQsIElPRkYsIEosIEtLCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgR0VOLCBMT1dFUiwgU1lNLCBUUkksIFVOSVQsIFVQUEVSCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBEQkVHCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgREJFRworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWCwgTUlOCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEdFTiA9IFRZUEUoIDE6IDEgKS5FUS4nRycKKyAgICAgIFNZTSA9IFRZUEUoIDE6IDEgKS5FUS4nUycKKyAgICAgIFRSSSA9IFRZUEUoIDE6IDEgKS5FUS4nVCcKKyAgICAgIFVQUEVSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ1UnCisgICAgICBMT1dFUiA9ICggU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidMJworICAgICAgVU5JVCA9IFRSSS5BTkQuRElBRy5FUS4nVScKKyoKKyogICAgIEdlbmVyYXRlIGRhdGEgaW4gYXJyYXkgQS4KKyoKKyAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICBETyAxMCBJID0gMSwgTQorICAgICAgICAgICAgSUYoIEdFTi5PUi4oIFVQUEVSLkFORC5JLkxFLkogKS5PUi4oIExPV0VSLkFORC5JLkdFLkogKSApCisgICAgICQgICAgICAgICAgVEhFTgorICAgICAgICAgICAgICAgSUYoICggSS5MRS5KLkFORC5KIC0gSS5MRS5LVSApLk9SLgorICAgICAkICAgICAgICAgICAgICggSS5HRS5KLkFORC5JIC0gSi5MRS5LTCApIClUSEVOCisgICAgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBEQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElGKCBJLk5FLkogKVRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIFRSSSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBBKCBKLCBKICkgKyBPTkUKKyAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IE9ORQorICAgMjAgQ09OVElOVUUKKyoKKyogICAgIFN0b3JlIGVsZW1lbnRzIGluIGFycmF5IEFTIGluIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHJvdXRpbmUuCisqCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nR0InIClUSEVOCisgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gNjAgSTEgPSAxLCBLVSArIDEgLSBKCisgICAgICAgICAgICAgICBBQSggSTEgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkyID0gSTEsIE1JTiggS0wgKyBLVSArIDEsIEtVICsgMSArIE0gLSBKICkKKyAgICAgICAgICAgICAgIEFBKCBJMiArICggSiAtIDEgKSpMREEgKSA9IEEoIEkyICsgSiAtIEtVIC0gMSwgSiApCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gODAgSTMgPSBJMiwgTERBCisgICAgICAgICAgICAgICBBQSggSTMgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTWScuT1IuVFlQRS5FUS4nVFInIClUSEVOCisgICAgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDEwMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTAwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgIDExMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTIwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDEyMCAgICAgICBDT05USU5VRQorICAxMzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NCJy5PUi5UWVBFLkVRLidUQicgKVRIRU4KKyAgICAgICAgIERPIDE3MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBLSyA9IEtMICsgMQorICAgICAgICAgICAgICAgSUJFRyA9IE1BWCggMSwgS0wgKyAyIC0gSiApCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wgKyAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSAyCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTUlOKCBLTCArIDEsIDEgKyBNIC0gSiApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE0MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTQwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSArIEogLSBLSywgSiApCisgIDE1MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTYwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE2MCAgICAgICBDT05USU5VRQorICAxNzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NQJy5PUi5UWVBFLkVRLidUUCcgKVRIRU4KKyAgICAgICAgIElPRkYgPSAwCisgICAgICAgICBETyAxOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTgwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBJT0ZGID0gSU9GRiArIDEKKyAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgIElGKCBJLkVRLkogKVRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBST0dVRQorICAgICAgICAgICAgICAgRU5EIElGCisgIDE4MCAgICAgICBDT05USU5VRQorICAxOTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRE1BS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRE1WQ0goIFRSQU5TLCBNLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgT05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBCRVRBLCBFUFMsIEVSUgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIElOQ1ksIE0sIE4sIE5NQVgsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgKiApLCBHKCAqICksIFgoICogKSwgWSggKiApLCBZVCggKiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSU5DWEwsIElOQ1lMLCBJWSwgSiwgSlgsIEtYLCBLWSwgTUwsIE5MCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVFJBTgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBTUVJUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU4gPSBUUkFOUy5FUS4nVCcuT1IuVFJBTlMuRVEuJ0MnCisgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgTUwgPSBOCisgICAgICAgICBOTCA9IE0KKyAgICAgIEVMU0UKKyAgICAgICAgIE1MID0gTQorICAgICAgICAgTkwgPSBOCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBJTkNYLkxULjAgKVRIRU4KKyAgICAgICAgIEtYID0gTkwKKyAgICAgICAgIElOQ1hMID0gLTEKKyAgICAgIEVMU0UKKyAgICAgICAgIEtYID0gMQorICAgICAgICAgSU5DWEwgPSAxCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBJTkNZLkxULjAgKVRIRU4KKyAgICAgICAgIEtZID0gTUwKKyAgICAgICAgIElOQ1lMID0gLTEKKyAgICAgIEVMU0UKKyAgICAgICAgIEtZID0gMQorICAgICAgICAgSU5DWUwgPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIENvbXB1dGUgZXhwZWN0ZWQgcmVzdWx0IGluIFlUIHVzaW5nIGRhdGEgaW4gQSwgWCBhbmQgWS4KKyogICAgIENvbXB1dGUgZ2F1Z2VzIGluIEcuCisqCisgICAgICBJWSA9IEtZCisgICAgICBETyAzMCBJID0gMSwgTUwKKyAgICAgICAgIFlUKCBJWSApID0gWkVSTworICAgICAgICAgRyggSVkgKSA9IFpFUk8KKyAgICAgICAgIEpYID0gS1gKKyAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICBETyAxMCBKID0gMSwgTkwKKyAgICAgICAgICAgICAgIFlUKCBJWSApID0gWVQoIElZICkgKyBBKCBKLCBJICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMoIEEoIEosIEkgKSpYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIERPIDIwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEksIEogKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUyggQSggSSwgSiApKlgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBZVCggSVkgKSA9IEFMUEhBKllUKCBJWSApICsgQkVUQSpZKCBJWSApCisgICAgICAgICBHKCBJWSApID0gQUJTKCBBTFBIQSApKkcoIElZICkgKyBBQlMoIEJFVEEqWSggSVkgKSApCisgICAgICAgICBJWSA9IElZICsgSU5DWUwKKyAgIDMwIENPTlRJTlVFCisqCisqICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICBFUlIgPSBaRVJPCisgICAgICBETyA0MCBJID0gMSwgTUwKKyAgICAgICAgIEVSUkkgPSBBQlMoIFlUKCBJICkgLSBZWSggMSArICggSSAtIDEgKSpBQlMoIElOQ1kgKSApICkvRVBTCisgICAgICAgICBJRiggRyggSSApLk5FLlpFUk8gKQorICAgICAkICAgICAgRVJSSSA9IEVSUkkvRyggSSApCisgICAgICAgICBFUlIgPSBNQVgoIEVSUiwgRVJSSSApCisgICAgICAgICBJRiggRVJSKlNRUlQoIEVQUyApLkdFLk9ORSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyA3MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAgNTAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDYwIEkgPSAxLCBNTAorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgWVQoIEkgKSwKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSwgWVQoIEkgKQorICAgICAgICAgRU5EIElGCisgICA2MCBDT05USU5VRQorKgorICAgNzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgIEVYUEVDVEVEIFJFU1VMVCAgIENPTVBVJywKKyAgICAgJCAgICAgICdURUQgUkVTVUxUJyApCisgOTk5OCBGT1JNQVQoIDFYLCBJNywgMkcxOC42ICkKKyoKKyogICAgIEVuZCBvZiBETVZDSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMREUoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExERSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMREUgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMREUuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTERFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ1NZJyBvciAnU1AnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTWScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgICAgTERFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExERVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExERVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBEQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQywgTUkKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgREJMRQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIERCRUcgPSBEQkxFKCBJIC0gNTAwICkvMTAwMS4wRDAKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERCRUcuCisqCisgICAgICBFTkQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gRERJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggLk5PVC5MRVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GT1QsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKiBJTExFR0FMIFZBTFVFIE9GIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgTk9UIEQnLAorICAgICAkICAgICAgJ0VURUNURUQgQlkgJywgQTYsICcgKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDSEtYRVIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWEVSQkxBKCBTUk5BTUUsIElORk8gKQorKgorKiAgVGhpcyBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgdG8gYmUgdXNlZCBvbmx5IGFzIHBhcnQgb2YKKyogIHRoZSB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMiBCTEFTCisqICByb3V0aW5lcy4KKyoKKyogIFhFUkJMQSAgaXMgYW4gZXJyb3IgaGFuZGxlciBmb3IgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcy4KKyoKKyogIEl0IGlzIGNhbGxlZCBieSB0aGUgTGV2ZWwgMiBCTEFTIHJvdXRpbmVzIGlmIGFuIGlucHV0IHBhcmFtZXRlciBpcworKiAgaW52YWxpZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk8KKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTUUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVCwgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBMRVJSID0gLlRSVUUuCisgICAgICBJRiggSU5GTy5ORS5JTkZPVCApVEhFTgorICAgICAgICAgSUYoIElORk9ULk5FLjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPLCBJTkZPVAorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUlORk8KKyAgICAgICAgIEVORCBJRgorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBTUk5BTUUuTkUuU1JOQU1UIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1FLCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LCAnIElOU1RFQUQnLAorICAgICAkICAgICAgJyBPRiAnLCBJMiwgJyAqKioqKioqJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIFNSTkFNRSA9ICcsIEE2LCAnIElOU1RFJywKKyAgICAgJCAgICAgICdBRCBPRiAnLCBBNiwgJyAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwKKyAgICAgJCAgICAgICcgKioqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFhFUkJMQQorKgorICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9kYmxhdDMuZGF0IGIvYmxhcy90ZXN0aW5nL2RibGF0My5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiYzJlNgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9kYmxhdDMuZGF0CkBAIC0wLDAgKzEsMjAgQEAKKydkYmxhdDMuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnZGJsYXQzLnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKzAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCiswLjAgMS4wIDEuMyAgICAgICBWQUxVRVMgT0YgQkVUQQorREdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2RibGF0My5mIGIvYmxhcy90ZXN0aW5nL2RibGF0My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzdjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvZGJsYXQzLmYKQEAgLTAsMCArMSwyODczIEBACisqPiBcYnJpZWYgXGIgREJMQVQzCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBQUk9HUkFNIERCTEFUMworKiAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBUZXN0IHByb2dyYW0gZm9yIHRoZSBET1VCTEUgUFJFQ0lTSU9OIExldmVsIDMgQmxhcy4KKyo+CisqPiBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE0IHJlY29yZHMKKyo+IG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDYgcmVjb3JkcworKj4gYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyo+IGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyo+IGZvbGxvd2luZyAyMCBsaW5lczoKKyo+ICdkYmxhdDMub3V0JyAgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKj4gNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqPiAnREJMQVQzLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqPiAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyo+IFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKj4gMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyo+IDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKj4gMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyo+IDAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqPiAwLjAgMS4wIDEuMyAgICAgICBWQUxVRVMgT0YgQkVUQQorKj4gREdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gRFRSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IERTWVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBEU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4KKyo+IEZ1cnRoZXIgRGV0YWlscworKj4gPT09PT09PT09PT09PT09CisqPgorKj4gU2VlOgorKj4KKyo+ICAgIERvbmdhcnJhIEouIEouLCBEdSBDcm96IEouIEouLCBEdWZmIEkuIFMuIGFuZCBIYW1tYXJsaW5nIFMuCisqPiAgICBBIFNldCBvZiBMZXZlbCAzIEJhc2ljIExpbmVhciBBbGdlYnJhIFN1YnByb2dyYW1zLgorKj4KKyo+ICAgIFRlY2huaWNhbCBNZW1vcmFuZHVtIE5vLjg4IChSZXZpc2lvbiAxKSwgTWF0aGVtYXRpY3MgYW5kCisqPiAgICBDb21wdXRlciBTY2llbmNlIERpdmlzaW9uLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnksIDk3MDAKKyo+ICAgIFNvdXRoIENhc3MgQXZlbnVlLCBBcmdvbm5lLCBJbGxpbm9pcyA2MDQzOSwgVVMuCisqPgorKj4gLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqPiAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqPiAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyo+ICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqPiAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyo+CisqPiAgICAxMC05LTAwOiAgQ2hhbmdlIFNUQVRVUz0nTkVXJyB0byAnVU5LTk9XTicgc28gdGhhdCB0aGUgdGVzdGVycworKj4gICAgICAgICAgICAgIGNhbiBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aG91dCBkZWxldGluZyBnZW5lcmF0ZWQKKyo+ICAgICAgICAgICAgICBvdXRwdXQgZmlsZXMgKHN1c2FuKQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgZG91YmxlX2JsYXNfdGVzdGluZworKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBQUk9HUkFNIERCTEFUMworKgorKiAgLS0gUmVmZXJlbmNlIEJMQVMgdGVzdCByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gUmVmZXJlbmNlIEJMQVMgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIEFwcmlsIDIwMTIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gNiApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIE9ORSA9IDEuMEQwICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JRE1BWCwgTkFMTUFYLCBOQkVNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JRE1BWCA9IDksIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTFRFU1RULCBSRVdJLCBTQU1FLCBTRkFUQUwsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgIFRTVEVSUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TQSwgVFJBTlNCCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVUCisgICAgICBDSEFSQUNURVIqMzIgICAgICAgU05BUFMsIFNVTU1SWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUEoIE5NQVgqTk1BWCApLCBBQiggTk1BWCwgMipOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxNQVggKSwgQVMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFcoIDIqTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklETUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTERFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERDSEsxLCBEQ0hLMiwgRENISzMsIERDSEs0LCBEQ0hLNSwgRENIS0UsIERNTUNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ0RHRU1NICcsICdEU1lNTSAnLCAnRFRSTU0gJywgJ0RUUlNNICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTWVJLICcsICdEU1lSMksnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzdW1tYXJ5IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNVTU1SWQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOT1VUCisgICAgICBPUEVOKCBOT1VULCBGSUxFID0gU1VNTVJZLCBTVEFUVVMgPSAnVU5LTk9XTicgKQorICAgICAgTk9VVEMgPSBOT1VUCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzbmFwc2hvdCBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTTkFQUworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOVFJBCisgICAgICBUUkFDRSA9IE5UUkEuR0UuMAorICAgICAgSUYoIFRSQUNFIClUSEVOCisgICAgICAgICBPUEVOKCBOVFJBLCBGSUxFID0gU05BUFMsIFNUQVRVUyA9ICdVTktOT1dOJyApCisgICAgICBFTkQgSUYKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHJld2luZGluZyBvZiB0aGUgc25hcHNob3QgZmlsZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApUkVXSQorICAgICAgUkVXSSA9IFJFV0kuQU5ELlRSQUNFCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyBzdG9wcGluZyBvbiBhbnkgZmFpbHVyZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU0ZBVEFMCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgZXhpdHMgYXJlIHRvIGJlIHRlc3RlZC4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVFNURVJSCisqICAgICBSZWFkIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgdGhlIHRlc3QgcmF0aW8KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVEhSRVNICisqCisqICAgICBSZWFkIGFuZCBjaGVjayB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHRlc3RzLgorKgorKiAgICAgVmFsdWVzIG9mIE4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklESU0KKyAgICAgIElGKCBOSURJTS5MVC4xLk9SLk5JRElNLkdULk5JRE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdOJywgTklETUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIERPIDEwIEkgPSAxLCBOSURJTQorICAgICAgICAgSUYoIElESU0oIEkgKS5MVC4wLk9SLklESU0oIEkgKS5HVC5OTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApTk1BWAorICAgICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgIDEwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODQgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyAyMCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICAyMCBDT05USU5VRQorICAgMzAgUkVBRCggTklOLCBGTVQgPSA5OTg4LCBFTkQgPSA2MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDQwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwIClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDUwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDMwCisqCisgICA2MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgRE1NQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEwMCBKID0gMSwgTgorICAgICAgICAgRE8gOTAgSSA9IDEsIE4KKyAgICAgICAgICAgIEFCKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgICA5MCAgICBDT05USU5VRQorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBKCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IEoKKyAgICAgICAgIEMoIEosIDEgKSA9IFpFUk8KKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMTAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDExMCBDT05USU5VRQorKiAgICAgQ0MgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIERNTUNIIENUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IERNTUNILgorICAgICAgVFJBTlNBID0gJ04nCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgRE1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMREUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOU0IgPSAnVCcKKyAgICAgIENBTEwgRE1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMREUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyAgICAgICAgIEFCKCBKLCBOTUFYICsgMSApID0gTiAtIEogKyAxCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IE4gLSBKICsgMQorICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgQ0MoIE4gLSBKICsgMSApID0gSiooICggSiArIDEgKSpKICkvMiAtCisgICAgICQgICAgICAgICAgICAgICAgICAgICAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisgICAgICBUUkFOU0EgPSAnVCcKKyAgICAgIFRSQU5TQiA9ICdOJworICAgICAgQ0FMTCBETU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExERSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdUJworICAgICAgQ0FMTCBETU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExERSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMDAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg3IClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgRENIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE1MCwgMTYwLCAxNjAsIDE3MCwgMTgwIClJU05VTQorKiAgICAgICAgICAgVGVzdCBER0VNTSwgMDEuCisgIDE0MCAgICAgICBDQUxMIERDSEsxKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgRFNZTU0sIDAyLgorICAxNTAgICAgICAgQ0FMTCBEQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IERUUk1NLCAwMywgRFRSU00sIDA0LgorICAxNjAgICAgICAgQ0FMTCBEQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQUIsCisgICAgICQgICAgICAgICAgICAgICAgICBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIENULCBHLCBDICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBEU1lSSywgMDUuCisgIDE3MCAgICAgICBDQUxMIERDSEs0KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgRFNZUjJLLCAwNi4KKyAgMTgwICAgICAgIENBTEwgRENISzUoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyoKKyAgMTkwICAgICAgIElGKCBGQVRBTC5BTkQuU0ZBVEFMICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIxMAorICAgICAgICAgRU5EIElGCisgIDIwMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODYgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIxMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTEgKQorKgorICAyMzAgQ09OVElOVUUKKyAgICAgIElGKCBUUkFDRSApCisgICAgICQgICBDTE9TRSAoIE5UUkEgKQorICAgICAgQ0xPU0UgKCBOT1VUICkKKyAgICAgIFNUT1AKKyoKKyA5OTk5IEZPUk1BVCggJyBST1VUSU5FUyBQQVNTIENPTVBVVEFUSU9OQUwgVEVTVFMgSUYgVEVTVCBSQVRJTyBJUyBMRVMnLAorICAgICAkICAgICAgJ1MgVEhBTicsIEY4LjIgKQorIDk5OTggRk9STUFUKCAnIFJFTEFUSVZFIE1BQ0hJTkUgUFJFQ0lTSU9OIElTIFRBS0VOIFRPIEJFJywgMVAsIEQ5LjEgKQorIDk5OTcgRk9STUFUKCAnIE5VTUJFUiBPRiBWQUxVRVMgT0YgJywgQSwgJyBJUyBMRVNTIFRIQU4gMSBPUiBHUkVBVEVSICcsCisgICAgICQgICAgICAnVEhBTiAnLCBJMiApCisgOTk5NiBGT1JNQVQoICcgVkFMVUUgT0YgTiBJUyBMRVNTIFRIQU4gMCBPUiBHUkVBVEVSIFRIQU4gJywgSTIgKQorIDk5OTUgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBET1VCTEUgUFJFQ0lTSU9OIExFVkVMIDMgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5NCBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkzIEZPUk1BVCggJyAgIEZPUiBBTFBIQSAgICAgICAgICAnLCA3RjYuMSApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywgN0Y2LjEgKQorIDk5OTEgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTkwIEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg5IEZPUk1BVCggJyBFUlJPUiBJTiBETU1DSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBETU1DSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlNBID0gJywgQTEsCisgICAgICQgICAgICAnIEFORCBUUkFOU0IgPSAnLCBBMSwgLycgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgJywKKyAgICAgJCAgICAgICdFUlIgPSAnLCBGMTIuMywgJy4nLCAvJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSAnLAorICAgICAkICAgICAgJ0FSSVRITUVUSUMgT1IgVEhFIENPTVBJTEVSLicsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICcsCisgICAgICQgICAgICAnKioqKioqKicgKQorIDk5ODggRk9STUFUKCBBNiwgTDIgKQorIDk5ODcgRk9STUFUKCAxWCwgQTYsICcgV0FTIE5PVCBURVNURUQnICkKKyA5OTg2IEZPUk1BVCggLycgRU5EIE9GIFRFU1RTJyApCisgOTk4NSBGT1JNQVQoIC8nICoqKioqKiogRkFUQUwgRVJST1IgLSBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODQgRk9STUFUKCAnIEVSUk9SLUVYSVRTIFdJTEwgTk9UIEJFIFRFU1RFRCcgKQorKgorKiAgICAgRW5kIG9mIERCTEFUMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLMSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBER0VNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNBLCBJQ0IsIElLLCBJTSwgSU4sIEssIEtTLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgTUEsIE1CLCBNUywgTiwgTkEsIE5BUkdTLCBOQiwgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU5BLCBUUkFOQgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5BUywgVFJBTkJTLCBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgREdFTU0sIERNQUtFLCBETU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTMKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDExMCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorICAgICAgICAgICAgRE8gOTAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElDQSA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSCggSUNBOiBJQ0EgKQorICAgICAgICAgICAgICAgICAgVFJBTkEgPSBUUkFOU0EuRVEuJ1QnLk9SLlRSQU5TQS5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOQSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIE1BID0gTQorICAgICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSUNCID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNCID0gSUNIKCBJQ0I6IElDQiApCisgICAgICAgICAgICAgICAgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBNQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5CID0gSworICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICAgICAgICBMREIgPSBNQgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDcwCisgICAgICAgICAgICAgICAgICAgICBMQkIgPSBMREIqTkIKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNQiwgTkIsIEIsIE5NQVgsIEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkFTID0gVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQlMgPSBUUkFOU0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywgQUxQSEEsIExEQSwgTERCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlNBLkVRLlRSQU5BUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TQi5FUS5UUkFOQlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExERVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgTk1BWCwgQ1QsIEcsIENDLCBMREMsIEVQUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcnJywgQTEsICcnJywnLAorICAgICAkICAgICAgMyggSTMsICcsJyApLCBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCcsIEY0LjEsICcsICcsCisgICAgICQgICAgICAnQywnLCBJMywgJykuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBEU1lNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNTLCBJQ1UsIElNLCBJTiwgTEFBLCBMQkIsIExDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLCBNUywgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgU0lERSwgU0lERVMsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIUywgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNTUNILCBEU1lNTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hTLydMUicvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTIKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEwMCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gOTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERDID0gTQorICAgICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDkwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERCID0gTQorICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDkwCisgICAgICAgICAgICBMQkIgPSBMREIqTgorKgorKiAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEIsIE5NQVgsIEJCLCBMREIsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgWkVSTyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1MgPSAxLCAyCisgICAgICAgICAgICAgICBTSURFID0gSUNIUyggSUNTOiBJQ1MgKQorICAgICAgICAgICAgICAgTEVGVCA9IFNJREUuRVEuJ0wnCisqCisgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBOQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgc3ltbWV0cmljIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ1NZJywgVVBMTywgJyAnLCBOQSwgTkEsIEEsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVVBMTywgTSwgTiwgQUxQSEEsIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERTWU1NKCBTSURFLCBVUExPLCBNLCBOLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREUoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTERFUkVTKCAnR0UnLCAnICcsIE0sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnTicsICdOJywgTSwgTiwgTSwgQUxQSEEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBCLCBOTUFYLCBCRVRBLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1QsIEcsIENDLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnTicsICdOJywgTSwgTiwgTiwgQUxQSEEsIEIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBLCBOTUFYLCBCRVRBLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1QsIEcsIENDLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEyMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIExEQSwKKyAgICAgJCAgIExEQiwgQkVUQSwgTERDCisqCisgIDEyMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsIEIsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAnLAorICAgICAkICAgICAgJyAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLMi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLMyggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBCLCBCQiwgQlMsIENULCBHLCBDICkKKyoKKyogIFRlc3RzIERUUk1NIGFuZCBEVFJTTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIE9ORSA9IDEuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENUKCBOTUFYICksIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQ0QsIElDUywgSUNULCBJQ1UsIElNLCBJTiwgSiwgTEFBLCBMQkIsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIE0sIE1TLCBOLCBOQSwgTkFSR1MsIE5DLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgU0lERSwgU0lERVMsIFRSQU5BUywgVFJBTlNBLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIUywgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERNQUtFLCBETU1DSCwgRFRSTU0sIERUUlNNCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvLCBJQ0hTLydMUicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTEKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyogICAgIFNldCB1cCB6ZXJvIG1hdHJpeCBmb3IgRE1NQ0guCisgICAgICBETyAyMCBKID0gMSwgTk1BWAorICAgICAgICAgRE8gMTAgSSA9IDEsIE5NQVgKKyAgICAgICAgICAgIEMoIEksIEogKSA9IFpFUk8KKyAgIDEwICAgIENPTlRJTlVFCisgICAyMCBDT05USU5VRQorKgorICAgICAgRE8gMTQwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyAxMzAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERCID0gTQorICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyAgICAgICAgICAgIE5VTEwgPSBNLkxFLjAuT1IuTi5MRS4wCisqCisgICAgICAgICAgICBETyAxMjAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gMTEwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNBID0gSUNIVCggSUNUOiBJQ1QgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSUNEID0gMSwgMgorICAgICAgICAgICAgICAgICAgICAgICAgRElBRyA9IElDSEQoIElDRDogSUNEICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdUUicsIFVQTE8sIERJQUcsIE5BLCBOQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIFJFU0VULCBaRVJPICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sIE4sIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERUUk1NKCBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBBTFBIQSwgQUEsIExEQSwgQkIsIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEVFJTTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gU0lERVMuRVEuU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBUUkFOQVMuRVEuVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gRElBR1MuRVEuRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExERSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREVSRVMoICdHRScsICcgJywgTSwgTiwgQlMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExEQlMuRVEuTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTU0nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1NQ0goIFRSQU5TQSwgJ04nLCBNLCBOLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEsIE5NQVgsIEIsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBDLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBCLCBOTUFYLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgYXBwcm94aW1hdGlvbiB0byBvcmlnaW5hbAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBCQiggSSArICggSiAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiggSSArICggSiAtIDEgKSpMREIgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiggSSwgSiApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSwgTk1BWCwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQywgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgTiwgQUxQSEEsIExEQSwgTERCCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgNCggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsIEIsJywgSTMsICcpICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLNCggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBEU1lSSy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgQkVUQSwgQkVUUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDVCwgSUNVLCBJSywgSU4sIEosIEpDLCBKSiwgSywgS1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEFBLCBMQ0MsIExEQSwgTERBUywgTERDLCBMRENTLCBMSiwgTUEsIE4sIE5BLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTiwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETUFLRSwgRE1NQ0gsIERTWVJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFQvJ05UQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTAKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREMgPSBOCisgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTAwCisgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgTlVMTCA9IE4uTEUuMAorKgorICAgICAgICAgRE8gOTAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgIERPIDgwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgIFRSQU5TID0gSUNIVCggSUNUOiBJQ1QgKQorICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEEsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnU1knLCBVUExPLCAnICcsIE4sIE4sIEMsIE5NQVgsIENDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgQUxQSEEsIExEQSwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEU1lSSyggVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TUy5FUS5UUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERFUkVTKCAnU1knLCBVUExPLCBOLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ1QnLCAnTicsIExKLCAxLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIDEsIEpKICksIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCAxLCBKICksIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnTicsICdUJywgTEosIDEsIEssIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggSkosIDEgKSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIEosIDEgKSwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDExMCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgTERBLCBCRVRBLCBMREMKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgRjQuMSwgJywgQSwnLCBJMywgJywnLCBGNC4xLCAnLCBDLCcsIEkzLCAnKSAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyoKKyogIFRlc3RzIERTWVIySy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIDIqTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxGICksIEFTKCBOTUFYKk5NQVggKSwgQkIoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFcoIDIqTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMsIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEpKQUIsCisgICAgICQgICAgICAgICAgICAgICAgICAgSywgS1MsIExBQSwgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERNQUtFLCBETU1DSCwgRFNZUjJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFQvJ05UQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTIKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEzMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREMgPSBOCisgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTMwCisgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgTlVMTCA9IE4uTEUuMAorKgorICAgICAgICAgRE8gMTIwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyAxMTAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBNQSA9IE4KKyAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiwgMipOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgIExEQiA9IExEQQorICAgICAgICAgICAgICAgTEJCID0gTEFBCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIoIEsgKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLKk5NQVggKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDEwMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gOTAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gODAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnU1knLCBVUExPLCAnICcsIE4sIE4sIEMsIE5NQVgsIENDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNZUjJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TUy5FUS5UUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExERSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREVSRVMoICdTWScsIFVQTE8sIE4sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBQiggKCBKIC0gMSApKjIqTk1BWCArIEsgKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gQUIoICggSiAtIDEgKSoyKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1NQ0goICdUJywgJ04nLCBMSiwgMSwgMipLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEFCKCBKSkFCICksIDIqTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcsIDIqTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBQiggKCBLICsgSSAtIDEgKSpOTUFYICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCAnTicsIExKLCAxLCAyKkssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQUIoIEpKICksIE5NQVgsIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJFVEEsIEMoIEpKLCBKICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDVCwgRywgQ0MoIEpDICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKQUIgPSBKSkFCICsgMipOTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgQ09OVElOVUUKKyoKKyAgMTMwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICBMREEsIExEQiwgQkVUQSwgTERDCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsIEIsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAnLAorICAgICAkICAgICAgJyAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLRSggSVNOVU0sIFNSTkFNVCwgTk9VVCApCisqCisqICBUZXN0cyB0aGUgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMyBCbGFzLgorKiAgUmVxdWlyZXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIGVycm9yLWhhbmRsaW5nIHJvdXRpbmUgWEVSQkxBLgorKiAgQSwgQiBhbmQgQyBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAzLTE5LTkyOiAgSW5pdGlhbGl6ZSBBTFBIQSBhbmQgQkVUQSAgKGVjYSkKKyogIDMtMTktOTI6ICBGaXggYXJndW1lbnQgMTIgaW4gY2FsbHMgdG8gU1NZTU0gd2l0aCBJTkZPVCA9IDkgIChlY2EpCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBPTkUsIFRXTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRDAsIFRXTyA9IDIuMEQwICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggMiwgMSApLCBCKCAyLCAxICksIEMoIDIsIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIERHRU1NLCBEU1lNTSwgRFNZUjJLLCBEU1lSSywgRFRSTU0sCisgICAgICQgICAgICAgICAgICAgICAgICAgRFRSU00KKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyoKKyogICAgIEluaXRpYWxpemUgQUxQSEEgYW5kIEJFVEEuCisqCisgICAgICBBTFBIQSA9IE9ORQorICAgICAgQkVUQSA9IFRXTworKgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERHRU1NKCAnLycsICdOJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBER0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgREdFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERHRU1NKCAnVCcsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBER0VNTSggJ04nLCAnTicsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERHRU1NKCAnTicsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ1QnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnTicsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ1QnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERHRU1NKCAnVCcsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUk1NKCAnLycsICdVJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJy8nLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUk1NKCAnTCcsICdVJywgJ04nLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBEVFJTTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERUUlNNKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEVFJTTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDcwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTWVJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBEU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZUjJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgICA3MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBETUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gLTEuMEQxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgREJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIERCRUcKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRS5FUS4nR0UnCisgICAgICBTWU0gPSBUWVBFLkVRLidTWScKKyAgICAgIFRSSSA9IFRZUEUuRVEuJ1RSJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBEQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisqICAgICAgICAgICAgICAgICBTZXQgc29tZSBlbGVtZW50cyB0byB6ZXJvCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4zLkFORC5KLkVRLk4vMiApCisgICAgICQgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBUUkkgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQSggSiwgSiApICsgT05FCisgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBPTkUKKyAgIDIwIENPTlRJTlVFCisqCisqICAgICBTdG9yZSBlbGVtZW50cyBpbiBhcnJheSBBUyBpbiBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZCBieSByb3V0aW5lLgorKgorICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBNCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEogLSAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IEogKyAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyA2MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDYwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA3MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgS0ssIEFMUEhBLCBBLCBMREEsIEIsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVEEsIEMsIExEQywgQ1QsIEcsIENDLCBMRENDLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEJFVEEsIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0ssIExEQSwgTERCLCBMREMsIExEQ0MsIE0sIE4sIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTERBLCAqICksIEIoIExEQiwgKiApLCBDKCBMREMsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTERDQywgKiApLCBDVCggKiApLCBHKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIFRSQU5BLCBUUkFOQgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBTUVJUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQsIG9uZSBjb2x1bW4gYXQgYSB0aW1lLCBpbiBDVCB1c2luZyBkYXRhCisqICAgICBpbiBBLCBCIGFuZCBDLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIERPIDEyMCBKID0gMSwgTgorKgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBaRVJPCisgICAgICAgICAgICBHKCBJICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIC5OT1QuVFJBTkEuQU5ELi5OT1QuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDMwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSSwgSyApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTKCBBKCBJLCBLICkgKSpBQlMoIEIoIEssIEogKSApCisgICAyMCAgICAgICAgICBDT05USU5VRQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIFRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyA1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSywgSSApICkqQUJTKCBCKCBLLCBKICkgKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTFNFIElGKCAuTk9ULlRSQU5BLkFORC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gNzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMoIEEoIEksIEsgKSApKkFCUyggQiggSiwgSyApICkKKyAgIDYwICAgICAgICAgIENPTlRJTlVFCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyA5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBKLCBLICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSywgSSApICkqQUJTKCBCKCBKLCBLICkgKQorICAgODAgICAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJID0gMSwgTQorICAgICAgICAgICAgQ1QoIEkgKSA9IEFMUEhBKkNUKCBJICkgKyBCRVRBKkMoIEksIEogKQorICAgICAgICAgICAgRyggSSApID0gQUJTKCBBTFBIQSApKkcoIEkgKSArIEFCUyggQkVUQSApKkFCUyggQyggSSwgSiApICkKKyAgMTAwICAgIENPTlRJTlVFCisqCisqICAgICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICAgICBFUlIgPSBaRVJPCisgICAgICAgICBETyAxMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIEVSUkkgPSBBQlMoIENUKCBJICkgLSBDQyggSSwgSiApICkvRVBTCisgICAgICAgICAgICBJRiggRyggSSApLk5FLlpFUk8gKQorICAgICAkICAgICAgICAgRVJSSSA9IEVSUkkvRyggSSApCisgICAgICAgICAgICBFUlIgPSBNQVgoIEVSUiwgRVJSSSApCisgICAgICAgICAgICBJRiggRVJSKlNRUlQoIEVQUyApLkdFLk9ORSApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDE1MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAxMzAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDE0MCBJID0gMSwgTQorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ1QoIEkgKSwgQ0MoIEksIEogKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIENDKCBJLCBKICksIENUKCBJICkKKyAgICAgICAgIEVORCBJRgorICAxNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUoKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gQ09NUFVURUQgUkVTVUxUIElTIExFU1MgVEhBTiBIQUwnLAorICAgICAkICAgICAgJ0YgQUNDVVJBVEUgKioqKioqKicsIC8nICAgICAgICAgICBFWFBFQ1RFRCBSRVNVTFQgICBDT01QVScsCisgICAgICQgICAgICAnVEVEIFJFU1VMVCcgKQorIDk5OTggRk9STUFUKCAxWCwgSTcsIDJHMTguNiApCisgOTk5NyBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisqCisqICAgICBFbmQgb2YgRE1NQ0guCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTERFKCBSSSwgUkosIExSICkKKyoKKyogIFRlc3RzIGlmIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExERSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMREUgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMREUuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTERFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJyBvciAnU1knLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICAgICBMREVSRVMgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDgwCisgICA3MCBDT05USU5VRQorICAgICAgTERFUkVTID0gLkZBTFNFLgorICAgODAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTERFUkVTLgorKgorICAgICAgRU5ECisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERCRUcoIFJFU0VUICkKKyoKKyogIEdlbmVyYXRlcyByYW5kb20gbnVtYmVycyB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBTYXZlIHN0YXRlbWVudCAuLgorICAgICAgU0FWRSAgICAgICAgICAgICAgIEksIElDLCBNSQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIERCRUcgPSAoIEkgLSA1MDAgKS8xMDAxLjBEMAorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgREJFRy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBERElGRiggWCwgWSApCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFgsIFkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRERJRkYgPSBYIC0gWQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRERJRkYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisqICBUZXN0cyB3aGV0aGVyIFhFUkJMQSBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3Igd2hlbiBpdCBzaG91bGQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDMgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDMgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk8KKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTUUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVCwgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBMRVJSID0gLlRSVUUuCisgICAgICBJRiggSU5GTy5ORS5JTkZPVCApVEhFTgorICAgICAgICAgSUYoIElORk9ULk5FLjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPLCBJTkZPVAorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUlORk8KKyAgICAgICAgIEVORCBJRgorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBTUk5BTUUuTkUuU1JOQU1UIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1FLCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LCAnIElOU1RFQUQnLAorICAgICAkICAgICAgJyBPRiAnLCBJMiwgJyAqKioqKioqJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIFNSTkFNRSA9ICcsIEE2LCAnIElOU1RFJywKKyAgICAgJCAgICAgICdBRCBPRiAnLCBBNiwgJyAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwKKyAgICAgJCAgICAgICcgKioqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFhFUkJMQQorKgorICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9ydW5ibGFzdGVzdC5zaCBiL2JsYXMvdGVzdGluZy9ydW5ibGFzdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmZhZjAxCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3J1bmJsYXN0ZXN0LnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9iYXNoCisKK2JsYWNrPSdcRVszMG0nCityZWQ9J1xFWzMxbScKK2dyZWVuPSdcRVszMm0nCit5ZWxsb3c9J1xFWzMzbScKK2JsdWU9J1xFWzM0bScKK21hZ2VudGE9J1xFWzM1bScKK2N5YW49J1xFWzM2bScKK3doaXRlPSdcRVszN20nCisKK2lmIFsgLWYgJDIgXTsgdGhlbgorICBkYXRhPSQyCisgIGlmIFsgLWYgJDEuc3VtbSBdOyB0aGVuIHJtICQxLnN1bW07IGZpCisgIGlmIFsgLWYgJDEuc25hcCBdOyB0aGVuIHJtICQxLnNuYXA7IGZpCitlbHNlCisgIGRhdGE9JDEKK2ZpCisKK2lmICEgLi8kMSA8ICRkYXRhID4gL2Rldi9udWxsIDI+IC5ydW50ZXN0LmxvZyA7IHRoZW4KKyAgZWNobyAtZSAgJHJlZCBUZXN0ICQxIGZhaWxlZDogJGJsYWNrCisgIGVjaG8gLWUgJGJsdWUKKyAgY2F0IC5ydW50ZXN0LmxvZworICBlY2hvIC1lICRibGFjaworICBleGl0IDEKK2Vsc2UKKyAgaWYgWyAtZiAkMS5zdW1tIF07IHRoZW4KKyAgICBpZiBbIGBncmVwICJGQVRBTCBFUlJPUiIgJDEuc3VtbSB8IHdjIC1sYCAtZ3QgMCBdOyB0aGVuCisgICAgICBlY2hvIC1lICAkcmVkICJUZXN0ICQxIGZhaWxlZCAoRkFUQUwgRVJST1IsIHJlYWQgdGhlIGZpbGUgJDEuc3VtbSBmb3IgZGV0YWlscykiICRibGFjaworICAgICAgZWNobyAtZSAkYmx1ZQorICAgICAgY2F0IC5ydW50ZXN0LmxvZworICAgICAgZWNobyAtZSAkYmxhY2sKKyAgICAgIGV4aXQgMTsKKyAgICBmaQorCisgICAgaWYgWyBgZ3JlcCAiRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyIgJDEuc3VtbSB8IHdjIC1sYCAtZ3QgMCBdOyB0aGVuCisgICAgICBlY2hvIC1lICAkcmVkICJUZXN0ICQxIGZhaWxlZCAoRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUywgcmVhZCB0aGUgZmlsZSAkMS5zdW1tIGZvciBkZXRhaWxzKSIgJGJsYWNrCisgICAgICBlY2hvIC1lICRibHVlCisgICAgICBjYXQgLnJ1bnRlc3QubG9nCisgICAgICBlY2hvIC1lICRibGFjaworICAgICAgZXhpdCAxOworICAgIGZpICAgICAgCisgIGZpCisgIGVjaG8gLWUgJGdyZWVuIFRlc3QgJDEgcGFzc2VkJGJsYWNrCitmaQpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3NibGF0MS5mIGIvYmxhcy90ZXN0aW5nL3NibGF0MS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTdjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQxLmYKQEAgLTAsMCArMSwxMDIxIEBACisqPiBcYnJpZWYgXGIgU0JMQVQxCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBQUk9HUkFNIFNCTEFUMQorKiAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiAgICBUZXN0IHByb2dyYW0gZm9yIHRoZSBSRUFMIExldmVsIDEgQkxBUy4KKyo+CisqPiAgICBCYXNlZCB1cG9uIHRoZSBvcmlnaW5hbCBCTEFTIHRlc3Qgcm91dGluZSB0b2dldGhlciB3aXRoOgorKj4gICAgRjA2RUFGIEV4YW1wbGUgUHJvZ3JhbSBUZXh0CisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBzaW5nbGVfYmxhc190ZXN0aW5nCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFBST0dSQU0gU0JMQVQxCisqCisqICAtLSBSZWZlcmVuY2UgQkxBUyB0ZXN0IHJvdXRpbmUgKHZlcnNpb24gMy40LjEpIC0tCisqICAtLSBSZWZlcmVuY2UgQkxBUyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBJQworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgQ0hFQ0swLCBDSEVDSzEsIENIRUNLMiwgQ0hFQ0szLCBIRUFERVIKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgIFNGQUMvOS43NjU2MjVFLTQvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KQorICAgICAgRE8gMjAgSUMgPSAxLCAxMworICAgICAgICAgSUNBU0UgPSBJQworICAgICAgICAgQ0FMTCBIRUFERVIKKyoKKyogICAgICAgIC4uIEluaXRpYWxpemUgIFBBU1MsICBJTkNYLCAgYW5kIElOQ1kgZm9yIGEgbmV3IGNhc2UuIC4uCisqICAgICAgICAuLiB0aGUgdmFsdWUgOTk5OSBmb3IgSU5DWCBvciBJTkNZIHdpbGwgYXBwZWFyIGluIHRoZSAuLgorKiAgICAgICAgLi4gZGV0YWlsZWQgIG91dHB1dCwgaWYgYW55LCBmb3IgY2FzZXMgIHRoYXQgZG8gbm90IGludm9sdmUgLi4KKyogICAgICAgIC4uIHRoZXNlIHBhcmFtZXRlcnMgLi4KKyoKKyAgICAgICAgIFBBU1MgPSAuVFJVRS4KKyAgICAgICAgIElOQ1ggPSA5OTk5CisgICAgICAgICBJTkNZID0gOTk5OQorICAgICAgICAgSUYgKElDQVNFLkVRLjMgLk9SLiBJQ0FTRS5FUS4xMSkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzAoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjcgLk9SLiBJQ0FTRS5FUS44IC5PUi4gSUNBU0UuRVEuOSAuT1IuCisgICAgICsgICAgICAgICAgICBJQ0FTRS5FUS4xMCkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzEoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjEgLk9SLiBJQ0FTRS5FUS4yIC5PUi4gSUNBU0UuRVEuNSAuT1IuCisgICAgICsgICAgICAgICAgICBJQ0FTRS5FUS42IC5PUi4gSUNBU0UuRVEuMTIgLk9SLiBJQ0FTRS5FUS4xMykgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzIoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjQpIFRIRU4KKyAgICAgICAgICAgIENBTEwgQ0hFQ0szKFNGQUMpCisgICAgICAgICBFTkQgSUYKKyogICAgICAgIC0tIFByaW50CisgICAgICAgICBJRiAoUEFTUykgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCBDT05USU5VRQorICAgICAgU1RPUAorKgorOTk5OTkgRk9STUFUICgnIFJlYWwgQkxBUyBUZXN0IFByb2dyYW0gUmVzdWx0cycsLzFYKQorOTk5OTggRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0gUEFTUyAtLS0tLScpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSEVBREVSCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ0hBUkFDVEVSKjYgICAgICBMKDEzKQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxKS8nIFNET1QgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgyKS8nU0FYUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgzKS8nU1JPVEcgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg0KS8nIFNST1QgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg1KS8nU0NPUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg2KS8nU1NXQVAgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg3KS8nU05STTIgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg4KS8nU0FTVU0gJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg5KS8nU1NDQUwgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMCkvJ0lTQU1BWCcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMTEpLydTUk9UTUcnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDEyKS8nU1JPVE0gJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMykvJ1NEU0RPVCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KSBJQ0FTRSwgTChJQ0FTRSkKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgvJyBUZXN0IG9mIHN1YnByb2dyYW0gbnVtYmVyJyxJMywxMlgsQTYpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0swKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBEMTIsIFNBLCBTQiwgU0MsIFNTCisgICAgICBJTlRFR0VSICAgICAgICAgICBJLCBLCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIERBMSg4KSwgREFUUlVFKDgpLCBEQjEoOCksIERCVFJVRSg4KSwgREMxKDgpLAorICAgICArICAgICAgICAgICAgICAgICAgRFMxKDgpLCBEQUIoNCw5KSwgRFRFTVAoOSksIERUUlVFKDksOSkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTUk9URywgU1JPVE1HLCBTVEVTVDEKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgREExLzAuM0UwLCAwLjRFMCwgLTAuM0UwLCAtMC40RTAsIC0wLjNFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQjEvMC40RTAsIDAuM0UwLCAwLjRFMCwgMC4zRTAsIC0wLjRFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjBFMCwgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQzEvMC42RTAsIDAuOEUwLCAtMC42RTAsIDAuOEUwLCAwLjZFMCwgMS4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEUzEvMC44RTAsIDAuNkUwLCAwLjhFMCwgLTAuNkUwLCAwLjhFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjBFMCwgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQVRSVUUvMC41RTAsIDAuNUUwLCAwLjVFMCwgLTAuNUUwLCAtMC41RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAsIDEuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgREJUUlVFLzAuMEUwLCAwLjZFMCwgMC4wRTAsIC0wLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAsIDAuMEUwLworKiAgICAgSU5QVVQgRk9SIE1PRElGSUVEIEdJVkVOUworICAgICAgREFUQSBEQUIvIC4xRTAsLjNFMCwxLjJFMCwuMkUwLAorICAgICBBICAgICAgICAgIC43RTAsIC4yRTAsIC42RTAsIDQuMkUwLAorICAgICBCICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEMgICAgICAgICAgNC5FMCwgLTEuRTAsIDIuRTAsIDQuRTAsCisgICAgIEQgICAgICAgICAgNi5FLTEwLCAyLkUtMiwgMS5FNSwgMTAuRTAsCisgICAgIEUgICAgICAgICAgNC5FMTAsIDIuRS0yLCAxLkUtNSwgMTAuRTAsCisgICAgIEYgICAgICAgICAgMi5FLTEwLCA0LkUtMiwgMS5FNSwgMTAuRTAsCisgICAgIEcgICAgICAgICAgMi5FMTAsIDQuRS0yLCAxLkUtNSwgMTAuRTAsCisgICAgIEggICAgICAgICAgNC5FMCwgLTIuRTAsIDguRTAsIDQuRTAgICAgLworKiAgICBUUlVFIFJFU1VMVFMgRk9SIE1PRElGSUVEIEdJVkVOUworICAgICAgREFUQSBEVFJVRS8wLkUwLDAuRTAsIDEuM0UwLCAuMkUwLCAwLkUwLDAuRTAsMC5FMCwgLjVFMCwgMC5FMCwKKyAgICAgQSAgICAgICAgICAgMC5FMCwwLkUwLCA0LjVFMCwgNC4yRTAsIDEuRTAsIC41RTAsIDAuRTAsMC5FMCwwLkUwLAorICAgICBCICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLCAtMi5FMCwgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQyAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsIDQuRTAsIC0xLkUwLCAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBEICAgICAgICAgICAwLkUwLCAxNS5FLTMsIDAuRTAsIDEwLkUwLCAtMS5FMCwgMC5FMCwgLTEuRS00LAorICAgICBFICAgICAgICAgICAwLkUwLCAxLkUwLAorICAgICBGICAgICAgICAgICAwLkUwLDAuRTAsIDYxNDQuRS01LCAxMC5FMCwgLTEuRTAsIDQwOTYuRTAsIC0xLkU2LAorICAgICBHICAgICAgICAgICAwLkUwLCAxLkUwLAorICAgICBIICAgICAgICAgICAwLkUwLDAuRTAsMTUuRTAsMTAuRTAsLTEuRTAsIDUuRS01LCAwLkUwLDEuRTAsMC5FMCwKKyAgICAgSSAgICAgICAgICAgMC5FMCwwLkUwLCAxNS5FMCwgMTAuRTAsIC0xLiBFMCwgNS5FNSwgLTQwOTYuRTAsCisgICAgIEogICAgICAgICAgIDEuRTAsIDQwOTYuRS02LAorICAgICBLICAgICAgICAgICAwLkUwLDAuRTAsIDcuRTAsIDQuRTAsIDAuRTAsMC5FMCwgLS41RTAsIC0uMjVFMCwgMC5FMC8KKyogICAgICAgICAgICAgICAgICAgNDA5NiA9IDIgKiogMTIKKyAgICAgIERBVEEgRDEyICAvNDA5Ni5FMC8KKyAgICAgIERUUlVFKDEsMSkgPSAxMi5FMCAvIDEzMC5FMAorICAgICAgRFRSVUUoMiwxKSA9IDM2LkUwIC8gMTMwLkUwCisgICAgICBEVFJVRSg3LDEpID0gLTEuRTAgLyA2LkUwCisgICAgICBEVFJVRSgxLDIpID0gMTQuRTAgLyA3NS5FMAorICAgICAgRFRSVUUoMiwyKSA9IDQ5LkUwIC8gNzUuRTAKKyAgICAgIERUUlVFKDksMikgPSAxLkUwIC8gNy5FMAorICAgICAgRFRSVUUoMSw1KSA9IDQ1LkUtMTEgKiAoRDEyICogRDEyKQorICAgICAgRFRSVUUoMyw1KSA9IDQuRTUgLyAoMy5FMCAqIEQxMikKKyAgICAgIERUUlVFKDYsNSkgPSAxLkUwIC8gRDEyCisgICAgICBEVFJVRSg4LDUpID0gMS5FNCAvICgzLkUwICogRDEyKQorICAgICAgRFRSVUUoMSw2KSA9IDQuRTEwIC8gKDEuNUUwICogRDEyICogRDEyKQorICAgICAgRFRSVUUoMiw2KSA9IDIuRS0yIC8gMS41RTAKKyAgICAgIERUUlVFKDgsNikgPSA1LkUtNyAqIEQxMgorICAgICAgRFRSVUUoMSw3KSA9IDQuRTAgLyAxNTAuRTAKKyAgICAgIERUUlVFKDIsNykgPSAoMi5FLTEwIC8gMS41RTApICogKEQxMiAqIEQxMikKKyAgICAgIERUUlVFKDcsNykgPSAtRFRSVUUoNiw1KQorICAgICAgRFRSVUUoOSw3KSA9IDEuRTQgLyBEMTIKKyAgICAgIERUUlVFKDEsOCkgPSBEVFJVRSgxLDcpCisgICAgICBEVFJVRSgyLDgpID0gMi5FMTAgLyAoMS41RTAgKiBEMTIgKiBEMTIpCisgICAgICBEVFJVRSgxLDkpID0gMzIuRTAgLyA3LkUwCisgICAgICBEVFJVRSgyLDkpID0gLTE2LkUwIC8gNy5FMAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBDb21wdXRlIHRydWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBwcmVzdG9yZWQKKyogICAgIGluIGRlY2ltYWwgbm90YXRpb24KKyoKKyAgICAgIERCVFJVRSgxKSA9IDEuMEUwLzAuNkUwCisgICAgICBEQlRSVUUoMykgPSAtMS4wRTAvMC42RTAKKyAgICAgIERCVFJVRSg1KSA9IDEuMEUwLzAuNkUwCisqCisgICAgICBETyAyMCBLID0gMSwgOAorKiAgICAgICAgLi4gU2V0IE49SyBmb3IgaWRlbnRpZmljYXRpb24gaW4gb3V0cHV0IGlmIGFueSAuLgorICAgICAgICAgTiA9IEsKKyAgICAgICAgIElGIChJQ0FTRS5FUS4zKSBUSEVOCisqICAgICAgICAgICAuLiBTUk9URyAuLgorICAgICAgICAgICAgSUYgKEsuR1QuOCkgR08gVE8gNDAKKyAgICAgICAgICAgIFNBID0gREExKEspCisgICAgICAgICAgICBTQiA9IERCMShLKQorICAgICAgICAgICAgQ0FMTCBTUk9URyhTQSxTQixTQyxTUykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNBLERBVFJVRShLKSxEQVRSVUUoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNCLERCVFJVRShLKSxEQlRSVUUoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNDLERDMShLKSxEQzEoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNTLERTMShLKSxEUzEoSyksU0ZBQykKKyAgICAgICAgIEVMU0VJRiAoSUNBU0UuRVEuMTEpIFRIRU4KKyogICAgICAgICAgIC4uIFNST1RNRyAuLgorICAgICAgICAgICAgRE8gST0xLDQKKyAgICAgICAgICAgICAgIERURU1QKEkpPSBEQUIoSSxLKQorICAgICAgICAgICAgICAgRFRFTVAoSSs0KSA9IDAuMAorICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBEVEVNUCg5KSA9IDAuMAorICAgICAgICAgICAgQ0FMTCBTUk9UTUcoRFRFTVAoMSksRFRFTVAoMiksRFRFTVAoMyksRFRFTVAoNCksRFRFTVAoNSkpCisgICAgICAgICAgICBDQUxMIFNURVNUKDksRFRFTVAsRFRSVUUoMSxLKSxEVFJVRSgxLEspLFNGQUMpCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzAnCisgICAgICAgICAgICBTVE9QCisgICAgICAgICBFTkQgSUYKKyAgIDIwIENPTlRJTlVFCisgICA0MCBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzEoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIExFTiwgTlAxCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIERUUlVFMSg1KSwgRFRSVUUzKDUpLCBEVFJVRTUoOCw1LDIpLCBEVig4LDUsMiksCisgICAgICsgICAgICAgICAgICAgICAgICBTQSgxMCksIFNURU1QKDEpLCBTVFJVRSg4KSwgU1goOCkKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElUUlVFMig1KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQVNVTSwgU05STTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElTQU1BWAorICAgICAgRVhURVJOQUwgICAgICAgICAgU0FTVU0sIFNOUk0yLCBJU0FNQVgKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBJVEVTVDEsIFNTQ0FMLCBTVEVTVCwgU1RFU1QxCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBNQVgKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgU0EvMC4zRTAsIC0xLjBFMCwgMC4wRTAsIDEuMEUwLCAwLjNFMCwgMC4zRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjNFMCwgMC4zRTAsIDAuM0UwLCAwLjNFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERWLzAuMUUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAyLjBFMCwgMi4wRTAsIDAuM0UwLCAzLjBFMCwgMy4wRTAsIDMuMEUwLCAzLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDMuMEUwLCAzLjBFMCwgMy4wRTAsIDAuM0UwLCAtMC40RTAsIDQuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgNC4wRTAsIDQuMEUwLCA0LjBFMCwgNC4wRTAsIDQuMEUwLCAwLjJFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjZFMCwgMC4zRTAsIDUuMEUwLCA1LjBFMCwgNS4wRTAsIDUuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgNS4wRTAsIDAuMUUwLCAtMC4zRTAsIDAuNUUwLCAtMC4xRTAsIDYuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgNi4wRTAsIDYuMEUwLCA2LjBFMCwgMC4xRTAsIDguMEUwLCA4LjBFMCwgOC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA4LjBFMCwgOC4wRTAsIDguMEUwLCA4LjBFMCwgMC4zRTAsIDkuMEUwLCA5LjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDkuMEUwLCA5LjBFMCwgOS4wRTAsIDkuMEUwLCA5LjBFMCwgMC4zRTAsIDIuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjJFMCwgMy4wRTAsIC0wLjZFMCwgNS4wRTAsIDAuM0UwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEUwLCAyLjBFMCwgMC4xRTAsIDQuMEUwLCAtMC4zRTAsIDYuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNUUwLCA3LjBFMCwgLTAuMUUwLCAzLjBFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUUlVFMS8wLjBFMCwgMC4zRTAsIDAuNUUwLCAwLjdFMCwgMC42RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVFJVRTMvMC4wRTAsIDAuM0UwLCAwLjdFMCwgMS4xRTAsIDEuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFRSVUU1LzAuMTBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAyLjBFMCwgMi4wRTAsIDIuMEUwLCAtMC4zRTAsIDMuMEUwLCAzLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDMuMEUwLCAzLjBFMCwgMy4wRTAsIDMuMEUwLCAzLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgNC4wRTAsIDQuMEUwLCA0LjBFMCwgNC4wRTAsIDQuMEUwLCA0LjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMjBFMCwgLTAuNjBFMCwgMC4zMEUwLCA1LjBFMCwgNS4wRTAsIDUuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgNS4wRTAsIDUuMEUwLCAwLjAzRTAsIC0wLjA5RTAsIDAuMTVFMCwgLTAuMDNFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDYuMEUwLCA2LjBFMCwgNi4wRTAsIDYuMEUwLCAwLjEwRTAsIDguMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgOC4wRTAsIDguMEUwLCA4LjBFMCwgOC4wRTAsIDguMEUwLCA4LjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDlFMCwgOS4wRTAsIDkuMEUwLCA5LjBFMCwgOS4wRTAsIDkuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgOS4wRTAsIDkuMEUwLCAwLjA5RTAsIDIuMEUwLCAtMC4xMkUwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAwLjA2RTAsIDMuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMThFMCwgNS4wRTAsIDAuMDlFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDNFMCwgNC4wRTAsIC0wLjA5RTAsIDYuMEUwLCAtMC4xNUUwLCA3LjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjAzRTAsIDMuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgSVRSVUUyLzAsIDEsIDIsIDIsIDMvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDgwIElOQ1ggPSAxLCAyCisgICAgICAgICBETyA2MCBOUDEgPSAxLCA1CisgICAgICAgICAgICBOID0gTlAxIC0gMQorICAgICAgICAgICAgTEVOID0gMipNQVgoTiwxKQorKiAgICAgICAgICAgLi4gU2V0IHZlY3RvciBhcmd1bWVudHMgLi4KKyAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMRU4KKyAgICAgICAgICAgICAgIFNYKEkpID0gRFYoSSxOUDEsSU5DWCkKKyAgIDIwICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuNykgVEhFTgorKiAgICAgICAgICAgICAgLi4gU05STTIgLi4KKyAgICAgICAgICAgICAgIFNURU1QKDEpID0gRFRSVUUxKE5QMSkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKFNOUk0yKE4sU1gsSU5DWCksU1RFTVAoMSksU1RFTVAsU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjgpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNBU1VNIC4uCisgICAgICAgICAgICAgICBTVEVNUCgxKSA9IERUUlVFMyhOUDEpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShTQVNVTShOLFNYLElOQ1gpLFNURU1QKDEpLFNURU1QLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS45KSBUSEVOCisqICAgICAgICAgICAgICAuLiBTU0NBTCAuLgorICAgICAgICAgICAgICAgQ0FMTCBTU0NBTChOLFNBKChJTkNYLTEpKjUrTlAxKSxTWCxJTkNYKQorICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIExFTgorICAgICAgICAgICAgICAgICAgU1RSVUUoSSkgPSBEVFJVRTUoSSxOUDEsSU5DWCkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTixTWCxTVFJVRSxTVFJVRSxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMTApIFRIRU4KKyogICAgICAgICAgICAgIC4uIElTQU1BWCAuLgorICAgICAgICAgICAgICAgQ0FMTCBJVEVTVDEoSVNBTUFYKE4sU1gsSU5DWCksSVRSVUUyKE5QMSkpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzEnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyAgIDYwICAgIENPTlRJTlVFCisgICA4MCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0syKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQQorICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgSiwgS0ksIEtOLCBLTkksIEtQQVIsIEtTSVpFLCBMRU5YLCBMRU5ZLAorICAgICAkICAgICAgICAgICAgICAgICAgTVgsIE1ZIAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBEVDEwWCg3LDQsNCksIERUMTBZKDcsNCw0KSwgRFQ3KDQsNCksCisgICAgICQgICAgICAgICAgICAgICAgICBEVDgoNyw0LDQpLCBEWDEoNyksCisgICAgICQgICAgICAgICAgICAgICAgICBEWTEoNyksIFNTSVpFMSg0KSwgU1NJWkUyKDE0LDIpLCBTU0laRTMoNCksCisgICAgICQgICAgICAgICAgICAgICAgICBTU0laRSg3KSwgU1RYKDcpLCBTVFkoNyksIFNYKDcpLCBTWSg3KSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIERQQVIoNSw0KSwgRFQxOVgoNyw0LDE2KSxEVDE5WEEoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVhCKDcsNCw0KSwgRFQxOVhDKDcsNCw0KSxEVDE5WEQoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVkoNyw0LDE2KSwgRFQxOVlBKDcsNCw0KSxEVDE5WUIoNyw0LDQpLAorICAgICAkICAgICAgICAgICAgICAgICAgRFQxOVlDKDcsNCw0KSwgRFQxOVlEKDcsNCw0KSwgRFRFTVAoNSksCisgICAgICQgICAgICAgICAgICAgICAgICBTVDdCKDQsNCkKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTRE9ULCBTRFNET1QKKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNET1QsIFNEU0RPVAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNBWFBZLCBTQ09QWSwgU1JPVE0sIFNTV0FQLCBTVEVTVCwgU1RFU1QxCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBFUVVJVkFMRU5DRSAoRFQxOVgoMSwxLDEpLERUMTlYQSgxLDEsMSkpLChEVDE5WCgxLDEsNSksCisgICAgIEEgICBEVDE5WEIoMSwxLDEpKSwoRFQxOVgoMSwxLDkpLERUMTlYQygxLDEsMSkpLAorICAgICBCICAgKERUMTlYKDEsMSwxMyksRFQxOVhEKDEsMSwxKSkKKyAgICAgIEVRVUlWQUxFTkNFIChEVDE5WSgxLDEsMSksRFQxOVlBKDEsMSwxKSksKERUMTlZKDEsMSw1KSwKKyAgICAgQSAgIERUMTlZQigxLDEsMSkpLChEVDE5WSgxLDEsOSksRFQxOVlDKDEsMSwxKSksCisgICAgIEIgICAoRFQxOVkoMSwxLDEzKSxEVDE5WUQoMSwxLDEpKQorCisgICAgICBEQVRBICAgICAgICAgICAgICBTQS8wLjNFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWDEvMC42RTAsIDAuMUUwLCAtMC41RTAsIDAuOEUwLCAwLjlFMCwgLTAuM0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFkxLzAuNUUwLCAtMC45RTAsIDAuM0UwLCAwLjdFMCwgLTAuNkUwLCAwLjJFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuOEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ3LzAuMEUwLCAwLjMwRTAsIDAuMjFFMCwgMC42MkUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMzBFMCwgLTAuMDdFMCwgMC44NUUwLCAwLjBFMCwgMC4zMEUwLCAtMC43OUUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNzRFMCwgMC4wRTAsIDAuMzBFMCwgMC4zM0UwLCAxLjI3RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTVDdCLyAuMSwgLjQsIC4zMSwgLjcyLCAgICAgLjEsIC40LCAuMDMsIC45NSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC4xLCAuNCwgLS42OSwgLS42NCwgICAuMSwgLjQsIC40MywgMS4zNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUOC8wLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNjhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNjhFMCwgLTAuODdFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC42OEUwLCAtMC44N0UwLCAwLjE1RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjk0RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNUUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC42OEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMzVFMCwgLTAuOUUwLCAwLjQ4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4zOEUwLCAtMC45RTAsIDAuNTdFMCwgMC43RTAsIC0wLjc1RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjJFMCwgMC45OEUwLCAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNjhFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMzVFMCwgLTAuNzJFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4zOEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNjNFMCwgMC4xNUUwLCAwLjg4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNjhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNjhFMCwgLTAuOUUwLCAwLjMzRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC42OEUwLCAtMC45RTAsIDAuMzNFMCwgMC43RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC43NUUwLCAwLjJFMCwgMS4wNEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQxMFgvMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNUUwLCAtMC45RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNUUwLCAtMC45RTAsIDAuM0UwLCAwLjdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjNFMCwgMC4xRTAsIDAuNUUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuOEUwLCAwLjFFMCwgLTAuNkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC44RTAsIDAuM0UwLCAtMC4zRTAsIDAuNUUwLCAwLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNUUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgLTAuOUUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4xRTAsIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFFMCwgMC4zRTAsIDAuOEUwLCAtMC45RTAsIC0wLjNFMCwgMC41RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41RTAsIDAuM0UwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjVFMCwgMC4zRTAsIC0wLjZFMCwgMC44RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQxMFkvMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNkUwLCAwLjFFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC42RTAsIDAuMUUwLCAtMC41RTAsIDAuOEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIC0wLjVFMCwgLTAuOUUwLCAwLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAtMC40RTAsIC0wLjlFMCwgMC45RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjdFMCwgLTAuNUUwLCAwLjJFMCwgMC42RTAsIDAuNUUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC42RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAtMC41RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEUwLCAwLjlFMCwgLTAuNUUwLCAwLjZFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjZFMCwgLTAuOUUwLCAwLjFFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjZFMCwgLTAuOUUwLCAwLjFFMCwgMC43RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC41RTAsIDAuMkUwLCAwLjhFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMS8wLjBFMCwgMC4zRTAsIDEuNkUwLCAzLjJFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMi8wLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMy8gLjEsIC40LCAxLjcsIDMuMyAvCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIEZPUiBEUk9UTQorKgorICAgICAgREFUQSBEUEFSLy0yLkUwLCAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQSAgICAgICAgICAtMS5FMCwgIDIuRTAsIC0zLkUwLCAtNC5FMCwgIDUuRTAsCisgICAgIEIgICAgICAgICAgIDAuRTAsICAwLkUwLCAgMi5FMCwgLTMuRTAsICAwLkUwLAorICAgICBDICAgICAgICAgICAxLkUwLCAgNS5FMCwgIDIuRTAsICAwLkUwLCAtNC5FMC8KKyogICAgICAgICAgICAgICAgICAgICAgICBUUlVFIFggUkVTVUxUUyBGMFIgUk9UQVRJT05TIERST1RNCisgICAgICBEQVRBIERUMTlYQS8uNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBBICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQiAgICAgICAgICAgIC42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEMgICAgICAgICAgICAuNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBEICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRSAgICAgICAgICAgLS44RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEYgICAgICAgICAgIC0uOUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBHICAgICAgICAgICAzLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSCAgICAgICAgICAgIC42RTAsICAgLjFFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBJICAgICAgICAgICAtLjhFMCwgIDMuOEUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEogICAgICAgICAgIC0uOUUwLCAgMi44RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSyAgICAgICAgICAgMy41RTAsICAtLjRFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBMICAgICAgICAgICAgLjZFMCwgICAuMUUwLCAgLS41RTAsICAgLjhFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsCisgICAgIE0gICAgICAgICAgIC0uOEUwLCAgMy44RTAsIC0yLjJFMCwgLTEuMkUwLCAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwKKyAgICAgTiAgICAgICAgICAgLS45RTAsICAyLjhFMCwgLTEuNEUwLCAtMS4zRTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLAorICAgICBPICAgICAgICAgICAzLjVFMCwgIC0uNEUwLCAtMi4yRTAsICA0LjdFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAvCisqCisgICAgICBEQVRBIERUMTlYQi8uNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBBICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQiAgICAgICAgICAgIC42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEMgICAgICAgICAgICAuNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBEICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRSAgICAgICAgICAgLS44RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEYgICAgICAgICAgIC0uOUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBHICAgICAgICAgICAzLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSCAgICAgICAgICAgIC42RTAsICAgLjFFMCwgIC0uNUUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBJICAgICAgICAgICAwLkUwLCAgICAuMUUwLCAtMy4wRTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEogICAgICAgICAgIC0uM0UwLCAgIC4xRTAsIC0yLjBFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSyAgICAgICAgICAgMy4zRTAsICAgLjFFMCwgLTIuMEUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBMICAgICAgICAgICAgLjZFMCwgICAuMUUwLCAgLS41RTAsICAgLjhFMCwgICAuOUUwLCAgLS4zRTAsICAtLjRFMCwKKyAgICAgTSAgICAgICAgICAtMi4wRTAsICAgLjFFMCwgIDEuNEUwLCAgIC44RTAsICAgLjZFMCwgIC0uM0UwLCAtMi44RTAsCisgICAgIE4gICAgICAgICAgLTEuOEUwLCAgIC4xRTAsICAxLjNFMCwgICAuOEUwLCAgMC5FMCwgICAtLjNFMCwgLTEuOUUwLAorICAgICBPICAgICAgICAgICAzLjhFMCwgICAuMUUwLCAtMy4xRTAsICAgLjhFMCwgIDQuOEUwLCAgLS4zRTAsIC0xLjVFMCAvCisqCisgICAgICBEQVRBIERUMTlYQy8uNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBBICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQiAgICAgICAgICAgIC42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEMgICAgICAgICAgICAuNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBEICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRSAgICAgICAgICAgLS44RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEYgICAgICAgICAgIC0uOUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBHICAgICAgICAgICAzLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSCAgICAgICAgICAgIC42RTAsICAgLjFFMCwgIC0uNUUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBJICAgICAgICAgICA0LjhFMCwgICAuMUUwLCAtMy4wRTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEogICAgICAgICAgIDMuM0UwLCAgIC4xRTAsIC0yLjBFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSyAgICAgICAgICAgMi4xRTAsICAgLjFFMCwgLTIuMEUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBMICAgICAgICAgICAgLjZFMCwgICAuMUUwLCAgLS41RTAsICAgLjhFMCwgICAuOUUwLCAgLS4zRTAsICAtLjRFMCwKKyAgICAgTSAgICAgICAgICAtMS42RTAsICAgLjFFMCwgLTIuMkUwLCAgIC44RTAsICA1LjRFMCwgIC0uM0UwLCAtMi44RTAsCisgICAgIE4gICAgICAgICAgLTEuNUUwLCAgIC4xRTAsIC0xLjRFMCwgICAuOEUwLCAgMy42RTAsICAtLjNFMCwgLTEuOUUwLAorICAgICBPICAgICAgICAgICAzLjdFMCwgICAuMUUwLCAtMi4yRTAsICAgLjhFMCwgIDMuNkUwLCAgLS4zRTAsIC0xLjVFMCAvCisqCisgICAgICBEQVRBIERUMTlYRC8uNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBBICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQiAgICAgICAgICAgIC42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEMgICAgICAgICAgICAuNkUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBEICAgICAgICAgICAgLjZFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRSAgICAgICAgICAgLS44RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEYgICAgICAgICAgIC0uOUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBHICAgICAgICAgICAzLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSCAgICAgICAgICAgIC42RTAsICAgLjFFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBJICAgICAgICAgICAtLjhFMCwgLTEuMEUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEogICAgICAgICAgIC0uOUUwLCAgLS44RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSyAgICAgICAgICAgMy41RTAsICAgLjhFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBMICAgICAgICAgICAgLjZFMCwgICAuMUUwLCAgLS41RTAsICAgLjhFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsCisgICAgIE0gICAgICAgICAgIC0uOEUwLCAtMS4wRTAsICAxLjRFMCwgLTEuNkUwLCAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwKKyAgICAgTiAgICAgICAgICAgLS45RTAsICAtLjhFMCwgIDEuM0UwLCAtMS42RTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLAorICAgICBPICAgICAgICAgICAzLjVFMCwgICAuOEUwLCAtMy4xRTAsICA0LjhFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAvCisqICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSBZIFJFU1VMVFMgRk9SIFJPVEFUSU9OUyBEUk9UTQorICAgICAgREFUQSBEVDE5WUEvLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQSAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEIgICAgICAgICAgICAuNUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBDICAgICAgICAgICAgLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRCAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEUgICAgICAgICAgICAuN0UwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBGICAgICAgICAgICAxLjdFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRyAgICAgICAgICAtMi42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEggICAgICAgICAgICAuNUUwLCAgLS45RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSSAgICAgICAgICAgIC43RTAsIC00LjhFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBKICAgICAgICAgICAxLjdFMCwgIC0uN0UwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEsgICAgICAgICAgLTIuNkUwLCAgMy41RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgTCAgICAgICAgICAgIC41RTAsICAtLjlFMCwgICAuM0UwLCAgIC43RTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLAorICAgICBNICAgICAgICAgICAgLjdFMCwgLTQuOEUwLCAgMy4wRTAsICAxLjFFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsCisgICAgIE4gICAgICAgICAgIDEuN0UwLCAgLS43RTAsICAtLjdFMCwgIDIuM0UwLCAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwKKyAgICAgTyAgICAgICAgICAtMi42RTAsICAzLjVFMCwgIC0uN0UwLCAtMy42RTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLworKgorICAgICAgREFUQSBEVDE5WUIvLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQSAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEIgICAgICAgICAgICAuNUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBDICAgICAgICAgICAgLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRCAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEUgICAgICAgICAgICAuN0UwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBGICAgICAgICAgICAxLjdFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRyAgICAgICAgICAtMi42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEggICAgICAgICAgICAuNUUwLCAgLS45RTAsICAgLjNFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSSAgICAgICAgICAgNC4wRTAsICAtLjlFMCwgIC0uM0UwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBKICAgICAgICAgICAtLjVFMCwgIC0uOUUwLCAgMS41RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEsgICAgICAgICAgLTEuNUUwLCAgLS45RTAsIC0xLjhFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgTCAgICAgICAgICAgIC41RTAsICAtLjlFMCwgICAuM0UwLCAgIC43RTAsICAtLjZFMCwgICAuMkUwLCAgIC44RTAsCisgICAgIE0gICAgICAgICAgIDMuN0UwLCAgLS45RTAsIC0xLjJFMCwgICAuN0UwLCAtMS41RTAsICAgLjJFMCwgIDIuMkUwLAorICAgICBOICAgICAgICAgICAtLjNFMCwgIC0uOUUwLCAgMi4xRTAsICAgLjdFMCwgLTEuNkUwLCAgIC4yRTAsICAyLjBFMCwKKyAgICAgTyAgICAgICAgICAtMS42RTAsICAtLjlFMCwgLTIuMUUwLCAgIC43RTAsICAyLjlFMCwgICAuMkUwLCAtMy44RTAgLworKgorICAgICAgREFUQSBEVDE5WUMvLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQSAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEIgICAgICAgICAgICAuNUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBDICAgICAgICAgICAgLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRCAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEUgICAgICAgICAgICAuN0UwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBGICAgICAgICAgICAxLjdFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRyAgICAgICAgICAtMi42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEggICAgICAgICAgICAuNUUwLCAgLS45RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSSAgICAgICAgICAgNC4wRTAsIC02LjNFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBKICAgICAgICAgICAtLjVFMCwgICAuM0UwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEsgICAgICAgICAgLTEuNUUwLCAgMy4wRTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgTCAgICAgICAgICAgIC41RTAsICAtLjlFMCwgICAuM0UwLCAgIC43RTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLAorICAgICBNICAgICAgICAgICAzLjdFMCwgLTcuMkUwLCAgMy4wRTAsICAxLjdFMCwgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsCisgICAgIE4gICAgICAgICAgIC0uM0UwLCAgIC45RTAsICAtLjdFMCwgIDEuOUUwLCAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwKKyAgICAgTyAgICAgICAgICAtMS42RTAsICAyLjdFMCwgIC0uN0UwLCAtMy40RTAsICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLworKgorICAgICAgREFUQSBEVDE5WUQvLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgQSAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEIgICAgICAgICAgICAuNUUwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBDICAgICAgICAgICAgLjVFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRCAgICAgICAgICAgIC41RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEUgICAgICAgICAgICAuN0UwLCAgICAgICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBGICAgICAgICAgICAxLjdFMCwgICAgICAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgRyAgICAgICAgICAtMi42RTAsICAgICAgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEggICAgICAgICAgICAuNUUwLCAgLS45RTAsICAgLjNFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgSSAgICAgICAgICAgIC43RTAsICAtLjlFMCwgIDEuMkUwLCAgICAgICAgICAgICAwLkUwLDAuRTAsMC5FMCwwLkUwLAorICAgICBKICAgICAgICAgICAxLjdFMCwgIC0uOUUwLCAgIC41RTAsICAgICAgICAgICAgIDAuRTAsMC5FMCwwLkUwLDAuRTAsCisgICAgIEsgICAgICAgICAgLTIuNkUwLCAgLS45RTAsIC0xLjNFMCwgICAgICAgICAgICAgMC5FMCwwLkUwLDAuRTAsMC5FMCwKKyAgICAgTCAgICAgICAgICAgIC41RTAsICAtLjlFMCwgICAuM0UwLCAgIC43RTAsICAtLjZFMCwgICAuMkUwLCAgIC44RTAsCisgICAgIE0gICAgICAgICAgICAuN0UwLCAgLS45RTAsICAxLjJFMCwgICAuN0UwLCAtMS41RTAsICAgLjJFMCwgIDEuNkUwLAorICAgICBOICAgICAgICAgICAxLjdFMCwgIC0uOUUwLCAgIC41RTAsICAgLjdFMCwgLTEuNkUwLCAgIC4yRTAsICAyLjRFMCwKKyAgICAgTyAgICAgICAgICAtMi42RTAsICAtLjlFMCwgLTEuM0UwLCAgIC43RTAsICAyLjlFMCwgICAuMkUwLCAtNC4wRTAgLworKgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyAxMjAgS0kgPSAxLCA0CisgICAgICAgICBJTkNYID0gSU5DWFMoS0kpCisgICAgICAgICBJTkNZID0gSU5DWVMoS0kpCisgICAgICAgICBNWCA9IEFCUyhJTkNYKQorICAgICAgICAgTVkgPSBBQlMoSU5DWSkKKyoKKyAgICAgICAgIERPIDEwMCBLTiA9IDEsIDQKKyAgICAgICAgICAgIE4gPSBOUyhLTikKKyAgICAgICAgICAgIEtTSVpFID0gTUlOKDIsS04pCisgICAgICAgICAgICBMRU5YID0gTEVOUyhLTixNWCkKKyAgICAgICAgICAgIExFTlkgPSBMRU5TKEtOLE1ZKQorKiAgICAgICAgICAgLi4gSW5pdGlhbGl6ZSBhbGwgYXJndW1lbnQgYXJyYXlzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgNworICAgICAgICAgICAgICAgU1goSSkgPSBEWDEoSSkKKyAgICAgICAgICAgICAgIFNZKEkpID0gRFkxKEkpCisgICAyMCAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjEpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNET1QgLi4KKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKFNET1QoTixTWCxJTkNYLFNZLElOQ1kpLERUNyhLTixLSSksU1NJWkUxKEtOKQorICAgICArICAgICAgICAgICAgICAgICAgICAgLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4yKSBUSEVOCisqICAgICAgICAgICAgICAuLiBTQVhQWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBTQVhQWShOLFNBLFNYLElOQ1gsU1ksSU5DWSkKKyAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBMRU5ZCisgICAgICAgICAgICAgICAgICBTVFkoSikgPSBEVDgoSixLTixLSSkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLEtTSVpFKSxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gU0NPUFkgLi4KKyAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCA3CisgICAgICAgICAgICAgICAgICBTVFkoSSkgPSBEVDEwWShJLEtOLEtJKQorICAgNjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU0NPUFkoTixTWCxJTkNYLFNZLElOQ1kpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLDEpLDEuMEUwKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNikgVEhFTgorKiAgICAgICAgICAgICAgLi4gU1NXQVAgLi4KKyAgICAgICAgICAgICAgIENBTEwgU1NXQVAoTixTWCxJTkNYLFNZLElOQ1kpCisgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgNworICAgICAgICAgICAgICAgICAgU1RYKEkpID0gRFQxMFgoSSxLTixLSSkKKyAgICAgICAgICAgICAgICAgIFNUWShJKSA9IERUMTBZKEksS04sS0kpCisgICA4MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5YLFNYLFNUWCxTU0laRTIoMSwxKSwxLjBFMCkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWSxTWSxTVFksU1NJWkUyKDEsMSksMS4wRTApCisgICAgICAgICAgICBFTFNFSUYgKElDQVNFLkVRLjEyKSBUSEVOCisqICAgICAgICAgICAgICAuLiBTUk9UTSAuLgorICAgICAgICAgICAgICAgS05JPUtOKzQqKEtJLTEpCisgICAgICAgICAgICAgICBETyBLUEFSPTEsNAorICAgICAgICAgICAgICAgICAgRE8gST0xLDcKKyAgICAgICAgICAgICAgICAgICAgIFNYKEkpID0gRFgxKEkpCisgICAgICAgICAgICAgICAgICAgICBTWShJKSA9IERZMShJKQorICAgICAgICAgICAgICAgICAgICAgU1RYKEkpPSBEVDE5WChJLEtQQVIsS05JKQorICAgICAgICAgICAgICAgICAgICAgU1RZKEkpPSBEVDE5WShJLEtQQVIsS05JKQorICAgICAgICAgICAgICAgICAgRU5EIERPCisqCisgICAgICAgICAgICAgICAgICBETyBJPTEsNQorICAgICAgICAgICAgICAgICAgICAgRFRFTVAoSSkgPSBEUEFSKEksS1BBUikKKyAgICAgICAgICAgICAgICAgIEVORCBETworKgorICAgICAgICAgICAgICAgICAgRE8gIEk9MSxMRU5YCisgICAgICAgICAgICAgICAgICAgICBTU0laRShJKT1TVFgoSSkKKyAgICAgICAgICAgICAgICAgIEVORCBETworKiAgICAgICAgICAgICAgICAgICBTRUUgUkVNQVJLIEFCT1ZFIEFCT1VUIERUMTFYKDEsMiw3KQorKiAgICAgICAgICAgICAgICAgICAgICAgQU5EIERUMTFYKDUsMyw4KS4KKyAgICAgICAgICAgICAgICAgIElGICgoS1BBUiAuRVEuIDIpIC5BTkQuIChLTkkgLkVRLiA3KSkKKyAgICAgJCAgICAgICAgICAgICAgIFNTSVpFKDEpID0gMi40RTAKKyAgICAgICAgICAgICAgICAgIElGICgoS1BBUiAuRVEuIDMpIC5BTkQuIChLTkkgLkVRLiA4KSkKKyAgICAgJCAgICAgICAgICAgICAgIFNTSVpFKDUpID0gMS44RTAKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgICBTUk9UTShOLFNYLElOQ1gsU1ksSU5DWSxEVEVNUCkKKyAgICAgICAgICAgICAgICAgIENBTEwgICBTVEVTVChMRU5YLFNYLFNUWCxTU0laRSxTRkFDKQorICAgICAgICAgICAgICAgICAgQ0FMTCAgIFNURVNUKExFTlksU1ksU1RZLFNUWSxTRkFDKQorICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBFTFNFSUYgKElDQVNFLkVRLjEzKSBUSEVOCisqICAgICAgICAgICAgICAuLiBTRFNST1QgLi4KKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxIChTRFNET1QoTiwuMSxTWCxJTkNYLFNZLElOQ1kpLAorICAgICAkICAgICAgICAgICAgICAgICBTVDdCKEtOLEtJKSxTU0laRTMoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzInCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyAgMTAwICAgIENPTlRJTlVFCisgIDEyMCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0szKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQywgU1MKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEssIEtJLCBLTiwgS1NJWkUsIExFTlgsIExFTlksIE1YLCBNWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBDT1BZWCg1KSwgQ09QWVkoNSksIERUOVgoNyw0LDQpLCBEVDlZKDcsNCw0KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIERYMSg3KSwgRFkxKDcpLCBNV1BDKDExKSwgTVdQUygxMSksIE1XUFNUWCg1KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIE1XUFNUWSg1KSwgTVdQVFgoMTEsNSksIE1XUFRZKDExLDUpLCBNV1BYKDUpLAorICAgICArICAgICAgICAgICAgICAgICAgTVdQWSg1KSwgU1NJWkUyKDE0LDIpLCBTVFgoNyksIFNUWSg3KSwgU1goNyksCisgICAgICsgICAgICAgICAgICAgICAgICBTWSg3KQorICAgICAgSU5URUdFUiAgICAgICAgICAgSU5DWFMoNCksIElOQ1lTKDQpLCBMRU5TKDQsMiksIE1XUElOWCgxMSksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BJTlkoMTEpLCBNV1BOKDExKSwgTlMoNCkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTUk9ULCBTVEVTVAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgQUJTLCBNSU4KKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWFMvMSwgMiwgLTIsIC0xLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWVMvMSwgLTIsIDEsIC0yLworICAgICAgREFUQSAgICAgICAgICAgICAgTEVOUy8xLCAxLCAyLCA0LCAxLCAxLCAzLCA3LworICAgICAgREFUQSAgICAgICAgICAgICAgTlMvMCwgMSwgMiwgNC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERYMS8wLjZFMCwgMC4xRTAsIC0wLjVFMCwgMC44RTAsIDAuOUUwLCAtMC4zRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWTEvMC41RTAsIC0wLjlFMCwgMC4zRTAsIDAuN0UwLCAtMC42RTAsIDAuMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC44RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTQywgU1MvMC44RTAsIDAuNkUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ5WC8wLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNzhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNzhFMCwgLTAuNDZFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43OEUwLCAtMC40NkUwLCAtMC4yMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4wNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNzhFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjY2RTAsIDAuMUUwLCAtMC4xRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC45NkUwLCAwLjFFMCwgLTAuNzZFMCwgMC44RTAsIDAuOTBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjNFMCwgLTAuMDJFMCwgMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjc4RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAtMC4wNkUwLCAwLjFFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjFFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuOTBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMUUwLCAtMC4yMkUwLCAwLjhFMCwgMC4xOEUwLCAtMC4zRTAsIC0wLjAyRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNzhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNzhFMCwgMC4yNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjc4RTAsIDAuMjZFMCwgLTAuNzZFMCwgMS4xMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUOVkvMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjA0RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjA0RTAsIC0wLjc4RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMDRFMCwgLTAuNzhFMCwgMC41NEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wOEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMDRFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuOUUwLCAtMC4xMkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNjRFMCwgLTAuOUUwLCAtMC4zMEUwLCAwLjdFMCwgLTAuMThFMCwgMC4yRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjI4RTAsIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wNEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43RTAsIC0xLjA4RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNjRFMCwgLTEuMjZFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNTRFMCwgMC4yMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjA0RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjA0RTAsIC0wLjlFMCwgMC4xOEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMDRFMCwgLTAuOUUwLCAwLjE4RTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMThFMCwgMC4yRTAsIDAuMTZFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMi8wLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMC8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgRE8gNjAgS0kgPSAxLCA0CisgICAgICAgICBJTkNYID0gSU5DWFMoS0kpCisgICAgICAgICBJTkNZID0gSU5DWVMoS0kpCisgICAgICAgICBNWCA9IEFCUyhJTkNYKQorICAgICAgICAgTVkgPSBBQlMoSU5DWSkKKyoKKyAgICAgICAgIERPIDQwIEtOID0gMSwgNAorICAgICAgICAgICAgTiA9IE5TKEtOKQorICAgICAgICAgICAgS1NJWkUgPSBNSU4oMixLTikKKyAgICAgICAgICAgIExFTlggPSBMRU5TKEtOLE1YKQorICAgICAgICAgICAgTEVOWSA9IExFTlMoS04sTVkpCisqCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuNCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gU1JPVCAuLgorICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgICAgIFNYKEkpID0gRFgxKEkpCisgICAgICAgICAgICAgICAgICBTWShJKSA9IERZMShJKQorICAgICAgICAgICAgICAgICAgU1RYKEkpID0gRFQ5WChJLEtOLEtJKQorICAgICAgICAgICAgICAgICAgU1RZKEkpID0gRFQ5WShJLEtOLEtJKQorICAgMjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1JPVChOLFNYLElOQ1gsU1ksSU5DWSxTQyxTUykKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWCxTWCxTVFgsU1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLEtTSVpFKSxTRkFDKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0szJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisgICA0MCAgICBDT05USU5VRQorICAgNjAgQ09OVElOVUUKKyoKKyAgICAgIE1XUEMoMSkgPSAxCisgICAgICBETyA4MCBJID0gMiwgMTEKKyAgICAgICAgIE1XUEMoSSkgPSAwCisgICA4MCBDT05USU5VRQorICAgICAgTVdQUygxKSA9IDAKKyAgICAgIERPIDEwMCBJID0gMiwgNgorICAgICAgICAgTVdQUyhJKSA9IDEKKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMjAgSSA9IDcsIDExCisgICAgICAgICBNV1BTKEkpID0gLTEKKyAgMTIwIENPTlRJTlVFCisgICAgICBNV1BJTlgoMSkgPSAxCisgICAgICBNV1BJTlgoMikgPSAxCisgICAgICBNV1BJTlgoMykgPSAxCisgICAgICBNV1BJTlgoNCkgPSAtMQorICAgICAgTVdQSU5YKDUpID0gMQorICAgICAgTVdQSU5YKDYpID0gLTEKKyAgICAgIE1XUElOWCg3KSA9IDEKKyAgICAgIE1XUElOWCg4KSA9IDEKKyAgICAgIE1XUElOWCg5KSA9IC0xCisgICAgICBNV1BJTlgoMTApID0gMQorICAgICAgTVdQSU5YKDExKSA9IC0xCisgICAgICBNV1BJTlkoMSkgPSAxCisgICAgICBNV1BJTlkoMikgPSAxCisgICAgICBNV1BJTlkoMykgPSAtMQorICAgICAgTVdQSU5ZKDQpID0gLTEKKyAgICAgIE1XUElOWSg1KSA9IDIKKyAgICAgIE1XUElOWSg2KSA9IDEKKyAgICAgIE1XUElOWSg3KSA9IDEKKyAgICAgIE1XUElOWSg4KSA9IC0xCisgICAgICBNV1BJTlkoOSkgPSAtMQorICAgICAgTVdQSU5ZKDEwKSA9IDIKKyAgICAgIE1XUElOWSgxMSkgPSAxCisgICAgICBETyAxNDAgSSA9IDEsIDExCisgICAgICAgICBNV1BOKEkpID0gNQorICAxNDAgQ09OVElOVUUKKyAgICAgIE1XUE4oNSkgPSAzCisgICAgICBNV1BOKDEwKSA9IDMKKyAgICAgIERPIDE2MCBJID0gMSwgNQorICAgICAgICAgTVdQWChJKSA9IEkKKyAgICAgICAgIE1XUFkoSSkgPSBJCisgICAgICAgICBNV1BUWCgxLEkpID0gSQorICAgICAgICAgTVdQVFkoMSxJKSA9IEkKKyAgICAgICAgIE1XUFRYKDIsSSkgPSBJCisgICAgICAgICBNV1BUWSgyLEkpID0gLUkKKyAgICAgICAgIE1XUFRYKDMsSSkgPSA2IC0gSQorICAgICAgICAgTVdQVFkoMyxJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWCg0LEkpID0gSQorICAgICAgICAgTVdQVFkoNCxJKSA9IC1JCisgICAgICAgICBNV1BUWCg2LEkpID0gNiAtIEkKKyAgICAgICAgIE1XUFRZKDYsSSkgPSBJIC0gNgorICAgICAgICAgTVdQVFgoNyxJKSA9IC1JCisgICAgICAgICBNV1BUWSg3LEkpID0gSQorICAgICAgICAgTVdQVFgoOCxJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWSg4LEkpID0gNiAtIEkKKyAgICAgICAgIE1XUFRYKDksSSkgPSAtSQorICAgICAgICAgTVdQVFkoOSxJKSA9IEkKKyAgICAgICAgIE1XUFRYKDExLEkpID0gSSAtIDYKKyAgICAgICAgIE1XUFRZKDExLEkpID0gNiAtIEkKKyAgMTYwIENPTlRJTlVFCisgICAgICBNV1BUWCg1LDEpID0gMQorICAgICAgTVdQVFgoNSwyKSA9IDMKKyAgICAgIE1XUFRYKDUsMykgPSA1CisgICAgICBNV1BUWCg1LDQpID0gNAorICAgICAgTVdQVFgoNSw1KSA9IDUKKyAgICAgIE1XUFRZKDUsMSkgPSAtMQorICAgICAgTVdQVFkoNSwyKSA9IDIKKyAgICAgIE1XUFRZKDUsMykgPSAtMgorICAgICAgTVdQVFkoNSw0KSA9IDQKKyAgICAgIE1XUFRZKDUsNSkgPSAtMworICAgICAgTVdQVFgoMTAsMSkgPSAtMQorICAgICAgTVdQVFgoMTAsMikgPSAtMworICAgICAgTVdQVFgoMTAsMykgPSAtNQorICAgICAgTVdQVFgoMTAsNCkgPSA0CisgICAgICBNV1BUWCgxMCw1KSA9IDUKKyAgICAgIE1XUFRZKDEwLDEpID0gMQorICAgICAgTVdQVFkoMTAsMikgPSAyCisgICAgICBNV1BUWSgxMCwzKSA9IDIKKyAgICAgIE1XUFRZKDEwLDQpID0gNAorICAgICAgTVdQVFkoMTAsNSkgPSAzCisgICAgICBETyAyMDAgSSA9IDEsIDExCisgICAgICAgICBJTkNYID0gTVdQSU5YKEkpCisgICAgICAgICBJTkNZID0gTVdQSU5ZKEkpCisgICAgICAgICBETyAxODAgSyA9IDEsIDUKKyAgICAgICAgICAgIENPUFlYKEspID0gTVdQWChLKQorICAgICAgICAgICAgQ09QWVkoSykgPSBNV1BZKEspCisgICAgICAgICAgICBNV1BTVFgoSykgPSBNV1BUWChJLEspCisgICAgICAgICAgICBNV1BTVFkoSykgPSBNV1BUWShJLEspCisgIDE4MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBTUk9UKE1XUE4oSSksQ09QWVgsSU5DWCxDT1BZWSxJTkNZLE1XUEMoSSksTVdQUyhJKSkKKyAgICAgICAgIENBTEwgU1RFU1QoNSxDT1BZWCxNV1BTVFgsTVdQU1RYLFNGQUMpCisgICAgICAgICBDQUxMIFNURVNUKDUsQ09QWVksTVdQU1RZLE1XUFNUWSxTRkFDKQorICAyMDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUKExFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBSRUFMICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NiwgWkVSTz0wLjBFMCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTQ09NUChMRU4pLCBTU0laRShMRU4pLCBTVFJVRShMRU4pCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgIFNECisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRElGRgorICAgICAgRVhURVJOQUwgICAgICAgICBTRElGRgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBQlMKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICBTRCA9IFNDT01QKEkpIC0gU1RSVUUoSSkKKyAgICAgICAgIElGIChBQlMoU0ZBQypTRCkgLkxFLiBBQlMoU1NJWkUoSSkpKkVQU0lMT04oWkVSTykpCisgICAgICsgICAgICAgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgICAgU0NPTVAoSSkgSVMgTk9UIENMT1NFIFRPIFNUUlVFKEkpLgorKgorICAgICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgSSwgU0NPTVAoSSksCisgICAgICsgICAgIFNUUlVFKEkpLCBTRCwgU1NJWkUoSSkKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUChJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRShJKSAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgJyAgICAgU0laRShJKScsLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywySTUsSTMsMkUzNi44LDJFMTIuNCkKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTVEVTVDEoU0NPTVAxLFNUUlVFMSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEVTVDEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgSVMgQU4gSU5URVJGQUNFIFNVQlJPVVRJTkUgVE8gQUNDT01PREFURSBUSEUgRk9SVFJBTgorKiAgICAgUkVRVUlSRU1FTlQgVEhBVCBXSEVOIEEgRFVNTVkgQVJHVU1FTlQgSVMgQU4gQVJSQVksIFRIRQorKiAgICAgQUNUVUFMIEFSR1VNRU5UIE1VU1QgQUxTTyBCRSBBTiBBUlJBWSBPUiBBTiBBUlJBWSBFTEVNRU5ULgorKgorKiAgICAgQy5MLiBMQVdTT04sIEpQTCwgMTk3OCBERUMgNgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0NPTVAxLCBTRkFDLCBTVFJVRTEKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU1NJWkUoKikKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0NPTVAoMSksIFNUUlVFKDEpCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgU1RFU1QKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgU0NPTVAoMSkgPSBTQ09NUDEKKyAgICAgIFNUUlVFKDEpID0gU1RSVUUxCisgICAgICBDQUxMIFNURVNUKDEsU0NPTVAsU1RSVUUsU1NJWkUsU0ZBQykKKyoKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBSRUFMICAgICAgICAgICAgIEZVTkNUSU9OIFNESUZGKFNBLFNCKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNESUZGICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICBDT01QVVRFUyBESUZGRVJFTkNFIE9GIFRXTyBOVU1CRVJTLiAgQy4gTC4gTEFXU09OLCBKUEwgMTk3NCBGRUIgMTUKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0EsIFNCCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFNESUZGID0gU0EgLSBTQgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSVRFU1QxKElDT01QLElUUlVFKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlJPVVRJTkUgQ09NUEFSRVMgVEhFIFZBUklBQkxFUyBJQ09NUCBBTkQgSVRSVUUgRk9SCisqICAgICBFUVVBTElUWS4KKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDT01QLCBJVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJRAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBJRiAoSUNPTVAuRVEuSVRSVUUpIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgSUNPTVAgSVMgTk9UIEVRVUFMIFRPIElUUlVFLgorKgorICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIElEID0gSUNPTVAgLSBJVFJVRQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBJQ09NUCwgSVRSVUUsIElECisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywKKyAgICAgKyAgICAgICAnIENPTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgICAgIERJRkZFUkVOQ0UnLAorICAgICArICAgICAgIC8xWCkKKzk5OTk3IEZPUk1BVCAoMVgsSTQsSTMsMkk1LDJJMzYsSTEyKQorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmRhdCBiL2JsYXMvdGVzdGluZy9zYmxhdDIuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzdkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmRhdApAQCAtMCwwICsxLDM0IEBACisnc2JsYXQyLnN1bW0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKzYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorJ3NibGF0Mi5zbmFwJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCitUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKzE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCis2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKzAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCis0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEsKKzAgMSAyIDQgICAgICAgICAgIFZBTFVFUyBPRiBLCis0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKzEgMiAtMSAtMiAgICAgICAgIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCiswLjAgMS4wIDAuNyAgICAgICBWQUxVRVMgT0YgQUxQSEEKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorMC4wIDEuMCAwLjkgICAgICAgVkFMVUVTIE9GIEJFVEEKK1NHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NZTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1BNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1RSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1RSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU0dFUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTWVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1BSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NZUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTUFIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmYgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9zYmxhdDIuZgpAQCAtMCwwICsxLDMxNzYgQEAKKyo+IFxicmllZiBcYiBTQkxBVDIKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFBST0dSQU0gU0JMQVQyCisqIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFJFQUwgTGV2ZWwgMiBCbGFzLgorKj4KKyo+IFRoZSBwcm9ncmFtIG11c3QgYmUgZHJpdmVuIGJ5IGEgc2hvcnQgZGF0YSBmaWxlLiBUaGUgZmlyc3QgMTggcmVjb3JkcworKj4gb2YgdGhlIGZpbGUgYXJlIHJlYWQgdXNpbmcgbGlzdC1kaXJlY3RlZCBpbnB1dCwgdGhlIGxhc3QgMTYgcmVjb3JkcworKj4gYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyo+IGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyo+IGZvbGxvd2luZyAzNCBsaW5lczoKKyo+ICdzYmxhdDIub3V0JyAgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKj4gNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqPiAnU0JMQVQyLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqPiAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyo+IFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKj4gMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyo+IDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKj4gMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyo+IDQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSworKj4gMCAxIDIgNCAgICAgICAgICAgVkFMVUVTIE9GIEsKKyo+IDQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorKj4gMSAyIC0xIC0yICAgICAgICAgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyo+IDAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqPiAwLjAgMS4wIDAuOSAgICAgICBWQUxVRVMgT0YgQkVUQQorKj4gU0dFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNHQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTU1lNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1NCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNTUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTVFJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1RCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNUUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTVFJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1RCU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNUUFNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTR0VSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1NZUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNTUFIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTU1lSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1NQUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+CisqPiBGdXJ0aGVyIERldGFpbHMKKyo+ID09PT09PT09PT09PT09PQorKj4KKyo+ICAgIFNlZToKKyo+CisqPiAgICAgICBEb25nYXJyYSBKLiBKLiwgRHUgQ3JveiBKLiBKLiwgSGFtbWFybGluZyBTLiAgYW5kIEhhbnNvbiBSLiBKLi4KKyo+ICAgICAgIEFuICBleHRlbmRlZCAgc2V0IG9mIEZvcnRyYW4gIEJhc2ljIExpbmVhciBBbGdlYnJhIFN1YnByb2dyYW1zLgorKj4KKyo+ICAgICAgIFRlY2huaWNhbCAgTWVtb3JhbmRhICBOb3MuIDQxIChyZXZpc2lvbiAzKSBhbmQgODEsICBNYXRoZW1hdGljcworKj4gICAgICAgYW5kICBDb21wdXRlciBTY2llbmNlICBEaXZpc2lvbiwgIEFyZ29ubmUgIE5hdGlvbmFsIExhYm9yYXRvcnksCisqPiAgICAgICA5NzAwIFNvdXRoIENhc3MgQXZlbnVlLCBBcmdvbm5lLCBJbGxpbm9pcyA2MDQzOSwgVVMuCisqPgorKj4gICAgICAgT3IKKyo+CisqPiAgICAgICBOQUcgIFRlY2huaWNhbCBSZXBvcnRzIFRSMy84NyBhbmQgVFI0Lzg3LCAgTnVtZXJpY2FsIEFsZ29yaXRobXMKKyo+ICAgICAgIEdyb3VwICBMdGQuLCAgTkFHICBDZW50cmFsICBPZmZpY2UsICAyNTYgIEJhbmJ1cnkgIFJvYWQsIE94Zm9yZAorKj4gICAgICAgT1gyIDdERSwgVUssICBhbmQgIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEluYy4sICAxMTAxICAzMXN0CisqPiAgICAgICBTdHJlZXQsICBTdWl0ZSAxMDAsICBEb3duZXJzIEdyb3ZlLCAgSWxsaW5vaXMgNjA1MTUtMTI2MywgIFVTQS4KKyo+CisqPgorKj4gLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyo+ICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyo+ICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqPgorKj4gICAgMTAtOS0wMDogIENoYW5nZSBTVEFUVVM9J05FVycgdG8gJ1VOS05PV04nIHNvIHRoYXQgdGhlIHRlc3RlcnMKKyo+ICAgICAgICAgICAgICBjYW4gYmUgcnVuIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgZGVsZXRpbmcgZ2VuZXJhdGVkCisqPiAgICAgICAgICAgICAgb3V0cHV0IGZpbGVzIChzdXNhbikKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIHNpbmdsZV9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBTQkxBVDIKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDE2ICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWCwgSU5DTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUsIElOQ01BWCA9IDIgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTk1BWCwgTklETUFYLCBOS0JNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSU5NQVggPSA3LCBOSURNQVggPSA5LCBOS0JNQVggPSA3LAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggMipOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURNQVggKSwgSU5DKCBOSU5NQVggKSwgS0IoIE5LQk1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0RJRkYsIExTRQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTQ0hLMSwgU0NISzIsIFNDSEszLCBTQ0hLNCwgU0NISzUsIFNDSEs2LAorICAgICAkICAgICAgICAgICAgICAgICAgIFNDSEtFLCBTTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ1NHRU1WICcsICdTR0JNViAnLCAnU1NZTVYgJywgJ1NTQk1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1NTUE1WICcsICdTVFJNViAnLCAnU1RCTVYgJywgJ1NUUE1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1NUUlNWICcsICdTVEJTViAnLCAnU1RQU1YgJywgJ1NHRVIgICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1NTWVIgICcsICdTU1BSICAnLCAnU1NZUjIgJywgJ1NTUFIyICcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdVTktOT1dOJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ1VOS05PV04nICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgU01WQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTEwIEkgPSAxLCBOCisgICAgICAgICAgICBBKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgIDExMCAgICBDT05USU5VRQorICAgICAgICAgWCggSiApID0gSgorICAgICAgICAgWSggSiApID0gWkVSTworICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgWVkoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisqICAgICBZWSBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gU01WQ0ggWVQgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgU01WQ0guCisgICAgICBUUkFOUyA9ICdOJworICAgICAgQ0FMTCBTTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgMSwgWkVSTywgWSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExTRSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TID0gJ1QnCisgICAgICBDQUxMIFNNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLCAtMSwgWkVSTywgWSwgLTEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMU0UoIFlZLCBZVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjEwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIFNDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNDAsIDE1MCwgMTUwLCAxNTAsIDE2MCwgMTYwLAorICAgICAkICAgICAgICAgICAgICAxNjAsIDE2MCwgMTYwLCAxNjAsIDE3MCwgMTgwLCAxODAsCisgICAgICQgICAgICAgICAgICAgIDE5MCwgMTkwIClJU05VTQorKiAgICAgICAgICAgVGVzdCBTR0VNViwgMDEsIGFuZCBTR0JNViwgMDIuCisgIDE0MCAgICAgICBDQUxMIFNDSEsxKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBTU1lNViwgMDMsIFNTQk1WLCAwNCwgYW5kIFNTUE1WLCAwNS4KKyAgMTUwICAgICAgIENBTEwgU0NISzIoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsCisgICAgICQgICAgICAgICAgICAgICAgICBOQkVULCBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFNUUk1WLCAwNiwgU1RCTVYsIDA3LCBTVFBNViwgMDgsCisqICAgICAgICAgICBTVFJTViwgMDksIFNUQlNWLCAxMCwgYW5kIFNUUFNWLCAxMS4KKyAgMTYwICAgICAgIENBTEwgU0NISzMoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWSwgWVksIFlTLCBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgU0dFUiwgMTIuCisgIDE3MCAgICAgICBDQUxMIFNDSEs0KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgU1NZUiwgMTMsIGFuZCBTU1BSLCAxNC4KKyAgMTgwICAgICAgIENBTEwgU0NISzUoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBTU1lSMiwgMTUsIGFuZCBTU1BSMiwgMTYuCisgIDE5MCAgICAgICBDQUxMIFNDSEs2KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisqCisgIDIwMCAgICAgICBJRiggRkFUQUwuQU5ELlNGQVRBTCApCisgICAgICQgICAgICAgICBHTyBUTyAyMjAKKyAgICAgICAgIEVORCBJRgorICAyMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgyICkKKyAgICAgIEdPIFRPIDI0MAorKgorICAyMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgxICkKKyAgICAgIEdPIFRPIDI0MAorKgorICAyMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg3ICkKKyoKKyAgMjQwIENPTlRJTlVFCisgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgQ0xPU0UgKCBOVFJBICkKKyAgICAgIENMT1NFICggTk9VVCApCisgICAgICBTVE9QCisqCisgOTk5OSBGT1JNQVQoICcgUk9VVElORVMgUEFTUyBDT01QVVRBVElPTkFMIFRFU1RTIElGIFRFU1QgUkFUSU8gSVMgTEVTJywKKyAgICAgJCAgICAgICdTIFRIQU4nLCBGOC4yICkKKyA5OTk4IEZPUk1BVCggJyBSRUxBVElWRSBNQUNISU5FIFBSRUNJU0lPTiBJUyBUQUtFTiBUTyBCRScsIDFQLCBFOS4xICkKKyA5OTk3IEZPUk1BVCggJyBOVU1CRVIgT0YgVkFMVUVTIE9GICcsIEEsICcgSVMgTEVTUyBUSEFOIDEgT1IgR1JFQVRFUiAnLAorICAgICAkICAgICAgJ1RIQU4gJywgSTIgKQorIDk5OTYgRk9STUFUKCAnIFZBTFVFIE9GIE4gSVMgTEVTUyBUSEFOIDAgT1IgR1JFQVRFUiBUSEFOICcsIEkyICkKKyA5OTk1IEZPUk1BVCggJyBWQUxVRSBPRiBLIElTIExFU1MgVEhBTiAwJyApCisgOTk5NCBGT1JNQVQoICcgQUJTT0xVVEUgVkFMVUUgT0YgSU5DWCBPUiBJTkNZIElTIDAgT1IgR1JFQVRFUiBUSEFOICcsCisgICAgICQgICAgICBJMiApCisgOTk5MyBGT1JNQVQoICcgVEVTVFMgT0YgVEhFIFJFQUwgICAgICAgICAgICAgTEVWRUwgMiBCTEFTJywgLy8nIFRIRSBGJywKKyAgICAgJCAgICAgICdPTExPV0lORyBQQVJBTUVURVIgVkFMVUVTIFdJTEwgQkUgVVNFRDonICkKKyA5OTkyIEZPUk1BVCggJyAgIEZPUiBOICAgICAgICAgICAgICAnLCA5STYgKQorIDk5OTEgRk9STUFUKCAnICAgRk9SIEsgICAgICAgICAgICAgICcsIDdJNiApCisgOTk5MCBGT1JNQVQoICcgICBGT1IgSU5DWCBBTkQgSU5DWSAgJywgN0k2ICkKKyA5OTg5IEZPUk1BVCggJyAgIEZPUiBBTFBIQSAgICAgICAgICAnLCA3RjYuMSApCisgOTk4OCBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywgN0Y2LjEgKQorIDk5ODcgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg2IEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg1IEZPUk1BVCggJyBFUlJPUiBJTiBTTVZDSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBTTVZDSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlMgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgRVJSID0gJywgRjEyLjMsICcuJywgLworICAgICAkICAgJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSBBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nCisgICAgICQgICAgICAsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggQTYsIEwyICkKKyA5OTgzIEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4MiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODEgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTgwIEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBTQkxBVDIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBTR0VNViBhbmQgU0dCTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBIQUxGID0gMC41ICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBHKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLVSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLTCwgS0xTLCBLVSwgS1VTLCBMQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREFTLCBMWCwgTFksIE0sIE1MLCBNUywgTiwgTkFSR1MsIE5DLCBORCwgTkssCisgICAgICQgICAgICAgICAgICAgICAgICAgTkwsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNHQk1WLCBTR0VNViwgU01BS0UsIFNNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTMKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSUtVID0gMSwgTksKKyAgICAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEtVID0gS0IoIElLVSApCisgICAgICAgICAgICAgICAgICBLTCA9IE1BWCggS1UgLSAxLCAwICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtVID0gTiAtIDEKKyAgICAgICAgICAgICAgICAgIEtMID0gTSAtIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBMREEgPSBLTCArIEtVICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgU01BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgS0wsIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElDID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1MID0gTgorICAgICAgICAgICAgICAgICAgICAgTkwgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTgorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTkwKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOTCwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTkwgLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOTC5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBYKCBOTC8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTkwvMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTUwKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE1MLCBZLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEFCUyggSU5DWSApLCAwLCBNTCAtIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xTID0gS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUyA9IEtVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTR0VNViggVFJBTlMsIE0sIE4sIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1gsIEJFVEEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNHQk1WKCBUUkFOUywgTSwgTiwgS0wsIEtVLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFhYLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFNFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MLCBZUywgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLTFMuRVEuS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLVVMuRVEuS1UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE0MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgS0wsIEtVLAorICAgICAkICAgICAgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDQoIEkzLCAnLCcgKSwgRjQuMSwKKyAgICAgJCAgICAgICcsIEEsJywgSTMsICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCAyKCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEsxLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEsyKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsIE5CRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorKgorKiAgVGVzdHMgU1NZTVYsIFNTQk1WIGFuZCBTU1BNVi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIEhBTEYKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIEhBTEYgPSAwLjUgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEcoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKSwgS0IoIE5LQiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUssIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLLCBLUywgTEFBLCBMREEsIExEQVMsIExYLCBMWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01WQ0gsIFNTQk1WLCBTU1BNViwgU1NZTVYKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1knCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEwCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDExMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKgorICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgRU5EIElGCisgICAgICAgICBETyAxMDAgSUsgPSAxLCBOSworICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgSyA9IEtCKCBJSyApCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBLID0gTiAtIDEKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBMREEgPSBLICsgMQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgTERBID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICBMQUEgPSAoIE4qKCBOICsgMSApICkvMgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMAorKgorICAgICAgICAgICAgRE8gOTAgSUMgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgSywgSywgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWSwgMSwgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSwgMCwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1lNViggVVBMTywgTiwgQUxQSEEsIEFBLCBMREEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgQkVUQSwgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU0JNViggVVBMTywgTiwgSywgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCwgQkVUQSwgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE4sIEFMUEhBLCBJTkNYLCBCRVRBLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1BNViggVVBMTywgTiwgQUxQSEEsIEFBLCBYWCwgSU5DWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTFNFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMU0VSRVMoICdHRScsICcgJywgMSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFNFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCAnTicsIE4sIE4sIEFMUEhBLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgQkVUQSwgWSwgSU5DWSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwKKyAgICAgJCAgICAgIEJFVEEsIElOQ1kKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwgSywgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTkQgSUYKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgQVAnLAorICAgICAkICAgICAgJywgWCwnLCBJMiwgJywnLCBGNC4xLCAnLCBZLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDIoIEkzLCAnLCcgKSwgRjQuMSwKKyAgICAgJCAgICAgICcsIEEsJywgSTMsICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwKKyAgICAgJCAgICAgICcpICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBBLCcsCisgICAgICQgICAgICBJMywgJywgWCwnLCBJMiwgJywnLCBGNC4xLCAnLCBZLCcsIEkyLCAnKSAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLMi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLMyggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWFQsIEcsIFogKQorKgorKiAgVGVzdHMgU1RSTVYsIFNUQk1WLCBTVFBNViwgU1RSU1YsIFNUQlNWIGFuZCBTVFBTVi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgSEFMRiA9IDAuNSwgT05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEcoIE5NQVggKSwgWCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhTKCBOTUFYKklOQ01BWCApLCBYVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKSwgS0IoIE5LQiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDRCwgSUNULCBJQ1UsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgIEtTLCBMQUEsIExEQSwgTERBUywgTFgsIE4sIE5BUkdTLCBOQywgTkssIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTVZDSCwgU1RCTVYsIFNUQlNWLCBTVFBNViwgU1RQU1YsCisgICAgICQgICAgICAgICAgICAgICAgICAgU1RSTVYsIFNUUlNWCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVS8nVUwnLywgSUNIVC8nTlRDJy8sIElDSEQvJ1VOJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1InCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqICAgICBTZXQgdXAgemVybyB2ZWN0b3IgZm9yIFNNVkNILgorICAgICAgRE8gMTAgSSA9IDEsIE5NQVgKKyAgICAgICAgIFooIEkgKSA9IFpFUk8KKyAgIDEwIENPTlRJTlVFCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCBESUFHLCBOLCBOLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQUEsIExEQSwgSywgSywgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBESUFHUyA9IERJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTVYnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFJNViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1RCTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFBNViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTVicgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNUUlNWKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSywgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVEJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNUUFNWKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOUy5FUS5UUkFOU1MKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBESUFHLkVRLkRJQUdTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0VSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBaRVJPLCBaLCBJTkNYLCBYVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwgdmVjdG9yLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFhYKCAxICsgKCBJIC0gMSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNYICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBaLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWCwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgQ09OVElOVUUKKyoKKyAgMTEwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLAorICAgICAkICAgICAgSU5DWAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgSywKKyAgICAgJCAgICAgIExEQSwgSU5DWAorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBUCwgJywKKyAgICAgJCAgICAgICdYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJyBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQSwnLAorICAgICAkICAgICAgSTMsICcsIFgsJywgSTIsICcpICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzQoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgU0dFUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgSEFMRiA9IDAuNSwgT05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgRyggTk1BWCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJTSwgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLCBJTkNZUywgSVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgSVksIEosIExBQSwgTERBLCBMREFTLCBMWCwgTFksIE0sIE1TLCBOLCBOQVJHUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQywgTkQsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFcoIDEgKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNHRVIsIFNNQUtFLCBTTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBOQVJHUyA9IDkKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEyMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorICAgICAgICAgTkQgPSBOLzIgKyAxCisqCisgICAgICAgICBETyAxMTAgSU0gPSAxLCAyCisgICAgICAgICAgICBJRiggSU0uRVEuMSApCisgICAgICQgICAgICAgICBNID0gTUFYKCBOIC0gTkQsIDAgKQorICAgICAgICAgICAgSUYoIElNLkVRLjIgKQorICAgICAkICAgICAgICAgTSA9IE1JTiggTiArIE5ELCBOTUFYICkKKyoKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisgICAgICAgICAgICBETyAxMDAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk0KKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBNLCBYLCAxLCBYWCwgQUJTKCBJTkNYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAwLCBNIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICBJRiggTS5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICBYKCBNLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBNLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gOTAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBZKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFlZKCAxICsgQUJTKCBJTkNZICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gODAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggU05BTUUoIDI6IDMgKSwgJyAnLCAnICcsIE0sIE4sIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBNIC0gMSwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBNLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU0dFUiggTSwgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0VSRVMoICdHRScsICcgJywgTSwgTiwgQVMsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREFTLkVRLkxEQQorKgorKiAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIE0gLSBJICsgMSApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWSggSiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBOIC0gSiArIDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCAnTicsIE0sIDEsIEFMUEhBLCBaLCBOTUFYLCBXLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBBKCAxLCBKICksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEoIDEgKyAoIEogLSAxICkqTERBICksIEVQUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICA3MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTS5sZS4wIG9yIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE1MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE0MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBNLCBOLCBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisqCisgIDE1MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggSTMsICcsJyApLCBGNC4xLCAnLCBYLCcsIEkyLAorICAgICAkICAgICAgJywgWSwnLCBJMiwgJywgQSwnLCBJMywgJykgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLNC4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLNSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBTU1lSIGFuZCBTU1BSLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBIQUxGID0gMC41LCBPTkUgPSAxLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBKLCBKQSwgSkosIExBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExKLCBMWCwgTiwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUsIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFcoIDEgKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTVZDSCwgU1NQUiwgU1NZUgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nWScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNgorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERBID0gTgorICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgIERPIDgwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuQUxQSEEuRVEuWkVSTworKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgTiAtIDEsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyoKKyogICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1lSKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1BSKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIEFBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIEkgKQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBOIC0gSSArIDEgKQorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWiggSiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01WQ0goICdOJywgTEosIDEsIEFMUEhBLCBaKCBKSiApLCBMSiwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE9ORSwgQSggSkosIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIGlmIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLCBMREEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBYLCcsCisgICAgICQgICAgICBJMiwgJywgQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywnLCBGNC4xLCAnLCBYLCcsCisgICAgICQgICAgICBJMiwgJywgQSwnLCBJMywgJykgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLNiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBTU1lSMiBhbmQgU1NQUjIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIEhBTEYgPSAwLjUsIE9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEcoIE5NQVggKSwgWCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhTKCBOTUFYKklOQ01BWCApLCBYWCggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZKCBOTUFYICksIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYLCAyICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUMsIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBKQSwgSkosIExBQSwgTERBLCBMREFTLCBMSiwgTFgsIExZLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBXKCAyICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01WQ0gsIFNTUFIyLCBTU1lSMgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nWScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOAorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxNDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERBID0gTgorICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDE0MAorICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIERPIDEzMCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyAxMjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwgQUJTKCBJTkNYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gMTEwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFkuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWSwgMSwgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWSggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBZWSggMSArIEFCUyggSU5DWSApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLkFMUEhBLkVRLlpFUk8KKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIE4gLSAxLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNTWVIyKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNTUFIyKCBVUExPLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTYwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMTy5FUS5VUExPUworICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMSApID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIE4gLSBJICsgMSApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMiApID0gWSggSSApCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gODAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIE4gLSBJICsgMSApCisgICA4MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBaKCBKLCAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDIgKSA9IFooIEosIDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCAnTicsIExKLCAyLCBBTFBIQSwgWiggSkosIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIFcsIDEsIE9ORSwgQSggSkosIEogKSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlULCBHLCBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICA5MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uTEUuMCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNzAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgSU5DWSwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICBFTkQgSUYKKyoKKyAgMTcwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIFksJywgSTIsICcsIEFQKSAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NIS0UoIElTTlVNLCBTUk5BTVQsIE5PVVQgKQorKgorKiAgVGVzdHMgdGhlIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQmxhcy4KKyogIFJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBlcnJvci1oYW5kbGluZyByb3V0aW5lIFhFUkJMQS4KKyogIEFMUEhBLCBCRVRBLCBBLCBYIGFuZCBZIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggMSwgMSApLCBYKCAxICksIFkoIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIFNHQk1WLCBTR0VNViwgU0dFUiwgU1NCTVYsIFNTUE1WLCBTU1BSLAorICAgICAkICAgICAgICAgICAgICAgICAgIFNTUFIyLCBTU1lNViwgU1NZUiwgU1NZUjIsIFNUQk1WLCBTVEJTViwgU1RQTVYsCisgICAgICQgICAgICAgICAgICAgICAgICAgU1RQU1YsIFNUUk1WLCBTVFJTVgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIE9LIGlzIHNldCB0byAuRkFMU0UuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIG9yIGJ5IENIS1hFUgorKiAgICAgaWYgYW55dGhpbmcgaXMgd3JvbmcuCisgICAgICBPSyA9IC5UUlVFLgorKiAgICAgTEVSUiBpcyBzZXQgdG8gLlRSVUUuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIGVhY2ggdGltZQorKiAgICAgaXQgaXMgY2FsbGVkLCBhbmQgaXMgdGhlbiB0ZXN0ZWQgYW5kIHJlLXNldCBieSBDSEtYRVIuCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsCisgICAgICQgICAgICAgIDkwLCAxMDAsIDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLAorICAgICAkICAgICAgICAxNjAgKUlTTlVNCisgICAxMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU0dFTVYoICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTR0VNViggJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTR0VNViggJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTR0VNViggJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFNHRU1WKCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNHRU1WKCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBTR0JNViggJy8nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNHQk1WKCAnTicsIC0xLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNHQk1WKCAnTicsIDAsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNHQk1WKCAnTicsIDAsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNHQk1WKCAnTicsIDIsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFNHQk1WKCAnTicsIDAsIDAsIDEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNHQk1WKCAnTicsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFNHQk1WKCAnTicsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1lNViggJy8nLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWU1WKCAnVScsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNTWU1WKCAnVScsIDIsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZTVYoICdVJywgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU1NZTVYoICdVJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgNDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTQk1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NCTVYoICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NCTVYoICdVJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1NCTVYoICdVJywgMCwgMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTU0JNViggJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTU0JNViggJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NQTVYoICcvJywgMCwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1BNViggJ1UnLCAtMSwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTU1BNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTUE1WKCAnVScsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDYwIElORk9UID0gMQorICAgICAgQ0FMTCBTVFJNViggJy8nLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNUUk1WKCAnVScsICcvJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1RSTVYoICdVJywgJ04nLCAnLycsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTVFJNViggJ1UnLCAnTicsICdOJywgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJNViggJ1UnLCAnTicsICdOJywgMiwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFNUUk1WKCAnVScsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDcwIElORk9UID0gMQorICAgICAgQ0FMTCBTVEJNViggJy8nLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNUQk1WKCAnVScsICcvJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1RCTVYoICdVJywgJ04nLCAnLycsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTVEJNViggJ1UnLCAnTicsICdOJywgLTEsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVEJNViggJ1UnLCAnTicsICdOJywgMCwgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTVEJNViggJ1UnLCAnTicsICdOJywgMCwgMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUQk1WKCAnVScsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDgwIElORk9UID0gMQorICAgICAgQ0FMTCBTVFBNViggJy8nLCAnTicsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNUUE1WKCAnVScsICcvJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1RQTVYoICdVJywgJ04nLCAnLycsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTVFBNViggJ1UnLCAnTicsICdOJywgLTEsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTVFBNViggJ1UnLCAnTicsICdOJywgMCwgQSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA5MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RSU1YoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVFJTViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUUlNWKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RSU1YoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSU1YoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTVFJTViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDEwMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RCU1YoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVEJTViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUQlNWKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RCU1YoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RCU1YoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1RCU1YoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVEJTViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDExMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RQU1YoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVFBTViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUUFNWKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RQU1YoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1RQU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMjAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNHRVIoIC0xLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNHRVIoIDAsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNHRVIoIDAsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU0dFUiggMCwgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTR0VSKCAyLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDEzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NZUiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWVIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1NZUiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVIoICdVJywgMiwgQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxNDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTUFIoICcvJywgMCwgQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1BSKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNTUFIoICdVJywgMCwgQUxQSEEsIFgsIDAsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTWVIyKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NZUjIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1NZUjIoICdVJywgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWVIyKCAnVScsIDIsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTYwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1BSMiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTUFIyKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNTUFIyKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NQUjIoICdVJywgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyAgMTcwIElGKCBPSyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNSTkFNVAorICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNVAorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIFRFU1RTIE9GIEVSUk9SLUVYSVRTJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgVEhFIFRFU1RTIE9GIEVSUk9SLUVYSVRTICoqKioqJywKKyAgICAgJCAgICAgICcqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNNQUtFKCBUWVBFLCBVUExPLCBESUFHLCBNLCBOLCBBLCBOTUFYLCBBQSwgTERBLCBLTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyogIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIGFuIE0gYnkgTiBtYXRyaXggQSB3aXRoaW4gdGhlIGJhbmR3aWR0aAorKiAgZGVmaW5lZCBieSBLTCBhbmQgS1UuCisqICBTdG9yZXMgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgQUEgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkCisqICBieSB0aGUgcm91dGluZSwgd2l0aCB1bndhbnRlZCBlbGVtZW50cyBzZXQgdG8gcm9ndWUgdmFsdWUuCisqCisqICBUWVBFIGlzICdHRScsICdHQicsICdTWScsICdTQicsICdTUCcsICdUUicsICdUQicgT1IgJ1RQJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgT05FID0gMS4wICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAtMS4wRTEwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLTCwgS1UsIExEQSwgTSwgTiwgTk1BWAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsICogKSwgQUEoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEkxLCBJMiwgSTMsIElCRUcsIElFTkQsIElPRkYsIEosIEtLCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgR0VOLCBMT1dFUiwgU1lNLCBUUkksIFVOSVQsIFVQUEVSCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBTQkVHCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0JFRworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWCwgTUlOCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEdFTiA9IFRZUEUoIDE6IDEgKS5FUS4nRycKKyAgICAgIFNZTSA9IFRZUEUoIDE6IDEgKS5FUS4nUycKKyAgICAgIFRSSSA9IFRZUEUoIDE6IDEgKS5FUS4nVCcKKyAgICAgIFVQUEVSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ1UnCisgICAgICBMT1dFUiA9ICggU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidMJworICAgICAgVU5JVCA9IFRSSS5BTkQuRElBRy5FUS4nVScKKyoKKyogICAgIEdlbmVyYXRlIGRhdGEgaW4gYXJyYXkgQS4KKyoKKyAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICBETyAxMCBJID0gMSwgTQorICAgICAgICAgICAgSUYoIEdFTi5PUi4oIFVQUEVSLkFORC5JLkxFLkogKS5PUi4oIExPV0VSLkFORC5JLkdFLkogKSApCisgICAgICQgICAgICAgICAgVEhFTgorICAgICAgICAgICAgICAgSUYoICggSS5MRS5KLkFORC5KIC0gSS5MRS5LVSApLk9SLgorICAgICAkICAgICAgICAgICAgICggSS5HRS5KLkFORC5JIC0gSi5MRS5LTCApIClUSEVOCisgICAgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBTQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElGKCBJLk5FLkogKVRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIFRSSSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBBKCBKLCBKICkgKyBPTkUKKyAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IE9ORQorICAgMjAgQ09OVElOVUUKKyoKKyogICAgIFN0b3JlIGVsZW1lbnRzIGluIGFycmF5IEFTIGluIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHJvdXRpbmUuCisqCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nR0InIClUSEVOCisgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gNjAgSTEgPSAxLCBLVSArIDEgLSBKCisgICAgICAgICAgICAgICBBQSggSTEgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkyID0gSTEsIE1JTiggS0wgKyBLVSArIDEsIEtVICsgMSArIE0gLSBKICkKKyAgICAgICAgICAgICAgIEFBKCBJMiArICggSiAtIDEgKSpMREEgKSA9IEEoIEkyICsgSiAtIEtVIC0gMSwgSiApCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gODAgSTMgPSBJMiwgTERBCisgICAgICAgICAgICAgICBBQSggSTMgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTWScuT1IuVFlQRS5FUS4nVFInIClUSEVOCisgICAgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDEwMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTAwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgIDExMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTIwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDEyMCAgICAgICBDT05USU5VRQorICAxMzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NCJy5PUi5UWVBFLkVRLidUQicgKVRIRU4KKyAgICAgICAgIERPIDE3MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBLSyA9IEtMICsgMQorICAgICAgICAgICAgICAgSUJFRyA9IE1BWCggMSwgS0wgKyAyIC0gSiApCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wgKyAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSAyCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTUlOKCBLTCArIDEsIDEgKyBNIC0gSiApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE0MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTQwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSArIEogLSBLSywgSiApCisgIDE1MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTYwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE2MCAgICAgICBDT05USU5VRQorICAxNzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NQJy5PUi5UWVBFLkVRLidUUCcgKVRIRU4KKyAgICAgICAgIElPRkYgPSAwCisgICAgICAgICBETyAxOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTgwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBJT0ZGID0gSU9GRiArIDEKKyAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgIElGKCBJLkVRLkogKVRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBST0dVRQorICAgICAgICAgICAgICAgRU5EIElGCisgIDE4MCAgICAgICBDT05USU5VRQorICAxOTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU01BS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU01WQ0goIFRSQU5TLCBNLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEJFVEEsIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgSU5DWSwgTSwgTiwgTk1BWCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBNVgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCAqICksIEcoICogKSwgWCggKiApLCBZKCAqICksIFlUKCAqICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUkkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJTkNYTCwgSU5DWUwsIElZLCBKLCBKWCwgS1gsIEtZLCBNTCwgTkwKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBUUkFOCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIFNRUlQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICBNTCA9IE4KKyAgICAgICAgIE5MID0gTQorICAgICAgRUxTRQorICAgICAgICAgTUwgPSBNCisgICAgICAgICBOTCA9IE4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1guTFQuMCApVEhFTgorICAgICAgICAgS1ggPSBOTAorICAgICAgICAgSU5DWEwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1ggPSAxCisgICAgICAgICBJTkNYTCA9IDEKKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1kuTFQuMCApVEhFTgorICAgICAgICAgS1kgPSBNTAorICAgICAgICAgSU5DWUwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1kgPSAxCisgICAgICAgICBJTkNZTCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQgaW4gWVQgdXNpbmcgZGF0YSBpbiBBLCBYIGFuZCBZLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIElZID0gS1kKKyAgICAgIERPIDMwIEkgPSAxLCBNTAorICAgICAgICAgWVQoIElZICkgPSBaRVJPCisgICAgICAgICBHKCBJWSApID0gWkVSTworICAgICAgICAgSlggPSBLWAorICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDEwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEosIEkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUyggQSggSiwgSSApKlgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgRE8gMjAgSiA9IDEsIE5MCisgICAgICAgICAgICAgICBZVCggSVkgKSA9IFlUKCBJWSApICsgQSggSSwgSiApKlgoIEpYICkKKyAgICAgICAgICAgICAgIEcoIElZICkgPSBHKCBJWSApICsgQUJTKCBBKCBJLCBKICkqWCggSlggKSApCisgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWEwKKyAgIDIwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFlUKCBJWSApID0gQUxQSEEqWVQoIElZICkgKyBCRVRBKlkoIElZICkKKyAgICAgICAgIEcoIElZICkgPSBBQlMoIEFMUEhBICkqRyggSVkgKSArIEFCUyggQkVUQSpZKCBJWSApICkKKyAgICAgICAgIElZID0gSVkgKyBJTkNZTAorICAgMzAgQ09OVElOVUUKKyoKKyogICAgIENvbXB1dGUgdGhlIGVycm9yIHJhdGlvIGZvciB0aGlzIHJlc3VsdC4KKyoKKyAgICAgIEVSUiA9IFpFUk8KKyAgICAgIERPIDQwIEkgPSAxLCBNTAorICAgICAgICAgRVJSSSA9IEFCUyggWVQoIEkgKSAtIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkgKS9FUFMKKyAgICAgICAgIElGKCBHKCBJICkuTkUuWkVSTyApCisgICAgICQgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuT05FICkKKyAgICAgJCAgICAgIEdPIFRPIDUwCisgICA0MCBDT05USU5VRQorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDcwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgICA1MCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gNjAgSSA9IDEsIE1MCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBZVCggSSApLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSwgWVQoSSkKKyAgICAgICAgIEVORCBJRgorICAgNjAgQ09OVElOVUUKKyoKKyAgIDcwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gQ09NUFVURUQgUkVTVUxUIElTIExFU1MgVEhBTiBIQUwnLAorICAgICAkICAgICAgJ0YgQUNDVVJBVEUgKioqKioqKicsIC8nICAgICAgICAgICBFWFBFQ1RFRCBSRVNVTFQgICBDT01QVScsCisgICAgICQgICAgICAnVEVEIFJFU1VMVCcgKQorIDk5OTggRk9STUFUKCAxWCwgSTcsIDJHMTguNiApCisqCisqICAgICBFbmQgb2YgU01WQ0guCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTFNFKCBSSSwgUkosIExSICkKKyoKKyogIFRlc3RzIGlmIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExSCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSSSggKiApLCBSSiggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAxMCBJID0gMSwgTFIKKyAgICAgICAgIElGKCBSSSggSSApLk5FLlJKKCBJICkgKQorICAgICAkICAgICAgR08gVE8gMjAKKyAgIDEwIENPTlRJTlVFCisgICAgICBMU0UgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDMwCisgICAyMCBDT05USU5VRQorICAgICAgTFNFID0gLkZBTFNFLgorICAgMzAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTFNFLgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExTRVJFUyggVFlQRSwgVVBMTywgTSwgTiwgQUEsIEFTLCBMREEgKQorKgorKiAgVGVzdHMgaWYgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdHdvIGFycmF5cyBhcmUgZXF1YWwuCisqCisqICBUWVBFIGlzICdHRScsICdTWScgb3IgJ1NQJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExEQSwgTSwgTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBQSggTERBLCAqICksIEFTKCBMREEsICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElCRUcsIElFTkQsIEoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBVUFBFUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMTAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDEwICAgICAgIENPTlRJTlVFCisgICAyMCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU1knIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAzMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyoKKyAgICAgIExTRVJFUyA9IC5UUlVFLgorICAgICAgR08gVE8gODAKKyAgIDcwIENPTlRJTlVFCisgICAgICBMU0VSRVMgPSAuRkFMU0UuCisgICA4MCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMU0VSRVMuCisqCisgICAgICBFTkQKKyAgICAgIFJFQUwgRlVOQ1RJT04gU0JFRyggUkVTRVQgKQorKgorKiAgR2VuZXJhdGVzIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seSBkaXN0cmlidXRlZCBiZXR3ZWVuIC0wLjUgYW5kIDAuNS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBTYXZlIHN0YXRlbWVudCAuLgorICAgICAgU0FWRSAgICAgICAgICAgICAgIEksIElDLCBNSQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIFJFQUwKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBJID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIGlzIGJvdW5kZWQgYmV0d2VlbiAxIGFuZCA5OTkuCisqICAgICBJZiBpbml0aWFsIEkgPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgPSA1LCB0aGUgcGVyaW9kIHdpbGwgYmUgMTAuCisqICAgICBJQyBpcyB1c2VkIHRvIGJyZWFrIHVwIHRoZSBwZXJpb2QgYnkgc2tpcHBpbmcgMSB2YWx1ZSBvZiBJIGluIDYuCisqCisgICAgICBJQyA9IElDICsgMQorICAgMTAgSSA9IEkqTUkKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBTQkVHID0gUkVBTCggSSAtIDUwMCApLzEwMDEuMAorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU0JFRy4KKyoKKyAgICAgIEVORAorICAgICAgUkVBTCBGVU5DVElPTiBTRElGRiggWCwgWSApCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFgsIFkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgU0RJRkYgPSBYIC0gWQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU0RJRkYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisqICBUZXN0cyB3aGV0aGVyIFhFUkJMQSBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3Igd2hlbiBpdCBzaG91bGQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMiBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GTworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VULCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIExFUlIgPSAuVFJVRS4KKyAgICAgIElGKCBJTkZPLk5FLklORk9UIClUSEVOCisgICAgICAgICBJRiggSU5GT1QuTkUuMCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk8sIElORk9UCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSU5GTworICAgICAgICAgRU5EIElGCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIFNSTkFNRS5ORS5TUk5BTVQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTUUsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsICcgSU5TVEVBRCcsCisgICAgICQgICAgICAnIE9GICcsIEkyLCAnICoqKioqKionICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggU1JOQU1FID0gJywgQTYsICcgSU5TVEUnLAorICAgICAkICAgICAgJ0FEIE9GICcsIEE2LCAnICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LAorICAgICAkICAgICAgJyAqKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWEVSQkxBCisqCisgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3NibGF0My5kYXQgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQzLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBlNzM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3NibGF0My5kYXQKQEAgLTAsMCArMSwyMCBAQAorJ3NibGF0My5zdW1tJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCis2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKydzYmxhdDMuc25hcCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKy0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCiswIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorMC4wIDEuMCAwLjcgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKzAuMCAxLjAgMS4zICAgICAgIFZBTFVFUyBPRiBCRVRBCitTR0VNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NZTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUUk1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTVFJTTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTWVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3Rpbmcvc2JsYXQzLmYgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5MjY5NgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9zYmxhdDMuZgpAQCAtMCwwICsxLDI4NzMgQEAKKyo+IFxicmllZiBcYiBTQkxBVDMKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFBST0dSQU0gU0JMQVQzCisqIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFJFQUwgICAgICAgICAgICAgTGV2ZWwgMyBCbGFzLgorKj4KKyo+IFRoZSBwcm9ncmFtIG11c3QgYmUgZHJpdmVuIGJ5IGEgc2hvcnQgZGF0YSBmaWxlLiBUaGUgZmlyc3QgMTQgcmVjb3JkcworKj4gb2YgdGhlIGZpbGUgYXJlIHJlYWQgdXNpbmcgbGlzdC1kaXJlY3RlZCBpbnB1dCwgdGhlIGxhc3QgNiByZWNvcmRzCisqPiBhcmUgcmVhZCB1c2luZyB0aGUgZm9ybWF0ICggQTYsIEwyICkuIEFuIGFubm90YXRlZCBleGFtcGxlIG9mIGEgZGF0YQorKj4gZmlsZSBjYW4gYmUgb2J0YWluZWQgYnkgZGVsZXRpbmcgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBmcm9tIHRoZQorKj4gZm9sbG93aW5nIDIwIGxpbmVzOgorKj4gJ3NibGF0My5vdXQnICAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCisqPiA2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyo+ICdTQkxBVDMuU05BUCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKyo+IC0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorKj4gVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisqPiAxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworKj4gNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCisqPiAwIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKj4gMC4wIDEuMCAwLjcgICAgICAgVkFMVUVTIE9GIEFMUEhBCisqPiAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKyo+IDAuMCAxLjAgMS4zICAgICAgIFZBTFVFUyBPRiBCRVRBCisqPiBTR0VNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1NZTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNUUk1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBTVFJTTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gU1NZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFNTWVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPgorKj4gRnVydGhlciBEZXRhaWxzCisqPiA9PT09PT09PT09PT09PT0KKyo+CisqPiBTZWU6CisqPgorKj4gICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIER1ZmYgSS4gUy4gYW5kIEhhbW1hcmxpbmcgUy4KKyo+ICAgIEEgU2V0IG9mIExldmVsIDMgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqPgorKj4gICAgVGVjaG5pY2FsIE1lbW9yYW5kdW0gTm8uODggKFJldmlzaW9uIDEpLCBNYXRoZW1hdGljcyBhbmQKKyo+ICAgIENvbXB1dGVyIFNjaWVuY2UgRGl2aXNpb24sIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeSwgOTcwMAorKj4gICAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyo+CisqPiAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyo+ICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyo+ICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKj4gICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyo+ICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKj4KKyo+ICAgIDEwLTktMDA6ICBDaGFuZ2UgU1RBVFVTPSdORVcnIHRvICdVTktOT1dOJyBzbyB0aGF0IHRoZSB0ZXN0ZXJzCisqPiAgICAgICAgICAgICAgY2FuIGJlIHJ1biBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGRlbGV0aW5nIGdlbmVyYXRlZAorKj4gICAgICAgICAgICAgIG91dHB1dCBmaWxlcyAoc3VzYW4pCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBzaW5nbGVfYmxhc190ZXN0aW5nCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFBST0dSQU0gU0JMQVQzCisqCisqICAtLSBSZWZlcmVuY2UgQkxBUyB0ZXN0IHJvdXRpbmUgKHZlcnNpb24gMy40LjEpIC0tCisqICAtLSBSZWZlcmVuY2UgQkxBUyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklOCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSU4gPSA1ICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOU1VCUworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTlNVQlMgPSA2ICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1ICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSURNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSURNQVggPSA5LCBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIE5NQVgsIDIqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQlMoIE5NQVgqTk1BWCApLCBDKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0MoIE5NQVgqTk1BWCApLCBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgRyggTk1BWCApLCBXKCAyKk5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0RJRkYsIExTRQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTQ0hLMSwgU0NISzIsIFNDSEszLCBTQ0hLNCwgU0NISzUsIFNDSEtFLCBTTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgU05BTUVTLydTR0VNTSAnLCAnU1NZTU0gJywgJ1NUUk1NICcsICdTVFJTTSAnLAorICAgICAkICAgICAgICAgICAgICAgICAgICdTU1lSSyAnLCAnU1NZUjJLJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUyApCisgICAgICBFTkQgSUYKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHJld2luZGluZyBvZiB0aGUgc25hcHNob3QgZmlsZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApUkVXSQorICAgICAgUkVXSSA9IFJFV0kuQU5ELlRSQUNFCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyBzdG9wcGluZyBvbiBhbnkgZmFpbHVyZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU0ZBVEFMCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgZXhpdHMgYXJlIHRvIGJlIHRlc3RlZC4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVFNURVJSCisqICAgICBSZWFkIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgdGhlIHRlc3QgcmF0aW8KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVEhSRVNICisqCisqICAgICBSZWFkIGFuZCBjaGVjayB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHRlc3RzLgorKgorKiAgICAgVmFsdWVzIG9mIE4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklESU0KKyAgICAgIElGKCBOSURJTS5MVC4xLk9SLk5JRElNLkdULk5JRE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdOJywgTklETUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIERPIDEwIEkgPSAxLCBOSURJTQorICAgICAgICAgSUYoIElESU0oIEkgKS5MVC4wLk9SLklESU0oIEkgKS5HVC5OTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApTk1BWAorICAgICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgIDEwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODQgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyAyMCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICAyMCBDT05USU5VRQorICAgMzAgUkVBRCggTklOLCBGTVQgPSA5OTg4LCBFTkQgPSA2MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDQwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwIClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDUwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDMwCisqCisgICA2MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgU01NQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEwMCBKID0gMSwgTgorICAgICAgICAgRE8gOTAgSSA9IDEsIE4KKyAgICAgICAgICAgIEFCKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgICA5MCAgICBDT05USU5VRQorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBKCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IEoKKyAgICAgICAgIEMoIEosIDEgKSA9IFpFUk8KKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMTAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDExMCBDT05USU5VRQorKiAgICAgQ0MgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIFNNTUNIIENUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IFNNTUNILgorICAgICAgVFJBTlNBID0gJ04nCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgU01NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMU0UoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOU0IgPSAnVCcKKyAgICAgIENBTEwgU01NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMU0UoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyAgICAgICAgIEFCKCBKLCBOTUFYICsgMSApID0gTiAtIEogKyAxCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IE4gLSBKICsgMQorICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgQ0MoIE4gLSBKICsgMSApID0gSiooICggSiArIDEgKSpKICkvMiAtCisgICAgICQgICAgICAgICAgICAgICAgICAgICAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisgICAgICBUUkFOU0EgPSAnVCcKKyAgICAgIFRSQU5TQiA9ICdOJworICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExTRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdUJworICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExTRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMDAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg3IClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgU0NIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE1MCwgMTYwLCAxNjAsIDE3MCwgMTgwIClJU05VTQorKiAgICAgICAgICAgVGVzdCBTR0VNTSwgMDEuCisgIDE0MCAgICAgICBDQUxMIFNDSEsxKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgU1NZTU0sIDAyLgorICAxNTAgICAgICAgQ0FMTCBTQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFNUUk1NLCAwMywgU1RSU00sIDA0LgorICAxNjAgICAgICAgQ0FMTCBTQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQUIsCisgICAgICQgICAgICAgICAgICAgICAgICBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIENULCBHLCBDICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBTU1lSSywgMDUuCisgIDE3MCAgICAgICBDQUxMIFNDSEs0KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgU1NZUjJLLCAwNi4KKyAgMTgwICAgICAgIENBTEwgU0NISzUoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyoKKyAgMTkwICAgICAgIElGKCBGQVRBTC5BTkQuU0ZBVEFMICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIxMAorICAgICAgICAgRU5EIElGCisgIDIwMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODYgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIxMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKQorICAgICAgR08gVE8gMjMwCisqCisgIDIyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTEgKQorKgorICAyMzAgQ09OVElOVUUKKyAgICAgIElGKCBUUkFDRSApCisgICAgICQgICBDTE9TRSAoIE5UUkEgKQorICAgICAgQ0xPU0UgKCBOT1VUICkKKyAgICAgIFNUT1AKKyoKKyA5OTk5IEZPUk1BVCggJyBST1VUSU5FUyBQQVNTIENPTVBVVEFUSU9OQUwgVEVTVFMgSUYgVEVTVCBSQVRJTyBJUyBMRVMnLAorICAgICAkICAgICAgJ1MgVEhBTicsIEY4LjIgKQorIDk5OTggRk9STUFUKCAnIFJFTEFUSVZFIE1BQ0hJTkUgUFJFQ0lTSU9OIElTIFRBS0VOIFRPIEJFJywgMVAsIEU5LjEgKQorIDk5OTcgRk9STUFUKCAnIE5VTUJFUiBPRiBWQUxVRVMgT0YgJywgQSwgJyBJUyBMRVNTIFRIQU4gMSBPUiBHUkVBVEVSICcsCisgICAgICQgICAgICAnVEhBTiAnLCBJMiApCisgOTk5NiBGT1JNQVQoICcgVkFMVUUgT0YgTiBJUyBMRVNTIFRIQU4gMCBPUiBHUkVBVEVSIFRIQU4gJywgSTIgKQorIDk5OTUgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBSRUFMICAgICAgICAgICAgIExFVkVMIDMgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5NCBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkzIEZPUk1BVCggJyAgIEZPUiBBTFBIQSAgICAgICAgICAnLCA3RjYuMSApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywgN0Y2LjEgKQorIDk5OTEgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTkwIEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg5IEZPUk1BVCggJyBFUlJPUiBJTiBTTU1DSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBTTU1DSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlNBID0gJywgQTEsCisgICAgICQgICAgICAnIEFORCBUUkFOU0IgPSAnLCBBMSwgLycgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgJywKKyAgICAgJCAgICAgICdFUlIgPSAnLCBGMTIuMywgJy4nLCAvJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSAnLAorICAgICAkICAgICAgJ0FSSVRITUVUSUMgT1IgVEhFIENPTVBJTEVSLicsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICcsCisgICAgICQgICAgICAnKioqKioqKicgKQorIDk5ODggRk9STUFUKCBBNiwgTDIgKQorIDk5ODcgRk9STUFUKCAxWCwgQTYsICcgV0FTIE5PVCBURVNURUQnICkKKyA5OTg2IEZPUk1BVCggLycgRU5EIE9GIFRFU1RTJyApCisgOTk4NSBGT1JNQVQoIC8nICoqKioqKiogRkFUQUwgRVJST1IgLSBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODQgRk9STUFUKCAnIEVSUk9SLUVYSVRTIFdJTEwgTk9UIEJFIFRFU1RFRCcgKQorKgorKiAgICAgRW5kIG9mIFNCTEFUMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLMSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBTR0VNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDQSwgSUNCLCBJSywgSU0sIElOLCBLLCBLUywgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgIE1BLCBNQiwgTVMsIE4sIE5BLCBOQVJHUywgTkIsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOQSwgVFJBTkIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOQVMsIFRSQU5CUywgVFJBTlNBLCBUUkFOU0IKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNHRU1NLCBTTUFLRSwgU01NQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydOVEMnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEzCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMTAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ0EgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOU0EgPSBJQ0goIElDQTogSUNBICkKKyAgICAgICAgICAgICAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisqCisgICAgICAgICAgICAgICAgICBJRiggVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNQSA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDQiA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQiA9IElDSCggSUNCOiBJQ0IgKQorICAgICAgICAgICAgICAgICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IEsKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CID0gSworICAgICAgICAgICAgICAgICAgICAgICAgTkIgPSBOCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgICAgTERCID0gTUIKKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBHTyBUTyA3MAorICAgICAgICAgICAgICAgICAgICAgTEJCID0gTERCKk5CCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUIsIE5CLCBCLCBOTUFYLCBCQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkJTID0gVFJBTlNCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLCBMREEsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TQS5FUS5UUkFOQVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU0IuRVEuVFJBTkJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMU0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExTRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMU0VSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSwgTk1BWCwgQiwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIE5NQVgsIENULCBHLCBDQywgTERDLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnJycsIEExLCAnJycsJywKKyAgICAgJCAgICAgIDMoIEkzLCAnLCcgKSwgRjQuMSwgJywgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLCAnLCAnLAorICAgICAkICAgICAgJ0MsJywgSTMsICcpLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzEuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzIoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgU1NZTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1MsIElDVSwgSU0sIElOLCBMQUEsIExCQiwgTENDLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sIE1TLCBOLCBOQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBTSURFLCBTSURFUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hTLCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01NQ0gsIFNTWU1NCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFMvJ0xSJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgTkFSR1MgPSAxMgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTAwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyA5MCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorKiAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREIgPSBNCisgICAgICAgICAgICBJRiggTERCLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERCID0gTERCICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERCLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisqCisqICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwgQkIsIExEQiwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBaRVJPICkKKyoKKyAgICAgICAgICAgIERPIDgwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyoKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBzeW1tZXRyaWMgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnU1knLCBVUExPLCAnICcsIE5BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEMsIE5NQVgsIENDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTSURFUyA9IFNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBVUExPLCBNLCBOLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NZTU0oIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gU0lERVMuRVEuU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExTRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMU0VSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goICdOJywgJ04nLCBNLCBOLCBNLCBBTFBIQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEIsIE5NQVgsIEJFVEEsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVCwgRywgQ0MsIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goICdOJywgJ04nLCBNLCBOLCBOLCBBTFBIQSwgQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEEsIE5NQVgsIEJFVEEsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVCwgRywgQ0MsIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTIwCisqCisgIDExMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLCBVUExPLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgTERCLCBCRVRBLCBMREMKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgRjQuMSwgJywgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLCAnLCBDLCcsIEkzLCAnKSAgICcsCisgICAgICQgICAgICAnIC4nICkKKyA5OTk0IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEsyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEszKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5NQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIEIsIEJCLCBCUywgQ1QsIEcsIEMgKQorKgorKiAgVGVzdHMgU1RSTU0gYW5kIFNUUlNNLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUNELCBJQ1MsIElDVCwgSUNVLCBJTSwgSU4sIEosIExBQSwgTEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTERCLCBMREJTLCBNLCBNUywgTiwgTkEsIE5BUkdTLCBOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFNJREUsIFNJREVTLCBUUkFOQVMsIFRSQU5TQSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSEQsIElDSFMsIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01NQ0gsIFNUUk1NLCBTVFJTTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hVLydVTCcvLCBJQ0hULydOVEMnLywgSUNIRC8nVU4nLywgSUNIUy8nTFInLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDExCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqICAgICBTZXQgdXAgemVybyBtYXRyaXggZm9yIFNNTUNILgorICAgICAgRE8gMjAgSiA9IDEsIE5NQVgKKyAgICAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICAgICBDKCBJLCBKICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgMjAgQ09OVElOVUUKKyoKKyAgICAgIERPIDE0MCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisgICAgICAgICAgICBOVUxMID0gTS5MRS4wLk9SLk4uTEUuMAorKgorICAgICAgICAgICAgRE8gMTIwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDkwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnVFInLCBVUExPLCBESUFHLCBOQSwgTkEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQVMgPSBUUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQUdTID0gRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwgTiwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1RSU00oIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIEFMUEhBLCBBQSwgTERBLCBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gVFJBTkFTLkVRLlRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IERJQUdTLkVRLkRJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMU0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFNFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEJTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREJTLkVRLkxEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQiwgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEMsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQkIoIEkgKyAoIEogLSAxICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIoIEkgKyAoIEogLSAxICkqTERCICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEksIEogKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCAnTicsIE0sIE4sIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEsIE5NQVgsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEMsIE5NQVgsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgIE4sIEFMUEhBLCBMREEsIExEQgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDQoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnKSAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzQoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgU1NZUksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCRVRTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBLLCBLUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMQUEsIExDQywgTERBLCBMREFTLCBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTU1DSCwgU1NZUksKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVC8nTlRDJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgTkFSR1MgPSAxMAorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQyA9IE4KKyAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICBETyA5MCBJSyA9IDEsIE5JRElNCisgICAgICAgICAgICBLID0gSURJTSggSUsgKQorKgorICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBNQSA9IE4KKyAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisgICAgICAgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdTWScsIFVQTE8sICcgJywgTiwgTiwgQywgTk1BWCwgQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNTWVJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBDQywgTERDICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNTLkVRLlRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMU0UoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMU0VSRVMoICdTWScsIFVQTE8sIE4sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCAnVCcsICdOJywgTEosIDEsIEssIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggMSwgSkogKSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIDEsIEogKSwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goICdOJywgJ1QnLCBMSiwgMSwgSywgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCBKSiwgMSApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggSiwgMSApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICBMREEsIEJFVEEsIExEQworKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLNC4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLNSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBQiwgQUEsIEFTLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcsIFcgKQorKgorKiAgVGVzdHMgU1NZUjJLLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIDIqTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxGICksIEFTKCBOTUFYKk5NQVggKSwgQkIoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFcoIDIqTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMsIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEpKQUIsCisgICAgICQgICAgICAgICAgICAgICAgICAgSywgS1MsIExBQSwgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTU1DSCwgU1NZUjJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFQvJ05UQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTIKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEzMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREMgPSBOCisgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTMwCisgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgTlVMTCA9IE4uTEUuMAorKgorICAgICAgICAgRE8gMTIwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyAxMTAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBNQSA9IE4KKyAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiwgMipOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgIExEQiA9IExEQQorICAgICAgICAgICAgICAgTEJCID0gTEFBCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIoIEsgKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLKk5NQVggKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDEwMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gOTAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gODAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnU1knLCBVUExPLCAnICcsIE4sIE4sIEMsIE5NQVgsIENDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NZUjJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TUy5FUS5UUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExTRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMU0VSRVMoICdTWScsIFVQTE8sIE4sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBQiggKCBKIC0gMSApKjIqTk1BWCArIEsgKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gQUIoICggSiAtIDEgKSoyKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goICdUJywgJ04nLCBMSiwgMSwgMipLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEFCKCBKSkFCICksIDIqTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcsIDIqTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBQiggKCBLICsgSSAtIDEgKSpOTUFYICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCAnTicsIExKLCAxLCAyKkssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQUIoIEpKICksIE5NQVgsIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJFVEEsIEMoIEpKLCBKICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDVCwgRywgQ0MoIEpDICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKQUIgPSBKSkFCICsgMipOTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgQ09OVElOVUUKKyoKKyAgMTMwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICBMREEsIExEQiwgQkVUQSwgTERDCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsIEIsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAnLAorICAgICAkICAgICAgJyAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLRSggSVNOVU0sIFNSTkFNVCwgTk9VVCApCisqCisqICBUZXN0cyB0aGUgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMyBCbGFzLgorKiAgUmVxdWlyZXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIGVycm9yLWhhbmRsaW5nIHJvdXRpbmUgWEVSQkxBLgorKiAgQSwgQiBhbmQgQyBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAzLTE5LTkyOiAgSW5pdGlhbGl6ZSBBTFBIQSBhbmQgQkVUQSAgKGVjYSkKKyogIDMtMTktOTI6ICBGaXggYXJndW1lbnQgMTIgaW4gY2FsbHMgdG8gU1NZTU0gd2l0aCBJTkZPVCA9IDkgIChlY2EpCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBPTkUsIFRXTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRTAsIFRXTyA9IDIuMEUwICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggMiwgMSApLCBCKCAyLCAxICksIEMoIDIsIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIFNHRU1NLCBTU1lNTSwgU1NZUjJLLCBTU1lSSywgU1RSTU0sCisgICAgICQgICAgICAgICAgICAgICAgICAgU1RSU00KKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyoKKyogICAgIEluaXRpYWxpemUgQUxQSEEgYW5kIEJFVEEuCisqCisgICAgICBBTFBIQSA9IE9ORQorICAgICAgQkVUQSA9IFRXTworKgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNHRU1NKCAnLycsICdOJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBTR0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnTicsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNHRU1NKCAnTicsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ1QnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnTicsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ1QnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNUUk1NKCAnLycsICdVJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJy8nLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnVScsICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ04nLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBTVFJTTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDcwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWVJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgICA3MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgT05FID0gMS4wICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAtMS4wRTEwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4sIE5NQVgKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCAqICksIEFBKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgR0VOLCBMT1dFUiwgU1lNLCBUUkksIFVOSVQsIFVQUEVSCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBTQkVHCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0JFRworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBHRU4gPSBUWVBFLkVRLidHRScKKyAgICAgIFNZTSA9IFRZUEUuRVEuJ1NZJworICAgICAgVFJJID0gVFlQRS5FUS4nVFInCisgICAgICBVUFBFUiA9ICggU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidVJworICAgICAgTE9XRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nTCcKKyAgICAgIFVOSVQgPSBUUkkuQU5ELkRJQUcuRVEuJ1UnCisqCisqICAgICBHZW5lcmF0ZSBkYXRhIGluIGFycmF5IEEuCisqCisgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIElGKCBHRU4uT1IuKCBVUFBFUi5BTkQuSS5MRS5KICkuT1IuKCBMT1dFUi5BTkQuSS5HRS5KICkgKQorICAgICAkICAgICAgICAgIFRIRU4KKyAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFNCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIElGKCBJLk5FLkogKVRIRU4KKyogICAgICAgICAgICAgICAgIFNldCBzb21lIGVsZW1lbnRzIHRvIHplcm8KKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjMuQU5ELkouRVEuTi8yICkKKyAgICAgJCAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIFRSSSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBBKCBKLCBKICkgKyBPTkUKKyAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IE9ORQorICAgMjAgQ09OVElOVUUKKyoKKyogICAgIFN0b3JlIGVsZW1lbnRzIGluIGFycmF5IEFTIGluIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHJvdXRpbmUuCisqCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU1knLk9SLlRZUEUuRVEuJ1RSJyApVEhFTgorICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDYwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDgwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU01BS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU01NQ0goIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLSywgQUxQSEEsIEEsIExEQSwgQiwgTERCLAorICAgICAkICAgICAgICAgICAgICAgICAgQkVUQSwgQywgTERDLCBDVCwgRywgQ0MsIExEQ0MsIEVQUywgRVJSLCBGQVRBTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5PVVQsIE1WICkKKyoKKyogIENoZWNrcyB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcHV0YXRpb25hbCB0ZXN0cy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBPTkUgPSAxLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBCRVRBLCBFUFMsIEVSUgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEtLLCBMREEsIExEQiwgTERDLCBMRENDLCBNLCBOLCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIE1WCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlNBLCBUUkFOU0IKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIExEQSwgKiApLCBCKCBMREIsICogKSwgQyggTERDLCAqICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0MoIExEQ0MsICogKSwgQ1QoICogKSwgRyggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSSQorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEosIEsKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBUUkFOQSwgVFJBTkIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgU1FSVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBUUkFOQSA9IFRSQU5TQS5FUS4nVCcuT1IuVFJBTlNBLkVRLidDJworICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyoKKyogICAgIENvbXB1dGUgZXhwZWN0ZWQgcmVzdWx0LCBvbmUgY29sdW1uIGF0IGEgdGltZSwgaW4gQ1QgdXNpbmcgZGF0YQorKiAgICAgaW4gQSwgQiBhbmQgQy4KKyogICAgIENvbXB1dGUgZ2F1Z2VzIGluIEcuCisqCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyoKKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBDVCggSSApID0gWkVSTworICAgICAgICAgICAgRyggSSApID0gWkVSTworICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCAuTk9ULlRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyAzMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSSwgSyApICkqQUJTKCBCKCBLLCBKICkgKQorICAgMjAgICAgICAgICAgQ09OVElOVUUKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTFNFIElGKCBUUkFOQS5BTkQuLk5PVC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gNTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMoIEEoIEssIEkgKSApKkFCUyggQiggSywgSiApICkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisgICA1MCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggLk5PVC5UUkFOQS5BTkQuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDcwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSSwgSyApKkIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTKCBBKCBJLCBLICkgKSpBQlMoIEIoIEosIEsgKSApCisgICA2MCAgICAgICAgICBDT05USU5VRQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIFRSQU5BLkFORC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gOTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMoIEEoIEssIEkgKSApKkFCUyggQiggSiwgSyApICkKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisgICA5MCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBETyAxMDAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBBTFBIQSpDVCggSSApICsgQkVUQSpDKCBJLCBKICkKKyAgICAgICAgICAgIEcoIEkgKSA9IEFCUyggQUxQSEEgKSpHKCBJICkgKyBBQlMoIEJFVEEgKSpBQlMoIEMoIEksIEogKSApCisgIDEwMCAgICBDT05USU5VRQorKgorKiAgICAgICAgQ29tcHV0ZSB0aGUgZXJyb3IgcmF0aW8gZm9yIHRoaXMgcmVzdWx0LgorKgorICAgICAgICAgRVJSID0gWkVSTworICAgICAgICAgRE8gMTEwIEkgPSAxLCBNCisgICAgICAgICAgICBFUlJJID0gQUJTKCBDVCggSSApIC0gQ0MoIEksIEogKSApL0VQUworICAgICAgICAgICAgSUYoIEcoIEkgKS5ORS5aRVJPICkKKyAgICAgJCAgICAgICAgIEVSUkkgPSBFUlJJL0coIEkgKQorICAgICAgICAgICAgRVJSID0gTUFYKCBFUlIsIEVSUkkgKQorICAgICAgICAgICAgSUYoIEVSUipTUVJUKCBFUFMgKS5HRS5PTkUgKQorICAgICAkICAgICAgICAgR08gVE8gMTMwCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyAxNTAKKyoKKyogICAgIFJlcG9ydCBmYXRhbCBlcnJvci4KKyoKKyAgMTMwIEZBVEFMID0gLlRSVUUuCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApCisgICAgICBETyAxNDAgSSA9IDEsIE0KKyAgICAgICAgIElGKCBNViApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIENUKCBJICksIENDKCBJLCBKICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBDQyggSSwgSiApLCBDVCggSSApCisgICAgICAgICBFTkQgSUYKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClKCisqCisgIDE1MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIENPTVBVVEVEIFJFU1VMVCBJUyBMRVNTIFRIQU4gSEFMJywKKyAgICAgJCAgICAgICdGIEFDQ1VSQVRFICoqKioqKionLCAvJyAgICAgICAgICAgRVhQRUNURUQgUkVTVUxUICAgQ09NUFUnLAorICAgICAkICAgICAgJ1RFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyRzE4LjYgKQorIDk5OTcgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorKgorKiAgICAgRW5kIG9mIFNNTUNILgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExTRSggUkksIFJKLCBMUiApCisqCisqICBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExSCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSSSggKiApLCBSSiggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAxMCBJID0gMSwgTFIKKyAgICAgICAgIElGKCBSSSggSSApLk5FLlJKKCBJICkgKQorICAgICAkICAgICAgR08gVE8gMjAKKyAgIDEwIENPTlRJTlVFCisgICAgICBMU0UgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDMwCisgICAyMCBDT05USU5VRQorICAgICAgTFNFID0gLkZBTFNFLgorICAgMzAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTFNFLgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExTRVJFUyggVFlQRSwgVVBMTywgTSwgTiwgQUEsIEFTLCBMREEgKQorKgorKiAgVGVzdHMgaWYgc2VsZWN0ZWQgZWxlbWVudHMgaW4gdHdvIGFycmF5cyBhcmUgZXF1YWwuCisqCisqICBUWVBFIGlzICdHRScgb3IgJ1NZJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTWScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgICAgTFNFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExTRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExTRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgUkVBTCBGVU5DVElPTiBTQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDLCBNSQorKiAgICAgLi4gU2F2ZSBzdGF0ZW1lbnQgLi4KKyAgICAgIFNBVkUgICAgICAgICAgICAgICBJLCBJQywgTUkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBJID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIGlzIGJvdW5kZWQgYmV0d2VlbiAxIGFuZCA5OTkuCisqICAgICBJZiBpbml0aWFsIEkgPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgPSA1LCB0aGUgcGVyaW9kIHdpbGwgYmUgMTAuCisqICAgICBJQyBpcyB1c2VkIHRvIGJyZWFrIHVwIHRoZSBwZXJpb2QgYnkgc2tpcHBpbmcgMSB2YWx1ZSBvZiBJIGluIDYuCisqCisgICAgICBJQyA9IElDICsgMQorICAgMTAgSSA9IEkqTUkKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBTQkVHID0gKCBJIC0gNTAwICkvMTAwMS4wCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTQkVHLgorKgorICAgICAgRU5ECisgICAgICBSRUFMIEZVTkNUSU9OIFNESUZGKCBYLCBZICkKKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCwgWQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFggLSBZCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTRElGRi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyogIFRlc3RzIHdoZXRoZXIgWEVSQkxBIGhhcyBkZXRlY3RlZCBhbiBlcnJvciB3aGVuIGl0IHNob3VsZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggLk5PVC5MRVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GT1QsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKiBJTExFR0FMIFZBTFVFIE9GIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgTk9UIEQnLAorICAgICAkICAgICAgJ0VURUNURUQgQlkgJywgQTYsICcgKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDSEtYRVIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWEVSQkxBKCBTUk5BTUUsIElORk8gKQorKgorKiAgVGhpcyBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgdG8gYmUgdXNlZCBvbmx5IGFzIHBhcnQgb2YKKyogIHRoZSB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMyBCTEFTCisqICByb3V0aW5lcy4KKyoKKyogIFhFUkJMQSAgaXMgYW4gZXJyb3IgaGFuZGxlciBmb3IgdGhlIExldmVsIDMgQkxBUyByb3V0aW5lcy4KKyoKKyogIEl0IGlzIGNhbGxlZCBieSB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzIGlmIGFuIGlucHV0IHBhcmFtZXRlciBpcworKiAgaW52YWxpZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GTworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VULCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIExFUlIgPSAuVFJVRS4KKyAgICAgIElGKCBJTkZPLk5FLklORk9UIClUSEVOCisgICAgICAgICBJRiggSU5GT1QuTkUuMCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk8sIElORk9UCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSU5GTworICAgICAgICAgRU5EIElGCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIFNSTkFNRS5ORS5TUk5BTVQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTUUsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsICcgSU5TVEVBRCcsCisgICAgICQgICAgICAnIE9GICcsIEkyLCAnICoqKioqKionICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggU1JOQU1FID0gJywgQTYsICcgSU5TVEUnLAorICAgICAkICAgICAgJ0FEIE9GICcsIEE2LCAnICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LAorICAgICAkICAgICAgJyAqKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWEVSQkxBCisqCisgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3pibGF0MS5mIGIvYmxhcy90ZXN0aW5nL3pibGF0MS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDExMmMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvemJsYXQxLmYKQEAgLTAsMCArMSw3MjQgQEAKKyo+IFxicmllZiBcYiBaQkxBVDEKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFBST0dSQU0gWkJMQVQxCisqIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+ICAgIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIENPTVBMRVgqMTYgTGV2ZWwgMSBCTEFTLgorKj4KKyo+ICAgIEJhc2VkIHVwb24gdGhlIG9yaWdpbmFsIEJMQVMgdGVzdCByb3V0aW5lIHRvZ2V0aGVyIHdpdGg6CisqPiAgICBGMDZHQUYgRXhhbXBsZSBQcm9ncmFtIFRleHQKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXgxNl9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBaQkxBVDEKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIElDCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBDSEVDSzEsIENIRUNLMiwgSEVBREVSCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBTRkFDLzkuNzY1NjI1RC00LworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIERPIDIwIElDID0gMSwgMTAKKyAgICAgICAgIElDQVNFID0gSUMKKyAgICAgICAgIENBTEwgSEVBREVSCisqCisqICAgICAgICBJbml0aWFsaXplIFBBU1MsIElOQ1gsIElOQ1ksIGFuZCBNT0RFIGZvciBhIG5ldyBjYXNlLgorKiAgICAgICAgVGhlIHZhbHVlIDk5OTkgZm9yIElOQ1gsIElOQ1kgb3IgTU9ERSB3aWxsIGFwcGVhciBpbiB0aGUKKyogICAgICAgIGRldGFpbGVkICBvdXRwdXQsIGlmIGFueSwgZm9yIGNhc2VzIHRoYXQgZG8gbm90IGludm9sdmUKKyogICAgICAgIHRoZXNlIHBhcmFtZXRlcnMuCisqCisgICAgICAgICBQQVNTID0gLlRSVUUuCisgICAgICAgICBJTkNYID0gOTk5OQorICAgICAgICAgSU5DWSA9IDk5OTkKKyAgICAgICAgIE1PREUgPSA5OTk5CisgICAgICAgICBJRiAoSUNBU0UuTEUuNSkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzIoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkdFLjYpIFRIRU4KKyAgICAgICAgICAgIENBTEwgQ0hFQ0sxKFNGQUMpCisgICAgICAgICBFTkQgSUYKKyogICAgICAgIC0tIFByaW50CisgICAgICAgICBJRiAoUEFTUykgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCBDT05USU5VRQorICAgICAgU1RPUAorKgorOTk5OTkgRk9STUFUICgnIENvbXBsZXggQkxBUyBUZXN0IFByb2dyYW0gUmVzdWx0cycsLzFYKQorOTk5OTggRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0gUEFTUyAtLS0tLScpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSEVBREVSCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ0hBUkFDVEVSKjYgICAgICBMKDEwKQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxKS8nWkRPVEMgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgyKS8nWkRPVFUgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgzKS8nWkFYUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg0KS8nWkNPUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg1KS8nWlNXQVAgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg2KS8nRFpOUk0yJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg3KS8nRFpBU1VNJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg4KS8nWlNDQUwgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg5KS8nWkRTQ0FMJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMCkvJ0laQU1BWCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KSBJQ0FTRSwgTChJQ0FTRSkKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgvJyBUZXN0IG9mIHN1YnByb2dyYW0gbnVtYmVyJyxJMywxMlgsQTYpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0sxKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICBDQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIExFTiwgTlAxCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgIENUUlVFNSg4LDUsMiksIENUUlVFNig4LDUsMiksIENWKDgsNSwyKSwgQ1goOCksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BDUyg1KSwgTVdQQ1QoNSkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNUUlVFMig1KSwgU1RSVUU0KDUpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJVFJVRTMoNSkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgRFpBU1VNLCBEWk5STTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElaQU1BWAorICAgICAgRVhURVJOQUwgICAgICAgICAgRFpBU1VNLCBEWk5STTIsIElaQU1BWAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFpTQ0FMLCBaRFNDQUwsIENURVNULCBJVEVTVDEsIFNURVNUMQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgTUFYCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNBLCBDQS8wLjNEMCwgKDAuNEQwLC0wLjdEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFEMCwwLjFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgwLjNEMCwtMC40RDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRDAsLTAuM0QwKSwgKDAuNUQwLC0wLjFEMCksICg1LjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwgKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC42RDAsMC4xRDApLCAoMC4xRDAsLTAuM0QwKSwgKDcuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBEMCw4LjBEMCksICg3LjBEMCw4LjBEMCksICg3LjBEMCw4LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsOC4wRDApLCAoMC4zRDAsMC4xRDApLCAoMC41RDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuNUQwKSwgKDAuMEQwLDAuMkQwKSwgKDIuMEQwLDMuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwyKSxJPTEsOCksSj0xLDUpLygwLjFEMCwwLjFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICgwLjNEMCwtMC40RDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRDAsLTAuM0QwKSwgKDguMEQwLDkuMEQwKSwgKDAuNUQwLC0wLjFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEQwLDUuMEQwKSwgKDIuMEQwLDUuMEQwKSwgKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBEMCw2LjBEMCksICgtMC42RDAsMC4xRDApLCAoNC4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMUQwLC0wLjNEMCksICg3LjBEMCwyLjBEMCksICg3LjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsMi4wRDApLCAoMC4zRDAsMC4xRDApLCAoNS4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNUQwLDAuMEQwKSwgKDYuMEQwLDkuMEQwKSwgKDAuMEQwLDAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBEMCwzLjBEMCksICgwLjBEMCwwLjJEMCksICg5LjBEMCw0LjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBTVFJVRTIvMC4wRDAsIDAuNUQwLCAwLjZEMCwgMC43RDAsIDAuOEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1RSVUU0LzAuMEQwLCAwLjdEMCwgMS4wRDAsIDEuM0QwLCAxLjZEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1RSVUU1KEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFEMCwwLjFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgtMC4xNkQwLC0wLjM3RDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMTdEMCwtMC4xOUQwKSwgKDAuMTNEMCwtMC4zOUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTFEMCwtMC4wM0QwKSwgKC0wLjE3RDAsMC40NkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0QwLC0wLjE5RDApLCAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE5RDAsLTAuMTdEMCksICgwLjIwRDAsLTAuMzVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zNUQwLDAuMjBEMCksICgwLjE0RDAsMC4wOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRDAsMy4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTUoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKC0wLjE2RDAsLTAuMzdEMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0QwLC0wLjE5RDApLCAoOC4wRDAsOS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTNEMCwtMC4zOUQwKSwgKDIuMEQwLDUuMEQwKSwgKDIuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xMUQwLC0wLjAzRDApLCAoMy4wRDAsNi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RDAsMC40NkQwKSwgKDQuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0QwLC0wLjE5RDApLCAoNy4wRDAsMi4wRDApLCAoNy4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEQwLDIuMEQwKSwgKDAuMTlEMCwtMC4xN0QwKSwgKDUuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjIwRDAsLTAuMzVEMCksICg2LjBEMCw5LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zNUQwLDAuMjBEMCksICg4LjBEMCwzLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xNEQwLDAuMDhEMCksICg5LjBEMCw0LjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUUlVFNihJLEosMSksST0xLDgpLEo9MSw1KS8oMC4xRDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMC4wOUQwLC0wLjEyRDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLC0wLjA5RDApLCAoMC4xNUQwLC0wLjAzRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLDAuMDNEMCksICgtMC4xOEQwLDAuMDNEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLC0wLjA5RDApLCAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjA5RDAsMC4wM0QwKSwgKDAuMTVEMCwwLjAwRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDBEMCwwLjE1RDApLCAoMC4wMEQwLDAuMDZEMCksICgyLjBEMCwzLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRDAsMy4wRDApLCAoMi4wRDAsMy4wRDApLCAoMi4wRDAsMy4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTYoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKDAuMDlEMCwtMC4xMkQwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNEMCwtMC4wOUQwKSwgKDguMEQwLDkuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE1RDAsLTAuMDNEMCksICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNEMCwwLjAzRDApLCAoMy4wRDAsNi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE4RDAsMC4wM0QwKSwgKDQuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRDAsLTAuMDlEMCksICg3LjBEMCwyLjBEMCksICg3LjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsMi4wRDApLCAoMC4wOUQwLDAuMDNEMCksICg1LjBEMCw4LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xNUQwLDAuMDBEMCksICg2LjBEMCw5LjBEMCksICgwLjAwRDAsMC4xNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBEMCwzLjBEMCksICgwLjAwRDAsMC4wNkQwKSwgKDkuMEQwLDQuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElUUlVFMy8wLCAxLCAyLCAyLCAyLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBJTkNYID0gMSwgMgorICAgICAgICAgRE8gNDAgTlAxID0gMSwgNQorICAgICAgICAgICAgTiA9IE5QMSAtIDEKKyAgICAgICAgICAgIExFTiA9IDIqTUFYKE4sMSkKKyogICAgICAgICAgIC4uIFNldCB2ZWN0b3IgYXJndW1lbnRzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICAgICAgICBDWChJKSA9IENWKEksTlAxLElOQ1gpCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjYpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERaTlJNMiAuLgorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoRFpOUk0yKE4sQ1gsSU5DWCksU1RSVUUyKE5QMSksU1RSVUUyKE5QMSksCisgICAgICsgICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNykgVEhFTgorKiAgICAgICAgICAgICAgLi4gRFpBU1VNIC4uCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShEWkFTVU0oTixDWCxJTkNYKSxTVFJVRTQoTlAxKSxTVFJVRTQoTlAxKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICAgICAgICAuLiBaU0NBTCAuLgorICAgICAgICAgICAgICAgQ0FMTCBaU0NBTChOLENBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTUoMSxOUDEsSU5DWCksQ1RSVUU1KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gWkRTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIFpEU0NBTChOLFNBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTYoMSxOUDEsSU5DWCksQ1RSVUU2KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMTApIFRIRU4KKyogICAgICAgICAgICAgIC4uIElaQU1BWCAuLgorICAgICAgICAgICAgICAgQ0FMTCBJVEVTVDEoSVpBTUFYKE4sQ1gsSU5DWCksSVRSVUUzKE5QMSkpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzEnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDQwICAgIENPTlRJTlVFCisgICA2MCBDT05USU5VRQorKgorICAgICAgSU5DWCA9IDEKKyAgICAgIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICBaU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIENBID0gKDAuMEQwLDAuMEQwKQorICAgICAgICAgRE8gODAgSSA9IDEsIDUKKyAgICAgICAgICAgIE1XUENUKEkpID0gKDAuMEQwLDAuMEQwKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSAoMS4wRDAsMS4wRDApCisgICA4MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBaU0NBTCg1LENBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjkpIFRIRU4KKyogICAgICAgIFpEU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIFNBID0gMC4wRDAKKyAgICAgICAgIERPIDEwMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAoMC4wRDAsMC4wRDApCisgICAgICAgICAgICBNV1BDUyhJKSA9ICgxLjBEMCwxLjBEMCkKKyAgMTAwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIFpEU0NBTCg1LFNBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyogICAgICAgIEFkZCBhIHRlc3QgZm9yIGFscGhhIGVxdWFsIHRvIG9uZS4KKyAgICAgICAgIFNBID0gMS4wRDAKKyAgICAgICAgIERPIDEyMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSBDWChJKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSBDWChJKQorICAxMjAgICAgQ09OVElOVUUKKyAgICAgICAgIENBTEwgWkRTQ0FMKDUsU0EsQ1gsSU5DWCkKKyAgICAgICAgIENBTEwgQ1RFU1QoNSxDWCxNV1BDVCxNV1BDUyxTRkFDKQorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gbWludXMgb25lLgorICAgICAgICAgU0EgPSAtMS4wRDAKKyAgICAgICAgIERPIDE0MCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAtQ1goSSkKKyAgICAgICAgICAgIE1XUENTKEkpID0gLUNYKEkpCisgIDE0MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBaRFNDQUwoNSxTQSxDWCxJTkNYKQorICAgICAgICAgQ0FMTCBDVEVTVCg1LENYLE1XUENULE1XUENTLFNGQUMpCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMihTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgQ0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIEtJLCBLTiwgS1NJWkUsIExFTlgsIExFTlksIE1YLCBNWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICBDRE9UKDEpLCBDU0laRTEoNCksIENTSVpFMig3LDIpLCBDU0laRTMoMTQpLAorICAgICArICAgICAgICAgICAgICAgICAgQ1QxMFgoNyw0LDQpLCBDVDEwWSg3LDQsNCksIENUNig0LDQpLCBDVDcoNCw0KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIENUOCg3LDQsNCksIENYKDcpLCBDWDEoNyksIENZKDcpLCBDWTEoNykKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICBaRE9UQywgWkRPVFUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFpET1RDLCBaRE9UVQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFpBWFBZLCBaQ09QWSwgWlNXQVAsIENURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBDQS8oMC40RDAsLTAuN0QwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBDWDEvKDAuN0QwLC0wLjhEMCksICgtMC40RDAsLTAuN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRDAsLTAuOUQwKSwgKDAuMkQwLC0wLjhEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUQwLC0wLjREMCksICgwLjFEMCwwLjREMCksICgtMC42RDAsMC42RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1kxLygwLjZEMCwtMC42RDApLCAoLTAuOUQwLDAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC42RDApLCAoMC4xRDAsLTAuNUQwKSwgKC0wLjFEMCwtMC4yRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjVEMCwtMC4zRDApLCAoMC44RDAsLTAuN0QwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwxKSxJPTEsNyksSj0xLDQpLygwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkQwLC0xLjQxRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjMyRDAsLTEuNDFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTEuNTVEMCwwLjVEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJEMCwtMS40MUQwKSwgKC0xLjU1RDAsMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNEMCwtMC44OUQwKSwgKC0wLjM4RDAsLTAuOTZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRDAsLTEuNDFEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjA3RDAsLTAuODlEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUQwLDAuNUQwKSwgKDAuNDJEMCwtMS40MUQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43OEQwLDAuMDZEMCksICgtMC45RDAsMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDZEMCwtMC4xM0QwKSwgKDAuMUQwLC0wLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdEMCwtMC40OUQwKSwgKC0wLjVEMCwtMC4zRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNTJEMCwtMS41MUQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwzKSxJPTEsNyksSj0xLDQpLygwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkQwLC0xLjQxRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgtMC4wN0QwLC0wLjg5RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0xLjE4RDAsLTAuMzFEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNzhEMCwwLjA2RDApLCAoLTEuNTREMCwwLjk3RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNEMCwtMC44OUQwKSwgKC0wLjE4RDAsLTEuMzFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRDAsLTEuNDFEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMzJEMCwtMS40MUQwKSwgKC0wLjlEMCwwLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wNUQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4zMkQwLC0xLjQxRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlEMCwwLjVEMCksICgwLjA1RDAsLTAuNkQwKSwgKDAuMUQwLC0wLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdEMCwtMC40OUQwKSwgKC0wLjVEMCwtMC4zRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJEMCwtMS4xNkQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNy8oMC4wRDAsMC4wRDApLCAoLTAuMDZEMCwtMC45MEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjY1RDAsLTAuNDdEMCksICgtMC4zNEQwLC0xLjIyRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjA2RDAsLTAuOTBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNTlEMCwtMS40NkQwKSwgKC0xLjA0RDAsLTAuMDREMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuMDZEMCwtMC45MEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC44M0QwLDAuNTlEMCksICgwLjA3RDAsLTAuMzdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuMDZEMCwtMC45MEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC43NkQwLC0xLjE1RDApLCAoLTEuMzNEMCwtMS44MkQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNi8oMC4wRDAsMC4wRDApLCAoMC45MEQwLDAuMDZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC45MUQwLC0wLjc3RDApLCAoMS44MEQwLC0wLjEwRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuOTBEMCwwLjA2RDApLCAoMS40NUQwLDAuNzREMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4yMEQwLDAuOTBEMCksICgwLjBEMCwwLjBEMCksICgwLjkwRDAsMC4wNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC41NUQwLDAuMjNEMCksICgwLjgzRDAsLTAuMzlEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC45MEQwLDAuMDZEMCksICgxLjA0RDAsMC43OUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjk1RDAsMS4yMkQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuN0QwLC0wLjhEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZEMCwtMC42RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjZEMCwtMC42RDApLCAoLTAuOUQwLDAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsMC41RDApLCAoMC43RDAsLTAuNkQwKSwgKDAuMUQwLC0wLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMiksST0xLDcpLEo9MSw0KS8oMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuN0QwLC0wLjZEMCksICgtMC40RDAsLTAuN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZEMCwtMC42RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuOEQwLC0wLjdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEQwLC0wLjdEMCksICgtMC4xRDAsLTAuMkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJEMCwtMC44RDApLCAoMC43RDAsLTAuNkQwKSwgKDAuMUQwLDAuNEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZEMCwtMC42RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMyksST0xLDcpLEo9MSw0KS8oMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjlEMCwwLjVEMCksICgtMC40RDAsLTAuN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZEMCwtMC42RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMUQwLC0wLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEQwLC0wLjdEMCksICgwLjdEMCwtMC42RDApLCAoMC4yRDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsMC41RDApLCAoMC4xRDAsMC40RDApLCAoMC42RDAsLTAuNkQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuN0QwLC0wLjhEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZEMCwtMC42RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjZEMCwtMC42RDApLCAoMC43RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC42RDApLCAoLTAuMUQwLC0wLjJEMCksICgwLjhEMCwtMC43RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC44RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjdEMCwtMC44RDApLCAoLTAuNEQwLC0wLjdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuN0QwLC0wLjhEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEQwLC0wLjdEMCksICgtMC4xRDAsLTAuOUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJEMCwtMC44RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC44RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgtMC4xRDAsLTAuOUQwKSwgKC0wLjlEMCwwLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RDAsLTAuOEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgtMC42RDAsMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlEMCwwLjVEMCksICgtMC45RDAsLTAuNEQwKSwgKDAuMUQwLC0wLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMUQwLC0wLjlEMCksICgtMC41RDAsLTAuM0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC44RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosMyksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjFEMCwtMC45RDApLCAoMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoLTAuNkQwLDAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsLTAuNEQwKSwgKC0wLjFEMCwtMC45RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosNCksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuN0QwLC0wLjhEMCksICgtMC45RDAsMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjREMCwtMC43RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuN0QwLC0wLjhEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUQwLDAuNUQwKSwgKC0wLjREMCwtMC43RDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRDAsLTAuOUQwKSwgKC0wLjVEMCwtMC4zRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMkQwLC0wLjhEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDU0laRTEvKDAuMEQwLDAuMEQwKSwgKDAuOUQwLDAuOUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjYzRDAsMS43M0QwKSwgKDIuOTBEMCwyLjc4RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUzLygwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDEuMTdEMCwxLjE3RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMTdEMCwxLjE3RDApLCAoMS4xN0QwLDEuMTdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4xN0QwLDEuMTdEMCksICgxLjE3RDAsMS4xN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjE3RDAsMS4xN0QwKSwgKDEuMTdEMCwxLjE3RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUyLygwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDEuNTREMCwxLjU0RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuNTREMCwxLjU0RDApLCAoMS41NEQwLDEuNTREMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS41NEQwLDEuNTREMCksICgxLjU0RDAsMS41NEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjU0RDAsMS41NEQwKSwgKDEuNTREMCwxLjU0RDApLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBLSSA9IDEsIDQKKyAgICAgICAgIElOQ1ggPSBJTkNYUyhLSSkKKyAgICAgICAgIElOQ1kgPSBJTkNZUyhLSSkKKyAgICAgICAgIE1YID0gQUJTKElOQ1gpCisgICAgICAgICBNWSA9IEFCUyhJTkNZKQorKgorICAgICAgICAgRE8gNDAgS04gPSAxLCA0CisgICAgICAgICAgICBOID0gTlMoS04pCisgICAgICAgICAgICBLU0laRSA9IE1JTigyLEtOKQorICAgICAgICAgICAgTEVOWCA9IExFTlMoS04sTVgpCisgICAgICAgICAgICBMRU5ZID0gTEVOUyhLTixNWSkKKyogICAgICAgICAgIC4uIGluaXRpYWxpemUgYWxsIGFyZ3VtZW50IGFycmF5cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgIENYKEkpID0gQ1gxKEkpCisgICAgICAgICAgICAgICBDWShJKSA9IENZMShJKQorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS4xKSBUSEVOCisqICAgICAgICAgICAgICAuLiBaRE9UQyAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IFpET1RDKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q2KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4yKSBUSEVOCisqICAgICAgICAgICAgICAuLiBaRE9UVSAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IFpET1RVKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q3KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4zKSBUSEVOCisqICAgICAgICAgICAgICAuLiBaQVhQWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBaQVhQWShOLENBLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDgoMSxLTixLSSksQ1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS40KSBUSEVOCisqICAgICAgICAgICAgICAuLiBaQ09QWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBaQ09QWShOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDEwWSgxLEtOLEtJKSxDU0laRTMsMS4wRDApCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS41KSBUSEVOCisqICAgICAgICAgICAgICAuLiBaU1dBUCAuLgorICAgICAgICAgICAgICAgQ0FMTCBaU1dBUChOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWCxDWCxDVDEwWCgxLEtOLEtJKSxDU0laRTMsMS4wRDApCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTlksQ1ksQ1QxMFkoMSxLTixLSSksQ1NJWkUzLDEuMEQwKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0syJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisqCisgICA0MCAgICBDT05USU5VRQorICAgNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUKExFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NiwgWkVSTz0wLjBEMCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTQ09NUChMRU4pLCBTU0laRShMRU4pLCBTVFJVRShMRU4pCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNECisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRElGRgorICAgICAgRVhURVJOQUwgICAgICAgICBTRElGRgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBQlMKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICBTRCA9IFNDT01QKEkpIC0gU1RSVUUoSSkKKyAgICAgICAgIElGIChBQlMoU0ZBQypTRCkgLkxFLiBBQlMoU1NJWkUoSSkpKkVQU0lMT04oWkVSTykpCisgICAgICsgICAgICAgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgICAgU0NPTVAoSSkgSVMgTk9UIENMT1NFIFRPIFNUUlVFKEkpLgorKgorICAgICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgSSwgU0NPTVAoSSksCisgICAgICsgICAgIFNUUlVFKEkpLCBTRCwgU1NJWkUoSSkKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QKEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKEkpICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAnICAgICBTSVpFKEkpJywvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSxJMywyRDM2LjgsMkQxMi40KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUMShTQ09NUDEsU1RSVUUxLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBJUyBBTiBJTlRFUkZBQ0UgU1VCUk9VVElORSBUTyBBQ0NPTU9EQVRFIFRIRSBGT1JUUkFOCisqICAgICBSRVFVSVJFTUVOVCBUSEFUIFdIRU4gQSBEVU1NWSBBUkdVTUVOVCBJUyBBTiBBUlJBWSwgVEhFCisqICAgICBBQ1RVQUwgQVJHVU1FTlQgTVVTVCBBTFNPIEJFIEFOIEFSUkFZIE9SIEFOIEFSUkFZIEVMRU1FTlQuCisqCisqICAgICBDLkwuIExBV1NPTiwgSlBMLCAxOTc4IERFQyA2CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTQ09NUDEsIFNGQUMsIFNUUlVFMQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTU0laRSgqKQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTQ09NUCgxKSwgU1RSVUUoMSkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTVEVTVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBTQ09NUCgxKSA9IFNDT01QMQorICAgICAgU1RSVUUoMSkgPSBTVFJVRTEKKyAgICAgIENBTEwgU1RFU1QoMSxTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gU0RJRkYoU0EsU0IpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0RJRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgIENPTVBVVEVTIERJRkZFUkVOQ0UgT0YgVFdPIE5VTUJFUlMuICBDLiBMLiBMQVdTT04sIEpQTCAxOTc0IEZFQiAxNQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgICAgICAgICAgICAgICBTQSwgU0IKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgU0RJRkYgPSBTQSAtIFNCCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDVEVTVChMRU4sQ0NPTVAsQ1RSVUUsQ1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ1RFU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIEMuTC4gTEFXU09OLCBKUEwsIDE5NzggREVDIDYKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICBDQ09NUChMRU4pLCBDU0laRShMRU4pLCBDVFJVRShMRU4pCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTQ09NUCgyMCksIFNTSVpFKDIwKSwgU1RSVUUoMjApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBTVEVTVAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBESU1BRywgREJMRQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICBTQ09NUCgyKkktMSkgPSBEQkxFKENDT01QKEkpKQorICAgICAgICAgU0NPTVAoMipJKSA9IERJTUFHKENDT01QKEkpKQorICAgICAgICAgU1RSVUUoMipJLTEpID0gREJMRShDVFJVRShJKSkKKyAgICAgICAgIFNUUlVFKDIqSSkgPSBESU1BRyhDVFJVRShJKSkKKyAgICAgICAgIFNTSVpFKDIqSS0xKSA9IERCTEUoQ1NJWkUoSSkpCisgICAgICAgICBTU0laRSgyKkkpID0gRElNQUcoQ1NJWkUoSSkpCisgICAyMCBDT05USU5VRQorKgorICAgICAgQ0FMTCBTVEVTVCgyKkxFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSVRFU1QxKElDT01QLElUUlVFKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlJPVVRJTkUgQ09NUEFSRVMgVEhFIFZBUklBQkxFUyBJQ09NUCBBTkQgSVRSVUUgRk9SCisqICAgICBFUVVBTElUWS4KKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDT01QLCBJVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJRAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiAoSUNPTVAuRVEuSVRSVUUpIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgSUNPTVAgSVMgTk9UIEVRVUFMIFRPIElUUlVFLgorKgorICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIElEID0gSUNPTVAgLSBJVFJVRQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBJQ09NUCwgSVRSVUUsIElECisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAgICAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywzSTUsMkkzNixJMTIpCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy96YmxhdDIuZGF0IGIvYmxhcy90ZXN0aW5nL3pibGF0Mi5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMjQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy96YmxhdDIuZGF0CkBAIC0wLDAgKzEsMzUgQEAKKyd6YmxhdDIuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnY2JsYTJ0LnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSworMCAxIDIgNCAgICAgICAgICAgVkFMVUVTIE9GIEsKKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMSAyIC0xIC0yICAgICAgICAgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCitaR0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkdCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlRQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlRQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pHRVJDICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaR0VSVSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhFUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIUFIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEVSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhQUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy96YmxhdDIuZiBiL2JsYXMvdGVzdGluZy96YmxhdDIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzEyOWExCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3pibGF0Mi5mCkBAIC0wLDAgKzEsMzI4NyBAQAorKj4gXGJyaWVmIFxiIFpCTEFUMgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgUFJPR1JBTSBaQkxBVDIKKyogCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gVGVzdCBwcm9ncmFtIGZvciB0aGUgQ09NUExFWCoxNiAgICAgICBMZXZlbCAyIEJsYXMuCisqPgorKj4gVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxOCByZWNvcmRzCisqPiBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCAxNyByZWNvcmRzCisqPiBhcmUgcmVhZCB1c2luZyB0aGUgZm9ybWF0ICggQTYsIEwyICkuIEFuIGFubm90YXRlZCBleGFtcGxlIG9mIGEgZGF0YQorKj4gZmlsZSBjYW4gYmUgb2J0YWluZWQgYnkgZGVsZXRpbmcgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBmcm9tIHRoZQorKj4gZm9sbG93aW5nIDM1IGxpbmVzOgorKj4gJ3pibGF0Mi5vdXQnICAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCisqPiA2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyo+ICdDQkxBMlQuU05BUCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKyo+IC0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KKyo+IEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorKj4gVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisqPiAxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworKj4gNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCisqPiAwIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorKj4gNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCisqPiAwIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworKj4gNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqPiAxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKj4gKDAuMCwwLjApICgxLjAsMC4wKSAoMC43LC0wLjkpICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKj4gMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqPiAoMC4wLDAuMCkgKDEuMCwwLjApICgxLjMsLTEuMSkgICAgICAgVkFMVUVTIE9GIEJFVEEKKyo+IFpHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWkhFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpIQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaSFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWlRSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWlRSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWkdFUkMgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpHRVJVICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaSEVSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWkhQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpIRVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaSFBSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4KKyo+IEZ1cnRoZXIgRGV0YWlscworKj4gPT09PT09PT09PT09PT09CisqPgorKj4gICAgU2VlOgorKj4KKyo+ICAgICAgIERvbmdhcnJhIEouIEouLCBEdSBDcm96IEouIEouLCBIYW1tYXJsaW5nIFMuICBhbmQgSGFuc29uIFIuIEouLgorKj4gICAgICAgQW4gIGV4dGVuZGVkICBzZXQgb2YgRm9ydHJhbiAgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqPgorKj4gICAgICAgVGVjaG5pY2FsICBNZW1vcmFuZGEgIE5vcy4gNDEgKHJldmlzaW9uIDMpIGFuZCA4MSwgIE1hdGhlbWF0aWNzCisqPiAgICAgICBhbmQgIENvbXB1dGVyIFNjaWVuY2UgIERpdmlzaW9uLCAgQXJnb25uZSAgTmF0aW9uYWwgTGFib3JhdG9yeSwKKyo+ICAgICAgIDk3MDAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyo+CisqPiAgICAgICBPcgorKj4KKyo+ICAgICAgIE5BRyAgVGVjaG5pY2FsIFJlcG9ydHMgVFIzLzg3IGFuZCBUUjQvODcsICBOdW1lcmljYWwgQWxnb3JpdGhtcworKj4gICAgICAgR3JvdXAgIEx0ZC4sICBOQUcgIENlbnRyYWwgIE9mZmljZSwgIDI1NiAgQmFuYnVyeSAgUm9hZCwgT3hmb3JkCisqPiAgICAgICBPWDIgN0RFLCBVSywgIGFuZCAgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgSW5jLiwgIDExMDEgIDMxc3QKKyo+ICAgICAgIFN0cmVldCwgIFN1aXRlIDEwMCwgIERvd25lcnMgR3JvdmUsICBJbGxpbm9pcyA2MDUxNS0xMjYzLCAgVVNBLgorKj4KKyo+CisqPiAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKj4gICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKj4gICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyo+CisqPiAgICAxMC05LTAwOiAgQ2hhbmdlIFNUQVRVUz0nTkVXJyB0byAnVU5LTk9XTicgc28gdGhhdCB0aGUgdGVzdGVycworKj4gICAgICAgICAgICAgIGNhbiBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aG91dCBkZWxldGluZyBnZW5lcmF0ZWQKKyo+ICAgICAgICAgICAgICBvdXRwdXQgZmlsZXMgKHN1c2FuKQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgY29tcGxleDE2X2JsYXNfdGVzdGluZworKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBQUk9HUkFNIFpCTEFUMgorKgorKiAgLS0gUmVmZXJlbmNlIEJMQVMgdGVzdCByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gUmVmZXJlbmNlIEJMQVMgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIEFwcmlsIDIwMTIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gMTcgKQorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5NQVgsIElOQ01BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1LCBJTkNNQVggPSAyICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU5NQVgsIE5JRE1BWCwgTktCTUFYLCBOQUxNQVgsIE5CRU1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOTUFYID0gNywgTklETUFYID0gOSwgTktCTUFYID0gNywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBMVEVTVFQsIFJFV0ksIFNBTUUsIFNGQVRBTCwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICAgVFNURVJSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVQKKyAgICAgIENIQVJBQ1RFUiozMiAgICAgICBTTkFQUywgU1VNTVJZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTE1BWCApLCBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCAyKk5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApLCBJTkMoIE5JTk1BWCApLCBLQiggTktCTUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTFpFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpDSEsxLCBaQ0hLMiwgWkNISzMsIFpDSEs0LCBaQ0hLNSwgWkNISzYsCisgICAgICQgICAgICAgICAgICAgICAgICAgWkNIS0UsIFpNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIFNOQU1FUy8nWkdFTVYgJywgJ1pHQk1WICcsICdaSEVNViAnLCAnWkhCTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkhQTVYgJywgJ1pUUk1WICcsICdaVEJNViAnLCAnWlRQTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWlRSU1YgJywgJ1pUQlNWICcsICdaVFBTViAnLCAnWkdFUkMgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkdFUlUgJywgJ1pIRVIgICcsICdaSFBSICAnLCAnWkhFUjIgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkhQUjIgJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSwgU1RBVFVTID0gJ1VOS05PV04nICkKKyAgICAgIE5PVVRDID0gTk9VVAorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc25hcHNob3Qgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU05BUFMKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTlRSQQorICAgICAgVFJBQ0UgPSBOVFJBLkdFLjAKKyAgICAgIElGKCBUUkFDRSApVEhFTgorICAgICAgICAgT1BFTiggTlRSQSwgRklMRSA9IFNOQVBTLCBTVEFUVVMgPSAnVU5LTk9XTicgKQorICAgICAgRU5EIElGCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyByZXdpbmRpbmcgb2YgdGhlIHNuYXBzaG90IGZpbGUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVJFV0kKKyAgICAgIFJFV0kgPSBSRVdJLkFORC5UUkFDRQorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgc3RvcHBpbmcgb24gYW55IGZhaWx1cmUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNGQVRBTAorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGVycm9yIGV4aXRzIGFyZSB0byBiZSB0ZXN0ZWQuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRTVEVSUgorKiAgICAgUmVhZCB0aGUgdGhyZXNob2xkIHZhbHVlIG9mIHRoZSB0ZXN0IHJhdGlvCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRIUkVTSAorKgorKiAgICAgUmVhZCBhbmQgY2hlY2sgdGhlIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSB0ZXN0cy4KKyoKKyogICAgIFZhbHVlcyBvZiBOCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5JRElNCisgICAgICBJRiggTklESU0uTFQuMS5PUi5OSURJTS5HVC5OSURNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknTicsIE5JRE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBETyAxMCBJID0gMSwgTklESU0KKyAgICAgICAgIElGKCBJRElNKCBJICkuTFQuMC5PUi5JRElNKCBJICkuR1QuTk1BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKU5NQVgKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAxMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIEsKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTktCCisgICAgICBJRiggTktCLkxULjEuT1IuTktCLkdULk5LQk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdLJywgTktCTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEtCKCBJICksIEkgPSAxLCBOS0IgKQorICAgICAgRE8gMjAgSSA9IDEsIE5LQgorICAgICAgICAgSUYoIEtCKCBJICkuTFQuMCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKQorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDIwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgSU5DWCBhbmQgSU5DWQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSU5DCisgICAgICBJRiggTklOQy5MVC4xLk9SLk5JTkMuR1QuTklOTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0lOQ1ggQU5EIElOQ1knLCBOSU5NQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSU5DKCBJICksIEkgPSAxLCBOSU5DICkKKyAgICAgIERPIDMwIEkgPSAxLCBOSU5DCisgICAgICAgICBJRiggSU5DKCBJICkuRVEuMC5PUi5BQlMoIElOQyggSSApICkuR1QuSU5DTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApSU5DTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMzAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBBTFBIQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQUxGCisgICAgICBJRiggTkFMRi5MVC4xLk9SLk5BTEYuR1QuTkFMTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0FMUEhBJywgTkFMTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisqICAgICBWYWx1ZXMgb2YgQkVUQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQkVUCisgICAgICBJRiggTkJFVC5MVC4xLk9SLk5CRVQuR1QuTkJFTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0JFVEEnLCBOQkVNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyoKKyogICAgIFJlcG9ydCB2YWx1ZXMgb2YgcGFyYW1ldGVycy4KKyoKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkxICkoIEtCKCBJICksIEkgPSAxLCBOS0IgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTAgKSggSU5DKCBJICksIEkgPSAxLCBOSU5DICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5ICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OCApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorICAgICAgSUYoIC5OT1QuVFNURVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MCApCisgICAgICBFTkQgSUYKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClUSFJFU0gKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyoKKyogICAgIFJlYWQgbmFtZXMgb2Ygc3Vicm91dGluZXMgYW5kIGZsYWdzIHdoaWNoIGluZGljYXRlCisqICAgICB3aGV0aGVyIHRoZXkgYXJlIHRvIGJlIHRlc3RlZC4KKyoKKyAgICAgIERPIDQwIEkgPSAxLCBOU1VCUworICAgICAgICAgTFRFU1QoIEkgKSA9IC5GQUxTRS4KKyAgIDQwIENPTlRJTlVFCisgICA1MCBSRUFEKCBOSU4sIEZNVCA9IDk5ODQsIEVORCA9IDgwIClTTkFNRVQsIExURVNUVAorICAgICAgRE8gNjAgSSA9IDEsIE5TVUJTCisgICAgICAgICBJRiggU05BTUVULkVRLlNOQU1FUyggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDcwCisgICA2MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODYgKVNOQU1FVAorICAgICAgU1RPUAorICAgNzAgTFRFU1QoIEkgKSA9IExURVNUVAorICAgICAgR08gVE8gNTAKKyoKKyAgIDgwIENPTlRJTlVFCisgICAgICBDTE9TRSAoIE5JTiApCisqCisqICAgICBDb21wdXRlIEVQUyAodGhlIG1hY2hpbmUgcHJlY2lzaW9uKS4KKyoKKyAgICAgIEVQUyA9IEVQU0lMT04oUlpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgWk1WQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTEwIEkgPSAxLCBOCisgICAgICAgICAgICBBKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgIDExMCAgICBDT05USU5VRQorICAgICAgICAgWCggSiApID0gSgorICAgICAgICAgWSggSiApID0gWkVSTworICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgWVkoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisqICAgICBZWSBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gWk1WQ0ggWVQgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgWk1WQ0guCisgICAgICBUUkFOUyA9ICdOJworICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgMSwgWkVSTywgWSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExaRSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOUyA9ICdUJworICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgLTEsIFpFUk8sIFksIC0xLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFpFKCBZWSwgWVQsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMTAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgzIClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgWkNIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE0MCwgMTUwLCAxNTAsIDE1MCwgMTYwLCAxNjAsCisgICAgICQgICAgICAgICAgICAgIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTcwLCAxNzAsIDE4MCwKKyAgICAgJCAgICAgICAgICAgICAgMTgwLCAxOTAsIDE5MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgWkdFTVYsIDAxLCBhbmQgWkdCTVYsIDAyLgorICAxNDAgICAgICAgQ0FMTCBaQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgWkhFTVYsIDAzLCBaSEJNViwgMDQsIGFuZCBaSFBNViwgMDUuCisgIDE1MCAgICAgICBDQUxMIFpDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBaVFJNViwgMDYsIFpUQk1WLCAwNywgWlRQTVYsIDA4LAorKiAgICAgICAgICAgWlRSU1YsIDA5LCBaVEJTViwgMTAsIGFuZCBaVFBTViwgMTEuCisgIDE2MCAgICAgICBDQUxMIFpDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFksIFlZLCBZUywgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFpHRVJDLCAxMiwgWkdFUlUsIDEzLgorICAxNzAgICAgICAgQ0FMTCBaQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFpIRVIsIDE0LCBhbmQgWkhQUiwgMTUuCisgIDE4MCAgICAgICBDQUxMIFpDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgWkhFUjIsIDE2LCBhbmQgWkhQUjIsIDE3LgorICAxOTAgICAgICAgQ0FMTCBaQ0hLNiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorKgorICAyMDAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MiApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MSApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApCisqCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRDkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVkFMVUUgT0YgSyBJUyBMRVNTIFRIQU4gMCcgKQorIDk5OTQgRk9STUFUKCAnIEFCU09MVVRFIFZBTFVFIE9GIElOQ1ggT1IgSU5DWSBJUyAwIE9SIEdSRUFURVIgVEhBTiAnLAorICAgICAkICAgICAgSTIgKQorIDk5OTMgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBDT01QTEVYKjE2ICAgICAgIExFVkVMIDIgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkxIEZPUk1BVCggJyAgIEZPUiBLICAgICAgICAgICAgICAnLCA3STYgKQorIDk5OTAgRk9STUFUKCAnICAgRk9SIElOQ1ggQU5EIElOQ1kgICcsIDdJNiApCisgOTk4OSBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTg4IEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLAorICAgICAkICAgICAgNyggJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICAnLCA6ICkgKQorIDk5ODcgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg2IEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg1IEZPUk1BVCggJyBFUlJPUiBJTiBaTVZDSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBaTVZDSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlMgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgRVJSID0gJywgRjEyLjMsICcuJywgLworICAgICAkICAgJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSBBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nCisgICAgICQgICAgICAsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggQTYsIEwyICkKKyA5OTgzIEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4MiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODEgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTgwIEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBaQkxBVDIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBaR0VNViBhbmQgWkdCTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBIQUxGID0gKCAwLjVEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUtVLCBJTSwgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgIElOQ1lTLCBJWCwgSVksIEtMLCBLTFMsIEtVLCBLVVMsIExBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQVMsIExYLCBMWSwgTSwgTUwsIE1TLCBOLCBOQVJHUywgTkMsIE5ELCBOSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOTCwgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUworICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkdCTVYsIFpHRU1WLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nTlRDJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSUtVID0gMSwgTksKKyAgICAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEtVID0gS0IoIElLVSApCisgICAgICAgICAgICAgICAgICBLTCA9IE1BWCggS1UgLSAxLCAwICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtVID0gTiAtIDEKKyAgICAgICAgICAgICAgICAgIEtMID0gTSAtIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBMREEgPSBLTCArIEtVICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgWk1BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgS0wsIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElDID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1MID0gTgorICAgICAgICAgICAgICAgICAgICAgTkwgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTgorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTkwKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOTCwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTkwgLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOTC5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBYKCBOTC8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTkwvMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTUwKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE1MLCBZLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEFCUyggSU5DWSApLCAwLCBNTCAtIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xTID0gS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUyA9IEtVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNViggVFJBTlMsIE0sIE4sIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1gsIEJFVEEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpHQk1WKCBUUkFOUywgTSwgTiwgS0wsIEtVLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFhYLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MLCBZUywgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLTFMuRVEuS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLVVMuRVEuS1UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE0MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgS0wsIEtVLAorICAgICAkICAgICAgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDQoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCAnKCcsCisgICAgICQgICAgICBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgWSwnLCBJMiwgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIFpIRU1WLCBaSEJNViBhbmQgWkhQTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBIQUxGID0gKCAwLjVEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUssIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLLCBLUywgTEFBLCBMREEsIExEQVMsIExYLCBMWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaSEJNViwgWkhFTVYsIFpIUE1WLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEwCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgWk1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhFTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgTERBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBLLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhCTVYoIFVQTE8sIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhQTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgWFgsIElOQ1gsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMWkUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggJ04nLCBOLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFksIElOQ1ksIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsCisgICAgICQgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgQVAsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDIoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIEEsJywgSTMsICcsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksICcsCisgICAgICQgICAgICAnWSwnLCBJMiwgJykgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFhULCBHLCBaICkKKyoKKyogIFRlc3RzIFpUUk1WLCBaVEJNViwgWlRQTVYsIFpUUlNWLCBaVEJTViBhbmQgWlRQU1YuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEhBTEYgPSAoIDAuNUQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFQoIE5NQVggKSwgWFgoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBUUkFOU0wKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDRCwgSUNULCBJQ1UsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgIEtTLCBMQUEsIExEQSwgTERBUywgTFgsIE4sIE5BUkdTLCBOQywgTkssIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUsIExaRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExaRSwgTFpFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpNQUtFLCBaTVZDSCwgWlRCTVYsIFpUQlNWLCBaVFBNViwgWlRQU1YsCisgICAgICQgICAgICAgICAgICAgICAgICAgWlRSTVYsIFpUUlNWCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVS8nVUwnLywgSUNIVC8nTlRDJy8sIElDSEQvJ1VOJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1InCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKiAgICAgU2V0IHVwIHplcm8gdmVjdG9yIGZvciBaTVZDSC4KKyAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICBaKCBJICkgPSBaRVJPCisgICAxMCBDT05USU5VRQorKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgRElBRywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRSTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpUQk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRQTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRCU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFBTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gRElBRy5FUS5ESUFHUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkVSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWiwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsIHZlY3Rvci4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYWCggMSArICggSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWCApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFgsIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwKKyAgICAgJCAgICAgIElOQ1gKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssCisgICAgICQgICAgICBMREEsIElOQ1gKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQVAsICcsCisgICAgICQgICAgICAnWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJyBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBLCcsCisgICAgICQgICAgICBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIFpHRVJDIGFuZCBaR0VSVS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgSEFMRiA9ICggMC41RDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIEFMUywgVFJBTlNMCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBMQUEsIExEQSwgTERBUywgTFgsIExZLCBNLCBNUywgTiwgTkFSR1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkMsIE5ELCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaR0VSQywgWkdFUlUsIFpNQUtFLCBaTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgRENPTkpHLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggNTogNSApLkVRLidDJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgTkFSR1MgPSA5CisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREEgPSBNCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDEwMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE0sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE0gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBNLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE0vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE0vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA5MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE0gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkdFUkMoIE0sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpHRVJVKCBNLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBBUywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTSAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIE4gLSBKICsgMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IERDT05KRyggVyggMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1WQ0goICdOJywgTSwgMSwgQUxQSEEsIFosIE5NQVgsIFcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEoIDEsIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggMSArICggSiAtIDEgKSpMREEgKSwgRVBTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgIDcwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IgTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTUwCisqCisgIDEzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCBJMywgJywnICksICcoJywgRjQuMSwgJywnLCBGNC4xLAorICAgICAkICAgICAgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgWkhFUiBhbmQgWkhQUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgSEFMRiA9ICggMC41RDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYLCBSQUxQSEEsIFJBTFMKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUMsIElOLCBJTkNYLCBJTkNYUywgSVgsIEosIEpBLCBKSiwgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTEosIExYLCBOLCBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVyggMSApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUiwgWkhQUiwgWk1BS0UsIFpNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBEQkxFLCBEQ01QTFgsIERDT05KRywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNgorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA3MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgIFJBTFBIQSA9IERCTEUoIEFMRiggSUEgKSApCisgICAgICAgICAgICAgICAgICBBTFBIQSA9IERDTVBMWCggUkFMUEhBLCBSWkVSTyApCisgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLlJBTFBIQS5FUS5SWkVSTworKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgTiAtIDEsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgIFJBTFMgPSBSQUxQSEEKKyAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorKgorKiAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJBTFBIQSwgSU5DWCwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSKCBVUExPLCBOLCBSQUxQSEEsIFhYLCBJTkNYLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBSQUxQSEEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpIUFIoIFVQTE8sIE4sIFJBTFBIQSwgWFgsIElOQ1gsIEFBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gUkFMUy5FUS5SQUxQSEEKKyAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLCBOLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIE4gLSBJICsgMSApCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBKQSA9IDEKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBEQ09OSkcoIFooIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1WQ0goICdOJywgTEosIDEsIEFMUEhBLCBaKCBKSiApLCBMSiwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE9ORSwgQSggSkosIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIGlmIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWCwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLNiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBaSEVSMiBhbmQgWkhQUjIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEhBTEYgPSAoIDAuNUQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYLCAyICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgSkEsIEpKLCBMQUEsIExEQSwgTERBUywgTEosIExYLCBMWSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVyggMiApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUjIsIFpIUFIyLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIERDT05KRywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOAorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTQwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxNDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyAxMzAgSUMgPSAxLCAyCisgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgRE8gMTIwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5BTFBIQS5FUS5aRVJPCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSFBSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUywgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBOIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIEkgKQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBOIC0gSSArIDEgKQorICAgODAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gQUxQSEEqRENPTkpHKCBaKCBKLCAyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMiApID0gRENPTkpHKCBBTFBIQSApKkRDT05KRyggWiggSiwgMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggJ04nLCBMSiwgMiwgT05FLCBaKCBKSiwgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgVywgMSwgT05FLCBBKCBKSiwgSiApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVQsIEcsIEFBKCBKQSApLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgIDkwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE3MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE2MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsCisgICAgICQgICAgICBJTkNZLCBMREEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEFQKSAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBYLCcsIEkyLCAnLCBZLCcsIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAnLAorICAgICAkICAgICAgJyAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEs2LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBTFBIQSwgUkFMUEhBLCBCRVRBLCBBLCBYIGFuZCBZIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJBTFBIQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggMSwgMSApLCBYKCAxICksIFkoIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIFpHQk1WLCBaR0VNViwgWkdFUkMsIFpHRVJVLCBaSEJNViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBaSEVNViwgWkhFUiwgWkhFUjIsIFpIUE1WLCBaSFBSLCBaSFBSMiwgWlRCTVYsCisgICAgICQgICAgICAgICAgICAgICAgICAgWlRCU1YsIFpUUE1WLCBaVFBTViwgWlRSTVYsIFpUUlNWCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgT0sgaXMgc2V0IHRvIC5GQUxTRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgb3IgYnkgQ0hLWEVSCisqICAgICBpZiBhbnl0aGluZyBpcyB3cm9uZy4KKyAgICAgIE9LID0gLlRSVUUuCisqICAgICBMRVJSIGlzIHNldCB0byAuVFJVRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgZWFjaCB0aW1lCisqICAgICBpdCBpcyBjYWxsZWQsIGFuZCBpcyB0aGVuIHRlc3RlZCBhbmQgcmUtc2V0IGJ5IENIS1hFUi4KKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAsIDEwMCwgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwKKyAgICAgJCAgICAgICAgMTcwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpHRU1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFTVYoICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTVYoICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWkdFTVYoICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdCTVYoICcvJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaR0JNViggJ04nLCAtMSwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0JNViggJ04nLCAyLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAxLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICAzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhFTVYoICcvJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVNViggJ1UnLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSEVNViggJ1UnLCAyLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEJNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpIQk1WKCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIQk1WKCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpIQk1WKCAnVScsIDAsIDEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkhCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWkhCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIUE1WKCAnLycsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhQTVYoICdVJywgLTEsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWkhQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaSFBNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRSTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFJNViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUk1WKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRSTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWlRSTVYoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaVFJNViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRCTVYoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVEJNViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUQk1WKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVEJNViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA4MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRQTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFBNViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUE1WKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRQTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlRQTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUUlNWKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRSU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVFJTViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUUlNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUlNWKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWlRSU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUQlNWKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRCU1YoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVEJTViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRCU1YoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUUFNWKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRQU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVFBTViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUUFNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpUUFNWKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTIwIElORk9UID0gMQorICAgICAgQ0FMTCBaR0VSQyggLTEsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFUkMoIDAsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRVJDKCAwLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpHRVJDKCAwLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpHRVJDKCAyLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDEzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdFUlUoIC0xLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpHRVJVKCAwLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VSVSggMCwgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaR0VSVSggMCwgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaR0VSVSggMiwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIRVIoICcvJywgMCwgUkFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhFUiggJ1UnLCAtMSwgUkFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkhFUiggJ1UnLCAwLCBSQUxQSEEsIFgsIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVSKCAnVScsIDIsIFJBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhQUiggJy8nLCAwLCBSQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSFBSKCAnVScsIC0xLCBSQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSFBSKCAnVScsIDAsIFJBTFBIQSwgWCwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhFUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSEVSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFUjIoICdVJywgMiwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNzAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIUFIyKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhQUjIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkhQUjIoICdVJywgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSFBSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorICAxODAgSUYoIE9LIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU1JOQU1UCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1UCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMnICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMgKioqKionLAorICAgICAkICAgICAgJyoqJyApCisqCisqICAgICBFbmQgb2YgWkNIS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWk1BS0UoIFRZUEUsIFVQTE8sIERJQUcsIE0sIE4sIEEsIE5NQVgsIEFBLCBMREEsIEtMLAorICAgICAkICAgICAgICAgICAgICAgICAgS1UsIFJFU0VULCBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBIHdpdGhpbiB0aGUgYmFuZHdpZHRoCisqICBkZWZpbmVkIGJ5IEtMIGFuZCBLVS4KKyogIFN0b3JlcyB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBBQSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQKKyogIGJ5IHRoZSByb3V0aW5lLCB3aXRoIHVud2FudGVkIGVsZW1lbnRzIHNldCB0byByb2d1ZSB2YWx1ZS4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0dCJywgJ0hFJywgJ0hCJywgJ0hQJywgJ1RSJywgJ1RCJyBPUiAnVFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMEQwLCAwLjBEMCApICkKKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAoIC0xLjBEMTAsIDEuMEQxMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlJPR1VFCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSUk9HVUUgPSAtMS4wRDEwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLTCwgS1UsIExEQSwgTSwgTiwgTk1BWAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsICogKSwgQUEoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEkxLCBJMiwgSTMsIElCRUcsIElFTkQsIElPRkYsIEosIEpKLCBLSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFpCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQkxFLCBEQ01QTFgsIERDT05KRywgTUFYLCBNSU4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRSggMTogMSApLkVRLidHJworICAgICAgU1lNID0gVFlQRSggMTogMSApLkVRLidIJworICAgICAgVFJJID0gVFlQRSggMTogMSApLkVRLidUJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBJRiggKCBJLkxFLkouQU5ELkogLSBJLkxFLktVICkuT1IuCisgICAgICQgICAgICAgICAgICAgKCBJLkdFLkouQU5ELkkgLSBKLkxFLktMICkgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIEkuTkUuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gRENPTkpHKCBBKCBJLCBKICkgKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIFNZTSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBEQ01QTFgoIERCTEUoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidHQicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBETyA2MCBJMSA9IDEsIEtVICsgMSAtIEoKKyAgICAgICAgICAgICAgIEFBKCBJMSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNzAgSTIgPSBJMSwgTUlOKCBLTCArIEtVICsgMSwgS1UgKyAxICsgTSAtIEogKQorICAgICAgICAgICAgICAgQUEoIEkyICsgKCBKIC0gMSApKkxEQSApID0gQSggSTIgKyBKIC0gS1UgLSAxLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJMyA9IEkyLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJMyArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKIC0gMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxMDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDExMCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgMTEwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTIwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICBKSiA9IEogKyAoIEogLSAxICkqTERBCisgICAgICAgICAgICAgICBBQSggSkogKSA9IERDTVBMWCggREJMRSggQUEoIEpKICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgIEVORCBJRgorICAxMzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hCJy5PUi5UWVBFLkVRLidUQicgKVRIRU4KKyAgICAgICAgIERPIDE3MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBLSyA9IEtMICsgMQorICAgICAgICAgICAgICAgSUJFRyA9IE1BWCggMSwgS0wgKyAyIC0gSiApCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wgKyAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSAyCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTUlOKCBLTCArIDEsIDEgKyBNIC0gSiApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE0MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTQwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSArIEogLSBLSywgSiApCisgIDE1MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTYwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgSkogPSBLSyArICggSiAtIDEgKSpMREEKKyAgICAgICAgICAgICAgIEFBKCBKSiApID0gRENNUExYKCBEQkxFKCBBQSggSkogKSApLCBSUk9HVUUgKQorICAgICAgICAgICAgRU5EIElGCisgIDE3MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nSFAnLk9SLlRZUEUuRVEuJ1RQJyApVEhFTgorICAgICAgICAgSU9GRiA9IDAKKyAgICAgICAgIERPIDE5MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxODAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIElPRkYgPSBJT0ZGICsgMQorICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgSUYoIEkuRVEuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IFJPR1VFCisgICAgICAgICAgICAgICAgICBJRiggU1lNICkKKyAgICAgJCAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBEQ01QTFgoIERCTEUoIEFBKCBJT0ZGICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgICAgIEVORCBJRgorICAxODAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpNVkNIKCBUUkFOUywgTSwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgTVYgKQorKgorKiAgQ2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBjb21wdXRhdGlvbmFsIHRlc3RzLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwLCBST05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBFUlIKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNYLCBJTkNZLCBNLCBOLCBOTUFYLCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIE1WCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsICogKSwgWCggKiApLCBZKCAqICksIFlUKCAqICksIFlZKCAqICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBDCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVJSSQorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElOQ1hMLCBJTkNZTCwgSVksIEosIEpYLCBLWCwgS1ksIE1MLCBOTAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIENUUkFOLCBUUkFOCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBEQkxFLCBEQ09OSkcsIERJTUFHLCBNQVgsIFNRUlQKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBQlMxCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb24gZGVmaW5pdGlvbnMgLi4KKyAgICAgIEFCUzEoIEMgKSA9IEFCUyggREJMRSggQyApICkgKyBBQlMoIERJTUFHKCBDICkgKQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnCisgICAgICBDVFJBTiA9IFRSQU5TLkVRLidDJworICAgICAgSUYoIFRSQU4uT1IuQ1RSQU4gKVRIRU4KKyAgICAgICAgIE1MID0gTgorICAgICAgICAgTkwgPSBNCisgICAgICBFTFNFCisgICAgICAgICBNTCA9IE0KKyAgICAgICAgIE5MID0gTgorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWC5MVC4wIClUSEVOCisgICAgICAgICBLWCA9IE5MCisgICAgICAgICBJTkNYTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWCA9IDEKKyAgICAgICAgIElOQ1hMID0gMQorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWS5MVC4wIClUSEVOCisgICAgICAgICBLWSA9IE1MCisgICAgICAgICBJTkNZTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWSA9IDEKKyAgICAgICAgIElOQ1lMID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBDb21wdXRlIGV4cGVjdGVkIHJlc3VsdCBpbiBZVCB1c2luZyBkYXRhIGluIEEsIFggYW5kIFkuCisqICAgICBDb21wdXRlIGdhdWdlcyBpbiBHLgorKgorICAgICAgSVkgPSBLWQorICAgICAgRE8gNDAgSSA9IDEsIE1MCisgICAgICAgICBZVCggSVkgKSA9IFpFUk8KKyAgICAgICAgIEcoIElZICkgPSBSWkVSTworICAgICAgICAgSlggPSBLWAorICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDEwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEosIEkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEosIEkgKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggQ1RSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDIwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIERDT05KRyggQSggSiwgSSApICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMxKCBBKCBKLCBJICkgKSpBQlMxKCBYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIERPIDMwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEksIEogKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEksIEogKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBZVCggSVkgKSA9IEFMUEhBKllUKCBJWSApICsgQkVUQSpZKCBJWSApCisgICAgICAgICBHKCBJWSApID0gQUJTMSggQUxQSEEgKSpHKCBJWSApICsgQUJTMSggQkVUQSApKkFCUzEoIFkoIElZICkgKQorICAgICAgICAgSVkgPSBJWSArIElOQ1lMCisgICA0MCBDT05USU5VRQorKgorKiAgICAgQ29tcHV0ZSB0aGUgZXJyb3IgcmF0aW8gZm9yIHRoaXMgcmVzdWx0LgorKgorICAgICAgRVJSID0gWkVSTworICAgICAgRE8gNTAgSSA9IDEsIE1MCisgICAgICAgICBFUlJJID0gQUJTKCBZVCggSSApIC0gWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSApL0VQUworICAgICAgICAgSUYoIEcoIEkgKS5ORS5SWkVSTyApCisgICAgICQgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuUk9ORSApCisgICAgICQgICAgICBHTyBUTyA2MAorICAgNTAgQ09OVElOVUUKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyA4MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAgNjAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDcwIEkgPSAxLCBNTAorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgWVQoIEkgKSwKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSwgWVQoIEkgKQorICAgICAgICAgRU5EIElGCisgICA3MCBDT05USU5VRQorKgorICAgODAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEIFJFJywKKyAgICAgJCAgICAgICdTVUxUICAgICAgICAgICAgICAgICAgICBDT01QVVRFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyKCAnICAoJywgRzE1LjYsICcsJywgRzE1LjYsICcpJyApICkKKyoKKyogICAgIEVuZCBvZiBaTVZDSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkUoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExaRSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMWkUgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMWkUuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTFpFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0hFJyBvciAnSFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgICAgTFpFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExaRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExaRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgQ09NUExFWCoxNiBGVU5DVElPTiBaQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDLCBKLCBNSSwgTUoKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDTVBMWAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIE1KID0gNDU3CisgICAgICAgICBJID0gNworICAgICAgICAgSiA9IDcKKyAgICAgICAgIElDID0gMAorICAgICAgICAgUkVTRVQgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgb2YgSSBvciBKIGlzIGJvdW5kZWQgYmV0d2VlbiAxIGFuZCA5OTkuCisqICAgICBJZiBpbml0aWFsIEkgb3IgSiA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgb3IgSiA9IDQgb3IgOCwgdGhlIHBlcmlvZCB3aWxsIGJlIDI1LgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSA1LCB0aGUgcGVyaW9kIHdpbGwgYmUgMTAuCisqICAgICBJQyBpcyB1c2VkIHRvIGJyZWFrIHVwIHRoZSBwZXJpb2QgYnkgc2tpcHBpbmcgMSB2YWx1ZSBvZiBJIG9yIEoKKyogICAgIGluIDYuCisqCisgICAgICBJQyA9IElDICsgMQorICAgMTAgSSA9IEkqTUkKKyAgICAgIEogPSBKKk1KCisgICAgICBJID0gSSAtIDEwMDAqKCBJLzEwMDAgKQorICAgICAgSiA9IEogLSAxMDAwKiggSi8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIFpCRUcgPSBEQ01QTFgoICggSSAtIDUwMCApLzEwMDEuMEQwLCAoIEogLSA1MDAgKS8xMDAxLjBEMCApCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBaQkVHLgorKgorICAgICAgRU5ECisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERESUZGKCBYLCBZICkKKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWCwgWQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBERElGRiA9IFggLSBZCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBERElGRi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyogIFRlc3RzIHdoZXRoZXIgWEVSQkxBIGhhcyBkZXRlY3RlZCBhbiBlcnJvciB3aGVuIGl0IHNob3VsZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvemJsYXQzLmRhdCBiL2JsYXMvdGVzdGluZy96YmxhdDMuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTUxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvemJsYXQzLmRhdApAQCAtMCwwICsxLDIzIEBACisnemJsYXQzLnN1bW0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKzYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorJ3pibGF0My5zbmFwJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKzE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCis2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKzAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisoMC4wLDAuMCkgKDEuMCwwLjApICgwLjcsLTAuOSkgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDEuMywtMS4xKSAgICAgICBWQUxVRVMgT0YgQkVUQQorWkdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlRSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEVSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlNZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIRVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3pibGF0My5mIGIvYmxhcy90ZXN0aW5nL3pibGF0My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2EyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvemJsYXQzLmYKQEAgLTAsMCArMSwzNTAyIEBACisqPiBcYnJpZWYgXGIgWkJMQVQzCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBQUk9HUkFNIFpCTEFUMworKiAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBUZXN0IHByb2dyYW0gZm9yIHRoZSBDT01QTEVYKjE2ICAgICAgIExldmVsIDMgQmxhcy4KKyo+CisqPiBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE0IHJlY29yZHMKKyo+IG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDkgcmVjb3JkcworKj4gYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyo+IGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyo+IGZvbGxvd2luZyAyMyBsaW5lczoKKyo+ICd6YmxhdDMub3V0JyAgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKj4gNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqPiAnWkJMQVQzLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqPiAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqPiBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyo+IFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKj4gMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyo+IDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKj4gMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyo+ICgwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyo+IDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKj4gKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCisqPiBaR0VNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWkhFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWlRSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpIRVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPiBaU1lSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKj4gWkhFUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyo+IFpTWVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqPgorKj4gCisqPiBGdXJ0aGVyIERldGFpbHMKKyo+ID09PT09PT09PT09PT09PQorKj4KKyo+IFNlZToKKyo+CisqPiAgICBEb25nYXJyYSBKLiBKLiwgRHUgQ3JveiBKLiBKLiwgRHVmZiBJLiBTLiBhbmQgSGFtbWFybGluZyBTLgorKj4gICAgQSBTZXQgb2YgTGV2ZWwgMyBCYXNpYyBMaW5lYXIgQWxnZWJyYSBTdWJwcm9ncmFtcy4KKyo+CisqPiAgICBUZWNobmljYWwgTWVtb3JhbmR1bSBOby44OCAoUmV2aXNpb24gMSksIE1hdGhlbWF0aWNzIGFuZAorKj4gICAgQ29tcHV0ZXIgU2NpZW5jZSBEaXZpc2lvbiwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LCA5NzAwCisqPiAgICBTb3V0aCBDYXNzIEF2ZW51ZSwgQXJnb25uZSwgSWxsaW5vaXMgNjA0MzksIFVTLgorKj4KKyo+IC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKj4gICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKj4gICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqPiAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKj4gICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqPgorKj4gICAgMTAtOS0wMDogIENoYW5nZSBTVEFUVVM9J05FVycgdG8gJ1VOS05PV04nIHNvIHRoYXQgdGhlIHRlc3RlcnMKKyo+ICAgICAgICAgICAgICBjYW4gYmUgcnVuIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgZGVsZXRpbmcgZ2VuZXJhdGVkCisqPiAgICAgICAgICAgICAgb3V0cHV0IGZpbGVzIChzdXNhbikKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXgxNl9ibGFzX3Rlc3RpbmcKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUFJPR1JBTSBaQkxBVDMKKyoKKyogIC0tIFJlZmVyZW5jZSBCTEFTIHRlc3Qgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIFJlZmVyZW5jZSBCTEFTIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDkgKQorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5NQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5NQVggPSA2NSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklETUFYLCBOQUxNQVgsIE5CRU1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklETUFYID0gOSwgTkFMTUFYID0gNywgTkJFTUFYID0gNyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBFUlIsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElTTlVNLCBKLCBOLCBOQUxGLCBOQkVULCBOSURJTSwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBMVEVTVFQsIFJFV0ksIFNBTUUsIFNGQVRBTCwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICAgVFNURVJSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlNBLCBUUkFOU0IKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVQKKyAgICAgIENIQVJBQ1RFUiozMiAgICAgICBTTkFQUywgU1VNTVJZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBQSggTk1BWCpOTUFYICksIEFCKCBOTUFYLCAyKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTE1BWCApLCBBUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRU1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJTKCBOTUFYKk5NQVggKSwgQyggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBOTUFYKk5NQVggKSwgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFcoIDIqTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklETUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTFpFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpDSEsxLCBaQ0hLMiwgWkNISzMsIFpDSEs0LCBaQ0hLNSwgWkNIS0UsIFpNTUNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ1pHRU1NICcsICdaSEVNTSAnLCAnWlNZTU0gJywgJ1pUUk1NICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1pUUlNNICcsICdaSEVSSyAnLCAnWlNZUksgJywgJ1pIRVIySycsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1pTWVIySycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdVTktOT1dOJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ1VOS05PV04nICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMjAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBBTFBIQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQUxGCisgICAgICBJRiggTkFMRi5MVC4xLk9SLk5BTEYuR1QuTkFMTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0FMUEhBJywgTkFMTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisqICAgICBWYWx1ZXMgb2YgQkVUQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQkVUCisgICAgICBJRiggTkJFVC5MVC4xLk9SLk5CRVQuR1QuTkJFTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0JFVEEnLCBOQkVNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyoKKyogICAgIFJlcG9ydCB2YWx1ZXMgb2YgcGFyYW1ldGVycy4KKyoKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorICAgICAgSUYoIC5OT1QuVFNURVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NCApCisgICAgICBFTkQgSUYKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClUSFJFU0gKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyoKKyogICAgIFJlYWQgbmFtZXMgb2Ygc3Vicm91dGluZXMgYW5kIGZsYWdzIHdoaWNoIGluZGljYXRlCisqICAgICB3aGV0aGVyIHRoZXkgYXJlIHRvIGJlIHRlc3RlZC4KKyoKKyAgICAgIERPIDIwIEkgPSAxLCBOU1VCUworICAgICAgICAgTFRFU1QoIEkgKSA9IC5GQUxTRS4KKyAgIDIwIENPTlRJTlVFCisgICAzMCBSRUFEKCBOSU4sIEZNVCA9IDk5ODgsIEVORCA9IDYwIClTTkFNRVQsIExURVNUVAorICAgICAgRE8gNDAgSSA9IDEsIE5TVUJTCisgICAgICAgICBJRiggU05BTUVULkVRLlNOQU1FUyggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDUwCisgICA0MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTAgKVNOQU1FVAorICAgICAgU1RPUAorICAgNTAgTFRFU1QoIEkgKSA9IExURVNUVAorICAgICAgR08gVE8gMzAKKyoKKyAgIDYwIENPTlRJTlVFCisgICAgICBDTE9TRSAoIE5JTiApCisqCisqICAgICBDb21wdXRlIEVQUyAodGhlIG1hY2hpbmUgcHJlY2lzaW9uKS4KKyoKKyAgICAgIEVQUyA9IEVQU0lMT04oUlpFUk8pCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgWk1NQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEwMCBKID0gMSwgTgorICAgICAgICAgRE8gOTAgSSA9IDEsIE4KKyAgICAgICAgICAgIEFCKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgICA5MCAgICBDT05USU5VRQorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBKCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IEoKKyAgICAgICAgIEMoIEosIDEgKSA9IFpFUk8KKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMTAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDExMCBDT05USU5VRQorKiAgICAgQ0MgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIFpNTUNIIENUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IFpNTUNILgorICAgICAgVFJBTlNBID0gJ04nCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgWk1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMWkUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlNCID0gJ0MnCisgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFpFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBOIC0gSiArIDEKKyAgICAgICAgIEFCKCAxLCBOTUFYICsgSiApID0gTiAtIEogKyAxCisgIDEyMCBDT05USU5VRQorICAgICAgRE8gMTMwIEogPSAxLCBOCisgICAgICAgICBDQyggTiAtIEogKyAxICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0KKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMzAgQ09OVElOVUUKKyAgICAgIFRSQU5TQSA9ICdDJworICAgICAgVFJBTlNCID0gJ04nCisgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFpFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdDJworICAgICAgQ0FMTCBaTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExaRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjAwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIFpDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNTAsIDE1MCwgMTYwLCAxNjAsIDE3MCwgMTcwLAorICAgICAkICAgICAgICAgICAgICAxODAsIDE4MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgWkdFTU0sIDAxLgorICAxNDAgICAgICAgQ0FMTCBaQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFpIRU1NLCAwMiwgWlNZTU0sIDAzLgorICAxNTAgICAgICAgQ0FMTCBaQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFpUUk1NLCAwNCwgWlRSU00sIDA1LgorICAxNjAgICAgICAgQ0FMTCBaQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQUIsCisgICAgICQgICAgICAgICAgICAgICAgICBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIENULCBHLCBDICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBaSEVSSywgMDYsIFpTWVJLLCAwNy4KKyAgMTcwICAgICAgIENBTEwgWkNISzQoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBaSEVSMkssIDA4LCBaU1lSMkssIDA5LgorICAxODAgICAgICAgQ0FMTCBaQ0hLNSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKgorICAxOTAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjEwCisgICAgICAgICBFTkQgSUYKKyAgMjAwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NiApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApCisqCisgIDIzMCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRDkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVEVTVFMgT0YgVEhFIENPTVBMRVgqMTYgICAgICAgTEVWRUwgMyBCTEFTJywgLy8nIFRIRSBGJywKKyAgICAgJCAgICAgICdPTExPV0lORyBQQVJBTUVURVIgVkFMVUVTIFdJTEwgQkUgVVNFRDonICkKKyA5OTk0IEZPUk1BVCggJyAgIEZPUiBOICAgICAgICAgICAgICAnLCA5STYgKQorIDk5OTMgRk9STUFUKCAnICAgRk9SIEFMUEhBICAgICAgICAgICcsCisgICAgICQgICAgICA3KCAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgICcsIDogKSApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTkxIEZPUk1BVCggJyBBTUVORCBEQVRBIEZJTEUgT1IgSU5DUkVBU0UgQVJSQVkgU0laRVMgSU4gUFJPR1JBTScsCisgICAgICQgICAgICAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk5MCBGT1JNQVQoICcgU1VCUFJPR1JBTSBOQU1FICcsIEE2LCAnIE5PVCBSRUNPR05JWkVEJywgLycgKioqKioqKiBUJywKKyAgICAgJCAgICAgICdFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4OSBGT1JNQVQoICcgRVJST1IgSU4gWk1NQ0ggLSAgSU4tTElORSBET1QgUFJPRFVDVFMgQVJFIEJFSU5HIEVWQUxVJywKKyAgICAgJCAgICAgICdBVEVEIFdST05HTFkuJywgLycgWk1NQ0ggV0FTIENBTExFRCBXSVRIIFRSQU5TQSA9ICcsIEExLAorICAgICAkICAgICAgJyBBTkQgVFJBTlNCID0gJywgQTEsIC8nIEFORCBSRVRVUk5FRCBTQU1FID0gJywgTDEsICcgQU5EICcsCisgICAgICQgICAgICAnRVJSID0gJywgRjEyLjMsICcuJywgLycgVEhJUyBNQVkgQkUgRFVFIFRPIEZBVUxUUyBJTiBUSEUgJywKKyAgICAgJCAgICAgICdBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nLCAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAnLAorICAgICAkICAgICAgJyoqKioqKionICkKKyA5OTg4IEZPUk1BVCggQTYsIEwyICkKKyA5OTg3IEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4NiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODUgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBaQkxBVDMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgWkdFTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNBLCBJQ0IsIElLLCBJTSwgSU4sIEssIEtTLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgTUEsIE1CLCBNUywgTiwgTkEsIE5BUkdTLCBOQiwgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU5BLCBUUkFOQgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5BUywgVFJBTkJTLCBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkdFTU0sIFpNQUtFLCBaTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTMKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMTAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ0EgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOU0EgPSBJQ0goIElDQTogSUNBICkKKyAgICAgICAgICAgICAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisqCisgICAgICAgICAgICAgICAgICBJRiggVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNQSA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDQiA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQiA9IElDSCggSUNCOiBJQ0IgKQorICAgICAgICAgICAgICAgICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IEsKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CID0gSworICAgICAgICAgICAgICAgICAgICAgICAgTkIgPSBOCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgICAgTERCID0gTUIKKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBHTyBUTyA3MAorICAgICAgICAgICAgICAgICAgICAgTEJCID0gTERCKk5CCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTUIsIE5CLCBCLCBOTUFYLCBCQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkJTID0gVFJBTlNCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLCBMREEsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TQS5FUS5UUkFOQVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU0IuRVEuVFJBTkJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMWkUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMWkVSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSwgTk1BWCwgQiwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIE5NQVgsIENULCBHLCBDQywgTERDLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnJycsIEExLCAnJycsJywKKyAgICAgJCAgICAgIDMoIEkzLCAnLCcgKSwgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLAorICAgICAkICAgICAgJywoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQywnLCBJMywgJykuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBaSEVNTSBhbmQgWlNZTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNTLCBJQ1UsIElNLCBJTiwgTEFBLCBMQkIsIExDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLCBNUywgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgU0lERSwgU0lERVMsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIUywgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFTU0sIFpNQUtFLCBaTU1DSCwgWlNZTU0KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIUy8nTFInLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDI6IDMgKS5FUS4nSEUnCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyA5MCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKiAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREIgPSBNCisgICAgICAgICAgICBJRiggTERCLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERCID0gTERCICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERCLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisqCisqICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwgQkIsIExEQiwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBaRVJPICkKKyoKKyAgICAgICAgICAgIERPIDgwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyoKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBoZXJtaXRpYW4gb3Igc3ltbWV0cmljIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOQSwgTkEsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVVBMTywgTSwgTiwgQUxQSEEsIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVNTSggU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlNZTU0oIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBTSURFUy5FUS5TSURFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMWkUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFpFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExaRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggJ04nLCAnTicsIE0sIE4sIE0sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQiwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggJ04nLCAnTicsIE0sIE4sIE4sIEFMUEhBLCBCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQSwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMjAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsCisgICAgICQgICBMREIsIEJFVEEsIExEQworKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcsKCcsIEY0LjEsCisgICAgICQgICAgICAnLCcsIEY0LjEsICcpLCBDLCcsIEkzLCAnKSAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLMi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLMyggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBCLCBCQiwgQlMsIENULCBHLCBDICkKKyoKKyogIFRlc3RzIFpUUk1NIGFuZCBaVFJTTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDVCggTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQ0QsIElDUywgSUNULCBJQ1UsIElNLCBJTiwgSiwgTEFBLCBMQkIsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIE0sIE1TLCBOLCBOQSwgTkFSR1MsIE5DLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgU0lERSwgU0lERVMsIFRSQU5BUywgVFJBTlNBLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIUywgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUsIExaRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExaRSwgTFpFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpNQUtFLCBaTU1DSCwgWlRSTU0sIFpUUlNNCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvLCBJQ0hTLydMUicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTEKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqICAgICBTZXQgdXAgemVybyBtYXRyaXggZm9yIFpNTUNILgorICAgICAgRE8gMjAgSiA9IDEsIE5NQVgKKyAgICAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICAgICBDKCBJLCBKICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgMjAgQ09OVElOVUUKKyoKKyAgICAgIERPIDE0MCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisgICAgICAgICAgICBOVUxMID0gTS5MRS4wLk9SLk4uTEUuMAorKgorICAgICAgICAgICAgRE8gMTIwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDkwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnVFInLCBVUExPLCBESUFHLCBOQSwgTkEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQVMgPSBUUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQUdTID0gRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwgTiwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRSU00oIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIEFMUEhBLCBBQSwgTERBLCBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gVFJBTkFTLkVRLlRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IERJQUdTLkVRLkRJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMWkUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFpFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEJTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREJTLkVRLkxEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQiwgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEMsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQkIoIEkgKyAoIEogLSAxICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIoIEkgKyAoIEogLSAxICkqTERCICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEksIEogKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggVFJBTlNBLCAnTicsIE0sIE4sIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEsIE5NQVgsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEMsIE5NQVgsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgIE4sIEFMUEhBLCBMREEsIExEQgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDQoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcpICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLNCggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBaSEVSSyBhbmQgWlNZUksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBST05FLCBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9ORSA9IDEuMEQwLCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWCwgUkFMUEhBLCBSQUxTLCBSQkVUQSwgUkJFVFMKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDVCwgSUNVLCBJSywgSU4sIEosIEpDLCBKSiwgSywgS1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEFBLCBMQ0MsIExEQSwgTERBUywgTERDLCBMRENTLCBMSiwgTUEsIE4sIE5BLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDT05KLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTiwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTLCBUUkFOU1QsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVCwgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUkssIFpNQUtFLCBaTU1DSCwgWlNZUksKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQ01QTFgsIE1BWCwgREJMRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggMjogMyApLkVRLidIRScKKyoKKyAgICAgIE5BUkdTID0gMTAKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgTENDID0gTERDKk4KKyoKKyAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAyCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOLkFORC4uTk9ULkNPTkogKQorICAgICAkICAgICAgICAgICAgVFJBTlMgPSAnVCcKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEEsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJBTFBIQSA9IERCTEUoIEFMUEhBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gRENNUExYKCBSQUxQSEEsIFJaRVJPICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVEEgPSBEQkxFKCBCRVRBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBEQ01QTFgoIFJCRVRBLCBSWkVSTyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOVUxMLk9SLiggKCBLLkxFLjAuT1IuUkFMUEhBLkVRLgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJaRVJPICkuQU5ELlJCRVRBLkVRLlJPTkUgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQ0MsIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTFMgPSBSQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRTID0gUkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBSQUxQSEEsIExEQSwgUkJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhFUksoIFVQTE8sIFRSQU5TLCBOLCBLLCBSQUxQSEEsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBSQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpTWVJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBSQUxTLkVRLlJBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gUkJFVFMuRVEuUkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMWkUoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMWkVSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQ1MsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNUID0gJ0MnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnVCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggVFJBTlNULCAnTicsIExKLCAxLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEoIDEsIEpKICksIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCAxLCBKICksIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsIFRSQU5TVCwgTEosIDEsIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSggSkosIDEgKSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIEosIDEgKSwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgNDAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDExMCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBSQUxQSEEsCisgICAgICQgICAgICBMREEsIFJCRVRBLCBMREMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgIExEQSwgQkVUQSwgTERDCisgICAgICBFTkQgSUYKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgRjQuMSwgJywgQSwnLCBJMywgJywnLCBGNC4xLCAnLCBDLCcsIEkzLCAnKSAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICwgQSwnLCBJMywgJywoJywgRjQuMSwgJywnLCBGNC4xLAorICAgICAkICAgICAgJyksIEMsJywgSTMsICcpICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEs0LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEs1KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisqCisqICBUZXN0cyBaSEVSMksgYW5kIFpTWVIySy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBST05FLCBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9ORSA9IDEuMEQwLCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIDIqTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxGICksIEFTKCBOTUFYKk5NQVggKSwgQkIoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBXKCAyKk5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCRVRTCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVJSLCBFUlJNQVgsIFJCRVRBLCBSQkVUUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBKSkFCLAorICAgICAkICAgICAgICAgICAgICAgICAgIEssIEtTLCBMQUEsIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDT05KLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTiwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTLCBUUkFOU1QsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIVCwgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUjJLLCBaTUFLRSwgWk1NQ0gsIFpTWVIySworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDTVBMWCwgRENPTkpHLCBNQVgsIERCTEUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVC8nTkMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDI6IDMgKS5FUS4nSEUnCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQyA9IE4KKyAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMzAKKyAgICAgICAgIExDQyA9IExEQypOCisqCisgICAgICAgICBETyAxMjAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgIERPIDExMCBJQ1QgPSAxLCAyCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOLkFORC4uTk9ULkNPTkogKQorICAgICAkICAgICAgICAgICAgVFJBTlMgPSAnVCcKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIDIqTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICBMREIgPSBMREEKKyAgICAgICAgICAgICAgIExCQiA9IExBQQorICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiggSypOTUFYICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyAxMDAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDkwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDgwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRBID0gREJMRSggQkVUQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gRENNUExYKCBSQkVUQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTlVMTC5PUi4oICggSy5MRS4wLk9SLkFMUEhBLkVRLgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8gKS5BTkQuUkJFVEEuRVEuUk9ORSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDQywgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUUyA9IFJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgQUxQSEEsIExEQSwgTERCLCBSQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSMksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBCQiwgTERCLCBSQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlNZUjJLKCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNTLkVRLlRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBSQkVUUy5FUS5SQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCRVRTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFpFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExaRVJFUyggJ0hFJywgVVBMTywgTiwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNUID0gJ0MnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnVCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpBQiggKCBKIC0gMSApKjIqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYICsgSyArIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBEQ09OSkcoIEFMUEhBICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUIoICggSiAtIDEgKSoyKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBKIC0gMSApKjIqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCArIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggVFJBTlNULCAnTicsIExKLCAxLCAyKkssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEFCKCBKSkFCICksIDIqTk1BWCwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqTk1BWCwgQkVUQSwgQyggSkosIEogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIENULCBHLCBDQyggSkMgKSwgTERDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSSApID0gQUxQSEEqRENPTkpHKCBBQiggKCBLICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgLSAxICkqTk1BWCArIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gRENPTkpHKCBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpBQiggKCBLICsgSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTU1DSCggJ04nLCAnTicsIExKLCAxLCAyKkssIE9ORSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCBKSiApLCBOTUFYLCBXLCAyKk5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBDKCBKSiwgSiApLCBOTUFYLCBDVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcsIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKQUIgPSBKSkFCICsgMipOTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICA3MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA4MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgQ09OVElOVUUKKyoKKyAgMTMwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBMREIsIFJCRVRBLCBMREMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgIEVORCBJRgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcsJywgRjQuMSwKKyAgICAgJCAgICAgICcsIEMsJywgSTMsICcpICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJywoJywgRjQuMSwKKyAgICAgJCAgICAgICcsJywgRjQuMSwgJyksIEMsJywgSTMsICcpICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEs1LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBLCBCIGFuZCBDIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogIDMtMTktOTI6ICBJbml0aWFsaXplIEFMUEhBLCBCRVRBLCBSQUxQSEEsIGFuZCBSQkVUQSAgKGVjYSkKKyogIDMtMTktOTI6ICBGaXggYXJndW1lbnQgMTIgaW4gY2FsbHMgdG8gWlNZTU0gYW5kIFpIRU1NCisqICAgICAgICAgICAgd2l0aCBJTkZPVCA9IDkgIChlY2EpCisqICAxMC05LTAwOiAgRGVjbGFyZWQgSU5UUklOU0lDIERDTVBMWCAoc3VzYW4pCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBPTkUsIFRXTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRDAsIFRXTyA9IDIuMEQwICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJBTFBIQSwgUkJFVEEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIDIsIDEgKSwgQiggMiwgMSApLCBDKCAyLCAxICkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkdFTU0sIFpIRU1NLCBaSEVSMkssIFpIRVJLLCBDSEtYRVIsIFpTWU1NLAorICAgICAkICAgICAgICAgICAgICAgICAgIFpTWVIySywgWlNZUkssIFpUUk1NLCBaVFJTTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDTVBMWAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIE9LIGlzIHNldCB0byAuRkFMU0UuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIG9yIGJ5IENIS1hFUgorKiAgICAgaWYgYW55dGhpbmcgaXMgd3JvbmcuCisgICAgICBPSyA9IC5UUlVFLgorKiAgICAgTEVSUiBpcyBzZXQgdG8gLlRSVUUuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIGVhY2ggdGltZQorKiAgICAgaXQgaXMgY2FsbGVkLCBhbmQgaXMgdGhlbiB0ZXN0ZWQgYW5kIHJlLXNldCBieSBDSEtYRVIuCisgICAgICBMRVJSID0gLkZBTFNFLgorKgorKiAgICAgSW5pdGlhbGl6ZSBBTFBIQSwgQkVUQSwgUkFMUEhBLCBhbmQgUkJFVEEuCisqCisgICAgICBBTFBIQSA9IERDTVBMWCggT05FLCAtT05FICkKKyAgICAgIEJFVEEgPSBEQ01QTFgoIFRXTywgLVRXTyApCisgICAgICBSQUxQSEEgPSBPTkUKKyAgICAgIFJCRVRBID0gVFdPCisqCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAgKUlTTlVNCisgICAxMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdFTU0oICcvJywgJ04nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpHRU1NKCAnLycsICdDJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBaR0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpHRU1NKCAnQycsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnLycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdDJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ0MnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ1QnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnQycsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEVNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBaU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBaVFJNTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpUUk1NKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdSJywgJ1UnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdSJywgJ0wnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRSU00oICcvJywgJ1UnLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnLycsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdVJywgJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnTicsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIRVJLKCAnLycsICdOJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdUJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdOJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnQycsIC0xLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAtMSwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdDJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnTicsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ0MnLCAwLCAtMSwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdOJywgMCwgLTEsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSSyggJ0wnLCAnQycsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnQycsIDIsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDIsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdDJywgMiwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlNZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDgwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEVSMksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ1QnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdDJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ0MnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUjJLKCAnTCcsICdDJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdDJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ0MnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlNZUjJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDEwMCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnSEUnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gKCAtMS4wRDEwLCAxLjBEMTAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlJPR1VFID0gLTEuMEQxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSiwgSkoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBHRU4sIEhFUiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFpCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQ01QTFgsIERDT05KRywgREJMRQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBHRU4gPSBUWVBFLkVRLidHRScKKyAgICAgIEhFUiA9IFRZUEUuRVEuJ0hFJworICAgICAgU1lNID0gVFlQRS5FUS4nU1knCisgICAgICBUUkkgPSBUWVBFLkVRLidUUicKKyAgICAgIFVQUEVSID0gKCBIRVIuT1IuU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidVJworICAgICAgTE9XRVIgPSAoIEhFUi5PUi5TWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisqICAgICAgICAgICAgICAgICBTZXQgc29tZSBlbGVtZW50cyB0byB6ZXJvCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4zLkFORC5KLkVRLk4vMiApCisgICAgICQgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJRiggSEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBEQ09OSkcoIEEoIEksIEogKSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIEhFUiApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBEQ01QTFgoIERCTEUoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nU1knLk9SLlRZUEUuRVEuJ1RSJyApVEhFTgorICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDYwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDgwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIEhFUiApVEhFTgorICAgICAgICAgICAgICAgSkogPSBKICsgKCBKIC0gMSApKkxEQQorICAgICAgICAgICAgICAgQUEoIEpKICkgPSBEQ01QTFgoIERCTEUoIEFBKCBKSiApICksIFJST0dVRSApCisgICAgICAgICAgICBFTkQgSUYKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgS0ssIEFMUEhBLCBBLCBMREEsIEIsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVEEsIEMsIExEQywgQ1QsIEcsIENDLCBMRENDLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTywgUk9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCwgUk9ORSA9IDEuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0ssIExEQSwgTERCLCBMREMsIExEQ0MsIE0sIE4sIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTERBLCAqICksIEIoIExEQiwgKiApLCBDKCBMREMsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTERDQywgKiApLCBDVCggKiApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQ0wKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENUUkFOQSwgQ1RSQU5CLCBUUkFOQSwgVFJBTkIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIERJTUFHLCBEQ09OSkcsIE1BWCwgREJMRSwgU1FSVAorKiAgICAgLi4gU3RhdGVtZW50IEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFCUzEKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbiBkZWZpbml0aW9ucyAuLgorICAgICAgQUJTMSggQ0wgKSA9IEFCUyggREJMRSggQ0wgKSApICsgQUJTKCBESU1BRyggQ0wgKSApCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworICAgICAgQ1RSQU5BID0gVFJBTlNBLkVRLidDJworICAgICAgQ1RSQU5CID0gVFJBTlNCLkVRLidDJworKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQsIG9uZSBjb2x1bW4gYXQgYSB0aW1lLCBpbiBDVCB1c2luZyBkYXRhCisqICAgICBpbiBBLCBCIGFuZCBDLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIERPIDIyMCBKID0gMSwgTgorKgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBaRVJPCisgICAgICAgICAgICBHKCBJICkgPSBSWkVSTworICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCAuTk9ULlRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyAzMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEksIEsgKSApKkFCUzEoIEIoIEssIEogKSApCisgICAyMCAgICAgICAgICBDT05USU5VRQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIFRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5BIClUSEVOCisgICAgICAgICAgICAgICBETyA1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIERDT05KRyggQSggSywgSSApICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEssIEogKSApCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgNTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDcwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBLLCBKICkgKQorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVMU0UgSUYoIC5OT1QuVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICBETyA5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpEQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDExMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5BIClUSEVOCisgICAgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgRENPTkpHKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDE1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE0MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBEQ09OSkcoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTUwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBDVFJBTkIgKVRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE3MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENPTkpHKCBCKCBKLCBLICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyAxOTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxODAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxODAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRU5EIElGCisgICAgICAgICBETyAyMDAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBBTFBIQSpDVCggSSApICsgQkVUQSpDKCBJLCBKICkKKyAgICAgICAgICAgIEcoIEkgKSA9IEFCUzEoIEFMUEhBICkqRyggSSApICsKKyAgICAgJCAgICAgICAgICAgICAgIEFCUzEoIEJFVEEgKSpBQlMxKCBDKCBJLCBKICkgKQorICAyMDAgICAgQ09OVElOVUUKKyoKKyogICAgICAgIENvbXB1dGUgdGhlIGVycm9yIHJhdGlvIGZvciB0aGlzIHJlc3VsdC4KKyoKKyAgICAgICAgIEVSUiA9IFpFUk8KKyAgICAgICAgIERPIDIxMCBJID0gMSwgTQorICAgICAgICAgICAgRVJSSSA9IEFCUzEoIENUKCBJICkgLSBDQyggSSwgSiApICkvRVBTCisgICAgICAgICAgICBJRiggRyggSSApLk5FLlJaRVJPICkKKyAgICAgJCAgICAgICAgIEVSUkkgPSBFUlJJL0coIEkgKQorICAgICAgICAgICAgRVJSID0gTUFYKCBFUlIsIEVSUkkgKQorICAgICAgICAgICAgSUYoIEVSUipTUVJUKCBFUFMgKS5HRS5ST05FICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIzMAorICAyMTAgICAgQ09OVElOVUUKKyoKKyAgMjIwIENPTlRJTlVFCisqCisqICAgICBJZiB0aGUgbG9vcCBjb21wbGV0ZXMsIGFsbCByZXN1bHRzIGFyZSBhdCBsZWFzdCBoYWxmIGFjY3VyYXRlLgorICAgICAgR08gVE8gMjUwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgIDIzMCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gMjQwIEkgPSAxLCBNCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBDVCggSSApLCBDQyggSSwgSiApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ0MoIEksIEogKSwgQ1QoIEkgKQorICAgICAgICAgRU5EIElGCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSgorKgorICAyNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEIFJFJywKKyAgICAgJCAgICAgICdTVUxUICAgICAgICAgICAgICAgICAgICBDT01QVVRFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyKCAnICAoJywgRzE1LjYsICcsJywgRzE1LjYsICcpJyApICkKKyA5OTk3IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyoKKyogICAgIEVuZCBvZiBaTU1DSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkUoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTFpFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExaRSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExaRS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkVSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnIG9yICdIRScgb3IgJ1NZJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nU1knIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAzMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyoKKyAgICAgIExaRVJFUyA9IC5UUlVFLgorICAgICAgR08gVE8gODAKKyAgIDcwIENPTlRJTlVFCisgICAgICBMWkVSRVMgPSAuRkFMU0UuCisgICA4MCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMWkVSRVMuCisqCisgICAgICBFTkQKKyAgICAgIENPTVBMRVgqMTYgICAgIEZVTkNUSU9OIFpCRUcoIFJFU0VUICkKKyoKKyogIEdlbmVyYXRlcyBjb21wbGV4IG51bWJlcnMgYXMgcGFpcnMgb2YgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5CisqICBkaXN0cmlidXRlZCBiZXR3ZWVuIC0wLjUgYW5kIDAuNS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQywgSiwgTUksIE1KCisqICAgICAuLiBTYXZlIHN0YXRlbWVudCAuLgorICAgICAgU0FWRSAgICAgICAgICAgICAgIEksIElDLCBKLCBNSSwgTUoKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQ01QTFgKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBNSiA9IDQ1NworICAgICAgICAgSSA9IDcKKyAgICAgICAgIEogPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgb3IgSiBpcyBib3VuZGVkIGJldHdlZW4gMSBhbmQgOTk5LgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNSwgdGhlIHBlcmlvZCB3aWxsIGJlIDEwLgorKiAgICAgSUMgaXMgdXNlZCB0byBicmVhayB1cCB0aGUgcGVyaW9kIGJ5IHNraXBwaW5nIDEgdmFsdWUgb2YgSSBvciBKCisqICAgICBpbiA2LgorKgorICAgICAgSUMgPSBJQyArIDEKKyAgIDEwIEkgPSBJKk1JCisgICAgICBKID0gSipNSgorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIEogPSBKIC0gMTAwMCooIEovMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBaQkVHID0gRENNUExYKCAoIEkgLSA1MDAgKS8xMDAxLjBEMCwgKCBKIC0gNTAwICkvMTAwMS4wRDAgKQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkJFRy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBERElGRiggWCwgWSApCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFgsIFkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRERJRkYgPSBYIC0gWQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRERJRkYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisqICBUZXN0cyB3aGV0aGVyIFhFUkJMQSBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3Igd2hlbiBpdCBzaG91bGQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDMgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDMgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk8KKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTUUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVCwgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBMRVJSID0gLlRSVUUuCisgICAgICBJRiggSU5GTy5ORS5JTkZPVCApVEhFTgorICAgICAgICAgSUYoIElORk9ULk5FLjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPLCBJTkZPVAorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUlORk8KKyAgICAgICAgIEVORCBJRgorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBTUk5BTUUuTkUuU1JOQU1UIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1FLCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LCAnIElOU1RFQUQnLAorICAgICAkICAgICAgJyBPRiAnLCBJMiwgJyAqKioqKioqJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIFNSTkFNRSA9ICcsIEE2LCAnIElOU1RFJywKKyAgICAgJCAgICAgICdBRCBPRiAnLCBBNiwgJyAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwKKyAgICAgJCAgICAgICcgKioqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFhFUkJMQQorKgorICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JsYXMveGVyYmxhLmNwcCBiL2JsYXMveGVyYmxhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzczZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy94ZXJibGEuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiAoZGVmaW5lZCBfX0dOVUNfXykgJiYgKCFkZWZpbmVkIF9fTUlOR1czMl9fKSAmJiAoIWRlZmluZWQgX19DWUdXSU5fXykKKyNkZWZpbmUgRUlHRU5fV0VBS19MSU5LSU5HIF9fYXR0cmlidXRlX18gKCh3ZWFrKSkKKyNlbHNlCisjZGVmaW5lIEVJR0VOX1dFQUtfTElOS0lORworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKK0VJR0VOX1dFQUtfTElOS0lORyBpbnQgeGVyYmxhXyhjb25zdCBjaGFyICogbXNnLCBpbnQgKmluZm8sIGludCkKK3sKKyAgcHJpbnRmKCJFaWdlbiBCTEFTIEVSUk9SICMlaTogJXNcbiIsICppbmZvLCBtc2cgKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbjNDb25maWcuY21ha2UuaW4gYi9jbWFrZS9FaWdlbjNDb25maWcuY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjNTQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0VpZ2VuM0NvbmZpZy5jbWFrZS5pbgpAQCAtMCwwICsxLDIxIEBACisjIFRoaXMgZmlsZSBleHBvcnRzIHRoZSBFaWdlbjM6OkVpZ2VuIENNYWtlIHRhcmdldCB3aGljaCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZQorIyB0YXJnZXRfbGlua19saWJyYXJpZXMgY29tbWFuZC4KKworQFBBQ0tBR0VfSU5JVEAKKworaW5jbHVkZSAoIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vRWlnZW4zVGFyZ2V0cy5jbWFrZSIpCisKKyMgTGVnYWN5IHZhcmlhYmxlcywgZG8gKm5vdCogdXNlLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCitzZXQgKEVJR0VOM19GT1VORCAxKQorc2V0IChFSUdFTjNfVVNFX0ZJTEUgICAgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vVXNlRWlnZW4zLmNtYWtlIikKKworc2V0IChFSUdFTjNfREVGSU5JVElPTlMgICJARUlHRU5fREVGSU5JVElPTlNAIikKK3NldCAoRUlHRU4zX0lOQ0xVREVfRElSICAiQFBBQ0tBR0VfRUlHRU5fSU5DTFVERV9ESVJAIikKK3NldCAoRUlHRU4zX0lOQ0xVREVfRElSUyAiQFBBQ0tBR0VfRUlHRU5fSU5DTFVERV9ESVJAIikKK3NldCAoRUlHRU4zX1JPT1RfRElSICAgICAiQFBBQ0tBR0VfRUlHRU5fUk9PVF9ESVJAIikKKworc2V0IChFSUdFTjNfVkVSU0lPTl9TVFJJTkcgIkBFSUdFTl9WRVJTSU9OX1NUUklOR0AiKQorc2V0IChFSUdFTjNfVkVSU0lPTl9NQUpPUiAgIkBFSUdFTl9WRVJTSU9OX01BSk9SQCIpCitzZXQgKEVJR0VOM19WRVJTSU9OX01JTk9SICAiQEVJR0VOX1ZFUlNJT05fTUlOT1JAIikKK3NldCAoRUlHRU4zX1ZFUlNJT05fUEFUQ0ggICJARUlHRU5fVkVSU0lPTl9QQVRDSEAiKQpkaWZmIC0tZ2l0IGEvY21ha2UvRWlnZW4zQ29uZmlnTGVnYWN5LmNtYWtlLmluIGIvY21ha2UvRWlnZW4zQ29uZmlnTGVnYWN5LmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDcyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9FaWdlbjNDb25maWdMZWdhY3kuY21ha2UuaW4KQEAgLTAsMCArMSwzMCBAQAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIGNtYWtlIC0qLQorIworIyAgRWlnZW4zQ29uZmlnLmNtYWtlKC5pbikKKworIyBVc2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdG8gY29tcGlsZSBhbmQgbGluayBhZ2FpbnN0IEVpZ2VuOgorIyAgRUlHRU4zX0ZPVU5EICAgICAgICAgICAgICAtIFRydWUgaWYgRWlnZW4gd2FzIGZvdW5kIG9uIHlvdXIgc3lzdGVtCisjICBFSUdFTjNfVVNFX0ZJTEUgICAgICAgICAgIC0gVGhlIGZpbGUgbWFraW5nIEVpZ2VuIHVzYWJsZQorIyAgRUlHRU4zX0RFRklOSVRJT05TICAgICAgICAtIERlZmluaXRpb25zIG5lZWRlZCB0byBidWlsZCB3aXRoIEVpZ2VuCisjICBFSUdFTjNfSU5DTFVERV9ESVIgICAgICAgIC0gRGlyZWN0b3J5IHdoZXJlIHNpZ25hdHVyZV9vZl9laWdlbjNfbWF0cml4X2xpYnJhcnkgY2FuIGJlIGZvdW5kCisjICBFSUdFTjNfSU5DTFVERV9ESVJTICAgICAgIC0gTGlzdCBvZiBkaXJlY3RvcmllcyBvZiBFaWdlbiBhbmQgaXQncyBkZXBlbmRlbmNpZXMKKyMgIEVJR0VOM19ST09UX0RJUiAgICAgICAgICAgLSBUaGUgYmFzZSBkaXJlY3Rvcnkgb2YgRWlnZW4KKyMgIEVJR0VOM19WRVJTSU9OX1NUUklORyAgICAgLSBBIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBjb250YWluaW5nIHRoZSB2ZXJzaW9uCisjICBFSUdFTjNfVkVSU0lPTl9NQUpPUiAgICAgIC0gVGhlIG1ham9yIHZlcnNpb24gb2YgRWlnZW4KKyMgIEVJR0VOM19WRVJTSU9OX01JTk9SICAgICAgLSBUaGUgbWlub3IgdmVyc2lvbiBvZiBFaWdlbgorIyAgRUlHRU4zX1ZFUlNJT05fUEFUQ0ggICAgICAtIFRoZSBwYXRjaCB2ZXJzaW9uIG9mIEVpZ2VuCisKK0BQQUNLQUdFX0lOSVRACisKK3NldCAoIEVJR0VOM19GT1VORCAxICkKK3NldCAoIEVJR0VOM19VU0VfRklMRSAgICAgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vVXNlRWlnZW4zLmNtYWtlIiApCisKK3NldCAoIEVJR0VOM19ERUZJTklUSU9OUyAgIkBFSUdFTl9ERUZJTklUSU9OU0AiICkKK3NldCAoIEVJR0VOM19JTkNMVURFX0RJUiAgIkBQQUNLQUdFX0VJR0VOX0lOQ0xVREVfRElSQCIgKQorc2V0ICggRUlHRU4zX0lOQ0xVREVfRElSUyAiQFBBQ0tBR0VfRUlHRU5fSU5DTFVERV9ESVJAIiApCitzZXQgKCBFSUdFTjNfUk9PVF9ESVIgICAgICJAUEFDS0FHRV9FSUdFTl9ST09UX0RJUkAiICkKKworc2V0ICggRUlHRU4zX1ZFUlNJT05fU1RSSU5HICJARUlHRU5fVkVSU0lPTl9TVFJJTkdAIiApCitzZXQgKCBFSUdFTjNfVkVSU0lPTl9NQUpPUiAgIkBFSUdFTl9WRVJTSU9OX01BSk9SQCIgKQorc2V0ICggRUlHRU4zX1ZFUlNJT05fTUlOT1IgICJARUlHRU5fVkVSU0lPTl9NSU5PUkAiICkKK3NldCAoIEVJR0VOM19WRVJTSU9OX1BBVENIICAiQEVJR0VOX1ZFUlNJT05fUEFUQ0hAIiApCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbkNvbmZpZ3VyZVRlc3RpbmcuY21ha2UgYi9jbWFrZS9FaWdlbkNvbmZpZ3VyZVRlc3RpbmcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMjRiNQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0VpZ2VuQ29uZmlndXJlVGVzdGluZy5jbWFrZQpAQCAtMCwwICsxLDYxIEBACitpbmNsdWRlKEVpZ2VuVGVzdGluZykKK2luY2x1ZGUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworIyBjb25maWd1cmUgdGhlICJzaXRlIiBhbmQgImJ1aWxkbmFtZSIgCitlaV9zZXRfc2l0ZW5hbWUoKQorCisjIHJldHJpZXZlIGFuZCBzdG9yZSB0aGUgYnVpbGQgc3RyaW5nCitlaV9zZXRfYnVpbGRfc3RyaW5nKCkKKworYWRkX2N1c3RvbV90YXJnZXQoYnVpbGR0ZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGNoZWNrIENPTU1BTkQgImN0ZXN0IikKK2FkZF9kZXBlbmRlbmNpZXMoY2hlY2sgYnVpbGR0ZXN0cykKKworIyBjaGVjayB3aGV0aGVyIC9iaW4vYmFzaCBleGlzdHMKK2ZpbmRfZmlsZShFSUdFTl9CSU5fQkFTSF9FWElTVFMgIi9iaW4vYmFzaCIgUEFUSFMgIi8iIE5PX0RFRkFVTFRfUEFUSCkKKworIyBUaGlzIGNhbGwgYWN0aXZhdGVzIHRlc3RpbmcgYW5kIGdlbmVyYXRlcyB0aGUgRGFydENvbmZpZ3VyYXRpb24udGNsCitpbmNsdWRlKENUZXN0KQorCitzZXQoRUlHRU5fVEVTVF9CVUlMRF9GTEFHUyAiIiBDQUNIRSBTVFJJTkcgIk9wdGlvbnMgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kIG9mIHVuaXQgdGVzdHMiKQorCisjIE92ZXJ3cml0ZSBkZWZhdWx0IERhcnRDb25maWd1cmF0aW9uLnRjbCBzdWNoIHRoYXQgY3Rlc3QgY2FuIGJ1aWxkIG91ciB1bml0IHRlc3RzLgorIyBSZWNhbGwgdGhhdCBvdXIgdW5pdCB0ZXN0cyBhcmUgbm90IGluIHRoZSAiYWxsIiB0YXJnZXQsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRlbHkgYXNrIGN0ZXN0IHRvIGJ1aWxkIG91ciBjdXN0b20gJ2J1aWxkdGVzdHMnIHRhcmdldC4KKyMgQXQgdGhpcyBzdGFnZSwgd2UgY2FuIGFsc28gYWRkIGN1c3RvbSBmbGFncyB0byB0aGUgYnVpbGQgdG9vbCB0aHJvdWdoIHRoZSB1c2VyIGRlZmluZWQgRUlHRU5fVEVTVF9CVUlMRF9GTEFHUyB2YXJpYWJsZS4KK2ZpbGUoUkVBRCAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9EYXJ0Q29uZmlndXJhdGlvbi50Y2wiIEVJR0VOX0RBUlRfQ09ORklHX0ZJTEUpCisjIHRyeSB0byBncmFiIHRoZSBkZWZhdWx0IGZsYWdzCitzdHJpbmcoUkVHRVggTUFUQ0ggIk1ha2VDb21tYW5kOi4qLS0gKC4qKVxuRGVmYXVsdENUZXN0Q29uZmlndXJhdGlvblR5cGUiIEVJR0VOX0RVTU1ZICR7RUlHRU5fREFSVF9DT05GSUdfRklMRX0pCitpZihOT1QgQ01BS0VfTUFUQ0hfMSkKK3N0cmluZyhSRUdFWCBNQVRDSCAiTWFrZUNvbW1hbmQ6LipbXmNdbWFrZSAoLiopXG5EZWZhdWx0Q1Rlc3RDb25maWd1cmF0aW9uVHlwZSIgRUlHRU5fRFVNTVkgJHtFSUdFTl9EQVJUX0NPTkZJR19GSUxFfSkKK2VuZGlmKCkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJNYWtlQ29tbWFuZDouKkRlZmF1bHRDVGVzdENvbmZpZ3VyYXRpb25UeXBlIiAiTWFrZUNvbW1hbmQ6ICR7Q01BS0VfQ09NTUFORH0gLS1idWlsZCAuIC0tdGFyZ2V0IGJ1aWxkdGVzdHMgLS1jb25maWcgXCJcJHtDVEVTVF9DT05GSUdVUkFUSU9OX1RZUEV9XCIgLS0gJHtDTUFLRV9NQVRDSF8xfSAke0VJR0VOX1RFU1RfQlVJTERfRkxBR1N9XG5EZWZhdWx0Q1Rlc3RDb25maWd1cmF0aW9uVHlwZSIKKyAgICAgICBFSUdFTl9EQVJUX0NPTkZJR19GSUxFMiAke0VJR0VOX0RBUlRfQ09ORklHX0ZJTEV9KQorZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0RhcnRDb25maWd1cmF0aW9uLnRjbCIgJHtFSUdFTl9EQVJUX0NPTkZJR19GSUxFMn0pCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DVGVzdEN1c3RvbS5jbWFrZS5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L0NUZXN0Q3VzdG9tLmNtYWtlKQorCisjIHNvbWUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIG5pY2UKK2VpX2luaXRfdGVzdGluZygpCisKKyMgY29uZmlndXJlIEVpZ2VuIHJlbGF0ZWQgdGVzdGluZyBvcHRpb25zCitvcHRpb24oRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HICJEaXNhYmxlIGNoZWNraW5nIG9mIGFzc2VydGlvbnMgdXNpbmcgZXhjZXB0aW9ucyIgT0ZGKQorb3B0aW9uKEVJR0VOX0RFQlVHX0FTU0VSVFMgIkVuYWJsZSBhZHZhbmNlZCBkZWJ1Z2luZyBvZiBhc3NlcnRpb25zIiBPRkYpCisKK2lmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKKyAgb3B0aW9uKEVJR0VOX0NPVkVSQUdFX1RFU1RJTkcgIkVuYWJsZS9kaXNhYmxlIGdjb3YiIE9GRikKKyAgaWYoRUlHRU5fQ09WRVJBR0VfVEVTVElORykKKyAgICBzZXQoQ09WRVJBR0VfRkxBR1MgIi1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIpCisgICAgc2V0KENURVNUX0NVU1RPTV9DT1ZFUkFHRV9FWENMVURFICIvdGVzdC8iKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke0NPVkVSQUdFX0ZMQUdTfSIpCisgIGVuZGlmKEVJR0VOX0NPVkVSQUdFX1RFU1RJTkcpCisgIAorZWxzZWlmKE1TVkMpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAvRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC9EX1NDTF9TRUNVUkVfTk9fV0FSTklOR1MiKQorZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorCisKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKCItc3RkPWMrKzExIiBFSUdFTl9DT01QSUxFUl9TVVBQT1JUX0NYWDExKQorCitpZihFSUdFTl9URVNUX0NYWDExIEFORCBFSUdFTl9DT01QSUxFUl9TVVBQT1JUX0NYWDExKQorICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbkRldGVybWluZU9TVmVyc2lvbi5jbWFrZSBiL2NtYWtlL0VpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9FaWdlbkRldGVybWluZU9TVmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDQ2IEBACisjIFRoZSB1dGlsaXR5IGZ1bmN0aW9uIERldGVybWluZU9TVmVyc2lvbiBhaW1zIGF0IHByb3ZpZGluZyBhbgorIyBpbXByb3ZlZCB2ZXJzaW9uIG9mIHRoZSBDTWFrZSB2YXJpYWJsZSAke0NNQUtFX1NZU1RFTX0gb24gV2luZG93cworIyBtYWNoaW5lcy4KKyMKKyMgVXNhZ2U6CisjICBpbmNsdWRlKEVpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uKQorIyAgRGV0ZXJtaW5lT1NWZXJzaW9uKE9TX1ZFUlNJT04pCisjICBtZXNzYWdlKCJPUzogJHtPU19WRVJTSU9OfSIpCisKKyMgLSBBIGxpdHRsZSBoZWxwZXIgdmFyaWFibGUgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXJlY3RseSBjYWxsZWQKK2Z1bmN0aW9uKERldGVybWluZVNob3J0V2luZG93c05hbWUgV0lOX1ZFUlNJT04gd2luX251bV92ZXJzaW9uKQorICAgaWYgICAgKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI2LjEiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luNyIpCisgICBlbHNlaWYoJHt3aW5fbnVtX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjYuMCIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ3aW5WaXN0YSIpCisgICBlbHNlaWYoJHt3aW5fbnVtX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjUuMiIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ3aW5YcFByb2YiKQorICAgZWxzZWlmKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI1LjEiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luWHAiKQorICAgZWxzZWlmKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI1LjAiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luMjAwMFByb2YiKQorICAgZWxzZSgpCisgICAgICAgc2V0KF92ZXJzaW9uICJ1bmtub3duV2luIikKKyAgIGVuZGlmKCkKKyAgIHNldCgke1dJTl9WRVJTSU9OfSAke192ZXJzaW9ufSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKERldGVybWluZU9TVmVyc2lvbiBPU19WRVJTSU9OKQorICBpZiAoV0lOMzIgQU5EIENNQUtFX0hPU1RfU1lTVEVNX05BTUUgTUFUQ0hFUyBXaW5kb3dzKQorICAgIGZpbGUgKFRPX05BVElWRV9QQVRIICIkRU5We0NPTVNQRUN9IiBTSEVMTCkKKyAgICBleGVjX3Byb2dyYW0oICR7U0hFTEx9IEFSR1MgIi9jIiAidmVyIiBPVVRQVVRfVkFSSUFCTEUgdmVyX291dHB1dCkKKwkJCQkKKyAgICAgIHN0cmluZyhSRUdFWCBNQVRDSEFMTCAiWzAtOV0rIgorICAgICAgICAgICB2ZXJfbGlzdCAiJHt2ZXJfb3V0cHV0fSIpCisgICAgICBsaXN0KEdFVCB2ZXJfbGlzdCAwIF9tYWpvcikJCSAgIAorICAgICAgbGlzdChHRVQgdmVyX2xpc3QgMSBfbWlub3IpCisJCQkJCisgICAgc2V0KHdpbl9udW1fdmVyc2lvbiAke19tYWpvcn0uJHtfbWlub3J9KQorICAgIERldGVybWluZVNob3J0V2luZG93c05hbWUod2luX3ZlcnNpb24gIiR7d2luX251bV92ZXJzaW9ufSIpCisgICAgaWYod2luX3ZlcnNpb24pCisgICAgICBzZXQoJHtPU19WRVJTSU9OfSAke3dpbl92ZXJzaW9ufSBQQVJFTlRfU0NPUEUpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBzZXQoJHtPU19WRVJTSU9OfSAke0NNQUtFX1NZU1RFTX0gUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbkRldGVybWluZVZTU2VydmljZVBhY2suY21ha2UgYi9jbWFrZS9FaWdlbkRldGVybWluZVZTU2VydmljZVBhY2suY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNzgxOQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0VpZ2VuRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjay5jbWFrZQpAQCAtMCwwICsxLDQxIEBACitpbmNsdWRlKENNYWtlRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjaykKKworIyBUaGUgY29kZSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBDTWFrZSB2ZXJzaW9uLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgd2UgcmVtb3ZlCisjIF9EZXRlcm1pbmVWU1NlcnZpY2VQYWNrX0Zhc3RDaGVja1ZlcnNpb25XaXRoQ29tcGlsZXIgd2hpY2ggbGVhZCB0byBlcnJvcnMgb24gc29tZSBzeXN0ZW1zLgorZnVuY3Rpb24oRWlnZW5EZXRlcm1pbmVWU1NlcnZpY2VQYWNrIF9wYWNrKQorICAgIGlmKE5PVCBERVRFUk1JTkVEX1ZTX1NFUlZJQ0VfUEFDSyBPUiBOT1QgJHtfcGFja30pCisgICAgICAgIGlmKE5PVCBERVRFUk1JTkVEX1ZTX1NFUlZJQ0VfUEFDSykKKyAgICAgICAgICAgIF9EZXRlcm1pbmVWU1NlcnZpY2VQYWNrX0NoZWNrVmVyc2lvbldpdGhUcnlDb21waWxlKERFVEVSTUlORURfVlNfU0VSVklDRV9QQUNLIF9jbF92ZXJzaW9uKQorICAgICAgICAgICAgaWYoTk9UIERFVEVSTUlORURfVlNfU0VSVklDRV9QQUNLKQorICAgICAgICAgICAgICAgIF9EZXRlcm1pbmVWU1NlcnZpY2VQYWNrX0NoZWNrVmVyc2lvbldpdGhUcnlSdW4oREVURVJNSU5FRF9WU19TRVJWSUNFX1BBQ0sgX2NsX3ZlcnNpb24pCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKworICAgICAgICBpZihERVRFUk1JTkVEX1ZTX1NFUlZJQ0VfUEFDSykKKyAgICAgICAgICAgIGlmKF9jbF92ZXJzaW9uKQorICAgICAgICAgICAgICAgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIFZTIHZlcnNpb24KKyAgICAgICAgICAgICAgICBfRGV0ZXJtaW5lVlNTZXJ2aWNlUGFja0Zyb21Db21waWxlcihfc3AgIiR7X2NsX3ZlcnNpb259IikKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyB0ZW1wb3JhcnkgZml4LCB1bnRpbCBDTWFrZSBjYXRjaGVzIHVwCisgICAgICAgICAgICAgICAgaWYgKE5PVCBfc3ApCisgICAgICAgICAgICAgICAgICAgIGlmKCR7X2NsX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjE3LjAwLjUwNzI3LjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0KF9zcCAidmMxMTAiKQorICAgICAgICAgICAgICAgICAgICBlbHNlaWYoJHtfY2xfdmVyc2lvbn0gVkVSU0lPTl9FUVVBTCAiMTcuMDAuNTExMDYuMSIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoX3NwICJ2YzExMHNwMSIpCisgICAgICAgICAgICAgICAgICAgIGVsc2VpZigke19jbF92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICIxNy4wMC42MDMxNS4xIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChfc3AgInZjMTEwc3AyIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZWlmKCR7X2NsX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjE3LjAwLjYwNjEwLjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0KF9zcCAidmMxMTBzcDMiKQorICAgICAgICAgICAgICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChfc3AgJHtDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTn0pCisgICAgICAgICAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoX3NwKQorICAgICAgICAgICAgICAgICAgICBzZXQoJHtfcGFja30gJHtfc3B9IENBQ0hFIElOVEVSTkFMCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIFZpc3VhbCBTdHVkaW8gUmVsZWFzZSB3aXRoIFNlcnZpY2UgUGFjayIpCisgICAgICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvY21ha2UvRWlnZW5UZXN0aW5nLmNtYWtlIGIvY21ha2UvRWlnZW5UZXN0aW5nLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9FaWdlblRlc3RpbmcuY21ha2UKQEAgLTAsMCArMSw3MjMgQEAKKworbWFjcm8oZWlfYWRkX3Byb3BlcnR5IHByb3AgdmFsdWUpCisgIGdldF9wcm9wZXJ0eShwcmV2aW91cyBHTE9CQUwgUFJPUEVSVFkgJHtwcm9wfSkKKyAgaWYgKChOT1QgcHJldmlvdXMpIE9SIChwcmV2aW91cyBTVFJFUVVBTCAiIikpCisgICAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSAke3Byb3B9ICIke3ZhbHVlfSIpCisgIGVsc2UoKQorICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgJHtwcm9wfSAiJHtwcmV2aW91c30gJHt2YWx1ZX0iKQorICBlbmRpZigpCitlbmRtYWNybyhlaV9hZGRfcHJvcGVydHkpCisKKyNpbnRlcm5hbC4gU2VlIGRvY3VtZW50YXRpb24gb2YgZWlfYWRkX3Rlc3QgZm9yIGRldGFpbHMuCittYWNybyhlaV9hZGRfdGVzdF9pbnRlcm5hbCB0ZXN0bmFtZSB0ZXN0bmFtZV93aXRoX3N1ZmZpeCkKKyAgc2V0KHRhcmdldG5hbWUgJHt0ZXN0bmFtZV93aXRoX3N1ZmZpeH0pCisKKyAgaWYoRUlHRU5fQUREX1RFU1RfRklMRU5BTUVfRVhURU5TSU9OKQorICAgIHNldChmaWxlbmFtZSAke3Rlc3RuYW1lfS4ke0VJR0VOX0FERF9URVNUX0ZJTEVOQU1FX0VYVEVOU0lPTn0pCisgIGVsc2UoKQorICAgIHNldChmaWxlbmFtZSAke3Rlc3RuYW1lfS5jcHApCisgIGVuZGlmKCkKKworICBpZihFSUdFTl9BRERfVEVTVF9GSUxFTkFNRV9FWFRFTlNJT04gU1RSRVFVQUwgY3UpCisgICAgaWYoRUlHRU5fVEVTVF9DVURBX0NMQU5HKQorICAgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7ZmlsZW5hbWV9IFBST1BFUlRJRVMgTEFOR1VBR0UgQ1hYKQorICAgICAgaWYoQ1VEQV82NF9CSVRfREVWSUNFX0NPREUpCisgICAgICAgIGxpbmtfZGlyZWN0b3JpZXMoIiR7Q1VEQV9UT09MS0lUX1JPT1RfRElSfS9saWI2NCIpCisgICAgICBlbHNlKCkKKyAgICAgICAgbGlua19kaXJlY3RvcmllcygiJHtDVURBX1RPT0xLSVRfUk9PVF9ESVJ9L2xpYiIpCisgICAgICBlbmRpZigpCisgICAgICBpZiAoJHtBUkdDfSBHUkVBVEVSIDIpCisgICAgICAgIGFkZF9leGVjdXRhYmxlKCR7dGFyZ2V0bmFtZX0gJHtmaWxlbmFtZX0pCisgICAgICBlbHNlKCkKKyAgICAgICAgYWRkX2V4ZWN1dGFibGUoJHt0YXJnZXRuYW1lfSAke2ZpbGVuYW1lfSBPUFRJT05TICR7QVJHVjJ9KQorICAgICAgZW5kaWYoKQorICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gImN1ZGFydF9zdGF0aWMiICJjdWRhIiAiZGwiICJydCIgInB0aHJlYWQiKQorICAgIGVsc2UoKQorICAgICAgaWYgKCR7QVJHQ30gR1JFQVRFUiAyKQorICAgICAgICBjdWRhX2FkZF9leGVjdXRhYmxlKCR7dGFyZ2V0bmFtZX0gJHtmaWxlbmFtZX0gT1BUSU9OUyAke0FSR1YyfSkKKyAgICAgIGVsc2UoKQorICAgICAgICBjdWRhX2FkZF9leGVjdXRhYmxlKCR7dGFyZ2V0bmFtZX0gJHtmaWxlbmFtZX0pCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBhZGRfZXhlY3V0YWJsZSgke3RhcmdldG5hbWV9ICR7ZmlsZW5hbWV9KQorICBlbmRpZigpCisKKyAgaWYgKHRhcmdldG5hbWUgTUFUQ0hFUyAiXmVpZ2VuMl8iKQorICAgIGFkZF9kZXBlbmRlbmNpZXMoZWlnZW4yX2J1aWxkdGVzdHMgJHt0YXJnZXRuYW1lfSkKKyAgZWxzZSgpCisgICAgYWRkX2RlcGVuZGVuY2llcyhidWlsZHRlc3RzICR7dGFyZ2V0bmFtZX0pCisgIGVuZGlmKCkKKworICBpZihFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcpCisgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HPTEiKQorICBlbHNlKEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORykKKyAgICBpZihFSUdFTl9ERUJVR19BU1NFUlRTKQorICAgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fREVCVUdfQVNTRVJUUz0xIikKKyAgICBlbmRpZihFSUdFTl9ERUJVR19BU1NFUlRTKQorICBlbmRpZihFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcpCisKKyAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fVEVTVF9NQVhfU0laRT0ke0VJR0VOX1RFU1RfTUFYX1NJWkV9IikKKworICBlaV9hZGRfdGFyZ2V0X3Byb3BlcnR5KCR7dGFyZ2V0bmFtZX0gQ09NUElMRV9GTEFHUyAiLURFSUdFTl9URVNUX0ZVTkM9JHt0ZXN0bmFtZX0iKQorCisgIGlmKE1TVkMpCisgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi9iaWdvYmoiKQorICBlbmRpZigpCisKKyAgIyBsZXQgdGhlIHVzZXIgcGFzcyBmbGFncy4KKyAgaWYoJHtBUkdDfSBHUkVBVEVSIDIpCisgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIiR7QVJHVjJ9IikKKyAgZW5kaWYoJHtBUkdDfSBHUkVBVEVSIDIpCisKKyAgaWYoRUlHRU5fVEVTVF9DVVNUT01fQ1hYX0ZMQUdTKQorICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICIke0VJR0VOX1RFU1RfQ1VTVE9NX0NYWF9GTEFHU30iKQorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIGVuZGlmKCkKKyAgaWYoRVhURVJOQUxfTElCUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VYVEVSTkFMX0xJQlN9KQorICBlbmRpZigpCisgIGlmKEVJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHU30pCisgIGVuZGlmKCkKKworICBpZigke0FSR0N9IEdSRUFURVIgMykKKyAgICBzZXQobGlic190b19saW5rICR7QVJHVjN9KQorICAgICMgaXQgY291bGQgYmUgdGhhdCBzb21lIGNtYWtlIG1vZHVsZSBwcm92aWRlcyBhIGJhZCBsaWJyYXJ5IHN0cmluZyAiICIgIChqdXN0IHNwYWNlcyksCisgICAgIyBhbmQgdGhhdCBzZXZlcmVseSBicmVha3MgdGFyZ2V0X2xpbmtfbGlicmFyaWVzICgiY2FuJ3QgbGluayB0byAtbC1sc3RkYysrIiBlcnJvcnMpLgorICAgICMgc28gd2UgY2hlY2sgZm9yIHN0cmluZ3MgY29udGFpbmluZyBvbmx5IHNwYWNlcy4KKyAgICBzdHJpbmcoU1RSSVAgIiR7bGlic190b19saW5rfSIgbGlic190b19saW5rX3N0cmlwcGVkKQorICAgIHN0cmluZyhMRU5HVEggIiR7bGlic190b19saW5rX3N0cmlwcGVkfSIgbGlic190b19saW5rX3N0cmlwcGVkX2xlbmd0aCkKKyAgICBpZigke2xpYnNfdG9fbGlua19zdHJpcHBlZF9sZW5ndGh9IEdSRUFURVIgMCkKKyAgICAgICMgbm90aWNlOiBubyBkb3VibGUgcXVvdGVzIGFyb3VuZCAke2xpYnNfdG9fbGlua30gaGVyZS4gSXQgbWF5IGJlIGEgbGlzdC4KKyAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7bGlic190b19saW5rfSkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBhZGRfdGVzdCgke3Rlc3RuYW1lX3dpdGhfc3VmZml4fSAiJHt0YXJnZXRuYW1lfSIpCisKKyAgIyBTcGVjaWZ5IHRhcmdldCBhbmQgdGVzdCBsYWJlbHMgYWNjb2lyZGluZyB0byBFSUdFTl9DVVJSRU5UX1NVQlBST0pFQ1QKKyAgZ2V0X3Byb3BlcnR5KGN1cnJlbnRfc3VicHJvamVjdCBHTE9CQUwgUFJPUEVSVFkgRUlHRU5fQ1VSUkVOVF9TVUJQUk9KRUNUKQorICBpZiAoKGN1cnJlbnRfc3VicHJvamVjdCkgQU5EIChOT1QgKGN1cnJlbnRfc3VicHJvamVjdCBTVFJFUVVBTCAiIikpKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgJHt0YXJnZXRuYW1lfSBQUk9QRVJUWSBMQUJFTFMgIkJ1aWxkJHtjdXJyZW50X3N1YnByb2plY3R9IikKKyAgICBhZGRfZGVwZW5kZW5jaWVzKCJCdWlsZCR7Y3VycmVudF9zdWJwcm9qZWN0fSIgJHt0YXJnZXRuYW1lfSkKKyAgICBzZXRfcHJvcGVydHkoVEVTVCAke3Rlc3RuYW1lX3dpdGhfc3VmZml4fSBQUk9QRVJUWSBMQUJFTFMgIiR7Y3VycmVudF9zdWJwcm9qZWN0fSIpCisgIGVuZGlmKCkKKworZW5kbWFjcm8oZWlfYWRkX3Rlc3RfaW50ZXJuYWwpCisKKyMgU1lDTAorbWFjcm8oZWlfYWRkX3Rlc3RfaW50ZXJuYWxfc3ljbCB0ZXN0bmFtZSB0ZXN0bmFtZV93aXRoX3N1ZmZpeCkKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyggU1lTVEVNICR7Q09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSfS9pbmNsdWRlKQorICBzZXQodGFyZ2V0bmFtZSAke3Rlc3RuYW1lX3dpdGhfc3VmZml4fSkKKworICBpZihFSUdFTl9BRERfVEVTVF9GSUxFTkFNRV9FWFRFTlNJT04pCisgICAgc2V0KGZpbGVuYW1lICR7dGVzdG5hbWV9LiR7RUlHRU5fQUREX1RFU1RfRklMRU5BTUVfRVhURU5TSU9OfSkKKyAgZWxzZSgpCisgICAgc2V0KGZpbGVuYW1lICR7dGVzdG5hbWV9LmNwcCkKKyAgZW5kaWYoKQorCisgIHNldCggaW5jbHVkZV9maWxlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmNfJHtmaWxlbmFtZX0pCisgIHNldCggYmNfZmlsZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtmaWxlbmFtZX0pCisgIHNldCggaG9zdF9maWxlICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke2ZpbGVuYW1lfSkKKworICBBRERfQ1VTVE9NX0NPTU1BTkQoCisgICAgT1VUUFVUICR7aW5jbHVkZV9maWxlfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICJcXCNpbmNsdWRlIFxcXCIke2hvc3RfZmlsZX1cXFwiIiA+ICR7aW5jbHVkZV9maWxlfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBlY2hvICJcXCNpbmNsdWRlIFxcXCIke2JjX2ZpbGV9LnN5Y2xcXFwiIiA+PiAke2luY2x1ZGVfZmlsZX0KKyAgICBERVBFTkRTICR7ZmlsZW5hbWV9ICR7YmNfZmlsZX0uc3ljbAorICAgIENPTU1FTlQgIkJ1aWxkaW5nIENvbXB1dGVDcHAgaW50ZWdyYXRpb24gaGVhZGVyIGZpbGUgJHtpbmNsdWRlX2ZpbGV9IgorICApCisgICMgQWRkIGEgY3VzdG9tIHRhcmdldCBmb3IgdGhlIGdlbmVyYXRlZCBpbnRlZ3JhdGlvbiBoZWFkZXIKKyAgYWRkX2N1c3RvbV90YXJnZXQoJHt0ZXN0bmFtZX1faW50ZWdyYXRpb25faGVhZGVyX3N5Y2wgREVQRU5EUyAke2luY2x1ZGVfZmlsZX0pCisKKyAgYWRkX2V4ZWN1dGFibGUoJHt0YXJnZXRuYW1lfSAke2luY2x1ZGVfZmlsZX0pCisgIGFkZF9kZXBlbmRlbmNpZXMoJHt0YXJnZXRuYW1lfSAke3Rlc3RuYW1lfV9pbnRlZ3JhdGlvbl9oZWFkZXJfc3ljbCkKKyAgYWRkX3N5Y2xfdG9fdGFyZ2V0KCR7dGFyZ2V0bmFtZX0gJHtmaWxlbmFtZX0gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisgIGlmICh0YXJnZXRuYW1lIE1BVENIRVMgIl5laWdlbjJfIikKKyAgICBhZGRfZGVwZW5kZW5jaWVzKGVpZ2VuMl9idWlsZHRlc3RzICR7dGFyZ2V0bmFtZX0pCisgIGVsc2UoKQorICAgIGFkZF9kZXBlbmRlbmNpZXMoYnVpbGR0ZXN0cyAke3RhcmdldG5hbWV9KQorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HKQorICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICItREVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORz0xIikKKyAgZWxzZShFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcpCisgICAgaWYoRUlHRU5fREVCVUdfQVNTRVJUUykKKyAgICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICItREVJR0VOX0RFQlVHX0FTU0VSVFM9MSIpCisgICAgZW5kaWYoRUlHRU5fREVCVUdfQVNTRVJUUykKKyAgZW5kaWYoRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HKQorCisgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICItREVJR0VOX1RFU1RfTUFYX1NJWkU9JHtFSUdFTl9URVNUX01BWF9TSVpFfSIpCisKKyAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fVEVTVF9GVU5DPSR7dGVzdG5hbWV9IikKKworICBpZihNU1ZDIEFORCBOT1QgRUlHRU5fU1BMSVRfTEFSR0VfVEVTVFMpCisgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi9iaWdvYmoiKQorICBlbmRpZigpCisKKyAgIyBsZXQgdGhlIHVzZXIgcGFzcyBmbGFncy4KKyAgaWYoJHtBUkdDfSBHUkVBVEVSIDIpCisgICAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIiR7QVJHVjJ9IikKKyAgZW5kaWYoJHtBUkdDfSBHUkVBVEVSIDIpCisKKyAgaWYoRUlHRU5fVEVTVF9DVVNUT01fQ1hYX0ZMQUdTKQorICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICIke0VJR0VOX1RFU1RfQ1VTVE9NX0NYWF9GTEFHU30iKQorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIGVuZGlmKCkKKyAgaWYoRVhURVJOQUxfTElCUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VYVEVSTkFMX0xJQlN9KQorICBlbmRpZigpCisgIGlmKEVJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHU30pCisgIGVuZGlmKCkKKworICBpZigke0FSR0N9IEdSRUFURVIgMykKKyAgICBzZXQobGlic190b19saW5rICR7QVJHVjN9KQorICAgICMgaXQgY291bGQgYmUgdGhhdCBzb21lIGNtYWtlIG1vZHVsZSBwcm92aWRlcyBhIGJhZCBsaWJyYXJ5IHN0cmluZyAiICIgIChqdXN0IHNwYWNlcyksCisgICAgIyBhbmQgdGhhdCBzZXZlcmVseSBicmVha3MgdGFyZ2V0X2xpbmtfbGlicmFyaWVzICgiY2FuJ3QgbGluayB0byAtbC1sc3RkYysrIiBlcnJvcnMpLgorICAgICMgc28gd2UgY2hlY2sgZm9yIHN0cmluZ3MgY29udGFpbmluZyBvbmx5IHNwYWNlcy4KKyAgICBzdHJpbmcoU1RSSVAgIiR7bGlic190b19saW5rfSIgbGlic190b19saW5rX3N0cmlwcGVkKQorICAgIHN0cmluZyhMRU5HVEggIiR7bGlic190b19saW5rX3N0cmlwcGVkfSIgbGlic190b19saW5rX3N0cmlwcGVkX2xlbmd0aCkKKyAgICBpZigke2xpYnNfdG9fbGlua19zdHJpcHBlZF9sZW5ndGh9IEdSRUFURVIgMCkKKyAgICAgICMgbm90aWNlOiBubyBkb3VibGUgcXVvdGVzIGFyb3VuZCAke2xpYnNfdG9fbGlua30gaGVyZS4gSXQgbWF5IGJlIGEgbGlzdC4KKyAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7bGlic190b19saW5rfSkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBhZGRfdGVzdCgke3Rlc3RuYW1lX3dpdGhfc3VmZml4fSAiJHt0YXJnZXRuYW1lfSIpCisKKyAgIyBTcGVjaWZ5IHRhcmdldCBhbmQgdGVzdCBsYWJlbHMgYWNjb3JkaW5nIHRvIEVJR0VOX0NVUlJFTlRfU1VCUFJPSkVDVAorICBnZXRfcHJvcGVydHkoY3VycmVudF9zdWJwcm9qZWN0IEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9DVVJSRU5UX1NVQlBST0pFQ1QpCisgIGlmICgoY3VycmVudF9zdWJwcm9qZWN0KSBBTkQgKE5PVCAoY3VycmVudF9zdWJwcm9qZWN0IFNUUkVRVUFMICIiKSkpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCAke3RhcmdldG5hbWV9IFBST1BFUlRZIExBQkVMUyAiQnVpbGQke2N1cnJlbnRfc3VicHJvamVjdH0iKQorICAgIGFkZF9kZXBlbmRlbmNpZXMoIkJ1aWxkJHtjdXJyZW50X3N1YnByb2plY3R9IiAke3RhcmdldG5hbWV9KQorICAgIHNldF9wcm9wZXJ0eShURVNUICR7dGVzdG5hbWVfd2l0aF9zdWZmaXh9IFBST1BFUlRZIExBQkVMUyAiJHtjdXJyZW50X3N1YnByb2plY3R9IikKKyAgZW5kaWYoKQorCisKK2VuZG1hY3JvKGVpX2FkZF90ZXN0X2ludGVybmFsX3N5Y2wpCisKKworIyBNYWNybyB0byBhZGQgYSB0ZXN0CisjCisjIHRoZSB1bmlxdWUgbWFuZGF0b3J5IHBhcmFtZXRlciB0ZXN0bmFtZSBtdXN0IGNvcnJlc3BvbmQgdG8gYSBmaWxlCisjIDx0ZXN0bmFtZT4uY3BwIHdoaWNoIGZvbGxvd3MgdGhpcyBwYXR0ZXJuOgorIworIyAjaW5jbHVkZSAibWFpbi5oIgorIyB2b2lkIHRlc3RfPHRlc3RuYW1lPigpIHsgLi4uIH0KKyMKKyMgRGVwZW5kaW5nIG9uIHRoZSBjb250ZW50cyBvZiB0aGF0IGZpbGUsIHRoaXMgbWFjcm8gY2FuIGhhdmUgMiBiZWhhdmlvcnMsCisjIHNlZSBiZWxvdy4KKyMKKyMgVGhlIG9wdGlvbmFsIDJuZCBwYXJhbWV0ZXIgaXMgbGlicmFyaWVzIHRvIGxpbmsgdG8uCisjCisjIEEuIERlZmF1bHQgYmVoYXZpb3IKKyMKKyMgdGhpcyBtYWNybyBhZGRzIGFuIGV4ZWN1dGFibGUgPHRlc3RuYW1lPiBhcyB3ZWxsIGFzIGEgY3Rlc3QgdGVzdAorIyBuYW1lZCA8dGVzdG5hbWU+IHRvby4KKyMKKyMgT24gcGxhdGZvcm1zIHdpdGggYmFzaCBzaW1wbHkgcnVuOgorIyAgICJjdGVzdCAtViIgb3IgImN0ZXN0IC1WIC1SIDx0ZXN0bmFtZT4iCisjIE9uIG90aGVyIHBsYXRmb3JtIHVzZSBjdGVzdCBhcyB1c3VhbAorIworIyBCLiBNdWx0aS1wYXJ0IGJlaGF2aW9yCisjCisjIElmIHRoZSBzb3VyY2UgZmlsZSBtYXRjaGVzIHRoZSByZWdleHAKKyMgICAgQ0FMTF9TVUJURVNUX1swLTldK3xFSUdFTl9URVNUX1BBUlRfWzAtOV0rCisjIHRoZW4gaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBtdWx0aS1wYXJ0IHRlc3QuIFRoZSBiZWhhdmlvciB0aGVuIGRlcGVuZHMgb24gdGhlCisjIENNYWtlIG9wdGlvbiBFSUdFTl9TUExJVF9MQVJHRV9URVNUUywgd2hpY2ggaXMgT04gYnkgZGVmYXVsdC4KKyMKKyMgSWYgRUlHRU5fU1BMSVRfTEFSR0VfVEVTVFMgaXMgT0ZGLCB0aGUgYmVoYXZpb3IgaXMgdGhlIHNhbWUgYXMgaW4gQSAodGhlIG11bHRpLXBhcnQKKyMgYXNwZWN0IGlzIGlnbm9yZWQpLgorIworIyBJZiBFSUdFTl9TUExJVF9MQVJHRV9URVNUUyBpcyBPTiwgdGhlIHRlc3QgaXMgc3BsaXQgaW50byBtdWx0aXBsZSBleGVjdXRhYmxlcworIyAgIHRlc3RfPHRlc3RuYW1lPl88Tj4KKyMgd2hlcmUgTiBydW5zIGZyb20gMSB0byB0aGUgZ3JlYXRlc3Qgb2NjdXJlbmNlIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZS4gRWFjaCBvZiB0aGVzZQorIyBleGVjdXRhYmxlcyBpcyBidWlsdCBwYXNzaW5nIC1ERUlHRU5fVEVTVF9QQVJUX04uIFRoaXMgYWxsb3dzIHRvIHNwbGl0IGxhcmdlIHRlc3RzCisjIGludG8gc21hbGxlciBleGVjdXRhYmxlcy4KKyMKKyMgTW9yZW92ZXIsIHRhcmdldHMgPHRlc3RuYW1lPiBhcmUgc3RpbGwgZ2VuZXJhdGVkLCB0aGV5CisjIGhhdmUgdGhlIGVmZmVjdCBvZiBidWlsZGluZyBhbGwgdGhlIHBhcnRzIG9mIHRoZSB0ZXN0LgorIworIyBBZ2FpbiwgY3Rlc3QgLVIgYWxsb3dzIHRvIHJ1biBhbGwgbWF0Y2hpbmcgdGVzdHMuCittYWNybyhlaV9hZGRfdGVzdCB0ZXN0bmFtZSkKKyAgZ2V0X3Byb3BlcnR5KEVJR0VOX1RFU1RTX0xJU1QgR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RTX0xJU1QpCisgIHNldChFSUdFTl9URVNUU19MSVNUICIke0VJR0VOX1RFU1RTX0xJU1R9JHt0ZXN0bmFtZX1cbiIpCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVFNfTElTVCAiJHtFSUdFTl9URVNUU19MSVNUfSIpCisKKyAgaWYoRUlHRU5fQUREX1RFU1RfRklMRU5BTUVfRVhURU5TSU9OKQorICAgIHNldChmaWxlbmFtZSAke3Rlc3RuYW1lfS4ke0VJR0VOX0FERF9URVNUX0ZJTEVOQU1FX0VYVEVOU0lPTn0pCisgIGVsc2UoKQorICAgIHNldChmaWxlbmFtZSAke3Rlc3RuYW1lfS5jcHApCisgIGVuZGlmKCkKKworICBmaWxlKFJFQUQgIiR7ZmlsZW5hbWV9IiB0ZXN0X3NvdXJjZSkKKyAgc2V0KHBhcnRzIDApCisgIHN0cmluZyhSRUdFWCBNQVRDSEFMTCAiQ0FMTF9TVUJURVNUX1swLTldK3xFSUdFTl9URVNUX1BBUlRfWzAtOV0rfEVJR0VOX1NVRkZJWEVTKDtbMC05XSspKyIKKyAgICAgICAgIG9jY3VyZW5jZXMgIiR7dGVzdF9zb3VyY2V9IikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIkNBTExfU1VCVEVTVF98RUlHRU5fVEVTVF9QQVJUX3xFSUdFTl9TVUZGSVhFUyIgIiIgc3VmZml4ZXMgIiR7b2NjdXJlbmNlc30iKQorICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIHN1ZmZpeGVzKQorICBpZihFSUdFTl9TUExJVF9MQVJHRV9URVNUUyBBTkQgc3VmZml4ZXMpCisgICAgYWRkX2N1c3RvbV90YXJnZXQoJHt0ZXN0bmFtZX0pCisgICAgZm9yZWFjaChzdWZmaXggJHtzdWZmaXhlc30pCisgICAgICBlaV9hZGRfdGVzdF9pbnRlcm5hbCgke3Rlc3RuYW1lfSAke3Rlc3RuYW1lfV8ke3N1ZmZpeH0KKyAgICAgICAgIiR7QVJHVjF9IC1ERUlHRU5fVEVTVF9QQVJUXyR7c3VmZml4fT0xIiAiJHtBUkdWMn0iKQorICAgICAgYWRkX2RlcGVuZGVuY2llcygke3Rlc3RuYW1lfSAke3Rlc3RuYW1lfV8ke3N1ZmZpeH0pCisgICAgZW5kZm9yZWFjaChzdWZmaXgpCisgIGVsc2UoRUlHRU5fU1BMSVRfTEFSR0VfVEVTVFMgQU5EIHN1ZmZpeGVzKQorICAgIHNldChzeW1ib2xzX3RvX2VuYWJsZV9hbGxfcGFydHMgIiIpCisgICAgZm9yZWFjaChzdWZmaXggJHtzdWZmaXhlc30pCisgICAgICBzZXQoc3ltYm9sc190b19lbmFibGVfYWxsX3BhcnRzCisgICAgICAgICIke3N5bWJvbHNfdG9fZW5hYmxlX2FsbF9wYXJ0c30gLURFSUdFTl9URVNUX1BBUlRfJHtzdWZmaXh9PTEiKQorICAgIGVuZGZvcmVhY2goc3VmZml4KQorICAgIGVpX2FkZF90ZXN0X2ludGVybmFsKCR7dGVzdG5hbWV9ICR7dGVzdG5hbWV9ICIke0FSR1YxfSAke3N5bWJvbHNfdG9fZW5hYmxlX2FsbF9wYXJ0c30iICIke0FSR1YyfSIpCisgIGVuZGlmKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIEFORCBzdWZmaXhlcykKK2VuZG1hY3JvKGVpX2FkZF90ZXN0KQorCittYWNybyhlaV9hZGRfdGVzdF9zeWNsIHRlc3RuYW1lKQorICBnZXRfcHJvcGVydHkoRUlHRU5fVEVTVFNfTElTVCBHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVFNfTElTVCkKKyAgc2V0KEVJR0VOX1RFU1RTX0xJU1QgIiR7RUlHRU5fVEVTVFNfTElTVH0ke3Rlc3RuYW1lfVxuIikKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUU19MSVNUICIke0VJR0VOX1RFU1RTX0xJU1R9IikKKworICBpZihFSUdFTl9BRERfVEVTVF9GSUxFTkFNRV9FWFRFTlNJT04pCisgICAgc2V0KGZpbGVuYW1lICR7dGVzdG5hbWV9LiR7RUlHRU5fQUREX1RFU1RfRklMRU5BTUVfRVhURU5TSU9OfSkKKyAgZWxzZSgpCisgICAgc2V0KGZpbGVuYW1lICR7dGVzdG5hbWV9LmNwcCkKKyAgZW5kaWYoKQorCisgIGZpbGUoUkVBRCAiJHtmaWxlbmFtZX0iIHRlc3Rfc291cmNlKQorICBzZXQocGFydHMgMCkKKyAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJDQUxMX1NVQlRFU1RfWzAtOV0rfEVJR0VOX1RFU1RfUEFSVF9bMC05XSt8RUlHRU5fU1VGRklYRVMoO1swLTldKykrIgorICAgICAgICAgb2NjdXJlbmNlcyAiJHt0ZXN0X3NvdXJjZX0iKQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiQ0FMTF9TVUJURVNUX3xFSUdFTl9URVNUX1BBUlRffEVJR0VOX1NVRkZJWEVTIiAiIiBzdWZmaXhlcyAiJHtvY2N1cmVuY2VzfSIpCisgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgc3VmZml4ZXMpCisgIGlmKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIEFORCBzdWZmaXhlcykKKyAgICBhZGRfY3VzdG9tX3RhcmdldCgke3Rlc3RuYW1lfSkKKyAgICBmb3JlYWNoKHN1ZmZpeCAke3N1ZmZpeGVzfSkKKyAgICAgIGVpX2FkZF90ZXN0X2ludGVybmFsX3N5Y2woJHt0ZXN0bmFtZX0gJHt0ZXN0bmFtZX1fJHtzdWZmaXh9CisgICAgICAgICIke0FSR1YxfSAtREVJR0VOX1RFU1RfUEFSVF8ke3N1ZmZpeH09MSIgIiR7QVJHVjJ9IikKKyAgICAgIGFkZF9kZXBlbmRlbmNpZXMoJHt0ZXN0bmFtZX0gJHt0ZXN0bmFtZX1fJHtzdWZmaXh9KQorICAgIGVuZGZvcmVhY2goc3VmZml4KQorICBlbHNlKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIEFORCBzdWZmaXhlcykKKyAgICBzZXQoc3ltYm9sc190b19lbmFibGVfYWxsX3BhcnRzICIiKQorICAgIGZvcmVhY2goc3VmZml4ICR7c3VmZml4ZXN9KQorICAgICAgc2V0KHN5bWJvbHNfdG9fZW5hYmxlX2FsbF9wYXJ0cworICAgICAgICAiJHtzeW1ib2xzX3RvX2VuYWJsZV9hbGxfcGFydHN9IC1ERUlHRU5fVEVTVF9QQVJUXyR7c3VmZml4fT0xIikKKyAgICBlbmRmb3JlYWNoKHN1ZmZpeCkKKyAgICBlaV9hZGRfdGVzdF9pbnRlcm5hbF9zeWNsKCR7dGVzdG5hbWV9ICR7dGVzdG5hbWV9ICIke0FSR1YxfSAke3N5bWJvbHNfdG9fZW5hYmxlX2FsbF9wYXJ0c30iICIke0FSR1YyfSIpCisgIGVuZGlmKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIEFORCBzdWZmaXhlcykKK2VuZG1hY3JvKGVpX2FkZF90ZXN0X3N5Y2wpCisKKyMgYWRkcyBhIGZhaWx0ZXN0LCBpLmUuIGEgdGVzdCB0aGF0IHN1Y2NlZWQgaWYgdGhlIHByb2dyYW0gZmFpbHMgdG8gY29tcGlsZQorIyBub3RlIHRoYXQgdGhlIHRlc3QgcnVubmVyIGZvciB0aGVzZSBpcyBDTWFrZSBpdHNlbGYsIHdoZW4gcGFzc2VkIC1ERUlHRU5fRkFJTFRFU1Q9T04KKyMgc28gaGVyZSB3ZSdyZSBqdXN0IHJ1bm5pbmcgQ01ha2UgY29tbWFuZHMgaW1tZWRpYXRlbHksIHdlJ3JlIG5vdCBhZGRpbmcgYW55IHRhcmdldHMuCittYWNybyhlaV9hZGRfZmFpbHRlc3QgdGVzdG5hbWUpCisgIGdldF9wcm9wZXJ0eShFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UIEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UKQorICBnZXRfcHJvcGVydHkoRUlHRU5fRkFJTFRFU1RfQ09VTlQgR0xPQkFMIFBST1BFUlRZIEVJR0VOX0ZBSUxURVNUX0NPVU5UKQorCisgIG1lc3NhZ2UoU1RBVFVTICJDaGVja2luZyBmYWlsdGVzdDogJHt0ZXN0bmFtZX0iKQorICBzZXQoZmlsZW5hbWUgIiR7dGVzdG5hbWV9LmNwcCIpCisgIGZpbGUoUkVBRCAiJHtmaWxlbmFtZX0iIHRlc3Rfc291cmNlKQorCisgIHRyeV9jb21waWxlKHN1Y2NlZWRzX3doZW5faXRfc2hvdWxkX2ZhaWwKKyAgICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIKKyAgICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke2ZpbGVuYW1lfSIKKyAgICAgICAgICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiLURFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRCIpCisgIGlmIChzdWNjZWVkc193aGVuX2l0X3Nob3VsZF9mYWlsKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGQUlMRUQ6ICR7dGVzdG5hbWV9IGJ1aWxkIHN1Y2NlZWRlZCB3aGVuIGl0IHNob3VsZCBoYXZlIGZhaWxlZCIpCisgIGVuZGlmKCkKKworICB0cnlfY29tcGlsZShzdWNjZWVkc193aGVuX2l0X3Nob3VsZF9zdWNjZWVkCisgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iCisgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtmaWxlbmFtZX0iCisgICAgICAgICAgICAgIENPTVBJTEVfREVGSU5JVElPTlMpCisgIGlmIChOT1Qgc3VjY2VlZHNfd2hlbl9pdF9zaG91bGRfc3VjY2VlZCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRkFJTEVEOiAke3Rlc3RuYW1lfSBidWlsZCBmYWlsZWQgd2hlbiBpdCBzaG91bGQgaGF2ZSBzdWNjZWVkZWQiKQorICBlbmRpZigpCisKKyAgaWYgKHN1Y2NlZWRzX3doZW5faXRfc2hvdWxkX2ZhaWwgT1IgTk9UIHN1Y2NlZWRzX3doZW5faXRfc2hvdWxkX3N1Y2NlZWQpCisgICAgbWF0aChFWFBSIEVJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlQgJHtFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UfSsxKQorICBlbmRpZigpCisKKyAgbWF0aChFWFBSIEVJR0VOX0ZBSUxURVNUX0NPVU5UICR7RUlHRU5fRkFJTFRFU1RfQ09VTlR9KzEpCisKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UICR7RUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVH0pCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfQ09VTlQgJHtFSUdFTl9GQUlMVEVTVF9DT1VOVH0pCitlbmRtYWNybyhlaV9hZGRfZmFpbHRlc3QpCisKKyMgcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucworbWFjcm8oZWlfdGVzdGluZ19wcmludF9zdW1tYXJ5KQorICBtZXNzYWdlKFNUQVRVUyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIikKKyAgbWVzc2FnZShTVEFUVVMgIioqKiAgICBFaWdlbidzIHVuaXQgdGVzdHMgY29uZmlndXJhdGlvbiBzdW1tYXJ5ICAgICAgICAgICoqKiIpCisgIG1lc3NhZ2UoU1RBVFVTICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKQorICBtZXNzYWdlKFNUQVRVUyAiIikKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkIHR5cGU6ICAgICAgICAke0NNQUtFX0JVSUxEX1RZUEV9IikKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkIHNpdGU6ICAgICAgICAke1NJVEV9IikKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkIHN0cmluZzogICAgICAke0JVSUxETkFNRX0iKQorICBnZXRfcHJvcGVydHkoRUlHRU5fVEVTVElOR19TVU1NQVJZIEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUSU5HX1NVTU1BUlkpCisgIGdldF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RFRF9CQUNLRU5EUykKKyAgZ2V0X3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgR0xPQkFMIFBST1BFUlRZIEVJR0VOX01JU1NJTkdfQkFDS0VORFMpCisgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGVkIGJhY2tlbmRzOiAgJHtFSUdFTl9URVNURURfQkFDS0VORFN9IikKKyAgbWVzc2FnZShTVEFUVVMgIkRpc2FibGVkIGJhY2tlbmRzOiAke0VJR0VOX01JU1NJTkdfQkFDS0VORFN9IikKKworICBpZihFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRGVmYXVsdCBvcmRlcjogICAgIFJvdy1tYWpvciIpCisgIGVsc2UoKQorICAgIG1lc3NhZ2UoU1RBVFVTICJEZWZhdWx0IG9yZGVyOiAgICAgQ29sdW1uLW1ham9yIikKKyAgZW5kaWYoKQorCisgIGlmKEVJR0VOX1RFU1RfTk9fRVhQTElDSVRfQUxJR05NRU5UKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFeHBsaWNpdCBhbGlnbm1lbnQgKGhlbmNlIHZlY3Rvcml6YXRpb24pIGRpc2FibGVkIikKKyAgZWxzZWlmKEVJR0VOX1RFU1RfTk9fRVhQTElDSVRfVkVDVE9SSVpBVElPTikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRXhwbGljaXQgdmVjdG9yaXphdGlvbiBkaXNhYmxlZCAoYWxpZ25tZW50IGtlcHQgZW5hYmxlZCkiKQorICBlbHNlKCkKKworICBtZXNzYWdlKFNUQVRVUyAiTWF4aW1hbCBtYXRyaXgvdmVjdG9yIHNpemU6ICR7RUlHRU5fVEVTVF9NQVhfU0laRX0iKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0UyKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTI6ICAgICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFMjogICAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0UzKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTM6ICAgICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFMzogICAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU1NFMykKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTU1NFMzogICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTU0UzOiAgICAgICAgICAgICBVc2luZyBhcmNoaXRlY3R1cmUgZGVmYXVsdHMiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfU1NFNF8xKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTQuMTogICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFNC4xOiAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0U0XzIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFNC4yOiAgICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTU0U0LjI6ICAgICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgICBpZihFSUdFTl9URVNUX0FWWCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBVlg6ICAgICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkFWWDogICAgICAgICAgICAgICBVc2luZyBhcmNoaXRlY3R1cmUgZGVmYXVsdHMiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfRk1BKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkZNQTogICAgICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiRk1BOiAgICAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9BVlg1MTIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQVZYNTEyOiAgICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBVlg1MTI6ICAgICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgICBpZihFSUdFTl9URVNUX0FMVElWRUMpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQWx0aXZlYzogICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBbHRpdmVjOiAgICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgICBpZihFSUdFTl9URVNUX1ZTWCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJWU1g6ICAgICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlZTWDogICAgICAgICAgICAgICBVc2luZyBhcmNoaXRlY3R1cmUgZGVmYXVsdHMiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfTkVPTikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBUk0gTkVPTjogICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkFSTSBORU9OOiAgICAgICAgICBVc2luZyBhcmNoaXRlY3R1cmUgZGVmYXVsdHMiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfTkVPTjY0KQorICAgICAgbWVzc2FnZShTVEFUVVMgIkFSTXY4IE5FT046ICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQVJNdjggTkVPTjogICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9aVkVDVE9SKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlMzOTBYIFpWRUNUT1I6ICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUzM5MFggWlZFQ1RPUjogICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9DWFgxMSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDKysxMTogICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkMrKzExOiAgICAgICAgICAgICBPRkYiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfU1lDTCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTWUNMOiAgICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNZQ0w6ICAgICAgICAgICAgICBPRkYiKQorICAgIGVuZGlmKCkKKyAgICBpZihFSUdFTl9URVNUX0NVREEpCisgICAgICBpZihFSUdFTl9URVNUX0NVREFfQ0xBTkcpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJDVURBOiAgICAgICAgICAgICAgT04gKHVzaW5nIGNsYW5nKSIpCisgICAgICBlbHNlKCkKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIkNVREE6ICAgICAgICAgICAgICBPTiAodXNpbmcgbnZjYykiKQorICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkNVREE6ICAgICAgICAgICAgICBPRkYiKQorICAgIGVuZGlmKCkKKworICBlbmRpZigpICMgdmVjdG9yaXphdGlvbiAvIGFsaWdubWVudCBvcHRpb25zCisKKyAgbWVzc2FnZShTVEFUVVMgIlxuJHtFSUdFTl9URVNUSU5HX1NVTU1BUll9IikKKworICBtZXNzYWdlKFNUQVRVUyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIikKK2VuZG1hY3JvKGVpX3Rlc3RpbmdfcHJpbnRfc3VtbWFyeSkKKworbWFjcm8oZWlfaW5pdF90ZXN0aW5nKQorICBkZWZpbmVfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX0NVUlJFTlRfU1VCUFJPSkVDVCBCUklFRl9ET0NTICIgIiBGVUxMX0RPQ1MgIiAiKQorICBkZWZpbmVfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RFRF9CQUNLRU5EUyBCUklFRl9ET0NTICIgIiBGVUxMX0RPQ1MgIiAiKQorICBkZWZpbmVfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX01JU1NJTkdfQkFDS0VORFMgQlJJRUZfRE9DUyAiICIgRlVMTF9ET0NTICIgIikKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUSU5HX1NVTU1BUlkgQlJJRUZfRE9DUyAiICIgRlVMTF9ET0NTICIgIikKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUU19MSVNUIEJSSUVGX0RPQ1MgIiAiIEZVTExfRE9DUyAiICIpCisKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNURURfQkFDS0VORFMgIiIpCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiIikKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUSU5HX1NVTU1BUlkgIiIpCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVFNfTElTVCAiIikKKworICBkZWZpbmVfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlQgQlJJRUZfRE9DUyAiICIgRlVMTF9ET0NTICIgIikKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9GQUlMVEVTVF9DT1VOVCBCUklFRl9ET0NTICIgIiBGVUxMX0RPQ1MgIiAiKQorCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVCAiMCIpCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfQ09VTlQgIjAiKQorCisgICMgdW5jb21tZW50IGFueXRpbWUgeW91IGNoYW5nZSB0aGUgZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nIG1hY3JvCisgICMgZWlfdGVzdF9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoKQorZW5kbWFjcm8oZWlfaW5pdF90ZXN0aW5nKQorCittYWNybyhlaV9zZXRfc2l0ZW5hbWUpCisgICMgaWYgdGhlIHNpdGVuYW1lIGlzIG5vdCB5ZXQgc2V0LCB0cnkgdG8gc2V0IGl0CisgIGlmKE5PVCAke1NJVEV9IE9SICR7U0lURX0gU1RSRVFVQUwgIiIpCisgICAgc2V0KGVpZ2VuX2NvbXB1dGVybmFtZSAkRU5We0NPTVBVVEVSTkFNRX0pCisgICAgc2V0KGVpZ2VuX2hvc3RuYW1lICRFTlZ7SE9TVE5BTUV9KQorICAgIGlmKGVpZ2VuX2hvc3RuYW1lKQorICAgICAgc2V0KFNJVEUgJHtlaWdlbl9ob3N0bmFtZX0pCisgICAgZWxzZWlmKGVpZ2VuX2NvbXB1dGVybmFtZSkKKyAgICAgIHNldChTSVRFICR7ZWlnZW5fY29tcHV0ZXJuYW1lfSkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgIyBpbiBjYXNlIGl0IGlzIGFscmVhZHkgc2V0LCBlbmZvcmNlIGxvd2VyIGNhc2UKKyAgaWYoU0lURSkKKyAgICBzdHJpbmcoVE9MT1dFUiAke1NJVEV9IFNJVEUpCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX3NldF9zaXRlbmFtZSkKKworbWFjcm8oZWlfZ2V0X2NvbXBpbGVydmVyIFZBUikKKyAgICBpZihNU1ZDKQorICAgICAgIyBvbiB3aW5kb3dzIHN5c3RlbSwgd2UgdXNlIGEgbW9kaWZpZWQgQ01ha2Ugc2NyaXB0CisgICAgICBpbmNsdWRlKEVpZ2VuRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjaykKKyAgICAgIEVpZ2VuRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjayggbXlfc2VydmljZV9wYWNrICkKKworICAgICAgaWYoIG15X3NlcnZpY2VfcGFjayApCisgICAgICAgIHNldCgke1ZBUn0gJHtteV9zZXJ2aWNlX3BhY2t9KQorICAgICAgZWxzZSgpCisgICAgICAgIHNldCgke1ZBUn0gIm5hIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAjIG9uIGFsbCBvdGhlciBzeXN0ZW0gd2UgcmVseSBvbiAke0NNQUtFX0NYWF9DT01QSUxFUn0KKyAgICAjIHN1cHBvcnRpbmcgYSAiLS12ZXJzaW9uIiBvciAiL3ZlcnNpb24iIGZsYWcKKworICAgIGlmKFdJTjMyIEFORCAke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0gRVFVQUwgIkludGVsIikKKyAgICAgIHNldChFSUdFTl9DWFhfRkxBR19WRVJTSU9OICIvdmVyc2lvbiIpCisgICAgZWxzZSgpCisgICAgICBzZXQoRUlHRU5fQ1hYX0ZMQUdfVkVSU0lPTiAiLS12ZXJzaW9uIikKKyAgICBlbmRpZigpCisKKyAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0NNQUtFX0NYWF9DT01QSUxFUn0gJHtFSUdFTl9DWFhfRkxBR19WRVJTSU9OfQorICAgICAgICAgICAgICAgICAgICBPVVRQVVRfVkFSSUFCTEUgZWlnZW5fY3h4X2NvbXBpbGVyX3ZlcnNpb25fc3RyaW5nIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbXG5ccl0uKiIgICIiICBlaWdlbl9jeHhfY29tcGlsZXJfdmVyc2lvbl9zdHJpbmcgICR7ZWlnZW5fY3h4X2NvbXBpbGVyX3ZlcnNpb25fc3RyaW5nfSkKKworICAgIGVpX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiJHtlaWdlbl9jeHhfY29tcGlsZXJfdmVyc2lvbl9zdHJpbmd9IiBDTkFNRSBDVkVSKQorICAgIHNldCgke1ZBUn0gIiR7Q05BTUV9LSR7Q1ZFUn0iKQorCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX2dldF9jb21waWxlcnZlcikKKworIyBFeHRyYWN0IGNvbXBpbGVyIG5hbWUgYW5kIHZlcnNpb24gZnJvbSBhIHJhdyB2ZXJzaW9uIHN0cmluZworIyBXQVJOSU5HOiBpZiB5b3UgZWRpdCB0aGlkIG1hY3JvLCB0aGVuIHBsZWFzZSB0ZXN0IGl0IGJ5ICB1bmNvbW1lbnRpbmcKKyMgdGhlIHRlc3RpbmcgbWFjcm8gY2FsbCBpbiBlaV9pbml0X3Rlc3RpbmcoKSBvZiB0aGUgRWlnZW5UZXN0aW5nLmNtYWtlIGZpbGUuCisjIFNlZSBhbHNvIHRoZSBlaV90ZXN0X2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZyBtYWNybyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCittYWNybyhlaV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcgVkVSU1RSSU5HIENOQU1FIENWRVIpCisgICMgZXh0cmFjdCBwb3NzaWJsZSBjb21waWxlciBuYW1lcworICBzdHJpbmcoUkVHRVggTUFUQ0ggImdcXCtcXCsiICAgICAgZWlfaGFzX2dwcCAgICAke1ZFUlNUUklOR30pCisgIHN0cmluZyhSRUdFWCBNQVRDSCAibGx2bXxMTFZNIiAgICBlaV9oYXNfbGx2bSAgICR7VkVSU1RSSU5HfSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJnY2N8R0NDIiAgICAgIGVpX2hhc19nY2MgICAgJHtWRVJTVFJJTkd9KQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImljcGN8SUNDIiAgICAgZWlfaGFzX2ljcGMgICAke1ZFUlNUUklOR30pCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiY2xhbmd8Q0xBTkciICBlaV9oYXNfY2xhbmcgICR7VkVSU1RSSU5HfSkKKworICAjIGNvbWJpbmUgdGhlbQorICBpZigoZWlfaGFzX2xsdm0pIEFORCAoZWlfaGFzX2dwcCBPUiBlaV9oYXNfZ2NjKSkKKyAgICBzZXQoJHtDTkFNRX0gImxsdm0tZysrIikKKyAgZWxzZWlmKChlaV9oYXNfbGx2bSkgQU5EIChlaV9oYXNfY2xhbmcpKQorICAgIHNldCgke0NOQU1FfSAibGx2bS1jbGFuZysrIikKKyAgZWxzZWlmKGVpX2hhc19jbGFuZykKKyAgICBzZXQoJHtDTkFNRX0gImNsYW5nKysiKQorICBlbHNlaWYoZWlfaGFzX2ljcGMpCisgICAgc2V0KCR7Q05BTUV9ICJpY3BjIikKKyAgZWxzZWlmKGVpX2hhc19ncHAgT1IgZWlfaGFzX2djYykKKyAgICBzZXQoJHtDTkFNRX0gImcrKyIpCisgIGVsc2UoKQorICAgIHNldCgke0NOQU1FfSAiXyIpCisgIGVuZGlmKCkKKworICAjIGV4dHJhY3QgcG9zc2libGUgdmVyc2lvbiBudW1iZXJzCisgICMgZmlyc3QgdHJ5IHRvIGV4dHJhY3QgMyBpc29sYXRlZCBudW1iZXJzOgorICBzdHJpbmcoUkVHRVggTUFUQ0ggIiBbMC05XStcXC5bMC05XStcXC5bMC05XSsiIGVpY3ZlciAke1ZFUlNUUklOR30pCisgIGlmKE5PVCBlaWN2ZXIpCisgICAgIyB0cnkgdG8gZXh0cmFjdCAyIGlzb2xhdGVkIG9uZXM6CisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIgWzAtOV0rXFwuWzAtOV0rIiBlaWN2ZXIgJHtWRVJTVFJJTkd9KQorICAgIGlmKE5PVCBlaWN2ZXIpCisgICAgICAjIHRyeSB0byBleHRyYWN0IDM6CisgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIlteMC05XVswLTldK1xcLlswLTldK1xcLlswLTldKyIgZWljdmVyICR7VkVSU1RSSU5HfSkKKyAgICAgIGlmKE5PVCBlaWN2ZXIpCisgICAgICAgICMgdHJ5IHRvIGV4dHJhY3QgMjoKKyAgICAgICAgc3RyaW5nKFJFR0VYIE1BVENIICJbXjAtOV1bMC05XStcXC5bMC05XSsiIGVpY3ZlciAke1ZFUlNUUklOR30pCisgICAgICBlbHNlKCkKKyAgICAgICAgc2V0KGVpY3ZlciAiIF8iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIuKC4qKSIgIlxcMSIgJHtDVkVSfSAke2VpY3Zlcn0pCisKK2VuZG1hY3JvKGVpX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZykKKworbWFjcm8oZWlfZ2V0X2N4eGZsYWdzIFZBUikKKyAgc2V0KCR7VkFSfSAiIikKKyAgZWlfaXNfNjRiaXRfZW52KElTXzY0QklUX0VOVikKKyAgaWYoRUlHRU5fVEVTVF9ORU9OKQorICAgIHNldCgke1ZBUn0gTkVPTikKKyAgZWxzZWlmKEVJR0VOX1RFU1RfTkVPTjY0KQorICAgIHNldCgke1ZBUn0gTkVPTikKKyAgZWxzZWlmKEVJR0VOX1RFU1RfWlZFQ1RPUikKKyAgICBzZXQoJHtWQVJ9IFpWRUNUT1IpCisgIGVsc2VpZihFSUdFTl9URVNUX1ZTWCkKKyAgICBzZXQoJHtWQVJ9IFZTWCkKKyAgZWxzZWlmKEVJR0VOX1RFU1RfQUxUSVZFQykKKyAgICBzZXQoJHtWQVJ9IEFMVkVDKQorICBlbHNlaWYoRUlHRU5fVEVTVF9GTUEpCisgICAgc2V0KCR7VkFSfSBGTUEpCisgIGVsc2VpZihFSUdFTl9URVNUX0FWWCkKKyAgICBzZXQoJHtWQVJ9IEFWWCkKKyAgZWxzZWlmKEVJR0VOX1RFU1RfU1NFNF8yKQorICAgIHNldCgke1ZBUn0gU1NFNDIpCisgIGVsc2VpZihFSUdFTl9URVNUX1NTRTRfMSkKKyAgICBzZXQoJHtWQVJ9IFNTRTQxKQorICBlbHNlaWYoRUlHRU5fVEVTVF9TU1NFMykKKyAgICBzZXQoJHtWQVJ9IFNTU0UzKQorICBlbHNlaWYoRUlHRU5fVEVTVF9TU0UzKQorICAgIHNldCgke1ZBUn0gU1NFMykKKyAgZWxzZWlmKEVJR0VOX1RFU1RfU1NFMiBPUiBJU182NEJJVF9FTlYpCisgICAgc2V0KCR7VkFSfSBTU0UyKQorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fVEVTVF9PUEVOTVApCisgICAgaWYgKCR7VkFSfSBTVFJFUVVBTCAiIikKKyAgICAgIHNldCgke1ZBUn0gT01QKQorICAgIGVsc2UoKQorICAgICAgc2V0KCR7VkFSfSAkeyR7VkFSfX0tT01QKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIGlmKEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SKQorICAgIGlmICgke1ZBUn0gU1RSRVFVQUwgIiIpCisgICAgICBzZXQoJHtWQVJ9IFJPVykKKyAgICBlbHNlKCkKKyAgICAgIHNldCgke1ZBUn0gJHske1ZBUn19LVJPV01BSikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX2dldF9jeHhmbGFncykKKworbWFjcm8oZWlfc2V0X2J1aWxkX3N0cmluZykKKyAgZWlfZ2V0X2NvbXBpbGVydmVyKExPQ0FMX0NPTVBJTEVSX1ZFUlNJT04pCisgIGVpX2dldF9jeHhmbGFncyhMT0NBTF9DT01QSUxFUl9GTEFHUykKKworICBpbmNsdWRlKEVpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uKQorICBEZXRlcm1pbmVPU1ZlcnNpb24oT1NfVkVSU0lPTikKKworICBzZXQoVE1QX0JVSUxEX1NUUklORyAke09TX1ZFUlNJT059LSR7TE9DQUxfQ09NUElMRVJfVkVSU0lPTn0pCisKKyAgaWYgKE5PVCAke0xPQ0FMX0NPTVBJTEVSX0ZMQUdTfSBTVFJFUVVBTCAgIiIpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS0ke0xPQ0FMX0NPTVBJTEVSX0ZMQUdTfSkKKyAgZW5kaWYoKQorCisgIGVpX2lzXzY0Yml0X2VudihJU182NEJJVF9FTlYpCisgIGlmKE5PVCBJU182NEJJVF9FTlYpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS0zMmJpdCkKKyAgZWxzZSgpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS02NGJpdCkKKyAgZW5kaWYoKQorCisgIGlmKEVJR0VOX1RFU1RfQ1hYMTEpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS1jeHgxMSkKKyAgZW5kaWYoKQorCisgIGlmKEVJR0VOX0JVSUxEX1NUUklOR19TVUZGSVgpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS0ke0VJR0VOX0JVSUxEX1NUUklOR19TVUZGSVh9KQorICBlbmRpZigpCisKKyAgc3RyaW5nKFRPTE9XRVIgJHtUTVBfQlVJTERfU1RSSU5HfSBCVUlMRE5BTUUpCitlbmRtYWNybyhlaV9zZXRfYnVpbGRfc3RyaW5nKQorCittYWNybyhlaV9pc182NGJpdF9lbnYgVkFSKQorICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgc2V0KCR7VkFSfSAxKQorICBlbHNlaWYoQ01BS0VfU0laRU9GX1ZPSURfUCBFUVVBTCA0KQorICAgIHNldCgke1ZBUn0gMCkKKyAgZWxzZSgpCisgICAgbWVzc2FnZShXQVJOSU5HICJVbnN1cHBvcnRlZCBwb2ludGVyIHNpemUuIFBsZWFzZSBjb250YWN0IHRoZSBhdXRob3JzLiIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX2lzXzY0Yml0X2VudikKKworCisjIGhlbHBlciBtYWNybyBmb3IgdGVzdGluZyBlaV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcKKyMgU1RSOiByYXcgdmVyc2lvbiBzdHJpbmcKKyMgUkVGTkFNRTogZXhwZWN0ZWQgY29tcGlsZXIgbmFtZQorIyBSRUZWRVI6IGV4cGVjdGVkIGNvbXBpbGVyIHZlcnNpb24KK21hY3JvKGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZyBTVFIgUkVGTkFNRSBSRUZWRVIpCisgIGVpX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygke1NUUn0gQ05BTUUgQ1ZFUikKKyAgaWYoKE5PVCAke1JFRk5BTUV9IFNUUkVRVUFMICR7Q05BTUV9KSBPUiAoTk9UICR7UkVGVkVSfSBTVFJFUVVBTCAke0NWRVJ9KSkKKyAgICBtZXNzYWdlKCJTVEFUVVMgZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nIGVycm9yOiIpCisgICAgbWVzc2FnZSgiRXhwZWN0ZWQgXCIke1JFRk5BTUV9LSR7UkVGVkVSfVwiLCBnb3QgXCIke0NOQU1FfS0ke0NWRVJ9XCIiKQorICBlbmRpZigpCitlbmRtYWNybyhlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcpCisKKyMgbWFjcm8gZm9yIHRlc3RpbmcgZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nCisjIGZlZWwgZnJlZSB0byBhZGQgbW9yZSB2ZXJzaW9uIHN0cmluZ3MKK21hY3JvKGVpX3Rlc3RfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoImcrKyAoU1VTRSBMaW51eCkgNC41LjMgMjAxMTA0MjggW2djYy00XzUtYnJhbmNoIHJldmlzaW9uIDE3MzExN10iICJnKysiICI0LjUuMyIpCisgIGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiYysrIChHQ0MpIDQuNS4xIDIwMTAwOTI0IChSZWQgSGF0IDQuNS4xLTQpIiAiZysrIiAiNC41LjEiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoImljcGMgKElDQykgMTEuMCAyMDA4MTEwNSIgImljcGMiICIxMS4wIikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJnKystMy40IChHQ0MpIDMuNC42IiAiZysrIiAiMy40LjYiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoIlNVU0UgTGludXggY2xhbmcgdmVyc2lvbiAzLjAgKGJyYW5jaGVzL3JlbGVhc2VfMzAgMTQ1NTk4KSAoYmFzZWQgb24gTExWTSAzLjApIiAibGx2bS1jbGFuZysrIiAiMy4wIikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJpY3BjIChJQ0MpIDEyLjAuNSAyMDExMDcxOSIgImljcGMiICIxMi4wLjUiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoIkFwcGxlIGNsYW5nIHZlcnNpb24gMi4xICh0YWdzL0FwcGxlL2NsYW5nLTE2My43LjEpIChiYXNlZCBvbiBMTFZNIDMuMHN2bikiICJsbHZtLWNsYW5nKysiICIyLjEiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoImk2ODYtYXBwbGUtZGFyd2luMTEtbGx2bS1nKystNC4yIChHQ0MpIDQuMi4xIChCYXNlZCBvbiBBcHBsZSBJbmMuIGJ1aWxkIDU2NTgpIChMTFZNIGJ1aWxkIDIzMzUuMTUuMDApIiAibGx2bS1nKysiICI0LjIuMSIpCisgIGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiZysrLW1wLTQuNCAoR0NDKSA0LjQuNiIgImcrKyIgIjQuNC42IikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJnKystbXAtNC40IChHQ0MpIDIwMTEiICJnKysiICI0LjQiKQorZW5kbWFjcm8oZWlfdGVzdF9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcpCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlblVuaW5zdGFsbC5jbWFrZSBiL2NtYWtlL0VpZ2VuVW5pbnN0YWxsLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYWU4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9FaWdlblVuaW5zdGFsbC5jbWFrZQpAQCAtMCwwICsxLDQwIEBACisjIyMjIyMjIyMjIyMjIyMjIENNYWtlIFVuaW5zdGFsbCBUZW1wbGF0ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDTWFrZSBUZW1wbGF0ZSBmaWxlIGZvciB1bmluc3RhbGxhdGlvbiBvZiBmaWxlcworIyBtZW50aW9uZWQgaW4gJ2luc3RhbGxfbWFuaWZlc3QudHh0JworIworIyBVc2VkIGJ5IHVpbnN0YWxsIHRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc2V0KE1BTklGRVNUICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5zdGFsbF9tYW5pZmVzdC50eHQiKQorCitpZihFWElTVFMgJHtNQU5JRkVTVH0pCisgIG1lc3NhZ2UoU1RBVFVTICI9PT09PT09PT09PT09PSBVbmluc3RhbGxpbmcgRWlnZW4gID09PT09PT09PT09PT09PT09PT0iKQorCisgIGZpbGUoU1RSSU5HUyAke01BTklGRVNUfSBmaWxlcykKKyAgZm9yZWFjaChmaWxlICR7ZmlsZXN9KQorICAgIGlmKEVYSVNUUyAke2ZpbGV9KQorICAgICAgbWVzc2FnZShTVEFUVVMgIlJlbW92aW5nIGZpbGU6ICcke2ZpbGV9JyIpCisKKyAgICAgIGV4ZWN1dGVfcHJvY2VzcygKKyAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHJlbW92ZSAke2ZpbGV9CisgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBybV9vdXQKKyAgICAgICAgUkVTVUxUX1ZBUklBQkxFIHJtX3JldHZhbAorICAgICAgICApCisKKyAgICAgIGlmKE5PVCAiJHtybV9yZXR2YWx9IiBTVFJFUVVBTCAwKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGYWlsZWQgdG8gcmVtb3ZlIGZpbGU6ICcke2ZpbGV9Jy4iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkZpbGUgJyR7ZmlsZX0nIGRvZXMgbm90IGV4aXN0LiIpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKGZpbGUpCisKKyAgbWVzc2FnZShTVEFUVVMgIj09PT09PT09PT0gRmluaXNoZWQgVW5pbnN0YWxsaW5nIEVpZ2VuICA9PT09PT09PT09PT09PSIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIkNhbm5vdCBmaW5kIGluc3RhbGwgbWFuaWZlc3Q6ICcke01BTklGRVNUfSciKQorICBtZXNzYWdlKFNUQVRVUyAiUHJvYmFibHkgbWFrZSBpbnN0YWxsIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQiKQorICBtZXNzYWdlKFNUQVRVUyAiICAgb3IgaW5zdGFsbF9tYW5pZmVzdC50eHQgaGFzIGJlZW4gZGVsZXRlZC4iKQorZW5kaWYoKQorCisKKwpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEFkb2xjLmNtYWtlIGIvY21ha2UvRmluZEFkb2xjLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2U1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQWRvbGMuY21ha2UKQEAgLTAsMCArMSwyMCBAQAorCitpZiAoQURPTENfSU5DTFVERVMgQU5EIEFET0xDX0xJQlJBUklFUykKKyAgc2V0KEFET0xDX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKEFET0xDX0lOQ0xVREVTIEFORCBBRE9MQ19MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChBRE9MQ19JTkNMVURFUworICBOQU1FUworICBhZG9sYy9hZHRsLmgKKyAgUEFUSFMKKyAgJEVOVntBRE9MQ0RJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoQURPTENfTElCUkFSSUVTIGFkb2xjIFBBVEhTICRFTlZ7QURPTENESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBRE9MQyBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFET0xDX0lOQ0xVREVTIEFET0xDX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChBRE9MQ19JTkNMVURFUyBBRE9MQ19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kQkxBUy5jbWFrZSBiL2NtYWtlL0ZpbmRCTEFTLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzRiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQkxBUy5jbWFrZQpAQCAtMCwwICsxLDE0MDYgQEAKKyMjIworIworIyBAY29weXJpZ2h0IChjKSAyMDA5LTIwMTQgVGhlIFVuaXZlcnNpdHkgb2YgVGVubmVzc2VlIGFuZCBUaGUgVW5pdmVyc2l0eQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgVGVubmVzc2VlIFJlc2VhcmNoIEZvdW5kYXRpb24uCisjICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTYgSW5yaWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBCb3JkZWF1eCBJTlAsIENOUlMgKExhQlJJIFVNUiA1ODAwKSwgSW5yaWEsIFVuaXYuIEJvcmRlYXV4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyMjCisjCisjIC0gRmluZCBCTEFTIGxpYnJhcnkKKyMgVGhpcyBtb2R1bGUgZmluZHMgYW4gaW5zdGFsbGVkIGZvcnRyYW4gbGlicmFyeSB0aGF0IGltcGxlbWVudHMgdGhlIEJMQVMKKyMgbGluZWFyLWFsZ2VicmEgaW50ZXJmYWNlIChzZWUgaHR0cDovL3d3dy5uZXRsaWIub3JnL2JsYXMvKS4KKyMgVGhlIGxpc3Qgb2YgbGlicmFyaWVzIHNlYXJjaGVkIGZvciBpcyB0YWtlbgorIyBmcm9tIHRoZSBhdXRvY29uZiBtYWNybyBmaWxlLCBhY3hfYmxhcy5tNCAoZGlzdHJpYnV0ZWQgYXQKKyMgaHR0cDovL2FjLWFyY2hpdmUuc291cmNlZm9yZ2UubmV0L2FjLWFyY2hpdmUvYWN4X2JsYXMuaHRtbCkuCisjCisjIFRoaXMgbW9kdWxlIHNldHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisjICBCTEFTX0ZPVU5EIC0gc2V0IHRvIHRydWUgaWYgYSBsaWJyYXJ5IGltcGxlbWVudGluZyB0aGUgQkxBUyBpbnRlcmZhY2UKKyMgICAgaXMgZm91bmQKKyMgIEJMQVNfTElOS0VSX0ZMQUdTIC0gdW5jYWNoZWQgbGlzdCBvZiByZXF1aXJlZCBsaW5rZXIgZmxhZ3MgKGV4Y2x1ZGluZyAtbAorIyAgICBhbmQgLUwpLgorIyAgQkxBU19DT01QSUxFUl9GTEFHUyAtIHVuY2FjaGVkIGxpc3Qgb2YgcmVxdWlyZWQgY29tcGlsZXIgZmxhZ3MgKGluY2x1ZGluZyAtSSBmb3IgbWtsIGhlYWRlcnMpLgorIyAgQkxBU19MSUJSQVJJRVMgLSB1bmNhY2hlZCBsaXN0IG9mIGxpYnJhcmllcyAodXNpbmcgZnVsbCBwYXRoIG5hbWUpIHRvCisjICAgIGxpbmsgYWdhaW5zdCB0byB1c2UgQkxBUworIyAgQkxBUzk1X0xJQlJBUklFUyAtIHVuY2FjaGVkIGxpc3Qgb2YgbGlicmFyaWVzICh1c2luZyBmdWxsIHBhdGggbmFtZSkKKyMgICAgdG8gbGluayBhZ2FpbnN0IHRvIHVzZSBCTEFTOTUgaW50ZXJmYWNlCisjICBCTEFTOTVfRk9VTkQgLSBzZXQgdG8gdHJ1ZSBpZiBhIGxpYnJhcnkgaW1wbGVtZW50aW5nIHRoZSBCTEFTIGY5NSBpbnRlcmZhY2UKKyMgICAgaXMgZm91bmQKKyMgIEJMQV9TVEFUSUMgIGlmIHNldCBvbiB0aGlzIGRldGVybWluZXMgd2hhdCBraW5kIG9mIGxpbmthZ2Ugd2UgZG8gKHN0YXRpYykKKyMgIEJMQV9WRU5ET1IgIGlmIHNldCBjaGVja3Mgb25seSB0aGUgc3BlY2lmaWVkIHZlbmRvciwgaWYgbm90IHNldCBjaGVja3MKKyMgICAgIGFsbCB0aGUgcG9zc2liaWxpdGllcworIyAgQkxBU19WRU5ET1JfRk9VTkQgc3RvcmVzIHRoZSBCTEFTIHZlbmRvciBmb3VuZCAKKyMgIEJMQV9GOTUgICAgIGlmIHNldCBvbiB0cmllcyB0byBmaW5kIHRoZSBmOTUgaW50ZXJmYWNlcyBmb3IgQkxBUy9MQVBBQ0sKKyMgVGhlIHVzZXIgY2FuIGdpdmUgc3BlY2lmaWMgcGF0aHMgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyaWVzIGFkZGluZyBjbWFrZQorIyBvcHRpb25zIGF0IGNvbmZpZ3VyZSAoZXg6IGNtYWtlIHBhdGgvdG8vcHJvamVjdCAtREJMQVNfRElSPXBhdGgvdG8vYmxhcyk6CisjICBCTEFTX0RJUiAgICAgICAgICAgIC0gV2hlcmUgdG8gZmluZCB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgYmxhcworIyAgQkxBU19JTkNESVIgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGhlYWRlciBmaWxlcworIyAgQkxBU19MSUJESVIgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZXMKKyMgVGhlIG1vZHVsZSBjYW4gYWxzbyBsb29rIGZvciB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZiBwYXRocworIyBhcmUgbm90IGdpdmVuIGFzIGNtYWtlIHZhcmlhYmxlOiBCTEFTX0RJUiwgQkxBU19JTkNESVIsIEJMQVNfTElCRElSCisjIEZvciBNS0wgY2FzZSBhbmQgaWYgbm8gcGF0aHMgYXJlIGdpdmVuIGFzIGhpbnRzLCB3ZSB3aWxsIHRyeSB0byB1c2UgdGhlIE1LTFJPT1QKKyMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyMgIEJMQVNfVkVSQk9TRSBQcmludCBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZHVyaW5nIEJMQVMgbGlicmFyaWVzIGRldGVjdGlvbgorIyMjIyMjIyMjIworIyMjIExpc3Qgb2YgdmVuZG9ycyAoQkxBX1ZFTkRPUikgdmFsaWQgaW4gdGhpcyBtb2R1bGUKKyMjIyMjIyMjIyMgTGlzdCBvZiB2ZW5kb3JzIChCTEFfVkVORE9SKSB2YWxpZCBpbiB0aGlzIG1vZHVsZQorIyMgIE9wZW4gKGZvciBPcGVuQmxhcyksIEVpZ2VuIChmb3IgRWlnZW5CbGFzKSwgR290bywgQVRMQVMgUGhpUEFDSywKKyMjwqAgQ1hNTCwgRFhNTCwgU3VuUGVyZiwgU0NTTCwgU0dJTUFUSCwgSUJNRVNTTCwgSUJNRVNTTE1UCisjIyAgSW50ZWwxMF8zMiAoaW50ZWwgbWtsIHYxMCAzMiBiaXQpLCBJbnRlbDEwXzY0bHAgKGludGVsIG1rbCB2MTAgNjQgYml0LGxwIHRocmVhZCBtb2RlbCwgbHA2NCBtb2RlbCksCisjIyAgSW50ZWwxMF82NGxwX3NlcSAoaW50ZWwgbWtsIHYxMCA2NCBiaXQsc2VxdWVudGlhbCBjb2RlLCBscDY0IG1vZGVsKSwKKyMjICBJbnRlbCggb2xkZXIgdmVyc2lvbnMgb2YgbWtsIDMyIGFuZCA2NCBiaXQpLAorIyPCoCBBQ01MLCBBQ01MX01QLCBBQ01MX0dQVSwgQXBwbGUsIE5BUywgR2VuZXJpYworIyBDL0NYWCBzaG91bGQgYmUgZW5hYmxlZCB0byB1c2UgSW50ZWwgbWtsCisjIyMKKyMgV2UgaGFuZGxlIGRpZmZlcmVudCBtb2RlcyB0byBmaW5kIHRoZSBkZXBlbmRlbmN5CisjCisjIC0gRGV0ZWN0aW9uIGlmIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0KKyMgICAtIEJMQVMgbGlicmFyaWVzIGNhbiBiZSBkZXRlY3RlZCBmcm9tIGRpZmZlcmVudCB3YXlzCisjICAgICBIZXJlIGlzIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlOgorIyAgICAgMSkgd2UgbG9vayBpbiBjbWFrZSB2YXJpYWJsZSBCTEFTX0xJQkRJUiBvciBCTEFTX0RJUiAod2UgZ3Vlc3MgdGhlIGxpYmRpcnMpIGlmIGRlZmluZWQKKyMgICAgIDIpIHdlIGxvb2sgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgQkxBU19MSUJESVIgb3IgQkxBU19ESVIgKHdlIGd1ZXNzIHRoZSBsaWJkaXJzKSBpZiBkZWZpbmVkCisjICAgICAzKSB3ZSBsb29rIGluIGNvbW1vbiBlbnZpcm9ubm1lbnQgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIChJTkNMVURFLCBDX0lOQ0xVREVfUEFUSCwgQ1BBVEggLSBMSUIsIERZTERfTElCUkFSWV9QQVRILCBMRF9MSUJSQVJZX1BBVEgpCisjICAgICA0KSB3ZSBsb29rIGluIGNvbW1vbiBzeXN0ZW0gcGF0aHMgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0sIHNlZSBmb3IgZXhhbXBsZSBwYXRocyBjb250YWluZWQgaW4gdGhlIGZvbGxvd2luZyBjbWFrZSB2YXJpYWJsZXM6CisjICAgICAgIC0gQ01BS0VfUExBVEZPUk1fSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFUywgQ01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFUworIyAgICAgICAtIENNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFUywgQ01BS0VfQ19JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTCisjCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMjAwNy0yMDA5IEtpdHdhcmUsIEluYy4KKyMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE9TSS1hcHByb3ZlZCBCU0QgTGljZW5zZSAodGhlICJMaWNlbnNlIik7CisjIHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBDb3B5cmlnaHQudHh0IGZvciBkZXRhaWxzLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKFRvIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG91dHNpZGUgb2YgQ01ha2UsIHN1YnN0aXR1dGUgdGhlIGZ1bGwKKyMgIExpY2Vuc2UgdGV4dCBmb3IgdGhlIGFib3ZlIHJlZmVyZW5jZS4pCisKKyMjIFNvbWUgbWFjcm9zIHRvIHByaW50IHN0YXR1cyB3aGVuIHNlYXJjaCBmb3IgaGVhZGVycyBhbmQgbGlicworIyBUaGlzIG1hY3JvIGluZm9ybXMgd2h5IHRoZSBfbGliX3RvX2ZpbmQgZmlsZSBoYXMgbm90IGJlZW4gZm91bmQKK21hY3JvKFByaW50X0ZpbmRfTGlicmFyeV9CbGFzX1N0YXR1cyBfbGlibmFtZSBfbGliX3RvX2ZpbmQpCisKKyAgIyBzYXZlIF9saWJuYW1lIHVwcGVyL2xvd2VyIGNhc2UKKyAgc3RyaW5nKFRPVVBQRVIgJHtfbGlibmFtZX0gTElCTkFNRSkKKyAgc3RyaW5nKFRPTE9XRVIgJHtfbGlibmFtZX0gbGlibmFtZSkKKworICAjIHByaW50IHN0YXR1cworICAjbWVzc2FnZSgiICIpCisgIGlmKCR7TElCTkFNRX1fTElCRElSKQorICAgIG1lc3NhZ2UoIiR7WWVsbG93fSR7TElCTkFNRX1fTElCRElSIGlzIGRlZmluZWQgYnV0ICR7X2xpYl90b19maW5kfSIKKyAgICAgICJoYXMgbm90IGJlZW4gZm91bmQgaW4gJHtBUkdOfSR7Q29sb3VyUmVzZXR9IikKKyAgZWxzZSgpCisgICAgaWYoJHtMSUJOQU1FfV9ESVIpCisgICAgICBtZXNzYWdlKCIke1llbGxvd30ke0xJQk5BTUV9X0RJUiBpcyBkZWZpbmVkIGJ1dCAke19saWJfdG9fZmluZH0iCisJImhhcyBub3QgYmVlbiBmb3VuZCBpbiAke0FSR059JHtDb2xvdXJSZXNldH0iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZSgiJHtZZWxsb3d9JHtfbGliX3RvX2ZpbmR9IG5vdCBmb3VuZC4iCisJIk5vciAke0xJQk5BTUV9X0RJUiBuZWl0aGVyICR7TElCTkFNRX1fTElCRElSIgorCSJhcmUgZGVmaW5lZCBzbyB0aGF0IHdlIGxvb2sgZm9yICR7X2xpYl90b19maW5kfSBpbiIKKwkic3lzdGVtIHBhdGhzIChMaW51eDogTERfTElCUkFSWV9QQVRILCBXaW5kb3dzOiBMSUIsIgorCSJNYWM6IERZTERfTElCUkFSWV9QQVRILCIKKwkiQ01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFUywiCisJIkNNQUtFX0NfSU1QTElDSVRfTElOS19ESVJFQ1RPUklFUykke0NvbG91clJlc2V0fSIpCisgICAgICBpZihfbGliX2VudikKKwltZXNzYWdlKCIke1llbGxvd30ke19saWJfdG9fZmluZH0gaGFzIG5vdCBiZWVuIGZvdW5kIGluIgorCSAgIiR7X2xpYl9lbnZ9JHtDb2xvdXJSZXNldH0iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBtZXNzYWdlKCIke0JvbGRZZWxsb3d9UGxlYXNlIGluZGljYXRlIHdoZXJlIHRvIGZpbmQgJHtfbGliX3RvX2ZpbmR9LiBZb3UgaGF2ZSB0aHJlZSBvcHRpb25zOlxuIgorICAgICItIE9wdGlvbiAxOiBQcm92aWRlIHRoZSBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEJMQVMgbGlicmFyeSB3aXRoIGNtYWtlIG9wdGlvbjogLUQke0xJQk5BTUV9X0RJUj15b3VyL3BhdGgvdG8vJHtsaWJuYW1lfS9cbiIKKyAgICAiLSBPcHRpb24gMjogUHJvdmlkZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkgd2l0aCBjbWFrZSBvcHRpb246IC1EJHtMSUJOQU1FfV9MSUJESVI9eW91ci9wYXRoL3RvLyR7bGlibmFtZX0vbGliL1xuIgorICAgICItIE9wdGlvbiAzOiBVcGRhdGUgeW91ciBlbnZpcm9ubWVudCB2YXJpYWJsZSAoTGludXg6IExEX0xJQlJBUllfUEFUSCwgV2luZG93czogTElCLCBNYWM6IERZTERfTElCUkFSWV9QQVRIKVxuIgorICAgICItIE9wdGlvbiA0OiBJZiB5b3VyIGxpYnJhcnkgcHJvdmlkZXMgYSBQa2dDb25maWcgZmlsZSwgbWFrZSBzdXJlIHBrZy1jb25maWcgZmluZHMgeW91ciBsaWJyYXJ5JHtDb2xvdXJSZXNldH0iKQorCitlbmRtYWNybygpCisKKyMgVGhpcyBtYWNybyBpbmZvcm1zIHdoeSB0aGUgX2xpYl90b19maW5kIGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCittYWNybyhQcmludF9GaW5kX0xpYnJhcnlfQmxhc19DaGVja0Z1bmNfU3RhdHVzIF9uYW1lKQorCisgICMgc2F2ZSBfbGlibmFtZSB1cHBlci9sb3dlciBjYXNlCisgIHN0cmluZyhUT1VQUEVSICR7X25hbWV9IEZVTkNOQU1FKQorICBzdHJpbmcoVE9MT1dFUiAke19uYW1lfSBmdW5jbmFtZSkKKworICAjIHByaW50IHN0YXR1cworICAjbWVzc2FnZSgiICIpCisgIG1lc3NhZ2UoIiR7UmVkfUxpYnMgaGF2ZSBiZWVuIGZvdW5kIGJ1dCBjaGVjayBvZiBzeW1ib2wgJHtfbmFtZX0gZmFpbGVkICIKKyAgICAid2l0aCBmb2xsb3dpbmcgbGlicmFyaWVzICR7QVJHTn0ke0NvbG91clJlc2V0fSIpCisgIG1lc3NhZ2UoIiR7Qm9sZFJlZH1QbGVhc2Ugb3BlbiB5b3VyIGVycm9yIGZpbGUgQ01ha2VGaWxlcy9DTWFrZUVycm9yLmxvZyIKKyAgICAidG8gZmlndXJlIG91dCB3aHkgaXQgZmFpbHMke0NvbG91clJlc2V0fSIpCisgICNtZXNzYWdlKCIgIikKKworZW5kbWFjcm8oKQorCitpZiAoTk9UIEJMQVNfRk9VTkQpCisgIHNldChCTEFTX0RJUiAiIiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEJMQVMgbGlicmFyeSIpCisgIGlmIChOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgY2FjaGUgdmFyaWFibGUsIG5hbWVseSBCTEFTX0RJUiwgaGFzIGJlZW4gc2V0IHRvIHNwZWNpZnkgdGhlIGluc3RhbGwgZGlyZWN0b3J5IG9mIEJMQVMiKQorICBlbmRpZigpCitlbmRpZigpCisKK29wdGlvbihCTEFTX1ZFUkJPU0UgIlByaW50IHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkdXJpbmcgQkxBUyBsaWJyYXJpZXMgZGV0ZWN0aW9uIiBPRkYpCittYXJrX2FzX2FkdmFuY2VkKEJMQVNfVkVSQk9TRSkKKworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja0ZvcnRyYW5GdW5jdGlvbkV4aXN0cykKKworc2V0KF9ibGFzX09SSUdfQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTICR7Q01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTfSkKKworIyBDaGVjayB0aGUgbGFuZ3VhZ2UgYmVpbmcgdXNlZAorZ2V0X3Byb3BlcnR5KCBfTEFOR1VBR0VTXyBHTE9CQUwgUFJPUEVSVFkgRU5BQkxFRF9MQU5HVUFHRVMgKQoraWYoIF9MQU5HVUFHRVNfIE1BVENIRVMgRm9ydHJhbiApCisgIHNldCggX0NIRUNLX0ZPUlRSQU4gVFJVRSApCitlbHNlaWYoIChfTEFOR1VBR0VTXyBNQVRDSEVTIEMpIE9SIChfTEFOR1VBR0VTXyBNQVRDSEVTIENYWCkgKQorICBzZXQoIF9DSEVDS19GT1JUUkFOIEZBTFNFICkKK2Vsc2UoKQorICBpZihCTEFTX0ZJTkRfUkVRVUlSRUQpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmluZEJMQVMgcmVxdWlyZXMgRm9ydHJhbiwgQywgb3IgQysrIHRvIGJlIGVuYWJsZWQuIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEJMQVMuLi4gLSBOT1QgZm91bmQgKFVuc3VwcG9ydGVkIGxhbmd1YWdlcykiKQorICAgIHJldHVybigpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworbWFjcm8oQ2hlY2tfRm9ydHJhbl9MaWJyYXJpZXMgTElCUkFSSUVTIF9wcmVmaXggX25hbWUgX2ZsYWdzIF9saXN0IF90aHJlYWQpCisgICMgVGhpcyBtYWNybyBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNvbWJpbmF0aW9uIG9mIGZvcnRyYW4gbGlicmFyaWVzCisgICMgZ2l2ZW4gYnkgX2xpc3QuICBJZiB0aGUgY29tYmluYXRpb24gaXMgZm91bmQsIHRoaXMgbWFjcm8gY2hlY2tzICh1c2luZyB0aGUKKyAgIyBDaGVja19Gb3J0cmFuX0Z1bmN0aW9uX0V4aXN0cyBtYWNybykgd2hldGhlciBjYW4gbGluayBhZ2FpbnN0IHRoYXQgbGlicmFyeQorICAjIGNvbWJpbmF0aW9uIHVzaW5nIHRoZSBuYW1lIG9mIGEgcm91dGluZSBnaXZlbiBieSBfbmFtZSB1c2luZyB0aGUgbGlua2VyCisgICMgZmxhZ3MgZ2l2ZW4gYnkgX2ZsYWdzLiAgSWYgdGhlIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyBpcyBmb3VuZCBhbmQgcGFzc2VzCisgICMgdGhlIGxpbmsgdGVzdCwgTElCUkFSSUVTIGlzIHNldCB0byB0aGUgbGlzdCBvZiBjb21wbGV0ZSBsaWJyYXJ5IHBhdGhzIHRoYXQKKyAgIyBoYXZlIGJlZW4gZm91bmQuICBPdGhlcndpc2UsIExJQlJBUklFUyBpcyBzZXQgdG8gRkFMU0UuCisKKyAgIyBOLkIuIF9wcmVmaXggaXMgdGhlIHByZWZpeCBhcHBsaWVkIHRvIHRoZSBuYW1lcyBvZiBhbGwgY2FjaGVkIHZhcmlhYmxlcyB0aGF0CisgICMgYXJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGFuZCBtYXJrZWQgYWR2YW5jZWQgYnkgdGhpcyBtYWNyby4KKworICBzZXQoX2xpYmRpciAke0FSR059KQorCisgIHNldChfbGlicmFyaWVzX3dvcmsgVFJVRSkKKyAgc2V0KCR7TElCUkFSSUVTfSkKKyAgc2V0KF9jb21iaW5lZF9uYW1lKQorICBzZXQoRU5WX01LTFJPT1QgIiRFTlZ7TUtMUk9PVH0iKQorICBzZXQoRU5WX0JMQVNfRElSICIkRU5We0JMQVNfRElSfSIpCisgIHNldChFTlZfQkxBU19MSUJESVIgIiRFTlZ7QkxBU19MSUJESVJ9IikKKyAgaWYgKE5PVCBfbGliZGlyKQorICAgIGlmIChCTEFTX0xJQkRJUikKKyAgICAgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7QkxBU19MSUJESVJ9IikKKyAgICBlbHNlaWYgKEJMQVNfRElSKQorICAgICAgbGlzdChBUFBFTkQgX2xpYmRpciAiJHtCTEFTX0RJUn0iKQorICAgICAgbGlzdChBUFBFTkQgX2xpYmRpciAiJHtCTEFTX0RJUn0vbGliIikKKyAgICAgIGlmKCIke0NNQUtFX1NJWkVPRl9WT0lEX1B9IiBFUVVBTCAiOCIpCisJbGlzdChBUFBFTkQgX2xpYmRpciAiJHtCTEFTX0RJUn0vbGliNjQiKQorCWxpc3QoQVBQRU5EIF9saWJkaXIgIiR7QkxBU19ESVJ9L2xpYi9pbnRlbDY0IikKKyAgICAgIGVsc2UoKQorCWxpc3QoQVBQRU5EIF9saWJkaXIgIiR7QkxBU19ESVJ9L2xpYjMyIikKKwlsaXN0KEFQUEVORCBfbGliZGlyICIke0JMQVNfRElSfS9saWIvaWEzMiIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKEVOVl9CTEFTX0xJQkRJUikKKyAgICAgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX0JMQVNfTElCRElSfSIpCisgICAgZWxzZWlmKEVOVl9CTEFTX0RJUikKKyAgICAgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX0JMQVNfRElSfSIpCisgICAgICBsaXN0KEFQUEVORCBfbGliZGlyICIke0VOVl9CTEFTX0RJUn0vbGliIikKKyAgICAgIGlmKCIke0NNQUtFX1NJWkVPRl9WT0lEX1B9IiBFUVVBTCAiOCIpCisJbGlzdChBUFBFTkQgX2xpYmRpciAiJHtFTlZfQkxBU19ESVJ9L2xpYjY0IikKKwlsaXN0KEFQUEVORCBfbGliZGlyICIke0VOVl9CTEFTX0RJUn0vbGliL2ludGVsNjQiKQorICAgICAgZWxzZSgpCisJbGlzdChBUFBFTkQgX2xpYmRpciAiJHtFTlZfQkxBU19ESVJ9L2xpYjMyIikKKwlsaXN0KEFQUEVORCBfbGliZGlyICIke0VOVl9CTEFTX0RJUn0vbGliL2lhMzIiKQorICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgaWYgKEVOVl9NS0xST09UKQorCWxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX01LTFJPT1R9L2xpYiIpCisJaWYoIiR7Q01BS0VfU0laRU9GX1ZPSURfUH0iIEVRVUFMICI4IikKKwkgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX01LTFJPT1R9L2xpYjY0IikKKwkgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX01LTFJPT1R9L2xpYi9pbnRlbDY0IikKKwllbHNlKCkKKwkgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX01LTFJPT1R9L2xpYjMyIikKKwkgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7RU5WX01LTFJPT1R9L2xpYi9pYTMyIikKKwllbmRpZigpCisgICAgICBlbmRpZigpCisgICAgICBpZiAoV0lOMzIpCisJc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliZGlyMiAiJEVOVntMSUJ9IikKKyAgICAgIGVsc2VpZiAoQVBQTEUpCisJc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliZGlyMiAiJEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgICAgZWxzZSAoKQorCXN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYmRpcjIgIiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgICBlbmRpZiAoKQorICAgICAgbGlzdChBUFBFTkQgX2xpYmRpciAiJHtfbGliZGlyMn0iKQorICAgICAgbGlzdChBUFBFTkQgX2xpYmRpciAiJHtDTUFLRV9QTEFURk9STV9JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgICBsaXN0KEFQUEVORCBfbGliZGlyICIke0NNQUtFX0NfSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICAgIGVuZGlmKCkKKyAgZW5kaWYgKCkKKworICBpZiAoQkxBU19WRVJCT1NFKQorICAgIG1lc3NhZ2UoIiR7Q3lhbn1UcnkgdG8gZmluZCBCTEFTIGxpYnJhcmllczogJHtfbGlzdH0iKQorICBlbmRpZiAoKQorCisgIGZvcmVhY2goX2xpYnJhcnkgJHtfbGlzdH0pCisgICAgc2V0KF9jb21iaW5lZF9uYW1lICR7X2NvbWJpbmVkX25hbWV9XyR7X2xpYnJhcnl9KQorCisgICAgaWYoX2xpYnJhcmllc193b3JrKQorICAgICAgaWYgKEJMQV9TVEFUSUMpCisJaWYgKFdJTjMyKQorCSAgc2V0KENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAubGliICR7Q01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTfSkKKwllbmRpZiAoKQorCWlmIChBUFBMRSkKKwkgIHNldChDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMgLmxpYiAke0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFU30pCisJZWxzZSAoKQorCSAgc2V0KENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAuYSAke0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFU30pCisJZW5kaWYgKCkKKyAgICAgIGVsc2UgKCkKKwlpZiAoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIkxpbnV4IikKKwkgICMgZm9yIHVidW50dSdzIGxpYmJsYXMzZ2YgYW5kIGxpYmxhcGFjazNnZiBwYWNrYWdlcworCSAgc2V0KENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAke0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFU30gLnNvLjNnZikKKwllbmRpZiAoKQorICAgICAgZW5kaWYgKCkKKyAgICAgIGZpbmRfbGlicmFyeSgke19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUlkKKwlOQU1FUyAke19saWJyYXJ5fQorCUhJTlRTICR7X2xpYmRpcn0KKwlOT19ERUZBVUxUX1BBVEgKKwkpCisgICAgICBtYXJrX2FzX2FkdmFuY2VkKCR7X3ByZWZpeH1fJHtfbGlicmFyeX1fTElCUkFSWSkKKyAgICAgICMgUHJpbnQgc3RhdHVzIGlmIG5vdCBmb3VuZAorICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBpZiAoTk9UICR7X3ByZWZpeH1fJHtfbGlicmFyeX1fTElCUkFSWSBBTkQgTk9UIEJMQVNfRklORF9RVUlFVExZIEFORCBCTEFTX1ZFUkJPU0UpCisJUHJpbnRfRmluZF9MaWJyYXJ5X0JsYXNfU3RhdHVzKGJsYXMgJHtfbGlicmFyeX0gJHtfbGliZGlyfSkKKyAgICAgIGVuZGlmICgpCisgICAgICBzZXQoJHtMSUJSQVJJRVN9ICR7JHtMSUJSQVJJRVN9fSAkeyR7X3ByZWZpeH1fJHtfbGlicmFyeX1fTElCUkFSWX0pCisgICAgICBzZXQoX2xpYnJhcmllc193b3JrICR7JHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZfSkKKyAgICBlbmRpZihfbGlicmFyaWVzX3dvcmspCisgIGVuZGZvcmVhY2goX2xpYnJhcnkgJHtfbGlzdH0pCisKKyAgaWYoX2xpYnJhcmllc193b3JrKQorICAgICMgVGVzdCB0aGlzIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcy4KKyAgICBpZiAoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIkxpbnV4IiBBTkQgQkxBX1NUQVRJQykKKyAgICAgIGxpc3QoSU5TRVJUICR7TElCUkFSSUVTfSAwICItV2wsLS1zdGFydC1ncm91cCIpCisgICAgICBsaXN0KEFQUEVORCAke0xJQlJBUklFU30gIi1XbCwtLWVuZC1ncm91cCIpCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7X2ZsYWdzfTskeyR7TElCUkFSSUVTfX07JHtfdGhyZWFkfSIpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke0JMQVNfQ09NUElMRVJfRkxBR1N9IikKKyAgICBpZiAoQkxBU19WRVJCT1NFKQorICAgICAgbWVzc2FnZSgiJHtDeWFufUJMQVMgbGlicyBmb3VuZCBmb3IgQkxBX1ZFTkRPUiAke0JMQV9WRU5ET1J9LiIKKwkiVHJ5IHRvIGNvbXBpbGUgc3ltYm9sICR7X25hbWV9IHdpdGggZm9sbG93aW5nIGxpYnJhcmllczoiCisJIiR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCisgICAgZW5kaWYgKCkKKyAgICBpZihOT1QgQkxBU19GT1VORCkKKyAgICAgIHVuc2V0KCR7X3ByZWZpeH0ke19jb21iaW5lZF9uYW1lfV9XT1JLUyBDQUNIRSkKKyAgICBlbmRpZigpCisgICAgaWYgKF9DSEVDS19GT1JUUkFOKQorICAgICAgaWYgKENNQUtFX0ZvcnRyYW5fQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisJc3RyaW5nKFJFUExBQ0UgIm1rbF9pbnRlbF9scDY0IiAibWtsX2dmX2xwNjQiIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKKwlzdHJpbmcoUkVQTEFDRSAibWtsX2ludGVsX2lscDY0IiAibWtsX2dmX2lscDY0IiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCisgICAgICBlbmRpZigpCisgICAgICBjaGVja19mb3J0cmFuX2Z1bmN0aW9uX2V4aXN0cygiJHtfbmFtZX0iICR7X3ByZWZpeH0ke19jb21iaW5lZF9uYW1lfV9XT1JLUykKKyAgICBlbHNlKCkKKyAgICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygiJHtfbmFtZX1fIiAke19wcmVmaXh9JHtfY29tYmluZWRfbmFtZX1fV09SS1MpCisgICAgZW5kaWYoKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fSR7X2NvbWJpbmVkX25hbWV9X1dPUktTKQorICAgIHNldChfbGlicmFyaWVzX3dvcmsgJHske19wcmVmaXh9JHtfY29tYmluZWRfbmFtZX1fV09SS1N9KQorICAgICMgUHJpbnQgc3RhdHVzIGlmIG5vdCBmb3VuZAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGlmIChOT1QgX2xpYnJhcmllc193b3JrIEFORCBOT1QgQkxBU19GSU5EX1FVSUVUTFkgQU5EIEJMQVNfVkVSQk9TRSkKKyAgICAgIFByaW50X0ZpbmRfTGlicmFyeV9CbGFzX0NoZWNrRnVuY19TdGF0dXMoJHtfbmFtZX0gJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9KQorICAgIGVuZGlmICgpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKKyAgZW5kaWYoKQorCisgIGlmKF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtMSUJSQVJJRVN9ICR7JHtMSUJSQVJJRVN9fSAke190aHJlYWR9KQorICBlbHNlKF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtMSUJSQVJJRVN9IEZBTFNFKQorICBlbmRpZihfbGlicmFyaWVzX3dvcmspCisKK2VuZG1hY3JvKENoZWNrX0ZvcnRyYW5fTGlicmFyaWVzKQorCisKK3NldChCTEFTX0xJTktFUl9GTEFHUykKK3NldChCTEFTX0xJQlJBUklFUykKK3NldChCTEFTOTVfTElCUkFSSUVTKQoraWYgKCRFTlZ7QkxBX1ZFTkRPUn0gTUFUQ0hFUyAiLisiKQorICBzZXQoQkxBX1ZFTkRPUiAkRU5We0JMQV9WRU5ET1J9KQorZWxzZSAoKQorICBpZihOT1QgQkxBX1ZFTkRPUikKKyAgICBzZXQoQkxBX1ZFTkRPUiAiQWxsIikKKyAgZW5kaWYoKQorZW5kaWYgKCkKKworI0JMQVMgaW4gaW50ZWwgbWtsIDEwIGxpYnJhcnk/IChlbTY0dCA2NGJpdCkKK2lmIChCTEFfVkVORE9SIE1BVENIRVMgIkludGVsKiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMgT1IgQkxBX1ZFTkRPUiBNQVRDSEVTICJJbnRlbCoiKQorICAgICMgTG9va2luZyBmb3IgaW5jbHVkZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyBBZGQgc3lzdGVtIGluY2x1ZGUgcGF0aHMgdG8gc2VhcmNoIGluY2x1ZGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHVuc2V0KF9pbmNfZW52KQorICAgIHNldChFTlZfTUtMUk9PVCAiJEVOVntNS0xST09UfSIpCisgICAgc2V0KEVOVl9CTEFTX0RJUiAiJEVOVntCTEFTX0RJUn0iKQorICAgIHNldChFTlZfQkxBU19JTkNESVIgIiRFTlZ7QkxBU19JTkNESVJ9IikKKyAgICBpZihFTlZfQkxBU19JTkNESVIpCisgICAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfQkxBU19JTkNESVJ9IikKKyAgICBlbHNlaWYoRU5WX0JMQVNfRElSKQorICAgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX0JMQVNfRElSfSIpCisgICAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfQkxBU19ESVJ9L2luY2x1ZGUiKQorICAgIGVsc2UoKQorICAgICAgaWYgKEVOVl9NS0xST09UKQorCWxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0VOVl9NS0xST09UfS9pbmNsdWRlIikKKyAgICAgIGVuZGlmKCkKKyAgICAgICMgc3lzdGVtIHZhcmlhYmxlcworICAgICAgaWYoV0lOMzIpCisJc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERX0iKQorCWxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgICAgZWxzZSgpCisJc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERX0iKQorCWxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorCXN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NfSU5DTFVERV9QQVRIfSIpCisJbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisJc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7Q1BBVEh9IikKKwlsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKwlzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntJTkNMVURFX1BBVEh9IikKKwlsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgX2luY19lbnYpCisKKyAgICAjIHNldCBwYXRocyB3aGVyZSB0byBsb29rIGZvcgorICAgIHNldChQQVRIX1RPX0xPT0tfRk9SICIke19pbmNfZW52fSIpCisKKyAgICAjIFRyeSB0byBmaW5kIHRoZSBmZnR3IGhlYWRlciBpbiB0aGUgZ2l2ZW4gcGF0aHMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNhbGwgY21ha2UgbWFjcm8gdG8gZmluZCB0aGUgaGVhZGVyIHBhdGgKKyAgICBpZihCTEFTX0lOQ0RJUikKKyAgICAgIHNldChCTEFTX21rbC5oX0RJUlMgIkJMQVNfbWtsLmhfRElSUy1OT1RGT1VORCIpCisgICAgICBmaW5kX3BhdGgoQkxBU19ta2wuaF9ESVJTCisJTkFNRVMgbWtsLmgKKwlISU5UUyAke0JMQVNfSU5DRElSfSkKKyAgICBlbHNlKCkKKyAgICAgIGlmKEJMQVNfRElSKQorCXNldChCTEFTX21rbC5oX0RJUlMgIkJMQVNfbWtsLmhfRElSUy1OT1RGT1VORCIpCisJZmluZF9wYXRoKEJMQVNfbWtsLmhfRElSUworCSAgTkFNRVMgbWtsLmgKKwkgIEhJTlRTICR7QkxBU19ESVJ9CisJICBQQVRIX1NVRkZJWEVTICJpbmNsdWRlIikKKyAgICAgIGVsc2UoKQorCXNldChCTEFTX21rbC5oX0RJUlMgIkJMQVNfbWtsLmhfRElSUy1OT1RGT1VORCIpCisJZmluZF9wYXRoKEJMQVNfbWtsLmhfRElSUworCSAgTkFNRVMgbWtsLmgKKwkgIEhJTlRTICR7UEFUSF9UT19MT09LX0ZPUn0pCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoQkxBU19ta2wuaF9ESVJTKQorCisgICAgIyBJZiBmb3VuZCwgYWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGlmIChCTEFTX21rbC5oX0RJUlMpCisgICAgICBzZXQoQkxBU19JTkNMVURFX0RJUlMgIiR7QkxBU19ta2wuaF9ESVJTfSIpCisgICAgZWxzZSAoKQorICAgICAgc2V0KEJMQVNfSU5DTFVERV9ESVJTICJCTEFTX0lOQ0xVREVfRElSUy1OT1RGT1VORCIpCisgICAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEJMQVMgLS0gbWtsLmggbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisKKyAgICBpZiAoV0lOMzIpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9saWJkaXIgIiRFTlZ7TElCfSIpCisgICAgZWxzZWlmIChBUFBMRSkKKyAgICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYmRpciAiJEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGVsc2UgKCkKKyAgICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYmRpciAiJEVOVntMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBlbmRpZiAoKQorICAgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoQVBQRU5EIF9saWJkaXIgIiR7Q01BS0VfQ19JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgIyBsaWJpb21wNQorICAgICMgLS0tLS0tLS0KKyAgICBzZXQoT01QX2lvbXA1X0xJQlJBUlkgIk9NUF9pb21wNV9MSUJSQVJZLU5PVEZPVU5EIikKKyAgICBmaW5kX2xpYnJhcnkoT01QX2lvbXA1X0xJQlJBUlkKKyAgICAgIE5BTUVTIGlvbXA1CisgICAgICBISU5UUyAke19saWJkaXJ9CisgICAgICApCisgICAgbWFya19hc19hZHZhbmNlZChPTVBfaW9tcDVfTElCUkFSWSkKKyAgICBzZXQoT01QX0xJQiAiIikKKyAgICAjIGxpYmdvbXAKKyAgICAjIC0tLS0tLS0KKyAgICBzZXQoT01QX2dvbXBfTElCUkFSWSAiT01QX2dvbXBfTElCUkFSWS1OT1RGT1VORCIpCisgICAgZmluZF9saWJyYXJ5KE9NUF9nb21wX0xJQlJBUlkKKyAgICAgIE5BTUVTIGdvbXAKKyAgICAgIEhJTlRTICR7X2xpYmRpcn0KKyAgICAgICkKKyAgICBtYXJrX2FzX2FkdmFuY2VkKE9NUF9nb21wX0xJQlJBUlkpCisgICAgIyBjaG9vc2Ugb25lIG9yIGFub3RoZXIgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxvCisgICAgaWYgKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisgICAgICBpZiAoT01QX2dvbXBfTElCUkFSWSkKKwlzZXQoT01QX0xJQiAiJHtPTVBfZ29tcF9MSUJSQVJZfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZShDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisgICAgICBpZiAoT01QX2lvbXA1X0xJQlJBUlkpCisJc2V0KE9NUF9MSUIgIiR7T01QX2lvbXA1X0xJQlJBUll9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisKKyAgICBpZiAoVU5JWCBBTkQgTk9UIFdJTjMyKQorICAgICAgIyBtCisgICAgICBmaW5kX2xpYnJhcnkoTV9MSUJSQVJZCisJTkFNRVMgbQorCUhJTlRTICR7X2xpYmRpcn0pCisgICAgICBtYXJrX2FzX2FkdmFuY2VkKE1fTElCUkFSWSkKKyAgICAgIGlmKE1fTElCUkFSWSkKKwlzZXQoTE0gIi1sbSIpCisgICAgICBlbHNlKCkKKwlzZXQoTE0gIiIpCisgICAgICBlbmRpZigpCisgICAgICAjIEZvcnRyYW4KKyAgICAgIHNldChMR0ZPUlRSQU4gIiIpCisgICAgICBpZiAoQ01BS0VfQ19DT01QSUxFUl9JRCBNQVRDSEVTICJHTlUiKQorCWZpbmRfbGlicmFyeSgKKwkgIEZPUlRSQU5fZ2ZvcnRyYW5fTElCUkFSWQorCSAgTkFNRVMgZ2ZvcnRyYW4KKwkgIEhJTlRTICR7X2xpYmRpcn0KKwkgICkKKwltYXJrX2FzX2FkdmFuY2VkKEZPUlRSQU5fZ2ZvcnRyYW5fTElCUkFSWSkKKwlpZiAoRk9SVFJBTl9nZm9ydHJhbl9MSUJSQVJZKQorCSAgc2V0KExHRk9SVFJBTiAiJHtGT1JUUkFOX2dmb3J0cmFuX0xJQlJBUll9IikKKwllbmRpZigpCisgICAgICBlbHNlaWYgKENNQUtFX0NfQ09NUElMRVJfSUQgTUFUQ0hFUyAiSW50ZWwiKQorCWZpbmRfbGlicmFyeSgKKwkgIEZPUlRSQU5faWZjb3JlX0xJQlJBUlkKKwkgIE5BTUVTIGlmY29yZQorCSAgSElOVFMgJHtfbGliZGlyfQorCSAgKQorCW1hcmtfYXNfYWR2YW5jZWQoRk9SVFJBTl9pZmNvcmVfTElCUkFSWSkKKwlpZiAoRk9SVFJBTl9pZmNvcmVfTElCUkFSWSkKKwkgIHNldChMR0ZPUlRSQU4gIntGT1JUUkFOX2lmY29yZV9MSUJSQVJZfSIpCisJZW5kaWYoKQorICAgICAgZW5kaWYoKQorICAgICAgc2V0KEJMQVNfQ09NUElMRVJfRkxBR1MgIiIpCisgICAgICBpZiAoTk9UIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfNjRscF9zZXEiKQorCWlmIChDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisJICBsaXN0KEFQUEVORCBCTEFTX0NPTVBJTEVSX0ZMQUdTICItb3Blbm1wIikKKwllbmRpZigpCisJaWYgKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisJICBsaXN0KEFQUEVORCBCTEFTX0NPTVBJTEVSX0ZMQUdTICItZm9wZW5tcCIpCisJZW5kaWYoKQorICAgICAgZW5kaWYoKQorICAgICAgaWYgKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisJaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfMzIiKQorCSAgbGlzdChBUFBFTkQgQkxBU19DT01QSUxFUl9GTEFHUyAiLW0zMiIpCisJZWxzZSgpCisJICBsaXN0KEFQUEVORCBCTEFTX0NPTVBJTEVSX0ZMQUdTICItbTY0IikKKwllbmRpZigpCisJaWYgKE5PVCBCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHBfc2VxIikKKwkgIGxpc3QoQVBQRU5EIE9NUF9MSUIgIi1sZGwiKQorCWVuZGlmKCkKKwlpZiAoRU5WX01LTFJPT1QpCisJICBsaXN0KEFQUEVORCBCTEFTX0NPTVBJTEVSX0ZMQUdTICItSSR7RU5WX01LTFJPT1R9L2luY2x1ZGUiKQorCWVuZGlmKCkKKyAgICAgIGVuZGlmKCkKKworICAgICAgc2V0KGFkZGl0aW9uYWxfZmxhZ3MgIiIpCisgICAgICBpZiAoQ01BS0VfQ19DT01QSUxFUl9JRCBTVFJFUVVBTCAiR05VIiBBTkQgQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIkxpbnV4IikKKwlzZXQoYWRkaXRpb25hbF9mbGFncyAiLVdsLC0tbm8tYXMtbmVlZGVkIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZiAoKQorCisgICAgaWYgKF9MQU5HVUFHRVNfIE1BVENIRVMgQyBPUiBfTEFOR1VBR0VTXyBNQVRDSEVTIENYWCkKKyAgICAgIGlmKEJMQVNfRklORF9RVUlFVExZIE9SIE5PVCBCTEFTX0ZJTkRfUkVRVUlSRUQpCisJZmluZF9wYWNrYWdlKFRocmVhZHMpCisgICAgICBlbHNlKCkKKwlmaW5kX3BhY2thZ2UoVGhyZWFkcyBSRVFVSVJFRCkKKyAgICAgIGVuZGlmKCkKKworICAgICAgc2V0KEJMQVNfU0VBUkNIX0xJQlMgIiIpCisKKyAgICAgIGlmKEJMQV9GOTUpCisKKwlzZXQoQkxBU19ta2xfU0VBUkNIX1NZTUJPTCBTR0VNTSkKKwlzZXQoX0xJQlJBUklFUyBCTEFTOTVfTElCUkFSSUVTKQorCWlmIChXSU4zMikKKwkgIGlmIChCTEFfU1RBVElDKQorCSAgICBzZXQoQkxBU19ta2xfRExMX1NVRkZJWCAiIikKKwkgIGVsc2UoKQorCSAgICBzZXQoQkxBU19ta2xfRExMX1NVRkZJWCAiX2RsbCIpCisJICBlbmRpZigpCisKKwkgICMgRmluZCB0aGUgbWFpbiBmaWxlICgzMi1iaXQgb3IgNjQtYml0KQorCSAgc2V0KEJMQVNfU0VBUkNIX0xJQlNfV0lOX01BSU4gIiIpCisJICBpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiSW50ZWwxMF8zMiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCU19XSU5fTUFJTgorCSAgICAgICJta2xfYmxhczk1JHtCTEFTX21rbF9ETExfU1VGRklYfSBta2xfaW50ZWxfYyR7QkxBU19ta2xfRExMX1NVRkZJWH0iKQorCSAgZW5kaWYoKQorCSAgaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfNjRscCoiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisJICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlNfV0lOX01BSU4KKwkgICAgICAibWtsX2JsYXM5NV9scDY0JHtCTEFTX21rbF9ETExfU1VGRklYfSBta2xfaW50ZWxfbHA2NCR7QkxBU19ta2xfRExMX1NVRkZJWH0iKQorCSAgZW5kaWYgKCkKKworCSAgIyBBZGQgdGhyZWFkaW5nL3NlcXVlbnRpYWwgbGlicworCSAgc2V0KEJMQVNfU0VBUkNIX0xJQlNfV0lOX1RIUkVBRCAiIikKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICIqX3NlcSIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCU19XSU5fVEhSRUFECisJICAgICAgIm1rbF9zZXF1ZW50aWFsJHtCTEFTX21rbF9ETExfU1VGRklYfSIpCisJICBlbmRpZigpCisJICBpZiAoTk9UIEJMQV9WRU5ET1IgU1RSRVFVQUwgIipfc2VxIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCSAgICAjIG9sZCB2ZXJzaW9uCisJICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlNfV0lOX1RIUkVBRAorCSAgICAgICJsaWJndWlkZTQwIG1rbF9pbnRlbF90aHJlYWQke0JMQVNfbWtsX0RMTF9TVUZGSVh9IikKKwkgICAgIyBta2wgPj0gMTAuMworCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTX1dJTl9USFJFQUQKKwkgICAgICAibGliaW9tcDVtZCBta2xfaW50ZWxfdGhyZWFkJHtCTEFTX21rbF9ETExfU1VGRklYfSIpCisJICBlbmRpZigpCisKKwkgICMgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlIGFib3ZlCisJICBmb3JlYWNoIChNQUlOICR7QkxBU19TRUFSQ0hfTElCU19XSU5fTUFJTn0pCisJICAgIGZvcmVhY2ggKFRIUkVBRCAke0JMQVNfU0VBUkNIX0xJQlNfV0lOX1RIUkVBRH0pCisJICAgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCQkiJHtNQUlOfSAke1RIUkVBRH0gbWtsX2NvcmUke0JMQVNfbWtsX0RMTF9TVUZGSVh9IikKKwkgICAgZW5kZm9yZWFjaCgpCisJICBlbmRmb3JlYWNoKCkKKwllbHNlIChXSU4zMikKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzMyIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTCisJICAgICAgIm1rbF9ibGFzOTUgbWtsX2ludGVsIG1rbF9pbnRlbF90aHJlYWQgbWtsX2NvcmUgZ3VpZGUiKQorCSAgZW5kaWYgKCkKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHAiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisJICAgICMgb2xkIHZlcnNpb24KKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCSAgICAgICJta2xfYmxhczk1IG1rbF9pbnRlbF9scDY0IG1rbF9pbnRlbF90aHJlYWQgbWtsX2NvcmUgZ3VpZGUiKQorCSAgICAjIG1rbCA+PSAxMC4zCisJICAgIGlmIChDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisJICAgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCQkibWtsX2JsYXM5NV9scDY0IG1rbF9pbnRlbF9scDY0IG1rbF9pbnRlbF90aHJlYWQgbWtsX2NvcmUiKQorCSAgICBlbmRpZigpCisJICAgIGlmIChDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJHTlUiKQorCSAgICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlMKKwkJIm1rbF9ibGFzOTVfbHA2NCBta2xfaW50ZWxfbHA2NCBta2xfZ251X3RocmVhZCBta2xfY29yZSIpCisJICAgIGVuZGlmKCkKKwkgIGVuZGlmICgpCisJICBpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiSW50ZWwxMF82NGxwX3NlcSIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCSAgICAgICJta2xfaW50ZWxfbHA2NCBta2xfc2VxdWVudGlhbCBta2xfY29yZSIpCisJICAgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHBfc2VxIikKKwkgICAgICBzZXQoT01QX0xJQiAiIikKKwkgICAgZW5kaWYoKQorCSAgZW5kaWYgKCkKKwllbmRpZiAoV0lOMzIpCisKKyAgICAgIGVsc2UgKEJMQV9GOTUpCisKKwlzZXQoQkxBU19ta2xfU0VBUkNIX1NZTUJPTCBzZ2VtbSkKKwlzZXQoX0xJQlJBUklFUyBCTEFTX0xJQlJBUklFUykKKwlpZiAoV0lOMzIpCisJICBpZiAoQkxBX1NUQVRJQykKKwkgICAgc2V0KEJMQVNfbWtsX0RMTF9TVUZGSVggIiIpCisJICBlbHNlKCkKKwkgICAgc2V0KEJMQVNfbWtsX0RMTF9TVUZGSVggIl9kbGwiKQorCSAgZW5kaWYoKQorCisJICAjIEZpbmQgdGhlIG1haW4gZmlsZSAoMzItYml0IG9yIDY0LWJpdCkKKwkgIHNldChCTEFTX1NFQVJDSF9MSUJTX1dJTl9NQUlOICIiKQorCSAgaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfMzIiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisJICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlNfV0lOX01BSU4KKwkgICAgICAibWtsX2ludGVsX2Mke0JMQVNfbWtsX0RMTF9TVUZGSVh9IikKKwkgIGVuZGlmKCkKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHAqIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTX1dJTl9NQUlOCisJICAgICAgIm1rbF9pbnRlbF9scDY0JHtCTEFTX21rbF9ETExfU1VGRklYfSIpCisJICBlbmRpZiAoKQorCisJICAjIEFkZCB0aHJlYWRpbmcvc2VxdWVudGlhbCBsaWJzCisJICBzZXQoQkxBU19TRUFSQ0hfTElCU19XSU5fVEhSRUFEICIiKQorCSAgaWYgKE5PVCBCTEFfVkVORE9SIFNUUkVRVUFMICIqX3NlcSIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKwkgICAgIyBvbGQgdmVyc2lvbgorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTX1dJTl9USFJFQUQKKwkgICAgICAibGliZ3VpZGU0MCBta2xfaW50ZWxfdGhyZWFkJHtCTEFTX21rbF9ETExfU1VGRklYfSIpCisJICAgICMgbWtsID49IDEwLjMKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCU19XSU5fVEhSRUFECisJICAgICAgImxpYmlvbXA1bWQgbWtsX2ludGVsX3RocmVhZCR7QkxBU19ta2xfRExMX1NVRkZJWH0iKQorCSAgZW5kaWYoKQorCSAgaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIipfc2VxIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTX1dJTl9USFJFQUQKKwkgICAgICAibWtsX3NlcXVlbnRpYWwke0JMQVNfbWtsX0RMTF9TVUZGSVh9IikKKwkgIGVuZGlmKCkKKworCSAgIyBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aGUgYWJvdmUKKwkgIGZvcmVhY2ggKE1BSU4gJHtCTEFTX1NFQVJDSF9MSUJTX1dJTl9NQUlOfSkKKwkgICAgZm9yZWFjaCAoVEhSRUFEICR7QkxBU19TRUFSQ0hfTElCU19XSU5fVEhSRUFEfSkKKwkgICAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTCisJCSIke01BSU59ICR7VEhSRUFEfSBta2xfY29yZSR7QkxBU19ta2xfRExMX1NVRkZJWH0iKQorCSAgICBlbmRmb3JlYWNoKCkKKwkgIGVuZGZvcmVhY2goKQorCWVsc2UgKFdJTjMyKQorCSAgaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfMzIiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisJICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlMKKwkgICAgICAibWtsX2ludGVsIG1rbF9pbnRlbF90aHJlYWQgbWtsX2NvcmUgZ3VpZGUiKQorCSAgZW5kaWYgKCkKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHAiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisJICAgICMgb2xkIHZlcnNpb24KKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCSAgICAgICJta2xfaW50ZWxfbHA2NCBta2xfaW50ZWxfdGhyZWFkIG1rbF9jb3JlIGd1aWRlIikKKwkgICAgIyBta2wgPj0gMTAuMworCSAgICBpZiAoQ01BS0VfQ19DT01QSUxFUl9JRCBTVFJFUVVBTCAiSW50ZWwiKQorCSAgICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlMKKwkJIm1rbF9pbnRlbF9scDY0IG1rbF9pbnRlbF90aHJlYWQgbWtsX2NvcmUiKQorCSAgICBlbmRpZigpCisJICAgIGlmIChDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJHTlUiKQorCSAgICAgIGxpc3QoQVBQRU5EIEJMQVNfU0VBUkNIX0xJQlMKKwkJIm1rbF9pbnRlbF9scDY0IG1rbF9nbnVfdGhyZWFkIG1rbF9jb3JlIikKKwkgICAgZW5kaWYoKQorCSAgZW5kaWYgKCkKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbDEwXzY0bHBfc2VxIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTCisJICAgICAgIm1rbF9pbnRlbF9scDY0IG1rbF9zZXF1ZW50aWFsIG1rbF9jb3JlIikKKwkgICAgaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkludGVsMTBfNjRscF9zZXEiKQorCSAgICAgIHNldChPTVBfTElCICIiKQorCSAgICBlbmRpZigpCisJICBlbmRpZiAoKQorCSAgI29sZGVyIHZlc2lvbnMgb2YgaW50ZWwgbWtsIGxpYnMKKwkgIGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJbnRlbCIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCSAgICAgICJta2wiKQorCSAgICBsaXN0KEFQUEVORCBCTEFTX1NFQVJDSF9MSUJTCisJICAgICAgIm1rbF9pYTMyIikKKwkgICAgbGlzdChBUFBFTkQgQkxBU19TRUFSQ0hfTElCUworCSAgICAgICJta2xfZW02NHQiKQorCSAgZW5kaWYgKCkKKwllbmRpZiAoV0lOMzIpCisKKyAgICAgIGVuZGlmIChCTEFfRjk1KQorCisgICAgICBmb3JlYWNoIChJVCAke0JMQVNfU0VBUkNIX0xJQlN9KQorCXN0cmluZyhSRVBMQUNFICIgIiAiOyIgU0VBUkNIX0xJQlMgJHtJVH0pCisJaWYgKCR7X0xJQlJBUklFU30pCisJZWxzZSAoKQorCSAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisJICAgICR7X0xJQlJBUklFU30KKwkgICAgQkxBUworCSAgICAke0JMQVNfbWtsX1NFQVJDSF9TWU1CT0x9CisJICAgICIke2FkZGl0aW9uYWxfZmxhZ3N9IgorCSAgICAiJHtTRUFSQ0hfTElCU30iCisJICAgICIke09NUF9MSUJ9OyR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH07JHtMTX0iCisJICAgICkKKwkgIGlmKF9MSUJSQVJJRVMpCisJICAgIHNldChCTEFTX0xJTktFUl9GTEFHUyAiJHthZGRpdGlvbmFsX2ZsYWdzfSIpCisJICBlbmRpZigpCisJZW5kaWYoKQorICAgICAgZW5kZm9yZWFjaCAoKQorICAgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgICBpZigke19MSUJSQVJJRVN9KQorICAgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBNS0wgQkxBUzogZm91bmQiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgTUtMIEJMQVM6IG5vdCBmb3VuZCIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgIGVuZGlmKCkKKyAgICAgIGlmICgke19MSUJSQVJJRVN9IEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICAgICAgc2V0IChCTEFTX1ZFTkRPUl9GT1VORCAiSW50ZWwgTUtMIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZiAoX0xBTkdVQUdFU18gTUFUQ0hFUyBDIE9SIF9MQU5HVUFHRVNfIE1BVENIRVMgQ1hYKQorICBlbmRpZihOT1QgQkxBU19MSUJSQVJJRVMgT1IgQkxBX1ZFTkRPUiBNQVRDSEVTICJJbnRlbCoiKQorZW5kaWYgKEJMQV9WRU5ET1IgTUFUQ0hFUyAiSW50ZWwqIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisKK2lmIChCTEFfVkVORE9SIFNUUkVRVUFMICJHb3RvIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAjIGdvdG9ibGFzIChodHRwOi8vd3d3LnRhY2MudXRleGFzLmVkdS90YWNjLXByb2plY3RzL2dvdG9ibGFzMikKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJnb3RvMiIKKyAgICAgICIiCisgICAgICApCisgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgaWYoQkxBU19MSUJSQVJJRVMpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdvdG8gQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdvdG8gQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJHb3RvIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiR290byIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCisjIE9wZW5CbGFzCitpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiT3BlbiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgIyBvcGVuYmxhcyAoaHR0cDovL3d3dy5vcGVuYmxhcy5uZXQvKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgIm9wZW5ibGFzIgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUykKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgT3BlbiBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgT3BlbiBCTEFTOiBub3QgZm91bmQiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIk9wZW5ibGFzIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiT3BlbiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCisjIEVpZ2VuQmxhcworaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkVpZ2VuIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAjIGVpZ2VuYmxhcyAoaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSkKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJlaWdlbl9ibGFzIgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUyBBTkQgTk9UIEJMQVNfVkVORE9SX0ZPVU5EKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBFaWdlbiBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgRWlnZW4gQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgIyBlaWdlbmJsYXMgKGh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2luZGV4LnBocD90aXRsZT1NYWluX1BhZ2UpCisgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiZWlnZW5fYmxhc19zdGF0aWMiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBFaWdlbiBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgRWlnZW4gQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJFaWdlbiIpCisgIGVuZGlmKCkKKworZW5kaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkVpZ2VuIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisKK2lmIChCTEFfVkVORE9SIFNUUkVRVUFMICJBVExBUyIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgIyBCTEFTIGluIEFUTEFTIGxpYnJhcnk/IChodHRwOi8vbWF0aC1hdGxhcy5zb3VyY2Vmb3JnZS5uZXQvKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIGRnZW1tCisgICAgICAiIgorICAgICAgImY3N2JsYXM7YXRsYXMiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBBdGxhcyBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgQXRsYXMgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIkF0bGFzIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQVRMQVMiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKworIyBCTEFTIGluIFBoaVBBQ0sgbGlicmFyaWVzPyAocmVxdWlyZXMgZ2VuZXJpYyBCTEFTIGxpYiwgdG9vKQoraWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIlBoaVBBQ0siIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgInNnZW1tO2RnZW1tO2JsYXMiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQaGlQQUNLIEJMQVM6IGZvdW5kIikKKyAgICAgIGVsc2UoKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQaGlQQUNLIEJMQVM6IG5vdCBmb3VuZCIpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJQaGlQQUNLIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiUGhpUEFDSyIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCisjIEJMQVMgaW4gQWxwaGEgQ1hNTCBsaWJyYXJ5PworaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkNYTUwiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImN4bWwiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBDWE1MIEJMQVM6IGZvdW5kIikKKyAgICAgIGVsc2UoKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBDWE1MIEJMQVM6IG5vdCBmb3VuZCIpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJDWE1MIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQ1hNTCIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCisjIEJMQVMgaW4gQWxwaGEgRFhNTCBsaWJyYXJ5PyAobm93IGNhbGxlZCBDWE1MLCBzZWUgYWJvdmUpCitpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiRFhNTCIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiZHhtbCIKKyAgICAgICIiCisgICAgICApCisgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgaWYoQkxBU19MSUJSQVJJRVMpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIERYTUwgQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIERYTUwgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIkRYTUwiKQorICBlbmRpZigpCisgIAorZW5kaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkRYTUwiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKworIyBCTEFTIGluIFN1biBQZXJmb3JtYW5jZSBsaWJyYXJ5PworaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIlN1blBlcmYiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiLXhsaWNfbGliPXN1bnBlcmYiCisgICAgICAic3VucGVyZjtzdW5tYXRoIgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihCTEFTX0xJQlJBUklFUykKKyAgICAgIHNldChCTEFTX0xJTktFUl9GTEFHUyAiLXhsaWNfbGliPXN1bnBlcmYiKQorICAgIGVuZGlmKCkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUykKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgU3VuUGVyZiBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgU3VuUGVyZiBCTEFTOiBub3QgZm91bmQiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIGlmIChCTEFTX0xJQlJBUklFUyBBTkQgTk9UIEJMQVNfVkVORE9SX0ZPVU5EKQorICAgICAgc2V0IChCTEFTX1ZFTkRPUl9GT1VORCAiU3VuUGVyZiIpCisgIGVuZGlmKCkKKworZW5kaWYgKCkKKworCisjIEJMQVMgaW4gU0NTTCBsaWJyYXJ5PyAgKFNHSS9DcmF5IFNjaWVudGlmaWMgTGlicmFyeSkKK2lmIChCTEFfVkVORE9SIFNUUkVRVUFMICJTQ1NMIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJzY3NsIgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUykKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgU0NTTCBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgU0NTTCBCTEFTOiBub3QgZm91bmQiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIGlmIChCTEFTX0xJQlJBUklFUyBBTkQgTk9UIEJMQVNfVkVORE9SX0ZPVU5EKQorICAgICAgc2V0IChCTEFTX1ZFTkRPUl9GT1VORCAiU3VuUGVyZiIpCisgIGVuZGlmKCkKKworZW5kaWYgKCkKKworCisjIEJMQVMgaW4gU0dJTUFUSCBsaWJyYXJ5PworaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIlNHSU1BVEgiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImNvbXBsaWIuc2dpbWF0aCIKKyAgICAgICIiCisgICAgICApCisgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgaWYoQkxBU19MSUJSQVJJRVMpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFNHSU1BVEggQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFNHSU1BVEggQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIlNHSU1BVEgiKQorICBlbmRpZigpCisKK2VuZGlmICgpCisKKworIyBCTEFTIGluIElCTSBFU1NMIGxpYnJhcnkgKHJlcXVpcmVzIGdlbmVyaWMgQkxBUyBsaWIsIHRvbykKK2lmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJQk1FU1NMIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJlc3NsO3hsZm1hdGg7eGxmOTBfcjtibGFzIgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUykKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgSUJNIEVTU0wgQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIElCTSBFU1NMIEJMQVM6IG5vdCBmb3VuZCIpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJJQk0gRVNTTCIpCisgIGVuZGlmKCkKKworZW5kaWYgKCkKKworIyBCTEFTIGluIElCTSBFU1NMX01UIGxpYnJhcnkgKHJlcXVpcmVzIGdlbmVyaWMgQkxBUyBsaWIsIHRvbykKK2lmIChCTEFfVkVORE9SIFNUUkVRVUFMICJJQk1FU1NMTVQiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImVzc2xzbXA7eGxzbXA7eGxmbWF0aDt4bGY5MF9yO2JsYXMiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBJQk0gRVNTTCBNVCBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgSUJNIEVTU0wgTVQgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIklCTSBFU1NMIE1UIikKKyAgZW5kaWYoKQorCitlbmRpZiAoKQorCisKKyNCTEFTIGluIGFjbWwgbGlicmFyeT8KK2lmIChCTEFfVkVORE9SIE1BVENIRVMgIkFDTUwuKiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworICBpZiggKChCTEFfVkVORE9SIFNUUkVRVUFMICJBQ01MIikgQU5EIChOT1QgQkxBU19BQ01MX0xJQl9ESVJTKSkgT1IKKyAgICAgICgoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQUNNTF9NUCIpIEFORCAoTk9UIEJMQVNfQUNNTF9NUF9MSUJfRElSUykpIE9SCisgICAgICAoKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFDTUxfR1BVIikgQU5EIChOT1QgQkxBU19BQ01MX0dQVV9MSUJfRElSUykpKQorCisgICAgIyB0cnkgdG8gZmluZCBhY21sIGluICJzdGFuZGFyZCIgcGF0aHMKKyAgICBpZiggV0lOMzIgKQorICAgICAgZmlsZSggR0xPQiBfQUNNTF9ST09UICJDOi9BTUQvYWNtbCovQUNNTC1FVUxBLnR4dCIgKQorICAgIGVsc2UoKQorICAgICAgZmlsZSggR0xPQiBfQUNNTF9ST09UICIvb3B0L2FjbWwqL0FDTUwtRVVMQS50eHQiICkKKyAgICBlbmRpZigpCisgICAgaWYoIFdJTjMyICkKKyAgICAgIGZpbGUoIEdMT0IgX0FDTUxfR1BVX1JPT1QgIkM6L0FNRC9hY21sKi9HUEdQVWV4YW1wbGVzIiApCisgICAgZWxzZSgpCisgICAgICBmaWxlKCBHTE9CIF9BQ01MX0dQVV9ST09UICIvb3B0L2FjbWwqL0dQR1BVZXhhbXBsZXMiICkKKyAgICBlbmRpZigpCisgICAgbGlzdChHRVQgX0FDTUxfUk9PVCAwIF9BQ01MX1JPT1QpCisgICAgbGlzdChHRVQgX0FDTUxfR1BVX1JPT1QgMCBfQUNNTF9HUFVfUk9PVCkKKworICAgIGlmKCBfQUNNTF9ST09UICkKKworICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudCggX0FDTUxfUk9PVCAke19BQ01MX1JPT1R9IFBBVEggKQorICAgICAgaWYoIFNJWkVPRl9JTlRFR0VSIEVRVUFMIDggKQorCXNldCggX0FDTUxfUEFUSF9TVUZGSVggIl9pbnQ2NCIgKQorICAgICAgZWxzZSgpCisJc2V0KCBfQUNNTF9QQVRIX1NVRkZJWCAiIiApCisgICAgICBlbmRpZigpCisgICAgICBpZiggQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9JRCBTVFJFUVVBTCAiSW50ZWwiICkKKwlzZXQoIF9BQ01MX0NPTVBJTEVSMzIgImlmb3J0MzIiICkKKwlzZXQoIF9BQ01MX0NPTVBJTEVSNjQgImlmb3J0NjQiICkKKyAgICAgIGVsc2VpZiggQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9JRCBTVFJFUVVBTCAiU3VuUHJvIiApCisJc2V0KCBfQUNNTF9DT01QSUxFUjMyICJzdW4zMiIgKQorCXNldCggX0FDTUxfQ09NUElMRVI2NCAic3VuNjQiICkKKyAgICAgIGVsc2VpZiggQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9JRCBTVFJFUVVBTCAiUEdJIiApCisJc2V0KCBfQUNNTF9DT01QSUxFUjMyICJwZ2kzMiIgKQorCWlmKCBXSU4zMiApCisJICBzZXQoIF9BQ01MX0NPTVBJTEVSNjQgIndpbjY0IiApCisJZWxzZSgpCisJICBzZXQoIF9BQ01MX0NPTVBJTEVSNjQgInBnaTY0IiApCisJZW5kaWYoKQorICAgICAgZWxzZWlmKCBDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJPcGVuNjQiICkKKwkjIDMyIGJpdCBidWlsZHMgbm90IHN1cHBvcnRlZCBvbiBPcGVuNjQgYnV0IGZvciBjb2RlIHNpbXBsaWNpdHkKKwkjIFdlJ2xsIGp1c3QgdXNlIHRoZSBzYW1lIGRpcmVjdG9yeSB0d2ljZQorCXNldCggX0FDTUxfQ09NUElMRVIzMiAib3BlbjY0XzY0IiApCisJc2V0KCBfQUNNTF9DT01QSUxFUjY0ICJvcGVuNjRfNjQiICkKKyAgICAgIGVsc2VpZiggQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9JRCBTVFJFUVVBTCAiTkFHIiApCisJc2V0KCBfQUNNTF9DT01QSUxFUjMyICJuYWczMiIgKQorCXNldCggX0FDTUxfQ09NUElMRVI2NCAibmFnNjQiICkKKyAgICAgIGVsc2UoKQorCXNldCggX0FDTUxfQ09NUElMRVIzMiAiZ2ZvcnRyYW4zMiIgKQorCXNldCggX0FDTUxfQ09NUElMRVI2NCAiZ2ZvcnRyYW42NCIgKQorICAgICAgZW5kaWYoKQorCisgICAgICBpZiggQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQUNNTF9NUCIgKQorCXNldChfQUNNTF9NUF9MSUJfRElSUworCSAgIiR7X0FDTUxfUk9PVH0vJHtfQUNNTF9DT01QSUxFUjMyfV9tcCR7X0FDTUxfUEFUSF9TVUZGSVh9L2xpYiIKKwkgICIke19BQ01MX1JPT1R9LyR7X0FDTUxfQ09NUElMRVI2NH1fbXAke19BQ01MX1BBVEhfU1VGRklYfS9saWIiICkKKyAgICAgIGVsc2UoKQorCXNldChfQUNNTF9MSUJfRElSUworCSAgIiR7X0FDTUxfUk9PVH0vJHtfQUNNTF9DT01QSUxFUjMyfSR7X0FDTUxfUEFUSF9TVUZGSVh9L2xpYiIKKwkgICIke19BQ01MX1JPT1R9LyR7X0FDTUxfQ09NUElMRVI2NH0ke19BQ01MX1BBVEhfU1VGRklYfS9saWIiICkKKyAgICAgIGVuZGlmKCkKKworICAgIGVuZGlmKF9BQ01MX1JPT1QpCisKKyAgZWxzZWlmKEJMQVNfJHtCTEFfVkVORE9SfV9MSUJfRElSUykKKworICAgIHNldChfJHtCTEFfVkVORE9SfV9MSUJfRElSUyAke0JMQVNfJHtCTEFfVkVORE9SfV9MSUJfRElSU30pCisKKyAgZW5kaWYoKQorCisgIGlmKCBCTEFfVkVORE9SIFNUUkVRVUFMICJBQ01MX01QIiApCisgICAgZm9yZWFjaCggQkxBU19BQ01MX01QX0xJQl9ESVJTICR7X0FDTUxfTVBfTElCX0RJUlN9KQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMgKAorCUJMQVNfTElCUkFSSUVTCisJQkxBUworCXNnZW1tCisJIiIgImFjbWxfbXA7YWNtbF9tdiIgIiIgJHtCTEFTX0FDTUxfTVBfTElCX0RJUlN9CisJKQorICAgICAgaWYoIEJMQVNfTElCUkFSSUVTICkKKwlicmVhaygpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2VpZiggQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQUNNTF9HUFUiICkKKyAgICBmb3JlYWNoKCBCTEFTX0FDTUxfR1BVX0xJQl9ESVJTICR7X0FDTUxfR1BVX0xJQl9ESVJTfSkKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzICgKKwlCTEFTX0xJQlJBUklFUworCUJMQVMKKwlzZ2VtbQorCSIiICJhY21sO2FjbWxfbXY7Q0FMQkxBUyIgIiIgJHtCTEFTX0FDTUxfR1BVX0xJQl9ESVJTfQorCSkKKyAgICAgIGlmKCBCTEFTX0xJQlJBUklFUyApCisJYnJlYWsoKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICBlbHNlKCkKKyAgICBmb3JlYWNoKCBCTEFTX0FDTUxfTElCX0RJUlMgJHtfQUNNTF9MSUJfRElSU30gKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMgKAorCUJMQVNfTElCUkFSSUVTCisJQkxBUworCXNnZW1tCisJIiIgImFjbWw7YWNtbF9tdiIgIiIgJHtCTEFTX0FDTUxfTElCX0RJUlN9CisJKQorICAgICAgaWYoIEJMQVNfTElCUkFSSUVTICkKKwlicmVhaygpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKKworICAjIEVpdGhlciBhY21sIG9yIGFjbWxfbXAgc2hvdWxkIGJlIGluIExEX0xJQlJBUllfUEFUSCBidXQgbm90IGJvdGgKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImFjbWw7YWNtbF9tdiIKKyAgICAgICIiCisgICAgICApCisgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgaWYoQkxBU19MSUJSQVJJRVMpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEFDTUwgQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEFDTUwgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiYWNtbF9tcDthY21sX212IgorICAgICAgIiIKKyAgICAgICkKKyAgICBpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisgICAgICBpZihCTEFTX0xJQlJBUklFUykKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgQUNNTCBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgQUNNTCBCTEFTOiBub3QgZm91bmQiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJhY21sO2FjbWxfbXY7Q0FMQkxBUyIKKyAgICAgICIiCisgICAgICApCisgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgICAgaWYoQkxBU19MSUJSQVJJRVMpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEFDTUwgQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEFDTUwgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIkFDTUwiKQorICBlbmRpZigpCisKK2VuZGlmIChCTEFfVkVORE9SIE1BVENIRVMgIkFDTUwuKiIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikgIyBBQ01MCisKKworIyBBcHBsZSBCTEFTIGxpYnJhcnk/CitpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQXBwbGUiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIGRnZW1tCisgICAgICAiIgorICAgICAgIkFjY2VsZXJhdGUiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBBcHBsZSBCTEFTOiBmb3VuZCIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgQXBwbGUgQkxBUzogbm90IGZvdW5kIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIkFwcGxlIEFjY2VsZXJhdGUiKQorICBlbmRpZigpCisKK2VuZGlmIChCTEFfVkVORE9SIFNUUkVRVUFMICJBcHBsZSIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCitpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiTkFTIiBPUiBCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiKQorCisgIGlmICggTk9UIEJMQVNfTElCUkFSSUVTICkKKyAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBkZ2VtbQorICAgICAgIiIKKyAgICAgICJ2ZWNMaWIiCisgICAgICAiIgorICAgICAgKQorICAgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBOQVMgQkxBUzogZm91bmQiKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIE5BUyBCTEFTOiBub3QgZm91bmQiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYgKCkKKworICBpZiAoQkxBU19MSUJSQVJJRVMgQU5EIE5PVCBCTEFTX1ZFTkRPUl9GT1VORCkKKyAgICAgIHNldCAoQkxBU19WRU5ET1JfRk9VTkQgIk5BUyIpCisgIGVuZGlmKCkKKworZW5kaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIk5BUyIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCisjIEdlbmVyaWMgQkxBUyBsaWJyYXJ5PworaWYgKEJMQV9WRU5ET1IgU1RSRVFVQUwgIkdlbmVyaWMiIE9SIEJMQV9WRU5ET1IgU1RSRVFVQUwgIkFsbCIpCisKKyAgc2V0KEJMQVNfU0VBUkNIX0xJQlMgImJsYXM7Ymxhc19MSU5VWDtibGFzX01BQztibGFzX1dJTkRPV1M7cmVmYmxhcyIpCisgIGZvcmVhY2ggKFNFQVJDSF9MSUIgJHtCTEFTX1NFQVJDSF9MSUJTfSkKKyAgICBpZiAoQkxBU19MSUJSQVJJRVMpCisgICAgZWxzZSAoKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisJQkxBU19MSUJSQVJJRVMKKwlCTEFTCisJc2dlbW0KKwkiIgorCSIke1NFQVJDSF9MSUJ9IgorCSIke0xHRk9SVFJBTn0iCisJKQorICAgICAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorCWlmKEJMQVNfTElCUkFSSUVTKQorCSAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdlbmVyaWMgQkxBUzogZm91bmQiKQorCWVsc2UoKQorCSAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEdlbmVyaWMgQkxBUzogbm90IGZvdW5kIikKKwllbmRpZigpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoICgpCisKKyAgaWYgKEJMQVNfTElCUkFSSUVTIEFORCBOT1QgQkxBU19WRU5ET1JfRk9VTkQpCisgICAgICBzZXQgKEJMQVNfVkVORE9SX0ZPVU5EICJOZXRsaWIgb3Igb3RoZXIgR2VuZXJpYyBsaWJibGFzIikKKyAgZW5kaWYoKQorCitlbmRpZiAoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiR2VuZXJpYyIgT1IgQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIikKKworCitpZihCTEFfRjk1KQorCisgIGlmKEJMQVM5NV9MSUJSQVJJRVMpCisgICAgc2V0KEJMQVM5NV9GT1VORCBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoQkxBUzk1X0ZPVU5EIEZBTFNFKQorICBlbmRpZigpCisKKyAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgIGlmKEJMQVM5NV9GT1VORCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBIGxpYnJhcnkgd2l0aCBCTEFTOTUgQVBJIGZvdW5kLiIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQkxBU19MSUJSQVJJRVMgJHtCTEFTX0xJQlJBUklFU30iKQorICAgIGVsc2UoQkxBUzk1X0ZPVU5EKQorICAgICAgbWVzc2FnZShXQVJOSU5HICJCTEFfVkVORE9SIGhhcyBiZWVuIHNldCB0byAke0JMQV9WRU5ET1J9IGJ1dCBibGFzIDk1IGxpYnJhcmllcyBjb3VsZCBub3QgYmUgZm91bmQgb3IgY2hlY2sgb2Ygc3ltYm9scyBmYWlsZWQuIgorCSJcblBsZWFzZSBpbmRpY2F0ZSB3aGVyZSB0byBmaW5kIGJsYXMgbGlicmFyaWVzLiBZb3UgaGF2ZSB0aHJlZSBvcHRpb25zOlxuIgorCSItIE9wdGlvbiAxOiBQcm92aWRlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEJMQVMgbGlicmFyeSB3aXRoIGNtYWtlIG9wdGlvbjogLURCTEFTX0RJUj15b3VyL3BhdGgvdG8vYmxhc1xuIgorCSItIE9wdGlvbiAyOiBQcm92aWRlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCBCTEFTIGxpYnJhcmllcyB3aXRoIGNtYWtlIG9wdGlvbjogLURCTEFTX0xJQkRJUj15b3VyL3BhdGgvdG8vYmxhcy9saWJzXG4iCisJIi0gT3B0aW9uIDM6IFVwZGF0ZSB5b3VyIGVudmlyb25tZW50IHZhcmlhYmxlIChMaW51eDogTERfTElCUkFSWV9QQVRILCBXaW5kb3dzOiBMSUIsIE1hYzogRFlMRF9MSUJSQVJZX1BBVEgpXG4iCisJIlxuVG8gZm9sbG93IGxpYnJhcmllcyBkZXRlY3Rpb24gbW9yZSBwcmVjaXNlbHkgeW91IGNhbiBhY3RpdmF0ZSBhIHZlcmJvc2UgbW9kZSB3aXRoIC1EQkxBU19WRVJCT1NFPU9OIGF0IGNtYWtlIGNvbmZpZ3VyZS4iCisJIlxuWW91IGNvdWxkIGFsc28gc3BlY2lmeSBhIEJMQVMgdmVuZG9yIHRvIGxvb2sgZm9yIGJ5IHNldHRpbmcgLURCTEFfVkVORE9SPWJsYXNfdmVuZG9yX25hbWUuIgorCSJcbkxpc3Qgb2YgcG9zc2libGUgQkxBUyB2ZW5kb3I6IEdvdG8sIEFUTEFTIFBoaVBBQ0ssIENYTUwsIERYTUwsIFN1blBlcmYsIFNDU0wsIFNHSU1BVEgsIElCTUVTU0wsIEludGVsMTBfMzIgKGludGVsIG1rbCB2MTAgMzIgYml0KSwiCisJIkludGVsMTBfNjRscCAoaW50ZWwgbWtsIHYxMCA2NCBiaXQsIGxwIHRocmVhZCBtb2RlbCwgbHA2NCBtb2RlbCksIEludGVsMTBfNjRscF9zZXEgKGludGVsIG1rbCB2MTAgNjQgYml0LCBzZXF1ZW50aWFsIGNvZGUsIGxwNjQgbW9kZWwpLCIKKwkiSW50ZWwoIG9sZGVyIHZlcnNpb25zIG9mIG1rbCAzMiBhbmQgNjQgYml0KSwgQUNNTCwgQUNNTF9NUCwgQUNNTF9HUFUsIEFwcGxlLCBOQVMsIEdlbmVyaWMiKQorICAgICAgaWYoQkxBU19GSU5EX1JFUVVJUkVEKQorCW1lc3NhZ2UoRkFUQUxfRVJST1IKKwkgICJBIHJlcXVpcmVkIGxpYnJhcnkgd2l0aCBCTEFTOTUgQVBJIG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbi4iKQorICAgICAgZWxzZSgpCisJbWVzc2FnZShTVEFUVVMKKwkgICJBIGxpYnJhcnkgd2l0aCBCTEFTOTUgQVBJIG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbi4iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKEJMQVM5NV9GT1VORCkKKyAgZW5kaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorCisgIHNldChCTEFTX0ZPVU5EIFRSVUUpCisgIHNldChCTEFTX0xJQlJBUklFUyAiJHtCTEFTOTVfTElCUkFSSUVTfSIpCisKK2Vsc2UoQkxBX0Y5NSkKKworICBpZihCTEFTX0xJQlJBUklFUykKKyAgICBzZXQoQkxBU19GT1VORCBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoQkxBU19GT1VORCBGQUxTRSkKKyAgZW5kaWYoKQorCisgIGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKyAgICBpZihCTEFTX0ZPVU5EKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkEgbGlicmFyeSB3aXRoIEJMQVMgQVBJIGZvdW5kLiIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQkxBU19MSUJSQVJJRVMgJHtCTEFTX0xJQlJBUklFU30iKQorICAgIGVsc2UoQkxBU19GT1VORCkKKyAgICAgIG1lc3NhZ2UoV0FSTklORyAiQkxBX1ZFTkRPUiBoYXMgYmVlbiBzZXQgdG8gJHtCTEFfVkVORE9SfSBidXQgYmxhcyBsaWJyYXJpZXMgY291bGQgbm90IGJlIGZvdW5kIG9yIGNoZWNrIG9mIHN5bWJvbHMgZmFpbGVkLiIKKwkiXG5QbGVhc2UgaW5kaWNhdGUgd2hlcmUgdG8gZmluZCBibGFzIGxpYnJhcmllcy4gWW91IGhhdmUgdGhyZWUgb3B0aW9uczpcbiIKKwkiLSBPcHRpb24gMTogUHJvdmlkZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBCTEFTIGxpYnJhcnkgd2l0aCBjbWFrZSBvcHRpb246IC1EQkxBU19ESVI9eW91ci9wYXRoL3RvL2JsYXNcbiIKKwkiLSBPcHRpb24gMjogUHJvdmlkZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgQkxBUyBsaWJyYXJpZXMgd2l0aCBjbWFrZSBvcHRpb246IC1EQkxBU19MSUJESVI9eW91ci9wYXRoL3RvL2JsYXMvbGlic1xuIgorCSItIE9wdGlvbiAzOiBVcGRhdGUgeW91ciBlbnZpcm9ubWVudCB2YXJpYWJsZSAoTGludXg6IExEX0xJQlJBUllfUEFUSCwgV2luZG93czogTElCLCBNYWM6IERZTERfTElCUkFSWV9QQVRIKVxuIgorCSJcblRvIGZvbGxvdyBsaWJyYXJpZXMgZGV0ZWN0aW9uIG1vcmUgcHJlY2lzZWx5IHlvdSBjYW4gYWN0aXZhdGUgYSB2ZXJib3NlIG1vZGUgd2l0aCAtREJMQVNfVkVSQk9TRT1PTiBhdCBjbWFrZSBjb25maWd1cmUuIgorCSJcbllvdSBjb3VsZCBhbHNvIHNwZWNpZnkgYSBCTEFTIHZlbmRvciB0byBsb29rIGZvciBieSBzZXR0aW5nIC1EQkxBX1ZFTkRPUj1ibGFzX3ZlbmRvcl9uYW1lLiIKKwkiXG5MaXN0IG9mIHBvc3NpYmxlIEJMQVMgdmVuZG9yOiBHb3RvLCBBVExBUyBQaGlQQUNLLCBDWE1MLCBEWE1MLCBTdW5QZXJmLCBTQ1NMLCBTR0lNQVRILCBJQk1FU1NMLCBJbnRlbDEwXzMyIChpbnRlbCBta2wgdjEwIDMyIGJpdCksIgorCSJJbnRlbDEwXzY0bHAgKGludGVsIG1rbCB2MTAgNjQgYml0LCBscCB0aHJlYWQgbW9kZWwsIGxwNjQgbW9kZWwpLCBJbnRlbDEwXzY0bHBfc2VxIChpbnRlbCBta2wgdjEwIDY0IGJpdCwgc2VxdWVudGlhbCBjb2RlLCBscDY0IG1vZGVsKSwiCisJIkludGVsKCBvbGRlciB2ZXJzaW9ucyBvZiBta2wgMzIgYW5kIDY0IGJpdCksIEFDTUwsIEFDTUxfTVAsIEFDTUxfR1BVLCBBcHBsZSwgTkFTLCBHZW5lcmljIikKKyAgICAgIGlmKEJMQVNfRklORF9SRVFVSVJFRCkKKwltZXNzYWdlKEZBVEFMX0VSUk9SCisJICAiQSByZXF1aXJlZCBsaWJyYXJ5IHdpdGggQkxBUyBBUEkgbm90IGZvdW5kLiBQbGVhc2Ugc3BlY2lmeSBsaWJyYXJ5IGxvY2F0aW9uLiIpCisgICAgICBlbHNlKCkKKwltZXNzYWdlKFNUQVRVUworCSAgIkEgbGlicmFyeSB3aXRoIEJMQVMgQVBJIG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbi4iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKEJMQVNfRk9VTkQpCisgIGVuZGlmKE5PVCBCTEFTX0ZJTkRfUVVJRVRMWSkKKworZW5kaWYoQkxBX0Y5NSkKKworc2V0KENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAke19ibGFzX09SSUdfQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTfSkKKworaWYgKEJMQVNfRk9VTkQpCisgIGxpc3QoR0VUIEJMQVNfTElCUkFSSUVTIDAgZmlyc3RfbGliKQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KGZpcnN0X2xpYl9wYXRoICIke2ZpcnN0X2xpYn0iIFBBVEgpCisgIGlmICgke2ZpcnN0X2xpYl9wYXRofSBNQVRDSEVTICIoL2xpYigzMnw2NCk/JCl8KC9saWIvaW50ZWw2NCR8L2xpYi9pYTMyJCkiKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoL2xpYigzMnw2NCk/JCl8KC9saWIvaW50ZWw2NCR8L2xpYi9pYTMyJCkiICIiIG5vdF9jYWNoZWRfZGlyICIke2ZpcnN0X2xpYl9wYXRofSIpCisgICAgc2V0KEJMQVNfRElSX0ZPVU5EICIke25vdF9jYWNoZWRfZGlyfSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBCTEFTIGxpYnJhcnkiIEZPUkNFKQorICBlbHNlKCkKKyAgICBzZXQoQkxBU19ESVJfRk9VTkQgIiR7Zmlyc3RfbGliX3BhdGh9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEJMQVMgbGlicmFyeSIgRk9SQ0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKK21hcmtfYXNfYWR2YW5jZWQoQkxBU19ESVIpCittYXJrX2FzX2FkdmFuY2VkKEJMQVNfRElSX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEJMQVNFWFQuY21ha2UgYi9jbWFrZS9GaW5kQkxBU0VYVC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmU3ZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEJMQVNFWFQuY21ha2UKQEAgLTAsMCArMSwzODAgQEAKKyMjIworIworIyBAY29weXJpZ2h0IChjKSAyMDA5LTIwMTQgVGhlIFVuaXZlcnNpdHkgb2YgVGVubmVzc2VlIGFuZCBUaGUgVW5pdmVyc2l0eQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgVGVubmVzc2VlIFJlc2VhcmNoIEZvdW5kYXRpb24uCisjICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTYgSW5yaWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBCb3JkZWF1eCBJTlAsIENOUlMgKExhQlJJIFVNUiA1ODAwKSwgSW5yaWEsIFVuaXYuIEJvcmRlYXV4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyMjCisjCisjIC0gRmluZCBCTEFTIEVYVEVOREVEIGZvciBNT1JTRSBwcm9qZWN0czogZmluZCBpbmNsdWRlIGRpcnMgYW5kIGxpYnJhcmllcworIworIyBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gZmluZCBCTEFTIGxpYnJhcmllcyBieSBjYWxsaW5nIHRoZSBvZmZpY2lhbCBGaW5kQkxBUyBtb2R1bGUKKyMgYW5kIGhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIGRpZmZlcmVudCBsaWJyYXJ5IGxpc3RzIHdoZXRoZXIgdGhlIHVzZXIgd2lzaGVzIHRvIGxpbmsKKyMgd2l0aCBhIHNlcXVlbnRpYWwgQkxBUyBvciBhIG11bHRpaHJlYWRlZCAoQkxBU19TRVFfTElCUkFSSUVTIGFuZCBCTEFTX1BBUl9MSUJSQVJJRVMpLgorIyBCTEFTIGlzIGRldGVjdGVkIHdpdGggYSBGaW5kQkxBUyBjYWxsIHRoZW4gaWYgdGhlIEJMQVMgdmVuZG9yIGlzIEludGVsMTBfNjRscCwgQUNNTAorIyBvciBJQk1FU1NMTVQgdGhlbiB0aGUgbW9kdWxlIGF0dGVtcHRzIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXVsdGl0aHJlYWRlZCBsaWJyYXJpZXMuCisjCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGhhdmUgYmVlbiBhZGRlZCB0byBtYW5hZ2UgbGlua3Mgd2l0aCBzZXF1ZW50aWFsIG9yIG11bHRpdGhyZWFkZWQKKyMgdmVyc2lvbnM6CisjICBCTEFTX0lOQ0xVREVfRElSUyAgLSBCTEFTIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIEJMQVNfTElCUkFSWV9ESVJTICAtIExpbmsgZGlyZWN0b3JpZXMgZm9yIEJMQVMgbGlicmFyaWVzCisjICBCTEFTX1NFUV9MSUJSQVJJRVMgLSBCTEFTIGNvbXBvbmVudCBsaWJyYXJpZXMgdG8gYmUgbGlua2VkIChzZXF1ZW50aWFsKQorIyAgQkxBU19QQVJfTElCUkFSSUVTIC0gQkxBUyBjb21wb25lbnQgbGlicmFyaWVzIHRvIGJlIGxpbmtlZCAobXVsdGl0aHJlYWRlZCkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENvcHlyaWdodCAyMDEyLTIwMTMgSW5yaWEKKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBFbW1hbnVlbCBBZ3VsbG8KKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBNYXRoaWV1IEZhdmVyZ2UKKyMgQ29weXJpZ2h0IDIwMTIgICAgICBDZWRyaWMgQ2FzdGFnbmVkZQorIyBDb3B5cmlnaHQgMjAxMy0yMDE2IEZsb3JlbnQgUHJ1dm9zdAorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgT1NJLWFwcHJvdmVkIEJTRCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsKKyMgc2VlIGFjY29tcGFueWluZyBmaWxlIE1PUlNFLUNvcHlyaWdodC50eHQgZm9yIGRldGFpbHMuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUKKyMgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAoVG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3V0c2lkZSBvZiBNb3JzZSwgc3Vic3RpdHV0ZSB0aGUgZnVsbAorIyAgTGljZW5zZSB0ZXh0IGZvciB0aGUgYWJvdmUgcmVmZXJlbmNlLikKKworIyBtYWNybyB0byBmYWN0b3JpemUgdGhpcyBjYWxsCittYWNybyhmaW5kX3BhY2thZ2VfYmxhcykKKyAgaWYoQkxBU0VYVF9GSU5EX1JFUVVJUkVEKQorICAgIGlmKEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgICAgZmluZF9wYWNrYWdlKEJMQVMgUkVRVUlSRUQgUVVJRVQpCisgICAgZWxzZSgpCisgICAgICBmaW5kX3BhY2thZ2UoQkxBUyBSRVFVSVJFRCkKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIGlmKEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgICAgZmluZF9wYWNrYWdlKEJMQVMgUVVJRVQpCisgICAgZWxzZSgpCisgICAgICBmaW5kX3BhY2thZ2UoQkxBUykKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBhZGQgYSBjYWNoZSB2YXJpYWJsZSB0byBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgQkxBUyB2ZW5kb3IKK3NldChCTEFfVkVORE9SICIiIENBQ0hFIFNUUklORyAibGlzdCBvZiBwb3NzaWJsZSBCTEFTIHZlbmRvcjoKKyAgICBPcGVuLCBFaWdlbiwgR290bywgQVRMQVMgUGhpUEFDSywgQ1hNTCwgRFhNTCwgU3VuUGVyZiwgU0NTTCwgU0dJTUFUSCwgSUJNRVNTTCwgSUJNRVNTTE1ULAorICAgIEludGVsMTBfMzIgKGludGVsIG1rbCB2MTAgMzIgYml0KSwKKyAgICBJbnRlbDEwXzY0bHAgKGludGVsIG1rbCB2MTAgNjQgYml0LCBscCB0aHJlYWQgbW9kZWwsIGxwNjQgbW9kZWwpLAorICAgIEludGVsMTBfNjRscF9zZXEgKGludGVsIG1rbCB2MTAgNjQgYml0LCBzZXF1ZW50aWFsIGNvZGUsIGxwNjQgbW9kZWwpLAorICAgIEludGVsKCBvbGRlciB2ZXJzaW9ucyBvZiBta2wgMzIgYW5kIDY0IGJpdCksCisgICAgQUNNTCwgQUNNTF9NUCwgQUNNTF9HUFUsIEFwcGxlLCBOQVMsIEdlbmVyaWMiKQorCitpZihOT1QgQkxBU0VYVF9GSU5EX1FVSUVUTFkpCisgIG1lc3NhZ2UoU1RBVFVTICJJbiBGaW5kQkxBU0VYVCIpCisgIG1lc3NhZ2UoU1RBVFVTICJJZiB5b3Ugd2FudCB0byBmb3JjZSB0aGUgdXNlIG9mIG9uZSBzcGVjaWZpYyBsaWJyYXJ5LCAiCisgICAgIlxuICAgcGxlYXNlIHNwZWNpZnkgdGhlIEJMQVMgdmVuZG9yIGJ5IHNldHRpbmcgLURCTEFfVkVORE9SPWJsYXNfdmVuZG9yX25hbWUiCisgICAgIlxuICAgYXQgY21ha2UgY29uZmlndXJlLiIpCisgIG1lc3NhZ2UoU1RBVFVTICJMaXN0IG9mIHBvc3NpYmxlIEJMQVMgdmVuZG9yOiBHb3RvLCBBVExBUyBQaGlQQUNLLCBDWE1MLCAiCisgICAgIlxuICAgRFhNTCwgU3VuUGVyZiwgU0NTTCwgU0dJTUFUSCwgSUJNRVNTTCwgSUJNRVNTTE1ULCBJbnRlbDEwXzMyIChpbnRlbCBta2wgdjEwIDMyIGJpdCksIgorICAgICJcbiAgIEludGVsMTBfNjRscCAoaW50ZWwgbWtsIHYxMCA2NCBiaXQsIGxwIHRocmVhZCBtb2RlbCwgbHA2NCBtb2RlbCksIgorICAgICJcbiAgIEludGVsMTBfNjRscF9zZXEgKGludGVsIG1rbCB2MTAgNjQgYml0LCBzZXF1ZW50aWFsIGNvZGUsIGxwNjQgbW9kZWwpLCIKKyAgICAiXG4gICBJbnRlbCggb2xkZXIgdmVyc2lvbnMgb2YgbWtsIDMyIGFuZCA2NCBiaXQpLCIKKyAgICAiXG4gICBBQ01MLCBBQ01MX01QLCBBQ01MX0dQVSwgQXBwbGUsIE5BUywgR2VuZXJpYyIpCitlbmRpZigpCisKK2lmIChOT1QgQkxBU19GT1VORCkKKyAgIyBGaXJzdCB0cnkgdG8gZGV0ZWN0IHR3byBjYXNlczoKKyAgIyAxOiBvbmx5IFNFUSBsaWJzIGFyZSBoYW5kbGVkCisgICMgMjogYm90aCBTRVEgYW5kIFBBUiBsaWJzIGFyZSBoYW5kbGVkCisgIGZpbmRfcGFja2FnZV9ibGFzKCkKK2VuZGlmICgpCisKKyMgZGV0ZWN0IHRoZSBjYXNlcyB3aGVyZSBTRVEgYW5kIFBBUiBsaWJzIGFyZSBoYW5kbGVkCitpZihCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiIEFORAorICAgIChCTEFTX21rbF9jb3JlX0xJQlJBUlkgT1IgQkxBU19ta2xfY29yZV9kbGxfTElCUkFSWSkKKyAgICApCisgIHNldChCTEFfVkVORE9SICJJbnRlbCIpCisgIGlmKEJMQVNfbWtsX2ludGVsX0xJQlJBUlkpCisgICAgc2V0KEJMQV9WRU5ET1IgIkludGVsMTBfMzIiKQorICBlbmRpZigpCisgIGlmKEJMQVNfbWtsX2ludGVsX2xwNjRfTElCUkFSWSkKKyAgICBzZXQoQkxBX1ZFTkRPUiAiSW50ZWwxMF82NGxwIikKKyAgZW5kaWYoKQorICBpZihOT1QgQkxBU0VYVF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgQkxBUyBsaWJyYXJ5IGhhcyBiZWVuIGZvdW5kICgke0JMQVNfTElCUkFSSUVTfSkgYnV0IHdlIgorICAgICAgIlxuICAgaGF2ZSBhbHNvIHBvdGVudGlhbGx5IGRldGVjdGVkIHNvbWUgbXVsdGl0aHJlYWRlZCBCTEFTIGxpYnJhcmllcyBmcm9tIHRoZSBNS0wuIgorICAgICAgIlxuICAgV2UgdHJ5IHRvIGZpbmQgYm90aCBsaWJyYXJpZXMgbGlzdHMgKFNlcXVlbnRpYWwvTXVsdGl0aHJlYWRlZCkuIikKKyAgZW5kaWYoKQorICBzZXQoQkxBU19GT1VORCAiIikKK2Vsc2VpZihCTEFfVkVORE9SIFNUUkVRVUFMICJBbGwiIEFORCBCTEFTX2FjbWxfTElCUkFSWSkKKyAgc2V0KEJMQV9WRU5ET1IgIkFDTUwiKQorICBpZihOT1QgQkxBU0VYVF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgQkxBUyBsaWJyYXJ5IGhhcyBiZWVuIGZvdW5kICgke0JMQVNfTElCUkFSSUVTfSkgYnV0IHdlIgorICAgICAgIlxuICAgaGF2ZSBhbHNvIHBvdGVudGlhbGx5IGRldGVjdGVkIHNvbWUgbXVsdGl0aHJlYWRlZCBCTEFTIGxpYnJhcmllcyBmcm9tIHRoZSBBQ01MLiIKKyAgICAgICJcbiAgIFdlIHRyeSB0byBmaW5kIGJvdGggbGlicmFyaWVzIGxpc3RzIChTZXF1ZW50aWFsL011bHRpdGhyZWFkZWQpLiIpCisgIGVuZGlmKCkKKyAgc2V0KEJMQVNfRk9VTkQgIiIpCitlbHNlaWYoQkxBX1ZFTkRPUiBTVFJFUVVBTCAiQWxsIiBBTkQgQkxBU19lc3NsX0xJQlJBUlkpCisgIHNldChCTEFfVkVORE9SICJJQk1FU1NMIikKKyAgaWYoTk9UIEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJBIEJMQVMgbGlicmFyeSBoYXMgYmVlbiBmb3VuZCAoJHtCTEFTX0xJQlJBUklFU30pIGJ1dCB3ZSIKKyAgICAgICJcbiAgIGhhdmUgYWxzbyBwb3RlbnRpYWxseSBkZXRlY3RlZCBzb21lIG11bHRpdGhyZWFkZWQgQkxBUyBsaWJyYXJpZXMgZnJvbSB0aGUgRVNTTC4iCisgICAgICAiXG4gICBXZSB0cnkgdG8gZmluZCBib3RoIGxpYnJhcmllcyBsaXN0cyAoU2VxdWVudGlhbC9NdWx0aXRocmVhZGVkKS4iKQorICBlbmRpZigpCisgIHNldChCTEFTX0ZPVU5EICIiKQorZW5kaWYoKQorCisjIEludGVsIGNhc2UKK2lmKEJMQV9WRU5ET1IgTUFUQ0hFUyAiSW50ZWwqIikKKworICAjIyMKKyAgIyBsb29rIGZvciBpbmNsdWRlIHBhdGggaWYgdGhlIEJMQVMgdmVuZG9yIGlzIEludGVsCisgICMjIworCisgICMgZ2F0aGVyIHN5c3RlbSBpbmNsdWRlIHBhdGhzCisgIHVuc2V0KF9pbmNfZW52KQorICBpZihXSU4zMikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9pbmNfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgZWxzZSgpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERX0iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NfSU5DTFVERV9QQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7Q1BBVEh9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntJTkNMVURFX1BBVEh9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgZW5kaWYoKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtDTUFLRV9QTEFURk9STV9JTVBMSUNJVF9JTkNMVURFX0RJUkVDVE9SSUVTfSIpCisgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorICBzZXQoRU5WX01LTFJPT1QgIiRFTlZ7TUtMUk9PVH0iKQorICBpZiAoRU5WX01LTFJPT1QpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX01LTFJPT1R9L2luY2x1ZGUiKQorICBlbmRpZigpCisgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgX2luY19lbnYpCisKKyAgIyBmaW5kIG1rbC5oIGluc2lkZSBrbm93biBpbmNsdWRlIHBhdGhzCisgIHNldChCTEFTX21rbC5oX0lOQ0xVREVfRElSUyAiQkxBU19ta2wuaF9JTkNMVURFX0RJUlMtTk9URk9VTkQiKQorICBpZihCTEFTX0lOQ0RJUikKKyAgICBzZXQoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMgIkJMQVNfbWtsLmhfSU5DTFVERV9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMKKyAgICAgIE5BTUVTIG1rbC5oCisgICAgICBISU5UUyAke0JMQVNfSU5DRElSfSkKKyAgZWxzZSgpCisgICAgaWYoQkxBU19ESVIpCisgICAgICBzZXQoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMgIkJMQVNfbWtsLmhfSU5DTFVERV9ESVJTLU5PVEZPVU5EIikKKyAgICAgIGZpbmRfcGF0aChCTEFTX21rbC5oX0lOQ0xVREVfRElSUworCU5BTUVTIG1rbC5oCisJSElOVFMgJHtCTEFTX0RJUn0KKwlQQVRIX1NVRkZJWEVTIGluY2x1ZGUpCisgICAgZWxzZSgpCisgICAgICBzZXQoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMgIkJMQVNfbWtsLmhfSU5DTFVERV9ESVJTLU5PVEZPVU5EIikKKyAgICAgIGZpbmRfcGF0aChCTEFTX21rbC5oX0lOQ0xVREVfRElSUworCU5BTUVTIG1rbC5oCisJSElOVFMgJHtfaW5jX2Vudn0pCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIG1hcmtfYXNfYWR2YW5jZWQoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMpCisgICMjIFByaW50IHN0YXR1cyBpZiBub3QgZm91bmQKKyAgIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjaWYgKE5PVCBCTEFTX21rbC5oX0lOQ0xVREVfRElSUyBBTkQgTU9SU0VfVkVSQk9TRSkKKyAgIyAgICBQcmludF9GaW5kX0hlYWRlcl9TdGF0dXMoYmxhcyBta2wuaCkKKyAgI2VuZGlmICgpCisgIHNldChCTEFTX0lOQ0xVREVfRElSUyAiIikKKyAgaWYoQkxBU19ta2wuaF9JTkNMVURFX0RJUlMpCisgICAgbGlzdChBUFBFTkQgQkxBU19JTkNMVURFX0RJUlMgIiR7QkxBU19ta2wuaF9JTkNMVURFX0RJUlN9IiApCisgIGVuZGlmKCkKKworICAjIyMKKyAgIyBsb29rIGZvciBsaWJzCisgICMjIworICAjIGlmIEludGVsIDEwIDY0IGJpdCAtPiBsb29rIGZvciBzZXF1ZW50aWFsIGFuZCBtdWx0aXRocmVhZGVkIHZlcnNpb25zCisgIGlmKEJMQV9WRU5ET1IgTUFUQ0hFUyAiSW50ZWwxMF82NGxwKiIpCisKKyAgICAjIyBsb29rIGZvciB0aGUgc2VxdWVudGlhbCB2ZXJzaW9uCisgICAgc2V0KEJMQV9WRU5ET1IgIkludGVsMTBfNjRscF9zZXEiKQorICAgIGlmKE5PVCBCTEFTRVhUX0ZJTkRfUVVJRVRMWSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJMb29rIGZvciB0aGUgc2VxdWVudGlhbCB2ZXJzaW9uIEludGVsMTBfNjRscF9zZXEiKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2VfYmxhcygpCisgICAgaWYoQkxBU19GT1VORCkKKyAgICAgIHNldChCTEFTX1NFUV9MSUJSQVJJRVMgIiR7QkxBU19MSUJSQVJJRVN9IikKKyAgICBlbHNlKCkKKyAgICAgIHNldChCTEFTX1NFUV9MSUJSQVJJRVMgIiR7QkxBU19TRVFfTElCUkFSSUVTLU5PVEZPVU5EfSIpCisgICAgZW5kaWYoKQorCisgICAgIyMgbG9vayBmb3IgdGhlIG11bHRpdGhyZWFkZWQgdmVyc2lvbgorICAgIHNldChCTEFfVkVORE9SICJJbnRlbDEwXzY0bHAiKQorICAgIGlmKE5PVCBCTEFTRVhUX0ZJTkRfUVVJRVRMWSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJMb29rIGZvciB0aGUgbXVsdGl0aHJlYWRlZCB2ZXJzaW9uIEludGVsMTBfNjRscCIpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZV9ibGFzKCkKKyAgICBpZihCTEFTX0ZPVU5EKQorICAgICAgc2V0KEJMQVNfUEFSX0xJQlJBUklFUyAiJHtCTEFTX0xJQlJBUklFU30iKQorICAgIGVsc2UoKQorICAgICAgc2V0KEJMQVNfUEFSX0xJQlJBUklFUyAiJHtCTEFTX1BBUl9MSUJSQVJJRVMtTk9URk9VTkR9IikKKyAgICBlbmRpZigpCisKKyAgZWxzZSgpCisKKyAgICBpZihCTEFTX0ZPVU5EKQorICAgICAgc2V0KEJMQVNfU0VRX0xJQlJBUklFUyAiJHtCTEFTX0xJQlJBUklFU30iKQorICAgIGVsc2UoKQorICAgICAgc2V0KEJMQVNfU0VRX0xJQlJBUklFUyAiJHtCTEFTX1NFUV9MSUJSQVJJRVMtTk9URk9VTkR9IikKKyAgICBlbmRpZigpCisKKyAgZW5kaWYoKQorCisgICMgQUNNTCBjYXNlCitlbHNlaWYoQkxBX1ZFTkRPUiBNQVRDSEVTICJBQ01MKiIpCisKKyAgIyMgbG9vayBmb3IgdGhlIHNlcXVlbnRpYWwgdmVyc2lvbgorICBzZXQoQkxBX1ZFTkRPUiAiQUNNTCIpCisgIGZpbmRfcGFja2FnZV9ibGFzKCkKKyAgaWYoQkxBU19GT1VORCkKKyAgICBzZXQoQkxBU19TRVFfTElCUkFSSUVTICIke0JMQVNfTElCUkFSSUVTfSIpCisgIGVsc2UoKQorICAgIHNldChCTEFTX1NFUV9MSUJSQVJJRVMgIiR7QkxBU19TRVFfTElCUkFSSUVTLU5PVEZPVU5EfSIpCisgIGVuZGlmKCkKKworICAjIyBsb29rIGZvciB0aGUgbXVsdGl0aHJlYWRlZCB2ZXJzaW9uCisgIHNldChCTEFfVkVORE9SICJBQ01MX01QIikKKyAgZmluZF9wYWNrYWdlX2JsYXMoKQorICBpZihCTEFTX0ZPVU5EKQorICAgIHNldChCTEFTX1BBUl9MSUJSQVJJRVMgIiR7QkxBU19MSUJSQVJJRVN9IikKKyAgZWxzZSgpCisgICAgc2V0KEJMQVNfUEFSX0xJQlJBUklFUyAiJHtCTEFTX1BBUl9MSUJSQVJJRVMtTk9URk9VTkR9IikKKyAgZW5kaWYoKQorCisgICMgSUJNRVNTTCBjYXNlCitlbHNlaWYoQkxBX1ZFTkRPUiBNQVRDSEVTICJJQk1FU1NMKiIpCisKKyAgIyMgbG9vayBmb3IgdGhlIHNlcXVlbnRpYWwgdmVyc2lvbgorICBzZXQoQkxBX1ZFTkRPUiAiSUJNRVNTTCIpCisgIGZpbmRfcGFja2FnZV9ibGFzKCkKKyAgaWYoQkxBU19GT1VORCkKKyAgICBzZXQoQkxBU19TRVFfTElCUkFSSUVTICIke0JMQVNfTElCUkFSSUVTfSIpCisgIGVsc2UoKQorICAgIHNldChCTEFTX1NFUV9MSUJSQVJJRVMgIiR7QkxBU19TRVFfTElCUkFSSUVTLU5PVEZPVU5EfSIpCisgIGVuZGlmKCkKKworICAjIyBsb29rIGZvciB0aGUgbXVsdGl0aHJlYWRlZCB2ZXJzaW9uCisgIHNldChCTEFfVkVORE9SICJJQk1FU1NMTVQiKQorICBmaW5kX3BhY2thZ2VfYmxhcygpCisgIGlmKEJMQVNfRk9VTkQpCisgICAgc2V0KEJMQVNfUEFSX0xJQlJBUklFUyAiJHtCTEFTX0xJQlJBUklFU30iKQorICBlbHNlKCkKKyAgICBzZXQoQkxBU19QQVJfTElCUkFSSUVTICIke0JMQVNfUEFSX0xJQlJBUklFUy1OT1RGT1VORH0iKQorICBlbmRpZigpCisKK2Vsc2UoKQorCisgIGlmKEJMQVNfRk9VTkQpCisgICAgIyBkZWZpbmUgdGhlIFNFUSBsaWJzIGFzIHRoZSBCTEFTX0xJQlJBUklFUworICAgIHNldChCTEFTX1NFUV9MSUJSQVJJRVMgIiR7QkxBU19MSUJSQVJJRVN9IikKKyAgZWxzZSgpCisgICAgc2V0KEJMQVNfU0VRX0xJQlJBUklFUyAiJHtCTEFTX1NFUV9MSUJSQVJJRVMtTk9URk9VTkR9IikKKyAgZW5kaWYoKQorICBzZXQoQkxBU19QQVJfTElCUkFSSUVTICIke0JMQVNfUEFSX0xJQlJBUklFUy1OT1RGT1VORH0iKQorCitlbmRpZigpCisKKworaWYoQkxBU19TRVFfTElCUkFSSUVTKQorICBzZXQoQkxBU19MSUJSQVJJRVMgIiR7QkxBU19TRVFfTElCUkFSSUVTfSIpCitlbmRpZigpCisKKyMgZXh0cmFjdCBsaWJzIHBhdGhzCisjIHJlbWFyazogYmVjYXVzZSBpdCBpcyBub3QgZ2l2ZW4gYnkgZmluZF9wYWNrYWdlKEJMQVMpCitzZXQoQkxBU19MSUJSQVJZX0RJUlMgIiIpCitzdHJpbmcoUkVQTEFDRSAiICIgIjsiIEJMQVNfTElCUkFSSUVTICIke0JMQVNfTElCUkFSSUVTfSIpCitmb3JlYWNoKGJsYXNfbGliICR7QkxBU19MSUJSQVJJRVN9KQorICBpZiAoRVhJU1RTICIke2JsYXNfbGlifSIpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChhX2JsYXNfbGliX2RpciAiJHtibGFzX2xpYn0iIFBBVEgpCisgICAgbGlzdChBUFBFTkQgQkxBU19MSUJSQVJZX0RJUlMgIiR7YV9ibGFzX2xpYl9kaXJ9IiApCisgIGVsc2UoKQorICAgIHN0cmluZyhSRVBMQUNFICItTCIgIiIgYmxhc19saWIgIiR7Ymxhc19saWJ9IikKKyAgICBpZiAoRVhJU1RTICIke2JsYXNfbGlifSIpCisgICAgICBsaXN0KEFQUEVORCBCTEFTX0xJQlJBUllfRElSUyAiJHtibGFzX2xpYn0iICkKKyAgICBlbHNlKCkKKyAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoYV9ibGFzX2xpYl9kaXIgIiR7Ymxhc19saWJ9IiBQQVRIKQorICAgICAgaWYgKEVYSVNUUyAiJHthX2JsYXNfbGliX2Rpcn0iKQorCWxpc3QoQVBQRU5EIEJMQVNfTElCUkFSWV9ESVJTICIke2FfYmxhc19saWJfZGlyfSIgKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCitpZiAoQkxBU19MSUJSQVJZX0RJUlMpCisgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgQkxBU19MSUJSQVJZX0RJUlMpCitlbmRpZiAoKQorCisjIGNoZWNrIHRoYXQgQkxBUyBoYXMgYmVlbiBmb3VuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitpZihCTEFfVkVORE9SIE1BVENIRVMgIkludGVsKiIpCisgIGlmKEJMQV9WRU5ET1IgTUFUQ0hFUyAiSW50ZWwxMF82NGxwKiIpCisgICAgaWYoTk9UIEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkJMQVMgZm91bmQgaXMgSW50ZWwgTUtMOiIKKwkiXG4gICB3ZSBtYW5hZ2UgdHdvIGxpc3RzIG9mIGxpYnMsIG9uZSBzZXF1ZW50aWFsIGFuZCBvbmUgcGFyYWxsZWwgaWYgZm91bmQiCisJIlxuICAgKHNlZSBCTEFTX1NFUV9MSUJSQVJJRVMgYW5kIEJMQVNfUEFSX0xJQlJBUklFUykiKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkJMQVMgc2VxdWVudGlhbCBsaWJyYXJpZXMgc3RvcmVkIGluIEJMQVNfU0VRX0xJQlJBUklFUyIpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhCTEFTIERFRkFVTFRfTVNHCisgICAgICBCTEFTX1NFUV9MSUJSQVJJRVMKKyAgICAgIEJMQVNfTElCUkFSWV9ESVJTCisgICAgICBCTEFTX0lOQ0xVREVfRElSUykKKyAgICBpZihCTEFTX1BBUl9MSUJSQVJJRVMpCisgICAgICBpZihOT1QgQkxBU0VYVF9GSU5EX1FVSUVUTFkpCisJbWVzc2FnZShTVEFUVVMgIkJMQVMgcGFyYWxsZWwgbGlicmFyaWVzIHN0b3JlZCBpbiBCTEFTX1BBUl9MSUJSQVJJRVMiKQorICAgICAgZW5kaWYoKQorICAgICAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEJMQVMgREVGQVVMVF9NU0cKKwlCTEFTX1BBUl9MSUJSQVJJRVMpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBpZihOT1QgQkxBU0VYVF9GSU5EX1FVSUVUTFkpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQkxBUyBzZXF1ZW50aWFsIGxpYnJhcmllcyBzdG9yZWQgaW4gQkxBU19TRVFfTElCUkFSSUVTIikKKyAgICBlbmRpZigpCisgICAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEJMQVMgREVGQVVMVF9NU0cKKyAgICAgIEJMQVNfU0VRX0xJQlJBUklFUworICAgICAgQkxBU19MSUJSQVJZX0RJUlMKKyAgICAgIEJMQVNfSU5DTFVERV9ESVJTKQorICBlbmRpZigpCitlbHNlaWYoQkxBX1ZFTkRPUiBNQVRDSEVTICJBQ01MKiIpCisgIGlmKE5PVCBCTEFTRVhUX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiQkxBUyBmb3VuZCBpcyBBQ01MOiIKKyAgICAgICJcbiAgIHdlIG1hbmFnZSB0d28gbGlzdHMgb2YgbGlicywgb25lIHNlcXVlbnRpYWwgYW5kIG9uZSBwYXJhbGxlbCBpZiBmb3VuZCIKKyAgICAgICJcbiAgIChzZWUgQkxBU19TRVFfTElCUkFSSUVTIGFuZCBCTEFTX1BBUl9MSUJSQVJJRVMpIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiQkxBUyBzZXF1ZW50aWFsIGxpYnJhcmllcyBzdG9yZWQgaW4gQkxBU19TRVFfTElCUkFSSUVTIikKKyAgZW5kaWYoKQorICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQkxBUyBERUZBVUxUX01TRworICAgIEJMQVNfU0VRX0xJQlJBUklFUworICAgIEJMQVNfTElCUkFSWV9ESVJTKQorICBpZihCTEFTX1BBUl9MSUJSQVJJRVMpCisgICAgaWYoTk9UIEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkJMQVMgcGFyYWxsZWwgbGlicmFyaWVzIHN0b3JlZCBpbiBCTEFTX1BBUl9MSUJSQVJJRVMiKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQkxBUyBERUZBVUxUX01TRworICAgICAgQkxBU19QQVJfTElCUkFSSUVTKQorICBlbmRpZigpCitlbHNlaWYoQkxBX1ZFTkRPUiBNQVRDSEVTICJJQk1FU1NMKiIpCisgIGlmKE5PVCBCTEFTRVhUX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiQkxBUyBmb3VuZCBpcyBFU1NMOiIKKyAgICAgICJcbiAgIHdlIG1hbmFnZSB0d28gbGlzdHMgb2YgbGlicywgb25lIHNlcXVlbnRpYWwgYW5kIG9uZSBwYXJhbGxlbCBpZiBmb3VuZCIKKyAgICAgICJcbiAgIChzZWUgQkxBU19TRVFfTElCUkFSSUVTIGFuZCBCTEFTX1BBUl9MSUJSQVJJRVMpIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiQkxBUyBzZXF1ZW50aWFsIGxpYnJhcmllcyBzdG9yZWQgaW4gQkxBU19TRVFfTElCUkFSSUVTIikKKyAgZW5kaWYoKQorICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQkxBUyBERUZBVUxUX01TRworICAgIEJMQVNfU0VRX0xJQlJBUklFUworICAgIEJMQVNfTElCUkFSWV9ESVJTKQorICBpZihCTEFTX1BBUl9MSUJSQVJJRVMpCisgICAgaWYoTk9UIEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkJMQVMgcGFyYWxsZWwgbGlicmFyaWVzIHN0b3JlZCBpbiBCTEFTX1BBUl9MSUJSQVJJRVMiKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQkxBUyBERUZBVUxUX01TRworICAgICAgQkxBU19QQVJfTElCUkFSSUVTKQorICBlbmRpZigpCitlbHNlKCkKKyAgaWYoTk9UIEJMQVNFWFRfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJCTEFTIHNlcXVlbnRpYWwgbGlicmFyaWVzIHN0b3JlZCBpbiBCTEFTX1NFUV9MSUJSQVJJRVMiKQorICBlbmRpZigpCisgIGZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhCTEFTIERFRkFVTFRfTVNHCisgICAgQkxBU19TRVFfTElCUkFSSUVTCisgICAgQkxBU19MSUJSQVJZX0RJUlMpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kQ2hvbG1vZC5jbWFrZSBiL2NtYWtlL0ZpbmRDaG9sbW9kLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjM5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQ2hvbG1vZC5jbWFrZQpAQCAtMCwwICsxLDg5IEBACisjIENob2xtb2QgbGliIHVzdWFsbHkgcmVxdWlyZXMgbGlua2luZyB0byBhIGJsYXMgYW5kIGxhcGFjayBsaWJyYXJ5LgorIyBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIG1vZHVsZSB0byBmaW5kIGEgQkxBUyBhbmQgbGluayB0byBpdC4KKworaWYgKENIT0xNT0RfSU5DTFVERVMgQU5EIENIT0xNT0RfTElCUkFSSUVTKQorICBzZXQoQ0hPTE1PRF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChDSE9MTU9EX0lOQ0xVREVTIEFORCBDSE9MTU9EX0xJQlJBUklFUykKKworZmluZF9wYXRoKENIT0xNT0RfSU5DTFVERVMKKyAgTkFNRVMKKyAgY2hvbG1vZC5oCisgIFBBVEhTCisgICRFTlZ7Q0hPTE1PRERJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorICBQQVRIX1NVRkZJWEVTCisgIHN1aXRlc3BhcnNlCisgIHVmc3BhcnNlCispCisKK2ZpbmRfbGlicmFyeShDSE9MTU9EX0xJQlJBUklFUyBjaG9sbW9kIFBBVEhTICRFTlZ7Q0hPTE1PRERJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCitpZihDSE9MTU9EX0xJQlJBUklFUykKKworICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KENIT0xNT0RfTElCRElSICR7Q0hPTE1PRF9MSUJSQVJJRVN9IFBBVEgpCisKKyAgZmluZF9saWJyYXJ5KEFNRF9MSUJSQVJZIGFtZCBQQVRIUyAke0NIT0xNT0RfTElCRElSfSAkRU5We0NIT0xNT0RESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYgKEFNRF9MSUJSQVJZKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyAke0NIT0xNT0RfTElCUkFSSUVTfSAke0FNRF9MSUJSQVJZfSkKKyAgZWxzZSAoKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyBGQUxTRSkKKyAgZW5kaWYgKCkKKworZW5kaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKK2lmKENIT0xNT0RfTElCUkFSSUVTKQorCisgIGZpbmRfbGlicmFyeShDT0xBTURfTElCUkFSWSBjb2xhbWQgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChDT0xBTURfTElCUkFSWSkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgJHtDSE9MTU9EX0xJQlJBUklFU30gJHtDT0xBTURfTElCUkFSWX0pCisgIGVsc2UgKCkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgRkFMU0UpCisgIGVuZGlmICgpCisKK2VuZGlmKENIT0xNT0RfTElCUkFSSUVTKQorCitpZihDSE9MTU9EX0xJQlJBUklFUykKKworICBmaW5kX2xpYnJhcnkoQ0FNRF9MSUJSQVJZIGNhbWQgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChDQU1EX0xJQlJBUlkpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7Q0FNRF9MSUJSQVJZfSkKKyAgZWxzZSAoKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyBGQUxTRSkKKyAgZW5kaWYgKCkKKworZW5kaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKK2lmKENIT0xNT0RfTElCUkFSSUVTKQorCisgIGZpbmRfbGlicmFyeShDQ09MQU1EX0xJQlJBUlkgY2NvbGFtZCBQQVRIUyAke0NIT0xNT0RfTElCRElSfSAkRU5We0NIT0xNT0RESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYgKENDT0xBTURfTElCUkFSWSkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgJHtDSE9MTU9EX0xJQlJBUklFU30gJHtDQ09MQU1EX0xJQlJBUll9KQorICBlbHNlICgpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTIEZBTFNFKQorICBlbmRpZiAoKQorCitlbmRpZihDSE9MTU9EX0xJQlJBUklFUykKKworaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKKyAgZmluZF9saWJyYXJ5KENIT0xNT0RfTUVUSVNfTElCUkFSWSBtZXRpcyBQQVRIUyAke0NIT0xNT0RfTElCRElSfSAkRU5We0NIT0xNT0RESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYgKENIT0xNT0RfTUVUSVNfTElCUkFSWSkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgJHtDSE9MTU9EX0xJQlJBUklFU30gJHtDSE9MTU9EX01FVElTX0xJQlJBUll9KQorICBlbmRpZiAoKQorCitlbmRpZihDSE9MTU9EX0xJQlJBUklFUykKKworaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKKyAgZmluZF9saWJyYXJ5KFNVSVRFU1BBUlNFX0xJQlJBUlkgU3VpdGVTcGFyc2UgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChTVUlURVNQQVJTRV9MSUJSQVJZKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyAke0NIT0xNT0RfTElCUkFSSUVTfSAke1NVSVRFU1BBUlNFX0xJQlJBUll9KQorICBlbmRpZiAoU1VJVEVTUEFSU0VfTElCUkFSWSkKKyAgCitlbmRpZihDSE9MTU9EX0xJQlJBUklFUykKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhDSE9MTU9EIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hPTE1PRF9JTkNMVURFUyBDSE9MTU9EX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChDSE9MTU9EX0lOQ0xVREVTIENIT0xNT0RfTElCUkFSSUVTIEFNRF9MSUJSQVJZIENPTEFNRF9MSUJSQVJZIFNVSVRFU1BBUlNFX0xJQlJBUlkgQ0FNRF9MSUJSQVJZIENDT0xBTURfTElCUkFSWSBDSE9MTU9EX01FVElTX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kQ29tcHV0ZUNwcC5jbWFrZSBiL2NtYWtlL0ZpbmRDb21wdXRlQ3BwLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWJlZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQ29tcHV0ZUNwcC5jbWFrZQpAQCAtMCwwICsxLDI0NSBAQAorIy5yc3Q6CisjIEZpbmRDb21wdXRlQ3BwCisjLS0tLS0tLS0tLS0tLS0tCisjCisjICAgQ29weXJpZ2h0IDIwMTYgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorIworIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAgIHlvdSBtYXkgbm90IHVzZSB0aGVzZSBmaWxlcyBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMKKyMgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIEZpbmRDb21wdXRlQ3BwLmNtYWtlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBUb29scyBmb3IgZmluZGluZyBhbmQgYnVpbGRpbmcgd2l0aCBDb21wdXRlQ3BwLgorIworIyAgVXNlciBtdXN0IGRlZmluZSBDT01QVVRFQ1BQX1BBQ0tBR0VfUk9PVF9ESVIgcG9pbnRpbmcgdG8gdGhlIENvbXB1dGVDcHAKKyMgICBpbnN0YWxsYXRpb24uCisjCisjICBMYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0OgorIyAgICBodHRwczovL2dpdGh1Yi5jb20vY29kZXBsYXlzb2Z0d2FyZS9jb21wdXRlY3BwLXNkaworCisjIFJlcXVpcmUgQ01ha2UgdmVyc2lvbiAzLjIuMiBvciBoaWdoZXIKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjIuMikKKworIyBDaGVjayB0aGF0IGEgc3VwcG9ydGVkIGhvc3QgY29tcGlsZXIgY2FuIGJlIGZvdW5kCitpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgICAgIyBSZXF1aXJlIGF0IGxlYXN0IGdjYyA0LjgKKyAgICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDQuOCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgImhvc3QgY29tcGlsZXIgLSBOb3QgZm91bmQhIChnY2MgdmVyc2lvbiBtdXN0IGJlIGF0IGxlYXN0IDQuOCkiKQorICAgICMgUmVxdWlyZSB0aGUgR0NDIGR1YWwgQUJJIHRvIGJlIGRpc2FibGVkIGZvciA1LjEgb3IgaGlnaGVyCisgICAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0dSRUFURVIgNS4xKQorICAgICAgc2V0KENPTVBVVEVDUFBfRElTQUJMRV9HQ0NfRFVBTF9BQkkgIlRydWUiKQorICAgICAgbWVzc2FnZShTVEFUVVMKKyAgICAgICAgImhvc3QgY29tcGlsZXIgLSBnY2MgJHtDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTn0gKG5vdGUgcHJlIDUuMSBnY2MgQUJJIGVuYWJsZWQpIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJob3N0IGNvbXBpbGVyIC0gZ2NjICR7Q01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT059IikKKyAgICBlbmRpZigpCitlbHNlaWYgKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJDbGFuZyIpCisgICAgIyBSZXF1aXJlIGF0IGxlYXN0IGNsYW5nIDMuNgorICAgIGlmICgke0NNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OfSBWRVJTSU9OX0xFU1MgMy42KQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUgorICAgICAgICAiaG9zdCBjb21waWxlciAtIE5vdCBmb3VuZCEgKGNsYW5nIHZlcnNpb24gbXVzdCBiZSBhdCBsZWFzdCAzLjYpIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJob3N0IGNvbXBpbGVyIC0gY2xhbmcgJHtDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTn0iKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICBtZXNzYWdlKFdBUk5JTkcKKyAgICAiaG9zdCBjb21waWxlciAtIE5vdCBmb3VuZCEgKENvbXB1dGVDcHAgc3VwcG9ydHMgR0NDIGFuZCBDbGFuZywgc2VlIHJlYWRtZSkiKQorZW5kaWYoKQorCitzZXQoQ09NUFVURUNQUF82NF9CSVRfREVGQVVMVCBPTikKK29wdGlvbihDT01QVVRFQ1BQXzY0X0JJVF9DT0RFICJDb21waWxlIGRldmljZSBjb2RlIGluIDY0IGJpdCBtb2RlIgorICAgICAgICAke0NPTVBVVEVDUFBfNjRfQklUX0RFRkFVTFR9KQorbWFya19hc19hZHZhbmNlZChDT01QVVRFQ1BQXzY0X0JJVF9DT0RFKQorCisjIEZpbmQgT3BlbkNMIHBhY2thZ2UKK2ZpbmRfcGFja2FnZShPcGVuQ0wgUkVRVUlSRUQpCisKKyMgRmluZCBDb21wdXRlQ3BwIHBhY2thZ2VlCitpZihOT1QgQ09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SCisgICAgIkNvbXB1dGVDcHAgcGFja2FnZSAtIE5vdCBmb3VuZCEgKHBsZWFzZSBzZXQgQ09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSIikKK2Vsc2UoKQorICBtZXNzYWdlKFNUQVRVUyAiQ29tcHV0ZUNwcCBwYWNrYWdlIC0gRm91bmQiKQorZW5kaWYoKQorb3B0aW9uKENPTVBVVEVDUFBfUEFDS0FHRV9ST09UX0RJUiAiUGF0aCB0byB0aGUgQ29tcHV0ZUNwcCBQYWNrYWdlIikKKworIyBPYnRhaW4gdGhlIHBhdGggdG8gY29tcHV0ZSsrCitmaW5kX3Byb2dyYW0oQ09NUFVURUNQUF9ERVZJQ0VfQ09NUElMRVIgY29tcHV0ZSsrIFBBVEhTCisgICR7Q09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSfSBQQVRIX1NVRkZJWEVTIGJpbikKK2lmIChFWElTVFMgJHtDT01QVVRFQ1BQX0RFVklDRV9DT01QSUxFUn0pCisgIG1hcmtfYXNfYWR2YW5jZWQoQ09NUFVURUNQUF9ERVZJQ0VfQ09NUElMRVIpCisgIG1lc3NhZ2UoU1RBVFVTICJjb21wdXRlKysgLSBGb3VuZCIpCitlbHNlKCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiY29tcHV0ZSsrIC0gTm90IGZvdW5kISAoJHtDT01QVVRFQ1BQX0RFVklDRV9DT01QSUxFUn0pIikKK2VuZGlmKCkKKworIyBPYnRhaW4gdGhlIHBhdGggdG8gY29tcHV0ZWNwcF9pbmZvCitmaW5kX3Byb2dyYW0oQ09NUFVURUNQUF9JTkZPX1RPT0wgY29tcHV0ZWNwcF9pbmZvIFBBVEhTCisgICR7Q09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSfSBQQVRIX1NVRkZJWEVTIGJpbikKK2lmIChFWElTVFMgJHtDT01QVVRFQ1BQX0lORk9fVE9PTH0pCisgIG1hcmtfYXNfYWR2YW5jZWQoJHtDT01QVVRFQ1BQX0lORk9fVE9PTH0pCisgIG1lc3NhZ2UoU1RBVFVTICJjb21wdXRlY3BwX2luZm8gLSBGb3VuZCIpCitlbHNlKCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiY29tcHV0ZWNwcF9pbmZvIC0gTm90IGZvdW5kISAoJHtDT01QVVRFQ1BQX0lORk9fVE9PTH0pIikKK2VuZGlmKCkKKworIyBPYnRhaW4gdGhlIHBhdGggdG8gdGhlIENvbXB1dGVDcHAgcnVudGltZSBsaWJyYXJ5CitmaW5kX2xpYnJhcnkoQ09NUFVURUNQUF9SVU5USU1FX0xJQlJBUlkgQ29tcHV0ZUNwcCBQQVRIUyAke0NPTVBVVEVDUFBfUEFDS0FHRV9ST09UX0RJUn0KKyAgSElOVFMgJHtDT01QVVRFQ1BQX1BBQ0tBR0VfUk9PVF9ESVJ9L2xpYiBQQVRIX1NVRkZJWEVTIGxpYgorICBET0MgIkNvbXB1dGVDcHAgUnVudGltZSBMaWJyYXJ5IiBOT19ERUZBVUxUX1BBVEgpCisKK2lmIChFWElTVFMgJHtDT01QVVRFQ1BQX1JVTlRJTUVfTElCUkFSWX0pCisgIG1hcmtfYXNfYWR2YW5jZWQoQ09NUFVURUNQUF9SVU5USU1FX0xJQlJBUlkpCisgIG1lc3NhZ2UoU1RBVFVTICJsaWJDb21wdXRlQ3BwLnNvIC0gRm91bmQiKQorZWxzZSgpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImxpYkNvbXB1dGVDcHAuc28gLSBOb3QgZm91bmQhIikKK2VuZGlmKCkKKworIyBPYnRhaW4gdGhlIENvbXB1dGVDcHAgaW5jbHVkZSBkaXJlY3RvcnkKK3NldChDT01QVVRFQ1BQX0lOQ0xVREVfRElSRUNUT1JZICR7Q09NUFVURUNQUF9QQUNLQUdFX1JPT1RfRElSfS9pbmNsdWRlLykKK2lmIChOT1QgRVhJU1RTICR7Q09NUFVURUNQUF9JTkNMVURFX0RJUkVDVE9SWX0pCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvbXB1dGVDcHAgaW5jbHVkZXMgLSBOb3QgZm91bmQhIikKK2Vsc2UoKQorICBtZXNzYWdlKFNUQVRVUyAiQ29tcHV0ZUNwcCBpbmNsdWRlcyAtIEZvdW5kIikKK2VuZGlmKCkKKworIyBPYnRhaW4gdGhlIHBhY2thZ2UgdmVyc2lvbgorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDT01QVVRFQ1BQX0lORk9fVE9PTH0gIi0tZHVtcC12ZXJzaW9uIgorICBPVVRQVVRfVkFSSUFCTEUgQ09NUFVURUNQUF9QQUNLQUdFX1ZFUlNJT04KKyAgUkVTVUxUX1ZBUklBQkxFIENPTVBVVEVDUFBfSU5GT19UT09MX1JFU1VMVCBPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRSkKK2lmKE5PVCBDT01QVVRFQ1BQX0lORk9fVE9PTF9SRVNVTFQgRVFVQUwgIjAiKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQYWNrYWdlIHZlcnNpb24gLSBFcnJvciBvYnRhaW5pbmcgdmVyc2lvbiEiKQorZWxzZSgpCisgIG1hcmtfYXNfYWR2YW5jZWQoQ09NUFVURUNQUF9QQUNLQUdFX1ZFUlNJT04pCisgIG1lc3NhZ2UoU1RBVFVTICJQYWNrYWdlIHZlcnNpb24gLSAke0NPTVBVVEVDUFBfUEFDS0FHRV9WRVJTSU9OfSIpCitlbmRpZigpCisKKyMgT2J0YWluIHRoZSBkZXZpY2UgY29tcGlsZXIgZmxhZ3MKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q09NUFVURUNQUF9JTkZPX1RPT0x9ICItLWR1bXAtZGV2aWNlLWNvbXBpbGVyLWZsYWdzIgorICBPVVRQVVRfVkFSSUFCTEUgQ09NUFVURUNQUF9ERVZJQ0VfQ09NUElMRVJfRkxBR1MKKyAgUkVTVUxUX1ZBUklBQkxFIENPTVBVVEVDUFBfSU5GT19UT09MX1JFU1VMVCBPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRSkKK2lmKE5PVCBDT01QVVRFQ1BQX0lORk9fVE9PTF9SRVNVTFQgRVFVQUwgIjAiKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJjb21wdXRlKysgZmxhZ3MgLSBFcnJvciBvYnRhaW5pbmcgY29tcHV0ZSsrIGZsYWdzISIpCitlbHNlKCkKKyAgbWFya19hc19hZHZhbmNlZChDT01QVVRFQ1BQX0NPTVBJTEVSX0ZMQUdTKQorICBtZXNzYWdlKFNUQVRVUyAiY29tcHV0ZSsrIGZsYWdzIC0gJHtDT01QVVRFQ1BQX0RFVklDRV9DT01QSUxFUl9GTEFHU30iKQorZW5kaWYoKQorCitzZXQoQ09NUFVURUNQUF9ERVZJQ0VfQ09NUElMRVJfRkxBR1MgJHtDT01QVVRFQ1BQX0RFVklDRV9DT01QSUxFUl9GTEFHU30gLXN5Y2wtY29tcHJlc3MtbmFtZSAtbm8tc2VyaWFsLW1lbW9wIC1ERUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HPTEpCisKKyMgQ2hlY2sgaWYgdGhlIHBsYXRmb3JtIGlzIHN1cHBvcnRlZAorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDT01QVVRFQ1BQX0lORk9fVE9PTH0gIi0tZHVtcC1pcy1zdXBwb3J0ZWQiCisgIE9VVFBVVF9WQVJJQUJMRSBDT01QVVRFQ1BQX1BMQVRGT1JNX0lTX1NVUFBPUlRFRAorICBSRVNVTFRfVkFSSUFCTEUgQ09NUFVURUNQUF9JTkZPX1RPT0xfUkVTVUxUIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQoraWYoTk9UIENPTVBVVEVDUFBfSU5GT19UT09MX1JFU1VMVCBFUVVBTCAiMCIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgInBsYXRmb3JtIC0gRXJyb3IgY2hlY2tpbmcgcGxhdGZvcm0gc3VwcG9ydCEiKQorZWxzZSgpCisgIG1hcmtfYXNfYWR2YW5jZWQoQ09NUFVURUNQUF9QTEFURk9STV9JU19TVVBQT1JURUQpCisgIGlmIChDT01QVVRFQ1BQX1BMQVRGT1JNX0lTX1NVUFBPUlRFRCkKKyAgICBtZXNzYWdlKFNUQVRVUyAicGxhdGZvcm0gLSB5b3VyIHN5c3RlbSBjYW4gc3VwcG9ydCBDb21wdXRlQ3BwIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgInBsYXRmb3JtIC0geW91ciBzeXN0ZW0gQ0FOTk9UIHN1cHBvcnQgQ29tcHV0ZUNwcCIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICBfX2J1aWxkX3N5Y2wKKyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBBZGRzIGEgY3VzdG9tIHRhcmdldCBmb3IgcnVubmluZyBjb21wdXRlKysgYW5kIGFkZGluZyBhIGRlcGVuZGVuY3kgZm9yIHRoZQorIyAgcmVzdWx0aW5nIGludGVncmF0aW9uIGhlYWRlci4KKyMKKyMgIHRhcmdldE5hbWUgOiBOYW1lIG9mIHRoZSB0YXJnZXQuCisjICBzb3VyY2VGaWxlIDogU291cmNlIGZpbGUgdG8gYmUgY29tcGlsZWQuCisjICBiaW5hcnlEaXIgOiBJbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHRvIG91dHB1dCB0aGUgaW50ZWdyYXRpb24gaGVhZGVyLgorIworZnVuY3Rpb24oX19idWlsZF9zcGlyIHRhcmdldE5hbWUgc291cmNlRmlsZSBiaW5hcnlEaXIpCisKKyAgIyBSZXRyaWV2ZSBzb3VyY2UgZmlsZSBuYW1lLgorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KHNvdXJjZUZpbGVOYW1lICR7c291cmNlRmlsZX0gTkFNRSkKKworICAjIFNldCB0aGUgcGF0aCB0byB0aGUgU3ljbCBmaWxlLgorICBzZXQob3V0cHV0U3ljbEZpbGUgJHtiaW5hcnlEaXJ9LyR7c291cmNlRmlsZU5hbWV9LnN5Y2wpCisKKyAgIyBBZGQgYW55IHVzZXItZGVmaW5lZCBpbmNsdWRlIHRvIHRoZSBkZXZpY2UgY29tcGlsZXIKKyAgZ2V0X3Byb3BlcnR5KGluY2x1ZGVEaXJlY3RvcmllcyBESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IFBST1BFUlRZCisgICAgSU5DTFVERV9ESVJFQ1RPUklFUykKKyAgc2V0KGRldmljZV9jb21waWxlcl9pbmNsdWRlcyAiIikKKyAgZm9yZWFjaChkaXJlY3RvcnkgJHtpbmNsdWRlRGlyZWN0b3JpZXN9KQorICAgIHNldChkZXZpY2VfY29tcGlsZXJfaW5jbHVkZXMgIi1JJHtkaXJlY3Rvcnl9IiAke2RldmljZV9jb21waWxlcl9pbmNsdWRlc30pCisgIGVuZGZvcmVhY2goKQorICBpZiAoQ01BS0VfSU5DTFVERV9QQVRIKQorICAgIGZvcmVhY2goZGlyZWN0b3J5ICR7Q01BS0VfSU5DTFVERV9QQVRIfSkKKyAgICAgIHNldChkZXZpY2VfY29tcGlsZXJfaW5jbHVkZXMgIi1JJHtkaXJlY3Rvcnl9IgorICAgICAgICAke2RldmljZV9jb21waWxlcl9pbmNsdWRlc30pCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKKworICAjIENvbnZlcnQgYXJndW1lbnQgbGlzdCBmb3JtYXQKKyAgc2VwYXJhdGVfYXJndW1lbnRzKENPTVBVVEVDUFBfREVWSUNFX0NPTVBJTEVSX0ZMQUdTKQorCisgICMgQWRkIGN1c3RvbSBjb21tYW5kIGZvciBydW5uaW5nIGNvbXB1dGUrKworICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7b3V0cHV0U3ljbEZpbGV9CisgICAgQ09NTUFORCAke0NPTVBVVEVDUFBfREVWSUNFX0NPTVBJTEVSfQorICAgICAgICAgICAgJHtDT01QVVRFQ1BQX0RFVklDRV9DT01QSUxFUl9GTEFHU30KKyAgICAgICAgICAgIC1pc3lzdGVtICR7Q09NUFVURUNQUF9JTkNMVURFX0RJUkVDVE9SWX0KKyAgICAgICAgICAgICR7Q09NUFVURUNQUF9QTEFURk9STV9TUEVDSUZJQ19BUkdTfQorICAgICAgICAgICAgJHtkZXZpY2VfY29tcGlsZXJfaW5jbHVkZXN9CisgICAgICAgICAgICAtbyAke291dHB1dFN5Y2xGaWxlfQorICAgICAgICAgICAgLWMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7c291cmNlRmlsZX0KKyAgICBERVBFTkRTICR7c291cmNlRmlsZX0KKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke2JpbmFyeURpcn0KKyAgQ09NTUVOVCAiQnVpbGRpbmcgQ29tcHV0ZUNwcCBpbnRlZ3JhdGlvbiBoZWFkZXIgZmlsZSAke291dHB1dFN5Y2xGaWxlfSIpCisKKyAgIyBBZGQgYSBjdXN0b20gdGFyZ2V0IGZvciB0aGUgZ2VuZXJhdGVkIGludGVncmF0aW9uIGhlYWRlcgorICBhZGRfY3VzdG9tX3RhcmdldCgke3RhcmdldE5hbWV9X2ludGVncmF0aW9uX2hlYWRlciBERVBFTkRTICR7b3V0cHV0U3ljbEZpbGV9KQorCisgICMgQWRkIGEgZGVwZW5kZW5jeSBvbiB0aGUgaW50ZWdyYXRpb24gaGVhZGVyCisgIGFkZF9kZXBlbmRlbmNpZXMoJHt0YXJnZXROYW1lfSAke3RhcmdldE5hbWV9X2ludGVncmF0aW9uX2hlYWRlcikKKworICAjIFNldCB0aGUgaG9zdCBjb21waWxlciBDKysgc3RhbmRhcmQgdG8gQysrMTEKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCAke3RhcmdldE5hbWV9IFBST1BFUlRZIENYWF9TVEFOREFSRCAxMSkKKworICAjIERpc2FibGUgR0NDIGR1YWwgQUJJIG9uIEdDQyA1LjEgYW5kIGhpZ2hlcgorICBpZihDT01QVVRFQ1BQX0RJU0FCTEVfR0NDX0RVQUxfQUJJKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgJHt0YXJnZXROYW1lfSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUworICAgICAgIl9HTElCQ1hYX1VTRV9DWFgxMV9BQkk9MCIpCisgIGVuZGlmKCkKKworZW5kZnVuY3Rpb24oKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgYWRkX3N5Y2xfdG9fdGFyZ2V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQWRkcyBhIFNZQ0wgY29tcGlsYXRpb24gY3VzdG9tIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nCisjICB0YXJnZXQgYW5kIHNldHMgYSBkZXBlbmRhbmN5IG9uIHRoYXQgbmV3IGNvbW1hbmQuCisjCisjICB0YXJnZXROYW1lIDogTmFtZSBvZiB0aGUgdGFyZ2V0IHRvIGFkZCBhIFNZQ0wgdG8uCisjICBzb3VyY2VGaWxlIDogU291cmNlIGZpbGUgdG8gYmUgY29tcGlsZWQgZm9yIFNZQ0wuCisjICBiaW5hcnlEaXIgOiBJbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHRvIG91dHB1dCB0aGUgaW50ZWdyYXRpb24gaGVhZGVyLgorIworZnVuY3Rpb24oYWRkX3N5Y2xfdG9fdGFyZ2V0IHRhcmdldE5hbWUgc291cmNlRmlsZSBiaW5hcnlEaXIpCisKKyAgIyBBZGQgY3VzdG9tIHRhcmdldCB0byBydW4gY29tcHV0ZSsrIGFuZCBnZW5lcmF0ZSB0aGUgaW50ZWdyYXRpb24gaGVhZGVyCisgIF9fYnVpbGRfc3Bpcigke3RhcmdldE5hbWV9ICR7c291cmNlRmlsZX0gJHtiaW5hcnlEaXJ9KQorCisgICMgTGluayB3aXRoIHRoZSBDb21wdXRlQ3BwIHJ1bnRpbWUgbGlicmFyeQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXROYW1lfSBQVUJMSUMgJHtDT01QVVRFQ1BQX1JVTlRJTUVfTElCUkFSWX0KKyAgICAgICAgICAgICAgICAgICAgICAgIFBVQkxJQyAke09wZW5DTF9MSUJSQVJJRVN9KQorCitlbmRmdW5jdGlvbihhZGRfc3ljbF90b190YXJnZXQpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kRWlnZW4yLmNtYWtlIGIvY21ha2UvRmluZEVpZ2VuMi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM0Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEVpZ2VuMi5jbWFrZQpAQCAtMCwwICsxLDgwIEBACisjIC0gVHJ5IHRvIGZpbmQgRWlnZW4yIGxpYgorIworIyBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZXF1aXJpbmcgYSBtaW5pbXVtIHZlcnNpb24sIGUuZy4geW91IGNhbiBkbworIyAgIGZpbmRfcGFja2FnZShFaWdlbjIgMi4wLjMpCisjIHRvIHJlcXVpcmUgdmVyc2lvbiAyLjAuMyB0byBuZXdlciBvZiBFaWdlbjIuCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBFSUdFTjJfRk9VTkQgLSBzeXN0ZW0gaGFzIGVpZ2VuIGxpYiB3aXRoIGNvcnJlY3QgdmVyc2lvbgorIyAgRUlHRU4yX0lOQ0xVREVfRElSIC0gdGhlIGVpZ2VuIGluY2x1ZGUgZGlyZWN0b3J5CisjICBFSUdFTjJfVkVSU0lPTiAtIGVpZ2VuIHZlcnNpb24KKworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTW9udGVsIExhdXJlbnQsIDxtb250ZWxAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCwgPGcuZ2FlbEBmcmVlLmZyPgorIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisKK2lmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OKQorICBpZihOT1QgRWlnZW4yX0ZJTkRfVkVSU0lPTl9NQUpPUikKKyAgICBzZXQoRWlnZW4yX0ZJTkRfVkVSU0lPTl9NQUpPUiAyKQorICBlbmRpZihOT1QgRWlnZW4yX0ZJTkRfVkVSU0lPTl9NQUpPUikKKyAgaWYoTk9UIEVpZ2VuMl9GSU5EX1ZFUlNJT05fTUlOT1IpCisgICAgc2V0KEVpZ2VuMl9GSU5EX1ZFUlNJT05fTUlOT1IgMCkKKyAgZW5kaWYoTk9UIEVpZ2VuMl9GSU5EX1ZFUlNJT05fTUlOT1IpCisgIGlmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OX1BBVENIKQorICAgIHNldChFaWdlbjJfRklORF9WRVJTSU9OX1BBVENIIDApCisgIGVuZGlmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OX1BBVENIKQorCisgIHNldChFaWdlbjJfRklORF9WRVJTSU9OICIke0VpZ2VuMl9GSU5EX1ZFUlNJT05fTUFKT1J9LiR7RWlnZW4yX0ZJTkRfVkVSU0lPTl9NSU5PUn0uJHtFaWdlbjJfRklORF9WRVJTSU9OX1BBVENIfSIpCitlbmRpZihOT1QgRWlnZW4yX0ZJTkRfVkVSU0lPTikKKworbWFjcm8oX2VpZ2VuMl9jaGVja192ZXJzaW9uKQorICBmaWxlKFJFQUQgIiR7RUlHRU4yX0lOQ0xVREVfRElSfS9FaWdlbi9zcmMvQ29yZS91dGlsL01hY3Jvcy5oIiBfZWlnZW4yX3ZlcnNpb25faGVhZGVyKQorCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fV09STERfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW4yX3dvcmxkX3ZlcnNpb25fbWF0Y2ggIiR7X2VpZ2VuMl92ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoRUlHRU4yX1dPUkxEX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK0VJR0VOX01BSk9SX1ZFUlNJT05bIFx0XSsoWzAtOV0rKSIgX2VpZ2VuMl9tYWpvcl92ZXJzaW9uX21hdGNoICIke19laWdlbjJfdmVyc2lvbl9oZWFkZXJ9IikKKyAgc2V0KEVJR0VOMl9NQUpPUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9NSU5PUl9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbjJfbWlub3JfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW4yX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChFSUdFTjJfTUlOT1JfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisKKyAgc2V0KEVJR0VOMl9WRVJTSU9OICR7RUlHRU4yX1dPUkxEX1ZFUlNJT059LiR7RUlHRU4yX01BSk9SX1ZFUlNJT059LiR7RUlHRU4yX01JTk9SX1ZFUlNJT059KQorICBpZigoJHtFSUdFTjJfV09STERfVkVSU0lPTn0gTk9URVFVQUwgMikgT1IgKCR7RUlHRU4yX01BSk9SX1ZFUlNJT059IEdSRUFURVIgMTApIE9SICgke0VJR0VOMl9WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtFaWdlbjJfRklORF9WRVJTSU9OfSkpCisgICAgc2V0KEVJR0VOMl9WRVJTSU9OX09LIEZBTFNFKQorICBlbHNlKCkKKyAgICBzZXQoRUlHRU4yX1ZFUlNJT05fT0sgVFJVRSkKKyAgZW5kaWYoKQorCisgIGlmKE5PVCBFSUdFTjJfVkVSU0lPTl9PSykKKworICAgIG1lc3NhZ2UoU1RBVFVTICJFaWdlbjIgdmVyc2lvbiAke0VJR0VOMl9WRVJTSU9OfSBmb3VuZCBpbiAke0VJR0VOMl9JTkNMVURFX0RJUn0sICIKKyAgICAgICAgICAgICAgICAgICAiYnV0IGF0IGxlYXN0IHZlcnNpb24gJHtFaWdlbjJfRklORF9WRVJTSU9OfSBpcyByZXF1aXJlZCIpCisgIGVuZGlmKE5PVCBFSUdFTjJfVkVSU0lPTl9PSykKK2VuZG1hY3JvKF9laWdlbjJfY2hlY2tfdmVyc2lvbikKKworaWYgKEVJR0VOMl9JTkNMVURFX0RJUikKKworICAjIGluIGNhY2hlIGFscmVhZHkKKyAgX2VpZ2VuMl9jaGVja192ZXJzaW9uKCkKKyAgc2V0KEVJR0VOMl9GT1VORCAke0VJR0VOMl9WRVJTSU9OX09LfSkKKworZWxzZSAoRUlHRU4yX0lOQ0xVREVfRElSKQorCitmaW5kX3BhdGgoRUlHRU4yX0lOQ0xVREVfRElSIE5BTUVTIEVpZ2VuL0NvcmUKKyAgICAgUEFUSFMKKyAgICAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorICAgICAke0tERTRfSU5DTFVERV9ESVJ9CisgICAgIFBBVEhfU1VGRklYRVMgZWlnZW4yCisgICApCisKK2lmKEVJR0VOMl9JTkNMVURFX0RJUikKKyAgX2VpZ2VuMl9jaGVja192ZXJzaW9uKCkKK2VuZGlmKEVJR0VOMl9JTkNMVURFX0RJUikKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhFaWdlbjIgREVGQVVMVF9NU0cgRUlHRU4yX0lOQ0xVREVfRElSIEVJR0VOMl9WRVJTSU9OX09LKQorCittYXJrX2FzX2FkdmFuY2VkKEVJR0VOMl9JTkNMVURFX0RJUikKKworZW5kaWYoRUlHRU4yX0lOQ0xVREVfRElSKQorCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kRWlnZW4zLmNtYWtlIGIvY21ha2UvRmluZEVpZ2VuMy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk2OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEVpZ2VuMy5jbWFrZQpAQCAtMCwwICsxLDk3IEBACisjIC0gVHJ5IHRvIGZpbmQgRWlnZW4zIGxpYgorIworIyBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZXF1aXJpbmcgYSBtaW5pbXVtIHZlcnNpb24sIGUuZy4geW91IGNhbiBkbworIyAgIGZpbmRfcGFja2FnZShFaWdlbjMgMy4xLjIpCisjIHRvIHJlcXVpcmUgdmVyc2lvbiAzLjEuMiBvciBuZXdlciBvZiBFaWdlbjMuCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBFSUdFTjNfRk9VTkQgLSBzeXN0ZW0gaGFzIGVpZ2VuIGxpYiB3aXRoIGNvcnJlY3QgdmVyc2lvbgorIyAgRUlHRU4zX0lOQ0xVREVfRElSIC0gdGhlIGVpZ2VuIGluY2x1ZGUgZGlyZWN0b3J5CisjICBFSUdFTjNfVkVSU0lPTiAtIGVpZ2VuIHZlcnNpb24KKyMKKyMgVGhpcyBtb2R1bGUgcmVhZHMgaGludHMgYWJvdXQgc2VhcmNoIGxvY2F0aW9ucyBmcm9tIAorIyB0aGUgZm9sbG93aW5nIGVudmlyb21lbnQgdmFyaWFibGVzOgorIworIyBFSUdFTjNfUk9PVAorIyBFSUdFTjNfUk9PVF9ESVIKKworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTW9udGVsIExhdXJlbnQsIDxtb250ZWxAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCwgPGcuZ2FlbEBmcmVlLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSAyLWNsYXVzZSBCU0QgbGljZW5zZS4KKworaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT04pCisgIGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SKQorICAgIHNldChFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SIDIpCisgIGVuZGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX01BSk9SKQorICBpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgICBzZXQoRWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUiA5MSkKKyAgZW5kaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fTUlOT1IpCisgIGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIKQorICAgIHNldChFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIIDApCisgIGVuZGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIKQorCisgIHNldChFaWdlbjNfRklORF9WRVJTSU9OICIke0VpZ2VuM19GSU5EX1ZFUlNJT05fTUFKT1J9LiR7RWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUn0uJHtFaWdlbjNfRklORF9WRVJTSU9OX1BBVENIfSIpCitlbmRpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTikKKworbWFjcm8oX2VpZ2VuM19jaGVja192ZXJzaW9uKQorICBmaWxlKFJFQUQgIiR7RUlHRU4zX0lOQ0xVREVfRElSfS9FaWdlbi9zcmMvQ29yZS91dGlsL01hY3Jvcy5oIiBfZWlnZW4zX3ZlcnNpb25faGVhZGVyKQorCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fV09STERfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW4zX3dvcmxkX3ZlcnNpb25fbWF0Y2ggIiR7X2VpZ2VuM192ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoRUlHRU4zX1dPUkxEX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK0VJR0VOX01BSk9SX1ZFUlNJT05bIFx0XSsoWzAtOV0rKSIgX2VpZ2VuM19tYWpvcl92ZXJzaW9uX21hdGNoICIke19laWdlbjNfdmVyc2lvbl9oZWFkZXJ9IikKKyAgc2V0KEVJR0VOM19NQUpPUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9NSU5PUl9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbjNfbWlub3JfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW4zX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChFSUdFTjNfTUlOT1JfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisKKyAgc2V0KEVJR0VOM19WRVJTSU9OICR7RUlHRU4zX1dPUkxEX1ZFUlNJT059LiR7RUlHRU4zX01BSk9SX1ZFUlNJT059LiR7RUlHRU4zX01JTk9SX1ZFUlNJT059KQorICBpZigke0VJR0VOM19WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtFaWdlbjNfRklORF9WRVJTSU9OfSkKKyAgICBzZXQoRUlHRU4zX1ZFUlNJT05fT0sgRkFMU0UpCisgIGVsc2UoJHtFSUdFTjNfVkVSU0lPTn0gVkVSU0lPTl9MRVNTICR7RWlnZW4zX0ZJTkRfVkVSU0lPTn0pCisgICAgc2V0KEVJR0VOM19WRVJTSU9OX09LIFRSVUUpCisgIGVuZGlmKCR7RUlHRU4zX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke0VpZ2VuM19GSU5EX1ZFUlNJT059KQorCisgIGlmKE5PVCBFSUdFTjNfVkVSU0lPTl9PSykKKworICAgIG1lc3NhZ2UoU1RBVFVTICJFaWdlbjMgdmVyc2lvbiAke0VJR0VOM19WRVJTSU9OfSBmb3VuZCBpbiAke0VJR0VOM19JTkNMVURFX0RJUn0sICIKKyAgICAgICAgICAgICAgICAgICAiYnV0IGF0IGxlYXN0IHZlcnNpb24gJHtFaWdlbjNfRklORF9WRVJTSU9OfSBpcyByZXF1aXJlZCIpCisgIGVuZGlmKE5PVCBFSUdFTjNfVkVSU0lPTl9PSykKK2VuZG1hY3JvKF9laWdlbjNfY2hlY2tfdmVyc2lvbikKKworaWYgKEVJR0VOM19JTkNMVURFX0RJUikKKworICAjIGluIGNhY2hlIGFscmVhZHkKKyAgX2VpZ2VuM19jaGVja192ZXJzaW9uKCkKKyAgc2V0KEVJR0VOM19GT1VORCAke0VJR0VOM19WRVJTSU9OX09LfSkKKworZWxzZSAoRUlHRU4zX0lOQ0xVREVfRElSKQorICAKKyAgIyBzZWFyY2ggZmlyc3QgaWYgYW4gRWlnZW4zQ29uZmlnLmNtYWtlIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLAorICAjIGlmIHN1Y2Nlc3NmdWwgdGhpcyB3b3VsZCBzZXQgRUlHRU4zX0lOQ0xVREVfRElSIGFuZCB0aGUgcmVzdCBvZgorICAjIHRoZSBzY3JpcHQgd2lsbCB3b3JrIGFzIHVzdWFsCisgIGZpbmRfcGFja2FnZShFaWdlbjMgJHtFaWdlbjNfRklORF9WRVJTSU9OfSBOT19NT0RVTEUgUVVJRVQpCisKKyAgaWYoTk9UIEVJR0VOM19JTkNMVURFX0RJUikKKyAgICBmaW5kX3BhdGgoRUlHRU4zX0lOQ0xVREVfRElSIE5BTUVTIHNpZ25hdHVyZV9vZl9laWdlbjNfbWF0cml4X2xpYnJhcnkKKyAgICAgICAgSElOVFMKKyAgICAgICAgRU5WIEVJR0VOM19ST09UIAorICAgICAgICBFTlYgRUlHRU4zX1JPT1RfRElSCisgICAgICAgIFBBVEhTCisgICAgICAgICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2luY2x1ZGUKKyAgICAgICAgJHtLREU0X0lOQ0xVREVfRElSfQorICAgICAgICBQQVRIX1NVRkZJWEVTIGVpZ2VuMyBlaWdlbgorICAgICAgKQorICBlbmRpZihOT1QgRUlHRU4zX0lOQ0xVREVfRElSKQorCisgIGlmKEVJR0VOM19JTkNMVURFX0RJUikKKyAgICBfZWlnZW4zX2NoZWNrX3ZlcnNpb24oKQorICBlbmRpZihFSUdFTjNfSU5DTFVERV9ESVIpCisKKyAgaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKyAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEVpZ2VuMyBERUZBVUxUX01TRyBFSUdFTjNfSU5DTFVERV9ESVIgRUlHRU4zX1ZFUlNJT05fT0spCisKKyAgbWFya19hc19hZHZhbmNlZChFSUdFTjNfSU5DTFVERV9ESVIpCisKK2VuZGlmKEVJR0VOM19JTkNMVURFX0RJUikKKwpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEZGVFcuY21ha2UgYi9jbWFrZS9GaW5kRkZUVy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRkYzlhCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEZGVFcuY21ha2UKQEAgLTAsMCArMSwxMTkgQEAKKyMgLSBGaW5kIHRoZSBGRlRXIGxpYnJhcnkKKyMKKyMgVXNhZ2U6CisjICAgZmluZF9wYWNrYWdlKEZGVFcgW1JFUVVJUkVEXSBbUVVJRVRdICkKKyMgICAgIAorIyBJdCBzZXRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorIyAgIEZGVFdfRk9VTkQgICAgICAgICAgICAgICAuLi4gdHJ1ZSBpZiBmZnR3IGlzIGZvdW5kIG9uIHRoZSBzeXN0ZW0KKyMgICBGRlRXX0xJQlJBUklFUyAgICAgICAgICAgLi4uIGZ1bGwgcGF0aCB0byBmZnR3IGxpYnJhcnkKKyMgICBGRlRXX0lOQ0xVREVTICAgICAgICAgICAgLi4uIGZmdHcgaW5jbHVkZSBkaXJlY3RvcnkKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgd2lsbCBiZSBjaGVja2VkIGJ5IHRoZSBmdW5jdGlvbgorIyAgIEZGVFdfVVNFX1NUQVRJQ19MSUJTICAgIC4uLiBpZiB0cnVlLCBvbmx5IHN0YXRpYyBsaWJyYXJpZXMgYXJlIGZvdW5kCisjICAgRkZUV19ST09UICAgICAgICAgICAgICAgLi4uIGlmIHNldCwgdGhlIGxpYnJhcmllcyBhcmUgZXhjbHVzaXZlbHkgc2VhcmNoZWQKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgdGhpcyBwYXRoCisjICAgRkZUV19MSUJSQVJZICAgICAgICAgICAgLi4uIGZmdHcgbGlicmFyeSB0byB1c2UKKyMgICBGRlRXX0lOQ0xVREVfRElSICAgICAgICAuLi4gZmZ0dyBpbmNsdWRlIGRpcmVjdG9yeQorIworCisjSWYgZW52aXJvbm1lbnQgdmFyaWFibGUgRkZUV0RJUiBpcyBzcGVjaWZpZWQsIGl0IGhhcyBzYW1lIGVmZmVjdCBhcyBGRlRXX1JPT1QKK2lmKCBOT1QgRkZUV19ST09UIEFORCBFTlZ7RkZUV0RJUn0gKQorICBzZXQoIEZGVFdfUk9PVCAkRU5We0ZGVFdESVJ9ICkKK2VuZGlmKCkKKworIyBDaGVjayBpZiB3ZSBjYW4gdXNlIFBrZ0NvbmZpZworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKworI0RldGVybWluZSBmcm9tIFBLRworaWYoIFBLR19DT05GSUdfRk9VTkQgQU5EIE5PVCBGRlRXX1JPT1QgKQorICBwa2dfY2hlY2tfbW9kdWxlcyggUEtHX0ZGVFcgUVVJRVQgImZmdHczIiApCitlbmRpZigpCisKKyNDaGVjayB3aGV0aGVyIHRvIHNlYXJjaCBzdGF0aWMgb3IgZHluYW1pYyBsaWJzCitzZXQoIENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFU19TQVYgJHtDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVN9ICkKKworaWYoICR7RkZUV19VU0VfU1RBVElDX0xJQlN9ICkKKyAgc2V0KCBDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMgJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9ICkKK2Vsc2UoKQorICBzZXQoIENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0gKQorZW5kaWYoKQorCitpZiggRkZUV19ST09UICkKKworICAjZmluZCBsaWJzCisgIGZpbmRfbGlicmFyeSgKKyAgICBGRlRXX0xJQgorICAgIE5BTUVTICJmZnR3MyIKKyAgICBQQVRIUyAke0ZGVFdfUk9PVH0KKyAgICBQQVRIX1NVRkZJWEVTICJsaWIiICJsaWI2NCIKKyAgICBOT19ERUZBVUxUX1BBVEgKKyAgKQorCisgIGZpbmRfbGlicmFyeSgKKyAgICBGRlRXRl9MSUIKKyAgICBOQU1FUyAiZmZ0dzNmIgorICAgIFBBVEhTICR7RkZUV19ST09UfQorICAgIFBBVEhfU1VGRklYRVMgImxpYiIgImxpYjY0IgorICAgIE5PX0RFRkFVTFRfUEFUSAorICApCisKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdMX0xJQgorICAgIE5BTUVTICJmZnR3M2wiCisgICAgUEFUSFMgJHtGRlRXX1JPT1R9CisgICAgUEFUSF9TVUZGSVhFUyAibGliIiAibGliNjQiCisgICAgTk9fREVGQVVMVF9QQVRICisgICkKKworICAjZmluZCBpbmNsdWRlcworICBmaW5kX3BhdGgoCisgICAgRkZUV19JTkNMVURFUworICAgIE5BTUVTICJmZnR3My5oIgorICAgIFBBVEhTICR7RkZUV19ST09UfQorICAgIFBBVEhfU1VGRklYRVMgImluY2x1ZGUiCisgICAgTk9fREVGQVVMVF9QQVRICisgICkKKworZWxzZSgpCisKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdfTElCCisgICAgTkFNRVMgImZmdHczIgorICAgIFBBVEhTICR7UEtHX0ZGVFdfTElCUkFSWV9ESVJTfSAke0xJQl9JTlNUQUxMX0RJUn0KKyAgKQorCisgIGZpbmRfbGlicmFyeSgKKyAgICBGRlRXRl9MSUIKKyAgICBOQU1FUyAiZmZ0dzNmIgorICAgIFBBVEhTICR7UEtHX0ZGVFdfTElCUkFSWV9ESVJTfSAke0xJQl9JTlNUQUxMX0RJUn0KKyAgKQorCisKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdMX0xJQgorICAgIE5BTUVTICJmZnR3M2wiCisgICAgUEFUSFMgJHtQS0dfRkZUV19MSUJSQVJZX0RJUlN9ICR7TElCX0lOU1RBTExfRElSfQorICApCisKKyAgZmluZF9wYXRoKAorICAgIEZGVFdfSU5DTFVERVMKKyAgICBOQU1FUyAiZmZ0dzMuaCIKKyAgICBQQVRIUyAke1BLR19GRlRXX0lOQ0xVREVfRElSU30gJHtJTkNMVURFX0lOU1RBTExfRElSfQorICApCisKK2VuZGlmKCBGRlRXX1JPT1QgKQorCitzZXQoRkZUV19MSUJSQVJJRVMgJHtGRlRXX0xJQn0gJHtGRlRXRl9MSUJ9KQorCitpZihGRlRXTF9MSUIpCisgIHNldChGRlRXX0xJQlJBUklFUyAke0ZGVFdfTElCUkFSSUVTfSAke0ZGVFdMX0xJQn0pCitlbmRpZigpCisKK3NldCggQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTICR7Q01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTX1NBVn0gKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEZGVFcgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlRXX0lOQ0xVREVTIEZGVFdfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKEZGVFdfSU5DTFVERVMgRkZUV19MSUJSQVJJRVMgRkZUV19MSUIgRkZUV0ZfTElCIEZGVFdMX0xJQikKKwpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEdMRVcuY21ha2UgYi9jbWFrZS9GaW5kR0xFVy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRhMjBmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEdMRVcuY21ha2UKQEAgLTAsMCArMSwxMDUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA5IEJvdWRld2lqbiBSZW1wdCA8Ym91ZEB2YWxkeWFzLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuIAorIyAKKyMgLSB0cnkgdG8gZmluZCBnbGV3IGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKKyMgIEdMRVdfSU5DTFVERV9ESVIsIHdoZXJlIHRvIGZpbmQgR0wvZ2xldy5oLCBldGMuCisjICBHTEVXX0xJQlJBUklFUywgdGhlIGxpYnJhcmllcyB0byBsaW5rIGFnYWluc3QKKyMgIEdMRVdfRk9VTkQsIElmIGZhbHNlLCBkbyBub3QgdHJ5IHRvIHVzZSBHTEVXLgorIyBBbHNvIGRlZmluZWQsIGJ1dCBub3QgZm9yIGdlbmVyYWwgdXNlIGFyZToKKyMgIEdMRVdfR0xFV19MSUJSQVJZID0gdGhlIGZ1bGwgcGF0aCB0byB0aGUgZ2xldyBsaWJyYXJ5LgorCitJRiAoV0lOMzIpCisKKyAgSUYoQ1lHV0lOKQorCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaCkKKworICAgIEZJTkRfTElCUkFSWSggR0xFV19HTEVXX0xJQlJBUlkgZ2xldzMyCisgICAgICAke09QRU5HTF9MSUJSQVJZX0RJUn0KKyAgICAgIC91c3IvbGliL3czMmFwaQorICAgICAgL3Vzci9YMTFSNi9saWIKKyAgICApCisKKworICBFTFNFKENZR1dJTikKKyAgCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaAorICAgICAgJEVOVntHTEVXX1JPT1RfUEFUSH0vaW5jbHVkZQorICAgICkKKworICAgIEZJTkRfTElCUkFSWSggR0xFV19HTEVXX0xJQlJBUlkKKyAgICAgIE5BTUVTIGdsZXcgZ2xldzMyCisgICAgICBQQVRIUworICAgICAgJEVOVntHTEVXX1JPT1RfUEFUSH0vbGliCisgICAgICAke09QRU5HTF9MSUJSQVJZX0RJUn0KKyAgICApCisKKyAgRU5ESUYoQ1lHV0lOKQorCitFTFNFIChXSU4zMikKKworICBJRiAoQVBQTEUpCisjIFRoZXNlIHZhbHVlcyBmb3IgQXBwbGUgY291bGQgcHJvYmFibHkgZG8gd2l0aCBpbXByb3ZlbWVudC4KKyAgICBGSU5EX1BBVEgoIEdMRVdfSU5DTFVERV9ESVIgZ2xldy5oCisgICAgICAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9HTEVXLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMKKyAgICAgICR7T1BFTkdMX0xJQlJBUllfRElSfQorICAgICkKKyAgICBTRVQoR0xFV19HTEVXX0xJQlJBUlkgIi1mcmFtZXdvcmsgR0xFVyIgQ0FDSEUgU1RSSU5HICJHTEVXIGxpYnJhcnkgZm9yIE9TWCIpCisgICAgU0VUKEdMRVdfY29jb2FfTElCUkFSWSAiLWZyYW1ld29yayBDb2NvYSIgQ0FDSEUgU1RSSU5HICJDb2NvYSBmcmFtZXdvcmsgZm9yIE9TWCIpCisgIEVMU0UgKEFQUExFKQorCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaAorICAgICAgL3Vzci9pbmNsdWRlL0dMCisgICAgICAvdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZQorICAgICAgL3Vzci9vcGVud2luL2luY2x1ZGUKKyAgICAgIC91c3IvWDExUjYvaW5jbHVkZQorICAgICAgL3Vzci9pbmNsdWRlL1gxMQorICAgICAgL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQorICAgICAgL29wdC9ncmFwaGljcy9PcGVuR0wvY29udHJpYi9saWJnbGV3CisgICAgKQorCisgICAgRklORF9MSUJSQVJZKCBHTEVXX0dMRVdfTElCUkFSWSBHTEVXCisgICAgICAvdXNyL29wZW53aW4vbGliCisgICAgICAvdXNyL1gxMVI2L2xpYgorICAgICkKKworICBFTkRJRiAoQVBQTEUpCisKK0VORElGIChXSU4zMikKKworU0VUKCBHTEVXX0ZPVU5EICJOTyIgKQorSUYoR0xFV19JTkNMVURFX0RJUikKKyAgSUYoR0xFV19HTEVXX0xJQlJBUlkpCisgICAgIyBJcyAtbFhpIGFuZCAtbFhtdSByZXF1aXJlZCBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgaGF2ZSBpdD8KKyAgICAjIElmIG5vdCwgd2UgbmVlZCBzb21lIHdheSB0byBmaWd1cmUgb3V0IHdoYXQgcGxhdGZvcm0gd2UgYXJlIG9uLgorICAgIFNFVCggR0xFV19MSUJSQVJJRVMKKyAgICAgICR7R0xFV19HTEVXX0xJQlJBUll9CisgICAgICAke0dMRVdfY29jb2FfTElCUkFSWX0KKyAgICApCisgICAgU0VUKCBHTEVXX0ZPVU5EICJZRVMiICkKKworI1RoZSBmb2xsb3dpbmcgZGVwcmVjYXRlZCBzZXR0aW5ncyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggQ01ha2UxLjQKKyAgICBTRVQgKEdMRVdfTElCUkFSWSAke0dMRVdfTElCUkFSSUVTfSkKKyAgICBTRVQgKEdMRVdfSU5DTFVERV9QQVRIICR7R0xFV19JTkNMVURFX0RJUn0pCisKKyAgRU5ESUYoR0xFV19HTEVXX0xJQlJBUlkpCitFTkRJRihHTEVXX0lOQ0xVREVfRElSKQorCitJRihHTEVXX0ZPVU5EKQorICBJRihOT1QgR0xFV19GSU5EX1FVSUVUTFkpCisgICAgTUVTU0FHRShTVEFUVVMgIkZvdW5kIEdsZXc6ICR7R0xFV19MSUJSQVJJRVN9IikKKyAgRU5ESUYoTk9UIEdMRVdfRklORF9RVUlFVExZKQorRUxTRShHTEVXX0ZPVU5EKQorICBJRihHTEVXX0ZJTkRfUkVRVUlSRUQpCisgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiQ291bGQgbm90IGZpbmQgR2xldyIpCisgIEVORElGKEdMRVdfRklORF9SRVFVSVJFRCkKK0VORElGKEdMRVdfRk9VTkQpCisKK01BUktfQVNfQURWQU5DRUQoCisgIEdMRVdfSU5DTFVERV9ESVIKKyAgR0xFV19HTEVXX0xJQlJBUlkKKyAgR0xFV19YbXVfTElCUkFSWQorICBHTEVXX1hpX0xJQlJBUlkKKykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRHTVAuY21ha2UgYi9jbWFrZS9GaW5kR01QLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDI3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kR01QLmNtYWtlCkBAIC0wLDAgKzEsMjEgQEAKKyMgVHJ5IHRvIGZpbmQgdGhlIEdOVSBNdWx0aXBsZSBQcmVjaXNpb24gQXJpdGhtZXRpYyBMaWJyYXJ5IChHTVApCisjIFNlZSBodHRwOi8vZ21wbGliLm9yZy8KKworaWYgKEdNUF9JTkNMVURFUyBBTkQgR01QX0xJQlJBUklFUykKKyAgc2V0KEdNUF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHTVBfSU5DTFVERVMgQU5EIEdNUF9MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChHTVBfSU5DTFVERVMKKyAgTkFNRVMKKyAgZ21wLmgKKyAgUEFUSFMKKyAgJEVOVntHTVBESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKykKKworZmluZF9saWJyYXJ5KEdNUF9MSUJSQVJJRVMgZ21wIFBBVEhTICRFTlZ7R01QRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR01QIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01QX0lOQ0xVREVTIEdNUF9MSUJSQVJJRVMpCittYXJrX2FzX2FkdmFuY2VkKEdNUF9JTkNMVURFUyBHTVBfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEdTTC5jbWFrZSBiL2NtYWtlL0ZpbmRHU0wuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0MTFhNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRHU0wuY21ha2UKQEAgLTAsMCArMSwxNzAgQEAKKyMgVHJ5IHRvIGZpbmQgZ251IHNjaWVudGlmaWMgbGlicmFyeSBHU0wKKyMgU2VlIAorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsLyAgYW5kCisjIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMvZ3NsLmh0bQorIworIyBPbmNlIHJ1biB0aGlzIHdpbGwgZGVmaW5lOiAKKyMgCisjIEdTTF9GT1VORCAgICAgICA9IHN5c3RlbSBoYXMgR1NMIGxpYgorIworIyBHU0xfTElCUkFSSUVTICAgPSBmdWxsIHBhdGggdG8gdGhlIGxpYnJhcmllcworIyAgICBvbiBVbml4L0xpbnV4IHdpdGggYWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MgZnJvbSAiZ3NsLWNvbmZpZyAtLWxpYnMiCisjIAorIyBDTUFLRV9HU0xfQ1hYX0ZMQUdTICA9IFVuaXggY29tcGlsZXIgZmxhZ3MgZm9yIEdTTCwgZXNzZW50aWFsbHkgImBnc2wtY29uZmlnIC0tY3h4ZmxhZ3NgIgorIworIyBHU0xfSU5DTFVERV9ESVIgICAgICA9IHdoZXJlIHRvIGZpbmQgaGVhZGVycyAKKyMKKyMgR1NMX0xJTktfRElSRUNUT1JJRVMgPSBsaW5rIGRpcmVjdG9yaWVzLCB1c2VmdWwgZm9yIHJwYXRoIG9uIFVuaXgKKyMgR1NMX0VYRV9MSU5LRVJfRkxBR1MgPSBycGF0aCBvbiBVbml4CisjCisjIEZlbGl4IFdvZWxrIDA3LzIwMDQKKyMgSmFuIFdvZXR6ZWwKKyMKKyMgd3d3Lm1pcC5pbmZvcm1hdGlrLnVuaS1raWVsLmRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lGKFdJTjMyKQorICAjIEpXIHRlc3RlZCB3aXRoIGdzbC0xLjgsIFdpbmRvd3MgWFAsIE1TVlMgNy4xCisgIFNFVChHU0xfUE9TU0lCTEVfUk9PVF9ESVJTCisgICAgJHtHU0xfUk9PVF9ESVJ9CisgICAgJEVOVntHU0xfUk9PVF9ESVJ9CisgICAgJHtHU0xfRElSfQorICAgICR7R1NMX0hPTUV9ICAgIAorICAgICRFTlZ7R1NMX0RJUn0KKyAgICAkRU5We0dTTF9IT01FfQorICAgICRFTlZ7RVhUUkF9CisgICAgIkM6L1Byb2dyYW0gRmlsZXMvR251V2luMzIiCisgICAgKQorICBGSU5EX1BBVEgoR1NMX0lOQ0xVREVfRElSCisgICAgTkFNRVMgZ3NsL2dzbF9jZGYuaCBnc2wvZ3NsX3JhbmRpc3QuaAorICAgIFBBVEhTICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGluY2x1ZGUKKyAgICBET0MgIkdTTCBoZWFkZXIgaW5jbHVkZSBkaXIiCisgICAgKQorICAKKyAgRklORF9MSUJSQVJZKEdTTF9HU0xfTElCUkFSWQorICAgIE5BTUVTIGxpYmdzbC5kbGwuYSBnc2wgbGliZ3NsCisgICAgUEFUSFMgICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGxpYgorICAgIERPQyAiR1NMIGxpYnJhcnkiICkKKyAgCisgIGlmKE5PVCBHU0xfR1NMX0xJQlJBUlkpCisJRklORF9GSUxFKEdTTF9HU0xfTElCUkFSWQorCQlOQU1FUyBsaWJnc2wuZGxsLmEKKwkJUEFUSFMgICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKwkJUEFUSF9TVUZGSVhFUyBsaWIKKwkJRE9DICJHU0wgbGlicmFyeSIpCisgIGVuZGlmKE5PVCBHU0xfR1NMX0xJQlJBUlkpCisgIAorICBGSU5EX0xJQlJBUlkoR1NMX0dTTENCTEFTX0xJQlJBUlkKKyAgICBOQU1FUyBsaWJnc2xjYmxhcy5kbGwuYSBnc2xjYmxhcyBsaWJnc2xjYmxhcworICAgIFBBVEhTICAke0dTTF9QT1NTSUJMRV9ST09UX0RJUlN9CisgICAgUEFUSF9TVUZGSVhFUyBsaWIKKyAgICBET0MgIkdTTCBjYmxhcyBsaWJyYXJ5IGRpciIgKQorICAKKyAgaWYoTk9UIEdTTF9HU0xDQkxBU19MSUJSQVJZKQorCUZJTkRfRklMRShHU0xfR1NMQ0JMQVNfTElCUkFSWQorCQlOQU1FUyBsaWJnc2xjYmxhcy5kbGwuYQorCQlQQVRIUyAgJHtHU0xfUE9TU0lCTEVfUk9PVF9ESVJTfQorCQlQQVRIX1NVRkZJWEVTIGxpYgorCQlET0MgIkdTTCBsaWJyYXJ5IikKKyAgZW5kaWYoTk9UIEdTTF9HU0xDQkxBU19MSUJSQVJZKQorICAKKyAgU0VUKEdTTF9MSUJSQVJJRVMgJHtHU0xfR1NMX0xJQlJBUll9KQorCisgICNNRVNTQUdFKCJEQkdcbiIKKyAgIyAgIkdTTF9HU0xfTElCUkFSWT0ke0dTTF9HU0xfTElCUkFSWX1cbiIKKyAgIyAgIkdTTF9HU0xDQkxBU19MSUJSQVJZPSR7R1NMX0dTTENCTEFTX0xJQlJBUll9XG4iCisgICMgICJHU0xfTElCUkFSSUVTPSR7R1NMX0xJQlJBUklFU30iKQorCisKK0VMU0UoV0lOMzIpCisgIAorICBJRihVTklYKSAKKyAgICBTRVQoR1NMX0NPTkZJR19QUkVGRVJfUEFUSCAKKyAgICAgICIkRU5We0dTTF9ESVJ9L2JpbiIKKyAgICAgICIkRU5We0dTTF9ESVJ9IgorICAgICAgIiRFTlZ7R1NMX0hPTUV9L2JpbiIgCisgICAgICAiJEVOVntHU0xfSE9NRX0iIAorICAgICAgQ0FDSEUgU1RSSU5HICJwcmVmZXJyZWQgcGF0aCB0byBHU0wgKGdzbC1jb25maWcpIikKKyAgICBGSU5EX1BST0dSQU0oR1NMX0NPTkZJRyBnc2wtY29uZmlnCisgICAgICAke0dTTF9DT05GSUdfUFJFRkVSX1BBVEh9CisgICAgICAvdXNyL2Jpbi8KKyAgICAgICkKKyAgICAjIE1FU1NBR0UoIkRCRyBHU0xfQ09ORklHICR7R1NMX0NPTkZJR30iKQorICAgIAorICAgIElGIChHU0xfQ09ORklHKSAKKyAgICAgICMgc2V0IENYWEZMQUdTIHRvIGJlIGZlZCBpbnRvIENYWF9GTEFHUyBieSB0aGUgdXNlcjoKKyAgICAgIFNFVChHU0xfQ1hYX0ZMQUdTICJgJHtHU0xfQ09ORklHfSAtLWNmbGFnc2AiKQorICAgICAgCisgICAgICAjIHNldCBJTkNMVURFX0RJUlMgdG8gcHJlZml4K2luY2x1ZGUKKyAgICAgIEVYRUNfUFJPR1JBTSgke0dTTF9DT05GSUd9CisgICAgICAgIEFSR1MgLS1wcmVmaXgKKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9QUkVGSVgpCisgICAgICBTRVQoR1NMX0lOQ0xVREVfRElSICR7R1NMX1BSRUZJWH0vaW5jbHVkZSBDQUNIRSBTVFJJTkcgSU5URVJOQUwpCisKKyAgICAgICMgc2V0IGxpbmsgbGlicmFyaWVzIGFuZCBsaW5rIGZsYWdzCisgICAgICAjU0VUKEdTTF9MSUJSQVJJRVMgImAke0dTTF9DT05GSUd9IC0tbGlic2AiKQorICAgICAgRVhFQ19QUk9HUkFNKCR7R1NMX0NPTkZJR30KKyAgICAgICAgQVJHUyAtLWxpYnMKKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9MSUJSQVJJRVMgKQorICAgICAgICAKKyAgICAgICMgZXh0cmFjdCBsaW5rIGRpcnMgZm9yIHJwYXRoICAKKyAgICAgIEVYRUNfUFJPR1JBTSgke0dTTF9DT05GSUd9CisgICAgICAgIEFSR1MgLS1saWJzCisgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBHU0xfQ09ORklHX0xJQlMgKQorICAgICAgCisgICAgICAjIGV4dHJhY3QgdmVyc2lvbgorICAgICAgRVhFQ19QUk9HUkFNKCR7R1NMX0NPTkZJR30KKyAgICAgICAgQVJHUyAtLXZlcnNpb24KKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9GVUxMX1ZFUlNJT04gKQorICAgICAgCisgICAgICAjIHNwbGl0IHZlcnNpb24gYXMgbWFqb3IvbWlub3IKKyAgICAgIFNUUklORyhSRUdFWCBNQVRDSCAiKC4pXFwuLioiIEdTTF9WRVJTSU9OX01BSk9SXyAiJHtHU0xfRlVMTF9WRVJTSU9OfSIpCisgICAgICBTRVQoR1NMX1ZFUlNJT05fTUFKT1IgJHtDTUFLRV9NQVRDSF8xfSkKKyAgICAgIFNUUklORyhSRUdFWCBNQVRDSCAiLlxcLiguKikiIEdTTF9WRVJTSU9OX01JTk9SXyAiJHtHU0xfRlVMTF9WRVJTSU9OfSIpCisgICAgICBTRVQoR1NMX1ZFUlNJT05fTUlOT1IgJHtDTUFLRV9NQVRDSF8xfSkKKworICAgICAgIyBzcGxpdCBvZmYgdGhlIGxpbmsgZGlycyAoZm9yIHJwYXRoKQorICAgICAgIyB1c2UgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHdpbGRjYXJkIGVxdWl2YWxlbnQgIi1MKjxlbmRjaGFyPiIKKyAgICAgICMgd2l0aCA8ZW5kY2hhcj4gaXMgYSBzcGFjZSBvciBhIHNlbWljb2xvbgorICAgICAgU1RSSU5HKFJFR0VYIE1BVENIQUxMICJbLV1bTF0oW14gO10pKyIgCisgICAgICAgIEdTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYIAorICAgICAgICAiJHtHU0xfQ09ORklHX0xJQlN9IiApCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWD0ke0dTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYfSIpCisKKyAgICAgICMgcmVtb3ZlIHByZWZpeCAtTCBiZWNhdXNlIHdlIG5lZWQgdGhlIHB1cmUgZGlyZWN0b3J5IGZvciBMSU5LX0RJUkVDVE9SSUVTCisgICAgICAKKyAgICAgIElGIChHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWCkKKyAgICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlstXVtMXSIgIiIgR1NMX0xJTktfRElSRUNUT1JJRVMgJHtHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWH0gKQorICAgICAgRU5ESUYgKEdTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYKQorICAgICAgU0VUKEdTTF9FWEVfTElOS0VSX0ZMQUdTICItV2wsLXJwYXRoLCR7R1NMX0xJTktfRElSRUNUT1JJRVN9IiBDQUNIRSBTVFJJTkcgSU5URVJOQUwpCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfTElOS19ESVJFQ1RPUklFUz0ke0dTTF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfRVhFX0xJTktFUl9GTEFHUz0ke0dTTF9FWEVfTElOS0VSX0ZMQUdTfSIpCisKKyAgICAgICMgICAgICBBRERfREVGSU5JVElPTlMoIi1ESEFWRV9HU0wiKQorICAgICAgIyAgICAgIFNFVChHU0xfREVGSU5JVElPTlMgIi1ESEFWRV9HU0wiKQorICAgICAgTUFSS19BU19BRFZBTkNFRCgKKyAgICAgICAgR1NMX0NYWF9GTEFHUworICAgICAgICBHU0xfSU5DTFVERV9ESVIKKyAgICAgICAgR1NMX0xJQlJBUklFUworICAgICAgICBHU0xfTElOS19ESVJFQ1RPUklFUworICAgICAgICBHU0xfREVGSU5JVElPTlMKKyAgICAgICAgKQorICAgICAgTUVTU0FHRShTVEFUVVMgIlVzaW5nIEdTTCBmcm9tICR7R1NMX1BSRUZJWH0iKQorICAgICAgCisgICAgRUxTRShHU0xfQ09ORklHKQorICAgICAgTUVTU0FHRSgiRmluZEdTTC5jbWFrZTogZ3NsLWNvbmZpZyBub3QgZm91bmQuIFBsZWFzZSBzZXQgaXQgbWFudWFsbHkuIEdTTF9DT05GSUc9JHtHU0xfQ09ORklHfSIpCisgICAgRU5ESUYoR1NMX0NPTkZJRykKKworICBFTkRJRihVTklYKQorRU5ESUYoV0lOMzIpCisKKworSUYoR1NMX0xJQlJBUklFUykKKyAgSUYoR1NMX0lOQ0xVREVfRElSIE9SIEdTTF9DWFhfRkxBR1MpCisKKyAgICBTRVQoR1NMX0ZPVU5EIDEpCisgICAgCisgIEVORElGKEdTTF9JTkNMVURFX0RJUiBPUiBHU0xfQ1hYX0ZMQUdTKQorRU5ESUYoR1NMX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRHb29nbGVIYXNoLmNtYWtlIGIvY21ha2UvRmluZEdvb2dsZUhhc2guY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhODFhMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRHb29nbGVIYXNoLmNtYWtlCkBAIC0wLDAgKzEsMjMgQEAKKworaWYgKEdPT0dMRUhBU0hfSU5DTFVERVMgQU5EIEdPT0dMRUhBU0hfTElCUkFSSUVTKQorICBzZXQoR09PR0xFSEFTSF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHT09HTEVIQVNIX0lOQ0xVREVTIEFORCBHT09HTEVIQVNIX0xJQlJBUklFUykKKworZmluZF9wYXRoKEdPT0dMRUhBU0hfSU5DTFVERVMKKyAgTkFNRVMKKyAgZ29vZ2xlL2RlbnNlX2hhc2hfbWFwCisgIFBBVEhTCisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKykKKworaWYoR09PR0xFSEFTSF9JTkNMVURFUykKKyAgIyBsZXQncyBtYWtlIHN1cmUgaXQgY29tcGlsZXMgd2l0aCB0aGUgY3VycmVudCBjb21waWxlcgorICBmaWxlKFdSSVRFICR7Q01BS0VfQklOQVJZX0RJUn0vZ29vZ2xlaGFzaF90ZXN0LmNwcAorICAiI2luY2x1ZGUgPGdvb2dsZS9zcGFyc2VfaGFzaF9tYXA+XG4jaW5jbHVkZSA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPlxuaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7IGdvb2dsZTo6ZGVuc2VfaGFzaF9tYXA8aW50LGZsb2F0PiBhOyBnb29nbGU6OnNwYXJzZV9oYXNoX21hcDxpbnQsZmxvYXQ+IGI7IHJldHVybiAwO31cbiIpCisgIHRyeV9jb21waWxlKEdPT0dMRUhBU0hfQ09NUElMRSAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7Q01BS0VfQklOQVJZX0RJUn0vZ29vZ2xlaGFzaF90ZXN0LmNwcCBPVVRQVVRfVkFSSUFCTEUgR09PR0xFSEFTSF9DT01QSUxFX1JFU1VMVCkKK2VuZGlmKEdPT0dMRUhBU0hfSU5DTFVERVMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR09PR0xFSEFTSCBERUZBVUxUX01TRyBHT09HTEVIQVNIX0lOQ0xVREVTIEdPT0dMRUhBU0hfQ09NUElMRSkKKworbWFya19hc19hZHZhbmNlZChHT09HTEVIQVNIX0lOQ0xVREVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEhXTE9DLmNtYWtlIGIvY21ha2UvRmluZEhXTE9DLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzFiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kSFdMT0MuY21ha2UKQEAgLTAsMCArMSwzMzEgQEAKKyMjIworIworIyBAY29weXJpZ2h0IChjKSAyMDA5LTIwMTQgVGhlIFVuaXZlcnNpdHkgb2YgVGVubmVzc2VlIGFuZCBUaGUgVW5pdmVyc2l0eQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgVGVubmVzc2VlIFJlc2VhcmNoIEZvdW5kYXRpb24uCisjICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgSW5yaWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBCb3JkZWF1eCBJTlAsIENOUlMgKExhQlJJIFVNUiA1ODAwKSwgSW5yaWEsIFVuaXYuIEJvcmRlYXV4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyMjCisjCisjIC0gRmluZCBIV0xPQyBpbmNsdWRlIGRpcnMgYW5kIGxpYnJhcmllcworIyBVc2UgdGhpcyBtb2R1bGUgYnkgaW52b2tpbmcgZmluZF9wYWNrYWdlIHdpdGggdGhlIGZvcm06CisjICBmaW5kX3BhY2thZ2UoSFdMT0MKKyMgICAgICAgICAgICAgICBbUkVRVUlSRURdKSAjIEZhaWwgd2l0aCBlcnJvciBpZiBod2xvYyBpcyBub3QgZm91bmQKKyMKKyMgVGhpcyBtb2R1bGUgZmluZHMgaGVhZGVycyBhbmQgaHdsb2MgbGlicmFyeS4KKyMgUmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gdmFyaWFibGVzOgorIyAgSFdMT0NfRk9VTkQgICAgICAgICAgIC0gVHJ1ZSBpZiBoZWFkZXJzIGFuZCByZXF1ZXN0ZWQgbGlicmFyaWVzIHdlcmUgZm91bmQKKyMgIEhXTE9DX0lOQ0xVREVfRElSUyAgICAtIGh3bG9jIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIEhXTE9DX0xJQlJBUllfRElSUyAgICAtIExpbmsgZGlyZWN0b3JpZXMgZm9yIGh3bG9jIGxpYnJhcmllcworIyAgSFdMT0NfTElCUkFSSUVTICAgICAgIC0gaHdsb2MgY29tcG9uZW50IGxpYnJhcmllcyB0byBiZSBsaW5rZWQKKyMKKyMgVGhlIHVzZXIgY2FuIGdpdmUgc3BlY2lmaWMgcGF0aHMgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyaWVzIGFkZGluZyBjbWFrZQorIyBvcHRpb25zIGF0IGNvbmZpZ3VyZSAoZXg6IGNtYWtlIHBhdGgvdG8vcHJvamVjdCAtREhXTE9DX0RJUj1wYXRoL3RvL2h3bG9jKToKKyMgIEhXTE9DX0RJUiAgICAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIGh3bG9jCisjICBIV0xPQ19JTkNESVIgICAgICAgICAgLSBXaGVyZSB0byBmaW5kIHRoZSBoZWFkZXIgZmlsZXMKKyMgIEhXTE9DX0xJQkRJUiAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZXMKKyMgVGhlIG1vZHVsZSBjYW4gYWxzbyBsb29rIGZvciB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZiBwYXRocworIyBhcmUgbm90IGdpdmVuIGFzIGNtYWtlIHZhcmlhYmxlOiBIV0xPQ19ESVIsIEhXTE9DX0lOQ0RJUiwgSFdMT0NfTElCRElSCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMjAxMi0yMDEzIElucmlhCisjIENvcHlyaWdodCAyMDEyLTIwMTMgRW1tYW51ZWwgQWd1bGxvCisjIENvcHlyaWdodCAyMDEyLTIwMTMgTWF0aGlldSBGYXZlcmdlCisjIENvcHlyaWdodCAyMDEyICAgICAgQ2VkcmljIENhc3RhZ25lZGUKKyMgQ29weXJpZ2h0IDIwMTMgICAgICBGbG9yZW50IFBydXZvc3QKKyMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE9TSS1hcHByb3ZlZCBCU0QgTGljZW5zZSAodGhlICJMaWNlbnNlIik7CisjIHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBNT1JTRS1Db3B5cmlnaHQudHh0IGZvciBkZXRhaWxzLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKFRvIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG91dHNpZGUgb2YgTW9yc2UsIHN1YnN0aXR1dGUgdGhlIGZ1bGwKKyMgIExpY2Vuc2UgdGV4dCBmb3IgdGhlIGFib3ZlIHJlZmVyZW5jZS4pCisKK2luY2x1ZGUoQ2hlY2tTdHJ1Y3RIYXNNZW1iZXIpCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQorCitpZiAoTk9UIEhXTE9DX0ZPVU5EKQorICBzZXQoSFdMT0NfRElSICIiIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgSFdMT0MgbGlicmFyeSIpCisgIGlmIChOT1QgSFdMT0NfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJBIGNhY2hlIHZhcmlhYmxlLCBuYW1lbHkgSFdMT0NfRElSLCBoYXMgYmVlbiBzZXQgdG8gc3BlY2lmeSB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgSFdMT0MiKQorICBlbmRpZigpCitlbmRpZigpCisKK3NldChFTlZfSFdMT0NfRElSICIkRU5We0hXTE9DX0RJUn0iKQorc2V0KEVOVl9IV0xPQ19JTkNESVIgIiRFTlZ7SFdMT0NfSU5DRElSfSIpCitzZXQoRU5WX0hXTE9DX0xJQkRJUiAiJEVOVntIV0xPQ19MSUJESVJ9IikKK3NldChIV0xPQ19HSVZFTl9CWV9VU0VSICJGQUxTRSIpCitpZiAoIEhXTE9DX0RJUiBPUiAoIEhXTE9DX0lOQ0RJUiBBTkQgSFdMT0NfTElCRElSKSBPUiBFTlZfSFdMT0NfRElSIE9SIChFTlZfSFdMT0NfSU5DRElSIEFORCBFTlZfSFdMT0NfTElCRElSKSApCisgIHNldChIV0xPQ19HSVZFTl9CWV9VU0VSICJUUlVFIikKK2VuZGlmKCkKKworIyBPcHRpb25hbGx5IHVzZSBwa2ctY29uZmlnIHRvIGRldGVjdCBpbmNsdWRlL2xpYnJhcnkgZGlycyAoaWYgcGtnLWNvbmZpZyBpcyBhdmFpbGFibGUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUoRmluZFBrZ0NvbmZpZykKK2ZpbmRfcGFja2FnZShQa2dDb25maWcgUVVJRVQpCitpZiggUEtHX0NPTkZJR19FWEVDVVRBQkxFIEFORCBOT1QgSFdMT0NfR0lWRU5fQllfVVNFUiApCisKKyAgcGtnX3NlYXJjaF9tb2R1bGUoSFdMT0MgaHdsb2MpCisgIGlmIChOT1QgSFdMT0NfRklORF9RVUlFVExZKQorICAgIGlmIChIV0xPQ19GT1VORCBBTkQgSFdMT0NfTElCUkFSSUVTKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEhXTE9DIC0gZm91bmQgdXNpbmcgUGtnQ29uZmlnIikKKyAgICAgICNpZihOT1QgSFdMT0NfSU5DTFVERV9ESVJTKQorICAgICAgIyAgICBtZXNzYWdlKCIke01hZ2VudGF9SFdMT0NfSU5DTFVERV9ESVJTIGlzIGVtcHR5IHVzaW5nIFBrZ0NvbmZpZy4iCisgICAgICAjICAgICAgICAiUGVyaGFwcyB0aGUgcGF0aCB0byBod2xvYyBoZWFkZXJzIGlzIGFscmVhZHkgcHJlc2VudCBpbiB5b3VyIgorICAgICAgIyAgICAgICAgIkMoUExVUylfSU5DTFVERV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiR7Q29sb3VyUmVzZXR9IikKKyAgICAgICNlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiJHtNYWdlbnRhfUxvb2tpbmcgZm9yIEhXTE9DIC0gbm90IGZvdW5kIHVzaW5nIFBrZ0NvbmZpZy4iCisJIlxuICAgUGVyaGFwcyB5b3Ugc2hvdWxkIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaHdsb2MucGMgdG8iCisJIlxuICAgdGhlIFBLR19DT05GSUdfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4ke0NvbG91clJlc2V0fSIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKK2VuZGlmKCBQS0dfQ09ORklHX0VYRUNVVEFCTEUgQU5EIE5PVCBIV0xPQ19HSVZFTl9CWV9VU0VSICkKKworaWYoIChOT1QgUEtHX0NPTkZJR19FWEVDVVRBQkxFKSBPUiAoUEtHX0NPTkZJR19FWEVDVVRBQkxFIEFORCBOT1QgSFdMT0NfRk9VTkQpIE9SIChIV0xPQ19HSVZFTl9CWV9VU0VSKSApCisKKyAgaWYgKE5PVCBIV0xPQ19GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIEhXTE9DIC0gUGtnQ29uZmlnIG5vdCB1c2VkIikKKyAgZW5kaWYoKQorCisgICMgTG9va2luZyBmb3IgaW5jbHVkZQorICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAjIEFkZCBzeXN0ZW0gaW5jbHVkZSBwYXRocyB0byBzZWFyY2ggaW5jbHVkZQorICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB1bnNldChfaW5jX2VudikKKyAgaWYoRU5WX0hXTE9DX0lOQ0RJUikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfSFdMT0NfSU5DRElSfSIpCisgIGVsc2VpZihFTlZfSFdMT0NfRElSKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0VOVl9IV0xPQ19ESVJ9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfSFdMT0NfRElSfS9pbmNsdWRlIikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfSFdMT0NfRElSfS9pbmNsdWRlL2h3bG9jIikKKyAgZWxzZSgpCisgICAgaWYoV0lOMzIpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9pbmNfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICBlbHNlKCkKKyAgICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7Q19JTkNMVURFX1BBVEh9IikKKyAgICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7Q1BBVEh9IikKKyAgICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERV9QQVRIfSIpCisgICAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtDTUFLRV9DX0lNUExJQ0lUX0lOQ0xVREVfRElSRUNUT1JJRVN9IikKKyAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfaW5jX2VudikKKworICAjIHNldCBwYXRocyB3aGVyZSB0byBsb29rIGZvcgorICBzZXQoUEFUSF9UT19MT09LX0ZPUiAiJHtfaW5jX2Vudn0iKQorCisgICMgVHJ5IHRvIGZpbmQgdGhlIGh3bG9jIGhlYWRlciBpbiB0aGUgZ2l2ZW4gcGF0aHMKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBoZWFkZXIgcGF0aAorICBpZihIV0xPQ19JTkNESVIpCisgICAgc2V0KEhXTE9DX2h3bG9jLmhfRElSUyAiSFdMT0NfaHdsb2MuaF9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoSFdMT0NfaHdsb2MuaF9ESVJTCisgICAgICBOQU1FUyBod2xvYy5oCisgICAgICBISU5UUyAke0hXTE9DX0lOQ0RJUn0pCisgIGVsc2UoKQorICAgIGlmKEhXTE9DX0RJUikKKyAgICAgIHNldChIV0xPQ19od2xvYy5oX0RJUlMgIkhXTE9DX2h3bG9jLmhfRElSUy1OT1RGT1VORCIpCisgICAgICBmaW5kX3BhdGgoSFdMT0NfaHdsb2MuaF9ESVJTCisJTkFNRVMgaHdsb2MuaAorCUhJTlRTICR7SFdMT0NfRElSfQorCVBBVEhfU1VGRklYRVMgImluY2x1ZGUiICJpbmNsdWRlL2h3bG9jIikKKyAgICBlbHNlKCkKKyAgICAgIHNldChIV0xPQ19od2xvYy5oX0RJUlMgIkhXTE9DX2h3bG9jLmhfRElSUy1OT1RGT1VORCIpCisgICAgICBmaW5kX3BhdGgoSFdMT0NfaHdsb2MuaF9ESVJTCisJTkFNRVMgaHdsb2MuaAorCUhJTlRTICR7UEFUSF9UT19MT09LX0ZPUn0KKwlQQVRIX1NVRkZJWEVTICJod2xvYyIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIG1hcmtfYXNfYWR2YW5jZWQoSFdMT0NfaHdsb2MuaF9ESVJTKQorCisgICMgQWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgKEhXTE9DX2h3bG9jLmhfRElSUykKKyAgICBzZXQoSFdMT0NfSU5DTFVERV9ESVJTICIke0hXTE9DX2h3bG9jLmhfRElSU30iKQorICBlbHNlICgpCisgICAgc2V0KEhXTE9DX0lOQ0xVREVfRElSUyAiSFdMT0NfSU5DTFVERV9ESVJTLU5PVEZPVU5EIikKKyAgICBpZihOT1QgSFdMT0NfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIGh3bG9jIC0tIGh3bG9jLmggbm90IGZvdW5kIikKKyAgICBlbmRpZigpCisgIGVuZGlmICgpCisKKyAgaWYgKEhXTE9DX0lOQ0xVREVfRElSUykKKyAgICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIEhXTE9DX0lOQ0xVREVfRElSUykKKyAgZW5kaWYgKCkKKworCisgICMgTG9va2luZyBmb3IgbGliCisgICMgLS0tLS0tLS0tLS0tLS0tCisKKyAgIyBBZGQgc3lzdGVtIGxpYnJhcnkgcGF0aHMgdG8gc2VhcmNoIGxpYgorICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHVuc2V0KF9saWJfZW52KQorICBpZihFTlZfSFdMT0NfTElCRElSKQorICAgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9IV0xPQ19MSUJESVJ9IikKKyAgZWxzZWlmKEVOVl9IV0xPQ19ESVIpCisgICAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7RU5WX0hXTE9DX0RJUn0iKQorICAgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9IV0xPQ19ESVJ9L2xpYiIpCisgIGVsc2UoKQorICAgIGlmKFdJTjMyKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntMSUJ9IikKKyAgICBlbHNlKCkKKyAgICAgIGlmKEFQUExFKQorCXN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYl9lbnYgIiRFTlZ7RFlMRF9MSUJSQVJZX1BBVEh9IikKKyAgICAgIGVsc2UoKQorCXN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYl9lbnYgIiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgICBlbmRpZigpCisgICAgICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtDTUFLRV9QTEFURk9STV9JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfRElSRUNUT1JJRVN9IikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfbGliX2VudikKKworICAjIHNldCBwYXRocyB3aGVyZSB0byBsb29rIGZvcgorICBzZXQoUEFUSF9UT19MT09LX0ZPUiAiJHtfbGliX2Vudn0iKQorCisgICMgVHJ5IHRvIGZpbmQgdGhlIGh3bG9jIGxpYiBpbiB0aGUgZ2l2ZW4gcGF0aHMKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIyBjYWxsIGNtYWtlIG1hY3JvIHRvIGZpbmQgdGhlIGxpYiBwYXRoCisgIGlmKEhXTE9DX0xJQkRJUikKKyAgICBzZXQoSFdMT0NfaHdsb2NfTElCUkFSWSAiSFdMT0NfaHdsb2NfTElCUkFSWS1OT1RGT1VORCIpCisgICAgZmluZF9saWJyYXJ5KEhXTE9DX2h3bG9jX0xJQlJBUlkKKyAgICAgIE5BTUVTIGh3bG9jCisgICAgICBISU5UUyAke0hXTE9DX0xJQkRJUn0pCisgIGVsc2UoKQorICAgIGlmKEhXTE9DX0RJUikKKyAgICAgIHNldChIV0xPQ19od2xvY19MSUJSQVJZICJIV0xPQ19od2xvY19MSUJSQVJZLU5PVEZPVU5EIikKKyAgICAgIGZpbmRfbGlicmFyeShIV0xPQ19od2xvY19MSUJSQVJZCisJTkFNRVMgaHdsb2MKKwlISU5UUyAke0hXTE9DX0RJUn0KKwlQQVRIX1NVRkZJWEVTIGxpYiBsaWIzMiBsaWI2NCkKKyAgICBlbHNlKCkKKyAgICAgIHNldChIV0xPQ19od2xvY19MSUJSQVJZICJIV0xPQ19od2xvY19MSUJSQVJZLU5PVEZPVU5EIikKKyAgICAgIGZpbmRfbGlicmFyeShIV0xPQ19od2xvY19MSUJSQVJZCisJTkFNRVMgaHdsb2MKKwlISU5UUyAke1BBVEhfVE9fTE9PS19GT1J9KQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBtYXJrX2FzX2FkdmFuY2VkKEhXTE9DX2h3bG9jX0xJQlJBUlkpCisKKyAgIyBJZiBmb3VuZCwgYWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgKEhXTE9DX2h3bG9jX0xJQlJBUlkpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChod2xvY19saWJfcGF0aCAke0hXTE9DX2h3bG9jX0xJQlJBUll9IFBBVEgpCisgICAgIyBzZXQgY21ha2UgdmFyaWFibGVzIChyZXNwZWN0cyBuYW1pbmcgY29udmVudGlvbikKKyAgICBzZXQoSFdMT0NfTElCUkFSSUVTICAgICIke0hXTE9DX2h3bG9jX0xJQlJBUll9IikKKyAgICBzZXQoSFdMT0NfTElCUkFSWV9ESVJTICIke2h3bG9jX2xpYl9wYXRofSIpCisgIGVsc2UgKCkKKyAgICBzZXQoSFdMT0NfTElCUkFSSUVTICAgICJIV0xPQ19MSUJSQVJJRVMtTk9URk9VTkQiKQorICAgIHNldChIV0xPQ19MSUJSQVJZX0RJUlMgIkhXTE9DX0xJQlJBUllfRElSUy1OT1RGT1VORCIpCisgICAgaWYoTk9UIEhXTE9DX0ZJTkRfUVVJRVRMWSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBod2xvYyAtLSBsaWIgaHdsb2Mgbm90IGZvdW5kIikKKyAgICBlbmRpZigpCisgIGVuZGlmICgpCisKKyAgaWYgKEhXTE9DX0xJQlJBUllfRElSUykKKyAgICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIEhXTE9DX0xJQlJBUllfRElSUykKKyAgZW5kaWYgKCkKKworICAjIGNoZWNrIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGZpbmQKKyAgaWYoSFdMT0NfTElCUkFSSUVTKQorCisgICAgc2V0KFJFUVVJUkVEX0lOQ0RJUlMpCisgICAgc2V0KFJFUVVJUkVEX0xJQkRJUlMpCisgICAgc2V0KFJFUVVJUkVEX0xJQlMpCisKKyAgICAjIEhXTE9DCisgICAgaWYgKEhXTE9DX0lOQ0xVREVfRElSUykKKyAgICAgIHNldChSRVFVSVJFRF9JTkNESVJTICIke0hXTE9DX0lOQ0xVREVfRElSU30iKQorICAgIGVuZGlmKCkKKyAgICBpZiAoSFdMT0NfTElCUkFSWV9ESVJTKQorICAgICAgc2V0KFJFUVVJUkVEX0xJQkRJUlMgIiR7SFdMT0NfTElCUkFSWV9ESVJTfSIpCisgICAgZW5kaWYoKQorICAgIHNldChSRVFVSVJFRF9MSUJTICIke0hXTE9DX0xJQlJBUklFU30iKQorCisgICAgIyBzZXQgcmVxdWlyZWQgbGlicmFyaWVzIGZvciBsaW5rCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke1JFUVVJUkVEX0lOQ0RJUlN9IikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorICAgIGZvcmVhY2gobGliX2RpciAke1JFUVVJUkVEX0xJQkRJUlN9KQorICAgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICItTCR7bGliX2Rpcn0iKQorICAgIGVuZGZvcmVhY2goKQorICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiJHtSRVFVSVJFRF9MSUJTfSIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl4gLSIgIi0iIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKKworICAgICMgdGVzdCBsaW5rCisgICAgdW5zZXQoSFdMT0NfV09SS1MgQ0FDSEUpCisgICAgaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhod2xvY190b3BvbG9neV9pbml0IEhXTE9DX1dPUktTKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoSFdMT0NfV09SS1MpCisKKyAgICBpZihOT1QgSFdMT0NfV09SS1MpCisgICAgICBpZihOT1QgSFdMT0NfRklORF9RVUlFVExZKQorCW1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBod2xvYyA6IHRlc3Qgb2YgaHdsb2NfdG9wb2xvZ3lfaW5pdCB3aXRoIGh3bG9jIGxpYnJhcnkgZmFpbHMiKQorCW1lc3NhZ2UoU1RBVFVTICJDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVM6ICR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCisJbWVzc2FnZShTVEFUVVMgIkNNQUtFX1JFUVVJUkVEX0lOQ0xVREVTOiAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTfSIpCisJbWVzc2FnZShTVEFUVVMgIkNoZWNrIGluIENNYWtlRmlsZXMvQ01ha2VFcnJvci5sb2cgdG8gZmlndXJlIG91dCB3aHkgaXQgZmFpbHMiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCisgIGVuZGlmKEhXTE9DX0xJQlJBUklFUykKKworZW5kaWYoIChOT1QgUEtHX0NPTkZJR19FWEVDVVRBQkxFKSBPUiAoUEtHX0NPTkZJR19FWEVDVVRBQkxFIEFORCBOT1QgSFdMT0NfRk9VTkQpIE9SIChIV0xPQ19HSVZFTl9CWV9VU0VSKSApCisKK2lmIChIV0xPQ19MSUJSQVJJRVMpCisgIGlmIChIV0xPQ19MSUJSQVJZX0RJUlMpCisgICAgbGlzdChHRVQgSFdMT0NfTElCUkFSWV9ESVJTIDAgZmlyc3RfbGliX3BhdGgpCisgIGVsc2UoKQorICAgIGxpc3QoR0VUIEhXTE9DX0xJQlJBUklFUyAwIGZpcnN0X2xpYikKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KGZpcnN0X2xpYl9wYXRoICIke2ZpcnN0X2xpYn0iIFBBVEgpCisgIGVuZGlmKCkKKyAgaWYgKCR7Zmlyc3RfbGliX3BhdGh9IE1BVENIRVMgIi9saWIoMzJ8NjQpPyQiKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvbGliKDMyfDY0KT8kIiAiIiBub3RfY2FjaGVkX2RpciAiJHtmaXJzdF9saWJfcGF0aH0iKQorICAgIHNldChIV0xPQ19ESVJfRk9VTkQgIiR7bm90X2NhY2hlZF9kaXJ9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIEhXTE9DIGxpYnJhcnkiIEZPUkNFKQorICBlbHNlKCkKKyAgICBzZXQoSFdMT0NfRElSX0ZPVU5EICIke2ZpcnN0X2xpYl9wYXRofSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBIV0xPQyBsaWJyYXJ5IiBGT1JDRSkKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFya19hc19hZHZhbmNlZChIV0xPQ19ESVIpCittYXJrX2FzX2FkdmFuY2VkKEhXTE9DX0RJUl9GT1VORCkKKworIyBjaGVjayB0aGF0IEhXTE9DIGhhcyBiZWVuIGZvdW5kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitpZiAoUEtHX0NPTkZJR19FWEVDVVRBQkxFIEFORCBIV0xPQ19GT1VORCkKKyAgZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEhXTE9DIERFRkFVTFRfTVNHCisgICAgSFdMT0NfTElCUkFSSUVTKQorZWxzZSgpCisgIGZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhIV0xPQyBERUZBVUxUX01TRworICAgIEhXTE9DX0xJQlJBUklFUworICAgIEhXTE9DX1dPUktTKQorZW5kaWYoKQorCitpZiAoSFdMT0NfRk9VTkQpCisgIHNldChIV0xPQ19TQVZFX0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVN9KQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0hXTE9DX0lOQ0xVREVfRElSU30pCisKKyAgIyB0ZXN0IGhlYWRlcnMgdG8gZ3Vlc3MgdGhlIHZlcnNpb24KKyAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoICJzdHJ1Y3QgaHdsb2Nfb2JqIiBwYXJlbnQgaHdsb2MuaCBIQVZFX0hXTE9DX1BBUkVOVF9NRU1CRVIgKQorICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlciggInN0cnVjdCBod2xvY19jYWNoZV9hdHRyX3MiIHNpemUgaHdsb2MuaCBIQVZFX0hXTE9DX0NBQ0hFX0FUVFIgKQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcyggIiNpbmNsdWRlIDxod2xvYy5oPgorCSAgICBpbnQgbWFpbih2b2lkKSB7IGh3bG9jX29ial90IG87IG8tPnR5cGUgPSBIV0xPQ19PQkpfUFU7IHJldHVybiAwO30iIEhBVkVfSFdMT0NfT0JKX1BVKQorICBpbmNsdWRlKENoZWNrTGlicmFyeUV4aXN0cykKKyAgY2hlY2tfbGlicmFyeV9leGlzdHMoJHtIV0xPQ19MSUJSQVJJRVN9IGh3bG9jX2JpdG1hcF9mcmVlICIiIEhBVkVfSFdMT0NfQklUTUFQKQorCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0hXTE9DX1NBVkVfQ01BS0VfUkVRVUlSRURfSU5DTFVERVN9KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZExBUEFDSy5jbWFrZSBiL2NtYWtlL0ZpbmRMQVBBQ0suY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYWUyMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRMQVBBQ0suY21ha2UKQEAgLTAsMCArMSwyNzMgQEAKKyMgRmluZCBMQVBBQ0sgbGlicmFyeQorIworIyBUaGlzIG1vZHVsZSBmaW5kcyBhbiBpbnN0YWxsZWQgbGlicmFyeSB0aGF0IGltcGxlbWVudHMgdGhlIExBUEFDSworIyBsaW5lYXItYWxnZWJyYSBpbnRlcmZhY2UgKHNlZSBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrLykuCisjIFRoZSBhcHByb2FjaCBmb2xsb3dzIG1vc3RseSB0aGF0IHRha2VuIGZvciB0aGUgYXV0b2NvbmYgbWFjcm8gZmlsZSwgYWN4X2xhcGFjay5tNAorIyAoZGlzdHJpYnV0ZWQgYXQgaHR0cDovL2FjLWFyY2hpdmUuc291cmNlZm9yZ2UubmV0L2FjLWFyY2hpdmUvYWN4X2xhcGFjay5odG1sKS4KKyMKKyMgVGhpcyBtb2R1bGUgc2V0cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyMgIExBUEFDS19GT1VORCAtIHNldCB0byB0cnVlIGlmIGEgbGlicmFyeSBpbXBsZW1lbnRpbmcgdGhlIExBUEFDSyBpbnRlcmZhY2UKKyMgICAgaXMgZm91bmQKKyMgIExBUEFDS19JTkNMVURFX0RJUiAtIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIExBUEFDSyBoZWFkZXIgZmlsZXMKKyMgIExBUEFDS19ERUZJTklUSU9OUyAtIENvbXBpbGF0aW9uIG9wdGlvbnMgdG8gdXNlIExBUEFDSworIyAgTEFQQUNLX0xJTktFUl9GTEFHUyAtIExpbmtlciBmbGFncyB0byB1c2UgTEFQQUNLIChleGNsdWRpbmcgLWwKKyMgICAgYW5kIC1MKS4KKyMgIExBUEFDS19MSUJSQVJJRVNfRElSIC0gRGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgTEFQQUNLIGxpYnJhcmllcy4KKyMgICAgIE1heSBiZSBudWxsIGlmIExBUEFDS19MSUJSQVJJRVMgY29udGFpbnMgbGlicmFyaWVzIG5hbWUgdXNpbmcgZnVsbCBwYXRoLgorIyAgTEFQQUNLX0xJQlJBUklFUyAtIExpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdCBMQVBBQ0sgaW50ZXJmYWNlLgorIyAgICAgTWF5IGJlIG51bGwgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGF1dG8tbGluayAoZS5nLiBWQysrKS4KKyMgIExBUEFDS19VU0VfRklMRSAtIFRoZSBuYW1lIG9mIHRoZSBjbWFrZSBtb2R1bGUgdG8gaW5jbHVkZSB0byBjb21waWxlCisjICAgICBhcHBsaWNhdGlvbnMgb3IgbGlicmFyaWVzIHVzaW5nIExBUEFDSy4KKyMKKyMgVGhpcyBtb2R1bGUgd2FzIG1vZGlmaWVkIGJ5IENHQUwgdGVhbToKKyMgLSBmaW5kIGxpYnJhcmllcyBmb3IgYSBDKysgY29tcGlsZXIsIGluc3RlYWQgb2YgRm9ydHJhbgorIyAtIGFkZGVkIExBUEFDS19JTkNMVURFX0RJUiwgTEFQQUNLX0RFRklOSVRJT05TIGFuZCBMQVBBQ0tfTElCUkFSSUVTX0RJUgorIyAtIHJlbW92ZWQgTEFQQUNLOTVfTElCUkFSSUVTCisKKworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQorCisjIFRoaXMgbWFjcm8gY2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21iaW5hdGlvbiBvZiBmb3J0cmFuIGxpYnJhcmllcworIyBnaXZlbiBieSBfbGlzdC4gIElmIHRoZSBjb21iaW5hdGlvbiBpcyBmb3VuZCwgdGhpcyBtYWNybyBjaGVja3MgKHVzaW5nIHRoZQorIyBjaGVja19mdW5jdGlvbl9leGlzdHMgbWFjcm8pIHdoZXRoZXIgY2FuIGxpbmsgYWdhaW5zdCB0aGF0IGxpYnJhcnkKKyMgY29tYmluYXRpb24gdXNpbmcgdGhlIG5hbWUgb2YgYSByb3V0aW5lIGdpdmVuIGJ5IF9uYW1lIHVzaW5nIHRoZSBsaW5rZXIKKyMgZmxhZ3MgZ2l2ZW4gYnkgX2ZsYWdzLiAgSWYgdGhlIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyBpcyBmb3VuZCBhbmQgcGFzc2VzCisjIHRoZSBsaW5rIHRlc3QsIExJQlJBUklFUyBpcyBzZXQgdG8gdGhlIGxpc3Qgb2YgY29tcGxldGUgbGlicmFyeSBwYXRocyB0aGF0CisjIGhhdmUgYmVlbiBmb3VuZCBhbmQgREVGSU5JVElPTlMgdG8gdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zLgorIyBPdGhlcndpc2UsIExJQlJBUklFUyBpcyBzZXQgdG8gRkFMU0UuCisjIE4uQi4gX3ByZWZpeCBpcyB0aGUgcHJlZml4IGFwcGxpZWQgdG8gdGhlIG5hbWVzIG9mIGFsbCBjYWNoZWQgdmFyaWFibGVzIHRoYXQKKyMgYXJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGFuZCBtYXJrZWQgYWR2YW5jZWQgYnkgdGhpcyBtYWNyby4KK21hY3JvKGNoZWNrX2xhcGFja19saWJyYXJpZXMgREVGSU5JVElPTlMgTElCUkFSSUVTIF9wcmVmaXggX25hbWUgX2ZsYWdzIF9saXN0IF9ibGFzIF9wYXRoKQorICAjbWVzc2FnZSgiREVCVUc6IGNoZWNrX2xhcGFja19saWJyYXJpZXMoJHtfbGlzdH0gaW4gJHtfcGF0aH0gd2l0aCAke19ibGFzfSkiKQorCisgICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGxpYnJhcmllcyBnaXZlbiBieSBfbGlzdAorICBzZXQoX2xpYnJhcmllc19mb3VuZCBUUlVFKQorICBzZXQoX2xpYnJhcmllc193b3JrIEZBTFNFKQorICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgIHNldCgke0xJQlJBUklFU30gIiIpCisgIHNldChfY29tYmluZWRfbmFtZSkKKyAgZm9yZWFjaChfbGlicmFyeSAke19saXN0fSkKKyAgICBzZXQoX2NvbWJpbmVkX25hbWUgJHtfY29tYmluZWRfbmFtZX1fJHtfbGlicmFyeX0pCisKKyAgICBpZihfbGlicmFyaWVzX2ZvdW5kKQorICAgICAgIyBzZWFyY2ggZmlyc3QgaW4gJHtfcGF0aH0KKyAgICAgIGZpbmRfbGlicmFyeSgke19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUlkKKyAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICBQQVRIUyAke19wYXRofSBOT19ERUZBVUxUX1BBVEgKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICMgaWYgbm90IGZvdW5kLCBzZWFyY2ggaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzeXN0ZW0KKyAgICAgIGlmICggV0lOMzIgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIEVOViBMSUIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZWlmICggQVBQTEUgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgRFlMRF9MSUJSQVJZX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZSAoKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgTERfTElCUkFSWV9QQVRICisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIGVuZGlmKCkKKyAgICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZKQorICAgICAgc2V0KCR7TElCUkFSSUVTfSAkeyR7TElCUkFSSUVTfX0gJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgIGVuZGlmKF9saWJyYXJpZXNfZm91bmQpCisgIGVuZGZvcmVhY2goX2xpYnJhcnkgJHtfbGlzdH0pCisgIGlmKF9saWJyYXJpZXNfZm91bmQpCisgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske0xJQlJBUklFU319KQorICBlbmRpZigpCisKKyAgIyBUZXN0IHRoaXMgY29tYmluYXRpb24gb2YgbGlicmFyaWVzIHdpdGggdGhlIEZvcnRyYW4vZjJjIGludGVyZmFjZS4KKyAgIyBXZSB0ZXN0IHRoZSBGb3J0cmFuIGludGVyZmFjZSBmaXJzdCBhcyBpdCBpcyB3ZWxsIHN0YW5kYXJkaXplZC4KKyAgaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gICItRCR7X3ByZWZpeH1fVVNFX0YyQyIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgICAke19saWJyYXJpZXNfZm91bmR9KQorICAgICMgU29tZSBDKysgbGlua2VycyByZXF1aXJlIHRoZSBmMmMgbGlicmFyeSB0byBsaW5rIHdpdGggRm9ydHJhbiBsaWJyYXJpZXMuCisgICAgIyBJIGRvIG5vdCBrbm93IHdoaWNoIG9uZXMsIHRodXMgSSBqdXN0IGFkZCB0aGUgZjJjIGxpYnJhcnkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICAgIGZpbmRfcGFja2FnZSggRjJDIFFVSUVUICkKKyAgICBpZiAoIEYyQ19GT1VORCApCisgICAgICBzZXQoJHtERUZJTklUSU9OU30gICR7JHtERUZJTklUSU9OU319ICR7RjJDX0RFRklOSVRJT05TfSkKKyAgICAgIHNldCgke0xJQlJBUklFU30gICAgJHske0xJQlJBUklFU319ICR7RjJDX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAgJHske0RFRklOSVRJT05TfX0pCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICAke19mbGFnc30gJHske0xJQlJBUklFU319ICR7X2JsYXN9KQorICAgICNtZXNzYWdlKCJERUJVRzogQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSAke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSIpCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgICMgQ2hlY2sgaWYgZnVuY3Rpb24gZXhpc3RzIHdpdGggZjJjIGNhbGxpbmcgY29udmVudGlvbiAoaWUgYSB0cmFpbGluZyB1bmRlcnNjb3JlKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfV8gJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICAgICIiKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KF9saWJyYXJpZXNfd29yayAkeyR7X3ByZWZpeH1fJHtfbmFtZX1fJHtfY29tYmluZWRfbmFtZX1fZjJjX1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIElmIG5vdCBmb3VuZCwgdGVzdCB0aGlzIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyB3aXRoIGEgQyBpbnRlcmZhY2UuCisgICMgQSBmZXcgaW1wbGVtZW50YXRpb25zIChpZSBBQ01MKSBwcm92aWRlIGEgQyBpbnRlcmZhY2UuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHN0YW5kYXJkLgorICBpZihfbGlicmFyaWVzX2ZvdW5kIEFORCBOT1QgX2xpYnJhcmllc193b3JrKQorICAgIHNldCgke0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoJHtMSUJSQVJJRVN9ICAgJHtfbGlicmFyaWVzX2ZvdW5kfSkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiIpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICR7X2ZsYWdzfSAkeyR7TElCUkFSSUVTfX0gJHtfYmxhc30pCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfSAke19wcmVmaXh9XyR7X25hbWV9JHtfY29tYmluZWRfbmFtZX1fV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiIikKKyAgICBtYXJrX2FzX2FkdmFuY2VkKCR7X3ByZWZpeH1fJHtfbmFtZX0ke19jb21iaW5lZF9uYW1lfV9XT1JLUykKKyAgICBzZXQoX2xpYnJhcmllc193b3JrICR7JHtfcHJlZml4fV8ke19uYW1lfSR7X2NvbWJpbmVkX25hbWV9X1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIG9uIGZhaWx1cmUKKyAgaWYoTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgIEZBTFNFKQorICBlbmRpZigpCisgICNtZXNzYWdlKCJERUJVRzogJHtERUZJTklUSU9OU30gPSAkeyR7REVGSU5JVElPTlN9fSIpCisgICNtZXNzYWdlKCJERUJVRzogJHtMSUJSQVJJRVN9ID0gJHske0xJQlJBUklFU319IikKK2VuZG1hY3JvKGNoZWNrX2xhcGFja19saWJyYXJpZXMpCisKKworIworIyBtYWluCisjCisKKyMgTEFQQUNLIHJlcXVpcmVzIEJMQVMKK2lmKExBUEFDS19GSU5EX1FVSUVUTFkgT1IgTk9UIExBUEFDS19GSU5EX1JFUVVJUkVEKQorICBmaW5kX3BhY2thZ2UoQkxBUykKK2Vsc2UoKQorICBmaW5kX3BhY2thZ2UoQkxBUyBSRVFVSVJFRCkKK2VuZGlmKCkKKworaWYgKE5PVCBCTEFTX0ZPVU5EKQorCisgIG1lc3NhZ2UoU1RBVFVTICJMQVBBQ0sgcmVxdWlyZXMgQkxBUy4iKQorICBzZXQoTEFQQUNLX0ZPVU5EIEZBTFNFKQorCisjIElzIGl0IGFscmVhZHkgY29uZmlndXJlZD8KK2Vsc2VpZiAoTEFQQUNLX0xJQlJBUklFU19ESVIgT1IgTEFQQUNLX0xJQlJBUklFUykKKworICBzZXQoTEFQQUNLX0ZPVU5EIFRSVUUpCisKK2Vsc2UoKQorCisgICMgcmVzZXQgdmFyaWFibGVzCisgIHNldCggTEFQQUNLX0lOQ0xVREVfRElSICIiICkKKyAgc2V0KCBMQVBBQ0tfREVGSU5JVElPTlMgIiIgKQorICBzZXQoIExBUEFDS19MSU5LRVJfRkxBR1MgIiIgKSAjIHVudXNlZCAoeWV0KQorICBzZXQoIExBUEFDS19MSUJSQVJJRVMgIiIgKQorICBzZXQoIExBUEFDS19MSUJSQVJJRVNfRElSICIiICkKKworICAgICMKKyAgICAjIElmIFVuaXgsIHNlYXJjaCBmb3IgTEFQQUNLIGZ1bmN0aW9uIGluIHBvc3NpYmxlIGxpYnJhcmllcworICAgICMKKworICAgICNpbnRlbCBta2wgbGFwYWNrPworICAgIGlmKE5PVCBMQVBBQ0tfTElCUkFSSUVTKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJta2xfbGFwYWNrIgorICAgICAgIiR7QkxBU19MSUJSQVJJRVN9IgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgTEFQQUNLX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgI2FjbWwgbGFwYWNrPworICAgIGlmKE5PVCBMQVBBQ0tfTElCUkFSSUVTKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJhY21sIgorICAgICAgIiR7QkxBU19MSUJSQVJJRVN9IgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgTEFQQUNLX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBBcHBsZSBMQVBBQ0sgbGlicmFyeT8KKyAgICBpZihOT1QgTEFQQUNLX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2xhcGFja19saWJyYXJpZXMoCisgICAgICBMQVBBQ0tfREVGSU5JVElPTlMKKyAgICAgIExBUEFDS19MSUJSQVJJRVMKKyAgICAgIExBUEFDSworICAgICAgY2hlZXYKKyAgICAgICIiCisgICAgICAiQWNjZWxlcmF0ZSIKKyAgICAgICIke0JMQVNfTElCUkFSSUVTfSIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIExBUEFDS19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgIGlmICggTk9UIExBUEFDS19MSUJSQVJJRVMgKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJ2ZWNMaWIiCisgICAgICAiJHtCTEFTX0xJQlJBUklFU30iCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBMQVBBQ0tfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZiAoIE5PVCBMQVBBQ0tfTElCUkFSSUVTICkKKworICAgICMgR2VuZXJpYyBMQVBBQ0sgbGlicmFyeT8KKyAgICAjIFRoaXMgY29uZmlndXJhdGlvbiAqbXVzdCogYmUgdGhlIGxhc3QgdHJ5IGFzIHRoaXMgbGlicmFyeSBpcyBub3RhYmx5IHNsb3cuCisgICAgaWYgKCBOT1QgTEFQQUNLX0xJQlJBUklFUyApCisgICAgICBjaGVja19sYXBhY2tfbGlicmFyaWVzKAorICAgICAgTEFQQUNLX0RFRklOSVRJT05TCisgICAgICBMQVBBQ0tfTElCUkFSSUVTCisgICAgICBMQVBBQ0sKKyAgICAgIGNoZWV2CisgICAgICAiIgorICAgICAgImxhcGFjayIKKyAgICAgICIke0JMQVNfTElCUkFSSUVTfSIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIExBUEFDS19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICBpZihMQVBBQ0tfTElCUkFSSUVTX0RJUiBPUiBMQVBBQ0tfTElCUkFSSUVTKQorICAgIHNldChMQVBBQ0tfRk9VTkQgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExBUEFDS19GT1VORCBGQUxTRSkKKyAgZW5kaWYoKQorCisgIGlmKE5PVCBMQVBBQ0tfRklORF9RVUlFVExZKQorICAgIGlmKExBUEFDS19GT1VORCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBIGxpYnJhcnkgd2l0aCBMQVBBQ0sgQVBJIGZvdW5kLiIpCisgICAgZWxzZShMQVBBQ0tfRk9VTkQpCisgICAgICBpZihMQVBBQ0tfRklORF9SRVFVSVJFRCkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQSByZXF1aXJlZCBsaWJyYXJ5IHdpdGggTEFQQUNLIEFQSSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb24uIikKKyAgICAgIGVsc2UoKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiQSBsaWJyYXJ5IHdpdGggTEFQQUNLIEFQSSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb24uIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZihMQVBBQ0tfRk9VTkQpCisgIGVuZGlmKE5PVCBMQVBBQ0tfRklORF9RVUlFVExZKQorCisgICMgQWRkIHZhcmlhYmxlcyB0byBjYWNoZQorICBzZXQoIExBUEFDS19JTkNMVURFX0RJUiAgICIke0xBUEFDS19JTkNMVURFX0RJUn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgUEFUSCAiRGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgTEFQQUNLIGhlYWRlciBmaWxlcyIgRk9SQ0UgKQorICBzZXQoIExBUEFDS19ERUZJTklUSU9OUyAgICIke0xBUEFDS19ERUZJTklUSU9OU30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJDb21waWxhdGlvbiBvcHRpb25zIHRvIHVzZSBMQVBBQ0siIEZPUkNFICkKKyAgc2V0KCBMQVBBQ0tfTElOS0VSX0ZMQUdTICAiJHtMQVBBQ0tfTElOS0VSX0ZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBTVFJJTkcgIkxpbmtlciBmbGFncyB0byB1c2UgTEFQQUNLIiBGT1JDRSApCisgIHNldCggTEFQQUNLX0xJQlJBUklFUyAgICAgIiR7TEFQQUNLX0xJQlJBUklFU30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgRklMRVBBVEggIkxBUEFDSyBsaWJyYXJpZXMgbmFtZSIgRk9SQ0UgKQorICBzZXQoIExBUEFDS19MSUJSQVJJRVNfRElSICIke0xBUEFDS19MSUJSQVJJRVNfRElSfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBQQVRIICJEaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBMQVBBQ0sgbGlicmFyaWVzIiBGT1JDRSApCisKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfSU5DTFVERV9ESVIgPSAke0xBUEFDS19JTkNMVURFX0RJUn0iKQorICAjbWVzc2FnZSgiREVCVUc6IExBUEFDS19ERUZJTklUSU9OUyA9ICR7TEFQQUNLX0RFRklOSVRJT05TfSIpCisgICNtZXNzYWdlKCJERUJVRzogTEFQQUNLX0xJTktFUl9GTEFHUyA9ICR7TEFQQUNLX0xJTktFUl9GTEFHU30iKQorICAjbWVzc2FnZSgiREVCVUc6IExBUEFDS19MSUJSQVJJRVMgPSAke0xBUEFDS19MSUJSQVJJRVN9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfTElCUkFSSUVTX0RJUiA9ICR7TEFQQUNLX0xJQlJBUklFU19ESVJ9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfRk9VTkQgPSAke0xBUEFDS19GT1VORH0iKQorCitlbmRpZihOT1QgQkxBU19GT1VORCkKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRNUEZSLmNtYWtlIGIvY21ha2UvRmluZE1QRlIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0YzJjZAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRNUEZSLmNtYWtlCkBAIC0wLDAgKzEsODMgQEAKKyMgVHJ5IHRvIGZpbmQgdGhlIE1QRlIgbGlicmFyeQorIyBTZWUgaHR0cDovL3d3dy5tcGZyLm9yZy8KKyMKKyMgVGhpcyBtb2R1bGUgc3VwcG9ydHMgcmVxdWlyaW5nIGEgbWluaW11bSB2ZXJzaW9uLCBlLmcuIHlvdSBjYW4gZG8KKyMgICBmaW5kX3BhY2thZ2UoTVBGUiAyLjMuMCkKKyMgdG8gcmVxdWlyZSB2ZXJzaW9uIDIuMy4wIHRvIG5ld2VyIG9mIE1QRlIuCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBNUEZSX0ZPVU5EIC0gc3lzdGVtIGhhcyBNUEZSIGxpYiB3aXRoIGNvcnJlY3QgdmVyc2lvbgorIyAgTVBGUl9JTkNMVURFUyAtIHRoZSBNUEZSIGluY2x1ZGUgZGlyZWN0b3J5CisjICBNUEZSX0xJQlJBUklFUyAtIHRoZSBNUEZSIGxpYnJhcnkKKyMgIE1QRlJfVkVSU0lPTiAtIE1QRlIgdmVyc2lvbgorCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgR2FlbCBHdWVubmViYXVkLCA8Zy5nYWVsQGZyZWUuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMCBKaXRzZSBOaWVzZW4sIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorCisjIFNldCBNUEZSX0lOQ0xVREVTCisKK2ZpbmRfcGF0aChNUEZSX0lOQ0xVREVTCisgIE5BTUVTCisgIG1wZnIuaAorICBQQVRIUworICAkRU5We0dNUERJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCisjIFNldCBNUEZSX0ZJTkRfVkVSU0lPTiB0byAxLjAuMCBpZiBubyBtaW5pbXVtIHZlcnNpb24gaXMgc3BlY2lmaWVkCisKK2lmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTikKKyAgaWYoTk9UIE1QRlJfRklORF9WRVJTSU9OX01BSk9SKQorICAgIHNldChNUEZSX0ZJTkRfVkVSU0lPTl9NQUpPUiAxKQorICBlbmRpZihOT1QgTVBGUl9GSU5EX1ZFUlNJT05fTUFKT1IpCisgIGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgICBzZXQoTVBGUl9GSU5EX1ZFUlNJT05fTUlOT1IgMCkKKyAgZW5kaWYoTk9UIE1QRlJfRklORF9WRVJTSU9OX01JTk9SKQorICBpZihOT1QgTVBGUl9GSU5EX1ZFUlNJT05fUEFUQ0gpCisgICAgc2V0KE1QRlJfRklORF9WRVJTSU9OX1BBVENIIDApCisgIGVuZGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTl9QQVRDSCkKKworICBzZXQoTVBGUl9GSU5EX1ZFUlNJT04gIiR7TVBGUl9GSU5EX1ZFUlNJT05fTUFKT1J9LiR7TVBGUl9GSU5EX1ZFUlNJT05fTUlOT1J9LiR7TVBGUl9GSU5EX1ZFUlNJT05fUEFUQ0h9IikKK2VuZGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTikKKworCitpZihNUEZSX0lOQ0xVREVTKQorCisgICMgU2V0IE1QRlJfVkVSU0lPTgorICAKKyAgZmlsZShSRUFEICIke01QRlJfSU5DTFVERVN9L21wZnIuaCIgX21wZnJfdmVyc2lvbl9oZWFkZXIpCisgIAorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9NQUpPUlsgXHRdKyhbMC05XSspIiBfbXBmcl9tYWpvcl92ZXJzaW9uX21hdGNoICIke19tcGZyX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChNUEZSX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9NSU5PUlsgXHRdKyhbMC05XSspIiBfbXBmcl9taW5vcl92ZXJzaW9uX21hdGNoICIke19tcGZyX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChNUEZSX01JTk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9QQVRDSExFVkVMWyBcdF0rKFswLTldKykiIF9tcGZyX3BhdGNobGV2ZWxfdmVyc2lvbl9tYXRjaCAiJHtfbXBmcl92ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoTVBGUl9QQVRDSExFVkVMX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAKKyAgc2V0KE1QRlJfVkVSU0lPTiAke01QRlJfTUFKT1JfVkVSU0lPTn0uJHtNUEZSX01JTk9SX1ZFUlNJT059LiR7TVBGUl9QQVRDSExFVkVMX1ZFUlNJT059KQorICAKKyAgIyBDaGVjayB3aGV0aGVyIGZvdW5kIHZlcnNpb24gZXhjZWVkcyBtaW5pbXVtIHZlcnNpb24KKyAgCisgIGlmKCR7TVBGUl9WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtNUEZSX0ZJTkRfVkVSU0lPTn0pCisgICAgc2V0KE1QRlJfVkVSU0lPTl9PSyBGQUxTRSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTVBGUiB2ZXJzaW9uICR7TVBGUl9WRVJTSU9OfSBmb3VuZCBpbiAke01QRlJfSU5DTFVERVN9LCAiCisgICAgICAgICAgICAgICAgICAgImJ1dCBhdCBsZWFzdCB2ZXJzaW9uICR7TVBGUl9GSU5EX1ZFUlNJT059IGlzIHJlcXVpcmVkIikKKyAgZWxzZSgke01QRlJfVkVSU0lPTn0gVkVSU0lPTl9MRVNTICR7TVBGUl9GSU5EX1ZFUlNJT059KQorICAgIHNldChNUEZSX1ZFUlNJT05fT0sgVFJVRSkKKyAgZW5kaWYoJHtNUEZSX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke01QRlJfRklORF9WRVJTSU9OfSkKKworZW5kaWYoTVBGUl9JTkNMVURFUykKKworIyBTZXQgTVBGUl9MSUJSQVJJRVMKKworZmluZF9saWJyYXJ5KE1QRlJfTElCUkFSSUVTIG1wZnIgUEFUSFMgJEVOVntHTVBESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworIyBFcGlsb2d1ZQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE1QRlIgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEZSX0lOQ0xVREVTIE1QRlJfTElCUkFSSUVTIE1QRlJfVkVSU0lPTl9PSykKK21hcmtfYXNfYWR2YW5jZWQoTVBGUl9JTkNMVURFUyBNUEZSX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRNZXRpcy5jbWFrZSBiL2NtYWtlL0ZpbmRNZXRpcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTJmMWYxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZE1ldGlzLmNtYWtlCkBAIC0wLDAgKzEsMjY0IEBACisjIyMKKyMKKyMgQGNvcHlyaWdodCAoYykgMjAwOS0yMDE0IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IElucmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQm9yZGVhdXggSU5QLCBDTlJTIChMYUJSSSBVTVIgNTgwMCksIElucmlhLCBVbml2LiBCb3JkZWF1eC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMjIworIworIyAtIEZpbmQgTUVUSVMgaW5jbHVkZSBkaXJzIGFuZCBsaWJyYXJpZXMKKyMgVXNlIHRoaXMgbW9kdWxlIGJ5IGludm9raW5nIGZpbmRfcGFja2FnZSB3aXRoIHRoZSBmb3JtOgorIyAgZmluZF9wYWNrYWdlKE1FVElTCisjICAgICAgICAgICAgICAgW1JFUVVJUkVEXSAgICAgICAgICAgICAjIEZhaWwgd2l0aCBlcnJvciBpZiBtZXRpcyBpcyBub3QgZm91bmQKKyMgICAgICAgICAgICAgICkKKyMKKyMgVGhpcyBtb2R1bGUgZmluZHMgaGVhZGVycyBhbmQgbWV0aXMgbGlicmFyeS4KKyMgUmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gdmFyaWFibGVzOgorIyAgTUVUSVNfRk9VTkQgICAgICAgICAgIC0gVHJ1ZSBpZiBoZWFkZXJzIGFuZCByZXF1ZXN0ZWQgbGlicmFyaWVzIHdlcmUgZm91bmQKKyMgIE1FVElTX0lOQ0xVREVfRElSUyAgICAtIG1ldGlzIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIE1FVElTX0xJQlJBUllfRElSUyAgICAtIExpbmsgZGlyZWN0b3JpZXMgZm9yIG1ldGlzIGxpYnJhcmllcworIyAgTUVUSVNfTElCUkFSSUVTICAgICAgIC0gbWV0aXMgY29tcG9uZW50IGxpYnJhcmllcyB0byBiZSBsaW5rZWQKKyMKKyMgVGhlIHVzZXIgY2FuIGdpdmUgc3BlY2lmaWMgcGF0aHMgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyaWVzIGFkZGluZyBjbWFrZQorIyBvcHRpb25zIGF0IGNvbmZpZ3VyZSAoZXg6IGNtYWtlIHBhdGgvdG8vcHJvamVjdCAtRE1FVElTX0RJUj1wYXRoL3RvL21ldGlzKToKKyMgIE1FVElTX0RJUiAgICAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIG1ldGlzCisjICBNRVRJU19JTkNESVIgICAgICAgICAgLSBXaGVyZSB0byBmaW5kIHRoZSBoZWFkZXIgZmlsZXMKKyMgIE1FVElTX0xJQkRJUiAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZXMKKyMgVGhlIG1vZHVsZSBjYW4gYWxzbyBsb29rIGZvciB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZiBwYXRocworIyBhcmUgbm90IGdpdmVuIGFzIGNtYWtlIHZhcmlhYmxlOiBNRVRJU19ESVIsIE1FVElTX0lOQ0RJUiwgTUVUSVNfTElCRElSCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMjAxMi0yMDEzIElucmlhCisjIENvcHlyaWdodCAyMDEyLTIwMTMgRW1tYW51ZWwgQWd1bGxvCisjIENvcHlyaWdodCAyMDEyLTIwMTMgTWF0aGlldSBGYXZlcmdlCisjIENvcHlyaWdodCAyMDEyICAgICAgQ2VkcmljIENhc3RhZ25lZGUKKyMgQ29weXJpZ2h0IDIwMTMgICAgICBGbG9yZW50IFBydXZvc3QKKyMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE9TSS1hcHByb3ZlZCBCU0QgTGljZW5zZSAodGhlICJMaWNlbnNlIik7CisjIHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBNT1JTRS1Db3B5cmlnaHQudHh0IGZvciBkZXRhaWxzLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKFRvIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG91dHNpZGUgb2YgTW9yc2UsIHN1YnN0aXR1dGUgdGhlIGZ1bGwKKyMgIExpY2Vuc2UgdGV4dCBmb3IgdGhlIGFib3ZlIHJlZmVyZW5jZS4pCisKK2lmIChOT1QgTUVUSVNfRk9VTkQpCisgIHNldChNRVRJU19ESVIgIiIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBNRVRJUyBsaWJyYXJ5IikKKyAgaWYgKE5PVCBNRVRJU19GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgY2FjaGUgdmFyaWFibGUsIG5hbWVseSBNRVRJU19ESVIsIGhhcyBiZWVuIHNldCB0byBzcGVjaWZ5IHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBvZiBNRVRJUyIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBMb29raW5nIGZvciBpbmNsdWRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBBZGQgc3lzdGVtIGluY2x1ZGUgcGF0aHMgdG8gc2VhcmNoIGluY2x1ZGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1bnNldChfaW5jX2VudikKK3NldChFTlZfTUVUSVNfRElSICIkRU5We01FVElTX0RJUn0iKQorc2V0KEVOVl9NRVRJU19JTkNESVIgIiRFTlZ7TUVUSVNfSU5DRElSfSIpCitpZihFTlZfTUVUSVNfSU5DRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfTUVUSVNfSU5DRElSfSIpCitlbHNlaWYoRU5WX01FVElTX0RJUikKKyAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX01FVElTX0RJUn0iKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfTUVUSVNfRElSfS9pbmNsdWRlIikKKyAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX01FVElTX0RJUn0vaW5jbHVkZS9tZXRpcyIpCitlbHNlKCkKKyAgaWYoV0lOMzIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfaW5jX2VudiAiJEVOVntJTkNMVURFfSIpCisgIGVsc2UoKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntDX0lOQ0xVREVfUEFUSH0iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NQQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERV9QQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX1BMQVRGT1JNX0lNUExJQ0lUX0lOQ0xVREVfRElSRUNUT1JJRVN9IikKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfaW5jX2VudikKKworCisjIFRyeSB0byBmaW5kIHRoZSBtZXRpcyBoZWFkZXIgaW4gdGhlIGdpdmVuIHBhdGhzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBoZWFkZXIgcGF0aAoraWYoTUVUSVNfSU5DRElSKQorICBzZXQoTUVUSVNfbWV0aXMuaF9ESVJTICJNRVRJU19tZXRpcy5oX0RJUlMtTk9URk9VTkQiKQorICBmaW5kX3BhdGgoTUVUSVNfbWV0aXMuaF9ESVJTCisgICAgTkFNRVMgbWV0aXMuaAorICAgIEhJTlRTICR7TUVUSVNfSU5DRElSfSkKK2Vsc2UoKQorICBpZihNRVRJU19ESVIpCisgICAgc2V0KE1FVElTX21ldGlzLmhfRElSUyAiTUVUSVNfbWV0aXMuaF9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoTUVUSVNfbWV0aXMuaF9ESVJTCisgICAgICBOQU1FUyBtZXRpcy5oCisgICAgICBISU5UUyAke01FVElTX0RJUn0KKyAgICAgIFBBVEhfU1VGRklYRVMgImluY2x1ZGUiICJpbmNsdWRlL21ldGlzIikKKyAgZWxzZSgpCisgICAgc2V0KE1FVElTX21ldGlzLmhfRElSUyAiTUVUSVNfbWV0aXMuaF9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoTUVUSVNfbWV0aXMuaF9ESVJTCisgICAgICBOQU1FUyBtZXRpcy5oCisgICAgICBISU5UUyAke19pbmNfZW52fSkKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFya19hc19hZHZhbmNlZChNRVRJU19tZXRpcy5oX0RJUlMpCisKKworIyBJZiBmb3VuZCwgYWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZiAoTUVUSVNfbWV0aXMuaF9ESVJTKQorICBzZXQoTUVUSVNfSU5DTFVERV9ESVJTICIke01FVElTX21ldGlzLmhfRElSU30iKQorZWxzZSAoKQorICBzZXQoTUVUSVNfSU5DTFVERV9ESVJTICJNRVRJU19JTkNMVURFX0RJUlMtTk9URk9VTkQiKQorICBpZihOT1QgTUVUSVNfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBtZXRpcyAtLSBtZXRpcy5oIG5vdCBmb3VuZCIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworCisjIExvb2tpbmcgZm9yIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0KKworIyBBZGQgc3lzdGVtIGxpYnJhcnkgcGF0aHMgdG8gc2VhcmNoIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordW5zZXQoX2xpYl9lbnYpCitzZXQoRU5WX01FVElTX0xJQkRJUiAiJEVOVntNRVRJU19MSUJESVJ9IikKK2lmKEVOVl9NRVRJU19MSUJESVIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9NRVRJU19MSUJESVJ9IikKK2Vsc2VpZihFTlZfTUVUSVNfRElSKQorICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtFTlZfTUVUSVNfRElSfSIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9NRVRJU19ESVJ9L2xpYiIpCitlbHNlKCkKKyAgaWYoV0lOMzIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntMSUJ9IikKKyAgZWxzZSgpCisgICAgaWYoQVBQTEUpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9saWJfZW52ICIkRU5We0RZTERfTElCUkFSWV9QQVRIfSIpCisgICAgZWxzZSgpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9saWJfZW52ICIkRU5We0xEX0xJQlJBUllfUEFUSH0iKQorICAgIGVuZGlmKCkKKyAgICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtDTUFLRV9QTEFURk9STV9JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7Q01BS0VfQ19JTVBMSUNJVF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2xpc3QoUkVNT1ZFX0RVUExJQ0FURVMgX2xpYl9lbnYpCisKKyMgVHJ5IHRvIGZpbmQgdGhlIG1ldGlzIGxpYiBpbiB0aGUgZ2l2ZW4gcGF0aHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjYWxsIGNtYWtlIG1hY3JvIHRvIGZpbmQgdGhlIGxpYiBwYXRoCitpZihNRVRJU19MSUJESVIpCisgIHNldChNRVRJU19tZXRpc19MSUJSQVJZICJNRVRJU19tZXRpc19MSUJSQVJZLU5PVEZPVU5EIikKKyAgZmluZF9saWJyYXJ5KE1FVElTX21ldGlzX0xJQlJBUlkKKyAgICBOQU1FUyBtZXRpcworICAgIEhJTlRTICR7TUVUSVNfTElCRElSfSkKK2Vsc2UoKQorICBpZihNRVRJU19ESVIpCisgICAgc2V0KE1FVElTX21ldGlzX0xJQlJBUlkgIk1FVElTX21ldGlzX0xJQlJBUlktTk9URk9VTkQiKQorICAgIGZpbmRfbGlicmFyeShNRVRJU19tZXRpc19MSUJSQVJZCisgICAgICBOQU1FUyBtZXRpcworICAgICAgSElOVFMgJHtNRVRJU19ESVJ9CisgICAgICBQQVRIX1NVRkZJWEVTIGxpYiBsaWIzMiBsaWI2NCkKKyAgZWxzZSgpCisgICAgc2V0KE1FVElTX21ldGlzX0xJQlJBUlkgIk1FVElTX21ldGlzX0xJQlJBUlktTk9URk9VTkQiKQorICAgIGZpbmRfbGlicmFyeShNRVRJU19tZXRpc19MSUJSQVJZCisgICAgICBOQU1FUyBtZXRpcworICAgICAgSElOVFMgJHtfbGliX2Vudn0pCisgIGVuZGlmKCkKK2VuZGlmKCkKK21hcmtfYXNfYWR2YW5jZWQoTUVUSVNfbWV0aXNfTElCUkFSWSkKKworCisjIElmIGZvdW5kLCBhZGQgcGF0aCB0byBjbWFrZSB2YXJpYWJsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmIChNRVRJU19tZXRpc19MSUJSQVJZKQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KG1ldGlzX2xpYl9wYXRoICIke01FVElTX21ldGlzX0xJQlJBUll9IiBQQVRIKQorICAjIHNldCBjbWFrZSB2YXJpYWJsZXMKKyAgc2V0KE1FVElTX0xJQlJBUklFUyAgICAiJHtNRVRJU19tZXRpc19MSUJSQVJZfSIpCisgIHNldChNRVRJU19MSUJSQVJZX0RJUlMgIiR7bWV0aXNfbGliX3BhdGh9IikKK2Vsc2UgKCkKKyAgc2V0KE1FVElTX0xJQlJBUklFUyAgICAiTUVUSVNfTElCUkFSSUVTLU5PVEZPVU5EIikKKyAgc2V0KE1FVElTX0xJQlJBUllfRElSUyAiTUVUSVNfTElCUkFSWV9ESVJTLU5PVEZPVU5EIikKKyAgaWYoTk9UIE1FVElTX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgbWV0aXMgLS0gbGliIG1ldGlzIG5vdCBmb3VuZCIpCisgIGVuZGlmKCkKK2VuZGlmICgpCisKKyMgY2hlY2sgYSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgZmluZAoraWYoTUVUSVNfTElCUkFSSUVTKQorCisgIHNldChSRVFVSVJFRF9JTkNESVJTKQorICBzZXQoUkVRVUlSRURfTElCRElSUykKKyAgc2V0KFJFUVVJUkVEX0xJQlMpCisKKyAgIyBNRVRJUworICBpZiAoTUVUSVNfSU5DTFVERV9ESVJTKQorICAgIHNldChSRVFVSVJFRF9JTkNESVJTICAiJHtNRVRJU19JTkNMVURFX0RJUlN9IikKKyAgZW5kaWYoKQorICBpZiAoTUVUSVNfTElCUkFSWV9ESVJTKQorICAgIHNldChSRVFVSVJFRF9MSUJESVJTICIke01FVElTX0xJQlJBUllfRElSU30iKQorICBlbmRpZigpCisgIHNldChSRVFVSVJFRF9MSUJTICIke01FVElTX0xJQlJBUklFU30iKQorICAjIG0KKyAgZmluZF9saWJyYXJ5KE1fTElCUkFSWSBOQU1FUyBtKQorICBtYXJrX2FzX2FkdmFuY2VkKE1fTElCUkFSWSkKKyAgaWYoTV9MSUJSQVJZKQorICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQlMgIi1sbSIpCisgIGVuZGlmKCkKKworICAjIHNldCByZXF1aXJlZCBsaWJyYXJpZXMgZm9yIGxpbmsKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke1JFUVVJUkVEX0lOQ0RJUlN9IikKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKKyAgZm9yZWFjaChsaWJfZGlyICR7UkVRVUlSRURfTElCRElSU30pCisgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICItTCR7bGliX2Rpcn0iKQorICBlbmRmb3JlYWNoKCkKKyAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICIke1JFUVVJUkVEX0xJQlN9IikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl4gLSIgIi0iIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKKworICAjIHRlc3QgbGluaworICB1bnNldChNRVRJU19XT1JLUyBDQUNIRSkKKyAgaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQorICBjaGVja19mdW5jdGlvbl9leGlzdHMoTUVUSVNfTm9kZU5EIE1FVElTX1dPUktTKQorICBtYXJrX2FzX2FkdmFuY2VkKE1FVElTX1dPUktTKQorCisgIGlmKE5PVCBNRVRJU19XT1JLUykKKyAgICBpZihOT1QgTUVUSVNfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIE1FVElTIDogdGVzdCBvZiBNRVRJU19Ob2RlTkQgd2l0aCBNRVRJUyBsaWJyYXJ5IGZhaWxzIikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVM6ICR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQ01BS0VfUkVRVUlSRURfSU5DTFVERVM6ICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVN9IikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDaGVjayBpbiBDTWFrZUZpbGVzL0NNYWtlRXJyb3IubG9nIHRvIGZpZ3VyZSBvdXQgd2h5IGl0IGZhaWxzIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCisgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCitlbmRpZihNRVRJU19MSUJSQVJJRVMpCisKK2lmIChNRVRJU19MSUJSQVJJRVMpCisgIGxpc3QoR0VUIE1FVElTX0xJQlJBUklFUyAwIGZpcnN0X2xpYikKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChmaXJzdF9saWJfcGF0aCAiJHtmaXJzdF9saWJ9IiBQQVRIKQorICBpZiAoJHtmaXJzdF9saWJfcGF0aH0gTUFUQ0hFUyAiL2xpYigzMnw2NCk/JCIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIi9saWIoMzJ8NjQpPyQiICIiIG5vdF9jYWNoZWRfZGlyICIke2ZpcnN0X2xpYl9wYXRofSIpCisgICAgc2V0KE1FVElTX0RJUl9GT1VORCAiJHtub3RfY2FjaGVkX2Rpcn0iIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgTUVUSVMgbGlicmFyeSIgRk9SQ0UpCisgIGVsc2UoKQorICAgIHNldChNRVRJU19ESVJfRk9VTkQgIiR7Zmlyc3RfbGliX3BhdGh9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIE1FVElTIGxpYnJhcnkiIEZPUkNFKQorICBlbmRpZigpCitlbmRpZigpCittYXJrX2FzX2FkdmFuY2VkKE1FVElTX0RJUikKK21hcmtfYXNfYWR2YW5jZWQoTUVUSVNfRElSX0ZPVU5EKQorCisjIGNoZWNrIHRoYXQgTUVUSVMgaGFzIGJlZW4gZm91bmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE1FVElTIERFRkFVTFRfTVNHCisgIE1FVElTX0xJQlJBUklFUworICBNRVRJU19XT1JLUykKKyMKKyMgVE9ETzogQWRkIHBvc3NpYmlsaXR5IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkKKyMKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRQVFNDT1RDSC5jbWFrZSBiL2NtYWtlL0ZpbmRQVFNDT1RDSC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk2ZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZFBUU0NPVENILmNtYWtlCkBAIC0wLDAgKzEsNDIzIEBACisjIyMKKyMKKyMgQGNvcHlyaWdodCAoYykgMjAwOS0yMDE0IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQGNvcHlyaWdodCAoYykgMjAxMi0yMDE2IElucmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQm9yZGVhdXggSU5QLCBDTlJTIChMYUJSSSBVTVIgNTgwMCksIElucmlhLCBVbml2LiBCb3JkZWF1eC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMjIworIworIyAtIEZpbmQgUFRTQ09UQ0ggaW5jbHVkZSBkaXJzIGFuZCBsaWJyYXJpZXMKKyMgVXNlIHRoaXMgbW9kdWxlIGJ5IGludm9raW5nIGZpbmRfcGFja2FnZSB3aXRoIHRoZSBmb3JtOgorIyAgZmluZF9wYWNrYWdlKFBUU0NPVENICisjICAgICAgICAgICAgICAgW1JFUVVJUkVEXSAgICAgICAgICAgICAjIEZhaWwgd2l0aCBlcnJvciBpZiBwdHNjb3RjaCBpcyBub3QgZm91bmQKKyMgICAgICAgICAgICAgICBbQ09NUE9ORU5UUyA8Y29tcDE+IDxjb21wMj4gLi4uXSAjIGRlcGVuZGVuY2llcworIyAgICAgICAgICAgICAgKQorIworIyAgUFRTQ09UQ0ggZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nIGxpYnJhcmllczoKKyMgICAtIFRocmVhZHMKKyMgICAtIE1QSQorIworIyAgQ09NUE9ORU5UUyBjYW4gYmUgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgIC0gRVNNVU1QUzogdG8gYWN0aXZhdGUgZGV0ZWN0aW9uIG9mIFBULVNjb3RjaCB3aXRoIHRoZSBlc211bXBzIGludGVyZmFjZQorIworIyBUaGlzIG1vZHVsZSBmaW5kcyBoZWFkZXJzIGFuZCBwdHNjb3RjaCBsaWJyYXJ5LgorIyBSZXN1bHRzIGFyZSByZXBvcnRlZCBpbiB2YXJpYWJsZXM6CisjICBQVFNDT1RDSF9GT1VORCAgICAgICAgICAgIC0gVHJ1ZSBpZiBoZWFkZXJzIGFuZCByZXF1ZXN0ZWQgbGlicmFyaWVzIHdlcmUgZm91bmQKKyMgIFBUU0NPVENIX0xJTktFUl9GTEFHUyAgICAgLSBsaXN0IG9mIHJlcXVpcmVkIGxpbmtlciBmbGFncyAoZXhjbHVkaW5nIC1sIGFuZCAtTCkKKyMgIFBUU0NPVENIX0lOQ0xVREVfRElSUyAgICAgLSBwdHNjb3RjaCBpbmNsdWRlIGRpcmVjdG9yaWVzCisjICBQVFNDT1RDSF9MSUJSQVJZX0RJUlMgICAgIC0gTGluayBkaXJlY3RvcmllcyBmb3IgcHRzY290Y2ggbGlicmFyaWVzCisjICBQVFNDT1RDSF9MSUJSQVJJRVMgICAgICAgIC0gcHRzY290Y2ggY29tcG9uZW50IGxpYnJhcmllcyB0byBiZSBsaW5rZWQKKyMgIFBUU0NPVENIX0lOQ0xVREVfRElSU19ERVAgLSBwdHNjb3RjaCArIGRlcGVuZGVuY2llcyBpbmNsdWRlIGRpcmVjdG9yaWVzCisjICBQVFNDT1RDSF9MSUJSQVJZX0RJUlNfREVQIC0gcHRzY290Y2ggKyBkZXBlbmRlbmNpZXMgbGluayBkaXJlY3RvcmllcworIyAgUFRTQ09UQ0hfTElCUkFSSUVTX0RFUCAgICAtIHB0c2NvdGNoIGxpYnJhcmllcyArIGRlcGVuZGVuY2llcworIyAgUFRTQ09UQ0hfSU5UU0laRSAgICAgICAgICAtIE51bWJlciBvZiBvY3RldHMgb2NjdXBpZWQgYnkgYSBTQ09UQ0hfTnVtCisjCisjIFRoZSB1c2VyIGNhbiBnaXZlIHNwZWNpZmljIHBhdGhzIHdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcmllcyBhZGRpbmcgY21ha2UKKyMgb3B0aW9ucyBhdCBjb25maWd1cmUgKGV4OiBjbWFrZSBwYXRoL3RvL3Byb2plY3QgLURQVFNDT1RDSD1wYXRoL3RvL3B0c2NvdGNoKToKKyMgIFBUU0NPVENIX0RJUiAgICAgICAgICAgICAgLSBXaGVyZSB0byBmaW5kIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiBwdHNjb3RjaAorIyAgUFRTQ09UQ0hfSU5DRElSICAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGhlYWRlciBmaWxlcworIyAgUFRTQ09UQ0hfTElCRElSICAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZXMKKyMgVGhlIG1vZHVsZSBjYW4gYWxzbyBsb29rIGZvciB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZiBwYXRocworIyBhcmUgbm90IGdpdmVuIGFzIGNtYWtlIHZhcmlhYmxlOiBQVFNDT1RDSF9ESVIsIFBUU0NPVENIX0lOQ0RJUiwgUFRTQ09UQ0hfTElCRElSCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMjAxMi0yMDEzIElucmlhCisjIENvcHlyaWdodCAyMDEyLTIwMTMgRW1tYW51ZWwgQWd1bGxvCisjIENvcHlyaWdodCAyMDEyLTIwMTMgTWF0aGlldSBGYXZlcmdlCisjIENvcHlyaWdodCAyMDEyICAgICAgQ2VkcmljIENhc3RhZ25lZGUKKyMgQ29weXJpZ2h0IDIwMTMtMjAxNiBGbG9yZW50IFBydXZvc3QKKyMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE9TSS1hcHByb3ZlZCBCU0QgTGljZW5zZSAodGhlICJMaWNlbnNlIik7CisjIHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBNT1JTRS1Db3B5cmlnaHQudHh0IGZvciBkZXRhaWxzLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKFRvIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG91dHNpZGUgb2YgTW9yc2UsIHN1YnN0aXR1dGUgdGhlIGZ1bGwKKyMgIExpY2Vuc2UgdGV4dCBmb3IgdGhlIGFib3ZlIHJlZmVyZW5jZS4pCisKK2lmIChOT1QgUFRTQ09UQ0hfRk9VTkQpCisgIHNldChQVFNDT1RDSF9ESVIgIiIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQVFNDT1RDSCBsaWJyYXJ5IikKKyAgaWYgKE5PVCBQVFNDT1RDSF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgY2FjaGUgdmFyaWFibGUsIG5hbWVseSBQVFNDT1RDSF9ESVIsIGhhcyBiZWVuIHNldCB0byBzcGVjaWZ5IHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBvZiBQVFNDT1RDSCIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBTZXQgdGhlIHZlcnNpb24gdG8gZmluZAorc2V0KFBUU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMgT0ZGKQorCitpZiggUFRTQ09UQ0hfRklORF9DT01QT05FTlRTICkKKyAgZm9yZWFjaCggY29tcG9uZW50ICR7UFRTQ09UQ0hfRklORF9DT01QT05FTlRTfSApCisgICAgaWYgKCR7Y29tcG9uZW50fSBTVFJFUVVBTCAiRVNNVU1QUyIpCisgICAgICAjIG1lYW5zIHdlIGxvb2sgZm9yIGVzbXVtcHMgbGlicmFyeQorICAgICAgc2V0KFBUU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMgT04pCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKK2VuZGlmKCkKKworIyBQVFNDT1RDSCBkZXBlbmRzIG9uIFRocmVhZHMsIHRyeSB0byBmaW5kIGl0CitpZiAoTk9UIFRIUkVBRFNfRk9VTkQpCisgIGlmIChQVFNDT1RDSF9GSU5EX1JFUVVJUkVEKQorICAgIGZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEKQorICBlbHNlKCkKKyAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIFBUU0NPVENIIGRlcGVuZHMgb24gTVBJLCB0cnkgdG8gZmluZCBpdAoraWYgKE5PVCBNUElfRk9VTkQpCisgIGlmIChQVFNDT1RDSF9GSU5EX1JFUVVJUkVEKQorICAgIGZpbmRfcGFja2FnZShNUEkgUkVRVUlSRUQpCisgIGVsc2UoKQorICAgIGZpbmRfcGFja2FnZShNUEkpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBMb29raW5nIGZvciBpbmNsdWRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBBZGQgc3lzdGVtIGluY2x1ZGUgcGF0aHMgdG8gc2VhcmNoIGluY2x1ZGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1bnNldChfaW5jX2VudikKK3NldChFTlZfUFRTQ09UQ0hfRElSICIkRU5We1BUU0NPVENIX0RJUn0iKQorc2V0KEVOVl9QVFNDT1RDSF9JTkNESVIgIiRFTlZ7UFRTQ09UQ0hfSU5DRElSfSIpCitpZihFTlZfUFRTQ09UQ0hfSU5DRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfUFRTQ09UQ0hfSU5DRElSfSIpCitlbHNlaWYoRU5WX1BUU0NPVENIX0RJUikKKyAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX1BUU0NPVENIX0RJUn0iKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfUFRTQ09UQ0hfRElSfS9pbmNsdWRlIikKKyAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7RU5WX1BUU0NPVENIX0RJUn0vaW5jbHVkZS9wdHNjb3RjaCIpCitlbHNlKCkKKyAgaWYoV0lOMzIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfaW5jX2VudiAiJEVOVntJTkNMVURFfSIpCisgIGVsc2UoKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntDX0lOQ0xVREVfUEFUSH0iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NQQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERV9QQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX1BMQVRGT1JNX0lNUExJQ0lUX0lOQ0xVREVfRElSRUNUT1JJRVN9IikKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfaW5jX2VudikKKworCisjIFRyeSB0byBmaW5kIHRoZSBwdHNjb3RjaCBoZWFkZXIgaW4gdGhlIGdpdmVuIHBhdGhzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2V0KFBUU0NPVENIX2hkcnNfdG9fZmluZCAicHRzY290Y2guaDtzY290Y2guaCIpCisKKyMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBoZWFkZXIgcGF0aAoraWYoUFRTQ09UQ0hfSU5DRElSKQorICBmb3JlYWNoKHB0c2NvdGNoX2hkciAke1BUU0NPVENIX2hkcnNfdG9fZmluZH0pCisgICAgc2V0KFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTICJQVFNDT1RDSF8ke3B0c2NvdGNoX2hkcn1fRElSUy1OT1RGT1VORCIpCisgICAgZmluZF9wYXRoKFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTCisgICAgICBOQU1FUyAke3B0c2NvdGNoX2hkcn0KKyAgICAgIEhJTlRTICR7UFRTQ09UQ0hfSU5DRElSfSkKKyAgICBtYXJrX2FzX2FkdmFuY2VkKFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTKQorICBlbmRmb3JlYWNoKCkKK2Vsc2UoKQorICBpZihQVFNDT1RDSF9ESVIpCisgICAgZm9yZWFjaChwdHNjb3RjaF9oZHIgJHtQVFNDT1RDSF9oZHJzX3RvX2ZpbmR9KQorICAgICAgc2V0KFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTICJQVFNDT1RDSF8ke3B0c2NvdGNoX2hkcn1fRElSUy1OT1RGT1VORCIpCisgICAgICBmaW5kX3BhdGgoUFRTQ09UQ0hfJHtwdHNjb3RjaF9oZHJ9X0RJUlMKKwlOQU1FUyAke3B0c2NvdGNoX2hkcn0KKwlISU5UUyAke1BUU0NPVENIX0RJUn0KKwlQQVRIX1NVRkZJWEVTICJpbmNsdWRlIiAiaW5jbHVkZS9zY290Y2giKQorICAgICAgbWFya19hc19hZHZhbmNlZChQVFNDT1RDSF8ke3B0c2NvdGNoX2hkcn1fRElSUykKKyAgICBlbmRmb3JlYWNoKCkKKyAgZWxzZSgpCisgICAgZm9yZWFjaChwdHNjb3RjaF9oZHIgJHtQVFNDT1RDSF9oZHJzX3RvX2ZpbmR9KQorICAgICAgc2V0KFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTICJQVFNDT1RDSF8ke3B0c2NvdGNoX2hkcn1fRElSUy1OT1RGT1VORCIpCisgICAgICBmaW5kX3BhdGgoUFRTQ09UQ0hfJHtwdHNjb3RjaF9oZHJ9X0RJUlMKKwlOQU1FUyAke3B0c2NvdGNoX2hkcn0KKwlISU5UUyAke19pbmNfZW52fQorCVBBVEhfU1VGRklYRVMgInNjb3RjaCIpCisgICAgICBtYXJrX2FzX2FkdmFuY2VkKFBUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgSWYgZm91bmQsIGFkZCBwYXRoIHRvIGNtYWtlIHZhcmlhYmxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9yZWFjaChwdHNjb3RjaF9oZHIgJHtQVFNDT1RDSF9oZHJzX3RvX2ZpbmR9KQorICBpZiAoUFRTQ09UQ0hfJHtwdHNjb3RjaF9oZHJ9X0RJUlMpCisgICAgbGlzdChBUFBFTkQgUFRTQ09UQ0hfSU5DTFVERV9ESVJTICIke1BUU0NPVENIXyR7cHRzY290Y2hfaGRyfV9ESVJTfSIpCisgIGVsc2UgKCkKKyAgICBzZXQoUFRTQ09UQ0hfSU5DTFVERV9ESVJTICJQVFNDT1RDSF9JTkNMVURFX0RJUlMtTk9URk9VTkQiKQorICAgIGlmIChOT1QgUFRTQ09UQ0hfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIHB0c2NvdGNoIC0tICR7cHRzY290Y2hfaGRyfSBub3QgZm91bmQiKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCitsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFBUU0NPVENIX0lOQ0xVREVfRElSUykKKworIyBMb29raW5nIGZvciBsaWIKKyMgLS0tLS0tLS0tLS0tLS0tCisKKyMgQWRkIHN5c3RlbSBsaWJyYXJ5IHBhdGhzIHRvIHNlYXJjaCBsaWIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Vuc2V0KF9saWJfZW52KQorc2V0KEVOVl9QVFNDT1RDSF9MSUJESVIgIiRFTlZ7UFRTQ09UQ0hfTElCRElSfSIpCitpZihFTlZfUFRTQ09UQ0hfTElCRElSKQorICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtFTlZfUFRTQ09UQ0hfTElCRElSfSIpCitlbHNlaWYoRU5WX1BUU0NPVENIX0RJUikKKyAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7RU5WX1BUU0NPVENIX0RJUn0iKQorICBsaXN0KEFQUEVORCBfbGliX2VudiAiJHtFTlZfUFRTQ09UQ0hfRElSfS9saWIiKQorZWxzZSgpCisgIGlmKFdJTjMyKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYl9lbnYgIiRFTlZ7TElCfSIpCisgIGVsc2UoKQorICAgIGlmKEFQUExFKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGVsc2UoKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICBlbmRpZigpCitlbmRpZigpCitsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIF9saWJfZW52KQorCisjIFRyeSB0byBmaW5kIHRoZSBwdHNjb3RjaCBsaWIgaW4gdGhlIGdpdmVuIHBhdGhzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2V0KFBUU0NPVENIX2xpYnNfdG9fZmluZCAicHRzY290Y2g7cHRzY290Y2hlcnIiKQoraWYgKFBUU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMpCisgIGxpc3QoSU5TRVJUIFBUU0NPVENIX2xpYnNfdG9fZmluZCAwICJwdGVzbXVtcHMiKQorICBsaXN0KEFQUEVORCBQVFNDT1RDSF9saWJzX3RvX2ZpbmQgICAiZXNtdW1wcyIgICkKK2VuZGlmKCkKK2xpc3QoQVBQRU5EIFBUU0NPVENIX2xpYnNfdG9fZmluZCAic2NvdGNoO3Njb3RjaGVyciIpCisKKyMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBsaWIgcGF0aAoraWYoUFRTQ09UQ0hfTElCRElSKQorICBmb3JlYWNoKHB0c2NvdGNoX2xpYiAke1BUU0NPVENIX2xpYnNfdG9fZmluZH0pCisgICAgc2V0KFBUU0NPVENIXyR7cHRzY290Y2hfbGlifV9MSUJSQVJZICJQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWS1OT1RGT1VORCIpCisgICAgZmluZF9saWJyYXJ5KFBUU0NPVENIXyR7cHRzY290Y2hfbGlifV9MSUJSQVJZCisgICAgICBOQU1FUyAke3B0c2NvdGNoX2xpYn0KKyAgICAgIEhJTlRTICR7UFRTQ09UQ0hfTElCRElSfSkKKyAgZW5kZm9yZWFjaCgpCitlbHNlKCkKKyAgaWYoUFRTQ09UQ0hfRElSKQorICAgIGZvcmVhY2gocHRzY290Y2hfbGliICR7UFRTQ09UQ0hfbGlic190b19maW5kfSkKKyAgICAgIHNldChQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWSAiUFRTQ09UQ0hfJHtwdHNjb3RjaF9saWJ9X0xJQlJBUlktTk9URk9VTkQiKQorICAgICAgZmluZF9saWJyYXJ5KFBUU0NPVENIXyR7cHRzY290Y2hfbGlifV9MSUJSQVJZCisJTkFNRVMgJHtwdHNjb3RjaF9saWJ9CisJSElOVFMgJHtQVFNDT1RDSF9ESVJ9CisJUEFUSF9TVUZGSVhFUyBsaWIgbGliMzIgbGliNjQpCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2UoKQorICAgIGZvcmVhY2gocHRzY290Y2hfbGliICR7UFRTQ09UQ0hfbGlic190b19maW5kfSkKKyAgICAgIHNldChQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWSAiUFRTQ09UQ0hfJHtwdHNjb3RjaF9saWJ9X0xJQlJBUlktTk9URk9VTkQiKQorICAgICAgZmluZF9saWJyYXJ5KFBUU0NPVENIXyR7cHRzY290Y2hfbGlifV9MSUJSQVJZCisJTkFNRVMgJHtwdHNjb3RjaF9saWJ9CisJSElOVFMgJHtfbGliX2Vudn0pCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworc2V0KFBUU0NPVENIX0xJQlJBUklFUyAiIikKK3NldChQVFNDT1RDSF9MSUJSQVJZX0RJUlMgIiIpCisjIElmIGZvdW5kLCBhZGQgcGF0aCB0byBjbWFrZSB2YXJpYWJsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ZvcmVhY2gocHRzY290Y2hfbGliICR7UFRTQ09UQ0hfbGlic190b19maW5kfSkKKworICBpZiAoUFRTQ09UQ0hfJHtwdHNjb3RjaF9saWJ9X0xJQlJBUlkpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudCgke3B0c2NvdGNoX2xpYn1fbGliX3BhdGggIiR7UFRTQ09UQ0hfJHtwdHNjb3RjaF9saWJ9X0xJQlJBUll9IiBQQVRIKQorICAgICMgc2V0IGNtYWtlIHZhcmlhYmxlcworICAgIGxpc3QoQVBQRU5EIFBUU0NPVENIX0xJQlJBUklFUyAiJHtQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWX0iKQorICAgIGxpc3QoQVBQRU5EIFBUU0NPVENIX0xJQlJBUllfRElSUyAiJHske3B0c2NvdGNoX2xpYn1fbGliX3BhdGh9IikKKyAgZWxzZSAoKQorICAgIGxpc3QoQVBQRU5EIFBUU0NPVENIX0xJQlJBUklFUyAiJHtQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWX0iKQorICAgIGlmIChOT1QgUFRTQ09UQ0hfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIHB0c2NvdGNoIC0tIGxpYiAke3B0c2NvdGNoX2xpYn0gbm90IGZvdW5kIikKKyAgICBlbmRpZigpCisgIGVuZGlmICgpCisKKyAgbWFya19hc19hZHZhbmNlZChQVFNDT1RDSF8ke3B0c2NvdGNoX2xpYn1fTElCUkFSWSkKKworZW5kZm9yZWFjaCgpCitsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFBUU0NPVENIX0xJQlJBUllfRElSUykKKworIyBjaGVjayBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBmaW5kCitpZihQVFNDT1RDSF9MSUJSQVJJRVMpCisKKyAgc2V0KFJFUVVJUkVEX0xERkxBR1MpCisgIHNldChSRVFVSVJFRF9JTkNESVJTKQorICBzZXQoUkVRVUlSRURfTElCRElSUykKKyAgc2V0KFJFUVVJUkVEX0xJQlMpCisKKyAgIyBQVFNDT1RDSAorICBpZiAoUFRTQ09UQ0hfSU5DTFVERV9ESVJTKQorICAgIHNldChSRVFVSVJFRF9JTkNESVJTICAiJHtQVFNDT1RDSF9JTkNMVURFX0RJUlN9IikKKyAgZW5kaWYoKQorICBpZiAoUFRTQ09UQ0hfTElCUkFSWV9ESVJTKQorICAgIHNldChSRVFVSVJFRF9MSUJESVJTICIke1BUU0NPVENIX0xJQlJBUllfRElSU30iKQorICBlbmRpZigpCisgIHNldChSRVFVSVJFRF9MSUJTICIke1BUU0NPVENIX0xJQlJBUklFU30iKQorICAjIE1QSQorICBpZiAoTVBJX0ZPVU5EKQorICAgIGlmIChNUElfQ19JTkNMVURFX1BBVEgpCisgICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiJHtNUElfQ19JTkNMVURFX1BBVEh9IikKKyAgICBlbmRpZigpCisgICAgaWYgKE1QSV9DX0xJTktfRkxBR1MpCisgICAgICBpZiAoJHtNUElfQ19MSU5LX0ZMQUdTfSBNQVRDSEVTICIgIC0iKQorCXN0cmluZyhSRUdFWCBSRVBMQUNFICIgLSIgIi0iIE1QSV9DX0xJTktfRkxBR1MgJHtNUElfQ19MSU5LX0ZMQUdTfSkKKyAgICAgIGVuZGlmKCkKKyAgICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xERkxBR1MgIiR7TVBJX0NfTElOS19GTEFHU30iKQorICAgIGVuZGlmKCkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke01QSV9DX0xJQlJBUklFU30iKQorICBlbmRpZigpCisgICMgVEhSRUFEUworICBpZihDTUFLRV9USFJFQURfTElCU19JTklUKQorICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQlMgIiR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0iKQorICBlbmRpZigpCisgIHNldChaX0xJQlJBUlkgIlpfTElCUkFSWS1OT1RGT1VORCIpCisgIGZpbmRfbGlicmFyeShaX0xJQlJBUlkgTkFNRVMgeikKKyAgbWFya19hc19hZHZhbmNlZChaX0xJQlJBUlkpCisgIGlmKFpfTElCUkFSWSkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICItbHoiKQorICBlbmRpZigpCisgIHNldChNX0xJQlJBUlkgIk1fTElCUkFSWS1OT1RGT1VORCIpCisgIGZpbmRfbGlicmFyeShNX0xJQlJBUlkgTkFNRVMgbSkKKyAgbWFya19hc19hZHZhbmNlZChNX0xJQlJBUlkpCisgIGlmKE1fTElCUkFSWSkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICItbG0iKQorICBlbmRpZigpCisgIHNldChSVF9MSUJSQVJZICJSVF9MSUJSQVJZLU5PVEZPVU5EIikKKyAgZmluZF9saWJyYXJ5KFJUX0xJQlJBUlkgTkFNRVMgcnQpCisgIG1hcmtfYXNfYWR2YW5jZWQoUlRfTElCUkFSWSkKKyAgaWYoUlRfTElCUkFSWSkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICItbHJ0IikKKyAgZW5kaWYoKQorCisgICMgc2V0IHJlcXVpcmVkIGxpYnJhcmllcyBmb3IgbGluaworICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgIiR7UkVRVUlSRURfSU5DRElSU30iKQorICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7UkVRVUlSRURfTERGTEFHU30iKQorICBmb3JlYWNoKGxpYl9kaXIgJHtSRVFVSVJFRF9MSUJESVJTfSkKKyAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIi1MJHtsaWJfZGlyfSIpCisgIGVuZGZvcmVhY2goKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7UkVRVUlSRURfTElCU30iKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtSRVFVSVJFRF9GTEFHU30iKQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXiAtIiAiLSIgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICIke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorCisgICMgdGVzdCBsaW5rCisgIHVuc2V0KFBUU0NPVENIX1dPUktTIENBQ0hFKQorICBpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCisgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhTQ09UQ0hfZGdyYXBoSW5pdCBQVFNDT1RDSF9XT1JLUykKKyAgbWFya19hc19hZHZhbmNlZChQVFNDT1RDSF9XT1JLUykKKworICBpZihQVFNDT1RDSF9XT1JLUykKKyAgICAjIHNhdmUgbGluayB3aXRoIGRlcGVuZGVuY2llcworICAgIHNldChQVFNDT1RDSF9MSUJSQVJJRVNfREVQICIke1JFUVVJUkVEX0xJQlN9IikKKyAgICBzZXQoUFRTQ09UQ0hfTElCUkFSWV9ESVJTX0RFUCAiJHtSRVFVSVJFRF9MSUJESVJTfSIpCisgICAgc2V0KFBUU0NPVENIX0lOQ0xVREVfRElSU19ERVAgIiR7UkVRVUlSRURfSU5DRElSU30iKQorICAgIHNldChQVFNDT1RDSF9MSU5LRVJfRkxBR1MgIiR7UkVRVUlSRURfTERGTEFHU30iKQorICAgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgUFRTQ09UQ0hfTElCUkFSWV9ESVJTX0RFUCkKKyAgICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFBUU0NPVENIX0lOQ0xVREVfRElSU19ERVApCisgICAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBQVFNDT1RDSF9MSU5LRVJfRkxBR1MpCisgIGVsc2UoKQorICAgIGlmKE5PVCBQVFNDT1RDSF9GSU5EX1FVSUVUTFkpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgUFRTQ09UQ0ggOiB0ZXN0IG9mIFNDT1RDSF9kZ3JhcGhJbml0IHdpdGggUFRTQ09UQ0ggbGlicmFyeSBmYWlscyIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTOiAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkNNQUtFX1JFUVVJUkVEX0lOQ0xVREVTOiAke0NNQUtFX1JFUVVJUkVEX0lOQ0xVREVTfSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQ2hlY2sgaW4gQ01ha2VGaWxlcy9DTWFrZUVycm9yLmxvZyB0byBmaWd1cmUgb3V0IHdoeSBpdCBmYWlscyIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUykKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQorICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorZW5kaWYoUFRTQ09UQ0hfTElCUkFSSUVTKQorCitpZiAoUFRTQ09UQ0hfTElCUkFSSUVTKQorICBsaXN0KEdFVCBQVFNDT1RDSF9MSUJSQVJJRVMgMCBmaXJzdF9saWIpCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoZmlyc3RfbGliX3BhdGggIiR7Zmlyc3RfbGlifSIgUEFUSCkKKyAgaWYgKCR7Zmlyc3RfbGliX3BhdGh9IE1BVENIRVMgIi9saWIoMzJ8NjQpPyQiKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvbGliKDMyfDY0KT8kIiAiIiBub3RfY2FjaGVkX2RpciAiJHtmaXJzdF9saWJfcGF0aH0iKQorICAgIHNldChQVFNDT1RDSF9ESVJfRk9VTkQgIiR7bm90X2NhY2hlZF9kaXJ9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIFBUU0NPVENIIGxpYnJhcnkiIEZPUkNFKQorICBlbHNlKCkKKyAgICBzZXQoUFRTQ09UQ0hfRElSX0ZPVU5EICIke2ZpcnN0X2xpYl9wYXRofSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQVFNDT1RDSCBsaWJyYXJ5IiBGT1JDRSkKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFya19hc19hZHZhbmNlZChQVFNDT1RDSF9ESVIpCittYXJrX2FzX2FkdmFuY2VkKFBUU0NPVENIX0RJUl9GT1VORCkKKworIyBDaGVjayB0aGUgc2l6ZSBvZiBTQ09UQ0hfTnVtCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7UFRTQ09UQ0hfSU5DTFVERV9ESVJTfSkKKworaW5jbHVkZShDaGVja0NTb3VyY2VSdW5zKQorI3N0ZGlvLmggYW5kIHN0ZGludC5oIHNob3VsZCBiZSBpbmNsdWRlZCBieSBzY290Y2guaCBkaXJlY3RseQorc2V0KFBUU0NPVENIX0NfVEVTVF9TQ09UQ0hfTnVtXzQgIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cHRzY290Y2guaD4KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpZiAoc2l6ZW9mKFNDT1RDSF9OdW0pID09IDQpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKyIpCisKK3NldChQVFNDT1RDSF9DX1RFU1RfU0NPVENIX051bV84ICIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHB0c2NvdGNoLmg+CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaWYgKHNpemVvZihTQ09UQ0hfTnVtKSA9PSA4KQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisiKQorY2hlY2tfY19zb3VyY2VfcnVucygiJHtQVFNDT1RDSF9DX1RFU1RfU0NPVENIX051bV80fSIgUFRTQ09UQ0hfTnVtXzQpCitpZihOT1QgUFRTQ09UQ0hfTnVtXzQpCisgIGNoZWNrX2Nfc291cmNlX3J1bnMoIiR7UFRTQ09UQ0hfQ19URVNUX1NDT1RDSF9OdW1fOH0iIFBUU0NPVENIX051bV84KQorICBpZihOT1QgUFRTQ09UQ0hfTnVtXzgpCisgICAgc2V0KFBUU0NPVENIX0lOVFNJWkUgLTEpCisgIGVsc2UoKQorICAgIHNldChQVFNDT1RDSF9JTlRTSVpFIDgpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBzZXQoUFRTQ09UQ0hfSU5UU0laRSA0KQorZW5kaWYoKQorc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIiKQorCisjIGNoZWNrIHRoYXQgUFRTQ09UQ0ggaGFzIGJlZW4gZm91bmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFBUU0NPVENIIERFRkFVTFRfTVNHCisgIFBUU0NPVENIX0xJQlJBUklFUworICBQVFNDT1RDSF9XT1JLUykKKyMKKyMgVE9ETzogQWRkIHBvc3NpYmlsaXR5IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBmdW5jdGlvbnMgaW4gdGhlIGxpYnJhcnkKKyMKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRQYXN0aXguY21ha2UgYi9jbWFrZS9GaW5kUGFzdGl4LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kUGFzdGl4LmNtYWtlCkBAIC0wLDAgKzEsNzA0IEBACisjIyMKKyMKKyMgQGNvcHlyaWdodCAoYykgMjAwOS0yMDE0IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IElucmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQm9yZGVhdXggSU5QLCBDTlJTIChMYUJSSSBVTVIgNTgwMCksIElucmlhLCBVbml2LiBCb3JkZWF1eC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMjIworIworIyAtIEZpbmQgUEFTVElYIGluY2x1ZGUgZGlycyBhbmQgbGlicmFyaWVzCisjIFVzZSB0aGlzIG1vZHVsZSBieSBpbnZva2luZyBmaW5kX3BhY2thZ2Ugd2l0aCB0aGUgZm9ybToKKyMgIGZpbmRfcGFja2FnZShQQVNUSVgKKyMgICAgICAgICAgICAgICBbUkVRVUlSRURdICMgRmFpbCB3aXRoIGVycm9yIGlmIHBhc3RpeCBpcyBub3QgZm91bmQKKyMgICAgICAgICAgICAgICBbQ09NUE9ORU5UUyA8Y29tcDE+IDxjb21wMj4gLi4uXSAjIGRlcGVuZGVuY2llcworIyAgICAgICAgICAgICAgKQorIworIyAgUEFTVElYIGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZyBsaWJyYXJpZXM6CisjICAgLSBUaHJlYWRzLCBtLCBydAorIyAgIC0gTVBJCisjICAgLSBIV0xPQworIyAgIC0gQkxBUworIworIyAgQ09NUE9ORU5UUyBhcmUgb3B0aW9uYWwgbGlicmFyaWVzIFBBU1RJWCBjb3VsZCBiZSBsaW5rZWQgd2l0aCwKKyMgIFVzZSBpdCB0byBkcml2ZSBkZXRlY3Rpb24gb2YgYSBzcGVjaWZpYyBjb21waWxhdGlvbiBjaGFpbgorIyAgQ09NUE9ORU5UUyBjYW4gYmUgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgIC0gTVBJOiB0byBhY3RpdmF0ZSBkZXRlY3Rpb24gb2YgdGhlIHBhcmFsbGVsIE1QSSB2ZXJzaW9uIChkZWZhdWx0KQorIyAgICAgICAgaXQgbG9va3MgZm9yIFRocmVhZHMsIEhXTE9DLCBCTEFTLCBNUEkgYW5kIFNjYUxBUEFDSyBsaWJyYXJpZXMKKyMgICAtIFNFUTogdG8gYWN0aXZhdGUgZGV0ZWN0aW9uIG9mIHRoZSBzZXF1ZW50aWFsIHZlcnNpb24gKGV4Y2x1ZGUgTVBJIHZlcnNpb24pCisjICAgLSBTVEFSUFU6IHRvIGFjdGl2YXRlIGRldGVjdGlvbiBvZiBTdGFyUFUgdmVyc2lvbgorIyAgIGl0IGxvb2tzIGZvciBNUEkgdmVyc2lvbiBvZiBTdGFyUFUgKGRlZmF1bHQgYmVoYXZpb3VyKQorIyAgIGlmIFNFUSBhbmQgU1RBUlBVIGFyZSBnaXZlbiwgaXQgbG9va3MgZm9yIGEgU3RhclBVIHdpdGhvdXQgTVBJCisjICAgLSBTVEFSUFVfQ1VEQTogdG8gYWN0aXZhdGUgZGV0ZWN0aW9uIG9mIFN0YXJQVSB3aXRoIENVREEKKyMgICAtIFNUQVJQVV9GWFQ6IHRvIGFjdGl2YXRlIGRldGVjdGlvbiBvZiBTdGFyUFUgd2l0aCBGeFQKKyMgICAtIFNDT1RDSDogdG8gYWN0aXZhdGUgZGV0ZWN0aW9uIG9mIFBBU1RJWCBsaW5rZWQgd2l0aCBTQ09UQ0gKKyMgICAtIFBUU0NPVENIOiB0byBhY3RpdmF0ZSBkZXRlY3Rpb24gb2YgUEFTVElYIGxpbmtlZCB3aXRoIFNDT1RDSAorIyAgIC0gTUVUSVM6IHRvIGFjdGl2YXRlIGRldGVjdGlvbiBvZiBQQVNUSVggbGlua2VkIHdpdGggU0NPVENICisjCisjIFRoaXMgbW9kdWxlIGZpbmRzIGhlYWRlcnMgYW5kIHBhc3RpeCBsaWJyYXJ5LgorIyBSZXN1bHRzIGFyZSByZXBvcnRlZCBpbiB2YXJpYWJsZXM6CisjICBQQVNUSVhfRk9VTkQgICAgICAgICAgICAtIFRydWUgaWYgaGVhZGVycyBhbmQgcmVxdWVzdGVkIGxpYnJhcmllcyB3ZXJlIGZvdW5kCisjICBQQVNUSVhfTElOS0VSX0ZMQUdTICAgICAtIGxpc3Qgb2YgcmVxdWlyZWQgbGlua2VyIGZsYWdzIChleGNsdWRpbmcgLWwgYW5kIC1MKQorIyAgUEFTVElYX0lOQ0xVREVfRElSUyAgICAgLSBwYXN0aXggaW5jbHVkZSBkaXJlY3RvcmllcworIyAgUEFTVElYX0xJQlJBUllfRElSUyAgICAgLSBMaW5rIGRpcmVjdG9yaWVzIGZvciBwYXN0aXggbGlicmFyaWVzCisjICBQQVNUSVhfTElCUkFSSUVTICAgICAgICAtIHBhc3RpeCBsaWJyYXJpZXMKKyMgIFBBU1RJWF9JTkNMVURFX0RJUlNfREVQIC0gcGFzdGl4ICsgZGVwZW5kZW5jaWVzIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIFBBU1RJWF9MSUJSQVJZX0RJUlNfREVQIC0gcGFzdGl4ICsgZGVwZW5kZW5jaWVzIGxpbmsgZGlyZWN0b3JpZXMKKyMgIFBBU1RJWF9MSUJSQVJJRVNfREVQICAgIC0gcGFzdGl4IGxpYnJhcmllcyArIGRlcGVuZGVuY2llcworIworIyBUaGUgdXNlciBjYW4gZ2l2ZSBzcGVjaWZpYyBwYXRocyB3aGVyZSB0byBmaW5kIHRoZSBsaWJyYXJpZXMgYWRkaW5nIGNtYWtlCisjIG9wdGlvbnMgYXQgY29uZmlndXJlIChleDogY21ha2UgcGF0aC90by9wcm9qZWN0IC1EUEFTVElYX0RJUj1wYXRoL3RvL3Bhc3RpeCk6CisjICBQQVNUSVhfRElSICAgICAgICAgICAgICAtIFdoZXJlIHRvIGZpbmQgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHBhc3RpeAorIyAgUEFTVElYX0lOQ0RJUiAgICAgICAgICAgLSBXaGVyZSB0byBmaW5kIHRoZSBoZWFkZXIgZmlsZXMKKyMgIFBBU1RJWF9MSUJESVIgICAgICAgICAgIC0gV2hlcmUgdG8gZmluZCB0aGUgbGlicmFyeSBmaWxlcworIyBUaGUgbW9kdWxlIGNhbiBhbHNvIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIHBhdGhzCisjIGFyZSBub3QgZ2l2ZW4gYXMgY21ha2UgdmFyaWFibGU6IFBBU1RJWF9ESVIsIFBBU1RJWF9JTkNESVIsIFBBU1RJWF9MSUJESVIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENvcHlyaWdodCAyMDEyLTIwMTMgSW5yaWEKKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBFbW1hbnVlbCBBZ3VsbG8KKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBNYXRoaWV1IEZhdmVyZ2UKKyMgQ29weXJpZ2h0IDIwMTIgICAgICBDZWRyaWMgQ2FzdGFnbmVkZQorIyBDb3B5cmlnaHQgMjAxMyAgICAgIEZsb3JlbnQgUHJ1dm9zdAorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgT1NJLWFwcHJvdmVkIEJTRCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsKKyMgc2VlIGFjY29tcGFueWluZyBmaWxlIE1PUlNFLUNvcHlyaWdodC50eHQgZm9yIGRldGFpbHMuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUKKyMgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAoVG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3V0c2lkZSBvZiBNb3JzZSwgc3Vic3RpdHV0ZSB0aGUgZnVsbAorIyAgTGljZW5zZSB0ZXh0IGZvciB0aGUgYWJvdmUgcmVmZXJlbmNlLikKKworCitpZiAoTk9UIFBBU1RJWF9GT1VORCkKKyAgc2V0KFBBU1RJWF9ESVIgIiIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQQVNUSVggbGlicmFyeSIpCisgIGlmIChOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiQSBjYWNoZSB2YXJpYWJsZSwgbmFtZWx5IFBBU1RJWF9ESVIsIGhhcyBiZWVuIHNldCB0byBzcGVjaWZ5IHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBvZiBQQVNUSVgiKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgU2V0IHRoZSB2ZXJzaW9uIHRvIGZpbmQKK3NldChQQVNUSVhfTE9PS19GT1JfTVBJIE9OKQorc2V0KFBBU1RJWF9MT09LX0ZPUl9TRVEgT0ZGKQorc2V0KFBBU1RJWF9MT09LX0ZPUl9TVEFSUFUgT0ZGKQorc2V0KFBBU1RJWF9MT09LX0ZPUl9TVEFSUFVfQ1VEQSBPRkYpCitzZXQoUEFTVElYX0xPT0tfRk9SX1NUQVJQVV9GWFQgT0ZGKQorc2V0KFBBU1RJWF9MT09LX0ZPUl9TQ09UQ0ggT04pCitzZXQoUEFTVElYX0xPT0tfRk9SX1BUU0NPVENIIE9GRikKK3NldChQQVNUSVhfTE9PS19GT1JfTUVUSVMgT0ZGKQorCitpZiggUEFTVElYX0ZJTkRfQ09NUE9ORU5UUyApCisgIGZvcmVhY2goIGNvbXBvbmVudCAke1BBU1RJWF9GSU5EX0NPTVBPTkVOVFN9ICkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJTRVEiKQorICAgICAgIyBtZWFucyB3ZSBsb29rIGZvciB0aGUgc2VxdWVudGlhbCB2ZXJzaW9uIG9mIFBhU3RpWCAod2l0aG91dCBNUEkpCisgICAgICBzZXQoUEFTVElYX0xPT0tfRk9SX1NFUSBPTikKKyAgICAgIHNldChQQVNUSVhfTE9PS19GT1JfTVBJIE9GRikKKyAgICBlbmRpZigpCisgICAgaWYgKCR7Y29tcG9uZW50fSBTVFJFUVVBTCAiTVBJIikKKyAgICAgICMgbWVhbnMgd2UgbG9vayBmb3IgdGhlIE1QSSB2ZXJzaW9uIG9mIFBhU3RpWCAoZGVmYXVsdCkKKyAgICAgIHNldChQQVNUSVhfTE9PS19GT1JfU0VRIE9GRikKKyAgICAgIHNldChQQVNUSVhfTE9PS19GT1JfTVBJIE9OKQorICAgIGVuZGlmKCkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJTVEFSUFUiKQorICAgICAgIyBtZWFucyB3ZSBsb29rIGZvciBQYVN0aVggd2l0aCBTdGFyUFUKKyAgICAgIHNldChQQVNUSVhfTE9PS19GT1JfU1RBUlBVIE9OKQorICAgIGVuZGlmKCkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJTVEFSUFVfQ1VEQSIpCisgICAgICAjIG1lYW5zIHdlIGxvb2sgZm9yIFBhU3RpWCB3aXRoIFN0YXJQVSArIENVREEKKyAgICAgIHNldChQQVNUSVhfTE9PS19GT1JfU1RBUlBVIE9OKQorICAgICAgc2V0KFBBU1RJWF9MT09LX0ZPUl9TVEFSUFVfQ1VEQSBPTikKKyAgICBlbmRpZigpCisgICAgaWYgKCR7Y29tcG9uZW50fSBTVFJFUVVBTCAiU1RBUlBVX0ZYVCIpCisgICAgICAjIG1lYW5zIHdlIGxvb2sgZm9yIFBhU3RpWCB3aXRoIFN0YXJQVSArIEZ4VAorICAgICAgc2V0KFBBU1RJWF9MT09LX0ZPUl9TVEFSUFVfRlhUIE9OKQorICAgIGVuZGlmKCkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJTQ09UQ0giKQorICAgICAgc2V0KFBBU1RJWF9MT09LX0ZPUl9TQ09UQ0ggT04pCisgICAgZW5kaWYoKQorICAgIGlmICgke2NvbXBvbmVudH0gU1RSRVFVQUwgIlNDT1RDSCIpCisgICAgICBzZXQoUEFTVElYX0xPT0tfRk9SX1BUU0NPVENIIE9OKQorICAgIGVuZGlmKCkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJNRVRJUyIpCisgICAgICBzZXQoUEFTVElYX0xPT0tfRk9SX01FVElTIE9OKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCitlbmRpZigpCisKKyMgRGVwZW5kZW5jaWVzIGRldGVjdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyBSZXF1aXJlZCBkZXBlbmRlbmNpZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lmIChOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFBBU1RJWCAtIFRyeSB0byBkZXRlY3QgcHRocmVhZCIpCitlbmRpZigpCitpZiAoUEFTVElYX0ZJTkRfUkVRVUlSRUQpCisgIGZpbmRfcGFja2FnZShUaHJlYWRzIFJFUVVJUkVEIFFVSUVUKQorZWxzZSgpCisgIGZpbmRfcGFja2FnZShUaHJlYWRzIFFVSUVUKQorZW5kaWYoKQorc2V0KFBBU1RJWF9FWFRSQV9MSUJSQVJJRVMgIiIpCitpZiggVEhSRUFEU19GT1VORCApCisgIGxpc3QoQVBQRU5EIFBBU1RJWF9FWFRSQV9MSUJSQVJJRVMgJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKK2VuZGlmICgpCisKKyMgQWRkIG1hdGggbGlicmFyeSB0byB0aGUgbGlzdCBvZiBleHRyYQorIyBpdCBub3JtYWxseSBleGlzdHMgb24gYWxsIGNvbW1vbiBzeXN0ZW1zIHByb3ZpZGVkIHdpdGggYSBDIGNvbXBpbGVyCitpZiAoTk9UIFBBU1RJWF9GSU5EX1FVSUVUTFkpCisgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQQVNUSVggLSBUcnkgdG8gZGV0ZWN0IGxpYm0iKQorZW5kaWYoKQorc2V0KFBBU1RJWF9NX0xJQlJBUklFUyAiIikKK2lmKFVOSVggT1IgV0lOMzIpCisgIGZpbmRfbGlicmFyeSgKKyAgICBQQVNUSVhfTV9tX0xJQlJBUlkKKyAgICBOQU1FUyBtCisgICAgKQorICBtYXJrX2FzX2FkdmFuY2VkKFBBU1RJWF9NX21fTElCUkFSWSkKKyAgaWYgKFBBU1RJWF9NX21fTElCUkFSWSkKKyAgICBsaXN0KEFQUEVORCBQQVNUSVhfTV9MSUJSQVJJRVMgIiR7UEFTVElYX01fbV9MSUJSQVJZfSIpCisgICAgbGlzdChBUFBFTkQgUEFTVElYX0VYVFJBX0xJQlJBUklFUyAiJHtQQVNUSVhfTV9tX0xJQlJBUll9IikKKyAgZWxzZSgpCisgICAgaWYgKFBBU1RJWF9GSU5EX1JFUVVJUkVEKQorICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgbGlibSBvbiB5b3VyIHN5c3RlbS4iCisJIkFyZSB5b3Ugc3VyZSB0byBhIGhhdmUgYSBDIGNvbXBpbGVyIGluc3RhbGxlZD8iKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIFRyeSB0byBmaW5kIGxpYnJ0IChsaWJwb3NpeDQgLSBQT1NJWC4xYiBSZWFsdGltZSBFeHRlbnNpb25zIGxpYnJhcnkpCisjIG9uIFVuaXggc3lzdGVtcyBleGNlcHQgQXBwbGUgb25lcyBiZWNhdXNlIGl0IGRvZXMgbm90IGV4aXN0IG9uIGl0CitpZiAoTk9UIFBBU1RJWF9GSU5EX1FVSUVUTFkpCisgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQQVNUSVggLSBUcnkgdG8gZGV0ZWN0IGxpYnJ0IikKK2VuZGlmKCkKK3NldChQQVNUSVhfUlRfTElCUkFSSUVTICIiKQoraWYoVU5JWCBBTkQgTk9UIEFQUExFKQorICBmaW5kX2xpYnJhcnkoCisgICAgUEFTVElYX1JUX3J0X0xJQlJBUlkKKyAgICBOQU1FUyBydAorICAgICkKKyAgbWFya19hc19hZHZhbmNlZChQQVNUSVhfUlRfcnRfTElCUkFSWSkKKyAgaWYgKFBBU1RJWF9SVF9ydF9MSUJSQVJZKQorICAgIGxpc3QoQVBQRU5EIFBBU1RJWF9SVF9MSUJSQVJJRVMgIiR7UEFTVElYX1JUX3J0X0xJQlJBUll9IikKKyAgICBsaXN0KEFQUEVORCBQQVNUSVhfRVhUUkFfTElCUkFSSUVTICIke1BBU1RJWF9SVF9ydF9MSUJSQVJZfSIpCisgIGVsc2UoKQorICAgIGlmIChQQVNUSVhfRklORF9SRVFVSVJFRCkKKyAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGxpYnJ0IG9uIHlvdXIgc3lzdGVtIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBQQVNUSVggZGVwZW5kcyBvbiBIV0xPQworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgKE5PVCBQQVNUSVhfRklORF9RVUlFVExZKQorICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgUEFTVElYIC0gVHJ5IHRvIGRldGVjdCBIV0xPQyIpCitlbmRpZigpCitpZiAoUEFTVElYX0ZJTkRfUkVRVUlSRUQpCisgIGZpbmRfcGFja2FnZShIV0xPQyBSRVFVSVJFRCBRVUlFVCkKK2Vsc2UoKQorICBmaW5kX3BhY2thZ2UoSFdMT0MgUVVJRVQpCitlbmRpZigpCisKKyMgUEFTVElYIGRlcGVuZHMgb24gQkxBUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZiAoTk9UIFBBU1RJWF9GSU5EX1FVSUVUTFkpCisgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQQVNUSVggLSBUcnkgdG8gZGV0ZWN0IEJMQVMiKQorZW5kaWYoKQoraWYgKFBBU1RJWF9GSU5EX1JFUVVJUkVEKQorICBmaW5kX3BhY2thZ2UoQkxBU0VYVCBSRVFVSVJFRCBRVUlFVCkKK2Vsc2UoKQorICBmaW5kX3BhY2thZ2UoQkxBU0VYVCBRVUlFVCkKK2VuZGlmKCkKKworIyBPcHRpb25hbCBkZXBlbmRlbmNpZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUEFTVElYIG1heSBkZXBlbmQgb24gTVBJCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgKE5PVCBNUElfRk9VTkQgQU5EIFBBU1RJWF9MT09LX0ZPUl9NUEkpCisgIGlmIChOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgUEFTVElYIC0gVHJ5IHRvIGRldGVjdCBNUEkiKQorICBlbmRpZigpCisgICMgYWxsb3dzIHRvIHVzZSBhbiBleHRlcm5hbCBtcGkgY29tcGlsYXRpb24gYnkgc2V0dGluZyBjb21waWxlcnMgd2l0aAorICAjIC1ETVBJX0NfQ09NUElMRVI9cGF0aC90by9tcGljYyAtRE1QSV9Gb3J0cmFuX0NPTVBJTEVSPXBhdGgvdG8vbXBpZjkwCisgICMgYXQgY21ha2UgY29uZmlndXJlCisgIGlmKE5PVCBNUElfQ19DT01QSUxFUikKKyAgICBzZXQoTVBJX0NfQ09NUElMRVIgbXBpY2MpCisgIGVuZGlmKCkKKyAgaWYgKFBBU1RJWF9GSU5EX1JFUVVJUkVEIEFORCBQQVNUSVhfRklORF9SRVFVSVJFRF9NUEkpCisgICAgZmluZF9wYWNrYWdlKE1QSSBSRVFVSVJFRCBRVUlFVCkKKyAgZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKE1QSSBRVUlFVCkKKyAgZW5kaWYoKQorICBpZiAoTVBJX0ZPVU5EKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoTVBJX0xJQlJBUlkpCisgICAgbWFya19hc19hZHZhbmNlZChNUElfRVhUUkFfTElCUkFSWSkKKyAgZW5kaWYoKQorZW5kaWYgKE5PVCBNUElfRk9VTkQgQU5EIFBBU1RJWF9MT09LX0ZPUl9NUEkpCisKKyMgUEFTVElYIG1heSBkZXBlbmQgb24gU1RBUlBVCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYoIE5PVCBTVEFSUFVfRk9VTkQgQU5EIFBBU1RJWF9MT09LX0ZPUl9TVEFSUFUpCisKKyAgaWYgKE5PVCBQQVNUSVhfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQQVNUSVggLSBUcnkgdG8gZGV0ZWN0IFN0YXJQVSIpCisgIGVuZGlmKCkKKworICBzZXQoUEFTVElYX1NUQVJQVV9WRVJTSU9OICIxLjEiIENBQ0hFIFNUUklORyAib2xkZXN0IFNUQVJQVSB2ZXJzaW9uIGRlc2lyZWQiKQorCisgICMgY3JlYXRlIGxpc3Qgb2YgY29tcG9uZW50cyBpbiBvcmRlciB0byBtYWtlIGEgc2luZ2xlIGNhbGwgdG8gZmluZF9wYWNrYWdlKHN0YXJwdS4uLikKKyAgIyB3ZSBleHBsaWNpdGx5IG5lZWQgYSBTdGFyUFUgdmVyc2lvbiBidWlsdCB3aXRoIGh3bG9jCisgIHNldChTVEFSUFVfQ09NUE9ORU5UX0xJU1QgIkhXTE9DIikKKworICAjIFN0YXJQVSBtYXkgZGVwZW5kIG9uIE1QSQorICAjIGFsbG93cyB0byB1c2UgYW4gZXh0ZXJuYWwgbXBpIGNvbXBpbGF0aW9uIGJ5IHNldHRpbmcgY29tcGlsZXJzIHdpdGgKKyAgIyAtRE1QSV9DX0NPTVBJTEVSPXBhdGgvdG8vbXBpY2MgLURNUElfRm9ydHJhbl9DT01QSUxFUj1wYXRoL3RvL21waWY5MAorICAjIGF0IGNtYWtlIGNvbmZpZ3VyZQorICBpZiAoUEFTVElYX0xPT0tfRk9SX01QSSkKKyAgICBpZihOT1QgTVBJX0NfQ09NUElMRVIpCisgICAgICBzZXQoTVBJX0NfQ09NUElMRVIgbXBpY2MpCisgICAgZW5kaWYoKQorICAgIGxpc3QoQVBQRU5EIFNUQVJQVV9DT01QT05FTlRfTElTVCAiTVBJIikKKyAgZW5kaWYoKQorICBpZiAoUEFTVElYX0xPT0tfRk9SX1NUQVJQVV9DVURBKQorICAgIGxpc3QoQVBQRU5EIFNUQVJQVV9DT01QT05FTlRfTElTVCAiQ1VEQSIpCisgIGVuZGlmKCkKKyAgaWYgKFBBU1RJWF9MT09LX0ZPUl9TVEFSUFVfRlhUKQorICAgIGxpc3QoQVBQRU5EIFNUQVJQVV9DT01QT05FTlRfTElTVCAiRlhUIikKKyAgZW5kaWYoKQorICAjIHNldCB0aGUgbGlzdCBvZiBvcHRpb25hbCBkZXBlbmRlbmNpZXMgd2UgbWF5IGRpc2NvdmVyCisgIGlmIChQQVNUSVhfRklORF9SRVFVSVJFRCBBTkQgUEFTVElYX0ZJTkRfUkVRVUlSRURfU1RBUlBVKQorICAgIGZpbmRfcGFja2FnZShTVEFSUFUgJHtQQVNUSVhfU1RBUlBVX1ZFUlNJT059IFJFUVVJUkVECisgICAgICBDT01QT05FTlRTICR7U1RBUlBVX0NPTVBPTkVOVF9MSVNUfSkKKyAgZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKFNUQVJQVSAke1BBU1RJWF9TVEFSUFVfVkVSU0lPTn0KKyAgICAgIENPTVBPTkVOVFMgJHtTVEFSUFVfQ09NUE9ORU5UX0xJU1R9KQorICBlbmRpZigpCisKK2VuZGlmKCBOT1QgU1RBUlBVX0ZPVU5EIEFORCBQQVNUSVhfTE9PS19GT1JfU1RBUlBVKQorCisjIFBBU1RJWCBtYXkgZGVwZW5kcyBvbiBTQ09UQ0gKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgKE5PVCBTQ09UQ0hfRk9VTkQgQU5EIFBBU1RJWF9MT09LX0ZPUl9TQ09UQ0gpCisgIGlmIChOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgUEFTVElYIC0gVHJ5IHRvIGRldGVjdCBTQ09UQ0giKQorICBlbmRpZigpCisgIGlmIChQQVNUSVhfRklORF9SRVFVSVJFRCBBTkQgUEFTVElYX0ZJTkRfUkVRVUlSRURfU0NPVENIKQorICAgIGZpbmRfcGFja2FnZShTQ09UQ0ggUkVRVUlSRUQgUVVJRVQpCisgIGVsc2UoKQorICAgIGZpbmRfcGFja2FnZShTQ09UQ0ggUVVJRVQpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBQQVNUSVggbWF5IGRlcGVuZHMgb24gUFRTQ09UQ0gKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZiAoTk9UIFBUU0NPVENIX0ZPVU5EIEFORCBQQVNUSVhfTE9PS19GT1JfUFRTQ09UQ0gpCisgIGlmIChOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgUEFTVElYIC0gVHJ5IHRvIGRldGVjdCBQVFNDT1RDSCIpCisgIGVuZGlmKCkKKyAgaWYgKFBBU1RJWF9GSU5EX1JFUVVJUkVEIEFORCBQQVNUSVhfRklORF9SRVFVSVJFRF9QVFNDT1RDSCkKKyAgICBmaW5kX3BhY2thZ2UoUFRTQ09UQ0ggUkVRVUlSRUQgUVVJRVQpCisgIGVsc2UoKQorICAgIGZpbmRfcGFja2FnZShQVFNDT1RDSCBRVUlFVCkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIFBBU1RJWCBtYXkgZGVwZW5kcyBvbiBNRVRJUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmIChOT1QgTUVUSVNfRk9VTkQgQU5EIFBBU1RJWF9MT09LX0ZPUl9NRVRJUykKKyAgaWYgKE5PVCBQQVNUSVhfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBQQVNUSVggLSBUcnkgdG8gZGV0ZWN0IE1FVElTIikKKyAgZW5kaWYoKQorICBpZiAoUEFTVElYX0ZJTkRfUkVRVUlSRUQgQU5EIFBBU1RJWF9GSU5EX1JFUVVJUkVEX01FVElTKQorICAgIGZpbmRfcGFja2FnZShNRVRJUyBSRVFVSVJFRCBRVUlFVCkKKyAgZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKE1FVElTIFFVSUVUKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgRXJyb3IgaWYgcGFzdGl4IHJlcXVpcmVkIGFuZCBubyBwYXJ0aXRpb25pbmcgbGliIGZvdW5kCitpZiAoUEFTVElYX0ZJTkRfUkVRVUlSRUQgQU5EIE5PVCBTQ09UQ0hfRk9VTkQgQU5EIE5PVCBQVFNDT1RDSF9GT1VORCBBTkQgTk9UIE1FVElTX0ZPVU5EKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBhbnkgcGFydGl0aW9uaW5nIGxpYnJhcnkgb24geW91ciBzeXN0ZW0iCisgICAgIiAoaW5zdGFsbCBzY290Y2gsIHB0c2NvdGNoIG9yIG1ldGlzKSIpCitlbmRpZigpCisKKworIyBMb29raW5nIGZvciBQYVN0aVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTG9va2luZyBmb3IgaW5jbHVkZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQWRkIHN5c3RlbSBpbmNsdWRlIHBhdGhzIHRvIHNlYXJjaCBpbmNsdWRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordW5zZXQoX2luY19lbnYpCitzZXQoRU5WX1BBU1RJWF9ESVIgIiRFTlZ7UEFTVElYX0RJUn0iKQorc2V0KEVOVl9QQVNUSVhfSU5DRElSICIkRU5We1BBU1RJWF9JTkNESVJ9IikKK2lmKEVOVl9QQVNUSVhfSU5DRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfUEFTVElYX0lOQ0RJUn0iKQorZWxzZWlmKEVOVl9QQVNUSVhfRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfUEFTVElYX0RJUn0iKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfUEFTVElYX0RJUn0vaW5jbHVkZSIpCisgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0VOVl9QQVNUSVhfRElSfS9pbmNsdWRlL3Bhc3RpeCIpCitlbHNlKCkKKyAgaWYoV0lOMzIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfaW5jX2VudiAiJEVOVntJTkNMVURFfSIpCisgIGVsc2UoKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntDX0lOQ0xVREVfUEFUSH0iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NQQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERV9QQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX1BMQVRGT1JNX0lNUExJQ0lUX0lOQ0xVREVfRElSRUNUT1JJRVN9IikKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfaW5jX2VudikKKworCisjIFRyeSB0byBmaW5kIHRoZSBwYXN0aXggaGVhZGVyIGluIHRoZSBnaXZlbiBwYXRocworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBoZWFkZXIgcGF0aAoraWYoUEFTVElYX0lOQ0RJUikKKyAgc2V0KFBBU1RJWF9wYXN0aXguaF9ESVJTICJQQVNUSVhfcGFzdGl4LmhfRElSUy1OT1RGT1VORCIpCisgIGZpbmRfcGF0aChQQVNUSVhfcGFzdGl4LmhfRElSUworICAgIE5BTUVTIHBhc3RpeC5oCisgICAgSElOVFMgJHtQQVNUSVhfSU5DRElSfSkKK2Vsc2UoKQorICBpZihQQVNUSVhfRElSKQorICAgIHNldChQQVNUSVhfcGFzdGl4LmhfRElSUyAiUEFTVElYX3Bhc3RpeC5oX0RJUlMtTk9URk9VTkQiKQorICAgIGZpbmRfcGF0aChQQVNUSVhfcGFzdGl4LmhfRElSUworICAgICAgTkFNRVMgcGFzdGl4LmgKKyAgICAgIEhJTlRTICR7UEFTVElYX0RJUn0KKyAgICAgIFBBVEhfU1VGRklYRVMgImluY2x1ZGUiICJpbmNsdWRlL3Bhc3RpeCIpCisgIGVsc2UoKQorICAgIHNldChQQVNUSVhfcGFzdGl4LmhfRElSUyAiUEFTVElYX3Bhc3RpeC5oX0RJUlMtTk9URk9VTkQiKQorICAgIGZpbmRfcGF0aChQQVNUSVhfcGFzdGl4LmhfRElSUworICAgICAgTkFNRVMgcGFzdGl4LmgKKyAgICAgIEhJTlRTICR7X2luY19lbnZ9CisgICAgICBQQVRIX1NVRkZJWEVTICJwYXN0aXgiKQorICBlbmRpZigpCitlbmRpZigpCittYXJrX2FzX2FkdmFuY2VkKFBBU1RJWF9wYXN0aXguaF9ESVJTKQorCisjIElmIGZvdW5kLCBhZGQgcGF0aCB0byBjbWFrZSB2YXJpYWJsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmIChQQVNUSVhfcGFzdGl4LmhfRElSUykKKyAgc2V0KFBBU1RJWF9JTkNMVURFX0RJUlMgIiR7UEFTVElYX3Bhc3RpeC5oX0RJUlN9IikKK2Vsc2UgKCkKKyAgc2V0KFBBU1RJWF9JTkNMVURFX0RJUlMgIlBBU1RJWF9JTkNMVURFX0RJUlMtTk9URk9VTkQiKQorICBpZihOT1QgUEFTVElYX0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTG9va2luZyBmb3IgcGFzdGl4IC0tIHBhc3RpeC5oIG5vdCBmb3VuZCIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworCisjIExvb2tpbmcgZm9yIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0KKworIyBBZGQgc3lzdGVtIGxpYnJhcnkgcGF0aHMgdG8gc2VhcmNoIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordW5zZXQoX2xpYl9lbnYpCitzZXQoRU5WX1BBU1RJWF9MSUJESVIgIiRFTlZ7UEFTVElYX0xJQkRJUn0iKQoraWYoRU5WX1BBU1RJWF9MSUJESVIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9QQVNUSVhfTElCRElSfSIpCitlbHNlaWYoRU5WX1BBU1RJWF9ESVIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9QQVNUSVhfRElSfSIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9QQVNUSVhfRElSfS9saWIiKQorZWxzZSgpCisgIGlmKFdJTjMyKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYl9lbnYgIiRFTlZ7TElCfSIpCisgIGVsc2UoKQorICAgIGlmKEFQUExFKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGVsc2UoKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICBlbmRpZigpCitlbmRpZigpCitsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIF9saWJfZW52KQorCisjIFRyeSB0byBmaW5kIHRoZSBwYXN0aXggbGliIGluIHRoZSBnaXZlbiBwYXRocworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBjcmVhdGUgbGlzdCBvZiBsaWJzIHRvIGZpbmQKK3NldChQQVNUSVhfbGlic190b19maW5kICJwYXN0aXhfbXVyZ2U7cGFzdGl4IikKKworIyBjYWxsIGNtYWtlIG1hY3JvIHRvIGZpbmQgdGhlIGxpYiBwYXRoCitpZihQQVNUSVhfTElCRElSKQorICBmb3JlYWNoKHBhc3RpeF9saWIgJHtQQVNUSVhfbGlic190b19maW5kfSkKKyAgICBzZXQoUEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWSAiUEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWS1OT1RGT1VORCIpCisgICAgZmluZF9saWJyYXJ5KFBBU1RJWF8ke3Bhc3RpeF9saWJ9X0xJQlJBUlkKKyAgICAgIE5BTUVTICR7cGFzdGl4X2xpYn0KKyAgICAgIEhJTlRTICR7UEFTVElYX0xJQkRJUn0pCisgIGVuZGZvcmVhY2goKQorZWxzZSgpCisgIGlmKFBBU1RJWF9ESVIpCisgICAgZm9yZWFjaChwYXN0aXhfbGliICR7UEFTVElYX2xpYnNfdG9fZmluZH0pCisgICAgICBzZXQoUEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWSAiUEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWS1OT1RGT1VORCIpCisgICAgICBmaW5kX2xpYnJhcnkoUEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWQorCU5BTUVTICR7cGFzdGl4X2xpYn0KKwlISU5UUyAke1BBU1RJWF9ESVJ9CisJUEFUSF9TVUZGSVhFUyBsaWIgbGliMzIgbGliNjQpCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2UoKQorICAgIGZvcmVhY2gocGFzdGl4X2xpYiAke1BBU1RJWF9saWJzX3RvX2ZpbmR9KQorICAgICAgc2V0KFBBU1RJWF8ke3Bhc3RpeF9saWJ9X0xJQlJBUlkgIlBBU1RJWF8ke3Bhc3RpeF9saWJ9X0xJQlJBUlktTk9URk9VTkQiKQorICAgICAgZmluZF9saWJyYXJ5KFBBU1RJWF8ke3Bhc3RpeF9saWJ9X0xJQlJBUlkKKwlOQU1FUyAke3Bhc3RpeF9saWJ9CisJSElOVFMgJHtfbGliX2Vudn0pCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBJZiBmb3VuZCwgYWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmb3JlYWNoKHBhc3RpeF9saWIgJHtQQVNUSVhfbGlic190b19maW5kfSkKKworICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KCR7cGFzdGl4X2xpYn1fbGliX3BhdGggJHtQQVNUSVhfJHtwYXN0aXhfbGlifV9MSUJSQVJZfSBQQVRIKQorICAjIHNldCBjbWFrZSB2YXJpYWJsZXMgKHJlc3BlY3RzIG5hbWluZyBjb252ZW50aW9uKQorICBpZiAoUEFTVElYX0xJQlJBUklFUykKKyAgICBsaXN0KEFQUEVORCBQQVNUSVhfTElCUkFSSUVTICIke1BBU1RJWF8ke3Bhc3RpeF9saWJ9X0xJQlJBUll9IikKKyAgZWxzZSgpCisgICAgc2V0KFBBU1RJWF9MSUJSQVJJRVMgIiR7UEFTVElYXyR7cGFzdGl4X2xpYn1fTElCUkFSWX0iKQorICBlbmRpZigpCisgIGlmIChQQVNUSVhfTElCUkFSWV9ESVJTKQorICAgIGxpc3QoQVBQRU5EIFBBU1RJWF9MSUJSQVJZX0RJUlMgIiR7JHtwYXN0aXhfbGlifV9saWJfcGF0aH0iKQorICBlbHNlKCkKKyAgICBzZXQoUEFTVElYX0xJQlJBUllfRElSUyAiJHske3Bhc3RpeF9saWJ9X2xpYl9wYXRofSIpCisgIGVuZGlmKCkKKyAgbWFya19hc19hZHZhbmNlZChQQVNUSVhfJHtwYXN0aXhfbGlifV9MSUJSQVJZKQorCitlbmRmb3JlYWNoKHBhc3RpeF9saWIgJHtQQVNUSVhfbGlic190b19maW5kfSkKKworIyBjaGVjayBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBmaW5kCitpZihQQVNUSVhfTElCUkFSSUVTKQorCisgIHNldChSRVFVSVJFRF9MREZMQUdTKQorICBzZXQoUkVRVUlSRURfSU5DRElSUykKKyAgc2V0KFJFUVVJUkVEX0xJQkRJUlMpCisgIHNldChSRVFVSVJFRF9MSUJTKQorCisgICMgUEFTVElYCisgIGlmIChQQVNUSVhfSU5DTFVERV9ESVJTKQorICAgIHNldChSRVFVSVJFRF9JTkNESVJTICIke1BBU1RJWF9JTkNMVURFX0RJUlN9IikKKyAgZW5kaWYoKQorICBmb3JlYWNoKGxpYmRpciAke1BBU1RJWF9MSUJSQVJZX0RJUlN9KQorICAgIGlmIChsaWJkaXIpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJESVJTICIke2xpYmRpcn0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldChSRVFVSVJFRF9MSUJTICIke1BBU1RJWF9MSUJSQVJJRVN9IikKKyAgIyBTVEFSUFUKKyAgaWYgKFBBU1RJWF9MT09LX0ZPUl9TVEFSUFUgQU5EIFNUQVJQVV9GT1VORCkKKyAgICBpZiAoU1RBUlBVX0lOQ0xVREVfRElSU19ERVApCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke1NUQVJQVV9JTkNMVURFX0RJUlNfREVQfSIpCisgICAgZWxzZWlmIChTVEFSUFVfSU5DTFVERV9ESVJTKQorICAgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfSU5DRElSUyAiJHtTVEFSUFVfSU5DTFVERV9ESVJTfSIpCisgICAgZW5kaWYoKQorICAgIGlmKFNUQVJQVV9MSUJSQVJZX0RJUlNfREVQKQorICAgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCRElSUyAiJHtTVEFSUFVfTElCUkFSWV9ESVJTX0RFUH0iKQorICAgIGVsc2VpZihTVEFSUFVfTElCUkFSWV9ESVJTKQorICAgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCRElSUyAiJHtTVEFSUFVfTElCUkFSWV9ESVJTfSIpCisgICAgZW5kaWYoKQorICAgIGlmIChTVEFSUFVfTElCUkFSSUVTX0RFUCkKKyAgICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQlMgIiR7U1RBUlBVX0xJQlJBUklFU19ERVB9IikKKyAgICBlbHNlaWYgKFNUQVJQVV9MSUJSQVJJRVMpCisgICAgICBmb3JlYWNoKGxpYiAke1NUQVJQVV9MSUJSQVJJRVN9KQorCWlmIChFWElTVFMgJHtsaWJ9IE9SICR7bGlifSBNQVRDSEVTICJeLSIpCisJICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke2xpYn0iKQorCWVsc2UoKQorCSAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiLWwke2xpYn0iKQorCWVuZGlmKCkKKyAgICAgIGVuZGZvcmVhY2goKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICAjIENVREEKKyAgaWYgKFBBU1RJWF9MT09LX0ZPUl9TVEFSUFVfQ1VEQSBBTkQgQ1VEQV9GT1VORCkKKyAgICBpZiAoQ1VEQV9JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke0NVREFfSU5DTFVERV9ESVJTfSIpCisgICAgZW5kaWYoKQorICAgIGZvcmVhY2gobGliZGlyICR7Q1VEQV9MSUJSQVJZX0RJUlN9KQorICAgICAgaWYgKGxpYmRpcikKKwlsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJESVJTICIke2xpYmRpcn0iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQlMgIiR7Q1VEQV9DVUJMQVNfTElCUkFSSUVTfTske0NVREFfTElCUkFSSUVTfSIpCisgIGVuZGlmKCkKKyAgIyBNUEkKKyAgaWYgKFBBU1RJWF9MT09LX0ZPUl9NUEkgQU5EIE1QSV9GT1VORCkKKyAgICBpZiAoTVBJX0NfSU5DTFVERV9QQVRIKQorICAgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfSU5DRElSUyAiJHtNUElfQ19JTkNMVURFX1BBVEh9IikKKyAgICBlbmRpZigpCisgICAgaWYgKE1QSV9DX0xJTktfRkxBR1MpCisgICAgICBpZiAoJHtNUElfQ19MSU5LX0ZMQUdTfSBNQVRDSEVTICIgIC0iKQorCXN0cmluZyhSRUdFWCBSRVBMQUNFICIgLSIgIi0iIE1QSV9DX0xJTktfRkxBR1MgJHtNUElfQ19MSU5LX0ZMQUdTfSkKKyAgICAgIGVuZGlmKCkKKyAgICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xERkxBR1MgIiR7TVBJX0NfTElOS19GTEFHU30iKQorICAgIGVuZGlmKCkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke01QSV9DX0xJQlJBUklFU30iKQorICBlbmRpZigpCisgICMgSFdMT0MKKyAgaWYgKEhXTE9DX0ZPVU5EKQorICAgIGlmIChIV0xPQ19JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke0hXTE9DX0lOQ0xVREVfRElSU30iKQorICAgIGVuZGlmKCkKKyAgICBmb3JlYWNoKGxpYmRpciAke0hXTE9DX0xJQlJBUllfRElSU30pCisgICAgICBpZiAobGliZGlyKQorCWxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQkRJUlMgIiR7bGliZGlyfSIpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgZm9yZWFjaChsaWIgJHtIV0xPQ19MSUJSQVJJRVN9KQorICAgICAgaWYgKEVYSVNUUyAke2xpYn0gT1IgJHtsaWJ9IE1BVENIRVMgIl4tIikKKwlsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke2xpYn0iKQorICAgICAgZWxzZSgpCisJbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiLWwke2xpYn0iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZigpCisgICMgQkxBUworICBpZiAoQkxBU19GT1VORCkKKyAgICBpZiAoQkxBU19JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke0JMQVNfSU5DTFVERV9ESVJTfSIpCisgICAgZW5kaWYoKQorICAgIGZvcmVhY2gobGliZGlyICR7QkxBU19MSUJSQVJZX0RJUlN9KQorICAgICAgaWYgKGxpYmRpcikKKwlsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJESVJTICIke2xpYmRpcn0iKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIGxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQlMgIiR7QkxBU19MSUJSQVJJRVN9IikKKyAgICBpZiAoQkxBU19MSU5LRVJfRkxBR1MpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MREZMQUdTICIke0JMQVNfTElOS0VSX0ZMQUdTfSIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgICMgU0NPVENICisgIGlmIChQQVNUSVhfTE9PS19GT1JfU0NPVENIIEFORCBTQ09UQ0hfRk9VTkQpCisgICAgaWYgKFNDT1RDSF9JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke1NDT1RDSF9JTkNMVURFX0RJUlN9IikKKyAgICBlbmRpZigpCisgICAgZm9yZWFjaChsaWJkaXIgJHtTQ09UQ0hfTElCUkFSWV9ESVJTfSkKKyAgICAgIGlmIChsaWJkaXIpCisJbGlzdChBUFBFTkQgUkVRVUlSRURfTElCRElSUyAiJHtsaWJkaXJ9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRmb3JlYWNoKCkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke1NDT1RDSF9MSUJSQVJJRVN9IikKKyAgZW5kaWYoKQorICAjIFBUU0NPVENICisgIGlmIChQQVNUSVhfTE9PS19GT1JfUFRTQ09UQ0ggQU5EIFBUU0NPVENIX0ZPVU5EKQorICAgIGlmIChQVFNDT1RDSF9JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke1BUU0NPVENIX0lOQ0xVREVfRElSU30iKQorICAgIGVuZGlmKCkKKyAgICBmb3JlYWNoKGxpYmRpciAke1BUU0NPVENIX0xJQlJBUllfRElSU30pCisgICAgICBpZiAobGliZGlyKQorCWxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQkRJUlMgIiR7bGliZGlyfSIpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiJHtQVFNDT1RDSF9MSUJSQVJJRVN9IikKKyAgZW5kaWYoKQorICAjIE1FVElTCisgIGlmIChQQVNUSVhfTE9PS19GT1JfTUVUSVMgQU5EIE1FVElTX0ZPVU5EKQorICAgIGlmIChNRVRJU19JTkNMVURFX0RJUlMpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9JTkNESVJTICIke01FVElTX0lOQ0xVREVfRElSU30iKQorICAgIGVuZGlmKCkKKyAgICBmb3JlYWNoKGxpYmRpciAke01FVElTX0xJQlJBUllfRElSU30pCisgICAgICBpZiAobGliZGlyKQorCWxpc3QoQVBQRU5EIFJFUVVJUkVEX0xJQkRJUlMgIiR7bGliZGlyfSIpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiJHtNRVRJU19MSUJSQVJJRVN9IikKKyAgZW5kaWYoKQorICAjIEZvcnRyYW4KKyAgaWYgKENNQUtFX0NfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIikKKyAgICBmaW5kX2xpYnJhcnkoCisgICAgICBGT1JUUkFOX2dmb3J0cmFuX0xJQlJBUlkKKyAgICAgIE5BTUVTIGdmb3J0cmFuCisgICAgICBISU5UUyAke19saWJfZW52fQorICAgICAgKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoRk9SVFJBTl9nZm9ydHJhbl9MSUJSQVJZKQorICAgIGlmIChGT1JUUkFOX2dmb3J0cmFuX0xJQlJBUlkpCisgICAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke0ZPUlRSQU5fZ2ZvcnRyYW5fTElCUkFSWX0iKQorICAgIGVuZGlmKCkKKyAgZWxzZWlmIChDTUFLRV9DX0NPTVBJTEVSX0lEIE1BVENIRVMgIkludGVsIikKKyAgICBmaW5kX2xpYnJhcnkoCisgICAgICBGT1JUUkFOX2lmY29yZV9MSUJSQVJZCisgICAgICBOQU1FUyBpZmNvcmUKKyAgICAgIEhJTlRTICR7X2xpYl9lbnZ9CisgICAgICApCisgICAgbWFya19hc19hZHZhbmNlZChGT1JUUkFOX2lmY29yZV9MSUJSQVJZKQorICAgIGlmIChGT1JUUkFOX2lmY29yZV9MSUJSQVJZKQorICAgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiJHtGT1JUUkFOX2lmY29yZV9MSUJSQVJZfSIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgICMgRVhUUkEgTElCUyBzdWNoIHRoYXQgcHRocmVhZCwgbSwgcnQKKyAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAke1BBU1RJWF9FWFRSQV9MSUJSQVJJRVN9KQorCisgICMgc2V0IHJlcXVpcmVkIGxpYnJhcmllcyBmb3IgbGluaworICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgIiR7UkVRVUlSRURfSU5DRElSU30iKQorICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7UkVRVUlSRURfTERGTEFHU30iKQorICBmb3JlYWNoKGxpYl9kaXIgJHtSRVFVSVJFRF9MSUJESVJTfSkKKyAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIi1MJHtsaWJfZGlyfSIpCisgIGVuZGZvcmVhY2goKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIiR7UkVRVUlSRURfTElCU30iKQorICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtSRVFVSVJFRF9GTEFHU30iKQorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXiAtIiAiLSIgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICIke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorCisgICMgdGVzdCBsaW5rCisgIHVuc2V0KFBBU1RJWF9XT1JLUyBDQUNIRSkKKyAgaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQorICBjaGVja19mdW5jdGlvbl9leGlzdHMocGFzdGl4IFBBU1RJWF9XT1JLUykKKyAgbWFya19hc19hZHZhbmNlZChQQVNUSVhfV09SS1MpCisKKyAgaWYoUEFTVElYX1dPUktTKQorICAgICMgc2F2ZSBsaW5rIHdpdGggZGVwZW5kZW5jaWVzCisgICAgc2V0KFBBU1RJWF9MSUJSQVJJRVNfREVQICIke1JFUVVJUkVEX0xJQlN9IikKKyAgICBzZXQoUEFTVElYX0xJQlJBUllfRElSU19ERVAgIiR7UkVRVUlSRURfTElCRElSU30iKQorICAgIHNldChQQVNUSVhfSU5DTFVERV9ESVJTX0RFUCAiJHtSRVFVSVJFRF9JTkNESVJTfSIpCisgICAgc2V0KFBBU1RJWF9MSU5LRVJfRkxBR1MgIiR7UkVRVUlSRURfTERGTEFHU30iKQorICAgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgUEFTVElYX0xJQlJBUllfRElSU19ERVApCisgICAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBQQVNUSVhfSU5DTFVERV9ESVJTX0RFUCkKKyAgICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIFBBU1RJWF9MSU5LRVJfRkxBR1MpCisgIGVsc2UoKQorICAgIGlmKE5PVCBQQVNUSVhfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFBBU1RJWCA6IHRlc3Qgb2YgcGFzdGl4KCkgZmFpbHMiKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkNNQUtFX1JFUVVJUkVEX0xJQlJBUklFUzogJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDTUFLRV9SRVFVSVJFRF9JTkNMVURFUzogJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU30iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkNoZWNrIGluIENNYWtlRmlsZXMvQ01ha2VFcnJvci5sb2cgdG8gZmlndXJlIG91dCB3aHkgaXQgZmFpbHMiKQorICAgICAgbWVzc2FnZShTVEFUVVMgIk1heWJlIFBBU1RJWCBpcyBsaW5rZWQgd2l0aCBzcGVjaWZpYyBsaWJyYXJpZXMuICIKKwkiSGF2ZSB5b3UgdHJpZWQgd2l0aCBDT01QT05FTlRTIChNUEkvU0VRLCBTVEFSUFUsIFNUQVJQVV9DVURBLCBTQ09UQ0gsIFBUU0NPVENILCBNRVRJUyk/ICIKKwkiU2VlIHRoZSBleHBsYW5hdGlvbiBpbiBGaW5kUEFTVElYLmNtYWtlLiIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUykKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTKQorICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQorZW5kaWYoUEFTVElYX0xJQlJBUklFUykKKworaWYgKFBBU1RJWF9MSUJSQVJJRVMpCisgIGxpc3QoR0VUIFBBU1RJWF9MSUJSQVJJRVMgMCBmaXJzdF9saWIpCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoZmlyc3RfbGliX3BhdGggIiR7Zmlyc3RfbGlifSIgUEFUSCkKKyAgaWYgKCR7Zmlyc3RfbGliX3BhdGh9IE1BVENIRVMgIi9saWIoMzJ8NjQpPyQiKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIvbGliKDMyfDY0KT8kIiAiIiBub3RfY2FjaGVkX2RpciAiJHtmaXJzdF9saWJfcGF0aH0iKQorICAgIHNldChQQVNUSVhfRElSX0ZPVU5EICIke25vdF9jYWNoZWRfZGlyfSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQQVNUSVggbGlicmFyeSIgRk9SQ0UpCisgIGVsc2UoKQorICAgIHNldChQQVNUSVhfRElSX0ZPVU5EICIke2ZpcnN0X2xpYl9wYXRofSIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBQQVNUSVggbGlicmFyeSIgRk9SQ0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKK21hcmtfYXNfYWR2YW5jZWQoUEFTVElYX0RJUikKK21hcmtfYXNfYWR2YW5jZWQoUEFTVElYX0RJUl9GT1VORCkKKworIyBjaGVjayB0aGF0IFBBU1RJWCBoYXMgYmVlbiBmb3VuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUEFTVElYIERFRkFVTFRfTVNHCisgIFBBU1RJWF9MSUJSQVJJRVMKKyAgUEFTVElYX1dPUktTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZFNQUVIuY21ha2UgYi9jbWFrZS9GaW5kU1BRUi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk1OGMzCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZFNQUVIuY21ha2UKQEAgLTAsMCArMSw0MSBAQAorIyBTUFFSIGxpYiB1c3VhbGx5IHJlcXVpcmVzIGxpbmtpbmcgdG8gYSBibGFzIGFuZCBsYXBhY2sgbGlicmFyeS4KKyMgSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBtb2R1bGUgdG8gZmluZCBhIEJMQVMgYW5kIGxpbmsgdG8gaXQuCisKKyMgU1BRUiBsaWIgcmVxdWlyZXMgQ2hvbG1vZCwgY29sYW1kIGFuZCBhbWQgYXMgd2VsbC4gCisjIEZpbmRDaG9sbW9kLmNtYWtlIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhvc2UgcGFja2FnZXMgYmVmb3JlIGZpbmRpbmcgc3BxcgorCitpZiAoU1BRUl9JTkNMVURFUyBBTkQgU1BRUl9MSUJSQVJJRVMpCisgIHNldChTUFFSX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKFNQUVJfSU5DTFVERVMgQU5EIFNQUVJfTElCUkFSSUVTKQorCitmaW5kX3BhdGgoU1BRUl9JTkNMVURFUworICBOQU1FUworICBTdWl0ZVNwYXJzZVFSLmhwcAorICBQQVRIUworICAkRU5We1NQUVJESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgUEFUSF9TVUZGSVhFUworICBzdWl0ZXNwYXJzZQorICB1ZnNwYXJzZQorKQorCitmaW5kX2xpYnJhcnkoU1BRUl9MSUJSQVJJRVMgc3BxciAkRU5We1NQUVJESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaWYoU1BRUl9MSUJSQVJJRVMpCisKKyAgZmluZF9saWJyYXJ5KFNVSVRFU1BBUlNFX0xJQlJBUlkgU3VpdGVTcGFyc2UgUEFUSFMgJEVOVntTUFFSRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChTVUlURVNQQVJTRV9MSUJSQVJZKQorICAgIHNldChTUFFSX0xJQlJBUklFUyAke1NQUVJfTElCUkFSSUVTfSAke1NVSVRFU1BBUlNFX0xJQlJBUll9KQorICBlbmRpZigpCisKKyAgZmluZF9saWJyYXJ5KENIT0xNT0RfTElCUkFSWSBjaG9sbW9kIFBBVEhTICRFTlZ7VU1GUEFDS19MSUJESVJ9ICRFTlZ7VU1GUEFDS0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorICBpZihDSE9MTU9EX0xJQlJBUlkpCisgICAgc2V0KFNQUVJfTElCUkFSSUVTICR7U1BRUl9MSUJSQVJJRVN9ICR7Q0hPTE1PRF9MSUJSQVJZfSkKKyAgZW5kaWYoKQorICAKK2VuZGlmKFNQUVJfTElCUkFSSUVTKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFNQUVIgREVGQVVMVF9NU0cgU1BRUl9JTkNMVURFUyBTUFFSX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChTUFFSX0lOQ0xVREVTIFNQUVJfTElCUkFSSUVTKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRTY290Y2guY21ha2UgYi9jbWFrZS9GaW5kU2NvdGNoLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDI5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kU2NvdGNoLmNtYWtlCkBAIC0wLDAgKzEsMzY5IEBACisjIyMKKyMKKyMgQGNvcHlyaWdodCAoYykgMjAwOS0yMDE0IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IElucmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQm9yZGVhdXggSU5QLCBDTlJTIChMYUJSSSBVTVIgNTgwMCksIElucmlhLCBVbml2LiBCb3JkZWF1eC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMjIworIworIyAtIEZpbmQgU0NPVENIIGluY2x1ZGUgZGlycyBhbmQgbGlicmFyaWVzCisjIFVzZSB0aGlzIG1vZHVsZSBieSBpbnZva2luZyBmaW5kX3BhY2thZ2Ugd2l0aCB0aGUgZm9ybToKKyMgIGZpbmRfcGFja2FnZShTQ09UQ0gKKyMgICAgICAgICAgICAgICBbUkVRVUlSRURdICAgICAgICAgICAgICMgRmFpbCB3aXRoIGVycm9yIGlmIHNjb3RjaCBpcyBub3QgZm91bmQKKyMgICAgICAgICAgICAgICBbQ09NUE9ORU5UUyA8Y29tcDE+IDxjb21wMj4gLi4uXSAjIGRlcGVuZGVuY2llcworIyAgICAgICAgICAgICAgKQorIworIyAgQ09NUE9ORU5UUyBjYW4gYmUgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgIC0gRVNNVU1QUzogdG8gYWN0aXZhdGUgZGV0ZWN0aW9uIG9mIFNjb3RjaCB3aXRoIHRoZSBlc211bXBzIGludGVyZmFjZQorIworIyBUaGlzIG1vZHVsZSBmaW5kcyBoZWFkZXJzIGFuZCBzY290Y2ggbGlicmFyeS4KKyMgUmVzdWx0cyBhcmUgcmVwb3J0ZWQgaW4gdmFyaWFibGVzOgorIyAgU0NPVENIX0ZPVU5EICAgICAgICAgICAtIFRydWUgaWYgaGVhZGVycyBhbmQgcmVxdWVzdGVkIGxpYnJhcmllcyB3ZXJlIGZvdW5kCisjICBTQ09UQ0hfSU5DTFVERV9ESVJTICAgIC0gc2NvdGNoIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIFNDT1RDSF9MSUJSQVJZX0RJUlMgICAgLSBMaW5rIGRpcmVjdG9yaWVzIGZvciBzY290Y2ggbGlicmFyaWVzCisjICBTQ09UQ0hfTElCUkFSSUVTICAgICAgIC0gc2NvdGNoIGNvbXBvbmVudCBsaWJyYXJpZXMgdG8gYmUgbGlua2VkCisjICBTQ09UQ0hfSU5UU0laRSAgICAgICAgIC0gTnVtYmVyIG9mIG9jdGV0cyBvY2N1cGllZCBieSBhIFNDT1RDSF9OdW0KKyMKKyMgVGhlIHVzZXIgY2FuIGdpdmUgc3BlY2lmaWMgcGF0aHMgd2hlcmUgdG8gZmluZCB0aGUgbGlicmFyaWVzIGFkZGluZyBjbWFrZQorIyBvcHRpb25zIGF0IGNvbmZpZ3VyZSAoZXg6IGNtYWtlIHBhdGgvdG8vcHJvamVjdCAtRFNDT1RDSD1wYXRoL3RvL3Njb3RjaCk6CisjICBTQ09UQ0hfRElSICAgICAgICAgICAgIC0gV2hlcmUgdG8gZmluZCB0aGUgYmFzZSBkaXJlY3Rvcnkgb2Ygc2NvdGNoCisjICBTQ09UQ0hfSU5DRElSICAgICAgICAgIC0gV2hlcmUgdG8gZmluZCB0aGUgaGVhZGVyIGZpbGVzCisjICBTQ09UQ0hfTElCRElSICAgICAgICAgIC0gV2hlcmUgdG8gZmluZCB0aGUgbGlicmFyeSBmaWxlcworIyBUaGUgbW9kdWxlIGNhbiBhbHNvIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIHBhdGhzCisjIGFyZSBub3QgZ2l2ZW4gYXMgY21ha2UgdmFyaWFibGU6IFNDT1RDSF9ESVIsIFNDT1RDSF9JTkNESVIsIFNDT1RDSF9MSUJESVIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENvcHlyaWdodCAyMDEyLTIwMTMgSW5yaWEKKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBFbW1hbnVlbCBBZ3VsbG8KKyMgQ29weXJpZ2h0IDIwMTItMjAxMyBNYXRoaWV1IEZhdmVyZ2UKKyMgQ29weXJpZ2h0IDIwMTIgICAgICBDZWRyaWMgQ2FzdGFnbmVkZQorIyBDb3B5cmlnaHQgMjAxMyAgICAgIEZsb3JlbnQgUHJ1dm9zdAorIworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgT1NJLWFwcHJvdmVkIEJTRCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsKKyMgc2VlIGFjY29tcGFueWluZyBmaWxlIE1PUlNFLUNvcHlyaWdodC50eHQgZm9yIGRldGFpbHMuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUKKyMgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAoVG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3V0c2lkZSBvZiBNb3JzZSwgc3Vic3RpdHV0ZSB0aGUgZnVsbAorIyAgTGljZW5zZSB0ZXh0IGZvciB0aGUgYWJvdmUgcmVmZXJlbmNlLikKKworaWYgKE5PVCBTQ09UQ0hfRk9VTkQpCisgIHNldChTQ09UQ0hfRElSICIiIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgU0NPVENIIGxpYnJhcnkiKQorICBpZiAoTk9UIFNDT1RDSF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkEgY2FjaGUgdmFyaWFibGUsIG5hbWVseSBTQ09UQ0hfRElSLCBoYXMgYmVlbiBzZXQgdG8gc3BlY2lmeSB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgU0NPVENIIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIFNldCB0aGUgdmVyc2lvbiB0byBmaW5kCitzZXQoU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMgT0ZGKQorCitpZiggU0NPVENIX0ZJTkRfQ09NUE9ORU5UUyApCisgIGZvcmVhY2goIGNvbXBvbmVudCAke1NDT1RDSF9GSU5EX0NPTVBPTkVOVFN9ICkKKyAgICBpZiAoJHtjb21wb25lbnR9IFNUUkVRVUFMICJFU01VTVBTIikKKyAgICAgICMgbWVhbnMgd2UgbG9vayBmb3IgZXNtdW1wcyBsaWJyYXJ5CisgICAgICBzZXQoU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMgT04pCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKK2VuZGlmKCkKKworIyBTQ09UQ0ggbWF5IGRlcGVuZCBvbiBUaHJlYWRzLCB0cnkgdG8gZmluZCBpdAoraWYgKE5PVCBUSFJFQURTX0ZPVU5EKQorICBpZiAoU0NPVENIX0ZJTkRfUkVRVUlSRUQpCisgICAgZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCisgIGVsc2UoKQorICAgIGZpbmRfcGFja2FnZShUaHJlYWRzKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgTG9va2luZyBmb3IgaW5jbHVkZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQWRkIHN5c3RlbSBpbmNsdWRlIHBhdGhzIHRvIHNlYXJjaCBpbmNsdWRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordW5zZXQoX2luY19lbnYpCitzZXQoRU5WX1NDT1RDSF9ESVIgIiRFTlZ7U0NPVENIX0RJUn0iKQorc2V0KEVOVl9TQ09UQ0hfSU5DRElSICIkRU5We1NDT1RDSF9JTkNESVJ9IikKK2lmKEVOVl9TQ09UQ0hfSU5DRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfU0NPVENIX0lOQ0RJUn0iKQorZWxzZWlmKEVOVl9TQ09UQ0hfRElSKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfU0NPVENIX0RJUn0iKQorICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtFTlZfU0NPVENIX0RJUn0vaW5jbHVkZSIpCisgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke0VOVl9TQ09UQ0hfRElSfS9pbmNsdWRlL3Njb3RjaCIpCitlbHNlKCkKKyAgaWYoV0lOMzIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfaW5jX2VudiAiJEVOVntJTkNMVURFfSIpCisgIGVsc2UoKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0lOQ0xVREV9IikKKyAgICBsaXN0KEFQUEVORCBfaW5jX2VudiAiJHtfcGF0aF9lbnZ9IikKKyAgICBzdHJpbmcoUkVQTEFDRSAiOiIgIjsiIF9wYXRoX2VudiAiJEVOVntDX0lOQ0xVREVfUEFUSH0iKQorICAgIGxpc3QoQVBQRU5EIF9pbmNfZW52ICIke19wYXRoX2Vudn0iKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX3BhdGhfZW52ICIkRU5We0NQQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfcGF0aF9lbnYgIiRFTlZ7SU5DTFVERV9QQVRIfSIpCisgICAgbGlzdChBUFBFTkQgX2luY19lbnYgIiR7X3BhdGhfZW52fSIpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX1BMQVRGT1JNX0lNUExJQ0lUX0lOQ0xVREVfRElSRUNUT1JJRVN9IikKK2xpc3QoQVBQRU5EIF9pbmNfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfSU5DTFVERV9ESVJFQ1RPUklFU30iKQorbGlzdChSRU1PVkVfRFVQTElDQVRFUyBfaW5jX2VudikKKworCisjIFRyeSB0byBmaW5kIHRoZSBzY290Y2ggaGVhZGVyIGluIHRoZSBnaXZlbiBwYXRocworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGwgY21ha2UgbWFjcm8gdG8gZmluZCB0aGUgaGVhZGVyIHBhdGgKK2lmKFNDT1RDSF9JTkNESVIpCisgIHNldChTQ09UQ0hfc2NvdGNoLmhfRElSUyAiU0NPVENIX3Njb3RjaC5oX0RJUlMtTk9URk9VTkQiKQorICBmaW5kX3BhdGgoU0NPVENIX3Njb3RjaC5oX0RJUlMKKyAgICBOQU1FUyBzY290Y2guaAorICAgIEhJTlRTICR7U0NPVENIX0lOQ0RJUn0pCitlbHNlKCkKKyAgaWYoU0NPVENIX0RJUikKKyAgICBzZXQoU0NPVENIX3Njb3RjaC5oX0RJUlMgIlNDT1RDSF9zY290Y2guaF9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoU0NPVENIX3Njb3RjaC5oX0RJUlMKKyAgICAgIE5BTUVTIHNjb3RjaC5oCisgICAgICBISU5UUyAke1NDT1RDSF9ESVJ9CisgICAgICBQQVRIX1NVRkZJWEVTICJpbmNsdWRlIiAiaW5jbHVkZS9zY290Y2giKQorICBlbHNlKCkKKyAgICBzZXQoU0NPVENIX3Njb3RjaC5oX0RJUlMgIlNDT1RDSF9zY290Y2guaF9ESVJTLU5PVEZPVU5EIikKKyAgICBmaW5kX3BhdGgoU0NPVENIX3Njb3RjaC5oX0RJUlMKKyAgICAgIE5BTUVTIHNjb3RjaC5oCisgICAgICBISU5UUyAke19pbmNfZW52fQorICAgICAgUEFUSF9TVUZGSVhFUyAic2NvdGNoIikKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFya19hc19hZHZhbmNlZChTQ09UQ0hfc2NvdGNoLmhfRElSUykKKworIyBJZiBmb3VuZCwgYWRkIHBhdGggdG8gY21ha2UgdmFyaWFibGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZiAoU0NPVENIX3Njb3RjaC5oX0RJUlMpCisgIHNldChTQ09UQ0hfSU5DTFVERV9ESVJTICIke1NDT1RDSF9zY290Y2guaF9ESVJTfSIpCitlbHNlICgpCisgIHNldChTQ09UQ0hfSU5DTFVERV9ESVJTICJTQ09UQ0hfSU5DTFVERV9ESVJTLU5PVEZPVU5EIikKKyAgaWYgKE5PVCBTQ09UQ0hfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBzY290Y2ggLS0gc2NvdGNoLmggbm90IGZvdW5kIikKKyAgZW5kaWYoKQorZW5kaWYoKQorbGlzdChSRU1PVkVfRFVQTElDQVRFUyBTQ09UQ0hfSU5DTFVERV9ESVJTKQorCisjIExvb2tpbmcgZm9yIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0KKworIyBBZGQgc3lzdGVtIGxpYnJhcnkgcGF0aHMgdG8gc2VhcmNoIGxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordW5zZXQoX2xpYl9lbnYpCitzZXQoRU5WX1NDT1RDSF9MSUJESVIgIiRFTlZ7U0NPVENIX0xJQkRJUn0iKQoraWYoRU5WX1NDT1RDSF9MSUJESVIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9TQ09UQ0hfTElCRElSfSIpCitlbHNlaWYoRU5WX1NDT1RDSF9ESVIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9TQ09UQ0hfRElSfSIpCisgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0VOVl9TQ09UQ0hfRElSfS9saWIiKQorZWxzZSgpCisgIGlmKFdJTjMyKQorICAgIHN0cmluZyhSRVBMQUNFICI6IiAiOyIgX2xpYl9lbnYgIiRFTlZ7TElCfSIpCisgIGVsc2UoKQorICAgIGlmKEFQUExFKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGVsc2UoKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIjoiICI7IiBfbGliX2VudiAiJEVOVntMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBlbmRpZigpCisgICAgbGlzdChBUFBFTkQgX2xpYl9lbnYgIiR7Q01BS0VfUExBVEZPUk1fSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICAgIGxpc3QoQVBQRU5EIF9saWJfZW52ICIke0NNQUtFX0NfSU1QTElDSVRfTElOS19ESVJFQ1RPUklFU30iKQorICBlbmRpZigpCitlbmRpZigpCitsaXN0KFJFTU9WRV9EVVBMSUNBVEVTIF9saWJfZW52KQorCisjIFRyeSB0byBmaW5kIHRoZSBzY290Y2ggbGliIGluIHRoZSBnaXZlbiBwYXRocworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NldChTQ09UQ0hfbGlic190b19maW5kICJzY290Y2g7c2NvdGNoZXJyZXhpdCIpCitpZiAoU0NPVENIX0xPT0tfRk9SX0VTTVVNUFMpCisgIGxpc3QoSU5TRVJUIFNDT1RDSF9saWJzX3RvX2ZpbmQgMCAiZXNtdW1wcyIpCitlbmRpZigpCisKKyMgY2FsbCBjbWFrZSBtYWNybyB0byBmaW5kIHRoZSBsaWIgcGF0aAoraWYoU0NPVENIX0xJQkRJUikKKyAgZm9yZWFjaChzY290Y2hfbGliICR7U0NPVENIX2xpYnNfdG9fZmluZH0pCisgICAgc2V0KFNDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUlkgIlNDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUlktTk9URk9VTkQiKQorICAgIGZpbmRfbGlicmFyeShTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZCisgICAgICBOQU1FUyAke3Njb3RjaF9saWJ9CisgICAgICBISU5UUyAke1NDT1RDSF9MSUJESVJ9KQorICBlbmRmb3JlYWNoKCkKK2Vsc2UoKQorICBpZihTQ09UQ0hfRElSKQorICAgIGZvcmVhY2goc2NvdGNoX2xpYiAke1NDT1RDSF9saWJzX3RvX2ZpbmR9KQorICAgICAgc2V0KFNDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUlkgIlNDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUlktTk9URk9VTkQiKQorICAgICAgZmluZF9saWJyYXJ5KFNDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUlkKKwlOQU1FUyAke3Njb3RjaF9saWJ9CisJSElOVFMgJHtTQ09UQ0hfRElSfQorCVBBVEhfU1VGRklYRVMgbGliIGxpYjMyIGxpYjY0KQorICAgIGVuZGZvcmVhY2goKQorICBlbHNlKCkKKyAgICBmb3JlYWNoKHNjb3RjaF9saWIgJHtTQ09UQ0hfbGlic190b19maW5kfSkKKyAgICAgIHNldChTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZICJTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZLU5PVEZPVU5EIikKKyAgICAgIGZpbmRfbGlicmFyeShTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZCisJTkFNRVMgJHtzY290Y2hfbGlifQorCUhJTlRTICR7X2xpYl9lbnZ9KQorICAgIGVuZGZvcmVhY2goKQorICBlbmRpZigpCitlbmRpZigpCisKK3NldChTQ09UQ0hfTElCUkFSSUVTICIiKQorc2V0KFNDT1RDSF9MSUJSQVJZX0RJUlMgIiIpCisjIElmIGZvdW5kLCBhZGQgcGF0aCB0byBjbWFrZSB2YXJpYWJsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ZvcmVhY2goc2NvdGNoX2xpYiAke1NDT1RDSF9saWJzX3RvX2ZpbmR9KQorCisgIGlmIChTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZKQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoJHtzY290Y2hfbGlifV9saWJfcGF0aCAiJHtTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZfSIgUEFUSCkKKyAgICAjIHNldCBjbWFrZSB2YXJpYWJsZXMKKyAgICBsaXN0KEFQUEVORCBTQ09UQ0hfTElCUkFSSUVTICIke1NDT1RDSF8ke3Njb3RjaF9saWJ9X0xJQlJBUll9IikKKyAgICBsaXN0KEFQUEVORCBTQ09UQ0hfTElCUkFSWV9ESVJTICIkeyR7c2NvdGNoX2xpYn1fbGliX3BhdGh9IikKKyAgZWxzZSAoKQorICAgIGxpc3QoQVBQRU5EIFNDT1RDSF9MSUJSQVJJRVMgIiR7U0NPVENIXyR7c2NvdGNoX2xpYn1fTElCUkFSWX0iKQorICAgIGlmIChOT1QgU0NPVENIX0ZJTkRfUVVJRVRMWSkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJMb29raW5nIGZvciBzY290Y2ggLS0gbGliICR7c2NvdGNoX2xpYn0gbm90IGZvdW5kIikKKyAgICBlbmRpZigpCisgIGVuZGlmICgpCisKKyAgbWFya19hc19hZHZhbmNlZChTQ09UQ0hfJHtzY290Y2hfbGlifV9MSUJSQVJZKQorCitlbmRmb3JlYWNoKCkKK2xpc3QoUkVNT1ZFX0RVUExJQ0FURVMgU0NPVENIX0xJQlJBUllfRElSUykKKworIyBjaGVjayBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBmaW5kCitpZihTQ09UQ0hfTElCUkFSSUVTKQorCisgIHNldChSRVFVSVJFRF9JTkNESVJTKQorICBzZXQoUkVRVUlSRURfTElCRElSUykKKyAgc2V0KFJFUVVJUkVEX0xJQlMpCisKKyAgIyBTQ09UQ0gKKyAgaWYgKFNDT1RDSF9JTkNMVURFX0RJUlMpCisgICAgc2V0KFJFUVVJUkVEX0lOQ0RJUlMgICIke1NDT1RDSF9JTkNMVURFX0RJUlN9IikKKyAgZW5kaWYoKQorICBpZiAoU0NPVENIX0xJQlJBUllfRElSUykKKyAgICBzZXQoUkVRVUlSRURfTElCRElSUyAiJHtTQ09UQ0hfTElCUkFSWV9ESVJTfSIpCisgIGVuZGlmKCkKKyAgc2V0KFJFUVVJUkVEX0xJQlMgIiR7U0NPVENIX0xJQlJBUklFU30iKQorICAjIFRIUkVBRFMKKyAgaWYoQ01BS0VfVEhSRUFEX0xJQlNfSU5JVCkKKyAgICBsaXN0KEFQUEVORCBSRVFVSVJFRF9MSUJTICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgZW5kaWYoKQorICBzZXQoWl9MSUJSQVJZICJaX0xJQlJBUlktTk9URk9VTkQiKQorICBmaW5kX2xpYnJhcnkoWl9MSUJSQVJZIE5BTUVTIHopCisgIG1hcmtfYXNfYWR2YW5jZWQoWl9MSUJSQVJZKQorICBpZihaX0xJQlJBUlkpCisgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiLWx6IikKKyAgZW5kaWYoKQorICBzZXQoTV9MSUJSQVJZICJNX0xJQlJBUlktTk9URk9VTkQiKQorICBmaW5kX2xpYnJhcnkoTV9MSUJSQVJZIE5BTUVTIG0pCisgIG1hcmtfYXNfYWR2YW5jZWQoTV9MSUJSQVJZKQorICBpZihNX0xJQlJBUlkpCisgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiLWxtIikKKyAgZW5kaWYoKQorICBzZXQoUlRfTElCUkFSWSAiUlRfTElCUkFSWS1OT1RGT1VORCIpCisgIGZpbmRfbGlicmFyeShSVF9MSUJSQVJZIE5BTUVTIHJ0KQorICBtYXJrX2FzX2FkdmFuY2VkKFJUX0xJQlJBUlkpCisgIGlmKFJUX0xJQlJBUlkpCisgICAgbGlzdChBUFBFTkQgUkVRVUlSRURfTElCUyAiLWxydCIpCisgIGVuZGlmKCkKKworICAjIHNldCByZXF1aXJlZCBsaWJyYXJpZXMgZm9yIGxpbmsKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICIke1JFUVVJUkVEX0lOQ0RJUlN9IikKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUykKKyAgZm9yZWFjaChsaWJfZGlyICR7UkVRVUlSRURfTElCRElSU30pCisgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICItTCR7bGliX2Rpcn0iKQorICBlbmRmb3JlYWNoKCkKKyAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICIke1JFUVVJUkVEX0xJQlN9IikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl4gLSIgIi0iIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiJHtDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVN9IikKKworICAjIHRlc3QgbGluaworICB1bnNldChTQ09UQ0hfV09SS1MgQ0FDSEUpCisgIGluY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKKyAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKFNDT1RDSF9ncmFwaEluaXQgU0NPVENIX1dPUktTKQorICBtYXJrX2FzX2FkdmFuY2VkKFNDT1RDSF9XT1JLUykKKworICBpZihTQ09UQ0hfV09SS1MpCisgICAgIyBzYXZlIGxpbmsgd2l0aCBkZXBlbmRlbmNpZXMKKyAgICBzZXQoU0NPVENIX0xJQlJBUklFUyAiJHtSRVFVSVJFRF9MSUJTfSIpCisgIGVsc2UoKQorICAgIGlmKE5PVCBTQ09UQ0hfRklORF9RVUlFVExZKQorICAgICAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFNDT1RDSCA6IHRlc3Qgb2YgU0NPVENIX2dyYXBoSW5pdCB3aXRoIFNDT1RDSCBsaWJyYXJ5IGZhaWxzIikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVM6ICR7Q01BS0VfUkVRVUlSRURfTElCUkFSSUVTfSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQ01BS0VfUkVRVUlSRURfSU5DTFVERVM6ICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVN9IikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJDaGVjayBpbiBDTWFrZUZpbGVzL0NNYWtlRXJyb3IubG9nIHRvIGZpZ3VyZSBvdXQgd2h5IGl0IGZhaWxzIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCisgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCitlbmRpZihTQ09UQ0hfTElCUkFSSUVTKQorCitpZiAoU0NPVENIX0xJQlJBUklFUykKKyAgbGlzdChHRVQgU0NPVENIX0xJQlJBUklFUyAwIGZpcnN0X2xpYikKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChmaXJzdF9saWJfcGF0aCAiJHtmaXJzdF9saWJ9IiBQQVRIKQorICBpZiAoJHtmaXJzdF9saWJfcGF0aH0gTUFUQ0hFUyAiL2xpYigzMnw2NCk/JCIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIi9saWIoMzJ8NjQpPyQiICIiIG5vdF9jYWNoZWRfZGlyICIke2ZpcnN0X2xpYl9wYXRofSIpCisgICAgc2V0KFNDT1RDSF9ESVJfRk9VTkQgIiR7bm90X2NhY2hlZF9kaXJ9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIFNDT1RDSCBsaWJyYXJ5IiBGT1JDRSkKKyAgZWxzZSgpCisgICAgc2V0KFNDT1RDSF9ESVJfRk9VTkQgIiR7Zmlyc3RfbGliX3BhdGh9IiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIFNDT1RDSCBsaWJyYXJ5IiBGT1JDRSkKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFya19hc19hZHZhbmNlZChTQ09UQ0hfRElSKQorbWFya19hc19hZHZhbmNlZChTQ09UQ0hfRElSX0ZPVU5EKQorCisjIENoZWNrIHRoZSBzaXplIG9mIFNDT1RDSF9OdW0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtTQ09UQ0hfSU5DTFVERV9ESVJTfSkKKworaW5jbHVkZShDaGVja0NTb3VyY2VSdW5zKQorI3N0ZGlvLmggYW5kIHN0ZGludC5oIHNob3VsZCBiZSBpbmNsdWRlZCBieSBzY290Y2guaCBkaXJlY3RseQorc2V0KFNDT1RDSF9DX1RFU1RfU0NPVENIX051bV80ICIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHNjb3RjaC5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmIChzaXplb2YoU0NPVENIX051bSkgPT0gNCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAxOworfQorIikKKworc2V0KFNDT1RDSF9DX1RFU1RfU0NPVENIX051bV84ICIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHNjb3RjaC5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmIChzaXplb2YoU0NPVENIX051bSkgPT0gOCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAxOworfQorIikKK2NoZWNrX2Nfc291cmNlX3J1bnMoIiR7U0NPVENIX0NfVEVTVF9TQ09UQ0hfTnVtXzR9IiBTQ09UQ0hfTnVtXzQpCitpZihOT1QgU0NPVENIX051bV80KQorICBjaGVja19jX3NvdXJjZV9ydW5zKCIke1NDT1RDSF9DX1RFU1RfU0NPVENIX051bV84fSIgU0NPVENIX051bV84KQorICBpZihOT1QgU0NPVENIX051bV84KQorICAgIHNldChTQ09UQ0hfSU5UU0laRSAtMSkKKyAgZWxzZSgpCisgICAgc2V0KFNDT1RDSF9JTlRTSVpFIDgpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBzZXQoU0NPVENIX0lOVFNJWkUgNCkKK2VuZGlmKCkKK3NldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiIikKKworIyBjaGVjayB0aGF0IFNDT1RDSCBoYXMgYmVlbiBmb3VuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoU0NPVENIIERFRkFVTFRfTVNHCisgIFNDT1RDSF9MSUJSQVJJRVMKKyAgU0NPVENIX1dPUktTKQorIworIyBUT0RPOiBBZGQgcG9zc2liaWxpdHkgdG8gY2hlY2sgZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeQorIwpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZFN0YW5kYXJkTWF0aExpYnJhcnkuY21ha2UgYi9jbWFrZS9GaW5kU3RhbmRhcmRNYXRoTGlicmFyeS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFiMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZFN0YW5kYXJkTWF0aExpYnJhcnkuY21ha2UKQEAgLTAsMCArMSw2NCBAQAorIyAtIFRyeSB0byBmaW5kIGhvdyB0byBsaW5rIHRvIHRoZSBzdGFuZGFyZCBtYXRoIGxpYnJhcnksIGlmIGFueXRoaW5nIGF0IGFsbCBpcyBuZWVkZWQgdG8gZG8uCisjIE9uIG1vc3QgcGxhdGZvcm1zIHRoaXMgaXMgYXV0b21hdGljLCBidXQgZm9yIGV4YW1wbGUgaXQncyBub3QgYXV0b21hdGljIG9uIFFOWC4KKyMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIFNUQU5EQVJEX01BVEhfTElCUkFSWV9GT1VORCAtIHdlIGZvdW5kIGhvdyB0byBzdWNjZXNzZnVsbHkgbGluayB0byB0aGUgc3RhbmRhcmQgbWF0aCBsaWJyYXJ5CisjICBTVEFOREFSRF9NQVRIX0xJQlJBUlkgLSB0aGUgbmFtZSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSB0aGF0IG9uZSBoYXMgdG8gbGluayB0by4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGhpcyB3aWxsIGJlIGxlZnQgZW1wdHkgaWYgaXQncyBhdXRvbWF0aWMgKG1vc3QgcGxhdGZvcm1zKS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGhpcyB3aWxsIGJlIHNldCB0byAibSIgb24gcGxhdGZvcm1zIHdoZXJlIG9uZSBtdXN0IGV4cGxpY2l0bHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyB0aGUgIi1sbSIgbGlua2VyIGZsYWcuCisjCisjIENvcHlyaWdodCAoYykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIDItY2xhdXNlIEJTRCBsaWNlbnNlLgorCisKK2luY2x1ZGUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworIyBhIGxpdHRsZSB0ZXN0IHByb2dyYW0gZm9yIGMrKyBtYXRoIGZ1bmN0aW9ucy4KKyMgbm90aWNlIHRoZSBzdGQ6OiBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3JtcyBzdWNoIGFzIFFOWAorCitzZXQoZmluZF9zdGFuZGFyZF9tYXRoX2xpYnJhcnlfdGVzdF9wcm9ncmFtCisiI2luY2x1ZGU8Y21hdGg+CitpbnQgbWFpbigpIHsgc3RkOjpzaW4oMC4wKTsgc3RkOjpsb2coMC4wZik7IH0iKQorCisjIGZpcnN0IHRyeSBjb21waWxpbmcvbGlua2luZyB0aGUgdGVzdCBwcm9ncmFtIHdpdGhvdXQgYW55IGxpbmtlciBmbGFncworCitzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiIpCitzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICIiKQorQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUygKKyAgIiR7ZmluZF9zdGFuZGFyZF9tYXRoX2xpYnJhcnlfdGVzdF9wcm9ncmFtfSIKKyAgc3RhbmRhcmRfbWF0aF9saWJyYXJ5X2xpbmtlZF90b19hdXRvbWF0aWNhbGx5CispCisKK2lmKHN0YW5kYXJkX21hdGhfbGlicmFyeV9saW5rZWRfdG9fYXV0b21hdGljYWxseSkKKworICAjIHRoZSB0ZXN0IHByb2dyYW0gbGlua2VkIHN1Y2Nlc3NmdWxseSB3aXRob3V0IGFueSBsaW5rZXIgZmxhZy4KKyAgc2V0KFNUQU5EQVJEX01BVEhfTElCUkFSWSAiIikKKyAgc2V0KFNUQU5EQVJEX01BVEhfTElCUkFSWV9GT1VORCBUUlVFKQorCitlbHNlKCkKKworICAjIHRoZSB0ZXN0IHByb2dyYW0gZGlkIG5vdCBsaW5rIHN1Y2Nlc3NmdWxseSB3aXRob3V0IGFueSBsaW5rZXIgZmxhZy4KKyAgIyBUaGlzIGlzIGEgdmVyeSB1bmNvbW1vbiBjYXNlIHRoYXQgc28gZmFyIHdlIG9ubHkgc2F3IG9uIFFOWC4gVGhlIG5leHQgdHJ5IGlzIHRoZQorICAjIHN0YW5kYXJkIG5hbWUgJ20nIGZvciB0aGUgc3RhbmRhcmQgbWF0aCBsaWJyYXJ5LgorCisgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgIm0iKQorICBDSEVDS19DWFhfU09VUkNFX0NPTVBJTEVTKAorICAgICIke2ZpbmRfc3RhbmRhcmRfbWF0aF9saWJyYXJ5X3Rlc3RfcHJvZ3JhbX0iCisgICAgc3RhbmRhcmRfbWF0aF9saWJyYXJ5X2xpbmtlZF90b19hc19tKQorCisgIGlmKHN0YW5kYXJkX21hdGhfbGlicmFyeV9saW5rZWRfdG9fYXNfbSkKKworICAgICMgdGhlIHRlc3QgcHJvZ3JhbSBsaW5rZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gbGlua2luZyB0byB0aGUgJ20nIGxpYnJhcnkKKyAgICBzZXQoU1RBTkRBUkRfTUFUSF9MSUJSQVJZICJtIikKKyAgICBzZXQoU1RBTkRBUkRfTUFUSF9MSUJSQVJZX0ZPVU5EIFRSVUUpCisKKyAgZWxzZSgpCisKKyAgICAjIHRoZSB0ZXN0IHByb2dyYW0gc3RpbGwgZG9lc24ndCBsaW5rIHN1Y2Nlc3NmdWxseQorICAgIHNldChTVEFOREFSRF9NQVRIX0xJQlJBUllfRk9VTkQgRkFMU0UpCisKKyAgZW5kaWYoKQorCitlbmRpZigpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kU3VwZXJMVS5jbWFrZSBiL2NtYWtlL0ZpbmRTdXBlckxVLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODE0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kU3VwZXJMVS5jbWFrZQpAQCAtMCwwICsxLDk3IEBACisKKyMgVW1mcGFjayBsaWIgdXN1YWxseSByZXF1aXJlcyBsaW5raW5nIHRvIGEgYmxhcyBsaWJyYXJ5LgorIyBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIG1vZHVsZSB0byBmaW5kIGEgQkxBUyBhbmQgbGluayB0byBpdC4KKworaWYgKFNVUEVSTFVfSU5DTFVERVMgQU5EIFNVUEVSTFVfTElCUkFSSUVTKQorICBzZXQoU1VQRVJMVV9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChTVVBFUkxVX0lOQ0xVREVTIEFORCBTVVBFUkxVX0xJQlJBUklFUykKKworZmluZF9wYXRoKFNVUEVSTFVfSU5DTFVERVMKKyAgTkFNRVMKKyAgc3VwZXJtYXRyaXguaAorICBQQVRIUworICAkRU5We1NVUEVSTFVESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgUEFUSF9TVUZGSVhFUworICBzdXBlcmx1CisgIFNSQworKQorCitmaW5kX2xpYnJhcnkoU1VQRVJMVV9MSUJSQVJJRVMKKyAgTkFNRVMgInN1cGVybHVfNS4yLjEiICJzdXBlcmx1XzUuMiIgInN1cGVybHVfNS4xLjEiICJzdXBlcmx1XzUuMSIgInN1cGVybHVfNS4wIiAic3VwZXJsdV80LjMiICJzdXBlcmx1XzQuMiIgInN1cGVybHVfNC4xIiAic3VwZXJsdV80LjAiICJzdXBlcmx1XzMuMSIgInN1cGVybHVfMy4wIiAic3VwZXJsdSIKKyAgUEFUSFMgJEVOVntTVVBFUkxVRElSfSAke0xJQl9JTlNUQUxMX0RJUn0KKyAgUEFUSF9TVUZGSVhFUyBsaWIpCisKK2lmKFNVUEVSTFVfSU5DTFVERVMgQU5EIFNVUEVSTFVfTElCUkFSSUVTKQorCitpbmNsdWRlKENoZWNrQ1hYU291cmNlQ29tcGlsZXMpCitpbmNsdWRlKENNYWtlUHVzaENoZWNrU3RhdGUpCitjbWFrZV9wdXNoX2NoZWNrX3N0YXRlKCkKKworc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVN9ICR7U1VQRVJMVV9JTkNMVURFU30pCisKKyMgY2hlY2sgd2hldGhlciBzdHJ1Y3QgbWVtX3VzYWdlX3QgaXMgZ2xvYmFsbHkgZGVmaW5lZAorY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygiCit0eXBlZGVmIGludCBpbnRfdDsKKyNpbmNsdWRlIDxzdXBlcm1hdHJpeC5oPgorI2luY2x1ZGUgPHNsdV91dGlsLmg+CitpbnQgbWFpbigpIHsKKyAgbWVtX3VzYWdlX3QgbWVtOworICByZXR1cm4gMDsKK30iCitTVVBFUkxVX0hBU19HTE9CQUxfTUVNX1VTQUdFX1QpCisKKworY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygiCit0eXBlZGVmIGludCBpbnRfdDsKKyNpbmNsdWRlIDxzdXBlcm1hdHJpeC5oPgorI2luY2x1ZGUgPHN1cGVybHVfZW51bV9jb25zdHMuaD4KK2ludCBtYWluKCkgeworICByZXR1cm4gU0xVX1NJTkdMRTsKK30iCitTVVBFUkxVX0hBU19DTEVBTl9FTlVNUykKKworY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygiCit0eXBlZGVmIGludCBpbnRfdDsKKyNpbmNsdWRlIDxzdXBlcm1hdHJpeC5oPgorI2luY2x1ZGUgPHNsdV91dGlsLmg+CitpbnQgbWFpbih2b2lkKQoreworICBHbG9iYWxMVV90IGdsdTsKKyAgcmV0dXJuIDA7Cit9IgorU1VQRVJMVV9IQVNfR0xPQkFMTFVfVCkKKworaWYoU1VQRVJMVV9IQVNfR0xPQkFMTFVfVCkKKyAgIyBhdCBsZWFzdCA1LjAKKyAgc2V0KFNVUEVSTFVfVkVSU0lPTl9WQVIgIjUuMCIpCitlbHNlaWYoU1VQRVJMVV9IQVNfQ0xFQU5fRU5VTVMpCisgICMgYXQgbGVhc3QgNC4zCisgIHNldChTVVBFUkxVX1ZFUlNJT05fVkFSICI0LjMiKQorZWxzZWlmKFNVUEVSTFVfSEFTX0dMT0JBTF9NRU1fVVNBR0VfVCkKKyAgIyBhdCBsZWFzdCA0LjAKKyAgc2V0KFNVUEVSTFVfVkVSU0lPTl9WQVIgIjQuMCIpCitlbHNlKCkKKyAgc2V0KFNVUEVSTFVfVkVSU0lPTl9WQVIgIjMuMCIpCitlbmRpZigpCisKK2NtYWtlX3BvcF9jaGVja19zdGF0ZSgpCisKK2lmKFN1cGVyTFVfRklORF9WRVJTSU9OKQorICBpZigke1NVUEVSTFVfVkVSU0lPTl9WQVJ9IFZFUlNJT05fTEVTUyAke1N1cGVyTFVfRklORF9WRVJTSU9OfSkKKyAgICBzZXQoU1VQRVJMVV9WRVJTSU9OX09LIEZBTFNFKQorICBlbHNlKCkKKyAgICBzZXQoU1VQRVJMVV9WRVJTSU9OX09LIFRSVUUpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBzZXQoU1VQRVJMVV9WRVJTSU9OX09LIFRSVUUpCitlbmRpZigpCisKK2VuZGlmKCkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhTVVBFUkxVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRURfVkFSUyBTVVBFUkxVX0lOQ0xVREVTIFNVUEVSTFVfTElCUkFSSUVTIFNVUEVSTFVfVkVSU0lPTl9PSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVkFSIFNVUEVSTFVfVkVSU0lPTl9WQVIpCisKK21hcmtfYXNfYWR2YW5jZWQoU1VQRVJMVV9JTkNMVURFUyBTVVBFUkxVX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRVbWZwYWNrLmNtYWtlIGIvY21ha2UvRmluZFVtZnBhY2suY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjZjBiNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRVbWZwYWNrLmNtYWtlCkBAIC0wLDAgKzEsNTMgQEAKKyMgVW1mcGFjayBsaWIgdXN1YWxseSByZXF1aXJlcyBsaW5raW5nIHRvIGEgYmxhcyBsaWJyYXJ5LgorIyBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIG1vZHVsZSB0byBmaW5kIGEgQkxBUyBhbmQgbGluayB0byBpdC4KKworaWYgKFVNRlBBQ0tfSU5DTFVERVMgQU5EIFVNRlBBQ0tfTElCUkFSSUVTKQorICBzZXQoVU1GUEFDS19GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChVTUZQQUNLX0lOQ0xVREVTIEFORCBVTUZQQUNLX0xJQlJBUklFUykKKworZmluZF9wYXRoKFVNRlBBQ0tfSU5DTFVERVMKKyAgTkFNRVMKKyAgdW1mcGFjay5oCisgIFBBVEhTCisgICRFTlZ7VU1GUEFDS0RJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorICBQQVRIX1NVRkZJWEVTCisgIHN1aXRlc3BhcnNlCisgIHVmc3BhcnNlCispCisKK2ZpbmRfbGlicmFyeShVTUZQQUNLX0xJQlJBUklFUyB1bWZwYWNrIFBBVEhTICRFTlZ7VU1GUEFDS0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCitpZihVTUZQQUNLX0xJQlJBUklFUykKKworICBpZihOT1QgVU1GUEFDS19MSUJESVIpCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChVTUZQQUNLX0xJQkRJUiAke1VNRlBBQ0tfTElCUkFSSUVTfSBQQVRIKQorICBlbmRpZihOT1QgVU1GUEFDS19MSUJESVIpCisKKyAgZmluZF9saWJyYXJ5KENPTEFNRF9MSUJSQVJZIGNvbGFtZCBQQVRIUyAke1VNRlBBQ0tfTElCRElSfSAkRU5We1VNRlBBQ0tESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYoQ09MQU1EX0xJQlJBUlkpCisgICAgc2V0KFVNRlBBQ0tfTElCUkFSSUVTICR7VU1GUEFDS19MSUJSQVJJRVN9ICR7Q09MQU1EX0xJQlJBUll9KQorICBlbmRpZiAoKQorICAKKyAgZmluZF9saWJyYXJ5KEFNRF9MSUJSQVJZIGFtZCBQQVRIUyAke1VNRlBBQ0tfTElCRElSfSAkRU5We1VNRlBBQ0tESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYoQU1EX0xJQlJBUlkpCisgICAgc2V0KFVNRlBBQ0tfTElCUkFSSUVTICR7VU1GUEFDS19MSUJSQVJJRVN9ICR7QU1EX0xJQlJBUll9KQorICBlbmRpZiAoKQorCisgIGZpbmRfbGlicmFyeShTVUlURVNQQVJTRV9MSUJSQVJZIFN1aXRlU3BhcnNlIFBBVEhTICR7VU1GUEFDS19MSUJESVJ9ICRFTlZ7VU1GUEFDS0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorICBpZihTVUlURVNQQVJTRV9MSUJSQVJZKQorICAgIHNldChVTUZQQUNLX0xJQlJBUklFUyAke1VNRlBBQ0tfTElCUkFSSUVTfSAke1NVSVRFU1BBUlNFX0xJQlJBUll9KQorICBlbmRpZiAoKQorCisgIGZpbmRfbGlicmFyeShDSE9MTU9EX0xJQlJBUlkgY2hvbG1vZCBQQVRIUyAkRU5We1VNRlBBQ0tfTElCRElSfSAkRU5We1VNRlBBQ0tESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgaWYoQ0hPTE1PRF9MSUJSQVJZKQorICAgIHNldChVTUZQQUNLX0xJQlJBUklFUyAke1VNRlBBQ0tfTElCUkFSSUVTfSAke0NIT0xNT0RfTElCUkFSWX0pCisgIGVuZGlmKCkKKworZW5kaWYoVU1GUEFDS19MSUJSQVJJRVMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVU1GUEFDSyBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVNRlBBQ0tfSU5DTFVERVMgVU1GUEFDS19MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoVU1GUEFDS19JTkNMVURFUyBVTUZQQUNLX0xJQlJBUklFUyBBTURfTElCUkFSWSBDT0xBTURfTElCUkFSWSBDSE9MTU9EX0xJQlJBUlkgU1VJVEVTUEFSU0VfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NtYWtlL1JlZ2V4VXRpbHMuY21ha2UgYi9jbWFrZS9SZWdleFV0aWxzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWRmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9SZWdleFV0aWxzLmNtYWtlCkBAIC0wLDAgKzEsMTkgQEAKK2Z1bmN0aW9uKGVzY2FwZV9zdHJpbmdfYXNfcmVnZXggX3N0cl9vdXQgX3N0cl9pbikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcXFwiICJcXFxcXFxcXCIgRklMRVRFU1QyICIke19zdHJfaW59IikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIihbLiQrKj98LV0pIiAiXFxcXFxcMSIgRklMRVRFU1QyICIke0ZJTEVURVNUMn0iKQorICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXFxeIiAiXFxcXF4iIEZJTEVURVNUMiAiJHtGSUxFVEVTVDJ9IikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcKCIgIlxcXFwoIiBGSUxFVEVTVDIgIiR7RklMRVRFU1QyfSIpCisgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXCkiICJcXFxcKSIgRklMRVRFU1QyICIke0ZJTEVURVNUMn0iKQorICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXFxbIiAiXFxcXFsiIEZJTEVURVNUMiAiJHtGSUxFVEVTVDJ9IikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcXSIgIlxcXFxdIiBGSUxFVEVTVDIgIiR7RklMRVRFU1QyfSIpCisgIFNFVCgke19zdHJfb3V0fSAiJHtGSUxFVEVTVDJ9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKHRlc3RfZXNjYXBlX3N0cmluZ19hc19yZWdleCkKKyAgU0VUKHRlc3QxICJcXC5eJC0rKigpW10/fCIpCisgIGVzY2FwZV9zdHJpbmdfYXNfcmVnZXgodGVzdDIgIiR7dGVzdDF9IikKKyAgU0VUKHRlc3RSZWYgIlxcXFxcXC5cXF5cXCRcXC1cXCtcXCpcXChcXClcXFtcXF1cXD9cXHwiKQorICBpZihOT1QgdGVzdDIgU1RSRVFVQUwgdGVzdFJlZikKKwltZXNzYWdlKCJFcnJvciBpbiB0aGUgZXNjYXBlX3N0cmluZ19mb3JfcmVnZXggZnVuY3Rpb24gOiBcbiAgICR7dGVzdDF9IHdhcyBlc2NhcGVkIGFzICR7dGVzdDJ9LCBzaG91bGQgYmUgJHt0ZXN0UmVmfSIpCisgIGVuZGlmKE5PVCB0ZXN0MiBTVFJFUVVBTCB0ZXN0UmVmKQorZW5kZnVuY3Rpb24oKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NtYWtlL1VzZUVpZ2VuMy5jbWFrZSBiL2NtYWtlL1VzZUVpZ2VuMy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzhiYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvVXNlRWlnZW4zLmNtYWtlCkBAIC0wLDAgKzEsNiBAQAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIGNtYWtlIC0qLQorIworIyAgVXNlRWlnZW4zLmNtYWtlCisKK2FkZF9kZWZpbml0aW9ucyAgICAgKCAke0VJR0VOM19ERUZJTklUSU9OU30gKQoraW5jbHVkZV9kaXJlY3RvcmllcyAoICR7RUlHRU4zX0lOQ0xVREVfRElSU30gKQpkaWZmIC0tZ2l0IGEvY21ha2UvbGFuZ3VhZ2Vfc3VwcG9ydC5jbWFrZSBiL2NtYWtlL2xhbmd1YWdlX3N1cHBvcnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNGYzMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2xhbmd1YWdlX3N1cHBvcnQuY21ha2UKQEAgLTAsMCArMSw2NyBAQAorIyBjbWFrZS9tb2R1bGVzL2xhbmd1YWdlX3N1cHBvcnQuY21ha2UKKyMKKyMgVGVtcG9yYXJ5IGFkZGl0aW9uYWwgZ2VuZXJhbCBsYW5ndWFnZSBzdXBwb3J0IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcworIyBmaWxlLiAgCisKKyMgVGhpcyBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgbmVlZGVkIHRvIHByb3ZpZGUgYSB3b3JrYXJvdW5kIGZvcgorIyBDTWFrZSBidWcgOTIyMC4KKworIyBPbiBkZWJpYW4gdGVzdGluZyAoY21ha2UgMi42LjIpLCBJIGdldCByZXR1cm4gY29kZSB6ZXJvIHdoZW4gY2FsbGluZyAKKyMgY21ha2UgdGhlIGZpcnN0IHRpbWUsIGJ1dCBjbWFrZSBjcmFzaGVzIHdoZW4gcnVubmluZyBhIHNlY29uZCB0aW1lCisjIGFzIGZvbGxvd3M6CisjCisjICAtLSBUaGUgRm9ydHJhbiBjb21waWxlciBpZGVudGlmaWNhdGlvbiBpcyB1bmtub3duCisjICBDTWFrZSBFcnJvciBhdCAvdXNyL3NoYXJlL2NtYWtlLTIuNi9Nb2R1bGVzL0NNYWtlRm9ydHJhbkluZm9ybWF0aW9uLmNtYWtlOjcgKEdFVF9GSUxFTkFNRV9DT01QT05FTlQpOgorIyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50IGNhbGxlZCB3aXRoIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzCisjICBDYWxsIFN0YWNrIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyMgICAgQ01ha2VMaXN0cy50eHQ6MyAoZW5hYmxlX2xhbmd1YWdlKQorIworIyBNeSB3b3JrYXJvdW5kIGlzIHRvIGludm9rZSBjbWFrZSB0d2ljZS4gIElmIGJvdGggcmV0dXJuIGNvZGVzIGFyZSB6ZXJvLCAKKyMgaXQgaXMgc2FmZSB0byBpbnZva2UgRU5BQkxFX0xBTkdVQUdFKEZvcnRyYW4gT1BUSU9OQUwpCisKK2Z1bmN0aW9uKHdvcmthcm91bmRfOTIyMCBsYW5ndWFnZSBsYW5ndWFnZV93b3JrcykKKyAgI21lc3NhZ2UoIkRFQlVHOiBsYW5ndWFnZSA9ICR7bGFuZ3VhZ2V9IikKKyAgc2V0KHRleHQKKyAgICAicHJvamVjdCh0ZXN0IE5PTkUpCisgICAgY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4wKQorICAgIHNldCAoQ01BS0VfRm9ydHJhbl9GTEFHUyBcIiR7Q01BS0VfRm9ydHJhbl9GTEFHU31cIikKKyAgICBzZXQgKENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgXCIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1N9XCIpCisgICAgZW5hYmxlX2xhbmd1YWdlKCR7bGFuZ3VhZ2V9IE9QVElPTkFMKQorICAiKQorICBmaWxlKFJFTU9WRV9SRUNVUlNFICR7Q01BS0VfQklOQVJZX0RJUn0vbGFuZ3VhZ2VfdGVzdHMvJHtsYW5ndWFnZX0pCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9sYW5ndWFnZV90ZXN0cy8ke2xhbmd1YWdlfSkKKyAgZmlsZShXUklURSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xhbmd1YWdlX3Rlc3RzLyR7bGFuZ3VhZ2V9L0NNYWtlTGlzdHMudHh0CisgICAgJHt0ZXh0fSkKKyAgZXhlY3V0ZV9wcm9jZXNzKAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAuIC1HICIke0NNQUtFX0dFTkVSQVRPUn0iCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9sYW5ndWFnZV90ZXN0cy8ke2xhbmd1YWdlfQorICAgIFJFU1VMVF9WQVJJQUJMRSByZXR1cm5fY29kZQorICAgIE9VVFBVVF9RVUlFVAorICAgIEVSUk9SX1FVSUVUCisgICAgKQorCisgIGlmKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgIyBTZWNvbmQgcnVuCisgICAgZXhlY3V0ZV9wcm9jZXNzICgKKyAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAuIC1HICIke0NNQUtFX0dFTkVSQVRPUn0iCisgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xhbmd1YWdlX3Rlc3RzLyR7bGFuZ3VhZ2V9CisgICAgICBSRVNVTFRfVkFSSUFCTEUgcmV0dXJuX2NvZGUKKyAgICAgIE9VVFBVVF9RVUlFVAorICAgICAgRVJST1JfUVVJRVQKKyAgICAgICkKKyAgICBpZihyZXR1cm5fY29kZSBFUVVBTCAwKQorICAgICAgc2V0KCR7bGFuZ3VhZ2Vfd29ya3N9IE9OIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgICBzZXQoJHtsYW5ndWFnZV93b3Jrc30gT0ZGIFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZihyZXR1cm5fY29kZSBFUVVBTCAwKQorICBlbHNlKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgc2V0KCR7bGFuZ3VhZ2Vfd29ya3N9IE9GRiBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKHJldHVybl9jb2RlIEVRVUFMIDApCitlbmRmdW5jdGlvbih3b3JrYXJvdW5kXzkyMjApCisKKyMgVGVtcG9yYXJ5IHRlc3RzIG9mIHRoZSBhYm92ZSBmdW5jdGlvbi4KKyN3b3JrYXJvdW5kXzkyMjAoQ1hYIENYWF9sYW5ndWFnZV93b3JrcykKKyNtZXNzYWdlKCJDWFhfbGFuZ3VhZ2Vfd29ya3MgPSAke0NYWF9sYW5ndWFnZV93b3Jrc30iKQorI3dvcmthcm91bmRfOTIyMChDWFhwIENYWHBfbGFuZ3VhZ2Vfd29ya3MpCisjbWVzc2FnZSgiQ1hYcF9sYW5ndWFnZV93b3JrcyA9ICR7Q1hYcF9sYW5ndWFnZV93b3Jrc30iKQorCmRpZmYgLS1naXQgYS9kZWJ1Zy9nZGIvX19pbml0X18ucHkgYi9kZWJ1Zy9nZGIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3YjE2MAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnL2dkYi9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjIEludGVudGlvbmFsbHkgZW1wdHkKZGlmZiAtLWdpdCBhL2RlYnVnL2dkYi9wcmludGVycy5weSBiL2RlYnVnL2dkYi9wcmludGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDY3YTVmCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWcvZ2RiL3ByaW50ZXJzLnB5CkBAIC0wLDAgKzEsMjE0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorIyBmb3IgbGluZWFyIGFsZ2VicmEuCisjCisjIENvcHlyaWdodCAoQykgMjAwOSBCZW5qYW1pbiBTY2hpbmRsZXIgPGJzY2hpbmRsZXJAaW5mLmV0aHouY2g+CisjCisjIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKKyMgTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcworIyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjIFByZXR0eSBwcmludGVycyBmb3IgRWlnZW46Ok1hdHJpeAorIyBUaGlzIGlzIHN0aWxsIHByZXR0eSBiYXNpYyBhcyB0aGUgcHl0aG9uIGV4dGVuc2lvbiB0byBnZGIgaXMgc3RpbGwgcHJldHR5IGJhc2ljLiAKKyMgSXQgY2Fubm90IGhhbmRsZSBjb21wbGV4IGVpZ2VuIHR5cGVzIGFuZCBpdCBkb2Vzbid0IHN1cHBvcnQgYW55IG9mIHRoZSBvdGhlciBlaWdlbiB0eXBlcworIyBTdWNoIGFzIHF1YXRlcm5pb24gb3Igc29tZSBvdGhlciB0eXBlLiAKKyMgVGhpcyBjb2RlIHN1cHBvcnRzIGZpeGVkIHNpemUgYXMgd2VsbCBhcyBkeW5hbWljIHNpemUgbWF0cmljZXMKKworIyBUbyB1c2UgaXQ6CisjCisjICogQ3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBwdXQgdGhlIGZpbGUgYXMgd2VsbCBhcyBhbiBlbXB0eSBfX2luaXRfXy5weSBpbiAKKyMgICB0aGF0IGRpcmVjdG9yeS4KKyMgKiBDcmVhdGUgYSB+Ly5nZGJpbml0IGZpbGUsIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKyMgICAgICBweXRob24KKyMgICAgICBpbXBvcnQgc3lzCisjICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsICcvcGF0aC90by9laWdlbi9wcmludGVyL2RpcmVjdG9yeScpCisjICAgICAgZnJvbSBwcmludGVycyBpbXBvcnQgcmVnaXN0ZXJfZWlnZW5fcHJpbnRlcnMKKyMgICAgICByZWdpc3Rlcl9laWdlbl9wcmludGVycyAoTm9uZSkKKyMgICAgICBlbmQKKworaW1wb3J0IGdkYgoraW1wb3J0IHJlCitpbXBvcnQgaXRlcnRvb2xzCisKKworY2xhc3MgRWlnZW5NYXRyaXhQcmludGVyOgorCSJQcmludCBFaWdlbiBNYXRyaXggb3IgQXJyYXkgb2Ygc29tZSBraW5kIgorCisJZGVmIF9faW5pdF9fKHNlbGYsIHZhcmlldHksIHZhbCk6CisJCSJFeHRyYWN0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIgorCQkKKwkJIyBTYXZlIHRoZSB2YXJpZXR5IChwcmVzdW1hYmx5ICJNYXRyaXgiIG9yICJBcnJheSIpIGZvciBsYXRlciB1c2FnZQorCQlzZWxmLnZhcmlldHkgPSB2YXJpZXR5CisJCQorCQkjIFRoZSBnZGIgZXh0ZW5zaW9uIGRvZXMgbm90IHN1cHBvcnQgdmFsdWUgdGVtcGxhdGUgYXJndW1lbnRzIC0gbmVlZCB0byBleHRyYWN0IHRoZW0gYnkgaGFuZAorCQl0eXBlID0gdmFsLnR5cGUKKwkJaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorCQkJdHlwZSA9IHR5cGUudGFyZ2V0KCkKKwkJc2VsZi50eXBlID0gdHlwZS51bnF1YWxpZmllZCgpLnN0cmlwX3R5cGVkZWZzKCkKKwkJdGFnID0gc2VsZi50eXBlLnRhZworCQlyZWdleCA9IHJlLmNvbXBpbGUoJ1w8LipcPicpCisJCW0gPSByZWdleC5maW5kYWxsKHRhZylbMF1bMTotMV0KKwkJdGVtcGxhdGVfcGFyYW1zID0gbS5zcGxpdCgnLCcpCisJCXRlbXBsYXRlX3BhcmFtcyA9IFt4LnJlcGxhY2UoIiAiLCAiIikgZm9yIHggaW4gdGVtcGxhdGVfcGFyYW1zXQorCQkKKwkJaWYgdGVtcGxhdGVfcGFyYW1zWzFdID09ICctMHgwMDAwMDAwMDAwMDAwMDAwMScgb3IgdGVtcGxhdGVfcGFyYW1zWzFdID09ICctMHgwMDAwMDAwMDEnIG9yIHRlbXBsYXRlX3BhcmFtc1sxXSA9PSAnLTEnOgorCQkJc2VsZi5yb3dzID0gdmFsWydtX3N0b3JhZ2UnXVsnbV9yb3dzJ10KKwkJZWxzZToKKwkJCXNlbGYucm93cyA9IGludCh0ZW1wbGF0ZV9wYXJhbXNbMV0pCisJCQorCQlpZiB0ZW1wbGF0ZV9wYXJhbXNbMl0gPT0gJy0weDAwMDAwMDAwMDAwMDAwMDAxJyBvciB0ZW1wbGF0ZV9wYXJhbXNbMl0gPT0gJy0weDAwMDAwMDAwMScgb3IgdGVtcGxhdGVfcGFyYW1zWzJdID09ICctMSc6CisJCQlzZWxmLmNvbHMgPSB2YWxbJ21fc3RvcmFnZSddWydtX2NvbHMnXQorCQllbHNlOgorCQkJc2VsZi5jb2xzID0gaW50KHRlbXBsYXRlX3BhcmFtc1syXSkKKwkJCisJCXNlbGYub3B0aW9ucyA9IDAgIyBkZWZhdWx0IHZhbHVlCisJCWlmIGxlbih0ZW1wbGF0ZV9wYXJhbXMpID4gMzoKKwkJCXNlbGYub3B0aW9ucyA9IHRlbXBsYXRlX3BhcmFtc1szXTsKKwkJCisJCXNlbGYucm93TWFqb3IgPSAoaW50KHNlbGYub3B0aW9ucykgJiAweDEpCisJCQorCQlzZWxmLmlubmVyVHlwZSA9IHNlbGYudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorCQkKKwkJc2VsZi52YWwgPSB2YWwKKwkJCisJCSMgRml4ZWQgc2l6ZSBtYXRyaWNlcyBoYXZlIGEgc3RydWN0IGFzIHRoZWlyIHN0b3JhZ2UsIHNvIHdlIG5lZWQgdG8gd2FsayB0aHJvdWdoIHRoaXMKKwkJc2VsZi5kYXRhID0gc2VsZi52YWxbJ21fc3RvcmFnZSddWydtX2RhdGEnXQorCQlpZiBzZWxmLmRhdGEudHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfU1RSVUNUOgorCQkJc2VsZi5kYXRhID0gc2VsZi5kYXRhWydhcnJheSddCisJCQlzZWxmLmRhdGEgPSBzZWxmLmRhdGEuY2FzdChzZWxmLmlubmVyVHlwZS5wb2ludGVyKCkpCisJCQkKKwljbGFzcyBfaXRlcmF0b3I6CisJCWRlZiBfX2luaXRfXyAoc2VsZiwgcm93cywgY29scywgZGF0YVB0ciwgcm93TWFqb3IpOgorCQkJc2VsZi5yb3dzID0gcm93cworCQkJc2VsZi5jb2xzID0gY29scworCQkJc2VsZi5kYXRhUHRyID0gZGF0YVB0cgorCQkJc2VsZi5jdXJyZW50Um93ID0gMAorCQkJc2VsZi5jdXJyZW50Q29sID0gMAorCQkJc2VsZi5yb3dNYWpvciA9IHJvd01ham9yCisJCQkKKwkJZGVmIF9faXRlcl9fIChzZWxmKToKKwkJCXJldHVybiBzZWxmCisKKwkJZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpICAjIFB5dGhvbiAyLnggY29tcGF0aWJpbGl0eQorCisJCWRlZiBfX25leHRfXyhzZWxmKToKKwkJCQorCQkJcm93ID0gc2VsZi5jdXJyZW50Um93CisJCQljb2wgPSBzZWxmLmN1cnJlbnRDb2wKKwkJCWlmIHNlbGYucm93TWFqb3IgPT0gMDoKKwkJCQlpZiBzZWxmLmN1cnJlbnRDb2wgPj0gc2VsZi5jb2xzOgorCQkJCQlyYWlzZSBTdG9wSXRlcmF0aW9uCisJCQkJCQorCQkJCXNlbGYuY3VycmVudFJvdyA9IHNlbGYuY3VycmVudFJvdyArIDEKKwkJCQlpZiBzZWxmLmN1cnJlbnRSb3cgPj0gc2VsZi5yb3dzOgorCQkJCQlzZWxmLmN1cnJlbnRSb3cgPSAwCisJCQkJCXNlbGYuY3VycmVudENvbCA9IHNlbGYuY3VycmVudENvbCArIDEKKwkJCWVsc2U6CisJCQkJaWYgc2VsZi5jdXJyZW50Um93ID49IHNlbGYucm93czoKKwkJCQkJcmFpc2UgU3RvcEl0ZXJhdGlvbgorCQkJCQkKKwkJCQlzZWxmLmN1cnJlbnRDb2wgPSBzZWxmLmN1cnJlbnRDb2wgKyAxCisJCQkJaWYgc2VsZi5jdXJyZW50Q29sID49IHNlbGYuY29sczoKKwkJCQkJc2VsZi5jdXJyZW50Q29sID0gMAorCQkJCQlzZWxmLmN1cnJlbnRSb3cgPSBzZWxmLmN1cnJlbnRSb3cgKyAxCisJCQkJCisJCQkKKwkJCWl0ZW0gPSBzZWxmLmRhdGFQdHIuZGVyZWZlcmVuY2UoKQorCQkJc2VsZi5kYXRhUHRyID0gc2VsZi5kYXRhUHRyICsgMQorCQkJaWYgKHNlbGYuY29scyA9PSAxKTogI2lmIGl0J3MgYSBjb2x1bW4gdmVjdG9yCisJCQkJcmV0dXJuICgnWyVkXScgJSAocm93LCksIGl0ZW0pCisJCQllbGlmIChzZWxmLnJvd3MgPT0gMSk6ICNpZiBpdCdzIGEgcm93IHZlY3RvcgorCQkJCXJldHVybiAoJ1slZF0nICUgKGNvbCwpLCBpdGVtKQorCQkJcmV0dXJuICgnWyVkLCVkXScgJSAocm93LCBjb2wpLCBpdGVtKQorCQkJCisJZGVmIGNoaWxkcmVuKHNlbGYpOgorCQkKKwkJcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKHNlbGYucm93cywgc2VsZi5jb2xzLCBzZWxmLmRhdGEsIHNlbGYucm93TWFqb3IpCisJCQorCWRlZiB0b19zdHJpbmcoc2VsZik6CisJCXJldHVybiAiRWlnZW46OiVzPCVzLCVkLCVkLCVzPiAoZGF0YSBwdHI6ICVzKSIgJSAoc2VsZi52YXJpZXR5LCBzZWxmLmlubmVyVHlwZSwgc2VsZi5yb3dzLCBzZWxmLmNvbHMsICJSb3dNYWpvciIgaWYgc2VsZi5yb3dNYWpvciBlbHNlICAiQ29sTWFqb3IiLCBzZWxmLmRhdGEpCisKK2NsYXNzIEVpZ2VuUXVhdGVybmlvblByaW50ZXI6CisJIlByaW50IGFuIEVpZ2VuIFF1YXRlcm5pb24iCisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisJCSJFeHRyYWN0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIgorCQkjIFRoZSBnZGIgZXh0ZW5zaW9uIGRvZXMgbm90IHN1cHBvcnQgdmFsdWUgdGVtcGxhdGUgYXJndW1lbnRzIC0gbmVlZCB0byBleHRyYWN0IHRoZW0gYnkgaGFuZAorCQl0eXBlID0gdmFsLnR5cGUKKwkJaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorCQkJdHlwZSA9IHR5cGUudGFyZ2V0KCkKKwkJc2VsZi50eXBlID0gdHlwZS51bnF1YWxpZmllZCgpLnN0cmlwX3R5cGVkZWZzKCkKKwkJc2VsZi5pbm5lclR5cGUgPSBzZWxmLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKwkJc2VsZi52YWwgPSB2YWwKKwkJCisJCSMgUXVhdGVybmlvbnMgaGF2ZSBhIHN0cnVjdCBhcyB0aGVpciBzdG9yYWdlLCBzbyB3ZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCB0aGlzCisJCXNlbGYuZGF0YSA9IHNlbGYudmFsWydtX2NvZWZmcyddWydtX3N0b3JhZ2UnXVsnbV9kYXRhJ11bJ2FycmF5J10KKwkJc2VsZi5kYXRhID0gc2VsZi5kYXRhLmNhc3Qoc2VsZi5pbm5lclR5cGUucG9pbnRlcigpKQorCQkJCisJY2xhc3MgX2l0ZXJhdG9yOgorCQlkZWYgX19pbml0X18gKHNlbGYsIGRhdGFQdHIpOgorCQkJc2VsZi5kYXRhUHRyID0gZGF0YVB0cgorCQkJc2VsZi5jdXJyZW50RWxlbWVudCA9IDAKKwkJCXNlbGYuZWxlbWVudE5hbWVzID0gWyd4JywgJ3knLCAneicsICd3J10KKwkJCQorCQlkZWYgX19pdGVyX18gKHNlbGYpOgorCQkJcmV0dXJuIHNlbGYKKwkKKwkJZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpICAjIFB5dGhvbiAyLnggY29tcGF0aWJpbGl0eQorCisJCWRlZiBfX25leHRfXyhzZWxmKToKKwkJCWVsZW1lbnQgPSBzZWxmLmN1cnJlbnRFbGVtZW50CisJCQkKKwkJCWlmIHNlbGYuY3VycmVudEVsZW1lbnQgPj0gNDogI3RoZXJlIGFyZSA0IGVsZW1lbnRzIGluIGEgcXVhbnRlcm5pb24KKwkJCQlyYWlzZSBTdG9wSXRlcmF0aW9uCisJCQkKKwkJCXNlbGYuY3VycmVudEVsZW1lbnQgPSBzZWxmLmN1cnJlbnRFbGVtZW50ICsgMQorCQkJCisJCQlpdGVtID0gc2VsZi5kYXRhUHRyLmRlcmVmZXJlbmNlKCkKKwkJCXNlbGYuZGF0YVB0ciA9IHNlbGYuZGF0YVB0ciArIDEKKwkJCXJldHVybiAoJ1slc10nICUgKHNlbGYuZWxlbWVudE5hbWVzW2VsZW1lbnRdLCksIGl0ZW0pCisJCQkKKwlkZWYgY2hpbGRyZW4oc2VsZik6CisJCQorCQlyZXR1cm4gc2VsZi5faXRlcmF0b3Ioc2VsZi5kYXRhKQorCQorCWRlZiB0b19zdHJpbmcoc2VsZik6CisJCXJldHVybiAiRWlnZW46OlF1YXRlcm5pb248JXM+IChkYXRhIHB0cjogJXMpIiAlIChzZWxmLmlubmVyVHlwZSwgc2VsZi5kYXRhKQorCitkZWYgYnVpbGRfZWlnZW5fZGljdGlvbmFyeSAoKToKKwlwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeRWlnZW46OlF1YXRlcm5pb248Lio+JCcpXSA9IGxhbWJkYSB2YWw6IEVpZ2VuUXVhdGVybmlvblByaW50ZXIodmFsKQorCXByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15FaWdlbjo6TWF0cml4PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBFaWdlbk1hdHJpeFByaW50ZXIoIk1hdHJpeCIsIHZhbCkKKwlwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeRWlnZW46OkFycmF5PC4qPiQnKV0gID0gbGFtYmRhIHZhbDogRWlnZW5NYXRyaXhQcmludGVyKCJBcnJheSIsICB2YWwpCisKK2RlZiByZWdpc3Rlcl9laWdlbl9wcmludGVycyhvYmopOgorCSJSZWdpc3RlciBlaWdlbiBwcmV0dHktcHJpbnRlcnMgd2l0aCBvYmpmaWxlIE9iaiIKKworCWlmIG9iaiA9PSBOb25lOgorCQlvYmogPSBnZGIKKwlvYmoucHJldHR5X3ByaW50ZXJzLmFwcGVuZChsb29rdXBfZnVuY3Rpb24pCisKK2RlZiBsb29rdXBfZnVuY3Rpb24odmFsKToKKwkiTG9vay11cCBhbmQgcmV0dXJuIGEgcHJldHR5LXByaW50ZXIgdGhhdCBjYW4gcHJpbnQgdmEuIgorCQorCXR5cGUgPSB2YWwudHlwZQorCQorCWlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKwkJdHlwZSA9IHR5cGUudGFyZ2V0KCkKKwkKKwl0eXBlID0gdHlwZS51bnF1YWxpZmllZCgpLnN0cmlwX3R5cGVkZWZzKCkKKwkKKwl0eXBlbmFtZSA9IHR5cGUudGFnCisJaWYgdHlwZW5hbWUgPT0gTm9uZToKKwkJcmV0dXJuIE5vbmUKKwkKKwlmb3IgZnVuY3Rpb24gaW4gcHJldHR5X3ByaW50ZXJzX2RpY3Q6CisJCWlmIGZ1bmN0aW9uLnNlYXJjaCh0eXBlbmFtZSk6CisJCQlyZXR1cm4gcHJldHR5X3ByaW50ZXJzX2RpY3RbZnVuY3Rpb25dKHZhbCkKKwkKKwlyZXR1cm4gTm9uZQorCitwcmV0dHlfcHJpbnRlcnNfZGljdCA9IHt9CisKK2J1aWxkX2VpZ2VuX2RpY3Rpb25hcnkgKCkKZGlmZiAtLWdpdCBhL2RlYnVnL21zdmMvZWlnZW4ubmF0dmlzIGIvZGVidWcvbXN2Yy9laWdlbi5uYXR2aXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4OTg1NwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnL21zdmMvZWlnZW4ubmF0dmlzCkBAIC0wLDAgKzEsMjM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKw0KKzxBdXRvVmlzdWFsaXplciB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS92c3R1ZGlvL2RlYnVnZ2VyL25hdHZpcy8yMDEwIj4NCisNCisgIDwhLS0gRml4ZWQgeCBGaXhlZCBNYXRyaXggLS0+DQorICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosKiwqLCosKiwqJmd0OyI+ICAgICAgDQorICAgICAgPEFsdGVybmF0aXZlVHlwZSBOYW1lPSJFaWdlbjo6QXJyYXkmbHQ7KiwtMSwtMSwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZz5beyRUMn0sIHskVDN9XSAoZml4ZWQgbWF0cml4KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPEFycmF5SXRlbXMgQ29uZGl0aW9uPSJGbGFncyUyIj4gPCEtLSByb3cgbWFqb3IgbGF5b3V0IC0tPg0KKyAgICAgICAgICA8UmFuaz4yPC9SYW5rPg0KKyAgICAgICAgICA8U2l6ZT4kaT09MCA/ICRUMiA6ICRUMzwvU2l6ZT4NCisgICAgICAgICAgPFZhbHVlUG9pbnRlcj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5PC9WYWx1ZVBvaW50ZXI+DQorICAgICAgICA8L0FycmF5SXRlbXM+DQorICAgICAgICA8QXJyYXlJdGVtcyBDb25kaXRpb249IiEoRmxhZ3MlMikiPiA8IS0tIGNvbHVtbiBtYWpvciBsYXlvdXQgLS0+DQorICAgICAgICAgIDxEaXJlY3Rpb24+QmFja3dhcmQ8L0RpcmVjdGlvbj4NCisgICAgICAgICAgPFJhbms+MjwvUmFuaz4NCisgICAgICAgICAgPFNpemU+JGk9PTAgPyAkVDIgOiAkVDM8L1NpemU+DQorICAgICAgICAgIDxWYWx1ZVBvaW50ZXI+bV9zdG9yYWdlLm1fZGF0YS5hcnJheTwvVmFsdWVQb2ludGVyPg0KKyAgICAgICAgPC9BcnJheUl0ZW1zPg0KKyAgICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKyAgDQorICA8IS0tIDIgeCAyIE1hdHJpeCAtLT4NCisgIDxUeXBlIE5hbWU9IkVpZ2VuOjpNYXRyaXgmbHQ7KiwyLDIsKiwqLComZ3Q7Ij4gICAgICANCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLDIsMiwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZz5bMiwgMl0gKGZpeGVkIG1hdHJpeCk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgPEV4cGFuZD4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAwXSIgQ29uZGl0aW9uPSJGbGFncyUyIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMV19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDBdIiBDb25kaXRpb249IiEoRmxhZ3MlMikiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsyXX0pPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgICAgPC9TeW50aGV0aWM+DQorICAgICAgICA8U3ludGhldGljIE5hbWU9Iltyb3cgMV0iIENvbmRpdGlvbj0iRmxhZ3MlMiI+DQorICAgICAgICAgIDxEaXNwbGF5U3RyaW5nPih7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsyXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzNdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAxXSIgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzFdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbM119KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPiAgICAgICAgDQorICAgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+DQorICANCisgIDwhLS0gMyB4IDMgTWF0cml4IC0tPg0KKyAgPFR5cGUgTmFtZT0iRWlnZW46Ok1hdHJpeCZsdDsqLDMsMywqLCosKiZndDsiPiAgICAgIA0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosMywzLCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nPlszLCAzXSAoZml4ZWQgbWF0cml4KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDBdIiBDb25kaXRpb249IkZsYWdzJTIiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAwXSIgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbM119LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs2XX0pPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgICAgPC9TeW50aGV0aWM+DQorICAgICAgICA8U3ludGhldGljIE5hbWU9Iltyb3cgMV0iIENvbmRpdGlvbj0iRmxhZ3MlMiI+DQorICAgICAgICAgIDxEaXNwbGF5U3RyaW5nPih7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVszXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzRdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbNV19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDFdIiBDb25kaXRpb249IiEoRmxhZ3MlMikiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMV19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs0XX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzddfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAyXSIgQ29uZGl0aW9uPSJGbGFncyUyIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzZdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbN119LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs4XX0pPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgICAgPC9TeW50aGV0aWM+DQorICAgICAgICA8U3ludGhldGljIE5hbWU9Iltyb3cgMl0iIENvbmRpdGlvbj0iIShGbGFncyUyKSI+DQorICAgICAgICAgIDxEaXNwbGF5U3RyaW5nPih7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsyXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzVdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbOF19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPiAgICAgICAgDQorICAgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+DQorICANCisgIDwhLS0gNCB4IDQgTWF0cml4IC0tPg0KKyAgPFR5cGUgTmFtZT0iRWlnZW46Ok1hdHJpeCZsdDsqLDQsNCwqLCosKiZndDsiPiAgICAgIA0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosNCw0LCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nPls0LCA0XSAoZml4ZWQgbWF0cml4KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDBdIiBDb25kaXRpb249IkZsYWdzJTIiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbM119KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDBdIiBDb25kaXRpb249IiEoRmxhZ3MlMikiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs0XX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzhdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTJdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAxXSIgQ29uZGl0aW9uPSJGbGFncyUyIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzRdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbNV19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs2XX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzddfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAxXSIgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzFdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbNV19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs5XX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzEzXX0pPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgICAgPC9TeW50aGV0aWM+DQorICAgICAgICA8U3ludGhldGljIE5hbWU9Iltyb3cgMl0iIENvbmRpdGlvbj0iRmxhZ3MlMiI+DQorICAgICAgICAgIDxEaXNwbGF5U3RyaW5nPih7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVs4XX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzldfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTBdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTFdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAyXSIgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbNl19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxNF19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPg0KKyAgICAgICAgPFN5bnRoZXRpYyBOYW1lPSJbcm93IDNdIiBDb25kaXRpb249IkZsYWdzJTIiPg0KKyAgICAgICAgICA8RGlzcGxheVN0cmluZz4oe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTJdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTNdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTRdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMTVdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgICA8L1N5bnRoZXRpYz4NCisgICAgICAgIDxTeW50aGV0aWMgTmFtZT0iW3JvdyAzXSIgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4NCisgICAgICAgICAgPERpc3BsYXlTdHJpbmc+KHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzNdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbN119LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxMV19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxNV19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICAgIDwvU3ludGhldGljPiAgICAgICAgDQorICAgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+ICANCisgIA0KKyAgPCEtLSBEeW5hbWljIHggRHluYW1pYyBNYXRyaXggLS0+DQorICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosLTEsLTEsKiwqLComZ3Q7Ij4gICAgICANCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLC0xLC0xLCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nIENvbmRpdGlvbj0ibV9zdG9yYWdlLm1fZGF0YSA9PSAwIj5lbXB0eTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249Im1fc3RvcmFnZS5tX2RhdGEgIT0gMCI+W3ttX3N0b3JhZ2UubV9yb3dzfSwge21fc3RvcmFnZS5tX2NvbHN9XSAoZHluYW1pYyBtYXRyaXgpPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgIDxFeHBhbmQ+DQorICAgICAgICA8QXJyYXlJdGVtcyBDb25kaXRpb249IkZsYWdzJTIiPiA8IS0tIHJvdyBtYWpvciBsYXlvdXQgLS0+DQorICAgICAgICAgIDxSYW5rPjI8L1Jhbms+DQorICAgICAgICAgIDxTaXplPiRpPT0wID8gbV9zdG9yYWdlLm1fcm93cyA6IG1fc3RvcmFnZS5tX2NvbHM8L1NpemU+DQorICAgICAgICAgIDxWYWx1ZVBvaW50ZXI+bV9zdG9yYWdlLm1fZGF0YTwvVmFsdWVQb2ludGVyPg0KKyAgICAgICAgPC9BcnJheUl0ZW1zPg0KKyAgICAgICAgPEFycmF5SXRlbXMgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4gPCEtLSBjb2x1bW4gbWFqb3IgbGF5b3V0IC0tPg0KKyAgICAgICAgICA8RGlyZWN0aW9uPkJhY2t3YXJkPC9EaXJlY3Rpb24+DQorICAgICAgICAgIDxSYW5rPjI8L1Jhbms+DQorICAgICAgICAgIDxTaXplPiRpPT0wID8gbV9zdG9yYWdlLm1fcm93cyA6IG1fc3RvcmFnZS5tX2NvbHM8L1NpemU+DQorICAgICAgICAgIDxWYWx1ZVBvaW50ZXI+bV9zdG9yYWdlLm1fZGF0YTwvVmFsdWVQb2ludGVyPg0KKyAgICAgICAgPC9BcnJheUl0ZW1zPg0KKyAgICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKyAgDQorICA8IS0tIEZpeGVkIHggRHluYW1pYyBNYXRyaXggLS0+DQorICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosKiwtMSwqLCosKiZndDsiPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosKiwtMSwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249Im1fc3RvcmFnZS5tX2RhdGEgPT0gMCI+ZW1wdHk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSJtX3N0b3JhZ2UubV9kYXRhICE9IDAiPlt7JFQyfSwge21fc3RvcmFnZS5tX2NvbHN9XSAoZHluYW1pYyBjb2x1bW4gbWF0cml4KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPEFycmF5SXRlbXMgQ29uZGl0aW9uPSJGbGFncyUyIj4gPCEtLSByb3cgbWFqb3IgbGF5b3V0IC0tPg0KKyAgICAgICAgICA8UmFuaz4yPC9SYW5rPg0KKyAgICAgICAgICA8U2l6ZT4kaT09MCA/ICRUMiA6IG1fc3RvcmFnZS5tX2NvbHM8L1NpemU+DQorICAgICAgICAgIDxWYWx1ZVBvaW50ZXI+bV9zdG9yYWdlLm1fZGF0YTwvVmFsdWVQb2ludGVyPg0KKyAgICAgICAgPC9BcnJheUl0ZW1zPg0KKyAgICAgICAgPEFycmF5SXRlbXMgQ29uZGl0aW9uPSIhKEZsYWdzJTIpIj4gPCEtLSBjb2x1bW4gbWFqb3IgbGF5b3V0IC0tPg0KKyAgICAgICAgICA8RGlyZWN0aW9uPkJhY2t3YXJkPC9EaXJlY3Rpb24+DQorICAgICAgICAgIDxSYW5rPjI8L1Jhbms+DQorICAgICAgICAgIDxTaXplPiRpPT0wID8gJFQyIDogbV9zdG9yYWdlLm1fY29sczwvU2l6ZT4NCisgICAgICAgICAgPFZhbHVlUG9pbnRlcj5tX3N0b3JhZ2UubV9kYXRhPC9WYWx1ZVBvaW50ZXI+DQorICAgICAgICA8L0FycmF5SXRlbXM+DQorICAgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+DQorICANCisgIDwhLS0gRHluYW1pYyB4IEZpeGVkIE1hdHJpeCAtLT4NCisgIDxUeXBlIE5hbWU9IkVpZ2VuOjpNYXRyaXgmbHQ7KiwtMSwqLCosKiwqJmd0OyI+DQorICAgICAgPEFsdGVybmF0aXZlVHlwZSBOYW1lPSJFaWdlbjo6QXJyYXkmbHQ7KiwtMSwqLCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nIENvbmRpdGlvbj0ibV9zdG9yYWdlLm1fZGF0YSA9PSAwIj5lbXB0eTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249Im1fc3RvcmFnZS5tX2RhdGEgIT0gMCI+W3ttX3N0b3JhZ2UubV9yb3dzfSwgeyRUMn1dIChkeW5hbWljIHJvdyBtYXRyaXgpPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgIDxFeHBhbmQ+DQorICAgICAgICA8QXJyYXlJdGVtcyBDb25kaXRpb249IkZsYWdzJTIiPiA8IS0tIHJvdyBtYWpvciBsYXlvdXQgLS0+DQorICAgICAgICAgIDxSYW5rPjI8L1Jhbms+DQorICAgICAgICAgIDxTaXplPiRpPT0wID8gbV9zdG9yYWdlLm1fcm93cyA6ICRUMjwvU2l6ZT4NCisgICAgICAgICAgPFZhbHVlUG9pbnRlcj5tX3N0b3JhZ2UubV9kYXRhPC9WYWx1ZVBvaW50ZXI+DQorICAgICAgICA8L0FycmF5SXRlbXM+DQorICAgICAgICA8QXJyYXlJdGVtcyBDb25kaXRpb249IiEoRmxhZ3MlMikiPiA8IS0tIGNvbHVtbiBtYWpvciBsYXlvdXQgLS0+DQorICAgICAgICAgIDxEaXJlY3Rpb24+QmFja3dhcmQ8L0RpcmVjdGlvbj4NCisgICAgICAgICAgPFJhbms+MjwvUmFuaz4NCisgICAgICAgICAgPFNpemU+JGk9PTAgPyBtX3N0b3JhZ2UubV9yb3dzIDogJFQyPC9TaXplPg0KKyAgICAgICAgICA8VmFsdWVQb2ludGVyPm1fc3RvcmFnZS5tX2RhdGE8L1ZhbHVlUG9pbnRlcj4NCisgICAgICAgIDwvQXJyYXlJdGVtcz4NCisgICAgICA8L0V4cGFuZD4NCisgIDwvVHlwZT4NCisgIA0KKyAgPCEtLSBEeW5hbWljIENvbHVtbiBWZWN0b3IgLS0+DQorICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosMSwtMSwqLCosKiZndDsiPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosMSwtMSwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249Im1fc3RvcmFnZS5tX2RhdGEgPT0gMCI+ZW1wdHk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSJtX3N0b3JhZ2UubV9kYXRhICE9IDAiPlt7bV9zdG9yYWdlLm1fY29sc31dIChkeW5hbWljIGNvbHVtbiB2ZWN0b3IpPC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgIDxFeHBhbmQ+DQorICAgICAgICA8SXRlbSBOYW1lPSJbc2l6ZV0iPm1fc3RvcmFnZS5tX2NvbHM8L0l0ZW0+DQorICAgICAgICA8QXJyYXlJdGVtcz4NCisgICAgICAgICAgPFNpemU+bV9zdG9yYWdlLm1fY29sczwvU2l6ZT4NCisgICAgICAgICAgPFZhbHVlUG9pbnRlcj5tX3N0b3JhZ2UubV9kYXRhPC9WYWx1ZVBvaW50ZXI+DQorICAgICAgICA8L0FycmF5SXRlbXM+DQorICAgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+DQorICANCisgIDwhLS0gRHluYW1pYyBSb3cgVmVjdG9yIC0tPg0KKyAgPFR5cGUgTmFtZT0iRWlnZW46Ok1hdHJpeCZsdDsqLC0xLDEsKiwqLComZ3Q7Ij4NCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLC0xLDEsKiwqLComZ3Q7Ii8+DQorICAgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSJtX3N0b3JhZ2UubV9kYXRhID09IDAiPmVtcHR5PC9EaXNwbGF5U3RyaW5nPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nIENvbmRpdGlvbj0ibV9zdG9yYWdlLm1fZGF0YSAhPSAwIj5be21fc3RvcmFnZS5tX3Jvd3N9XSAoZHluYW1pYyByb3cgdmVjdG9yKTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3NpemVdIj5tX3N0b3JhZ2UubV9yb3dzPC9JdGVtPg0KKyAgICAgICAgPEFycmF5SXRlbXM+DQorICAgICAgICAgIDxTaXplPm1fc3RvcmFnZS5tX3Jvd3M8L1NpemU+DQorICAgICAgICAgIDxWYWx1ZVBvaW50ZXI+bV9zdG9yYWdlLm1fZGF0YTwvVmFsdWVQb2ludGVyPg0KKyAgICAgICAgPC9BcnJheUl0ZW1zPg0KKyAgICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKyAgDQorICA8IS0tIEZpeGVkIFZlY3RvciAtLT4NCisgIDxUeXBlIE5hbWU9IkVpZ2VuOjpNYXRyaXgmbHQ7KiwxLDEsKiwqLComZ3Q7Ij4NCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLDEsMSwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZz5bMV0gKHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgPEV4cGFuZD4NCisgICAgICAgIDxJdGVtIE5hbWU9Ilt4XSI+bV9zdG9yYWdlLm1fZGF0YS5hcnJheVswXTwvSXRlbT4NCisgICAgICA8L0V4cGFuZD4NCisgIDwvVHlwZT4NCisgIA0KKyAgPFR5cGUgTmFtZT0iRWlnZW46Ok1hdHJpeCZsdDsqLDIsMSwqLCosKiZndDsiPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46Ok1hdHJpeCZsdDsqLDEsMiwqLCosKiZndDsiLz4NCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLDIsMSwqLCosKiZndDsiLz4NCisgICAgICA8QWx0ZXJuYXRpdmVUeXBlIE5hbWU9IkVpZ2VuOjpBcnJheSZsdDsqLDEsMiwqLCosKiZndDsiLz4NCisgICAgICA8RGlzcGxheVN0cmluZz5bMl0gKHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMV19KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3hdIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdPC9JdGVtPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3ldIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzFdPC9JdGVtPg0KKyAgICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKyAgDQorICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosMywxLCosKiwqJmd0OyI+DQorICAgICAgPEFsdGVybmF0aXZlVHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosMSwzLCosKiwqJmd0OyIvPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosMywxLCosKiwqJmd0OyIvPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosMSwzLCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nPlszXSAoe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgICAgPEV4cGFuZD4NCisgICAgICAgIDxJdGVtIE5hbWU9Ilt4XSI+bV9zdG9yYWdlLm1fZGF0YS5hcnJheVswXTwvSXRlbT4NCisgICAgICAgIDxJdGVtIE5hbWU9Ilt5XSI+bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxXTwvSXRlbT4NCisgICAgICAgIDxJdGVtIE5hbWU9Ilt6XSI+bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsyXTwvSXRlbT4NCisgICAgICA8L0V4cGFuZD4NCisgIDwvVHlwZT4NCisgIA0KKyAgICA8VHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosNCwxLCosKiwqJmd0OyI+DQorICAgICAgPEFsdGVybmF0aXZlVHlwZSBOYW1lPSJFaWdlbjo6TWF0cml4Jmx0OyosMSw0LCosKiwqJmd0OyIvPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosNCwxLCosKiwqJmd0OyIvPg0KKyAgICAgIDxBbHRlcm5hdGl2ZVR5cGUgTmFtZT0iRWlnZW46OkFycmF5Jmx0OyosMSw0LCosKiwqJmd0OyIvPg0KKyAgICAgIDxEaXNwbGF5U3RyaW5nPls0XSAoe21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbMF19LCB7bV9zdG9yYWdlLm1fZGF0YS5hcnJheVsxXX0sIHttX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdfSwge21fc3RvcmFnZS5tX2RhdGEuYXJyYXlbM119KTwvRGlzcGxheVN0cmluZz4NCisgICAgICA8RXhwYW5kPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3hdIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzBdPC9JdGVtPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3ldIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzFdPC9JdGVtPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3pdIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzJdPC9JdGVtPg0KKyAgICAgICAgPEl0ZW0gTmFtZT0iW3ddIj5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WzNdPC9JdGVtPg0KKyAgICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKw0KKzwvQXV0b1Zpc3VhbGl6ZXI+DQpkaWZmIC0tZ2l0IGEvZGVidWcvbXN2Yy9laWdlbl9hdXRvZXhwX3BhcnQuZGF0IGIvZGVidWcvbXN2Yy9laWdlbl9hdXRvZXhwX3BhcnQuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWE0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Zy9tc3ZjL2VpZ2VuX2F1dG9leHBfcGFydC5kYXQKQEAgLTAsMCArMSwyOTUgQEAKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorOyAqIEVpZ2VuIFZpc3VhbGl6ZXINCis7ICoNCis7ICogQXV0aG9yOiBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+DQorOyAqDQorOyAqIFN1cHBvcnQgdGhlIGVuaGFuY2VkIGRlYnVnZ2luZyBvZiB0aGUgZm9sbG93aW5nIEVpZ2VuDQorOyAqIHR5cGVzICgqOiBhbnksICs6Zml4ZWQgZGltZW5zaW9uKSA6DQorOyAqDQorOyAqIC0gRWlnZW46Ok1hdHJpeDwqLDQsMSwqLCosKj4gYW5kIEVpZ2VuOjpNYXRyaXg8KiwxLDQsKiwqLCo+DQorOyAqIC0gRWlnZW46Ok1hdHJpeDwqLDMsMSwqLCosKj4gYW5kIEVpZ2VuOjpNYXRyaXg8KiwxLDMsKiwqLCo+DQorOyAqIC0gRWlnZW46Ok1hdHJpeDwqLDIsMSwqLCosKj4gYW5kIEVpZ2VuOjpNYXRyaXg8KiwxLDIsKiwqLCo+DQorOyAqIC0gRWlnZW46Ok1hdHJpeDwqLC0xLC0xLCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwrLC0xLCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwtMSwrLCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwrLCssKiwqLCo+DQorOyAqDQorOyAqIE1hdHJpY2VzIGFyZSBkaXNwbGF5ZWQgcHJvcGVybHkgaW5kZXBlbmRhbnRseSBvZiB0aGUgbWVtb3J5DQorOyAqIGFsaWdubWVudCAoUm93TWFqb3IgdnMuIENvbE1ham9yKS4NCis7ICoNCis7ICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLiBQbGVhc2UgZW5zdXJlDQorOyAqIHRoYXQgeW91ciBvcmlnaW5hbCBhdXRvZXhwLmRhdCBmaWxlIGlzIGNvcGllZCB0byBhIHNhZmUgDQorOyAqIHBsYWNlIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggaXRzIG1vZGlmaWNhdGlvbi4NCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKw0KK1tWaXN1YWxpemVyXQ0KKw0KKzsgRml4ZWQgc2l6ZSA0LXZlY3RvcnMNCitFaWdlbjo6TWF0cml4PCosNCwxLCosKiwqPnxFaWdlbjo6TWF0cml4PCosMSw0LCosKiwqPnsNCisgICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICB4IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzBdLA0KKyAgICAgICAgIHkgOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbMV0sDQorICAgICAgICAgeiA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVsyXSwNCisgICAgICAgICB3IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzNdDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAiWyIsDQorICAgICAgICA0LA0KKyAgICAgICAgIl0oIiwNCisgICAgICAgICNhcnJheShleHByOiAkZS5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WyRpXSwgc2l6ZTogNCksDQorICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IEZpeGVkIHNpemUgMy12ZWN0b3JzDQorRWlnZW46Ok1hdHJpeDwqLDMsMSwqLCosKj58RWlnZW46Ok1hdHJpeDwqLDEsMywqLCosKj57DQorICAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgeCA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVswXSwNCisgICAgICAgICB5IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzFdLA0KKyAgICAgICAgIHogOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbMl0NCisgICAgICApDQorICAgKQ0KKw0KKyAgIHByZXZpZXcNCisgICAoDQorICAgICAgIygNCisgICAgICAgICJbIiwNCisgICAgICAgIDMsDQorICAgICAgICAiXSgiLA0KKyAgICAgICAgI2FycmF5KGV4cHI6ICRlLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXlbJGldLCBzaXplOiAzKSwNCisgICAgICAgICIpIg0KKyAgICAgICkNCisgICApDQorfQ0KKw0KKzsgRml4ZWQgc2l6ZSAyLXZlY3RvcnMNCitFaWdlbjo6TWF0cml4PCosMiwxLCosKiwqPnxFaWdlbjo6TWF0cml4PCosMSwyLCosKiwqPnsNCisgICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICB4IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzBdLA0KKyAgICAgICAgIHkgOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbMV0NCisgICAgICApDQorICAgKQ0KKw0KKyAgIHByZXZpZXcNCisgICAoDQorICAgICAgIygNCisgICAgICAgICJbIiwNCisgICAgICAgIDIsDQorICAgICAgICAiXSgiLA0KKyAgICAgICAgI2FycmF5KGV4cHI6ICRlLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXlbJGldLCBzaXplOiAyKSwNCisgICAgICAgICIpIg0KKyAgICAgICkNCisgICApDQorfQ0KKw0KKzsgRml4ZWQgc2l6ZSAxLXZlY3RvcnMNCitFaWdlbjo6TWF0cml4PCosMSwxLCosKiwqPnxFaWdlbjo6TWF0cml4PCosMSwxLCosKiwqPnsNCisgICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICB4IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzBdDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAiWyIsDQorICAgICAgICAxLA0KKyAgICAgICAgIl0oIiwNCisgICAgICAgICNhcnJheShleHByOiAkZS5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WyRpXSwgc2l6ZTogMSksDQorICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IER5bmFtaWMgbWF0cmljZXMgKENvbE1ham9yIGFuZCBSb3dNYWpvciBzdXBwb3J0KQ0KK0VpZ2VuOjpNYXRyaXg8KiwtMSwtMSwqLCosKj57DQorICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgcm93czogJGMubV9zdG9yYWdlLm1fcm93cywNCisgICAgICAgICBjb2xzOiAkYy5tX3N0b3JhZ2UubV9jb2xzLA0KKyAgICAgICAgIDsgQ2hlY2sgZm9yIFJvd01ham9yQml0DQorICAgICAgICAgI2lmICgkYy5GbGFncyAmIDB4MSkgKA0KKyAgICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgICAgIHJhbms6IDIsDQorICAgICAgICAgICAgICAgIGJhc2U6IDAsDQorICAgICAgICAgICAgICAgIGV4cHI6ICgkYy5tX3N0b3JhZ2UubV9kYXRhKVsoJGkgJSAkYy5tX3N0b3JhZ2UubV9yb3dzKSokYy5tX3N0b3JhZ2UubV9jb2xzICsgKCgkaS0gJGkgJSAkYy5tX3N0b3JhZ2UubV9yb3dzKS8kYy5tX3N0b3JhZ2UubV9yb3dzKV0sIA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLm1fc3RvcmFnZS5tX3Jvd3MrKCRyPT0wKSokYy5tX3N0b3JhZ2UubV9jb2xzDQorICAgICAgICAgICAgICkNCisgICAgICAgICApICNlbHNlICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbJGldLA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLm1fc3RvcmFnZS5tX3Jvd3MrKCRyPT0wKSokYy5tX3N0b3JhZ2UubV9jb2xzDQorICAgICAgICAgICAgICkNCisgICAgICAgICApDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgIygNCisgICAgICAgICAiWyIsDQorICAgICAgICAgICAkYy5tX3N0b3JhZ2UubV9yb3dzLA0KKyAgICAgICAgICIsIiwNCisgICAgICAgICAgICRjLm1fc3RvcmFnZS5tX2NvbHMsDQorICAgICAgICAgIl0oIiwNCisgICAgICAgICAgICNhcnJheSgNCisgICAgICAgICAgICBleHByIDogICAgWygkYy5tX3N0b3JhZ2UubV9kYXRhKVskaV0sZ10sDQorICAgICAgICAgICAgc2l6ZSA6ICAgICRjLm1fc3RvcmFnZS5tX3Jvd3MqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgKSwNCisgICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IEZpeGVkIHJvd3MsIGR5bmFtaWMgY29sdW1ucyBtYXRyaXggKENvbE1ham9yIGFuZCBSb3dNYWpvciBzdXBwb3J0KQ0KK0VpZ2VuOjpNYXRyaXg8KiwqLC0xLCosKiwqPnsNCisgIGNoaWxkcmVuDQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICByb3dzOiAkYy5Sb3dzQXRDb21waWxlVGltZSwNCisgICAgICAgICBjb2xzOiAkYy5tX3N0b3JhZ2UubV9jb2xzLA0KKyAgICAgICAgIDsgQ2hlY2sgZm9yIFJvd01ham9yQml0DQorICAgICAgICAgI2lmICgkYy5GbGFncyAmIDB4MSkgKA0KKyAgICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgICAgIHJhbms6IDIsDQorICAgICAgICAgICAgICAgIGJhc2U6IDAsDQorICAgICAgICAgICAgICAgIGV4cHI6ICgkYy5tX3N0b3JhZ2UubV9kYXRhKVsoJGkgJSAkYy5Sb3dzQXRDb21waWxlVGltZSkqJGMubV9zdG9yYWdlLm1fY29scyArICgoJGktICRpICUgJGMuUm93c0F0Q29tcGlsZVRpbWUpLyRjLlJvd3NBdENvbXBpbGVUaW1lKV0sDQorICAgICAgICAgICAgICAgIHNpemU6ICgkcj09MSkqJGMuUm93c0F0Q29tcGlsZVRpbWUrKCRyPT0wKSokYy5tX3N0b3JhZ2UubV9jb2xzDQorICAgICAgICAgICAgICkNCisgICAgICAgICApICNlbHNlICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbJGldLA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLlJvd3NBdENvbXBpbGVUaW1lKygkcj09MCkqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKQ0KKyAgICAgICkNCisgICApDQorDQorICAgcHJldmlldw0KKyAgICgNCisgICAgICMoDQorICAgICAgICAgIlsiLA0KKyAgICAgICAgICAgJGMuUm93c0F0Q29tcGlsZVRpbWUsDQorICAgICAgICAgIiwiLA0KKyAgICAgICAgICAgJGMubV9zdG9yYWdlLm1fY29scywNCisgICAgICAgICAiXSgiLA0KKyAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgIGV4cHIgOiAgICBbKCRjLm1fc3RvcmFnZS5tX2RhdGEpWyRpXSxnXSwNCisgICAgICAgICAgICBzaXplIDogICAgJGMuUm93c0F0Q29tcGlsZVRpbWUqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgKSwNCisgICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IER5bmFtaWMgcm93cywgZml4ZWQgY29sdW1ucyBtYXRyaXggKENvbE1ham9yIGFuZCBSb3dNYWpvciBzdXBwb3J0KQ0KK0VpZ2VuOjpNYXRyaXg8KiwtMSwqLCosKiwqPnsNCisgIGNoaWxkcmVuDQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICByb3dzOiAkYy5tX3N0b3JhZ2UubV9yb3dzLA0KKyAgICAgICAgIGNvbHM6ICRjLkNvbHNBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgIDsgQ2hlY2sgZm9yIFJvd01ham9yQml0DQorICAgICAgICAgI2lmICgkYy5GbGFncyAmIDB4MSkgKA0KKyAgICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgICAgIHJhbms6IDIsDQorICAgICAgICAgICAgICAgIGJhc2U6IDAsDQorICAgICAgICAgICAgICAgIGV4cHI6ICgkYy5tX3N0b3JhZ2UubV9kYXRhKVsoJGkgJSAkYy5tX3N0b3JhZ2UubV9yb3dzKSokYy5Db2xzQXRDb21waWxlVGltZSArICgoJGktICRpICUgJGMubV9zdG9yYWdlLm1fcm93cykvJGMubV9zdG9yYWdlLm1fcm93cyldLCANCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5tX3N0b3JhZ2UubV9yb3dzKygkcj09MCkqJGMuQ29sc0F0Q29tcGlsZVRpbWUNCisgICAgICAgICAgICAgKQ0KKyAgICAgICAgICkgI2Vsc2UgKA0KKyAgICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgICAgIHJhbms6IDIsDQorICAgICAgICAgICAgICAgIGJhc2U6IDAsDQorICAgICAgICAgICAgICAgIGV4cHI6ICgkYy5tX3N0b3JhZ2UubV9kYXRhKVskaV0sDQorICAgICAgICAgICAgICAgIHNpemU6ICgkcj09MSkqJGMubV9zdG9yYWdlLm1fcm93cysoJHI9PTApKiRjLkNvbHNBdENvbXBpbGVUaW1lDQorICAgICAgICAgICAgICkNCisgICAgICAgICApDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgIygNCisgICAgICAgICAiWyIsDQorICAgICAgICAgICAkYy5tX3N0b3JhZ2UubV9yb3dzLA0KKyAgICAgICAgICIsIiwNCisgICAgICAgICAgICRjLkNvbHNBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgICJdKCIsDQorICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgZXhwciA6ICAgIFsoJGMubV9zdG9yYWdlLm1fZGF0YSlbJGldLGddLA0KKyAgICAgICAgICAgIHNpemUgOiAgICAkYy5tX3N0b3JhZ2UubV9yb3dzKiRjLkNvbHNBdENvbXBpbGVUaW1lDQorICAgICAgICAgICApLA0KKyAgICAgICAgICIpIg0KKyAgICAgICkNCisgICApDQorfQ0KKw0KKzsgRml4ZWQgc2l6ZSBtYXRyaXggKENvbE1ham9yIGFuZCBSb3dNYWpvciBzdXBwb3J0KQ0KK0VpZ2VuOjpNYXRyaXg8KiwqLCosKiwqLCo+ew0KKyAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgICBbaW50ZXJuYWxzXTogWyRjLCFdLA0KKyAgICAgICAgIHJvd3M6ICRjLlJvd3NBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgIGNvbHM6ICRjLkNvbHNBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgIDsgQ2hlY2sgZm9yIFJvd01ham9yQml0DQorICAgICAgICAgI2lmICgkYy5GbGFncyAmIDB4MSkgKA0KKyAgICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgICAgIHJhbms6IDIsDQorICAgICAgICAgICAgICAgIGJhc2U6IDAsDQorICAgICAgICAgICAgICAgIGV4cHI6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVsoJGkgJSAkYy5Sb3dzQXRDb21waWxlVGltZSkqJGMuQ29sc0F0Q29tcGlsZVRpbWUgKyAoKCRpLSAkaSAlICRjLlJvd3NBdENvbXBpbGVUaW1lKS8kYy5Sb3dzQXRDb21waWxlVGltZSldLCANCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5Sb3dzQXRDb21waWxlVGltZSsoJHI9PTApKiRjLkNvbHNBdENvbXBpbGVUaW1lDQorICAgICAgICAgICAgICkNCisgICAgICAgICApICNlbHNlICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbJGldLA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLlJvd3NBdENvbXBpbGVUaW1lKygkcj09MCkqJGMuQ29sc0F0Q29tcGlsZVRpbWUNCisgICAgICAgICAgICAgKQ0KKyAgICAgICAgICkNCisgICAgICApDQorICAgKQ0KKw0KKyAgIHByZXZpZXcNCisgICAoDQorICAgICAjKA0KKyAgICAgICAgICJbIiwNCisgICAgICAgICAgICRjLlJvd3NBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgICIsIiwNCisgICAgICAgICAgICRjLkNvbHNBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgICJdKCIsDQorICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgZXhwciA6ICAgIFsoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbJGldLGddLA0KKyAgICAgICAgICAgIHNpemUgOiAgICAkYy5Sb3dzQXRDb21waWxlVGltZSokYy5Db2xzQXRDb21waWxlVGltZQ0KKyAgICAgICAgICAgKSwNCisgICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCmRpZmYgLS1naXQgYS9kZW1vcy9DTWFrZUxpc3RzLnR4dCBiL2RlbW9zL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDJlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACitwcm9qZWN0KEVpZ2VuRGVtb3MpCisKK2FkZF9jdXN0b21fdGFyZ2V0KGRlbW9zKQorCitpZihOT1QgRUlHRU5fVEVTVF9OT1FUKQorICBmaW5kX3BhY2thZ2UoUXQ0KQorICBpZihRVDRfRk9VTkQpCisgICAgYWRkX3N1YmRpcmVjdG9yeShtYW5kZWxicm90KQorICAgIGFkZF9zdWJkaXJlY3Rvcnkob3BlbmdsKQorICBlbHNlKFFUNF9GT1VORCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiUXQ0IG5vdCBmb3VuZCwgc28gZGlzYWJsaW5nIHRoZSBtYW5kZWxicm90IGFuZCBvcGVuZ2wgZGVtb3MiKQorICBlbmRpZihRVDRfRk9VTkQpCitlbmRpZigpCmRpZmYgLS1naXQgYS9kZW1vcy9tYW5kZWxicm90L0NNYWtlTGlzdHMudHh0IGIvZGVtb3MvbWFuZGVsYnJvdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUwMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbWFuZGVsYnJvdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIxIEBACitmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEKQorCitzZXQoQ01BS0VfSU5DTFVERV9DVVJSRU5UX0RJUiBPTikKKworaWYgKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKKyAgIHNldCAoIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1PMiIpCisgICBhZGRfZGVmaW5pdGlvbnMgKCAiLUROREVCVUciICkKK2VuZGlmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7UVRfSU5DTFVERV9ESVJ9ICkKKworc2V0KG1hbmRlbGJyb3RfU1JDUworICAgIG1hbmRlbGJyb3QuY3BwCispCisKK3F0NF9hdXRvbW9jKCR7bWFuZGVsYnJvdF9TUkNTfSkKKworYWRkX2V4ZWN1dGFibGUobWFuZGVsYnJvdCAke21hbmRlbGJyb3RfU1JDU30pCithZGRfZGVwZW5kZW5jaWVzKGRlbW9zIG1hbmRlbGJyb3QpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhtYW5kZWxicm90ICR7UVRfUVRDT1JFX0xJQlJBUll9ICR7UVRfUVRHVUlfTElCUkFSWX0pCmRpZmYgLS1naXQgYS9kZW1vcy9tYW5kZWxicm90L1JFQURNRSBiL2RlbW9zL21hbmRlbGJyb3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTFkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9tYW5kZWxicm90L1JFQURNRQpAQCAtMCwwICsxLDEwIEBACisqKiogTWFuZGVsYnJvdCBkZW1vICoqKgorCitDb250cm9sczoKKyogTGVmdCBtb3VzZSBidXR0b24gdG8gY2VudGVyIHZpZXcgYXQgYSBwb2ludC4KKyogRHJhZyB2ZXJ0aWNhbGx5IHdpdGggbGVmdCBtb3VzZSBidXR0b24gdG8gem9vbSBpbiBhbmQgb3V0LgorCitCZSBzdXJlIHRvIGVuYWJsZSBTU0UyIG9yIEFsdGlWZWMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKworVGhlIG51bWJlciBvZiBpdGVyYXRpb25zLCBhbmQgdGhlIGNob2ljZSBiZXR3ZWVuIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbiwgYXJlCitkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgZGVwZW5kaW5nIG9uIHRoZSB6b29tIGxldmVsLgpkaWZmIC0tZ2l0IGEvZGVtb3MvbWFuZGVsYnJvdC9tYW5kZWxicm90LmNwcCBiL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NzVkNQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1hbmRlbGJyb3QuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlPFF0R3VpL1FQYWludGVyPgorI2luY2x1ZGU8UXRHdWkvUUltYWdlPgorI2luY2x1ZGU8UXRHdWkvUU1vdXNlRXZlbnQ+CisjaW5jbHVkZTxRdENvcmUvUVRpbWU+CisKK3ZvaWQgTWFuZGVsYnJvdFdpZGdldDo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICopCit7CisgIGlmKHNpemUgPCB3aWR0aCgpICogaGVpZ2h0KCkpCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgInJlYWxsb2NhdGUgYnVmZmVyIiA8PCBzdGQ6OmVuZGw7CisgICAgc2l6ZSA9IHdpZHRoKCkgKiBoZWlnaHQoKTsKKyAgICBpZihidWZmZXIpIGRlbGV0ZVtdYnVmZmVyOworICAgIGJ1ZmZlciA9IG5ldyB1bnNpZ25lZCBjaGFyWzQqc2l6ZV07CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGl0ZXJzX2JlZm9yZV90ZXN0IHsgZW51bSB7IHJldCA9IDggfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGl0ZXJzX2JlZm9yZV90ZXN0PGRvdWJsZT4geyBlbnVtIHsgcmV0ID0gMTYgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbD4gdm9pZCBNYW5kZWxicm90VGhyZWFkOjpyZW5kZXIoaW50IGltZ193aWR0aCwgaW50IGltZ19oZWlnaHQpCit7CisgIGVudW0geyBwYWNrZXRTaXplID0gRWlnZW46OmludGVybmFsOjpwYWNrZXRfdHJhaXRzPFJlYWw+OjpzaXplIH07IC8vIG51bWJlciBvZiByZWFscyBpbiBhIFBhY2tldAorICB0eXBlZGVmIEVpZ2VuOjpBcnJheTxSZWFsLCBwYWNrZXRTaXplLCAxPiBQYWNrZXQ7IC8vIHdyYXAgYSBQYWNrZXQgYXMgYSB2ZWN0b3IKKworICBlbnVtIHsgaXRlcnNfYmVmb3JlX3Rlc3QgPSBpdGVyc19iZWZvcmVfdGVzdDxSZWFsPjo6cmV0IH07CisgIG1heF9pdGVyID0gKG1heF9pdGVyIC8gaXRlcnNfYmVmb3JlX3Rlc3QpICogaXRlcnNfYmVmb3JlX3Rlc3Q7CisgIGNvbnN0IGludCBhbGlnbmVkV2lkdGggPSAoaW1nX3dpZHRoL3BhY2tldFNpemUpKnBhY2tldFNpemU7CisgIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGJ1ZmZlciA9IHdpZGdldC0+YnVmZmVyOworICBjb25zdCBkb3VibGUgeHJhZGl1cyA9IHdpZGdldC0+eHJhZGl1czsKKyAgY29uc3QgZG91YmxlIHlyYWRpdXMgPSB4cmFkaXVzICogaW1nX2hlaWdodCAvIGltZ193aWR0aDsKKyAgY29uc3QgaW50IHRocmVhZGNvdW50ID0gd2lkZ2V0LT50aHJlYWRjb3VudDsKKyAgdHlwZWRlZiBFaWdlbjo6QXJyYXk8UmVhbCwgMiwgMT4gVmVjdG9yMjsKKyAgVmVjdG9yMiBzdGFydCh3aWRnZXQtPmNlbnRlci54KCkgLSB3aWRnZXQtPnhyYWRpdXMsIHdpZGdldC0+Y2VudGVyLnkoKSAtIHlyYWRpdXMpOworICBWZWN0b3IyIHN0ZXAoMip3aWRnZXQtPnhyYWRpdXMvaW1nX3dpZHRoLCAyKnlyYWRpdXMvaW1nX2hlaWdodCk7CisgIHRvdGFsX2l0ZXIgPSAwOworCisgIGZvcihpbnQgeSA9IGlkOyB5IDwgaW1nX2hlaWdodDsgeSArPSB0aHJlYWRjb3VudCkKKyAgeworICAgIGludCBwaXggPSB5ICogaW1nX3dpZHRoOworCisgICAgLy8gZm9yIGVhY2ggcGl4ZWwsIHdlJ3JlIGdvaW5nIHRvIGRvIHRoZSBpdGVyYXRpb24geiA6PSB6XjIgKyBjIHdoZXJlIHogYW5kIGMgYXJlIGNvbXBsZXggbnVtYmVycywgCisgICAgLy8gc3RhcnRpbmcgd2l0aCB6ID0gYyA9IGNvbXBsZXggY29vcmQgb2YgdGhlIHBpeGVsLiBwemkgYW5kIHB6ciBkZW5vdGUgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB6LgorICAgIC8vIHBjaSBhbmQgcGNyIGRlbm90ZSB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGMuCisKKyAgICBQYWNrZXQgcHppX3N0YXJ0LCBwY2lfc3RhcnQ7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7IGkrKykgcHppX3N0YXJ0W2ldID0gcGNpX3N0YXJ0W2ldID0gc3RhcnQueSgpICsgeSAqIHN0ZXAueSgpOworCisgICAgZm9yKGludCB4ID0gMDsgeCA8IGFsaWduZWRXaWR0aDsgeCArPSBwYWNrZXRTaXplLCBwaXggKz0gcGFja2V0U2l6ZSkKKyAgICB7CisgICAgICBQYWNrZXQgcGNyLCBwY2kgPSBwY2lfc3RhcnQsIHB6ciwgcHppID0gcHppX3N0YXJ0LCBwenJfYnVmOworICAgICAgZm9yKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7IGkrKykgcHpyW2ldID0gcGNyW2ldID0gc3RhcnQueCgpICsgKHgraSkgKiBzdGVwLngoKTsKKworICAgICAgLy8gZG8gdGhlIGl0ZXJhdGlvbnMuIEV2ZXJ5IGl0ZXJzX2JlZm9yZV90ZXN0IGl0ZXJhdGlvbnMgd2UgY2hlY2sgZm9yIGRpdmVyZ2VuY2UsCisgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGNhbiBzdG9wIGl0ZXJhdGluZy4KKyAgICAgIGludCBqID0gMDsKKyAgICAgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxpbnQsIHBhY2tldFNpemUsIDE+IFBhY2tldGk7CisgICAgICBQYWNrZXRpIHBpeF9pdGVyID0gUGFja2V0aTo6WmVybygpLCAvLyBudW1iZXIgb2YgaXRlcmF0aW9uIHBlciBwaXhlbCBpbiB0aGUgcGFja2V0CisgICAgICAgICAgICAgIHBpeF9kb250X2RpdmVyZ2U7IC8vIHdoZXRoZXIgb3Igbm90IGVhY2ggcGl4ZWwgaGFzIGFscmVhZHkgZGl2ZXJnZWQKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpdGVyc19iZWZvcmVfdGVzdC80OyBpKyspIC8vIHBlZWwgdGhlIGlubmVyIGxvb3AgYnkgNAorICAgICAgICB7CisjICAgICAgICAgZGVmaW5lIElURVJBVEUgXAorICAgICAgICAgICAgcHpyX2J1ZiA9IHB6cjsgXAorICAgICAgICAgICAgcHpyID0gcHpyLnNxdWFyZSgpOyBcCisgICAgICAgICAgICBwenIgLT0gcHppLnNxdWFyZSgpOyBcCisgICAgICAgICAgICBwenIgKz0gcGNyOyBcCisgICAgICAgICAgICBwemkgPSAoMipwenJfYnVmKSpwemk7IFwKKyAgICAgICAgICAgIHB6aSArPSBwY2k7CisgICAgICAgICAgSVRFUkFURSBJVEVSQVRFIElURVJBVEUgSVRFUkFURQorICAgICAgICB9CisgICAgICAgIHBpeF9kb250X2RpdmVyZ2UgPSAoKHB6ci5zcXVhcmUoKSArIHB6aS5zcXVhcmUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsKCkgLy8gdGVtcG9yYXJ5IGZpeCBhcyB3aGF0IGZvbGxvd3MgaXMgbm90IHlldCB2ZWN0b3JpemVkIGJ5IEVpZ2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYWNrZXQ6OkNvbnN0YW50KDQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgNCBoZXJlIGlzIG5vdCBhIG1hZ2ljIHZhbHVlLCBpdCdzIGEgbWF0aCBmYWN0IHRoYXQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNxdWFyZSBtb2R1bHVzIGlzID40IHRoZW4gZGl2ZXJnZW5jZSBpcyBpbmV2aXRhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIGNhc3Q8aW50PigpOworICAgICAgICBwaXhfaXRlciArPSBpdGVyc19iZWZvcmVfdGVzdCAqIHBpeF9kb250X2RpdmVyZ2U7CisgICAgICAgIGorKzsKKyAgICAgICAgdG90YWxfaXRlciArPSBpdGVyc19iZWZvcmVfdGVzdCAqIHBhY2tldFNpemU7CisgICAgICB9CisgICAgICB3aGlsZShqIDwgbWF4X2l0ZXIvaXRlcnNfYmVmb3JlX3Rlc3QgJiYgcGl4X2RvbnRfZGl2ZXJnZS5hbnkoKSk7IC8vIGFueSgpIGlzIG5vdCB5ZXQgdmVjdG9yaXplZCBieSBFaWdlbgorCisgICAgICAvLyBjb21wdXRlIHBpeGVsIGNvbG9ycworICAgICAgZm9yKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7IGkrKykKKyAgICAgIHsKKyAgICAgICAgYnVmZmVyWzQqKHBpeCtpKV0gPSAyNTUqcGl4X2l0ZXJbaV0vbWF4X2l0ZXI7CisgICAgICAgIGJ1ZmZlcls0KihwaXgraSkrMV0gPSAwOworICAgICAgICBidWZmZXJbNCoocGl4K2kpKzJdID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiB0aGUgd2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgcGFja2V0U2l6ZSwgZmlsbCB0aGUgcmVtYWluZGVyIGluIGJsYWNrCisgICAgZm9yKGludCB4ID0gYWxpZ25lZFdpZHRoOyB4IDwgaW1nX3dpZHRoOyB4KyssIHBpeCsrKQorICAgICAgYnVmZmVyWzQqcGl4XSA9IGJ1ZmZlcls0KnBpeCsxXSA9IGJ1ZmZlcls0KnBpeCsyXSA9IDA7CisgIH0KKyAgcmV0dXJuOworfQorCit2b2lkIE1hbmRlbGJyb3RUaHJlYWQ6OnJ1bigpCit7CisgIHNldFRlcm1pbmF0aW9uRW5hYmxlZCh0cnVlKTsKKyAgZG91YmxlIHJlc29sdXRpb24gPSB3aWRnZXQtPnhyYWRpdXMqMi93aWRnZXQtPndpZHRoKCk7CisgIG1heF9pdGVyID0gMTI4OworICBpZihyZXNvbHV0aW9uIDwgMWUtNGYpIG1heF9pdGVyICs9IDEyOCAqICggLSA0IC0gc3RkOjpsb2cxMChyZXNvbHV0aW9uKSk7CisgIGludCBpbWdfd2lkdGggPSB3aWRnZXQtPndpZHRoKCkvd2lkZ2V0LT5kcmFmdDsKKyAgaW50IGltZ19oZWlnaHQgPSB3aWRnZXQtPmhlaWdodCgpL3dpZGdldC0+ZHJhZnQ7CisgIHNpbmdsZV9wcmVjaXNpb24gPSByZXNvbHV0aW9uID4gMWUtN2Y7CisKKyAgaWYoc2luZ2xlX3ByZWNpc2lvbikKKyAgICByZW5kZXI8ZmxvYXQ+KGltZ193aWR0aCwgaW1nX2hlaWdodCk7CisgIGVsc2UKKyAgICByZW5kZXI8ZG91YmxlPihpbWdfd2lkdGgsIGltZ19oZWlnaHQpOworfQorCit2b2lkIE1hbmRlbGJyb3RXaWRnZXQ6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQgKikKK3sKKyAgc3RhdGljIGZsb2F0IG1heF9zcGVlZCA9IDA7CisgIGxvbmcgbG9uZyB0b3RhbF9pdGVyID0gMDsKKworICBRVGltZSB0aW1lOworICB0aW1lLnN0YXJ0KCk7CisgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKQorICAgIHRocmVhZHNbdGhdLT5zdGFydChRVGhyZWFkOjpMb3dQcmlvcml0eSk7CisgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKQorICB7CisgICAgdGhyZWFkc1t0aF0tPndhaXQoKTsKKyAgICB0b3RhbF9pdGVyICs9IHRocmVhZHNbdGhdLT50b3RhbF9pdGVyOworICB9CisgIGludCBlbGFwc2VkID0gdGltZS5lbGFwc2VkKCk7CisKKyAgaWYoZHJhZnQgPT0gMSkKKyAgeworICAgIGZsb2F0IHNwZWVkID0gZWxhcHNlZCA/IGZsb2F0KHRvdGFsX2l0ZXIpKjEwMDAvZWxhcHNlZCA6IDA7CisgICAgbWF4X3NwZWVkID0gc3RkOjptYXgobWF4X3NwZWVkLCBzcGVlZCk7CisgICAgc3RkOjpjb3V0IDw8IHRocmVhZGNvdW50IDw8ICIgdGhyZWFkcywgIgorICAgICAgICAgICAgICA8PCBlbGFwc2VkIDw8ICIgbXMsICIKKyAgICAgICAgICAgICAgPDwgc3BlZWQgPDwgIiBpdGVycy9zIChtYXggIiA8PCBtYXhfc3BlZWQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbnQgcGFja2V0U2l6ZSA9IHRocmVhZHNbMF0tPnNpbmdsZV9wcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICA/IGludChFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+OjpzaXplKQorICAgICAgICAgICAgICAgICAgIDogaW50KEVpZ2VuOjppbnRlcm5hbDo6cGFja2V0X3RyYWl0czxkb3VibGU+OjpzaXplKTsKKyAgICBzZXRXaW5kb3dUaXRsZShRU3RyaW5nKCJyZXNvbHV0aW9uICIpK1FTdHJpbmc6Om51bWJlcih4cmFkaXVzKjIvd2lkdGgoKSwgJ2UnLCAyKQorICAgICAgICAgICAgICAgICAgK1FTdHJpbmcoIiwgJTEgaXRlcmF0aW9ucyBwZXIgcGl4ZWwsICIpLmFyZyh0aHJlYWRzWzBdLT5tYXhfaXRlcikKKyAgICAgICAgICAgICAgICAgICsodGhyZWFkc1swXS0+c2luZ2xlX3ByZWNpc2lvbiA/IFFTdHJpbmcoInNpbmdsZSAiKSA6IFFTdHJpbmcoImRvdWJsZSAiKSkKKyAgICAgICAgICAgICAgICAgICtRU3RyaW5nKCJwcmVjaXNpb24sICIpCisgICAgICAgICAgICAgICAgICArKHBhY2tldFNpemU9PTEgPyBRU3RyaW5nKCJubyB2ZWN0b3JpemF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFFTdHJpbmcoInZlY3Rvcml6ZWQgKCUxIHBlciBwYWNrZXQpIikuYXJnKHBhY2tldFNpemUpKSk7CisgIH0KKyAgCisgIFFJbWFnZSBpbWFnZShidWZmZXIsIHdpZHRoKCkvZHJhZnQsIGhlaWdodCgpL2RyYWZ0LCBRSW1hZ2U6OkZvcm1hdF9SR0IzMik7CisgIFFQYWludGVyIHBhaW50ZXIodGhpcyk7CisgIHBhaW50ZXIuZHJhd0ltYWdlKFFQb2ludCgwLCAwKSwgaW1hZ2Uuc2NhbGVkKHdpZHRoKCksIGhlaWdodCgpKSk7CisKKyAgaWYoZHJhZnQ+MSkKKyAgeworICAgIGRyYWZ0IC89IDI7CisgICAgc2V0V2luZG93VGl0bGUoUVN0cmluZygicmVjb21wdXRpbmcgYXQgMS8lMSByZXNvbHV0aW9uLi4uIikuYXJnKGRyYWZ0KSk7CisgICAgdXBkYXRlKCk7CisgIH0KK30KKwordm9pZCBNYW5kZWxicm90V2lkZ2V0Ojptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmV2ZW50KQoreworICBpZiggZXZlbnQtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uICkKKyAgeworICAgIGxhc3Rwb3MgPSBldmVudC0+cG9zKCk7CisgICAgZG91YmxlIHlyYWRpdXMgPSB4cmFkaXVzICogaGVpZ2h0KCkgLyB3aWR0aCgpOworICAgIGNlbnRlciA9IEVpZ2VuOjpWZWN0b3IyZChjZW50ZXIueCgpICsgKGV2ZW50LT5wb3MoKS54KCkgLSB3aWR0aCgpLzIpICogeHJhZGl1cyAqIDIgLyB3aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIueSgpICsgKGV2ZW50LT5wb3MoKS55KCkgLSBoZWlnaHQoKS8yKSAqIHlyYWRpdXMgKiAyIC8gaGVpZ2h0KCkpOworICAgIGRyYWZ0ID0gMTY7CisgICAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspCisgICAgICB0aHJlYWRzW3RoXS0+dGVybWluYXRlKCk7CisgICAgdXBkYXRlKCk7CisgIH0KK30KKwordm9pZCBNYW5kZWxicm90V2lkZ2V0Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZXZlbnQpCit7CisgIFFQb2ludCBkZWx0YSA9IGV2ZW50LT5wb3MoKSAtIGxhc3Rwb3M7CisgIGxhc3Rwb3MgPSBldmVudC0+cG9zKCk7CisgIGlmKCBldmVudC0+YnV0dG9ucygpICYgUXQ6OkxlZnRCdXR0b24gKQorICB7CisgICAgZG91YmxlIHQgPSAxICsgNSAqIGRvdWJsZShkZWx0YS55KCkpIC8gaGVpZ2h0KCk7CisgICAgaWYodCA8IDAuNSkgdCA9IDAuNTsKKyAgICBpZih0ID4gMikgdCA9IDI7CisgICAgeHJhZGl1cyAqPSB0OworICAgIGRyYWZ0ID0gMTY7CisgICAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspCisgICAgICB0aHJlYWRzW3RoXS0+dGVybWluYXRlKCk7CisgICAgdXBkYXRlKCk7CisgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgUUFwcGxpY2F0aW9uIGFwcChhcmdjLCBhcmd2KTsKKyAgTWFuZGVsYnJvdFdpZGdldCB3OworICB3LnNob3coKTsKKyAgcmV0dXJuIGFwcC5leGVjKCk7Cit9CisKKyNpbmNsdWRlICJtYW5kZWxicm90Lm1vYyIKZGlmZiAtLWdpdCBhL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5oIGIvZGVtb3MvbWFuZGVsYnJvdC9tYW5kZWxicm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4N2ZkMAotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBNQU5ERUxCUk9UX0gKKyNkZWZpbmUgTUFOREVMQlJPVF9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPFF0R3VpL1FBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRdEd1aS9RV2lkZ2V0PgorI2luY2x1ZGUgPFF0Q29yZS9RVGhyZWFkPgorCitjbGFzcyBNYW5kZWxicm90V2lkZ2V0OworCitjbGFzcyBNYW5kZWxicm90VGhyZWFkIDogcHVibGljIFFUaHJlYWQKK3sKKyAgICBmcmllbmQgY2xhc3MgTWFuZGVsYnJvdFdpZGdldDsKKyAgICBNYW5kZWxicm90V2lkZ2V0ICp3aWRnZXQ7CisgICAgbG9uZyBsb25nIHRvdGFsX2l0ZXI7CisgICAgaW50IGlkLCBtYXhfaXRlcjsKKyAgICBib29sIHNpbmdsZV9wcmVjaXNpb247CisKKyAgcHVibGljOgorICAgIE1hbmRlbGJyb3RUaHJlYWQoTWFuZGVsYnJvdFdpZGdldCAqdywgaW50IGkpIDogd2lkZ2V0KHcpLCBpZChpKSB7fQorICAgIHZvaWQgcnVuKCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVhbD4gdm9pZCByZW5kZXIoaW50IGltZ193aWR0aCwgaW50IGltZ19oZWlnaHQpOworfTsKKworY2xhc3MgTWFuZGVsYnJvdFdpZGdldCA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworICAgIGZyaWVuZCBjbGFzcyBNYW5kZWxicm90VGhyZWFkOworICAgIEVpZ2VuOjpWZWN0b3IyZCBjZW50ZXI7CisgICAgZG91YmxlIHhyYWRpdXM7CisgICAgaW50IHNpemU7CisgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgIFFQb2ludCBsYXN0cG9zOworICAgIGludCBkcmFmdDsKKyAgICBNYW5kZWxicm90VGhyZWFkICoqdGhyZWFkczsKKyAgICBpbnQgdGhyZWFkY291bnQ7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgcmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICopOworICAgIHZvaWQgcGFpbnRFdmVudChRUGFpbnRFdmVudCAqKTsKKyAgICB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCAqZXZlbnQpOworICAgIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKmV2ZW50KTsKKworICBwdWJsaWM6CisgICAgTWFuZGVsYnJvdFdpZGdldCgpIDogUVdpZGdldCgpLCBjZW50ZXIoMCwwKSwgeHJhZGl1cygyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKDApLCBidWZmZXIoMCksIGRyYWZ0KDE2KQorICAgIHsKKyAgICAgIHNldEF1dG9GaWxsQmFja2dyb3VuZChmYWxzZSk7CisgICAgICB0aHJlYWRjb3VudCA9IFFUaHJlYWQ6OmlkZWFsVGhyZWFkQ291bnQoKTsKKyAgICAgIHRocmVhZHMgPSBuZXcgTWFuZGVsYnJvdFRocmVhZCpbdGhyZWFkY291bnRdOworICAgICAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIHRocmVhZHNbdGhdID0gbmV3IE1hbmRlbGJyb3RUaHJlYWQodGhpcywgdGgpOworICAgIH0KKyAgICB+TWFuZGVsYnJvdFdpZGdldCgpCisgICAgeworICAgICAgaWYoYnVmZmVyKSBkZWxldGVbXWJ1ZmZlcjsKKyAgICAgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKSBkZWxldGUgdGhyZWFkc1t0aF07CisgICAgICBkZWxldGVbXSB0aHJlYWRzOworICAgIH0KK307CisKKyNlbmRpZiAvLyBNQU5ERUxCUk9UX0gKZGlmZiAtLWdpdCBhL2RlbW9zL21peF9laWdlbl9hbmRfYy9SRUFETUUgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZGJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvUkVBRE1FCkBAIC0wLDAgKzEsOSBAQAorVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyBvbmUgY2FuIHdyYXAgc29tZSBvZiBFaWdlbiBpbnRvIGEgQyBsaWJyYXJ5LgorCitUbyB0cnkgdGhpcyB3aXRoIEdDQywgZG86CisKKyAgZysrIC1jIGJpbmFyeV9saWJyYXJ5LmNwcCAtTzIgLW1zc2UyIC1JIC4uLy4uCisgIGdjYyBleGFtcGxlLmMgYmluYXJ5X2xpYnJhcnkubyAtbyBleGFtcGxlIC1sc3RkYysrCisgIC4vZXhhbXBsZQorCitUT0RPOiBhZGQgQ01ha2VMaXN0cywgYWRkIG1vcmUgZXhwbGFuYXRpb25zIGhlcmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuY3BwIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyZDAzCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmNwcApAQCAtMCwwICsxLDE4NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGlzIEMrKyBmaWxlIGNvbXBpbGVzIHRvIGJpbmFyeSBjb2RlIHRoYXQgY2FuIGJlIGxpbmtlZCB0byBieSB5b3VyIEMgcHJvZ3JhbSwKKy8vIHRoYW5rcyB0byB0aGUgZXh0ZXJuICJDIiBzeW50YXggdXNlZCBpbiB0aGUgZGVjbGFyYXRpb25zIGluIGJpbmFyeV9saWJyYXJ5LmguCisKKyNpbmNsdWRlICJiaW5hcnlfbGlicmFyeS5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBwb2ludGVyIGNvbnZlcnNpb24gbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8vLy8gY2xhc3MgTWF0cml4WGQgLy8vLy8vCisKK2lubGluZSBNYXRyaXhYZCYgY190b19laWdlbihDX01hdHJpeFhkKiBwdHIpCit7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxNYXRyaXhYZCo+KHB0cik7Cit9CisKK2lubGluZSBjb25zdCBNYXRyaXhYZCYgY190b19laWdlbihjb25zdCBDX01hdHJpeFhkKiBwdHIpCit7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXhYZCo+KHB0cik7Cit9CisKK2lubGluZSBDX01hdHJpeFhkKiBlaWdlbl90b19jKE1hdHJpeFhkJiByZWYpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PENfTWF0cml4WGQqPigmcmVmKTsKK30KKworaW5saW5lIGNvbnN0IENfTWF0cml4WGQqIGVpZ2VuX3RvX2MoY29uc3QgTWF0cml4WGQmIHJlZikKK3sKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ19NYXRyaXhYZCo+KCZyZWYpOworfQorCisvLy8vLy8gY2xhc3MgTWFwPE1hdHJpeFhkPiAvLy8vLy8KKworaW5saW5lIE1hcDxNYXRyaXhYZD4mIGNfdG9fZWlnZW4oQ19NYXBfTWF0cml4WGQqIHB0cikKK3sKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE1hcDxNYXRyaXhYZD4qPihwdHIpOworfQorCitpbmxpbmUgY29uc3QgTWFwPE1hdHJpeFhkPiYgY190b19laWdlbihjb25zdCBDX01hcF9NYXRyaXhYZCogcHRyKQoreworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWFwPE1hdHJpeFhkPio+KHB0cik7Cit9CisKK2lubGluZSBDX01hcF9NYXRyaXhYZCogZWlnZW5fdG9fYyhNYXA8TWF0cml4WGQ+JiByZWYpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PENfTWFwX01hdHJpeFhkKj4oJnJlZik7Cit9CisKK2lubGluZSBjb25zdCBDX01hcF9NYXRyaXhYZCogZWlnZW5fdG9fYyhjb25zdCBNYXA8TWF0cml4WGQ+JiByZWYpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENfTWFwX01hdHJpeFhkKj4oJnJlZik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogaW1wbGVtZW50YXRpb24gb2YgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLy8vLyBjbGFzcyBNYXRyaXhYZCAvLy8vLy8KKworCitDX01hdHJpeFhkKiBNYXRyaXhYZF9uZXcoaW50IHJvd3MsIGludCBjb2xzKQoreworICByZXR1cm4gZWlnZW5fdG9fYygqbmV3IE1hdHJpeFhkKHJvd3MsY29scykpOworfQorCit2b2lkIE1hdHJpeFhkX2RlbGV0ZShDX01hdHJpeFhkICptKQoreworICBkZWxldGUgJmNfdG9fZWlnZW4obSk7Cit9CisKK2RvdWJsZSogTWF0cml4WGRfZGF0YShDX01hdHJpeFhkICptKQoreworICByZXR1cm4gY190b19laWdlbihtKS5kYXRhKCk7Cit9CisKK3ZvaWQgTWF0cml4WGRfc2V0X3plcm8oQ19NYXRyaXhYZCAqbSkKK3sKKyAgY190b19laWdlbihtKS5zZXRaZXJvKCk7Cit9CisKK3ZvaWQgTWF0cml4WGRfcmVzaXplKENfTWF0cml4WGQgKm0sIGludCByb3dzLCBpbnQgY29scykKK3sKKyAgY190b19laWdlbihtKS5yZXNpemUocm93cyxjb2xzKTsKK30KKwordm9pZCBNYXRyaXhYZF9jb3B5KENfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXRyaXhYZCAqc3JjKQoreworICBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7Cit9CisKK3ZvaWQgTWF0cml4WGRfY29weV9tYXAoQ19NYXRyaXhYZCAqZHN0LCBjb25zdCBDX01hcF9NYXRyaXhYZCAqc3JjKQoreworICBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7Cit9CisKK3ZvaWQgTWF0cml4WGRfc2V0X2NvZWZmKENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKQoreworICBjX3RvX2VpZ2VuKG0pKGksaikgPSBjb2VmZjsKK30KKworZG91YmxlIE1hdHJpeFhkX2dldF9jb2VmZihjb25zdCBDX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGopCit7CisgIHJldHVybiBjX3RvX2VpZ2VuKG0pKGksaik7Cit9CisKK3ZvaWQgTWF0cml4WGRfcHJpbnQoY29uc3QgQ19NYXRyaXhYZCAqbSkKK3sKKyAgc3RkOjpjb3V0IDw8IGNfdG9fZWlnZW4obSkgPDwgc3RkOjplbmRsOworfQorCit2b2lkIE1hdHJpeFhkX211bHRpcGx5KGNvbnN0IENfTWF0cml4WGQgKm0xLCBjb25zdCBDX01hdHJpeFhkICptMiwgQ19NYXRyaXhYZCAqcmVzdWx0KQoreworICBjX3RvX2VpZ2VuKHJlc3VsdCkgPSBjX3RvX2VpZ2VuKG0xKSAqIGNfdG9fZWlnZW4obTIpOworfQorCit2b2lkIE1hdHJpeFhkX2FkZChjb25zdCBDX01hdHJpeFhkICptMSwgY29uc3QgQ19NYXRyaXhYZCAqbTIsIENfTWF0cml4WGQgKnJlc3VsdCkKK3sKKyAgY190b19laWdlbihyZXN1bHQpID0gY190b19laWdlbihtMSkgKyBjX3RvX2VpZ2VuKG0yKTsKK30KKworCisKKy8vLy8vLyBjbGFzcyBNYXBfTWF0cml4WGQgLy8vLy8vCisKKworQ19NYXBfTWF0cml4WGQqIE1hcF9NYXRyaXhYZF9uZXcoZG91YmxlICphcnJheSwgaW50IHJvd3MsIGludCBjb2xzKQoreworICByZXR1cm4gZWlnZW5fdG9fYygqbmV3IE1hcDxNYXRyaXhYZD4oYXJyYXkscm93cyxjb2xzKSk7Cit9CisKK3ZvaWQgTWFwX01hdHJpeFhkX2RlbGV0ZShDX01hcF9NYXRyaXhYZCAqbSkKK3sKKyAgZGVsZXRlICZjX3RvX2VpZ2VuKG0pOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9zZXRfemVybyhDX01hcF9NYXRyaXhYZCAqbSkKK3sKKyAgY190b19laWdlbihtKS5zZXRaZXJvKCk7Cit9CisKK3ZvaWQgTWFwX01hdHJpeFhkX2NvcHkoQ19NYXBfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXBfTWF0cml4WGQgKnNyYykKK3sKKyAgY190b19laWdlbihkc3QpID0gY190b19laWdlbihzcmMpOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9jb3B5X21hdHJpeChDX01hcF9NYXRyaXhYZCAqZHN0LCBjb25zdCBDX01hdHJpeFhkICpzcmMpCit7CisgIGNfdG9fZWlnZW4oZHN0KSA9IGNfdG9fZWlnZW4oc3JjKTsKK30KKwordm9pZCBNYXBfTWF0cml4WGRfc2V0X2NvZWZmKENfTWFwX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZikKK3sKKyAgY190b19laWdlbihtKShpLGopID0gY29lZmY7Cit9CisKK2RvdWJsZSBNYXBfTWF0cml4WGRfZ2V0X2NvZWZmKGNvbnN0IENfTWFwX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGopCit7CisgIHJldHVybiBjX3RvX2VpZ2VuKG0pKGksaik7Cit9CisKK3ZvaWQgTWFwX01hdHJpeFhkX3ByaW50KGNvbnN0IENfTWFwX01hdHJpeFhkICptKQoreworICBzdGQ6OmNvdXQgPDwgY190b19laWdlbihtKSA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgTWFwX01hdHJpeFhkX211bHRpcGx5KGNvbnN0IENfTWFwX01hdHJpeFhkICptMSwgY29uc3QgQ19NYXBfTWF0cml4WGQgKm0yLCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KQoreworICBjX3RvX2VpZ2VuKHJlc3VsdCkgPSBjX3RvX2VpZ2VuKG0xKSAqIGNfdG9fZWlnZW4obTIpOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9hZGQoY29uc3QgQ19NYXBfTWF0cml4WGQgKm0xLCBjb25zdCBDX01hcF9NYXRyaXhYZCAqbTIsIENfTWFwX01hdHJpeFhkICpyZXN1bHQpCit7CisgIGNfdG9fZWlnZW4ocmVzdWx0KSA9IGNfdG9fZWlnZW4obTEpICsgY190b19laWdlbihtMik7Cit9CmRpZmYgLS1naXQgYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaCBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9iaW5hcnlfbGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTgzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaApAQCAtMCwwICsxLDcxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgaXMgYSBwdXJlIEMgaGVhZGVyLCBubyBDKysgaGVyZS4KKy8vIFRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaGVyZSB3aWxsIGJlIGltcGxlbWVudGVkIGluIEMrKyBidXQKKy8vIHdlIGRvbid0IGhhdmUgdG8ga25vdywgYmVjYXVzZSB0aGFua3MgdG8gdGhlIGV4dGVybiAiQyIgc3ludGF4LAorLy8gdGhleSB3aWxsIGJlIGNvbXBpbGVkIHRvIEMgb2JqZWN0IGNvZGUuCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgLy8ganVzdCBkdW1teSBlbXB0eSBzdHJ1Y3RzIHRvIGdpdmUgZGlmZmVyZW50IHBvaW50ZXIgdHlwZXMsCisgIC8vIGluc3RlYWQgb2YgdXNpbmcgdm9pZCogd2hpY2ggd291bGQgYmUgdHlwZSB1bnNhZmUKKyAgc3RydWN0IENfTWF0cml4WGQge307CisgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCB7fTsKKworICAvLyB0aGUgQ19NYXRyaXhYZCBjbGFzcywgd3JhcHMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQorICAvLyBvZiBFaWdlbjo6TWF0cml4WGQuCisgIHN0cnVjdCBDX01hdHJpeFhkKiBNYXRyaXhYZF9uZXcoaW50IHJvd3MsIGludCBjb2xzKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9kZWxldGUgICAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7CisgIGRvdWJsZSogTWF0cml4WGRfZGF0YSAgICAgICAoc3RydWN0IENfTWF0cml4WGQgKm0pOworICB2b2lkICAgIE1hdHJpeFhkX3NldF96ZXJvICAgKHN0cnVjdCBDX01hdHJpeFhkICptKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9yZXNpemUgICAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqbSwgaW50IHJvd3MsIGludCBjb2xzKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9jb3B5ICAgICAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICpzcmMpOworICB2b2lkICAgIE1hdHJpeFhkX2NvcHlfbWFwICAgKHN0cnVjdCBDX01hdHJpeFhkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICpzcmMpOyAgCisgIHZvaWQgICAgTWF0cml4WGRfc2V0X2NvZWZmICAoc3RydWN0IENfTWF0cml4WGQgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBqLCBkb3VibGUgY29lZmYpOworICBkb3VibGUgIE1hdHJpeFhkX2dldF9jb2VmZiAgKGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgaik7CisgIHZvaWQgICAgTWF0cml4WGRfcHJpbnQgICAgICAoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0pOworICB2b2lkICAgIE1hdHJpeFhkX2FkZCAgICAgICAgKGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENfTWF0cml4WGQgKnJlc3VsdCk7ICAKKyAgdm9pZCAgICBNYXRyaXhYZF9tdWx0aXBseSAgIChjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDX01hdHJpeFhkICpyZXN1bHQpOworICAKKyAgLy8gdGhlIENfTWFwX01hdHJpeFhkIGNsYXNzLCB3cmFwcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5CisgIC8vIG9mIEVpZ2VuOjpNYXA8TWF0cml4WGQ+CisgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCogTWFwX01hdHJpeFhkX25ldyhkb3VibGUgKmFycmF5LCBpbnQgcm93cywgaW50IGNvbHMpOworICB2b2lkICAgTWFwX01hdHJpeFhkX2RlbGV0ZSAgICAgKHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSk7CisgIHZvaWQgICBNYXBfTWF0cml4WGRfc2V0X3plcm8gICAoc3RydWN0IENfTWFwX01hdHJpeFhkICptKTsKKyAgdm9pZCAgIE1hcF9NYXRyaXhYZF9jb3B5ICAgICAgIChzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKnNyYyk7CisgIHZvaWQgICBNYXBfTWF0cml4WGRfY29weV9tYXRyaXgoc3RydWN0IENfTWFwX01hdHJpeFhkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKnNyYyk7ICAKKyAgdm9pZCAgIE1hcF9NYXRyaXhYZF9zZXRfY29lZmYgIChzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBqLCBkb3VibGUgY29lZmYpOworICBkb3VibGUgTWFwX01hdHJpeFhkX2dldF9jb2VmZiAgKGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGopOworICB2b2lkICAgTWFwX01hdHJpeFhkX3ByaW50ICAgICAgKGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSk7CisgIHZvaWQgICBNYXBfTWF0cml4WGRfYWRkICAgICAgICAoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KTsgIAorICB2b2lkICAgTWFwX01hdHJpeFhkX211bHRpcGx5ICAgKGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBlbmQgZXh0ZXJuICJDIgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2V4YW1wbGUuYyBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9leGFtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZWI1NAotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9leGFtcGxlLmMKQEAgLTAsMCArMSw2NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiYmluYXJ5X2xpYnJhcnkuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorCit2b2lkIGRlbW9fTWF0cml4WGQoKQoreworICBzdHJ1Y3QgQ19NYXRyaXhYZCAqbWF0cml4MSwgKm1hdHJpeDIsICpyZXN1bHQ7CisgIHByaW50ZigiKioqIGRlbW9fTWF0cml4WGQgKioqXG4iKTsKKyAgCisgIG1hdHJpeDEgPSBNYXRyaXhYZF9uZXcoMywgMyk7CisgIE1hdHJpeFhkX3NldF96ZXJvKG1hdHJpeDEpOworICBNYXRyaXhYZF9zZXRfY29lZmYobWF0cml4MSwgMCwgMSwgMi41KTsKKyAgTWF0cml4WGRfc2V0X2NvZWZmKG1hdHJpeDEsIDEsIDAsIDEuNCk7CisgIHByaW50ZigiSGVyZSBpcyBtYXRyaXgxOlxuIik7CisgIE1hdHJpeFhkX3ByaW50KG1hdHJpeDEpOworCisgIG1hdHJpeDIgPSBNYXRyaXhYZF9uZXcoMywgMyk7CisgIE1hdHJpeFhkX211bHRpcGx5KG1hdHJpeDEsIG1hdHJpeDEsIG1hdHJpeDIpOworICBwcmludGYoIkhlcmUgaXMgbWF0cml4MSptYXRyaXgxOlxuIik7CisgIE1hdHJpeFhkX3ByaW50KG1hdHJpeDIpOworCisgIE1hdHJpeFhkX2RlbGV0ZShtYXRyaXgxKTsKKyAgTWF0cml4WGRfZGVsZXRlKG1hdHJpeDIpOworfQorCisvLyB0aGlzIGhlbHBlciBmdW5jdGlvbiB0YWtlcyBhIHBsYWluIEMgYXJyYXkgYW5kIHByaW50cyBpdCBpbiBvbmUgbGluZQordm9pZCBwcmludF9hcnJheShkb3VibGUgKmFycmF5LCBpbnQgbikKK3sKKyAgc3RydWN0IENfTWFwX01hdHJpeFhkICptID0gTWFwX01hdHJpeFhkX25ldyhhcnJheSwgMSwgbik7CisgIE1hcF9NYXRyaXhYZF9wcmludChtKTsKKyAgTWFwX01hdHJpeFhkX2RlbGV0ZShtKTsKK30KKwordm9pZCBkZW1vX01hcF9NYXRyaXhYZCgpCit7CisgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbWFwOworICBkb3VibGUgYXJyYXlbNV07CisgIGludCBpOworICBwcmludGYoIioqKiBkZW1vX01hcF9NYXRyaXhYZCAqKipcbiIpOworICAKKyAgZm9yKGkgPSAwOyBpIDwgNTsgKytpKSBhcnJheVtpXSA9IGk7CisgIHByaW50ZigiSW5pdGlhbGx5LCB0aGUgYXJyYXkgaXM6XG4iKTsKKyAgcHJpbnRfYXJyYXkoYXJyYXksIDUpOworICAKKyAgbWFwID0gTWFwX01hdHJpeFhkX25ldyhhcnJheSwgNSwgMSk7CisgIE1hcF9NYXRyaXhYZF9hZGQobWFwLCBtYXAsIG1hcCk7CisgIE1hcF9NYXRyaXhYZF9kZWxldGUobWFwKTsKKworICBwcmludGYoIk5vdyB0aGUgYXJyYXkgaXM6XG4iKTsKKyAgcHJpbnRfYXJyYXkoYXJyYXksIDUpOworfQorCitpbnQgbWFpbigpCit7CisgIGRlbW9fTWF0cml4WGQoKTsKKyAgZGVtb19NYXBfTWF0cml4WGQoKTsKK30KZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9DTWFrZUxpc3RzLnR4dCBiL2RlbW9zL29wZW5nbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTlhYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjggQEAKK2ZpbmRfcGFja2FnZShRdDQpCitmaW5kX3BhY2thZ2UoT3BlbkdMKQorCitpZihRVDRfRk9VTkQgQU5EIE9QRU5HTF9GT1VORCkKKworICBzZXQoUVRfVVNFX1FUT1BFTkdMIFRSVUUpCisgIGluY2x1ZGUoJHtRVF9VU0VfRklMRX0pCisKKyAgc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyggJHtRVF9JTkNMVURFX0RJUn0gKQorCisgIHNldChxdWF0ZXJuaW9uX2RlbW9fU1JDUyAgZ3B1aGVscGVyLmNwcCBpY29zcGhlcmUuY3BwIGNhbWVyYS5jcHAgdHJhY2tiYWxsLmNwcCBxdWF0ZXJuaW9uX2RlbW8uY3BwKQorCisgIHF0NF9hdXRvbW9jKCR7cXVhdGVybmlvbl9kZW1vX1NSQ1N9KQorCisgIGFkZF9leGVjdXRhYmxlKHF1YXRlcm5pb25fZGVtbyAke3F1YXRlcm5pb25fZGVtb19TUkNTfSkKKyAgYWRkX2RlcGVuZGVuY2llcyhkZW1vcyBxdWF0ZXJuaW9uX2RlbW8pCisKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHF1YXRlcm5pb25fZGVtbworICAgICR7UVRfUVRDT1JFX0xJQlJBUll9ICAgICR7UVRfUVRHVUlfTElCUkFSWX0KKyAgICAke1FUX1FUT1BFTkdMX0xJQlJBUll9ICAke09QRU5HTF9MSUJSQVJJRVN9ICkKKworZWxzZSgpCisKKyAgbWVzc2FnZShTVEFUVVMgIk9wZW5HTCBkZW1vIGRpc2FibGVkIGJlY2F1c2UgUXQ0IGFuZC9vciBPcGVuR0wgaGF2ZSBub3QgYmVlbiBmb3VuZC4iKQorCitlbmRpZigpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL1JFQURNRSBiL2RlbW9zL29wZW5nbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiMTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL29wZW5nbC9SRUFETUUKQEAgLTAsMCArMSwxMyBAQAorCitOYXZpZ2F0aW9uOgorIGxlZnQgYnV0dG9uOiAgICAgICAgICAgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0CisgbWlkZGxlIGJ1dHRvbjogICAgICAgICB6b29tCisgbGVmdCBidXR0b24gKyBjdHJsICAgICBxdWFrZSByb3RhdGUgKHJvdGF0ZSBhcm91bmQgY2FtZXJhIHBvc2l0aW9uKQorIG1pZGRsZSBidXR0b24gKyBjdHJsICAgd2FsayAocHJvZ3Jlc3MgYWxvbmcgY2FtZXJhJ3MgeiBkaXJlY3Rpb24pCisgbGVmdCBidXR0b246ICAgICAgICAgICBwYW4gKHRyYW5zbGF0ZSBpbiB0aGUgWFkgY2FtZXJhJ3MgcGxhbmUpCisKK1IgOiBtb3ZlIHRoZSBjYW1lcmEgdG8gaW5pdGlhbCBwb3NpdGlvbgorQSA6IHN0YXJ0L3N0b3AgYW5pbWF0aW9uCitDIDogY2xlYXIgdGhlIGFuaW1hdGlvbgorRyA6IGFkZCBhIGtleSBmcmFtZQorCmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvY2FtZXJhLmNwcCBiL2RlbW9zL29wZW5nbC9jYW1lcmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjM0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9vcGVuZ2wvY2FtZXJhLmNwcApAQCAtMCwwICsxLDI2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+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+Kj4gbUluZGljZXM7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBtTGlzdElkczsKK307CisKKyNlbmRpZiAvLyBFSUdFTl9JQ09TUEhFUkVfSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAgYi9kZW1vcy9vcGVuZ2wvcXVhdGVybmlvbl9kZW1vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDMyM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAKQEAgLTAsMCArMSw2NTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInF1YXRlcm5pb25fZGVtby5oIgorI2luY2x1ZGUgImljb3NwaGVyZS5oIgorCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxRRXZlbnQ+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CisjaW5jbHVkZSA8UUlucHV0RGlhbG9nPgorI2luY2x1ZGUgPFFHcmlkTGF5b3V0PgorI2luY2x1ZGUgPFFCdXR0b25Hcm91cD4KKyNpbmNsdWRlIDxRUmFkaW9CdXR0b24+CisjaW5jbHVkZSA8UURvY2tXaWRnZXQ+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisjaW5jbHVkZSA8UUdyb3VwQm94PgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2NsYXNzIEZhbmN5U3BoZXJlcworeworICBwdWJsaWM6CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICAgIAorICAgIEZhbmN5U3BoZXJlcygpCisgICAgeworICAgICAgY29uc3QgaW50IGxldmVscyA9IDQ7CisgICAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDAuMzM7CisgICAgICBmbG9hdCByYWRpdXMgPSAxMDA7CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBhcmVudHM7CisKKyAgICAgIC8vIGxldmFsIDAKKyAgICAgIG1DZW50ZXJzLnB1c2hfYmFjayhWZWN0b3IzZjo6WmVybygpKTsKKyAgICAgIHBhcmVudHMucHVzaF9iYWNrKC0xKTsKKyAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKworICAgICAgLy8gZ2VuZXJhdGUgbGV2ZWwgMSB1c2luZyBpY29zcGhlcmUgdmVydGljZXMKKyAgICAgIHJhZGl1cyAqPSAwLjQ1OworICAgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gbVJhZGlpWzBdKjAuOTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEyOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBtQ2VudGVycy5wdXNoX2JhY2sobUljb1NwaGVyZS52ZXJ0aWNlcygpW2ldICogZGlzdCk7CisgICAgICAgICAgbVJhZGlpLnB1c2hfYmFjayhyYWRpdXMpOworICAgICAgICAgIHBhcmVudHMucHVzaF9iYWNrKDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBhbmdsZXMgWzEwXSA9IHsKKyAgICAgICAgMCwgMCwKKyAgICAgICAgTV9QSSwgMC4qTV9QSSwKKyAgICAgICAgTV9QSSwgMC41Kk1fUEksCisgICAgICAgIE1fUEksIDEuKk1fUEksCisgICAgICAgIE1fUEksIDEuNSpNX1BJCisgICAgICB9OworCisgICAgICAvLyBnZW5lcmF0ZSBvdGhlciBsZXZlbHMKKyAgICAgIGludCBzdGFydCA9IDE7CisgICAgICBmb3IgKGludCBsPTE7IGw8bGV2ZWxzOyBsKyspCisgICAgICB7CisgICAgICAgIHJhZGl1cyAqPSBzY2FsZTsKKyAgICAgICAgaW50IGVuZCA9IG1DZW50ZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaT1zdGFydDsgaTxlbmQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIFZlY3RvcjNmIGMgPSBtQ2VudGVyc1tpXTsKKyAgICAgICAgICBWZWN0b3IzZiBheDAgPSAoYyAtIG1DZW50ZXJzW3BhcmVudHNbaV1dKS5ub3JtYWxpemVkKCk7CisgICAgICAgICAgVmVjdG9yM2YgYXgxID0gYXgwLnVuaXRPcnRob2dvbmFsKCk7CisgICAgICAgICAgUXVhdGVybmlvbmYgcTsKKyAgICAgICAgICBxLnNldEZyb21Ud29WZWN0b3JzKFZlY3RvcjNmOjpVbml0WigpLCBheDApOworICAgICAgICAgIEFmZmluZTNmIHQgPSBUcmFuc2xhdGlvbjNmKGMpICogcSAqIFNjYWxpbmcobVJhZGlpW2ldK3JhZGl1cyk7CisgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPDU7ICsraikKKyAgICAgICAgICB7CisgICAgICAgICAgICBWZWN0b3IzZiBuZXdDID0gYyArICggKEFuZ2xlQXhpc2YoYW5nbGVzW2oqMisxXSwgYXgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFuZ2xlQXhpc2YoYW5nbGVzW2oqMiswXSAqIChsPT0xID8gMC4zNSA6IDAuNSksIGF4MSkpICogYXgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChtUmFkaWlbaV0gKyByYWRpdXMqMC44KTsKKyAgICAgICAgICAgIG1DZW50ZXJzLnB1c2hfYmFjayhuZXdDKTsKKyAgICAgICAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKyAgICAgICAgICAgIHBhcmVudHMucHVzaF9iYWNrKGkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGRyYXcoKQorICAgIHsKKyAgICAgIGludCBlbmQgPSBtQ2VudGVycy5zaXplKCk7CisgICAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPGVuZDsgKytpKQorICAgICAgeworICAgICAgICBBZmZpbmUzZiB0ID0gVHJhbnNsYXRpb24zZihtQ2VudGVyc1tpXSkgKiBTY2FsaW5nKG1SYWRpaVtpXSk7CisgICAgICAgIGdwdS5wdXNoTWF0cml4KEdMX01PREVMVklFVyk7CisgICAgICAgIGdwdS5tdWx0TWF0cml4KHQubWF0cml4KCksR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgbUljb1NwaGVyZS5kcmF3KDIpOworICAgICAgICBncHUucG9wTWF0cml4KEdMX01PREVMVklFVyk7CisgICAgICB9CisgICAgICBnbERpc2FibGUoR0xfTk9STUFMSVpFKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBzdGQ6OnZlY3RvcjxWZWN0b3IzZj4gbUNlbnRlcnM7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1SYWRpaTsKKyAgICBJY29TcGhlcmUgbUljb1NwaGVyZTsKK307CisKKworLy8gZ2VuZXJpYyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBtZXRob2QKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgbGVycChmbG9hdCB0LCBjb25zdCBUJiBhLCBjb25zdCBUJiBiKQoreworICByZXR1cm4gYSooMS10KSArIGIqdDsKK30KKworLy8gcXVhdGVybmlvbiBzbGVycAordGVtcGxhdGU8PiBRdWF0ZXJuaW9uZiBsZXJwKGZsb2F0IHQsIGNvbnN0IFF1YXRlcm5pb25mJiBhLCBjb25zdCBRdWF0ZXJuaW9uZiYgYikKK3sgcmV0dXJuIGEuc2xlcnAodCxiKTsgfQorCisvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiBhIGZyYW1lIHVzaW5nIHRoZSB0eXBlIE9yaWVudGF0aW9uVHlwZQorLy8gdG8gcGVyZm9ybSB0aGUgaW50ZXJwb2xhdGlvbiBvZiB0aGUgb3JpZW50YXRpb25zCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcmllbnRhdGlvblR5cGU+CitpbmxpbmUgc3RhdGljIEZyYW1lIGxlcnBGcmFtZShmbG9hdCBhbHBoYSwgY29uc3QgRnJhbWUmIGEsIGNvbnN0IEZyYW1lJiBiKQoreworICByZXR1cm4gRnJhbWUobGVycChhbHBoYSxhLnBvc2l0aW9uLGIucG9zaXRpb24pLAorICAgICAgICAgICAgICAgUXVhdGVybmlvbmYobGVycChhbHBoYSxPcmllbnRhdGlvblR5cGUoYS5vcmllbnRhdGlvbiksT3JpZW50YXRpb25UeXBlKGIub3JpZW50YXRpb24pKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiBjbGFzcyBFdWxlckFuZ2xlcworeworcHVibGljOgorICBlbnVtIHsgRGltID0gMyB9OworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uVHlwZTsKKworcHJvdGVjdGVkOgorCisgIFZlY3RvcjMgbV9hbmdsZXM7CisKK3B1YmxpYzoKKworICBFdWxlckFuZ2xlcygpIHt9CisgIGlubGluZSBFdWxlckFuZ2xlcyhTY2FsYXIgYTAsIFNjYWxhciBhMSwgU2NhbGFyIGEyKSA6IG1fYW5nbGVzKGEwLCBhMSwgYTIpIHt9CisgIGlubGluZSBFdWxlckFuZ2xlcyhjb25zdCBRdWF0ZXJuaW9uVHlwZSYgcSkgeyAqdGhpcyA9IHE7IH0KKworICBjb25zdCBWZWN0b3IzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlczsgfQorICBWZWN0b3IzJiBjb2VmZnMoKSB7IHJldHVybiBtX2FuZ2xlczsgfQorCisgIEV1bGVyQW5nbGVzJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvblR5cGUmIHEpCisgIHsKKyAgICBNYXRyaXgzIG0gPSBxLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgICByZXR1cm4gKnRoaXMgPSBtOworICB9CisKKyAgRXVsZXJBbmdsZXMmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgzJiBtKQorICB7CisgICAgLy8gbWF0ID0gIGN5KmN6ICAgICAgICAgIC1jeSpzeiAgICAgICAgICAgc3kKKyAgICAvLyAgICAgICAgY3oqc3gqc3krY3gqc3ogIGN4KmN6LXN4KnN5KnN6IC1jeSpzeAorICAgIC8vICAgICAgIC1jeCpjeipzeStzeCpzeiAgY3oqc3grY3gqc3kqc3ogIGN4KmN5CisgICAgbV9hbmdsZXMuY29lZmZSZWYoMSkgPSBzdGQ6OmFzaW4obS5jb2VmZigwLDIpKTsKKyAgICBtX2FuZ2xlcy5jb2VmZlJlZigwKSA9IHN0ZDo6YXRhbjIoLW0uY29lZmYoMSwyKSxtLmNvZWZmKDIsMikpOworICAgIG1fYW5nbGVzLmNvZWZmUmVmKDIpID0gc3RkOjphdGFuMigtbS5jb2VmZigwLDEpLG0uY29lZmYoMCwwKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTWF0cml4MyB0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0CisgIHsKKyAgICBWZWN0b3IzIGMgPSBtX2FuZ2xlcy5hcnJheSgpLmNvcygpOworICAgIFZlY3RvcjMgcyA9IG1fYW5nbGVzLmFycmF5KCkuc2luKCk7CisgICAgTWF0cml4MyByZXM7CisgICAgcmVzIDw8ICBjLnkoKSpjLnooKSwgICAgICAgICAgICAgICAgICAgIC1jLnkoKSpzLnooKSwgICAgICAgICAgICAgICAgICAgcy55KCksCisgICAgICAgICAgICBjLnooKSpzLngoKSpzLnkoKStjLngoKSpzLnooKSwgIGMueCgpKmMueigpLXMueCgpKnMueSgpKnMueigpLCAgLWMueSgpKnMueCgpLAorICAgICAgICAgICAgLWMueCgpKmMueigpKnMueSgpK3MueCgpKnMueigpLCBjLnooKSpzLngoKStjLngoKSpzLnkoKSpzLnooKSwgIGMueCgpKmMueSgpOworICAgIHJldHVybiByZXM7CisgIH0KKworICBvcGVyYXRvciBRdWF0ZXJuaW9uVHlwZSgpIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKHRvUm90YXRpb25NYXRyaXgoKSk7IH0KK307CisKKy8vIEV1bGVyIGFuZ2xlcyBzbGVycAordGVtcGxhdGU8PiBFdWxlckFuZ2xlczxmbG9hdD4gbGVycChmbG9hdCB0LCBjb25zdCBFdWxlckFuZ2xlczxmbG9hdD4mIGEsIGNvbnN0IEV1bGVyQW5nbGVzPGZsb2F0PiYgYikKK3sKKyAgRXVsZXJBbmdsZXM8ZmxvYXQ+IHJlczsKKyAgcmVzLmNvZWZmcygpID0gbGVycCh0LCBhLmNvZWZmcygpLCBiLmNvZWZmcygpKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitSZW5kZXJpbmdXaWRnZXQ6OlJlbmRlcmluZ1dpZGdldCgpCit7CisgIG1BbmltYXRlID0gZmFsc2U7CisgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fTk9fVFJBQ0s7CisgIG1OYXZNb2RlID0gTmF2VHVybkFyb3VuZDsKKyAgbUxlcnBNb2RlID0gTGVycFF1YXRlcm5pb247CisgIG1Sb3RhdGlvbk1vZGUgPSBSb3RhdGlvblN0YWJsZTsKKyAgbVRyYWNrYmFsbC5zZXRDYW1lcmEoJm1DYW1lcmEpOworCisgIC8vIHJlcXVpcmVkIHRvIGNhcHR1cmUga2V5IHByZXNzIGV2ZW50cworICBzZXRGb2N1c1BvbGljeShRdDo6Q2xpY2tGb2N1cyk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpncmFiRnJhbWUodm9pZCkKK3sKKyAgICAvLyBhc2sgdXNlciBmb3IgYSB0aW1lCisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIGRvdWJsZSB0ID0gMDsKKyAgICBpZiAoIW1fdGltZWxpbmUuZW1wdHkoKSkKKyAgICAgIHQgPSAoLS1tX3RpbWVsaW5lLmVuZCgpKS0+Zmlyc3QgKyAxLjsKKyAgICB0ID0gUUlucHV0RGlhbG9nOjpnZXREb3VibGUodGhpcywgIkVpZ2VuJ3MgUmVuZGVyaW5nV2lkZ2V0IiwgInRpbWUgdmFsdWU6ICIsCisgICAgICB0LCAwLCAxZTMsIDEsICZvayk7CisgICAgaWYgKG9rKQorICAgIHsKKyAgICAgIEZyYW1lIGF1eDsKKyAgICAgIGF1eC5vcmllbnRhdGlvbiA9IG1DYW1lcmEudmlld01hdHJpeCgpLmxpbmVhcigpOworICAgICAgYXV4LnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKKyAgICAgIG1fdGltZWxpbmVbdF0gPSBhdXg7CisgICAgfQorfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6ZHJhd1NjZW5lKCkKK3sKKyAgc3RhdGljIEZhbmN5U3BoZXJlcyBzRmFuY3lTcGhlcmVzOworICBmbG9hdCBsZW5ndGggPSA1MDsKKyAgZ3B1LmRyYXdWZWN0b3IoVmVjdG9yM2Y6Olplcm8oKSwgbGVuZ3RoKlZlY3RvcjNmOjpVbml0WCgpLCBDb2xvcigxLDAsMCwxKSk7CisgIGdwdS5kcmF3VmVjdG9yKFZlY3RvcjNmOjpaZXJvKCksIGxlbmd0aCpWZWN0b3IzZjo6VW5pdFkoKSwgQ29sb3IoMCwxLDAsMSkpOworICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGgqVmVjdG9yM2Y6OlVuaXRaKCksIENvbG9yKDAsMCwxLDEpKTsKKworICAvLyBkcmF3IHRoZSBmcmFjdGFsIG9iamVjdAorICBmbG9hdCBzcXJ0MyA9IHN0ZDo6c3FydCgzLik7CisgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX0FNQklFTlQsIFZlY3RvcjRmKDAuNSwwLjUsMC41LDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX0RJRkZVU0UsIFZlY3RvcjRmKDAuNSwxLDAuNSwxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9TUEVDVUxBUiwgVmVjdG9yNGYoMSwxLDEsMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIFZlY3RvcjRmKC1zcXJ0Mywtc3FydDMsc3FydDMsMCkuZGF0YSgpKTsKKworICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9BTUJJRU5ULCBWZWN0b3I0ZigwLDAsMCwxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBWZWN0b3I0ZigxLDAuNSwwLjUsMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMSwgR0xfU1BFQ1VMQVIsIFZlY3RvcjRmKDEsMSwxLDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDEsIEdMX1BPU0lUSU9OLCBWZWN0b3I0Zigtc3FydDMsc3FydDMsLXNxcnQzLDApLmRhdGEoKSk7CisKKyAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBWZWN0b3I0ZigwLjcsIDAuNywgMC43LCAxKS5kYXRhKCkpOworICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIFZlY3RvcjRmKDAuOCwgMC43NSwgMC42LCAxKS5kYXRhKCkpOworICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSLCBWZWN0b3I0ZigxLCAxLCAxLCAxKS5kYXRhKCkpOworICBnbE1hdGVyaWFsZihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCA2NCk7CisKKyAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICBnbEVuYWJsZShHTF9MSUdIVDApOworICBnbEVuYWJsZShHTF9MSUdIVDEpOworCisgIHNGYW5jeVNwaGVyZXMuZHJhdygpOworICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlc1swXS5kYXRhKCkpOworICBnbE5vcm1hbFBvaW50ZXIoR0xfRkxPQVQsIDAsIG1Ob3JtYWxzWzBdLmRhdGEoKSk7CisgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBtVmVydGljZXMuc2l6ZSgpKTsKKyAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKworICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6YW5pbWF0ZSgpCit7CisgIG1fYWxwaGEgKz0gZG91YmxlKG1fdGltZXIuaW50ZXJ2YWwoKSkgKiAxZS0zOworCisgIFRpbWVMaW5lOjpjb25zdF9pdGVyYXRvciBoaSA9IG1fdGltZWxpbmUudXBwZXJfYm91bmQobV9hbHBoYSk7CisgIFRpbWVMaW5lOjpjb25zdF9pdGVyYXRvciBsbyA9IGhpOworICAtLWxvOworCisgIEZyYW1lIGN1cnJlbnRGcmFtZTsKKworICBpZihoaT09bV90aW1lbGluZS5lbmQoKSkKKyAgeworICAgIC8vIGVuZAorICAgIGN1cnJlbnRGcmFtZSA9IGxvLT5zZWNvbmQ7CisgICAgc3RvcEFuaW1hdGlvbigpOworICB9CisgIGVsc2UgaWYoaGk9PW1fdGltZWxpbmUuYmVnaW4oKSkKKyAgeworICAgIC8vIHN0YXJ0CisgICAgY3VycmVudEZyYW1lID0gaGktPnNlY29uZDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBmbG9hdCBzID0gKG1fYWxwaGEgLSBsby0+Zmlyc3QpLyhoaS0+Zmlyc3QgLSBsby0+Zmlyc3QpOworICAgIGlmIChtTGVycE1vZGU9PUxlcnBFdWxlckFuZ2xlcykKKyAgICAgIGN1cnJlbnRGcmFtZSA9IDo6bGVycEZyYW1lPEV1bGVyQW5nbGVzPGZsb2F0PiA+KHMsIGxvLT5zZWNvbmQsIGhpLT5zZWNvbmQpOworICAgIGVsc2UgaWYgKG1MZXJwTW9kZT09TGVycFF1YXRlcm5pb24pCisgICAgICBjdXJyZW50RnJhbWUgPSA6OmxlcnBGcmFtZTxFaWdlbjo6UXVhdGVybmlvbmY+KHMsIGxvLT5zZWNvbmQsIGhpLT5zZWNvbmQpOworICAgIGVsc2UKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgcm90YXRpb24gaW50ZXJwb2xhdGlvbiBtb2RlIChhYm9ydClcbiI7CisgICAgICBleGl0KDIpOworICAgIH0KKyAgICBjdXJyZW50RnJhbWUub3JpZW50YXRpb24uY29lZmZzKCkubm9ybWFsaXplKCk7CisgIH0KKworICBjdXJyZW50RnJhbWUub3JpZW50YXRpb24gPSBjdXJyZW50RnJhbWUub3JpZW50YXRpb24uaW52ZXJzZSgpOworICBjdXJyZW50RnJhbWUucG9zaXRpb24gPSAtIChjdXJyZW50RnJhbWUub3JpZW50YXRpb24gKiBjdXJyZW50RnJhbWUucG9zaXRpb24pOworICBtQ2FtZXJhLnNldEZyYW1lKGN1cnJlbnRGcmFtZSk7CisKKyAgdXBkYXRlR0woKTsKK30KKwordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50ICogZSkKK3sKKyAgICBzd2l0Y2goZS0+a2V5KCkpCisgICAgeworICAgICAgY2FzZSBRdDo6S2V5X1VwOgorICAgICAgICBtQ2FtZXJhLnpvb20oMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBRdDo6S2V5X0Rvd246CisgICAgICAgIG1DYW1lcmEuem9vbSgtMik7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gYWRkIGEgZnJhbWUKKyAgICAgIGNhc2UgUXQ6OktleV9HOgorICAgICAgICBncmFiRnJhbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBjbGVhciB0aGUgdGltZSBsaW5lCisgICAgICBjYXNlIFF0OjpLZXlfQzoKKyAgICAgICAgbV90aW1lbGluZS5jbGVhcigpOworICAgICAgICBicmVhazsKKyAgICAgIC8vIG1vdmUgdGhlIGNhbWVyYSB0byBpbml0aWFsIHBvcworICAgICAgY2FzZSBRdDo6S2V5X1I6CisgICAgICAgIHJlc2V0Q2FtZXJhKCk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gc3RhcnQvc3RvcCB0aGUgYW5pbWF0aW9uCisgICAgICBjYXNlIFF0OjpLZXlfQToKKyAgICAgICAgaWYgKG1BbmltYXRlKQorICAgICAgICB7CisgICAgICAgICAgc3RvcEFuaW1hdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1fYWxwaGEgPSAwOworICAgICAgICAgIGNvbm5lY3QoJm1fdGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGFuaW1hdGUoKSkpOworICAgICAgICAgIG1fdGltZXIuc3RhcnQoMTAwMC8zMCk7CisgICAgICAgICAgbUFuaW1hdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdXBkYXRlR0woKTsKK30KKwordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnN0b3BBbmltYXRpb24oKQoreworICBkaXNjb25uZWN0KCZtX3RpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVChhbmltYXRlKCkpKTsKKyAgbV90aW1lci5zdG9wKCk7CisgIG1BbmltYXRlID0gZmFsc2U7CisgIG1fYWxwaGEgPSAwOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworICBtTW91c2VDb29yZHMgPSBWZWN0b3IyaShlLT5wb3MoKS54KCksIGUtPnBvcygpLnkoKSk7CisgIGJvb2wgZmx5ID0gKG1OYXZNb2RlPT1OYXZGbHkpIHx8IChlLT5tb2RpZmllcnMoKSZRdDo6Q29udHJvbE1vZGlmaWVyKTsKKyAgc3dpdGNoKGUtPmJ1dHRvbigpKQorICB7CisgICAgY2FzZSBRdDo6TGVmdEJ1dHRvbjoKKyAgICAgIGlmKGZseSkKKyAgICAgIHsKKyAgICAgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9MT0NBTF9ST1RBVEU7CisgICAgICAgIG1UcmFja2JhbGwuc3RhcnQoVHJhY2tiYWxsOjpMb2NhbCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fUk9UQVRFX0FST1VORDsKKyAgICAgICAgbVRyYWNrYmFsbC5zdGFydChUcmFja2JhbGw6OkFyb3VuZCk7CisgICAgICB9CisgICAgICBtVHJhY2tiYWxsLnRyYWNrKG1Nb3VzZUNvb3Jkcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFF0OjpNaWRCdXR0b246CisgICAgICBpZihmbHkpCisgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fRkxZX1o7CisgICAgICBlbHNlCisgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fWk9PTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUXQ6OlJpZ2h0QnV0dG9uOgorICAgICAgICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX0ZMWV9QQU47CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCopCit7CisgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9OT19UUkFDSzsKKyAgICB1cGRhdGVHTCgpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6bW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisgICAgLy8gdHJhY2tpbmcKKyAgICBpZihtQ3VycmVudFRyYWNraW5nTW9kZSAhPSBUTV9OT19UUkFDSykKKyAgICB7CisgICAgICAgIGZsb2F0IGR4ID0gICBmbG9hdChlLT54KCkgLSBtTW91c2VDb29yZHMueCgpKSAvIGZsb2F0KG1DYW1lcmEudnBXaWR0aCgpKTsKKyAgICAgICAgZmxvYXQgZHkgPSAtIGZsb2F0KGUtPnkoKSAtIG1Nb3VzZUNvb3Jkcy55KCkpIC8gZmxvYXQobUNhbWVyYS52cEhlaWdodCgpKTsKKworICAgICAgICAvLyBzcGVlZHVwIHRoZSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgICAgaWYoZS0+bW9kaWZpZXJzKCkgJiBRdDo6U2hpZnRNb2RpZmllcikKKyAgICAgICAgeworICAgICAgICAgIGR4ICo9IDEwLjsKKyAgICAgICAgICBkeSAqPSAxMC47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gobUN1cnJlbnRUcmFja2luZ01vZGUpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFRNX1JPVEFURV9BUk9VTkQ6CisgICAgICAgICAgY2FzZSBUTV9MT0NBTF9ST1RBVEU6CisgICAgICAgICAgICBpZiAobVJvdGF0aW9uTW9kZT09Um90YXRpb25TdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RhYmxlIHRyYWNrYmFsbCBpbXBsZW1lbnRhdGlvbiBtYXBwaW5nCisgICAgICAgICAgICAgIC8vIHRoZSAyRCBjb29yZGluYXRlcyB0byAzRCBwb2ludHMgb24gYSBzcGhlcmUuCisgICAgICAgICAgICAgIG1UcmFja2JhbGwudHJhY2soVmVjdG9yMmkoZS0+cG9zKCkueCgpLCBlLT5wb3MoKS55KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gc3RhbmRhcmQgYXBwcm9hY2ggbWFwcGluZyB0aGUgeCBhbmQgeSBkaXNwbGFjZW1lbnRzIGFzIHJvdGF0aW9ucworICAgICAgICAgICAgICAvLyBhcm91bmQgdGhlIGNhbWVyYSdzIFggYW5kIFkgYXhlcy4KKyAgICAgICAgICAgICAgUXVhdGVybmlvbmYgcSA9IEFuZ2xlQXhpc2YoIGR4Kk1fUEksIFZlY3RvcjNmOjpVbml0WSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQW5nbGVBeGlzZigtZHkqTV9QSSwgVmVjdG9yM2Y6OlVuaXRYKCkpOworICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja2luZ01vZGU9PVRNX0xPQ0FMX1JPVEFURSkKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLmxvY2FsUm90YXRlKHEpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVBcm91bmRUYXJnZXQocSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRNX1pPT00gOgorICAgICAgICAgICAgbUNhbWVyYS56b29tKGR5KjEwMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRNX0ZMWV9aIDoKKyAgICAgICAgICAgIG1DYW1lcmEubG9jYWxUcmFuc2xhdGUoVmVjdG9yM2YoMCwgMCwgLWR5KjIwMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTV9GTFlfUEFOIDoKKyAgICAgICAgICAgIG1DYW1lcmEubG9jYWxUcmFuc2xhdGUoVmVjdG9yM2YoZHgqMjAwLCBkeSoyMDAsIDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZUdMKCk7CisgICAgfQorCisgICAgbU1vdXNlQ29vcmRzID0gVmVjdG9yMmkoZS0+cG9zKCkueCgpLCBlLT5wb3MoKS55KCkpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6cGFpbnRHTCgpCit7CisgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSyxHTF9GSUxMKTsKKyAgZ2xEaXNhYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKKyAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgZ2xEaXNhYmxlKEdMX0FMUEhBX1RFU1QpOworICBnbERpc2FibGUoR0xfVEVYVFVSRV8xRCk7CisgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfM0QpOworCisgIC8vIENsZWFyIGJ1ZmZlcnMKKyAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgbUNhbWVyYS5hY3RpdmF0ZUdMKCk7CisKKyAgZHJhd1NjZW5lKCk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojppbml0aWFsaXplR0woKQoreworICBnbENsZWFyQ29sb3IoMS4sIDEuLCAxLiwgMC4pOworICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgMSk7CisgIGdsRGVwdGhNYXNrKEdMX1RSVUUpOworICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKKworICBtQ2FtZXJhLnNldFBvc2l0aW9uKFZlY3RvcjNmKC0yMDAsIC0yMDAsIC0yMDApKTsKKyAgbUNhbWVyYS5zZXRUYXJnZXQoVmVjdG9yM2YoMCwgMCwgMCkpOworICBtSW5pdEZyYW1lLm9yaWVudGF0aW9uID0gbUNhbWVyYS5vcmllbnRhdGlvbigpLmludmVyc2UoKTsKKyAgbUluaXRGcmFtZS5wb3NpdGlvbiA9IG1DYW1lcmEudmlld01hdHJpeCgpLnRyYW5zbGF0aW9uKCk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpyZXNpemVHTChpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgbUNhbWVyYS5zZXRWaWV3cG9ydCh3aWR0aCxoZWlnaHQpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6c2V0TmF2TW9kZShpbnQgbSkKK3sKKyAgbU5hdk1vZGUgPSBOYXZNb2RlKG0pOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6c2V0TGVycE1vZGUoaW50IG0pCit7CisgIG1MZXJwTW9kZSA9IExlcnBNb2RlKG0pOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6c2V0Um90YXRpb25Nb2RlKGludCBtKQoreworICBtUm90YXRpb25Nb2RlID0gUm90YXRpb25Nb2RlKG0pOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6cmVzZXRDYW1lcmEoKQoreworICBpZiAobUFuaW1hdGUpCisgICAgc3RvcEFuaW1hdGlvbigpOworICBtX3RpbWVsaW5lLmNsZWFyKCk7CisgIEZyYW1lIGF1eDAgPSBtQ2FtZXJhLmZyYW1lKCk7CisgIGF1eDAub3JpZW50YXRpb24gPSBhdXgwLm9yaWVudGF0aW9uLmludmVyc2UoKTsKKyAgYXV4MC5wb3NpdGlvbiA9IG1DYW1lcmEudmlld01hdHJpeCgpLnRyYW5zbGF0aW9uKCk7CisgIG1fdGltZWxpbmVbMF0gPSBhdXgwOworCisgIFZlY3RvcjNmIGN1cnJlbnRUYXJnZXQgPSBtQ2FtZXJhLnRhcmdldCgpOworICBtQ2FtZXJhLnNldFRhcmdldChWZWN0b3IzZjo6WmVybygpKTsKKworICAvLyBjb21wdXRlIHRoZSByb3RhdGlvbiBkdXJhdGlvbiB0byBtb3ZlIHRoZSBjYW1lcmEgdG8gdGhlIHRhcmdldAorICBGcmFtZSBhdXgxID0gbUNhbWVyYS5mcmFtZSgpOworICBhdXgxLm9yaWVudGF0aW9uID0gYXV4MS5vcmllbnRhdGlvbi5pbnZlcnNlKCk7CisgIGF1eDEucG9zaXRpb24gPSBtQ2FtZXJhLnZpZXdNYXRyaXgoKS50cmFuc2xhdGlvbigpOworICBmbG9hdCBkdXJhdGlvbiA9IGF1eDAub3JpZW50YXRpb24uYW5ndWxhckRpc3RhbmNlKGF1eDEub3JpZW50YXRpb24pICogMC45OworICBpZiAoZHVyYXRpb248MC4xKSBkdXJhdGlvbiA9IDAuMTsKKworICAvLyBwdXQgdGhlIGNhbWVyYSBhdCB0aGF0IHRpbWUgc3RlcDoKKyAgYXV4MSA9IGF1eDAubGVycChkdXJhdGlvbi8yLG1Jbml0RnJhbWUpOworICAvLyBhbmQgbWFrZSBpdCBsb29rIGF0IHRoZSB0YXJnZXQgYWdhaW4KKyAgYXV4MS5vcmllbnRhdGlvbiA9IGF1eDEub3JpZW50YXRpb24uaW52ZXJzZSgpOworICBhdXgxLnBvc2l0aW9uID0gLSAoYXV4MS5vcmllbnRhdGlvbiAqIGF1eDEucG9zaXRpb24pOworICBtQ2FtZXJhLnNldEZyYW1lKGF1eDEpOworICBtQ2FtZXJhLnNldFRhcmdldChWZWN0b3IzZjo6WmVybygpKTsKKworICAvLyBhZGQgdGhpcyBjYW1lcmEga2V5ZnJhbWUKKyAgYXV4MS5vcmllbnRhdGlvbiA9IGF1eDEub3JpZW50YXRpb24uaW52ZXJzZSgpOworICBhdXgxLnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKKyAgbV90aW1lbGluZVtkdXJhdGlvbl0gPSBhdXgxOworCisgIG1fdGltZWxpbmVbMl0gPSBtSW5pdEZyYW1lOworICBtX2FscGhhID0gMDsKKyAgYW5pbWF0ZSgpOworICBjb25uZWN0KCZtX3RpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVChhbmltYXRlKCkpKTsKKyAgbV90aW1lci5zdGFydCgxMDAwLzMwKTsKKyAgbUFuaW1hdGUgPSB0cnVlOworfQorCitRV2lkZ2V0KiBSZW5kZXJpbmdXaWRnZXQ6OmNyZWF0ZU5hdmlnYXRpb25Db250cm9sV2lkZ2V0KCkKK3sKKyAgUVdpZGdldCogcGFuZWwgPSBuZXcgUVdpZGdldCgpOworICBRVkJveExheW91dCogbGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0KCk7CisKKyAgeworICAgIFFQdXNoQnV0dG9uKiBidXQgPSBuZXcgUVB1c2hCdXR0b24oInJlc2V0Iik7CisgICAgYnV0LT5zZXRUb29sVGlwKCJtb3ZlIHRoZSBjYW1lcmEgdG8gaW5pdGlhbCBwb3NpdGlvbiAod2l0aCBhbmltYXRpb24pIik7CisgICAgbGF5b3V0LT5hZGRXaWRnZXQoYnV0KTsKKyAgICBjb25uZWN0KGJ1dCwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1QocmVzZXRDYW1lcmEoKSkpOworICB9CisgIHsKKyAgICAvLyBuYXZpZ2F0aW9uIG1vZGUKKyAgICBRR3JvdXBCb3gqIGJveCA9IG5ldyBRR3JvdXBCb3goIm5hdmlnYXRpb24gbW9kZSIpOworICAgIFFWQm94TGF5b3V0KiBib3hMYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQ7CisgICAgUUJ1dHRvbkdyb3VwKiBncm91cCA9IG5ldyBRQnV0dG9uR3JvdXAocGFuZWwpOworICAgIFFSYWRpb0J1dHRvbiogYnV0OworICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oInR1cm4gYXJvdW5kIik7CisgICAgYnV0LT5zZXRUb29sVGlwKCJsb29rIGFyb3VuZCBhbiBvYmplY3QiKTsKKyAgICBncm91cC0+YWRkQnV0dG9uKGJ1dCwgTmF2VHVybkFyb3VuZCk7CisgICAgYm94TGF5b3V0LT5hZGRXaWRnZXQoYnV0KTsKKyAgICBidXQgPSBuZXcgUVJhZGlvQnV0dG9uKCJmbHkiKTsKKyAgICBidXQtPnNldFRvb2xUaXAoImZyZWUgbmF2aWdhdGlvbiBsaWtlIGEgc3BhY2VzaGlwXG4odGhpcyBtb2RlIGNhbiBhbHNvIGJlIGVuYWJsZWQgcHJlc3NpbmcgdGhlIFwic2hpZnRcIiBrZXkpIik7CisgICAgZ3JvdXAtPmFkZEJ1dHRvbihidXQsIE5hdkZseSk7CisgICAgYm94TGF5b3V0LT5hZGRXaWRnZXQoYnV0KTsKKyAgICBncm91cC0+YnV0dG9uKG1OYXZNb2RlKS0+c2V0Q2hlY2tlZCh0cnVlKTsKKyAgICBjb25uZWN0KGdyb3VwLCBTSUdOQUwoYnV0dG9uQ2xpY2tlZChpbnQpKSwgdGhpcywgU0xPVChzZXROYXZNb2RlKGludCkpKTsKKyAgICBib3gtPnNldExheW91dChib3hMYXlvdXQpOworICAgIGxheW91dC0+YWRkV2lkZ2V0KGJveCk7CisgIH0KKyAgeworICAgIC8vIHRyYWNrIGJhbGwsIHJvdGF0aW9uIG1vZGUKKyAgICBRR3JvdXBCb3gqIGJveCA9IG5ldyBRR3JvdXBCb3goInJvdGF0aW9uIG1vZGUiKTsKKyAgICBRVkJveExheW91dCogYm94TGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0OworICAgIFFCdXR0b25Hcm91cCogZ3JvdXAgPSBuZXcgUUJ1dHRvbkdyb3VwKHBhbmVsKTsKKyAgICBRUmFkaW9CdXR0b24qIGJ1dDsKKyAgICBidXQgPSBuZXcgUVJhZGlvQnV0dG9uKCJzdGFibGUgdHJhY2tiYWxsIik7CisgICAgZ3JvdXAtPmFkZEJ1dHRvbihidXQsIFJvdGF0aW9uU3RhYmxlKTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgidXNlIHRoZSBzdGFibGUgdHJhY2tiYWxsIGltcGxlbWVudGF0aW9uIG1hcHBpbmdcbnRoZSAyRCBjb29yZGluYXRlcyB0byAzRCBwb2ludHMgb24gYSBzcGhlcmUiKTsKKyAgICBidXQgPSBuZXcgUVJhZGlvQnV0dG9uKCJzdGFuZGFyZCByb3RhdGlvbiIpOworICAgIGdyb3VwLT5hZGRCdXR0b24oYnV0LCBSb3RhdGlvblN0YW5kYXJkKTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgic3RhbmRhcmQgYXBwcm9hY2ggbWFwcGluZyB0aGUgeCBhbmQgeSBkaXNwbGFjZW1lbnRzXG5hcyByb3RhdGlvbnMgYXJvdW5kIHRoZSBjYW1lcmEncyBYIGFuZCBZIGF4ZXMiKTsKKyAgICBncm91cC0+YnV0dG9uKG1Sb3RhdGlvbk1vZGUpLT5zZXRDaGVja2VkKHRydWUpOworICAgIGNvbm5lY3QoZ3JvdXAsIFNJR05BTChidXR0b25DbGlja2VkKGludCkpLCB0aGlzLCBTTE9UKHNldFJvdGF0aW9uTW9kZShpbnQpKSk7CisgICAgYm94LT5zZXRMYXlvdXQoYm94TGF5b3V0KTsKKyAgICBsYXlvdXQtPmFkZFdpZGdldChib3gpOworICB9CisgIHsKKyAgICAvLyBpbnRlcnBvbGF0aW9uIG1vZGUKKyAgICBRR3JvdXBCb3gqIGJveCA9IG5ldyBRR3JvdXBCb3goInNwaGVyaWNhbCBpbnRlcnBvbGF0aW9uIik7CisgICAgUVZCb3hMYXlvdXQqIGJveExheW91dCA9IG5ldyBRVkJveExheW91dDsKKyAgICBRQnV0dG9uR3JvdXAqIGdyb3VwID0gbmV3IFFCdXR0b25Hcm91cChwYW5lbCk7CisgICAgUVJhZGlvQnV0dG9uKiBidXQ7CisgICAgYnV0ID0gbmV3IFFSYWRpb0J1dHRvbigicXVhdGVybmlvbiBzbGVycCIpOworICAgIGdyb3VwLT5hZGRCdXR0b24oYnV0LCBMZXJwUXVhdGVybmlvbik7CisgICAgYm94TGF5b3V0LT5hZGRXaWRnZXQoYnV0KTsKKyAgICBidXQtPnNldFRvb2xUaXAoInVzZSBxdWF0ZXJuaW9uIHNwaGVyaWNhbCBpbnRlcnBvbGF0aW9uXG50byBpbnRlcnBvbGF0ZSBvcmllbnRhdGlvbnMiKTsKKyAgICBidXQgPSBuZXcgUVJhZGlvQnV0dG9uKCJldWxlciBhbmdsZXMiKTsKKyAgICBncm91cC0+YWRkQnV0dG9uKGJ1dCwgTGVycEV1bGVyQW5nbGVzKTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgidXNlIEV1bGVyIGFuZ2xlcyB0byBpbnRlcnBvbGF0ZSBvcmllbnRhdGlvbnMiKTsKKyAgICBncm91cC0+YnV0dG9uKG1OYXZNb2RlKS0+c2V0Q2hlY2tlZCh0cnVlKTsKKyAgICBjb25uZWN0KGdyb3VwLCBTSUdOQUwoYnV0dG9uQ2xpY2tlZChpbnQpKSwgdGhpcywgU0xPVChzZXRMZXJwTW9kZShpbnQpKSk7CisgICAgYm94LT5zZXRMYXlvdXQoYm94TGF5b3V0KTsKKyAgICBsYXlvdXQtPmFkZFdpZGdldChib3gpOworICB9CisgIGxheW91dC0+YWRkSXRlbShuZXcgUVNwYWNlckl0ZW0oMCwwLFFTaXplUG9saWN5OjpNaW5pbXVtLFFTaXplUG9saWN5OjpFeHBhbmRpbmcpKTsKKyAgcGFuZWwtPnNldExheW91dChsYXlvdXQpOworICByZXR1cm4gcGFuZWw7Cit9CisKK1F1YXRlcm5pb25EZW1vOjpRdWF0ZXJuaW9uRGVtbygpCit7CisgIG1SZW5kZXJpbmdXaWRnZXQgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0KCk7CisgIHNldENlbnRyYWxXaWRnZXQobVJlbmRlcmluZ1dpZGdldCk7CisKKyAgUURvY2tXaWRnZXQqIHBhbmVsID0gbmV3IFFEb2NrV2lkZ2V0KCJuYXZpZ2F0aW9uIiwgdGhpcyk7CisgIHBhbmVsLT5zZXRBbGxvd2VkQXJlYXMoKFFGbGFnczxRdDo6RG9ja1dpZGdldEFyZWE+KShRdDo6UmlnaHREb2NrV2lkZ2V0QXJlYSB8IFF0OjpMZWZ0RG9ja1dpZGdldEFyZWEpKTsKKyAgYWRkRG9ja1dpZGdldChRdDo6UmlnaHREb2NrV2lkZ2V0QXJlYSwgcGFuZWwpOworICBwYW5lbC0+c2V0V2lkZ2V0KG1SZW5kZXJpbmdXaWRnZXQtPmNyZWF0ZU5hdmlnYXRpb25Db250cm9sV2lkZ2V0KCkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBzdGQ6OmNvdXQgPDwgIk5hdmlnYXRpb246XG4iOworICBzdGQ6OmNvdXQgPDwgIiAgbGVmdCBidXR0b246ICAgICAgICAgICByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXRcbiI7CisgIHN0ZDo6Y291dCA8PCAiICBtaWRkbGUgYnV0dG9uOiAgICAgICAgIHpvb21cbiI7CisgIHN0ZDo6Y291dCA8PCAiICBsZWZ0IGJ1dHRvbiArIGN0cmwgICAgIHF1YWtlIHJvdGF0ZSAocm90YXRlIGFyb3VuZCBjYW1lcmEgcG9zaXRpb24pXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgbWlkZGxlIGJ1dHRvbiArIGN0cmwgICB3YWxrIChwcm9ncmVzcyBhbG9uZyBjYW1lcmEncyB6IGRpcmVjdGlvbilcbiI7CisgIHN0ZDo6Y291dCA8PCAiICBsZWZ0IGJ1dHRvbjogICAgICAgICAgIHBhbiAodHJhbnNsYXRlIGluIHRoZSBYWSBjYW1lcmEncyBwbGFuZSlcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJSIDogbW92ZSB0aGUgY2FtZXJhIHRvIGluaXRpYWwgcG9zaXRpb25cbiI7CisgIHN0ZDo6Y291dCA8PCAiQSA6IHN0YXJ0L3N0b3AgYW5pbWF0aW9uXG4iOworICBzdGQ6OmNvdXQgPDwgIkMgOiBjbGVhciB0aGUgYW5pbWF0aW9uXG4iOworICBzdGQ6OmNvdXQgPDwgIkcgOiBhZGQgYSBrZXkgZnJhbWVcbiI7CisKKyAgUUFwcGxpY2F0aW9uIGFwcChhcmdjLCBhcmd2KTsKKyAgUXVhdGVybmlvbkRlbW8gZGVtbzsKKyAgZGVtby5yZXNpemUoNjAwLDUwMCk7CisgIGRlbW8uc2hvdygpOworICByZXR1cm4gYXBwLmV4ZWMoKTsKK30KKworI2luY2x1ZGUgInF1YXRlcm5pb25fZGVtby5tb2MiCisKZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9xdWF0ZXJuaW9uX2RlbW8uaCBiL2RlbW9zL29wZW5nbC9xdWF0ZXJuaW9uX2RlbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmZmNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUVVBVEVSTklPTl9ERU1PX0gKKyNkZWZpbmUgRUlHRU5fUVVBVEVSTklPTl9ERU1PX0gKKworI2luY2x1ZGUgImdwdWhlbHBlci5oIgorI2luY2x1ZGUgImNhbWVyYS5oIgorI2luY2x1ZGUgInRyYWNrYmFsbC5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxRVGltZXI+CisjaW5jbHVkZSA8UXRHdWkvUUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFF0T3BlbkdML1FHTFdpZGdldD4KKyNpbmNsdWRlIDxRdEd1aS9RTWFpbldpbmRvdz4KKworY2xhc3MgUmVuZGVyaW5nV2lkZ2V0IDogcHVibGljIFFHTFdpZGdldAoreworICBRX09CSkVDVAorCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxmbG9hdCxGcmFtZT4gVGltZUxpbmU7CisgICAgVGltZUxpbmUgbV90aW1lbGluZTsKKyAgICBGcmFtZSBsZXJwRnJhbWUoZmxvYXQgdCk7CisKKyAgICBGcmFtZSBtSW5pdEZyYW1lOworICAgIGJvb2wgbUFuaW1hdGU7CisgICAgZmxvYXQgbV9hbHBoYTsKKworICAgIGVudW0gVHJhY2tNb2RlIHsKKyAgICAgIFRNX05PX1RSQUNLPTAsIFRNX1JPVEFURV9BUk9VTkQsIFRNX1pPT00sCisgICAgICBUTV9MT0NBTF9ST1RBVEUsIFRNX0ZMWV9aLCBUTV9GTFlfUEFOCisgICAgfTsKKworICAgIGVudW0gTmF2TW9kZSB7CisgICAgICBOYXZUdXJuQXJvdW5kLAorICAgICAgTmF2Rmx5CisgICAgfTsKKworICAgIGVudW0gTGVycE1vZGUgeworICAgICAgTGVycFF1YXRlcm5pb24sCisgICAgICBMZXJwRXVsZXJBbmdsZXMKKyAgICB9OworCisgICAgZW51bSBSb3RhdGlvbk1vZGUgeworICAgICAgUm90YXRpb25TdGFibGUsCisgICAgICBSb3RhdGlvblN0YW5kYXJkCisgICAgfTsKKworICAgIENhbWVyYSBtQ2FtZXJhOworICAgIFRyYWNrTW9kZSBtQ3VycmVudFRyYWNraW5nTW9kZTsKKyAgICBOYXZNb2RlIG1OYXZNb2RlOworICAgIExlcnBNb2RlIG1MZXJwTW9kZTsKKyAgICBSb3RhdGlvbk1vZGUgbVJvdGF0aW9uTW9kZTsKKyAgICBWZWN0b3IyaSBtTW91c2VDb29yZHM7CisgICAgVHJhY2tiYWxsIG1UcmFja2JhbGw7CisKKyAgICBRVGltZXIgbV90aW1lcjsKKworICAgIHZvaWQgc2V0dXBDYW1lcmEoKTsKKworICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjNmPiBtVmVydGljZXM7CisgICAgc3RkOjp2ZWN0b3I8VmVjdG9yM2Y+IG1Ob3JtYWxzOworICAgIHN0ZDo6dmVjdG9yPGludD4gbUluZGljZXM7CisKKyAgcHJvdGVjdGVkIHNsb3RzOgorCisgICAgdmlydHVhbCB2b2lkIGFuaW1hdGUodm9pZCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdTY2VuZSh2b2lkKTsKKworICAgIHZpcnR1YWwgdm9pZCBncmFiRnJhbWUodm9pZCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BBbmltYXRpb24oKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROYXZNb2RlKGludCk7CisgICAgdmlydHVhbCB2b2lkIHNldExlcnBNb2RlKGludCk7CisgICAgdmlydHVhbCB2b2lkIHNldFJvdGF0aW9uTW9kZShpbnQpOworICAgIHZpcnR1YWwgdm9pZCByZXNldENhbWVyYSgpOworCisgIHByb3RlY3RlZDoKKworICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplR0woKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplR0woaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRHTCgpOworICAgIAorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICogZSk7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICogZSk7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICogZSk7CisgICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50ICogZSk7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHB1YmxpYzogCisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICAgIAorICAgIFJlbmRlcmluZ1dpZGdldCgpOworICAgIH5SZW5kZXJpbmdXaWRnZXQoKSB7IH0KKworICAgIFFXaWRnZXQqIGNyZWF0ZU5hdmlnYXRpb25Db250cm9sV2lkZ2V0KCk7Cit9OworCitjbGFzcyBRdWF0ZXJuaW9uRGVtbyA6IHB1YmxpYyBRTWFpbldpbmRvdworeworICBRX09CSkVDVAorICBwdWJsaWM6CisgICAgUXVhdGVybmlvbkRlbW8oKTsKKyAgcHJvdGVjdGVkOgorICAgIFJlbmRlcmluZ1dpZGdldCogbVJlbmRlcmluZ1dpZGdldDsKK307CisKKyNlbmRpZiAvLyBFSUdFTl9RVUFURVJOSU9OX0RFTU9fSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5jcHAgYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJkYThlCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5jcHAKQEAgLTAsMCArMSw1OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAidHJhY2tiYWxsLmgiCisjaW5jbHVkZSAiY2FtZXJhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBUcmFja2JhbGw6OnRyYWNrKGNvbnN0IFZlY3RvcjJpJiBwb2ludDJEKQoreworICBpZiAobXBDYW1lcmE9PTApCisgICAgcmV0dXJuOworICBWZWN0b3IzZiBuZXdQb2ludDNEOworICBib29sIG5ld1BvaW50T2sgPSBtYXBUb1NwaGVyZShwb2ludDJELCBuZXdQb2ludDNEKTsKKworICBpZiAobUxhc3RQb2ludE9rICYmIG5ld1BvaW50T2spCisgIHsKKyAgICBWZWN0b3IzZiBheGlzID0gbUxhc3RQb2ludDNELmNyb3NzKG5ld1BvaW50M0QpLm5vcm1hbGl6ZWQoKTsKKyAgICBmbG9hdCBjb3NfYW5nbGUgPSBtTGFzdFBvaW50M0QuZG90KG5ld1BvaW50M0QpOworICAgIGlmICggc3RkOjphYnMoY29zX2FuZ2xlKSA8IDEuMCApCisgICAgeworICAgICAgZmxvYXQgYW5nbGUgPSAyLiAqIGFjb3MoY29zX2FuZ2xlKTsKKyAgICAgIGlmIChtTW9kZT09QXJvdW5kKQorICAgICAgICBtcENhbWVyYS0+cm90YXRlQXJvdW5kVGFyZ2V0KFF1YXRlcm5pb25mKEFuZ2xlQXhpc2YoYW5nbGUsIGF4aXMpKSk7CisgICAgICBlbHNlCisgICAgICAgIG1wQ2FtZXJhLT5sb2NhbFJvdGF0ZShRdWF0ZXJuaW9uZihBbmdsZUF4aXNmKC1hbmdsZSwgYXhpcykpKTsKKyAgICB9CisgIH0KKworICBtTGFzdFBvaW50M0QgPSBuZXdQb2ludDNEOworICBtTGFzdFBvaW50T2sgPSBuZXdQb2ludE9rOworfQorCitib29sIFRyYWNrYmFsbDo6bWFwVG9TcGhlcmUoY29uc3QgVmVjdG9yMmkmIHAyLCBWZWN0b3IzZiYgdjMpCit7CisgIGlmICgocDIueCgpID49IDApICYmIChwMi54KCkgPD0gaW50KG1wQ2FtZXJhLT52cFdpZHRoKCkpKSAmJgorICAgICAgKHAyLnkoKSA+PSAwKSAmJiAocDIueSgpIDw9IGludChtcENhbWVyYS0+dnBIZWlnaHQoKSkpICkKKyAgeworICAgIGRvdWJsZSB4ICA9IChkb3VibGUpKHAyLngoKSAtIDAuNSptcENhbWVyYS0+dnBXaWR0aCgpKSAgLyAoZG91YmxlKW1wQ2FtZXJhLT52cFdpZHRoKCk7CisgICAgZG91YmxlIHkgID0gKGRvdWJsZSkoMC41Km1wQ2FtZXJhLT52cEhlaWdodCgpIC0gcDIueSgpKSAvIChkb3VibGUpbXBDYW1lcmEtPnZwSGVpZ2h0KCk7CisgICAgZG91YmxlIHNpbnggICAgICAgICA9IHNpbihNX1BJICogeCAqIDAuNSk7CisgICAgZG91YmxlIHNpbnkgICAgICAgICA9IHNpbihNX1BJICogeSAqIDAuNSk7CisgICAgZG91YmxlIHNpbngyc2lueTIgICA9IHNpbnggKiBzaW54ICsgc2lueSAqIHNpbnk7CisKKyAgICB2My54KCkgPSBzaW54OworICAgIHYzLnkoKSA9IHNpbnk7CisgICAgdjMueigpID0gc2lueDJzaW55MiA8IDEuMCA/IHNxcnQoMS4wIC0gc2lueDJzaW55MikgOiAwLjA7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5oIGIvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTg0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSQUNLQkFMTF9ICisjZGVmaW5lIEVJR0VOX1RSQUNLQkFMTF9ICisKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworY2xhc3MgQ2FtZXJhOworCitjbGFzcyBUcmFja2JhbGwKK3sKKyAgcHVibGljOgorCisgICAgZW51bSBNb2RlIHtBcm91bmQsIExvY2FsfTsKKworICAgIFRyYWNrYmFsbCgpIDogbXBDYW1lcmEoMCkge30KKworICAgIHZvaWQgc3RhcnQoTW9kZSBtID0gQXJvdW5kKSB7IG1Nb2RlID0gbTsgbUxhc3RQb2ludE9rID0gZmFsc2U7IH0KKworICAgIHZvaWQgc2V0Q2FtZXJhKENhbWVyYSogcENhbSkgeyBtcENhbWVyYSA9IHBDYW07IH0KKworICAgIHZvaWQgdHJhY2soY29uc3QgRWlnZW46OlZlY3RvcjJpJiBuZXdQb2ludDJEKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICBib29sIG1hcFRvU3BoZXJlKCBjb25zdCBFaWdlbjo6VmVjdG9yMmkmIHAyLCBFaWdlbjo6VmVjdG9yM2YmIHYzKTsKKworICAgIENhbWVyYSogbXBDYW1lcmE7CisgICAgRWlnZW46OlZlY3RvcjNmIG1MYXN0UG9pbnQzRDsKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbUxhc3RQb2ludE9rOworCit9OworCisjZW5kaWYgLy8gRUlHRU5fVFJBQ0tCQUxMX0gKZGlmZiAtLWdpdCBhL2RvYy9BMDVfUG9ydGluZ0Zyb20yVG8zLmRveCBiL2RvYy9BMDVfUG9ydGluZ0Zyb20yVG8zLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU1NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0EwNV9Qb3J0aW5nRnJvbTJUbzMuZG94CkBAIC0wLDAgKzEsMjk5IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgRWlnZW4yVG9FaWdlbjMgUG9ydGluZyBmcm9tIEVpZ2VuMiB0byBFaWdlbjMKKworVGhpcyBwYWdlIGxpc3RzIHRoZSBtb3N0IGltcG9ydGFudCBBUEkgY2hhbmdlcyBiZXR3ZWVuIEVpZ2VuMiBhbmQgRWlnZW4zLAorYW5kIGdpdmVzIHRpcHMgdG8gaGVscCBwb3J0aW5nIHlvdXIgYXBwbGljYXRpb24gZnJvbSBFaWdlbjIgdG8gRWlnZW4zLgorCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIENvbXBhdGliaWxpdHlTdXBwb3J0IEVpZ2VuMiBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKworVXAgdG8gdmVyc2lvbiAzLjIgJUVpZ2VuIHByb3ZpZGVzIDxhIGhyZWY9Imh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2RveC0zLjIvRWlnZW4yU3VwcG9ydE1vZGVzLmh0bWwiPkVpZ2VuMiBzdXBwb3J0IG1vZGVzPC9hPi4gVGhlc2UgYXJlIHJlbW92ZWQgbm93LCBiZWNhdXNlIHRoZXkgd2VyZSBiYXJlbHkgdXNlZCBhbnltb3JlIGFuZCBiZWNhbWUgaGFyZCB0byBtYWludGFpbiBhZnRlciBpbnRlcm5hbCByZS1kZXNpZ25zLgorWW91IGNhbiBzdGlsbCB1c2UgdGhlbSBieSBmaXJzdCA8YSBocmVmPSJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9kb3gtMy4yL0VpZ2VuMlRvRWlnZW4zLmh0bWwiPnBvcnRpbmcgeW91ciBjb2RlIHRvIEVpZ2VuIDMuMjwvYT4uCisKK1xzZWN0aW9uIFVzaW5nIFRoZSBVU0lOR19QQVJUX09GX05BTUVTUEFDRV9FSUdFTiBtYWNybworCitUaGUgVVNJTkdfUEFSVF9PRl9OQU1FU1BBQ0VfRUlHRU4gbWFjcm8gaGFzIGJlZW4gcmVtb3ZlZC4gSW4gRWlnZW4gMywganVzdCBkbzoKK1xjb2RlCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CitcZW5kY29kZQorCitcc2VjdGlvbiBDb21wbGV4RG90IERvdCBwcm9kdWN0cyBvdmVyIGNvbXBsZXggbnVtYmVycworCitUaGlzIGlzIHRoZSBzaW5nbGUgdHJpY2tpZXN0IGNoYW5nZSBiZXR3ZWVuIEVpZ2VuIDIgYW5kIEVpZ2VuIDMuIEl0IG9ubHkgYWZmZWN0cyBjb2RlIHVzaW5nIFxjIHN0ZDo6Y29tcGxleCBudW1iZXJzIGFzIHNjYWxhciB0eXBlLgorCitFaWdlbiAyJ3MgZG90IHByb2R1Y3Qgd2FzIGxpbmVhciBpbiB0aGUgZmlyc3QgdmFyaWFibGUuIEVpZ2VuIDMncyBkb3QgcHJvZHVjdCBpcyBsaW5lYXIgaW4gdGhlIHNlY29uZCB2YXJpYWJsZS4gSW4gb3RoZXIgd29yZHMsIHRoZSBFaWdlbiAyIGNvZGUgXGNvZGUgeC5kb3QoeSkgXGVuZGNvZGUgaXMgZXF1aXZhbGVudCB0byB0aGUgRWlnZW4gMyBjb2RlIFxjb2RlIHkuZG90KHgpIFxlbmRjb2RlIEluIHlldCBvdGhlciB3b3JkcywgZG90IHByb2R1Y3RzIGFyZSBjb21wbGV4LWNvbmp1Z2F0ZWQgaW4gRWlnZW4gMyBjb21wYXJlZCB0byBFaWdlbiAyLiBUaGUgc3dpdGNoIHRvIHRoZSBuZXcgY29udmVudGlvbiB3YXMgY29tbWFuZGVkIGJ5IGNvbW1vbiB1c2FnZSwgZXNwZWNpYWxseSB3aXRoIHRoZSBub3RhdGlvbiBcZiQgeF5UeSBcZiQgZm9yIGRvdCBwcm9kdWN0cyBvZiBjb2x1bW4tdmVjdG9ycy4KKworXHNlY3Rpb24gVmVjdG9yQmxvY2tzIFZlY3RvciBibG9ja3MKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5FaWdlbiAyPC90aD48dGg+RWlnZW4gMzwvdGg+PC90aD4KKzx0cj48dGQ+XGNvZGUKK3ZlY3Rvci5zdGFydChsZW5ndGgpCit2ZWN0b3Iuc3RhcnQ8bGVuZ3RoPigpCit2ZWN0b3IuZW5kKGxlbmd0aCkKK3ZlY3Rvci5lbmQ8bGVuZ3RoPigpCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCit2ZWN0b3IuaGVhZChsZW5ndGgpCit2ZWN0b3IuaGVhZDxsZW5ndGg+KCkKK3ZlY3Rvci50YWlsKGxlbmd0aCkKK3ZlY3Rvci50YWlsPGxlbmd0aD4oKQorXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCisKK1xzZWN0aW9uIENvcm5lcnMgTWF0cml4IENvcm5lcnMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5FaWdlbiAyPC90aD48dGg+RWlnZW4gMzwvdGg+PC90aD4KKzx0cj48dGQ+XGNvZGUKK21hdHJpeC5jb3JuZXIoVG9wTGVmdCxyLGMpCittYXRyaXguY29ybmVyKFRvcFJpZ2h0LHIsYykKK21hdHJpeC5jb3JuZXIoQm90dG9tTGVmdCxyLGMpCittYXRyaXguY29ybmVyKEJvdHRvbVJpZ2h0LHIsYykKK21hdHJpeC5jb3JuZXI8cixjPihUb3BMZWZ0KQorbWF0cml4LmNvcm5lcjxyLGM+KFRvcFJpZ2h0KQorbWF0cml4LmNvcm5lcjxyLGM+KEJvdHRvbUxlZnQpCittYXRyaXguY29ybmVyPHIsYz4oQm90dG9tUmlnaHQpCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCittYXRyaXgudG9wTGVmdENvcm5lcihyLGMpCittYXRyaXgudG9wUmlnaHRDb3JuZXIocixjKQorbWF0cml4LmJvdHRvbUxlZnRDb3JuZXIocixjKQorbWF0cml4LmJvdHRvbVJpZ2h0Q29ybmVyKHIsYykKK21hdHJpeC50b3BMZWZ0Q29ybmVyPHIsYz4oKQorbWF0cml4LnRvcFJpZ2h0Q29ybmVyPHIsYz4oKQorbWF0cml4LmJvdHRvbUxlZnRDb3JuZXI8cixjPigpCittYXRyaXguYm90dG9tUmlnaHRDb3JuZXI8cixjPigpCitcZW5kY29kZTwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworTm90aWNlIHRoYXQgRWlnZW4zIGFsc28gcHJvdmlkZXMgdGhlc2UgbmV3IGNvbnZlbmllbmNlIG1ldGhvZHM6IHRvcFJvd3MoKSwgYm90dG9tUm93cygpLCBsZWZ0Q29scygpLCByaWdodENvbHMoKS4gU2VlIGluIGNsYXNzIERlbnNlQmFzZS4KKworXHNlY3Rpb24gQ29lZmZpY2llbnRXaXNlT3BlcmF0aW9ucyBDb2VmZmljaWVudCB3aXNlIG9wZXJhdGlvbnMKKworSW4gRWlnZW4yLCBjb2VmZmljaWVudCB3aXNlIG9wZXJhdGlvbnMgd2hpY2ggaGF2ZSBubyBwcm9wZXIgbWF0aGVtYXRpY2FsIGRlZmluaXRpb24gKGFzIGEgY29lZmZpY2llbnQgd2lzZSBwcm9kdWN0KQord2VyZSBhY2hpZXZlZCB1c2luZyB0aGUgLmN3aXNlKCkgcHJlZml4LCBlLmcuOgorXGNvZGUgYS5jd2lzZSgpICogYiBcZW5kY29kZQorSW4gRWlnZW4zIHRoaXMgLmN3aXNlKCkgcHJlZml4IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgYSBuZXcga2luZCBvZiBtYXRyaXggdHlwZSBjYWxsZWQKK0FycmF5IGZvciB3aGljaCBhbGwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGNvZWZmaWNpZW50IHdpc2UuIFlvdSBjYW4gZWFzaWx5IHZpZXcgYSBtYXRyaXggYXMgYW4gYXJyYXkgYW5kIHZpY2UgdmVyc2EgdXNpbmcKK3RoZSBNYXRyaXhCYXNlOjphcnJheSgpIGFuZCBBcnJheUJhc2U6Om1hdHJpeCgpIGZ1bmN0aW9ucyByZXNwZWN0aXZlbHkuIEhlcmUgaXMgYW4gZXhhbXBsZToKK1xjb2RlCitWZWN0b3I0ZiBhLCBiLCBjOworYyA9IGEuYXJyYXkoKSAqIGIuYXJyYXkoKTsKK1xlbmRjb2RlCitOb3RlIHRoYXQgdGhlIC5hcnJheSgpIGZ1bmN0aW9uIGlzIG5vdCBhdCBhbGwgYSBzeW5vbnltIG9mIHRoZSBkZXByZWNhdGVkIC5jd2lzZSgpIHByZWZpeC4KK1doaWxlIHRoZSAuY3dpc2UoKSBwcmVmaXggY2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgdGhlIGZvbGxvd2luZyBvcGVyYXRvciwgdGhlIGFycmF5KCkgZnVuY3Rpb24gcGVyZm9ybXMKK2EgcGVybWFuZW50IGNvbnZlcnNpb24gdG8gdGhlIGFycmF5IHdvcmxkLiBUaGVyZWZvcmUsIGZvciBiaW5hcnkgb3BlcmF0aW9ucyBzdWNoIGFzIHRoZSBjb2VmZmljaWVudCB3aXNlIHByb2R1Y3QsCitib3RoIHNpZGVzIG11c3QgYmUgY29udmVydGVkIHRvIGFuIFxlbSBhcnJheSBhcyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4gT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geW91Citjb25jYXRlbmF0ZSBtdWx0aXBsZSBjb2VmZmljaWVudCB3aXNlIG9wZXJhdGlvbnMgeW91IG9ubHkgaGF2ZSB0byBkbyB0aGUgY29udmVyc2lvbiBvbmNlLCBlLmcuOgorXGNvZGUKK1ZlY3RvcjRmIGEsIGIsIGM7CitjID0gYS5hcnJheSgpLmFicygpLnBvdygzKSAqIGIuYXJyYXkoKS5hYnMoKS5zaW4oKTsKK1xlbmRjb2RlCitXaXRoIEVpZ2VuMiB5b3Ugd291bGQgaGF2ZSB3cml0dGVuOgorXGNvZGUKK2MgPSAoYS5jd2lzZSgpLmFicygpLmN3aXNlKCkucG93KDMpKS5jd2lzZSgpICogKGIuY3dpc2UoKS5hYnMoKS5jd2lzZSgpLnNpbigpKTsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIFBhcnRBbmRFeHRyYWN0IFRyaWFuZ3VsYXIgYW5kIHNlbGYtYWRqb2ludCBtYXRyaWNlcworCitJbiBFaWdlbiAyIHlvdSBoYWQgdG8gcGxheSB3aXRoIHRoZSBwYXJ0LCBleHRyYWN0LCBhbmQgbWFya2VkIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggdHJpYW5ndWxhciBhbmQgc2VsZmFkam9pbnQgbWF0cmljZXMuIEluIEVpZ2VuIDMsIGFsbCB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gZmF2b3Igb2YgdGhlIGNvbmNlcHQgb2YgXGVtIHZpZXdzOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuIDI8L3RoPjx0aD5FaWdlbiAzPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZQorQS5wYXJ0PFVwcGVyVHJpYW5ndWxhcj4oKTsKK0EucGFydDxTdHJpY3RseUxvd2VyVHJpYW5ndWxhcj4oKTsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCitBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCitBLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KClcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+XGNvZGUKK0EuZXh0cmFjdDxVcHBlclRyaWFuZ3VsYXI+KCk7CitBLmV4dHJhY3Q8U3RyaWN0bHlMb3dlclRyaWFuZ3VsYXI+KCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCitBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCitBLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KClcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+XGNvZGUKK0EubWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKTsKK0EubWFya2VkPFN0cmljdGx5TG93ZXJUcmlhbmd1bGFyPigpO1xlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQorQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorQS50cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjIiPjwvdGQ+PC90cj4KKzx0cj48dGQ+XGNvZGUKK0EucGFydDxTZWxmQWRmam9pbnR8VXBwZXJUcmlhbmd1bGFyPigpOworQS5leHRyYWN0PFNlbGZBZGZqb2ludHxMb3dlclRyaWFuZ3VsYXI+KCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCitBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKQorQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KClcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iMiI+PC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZQorVXBwZXJUcmlhbmd1bGFyCitMb3dlclRyaWFuZ3VsYXIKK1VuaXRVcHBlclRyaWFuZ3VsYXIKK1VuaXRMb3dlclRyaWFuZ3VsYXIKK1N0cmljdGx5VXBwZXJUcmlhbmd1bGFyCitTdHJpY3RseUxvd2VyVHJpYW5ndWxhcgorXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorVXBwZXIKK0xvd2VyCitVbml0VXBwZXIKK1VuaXRMb3dlcgorU3RyaWN0bHlVcHBlcgorU3RyaWN0bHlMb3dlcgorXGVuZGNvZGU8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzYSBjbGFzcyBUcmlhbmd1bGFyVmlldywgY2xhc3MgU2VsZkFkam9pbnRWaWV3CisKK1xzZWN0aW9uIFRyaWFuZ3VsYXJTb2x2ZUluUGxhY2UgVHJpYW5ndWxhciBpbi1wbGFjZSBzb2x2aW5nCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+RWlnZW4gMjwvdGg+PHRoPkVpZ2VuIDM8L3RoPjwvdHI+Cis8dHI+PHRkPlxjb2RlIEEudHJpYW5ndWxhclNvbHZlSW5QbGFjZTxYeHhUcmlhbmd1bGFyPihZKTtcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIEEudHJpYW5ndWxhclZpZXc8WHh4PigpLnNvbHZlSW5QbGFjZShZKTtcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gRGVjb21wb3NpdGlvbnMgTWF0cml4IGRlY29tcG9zaXRpb25zCisKK1NvbWUgb2YgRWlnZW4gMidzIG1hdHJpeCBkZWNvbXBvc2l0aW9ucyBoYXZlIGJlZW4gcmVuYW1lZCBpbiBFaWdlbiAzLCB3aGlsZSBzb21lIG90aGVycyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQgYXJlIHJlcGxhY2VkIGJ5IG90aGVyIGRlY29tcG9zaXRpb25zIGluIEVpZ2VuIDMuCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKyAgPHRyPgorICAgIDx0aD5FaWdlbiAyPC90aD4KKyAgICA8dGg+RWlnZW4gMzwvdGg+CisgICAgPHRoPk5vdGVzPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5MVTwvdGQ+CisgICAgPHRkPkZ1bGxQaXZMVTwvdGQ+CisgICAgPHRkIGNsYXNzPSJhbHQiPlNlZSBhbHNvIHRoZSBuZXcgUGFydGlhbFBpdkxVLCBpdCdzIG11Y2ggZmFzdGVyPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5RUjwvdGQ+CisgICAgPHRkPkhvdXNlaG9sZGVyUVI8L3RkPgorICAgIDx0ZCBjbGFzcz0iYWx0Ij5TZWUgYWxzbyB0aGUgbmV3IENvbFBpdkhvdXNlaG9sZGVyUVIsIGl0J3MgbW9yZSByZWxpYWJsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+U1ZEPC90ZD4KKyAgICA8dGQ+SmFjb2JpU1ZEPC90ZD4KKyAgICA8dGQgY2xhc3M9ImFsdCI+V2UgY3VycmVudGx5IGRvbid0IGhhdmUgYSBiaWRpYWdvbmFsaXppbmcgU1ZEOyBvZiBjb3Vyc2UgdGhpcyBpcyBwbGFubmVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+RWlnZW5Tb2x2ZXIgYW5kIGZyaWVuZHM8L3RkPgorICAgIDx0ZD5cY29kZSAjaW5jbHVkZTxFaWdlbi9FaWdlbnZhbHVlcz4gXGVuZGNvZGUgPC90ZD4KKyAgICA8dGQgY2xhc3M9ImFsdCI+TW92ZWQgdG8gc2VwYXJhdGUgbW9kdWxlPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIExpbmVhclNvbHZlcnMgTGluZWFyIHNvbHZlcnMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5FaWdlbiAyPC90aD48dGg+RWlnZW4gMzwvdGg+PHRoPk5vdGVzPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZSBBLmx1KCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlIEEuZnVsbFBpdkx1KCk7XGVuZGNvZGU8L3RkPgorPHRkIGNsYXNzPSJhbHQiPk5vdyBBLmx1KCkgcmV0dXJucyBhIFBhcnRpYWxQaXZMVTwvdGQ+PC90cj4KKzx0cj48dGQ+XGNvZGUgQS5sdSgpLnNvbHZlKEIsJlgpO1xlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZSBYID0gQS5sdSgpLnNvbHZlKEIpOworIFggPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKEIpO1xlbmRjb2RlPC90ZD4KKzx0ZCBjbGFzcz0iYWx0Ij5UaGUgcmV0dXJuZWQgYnkgdmFsdWUgaXMgZnVsbHkgb3B0aW1pemVkPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSBBLmxsdCgpLnNvbHZlKEIsJlgpO1xlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZSBYID0gQS5sbHQoKS5zb2x2ZShCKTsKKyBYID0gQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+LmxsdCgpLnNvbHZlKEIpOworIFggPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4ubGx0KCkuc29sdmUoQik7XGVuZGNvZGU8L3RkPgorPHRkIGNsYXNzPSJhbHQiPlRoZSByZXR1cm5lZCBieSB2YWx1ZSBpcyBmdWxseSBvcHRpbWl6ZWQgYW5kIFxuCit0aGUgc2VsZmFkam9pbnRWaWV3IEFQSSBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUgXG4KK3RyaWFuZ3VsYXIgcGFydCB0byB3b3JrIG9uIChkZWZhdWx0IGlzIGxvd2VyIHBhcnQpPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSBBLmxsdCgpLnNvbHZlSW5QbGFjZShCKTtcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUgQiA9IEEubGx0KCkuc29sdmUoQik7CisgQiA9IEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPi5sbHQoKS5zb2x2ZShCKTsKKyBCID0gQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+LmxsdCgpLnNvbHZlKEIpO1xlbmRjb2RlPC90ZD4KKzx0ZCBjbGFzcz0iYWx0Ij5JbiBwbGFjZSBzb2x2aW5nPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSBBLmxkbHQoKS5zb2x2ZShCLCZYKTtcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUgWCA9IEEubGRsdCgpLnNvbHZlKEIpOworIFggPSBBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4ubGRsdCgpLnNvbHZlKEIpOworIFggPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4ubGRsdCgpLnNvbHZlKEIpO1xlbmRjb2RlPC90ZD4KKzx0ZCBjbGFzcz0iYWx0Ij5UaGUgcmV0dXJuZWQgYnkgdmFsdWUgaXMgZnVsbHkgb3B0aW1pemVkIGFuZCBcbgordGhlIHNlbGZhZGpvaW50VmlldyBBUEkgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlIFxuCit0cmlhbmd1bGFyIHBhcnQgdG8gd29yayBvbjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIEdlb21ldHJ5TW9kdWxlIENoYW5nZXMgaW4gdGhlIEdlb21ldHJ5IG1vZHVsZQorCitUaGUgR2VvbWV0cnkgbW9kdWxlIGlzIHRoZSBvbmUgdGhhdCBjaGFuZ2VkIHRoZSBtb3N0LiBJZiB5b3UgcmVseSBoZWF2aWx5IG9uIGl0LCBpdCdzIHByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgPGEgaHJlZj0iaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvZG94LTMuMi9FaWdlbjJTdXBwb3J0TW9kZXMuaHRtbCI+IkVpZ2VuIDIgc3VwcG9ydCBtb2RlcyI8L2E+IHRvIHBlcmZvcm0geW91ciBtaWdyYXRpb24uCisKK1xzZWN0aW9uIFRyYW5zZm9ybSBUaGUgVHJhbnNmb3JtIGNsYXNzCisKK0luIEVpZ2VuIDIsIHRoZSBUcmFuc2Zvcm0gY2xhc3MgZGlkbid0IHJlYWxseSBrbm93IHdoZXRoZXIgaXQgd2FzIGEgcHJvamVjdGl2ZSBvciBhZmZpbmUgdHJhbnNmb3JtYXRpb24uIEluIEVpZ2VuIDMsIGl0IHRha2VzIGEgbmV3IFxhIE1vZGUgdGVtcGxhdGUgcGFyYW1ldGVyLCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBpdCdzIFxhIFByb2plY3RpdmUgb3IgXGEgQWZmaW5lIHRyYW5zZm9ybS4gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KKworVGhlIFRyYW5zZm9ybTNmIChldGMpIHR5cGVkZWZzIGFyZSBubyBtb3JlLiBJbiBFaWdlbiAzLCB0aGUgVHJhbnNmb3JtIHR5cGVkZWZzIGV4cGxpY2l0bHkgcmVmZXIgdG8gdGhlIFxhIFByb2plY3RpdmUgYW5kIFxhIEFmZmluZSBtb2RlczoKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5FaWdlbiAyPC90aD48dGg+RWlnZW4gMzwvdGg+PHRoPk5vdGVzPC90aD48L3RyPgorPHRyPgorICA8dGQ+IFRyYW5zZm9ybTNmIDwvdGQ+CisgIDx0ZD4gQWZmaW5lM2Ygb3IgUHJvamVjdGl2ZTNmIDwvdGQ+CisgIDx0ZD4gT2YgY291cnNlIDNmIGlzIGp1c3QgYW4gZXhhbXBsZSBoZXJlIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworCitcc2VjdGlvbiBMYXp5VnNOb2FsaWFzIExhenkgZXZhbHVhdGlvbiBhbmQgbm9hbGlhcworCitJbiBFaWdlbiBhbGwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGluIGEgbGF6eSBmYXNoaW9uIGV4Y2VwdCB0aGUgbWF0cml4IHByb2R1Y3RzIHdoaWNoIGFyZSBhbHdheXMgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkgYnkgZGVmYXVsdC4KK0luIEVpZ2VuMiwgbGF6eSBldmFsdWF0aW9uIGNvdWxkIGJlIGVuZm9yY2VkIGJ5IHRhZ2dpbmcgYSBwcm9kdWN0IHVzaW5nIHRoZSAubGF6eSgpIGZ1bmN0aW9uLiBIb3dldmVyLCBpbiBjb21wbGV4IGV4cHJlc3Npb25zIGl0IHdhcyBub3QKK2Vhc3kgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHB1dCB0aGUgbGF6eSgpIGZ1bmN0aW9uLiBJbiBFaWdlbjMsIHRoZSBsYXp5KCkgZmVhdHVyZSBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IHRoZSBNYXRyaXhCYXNlOjpub2FsaWFzKCkgZnVuY3Rpb24KK3doaWNoIGNhbiBiZSB1c2VkIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50IHdoZW4gbm8gYWxpYXNpbmcgY2FuIG9jY3VyLiBIZXJlIGlzIGFuIGV4YW1wbGU6CitcY29kZQorTWF0cml4WGYgYSwgYiwgYzsKKy4uLgorYy5ub2FsaWFzKCkgKz0gMiAqIGEudHJhbnNwb3NlKCkgKiBiOworXGVuZGNvZGUKK0hvd2V2ZXIsIHRoZSBub2FsaWFzIG1lY2hhbmlzbSBkb2VzIG5vdCBjb3ZlciBhbGwgdGhlIGZlYXR1cmVzIG9mIHRoZSBvbGQgLmxhenkoKS4gSW5kZWVkLCBpbiBzb21lIGV4dHJlbWVseSByYXJlIGNhc2VzLAoraXQgbWlnaHQgYmUgdXNlZnVsIHRvIGV4cGxpY2l0IHJlcXVlc3QgZm9yIGEgbGF5IHByb2R1Y3QsIGkuZS4sIGZvciBhIHByb2R1Y3Qgd2hpY2ggd2lsbCBiZSBldmFsdWF0ZWQgb25lIGNvZWZmaWNpZW50IGF0IG9uY2UsIG9uIHJlcXVlc3QsCitqdXN0IGxpa2UgYW55IG90aGVyIGV4cHJlc3Npb25zLiBUbyB0aGlzIGVuZCB5b3UgY2FuIHVzZSB0aGUgTWF0cml4QmFzZTo6bGF6eVByb2R1Y3QoKSBmdW5jdGlvbiwgaG93ZXZlciB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIHlvdSB0bwordXNlIGl0IHVubGVzcyB5b3UgYXJlIHN1cmUgb2Ygd2hhdCB5b3UgYXJlIGRvaW5nLCBpLmUuLCB5b3UgaGF2ZSByaWdvdXJvc2x5IG1lYXN1cmVkIGEgc3BlZWQgaW1wcm92ZW1lbnQuCisKK1xzZWN0aW9uIEFsaWduTWFjcm9zIEFsaWdubWVudC1yZWxhdGVkIG1hY3JvcworCitUaGUgRUlHRU5fQUxJR05fMTI4IG1hY3JvIGhhcyBiZWVuIHJlbmFtZWQgdG8gRUlHRU5fQUxJR04xNi4gRG9uJ3QgYmUgc3VycHJpc2VkLCBpdCdzIGp1c3QgdGhhdCB3ZSBzd2l0Y2hlZCB0byBjb3VudGluZyBpbiBieXRlcyA7LSkKKworVGhlIFxsaW5rIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc1BlcmZvcm1hbmNlIEVJR0VOX0RPTlRfQUxJR04gXGVuZGxpbmsgb3B0aW9uIHN0aWxsIGV4aXN0cyBpbiBFaWdlbiAzLCBidXQgaXQgaGFzIGEgbmV3IGNvdXNpbjogXGxpbmsgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzUGVyZm9ybWFuY2UgIEVJR0VOX0RPTlRfQUxJR05fU1RBVElDQUxMWS5cZW5kbGluayBJdCBhbGxvd3MgdG8gZ2V0IHJpZCBvZiBhbGwgc3RhdGljIGFsaWdubWVudCBpc3N1ZXMgd2hpbGUga2VlcGluZyBhbGlnbm1lbnQgb2YgZHluYW1pYy1zaXplIGhlYXAtYWxsb2NhdGVkIGFycmF5cy4gVmVjdG9yaXphdGlvbiBvZiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhcnJheXMgaXMgc3RpbGwgcHJlc2VydmVkICh1bmxlc3MgeW91IGRlZmluZSBcbGluayBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNQZXJmb3JtYW5jZSBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFIFxlbmRsaW5rID0wKSwgYXQgdGhlIGNvc3Qgb2YgdW5hbGlnbmVkIG1lbW9yeSBzdG9yZXMuCisKK1xzZWN0aW9uIEFsaWduZWRNYXAgQWxpZ25lZCBNYXAgb2JqZWN0cworCitBIGNvbW1vbiBpc3N1ZSB3aXRoIEVpZ2VuIDIgd2FzIHRoYXQgd2hlbiBtYXBwaW5nIGFuIGFycmF5IHdpdGggTWFwLCB0aGVyZSB3YXMgbm8gd2F5IHRvIHRlbGwgRWlnZW4gdGhhdCB5b3VyIGFycmF5IHdhcyBhbGlnbmVkLiBUaGVyZSB3YXMgYSBGb3JjZUFsaWduZWQgb3B0aW9uIGJ1dCBpdCBkaWRuJ3QgbWVhbiB0aGF0OyBpdCB3YXMganVzdCBjb25mdXNpbmcgYW5kIGhhcyBiZWVuIHJlbW92ZWQuCisKK05ldyBpbiBFaWdlbjMgaXMgdGhlICNBbGlnbmVkIG9wdGlvbi4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIE1hcC4gVXNlIGl0IGxpa2UgdGhpczoKK1xjb2RlCitNYXA8VmVjdG9yNGYsIEFsaWduZWQ+IG15TWFwcGVkVmVjdG9yKHNvbWVfYWxpZ25lZF9hcnJheSk7CitcZW5kY29kZQorVGhlcmUgYWxzbyBhcmUgcmVsYXRlZCBjb252ZW5pZW5jZSBzdGF0aWMgbWV0aG9kcywgd2hpY2ggYWN0dWFsbHkgYXJlIHRoZSBwcmVmZXJyZWQgd2F5IGFzIHRoZXkgdGFrZSBjYXJlIG9mIHN1Y2ggdGhpbmdzIGFzIGNvbnN0bmVzczoKK1xjb2RlCityZXN1bHQgPSBWZWN0b3I0Zjo6TWFwQWxpZ25lZChzb21lX2FsaWduZWRfYXJyYXkpOworXGVuZGNvZGUKKworXHNlY3Rpb24gU3RkQ29udGFpbmVycyBTVEwgQ29udGFpbmVycworCitJbiBFaWdlbjIsIDx0dD5cI2luY2x1ZGVcPEVpZ2VuL1N0ZFZlY3Rvclw+PC90dD4gdHdlYWtlZCBzdGQ6OnZlY3RvciB0byBhdXRvbWF0aWNhbGx5IGFsaWduIGVsZW1lbnRzLiBUaGUgcHJvYmxlbSB3YXMgdGhhdCB0aGF0IHdhcyBxdWl0ZSBpbnZhc2l2ZS4gSW4gRWlnZW4zLCB3ZSBvbmx5IG92ZXJyaWRlIHN0YW5kYXJkIGJlaGF2aW9yIGlmIHlvdSB1c2UgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFQ+IGFzIHlvdXIgYWxsb2NhdG9yIHR5cGUuIFNvIGZvciBleGFtcGxlLCBpZiB5b3UgdXNlIHN0ZDo6dmVjdG9yPE1hdHJpeDRmPiwgeW91IG5lZWQgdG8gZG8gdGhlIGZvbGxvd2luZyBjaGFuZ2UgKG5vdGUgdGhhdCBhbGlnbmVkX2FsbG9jYXRvciBpcyB1bmRlciBuYW1lc3BhY2UgRWlnZW4pOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuIDI8L3RoPjx0aD5FaWdlbiAzPC90aD48L3RyPgorPHRyPgorICA8dGQ+IFxjb2RlIHN0ZDo6dmVjdG9yPE1hdHJpeDRmPiBcZW5kY29kZSA8L3RkPgorICA8dGQ+IFxjb2RlIHN0ZDo6dmVjdG9yPE1hdHJpeDRmLCBhbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXg0Zj4gPiBcZW5kY29kZSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIGVpUHJlZml4IEludGVybmFsIGVpXyBwcmVmaXgKKworSW4gRWlnZW4yLCBnbG9iYWwgaW50ZXJuYWwgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzIHdlcmUgcHJlZml4ZWQgYnkgXGMgZWlfLiBJbiBFaWdlbjMsIHRoZXkgYWxsIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIHRoZSBtb3JlIGV4cGxpY2l0IFxjIGludGVybmFsIG5hbWVzcGFjZS4gU28sIGUuZy4sIFxjIGVpX3NxcnQoeCkgbm93IGJlY29tZXMgXGMgaW50ZXJuYWw6OnNxcnQoeCkuIE9mIGNvdXJzZSBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmVseSBvbiBFaWdlbidzIGludGVybmFsIGZlYXR1cmVzLgorCisKKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0FzY2lpUXVpY2tSZWZlcmVuY2UudHh0IGIvZG9jL0FzY2lpUXVpY2tSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTU0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQXNjaWlRdWlja1JlZmVyZW5jZS50eHQKQEAgLTAsMCArMSwyMTUgQEAKKy8vIEEgc2ltcGxlIHF1aWNrcmVmIGZvciBFaWdlbi4gQWRkIGFueXRoaW5nIHRoYXQncyBtaXNzaW5nLgorLy8gTWFpbiBhdXRob3I6IEtlaXIgTWllcmxlCisKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKworTWF0cml4PGRvdWJsZSwgMywgMz4gQTsgICAgICAgICAgICAgICAvLyBGaXhlZCByb3dzIGFuZCBjb2xzLiBTYW1lIGFzIE1hdHJpeDNkLgorTWF0cml4PGRvdWJsZSwgMywgRHluYW1pYz4gQjsgICAgICAgICAvLyBGaXhlZCByb3dzLCBkeW5hbWljIGNvbHMuCitNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPiBDOyAgIC8vIEZ1bGwgZHluYW1pYy4gU2FtZSBhcyBNYXRyaXhYZC4KK01hdHJpeDxkb3VibGUsIDMsIDMsIFJvd01ham9yPiBFOyAgICAgLy8gUm93IG1ham9yOyBkZWZhdWx0IGlzIGNvbHVtbi1tYWpvci4KK01hdHJpeDNmIFAsIFEsIFI7ICAgICAgICAgICAgICAgICAgICAgLy8gM3gzIGZsb2F0IG1hdHJpeC4KK1ZlY3RvcjNmIHgsIHksIHo7ICAgICAgICAgICAgICAgICAgICAgLy8gM3gxIGZsb2F0IG1hdHJpeC4KK1Jvd1ZlY3RvcjNmIGEsIGIsIGM7ICAgICAgICAgICAgICAgICAgLy8gMXgzIGZsb2F0IG1hdHJpeC4KK1ZlY3RvclhkIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBjb2x1bW4gdmVjdG9yIG9mIGRvdWJsZXMKK2RvdWJsZSBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy8gQmFzaWMgdXNhZ2UKKy8vIEVpZ2VuICAgICAgICAgIC8vIE1hdGxhYiAgICAgICAgICAgLy8gY29tbWVudHMKK3guc2l6ZSgpICAgICAgICAgIC8vIGxlbmd0aCh4KSAgICAgICAgLy8gdmVjdG9yIHNpemUKK0Mucm93cygpICAgICAgICAgIC8vIHNpemUoQywxKSAgICAgICAgLy8gbnVtYmVyIG9mIHJvd3MKK0MuY29scygpICAgICAgICAgIC8vIHNpemUoQywyKSAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMKK3goaSkgICAgICAgICAgICAgIC8vIHgoaSsxKSAgICAgICAgICAgLy8gTWF0bGFiIGlzIDEtYmFzZWQKK0MoaSxqKSAgICAgICAgICAgIC8vIEMoaSsxLGorMSkgICAgICAgLy8KKworQS5yZXNpemUoNCwgNCk7ICAgLy8gUnVudGltZSBlcnJvciBpZiBhc3NlcnRpb25zIGFyZSBvbi4KK0IucmVzaXplKDQsIDkpOyAgIC8vIFJ1bnRpbWUgZXJyb3IgaWYgYXNzZXJ0aW9ucyBhcmUgb24uCitBLnJlc2l6ZSgzLCAzKTsgICAvLyBPazsgc2l6ZSBkaWRuJ3QgY2hhbmdlLgorQi5yZXNpemUoMywgOSk7ICAgLy8gT2s7IG9ubHkgZHluYW1pYyBjb2xzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAKK0EgPDwgMSwgMiwgMywgICAgIC8vIEluaXRpYWxpemUgQS4gVGhlIGVsZW1lbnRzIGNhbiBhbHNvIGJlCisgICAgIDQsIDUsIDYsICAgICAvLyBtYXRyaWNlcywgd2hpY2ggYXJlIHN0YWNrZWQgYWxvbmcgY29scworICAgICA3LCA4LCA5OyAgICAgLy8gYW5kIHRoZW4gdGhlIHJvd3MgYXJlIHN0YWNrZWQuCitCIDw8IEEsIEEsIEE7ICAgICAvLyBCIGlzIHRocmVlIGhvcml6b250YWxseSBzdGFja2VkIEEncy4KK0EuZmlsbCgxMCk7ICAgICAgIC8vIEZpbGwgQSB3aXRoIGFsbCAxMCdzLgorCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorTWF0cml4WGQ6OklkZW50aXR5KHJvd3MsY29scykgICAgICAgICAgICAgICAvLyBleWUocm93cyxjb2xzKQorQy5zZXRJZGVudGl0eShyb3dzLGNvbHMpICAgICAgICAgICAgICAgICAgICAvLyBDID0gZXllKHJvd3MsY29scykKK01hdHJpeFhkOjpaZXJvKHJvd3MsY29scykgICAgICAgICAgICAgICAgICAgLy8gemVyb3Mocm93cyxjb2xzKQorQy5zZXRaZXJvKHJvd3MsY29scykgICAgICAgICAgICAgICAgICAgICAgICAvLyBDID0gemVyb3Mocm93cyxjb2xzKQorTWF0cml4WGQ6Ok9uZXMocm93cyxjb2xzKSAgICAgICAgICAgICAgICAgICAvLyBvbmVzKHJvd3MsY29scykKK0Muc2V0T25lcyhyb3dzLGNvbHMpICAgICAgICAgICAgICAgICAgICAgICAgLy8gQyA9IG9uZXMocm93cyxjb2xzKQorTWF0cml4WGQ6OlJhbmRvbShyb3dzLGNvbHMpICAgICAgICAgICAgICAgICAvLyByYW5kKHJvd3MsY29scykqMi0xICAgICAgICAgICAgLy8gTWF0cml4WGQ6OlJhbmRvbSByZXR1cm5zIHVuaWZvcm0gcmFuZG9tIG51bWJlcnMgaW4gKC0xLCAxKS4KK0Muc2V0UmFuZG9tKHJvd3MsY29scykgICAgICAgICAgICAgICAgICAgICAgLy8gQyA9IHJhbmQocm93cyxjb2xzKSoyLTEKK1ZlY3RvclhkOjpMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCkgICAgICAgICAgLy8gbGluc3BhY2UobG93LGhpZ2gsc2l6ZSknCit2LnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKSAgICAgICAgICAgICAgIC8vIHYgPSBsaW5zcGFjZShsb3csaGlnaCxzaXplKScKK1ZlY3RvclhpOjpMaW5TcGFjZWQoKChoaS1sb3cpL3N0ZXApKzEsICAgICAgLy8gbG93OnN0ZXA6aGkKKyAgICAgICAgICAgICAgICAgICAgbG93LGxvdytzdGVwKihzaXplLTEpKSAgLy8KKworCisvLyBNYXRyaXggc2xpY2luZyBhbmQgYmxvY2tzLiBBbGwgZXhwcmVzc2lvbnMgbGlzdGVkIGhlcmUgYXJlIHJlYWQvd3JpdGUuCisvLyBUZW1wbGF0ZWQgc2l6ZSB2ZXJzaW9ucyBhcmUgZmFzdGVyLiBOb3RlIHRoYXQgTWF0bGFiIGlzIDEtYmFzZWQgKGEgc2l6ZSBOCisvLyB2ZWN0b3IgaXMgeCgxKS4uLngoTikpLgorLy8gRWlnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRsYWIKK3guaGVhZChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geCgxOm4pCit4LmhlYWQ8bj4oKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHgoMTpuKQoreC50YWlsKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4KGVuZCAtIG4gKyAxOiBlbmQpCit4LnRhaWw8bj4oKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHgoZW5kIC0gbiArIDE6IGVuZCkKK3guc2VnbWVudChpLCBuKSAgICAgICAgICAgICAgICAgICAgLy8geChpKzEgOiBpK24pCit4LnNlZ21lbnQ8bj4oaSkgICAgICAgICAgICAgICAgICAgIC8vIHgoaSsxIDogaStuKQorUC5ibG9jayhpLCBqLCByb3dzLCBjb2xzKSAgICAgICAgICAvLyBQKGkrMSA6IGkrcm93cywgaisxIDogaitjb2xzKQorUC5ibG9jazxyb3dzLCBjb2xzPihpLCBqKSAgICAgICAgICAvLyBQKGkrMSA6IGkrcm93cywgaisxIDogaitjb2xzKQorUC5yb3coaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQKGkrMSwgOikKK1AuY29sKGopICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUCg6LCBqKzEpCitQLmxlZnRDb2xzPGNvbHM+KCkgICAgICAgICAgICAgICAgIC8vIFAoOiwgMTpjb2xzKQorUC5sZWZ0Q29scyhjb2xzKSAgICAgICAgICAgICAgICAgICAvLyBQKDosIDE6Y29scykKK1AubWlkZGxlQ29sczxjb2xzPihqKSAgICAgICAgICAgICAgLy8gUCg6LCBqKzE6aitjb2xzKQorUC5taWRkbGVDb2xzKGosIGNvbHMpICAgICAgICAgICAgICAvLyBQKDosIGorMTpqK2NvbHMpCitQLnJpZ2h0Q29sczxjb2xzPigpICAgICAgICAgICAgICAgIC8vIFAoOiwgZW5kLWNvbHMrMTplbmQpCitQLnJpZ2h0Q29scyhjb2xzKSAgICAgICAgICAgICAgICAgIC8vIFAoOiwgZW5kLWNvbHMrMTplbmQpCitQLnRvcFJvd3M8cm93cz4oKSAgICAgICAgICAgICAgICAgIC8vIFAoMTpyb3dzLCA6KQorUC50b3BSb3dzKHJvd3MpICAgICAgICAgICAgICAgICAgICAvLyBQKDE6cm93cywgOikKK1AubWlkZGxlUm93czxyb3dzPihpKSAgICAgICAgICAgICAgLy8gUChpKzE6aStyb3dzLCA6KQorUC5taWRkbGVSb3dzKGksIHJvd3MpICAgICAgICAgICAgICAvLyBQKGkrMTppK3Jvd3MsIDopCitQLmJvdHRvbVJvd3M8cm93cz4oKSAgICAgICAgICAgICAgIC8vIFAoZW5kLXJvd3MrMTplbmQsIDopCitQLmJvdHRvbVJvd3Mocm93cykgICAgICAgICAgICAgICAgIC8vIFAoZW5kLXJvd3MrMTplbmQsIDopCitQLnRvcExlZnRDb3JuZXIocm93cywgY29scykgICAgICAgIC8vIFAoMTpyb3dzLCAxOmNvbHMpCitQLnRvcFJpZ2h0Q29ybmVyKHJvd3MsIGNvbHMpICAgICAgIC8vIFAoMTpyb3dzLCBlbmQtY29scysxOmVuZCkKK1AuYm90dG9tTGVmdENvcm5lcihyb3dzLCBjb2xzKSAgICAgLy8gUChlbmQtcm93cysxOmVuZCwgMTpjb2xzKQorUC5ib3R0b21SaWdodENvcm5lcihyb3dzLCBjb2xzKSAgICAvLyBQKGVuZC1yb3dzKzE6ZW5kLCBlbmQtY29scysxOmVuZCkKK1AudG9wTGVmdENvcm5lcjxyb3dzLGNvbHM+KCkgICAgICAgLy8gUCgxOnJvd3MsIDE6Y29scykKK1AudG9wUmlnaHRDb3JuZXI8cm93cyxjb2xzPigpICAgICAgLy8gUCgxOnJvd3MsIGVuZC1jb2xzKzE6ZW5kKQorUC5ib3R0b21MZWZ0Q29ybmVyPHJvd3MsY29scz4oKSAgICAvLyBQKGVuZC1yb3dzKzE6ZW5kLCAxOmNvbHMpCitQLmJvdHRvbVJpZ2h0Q29ybmVyPHJvd3MsY29scz4oKSAgIC8vIFAoZW5kLXJvd3MrMTplbmQsIGVuZC1jb2xzKzE6ZW5kKQorCisvLyBPZiBwYXJ0aWN1bGFyIG5vdGUgaXMgRWlnZW4ncyBzd2FwIGZ1bmN0aW9uIHdoaWNoIGlzIGhpZ2hseSBvcHRpbWl6ZWQuCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorUi5yb3coaSkgPSBQLmNvbChqKTsgICAgICAgICAgICAgICAvLyBSKGksIDopID0gUCg6LCBqKQorUi5jb2woajEpLnN3YXAobWF0MS5jb2woajIpKTsgICAgICAvLyBSKDosIFtqMSBqMl0pID0gUig6LCBbajIsIGoxXSkKKworLy8gVmlld3MsIHRyYW5zcG9zZSwgZXRjOworLy8gRWlnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRsYWIKK1IuYWRqb2ludCgpICAgICAgICAgICAgICAgICAgICAgICAgLy8gUicKK1IudHJhbnNwb3NlKCkgICAgICAgICAgICAgICAgICAgICAgLy8gUi4nIG9yIGNvbmooUicpICAgICAgIC8vIFJlYWQtd3JpdGUKK1IuZGlhZ29uYWwoKSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlhZyhSKSAgICAgICAgICAgICAgIC8vIFJlYWQtd3JpdGUKK3guYXNEaWFnb25hbCgpICAgICAgICAgICAgICAgICAgICAgLy8gZGlhZyh4KQorUi50cmFuc3Bvc2UoKS5jb2x3aXNlKCkucmV2ZXJzZSgpICAvLyByb3Q5MChSKSAgICAgICAgICAgICAgLy8gUmVhZC13cml0ZQorUi5yb3d3aXNlKCkucmV2ZXJzZSgpICAgICAgICAgICAgICAvLyBmbGlwbHIoUikKK1IuY29sd2lzZSgpLnJldmVyc2UoKSAgICAgICAgICAgICAgLy8gZmxpcHVkKFIpCitSLnJlcGxpY2F0ZShpLGopICAgICAgICAgICAgICAgICAgIC8vIHJlcG1hdChQLGksaikKKworCisvLyBBbGwgdGhlIHNhbWUgYXMgTWF0bGFiLCBidXQgbWF0bGFiIGRvZXNuJ3QgaGF2ZSAqPSBzdHlsZSBvcGVyYXRvcnMuCisvLyBNYXRyaXgtdmVjdG9yLiAgTWF0cml4LW1hdHJpeC4gICBNYXRyaXgtc2NhbGFyLgoreSAgPSBNKng7ICAgICAgICAgIFIgID0gUCpROyAgICAgICAgUiAgPSBQKnM7CithICA9IGIqTTsgICAgICAgICAgUiAgPSBQIC0gUTsgICAgICBSICA9IHMqUDsKK2EgKj0gTTsgICAgICAgICAgICBSICA9IFAgKyBROyAgICAgIFIgID0gUC9zOworICAgICAgICAgICAgICAgICAgIFIgKj0gUTsgICAgICAgICAgUiAgPSBzKlA7CisgICAgICAgICAgICAgICAgICAgUiArPSBROyAgICAgICAgICBSICo9IHM7CisgICAgICAgICAgICAgICAgICAgUiAtPSBROyAgICAgICAgICBSIC89IHM7CisKKy8vIFZlY3Rvcml6ZWQgb3BlcmF0aW9ucyBvbiBlYWNoIGVsZW1lbnQgaW5kZXBlbmRlbnRseQorLy8gRWlnZW4gICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorUiA9IFAuY3dpc2VQcm9kdWN0KFEpOyAgICAgICAgIC8vIFIgPSBQIC4qIFEKK1IgPSBQLmFycmF5KCkgKiBzLmFycmF5KCk7ICAgICAvLyBSID0gUCAuKiBzCitSID0gUC5jd2lzZVF1b3RpZW50KFEpOyAgICAgICAgLy8gUiA9IFAgLi8gUQorUiA9IFAuYXJyYXkoKSAvIFEuYXJyYXkoKTsgICAgIC8vIFIgPSBQIC4vIFEKK1IgPSBQLmFycmF5KCkgKyBzLmFycmF5KCk7ICAgICAvLyBSID0gUCArIHMKK1IgPSBQLmFycmF5KCkgLSBzLmFycmF5KCk7ICAgICAvLyBSID0gUCAtIHMKK1IuYXJyYXkoKSArPSBzOyAgICAgICAgICAgICAgICAvLyBSID0gUiArIHMKK1IuYXJyYXkoKSAtPSBzOyAgICAgICAgICAgICAgICAvLyBSID0gUiAtIHMKK1IuYXJyYXkoKSA8IFEuYXJyYXkoKTsgICAgICAgICAvLyBSIDwgUQorUi5hcnJheSgpIDw9IFEuYXJyYXkoKTsgICAgICAgIC8vIFIgPD0gUQorUi5jd2lzZUludmVyc2UoKTsgICAgICAgICAgICAgIC8vIDEgLi8gUAorUi5hcnJheSgpLmludmVyc2UoKTsgICAgICAgICAgIC8vIDEgLi8gUAorUi5hcnJheSgpLnNpbigpICAgICAgICAgICAgICAgIC8vIHNpbihQKQorUi5hcnJheSgpLmNvcygpICAgICAgICAgICAgICAgIC8vIGNvcyhQKQorUi5hcnJheSgpLnBvdyhzKSAgICAgICAgICAgICAgIC8vIFAgLl4gcworUi5hcnJheSgpLnNxdWFyZSgpICAgICAgICAgICAgIC8vIFAgLl4gMgorUi5hcnJheSgpLmN1YmUoKSAgICAgICAgICAgICAgIC8vIFAgLl4gMworUi5jd2lzZVNxcnQoKSAgICAgICAgICAgICAgICAgIC8vIHNxcnQoUCkKK1IuYXJyYXkoKS5zcXJ0KCkgICAgICAgICAgICAgICAvLyBzcXJ0KFApCitSLmFycmF5KCkuZXhwKCkgICAgICAgICAgICAgICAgLy8gZXhwKFApCitSLmFycmF5KCkubG9nKCkgICAgICAgICAgICAgICAgLy8gbG9nKFApCitSLmN3aXNlTWF4KFApICAgICAgICAgICAgICAgICAgLy8gbWF4KFIsIFApCitSLmFycmF5KCkubWF4KFAuYXJyYXkoKSkgICAgICAgLy8gbWF4KFIsIFApCitSLmN3aXNlTWluKFApICAgICAgICAgICAgICAgICAgLy8gbWluKFIsIFApCitSLmFycmF5KCkubWluKFAuYXJyYXkoKSkgICAgICAgLy8gbWluKFIsIFApCitSLmN3aXNlQWJzKCkgICAgICAgICAgICAgICAgICAgLy8gYWJzKFApCitSLmFycmF5KCkuYWJzKCkgICAgICAgICAgICAgICAgLy8gYWJzKFApCitSLmN3aXNlQWJzMigpICAgICAgICAgICAgICAgICAgLy8gYWJzKFAuXjIpCitSLmFycmF5KCkuYWJzMigpICAgICAgICAgICAgICAgLy8gYWJzKFAuXjIpCisoUi5hcnJheSgpIDwgcykuc2VsZWN0KFAsUSApOyAgLy8gKFIgPCBzID8gUCA6IFEpCitSID0gKFEuYXJyYXkoKT09MCkuc2VsZWN0KFAsUikgLy8gUihRPT0wKSA9IFAoUT09MCkKK1IgPSBQLnVuYXJ5RXhwcihwdHJfZnVuKGZ1bmMpKSAvLyBSID0gYXJyYXlmdW4oZnVuYywgUCkgICAvLyB3aXRoOiBzY2FsYXIgZnVuYyhjb25zdCBzY2FsYXIgJngpOworCisKKy8vIFJlZHVjdGlvbnMuCitpbnQgciwgYzsKKy8vIEVpZ2VuICAgICAgICAgICAgICAgICAgLy8gTWF0bGFiCitSLm1pbkNvZWZmKCkgICAgICAgICAgICAgIC8vIG1pbihSKDopKQorUi5tYXhDb2VmZigpICAgICAgICAgICAgICAvLyBtYXgoUig6KSkKK3MgPSBSLm1pbkNvZWZmKCZyLCAmYykgICAgLy8gW3MsIGldID0gbWluKFIoOikpOyBbciwgY10gPSBpbmQyc3ViKHNpemUoUiksIGkpOworcyA9IFIubWF4Q29lZmYoJnIsICZjKSAgICAvLyBbcywgaV0gPSBtYXgoUig6KSk7IFtyLCBjXSA9IGluZDJzdWIoc2l6ZShSKSwgaSk7CitSLnN1bSgpICAgICAgICAgICAgICAgICAgIC8vIHN1bShSKDopKQorUi5jb2x3aXNlKCkuc3VtKCkgICAgICAgICAvLyBzdW0oUikKK1Iucm93d2lzZSgpLnN1bSgpICAgICAgICAgLy8gc3VtKFIsIDIpIG9yIHN1bShSJyknCitSLnByb2QoKSAgICAgICAgICAgICAgICAgIC8vIHByb2QoUig6KSkKK1IuY29sd2lzZSgpLnByb2QoKSAgICAgICAgLy8gcHJvZChSKQorUi5yb3d3aXNlKCkucHJvZCgpICAgICAgICAvLyBwcm9kKFIsIDIpIG9yIHByb2QoUicpJworUi50cmFjZSgpICAgICAgICAgICAgICAgICAvLyB0cmFjZShSKQorUi5hbGwoKSAgICAgICAgICAgICAgICAgICAvLyBhbGwoUig6KSkKK1IuY29sd2lzZSgpLmFsbCgpICAgICAgICAgLy8gYWxsKFIpCitSLnJvd3dpc2UoKS5hbGwoKSAgICAgICAgIC8vIGFsbChSLCAyKQorUi5hbnkoKSAgICAgICAgICAgICAgICAgICAvLyBhbnkoUig6KSkKK1IuY29sd2lzZSgpLmFueSgpICAgICAgICAgLy8gYW55KFIpCitSLnJvd3dpc2UoKS5hbnkoKSAgICAgICAgIC8vIGFueShSLCAyKQorCisvLyBEb3QgcHJvZHVjdHMsIG5vcm1zLCBldGMuCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgoreC5ub3JtKCkgICAgICAgICAgICAgICAgICAvLyBub3JtKHgpLiAgICBOb3RlIHRoYXQgbm9ybShSKSBkb2Vzbid0IHdvcmsgaW4gRWlnZW4uCit4LnNxdWFyZWROb3JtKCkgICAgICAgICAgIC8vIGRvdCh4LCB4KSAgIE5vdGUgdGhlIGVxdWl2YWxlbmNlIGlzIG5vdCB0cnVlIGZvciBjb21wbGV4Cit4LmRvdCh5KSAgICAgICAgICAgICAgICAgIC8vIGRvdCh4LCB5KQoreC5jcm9zcyh5KSAgICAgICAgICAgICAgICAvLyBjcm9zcyh4LCB5KSBSZXF1aXJlcyAjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKKy8vLy8gVHlwZSBjb252ZXJzaW9uCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorQS5jYXN0PGRvdWJsZT4oKTsgICAgICAgICAvLyBkb3VibGUoQSkKK0EuY2FzdDxmbG9hdD4oKTsgICAgICAgICAgLy8gc2luZ2xlKEEpCitBLmNhc3Q8aW50PigpOyAgICAgICAgICAgIC8vIGludDMyKEEpCitBLnJlYWwoKTsgICAgICAgICAgICAgICAgIC8vIHJlYWwoQSkKK0EuaW1hZygpOyAgICAgICAgICAgICAgICAgLy8gaW1hZyhBKQorLy8gaWYgdGhlIG9yaWdpbmFsIHR5cGUgZXF1YWxzIGRlc3RpbmF0aW9uIHR5cGUsIG5vIHdvcmsgaXMgZG9uZQorCisvLyBOb3RlIHRoYXQgZm9yIG1vc3Qgb3BlcmF0aW9ucyBFaWdlbiByZXF1aXJlcyBhbGwgb3BlcmFuZHMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlOgorTWF0cml4WGYgRiA9IE1hdHJpeFhmOjpaZXJvKDMsMyk7CitBICs9IEY7ICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgaW4gRWlnZW4uIEluIE1hdGxhYiBBID0gQStGIGlzIGFsbG93ZWQKK0EgKz0gRi5jYXN0PGRvdWJsZT4oKTsgLy8gRiBjb252ZXJ0ZWQgdG8gZG91YmxlIGFuZCB0aGVuIGFkZGVkIChnZW5lcmFsbHksIGNvbnZlcnNpb24gaGFwcGVucyBvbi10aGUtZmx5KQorCisvLyBFaWdlbiBjYW4gbWFwIGV4aXN0aW5nIG1lbW9yeSBpbnRvIEVpZ2VuIG1hdHJpY2VzLgorZmxvYXQgYXJyYXlbM107CitWZWN0b3IzZjo6TWFwKGFycmF5KS5maWxsKDEwKTsgICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgTWFwIG92ZXIgYXJyYXkgYW5kIHNldHMgZW50cmllcyB0byAxMAoraW50IGRhdGFbNF0gPSB7MSwgMiwgMywgNH07CitNYXRyaXgyaSBtYXQyeDIoZGF0YSk7ICAgICAgICAgICAgICAgICAgICAvLyBjb3BpZXMgZGF0YSBpbnRvIG1hdDJ4MgorTWF0cml4Mmk6Ok1hcChkYXRhKSA9IDIqbWF0MngyOyAgICAgICAgICAgLy8gb3ZlcndyaXRlIGVsZW1lbnRzIG9mIGRhdGEgd2l0aCAyKm1hdDJ4MgorTWF0cml4WGk6Ok1hcChkYXRhLCAyLCAyKSArPSBtYXQyeDI7ICAgICAgLy8gYWRkcyBtYXQyeDIgdG8gZWxlbWVudHMgb2YgZGF0YSAoYWx0ZXJuYXRpdmUgc3ludGF4IGlmIHNpemUgaXMgbm90IGtub3cgYXQgY29tcGlsZSB0aW1lKQorCisvLyBTb2x2ZSBBeCA9IGIuIFJlc3VsdCBzdG9yZWQgaW4geC4gTWF0bGFiOiB4ID0gQSBcIGIuCit4ID0gQS5sZGx0KCkuc29sdmUoYikpOyAgLy8gQSBzeW0uIHAucy5kLiAgICAjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+Cit4ID0gQS5sbHQoKSAuc29sdmUoYikpOyAgLy8gQSBzeW0uIHAuZC4gICAgICAjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+Cit4ID0gQS5sdSgpICAuc29sdmUoYikpOyAgLy8gU3RhYmxlIGFuZCBmYXN0LiAjaW5jbHVkZSA8RWlnZW4vTFU+Cit4ID0gQS5xcigpICAuc29sdmUoYikpOyAgLy8gTm8gcGl2b3RpbmcuICAgICAjaW5jbHVkZSA8RWlnZW4vUVI+Cit4ID0gQS5zdmQoKSAuc29sdmUoYikpOyAgLy8gU3RhYmxlLCBzbG93ZXN0LiAjaW5jbHVkZSA8RWlnZW4vU1ZEPgorLy8gLmxkbHQoKSAtPiAubWF0cml4TCgpIGFuZCAubWF0cml4RCgpCisvLyAubGx0KCkgIC0+IC5tYXRyaXhMKCkKKy8vIC5sdSgpICAgLT4gLm1hdHJpeEwoKSBhbmQgLm1hdHJpeFUoKQorLy8gLnFyKCkgICAtPiAubWF0cml4USgpIGFuZCAubWF0cml4UigpCisvLyAuc3ZkKCkgIC0+IC5tYXRyaXhVKCksIC5zaW5ndWxhclZhbHVlcygpLCBhbmQgLm1hdHJpeFYoKQorCisvLyBFaWdlbnZhbHVlIHByb2JsZW1zCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0bGFiCitBLmVpZ2VudmFsdWVzKCk7ICAgICAgICAgICAgICAgICAgLy8gZWlnKEEpOworRWlnZW5Tb2x2ZXI8TWF0cml4M2Q+IGVpZyhBKTsgICAgIC8vIFt2ZWMgdmFsXSA9IGVpZyhBKQorZWlnLmVpZ2VudmFsdWVzKCk7ICAgICAgICAgICAgICAgIC8vIGRpYWcodmFsKQorZWlnLmVpZ2VudmVjdG9ycygpOyAgICAgICAgICAgICAgIC8vIHZlYworLy8gRm9yIHNlbGYtYWRqb2ludCBtYXRyaWNlcyB1c2UgU2VsZkFkam9pbnRFaWdlblNvbHZlcjw+CmRpZmYgLS1naXQgYS9kb2MvQjAxX0V4cGVyaW1lbnRhbC5kb3ggYi9kb2MvQjAxX0V4cGVyaW1lbnRhbC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmMDMxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9CMDFfRXhwZXJpbWVudGFsLmRveApAQCAtMCwwICsxLDUyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgRXhwZXJpbWVudGFsIEV4cGVyaW1lbnRhbCBwYXJ0cyBvZiBFaWdlbgorCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIEV4cGVyaW1lbnRhbF9zdW1tYXJ5IFN1bW1hcnkKKworV2l0aCB0aGUgMi4wIHJlbGVhc2UsIEVpZ2VuJ3MgQVBJIGlzLCB0byBhIGxhcmdlIGV4dGVudCwgc3RhYmxlLiBIb3dldmVyLCB3ZSB3aXNoIHRvIHJldGFpbiB0aGUgZnJlZWRvbSB0byBtYWtlIEFQSSBpbmNvbXBhdGlibGUgY2hhbmdlcy4gVG8gdGhhdCBlZmZlY3QsIHdlIGNhbGwgbWFueSBwYXJ0cyBvZiBFaWdlbiAiZXhwZXJpbWVudGFsIiB3aGljaCBtZWFucyB0aGF0IHRoZXkgYXJlIG5vdCBzdWJqZWN0IHRvIEFQSSBzdGFiaWxpdHkgZ3VhcmFudGVlLgorCitPdXIgZ29hbCBpcyB0aGF0IGZvciB0aGUgMi4xIHJlbGVhc2UgKGV4cGVjdGVkIGluIEp1bHkgMjAwOSkgbW9zdCBvZiB0aGVzZSBwYXJ0cyBiZWNvbWUgQVBJLXN0YWJsZSB0b28uCisKK1dlIGFyZSBhd2FyZSB0aGF0IEFQSSBzdGFiaWxpdHkgaXMgYSBtYWpvciBjb25jZXJuIGZvciBvdXIgdXNlcnMuIFRoYXQncyB3aHkgaXQncyBhIHByaW9yaXR5IGZvciB1cyB0byByZWFjaCBpdCwgYnV0IGF0IHRoZSBzYW1lIHRpbWUgd2UncmUgYmVpbmcgc2VyaW91cyBhYm91dCBub3QgY2FsbGluZyBFaWdlbiBBUEktc3RhYmxlIHRvbyBlYXJseS4KKworRXhwZXJpbWVudGFsIGZlYXR1cmVzIG1heSBhdCBhbnkgdGltZToKK1xsaSBiZSByZW1vdmVkOworXGxpIGJlIHN1YmplY3QgdG8gYW4gQVBJIGluY29tcGF0aWJsZSBjaGFuZ2U7CitcbGkgaW50cm9kdWNlIEFQSSBvciBBQkkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4geW91ciBvd24gY29kZSBpZiB5b3UgbGV0IHRoZW0gYWZmZWN0IHlvdXIgQVBJIG9yIEFCSS4KKworXHNlY3Rpb24gRXhwZXJpbWVudGFsX21vZHVsZXMgRXhwZXJpbWVudGFsIG1vZHVsZXMKKworVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBjb25zaWRlcmVkIGVudGlyZWx5IGV4cGVyaW1lbnRhbCwgYW5kIHdlIG1ha2Ugbm8gZmlybSBBUEkgc3RhYmlsaXR5IGd1YXJhbnRlZSBhYm91dCB0aGVtIGZvciB0aGUgdGltZSBiZWluZzoKK1xsaSBTVkQKK1xsaSBRUgorXGxpIENob2xlc2t5CitcbGkgU3BhcnNlCitcbGkgR2VvbWV0cnkgKHRoaXMgb25lIHNob3VsZCBiZSBtb3N0bHkgc3RhYmxlLCBidXQgaXQncyBhIGxpdHRsZSB0b28gZWFybHkgdG8gbWFrZSBhIGZvcm1hbCBndWFyYW50ZWUpCisKK1xzZWN0aW9uIEV4cGVyaW1lbnRhbF9jb3JlIEV4cGVyaW1lbnRhbCBwYXJ0cyBvZiB0aGUgQ29yZSBtb2R1bGUKKworSW4gdGhlIENvcmUgbW9kdWxlLCB0aGUgb25seSBjbGFzc2VzIHN1YmplY3QgdG8gQUJJIHN0YWJpbGl0eSBndWFyYW50ZWUgKG1lYW5pbmcgdGhhdCB5b3UgY2FuIHVzZSBpdCBmb3IgZGF0YSBtZW1iZXJzIGluIHlvdXIgcHVibGljIEFCSSkgaXM6CitcbGkgTWF0cml4CitcbGkgTWFwCisKK0FsbCBvdGhlciBjbGFzc2VzIG9mZmVyIG5vIEFCSSBndWFyYW50ZWUsIGUuZy4gdGhlIGxheW91dCBvZiB0aGVpciBkYXRhIGNhbiBiZSBjaGFuZ2VkLgorCitUaGUgb25seSBjbGFzc2VzIHN1YmplY3QgdG8gKGV2ZW4gcGFydGlhbCkgQVBJIHN0YWJpbGl0eSBndWFyYW50ZWUgKG1lYW5pbmcgdGhhdCB5b3UgY2FuIHNhZmVseSBjb25zdHJ1Y3QgYW5kIHVzZSBvYmplY3RzKSBhcmU6CitcbGkgTWF0cml4QmFzZSA6IHBhcnRpYWwgQVBJIHN0YWJpbGl0eSAoc2VlIGJlbG93KQorXGxpIE1hdHJpeCA6IGZ1bGwgQVBJIHN0YWJpbGl0eSAoZXhjZXB0IGZvciBleHBlcmltZW50YWwgc3R1ZmYgaW5oZXJpdGVkIGZyb20gTWF0cml4QmFzZSkKK1xsaSBNYXAgOiBmdWxsIEFQSSBzdGFiaWxpdHkgKGV4Y2VwdCBmb3IgZXhwZXJpbWVudGFsIHN0dWZmIGluaGVyaXRlZCBmcm9tIE1hdHJpeEJhc2UpCisKK0FsbCBvdGhlciBjbGFzc2VzIG9mZmVyIG5vIGRpcmVjdCBBUEkgZ3VhcmFudGVlLCBlLmcuIHRoZWlyIG1ldGhvZHMgY2FuIGJlIGNoYW5nZWQ7IGhvd2V2ZXIgbm90aWNlIHRoYXQgbW9zdCBjbGFzc2VzIGluaGVyaXQgTWF0cml4QmFzZSBhbmQgdGhhdCB0aGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlaXIgQVBJIGNvbWVzIGZyb20gLS0gc28gaW4gcHJhY3RpY2UgbW9zdCBvZiB0aGUgQVBJIGlzIHN0YWJsZS4KKworQSBmZXcgTWF0cml4QmFzZSBtZXRob2RzIGFyZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCwgaGVuY2Ugbm90IHBhcnQgb2YgYW55IEFQSSBzdGFiaWxpdHkgZ3VhcmFudGVlOgorXGxpIGFsbCBtZXRob2RzIGRvY3VtZW50ZWQgYXMgaW50ZXJuYWwKK1xsaSBhbGwgbWV0aG9kcyBoaWRkZW4gaW4gdGhlIERveHlnZW4gZG9jdW1lbnRhdGlvbgorXGxpIGFsbCBtZXRob2RzIG1hcmtlZCBhcyBleHBlcmltZW50YWwKK1xsaSBhbGwgbWV0aG9kcyBkZWZpbmVkIGluIGV4cGVyaW1lbnRhbCBtb2R1bGVzCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DTWFrZUxpc3RzLnR4dCBiL2RvYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQxM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTEyIEBACitwcm9qZWN0KEVpZ2VuRG9jKQorCitzZXRfZGlyZWN0b3J5X3Byb3BlcnRpZXMoUFJPUEVSVElFUyBFWENMVURFX0ZST01fQUxMIFRSVUUpCisKK3Byb2plY3QoRWlnZW5Eb2MpCisKK2lmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCkKKyAgaWYoQ01BS0VfU1lTVEVNX05BTUUgTUFUQ0hFUyBMaW51eCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLU8xIC1nMSIpCisgIGVuZGlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgTGludXgpCitlbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisKK29wdGlvbihFSUdFTl9JTlRFUk5BTF9ET0NVTUVOVEFUSU9OICJCdWlsZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIiBPRkYpCisKKworIyBTZXQgc29tZSBEb3h5Z2VuIGZsYWdzCitzZXQoRUlHRU5fRE9YWV9QUk9KRUNUX05BTUUgICAgICAgICAgICAgIkVpZ2VuIikKK3NldChFSUdFTl9ET1hZX09VVFBVVF9ESVJFQ1RPUllfU1VGRklYICAiIikKK3NldChFSUdFTl9ET1hZX0lOUFVUICAgICAgICAgICAgICAgICAgICAiXCIke0VpZ2VuX1NPVVJDRV9ESVJ9L0VpZ2VuXCIgXCIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvY1wiIikKK3NldChFSUdFTl9ET1hZX0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgICAiMjIwIikKK3NldChFSUdFTl9ET1hZX1RBR0ZJTEVTICAgICAgICAgICAgICAgICAiIikKK2lmKEVJR0VOX0lOVEVSTkFMX0RPQ1VNRU5UQVRJT04pCisgIHNldChFSUdFTl9ET1hZX0lOVEVSTkFMICAgICAgICAgICAgICAgICAiWUVTIikKK2Vsc2UoRUlHRU5fSU5URVJOQUxfRE9DVU1FTlRBVElPTikKKyAgc2V0KEVJR0VOX0RPWFlfSU5URVJOQUwgICAgICAgICAgICAgICAgICJOTyIpCitlbmRpZihFSUdFTl9JTlRFUk5BTF9ET0NVTUVOVEFUSU9OKQorCitjb25maWd1cmVfZmlsZSgKKyAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0RveHlmaWxlLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9Eb3h5ZmlsZQorKQorCitzZXQoRUlHRU5fRE9YWV9QUk9KRUNUX05BTUUgICAgICAgICAgICAgIkVpZ2VuLXVuc3VwcG9ydGVkIikKK3NldChFSUdFTl9ET1hZX09VVFBVVF9ESVJFQ1RPUllfU1VGRklYICAiL3Vuc3VwcG9ydGVkIikKK3NldChFSUdFTl9ET1hZX0lOUFVUICAgICAgICAgICAgICAgICAgICAiXCIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuXCIgXCIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Vuc3VwcG9ydGVkL2RvY1wiIikKK3NldChFSUdFTl9ET1hZX0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgICAiMCIpCisjIHNldChFSUdFTl9ET1hZX1RBR0ZJTEVTICAgICAgICAgICAgICAgICAiXCIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9laWdlbi5kb3h5dGFncyA9Li4vXCIiKQorc2V0KEVJR0VOX0RPWFlfVEFHRklMRVMgICAgICAgICAgICAgICAgICIiKQorCitjb25maWd1cmVfZmlsZSgKKyAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0RveHlmaWxlLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9Eb3h5ZmlsZS11bnN1cHBvcnRlZAorKQorCitjb25maWd1cmVfZmlsZSgKKyAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2VpZ2VuZG94eV9oZWFkZXIuaHRtbC5pbgorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZWlnZW5kb3h5X2hlYWRlci5odG1sCispCisKK2NvbmZpZ3VyZV9maWxlKAorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZWlnZW5kb3h5X2Zvb3Rlci5odG1sLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9laWdlbmRveHlfZm9vdGVyLmh0bWwKKykKKworY29uZmlndXJlX2ZpbGUoCisgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9laWdlbmRveHlfbGF5b3V0LnhtbC5pbgorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZWlnZW5kb3h5X2xheW91dC54bWwKKykKKworY29uZmlndXJlX2ZpbGUoCisgICR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL2VpZ2VuZG94eV9sYXlvdXQueG1sLmluCisgICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL3Vuc3VwcG9ydGVkL2VpZ2VuZG94eV9sYXlvdXQueG1sCispCisKK3NldChleGFtcGxlc190YXJnZXRzICIiKQorc2V0KHNuaXBwZXRzX3RhcmdldHMgIiIpCisKK2FkZF9kZWZpbml0aW9ucygiLURFSUdFTl9NQUtJTkdfRE9DUyIpCithZGRfY3VzdG9tX3RhcmdldChhbGxfZXhhbXBsZXMpCisKK2FkZF9zdWJkaXJlY3RvcnkoZXhhbXBsZXMpCithZGRfc3ViZGlyZWN0b3J5KHNwZWNpYWxfZXhhbXBsZXMpCithZGRfc3ViZGlyZWN0b3J5KHNuaXBwZXRzKQorCithZGRfY3VzdG9tX3RhcmdldCgKKyAgZG9jLWVpZ2VuLXByZXJlcXVpc2l0ZXMKKyAgQUxMCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaHRtbC8KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2VpZ2VuX25hdnRyZWVfaGFja3MuanMgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9odG1sLworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vRWlnZW5fU2lsbHlfUHJvZmVzc29yXzY0eDY0LnBuZyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9mdHYycG5vZGUucG5nICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaHRtbC8KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2Z0djJub2RlLnBuZyAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9odG1sLworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQXNjaWlRdWlja1JlZmVyZW5jZS50eHQgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvCisgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorKQorCithZGRfY3VzdG9tX3RhcmdldCgKKyAgZG9jLXVuc3VwcG9ydGVkLXByZXJlcXVpc2l0ZXMKKyAgQUxMCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sL3Vuc3VwcG9ydGVkCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9laWdlbl9uYXZ0cmVlX2hhY2tzLmpzICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaHRtbC91bnN1cHBvcnRlZC8KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0VpZ2VuX1NpbGx5X1Byb2Zlc3Nvcl82NHg2NC5wbmcgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9odG1sL3Vuc3VwcG9ydGVkLworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZnR2MnBub2RlLnBuZyAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvdW5zdXBwb3J0ZWQvCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9mdHYybm9kZS5wbmcgICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaHRtbC91bnN1cHBvcnRlZC8KKyAgV09SS0lOR19ESVJFQ1RPUlkgJHtFaWdlbl9CSU5BUllfRElSfS9kb2MKKykKKworYWRkX2RlcGVuZGVuY2llcyhkb2MtZWlnZW4tcHJlcmVxdWlzaXRlcyBhbGxfc25pcHBldHMgYWxsX2V4YW1wbGVzKQorYWRkX2RlcGVuZGVuY2llcyhkb2MtdW5zdXBwb3J0ZWQtcHJlcmVxdWlzaXRlcyB1bnN1cHBvcnRlZF9zbmlwcGV0cyB1bnN1cHBvcnRlZF9leGFtcGxlcykKKworYWRkX2N1c3RvbV90YXJnZXQoZG9jIEFMTAorICBDT01NQU5EIGRveHlnZW4KKyAgQ09NTUFORCBkb3h5Z2VuIERveHlmaWxlLXVuc3VwcG9ydGVkCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2h0bWwvZ3JvdXBfX1RvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQuaHRtbCAke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sL1RvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQuaHRtbAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVuYW1lIGh0bWwgZWlnZW4tZG9jCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgZWlnZW4tZG9jL2VpZ2VuLWRvYy50Z3oKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRhciBjZnogZWlnZW4tZG9jLnRneiBlaWdlbi1kb2MKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHJlbmFtZSBlaWdlbi1kb2MudGd6IGVpZ2VuLWRvYy9laWdlbi1kb2MudGd6CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW5hbWUgZWlnZW4tZG9jIGh0bWwKKyAgV09SS0lOR19ESVJFQ1RPUlkgJHtFaWdlbl9CSU5BUllfRElSfS9kb2MpCisKK2FkZF9kZXBlbmRlbmNpZXMoZG9jIGRvYy1laWdlbi1wcmVyZXF1aXNpdGVzIGRvYy11bnN1cHBvcnRlZC1wcmVyZXF1aXNpdGVzKQpkaWZmIC0tZ2l0IGEvZG9jL0NsYXNzSGllcmFyY2h5LmRveCBiL2RvYy9DbGFzc0hpZXJhcmNoeS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4ZTYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DbGFzc0hpZXJhcmNoeS5kb3gKQEAgLTAsMCArMSwxMjkgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0NsYXNzSGllcmFyY2h5IFRoZSBjbGFzcyBoaWVyYXJjaHkKKworVGhpcyBwYWdlIGV4cGxhaW5zIHRoZSBkZXNpZ24gb2YgdGhlIGNvcmUgY2xhc3NlcyBpbiBFaWdlbidzIGNsYXNzIGhpZXJhcmNoeSBhbmQgaG93IHRoZXkgZml0IHRvZ2V0aGVyLiBDYXN1YWwKK3VzZXJzIHByb2JhYmx5IG5lZWQgbm90IGNvbmNlcm4gdGhlbXNlbHZlcyB3aXRoIHRoZXNlIGRldGFpbHMsIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIGZvciBib3RoIGFkdmFuY2VkIHVzZXJzCithbmQgRWlnZW4gZGV2ZWxvcGVycy4KKworXGVpZ2VuQXV0b1RvYworCisKK1xzZWN0aW9uIFRvcGljQ2xhc3NIaWVyYXJjaHlQcmluY2lwbGVzIFByaW5jaXBsZXMKKworRWlnZW4ncyBjbGFzcyBoaWVyYXJjaHkgaXMgZGVzaWduZWQgc28gdGhhdCB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgYXZvaWRlZCB3aGVyZSB0aGVpciBvdmVyaGVhZCB3b3VsZAorc2lnbmlmaWNhbnRseSBpbXBhaXIgcGVyZm9ybWFuY2UuIEluc3RlYWQsIEVpZ2VuIGFjaGlldmVzIHBvbHltb3JwaGlzbSB3aXRoIHRoZSBDdXJpb3VzbHkgUmVjdXJyaW5nIFRlbXBsYXRlCitQYXR0ZXJuIChDUlRQKS4gSW4gdGhpcyBwYXR0ZXJuLCB0aGUgYmFzZSBjbGFzcyAoZm9yIGluc3RhbmNlLCBcYyBNYXRyaXhCYXNlKSBpcyBpbiBmYWN0IGEgdGVtcGxhdGUgY2xhc3MsIGFuZAordGhlIGRlcml2ZWQgY2xhc3MgKGZvciBpbnN0YW5jZSwgXGMgTWF0cml4KSBpbmhlcml0cyB0aGUgYmFzZSBjbGFzcyB3aXRoIHRoZSBkZXJpdmVkIGNsYXNzIGl0c2VsZiBhcyBhCit0ZW1wbGF0ZSBhcmd1bWVudCAoaW4gdGhpcyBjYXNlLCBcYyBNYXRyaXggaW5oZXJpdHMgZnJvbSBcYyBNYXRyaXhCYXNlJmx0O01hdHJpeCZndDspLiBUaGlzIGFsbG93cyBFaWdlbiB0bworcmVzb2x2ZSB0aGUgcG9seW1vcnBoaWMgZnVuY3Rpb24gY2FsbHMgYXQgY29tcGlsZSB0aW1lLgorCitJbiBhZGRpdGlvbiwgdGhlIGRlc2lnbiBhdm9pZHMgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIE9uZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBpbiBvdXIgZXhwZXJpZW5jZSwgc29tZQorY29tcGlsZXJzIChsaWtlIE1TVkMpIGZhaWwgdG8gcGVyZm9ybSBlbXB0eSBiYXNlIGNsYXNzIG9wdGltaXphdGlvbiwgd2hpY2ggaXMgY3J1Y2lhbCBmb3Igb3VyIGZpeGVkLXNpemUKK3R5cGVzLgorCisKK1xzZWN0aW9uIFRvcGljQ2xhc3NIaWVyYXJjaHlDb3JlQ2xhc3NlcyBUaGUgY29yZSBjbGFzc2VzCisKK1RoZXNlIGFyZSB0aGUgY2xhc3NlcyB0aGF0IHlvdSBuZWVkIHRvIGtub3cgYWJvdXQgaWYgeW91IHdhbnQgdG8gd3JpdGUgZnVuY3Rpb25zIHRoYXQgYWNjZXB0IG9yIHJldHVybiBFaWdlbgorb2JqZWN0cy4KKworICAtIE1hdHJpeCBtZWFucyBwbGFpbiBkZW5zZSBtYXRyaXguIElmIFxjIG0gaXMgYSBcYyAlTWF0cml4LCB0aGVuLCBmb3IgaW5zdGFuY2UsIFxjIG0rbSBpcyBubyBsb25nZXIgYSAKKyAgICBcYyAlTWF0cml4LCBpdCBpcyBhICJtYXRyaXggZXhwcmVzc2lvbiIuCisgIC0gTWF0cml4QmFzZSBtZWFucyBkZW5zZSBtYXRyaXggZXhwcmVzc2lvbi4gVGhpcyBtZWFucyB0aGF0IGEgXGMgJU1hdHJpeEJhc2UgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlCisgICAgYWRkZWQsIG1hdHJpeC1tdWx0aXBsaWVkLCBMVS1kZWNvbXBvc2VkLCBRUi1kZWNvbXBvc2VkLi4uIEFsbCBtYXRyaXggZXhwcmVzc2lvbiBjbGFzc2VzLCBpbmNsdWRpbmcgCisgICAgXGMgJU1hdHJpeCBpdHNlbGYsIGluaGVyaXQgXGMgJU1hdHJpeEJhc2UuCisgIC0gQXJyYXkgbWVhbnMgcGxhaW4gZGVuc2UgYXJyYXkuIElmIFxjIHggaXMgYW4gXGMgJUFycmF5LCB0aGVuLCBmb3IgaW5zdGFuY2UsIFxjIHgreCBpcyBubyBsb25nZXIgYW4gCisgICAgXGMgJUFycmF5LCBpdCBpcyBhbiAiYXJyYXkgZXhwcmVzc2lvbiIuCisgIC0gQXJyYXlCYXNlIG1lYW5zIGRlbnNlIGFycmF5IGV4cHJlc3Npb24uIFRoaXMgbWVhbnMgdGhhdCBhbiBcYyAlQXJyYXlCYXNlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZQorICAgIGFkZGVkLCBhcnJheS1tdWx0aXBsaWVkLCBhbmQgb24gd2hpY2ggeW91IGNhbiBwZXJmb3JtIGFsbCBzb3J0cyBvZiBhcnJheSBvcGVyYXRpb25zLi4uIEFsbCBhcnJheQorICAgIGV4cHJlc3Npb24gY2xhc3NlcywgaW5jbHVkaW5nIFxjICVBcnJheSBpdHNlbGYsIGluaGVyaXQgXGMgJUFycmF5QmFzZS4KKyAgLSBEZW5zZUJhc2UgbWVhbnMgZGVuc2UgKG1hdHJpeCBvciBhcnJheSkgZXhwcmVzc2lvbi4gQm90aCBcYyAlQXJyYXlCYXNlIGFuZCBcYyAlTWF0cml4QmFzZSBpbmhlcml0CisgICAgXGMgJURlbnNlQmFzZS4gXGMgJURlbnNlQmFzZSBpcyB3aGVyZSBhbGwgdGhlIG1ldGhvZHMgZ28gdGhhdCBhcHBseSB0byBkZW5zZSBleHByZXNzaW9ucyByZWdhcmRsZXNzIG9mCisgICAgd2hldGhlciB0aGV5IGFyZSBtYXRyaXggb3IgYXJyYXkgZXhwcmVzc2lvbnMuIEZvciBleGFtcGxlLCB0aGUgXGxpbmsgRGVuc2VCYXNlOjpibG9jaygpIGJsb2NrKC4uLikgXGVuZGxpbmsKKyAgICBtZXRob2RzIGFyZSBpbiBcYyAlRGVuc2VCYXNlLgorCitcc2VjdGlvbiBUb3BpY0NsYXNzSGllcmFyY2h5QmFzZUNsYXNzZXMgQmFzZSBjbGFzc2VzCisKK1RoZXNlIGNsYXNzZXMgc2VydmUgYXMgYmFzZSBjbGFzc2VzIGZvciB0aGUgZml2ZSBjb3JlIGNsYXNzZXMgbWVudGlvbmVkIGFib3ZlLiBUaGV5IGFyZSBtb3JlIGludGVybmFsIGFuZCBzbworbGVzcyBpbnRlcmVzdGluZyBmb3IgdXNlcnMgb2YgdGhlIEVpZ2VuIGxpYnJhcnkuCisKKyAgLSBQbGFpbk9iamVjdEJhc2UgbWVhbnMgZGVuc2UgKG1hdHJpeCBvciBhcnJheSkgcGxhaW4gb2JqZWN0LCBpLmUuIHNvbWV0aGluZyB0aGF0IHN0b3JlcyBpdHMgb3duIGRlbnNlCisgICAgYXJyYXkgb2YgY29lZmZpY2llbnRzLiBUaGlzIGlzIHdoZXJlLCBmb3IgaW5zdGFuY2UsIHRoZSBcbGluayBQbGFpbk9iamVjdEJhc2U6OnJlc2l6ZSgpIHJlc2l6ZSgpIFxlbmRsaW5rCisgICAgbWV0aG9kcyBnby4gXGMgJVBsYWluT2JqZWN0QmFzZSBpcyBpbmhlcml0ZWQgYnkgXGMgJU1hdHJpeCBhbmQgYnkgXGMgJUFycmF5LiBCdXQgYWJvdmUsIHdlIHNhaWQgdGhhdCAKKyAgICBcYyAlTWF0cml4IGluaGVyaXRzIFxjICVNYXRyaXhCYXNlIGFuZCBcYyAlQXJyYXkgaW5oZXJpdHMgXGMgJUFycmF5QmFzZS4gU28gZG9lcyB0aGF0IG1lYW4gbXVsdGlwbGUKKyAgICBpbmhlcml0YW5jZT8gTm8sIGJlY2F1c2UgXGMgJVBsYWluT2JqZWN0QmFzZSBcZSBpdHNlbGYgaW5oZXJpdHMgXGMgJU1hdHJpeEJhc2Ugb3IgXGMgJUFycmF5QmFzZSBkZXBlbmRpbmcKKyAgICBvbiB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgbWF0cml4IG9yIGFycmF5IGNhc2UuIFdoZW4gd2Ugc2FpZCBhYm92ZSB0aGF0IFxjICVNYXRyaXggaW5oZXJpdGVkIAorICAgIFxjICVNYXRyaXhCYXNlLCB3ZSBvbWl0dGVkIHRvIHNheSBpdCBkb2VzIHNvIGluZGlyZWN0bHkgdmlhIFxjICVQbGFpbk9iamVjdEJhc2UuIFNhbWUgZm9yIFxjICVBcnJheS4KKyAgLSBEZW5zZUNvZWZmc0Jhc2UgbWVhbnMgc29tZXRoaW5nIHRoYXQgaGFzIGRlbnNlIGNvZWZmaWNpZW50IGFjY2Vzc29ycy4gSXQgaXMgYSBiYXNlIGNsYXNzIGZvcgorICAgIFxjICVEZW5zZUJhc2UuIFRoZSByZWFzb24gZm9yIFxjICVEZW5zZUNvZWZmc0Jhc2UgdG8gZXhpc3QgaXMgdGhhdCB0aGUgc2V0IG9mIGF2YWlsYWJsZSBjb2VmZmljaWVudAorICAgIGFjY2Vzc29ycyBpcyB2ZXJ5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGRlbnNlIGV4cHJlc3Npb24gaGFzIGRpcmVjdCBtZW1vcnkgYWNjZXNzIG9yIG5vdCAodGhlCisgICAgXGMgRGlyZWN0QWNjZXNzQml0IGZsYWcpLiBGb3IgZXhhbXBsZSwgaWYgXGMgeCBpcyBhIHBsYWluIG1hdHJpeCwgdGhlbiBcYyB4IGhhcyBkaXJlY3QgYWNjZXNzLCBhbmQgCisgICAgXGMgeC50cmFuc3Bvc2UoKSBhbmQgXGMgeC5ibG9jayguLi4pIGFsc28gaGF2ZSBkaXJlY3QgYWNjZXNzLCBiZWNhdXNlIHRoZWlyIGNvZWZmaWNpZW50cyBjYW4gYmUgcmVhZCByaWdodAorICAgIG9mZiBtZW1vcnksIGJ1dCBmb3IgZXhhbXBsZSwgXGMgeCt4IGRvZXMgbm90IGhhdmUgZGlyZWN0IG1lbW9yeSBhY2Nlc3MsIGJlY2F1c2Ugb2J0YWluaW5nIGFueSBvZiBpdHMKKyAgICBjb2VmZmljaWVudHMgcmVxdWlyZXMgYSBjb21wdXRhdGlvbiAoYW4gYWRkaXRpb24pLCBpdCBjYW4ndCBiZSBqdXN0IHJlYWQgb2ZmIG1lbW9yeS4KKyAgLSBFaWdlbkJhc2UgbWVhbnMgYW55dGhpbmcgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGludG8gYSBwbGFpbiBkZW5zZSBtYXRyaXggb3IgYXJyYXkgKGV2ZW4gaWYgdGhhdCB3b3VsZAorICAgIGJlIGEgYmFkIGlkZWEpLiBcYyAlRWlnZW5CYXNlIGlzIHJlYWxseSB0aGUgYWJzb2x1dGUgYmFzZSBjbGFzcyBmb3IgYW55dGhpbmcgdGhhdCByZW1vdGVseSBsb29rcyBsaWtlIGEKKyAgICBtYXRyaXggb3IgYXJyYXkuIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IgXGMgJURlbnNlQ29lZmZzQmFzZSwgc28gaXQgc2l0cyBiZWxvdyBhbGwgb3VyIGRlbnNlIGNsYXNzCisgICAgaGllcmFyY2h5LCBidXQgaXQgaXMgbm90IGxpbWl0ZWQgdG8gZGVuc2UgZXhwcmVzc2lvbnMuIEZvciBleGFtcGxlLCBcYyAlRWlnZW5CYXNlIGlzIGFsc28gaW5oZXJpdGVkIGJ5CisgICAgZGlhZ29uYWwgbWF0cmljZXMsIHNwYXJzZSBtYXRyaWNlcywgZXRjLi4uCisKKworXHNlY3Rpb24gVG9waWNDbGFzc0hpZXJhcmNoeUluaGVyaXRhbmNlRGlhZ3JhbXMgSW5oZXJpdGFuY2UgZGlhZ3JhbXMKKworVGhlIGluaGVyaXRhbmNlIGRpYWdyYW0gZm9yIE1hdHJpeCBsb29rcyBhcyBmb2xsb3dzOgorCis8cHJlPgorRWlnZW5CYXNlJmx0OyVNYXRyaXgmZ3Q7CisgIDwtLSBEZW5zZUNvZWZmc0Jhc2UmbHQ7JU1hdHJpeCZndDsgICAgKGRpcmVjdCBhY2Nlc3MgY2FzZSkKKyAgICA8LS0gRGVuc2VCYXNlJmx0OyVNYXRyaXgmZ3Q7CisgICAgICA8LS0gTWF0cml4QmFzZSZsdDslTWF0cml4Jmd0OworICAgICAgICA8LS0gUGxhaW5PYmplY3RCYXNlJmx0OyVNYXRyaXgmZ3Q7ICAgIChtYXRyaXggY2FzZSkKKyAgICAgICAgICA8LS0gTWF0cml4Cis8L3ByZT4KKworVGhlIGluaGVyaXRhbmNlIGRpYWdyYW0gZm9yIEFycmF5IGxvb2tzIGFzIGZvbGxvd3M6CisKKzxwcmU+CitFaWdlbkJhc2UmbHQ7JUFycmF5Jmd0OworICA8LS0gRGVuc2VDb2VmZnNCYXNlJmx0OyVBcnJheSZndDsgICAgKGRpcmVjdCBhY2Nlc3MgY2FzZSkKKyAgICA8LS0gRGVuc2VCYXNlJmx0OyVBcnJheSZndDsKKyAgICAgIDwtLSBBcnJheUJhc2UmbHQ7JUFycmF5Jmd0OworICAgICAgICA8LS0gUGxhaW5PYmplY3RCYXNlJmx0OyVBcnJheSZndDsgICAgKGFycmF5IGNhc2UpCisgICAgICAgICAgPC0tIEFycmF5Cis8L3ByZT4KKworVGhlIGluaGVyaXRhbmNlIGRpYWdyYW0gZm9yIHNvbWUgb3RoZXIgbWF0cml4IGV4cHJlc3Npb24gY2xhc3MsIGhlcmUgZGVub3RlZCBieSBcYyBTb21lTWF0cml4WHByLCBsb29rcyBhcworZm9sbG93czoKKworPHByZT4KK0VpZ2VuQmFzZSZsdDtTb21lTWF0cml4WHByJmd0OworICA8LS0gRGVuc2VDb2VmZnNCYXNlJmx0O1NvbWVNYXRyaXhYcHImZ3Q7ICAgIChkaXJlY3QgYWNjZXNzIG9yIG5vIGRpcmVjdCBhY2Nlc3MgY2FzZSkKKyAgICA8LS0gRGVuc2VCYXNlJmx0O1NvbWVNYXRyaXhYcHImZ3Q7CisgICAgICA8LS0gTWF0cml4QmFzZSZsdDtTb21lTWF0cml4WHByJmd0OworICAgICAgICA8LS0gU29tZU1hdHJpeFhwcgorPC9wcmU+CisKK1RoZSBpbmhlcml0YW5jZSBkaWFncmFtIGZvciBzb21lIG90aGVyIGFycmF5IGV4cHJlc3Npb24gY2xhc3MsIGhlcmUgZGVub3RlZCBieSBcYyBTb21lQXJyYXlYcHIsIGxvb2tzIGFzCitmb2xsb3dzOgorCis8cHJlPgorRWlnZW5CYXNlJmx0O1NvbWVBcnJheVhwciZndDsKKyAgPC0tIERlbnNlQ29lZmZzQmFzZSZsdDtTb21lQXJyYXlYcHImZ3Q7ICAgIChkaXJlY3QgYWNjZXNzIG9yIG5vIGRpcmVjdCBhY2Nlc3MgY2FzZSkKKyAgICA8LS0gRGVuc2VCYXNlJmx0O1NvbWVBcnJheVhwciZndDsKKyAgICAgIDwtLSBBcnJheUJhc2UmbHQ7U29tZUFycmF5WHByJmd0OworICAgICAgICA8LS0gU29tZUFycmF5WHByCis8L3ByZT4KKworRmluYWxseSwgY29uc2lkZXIgYW4gZXhhbXBsZSBvZiBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBkZW5zZSBleHByZXNzaW9uLCBmb3IgaW5zdGFuY2UgYSBkaWFnb25hbCBtYXRyaXguIFRoZQorY29ycmVzcG9uZGluZyBpbmhlcml0YW5jZSBkaWFncmFtIGlzOgorCis8cHJlPgorRWlnZW5CYXNlJmx0OyVEaWFnb25hbE1hdHJpeCZndDsKKyAgPC0tIERpYWdvbmFsQmFzZSZsdDslRGlhZ29uYWxNYXRyaXgmZ3Q7CisgICAgPC0tIERpYWdvbmFsTWF0cml4Cis8L3ByZT4KKworCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL0NvZWZmd2lzZU1hdGhGdW5jdGlvbnNUYWJsZS5kb3ggYi9kb2MvQ29lZmZ3aXNlTWF0aEZ1bmN0aW9uc1RhYmxlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU5NDIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0NvZWZmd2lzZU1hdGhGdW5jdGlvbnNUYWJsZS5kb3gKQEAgLTAsMCArMSw1MjUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIENvZWZmd2lzZU1hdGhGdW5jdGlvbnMgQ2F0YWxvZyBvZiBjb2VmZmljaWVudC13aXNlIG1hdGggZnVuY3Rpb25zCisKKworPCEtLSA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjMwMCU7IGNvbG9yOnJlZDsgZm9udC13ZWlnaHQ6IDkwMDsiPiFXT1JLIElOIFBST0dSRVNTITwvc3Bhbj4gLS0+CisKK1RoaXMgdGFibGUgcHJlc2VudHMgYSBjYXRhbG9nIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1hdGggZnVuY3Rpb25zIHN1cHBvcnRlZCBieSAlRWlnZW4uCitJbiB0aGlzIHRhYmxlLCBcYyBhLCBcYyBiLCByZWZlciB0byBBcnJheSBvYmplY3RzIG9yIGV4cHJlc3Npb25zLCBhbmQgXGMgbSByZWZlcnMgdG8gYSBsaW5lYXIgYWxnZWJyYSBNYXRyaXgvVmVjdG9yIG9iamVjdC4gU3RhbmRhcmQgc2NhbGFyIHR5cGVzIGFyZSBhYmJyZXZpYXRlZCBhcyBmb2xsb3dzOgorICAtIFxjIGludDogXGMgaTMyCisgIC0gXGMgZmxvYXQ6IFxjIGYKKyAgLSBcYyBkb3VibGU6IFxjIGQKKyAgLSBcYyBzdGQ6OmNvbXBsZXg8ZmxvYXQ+OiBcYyBjZgorICAtIFxjIHN0ZDo6Y29tcGxleDxkb3VibGU+OiBcYyBjZAorCitGb3IgZWFjaCByb3csIHRoZSBmaXJzdCBjb2x1bW4gbGlzdCB0aGUgZXF1aXZhbGVudCBjYWxscyBmb3IgYXJyYXlzLCBhbmQgbWF0cmljZXMgd2hlbiBzdXBwb3J0ZWQuIE9mIGNvdXJzZSwgYWxsIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBtYXRyaWNlcyBieSBmaXJzdCBjYXN0aW5nIGl0IGFzIGFuIGFycmF5OiBcYyBtLmFycmF5KCkuCisKK1RoZSB0aGlyZCBjb2x1bW4gZ2l2ZXMgc29tZSBoaW50cyBpbiB0aGUgdW5kZXJseWluZyBzY2FsYXIgaW1wbGVtZW50YXRpb24uIEluIG1vc3QgY2FzZXMsICVFaWdlbiBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzZWxmIHRoZSBtYXRoIGZ1bmN0aW9uIGJ1dCByZWxpZXMgb24gdGhlIFNUTCBmb3Igc3RhbmRhcmQgc2NhbGFyIHR5cGVzLCBvciB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIHNjYWxhciB0eXBlcy4KK0ZvciBpbnN0YW5jZSwgc29tZSBzaW1wbHkgY2FsbHMgdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb24gb2YgdGhlIFNUTCB3aGlsZSBwcmVzZXJ2aW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2FkbCI+YXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cDwvYT4gZm9yIGN1c3RvbSB0eXBlcy4KK1RoZSBmb2xsb3dpbmc6CitcY29kZQordXNpbmcgc3RkOjpmb287Citmb28oYVtpXSk7CitcZW5kY29kZQorbWVhbnMgdGhhdCB0aGUgU1RMJ3MgZnVuY3Rpb24gXGMgc3RkOjpmb28gd2lsbCBiZSBwb3RlbnRpYWxseSBjYWxsZWQgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSB1bmRlcmx5aW5nIHNjYWxhciB0eXBlLiBJZiBub3QsIHRoZW4gdGhlIHVzZXIgbXVzdCBlbnN1cmUgdGhhdCBhbiBvdmVybG9hZCBvZiB0aGUgZnVuY3Rpb24gZm9vIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIHNjYWxhciB0eXBlICh1c3VhbGx5IGRlZmluZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBnaXZlbiBzY2FsYXIgdHlwZSkuCitUaGlzIGFsc28gbWVhbnMgdGhhdCwgdW5sZXNzIHNwZWNpZmllZCwgaWYgdGhlIGZ1bmN0aW9uIFxjIHN0ZDo6Zm9vIGlzIGF2YWlsYWJsZSBvbmx5IGluIHNvbWUgcmVjZW50IGMrKyB2ZXJzaW9ucyAoZS5nLiwgYysrMTEpLCB0aGVuIHRoZSByZXNwZWN0aXZlICVFaWdlbidzIGZ1bmN0aW9uL21ldGhvZCB3aWxsIGJlIHVzYWJsZSBvbiBzdGFuZGFyZCB0eXBlcyBvbmx5IGlmIHRoZSBjb21waWxlciBzdXBwb3J0IHRoZSByZXF1aXJlZCBjKysgdmVyc2lvbi4KKworPHRhYmxlIGNsYXNzPSJtYW51YWwtaGwiPgorPHRyPgorPHRoPkFQSTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48dGg+RGVmYXVsdCBzY2FsYXIgaW1wbGVtZW50YXRpb248L3RoPjx0aD5TSU1EPC90aD4KKzwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiPjwvdGQ+PC90cj4KKzx0cj48dGggY29sc3Bhbj0iNCI+QmFzaWMgb3BlcmF0aW9uczwvdGg+PC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2FicworICBhLlxsaW5rIEFycmF5QmFzZTo6YWJzIGFic1xlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjphYnMgYWJzXGVuZGxpbmsoYSk7IFxuCisgIG0uXGxpbmsgTWF0cml4QmFzZTo6Y3dpc2VBYnMgY3dpc2VBYnNcZW5kbGluaygpOworICA8L3RkPgorICA8dGQ+YWJzb2x1dGUgdmFsdWUgKFxmJCB8YV9pfCBcZiQpIDwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9mYWJzIj5zdGQ6OmFiczwvYT47IFxuCisgIGFicyhhW2ldKTsKKyAgPC90ZD4KKyAgPHRkPlNTRTIsIEFWWCAoaTMyLGYsZCk8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2ludmVyc2UKKyAgYS5cbGluayBBcnJheUJhc2U6OmludmVyc2UgaW52ZXJzZVxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjppbnZlcnNlIGludmVyc2VcZW5kbGluayhhKTsgXG4KKyAgbS5cbGluayBNYXRyaXhCYXNlOjpjd2lzZUludmVyc2UgY3dpc2VJbnZlcnNlXGVuZGxpbmsoKTsKKyAgPC90ZD4KKyAgPHRkPmludmVyc2UgdmFsdWUgKFxmJCAxL2FfaSBcZiQpIDwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIDEvYVtpXTsKKyAgPC90ZD4KKyAgPHRkPkFsbCBlbmdpbmVzIChmLGQsZmMsZmQpPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9jb25qCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpjb25qdWdhdGUgY29uanVnYXRlXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmNvbmogY29ualxlbmRsaW5rKGEpOyBcbgorICBtLlxsaW5rIE1hdHJpeEJhc2U6OmNvbmp1Z2F0ZSBjb25qdWdhdGUoKTsKKyAgPC90ZD4KKyAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbXBsZXhfY29uanVnYXRlIj5jb21wbGV4IGNvbmp1Z2F0ZTwvYT4gKFxmJCBcYmFye2FfaX0gXGYkKSxcbgorICBuby1vcCBmb3IgcmVhbCA8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL2NvbXBsZXgvY29uaiI+c3RkOjpjb25qPC9hPjsgXG4KKyAgY29uaihhW2ldKTsKKyAgPC90ZD4KKyAgPHRkPkFsbCBlbmdpbmVzIChmYyxmZCk8L3RkPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPSI0Ij5FeHBvbmVudGlhbCBmdW5jdGlvbnM8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2V4cAorICBhLlxsaW5rIEFycmF5QmFzZTo6ZXhwIGV4cFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpleHAgZXhwXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5cZiQgZSBcZiQgcmFpc2VkIHRvIHRoZSBnaXZlbiBwb3dlciAoXGYkIGVee2FfaX0gXGYkKSA8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvZXhwIj5zdGQ6OmV4cDwvYT47IFxuCisgIGV4cChhW2ldKTsKKyAgPC90ZD4KKyAgPHRkPlNTRTIsIEFWWCAoZixkKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfbG9nCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpsb2cgbG9nXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmxvZyBsb2dcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPm5hdHVyYWwgKGJhc2UgXGYkIGUgXGYkKSBsb2dhcml0aG0gKFxmJCBcbG4oe2FfaX0pIFxmJCk8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvbG9nIj5zdGQ6OmxvZzwvYT47IFxuCisgIGxvZyhhW2ldKTsKKyAgPC90ZD4KKyAgPHRkPlNTRTIsIEFWWCAoZik8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2xvZzFwCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpsb2cxcCBsb2cxcFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpsb2cxcCBsb2cxcFxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+bmF0dXJhbCAoYmFzZSBcZiQgZSBcZiQpIGxvZ2FyaXRobSBvZiAxIHBsdXMgXG4gdGhlIGdpdmVuIG51bWJlciAoXGYkIFxsbih7MSthX2l9KSBcZiQpPC90ZD4KKyAgPHRkPmJ1aWx0LWluIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gXGMgbG9nLFxuCisgIHBsdXMgXGMgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL2xvZzFwIj5cYyBzdGQ6OmxvZzFwIDwvYT47IFxjcHAxMTwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2xvZzEwCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpsb2cxMCBsb2cxMFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpsb2cxMCBsb2cxMFxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+YmFzZSAxMCBsb2dhcml0aG0gKFxmJCBcbG9nX3sxMH0oe2FfaX0pIFxmJCk8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvbG9nMTAiPnN0ZDo6bG9nMTA8L2E+OyBcbgorICBsb2cxMChhW2ldKTsKKyAgPC90ZD4KKyAgPHRkPjwvdGQ+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49IjQiPlBvd2VyIGZ1bmN0aW9uczwvdGg+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfcG93CisgIGEuXGxpbmsgQXJyYXlCYXNlOjpwb3cgcG93XGVuZGxpbmsoYik7IFxuCisgIFxsaW5rIEVpZ2VuOjpwb3cgcG93XGVuZGxpbmsoYSxiKTsKKyAgPC90ZD4KKyAgPHRkPnJhaXNlcyBhIG51bWJlciB0byB0aGUgZ2l2ZW4gcG93ZXIgKFxmJCBhX2kgXiB7Yl9pfSBcZiQpIFxuIFxjIGEgYW5kIFxjIGIgY2FuIGJlIGVpdGhlciBhbiBhcnJheSBvciBzY2FsYXIuPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL3BvdyI+c3RkOjpwb3c8L2E+OyBcbgorICBwb3coYVtpXSxiW2ldKTtcbgorICAocGx1cyBidWlsdGluIGZvciBpbnRlZ2VyIHR5cGVzKTwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX3NxcnQKKyAgYS5cbGluayBBcnJheUJhc2U6OnNxcnQgc3FydFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpzcXJ0IHNxcnRcZW5kbGluayhhKTtcbgorICBtLlxsaW5rIE1hdHJpeEJhc2U6OmN3aXNlU3FydCBjd2lzZVNxcnRcZW5kbGluaygpOworICA8L3RkPgorICA8dGQ+Y29tcHV0ZXMgc3F1YXJlIHJvb3QgKFxmJCBcc3FydCBhX2kgXGYkKTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9zcXJ0Ij5zdGQ6OnNxcnQ8L2E+OyBcbgorICBzcXJ0KGFbaV0pOzwvdGQ+CisgIDx0ZD5TU0UyLCBBVlggKGYsZCk8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX3JzcXJ0CisgIGEuXGxpbmsgQXJyYXlCYXNlOjpyc3FydCByc3FydFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpyc3FydCByc3FydFxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmFzdF9pbnZlcnNlX3NxdWFyZV9yb290Ij5yZWNpcHJvY2FsIHNxdWFyZSByb290PC9hPiAoXGYkIDEve1xzcXJ0IGFfaX0gXGYkKTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9zcXJ0Ij5zdGQ6OnNxcnQ8L2E+OyBcbgorICAxL3NxcnQoYVtpXSk7IFxuCisgIDwvdGQ+CisgIDx0ZD5TU0UyLCBBVlgsIEFsdGlWZWMsIFpWZWN0b3IgKGYsZClcbgorICAoYXBwcm94ICsgMSBOZXd0b24gaXRlcmF0aW9uKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfc3F1YXJlCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpzcXVhcmUgc3F1YXJlXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OnNxdWFyZSBzcXVhcmVcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmNvbXB1dGVzIHNxdWFyZSBwb3dlciAoXGYkIGFfaV4yIFxmJCk8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBhW2ldKmFbaV08L3RkPgorICA8dGQ+QWxsIChpMzIsZixkLGNmLGNkKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfY3ViZQorICBhLlxsaW5rIEFycmF5QmFzZTo6Y3ViZSBjdWJlXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmN1YmUgY3ViZVxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+Y29tcHV0ZXMgY3ViaWMgcG93ZXIgKFxmJCBhX2leMyBcZiQpPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgYVtpXSphW2ldKmFbaV08L3RkPgorICA8dGQ+QWxsIChpMzIsZixkLGNmLGNkKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfYWJzMgorICBhLlxsaW5rIEFycmF5QmFzZTo6YWJzMiBhYnMyXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmFiczIgYWJzMlxlbmRsaW5rKGEpO1xuCisgIG0uXGxpbmsgTWF0cml4QmFzZTo6Y3dpc2VBYnMyIGN3aXNlQWJzMlxlbmRsaW5rKCk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyB0aGUgc3F1YXJlZCBhYnNvbHV0ZSB2YWx1ZSAoXGYkIHxhX2l8XjIgXGYkKTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHJlYWw6ICAgIGFbaV0qYVtpXSBcbgorICBjb21wbGV4OiAgcmVhbChhW2ldKSpyZWFsKGFbaV0pIFxuCisgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyArIGltYWcoYVtpXSkqaW1hZyhhW2ldKTwvdGQ+CisgIDx0ZD5BbGwgKGkzMixmLGQpPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggY29sc3Bhbj0iNCI+VHJpZ29ub21ldHJpYyBmdW5jdGlvbnM8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX3NpbgorICBhLlxsaW5rIEFycmF5QmFzZTo6c2luIHNpblxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpzaW4gc2luXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyBzaW5lPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL3NpbiI+c3RkOjpzaW48L2E+OyBcbgorICBzaW4oYVtpXSk7PC90ZD4KKyAgPHRkPlNTRTIsIEFWWCAoZik8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2NvcworICBhLlxsaW5rIEFycmF5QmFzZTo6Y29zIGNvc1xlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpjb3MgY29zXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyBjb3NpbmU8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvY29zIj5zdGQ6OmNvczwvYT47IFxuCisgIGNvcyhhW2ldKTs8L3RkPgorICA8dGQ+U1NFMiwgQVZYIChmKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfdGFuCisgIGEuXGxpbmsgQXJyYXlCYXNlOjp0YW4gdGFuXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OnRhbiB0YW5cZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmNvbXB1dGVzIHRhbmdlbnQ8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvdGFuIj5zdGQ6OnRhbjwvYT47IFxuCisgIHRhbihhW2ldKTs8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9hc2luCisgIGEuXGxpbmsgQXJyYXlCYXNlOjphc2luIGFzaW5cZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6YXNpbiBhc2luXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyBhcmMgc2luZSAoXGYkIFxzaW5eey0xfSBhX2kgXGYkKTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9hc2luIj5zdGQ6OmFzaW48L2E+OyBcbgorICBhc2luKGFbaV0pOzwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2Fjb3MKKyAgYS5cbGluayBBcnJheUJhc2U6OmFjb3MgYWNvc1xlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjphY29zIGFjb3NcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmNvbXB1dGVzIGFyYyBjb3NpbmUgIChcZiQgXGNvc157LTF9IGFfaSBcZiQpPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL2Fjb3MiPnN0ZDo6YWNvczwvYT47IFxuCisgIGFjb3MoYVtpXSk7PC90ZD4KKyAgPHRkPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfYXRhbgorICBhLlxsaW5rIEFycmF5QmFzZTo6YXRhbiB0YW5cZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6YXRhbiBhdGFuXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyBhcmMgdGFuZ2VudCAoXGYkIFx0YW5eey0xfSBhX2kgXGYkKTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9hdGFuIj5zdGQ6OmF0YW48L2E+OyBcbgorICBhdGFuKGFbaV0pOzwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPSI0Ij5IeXBlcmJvbGljIGZ1bmN0aW9uczwvdGg+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfc2luaAorICBhLlxsaW5rIEFycmF5QmFzZTo6c2luaCBzaW5oXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OnNpbmggc2luaFxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+Y29tcHV0ZXMgaHlwZXJib2xpYyBzaW5lPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL3NpbmgiPnN0ZDo6c2luaDwvYT47IFxuCisgIHNpbmgoYVtpXSk7PC90ZD4KKyAgPHRkPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfY29zaAorICBhLlxsaW5rIEFycmF5QmFzZTo6Y29zaCBjb2hzXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmNvc2ggY29zaFxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+Y29tcHV0ZXMgaHlwZXJib2xpYyBjb3NpbmU8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvY29zaCI+c3RkOjpjb3NoPC9hPjsgXG4KKyAgY29zaChhW2ldKTs8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV90YW5oCisgIGEuXGxpbmsgQXJyYXlCYXNlOjp0YW5oIHRhbmhcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6dGFuaCB0YW5oXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wdXRlcyBoeXBlcmJvbGljIHRhbmdlbnQ8L3RkPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvdGFuaCI+c3RkOjp0YW5oPC9hPjsgXG4KKyAgdGFuaChhW2ldKTs8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggY29sc3Bhbj0iNCI+TmVhcmVzdCBpbnRlZ2VyIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnM8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2NlaWwKKyAgYS5cbGluayBBcnJheUJhc2U6OmNlaWwgY2VpbFxlbmRsaW5rKCk7IFxuCisgIFxsaW5rIEVpZ2VuOjpjZWlsIGNlaWxcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPm5lYXJlc3QgaW50ZWdlciBub3QgbGVzcyB0aGFuIHRoZSBnaXZlbiB2YWx1ZTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9jZWlsIj5zdGQ6OmNlaWw8L2E+OyBcbgorICBjZWlsKGFbaV0pOzwvdGQ+CisgIDx0ZD5TU0U0LEFWWCxaVmVjdG9yIChmLGQpPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9mbG9vcgorICBhLlxsaW5rIEFycmF5QmFzZTo6Zmxvb3IgZmxvb3JcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6Zmxvb3IgZmxvb3JcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPm5lYXJlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB2YWx1ZTwvdGQ+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9mbG9vciI+c3RkOjpmbG9vcjwvYT47IFxuCisgIGZsb29yKGFbaV0pOzwvdGQ+CisgIDx0ZD5TU0U0LEFWWCxaVmVjdG9yIChmLGQpPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9yb3VuZAorICBhLlxsaW5rIEFycmF5QmFzZTo6cm91bmQgcm91bmRcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6cm91bmQgcm91bmRcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPm5lYXJlc3QgaW50ZWdlciwgXG4gcm91bmRpbmcgYXdheSBmcm9tIHplcm8gaW4gaGFsZndheSBjYXNlczwvdGQ+CisgIDx0ZD5idWlsdC1pbiBnZW5lcmljIGltcGxlbWVudGF0aW9uIFxuIGJhc2VkIG9uIFxjIGZsb29yIGFuZCBcYyBjZWlsLFxuCisgIHBsdXMgXGMgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL3JvdW5kIj5cYyBzdGQ6OnJvdW5kIDwvYT47IFxjcHAxMTwvdGQ+CisgIDx0ZD5TU0U0LEFWWCxaVmVjdG9yIChmLGQpPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggY29sc3Bhbj0iNCI+RmxvYXRpbmcgcG9pbnQgbWFuaXB1bGF0aW9uIGZ1bmN0aW9uczwvdGg+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49IjQiPkNsYXNzaWZpY2F0aW9uIGFuZCBjb21wYXJpc29uPC90aD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9pc2Zpbml0ZQorICBhLlxsaW5rIEFycmF5QmFzZTo6aXNGaW5pdGUgaXNGaW5pdGVcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6aXNmaW5pdGUgaXNmaW5pdGVcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmNoZWNrcyBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGhhcyBmaW5pdGUgdmFsdWU8L3RkPgorICA8dGQ+YnVpbHQtaW4gZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbixcbgorICBwbHVzIFxjIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9pc2Zpbml0ZSI+XGMgc3RkOjppc2Zpbml0ZSA8L2E+OyBcY3BwMTE8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9pc2luZgorICBhLlxsaW5rIEFycmF5QmFzZTo6aXNJbmYgaXNJbmZcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6aXNpbmYgaXNpbmZcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmNoZWNrcyBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGluZmluaXRlPC90ZD4KKyAgPHRkPmJ1aWx0LWluIGdlbmVyaWMgaW1wbGVtZW50YXRpb24sXG4KKyAgcGx1cyBcYyB1c2luZyA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9udW1lcmljL21hdGgvaXNpbmYiPlxjIHN0ZDo6aXNpbmYgPC9hPjsgXGNwcDExPC90ZD4KKyAgPHRkPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfaXNuYW4KKyAgYS5cbGluayBBcnJheUJhc2U6OmlzTmFOIGlzTmFOXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmlzbmFuIGlzbmFuXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jaGVja3MgaWYgdGhlIGdpdmVuIG51bWJlciBpcyBub3QgYSBudW1iZXI8L3RkPgorICA8dGQ+YnVpbHQtaW4gZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbixcbgorICBwbHVzIFxjIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL251bWVyaWMvbWF0aC9pc25hbiI+XGMgc3RkOjppc25hbiA8L2E+OyBcY3BwMTE8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+Cis8dGggY29sc3Bhbj0iNCI+RXJyb3IgYW5kIGdhbW1hIGZ1bmN0aW9uczwvdGg+Cis8L3RyPgorPHRyPiA8dGQgY29sc3Bhbj0iNCI+ICBSZXF1aXJlIFxjIFwjaW5jbHVkZSBcYyA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4gPC90ZD48L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfZXJmCisgIGEuXGxpbmsgQXJyYXlCYXNlOjplcmYgZXJmXGVuZGxpbmsoKTsgXG4KKyAgXGxpbmsgRWlnZW46OmVyZiBlcmZcZW5kbGluayhhKTsKKyAgPC90ZD4KKyAgPHRkPmVycm9yIGZ1bmN0aW9uPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL2VyZiI+c3RkOjplcmY8L2E+OyBcY3BwMTEgXG4KKyAgZXJmKGFbaV0pOworICA8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9lcmZjCisgIGEuXGxpbmsgQXJyYXlCYXNlOjplcmZjIGVyZmNcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6ZXJmYyBlcmZjXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD5jb21wbGVtZW50YXJ5IGVycm9yIGZ1bmN0aW9uPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL2VyZmMiPnN0ZDo6ZXJmYzwvYT47IFxjcHAxMSBcbgorICBlcmZjKGFbaV0pOworICA8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9sZ2FtbWEKKyAgYS5cbGluayBBcnJheUJhc2U6OmxnYW1tYSBsZ2FtbWFcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6bGdhbW1hIGxnYW1tYVxlbmRsaW5rKGEpOworICA8L3RkPgorICA8dGQ+bmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uPC90ZD4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9tYXRoL2xnYW1tYSI+c3RkOjpsZ2FtbWE8L2E+OyBcY3BwMTEgXG4KKyAgbGdhbW1hKGFbaV0pOworICA8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCBjbGFzcz0iY29kZSI+CisgIFxhbmNob3IgY3dpc2V0YWJsZV9kaWdhbW1hCisgIGEuXGxpbmsgQXJyYXlCYXNlOjpkaWdhbW1hIGRpZ2FtbWFcZW5kbGluaygpOyBcbgorICBcbGluayBFaWdlbjo6ZGlnYW1tYSBkaWdhbW1hXGVuZGxpbmsoYSk7CisgIDwvdGQ+CisgIDx0ZD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EaWdhbW1hX2Z1bmN0aW9uIj5sb2dhcml0aG1pYyBkZXJpdmF0aXZlIG9mIHRoZSBnYW1tYSBmdW5jdGlvbjwvYT48L3RkPgorICA8dGQ+CisgIGJ1aWx0LWluIGZvciBmbG9hdCBhbmQgZG91YmxlCisgIDwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2lnYW1tYQorICBcbGluayBFaWdlbjo6aWdhbW1hIGlnYW1tYVxlbmRsaW5rKGEseCk7CisgIDwvdGQ+CisgIDx0ZD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbmNvbXBsZXRlX2dhbW1hX2Z1bmN0aW9uIj5sb3dlciBpbmNvbXBsZXRlIGdhbW1hIGludGVncmFsPC9hPgorICBcbiBcZiQgXGdhbW1hKGFfaSx4X2kpPSBcZnJhY3sxfXt8YV9pfH0gXGludF97MH1ee3hfaX1lXntcdGV4dHstfXR9IHRee2FfaS0xfSBcbWF0aHJte2R9IHQgXGYkPC90ZD4KKyAgPHRkPgorICBidWlsdC1pbiBmb3IgZmxvYXQgYW5kIGRvdWJsZSxcbiBidXQgcmVxdWlyZXMgXGNwcDExCisgIDwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2lnYW1tYWMKKyAgXGxpbmsgRWlnZW46OmlnYW1tYWMgaWdhbW1hY1xlbmRsaW5rKGEseCk7CisgIDwvdGQ+CisgIDx0ZD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbmNvbXBsZXRlX2dhbW1hX2Z1bmN0aW9uIj51cHBlciBpbmNvbXBsZXRlIGdhbW1hIGludGVncmFsPC9hPgorICBcbiBcZiQgXEdhbW1hKGFfaSx4X2kpID0gXGZyYWN7MX17fGFfaXx9IFxpbnRfe3hfaX1ee1xpbmZ0eX1lXntcdGV4dHstfXR9IHRee2FfaS0xfSBcbWF0aHJte2R9IHQgXGYkPC90ZD4KKyAgPHRkPgorICBidWlsdC1pbiBmb3IgZmxvYXQgYW5kIGRvdWJsZSxcbiBidXQgcmVxdWlyZXMgXGNwcDExCisgIDwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPSI0Ij5TcGVjaWFsIGZ1bmN0aW9uczwvdGg+Cis8L3RyPgorPHRyPiA8dGQgY29sc3Bhbj0iNCI+ICBSZXF1aXJlIFxjIFwjaW5jbHVkZSBcYyA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4gPC90ZD48L3RyPgorPHRyPgorICA8dGQgY2xhc3M9ImNvZGUiPgorICBcYW5jaG9yIGN3aXNldGFibGVfcG9seWdhbW1hCisgIFxsaW5rIEVpZ2VuOjpwb2x5Z2FtbWEgcG9seWdhbW1hXGVuZGxpbmsobix4KTsKKyAgPC90ZD4KKyAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvbHlnYW1tYV9mdW5jdGlvbiI+bi10aCBkZXJpdmF0aXZlIG9mIGRpZ2FtbWEgYXQgeDwvYT48L3RkPgorICA8dGQ+CisgIGJ1aWx0LWluIGdlbmVyaWMgYmFzZWQgb25cbiA8YSBocmVmPSIjY3dpc2V0YWJsZV9sZ2FtbWEiPlxjIGxnYW1tYSA8L2E+LAorICA8YSBocmVmPSIjY3dpc2V0YWJsZV9kaWdhbW1hIj4gXGMgZGlnYW1tYSA8L2E+CisgIGFuZCA8YSBocmVmPSIjY3dpc2V0YWJsZV96ZXRhIj5cYyB6ZXRhIDwvYT4uCisgIDwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX2JldGFpbmMKKyAgXGxpbmsgRWlnZW46OmJldGFpbmMgYmV0YWluY1xlbmRsaW5rKGEsYix4KTsKKyAgPC90ZD4KKyAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JldGFfZnVuY3Rpb24jSW5jb21wbGV0ZV9iZXRhX2Z1bmN0aW9uIj5JbmNvbXBsZXRlIGJldGEgZnVuY3Rpb248L2E+PC90ZD4KKyAgPHRkPgorICBidWlsdC1pbiBmb3IgZmxvYXQgYW5kIGRvdWJsZSxcbiBidXQgcmVxdWlyZXMgXGNwcDExCisgIDwvdGQ+CisgIDx0ZD48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIGNsYXNzPSJjb2RlIj4KKyAgXGFuY2hvciBjd2lzZXRhYmxlX3pldGEKKyAgXGxpbmsgRWlnZW46OnpldGEgemV0YVxlbmRsaW5rKGEsYik7CisgIDwvdGQ+CisgIDx0ZD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdXJ3aXR6X3pldGFfZnVuY3Rpb24iPkh1cndpdHogemV0YSBmdW5jdGlvbjwvYT4KKyAgXG4gXGYkIFx6ZXRhKGFfaSxiX2kpPVxzdW1fe2s9MH1ee1xpbmZ0eX0oYl9pK2spXntcdGV4dHstfWFfaX0gXGYkPC90ZD4KKyAgPHRkPgorICBidWlsdC1pbiBmb3IgZmxvYXQgYW5kIGRvdWJsZQorICA8L3RkPgorICA8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiPjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1xuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DdXN0b21pemluZ0VpZ2VuX0N1c3RvbVNjYWxhci5kb3ggYi9kb2MvQ3VzdG9taXppbmdFaWdlbl9DdXN0b21TY2FsYXIuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTc4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQ3VzdG9taXppbmdFaWdlbl9DdXN0b21TY2FsYXIuZG94CkBAIC0wLDAgKzEsMTIwIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNDdXN0b21pemluZ19DdXN0b21TY2FsYXIgVXNpbmcgY3VzdG9tIHNjYWxhciB0eXBlcworXGFuY2hvciB1c2VyX2RlZmluZWRfc2NhbGFycworCitCeSBkZWZhdWx0LCBFaWdlbiBjdXJyZW50bHkgc3VwcG9ydHMgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQgdHlwZXMgKFxjIGZsb2F0LCBcYyBkb3VibGUsIFxjIHN0ZDo6Y29tcGxleDxmbG9hdD4sIFxjIHN0ZDo6Y29tcGxleDxkb3VibGU+LCBcYyBsb25nIFxjIGRvdWJsZSksIGFzIHdlbGwgYXMgYWxsIG5hdGl2ZSBpbnRlZ2VyIHR5cGVzIChlLmcuLCBcYyBpbnQsIFxjIHVuc2lnbmVkIFxjIGludCwgXGMgc2hvcnQsIGV0Yy4pLCBhbmQgXGMgYm9vbC4KK09uIHg4Ni02NCBzeXN0ZW1zLCBcYyBsb25nIFxjIGRvdWJsZSBwZXJtaXRzIHRvIGxvY2FsbHkgZW5mb3JjZXMgdGhlIHVzZSBvZiB4ODcgcmVnaXN0ZXJzIHdpdGggZXh0ZW5kZWQgYWNjdXJhY3kgKGluIGNvbXBhcmlzb24gdG8gU1NFKS4KKworSW4gb3JkZXIgdG8gYWRkIHN1cHBvcnQgZm9yIGEgY3VzdG9tIHR5cGUgXGMgVCB5b3UgbmVlZDoKKy0jIG1ha2Ugc3VyZSB0aGUgY29tbW9uIG9wZXJhdG9yICgrLC0sKiwvLGV0Yy4pIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHR5cGUgXGMgVAorLSMgYWRkIGEgc3BlY2lhbGl6YXRpb24gb2Ygc3RydWN0IEVpZ2VuOjpOdW1UcmFpdHM8VD4gKHNlZSBccmVmIE51bVRyYWl0cykKKy0jIGRlZmluZSB0aGUgbWF0aCBmdW5jdGlvbnMgdGhhdCBtYWtlcyBzZW5zZSBmb3IgeW91ciB0eXBlLiBUaGlzIGluY2x1ZGVzIHN0YW5kYXJkIG9uZXMgbGlrZSBzcXJ0LCBwb3csIHNpbiwgdGFuLCBjb25qLCByZWFsLCBpbWFnLCBldGMsIGFzIHdlbGwgYXMgYWJzMiB3aGljaCBpcyBFaWdlbiBzcGVjaWZpYy4KKyAgICAgKHNlZSB0aGUgZmlsZSBFaWdlbi9zcmMvQ29yZS9NYXRoRnVuY3Rpb25zLmgpCisKK1RoZSBtYXRoIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIG5hbWVzcGFjZSB0aGFuIFxjIFQsIG9yIGluIHRoZSBcYyBzdGQgbmFtZXNwYWNlIHRob3VnaCB0aGF0IHNlY29uZCBhcHByb2FjaCBpcyBub3QgcmVjb21tZW5kZWQuCisKK0hlcmUgaXMgYSBjb25jcmV0ZSBleGFtcGxlIGFkZGluZyBzdXBwb3J0IGZvciB0aGUgQWRvbGMncyBcYyBhZG91YmxlIHR5cGUuIDxhIGhyZWY9Imh0dHBzOi8vcHJvamVjdHMuY29pbi1vci5vcmcvQURPTC1DIj5BZG9sYzwvYT4gaXMgYW4gYXV0b21hdGljIGRpZmZlcmVudGlhdGlvbiBsaWJyYXJ5LiBUaGUgdHlwZSBcYyBhZG91YmxlIGlzIGJhc2ljYWxseSBhIHJlYWwgdmFsdWUgdHJhY2tpbmcgdGhlIHZhbHVlcyBvZiBhbnkgbnVtYmVyIG9mIHBhcnRpYWwgZGVyaXZhdGl2ZXMuCisKK1xjb2RlCisjaWZuZGVmIEFET0xDU1VQUE9SVF9ICisjZGVmaW5lIEFET0xDU1VQUE9SVF9ICisKKyNkZWZpbmUgQURPTENfVEFQRUxFU1MKKyNpbmNsdWRlIDxhZG9sYy9hZG91YmxlLmg+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPGFkdGw6OmFkb3VibGU+CisgOiBOdW1UcmFpdHM8ZG91YmxlPiAvLyBwZXJtaXRzIHRvIGdldCB0aGUgZXBzaWxvbiwgZHVtbXlfcHJlY2lzaW9uLCBsb3dlc3QsIGhpZ2hlc3QgZnVuY3Rpb25zCit7CisgIHR5cGVkZWYgYWR0bDo6YWRvdWJsZSBSZWFsOworICB0eXBlZGVmIGFkdGw6OmFkb3VibGUgTm9uSW50ZWdlcjsKKyAgdHlwZWRlZiBhZHRsOjphZG91YmxlIE5lc3RlZDsKKworICBlbnVtIHsKKyAgICBJc0NvbXBsZXggPSAwLAorICAgIElzSW50ZWdlciA9IDAsCisgICAgSXNTaWduZWQgPSAxLAorICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IDEsCisgICAgUmVhZENvc3QgPSAxLAorICAgIEFkZENvc3QgPSAzLAorICAgIE11bENvc3QgPSAzCisgIH07Cit9OworCit9CisKK25hbWVzcGFjZSBhZHRsIHsKKworaW5saW5lIGNvbnN0IGFkb3VibGUmIGNvbmooY29uc3QgYWRvdWJsZSYgeCkgIHsgcmV0dXJuIHg7IH0KK2lubGluZSBjb25zdCBhZG91YmxlJiByZWFsKGNvbnN0IGFkb3VibGUmIHgpICB7IHJldHVybiB4OyB9CitpbmxpbmUgYWRvdWJsZSBpbWFnKGNvbnN0IGFkb3VibGUmKSAgICB7IHJldHVybiAwLjsgfQoraW5saW5lIGFkb3VibGUgYWJzKGNvbnN0IGFkb3VibGUmICB4KSAgeyByZXR1cm4gZmFicyh4KTsgfQoraW5saW5lIGFkb3VibGUgYWJzMihjb25zdCBhZG91YmxlJiB4KSAgeyByZXR1cm4geCp4OyB9CisKK30KKworI2VuZGlmIC8vIEFET0xDU1VQUE9SVF9ICitcZW5kY29kZQorCitUaGlzIG90aGVyIGV4YW1wbGUgYWRkcyBzdXBwb3J0IGZvciB0aGUgXGMgbXBxX2NsYXNzIHR5cGUgZnJvbSA8YSBocmVmPSJodHRwczovL2dtcGxpYi5vcmcvIj5HTVA8L2E+LiBJdCBzaG93cyBpbiBwYXJ0aWN1bGFyIGhvdyB0byBjaGFuZ2UgdGhlIHdheSBFaWdlbiBwaWNrcyB0aGUgYmVzdCBwaXZvdCBkdXJpbmcgTFUgZmFjdG9yaXphdGlvbi4gSXQgc2VsZWN0cyB0aGUgY29lZmZpY2llbnQgd2l0aCB0aGUgaGlnaGVzdCBzY29yZSwgd2hlcmUgdGhlIHNjb3JlIGlzIGJ5IGRlZmF1bHQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGEgbnVtYmVyLCBidXQgd2UgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBzY29yZSwgZm9yIGluc3RhbmNlIHRvIHByZWZlciBwaXZvdHMgd2l0aCBhIG1vcmUgY29tcGFjdCByZXByZXNlbnRhdGlvbiAodGhpcyBpcyBhbiBleGFtcGxlLCBub3QgYSByZWNvbW1lbmRhdGlvbikuIE5vdGUgdGhhdCB0aGUgc2NvcmVzIHNob3VsZCBhbHdheXMgYmUgbm9uLW5lZ2F0aXZlIGFuZCBvbmx5IHplcm8gaXMgYWxsb3dlZCB0byBoYXZlIGEgc2NvcmUgb2YgemVyby4gQWxzbywgdGhpcyBjYW4gaW50ZXJhY3QgYmFkbHkgd2l0aCB0aHJlc2hvbGRzIGZvciBpbmV4YWN0IHNjYWxhciB0eXBlcy4KKworXGNvZGUKKyNpbmNsdWRlIDxnbXB4eC5oPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8Ym9vc3Qvb3BlcmF0b3JzLmhwcD4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPG1wcV9jbGFzcz4gOiBHZW5lcmljTnVtVHJhaXRzPG1wcV9jbGFzcz4KKyAgeworICAgIHR5cGVkZWYgbXBxX2NsYXNzIFJlYWw7CisgICAgdHlwZWRlZiBtcHFfY2xhc3MgTm9uSW50ZWdlcjsKKyAgICB0eXBlZGVmIG1wcV9jbGFzcyBOZXN0ZWQ7CisKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgZXBzaWxvbigpIHsgcmV0dXJuIDA7IH0KKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gMDsgfQorICAgIHN0YXRpYyBpbmxpbmUgUmVhbCBkaWdpdHMxMCgpIHsgcmV0dXJuIDA7IH0KKworICAgIGVudW0geworICAgICAgSXNJbnRlZ2VyID0gMCwKKyAgICAgIElzU2lnbmVkID0gMSwKKyAgICAgIElzQ29tcGxleCA9IDAsCisgICAgICBSZXF1aXJlSW5pdGlhbGl6YXRpb24gPSAxLAorICAgICAgUmVhZENvc3QgPSA2LAorICAgICAgQWRkQ29zdCA9IDE1MCwKKyAgICAgIE11bENvc3QgPSAxMDAKKyAgICB9OworICB9OworCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBzY2FsYXJfc2NvcmVfY29lZmZfb3A8bXBxX2NsYXNzPiB7CisgICAgICBzdHJ1Y3QgcmVzdWx0X3R5cGUgOiBib29zdDo6dG90YWxseV9vcmRlcmVkMTxyZXN1bHRfdHlwZT4geworICAgICAgICBzdGQ6OnNpemVfdCBsZW47CisgICAgICAgIHJlc3VsdF90eXBlKGludCBpID0gMCkgOiBsZW4oaSkge30gLy8gRWlnZW4gdXNlcyBTY29yZSgwKSBhbmQgU2NvcmUoKQorICAgICAgICByZXN1bHRfdHlwZShtcHFfY2xhc3MgY29uc3QmIHEpIDoKKyAgICAgICAgICBsZW4obXB6X3NpemUocS5nZXRfbnVtX21wel90KCkpKworICAgICAgICAgICAgICBtcHpfc2l6ZShxLmdldF9kZW5fbXB6X3QoKSktMSkge30KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KHJlc3VsdF90eXBlIHgsIHJlc3VsdF90eXBlIHkpIHsKKyAgICAgICAgICAvLyAwIGlzIHRoZSB3b3JzdCBwb3NzaWJsZSBwaXZvdAorICAgICAgICAgIGlmICh4LmxlbiA9PSAwKSByZXR1cm4geS5sZW4gPiAwOworICAgICAgICAgIGlmICh5LmxlbiA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgLy8gUHJlZmVyIGEgcGl2b3Qgd2l0aCBhIHNtYWxsIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgcmV0dXJuIHgubGVuID4geS5sZW47CisgICAgICAgIH0KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShyZXN1bHRfdHlwZSB4LCByZXN1bHRfdHlwZSB5KSB7CisgICAgICAgICAgLy8gT25seSB1c2VkIHRvIHRlc3QgaWYgdGhlIHNjb3JlIGlzIDAKKyAgICAgICAgICByZXR1cm4geC5sZW4gPT0geS5sZW47CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKG1wcV9jbGFzcyBjb25zdCYgeCkgY29uc3QgeyByZXR1cm4geDsgfQorICAgIH07CisgIH0KK30KK1xlbmRjb2RlCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DdXN0b21pemluZ0VpZ2VuX0luaGVyaXRpbmdNYXRyaXguZG94IGIvZG9jL0N1c3RvbWl6aW5nRWlnZW5fSW5oZXJpdGluZ01hdHJpeC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DdXN0b21pemluZ0VpZ2VuX0luaGVyaXRpbmdNYXRyaXguZG94CkBAIC0wLDAgKzEsMzQgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0N1c3RvbWl6aW5nX0luaGVyaXRpbmdNYXRyaXggSW5oZXJpdGluZyBmcm9tIE1hdHJpeAorCitCZWZvcmUgaW5oZXJpdGluZyBmcm9tIE1hdHJpeCwgYmUgcmVhbGx5LCBJIG1lYW4gUkVBTExZLCBzdXJlIHRoYXQgdXNpbmcKK0VJR0VOX01BVFJJWF9QTFVHSU4gaXMgbm90IHdoYXQgeW91IHJlYWxseSB3YW50IChzZWUgcHJldmlvdXMgc2VjdGlvbikuCitJZiB5b3UganVzdCBuZWVkIHRvIGFkZCBmZXcgbWVtYmVycyB0byBNYXRyaXgsIHRoaXMgaXMgdGhlIHdheSB0byBnby4KKworQW4gZXhhbXBsZSBvZiB3aGVuIHlvdSBhY3R1YWxseSBuZWVkIHRvIGluaGVyaXQgTWF0cml4LCBpcyB3aGVuIHlvdQoraGF2ZSBzZXZlcmFsIGxheWVycyBvZiBoZXJpdGFnZSBzdWNoIGFzIAorTXlWZXJ5U3BlY2lmaWNWZWN0b3IxLCBNeVZlcnlTcGVjaWZpY1ZlY3RvcjIgLT4gTXlWZWN0b3IxIC0+IE1hdHJpeCBhbmQKK015VmVyeVNwZWNpZmljVmVjdG9yMywgTXlWZXJ5U3BlY2lmaWNWZWN0b3I0IC0+IE15VmVjdG9yMiAtPiBNYXRyaXguCisKK0luIG9yZGVyIGZvciB5b3VyIG9iamVjdCB0byB3b3JrIHdpdGhpbiB0aGUgJUVpZ2VuIGZyYW1ld29yaywgeW91IG5lZWQgdG8KK2RlZmluZSBhIGZldyBtZW1iZXJzIGluIHlvdXIgaW5oZXJpdGVkIGNsYXNzLgorCitIZXJlIGlzIGEgbWluaW1hbGlzdGljIGV4YW1wbGU6CisKK1xpbmNsdWRlIEN1c3RvbWl6aW5nRWlnZW5fSW5oZXJpdGFuY2UuY3BwCisKK091dHB1dDogXHZlcmJpbmNsdWRlIEN1c3RvbWl6aW5nRWlnZW5fSW5oZXJpdGFuY2Uub3V0CisKK1RoaXMgaXMgdGhlIGtpbmQgb2YgZXJyb3IgeW91IGNhbiBnZXQgaWYgeW91IGRvbid0IHByb3ZpZGUgdGhvc2UgbWV0aG9kcworXHZlcmJhdGltCitlcnJvcjogbm8gbWF0Y2ggZm9yIOKAmG9wZXJhdG9yPeKAmSBpbiDigJh2ID0gRWlnZW46Om9wZXJhdG9yKigKK2NvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAtMHgwMDAwMDAwMDEsIDEsIDAsIC0weDAwMDAwMDAwMSwgMT4gPjo6U2NhbGFyJiwgCitjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxFaWdlbjo6TWF0cml4PGRvdWJsZSwgLTB4MDAwMDAwMDAxLCAxPiA+OjpTdG9yYWdlQmFzZVR5cGUmKQorKCgoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RWlnZW46Ok1hdHJpeDxkb3VibGUsIC0weDAwMDAwMDAwMSwgMT4gPjo6U3RvcmFnZUJhc2VUeXBlJikKKygoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RWlnZW46Ok1hdHJpeDxkb3VibGUsIC0weDAwMDAwMDAwMSwgMT4gPjo6U3RvcmFnZUJhc2VUeXBlKikoJiB2KSkpKeKAmQorXGVuZHZlcmJhdGltCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DdXN0b21pemluZ0VpZ2VuX051bGxhcnlFeHByLmRveCBiL2RvYy9DdXN0b21pemluZ0VpZ2VuX051bGxhcnlFeHByLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M4ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0N1c3RvbWl6aW5nRWlnZW5fTnVsbGFyeUV4cHIuZG94CkBAIC0wLDAgKzEsODYgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0N1c3RvbWl6aW5nX051bGxhcnlFeHByIE1hdHJpeCBtYW5pcHVsYXRpb24gdmlhIG51bGxhcnktZXhwcmVzc2lvbnMKKworCitUaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBjbGFzcyBDd2lzZU51bGxhcnlPcCBpcyB0byBkZWZpbmUgXGVtIHByb2NlZHVyYWwgbWF0cmljZXMgc3VjaCBhcyBjb25zdGFudCBvciByYW5kb20gbWF0cmljZXMgYXMgcmV0dXJuZWQgYnkgdGhlIE9uZXMoKSwgWmVybygpLCBDb25zdGFudCgpLCBJZGVudGl0eSgpIGFuZCBSYW5kb20oKSBtZXRob2RzLgorTmV2ZXJ0aGVsZXNzLCB3aXRoIHNvbWUgaW1hZ2luYXRpb24gaXQgaXMgcG9zc2libGUgdG8gYWNjb21wbGlzaCB2ZXJ5IHNvcGhpc3RpY2F0ZWQgbWF0cml4IG1hbmlwdWxhdGlvbiB3aXRoIG1pbmltYWwgZWZmb3J0cyBzdWNoIHRoYXQgXHJlZiBUb3BpY05ld0V4cHJlc3Npb25UeXBlICJpbXBsZW1lbnRpbmcgbmV3IGV4cHJlc3Npb24iIGlzIHJhcmVseSBuZWVkZWQuCisKK1xzZWN0aW9uIE51bGxhcnlFeHByX0NpcmN1bGFudCBFeGFtcGxlIDE6IGNpcmN1bGFudCBtYXRyaXgKKworVG8gZXhwbG9yZSB0aGVzZSBwb3NzaWJpbGl0aWVzIGxldCB1cyBzdGFydCB3aXRoIHRoZSAgXGVtIGNpcmN1bGFudCBleGFtcGxlIG9mIHRoZSBccmVmIFRvcGljTmV3RXhwcmVzc2lvblR5cGUgImltcGxlbWVudGluZyBuZXcgZXhwcmVzc2lvbiIgdG9waWMuCitMZXQgdXMgcmVjYWxsIHRoYXQgYSBjaXJjdWxhbnQgbWF0cml4IGlzIGEgbWF0cml4IHdoZXJlIGVhY2ggY29sdW1uIGlzIHRoZSBzYW1lIGFzIHRoZQorY29sdW1uIHRvIHRoZSBsZWZ0LCBleGNlcHQgdGhhdCBpdCBpcyBjeWNsaWNhbGx5IHNoaWZ0ZWQgZG93bndhcmRzLgorRm9yIGV4YW1wbGUsIGhlcmUgaXMgYSA0LWJ5LTQgY2lyY3VsYW50IG1hdHJpeDoKK1xmWyBcYmVnaW57Ym1hdHJpeH0KKyAgICAxICYgOCAmIDQgJiAyIFxcCisgICAgMiAmIDEgJiA4ICYgNCBcXAorICAgIDQgJiAyICYgMSAmIDggXFwKKyAgICA4ICYgNCAmIDIgJiAxCitcZW5ke2JtYXRyaXh9IFxmXQorQSBjaXJjdWxhbnQgbWF0cml4IGlzIHVuaXF1ZWx5IGRldGVybWluZWQgYnkgaXRzIGZpcnN0IGNvbHVtbi4gV2Ugd2lzaAordG8gd3JpdGUgYSBmdW5jdGlvbiBcYyBtYWtlQ2lyY3VsYW50IHdoaWNoLCBnaXZlbiB0aGUgZmlyc3QgY29sdW1uLAorcmV0dXJucyBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY2lyY3VsYW50IG1hdHJpeC4KKworRm9yIHRoaXMgZXhlcmNpc2UsIHRoZSByZXR1cm4gdHlwZSBvZiBcYyBtYWtlQ2lyY3VsYW50IHdpbGwgYmUgYSBDd2lzZU51bGxhcnlPcCB0aGF0IHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgd2l0aDoKKzEgLSBhIHByb3BlciBcYyBjaXJjdWxhbnRfZnVuY3RvciBzdG9yaW5nIHRoZSBpbnB1dCB2ZWN0b3IgYW5kIGltcGxlbWVudGluZyB0aGUgYWRlcXVhdGUgY29lZmZpY2llbnQgYWNjZXNzb3IgXGMgb3BlcmF0b3IoaSxqKQorMiAtIGEgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBvZiBjbGFzcyBNYXRyaXggY29udmV5aW5nIGNvbXBpbGUtdGltZSBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzY2FsYXIgdHlwZSwgc2l6ZXMsIGFuZCBwcmVmZXJyZWQgc3RvcmFnZSBsYXlvdXQuCisKK0NhbGxpbmcgXGMgQXJnVHlwZSB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgdmVjdG9yLCB3ZSBjYW4gY29uc3RydWN0IHRoZSBlcXVpdmFsZW50IHNxdWFyZWQgTWF0cml4IHR5cGUgYXMgZm9sbG93czoKKworXHNuaXBwZXQgbWFrZV9jaXJjdWxhbnQyLmNwcCBzcXVhcmUKKworVGhpcyBsaXR0bGUgaGVscGVyIHN0cnVjdHVyZSB3aWxsIGhlbHAgdXMgdG8gaW1wbGVtZW50IG91ciBcYyBtYWtlQ2lyY3VsYW50IGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisKK1xzbmlwcGV0IG1ha2VfY2lyY3VsYW50Mi5jcHAgbWFrZUNpcmN1bGFudAorCitBcyB1c3VhbCwgb3VyIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IGEgXGMgTWF0cml4QmFzZSAoc2VlIHRoaXMgXHJlZiBUb3BpY0Z1bmN0aW9uVGFraW5nRWlnZW5UeXBlcyAicGFnZSIgZm9yIG1vcmUgZGV0YWlscykuCitUaGVuLCB0aGUgQ3dpc2VOdWxsYXJ5T3Agb2JqZWN0IGlzIGNvbnN0cnVjdGVkIHRocm91Z2ggdGhlIERlbnNlQmFzZTo6TnVsbGFyeUV4cHIgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBhZGVxdWF0ZSBydW50aW1lIHNpemVzLgorCitUaGVuLCB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgXGMgY2lyY3VsYW50X2Z1bmN0b3IsIHdoaWNoIGlzIGEgc3RyYWlnaHRmb3J3YXJkIGV4ZXJjaXNlOgorCitcc25pcHBldCBtYWtlX2NpcmN1bGFudDIuY3BwIGNpcmN1bGFudF9mdW5jCisKK1dlIGFyZSBub3cgYWxsIHNldCB0byB0cnkgb3VyIG5ldyBmZWF0dXJlOgorCitcc25pcHBldCBtYWtlX2NpcmN1bGFudDIuY3BwIG1haW4KKworCitJZiBhbGwgdGhlIGZyYWdtZW50cyBhcmUgY29tYmluZWQsIHRoZSBmb2xsb3dpbmcgb3V0cHV0IGlzIHByb2R1Y2VkLAorc2hvd2luZyB0aGF0IHRoZSBwcm9ncmFtIHdvcmtzIGFzIGV4cGVjdGVkOgorCitcaW5jbHVkZSBtYWtlX2NpcmN1bGFudDIub3V0CisKK1RoaXMgaW1wbGVtZW50YXRpb24gb2YgXGMgbWFrZUNpcmN1bGFudCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBccmVmIFRvcGljTmV3RXhwcmVzc2lvblR5cGUgImRlZmluaW5nIGEgbmV3IGV4cHJlc3Npb24iIGZyb20gc2NyYXRjaC4KKworCitcc2VjdGlvbiBOdWxsYXJ5RXhwcl9JbmRleGluZyBFeGFtcGxlIDI6IGluZGV4aW5nIHJvd3MgYW5kIGNvbHVtbnMKKworVGhlIGdvYWwgaGVyZSBpcyB0byBtaW1pYyBNYXRMYWIncyBhYmlsaXR5IHRvIGluZGV4IGEgbWF0cml4IHRocm91Z2ggdHdvIHZlY3RvcnMgb2YgaW5kaWNlcyByZWZlcmVuY2luZyB0aGUgcm93cyBhbmQgY29sdW1ucyB0byBiZSBwaWNrZWQgcmVzcGVjdGl2ZWx5LCBsaWtlIHRoaXM6CisKK1xzbmlwcGV0IG51bGxhcnlfaW5kZXhpbmcub3V0IG1haW4xCisKK1RvIHRoaXMgZW5kLCBsZXQgdXMgZmlyc3Qgd3JpdGUgYSBudWxsYXJ5LWZ1bmN0b3Igc3RvcmluZyByZWZlcmVuY2VzIHRvIHRoZSBpbnB1dCBtYXRyaXggYW5kIHRvIHRoZSB0d28gYXJyYXlzIG9mIGluZGljZXMsIGFuZCBpbXBsZW1lbnRpbmcgdGhlIHJlcXVpcmVkIFxjIG9wZXJhdG9yKCkoaSxqKToKKworXHNuaXBwZXQgbnVsbGFyeV9pbmRleGluZy5jcHAgZnVuY3RvcgorCitUaGVuLCBsZXQncyBjcmVhdGUgYW4gXGMgaW5kZXhpbmcoQSxyb3dzLGNvbHMpIGZ1bmN0aW9uIGNyZWF0aW5nIHRoZSBudWxsYXJ5IGV4cHJlc3Npb246CisKK1xzbmlwcGV0IG51bGxhcnlfaW5kZXhpbmcuY3BwIGZ1bmN0aW9uCisKK0ZpbmFsbHksIGhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZDoKKworXHNuaXBwZXQgbnVsbGFyeV9pbmRleGluZy5jcHAgbWFpbjEKKworVGhpcyBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gaXMgYWxyZWFkeSBxdWl0ZSBwb3dlcmZ1bCBhcyB0aGUgcm93IG9yIGNvbHVtbiBpbmRleCBhcnJheXMgY2FuIGFsc28gYmUgZXhwcmVzc2lvbnMgdG8gcGVyZm9ybSBvZmZzZXR0aW5nLCBtb2R1bG8sIHN0cmlkaW5nLCByZXZlcnNlLCBldGMuCisKK1xzbmlwcGV0IG51bGxhcnlfaW5kZXhpbmcuY3BwIG1haW4yCisKK2FuZCB0aGUgb3V0cHV0IGlzOgorCitcc25pcHBldCBudWxsYXJ5X2luZGV4aW5nLm91dCBtYWluMgorCisqLworCit9CisKZGlmZiAtLWdpdCBhL2RvYy9DdXN0b21pemluZ0VpZ2VuX1BsdWdpbnMuZG94IGIvZG9jL0N1c3RvbWl6aW5nRWlnZW5fUGx1Z2lucy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ZjI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DdXN0b21pemluZ0VpZ2VuX1BsdWdpbnMuZG94CkBAIC0wLDAgKzEsNjkgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMgRXh0ZW5kaW5nIE1hdHJpeEJhc2UgKGFuZCBvdGhlciBjbGFzc2VzKQorCitJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBzZWUgaG93IHRvIGFkZCBjdXN0b20gbWV0aG9kcyB0byBNYXRyaXhCYXNlLiBTaW5jZSBhbGwgZXhwcmVzc2lvbnMgYW5kIG1hdHJpeCB0eXBlcyBpbmhlcml0IE1hdHJpeEJhc2UsIGFkZGluZyBhIG1ldGhvZCB0byBNYXRyaXhCYXNlIG1ha2UgaXQgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGFsbCBleHByZXNzaW9ucyAhIEEgdHlwaWNhbCB1c2UgY2FzZSBpcywgZm9yIGluc3RhbmNlLCB0byBtYWtlIEVpZ2VuIGNvbXBhdGlibGUgd2l0aCBhbm90aGVyIEFQSS4KKworWW91IGNlcnRhaW5seSBrbm93IHRoYXQgaW4gQysrIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBhZGQgbWV0aG9kcyB0byBhbiBleGlzdGluZyBjbGFzcy4gU28gaG93IHRoYXQncyBwb3NzaWJsZSA/IEhlcmUgdGhlIHRyaWNrIGlzIHRvIGluY2x1ZGUgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIE1hdHJpeEJhc2UgYSBmaWxlIGRlZmluZWQgYnkgdGhlIHByZXByb2Nlc3NvciB0b2tlbiBcYyBFSUdFTl9NQVRSSVhCQVNFX1BMVUdJTjoKK1xjb2RlCitjbGFzcyBNYXRyaXhCYXNlIHsKKyAgLy8gLi4uCisgICNpZmRlZiBFSUdFTl9NQVRSSVhCQVNFX1BMVUdJTgorICAjaW5jbHVkZSBFSUdFTl9NQVRSSVhCQVNFX1BMVUdJTgorICAjZW5kaWYKK307CitcZW5kY29kZQorVGhlcmVmb3JlIHRvIGV4dGVuZCBNYXRyaXhCYXNlIHdpdGggeW91ciBvd24gbWV0aG9kcyB5b3UganVzdCBoYXZlIHRvIGNyZWF0ZSBhIGZpbGUgd2l0aCB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbiBhbmQgZGVmaW5lIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOIGJlZm9yZSB5b3UgaW5jbHVkZSBhbnkgRWlnZW4ncyBoZWFkZXIgZmlsZS4KKworWW91IGNhbiBleHRlbmQgbWFueSBvZiB0aGUgb3RoZXIgY2xhc3NlcyB1c2VkIGluIEVpZ2VuIGJ5IGRlZmluaW5nIHNpbWlsYXJseSBuYW1lZCBwcmVwcm9jZXNzb3Igc3ltYm9scy4gRm9yIGluc3RhbmNlLCBkZWZpbmUgXGMgRUlHRU5fQVJSQVlCQVNFX1BMVUdJTiBpZiB5b3Ugd2FudCB0byBleHRlbmQgdGhlIEFycmF5QmFzZSBjbGFzcy4gQSBmdWxsIGxpc3Qgb2YgY2xhc3NlcyB0aGF0IGNhbiBiZSBleHRlbmRlZCBpbiB0aGlzIHdheSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcHJlcHJvY2Vzc29yIHN5bWJvbHMgY2FuIGJlIGZvdW5kIG9uIG91ciBwYWdlIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXh0ZW5zaW9uIGZpbGUgZm9yIGFkZGluZyBtZXRob2RzIHRvIE1hdHJpeEJhc2U6IFxuCitcYiBNYXRyaXhCYXNlQWRkb25zLmgKK1xjb2RlCitpbmxpbmUgU2NhbGFyIGF0KHVpbnQgaSwgdWludCBqKSBjb25zdCB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKGksaik7IH0KK2lubGluZSBTY2FsYXImIGF0KHVpbnQgaSwgdWludCBqKSB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKGksaik7IH0KK2lubGluZSBTY2FsYXIgYXQodWludCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5vcGVyYXRvcltdKGkpOyB9CitpbmxpbmUgU2NhbGFyJiBhdCh1aW50IGkpIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yW10oaSk7IH0KKworaW5saW5lIFJlYWxTY2FsYXIgc3F1YXJlZExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHNxdWFyZWROb3JtKCk7IH0KK2lubGluZSBSZWFsU2NhbGFyIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG5vcm0oKTsgfQoraW5saW5lIFJlYWxTY2FsYXIgaW52TGVuZ3RoKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGZhc3RfaW52X3NxcnQoc3F1YXJlZE5vcm0oKSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIFNjYWxhciBzcXVhcmVkRGlzdGFuY2VUbyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreyByZXR1cm4gKGRlcml2ZWQoKSAtIG90aGVyLmRlcml2ZWQoKSkuc3F1YXJlZE5vcm0oKTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgUmVhbFNjYWxhciBkaXN0YW5jZVRvKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiBpbnRlcm5hbDo6c3FydChkZXJpdmVkKCkuc3F1YXJlZERpc3RhbmNlVG8ob3RoZXIpKTsgfQorCitpbmxpbmUgdm9pZCBzY2FsZVRvKFJlYWxTY2FsYXIgbCkgeyBSZWFsU2NhbGFyIHZsID0gbm9ybSgpOyBpZiAodmw+MWUtOSkgZGVyaXZlZCgpICo9IChsL3ZsKTsgfQorCitpbmxpbmUgVHJhbnNwb3NlPERlcml2ZWQ+IHRyYW5zcG9zZWQoKSB7cmV0dXJuIHRoaXMtPnRyYW5zcG9zZSgpO30KK2lubGluZSBjb25zdCBUcmFuc3Bvc2U8RGVyaXZlZD4gdHJhbnNwb3NlZCgpIGNvbnN0IHtyZXR1cm4gdGhpcy0+dHJhbnNwb3NlKCk7fQorCitpbmxpbmUgdWludCBtaW5Db21wb25lbnRJZCh2b2lkKSBjb25zdCAgeyBpbnQgaTsgdGhpcy0+bWluQ29lZmYoJmkpOyByZXR1cm4gaTsgfQoraW5saW5lIHVpbnQgbWF4Q29tcG9uZW50SWQodm9pZCkgY29uc3QgIHsgaW50IGk7IHRoaXMtPm1heENvZWZmKCZpKTsgcmV0dXJuIGk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBtYWtlRmxvb3IoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgeyBkZXJpdmVkKCkgPSBkZXJpdmVkKCkuY3dpc2VNaW4ob3RoZXIuZGVyaXZlZCgpKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBtYWtlQ2VpbChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7IGRlcml2ZWQoKSA9IGRlcml2ZWQoKS5jd2lzZU1heChvdGhlci5kZXJpdmVkKCkpOyB9CisKK2NvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlPgorb3BlcmF0b3IrKGNvbnN0IFNjYWxhciYgc2NhbGFyKSBjb25zdAoreyByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDb25zdGFudFJldHVyblR5cGU+KGRlcml2ZWQoKSwgQ29uc3RhbnQocm93cygpLGNvbHMoKSxzY2FsYXIpKTsgfQorCitmcmllbmQgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LCBjb25zdCBDb25zdGFudFJldHVyblR5cGUsIERlcml2ZWQ+CitvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBzY2FsYXIsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdCkKK3sgcmV0dXJuIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlLCBEZXJpdmVkPihDb25zdGFudChyb3dzKCksY29scygpLHNjYWxhciksIG1hdC5kZXJpdmVkKCkpOyB9CitcZW5kY29kZQorCitUaGVuIG9uZSBjYW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpbiB0aGUgY29uZmlnLmggb3Igd2hhdGV2ZXIgcHJlcmVxdWlzaXRlcyBoZWFkZXIgZmlsZSBvZiBoaXMgcHJvamVjdDoKK1xjb2RlCisjZGVmaW5lIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOICJNYXRyaXhCYXNlQWRkb25zLmgiCitcZW5kY29kZQorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvRGVuc2VEZWNvbXBvc2l0aW9uQmVuY2htYXJrLmRveCBiL2RvYy9EZW5zZURlY29tcG9zaXRpb25CZW5jaG1hcmsuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTljNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRGVuc2VEZWNvbXBvc2l0aW9uQmVuY2htYXJrLmRveApAQCAtMCwwICsxLDQyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBEZW5zZURlY29tcG9zaXRpb25CZW5jaG1hcmsgQmVuY2htYXJrIG9mIGRlbnNlIGRlY29tcG9zaXRpb25zCisKK1RoaXMgcGFnZSBwcmVzZW50cyBhIHNwZWVkIGNvbXBhcmlzb24gb2YgdGhlIGRlbnNlIG1hdHJpeCBkZWNvbXBvc2l0aW9ucyBvZmZlcmVkIGJ5ICVFaWdlbiBmb3IgYSB3aWRlIHJhbmdlIG9mIHNxdWFyZSBtYXRyaWNlcyBhbmQgb3ZlcmNvbnN0cmFpbmVkIHByb2JsZW1zLgorCitGb3IgYSBtb3JlIGdlbmVyYWwgb3ZlcnZpZXcgb24gdGhlIGZlYXR1cmVzIGFuZCBudW1lcmljYWwgcm9idXN0bmVzcyBvZiBsaW5lYXIgc29sdmVycyBhbmQgZGVjb21wb3NpdGlvbnMsIGNoZWNrIHRoaXMgXGxpbmsgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMgdGFibGUgXGVuZGxpbmsuCisKK1RoaXMgYmVuY2htYXJrIGhhcyBiZWVuIHJ1biBvbiBhIGxhcHRvcCBlcXVpcHBlZCB3aXRoIGFuIEludGVsIGNvcmUgaTcgXEAgMiw2IEdIeiwgYW5kIGNvbXBpbGVkIHdpdGggY2xhbmcgd2l0aCBcYiBBVlggYW5kIFxiIEZNQSBpbnN0cnVjdGlvbiBzZXRzIGVuYWJsZWQgYnV0IHdpdGhvdXQgbXVsdGktdGhyZWFkaW5nLgorSXQgdXNlcyBcYiBzaW5nbGUgXGIgcHJlY2lzaW9uIFxiIGZsb2F0IG51bWJlcnMuIEZvciBkb3VibGUsIHlvdSBjYW4gZ2V0IGEgZ29vZCBlc3RpbWF0ZSBieSBtdWx0aXBseWluZyB0aGUgdGltaW5ncyBieSBhIGZhY3RvciAyLgorCitUaGUgc3F1YXJlIG1hdHJpY2VzIGFyZSBzeW1tZXRyaWMsIGFuZCBmb3IgdGhlIG92ZXJjb25zdHJhaW5lZCBtYXRyaWNlcywgdGhlIHJlcG9ydGVkIHRpbW1pbmdzIGluY2x1ZGUgdGhlIGNvc3QgdG8gY29tcHV0ZSB0aGUgc3ltbWV0cmljIGNvdmFyaWFuY2UgbWF0cml4IFxmJCBBXlQgQSBcZiQgZm9yIHRoZSBmaXJzdCBmb3VyIHNvbHZlcnMgYmFzZWQgb24gQ2hvbGVza3kgYW5kIExVLCBhcyBkZW5vdGVkIGJ5IHRoZSBcYiAqIHN5bWJvbCAodG9wLXJpZ2h0IGNvcm5lciBwYXJ0IG9mIHRoZSB0YWJsZSkuCitUaW1pbmdzIGFyZSBpbiBcYiBtaWxsaXNlY29uZHMsIGFuZCBmYWN0b3JzIGFyZSByZWxhdGl2ZSB0byB0aGUgTExUIGRlY29tcG9zaXRpb24gd2hpY2ggaXMgdGhlIGZhc3Rlc3QgYnV0IGFsc28gdGhlIGxlYXN0IGdlbmVyYWwgYW5kIHJvYnVzdC4KKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5zb2x2ZXIvc2l6ZTwvdGg+CisgIDx0aD44eDg8L3RoPiAgPHRoPjEwMHgxMDA8L3RoPiAgPHRoPjEwMDB4MTAwMDwvdGg+ICA8dGg+NDAwMHg0MDAwPC90aD4gIDx0aD4xMDAwMHg4PC90aD4gIDx0aD4xMDAwMHgxMDA8L3RoPiAgPHRoPjEwMDAweDEwMDA8L3RoPiAgPHRoPjEwMDAweDQwMDA8L3RoPjwvdHI+Cis8dHI+PHRkPkxMVDwvdGQ+PHRkPjAuMDU8L3RkPjx0ZD4wLjQyPC90ZD48dGQ+NS44MzwvdGQ+PHRkPjM3NC41NTwvdGQ+PHRkPjYuNzkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjx0ZD4zMC4xNSA8c3VwPjxhIGhyZWY9IiNub3RlX2xzIj4qPC9hPjwvc3VwPjwvdGQ+PHRkPjIzNi4zNCA8c3VwPjxhIGhyZWY9IiNub3RlX2xzIj4qPC9hPjwvc3VwPjwvdGQ+PHRkPjM4NDcuMTcgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPkxETFQ8L3RkPjx0ZD4wLjA3ICh4MS4zKTwvdGQ+PHRkPjAuNjUgKHgxLjUpPC90ZD48dGQ+MjYuODYgKHg0LjYpPC90ZD48dGQ+MjM2MS4xOCAoeDYuMyk8L3RkPjx0ZD42LjgxICh4MSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjx0ZD4zMS45MSAoeDEuMSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjx0ZD4yNTIuNjEgKHgxLjEpIDxzdXA+PGEgaHJlZj0iI25vdGVfbHMiPio8L2E+PC9zdXA+PC90ZD48dGQ+NTgwNy42NiAoeDEuNSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjwvdHI+Cis8dHI+PHRkPlBhcnRpYWxQaXZMVTwvdGQ+PHRkPjAuMDggKHgxLjUpPC90ZD48dGQ+MC42OSAoeDEuNik8L3RkPjx0ZD4xNS42MyAoeDIuNyk8L3RkPjx0ZD43MDkuMzIgKHgxLjkpPC90ZD48dGQ+Ni44MSAoeDEpIDxzdXA+PGEgaHJlZj0iI25vdGVfbHMiPio8L2E+PC9zdXA+PC90ZD48dGQ+MzEuMzIgKHgxKSA8c3VwPjxhIGhyZWY9IiNub3RlX2xzIj4qPC9hPjwvc3VwPjwvdGQ+PHRkPjI0MS42OCAoeDEpIDxzdXA+PGEgaHJlZj0iI25vdGVfbHMiPio8L2E+PC9zdXA+PC90ZD48dGQ+NDI3MC40OCAoeDEuMSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPkZ1bGxQaXZMVTwvdGQ+PHRkPjAuMSAoeDEuOSk8L3RkPjx0ZD40LjQ4ICh4MTAuNik8L3RkPjx0ZD4yODEuMzMgKHg0OC4yKTwvdGQ+PHRkPi08L3RkPjx0ZD42LjgzICh4MSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjx0ZD4zMi42NyAoeDEuMSkgPHN1cD48YSBocmVmPSIjbm90ZV9scyI+KjwvYT48L3N1cD48L3RkPjx0ZD40OTguMjUgKHgyLjEpIDxzdXA+PGEgaHJlZj0iI25vdGVfbHMiPio8L2E+PC9zdXA+PC90ZD48dGQ+LTwvdGQ+PC90cj4KKzx0cj48dGQ+SG91c2Vob2xkZXJRUjwvdGQ+PHRkPjAuMTkgKHgzLjUpPC90ZD48dGQ+Mi4xOCAoeDUuMik8L3RkPjx0ZD4yMy40MiAoeDQpPC90ZD48dGQ+MTMzNy41MiAoeDMuNik8L3RkPjx0ZD4zNC4yNiAoeDUpPC90ZD48dGQ+MTI5LjAxICh4NC4zKTwvdGQ+PHRkPjM3Ny4zNyAoeDEuNik8L3RkPjx0ZD40ODM5LjEgKHgxLjMpPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5Db2xQaXZIb3VzZWhvbGRlclFSPC90ZD48dGQ+MC4yMyAoeDQuMyk8L3RkPjx0ZD4yLjIzICh4NS4zKTwvdGQ+PHRkPjEwMy4zNCAoeDE3LjcpPC90ZD48dGQ+OTk4Ny4xNiAoeDI2LjcpPC90ZD48dGQ+MzYuMDUgKHg1LjMpPC90ZD48dGQ+MTYzLjE4ICh4NS40KTwvdGQ+PHRkPjIzNTQuMDggKHgxMCk8L3RkPjx0ZD4zNzg2MC41ICh4OS44KTwvdGQ+PC90cj4KKzx0cj48dGQ+Q29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjwvdGQ+PHRkPjAuMjMgKHg0LjMpPC90ZD48dGQ+Mi4yMiAoeDUuMik8L3RkPjx0ZD45OS40NCAoeDE3LjEpPC90ZD48dGQ+MTA1NTUuMyAoeDI4LjIpPC90ZD48dGQ+MzUuNzUgKHg1LjMpPC90ZD48dGQ+MTY5LjM5ICh4NS42KTwvdGQ+PHRkPjIxNTAuNTYgKHg5LjEpPC90ZD48dGQ+MzY5ODEuOCAoeDkuNik8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPkZ1bGxQaXZIb3VzZWhvbGRlclFSPC90ZD48dGQ+MC4yMyAoeDQuMyk8L3RkPjx0ZD40LjY0ICh4MTEpPC90ZD48dGQ+Mjg5LjEgKHg0OS42KTwvdGQ+PHRkPi08L3RkPjx0ZD42OS4zOCAoeDEwLjIpPC90ZD48dGQ+NDQ2LjczICh4MTQuOCk8L3RkPjx0ZD40ODUyLjEyICh4MjAuNSk8L3RkPjx0ZD4tPC90ZD48L3RyPgorPHRyPjx0ZD5KYWNvYmlTVkQ8L3RkPjx0ZD4xLjAxICh4MTguNik8L3RkPjx0ZD43MS40MyAoeDE2OC40KTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+MTEzLjgxICh4MTYuNyk8L3RkPjx0ZD4xMTc5LjY2ICh4MzkuMSk8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+QkRDU1ZEPC90ZD48dGQ+MS4wNyAoeDE5LjcpPC90ZD48dGQ+MjEuODMgKHg1MS41KTwvdGQ+PHRkPjMzMS43NyAoeDU2LjkpPC90ZD48dGQ+MTg1ODcuOSAoeDQ5LjYpPC90ZD48dGQ+MTEwLjUzICh4MTYuMyk8L3RkPjx0ZD4zOTcuNjcgKHgxMy4yKTwvdGQ+PHRkPjI5NzUgKHgxMi42KTwvdGQ+PHRkPjQ4NTkzLjIgKHgxMi42KTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKzxhIG5hbWU9Im5vdGVfbHMiPlxiICo6IDwvYT4gVGhpcyBkZWNvbXBvc2l0aW9uIGRvIG5vdCBzdXBwb3J0IGRpcmVjdCBsZWFzdC1zcXVhcmUgc29sdmluZyBmb3Igb3Zlci1jb25zdHJhaW5lZCBwcm9ibGVtcywgYW5kIHRoZSByZXBvcnRlZCB0aW1pbmcgaW5jbHVkZSB0aGUgY29zdCB0byBmb3JtIHRoZSBzeW1tZXRyaWMgY292YXJpYW5jZSBtYXRyaXggXGYkIEFeVCBBIFxmJC4KKworXGIgT2JzZXJ2YXRpb25zOgorICsgTExUIGlzIGFsd2F5cyB0aGUgZmFzdGVzdCBzb2x2ZXJzLgorICsgRm9yIGxhcmdlbHkgb3Zlci1jb25zdHJhaW5lZCBwcm9ibGVtcywgdGhlIGNvc3Qgb2YgQ2hvbGVza3kvTFUgZGVjb21wb3NpdGlvbnMgaXMgZG9taW5hdGVkIGJ5IHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgc3ltbWV0cmljIGNvdmFyaWFuY2UgbWF0cml4LgorICsgRm9yIGxhcmdlIHByb2JsZW0gc2l6ZXMsIG9ubHkgdGhlIGRlY29tcG9zaXRpb24gaW1wbGVtZW50aW5nIGEgY2FjaGUtZnJpZW5kbHkgYmxvY2tpbmcgc3RyYXRlZ3kgc2NhbGUgd2VsbC4gVGhvc2UgaW5jbHVkZSBMTFQsIFBhcnRpYWxQaXZMVSwgSG91c2Vob2xkZXJRUiwgYW5kIEJEQ1NWRC4gVGhpcyBleHBsYWluIHdoeSBmb3IgYSA0ayB4IDRrIG1hdHJpeCwgSG91c2Vob2xkZXJRUiBpcyBmYXN0ZXIgdGhhbiBMRExULiBJbiB0aGUgZnV0dXJlLCBMRExUIGFuZCBDb2xQaXZIb3VzZWhvbGRlclFSIHdpbGwgYWxzbyBpbXBsZW1lbnQgYmxvY2tpbmcgc3RyYXRlZ2llcy4KKyArIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24gaXMgYmFzZWQgb24gQ29sUGl2SG91c2Vob2xkZXJRUiBhbmQgdGhleSB0aHVzIGFjaGlldmUgdGhlIHNhbWUgbGV2ZWwgb2YgcGVyZm9ybWFuY2UuCisKK1RoZSBhYm92ZSB0YWJsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYml0YnVja2V0Lm9yZy9laWdlbi9laWdlbi9yYXcvZGVmYXVsdC9iZW5jaC9kZW5zZV9zb2x2ZXJzLmNwcCI+YmVuY2gvZGVuc2Vfc29sdmVycy5jcHA8L2E+IGZpbGUsIGZlZWwtZnJlZSB0byBoYWNrIGl0IHRvIGdlbmVyYXRlIGEgdGFibGUgbWF0Y2hpbmcgeW91ciBoYXJkd2FyZSwgY29tcGlsZXIsIGFuZCBmYXZvcml0ZSBwcm9ibGVtIHNpemVzLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvRG94eWZpbGUuaW4gYi9kb2MvRG94eWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiYjBhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Eb3h5ZmlsZS5pbgpAQCAtMCwwICsxLDE4OTcgQEAKKyMgRG94eWZpbGUgMS44LjEuMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwKKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBzZXF1ZW5jZSBvZiB3b3JkcykgdGhhdCBzaG91bGQKKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkCisjIHRvIHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBwcm9qZWN0IG5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gJHtFSUdFTl9ET1hZX1BST0pFQ1RfTkFNRX0KKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IKKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKKyMgRUlHRU5fVkVSU0lPTiBpcyBzZXQgaW4gdGhlIHJvb3QgQ01ha2VMaXN0cy50eHQKKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9ICIke0VJR0VOX1ZFUlNJT059IgorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlcgorIyBhIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0KKworIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcworIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QKKyMgZXhjZWVkIDU1IHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2MvRWlnZW5fU2lsbHlfUHJvZmVzc29yXzY0eDY0LnBuZyIKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2Mke0VJR0VOX0RPWFlfT1VUUFVUX0RJUkVDVE9SWV9TVUZGSVh9IgorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIDQwOTYgc3ViLWRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQKKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLgorIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2YKKyMgc291cmNlIGZpbGVzLCB3aGVyZSBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2gsIG90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOgorIyBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLVRyYWRpdGlvbmFsLAorIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLAorIyBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaAorIyBtZXNzYWdlcyksIEtvcmVhbiwgS29yZWFuLWVuLCBMaXRodWFuaWFuLCBOb3J3ZWdpYW4sIE1hY2Vkb25pYW4sIFBlcnNpYW4sCisjIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywKKyMgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVWtyYWluaWFuLCBhbmQgVmlldG5hbWVzZS4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbgorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4KKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgcHJlcGVuZAorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IKKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcKKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQorIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLgorIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5CisjIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0IgorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiCisjICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIgorCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0gIlRoZSAkbmFtZSBjbGFzcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgd2lkZ2V0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSBmaWxlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlCisKKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZworIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQorIyBwYXRoIHRvIHN0cmlwLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0KKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZgorIyB0aGUgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMKKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLgorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzCisjIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQgc3BlY2lmeSB0aGUgaW5jbHVkZSBwYXRocyB0aGF0CisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLgorCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0KKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIKKyMgKGJ1dCBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91ciBmaWxlIHN5c3RlbQorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KKyMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYworIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cworIyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbgorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJvbmx5X2Zvcl92ZWN0b3JzPVRoaXMgaXMgb25seSBmb3IgdmVjdG9ycyAoZWl0aGVyIHJvdy12ZWN0b3JzIG9yIGNvbHVtbi12ZWN0b3JzKSwgaS5lLiBtYXRyaWNlcyB3aGljaCBhcmUga25vd24gYXQgY29tcGlsZS10aW1lIHRvIGhhdmUgZWl0aGVyIG9uZSByb3cgb3Igb25lIGNvbHVtbi4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm90X3JlZW50cmFudD1cd2FybmluZyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZS1lbnRyYW50LiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheV9tb2R1bGU9VGhpcyBpcyBkZWZpbmVkIGluIHRoZSAlQXJyYXkgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vQXJyYXk+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImNob2xlc2t5X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVDaG9sZXNreSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZWlnZW52YWx1ZXNfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJUVpZ2VudmFsdWVzIG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJnZW9tZXRyeV9tb2R1bGU9VGhpcyBpcyBkZWZpbmVkIGluIHRoZSAlR2VvbWV0cnkgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvdXNlaG9sZGVyX21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVIb3VzZWhvbGRlciBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9Ib3VzZWhvbGRlcj4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiamFjb2JpX21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVKYWNvYmkgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vSmFjb2JpPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJsdV9tb2R1bGU9VGhpcyBpcyBkZWZpbmVkIGluIHRoZSAlTFUgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vTFU+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgInFyX21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVRUiBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9RUj4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3ZkX21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVTVkQgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vU1ZEPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjaWFsZnVuY3Rpb25zX21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlIFxiIHVuc3VwcG9ydGVkIFNwZWNpYWxGdW5jdGlvbnMgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWw9XGJ1ZyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRyaXh3b3JsZD08YSBocmVmPScjbWF0cml4b25seScgc3R5bGU9J2NvbG9yOmdyZWVuO3RleHQtZGVjb3JhdGlvbjogbm9uZTsnPio8L2E+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5d29ybGQ9PGEgaHJlZj0nI2FycmF5b25seScgc3R5bGU9J2NvbG9yOmJsdWU7dGV4dC1kZWNvcmF0aW9uOiBub25lOyc+KjwvYT4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm90ZV9hYm91dF9hcmJpdHJhcnlfY2hvaWNlX29mX3NvbHV0aW9uPUlmIHRoZXJlIGV4aXN0cyBtb3JlIHRoYW4gb25lIHNvbHV0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGFyYml0cmFyaWx5IGNob29zZSBvbmUuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGVfYWJvdXRfdXNpbmdfa2VybmVsX3RvX3N0dWR5X211bHRpcGxlX3NvbHV0aW9ucz1JZiB5b3UgbmVlZCBhIGNvbXBsZXRlIGFuYWx5c2lzIG9mIHRoZSBzcGFjZSBvZiBzb2x1dGlvbnMsIHRha2UgdGhlIG9uZSBzb2x1dGlvbiBvYnRhaW5lZCBieSB0aGlzIG1ldGhvZCBhbmQgYWRkIHRvIGl0IGVsZW1lbnRzIG9mIHRoZSBrZXJuZWwsIGFzIGRldGVybWluZWQgYnkga2VybmVsKCkuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGVfYWJvdXRfY2hlY2tpbmdfc29sdXRpb25zPVRoaXMgbWV0aG9kIGp1c3QgdHJpZXMgdG8gZmluZCBhcyBnb29kIGEgc29sdXRpb24gYXMgcG9zc2libGUuIElmIHlvdSB3YW50IHRvIGNoZWNrIHdoZXRoZXIgYSBzb2x1dGlvbiBleGlzdHMgb3IgaWYgaXQgaXMgYWNjdXJhdGUsIGp1c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBhIHJlc3VsdCBhbmQgdGhlbiBjb21wdXRlIHRoZSBlcnJvciBvZiB0aGlzIHJlc3VsdCwgb3IgdXNlIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgZGlyZWN0bHksIGZvciBpbnN0YW5jZSBsaWtlIHRoaXM6IFxjb2RlIGJvb2wgYV9zb2x1dGlvbl9leGlzdHMgPSAoQSpyZXN1bHQpLmlzQXBwcm94KGIsIHByZWNpc2lvbik7IFxlbmRjb2RlIFRoaXMgbWV0aG9kIGF2b2lkcyBkaXZpZGluZyBieSB6ZXJvLCBzbyB0aGF0IHRoZSBub24tZXhpc3RlbmNlIG9mIGEgc29sdXRpb24gZG9lc24ndCBieSBpdHNlbGYgbWVhbiB0aGF0IHlvdSdsbCBnZXQgXGMgaW5mIG9yIFxjIG5hbiB2YWx1ZXMuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGVfdHJ5X3RvX2hlbHBfcnZvPVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IGJ5IHZhbHVlLiBJbiBvcmRlciB0byBtYWtlIHRoYXQgZWZmaWNpZW50LCBpdCBpcyBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgcmV0dXJuIHN0YXRlbWVudCB1c2luZyBhIHNwZWNpYWwgY29uc3RydWN0b3IsIGhvcGVmdWxseSBhbGxvd2luZyB0aGUgY29tcGlsZXIgdG8gcGVyZm9ybSBhIFJWTyAocmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbikuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnN0YWJsZXlldD1cd2FybmluZyBUaGlzIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIHBhcnQgb2YgdGhlIHN0YWJsZSBwdWJsaWMgQVBJIHlldC4gQ2hhbmdlcyBtYXkgaGFwcGVuIGluIGZ1dHVyZSByZWxlYXNlcy4gU2VlIFxyZWYgRXhwZXJpbWVudGFsIFwiRXhwZXJpbWVudGFsIHBhcnRzIG9mIEVpZ2VuXCIiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wbHNwYXJzZXNvbHZlcmNvbmNlcHQ9VGhpcyBjbGFzcyBmb2xsb3dzIHRoZSBcbGluayBUdXRvcmlhbFNwYXJzZVNvbHZlckNvbmNlcHQgc3BhcnNlIHNvbHZlciBjb25jZXB0IFxlbmRsaW5rLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJibGFuaz0gIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImNwcDExPTxzcGFuIGNsYXNzPSdjcHAxMSc+W2MrKzExXTwvc3Bhbj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY3BwMTQ9PHNwYW4gY2xhc3M9J2NwcDE0Jz5bYysrMTRdPC9zcGFuPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJjcHAxNz08c3BhbiBjbGFzcz0nY3BwMTcnPltjKysxN108L3NwYW4+IgorICAgICAgICAgICAgICAgICAgICAgICAgIAorCitBTElBU0VTICs9ICJlaWdlbkF1dG9Ub2M9ICAiCitBTElBU0VTICs9ICJlaWdlbk1hbnVhbFBhZ2U9XGRlZmdyb3VwIgorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgImNsYXNzPWl0Y2w6OmNsYXNzIiB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlCisjIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPQorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0CisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcgorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZAorIyBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcgorIyBGb3J0cmFuLgorCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwKKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yCisjIFZIREwuCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLgorIyBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdCB1c2luZyB0aGlzCisjIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQgbGFuZ3VhZ2UKKyMgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsIENTaGFycCwgQywKKyMgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwsIEMsIEMrKy4gRm9yIGluc3RhbmNlIHRvIG1ha2UKKyMgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMKKyMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLiBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zCisjIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4KKworRVhURU5TSU9OX01BUFBJTkcgICAgICA9IC5oPUMrKyBub19leHRlbnNpb249QysrCisKKyMgSWYgTUFSS0RPV05fU1VQUE9SVCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsCisjIGNvbW1lbnRzIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91CisjIGNhbiBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuCisjIERpc2FibGUgb25seSBpbiBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZAorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOyB2LnMuCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2VzIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4KKyMgRG94eWdlbiB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljCisjIGluc3RlYWQgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUgZ2V0dGVyCisjIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgKHRoZSBkZWZhdWx0KQorIyB3aWxsIG1ha2UgZG94eWdlbiByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yCisjIHNldHRpbmcgYSBzaW1wbGUgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlCisjIG1ldGhvZHMgYW55d2F5LCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IFlFUworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZAorIyB1bmlvbnMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcKKyMgQGluZ3JvdXApIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvcgorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kCisjIHVuaW9ucyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXAKKyMgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCksCisjIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbgorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLgorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UKKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5LgorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUKKyMgcGVyZm9ybWFuY2UgYnkga2VlcGluZyBtb3JlIHN5bWJvbHMgaW4gbWVtb3J5LiBOb3RlIHRoYXQgdGhlIHZhbHVlIHdvcmtzIG9uCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnaGx5IGRvdWJsZSB0aGUKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6CisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLgorCisjIFNZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMgU2ltaWxhciB0byB0aGUgU1lNQk9MX0NBQ0hFX1NJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlCisjIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbgorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQorIyBzYW1lIHN5bWJvbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZgorIyBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbCBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcworIyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLAorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcworIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBOTworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UKKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0CisjIGFub255bW91cyBuYW1lc3BhY2VzIGFyZSBoaWRkZW4uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLgorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMKKyMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBZRVMKKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbgorIyB0aGF0IGlzIHR5cGVkIGFmdGVyIGEgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0CisjIHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGV4Y2x1ZGVkLgorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSAke0VJR0VOX0RPWFlfSU5URVJOQUx9CisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGF0IGZpbGUuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSAke0VJR0VOX0RPWFlfSU5URVJOQUx9CisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIGxpc3QgaW5jbHVkZSBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQorIyBpcyBpbnNlcnRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5CisjIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0CisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlCisjIGFscGhhYmV0aWNhbCBsaXN0LgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbgorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9ICR7RUlHRU5fRE9YWV9JTlRFUk5BTH0KKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSAke0VJR0VOX0RPWFlfSU5URVJOQUx9CisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9CisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMKKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcgorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZAorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQorIyBOYW1lc3BhY2VzIHBhZ2UuCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgKKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IE5PCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0CisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZgorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0KKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLgorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkCisjIERveHlnZW5MYXlvdXQueG1sIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisKK0xBWU9VVF9GSUxFICAgICAgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2Mke0VJR0VOX0RPWFlfT1VUUFVUX0RJUkVDVE9SWV9TVUZGSVh9L2VpZ2VuZG94eV9sYXlvdXQueG1sIgorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMKKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQorIyAuYmliIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFVzaW5nIHRoaXMgY29tbWFuZAorIyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbworIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlCisjIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcworIyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlIHNlYXJjaCBwYXRoLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZAorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rCisjIE5PIGlzIHVzZWQuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncworIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gTk8KKworIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdAorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoZSBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mCisjIGRvY3VtZW50YXRpb24uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUKKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4KKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcgorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgd2l0aCBzcGFjZXMuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSAke0VJR0VOX0RPWFlfSU5QVVR9CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcworIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdAorIyBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdAorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6CisjICouYyAqLmNjICouY3h4ICouY3BwICouYysrICouZCAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaAorIyAqLmh4eCAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLmRveCAqLnB5CisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwKKworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICoKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMKKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L0VpZ2VuL0VpZ2VuMlN1cHBvcnQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9TT1VSQ0VfRElSfS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9leGFtcGxlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9zcGVjaWFsX2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL3NuaXBwZXRzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzIgorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQKKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSBDTWFrZSogXAorICAgICAgICAgICAgICAgICAgICAgICAgICoudHh0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm9yaWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZGlmZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKn4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICouIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnNsbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5zZGYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoudG1wIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnZjeHByb2ogXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZmlsdGVycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi51c2VyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnN1bworCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSBpbnRlcm5hbDo6KiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ2dlZCogXAorICAgICAgICAgICAgICAgICAgICAgICAgICpJbm5lckl0ZXJhdG9yKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VTdG9yYWdlPCogXAorICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2Mvc25pcHBldHMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2Mvc25pcHBldHMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2MvZXhhbXBsZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZXhhbXBsZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2Mvc3BlY2lhbF9leGFtcGxlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9zcGVjaWFsX2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fQklOQVJZX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fQklOQVJZX0RJUn0vdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzIgorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUKKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlCisjIHRoZSBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuCisjIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlciBwcm9ncmFtIHdyaXRlcworIyB0byBzdGFuZGFyZCBvdXRwdXQuCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUKKyMgaWdub3JlZC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4KKyMgRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLgorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOgorIyBwYXR0ZXJuPWZpbHRlciAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlcgorIyBpbmZvIG9uIGhvdyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgZW1wdHkgb3IgaWYKKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9CisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuCisjIHVzaW5nICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLiBUaGlzIG9wdGlvbiBvbmx5IGhhcyBlZmZlY3Qgd2hlbgorIyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIGVuYWJsZWQuCisKK0ZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbAorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QKKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZAorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcworIyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tCisjIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZCBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwKKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuCisjIE90aGVyd2lzZSB0aGV5IHdpbGwgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZQorIyB3aWxsIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4KKyMgYnVpbHQtaW4gc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZQorIyB0YWdnaW5nIHN5c3RlbSAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3UKKyMgd2lsbCBuZWVkIHZlcnNpb24gNC44LjYgb3IgaGlnaGVyLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdAorIyBjb250YWlucyBhIGxvdCBvZiBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IE5PCisKKyMgSWYgdGhlIGFscGhhYmV0aWNhbCBpbmRleCBpcyBlbmFibGVkIChzZWUgQUxQSEFCRVRJQ0FMX0lOREVYKSB0aGVuCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucworIyBpbiB3aGljaCB0aGlzIGxpc3Qgd2lsbCBiZSBzcGxpdCAoY2FuIGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMS4uMjBdKQorCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwKKyMgY2xhc3NlcyB3aWxsIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4KKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdAorIyBzaG91bGQgYmUgaWdub3JlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sJHtFSUdFTl9ET1hZX09VVFBVVF9ESVJFQ1RPUllfU1VGRklYfSIKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaworIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgaGVhZGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBhIGN1c3RvbSBoZWFkZXIgeW91IGFyZSByZXNwb25zaWJsZQorIyAgZm9yIHRoZSBwcm9wZXIgaW5jbHVzaW9uIG9mIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMgdGhhdCBkb3h5Z2VuCisjIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkLgorIyBJdCBpcyBhZHZpc2VkIHRvIGdlbmVyYXRlIGEgZGVmYXVsdCBoZWFkZXIgdXNpbmcgImRveHlnZW4gLXcgaHRtbAorIyBoZWFkZXIuaHRtbCBmb290ZXIuaHRtbCBzdHlsZXNoZWV0LmNzcyBZb3VyQ29uZmlnRmlsZSIgYW5kIHRoZW4gbW9kaWZ5CisjIHRoYXQgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5CisjIGhhdmUgdG8gcmVkbyB0aGlzIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuIG9yIHdoZW4KKyMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgc3VjaCBhcyBHRU5FUkFURV9UUkVFVklFVyEKKworSFRNTF9IRUFERVIgICAgICAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9laWdlbmRveHlfaGVhZGVyLmh0bWwiCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBmb290ZXIuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZWlnZW5kb3h5X2Zvb3Rlci5odG1sIgorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkKKyMgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgc28gZG9uJ3QgcHV0IHlvdXIgb3duCisjIHN0eWxlIHNoZWV0IGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYXMgd2VsbCwgb3IgaXQgd2lsbCBiZSBlcmFzZWQhCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aCQgbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9laWdlbmRveHkuY3NzIgorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LgorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcworIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwKKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuCisjIFRoZSBkZWZhdWx0IGlzIDIyMC4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9ICR7RUlHRU5fRE9YWV9IVE1MX0NPTE9SU1RZTEVfSFVFfQorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZgorIyB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlCisjIGdyYXlzY2FsZXMgb25seS4gQSB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8KKyMgdGhlIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdworIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwKKyMgc28gODAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLAorIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuCisKK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAorCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTAorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcKKyMgdGhpcyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IFlFUworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YKKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQKKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLgorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkKKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0LgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0CisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKKyMgaXQgYXQgc3RhcnR1cC4KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKKyMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMKKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUKKyMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXBpbGVkIEhUTUwgaGVscCBmaWxlICguY2htKQorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0gZmlsZS4gWW91CisjIGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGggaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YKKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1bgorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBHRU5FUkFURV9DSEkgZmxhZworIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdAorIyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4KKworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0lOREVYX0VOQ09ESU5HCisjIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUKKyMgY29udGVudC4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQklOQVJZX1RPQyBmbGFnCisjIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIGEKKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMKKyMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYQorIyBRdCBDb21wcmVzc2VkIEhlbHAgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLgorIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcKKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcKKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtZm9sZGVycworCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgUUhQX0NVU1RfRklMVEVSX05BTUUgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20gZmlsdGVyIHRvCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQorCisjIFRoZSBRSFBfQ1VTVF9GSUxUX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMiPgorIyBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20gRmlsdGVyczwvYT4uCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncworIyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLgorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4KKyMgUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXM8L2E+LgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLgorIyBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlIGdlbmVyYXRlZAorIyAucWhwIGZpbGUuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyAgd2lsbCBiZSBnZW5lcmF0ZWQsIHdoaWNoIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIGZvcm0gYW4gRWNsaXBzZSBoZWxwCisjIHBsdWdpbi4gVG8gaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMKKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwKKyMgZmlsZXMgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mCisjIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMKKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZQorIyB0aGUgaGVscCBhcHBlYXJzLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlCisjIHRoaXMgbmFtZS4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykKKyMgYXQgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQKKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4gU2luY2UgdGhlIHRhYnMgaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUKKyMgbmF2aWdhdGlvbiB0cmVlIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIE5PIGlmIHlvdSBhbHJlYWR5IHNldAorIyBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLgorIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZAorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdAorIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuCisjIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLgorIyBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXggeW91CisjIGNvdWxkIGNvbnNpZGVyIHRvIHNldCBESVNBQkxFX0lOREVYIHRvIE5PIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzCisjIChyYW5nZSBbMCwxLi4yMF0pIHRoYXQgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bQorIyB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSAxCisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUKKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlCisjIGlzIHNob3duLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3BlbgorIyBsaW5rcyB0byBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYXRleCBmb3JtdWxhcyBpbmNsdWRlZAorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdAorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQKKyMgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkKKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEyCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlCisjIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzCisjIGluIHRoZSBIVE1MIG91dHB1dCBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCisKK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKKworIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheAorIyAoc2VlIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlCisjIHJlbmRlcmluZyBpbnN0ZWFkIG9mIHVzaW5nIHByZXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QKKyMgaGF2ZSBMYVRlWCBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTAorIyBvdXRwdXQuIFdoZW4gZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQKKyMgY29uZmlndXJlIHRoZSBwYXRoIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUKKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24KKyMgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheAorIyBkaXJlY3RvcnkgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvCisjIHRoZSBNYXRoSmF4IENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dAorIyBpbnN0YWxsaW5nIE1hdGhKYXguCisjIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbAorIyBjb3B5IG9mIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIE1hdGhKYXggZXh0ZW5zaW9uCisjIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0KKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveAorIyBmb3IgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdAorIyBhbmQgREhUTUwgYW5kIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcKKyMgSFRNTCBoZWxwIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMKKyMgKEdFTkVSQVRFX0RPQ1NFVCkgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQKKyMgdHlwaWNhbGx5IGJlIGRpc2FibGVkLiBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZQorIyBjYW4gYmUgc2xvdywgdGhlbiBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlCisjIGltcGxlbWVudGVkIHVzaW5nIGEgUEhQIGVuYWJsZWQgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGF0IHRoZSB3ZWIgY2xpZW50CisjIHVzaW5nIEphdmFzY3JpcHQuIERveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgc2VhcmNoIFBIUCBzY3JpcHQgYW5kIGluZGV4CisjIGZpbGUgdG8gcHV0IG9uIHRoZSB3ZWIgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBzZXJ2ZXIKKyMgYmFzZWQgYXBwcm9hY2ggaXMgdGhhdCBpdCBzY2FsZXMgYmV0dGVyIHRvIGxhcmdlIHByb2plY3RzIGFuZCBhbGxvd3MKKyMgZnVsbCB0ZXh0IHNlYXJjaC4gVGhlIGRpc2FkdmFudGFnZXMgYXJlIHRoYXQgaXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gc2V0dXAKKyMgYW5kIGRvZXMgbm90IGhhdmUgbGl2ZSBzZWFyY2hpbmcgY2FwYWJpbGl0aWVzLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IKKyMgZ2VuZXJhdGluZyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvCisjIGdlbmVyYXRlIGluZGV4IGZvciBMYVRlWC4gSWYgbGVmdCBibGFuayBgbWFrZWluZGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIExhVGVYIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgbGV0dGVyLCBsZWdhbCBhbmQKKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSBhbXNzeW1iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbXNtYXRoCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcgorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90CisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQorIyBpbiB0aGUgb3V0cHV0LgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUKKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MKKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyMgWE1MX1NDSEVNQSAgICAgICAgICAgICA9CisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwKKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorCisjIFhNTF9EVEQgICAgICAgICAgICAgICAgPQorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGR1bXAgdGhlIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdAorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUKKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwKKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwKKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKworR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMKKyMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlCisjIG1vbWVudC4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisKK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUKKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLgorIyBUaGlzIGlzIHVzZWZ1bAorIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uCisjIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcgorIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLgorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUKKyMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUKKyMgZmlsZXMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZAorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUworIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcworIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5CisjIHRoZSBwcmVwcm9jZXNzb3IuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9FaWdlbi9zcmMvcGx1Z2lucyIKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwKKyMgYmUgdXNlZC4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YKKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IEVJR0VOX0VNUFRZX1NUUlVDVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX1ZFQ1RPUklaRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fUVRfU1VQUE9SVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fU1RST05HX0lOTElORT1pbmxpbmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0RFVklDRV9GVU5DPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKE1FVEhPRCxGVU5DVE9SKT10ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGNvbnN0IEN3aXNlQmluYXJ5T3A8RlVOQ1RPUjxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+IE1FVEhPRChjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVJR0VOX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUoTEhTLFJIUyk9Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8TEhTOjpTY2FsYXIsUkhTOjpTY2FsYXI+LCBjb25zdCBMSFMsIGNvbnN0IFJIUz4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICJFSUdFTl9DQVQyKGEsYik9IGEgIyMgYiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVJR0VOX0NBVChhLGIpPUVJR0VOX0NBVDIoYSxiKSJcCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVJR0VOX0NXSVNFX0JJTkFSWV9SRVRVUk5fVFlQRShMSFMsUkhTLE9QTkFNRSk9Q3dpc2VCaW5hcnlPcDxFSUdFTl9DQVQoRUlHRU5fQ0FUKGludGVybmFsOjpzY2FsYXJfLE9QTkFNRSksX29wKTxMSFM6OlNjYWxhciwgUkhTOjpTY2FsYXI+LCBjb25zdCBMSFMsIGNvbnN0IFJIUz4iXAorICAgICAgICAgICAgICAgICAgICAgICAgIERPWENPTU1BPSwKKworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLgorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQKKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IEVJR0VOX01BS0VfVFlQRURFRlMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BS0VfRklYRURfVFlQRURFRlMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BVEhGVU5DX0lNUEwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIF9FSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1VOQVJZIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9FTVBUWSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fRVVMRVJfQU5HTEVTX1RZUEVERUZTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9FVUxFUl9BTkdMRVNfU0lOR0xFX1RZUEVERUYgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0VVTEVSX1NZU1RFTV9UWVBFREVGIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9ET0NfVU5BUllfQURET05TIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9ET0NfQkxPQ0tfQURET05TX05PVF9JTk5FUl9QQU5FTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fRE9DX0JMT0NLX0FERE9OU19JTk5FUl9QQU5FTF9JRgorCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiBGb3IgZWFjaAorIyB0YWcgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUKKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzCisjIG9yIFVSTHMuIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzCisjIE5PVCBpbmNsdWRlIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9ICR7RUlHRU5fRE9YWV9UQUdGSUxFU30KKyMgIiR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2VpZ2VuLXVuc3VwcG9ydGVkLmRveHl0YWdzID11bnN1cHBvcnRlZCIKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvJHtFSUdFTl9ET1hZX1BST0pFQ1RfTkFNRX0uZG94eXRhZ3MiCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcworIyB3aWxsIGJlIGxpc3RlZC4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsCisjIGJlIGxpc3RlZC4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQKKyMgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyMgaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUgcG93ZXJmdWwgZ3JhcGhzLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0KKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gTk8KKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbgorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcworIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbAorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdAorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlCisjIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuCisKK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdXNlIHRoZSBIZWx2ZXRpY2EgZm9udCBmb3IgYWxsIGRvdCBmaWxlcyB0aGF0CisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQorIyB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQKKyMgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUKKyMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSAKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0LgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIEhlbHZldGljYSBmb250LgorIyBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHVzZSBET1RfRk9OVFBBVEggdG8KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUKKyMgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gTk8KKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQorIyB0aGUgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlCisjIGdyYXBoIG1heSBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUworIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUKKyMgbWFuYWdhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlCisjIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0IGlzIGVuZm9yY2VkLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQKKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgKKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQKKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoCisjIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocworIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBOTworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMKKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcworIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBzdmcsIHBuZywganBnLCBvciBnaWYuCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4gSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0CisjIEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzCisjIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMgcmVxdWlyZW1lbnQpLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuCisjIFRlc3RlZCBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4gRm9yIElFIDkrIHlvdQorIyBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcworIyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9CisKKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxkb3RmaWxlIGNvbW1hbmQpLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXG1zY2ZpbGUgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaAorIyBiZWNvbWVzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZQorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUKKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUKKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcworIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdAorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLAorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZgorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0CisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkKKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9kb2MvRWlnZW5fU2lsbHlfUHJvZmVzc29yXzY0eDY0LnBuZyBiL2RvYy9FaWdlbl9TaWxseV9Qcm9mZXNzb3JfNjR4NjQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRWlnZW5fU2lsbHlfUHJvZmVzc29yXzY0eDY0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvRml4ZWRTaXplVmVjdG9yaXphYmxlLmRveCBiL2RvYy9GaXhlZFNpemVWZWN0b3JpemFibGUuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTM4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRml4ZWRTaXplVmVjdG9yaXphYmxlLmRveApAQCAtMCwwICsxLDM4IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSBGaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiBvYmplY3RzCisKK1RoZSBnb2FsIG9mIHRoaXMgcGFnZSBpcyB0byBleHBsYWluIHdoYXQgd2UgbWVhbiBieSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUiLgorCitcc2VjdGlvbiBGaXhlZFNpemVWZWN0b3JpemFibGVfc3VtbWFyeSBFeGVjdXRpdmUgU3VtbWFyeQorCitBbiBFaWdlbiBvYmplY3QgaXMgY2FsbGVkICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSIgaWYgaXQgaGFzIGZpeGVkIHNpemUgYW5kIHRoYXQgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLgorCitFeGFtcGxlcyBpbmNsdWRlOgorXGxpIEVpZ2VuOjpWZWN0b3IyZAorXGxpIEVpZ2VuOjpWZWN0b3I0ZAorXGxpIEVpZ2VuOjpWZWN0b3I0ZgorXGxpIEVpZ2VuOjpNYXRyaXgyZAorXGxpIEVpZ2VuOjpNYXRyaXgyZgorXGxpIEVpZ2VuOjpNYXRyaXg0ZAorXGxpIEVpZ2VuOjpNYXRyaXg0ZgorXGxpIEVpZ2VuOjpBZmZpbmUzZAorXGxpIEVpZ2VuOjpBZmZpbmUzZgorXGxpIEVpZ2VuOjpRdWF0ZXJuaW9uZAorXGxpIEVpZ2VuOjpRdWF0ZXJuaW9uZgorCitcc2VjdGlvbiBGaXhlZFNpemVWZWN0b3JpemFibGVfZXhwbGFuYXRpb24gRXhwbGFuYXRpb24KKworRmlyc3QsICJmaXhlZC1zaXplIiBzaG91bGQgYmUgY2xlYXI6IGFuIEVpZ2VuIG9iamVjdCBoYXMgZml4ZWQgc2l6ZSBpZiBpdHMgbnVtYmVyIG9mIHJvd3MgYW5kIGl0cyBudW1iZXIgb2YgY29sdW1ucyBhcmUgZml4ZWQgYXQgY29tcGlsZS10aW1lLiBTbyBmb3IgZXhhbXBsZSBNYXRyaXgzZiBoYXMgZml4ZWQgc2l6ZSwgYnV0IE1hdHJpeFhmIGRvZXNuJ3QgKHRoZSBvcHBvc2l0ZSBvZiBmaXhlZC1zaXplIGlzIGR5bmFtaWMtc2l6ZSkuCisKK1RoZSBhcnJheSBvZiBjb2VmZmljaWVudHMgb2YgYSBmaXhlZC1zaXplIEVpZ2VuIG9iamVjdCBpcyBhIHBsYWluICJzdGF0aWMgYXJyYXkiLCBpdCBpcyBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiBGb3IgZXhhbXBsZSwgdGhlIGRhdGEgYmVoaW5kIGEgTWF0cml4NGYgaXMganVzdCBhICJmbG9hdCBhcnJheVsxNl0iLgorCitGaXhlZC1zaXplIG9iamVjdHMgYXJlIHR5cGljYWxseSB2ZXJ5IHNtYWxsLCB3aGljaCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gaGFuZGxlIHRoZW0gd2l0aCB6ZXJvIHJ1bnRpbWUgb3ZlcmhlYWQgLS0gYm90aCBpbiB0ZXJtcyBvZiBtZW1vcnkgdXNhZ2UgYW5kIG9mIHNwZWVkLgorCitOb3csIHZlY3Rvcml6YXRpb24gKGJvdGggU1NFIGFuZCBBbHRpVmVjKSB3b3JrcyB3aXRoIDEyOC1iaXQgcGFja2V0cy4gTW9yZW92ZXIsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGVzZSBwYWNrZXRzIG5lZWQgdG8gYmUgaGF2ZSAxMjgtYml0IGFsaWdubWVudC4KKworU28gaXQgdHVybnMgb3V0IHRoYXQgdGhlIG9ubHkgd2F5IHRoYXQgZml4ZWQtc2l6ZSBFaWdlbiBvYmplY3RzIGNhbiBiZSB2ZWN0b3JpemVkLCBpcyBpZiB0aGVpciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTI4IGJpdHMsIG9yIDE2IGJ5dGVzLiBFaWdlbiB3aWxsIHRoZW4gcmVxdWVzdCAxNi1ieXRlIGFsaWdubWVudCBmb3IgdGhlc2Ugb2JqZWN0cywgYW5kIGhlbmNlZm9ydGggcmVseSBvbiB0aGVzZSBvYmplY3RzIGJlaW5nIGFsaWduZWQgc28gbm8gcnVudGltZSBjaGVjayBmb3IgYWxpZ25tZW50IGlzIHBlcmZvcm1lZC4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0Z1bmN0aW9uc1Rha2luZ0VpZ2VuVHlwZXMuZG94IGIvZG9jL0Z1bmN0aW9uc1Rha2luZ0VpZ2VuVHlwZXMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmRkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRnVuY3Rpb25zVGFraW5nRWlnZW5UeXBlcy5kb3gKQEAgLTAsMCArMSwyMTcgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0Z1bmN0aW9uVGFraW5nRWlnZW5UeXBlcyBXcml0aW5nIEZ1bmN0aW9ucyBUYWtpbmcgJUVpZ2VuIFR5cGVzIGFzIFBhcmFtZXRlcnMKKworJUVpZ2VuJ3MgdXNlIG9mIGV4cHJlc3Npb24gdGVtcGxhdGVzIHJlc3VsdHMgaW4gcG90ZW50aWFsbHkgZXZlcnkgZXhwcmVzc2lvbiBiZWluZyBvZiBhIGRpZmZlcmVudCB0eXBlLiBJZiB5b3UgcGFzcyBzdWNoIGFuIGV4cHJlc3Npb24gdG8gYSBmdW5jdGlvbiB0YWtpbmcgYSBwYXJhbWV0ZXIgb2YgdHlwZSBNYXRyaXgsIHlvdXIgZXhwcmVzc2lvbiB3aWxsIGltcGxpY2l0bHkgYmUgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkgTWF0cml4LCB3aGljaCB3aWxsIHRoZW4gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gVGhpcyBtZWFucyB0aGF0IHlvdSBsb3NlIHRoZSBiZW5lZml0IG9mIGV4cHJlc3Npb24gdGVtcGxhdGVzLiBDb25jcmV0ZWx5LCB0aGlzIGhhcyB0d28gZHJhd2JhY2tzOgorIFxsaSBUaGUgZXZhbHVhdGlvbiBpbnRvIGEgdGVtcG9yYXJ5IG1heSBiZSB1c2VsZXNzIGFuZCBpbmVmZmljaWVudDsKKyBcbGkgVGhpcyBvbmx5IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIHRoZSBleHByZXNzaW9uLCBub3QgdG8gd3JpdGUgdG8gaXQuCisKK0ZvcnR1bmF0ZWx5LCBhbGwgdGhpcyBteXJpYWQgb2YgZXhwcmVzc2lvbiB0eXBlcyBoYXZlIGluIGNvbW1vbiB0aGF0IHRoZXkgYWxsIGluaGVyaXQgYSBmZXcgY29tbW9uLCB0ZW1wbGF0ZWQgYmFzZSBjbGFzc2VzLiBCeSBsZXR0aW5nIHlvdXIgZnVuY3Rpb24gdGFrZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBvZiB0aGVzZSBiYXNlIHR5cGVzLCB5b3UgY2FuIGxldCB0aGVtIHBsYXkgbmljZWx5IHdpdGggJUVpZ2VuJ3MgZXhwcmVzc2lvbiB0ZW1wbGF0ZXMuCisKK1xlaWdlbkF1dG9Ub2MKKworXHNlY3Rpb24gVG9waWNGaXJzdEV4YW1wbGVzIFNvbWUgRmlyc3QgRXhhbXBsZXMKKworVGhpcyBzZWN0aW9uIHdpbGwgcHJvdmlkZSBzaW1wbGUgZXhhbXBsZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3RzICVFaWdlbiBpcyBvZmZlcmluZy4gQmVmb3JlIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBleGFtcGxlcywgd2UgbmVlZCB0byByZWNhcGl0dWxhdGUgd2hpY2ggYmFzZSBvYmplY3RzIHdlIGNhbiB3b3JrIHdpdGggKHNlZSBhbHNvIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeSkuCisKKyBcbGkgTWF0cml4QmFzZTogVGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgbWF0cml4IGV4cHJlc3Npb25zIChhcyBvcHBvc2VkIHRvIGFycmF5IGV4cHJlc3Npb25zLCBhcyBvcHBvc2VkIHRvIHNwYXJzZSBhbmQgc3BlY2lhbCBtYXRyaXggY2xhc3NlcykuIFVzZSBpdCBpbiBmdW5jdGlvbnMgdGhhdCBhcmUgbWVhbnQgdG8gd29yayBvbmx5IG9uIGRlbnNlIG1hdHJpY2VzLgorIFxsaSBBcnJheUJhc2U6IFRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIGRlbnNlIGFycmF5IGV4cHJlc3Npb25zIChhcyBvcHBvc2VkIHRvIG1hdHJpeCBleHByZXNzaW9ucywgZXRjKS4gVXNlIGl0IGluIGZ1bmN0aW9ucyB0aGF0IGFyZSBtZWFudCB0byB3b3JrIG9ubHkgb24gYXJyYXlzLgorIFxsaSBEZW5zZUJhc2U6IFRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIGRlbnNlIG1hdHJpeCBleHByZXNzaW9uLCB0aGF0IGlzLCB0aGUgYmFzZSBjbGFzcyBmb3IgYm90aCBcYyBNYXRyaXhCYXNlIGFuZCBcYyBBcnJheUJhc2UuIEl0IGNhbiBiZSB1c2VkIGluIGZ1bmN0aW9ucyB0aGF0IGFyZSBtZWFudCB0byB3b3JrIG9uIGJvdGggbWF0cmljZXMgYW5kIGFycmF5cy4KKyBcbGkgRWlnZW5CYXNlOiBUaGUgYmFzZSBjbGFzcyB1bmlmeWluZyBhbGwgdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgaW50byBkZW5zZSBtYXRyaWNlcyBvciBhcnJheXMsIGZvciBleGFtcGxlIHNwZWNpYWwgbWF0cml4IGNsYXNzZXMgc3VjaCBhcyBkaWFnb25hbCBtYXRyaWNlcywgcGVybXV0YXRpb24gbWF0cmljZXMsIGV0Yy4gSXQgY2FuIGJlIHVzZWQgaW4gZnVuY3Rpb25zIHRoYXQgYXJlIG1lYW50IHRvIHdvcmsgb24gYW55IHN1Y2ggZ2VuZXJhbCB0eXBlLgorCis8Yj4gJUVpZ2VuQmFzZSBFeGFtcGxlIDwvYj48YnIvPjxici8+CitQcmludHMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG1vc3QgZ2VuZXJpYyBvYmplY3QgcHJlc2VudCBpbiAlRWlnZW4uIEl0IGNvdWxkIGJlIGFueSBtYXRyaXggZXhwcmVzc2lvbnMsIGFueSBkZW5zZSBvciBzcGFyc2UgbWF0cml4IGFuZCBhbnkgYXJyYXkuCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgZnVuY3Rpb25fdGFraW5nX2VpZ2VuYmFzZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgZnVuY3Rpb25fdGFraW5nX2VpZ2VuYmFzZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorPGI+ICVEZW5zZUJhc2UgRXhhbXBsZSA8L2I+PGJyLz48YnIvPgorUHJpbnRzIGEgc3ViLWJsb2NrIG9mIHRoZSBkZW5zZSBleHByZXNzaW9uLiBBY2NlcHRzIGFueSBkZW5zZSBtYXRyaXggb3IgYXJyYXkgZXhwcmVzc2lvbiwgYnV0IG5vIHNwYXJzZSBvYmplY3RzIGFuZCBubyBzcGVjaWFsIG1hdHJpeCBjbGFzc2VzIHN1Y2ggYXMgRGlhZ29uYWxNYXRyaXguCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIHByaW50X2Jsb2NrKGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkPiYgYiwgaW50IHgsIGludCB5LCBpbnQgciwgaW50IGMpCit7CisgIHN0ZDo6Y291dCA8PCAiYmxvY2s6ICIgPDwgYi5ibG9jayh4LHkscixjKSA8PCBzdGQ6OmVuZGw7Cit9CitcZW5kY29kZQorPGI+ICVBcnJheUJhc2UgRXhhbXBsZSA8L2I+PGJyLz48YnIvPgorUHJpbnRzIHRoZSBtYXhpbXVtIGNvZWZmaWNpZW50IG9mIHRoZSBhcnJheSBvciBhcnJheS1leHByZXNzaW9uLgorXGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBwcmludF9tYXhfY29lZmYoY29uc3QgQXJyYXlCYXNlPERlcml2ZWQ+ICZhKQoreworICBzdGQ6OmNvdXQgPDwgIm1heDogIiA8PCBhLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworfQorXGVuZGNvZGUKKzxiPiAlTWF0cml4QmFzZSBFeGFtcGxlIDwvYj48YnIvPjxici8+CitQcmludHMgdGhlIGludmVyc2UgY29uZGl0aW9uIG51bWJlciBvZiB0aGUgZ2l2ZW4gbWF0cml4IG9yIG1hdHJpeC1leHByZXNzaW9uLgorXGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBwcmludF9pbnZfY29uZChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBhKQoreworICBjb25zdCB0eXBlbmFtZSBKYWNvYmlTVkQ8dHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3Q+OjpTaW5ndWxhclZhbHVlc1R5cGUmCisgICAgc2luZ192YWxzID0gYS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpOworICBzdGQ6OmNvdXQgPDwgImludiBjb25kOiAiIDw8IHNpbmdfdmFscyhzaW5nX3ZhbHMuc2l6ZSgpLTEpIC8gc2luZ192YWxzKDApIDw8IHN0ZDo6ZW5kbDsKK30KK1xlbmRjb2RlCis8Yj4gTXVsdGlwbGUgdGVtcGxhdGVkIGFyZ3VtZW50cyBleGFtcGxlIDwvYj48YnIvPjxici8+CitDYWxjdWxhdGUgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRBLHR5cGVuYW1lIERlcml2ZWRCPgordHlwZW5hbWUgRGVyaXZlZEE6OlNjYWxhciBzcXVhcmVkaXN0KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZEE+JiBwMSxjb25zdCBNYXRyaXhCYXNlPERlcml2ZWRCPiYgcDIpCit7CisgIHJldHVybiAocDEtcDIpLnNxdWFyZWROb3JtKCk7Cit9CitcZW5kY29kZQorTm90aWNlIHRoYXQgd2UgdXNlZCB0d28gdGVtcGxhdGUgcGFyYW1ldGVycywgb25lIHBlciBhcmd1bWVudC4gVGhpcyBwZXJtaXRzIHRoZSBmdW5jdGlvbiB0byBoYW5kbGUgaW5wdXRzIG9mIGRpZmZlcmVudCB0eXBlcywgZS5nLiwKK1xjb2RlCitzcXVhcmVkaXN0KHYxLDIqdjIpCitcZW5kY29kZQord2hlcmUgdGhlIGZpcnN0IGFyZ3VtZW50IFxjIHYxIGlzIGEgdmVjdG9yIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IFxjIDIqdjIgaXMgYW4gZXhwcmVzc2lvbi4KKzxici8+PGJyLz4KKworVGhlc2UgZXhhbXBsZXMgYXJlIGp1c3QgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgcmVhZGVyIGEgZmlyc3QgaW1wcmVzc2lvbiBvZiBob3cgZnVuY3Rpb25zIGNhbiBiZSB3cml0dGVuIHdoaWNoIHRha2UgYSBwbGFpbiBhbmQgY29uc3RhbnQgTWF0cml4IG9yIEFycmF5IGFyZ3VtZW50LiBUaGV5IGFyZSBhbHNvIGludGVuZGVkIHRvIGdpdmUgdGhlIHJlYWRlciBhbiBpZGVhIGFib3V0IHRoZSBtb3N0IGNvbW1vbiBiYXNlIGNsYXNzZXMgYmVpbmcgdGhlIG9wdGltYWwgY2FuZGlkYXRlcyBmb3IgZnVuY3Rpb25zLiBJbiB0aGUgbmV4dCBzZWN0aW9uIHdlIHdpbGwgbG9vayBpbiBtb3JlIGRldGFpbCBhdCBhbiBleGFtcGxlIGFuZCB0aGUgZGlmZmVyZW50IHdheXMgaXQgY2FuIGJlIGltcGxlbWVudGVkLCB3aGlsZSBkaXNjdXNzaW5nIGVhY2ggaW1wbGVtZW50YXRpb24ncyBwcm9ibGVtcyBhbmQgYWR2YW50YWdlcy4gRm9yIHRoZSBkaXNjdXNzaW9uIGJlbG93LCBNYXRyaXggYW5kIEFycmF5IGFzIHdlbGwgYXMgTWF0cml4QmFzZSBhbmQgQXJyYXlCYXNlIGNhbiBiZSBleGNoYW5nZWQgYW5kIGFsbCBhcmd1bWVudHMgc3RpbGwgaG9sZC4KKworCitcc2VjdGlvbiBUb3BpY1VzaW5nUmVmQ2xhc3MgSG93IHRvIHdyaXRlIGdlbmVyaWMsIGJ1dCBub24tdGVtcGxhdGVkIGZ1bmN0aW9uPworCitJbiBhbGwgdGhlIHByZXZpb3VzIGV4YW1wbGVzLCB0aGUgZnVuY3Rpb25zIGhhZCB0byBiZSB0ZW1wbGF0ZSBmdW5jdGlvbnMuIFRoaXMgYXBwcm9hY2ggYWxsb3dzIHRvIHdyaXRlIHZlcnkgZ2VuZXJpYyBjb2RlLCBidXQgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIHdyaXRlIG5vbiB0ZW1wbGF0ZWQgZnVuY3Rpb24gYW5kIHN0aWxsIGtlZXAgc29tZSBsZXZlbCBvZiBnZW5lcmljaXR5IHRvIGF2b2lkIHN0dXBpZCBjb3BpZXMgb2YgdGhlIGFyZ3VtZW50cy4gVGhlIHR5cGljYWwgZXhhbXBsZSBpcyB0byB3cml0ZSBmdW5jdGlvbnMgYWNjZXB0aW5nIGJvdGggYSBNYXRyaXhYZiBvciBhIGJsb2NrIG9mIGEgTWF0cml4WGYuIFRoaXMgZXhhY3RseSB0aGUgcHVycG9zZSBvZiB0aGUgUmVmIGNsYXNzLiBIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBmdW5jdGlvbl90YWtpbmdfcmVmLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBmdW5jdGlvbl90YWtpbmdfcmVmLm91dAorPC90ZD48L3RyPjwvdGFibGU+CitJbiB0aGUgZmlyc3QgdHdvIGNhbGxzIHRvIGludl9jb25kLCBubyBjb3B5IG9jY3VyIGJlY2F1c2UgdGhlIG1lbW9yeSBsYXlvdXQgb2YgdGhlIGFyZ3VtZW50cyBtYXRjaGVzIHRoZSBtZW1vcnkgbGF5b3V0IGFjY2VwdGVkIGJ5IFJlZjxNYXRyaXhYZj4uIEhvd2V2ZXIsIGluIHRoZSBsYXN0IGNhbGwsIHdlIGhhdmUgYSBnZW5lcmljIGV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkgTWF0cml4WGYgYnkgdGhlIFJlZjw+IG9iamVjdC4KKworQSBSZWYgb2JqZWN0IGNhbiBhbHNvIGJlIHdyaXRhYmxlLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBmdW5jdGlvbiBjb21wdXRpbmcgdGhlIGNvdmFyaWFuY2UgbWF0cml4IG9mIHR3byBpbnB1dCBtYXRyaWNlcyB3aGVyZSBlYWNoIHJvdyBpcyBhbiBvYnNlcnZhdGlvbjoKK1xjb2RlCit2b2lkIGNvdihjb25zdCBSZWY8Y29uc3QgTWF0cml4WGY+IHgsIGNvbnN0IFJlZjxjb25zdCBNYXRyaXhYZj4geSwgUmVmPE1hdHJpeFhmPiBDKQoreworICBjb25zdCBmbG9hdCBudW1fb2JzZXJ2YXRpb25zID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgucm93cygpKTsKKyAgY29uc3QgUm93VmVjdG9yWGYgeF9tZWFuID0geC5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworICBjb25zdCBSb3dWZWN0b3JYZiB5X21lYW4gPSB5LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIEMgPSAoeC5yb3d3aXNlKCkgLSB4X21lYW4pLnRyYW5zcG9zZSgpICogKHkucm93d2lzZSgpIC0geV9tZWFuKSAvIG51bV9vYnNlcnZhdGlvbnM7Cit9CitcZW5kY29kZQorYW5kIGhlcmUgYXJlIHR3byBleGFtcGxlcyBjYWxsaW5nIGNvdiB3aXRob3V0IGFueSBjb3B5OgorXGNvZGUKK01hdHJpeFhmIG0xLCBtMiwgbTMKK2NvdihtMSwgbTIsIG0zKTsKK2NvdihtMS5sZWZ0Q29sczwzPigpLCBtMi5sZWZ0Q29sczwzPigpLCBtMy50b3BMZWZ0Q29ybmVyPDMsMz4oKSk7CitcZW5kY29kZQorVGhlIFJlZjw+IGNsYXNzIGhhcyB0d28gb3RoZXIgb3B0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIGtpbmQgb2YgbWVtb3J5IGxheW91dCB0aGF0IGNhbiBiZSBhY2NlcHRlZCB3aXRob3V0IGFueSBjb3B5LiBTZWUgdGhlIGNsYXNzIFJlZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGV0YWlscy4KKworXHNlY3Rpb24gVG9waWNQbGFpbkZ1bmN0aW9uc1dvcmtpbmcgSW4gd2hpY2ggY2FzZXMgZG8gZnVuY3Rpb25zIHRha2luZyBwbGFpbiBNYXRyaXggb3IgQXJyYXkgYXJndW1lbnRzIHdvcms/CisKK1dpdGhvdXQgdXNpbmcgdGVtcGxhdGUgZnVuY3Rpb25zLCBhbmQgd2l0aG91dCB0aGUgUmVmIGNsYXNzLCBhIG5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBjb3YgZnVuY3Rpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMKK1xjb2RlCitNYXRyaXhYZiBjb3YoY29uc3QgTWF0cml4WGYmIHgsIGNvbnN0IE1hdHJpeFhmJiB5KQoreworICBjb25zdCBmbG9hdCBudW1fb2JzZXJ2YXRpb25zID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgucm93cygpKTsKKyAgY29uc3QgUm93VmVjdG9yWGYgeF9tZWFuID0geC5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworICBjb25zdCBSb3dWZWN0b3JYZiB5X21lYW4gPSB5LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIHJldHVybiAoeC5yb3d3aXNlKCkgLSB4X21lYW4pLnRyYW5zcG9zZSgpICogKHkucm93d2lzZSgpIC0geV9tZWFuKSAvIG51bV9vYnNlcnZhdGlvbnM7Cit9CitcZW5kY29kZQorYW5kIGNvbnRyYXJ5IHRvIHdoYXQgb25lIG1pZ2h0IHRoaW5rIGF0IGZpcnN0LCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGZpbmUgdW5sZXNzIHlvdSByZXF1aXJlIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIHdpdGggZG91YmxlIG1hdHJpY2VzIHRvbyBhbmQgdW5sZXNzIHlvdSBkbyBub3QgY2FyZSBhYm91dCB0ZW1wb3Jhcnkgb2JqZWN0cy4gV2h5IGlzIHRoYXQgdGhlIGNhc2U/IFdoZXJlIGFyZSB0ZW1wb3JhcmllcyBpbnZvbHZlZD8gSG93IGNhbiBjb2RlIGFzIGdpdmVuIGJlbG93IGNvbXBpbGU/CitcY29kZQorTWF0cml4WGYgeCx5LHo7CitNYXRyaXhYZiBDID0gY292KHgseSt6KTsKK1xlbmRjb2RlCitJbiB0aGlzIHNwZWNpYWwgY2FzZSwgdGhlIGV4YW1wbGUgaXMgZmluZSBhbmQgd2lsbCBiZSB3b3JraW5nIGJlY2F1c2UgYm90aCBwYXJhbWV0ZXJzIGFyZSBkZWNsYXJlZCBhcyBcZSBjb25zdCByZWZlcmVuY2VzLiBUaGUgY29tcGlsZXIgY3JlYXRlcyBhIHRlbXBvcmFyeSBhbmQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIHgreiBpbnRvIHRoaXMgdGVtcG9yYXJ5LiBPbmNlIHRoZSBmdW5jdGlvbiBpcyBwcm9jZXNzZWQsIHRoZSB0ZW1wb3JhcnkgaXMgcmVsZWFzZWQgYW5kIHRoZSByZXN1bHQgaXMgYXNzaWduZWQgdG8gQy4KKworXGIgTm90ZTogRnVuY3Rpb25zIHRha2luZyBcZSBjb25zdCByZWZlcmVuY2VzIHRvIE1hdHJpeCAob3IgQXJyYXkpIGNhbiBwcm9jZXNzIGV4cHJlc3Npb25zIGF0IHRoZSBjb3N0IG9mIHRlbXBvcmFyaWVzLgorCisKK1xzZWN0aW9uIFRvcGljUGxhaW5GdW5jdGlvbnNGYWlsaW5nIEluIHdoaWNoIGNhc2VzIGRvIGZ1bmN0aW9ucyB0YWtpbmcgYSBwbGFpbiBNYXRyaXggb3IgQXJyYXkgYXJndW1lbnQgZmFpbD8KKworSGVyZSwgd2UgY29uc2lkZXIgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBnaXZlbiBhYm92ZS4gVGhpcyB0aW1lLCB3ZSBkbyBub3Qgd2FudCB0byByZXR1cm4gdGhlIHJlc3VsdCBidXQgcGFzcyBhbiBhZGRpdGlvbmFsIG5vbi1jb25zdCBwYXJhbXRlciB3aGljaCBhbGxvd3MgdXMgdG8gc3RvcmUgdGhlIHJlc3VsdC4gQSBmaXJzdCBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBtaWdodCBsb29rIGFzIGZvbGxvd3MuCitcY29kZQorLy8gTm90ZTogVGhpcyBjb2RlIGlzIGZsYXdlZCEKK3ZvaWQgY292KGNvbnN0IE1hdHJpeFhmJiB4LCBjb25zdCBNYXRyaXhYZiYgeSwgTWF0cml4WGYmIEMpCit7CisgIGNvbnN0IGZsb2F0IG51bV9vYnNlcnZhdGlvbnMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oeC5yb3dzKCkpOworICBjb25zdCBSb3dWZWN0b3JYZiB4X21lYW4gPSB4LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIGNvbnN0IFJvd1ZlY3RvclhmIHlfbWVhbiA9IHkuY29sd2lzZSgpLnN1bSgpIC8gbnVtX29ic2VydmF0aW9uczsKKyAgQyA9ICh4LnJvd3dpc2UoKSAtIHhfbWVhbikudHJhbnNwb3NlKCkgKiAoeS5yb3d3aXNlKCkgLSB5X21lYW4pIC8gbnVtX29ic2VydmF0aW9uczsKK30KK1xlbmRjb2RlCitXaGVuIHRyeWluZyB0byBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29kZQorXGNvZGUKK01hdHJpeFhmIEMgPSBNYXRyaXhYZjo6WmVybygzLDYpOworY292KHgseSwgQy5ibG9jaygwLDAsMywzKSk7CitcZW5kY29kZQordGhlIGNvbXBpbGVyIHdpbGwgZmFpbCwgYmVjYXVzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gY29udmVydCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBieSBcYyBNYXRyaXhYZjo6YmxvY2soKSBpbnRvIGEgbm9uLWNvbnN0IFxjIE1hdHJpeFhmJi4gVGhpcyBpcyB0aGUgY2FzZSBiZWNhdXNlIHRoZSBjb21waWxlciB3YW50cyB0byBwcm90ZWN0IHlvdSBmcm9tIHdyaXRpbmcgeW91ciByZXN1bHQgdG8gYSB0ZW1wb3Jhcnkgb2JqZWN0LiBJbiB0aGlzIHNwZWNpYWwgY2FzZSB0aGlzIHByb3RlY3Rpb24gaXMgbm90IGludGVuZGVkIC0tIHdlIHdhbnQgdG8gd3JpdGUgdG8gYSB0ZW1wb3Jhcnkgb2JqZWN0LiBTbyBob3cgY2FuIHdlIG92ZXJjb21lIHRoaXMgcHJvYmxlbT8gCisKK1RoZSBzb2x1dGlvbiB3aGljaCBpcyBwcmVmZXJyZWQgYXQgdGhlIG1vbWVudCBpcyBiYXNlZCBvbiBhIGxpdHRsZSBcZW0gaGFjay4gT25lIG5lZWRzIHRvIHBhc3MgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBhbmQgaW50ZXJuYWxseSB0aGUgY29uc3RuZXNzIG5lZWRzIHRvIGJlIGNhc3QgYXdheS4gVGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gZm9yIEM5OCBjb21wbGlhbnQgY29tcGlsZXJzIHdvdWxkIGJlCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3ZvaWQgY292KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHgsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHksIE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiBjb25zdCAmIEMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8RGVyaXZlZD46OnR5cGUgUm93VmVjdG9yVHlwZTsKKworICBjb25zdCBTY2FsYXIgbnVtX29ic2VydmF0aW9ucyA9IHN0YXRpY19jYXN0PFNjYWxhcj4oeC5yb3dzKCkpOworCisgIGNvbnN0IFJvd1ZlY3RvclR5cGUgeF9tZWFuID0geC5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworICBjb25zdCBSb3dWZWN0b3JUeXBlIHlfbWVhbiA9IHkuY29sd2lzZSgpLnN1bSgpIC8gbnVtX29ic2VydmF0aW9uczsKKworICBjb25zdF9jYXN0PCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mID4oQykgPQorICAgICh4LnJvd3dpc2UoKSAtIHhfbWVhbikudHJhbnNwb3NlKCkgKiAoeS5yb3d3aXNlKCkgLSB5X21lYW4pIC8gbnVtX29ic2VydmF0aW9uczsKK30KK1xlbmRjb2RlCitUaGUgaW1wbGVtZW50YXRpb24gYWJvdmUgZG9lcyBub3cgbm90IG9ubHkgd29yayB3aXRoIHRlbXBvcmFyeSBleHByZXNzaW9ucyBidXQgaXQgYWxzbyBhbGxvd3MgdG8gdXNlIHRoZSBmdW5jdGlvbiB3aXRoIG1hdHJpY2VzIG9mIGFyYml0cmFyeSBmbG9hdGluZyBwb2ludCBzY2FsYXIgdHlwZXMuCisKK1xiIE5vdGU6IFRoZSBjb25zdCBjYXN0IGhhY2sgd2lsbCBvbmx5IHdvcmsgd2l0aCB0ZW1wbGF0ZWQgZnVuY3Rpb25zLiBJdCB3aWxsIG5vdCB3b3JrIHdpdGggdGhlIE1hdHJpeFhmIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhc3QgYSBCbG9jayBleHByZXNzaW9uIHRvIGEgTWF0cml4IHJlZmVyZW5jZSEKKworCisKK1xzZWN0aW9uIFRvcGljUmVzaXppbmdJbkdlbmVyaWNJbXBsZW1lbnRhdGlvbnMgSG93IHRvIHJlc2l6ZSBtYXRyaWNlcyBpbiBnZW5lcmljIGltcGxlbWVudGF0aW9ucz8KKworT25lIG1pZ2h0IHRoaW5rIHdlIGFyZSBkb25lIG5vdywgcmlnaHQ/IFRoaXMgaXMgbm90IGNvbXBsZXRlbHkgdHJ1ZSBiZWNhdXNlIGluIG9yZGVyIGZvciBvdXIgY292YXJpYW5jZSBmdW5jdGlvbiB0byBiZSBnZW5lcmljYWxseSBhcHBsaWNhYmxlLCB3ZSB3YW50IHRoZSBmb2xsd2luZyBjb2RlIHRvIHdvcmsKK1xjb2RlCitNYXRyaXhYZiB4ID0gTWF0cml4WGY6OlJhbmRvbSgxMDAsMyk7CitNYXRyaXhYZiB5ID0gTWF0cml4WGY6OlJhbmRvbSgxMDAsMyk7CitNYXRyaXhYZiBDOworY292KHgsIHksIEMpOworXGVuZGNvZGUKK1RoaXMgaXMgbm90IHRoZSBjYXNlIGFueW1vcmUsIHdoZW4gd2UgYXJlIHVzaW5nIGFuIGltcGxlbWVudGF0aW9uIHRha2luZyBNYXRyaXhCYXNlIGFzIGEgcGFyYW1ldGVyLiBJbiBnZW5lcmFsLCAlRWlnZW4gc3VwcG9ydHMgYXV0b21hdGljIHJlc2l6aW5nIGJ1dCBpdCBpcyBub3QgcG9zc2libGUgdG8gZG8gc28gb24gZXhwcmVzc2lvbnMuIFdoeSBzaG91bGQgcmVzaXppbmcgb2YgYSBtYXRyaXggQmxvY2sgYmUgYWxsb3dlZD8gSXQgaXMgYSByZWZlcmVuY2UgdG8gYSBzdWItbWF0cml4IGFuZCB3ZSBkZWZpbml0ZWx5IGRvbid0IHdhbnQgdG8gcmVzaXplIHRoYXQuIFNvIGhvdyBjYW4gd2UgaW5jb3Jwb3JhdGUgcmVzaXppbmcgaWYgd2UgY2Fubm90IHJlc2l6ZSBvbiBNYXRyaXhCYXNlPyBUaGUgc29sdXRpb24gaXMgdG8gcmVzaXplIHRoZSBkZXJpdmVkIG9iamVjdCBhcyBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorXGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIGNvdihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiB4LCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiB5LCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gY29uc3QgJiBDXykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxEZXJpdmVkPjo6dHlwZSBSb3dWZWN0b3JUeXBlOworCisgIGNvbnN0IFNjYWxhciBudW1fb2JzZXJ2YXRpb25zID0gc3RhdGljX2Nhc3Q8U2NhbGFyPih4LnJvd3MoKSk7CisKKyAgY29uc3QgUm93VmVjdG9yVHlwZSB4X21lYW4gPSB4LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIGNvbnN0IFJvd1ZlY3RvclR5cGUgeV9tZWFuID0geS5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworCisgIE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgQyA9IGNvbnN0X2Nhc3Q8IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgPihDXyk7CisgIAorICBDLmRlcml2ZWQoKS5yZXNpemUoeC5jb2xzKCkseC5jb2xzKCkpOyAvLyByZXNpemUgdGhlIGRlcml2ZWQgb2JqZWN0CisgIEMgPSAoeC5yb3d3aXNlKCkgLSB4X21lYW4pLnRyYW5zcG9zZSgpICogKHkucm93d2lzZSgpIC0geV9tZWFuKSAvIG51bV9vYnNlcnZhdGlvbnM7Cit9CitcZW5kY29kZQorVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3cgd29ya2luZyBmb3IgcGFyYW1ldGVycyBiZWluZyBleHByZXNzaW9ucyBhbmQgZm9yIHBhcmFtZXRlcnMgYmVpbmcgbWF0cmljZXMgYW5kIGhhdmluZyB0aGUgd3Jvbmcgc2l6ZS4gUmVzaXppbmcgdGhlIGV4cHJlc3Npb25zIGRvZXMgbm90IGRvIGFueSBoYXJtIGluIHRoaXMgY2FzZSB1bmxlc3MgdGhleSBhY3R1YWxseSByZXF1aXJlIHJlc2l6aW5nLiBUaGF0IG1lYW5zLCBwYXNzaW5nIGFuIGV4cHJlc3Npb24gd2l0aCB0aGUgd3JvbmcgZGltZW5zaW9ucyB3aWxsIHJlc3VsdCBpbiBhIHJ1bi10aW1lIGVycm9yIChpbiBkZWJ1ZyBtb2RlIG9ubHkpIHdoaWxlIHBhc3NpbmcgZXhwcmVzc2lvbnMgb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3aWxsIGp1c3Qgd29yayBmaW5lLgorCitcYiBOb3RlOiBJbiB0aGUgYWJvdmUgZGlzY3Vzc2lvbiB0aGUgdGVybXMgTWF0cml4IGFuZCBBcnJheSBhbmQgTWF0cml4QmFzZSBhbmQgQXJyYXlCYXNlIGNhbiBiZSBleGNoYW5nZWQgYW5kIGFsbCBhcmd1bWVudHMgc3RpbGwgaG9sZC4KKworXHNlY3Rpb24gVG9waWNTdW1tYXJ5IFN1bW1hcnkKKworICAtIFRvIHN1bW1hcml6ZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyB0YWtpbmcgbm9uLXdyaXRhYmxlIChjb25zdCByZWZlcmVuY2VkKSBvYmplY3RzIGlzIG5vdCBhIGJpZyBpc3N1ZSBhbmQgZG9lcyBub3QgbGVhZCB0byBwcm9ibGVtYXRpYyBzaXR1YXRpb25zIGluIHRlcm1zIG9mIGNvbXBpbGluZyBhbmQgcnVubmluZyB5b3VyIHByb2dyYW0uIEhvd2V2ZXIsIGEgbmFpdmUgaW1wbGVtZW50YXRpb24gaXMgbGlrZWx5IHRvIGludHJvZHVjZSB1bm5lY2Vzc2FyeSB0ZW1wb3Jhcnkgb2JqZWN0cyBpbiB5b3VyIGNvZGUuIEluIG9yZGVyIHRvIGF2b2lkIGV2YWx1YXRpbmcgcGFyYW1ldGVycyBpbnRvIHRlbXBvcmFyaWVzLCBwYXNzIHRoZW0gYXMgKGNvbnN0KSByZWZlcmVuY2VzIHRvIE1hdHJpeEJhc2Ugb3IgQXJyYXlCYXNlIChzbyB0ZW1wbGF0aXplIHlvdXIgZnVuY3Rpb24pLgorCisgIC0gRnVuY3Rpb25zIHRha2luZyB3cml0YWJsZSAobm9uLWNvbnN0KSBwYXJhbWV0ZXJzIG11c3QgdGFrZSBjb25zdCByZWZlcmVuY2VzIGFuZCBjYXN0IGF3YXkgY29uc3RuZXNzIHdpdGhpbiB0aGUgZnVuY3Rpb24gYm9keS4KKworICAtIEZ1bmN0aW9ucyB0aGF0IHRha2UgYXMgcGFyYW1ldGVycyBNYXRyaXhCYXNlIChvciBBcnJheUJhc2UpIG9iamVjdHMsIGFuZCBwb3RlbnRpYWxseSBuZWVkIHRvIHJlc2l6ZSB0aGVtIChpbiB0aGUgY2FzZSB3aGVyZSB0aGV5IGFyZSByZXNpemFibGUpLCBtdXN0IGNhbGwgcmVzaXplKCkgb24gdGhlIGRlcml2ZWQgY2xhc3MsIGFzIHJldHVybmVkIGJ5IGRlcml2ZWQoKS4KKyovCit9CmRpZmYgLS1naXQgYS9kb2MvSGlQZXJmb3JtYW5jZS5kb3ggYi9kb2MvSGlQZXJmb3JtYW5jZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2Y2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9IaVBlcmZvcm1hbmNlLmRveApAQCAtMCwwICsxLDEyOCBAQAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNXcml0aW5nRWZmaWNpZW50UHJvZHVjdEV4cHJlc3Npb24gV3JpdGluZyBlZmZpY2llbnQgbWF0cml4IHByb2R1Y3QgZXhwcmVzc2lvbnMKKworSW4gZ2VuZXJhbCBhY2hpZXZpbmcgZ29vZCBwZXJmb3JtYW5jZSB3aXRoIEVpZ2VuIGRvZXMgbm8gcmVxdWlyZSBhbnkgc3BlY2lhbCBlZmZvcnQ6CitzaW1wbHkgd3JpdGUgeW91ciBleHByZXNzaW9ucyBpbiB0aGUgbW9zdCBoaWdoIGxldmVsIHdheS4gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUKK2ZvciBzbWFsbCBmaXhlZCBzaXplIG1hdHJpY2VzLiBGb3IgbGFyZ2UgbWF0cmljZXMsIGhvd2V2ZXIsIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0bwordGFrZSBzb21lIGNhcmUgd2hlbiB3cml0aW5nIHlvdXIgZXhwcmVzc2lvbnMgaW4gb3JkZXIgdG8gbWluaW1pemUgdXNlbGVzcyBldmFsdWF0aW9ucworYW5kIG9wdGltaXplIHRoZSBwZXJmb3JtYW5jZS4KK0luIHRoaXMgcGFnZSB3ZSB3aWxsIGdpdmUgYSBicmllZiBvdmVydmlldyBvZiB0aGUgRWlnZW4ncyBpbnRlcm5hbCBtZWNoYW5pc20gdG8gc2ltcGxpZnkKK2FuZCBldmFsdWF0ZSBjb21wbGV4IHByb2R1Y3QgZXhwcmVzc2lvbnMsIGFuZCBkaXNjdXNzIHRoZSBjdXJyZW50IGxpbWl0YXRpb25zLgorSW4gcGFydGljdWxhciB3ZSB3aWxsIGZvY3VzIG9uIGV4cHJlc3Npb25zIG1hdGNoaW5nIGxldmVsIDIgYW5kIDMgQkxBUyByb3V0aW5lcywgaS5lLAorYWxsIGtpbmQgb2YgbWF0cml4IHByb2R1Y3RzIGFuZCB0cmlhbmd1bGFyIHNvbHZlcnMuCisKK0luZGVlZCwgaW4gRWlnZW4gd2UgaGF2ZSBpbXBsZW1lbnRlZCBhIHNldCBvZiBoaWdobHkgb3B0aW1pemVkIHJvdXRpbmVzIHdoaWNoIGFyZSB2ZXJ5IHNpbWlsYXIKK3RvIEJMQVMncyBvbmVzLiBVbmxpa2UgQkxBUywgdGhvc2Ugcm91dGluZXMgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHVzZXIgdmlhIGEgaGlnaCBsZXZlbCBhbmQKK25hdHVyYWwgQVBJLiBFYWNoIG9mIHRoZXNlIHJvdXRpbmVzIGNhbiBjb21wdXRlIGluIGEgc2luZ2xlIGV2YWx1YXRpb24gYSB3aWRlIHZhcmlldHkgb2YgZXhwcmVzc2lvbnMuCitHaXZlbiBhbiBleHByZXNzaW9uLCB0aGUgY2hhbGxlbmdlIGlzIHRoZW4gdG8gbWFwIGl0IHRvIGEgbWluaW1hbCBzZXQgb2Ygcm91dGluZXMuCitBcyBleHBsYWluZWQgbGF0dGVyLCB0aGlzIG1lY2hhbmlzbSBoYXMgc29tZSBsaW1pdGF0aW9ucywgYW5kIGtub3dpbmcgdGhlbSB3aWxsIGFsbG93Cit5b3UgdG8gd3JpdGUgZmFzdGVyIGNvZGUgYnkgbWFraW5nIHlvdXIgZXhwcmVzc2lvbnMgbW9yZSBFaWdlbiBmcmllbmRseS4KKworXHNlY3Rpb24gR0VNTSBHZW5lcmFsIE1hdHJpeC1NYXRyaXggcHJvZHVjdCAoR0VNTSkKKworTGV0J3Mgc3RhcnQgd2l0aCB0aGUgbW9zdCBjb21tb24gcHJpbWl0aXZlOiB0aGUgbWF0cml4IHByb2R1Y3Qgb2YgZ2VuZXJhbCBkZW5zZSBtYXRyaWNlcy4KK0luIHRoZSBCTEFTIHdvcmxkIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEdFTU0gcm91dGluZS4gT3VyIGVxdWl2YWxlbnQgcHJpbWl0aXZlIGNhbgorcGVyZm9ybSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbjoKK1xmJCBDLm5vYWxpYXMoKSArPSBcYWxwaGEgb3AxKEEpIG9wMihCKSBcZiQKK3doZXJlIEEsIEIsIGFuZCBDIGFyZSBjb2x1bW4gYW5kL29yIHJvdyBtYWpvciBtYXRyaWNlcyAob3Igc3ViLW1hdHJpY2VzKSwKK2FscGhhIGlzIGEgc2NhbGFyIHZhbHVlLCBhbmQgb3AxLCBvcDIgY2FuIGJlIHRyYW5zcG9zZSwgYWRqb2ludCwgY29uanVnYXRlLCBvciB0aGUgaWRlbnRpdHkuCitXaGVuIEVpZ2VuIGRldGVjdHMgYSBtYXRyaXggcHJvZHVjdCwgaXQgYW5hbHl6ZXMgYm90aCBzaWRlcyBvZiB0aGUgcHJvZHVjdCB0byBleHRyYWN0IGEKK3VuaXF1ZSBzY2FsYXIgZmFjdG9yIGFscGhhLCBhbmQgZm9yIGVhY2ggc2lkZSwgaXRzIGVmZmVjdGl2ZSBzdG9yYWdlIG9yZGVyLCBzaGFwZSwgYW5kIGNvbmp1Z2F0aW9uIHN0YXRlcy4KK01vcmUgcHJlY2lzZWx5IGVhY2ggc2lkZSBpcyBzaW1wbGlmaWVkIGJ5IGl0ZXJhdGl2ZWx5IHJlbW92aW5nIHRyaXZpYWwgZXhwcmVzc2lvbnMgc3VjaCBhcyBzY2FsYXIgbXVsdGlwbGUsCituZWdhdGlvbiBhbmQgY29uanVnYXRpb24uIFRyYW5zcG9zZSBhbmQgQmxvY2sgZXhwcmVzc2lvbnMgYXJlIG5vdCBldmFsdWF0ZWQgYW5kIHRoZXkgb25seSBtb2RpZnkgdGhlIHN0b3JhZ2Ugb3JkZXIKK2FuZCBzaGFwZS4gQWxsIG90aGVyIGV4cHJlc3Npb25zIGFyZSBpbW1lZGlhdGVseSBldmFsdWF0ZWQuCitGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbjoKK1xjb2RlIG0xLm5vYWxpYXMoKSAtPSBzNCAqIChzMSAqIG0yLmFkam9pbnQoKSAqICgtKHMzKm0zKS5jb25qdWdhdGUoKSpzMikpICBcZW5kY29kZQoraXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVkIHRvOgorXGNvZGUgbTEubm9hbGlhcygpICs9IChzMSpzMipjb25qKHMzKSpzNCkgKiBtMi5hZGpvaW50KCkgKiBtMy5jb25qdWdhdGUoKSBcZW5kY29kZQord2hpY2ggZXhhY3RseSBtYXRjaGVzIG91ciBHRU1NIHJvdXRpbmUuCisKK1xzdWJzZWN0aW9uIEdFTU1fTGltaXRhdGlvbnMgTGltaXRhdGlvbnMKK1VuZm9ydHVuYXRlbHksIHRoaXMgc2ltcGxpZmljYXRpb24gbWVjaGFuaXNtIGlzIG5vdCBwZXJmZWN0IHlldCBhbmQgbm90IGFsbCBleHByZXNzaW9ucyB3aGljaCBjb3VsZCBiZQoraGFuZGxlZCBieSBhIHNpbmdsZSBHRU1NLWxpa2UgY2FsbCBhcmUgY29ycmVjdGx5IGRldGVjdGVkLgorPHRhYmxlIGNsYXNzPSJtYW51YWwiIHN0eWxlPSJ3aWR0aDoxMDAlIj4KKzx0cj4KKzx0aD5Ob3Qgb3B0aW1hbCBleHByZXNzaW9uPC90aD4KKzx0aD5FdmFsdWF0ZWQgYXM8L3RoPgorPHRoPk9wdGltYWwgdmVyc2lvbiAoc2luZ2xlIGV2YWx1YXRpb24pPC90aD4KKzx0aD5Db21tZW50czwvdGg+Cis8L3RyPgorPHRyPgorPHRkPlxjb2RlCittMSArPSBtMiAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK3RlbXAgPSBtMiAqIG0zOworbTEgKz0gdGVtcDsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCittMS5ub2FsaWFzKCkgKz0gbTIgKiBtMzsgXGVuZGNvZGU8L3RkPgorPHRkPlVzZSAubm9hbGlhcygpIHRvIHRlbGwgRWlnZW4gdGhlIHJlc3VsdCBhbmQgcmlnaHQtaGFuZC1zaWRlcyBkbyBub3QgYWxpYXMuIAorICAgIE90aGVyd2lzZSB0aGUgcHJvZHVjdCBtMiAqIG0zIGlzIGV2YWx1YXRlZCBpbnRvIGEgdGVtcG9yYXJ5LjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJhbHQiPgorPHRkPjwvdGQ+Cis8dGQ+PC90ZD4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpICs9IHMxICogKG0yICogbTMpOyBcZW5kY29kZTwvdGQ+Cis8dGQ+VGhpcyBpcyBhIHNwZWNpYWwgZmVhdHVyZSBvZiBFaWdlbi4gSGVyZSB0aGUgcHJvZHVjdCBiZXR3ZWVuIGEgc2NhbGFyCisgICAgYW5kIGEgbWF0cml4IHByb2R1Y3QgZG9lcyBub3QgZXZhbHVhdGUgdGhlIG1hdHJpeCBwcm9kdWN0IGJ1dCBpbnN0ZWFkIGl0CisgICAgcmV0dXJucyBhIG1hdHJpeCBwcm9kdWN0IGV4cHJlc3Npb24gdHJhY2tpbmcgdGhlIHNjYWxhciBzY2FsaW5nIGZhY3Rvci4gPGJyPgorICAgIFdpdGhvdXQgdGhpcyBvcHRpbWl6YXRpb24sIHRoZSBtYXRyaXggcHJvZHVjdCB3b3VsZCBiZSBldmFsdWF0ZWQgaW50byBhCisgICAgdGVtcG9yYXJ5IGFzIGluIHRoZSBuZXh0IGV4YW1wbGUuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+XGNvZGUKK20xLm5vYWxpYXMoKSArPSAobTIgKiBtMykuYWRqb2ludCgpOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK3RlbXAgPSBtMiAqIG0zOworbTEgKz0gdGVtcC5hZGpvaW50KCk7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpICs9IG0zLmFkam9pbnQoKQorKiAgICAgICAgICAgICAgKiBtMi5hZGpvaW50KCk7IFxlbmRjb2RlPC90ZD4KKzx0ZD5UaGlzIGlzIGJlY2F1c2UgdGhlIHByb2R1Y3QgZXhwcmVzc2lvbiBoYXMgdGhlIEV2YWxCZWZvcmVOZXN0aW5nIGJpdCB3aGljaAorICAgIGVuZm9yY2VzIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBwcm9kdWN0IGJ5IHRoZSBUcmFucG9zZSBleHByZXNzaW9uLjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJhbHQiPgorPHRkPlxjb2RlCittMSA9IG0xICsgbTIgKiBtMzsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCit0ZW1wID0gbTIgKiBtMzsKK20xID0gbTEgKyB0ZW1wOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUgbTEubm9hbGlhcygpICs9IG0yICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5IZXJlIHRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgYXQgY29tcGlsZSB0aW1lIHRoYXQgdGhlIHR3byBtMSBhcmUgdGhlIHNhbWUsCisgICAgYW5kIHNvIHRoZSBtYXRyaXggcHJvZHVjdCB3aWxsIGJlIGltbWVkaWF0ZWx5IGV2YWx1YXRlZC48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpID0gbTQgKyBtMiAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK3RlbXAgPSBtMiAqIG0zOworbTEgPSBtNCArIHRlbXA7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQorbTEgPSBtNDsKK20xLm5vYWxpYXMoKSArPSBtMiAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+Rmlyc3Qgb2YgYWxsLCBoZXJlIHRoZSAubm9hbGlhcygpIGluIHRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHVzZWxlc3MgYmVjYXVzZQorICAgIG0yKm0zIHdpbGwgYmUgZXZhbHVhdGVkIGFueXdheS4gSG93ZXZlciwgbm90ZSBob3cgdGhpcyBleHByZXNzaW9uIGNhbiBiZSByZXdyaXR0ZW4KKyAgICBzbyB0aGF0IG5vIHRlbXBvcmFyeSBpcyByZXF1aXJlZC4gKHRpcDogZm9yIHZlcnkgc21hbGwgZml4ZWQgc2l6ZSBtYXRyaXgKKyAgICBpdCBpcyBzbGlnaGx0eSBiZXR0ZXIgdG8gcmV3cml0ZSBpdCBsaWtlIHRoaXM6IG0xLm5vYWxpYXMoKSA9IG0yICogbTM7IG0xICs9IG00OzwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJhbHQiPgorPHRkPlxjb2RlCittMS5ub2FsaWFzKCkgKz0gKHMxKm0yKS5ibG9jayguLikgKiBtMzsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCit0ZW1wID0gKHMxKm0yKS5ibG9jayguLik7CittMSArPSB0ZW1wICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpICs9IHMxICogbTIuYmxvY2soLi4pICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5UaGlzIGlzIGJlY2F1c2Ugb3VyIGV4cHJlc3Npb24gYW5hbHl6ZXIgaXMgY3VycmVudGx5IG5vdCBhYmxlIHRvIGV4dHJhY3QgdHJpdmlhbAorICAgIGV4cHJlc3Npb25zIG5lc3RlZCBpbiBhIEJsb2NrIGV4cHJlc3Npb24uIFRoZXJlZm9yZSB0aGUgbmVzdGVkIHNjYWxhcgorICAgIG11bHRpcGxlIGNhbm5vdCBiZSBwcm9wZXJseSBleHRyYWN0ZWQuPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitPZiBjb3Vyc2UgYWxsIHRoZXNlIHJlbWFya3MgaG9sZCBmb3IgYWxsIG90aGVyIGtpbmQgb2YgcHJvZHVjdHMgaW52b2x2aW5nIHRyaWFuZ3VsYXIgb3Igc2VsZmFkam9pbnQgbWF0cmljZXMuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9JbnBsYWNlRGVjb21wb3NpdGlvbi5kb3ggYi9kb2MvSW5wbGFjZURlY29tcG9zaXRpb24uZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWM2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSW5wbGFjZURlY29tcG9zaXRpb24uZG94CkBAIC0wLDAgKzEsMTE1IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBJbnBsYWNlRGVjb21wb3NpdGlvbiBJbnBsYWNlIG1hdHJpeCBkZWNvbXBvc2l0aW9ucworCitTdGFydGluZyBmcm9tICVFaWdlbiAzLjMsIHRoZSBMVSwgQ2hvbGVza3ksIGFuZCBRUiBkZWNvbXBvc2l0aW9ucyBjYW4gb3BlcmF0ZSBcZW0gaW5wbGFjZSwgdGhhdCBpcywgZGlyZWN0bHkgd2l0aGluIHRoZSBnaXZlbiBpbnB1dCBtYXRyaXguCitUaGlzIGZlYXR1cmUgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggaHVnZSBtYXRyaWNlcywgYW5kIG9yIHdoZW4gdGhlIGF2YWlsYWJsZSBtZW1vcnkgaXMgdmVyeSBsaW1pdGVkIChlbWJlZGRlZCBzeXN0ZW1zKS4KKworVG8gdGhpcyBlbmQsIHRoZSByZXNwZWN0aXZlIGRlY29tcG9zaXRpb24gY2xhc3MgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIFJlZjw+IG1hdHJpeCB0eXBlLCBhbmQgdGhlIGRlY29tcG9zaXRpb24gb2JqZWN0IG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCB0aGUgaW5wdXQgbWF0cml4IGFzIGFyZ3VtZW50LiBBcyBhbiBleGFtcGxlLCBsZXQgdXMgY29uc2lkZXIgYW4gaW5wbGFjZSBMVSBkZWNvbXBvc2l0aW9uIHdpdGggcGFydGlhbCBwaXZvdGluZy4KKworTGV0J3Mgc3RhcnQgd2l0aCB0aGUgYmFzaWMgaW5jbHVzaW9ucywgYW5kIGRlY2xhcmF0aW9uIG9mIGEgMngyIG1hdHJpeCBcYyBBOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5jb2RlPC90aD48dGg+b3V0cHV0PC90aD48L3RyPgorPHRyPgorICA8dGQ+XHNuaXBwZXQgVHV0b3JpYWxJbnBsYWNlTFUuY3BwIGluaXQKKyAgPC90ZD4KKyAgPHRkPlxzbmlwcGV0IFR1dG9yaWFsSW5wbGFjZUxVLm91dCBpbml0CisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworTm8gc3VycHJpc2UgaGVyZSEgVGhlbiwgbGV0J3MgZGVjbGFyZSBvdXIgaW5wbGFjZSBMVSBvYmplY3QgXGMgbHUsIGFuZCBjaGVjayB0aGUgY29udGVudCBvZiB0aGUgbWF0cml4IFxjIEE6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5jcHAgZGVjbGFyYXRpb24KKyAgPC90ZD4KKyAgPHRkPlxzbmlwcGV0IFR1dG9yaWFsSW5wbGFjZUxVLm91dCBkZWNsYXJhdGlvbgorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0hlcmUsIHRoZSBcYyBsdSBvYmplY3QgY29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgXGMgTCBhbmQgXGMgVSBmYWN0b3JzIHdpdGhpbiB0aGUgbWVtb3J5IGhlbGQgYnkgdGhlIG1hdHJpeCBcYyBBLgorVGhlIGNvZWZmaWNpZW50cyBvZiBcYyBBIGhhdmUgdGh1cyBiZWVuIGRlc3Ryb3llZCBkdXJpbmcgdGhlIGZhY3Rvcml6YXRpb24sIGFuZCByZXBsYWNlZCBieSB0aGUgTCBhbmQgVSBmYWN0b3JzIGFzIG9uZSBjYW4gdmVyaWZ5OgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPgorICA8dGQ+XHNuaXBwZXQgVHV0b3JpYWxJbnBsYWNlTFUuY3BwIG1hdHJpeExVCisgIDwvdGQ+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5vdXQgbWF0cml4TFUKKyAgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitUaGVuLCBvbmUgY2FuIHVzZSB0aGUgXGMgbHUgb2JqZWN0IGFzIHVzdWFsLCBmb3IgaW5zdGFuY2UgdG8gc29sdmUgdGhlIEF4PWIgcHJvYmxlbToKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5jcHAgc29sdmUKKyAgPC90ZD4KKyAgPHRkPlxzbmlwcGV0IFR1dG9yaWFsSW5wbGFjZUxVLm91dCBzb2x2ZQorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0hlcmUsIHNpbmNlIHRoZSBjb250ZW50IG9mIHRoZSBvcmlnaW5hbCBtYXRyaXggXGMgQSBoYXMgYmVlbiBsb3N0LCB3ZSBoYWQgdG8gZGVjbGFyZWQgYSBuZXcgbWF0cml4IFxjIEEwIHRvIHZlcmlmeSB0aGUgcmVzdWx0LgorCitTaW5jZSB0aGUgbWVtb3J5IGlzIHNoYXJlZCBiZXR3ZWVuIFxjIEEgYW5kIFxjIGx1LCBtb2RpZnlpbmcgdGhlIG1hdHJpeCBcYyBBIHdpbGwgbWFrZSBcYyBsdSBpbnZhbGlkLgorVGhpcyBjYW4gZWFzaWx5IGJlIHZlcmlmaWVkIGJ5IG1vZGlmeWluZyB0aGUgY29udGVudCBvZiBcYyBBIGFuZCB0cnlpbmcgdG8gc29sdmUgdGhlIGluaXRpYWwgcHJvYmxlbSBhZ2FpbjoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj4KKyAgPHRkPlxzbmlwcGV0IFR1dG9yaWFsSW5wbGFjZUxVLmNwcCBtb2RpZnlBCisgIDwvdGQ+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5vdXQgbW9kaWZ5QQorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK05vdGUgdGhhdCB0aGVyZSBpcyBubyBzaGFyZWQgcG9pbnRlciB1bmRlciB0aGUgaG9vZCwgaXQgaXMgdGhlIFxiIHJlc3BvbnNpYmlsaXR5IFxiIG9mIFxiIHRoZSBcYiB1c2VyIHRvIGtlZXAgdGhlIGlucHV0IG1hdHJpeCBcYyBBIGluIGxpZmUgYXMgbG9uZyBhcyBcYyBsdSBpcyBsaXZpbmcuCisKK0lmIG9uZSB3YW50cyB0byB1cGRhdGUgdGhlIGZhY3Rvcml6YXRpb24gd2l0aCB0aGUgbW9kaWZpZWQgQSwgb25lIGhhcyB0byBjYWxsIHRoZSBjb21wdXRlIG1ldGhvZCBhcyB1c3VhbDoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5jcHAgcmVjb21wdXRlCisgIDwvdGQ+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5vdXQgcmVjb21wdXRlCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworTm90ZSB0aGF0IGNhbGxpbmcgY29tcHV0ZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG1lbW9yeSB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBcYyBsdSBvYmplY3QuIFRoZXJlZm9yZSwgaWYgdGhlIGNvbXB1dGUgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGFub3RoZXIgbWF0cml4IFxjIEExIGRpZmZlcmVudCB0aGFuIFxjIEEsIHRoZW4gdGhlIGNvbnRlbnQgb2YgXGMgQTEgd29uJ3QgYmUgbW9kaWZpZWQuIFRoaXMgaXMgc3RpbGwgdGhlIGNvbnRlbnQgb2YgXGMgQSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgTCBhbmQgVSBmYWN0b3JzIG9mIHRoZSBtYXRyaXggXGMgQTEuCitUaGlzIGNhbiBlYXNpbHkgYmUgdmVyaWZpZWQgYXMgZm9sbG93czoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5jcHAgcmVjb21wdXRlX2JpczAKKyA8L3RkPgorICA8dGQ+XHNuaXBwZXQgVHV0b3JpYWxJbnBsYWNlTFUub3V0IHJlY29tcHV0ZV9iaXMwCisgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorVGhlIG1hdHJpeCBcYyBBMSBpcyB1bmNoYW5nZWQsIGFuZCBvbmUgY2FuIHRodXMgc29sdmUgQTEqeD1iLCBhbmQgZGlyZWN0bHkgY2hlY2sgdGhlIHJlc2lkdWFsIHdpdGhvdXQgYW55IGNvcHkgb2YgXGMgQTE6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPgorICA8dGQ+XHNuaXBwZXQgVHV0b3JpYWxJbnBsYWNlTFUuY3BwIHJlY29tcHV0ZV9iaXMxCisgIDwvdGQ+CisgIDx0ZD5cc25pcHBldCBUdXRvcmlhbElucGxhY2VMVS5vdXQgcmVjb21wdXRlX2JpczEKKyA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworSGVyZSBpcyB0aGUgbGlzdCBvZiBtYXRyaXggZGVjb21wb3NpdGlvbnMgc3VwcG9ydGluZyB0aGlzIGlucGxhY2UgbWVjaGFuaXNtOgorCistIGNsYXNzIExMVAorLSBjbGFzcyBMRExUCistIGNsYXNzIFBhcnRpYWxQaXZMVQorLSBjbGFzcyBGdWxsUGl2TFUKKy0gY2xhc3MgSG91c2Vob2xkZXJRUgorLSBjbGFzcyBDb2xQaXZIb3VzZWhvbGRlclFSCistIGNsYXNzIEZ1bGxQaXZIb3VzZWhvbGRlclFSCistIGNsYXNzIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24KKworKi8KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9JbnNpZGVFaWdlbkV4YW1wbGUuZG94IGIvZG9jL0luc2lkZUVpZ2VuRXhhbXBsZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwNTNjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JbnNpZGVFaWdlbkV4YW1wbGUuZG94CkBAIC0wLDAgKzEsNDk1IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNJbnNpZGVFaWdlbkV4YW1wbGUgV2hhdCBoYXBwZW5zIGluc2lkZSBFaWdlbiwgb24gYSBzaW1wbGUgZXhhbXBsZQorCitcZWlnZW5BdXRvVG9jCisKKzxocj4KKworCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUgcHJvZ3JhbToKKworXGNvZGUKKyNpbmNsdWRlPEVpZ2VuL0NvcmU+CisKK2ludCBtYWluKCkKK3sKKyAgaW50IHNpemUgPSA1MDsKKyAgLy8gVmVjdG9yWGYgaXMgYSB2ZWN0b3Igb2YgZmxvYXRzLCB3aXRoIGR5bmFtaWMgc2l6ZS4KKyAgRWlnZW46OlZlY3RvclhmIHUoc2l6ZSksIHYoc2l6ZSksIHcoc2l6ZSk7CisgIHUgPSB2ICsgdzsKK30KK1xlbmRjb2RlCisKK1RoZSBnb2FsIG9mIHRoaXMgcGFnZSBpcyB0byB1bmRlcnN0YW5kIGhvdyBFaWdlbiBjb21waWxlcyBpdCwgYXNzdW1pbmcgdGhhdCBTU0UyIHZlY3Rvcml6YXRpb24gaXMgZW5hYmxlZCAoR0NDIG9wdGlvbiAtbXNzZTIpLgorCitcc2VjdGlvbiBXaHlJbnRlcmVzdGluZyBXaHkgaXQncyBpbnRlcmVzdGluZworCitNYXliZSB5b3UgdGhpbmssIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGUgcHJvZ3JhbSBpcyBzbyBzaW1wbGUsIHRoYXQgY29tcGlsaW5nIGl0IHNob3VsZG4ndCBpbnZvbHZlIGFueXRoaW5nIGludGVyZXN0aW5nLiBTbyBiZWZvcmUgc3RhcnRpbmcsIGxldCB1cyBleHBsYWluIHdoYXQgaXMgbm9udHJpdmlhbCBpbiBjb21waWxpbmcgaXQgY29ycmVjdGx5IC0tIHRoYXQgaXMsIHByb2R1Y2luZyBvcHRpbWl6ZWQgY29kZSAtLSBzbyB0aGF0IHRoZSBjb21wbGV4aXR5IG9mIEVpZ2VuLCB0aGF0IHdlJ2xsIGV4cGxhaW4gaGVyZSwgaXMgcmVhbGx5IHVzZWZ1bC4KKworTG9vayBhdCB0aGUgbGluZSBvZiBjb2RlCitcY29kZQorICB1ID0gdiArIHc7ICAgLy8gICAoKikKK1xlbmRjb2RlCisKK1RoZSBmaXJzdCBpbXBvcnRhbnQgdGhpbmcgYWJvdXQgY29tcGlsaW5nIGl0LCBpcyB0aGF0IHRoZSBhcnJheXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBvbmx5IG9uY2UsIGxpa2UKK1xjb2RlCisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHVbaV0gPSB2W2ldICsgd1tpXTsKK1xlbmRjb2RlCitUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHdlIG1ha2UgYSBuYWl2ZSBDKysgbGlicmFyeSB3aGVyZSB0aGUgVmVjdG9yWGYgY2xhc3MgaGFzIGFuIG9wZXJhdG9yKyByZXR1cm5pbmcgYSBWZWN0b3JYZiwgdGhlbiB0aGUgbGluZSBvZiBjb2RlICgqKSB3aWxsIGFtb3VudCB0bzoKK1xjb2RlCisgIFZlY3RvclhmIHRtcCA9IHYgKyB3OworICBWZWN0b3JYZiB1ID0gdG1wOworXGVuZGNvZGUKK09idmlvdXNseSwgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgdGVtcG9yYXJ5IFxhIHRtcCBoZXJlIGlzIHVzZWxlc3MuIEl0IGhhcyBhIHZlcnkgYmFkIGVmZmVjdCBvbiBwZXJmb3JtYW5jZSwgZmlyc3QgYmVjYXVzZSB0aGUgY3JlYXRpb24gb2YgXGEgdG1wIHJlcXVpcmVzIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpbiB0aGlzIGNvbnRleHQsIGFuZCBzZWNvbmQgYXMgdGhlcmUgYXJlIG5vdyB0d28gZm9yIGxvb3BzOgorXGNvZGUKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgdG1wW2ldID0gdltpXSArIHdbaV07CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHVbaV0gPSB0bXBbaV07CitcZW5kY29kZQorVHJhdmVyc2luZyB0aGUgYXJyYXlzIHR3aWNlIGluc3RlYWQgb2Ygb25jZSBpcyB0ZXJyaWJsZSBmb3IgcGVyZm9ybWFuY2UsIGFzIGl0IG1lYW5zIHRoYXQgd2UgZG8gbWFueSByZWR1bmRhbnQgbWVtb3J5IGFjY2Vzc2VzLgorCitUaGUgc2Vjb25kIGltcG9ydGFudCB0aGluZyBhYm91dCBjb21waWxpbmcgdGhlIGFib3ZlIHByb2dyYW0sIGlzIHRvIG1ha2UgY29ycmVjdCB1c2Ugb2YgU1NFMiBpbnN0cnVjdGlvbnMuIE5vdGljZSB0aGF0IEVpZ2VuIGFsc28gc3VwcG9ydHMgQWx0aVZlYyBhbmQgdGhhdCBhbGwgdGhlIGRpc2N1c3Npb24gdGhhdCB3ZSBtYWtlIGhlcmUgYXBwbGllcyBhbHNvIHRvIEFsdGlWZWMuCisKK1NTRTIsIGxpa2UgQWx0aVZlYywgaXMgYSBzZXQgb2YgaW5zdHJ1Y3Rpb25zIGFsbG93aW5nIHRvIHBlcmZvcm0gY29tcHV0YXRpb25zIG9uIHBhY2tldHMgb2YgMTI4IGJpdHMgYXQgb25jZS4gU2luY2UgYSBmbG9hdCBpcyAzMiBiaXRzLCB0aGlzIG1lYW5zIHRoYXQgU1NFMiBpbnN0cnVjdGlvbnMgY2FuIGhhbmRsZSA0IGZsb2F0cyBhdCBvbmNlLiBUaGlzIG1lYW5zIHRoYXQsIGlmIGNvcnJlY3RseSB1c2VkLCB0aGV5IGNhbiBtYWtlIG91ciBjb21wdXRhdGlvbiBnbyB1cCB0byA0eCBmYXN0ZXIuCisKK0hvd2V2ZXIsIGluIHRoZSBhYm92ZSBwcm9ncmFtLCB3ZSBoYXZlIGNob3NlbiBzaXplPTUwLCBzbyBvdXIgdmVjdG9ycyBjb25zaXN0IG9mIDUwIGZsb2F0J3MsIGFuZCA1MCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiBUaGlzIG1lYW5zIHRoYXQgd2UgY2Fubm90IGhvcGUgdG8gZG8gYWxsIG9mIHRoYXQgY29tcHV0YXRpb24gdXNpbmcgU1NFMiBpbnN0cnVjdGlvbnMuIFRoZSBzZWNvbmQgYmVzdCB0aGluZywgdG8gd2hpY2ggd2Ugc2hvdWxkIGFpbSwgaXMgdG8gaGFuZGxlIHRoZSA0OCBmaXJzdCBjb2VmZmljaWVudHMgd2l0aCBTU0UyIGluc3RydWN0aW9ucywgc2luY2UgNDggaXMgdGhlIGJpZ2dlc3QgbXVsdGlwbGUgb2YgNCBiZWxvdyA1MCwgYW5kIHRoZW4gaGFuZGxlIHNlcGFyYXRlbHksIHdpdGhvdXQgU1NFMiwgdGhlIDQ5dGggYW5kIDUwdGggY29lZmZpY2llbnRzLiBTb21ldGhpbmcgbGlrZSB0aGlzOgorCitcY29kZQorICBmb3IoaW50IGkgPSAwOyBpIDwgNCooc2l6ZS80KTsgaSs9NCkgdS5wYWNrZXQoaSkgID0gdi5wYWNrZXQoaSkgKyB3LnBhY2tldChpKTsKKyAgZm9yKGludCBpID0gNCooc2l6ZS80KTsgaSA8IHNpemU7IGkrKykgdVtpXSA9IHZbaV0gKyB3W2ldOworXGVuZGNvZGUKKworU28gbGV0IHVzIGxvb2sgbGluZSBieSBsaW5lIGF0IG91ciBleGFtcGxlIHByb2dyYW0sIGFuZCBsZXQncyBmb2xsb3cgRWlnZW4gYXMgaXQgY29tcGlsZXMgaXQuCisKK1xzZWN0aW9uIENvbnN0cnVjdGluZ1ZlY3RvcnMgQ29uc3RydWN0aW5nIHZlY3RvcnMKKworTGV0J3MgYW5hbHl6ZSB0aGUgZmlyc3QgbGluZToKKworXGNvZGUKKyAgRWlnZW46OlZlY3RvclhmIHUoc2l6ZSksIHYoc2l6ZSksIHcoc2l6ZSk7CitcZW5kY29kZQorCitGaXJzdCBvZiBhbGwsIFZlY3RvclhmIGlzIHRoZSBmb2xsb3dpbmcgdHlwZWRlZjoKK1xjb2RlCisgIHR5cGVkZWYgTWF0cml4PGZsb2F0LCBEeW5hbWljLCAxPiBWZWN0b3JYZjsKK1xlbmRjb2RlCisKK1RoZSBjbGFzcyB0ZW1wbGF0ZSBNYXRyaXggaXMgZGVjbGFyZWQgaW4gc3JjL0NvcmUvdXRpbC9Gb3J3YXJkRGVjbGFyYXRpb25zLmggd2l0aCA2IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGJ1dCB0aGUgbGFzdCAzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgdGhlIGZpcnN0IDMuIFNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZW0gZm9yIG5vdy4gSGVyZSwgTWF0cml4XDxmbG9hdCwgRHluYW1pYywgMVw+IG1lYW5zIGEgbWF0cml4IG9mIGZsb2F0cywgd2l0aCBhIGR5bmFtaWMgbnVtYmVyIG9mIHJvd3MgYW5kIDEgY29sdW1uLgorCitUaGUgTWF0cml4IGNsYXNzIGluaGVyaXRzIGEgYmFzZSBjbGFzcywgTWF0cml4QmFzZS4gRG9uJ3Qgd29ycnkgYWJvdXQgaXQsIGZvciBub3cgaXQgc3VmZmljZXMgdG8gc2F5IHRoYXQgTWF0cml4QmFzZSBpcyB3aGF0IHVuaWZpZXMgbWF0cmljZXMvdmVjdG9ycyBhbmQgYWxsIHRoZSBleHByZXNzaW9ucyB0eXBlcyAtLSBtb3JlIG9uIHRoYXQgYmVsb3cuCisKK1doZW4gd2UgZG8KK1xjb2RlCisgIEVpZ2VuOjpWZWN0b3JYZiB1KHNpemUpOworXGVuZGNvZGUKK3RoZSBjb25zdHJ1Y3RvciB0aGF0IGlzIGNhbGxlZCBpcyBNYXRyaXg6Ok1hdHJpeChpbnQpLCBpbiBzcmMvQ29yZS9NYXRyaXguaC4gQmVzaWRlcyBzb21lIGFzc2VydGlvbnMsIGFsbCBpdCBkb2VzIGlzIHRvIGNvbnN0cnVjdCB0aGUgXGEgbV9zdG9yYWdlIG1lbWJlciwgd2hpY2ggaXMgb2YgdHlwZSBEZW5zZVN0b3JhZ2VcPGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCAxXD4uCisKK1lvdSBtYXkgd29uZGVyLCBpc24ndCBpdCBvdmVyZW5naW5lZXJpbmcgdG8gaGF2ZSB0aGUgc3RvcmFnZSBpbiBhIHNlcGFyYXRlIGNsYXNzPyBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZSBjb3ZlcnMgYWxsIGtpbmRzIG9mIG1hdHJpY2VzIGFuZCB2ZWN0b3I6IGJvdGggZml4ZWQtc2l6ZSBhbmQgZHluYW1pYy1zaXplLiBUaGUgc3RvcmFnZSBtZXRob2QgaXMgbm90IHRoZSBzYW1lIGluIHRoZXNlIHR3byBjYXNlcy4gRm9yIGZpeGVkLXNpemUsIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgYSBwbGFpbiBtZW1iZXIgYXJyYXkuIEZvciBkeW5hbWljLXNpemUsIHRoZSBjb2VmZmljaWVudHMgd2lsbCBiZSBzdG9yZWQgYXMgYSBwb2ludGVyIHRvIGEgZHluYW1pY2FsbHktYWxsb2NhdGVkIGFycmF5LiBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgdG8gYWJzdHJhY3Qgc3RvcmFnZSBhd2F5IGZyb20gdGhlIE1hdHJpeCBjbGFzcy4gVGhhdCdzIERlbnNlU3RvcmFnZS4KKworTGV0J3MgbG9vayBhdCB0aGlzIGNvbnN0cnVjdG9yLCBpbiBzcmMvQ29yZS9EZW5zZVN0b3JhZ2UuaC4gWW91IGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgbWFueSBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBvZiBEZW5zZVN0b3JhZ2VzIGhlcmUsIHRyZWF0aW5nIHNlcGFyYXRlbHkgdGhlIGNhc2VzIHdoZXJlIGRpbWVuc2lvbnMgYXJlIER5bmFtaWMgb3IgZml4ZWQgYXQgY29tcGlsZS10aW1lLiBUaGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0aGF0IHdlIGFyZSBsb29raW5nIGF0IGlzOgorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBfQ29scz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIER5bmFtaWMsIER5bmFtaWMsIF9Db2xzPgorXGVuZGNvZGUKKworSGVyZSwgdGhlIGNvbnN0cnVjdG9yIGNhbGxlZCBpcyBEZW5zZVN0b3JhZ2U6OkRlbnNlU3RvcmFnZShpbnQgc2l6ZSwgaW50IHJvd3MsIGludCBjb2x1bW5zKQord2l0aCBzaXplPTUwLCByb3dzPTUwLCBjb2x1bW5zPTEuCisKK0hlcmUgaXMgdGhpcyBjb25zdHJ1Y3RvcjoKK1xjb2RlCitpbmxpbmUgRGVuc2VTdG9yYWdlKGludCBzaXplLCBpbnQgcm93cywgaW50KSA6IG1fZGF0YShpbnRlcm5hbDo6YWxpZ25lZF9uZXc8VD4oc2l6ZSkpLCBtX3Jvd3Mocm93cykge30KK1xlbmRjb2RlCisKK0hlcmUsIHRoZSBcYSBtX2RhdGEgbWVtYmVyIGlzIHRoZSBhY3R1YWwgYXJyYXkgb2YgY29lZmZpY2llbnRzIG9mIHRoZSBtYXRyaXguIEFzIHlvdSBzZWUsIGl0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gUmF0aGVyIHRoYW4gY2FsbGluZyBuZXdbXSBvciBtYWxsb2MoKSwgYXMgeW91IGNhbiBzZWUsIHdlIGhhdmUgb3VyIG93biBpbnRlcm5hbDo6YWxpZ25lZF9uZXcgZGVmaW5lZCBpbiBzcmMvQ29yZS91dGlsL01lbW9yeS5oLiBXaGF0IGl0IGRvZXMgaXMgdGhhdCBpZiB2ZWN0b3JpemF0aW9uIGlzIGVuYWJsZWQsIHRoZW4gaXQgdXNlcyBhIHBsYXRmb3JtLXNwZWNpZmljIGNhbGwgdG8gYWxsb2NhdGUgYSAxMjgtYml0LWFsaWduZWQgYXJyYXksIGFzIHRoYXQgaXMgdmVyeSB1c2VmdWwgZm9yIHZlY3Rvcml6YXRpb24gd2l0aCBib3RoIFNTRTIgYW5kIEFsdGlWZWMuIElmIHZlY3Rvcml6YXRpb24gaXMgZGlzYWJsZWQsIGl0IGFtb3VudHMgdG8gdGhlIHN0YW5kYXJkIG5ld1tdLgorCitBcyB5b3UgY2FuIHNlZSwgdGhlIGNvbnN0cnVjdG9yIGFsc28gc2V0cyB0aGUgXGEgbV9yb3dzIG1lbWJlciB0byBcYSBzaXplLiBOb3RpY2UgdGhhdCB0aGVyZSBpcyBubyBcYSBtX2NvbHVtbnMgbWVtYmVyOiBpbmRlZWQsIGluIHRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBEZW5zZVN0b3JhZ2UsIHdlIGtub3cgdGhlIG51bWJlciBvZiBjb2x1bW5zIGF0IGNvbXBpbGUtdGltZSwgc2luY2UgdGhlIF9Db2xzIHRlbXBsYXRlIHBhcmFtZXRlciBpcyBkaWZmZXJlbnQgZnJvbSBEeW5hbWljLiBOYW1lbHksIGluIG91ciBjYXNlLCBfQ29scyBpcyAxLCB3aGljaCBpcyB0byBzYXkgdGhhdCBvdXIgdmVjdG9yIGlzIGp1c3QgYSBtYXRyaXggd2l0aCAxIGNvbHVtbi4gSGVuY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFzIGEgcnVudGltZSB2YXJpYWJsZS4KKworV2hlbiB5b3UgY2FsbCBWZWN0b3JYZjo6ZGF0YSgpIHRvIGdldCB0aGUgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzLCBpdCByZXR1cm5zIERlbnNlU3RvcmFnZTo6ZGF0YSgpIHdoaWNoIHJldHVybnMgdGhlIFxhIG1fZGF0YSBtZW1iZXIuCisKK1doZW4geW91IGNhbGwgVmVjdG9yWGY6OnNpemUoKSB0byBnZXQgdGhlIHNpemUgb2YgdGhlIHZlY3RvciwgdGhpcyBpcyBhY3R1YWxseSBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcyBNYXRyaXhCYXNlLiBJdCBkZXRlcm1pbmVzIHRoYXQgdGhlIHZlY3RvciBpcyBhIGNvbHVtbi12ZWN0b3IsIHNpbmNlIENvbHNBdENvbXBpbGVUaW1lPT0xICh0aGlzIGNvbWVzIGZyb20gdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgaW4gdGhlIHR5cGVkZWYgVmVjdG9yWGYpLiBJdCBkZWR1Y2VzIHRoYXQgdGhlIHNpemUgaXMgdGhlIG51bWJlciBvZiByb3dzLCBzbyBpdCByZXR1cm5zIFZlY3RvclhmOjpyb3dzKCksIHdoaWNoIHJldHVybnMgRGVuc2VTdG9yYWdlOjpyb3dzKCksIHdoaWNoIHJldHVybnMgdGhlIFxhIG1fcm93cyBtZW1iZXIsIHdoaWNoIHdhcyBzZXQgdG8gXGEgc2l6ZSBieSB0aGUgY29uc3RydWN0b3IuCisKK1xzZWN0aW9uIENvbnN0cnVjdGlvbk9mU3VtWHByIENvbnN0cnVjdGlvbiBvZiB0aGUgc3VtIGV4cHJlc3Npb24KKworTm93IHRoYXQgb3VyIHZlY3RvcnMgYXJlIGNvbnN0cnVjdGVkLCBsZXQncyBtb3ZlIG9uIHRvIHRoZSBuZXh0IGxpbmU6CisKK1xjb2RlCit1ID0gdiArIHc7CitcZW5kY29kZQorCitUaGUgZXhlY3V0aXZlIHN1bW1hcnkgaXMgdGhhdCBvcGVyYXRvcisgcmV0dXJucyBhICJzdW0gb2YgdmVjdG9ycyIgZXhwcmVzc2lvbiwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgcGVyZm9ybSB0aGUgY29tcHV0YXRpb24uIEl0IGlzIHRoZSBvcGVyYXRvcj0sIHdob3NlIGNhbGwgb2NjdXJzIHRoZXJlYWZ0ZXIsIHRoYXQgZG9lcyB0aGUgY29tcHV0YXRpb24uCisKK0xldCB1cyBub3cgc2VlIHdoYXQgRWlnZW4gZG9lcyB3aGVuIGl0IHNlZXMgdGhpczoKKworXGNvZGUKK3YgKyB3CitcZW5kY29kZQorCitIZXJlLCB2IGFuZCB3IGFyZSBvZiB0eXBlIFZlY3RvclhmLCB3aGljaCBpcyBhIHR5cGVkZWYgZm9yIGEgc3BlY2lhbGl6YXRpb24gb2YgTWF0cml4IChhcyB3ZSBleHBsYWluZWQgYWJvdmUpLCB3aGljaCBpcyBhIHN1YmNsYXNzIG9mIE1hdHJpeEJhc2UuIFNvIHdoYXQgaXMgYmVpbmcgY2FsbGVkIGlzCisKK1xjb2RlCitNYXRyaXhCYXNlOjpvcGVyYXRvcisoY29uc3QgTWF0cml4QmFzZSYpCitcZW5kY29kZQorCitUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBvcGVyYXRvciBpcworXGNvZGUKK0N3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LCBWZWN0b3JYZiwgVmVjdG9yWGY+CitcZW5kY29kZQorVGhlIEN3aXNlQmluYXJ5T3AgY2xhc3MgaXMgb3VyIGZpcnN0IGVuY291bnRlciB3aXRoIGFuIGV4cHJlc3Npb24gdGVtcGxhdGUuIEFzIHdlIHNhaWQsIHRoZSBvcGVyYXRvcisgZG9lc24ndCBieSBpdHNlbGYgcGVyZm9ybSBhbnkgY29tcHV0YXRpb24sIGl0IGp1c3QgcmV0dXJucyBhbiBhYnN0cmFjdCAic3VtIG9mIHZlY3RvcnMiIGV4cHJlc3Npb24uIFNpbmNlIHRoZXJlIGFyZSBhbHNvICJkaWZmZXJlbmNlIG9mIHZlY3RvcnMiIGFuZCAiY29lZmZpY2llbnQtd2lzZSBwcm9kdWN0IG9mIHZlY3RvcnMiIGV4cHJlc3Npb25zLCB3ZSB1bmlmeSB0aGVtIGFsbCBhcyAiY29lZmZpY2llbnQtd2lzZSBiaW5hcnkgb3BlcmF0aW9ucyIsIHdoaWNoIHdlIGFiYnJldmlhdGUgYXMgIkN3aXNlQmluYXJ5T3AiLiAiQ29lZmZpY2llbnQtd2lzZSIgbWVhbnMgdGhhdCB0aGUgb3BlcmF0aW9ucyBpcyBwZXJmb3JtZWQgY29lZmZpY2llbnQgYnkgY29lZmZpY2llbnQuICJiaW5hcnkiIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHR3byBvcGVyYW5kcyAtLSB3ZSBhcmUgYWRkaW5nIHR3byB2ZWN0b3JzIHdpdGggb25lIGFub3RoZXIuCisKK05vdyB5b3UgbWlnaHQgYXNrLCB3aGF0IGlmIHdlIGRpZCBzb21ldGhpbmcgbGlrZQorCitcY29kZQordiArIHcgKyB1OworXGVuZGNvZGUKKworVGhlIGZpcnN0IHYgKyB3IHdvdWxkIHJldHVybiBhIEN3aXNlQmluYXJ5T3AgYXMgYWJvdmUsIHNvIGluIG9yZGVyIGZvciB0aGlzIHRvIGNvbXBpbGUsIHdlJ2QgbmVlZCB0byBkZWZpbmUgYW4gb3BlcmF0b3IrIGFsc28gaW4gdGhlIGNsYXNzIEN3aXNlQmluYXJ5T3AuLi4gYXQgdGhpcyBwb2ludCBpdCBzdGFydHMgbG9va2luZyBsaWtlIGEgbmlnaHRtYXJlOiBhcmUgd2UgZ29pbmcgdG8gaGF2ZSB0byBkZWZpbmUgYWxsIG9wZXJhdG9ycyBpbiBlYWNoIG9mIHRoZSBleHByZXNzaW9uIGNsYXNzZXMgKGFzIHlvdSBndWVzc2VkLCBDd2lzZUJpbmFyeU9wIGlzIG9ubHkgb25lIG9mIG1hbnkpID8gVGhpcyBsb29rcyBsaWtlIGEgZGVhZCBlbmQhCisKK1RoZSBzb2x1dGlvbiBpcyB0aGF0IEN3aXNlQmluYXJ5T3AgaXRzZWxmLCBhcyB3ZWxsIGFzIE1hdHJpeCBhbmQgYWxsIHRoZSBvdGhlciBleHByZXNzaW9uIHR5cGVzLCBpcyBhIHN1YmNsYXNzIG9mIE1hdHJpeEJhc2UuIFNvIGl0IGlzIGVub3VnaCB0byBkZWZpbmUgb25jZSBhbmQgZm9yIGFsbCB0aGUgb3BlcmF0b3JzIGluIGNsYXNzIE1hdHJpeEJhc2UuCisKK1NpbmNlIE1hdHJpeEJhc2UgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIG9mIGRpZmZlcmVudCBzdWJjbGFzc2VzLCB0aGUgYXNwZWN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgc3ViY2xhc3MgbXVzdCBiZSBhYnN0cmFjdGVkIGZyb20gTWF0cml4QmFzZS4gVGhpcyBpcyBjYWxsZWQgcG9seW1vcnBoaXNtLgorCitUaGUgY2xhc3NpY2FsIGFwcHJvYWNoIHRvIHBvbHltb3JwaGlzbSBpbiBDKysgaXMgYnkgbWVhbnMgb2YgdmlydHVhbCBmdW5jdGlvbnMuIFRoaXMgaXMgZHluYW1pYyBwb2x5bW9ycGhpc20uIEhlcmUgd2UgZG9uJ3Qgd2FudCBkeW5hbWljIHBvbHltb3JwaGlzbSBiZWNhdXNlIHRoZSB3aG9sZSBkZXNpZ24gb2YgRWlnZW4gaXMgYmFzZWQgYXJvdW5kIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHRoZSBjb21wbGV4aXR5LCBhbGwgdGhlIGFic3RyYWN0aW9uLCBnZXRzIHJlc29sdmVkIGF0IGNvbXBpbGUtdGltZS4gVGhpcyBpcyBjcnVjaWFsOiBpZiB0aGUgYWJzdHJhY3Rpb24gY2FuJ3QgZ2V0IHJlc29sdmVkIGF0IGNvbXBpbGUtdGltZSwgRWlnZW4ncyBjb21waWxlLXRpbWUgb3B0aW1pemF0aW9uIG1lY2hhbmlzbXMgYmVjb21lIHVzZWxlc3MsIG5vdCB0byBtZW50aW9uIHRoYXQgaWYgdGhhdCBhYnN0cmFjdGlvbiBoYXMgdG8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSBpdCdsbCBpbmN1ciBhbiBvdmVyaGVhZCBieSBpdHNlbGYuCisKK0hlcmUsIHdoYXQgd2Ugd2FudCBpcyB0byBoYXZlIGEgc2luZ2xlIGNsYXNzIE1hdHJpeEJhc2UgYXMgdGhlIGJhc2Ugb2YgbWFueSBzdWJjbGFzc2VzLCBpbiBzdWNoIGEgd2F5IHRoYXQgZWFjaCBNYXRyaXhCYXNlIG9iamVjdCAoYmUgaXQgYSBtYXRyaXgsIG9yIHZlY3Rvciwgb3IgYW55IGtpbmQgb2YgZXhwcmVzc2lvbikga25vd3MgYXQgY29tcGlsZS10aW1lIChhcyBvcHBvc2VkIHRvIHJ1bi10aW1lKSBvZiB3aGljaCBwYXJ0aWN1bGFyIHN1YmNsYXNzIGl0IGlzIGFuIG9iamVjdCAoaS5lLiB3aGV0aGVyIGl0IGlzIGEgbWF0cml4LCBvciBhbiBleHByZXNzaW9uLCBhbmQgd2hhdCBraW5kIG9mIGV4cHJlc3Npb24pLgorCitUaGUgc29sdXRpb24gaXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3VyaW91c2x5X1JlY3VycmluZ19UZW1wbGF0ZV9QYXR0ZXJuIj5DdXJpb3VzbHkgUmVjdXJyaW5nIFRlbXBsYXRlIFBhdHRlcm48L2E+LiBMZXQncyBkbyB0aGUgYnJlYWsgbm93LiBIb3BlZnVsbHkgeW91IGNhbiByZWFkIHRoaXMgd2lraXBlZGlhIHBhZ2UgZHVyaW5nIHRoZSBicmVhayBpZiBuZWVkZWQsIGJ1dCBpdCB3b24ndCBiZSBhbGxvd2VkIGR1cmluZyB0aGUgZXhhbS4KKworSW4gc2hvcnQsIE1hdHJpeEJhc2UgdGFrZXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgRGVyaXZlZC4gV2hlbmV2ZXIgd2UgZGVmaW5lIGEgc3ViY2xhc3MgU3ViY2xhc3MsIHdlIGFjdHVhbGx5IG1ha2UgU3ViY2xhc3MgaW5oZXJpdCBNYXRyaXhCYXNlXDxTdWJjbGFzc1w+LiBUaGUgcG9pbnQgaXMgdGhhdCBkaWZmZXJlbnQgc3ViY2xhc3NlcyBpbmhlcml0IGRpZmZlcmVudCBNYXRyaXhCYXNlIHR5cGVzLiBUaGFua3MgdG8gdGhpcywgd2hlbmV2ZXIgd2UgaGF2ZSBhbiBvYmplY3Qgb2YgYSBzdWJjbGFzcywgYW5kIHdlIGNhbGwgb24gaXQgc29tZSBNYXRyaXhCYXNlIG1ldGhvZCwgd2Ugc3RpbGwgcmVtZW1iZXIgZXZlbiBmcm9tIGluc2lkZSB0aGUgTWF0cml4QmFzZSBtZXRob2Qgd2hpY2ggcGFydGljdWxhciBzdWJjbGFzcyB3ZSdyZSB0YWxraW5nIGFib3V0LgorCitUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIHB1dCBhbG1vc3QgYWxsIHRoZSBtZXRob2RzIGFuZCBvcGVyYXRvcnMgaW4gdGhlIGJhc2UgY2xhc3MgTWF0cml4QmFzZSwgYW5kIGhhdmUgb25seSB0aGUgYmFyZSBtaW5pbXVtIGluIHRoZSBzdWJjbGFzc2VzLiBJZiB5b3UgbG9vayBhdCB0aGUgc3ViY2xhc3NlcyBpbiBFaWdlbiwgbGlrZSBmb3IgaW5zdGFuY2UgdGhlIEN3aXNlQmluYXJ5T3AgY2xhc3MsIHRoZXkgaGF2ZSB2ZXJ5IGZldyBtZXRob2RzLiBUaGVyZSBhcmUgY29lZmYoKSBhbmQgc29tZXRpbWVzIGNvZWZmUmVmKCkgbWV0aG9kcyBmb3IgYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudHMsIHRoZXJlIGFyZSByb3dzKCkgYW5kIGNvbHMoKSBtZXRob2RzIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMsIGJ1dCB0aGVyZSBpc24ndCBtdWNoIG1vcmUgdGhhbiB0aGF0LiBBbGwgdGhlIG1lYXQgaXMgaW4gTWF0cml4QmFzZSwgc28gaXQgb25seSBuZWVkcyB0byBiZSBjb2RlZCBvbmNlIGZvciBhbGwga2luZHMgb2YgZXhwcmVzc2lvbnMsIG1hdHJpY2VzLCBhbmQgdmVjdG9ycy4KKworU28gbGV0J3MgZW5kIHRoaXMgZGlncmVzc2lvbiBhbmQgY29tZSBiYWNrIHRvIHRoZSBwaWVjZSBvZiBjb2RlIGZyb20gb3VyIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IHdlIHdlcmUgY3VycmVudGx5IGFuYWx5emluZywKKworXGNvZGUKK3YgKyB3CitcZW5kY29kZQorCitOb3cgdGhhdCBNYXRyaXhCYXNlIGlzIGEgZ29vZCBmcmllbmQsIGxldCdzIHdyaXRlIGZ1bGx5IHRoZSBwcm90b3R5cGUgb2YgdGhlIG9wZXJhdG9yKyB0aGF0IGdldHMgY2FsbGVkIGhlcmUgKHRoaXMgY29kZSBpcyBmcm9tIHNyYy9Db3JlL01hdHJpeEJhc2UuaCk6CisKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgTWF0cml4QmFzZQoreworICAvLyAuLi4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPiwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPgorICBvcGVyYXRvcisoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgLy8gLi4uCit9OworXGVuZGNvZGUKKworSGVyZSBvZiBjb3Vyc2UsIFxhIERlcml2ZWQgYW5kIFxhIE90aGVyRGVyaXZlZCBhcmUgVmVjdG9yWGYuCisKK0FzIHdlIHNhaWQsIEN3aXNlQmluYXJ5T3AgaXMgYWxzbyB1c2VkIGZvciBvdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgc3Vic3RyYXRpb24sIHNvIGl0IHRha2VzIGFub3RoZXIgdGVtcGxhdGUgcGFyYW1ldGVyIGRldGVybWluaW5nIHRoZSBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gY29lZmZpY2llbnRzLiBUaGlzIHRlbXBsYXRlIHBhcmFtZXRlciBpcyBhIGZ1bmN0b3IsIHRoYXQgaXMsIGEgY2xhc3MgaW4gd2hpY2ggd2UgaGF2ZSBhbiBvcGVyYXRvcigpIHNvIGl0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uLiBIZXJlLCB0aGUgZnVuY3RvciB1c2VkIGlzIGludGVybmFsOjpzY2FsYXJfc3VtX29wLiBJdCBpcyBkZWZpbmVkIGluIHNyYy9Db3JlL0Z1bmN0b3JzLmguCisKK0xldCB1cyBub3cgZXhwbGFpbiB0aGUgaW50ZXJuYWw6OnRyYWl0cyBoZXJlLiBUaGUgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3AgY2xhc3MgdGFrZXMgb25lIHRlbXBsYXRlIHBhcmFtZXRlcjogdGhlIHR5cGUgb2YgdGhlIG51bWJlcnMgdG8gaGFuZGxlLiBIZXJlIG9mIGNvdXJzZSB3ZSB3YW50IHRvIHBhc3MgdGhlIHNjYWxhciB0eXBlIChhLmsuYS4gbnVtZXJpYyB0eXBlKSBvZiBWZWN0b3JYZiwgd2hpY2ggaXMgXGMgZmxvYXQuIEhvdyBkbyB3ZSBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIHNjYWxhciB0eXBlIG9mIFxhIERlcml2ZWQgPyBUaHJvdWdob3V0IEVpZ2VuLCBhbGwgbWF0cml4IGFuZCBleHByZXNzaW9uIHR5cGVzIGRlZmluZSBhIHR5cGVkZWYgXGEgU2NhbGFyIHdoaWNoIGdpdmVzIGl0cyBzY2FsYXIgdHlwZS4gRm9yIGV4YW1wbGUsIFZlY3RvclhmOjpTY2FsYXIgaXMgYSB0eXBlZGVmIGZvciBcYyBmbG9hdC4gU28gaGVyZSwgaWYgbGlmZSB3YXMgZWFzeSwgd2UgY291bGQgZmluZCB0aGUgbnVtZXJpYyB0eXBlIG9mIFxhIERlcml2ZWQgYXMganVzdAorXGNvZGUKK3R5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcgorXGVuZGNvZGUKK1VuZm9ydHVuYXRlbHksIHdlIGNhbid0IGRvIHRoYXQgaGVyZSwgYXMgdGhlIGNvbXBpbGVyIHdvdWxkIGNvbXBsYWluIHRoYXQgdGhlIHR5cGUgRGVyaXZlZCBoYXNuJ3QgeWV0IGJlZW4gZGVmaW5lZC4gU28gd2UgdXNlIGEgd29ya2Fyb3VuZDogaW4gc3JjL0NvcmUvdXRpbC9Gb3J3YXJkRGVjbGFyYXRpb25zLmgsIHdlIGRlY2xhcmVkIChub3QgZGVmaW5lZCEpIGFsbCBvdXIgc3ViY2xhc3NlcywgbGlrZSBNYXRyaXgsIGFuZCB3ZSBhbHNvIGRlY2xhcmVkIHRoZSBmb2xsb3dpbmcgY2xhc3MgdGVtcGxhdGU6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGludGVybmFsOjp0cmFpdHM7CitcZW5kY29kZQorSW4gc3JjL0NvcmUvTWF0cml4LmgsIHJpZ2h0IFxlbSBiZWZvcmUgdGhlIGRlZmluaXRpb24gb2YgY2xhc3MgTWF0cml4LCB3ZSBkZWZpbmUgYSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIGludGVybmFsOjp0cmFpdHMgZm9yIFQ9TWF0cml4XDxhbnkgdGVtcGxhdGUgcGFyYW1ldGVyc1w+LiBJbiB0aGlzIHNwZWNpYWxpemF0aW9uIG9mIGludGVybmFsOjp0cmFpdHMsIHdlIGRlZmluZSB0aGUgU2NhbGFyIHR5cGVkZWYuIFNvIHdoZW4gd2UgYWN0dWFsbHkgZGVmaW5lIE1hdHJpeCwgaXQgaXMgbGVnYWwgdG8gcmVmZXIgdG8gInR5cGVuYW1lIGludGVybmFsOjp0cmFpdHNcPE1hdHJpeFw+OjpTY2FsYXIiLgorCitBbnl3YXksIHdlIGhhdmUgZGVjbGFyZWQgb3VyIG9wZXJhdG9yKy4gSW4gb3VyIGNhc2UsIHdoZXJlIFxhIERlcml2ZWQgYW5kIFxhIE90aGVyRGVyaXZlZCBhcmUgVmVjdG9yWGYsIHRoZSBhYm92ZSBkZWNsYXJhdGlvbiBhbW91bnRzIHRvOgorXGNvZGUKK2NsYXNzIE1hdHJpeEJhc2U8VmVjdG9yWGY+Cit7CisgIC8vIC4uLgorCisgIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LCBWZWN0b3JYZiwgVmVjdG9yWGY+CisgIG9wZXJhdG9yKyhjb25zdCBNYXRyaXhCYXNlPFZlY3RvclhmPiAmb3RoZXIpIGNvbnN0OworCisgIC8vIC4uLgorfTsKK1xlbmRjb2RlCisKK0xldCdzIG5vdyBqdW1wIHRvIHNyYy9Db3JlL0N3aXNlQmluYXJ5T3AuaCB0byBzZWUgaG93IGl0IGlzIGRlZmluZWQuIEFzIHlvdSBjYW4gc2VlIHRoZXJlLCBhbGwgaXQgZG9lcyBpcyB0byByZXR1cm4gYSBDd2lzZUJpbmFyeU9wIG9iamVjdCwgYW5kIHRoaXMgb2JqZWN0IGlzIGp1c3Qgc3RvcmluZyByZWZlcmVuY2VzIHRvIHRoZSBsZWZ0LWhhbmQtc2lkZSBhbmQgcmlnaHQtaGFuZC1zaWRlIGV4cHJlc3Npb25zIC0tIGhlcmUsIHRoZXNlIGFyZSB0aGUgdmVjdG9ycyBcYSB2IGFuZCBcYSB3LiBXZWxsLCB0aGUgQ3dpc2VCaW5hcnlPcCBvYmplY3QgaXMgYWxzbyBzdG9yaW5nIGFuIGluc3RhbmNlIG9mIHRoZSAoZW1wdHkpIGZ1bmN0b3IgY2xhc3MsIGJ1dCB5b3Ugc2hvdWxkbid0IHdvcnJ5IGFib3V0IGl0IGFzIHRoYXQgaXMgYSBtaW5vciBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisKK1RodXMsIHRoZSBvcGVyYXRvcisgaGFzbid0IHBlcmZvcm1lZCBhbnkgYWN0dWFsIGNvbXB1dGF0aW9uLiBUbyBzdW1tYXJpemUsIHRoZSBvcGVyYXRpb24gXGEgdiArIFxhIHcganVzdCByZXR1cm5lZCBhbiBvYmplY3Qgb2YgdHlwZSBDd2lzZUJpbmFyeU9wIHdoaWNoIGRpZCBub3RoaW5nIGVsc2UgdGhhbiBqdXN0IHN0b3JpbmcgcmVmZXJlbmNlcyB0byBcYSB2IGFuZCBcYSB3LgorCitcc2VjdGlvbiBBc3NpZ25tZW50IFRoZSBhc3NpZ25tZW50CisKK0F0IHRoaXMgcG9pbnQsIHRoZSBleHByZXNzaW9uIFxhIHYgKyBcYSB3IGhhcyBmaW5pc2hlZCBldmFsdWF0aW5nLCBzbywgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGlsaW5nIHRoZSBsaW5lIG9mIGNvZGUKK1xjb2RlCit1ID0gdiArIHc7CitcZW5kY29kZQord2Ugbm93IGVudGVyIHRoZSBvcGVyYXRvcj0uCisKK1doYXQgb3BlcmF0b3I9IGlzIGJlaW5nIGNhbGxlZCBoZXJlPyBUaGUgdmVjdG9yIHUgaXMgYW4gb2JqZWN0IG9mIGNsYXNzIFZlY3RvclhmLCBpLmUuIE1hdHJpeC4gSW4gc3JjL0NvcmUvTWF0cml4LmgsIGluc2lkZSB0aGUgZGVmaW5pdGlvbiBvZiBjbGFzcyBNYXRyaXgsIHdlIHNlZSB0aGlzOgorXGNvZGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIE1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fc3RvcmFnZS5kYXRhKCkhPTAgJiYgInlvdSBjYW5ub3QgdXNlIG9wZXJhdG9yPSB3aXRoIGEgbm9uIGluaXRpYWxpemVkIG1hdHJpeCAoaW5zdGVhZCB1c2Ugc2V0KCkiKTsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CitcZW5kY29kZQorSGVyZSwgQmFzZSBpcyBhIHR5cGVkZWYgZm9yIE1hdHJpeEJhc2VcPE1hdHJpeFw+LiBTbywgd2hhdCBpcyBiZWluZyBjYWxsZWQgaXMgdGhlIG9wZXJhdG9yPSBvZiBNYXRyaXhCYXNlLiBMZXQncyBzZWUgaXRzIHByb3RvdHlwZSBpbiBzcmMvQ29yZS9NYXRyaXhCYXNlLmg6CitcY29kZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CitcZW5kY29kZQorSGVyZSwgXGEgRGVyaXZlZCBpcyBWZWN0b3JYZiAoc2luY2UgdSBpcyBhIFZlY3RvclhmKSBhbmQgXGEgT3RoZXJEZXJpdmVkIGlzIEN3aXNlQmluYXJ5T3AuIE1vcmUgc3BlY2lmaWNhbGx5LCBhcyBleHBsYWluZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIFxhIE90aGVyRGVyaXZlZCBpczoKK1xjb2RlCitDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPGZsb2F0PiwgVmVjdG9yWGYsIFZlY3RvclhmPgorXGVuZGNvZGUKK1NvIHRoZSBmdWxsIHByb3RvdHlwZSBvZiB0aGUgb3BlcmF0b3I9IGJlaW5nIGNhbGxlZCBpczoKK1xjb2RlCitWZWN0b3JYZiYgTWF0cml4QmFzZTxWZWN0b3JYZj46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LCBWZWN0b3JYZiwgVmVjdG9yWGY+ID4gJiBvdGhlcik7CitcZW5kY29kZQorVGhpcyBvcGVyYXRvcj0gbGl0ZXJhbGx5IHJlYWRzICJjb3B5aW5nIGEgc3VtIG9mIHR3byBWZWN0b3JYZidzIGludG8gYW5vdGhlciBWZWN0b3JYZiIuCisKK0xldCdzIG5vdyBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG9wZXJhdG9yPS4gSXQgcmVzaWRlcyBpbiB0aGUgZmlsZSBzcmMvQ29yZS9Bc3NpZ24uaC4KKworV2hhdCB3ZSBjYW4gc2VlIHRoZXJlIGlzOgorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPgorICA6Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICByZXR1cm4gaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxEZXJpdmVkLE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CitcZW5kY29kZQorCitPSyBzbyBvdXIgbmV4dCB0YXNrIGlzIHRvIHVuZGVyc3RhbmQgaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvciA6KQorCitIZXJlIGlzIGl0cyBkZWNsYXJhdGlvbiAoYWxsIHRoYXQgaXMgc3RpbGwgaW4gdGhlIHNhbWUgZmlsZSBzcmMvQ29yZS9Bc3NpZ24uaCkKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsCisgICAgICAgICBib29sIEV2YWxCZWZvcmVBc3NpZ25pbmcgPSBpbnQoT3RoZXJEZXJpdmVkOjpGbGFncykgJiBFdmFsQmVmb3JlQXNzaWduaW5nQml0LAorICAgICAgICAgYm9vbCBOZWVkVG9UcmFuc3Bvc2UgPSBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAmJiBPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICYmIGludChEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSkgPT0gaW50KE90aGVyRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgJiYgaW50KERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSBpbnQoT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAmJiBpbnQoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUpICE9IDE+CitzdHJ1Y3QgaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjsKK1xlbmRjb2RlCisKK1NvIGludGVybmFsOjphc3NpZ25fc2VsZWN0b3IgdGFrZXMgNCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBidXQgdGhlIDIgbGFzdCBvbmVzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgdGhlIDIgZmlyc3Qgb25lcy4KKworRXZhbEJlZm9yZUFzc2lnbmluZyBpcyBoZXJlIHRvIGVuZm9yY2UgdGhlIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQuIEFzIGV4cGxhaW5lZCA8YSBocmVmPSJUb3BpY0xhenlFdmFsdWF0aW9uLmh0bWwiPmhlcmU8L2E+LCBjZXJ0YWluIGV4cHJlc3Npb25zIGhhdmUgdGhpcyBmbGFnIHdoaWNoIG1ha2VzIHRoZW0gYXV0b21hdGljYWxseSBldmFsdWF0ZSBpbnRvIHRlbXBvcmFyaWVzIGJlZm9yZSBhc3NpZ25pbmcgdGhlbSB0byBhbm90aGVyIGV4cHJlc3Npb24uIFRoaXMgaXMgdGhlIGNhc2Ugb2YgdGhlIFByb2R1Y3QgZXhwcmVzc2lvbiwgaW4gb3JkZXIgdG8gYXZvaWQgc3RyYW5nZSBhbGlhc2luZyBlZmZlY3RzIHdoZW4gZG9pbmcgIm0gPSBtICogbTsiIEhvd2V2ZXIsIG9mIGNvdXJzZSBoZXJlIG91ciBDd2lzZUJpbmFyeU9wIGV4cHJlc3Npb24gZG9lc24ndCBoYXZlIHRoZSBFdmFsQmVmb3JlQXNzaWduaW5nQml0OiB3ZSBzYWlkIHNpbmNlIHRoZSBiZWdpbm5pbmcgdGhhdCB3ZSBkaWRuJ3Qgd2FudCBhIHRlbXBvcmFyeSB0byBiZSBpbnRyb2R1Y2VkIGhlcmUuIFNvIGlmIHlvdSBnbyB0byBzcmMvQ29yZS9Dd2lzZUJpbmFyeU9wLmgsIHlvdSdsbCBzZWUgdGhhdCB0aGUgRmxhZ3MgaW4gaW50ZXJuYWw6OnRyYWl0c1w8Q3dpc2VCaW5hcnlPcFw+IGRvbid0IGluY2x1ZGUgdGhlIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQuIFRoZSBGbGFncyBtZW1iZXIgb2YgQ3dpc2VCaW5hcnlPcCBpcyB0aGVuIGltcG9ydGVkIGZyb20gdGhlIGludGVybmFsOjp0cmFpdHMgYnkgdGhlIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRSBtYWNyby4gQW55d2F5LCBoZXJlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgRXZhbEJlZm9yZUFzc2lnbmluZyBoYXMgdGhlIHZhbHVlIFxjIGZhbHNlLgorCitOZWVkVG9UcmFuc3Bvc2UgaXMgaGVyZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgd2FudHMgdG8gY29weSBhIHJvdy12ZWN0b3IgaW50byBhIGNvbHVtbi12ZWN0b3IuIFdlIGFsbG93IHRoaXMgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgZ2VuZXJhbCBydWxlIHRoYXQgaW4gYXNzaWdubWVudHMgd2UgcmVxdWlyZSB0aGUgZGltZXNpb25zIHRvIG1hdGNoLiBBbnl3YXksIGhlcmUgYm90aCB0aGUgbGVmdC1oYW5kIGFuZCByaWdodC1oYW5kIHNpZGVzIGFyZSBjb2x1bW4gdmVjdG9ycywgaW4gdGhlIHNlbnNlIHRoYXQgQ29sc0F0Q29tcGlsZVRpbWUgaXMgZXF1YWwgdG8gMS4gU28gTmVlZFRvVHJhbnNwb3NlIGlzIFxjIGZhbHNlIHRvby4KKworU28sIGhlcmUgd2UgYXJlIGluIHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uOgorXGNvZGUKK2ludGVybmFsOjphc3NpZ25fc2VsZWN0b3I8RGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBmYWxzZSwgZmFsc2U+CitcZW5kY29kZQorCitIZXJlJ3MgaG93IGl0IGlzIGRlZmluZWQ6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RydWN0IGludGVybmFsOjphc3NpZ25fc2VsZWN0b3I8RGVyaXZlZCxPdGhlckRlcml2ZWQsZmFsc2UsZmFsc2U+IHsKKyAgc3RhdGljIERlcml2ZWQmIHJ1bihEZXJpdmVkJiBkc3QsIGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIHsgcmV0dXJuIGRzdC5sYXp5QXNzaWduKG90aGVyLmRlcml2ZWQoKSk7IH0KK307CitcZW5kY29kZQorCitPSyBzbyBub3cgb3VyIG5leHQgam9iIGlzIHRvIHVuZGVyc3RhbmQgaG93IGxhenlBc3NpZ24gd29ya3MgOikKKworXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPgorICA6OmxhenlBc3NpZ24oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICBlaWdlbl9hc3NlcnQocm93cygpID09IG90aGVyLnJvd3MoKSAmJiBjb2xzKCkgPT0gb3RoZXIuY29scygpKTsKKyAgaW50ZXJuYWw6OmFzc2lnbl9pbXBsPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksb3RoZXIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KK1xlbmRjb2RlCisKK1doYXQgZG8gd2Ugc2VlIGhlcmU/IFNvbWUgYXNzZXJ0aW9ucywgYW5kIHRoZW4gdGhlIG9ubHkgaW50ZXJlc3RpbmcgbGluZSBpczoKK1xjb2RlCisgIGludGVybmFsOjphc3NpZ25faW1wbDxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+OjpydW4oZGVyaXZlZCgpLG90aGVyLmRlcml2ZWQoKSk7CitcZW5kY29kZQorCitPSyBzbyBub3cgd2Ugd2FudCB0byBrbm93IHdoYXQgaXMgaW5zaWRlIGludGVybmFsOjphc3NpZ25faW1wbC4KKworSGVyZSBpcyBpdHMgZGVjbGFyYXRpb246CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLAorICAgICAgICAgaW50IFZlY3Rvcml6YXRpb24gPSBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEZXJpdmVkMSwgRGVyaXZlZDI+OjpWZWN0b3JpemF0aW9uLAorICAgICAgICAgaW50IFVucm9sbGluZyA9IGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQxLCBEZXJpdmVkMj46OlVucm9sbGluZz4KK3N0cnVjdCBpbnRlcm5hbDo6YXNzaWduX2ltcGw7CitcZW5kY29kZQorQWdhaW4sIGludGVybmFsOjphc3NpZ25fc2VsZWN0b3IgdGFrZXMgNCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBidXQgdGhlIDIgbGFzdCBvbmVzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnkgdGhlIDIgZmlyc3Qgb25lcy4KKworVGhlc2UgdHdvIHBhcmFtZXRlcnMgXGEgVmVjdG9yaXphdGlvbiBhbmQgXGEgVW5yb2xsaW5nIGFyZSBkZXRlcm1pbmVkIGJ5IGEgaGVscGVyIGNsYXNzIGludGVybmFsOjphc3NpZ25fdHJhaXRzLiBJdHMgam9iIGlzIHRvIGRldGVybWluZSB3aGljaCB2ZWN0b3JpemF0aW9uIHN0cmF0ZWd5IHRvIHVzZSAodGhhdCBpcyBcYSBWZWN0b3JpemF0aW9uKSBhbmQgd2hpY2ggdW5yb2xsaW5nIHN0cmF0ZWd5IHRvIHVzZSAodGhhdCBpcyBcYSBVbnJvbGxpbmcpLgorCitXZSdsbCBub3QgZW50ZXIgaW50byB0aGUgZGV0YWlscyBvZiBob3cgdGhlc2Ugc3RyYXRlZ2llcyBhcmUgY2hvc2VuICh0aGlzIGlzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcm5hbDo6YXNzaWduX3RyYWl0cyBhdCB0aGUgdG9wIG9mIHRoZSBzYW1lIGZpbGUpLiBMZXQncyBqdXN0IHNheSB0aGF0IGhlcmUgXGEgVmVjdG9yaXphdGlvbiBoYXMgdGhlIHZhbHVlIFxhIExpbmVhclZlY3Rvcml6YXRpb24sIGFuZCBcYSBVbnJvbGxpbmcgaGFzIHRoZSB2YWx1ZSBcYSBOb1Vucm9sbGluZyAodGhlIGxhdHRlciBpcyBvYnZpb3VzIHNpbmNlIG91ciB2ZWN0b3JzIGhhdmUgZHluYW1pYyBzaXplIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIHVucm9sbCB0aGUgbG9vcCBhdCBjb21waWxlLXRpbWUpLgorCitTbyB0aGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBpbnRlcm5hbDo6YXNzaWduX2ltcGwgdGhhdCB3ZSdyZSBsb29raW5nIGF0IGlzOgorXGNvZGUKK2ludGVybmFsOjphc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIExpbmVhclZlY3Rvcml6YXRpb24sIE5vVW5yb2xsaW5nPgorXGVuZGNvZGUKKworSGVyZSBpcyBob3cgaXQncyBkZWZpbmVkOgorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK3N0cnVjdCBpbnRlcm5hbDo6YXNzaWduX2ltcGw8RGVyaXZlZDEsIERlcml2ZWQyLCBMaW5lYXJWZWN0b3JpemF0aW9uLCBOb1Vucm9sbGluZz4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IGRzdC5zaXplKCk7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czx0eXBlbmFtZSBEZXJpdmVkMTo6U2NhbGFyPjo6c2l6ZTsKKyAgICBjb25zdCBpbnQgYWxpZ25lZFN0YXJ0ID0gaW50ZXJuYWw6OmFzc2lnbl90cmFpdHM8RGVyaXZlZDEsRGVyaXZlZDI+OjpEc3RJc0FsaWduZWQgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludGVybmFsOjpmaXJzdF9hbGlnbmVkKCZkc3QuY29lZmZSZWYoMCksIHNpemUpOworICAgIGNvbnN0IGludCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplLWFsaWduZWRTdGFydCkvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZTsKKworICAgIGZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFsaWduZWRTdGFydDsgaW5kZXgrKykKKyAgICAgIGRzdC5jb3B5Q29lZmYoaW5kZXgsIHNyYyk7CisKKyAgICBmb3IoaW50IGluZGV4ID0gYWxpZ25lZFN0YXJ0OyBpbmRleCA8IGFsaWduZWRFbmQ7IGluZGV4ICs9IHBhY2tldFNpemUpCisgICAgeworICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8RGVyaXZlZDIsIEFsaWduZWQsIGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQxLERlcml2ZWQyPjo6U3JjQWxpZ25tZW50PihpbmRleCwgc3JjKTsKKyAgICB9CisKKyAgICBmb3IoaW50IGluZGV4ID0gYWxpZ25lZEVuZDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQorICAgICAgZHN0LmNvcHlDb2VmZihpbmRleCwgc3JjKTsKKyAgfQorfTsKK1xlbmRjb2RlCisKK0hlcmUncyBob3cgaXQgd29ya3MuIFxhIExpbmVhclZlY3Rvcml6YXRpb24gbWVhbnMgdGhhdCB0aGUgbGVmdC1oYW5kIGFuZCByaWdodC1oYW5kIHNpZGUgZXhwcmVzc2lvbiBjYW4gYmUgYWNjZXNzZWQgbGluZWFybHkgaS5lLiB5b3UgY2FuIHJlZmVyIHRvIHRoZWlyIGNvZWZmaWNpZW50cyBieSBvbmUgaW50ZWdlciBcYSBpbmRleCwgYXMgb3Bwb3NlZCB0byBoYXZpbmcgdG8gcmVmZXIgdG8gaXRzIGNvZWZmaWNpZW50cyBieSB0d28gaW50ZWdlcnMgXGEgcm93LCBcYSBjb2x1bW4uCisKK0FzIHdlIHNhaWQgYXQgdGhlIGJlZ2lubmluZywgdmVjdG9yaXphdGlvbiB3b3JrcyB3aXRoIGJsb2NrcyBvZiA0IGZsb2F0cy4gSGVyZSwgXGEgUGFja2V0U2l6ZSBpcyA0LgorCitUaGVyZSBhcmUgdHdvIHBvdGVudGlhbCBwcm9ibGVtcyB0aGF0IHdlIG5lZWQgdG8gZGVhbCB3aXRoOgorXGxpIGZpcnN0LCB2ZWN0b3JpemF0aW9uIHdvcmtzIG11Y2ggYmV0dGVyIGlmIHRoZSBwYWNrZXRzIGFyZSAxMjgtYml0LWFsaWduZWQuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHdyaXRlIGFjY2Vzcy4gU28gd2hlbiB3cml0aW5nIHRvIHRoZSBjb2VmZmljaWVudHMgb2YgXGEgZHN0LCB3ZSB3YW50IHRvIGdyb3VwIHRoZXNlIGNvZWZmaWNpZW50cyBieSBwYWNrZXRzIG9mIDQgc3VjaCB0aGF0IGVhY2ggb2YgdGhlc2UgcGFja2V0cyBpcyAxMjgtYml0LWFsaWduZWQuIEluIGdlbmVyYWwsIHRoaXMgcmVxdWlyZXMgdG8gc2tpcCBhIGZldyBjb2VmZmljaWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiBcYSBkc3QuIFRoaXMgaXMgdGhlIHB1cnBvc2Ugb2YgXGEgYWxpZ25lZFN0YXJ0LiBXZSB0aGVuIGNvcHkgdGhlc2UgZmlyc3QgZmV3IGNvZWZmaWNpZW50cyBvbmUgYnkgb25lLCBub3QgYnkgcGFja2V0cy4gSG93ZXZlciwgaW4gb3VyIGNhc2UsIHRoZSBcYSBkc3QgZXhwcmVzc2lvbiBpcyBhIFZlY3RvclhmIGFuZCByZW1lbWJlciB0aGF0IGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHZlY3RvcnMgd2UgYWxsb2NhdGVkIGFsaWduZWQgYXJyYXlzLiBUaGFua3MgdG8gXGEgRHN0SXNBbGlnbmVkLCBFaWdlbiByZW1lbWJlcnMgdGhhdCB3aXRob3V0IGhhdmluZyB0byBkbyBhbnkgcnVudGltZSBjaGVjaywgc28gXGEgYWxpZ25lZFN0YXJ0IGlzIHplcm8gYW5kIHRoaXMgcGFydCBpcyBhdm9pZGVkIGFsdG9nZXRoZXIuCitcbGkgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyB0byBjb3B5IGlzIG5vdCBpbiBnZW5lcmFsIGEgbXVsdGlwbGUgb2YgXGEgcGFja2V0U2l6ZS4gSGVyZSwgdGhlcmUgYXJlIDUwIGNvZWZmaWNpZW50cyB0byBjb3B5IGFuZCBcYSBwYWNrZXRTaXplIGlzIDQuIFNvIHdlJ2xsIGhhdmUgdG8gY29weSB0aGUgbGFzdCAyIGNvZWZmaWNpZW50cyBvbmUgYnkgb25lLCBub3QgYnkgcGFja2V0cy4gSGVyZSwgXGEgYWxpZ25lZEVuZCBpcyA0OC4KKworTm93IGNvbWUgdGhlIGFjdHVhbCBsb29wcy4KKworRmlyc3QsIHRoZSB2ZWN0b3JpemVkIHBhcnQ6IHRoZSA0OCBmaXJzdCBjb2VmZmljaWVudHMgb3V0IG9mIDUwIHdpbGwgYmUgY29waWVkIGJ5IHBhY2tldHMgb2YgNDoKK1xjb2RlCisgIGZvcihpbnQgaW5kZXggPSBhbGlnbmVkU3RhcnQ7IGluZGV4IDwgYWxpZ25lZEVuZDsgaW5kZXggKz0gcGFja2V0U2l6ZSkKKyAgeworICAgIGRzdC50ZW1wbGF0ZSBjb3B5UGFja2V0PERlcml2ZWQyLCBBbGlnbmVkLCBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OlNyY0FsaWdubWVudD4oaW5kZXgsIHNyYyk7CisgIH0KK1xlbmRjb2RlCisKK1doYXQgaXMgY29weVBhY2tldD8gSXQgaXMgZGVmaW5lZCBpbiBzcmMvQ29yZS9Db2VmZnMuaDoKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGU+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb3B5UGFja2V0KGludCBpbmRleCwgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICBkZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihpbmRleCwKKyAgICBvdGhlci5kZXJpdmVkKCkudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCkpOworfQorXGVuZGNvZGUKKworT0ssIHdoYXQgYXJlIHdyaXRlUGFja2V0KCkgYW5kIHBhY2tldCgpIGhlcmU/CisKK0ZpcnN0LCB3cml0ZVBhY2tldCgpIGhlcmUgaXMgYSBtZXRob2Qgb24gdGhlIGxlZnQtaGFuZCBzaWRlIFZlY3RvclhmLiBTbyB3ZSBnbyB0byBzcmMvQ29yZS9NYXRyaXguaCB0byBsb29rIGF0IGl0cyBkZWZpbml0aW9uOgorXGNvZGUKK3RlbXBsYXRlPGludCBTdG9yZU1vZGU+CitpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChpbnQgaW5kZXgsIGNvbnN0IFBhY2tldFNjYWxhciYgeCkKK3sKKyAgaW50ZXJuYWw6OnBzdG9yZXQ8U2NhbGFyLCBQYWNrZXRTY2FsYXIsIFN0b3JlTW9kZT4obV9zdG9yYWdlLmRhdGEoKSArIGluZGV4LCB4KTsKK30KK1xlbmRjb2RlCitIZXJlLCBcYSBTdG9yZU1vZGUgaXMgXGEgI0FsaWduZWQsIGluZGljYXRpbmcgdGhhdCB3ZSBhcmUgZG9pbmcgYSAxMjgtYml0LWFsaWduZWQgd3JpdGUgYWNjZXNzLCBcYSBQYWNrZXRTY2FsYXIgaXMgYSB0eXBlIHJlcHJlc2VudGluZyBhICJTU0UgcGFja2V0IG9mIDQgZmxvYXRzIiBhbmQgaW50ZXJuYWw6OnBzdG9yZXQgaXMgYSBmdW5jdGlvbiB3cml0aW5nIHN1Y2ggYSBwYWNrZXQgaW4gbWVtb3J5LiBUaGVpciBkZWZpbml0aW9ucyBhcmUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljLCB3ZSBmaW5kIHRoZW0gaW4gc3JjL0NvcmUvYXJjaC9TU0UvUGFja2V0TWF0aC5oOgorCitUaGUgbGluZSBpbiBzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmggdGhhdCBkZXRlcm1pbmVzIHRoZSBQYWNrZXRTY2FsYXIgdHlwZSAodmlhIGEgdHlwZWRlZiBpbiBNYXRyaXguaCkgaXM6CitcY29kZQordGVtcGxhdGU8PiBzdHJ1Y3QgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+ICB7IHR5cGVkZWYgX19tMTI4ICB0eXBlOyBlbnVtIHtzaXplPTR9OyB9OworXGVuZGNvZGUKK0hlcmUsIF9fbTEyOCBpcyBhIFNTRS1zcGVjaWZpYyB0eXBlLiBOb3RpY2UgdGhhdCB0aGUgZW51bSBcYSBzaXplIGhlcmUgaXMgd2hhdCB3YXMgdXNlZCB0byBkZWZpbmUgXGEgcGFja2V0U2l6ZSBhYm92ZS4KKworQW5kIGhlcmUgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGludGVybmFsOjpwc3RvcmV0OgorXGNvZGUKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgaW50ZXJuYWw6OnBzdG9yZShmbG9hdCogIHRvLCBjb25zdCBfX20xMjgmICBmcm9tKSB7IF9tbV9zdG9yZV9wcyh0bywgZnJvbSk7IH0KK1xlbmRjb2RlCitIZXJlLCBfX21tX3N0b3JlX3BzIGlzIGEgU1NFLXNwZWNpZmljIGludHJpbnNpYyBmdW5jdGlvbiwgcmVwcmVzZW50aW5nIGEgc2luZ2xlIFNTRSBpbnN0cnVjdGlvbi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpbnRlcm5hbDo6cHN0b3JlIGFuZCBpbnRlcm5hbDo6cHN0b3JldCBpcyB0aGF0IGludGVybmFsOjpwc3RvcmV0IGlzIGEgZGlzcGF0Y2hlciBoYW5kbGluZyBib3RoIHRoZSBhbGlnbmVkIGFuZCB1bmFsaWduZWQgY2FzZXMsIHlvdSBmaW5kIGl0cyBkZWZpbml0aW9uIGluIHNyYy9Db3JlL0dlbmVyaWNQYWNrZXRNYXRoLmg6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK2lubGluZSB2b2lkIGludGVybmFsOjpwc3RvcmV0KFNjYWxhciogdG8sIGNvbnN0IFBhY2tldCYgZnJvbSkKK3sKKyAgaWYoTG9hZE1vZGUgPT0gQWxpZ25lZCkKKyAgICBpbnRlcm5hbDo6cHN0b3JlKHRvLCBmcm9tKTsKKyAgZWxzZQorICAgIGludGVybmFsOjpwc3RvcmV1KHRvLCBmcm9tKTsKK30KK1xlbmRjb2RlCisKK09LLCB0aGF0IGV4cGxhaW5zIGhvdyB3cml0ZVBhY2tldCgpIHdvcmtzLiBOb3cgbGV0J3MgbG9vayBpbnRvIHRoZSBwYWNrZXQoKSBjYWxsLiBSZW1lbWJlciB0aGF0IHdlIGFyZSBhbmFseXppbmcgdGhpcyBsaW5lIG9mIGNvZGUgaW5zaWRlIGNvcHlQYWNrZXQoKToKK1xjb2RlCitkZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihpbmRleCwKKyAgICBvdGhlci5kZXJpdmVkKCkudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCkpOworXGVuZGNvZGUKKworSGVyZSwgXGEgb3RoZXIgaXMgb3VyIHN1bSBleHByZXNzaW9uIFxhIHYgKyBcYSB3LiBUaGUgLmRlcml2ZWQoKSBpcyBqdXN0IGNhc3RpbmcgZnJvbSBNYXRyaXhCYXNlIHRvIHRoZSBzdWJjbGFzcyB3aGljaCBoZXJlIGlzIEN3aXNlQmluYXJ5T3AuIFNvIGxldCdzIGdvIHRvIHNyYy9Db3JlL0N3aXNlQmluYXJ5T3AuaDoKK1xjb2RlCitjbGFzcyBDd2lzZUJpbmFyeU9wCit7CisgIC8vIC4uLgorICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChpbnQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZnVuY3Rvci5wYWNrZXRPcChtX2xocy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSwgbV9yaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCkpOworICAgIH0KK307CitcZW5kY29kZQorSGVyZSwgXGEgbV9saHMgaXMgdGhlIHZlY3RvciBcYSB2LCBhbmQgXGEgbV9yaHMgaXMgdGhlIHZlY3RvciBcYSB3LiBTbyB0aGUgcGFja2V0KCkgZnVuY3Rpb24gaGVyZSBpcyBNYXRyaXg6OnBhY2tldCgpLiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIExvYWRNb2RlIGlzIFxhICNBbGlnbmVkLiBTbyB3ZSdyZSBsb29raW5nIGF0CitcY29kZQorY2xhc3MgTWF0cml4Cit7CisgIC8vIC4uLgorICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChpbnQgaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8U2NhbGFyLCBMb2FkTW9kZT4obV9zdG9yYWdlLmRhdGEoKSArIGluZGV4KTsKKyAgICB9Cit9OworXGVuZGNvZGUKK1dlIGxldCB5b3UgbG9vayB1cCB0aGUgZGVmaW5pdGlvbiBvZiBpbnRlcm5hbDo6cGxvYWR0IGluIEdlbmVyaWNQYWNrZXRNYXRoLmggYW5kIHRoZSBpbnRlcm5hbDo6cGxvYWQgaW4gc3JjL0NvcmUvYXJjaC9TU0UvUGFja2V0TWF0aC5oLiBJdCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGFib3ZlIGZvciBpbnRlcm5hbDo6cHN0b3JlLgorCitMZXQncyBnbyBiYWNrIHRvIEN3aXNlQmluYXJ5T3A6OnBhY2tldCgpLiBPbmNlIHRoZSBwYWNrZXRzIGZyb20gdGhlIHZlY3RvcnMgXGEgdiBhbmQgXGEgdyBoYXZlIGJlZW4gcmV0dXJuZWQsIHdoYXQgZG9lcyB0aGlzIGZ1bmN0aW9uIGRvPyBJdCBjYWxscyBtX2Z1bmN0b3IucGFja2V0T3AoKSBvbiB0aGVtLiBXaGF0IGlzIG1fZnVuY3Rvcj8gSGVyZSB3ZSBtdXN0IHJlbWVtYmVyIHdoYXQgcGFydGljdWxhciB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvZiBDd2lzZUJpbmFyeU9wIHdlJ3JlIGRlYWxpbmcgd2l0aDoKK1xjb2RlCitDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPGZsb2F0PiwgVmVjdG9yWGYsIFZlY3RvclhmPgorXGVuZGNvZGUKK1NvIG1fZnVuY3RvciBpcyBhbiBvYmplY3Qgb2YgdGhlIGVtcHR5IGNsYXNzIGludGVybmFsOjpzY2FsYXJfc3VtX29wPGZsb2F0Pi4gQXMgd2UgbWVudGlvbmVkIGFib3ZlLCBkb24ndCB3b3JyeSBhYm91dCB3aHkgd2UgY29uc3RydWN0ZWQgYW4gb2JqZWN0IG9mIHRoaXMgZW1wdHkgY2xhc3MgYXQgYWxsIC0tIGl0J3MgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGUgcG9pbnQgaXMgdGhhdCBzb21lIG90aGVyIGZ1bmN0b3JzIG5lZWQgdG8gc3RvcmUgbWVtYmVyIGRhdGEuCisKK0FueXdheSwgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3AgaXMgZGVmaW5lZCBpbiBzcmMvQ29yZS9GdW5jdG9ycy5oOgorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGludGVybmFsOjpzY2FsYXJfc3VtX29wIEVJR0VOX0VNUFRZX1NUUlVDVCB7CisgIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgKyBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldFNjYWxhcj4KKyAgaW5saW5lIGNvbnN0IFBhY2tldFNjYWxhciBwYWNrZXRPcChjb25zdCBQYWNrZXRTY2FsYXImIGEsIGNvbnN0IFBhY2tldFNjYWxhciYgYikgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBhZGQoYSxiKTsgfQorfTsKK1xlbmRjb2RlCitBcyB5b3UgY2FuIHNlZSwgYWxsIHdoYXQgcGFja2V0T3AoKSBkb2VzIGlzIHRvIGNhbGwgaW50ZXJuYWw6OnBhZGQgb24gdGhlIHR3byBwYWNrZXRzLiBIZXJlIGlzIHRoZSBkZWZpbml0aW9uIG9mIGludGVybmFsOjpwYWRkIGZyb20gc3JjL0NvcmUvYXJjaC9TU0UvUGFja2V0TWF0aC5oOgorXGNvZGUKK3RlbXBsYXRlPD4gaW5saW5lIF9fbTEyOCAgaW50ZXJuYWw6OnBhZGQoY29uc3QgX19tMTI4JiAgYSwgY29uc3QgX19tMTI4JiAgYikgeyByZXR1cm4gX21tX2FkZF9wcyhhLGIpOyB9CitcZW5kY29kZQorSGVyZSwgX21tX2FkZF9wcyBpcyBhIFNTRS1zcGVjaWZpYyBpbnRyaW5zaWMgZnVuY3Rpb24sIHJlcHJlc2VudGluZyBhIHNpbmdsZSBTU0UgaW5zdHJ1Y3Rpb24uCisKK1RvIHN1bW1hcml6ZSwgdGhlIGxvb3AKK1xjb2RlCisgIGZvcihpbnQgaW5kZXggPSBhbGlnbmVkU3RhcnQ7IGluZGV4IDwgYWxpZ25lZEVuZDsgaW5kZXggKz0gcGFja2V0U2l6ZSkKKyAgeworICAgIGRzdC50ZW1wbGF0ZSBjb3B5UGFja2V0PERlcml2ZWQyLCBBbGlnbmVkLCBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OlNyY0FsaWdubWVudD4oaW5kZXgsIHNyYyk7CisgIH0KK1xlbmRjb2RlCitoYXMgYmVlbiBjb21waWxlZCB0byB0aGUgZm9sbG93aW5nIGNvZGU6IGZvciBcYSBpbmRleCBnb2luZyBmcm9tIDAgdG8gdGhlIDExICggPSA0OC80IC0gMSksIHJlYWQgdGhlIGktdGggcGFja2V0IChvZiA0IGZsb2F0cykgZnJvbSB0aGUgdmVjdG9yIHYgYW5kIHRoZSBpLXRoIHBhY2tldCBmcm9tIHRoZSB2ZWN0b3IgdyB1c2luZyB0d28gX19tbV9sb2FkX3BzIFNTRSBpbnN0cnVjdGlvbnMsIHRoZW4gYWRkIHRoZW0gdG9nZXRoZXIgdXNpbmcgYSBfX21tX2FkZF9wcyBpbnN0cnVjdGlvbiwgdGhlbiBzdG9yZSB0aGUgcmVzdWx0IHVzaW5nIGEgX19tbV9zdG9yZV9wcyBpbnN0cnVjdGlvbi4KKworVGhlcmUgcmVtYWlucyB0aGUgc2Vjb25kIGxvb3AgaGFuZGxpbmcgdGhlIGxhc3QgZmV3IChoZXJlLCB0aGUgbGFzdCAyKSBjb2VmZmljaWVudHM6CitcY29kZQorICBmb3IoaW50IGluZGV4ID0gYWxpZ25lZEVuZDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQorICAgIGRzdC5jb3B5Q29lZmYoaW5kZXgsIHNyYyk7CitcZW5kY29kZQorSG93ZXZlciwgaXQgd29ya3MganVzdCBsaWtlIHRoZSBvbmUgd2UganVzdCBleHBsYWluZWQsIGl0IGlzIGp1c3Qgc2ltcGxlciBiZWNhdXNlIHRoZXJlIGlzIG5vIFNTRSB2ZWN0b3JpemF0aW9uIGludm9sdmVkIGhlcmUuIGNvcHlQYWNrZXQoKSBiZWNvbWVzIGNvcHlDb2VmZigpLCBwYWNrZXQoKSBiZWNvbWVzIGNvZWZmKCksIHdyaXRlUGFja2V0KCkgYmVjb21lcyBjb2VmZlJlZigpLiBJZiB5b3UgZm9sbG93ZWQgdXMgdGhpcyBmYXIsIHlvdSBjYW4gcHJvYmFibHkgdW5kZXJzdGFuZCB0aGlzIHBhcnQgYnkgeW91cnNlbGYuCisKK1dlIHNlZSB0aGF0IGFsbCB0aGUgQysrIGFic3RyYWN0aW9uIG9mIEVpZ2VuIGdvZXMgYXdheSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHRoYXQgd2UgaW5kZWVkIGFyZSBwcmVjaXNlbHkgY29udHJvbGxpbmcgd2hpY2ggYXNzZW1ibHkgaW5zdHJ1Y3Rpb25zIHdlIGVtaXQuIFN1Y2ggaXMgdGhlIGJlYXV0eSBvZiBDKyshIFNpbmNlIHdlIGhhdmUgc3VjaCBwcmVjaXNlIGNvbnRyb2wgb3ZlciB0aGUgZW1pdHRlZCBhc3NlbWJseSBpbnN0cnVjdGlvbnMsIGJ1dCBzdWNoIGNvbXBsZXggbG9naWMgdG8gY2hvb3NlIHRoZSByaWdodCBpbnN0cnVjdGlvbnMsIHdlIGNhbiBzYXkgdGhhdCBFaWdlbiByZWFsbHkgYmVoYXZlcyBsaWtlIGFuIG9wdGltaXppbmcgY29tcGlsZXIuIElmIHlvdSBwcmVmZXIsIHlvdSBjb3VsZCBzYXkgdGhhdCBFaWdlbiBiZWhhdmVzIGxpa2UgYSBzY3JpcHQgZm9yIHRoZSBjb21waWxlci4gSW4gYSBzZW5zZSwgQysrIHRlbXBsYXRlIG1ldGFwcm9ncmFtbWluZyBpcyBzY3JpcHRpbmcgdGhlIGNvbXBpbGVyIC0tIGFuZCBpdCdzIGJlZW4gc2hvd24gdGhhdCB0aGlzIHNjcmlwdGluZyBsYW5ndWFnZSBpcyBUdXJpbmctY29tcGxldGUuIFNlZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlbXBsYXRlX21ldGFwcm9ncmFtbWluZyI+IFdpa2lwZWRpYTwvYT4uCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9MZWFzdFNxdWFyZXMuZG94IGIvZG9jL0xlYXN0U3F1YXJlcy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxOTFhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9MZWFzdFNxdWFyZXMuZG94CkBAIC0wLDAgKzEsNzAgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIExlYXN0U3F1YXJlcyBTb2x2aW5nIGxpbmVhciBsZWFzdCBzcXVhcmVzIHN5c3RlbXMKKworVGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdG8gc29sdmUgbGluZWFyIGxlYXN0IHNxdWFyZXMgc3lzdGVtcyB1c2luZyAlRWlnZW4uIEFuIG92ZXJkZXRlcm1pbmVkIHN5c3RlbQorb2YgZXF1YXRpb25zLCBzYXkgXGEgQXggPSBcYSBiLCBoYXMgbm8gc29sdXRpb25zLiBJbiB0aGlzIGNhc2UsIGl0IG1ha2VzIHNlbnNlIHRvIHNlYXJjaCBmb3IgdGhlCit2ZWN0b3IgXGEgeCB3aGljaCBpcyBjbG9zZXN0IHRvIGJlaW5nIGEgc29sdXRpb24sIGluIHRoZSBzZW5zZSB0aGF0IHRoZSBkaWZmZXJlbmNlIFxhIEF4IC0gXGEgYiBpcworYXMgc21hbGwgYXMgcG9zc2libGUuIFRoaXMgXGEgeCBpcyBjYWxsZWQgdGhlIGxlYXN0IHNxdWFyZSBzb2x1dGlvbiAoaWYgdGhlIEV1Y2xpZGVhbiBub3JtIGlzIHVzZWQpLgorCitUaGUgdGhyZWUgbWV0aG9kcyBkaXNjdXNzZWQgb24gdGhpcyBwYWdlIGFyZSB0aGUgU1ZEIGRlY29tcG9zaXRpb24sIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGFuZCBub3JtYWwKK2VxdWF0aW9ucy4gT2YgdGhlc2UsIHRoZSBTVkQgZGVjb21wb3NpdGlvbiBpcyBnZW5lcmFsbHkgdGhlIG1vc3QgYWNjdXJhdGUgYnV0IHRoZSBzbG93ZXN0LCBub3JtYWwKK2VxdWF0aW9ucyBpcyB0aGUgZmFzdGVzdCBidXQgbGVhc3QgYWNjdXJhdGUsIGFuZCB0aGUgUVIgZGVjb21wb3NpdGlvbiBpcyBpbiBiZXR3ZWVuLgorCitcZWlnZW5BdXRvVG9jCisKKworXHNlY3Rpb24gTGVhc3RTcXVhcmVzU1ZEIFVzaW5nIHRoZSBTVkQgZGVjb21wb3NpdGlvbgorCitUaGUgXGxpbmsgSmFjb2JpU1ZEOjpzb2x2ZSgpIHNvbHZlKCkgXGVuZGxpbmsgbWV0aG9kIGluIHRoZSBKYWNvYmlTVkQgY2xhc3MgY2FuIGJlIGRpcmVjdGx5IHVzZWQgdG8KK3NvbHZlIGxpbmVhciBzcXVhcmVzIHN5c3RlbXMuIEl0IGlzIG5vdCBlbm91Z2ggdG8gY29tcHV0ZSBvbmx5IHRoZSBzaW5ndWxhciB2YWx1ZXMgKHRoZSBkZWZhdWx0IGZvcgordGhpcyBjbGFzcyk7IHlvdSBhbHNvIG5lZWQgdGhlIHNpbmd1bGFyIHZlY3RvcnMgYnV0IHRoZSB0aGluIFNWRCBkZWNvbXBvc2l0aW9uIHN1ZmZpY2VzIGZvcgorY29tcHV0aW5nIGxlYXN0IHNxdWFyZXMgc29sdXRpb25zOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ1NWRFNvbHZlLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnU1ZEU29sdmUub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworVGhpcyBpcyBleGFtcGxlIGZyb20gdGhlIHBhZ2UgXGxpbmsgVHV0b3JpYWxMaW5lYXJBbGdlYnJhIExpbmVhciBhbGdlYnJhIGFuZCBkZWNvbXBvc2l0aW9ucyBcZW5kbGluay4KKworCitcc2VjdGlvbiBMZWFzdFNxdWFyZXNRUiBVc2luZyB0aGUgUVIgZGVjb21wb3NpdGlvbgorCitUaGUgc29sdmUoKSBtZXRob2QgaW4gUVIgZGVjb21wb3NpdGlvbiBjbGFzc2VzIGFsc28gY29tcHV0ZXMgdGhlIGxlYXN0IHNxdWFyZXMgc29sdXRpb24uIFRoZXJlIGFyZQordGhyZWUgUVIgZGVjb21wb3NpdGlvbiBjbGFzc2VzOiBIb3VzZWhvbGRlclFSIChubyBwaXZvdGluZywgc28gZmFzdCBidXQgdW5zdGFibGUpLAorQ29sUGl2SG91c2Vob2xkZXJRUiAoY29sdW1uIHBpdm90aW5nLCB0aHVzIGEgYml0IHNsb3dlciBidXQgbW9yZSBhY2N1cmF0ZSkgYW5kIEZ1bGxQaXZIb3VzZWhvbGRlclFSCisoZnVsbCBwaXZvdGluZywgc28gc2xvd2VzdCBhbmQgbW9zdCBzdGFibGUpLiBIZXJlIGlzIGFuIGV4YW1wbGUgd2l0aCBjb2x1bW4gcGl2b3Rpbmc6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIExlYXN0U3F1YXJlc1FSLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIExlYXN0U3F1YXJlc1FSLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gTGVhc3RTcXVhcmVzTm9ybWFsRXF1YXRpb25zIFVzaW5nIG5vcm1hbCBlcXVhdGlvbnMKKworRmluZGluZyB0aGUgbGVhc3Qgc3F1YXJlcyBzb2x1dGlvbiBvZiBcYSBBeCA9IFxhIGIgaXMgZXF1aXZhbGVudCB0byBzb2x2aW5nIHRoZSBub3JtYWwgZXF1YXRpb24KKzxpPkE8L2k+PHN1cD5UPC9zdXA+PGk+QXg8L2k+ID0gPGk+QTwvaT48c3VwPlQ8L3N1cD48aT5iPC9pPi4gVGhpcyBsZWFkcyB0byB0aGUgZm9sbG93aW5nIGNvZGUKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgTGVhc3RTcXVhcmVzTm9ybWFsRXF1YXRpb25zLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIExlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitJZiB0aGUgbWF0cml4IFxhIEEgaXMgaWxsLWNvbmRpdGlvbmVkLCB0aGVuIHRoaXMgaXMgbm90IGEgZ29vZCBtZXRob2QsIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiBudW1iZXIKK29mIDxpPkE8L2k+PHN1cD5UPC9zdXA+PGk+QTwvaT4gaXMgdGhlIHNxdWFyZSBvZiB0aGUgY29uZGl0aW9uIG51bWJlciBvZiBcYSBBLiBUaGlzIG1lYW5zIHRoYXQgeW91Citsb3NlIHR3aWNlIGFzIG1hbnkgZGlnaXRzIHVzaW5nIG5vcm1hbCBlcXVhdGlvbiB0aGFuIGlmIHlvdSB1c2UgdGhlIG90aGVyIG1ldGhvZHMuCisKKyovCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvTWFudWFsLmRveCBiL2RvYy9NYW51YWwuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmIxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvTWFudWFsLmRveApAQCAtMCwwICsxLDE4OSBAQAorCisvLyBUaGlzIGZpbGUgc3RydXR1cmVzIHBhZ2VzIGFuZCBtb2R1bGVzIGludG8gYSBjb252ZW5pZW50IGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUuCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBVc2VyTWFudWFsX0N1c3RvbWl6aW5nRWlnZW4gRXh0ZW5kaW5nL0N1c3RvbWl6aW5nIEVpZ2VuCisgICVFaWdlbiBjYW4gYmUgZXh0ZW5kZWQgaW4gc2V2ZXJhbCB3YXlzLCBmb3IgaW5zdGFuY2UsIGJ5IGRlZmluaW5nIGdsb2JhbCBtZXRob2RzLCBieSBpbnNlcnRpbmcgY3VzdG9tIG1ldGhvZHMgd2l0aGluIG1haW4gJUVpZ2VuJ3MgY2xhc3NlcyB0aHJvdWdoIHRoZSBccmVmIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucyAicGx1Z2luIiBtZWNoYW5pc20sIGJ5IGFkZGluZyBzdXBwb3J0IHRvIFxyZWYgVG9waWNDdXN0b21pemluZ19DdXN0b21TY2FsYXIgImN1c3RvbSBzY2FsYXIgdHlwZXMiIGV0Yy4gU2VlIGJlbG93IGZvciB0aGUgcmVzcGVjdGl2ZSBzdWItdG9waWNzLgorICAtIFxzdWJwYWdlIFRvcGljQ3VzdG9taXppbmdfUGx1Z2lucworICAtIFxzdWJwYWdlIFRvcGljQ3VzdG9taXppbmdfSW5oZXJpdGluZ01hdHJpeAorICAtIFxzdWJwYWdlIFRvcGljQ3VzdG9taXppbmdfQ3VzdG9tU2NhbGFyCisgIC0gXHN1YnBhZ2UgVG9waWNDdXN0b21pemluZ19OdWxsYXJ5RXhwcgorICAtIFxzdWJwYWdlIFRvcGljTmV3RXhwcmVzc2lvblR5cGUKKyAgXHNhIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzCisqLworCisKKy8qKiBccGFnZSBVc2VyTWFudWFsX0dlbmVyYWxpdGllcyBHZW5lcmFsIHRvcGljcworICAtIFxzdWJwYWdlIEVpZ2VuMlRvRWlnZW4zCisgIC0gXHN1YnBhZ2UgVG9waWNGdW5jdGlvblRha2luZ0VpZ2VuVHlwZXMKKyAgLSBcc3VicGFnZSBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMKKyAgLSBcc3VicGFnZSBUb3BpY0Fzc2VydGlvbnMKKyAgLSBcc3VicGFnZSBUb3BpY011bHRpVGhyZWFkaW5nCisgIC0gXHN1YnBhZ2UgVG9waWNVc2luZ0JsYXNMYXBhY2sKKyAgLSBcc3VicGFnZSBUb3BpY1VzaW5nSW50ZWxNS0wKKyAgLSBcc3VicGFnZSBUb3BpY0NVREEKKyAgLSBcc3VicGFnZSBUb3BpY1BpdGZhbGxzCisgIC0gXHN1YnBhZ2UgVG9waWNUZW1wbGF0ZUtleXdvcmQKKyAgLSBcc3VicGFnZSBVc2VyTWFudWFsX1VuZGVyc3RhbmRpbmdFaWdlbgorICAtIFxzdWJwYWdlIFRvcGljQ01ha2VHdWlkZQorKi8KKworLyoqIFxwYWdlIFVzZXJNYW51YWxfVW5kZXJzdGFuZGluZ0VpZ2VuIFVuZGVyc3RhbmRpbmcgRWlnZW4KKyAgLSBcc3VicGFnZSBUb3BpY0luc2lkZUVpZ2VuRXhhbXBsZQorICAtIFxzdWJwYWdlIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgLSBcc3VicGFnZSBUb3BpY0xhenlFdmFsdWF0aW9uCisqLworCisvKiogXHBhZ2UgVW5jbGFzc2lmaWVkUGFnZXMgVW5jbGFzc2lmaWVkIHBhZ2VzCisgIC0gXHN1YnBhZ2UgVG9waWNSZXNpemluZworICAtIFxzdWJwYWdlIFRvcGljVmVjdG9yaXphdGlvbgorICAtIFxzdWJwYWdlIFRvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzCisgIC0gXHN1YnBhZ2UgVG9waWNTY2FsYXJUeXBlcworICAtIFxzdWJwYWdlIEdldHRpbmdTdGFydGVkCisgIC0gXHN1YnBhZ2UgVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzCisgIC0gXHN1YnBhZ2UgVG9waWNXcml0aW5nRWZmaWNpZW50UHJvZHVjdEV4cHJlc3Npb24KKyAgLSBcc3VicGFnZSBFeHBlcmltZW50YWwKKyovCisKKworLyoqIFxkZWZncm91cCBTdXBwb3J0X21vZHVsZXMgU3VwcG9ydCBtb2R1bGVzCisgICogQ2F0ZWdvcnkgb2YgbW9kdWxlcyB3aGljaCBhZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgbGlicmFyaWVzLgorICAqLworCisKKy8qKiBcZGVmZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fY2hhcHRlciBEZW5zZSBtYXRyaXggYW5kIGFycmF5IG1hbmlwdWxhdGlvbiAqLworLyoqIFxkZWZncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9BbGlnbmVtZW50IEFsaWdubWVudCBpc3N1ZXMgKi8KKy8qKiBcZGVmZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fUmVmZXJlbmNlIFJlZmVyZW5jZSAqLworCisvKiogXGFkZHRvZ3JvdXAgVHV0b3JpYWxNYXRyaXhDbGFzcworICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUdXRvcmlhbE1hdHJpeEFyaXRobWV0aWMKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgVHV0b3JpYWxBcnJheUNsYXNzCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbgorICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZworICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUdXRvcmlhbE1hcENsYXNzCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIFR1dG9yaWFsUmVzaGFwZVNsaWNpbmcKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgVG9waWNBbGlhc2luZworICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUb3BpY1N0b3JhZ2VPcmRlcnMKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9jaGFwdGVyICovCisgICAgCisvKiogXGFkZHRvZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fQWxpZ25lbWVudAorICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUb3BpY1VuYWxpZ25lZEFycmF5QXNzZXJ0CisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fQWxpZ25lbWVudCAqLworLyoqIFxhZGR0b2dyb3VwIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fQWxpZ25lbWVudCAqLworLyoqIFxhZGR0b2dyb3VwIFRvcGljU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fQWxpZ25lbWVudCAqLworLyoqIFxhZGR0b2dyb3VwIFRvcGljU3RsQ29udGFpbmVycworICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX0FsaWduZW1lbnQgKi8KKy8qKiBcYWRkdG9ncm91cCBUb3BpY1Bhc3NpbmdCeVZhbHVlCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fQWxpZ25lbWVudCAqLworLyoqIFxhZGR0b2dyb3VwIFRvcGljV3JvbmdTdGFja0FsaWdubWVudAorICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX0FsaWduZW1lbnQgKi8KKyAgICAKKy8qKiBcYWRkdG9ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9SZWZlcmVuY2UKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9SZWZlcmVuY2UgKi8gIAorLyoqIFxhZGR0b2dyb3VwIEphY29iaV9Nb2R1bGUKKyAgICBcaW5ncm91cCBEZW5zZU1hdHJpeE1hbmlwdWxhdGlvbl9SZWZlcmVuY2UgKi8gCisvKiogXGFkZHRvZ3JvdXAgSG91c2Vob2xkZXJfTW9kdWxlCisgICAgXGluZ3JvdXAgRGVuc2VNYXRyaXhNYW5pcHVsYXRpb25fUmVmZXJlbmNlICovIAorCisvKiogXGFkZHRvZ3JvdXAgQ29lZmZ3aXNlTWF0aEZ1bmN0aW9ucworICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIFF1aWNrUmVmUGFnZQorICAgIFxpbmdyb3VwIERlbnNlTWF0cml4TWFuaXB1bGF0aW9uX2NoYXB0ZXIgKi8KKworCisvKiogXGRlZmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19jaGFwdGVyIERlbnNlIGxpbmVhciBwcm9ibGVtcyBhbmQgZGVjb21wb3NpdGlvbnMgKi8KKy8qKiBcZGVmZ3JvdXAgRGVuc2VMaW5lYXJTb2x2ZXJzX1JlZmVyZW5jZSBSZWZlcmVuY2UgKi8KKworLyoqIFxhZGR0b2dyb3VwIFR1dG9yaWFsTGluZWFyQWxnZWJyYQorICAgIFxpbmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMKKyAgICBcaW5ncm91cCBEZW5zZUxpbmVhclNvbHZlcnNfY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIExlYXN0U3F1YXJlcyAKKyAgICBcaW5ncm91cCBEZW5zZUxpbmVhclNvbHZlcnNfY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIElucGxhY2VEZWNvbXBvc2l0aW9uCisgICAgXGluZ3JvdXAgRGVuc2VMaW5lYXJTb2x2ZXJzX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBEZW5zZURlY29tcG9zaXRpb25CZW5jaG1hcmsKKyAgICBcaW5ncm91cCBEZW5zZUxpbmVhclNvbHZlcnNfY2hhcHRlciAqLworCisvKiogXGFkZHRvZ3JvdXAgRGVuc2VMaW5lYXJTb2x2ZXJzX1JlZmVyZW5jZQorICAgIFxpbmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgQ2hvbGVza3lfTW9kdWxlCisgICAgXGluZ3JvdXAgRGVuc2VMaW5lYXJTb2x2ZXJzX1JlZmVyZW5jZSAqLworLyoqIFxhZGR0b2dyb3VwIExVX01vZHVsZQorICAgIFxpbmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19SZWZlcmVuY2UgKi8KKy8qKiBcYWRkdG9ncm91cCBRUl9Nb2R1bGUKKyAgICBcaW5ncm91cCBEZW5zZUxpbmVhclNvbHZlcnNfUmVmZXJlbmNlICovCisvKiogXGFkZHRvZ3JvdXAgU1ZEX01vZHVsZQorICAgIFxpbmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19SZWZlcmVuY2UqLworLyoqIFxhZGR0b2dyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAgIFxpbmdyb3VwIERlbnNlTGluZWFyU29sdmVyc19SZWZlcmVuY2UgKi8KKworCisKKworLyoqIFxkZWZncm91cCBTcGFyc2VfY2hhcHRlciBTcGFyc2UgbGluZWFyIGFsZ2VicmEgKi8KKy8qKiBcZGVmZ3JvdXAgU3BhcnNlX1JlZmVyZW5jZSBSZWZlcmVuY2UgKi8KKworLyoqIFxhZGR0b2dyb3VwIFR1dG9yaWFsU3BhcnNlCisgICAgXGluZ3JvdXAgU3BhcnNlX2NoYXB0ZXIgKi8KKy8qKiBcYWRkdG9ncm91cCBUb3BpY1NwYXJzZVN5c3RlbXMKKyAgICBcaW5ncm91cCBTcGFyc2VfY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIE1hdHJpeGZyZWVTb2x2ZXJFeGFtcGxlCisgICAgXGluZ3JvdXAgU3BhcnNlX2NoYXB0ZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIFNwYXJzZV9SZWZlcmVuY2UKKyAgICBcaW5ncm91cCBTcGFyc2VfY2hhcHRlciAqLworLyoqIFxhZGR0b2dyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICAgXGluZ3JvdXAgU3BhcnNlX1JlZmVyZW5jZSAqLworLyoqIFxhZGR0b2dyb3VwIE9yZGVyaW5nTWV0aG9kc19Nb2R1bGUKKyAgICBcaW5ncm91cCBTcGFyc2VfUmVmZXJlbmNlICovCisvKiogXGFkZHRvZ3JvdXAgU3BhcnNlQ2hvbGVza3lfTW9kdWxlCisgICAgXGluZ3JvdXAgU3BhcnNlX1JlZmVyZW5jZSAqLworLyoqIFxhZGR0b2dyb3VwIFNwYXJzZUxVX01vZHVsZQorICAgIFxpbmdyb3VwIFNwYXJzZV9SZWZlcmVuY2UgKi8KKy8qKiBcYWRkdG9ncm91cCBTcGFyc2VRUl9Nb2R1bGUKKyAgICBcaW5ncm91cCBTcGFyc2VfUmVmZXJlbmNlICovCisvKiogXGFkZHRvZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgICBcaW5ncm91cCBTcGFyc2VfUmVmZXJlbmNlICovCisvKiogXGFkZHRvZ3JvdXAgU3BhcnNlX01vZHVsZQorICAgIFxpbmdyb3VwIFNwYXJzZV9SZWZlcmVuY2UgKi8KKy8qKiBcYWRkdG9ncm91cCBTdXBwb3J0X21vZHVsZXMKKyAgICBcaW5ncm91cCBTcGFyc2VfUmVmZXJlbmNlICovICAgIAorCisvKiogXGFkZHRvZ3JvdXAgU3BhcnNlUXVpY2tSZWZQYWdlCisgICAgXGluZ3JvdXAgU3BhcnNlX2NoYXB0ZXIgKi8KKworCisvKiogXGRlZmdyb3VwIEdlb21ldHJ5X2NoYXB0ZXIgR2VvbWV0cnkgKi8KKy8qKiBcZGVmZ3JvdXAgR2VvbWV0cnlfUmVmZXJlbmNlIFJlZmVyZW5jZSAqLworCisvKiogXGFkZHRvZ3JvdXAgVHV0b3JpYWxHZW9tZXRyeQorICAgIFxpbmdyb3VwIEdlb21ldHJ5X2NoYXB0ZXIgKi8KKyAgICAKKy8qKiBcYWRkdG9ncm91cCBHZW9tZXRyeV9SZWZlcmVuY2UKKyAgICBcaW5ncm91cCBHZW9tZXRyeV9jaGFwdGVyICovCisvKiogXGFkZHRvZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICAgXGluZ3JvdXAgR2VvbWV0cnlfUmVmZXJlbmNlICovCisvKiogXGFkZHRvZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICBcaW5ncm91cCBHZW9tZXRyeV9SZWZlcmVuY2UgKi8KKworLyoqIFxpbnRlcm5hbCBcYnJpZWYgTmFtZXNwYWNlIGNvbnRhaW5pbmcgbG93LWxldmVsIHJvdXRpbmVzIGZyb20gdGhlICVFaWdlbiBsaWJyYXJ5LiAqLworbmFtZXNwYWNlIGludGVybmFsIHt9Cit9CmRpZmYgLS1naXQgYS9kb2MvTWF0cml4ZnJlZVNvbHZlckV4YW1wbGUuZG94IGIvZG9jL01hdHJpeGZyZWVTb2x2ZXJFeGFtcGxlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWZhMjkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL01hdHJpeGZyZWVTb2x2ZXJFeGFtcGxlLmRveApAQCAtMCwwICsxLDIwIEBACisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorCitcZWlnZW5NYW51YWxQYWdlIE1hdHJpeGZyZWVTb2x2ZXJFeGFtcGxlIE1hdHJpeC1mcmVlIHNvbHZlcnMKKworSXRlcmF0aXZlIHNvbHZlcnMgc3VjaCBhcyBDb25qdWdhdGVHcmFkaWVudCBhbmQgQmlDR1NUQUIgY2FuIGJlIHVzZWQgaW4gYSBtYXRyaXggZnJlZSBjb250ZXh0LiBUbyB0aGlzIGVuZCwgdXNlciBtdXN0IHByb3ZpZGUgYSB3cmFwcGVyIGNsYXNzIGluaGVyaXRpbmcgRWlnZW5CYXNlPD4gYW5kIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgLSBcYyBJbmRleCBcYyByb3dzKCkgYW5kIFxjIEluZGV4IFxjIGNvbHMoKTogcmV0dXJucyBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyByZXNwZWN0aXZlbHkKKyAtIFxjIG9wZXJhdG9yKiB3aXRoIHlvdXIgdHlwZSBhbmQgYW4gJUVpZ2VuIGRlbnNlIGNvbHVtbiB2ZWN0b3IgKGl0cyBhY3R1YWwgaW1wbGVtZW50YXRpb24gZ29lcyBpbiBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBpbnRlcm5hbDo6Z2VuZXJpY19wcm9kdWN0X2ltcGwgY2xhc3MpCisKK1xjIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPD4gbXVzdCBhbHNvIGJlIHNwZWNpYWxpemVkIGZvciB0aGUgd3JhcHBlciB0eXBlLgorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB3cmFwcGluZyBhbiBFaWdlbjo6U3BhcnNlTWF0cml4OgorXGluY2x1ZGUgbWF0cml4ZnJlZV9jZy5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIG1hdHJpeGZyZWVfY2cub3V0CisKKyovCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvTmV3RXhwcmVzc2lvblR5cGUuZG94IGIvZG9jL05ld0V4cHJlc3Npb25UeXBlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYyNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL05ld0V4cHJlc3Npb25UeXBlLmRveApAQCAtMCwwICsxLDE0MyBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljTmV3RXhwcmVzc2lvblR5cGUgQWRkaW5nIGEgbmV3IGV4cHJlc3Npb24gdHlwZQorCis8IS0tPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMzAlOyBjb2xvcjpyZWQ7IGZvbnQtd2VpZ2h0OiA5MDA7Ij48L3NwYW4+LS0+Citcd2FybmluZworRGlzY2xhaW1lcjogdGhpcyBwYWdlIGlzIHRhaWxvcmVkIHRvIHZlcnkgYWR2YW5jZWQgdXNlcnMgd2hvIGFyZSBub3QgYWZyYWlkIG9mIGRlYWxpbmcgd2l0aCBzb21lICVFaWdlbidzIGludGVybmFsIGFzcGVjdHMuCitJbiBtb3N0IGNhc2VzLCBhIGN1c3RvbSBleHByZXNzaW9uIGNhbiBiZSBhdm9pZGVkIGJ5IGVpdGhlciB1c2luZyBjdXN0b20gXHJlZiBNYXRyaXhCYXNlOjp1bmFyeUV4cHIgInVuYXJ5IiBvciBccmVmIE1hdHJpeEJhc2U6OmJpbmFyeUV4cHIgImJpbmFyeSIgZnVuY3RvcnMsCit3aGlsZSBleHRyZW1lbHkgY29tcGxleCBtYXRyaXggbWFuaXB1bGF0aW9ucyBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBudWxsYXJ5IGZ1bmN0b3JzIGFzIGRlc2NyaWJlZCBpbiB0aGUgXHJlZiBUb3BpY0N1c3RvbWl6aW5nX051bGxhcnlFeHByICJwcmV2aW91cyBwYWdlIi4KKworVGhpcyBwYWdlIGRlc2NyaWJlcyB3aXRoIHRoZSBoZWxwIG9mIGFuIGV4YW1wbGUgaG93IHRvIGltcGxlbWVudCBhIG5ldworbGlnaHQtd2VpZ2h0IGV4cHJlc3Npb24gdHlwZSBpbiAlRWlnZW4uIFRoaXMgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6Cit0aGUgZXhwcmVzc2lvbiB0eXBlIGl0c2VsZiwgYSB0cmFpdHMgY2xhc3MgY29udGFpbmluZyBjb21waWxlLXRpbWUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBleHByZXNzaW9uLCBhbmQgdGhlIGV2YWx1YXRvciBjbGFzcyB3aGljaCBpcwordXNlZCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBhIG1hdHJpeC4KKworXGIgVE8gXGIgRE86IFdyaXRlIGEgcGFnZSBleHBsYWluaW5nIHRoZSBkZXNpZ24sIHdpdGggZGV0YWlscyBvbgordmVjdG9yaXphdGlvbiBldGMuLCBhbmQgcmVmZXIgdG8gdGhhdCBwYWdlIGhlcmUuCisKKworXGVpZ2VuQXV0b1RvYworCitcc2VjdGlvbiBUb3BpY1NldHRpbmcgVGhlIHNldHRpbmcKKworQSBjaXJjdWxhbnQgbWF0cml4IGlzIGEgbWF0cml4IHdoZXJlIGVhY2ggY29sdW1uIGlzIHRoZSBzYW1lIGFzIHRoZQorY29sdW1uIHRvIHRoZSBsZWZ0LCBleGNlcHQgdGhhdCBpdCBpcyBjeWNsaWNhbGx5IHNoaWZ0ZWQgZG93bndhcmRzLgorRm9yIGV4YW1wbGUsIGhlcmUgaXMgYSA0LWJ5LTQgY2lyY3VsYW50IG1hdHJpeDoKK1xmWyBcYmVnaW57Ym1hdHJpeH0gCisgICAgMSAmIDggJiA0ICYgMiBcXCAKKyAgICAyICYgMSAmIDggJiA0IFxcCisgICAgNCAmIDIgJiAxICYgOCBcXAorICAgIDggJiA0ICYgMiAmIDEKK1xlbmR7Ym1hdHJpeH0gXGZdCitBIGNpcmN1bGFudCBtYXRyaXggaXMgdW5pcXVlbHkgZGV0ZXJtaW5lZCBieSBpdHMgZmlyc3QgY29sdW1uLiBXZSB3aXNoCit0byB3cml0ZSBhIGZ1bmN0aW9uIFxjIG1ha2VDaXJjdWxhbnQgd2hpY2gsIGdpdmVuIHRoZSBmaXJzdCBjb2x1bW4sCityZXR1cm5zIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjaXJjdWxhbnQgbWF0cml4LgorCitGb3Igc2ltcGxpY2l0eSwgd2UgcmVzdHJpY3QgdGhlIFxjIG1ha2VDaXJjdWxhbnQgZnVuY3Rpb24gdG8gZGVuc2UKK21hdHJpY2VzLiBJdCBtYXkgbWFrZSBzZW5zZSB0byBhbHNvIGFsbG93IGFycmF5cywgb3Igc3BhcnNlIG1hdHJpY2VzLAorYnV0IHdlIHdpbGwgbm90IGRvIHNvIGhlcmUuIFdlIGFsc28gZG8gbm90IHdhbnQgdG8gc3VwcG9ydAordmVjdG9yaXphdGlvbi4KKworCitcc2VjdGlvbiBUb3BpY1ByZWFtYmxlIEdldHRpbmcgc3RhcnRlZAorCitXZSB3aWxsIHByZXNlbnQgdGhlIGZpbGUgaW1wbGVtZW50aW5nIHRoZSBcYyBtYWtlQ2lyY3VsYW50IGZ1bmN0aW9uCitwYXJ0IGJ5IHBhcnQuIFdlIHN0YXJ0IGJ5IGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzIGFuZAorZm9yd2FyZCBkZWNsYXJpbmcgdGhlIGV4cHJlc3Npb24gY2xhc3MsIHdoaWNoIHdlIHdpbGwgY2FsbAorXGMgQ2lyY3VsYW50LiBUaGUgXGMgbWFrZUNpcmN1bGFudCBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBvYmplY3Qgb2YKK3RoaXMgdHlwZS4gVGhlIGNsYXNzIFxjIENpcmN1bGFudCBpcyBpbiBmYWN0IGEgY2xhc3MgdGVtcGxhdGU7IHRoZQordGVtcGxhdGUgYXJndW1lbnQgXGMgQXJnVHlwZSByZWZlcnMgdG8gdGhlIHR5cGUgb2YgdGhlIHZlY3RvciBwYXNzZWQKK3RvIHRoZSBcYyBtYWtlQ2lyY3VsYW50IGZ1bmN0aW9uLgorCitcaW5jbHVkZSBtYWtlX2NpcmN1bGFudC5jcHAucHJlYW1ibGUKKworCitcc2VjdGlvbiBUb3BpY1RyYWl0cyBUaGUgdHJhaXRzIGNsYXNzCisKK0ZvciBldmVyeSBleHByZXNzaW9uIGNsYXNzIFxjIFgsIHRoZXJlIHNob3VsZCBiZSBhIHRyYWl0cyBjbGFzcyAKK1xjIFRyYWl0czxYPiBpbiB0aGUgXGMgRWlnZW46OmludGVybmFsIG5hbWVzcGFjZSBjb250YWluaW5nCitpbmZvcm1hdGlvbiBhYm91dCBcYyBYIGtub3duIGFzIGNvbXBpbGUgdGltZS4KKworQXMgZXhwbGFpbmVkIGluIFxyZWYgVG9waWNTZXR0aW5nLCB3ZSBkZXNpZ25lZCB0aGUgXGMgQ2lyY3VsYW50CitleHByZXNzaW9uIGNsYXNzIHRvIHJlZmVyIHRvIGRlbnNlIG1hdHJpY2VzLiBUaGUgZW50cmllcyBvZiB0aGUKK2NpcmN1bGFudCBtYXRyaXggaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBlbnRyaWVzIG9mIHRoZSB2ZWN0b3IKK3Bhc3NlZCB0byB0aGUgXGMgbWFrZUNpcmN1bGFudCBmdW5jdGlvbi4gVGhlIHR5cGUgdXNlZCB0byBpbmRleCB0aGUKK2VudHJpZXMgaXMgYWxzbyB0aGUgc2FtZS4gQWdhaW4gZm9yIHNpbXBsaWNpdHksIHdlIHdpbGwgb25seSByZXR1cm4KK2NvbHVtbi1tYWpvciBtYXRyaWNlcy4gRmluYWxseSwgdGhlIGNpcmN1bGFudCBtYXRyaXggaXMgYSBzcXVhcmUKK21hdHJpeCAobnVtYmVyIG9mIHJvd3MgZXF1YWxzIG51bWJlciBvZiBjb2x1bW5zKSwgYW5kIHRoZSBudW1iZXIgb2YKK3Jvd3MgZXF1YWxzIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgY29sdW1uIHZlY3RvciBwYXNzZWQgdG8gdGhlCitcYyBtYWtlQ2lyY3VsYW50IGZ1bmN0aW9uLiBJZiB0aGlzIGlzIGEgZHluYW1pYy1zaXplIHZlY3RvciwgdGhlbiB0aGUKK3NpemUgb2YgdGhlIGNpcmN1bGFudCBtYXRyaXggaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZS4KKworVGhpcyBsZWFkcyB0byB0aGUgZm9sbG93aW5nIGNvZGU6CisKK1xpbmNsdWRlIG1ha2VfY2lyY3VsYW50LmNwcC50cmFpdHMKKworCitcc2VjdGlvbiBUb3BpY0V4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gY2xhc3MKKworVGhlIG5leHQgc3RlcCBpcyB0byBkZWZpbmUgdGhlIGV4cHJlc3Npb24gY2xhc3MgaXRzZWxmLiBJbiBvdXIgY2FzZSwKK3dlIHdhbnQgdG8gaW5oZXJpdCBmcm9tIFxjIE1hdHJpeEJhc2UgaW4gb3JkZXIgdG8gZXhwb3NlIHRoZSBpbnRlcmZhY2UKK2ZvciBkZW5zZSBtYXRyaWNlcy4gSW4gdGhlIGNvbnN0cnVjdG9yLCB3ZSBjaGVjayB0aGF0IHdlIGFyZSBwYXNzZWQgYQorY29sdW1uIHZlY3RvciAoc2VlIFxyZWYgVG9waWNBc3NlcnRpb25zKSBhbmQgd2Ugc3RvcmUgdGhlIHZlY3RvciBmcm9tCit3aGljaCB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQgdGhlIGNpcmN1bGFudCBtYXRyaXggaW4gdGhlIG1lbWJlcgordmFyaWFibGUgXGMgbV9hcmcuIEZpbmFsbHksIHRoZSBleHByZXNzaW9uIGNsYXNzIHNob3VsZCBjb21wdXRlIHRoZQorc2l6ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjaXJjdWxhbnQgbWF0cml4LiBBcyBleHBsYWluZWQgYWJvdmUsIHRoaXMKK2lzIGEgc3F1YXJlIG1hdHJpeCB3aXRoIGFzIG1hbnkgY29sdW1ucyBhcyB0aGUgdmVjdG9yIHVzZWQgdG8KK2NvbnN0cnVjdCB0aGUgbWF0cml4LgorCitcYiBUTyBcYiBETzogV2hhdCBhYm91dCB0aGUgXGMgTmVzdGVkIHR5cGVkZWY/IEl0IHNlZW1zIHRvIGJlCituZWNlc3Nhcnk7IGlzIHRoaXMgb25seSB0ZW1wb3Jhcnk/CisKK1xpbmNsdWRlIG1ha2VfY2lyY3VsYW50LmNwcC5leHByZXNzaW9uCisKKworXHNlY3Rpb24gVG9waWNFdmFsdWF0b3IgVGhlIGV2YWx1YXRvcgorCitUaGUgbGFzdCBiaWcgZnJhZ21lbnQgaW1wbGVtZW50cyB0aGUgZXZhbHVhdG9yIGZvciB0aGUgXGMgQ2lyY3VsYW50CitleHByZXNzaW9uLiBUaGUgZXZhbHVhdG9yIGNvbXB1dGVzIHRoZSBlbnRyaWVzIG9mIHRoZSBjaXJjdWxhbnQKK21hdHJpeDsgdGhpcyBpcyBkb25lIGluIHRoZSBcYyAuY29lZmYoKSBtZW1iZXIgZnVuY3Rpb24uIFRoZSBlbnRyaWVzCithcmUgY29tcHV0ZWQgYnkgZmluZGluZyB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiB0aGUgdmVjdG9yIGZyb20KK3doaWNoIHRoZSBjaXJjdWxhbnQgbWF0cml4IGlzIGNvbnN0cnVjdGVkLiBHZXR0aW5nIHRoaXMgZW50cnkgbWF5CithY3R1YWxseSBiZSBub24tdHJpdmlhbCB3aGVuIHRoZSBjaXJjdWxhbnQgbWF0cml4IGlzIGNvbnN0cnVjdGVkIGZyb20KK2EgdmVjdG9yIHdoaWNoIGlzIGdpdmVuIGJ5IGEgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbiwgc28gd2UgdXNlIHRoZQorZXZhbHVhdG9yIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSB2ZWN0b3IuCisKK1RoZSBcYyBDb2VmZlJlYWRDb3N0IGNvbnN0YW50IHJlY29yZHMgdGhlIGNvc3Qgb2YgY29tcHV0aW5nIGFuIGVudHJ5CitvZiB0aGUgY2lyY3VsYW50IG1hdHJpeDsgd2UgaWdub3JlIHRoZSBpbmRleCBjb21wdXRhdGlvbiBhbmQgc2F5IHRoYXQKK3RoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGNvc3Qgb2YgY29tcHV0aW5nIGFuIGVudHJ5IG9mIHRoZSB2ZWN0b3IgZnJvbQord2hpY2ggdGhlIGNpcmN1bGFudCBtYXRyaXggaXMgY29uc3RydWN0ZWQuCisKK0luIHRoZSBjb25zdHJ1Y3Rvciwgd2Ugc2F2ZSB0aGUgZXZhbHVhdG9yIGZvciB0aGUgY29sdW1uIHZlY3RvciB3aGljaAorZGVmaW5lZCB0aGUgY2lyY3VsYW50IG1hdHJpeC4gV2UgYWxzbyBzYXZlIHRoZSBzaXplIG9mIHRoYXQgdmVjdG9yOworcmVtZW1iZXIgdGhhdCB3ZSBjYW4gcXVlcnkgYW4gZXhwcmVzc2lvbiBvYmplY3QgdG8gZmluZCB0aGUgc2l6ZSBidXQKK25vdCB0aGUgZXZhbHVhdG9yLiAKKworXGluY2x1ZGUgbWFrZV9jaXJjdWxhbnQuY3BwLmV2YWx1YXRvcgorCisKK1xzZWN0aW9uIFRvcGljRW50cnkgVGhlIGVudHJ5IHBvaW50CisKK0FmdGVyIGFsbCB0aGlzLCB0aGUgXGMgbWFrZUNpcmN1bGFudCBmdW5jdGlvbiBpcyB2ZXJ5IHNpbXBsZS4gSXQKK3NpbXBseSBjcmVhdGVzIGFuIGV4cHJlc3Npb24gb2JqZWN0IGFuZCByZXR1cm5zIGl0LgorCitcaW5jbHVkZSBtYWtlX2NpcmN1bGFudC5jcHAuZW50cnkKKworCitcc2VjdGlvbiBUb3BpY01haW4gQSBzaW1wbGUgbWFpbiBmdW5jdGlvbiBmb3IgdGVzdGluZworCitGaW5hbGx5LCBhIHNob3J0IFxjIG1haW4gZnVuY3Rpb24gdGhhdCBzaG93cyBob3cgdGhlIFxjIG1ha2VDaXJjdWxhbnQKK2Z1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCisKK1xpbmNsdWRlIG1ha2VfY2lyY3VsYW50LmNwcC5tYWluCisKK0lmIGFsbCB0aGUgZnJhZ21lbnRzIGFyZSBjb21iaW5lZCwgdGhlIGZvbGxvd2luZyBvdXRwdXQgaXMgcHJvZHVjZWQsCitzaG93aW5nIHRoYXQgdGhlIHByb2dyYW0gd29ya3MgYXMgZXhwZWN0ZWQ6CisKK1xpbmNsdWRlIG1ha2VfY2lyY3VsYW50Lm91dAorCisqLworfQorCmRpZmYgLS1naXQgYS9kb2MvT3ZlcnZpZXcuZG94IGIvZG9jL092ZXJ2aWV3LmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI0OWJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL092ZXJ2aWV3LmRveApAQCAtMCwwICsxLDMwIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXG1haW5wYWdlIG5vdGl0bGUKKworVGhpcyBpcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIEVpZ2VuMy4gWW91IGNhbiA8YSBocmVmPSJlaWdlbi1kb2MudGd6Ij5kb3dubG9hZDwvYT4gaXQgYXMgYSB0Z3ogYXJjaGl2ZSBmb3Igb2ZmbGluZSByZWFkaW5nLgorCitZb3UncmUgYWxyZWFkeSBhbiBFaWdlbjIgdXNlcj8gSGVyZSBpcyBhIFxsaW5rIEVpZ2VuMlRvRWlnZW4zIEVpZ2VuMiB0byBFaWdlbjMgZ3VpZGUgXGVuZGxpbmsgdG8gaGVscCBwb3J0aW5nIHlvdXIgYXBwbGljYXRpb24uCisKK0ZvciBhIGZpcnN0IGNvbnRhY3Qgd2l0aCBFaWdlbiwgdGhlIGJlc3QgcGxhY2UgaXMgdG8gaGF2ZSBhIGxvb2sgYXQgdGhlIFxsaW5rIEdldHRpbmdTdGFydGVkIGdldHRpbmcgc3RhcnRlZCBcZW5kbGluayBwYWdlIHRoYXQgc2hvdyB5b3UgaG93IHRvIHdyaXRlIGFuZCBjb21waWxlIHlvdXIgZmlyc3QgcHJvZ3JhbSB3aXRoIEVpZ2VuLgorCitUaGVuLCB0aGUgXGIgcXVpY2sgXGIgcmVmZXJlbmNlIFxiIHBhZ2VzIGdpdmUgeW91IGEgcXVpdGUgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIEFQSSBpbiBhIHZlcnkgY29uZGVuc2VkIGZvcm1hdCB0aGF0IGlzIHNwZWNpYWxseSB1c2VmdWwgdG8gcmVjYWxsIHRoZSBzeW50YXggb2YgYSBwYXJ0aWN1bGFyIGZlYXR1cmUsIG9yIHRvIGhhdmUgYSBxdWljayBsb29rIGF0IHRoZSBBUEkuIFRoZXkgY3VycmVudGx5IGNvdmVyIHRoZSB0d28gZm9sbG93aW5nIGZlYXR1cmUgc2V0cywgYW5kIG1vcmUgd2lsbCBjb21lIGluIHRoZSBmdXR1cmU6CisgIC0gXGxpbmsgUXVpY2tSZWZQYWdlIFtRdWlja1JlZl0gRGVuc2UgbWF0cml4IGFuZCBhcnJheSBtYW5pcHVsYXRpb25zIFxlbmRsaW5rCisgIC0gXGxpbmsgU3BhcnNlUXVpY2tSZWZQYWdlIFtRdWlja1JlZl0gU3BhcnNlIGxpbmVhciBhbGdlYnJhIFxlbmRsaW5rCisKK1lvdSdyZSBhIE1hdExhYiB1c2VyPyBUaGVyZSBpcyBhbHNvIGEgPGEgaHJlZj0iQXNjaWlRdWlja1JlZmVyZW5jZS50eHQiPnNob3J0IEFTQ0lJIHJlZmVyZW5jZTwvYT4gd2l0aCBNYXRsYWIgdHJhbnNsYXRpb25zLgorICAKK1RoZSBcYiBtYWluIFxiIGRvY3VtZW50YXRpb24gaXMgb3JnYW5pemVkIGludG8gXGVtIGNoYXB0ZXJzIGNvdmVyaW5nIGRpZmZlcmVudCBkb21haW5zIG9mIGZlYXR1cmVzLgorVGhleSBhcmUgdGhlbXNlbHZlcyBjb21wb3NlZCBvZiBcZW0gdXNlciBcZW0gbWFudWFsIHBhZ2VzIGRlc2NyaWJpbmcgdGhlIGRpZmZlcmVudCBmZWF0dXJlcyBpbiBhIGNvbXByZWhlbnNpdmUgd2F5LCBhbmQgXGVtIHJlZmVyZW5jZSBwYWdlcyB0aGF0IGdpdmVzIHlvdSBhY2Nlc3MgdG8gdGhlIEFQSSBkb2N1bWVudGF0aW9uIHRocm91Z2ggdGhlIHJlbGF0ZWQgRWlnZW4ncyBcZW0gbW9kdWxlcyBhbmQgXGVtIGNsYXNzZXMuCisKK1VuZGVyIHRoZSBcc3VicGFnZSBVc2VyTWFudWFsX0N1c3RvbWl6aW5nRWlnZW4gc2VjdGlvbiwgeW91IHdpbGwgZmluZCBkaXNjdXNzaW9ucyBhbmQgZXhhbXBsZXMgb24gZXh0ZW5kaW5nICVFaWdlbidzIGZlYXR1cmVzIGFuZCBzdXBwb3J0aW5nIGN1c3RvbSBzY2FsYXIgdHlwZXMuCisKK1VuZGVyIHRoZSBcc3VicGFnZSBVc2VyTWFudWFsX0dlbmVyYWxpdGllcyBzZWN0aW9uLCB5b3Ugd2lsbCBmaW5kIGRvY3VtZW50YXRpb24gb24gbW9yZSBnZW5lcmFsIHRvcGljcyBzdWNoIGFzIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLCBjb250cm9sbGluZyBhc3NlcnRpb25zLCBtdWx0aS10aHJlYWRpbmcsIE1LTCBzdXBwb3J0LCBzb21lIEVpZ2VuJ3MgaW50ZXJuYWwgaW5zaWdodHMsIGFuZCBtdWNoIG1vcmUuLi4KKworRmluYWxseSwgZG8gbm90IG1pc3MgdGhlIHNlYXJjaCBlbmdpbmUsIHVzZWZ1bCB0byBxdWlja2x5IGdldCB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGdpdmVuIGNsYXNzIG9yIGZ1bmN0aW9uLgorCitXYW50IG1vcmU/IENoZWNrb3V0IHRoZSA8YSBocmVmPSJ1bnN1cHBvcnRlZC9pbmRleC5odG1sIj5cZW0gdW5zdXBwb3J0ZWQgXGVtIG1vZHVsZXMgPC9hPiBkb2N1bWVudGF0aW9uLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvUGFzc2luZ0J5VmFsdWUuZG94IGIvZG9jL1Bhc3NpbmdCeVZhbHVlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRkMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1Bhc3NpbmdCeVZhbHVlLmRveApAQCAtMCwwICsxLDQwIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUb3BpY1Bhc3NpbmdCeVZhbHVlIFBhc3NpbmcgRWlnZW4gb2JqZWN0cyBieSB2YWx1ZSB0byBmdW5jdGlvbnMKKworUGFzc2luZyBvYmplY3RzIGJ5IHZhbHVlIGlzIGFsbW9zdCBhbHdheXMgYSB2ZXJ5IGJhZCBpZGVhIGluIEMrKywgYXMgdGhpcyBtZWFucyB1c2VsZXNzIGNvcGllcywgYW5kIG9uZSBzaG91bGQgcGFzcyB0aGVtIGJ5IHJlZmVyZW5jZSBpbnN0ZWFkLgorCitXaXRoIEVpZ2VuLCB0aGlzIGlzIGV2ZW4gbW9yZSBpbXBvcnRhbnQ6IHBhc3NpbmcgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gb2JqZWN0cyIgYnkgdmFsdWUgaXMgbm90IG9ubHkgaW5lZmZpY2llbnQsIGl0IGNhbiBiZSBpbGxlZ2FsIG9yIG1ha2UgeW91ciBwcm9ncmFtIGNyYXNoISBBbmQgdGhlIHJlYXNvbiBpcyB0aGF0IHRoZXNlIEVpZ2VuIG9iamVjdHMgaGF2ZSBhbGlnbm1lbnQgbW9kaWZpZXJzIHRoYXQgYXJlbid0IHJlc3BlY3RlZCB3aGVuIHRoZXkgYXJlIHBhc3NlZCBieSB2YWx1ZS4KKworU28gZm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gbGlrZSB0aGlzLCB3aGVyZSB2IGlzIHBhc3NlZCBieSB2YWx1ZToKKworXGNvZGUKK3ZvaWQgbXlfZnVuY3Rpb24oRWlnZW46OlZlY3RvcjJkIHYpOworXGVuZGNvZGUKKworbmVlZHMgdG8gYmUgcmV3cml0dGVuIGFzIGZvbGxvd3MsIHBhc3NpbmcgdiBieSByZWZlcmVuY2U6CisKK1xjb2RlCit2b2lkIG15X2Z1bmN0aW9uKGNvbnN0IEVpZ2VuOjpWZWN0b3IyZCYgdik7CitcZW5kY29kZQorCitMaWtld2lzZSBpZiB5b3UgaGF2ZSBhIGNsYXNzIGhhdmluZyBhIEVpZ2VuIG9iamVjdCBhcyBtZW1iZXI6CisKK1xjb2RlCitzdHJ1Y3QgRm9vCit7CisgIEVpZ2VuOjpWZWN0b3IyZCB2OworfTsKK3ZvaWQgbXlfZnVuY3Rpb24oRm9vIHYpOworXGVuZGNvZGUKKworVGhpcyBmdW5jdGlvbiBhbHNvIG5lZWRzIHRvIGJlIHJld3JpdHRlbiBsaWtlIHRoaXM6CitcY29kZQordm9pZCBteV9mdW5jdGlvbihjb25zdCBGb28mIHYpOworXGVuZGNvZGUKKworTm90ZSB0aGF0IG9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBpcyBubyBwcm9ibGVtIHdpdGggZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9QaXRmYWxscy5kb3ggYi9kb2MvUGl0ZmFsbHMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDJlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUGl0ZmFsbHMuZG94CkBAIC0wLDAgKzEsMzggQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1BpdGZhbGxzIENvbW1vbiBwaXRmYWxscworCitcc2VjdGlvbiBUb3BpY1BpdGZhbGxzX3RlbXBsYXRlX2tleXdvcmQgQ29tcGlsYXRpb24gZXJyb3Igd2l0aCB0ZW1wbGF0ZSBtZXRob2RzCisKK1NlZSB0aGlzIFxsaW5rIFRvcGljVGVtcGxhdGVLZXl3b3JkIHBhZ2UgXGVuZGxpbmsuCisKK1xzZWN0aW9uIFRvcGljUGl0ZmFsbHNfYXV0b19rZXl3b3JkIEMrKzExIGFuZCB0aGUgYXV0byBrZXl3b3JkCisKK0luIHNob3J0OiBkbyBub3QgdXNlIHRoZSBhdXRvIGtleXdvcmRzIHdpdGggRWlnZW4ncyBleHByZXNzaW9ucywgdW5sZXNzIHlvdSBhcmUgMTAwJSBzdXJlIGFib3V0IHdoYXQgeW91IGFyZSBkb2luZy4gSW4gcGFydGljdWxhciwgZG8gbm90IHVzZSB0aGUgYXV0byBrZXl3b3JkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGEgTWF0cml4PD4gdHlwZS4gSGVyZSBpcyBhbiBleGFtcGxlOgorCitcY29kZQorTWF0cml4WGQgQSwgQjsKK2F1dG8gQyA9IEEqQjsKK2ZvciguLi4pIHsgLi4uIHcgPSBDICogdjsgIC4uLn0KK1xlbmRjb2RlCisKK0luIHRoaXMgZXhhbXBsZSwgdGhlIHR5cGUgb2YgQyBpcyBub3QgYSBNYXRyaXhYZCBidXQgYW4gYWJzdHJhY3QgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBtYXRyaXggcHJvZHVjdCBhbmQgc3RvcmluZyByZWZlcmVuY2VzIHRvIEEgYW5kIEIuIFRoZXJlZm9yZSwgdGhlIHByb2R1Y3Qgb2YgQSpCIHdpbGwgYmUgY2FycmllZCBvdXQgbXVsdGlwbGUgdGltZXMsIG9uY2UgcGVyIGl0ZXJhdGlvbiBvZiB0aGUgZm9yIGxvb3AuIE1vcmVvdmVyLCBpZiB0aGUgY29lZmZpY2llbnRzIG9mIEEgb3IgQiBjaGFuZ2UgZHVyaW5nIHRoZSBpdGVyYXRpb24sIHRoZW4gQyB3aWxsIGV2YWx1YXRlIHRvIGRpZmZlcmVudCB2YWx1ZXMuCisKK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlIGxlYWRpbmcgdG8gYSBzZWdmYXVsdDoKK1xjb2RlCithdXRvIEMgPSAoKEErQikuZXZhbCgpKS50cmFuc3Bvc2UoKTsKKy8vIGRvIHNvbWV0aGluZyB3aXRoIEMKK1xlbmRjb2RlCitUaGUgcHJvYmxlbSBpcyB0aGF0IGV2YWwoKSByZXR1cm5zIGEgdGVtcG9yYXJ5IG9iamVjdCAoaW4gdGhpcyBjYXNlIGEgTWF0cml4WGQpIHdoaWNoIGlzIHRoZW4gcmVmZXJlbmNlZCBieSB0aGUgVHJhbnNwb3NlPD4gZXhwcmVzc2lvbi4gSG93ZXZlciwgdGhpcyB0ZW1wb3JhcnkgaXMgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZXJlIHRoZSBDIGV4cHJlc3Npb24gcmVmZXJlbmNlIGEgZGVhZCBvYmplY3QuIFRoZSBzYW1lIGlzc3VlIG1pZ2h0IG9jY3VyIHdoZW4gc3ViIGV4cHJlc3Npb25zIGFyZSBhdXRvbWF0aWNhbGx5IGV2YWx1YXRlZCBieSBFaWdlbiBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CitcY29kZQorVmVjdG9yWGQgdSwgdjsKK2F1dG8gQyA9IHUgKyAoQSp2KS5ub3JtYWxpemVkKCk7CisvLyBkbyBzb21ldGhpbmcgd2l0aCBDCitcZW5kY29kZQord2hlcmUgdGhlIG5vcm1hbGl6ZWQoKSBtZXRob2QgaGFzIHRvIGV2YWx1YXRlIHRoZSBleHBlbnNpdmUgcHJvZHVjdCBBKnYgdG8gYXZvaWQgZXZhbHVhdGluZyBpdCB0d2ljZS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBwZXJmZWN0bHkgZmluZToKK1xjb2RlCithdXRvIEMgPSAodSArIChBKnYpLm5vcm1hbGl6ZWQoKSkuZXZhbCgpOworXGVuZGNvZGUKK0luIHRoaXMgY2FzZSwgQyB3aWxsIGJlIGEgcmVndWxhciBWZWN0b3JYZCBvYmplY3QuCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMuZG94IGIvZG9jL1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUHJlcHJvY2Vzc29yRGlyZWN0aXZlcy5kb3gKQEAgLTAsMCArMSwxNzAgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMgUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMKKworWW91IGNhbiBjb250cm9sIHNvbWUgYXNwZWN0cyBvZiAlRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciB0b2tlbnMgdXNpbmcgXGMgXCNkZWZpbmUuIFRoZXNlIG1hY3Jvcworc2hvdWxkIGJlIGRlZmluZWQgYmVmb3JlIGFueSAlRWlnZW4gaGVhZGVycyBhcmUgaW5jbHVkZWQuIE9mdGVuIHRoZXkgYXJlIGJlc3Qgc2V0IGluIHRoZSBwcm9qZWN0IG9wdGlvbnMuCisKK1RoaXMgcGFnZSBsaXN0cyB0aGUgcHJlcHJvY2Vzc29yIHRva2VucyByZWNvZ25pemVkIGJ5ICVFaWdlbi4KKworXGVpZ2VuQXV0b1RvYworCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc01ham9yIE1hY3JvcyB3aXRoIG1ham9yIGVmZmVjdHMKKworVGhlc2UgbWFjcm9zIGhhdmUgYSBtYWpvciBlZmZlY3QgYW5kIHR5cGljYWxseSBicmVhayB0aGUgQVBJIChBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UpIGFuZC9vciB0aGUKK0FCSSAoQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSkuIFRoaXMgY2FuIGJlIHJhdGhlciBkYW5nZXJvdXM6IGlmIHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSBhcmUgY29tcGlsZWQgd2l0aAorb25lIG9wdGlvbiwgYW5kIG90aGVyIHBhcnRzIChvciBsaWJyYXJpZXMgdGhhdCB5b3UgdXNlKSBhcmUgY29tcGlsZWQgd2l0aCBhbm90aGVyIG9wdGlvbiwgeW91ciBwcm9ncmFtIG1heQorZmFpbCB0byBsaW5rIG9yIGV4aGliaXQgc3VidGxlIGJ1Z3MuIE5ldmVydGhlbGVzcywgdGhlc2Ugb3B0aW9ucyBjYW4gYmUgdXNlZnVsIGZvciBwZW9wbGUgd2hvIGtub3cgd2hhdCB0aGV5CithcmUgZG9pbmcuCisKKyAtIFxiIEVJR0VOMl9TVVBQT1JUIGFuZCBcYiBFSUdFTjJfU1VQUE9SVF9TVEFHRW5uX3h4eCBhcmUgZGlzYWJsZWQgc3RhcnRpbmcgZnJvbSB0aGUgMy4zIHJlbGVhc2UuCisgICBEZWZpbmluZyBvbmUgb2YgdGhlc2Ugd2lsbCByYWlzZSBhIGNvbXBpbGUtZXJyb3IuIElmIHlvdSBuZWVkIHRvIGNvbXBpbGUgRWlnZW4yIGNvZGUsCisgICA8YSBocmVmPSJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9pbmRleC5waHA/dGl0bGU9RWlnZW4yIj5jaGVjayB0aGlzIHNpdGU8L2E+LgorIC0gXGIgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIC0gdGhlIHR5cGUgZm9yIGNvbHVtbiBhbmQgcm93IGluZGljZXMgaW4gbWF0cmljZXMsIHZlY3RvcnMgYW5kIGFycmF5CisgICAoRGVuc2VCYXNlOjpJbmRleCkuIFNldCB0byBcYyBzdGQ6OnB0cmRpZmZfdCBieSBkZWZhdWx0LgorIC0gXGIgRUlHRU5fREVGQVVMVF9JT19GT1JNQVQgLSB0aGUgSU9Gb3JtYXQgdG8gdXNlIHdoZW4gcHJpbnRpbmcgYSBtYXRyaXggaWYgbm8gJUlPRm9ybWF0IGlzIHNwZWNpZmllZC4KKyAgIERlZmF1bHRzIHRvIHRoZSAlSU9Gb3JtYXQgY29uc3RydWN0ZWQgYnkgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgSU9Gb3JtYXQ6OklPRm9ybWF0KCkuCisgLSBcYiBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8gLSBpZiBkZWZpbmVkLCBhbGwgZW50cmllcyBvZiBuZXdseSBjb25zdHJ1Y3RlZCBtYXRyaWNlcyBhbmQgYXJyYXlzIGFyZQorICAgaW5pdGlhbGl6ZWQgdG8gemVybywgYXMgYXJlIG5ldyBlbnRyaWVzIGluIG1hdHJpY2VzIGFuZCBhcnJheXMgYWZ0ZXIgcmVzaXppbmcuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgICBcd2FybmluZyBUaGUgdW5hcnkgKHJlc3AuIGJpbmFyeSkgY29uc3RydWN0b3Igb2YgXGMgMXgxIChyZXNwLiBcYyAyeDEgb3IgXGMgMXgyKSBmaXhlZCBzaXplIG1hdHJpY2VzIGlzCisgICBhbHdheXMgaW50ZXJwcmV0ZWQgYXMgYW4gaW5pdGlhbGl6YXRpb24gY29uc3RydWN0b3Igd2hlcmUgdGhlIGFyZ3VtZW50KHMpIGFyZSB0aGUgY29lZmZpY2llbnQgdmFsdWVzCisgICBhbmQgbm90IHRoZSBzaXplcy4gRm9yIGluc3RhbmNlLCBcY29kZSBWZWN0b3IyZCB2KDIsMSk7IFxlbmRjb2RlIHdpbGwgY3JlYXRlIGEgdmVjdG9yIHdpdGggY29lZmljaWVudHMgWzIsMV0sCisgICBhbmQgXGIgbm90IGEgXGMgMngxIHZlY3RvciBpbml0aWFsaXplZCB3aXRoIHplcm9zIChpLmUuLCBbMCwwXSkuIElmIHN1Y2ggY2FzZXMgbWlnaHQgb2NjdXIsIHRoZW4gaXQgaXMKKyAgIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIGEgZXhwbGljaXQgY2FsbCB0byByZXNpemU6CisgICBcY29kZQorICAgTWF0cml4PD8sU2l6ZUF0Q29tcGlsZVRpbWUsMT4gdjsKKyAgIHYucmVzaXplKHNpemUpOworICAgTWF0cml4PD8sUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWU+IG07CisgICBtLnJlc2l6ZShyb3dzLGNvbHMpOworICAgXGVuZGNvZGUKKyAtIFxiIEVJR0VOX0lOSVRJQUxJWkVfTUFUUklDRVNfQllfTkFOIC0gaWYgZGVmaW5lZCwgYWxsIGVudHJpZXMgb2YgbmV3bHkgY29uc3RydWN0ZWQgbWF0cmljZXMgYW5kIGFycmF5cyBhcmUKKyAgIGluaXRpYWxpemVkIHRvIE5hTiwgYXMgYXJlIG5ldyBlbnRyaWVzIGluIG1hdHJpY2VzIGFuZCBhcnJheXMgYWZ0ZXIgcmVzaXppbmcuIFRoaXMgb3B0aW9uIGlzIGVzcGVjaWFsbHkKKyAgIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2UsIHRob3VnaCBhIG1lbW9yeSB0b29sIGxpa2UgPGEgaHJlZj0iaHR0cDovL3ZhbGdyaW5kLm9yZy8iPnZhbGdyaW5kPC9hPiBpcworICAgcHJlZmVyYWJsZS4gTm90IGRlZmluZWQgYnkgZGVmYXVsdC4KKyAgIFx3YXJuaW5nIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBcYyBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8gZm9yIGEgZGlzY3Vzc2lvbiBvbiBhIGxpbWl0YXRpb25zCisgICBvZiB0aGVzZSBtYWNyb3Mgd2hlbiBhcHBsaWVkIHRvIFxjIDF4MSwgXGMgMXgyLCBhbmQgXGMgMngxIGZpeGVkLXNpemUgbWF0cmljZXMuCisgLSBcYiBFSUdFTl9OT19BVVRPTUFUSUNfUkVTSVpJTkcgLSBpZiBkZWZpbmVkLCB0aGUgbWF0cmljZXMgKG9yIGFycmF5cykgb24gYm90aCBzaWRlcyBvZiBhbiBhc3NpZ25tZW50IAorICAgPHR0PmEgPSBiPC90dD4gaGF2ZSB0byBiZSBvZiB0aGUgc2FtZSBzaXplOyBvdGhlcndpc2UsICVFaWdlbiBhdXRvbWF0aWNhbGx5IHJlc2l6ZXMgXGMgYSBzbyB0aGF0IGl0IGlzIG9mCisgICB0aGUgY29ycmVjdCBzaXplLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc0NwcFZlcnNpb24gQysrIHN0YW5kYXJkIGZlYXR1cmVzCisKK0J5IGRlZmF1bHQsICVFaWdlbiBzdHJpdmUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgYW5kIGVuYWJsZSBsYW5nYWdlIGZlYXR1cmVzIGF0IGNvbXBpbGUtdGltZSBiYXNlZCBvbgordGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjb21waWxlci4KKworIC0gXGIgRUlHRU5fTUFYX0NQUF9WRVIgLSBkaXNhYmxlcyB1c2FnZSBvZiBDKysgZmVhdHVyZXMgcmVxdWlyaW5nIGEgdmVyc2lvbiBncmVhdGVyIHRoYW4gRUlHRU5fTUFYX0NQUF9WRVIuCisgICBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAwMywgMTEsIDE0LCAxNywgZXRjLiBJZiBub3QgZGVmaW5lZCAodGhlIGRlZmF1bHQpLCAlRWlnZW4gZW5hYmxlcyBhbGwgZmVhdHVyZXMgc3VwcG9ydGVkCisgICBieSB0aGUgY29tcGlsZXIuCisKK0luZGl2aWR1YWwgZmVhdHVyZXMgY2FuIGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBkZWZpbmluZyB0aGUgZm9sbG93aW5nIHRva2VuIHRvIDAgb3IgMSByZXNwZWN0aXZlbHkuCitGb3IgaW5zdGFuY2UsIG9uZSBtaWdodCBsaW1pdCB0aGUgQysrIHZlcnNpb24gdG8gQysrMDMgYnkgZGVmaW5pbmcgRUlHRU5fTUFYX0NQUF9WRVI9MDMsIGJ1dCBzdGlsbCBlbmFibGUgQzk5IG1hdGgKK2Z1bmN0aW9ucyBieSBkZWZpbmluZyBFSUdFTl9IQVNfQzk5X01BVEg9MS4KKworIC0gXGIgRUlHRU5fSEFTX0M5OV9NQVRIIC0gY29udHJvbHMgdGhlIHVzYWdlIG9mIEM5OSBtYXRoIGZ1bmN0aW9ucyBzdWNoIGFzIGVyZiwgZXJmYywgbGdhbW1hLCBldGMuCisgICBBdXRvbWF0aWMgZGV0ZWN0aW9uIGRpc2FibGVkIGlmIEVJR0VOX01BWF9DUFBfVkVSPDExLgorIC0gXGIgRUlHRU5fSEFTX0NYWDExX01BVEggLSBjb250cm9scyB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc29tZSBmdW5jdGlvbnMgc3VjaCBhcyByb3VuZCwgbG9ncDEsIGlzaW5mLCBpc25hbiwgZXRjLgorICAgQXV0b21hdGljIGRldGVjdGlvbiBkaXNhYmxlZCBpZiBFSUdFTl9NQVhfQ1BQX1ZFUjwxMS4KKyAtIFxiIEVJR0VOX0hBU19SVkFMVUVfUkVGRVJFTkNFUyAtIGRlZmluZXMgd2hldGVociBydmFsdWUgcmVmZXJlbmNlcyBhcmUgc3VwcG9ydGVkCisgICBBdXRvbWF0aWMgZGV0ZWN0aW9uIGRpc2FibGVkIGlmIEVJR0VOX01BWF9DUFBfVkVSPDExLgorIC0gXGIgRUlHRU5fSEFTX1NURF9SRVNVTFRfT0YgLSBkZWZpbmVzIHdoZXRoZXIgc3RkOjpyZXN1bHRfb2YgaXMgc3VwcG9ydGVkCisgICBBdXRvbWF0aWMgZGV0ZWN0aW9uIGRpc2FibGVkIGlmIEVJR0VOX01BWF9DUFBfVkVSPDExLgorIC0gXGIgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUyAtIGRlZmluZXMgd2hldGhlciB2YXJpYWRpYyB0ZW1wbGF0ZXMgYXJlIHN1cHBvcnRlZAorICAgQXV0b21hdGljIGRldGVjdGlvbiBkaXNhYmxlZCBpZiBFSUdFTl9NQVhfQ1BQX1ZFUjwxMS4KKyAtIFxiIEVJR0VOX0hBU19DT05TVEVYUFIgLSBkZWZpbmVzIHdoZXRoZXIgcmVsYXhlZCBjb25zdCBleHByZXNzaW9uIGFyZSBzdXBwb3J0ZWQKKyAgIEF1dG9tYXRpYyBkZXRlY3Rpb24gZGlzYWJsZWQgaWYgRUlHRU5fTUFYX0NQUF9WRVI8MTQuCisgLSBcYiBFSUdFTl9IQVNfQ1hYMTFfQ09OVEFJTkVSUyAtIGRlZmluZXMgd2hldGhlciBTVEwncyBjb250YWluZXJzIGZvbGxvd3MgQysrMTEgc3BlY2lmaWNhdGlvbnMKKyAgIEF1dG9tYXRpYyBkZXRlY3Rpb24gZGlzYWJsZWQgaWYgRUlHRU5fTUFYX0NQUF9WRVI8MTEuCisgLSBcYiBFSUdFTl9IQVNfQ1hYMTFfTk9FWENFUFQgLSBkZWZpbmVzIHdoZXRoZXIgbm9leGNlcHQgaXMgc3VwcG9ydGVkCisgICBBdXRvbWF0aWMgZGV0ZWN0aW9uIGRpc2FibGVkIGlmIEVJR0VOX01BWF9DUFBfVkVSPDExLgorCitcc2VjdGlvbiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNBc3NlcnRpb25zIEFzc2VydGlvbnMKKworVGhlICVFaWdlbiBsaWJyYXJ5IGNvbnRhaW5zIG1hbnkgYXNzZXJ0aW9ucyB0byBndWFyZCBhZ2FpbnN0IHByb2dyYW1taW5nIGVycm9ycywgYm90aCBhdCBjb21waWxlIHRpbWUgYW5kIGF0CitydW4gdGltZS4gSG93ZXZlciwgdGhlc2UgYXNzZXJ0aW9ucyBkbyBjb3N0IHRpbWUgYW5kIGNhbiB0aHVzIGJlIHR1cm5lZCBvZmYuCisKKyAtIFxiIEVJR0VOX05PX0RFQlVHIC0gZGlzYWJsZXMgJUVpZ2VuJ3MgYXNzZXJ0aW9ucyBpZiBkZWZpbmVkLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LCB1bmxlc3MgdGhlCisgICBcYyBOREVCVUcgbWFjcm8gaXMgZGVmaW5lZCAodGhpcyBpcyBhIHN0YW5kYXJkIEMrKyBtYWNybyB3aGljaCBkaXNhYmxlcyBhbGwgYXNzZXJ0cykuIAorIC0gXGIgRUlHRU5fTk9fU1RBVElDX0FTU0VSVCAtIGlmIGRlZmluZWQsIGNvbXBpbGUtdGltZSBzdGF0aWMgYXNzZXJ0aW9ucyBhcmUgcmVwbGFjZWQgYnkgcnVudGltZSBhc3NlcnRpb25zOyAKKyAgIHRoaXMgc2F2ZXMgY29tcGlsYXRpb24gdGltZS4gTm90IGRlZmluZWQgYnkgZGVmYXVsdC4KKyAtIFxiIGVpZ2VuX2Fzc2VydCAtIG1hY3JvIHdpdGggb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCBpbnNpZGUgJUVpZ2VuIGZvciBhc3NlcnRpb25zLiBCeSBkZWZhdWx0LCBpdCBpcworICAgYmFzaWNhbGx5IGRlZmluZWQgdG8gYmUgXGMgYXNzZXJ0LCB3aGljaCBhYm9ydHMgdGhlIHByb2dyYW0gaWYgdGhlIGFzc2VydGlvbiBpcyB2aW9sYXRlZC4gUmVkZWZpbmUgdGhpcworICAgbWFjcm8gaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGVsc2UsIGxpa2UgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorIC0gXGIgRUlHRU5fTVBMMl9PTkxZIC0gZGlzYWJsZSBub24gTVBMMiBjb21wYXRpYmxlIGZlYXR1cmVzLCBvciBpbiBvdGhlciB3b3JkcyBkaXNhYmxlIHRoZSBmZWF0dXJlcyB3aGljaAorICAgYXJlIHN0aWxsIHVuZGVyIHRoZSBMR1BMLgorCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc1BlcmZvcm1hbmNlIEFsaWdubWVudCwgdmVjdG9yaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgdHdlYWtpbmcKKworIC0gXGIgXGMgRUlHRU5fTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAtIENhbiBiZSBzZXQgdG8gMCBvciAxIHRvIHRlbGwgd2hldGhlciBkZWZhdWx0IHN5c3RlbSBcYyBtYWxsb2MgYWxyZWFkeQorICAgcmV0dXJucyBhbGlnbmVkIGJ1ZmZlcnMuIEluIG5vdCBkZWZpbmVkLCB0aGVuIHRoaXMgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBkZWR1Y2VkIGZyb20gdGhlIGNvbXBpbGVyCisgICBhbmQgc3lzdGVtIHByZXByb2Nlc3NvciB0b2tlbnMuCisgLSBcYiBcYyBFSUdFTl9NQVhfQUxJR05fQllURVMgLSBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBvciAwLiBEZWZpbmVzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBtZW1vcnkgYm91bmRhcnkgaW4gYnl0ZXMgb24gd2hpY2ggZHluYW1pY2FsbHkgYW5kIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGRhdGEgbWF5IGJlIGFsaWduZWQgYnkgJUVpZ2VuLiBJZiBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYmFzZWQgb24gYXJjaGl0ZWN0dXJlLCBjb21waWxlciwgYW5kIE9TLgorIFRoaXMgb3B0aW9uIGlzIHR5cGljYWxseSB1c2VkIHRvIGVuZm9yY2UgYmluYXJ5IGNvbXBhdGliaWxpdHkgYmV0d2VlbiBjb2RlL2xpYnJhcmllcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCBTSU1EIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgb25lIG1heSBjb21waWxlIEFWWCBjb2RlIGFuZCBlbmZvcmNlIEFCSSBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgU1NFIGNvZGUgYnkgZGVmaW5pbmcgXGMgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPTE2LiBJbiB0aGUgb3RoZXIgd2F5IHJvdW5kLCBzaW5jZSBieSBkZWZhdWx0IEFWWCBpbXBsaWVzIDMyIGJ5dGVzIGFsaWdubWVudCBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgb25lIGNhbiBjb21waWxlIFNTRSBjb2RlIHRvIGJlIEFCSSBjb21wYXRpYmxlIHdpdGggQVZYIGNvZGUgYnkgZGVmaW5pbmcgXGMgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPTMyLgorIC0gXGIgXGMgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyAtIFNhbWUgYXMgXGMgRUlHRU5fTUFYX0FMSUdOX0JZVEVTIGJ1dCBmb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgZGF0YSBvbmx5LiBCeSBkZWZhdWx0LCBpZiBvbmx5ICBcYyBFSUdFTl9NQVhfQUxJR05fQllURVMgaXMgZGVmaW5lZCwgdGhlbiBcYyBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTID09IFxjIEVJR0VOX01BWF9BTElHTl9CWVRFUywgb3RoZXJ3aXNlIGEgZGVmYXVsdCB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGJhc2VkIG9uIGFyY2hpdGVjdHVyZSwgY29tcGlsZXIsIGFuZCBPUyAoY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFSUdFTl9NQVhfQUxJR05fQllURVMgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHN0YWNrIGFsaWdubWVudCkuCisgTGV0IHVzIGVtcGhhc2l6ZSB0aGF0IFxjIEVJR0VOX01BWF8qX0FMSUdOX0JZVEVTIGRlZmluZSBvbmx5IGEgZGlzZXJhYmxlIHVwcGVyIGJvdW5kLiBJbiBwcmFjdGljZSBkYXRhIGlzIGFsaWduZWQgdG8gbGFyZ2VzdCBwb3dlci1vZi10d28gY29tbW9uIGRpdmlzb3Igb2YgXGMgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyBhbmQgdGhlIHNpemUgb2YgdGhlIGRhdGEsIHN1Y2ggdGhhdCBtZW1vcnkgaXMgbm90IHdhc3RlZC4KKyAtIFxiIFxjIEVJR0VOX0RPTlRfUEFSQUxMRUxJWkUgLSBpZiBkZWZpbmVkLCB0aGlzIGRpc2FibGVzIG11bHRpLXRocmVhZGluZy4gVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIHlvdSBlbmFibGVkIE9wZW5NUC4KKyAgIFNlZSBccmVmIFRvcGljTXVsdGlUaHJlYWRpbmcgZm9yIGRldGFpbHMuCisgLSBcYiBFSUdFTl9ET05UX1ZFQ1RPUklaRSAtIGRpc2FibGVzIGV4cGxpY2l0IHZlY3Rvcml6YXRpb24gd2hlbiBkZWZpbmVkLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LCB1bmxlc3MgCisgICBhbGlnbm1lbnQgaXMgZGlzYWJsZWQgYnkgJUVpZ2VuJ3MgcGxhdGZvcm0gdGVzdCBvciB0aGUgdXNlciBkZWZpbmluZyBcYyBFSUdFTl9ET05UX0FMSUdOLgorIC0gXGIgXGMgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSAtIGRpc2FibGVzL2VuYWJsZXMgdmVjdG9yaXphdGlvbiB3aXRoIHVuYWxpZ25lZCBzdG9yZXMuIERlZmF1bHQgaXMgMSAoZW5hYmxlZCkuCisgICBJZiBzZXQgdG8gMCAoZGlzYWJsZWQpLCB0aGVuIGV4cHJlc3Npb24gZm9yIHdoaWNoIHRoZSBkZXN0aW5hdGlvbiBjYW5ub3QgYmUgYWxpZ25lZCBhcmUgbm90IHZlY3Rvcml6ZWQgKGUuZy4sIHVuYWxpZ25lZAorICAgc21hbGwgZml4ZWQgc2l6ZSB2ZWN0b3JzIG9yIG1hdHJpY2VzKQorIC0gXGIgXGMgRUlHRU5fRkFTVF9NQVRIIC0gZW5hYmxlcyBzb21lIG9wdGltaXphdGlvbnMgd2hpY2ggbWlnaHQgYWZmZWN0IHRoZSBhY2N1cmFjeSBvZiB0aGUgcmVzdWx0LiBUaGlzIGN1cnJlbnRseQorICAgZW5hYmxlcyB0aGUgU1NFIHZlY3Rvcml6YXRpb24gb2Ygc2luKCkgYW5kIGNvcygpLCBhbmQgc3BlZWR1cHMgc3FydCgpIGZvciBzaW5nbGUgcHJlY2lzaW9uLiBEZWZpbmVkIHRvIDEgYnkgZGVmYXVsdC4KKyAgIERlZmluZSBpdCB0byAwIHRvIGRpc2FibGUuCisgLSBcYiBcYyBFSUdFTl9VTlJPTExJTkdfTElNSVQgLSBkZWZpbmVzIHRoZSBzaXplIG9mIGEgbG9vcCB0byBlbmFibGUgbWV0YSB1bnJvbGxpbmcuIFNldCBpdCB0byB6ZXJvIHRvIGRpc2FibGUKKyAgIHVucm9sbGluZy4gVGhlIHNpemUgb2YgYSBsb29wIGhlcmUgaXMgZXhwcmVzc2VkIGluICVFaWdlbidzIG93biBub3Rpb24gb2YgIm51bWJlciBvZiBGTE9QUyIsIGl0IGRvZXMgbm90CisgICBjb3JyZXNwb25kIHRvIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvciB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gVGhlIGRlZmF1bHQgaXMgdmFsdWUgMTAwLgorIC0gXGIgXGMgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCAtIGRlZmluZXMgdGhlIG1heGltdW0gYnl0ZXMgZm9yIGEgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIEZvciBpbnRlcm5hbAorICAgdGVtcG9yYXJ5IGJ1ZmZlcnMsIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaXMgZW1wbG95ZWQgYXMgYSBmYWxsIGJhY2suIEZvciBmaXhlZC1zaXplIG1hdHJpY2VzIG9yIGFycmF5cywgZXhjZWVkaW5nCisgICB0aGlzIHRocmVzaG9sZCByYWlzZXMgYSBjb21waWxlIHRpbWUgYXNzZXJ0aW9uLiBVc2UgMCB0byBzZXQgbm8gbGltaXQuIERlZmF1bHQgaXMgMTI4IEtCLgorCisKKyAtIFxjIEVJR0VOX0RPTlRfQUxJR04gLSBEZXByZWNhdGVkLCBpdCBpcyBhIHN5bm9ueW0gZm9yIFxjIEVJR0VOX01BWF9BTElHTl9CWVRFUz0wLiBJdCBkaXNhYmxlcyBhbGlnbm1lbnQgY29tcGxldGVseS4gJUVpZ2VuIHdpbGwgbm90IHRyeSB0byBhbGlnbiBpdHMgb2JqZWN0cyBhbmQgZG9lcyBub3QgZXhwZWN0IHRoYXQgYW55IG9iamVjdHMgcGFzc2VkIHRvIGl0IGFyZSBhbGlnbmVkLiBUaGlzIHdpbGwgdHVybiBvZmYgdmVjdG9yaXphdGlvbiBpZiBcYiBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFPTEuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgLSBcYyBFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkgLSBEZXByZWNhdGVkLCBpdCBpcyBhIHN5bm9ueW0gZm9yIFxjIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM9MC4gSXQgZGlzYWJsZXMgYWxpZ25tZW50IG9mIGFycmF5cyBvbiB0aGUgc3RhY2suIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQsIHVubGVzcyBcYyBFSUdFTl9ET05UX0FMSUdOIGlzIGRlZmluZWQuCisKKworXHNlY3Rpb24gVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzUGx1Z2lucyBQbHVnaW5zCisKK0l0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgbWV0aG9kcyB0byBtYW55IGZ1bmRhbWVudGFsIGNsYXNzZXMgaW4gJUVpZ2VuIGJ5IHdyaXRpbmcgYSBwbHVnaW4uIEFzIGV4cGxhaW5lZCBpbgordGhlIHNlY3Rpb24gXHJlZiBUb3BpY0N1c3RvbWl6aW5nX1BsdWdpbnMsIHRoZSBwbHVnaW4gaXMgc3BlY2lmaWVkIGJ5IGRlZmluaW5nIGEgXGMgRUlHRU5feHh4X1BMVUdJTiBtYWNyby4gVGhlCitmb2xsb3dpbmcgbWFjcm9zIGFyZSBzdXBwb3J0ZWQ7IG5vbmUgb2YgdGhlbSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0LgorCisgLSBcYiBFSUdFTl9BUlJBWV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgQXJyYXkgY2xhc3MuCisgLSBcYiBFSUdFTl9BUlJBWUJBU0VfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIEFycmF5QmFzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX0NXSVNFX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgZXh0ZW5kaW5nIHRoZSBDd2lzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX0RFTlNFQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgRGVuc2VCYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fRFlOQU1JQ1NQQVJTRU1BVFJJWF9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgRHluYW1pY1NwYXJzZU1hdHJpeCBjbGFzcy4KKyAtIFxiIEVJR0VOX01BVFJJWF9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgTWF0cml4IGNsYXNzLgorIC0gXGIgRUlHRU5fTUFUUklYQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgTWF0cml4QmFzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX1BMQUlOT0JKRUNUQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgUGxhaW5PYmplY3RCYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fTUFQQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgTWFwQmFzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX1FVQVRFUk5JT05fUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFF1YXRlcm5pb24gY2xhc3MuCisgLSBcYiBFSUdFTl9RVUFURVJOSU9OQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgUXVhdGVybmlvbkJhc2UgY2xhc3MuCisgLSBcYiBFSUdFTl9TUEFSU0VNQVRSSVhfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFNwYXJzZU1hdHJpeCBjbGFzcy4KKyAtIFxiIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFNwYXJzZU1hdHJpeEJhc2UgY2xhc3MuCisgLSBcYiBFSUdFTl9TUEFSU0VWRUNUT1JfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFNwYXJzZVZlY3RvciBjbGFzcy4KKyAtIFxiIEVJR0VOX1RSQU5TRk9STV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgVHJhbnNmb3JtIGNsYXNzLgorIC0gXGIgRUlHRU5fRlVOQ1RPUlNfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBhZGRpbmcgbmV3IGZ1bmN0b3JzIGFuZCBzcGVjaWFsaXphdGlvbnMgb2YgZnVuY3Rvcl90cmFpdHMuCisKKworXHNlY3Rpb24gVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzRGV2ZWxvcGVycyBNYWNyb3MgZm9yIEVpZ2VuIGRldmVsb3BlcnMKKworVGhlc2UgbWFjcm9zIGFyZSBtYWlubHkgbWVhbnQgZm9yIHBlb3BsZSBkZXZlbG9waW5nICVFaWdlbiBhbmQgZm9yIHRlc3RpbmcgcHVycG9zZXMuIEV2ZW4gdGhvdWdoLCB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBmb3IgcG93ZXIgdXNlcnMgYW5kIHRoZSBjdXJpb3VzIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgcHVycG9zZSwgdGhleSBcYiBzaG91bGQgXGIgbm90IFxiIGJlIFxiIHVzZWQgYnkgcmVhbC13b3JkIGNvZGUuCisKKyAtIFxiIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SIC0gd2hlbiBkZWZpbmVkLCB0aGUgZGVmYXVsdCBzdG9yYWdlIG9yZGVyIGZvciBtYXRyaWNlcyBiZWNvbWVzIHJvdy1tYWpvcgorICAgaW5zdGVhZCBvZiBjb2x1bW4tbWFqb3IuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgLSBcYiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcgLSBpZiBkZWZpbmVkLCBlbmFibGVzIGFzc2VydGlvbnMgaW4gJUVpZ2VuJ3MgaW50ZXJuYWwgcm91dGluZXMuIFRoaXMgaXMgdXNlZnVsCisgICBmb3IgZGVidWdnaW5nICVFaWdlbiBpdHNlbGYuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgLSBcYiBFSUdFTl9OT19NQUxMT0MgLSBpZiBkZWZpbmVkLCBhbnkgcmVxdWVzdCBmcm9tIGluc2lkZSB0aGUgJUVpZ2VuIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBoZWFwCisgICByZXN1bHRzIGluIGFuIGFzc2VydGlvbiBmYWlsdXJlLiBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IHNvbWUgcm91dGluZSBkb2VzIG5vdCBhbGxvY2F0ZSBtZW1vcnkKKyAgIGR5bmFtaWNhbGx5LiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorIC0gXGIgRUlHRU5fUlVOVElNRV9OT19NQUxMT0MgLSBpZiBkZWZpbmVkLCBhIG5ldyBzd2l0Y2ggaXMgaW50cm9kdWNlZCB3aGljaCBjYW4gYmUgdHVybmVkIG9uIGFuZCBvZmYgYnkKKyAgIGNhbGxpbmcgPHR0PnNldF9pc19tYWxsb2NfYWxsb3dlZChib29sKTwvdHQ+LiBJZiBtYWxsb2MgaXMgbm90IGFsbG93ZWQgYW5kICVFaWdlbiB0cmllcyB0byBhbGxvY2F0ZSBtZW1vcnkKKyAgIGR5bmFtaWNhbGx5IGFueXdheSwgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgcmVzdWx0cy4gTm90IGRlZmluZWQgYnkgZGVmYXVsdC4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1F1aWNrUmVmZXJlbmNlLmRveCBiL2RvYy9RdWlja1JlZmVyZW5jZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNTQxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9RdWlja1JlZmVyZW5jZS5kb3gKQEAgLTAsMCArMSw3ODUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFF1aWNrUmVmUGFnZSBRdWljayByZWZlcmVuY2UgZ3VpZGUKKworXGVpZ2VuQXV0b1RvYworCis8aHI+CisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT4KK1xzZWN0aW9uIFF1aWNrUmVmX0hlYWRlcnMgTW9kdWxlcyBhbmQgSGVhZGVyIGZpbGVzCisKK1RoZSBFaWdlbiBsaWJyYXJ5IGlzIGRpdmlkZWQgaW4gYSBDb3JlIG1vZHVsZSBhbmQgc2V2ZXJhbCBhZGRpdGlvbmFsIG1vZHVsZXMuIEVhY2ggbW9kdWxlIGhhcyBhIGNvcnJlc3BvbmRpbmcgaGVhZGVyIGZpbGUgd2hpY2ggaGFzIHRvIGJlIGluY2x1ZGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbW9kdWxlLiBUaGUgXGMgJURlbnNlIGFuZCBcYyBFaWdlbiBoZWFkZXIgZmlsZXMgYXJlIHByb3ZpZGVkIHRvIGNvbnZlbmllbnRseSBnYWluIGFjY2VzcyB0byBzZXZlcmFsIG1vZHVsZXMgYXQgb25jZS4KKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5Nb2R1bGU8L3RoPjx0aD5IZWFkZXIgZmlsZTwvdGg+PHRoPkNvbnRlbnRzPC90aD48L3RyPgorPHRyICAgICAgICAgICAgPjx0ZD5cbGluayBDb3JlX01vZHVsZSBDb3JlIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vQ29yZT5cZW5kY29kZTwvdGQ+PHRkPk1hdHJpeCBhbmQgQXJyYXkgY2xhc3NlcywgYmFzaWMgbGluZWFyIGFsZ2VicmEgKGluY2x1ZGluZyB0cmlhbmd1bGFyIGFuZCBzZWxmYWRqb2ludCBwcm9kdWN0cyksIGFycmF5IG1hbmlwdWxhdGlvbjwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGxpbmsgR2VvbWV0cnlfTW9kdWxlIEdlb21ldHJ5IFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+XGVuZGNvZGU8L3RkPjx0ZD5UcmFuc2Zvcm0sIFRyYW5zbGF0aW9uLCBTY2FsaW5nLCBSb3RhdGlvbjJEIGFuZCAzRCByb3RhdGlvbnMgKFF1YXRlcm5pb24sIEFuZ2xlQXhpcyk8L3RkPjwvdHI+Cis8dHIgICAgICAgICAgICA+PHRkPlxsaW5rIExVX01vZHVsZSBMVSBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL0xVPlxlbmRjb2RlPC90ZD48dGQ+SW52ZXJzZSwgZGV0ZXJtaW5hbnQsIExVIGRlY29tcG9zaXRpb25zIHdpdGggc29sdmVyIChGdWxsUGl2TFUsIFBhcnRpYWxQaXZMVSk8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxsaW5rIENob2xlc2t5X01vZHVsZSBDaG9sZXNreSBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PlxlbmRjb2RlPC90ZD48dGQ+TExUIGFuZCBMRExUIENob2xlc2t5IGZhY3Rvcml6YXRpb24gd2l0aCBzb2x2ZXI8L3RkPjwvdHI+Cis8dHIgICAgICAgICAgICA+PHRkPlxsaW5rIEhvdXNlaG9sZGVyX01vZHVsZSBIb3VzZWhvbGRlciBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL0hvdXNlaG9sZGVyPlxlbmRjb2RlPC90ZD48dGQ+SG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb25zOyB0aGlzIG1vZHVsZSBpcyB1c2VkIGJ5IHNldmVyYWwgbGluZWFyIGFsZ2VicmEgbW9kdWxlczwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGxpbmsgU1ZEX01vZHVsZSBTVkQgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9TVkQ+XGVuZGNvZGU8L3RkPjx0ZD5TVkQgZGVjb21wb3NpdGlvbnMgd2l0aCBsZWFzdC1zcXVhcmVzIHNvbHZlciAoSmFjb2JpU1ZELCBCRENTVkQpPC90ZD48L3RyPgorPHRyICAgICAgICAgICAgPjx0ZD5cbGluayBRUl9Nb2R1bGUgUVIgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9RUj5cZW5kY29kZTwvdGQ+PHRkPlFSIGRlY29tcG9zaXRpb24gd2l0aCBzb2x2ZXIgKEhvdXNlaG9sZGVyUVIsIENvbFBpdkhvdXNlaG9sZGVyUVIsIEZ1bGxQaXZIb3VzZWhvbGRlclFSKTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGxpbmsgRWlnZW52YWx1ZXNfTW9kdWxlIEVpZ2VudmFsdWVzIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+XGVuZGNvZGU8L3RkPjx0ZD5FaWdlbnZhbHVlLCBlaWdlbnZlY3RvciBkZWNvbXBvc2l0aW9ucyAoRWlnZW5Tb2x2ZXIsIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIsIENvbXBsZXhFaWdlblNvbHZlcik8L3RkPjwvdHI+Cis8dHIgICAgICAgICAgICA+PHRkPlxsaW5rIFNwYXJzZV9Nb2R1bGUgU3BhcnNlIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vU3BhcnNlPlxlbmRjb2RlPC90ZD48dGQ+JVNwYXJzZSBtYXRyaXggc3RvcmFnZSBhbmQgcmVsYXRlZCBiYXNpYyBsaW5lYXIgYWxnZWJyYSAoU3BhcnNlTWF0cml4LCBTcGFyc2VWZWN0b3IpIFxuIChzZWUgXHJlZiBTcGFyc2VRdWlja1JlZlBhZ2UgZm9yIGRldGFpbHMgb24gc3BhcnNlIG1vZHVsZXMpPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD48L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9EZW5zZT5cZW5kY29kZTwvdGQ+PHRkPkluY2x1ZGVzIENvcmUsIEdlb21ldHJ5LCBMVSwgQ2hvbGVza3ksIFNWRCwgUVIsIGFuZCBFaWdlbnZhbHVlcyBoZWFkZXIgZmlsZXM8L3RkPjwvdHI+Cis8dHIgICAgICAgICAgICA+PHRkPjwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL0VpZ2VuPlxlbmRjb2RlPC90ZD48dGQ+SW5jbHVkZXMgJURlbnNlIGFuZCAlU3BhcnNlIGhlYWRlciBmaWxlcyAodGhlIHdob2xlIEVpZ2VuIGxpYnJhcnkpPC90ZD48L3RyPgorPC90YWJsZT4KKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPgorXHNlY3Rpb24gUXVpY2tSZWZfVHlwZXMgQXJyYXksIG1hdHJpeCBhbmQgdmVjdG9yIHR5cGVzCisKKworXGIgUmVjYWxsOiBFaWdlbiBwcm92aWRlcyB0d28ga2luZHMgb2YgZGVuc2Ugb2JqZWN0czogbWF0aGVtYXRpY2FsIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIHdoaWNoIGFyZSBib3RoIHJlcHJlc2VudGVkIGJ5IHRoZSB0ZW1wbGF0ZSBjbGFzcyBNYXRyaXgsIGFuZCBnZW5lcmFsIDFEIGFuZCAyRCBhcnJheXMgcmVwcmVzZW50ZWQgYnkgdGhlIHRlbXBsYXRlIGNsYXNzIEFycmF5OgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBPcHRpb25zPiBNeU1hdHJpeFR5cGU7Cit0eXBlZGVmIEFycmF5PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBPcHRpb25zPiBNeUFycmF5VHlwZTsKK1xlbmRjb2RlCisKK1xsaSBcYyBTY2FsYXIgaXMgdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKGUuZy4sIFxjIGZsb2F0LCBcYyBkb3VibGUsIFxjIGJvb2wsIFxjIGludCwgZXRjLikuCitcbGkgXGMgUm93c0F0Q29tcGlsZVRpbWUgYW5kIFxjIENvbHNBdENvbXBpbGVUaW1lIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBhcyBrbm93biBhdCBjb21waWxlLXRpbWUgb3IgXGMgRHluYW1pYy4KK1xsaSBcYyBPcHRpb25zIGNhbiBiZSBcYyBDb2xNYWpvciBvciBcYyBSb3dNYWpvciwgZGVmYXVsdCBpcyBcYyBDb2xNYWpvci4gKHNlZSBjbGFzcyBNYXRyaXggZm9yIG1vcmUgb3B0aW9ucykKKworQWxsIGNvbWJpbmF0aW9ucyBhcmUgYWxsb3dlZDogeW91IGNhbiBoYXZlIGEgbWF0cml4IHdpdGggYSBmaXhlZCBudW1iZXIgb2Ygcm93cyBhbmQgYSBkeW5hbWljIG51bWJlciBvZiBjb2x1bW5zLCBldGMuIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCB2YWxpZDoKK1xjb2RlCitNYXRyaXg8ZG91YmxlLCA2LCBEeW5hbWljPiAgICAgICAgICAgICAgICAgIC8vIER5bmFtaWMgbnVtYmVyIG9mIGNvbHVtbnMgKGhlYXAgYWxsb2NhdGlvbikKK01hdHJpeDxkb3VibGUsIER5bmFtaWMsIDI+ICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBudW1iZXIgb2Ygcm93cyAoaGVhcCBhbGxvY2F0aW9uKQorTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+ICAvLyBGdWxseSBkeW5hbWljLCByb3cgbWFqb3IgKGhlYXAgYWxsb2NhdGlvbikKK01hdHJpeDxkb3VibGUsIDEzLCAzPiAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVsbHkgZml4ZWQgKHVzdWFsbHkgYWxsb2NhdGVkIG9uIHN0YWNrKQorXGVuZGNvZGUKKworSW4gbW9zdCBjYXNlcywgeW91IGNhbiBzaW1wbHkgdXNlIG9uZSBvZiB0aGUgY29udmVuaWVuY2UgdHlwZWRlZnMgZm9yIFxyZWYgbWF0cml4dHlwZWRlZnMgIm1hdHJpY2VzIiBhbmQgXHJlZiBhcnJheXR5cGVkZWZzICJhcnJheXMiLiBTb21lIGV4YW1wbGVzOgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+TWF0cmljZXM8L3RoPjx0aD5BcnJheXM8L3RoPjwvdHI+Cis8dHI+PHRkPlxjb2RlCitNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljPiAgIDw9PiAgIE1hdHJpeFhmCitNYXRyaXg8ZG91YmxlLER5bmFtaWMsMT4gICAgICAgIDw9PiAgIFZlY3RvclhkCitNYXRyaXg8aW50LDEsRHluYW1pYz4gICAgICAgICAgIDw9PiAgIFJvd1ZlY3RvclhpCitNYXRyaXg8ZmxvYXQsMywzPiAgICAgICAgICAgICAgIDw9PiAgIE1hdHJpeDNmCitNYXRyaXg8ZmxvYXQsNCwxPiAgICAgICAgICAgICAgIDw9PiAgIFZlY3RvcjRmCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCitBcnJheTxmbG9hdCxEeW5hbWljLER5bmFtaWM+ICAgIDw9PiAgIEFycmF5WFhmCitBcnJheTxkb3VibGUsRHluYW1pYywxPiAgICAgICAgIDw9PiAgIEFycmF5WGQKK0FycmF5PGludCwxLER5bmFtaWM+ICAgICAgICAgICAgPD0+ICAgUm93QXJyYXlYaQorQXJyYXk8ZmxvYXQsMywzPiAgICAgICAgICAgICAgICA8PT4gICBBcnJheTMzZgorQXJyYXk8ZmxvYXQsNCwxPiAgICAgICAgICAgICAgICA8PT4gICBBcnJheTRmCitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKK0NvbnZlcnNpb24gYmV0d2VlbiB0aGUgbWF0cml4IGFuZCBhcnJheSB3b3JsZHM6CitcY29kZQorQXJyYXk0NGYgYTEsIGExOworTWF0cml4NGYgbTEsIG0yOworbTEgPSBhMSAqIGEyOyAgICAgICAgICAgICAgICAgICAgIC8vIGNvZWZmd2lzZSBwcm9kdWN0LCBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gYXJyYXkgdG8gbWF0cml4LgorYTEgPSBtMSAqIG0yOyAgICAgICAgICAgICAgICAgICAgIC8vIG1hdHJpeCBwcm9kdWN0LCBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gbWF0cml4IHRvIGFycmF5LgorYTIgPSBhMSArIG0xLmFycmF5KCk7ICAgICAgICAgICAgIC8vIG1peGluZyBhcnJheSBhbmQgbWF0cml4IGlzIGZvcmJpZGRlbgorbTIgPSBhMS5tYXRyaXgoKSArIG0xOyAgICAgICAgICAgIC8vIGFuZCBleHBsaWNpdCBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLgorQXJyYXlXcmFwcGVyPE1hdHJpeDRmPiBtMWEobTEpOyAgIC8vIG0xYSBpcyBhbiBhbGlhcyBmb3IgbTEuYXJyYXkoKSwgdGhleSBzaGFyZSB0aGUgc2FtZSBjb2VmZmljaWVudHMKK01hdHJpeFdyYXBwZXI8QXJyYXk0NGY+IGExbShhMSk7CitcZW5kY29kZQorCitJbiB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9scyB0byBlbXBoYXNpemUgdGhlIGZlYXR1cmVzIHdoaWNoIGFyZSBzcGVjaWZpY3MgdG8gYSBnaXZlbiBraW5kIG9mIG9iamVjdDoKK1xsaSA8YSBuYW1lPSJtYXRyaXhvbmx5Ij48L2E+XG1hdHJpeHdvcmxkIGxpbmVhciBhbGdlYnJhIG1hdHJpeCBhbmQgdmVjdG9yIG9ubHkKK1xsaSA8YSBuYW1lPSJhcnJheW9ubHkiPjwvYT5cYXJyYXl3b3JsZCBhcnJheSBvYmplY3RzIG9ubHkKKworXHN1YnNlY3Rpb24gUXVpY2tSZWZfQmFzaWNzIEJhc2ljIG1hdHJpeCBtYW5pcHVsYXRpb24KKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD48L3RoPjx0aD4xRCBvYmplY3RzPC90aD48dGg+MkQgb2JqZWN0czwvdGg+PHRoPk5vdGVzPC90aD48L3RyPgorPHRyPjx0ZD5Db25zdHJ1Y3RvcnM8L3RkPgorPHRkPlxjb2RlCitWZWN0b3I0ZCAgdjQ7CitWZWN0b3IyZiAgdjEoeCwgeSk7CitBcnJheTNpICAgdjIoeCwgeSwgeik7CitWZWN0b3I0ZCAgdjMoeCwgeSwgeiwgdyk7CisKK1ZlY3RvclhmICB2NTsgLy8gZW1wdHkgb2JqZWN0CitBcnJheVhmICAgdjYoc2l6ZSk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCitNYXRyaXg0ZiAgbTE7CisKKworCisKK01hdHJpeFhmICBtNTsgLy8gZW1wdHkgb2JqZWN0CitNYXRyaXhYZiAgbTYobmJfcm93cywgbmJfY29sdW1ucyk7CitcZW5kY29kZTwvdGQ+PHRkIGNsYXNzPSJub3RlIj4KK0J5IGRlZmF1bHQsIHRoZSBjb2VmZmljaWVudHMgXG4gYXJlIGxlZnQgdW5pbml0aWFsaXplZDwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+Q29tbWEgaW5pdGlhbGl6ZXI8L3RkPgorPHRkPlxjb2RlCitWZWN0b3IzZiAgdjE7ICAgICB2MSA8PCB4LCB5LCB6OworQXJyYXlYZiAgIHYyKDQpOyAgdjIgPDwgMSwgMiwgMywgNDsKKworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorTWF0cml4M2YgIG0xOyAgIG0xIDw8IDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgNCwgNSwgNiwKKyAgICAgICAgICAgICAgICAgICAgICA3LCA4LCA5OworXGVuZGNvZGU8L3RkPjx0ZD48L3RkPjwvdHI+CisKKzx0cj48dGQ+Q29tbWEgaW5pdGlhbGl6ZXIgKGJpcyk8L3RkPgorPHRkIGNvbHNwYW49IjIiPgorXGluY2x1ZGUgVHV0b3JpYWxfY29tbWFpbml0XzAyLmNwcAorPC90ZD4KKzx0ZD4KK291dHB1dDoKK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9jb21tYWluaXRfMDIub3V0Cis8L3RkPgorPC90cj4KKworPHRyIGNsYXNzPSJhbHQiPjx0ZD5SdW50aW1lIGluZm88L3RkPgorPHRkPlxjb2RlCit2ZWN0b3Iuc2l6ZSgpOworCit2ZWN0b3IuaW5uZXJTdHJpZGUoKTsKK3ZlY3Rvci5kYXRhKCk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCittYXRyaXgucm93cygpOyAgICAgICAgICBtYXRyaXguY29scygpOworbWF0cml4LmlubmVyU2l6ZSgpOyAgICAgbWF0cml4Lm91dGVyU2l6ZSgpOworbWF0cml4LmlubmVyU3RyaWRlKCk7ICAgbWF0cml4Lm91dGVyU3RyaWRlKCk7CittYXRyaXguZGF0YSgpOworXGVuZGNvZGU8L3RkPjx0ZCBjbGFzcz0ibm90ZSI+SW5uZXIvT3V0ZXIqIGFyZSBzdG9yYWdlIG9yZGVyIGRlcGVuZGVudDwvdGQ+PC90cj4KKzx0cj48dGQ+Q29tcGlsZS10aW1lIGluZm88L3RkPgorPHRkIGNvbHNwYW49IjIiPlxjb2RlCitPYmplY3RUeXBlOjpTY2FsYXIgICAgICAgICAgICAgIE9iamVjdFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lCitPYmplY3RUeXBlOjpSZWFsU2NhbGFyICAgICAgICAgIE9iamVjdFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCitPYmplY3RUeXBlOjpJbmRleCAgICAgICAgICAgICAgIE9iamVjdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lCitcZW5kY29kZTwvdGQ+PHRkPjwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+UmVzaXppbmc8L3RkPgorPHRkPlxjb2RlCit2ZWN0b3IucmVzaXplKHNpemUpOworCisKK3ZlY3Rvci5yZXNpemVMaWtlKG90aGVyX3ZlY3Rvcik7Cit2ZWN0b3IuY29uc2VydmF0aXZlUmVzaXplKHNpemUpOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorbWF0cml4LnJlc2l6ZShuYl9yb3dzLCBuYl9jb2xzKTsKK21hdHJpeC5yZXNpemUoRWlnZW46Ok5vQ2hhbmdlLCBuYl9jb2xzKTsKK21hdHJpeC5yZXNpemUobmJfcm93cywgRWlnZW46Ok5vQ2hhbmdlKTsKK21hdHJpeC5yZXNpemVMaWtlKG90aGVyX21hdHJpeCk7CittYXRyaXguY29uc2VydmF0aXZlUmVzaXplKG5iX3Jvd3MsIG5iX2NvbHMpOworXGVuZGNvZGU8L3RkPjx0ZCBjbGFzcz0ibm90ZSI+bm8tb3AgaWYgdGhlIG5ldyBzaXplcyBtYXRjaCw8YnIvPm90aGVyd2lzZSBkYXRhIGFyZSBsb3N0PGJyLz48YnIvPnJlc2l6aW5nIHdpdGggZGF0YSBwcmVzZXJ2YXRpb248L3RkPjwvdHI+CisKKzx0cj48dGQ+Q29lZmYgYWNjZXNzIHdpdGggXG4gcmFuZ2UgY2hlY2tpbmc8L3RkPgorPHRkPlxjb2RlCit2ZWN0b3IoaSkgICAgIHZlY3Rvci54KCkKK3ZlY3RvcltpXSAgICAgdmVjdG9yLnkoKQorICAgICAgICAgICAgICB2ZWN0b3IueigpCisgICAgICAgICAgICAgIHZlY3Rvci53KCkKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK21hdHJpeChpLGopCitcZW5kY29kZTwvdGQ+PHRkIGNsYXNzPSJub3RlIj5SYW5nZSBjaGVja2luZyBpcyBkaXNhYmxlZCBpZiBcbiBOREVCVUcgb3IgRUlHRU5fTk9fREVCVUcgaXMgZGVmaW5lZDwvdGQ+PC90cj4KKworPHRyIGNsYXNzPSJhbHQiPjx0ZD5Db2VmZiBhY2Nlc3Mgd2l0aG91dCBcbiByYW5nZSBjaGVja2luZzwvdGQ+Cis8dGQ+XGNvZGUKK3ZlY3Rvci5jb2VmZihpKQordmVjdG9yLmNvZWZmUmVmKGkpCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCittYXRyaXguY29lZmYoaSxqKQorbWF0cml4LmNvZWZmUmVmKGksaikKK1xlbmRjb2RlPC90ZD48dGQ+PC90ZD48L3RyPgorCis8dHI+PHRkPkFzc2lnbm1lbnQvY29weTwvdGQ+Cis8dGQgY29sc3Bhbj0iMiI+XGNvZGUKK29iamVjdCA9IGV4cHJlc3Npb247CitvYmplY3Rfb2ZfZmxvYXQgPSBleHByZXNzaW9uX29mX2RvdWJsZS5jYXN0PGZsb2F0PigpOworXGVuZGNvZGU8L3RkPjx0ZCBjbGFzcz0ibm90ZSI+dGhlIGRlc3RpbmF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVzaXplZCAoaWYgcG9zc2libGUpPC90ZD48L3RyPgorCis8L3RhYmxlPgorCitcc3Vic2VjdGlvbiBRdWlja1JlZl9QcmVkZWZNYXQgUHJlZGVmaW5lZCBNYXRyaWNlcworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+CisgIDx0aD5GaXhlZC1zaXplIG1hdHJpeCBvciB2ZWN0b3I8L3RoPgorICA8dGg+RHluYW1pYy1zaXplIG1hdHJpeDwvdGg+CisgIDx0aD5EeW5hbWljLXNpemUgdmVjdG9yPC90aD4KKzwvdHI+Cis8dHIgc3R5bGU9ImJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7Ij4KKyAgPHRkPgorXGNvZGUKK3R5cGVkZWYge01hdHJpeDNmfEFycmF5MzNmfSBGaXhlZFhEOworRml4ZWRYRCB4OworCit4ID0gRml4ZWRYRDo6WmVybygpOworeCA9IEZpeGVkWEQ6Ok9uZXMoKTsKK3ggPSBGaXhlZFhEOjpDb25zdGFudCh2YWx1ZSk7Cit4ID0gRml4ZWRYRDo6UmFuZG9tKCk7Cit4ID0gRml4ZWRYRDo6TGluU3BhY2VkKHNpemUsIGxvdywgaGlnaCk7CisKK3guc2V0WmVybygpOworeC5zZXRPbmVzKCk7Cit4LnNldENvbnN0YW50KHZhbHVlKTsKK3guc2V0UmFuZG9tKCk7Cit4LnNldExpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOworXGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPgorXGNvZGUKK3R5cGVkZWYge01hdHJpeFhmfEFycmF5WFhmfSBEeW5hbWljMkQ7CitEeW5hbWljMkQgeDsKKworeCA9IER5bmFtaWMyRDo6WmVybyhyb3dzLCBjb2xzKTsKK3ggPSBEeW5hbWljMkQ6Ok9uZXMocm93cywgY29scyk7Cit4ID0gRHluYW1pYzJEOjpDb25zdGFudChyb3dzLCBjb2xzLCB2YWx1ZSk7Cit4ID0gRHluYW1pYzJEOjpSYW5kb20ocm93cywgY29scyk7CitOL0EKKworeC5zZXRaZXJvKHJvd3MsIGNvbHMpOworeC5zZXRPbmVzKHJvd3MsIGNvbHMpOworeC5zZXRDb25zdGFudChyb3dzLCBjb2xzLCB2YWx1ZSk7Cit4LnNldFJhbmRvbShyb3dzLCBjb2xzKTsKK04vQQorXGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPgorXGNvZGUKK3R5cGVkZWYge1ZlY3RvclhmfEFycmF5WGZ9IER5bmFtaWMxRDsKK0R5bmFtaWMxRCB4OworCit4ID0gRHluYW1pYzFEOjpaZXJvKHNpemUpOworeCA9IER5bmFtaWMxRDo6T25lcyhzaXplKTsKK3ggPSBEeW5hbWljMUQ6OkNvbnN0YW50KHNpemUsIHZhbHVlKTsKK3ggPSBEeW5hbWljMUQ6OlJhbmRvbShzaXplKTsKK3ggPSBEeW5hbWljMUQ6OkxpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOworCit4LnNldFplcm8oc2l6ZSk7Cit4LnNldE9uZXMoc2l6ZSk7Cit4LnNldENvbnN0YW50KHNpemUsIHZhbHVlKTsKK3guc2V0UmFuZG9tKHNpemUpOworeC5zZXRMaW5TcGFjZWQoc2l6ZSwgbG93LCBoaWdoKTsKK1xlbmRjb2RlCisgIDwvdGQ+Cis8L3RyPgorCis8dHI+PHRkIGNvbHNwYW49IjMiPklkZW50aXR5IGFuZCBcbGluayBNYXRyaXhCYXNlOjpVbml0IGJhc2lzIHZlY3RvcnMgXGVuZGxpbmsgXG1hdHJpeHdvcmxkPC90ZD48L3RyPgorPHRyIHN0eWxlPSJib3JkZXItYm90dG9tLXN0eWxlOiBub25lOyI+CisgIDx0ZD4KK1xjb2RlCit4ID0gRml4ZWRYRDo6SWRlbnRpdHkoKTsKK3guc2V0SWRlbnRpdHkoKTsKKworVmVjdG9yM2Y6OlVuaXRYKCkgLy8gMSAwIDAKK1ZlY3RvcjNmOjpVbml0WSgpIC8vIDAgMSAwCitWZWN0b3IzZjo6VW5pdFooKSAvLyAwIDAgMQorXGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPgorXGNvZGUKK3ggPSBEeW5hbWljMkQ6OklkZW50aXR5KHJvd3MsIGNvbHMpOworeC5zZXRJZGVudGl0eShyb3dzLCBjb2xzKTsKKworCisKK04vQQorXGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPlxjb2RlCitOL0EKKworCitWZWN0b3JYZjo6VW5pdChzaXplLGkpCitWZWN0b3JYZjo6VW5pdCg0LDEpID09IFZlY3RvcjRmKDAsMSwwLDApCisgICAgICAgICAgICAgICAgICAgID09IFZlY3RvcjRmOjpVbml0WSgpCitcZW5kY29kZQorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworCitcc3Vic2VjdGlvbiBRdWlja1JlZl9NYXAgTWFwcGluZyBleHRlcm5hbCBhcnJheXMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPgorPHRkPkNvbnRpZ3VvdXMgXG4gbWVtb3J5PC90ZD4KKzx0ZD5cY29kZQorZmxvYXQgZGF0YVtdID0gezEsMiwzLDR9OworTWFwPFZlY3RvcjNmPiB2MShkYXRhKTsgICAgICAgLy8gdXNlcyB2MSBhcyBhIFZlY3RvcjNmIG9iamVjdAorTWFwPEFycmF5WGY+ICB2MihkYXRhLDMpOyAgICAgLy8gdXNlcyB2MiBhcyBhIEFycmF5WGYgb2JqZWN0CitNYXA8QXJyYXkyMmY+IG0xKGRhdGEpOyAgICAgICAvLyB1c2VzIG0xIGFzIGEgQXJyYXkyMmYgb2JqZWN0CitNYXA8TWF0cml4WGY+IG0yKGRhdGEsMiwyKTsgICAvLyB1c2VzIG0yIGFzIGEgTWF0cml4WGYgb2JqZWN0CitcZW5kY29kZTwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPlR5cGljYWwgdXNhZ2UgXG4gb2Ygc3RyaWRlczwvdGQ+Cis8dGQ+XGNvZGUKK2Zsb2F0IGRhdGFbXSA9IHsxLDIsMyw0LDUsNiw3LDgsOX07CitNYXA8VmVjdG9yWGYsMCxJbm5lclN0cmlkZTwyPiA+ICB2MShkYXRhLDMpOyAgICAgICAgICAgICAgICAgICAgICAvLyA9IFsxLDMsNV0KK01hcDxWZWN0b3JYZiwwLElubmVyU3RyaWRlPD4gPiAgIHYyKGRhdGEsMyxJbm5lclN0cmlkZTw+KDMpKTsgICAgIC8vID0gWzEsNCw3XQorTWFwPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8Mz4gPiAgbTIoZGF0YSwyLDMpOyAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBsaW5lcyAgICAgfDEsNCw3fAorTWFwPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+ICAgbTEoZGF0YSwyLDMsT3V0ZXJTdHJpZGU8PigzKSk7ICAgLy8gYXJlIGVxdWFsIHRvOiAgfDIsNSw4fAorXGVuZGNvZGU8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPgorXHNlY3Rpb24gUXVpY2tSZWZfQXJpdGhtZXRpY09wZXJhdG9ycyBBcml0aG1ldGljIE9wZXJhdG9ycworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPgorYWRkIFxuIHN1YnRyYWN0PC90ZD48dGQ+XGNvZGUKK21hdDMgPSBtYXQxICsgbWF0MjsgICAgICAgICAgIG1hdDMgKz0gbWF0MTsKK21hdDMgPSBtYXQxIC0gbWF0MjsgICAgICAgICAgIG1hdDMgLT0gbWF0MTtcZW5kY29kZQorPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK3NjYWxhciBwcm9kdWN0PC90ZD48dGQ+XGNvZGUKK21hdDMgPSBtYXQxICogczE7ICAgICAgICAgICAgIG1hdDMgKj0gczE7ICAgICAgICAgICBtYXQzID0gczEgKiBtYXQxOworbWF0MyA9IG1hdDEgLyBzMTsgICAgICAgICAgICAgbWF0MyAvPSBzMTtcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD4KK21hdHJpeC92ZWN0b3IgXG4gcHJvZHVjdHMgXG1hdHJpeHdvcmxkPC90ZD48dGQ+XGNvZGUKK2NvbDIgPSBtYXQxICogY29sMTsKK3JvdzIgPSByb3cxICogbWF0MTsgICAgICAgICAgIHJvdzEgKj0gbWF0MTsKK21hdDMgPSBtYXQxICogbWF0MjsgICAgICAgICAgIG1hdDMgKj0gbWF0MTsgXGVuZGNvZGUKKzwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+Cit0cmFuc3Bvc2l0aW9uIFxuIGFkam9pbnQgXG1hdHJpeHdvcmxkPC90ZD48dGQ+XGNvZGUKK21hdDEgPSBtYXQyLnRyYW5zcG9zZSgpOyAgICAgIG1hdDEudHJhbnNwb3NlSW5QbGFjZSgpOworbWF0MSA9IG1hdDIuYWRqb2ludCgpOyAgICAgICAgbWF0MS5hZGpvaW50SW5QbGFjZSgpOworXGVuZGNvZGUKKzwvdGQ+PC90cj4KKzx0cj48dGQ+CitcbGluayBNYXRyaXhCYXNlOjpkb3QgZG90IFxlbmRsaW5rIHByb2R1Y3QgXG4gaW5uZXIgcHJvZHVjdCBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorc2NhbGFyID0gdmVjMS5kb3QodmVjMik7CitzY2FsYXIgPSBjb2wxLmFkam9pbnQoKSAqIGNvbDI7CitzY2FsYXIgPSAoY29sMS5hZGpvaW50KCkgKiBjb2wyKS52YWx1ZSgpO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorb3V0ZXIgcHJvZHVjdCBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorbWF0ID0gY29sMSAqIGNvbDIudHJhbnNwb3NlKCk7XGVuZGNvZGUKKzwvdGQ+PC90cj4KKworPHRyPjx0ZD4KK1xsaW5rIE1hdHJpeEJhc2U6Om5vcm0oKSBub3JtIFxlbmRsaW5rIFxuIFxsaW5rIE1hdHJpeEJhc2U6Om5vcm1hbGl6ZWQoKSBub3JtYWxpemF0aW9uIFxlbmRsaW5rIFxtYXRyaXh3b3JsZDwvdGQ+PHRkPlxjb2RlCitzY2FsYXIgPSB2ZWMxLm5vcm0oKTsgICAgICAgICBzY2FsYXIgPSB2ZWMxLnNxdWFyZWROb3JtKCkKK3ZlYzIgPSB2ZWMxLm5vcm1hbGl6ZWQoKTsgICAgIHZlYzEubm9ybWFsaXplKCk7IC8vIGlucGxhY2UgXGVuZGNvZGUKKzwvdGQ+PC90cj4KKworPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK1xsaW5rIE1hdHJpeEJhc2U6OmNyb3NzKCkgY3Jvc3MgcHJvZHVjdCBcZW5kbGluayBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgordmVjMyA9IHZlYzEuY3Jvc3ModmVjMik7XGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+Citcc2VjdGlvbiBRdWlja1JlZl9Db2VmZndpc2UgQ29lZmZpY2llbnQtd2lzZSBcJiBBcnJheSBvcGVyYXRvcnMKKworSW4gYWRkaXRpb24gdG8gdGhlIGFmb3JlbWVudGlvbmVkIG9wZXJhdG9ycywgRWlnZW4gc3VwcG9ydHMgbnVtZXJvdXMgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRvciBhbmQgZnVuY3Rpb25zLgorTW9zdCBvZiB0aGVtIHVuYW1iaWd1b3VzbHkgbWFrZXMgc2Vuc2UgaW4gYXJyYXktd29ybGRcYXJyYXl3b3JsZC4gVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgYXJlIHJlYWRpbHkgYXZhaWxhYmxlIGZvciBhcnJheXMsCitvciBhdmFpbGFibGUgdGhyb3VnaCAuYXJyYXkoKSBmb3IgdmVjdG9ycyBhbmQgbWF0cmljZXM6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+QXJpdGhtZXRpYyBvcGVyYXRvcnM8L3RkPjx0ZD5cY29kZQorYXJyYXkxICogYXJyYXkyICAgICBhcnJheTEgLyBhcnJheTIgICAgIGFycmF5MSAqPSBhcnJheTIgICAgYXJyYXkxIC89IGFycmF5MgorYXJyYXkxICsgc2NhbGFyICAgICBhcnJheTEgLSBzY2FsYXIgICAgIGFycmF5MSArPSBzY2FsYXIgICAgYXJyYXkxIC09IHNjYWxhcgorXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPkNvbXBhcmlzb25zPC90ZD48dGQ+XGNvZGUKK2FycmF5MSA8IGFycmF5MiAgICAgYXJyYXkxID4gYXJyYXkyICAgICBhcnJheTEgPCBzY2FsYXIgICAgIGFycmF5MSA+IHNjYWxhcgorYXJyYXkxIDw9IGFycmF5MiAgICBhcnJheTEgPj0gYXJyYXkyICAgIGFycmF5MSA8PSBzY2FsYXIgICAgYXJyYXkxID49IHNjYWxhcgorYXJyYXkxID09IGFycmF5MiAgICBhcnJheTEgIT0gYXJyYXkyICAgIGFycmF5MSA9PSBzY2FsYXIgICAgYXJyYXkxICE9IHNjYWxhcgorYXJyYXkxLm1pbihhcnJheTIpICBhcnJheTEubWF4KGFycmF5MikgIGFycmF5MS5taW4oc2NhbGFyKSAgYXJyYXkxLm1heChzY2FsYXIpCitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+VHJpZ28sIHBvd2VyLCBhbmQgXG4gbWlzYyBmdW5jdGlvbnMgXG4gYW5kIHRoZSBTVEwtbGlrZSB2YXJpYW50czwvdGQ+PHRkPlxjb2RlCithcnJheTEuYWJzMigpCithcnJheTEuYWJzKCkgICAgICAgICAgICAgICAgICBhYnMoYXJyYXkxKQorYXJyYXkxLnNxcnQoKSAgICAgICAgICAgICAgICAgc3FydChhcnJheTEpCithcnJheTEubG9nKCkgICAgICAgICAgICAgICAgICBsb2coYXJyYXkxKQorYXJyYXkxLmxvZzEwKCkgICAgICAgICAgICAgICAgbG9nMTAoYXJyYXkxKQorYXJyYXkxLmV4cCgpICAgICAgICAgICAgICAgICAgZXhwKGFycmF5MSkKK2FycmF5MS5wb3coYXJyYXkyKSAgICAgICAgICAgIHBvdyhhcnJheTEsYXJyYXkyKQorYXJyYXkxLnBvdyhzY2FsYXIpICAgICAgICAgICAgcG93KGFycmF5MSxzY2FsYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3coc2NhbGFyLGFycmF5MikKK2FycmF5MS5zcXVhcmUoKQorYXJyYXkxLmN1YmUoKQorYXJyYXkxLmludmVyc2UoKQorCithcnJheTEuc2luKCkgICAgICAgICAgICAgICAgICBzaW4oYXJyYXkxKQorYXJyYXkxLmNvcygpICAgICAgICAgICAgICAgICAgY29zKGFycmF5MSkKK2FycmF5MS50YW4oKSAgICAgICAgICAgICAgICAgIHRhbihhcnJheTEpCithcnJheTEuYXNpbigpICAgICAgICAgICAgICAgICBhc2luKGFycmF5MSkKK2FycmF5MS5hY29zKCkgICAgICAgICAgICAgICAgIGFjb3MoYXJyYXkxKQorYXJyYXkxLmF0YW4oKSAgICAgICAgICAgICAgICAgYXRhbihhcnJheTEpCithcnJheTEuc2luaCgpICAgICAgICAgICAgICAgICBzaW5oKGFycmF5MSkKK2FycmF5MS5jb3NoKCkgICAgICAgICAgICAgICAgIGNvc2goYXJyYXkxKQorYXJyYXkxLnRhbmgoKSAgICAgICAgICAgICAgICAgdGFuaChhcnJheTEpCithcnJheTEuYXJnKCkgICAgICAgICAgICAgICAgICBhcmcoYXJyYXkxKQorCithcnJheTEuZmxvb3IoKSAgICAgICAgICAgICAgICBmbG9vcihhcnJheTEpCithcnJheTEuY2VpbCgpICAgICAgICAgICAgICAgICBjZWlsKGFycmF5MSkKK2FycmF5MS5yb3VuZCgpICAgICAgICAgICAgICAgIHJvdW5kKGFyYXkxKQorCithcnJheTEuaXNGaW5pdGUoKSAgICAgICAgICAgICBpc2Zpbml0ZShhcnJheTEpCithcnJheTEuaXNJbmYoKSAgICAgICAgICAgICAgICBpc2luZihhcnJheTEpCithcnJheTEuaXNOYU4oKSAgICAgICAgICAgICAgICBpc25hbihhcnJheTEpCitcZW5kY29kZQorPC90ZD48L3RyPgorPC90YWJsZT4KKworCitUaGUgZm9sbG93aW5nIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0b3JzIGFyZSBhdmFpbGFibGUgZm9yIGFsbCBraW5kIG9mIGV4cHJlc3Npb25zIChtYXRyaWNlcywgdmVjdG9ycywgYW5kIGFycmF5cyksIGFuZCBmb3IgYm90aCByZWFsIG9yIGNvbXBsZXggc2NhbGFyIHR5cGVzOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuJ3MgQVBJPC90aD48dGg+U1RMLWxpa2UgQVBJc1xhcnJheXdvcmxkIDwvdGg+PHRoPkNvbW1lbnRzPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZQorbWF0MS5yZWFsKCkKK21hdDEuaW1hZygpCittYXQxLmNvbmp1Z2F0ZSgpCitcZW5kY29kZQorPC90ZD48dGQ+XGNvZGUKK3JlYWwoYXJyYXkxKQoraW1hZyhhcnJheTEpCitjb25qKGFycmF5MSkKK1xlbmRjb2RlCis8L3RkPjx0ZD4KK1xjb2RlCisgLy8gcmVhZC13cml0ZSwgbm8tb3AgZm9yIHJlYWwgZXhwcmVzc2lvbnMKKyAvLyByZWFkLW9ubHkgZm9yIHJlYWwsIHJlYWQtd3JpdGUgZm9yIGNvbXBsZXhlcworIC8vIG5vLW9wIGZvciByZWFsIGV4cHJlc3Npb25zCitcZW5kY29kZQorPC90ZD48L3RyPgorPC90YWJsZT4KKworU29tZSBjb2VmZmljaWVudC13aXNlIG9wZXJhdG9ycyBhcmUgcmVhZGlseSBhdmFpbGFibGUgZm9yIGZvciBtYXRyaWNlcyBhbmQgdmVjdG9ycyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgY3dpc2UqIG1ldGhvZHM6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPk1hdHJpeCBBUEkgXG1hdHJpeHdvcmxkPC90aD48dGg+VmlhIEFycmF5IGNvbnZlcnNpb25zPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZQorbWF0MS5jd2lzZU1pbihtYXQyKSAgICAgICAgIG1hdDEuY3dpc2VNaW4oc2NhbGFyKQorbWF0MS5jd2lzZU1heChtYXQyKSAgICAgICAgIG1hdDEuY3dpc2VNYXgoc2NhbGFyKQorbWF0MS5jd2lzZUFiczIoKQorbWF0MS5jd2lzZUFicygpCittYXQxLmN3aXNlU3FydCgpCittYXQxLmN3aXNlSW52ZXJzZSgpCittYXQxLmN3aXNlUHJvZHVjdChtYXQyKQorbWF0MS5jd2lzZVF1b3RpZW50KG1hdDIpCittYXQxLmN3aXNlRXF1YWwobWF0MikgICAgICAgbWF0MS5jd2lzZUVxdWFsKHNjYWxhcikKK21hdDEuY3dpc2VOb3RFcXVhbChtYXQyKQorXGVuZGNvZGUKKzwvdGQ+PHRkPlxjb2RlCittYXQxLmFycmF5KCkubWluKG1hdDIuYXJyYXkoKSkgICAgbWF0MS5hcnJheSgpLm1pbihzY2FsYXIpCittYXQxLmFycmF5KCkubWF4KG1hdDIuYXJyYXkoKSkgICAgbWF0MS5hcnJheSgpLm1heChzY2FsYXIpCittYXQxLmFycmF5KCkuYWJzMigpCittYXQxLmFycmF5KCkuYWJzKCkKK21hdDEuYXJyYXkoKS5zcXJ0KCkKK21hdDEuYXJyYXkoKS5pbnZlcnNlKCkKK21hdDEuYXJyYXkoKSAqIG1hdDIuYXJyYXkoKQorbWF0MS5hcnJheSgpIC8gbWF0Mi5hcnJheSgpCittYXQxLmFycmF5KCkgPT0gbWF0Mi5hcnJheSgpICAgICAgbWF0MS5hcnJheSgpID09IHNjYWxhcgorbWF0MS5hcnJheSgpICE9IG1hdDIuYXJyYXkoKQorXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gQVBJIGlzIHRoYXQgdGhlIG9uZSBiYXNlZCBvbiBjd2lzZSogbWV0aG9kcyByZXR1cm5zIGFuIGV4cHJlc3Npb24gaW4gdGhlIG1hdHJpeCB3b3JsZCwKK3doaWxlIHRoZSBzZWNvbmQgb25lIChiYXNlZCBvbiAuYXJyYXkoKSkgcmV0dXJucyBhbiBhcnJheSBleHByZXNzaW9uLgorUmVjYWxsIHRoYXQgLmFycmF5KCkgaGFzIG5vIGNvc3QsIGl0IG9ubHkgY2hhbmdlcyB0aGUgYXZhaWxhYmxlIEFQSSBhbmQgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGRhdGEuCisKK0l0IGlzIGFsc28gdmVyeSBzaW1wbGUgdG8gYXBwbHkgYW55IHVzZXIgZGVmaW5lZCBmdW5jdGlvbiBcYyBmb28gdXNpbmcgRGVuc2VCYXNlOjp1bmFyeUV4cHIgdG9nZXRoZXIgd2l0aCA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC91dGlsaXR5L2Z1bmN0aW9uYWwvcHRyX2Z1biI+c3RkOjpwdHJfZnVuPC9hPiAoYysrMDMpLCA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC91dGlsaXR5L2Z1bmN0aW9uYWwvcmVmIj5zdGQ6OnJlZjwvYT4gKGMrKzExKSwgb3IgPGEgaHJlZj0iaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvbGFtYmRhIj5sYW1iZGFzPC9hPiAoYysrMTEpOgorXGNvZGUKK21hdDEudW5hcnlFeHByKHN0ZDo6cHRyX2Z1bihmb28pKTsKK21hdDEudW5hcnlFeHByKHN0ZDo6cmVmKGZvbykpOworbWF0MS51bmFyeUV4cHIoW10oZG91YmxlIHgpIHsgcmV0dXJuIGZvbyh4KTsgfSk7CitcZW5kY29kZQorCisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT4KK1xzZWN0aW9uIFF1aWNrUmVmX1JlZHVjdGlvbnMgUmVkdWN0aW9ucworCitFaWdlbiBwcm92aWRlcyBzZXZlcmFsIHJlZHVjdGlvbiBtZXRob2RzIHN1Y2ggYXM6CitcbGluayBEZW5zZUJhc2U6Om1pbkNvZWZmKCkgbWluQ29lZmYoKSBcZW5kbGluaywgXGxpbmsgRGVuc2VCYXNlOjptYXhDb2VmZigpIG1heENvZWZmKCkgXGVuZGxpbmssCitcbGluayBEZW5zZUJhc2U6OnN1bSgpIHN1bSgpIFxlbmRsaW5rLCBcbGluayBEZW5zZUJhc2U6OnByb2QoKSBwcm9kKCkgXGVuZGxpbmssCitcbGluayBNYXRyaXhCYXNlOjp0cmFjZSgpIHRyYWNlKCkgXGVuZGxpbmsgXG1hdHJpeHdvcmxkLAorXGxpbmsgTWF0cml4QmFzZTo6bm9ybSgpIG5vcm0oKSBcZW5kbGluayBcbWF0cml4d29ybGQsIFxsaW5rIE1hdHJpeEJhc2U6OnNxdWFyZWROb3JtKCkgc3F1YXJlZE5vcm0oKSBcZW5kbGluayBcbWF0cml4d29ybGQsCitcbGluayBEZW5zZUJhc2U6OmFsbCgpIGFsbCgpIFxlbmRsaW5rLCBhbmQgXGxpbmsgRGVuc2VCYXNlOjphbnkoKSBhbnkoKSBcZW5kbGluay4KK0FsbCByZWR1Y3Rpb24gb3BlcmF0aW9ucyBjYW4gYmUgZG9uZSBtYXRyaXgtd2lzZSwKK1xsaW5rIERlbnNlQmFzZTo6Y29sd2lzZSgpIGNvbHVtbi13aXNlIFxlbmRsaW5rIG9yCitcbGluayBEZW5zZUJhc2U6OnJvd3dpc2UoKSByb3ctd2lzZSBcZW5kbGluay4gVXNhZ2UgZXhhbXBsZToKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQgcm93c3Bhbj0iMyIgc3R5bGU9ImJvcmRlci1yaWdodC1zdHlsZTpkYXNoZWQ7dmVydGljYWwtYWxpZ246bWlkZGxlIj5cY29kZQorICAgICAgNSAzIDEKK21hdCA9IDIgNyA4CisgICAgICA5IDQgNiBcZW5kY29kZQorPC90ZD4gPHRkPlxjb2RlIG1hdC5taW5Db2VmZigpOyBcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIDEgXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxjb2RlIG1hdC5jb2x3aXNlKCkubWluQ29lZmYoKTsgXGVuZGNvZGU8L3RkPjx0ZD5cY29kZSAyIDMgMSBcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIj48dGQ+XGNvZGUgbWF0LnJvd3dpc2UoKS5taW5Db2VmZigpOyBcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCisxCisyCis0CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1NwZWNpYWwgdmVyc2lvbnMgb2YgXGxpbmsgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopIGNvbnN0IG1pbkNvZWZmIFxlbmRsaW5rIGFuZCBcbGluayBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4VHlwZSosSW5kZXhUeXBlKikgY29uc3QgbWF4Q29lZmYgXGVuZGxpbms6CitcY29kZQoraW50IGksIGo7CitzID0gdmVjdG9yLm1pbkNvZWZmKCZpKTsgICAgICAgIC8vIHMgPT0gdmVjdG9yW2ldCitzID0gbWF0cml4Lm1heENvZWZmKCZpLCAmaik7ICAgIC8vIHMgPT0gbWF0cml4KGksaikKK1xlbmRjb2RlCitUeXBpY2FsIHVzZSBjYXNlcyBvZiBhbGwoKSBhbmQgYW55KCk6CitcY29kZQoraWYoKGFycmF5MSA+IDApLmFsbCgpKSAuLi4gICAgICAvLyBpZiBhbGwgY29lZmZpY2llbnRzIG9mIGFycmF5MSBhcmUgZ3JlYXRlciB0aGFuIDAgLi4uCitpZigoYXJyYXkxIDwgYXJyYXkyKS5hbnkoKSkgLi4uIC8vIGlmIHRoZXJlIGV4aXN0IGEgcGFpciBpLGogc3VjaCB0aGF0IGFycmF5MShpLGopIDwgYXJyYXkyKGksaikgLi4uCitcZW5kY29kZQorCisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT5cc2VjdGlvbiBRdWlja1JlZl9CbG9ja3MgU3ViLW1hdHJpY2VzCisKK1JlYWQtd3JpdGUgYWNjZXNzIHRvIGEgXGxpbmsgRGVuc2VCYXNlOjpjb2woSW5kZXgpIGNvbHVtbiBcZW5kbGluaworb3IgYSBcbGluayBEZW5zZUJhc2U6OnJvdyhJbmRleCkgcm93IFxlbmRsaW5rIG9mIGEgbWF0cml4IChvciBhcnJheSk6CitcY29kZQorbWF0MS5yb3coaSkgPSBtYXQyLmNvbChqKTsKK21hdDEuY29sKGoxKS5zd2FwKG1hdDEuY29sKGoyKSk7CitcZW5kY29kZQorCitSZWFkLXdyaXRlIGFjY2VzcyB0byBzdWItdmVjdG9yczoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj4KKzx0aD5EZWZhdWx0IHZlcnNpb25zPC90aD4KKzx0aD5PcHRpbWl6ZWQgdmVyc2lvbnMgd2hlbiB0aGUgc2l6ZSBcbiBpcyBrbm93biBhdCBjb21waWxlIHRpbWU8L3RoPjwvdHI+Cis8dGg+PC90aD4KKworPHRyPjx0ZD5cY29kZSB2ZWMxLmhlYWQobilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEuaGVhZDxuPigpXGVuZGNvZGU8L3RkPjx0ZD50aGUgZmlyc3QgXGMgbiBjb2VmZnMgPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSB2ZWMxLnRhaWwobilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEudGFpbDxuPigpXGVuZGNvZGU8L3RkPjx0ZD50aGUgbGFzdCBcYyBuIGNvZWZmcyA8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlIHZlYzEuc2VnbWVudChwb3MsbilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEuc2VnbWVudDxuPihwb3MpXGVuZGNvZGU8L3RkPgorICAgIDx0ZD50aGUgXGMgbiBjb2VmZnMgaW4gdGhlIFxuIHJhbmdlIFtcYyBwb3MgOiBcYyBwb3MgKyBcYyBuIC0gMV08L3RkPjwvdHI+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+KCkubGx0KCkuc29sdmUobWF0MikKK1xlbmRjb2RlCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvUXVpY2tTdGFydEd1aWRlLmRveCBiL2RvYy9RdWlja1N0YXJ0R3VpZGUuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUXVpY2tTdGFydEd1aWRlLmRveApAQCAtMCwwICsxLDEwMCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIEdldHRpbmdTdGFydGVkIEdldHRpbmcgc3RhcnRlZAorCitcZWlnZW5BdXRvVG9jCisKK1RoaXMgaXMgYSB2ZXJ5IHNob3J0IGd1aWRlIG9uIGhvdyB0byBnZXQgc3RhcnRlZCB3aXRoIEVpZ2VuLiBJdCBoYXMgYSBkdWFsIHB1cnBvc2UuIEl0IHNlcnZlcyBhcyBhIG1pbmltYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBFaWdlbiBsaWJyYXJ5IGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gc3RhcnQgY29kaW5nIGFzIHNvb24gYXMgcG9zc2libGUuIFlvdSBjYW4gYWxzbyByZWFkIHRoaXMgcGFnZSBhcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgVHV0b3JpYWwsIHdoaWNoIGV4cGxhaW5zIHRoZSBsaWJyYXJ5IGluIG1vcmUgZGV0YWlsOyBpbiB0aGlzIGNhc2UgeW91IHdpbGwgY29udGludWUgd2l0aCBccmVmIFR1dG9yaWFsTWF0cml4Q2xhc3MuCisKK1xzZWN0aW9uIEdldHRpbmdTdGFydGVkSW5zdGFsbGF0aW9uIEhvdyB0byAiaW5zdGFsbCIgRWlnZW4/CisKK0luIG9yZGVyIHRvIHVzZSBFaWdlbiwgeW91IGp1c3QgbmVlZCB0byBkb3dubG9hZCBhbmQgZXh0cmFjdCBFaWdlbidzIHNvdXJjZSBjb2RlIChzZWUgPGEgaHJlZj0iaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSNEb3dubG9hZCI+dGhlIHdpa2k8L2E+IGZvciBkb3dubG9hZCBpbnN0cnVjdGlvbnMpLiBJbiBmYWN0LCB0aGUgaGVhZGVyIGZpbGVzIGluIHRoZSBcYyBFaWdlbiBzdWJkaXJlY3RvcnkgYXJlIHRoZSBvbmx5IGZpbGVzIHJlcXVpcmVkIHRvIGNvbXBpbGUgcHJvZ3JhbXMgdXNpbmcgRWlnZW4uIFRoZSBoZWFkZXIgZmlsZXMgYXJlIHRoZSBzYW1lIGZvciBhbGwgcGxhdGZvcm1zLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSBDTWFrZSBvciBpbnN0YWxsIGFueXRoaW5nLgorCisKK1xzZWN0aW9uIEdldHRpbmdTdGFydGVkRmlyc3RQcm9ncmFtIEEgc2ltcGxlIGZpcnN0IHByb2dyYW0KKworSGVyZSBpcyBhIHJhdGhlciBzaW1wbGUgcHJvZ3JhbSB0byBnZXQgeW91IHN0YXJ0ZWQuCisKK1xpbmNsdWRlIFF1aWNrU3RhcnRfZXhhbXBsZS5jcHAKKworV2Ugd2lsbCBleHBsYWluIHRoZSBwcm9ncmFtIGFmdGVyIHRlbGxpbmcgeW91IGhvdyB0byBjb21waWxlIGl0LgorCisKK1xzZWN0aW9uIEdldHRpbmdTdGFydGVkQ29tcGlsaW5nIENvbXBpbGluZyBhbmQgcnVubmluZyB5b3VyIGZpcnN0IHByb2dyYW0KKworVGhlcmUgaXMgbm8gbGlicmFyeSB0byBsaW5rIHRvLiBUaGUgb25seSB0aGluZyB0aGF0IHlvdSBuZWVkIHRvIGtlZXAgaW4gbWluZCB3aGVuIGNvbXBpbGluZyB0aGUgYWJvdmUgcHJvZ3JhbSBpcyB0aGF0IHRoZSBjb21waWxlciBtdXN0IGJlIGFibGUgdG8gZmluZCB0aGUgRWlnZW4gaGVhZGVyIGZpbGVzLiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBwbGFjZWQgRWlnZW4ncyBzb3VyY2UgY29kZSBtdXN0IGJlIGluIHRoZSBpbmNsdWRlIHBhdGguIFdpdGggR0NDIHlvdSB1c2UgdGhlIC1JIG9wdGlvbiB0byBhY2hpZXZlIHRoaXMsIHNvIHlvdSBjYW4gY29tcGlsZSB0aGUgcHJvZ3JhbSB3aXRoIGEgY29tbWFuZCBsaWtlIHRoaXM6CisKK1xjb2RlIGcrKyAtSSAvcGF0aC90by9laWdlbi8gbXlfcHJvZ3JhbS5jcHAgLW8gbXlfcHJvZ3JhbSBcZW5kY29kZQorCitPbiBMaW51eCBvciBNYWMgT1MgWCwgYW5vdGhlciBvcHRpb24gaXMgdG8gc3ltbGluayBvciBjb3B5IHRoZSBFaWdlbiBmb2xkZXIgaW50byAvdXNyL2xvY2FsL2luY2x1ZGUvLiBUaGlzIHdheSwgeW91IGNhbiBjb21waWxlIHRoZSBwcm9ncmFtIHdpdGg6CisKK1xjb2RlIGcrKyBteV9wcm9ncmFtLmNwcCAtbyBteV9wcm9ncmFtIFxlbmRjb2RlCisKK1doZW4geW91IHJ1biB0aGUgcHJvZ3JhbSwgaXQgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKK1xpbmNsdWRlIFF1aWNrU3RhcnRfZXhhbXBsZS5vdXQKKworCitcc2VjdGlvbiBHZXR0aW5nU3RhcnRlZEV4cGxhbmF0aW9uIEV4cGxhbmF0aW9uIG9mIHRoZSBmaXJzdCBwcm9ncmFtCisKK1RoZSBFaWdlbiBoZWFkZXIgZmlsZXMgZGVmaW5lIG1hbnkgdHlwZXMsIGJ1dCBmb3Igc2ltcGxlIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgZW5vdWdoIHRvIHVzZSBvbmx5IHRoZSBcYyBNYXRyaXhYZCB0eXBlLiBUaGlzIHJlcHJlc2VudHMgYSBtYXRyaXggb2YgYXJiaXRyYXJ5IHNpemUgKGhlbmNlIHRoZSBcYyBYIGluIFxjIE1hdHJpeFhkKSwgaW4gd2hpY2ggZXZlcnkgZW50cnkgaXMgYSBcYyBkb3VibGUgKGhlbmNlIHRoZSBcYyBkIGluIFxjIE1hdHJpeFhkKS4gU2VlIHRoZSBccmVmIFF1aWNrUmVmX1R5cGVzICJxdWljayByZWZlcmVuY2UgZ3VpZGUiIGZvciBhbiBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIHlvdSBjYW4gdXNlIHRvIHJlcHJlc2VudCBhIG1hdHJpeC4KKworVGhlIFxjIEVpZ2VuL0RlbnNlIGhlYWRlciBmaWxlIGRlZmluZXMgYWxsIG1lbWJlciBmdW5jdGlvbnMgZm9yIHRoZSBNYXRyaXhYZCB0eXBlIGFuZCByZWxhdGVkIHR5cGVzIChzZWUgYWxzbyB0aGUgXHJlZiBRdWlja1JlZl9IZWFkZXJzICJ0YWJsZSBvZiBoZWFkZXIgZmlsZXMiKS4gQWxsIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgaGVhZGVyIGZpbGUgKGFuZCBvdGhlciBFaWdlbiBoZWFkZXIgZmlsZXMpIGFyZSBpbiB0aGUgXGMgRWlnZW4gbmFtZXNwYWNlLiAKKworVGhlIGZpcnN0IGxpbmUgb2YgdGhlIFxjIG1haW4gZnVuY3Rpb24gZGVjbGFyZXMgYSB2YXJpYWJsZSBvZiB0eXBlIFxjIE1hdHJpeFhkIGFuZCBzcGVjaWZpZXMgdGhhdCBpdCBpcyBhIG1hdHJpeCB3aXRoIDIgcm93cyBhbmQgMiBjb2x1bW5zICh0aGUgZW50cmllcyBhcmUgbm90IGluaXRpYWxpemVkKS4gVGhlIHN0YXRlbWVudCA8dHQ+bSgwLDApID0gMzwvdHQ+IHNldHMgdGhlIGVudHJ5IGluIHRoZSB0b3AtbGVmdCBjb3JuZXIgdG8gMy4gWW91IG5lZWQgdG8gdXNlIHJvdW5kIHBhcmVudGhlc2VzIHRvIHJlZmVyIHRvIGVudHJpZXMgaW4gdGhlIG1hdHJpeC4gQXMgdXN1YWwgaW4gY29tcHV0ZXIgc2NpZW5jZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpbmRleCBpcyAwLCBhcyBvcHBvc2VkIHRvIHRoZSBjb252ZW50aW9uIGluIG1hdGhlbWF0aWNzIHRoYXQgdGhlIGZpcnN0IGluZGV4IGlzIDEuCisKK1RoZSBmb2xsb3dpbmcgdGhyZWUgc3RhdGVtZW50cyBzZXRzIHRoZSBvdGhlciB0aHJlZSBlbnRyaWVzLiBUaGUgZmluYWwgbGluZSBvdXRwdXRzIHRoZSBtYXRyaXggXGMgbSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4KKworCitcc2VjdGlvbiBHZXR0aW5nU3RhcnRlZEV4YW1wbGUyIEV4YW1wbGUgMjogTWF0cmljZXMgYW5kIHZlY3RvcnMKKworSGVyZSBpcyBhbm90aGVyIGV4YW1wbGUsIHdoaWNoIGNvbWJpbmVzIG1hdHJpY2VzIHdpdGggdmVjdG9ycy4gQ29uY2VudHJhdGUgb24gdGhlIGxlZnQtaGFuZCBwcm9ncmFtIGZvciBub3c7IHdlIHdpbGwgdGFsayBhYm91dCB0aGUgcmlnaHQtaGFuZCBwcm9ncmFtIGxhdGVyLgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPlNpemUgc2V0IGF0IHJ1biB0aW1lOjwvdGg+PHRoPlNpemUgc2V0IGF0IGNvbXBpbGUgdGltZTo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcAorPC90ZD4KKzx0ZD4KK1xpbmNsdWRlIFF1aWNrU3RhcnRfZXhhbXBsZTJfZml4ZWQuY3BwCis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhlIG91dHB1dCBpcyBhcyBmb2xsb3dzOgorCitcaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUyX2R5bmFtaWMub3V0CisKKworXHNlY3Rpb24gR2V0dGluZ1N0YXJ0ZWRFeHBsYW5hdGlvbjIgRXhwbGFuYXRpb24gb2YgdGhlIHNlY29uZCBleGFtcGxlCisKK1RoZSBzZWNvbmQgZXhhbXBsZSBzdGFydHMgYnkgZGVjbGFyaW5nIGEgMy1ieS0zIG1hdHJpeCBcYyBtIHdoaWNoIGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZSBcbGluayBEZW5zZUJhc2U6OlJhbmRvbShJbmRleCxJbmRleCkgUmFuZG9tKCkgXGVuZGxpbmsgbWV0aG9kIHdpdGggcmFuZG9tIHZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAxLiBUaGUgbmV4dCBsaW5lIGFwcGxpZXMgYSBsaW5lYXIgbWFwcGluZyBzdWNoIHRoYXQgdGhlIHZhbHVlcyBhcmUgYmV0d2VlbiAxMCBhbmQgMTEwLiBUaGUgZnVuY3Rpb24gY2FsbCBcbGluayBEZW5zZUJhc2U6OkNvbnN0YW50KEluZGV4LEluZGV4LGNvbnN0IFNjYWxhciYpIE1hdHJpeFhkOjpDb25zdGFudFxlbmRsaW5rKDMsMywxLjIpIHJldHVybnMgYSAzLWJ5LTMgbWF0cml4IGV4cHJlc3Npb24gaGF2aW5nIGFsbCBjb2VmZmljaWVudHMgZXF1YWwgdG8gMS4yLiBUaGUgcmVzdCBpcyBzdGFuZGFyZCBhcml0aG1ldGljcy4KKworVGhlIG5leHQgbGluZSBvZiB0aGUgXGMgbWFpbiBmdW5jdGlvbiBpbnRyb2R1Y2VzIGEgbmV3IHR5cGU6IFxjIFZlY3RvclhkLiBUaGlzIHJlcHJlc2VudHMgYSAoY29sdW1uKSB2ZWN0b3Igb2YgYXJiaXRyYXJ5IHNpemUuIEhlcmUsIHRoZSB2ZWN0b3IgXGMgdiBpcyBjcmVhdGVkIHRvIGNvbnRhaW4gXGMgMyBjb2VmZmljaWVudHMgd2hpY2ggYXJlIGxlZnQgdW5pdGlhbGl6ZWQuIFRoZSBvbmUgYnV0IGxhc3QgbGluZSB1c2VzIHRoZSBzby1jYWxsZWQgY29tbWEtaW5pdGlhbGl6ZXIsIGV4cGxhaW5lZCBpbiBccmVmIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbiwgdG8gc2V0IGFsbCBjb2VmZmljaWVudHMgb2YgdGhlIHZlY3RvciBcYyB2IHRvIGJlIGFzIGZvbGxvd3M6CisKK1xmWwordiA9CitcYmVnaW57Ym1hdHJpeH0KKyAgMSBcXAorICAyIFxcCisgIDMKK1xlbmR7Ym1hdHJpeH0uCitcZl0KKworVGhlIGZpbmFsIGxpbmUgb2YgdGhlIHByb2dyYW0gbXVsdGlwbGllcyB0aGUgbWF0cml4IFxjIG0gd2l0aCB0aGUgdmVjdG9yIFxjIHYgYW5kIG91dHB1dHMgdGhlIHJlc3VsdC4KKworTm93IGxvb2sgYmFjayBhdCB0aGUgc2Vjb25kIGV4YW1wbGUgcHJvZ3JhbS4gV2UgcHJlc2VudGVkIHR3byB2ZXJzaW9ucyBvZiBpdC4gSW4gdGhlIHZlcnNpb24gaW4gdGhlIGxlZnQgY29sdW1uLCB0aGUgbWF0cml4IGlzIG9mIHR5cGUgXGMgTWF0cml4WGQgd2hpY2ggcmVwcmVzZW50cyBtYXRyaWNlcyBvZiBhcmJpdHJhcnkgc2l6ZS4gVGhlIHZlcnNpb24gaW4gdGhlIHJpZ2h0IGNvbHVtbiBpcyBzaW1pbGFyLCBleGNlcHQgdGhhdCB0aGUgbWF0cml4IGlzIG9mIHR5cGUgXGMgTWF0cml4M2QsIHdoaWNoIHJlcHJlc2VudHMgbWF0cmljZXMgb2YgYSBmaXhlZCBzaXplIChoZXJlIDMtYnktMykuIEJlY2F1c2UgdGhlIHR5cGUgYWxyZWFkeSBlbmNvZGVzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXgsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc3BlY2lmeSB0aGUgc2l6ZSBpbiB0aGUgY29uc3RydWN0b3I7IGNvbXBhcmUgPHR0Pk1hdHJpeFhkIG0oMywzKTwvdHQ+IHdpdGggPHR0Pk1hdHJpeDNkIG08L3R0Pi4gU2ltaWxhcmx5LCB3ZSBoYXZlIFxjIFZlY3RvclhkIG9uIHRoZSBsZWZ0IChhcmJpdHJhcnkgc2l6ZSkgdmVyc3VzIFxjIFZlY3RvcjNkIG9uIHRoZSByaWdodCAoZml4ZWQgc2l6ZSkuIE5vdGUgdGhhdCBoZXJlIHRoZSBjb2VmZmljaWVudHMgb2YgdmVjdG9yIFxjIHYgYXJlIGRpcmVjdGx5IHNldCBpbiB0aGUgY29uc3RydWN0b3IsIHRob3VnaCB0aGUgc2FtZSBzeW50YXggb2YgdGhlIGxlZnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvby4KKworVGhlIHVzZSBvZiBmaXhlZC1zaXplIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIGhhcyB0d28gYWR2YW50YWdlcy4gVGhlIGNvbXBpbGVyIGVtaXRzIGJldHRlciAoZmFzdGVyKSBjb2RlIGJlY2F1c2UgaXQga25vd3MgdGhlIHNpemUgb2YgdGhlIG1hdHJpY2VzIGFuZCB2ZWN0b3JzLiBTcGVjaWZ5aW5nIHRoZSBzaXplIGluIHRoZSB0eXBlIGFsc28gYWxsb3dzIGZvciBtb3JlIHJpZ29yb3VzIGNoZWNraW5nIGF0IGNvbXBpbGUtdGltZS4gRm9yIGluc3RhbmNlLCB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiBpZiB5b3UgdHJ5IHRvIG11bHRpcGx5IGEgXGMgTWF0cml4NGQgKGEgNC1ieS00IG1hdHJpeCkgd2l0aCBhIFxjIFZlY3RvcjNkIChhIHZlY3RvciBvZiBzaXplIDMpLiBIb3dldmVyLCB0aGUgdXNlIG9mIG1hbnkgdHlwZXMgaW5jcmVhc2VzIGNvbXBpbGF0aW9uIHRpbWUgYW5kIHRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlLiBUaGUgc2l6ZSBvZiB0aGUgbWF0cml4IG1heSBhbHNvIG5vdCBiZSBrbm93biBhdCBjb21waWxlLXRpbWUuIEEgcnVsZSBvZiB0aHVtYiBpcyB0byB1c2UgZml4ZWQtc2l6ZSBtYXRyaWNlcyBmb3Igc2l6ZSA0LWJ5LTQgYW5kIHNtYWxsZXIuCisKKworXHNlY3Rpb24gR2V0dGluZ1N0YXJ0ZWRDb25jbHVzaW9uIFdoZXJlIHRvIGdvIGZyb20gaGVyZT8KKworSXQncyB3b3J0aCB0YWtpbmcgdGhlIHRpbWUgdG8gcmVhZCB0aGUgIFxyZWYgVHV0b3JpYWxNYXRyaXhDbGFzcyAibG9uZyB0dXRvcmlhbCIuCisKK0hvd2V2ZXIgaWYgeW91IHRoaW5rIHlvdSBkb24ndCBuZWVkIGl0LCB5b3UgY2FuIGRpcmVjdGx5IHVzZSB0aGUgY2xhc3NlcyBkb2N1bWVudGF0aW9uIGFuZCBvdXIgXHJlZiBRdWlja1JlZlBhZ2UuCisKK1xsaSBcYiBOZXh0OiBccmVmIFR1dG9yaWFsTWF0cml4Q2xhc3MKKworKi8KKworfQorCmRpZmYgLS1naXQgYS9kb2MvU3BhcnNlTGluZWFyU3lzdGVtcy5kb3ggYi9kb2MvU3BhcnNlTGluZWFyU3lzdGVtcy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzM2I5MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9TcGFyc2VMaW5lYXJTeXN0ZW1zLmRveApAQCAtMCwwICsxLDIyOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFRvcGljU3BhcnNlU3lzdGVtcyBTb2x2aW5nIFNwYXJzZSBMaW5lYXIgU3lzdGVtcworSW4gRWlnZW4sIHRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgYXZhaWxhYmxlIHRvIHNvbHZlIGxpbmVhciBzeXN0ZW1zIHdoZW4gdGhlIGNvZWZmaWNpZW50IG1hdHJpeCBpcyBzcGFyc2UuIEJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBvZiBtYXRyaWNlcywgc3BlY2lhbCBjYXJlIHNob3VsZCBiZSB0YWtlbiBpbiBvcmRlciB0byBnZXQgYSBnb29kIHBlcmZvcm1hbmNlLiBTZWUgXHJlZiBUdXRvcmlhbFNwYXJzZSBmb3IgYSBkZXRhaWxlZCBpbnRyb2R1Y3Rpb24gYWJvdXQgc3BhcnNlIG1hdHJpY2VzIGluIEVpZ2VuLiBUaGlzIHBhZ2UgbGlzdHMgdGhlIHNwYXJzZSBzb2x2ZXJzIGF2YWlsYWJsZSBpbiBFaWdlbi4gVGhlIG1haW4gc3RlcHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0aGVzZSBsaW5lYXIgc29sdmVycyBhcmUgaW50cm9kdWNlZCBhcyB3ZWxsLiBEZXBlbmRpbmcgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1hdHJpeCwgdGhlIGRlc2lyZWQgYWNjdXJhY3ksIHRoZSBlbmQtdXNlciBpcyBhYmxlIHRvIHR1bmUgdGhvc2Ugc3RlcHMgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgaXRzIGNvZGUuIE5vdGUgdGhhdCBpdCBpcyBub3QgcmVxdWlyZWQgdG8ga25vdyBkZWVwbHkgd2hhdCdzIGhpZGluZyBiZWhpbmQgdGhlc2Ugc3RlcHM6IHRoZSBsYXN0IHNlY3Rpb24gcHJlc2VudHMgYSBiZW5jaG1hcmsgcm91dGluZSB0aGF0IGNhbiBiZSBlYXNpbHkgdXNlZCB0byBnZXQgYW4gaW5zaWdodCBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgYWxsIHRoZSBhdmFpbGFibGUgc29sdmVycy4gCisKK1xlaWdlbkF1dG9Ub2MKKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VTb2x2ZXJMaXN0IExpc3Qgb2Ygc3BhcnNlIHNvbHZlcnMKKworJUVpZ2VuIGN1cnJlbnRseSBwcm92aWRlcyBhIHdpZGUgc2V0IG9mIGJ1aWx0LWluIHNvbHZlcnMsIGFzIHdlbGwgYXMgd3JhcHBlcnMgdG8gZXh0ZXJuYWwgc29sdmVyIGxpYnJhcmllcy4KK1RoZXkgYXJlIHN1bW1hcml6ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZXM6CisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlU29sdmVyTGlzdF9EaXJlY3QgQnVpbHQtaW4gZGlyZWN0IHNvbHZlcnMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5DbGFzczwvdGg+PHRoPlNvbHZlciBraW5kPC90aD48dGg+TWF0cml4IGtpbmQ8L3RoPjx0aD5GZWF0dXJlcyByZWxhdGVkIHRvIHBlcmZvcm1hbmNlPC90aD4KKyAgICA8dGg+TGljZW5zZTwvdGg+PHRoIGNsYXNzPSJ3aWR0aDIwZW0iPjxwPk5vdGVzPC9wPjwvdGg+PC90cj4KKworPHRyPjx0ZD5TaW1wbGljaWFsTExUIFxuIDx0dD5cI2luY2x1ZGU8RWlnZW4vXGxpbmsgU3BhcnNlQ2hvbGVza3lfTW9kdWxlIFNwYXJzZUNob2xlc2t5XGVuZGxpbms+PC90dD48L3RkPjx0ZD5EaXJlY3QgTEx0IGZhY3Rvcml6YXRpb248L3RkPjx0ZD5TUEQ8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nPC90ZD4KKyAgICA8dGQ+TEdQTDwvdGQ+CisgICAgPHRkPlNpbXBsaWNpYWxMRExUIGlzIG9mdGVuIHByZWZlcmFibGU8L3RkPjwvdHI+CisKKzx0cj48dGQ+U2ltcGxpY2lhbExETFQgXG4gPHR0PlwjaW5jbHVkZTxFaWdlbi9cbGluayBTcGFyc2VDaG9sZXNreV9Nb2R1bGUgU3BhcnNlQ2hvbGVza3lcZW5kbGluaz48L3R0PjwvdGQ+PHRkPkRpcmVjdCBMREx0IGZhY3Rvcml6YXRpb248L3RkPjx0ZD5TUEQ8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nPC90ZD4KKyAgICA8dGQ+TEdQTDwvdGQ+CisgICAgPHRkPlJlY29tbWVuZGVkIGZvciB2ZXJ5IHNwYXJzZSBhbmQgbm90IHRvbyBsYXJnZSBwcm9ibGVtcyAoZS5nLiwgMkQgUG9pc3NvbiBlcS4pPC90ZD48L3RyPgorCis8dHI+PHRkPlNwYXJzZUxVIFxuIDx0dD5cI2luY2x1ZGU8RWlnZW4vXGxpbmsgU3BhcnNlTFVfTW9kdWxlIFNwYXJzZUxVXGVuZGxpbms+PC90dD48L3RkPiA8dGQ+TFUgZmFjdG9yaXphdGlvbiA8L3RkPgorICAgIDx0ZD5TcXVhcmUgPC90ZD48dGQ+RmlsbC1pbiByZWR1Y2luZywgTGV2ZXJhZ2UgZmFzdCBkZW5zZSBhbGdlYnJhPC90ZD4KKyAgICA8dGQ+TVBMMjwvdGQ+CisgICAgPHRkPm9wdGltaXplZCBmb3Igc21hbGwgYW5kIGxhcmdlIHByb2JsZW1zIHdpdGggaXJyZWd1bGFyIHBhdHRlcm5zIDwvdGQ+PC90cj4KKworPHRyPjx0ZD5TcGFyc2VRUiBcbiA8dHQ+XCNpbmNsdWRlPEVpZ2VuL1xsaW5rIFNwYXJzZVFSX01vZHVsZSBTcGFyc2VRUlxlbmRsaW5rPjwvdHQ+PC90ZD4gPHRkPiBRUiBmYWN0b3JpemF0aW9uPC90ZD4KKyAgICA8dGQ+QW55LCByZWN0YW5ndWxhcjwvdGQ+PHRkPiBGaWxsLWluIHJlZHVjaW5nPC90ZD4KKyAgICA8dGQ+TVBMMjwvdGQ+CisgICAgPHRkPnJlY29tbWVuZGVkIGZvciBsZWFzdC1zcXVhcmUgcHJvYmxlbXMsIGhhcyBhIGJhc2ljIHJhbmstcmV2ZWFsaW5nIGZlYXR1cmU8L3RkPjwvdHI+CisgPC90YWJsZT4KKworXHN1YnNlY3Rpb24gVHV0b3JpYWxTcGFyc2VTb2x2ZXJMaXN0X0l0ZXJhdGl2ZSBCdWlsdC1pbiBpdGVyYXRpdmUgc29sdmVycworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkNsYXNzPC90aD48dGg+U29sdmVyIGtpbmQ8L3RoPjx0aD5NYXRyaXgga2luZDwvdGg+PHRoPlN1cHBvcnRlZCBwcmVjb25kaXRpb25lcnMsIFtkZWZhdWx0XTwvdGg+CisgICAgPHRoPkxpY2Vuc2U8L3RoPjx0aCBjbGFzcz0id2lkdGgyMGVtIj48cD5Ob3RlczwvcD48L3RoPjwvdHI+CisKKzx0cj48dGQ+Q29uanVnYXRlR3JhZGllbnQgXG4gPHR0PlwjaW5jbHVkZTxFaWdlbi9cbGluayBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzXGVuZGxpbms+PC90dD48L3RkPiA8dGQ+Q2xhc3NpYyBpdGVyYXRpdmUgQ0c8L3RkPjx0ZD5TUEQ8L3RkPgorICAgIDx0ZD5JZGVudGl0eVByZWNvbmRpdGlvbmVyLCBbRGlhZ29uYWxQcmVjb25kaXRpb25lcl0sIEluY29tcGxldGVDaG9sZXNreTwvdGQ+CisgICAgPHRkPk1QTDI8L3RkPgorICAgIDx0ZD5SZWNvbW1lbmRlZCBmb3IgbGFyZ2Ugc3ltbWV0cmljIHByb2JsZW1zIChlLmcuLCAzRCBQb2lzc29uIGVxLik8L3RkPjwvdHI+CisKKzx0cj48dGQ+TGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQgXG4gPHR0PlwjaW5jbHVkZTxFaWdlbi9cbGluayBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzXGVuZGxpbms+PC90dD48L3RkPjx0ZD5DRyBmb3IgcmVjdGFuZ3VsYXIgbGVhc3Qtc3F1YXJlIHByb2JsZW08L3RkPjx0ZD5SZWN0YW5ndWxhcjwvdGQ+CisgICAgPHRkPklkZW50aXR5UHJlY29uZGl0aW9uZXIsIFtMZWFzdFNxdWFyZURpYWdvbmFsUHJlY29uZGl0aW9uZXJdPC90ZD4KKyAgICA8dGQ+TVBMMjwvdGQ+CisgICAgPHRkPlNvbHZlIGZvciBtaW4gfEEnQXgtYnxeMiB3aXRob3V0IGZvcm1pbmcgQSdBPC90ZD48L3RyPgorCis8dHI+PHRkPkJpQ0dTVEFCIFxuIDx0dD5cI2luY2x1ZGU8RWlnZW4vXGxpbmsgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUgSXRlcmF0aXZlTGluZWFyU29sdmVyc1xlbmRsaW5rPjwvdHQ+PC90ZD48dGQ+SXRlcmF0aXZlIHN0YWJpbGl6ZWQgYmktY29uanVnYXRlIGdyYWRpZW50PC90ZD48dGQ+U3F1YXJlPC90ZD4KKyAgICA8dGQ+SWRlbnRpdHlQcmVjb25kaXRpb25lciwgW0RpYWdvbmFsUHJlY29uZGl0aW9uZXJdLCBJbmNvbXBsZXRlTFVUPC90ZD4KKyAgICA8dGQ+TVBMMjwvdGQ+CisgICAgPHRkPlRvIHNwZWVkdXAgdGhlIGNvbnZlcmdlbmNlLCB0cnkgaXQgd2l0aCB0aGUgXHJlZiBJbmNvbXBsZXRlTFVUIHByZWNvbmRpdGlvbmVyLjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlU29sdmVyTGlzdF9XcmFwcGVyIFdyYXBwZXJzIHRvIGV4dGVybmFsIHNvbHZlcnMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5DbGFzczwvdGg+PHRoPk1vZHVsZTwvdGg+PHRoPlNvbHZlciBraW5kPC90aD48dGg+TWF0cml4IGtpbmQ8L3RoPjx0aD5GZWF0dXJlcyByZWxhdGVkIHRvIHBlcmZvcm1hbmNlPC90aD4KKyAgICA8dGg+RGVwZW5kZW5jaWVzLExpY2Vuc2U8L3RoPjx0aCBjbGFzcz0id2lkdGgyMGVtIj48cD5Ob3RlczwvcD48L3RoPjwvdHI+Cis8dHI+PHRkPlBhc3RpeExMVCBcbiBQYXN0aXhMRExUIFxuIFBhc3RpeExVPC90ZD48dGQ+XGxpbmsgUGFTdGlYU3VwcG9ydF9Nb2R1bGUgUGFTdGlYU3VwcG9ydCBcZW5kbGluazwvdGQ+PHRkPkRpcmVjdCBMTHQsIExETHQsIExVIGZhY3Rvcml6YXRpb25zPC90ZD48dGQ+U1BEIFxuIFNQRCBcbiBTcXVhcmU8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nLCBMZXZlcmFnZSBmYXN0IGRlbnNlIGFsZ2VicmEsIE11bHRpdGhyZWFkaW5nPC90ZD4KKyAgICA8dGQ+UmVxdWlyZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9wYXN0aXguZ2ZvcmdlLmlucmlhLmZyIj5QYVN0aVg8L2E+IHBhY2thZ2UsIFxiIENlQ0lMTC1DIDwvdGQ+CisgICAgPHRkPm9wdGltaXplZCBmb3IgdG91Z2ggcHJvYmxlbXMgYW5kIHN5bW1ldHJpYyBwYXR0ZXJuczwvdGQ+PC90cj4KKzx0cj48dGQ+Q2hvbG1vZFN1cGVybm9kYWxMTFQ8L3RkPjx0ZD5cbGluayBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUgQ2hvbG1vZFN1cHBvcnQgXGVuZGxpbms8L3RkPjx0ZD5EaXJlY3QgTEx0IGZhY3Rvcml6YXRpb248L3RkPjx0ZD5TUEQ8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nLCBMZXZlcmFnZSBmYXN0IGRlbnNlIGFsZ2VicmE8L3RkPgorICAgIDx0ZD5SZXF1aXJlcyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5zdWl0ZXNwYXJzZS5jb20iPlN1aXRlU3BhcnNlPC9hPiBwYWNrYWdlLCBcYiBHUEwgPC90ZD4KKyAgICA8dGQ+PC90ZD48L3RyPgorPHRyPjx0ZD5VbWZQYWNrTFU8L3RkPjx0ZD5cbGluayBVbWZQYWNrU3VwcG9ydF9Nb2R1bGUgVW1mUGFja1N1cHBvcnQgXGVuZGxpbms8L3RkPjx0ZD5EaXJlY3QgTFUgZmFjdG9yaXphdGlvbjwvdGQ+PHRkPlNxdWFyZTwvdGQ+PHRkPkZpbGwtaW4gcmVkdWNpbmcsIExldmVyYWdlIGZhc3QgZGVuc2UgYWxnZWJyYTwvdGQ+CisgICAgPHRkPlJlcXVpcmVzIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnN1aXRlc3BhcnNlLmNvbSI+U3VpdGVTcGFyc2U8L2E+IHBhY2thZ2UsIFxiIEdQTCA8L3RkPgorICAgIDx0ZD48L3RkPjwvdHI+Cis8dHI+PHRkPlN1cGVyTFU8L3RkPjx0ZD5cbGluayBTdXBlckxVU3VwcG9ydF9Nb2R1bGUgU3VwZXJMVVN1cHBvcnQgXGVuZGxpbms8L3RkPjx0ZD5EaXJlY3QgTFUgZmFjdG9yaXphdGlvbjwvdGQ+PHRkPlNxdWFyZTwvdGQ+PHRkPkZpbGwtaW4gcmVkdWNpbmcsIExldmVyYWdlIGZhc3QgZGVuc2UgYWxnZWJyYTwvdGQ+CisgICAgPHRkPlJlcXVpcmVzIHRoZSA8YSBocmVmPSJodHRwOi8vY3JkLWxlZ2FjeS5sYmwuZ292L354aWFveWUvU3VwZXJMVS8iPlN1cGVyTFU8L2E+IGxpYnJhcnksIChCU0QtbGlrZSk8L3RkPgorICAgIDx0ZD48L3RkPjwvdHI+Cis8dHI+PHRkPlNQUVI8L3RkPjx0ZD5cbGluayBTUFFSU3VwcG9ydF9Nb2R1bGUgU1BRUlN1cHBvcnQgXGVuZGxpbmsgIDwvdGQ+IDx0ZD4gUVIgZmFjdG9yaXphdGlvbiA8L3RkPiAKKyAgICA8dGQ+IEFueSwgcmVjdGFuZ3VsYXI8L3RkPjx0ZD5maWxsLWluIHJlZHVjaW5nLCBtdWx0aXRocmVhZGVkLCBmYXN0IGRlbnNlIGFsZ2VicmE8L3RkPgorICAgIDx0ZD4gcmVxdWlyZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3VpdGVzcGFyc2UuY29tIj5TdWl0ZVNwYXJzZTwvYT4gcGFja2FnZSwgXGIgR1BMIDwvdGQ+PHRkPnJlY29tbWVuZGVkIGZvciBsaW5lYXIgbGVhc3Qtc3F1YXJlcyBwcm9ibGVtcywgaGFzIGEgcmFuay1yZXZlYWxpbmcgZmVhdHVyZTwvdHI+Cis8dHI+PHRkPlBhcmRpc29MTFQgXG4gUGFyZGlzb0xETFQgXG4gUGFyZGlzb0xVPC90ZD48dGQ+XGxpbmsgUGFyZGlzb1N1cHBvcnRfTW9kdWxlIFBhcmRpc29TdXBwb3J0IFxlbmRsaW5rPC90ZD48dGQ+RGlyZWN0IExMdCwgTERMdCwgTFUgZmFjdG9yaXphdGlvbnM8L3RkPjx0ZD5TUEQgXG4gU1BEIFxuIFNxdWFyZTwvdGQ+PHRkPkZpbGwtaW4gcmVkdWNpbmcsIExldmVyYWdlIGZhc3QgZGVuc2UgYWxnZWJyYSwgTXVsdGl0aHJlYWRpbmc8L3RkPgorICAgIDx0ZD5SZXF1aXJlcyB0aGUgPGEgaHJlZj0iaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvQ291bnRlci9yZWRpcmVjdF90b19ta2wucGhwIj5JbnRlbCBNS0w8L2E+IHBhY2thZ2UsIFxiIFByb3ByaWV0YXJ5IDwvdGQ+CisgICAgPHRkPm9wdGltaXplZCBmb3IgdG91Z2ggcHJvYmxlbXMgcGF0dGVybnMsIHNlZSBhbHNvIFxsaW5rIFRvcGljVXNpbmdJbnRlbE1LTCB1c2luZyBNS0wgd2l0aCBFaWdlbiBcZW5kbGluazwvdGQ+PC90cj4KKzwvdGFibGU+CisKK0hlcmUgXGMgU1BEIG1lYW5zIHN5bW1ldHJpYyBwb3NpdGl2ZSBkZWZpbml0ZS4KKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VTb2x2ZXJDb25jZXB0IFNwYXJzZSBzb2x2ZXIgY29uY2VwdAorCitBbGwgdGhlc2Ugc29sdmVycyBmb2xsb3cgdGhlIHNhbWUgZ2VuZXJhbCBjb25jZXB0LgorSGVyZSBpcyBhIHR5cGljYWwgYW5kIGdlbmVyYWwgZXhhbXBsZToKK1xjb2RlCisjaW5jbHVkZSA8RWlnZW4vUmVxdWlyZWRNb2R1bGVOYW1lPgorLy8gLi4uCitTcGFyc2VNYXRyaXg8ZG91YmxlPiBBOworLy8gZmlsbCBBCitWZWN0b3JYZCBiLCB4OworLy8gZmlsbCBiCisvLyBzb2x2ZSBBeCA9IGIKK1NvbHZlckNsYXNzTmFtZTxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcjsKK3NvbHZlci5jb21wdXRlKEEpOworaWYoc29sdmVyLmluZm8oKSE9U3VjY2VzcykgeworICAvLyBkZWNvbXBvc2l0aW9uIGZhaWxlZAorICByZXR1cm47Cit9Cit4ID0gc29sdmVyLnNvbHZlKGIpOworaWYoc29sdmVyLmluZm8oKSE9U3VjY2VzcykgeworICAvLyBzb2x2aW5nIGZhaWxlZAorICByZXR1cm47Cit9CisvLyBzb2x2ZSBmb3IgYW5vdGhlciByaWdodCBoYW5kIHNpZGU6Cit4MSA9IHNvbHZlci5zb2x2ZShiMSk7CitcZW5kY29kZQorCitGb3IgXGMgU1BEIHNvbHZlcnMsIGEgc2Vjb25kIG9wdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50IGFsbG93cyB0byBzcGVjaWZ5IHdoaWNoIHRyaWFuZ3VsYXIgcGFydCBoYXZlIHRvIGJlIHVzZWQsIGUuZy46CisKK1xjb2RlCisjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlTGluZWFyU29sdmVycz4KKworQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4PGRvdWJsZT4sIEVpZ2VuOjpVcHBlcj4gc29sdmVyOworeCA9IHNvbHZlci5jb21wdXRlKEEpLnNvbHZlKGIpOworXGVuZGNvZGUKK0luIHRoZSBhYm92ZSBleGFtcGxlLCBvbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGlucHV0IG1hdHJpeCBBIGlzIGNvbnNpZGVyZWQgZm9yIHNvbHZpbmcuIFRoZSBvcHBvc2l0ZSB0cmlhbmdsZSBtaWdodCBlaXRoZXIgYmUgZW1wdHkgb3IgY29udGFpbiBhcmJpdHJhcnkgdmFsdWVzLgorCitJbiB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSBwcm9ibGVtcyB3aXRoIHRoZSBzYW1lIHNwYXJzaXR5IHBhdHRlcm4gaGF2ZSB0byBiZSBzb2x2ZWQsIHRoZW4gdGhlICJjb21wdXRlIiBzdGVwIGNhbiBiZSBkZWNvbXBvc2VkIGFzIGZvbGxvdzoKK1xjb2RlCitTb2x2ZXJDbGFzc05hbWU8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBzb2x2ZXI7Citzb2x2ZXIuYW5hbHl6ZVBhdHRlcm4oQSk7ICAgLy8gZm9yIHRoaXMgc3RlcCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiBBIGFyZSBub3QgdXNlZAorc29sdmVyLmZhY3Rvcml6ZShBKTsKK3gxID0gc29sdmVyLnNvbHZlKGIxKTsKK3gyID0gc29sdmVyLnNvbHZlKGIyKTsKKy4uLgorQSA9IC4uLjsgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmeSB0aGUgdmFsdWVzIG9mIHRoZSBub256ZXJvcyBvZiBBLCB0aGUgbm9uemVyb3MgcGF0dGVybiBtdXN0IHN0YXkgdW5jaGFuZ2VkCitzb2x2ZXIuZmFjdG9yaXplKEEpOworeDEgPSBzb2x2ZXIuc29sdmUoYjEpOworeDIgPSBzb2x2ZXIuc29sdmUoYjIpOworLi4uCitcZW5kY29kZQorVGhlIGNvbXB1dGUoKSBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGJvdGggYW5hbHl6ZVBhdHRlcm4oKSBhbmQgZmFjdG9yaXplKCkuCisKK0VhY2ggc29sdmVyIHByb3ZpZGVzIHNvbWUgc3BlY2lmaWMgZmVhdHVyZXMsIHN1Y2ggYXMgZGV0ZXJtaW5hbnQsIGFjY2VzcyB0byB0aGUgZmFjdG9ycywgY29udHJvbHMgb2YgdGhlIGl0ZXJhdGlvbnMsIGFuZCBzbyBvbi4KK01vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlIGluIHRoZSBkb2N1bWVudGF0aW9ucyBvZiB0aGUgcmVzcGVjdGl2ZSBjbGFzc2VzLgorCitGaW5hbGx5LCBtb3N0IG9mIHRoZSBpdGVyYXRpdmUgc29sdmVycywgY2FuIGFsc28gYmUgdXNlZCBpbiBhIFxiIG1hdHJpeC1mcmVlIGNvbnRleHQsIHNlZSB0aGUgZm9sbG93aW5nIFxsaW5rIE1hdHJpeGZyZWVTb2x2ZXJFeGFtcGxlIGV4YW1wbGUgXGVuZGxpbmsuCisKK1xzZWN0aW9uIFRoZVNwYXJzZUNvbXB1dGUgVGhlIENvbXB1dGUgU3RlcAorSW4gdGhlIGNvbXB1dGUoKSBmdW5jdGlvbiwgdGhlIG1hdHJpeCBpcyBnZW5lcmFsbHkgZmFjdG9yaXplZDogTExUIGZvciBzZWxmLWFkam9pbnQgbWF0cmljZXMsIExETFQgZm9yIGdlbmVyYWwgaGVybWl0aWFuIG1hdHJpY2VzLCBMVSBmb3Igbm9uIGhlcm1pdGlhbiBtYXRyaWNlcyBhbmQgUVIgZm9yIHJlY3Rhbmd1bGFyIG1hdHJpY2VzLiBUaGVzZSBhcmUgdGhlIHJlc3VsdHMgb2YgdXNpbmcgZGlyZWN0IHNvbHZlcnMuIEZvciB0aGlzIGNsYXNzIG9mIHNvbHZlcnMgcHJlY2lzZWx5LCB0aGUgY29tcHV0ZSBzdGVwIGlzIGZ1cnRoZXIgc3ViZGl2aWRlZCBpbnRvIGFuYWx5emVQYXR0ZXJuKCkgYW5kIGZhY3Rvcml6ZSgpLiAKKworVGhlIGdvYWwgb2YgYW5hbHl6ZVBhdHRlcm4oKSBpcyB0byByZW9yZGVyIHRoZSBub256ZXJvIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXgsIHN1Y2ggdGhhdCB0aGUgZmFjdG9yaXphdGlvbiBzdGVwIGNyZWF0ZXMgbGVzcyBmaWxsLWluLiBUaGlzIHN0ZXAgZXhwbG9pdHMgb25seSB0aGUgc3RydWN0dXJlIG9mIHRoZSBtYXRyaXguIEhlbmNlLCB0aGUgcmVzdWx0cyBvZiB0aGlzIHN0ZXAgY2FuIGJlIHVzZWQgZm9yIG90aGVyIGxpbmVhciBzeXN0ZW1zIHdoZXJlIHRoZSBtYXRyaXggaGFzIHRoZSBzYW1lIHN0cnVjdHVyZS4gTm90ZSBob3dldmVyIHRoYXQgc29tZXRpbWVzLCBzb21lIGV4dGVybmFsIHNvbHZlcnMgKGxpa2UgU3VwZXJMVSkgcmVxdWlyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIG1hdHJpeCBhcmUgc2V0IGluIHRoaXMgc3RlcCwgZm9yIGluc3RhbmNlIHRvIGVxdWlsaWJyYXRlIHRoZSByb3dzIGFuZCBjb2x1bW5zIG9mIHRoZSBtYXRyaXguIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgcmVzdWx0cyBvZiB0aGlzIHN0ZXAgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggb3RoZXIgbWF0cmljZXMuCisKK0VpZ2VuIHByb3ZpZGVzIGEgbGltaXRlZCBzZXQgb2YgbWV0aG9kcyB0byByZW9yZGVyIHRoZSBtYXRyaXggaW4gdGhpcyBzdGVwLCBlaXRoZXIgYnVpbHQtaW4gKENPTEFNRCwgQU1EKSBvciBleHRlcm5hbCAoTUVUSVMpLiBUaGVzZSBtZXRob2RzIGFyZSBzZXQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3Qgb2YgdGhlIHNvbHZlciA6CitcY29kZQorRGlyZWN0U29sdmVyQ2xhc3NOYW1lPFNwYXJzZU1hdHJpeDxkb3VibGU+LCBPcmRlcmluZ01ldGhvZDxJbmRleFR5cGU+ID4gc29sdmVyOworXGVuZGNvZGUgCisKK1NlZSB0aGUgXGxpbmsgT3JkZXJpbmdNZXRob2RzX01vZHVsZSBPcmRlcmluZ01ldGhvZHMgbW9kdWxlIFxlbmRsaW5rIGZvciB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWV0aG9kcyBhbmQgdGhlIGFzc29jaWF0ZWQgb3B0aW9ucy4gCisKK0luIGZhY3Rvcml6ZSgpLCB0aGUgZmFjdG9ycyBvZiB0aGUgY29lZmZpY2llbnQgbWF0cml4IGFyZSBjb21wdXRlZC4gVGhpcyBzdGVwIHNob3VsZCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZSB2YWx1ZXMgb2YgdGhlIG1hdHJpeCBjaGFuZ2UuIEhvd2V2ZXIsIHRoZSBzdHJ1Y3R1cmFsIHBhdHRlcm4gb2YgdGhlIG1hdHJpeCBzaG91bGQgbm90IGNoYW5nZSBiZXR3ZWVuIG11bHRpcGxlIGNhbGxzLiAKKworRm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzLCB0aGUgY29tcHV0ZSBzdGVwIGlzIHVzZWQgdG8gZXZlbnR1YWxseSBzZXR1cCBhIHByZWNvbmRpdGlvbmVyLiBGb3IgaW5zdGFuY2UsIHdpdGggdGhlIElMVVQgcHJlY29uZGl0aW9uZXIsIHRoZSBpbmNvbXBsZXRlIGZhY3RvcnMgTCBhbmQgVSBhcmUgY29tcHV0ZWQgaW4gdGhpcyBzdGVwLiBSZW1lbWJlciB0aGF0LCBiYXNpY2FsbHksIHRoZSBnb2FsIG9mIHRoZSBwcmVjb25kaXRpb25lciBpcyB0byBzcGVlZHVwIHRoZSBjb252ZXJnZW5jZSBvZiBhbiBpdGVyYXRpdmUgbWV0aG9kIGJ5IHNvbHZpbmcgYSBtb2RpZmllZCBsaW5lYXIgc3lzdGVtIHdoZXJlIHRoZSBjb2VmZmljaWVudCBtYXRyaXggaGFzIG1vcmUgY2x1c3RlcmVkIGVpZ2VudmFsdWVzLiBGb3IgcmVhbCBwcm9ibGVtcywgYW4gaXRlcmF0aXZlIHNvbHZlciBzaG91bGQgYWx3YXlzIGJlIHVzZWQgd2l0aCBhIHByZWNvbmRpdGlvbmVyLiBJbiBFaWdlbiwgYSBwcmVjb25kaXRpb25lciBpcyAgc2VsZWN0ZWQgYnkgc2ltcGx5IGFkZGluZyBpdCBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciB0byB0aGUgaXRlcmF0aXZlIHNvbHZlciBvYmplY3QuIAorXGNvZGUKK0l0ZXJhdGl2ZVNvbHZlckNsYXNzTmFtZTxTcGFyc2VNYXRyaXg8ZG91YmxlPiwgUHJlY29uZGl0aW9uZXJOYW1lPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc29sdmVyOyAKK1xlbmRjb2RlCitUaGUgbWVtYmVyIGZ1bmN0aW9uIHByZWNvbmRpdGlvbmVyKCkgcmV0dXJucyBhIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBwcmVjb25kaXRpb25lciAKKyB0byBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIGl0LiBTZWUgdGhlIFxsaW5rIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZSBzb2x2ZXJzIG1vZHVsZSBcZW5kbGluayBhbmQgdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBjbGFzcyBmb3IgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1ldGhvZHMuCisKK1xzZWN0aW9uIFRoZVNwYXJzZVNvbHZlIFRoZSBTb2x2ZSBzdGVwCitUaGUgc29sdmUoKSBmdW5jdGlvbiBjb21wdXRlcyB0aGUgc29sdXRpb24gb2YgdGhlIGxpbmVhciBzeXN0ZW1zIHdpdGggb25lIG9yIG1hbnkgcmlnaHQgaGFuZCBzaWRlcy4KK1xjb2RlCitYID0gc29sdmVyLnNvbHZlKEIpOworXGVuZGNvZGUgCitIZXJlLCBCICBjYW4gYmUgYSB2ZWN0b3Igb3IgYSBtYXRyaXggd2hlcmUgdGhlIGNvbHVtbnMgZm9ybSB0aGUgZGlmZmVyZW50IHJpZ2h0IGhhbmQgc2lkZXMuIFRoZSBzb2x2ZSgpIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBhcyB3ZWxsLCBmb3IgaW5zdGFuY2Ugd2hlbiBhbGwgdGhlIHJpZ2h0IGhhbmQgc2lkZXMgYXJlIG5vdCBhdmFpbGFibGUgYXQgb25jZS4gCitcY29kZQoreDEgPSBzb2x2ZXIuc29sdmUoYjEpOworLy8gR2V0IHRoZSBzZWNvbmQgcmlnaHQgaGFuZCBzaWRlIGIyCit4MiA9IHNvbHZlci5zb2x2ZShiMik7IAorLy8gIC4uLgorXGVuZGNvZGUKK0ZvciBkaXJlY3QgbWV0aG9kcywgdGhlIHNvbHV0aW9uIGFyZSBjb21wdXRlZCBhdCB0aGUgbWFjaGluZSBwcmVjaXNpb24uIFNvbWV0aW1lcywgdGhlIHNvbHV0aW9uIG5lZWQgbm90IGJlIHRvbyBhY2N1cmF0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgaXRlcmF0aXZlIG1ldGhvZHMgYXJlIG1vcmUgc3VpdGFibGUgYW5kIHRoZSBkZXNpcmVkIGFjY3VyYWN5IGNhbiBiZSBzZXQgYmVmb3JlIHRoZSBzb2x2ZSBzdGVwIHVzaW5nIFxiIHNldFRvbGVyYW5jZSgpLiBGb3IgYWxsIHRoZSBhdmFpbGFibGUgZnVuY3Rpb25zLCBwbGVhc2UsIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBcbGluayBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZSBJdGVyYXRpdmUgc29sdmVycyBtb2R1bGUgXGVuZGxpbmsuIAorCitcc2VjdGlvbiBCZW5jaG1hcmtSb3V0aW5lCitNb3N0IG9mIHRoZSB0aW1lLCBhbGwgeW91IG5lZWQgaXMgdG8ga25vdyBob3cgbXVjaCB0aW1lIGl0IHdpbGwgdGFrZSB0byBzb2x2ZSB5b3VyIHN5c3RlbSwgYW5kIGhvcGVmdWxseSwgd2hhdCBpcyB0aGUgbW9zdCBzdWl0YWJsZSBzb2x2ZXIuIEluIEVpZ2VuLCB3ZSBwcm92aWRlIGEgYmVuY2htYXJrIHJvdXRpbmUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBJdCBpcyB2ZXJ5IGVhc3kgdG8gdXNlLiBJbiB0aGUgYnVpbGQgZGlyZWN0b3J5LCBuYXZpZ2F0ZSB0byBiZW5jaC9zcGJlbmNoIGFuZCBjb21waWxlIHRoZSByb3V0aW5lIGJ5IHR5cGluZyBcYiBtYWtlIFxlIHNwYmVuY2hzb2x2ZXIuIFJ1biBpdCB3aXRoIC0taGVscCBvcHRpb24gdG8gZ2V0IHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgb3B0aW9ucy4gQmFzaWNhbGx5LCB0aGUgbWF0cmljZXMgdG8gdGVzdCBzaG91bGQgYmUgaW4gPGEgaHJlZj0iaHR0cDovL21hdGgubmlzdC5nb3YvTWF0cml4TWFya2V0L2Zvcm1hdHMuaHRtbCI+TWF0cml4TWFya2V0IENvb3JkaW5hdGUgZm9ybWF0PC9hPiwgYW5kIHRoZSByb3V0aW5lIHJldHVybnMgdGhlIHN0YXRpc3RpY3MgZnJvbSBhbGwgYXZhaWxhYmxlIHNvbHZlcnMgaW4gRWlnZW4uCisKK1RvIGV4cG9ydCB5b3VyIG1hdHJpY2VzIGFuZCByaWdodC1oYW5kLXNpZGUgdmVjdG9ycyBpbiB0aGUgbWF0cml4LW1hcmtldCBmb3JtYXQsIHlvdSBjYW4gdGhlIHRoZSB1bnN1cHBvcnRlZCBTcGFyc2VFeHRyYSBtb2R1bGU6CitcY29kZQorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwYXJzZUV4dHJhPgorLi4uCitFaWdlbjo6c2F2ZU1hcmtldChBLCAiZmlsZW5hbWUubXR4Iik7CitFaWdlbjo6c2F2ZU1hcmtldChBLCAiZmlsZW5hbWVfU1BELm10eCIsIEVpZ2VuOjpTeW1tZXRyaWMpOyAvLyBpZiBBIGlzIHN5bW1ldHJpYy1wb3NpdGl2ZS1kZWZpbml0ZQorRWlnZW46OnNhdmVNYXJrZXRWZWN0b3IoQiwgImZpbGVuYW1lX2IubXR4Iik7CitcZW5kY29kZQorCitUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFuIGV4YW1wbGUgb2YgWE1MIHN0YXRpc3RpY3MgZnJvbSBzZXZlcmFsIEVpZ2VuIGJ1aWx0LWluIGFuZCBleHRlcm5hbCBzb2x2ZXJzLiAKKzxUQUJMRSBib3JkZXI9IjEiPgorIDxUUj48VEg+TWF0cml4IDxUSD4gTiA8VEg+IE5OWiA8VEg+ICA8VEggPiBVTUZQQUNLIDxUSCA+IFNVUEVSTFUgPFRIID4gUEFTVElYIExVIDxUSCA+QmlDR1NUQUIgPFRIID4gQmlDR1NUQUIrSUxVVCA8VEggPkdNUkVTK0lMVVQ8VEggPiBMRExUIDxUSD4gQ0hPTE1PRCBMRExUIDxUSCA+IFBBU1RJWCBMRExUIDxUSCA+IExMVCA8VEggPiBDSE9MTU9EIFNQIExMVCA8VEggPiBDSE9MTU9EIExMVCA8VEggPiBQQVNUSVggTExUIDxUSD4gQ0c8L1RSPgorPFRSPjxUSCByb3dzcGFuPSI0Ij52ZWN0b3JfZ3JhcGhpY3MgPFREIHJvd3NwYW49IjQiPiAxMjg1NSA8VEQgcm93c3Bhbj0iNCI+IDcyMDY5IDxUSD5Db21wdXRlIFRpbWUgPFREPjAuMDI1NDU0OTxURD4wLjAyMTU2Nzc8VEQ+MC4wNzAxODI3PFREPjAuMDAwMTUzMzg4PFREPjAuMDE0MDEwNzxURD4wLjAxNTM3MDk8VEQ+MC4wMTAxNjAxPFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+MC4wMDkzMDUwMjxURD4wLjA2NDk2ODkKKzxUUj48VEg+U29sdmUgVGltZSA8VEQ+MC4wMDMzNzgzNTxURD4wLjAwMDk1MTgyNjxURD4wLjAwNDg0MzczPFREPjAuMDM3NDg4NjxURD4wLjAwNDY0NDU8VEQ+MC4wMDg0Nzc1NDxURD4wLjAwMDU0MTgxMzxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAwMjkzNjk2PFREPjAuMDA0ODUzNzYKKzxUUj48VEg+VG90YWwgVGltZSA8VEQ+MC4wMjg4MzMzPFREPjAuMDIyNTE5NTxURD4wLjA3NTAyNjU8VEQ+MC4wMzc2NDI8VEQ+MC4wMTg2NTUyPFREPjAuMDIzODQ4NDxURD4wLjAxMDcwMTk8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4wLjAwOTU5ODcxPFREPjAuMDY5ODIyNworPFRSPjxUSD5FcnJvcihJdGVyKSA8VEQ+IDEuMjk5ZS0xNiA8VEQ+IDIuMDQyMDdlLTE2IDxURD4gNC44MzM5M2UtMTUgPFREPiAzLjk0ODU2ZS0xMSAoODApICA8VEQ+IDEuMDM4NjFlLTEyICgzKSAgPFREPiA1LjgxMDg4ZS0xNCAoNikgIDxURD4gMS45NzU3OGUtMTYgPFREPiAxLjgzOTI3ZS0xNiA8VEQ+IDQuMjQxMTVlLTE1Cis8VFI+PFRIIHJvd3NwYW49IjQiPnBvaXNzb25fU1BEIDxURCByb3dzcGFuPSI0Ij4gMTk3ODggPFREIHJvd3NwYW49IjQiPiAzMDgyMzIgPFRIPkNvbXB1dGUgVGltZSA8VEQ+MC40MjUwMjY8VEQ+MS44MjM3ODxURD4wLjYxNzM2NzxURD4wLjAwMDQ3ODkyMTxURD4xLjM0MDAxPFREPjEuMzM0NzE8VEQ+MC43OTY0MTk8VEQ+MC44NTc1NzM8VEQ+MC40NzMwMDc8VEQ+MC44MTQ4MjY8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4wLjE4NDcxOTxURD4wLjg2MTU1NTxURD4wLjQ3MDU1OTxURD4wLjAwMDQ1ODE4OAorPFRSPjxUSD5Tb2x2ZSBUaW1lIDxURD4wLjAyODAwNTM8VEQ+MC4wMTk0NDAyPFREPjAuMDI2ODc0NzxURD4wLjI0OTQzNzxURD4wLjA1NDg0NDQ8VEQ+MC4wOTI2OTkxPFREPjAuMDA4NTAyMDQ8VEQ+MC4wMDUzMTcxPFREPjAuMDI1ODkzMjxURD4wLjAwODc0NjAzPFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+MC4wMDU3ODE1NTxURD4wLjAwNTMwMzYxPFREPjAuMDI0ODk0MjxURD4wLjIzOTA5MworPFRSPjxUSD5Ub3RhbCBUaW1lIDxURD4wLjQ1MzAzMTxURD4xLjg0MzIyPFREPjAuNjQ0MjQxPFREPjAuMjQ5OTE2PFREPjEuMzk0ODY8VEQ+MS40Mjc0MTxURD4wLjgwNDkyMTxURD4wLjg2Mjg5MTxURD4wLjQ5ODk8VEQ+MC44MjM1NzI8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4wLjE5MDUwMTxURD4wLjg2Njg1OTxURD4wLjQ5NTQ1MzxURD4wLjIzOTU1MQorPFRSPjxUSD5FcnJvcihJdGVyKSA8VEQ+IDQuNjcxNDZlLTE2IDxURD4gMS4wNjhlLTE1IDxURD4gMS4zMzk3ZS0xNSA8VEQ+IDYuMjkyMzNlLTExICgyMDEpICA8VEQ+IDMuNjg1MjdlLTExICg2KSAgPFREPiAzLjMxNjhlLTE1ICgxNikgIDxURD4gMS44NjM3NmUtMTUgPFREPiAxLjMxNTE4ZS0xNiA8VEQ+IDEuNDI1OTNlLTE1IDxURD4gMy40NTM2MWUtMTUgPFREPiAzLjE0NTc1ZS0xNiA8VEQ+IDIuMjE3MjNlLTE1IDxURD4gNy4yMTA1OGUtMTYgPFREPiA5LjA2NDM1ZS0xMiAoMjYxKSAKKzxUUj48VEggcm93c3Bhbj0iNCI+c2hlcm1hbjIgPFREIHJvd3NwYW49IjQiPiAxMDgwIDxURCByb3dzcGFuPSI0Ij4gMjMwOTQgPFRIPkNvbXB1dGUgVGltZSA8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4wLjAwNjMxNzU0PFREPjAuMDE1MDUyPFREPjAuMDI0NzUxNCA8VEQ+IC08VEQ+MC4wMjE0NDI1PFREPjAuMDIxNzk4OAorPFRSPjxUSD5Tb2x2ZSBUaW1lIDxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAwNDc4NDI0PFREPjAuMDAwMzM3OTk4PFREPjAuMDAxMDI5MSA8VEQ+IC08VEQ+MC4wMDI0MzE1MjxURD4wLjAwMjQ2MTUyCis8VFI+PFRIPlRvdGFsIFRpbWUgPFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+MC4wMDY3OTU5NzxURD4wLjAxNTM5PFREPjAuMDI1NzgwNSA8VEQ+IC08VEQ+MC4wMjM4NzQ8VEQ+MC4wMjQyNjAzCis8VFI+PFRIPkVycm9yKEl0ZXIpIDxURD4gMS44MzA5OWUtMTUgPFREPiA4LjE5MzUxZS0xNSA8VEQ+IDIuNjI1ZS0xNCA8VEQ+IDEuMzY3OGUrNjkgKDEwODApICA8VEQ+IDQuMTkxMWUtMTIgKDcpICA8VEQ+IDUuMDI5OWUtMTMgKDEyKSAKKzxUUj48VEggcm93c3Bhbj0iNCI+YmNzc3RrMDFfU1BEIDxURCByb3dzcGFuPSI0Ij4gNDggPFREIHJvd3NwYW49IjQiPiA0MDAgPFRIPkNvbXB1dGUgVGltZSA8VEQ+MC4wMDAxNjkwNzk8VEQ+MC4wMDAxMDc4OTxURD4wLjAwMDU3MjUzODxURD4xLjQyNWUtMDY8VEQ+OS4xNjEyZS0wNTxURD44LjM5ODVlLTA1PFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+NS42NDg5ZS0wNTxURD43LjA5MTNlLTA1PFREPjAuMDAwNDY4MjUxPFREPjUuNzM4OWUtMDU8VEQ+OC4wMjEyZS0wNTxURD41LjgzOTRlLTA1PFREPjAuMDAwNDYzMDE3PFREPjEuMzMzZS0wNgorPFRSPjxUSD5Tb2x2ZSBUaW1lIDxURD4xLjIyODhlLTA1PFREPjEuMTEyNGUtMDU8VEQ+MC4wMDAyODYzODc8VEQ+OC41ODk2ZS0wNTxURD4xLjYzODFlLTA1PFREPjEuNjk4NGUtMDU8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4zLjA5NWUtMDY8VEQ+NC4xMTVlLTA2PFREPjAuMDAwMzI1NDM4PFREPjMuNTA0ZS0wNjxURD43LjM2OWUtMDY8VEQ+My40NTRlLTA2PFREPjAuMDAwMjk0MDk1PFREPjYuMDUxNmUtMDUKKzxUUj48VEg+VG90YWwgVGltZSA8VEQ+MC4wMDAxODEzNjc8VEQ+MC4wMDAxMTkwMTQ8VEQ+MC4wMDA4NTg5MjU8VEQ+OC43MzIxZS0wNTxURD4wLjAwMDEwNzk5MzxURD4wLjAwMDEwMDk2OTxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjUuOTU4NGUtMDU8VEQ+Ny41MDI4ZS0wNTxURD4wLjAwMDc5MzY4OTxURD42LjA4OTNlLTA1PFREPjguNzU4MWUtMDU8VEQ+Ni4xODQ4ZS0wNTxURD4wLjAwMDc1NzExMjxURD42LjE4NDllLTA1Cis8VFI+PFRIPkVycm9yKEl0ZXIpIDxURD4gMS4wMzQ3NGUtMTYgPFREPiAyLjIzMDQ2ZS0xNiA8VEQ+IDIuMDEyNzNlLTE2IDxURD4gNC44NzQ1NWUtMDcgKDQ4KSAgPFREPiAxLjAzNTUzZS0xNiAoMikgIDxURD4gMy41NTk2NWUtMTYgKDIpICA8VEQ+IDIuNDgxODllLTE2IDxURD4gMS44ODgwOGUtMTYgPFREPiAxLjk3OTc2ZS0xNiA8VEQ+IDIuMzcyNDhlLTE2IDxURD4gMS44MjcwMWUtMTYgPFREPiAyLjcxNDc0ZS0xNiA8VEQ+IDIuMTEzMjJlLTE2IDxURD4gMy41NDdlLTA5ICg0OCkgCis8VFI+PFRIIHJvd3NwYW49IjQiPnNoZXJtYW4xIDxURCByb3dzcGFuPSI0Ij4gMTAwMCA8VEQgcm93c3Bhbj0iNCI+IDM3NTAgPFRIPkNvbXB1dGUgVGltZSA8VEQ+MC4wMDIyODgwNTxURD4wLjAwMjA5MjMxPFREPjAuMDA1MjgyNjg8VEQ+OS44NDZlLTA2PFREPjAuMDAxNjM1MjI8VEQ+MC4wMDE2MjE1NTxURD4wLjAwMDc4OTI1OTxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAwODA0NDk1PFREPjAuMDA0MzgyNjkKKzxUUj48VEg+U29sdmUgVGltZSA8VEQ+MC4wMDAyMTM3ODg8VEQ+OS43OTgzZS0wNTxURD4wLjAwMDkzODgzMTxURD4wLjAwNjI5ODM1PFREPjAuMDAwMzYxNzY0PFREPjAuMDAwNzg3OTQ8VEQ+NC4zOTg5ZS0wNTxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjIuNTMzMWUtMDU8VEQ+MC4wMDA5MTcxNjYKKzxUUj48VEg+VG90YWwgVGltZSA8VEQ+MC4wMDI1MDE4NDxURD4wLjAwMjE5MDI5PFREPjAuMDA2MjIxNTE8VEQ+MC4wMDYzMDgyPFREPjAuMDAxOTk2OTg8VEQ+MC4wMDI0MDk0OTxURD4wLjAwMDgzMzI0ODxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAwODI5ODI2PFREPjAuMDA1Mjk5ODYKKzxUUj48VEg+RXJyb3IoSXRlcikgPFREPiAxLjE2ODM5ZS0xNiA8VEQ+IDIuMjU5NjhlLTE2IDxURD4gMi41OTExNmUtMTYgPFREPiAzLjc2Nzc5ZS0xMSAoMjQ4KSAgPFREPiA0LjEzMzQzZS0xMSAoNCkgIDxURD4gMi4yMjM0N2UtMTQgKDEwKSAgPFREPiAyLjA1ODYxZS0xNiA8VEQ+IDEuODM1NTVlLTE2IDxURD4gMS4wMjkxN2UtMTUKKzxUUj48VEggcm93c3Bhbj0iNCI+eW91bmcxYyA8VEQgcm93c3Bhbj0iNCI+IDg0MSA8VEQgcm93c3Bhbj0iNCI+IDQwODkgPFRIPkNvbXB1dGUgVGltZSA8VEQ+MC4wMDIzNTg0MzxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAyMTcyMjg8VEQ+MC4wMDU2ODA3NTxURD4xLjI3MzVlLTA1PFREPjAuMDAyNjQ4NjY8VEQ+MC4wMDI1ODIzNgorPFRSPjxUSD5Tb2x2ZSBUaW1lIDxURD4wLjAwMDMyOTU5OTxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAwMTY4NjM0PFREPjAuMDAwODAxMTg8VEQ+MC4wNTM0NzM4PFREPjAuMDAxODcxOTM8VEQ+MC4wMDQ1MDIxMQorPFRSPjxUSD5Ub3RhbCBUaW1lIDxURD4wLjAwMjY4ODAzPFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+MC4wMDIzNDA5MTxURD4wLjAwNjQ4MTkzPFREPjAuMDUzNDg2NTxURD4wLjAwNDUyMDU5PFREPjAuMDA3MDg0NDcKKzxUUj48VEg+RXJyb3IoSXRlcikgPFREPiAxLjI3MDI5ZS0xNiA8VEQ+IDIuODEzMjFlLTE2IDxURD4gNS4wNDkyZS0xNSA8VEQ+IDguMDUwN2UtMTEgKDcwNikgIDxURD4gMy4wMDQ0N2UtMTIgKDgpICA8VEQ+IDEuNDY1MzJlLTEyICgxNikgCis8VFI+PFRIIHJvd3NwYW49IjQiPm1oZDEyODBiIDxURCByb3dzcGFuPSI0Ij4gMTI4MCA8VEQgcm93c3Bhbj0iNCI+IDIyNzc4IDxUSD5Db21wdXRlIFRpbWUgPFREPjAuMDAyMzQ4OTg8VEQ+MC4wMDIwNzA3OTxURD4wLjAwNTcwOTE4PFREPjIuNTk3NmUtMDU8VEQ+MC4wMDMwMjU2MzxURD4wLjAwMjk4MDM2PFREPjAuMDAxNDQ1MjU8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4wLjAwMDkxOTkyMjxURD4wLjAwNDI2NDQ0Cis8VFI+PFRIPlNvbHZlIFRpbWUgPFREPjAuMDAxMDMzOTI8VEQ+MC4wMDAyMTE5MTE8VEQ+MC4wMDEwNTxURD4wLjAxMTA0MzI8VEQ+MC4wMDA2MjgyODc8VEQ+MC4wMDM5MjA4OTxURD4wLjAwMDEzODMwMzxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjYuMjQ0NmUtMDU8VEQ+MC4wMDA5NzU2NAorPFRSPjxUSD5Ub3RhbCBUaW1lIDxURD4wLjAwMzM4Mjk8VEQ+MC4wMDIyODI3PFREPjAuMDA2NzU5MTg8VEQ+MC4wMTEwNjkyPFREPjAuMDAzNjUzOTI8VEQ+MC4wMDY5MDEyNDxURD4wLjAwMTU4MzU1PFREIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+MC4wMDA5ODIzNjg8VEQ+MC4wMDUyNDAwOAorPFRSPjxUSD5FcnJvcihJdGVyKSA8VEQ+IDEuMzI5NTNlLTE2IDxURD4gMy4wODY0NmUtMTYgPFREPiA2LjczNGUtMTYgPFREPiA4LjgzMTMyZS0xMSAoNDApICA8VEQ+IDEuNTExNTNlLTE2ICgxKSAgPFREPiA2LjA4NTU2ZS0xNiAoOCkgIDxURD4gMS44OTI2NGUtMTYgPFREPiAxLjk3NDc3ZS0xNiA8VEQ+IDYuNjgxMjZlLTA5Cis8VFI+PFRIIHJvd3NwYW49IjQiPmNyYXNoYmFzaXMgPFREIHJvd3NwYW49IjQiPiAxNjAwMDAgPFREIHJvd3NwYW49IjQiPiAxNzUwNDE2IDxUSD5Db21wdXRlIFRpbWUgPFREPjMuMjAxOTxURD41Ljc4OTI8VEQ+MTUuNzU3MzxURCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPjAuMDAzODM1MTU8VEQ+My4xMDA2PFREPjMuMDk5MjEKKzxUUj48VEg+U29sdmUgVGltZSA8VEQ+MC4yNjE5MTU8VEQ+MC4xMDYyMjU8VEQ+MC40MDIxNDE8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4xLjQ5MDg5PFREPjAuMjQ4ODg8VEQ+MC40NDM2NzMKKzxUUj48VEg+VG90YWwgVGltZSA8VEQ+My40NjM4MTxURD41Ljg5NTQyPFREPjE2LjE1OTQ8VEQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj4xLjQ5NDczPFREPjMuMzQ5NDg8VEQ+My41NDI4OAorPFRSPjxUSD5FcnJvcihJdGVyKSA8VEQ+IDEuNzYzNDhlLTE2IDxURD4gNC41ODM5NWUtMTYgPFREPiAxLjY3OTgyZS0xNCA8VEQ+IDguNjQxNDRlLTExICg2MSkgIDxURD4gOC41OTk2ZS0xMiAoMikgIDxURD4gNi4wNDA0MmUtMTQgKDUpIAorCis8L1RBQkxFPgorKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9TcGFyc2VRdWlja1JlZmVyZW5jZS5kb3ggYi9kb2MvU3BhcnNlUXVpY2tSZWZlcmVuY2UuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTYyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvU3BhcnNlUXVpY2tSZWZlcmVuY2UuZG94CkBAIC0wLDAgKzEsMjcyIEBACituYW1lc3BhY2UgRWlnZW4geworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgU3BhcnNlUXVpY2tSZWZQYWdlIFF1aWNrIHJlZmVyZW5jZSBndWlkZSBmb3Igc3BhcnNlIG1hdHJpY2VzCitcZWlnZW5BdXRvVG9jCisKKzxocj4KKworSW4gdGhpcyBwYWdlLCB3ZSBnaXZlIGEgcXVpY2sgc3VtbWFyeSBvZiB0aGUgbWFpbiBvcGVyYXRpb25zIGF2YWlsYWJsZSBmb3Igc3BhcnNlIG1hdHJpY2VzIGluIHRoZSBjbGFzcyBTcGFyc2VNYXRyaXguIEZpcnN0LCBpdCBpcyByZWNvbW1lbmRlZCB0byByZWFkICB0aGUgaW50cm9kdWN0b3J5IHR1dG9yaWFsIGF0IFxyZWYgVHV0b3JpYWxTcGFyc2UuIFRoZSBpbXBvcnRhbnQgcG9pbnQgdG8gaGF2ZSBpbiBtaW5kIHdoZW4gd29ya2luZyBvbiBzcGFyc2UgbWF0cmljZXMgaXMgaG93IHRoZXkgYXJlIHN0b3JlZCA6IAoraS5lIGVpdGhlciByb3cgbWFqb3Igb3IgY29sdW1uIG1ham9yLiBUaGUgZGVmYXVsdCBpcyBjb2x1bW4gbWFqb3IuIE1vc3QgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9uIHNwYXJzZSBtYXRyaWNlcyB3aWxsIGFzc2VydCB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSBzdG9yYWdlIG9yZGVyLiAKKworXHNlY3Rpb24gU3BhcnNlTWF0cml4SW5pdCBTcGFyc2UgTWF0cml4IEluaXRpYWxpemF0aW9uCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPiBDYXRlZ29yeSA8L3RoPiA8dGg+IE9wZXJhdGlvbnM8L3RoPiA8dGg+Tm90ZXM8L3RoPjwvdHI+Cis8dHI+PHRkPkNvbnN0cnVjdG9yPC90ZD4KKzx0ZD4KK1xjb2RlCisgIFNwYXJzZU1hdHJpeDxkb3VibGU+IHNtMSgxMDAwLDEwMDApOyAKKyAgU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LFJvd01ham9yPiBzbTI7CitcZW5kY29kZQorPC90ZD4gPHRkPiBEZWZhdWx0IGlzIENvbE1ham9yPC90ZD4gPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD4gUmVzaXplL1Jlc2VydmU8L3RkPgorPHRkPiAKKyBcY29kZQorICAgIHNtMS5yZXNpemUobSxuKTsgICAgICAvLyBDaGFuZ2Ugc20xIHRvIGEgbSB4IG4gbWF0cml4LgorICAgIHNtMS5yZXNlcnZlKG5ueik7ICAgICAvLyBBbGxvY2F0ZSByb29tIGZvciBubnogbm9uemVyb3MgZWxlbWVudHMuICAgCisgIFxlbmRjb2RlIAorPC90ZD4KKzx0ZD4gTm90ZSB0aGF0IHdoZW4gY2FsbGluZyByZXNlcnZlKCksIGl0IGlzIG5vdCByZXF1aXJlZCB0aGF0IG5ueiBpcyB0aGUgZXhhY3QgbnVtYmVyIG9mIG5vbnplcm8gZWxlbWVudHMgaW4gdGhlIGZpbmFsIG1hdHJpeC4gSG93ZXZlciwgYW4gZXhhY3QgZXN0aW1hdGlvbiB3aWxsIGF2b2lkIG11bHRpcGxlIHJlYWxsb2NhdGlvbnMgZHVyaW5nIHRoZSBpbnNlcnRpb24gcGhhc2UuIDwvdGQ+Cis8L3RyPgorPHRyPiAKKzx0ZD4gQXNzaWdubWVudCA8L3RkPgorPHRkPiAKK1xjb2RlIAorICBTcGFyc2VNYXRyaXg8ZG91YmxlLENvbG1ham9yPiBzbTE7CisgLy8gSW5pdGlhbGl6ZSBzbTIgd2l0aCBzbTEuCisgIFNwYXJzZU1hdHJpeDxkb3VibGUsUm93bWFqb3I+IHNtMihzbTEpLCBzbTM7ICAgICAgICAKKyAgLy8gQXNzaWdubWVudCBhbmQgZXZhbHVhdGlvbnMgbW9kaWZ5IHRoZSBzdG9yYWdlIG9yZGVyLgorICBzbTMgPSBzbTE7IAorIFxlbmRjb2RlCis8L3RkPgorPHRkPiBUaGUgY29weSBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGZyb20gYSBzdG9yYWdlIG9yZGVyIHRvIGFub3RoZXI8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD4gRWxlbWVudC13aXNlIEluc2VydGlvbjwvdGQ+Cis8dGQ+CitcY29kZSAKKy8vIEluc2VydCBhIG5ldyBlbGVtZW50OyAKKyBzbTEuaW5zZXJ0KGksIGopID0gdl9pajsgIAorCisvLyBVcGRhdGUgdGhlIHZhbHVlIHZfaWoKKyBzbTEuY29lZmZSZWYoaSxqKSA9IHZfaWo7Cisgc20xLmNvZWZmUmVmKGksaikgKz0gdl9pajsKKyBzbTEuY29lZmZSZWYoaSxqKSAtPSB2X2lqOworXGVuZGNvZGUKKzwvdGQ+Cis8dGQ+IGluc2VydCgpIGFzc3VtZXMgdGhhdCB0aGUgZWxlbWVudCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0OyBvdGhlcndpc2UsIHVzZSBjb2VmZlJlZigpPC90ZD4KKzwvdHI+Cis8dHI+IAorPHRkPiBCYXRjaCBpbnNlcnRpb248L3RkPgorPHRkPgorXGNvZGUKKyAgc3RkOjp2ZWN0b3I8IEVpZ2VuOjpUcmlwbGV0PGRvdWJsZT4gPiB0cmlwbGV0TGlzdDsKKyAgdHJpcGxldExpc3QucmVzZXJ2ZShlc3RpbWF0aW9uX29mX2VudHJpZXMpOworICAvLyAtLSBGaWxsIHRyaXBsZXRMaXN0IHdpdGggbm9uemVybyBlbGVtZW50cy4uLgorICBzbTEuc2V0RnJvbVRyaXBsZXRzKFRyaXBsZXRMaXN0LmJlZ2luKCksIFRyaXBsZXRMaXN0LmVuZCgpKTsKK1xlbmRjb2RlCis8L3RkPgorPHRkPkEgY29tcGxldGUgZXhhbXBsZSBpcyBhdmFpbGFibGUgYXQgXGxpbmsgVHV0b3JpYWxTcGFyc2VGaWxsaW5nIFRyaXBsZXQgSW5zZXJ0aW9uIFxlbmRsaW5rLjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJhbHQiPiAKKzx0ZD4gQ29uc3RhbnQgb3IgUmFuZG9tIEluc2VydGlvbjwvdGQ+Cis8dGQ+CitcY29kZQorc20xLnNldFplcm8oKTsKK1xlbmRjb2RlCis8L3RkPgorPHRkPlJlbW92ZSBhbGwgbm9uLXplcm8gY29lZmZpY2llbnRzPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCisKK1xzZWN0aW9uIFNwYXJzZUJhc2ljSW5mb3MgTWF0cml4IHByb3BlcnRpZXMKK0JleW9uZCB0aGUgYmFzaWMgZnVuY3Rpb25zIHJvd3MoKSBhbmQgY29scygpLCB0aGVyZSBhcmUgc29tZSB1c2VmdWwgZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSB0byBlYXNpbHkgZ2V0IHNvbWUgaW5mb3JtYXRpb25zIGZyb20gdGhlIG1hdHJpeC4gCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+CisgIDx0ZD4gXGNvZGUKKyAgc20xLnJvd3MoKTsgICAgICAgICAvLyBOdW1iZXIgb2Ygcm93cworICBzbTEuY29scygpOyAgICAgICAgIC8vIE51bWJlciBvZiBjb2x1bW5zIAorICBzbTEubm9uWmVyb3MoKTsgICAgIC8vIE51bWJlciBvZiBub24gemVybyB2YWx1ZXMgICAKKyAgc20xLm91dGVyU2l6ZSgpOyAgICAvLyBOdW1iZXIgb2YgY29sdW1ucyAocmVzcC4gcm93cykgZm9yIGEgY29sdW1uIG1ham9yIChyZXNwLiByb3cgbWFqb3IgKQorICBzbTEuaW5uZXJTaXplKCk7ICAgIC8vIE51bWJlciBvZiByb3dzIChyZXNwLiBjb2x1bW5zKSBmb3IgYSByb3cgbWFqb3IgKHJlc3AuIGNvbHVtbiBtYWpvcikKKyAgc20xLm5vcm0oKTsgICAgICAgICAvLyBFdWNsaWRpYW4gbm9ybSBvZiB0aGUgbWF0cml4CisgIHNtMS5zcXVhcmVkTm9ybSgpOyAgLy8gU3F1YXJlZCBub3JtIG9mIHRoZSBtYXRyaXgKKyAgc20xLmJsdWVOb3JtKCk7CisgIHNtMS5pc1ZlY3RvcigpOyAgICAgLy8gQ2hlY2sgaWYgc20xIGlzIGEgc3BhcnNlIHZlY3RvciBvciBhIHNwYXJzZSBtYXRyaXgKKyAgc20xLmlzQ29tcHJlc3NlZCgpOyAvLyBDaGVjayBpZiBzbTEgaXMgaW4gY29tcHJlc3NlZCBmb3JtCisgIC4uLgorICBcZW5kY29kZSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIFNwYXJzZUJhc2ljT3BzIEFyaXRobWV0aWMgb3BlcmF0aW9ucworSXQgaXMgZWFzeSB0byBwZXJmb3JtIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiBzcGFyc2UgbWF0cmljZXMgcHJvdmlkZWQgdGhhdCB0aGUgZGltZW5zaW9ucyBhcmUgYWRlcXVhdGUgYW5kIHRoYXQgdGhlIG1hdHJpY2VzIGhhdmUgdGhlIHNhbWUgc3RvcmFnZSBvcmRlci4gTm90ZSB0aGF0IHRoZSBldmFsdWF0aW9uIGNhbiBhbHdheXMgYmUgZG9uZSBpbiBhIG1hdHJpeCB3aXRoIGEgZGlmZmVyZW50IHN0b3JhZ2Ugb3JkZXIuIEluIHRoZSBmb2xsb3dpbmcsIFxiIHNtIGRlbm90ZXMgYSBzcGFyc2UgbWF0cml4LCBcYiBkbSBhIGRlbnNlIG1hdHJpeCBhbmQgXGIgZHYgYSBkZW5zZSB2ZWN0b3IuCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPiBPcGVyYXRpb25zIDwvdGg+IDx0aD4gQ29kZSA8L3RoPiA8dGg+IE5vdGVzIDwvdGg+PC90cj4KKworPHRyPgorICA8dGQ+IGFkZCBzdWJ0cmFjdCA8L3RkPiAKKyAgPHRkPiBcY29kZQorICBzbTMgPSBzbTEgKyBzbTI7IAorICBzbTMgPSBzbTEgLSBzbTI7CisgIHNtMiArPSBzbTE7IAorICBzbTIgLT0gc20xOyBcZW5kY29kZQorICA8L3RkPgorICA8dGQ+IAorICBzbTEgYW5kIHNtMiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdG9yYWdlIG9yZGVyCisgIDwvdGQ+IAorPC90cj4KKworPHRyIGNsYXNzPSJhbHQiPjx0ZD4KKyAgc2NhbGFyIHByb2R1Y3Q8L3RkPjx0ZD5cY29kZQorICBzbTMgPSBzbTEgKiBzMTsgICBzbTMgKj0gczE7IAorICBzbTMgPSBzMSAqIHNtMSArIHMyICogc20yOyBzbTMgLz0gczE7XGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPgorICAgIE1hbnkgY29tYmluYXRpb25zIGFyZSBwb3NzaWJsZSBpZiB0aGUgZGltZW5zaW9ucyBhbmQgdGhlIHN0b3JhZ2Ugb3JkZXIgYWdyZWUuCis8L3RyPgorCis8dHI+CisgIDx0ZD4gJVNwYXJzZSAlUHJvZHVjdCA8L3RkPgorICA8dGQ+IFxjb2RlCisgIHNtMyA9IHNtMSAqIHNtMjsKKyAgZG0yID0gc20xICogZG0xOworICBkdjIgPSBzbTEgKiBkdjE7CisgIFxlbmRjb2RlIDwvdGQ+CisgIDx0ZD4KKyAgPC90ZD4KKzwvdHI+IAorCis8dHIgY2xhc3M9J2FsdCc+CisgIDx0ZD4gdHJhbnNwb3NpdGlvbiwgYWRqb2ludDwvdGQ+CisgIDx0ZD4gXGNvZGUKKyAgc20yID0gc20xLnRyYW5zcG9zZSgpOworICBzbTIgPSBzbTEuYWRqb2ludCgpOworICBcZW5kY29kZSA8L3RkPgorICA8dGQ+CisgIE5vdGUgdGhhdCB0aGUgdHJhbnNwb3NpdGlvbiBjaGFuZ2UgdGhlIHN0b3JhZ2Ugb3JkZXIuIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHRyYW5zcG9zZUluUGxhY2UoKS4KKyAgPC90ZD4KKzwvdHI+IAorPHRyPgorPHRkPiBQZXJtdXRhdGlvbiA8L3RkPgorPHRkPiAKK1xjb2RlIAorcGVybS5pbmRpY2VzKCk7ICAgICAgLy8gUmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3Igb2YgaW5kaWNlcworc20xLnR3aXN0ZWRCeShwZXJtKTsgLy8gUGVybXV0ZSByb3dzIGFuZCBjb2x1bW5zCitzbTIgPSBzbTEgKiBwZXJtOyAgICAvLyBQZXJtdXRlIHRoZSBjb2x1bW5zCitzbTIgPSBwZXJtICogc20xOyAgICAvLyBQZXJtdXRlIHRoZSBjb2x1bW5zCitcZW5kY29kZSAKKzwvdGQ+Cis8dGQ+IAorCis8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPgorICBDb21wb25lbnQtd2lzZSBvcHMKKyAgPC90ZD4KKyAgPHRkPlxjb2RlIAorICBzbTEuY3dpc2VQcm9kdWN0KHNtMik7CisgIHNtMS5jd2lzZVF1b3RpZW50KHNtMik7CisgIHNtMS5jd2lzZU1pbihzbTIpOworICBzbTEuY3dpc2VNYXgoc20yKTsKKyAgc20xLmN3aXNlQWJzKCk7CisgIHNtMS5jd2lzZVNxcnQoKTsKKyAgXGVuZGNvZGU8L3RkPgorICA8dGQ+CisgIHNtMSBhbmQgc20yIHNob3VsZCBoYXZlIHRoZSBzYW1lIHN0b3JhZ2Ugb3JkZXIKKyAgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitcc2VjdGlvbiBzcGFyc2VvdGhlcm9wcyBPdGhlciBzdXBwb3J0ZWQgb3BlcmF0aW9ucworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aCBzdHlsZT0ibWluLXdpZHRoOmluaXRpYWwiPiBDb2RlIDwvdGg+IDx0aD4gTm90ZXM8L3RoPiA8L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSIyIj5TdWItbWF0cmljZXM8L3RkPjwvdHI+Cis8dHI+Cis8dGQ+IAorXGNvZGUgCisgIHNtMS5ibG9jayhzdGFydFJvdywgc3RhcnRDb2wsIHJvd3MsIGNvbHMpOyAKKyAgc20xLmJsb2NrKHN0YXJ0Um93LCBzdGFydENvbCk7IAorICBzbTEudG9wTGVmdENvcm5lcihyb3dzLCBjb2xzKTsgCisgIHNtMS50b3BSaWdodENvcm5lcihyb3dzLCBjb2xzKTsKKyAgc20xLmJvdHRvbUxlZnRDb3JuZXIoIHJvd3MsIGNvbHMpOworICBzbTEuYm90dG9tUmlnaHRDb3JuZXIoIHJvd3MsIGNvbHMpOworICBcZW5kY29kZQorPC90ZD48dGQ+CitDb250cmFyeSB0byBkZW5zZSBtYXRyaWNlcywgaGVyZSA8c3Ryb25nPmFsbCB0aGVzZSBtZXRob2RzIGFyZSByZWFkLW9ubHk8L3N0cm9uZz4uXG4KK1NlZSBccmVmIFR1dG9yaWFsU3BhcnNlX1N1Yk1hdHJpY2VzIGFuZCBiZWxvdyBmb3IgcmVhZC13cml0ZSBzdWItbWF0cmljZXMuCis8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQgY29sc3Bhbj0iMiI+IFJhbmdlIDwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD4gCitcY29kZSAKKyAgc20xLmlubmVyVmVjdG9yKG91dGVyKTsgICAgICAgICAgIC8vIFJXCisgIHNtMS5pbm5lclZlY3RvcnMoc3RhcnQsIHNpemUpOyAgICAvLyBSVworICBzbTEubGVmdENvbHMoc2l6ZSk7ICAgICAgICAgICAgICAgLy8gUlcKKyAgc20yLnJpZ2h0Q29scyhzaXplKTsgICAgICAgICAgICAgIC8vIFJPIGJlY2F1c2Ugc20yIGlzIHJvdy1tYWpvcgorICBzbTEubWlkZGxlUm93cyhzdGFydCwgbnVtUm93cyk7ICAgLy8gUk8gYmVjYXVzZSBzbTEgaXMgY29sdW1uLW1ham9yCisgIHNtMS5taWRkbGVDb2xzKHN0YXJ0LCBudW1Db2xzKTsgICAvLyBSVworICBzbTEuY29sKGopOyAgICAgICAgICAgICAgICAgICAgICAgLy8gUlcKK1xlbmRjb2RlCis8L3RkPgorPHRkPgorQSBpbm5lciB2ZWN0b3IgaXMgZWl0aGVyIGEgcm93IChmb3Igcm93LW1ham9yKSBvciBhIGNvbHVtbiAoZm9yIGNvbHVtbi1tYWpvcikuXG4KK0FzIHN0YXRlZCBlYXJsaWVyLCBmb3IgYSByZWFkLXdyaXRlIHN1Yi1tYXRyaXggKFJXKSwgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGRvbmUgaW4gYSBtYXRyaXggd2l0aCBkaWZmZXJlbnQgc3RvcmFnZSBvcmRlci4KKzwvdGQ+Cis8L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSIyIj4gVHJpYW5ndWxhciBhbmQgc2VsZmFkam9pbnQgdmlld3M8L3RkPjwvdHI+Cis8dHI+Cis8dGQ+IAorXGNvZGUKKyAgc20yID0gc20xLnRyaWFuZ3VsYXJ2aWV3PExvd2VyPigpOworICBzbTIgPSBzbTEuc2VsZmFkam9pbnR2aWV3PExvd2VyPigpOworXGVuZGNvZGUKKzwvdGQ+Cis8dGQ+IFNldmVyYWwgY29tYmluYXRpb24gYmV0d2VlbiB0cmlhbmd1bGFyIHZpZXdzIGFuZCBibG9ja3Mgdmlld3MgYXJlIHBvc3NpYmxlCitcY29kZSAKKyAgXGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkIGNvbHNwYW49IjIiPlRyaWFuZ3VsYXIgc29sdmUgPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPgorPHRkPiAKK1xjb2RlIAorIGR2MiA9IHNtMS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShkdjEpOworIGR2MiA9IHNtMS50b3BMZWZ0Q29ybmVyKHNpemUsIHNpemUpCisgICAgICAgICAgLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKGR2MSk7CitcZW5kY29kZSAKKzwvdGQ+Cis8dGQ+IEZvciBnZW5lcmFsIHNwYXJzZSBzb2x2ZSwgVXNlIGFueSBzdWl0YWJsZSBtb2R1bGUgZGVzY3JpYmVkIGF0IFxyZWYgVG9waWNTcGFyc2VTeXN0ZW1zIDwvdGQ+Cis8L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSIyIj4gTG93LWxldmVsIEFQSTwvdGQ+PC90cj4KKzx0cj4KKzx0ZD4KK1xjb2RlCitzbTEudmFsdWVQdHIoKTsgICAgICAvLyBQb2ludGVyIHRvIHRoZSB2YWx1ZXMKK3NtMS5pbm5lckluZGV4dHIoKTsgIC8vIFBvaW50ZXIgdG8gdGhlIGluZGljZXMuCitzbTEub3V0ZXJJbmRleFB0cigpOyAvLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbm5lciB2ZWN0b3IKK1xlbmRjb2RlCis8L3RkPgorPHRkPgorSWYgdGhlIG1hdHJpeCBpcyBub3QgaW4gY29tcHJlc3NlZCBmb3JtLCBtYWtlQ29tcHJlc3NlZCgpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLlxuCitOb3RlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBtb3N0bHkgcHJvdmlkZWQgZm9yIGludGVyb3BlcmFiaWxpdHkgcHVycG9zZXMgd2l0aCBleHRlcm5hbCBsaWJyYXJpZXMuXG4KK0EgYmV0dGVyIGFjY2VzcyB0byB0aGUgdmFsdWVzIG9mIHRoZSBtYXRyaXggaXMgZG9uZSBieSB1c2luZyB0aGUgSW5uZXJJdGVyYXRvciBjbGFzcyBhcyBkZXNjcmliZWQgaW4gXGxpbmsgVHV0b3JpYWxTcGFyc2UgdGhlIFR1dG9yaWFsIFNwYXJzZSBcZW5kbGluayBzZWN0aW9uPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkIGNvbHNwYW49IjIiPk1hcHBpbmcgZXh0ZXJuYWwgYnVmZmVyczwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD4KK1xjb2RlCitpbnQgb3V0ZXJJbmRleFB0cltjb2xzKzFdOworaW50IGlubmVySW5kaWNlc1tubnpdOworZG91YmxlIHZhbHVlc1tubnpdOworTWFwPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc20xKHJvd3MsY29scyxubnosb3V0ZXJJbmRleFB0ciwgLy8gcmVhZC13cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySW5kaWNlcyx2YWx1ZXMpOworTWFwPGNvbnN0IFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc20yKC4uLik7ICAgICAgICAgICAgICAgICAgLy8gcmVhZC1vbmx5CitcZW5kY29kZQorPC90ZD4KKzx0ZD5BcyBmb3IgZGVuc2UgbWF0cmljZXMsIGNsYXNzIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBjYW4gYmUgdXNlZCB0byBzZWUgZXh0ZXJuYWwgYnVmZmVycyBhcyBhbiAlRWlnZW4ncyBTcGFyc2VNYXRyaXggb2JqZWN0LiA8L3RkPgorPC90cj4KKzwvdGFibGU+CisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL1N0bENvbnRhaW5lcnMuZG94IGIvZG9jL1N0bENvbnRhaW5lcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjg3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvU3RsQ29udGFpbmVycy5kb3gKQEAgLTAsMCArMSw2MiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVG9waWNTdGxDb250YWluZXJzIFVzaW5nIFNUTCBDb250YWluZXJzIHdpdGggRWlnZW4KKworXGVpZ2VuQXV0b1RvYworCitcc2VjdGlvbiBTdGxDb250YWluZXJzX3N1bW1hcnkgRXhlY3V0aXZlIHN1bW1hcnkKKworVXNpbmcgU1RMIGNvbnRhaW5lcnMgb24gXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiLCBvciBjbGFzc2VzIGhhdmluZyBtZW1iZXJzIG9mIHN1Y2ggdHlwZXMsIHJlcXVpcmVzIHRha2luZyB0aGUgZm9sbG93aW5nIHR3byBzdGVwczoKKworXGxpIEEgMTYtYnl0ZS1hbGlnbmVkIGFsbG9jYXRvciBtdXN0IGJlIHVzZWQuIEVpZ2VuIGRvZXMgcHJvdmlkZSBvbmUgcmVhZHkgZm9yIHVzZTogYWxpZ25lZF9hbGxvY2F0b3IuCitcbGkgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzdGQ6OnZlY3RvciBjb250YWluZXIsIHlvdSBuZWVkIHRvIFwjaW5jbHVkZSA8RWlnZW4vU3RkVmVjdG9yPi4KKworVGhlc2UgaXNzdWVzIGFyaXNlIG9ubHkgd2l0aCBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiB0eXBlcyIgYW5kIFxyZWYgVG9waWNTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMgInN0cnVjdHVyZXMgaGF2aW5nIHN1Y2ggRWlnZW4gb2JqZWN0cyBhcyBtZW1iZXIiLiBGb3Igb3RoZXIgRWlnZW4gdHlwZXMsIHN1Y2ggYXMgVmVjdG9yM2Ygb3IgTWF0cml4WGQsIG5vIHNwZWNpYWwgY2FyZSBpcyBuZWVkZWQgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycy4KKworXHNlY3Rpb24gYWxsb2NhdG9yIFVzaW5nIGFuIGFsaWduZWQgYWxsb2NhdG9yCisKK1NUTCBjb250YWluZXJzIHRha2UgYW4gb3B0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyLCB0aGUgYWxsb2NhdG9yIHR5cGUuIFdoZW4gdXNpbmcgU1RMIGNvbnRhaW5lcnMgb24gXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiLCB5b3UgbmVlZCB0ZWxsIHRoZSBjb250YWluZXIgdG8gdXNlIGFuIGFsbG9jYXRvciB0aGF0IHdpbGwgYWx3YXlzIGFsbG9jYXRlIG1lbW9yeSBhdCAxNi1ieXRlLWFsaWduZWQgbG9jYXRpb25zLiBGb3J0dW5hdGVseSwgRWlnZW4gZG9lcyBwcm92aWRlIHN1Y2ggYW4gYWxsb2NhdG9yOiBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3IuCisKK0ZvciBleGFtcGxlLCBpbnN0ZWFkIG9mCitcY29kZQorc3RkOjptYXA8aW50LCBFaWdlbjo6VmVjdG9yNGY+CitcZW5kY29kZQoreW91IG5lZWQgdG8gdXNlCitcY29kZQorc3RkOjptYXA8aW50LCBFaWdlbjo6VmVjdG9yNGYsIHN0ZDo6bGVzczxpbnQ+LCAKKyAgICAgICAgIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgaW50LCBFaWdlbjo6VmVjdG9yNGY+ID4gPgorXGVuZGNvZGUKK05vdGUgdGhhdCB0aGUgdGhpcmQgcGFyYW1ldGVyICJzdGQ6Omxlc3M8aW50PiIgaXMganVzdCB0aGUgZGVmYXVsdCB2YWx1ZSwgYnV0IHdlIGhhdmUgdG8gaW5jbHVkZSBpdCBiZWNhdXNlIHdlIHdhbnQgdG8gc3BlY2lmeSB0aGUgZm91cnRoIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIGFsbG9jYXRvciB0eXBlLgorCitcc2VjdGlvbiBTdGxDb250YWluZXJzX3ZlY3RvciBUaGUgY2FzZSBvZiBzdGQ6OnZlY3RvcgorCitUaGUgc2l0dWF0aW9uIHdpdGggc3RkOjp2ZWN0b3Igd2FzIGV2ZW4gd29yc2UgKGV4cGxhbmF0aW9uIGJlbG93KSBzbyB3ZSBoYWQgdG8gc3BlY2lhbGl6ZSBpdCBmb3IgdGhlIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvciB0eXBlLiBJbiBwcmFjdGljZSB5b3UgXGIgbXVzdCB1c2UgdGhlIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvciAobm90IGFub3RoZXIgYWxpZ25lZCBhbGxvY2F0b3IpLCBcYiBhbmQgXCNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+LgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CitcY29kZQorI2luY2x1ZGU8RWlnZW4vU3RkVmVjdG9yPgorLyogLi4uICovCitzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yNGYsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPEVpZ2VuOjpWZWN0b3I0Zj4gPgorXGVuZGNvZGUKKworXHN1YnNlY3Rpb24gdmVjdG9yX3NwZWMgQW4gYWx0ZXJuYXRpdmUgLSBzcGVjaWFsaXppbmcgc3RkOjp2ZWN0b3IgZm9yIEVpZ2VuIHR5cGVzCisKK0FzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCBkZXNjcmliZWQgYWJvdmUsIHlvdSBoYXZlIHRoZSBvcHRpb24gdG8gc3BlY2lhbGl6ZSBzdGQ6OnZlY3RvciBmb3IgRWlnZW4gdHlwZXMgcmVxdWlyaW5nIGFsaWdubWVudC4gCitUaGUgYWR2YW50YWdlIGlzIHRoYXQgeW91IHdvbid0IG5lZWQgdG8gZGVjbGFyZSBzdGQ6OnZlY3RvciBhbGwgb3ZlciB3aXRoIEVpZ2VuOjphbGxvY2F0b3IuIE9uZSBkcmF3YmFjayBvbiB0aGUgb3RoZXIgaGFuZCBzaWRlIGlzIHRoYXQKK3RoZSBzcGVjaWFsaXphdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkIGJlZm9yZSBhbGwgY29kZSBwaWVjZXMgaW4gd2hpY2ggZS5nLiBzdGQ6OnZlY3RvcjxWZWN0b3IyZD4gaXMgdXNlZC4gT3RoZXJ3aXNlLCB3aXRob3V0IGtub3dpbmcgdGhlIHNwZWNpYWxpemF0aW9uCit0aGUgY29tcGlsZXIgd2lsbCBjb21waWxlIHRoYXQgcGFydGljdWxhciBpbnN0YW5jZSB3aXRoIHRoZSBkZWZhdWx0IHN0ZDo6YWxsb2NhdG9yIGFuZCB5b3UgcHJvZ3JhbSBpcyBtb3N0IGxpa2VseSB0byBjcmFzaC4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorXGNvZGUKKyNpbmNsdWRlPEVpZ2VuL1N0ZFZlY3Rvcj4KKy8qIC4uLiAqLworRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oTWF0cml4MmQpCitzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yMmQ+CitcZW5kY29kZQorCis8c3BhbiBjbGFzcz0ibm90ZSI+XGIgRXhwbGFuYXRpb246IFRoZSByZXNpemUoKSBtZXRob2Qgb2Ygc3RkOjp2ZWN0b3IgdGFrZXMgYSB2YWx1ZV90eXBlIGFyZ3VtZW50IChkZWZhdWx0aW5nIHRvIHZhbHVlX3R5cGUoKSkuIFNvIHdpdGggc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjRmPiwgc29tZSBFaWdlbjo6VmVjdG9yNGYgb2JqZWN0cyB3aWxsIGJlIHBhc3NlZCBieSB2YWx1ZSwgd2hpY2ggZGlzY2FyZHMgYW55IGFsaWdubWVudCBtb2RpZmllcnMsIHNvIGEgRWlnZW46OlZlY3RvcjRmIGNhbiBiZSBjcmVhdGVkIGF0IGFuIHVuYWxpZ25lZCBsb2NhdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgdGhhdCwgdGhlIG9ubHkgc29sdXRpb24gd2Ugc2F3IHdhcyB0byBzcGVjaWFsaXplIHN0ZDo6dmVjdG9yIHRvIG1ha2UgaXQgd29yayBvbiBhIHNsaWdodCBtb2RpZmljYXRpb24gb2YsIGhlcmUsIEVpZ2VuOjpWZWN0b3I0ZiwgdGhhdCBpcyBhYmxlIHRvIGRlYWwgcHJvcGVybHkgd2l0aCB0aGlzIHNpdHVhdGlvbi4KKzwvc3Bhbj4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1N0b3JhZ2VPcmRlcnMuZG94IGIvZG9jL1N0b3JhZ2VPcmRlcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjQ1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvU3RvcmFnZU9yZGVycy5kb3gKQEAgLTAsMCArMSw4NiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVG9waWNTdG9yYWdlT3JkZXJzIFN0b3JhZ2Ugb3JkZXJzCisKK1RoZXJlIGFyZSB0d28gZGlmZmVyZW50IHN0b3JhZ2Ugb3JkZXJzIGZvciBtYXRyaWNlcyBhbmQgdHdvLWRpbWVuc2lvbmFsIGFycmF5czogY29sdW1uLW1ham9yIGFuZCByb3ctbWFqb3IuCitUaGlzIHBhZ2UgZXhwbGFpbnMgdGhlc2Ugc3RvcmFnZSBvcmRlcnMgYW5kIGhvdyB0byBzcGVjaWZ5IHdoaWNoIG9uZSBzaG91bGQgYmUgdXNlZC4KKworXGVpZ2VuQXV0b1RvYworCisKK1xzZWN0aW9uIFRvcGljU3RvcmFnZU9yZGVyc0ludHJvIENvbHVtbi1tYWpvciBhbmQgcm93LW1ham9yIHN0b3JhZ2UKKworVGhlIGVudHJpZXMgb2YgYSBtYXRyaXggZm9ybSBhIHR3by1kaW1lbnNpb25hbCBncmlkLiBIb3dldmVyLCB3aGVuIHRoZSBtYXRyaXggaXMgc3RvcmVkIGluIG1lbW9yeSwgdGhlIGVudHJpZXMKK2hhdmUgdG8gc29tZWhvdyBiZSBsYWlkIG91dCBsaW5lYXJseS4gVGhlcmUgYXJlIHR3byBtYWluIHdheXMgdG8gZG8gdGhpcywgYnkgcm93IGFuZCBieSBjb2x1bW4uCisKK1dlIHNheSB0aGF0IGEgbWF0cml4IGlzIHN0b3JlZCBpbiBcYiByb3ctbWFqb3Igb3JkZXIgaWYgaXQgaXMgc3RvcmVkIHJvdyBieSByb3cuIFRoZSBlbnRpcmUgZmlyc3Qgcm93IGlzCitzdG9yZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBlbnRpcmUgc2Vjb25kIHJvdywgYW5kIHNvIG9uLiBDb25zaWRlciBmb3IgZXhhbXBsZSB0aGUgbWF0cml4CisKK1xmWworQSA9IFxiZWdpbntibWF0cml4fQorOCAmIDIgJiAyICYgOSBcXAorOSAmIDEgJiA0ICYgNCBcXAorMyAmIDUgJiA0ICYgNQorXGVuZHtibWF0cml4fS4KK1xmXQorCitJZiB0aGlzIG1hdHJpeCBpcyBzdG9yZWQgaW4gcm93LW1ham9yIG9yZGVyLCB0aGVuIHRoZSBlbnRyaWVzIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkgYXMgZm9sbG93czoKKworXGNvZGUgOCAyIDIgOSA5IDEgNCA0IDMgNSA0IDUgXGVuZGNvZGUKKworT24gdGhlIG90aGVyIGhhbmQsIGEgbWF0cml4IGlzIHN0b3JlZCBpbiBcYiBjb2x1bW4tbWFqb3Igb3JkZXIgaWYgaXQgaXMgc3RvcmVkIGNvbHVtbiBieSBjb2x1bW4sIHN0YXJ0aW5nIHdpdGgKK3RoZSBlbnRpcmUgZmlyc3QgY29sdW1uLCBmb2xsb3dlZCBieSB0aGUgZW50aXJlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4gSWYgdGhlIGFib3ZlIG1hdHJpeCBpcyBzdG9yZWQgaW4KK2NvbHVtbi1tYWpvciBvcmRlciwgaXQgaXMgbGFpZCBvdXQgYXMgZm9sbG93czoKKworXGNvZGUgOCA5IDMgMiAxIDUgMiA0IDQgOSA0IDUgXGVuZGNvZGUKKworVGhpcyBleGFtcGxlIGlzIGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgRWlnZW4gY29kZS4gSXQgdXNlcyB0aGUgUGxhaW5PYmplY3RCYXNlOjpkYXRhKCkgZnVuY3Rpb24sIHdoaWNoCityZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbWF0cml4LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljU3RvcmFnZU9yZGVyc19leGFtcGxlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFRvcGljU3RvcmFnZU9yZGVyc0luRWlnZW4gU3RvcmFnZSBvcmRlcnMgaW4gRWlnZW4KKworVGhlIHN0b3JhZ2Ugb3JkZXIgb2YgYSBtYXRyaXggb3IgYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgY2FuIGJlIHNldCBieSBzcGVjaWZ5aW5nIHRoZSBcYyBPcHRpb25zIHRlbXBsYXRlCitwYXJhbWV0ZXIgZm9yIE1hdHJpeCBvciBBcnJheS4gQXMgXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzIGV4cGxhaW5zLCB0aGUgJU1hdHJpeCBjbGFzcyB0ZW1wbGF0ZSBoYXMgc2l4Cit0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBvZiB3aGljaCB0aHJlZSBhcmUgY29tcHVsc29yeSAoXGMgU2NhbGFyLCBcYyBSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgQ29sc0F0Q29tcGlsZVRpbWUpCithbmQgdGhyZWUgYXJlIG9wdGlvbmFsIChcYyBPcHRpb25zLCBcYyBNYXhSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgTWF4Q29sc0F0Q29tcGlsZVRpbWUpLiBJZiB0aGUgXGMgT3B0aW9ucworcGFyYW1ldGVyIGlzIHNldCB0byBcYyBSb3dNYWpvciwgdGhlbiB0aGUgbWF0cml4IG9yIGFycmF5IGlzIHN0b3JlZCBpbiByb3ctbWFqb3Igb3JkZXI7IGlmIGl0IGlzIHNldCB0byAKK1xjIENvbE1ham9yLCB0aGVuIGl0IGlzIHN0b3JlZCBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gdGhlIGFib3ZlIEVpZ2VuIHByb2dyYW0gdG8KK3NwZWNpZnkgdGhlIHN0b3JhZ2Ugb3JkZXIuCisKK0lmIHRoZSBzdG9yYWdlIG9yZGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gRWlnZW4gZGVmYXVsdHMgdG8gc3RvcmluZyB0aGUgZW50cnkgaW4gY29sdW1uLW1ham9yLiBUaGlzIGlzIGFsc28KK3RoZSBjYXNlIGlmIG9uZSBvZiB0aGUgY29udmVuaWVuY2UgdHlwZWRlZnMgKFxjIE1hdHJpeDNmLCBcYyBBcnJheVhYZCwgZXRjLikgaXMgdXNlZC4KKworTWF0cmljZXMgYW5kIGFycmF5cyB1c2luZyBvbmUgc3RvcmFnZSBvcmRlciBjYW4gYmUgYXNzaWduZWQgdG8gbWF0cmljZXMgYW5kIGFycmF5cyB1c2luZyB0aGUgb3RoZXIgc3RvcmFnZQorb3JkZXIsIGFzIGhhcHBlbnMgaW4gdGhlIGFib3ZlIHByb2dyYW0gd2hlbiBcYyBBcm93bWFqb3IgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgXGMgQWNvbG1ham9yLiBFaWdlbiB3aWxsIHJlb3JkZXIKK3RoZSBlbnRyaWVzIGF1dG9tYXRpY2FsbHkuIE1vcmUgZ2VuZXJhbGx5LCByb3ctbWFqb3IgYW5kIGNvbHVtbi1tYWpvciBtYXRyaWNlcyBjYW4gYmUgbWl4ZWQgaW4gYW4gZXhwcmVzc2lvbgorYXMgd2Ugd2FudC4KKworCitcc2VjdGlvbiBUb3BpY1N0b3JhZ2VPcmRlcnNXaGljaCBXaGljaCBzdG9yYWdlIG9yZGVyIHRvIGNob29zZT8KKworU28sIHdoaWNoIHN0b3JhZ2Ugb3JkZXIgc2hvdWxkIHlvdSB1c2UgaW4geW91ciBwcm9ncmFtPyBUaGVyZSBpcyBubyBzaW1wbGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb247IGl0IGRlcGVuZHMKK29uIHlvdXIgYXBwbGljYXRpb24uIEhlcmUgYXJlIHNvbWUgcG9pbnRzIHRvIGtlZXAgaW4gbWluZDoKKworICAtIFlvdXIgdXNlcnMgbWF5IGV4cGVjdCB5b3UgdG8gdXNlIGEgc3BlY2lmaWMgc3RvcmFnZSBvcmRlci4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSB1c2Ugb3RoZXIgbGlicmFyaWVzIHRoYW4KKyAgICBFaWdlbiwgYW5kIHRoZXNlIG90aGVyIGxpYnJhcmllcyBtYXkgZXhwZWN0IGEgY2VydGFpbiBzdG9yYWdlIG9yZGVyLiBJbiB0aGVzZSBjYXNlcyBpdCBtYXkgYmUgZWFzaWVzdCBhbmQKKyAgICBmYXN0ZXN0IHRvIHVzZSB0aGlzIHN0b3JhZ2Ugb3JkZXIgaW4geW91ciB3aG9sZSBwcm9ncmFtLgorICAtIEFsZ29yaXRobXMgdGhhdCB0cmF2ZXJzZSBhIG1hdHJpeCByb3cgYnkgcm93IHdpbGwgZ28gZmFzdGVyIHdoZW4gdGhlIG1hdHJpeCBpcyBzdG9yZWQgaW4gcm93LW1ham9yIG9yZGVyCisgICAgYmVjYXVzZSBvZiBiZXR0ZXIgZGF0YSBsb2NhbGl0eS4gU2ltaWxhcmx5LCBjb2x1bW4tYnktY29sdW1uIHRyYXZlcnNhbCBpcyBmYXN0ZXIgZm9yIGNvbHVtbi1tYWpvcgorICAgIG1hdHJpY2VzLiBJdCBtYXkgYmUgd29ydGh3aGlsZSB0byBleHBlcmltZW50IGEgYml0IHRvIGZpbmQgb3V0IHdoYXQgaXMgZmFzdGVyIGZvciB5b3VyIHBhcnRpY3VsYXIKKyAgICBhcHBsaWNhdGlvbi4KKyAgLSBUaGUgZGVmYXVsdCBpbiBFaWdlbiBpcyBjb2x1bW4tbWFqb3IuIE5hdHVyYWxseSwgbW9zdCBvZiB0aGUgZGV2ZWxvcG1lbnQgYW5kIHRlc3Rpbmcgb2YgdGhlIEVpZ2VuIGxpYnJhcnkKKyAgICBpcyB0aHVzIGRvbmUgd2l0aCBjb2x1bW4tbWFqb3IgbWF0cmljZXMuIFRoaXMgbWVhbnMgdGhhdCwgZXZlbiB0aG91Z2ggd2UgYWltIHRvIHN1cHBvcnQgY29sdW1uLW1ham9yIGFuZAorICAgIHJvdy1tYWpvciBzdG9yYWdlIG9yZGVycyB0cmFuc3BhcmVudGx5LCB0aGUgRWlnZW4gbGlicmFyeSBtYXkgd2VsbCB3b3JrIGJlc3Qgd2l0aCBjb2x1bW4tbWFqb3IgbWF0cmljZXMuCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzLmRveCBiL2RvYy9TdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmVkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzLmRveApAQCAtMCwwICsxLDE5MCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVG9waWNTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMgU3RydWN0dXJlcyBIYXZpbmcgRWlnZW4gTWVtYmVycworCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIFN0cnVjdEhhdmluZ0VpZ2VuTWVtYmVyc19zdW1tYXJ5IEV4ZWN1dGl2ZSBTdW1tYXJ5CisKK0lmIHlvdSBkZWZpbmUgYSBzdHJ1Y3R1cmUgaGF2aW5nIG1lbWJlcnMgb2YgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiLCB5b3UgbXVzdCBvdmVybG9hZCBpdHMgIm9wZXJhdG9yIG5ldyIgc28gdGhhdCBpdCBnZW5lcmF0ZXMgMTYtYnl0ZXMtYWxpZ25lZCBwb2ludGVycy4gRm9ydHVuYXRlbHksICVFaWdlbiBwcm92aWRlcyB5b3Ugd2l0aCBhIG1hY3JvIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgdGhhdCBkb2VzIHRoYXQgZm9yIHlvdS4KKworXHNlY3Rpb24gU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzX3doYXQgV2hhdCBraW5kIG9mIGNvZGUgbmVlZHMgdG8gYmUgY2hhbmdlZD8KKworVGhlIGtpbmQgb2YgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgaXMgdGhpczoKKworXGNvZGUKK2NsYXNzIEZvbworeworICAuLi4KKyAgRWlnZW46OlZlY3RvcjJkIHY7CisgIC4uLgorfTsKKworLi4uCisKK0ZvbyAqZm9vID0gbmV3IEZvbzsKK1xlbmRjb2RlCisKK0luIG90aGVyIHdvcmRzOiB5b3UgaGF2ZSBhIGNsYXNzIHRoYXQgaGFzIGFzIGEgbWVtYmVyIGEgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gb2JqZWN0IiwgYW5kIHRoZW4geW91IGR5bmFtaWNhbGx5IGNyZWF0ZSBhbiBvYmplY3Qgb2YgdGhhdCBjbGFzcy4KKworXHNlY3Rpb24gU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzX2hvdyBIb3cgc2hvdWxkIHN1Y2ggY29kZSBiZSBtb2RpZmllZD8KKworVmVyeSBlYXN5LCB5b3UganVzdCBuZWVkIHRvIHB1dCBhIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgbWFjcm8gaW4gYSBwdWJsaWMgcGFydCBvZiB5b3VyIGNsYXNzLCBsaWtlIHRoaXM6CisKK1xjb2RlCitjbGFzcyBGb28KK3sKKyAgLi4uCisgIEVpZ2VuOjpWZWN0b3IyZCB2OworICAuLi4KK3B1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworfTsKKworLi4uCisKK0ZvbyAqZm9vID0gbmV3IEZvbzsKK1xlbmRjb2RlCisKK1RoaXMgbWFjcm8gbWFrZXMgIm5ldyBGb28iIGFsd2F5cyByZXR1cm4gYW4gYWxpZ25lZCBwb2ludGVyLgorCitJZiB0aGlzIGFwcHJvYWNoIGlzIHRvbyBpbnRydXNpdmUsIHNlZSBhbHNvIHRoZSBccmVmIFN0cnVjdEhhdmluZ0VpZ2VuTWVtYmVyc19vdGhlcnNvbHV0aW9ucyAib3RoZXIgc29sdXRpb25zIi4KKworXHNlY3Rpb24gU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzX3doeSBXaHkgaXMgdGhpcyBuZWVkZWQ/CisKK09LIGxldCdzIHNheSB0aGF0IHlvdXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CisKK1xjb2RlCitjbGFzcyBGb28KK3sKKyAgLi4uCisgIEVpZ2VuOjpWZWN0b3IyZCB2OworICAuLi4KK307CisKKy4uLgorCitGb28gKmZvbyA9IG5ldyBGb287CitcZW5kY29kZQorCitBIEVpZ2VuOjpWZWN0b3IyZCBjb25zaXN0cyBvZiAyIGRvdWJsZXMsIHdoaWNoIGlzIDEyOCBiaXRzLiBXaGljaCBpcyBleGFjdGx5IHRoZSBzaXplIG9mIGEgU1NFIHBhY2tldCwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIFNTRSBmb3IgYWxsIHNvcnRzIG9mIG9wZXJhdGlvbnMgb24gdGhpcyB2ZWN0b3IuIEJ1dCBTU0UgaW5zdHJ1Y3Rpb25zIChhdCBsZWFzdCB0aGUgb25lcyB0aGF0ICVFaWdlbiB1c2VzLCB3aGljaCBhcmUgdGhlIGZhc3Qgb25lcykgcmVxdWlyZSAxMjgtYml0IGFsaWdubWVudC4gT3RoZXJ3aXNlIHlvdSBnZXQgYSBzZWdtZW50YXRpb24gZmF1bHQuCisKK0ZvciB0aGlzIHJlYXNvbiwgRWlnZW4gdGFrZXMgY2FyZSBieSBpdHNlbGYgdG8gcmVxdWlyZSAxMjgtYml0IGFsaWdubWVudCBmb3IgRWlnZW46OlZlY3RvcjJkLCBieSBkb2luZyB0d28gdGhpbmdzOgorXGxpIEVpZ2VuIHJlcXVpcmVzIDEyOC1iaXQgYWxpZ25tZW50IGZvciB0aGUgRWlnZW46OlZlY3RvcjJkJ3MgYXJyYXkgKG9mIDIgZG91YmxlcykuIFdpdGggR0NDLCB0aGlzIGlzIGRvbmUgd2l0aCBhIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpLgorXGxpIEVpZ2VuIG92ZXJsb2FkcyB0aGUgIm9wZXJhdG9yIG5ldyIgb2YgRWlnZW46OlZlY3RvcjJkIHNvIGl0IHdpbGwgYWx3YXlzIHJldHVybiAxMjgtYml0IGFsaWduZWQgcG9pbnRlcnMuCisKK1RodXMsIG5vcm1hbGx5LCB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbnl0aGluZywgRWlnZW4gaGFuZGxlcyBhbGlnbm1lbnQgZm9yIHlvdS4uLgorCisuLi4gZXhjZXB0IGluIG9uZSBjYXNlLiBXaGVuIHlvdSBoYXZlIGEgY2xhc3MgRm9vIGxpa2UgYWJvdmUsIGFuZCB5b3UgZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBuZXcgRm9vIGFzIGFib3ZlLCB0aGVuLCBzaW5jZSBGb28gZG9lc24ndCBoYXZlIGFsaWduZWQgIm9wZXJhdG9yIG5ldyIsIHRoZSByZXR1cm5lZCBwb2ludGVyIGZvbyBpcyBub3QgbmVjZXNzYXJpbHkgMTI4LWJpdCBhbGlnbmVkLgorCitUaGUgYWxpZ25tZW50IGF0dHJpYnV0ZSBvZiB0aGUgbWVtYmVyIHYgaXMgdGhlbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNsYXNzLCBmb28uIElmIHRoZSBmb28gcG9pbnRlciB3YXNuJ3QgYWxpZ25lZCwgdGhlbiBmb28tPnYgd29uJ3QgYmUgYWxpZ25lZCBlaXRoZXIhCisKK1RoZSBzb2x1dGlvbiBpcyB0byBsZXQgY2xhc3MgRm9vIGhhdmUgYW4gYWxpZ25lZCAib3BlcmF0b3IgbmV3IiwgYXMgd2Ugc2hvd2VkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCitcc2VjdGlvbiBTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnNfbW92ZXRvdG9wIFNob3VsZCBJIHRoZW4gcHV0IGFsbCB0aGUgbWVtYmVycyBvZiBFaWdlbiB0eXBlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIG15IGNsYXNzPworCitUaGF0J3Mgbm90IHJlcXVpcmVkLiBTaW5jZSBFaWdlbiB0YWtlcyBjYXJlIG9mIGRlY2xhcmluZyAxMjgtYml0IGFsaWdubWVudCwgYWxsIG1lbWJlcnMgdGhhdCBuZWVkIGl0IGFyZSBhdXRvbWF0aWNhbGx5IDEyOC1iaXQgYWxpZ25lZCByZWxhdGl2ZWx5IHRvIHRoZSBjbGFzcy4gU28gY29kZSBsaWtlIHRoaXMgd29ya3MgZmluZToKKworXGNvZGUKK2NsYXNzIEZvbworeworICBkb3VibGUgeDsKKyAgRWlnZW46OlZlY3RvcjJkIHY7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKK307CitcZW5kY29kZQorCitcc2VjdGlvbiBTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnNfZHluYW1pY3NpemUgV2hhdCBhYm91dCBkeW5hbWljLXNpemUgbWF0cmljZXMgYW5kIHZlY3RvcnM/CisKK0R5bmFtaWMtc2l6ZSBtYXRyaWNlcyBhbmQgdmVjdG9ycywgc3VjaCBhcyBFaWdlbjo6VmVjdG9yWGQsIGFsbG9jYXRlIGR5bmFtaWNhbGx5IHRoZWlyIG93biBhcnJheSBvZiBjb2VmZmljaWVudHMsIHNvIHRoZXkgdGFrZSBjYXJlIG9mIHJlcXVpcmluZyBhYnNvbHV0ZSBhbGlnbm1lbnQgYXV0b21hdGljYWxseS4gU28gdGhleSBkb24ndCBjYXVzZSB0aGlzIGlzc3VlLiBUaGUgaXNzdWUgZGlzY3Vzc2VkIGhlcmUgaXMgb25seSB3aXRoIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBtYXRyaWNlcyBhbmQgdmVjdG9ycyIuCisKK1xzZWN0aW9uIFN0cnVjdEhhdmluZ0VpZ2VuTWVtYmVyc19idWdpbmVpZ2VuIFNvIGlzIHRoaXMgYSBidWcgaW4gRWlnZW4/CisKK05vLCBpdCdzIG5vdCBvdXIgYnVnLiBJdCdzIG1vcmUgbGlrZSBhbiBpbmhlcmVudCBwcm9ibGVtIG9mIHRoZSBDKys5OCBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uLCBhbmQgc2VlbXMgdG8gYmUgdGFrZW4gY2FyZSBvZiBpbiB0aGUgdXBjb21pbmcgbGFuZ3VhZ2UgcmV2aXNpb246IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDcvbjIzNDEucGRmIj5zZWUgdGhpcyBkb2N1bWVudDwvYT4uCisKK1xzZWN0aW9uIFN0cnVjdEhhdmluZ0VpZ2VuTWVtYmVyc19jb25kaXRpb25hbCBXaGF0IGlmIEkgd2FudCB0byBkbyB0aGlzIGNvbmRpdGlvbm5hbGx5IChkZXBlbmRpbmcgb24gdGVtcGxhdGUgcGFyYW1ldGVycykgPworCitGb3IgdGhpcyBzaXR1YXRpb24sIHdlIG9mZmVyIHRoZSBtYWNybyBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKE5lZWRzVG9BbGlnbikuIEl0IHdpbGwgZ2VuZXJhdGUgYWxpZ25lZCBvcGVyYXRvcnMgbGlrZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXIGlmIE5lZWRzVG9BbGlnbiBpcyB0cnVlLiBJdCB3aWxsIGdlbmVyYXRlIG9wZXJhdG9ycyB3aXRoIHRoZSBkZWZhdWx0IGFsaWdubWVudCBpZiBOZWVkc1RvQWxpZ24gaXMgZmFsc2UuCisKK0V4YW1wbGU6CisKK1xjb2RlCit0ZW1wbGF0ZTxpbnQgbj4gY2xhc3MgRm9vCit7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxmbG9hdCxuLDE+IFZlY3RvcjsKKyAgZW51bSB7IE5lZWRzVG9BbGlnbiA9IChzaXplb2YoVmVjdG9yKSUxNik9PTAgfTsKKyAgLi4uCisgIFZlY3RvciB2OworICAuLi4KK3B1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihOZWVkc1RvQWxpZ24pCit9OworCisuLi4KKworRm9vPDQ+ICpmb280ID0gbmV3IEZvbzw0PjsgLy8gZm9vNCBpcyBndWFyYW50ZWVkIHRvIGJlIDEyOGJpdC1hbGlnbmVkCitGb288Mz4gKmZvbzMgPSBuZXcgRm9vPDM+OyAvLyBmb28zIGhhcyBvbmx5IHRoZSBzeXN0ZW0gZGVmYXVsdCBhbGlnbm1lbnQgZ3VhcmFudGVlCitcZW5kY29kZQorCisKK1xzZWN0aW9uIFN0cnVjdEhhdmluZ0VpZ2VuTWVtYmVyc19vdGhlcnNvbHV0aW9ucyBPdGhlciBzb2x1dGlvbnMKKworSW4gY2FzZSBwdXR0aW5nIHRoZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXIG1hY3JvIGV2ZXJ5d2hlcmUgaXMgdG9vIGludHJ1c2l2ZSwgdGhlcmUgZXhpc3RzIGF0IGxlYXN0IHR3byBvdGhlciBzb2x1dGlvbnMuCisKK1xzdWJzZWN0aW9uIG90aGVyc29sdXRpb25zMSBEaXNhYmxpbmcgYWxpZ25tZW50CisKK1RoZSBmaXJzdCBpcyB0byBkaXNhYmxlIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgdGhlIGZpeGVkIHNpemUgbWVtYmVyczoKK1xjb2RlCitjbGFzcyBGb28KK3sKKyAgLi4uCisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLDIsMSxFaWdlbjo6RG9udEFsaWduPiB2OworICAuLi4KK307CitcZW5kY29kZQorVGhpcyBoYXMgZm9yIGVmZmVjdCB0byBkaXNhYmxlIHZlY3Rvcml6YXRpb24gd2hlbiB1c2luZyBcYyB2LgorSWYgYSBmdW5jdGlvbiBvZiBGb28gdXNlcyBpdCBzZXZlcmFsIHRpbWVzLCB0aGVuIGl0IHN0aWxsIHBvc3NpYmxlIHRvIHJlLWVuYWJsZSB2ZWN0b3JpemF0aW9uIGJ5IGNvcHlpbmcgaXQgaW50byBhbiBhbGlnbmVkIHRlbXBvcmFyeSB2ZWN0b3I6CitcY29kZQordm9pZCBGb286OmJhcigpCit7CisgIEVpZ2VuOjpWZWN0b3IyZCBhdih2KTsKKyAgLy8gdXNlIGF2IGluc3RlYWQgb2YgdgorICAuLi4KKyAgLy8gaWYgYXYgY2hhbmdlZCwgdGhlbiBkbzoKKyAgdiA9IGF2OworfQorXGVuZGNvZGUKKworXHN1YnNlY3Rpb24gb3RoZXJzb2x1dGlvbnMyIFByaXZhdGUgc3RydWN0dXJlCisKK1RoZSBzZWNvbmQgY29uc2lzdCBpbiBzdG9yaW5nIHRoZSBmaXhlZC1zaXplIG9iamVjdHMgaW50byBhIHByaXZhdGUgc3RydWN0IHdoaWNoIHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGF0IHRoZSBjb25zdHJ1Y3Rpb24gdGltZSBvZiB0aGUgbWFpbiBvYmplY3Q6CisKK1xjb2RlCitzdHJ1Y3QgRm9vX2QKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICBWZWN0b3IyZCB2OworICAuLi4KK307CisKKworc3RydWN0IEZvbyB7CisgIEZvbygpIHsgaW5pdF9kKCk7IH0KKyAgfkZvbygpIHsgZGVsZXRlIGQ7IH0KKyAgdm9pZCBiYXIoKQorICB7CisgICAgLy8gdXNlIGQtPnYgaW5zdGVhZCBvZiB2CisgICAgLi4uCisgIH0KK3ByaXZhdGU6CisgIHZvaWQgaW5pdF9kKCkgeyBkID0gbmV3IEZvb19kOyB9CisgIEZvb19kKiBkOworfTsKK1xlbmRjb2RlCisKK1RoZSBjbGVhciBhZHZhbnRhZ2UgaGVyZSBpcyB0aGF0IHRoZSBjbGFzcyBGb28gcmVtYWlucyB1bmNoYW5nZWQgcmVnYXJkaW5nIGFsaWdubWVudCBpc3N1ZXMuIFRoZSBkcmF3YmFjayBpcyB0aGF0IGEgaGVhcCBhbGxvY2F0aW9uIHdpbGwgYmUgcmVxdWlyZWQgd2hhdHNvZXZlci4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1RlbXBsYXRlS2V5d29yZC5kb3ggYi9kb2MvVGVtcGxhdGVLZXl3b3JkLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRjZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RlbXBsYXRlS2V5d29yZC5kb3gKQEAgLTAsMCArMSwxMzMgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1RlbXBsYXRlS2V5d29yZCBUaGUgdGVtcGxhdGUgYW5kIHR5cGVuYW1lIGtleXdvcmRzIGluIEMrKworCitUaGVyZSBhcmUgdHdvIHVzZXMgZm9yIHRoZSBcYyB0ZW1wbGF0ZSBhbmQgXGMgdHlwZW5hbWUga2V5d29yZHMgaW4gQysrLiBPbmUgb2YgdGhlbSBpcyBmYWlybHkgd2VsbCBrbm93bgorYW1vbmdzdCBwcm9ncmFtbWVyczogdG8gZGVmaW5lIHRlbXBsYXRlcy4gVGhlIG90aGVyIHVzZSBpcyBtb3JlIG9ic2N1cmU6IHRvIHNwZWNpZnkgdGhhdCBhbiBleHByZXNzaW9uIHJlZmVycwordG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBvciBhIHR5cGUuIFRoaXMgcmVndWxhcmx5IHRyaXBzIHVwIHByb2dyYW1tZXJzIHRoYXQgdXNlIHRoZSAlRWlnZW4gbGlicmFyeSwgb2Z0ZW4KK2xlYWRpbmcgdG8gZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgY29tcGlsZXIgdGhhdCBhcmUgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQsIHN1Y2ggYXMgImV4cGVjdGVkIGV4cHJlc3Npb24iIG9yCisibm8gbWF0Y2ggZm9yIG9wZXJhdG9yPCIuCisKK1xlaWdlbkF1dG9Ub2MKKworCitcc2VjdGlvbiBUb3BpY1RlbXBsYXRlS2V5d29yZFRvRGVmaW5lVGVtcGxhdGVzIFVzaW5nIHRoZSB0ZW1wbGF0ZSBhbmQgdHlwZW5hbWUga2V5d29yZHMgdG8gZGVmaW5lIHRlbXBsYXRlcworCitUaGUgXGMgdGVtcGxhdGUgYW5kIFxjIHR5cGVuYW1lIGtleXdvcmRzIGFyZSByb3V0aW5lbHkgdXNlZCB0byBkZWZpbmUgdGVtcGxhdGVzLiBUaGlzIGlzIG5vdCB0aGUgdG9waWMgb2YgdGhpcworcGFnZSBhcyB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVhZGVyIGlzIGF3YXJlIG9mIHRoaXMgKG90aGVyd2lzZSBjb25zdWx0IGEgQysrIGJvb2spLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUKK3Nob3VsZCBpbGx1c3RyYXRlIHRoaXMgdXNlIG9mIHRoZSBcYyB0ZW1wbGF0ZSBrZXl3b3JkLgorCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIGlzUG9zaXRpdmUoVCB4KQoreworICAgIHJldHVybiB4ID4gMDsKK30KK1xlbmRjb2RlCisKK1dlIGNvdWxkIGp1c3QgYXMgd2VsbCBoYXZlIHdyaXR0ZW4gPHR0PnRlbXBsYXRlICZsdDtjbGFzcyBUJmd0OzwvdHQ+OyB0aGUga2V5d29yZHMgXGMgdHlwZW5hbWUgYW5kIFxjIGNsYXNzIGhhdmUgdGhlCitzYW1lIG1lYW5pbmcgaW4gdGhpcyBjb250ZXh0LgorCisKK1xzZWN0aW9uIFRvcGljVGVtcGxhdGVLZXl3b3JkRXhhbXBsZSBBbiBleGFtcGxlIHNob3dpbmcgdGhlIHNlY29uZCB1c2Ugb2YgdGhlIHRlbXBsYXRlIGtleXdvcmQKKworTGV0IHVzIGlsbHVzdHJhdGUgdGhlIHNlY29uZCB1c2Ugb2YgdGhlIFxjIHRlbXBsYXRlIGtleXdvcmQgd2l0aCBhbiBleGFtcGxlLiBTdXBwb3NlIHdlIHdhbnQgdG8gd3JpdGUgYQorZnVuY3Rpb24gd2hpY2ggY29waWVzIGFsbCBlbnRyaWVzIGluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgYSBtYXRyaXggaW50byBhbm90aGVyIG1hdHJpeCwgd2hpbGUga2VlcGluZwordGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCB1bmNoYW5nZWQuIEEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGFzIGZvbGxvd3M6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUZW1wbGF0ZUtleXdvcmRfc2ltcGxlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUZW1wbGF0ZUtleXdvcmRfc2ltcGxlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoYXQgd29ya3MgZmluZSwgYnV0IGl0IGlzIG5vdCB2ZXJ5IGZsZXhpYmxlLiBGaXJzdCwgaXQgb25seSB3b3JrcyB3aXRoIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcyBvZgorc2luZ2xlLXByZWNpc2lvbiBmbG9hdHM7IHRoZSBmdW5jdGlvbiBcYyBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydCgpIGRvZXMgbm90IGFjY2VwdCBzdGF0aWMtc2l6ZSBtYXRyaWNlcyBvcgorbWF0cmljZXMgd2l0aCBkb3VibGUtcHJlY2lzaW9uIG51bWJlcnMuIFNlY29uZCwgaWYgeW91IHVzZSBhbiBleHByZXNzaW9uIHN1Y2ggYXMKKzx0dD5tYXQudG9wTGVmdENvcm5lcigzLDMpPC90dD4gYXMgdGhlIHBhcmFtZXRlciBcYyBzcmMsIHRoZW4gdGhpcyBpcyBjb3BpZWQgaW50byBhIHRlbXBvcmFyeSB2YXJpYWJsZSBvZiB0eXBlCitNYXRyaXhYZjsgdGhpcyBjb3B5IGNhbiBiZSBhdm9pZGVkLgorCitBcyBleHBsYWluZWQgaW4gXHJlZiBUb3BpY0Z1bmN0aW9uVGFraW5nRWlnZW5UeXBlcywgYm90aCBpc3N1ZXMgY2FuIGJlIHJlc29sdmVkIGJ5IG1ha2luZyAKK1xjIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KCkgYWNjZXB0IGFueSBvYmplY3Qgb2YgdHlwZSBNYXRyaXhCYXNlLiBUaGlzIGxlYWRzIHRvIHRoZSBmb2xsb3dpbmcgY29kZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRlbXBsYXRlS2V5d29yZF9mbGV4aWJsZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBvbmUgbGluZSBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gXGMgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoKSBzaG93cyB0aGUgc2Vjb25kLCBtb3JlIG9ic2N1cmUgdXNlIG9mCit0aGUgXGMgdGVtcGxhdGUga2V5d29yZCBpbiBDKysuICBFdmVuIHRob3VnaCBpdCBtYXkgbG9vayBzdHJhbmdlLCB0aGUgXGMgdGVtcGxhdGUga2V5d29yZHMgYXJlIG5lY2Vzc2FyeQorYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZC4gV2l0aG91dCBpdCwgdGhlIGNvbXBpbGVyIG1heSByZWplY3QgdGhlIGNvZGUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGxpa2UgIm5vIG1hdGNoCitmb3Igb3BlcmF0b3I8Ii4KKworCitcc2VjdGlvbiBUb3BpY1RlbXBsYXRlS2V5d29yZEV4cGxhbmF0aW9uIEV4cGxhbmF0aW9uCisKK1RoZSByZWFzb24gdGhhdCB0aGUgXGMgdGVtcGxhdGUga2V5d29yZCBpcyBuZWNlc3NhcnkgaW4gdGhlIGxhc3QgZXhhbXBsZSBoYXMgdG8gZG8gd2l0aCB0aGUgcnVsZXMgZm9yIGhvdwordGVtcGxhdGVzIGFyZSBzdXBwb3NlZCB0byBiZSBjb21waWxlZCBpbiBDKysuIFRoZSBjb21waWxlciBoYXMgdG8gY2hlY2sgdGhlIGNvZGUgZm9yIGNvcnJlY3Qgc3ludGF4IGF0IHRoZQorcG9pbnQgd2hlcmUgdGhlIHRlbXBsYXRlIGlzIGRlZmluZWQsIHdpdGhvdXQga25vd2luZyB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgKFxjIERlcml2ZWQxCithbmQgXGMgRGVyaXZlZDIgaW4gdGhlIGV4YW1wbGUpLiBUaGF0IG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIGNhbm5vdCBrbm93IHRoYXQgPHR0PmRzdC50cmlhbmd1bGFyVmlldzwvdHQ+IGlzCithIG1lbWJlciB0ZW1wbGF0ZSBhbmQgdGhhdCB0aGUgZm9sbG93aW5nICZsdDsgc3ltYm9sIGlzIHBhcnQgb2YgdGhlIGRlbGltaXRlciBmb3IgdGhlIHRlbXBsYXRlCitwYXJhbWV0ZXIuIEFub3RoZXIgcG9zc2liaWxpdHkgd291bGQgYmUgdGhhdCA8dHQ+ZHN0LnRyaWFuZ3VsYXJWaWV3PC90dD4gaXMgYSBtZW1iZXIgdmFyaWFibGUgd2l0aCB0aGUgJmx0Oworc3ltYm9sIHJlZmVyaW5nIHRvIHRoZSA8dHQ+b3BlcmF0b3ImbHQ7KCk8L3R0PiBmdW5jdGlvbi4gSW4gZmFjdCwgdGhlIGNvbXBpbGVyIHNob3VsZCBjaG9vc2UgdGhlIHNlY29uZAorcG9zc2liaWxpdHksIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuIElmIDx0dD5kc3QudHJpYW5ndWxhclZpZXc8L3R0PiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSAoYXMgaW4gb3VyIGNhc2UpLAordGhlIHByb2dyYW1tZXIgc2hvdWxkIHNwZWNpZnkgdGhpcyBleHBsaWNpdGx5IHdpdGggdGhlIFxjIHRlbXBsYXRlIGtleXdvcmQgYW5kIHdyaXRlIDx0dD5kc3QudGVtcGxhdGUKK3RyaWFuZ3VsYXJWaWV3PC90dD4uCisKK1RoZSBwcmVjaXNlIHJ1bGVzIGFyZSByYXRoZXIgY29tcGxpY2F0ZWQsIGJ1dCBpZ25vcmluZyBzb21lIHN1YnRsZXRpZXMgd2UgY2FuIHN1bW1hcml6ZSB0aGVtIGFzIGZvbGxvd3M6CistIEEgPGVtPmRlcGVuZGVudCBuYW1lPC9lbT4gaXMgbmFtZSB0aGF0IGRlcGVuZHMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiBJbiB0aGUKKyAgZXhhbXBsZSwgXGMgZHN0IGlzIGEgZGVwZW5kZW50IG5hbWUgYmVjYXVzZSBpdCBpcyBvZiB0eXBlIDx0dD5NYXRyaXhCYXNlJmx0O0Rlcml2ZWQxJmd0OzwvdHQ+IHdoaWNoIGRlcGVuZHMKKyAgb24gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYyBEZXJpdmVkMS4KKy0gSWYgdGhlIGNvZGUgY29udGFpbnMgZWl0aGVyIG9uZSBvZiB0aGUgY29uc3RydWN0cyA8dHQ+eHh4Lnl5eTwvdHQ+IG9yIDx0dD54eHgtJmd0O3l5eTwvdHQ+IGFuZCBcYyB4eHggaXMgYQorICBkZXBlbmRlbnQgbmFtZSBhbmQgXGMgeXl5IHJlZmVycyB0byBhIG1lbWJlciB0ZW1wbGF0ZSwgdGhlbiB0aGUgXGMgdGVtcGxhdGUga2V5d29yZCBtdXN0IGJlIHVzZWQgYmVmb3JlIAorICBcYyB5eXksIGxlYWRpbmcgdG8gPHR0Pnh4eC50ZW1wbGF0ZSB5eXk8L3R0PiBvciA8dHQ+eHh4LSZndDt0ZW1wbGF0ZSB5eXk8L3R0Pi4KKy0gSWYgdGhlIGNvZGUgY29udGFpbnMgdGhlIGNvbnN0cnVjdCA8dHQ+eHh4Ojp5eXk8L3R0PiBhbmQgXGMgeHh4IGlzIGEgZGVwZW5kZW50IG5hbWUgYW5kIFxjIHl5eSByZWZlcnMgdG8gYQorICBtZW1iZXIgdHlwZWRlZiwgdGhlbiB0aGUgXGMgdHlwZW5hbWUga2V5d29yZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZSB3aG9sZSBjb25zdHJ1Y3QsIGxlYWRpbmcgdG8KKyAgPHR0PnR5cGVuYW1lIHh4eDo6eXl5PC90dD4uCisKK0FzIGFuIGV4YW1wbGUgd2hlcmUgdGhlIFxjIHR5cGVuYW1lIGtleXdvcmQgaXMgcmVxdWlyZWQsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBccmVmIFR1dG9yaWFsU3BhcnNlCitmb3IgaXRlcmF0aW5nIG92ZXIgdGhlIG5vbi16ZXJvIGVudHJpZXMgb2YgYSBzcGFyc2UgbWF0cml4IHR5cGU6CisKK1xjb2RlCitTcGFyc2VNYXRyaXhUeXBlIG1hdChyb3dzLGNvbHMpOworZm9yIChpbnQgaz0wOyBrPG1hdC5vdXRlclNpemUoKTsgKytrKQorICBmb3IgKFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobWF0LGspOyBpdDsgKytpdCkKKyAgeworICAgIC8qIC4uLiAqLworICB9CitcZW5kY29kZQorCitJZiBcYyBTcGFyc2VNYXRyaXhUeXBlIGRlcGVuZHMgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZW4gdGhlIFxjIHR5cGVuYW1lIGtleXdvcmQgaXMgcmVxdWlyZWQ6CisKK1xjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgaXRlcmF0ZU92ZXJTcGFyc2VNYXRyaXgoY29uc3QgU3BhcnNlTWF0cml4PFQ+JiBtYXQ7Cit7CisgIGZvciAoaW50IGs9MDsgazxtMS5vdXRlclNpemUoKTsgKytrKQorICAgIGZvciAodHlwZW5hbWUgU3BhcnNlTWF0cml4PFQ+OjpJbm5lckl0ZXJhdG9yIGl0KG1hdCxrKTsgaXQ7ICsraXQpCisgICAgeworICAgICAgLyogLi4uICovCisgICAgfQorfQorXGVuZGNvZGUKKworCitcc2VjdGlvbiBUb3BpY1RlbXBsYXRlS2V5d29yZFJlc291cmNlcyBSZXNvdXJjZXMgZm9yIGZ1cnRoZXIgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgYSBmdWxsZXIgZXhwbGFuYXRpb24gb2YgdGhpcyB0b3BpYywgdGhlIHJlYWRlciBtYXkgY29uc3VsdCB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CistIFRoZSBib29rICJDKysgVGVtcGxhdGUgTWV0YXByb2dyYW1taW5nIiBieSBEYXZpZCBBYnJhaGFtcyBhbmQgQWxla3NleSBHdXJ0b3ZveSBjb250YWlucyBhIHZlcnkgZ29vZAorICBleHBsYW5hdGlvbiBpbiBBcHBlbmRpeCBCICgiVGhlIHR5cGVuYW1lIGFuZCB0ZW1wbGF0ZSBLZXl3b3JkcyIpIHdoaWNoIGZvcm1lZCB0aGUgYmFzaXMgZm9yIHRoaXMgcGFnZS4KKy0gaHR0cDovL3BhZ2VzLmNzLndpc2MuZWR1L35kcmlzY29sbC90eXBlbmFtZS5odG1sCistIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvdGVtcGxhdGVzLmh0bWwjZmFxLTM1LjE4CistIGh0dHA6Ly93d3cuY29tZWF1Y29tcHV0aW5nLmNvbS90ZWNodGFsay90ZW1wbGF0ZXMvI3RlbXBsYXRlcHJlZml4CistIGh0dHA6Ly93d3cuY29tZWF1Y29tcHV0aW5nLmNvbS90ZWNodGFsay90ZW1wbGF0ZXMvI3R5cGVuYW1lCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNBbGlhc2luZy5kb3ggYi9kb2MvVG9waWNBbGlhc2luZy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmMTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Ub3BpY0FsaWFzaW5nLmRveApAQCAtMCwwICsxLDIzNyBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVG9waWNBbGlhc2luZyBBbGlhc2luZworCitJbiAlRWlnZW4sIGFsaWFzaW5nIHJlZmVycyB0byBhc3NpZ25tZW50IHN0YXRlbWVudCBpbiB3aGljaCB0aGUgc2FtZSBtYXRyaXggKG9yIGFycmF5IG9yIHZlY3RvcikgYXBwZWFycyBvbiB0aGUKK2xlZnQgYW5kIG9uIHRoZSByaWdodCBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvcnMuIFN0YXRlbWVudHMgbGlrZSA8dHQ+bWF0ID0gMiAqIG1hdDs8L3R0PiBvciA8dHQ+bWF0ID0KK21hdC50cmFuc3Bvc2UoKTs8L3R0PiBleGhpYml0IGFsaWFzaW5nLiBUaGUgYWxpYXNpbmcgaW4gdGhlIGZpcnN0IGV4YW1wbGUgaXMgaGFybWxlc3MsIGJ1dCB0aGUgYWxpYXNpbmcgaW4gdGhlCitzZWNvbmQgZXhhbXBsZSBsZWFkcyB0byB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoaXMgcGFnZSBleHBsYWlucyB3aGF0IGFsaWFzaW5nIGlzLCB3aGVuIGl0IGlzIGhhcm1mdWwsIGFuZCB3aGF0Cit0byBkbyBhYm91dCBpdC4KKworXGVpZ2VuQXV0b1RvYworCisKK1xzZWN0aW9uIFRvcGljQWxpYXNpbmdFeGFtcGxlcyBFeGFtcGxlcworCitIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUgZXhoaWJpdGluZyBhbGlhc2luZzoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTwvdGg+PHRoPk91dHB1dDwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2Jsb2NrLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2Jsb2NrLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBvdXRwdXQgaXMgbm90IHdoYXQgb25lIHdvdWxkIGV4cGVjdC4gVGhlIHByb2JsZW0gaXMgdGhlIGFzc2lnbm1lbnQKK1xjb2RlCittYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwyKSA9IG1hdC50b3BMZWZ0Q29ybmVyKDIsMik7CitcZW5kY29kZQorVGhpcyBhc3NpZ25tZW50IGV4aGliaXRzIGFsaWFzaW5nOiB0aGUgY29lZmZpY2llbnQgXGMgbWF0KDEsMSkgYXBwZWFycyBib3RoIGluIHRoZSBibG9jaworPHR0Pm1hdC5ib3R0b21SaWdodENvcm5lcigyLDIpPC90dD4gb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBhc3NpZ25tZW50IGFuZCB0aGUgYmxvY2sKKzx0dD5tYXQudG9wTGVmdENvcm5lcigyLDIpPC90dD4gb24gdGhlIHJpZ2h0LWhhbmQgc2lkZS4gQWZ0ZXIgdGhlIGFzc2lnbm1lbnQsIHRoZSAoMiwyKSBlbnRyeSBpbiB0aGUgYm90dG9tCityaWdodCBjb3JuZXIgc2hvdWxkIGhhdmUgdGhlIHZhbHVlIG9mIFxjIG1hdCgxLDEpIGJlZm9yZSB0aGUgYXNzaWdubWVudCwgd2hpY2ggaXMgNS4gSG93ZXZlciwgdGhlIG91dHB1dCBzaG93cwordGhhdCBcYyBtYXQoMiwyKSBpcyBhY3R1YWxseSAxLiBUaGUgcHJvYmxlbSBpcyB0aGF0ICVFaWdlbiB1c2VzIGxhenkgZXZhbHVhdGlvbiAoc2VlIAorXHJlZiBUb3BpY0VpZ2VuRXhwcmVzc2lvblRlbXBsYXRlcykgZm9yIDx0dD5tYXQudG9wTGVmdENvcm5lcigyLDIpPC90dD4uIFRoZSByZXN1bHQgaXMgc2ltaWxhciB0bworXGNvZGUKK21hdCgxLDEpID0gbWF0KDAsMCk7CittYXQoMSwyKSA9IG1hdCgwLDEpOworbWF0KDIsMSkgPSBtYXQoMSwwKTsKK21hdCgyLDIpID0gbWF0KDEsMSk7CitcZW5kY29kZQorVGh1cywgXGMgbWF0KDIsMikgaXMgYXNzaWduZWQgdGhlIFxlIG5ldyB2YWx1ZSBvZiBcYyBtYXQoMSwxKSBpbnN0ZWFkIG9mIHRoZSBvbGQgdmFsdWUuIFRoZSBuZXh0IHNlY3Rpb24KK2V4cGxhaW5zIGhvdyB0byBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgY2FsbGluZyBcbGluayBEZW5zZUJhc2U6OmV2YWwoKSBldmFsKClcZW5kbGluay4KKworQWxpYXNpbmcgb2NjdXJzIG1vcmUgbmF0dXJhbGx5IHdoZW4gdHJ5aW5nIHRvIHNocmluayBhIG1hdHJpeC4gRm9yIGV4YW1wbGUsIHRoZSBleHByZXNzaW9ucyA8dHQ+dmVjID0KK3ZlYy5oZWFkKG4pPC90dD4gYW5kIDx0dD5tYXQgPSBtYXQuYmxvY2soaSxqLHIsYyk8L3R0PiBleGhpYml0IGFsaWFzaW5nLgorCitJbiBnZW5lcmFsLCBhbGlhc2luZyBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXQgY29tcGlsZSB0aW1lOiBpZiBcYyBtYXQgaW4gdGhlIGZpcnN0IGV4YW1wbGUgd2VyZSBhIGJpdCBiaWdnZXIsCit0aGVuIHRoZSBibG9ja3Mgd291bGQgbm90IG92ZXJsYXAsIGFuZCB0aGVyZSB3b3VsZCBiZSBubyBhbGlhc2luZyBwcm9ibGVtLiBIb3dldmVyLCAlRWlnZW4gZG9lcyBkZXRlY3Qgc29tZQoraW5zdGFuY2VzIG9mIGFsaWFzaW5nLCBhbGJlaXQgYXQgcnVuIHRpbWUuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZXhoaWJpdGluZyBhbGlhc2luZyB3YXMgbWVudGlvbmVkIGluIFxyZWYKK1R1dG9yaWFsTWF0cml4QXJpdGhtZXRpYyA6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworQWdhaW4sIHRoZSBvdXRwdXQgc2hvd3MgdGhlIGFsaWFzaW5nIGlzc3VlLiBIb3dldmVyLCBieSBkZWZhdWx0ICVFaWdlbiB1c2VzIGEgcnVuLXRpbWUgYXNzZXJ0aW9uIHRvIGRldGVjdCB0aGlzCithbmQgZXhpdHMgd2l0aCBhIG1lc3NhZ2UgbGlrZQorCitcdmVyYmF0aW0KK3ZvaWQgRWlnZW46OkRlbnNlQmFzZTxEZXJpdmVkPjo6Y2hlY2tUcmFuc3Bvc2VBbGlhc2luZyhjb25zdCBPdGhlckRlcml2ZWQmKSBjb25zdCAKK1t3aXRoIE90aGVyRGVyaXZlZCA9IEVpZ2VuOjpUcmFuc3Bvc2U8RWlnZW46Ok1hdHJpeDxpbnQsIDIsIDIsIDAsIDIsIDI+ID4sIERlcml2ZWQgPSBFaWdlbjo6TWF0cml4PGludCwgMiwgMiwgMCwgMiwgMj5dOiAKK0Fzc2VydGlvbiBgKCFpbnRlcm5hbDo6Y2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX3NlbGVjdG9yPFNjYWxhcixpbnRlcm5hbDo6Ymxhc190cmFpdHM8RGVyaXZlZD46OklzVHJhbnNwb3NlZCxPdGhlckRlcml2ZWQ+OjpydW4oaW50ZXJuYWw6OmV4dHJhY3RfZGF0YShkZXJpdmVkKCkpLCBvdGhlcikpIAorJiYgImFsaWFzaW5nIGRldGVjdGVkIGR1cmluZyB0cmFuc3Bvc2l0aW9uLCB1c2UgdHJhbnNwb3NlSW5QbGFjZSgpIG9yIGV2YWx1YXRlIHRoZSByaHMgaW50byBhIHRlbXBvcmFyeSB1c2luZyAuZXZhbCgpIicgZmFpbGVkLgorXGVuZHZlcmJhdGltCisKK1RoZSB1c2VyIGNhbiB0dXJuICVFaWdlbidzIHJ1bi10aW1lIGFzc2VydGlvbnMgbGlrZSB0aGUgb25lIHRvIGRldGVjdCB0aGlzIGFsaWFzaW5nIHByb2JsZW0gb2ZmIGJ5IGRlZmluaW5nIHRoZQorRUlHRU5fTk9fREVCVUcgbWFjcm8sIGFuZCB0aGUgYWJvdmUgcHJvZ3JhbSB3YXMgY29tcGlsZWQgd2l0aCB0aGlzIG1hY3JvIHR1cm5lZCBvZmYgaW4gb3JkZXIgdG8gaWxsdXN0cmF0ZSB0aGUKK2FsaWFzaW5nIHByb2JsZW0uIFNlZSBccmVmIFRvcGljQXNzZXJ0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAlRWlnZW4ncyBydW4tdGltZSBhc3NlcnRpb25zLgorCisKK1xzZWN0aW9uIFRvcGljQWxpYXNpbmdTb2x1dGlvbiBSZXNvbHZpbmcgYWxpYXNpbmcgaXNzdWVzCisKK0lmIHlvdSB1bmRlcnN0YW5kIHRoZSBjYXVzZSBvZiB0aGUgYWxpYXNpbmcgaXNzdWUsIHRoZW4gaXQgaXMgb2J2aW91cyB3aGF0IG11c3QgaGFwcGVuIHRvIHNvbHZlIGl0OiAlRWlnZW4gaGFzCit0byBldmFsdWF0ZSB0aGUgcmlnaHQtaGFuZCBzaWRlIGZ1bGx5IGludG8gYSB0ZW1wb3JhcnkgbWF0cml4L2FycmF5IGFuZCB0aGVuIGFzc2lnbiBpdCB0byB0aGUgbGVmdC1oYW5kCitzaWRlLiBUaGUgZnVuY3Rpb24gXGxpbmsgRGVuc2VCYXNlOjpldmFsKCkgZXZhbCgpIFxlbmRsaW5rIGRvZXMgcHJlY2lzZWx5IHRoYXQuCisKK0ZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb3JyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZmlyc3QgZXhhbXBsZSBhYm92ZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTwvdGg+PHRoPk91dHB1dDwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRvcGljQWxpYXNpbmdfYmxvY2tfY29ycmVjdC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitOb3csIFxjIG1hdCgyLDIpIGVxdWFscyA1IGFmdGVyIHRoZSBhc3NpZ25tZW50LCBhcyBpdCBzaG91bGQgYmUuCisKK1RoZSBzYW1lIHNvbHV0aW9uIGFsc28gd29ya3MgZm9yIHRoZSBzZWNvbmQgZXhhbXBsZSwgd2l0aCB0aGUgdHJhbnNwb3NlOiBzaW1wbHkgcmVwbGFjZSB0aGUgbGluZSAKKzx0dD5hID0gYS50cmFuc3Bvc2UoKTs8L3R0PiB3aXRoIDx0dD5hID0gYS50cmFuc3Bvc2UoKS5ldmFsKCk7PC90dD4uIEhvd2V2ZXIsIGluIHRoaXMgY29tbW9uIGNhc2UgdGhlcmUgaXMgYQorYmV0dGVyIHNvbHV0aW9uLiAlRWlnZW4gcHJvdmlkZXMgdGhlIHNwZWNpYWwtcHVycG9zZSBmdW5jdGlvbiAKK1xsaW5rIERlbnNlQmFzZTo6dHJhbnNwb3NlSW5QbGFjZSgpIHRyYW5zcG9zZUluUGxhY2UoKSBcZW5kbGluayB3aGljaCByZXBsYWNlcyBhIG1hdHJpeCBieSBpdHMgdHJhbnNwb3NlLiAKK1RoaXMgaXMgc2hvd24gYmVsb3c6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2UuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0lmIGFuIHh4eEluUGxhY2UoKSBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRoZW4gaXQgaXMgYmVzdCB0byB1c2UgaXQsIGJlY2F1c2UgaXQgaW5kaWNhdGVzIG1vcmUgY2xlYXJseSB3aGF0IHlvdQorYXJlIGRvaW5nLiBUaGlzIG1heSBhbHNvIGFsbG93ICVFaWdlbiB0byBvcHRpbWl6ZSBtb3JlIGFnZ3Jlc3NpdmVseS4gVGhlc2UgYXJlIHNvbWUgb2YgdGhlIHh4eEluUGxhY2UoKQorZnVuY3Rpb25zIHByb3ZpZGVkOiAKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5PcmlnaW5hbCBmdW5jdGlvbjwvdGg+PHRoPkluLXBsYWNlIGZ1bmN0aW9uPC90aD48L3RyPgorPHRyPiA8dGQ+IE1hdHJpeEJhc2U6OmFkam9pbnQoKSA8L3RkPiA8dGQ+IE1hdHJpeEJhc2U6OmFkam9pbnRJblBsYWNlKCkgPC90ZD4gPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4gPHRkPiBEZW5zZUJhc2U6OnJldmVyc2UoKSA8L3RkPiA8dGQ+IERlbnNlQmFzZTo6cmV2ZXJzZUluUGxhY2UoKSA8L3RkPiA8L3RyPgorPHRyPiA8dGQ+IExETFQ6OnNvbHZlKCkgPC90ZD4gPHRkPiBMRExUOjpzb2x2ZUluUGxhY2UoKSA8L3RkPiA8L3RyPgorPHRyIGNsYXNzPSJhbHQiPiA8dGQ+IExMVDo6c29sdmUoKSA8L3RkPiA8dGQ+IExMVDo6c29sdmVJblBsYWNlKCkgPC90ZD4gPC90cj4KKzx0cj4gPHRkPiBUcmlhbmd1bGFyVmlldzo6c29sdmUoKSA8L3RkPiA8dGQ+IFRyaWFuZ3VsYXJWaWV3Ojpzb2x2ZUluUGxhY2UoKSA8L3RkPiA8L3RyPgorPHRyIGNsYXNzPSJhbHQiPiA8dGQ+IERlbnNlQmFzZTo6dHJhbnNwb3NlKCkgPC90ZD4gPHRkPiBEZW5zZUJhc2U6OnRyYW5zcG9zZUluUGxhY2UoKSA8L3RkPiA8L3RyPgorPC90YWJsZT4KKworSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBhIG1hdHJpeCBvciB2ZWN0b3IgaXMgc2hydW5rIHVzaW5nIGFuIGV4cHJlc3Npb24gbGlrZSA8dHQ+dmVjID0gdmVjLmhlYWQobik8L3R0PiwKK3lvdSBjYW4gdXNlIFxsaW5rIFBsYWluT2JqZWN0QmFzZTo6Y29uc2VydmF0aXZlUmVzaXplKCkgY29uc2VydmF0aXZlUmVzaXplKCkgXGVuZGxpbmsuCisKKworXHNlY3Rpb24gVG9waWNBbGlhc2luZ0N3aXNlIEFsaWFzaW5nIGFuZCBjb21wb25lbnQtd2lzZSBvcGVyYXRpb25zCisKK0FzIGV4cGxhaW5lZCBhYm92ZSwgaXQgbWF5IGJlIGRhbmdlcm91cyBpZiB0aGUgc2FtZSBtYXRyaXggb3IgYXJyYXkgb2NjdXJzIG9uIGJvdGggdGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUKK3JpZ2h0LWhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLCBhbmQgaXQgaXMgdGhlbiBvZnRlbiBuZWNlc3NhcnkgdG8gZXZhbHVhdGUgdGhlIHJpZ2h0LWhhbmQgc2lkZQorZXhwbGljaXRseS4gSG93ZXZlciwgYXBwbHlpbmcgY29tcG9uZW50LXdpc2Ugb3BlcmF0aW9ucyAoc3VjaCBhcyBtYXRyaXggYWRkaXRpb24sIHNjYWxhciBtdWx0aXBsaWNhdGlvbiBhbmQKK2FycmF5IG11bHRpcGxpY2F0aW9uKSBpcyBzYWZlLiAKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGhhcyBvbmx5IGNvbXBvbmVudC13aXNlIG9wZXJhdGlvbnMuIFRodXMsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIFxsaW5rIERlbnNlQmFzZTo6ZXZhbCgpCitldmFsKCkgXGVuZGxpbmsgZXZlbiB0aG91Z2ggdGhlIHNhbWUgbWF0cml4IGFwcGVhcnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19jd2lzZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVG9waWNBbGlhc2luZ19jd2lzZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitJbiBnZW5lcmFsLCBhbiBhc3NpZ25tZW50IGlzIHNhZmUgaWYgdGhlIChpLGopIGVudHJ5IG9mIHRoZSBleHByZXNzaW9uIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgZGVwZW5kcyBvbmx5IG9uCit0aGUgKGksaikgZW50cnkgb2YgdGhlIG1hdHJpeCBvciBhcnJheSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgYW5kIG5vdCBvbiBhbnkgb3RoZXIgZW50cmllcy4gSW4gdGhhdCBjYXNlIGl0IGlzCitub3QgbmVjZXNzYXJ5IHRvIGV2YWx1YXRlIHRoZSByaWdodC1oYW5kIHNpZGUgZXhwbGljaXRseS4KKworCitcc2VjdGlvbiBUb3BpY0FsaWFzaW5nTWF0cml4TXVsdCBBbGlhc2luZyBhbmQgbWF0cml4IG11bHRpcGxpY2F0aW9uCisKK01hdHJpeCBtdWx0aXBsaWNhdGlvbiBpcyB0aGUgb25seSBvcGVyYXRpb24gaW4gJUVpZ2VuIHRoYXQgYXNzdW1lcyBhbGlhc2luZyBieSBkZWZhdWx0LCA8c3Ryb25nPnVuZGVyIHRoZQorY29uZGl0aW9uIHRoYXQgdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCBpcyBub3QgcmVzaXplZDwvc3Ryb25nPi4KK1RodXMsIGlmIFxjIG1hdEEgaXMgYSBcYiBzcXVhcmVkIG1hdHJpeCwgdGhlbiB0aGUgc3RhdGVtZW50IDx0dD5tYXRBID0gbWF0QSAqIG1hdEE7PC90dD4gaXMgc2FmZS4KK0FsbCBvdGhlciBvcGVyYXRpb25zIGluICVFaWdlbiBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gYWxpYXNpbmcgcHJvYmxlbXMsCitlaXRoZXIgYmVjYXVzZSB0aGUgcmVzdWx0IGlzIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG1hdHJpeCBvciBiZWNhdXNlIGl0IGlzIGEgY29tcG9uZW50LXdpc2Ugb3BlcmF0aW9uLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDEuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDEub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworSG93ZXZlciwgdGhpcyBjb21lcyBhdCBhIHByaWNlLiBXaGVuIGV4ZWN1dGluZyB0aGUgZXhwcmVzc2lvbiA8dHQ+bWF0QSA9IG1hdEEgKiBtYXRBPC90dD4sICVFaWdlbiBldmFsdWF0ZXMgdGhlCitwcm9kdWN0IGluIGEgdGVtcG9yYXJ5IG1hdHJpeCB3aGljaCBpcyBhc3NpZ25lZCB0byBcYyBtYXRBIGFmdGVyIHRoZSBjb21wdXRhdGlvbi4gVGhpcyBpcyBmaW5lLiBCdXQgJUVpZ2VuIGRvZXMKK3RoZSBzYW1lIHdoZW4gdGhlIHByb2R1Y3QgaXMgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbWF0cml4IChlLmcuLCA8dHQ+bWF0QiA9IG1hdEEgKiBtYXRBPC90dD4pLiBJbiB0aGF0IGNhc2UsCitpdCBpcyBtb3JlIGVmZmljaWVudCB0byBldmFsdWF0ZSB0aGUgcHJvZHVjdCBkaXJlY3RseSBpbnRvIFxjIG1hdEIgaW5zdGVhZCBvZiBldmFsdWF0aW5nIGl0IGZpcnN0IGludG8gYQordGVtcG9yYXJ5IG1hdHJpeCBhbmQgY29weWluZyB0aGF0IG1hdHJpeCB0byBcYyBtYXRCLgorCitUaGUgdXNlciBjYW4gaW5kaWNhdGUgd2l0aCB0aGUgXGxpbmsgTWF0cml4QmFzZTo6bm9hbGlhcygpIG5vYWxpYXMoKVxlbmRsaW5rIGZ1bmN0aW9uIHRoYXQgdGhlcmUgaXMgbm8KK2FsaWFzaW5nLCBhcyBmb2xsb3dzOiA8dHQ+bWF0Qi5ub2FsaWFzKCkgPSBtYXRBICogbWF0QTwvdHQ+LiBUaGlzIGFsbG93cyAlRWlnZW4gdG8gZXZhbHVhdGUgdGhlIG1hdHJpeCBwcm9kdWN0Cis8dHQ+bWF0QSAqIG1hdEE8L3R0PiBkaXJlY3RseSBpbnRvIFxjIG1hdEIuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0Mi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0Mi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitPZiBjb3Vyc2UsIHlvdSBzaG91bGQgbm90IHVzZSBcYyBub2FsaWFzKCkgd2hlbiB0aGVyZSBpcyBpbiBmYWN0IGFsaWFzaW5nIHRha2luZyBwbGFjZS4gSWYgeW91IGRvLCB0aGVuIHlvdQorbWF5IGdldCB3cm9uZyByZXN1bHRzOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworTW9yZW92ZXIsIHN0YXJ0aW5nIGluIEVpZ2VuIDMuMywgYWxpYXNpbmcgaXMgXGIgbm90IGFzc3VtZWQgaWYgdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCBpcyByZXNpemVkIGFuZCB0aGUgcHJvZHVjdCBpcyBub3QgZGlyZWN0bHkgYXNzaWduZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgorVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYWxzbyB3cm9uZzoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTwvdGg+PHRoPk91dHB1dDwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUb3BpY0FsaWFzaW5nX211bHQ0LmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY0FsaWFzaW5nX211bHQ0Lm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0FzIGZvciBhbnkgYWxpYXNpbmcgaXNzdWUsIHlvdSBjYW4gcmVzb2x2ZSBpdCBieSBleHBsaWNpdGx5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gcHJpb3IgdG8gYXNzaWdubWVudDoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0NS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0NS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitcc2VjdGlvbiBUb3BpY0FsaWFzaW5nU3VtbWFyeSBTdW1tYXJ5CisKK0FsaWFzaW5nIG9jY3VycyB3aGVuIHRoZSBzYW1lIG1hdHJpeCBvciBhcnJheSBjb2VmZmljaWVudHMgYXBwZWFyIGJvdGggb24gdGhlIGxlZnQtIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mCithbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorIC0gQWxpYXNpbmcgaXMgaGFybWxlc3Mgd2l0aCBjb2VmZmljaWVudC13aXNlIGNvbXB1dGF0aW9uczsgdGhpcyBpbmNsdWRlcyBzY2FsYXIgbXVsdGlwbGljYXRpb24gYW5kIG1hdHJpeCBvcgorICAgYXJyYXkgYWRkaXRpb24uCisgLSBXaGVuIHlvdSBtdWx0aXBseSB0d28gbWF0cmljZXMsICVFaWdlbiBhc3N1bWVzIHRoYXQgYWxpYXNpbmcgb2NjdXJzLiBJZiB5b3Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIGFsaWFzaW5nLAorICAgdGhlbiB5b3UgY2FuIHVzZSBcbGluayBNYXRyaXhCYXNlOjpub2FsaWFzKCkgbm9hbGlhcygpXGVuZGxpbmsuCisgLSBJbiBhbGwgb3RoZXIgc2l0dWF0aW9ucywgJUVpZ2VuIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBubyBhbGlhc2luZyBpc3N1ZSBhbmQgdGh1cyBnaXZlcyB0aGUgd3JvbmcgcmVzdWx0IGlmCisgICBhbGlhc2luZyBkb2VzIGluIGZhY3Qgb2NjdXIuIFRvIHByZXZlbnQgdGhpcywgeW91IGhhdmUgdG8gdXNlIFxsaW5rIERlbnNlQmFzZTo6ZXZhbCgpIGV2YWwoKSBcZW5kbGluayBvcgorICAgb25lIG9mIHRoZSB4eHhJblBsYWNlKCkgZnVuY3Rpb25zLgorCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL1RvcGljQXNzZXJ0aW9ucy5kb3ggYi9kb2MvVG9waWNBc3NlcnRpb25zLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI0ZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RvcGljQXNzZXJ0aW9ucy5kb3gKQEAgLTAsMCArMSwxMDggQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0Fzc2VydGlvbnMgQXNzZXJ0aW9ucworCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIFBsYWluQXNzZXJ0IEFzc2VydGlvbnMKKworVGhlIG1hY3JvIGVpZ2VuX2Fzc2VydCBpcyBkZWZpbmVkIHRvIGJlIFxjIGVpZ2VuX3BsYWluX2Fzc2VydCBieSBkZWZhdWx0LiBXZSB1c2UgZWlnZW5fcGxhaW5fYXNzZXJ0IGluc3RlYWQgb2YgXGMgYXNzZXJ0IHRvIHdvcmsgYXJvdW5kIGEga25vd24gYnVnIGZvciBHQ0MgPD0gNC4zLiBCYXNpY2FsbHksIGVpZ2VuX3BsYWluX2Fzc2VydCBcYSBpcyBcYyBhc3NlcnQuCisKK1xzdWJzZWN0aW9uIFJlZGVmaW5lQXNzZXJ0IFJlZGVmaW5pbmcgYXNzZXJ0aW9ucworCitCb3RoIGVpZ2VuX2Fzc2VydCBhbmQgZWlnZW5fcGxhaW5fYXNzZXJ0IGFyZSBkZWZpbmVkIGluIE1hY3Jvcy5oLiBEZWZpbmluZyBlaWdlbl9hc3NlcnQgaW5kaXJlY3RseSBnaXZlcyB5b3UgYSBjaGFuY2UgdG8gY2hhbmdlIGl0cyBiZWhhdmlvci4gWW91IGNhbiByZWRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBlbHNlIHN1Y2ggYXMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLCBhbmQgZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IGJlaGF2aW9yIHdpdGggZWlnZW5fcGxhaW5fYXNzZXJ0LiBUaGUgY29kZSBiZWxvdyB0ZWxscyBFaWdlbiB0byB0aHJvdyBhbiBzdGQ6OnJ1bnRpbWVfZXJyb3I6CisKK1xjb2RlCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI3VuZGVmIGVpZ2VuX2Fzc2VydAorI2RlZmluZSBlaWdlbl9hc3NlcnQoeCkgXAorICBpZiAoISh4KSkgeyB0aHJvdyAoc3RkOjpydW50aW1lX2Vycm9yKCJQdXQgeW91ciBtZXNzYWdlIGhlcmUiKSk7IH0KK1xlbmRjb2RlCisKK1xzdWJzZWN0aW9uIERpc2FibGVBc3NlcnQgRGlzYWJsaW5nIGFzc2VydGlvbnMKKworQXNzZXJ0aW9ucyBjb3N0IHJ1biB0aW1lIGFuZCBjYW4gYmUgdHVybmVkIG9mZi4gWW91IGNhbiBzdXBwcmVzcyBlaWdlbl9hc3NlcnQgYnkgZGVmaW5pbmcgXGMgRUlHRU5fTk9fREVCVUcgXGIgYmVmb3JlIGluY2x1ZGluZyBFaWdlbiBoZWFkZXJzLiBcYyBFSUdFTl9OT19ERUJVRyBpcyB1bmRlZmluZWQgYnkgZGVmYXVsdCB1bmxlc3MgXGMgTkRFQlVHIGlzIGRlZmluZWQuCisKK1xzZWN0aW9uIFN0YXRpY0Fzc2VydCBTdGF0aWMgYXNzZXJ0aW9ucworCitTdGF0aWMgYXNzZXJ0aW9ucyBhcmUgbm90IHN0YW5kYXJkaXplZCB1bnRpbCBDKysxMS4gSG93ZXZlciwgaW4gdGhlIEVpZ2VuIGxpYnJhcnksIHRoZXJlIGFyZSBtYW55IGNvbmRpdGlvbnMgY2FuIGFuZCBzaG91bGQgYmUgZGV0ZWN0ZWRhdCBjb21waWxlIHRpbWUuIEZvciBpbnN0YW5jZSwgd2UgdXNlIHN0YXRpYyBhc3NlcnRpb25zIHRvIHByZXZlbnQgdGhlIGNvZGUgYmVsb3cgZnJvbSBjb21waWxpbmcuCisKK1xjb2RlCitNYXRyaXgzZCgpICArIE1hdHJpeDRkKCk7ICAgLy8gYWRkaW5nIG1hdHJpY2VzIG9mIGRpZmZlcmVudCBzaXplcworTWF0cml4NGNkKCkgKiBWZWN0b3IzY2QoKTsgIC8vIGludmFsaWQgcHJvZHVjdCBrbm93biBhdCBjb21waWxlIHRpbWUKK1xlbmRjb2RlCisKK1N0YXRpYyBhc3NlcnRpb25zIGFyZSBkZWZpbmVkIGluIFN0YXRpY0Fzc2VydC5oLiBJZiB0aGVyZSBpcyBuYXRpdmUgc3RhdGljX2Fzc2VydCwgd2UgdXNlIGl0LiBPdGhlcndpc2UsIHdlIGhhdmUgaW1wbGVtZW50ZWQgYW4gYXNzZXJ0aW9uIG1hY3JvIHRoYXQgY2FuIHNob3cgYSBsaW1pdGVkIHJhbmdlIG9mIG1lc3NhZ2VzLgorCitPbmUgY2FuIGVhc2lseSBjb21lIHVwIHdpdGggc3RhdGljIGFzc2VydGlvbnMgd2l0aG91dCBtZXNzYWdlcywgc3VjaCBhczoKKworXGNvZGUKKyNkZWZpbmUgU1RBVElDX0FTU0VSVCh4KSBcCisgIHN3aXRjaCgwKSB7IGNhc2UgMDogY2FzZSB4OjsgfQorXGVuZGNvZGUKKworSG93ZXZlciwgdGhlIGV4YW1wbGUgYWJvdmUgb2J2aW91c2x5IGNhbm5vdCB0ZWxsIHdoeSB0aGUgYXNzZXJ0aW9uIGZhaWxlZC4gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgYSBcYyBzdHJ1Y3QgaW4gbmFtZXNwYWNlIEVpZ2VuOjppbnRlcm5hbCB0byBoYW5kbGUgYXZhaWxhYmxlIG1lc3NhZ2VzLgorCitcY29kZQordGVtcGxhdGU8Ym9vbCBjb25kaXRpb24+CitzdHJ1Y3Qgc3RhdGljX2Fzc2VydGlvbiB7fTsKKwordGVtcGxhdGU8Pgorc3RydWN0IHN0YXRpY19hc3NlcnRpb248dHJ1ZT4KK3sKKyAgZW51bSB7CisgICAgWU9VX1RSSUVEX0NBTExJTkdfQV9WRUNUT1JfTUVUSE9EX09OX0FfTUFUUklYLAorICAgIFlPVV9NSVhFRF9WRUNUT1JTX09GX0RJRkZFUkVOVF9TSVpFUywKKyAgICAvLyBzZWUgU3RhdGljQXNzZXJ0LmggZm9yIGFsbCBlbnVtcy4KKyAgfTsKK307CitcZW5kY29kZQorCitBbmQgdGhlbiwgd2UgZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlQoQ09ORElUSU9OLE1TRykgdG8gYWNjZXNzIEVpZ2VuOjppbnRlcm5hbDo6c3RhdGljX2Fzc2VydGlvbjxib29sKENPTkRJVElPTik+OjpNU0cuIElmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIGludG8gXGMgZmFsc2UsIHlvdXIgY29tcGlsZXIgZGlzcGxheXMgYSBsb3Qgb2YgbWVzc2FnZXMgZXhwbGFpbmluZyB0aGVyZSBpcyBubyBNU0cgaW4gc3RhdGljX2Fzc2VydDxmYWxzZT4uIE5ldmVydGhlbGVzcywgdGhpcyBpcyBcYSBub3QgaW4gd2hhdCB3ZSBhcmUgaW50ZXJlc3RlZC4gQXMgeW91IGNhbiBzZWUsIGFsbCBtZW1iZXJzIG9mIHN0YXRpY19hc3NlcnQ8dHJ1ZT4gYXJlIEFMTF9DQVBTX0FORF9USEVZX0FSRV9TSE9VVElORy4KKworXHdhcm5pbmcKK1doZW4gdXNpbmcgdGhpcyBtYWNybywgTVNHIHNob3VsZCBiZSBhIG1lbWJlciBvZiBzdGF0aWNfYXNzZXJ0aW9uPHRydWU+LCBvciB0aGUgc3RhdGljIGFzc2VydGlvbiBcYiBhbHdheXMgZmFpbHMuCitDdXJyZW50bHksIGl0IGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb24gc2NvcGUuCisKK1xzdWJzZWN0aW9uIERlcml2ZWRTdGF0aWNBc3NlcnQgRGVyaXZlZCBzdGF0aWMgYXNzZXJ0aW9ucworCitUaGVyZSBhcmUgb3RoZXIgbWFjcm9zIGRlcml2ZWQgZnJvbSBFSUdFTl9TVEFUSUNfQVNTRVJUIHRvIGVuaGFuY2UgcmVhZGFiaWxpdHkuIFRoZWlyIG5hbWVzIGFyZSBzZWxmLWV4cGxhbmF0b3J5LgorCistIFxiIEVJR0VOX1NUQVRJQ19BU1NFUlRfRklYRURfU0laRShUWVBFKSAtIHBhc3NlcyBpZiBcYSBUWVBFIGlzIGZpeGVkIHNpemUuCistIFxiIEVJR0VOX1NUQVRJQ19BU1NFUlRfRFlOQU1JQ19TSVpFKFRZUEUpIC0gcGFzc2VzIGlmIFxhIFRZUEUgaXMgZHluYW1pYyBzaXplLgorLSBcYiBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShEZXJpdmVkKSAtIGZhaWxlcyBpZiBcYSBEZXJpdmVkIGlzIHJlYWQtb25seS4KKy0gXGIgRUlHRU5fU1RBVElDX0FTU0VSVF9BUlJBWVhQUihEZXJpdmVkKSAtIHBhc3NlcyBpZiBcYSBEZXJpdmVkIGlzIGFuIGFycmF5IGV4cHJlc3Npb24uCistIDxiPkVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChEZXJpdmVkMSwgRGVyaXZlZDIpPC9iPiAtIGZhaWxlcyBpZiB0aGUgdHdvIGV4cHJlc3Npb25zIGFyZSBhbiBhcnJheSBvbmUgYW5kIGEgbWF0cml4IG9uZS4KKworQmVjYXVzZSBFaWdlbiBoYW5kbGVzIGJvdGggZml4ZWQtc2l6ZSBhbmQgZHluYW1pYy1zaXplIGV4cHJlc3Npb25zLCBzb21lIGNvbmRpdGlvbnMgY2Fubm90IGJlIGNsZWFybHkgZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUuIFdlIGNsYXNzaWZ5IHRoZW0gaW50byBzdHJpY3QgYXNzZXJ0aW9ucyBhbmQgcGVybWlzc2l2ZSBhc3NlcnRpb25zLgorCitcc3Vic3Vic2VjdGlvbiBTdHJpY3RBc3NlcnRpb25zIFN0cmljdCBhc3NlcnRpb25zCisKK1RoZXNlIGFzc2VydGlvbnMgZmFpbCBpZiB0aGUgY29uZGl0aW9uIDxiPm1heSBub3Q8L2I+IGJlIG1ldC4gRm9yIGV4YW1wbGUsIE1hdHJpeFhkIG1heSBub3QgYmUgYSB2ZWN0b3IsIHNvIGl0IGZhaWxzIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkuCisKKy0gXGIgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShUWVBFKSAtIHBhc3NlcyBpZiBcYSBUWVBFIG11c3QgYmUgYSB2ZWN0b3IgdHlwZS4KKy0gPGI+RUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShUWVBFLCBTSVpFKTwvYj4gLSBwYXNzZXMgaWYgXGEgVFlQRSBtdXN0IGJlIGEgdmVjdG9yIG9mIHRoZSBnaXZlbiBzaXplLgorLSA8Yj5FSUdFTl9TVEFUSUNfQVNTRVJUX01BVFJJWF9TUEVDSUZJQ19TSVpFKFRZUEUsIFJPV1MsIENPTFMpPC9iPiAtIHBhc3NlcyBpZiBcYSBUWVBFIG11c3QgYmUgYSBtYXRyaXggd2l0aCBnaXZlbiByb3dzIGFuZCBjb2x1bW5zLgorCitcc3Vic3Vic2VjdGlvbiBQZXJtaXNzaXZlQXNzZXJ0aW9ucyBQZXJtaXNzaXZlIGFzc2VydGlvbnMKKworVGhlc2UgYXNzZXJ0aW9ucyBmYWlsIGlmIHRoZSBjb25kaXRpb24gXGIgY2Fubm90IGJlIG1ldC4gRm9yIGV4YW1wbGUsIE1hdHJpeFhkIGFuZCBNYXRyaXg0ZCBtYXkgaGF2ZSB0aGUgc2FtZSBzaXplLCBzbyB0aGV5IHBhc3MgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFLgorCistIFxiIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9WRUNUT1JfU0laRShUWVBFMCxUWVBFMSkgLSBmYWlscyBpZiB0aGUgdHdvIHZlY3RvciBleHByZXNzaW9uIHR5cGVzIG11c3QgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuCistIFxiIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShUWVBFMCxUWVBFMSkgLSBmYWlscyBpZiB0aGUgdHdvIG1hdHJpeCBleHByZXNzaW9uIHR5cGVzIG11c3QgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuCistIFxiIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0laRV8xeDEoVFlQRSkgLSBmYWlscyBpZiBcYSBUWVBFIGNhbm5vdCBiZSBhbiAxeDEgZXhwcmVzc2lvbi4KKworU2VlIFN0YXRpY0Fzc2VydC5oIGZvciBkZXRhaWxzIHN1Y2ggYXMgd2hhdCBtZXNzYWdlcyB0aGV5IHRocm93LgorCitcc3Vic2VjdGlvbiBEaXNhYmxlU3RhdGljQXNzZXJ0IERpc2FibGluZyBzdGF0aWMgYXNzZXJ0aW9ucworCitJZiBcYyBFSUdFTl9OT19TVEFUSUNfQVNTRVJUIGlzIGRlZmluZWQsIHN0YXRpYyBhc3NlcnRpb25zIHR1cm4gaW50byA8dHQ+ZWlnZW5fYXNzZXJ0PC90dD4ncywgd29ya2luZyBsaWtlOgorCitcY29kZQorI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIGVpZ2VuX2Fzc2VydCgoQ09ORElUSU9OKSAmJiAjTVNHKTsKK1xlbmRjb2RlCisKK1RoaXMgc2F2ZXMgY29tcGlsZSB0aW1lIGJ1dCBjb25zdW1lcyBtb3JlIHJ1biB0aW1lLiBcYyBFSUdFTl9OT19TVEFUSUNfQVNTRVJUIGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0LgorCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL1RvcGljQ01ha2VHdWlkZS5kb3ggYi9kb2MvVG9waWNDTWFrZUd1aWRlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZjZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RvcGljQ01ha2VHdWlkZS5kb3gKQEAgLTAsMCArMSw1MiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqCisKK1xwYWdlIFRvcGljQ01ha2VHdWlkZSBVc2luZyAlRWlnZW4gaW4gQ01ha2UgUHJvamVjdHMKKworJUVpZ2VuIHByb3ZpZGVzIG5hdGl2ZSBDTWFrZSBzdXBwb3J0IHdoaWNoIGFsbG93cyB0aGUgbGlicmFyeSB0byBiZSBlYXNpbHkKK3VzZWQgaW4gQ01ha2UgcHJvamVjdHMuCisKK1xub3RlICVDTWFrZSAzLjAgKG9yIGxhdGVyKSBpcyByZXF1aXJlZCB0byBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LgorCislRWlnZW4gZXhwb3J0cyBhIENNYWtlIHRhcmdldCBjYWxsZWQgYEVpZ2VuMzo6RWlnZW5gIHdoaWNoIGNhbiBiZSBpbXBvcnRlZAordXNpbmcgdGhlIGBmaW5kX3BhY2thZ2VgIENNYWtlIGNvbW1hbmQgYW5kIHVzZWQgYnkgY2FsbGluZworYHRhcmdldF9saW5rX2xpYnJhcmllc2AgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorXGNvZGV7LmNtYWtlfQorY21ha2VfbWluaW11bV9yZXF1aXJlZCAoVkVSU0lPTiAzLjApCitwcm9qZWN0IChteXByb2plY3QpCisKK2ZpbmRfcGFja2FnZSAoRWlnZW4zIDMuMyBSRVFVSVJFRCBOT19NT0RVTEUpCisKK2FkZF9leGVjdXRhYmxlIChleGFtcGxlIGV4YW1wbGUuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChleGFtcGxlIEVpZ2VuMzo6RWlnZW4pCitcZW5kY29kZQorCitUaGUgYWJvdmUgY29kZSBzbmlwcGV0IG11c3QgYmUgcGxhY2VkIGluIGEgZmlsZSBjYWxsZWQgYENNYWtlTGlzdHMudHh0YCBhbG9uZ3NpZGUKK2BleGFtcGxlLmNwcGAuIEFmdGVyIHJ1bm5pbmcKK1xjb2Rley5zaH0KKyQgY21ha2UgcGF0aC10by1leGFtcGxlLWRpcmVjdG9yeQorXGVuZGNvZGUKK0NNYWtlIHdpbGwgcHJvZHVjZSBwcm9qZWN0IGZpbGVzIHRoYXQgZ2VuZXJhdGUgYW4gZXhlY3V0YWJsZSBjYWxsZWQgYGV4YW1wbGVgCit3aGljaCByZXF1aXJlcyBhdCBsZWFzdCB2ZXJzaW9uIDMuMyBvZiAlRWlnZW4uIEhlcmUsIGBwYXRoLXRvLWV4YW1wbGUtZGlyZWN0b3J5YAoraXMgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJvdGggYENNYWtlTGlzdHMudHh0YCBhbmQKK2BleGFtcGxlLmNwcGAuCisKK0lmIHlvdSBoYXZlIG11bHRpcGxlIGluc3RhbGxlZCB2ZXJzaW9uIG9mICVFaWdlbiwgeW91IGNhbiBwaWNrIHlvdXIgZmF2b3JpdGUgb25lIGJ5IHNldHRpbmcgdGhlIFxjIEVpZ2VuM19ESVIgY21ha2UncyB2YXJpYWJsZSB0byB0aGUgcmVzcGVjdGl2ZSBwYXRoIGNvbnRhaW5pbmcgdGhlIFxjIEVpZ2VuMyouY21ha2UgZmlsZXMuIEZvciBpbnN0YW5jZToKK1xjb2RlCitjbWFrZSBwYXRoLXRvLWV4YW1wbGUtZGlyZWN0b3J5IC1ERWlnZW4zX0RJUj0kSE9NRS9teXBhY2thZ2VzL3NoYXJlL2VpZ2VuMy9jbWFrZS8KK1xlbmRjb2RlCisKK0lmIHRoZSBgUkVRVUlSRURgIG9wdGlvbiBpcyBvbWl0dGVkIHdoZW4gbG9jYXRpbmcgJUVpZ2VuIHVzaW5nCitgZmluZF9wYWNrYWdlYCwgb25lIGNhbiBjaGVjayB3aGV0aGVyIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBhcyBmb2xsb3dzOgorXGNvZGV7LmNtYWtlfQorZmluZF9wYWNrYWdlIChFaWdlbjMgMy4zIE5PX01PRFVMRSkKKworaWYgKFRBUkdFVCBFaWdlbjM6OkVpZ2VuKQorICAjIFVzZSB0aGUgaW1wb3J0ZWQgdGFyZ2V0CitlbmRpZiAoVEFSR0VUIEVpZ2VuMzo6RWlnZW4pCitcZW5kY29kZQorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNFaWdlbkV4cHJlc3Npb25UZW1wbGF0ZXMuZG94IGIvZG9jL1RvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzLmRveApAQCAtMCwwICsxLDEyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNFaWdlbkV4cHJlc3Npb25UZW1wbGF0ZXMgRXhwcmVzc2lvbiB0ZW1wbGF0ZXMgaW4gRWlnZW4KKworCitUT0RPOiB3cml0ZSB0aGlzIGRveCBwYWdlIQorCitJcyBsaW5rZWQgZnJvbSB0aGUgdHV0b3JpYWwgb24gYXJpdGhtZXRpYyBvcHMuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9Ub3BpY0xhenlFdmFsdWF0aW9uLmRveCBiL2RvYy9Ub3BpY0xhenlFdmFsdWF0aW9uLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFlZjhjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RvcGljTGF6eUV2YWx1YXRpb24uZG94CkBAIC0wLDAgKzEsNjUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0xhenlFdmFsdWF0aW9uIExhenkgRXZhbHVhdGlvbiBhbmQgQWxpYXNpbmcKKworRXhlY3V0aXZlIHN1bW1hcnk6IEVpZ2VuIGhhcyBpbnRlbGxpZ2VudCBjb21waWxlLXRpbWUgbWVjaGFuaXNtcyB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uIGFuZCByZW1vdmluZyB0ZW1wb3JhcmllcyB3aGVyZSBhcHByb3ByaWF0ZS4KK0l0IHdpbGwgaGFuZGxlIGFsaWFzaW5nIGF1dG9tYXRpY2FsbHkgaW4gbW9zdCBjYXNlcywgZm9yIGV4YW1wbGUgd2l0aCBtYXRyaXggcHJvZHVjdHMuIFRoZSBhdXRvbWF0aWMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4KK21hbnVhbGx5IGJ5IHVzaW5nIHRoZSBNYXRyaXhCYXNlOjpldmFsKCkgYW5kIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSBtZXRob2RzLgorCitXaGVuIHlvdSB3cml0ZSBhIGxpbmUgb2YgY29kZSBpbnZvbHZpbmcgYSBjb21wbGV4IGV4cHJlc3Npb24gc3VjaCBhcworCitcY29kZSBtYXQxID0gbWF0MiArIG1hdDMgKiAobWF0NCArIG1hdDUpOyBcZW5kY29kZQorCitFaWdlbiBkZXRlcm1pbmVzIGF1dG9tYXRpY2FsbHksIGZvciBlYWNoIHN1Yi1leHByZXNzaW9uLCB3aGV0aGVyIHRvIGV2YWx1YXRlIGl0IGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUuIEluZGVlZCwgaW4gY2VydGFpbiBjYXNlcyBpdCBpcyBiZXR0ZXIgdG8gZXZhbHVhdGUgaW1tZWRpYXRlbHkgYSBzdWItZXhwcmVzc2lvbiBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLCB3aGlsZSBpbiBvdGhlciBjYXNlcyBpdCBpcyBiZXR0ZXIgdG8gYXZvaWQgdGhhdC4KKworQSB0cmFkaXRpb25hbCBtYXRoIGxpYnJhcnkgd2l0aG91dCBleHByZXNzaW9uIHRlbXBsYXRlcyBhbHdheXMgZXZhbHVhdGVzIGFsbCBzdWItZXhwcmVzc2lvbnMgaW50byB0ZW1wb3Jhcmllcy4gU28gd2l0aCB0aGlzIGNvZGUsCisKK1xjb2RlIHZlYzEgPSB2ZWMyICsgdmVjMzsgXGVuZGNvZGUKKworYSB0cmFkaXRpb25hbCBsaWJyYXJ5IHdvdWxkIGV2YWx1YXRlIFxjIHZlYzIgKyB2ZWMzIGludG8gYSB0ZW1wb3JhcnkgXGMgdmVjNCBhbmQgdGhlbiBjb3B5IFxjIHZlYzQgIGludG8gXGMgdmVjMS4gVGhpcyBpcyBvZiBjb3Vyc2UgaW5lZmZpY2llbnQ6IHRoZSBhcnJheXMgYXJlIHRyYXZlcnNlZCB0d2ljZSwgc28gdGhlcmUgYXJlIGEgbG90IG9mIHVzZWxlc3MgbG9hZC9zdG9yZSBvcGVyYXRpb25zLgorCitFeHByZXNzaW9uLXRlbXBsYXRlcy1iYXNlZCBsaWJyYXJpZXMgY2FuIGF2b2lkIGV2YWx1YXRpbmcgc3ViLWV4cHJlc3Npb25zIGludG8gdGVtcG9yYXJpZXMsIHdoaWNoIGluIG1hbnkgY2FzZXMgcmVzdWx0cyBpbiBsYXJnZSBzcGVlZCBpbXByb3ZlbWVudHMuIFRoaXMgaXMgY2FsbGVkIDxpPmxhenkgZXZhbHVhdGlvbjwvaT4gYXMgYW4gZXhwcmVzc2lvbiBpcyBnZXR0aW5nIGV2YWx1YXRlZCBhcyBsYXRlIGFzIHBvc3NpYmxlLCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5LiBIb3dldmVyLCBtb3N0IG90aGVyIGV4cHJlc3Npb24tdGVtcGxhdGVzLWJhc2VkIGxpYnJhcmllcyA8aT5hbHdheXM8L2k+IGNob29zZSBsYXp5IGV2YWx1YXRpb24uIFRoZXJlIGFyZSB0d28gcHJvYmxlbXMgd2l0aCB0aGF0OiBmaXJzdCwgbGF6eSBldmFsdWF0aW9uIGlzIG5vdCBhbHdheXMgYSBnb29kIGNob2ljZSBmb3IgcGVyZm9ybWFuY2U7IHNlY29uZCwgbGF6eSBldmFsdWF0aW9uIGNhbiBiZSB2ZXJ5IGRhbmdlcm91cywgZm9yIGV4YW1wbGUgd2l0aCBtYXRyaXggcHJvZHVjdHM6IGRvaW5nIDx0dD5tYXRyaXggPSBtYXRyaXgqbWF0cml4PC90dD4gZ2l2ZXMgYSB3cm9uZyByZXN1bHQgaWYgdGhlIG1hdHJpeCBwcm9kdWN0IGlzIGxhenktZXZhbHVhdGVkLCBiZWNhdXNlIG9mIHRoZSB3YXkgbWF0cml4IHByb2R1Y3Qgd29ya3MuCisKK0ZvciB0aGVzZSByZWFzb25zLCBFaWdlbiBoYXMgaW50ZWxsaWdlbnQgY29tcGlsZS10aW1lIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkgd2hlbiB0byB1c2UgbGF6eSBldmFsdWF0aW9uLCBhbmQgd2hlbiBvbiB0aGUgY29udHJhcnkgaXQgc2hvdWxkIGV2YWx1YXRlIGltbWVkaWF0ZWx5IGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUuCisKK1NvIGluIHRoZSBiYXNpYyBleGFtcGxlLAorCitcY29kZSBtYXRyaXgxID0gbWF0cml4MiArIG1hdHJpeDM7IFxlbmRjb2RlCisKK0VpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uLiBUaHVzIHRoZSBhcnJheXMgYXJlIHRyYXZlcnNlZCBvbmx5IG9uY2UsIHByb2R1Y2luZyBvcHRpbWl6ZWQgY29kZS4gSWYgeW91IHJlYWxseSB3YW50IHRvIGZvcmNlIGltbWVkaWF0ZSBldmFsdWF0aW9uLCB1c2UgXGxpbmsgTWF0cml4QmFzZTo6ZXZhbCgpIGV2YWwoKVxlbmRsaW5rOgorCitcY29kZSBtYXRyaXgxID0gKG1hdHJpeDIgKyBtYXRyaXgzKS5ldmFsKCk7IFxlbmRjb2RlCisKK0hlcmUgaXMgbm93IGEgbW9yZSBpbnZvbHZlZCBleGFtcGxlOgorCitcY29kZSBtYXRyaXgxID0gLW1hdHJpeDIgKyBtYXRyaXgzICsgNSAqIG1hdHJpeDQ7IFxlbmRjb2RlCisKK0VpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uIGF0IGV2ZXJ5IHN0YWdlIGluIHRoYXQgZXhhbXBsZSwgd2hpY2ggaXMgY2xlYXJseSB0aGUgY29ycmVjdCBjaG9pY2UuIEluIGZhY3QsIGxhenkgZXZhbHVhdGlvbiBpcyB0aGUgImRlZmF1bHQgY2hvaWNlIiBhbmQgRWlnZW4gd2lsbCBjaG9vc2UgaXQgZXhjZXB0IGluIGEgZmV3IGNpcmN1bXN0YW5jZXMuCisKKzxiPlRoZSBmaXJzdCBjaXJjdW1zdGFuY2U8L2I+IGluIHdoaWNoIEVpZ2VuIGNob29zZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24sIGlzIHdoZW4gaXQgc2VlcyBhbiBhc3NpZ25tZW50IDx0dD5hID0gYjs8L3R0PiBhbmQgdGhlIGV4cHJlc3Npb24gXGMgYiBoYXMgdGhlIGV2YWx1YXRlLWJlZm9yZS1hc3NpZ25pbmcgXGxpbmsgZmxhZ3MgZmxhZ1xlbmRsaW5rLiBUaGUgbW9zdCBpbXBvcnRhbnQgZXhhbXBsZSBvZiBzdWNoIGFuIGV4cHJlc3Npb24gaXMgdGhlIFxsaW5rIFByb2R1Y3QgbWF0cml4IHByb2R1Y3QgZXhwcmVzc2lvblxlbmRsaW5rLiBGb3IgZXhhbXBsZSwgd2hlbiB5b3UgZG8KKworXGNvZGUgbWF0cml4ID0gbWF0cml4ICogbWF0cml4OyBcZW5kY29kZQorCitFaWdlbiBmaXJzdCBldmFsdWF0ZXMgPHR0Pm1hdHJpeCAqIG1hdHJpeDwvdHQ+IGludG8gYSB0ZW1wb3JhcnkgbWF0cml4LCBhbmQgdGhlbiBjb3BpZXMgaXQgaW50byB0aGUgb3JpZ2luYWwgXGMgbWF0cml4LiBUaGlzIGd1YXJhbnRlZXMgYSBjb3JyZWN0IHJlc3VsdCBhcyB3ZSBzYXcgYWJvdmUgdGhhdCBsYXp5IGV2YWx1YXRpb24gZ2l2ZXMgd3JvbmcgcmVzdWx0cyB3aXRoIG1hdHJpeCBwcm9kdWN0cy4gSXQgYWxzbyBkb2Vzbid0IGNvc3QgbXVjaCwgYXMgdGhlIGNvc3Qgb2YgdGhlIG1hdHJpeCBwcm9kdWN0IGl0c2VsZiBpcyBtdWNoIGhpZ2hlci4KKworV2hhdCBpZiB5b3Uga25vdyB0aGF0IHRoZSByZXN1bHQgZG9lcyBubyBhbGlhcyB0aGUgb3BlcmFuZCBvZiB0aGUgcHJvZHVjdCBhbmQgd2FudCB0byBmb3JjZSBsYXp5IGV2YWx1YXRpb24/IFRoZW4gdXNlIFxsaW5rIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSAubm9hbGlhcygpXGVuZGxpbmsgaW5zdGVhZC4gSGVyZSBpcyBhbiBleGFtcGxlOgorCitcY29kZSBtYXRyaXgxLm5vYWxpYXMoKSA9IG1hdHJpeDIgKiBtYXRyaXgyOyBcZW5kY29kZQorCitIZXJlLCBzaW5jZSB3ZSBrbm93IHRoYXQgbWF0cml4MiBpcyBub3QgdGhlIHNhbWUgbWF0cml4IGFzIG1hdHJpeDEsIHdlIGtub3cgdGhhdCBsYXp5IGV2YWx1YXRpb24gaXMgbm90IGRhbmdlcm91cywgc28gd2UgbWF5IGZvcmNlIGxhenkgZXZhbHVhdGlvbi4gQ29uY3JldGVseSwgdGhlIGVmZmVjdCBvZiBub2FsaWFzKCkgaGVyZSBpcyB0byBieXBhc3MgdGhlIGV2YWx1YXRlLWJlZm9yZS1hc3NpZ25pbmcgXGxpbmsgZmxhZ3MgZmxhZ1xlbmRsaW5rLgorCis8Yj5UaGUgc2Vjb25kIGNpcmN1bXN0YW5jZTwvYj4gaW4gd2hpY2ggRWlnZW4gY2hvb3NlcyBpbW1lZGlhdGUgZXZhbHVhdGlvbiwgaXMgd2hlbiBpdCBzZWVzIGEgbmVzdGVkIGV4cHJlc3Npb24gc3VjaCBhcyA8dHQ+YSArIGI8L3R0PiB3aGVyZSBcYyBiIGlzIGFscmVhZHkgYW4gZXhwcmVzc2lvbiBoYXZpbmcgdGhlIGV2YWx1YXRlLWJlZm9yZS1uZXN0aW5nIFxsaW5rIGZsYWdzIGZsYWdcZW5kbGluay4gQWdhaW4sIHRoZSBtb3N0IGltcG9ydGFudCBleGFtcGxlIG9mIHN1Y2ggYW4gZXhwcmVzc2lvbiBpcyB0aGUgXGxpbmsgUHJvZHVjdCBtYXRyaXggcHJvZHVjdCBleHByZXNzaW9uXGVuZGxpbmsuIEZvciBleGFtcGxlLCB3aGVuIHlvdSBkbworCitcY29kZSBtYXRyaXgxID0gbWF0cml4MiArIG1hdHJpeDMgKiBtYXRyaXg0OyBcZW5kY29kZQorCit0aGUgcHJvZHVjdCA8dHQ+bWF0cml4MyAqIG1hdHJpeDQ8L3R0PiBnZXRzIGV2YWx1YXRlZCBpbW1lZGlhdGVseSBpbnRvIGEgdGVtcG9yYXJ5IG1hdHJpeC4gSW5kZWVkLCBleHBlcmltZW50cyBzaG93ZWQgdGhhdCBpdCBpcyBvZnRlbiBiZW5lZmljaWFsIGZvciBwZXJmb3JtYW5jZSB0byBldmFsdWF0ZSBpbW1lZGlhdGVseSBtYXRyaXggcHJvZHVjdHMgd2hlbiB0aGV5IGFyZSBuZXN0ZWQgaW50byBiaWdnZXIgZXhwcmVzc2lvbnMuCisKKzxiPlRoZSB0aGlyZCBjaXJjdW1zdGFuY2U8L2I+IGluIHdoaWNoIEVpZ2VuIGNob29zZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24sIGlzIHdoZW4gaXRzIGNvc3QgbW9kZWwgc2hvd3MgdGhhdCB0aGUgdG90YWwgY29zdCBvZiBhbiBvcGVyYXRpb24gaXMgcmVkdWNlZCBpZiBhIHN1Yi1leHByZXNzaW9uIGdldHMgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkuIEluZGVlZCwgaW4gY2VydGFpbiBjYXNlcywgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCBpcyBzdWZmaWNpZW50bHkgY29zdGx5IHRvIGNvbXB1dGUgYW5kIGlzIHJldXNlZCBzdWZmaWNpZW50bHkgbWFueSB0aW1lcywgdGhhdCBpcyB3b3J0aCAiY2FjaGluZyIuIEhlcmUgaXMgYW4gZXhhbXBsZToKKworXGNvZGUgbWF0cml4MSA9IG1hdHJpeDIgKiAobWF0cml4MyArIG1hdHJpeDQpOyBcZW5kY29kZQorCitIZXJlLCBwcm92aWRlZCB0aGUgbWF0cmljZXMgaGF2ZSBhdCBsZWFzdCAyIHJvd3MgYW5kIDIgY29sdW1ucywgZWFjaCBjb2VmZmljaWVuY3Qgb2YgdGhlIGV4cHJlc3Npb24gPHR0Pm1hdHJpeDMgKyBtYXRyaXg0PC90dD4gaXMgZ29pbmcgdG8gYmUgdXNlZCBzZXZlcmFsIHRpbWVzIGluIHRoZSBtYXRyaXggcHJvZHVjdC4gSW5zdGVhZCBvZiBjb21wdXRpbmcgdGhlIHN1bSBldmVyeXRpbWUsIGl0IGlzIG11Y2ggYmV0dGVyIHRvIGNvbXB1dGUgaXQgb25jZSBhbmQgc3RvcmUgaXQgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUuIEVpZ2VuIHVuZGVyc3RhbmRzIHRoaXMgYW5kIGV2YWx1YXRlcyA8dHQ+bWF0cml4MyArIG1hdHJpeDQ8L3R0PiBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGJlZm9yZSBldmFsdWF0aW5nIHRoZSBwcm9kdWN0LgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMuZG94IGIvZG9jL1RvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTE0NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1RvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zLmRveApAQCAtMCwwICsxLDI2MyBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMgQ2F0YWxvZ3VlIG9mIGRlbnNlIGRlY29tcG9zaXRpb25zCisKK1RoaXMgcGFnZSBwcmVzZW50cyBhIGNhdGFsb2d1ZSBvZiB0aGUgZGVuc2UgbWF0cml4IGRlY29tcG9zaXRpb25zIG9mZmVyZWQgYnkgRWlnZW4uCitGb3IgYW4gaW50cm9kdWN0aW9uIG9uIGxpbmVhciBzb2x2ZXJzIGFuZCBkZWNvbXBvc2l0aW9ucywgY2hlY2sgdGhpcyBcbGluayBUdXRvcmlhbExpbmVhckFsZ2VicmEgcGFnZSBcZW5kbGluay4KK1RvIGdldCBhbiBvdmVydmlldyBvZiB0aGUgdHJ1ZSByZWxhdGl2ZSBzcGVlZCBvZiB0aGUgZGlmZmVyZW50IGRlY29tcG9zaXRpb24sIGNoZWNrIHRoaXMgXGxpbmsgRGVuc2VEZWNvbXBvc2l0aW9uQmVuY2htYXJrIGJlbmNobWFyayBcZW5kbGluay4KKworXHNlY3Rpb24gVG9waWNMaW5BbGdCaWdUYWJsZSBDYXRhbG9ndWUgb2YgZGVjb21wb3NpdGlvbnMgb2ZmZXJlZCBieSBFaWdlbgorCis8dGFibGUgY2xhc3M9Im1hbnVhbC12bCI+CisgICAgPHRyPgorICAgICAgICA8dGggY2xhc3M9Im1ldGEiPjwvdGg+CisgICAgICAgIDx0aCBjbGFzcz0ibWV0YSIgY29sc3Bhbj0iNSI+R2VuZXJpYyBpbmZvcm1hdGlvbiwgbm90IEVpZ2VuLXNwZWNpZmljPC90aD4KKyAgICAgICAgPHRoIGNsYXNzPSJtZXRhIiBjb2xzcGFuPSIzIj5FaWdlbi1zcGVjaWZpYzwvdGg+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRoPkRlY29tcG9zaXRpb248L3RoPgorICAgICAgICA8dGg+UmVxdWlyZW1lbnRzIG9uIHRoZSBtYXRyaXg8L3RoPgorICAgICAgICA8dGg+U3BlZWQ8L3RoPgorICAgICAgICA8dGg+QWxnb3JpdGhtIHJlbGlhYmlsaXR5IGFuZCBhY2N1cmFjeTwvdGg+CisgICAgICAgIDx0aD5SYW5rLXJldmVhbGluZzwvdGg+CisgICAgICAgIDx0aD5BbGxvd3MgdG8gY29tcHV0ZSAoYmVzaWRlcyBsaW5lYXIgc29sdmluZyk8L3RoPgorICAgICAgICA8dGg+TGluZWFyIHNvbHZlciBwcm92aWRlZCBieSBFaWdlbjwvdGg+CisgICAgICAgIDx0aD5NYXR1cml0eSBvZiBFaWdlbidzIGltcGxlbWVudGF0aW9uPC90aD4KKyAgICAgICAgPHRoPk9wdGltaXphdGlvbnM8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICAgIDx0ZD5QYXJ0aWFsUGl2TFU8L3RkPgorICAgICAgICA8dGQ+SW52ZXJ0aWJsZTwvdGQ+CisgICAgICAgIDx0ZD5GYXN0PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkV4Y2VsbGVudDwvdGQ+CisgICAgICAgIDx0ZD5CbG9ja2luZywgSW1wbGljaXQgTVQ8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5GdWxsUGl2TFU8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5TbG93PC90ZD4KKyAgICAgICAgPHRkPlByb3ZlbjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICAgIDx0ZD5Ib3VzZWhvbGRlclFSPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+RmFzdDwvdGQ+CisgICAgICAgIDx0ZD5EZXBlbmRzIG9uIGNvbmRpdGlvbiBudW1iZXI8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5PcnRob2dvbmFsaXphdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPkJsb2NraW5nPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+Q29sUGl2SG91c2Vob2xkZXJRUjwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkZhc3Q8L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+T3J0aG9nb25hbGl6YXRpb248L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkV4Y2VsbGVudDwvdGQ+CisgICAgICAgIDx0ZD48ZW0+U29vbjogYmxvY2tpbmc8L2VtPjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkZ1bGxQaXZIb3VzZWhvbGRlclFSPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+U2xvdzwvdGQ+CisgICAgICAgIDx0ZD5Qcm92ZW48L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPk9ydGhvZ29uYWxpemF0aW9uPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5MTFQ8L3RkPgorICAgICAgICA8dGQ+UG9zaXRpdmUgZGVmaW5pdGU8L3RkPgorICAgICAgICA8dGQ+VmVyeSBmYXN0PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkV4Y2VsbGVudDwvdGQ+CisgICAgICAgIDx0ZD5CbG9ja2luZzwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkxETFQ8L3RkPgorICAgICAgICA8dGQ+UG9zaXRpdmUgb3IgbmVnYXRpdmUgc2VtaWRlZmluaXRlPHN1cD48YSBocmVmPSIjbm90ZTEiPjE8L2E+PC9zdXA+PC90ZD4KKyAgICAgICAgPHRkPlZlcnkgZmFzdDwvdGQ+CisgICAgICAgIDx0ZD5Hb29kPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPjxlbT5Tb29uOiBibG9ja2luZzwvZW0+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPjx0aCBjbGFzcz0iaW50ZXIiIGNvbHNwYW49IjkiPlxuIFNpbmd1bGFyIHZhbHVlcyBhbmQgZWlnZW52YWx1ZXMgZGVjb21wb3NpdGlvbnM8L3RoPjwvdHI+CisKKyAgICA8dHI+CisgICAgICAgIDx0ZD5KYWNvYmlTVkQgKHR3by1zaWRlZCk8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5TbG93IChidXQgZmFzdCBmb3Igc21hbGwgbWF0cmljZXMpPC90ZD4KKyAgICAgICAgPHRkPlByb3ZlbjxzdXA+PGEgaHJlZj0iI25vdGUzIj4zPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+U2luZ3VsYXIgdmFsdWVzL3ZlY3RvcnMsIGxlYXN0IHNxdWFyZXM8L3RkPgorICAgICAgICA8dGQ+WWVzIChhbmQgZG9lcyBsZWFzdCBzcXVhcmVzKTwvdGQ+CisgICAgICAgIDx0ZD5FeGNlbGxlbnQ8L3RkPgorICAgICAgICA8dGQ+Ui1TVkQ8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5TZWxmQWRqb2ludEVpZ2VuU29sdmVyPC90ZD4KKyAgICAgICAgPHRkPlNlbGYtYWRqb2ludDwvdGQ+CisgICAgICAgIDx0ZD5GYXN0LWF2ZXJhZ2U8c3VwPjxhIGhyZWY9IiNub3RlMiI+MjwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RWlnZW52YWx1ZXMvdmVjdG9yczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkV4Y2VsbGVudDwvdGQ+CisgICAgICAgIDx0ZD48ZW0+Q2xvc2VkIGZvcm1zIGZvciAyeDIgYW5kIDN4MzwvZW0+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGQ+Q29tcGxleEVpZ2VuU29sdmVyPC90ZD4KKyAgICAgICAgPHRkPlNxdWFyZTwvdGQ+CisgICAgICAgIDx0ZD5TbG93LXZlcnkgc2xvdzxzdXA+PGEgaHJlZj0iI25vdGUyIj4yPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5EZXBlbmRzIG9uIGNvbmRpdGlvbiBudW1iZXI8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkVpZ2VudmFsdWVzL3ZlY3RvcnM8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5FaWdlblNvbHZlcjwvdGQ+CisgICAgICAgIDx0ZD5TcXVhcmUgYW5kIHJlYWw8L3RkPgorICAgICAgICA8dGQ+QXZlcmFnZS1zbG93PHN1cD48YSBocmVmPSIjbm90ZTIiPjI8L2E+PC9zdXA+PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RWlnZW52YWx1ZXMvdmVjdG9yczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkF2ZXJhZ2U8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjwvdGQ+CisgICAgICAgIDx0ZD5TcXVhcmU8L3RkPgorICAgICAgICA8dGQ+RmFzdC1hdmVyYWdlPHN1cD48YSBocmVmPSIjbm90ZTIiPjI8L2E+PC9zdXA+PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkdlbmVyYWxpemVkIGVpZ2VudmFsdWVzL3ZlY3RvcnM8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5Hb29kPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+PHRoIGNsYXNzPSJpbnRlciIgY29sc3Bhbj0iOSI+XG4gSGVscGVyIGRlY29tcG9zaXRpb25zPC90aD48L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGQ+UmVhbFNjaHVyPC90ZD4KKyAgICAgICAgPHRkPlNxdWFyZSBhbmQgcmVhbDwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlLXNsb3c8c3VwPjxhIGhyZWY9IiNub3RlMiI+MjwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+RGVwZW5kcyBvbiBjb25kaXRpb24gbnVtYmVyPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+QXZlcmFnZTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+Q29tcGxleFNjaHVyPC90ZD4KKyAgICAgICAgPHRkPlNxdWFyZTwvdGQ+CisgICAgICAgIDx0ZD5TbG93LXZlcnkgc2xvdzxzdXA+PGEgaHJlZj0iI25vdGUyIj4yPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5EZXBlbmRzIG9uIGNvbmRpdGlvbiBudW1iZXI8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5UcmlkaWFnb25hbGl6YXRpb248L3RkPgorICAgICAgICA8dGQ+U2VsZi1hZGpvaW50PC90ZD4KKyAgICAgICAgPHRkPkZhc3Q8L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5Hb29kPC90ZD4KKyAgICAgICAgPHRkPjxlbT5Tb29uOiBibG9ja2luZzwvZW0+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGQ+SGVzc2VuYmVyZ0RlY29tcG9zaXRpb248L3RkPgorICAgICAgICA8dGQ+U3F1YXJlPC90ZD4KKyAgICAgICAgPHRkPkF2ZXJhZ2U8L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5Hb29kPC90ZD4KKyAgICAgICAgPHRkPjxlbT5Tb29uOiBibG9ja2luZzwvZW0+PC90ZD4KKyAgICA8L3RyPgorCis8L3RhYmxlPgorCitcYiBOb3RlczoKKzx1bD4KKzxsaT48YSBuYW1lPSJub3RlMSI+XGIgMTogPC9hPlRoZXJlIGV4aXN0IHR3byB2YXJpYW50cyBvZiB0aGUgTERMVCBhbGdvcml0aG0uIEVpZ2VuJ3Mgb25lIHByb2R1Y2VzIGEgcHVyZSBkaWFnb25hbCBEIG1hdHJpeCwgYW5kIHRoZXJlZm9yZSBpdCBjYW5ub3QgaGFuZGxlIGluZGVmaW5pdGUgbWF0cmljZXMsIHVubGlrZSBMYXBhY2sncyBvbmUgd2hpY2ggcHJvZHVjZXMgYSBibG9jayBkaWFnb25hbCBEIG1hdHJpeC48L2xpPgorPGxpPjxhIG5hbWU9Im5vdGUyIj5cYiAyOiA8L2E+RWlnZW52YWx1ZXMsIFNWRCBhbmQgU2NodXIgZGVjb21wb3NpdGlvbnMgcmVseSBvbiBpdGVyYXRpdmUgYWxnb3JpdGhtcy4gVGhlaXIgY29udmVyZ2VuY2Ugc3BlZWQgZGVwZW5kcyBvbiBob3cgd2VsbCB0aGUgZWlnZW52YWx1ZXMgYXJlIHNlcGFyYXRlZC48L2xpPgorPGxpPjxhIG5hbWU9Im5vdGUzIj5cYiAzOiA8L2E+T3VyIEphY29iaVNWRCBpcyB0d28tc2lkZWQsIG1ha2luZyBmb3IgcHJvdmVuIGFuZCBvcHRpbWFsIHByZWNpc2lvbiBmb3Igc3F1YXJlIG1hdHJpY2VzLiBGb3Igbm9uLXNxdWFyZSBtYXRyaWNlcywgd2UgaGF2ZSB0byB1c2UgYSBRUiBwcmVjb25kaXRpb25lciBmaXJzdC4gVGhlIGRlZmF1bHQgY2hvaWNlLCBDb2xQaXZIb3VzZWhvbGRlclFSLCBpcyBhbHJlYWR5IHZlcnkgcmVsaWFibGUsIGJ1dCBpZiB5b3Ugd2FudCBpdCB0byBiZSBwcm92ZW4sIHVzZSBGdWxsUGl2SG91c2Vob2xkZXJRUiBpbnN0ZWFkLgorPC91bD4KKworXHNlY3Rpb24gVG9waWNMaW5BbGdUZXJtaW5vbG9neSBUZXJtaW5vbG9neQorCis8ZGw+CisgIDxkdD48Yj5TZWxmYWRqb2ludDwvYj48L2R0PgorICAgIDxkZD5Gb3IgYSByZWFsIG1hdHJpeCwgc2VsZmFkam9pbnQgaXMgYSBzeW5vbnltIGZvciBzeW1tZXRyaWMuIEZvciBhIGNvbXBsZXggbWF0cml4LCBzZWxmYWRqb2ludCBpcyBhIHN5bm9ueW0gZm9yIFxlbSBoZXJtaXRpYW4uCisgICAgICAgIE1vcmUgZ2VuZXJhbGx5LCBhIG1hdHJpeCBcZiQgQSBcZiQgaXMgc2VsZmFkam9pbnQgaWYgYW5kIG9ubHkgaWYgaXQgaXMgZXF1YWwgdG8gaXRzIGFkam9pbnQgXGYkIEFeKiBcZiQuIFRoZSBhZGpvaW50IGlzIGFsc28gY2FsbGVkIHRoZSBcZW0gY29uanVnYXRlIFxlbSB0cmFuc3Bvc2UuIDwvZGQ+CisgIDxkdD48Yj5Qb3NpdGl2ZS9uZWdhdGl2ZSBkZWZpbml0ZTwvYj48L2R0PgorICAgIDxkZD5BIHNlbGZhZGpvaW50IG1hdHJpeCBcZiQgQSBcZiQgaXMgcG9zaXRpdmUgZGVmaW5pdGUgaWYgXGYkIHZeKiBBIHYgPiAwIFxmJCBmb3IgYW55IG5vbiB6ZXJvIHZlY3RvciBcZiQgdiBcZiQuCisgICAgICAgIEluIHRoZSBzYW1lIHZlaW4sIGl0IGlzIG5lZ2F0aXZlIGRlZmluaXRlIGlmIFxmJCB2XiogQSB2IDwgMCBcZiQgZm9yIGFueSBub24gemVybyB2ZWN0b3IgXGYkIHYgXGYkIDwvZGQ+CisgIDxkdD48Yj5Qb3NpdGl2ZS9uZWdhdGl2ZSBzZW1pZGVmaW5pdGU8L2I+PC9kdD4KKyAgICA8ZGQ+QSBzZWxmYWRqb2ludCBtYXRyaXggXGYkIEEgXGYkIGlzIHBvc2l0aXZlIHNlbWktZGVmaW5pdGUgaWYgXGYkIHZeKiBBIHYgXGdlIDAgXGYkIGZvciBhbnkgbm9uIHplcm8gdmVjdG9yIFxmJCB2IFxmJC4KKyAgICAgICAgSW4gdGhlIHNhbWUgdmVpbiwgaXQgaXMgbmVnYXRpdmUgc2VtaS1kZWZpbml0ZSBpZiBcZiQgdl4qIEEgdiBcbGUgMCBcZiQgZm9yIGFueSBub24gemVybyB2ZWN0b3IgXGYkIHYgXGYkIDwvZGQ+CisKKyAgPGR0PjxiPkJsb2NraW5nPC9iPjwvZHQ+CisgICAgPGRkPk1lYW5zIHRoZSBhbGdvcml0aG0gY2FuIHdvcmsgcGVyIGJsb2NrLCB3aGVuY2UgZ3VhcmFudGVlaW5nIGEgZ29vZCBzY2FsaW5nIG9mIHRoZSBwZXJmb3JtYW5jZSBmb3IgbGFyZ2UgbWF0cmljZXMuPC9kZD4KKyAgPGR0PjxiPkltcGxpY2l0IE11bHRpIFRocmVhZGluZyAoTVQpPC9iPjwvZHQ+CisgICAgPGRkPk1lYW5zIHRoZSBhbGdvcml0aG0gY2FuIHRha2UgYWR2YW50YWdlIG9mIG11bHRpY29yZSBwcm9jZXNzb3JzIHZpYSBPcGVuTVAuICJJbXBsaWNpdCIgbWVhbnMgdGhlIGFsZ29ydGlobSBpdHNlbGYgaXMgbm90IHBhcmFsbGVsaXplZCwgYnV0IHRoYXQgaXQgcmVsaWVzIG9uIHBhcmFsbGVsaXplZCBtYXRyaXgtbWF0cml4IHByb2R1Y3Qgcm91bnRpbmVzLjwvZGQ+CisgIDxkdD48Yj5FeHBsaWNpdCBNdWx0aSBUaHJlYWRpbmcgKE1UKTwvYj48L2R0PgorICAgIDxkZD5NZWFucyB0aGUgYWxnb3JpdGhtIGlzIGV4cGxpY2l0bHkgcGFyYWxsZWxpemVkIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpY29yZSBwcm9jZXNzb3JzIHZpYSBPcGVuTVAuPC9kZD4KKyAgPGR0PjxiPk1ldGEtdW5yb2xsZXI8L2I+PC9kdD4KKyAgICA8ZGQ+TWVhbnMgdGhlIGFsZ29yaXRobSBpcyBhdXRvbWF0aWNhbGx5IGFuZCBleHBsaWNpdGx5IHVucm9sbGVkIGZvciB2ZXJ5IHNtYWxsIGZpeGVkIHNpemUgbWF0cmljZXMuPC9kZD4KKyAgPGR0PjxiPjwvYj48L2R0PgorICAgIDxkZD48L2RkPgorPC9kbD4KKworCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNNdWx0aXRocmVhZGluZy5kb3ggYi9kb2MvVG9waWNNdWx0aXRocmVhZGluZy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Ub3BpY011bHRpdGhyZWFkaW5nLmRveApAQCAtMCwwICsxLDU0IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNNdWx0aVRocmVhZGluZyBFaWdlbiBhbmQgbXVsdGktdGhyZWFkaW5nCisKK1xzZWN0aW9uIFRvcGljTXVsdGlUaHJlYWRpbmdfTWFraW5nRWlnZW5NVCBNYWtlIEVpZ2VuIHJ1biBpbiBwYXJhbGxlbAorCitTb21lIEVpZ2VuJ3MgYWxnb3JpdGhtcyBjYW4gZXhwbG9pdCB0aGUgbXVsdGlwbGUgY29yZXMgcHJlc2VudCBpbiB5b3VyIGhhcmR3YXJlLiBUbyB0aGlzIGVuZCwgaXQgaXMgZW5vdWdoIHRvIGVuYWJsZSBPcGVuTVAgb24geW91ciBjb21waWxlciwgZm9yIGluc3RhbmNlOgorICogR0NDOiBcYyAtZm9wZW5tcAorICogSUNDOiBcYyAtb3Blbm1wCisgKiBNU1ZDOiBjaGVjayB0aGUgcmVzcGVjdGl2ZSBvcHRpb24gaW4gdGhlIGJ1aWxkIHByb3BlcnRpZXMuCitZb3UgY2FuIGNvbnRyb2wgdGhlIG51bWJlciBvZiB0aHJlYWQgdGhhdCB3aWxsIGJlIHVzZWQgdXNpbmcgZWl0aGVyIHRoZSBPcGVuTVAgQVBJIG9yIEVpZ2VuJ3MgQVBJIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHJpb3JpdHk6CitcY29kZQorIE9NUF9OVU1fVEhSRUFEUz1uIC4vbXlfcHJvZ3JhbQorIG9tcF9zZXRfbnVtX3RocmVhZHMobik7CisgRWlnZW46OnNldE5iVGhyZWFkcyhuKTsKK1xlbmRjb2RlCitVbmxlc3Mgc2V0TmJUaHJlYWRzIGhhcyBiZWVuIGNhbGxlZCwgRWlnZW4gdXNlcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgc3BlY2lmaWVkIGJ5IE9wZW5NUC4gWW91IGNhbiByZXN0b3JlIHRoaXMgYmVoYXZpb3IgYnkgY2FsbGluZyBcY29kZSBzZXROYlRocmVhZHMoMCk7IFxlbmRjb2RlCitZb3UgY2FuIHF1ZXJ5IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoOgorXGNvZGUKK24gPSBFaWdlbjo6bmJUaHJlYWRzKCApOworXGVuZGNvZGUKK1lvdSBjYW4gZGlzYWJsZSBFaWdlbidzIG11bHRpIHRocmVhZGluZyBhdCBjb21waWxlIHRpbWUgYnkgZGVmaW5pbmcgdGhlIEVJR0VOX0RPTlRfUEFSQUxMRUxJWkUgcHJlcHJvY2Vzc29yIHRva2VuLgorCitDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtcyBjYW4gbWFrZSB1c2Ugb2YgbXVsdGktdGhyZWFkaW5nOgorIC0gZ2VuZXJhbCBkZW5zZSBtYXRyaXggLSBtYXRyaXggcHJvZHVjdHMKKyAtIFBhcnRpYWxQaXZMVQorIC0gcm93LW1ham9yLXNwYXJzZSAqIGRlbnNlIHZlY3Rvci9tYXRyaXggcHJvZHVjdHMKKyAtIENvbmp1Z2F0ZUdyYWRpZW50IHdpdGggXGMgTG93ZXJ8VXBwZXIgYXMgdGhlIFxjIFVwTG8gdGVtcGxhdGUgcGFyYW1ldGVyLgorIC0gQmlDR1NUQUIgd2l0aCBhIHJvdy1tYWpvciBzcGFyc2UgbWF0cml4IGZvcm1hdC4KKyAtIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50CisKK1xzZWN0aW9uIFRvcGljTXVsdGlUaHJlYWRpbmdfVXNpbmdFaWdlbldpdGhNVCBVc2luZyBFaWdlbiBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uCisKK0luIHRoZSBjYXNlIHlvdXIgb3duIGFwcGxpY2F0aW9uIGlzIG11bHRpdGhyZWFkZWQsIGFuZCBtdWx0aXBsZSB0aHJlYWRzIG1ha2UgY2FsbHMgdG8gRWlnZW4sIHRoZW4geW91IGhhdmUgdG8gaW5pdGlhbGl6ZSBFaWdlbiBieSBjYWxsaW5nIHRoZSBmb2xsb3dpbmcgcm91dGluZSBcYiBiZWZvcmUgY3JlYXRpbmcgdGhlIHRocmVhZHM6CitcY29kZQorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgRWlnZW46OmluaXRQYXJhbGxlbCgpOworICAKKyAgLi4uCit9CitcZW5kY29kZQorCitcbm90ZSBXaXRoIEVpZ2VuIDMuMywgYW5kIGEgZnVsbHkgQysrMTEgY29tcGxpYW50IGNvbXBpbGVyIChpLmUuLCA8YSBocmVmPSJodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9zdG9yYWdlX2R1cmF0aW9uI1N0YXRpY19sb2NhbF92YXJpYWJsZXMiPnRocmVhZC1zYWZlIHN0YXRpYyBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbjwvYT4pLCB0aGVuIGNhbGxpbmcgXGMgaW5pdFBhcmFsbGVsKCkgaXMgb3B0aW9uYWwuCisKK1x3YXJuaW5nIG5vdGUgdGhhdCBhbGwgZnVuY3Rpb25zIGdlbmVyYXRpbmcgcmFuZG9tIG1hdHJpY2VzIGFyZSBcYiBub3QgcmUtZW50cmFudCBub3IgdGhyZWFkLXNhZmUuIFRob3NlIGluY2x1ZGUgRGVuc2VCYXNlOjpSYW5kb20oKSwgYW5kIERlbnNlQmFzZTo6c2V0UmFuZG9tKCkgZGVzcGl0ZSBhIGNhbGwgdG8gRWlnZW46OmluaXRQYXJhbGxlbCgpLiBUaGlzIGlzIGJlY2F1c2UgdGhlc2UgZnVuY3Rpb25zIGFyZSBiYXNlZCBvbiBzdGQ6OnJhbmQgd2hpY2ggaXMgbm90IHJlLWVudHJhbnQuIEZvciB0aHJlYWQtc2FmZSByYW5kb20gZ2VuZXJhdG9yLCB3ZSByZWNvbW1lbmQgdGhlIHVzZSBvZiBib29zdDo6cmFuZG9tIG9yIGMrKzExIHJhbmRvbSBmZWF0dXJlLgorCitJbiB0aGUgY2FzZSB5b3VyIGFwcGxpY2F0aW9uIGlzIHBhcmFsbGVsaXplZCB3aXRoIE9wZW5NUCwgeW91IG1pZ2h0IHdhbnQgdG8gZGlzYWJsZSBFaWdlbidzIG93biBwYXJhbGxpemF0aW9uIGFzIGRldGFpbGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNSZXNpemluZy5kb3ggYi9kb2MvVG9waWNSZXNpemluZy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyM2UxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Ub3BpY1Jlc2l6aW5nLmRveApAQCAtMCwwICsxLDExIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNSZXNpemluZyBSZXNpemluZworCisKK1RPRE86IHdyaXRlIHRoaXMgZG94IHBhZ2UhCisKK0lzIGxpbmtlZCBmcm9tIHRoZSB0dXRvcmlhbCBvbiB0aGUgTWF0cml4IGNsYXNzLgorCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL1RvcGljU2NhbGFyVHlwZXMuZG94IGIvZG9jL1RvcGljU2NhbGFyVHlwZXMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjAzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVG9waWNTY2FsYXJUeXBlcy5kb3gKQEAgLTAsMCArMSwxMiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljU2NhbGFyVHlwZXMgU2NhbGFyIHR5cGVzCisKKworVE9ETzogd3JpdGUgdGhpcyBkb3ggcGFnZSEKKworSXMgbGlua2VkIGZyb20gdGhlIHR1dG9yaWFsIG9uIHRoZSBNYXRyaXggY2xhc3MuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9Ub3BpY1ZlY3Rvcml6YXRpb24uZG94IGIvZG9jL1RvcGljVmVjdG9yaXphdGlvbi5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0ZDA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Ub3BpY1ZlY3Rvcml6YXRpb24uZG94CkBAIC0wLDAgKzEsOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljVmVjdG9yaXphdGlvbiBWZWN0b3JpemF0aW9uCisKKworVE9ETzogd3JpdGUgdGhpcyBkb3ggcGFnZSEKKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9UdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24uZG94IGIvZG9jL1R1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbi5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNzRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9UdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24uZG94CkBAIC0wLDAgKzEsMTYyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24gQWR2YW5jZWQgaW5pdGlhbGl6YXRpb24KKworVGhpcyBwYWdlIGRpc2N1c3NlcyBzZXZlcmFsIGFkdmFuY2VkIG1ldGhvZHMgZm9yIGluaXRpYWxpemluZyBtYXRyaWNlcy4gSXQgZ2l2ZXMgbW9yZSBkZXRhaWxzIG9uIHRoZQorY29tbWEtaW5pdGlhbGl6ZXIsIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGJlZm9yZS4gSXQgYWxzbyBleHBsYWlucyBob3cgdG8gZ2V0IHNwZWNpYWwgbWF0cmljZXMgc3VjaCBhcyB0aGUKK2lkZW50aXR5IG1hdHJpeCBhbmQgdGhlIHplcm8gbWF0cml4LgorCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbkNvbW1hSW5pdGlhbGl6ZXIgVGhlIGNvbW1hIGluaXRpYWxpemVyCisKK0VpZ2VuIG9mZmVycyBhIGNvbW1hIGluaXRpYWxpemVyIHN5bnRheCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gZWFzaWx5IHNldCBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiBhIG1hdHJpeCwKK3ZlY3RvciBvciBhcnJheS4gU2ltcGx5IGxpc3QgdGhlIGNvZWZmaWNpZW50cywgc3RhcnRpbmcgYXQgdGhlIHRvcC1sZWZ0IGNvcm5lciBhbmQgbW92aW5nIGZyb20gbGVmdCB0byByaWdodAorYW5kIGZyb20gdGhlIHRvcCB0byB0aGUgYm90dG9tLiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0IG5lZWRzIHRvIGJlIHNwZWNpZmllZCBiZWZvcmVoYW5kLiBJZiB5b3UgbGlzdCB0b28gZmV3CitvciB0b28gbWFueSBjb2VmZmljaWVudHMsIEVpZ2VuIHdpbGwgY29tcGxhaW4uCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9jb21tYWluaXRfMDEuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitNb3Jlb3ZlciwgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0IG1heSB0aGVtc2VsdmVzIGJlIHZlY3RvcnMgb3IgbWF0cmljZXMuIEEgY29tbW9uIHVzZSBpcwordG8gam9pbiB2ZWN0b3JzIG9yIG1hdHJpY2VzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgaGVyZSBpcyBob3cgdG8gam9pbiB0d28gcm93IHZlY3RvcnMgdG9nZXRoZXIuIFJlbWVtYmVyCit0aGF0IHlvdSBoYXZlIHRvIHNldCB0aGUgc2l6ZSBiZWZvcmUgeW91IGNhbiB1c2UgdGhlIGNvbW1hIGluaXRpYWxpemVyLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Kb2luLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0pvaW4ub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworV2UgY2FuIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWUgdG8gaW5pdGlhbGl6ZSBtYXRyaWNlcyB3aXRoIGEgYmxvY2sgc3RydWN0dXJlLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgY29tbWEgaW5pdGlhbGl6ZXIgY2FuIGFsc28gYmUgdXNlZCB0byBmaWxsIGJsb2NrIGV4cHJlc3Npb25zIHN1Y2ggYXMgPHR0Pm0ucm93KGkpPC90dD4uIEhlcmUgaXMgYSBtb3JlCitjb21wbGljYXRlZCB3YXkgdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdCBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBhYm92ZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMWIuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMWIub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb25TcGVjaWFsTWF0cmljZXMgU3BlY2lhbCBtYXRyaWNlcyBhbmQgYXJyYXlzCisKK1RoZSBNYXRyaXggYW5kIEFycmF5IGNsYXNzZXMgaGF2ZSBzdGF0aWMgbWV0aG9kcyBsaWtlIFxsaW5rIERlbnNlQmFzZTo6WmVybygpIFplcm8oKVxlbmRsaW5rLCB3aGljaCBjYW4gYmUKK3VzZWQgdG8gaW5pdGlhbGl6ZSBhbGwgY29lZmZpY2llbnRzIHRvIHplcm8uIFRoZXJlIGFyZSB0aHJlZSB2YXJpYW50cy4gVGhlIGZpcnN0IHZhcmlhbnQgdGFrZXMgbm8gYXJndW1lbnRzCithbmQgY2FuIG9ubHkgYmUgdXNlZCBmb3IgZml4ZWQtc2l6ZSBvYmplY3RzLiBJZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGEgZHluYW1pYy1zaXplIG9iamVjdCB0byB6ZXJvLCB5b3UgbmVlZAordG8gc3BlY2lmeSB0aGUgc2l6ZS4gVGh1cywgdGhlIHNlY29uZCB2YXJpYW50IHJlcXVpcmVzIG9uZSBhcmd1bWVudCBhbmQgY2FuIGJlIHVzZWQgZm9yIG9uZS1kaW1lbnNpb25hbAorZHluYW1pYy1zaXplIG9iamVjdHMsIHdoaWxlIHRoZSB0aGlyZCB2YXJpYW50IHJlcXVpcmVzIHR3byBhcmd1bWVudHMgYW5kIGNhbiBiZSB1c2VkIGZvciB0d28tZGltZW5zaW9uYWwKK29iamVjdHMuIEFsbCB0aHJlZSB2YXJpYW50cyBhcmUgaWxsdXN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8ub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworU2ltaWxhcmx5LCB0aGUgc3RhdGljIG1ldGhvZCBcbGluayBEZW5zZUJhc2U6OkNvbnN0YW50KCkgQ29uc3RhbnRcZW5kbGluayh2YWx1ZSkgc2V0cyBhbGwgY29lZmZpY2llbnRzIHRvIFxjIHZhbHVlLgorSWYgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBnbyBiZWZvcmUgdGhlIFxjIHZhbHVlCithcmd1bWVudCwgYXMgaW4gPHR0Pk1hdHJpeFhkOjpDb25zdGFudChyb3dzLCBjb2xzLCB2YWx1ZSk8L3R0Pi4gVGhlIG1ldGhvZCBcbGluayBEZW5zZUJhc2U6OlJhbmRvbSgpIFJhbmRvbSgpCitcZW5kbGluayBmaWxscyB0aGUgbWF0cml4IG9yIGFycmF5IHdpdGggcmFuZG9tIGNvZWZmaWNpZW50cy4gVGhlIGlkZW50aXR5IG1hdHJpeCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworXGxpbmsgTWF0cml4QmFzZTo6SWRlbnRpdHkoKSBJZGVudGl0eSgpXGVuZGxpbms7IHRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBNYXRyaXgsIG5vdCBmb3IgQXJyYXksCitiZWNhdXNlICJpZGVudGl0eSBtYXRyaXgiIGlzIGEgbGluZWFyIGFsZ2VicmEgY29uY2VwdC4gIFRoZSBtZXRob2QKK1xsaW5rIERlbnNlQmFzZTo6TGluU3BhY2VkIExpblNwYWNlZFxlbmRsaW5rKHNpemUsIGxvdywgaGlnaCkgaXMgb25seSBhdmFpbGFibGUgZm9yIHZlY3RvcnMgYW5kCitvbmUtZGltZW5zaW9uYWwgYXJyYXlzOyBpdCB5aWVsZHMgYSB2ZWN0b3Igb2YgdGhlIHNwZWNpZmllZCBzaXplIHdob3NlIGNvZWZmaWNpZW50cyBhcmUgZXF1YWxseSBzcGFjZWQgYmV0d2VlbgorXGMgbG93IGFuZCBcYyBoaWdoLiBUaGUgbWV0aG9kIFxjIExpblNwYWNlZCgpIGlzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2hpY2ggcHJpbnRzIGEgdGFibGUKK3dpdGggYW5nbGVzIGluIGRlZ3JlZXMsIHRoZSBjb3JyZXNwb25kaW5nIGFuZ2xlIGluIHJhZGlhbnMsIGFuZCB0aGVpciBzaW5lIGFuZCBjb3NpbmUuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0xpblNwYWNlZC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9MaW5TcGFjZWQub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhpcyBleGFtcGxlIHNob3dzIHRoYXQgb2JqZWN0cyBsaWtlIHRoZSBvbmVzIHJldHVybmVkIGJ5IExpblNwYWNlZCgpIGNhbiBiZSBhc3NpZ25lZCB0byB2YXJpYWJsZXMgKGFuZAorZXhwcmVzc2lvbnMpLiBFaWdlbiBkZWZpbmVzIHV0aWxpdHkgZnVuY3Rpb25zIGxpa2UgXGxpbmsgRGVuc2VCYXNlOjpzZXRaZXJvKCkgc2V0WmVybygpXGVuZGxpbmssIAorXGxpbmsgTWF0cml4QmFzZTo6c2V0SWRlbnRpdHkoKSBcZW5kbGluayBhbmQgXGxpbmsgRGVuc2VCYXNlOjpzZXRMaW5TcGFjZWQoKSBcZW5kbGluayB0byBkbyB0aGlzCitjb252ZW5pZW50bHkuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb250cmFzdHMgdGhyZWUgd2F5cyB0byBjb25zdHJ1Y3QgdGhlIG1hdHJpeAorXGYkIEogPSBcYmlnbFsgXGJlZ2lue3NtYWxsbWF0cml4fSBPICYgSSBcXCBJICYgTyBcZW5ke3NtYWxsbWF0cml4fSBcYmlncl0gXGYkOiB1c2luZyBzdGF0aWMgbWV0aG9kcyBhbmQKK2Fzc2lnbm1lbnQsIHVzaW5nIHN0YXRpYyBtZXRob2RzIGFuZCB0aGUgY29tbWEtaW5pdGlhbGl6ZXIsIG9yIHVzaW5nIHRoZSBzZXRYeHgoKSBtZXRob2RzLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fVGhyZWVXYXlzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0Egc3VtbWFyeSBvZiBhbGwgcHJlLWRlZmluZWQgbWF0cml4LCB2ZWN0b3IgYW5kIGFycmF5IG9iamVjdHMgY2FuIGJlIGZvdW5kIGluIHRoZSBccmVmIFF1aWNrUmVmUGFnZS4KKworCitcc2VjdGlvbiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb25UZW1wb3JhcnlPYmplY3RzIFVzYWdlIGFzIHRlbXBvcmFyeSBvYmplY3RzCisKK0FzIHNob3duIGFib3ZlLCBzdGF0aWMgbWV0aG9kcyBhcyBaZXJvKCkgYW5kIENvbnN0YW50KCkgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB2YXJpYWJsZXMgYXQgdGhlIHRpbWUgb2YKK2RlY2xhcmF0aW9uIG9yIGF0IHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvci4gWW91IGNhbiB0aGluayBvZiB0aGVzZSBtZXRob2RzIGFzIHJldHVybmluZyBhCittYXRyaXggb3IgYXJyYXk7IGluIGZhY3QsIHRoZXkgcmV0dXJuIHNvLWNhbGxlZCBccmVmIFRvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzICJleHByZXNzaW9uIG9iamVjdHMiIHdoaWNoCitldmFsdWF0ZSB0byBhIG1hdHJpeCBvciBhcnJheSB3aGVuIG5lZWRlZCwgc28gdGhhdCB0aGlzIHN5bnRheCBkb2VzIG5vdCBpbmN1ciBhbnkgb3ZlcmhlYWQuCisKK1RoZXNlIGV4cHJlc3Npb25zIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgb2JqZWN0LiBUaGUgc2Vjb25kIGV4YW1wbGUgaW4KK3RoZSBccmVmIEdldHRpbmdTdGFydGVkIGd1aWRlLCB3aGljaCB3ZSByZXByb2R1Y2UgaGVyZSwgYWxyZWFkeSBpbGx1c3RyYXRlcyB0aGlzLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUyX2R5bmFtaWMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhlIGV4cHJlc3Npb24gPHR0Pm0gKyBNYXRyaXhYZjo6Q29uc3RhbnQoMywzLDEuMik8L3R0PiBjb25zdHJ1Y3RzIHRoZSAzLWJ5LTMgbWF0cml4IGV4cHJlc3Npb24gd2l0aCBhbGwgaXRzIGNvZWZmaWNpZW50cworZXF1YWwgdG8gMS4yIHBsdXMgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgb2YgXGEgbS4KKworVGhlIGNvbW1hLWluaXRpYWxpemVyLCB0b28sIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29uc3RydWN0IHRlbXBvcmFyeSBvYmplY3RzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29uc3RydWN0cyBhIHJhbmRvbQorbWF0cml4IG9mIHNpemUgMi1ieS0zLCBhbmQgdGhlbiBtdWx0aXBsaWVzIHRoaXMgbWF0cml4IG9uIHRoZSBsZWZ0IHdpdGggCitcZiQgXGJpZ2xbIFxiZWdpbntzbWFsbG1hdHJpeH0gMCAmIDEgXFwgMSAmIDAgXGVuZHtzbWFsbG1hdHJpeH0gXGJpZ3JdIFxmJC4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3Jhcnkub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhlIFxsaW5rIENvbW1hSW5pdGlhbGl6ZXI6OmZpbmlzaGVkKCkgZmluaXNoZWQoKSBcZW5kbGluayBtZXRob2QgaXMgbmVjZXNzYXJ5IGhlcmUgdG8gZ2V0IHRoZSBhY3R1YWwgbWF0cml4CitvYmplY3Qgb25jZSB0aGUgY29tbWEgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHRlbXBvcmFyeSBzdWJtYXRyaXggaXMgZG9uZS4KKworCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVHV0b3JpYWxBcnJheUNsYXNzLmRveCBiL2RvYy9UdXRvcmlhbEFycmF5Q2xhc3MuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjM1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVHV0b3JpYWxBcnJheUNsYXNzLmRveApAQCAtMCwwICsxLDE5MiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVHV0b3JpYWxBcnJheUNsYXNzIFRoZSBBcnJheSBjbGFzcyBhbmQgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zCisKK1RoaXMgcGFnZSBhaW1zIHRvIHByb3ZpZGUgYW4gb3ZlcnZpZXcgYW5kIGV4cGxhbmF0aW9ucyBvbiBob3cgdG8gdXNlCitFaWdlbidzIEFycmF5IGNsYXNzLgorCitcZWlnZW5BdXRvVG9jCisgIAorXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzSW50cm8gV2hhdCBpcyB0aGUgQXJyYXkgY2xhc3M/CisKK1RoZSBBcnJheSBjbGFzcyBwcm92aWRlcyBnZW5lcmFsLXB1cnBvc2UgYXJyYXlzLCBhcyBvcHBvc2VkIHRvIHRoZSBNYXRyaXggY2xhc3Mgd2hpY2gKK2lzIGludGVuZGVkIGZvciBsaW5lYXIgYWxnZWJyYS4gRnVydGhlcm1vcmUsIHRoZSBBcnJheSBjbGFzcyBwcm92aWRlcyBhbiBlYXN5IHdheSB0bworcGVyZm9ybSBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMsIHdoaWNoIG1pZ2h0IG5vdCBoYXZlIGEgbGluZWFyIGFsZ2VicmFpYyBtZWFuaW5nLAorc3VjaCBhcyBhZGRpbmcgYSBjb25zdGFudCB0byBldmVyeSBjb2VmZmljaWVudCBpbiB0aGUgYXJyYXkgb3IgbXVsdGlwbHlpbmcgdHdvIGFycmF5cyBjb2VmZmljaWVudC13aXNlLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJyYXlDbGFzc1R5cGVzIEFycmF5IHR5cGVzCitBcnJheSBpcyBhIGNsYXNzIHRlbXBsYXRlIHRha2luZyB0aGUgc2FtZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIE1hdHJpeC4KK0FzIHdpdGggTWF0cml4LCB0aGUgZmlyc3QgdGhyZWUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgbWFuZGF0b3J5OgorXGNvZGUKK0FycmF5PHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3NBdENvbXBpbGVUaW1lLCBpbnQgQ29sc0F0Q29tcGlsZVRpbWU+CitcZW5kY29kZQorVGhlIGxhc3QgdGhyZWUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuIFNpbmNlIHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgTWF0cml4LAord2Ugd29uJ3QgZXhwbGFpbiBpdCBhZ2FpbiBoZXJlIGFuZCBqdXN0IHJlZmVyIHRvIFxyZWYgVHV0b3JpYWxNYXRyaXhDbGFzcy4KKworRWlnZW4gYWxzbyBwcm92aWRlcyB0eXBlZGVmcyBmb3Igc29tZSBjb21tb24gY2FzZXMsIGluIGEgd2F5IHRoYXQgaXMgc2ltaWxhciB0byB0aGUgTWF0cml4IHR5cGVkZWZzCitidXQgd2l0aCBzb21lIHNsaWdodCBkaWZmZXJlbmNlcywgYXMgdGhlIHdvcmQgImFycmF5IiBpcyB1c2VkIGZvciBib3RoIDEtZGltZW5zaW9uYWwgYW5kIDItZGltZW5zaW9uYWwgYXJyYXlzLgorV2UgYWRvcHQgdGhlIGNvbnZlbnRpb24gdGhhdCB0eXBlZGVmcyBvZiB0aGUgZm9ybSBBcnJheU50IHN0YW5kIGZvciAxLWRpbWVuc2lvbmFsIGFycmF5cywgd2hlcmUgTiBhbmQgdCBhcmUKK3RoZSBzaXplIGFuZCB0aGUgc2NhbGFyIHR5cGUsIGFzIGluIHRoZSBNYXRyaXggdHlwZWRlZnMgZXhwbGFpbmVkIG9uIFxyZWYgVHV0b3JpYWxNYXRyaXhDbGFzcyAidGhpcyBwYWdlIi4gRm9yIDItZGltZW5zaW9uYWwgYXJyYXlzLCB3ZQordXNlIHR5cGVkZWZzIG9mIHRoZSBmb3JtIEFycmF5Tk50LiBTb21lIGV4YW1wbGVzIGFyZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+CisgIDx0cj4KKyAgICA8dGg+VHlwZSA8L3RoPgorICAgIDx0aD5UeXBlZGVmIDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+IFxjb2RlIEFycmF5PGZsb2F0LER5bmFtaWMsMT4gXGVuZGNvZGUgPC90ZD4KKyAgICA8dGQ+IFxjb2RlIEFycmF5WGYgXGVuZGNvZGUgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD4gXGNvZGUgQXJyYXk8ZmxvYXQsMywxPiBcZW5kY29kZSA8L3RkPgorICAgIDx0ZD4gXGNvZGUgQXJyYXkzZiBcZW5kY29kZSA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPiBcY29kZSBBcnJheTxkb3VibGUsRHluYW1pYyxEeW5hbWljPiBcZW5kY29kZSA8L3RkPgorICAgIDx0ZD4gXGNvZGUgQXJyYXlYWGQgXGVuZGNvZGUgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD4gXGNvZGUgQXJyYXk8ZG91YmxlLDMsMz4gXGVuZGNvZGUgPC90ZD4KKyAgICA8dGQ+IFxjb2RlIEFycmF5MzNkIFxlbmRjb2RlIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJyYXlDbGFzc0FjY2VzcyBBY2Nlc3NpbmcgdmFsdWVzIGluc2lkZSBhbiBBcnJheQorCitUaGUgcGFyZW50aGVzaXMgb3BlcmF0b3IgaXMgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHdyaXRlIGFuZCByZWFkIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnRzIG9mIGFuIGFycmF5LCBqdXN0IGFzIHdpdGggbWF0cmljZXMuCitGdXJ0aGVybW9yZSwgdGhlIFxjIDw8IG9wZXJhdG9yIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgYXJyYXlzICh2aWEgdGhlIGNvbW1hIGluaXRpYWxpemVyKSBvciB0byBwcmludCB0aGVtLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19hY2Nlc3NvcnMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21tYSBpbml0aWFsaXplciwgc2VlIFxyZWYgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJyYXlDbGFzc0FkZFN1YiBBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KKworQWRkaW5nIGFuZCBzdWJ0cmFjdGluZyB0d28gYXJyYXlzIGlzIHRoZSBzYW1lIGFzIGZvciBtYXRyaWNlcy4KK1RoZSBvcGVyYXRpb24gaXMgdmFsaWQgaWYgYm90aCBhcnJheXMgaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQgdGhlIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIGlzIGRvbmUgY29lZmZpY2llbnQtd2lzZS4KKworQXJyYXlzIGFsc28gc3VwcG9ydCBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSA8dHQ+YXJyYXkgKyBzY2FsYXI8L3R0PiB3aGljaCBhZGQgYSBzY2FsYXIgdG8gZWFjaCBjb2VmZmljaWVudCBpbiB0aGUgYXJyYXkuCitUaGlzIHByb3ZpZGVzIGEgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIG5vdCBkaXJlY3RseSBhdmFpbGFibGUgZm9yIE1hdHJpeCBvYmplY3RzLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19hZGRpdGlvbi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19hZGRpdGlvbi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJyYXlDbGFzc011bHQgQXJyYXkgbXVsdGlwbGljYXRpb24KKworRmlyc3Qgb2YgYWxsLCBvZiBjb3Vyc2UgeW91IGNhbiBtdWx0aXBseSBhbiBhcnJheSBieSBhIHNjYWxhciwgdGhpcyB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgbWF0cmljZXMuIFdoZXJlIGFycmF5cworYXJlIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IGZyb20gbWF0cmljZXMsIGlzIHdoZW4geW91IG11bHRpcGx5IHR3byB0b2dldGhlci4gTWF0cmljZXMgaW50ZXJwcmV0CittdWx0aXBsaWNhdGlvbiBhcyBtYXRyaXggcHJvZHVjdCBhbmQgYXJyYXlzIGludGVycHJldCBtdWx0aXBsaWNhdGlvbiBhcyBjb2VmZmljaWVudC13aXNlIHByb2R1Y3QuIFRodXMsIHR3byAKK2FycmF5cyBjYW4gYmUgbXVsdGlwbGllZCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucy4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19tdWx0Lm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzQ3dpc2VPdGhlciBPdGhlciBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMKKworVGhlIEFycmF5IGNsYXNzIGRlZmluZXMgb3RoZXIgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zIGJlc2lkZXMgdGhlIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiBhbmQgbXVsdGlwbGljYXRpb24KK29wZXJhdG9ycyBkZXNjcmliZWQgYWJvdmUuIEZvciBleGFtcGxlLCB0aGUgXGxpbmsgQXJyYXlCYXNlOjphYnMoKSAuYWJzKCkgXGVuZGxpbmsgbWV0aG9kIHRha2VzIHRoZSBhYnNvbHV0ZQordmFsdWUgb2YgZWFjaCBjb2VmZmljaWVudCwgd2hpbGUgXGxpbmsgQXJyYXlCYXNlOjpzcXJ0KCkgLnNxcnQoKSBcZW5kbGluayBjb21wdXRlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlCitjb2VmZmljaWVudHMuIElmIHlvdSBoYXZlIHR3byBhcnJheXMgb2YgdGhlIHNhbWUgc2l6ZSwgeW91IGNhbiBjYWxsIFxsaW5rIEFycmF5QmFzZTo6bWluKGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYpIGNvbnN0IC5taW4oLikgXGVuZGxpbmsgdG8KK2NvbnN0cnVjdCB0aGUgYXJyYXkgd2hvc2UgY29lZmZpY2llbnRzIGFyZSB0aGUgbWluaW11bSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2VmZmljaWVudHMgb2YgdGhlIHR3byBnaXZlbgorYXJyYXlzLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK01vcmUgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgXHJlZiBRdWlja1JlZlBhZ2UuCisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzQ29udmVydCBDb252ZXJ0aW5nIGJldHdlZW4gYXJyYXkgYW5kIG1hdHJpeCBleHByZXNzaW9ucworCitXaGVuIHNob3VsZCB5b3UgdXNlIG9iamVjdHMgb2YgdGhlIE1hdHJpeCBjbGFzcyBhbmQgd2hlbiBzaG91bGQgeW91IHVzZSBvYmplY3RzIG9mIHRoZSBBcnJheSBjbGFzcz8gWW91IGNhbm5vdAorYXBwbHkgTWF0cml4IG9wZXJhdGlvbnMgb24gYXJyYXlzLCBvciBBcnJheSBvcGVyYXRpb25zIG9uIG1hdHJpY2VzLiBUaHVzLCBpZiB5b3UgbmVlZCB0byBkbyBsaW5lYXIgYWxnZWJyYWljCitvcGVyYXRpb25zIHN1Y2ggYXMgbWF0cml4IG11bHRpcGxpY2F0aW9uLCB0aGVuIHlvdSBzaG91bGQgdXNlIG1hdHJpY2VzOyBpZiB5b3UgbmVlZCB0byBkbyBjb2VmZmljaWVudC13aXNlCitvcGVyYXRpb25zLCB0aGVuIHlvdSBzaG91bGQgdXNlIGFycmF5cy4gSG93ZXZlciwgc29tZXRpbWVzIGl0IGlzIG5vdCB0aGF0IHNpbXBsZSwgYnV0IHlvdSBuZWVkIHRvIHVzZSBib3RoCitNYXRyaXggYW5kIEFycmF5IG9wZXJhdGlvbnMuIEluIHRoYXQgY2FzZSwgeW91IG5lZWQgdG8gY29udmVydCBhIG1hdHJpeCB0byBhbiBhcnJheSBvciByZXZlcnNlbHkuIFRoaXMgZ2l2ZXMKK2FjY2VzcyB0byBhbGwgb3BlcmF0aW9ucyByZWdhcmRsZXNzIG9mIHRoZSBjaG9pY2Ugb2YgZGVjbGFyaW5nIG9iamVjdHMgYXMgYXJyYXlzIG9yIGFzIG1hdHJpY2VzLgorCitcbGluayBNYXRyaXhCYXNlIE1hdHJpeCBleHByZXNzaW9ucyBcZW5kbGluayBoYXZlIGFuIFxsaW5rIE1hdHJpeEJhc2U6OmFycmF5KCkgLmFycmF5KCkgXGVuZGxpbmsgbWV0aG9kIHRoYXQKKydjb252ZXJ0cycgdGhlbSBpbnRvIFxsaW5rIEFycmF5QmFzZSBhcnJheSBleHByZXNzaW9uc1xlbmRsaW5rLCBzbyB0aGF0IGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucworY2FuIGJlIGFwcGxpZWQgZWFzaWx5LiBDb252ZXJzZWx5LCBcbGluayBBcnJheUJhc2UgYXJyYXkgZXhwcmVzc2lvbnMgXGVuZGxpbmsKK2hhdmUgYSBcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKSBcZW5kbGluayBtZXRob2QuIEFzIHdpdGggYWxsIEVpZ2VuIGV4cHJlc3Npb24gYWJzdHJhY3Rpb25zLAordGhpcyBkb2Vzbid0IGhhdmUgYW55IHJ1bnRpbWUgY29zdCAocHJvdmlkZWQgdGhhdCB5b3UgbGV0IHlvdXIgY29tcGlsZXIgb3B0aW1pemUpLgorQm90aCBcbGluayBNYXRyaXhCYXNlOjphcnJheSgpIC5hcnJheSgpIFxlbmRsaW5rIGFuZCBcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKSBcZW5kbGluayAKK2NhbiBiZSB1c2VkIGFzIHJ2YWx1ZXMgYW5kIGFzIGx2YWx1ZXMuCisKK01peGluZyBtYXRyaWNlcyBhbmQgYXJyYXlzIGluIGFuIGV4cHJlc3Npb24gaXMgZm9yYmlkZGVuIHdpdGggRWlnZW4uIEZvciBpbnN0YW5jZSwgeW91IGNhbm5vdCBhZGQgYSBtYXRyaXggYW5kCithcnJheSBkaXJlY3RseTsgdGhlIG9wZXJhbmRzIG9mIGEgXGMgKyBvcGVyYXRvciBzaG91bGQgZWl0aGVyIGJvdGggYmUgbWF0cmljZXMgb3IgYm90aCBiZSBhcnJheXMuIEhvd2V2ZXIsCitpdCBpcyBlYXN5IHRvIGNvbnZlcnQgZnJvbSBvbmUgdG8gdGhlIG90aGVyIHdpdGggXGxpbmsgTWF0cml4QmFzZTo6YXJyYXkoKSAuYXJyYXkoKSBcZW5kbGluayBhbmQgCitcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKVxlbmRsaW5rLiBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB0aGUgYXNzaWdubWVudCBvcGVyYXRvcjogaXQgaXMKK2FsbG93ZWQgdG8gYXNzaWduIGEgbWF0cml4IGV4cHJlc3Npb24gdG8gYW4gYXJyYXkgdmFyaWFibGUsIG9yIHRvIGFzc2lnbiBhbiBhcnJheSBleHByZXNzaW9uIHRvIGEgbWF0cml4Cit2YXJpYWJsZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYXJyYXkgb3BlcmF0aW9ucyBvbiBhIE1hdHJpeCBvYmplY3QgYnkgZW1wbG95aW5nIHRoZSAKK1xsaW5rIE1hdHJpeEJhc2U6OmFycmF5KCkgLmFycmF5KCkgXGVuZGxpbmsgbWV0aG9kLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlbWVudCAKKzx0dD5yZXN1bHQgPSBtLmFycmF5KCkgKiBuLmFycmF5KCk8L3R0PiB0YWtlcyB0d28gbWF0cmljZXMgXGMgbSBhbmQgXGMgbiwgY29udmVydHMgdGhlbSBib3RoIHRvIGFuIGFycmF5LCB1c2VzCisqIHRvIG11bHRpcGx5IHRoZW0gY29lZmZpY2llbnQtd2lzZSBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBtYXRyaXggdmFyaWFibGUgXGMgcmVzdWx0ICh0aGlzIGlzIGxlZ2FsCitiZWNhdXNlIEVpZ2VuIGFsbG93cyBhc3NpZ25pbmcgYXJyYXkgZXhwcmVzc2lvbnMgdG8gbWF0cml4IHZhcmlhYmxlcykuIAorCitBcyBhIG1hdHRlciBvZiBmYWN0LCB0aGlzIHVzYWdlIGNhc2UgaXMgc28gY29tbW9uIHRoYXQgRWlnZW4gcHJvdmlkZXMgYSBcbGluayBNYXRyaXhCYXNlOjpjd2lzZVByb2R1Y3QgY29uc3QKKy5jd2lzZVByb2R1Y3QoLikgXGVuZGxpbmsgbWV0aG9kIGZvciBtYXRyaWNlcyB0byBjb21wdXRlIHRoZSBjb2VmZmljaWVudC13aXNlIHByb2R1Y3QuIFRoaXMgaXMgYWxzbyBzaG93biBpbgordGhlIGV4YW1wbGUgcHJvZ3JhbS4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcF9tYXRyaXguY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcF9tYXRyaXgub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworU2ltaWxhcmx5LCBpZiBcYyBhcnJheTEgYW5kIFxjIGFycmF5MiBhcmUgYXJyYXlzLCB0aGVuIHRoZSBleHByZXNzaW9uIDx0dD5hcnJheTEubWF0cml4KCkgKiBhcnJheTIubWF0cml4KCk8L3R0PgorY29tcHV0ZXMgdGhlaXIgbWF0cml4IHByb2R1Y3QuCisKK0hlcmUgaXMgYSBtb3JlIGFkdmFuY2VkIGV4YW1wbGUuIFRoZSBleHByZXNzaW9uIDx0dD4obS5hcnJheSgpICsgNCkubWF0cml4KCkgKiBtPC90dD4gYWRkcyA0IHRvIGV2ZXJ5Citjb2VmZmljaWVudCBpbiB0aGUgbWF0cml4IFxjIG0gYW5kIHRoZW4gY29tcHV0ZXMgdGhlIG1hdHJpeCBwcm9kdWN0IG9mIHRoZSByZXN1bHQgd2l0aCBcYyBtLiBTaW1pbGFybHksIHRoZQorZXhwcmVzc2lvbiA8dHQ+KG0uYXJyYXkoKSAqIG4uYXJyYXkoKSkubWF0cml4KCkgKiBtPC90dD4gY29tcHV0ZXMgdGhlIGNvZWZmaWNpZW50LXdpc2UgcHJvZHVjdCBvZiB0aGUgbWF0cmljZXMKK1xjIG0gYW5kIFxjIG4gYW5kIHRoZW4gdGhlIG1hdHJpeCBwcm9kdWN0IG9mIHRoZSByZXN1bHQgd2l0aCBcYyBtLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3Aub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1R1dG9yaWFsQmxvY2tPcGVyYXRpb25zLmRveCBiL2RvYy9UdXRvcmlhbEJsb2NrT3BlcmF0aW9ucy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkOGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9UdXRvcmlhbEJsb2NrT3BlcmF0aW9ucy5kb3gKQEAgLTAsMCArMSwyMjggQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zIEJsb2NrIG9wZXJhdGlvbnMKKworVGhpcyBwYWdlIGV4cGxhaW5zIHRoZSBlc3NlbnRpYWxzIG9mIGJsb2NrIG9wZXJhdGlvbnMuCitBIGJsb2NrIGlzIGEgcmVjdGFuZ3VsYXIgcGFydCBvZiBhIG1hdHJpeCBvciBhcnJheS4gQmxvY2tzIGV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGJvdGgKK2FzIHJ2YWx1ZXMgYW5kIGFzIGx2YWx1ZXMuIEFzIHVzdWFsIHdpdGggRWlnZW4gZXhwcmVzc2lvbnMsIHRoaXMgYWJzdHJhY3Rpb24gaGFzIHplcm8gcnVudGltZSBjb3N0Citwcm92aWRlZCB0aGF0IHlvdSBsZXQgeW91ciBjb21waWxlciBvcHRpbWl6ZS4KKworXGVpZ2VuQXV0b1RvYworCitcc2VjdGlvbiBUdXRvcmlhbEJsb2NrT3BlcmF0aW9uc1VzaW5nIFVzaW5nIGJsb2NrIG9wZXJhdGlvbnMKKworVGhlIG1vc3QgZ2VuZXJhbCBibG9jayBvcGVyYXRpb24gaW4gRWlnZW4gaXMgY2FsbGVkIFxsaW5rIERlbnNlQmFzZTo6YmxvY2soKSAuYmxvY2soKSBcZW5kbGluay4KK1RoZXJlIGFyZSB0d28gdmVyc2lvbnMsIHdob3NlIHN5bnRheCBpcyBhcyBmb2xsb3dzOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+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+PC90YWJsZT4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1R1dG9yaWFsR2VvbWV0cnkuZG94IGIvZG9jL1R1dG9yaWFsR2VvbWV0cnkuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTQyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVHV0b3JpYWxHZW9tZXRyeS5kb3gKQEAgLTAsMCArMSwyNDIgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFR1dG9yaWFsR2VvbWV0cnkgU3BhY2UgdHJhbnNmb3JtYXRpb25zCisKK0luIHRoaXMgcGFnZSwgd2Ugd2lsbCBpbnRyb2R1Y2UgdGhlIG1hbnkgcG9zc2liaWxpdGllcyBvZmZlcmVkIGJ5IHRoZSBccmVmIEdlb21ldHJ5X01vZHVsZSAiZ2VvbWV0cnkgbW9kdWxlIiB0byBkZWFsIHdpdGggMkQgYW5kIDNEIHJvdGF0aW9ucyBhbmQgcHJvamVjdGl2ZSBvciBhZmZpbmUgdHJhbnNmb3JtYXRpb25zLgorCitcZWlnZW5BdXRvVG9jCisKK0VpZ2VuJ3MgR2VvbWV0cnkgbW9kdWxlIHByb3ZpZGVzIHR3byBkaWZmZXJlbnQga2luZHMgb2YgZ2VvbWV0cmljIHRyYW5zZm9ybWF0aW9uczoKKyAgLSBBYnN0cmFjdCB0cmFuc2Zvcm1hdGlvbnMsIHN1Y2ggYXMgcm90YXRpb25zIChyZXByZXNlbnRlZCBieSBccmVmIEFuZ2xlQXhpcyAiYW5nbGUgYW5kIGF4aXMiIG9yIGJ5IGEgXHJlZiBRdWF0ZXJuaW9uICJxdWF0ZXJuaW9uIiksIFxyZWYgVHJhbnNsYXRpb24gInRyYW5zbGF0aW9ucyIsIFxyZWYgU2NhbGluZyAic2NhbGluZ3MiLiBUaGVzZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIE5PVCByZXByZXNlbnRlZCBhcyBtYXRyaWNlcywgYnV0IHlvdSBjYW4gbmV2ZXJ0aGVsZXNzIG1peCB0aGVtIHdpdGggbWF0cmljZXMgYW5kIHZlY3RvcnMgaW4gZXhwcmVzc2lvbnMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gbWF0cmljZXMgaWYgeW91IHdpc2guCisgIC0gUHJvamVjdGl2ZSBvciBhZmZpbmUgdHJhbnNmb3JtYXRpb24gbWF0cmljZXM6IHNlZSB0aGUgVHJhbnNmb3JtIGNsYXNzLiBUaGVzZSBhcmUgcmVhbGx5IG1hdHJpY2VzLgorCitcbm90ZSBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBPcGVuR0wgNHg0IG1hdHJpY2VzIHRoZW4gQWZmaW5lM2YgYW5kIEFmZmluZTNkIGFyZSB3aGF0IHlvdSB3YW50LiBTaW5jZSBFaWdlbiBkZWZhdWx0cyB0byBjb2x1bW4tbWFqb3Igc3RvcmFnZSwgeW91IGNhbiBkaXJlY3RseSB1c2UgdGhlIFRyYW5zZm9ybTo6ZGF0YSgpIG1ldGhvZCB0byBwYXNzIHlvdXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIE9wZW5HTC4KKworWW91IGNhbiBjb25zdHJ1Y3QgYSBUcmFuc2Zvcm0gZnJvbSBhbiBhYnN0cmFjdCB0cmFuc2Zvcm1hdGlvbiwgbGlrZSB0aGlzOgorXGNvZGUKKyAgVHJhbnNmb3JtIHQoQW5nbGVBeGlzKGFuZ2xlLGF4aXMpKTsKK1xlbmRjb2RlCitvciBsaWtlIHRoaXM6CitcY29kZQorICBUcmFuc2Zvcm0gdDsKKyAgdCA9IEFuZ2xlQXhpcyhhbmdsZSxheGlzKTsKK1xlbmRjb2RlCitCdXQgbm90ZSB0aGF0IHVuZm9ydHVuYXRlbHksIGJlY2F1c2Ugb2YgaG93IEMrKyB3b3JrcywgeW91IGNhbiBcYiBub3QgZG8gdGhpczoKK1xjb2RlCisgIFRyYW5zZm9ybSB0ID0gQW5nbGVBeGlzKGFuZ2xlLGF4aXMpOworXGVuZGNvZGUKKzxzcGFuIGNsYXNzPSJub3RlIj5cYiBFeHBsYW5hdGlvbjogSW4gdGhlIEMrKyBsYW5ndWFnZSwgdGhpcyB3b3VsZCByZXF1aXJlIFRyYW5zZm9ybSB0byBoYXZlIGEgbm9uLWV4cGxpY2l0IGNvbnZlcnNpb24gY29uc3RydWN0b3IgZnJvbSBBbmdsZUF4aXMsIGJ1dCB3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBhbGxvdyBpbXBsaWNpdCBjYXN0aW5nIGhlcmUuCis8L3NwYW4+CisKK1xzZWN0aW9uIFR1dG9yaWFsR2VvRWxlbWVudGFyeVRyYW5zZm9ybWF0aW9ucyBUcmFuc2Zvcm1hdGlvbiB0eXBlcworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPlRyYW5zZm9ybWF0aW9uIHR5cGU8L3RoPjx0aD5UeXBpY2FsIGluaXRpYWxpemF0aW9uIGNvZGU8L3RoPjwvdHI+Cis8dHI+PHRkPgorXHJlZiBSb3RhdGlvbjJEICIyRCByb3RhdGlvbiIgZnJvbSBhbiBhbmdsZTwvdGQ+PHRkPlxjb2RlCitSb3RhdGlvbjJEPGZsb2F0PiByb3QyKGFuZ2xlX2luX3JhZGlhbik7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorM0Qgcm90YXRpb24gYXMgYW4gXHJlZiBBbmdsZUF4aXMgImFuZ2xlICsgYXhpcyI8L3RkPjx0ZD5cY29kZQorQW5nbGVBeGlzPGZsb2F0PiBhYShhbmdsZV9pbl9yYWRpYW4sIFZlY3RvcjNmKGF4LGF5LGF6KSk7XGVuZGNvZGUKKzxzcGFuIGNsYXNzPSJub3RlIj5UaGUgYXhpcyB2ZWN0b3IgbXVzdCBiZSBub3JtYWxpemVkLjwvc3Bhbj48L3RkPjwvdHI+Cis8dHI+PHRkPgorM0Qgcm90YXRpb24gYXMgYSBccmVmIFF1YXRlcm5pb24gInF1YXRlcm5pb24iPC90ZD48dGQ+XGNvZGUKK1F1YXRlcm5pb248ZmxvYXQ+IHE7ICBxID0gQW5nbGVBeGlzPGZsb2F0PihhbmdsZV9pbl9yYWRpYW4sIGF4aXMpO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK04tRCBTY2FsaW5nPC90ZD48dGQ+XGNvZGUKK1NjYWxpbmcoc3gsIHN5KQorU2NhbGluZyhzeCwgc3ksIHN6KQorU2NhbGluZyhzKQorU2NhbGluZyh2ZWNOKVxlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD4KK04tRCBUcmFuc2xhdGlvbjwvdGQ+PHRkPlxjb2RlCitUcmFuc2xhdGlvbjxmbG9hdCwyPih0eCwgdHkpCitUcmFuc2xhdGlvbjxmbG9hdCwzPih0eCwgdHksIHR6KQorVHJhbnNsYXRpb248ZmxvYXQsTj4ocykKK1RyYW5zbGF0aW9uPGZsb2F0LE4+KHZlY04pXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorTi1EIFxyZWYgVHV0b3JpYWxHZW9UcmFuc2Zvcm0gIkFmZmluZSB0cmFuc2Zvcm1hdGlvbiI8L3RkPjx0ZD5cY29kZQorVHJhbnNmb3JtPGZsb2F0LE4sQWZmaW5lPiB0ID0gY29uY2F0ZW5hdGlvbl9vZl9hbnlfdHJhbnNmb3JtYXRpb25zOworVHJhbnNmb3JtPGZsb2F0LDMsQWZmaW5lPiB0ID0gVHJhbnNsYXRpb24zZihwKSAqIEFuZ2xlQXhpc2YoYSxheGlzKSAqIFNjYWxpbmcocyk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPgorTi1EIExpbmVhciB0cmFuc2Zvcm1hdGlvbnMgXG4KKzxlbSBjbGFzcz1ub3RlPihwdXJlIHJvdGF0aW9ucywgXG4gc2NhbGluZywgZXRjLik8L2VtPjwvdGQ+PHRkPlxjb2RlCitNYXRyaXg8ZmxvYXQsTj4gdCA9IGNvbmNhdGVuYXRpb25fb2Zfcm90YXRpb25zX2FuZF9zY2FsaW5nczsKK01hdHJpeDxmbG9hdCwyPiB0ID0gUm90YXRpb24yRGYoYSkgKiBTY2FsaW5nKHMpOworTWF0cml4PGZsb2F0LDM+IHQgPSBBbmdsZUF4aXNmKGEsYXhpcykgKiBTY2FsaW5nKHMpO1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworPHN0cm9uZz5Ob3RlcyBvbiByb3RhdGlvbnM8L3N0cm9uZz5cbiBUbyB0cmFuc2Zvcm0gbW9yZSB0aGFuIGEgc2luZ2xlIHZlY3RvciB0aGUgcHJlZmVycmVkCityZXByZXNlbnRhdGlvbnMgYXJlIHJvdGF0aW9uIG1hdHJpY2VzLCB3aGlsZSBmb3Igb3RoZXIgdXNhZ2VzIFF1YXRlcm5pb24gaXMgdGhlCityZXByZXNlbnRhdGlvbiBvZiBjaG9pY2UgYXMgdGhleSBhcmUgY29tcGFjdCwgZmFzdCBhbmQgc3RhYmxlLiBGaW5hbGx5IFJvdGF0aW9uMkQgYW5kCitBbmdsZUF4aXMgYXJlIG1haW5seSBjb252ZW5pZW50IHR5cGVzIHRvIGNyZWF0ZSBvdGhlciByb3RhdGlvbiBvYmplY3RzLgorCis8c3Ryb25nPk5vdGVzIG9uIFRyYW5zbGF0aW9uIGFuZCBTY2FsaW5nPC9zdHJvbmc+XG4gTGlrZSBBbmdsZUF4aXMsIHRoZXNlIGNsYXNzZXMgd2VyZQorZGVzaWduZWQgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uL2luaXRpYWxpemF0aW9uIG9mIGxpbmVhciAoTWF0cml4KSBhbmQgYWZmaW5lIChUcmFuc2Zvcm0pCit0cmFuc2Zvcm1hdGlvbnMuIE5ldmVydGhlbGVzcywgdW5saWtlIEFuZ2xlQXhpcyB3aGljaCBpcyBpbmVmZmljaWVudCB0byB1c2UsIHRoZXNlIGNsYXNzZXMKK21pZ2h0IHN0aWxsIGJlIGludGVyZXN0aW5nIHRvIHdyaXRlIGdlbmVyaWMgYW5kIGVmZmljaWVudCBhbGdvcml0aG1zIHRha2luZyBhcyBpbnB1dCBhbnkKK2tpbmQgb2YgdHJhbnNmb3JtYXRpb25zLgorCitBbnkgb2YgdGhlIGFib3ZlIHRyYW5zZm9ybWF0aW9uIHR5cGVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW55IG90aGVyIHR5cGVzIG9mIHRoZSBzYW1lIG5hdHVyZSwKK29yIHRvIGEgbW9yZSBnZW5lcmljIHR5cGUuIEhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBleGFtcGxlczoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+XGNvZGUKK1JvdGF0aW9uMkRmIHI7ICByICA9IE1hdHJpeDJmKC4uKTsgICAgICAgLy8gYXNzdW1lcyBhIHB1cmUgcm90YXRpb24gbWF0cml4CitBbmdsZUF4aXNmIGFhOyAgYWEgPSBRdWF0ZXJuaW9uZiguLik7CitBbmdsZUF4aXNmIGFhOyAgYWEgPSBNYXRyaXgzZiguLik7ICAgICAgIC8vIGFzc3VtZXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeAorTWF0cml4MmYgbTsgICAgIG0gID0gUm90YXRpb24yRGYoLi4pOworTWF0cml4M2YgbTsgICAgIG0gID0gUXVhdGVybmlvbmYoLi4pOyAgICAgICBNYXRyaXgzZiBtOyAgIG0gPSBTY2FsaW5nKC4uKTsKK0FmZmluZTNmIG07ICAgICBtICA9IEFuZ2xlQXhpczNmKC4uKTsgICAgICAgQWZmaW5lM2YgbTsgICBtID0gU2NhbGluZyguLik7CitBZmZpbmUzZiBtOyAgICAgbSAgPSBUcmFuc2xhdGlvbjNmKC4uKTsgICAgIEFmZmluZTNmIG07ICAgbSA9IE1hdHJpeDNmKC4uKTsKK1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+XHNlY3Rpb24gVHV0b3JpYWxHZW9Db21tb250cmFuc2Zvcm1hdGlvbkFQSSBDb21tb24gQVBJIGFjcm9zcyB0cmFuc2Zvcm1hdGlvbiB0eXBlcworCitUbyBzb21lIGV4dGVudCwgRWlnZW4ncyBccmVmIEdlb21ldHJ5X01vZHVsZSAiZ2VvbWV0cnkgbW9kdWxlIiBhbGxvd3MgeW91IHRvIHdyaXRlCitnZW5lcmljIGFsZ29yaXRobXMgd29ya2luZyBvbiBhbnkga2luZCBvZiB0cmFuc2Zvcm1hdGlvbiByZXByZXNlbnRhdGlvbnM6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPgorQ29uY2F0ZW5hdGlvbiBvZiB0d28gdHJhbnNmb3JtYXRpb25zPC90ZD48dGQ+XGNvZGUKK2dlbjEgKiBnZW4yO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5BcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSB2ZWN0b3I8L3RkPjx0ZD5cY29kZQordmVjMiA9IGdlbjEgKiB2ZWMxO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5HZXQgdGhlIGludmVyc2Ugb2YgdGhlIHRyYW5zZm9ybWF0aW9uPC90ZD48dGQ+XGNvZGUKK2dlbjIgPSBnZW4xLmludmVyc2UoKTtcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+U3BoZXJpY2FsIGludGVycG9sYXRpb24gXG4gKFJvdGF0aW9uMkQgYW5kIFF1YXRlcm5pb24gb25seSk8L3RkPjx0ZD5cY29kZQorcm90MyA9IHJvdDEuc2xlcnAoYWxwaGEscm90Mik7XGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCisKKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPlxzZWN0aW9uIFR1dG9yaWFsR2VvVHJhbnNmb3JtIEFmZmluZSB0cmFuc2Zvcm1hdGlvbnMKK0dlbmVyaWMgYWZmaW5lIHRyYW5zZm9ybWF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIFRyYW5zZm9ybSBjbGFzcyB3aGljaCBpbnRlcm5hbHkKK2lzIGEgKERpbSsxKV4yIG1hdHJpeC4gSW4gRWlnZW4gd2UgaGF2ZSBjaG9zZW4gdG8gbm90IGRpc3RpbmdoaXNoIGJldHdlZW4gcG9pbnRzIGFuZAordmVjdG9ycyBzdWNoIHRoYXQgYWxsIHBvaW50cyBhcmUgYWN0dWFsbHkgcmVwcmVzZW50ZWQgYnkgZGlzcGxhY2VtZW50IHZlY3RvcnMgZnJvbSB0aGUKK29yaWdpbiAoIFxmJCBcbWF0aGJme3B9IFxlcXVpdiBcbWF0aGJme3B9LTAgXGYkICkuIFdpdGggdGhhdCBpbiBtaW5kLCByZWFsIHBvaW50cyBhbmQKK3ZlY3RvciBkaXN0aW5ndWlzaCB3aGVuIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhcHBsaWVkLgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4KK0FwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhIFxiIHBvaW50IDwvdGQ+PHRkPlxjb2RlCitWZWN0b3JOZiBwMSwgcDI7CitwMiA9IHQgKiBwMTtcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+CitBcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSBcYiB2ZWN0b3IgPC90ZD48dGQ+XGNvZGUKK1ZlY3Rvck5mIHZlYzEsIHZlYzI7Cit2ZWMyID0gdC5saW5lYXIoKSAqIHZlYzE7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPgorQXBwbHkgYSBcZW0gZ2VuZXJhbCB0cmFuc2Zvcm1hdGlvbiBcbiB0byBhIFxiIG5vcm1hbCBcYiB2ZWN0b3IgXG4KKzwvdGQ+PHRkPlxjb2RlCitWZWN0b3JOZiBuMSwgbjI7CitNYXRyaXhOZiBub3JtYWxNYXRyaXggPSB0LmxpbmVhcigpLmludmVyc2UoKS50cmFuc3Bvc2UoKTsKK24yID0gKG5vcm1hbE1hdHJpeCAqIG4xKS5ub3JtYWxpemVkKCk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjIiPihTZWUgc3ViamVjdCA1LjI3IG9mIHRoaXMgPGEgaHJlZj0iaHR0cDovL3d3dy5mYXFzLm9yZy9mYXFzL2dyYXBoaWNzL2FsZ29yaXRobXMtZmFxIj5mYXE8L2E+IGZvciB0aGUgZXhwbGFuYXRpb25zKTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+CitBcHBseSBhIHRyYW5zZm9ybWF0aW9uIHdpdGggXGVtIHB1cmUgXGVtIHJvdGF0aW9uIFxuIHRvIGEgXGIgbm9ybWFsIFxiIHZlY3RvcgorKG5vIHNjYWxpbmcsIG5vIHNoZWFyKTwvdGQ+PHRkPlxjb2RlCituMiA9IHQubGluZWFyKCkgKiBuMTtcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+CitPcGVuR0wgY29tcGF0aWJpbGl0eSBcYiAzRCA8L3RkPjx0ZD5cY29kZQorZ2xMb2FkTWF0cml4Zih0LmRhdGEoKSk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorT3BlbkdMIGNvbXBhdGliaWxpdHkgXGIgMkQgPC90ZD48dGQ+XGNvZGUKK0FmZmluZTNmIGF1eChBZmZpbmUzZjo6SWRlbnRpdHkoKSk7CithdXgubGluZWFyKCkudG9wTGVmdENvcm5lcjwyLDI+KCkgPSB0LmxpbmVhcigpOworYXV4LnRyYW5zbGF0aW9uKCkuc3RhcnQ8Mj4oKSA9IHQudHJhbnNsYXRpb24oKTsKK2dsTG9hZE1hdHJpeGYoYXV4LmRhdGEoKSk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitcYiBDb21wb25lbnQgXGIgYWNjZXNzb3JzCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPgorZnVsbCByZWFkLXdyaXRlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgbWF0cml4PC90ZD48dGQ+XGNvZGUKK3QubWF0cml4KCkgPSBtYXROMXhOMTsgICAgLy8gTjEgbWVhbnMgTisxCittYXROMXhOMSA9IHQubWF0cml4KCk7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+Citjb2VmZmljaWVudCBhY2Nlc3NvcnM8L3RkPjx0ZD5cY29kZQordChpLGopID0gc2NhbGFyOyAgIDw9PiAgIHQubWF0cml4KCkoaSxqKSA9IHNjYWxhcjsKK3NjYWxhciA9IHQoaSxqKTsgICA8PT4gICBzY2FsYXIgPSB0Lm1hdHJpeCgpKGksaik7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+Cit0cmFuc2xhdGlvbiBwYXJ0PC90ZD48dGQ+XGNvZGUKK3QudHJhbnNsYXRpb24oKSA9IHZlY047Cit2ZWNOID0gdC50cmFuc2xhdGlvbigpOworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorbGluZWFyIHBhcnQ8L3RkPjx0ZD5cY29kZQordC5saW5lYXIoKSA9IG1hdE54TjsKK21hdE54TiA9IHQubGluZWFyKCk7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+CitleHRyYWN0IHRoZSByb3RhdGlvbiBtYXRyaXg8L3RkPjx0ZD5cY29kZQorbWF0TnhOID0gdC5yb3RhdGlvbigpOworXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCisKK1xiIFRyYW5zZm9ybWF0aW9uIFxiIGNyZWF0aW9uIFxuCitXaGlsZSB0cmFuc2Zvcm1hdGlvbiBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIGFuZCB1cGRhdGVkIGNvbmNhdGVuYXRpbmcgZWxlbWVudGFyeSB0cmFuc2Zvcm1hdGlvbnMsCit0aGUgVHJhbnNmb3JtIGNsYXNzIGFsc28gZmVhdHVyZXMgYSBwcm9jZWR1cmFsIEFQSToKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+PC90aD48dGg+cHJvY2VkdXJhbCBBUEk8L3RoPjx0aD5lcXVpdmFsZW50IG5hdHVyYWwgQVBJIDwvdGg+PC90cj4KKzx0cj48dGQ+VHJhbnNsYXRpb248L3RkPjx0ZD5cY29kZQordC50cmFuc2xhdGUoVmVjdG9yXyh0eCx0eSwuLikpOwordC5wcmV0cmFuc2xhdGUoVmVjdG9yXyh0eCx0eSwuLikpOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQordCAqPSBUcmFuc2xhdGlvbl8odHgsdHksLi4pOwordCA9IFRyYW5zbGF0aW9uXyh0eCx0eSwuLikgKiB0OworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxiIFJvdGF0aW9uIFxuIDxlbSBjbGFzcz0ibm90ZSI+SW4gMkQgYW5kIGZvciB0aGUgcHJvY2VkdXJhbCBBUEksIGFueV9yb3RhdGlvbiBjYW4gYWxzbyBcbiBiZSBhbiBhbmdsZSBpbiByYWRpYW48L2VtPjwvdGQ+PHRkPlxjb2RlCit0LnJvdGF0ZShhbnlfcm90YXRpb24pOwordC5wcmVyb3RhdGUoYW55X3JvdGF0aW9uKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK3QgKj0gYW55X3JvdGF0aW9uOwordCA9IGFueV9yb3RhdGlvbiAqIHQ7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+U2NhbGluZzwvdGQ+PHRkPlxjb2RlCit0LnNjYWxlKFZlY3Rvcl8oc3gsc3ksLi4pKTsKK3Quc2NhbGUocyk7Cit0LnByZXNjYWxlKFZlY3Rvcl8oc3gsc3ksLi4pKTsKK3QucHJlc2NhbGUocyk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCit0ICo9IFNjYWxpbmcoc3gsc3ksLi4pOwordCAqPSBTY2FsaW5nKHMpOwordCA9IFNjYWxpbmcoc3gsc3ksLi4pICogdDsKK3QgPSBTY2FsaW5nKHMpICogdDsKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5TaGVhciB0cmFuc2Zvcm1hdGlvbiBcbiAoIFxiIDJEIFxiIG9ubHkgISApPC90ZD48dGQ+XGNvZGUKK3Quc2hlYXIoc3gsc3kpOwordC5wcmVzaGVhcihzeCxzeSk7CitcZW5kY29kZTwvdGQ+PHRkPjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK05vdGUgdGhhdCBpbiBib3RoIEFQSSwgYW55IG1hbnkgdHJhbnNmb3JtYXRpb25zIGNhbiBiZSBjb25jYXRlbmF0ZWQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbiBhcyBzaG93biBpbiB0aGUgdHdvIGZvbGxvd2luZyBlcXVpdmFsZW50IGV4YW1wbGVzOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5cY29kZQordC5wcmV0cmFuc2xhdGUoLi4pLnJvdGF0ZSguLikudHJhbnNsYXRlKC4uKS5zY2FsZSguLik7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+XGNvZGUKK3QgPSBUcmFuc2xhdGlvbl8oLi4pICogdCAqIFJvdGF0aW9uVHlwZSguLikgKiBUcmFuc2xhdGlvbl8oLi4pICogU2NhbGluZyguLik7CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+XHNlY3Rpb24gVHV0b3JpYWxHZW9FdWxlckFuZ2xlcyBFdWxlciBhbmdsZXMKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQgc3R5bGU9Im1heC13aWR0aDozMGVtOyI+CitFdWxlciBhbmdsZXMgbWlnaHQgYmUgY29udmVuaWVudCB0byBjcmVhdGUgcm90YXRpb24gb2JqZWN0cy4KK09uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB0aGVyZSBleGlzdCAyNCBkaWZmZXJlbnQgY29udmVudGlvbnMsIHRoZXkgYXJlIHByZXR0eSBjb25mdXNpbmcgdG8gdXNlLiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93Cit0byBjcmVhdGUgYSByb3RhdGlvbiBtYXRyaXggYWNjb3JkaW5nIHRvIHRoZSAyLTEtMiBjb252ZW50aW9uLjwvdGQ+PHRkPlxjb2RlCitNYXRyaXgzZiBtOworbSA9IEFuZ2xlQXhpc2YoYW5nbGUxLCBWZWN0b3IzZjo6VW5pdFooKSkKKyAgKiBBbmdsZUF4aXNmKGFuZ2xlMiwgVmVjdG9yM2Y6OlVuaXRZKCkpCisgICogQW5nbGVBeGlzZihhbmdsZTMsIFZlY3RvcjNmOjpVbml0WigpKTsKK1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1R1dG9yaWFsTGluZWFyQWxnZWJyYS5kb3ggYi9kb2MvVHV0b3JpYWxMaW5lYXJBbGdlYnJhLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkyY2VlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1R1dG9yaWFsTGluZWFyQWxnZWJyYS5kb3gKQEAgLTAsMCArMSwyNzIgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFR1dG9yaWFsTGluZWFyQWxnZWJyYSBMaW5lYXIgYWxnZWJyYSBhbmQgZGVjb21wb3NpdGlvbnMKKworVGhpcyBwYWdlIGV4cGxhaW5zIGhvdyB0byBzb2x2ZSBsaW5lYXIgc3lzdGVtcywgY29tcHV0ZSB2YXJpb3VzIGRlY29tcG9zaXRpb25zIHN1Y2ggYXMgTFUsCitRUiwgJVNWRCwgZWlnZW5kZWNvbXBvc2l0aW9ucy4uLiBBZnRlciByZWFkaW5nIHRoaXMgcGFnZSwgZG9uJ3QgbWlzcyBvdXIKK1xsaW5rIFRvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zIGNhdGFsb2d1ZSBcZW5kbGluayBvZiBkZW5zZSBtYXRyaXggZGVjb21wb3NpdGlvbnMuCisKK1xlaWdlbkF1dG9Ub2MKKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdCYXNpY1NvbHZlIEJhc2ljIGxpbmVhciBzb2x2aW5nCisKK1xiIFRoZSBcYiBwcm9ibGVtOiBZb3UgaGF2ZSBhIHN5c3RlbSBvZiBlcXVhdGlvbnMsIHRoYXQgeW91IGhhdmUgd3JpdHRlbiBhcyBhIHNpbmdsZSBtYXRyaXggZXF1YXRpb24KKyAgICBcZlsgQXggXDogPSBcOiBiIFxmXQorV2hlcmUgXGEgQSBhbmQgXGEgYiBhcmUgbWF0cmljZXMgKFxhIGIgY291bGQgYmUgYSB2ZWN0b3IsIGFzIGEgc3BlY2lhbCBjYXNlKS4gWW91IHdhbnQgdG8gZmluZCBhIHNvbHV0aW9uIFxhIHguCisKK1xiIFRoZSBcYiBzb2x1dGlvbjogWW91IGNhbiBjaG9vc2UgYmV0d2VlbiB2YXJpb3VzIGRlY29tcG9zaXRpb25zLCBkZXBlbmRpbmcgb24gd2hhdCB5b3VyIG1hdHJpeCBcYSBBIGxvb2tzIGxpa2UsCithbmQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGZhdm9yIHNwZWVkIG9yIGFjY3VyYWN5LiBIb3dldmVyLCBsZXQncyBzdGFydCB3aXRoIGFuIGV4YW1wbGUgdGhhdCB3b3JrcyBpbiBhbGwgY2FzZXMsCithbmQgaXMgYSBnb29kIGNvbXByb21pc2U6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ0V4U29sdmVDb2xQaXZIb3VzZWhvbGRlclFSLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworSW4gdGhpcyBleGFtcGxlLCB0aGUgY29sUGl2SG91c2Vob2xkZXJRcigpIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBvZiBjbGFzcyBDb2xQaXZIb3VzZWhvbGRlclFSLiBTaW5jZSBoZXJlIHRoZQorbWF0cml4IGlzIG9mIHR5cGUgTWF0cml4M2YsIHRoaXMgbGluZSBjb3VsZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnk6CitcY29kZQorQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXgzZj4gZGVjKEEpOworVmVjdG9yM2YgeCA9IGRlYy5zb2x2ZShiKTsKK1xlbmRjb2RlCisKK0hlcmUsIENvbFBpdkhvdXNlaG9sZGVyUVIgaXMgYSBRUiBkZWNvbXBvc2l0aW9uIHdpdGggY29sdW1uIHBpdm90aW5nLiBJdCdzIGEgZ29vZCBjb21wcm9taXNlIGZvciB0aGlzIHR1dG9yaWFsLCBhcyBpdAord29ya3MgZm9yIGFsbCBtYXRyaWNlcyB3aGlsZSBiZWluZyBxdWl0ZSBmYXN0LiBIZXJlIGlzIGEgdGFibGUgb2Ygc29tZSBvdGhlciBkZWNvbXBvc2l0aW9ucyB0aGF0IHlvdSBjYW4gY2hvb3NlIGZyb20sCitkZXBlbmRpbmcgb24geW91ciBtYXRyaXggYW5kIHRoZSB0cmFkZS1vZmYgeW91IHdhbnQgdG8gbWFrZToKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorICAgIDx0cj4KKyAgICAgICAgPHRoPkRlY29tcG9zaXRpb248L3RoPgorICAgICAgICA8dGg+TWV0aG9kPC90aD4KKyAgICAgICAgPHRoPlJlcXVpcmVtZW50czxici8+b24gdGhlIG1hdHJpeDwvdGg+CisgICAgICAgIDx0aD5TcGVlZDxici8+IChzbWFsbC10by1tZWRpdW0pPC90aD4KKyAgICAgICAgPHRoPlNwZWVkPGJyLz4gKGxhcmdlKTwvdGg+CisgICAgICAgIDx0aD5BY2N1cmFjeTwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5QYXJ0aWFsUGl2TFU8L3RkPgorICAgICAgICA8dGQ+cGFydGlhbFBpdkx1KCk8L3RkPgorICAgICAgICA8dGQ+SW52ZXJ0aWJsZTwvdGQ+CisgICAgICAgIDx0ZD4rKzwvdGQ+CisgICAgICAgIDx0ZD4rKzwvdGQ+CisgICAgICAgIDx0ZD4rPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkZ1bGxQaXZMVTwvdGQ+CisgICAgICAgIDx0ZD5mdWxsUGl2THUoKTwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LSAtPC90ZD4KKyAgICAgICAgPHRkPisrKzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5Ib3VzZWhvbGRlclFSPC90ZD4KKyAgICAgICAgPHRkPmhvdXNlaG9sZGVyUXIoKTwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPisrPC90ZD4KKyAgICAgICAgPHRkPisrPC90ZD4KKyAgICAgICAgPHRkPis8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+Q29sUGl2SG91c2Vob2xkZXJRUjwvdGQ+CisgICAgICAgIDx0ZD5jb2xQaXZIb3VzZWhvbGRlclFyKCk8L3RkPgorICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgIDx0ZD4rKzwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPisrKzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5GdWxsUGl2SG91c2Vob2xkZXJRUjwvdGQ+CisgICAgICAgIDx0ZD5mdWxsUGl2SG91c2Vob2xkZXJRcigpPC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD4tIC08L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkxMVDwvdGQ+CisgICAgICAgIDx0ZD5sbHQoKTwvdGQ+CisgICAgICAgIDx0ZD5Qb3NpdGl2ZSBkZWZpbml0ZTwvdGQ+CisgICAgICAgIDx0ZD4rKys8L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICAgICAgPHRkPis8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+TERMVDwvdGQ+CisgICAgICAgIDx0ZD5sZGx0KCk8L3RkPgorICAgICAgICA8dGQ+UG9zaXRpdmUgb3IgbmVnYXRpdmU8YnIvPiBzZW1pZGVmaW5pdGU8L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICAgICAgPHRkPis8L3RkPgorICAgICAgICA8dGQ+Kys8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+SmFjb2JpU1ZEPC90ZD4KKyAgICAgICAgPHRkPmphY29iaVN2ZCgpPC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+LSAtPC90ZD4KKyAgICAgICAgPHRkPi0gLSAtPC90ZD4KKyAgICAgICAgPHRkPisrKzwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKK0FsbCBvZiB0aGVzZSBkZWNvbXBvc2l0aW9ucyBvZmZlciBhIHNvbHZlKCkgbWV0aG9kIHRoYXQgd29ya3MgYXMgaW4gdGhlIGFib3ZlIGV4YW1wbGUuCisKK0ZvciBleGFtcGxlLCBpZiB5b3VyIG1hdHJpeCBpcyBwb3NpdGl2ZSBkZWZpbml0ZSwgdGhlIGFib3ZlIHRhYmxlIHNheXMgdGhhdCBhIHZlcnkgZ29vZAorY2hvaWNlIGlzIHRoZW4gdGhlIExMVCBvciBMRExUIGRlY29tcG9zaXRpb24uIEhlcmUncyBhbiBleGFtcGxlLCBhbHNvIGRlbW9uc3RyYXRpbmcgdGhhdCB1c2luZyBhIGdlbmVyYWwKK21hdHJpeCAobm90IGEgdmVjdG9yKSBhcyByaWdodCBoYW5kIHNpZGUgaXMgcG9zc2libGUuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIFR1dG9yaWFsTGluQWxnRXhTb2x2ZUxETFQuY3BwIDwvdGQ+CisgIDx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitGb3IgYSBccmVmIFRvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zICJtdWNoIG1vcmUgY29tcGxldGUgdGFibGUiIGNvbXBhcmluZyBhbGwgZGVjb21wb3NpdGlvbnMgc3VwcG9ydGVkIGJ5IEVpZ2VuIChub3RpY2UgdGhhdCBFaWdlbgorc3VwcG9ydHMgbWFueSBvdGhlciBkZWNvbXBvc2l0aW9ucyksIHNlZSBvdXIgc3BlY2lhbCBwYWdlIG9uCitccmVmIFRvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zICJ0aGlzIHRvcGljIi4KKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdTb2x1dGlvbkV4aXN0cyBDaGVja2luZyBpZiBhIHNvbHV0aW9uIHJlYWxseSBleGlzdHMKKworT25seSB5b3Uga25vdyB3aGF0IGVycm9yIG1hcmdpbiB5b3Ugd2FudCB0byBhbGxvdyBmb3IgYSBzb2x1dGlvbiB0byBiZSBjb25zaWRlcmVkIHZhbGlkLgorU28gRWlnZW4gbGV0cyB5b3UgZG8gdGhpcyBjb21wdXRhdGlvbiBmb3IgeW91cnNlbGYsIGlmIHlvdSB3YW50IHRvLCBhcyBpbiB0aGlzIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIFR1dG9yaWFsTGluQWxnRXhDb21wdXRlU29sdmVFcnJvci5jcHAgPC90ZD4KKyAgPHRkPlx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0V4Q29tcHV0ZVNvbHZlRXJyb3Iub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdFaWdlbnNvbHZpbmcgQ29tcHV0aW5nIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMKKworWW91IG5lZWQgYW4gZWlnZW5kZWNvbXBvc2l0aW9uIGhlcmUsIHNlZSBhdmFpbGFibGUgc3VjaCBkZWNvbXBvc2l0aW9ucyBvbiBccmVmIFRvcGljTGluZWFyQWxnZWJyYURlY29tcG9zaXRpb25zICJ0aGlzIHBhZ2UiLgorTWFrZSBzdXJlIHRvIGNoZWNrIGlmIHlvdXIgbWF0cml4IGlzIHNlbGYtYWRqb2ludCwgYXMgaXMgb2Z0ZW4gdGhlIGNhc2UgaW4gdGhlc2UgcHJvYmxlbXMuIEhlcmUncyBhbiBleGFtcGxlIHVzaW5nCitTZWxmQWRqb2ludEVpZ2VuU29sdmVyLCBpdCBjb3VsZCBlYXNpbHkgYmUgYWRhcHRlZCB0byBnZW5lcmFsIG1hdHJpY2VzIHVzaW5nIEVpZ2VuU29sdmVyIG9yIENvbXBsZXhFaWdlblNvbHZlci4KKworVGhlIGNvbXB1dGF0aW9uIG9mIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29udmVyZ2UsIGJ1dCBzdWNoIGZhaWx1cmUgdG8gY29udmVyZ2UgaXMKK3ZlcnkgcmFyZS4gVGhlIGNhbGwgdG8gaW5mbygpIGlzIHRvIGNoZWNrIGZvciB0aGlzIHBvc3NpYmlsaXR5LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwIDwvdGQ+CisgIDx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIFR1dG9yaWFsTGluQWxnSW52ZXJzZSBDb21wdXRpbmcgaW52ZXJzZSBhbmQgZGV0ZXJtaW5hbnQKKworRmlyc3Qgb2YgYWxsLCBtYWtlIHN1cmUgdGhhdCB5b3UgcmVhbGx5IHdhbnQgdGhpcy4gV2hpbGUgaW52ZXJzZSBhbmQgZGV0ZXJtaW5hbnQgYXJlIGZ1bmRhbWVudGFsIG1hdGhlbWF0aWNhbCBjb25jZXB0cywKK2luIFxlbSBudW1lcmljYWwgbGluZWFyIGFsZ2VicmEgdGhleSBhcmUgbm90IGFzIHBvcHVsYXIgYXMgaW4gcHVyZSBtYXRoZW1hdGljcy4gSW52ZXJzZSBjb21wdXRhdGlvbnMgYXJlIG9mdGVuCithZHZhbnRhZ2VvdXNseSByZXBsYWNlZCBieSBzb2x2ZSgpIG9wZXJhdGlvbnMsIGFuZCB0aGUgZGV0ZXJtaW5hbnQgaXMgb2Z0ZW4gXGVtIG5vdCBhIGdvb2Qgd2F5IG9mIGNoZWNraW5nIGlmIGEgbWF0cml4CitpcyBpbnZlcnRpYmxlLgorCitIb3dldmVyLCBmb3IgXGVtIHZlcnkgXGVtIHNtYWxsIG1hdHJpY2VzLCB0aGUgYWJvdmUgaXMgbm90IHRydWUsIGFuZCBpbnZlcnNlIGFuZCBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSB1c2VmdWwuCisKK1doaWxlIGNlcnRhaW4gZGVjb21wb3NpdGlvbnMsIHN1Y2ggYXMgUGFydGlhbFBpdkxVIGFuZCBGdWxsUGl2TFUsIG9mZmVyIGludmVyc2UoKSBhbmQgZGV0ZXJtaW5hbnQoKSBtZXRob2RzLCB5b3UgY2FuIGFsc28KK2NhbGwgaW52ZXJzZSgpIGFuZCBkZXRlcm1pbmFudCgpIGRpcmVjdGx5IG9uIGEgbWF0cml4LiBJZiB5b3VyIG1hdHJpeCBpcyBvZiBhIHZlcnkgc21hbGwgZml4ZWQgc2l6ZSAoYXQgbW9zdCA0eDQpIHRoaXMKK2FsbG93cyBFaWdlbiB0byBhdm9pZCBwZXJmb3JtaW5nIGEgTFUgZGVjb21wb3NpdGlvbiwgYW5kIGluc3RlYWQgdXNlIGZvcm11bGFzIHRoYXQgYXJlIG1vcmUgZWZmaWNpZW50IG9uIHN1Y2ggc21hbGwgbWF0cmljZXMuCisKK0hlcmUgaXMgYW4gZXhhbXBsZToKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIFR1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50Lm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIFR1dG9yaWFsTGluQWxnTGVhc3RzcXVhcmVzIExlYXN0IHNxdWFyZXMgc29sdmluZworCitUaGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgdG8gZG8gbGVhc3Qgc3F1YXJlcyBzb2x2aW5nIGlzIHdpdGggYSBTVkQgZGVjb21wb3NpdGlvbi4gRWlnZW4gcHJvdmlkZXMgb25lCithcyB0aGUgSmFjb2JpU1ZEIGNsYXNzLCBhbmQgaXRzIHNvbHZlKCkgaXMgZG9pbmcgbGVhc3Qtc3F1YXJlcyBzb2x2aW5nLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ1NWRFNvbHZlLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnU1ZEU29sdmUub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworQW5vdGhlciBtZXRob2RzLCBwb3RlbnRpYWxseSBmYXN0ZXIgYnV0IGxlc3MgcmVsaWFibGUsIGFyZSB0byB1c2UgYSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIHRoZQorbm9ybWFsIG1hdHJpeCBvciBhIFFSIGRlY29tcG9zaXRpb24uIE91ciBwYWdlIG9uIFxsaW5rIExlYXN0U3F1YXJlcyBsZWFzdCBzcXVhcmVzIHNvbHZpbmcgXGVuZGxpbmsKK2hhcyBtb3JlIGRldGFpbHMuCisKKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdTZXBhcmF0ZUNvbXB1dGF0aW9uIFNlcGFyYXRpbmcgdGhlIGNvbXB1dGF0aW9uIGZyb20gdGhlIGNvbnN0cnVjdGlvbgorCitJbiB0aGUgYWJvdmUgZXhhbXBsZXMsIHRoZSBkZWNvbXBvc2l0aW9uIHdhcyBjb21wdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgdGhlIGRlY29tcG9zaXRpb24gb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4KK1RoZXJlIGFyZSBob3dldmVyIHNpdHVhdGlvbnMgd2hlcmUgeW91IG1pZ2h0IHdhbnQgdG8gc2VwYXJhdGUgdGhlc2UgdHdvIHRoaW5ncywgZm9yIGV4YW1wbGUgaWYgeW91IGRvbid0IGtub3csCithdCB0aGUgdGltZSBvZiB0aGUgY29uc3RydWN0aW9uLCB0aGUgbWF0cml4IHRoYXQgeW91IHdpbGwgd2FudCB0byBkZWNvbXBvc2U7IG9yIGlmIHlvdSB3YW50IHRvIHJldXNlIGFuIGV4aXN0aW5nCitkZWNvbXBvc2l0aW9uIG9iamVjdC4KKworV2hhdCBtYWtlcyB0aGlzIHBvc3NpYmxlIGlzIHRoYXQ6CitcbGkgYWxsIGRlY29tcG9zaXRpb25zIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLAorXGxpIGFsbCBkZWNvbXBvc2l0aW9ucyBoYXZlIGEgY29tcHV0ZShtYXRyaXgpIG1ldGhvZCB0aGF0IGRvZXMgdGhlIGNvbXB1dGF0aW9uLCBhbmQgdGhhdCBtYXkgYmUgY2FsbGVkIGFnYWluCisgICAgb24gYW4gYWxyZWFkeS1jb21wdXRlZCBkZWNvbXBvc2l0aW9uLCByZWluaXRpYWxpemluZyBpdC4KKworRm9yIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIFR1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0ZpbmFsbHksIHlvdSBjYW4gdGVsbCB0aGUgZGVjb21wb3NpdGlvbiBjb25zdHJ1Y3RvciB0byBwcmVhbGxvY2F0ZSBzdG9yYWdlIGZvciBkZWNvbXBvc2luZyBtYXRyaWNlcyBvZiBhIGdpdmVuIHNpemUsCitzbyB0aGF0IHdoZW4geW91IHN1YnNlcXVlbnRseSBkZWNvbXBvc2Ugc3VjaCBtYXRyaWNlcywgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgKG9mIGNvdXJzZSwgaWYgeW91CithcmUgdXNpbmcgZml4ZWQtc2l6ZSBtYXRyaWNlcywgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBoYXBwZW5zIGF0IGFsbCkuIFRoaXMgaXMgZG9uZSBieSBqdXN0CitwYXNzaW5nIHRoZSBzaXplIHRvIHRoZSBkZWNvbXBvc2l0aW9uIGNvbnN0cnVjdG9yLCBhcyBpbiB0aGlzIGV4YW1wbGU6CitcY29kZQorSG91c2Vob2xkZXJRUjxNYXRyaXhYZj4gcXIoNTAsNTApOworTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNTAsNTApOworcXIuY29tcHV0ZShBKTsgLy8gbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbgorXGVuZGNvZGUKKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdSYW5rUmV2ZWFsaW5nIFJhbmstcmV2ZWFsaW5nIGRlY29tcG9zaXRpb25zCisKK0NlcnRhaW4gZGVjb21wb3NpdGlvbnMgYXJlIHJhbmstcmV2ZWFsaW5nLCBpLmUuIGFyZSBhYmxlIHRvIGNvbXB1dGUgdGhlIHJhbmsgb2YgYSBtYXRyaXguIFRoZXNlIGFyZSB0eXBpY2FsbHkKK2Fsc28gdGhlIGRlY29tcG9zaXRpb25zIHRoYXQgYmVoYXZlIGJlc3QgaW4gdGhlIGZhY2Ugb2YgYSBub24tZnVsbC1yYW5rIG1hdHJpeCAod2hpY2ggaW4gdGhlIHNxdWFyZSBjYXNlIG1lYW5zIGEKK3Npbmd1bGFyIG1hdHJpeCkuIE9uIFxyZWYgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMgInRoaXMgdGFibGUiIHlvdSBjYW4gc2VlIGZvciBhbGwgb3VyIGRlY29tcG9zaXRpb25zCit3aGV0aGVyIHRoZXkgYXJlIHJhbmstcmV2ZWFsaW5nIG9yIG5vdC4KKworUmFuay1yZXZlYWxpbmcgZGVjb21wb3NpdGlvbnMgb2ZmZXIgYXQgbGVhc3QgYSByYW5rKCkgbWV0aG9kLiBUaGV5IGNhbiBhbHNvIG9mZmVyIGNvbnZlbmllbmNlIG1ldGhvZHMgc3VjaCBhcyBpc0ludmVydGlibGUoKSwKK2FuZCBzb21lIGFyZSBhbHNvIHByb3ZpZGluZyBtZXRob2RzIHRvIGNvbXB1dGUgdGhlIGtlcm5lbCAobnVsbC1zcGFjZSkgYW5kIGltYWdlIChjb2x1bW4tc3BhY2UpIG9mIHRoZSBtYXRyaXgsIGFzIGlzIHRoZQorY2FzZSB3aXRoIEZ1bGxQaXZMVToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdSYW5rUmV2ZWFsaW5nLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitPZiBjb3Vyc2UsIGFueSByYW5rIGNvbXB1dGF0aW9uIGRlcGVuZHMgb24gdGhlIGNob2ljZSBvZiBhbiBhcmJpdHJhcnkgdGhyZXNob2xkLCBzaW5jZSBwcmFjdGljYWxseSBubworZmxvYXRpbmctcG9pbnQgbWF0cml4IGlzIFxlbSBleGFjdGx5IHJhbmstZGVmaWNpZW50LiBFaWdlbiBwaWNrcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhyZXNob2xkLCB3aGljaCBkZXBlbmRzCitvbiB0aGUgZGVjb21wb3NpdGlvbiBidXQgaXMgdHlwaWNhbGx5IHRoZSBkaWFnb25hbCBzaXplIHRpbWVzIG1hY2hpbmUgZXBzaWxvbi4gV2hpbGUgdGhpcyBpcyB0aGUgYmVzdCBkZWZhdWx0IHdlCitjb3VsZCBwaWNrLCBvbmx5IHlvdSBrbm93IHdoYXQgaXMgdGhlIHJpZ2h0IHRocmVzaG9sZCBmb3IgeW91ciBhcHBsaWNhdGlvbi4gWW91IGNhbiBzZXQgdGhpcyBieSBjYWxsaW5nIHNldFRocmVzaG9sZCgpCitvbiB5b3VyIGRlY29tcG9zaXRpb24gb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHJhbmsoKSBvciBhbnkgb3RoZXIgbWV0aG9kIHRoYXQgbmVlZHMgdG8gdXNlIHN1Y2ggYSB0aHJlc2hvbGQuCitUaGUgZGVjb21wb3NpdGlvbiBpdHNlbGYsIGkuZS4gdGhlIGNvbXB1dGUoKSBtZXRob2QsIGlzIGluZGVwZW5kZW50IG9mIHRoZSB0aHJlc2hvbGQuIFlvdSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUKK2RlY29tcG9zaXRpb24gYWZ0ZXIgeW91J3ZlIGNoYW5nZWQgdGhlIHRocmVzaG9sZC4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQuY3BwIDwvdGQ+CisgIDx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1R1dG9yaWFsTWFwQ2xhc3MuZG94IGIvZG9jL1R1dG9yaWFsTWFwQ2xhc3MuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmIwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVHV0b3JpYWxNYXBDbGFzcy5kb3gKQEAgLTAsMCArMSw4NiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVHV0b3JpYWxNYXBDbGFzcyBJbnRlcmZhY2luZyB3aXRoIHJhdyBidWZmZXJzOiB0aGUgTWFwIGNsYXNzCisKK1RoaXMgcGFnZSBleHBsYWlucyBob3cgdG8gd29yayB3aXRoICJyYXciIEMvQysrIGFycmF5cy4KK1RoaXMgY2FuIGJlIHVzZWZ1bCBpbiBhIHZhcmlldHkgb2YgY29udGV4dHMsIHBhcnRpY3VsYXJseSB3aGVuICJpbXBvcnRpbmciIHZlY3RvcnMgYW5kIG1hdHJpY2VzIGZyb20gb3RoZXIgbGlicmFyaWVzIGludG8gJUVpZ2VuLgorCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIFR1dG9yaWFsTWFwSW50cm9kdWN0aW9uIEludHJvZHVjdGlvbgorCitPY2Nhc2lvbmFsbHkgeW91IG1heSBoYXZlIGEgcHJlLWRlZmluZWQgYXJyYXkgb2YgbnVtYmVycyB0aGF0IHlvdSB3YW50IHRvIHVzZSB3aXRoaW4gJUVpZ2VuIGFzIGEgdmVjdG9yIG9yIG1hdHJpeC4gV2hpbGUgb25lIG9wdGlvbiBpcyB0byBtYWtlIGEgY29weSBvZiB0aGUgZGF0YSwgbW9zdCBjb21tb25seSB5b3UgcHJvYmFibHkgd2FudCB0byByZS11c2UgdGhpcyBtZW1vcnkgYXMgYW4gJUVpZ2VuIHR5cGUuIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIHZlcnkgZWFzeSB3aXRoIHRoZSBNYXAgY2xhc3MuCisKK1xzZWN0aW9uIFR1dG9yaWFsTWFwVHlwZXMgTWFwIHR5cGVzIGFuZCBkZWNsYXJpbmcgTWFwIHZhcmlhYmxlcworCitBIE1hcCBvYmplY3QgaGFzIGEgdHlwZSBkZWZpbmVkIGJ5IGl0cyAlRWlnZW4gZXF1aXZhbGVudDoKK1xjb2RlCitNYXA8TWF0cml4PHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3NBdENvbXBpbGVUaW1lLCBpbnQgQ29sc0F0Q29tcGlsZVRpbWU+ID4KK1xlbmRjb2RlCitOb3RlIHRoYXQsIGluIHRoaXMgZGVmYXVsdCBjYXNlLCBhIE1hcCByZXF1aXJlcyBqdXN0IGEgc2luZ2xlIHRlbXBsYXRlIHBhcmFtZXRlci4gIAorCitUbyBjb25zdHJ1Y3QgYSBNYXAgdmFyaWFibGUsIHlvdSBuZWVkIHR3byBvdGhlciBwaWVjZXMgb2YgaW5mb3JtYXRpb246IGEgcG9pbnRlciB0byB0aGUgcmVnaW9uIG9mIG1lbW9yeSBkZWZpbmluZyB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzLCBhbmQgdGhlIGRlc2lyZWQgc2hhcGUgb2YgdGhlIG1hdHJpeCBvciB2ZWN0b3IuICBGb3IgZXhhbXBsZSwgdG8gZGVmaW5lIGEgbWF0cml4IG9mIFxjIGZsb2F0IHdpdGggc2l6ZXMgZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUsIHlvdSBtaWdodCBkbyB0aGUgZm9sbG93aW5nOgorXGNvZGUKK01hcDxNYXRyaXhYZj4gbWYocGYscm93cyxjb2x1bW5zKTsKK1xlbmRjb2RlCit3aGVyZSBcYyBwZiBpcyBhIFxjIGZsb2F0IFxjICogcG9pbnRpbmcgdG8gdGhlIGFycmF5IG9mIG1lbW9yeS4gIEEgZml4ZWQtc2l6ZSByZWFkLW9ubHkgdmVjdG9yIG9mIGludGVnZXJzIG1pZ2h0IGJlIGRlY2xhcmVkIGFzCitcY29kZQorTWFwPGNvbnN0IFZlY3RvcjRpPiBtaShwaSk7CitcZW5kY29kZQord2hlcmUgXGMgcGkgaXMgYW4gXGMgaW50IFxjICouIEluIHRoaXMgY2FzZSB0aGUgc2l6ZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IsIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzcGVjaWZpZWQgYnkgdGhlIE1hdHJpeC9BcnJheSB0eXBlLgorCitOb3RlIHRoYXQgTWFwIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yOyB5b3UgXGVtIG11c3QgcGFzcyBhIHBvaW50ZXIgdG8gaW50aWFsaXplIHRoZSBvYmplY3QuIEhvd2V2ZXIsIHlvdSBjYW4gd29yayBhcm91bmQgdGhpcyByZXF1aXJlbWVudCAoc2VlIFxyZWYgVHV0b3JpYWxNYXBQbGFjZW1lbnROZXcpLgorCitNYXAgaXMgZmxleGlibGUgZW5vdWdoIHRvIGFjY29tb2RhdGUgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIHJlcHJlc2VudGF0aW9ucy4gIFRoZXJlIGFyZSB0d28gb3RoZXIgKG9wdGlvbmFsKSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzOgorXGNvZGUKK01hcDx0eXBlbmFtZSBNYXRyaXhUeXBlLAorICAgIGludCBNYXBPcHRpb25zLAorICAgIHR5cGVuYW1lIFN0cmlkZVR5cGU+CitcZW5kY29kZQorXGxpIFxjIE1hcE9wdGlvbnMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgXGMgI0FsaWduZWQsIG9yIFxjICNVbmFsaWduZWQuICBUaGUgZGVmYXVsdCBpcyBcYyAjVW5hbGlnbmVkLgorXGxpIFxjIFN0cmlkZVR5cGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgY3VzdG9tIGxheW91dCBmb3IgdGhlIG1lbW9yeSBhcnJheSwgdXNpbmcgdGhlIFN0cmlkZSBjbGFzcy4gIE9uZSBleGFtcGxlIHdvdWxkIGJlIHRvIHNwZWNpZnkgdGhhdCB0aGUgZGF0YSBhcnJheSBpcyBvcmdhbml6ZWQgaW4gcm93LW1ham9yIGZvcm1hdDoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKzx0ZD5caW5jbHVkZSBUdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsX01hcF9yb3dtYWpvci5vdXQgPC90ZD4KKzwvdGFibGU+CitIb3dldmVyLCBTdHJpZGUgaXMgZXZlbiBtb3JlIGZsZXhpYmxlIHRoYW4gdGhpczsgZm9yIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIE1hcCBhbmQgU3RyaWRlIGNsYXNzZXMuCisKK1xzZWN0aW9uIFR1dG9yaWFsTWFwVXNpbmcgVXNpbmcgTWFwIHZhcmlhYmxlcworCitZb3UgY2FuIHVzZSBhIE1hcCBvYmplY3QganVzdCBsaWtlIGFueSBvdGhlciAlRWlnZW4gdHlwZToKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKzx0ZD5caW5jbHVkZSBUdXRvcmlhbF9NYXBfdXNpbmcuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsX01hcF91c2luZy5vdXQgPC90ZD4KKzwvdGFibGU+CisKK0FsbCAlRWlnZW4gZnVuY3Rpb25zIGFyZSB3cml0dGVuIHRvIGFjY2VwdCBNYXAgb2JqZWN0cyBqdXN0IGxpa2Ugb3RoZXIgJUVpZ2VuIHR5cGVzLiBIb3dldmVyLCB3aGVuIHdyaXRpbmcgeW91ciBvd24gZnVuY3Rpb25zIHRha2luZyAlRWlnZW4gdHlwZXMsIHRoaXMgZG9lcyBcZW0gbm90IGhhcHBlbiBhdXRvbWF0aWNhbGx5OiBhIE1hcCB0eXBlIGlzIG5vdCBpZGVudGljYWwgdG8gaXRzIERlbnNlIGVxdWl2YWxlbnQuICBTZWUgXHJlZiBUb3BpY0Z1bmN0aW9uVGFraW5nRWlnZW5UeXBlcyBmb3IgZGV0YWlscy4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXBQbGFjZW1lbnROZXcgQ2hhbmdpbmcgdGhlIG1hcHBlZCBhcnJheQorCitJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGFycmF5IG9mIGEgTWFwIG9iamVjdCBhZnRlciBkZWNsYXJhdGlvbiwgdXNpbmcgdGhlIEMrKyAicGxhY2VtZW50IG5ldyIgc3ludGF4OgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorPHRkPlxpbmNsdWRlIE1hcF9wbGFjZW1lbnRfbmV3LmNwcCA8L3RkPgorPHRkPlx2ZXJiaW5jbHVkZSBNYXBfcGxhY2VtZW50X25ldy5vdXQgPC90ZD4KKzwvdGFibGU+CitEZXNwaXRlIGFwcGVhcmFuY2VzLCB0aGlzIGRvZXMgbm90IGludm9rZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgYmVjYXVzZSB0aGUgc3ludGF4IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gZm9yIHN0b3JpbmcgdGhlIHJlc3VsdC4KKworVGhpcyBzeW50YXggbWFrZXMgaXQgcG9zc2libGUgdG8gZGVjbGFyZSBhIE1hcCBvYmplY3Qgd2l0aG91dCBmaXJzdCBrbm93aW5nIHRoZSBtYXBwZWQgYXJyYXkncyBsb2NhdGlvbiBpbiBtZW1vcnk6CitcY29kZQorTWFwPE1hdHJpeDNmPiBBKE5VTEwpOyAgLy8gZG9uJ3QgdHJ5IHRvIHVzZSB0aGlzIG1hdHJpeCB5ZXQhCitWZWN0b3JYZiBiKG5fbWF0cmljZXMpOworZm9yIChpbnQgaSA9IDA7IGkgPCBuX21hdHJpY2VzOyBpKyspCit7CisgIG5ldyAoJkEpIE1hcDxNYXRyaXgzZj4oZ2V0X21hdHJpeF9wb2ludGVyKGkpKTsKKyAgYihpKSA9IEEudHJhY2UoKTsKK30KK1xlbmRjb2RlCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9UdXRvcmlhbE1hdHJpeEFyaXRobWV0aWMuZG94IGIvZG9jL1R1dG9yaWFsTWF0cml4QXJpdGhtZXRpYy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9UdXRvcmlhbE1hdHJpeEFyaXRobWV0aWMuZG94CkBAIC0wLDAgKzEsMjE0IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUdXRvcmlhbE1hdHJpeEFyaXRobWV0aWMgTWF0cml4IGFuZCB2ZWN0b3IgYXJpdGhtZXRpYworCitUaGlzIHBhZ2UgYWltcyB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IGFuZCBzb21lIGRldGFpbHMgb24gaG93IHRvIHBlcmZvcm0gYXJpdGhtZXRpYworYmV0d2VlbiBtYXRyaWNlcywgdmVjdG9ycyBhbmQgc2NhbGFycyB3aXRoIEVpZ2VuLgorCitcZWlnZW5BdXRvVG9jCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY0ludHJvZHVjdGlvbiBJbnRyb2R1Y3Rpb24KKworRWlnZW4gb2ZmZXJzIG1hdHJpeC92ZWN0b3IgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGVpdGhlciB0aHJvdWdoIG92ZXJsb2FkcyBvZiBjb21tb24gQysrIGFyaXRobWV0aWMgb3BlcmF0b3JzIHN1Y2ggYXMgKywgLSwgKiwKK29yIHRocm91Z2ggc3BlY2lhbCBtZXRob2RzIHN1Y2ggYXMgZG90KCksIGNyb3NzKCksIGV0Yy4KK0ZvciB0aGUgTWF0cml4IGNsYXNzIChtYXRyaWNlcyBhbmQgdmVjdG9ycyksIG9wZXJhdG9ycyBhcmUgb25seSBvdmVybG9hZGVkIHRvIHN1cHBvcnQKK2xpbmVhci1hbGdlYnJhaWMgb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIFxjIG1hdHJpeDEgXGMgKiBcYyBtYXRyaXgyIG1lYW5zIG1hdHJpeC1tYXRyaXggcHJvZHVjdCwKK2FuZCBcYyB2ZWN0b3IgXGMgKyBcYyBzY2FsYXIgaXMganVzdCBub3QgYWxsb3dlZC4gSWYgeW91IHdhbnQgdG8gcGVyZm9ybSBhbGwga2luZHMgb2YgYXJyYXkgb3BlcmF0aW9ucywKK25vdCBsaW5lYXIgYWxnZWJyYSwgc2VlIHRoZSBccmVmIFR1dG9yaWFsQXJyYXlDbGFzcyAibmV4dCBwYWdlIi4KKworXHNlY3Rpb24gVHV0b3JpYWxBcml0aG1ldGljQWRkU3ViIEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorCitUaGUgbGVmdCBoYW5kIHNpZGUgYW5kIHJpZ2h0IGhhbmQgc2lkZSBtdXN0LCBvZiBjb3Vyc2UsIGhhdmUgdGhlIHNhbWUgbnVtYmVycyBvZiByb3dzIGFuZCBvZiBjb2x1bW5zLiBUaGV5IG11c3QKK2Fsc28gaGF2ZSB0aGUgc2FtZSBcYyBTY2FsYXIgdHlwZSwgYXMgRWlnZW4gZG9lc24ndCBkbyBhdXRvbWF0aWMgdHlwZSBwcm9tb3Rpb24uIFRoZSBvcGVyYXRvcnMgYXQgaGFuZCBoZXJlIGFyZToKK1xsaSBiaW5hcnkgb3BlcmF0b3IgKyBhcyBpbiBcYyBhK2IKK1xsaSBiaW5hcnkgb3BlcmF0b3IgLSBhcyBpbiBcYyBhLWIKK1xsaSB1bmFyeSBvcGVyYXRvciAtIGFzIGluIFxjIC1hCitcbGkgY29tcG91bmQgb3BlcmF0b3IgKz0gYXMgaW4gXGMgYSs9YgorXGxpIGNvbXBvdW5kIG9wZXJhdG9yIC09IGFzIGluIFxjIGEtPWIKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX2FkZF9zdWIuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX2FkZF9zdWIub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworXHNlY3Rpb24gVHV0b3JpYWxBcml0aG1ldGljU2NhbGFyTXVsRGl2IFNjYWxhciBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24KKworTXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGJ5IGEgc2NhbGFyIGlzIHZlcnkgc2ltcGxlIHRvby4gVGhlIG9wZXJhdG9ycyBhdCBoYW5kIGhlcmUgYXJlOgorXGxpIGJpbmFyeSBvcGVyYXRvciAqIGFzIGluIFxjIG1hdHJpeCpzY2FsYXIKK1xsaSBiaW5hcnkgb3BlcmF0b3IgKiBhcyBpbiBcYyBzY2FsYXIqbWF0cml4CitcbGkgYmluYXJ5IG9wZXJhdG9yIC8gYXMgaW4gXGMgbWF0cml4L3NjYWxhcgorXGxpIGNvbXBvdW5kIG9wZXJhdG9yICo9IGFzIGluIFxjIG1hdHJpeCo9c2NhbGFyCitcbGkgY29tcG91bmQgb3BlcmF0b3IgLz0gYXMgaW4gXGMgbWF0cml4Lz1zY2FsYXIKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX3NjYWxhcl9tdWxfZGl2LmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY01lbnRpb25YcHJUZW1wbGF0ZXMgQSBub3RlIGFib3V0IGV4cHJlc3Npb24gdGVtcGxhdGVzCisKK1RoaXMgaXMgYW4gYWR2YW5jZWQgdG9waWMgdGhhdCB3ZSBleHBsYWluIG9uIFxyZWYgVG9waWNFaWdlbkV4cHJlc3Npb25UZW1wbGF0ZXMgInRoaXMgcGFnZSIsCitidXQgaXQgaXMgdXNlZnVsIHRvIGp1c3QgbWVudGlvbiBpdCBub3cuIEluIEVpZ2VuLCBhcml0aG1ldGljIG9wZXJhdG9ycyBzdWNoIGFzIFxjIG9wZXJhdG9yKyBkb24ndAorcGVyZm9ybSBhbnkgY29tcHV0YXRpb24gYnkgdGhlbXNlbHZlcywgdGhleSBqdXN0IHJldHVybiBhbiAiZXhwcmVzc2lvbiBvYmplY3QiIGRlc2NyaWJpbmcgdGhlIGNvbXB1dGF0aW9uIHRvIGJlCitwZXJmb3JtZWQuIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gaGFwcGVucyBsYXRlciwgd2hlbiB0aGUgd2hvbGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIHR5cGljYWxseSBpbiBcYyBvcGVyYXRvcj0uCitXaGlsZSB0aGlzIG1pZ2h0IHNvdW5kIGhlYXZ5LCBhbnkgbW9kZXJuIG9wdGltaXppbmcgY29tcGlsZXIgaXMgYWJsZSB0byBvcHRpbWl6ZSBhd2F5IHRoYXQgYWJzdHJhY3Rpb24gYW5kCit0aGUgcmVzdWx0IGlzIHBlcmZlY3RseSBvcHRpbWl6ZWQgY29kZS4gRm9yIGV4YW1wbGUsIHdoZW4geW91IGRvOgorXGNvZGUKK1ZlY3RvclhmIGEoNTApLCBiKDUwKSwgYyg1MCksIGQoNTApOworLi4uCithID0gMypiICsgNCpjICsgNSpkOworXGVuZGNvZGUKK0VpZ2VuIGNvbXBpbGVzIGl0IHRvIGp1c3Qgb25lIGZvciBsb29wLCBzbyB0aGF0IHRoZSBhcnJheXMgYXJlIHRyYXZlcnNlZCBvbmx5IG9uY2UuIFNpbXBsaWZ5aW5nIChlLmcuIGlnbm9yaW5nCitTSU1EIG9wdGltaXphdGlvbnMpLCB0aGlzIGxvb3AgbG9va3MgbGlrZSB0aGlzOgorXGNvZGUKK2ZvcihpbnQgaSA9IDA7IGkgPCA1MDsgKytpKQorICBhW2ldID0gMypiW2ldICsgNCpjW2ldICsgNSpkW2ldOworXGVuZGNvZGUKK1RodXMsIHlvdSBzaG91bGQgbm90IGJlIGFmcmFpZCBvZiB1c2luZyByZWxhdGl2ZWx5IGxhcmdlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgd2l0aCBFaWdlbjogaXQgb25seSBnaXZlcyBFaWdlbgorbW9yZSBvcHBvcnR1bml0aWVzIGZvciBvcHRpbWl6YXRpb24uCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY1RyYW5zcG9zZSBUcmFuc3Bvc2l0aW9uIGFuZCBjb25qdWdhdGlvbgorCitUaGUgdHJhbnNwb3NlIFxmJCBhXlQgXGYkLCBjb25qdWdhdGUgXGYkIFxiYXJ7YX0gXGYkLCBhbmQgYWRqb2ludCAoaS5lLiwgY29uanVnYXRlIHRyYW5zcG9zZSkgXGYkIGFeKiBcZiQgb2YgYSBtYXRyaXggb3IgdmVjdG9yIFxmJCBhIFxmJCBhcmUgb2J0YWluZWQgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgXGxpbmsgRGVuc2VCYXNlOjp0cmFuc3Bvc2UoKSB0cmFuc3Bvc2UoKVxlbmRsaW5rLCBcbGluayBNYXRyaXhCYXNlOjpjb25qdWdhdGUoKSBjb25qdWdhdGUoKVxlbmRsaW5rLCBhbmQgXGxpbmsgTWF0cml4QmFzZTo6YWRqb2ludCgpIGFkam9pbnQoKVxlbmRsaW5rLCByZXNwZWN0aXZlbHkuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0ZvciByZWFsIG1hdHJpY2VzLCBcYyBjb25qdWdhdGUoKSBpcyBhIG5vLW9wZXJhdGlvbiwgYW5kIHNvIFxjIGFkam9pbnQoKSBpcyBlcXVpdmFsZW50IHRvIFxjIHRyYW5zcG9zZSgpLgorCitBcyBmb3IgYmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIFxjIHRyYW5zcG9zZSgpIGFuZCBcYyBhZGpvaW50KCkgc2ltcGx5IHJldHVybiBhIHByb3h5IG9iamVjdCB3aXRob3V0IGRvaW5nIHRoZSBhY3R1YWwgdHJhbnNwb3NpdGlvbi4gSWYgeW91IGRvIDx0dD5iID0gYS50cmFuc3Bvc2UoKTwvdHQ+LCB0aGVuIHRoZSB0cmFuc3Bvc2UgaXMgZXZhbHVhdGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGludG8gXGMgYi4gSG93ZXZlciwgdGhlcmUgaXMgYSBjb21wbGljYXRpb24gaGVyZS4gSWYgeW91IGRvIDx0dD5hID0gYS50cmFuc3Bvc2UoKTwvdHQ+LCB0aGVuIEVpZ2VuIHN0YXJ0cyB3cml0aW5nIHRoZSByZXN1bHQgaW50byBcYyBhIGJlZm9yZSB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgdHJhbnNwb3NlIGlzIGZpbmlzaGVkLiBUaGVyZWZvcmUsIHRoZSBpbnN0cnVjdGlvbiA8dHQ+YSA9IGEudHJhbnNwb3NlKCk8L3R0PiBkb2VzIG5vdCByZXBsYWNlIFxjIGEgd2l0aCBpdHMgdHJhbnNwb3NlLCBhcyBvbmUgd291bGQgZXhwZWN0OgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLm91dAorPC90ZD48L3RyPjwvdGFibGU+CitUaGlzIGlzIHRoZSBzby1jYWxsZWQgXHJlZiBUb3BpY0FsaWFzaW5nICJhbGlhc2luZyBpc3N1ZSIuIEluICJkZWJ1ZyBtb2RlIiwgaS5lLiwgd2hlbiBccmVmIFRvcGljQXNzZXJ0aW9ucyAiYXNzZXJ0aW9ucyIgaGF2ZSBub3QgYmVlbiBkaXNhYmxlZCwgc3VjaCBjb21tb24gcGl0ZmFsbHMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuIAorCitGb3IgXGVtIGluLXBsYWNlIHRyYW5zcG9zaXRpb24sIGFzIGZvciBpbnN0YW5jZSBpbiA8dHQ+YSA9IGEudHJhbnNwb3NlKCk8L3R0Piwgc2ltcGx5IHVzZSB0aGUgXGxpbmsgRGVuc2VCYXNlOjp0cmFuc3Bvc2VJblBsYWNlKCkgdHJhbnNwb3NlSW5QbGFjZSgpXGVuZGxpbmsgIGZ1bmN0aW9uOgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfaW5wbGFjZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorVGhlcmUgaXMgYWxzbyB0aGUgXGxpbmsgTWF0cml4QmFzZTo6YWRqb2ludEluUGxhY2UoKSBhZGpvaW50SW5QbGFjZSgpXGVuZGxpbmsgZnVuY3Rpb24gZm9yIGNvbXBsZXggbWF0cmljZXMuCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY01hdHJpeE11bCBNYXRyaXgtbWF0cml4IGFuZCBtYXRyaXgtdmVjdG9yIG11bHRpcGxpY2F0aW9uCisKK01hdHJpeC1tYXRyaXggbXVsdGlwbGljYXRpb24gaXMgYWdhaW4gZG9uZSB3aXRoIFxjIG9wZXJhdG9yKi4gU2luY2UgdmVjdG9ycyBhcmUgYSBzcGVjaWFsCitjYXNlIG9mIG1hdHJpY2VzLCB0aGV5IGFyZSBpbXBsaWNpdGx5IGhhbmRsZWQgdGhlcmUgdG9vLCBzbyBtYXRyaXgtdmVjdG9yIHByb2R1Y3QgaXMgcmVhbGx5IGp1c3QgYSBzcGVjaWFsCitjYXNlIG9mIG1hdHJpeC1tYXRyaXggcHJvZHVjdCwgYW5kIHNvIGlzIHZlY3Rvci12ZWN0b3Igb3V0ZXIgcHJvZHVjdC4gVGh1cywgYWxsIHRoZXNlIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IGp1c3QKK3R3byBvcGVyYXRvcnM6CitcbGkgYmluYXJ5IG9wZXJhdG9yICogYXMgaW4gXGMgYSpiCitcbGkgY29tcG91bmQgb3BlcmF0b3IgKj0gYXMgaW4gXGMgYSo9YiAodGhpcyBtdWx0aXBsaWVzIG9uIHRoZSByaWdodDogXGMgYSo9YiBpcyBlcXVpdmFsZW50IHRvIDx0dD5hID0gYSpiPC90dD4pCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK05vdGU6IGlmIHlvdSByZWFkIHRoZSBhYm92ZSBwYXJhZ3JhcGggb24gZXhwcmVzc2lvbiB0ZW1wbGF0ZXMgYW5kIGFyZSB3b3JyaWVkIHRoYXQgZG9pbmcgXGMgbT1tKm0gbWlnaHQgY2F1c2UKK2FsaWFzaW5nIGlzc3VlcywgYmUgcmVhc3N1cmVkIGZvciBub3c6IEVpZ2VuIHRyZWF0cyBtYXRyaXggbXVsdGlwbGljYXRpb24gYXMgYSBzcGVjaWFsIGNhc2UgYW5kIHRha2VzIGNhcmUgb2YKK2ludHJvZHVjaW5nIGEgdGVtcG9yYXJ5IGhlcmUsIHNvIGl0IHdpbGwgY29tcGlsZSBcYyBtPW0qbSBhczoKK1xjb2RlCit0bXAgPSBtKm07CittID0gdG1wOworXGVuZGNvZGUKK0lmIHlvdSBrbm93IHlvdXIgbWF0cml4IHByb2R1Y3QgY2FuIGJlIHNhZmVseSBldmFsdWF0ZWQgaW50byB0aGUgZGVzdGluYXRpb24gbWF0cml4IHdpdGhvdXQgYWxpYXNpbmcgaXNzdWUsIHRoZW4geW91IGNhbiB1c2UgdGhlIFxsaW5rIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSBub2FsaWFzKClcZW5kbGluayBmdW5jdGlvbiB0byBhdm9pZCB0aGUgdGVtcG9yYXJ5LCBlLmcuOgorXGNvZGUKK2Mubm9hbGlhcygpICs9IGEgKiBiOworXGVuZGNvZGUKK0ZvciBtb3JlIGRldGFpbHMgb24gdGhpcyB0b3BpYywgc2VlIHRoZSBwYWdlIG9uIFxyZWYgVG9waWNBbGlhc2luZyAiYWxpYXNpbmciLgorCitcYiBOb3RlOiBmb3IgQkxBUyB1c2VycyB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBleHByZXNzaW9ucyBzdWNoIGFzIDx0dD5jLm5vYWxpYXMoKSAtPSAyICogYS5hZGpvaW50KCkgKiBiOzwvdHQ+IGFyZSBmdWxseSBvcHRpbWl6ZWQgYW5kIHRyaWdnZXIgYSBzaW5nbGUgZ2VtbS1saWtlIGZ1bmN0aW9uIGNhbGwuCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY0RvdEFuZENyb3NzIERvdCBwcm9kdWN0IGFuZCBjcm9zcyBwcm9kdWN0CisKK0ZvciBkb3QgcHJvZHVjdCBhbmQgY3Jvc3MgcHJvZHVjdCwgeW91IG5lZWQgdGhlIFxsaW5rIE1hdHJpeEJhc2U6OmRvdCgpIGRvdCgpXGVuZGxpbmsgYW5kIFxsaW5rIE1hdHJpeEJhc2U6OmNyb3NzKCkgY3Jvc3MoKVxlbmRsaW5rIG1ldGhvZHMuIE9mIGNvdXJzZSwgdGhlIGRvdCBwcm9kdWN0IGNhbiBhbHNvIGJlIG9idGFpbmVkIGFzIGEgMXgxIG1hdHJpeCBhcyB1LmFkam9pbnQoKSp2LgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfZG90X2Nyb3NzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1JlbWVtYmVyIHRoYXQgY3Jvc3MgcHJvZHVjdCBpcyBvbmx5IGZvciB2ZWN0b3JzIG9mIHNpemUgMy4gRG90IHByb2R1Y3QgaXMgZm9yIHZlY3RvcnMgb2YgYW55IHNpemVzLgorV2hlbiB1c2luZyBjb21wbGV4IG51bWJlcnMsIEVpZ2VuJ3MgZG90IHByb2R1Y3QgaXMgY29uanVnYXRlLWxpbmVhciBpbiB0aGUgZmlyc3QgdmFyaWFibGUgYW5kIGxpbmVhciBpbiB0aGUKK3NlY29uZCB2YXJpYWJsZS4KKworXHNlY3Rpb24gVHV0b3JpYWxBcml0aG1ldGljUmVkdXggQmFzaWMgYXJpdGhtZXRpYyByZWR1Y3Rpb24gb3BlcmF0aW9ucworRWlnZW4gYWxzbyBwcm92aWRlcyBzb21lIHJlZHVjdGlvbiBvcGVyYXRpb25zIHRvIHJlZHVjZSBhIGdpdmVuIG1hdHJpeCBvciB2ZWN0b3IgdG8gYSBzaW5nbGUgdmFsdWUgc3VjaCBhcyB0aGUgc3VtIChjb21wdXRlZCBieSBcbGluayBEZW5zZUJhc2U6OnN1bSgpIHN1bSgpXGVuZGxpbmspLCBwcm9kdWN0IChcbGluayBEZW5zZUJhc2U6OnByb2QoKSBwcm9kKClcZW5kbGluayksIG9yIHRoZSBtYXhpbXVtIChcbGluayBEZW5zZUJhc2U6Om1heENvZWZmKCkgbWF4Q29lZmYoKVxlbmRsaW5rKSBhbmQgbWluaW11bSAoXGxpbmsgRGVuc2VCYXNlOjptaW5Db2VmZigpIG1pbkNvZWZmKClcZW5kbGluaykgb2YgYWxsIGl0cyBjb2VmZmljaWVudHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19yZWR1eF9iYXNpYy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhlIFxlbSB0cmFjZSBvZiBhIG1hdHJpeCwgYXMgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uIFxsaW5rIE1hdHJpeEJhc2U6OnRyYWNlKCkgdHJhY2UoKVxlbmRsaW5rLCBpcyB0aGUgc3VtIG9mIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMgYW5kIGNhbiBhbHNvIGJlIGNvbXB1dGVkIGFzIGVmZmljaWVudGx5IHVzaW5nIDx0dD5hLmRpYWdvbmFsKCkuc3VtKCk8L3R0PiwgYXMgd2Ugd2lsbCBzZWUgbGF0ZXIgb24uCisKK1RoZXJlIGFsc28gZXhpc3QgdmFyaWFudHMgb2YgdGhlIFxjIG1pbkNvZWZmIGFuZCBcYyBtYXhDb2VmZiBmdW5jdGlvbnMgcmV0dXJuaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcmVzcGVjdGl2ZSBjb2VmZmljaWVudCB2aWEgdGhlIGFyZ3VtZW50czoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIHR1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4Lm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKKworXHNlY3Rpb24gVHV0b3JpYWxBcml0aG1ldGljVmFsaWRpdHkgVmFsaWRpdHkgb2Ygb3BlcmF0aW9ucworRWlnZW4gY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgb3BlcmF0aW9ucyB0aGF0IHlvdSBwZXJmb3JtLiBXaGVuIHBvc3NpYmxlLAoraXQgY2hlY2tzIHRoZW0gYXQgY29tcGlsZSB0aW1lLCBwcm9kdWNpbmcgY29tcGlsYXRpb24gZXJyb3JzLiBUaGVzZSBlcnJvciBtZXNzYWdlcyBjYW4gYmUgbG9uZyBhbmQgdWdseSwKK2J1dCBFaWdlbiB3cml0ZXMgdGhlIGltcG9ydGFudCBtZXNzYWdlIGluIFVQUEVSQ0FTRV9MRVRURVJTX1NPX0lUX1NUQU5EU19PVVQuIEZvciBleGFtcGxlOgorXGNvZGUKKyAgTWF0cml4M2YgbTsKKyAgVmVjdG9yNGYgdjsKKyAgdiA9IG0qdjsgICAgICAvLyBDb21waWxlLXRpbWUgZXJyb3I6IFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMKK1xlbmRjb2RlCisKK09mIGNvdXJzZSwgaW4gbWFueSBjYXNlcywgZm9yIGV4YW1wbGUgd2hlbiBjaGVja2luZyBkeW5hbWljIHNpemVzLCB0aGUgY2hlY2sgY2Fubm90IGJlIHBlcmZvcm1lZCBhdCBjb21waWxlIHRpbWUuCitFaWdlbiB0aGVuIHVzZXMgcnVudGltZSBhc3NlcnRpb25zLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gd2lsbCBhYm9ydCB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBleGVjdXRpbmcgYW4gaWxsZWdhbCBvcGVyYXRpb24gaWYgaXQgaXMgcnVuIGluICJkZWJ1ZyBtb2RlIiwgYW5kIGl0IHdpbGwgcHJvYmFibHkgY3Jhc2ggaWYgYXNzZXJ0aW9ucyBhcmUgdHVybmVkIG9mZi4KKworXGNvZGUKKyAgTWF0cml4WGYgbSgzLDMpOworICBWZWN0b3JYZiB2KDQpOworICB2ID0gbSAqIHY7IC8vIFJ1bi10aW1lIGFzc2VydGlvbiBmYWlsdXJlIGhlcmU6ICJpbnZhbGlkIG1hdHJpeCBwcm9kdWN0IgorXGVuZGNvZGUKKworRm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHRvcGljLCBzZWUgXHJlZiBUb3BpY0Fzc2VydGlvbnMgInRoaXMgcGFnZSIuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9UdXRvcmlhbE1hdHJpeENsYXNzLmRveCBiL2RvYy9UdXRvcmlhbE1hdHJpeENsYXNzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWEwY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1R1dG9yaWFsTWF0cml4Q2xhc3MuZG94CkBAIC0wLDAgKzEsMjY1IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUdXRvcmlhbE1hdHJpeENsYXNzIFRoZSBNYXRyaXggY2xhc3MKKworXGVpZ2VuQXV0b1RvYworCitJbiBFaWdlbiwgYWxsIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIGFyZSBvYmplY3RzIG9mIHRoZSBNYXRyaXggdGVtcGxhdGUgY2xhc3MuCitWZWN0b3JzIGFyZSBqdXN0IGEgc3BlY2lhbCBjYXNlIG9mIG1hdHJpY2VzLCB3aXRoIGVpdGhlciAxIHJvdyBvciAxIGNvbHVtbi4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhGaXJzdDNQYXJhbXMgVGhlIGZpcnN0IHRocmVlIHRlbXBsYXRlIHBhcmFtZXRlcnMgb2YgTWF0cml4CisKK1RoZSBNYXRyaXggY2xhc3MgdGFrZXMgc2l4IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGJ1dCBmb3Igbm93IGl0J3MgZW5vdWdoIHRvCitsZWFybiBhYm91dCB0aGUgZmlyc3QgdGhyZWUgZmlyc3QgcGFyYW1ldGVycy4gVGhlIHRocmVlIHJlbWFpbmluZyBwYXJhbWV0ZXJzIGhhdmUgZGVmYXVsdAordmFsdWVzLCB3aGljaCBmb3Igbm93IHdlIHdpbGwgbGVhdmUgdW50b3VjaGVkLCBhbmQgd2hpY2ggd2UKK1xyZWYgVHV0b3JpYWxNYXRyaXhPcHRUZW1wbFBhcmFtcyAiZGlzY3VzcyBiZWxvdyIuCisKK1RoZSB0aHJlZSBtYW5kYXRvcnkgdGVtcGxhdGUgcGFyYW1ldGVycyBvZiBNYXRyaXggYXJlOgorXGNvZGUKK01hdHJpeDx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzQXRDb21waWxlVGltZSwgaW50IENvbHNBdENvbXBpbGVUaW1lPgorXGVuZGNvZGUKK1xsaSBcYyBTY2FsYXIgaXMgdGhlIHNjYWxhciB0eXBlLCBpLmUuIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMuCisgICAgVGhhdCBpcywgaWYgeW91IHdhbnQgYSBtYXRyaXggb2YgZmxvYXRzLCBjaG9vc2UgXGMgZmxvYXQgaGVyZS4KKyAgICBTZWUgXHJlZiBUb3BpY1NjYWxhclR5cGVzICJTY2FsYXIgdHlwZXMiIGZvciBhIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZAorICAgIHNjYWxhciB0eXBlcyBhbmQgZm9yIGhvdyB0byBleHRlbmQgc3VwcG9ydCB0byBuZXcgdHlwZXMuCitcbGkgXGMgUm93c0F0Q29tcGlsZVRpbWUgYW5kIFxjIENvbHNBdENvbXBpbGVUaW1lIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MKKyAgICBhbmQgY29sdW1ucyBvZiB0aGUgbWF0cml4IGFzIGtub3duIGF0IGNvbXBpbGUgdGltZSAoc2VlIAorICAgIFxyZWYgVHV0b3JpYWxNYXRyaXhEeW5hbWljICJiZWxvdyIgZm9yIHdoYXQgdG8gZG8gaWYgdGhlIG51bWJlciBpcyBub3QKKyAgICBrbm93biBhdCBjb21waWxlIHRpbWUpLgorCitXZSBvZmZlciBhIGxvdCBvZiBjb252ZW5pZW5jZSB0eXBlZGVmcyB0byBjb3ZlciB0aGUgdXN1YWwgY2FzZXMuIEZvciBleGFtcGxlLCBcYyBNYXRyaXg0ZiBpcworYSA0eDQgbWF0cml4IG9mIGZsb2F0cy4gSGVyZSBpcyBob3cgaXQgaXMgZGVmaW5lZCBieSBFaWdlbjoKK1xjb2RlCit0eXBlZGVmIE1hdHJpeDxmbG9hdCwgNCwgND4gTWF0cml4NGY7CitcZW5kY29kZQorV2UgZGlzY3VzcyBccmVmIFR1dG9yaWFsTWF0cml4VHlwZWRlZnMgImJlbG93IiB0aGVzZSBjb252ZW5pZW5jZSB0eXBlZGVmcy4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhWZWN0b3JzIFZlY3RvcnMKKworQXMgbWVudGlvbmVkIGFib3ZlLCBpbiBFaWdlbiwgdmVjdG9ycyBhcmUganVzdCBhIHNwZWNpYWwgY2FzZSBvZgorbWF0cmljZXMsIHdpdGggZWl0aGVyIDEgcm93IG9yIDEgY29sdW1uLiBUaGUgY2FzZSB3aGVyZSB0aGV5IGhhdmUgMSBjb2x1bW4gaXMgdGhlIG1vc3QgY29tbW9uOworc3VjaCB2ZWN0b3JzIGFyZSBjYWxsZWQgY29sdW1uLXZlY3RvcnMsIG9mdGVuIGFiYnJldmlhdGVkIGFzIGp1c3QgdmVjdG9ycy4gSW4gdGhlIG90aGVyIGNhc2UKK3doZXJlIHRoZXkgaGF2ZSAxIHJvdywgdGhleSBhcmUgY2FsbGVkIHJvdy12ZWN0b3JzLgorCitGb3IgZXhhbXBsZSwgdGhlIGNvbnZlbmllbmNlIHR5cGVkZWYgXGMgVmVjdG9yM2YgaXMgYSAoY29sdW1uKSB2ZWN0b3Igb2YgMyBmbG9hdHMuIEl0IGlzIGRlZmluZWQgYXMgZm9sbG93cyBieSBFaWdlbjoKK1xjb2RlCit0eXBlZGVmIE1hdHJpeDxmbG9hdCwgMywgMT4gVmVjdG9yM2Y7CitcZW5kY29kZQorV2UgYWxzbyBvZmZlciBjb252ZW5pZW5jZSB0eXBlZGVmcyBmb3Igcm93LXZlY3RvcnMsIGZvciBleGFtcGxlOgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PGludCwgMSwgMj4gUm93VmVjdG9yMmk7CitcZW5kY29kZQorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeER5bmFtaWMgVGhlIHNwZWNpYWwgdmFsdWUgRHluYW1pYworCitPZiBjb3Vyc2UsIEVpZ2VuIGlzIG5vdCBsaW1pdGVkIHRvIG1hdHJpY2VzIHdob3NlIGRpbWVuc2lvbnMgYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZS4KK1RoZSBcYyBSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgQ29sc0F0Q29tcGlsZVRpbWUgdGVtcGxhdGUgcGFyYW1ldGVycyBjYW4gdGFrZSB0aGUgc3BlY2lhbAordmFsdWUgXGMgRHluYW1pYyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2l6ZSBpcyB1bmtub3duIGF0IGNvbXBpbGUgdGltZSwgc28gbXVzdAorYmUgaGFuZGxlZCBhcyBhIHJ1bi10aW1lIHZhcmlhYmxlLiBJbiBFaWdlbiB0ZXJtaW5vbG9neSwgc3VjaCBhIHNpemUgaXMgcmVmZXJyZWQgdG8gYXMgYQorXGVtIGR5bmFtaWMgXGVtIHNpemU7IHdoaWxlIGEgc2l6ZSB0aGF0IGlzIGtub3duIGF0IGNvbXBpbGUgdGltZSBpcyBjYWxsZWQgYQorXGVtIGZpeGVkIFxlbSBzaXplLiBGb3IgZXhhbXBsZSwgdGhlIGNvbnZlbmllbmNlIHR5cGVkZWYgXGMgTWF0cml4WGQsIG1lYW5pbmcKK2EgbWF0cml4IG9mIGRvdWJsZXMgd2l0aCBkeW5hbWljIHNpemUsIGlzIGRlZmluZWQgYXMgZm9sbG93czoKK1xjb2RlCit0eXBlZGVmIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFhkOworXGVuZGNvZGUKK0FuZCBzaW1pbGFybHksIHdlIGRlZmluZSBhIHNlbGYtZXhwbGFuYXRvcnkgdHlwZWRlZiBcYyBWZWN0b3JYaSBhcyBmb2xsb3dzOgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PGludCwgRHluYW1pYywgMT4gVmVjdG9yWGk7CitcZW5kY29kZQorWW91IGNhbiBwZXJmZWN0bHkgaGF2ZSBlLmcuIGEgZml4ZWQgbnVtYmVyIG9mIHJvd3Mgd2l0aCBhIGR5bmFtaWMgbnVtYmVyIG9mIGNvbHVtbnMsIGFzIGluOgorXGNvZGUKK01hdHJpeDxmbG9hdCwgMywgRHluYW1pYz4KK1xlbmRjb2RlCisKK1xzZWN0aW9uIFR1dG9yaWFsTWF0cml4Q29uc3RydWN0b3JzIENvbnN0cnVjdG9ycworCitBIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgYWx3YXlzIGF2YWlsYWJsZSwgbmV2ZXIgcGVyZm9ybXMgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24sIGFuZCBuZXZlciBpbml0aWFsaXplcyB0aGUgbWF0cml4IGNvZWZmaWNpZW50cy4gWW91IGNhbiBkbzoKK1xjb2RlCitNYXRyaXgzZiBhOworTWF0cml4WGYgYjsKK1xlbmRjb2RlCitIZXJlLAorXGxpIFxjIGEgaXMgYSAzLWJ5LTMgbWF0cml4LCB3aXRoIGEgcGxhaW4gZmxvYXRbOV0gYXJyYXkgb2YgdW5pbml0aWFsaXplZCBjb2VmZmljaWVudHMsCitcbGkgXGMgYiBpcyBhIGR5bmFtaWMtc2l6ZSBtYXRyaXggd2hvc2Ugc2l6ZSBpcyBjdXJyZW50bHkgMC1ieS0wLCBhbmQgd2hvc2UgYXJyYXkgb2YKK2NvZWZmaWNpZW50cyBoYXNuJ3QgeWV0IGJlZW4gYWxsb2NhdGVkIGF0IGFsbC4KKworQ29uc3RydWN0b3JzIHRha2luZyBzaXplcyBhcmUgYWxzbyBhdmFpbGFibGUuIEZvciBtYXRyaWNlcywgdGhlIG51bWJlciBvZiByb3dzIGlzIGFsd2F5cyBwYXNzZWQgZmlyc3QuCitGb3IgdmVjdG9ycywganVzdCBwYXNzIHRoZSB2ZWN0b3Igc2l6ZS4gVGhleSBhbGxvY2F0ZSB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzCit3aXRoIHRoZSBnaXZlbiBzaXplLCBidXQgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgY29lZmZpY2llbnRzIHRoZW1zZWx2ZXM6CitcY29kZQorTWF0cml4WGYgYSgxMCwxNSk7CitWZWN0b3JYZiBiKDMwKTsKK1xlbmRjb2RlCitIZXJlLAorXGxpIFxjIGEgaXMgYSAxMHgxNSBkeW5hbWljLXNpemUgbWF0cml4LCB3aXRoIGFsbG9jYXRlZCBidXQgY3VycmVudGx5IHVuaW5pdGlhbGl6ZWQgY29lZmZpY2llbnRzLgorXGxpIFxjIGIgaXMgYSBkeW5hbWljLXNpemUgdmVjdG9yIG9mIHNpemUgMzAsIHdpdGggYWxsb2NhdGVkIGJ1dCBjdXJyZW50bHkgdW5pbml0aWFsaXplZCBjb2VmZmljaWVudHMuCisKK0luIG9yZGVyIHRvIG9mZmVyIGEgdW5pZm9ybSBBUEkgYWNyb3NzIGZpeGVkLXNpemUgYW5kIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgaXQgaXMgbGVnYWwgdG8gdXNlIHRoZXNlCitjb25zdHJ1Y3RvcnMgb24gZml4ZWQtc2l6ZSBtYXRyaWNlcywgZXZlbiBpZiBwYXNzaW5nIHRoZSBzaXplcyBpcyB1c2VsZXNzIGluIHRoaXMgY2FzZS4gU28gdGhpcyBpcyBsZWdhbDoKK1xjb2RlCitNYXRyaXgzZiBhKDMsMyk7CitcZW5kY29kZQorYW5kIGlzIGEgbm8tb3BlcmF0aW9uLgorCitGaW5hbGx5LCB3ZSBhbHNvIG9mZmVyIHNvbWUgY29uc3RydWN0b3JzIHRvIGluaXRpYWxpemUgdGhlIGNvZWZmaWNpZW50cyBvZiBzbWFsbCBmaXhlZC1zaXplIHZlY3RvcnMgdXAgdG8gc2l6ZSA0OgorXGNvZGUKK1ZlY3RvcjJkIGEoNS4wLCA2LjApOworVmVjdG9yM2QgYig1LjAsIDYuMCwgNy4wKTsKK1ZlY3RvcjRkIGMoNS4wLCA2LjAsIDcuMCwgOC4wKTsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIFR1dG9yaWFsTWF0cml4Q29lZmZBY2Nlc3NvcnMgQ29lZmZpY2llbnQgYWNjZXNzb3JzCisKK1RoZSBwcmltYXJ5IGNvZWZmaWNpZW50IGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgaW4gRWlnZW4gYXJlIHRoZSBvdmVybG9hZGVkIHBhcmVudGhlc2lzIG9wZXJhdG9ycy4KK0ZvciBtYXRyaWNlcywgdGhlIHJvdyBpbmRleCBpcyBhbHdheXMgcGFzc2VkIGZpcnN0LiBGb3IgdmVjdG9ycywganVzdCBwYXNzIG9uZSBpbmRleC4KK1RoZSBudW1iZXJpbmcgc3RhcnRzIGF0IDAuIFRoaXMgZXhhbXBsZSBpcyBzZWxmLWV4cGxhbmF0b3J5OgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK05vdGUgdGhhdCB0aGUgc3ludGF4IDx0dD4gbShpbmRleCkgPC90dD4KK2lzIG5vdCByZXN0cmljdGVkIHRvIHZlY3RvcnMsIGl0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBnZW5lcmFsIG1hdHJpY2VzLCBtZWFuaW5nIGluZGV4LWJhc2VkIGFjY2VzcworaW4gdGhlIGFycmF5IG9mIGNvZWZmaWNpZW50cy4gVGhpcyBob3dldmVyIGRlcGVuZHMgb24gdGhlIG1hdHJpeCdzIHN0b3JhZ2Ugb3JkZXIuIEFsbCBFaWdlbiBtYXRyaWNlcyBkZWZhdWx0IHRvCitjb2x1bW4tbWFqb3Igc3RvcmFnZSBvcmRlciwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gcm93LW1ham9yLCBzZWUgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgIlN0b3JhZ2Ugb3JkZXJzIi4KKworVGhlIG9wZXJhdG9yW10gaXMgYWxzbyBvdmVybG9hZGVkIGZvciBpbmRleC1iYXNlZCBhY2Nlc3MgaW4gdmVjdG9ycywgYnV0IGtlZXAgaW4gbWluZCB0aGF0IEMrKyBkb2Vzbid0IGFsbG93IG9wZXJhdG9yW10gdG8KK3Rha2UgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gV2UgcmVzdHJpY3Qgb3BlcmF0b3JbXSB0byB2ZWN0b3JzLCBiZWNhdXNlIGFuIGF3a3dhcmRuZXNzIGluIHRoZSBDKysgbGFuZ3VhZ2UKK3dvdWxkIG1ha2UgbWF0cml4W2ksal0gY29tcGlsZSB0byB0aGUgc2FtZSB0aGluZyBhcyBtYXRyaXhbal0gIQorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeENvbW1hSW5pdGlhbGl6ZXIgQ29tbWEtaW5pdGlhbGl6YXRpb24KKworJU1hdHJpeCBhbmQgdmVjdG9yIGNvZWZmaWNpZW50cyBjYW4gYmUgY29udmVuaWVudGx5IHNldCB1c2luZyB0aGUgc28tY2FsbGVkIFxlbSBjb21tYS1pbml0aWFsaXplciBzeW50YXguCitGb3Igbm93LCBpdCBpcyBlbm91Z2ggdG8ga25vdyB0aGlzIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKzx0ZD5caW5jbHVkZSBUdXRvcmlhbF9jb21tYWluaXRfMDEuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMS5vdXQgPC90ZD4KKzwvdHI+PC90YWJsZT4KKworCitUaGUgcmlnaHQtaGFuZCBzaWRlIGNhbiBhbHNvIGNvbnRhaW4gbWF0cml4IGV4cHJlc3Npb25zIGFzIGRpc2N1c3NlZCBpbiBccmVmIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbiAidGhpcyBwYWdlIi4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhTaXplc1Jlc2l6aW5nIFJlc2l6aW5nCisKK1RoZSBjdXJyZW50IHNpemUgb2YgYSBtYXRyaXggY2FuIGJlIHJldHJpZXZlZCBieSBcbGluayBFaWdlbkJhc2U6OnJvd3MoKSByb3dzKClcZW5kbGluaywgXGxpbmsgRWlnZW5CYXNlOjpjb2xzKCkgY29scygpIFxlbmRsaW5rIGFuZCBcbGluayBFaWdlbkJhc2U6OnNpemUoKSBzaXplKClcZW5kbGluay4gVGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzLCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCByZXNwZWN0aXZlbHkuIFJlc2l6aW5nIGEgZHluYW1pYy1zaXplIG1hdHJpeCBpcyBkb25lIGJ5IHRoZSBcbGluayBQbGFpbk9iamVjdEJhc2U6OnJlc2l6ZShJbmRleCxJbmRleCkgcmVzaXplKCkgXGVuZGxpbmsgbWV0aG9kLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+Cis8dGQ+XGluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemUuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIHR1dF9tYXRyaXhfcmVzaXplLm91dCA8L3RkPgorPC90cj48L3RhYmxlPgorCitUaGUgcmVzaXplKCkgbWV0aG9kIGlzIGEgbm8tb3BlcmF0aW9uIGlmIHRoZSBhY3R1YWwgbWF0cml4IHNpemUgZG9lc24ndCBjaGFuZ2U7IG90aGVyd2lzZSBpdCBpcyBkZXN0cnVjdGl2ZTogdGhlIHZhbHVlcyBvZiB0aGUgY29lZmZpY2llbnRzIG1heSBjaGFuZ2UuCitJZiB5b3Ugd2FudCBhIGNvbnNlcnZhdGl2ZSB2YXJpYW50IG9mIHJlc2l6ZSgpIHdoaWNoIGRvZXMgbm90IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzLCB1c2UgXGxpbmsgUGxhaW5PYmplY3RCYXNlOjpjb25zZXJ2YXRpdmVSZXNpemUoKSBjb25zZXJ2YXRpdmVSZXNpemUoKVxlbmRsaW5rLCBzZWUgXHJlZiBUb3BpY1Jlc2l6aW5nICJ0aGlzIHBhZ2UiIGZvciBtb3JlIGRldGFpbHMuCisKK0FsbCB0aGVzZSBtZXRob2RzIGFyZSBzdGlsbCBhdmFpbGFibGUgb24gZml4ZWQtc2l6ZSBtYXRyaWNlcywgZm9yIHRoZSBzYWtlIG9mIEFQSSB1bmlmb3JtaXR5LiBPZiBjb3Vyc2UsIHlvdSBjYW4ndCBhY3R1YWxseQorcmVzaXplIGEgZml4ZWQtc2l6ZSBtYXRyaXguIFRyeWluZyB0byBjaGFuZ2UgYSBmaXhlZCBzaXplIHRvIGFuIGFjdHVhbGx5IGRpZmZlcmVudCB2YWx1ZSB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmU7CitidXQgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGxlZ2FsOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+Cis8dGQ+XGluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAgPC90ZD4KKzx0ZD5cdmVyYmluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5vdXQgPC90ZD4KKzwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeEFzc2lnbm1lbnQgQXNzaWdubWVudCBhbmQgcmVzaXppbmcKKworQXNzaWdubWVudCBpcyB0aGUgYWN0aW9uIG9mIGNvcHlpbmcgYSBtYXRyaXggaW50byBhbm90aGVyLCB1c2luZyBcYyBvcGVyYXRvcj0uIEVpZ2VuIHJlc2l6ZXMgdGhlIG1hdHJpeCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgYXV0b21hdGljYWxseSBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBvbiB0aGUgcmlnaHQtaGFuZCBzaXplLiBGb3IgZXhhbXBsZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorPHRkPlxpbmNsdWRlIHR1dF9tYXRyaXhfYXNzaWdubWVudF9yZXNpemluZy5jcHAgPC90ZD4KKzx0ZD5cdmVyYmluY2x1ZGUgdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLm91dCA8L3RkPgorPC90cj48L3RhYmxlPgorCitPZiBjb3Vyc2UsIGlmIHRoZSBsZWZ0LWhhbmQgc2lkZSBpcyBvZiBmaXhlZCBzaXplLCByZXNpemluZyBpdCBpcyBub3QgYWxsb3dlZC4KKworSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgYXV0b21hdGljIHJlc2l6aW5nIHRvIGhhcHBlbiAoZm9yIGV4YW1wbGUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyksIHlvdSBjYW4gZGlzYWJsZSBpdCwgc2VlCitccmVmIFRvcGljUmVzaXppbmcgInRoaXMgcGFnZSIuCisKKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhGaXhlZFZzRHluYW1pYyBGaXhlZCB2cy4gRHluYW1pYyBzaXplCisKK1doZW4gc2hvdWxkIG9uZSB1c2UgZml4ZWQgc2l6ZXMgKGUuZy4gXGMgTWF0cml4NGYpLCBhbmQgd2hlbiBzaG91bGQgb25lIHByZWZlciBkeW5hbWljIHNpemVzIChlLmcuIFxjIE1hdHJpeFhmKT8KK1RoZSBzaW1wbGUgYW5zd2VyIGlzOiB1c2UgZml4ZWQKK3NpemVzIGZvciB2ZXJ5IHNtYWxsIHNpemVzIHdoZXJlIHlvdSBjYW4sIGFuZCB1c2UgZHluYW1pYyBzaXplcyBmb3IgbGFyZ2VyIHNpemVzIG9yIHdoZXJlIHlvdSBoYXZlIHRvLiBGb3Igc21hbGwgc2l6ZXMsCitlc3BlY2lhbGx5IGZvciBzaXplcyBzbWFsbGVyIHRoYW4gKHJvdWdobHkpIDE2LCB1c2luZyBmaXhlZCBzaXplcyBpcyBodWdlbHkgYmVuZWZpY2lhbAordG8gcGVyZm9ybWFuY2UsIGFzIGl0IGFsbG93cyBFaWdlbiB0byBhdm9pZCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0byB1bnJvbGwKK2xvb3BzLiBJbnRlcm5hbGx5LCBhIGZpeGVkLXNpemUgRWlnZW4gbWF0cml4IGlzIGp1c3QgYSBwbGFpbiBhcnJheSwgaS5lLiBkb2luZworXGNvZGUgTWF0cml4NGYgbXltYXRyaXg7IFxlbmRjb2RlCityZWFsbHkgYW1vdW50cyB0byBqdXN0IGRvaW5nCitcY29kZSBmbG9hdCBteW1hdHJpeFsxNl07IFxlbmRjb2RlCitzbyB0aGlzIHJlYWxseSBoYXMgemVybyBydW50aW1lIGNvc3QuIEJ5IGNvbnRyYXN0LCB0aGUgYXJyYXkgb2YgYSBkeW5hbWljLXNpemUgbWF0cml4CitpcyBhbHdheXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBzbyBkb2luZworXGNvZGUgTWF0cml4WGYgbXltYXRyaXgocm93cyxjb2x1bW5zKTsgXGVuZGNvZGUKK2Ftb3VudHMgdG8gZG9pbmcKK1xjb2RlIGZsb2F0ICpteW1hdHJpeCA9IG5ldyBmbG9hdFtyb3dzKmNvbHVtbnNdOyBcZW5kY29kZQorYW5kIGluIGFkZGl0aW9uIHRvIHRoYXQsIHRoZSBNYXRyaXhYZiBvYmplY3Qgc3RvcmVzIGl0cyBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBhcworbWVtYmVyIHZhcmlhYmxlcy4KKworVGhlIGxpbWl0YXRpb24gb2YgdXNpbmcgZml4ZWQgc2l6ZXMsIG9mIGNvdXJzZSwgaXMgdGhhdCB0aGlzIGlzIG9ubHkgcG9zc2libGUKK3doZW4geW91IGtub3cgdGhlIHNpemVzIGF0IGNvbXBpbGUgdGltZS4gQWxzbywgZm9yIGxhcmdlIGVub3VnaCBzaXplcywgc2F5IGZvciBzaXplcworZ3JlYXRlciB0aGFuIChyb3VnaGx5KSAzMiwgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXQgb2YgdXNpbmcgZml4ZWQgc2l6ZXMgYmVjb21lcyBuZWdsaWdpYmxlLgorV29yc2UsIHRyeWluZyB0byBjcmVhdGUgYSB2ZXJ5IGxhcmdlIG1hdHJpeCB1c2luZyBmaXhlZCBzaXplcyBpbnNpZGUgYSBmdW5jdGlvbiBjb3VsZCByZXN1bHQgaW4gYQorc3RhY2sgb3ZlcmZsb3csIHNpbmNlIEVpZ2VuIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIHRoZSBhcnJheSBhdXRvbWF0aWNhbGx5IGFzIGEgbG9jYWwgdmFyaWFibGUsIGFuZAordGhpcyBpcyBub3JtYWxseSBkb25lIG9uIHRoZSBzdGFjay4KK0ZpbmFsbHksIGRlcGVuZGluZyBvbiBjaXJjdW1zdGFuY2VzLCBFaWdlbiBjYW4gYWxzbyBiZSBtb3JlIGFnZ3Jlc3NpdmUgdHJ5aW5nIHRvIHZlY3Rvcml6ZQorKHVzZSBTSU1EIGluc3RydWN0aW9ucykgd2hlbiBkeW5hbWljIHNpemVzIGFyZSB1c2VkLCBzZWUgXHJlZiBUb3BpY1ZlY3Rvcml6YXRpb24gIlZlY3Rvcml6YXRpb24iLgorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeE9wdFRlbXBsUGFyYW1zIE9wdGlvbmFsIHRlbXBsYXRlIHBhcmFtZXRlcnMKKworV2UgbWVudGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBwYWdlIHRoYXQgdGhlIE1hdHJpeCBjbGFzcyB0YWtlcyBzaXggdGVtcGxhdGUgcGFyYW1ldGVycywKK2J1dCBzbyBmYXIgd2Ugb25seSBkaXNjdXNzZWQgdGhlIGZpcnN0IHRocmVlLiBUaGUgcmVtYWluaW5nIHRocmVlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsLiBIZXJlIGlzCit0aGUgY29tcGxldGUgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzOgorXGNvZGUKK01hdHJpeDx0eXBlbmFtZSBTY2FsYXIsCisgICAgICAgaW50IFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgIGludCBDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICBpbnQgT3B0aW9ucyA9IDAsCisgICAgICAgaW50IE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgaW50IE1heENvbHNBdENvbXBpbGVUaW1lID0gQ29sc0F0Q29tcGlsZVRpbWU+CitcZW5kY29kZQorXGxpIFxjIE9wdGlvbnMgaXMgYSBiaXQgZmllbGQuIEhlcmUsIHdlIGRpc2N1c3Mgb25seSBvbmUgYml0OiBcYyBSb3dNYWpvci4gSXQgc3BlY2lmaWVzIHRoYXQgdGhlIG1hdHJpY2VzCisgICAgICBvZiB0aGlzIHR5cGUgdXNlIHJvdy1tYWpvciBzdG9yYWdlIG9yZGVyOyBieSBkZWZhdWx0LCB0aGUgc3RvcmFnZSBvcmRlciBpcyBjb2x1bW4tbWFqb3IuIFNlZSB0aGUgcGFnZSBvbgorICAgICAgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgInN0b3JhZ2Ugb3JkZXJzIi4gRm9yIGV4YW1wbGUsIHRoaXMgdHlwZSBtZWFucyByb3ctbWFqb3IgM3gzIG1hdHJpY2VzOgorICAgICAgXGNvZGUKKyAgICAgIE1hdHJpeDxmbG9hdCwgMywgMywgUm93TWFqb3I+CisgICAgICBcZW5kY29kZQorXGxpIFxjIE1heFJvd3NBdENvbXBpbGVUaW1lIGFuZCBcYyBNYXhDb2xzQXRDb21waWxlVGltZSBhcmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc3BlY2lmeSB0aGF0LCBldmVuIHRob3VnaAorICAgICAgdGhlIGV4YWN0IHNpemVzIG9mIHlvdXIgbWF0cmljZXMgYXJlIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUsIGEgZml4ZWQgdXBwZXIgYm91bmQgaXMga25vd24gYXQKKyAgICAgIGNvbXBpbGUgdGltZS4gVGhlIGJpZ2dlc3QgcmVhc29uIHdoeSB5b3UgbWlnaHQgd2FudCB0byBkbyB0aGF0IGlzIHRvIGF2b2lkIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIG1hdHJpeCB0eXBlIHVzZXMgYSBwbGFpbiBhcnJheSBvZiAxMiBmbG9hdHMsIHdpdGhvdXQgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbjoKKyAgICAgIFxjb2RlCisgICAgICBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIDAsIDMsIDQ+CisgICAgICBcZW5kY29kZQorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeFR5cGVkZWZzIENvbnZlbmllbmNlIHR5cGVkZWZzCisKK0VpZ2VuIGRlZmluZXMgdGhlIGZvbGxvd2luZyBNYXRyaXggdHlwZWRlZnM6CitcbGkgTWF0cml4TnQgZm9yIE1hdHJpeDx0eXBlLCBOLCBOPi4gRm9yIGV4YW1wbGUsIE1hdHJpeFhpIGZvciBNYXRyaXg8aW50LCBEeW5hbWljLCBEeW5hbWljPi4KK1xsaSBWZWN0b3JOdCBmb3IgTWF0cml4PHR5cGUsIE4sIDE+LiBGb3IgZXhhbXBsZSwgVmVjdG9yMmYgZm9yIE1hdHJpeDxmbG9hdCwgMiwgMT4uCitcbGkgUm93VmVjdG9yTnQgZm9yIE1hdHJpeDx0eXBlLCAxLCBOPi4gRm9yIGV4YW1wbGUsIFJvd1ZlY3RvcjNkIGZvciBNYXRyaXg8ZG91YmxlLCAxLCAzPi4KKworV2hlcmU6CitcbGkgTiBjYW4gYmUgYW55IG9uZSBvZiBcYyAyLCBcYyAzLCBcYyA0LCBvciBcYyBYIChtZWFuaW5nIFxjIER5bmFtaWMpLgorXGxpIHQgY2FuIGJlIGFueSBvbmUgb2YgXGMgaSAobWVhbmluZyBpbnQpLCBcYyBmIChtZWFuaW5nIGZsb2F0KSwgXGMgZCAobWVhbmluZyBkb3VibGUpLAorICAgICAgXGMgY2YgKG1lYW5pbmcgY29tcGxleDxmbG9hdD4pLCBvciBcYyBjZCAobWVhbmluZyBjb21wbGV4PGRvdWJsZT4pLiBUaGUgZmFjdCB0aGF0IHR5cGVkZWZzIGFyZSBvbmx5CisgICAgZGVmaW5lZCBmb3IgdGhlc2UgZml2ZSB0eXBlcyBkb2Vzbid0IG1lYW4gdGhhdCB0aGV5IGFyZSB0aGUgb25seSBzdXBwb3J0ZWQgc2NhbGFyIHR5cGVzLiBGb3IgZXhhbXBsZSwKKyAgICBhbGwgc3RhbmRhcmQgaW50ZWdlciB0eXBlcyBhcmUgc3VwcG9ydGVkLCBzZWUgXHJlZiBUb3BpY1NjYWxhclR5cGVzICJTY2FsYXIgdHlwZXMiLgorCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9UdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZy5kb3ggYi9kb2MvVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzIyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcuZG94CkBAIC0wLDAgKzEsMjY2IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZyBSZWR1Y3Rpb25zLCB2aXNpdG9ycyBhbmQgYnJvYWRjYXN0aW5nCisKK1RoaXMgcGFnZSBleHBsYWlucyBFaWdlbidzIHJlZHVjdGlvbnMsIHZpc2l0b3JzIGFuZCBicm9hZGNhc3RpbmcgYW5kIGhvdyB0aGV5IGFyZSB1c2VkIHdpdGgKK1xsaW5rIE1hdHJpeEJhc2UgbWF0cmljZXMgXGVuZGxpbmsgYW5kIFxsaW5rIEFycmF5QmFzZSBhcnJheXMgXGVuZGxpbmsuCisKK1xlaWdlbkF1dG9Ub2MKKworXHNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdSZWR1Y3Rpb25zIFJlZHVjdGlvbnMKK0luIEVpZ2VuLCBhIHJlZHVjdGlvbiBpcyBhIGZ1bmN0aW9uIHRha2luZyBhIG1hdHJpeCBvciBhcnJheSwgYW5kIHJldHVybmluZyBhIHNpbmdsZQorc2NhbGFyIHZhbHVlLiBPbmUgb2YgdGhlIG1vc3QgdXNlZCByZWR1Y3Rpb25zIGlzIFxsaW5rIERlbnNlQmFzZTo6c3VtKCkgLnN1bSgpIFxlbmRsaW5rLAorcmV0dXJuaW5nIHRoZSBzdW0gb2YgYWxsIHRoZSBjb2VmZmljaWVudHMgaW5zaWRlIGEgZ2l2ZW4gbWF0cml4IG9yIGFycmF5LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBcZW0gdHJhY2Ugb2YgYSBtYXRyaXgsIGFzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBcYyB0cmFjZSgpLCBpcyB0aGUgc3VtIG9mIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMgYW5kIGNhbiBlcXVpdmFsZW50bHkgYmUgY29tcHV0ZWQgPHR0PmEuZGlhZ29uYWwoKS5zdW0oKTwvdHQ+LgorCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9uc05vcm0gTm9ybSBjb21wdXRhdGlvbnMKKworVGhlIChFdWNsaWRlYW4gYS5rLmEuIFxmJFxlbGxeMlxmJCkgc3F1YXJlZCBub3JtIG9mIGEgdmVjdG9yIGNhbiBiZSBvYnRhaW5lZCBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbmsuIEl0IGlzIGVxdWFsIHRvIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgdmVjdG9yIGJ5IGl0c2VsZiwgYW5kIGVxdWl2YWxlbnRseSB0byB0aGUgc3VtIG9mIHNxdWFyZWQgYWJzb2x1dGUgdmFsdWVzIG9mIGl0cyBjb2VmZmljaWVudHMuCisKK0VpZ2VuIGFsc28gcHJvdmlkZXMgdGhlIFxsaW5rIE1hdHJpeEJhc2U6Om5vcm0oKSBub3JtKCkgXGVuZGxpbmsgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbmsuCisKK1RoZXNlIG9wZXJhdGlvbnMgY2FuIGFsc28gb3BlcmF0ZSBvbiBtYXRyaWNlczsgaW4gdGhhdCBjYXNlLCBhIG4tYnktcCBtYXRyaXggaXMgc2VlbiBhcyBhIHZlY3RvciBvZiBzaXplIChuKnApLCBzbyBmb3IgZXhhbXBsZSB0aGUgXGxpbmsgTWF0cml4QmFzZTo6bm9ybSgpIG5vcm0oKSBcZW5kbGluayBtZXRob2QgcmV0dXJucyB0aGUgIkZyb2Jlbml1cyIgb3IgIkhpbGJlcnQtU2NobWlkdCIgbm9ybS4gV2UgcmVmcmFpbiBmcm9tIHNwZWFraW5nIG9mIHRoZSBcZiRcZWxsXjJcZiQgbm9ybSBvZiBhIG1hdHJpeCBiZWNhdXNlIHRoYXQgY2FuIG1lYW4gZGlmZmVyZW50IHRoaW5ncy4KKworSWYgeW91IHdhbnQgb3RoZXIgY29lZmZpY2llbnQtd2lzZSBcZiRcZWxsXnBcZiQgbm9ybXMsIHVzZSB0aGUgXGxpbmsgTWF0cml4QmFzZTo6bHBOb3JtIGxwTm9ybTxwPigpIFxlbmRsaW5rIG1ldGhvZC4gVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBwIGNhbiB0YWtlIHRoZSBzcGVjaWFsIHZhbHVlIFxhIEluZmluaXR5IGlmIHlvdSB3YW50IHRoZSBcZiRcZWxsXlxpbmZ0eVxmJCBub3JtLCB3aGljaCBpcyB0aGUgbWF4aW11bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBjb2VmZmljaWVudHMuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlc2UgbWV0aG9kcy4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0uY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0ub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworXGIgT3BlcmF0b3IgXGIgbm9ybTogVGhlIDEtbm9ybSBhbmQgXGYkXGluZnR5XGYkLW5vcm0gPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3BlcmF0b3Jfbm9ybSI+bWF0cml4IG9wZXJhdG9yIG5vcm1zPC9hPiBjYW4gZWFzaWx5IGJlIGNvbXB1dGVkIGFzIGZvbGxvd3M6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfb3BlcmF0b3Jub3JtLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19vcGVyYXRvcm5vcm0ub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KK1NlZSBiZWxvdyBmb3IgbW9yZSBleHBsYW5hdGlvbnMgb24gdGhlIHN5bnRheCBvZiB0aGVzZSBleHByZXNzaW9ucy4KKworXHN1YnNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdSZWR1Y3Rpb25zQm9vbCBCb29sZWFuIHJlZHVjdGlvbnMKKworVGhlIGZvbGxvd2luZyByZWR1Y3Rpb25zIG9wZXJhdGUgb24gYm9vbGVhbiB2YWx1ZXM6CisgIC0gXGxpbmsgRGVuc2VCYXNlOjphbGwoKSBhbGwoKSBcZW5kbGluayByZXR1cm5zIFxiIHRydWUgaWYgYWxsIG9mIHRoZSBjb2VmZmljaWVudHMgaW4gYSBnaXZlbiBNYXRyaXggb3IgQXJyYXkgZXZhbHVhdGUgdG8gXGIgdHJ1ZSAuCisgIC0gXGxpbmsgRGVuc2VCYXNlOjphbnkoKSBhbnkoKSBcZW5kbGluayByZXR1cm5zIFxiIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBjb2VmZmljaWVudHMgaW4gYSBnaXZlbiBNYXRyaXggb3IgQXJyYXkgZXZhbHVhdGVzIHRvIFxiIHRydWUgLgorICAtIFxsaW5rIERlbnNlQmFzZTo6Y291bnQoKSBjb3VudCgpIFxlbmRsaW5rIHJldHVybnMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaW4gYSBnaXZlbiBNYXRyaXggb3IgQXJyYXkgdGhhdCBldmFsdWF0ZSB0byAgXGIgdHJ1ZS4KKworVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGNvZWZmaWNpZW50LXdpc2UgY29tcGFyaXNvbiBhbmQgZXF1YWxpdHkgb3BlcmF0b3JzIHByb3ZpZGVkIGJ5IEFycmF5LiBGb3IgaW5zdGFuY2UsIDx0dD5hcnJheSA+IDA8L3R0PiBpcyBhbiAlQXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhcyBcYyBhcnJheSAsIHdpdGggXGIgdHJ1ZSBhdCB0aG9zZSBwb3NpdGlvbnMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgb2YgXGMgYXJyYXkgaXMgcG9zaXRpdmUuIFRodXMsIDx0dD4oYXJyYXkgPiAwKS5hbGwoKTwvdHQ+IHRlc3RzIHdoZXRoZXIgYWxsIGNvZWZmaWNpZW50cyBvZiBcYyBhcnJheSBhcmUgcG9zaXRpdmUuIFRoaXMgY2FuIGJlIHNlZW4gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfYm9vbC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfYm9vbC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitcc3Vic2VjdGlvbiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ1JlZHVjdGlvbnNVc2VyZGVmaW5lZCBVc2VyIGRlZmluZWQgcmVkdWN0aW9ucworCitUT0RPCisKK0luIHRoZSBtZWFudGltZSB5b3UgY2FuIGhhdmUgYSBsb29rIGF0IHRoZSBEZW5zZUJhc2U6OnJlZHV4KCkgZnVuY3Rpb24uCisKK1xzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nVmlzaXRvcnMgVmlzaXRvcnMKK1Zpc2l0b3JzIGFyZSB1c2VmdWwgd2hlbiBvbmUgd2FudHMgdG8gb2J0YWluIHRoZSBsb2NhdGlvbiBvZiBhIGNvZWZmaWNpZW50IGluc2lkZSAKK2EgTWF0cml4IG9yIEFycmF5LiBUaGUgc2ltcGxlc3QgZXhhbXBsZXMgYXJlIAorXGxpbmsgTWF0cml4QmFzZTo6bWF4Q29lZmYoKSBtYXhDb2VmZigmeCwmeSkgXGVuZGxpbmsgYW5kIAorXGxpbmsgTWF0cml4QmFzZTo6bWluQ29lZmYoKSBtaW5Db2VmZigmeCwmeSlcZW5kbGluaywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZAordGhlIGxvY2F0aW9uIG9mIHRoZSBncmVhdGVzdCBvciBzbWFsbGVzdCBjb2VmZmljaWVudCBpbiBhIE1hdHJpeCBvciAKK0FycmF5LgorCitUaGUgYXJndW1lbnRzIHBhc3NlZCB0byBhIHZpc2l0b3IgYXJlIHBvaW50ZXJzIHRvIHRoZSB2YXJpYWJsZXMgd2hlcmUgdGhlCityb3cgYW5kIGNvbHVtbiBwb3NpdGlvbiBhcmUgdG8gYmUgc3RvcmVkLiBUaGVzZSB2YXJpYWJsZXMgc2hvdWxkIGJlIG9mIHR5cGUKK1xsaW5rIEVpZ2VuOjpJbmRleCBJbmRleCBcZW5kbGluaywgYXMgc2hvd24gYmVsb3c6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfdmlzaXRvcnMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitCb3RoIGZ1bmN0aW9ucyBhbHNvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1pbmltdW0gb3IgbWF4aW11bSBjb2VmZmljaWVudC4KKworXHNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdQYXJ0aWFsUmVkdWN0aW9ucyBQYXJ0aWFsIHJlZHVjdGlvbnMKK1BhcnRpYWwgcmVkdWN0aW9ucyBhcmUgcmVkdWN0aW9ucyB0aGF0IGNhbiBvcGVyYXRlIGNvbHVtbi0gb3Igcm93LXdpc2Ugb24gYSBNYXRyaXggb3IgCitBcnJheSwgYXBwbHlpbmcgdGhlIHJlZHVjdGlvbiBvcGVyYXRpb24gb24gZWFjaCBjb2x1bW4gb3Igcm93IGFuZCAKK3JldHVybmluZyBhIGNvbHVtbiBvciByb3cgdmVjdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiBQYXJ0aWFsIHJlZHVjdGlvbnMgYXJlIGFwcGxpZWQgCit3aXRoIFxsaW5rIERlbnNlQmFzZTo6Y29sd2lzZSgpIGNvbHdpc2UoKSBcZW5kbGluayBvciBcbGluayBEZW5zZUJhc2U6OnJvd3dpc2UoKSByb3d3aXNlKCkgXGVuZGxpbmsuCisKK0Egc2ltcGxlIGV4YW1wbGUgaXMgb2J0YWluaW5nIHRoZSBtYXhpbXVtIG9mIHRoZSBlbGVtZW50cyAKK2luIGVhY2ggY29sdW1uIGluIGEgZ2l2ZW4gbWF0cml4LCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gYSByb3cgdmVjdG9yOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2NvbHdpc2UuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBzYW1lIG9wZXJhdGlvbiBjYW4gYmUgcGVyZm9ybWVkIHJvdy13aXNlOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Jvd3dpc2UuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKKzxiPk5vdGUgdGhhdCBjb2x1bW4td2lzZSBvcGVyYXRpb25zIHJldHVybiBhIHJvdyB2ZWN0b3IsIHdoaWxlIHJvdy13aXNlIG9wZXJhdGlvbnMgcmV0dXJuIGEgY29sdW1uIHZlY3Rvci48L2I+CisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUGFydGlhbFJlZHVjdGlvbnNDb21iaW5lZCBDb21iaW5pbmcgcGFydGlhbCByZWR1Y3Rpb25zIHdpdGggb3RoZXIgb3BlcmF0aW9ucworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgdGhlIHJlc3VsdCBvZiBhIHBhcnRpYWwgcmVkdWN0aW9uIHRvIGRvIGZ1cnRoZXIgcHJvY2Vzc2luZy4KK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlIHRoYXQgZmluZHMgdGhlIGNvbHVtbiB3aG9zZSBzdW0gb2YgZWxlbWVudHMgaXMgdGhlIG1heGltdW0KKyB3aXRoaW4gYSBtYXRyaXguIFdpdGggY29sdW1uLXdpc2UgcGFydGlhbCByZWR1Y3Rpb25zIHRoaXMgY2FuIGJlIGNvZGVkIGFzOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX21heG5vcm0uY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19tYXhub3JtLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBwcmV2aW91cyBleGFtcGxlIGFwcGxpZXMgdGhlIFxsaW5rIERlbnNlQmFzZTo6c3VtKCkgc3VtKCkgXGVuZGxpbmsgcmVkdWN0aW9uIG9uIGVhY2ggY29sdW1uCit0aG91Z2ggdGhlIFxsaW5rIERlbnNlQmFzZTo6Y29sd2lzZSgpIGNvbHdpc2UoKSBcZW5kbGluayB2aXNpdG9yLCBvYnRhaW5pbmcgYSBuZXcgbWF0cml4IHdob3NlCitzaXplIGlzIDF4NC4KKworVGhlcmVmb3JlLCBpZgorXGZbCitcbWJveHttfSA9IFxiZWdpbntibWF0cml4fSAxICYgMiAmIDYgJiA5IFxcCisgICAgICAgICAgICAgICAgICAgIDMgJiAxICYgNyAmIDIgXGVuZHtibWF0cml4fQorXGZdCisKK3RoZW4KKworXGZbCitcbWJveHttLmNvbHdpc2UoKS5zdW0oKX0gPSBcYmVnaW57Ym1hdHJpeH0gNCAmIDMgJiAxMyAmIDExIFxlbmR7Ym1hdHJpeH0KK1xmXQorCitUaGUgXGxpbmsgRGVuc2VCYXNlOjptYXhDb2VmZigpIG1heENvZWZmKCkgXGVuZGxpbmsgcmVkdWN0aW9uIGlzIGZpbmFsbHkgYXBwbGllZCAKK3RvIG9idGFpbiB0aGUgY29sdW1uIGluZGV4IHdoZXJlIHRoZSBtYXhpbXVtIHN1bSBpcyBmb3VuZCwgCit3aGljaCBpcyB0aGUgY29sdW1uIGluZGV4IDIgKHRoaXJkIGNvbHVtbikgaW4gdGhpcyBjYXNlLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nQnJvYWRjYXN0aW5nIEJyb2FkY2FzdGluZworVGhlIGNvbmNlcHQgYmVoaW5kIGJyb2FkY2FzdGluZyBpcyBzaW1pbGFyIHRvIHBhcnRpYWwgcmVkdWN0aW9ucywgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IGJyb2FkY2FzdGluZyAKK2NvbnN0cnVjdHMgYW4gZXhwcmVzc2lvbiB3aGVyZSBhIHZlY3RvciAoY29sdW1uIG9yIHJvdykgaXMgaW50ZXJwcmV0ZWQgYXMgYSBtYXRyaXggYnkgcmVwbGljYXRpbmcgaXQgaW4gCitvbmUgZGlyZWN0aW9uLgorCitBIHNpbXBsZSBleGFtcGxlIGlzIHRvIGFkZCBhIGNlcnRhaW4gY29sdW1uIHZlY3RvciB0byBlYWNoIGNvbHVtbiBpbiBhIG1hdHJpeC4gCitUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgd2l0aDoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitXZSBjYW4gaW50ZXJwcmV0IHRoZSBpbnN0cnVjdGlvbiA8dHQ+bWF0LmNvbHdpc2UoKSArPSB2PC90dD4gaW4gdHdvIGVxdWl2YWxlbnQgd2F5cy4gSXQgYWRkcyB0aGUgdmVjdG9yIFxjIHYKK3RvIGV2ZXJ5IGNvbHVtbiBvZiB0aGUgbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCBpdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgcmVwZWF0aW5nIHRoZSB2ZWN0b3IgXGMgdiBmb3VyIHRpbWVzIHRvCitmb3JtIGEgZm91ci1ieS10d28gbWF0cml4IHdoaWNoIGlzIHRoZW4gYWRkZWQgdG8gXGMgbWF0OgorXGZbCitcYmVnaW57Ym1hdHJpeH0gMSAmIDIgJiA2ICYgOSBcXCAzICYgMSAmIDcgJiAyIFxlbmR7Ym1hdHJpeH0KKysgXGJlZ2lue2JtYXRyaXh9IDAgJiAwICYgMCAmIDAgXFwgMSAmIDEgJiAxICYgMSBcZW5ke2JtYXRyaXh9Cis9IFxiZWdpbntibWF0cml4fSAxICYgMiAmIDYgJiA5IFxcIDQgJiAyICYgOCAmIDMgXGVuZHtibWF0cml4fS4KK1xmXQorVGhlIG9wZXJhdG9ycyA8dHQ+LT08L3R0PiwgPHR0Pis8L3R0PiBhbmQgPHR0Pi08L3R0PiBjYW4gYWxzbyBiZSB1c2VkIGNvbHVtbi13aXNlIGFuZCByb3ctd2lzZS4gT24gYXJyYXlzLCB3ZSAKK2NhbiBhbHNvIHVzZSB0aGUgb3BlcmF0b3JzIDx0dD4qPTwvdHQ+LCA8dHQ+Lz08L3R0PiwgPHR0Pio8L3R0PiBhbmQgPHR0Pi88L3R0PiB0byBwZXJmb3JtIGNvZWZmaWNpZW50LXdpc2UgCittdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gY29sdW1uLXdpc2Ugb3Igcm93LXdpc2UuIFRoZXNlIG9wZXJhdG9ycyBhcmUgbm90IGF2YWlsYWJsZSBvbiBtYXRyaWNlcyBiZWNhdXNlIGl0CitpcyBub3QgY2xlYXIgd2hhdCB0aGV5IHdvdWxkIGRvLiBJZiB5b3Ugd2FudCBtdWx0aXBseSBjb2x1bW4gMCBvZiBhIG1hdHJpeCBcYyBtYXQgd2l0aCBcYyB2KDApLCBjb2x1bW4gMSB3aXRoIAorXGMgdigxKSwgYW5kIHNvIG9uLCB0aGVuIHVzZSA8dHQ+bWF0ID0gbWF0ICogdi5hc0RpYWdvbmFsKCk8L3R0Pi4KKworSXQgaXMgaW1wb3J0YW50IHRvIHBvaW50IG91dCB0aGF0IHRoZSB2ZWN0b3IgdG8gYmUgYWRkZWQgY29sdW1uLXdpc2Ugb3Igcm93LXdpc2UgbXVzdCBiZSBvZiB0eXBlIFZlY3RvciwKK2FuZCBjYW5ub3QgYmUgYSBNYXRyaXguIElmIHRoaXMgaXMgbm90IG1ldCB0aGVuIHlvdSB3aWxsIGdldCBjb21waWxlLXRpbWUgZXJyb3IuIFRoaXMgYWxzbyBtZWFucyB0aGF0Citicm9hZGNhc3Rpbmcgb3BlcmF0aW9ucyBjYW4gb25seSBiZSBhcHBsaWVkIHdpdGggYW4gb2JqZWN0IG9mIHR5cGUgVmVjdG9yLCB3aGVuIG9wZXJhdGluZyB3aXRoIE1hdHJpeC4KK1RoZSBzYW1lIGFwcGxpZXMgZm9yIHRoZSBBcnJheSBjbGFzcywgd2hlcmUgdGhlIGVxdWl2YWxlbnQgZm9yIFZlY3RvclhmIGlzIEFycmF5WGYuIEFzIGFsd2F5cywgeW91IHNob3VsZAorbm90IG1peCBhcnJheXMgYW5kIG1hdHJpY2VzIGluIHRoZSBzYW1lIGV4cHJlc3Npb24uCisKK1RvIHBlcmZvcm0gdGhlIHNhbWUgb3BlcmF0aW9uIHJvdy13aXNlIHdlIGNhbiBkbzoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlX3Jvd3dpc2UuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlX3Jvd3dpc2Uub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworXHN1YnNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdCcm9hZGNhc3RpbmdDb21iaW5lZCBDb21iaW5pbmcgYnJvYWRjYXN0aW5nIHdpdGggb3RoZXIgb3BlcmF0aW9ucworQnJvYWRjYXN0aW5nIGNhbiBhbHNvIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgb3BlcmF0aW9ucywgc3VjaCBhcyBNYXRyaXggb3IgQXJyYXkgb3BlcmF0aW9ucywgCityZWR1Y3Rpb25zIGFuZCBwYXJ0aWFsIHJlZHVjdGlvbnMuCisKK05vdyB0aGF0IGJyb2FkY2FzdGluZywgcmVkdWN0aW9ucyBhbmQgcGFydGlhbCByZWR1Y3Rpb25zIGhhdmUgYmVlbiBpbnRyb2R1Y2VkLCB3ZSBjYW4gZGl2ZSBpbnRvIGEgbW9yZSBhZHZhbmNlZCBleGFtcGxlIHRoYXQgZmluZHMKK3RoZSBuZWFyZXN0IG5laWdoYm91ciBvZiBhIHZlY3RvciA8dHQ+djwvdHQ+IHdpdGhpbiB0aGUgY29sdW1ucyBvZiBtYXRyaXggPHR0Pm08L3R0Pi4gVGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgaW4gdGhpcyBleGFtcGxlLAorY29tcHV0aW5nIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSB3aXRoIHRoZSBwYXJ0aWFsIHJlZHVjdGlvbiBuYW1lZCBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbms6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0XzFubi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4ub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworVGhlIGxpbmUgdGhhdCBkb2VzIHRoZSBqb2IgaXMgCitcY29kZQorICAobS5jb2x3aXNlKCkgLSB2KS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKS5taW5Db2VmZigmaW5kZXgpOworXGVuZGNvZGUKKworV2Ugd2lsbCBnbyBzdGVwIGJ5IHN0ZXAgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGhhcHBlbmluZzoKKworICAtIDx0dD5tLmNvbHdpc2UoKSAtIHY8L3R0PiBpcyBhIGJyb2FkY2FzdGluZyBvcGVyYXRpb24sIHN1YnRyYWN0aW5nIDx0dD52PC90dD4gZnJvbSBlYWNoIGNvbHVtbiBpbiA8dHQ+bTwvdHQ+LiBUaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uCitpcyBhIG5ldyBtYXRyaXggd2hvc2Ugc2l6ZSBpcyB0aGUgc2FtZSBhcyBtYXRyaXggPHR0Pm08L3R0PjogXGZbCisgIFxtYm94e20uY29sd2lzZSgpIC0gdn0gPSAKKyAgXGJlZ2lue2JtYXRyaXh9CisgICAgLTEgJiAyMSAmIDQgJiA3IFxcCisgICAgIDAgJiA4ICAmIDQgJiAtMQorICBcZW5ke2JtYXRyaXh9CitcZl0KKworICAtIDx0dD4obS5jb2x3aXNlKCkgLSB2KS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKTwvdHQ+IGlzIGEgcGFydGlhbCByZWR1Y3Rpb24sIGNvbXB1dGluZyB0aGUgc3F1YXJlZCBub3JtIGNvbHVtbi13aXNlLiBUaGUgcmVzdWx0IG9mCit0aGlzIG9wZXJhdGlvbiBpcyBhIHJvdyB2ZWN0b3Igd2hlcmUgZWFjaCBjb2VmZmljaWVudCBpcyB0aGUgc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiBlYWNoIGNvbHVtbiBpbiA8dHQ+bTwvdHQ+IGFuZCA8dHQ+djwvdHQ+OiBcZlsKKyAgXG1ib3h7KG0uY29sd2lzZSgpIC0gdikuY29sd2lzZSgpLnNxdWFyZWROb3JtKCl9ID0KKyAgXGJlZ2lue2JtYXRyaXh9CisgICAgIDEgJiA1MDUgJiAzMiAmIDUwCisgIFxlbmR7Ym1hdHJpeH0KK1xmXQorCisgIC0gRmluYWxseSwgPHR0Pm1pbkNvZWZmKCZpbmRleCk8L3R0PiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiA8dHQ+bTwvdHQ+IHRoYXQgaXMgY2xvc2VzdCB0byA8dHQ+djwvdHQ+IGluIHRlcm1zIG9mIEV1Y2xpZGVhbgorZGlzdGFuY2UuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9UdXRvcmlhbFJlc2hhcGVTbGljaW5nLmRveCBiL2RvYy9UdXRvcmlhbFJlc2hhcGVTbGljaW5nLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMwYTVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1R1dG9yaWFsUmVzaGFwZVNsaWNpbmcuZG94CkBAIC0wLDAgKzEsNjUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcZWlnZW5NYW51YWxQYWdlIFR1dG9yaWFsUmVzaGFwZVNsaWNpbmcgUmVzaGFwZSBhbmQgU2xpY2luZworCislRWlnZW4gZG9lcyBub3QgZXhwb3NlIGNvbnZlbmllbnQgbWV0aG9kcyB0byB0YWtlIHNsaWNlcyBvciB0byByZXNoYXBlIGEgbWF0cml4IHlldC4KK05vbmV0aGVsZXNzLCBzdWNoIGZlYXR1cmVzIGNhbiBlYXNpbHkgYmUgZW11bGF0ZWQgdXNpbmcgdGhlIE1hcCBjbGFzcy4KKworXGVpZ2VuQXV0b1RvYworCitcc2VjdGlvbiBUdXRvcmlhbFJlc2hhcGUgUmVzaGFwZQorCitBIHJlc2hhcGUgb3BlcmF0aW9uIGNvbnNpc3RzIGluIG1vZGlmeWluZyB0aGUgc2l6ZXMgb2YgYSBtYXRyaXggd2hpbGUga2VlcGluZyB0aGUgc2FtZSBjb2VmZmljaWVudHMuCitJbnN0ZWFkIG9mIG1vZGlmeWluZyB0aGUgaW5wdXQgbWF0cml4IGl0c2VsZiwgd2hpY2ggaXMgbm90IHBvc3NpYmxlIGZvciBjb21waWxlLXRpbWUgc2l6ZXMsIHRoZSBhcHByb2FjaCBjb25zaXN0IGluIGNyZWF0aW5nIGEgZGlmZmVyZW50IFxlbSB2aWV3IG9uIHRoZSBzdG9yYWdlIHVzaW5nIGNsYXNzIE1hcC4KK0hlcmUgaXMgYSB0eXBpY2FsIGV4YW1wbGUgY3JlYXRpbmcgYSAxRCBsaW5lYXIgdmlldyBvZiBhIG1hdHJpeDoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1Jlc2hhcGVNYXQyVmVjLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZXNoYXBlTWF0MlZlYy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitSZW1hcmsgaG93IHRoZSBzdG9yYWdlIG9yZGVyIG9mIHRoZSBpbnB1dCBtYXRyaXggbW9kaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBjb2VmZmljaWVudHMgaW4gdGhlIGxpbmVhciB2aWV3LgorSGVyZSBpcyBhbm90aGVyIGV4YW1wbGUgcmVzaGFwaW5nIGEgMng2IG1hdHJpeCB0byBhIDZ4MiBvbmU6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVzaGFwZU1hdDJNYXQuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1Jlc2hhcGVNYXQyTWF0Lm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKKworCitcc2VjdGlvbiBUdXRvcmlhbFNsaWNpbmcgU2xpY2luZworCitTbGljaW5nIGNvbnNpc3RzIGluIHRha2luZyBhIHNldCBvZiByb3dzLCBjb2x1bW5zLCBvciBlbGVtZW50cywgdW5pZm9ybWx5IHNwYWNlZCB3aXRoaW4gYSBtYXRyaXguCitBZ2FpbiwgdGhlIGNsYXNzIE1hcCBhbGxvd3MgdG8gZWFzaWx5IG1pbWljIHRoaXMgZmVhdHVyZS4KKworRm9yIGluc3RhbmNlLCBvbmUgY2FuIHNraXAgZXZlcnkgUCBlbGVtZW50cyBpbiBhIHZlY3RvcjoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9TbGljaW5nVmVjLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9TbGljaW5nVmVjLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK09uZSBjYW4gb2xzbyB0YWtlIG9uZSBjb2x1bW4gb3ZlciB0aHJlZSB1c2luZyBhbiBhZGVxdWF0ZSBvdXRlci1zdHJpZGUgb3IgaW5uZXItc3RyaWRlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIHN0b3JhZ2Ugb3JkZXI6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfU2xpY2luZ0NvbC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfU2xpY2luZ0NvbC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVHV0b3JpYWxTcGFyc2UuZG94IGIvZG9jL1R1dG9yaWFsU3BhcnNlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI5MDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1R1dG9yaWFsU3BhcnNlLmRveApAQCAtMCwwICsxLDM2NSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxlaWdlbk1hbnVhbFBhZ2UgVHV0b3JpYWxTcGFyc2UgU3BhcnNlIG1hdHJpeCBtYW5pcHVsYXRpb25zCisKK1xlaWdlbkF1dG9Ub2MKKworTWFuaXB1bGF0aW5nIGFuZCBzb2x2aW5nIHNwYXJzZSBwcm9ibGVtcyBpbnZvbHZlcyB2YXJpb3VzIG1vZHVsZXMgd2hpY2ggYXJlIHN1bW1hcml6ZWQgYmVsb3c6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+TW9kdWxlPC90aD48dGg+SGVhZGVyIGZpbGU8L3RoPjx0aD5Db250ZW50czwvdGg+PC90cj4KKzx0cj48dGQ+XGxpbmsgU3BhcnNlQ29yZV9Nb2R1bGUgU3BhcnNlQ29yZSBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNvcmU+XGVuZGNvZGU8L3RkPjx0ZD5TcGFyc2VNYXRyaXggYW5kIFNwYXJzZVZlY3RvciBjbGFzc2VzLCBtYXRyaXggYXNzZW1ibHksIGJhc2ljIHNwYXJzZSBsaW5lYXIgYWxnZWJyYSAoaW5jbHVkaW5nIHNwYXJzZSB0cmlhbmd1bGFyIHNvbHZlcnMpPC90ZD48L3RyPgorPHRyPjx0ZD5cbGluayBTcGFyc2VDaG9sZXNreV9Nb2R1bGUgU3BhcnNlQ2hvbGVza3kgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDaG9sZXNreT5cZW5kY29kZTwvdGQ+PHRkPkRpcmVjdCBzcGFyc2UgTExUIGFuZCBMRExUIENob2xlc2t5IGZhY3Rvcml6YXRpb24gdG8gc29sdmUgc3BhcnNlIHNlbGYtYWRqb2ludCBwb3NpdGl2ZSBkZWZpbml0ZSBwcm9ibGVtczwvdGQ+PC90cj4KKzx0cj48dGQ+XGxpbmsgU3BhcnNlTFVfTW9kdWxlIFNwYXJzZUxVIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUgI2luY2x1ZGU8RWlnZW4vU3BhcnNlTFU+IFxlbmRjb2RlPC90ZD4KKzx0ZD4lU3BhcnNlIExVIGZhY3Rvcml6YXRpb24gdG8gc29sdmUgZ2VuZXJhbCBzcXVhcmUgc3BhcnNlIHN5c3RlbXM8L3RkPjwvdHI+Cis8dHI+PHRkPlxsaW5rIFNwYXJzZVFSX01vZHVsZSBTcGFyc2VRUiBcZW5kbGluazwvdGQ+PHRkPlxjb2RlICNpbmNsdWRlPEVpZ2VuL1NwYXJzZVFSPlxlbmRjb2RlIDwvdGQ+PHRkPiVTcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBmb3Igc29sdmluZyBzcGFyc2UgbGluZWFyIGxlYXN0LXNxdWFyZXMgcHJvYmxlbXM8L3RkPjwvdHI+Cis8dHI+PHRkPlxsaW5rIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPlxlbmRjb2RlPC90ZD48dGQ+SXRlcmF0aXZlIHNvbHZlcnMgdG8gc29sdmUgbGFyZ2UgZ2VuZXJhbCBsaW5lYXIgc3F1YXJlIHByb2JsZW1zIChpbmNsdWRpbmcgc2VsZi1hZGpvaW50IHBvc2l0aXZlIGRlZmluaXRlIHByb2JsZW1zKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGxpbmsgU3BhcnNlX01vZHVsZSBTcGFyc2UgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+XGVuZGNvZGU8L3RkPjx0ZD5JbmNsdWRlcyBhbGwgdGhlIGFib3ZlIG1vZHVsZXM8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitcc2VjdGlvbiBUdXRvcmlhbFNwYXJzZUludHJvIFNwYXJzZSBtYXRyaXggZm9ybWF0CisKK0luIG1hbnkgYXBwbGljYXRpb25zIChlLmcuLCBmaW5pdGUgZWxlbWVudCBtZXRob2RzKSBpdCBpcyBjb21tb24gdG8gZGVhbCB3aXRoIHZlcnkgbGFyZ2UgbWF0cmljZXMgd2hlcmUgb25seSBhIGZldyBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudCBmcm9tIHplcm8uICBJbiBzdWNoIGNhc2VzLCBtZW1vcnkgY29uc3VtcHRpb24gY2FuIGJlIHJlZHVjZWQgYW5kIHBlcmZvcm1hbmNlIGluY3JlYXNlZCBieSB1c2luZyBhIHNwZWNpYWxpemVkIHJlcHJlc2VudGF0aW9uIHN0b3Jpbmcgb25seSB0aGUgbm9uemVybyBjb2VmZmljaWVudHMuIFN1Y2ggYSBtYXRyaXggaXMgY2FsbGVkIGEgc3BhcnNlIG1hdHJpeC4KKworXGIgVGhlIFxiICVTcGFyc2VNYXRyaXggXGIgY2xhc3MKKworVGhlIGNsYXNzIFNwYXJzZU1hdHJpeCBpcyB0aGUgbWFpbiBzcGFyc2UgbWF0cml4IHJlcHJlc2VudGF0aW9uIG9mIEVpZ2VuJ3Mgc3BhcnNlIG1vZHVsZTsgaXQgb2ZmZXJzIGhpZ2ggcGVyZm9ybWFuY2UgYW5kIGxvdyBtZW1vcnkgdXNhZ2UuCitJdCBpbXBsZW1lbnRzIGEgbW9yZSB2ZXJzYXRpbGUgdmFyaWFudCBvZiB0aGUgd2lkZWx5LXVzZWQgQ29tcHJlc3NlZCBDb2x1bW4gKG9yIFJvdykgU3RvcmFnZSBzY2hlbWUuCitJdCBjb25zaXN0cyBvZiBmb3VyIGNvbXBhY3QgYXJyYXlzOgorIC0gXGMgVmFsdWVzOiBzdG9yZXMgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvZiB0aGUgbm9uLXplcm9zLgorIC0gXGMgSW5uZXJJbmRpY2VzOiBzdG9yZXMgdGhlIHJvdyAocmVzcC4gY29sdW1uKSBpbmRpY2VzIG9mIHRoZSBub24temVyb3MuCisgLSBcYyBPdXRlclN0YXJ0czogc3RvcmVzIGZvciBlYWNoIGNvbHVtbiAocmVzcC4gcm93KSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi16ZXJvIGluIHRoZSBwcmV2aW91cyB0d28gYXJyYXlzLgorIC0gXGMgSW5uZXJOTlpzOiBzdG9yZXMgdGhlIG51bWJlciBvZiBub24temVyb3Mgb2YgZWFjaCBjb2x1bW4gKHJlc3AuIHJvdykuCitUaGUgd29yZCBcYyBpbm5lciByZWZlcnMgdG8gYW4gXGVtIGlubmVyIFxlbSB2ZWN0b3IgdGhhdCBpcyBhIGNvbHVtbiBmb3IgYSBjb2x1bW4tbWFqb3IgbWF0cml4LCBvciBhIHJvdyBmb3IgYSByb3ctbWFqb3IgbWF0cml4LgorVGhlIHdvcmQgXGMgb3V0ZXIgcmVmZXJzIHRvIHRoZSBvdGhlciBkaXJlY3Rpb24uCisKK1RoaXMgc3RvcmFnZSBzY2hlbWUgaXMgYmV0dGVyIGV4cGxhaW5lZCBvbiBhbiBleGFtcGxlLiBUaGUgZm9sbG93aW5nIG1hdHJpeAorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4gMDwvdGQ+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+CisKK0EgU3BhcnNlVmVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlIG9mIGEgU3BhcnNlTWF0cml4IHdoZXJlIG9ubHkgdGhlIFxjIFZhbHVlcyBhbmQgXGMgSW5uZXJJbmRpY2VzIGFycmF5cyBhcmUgc3RvcmVkLgorVGhlcmUgaXMgbm8gbm90aW9uIG9mIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkIG1vZGUgZm9yIGEgU3BhcnNlVmVjdG9yLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsU3BhcnNlRXhhbXBsZSBGaXJzdCBleGFtcGxlCisKK0JlZm9yZSBkZXNjcmliaW5nIGVhY2ggaW5kaXZpZHVhbCBjbGFzcywgbGV0J3Mgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGljYWwgZXhhbXBsZTogc29sdmluZyB0aGUgTGFwbGFjZSBlcXVhdGlvbiBcZiQgXERlbHRhIHUgPSAwIFxmJCBvbiBhIHJlZ3VsYXIgMkQgZ3JpZCB1c2luZyBhIGZpbml0ZSBkaWZmZXJlbmNlIHNjaGVtZSBhbmQgRGlyaWNobGV0IGJvdW5kYXJ5IGNvbmRpdGlvbnMuCitTdWNoIHByb2JsZW0gY2FuIGJlIG1hdGhlbWF0aWNhbGx5IGV4cHJlc3NlZCBhcyBhIGxpbmVhciBwcm9ibGVtIG9mIHRoZSBmb3JtIFxmJCBBeD1iIFxmJCB3aGVyZSBcZiQgeCBcZiQgaXMgdGhlIHZlY3RvciBvZiBcYyBtIHVua25vd25zIChpbiBvdXIgY2FzZSwgdGhlIHZhbHVlcyBvZiB0aGUgcGl4ZWxzKSwgXGYkIGIgXGYkIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgdmVjdG9yIHJlc3VsdGluZyBmcm9tIHRoZSBib3VuZGFyeSBjb25kaXRpb25zLCBhbmQgXGYkIEEgXGYkIGlzIGFuIFxmJCBtIFx0aW1lcyBtIFxmJCBtYXRyaXggY29udGFpbmluZyBvbmx5IGEgZmV3IG5vbi16ZXJvIGVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBkaXNjcmV0aXphdGlvbiBvZiB0aGUgTGFwbGFjaWFuIG9wZXJhdG9yLgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuY3BwCis8L3RkPgorPHRkPgorXGltYWdlIGh0bWwgVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuanBlZworPC90ZD48L3RyPjwvdGFibGU+CisKK0luIHRoaXMgZXhhbXBsZSwgd2Ugc3RhcnQgYnkgZGVmaW5pbmcgYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCB0eXBlIG9mIGRvdWJsZSBcYyBTcGFyc2VNYXRyaXg8ZG91YmxlPiwgYW5kIGEgdHJpcGxldCBsaXN0IG9mIHRoZSBzYW1lIHNjYWxhciB0eXBlIFxjICBUcmlwbGV0PGRvdWJsZT4uIEEgdHJpcGxldCBpcyBhIHNpbXBsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbm9uLXplcm8gZW50cnkgYXMgdGhlIHRyaXBsZXQ6IFxjIHJvdyBpbmRleCwgXGMgY29sdW1uIGluZGV4LCBcYyB2YWx1ZS4KKworSW4gdGhlIG1haW4gZnVuY3Rpb24sIHdlIGRlY2xhcmUgYSBsaXN0IFxjIGNvZWZmaWNpZW50cyBvZiB0cmlwbGV0cyAoYXMgYSBzdGQgdmVjdG9yKSBhbmQgdGhlIHJpZ2h0IGhhbmQgc2lkZSB2ZWN0b3IgXGYkIGIgXGYkIHdoaWNoIGFyZSBmaWxsZWQgYnkgdGhlIFxhIGJ1aWxkUHJvYmxlbSBmdW5jdGlvbi4KK1RoZSByYXcgYW5kIGZsYXQgbGlzdCBvZiBub24temVybyBlbnRyaWVzIGlzIHRoZW4gY29udmVydGVkIHRvIGEgdHJ1ZSBTcGFyc2VNYXRyaXggb2JqZWN0IFxjIEEuCitOb3RlIHRoYXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGRvIG5vdCBoYXZlIHRvIGJlIHNvcnRlZCwgYW5kIHBvc3NpYmxlIGR1cGxpY2F0ZSBlbnRyaWVzIHdpbGwgYmUgc3VtbWVkIHVwLgorCitUaGUgbGFzdCBzdGVwIGNvbnNpc3RzIG9mIGVmZmVjdGl2ZWx5IHNvbHZpbmcgdGhlIGFzc2VtYmxlZCBwcm9ibGVtLgorU2luY2UgdGhlIHJlc3VsdGluZyBtYXRyaXggXGMgQSBpcyBzeW1tZXRyaWMgYnkgY29uc3RydWN0aW9uLCB3ZSBjYW4gcGVyZm9ybSBhIGRpcmVjdCBDaG9sZXNreSBmYWN0b3JpemF0aW9uIHZpYSB0aGUgU2ltcGxpY2lhbExETFQgY2xhc3Mgd2hpY2ggYmVoYXZlcyBsaWtlIGl0cyBMRExUIGNvdW50ZXJwYXJ0IGZvciBkZW5zZSBvYmplY3RzLgorCitUaGUgcmVzdWx0aW5nIHZlY3RvciBcYyB4IGNvbnRhaW5zIHRoZSBwaXhlbCB2YWx1ZXMgYXMgYSAxRCBhcnJheSB3aGljaCBpcyBzYXZlZCB0byBhIGpwZWcgZmlsZSBzaG93biBvbiB0aGUgcmlnaHQgb2YgdGhlIGNvZGUgYWJvdmUuCisKK0Rlc2NyaWJpbmcgdGhlIFxhIGJ1aWxkUHJvYmxlbSBhbmQgXGEgc2F2ZSBmdW5jdGlvbnMgaXMgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzIHR1dG9yaWFsLiBUaGV5IGFyZSBnaXZlbiBccmVmIFR1dG9yaWFsU3BhcnNlX2V4YW1wbGVfZGV0YWlscyAiaGVyZSIgZm9yIHRoZSBjdXJpb3VzIGFuZCByZXByb2R1Y2liaWxpdHkgcHVycG9zZS4KKworCisKKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VTcGFyc2VNYXRyaXggVGhlIFNwYXJzZU1hdHJpeCBjbGFzcworCitcYiAlTWF0cml4IFxiIGFuZCBcYiB2ZWN0b3IgXGIgcHJvcGVydGllcyBcbgorCitUaGUgU3BhcnNlTWF0cml4IGFuZCBTcGFyc2VWZWN0b3IgY2xhc3NlcyB0YWtlIHRocmVlIHRlbXBsYXRlIGFyZ3VtZW50czoKKyAqIHRoZSBzY2FsYXIgdHlwZSAoZS5nLiwgZG91YmxlKQorICogdGhlIHN0b3JhZ2Ugb3JkZXIgKENvbE1ham9yIG9yIFJvd01ham9yLCB0aGUgZGVmYXVsdCBpcyBDb2xNYWpvcikKKyAqIHRoZSBpbm5lciBpbmRleCB0eXBlIChkZWZhdWx0IGlzIFxjIGludCkuCisKK0FzIGZvciBkZW5zZSBNYXRyaXggb2JqZWN0cywgY29uc3RydWN0b3JzIHRha2VzIHRoZSBzaXplIG9mIHRoZSBvYmplY3QuCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorCitcY29kZQorU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4gPiBtYXQoMTAwMCwyMDAwKTsgICAgICAgICAvLyBkZWNsYXJlcyBhIDEwMDB4MjAwMCBjb2x1bW4tbWFqb3IgY29tcHJlc3NlZCBzcGFyc2UgbWF0cml4IG9mIGNvbXBsZXg8ZmxvYXQ+CitTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPiBtYXQoMTAwMCwyMDAwKTsgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIGEgMTAwMHgyMDAwIHJvdy1tYWpvciBjb21wcmVzc2VkIHNwYXJzZSBtYXRyaXggb2YgZG91YmxlCitTcGFyc2VWZWN0b3I8c3RkOjpjb21wbGV4PGZsb2F0PiA+IHZlYygxMDAwKTsgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIGEgY29sdW1uIHNwYXJzZSB2ZWN0b3Igb2YgY29tcGxleDxmbG9hdD4gb2Ygc2l6ZSAxMDAwCitTcGFyc2VWZWN0b3I8ZG91YmxlLFJvd01ham9yPiB2ZWMoMTAwMCk7ICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIGEgcm93IHNwYXJzZSB2ZWN0b3Igb2YgZG91YmxlIG9mIHNpemUgMTAwMAorXGVuZGNvZGUKKworSW4gdGhlIHJlc3Qgb2YgdGhlIHR1dG9yaWFsLCBcYyBtYXQgYW5kIFxjIHZlYyByZXByZXNlbnQgYW55IHNwYXJzZS1tYXRyaXggYW5kIHNwYXJzZS12ZWN0b3Igb2JqZWN0cywgcmVzcGVjdGl2ZWx5LgorCitUaGUgZGltZW5zaW9ucyBvZiBhIG1hdHJpeCBjYW4gYmUgcXVlcmllZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+U3RhbmRhcmQgXG4gZGltZW5zaW9uczwvdGQ+PHRkPlxjb2RlCittYXQucm93cygpCittYXQuY29scygpXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCit2ZWMuc2l6ZSgpIFxlbmRjb2RlPC90ZD4KKzwvdHI+Cis8dHI+PHRkPlNpemVzIGFsb25nIHRoZSBcbiBpbm5lci9vdXRlciBkaW1lbnNpb25zPC90ZD48dGQ+XGNvZGUKK21hdC5pbm5lclNpemUoKQorbWF0Lm91dGVyU2l6ZSgpXGVuZGNvZGU8L3RkPgorPHRkPjwvdGQ+Cis8L3RyPgorPHRyPjx0ZD5OdW1iZXIgb2Ygbm9uIFxuIHplcm8gY29lZmZpY2llbnRzPC90ZD48dGQ+XGNvZGUKK21hdC5ub25aZXJvcygpIFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQordmVjLm5vblplcm9zKCkgXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCisKK1xiIEl0ZXJhdGluZyBcYiBvdmVyIFxiIHRoZSBcYiBub256ZXJvIFxiIGNvZWZmaWNpZW50cyBcbgorCitSYW5kb20gYWNjZXNzIHRvIHRoZSBlbGVtZW50cyBvZiBhIHNwYXJzZSBvYmplY3QgY2FuIGJlIGRvbmUgdGhyb3VnaCB0aGUgXGMgY29lZmZSZWYoaSxqKSBmdW5jdGlvbi4KK0hvd2V2ZXIsIHRoaXMgZnVuY3Rpb24gaW52b2x2ZXMgYSBxdWl0ZSBleHBlbnNpdmUgYmluYXJ5IHNlYXJjaC4KK0luIG1vc3QgY2FzZXMsIG9uZSBvbmx5IHdhbnRzIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbm9uLXplcm9zIGVsZW1lbnRzLiBUaGlzIGlzIGFjaGlldmVkIGJ5IGEgc3RhbmRhcmQgbG9vcCBvdmVyIHRoZSBvdXRlciBkaW1lbnNpb24sIGFuZCB0aGVuIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBub24temVyb3Mgb2YgdGhlIGN1cnJlbnQgaW5uZXIgdmVjdG9yIHZpYSBhbiBJbm5lckl0ZXJhdG9yLiBUaHVzLCB0aGUgbm9uLXplcm8gZW50cmllcyBoYXZlIHRvIGJlIHZpc2l0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhbiB0aGUgc3RvcmFnZSBvcmRlci4KK0hlcmUgaXMgYW4gZXhhbXBsZToKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+CitcY29kZQorU3BhcnNlTWF0cml4PGRvdWJsZT4gbWF0KHJvd3MsY29scyk7Citmb3IgKGludCBrPTA7IGs8bWF0Lm91dGVyU2l6ZSgpOyArK2spCisgIGZvciAoU3BhcnNlTWF0cml4PGRvdWJsZT46OklubmVySXRlcmF0b3IgaXQobWF0LGspOyBpdDsgKytpdCkKKyAgeworICAgIGl0LnZhbHVlKCk7CisgICAgaXQucm93KCk7ICAgLy8gcm93IGluZGV4CisgICAgaXQuY29sKCk7ICAgLy8gY29sIGluZGV4IChoZXJlIGl0IGlzIGVxdWFsIHRvIGspCisgICAgaXQuaW5kZXgoKTsgLy8gaW5uZXIgaW5kZXgsIGhlcmUgaXQgaXMgZXF1YWwgdG8gaXQucm93KCkKKyAgfQorXGVuZGNvZGUKKzwvdGQ+PHRkPgorXGNvZGUKK1NwYXJzZVZlY3Rvcjxkb3VibGU+IHZlYyhzaXplKTsKK2ZvciAoU3BhcnNlVmVjdG9yPGRvdWJsZT46OklubmVySXRlcmF0b3IgaXQodmVjKTsgaXQ7ICsraXQpCit7CisgIGl0LnZhbHVlKCk7IC8vID09IHZlY1sgaXQuaW5kZXgoKSBdCisgIGl0LmluZGV4KCk7Cit9CitcZW5kY29kZQorPC90ZD48L3RyPgorPC90YWJsZT4KK0ZvciBhIHdyaXRhYmxlIGV4cHJlc3Npb24sIHRoZSByZWZlcmVuY2VkIHZhbHVlIGNhbiBiZSBtb2RpZmllZCB1c2luZyB0aGUgdmFsdWVSZWYoKSBmdW5jdGlvbi4KK0lmIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IG9yIHZlY3RvciBkZXBlbmRzIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyLCB0aGVuIHRoZSBcYyB0eXBlbmFtZSBrZXl3b3JkIGlzCityZXF1aXJlZCB0byBpbmRpY2F0ZSB0aGF0IFxjIElubmVySXRlcmF0b3IgZGVub3RlcyBhIHR5cGU7IHNlZSBccmVmIFRvcGljVGVtcGxhdGVLZXl3b3JkIGZvciBkZXRhaWxzLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsU3BhcnNlRmlsbGluZyBGaWxsaW5nIGEgc3BhcnNlIG1hdHJpeAorCitCZWNhdXNlIG9mIHRoZSBzcGVjaWFsIHN0b3JhZ2Ugc2NoZW1lIG9mIGEgU3BhcnNlTWF0cml4LCBzcGVjaWFsIGNhcmUgaGFzIHRvIGJlIHRha2VuIHdoZW4gYWRkaW5nIG5ldyBub256ZXJvIGVudHJpZXMuCitGb3IgaW5zdGFuY2UsIHRoZSBjb3N0IG9mIGEgc2luZ2xlIHB1cmVseSByYW5kb20gaW5zZXJ0aW9uIGludG8gYSBTcGFyc2VNYXRyaXggaXMgXGMgTyhubnopLCB3aGVyZSBcYyBubnogaXMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cy4KKworVGhlIHNpbXBsZXN0IHdheSB0byBjcmVhdGUgYSBzcGFyc2UgbWF0cml4IHdoaWxlIGd1YXJhbnRlZWluZyBnb29kIHBlcmZvcm1hbmNlIGlzIHRodXMgdG8gZmlyc3QgYnVpbGQgYSBsaXN0IG9mIHNvLWNhbGxlZCBcZW0gdHJpcGxldHMsIGFuZCB0aGVuIGNvbnZlcnQgaXQgdG8gYSBTcGFyc2VNYXRyaXguCisKK0hlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CitcY29kZQordHlwZWRlZiBFaWdlbjo6VHJpcGxldDxkb3VibGU+IFQ7CitzdGQ6OnZlY3RvcjxUPiB0cmlwbGV0TGlzdDsKK3RyaXBsZXRMaXN0LnJlc2VydmUoZXN0aW1hdGlvbl9vZl9lbnRyaWVzKTsKK2ZvciguLi4pCit7CisgIC8vIC4uLgorICB0cmlwbGV0TGlzdC5wdXNoX2JhY2soVChpLGosdl9paikpOworfQorU3BhcnNlTWF0cml4VHlwZSBtYXQocm93cyxjb2xzKTsKK21hdC5zZXRGcm9tVHJpcGxldHModHJpcGxldExpc3QuYmVnaW4oKSwgdHJpcGxldExpc3QuZW5kKCkpOworLy8gbWF0IGlzIHJlYWR5IHRvIGdvIQorXGVuZGNvZGUKK1RoZSBcYyBzdGQ6OnZlY3RvciBvZiB0cmlwbGV0cyBtaWdodCBjb250YWluIHRoZSBlbGVtZW50cyBpbiBhcmJpdHJhcnkgb3JkZXIsIGFuZCBtaWdodCBldmVuIGNvbnRhaW4gZHVwbGljYXRlZCBlbGVtZW50cyB0aGF0IHdpbGwgYmUgc3VtbWVkIHVwIGJ5IHNldEZyb21UcmlwbGV0cygpLgorU2VlIHRoZSBTcGFyc2VNYXRyaXg6OnNldEZyb21UcmlwbGV0cygpIGZ1bmN0aW9uIGFuZCBjbGFzcyBUcmlwbGV0IGZvciBtb3JlIGRldGFpbHMuCisKKworSW4gc29tZSBjYXNlcywgaG93ZXZlciwgc2xpZ2h0bHkgaGlnaGVyIHBlcmZvcm1hbmNlLCBhbmQgbG93ZXIgbWVtb3J5IGNvbnN1bXB0aW9uIGNhbiBiZSByZWFjaGVkIGJ5IGRpcmVjdGx5IGluc2VydGluZyB0aGUgbm9uLXplcm9zIGludG8gdGhlIGRlc3RpbmF0aW9uIG1hdHJpeC4KK0EgdHlwaWNhbCBzY2VuYXJpbyBvZiB0aGlzIGFwcHJvYWNoIGlzIGlsbHVzdHJhdGVkIGJlbGxvdzoKK1xjb2RlCisxOiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBtYXQocm93cyxjb2xzKTsgICAgICAgICAvLyBkZWZhdWx0IGlzIGNvbHVtbiBtYWpvcgorMjogbWF0LnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KGNvbHMsNikpOworMzogZm9yIGVhY2ggaSxqIHN1Y2ggdGhhdCB2X2lqICE9IDAKKzQ6ICAgbWF0Lmluc2VydChpLGopID0gdl9pajsgICAgICAgICAgICAgICAgICAgIC8vIGFsdGVybmF0aXZlOiBtYXQuY29lZmZSZWYoaSxqKSArPSB2X2lqOworNTogbWF0Lm1ha2VDb21wcmVzc2VkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKK1xlbmRjb2RlCisKKy0gVGhlIGtleSBpbmdyZWRpZW50IGhlcmUgaXMgdGhlIGxpbmUgMiB3aGVyZSB3ZSByZXNlcnZlIHJvb20gZm9yIDYgbm9uLXplcm9zIHBlciBjb2x1bW4uIEluIG1hbnkgY2FzZXMsIHRoZSBudW1iZXIgb2Ygbm9uLXplcm9zIHBlciBjb2x1bW4gb3Igcm93IGNhbiBlYXNpbHkgYmUga25vd24gaW4gYWR2YW5jZS4gSWYgaXQgdmFyaWVzIHNpZ25pZmljYW50bHkgZm9yIGVhY2ggaW5uZXIgdmVjdG9yLCB0aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSByZXNlcnZlIHNpemUgZm9yIGVhY2ggaW5uZXIgdmVjdG9yIGJ5IHByb3ZpZGluZyBhIHZlY3RvciBvYmplY3Qgd2l0aCBhbiBvcGVyYXRvcltdKGludCBqKSByZXR1cm5pbmcgdGhlIHJlc2VydmUgc2l6ZSBvZiB0aGUgXGMgai10aCBpbm5lciB2ZWN0b3IgKGUuZy4sIHZpYSBhIFZlY3RvclhpIG9yIHN0ZDo6dmVjdG9yPGludD4pLiBJZiBvbmx5IGEgcm91Z2h0IGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Ygbm9uemVyb3MgcGVyIGlubmVyLXZlY3RvciBjYW4gYmUgb2J0YWluZWQsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBvdmVyZXN0aW1hdGUgaXQgcmF0aGVyIHRoYW4gdGhlIG9wcG9zaXRlLiBJZiB0aGlzIGxpbmUgaXMgb21pdHRlZCwgdGhlbiB0aGUgZmlyc3QgaW5zZXJ0aW9uIG9mIGEgbmV3IGVsZW1lbnQgd2lsbCByZXNlcnZlIHJvb20gZm9yIDIgZWxlbWVudHMgcGVyIGlubmVyIHZlY3Rvci4KKy0gVGhlIGxpbmUgNCBwZXJmb3JtcyBhIHNvcnRlZCBpbnNlcnRpb24uIEluIHRoaXMgZXhhbXBsZSwgdGhlIGlkZWFsIGNhc2UgaXMgd2hlbiB0aGUgXGMgai10aCBjb2x1bW4gaXMgbm90IGZ1bGwgYW5kIGNvbnRhaW5zIG5vbi16ZXJvcyB3aG9zZSBpbm5lci1pbmRpY2VzIGFyZSBzbWFsbGVyIHRoYW4gXGMgaS4gSW4gdGhpcyBjYXNlLCB0aGlzIG9wZXJhdGlvbiBib2lscyBkb3duIHRvIHRyaXZpYWwgTygxKSBvcGVyYXRpb24uCistIFdoZW4gY2FsbGluZyBpbnNlcnQoaSxqKSB0aGUgZWxlbWVudCBcYyBpIFxjICxqIG11c3Qgbm90IGFscmVhZHkgZXhpc3RzLCBvdGhlcndpc2UgdXNlIHRoZSBjb2VmZlJlZihpLGopIG1ldGhvZCB0aGF0IHdpbGwgYWxsb3cgdG8sIGUuZy4sIGFjY3VtdWxhdGUgdmFsdWVzLiBUaGlzIG1ldGhvZCBmaXJzdCBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIGZpbmFsbHkgY2FsbHMgaW5zZXJ0KGksaikgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gSXQgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGluc2VydCgpIGJ1dCBhbHNvIG1vcmUgY29zdGx5LgorLSBUaGUgbGluZSA1IHN1cHByZXNzZXMgdGhlIHJlbWFpbmluZyBlbXB0eSBzcGFjZSBhbmQgdHJhbnNmb3JtcyB0aGUgbWF0cml4IGludG8gYSBjb21wcmVzc2VkIGNvbHVtbiBzdG9yYWdlLgorCisKKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VGZWF0dXJlU2V0IFN1cHBvcnRlZCBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucworCitCZWNhdXNlIG9mIHRoZWlyIHNwZWNpYWwgc3RvcmFnZSBmb3JtYXQsIHNwYXJzZSBtYXRyaWNlcyBjYW5ub3Qgb2ZmZXIgdGhlIHNhbWUgbGV2ZWwgb2YgZmxleGliaWxpdHkgdGhhbiBkZW5zZSBtYXRyaWNlcy4KK0luIEVpZ2VuJ3Mgc3BhcnNlIG1vZHVsZSB3ZSBjaG9zZSB0byBleHBvc2Ugb25seSB0aGUgc3Vic2V0IG9mIHRoZSBkZW5zZSBtYXRyaXggQVBJIHdoaWNoIGNhbiBiZSBlZmZpY2llbnRseSBpbXBsZW1lbnRlZC4KK0luIHRoZSBmb2xsb3dpbmcgXGVtIHNtIGRlbm90ZXMgYSBzcGFyc2UgbWF0cml4LCBcZW0gc3YgYSBzcGFyc2UgdmVjdG9yLCBcZW0gZG0gYSBkZW5zZSBtYXRyaXgsIGFuZCBcZW0gZHYgYSBkZW5zZSB2ZWN0b3IuCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlX0Jhc2ljT3BzIEJhc2ljIG9wZXJhdGlvbnMKKworJVNwYXJzZSBleHByZXNzaW9ucyBzdXBwb3J0IG1vc3Qgb2YgdGhlIHVuYXJ5IGFuZCBiaW5hcnkgY29lZmZpY2llbnQgd2lzZSBvcGVyYXRpb25zOgorXGNvZGUKK3NtMS5yZWFsKCkgICBzbTEuaW1hZygpICAgLXNtMSAgICAgICAgICAgICAgICAgICAgMC41KnNtMQorc20xK3NtMiAgICAgIHNtMS1zbTIgICAgICBzbTEuY3dpc2VQcm9kdWN0KHNtMikKK1xlbmRjb2RlCitIb3dldmVyLCA8c3Ryb25nPmEgc3Ryb25nIHJlc3RyaWN0aW9uIGlzIHRoYXQgdGhlIHN0b3JhZ2Ugb3JkZXJzIG11c3QgbWF0Y2g8L3N0cm9uZz4uIEZvciBpbnN0YW5jZSwgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorXGNvZGUKK3NtNCA9IHNtMSArIHNtMiArIHNtMzsKK1xlbmRjb2RlCitzbTEsIHNtMiwgYW5kIHNtMyBtdXN0IGFsbCBiZSByb3ctbWFqb3Igb3IgYWxsIGNvbHVtbi1tYWpvci4KK09uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgdGFyZ2V0IG1hdHJpeCBzbTQuCitGb3IgaW5zdGFuY2UsIHRoaXMgbWVhbnMgdGhhdCBmb3IgY29tcHV0aW5nIFxmJCBBXlQgKyBBIFxmJCwgdGhlIG1hdHJpeCBcZiQgQV5UIFxmJCBtdXN0IGJlIGV2YWx1YXRlZCBpbnRvIGEgdGVtcG9yYXJ5IG1hdHJpeCBvZiBjb21wYXRpYmxlIHN0b3JhZ2Ugb3JkZXI6CitcY29kZQorU3BhcnNlTWF0cml4PGRvdWJsZT4gQSwgQjsKK0IgPSBTcGFyc2VNYXRyaXg8ZG91YmxlPihBLnRyYW5zcG9zZSgpKSArIEE7CitcZW5kY29kZQorCitCaW5hcnkgY29lZmZpY2llbnQgd2lzZSBvcGVyYXRvcnMgY2FuIGFsc28gbWl4IHNwYXJzZSBhbmQgZGVuc2UgZXhwcmVzc2lvbnM6CitcY29kZQorc20yID0gc20xLmN3aXNlUHJvZHVjdChkbTEpOworZG0yID0gc20xICsgZG0xOworZG0yID0gZG0xIC0gc20xOworXGVuZGNvZGUKK1BlcmZvcm1hbmNlLXdpc2UsIHRoZSBhZGRpbmcvc3VidHJhY3Rpbmcgc3BhcnNlIGFuZCBkZW5zZSBtYXRyaWNlcyBpcyBiZXR0ZXIgcGVyZm9ybWVkIGluIHR3byBzdGVwcy4gRm9yIGluc3RhbmNlLCBpbnN0ZWFkIG9mIGRvaW5nIDx0dD5kbTIgPSBzbTEgKyBkbTE8L3R0PiwgYmV0dGVyIHdyaXRlOgorXGNvZGUKK2RtMiA9IGRtMTsKK2RtMiArPSBzbTE7CitcZW5kY29kZQorVGhpcyB2ZXJzaW9uIGhhcyB0aGUgYWR2YW50YWdlIHRvIGZ1bGx5IGV4cGxvaXQgdGhlIGhpZ2hlciBwZXJmb3JtYW5jZSBvZiBkZW5zZSBzdG9yYWdlIChubyBpbmRpcmVjdGlvbiwgU0lNRCwgZXRjLiksIGFuZCB0byBwYXkgdGhlIGNvc3Qgb2Ygc2xvdyBzcGFyc2UgZXZhbHVhdGlvbiBvbiB0aGUgZmV3IG5vbi16ZXJvcyBvZiB0aGUgc3BhcnNlIG1hdHJpeCBvbmx5LgorCisKKyVTcGFyc2UgZXhwcmVzc2lvbnMgYWxzbyBzdXBwb3J0IHRyYW5zcG9zaXRpb246CitcY29kZQorc20xID0gc20yLnRyYW5zcG9zZSgpOworc20xID0gc20yLmFkam9pbnQoKTsKK1xlbmRjb2RlCitIb3dldmVyLCB0aGVyZSBpcyBubyB0cmFuc3Bvc2VJblBsYWNlKCkgbWV0aG9kLgorCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlX1Byb2R1Y3RzIE1hdHJpeCBwcm9kdWN0cworCislRWlnZW4gc3VwcG9ydHMgdmFyaW91cyBraW5kIG9mIHNwYXJzZSBtYXRyaXggcHJvZHVjdHMgd2hpY2ggYXJlIHN1bW1hcml6ZSBiZWxvdzoKKyAgLSBcYiBzcGFyc2UtZGVuc2U6CisgICAgXGNvZGUKK2R2MiA9IHNtMSAqIGR2MTsKK2RtMiA9IGRtMSAqIHNtMS5hZGpvaW50KCk7CitkbTIgPSAyLiAqIHNtMSAqIGRtMTsKKyAgICBcZW5kY29kZQorICAtIFxiIHN5bW1ldHJpYyBcYiBzcGFyc2UtZGVuc2UuIFRoZSBwcm9kdWN0IG9mIGEgc3BhcnNlIHN5bW1ldHJpYyBtYXRyaXggd2l0aCBhIGRlbnNlIG1hdHJpeCAob3IgdmVjdG9yKSBjYW4gYWxzbyBiZSBvcHRpbWl6ZWQgYnkgc3BlY2lmeWluZyB0aGUgc3ltbWV0cnkgd2l0aCBzZWxmYWRqb2ludFZpZXcoKToKKyAgICBcY29kZQorZG0yID0gc20xLnNlbGZhZGpvaW50Vmlldzw+KCkgKiBkbTE7ICAgICAgICAvLyBpZiBhbGwgY29lZmZpY2llbnRzIG9mIEEgYXJlIHN0b3JlZAorZG0yID0gQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBkbTE7ICAgICAvLyBpZiBvbmx5IHRoZSB1cHBlciBwYXJ0IG9mIEEgaXMgc3RvcmVkCitkbTIgPSBBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGRtMTsgICAgIC8vIGlmIG9ubHkgdGhlIGxvd2VyIHBhcnQgb2YgQSBpcyBzdG9yZWQKKyAgICBcZW5kY29kZQorICAtIFxiIHNwYXJzZS1zcGFyc2UuIEZvciBzcGFyc2Utc3BhcnNlIHByb2R1Y3RzLCB0d28gZGlmZmVyZW50IGFsZ29yaXRobXMgYXJlIGF2YWlsYWJsZS4gVGhlIGRlZmF1bHQgb25lIGlzIGNvbnNlcnZhdGl2ZSBhbmQgcHJlc2VydmUgdGhlIGV4cGxpY2l0IHplcm9zIHRoYXQgbWlnaHQgYXBwZWFyOgorICAgIFxjb2RlCitzbTMgPSBzbTEgKiBzbTI7CitzbTMgPSA0ICogc20xLmFkam9pbnQoKSAqIHNtMjsKKyAgICBcZW5kY29kZQorICAgIFRoZSBzZWNvbmQgYWxnb3JpdGhtIHBydW5lcyBvbiB0aGUgZmx5IHRoZSBleHBsaWNpdCB6ZXJvcywgb3IgdGhlIHZhbHVlcyBzbWFsbGVyIHRoYW4gYSBnaXZlbiB0aHJlc2hvbGQuIEl0IGlzIGVuYWJsZWQgYW5kIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgcHJ1bmUoKSBmdW5jdGlvbnM6CisgICAgXGNvZGUKK3NtMyA9IChzbTEgKiBzbTIpLnBydW5lZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgbnVtZXJpY2FsIHplcm9zCitzbTMgPSAoc20xICogc20yKS5wcnVuZWQocmVmKTsgICAgICAgICAgICAgICAvLyByZW1vdmVzIGVsZW1lbnRzIG11Y2ggc21hbGxlciB0aGFuIHJlZgorc20zID0gKHNtMSAqIHNtMikucHJ1bmVkKHJlZixlcHNpbG9uKTsgICAgICAgLy8gcmVtb3ZlcyBlbGVtZW50cyBzbWFsbGVyIHRoYW4gcmVmKmVwc2lsb24KKyAgICBcZW5kY29kZQorCisgIC0gXGIgcGVybXV0YXRpb25zLiBGaW5hbGx5LCBwZXJtdXRhdGlvbnMgY2FuIGJlIGFwcGxpZWQgdG8gc3BhcnNlIG1hdHJpY2VzIHRvbzoKKyAgICBcY29kZQorUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljPiBQID0gLi4uOworc20yID0gUCAqIHNtMTsKK3NtMiA9IHNtMSAqIFAuaW52ZXJzZSgpOworc20yID0gc20xLnRyYW5zcG9zZSgpICogUDsKKyAgICBcZW5kY29kZQorCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlX1N1Yk1hdHJpY2VzIEJsb2NrIG9wZXJhdGlvbnMKKworUmVnYXJkaW5nIHJlYWQtYWNjZXNzLCBzcGFyc2UgbWF0cmljZXMgZXhwb3NlIHRoZSBzYW1lIEFQSSB0aGFuIGZvciBkZW5zZSBtYXRyaWNlcyB0byBhY2Nlc3MgdG8gc3ViLW1hdHJpY2VzIHN1Y2ggYXMgYmxvY2tzLCBjb2x1bW5zLCBhbmQgcm93cy4gU2VlIFxyZWYgVHV0b3JpYWxCbG9ja09wZXJhdGlvbnMgZm9yIGEgZGV0YWlsZWQgaW50cm9kdWN0aW9uLgorSG93ZXZlciwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdyaXRpbmcgdG8gYSBzdWItc3BhcnNlLW1hdHJpeCBpcyBtdWNoIG1vcmUgbGltaXRlZCwgYW5kIGN1cnJlbnRseSBvbmx5IGNvbnRpZ3VvdXMgc2V0cyBvZiBjb2x1bW5zIChyZXNwLiByb3dzKSBvZiBhIGNvbHVtbi1tYWpvciAocmVzcC4gcm93LW1ham9yKSBTcGFyc2VNYXRyaXggYXJlIHdyaXRhYmxlLiBNb3Jlb3ZlciwgdGhpcyBpbmZvcm1hdGlvbiBoYXMgdG8gYmUga25vd24gYXQgY29tcGlsZS10aW1lLCBsZWF2aW5nIG91dCBtZXRob2RzIHN1Y2ggYXMgPHR0PmJsb2NrKC4uLik8L3R0PiBhbmQgPHR0PmNvcm5lciooLi4uKTwvdHQ+LiBUaGUgYXZhaWxhYmxlIEFQSSBmb3Igd3JpdGUtYWNjZXNzIHRvIGEgU3BhcnNlTWF0cml4IGFyZSBzdW1tYXJpemVkIGJlbG93OgorXGNvZGUKK1NwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3I+IHNtMTsKK3NtMS5jb2woaikgPSAuLi47CitzbTEubGVmdENvbHMobmNvbHMpID0gLi4uOworc20xLm1pZGRsZUNvbHMoaixuY29scykgPSAuLi47CitzbTEucmlnaHRDb2xzKG5jb2xzKSA9IC4uLjsKKworU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gc20yOworc20yLnJvdyhpKSA9IC4uLjsKK3NtMi50b3BSb3dzKG5yb3dzKSA9IC4uLjsKK3NtMi5taWRkbGVSb3dzKGksbnJvd3MpID0gLi4uOworc20yLmJvdHRvbVJvd3MobnJvd3MpID0gLi4uOworXGVuZGNvZGUKKworSW4gYWRkaXRpb24sIHNwYXJzZSBtYXRyaWNlcyBleHBvc2UgdGhlIFNwYXJzZU1hdHJpeEJhc2U6OmlubmVyVmVjdG9yKCkgYW5kIFNwYXJzZU1hdHJpeEJhc2U6OmlubmVyVmVjdG9ycygpIG1ldGhvZHMsIHdoaWNoIGFyZSBhbGlhc2VzIHRvIHRoZSBjb2wvbWlkZGxlQ29scyBtZXRob2RzIGZvciBhIGNvbHVtbi1tYWpvciBzdG9yYWdlLCBhbmQgdG8gdGhlIHJvdy9taWRkbGVSb3dzIG1ldGhvZHMgZm9yIGEgcm93LW1ham9yIHN0b3JhZ2UuCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlX1RyaWFuZ3VsYXJTZWxmYWRqb2ludCBUcmlhbmd1bGFyIGFuZCBzZWxmYWRqb2ludCB2aWV3cworCitKdXN0IGFzIHdpdGggZGVuc2UgbWF0cmljZXMsIHRoZSB0cmlhbmd1bGFyVmlldygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFkZHJlc3MgYSB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCwgYW5kIHBlcmZvcm0gdHJpYW5ndWxhciBzb2x2ZXMgd2l0aCBhIGRlbnNlIHJpZ2h0IGhhbmQgc2lkZToKK1xjb2RlCitkbTIgPSBzbTEudHJpYW5ndWxhclZpZXc8TG93ZXI+KGRtMSk7CitkdjIgPSBzbTEudHJhbnNwb3NlKCkudHJpYW5ndWxhclZpZXc8VXBwZXI+KGR2MSk7CitcZW5kY29kZQorCitUaGUgc2VsZmFkam9pbnRWaWV3KCkgZnVuY3Rpb24gcGVybWl0cyB2YXJpb3VzIG9wZXJhdGlvbnM6CisgLSBvcHRpbWl6ZWQgc3BhcnNlLWRlbnNlIG1hdHJpeCBwcm9kdWN0czoKKyAgICBcY29kZQorZG0yID0gc20xLnNlbGZhZGpvaW50Vmlldzw+KCkgKiBkbTE7ICAgICAgICAvLyBpZiBhbGwgY29lZmZpY2llbnRzIG9mIEEgYXJlIHN0b3JlZAorZG0yID0gQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBkbTE7ICAgICAvLyBpZiBvbmx5IHRoZSB1cHBlciBwYXJ0IG9mIEEgaXMgc3RvcmVkCitkbTIgPSBBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGRtMTsgICAgIC8vIGlmIG9ubHkgdGhlIGxvd2VyIHBhcnQgb2YgQSBpcyBzdG9yZWQKKyAgICBcZW5kY29kZQorIC0gY29weSBvZiB0cmlhbmd1bGFyIHBhcnRzOgorICAgIFxjb2RlCitzbTIgPSBzbTEuc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZ1bGwgc2VsZmFkam9pbnQgbWF0cml4IGZyb20gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydAorc20yLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IHNtMS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7ICAgICAgLy8gY29waWVzIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgdG8gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydAorICAgIFxlbmRjb2RlCisgLSBhcHBsaWNhdGlvbiBvZiBzeW1tZXRyaWMgcGVybXV0YXRpb25zOgorIFxjb2RlCitQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWM+IFAgPSAuLi47CitzbTIgPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkoUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIFAgUyBQJyBmcm9tIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSwgYW5kIG1ha2UgaXQgYSBmdWxsIG1hdHJpeAorc20yLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShQKTsgICAgICAgLy8gY29tcHV0ZSBQIFMgUCcgZnJvbSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEsIGFuZCB0aGVuIG9ubHkgY29tcHV0ZSB0aGUgbG93ZXIgcGFydAorIFxlbmRjb2RlCisKK1BsZWFzZSwgcmVmZXIgdG8gdGhlIFxsaW5rIFNwYXJzZVF1aWNrUmVmUGFnZSBRdWljayBSZWZlcmVuY2UgXGVuZGxpbmsgIGd1aWRlIGZvciB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgb3BlcmF0aW9ucy4gVGhlIGxpc3Qgb2YgbGluZWFyIHNvbHZlcnMgYXZhaWxhYmxlIGlzIFxsaW5rIFRvcGljU3BhcnNlU3lzdGVtcyBoZXJlLiBcZW5kbGluaworCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmRveCBiL2RvYy9UdXRvcmlhbFNwYXJzZV9leGFtcGxlX2RldGFpbHMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzhkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmRveApAQCAtMCwwICsxLDQgQEAKKy8qKgorXHBhZ2UgVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzCitcaW5jbHVkZSBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmNwcAorKi8KZGlmZiAtLWdpdCBhL2RvYy9VbmFsaWduZWRBcnJheUFzc2VydC5kb3ggYi9kb2MvVW5hbGlnbmVkQXJyYXlBc3NlcnQuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZDk1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVW5hbGlnbmVkQXJyYXlBc3NlcnQuZG94CkBAIC0wLDAgKzEsMTIwIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUb3BpY1VuYWxpZ25lZEFycmF5QXNzZXJ0IEV4cGxhbmF0aW9uIG9mIHRoZSBhc3NlcnRpb24gb24gdW5hbGlnbmVkIGFycmF5cworCitIZWxsbyEgWW91IGFyZSBzZWVpbmcgdGhpcyB3ZWJwYWdlIGJlY2F1c2UgeW91ciBwcm9ncmFtIHRlcm1pbmF0ZWQgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUgbGlrZSB0aGlzIG9uZToKKzxwcmU+CitteV9wcm9ncmFtOiBwYXRoL3RvL2VpZ2VuL0VpZ2VuL3NyYy9Db3JlL0RlbnNlU3RvcmFnZS5oOjQ0OgorRWlnZW46OmludGVybmFsOjptYXRyaXhfYXJyYXk8VCwgU2l6ZSwgTWF0cml4T3B0aW9ucywgQWxpZ24+OjppbnRlcm5hbDo6bWF0cml4X2FycmF5KCkKK1t3aXRoIFQgPSBkb3VibGUsIGludCBTaXplID0gMiwgaW50IE1hdHJpeE9wdGlvbnMgPSAyLCBib29sIEFsaWduID0gdHJ1ZV06CitBc3NlcnRpb24gYChyZWludGVycHJldF9jYXN0PHNpemVfdD4oYXJyYXkpICYgKHNpemVtYXNrKSkgPT0gMCAmJiAidGhpcyBhc3NlcnRpb24KK2lzIGV4cGxhaW5lZCBoZXJlOiBodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9kb3gtZGV2ZWwvZ3JvdXBfX1RvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQuaHRtbAorKioqKiBSRUFEIFRISVMgV0VCIFBBR0UgISEhICoqKioiJyBmYWlsZWQuCis8L3ByZT4KKworVGhlcmUgYXJlIDQga25vd24gY2F1c2VzIGZvciB0aGlzIGlzc3VlLiBQbGVhc2UgcmVhZCBvbiB0byB1bmRlcnN0YW5kIHRoZW0gYW5kIGxlYXJuIGhvdyB0byBmaXggdGhlbS4KKworXGVpZ2VuQXV0b1RvYworCitcc2VjdGlvbiB3aGVyZSBXaGVyZSBpbiBteSBvd24gY29kZSBpcyB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0/CisKK0ZpcnN0IG9mIGFsbCwgeW91IG5lZWQgdG8gZmluZCBvdXQgd2hlcmUgaW4geW91ciBvd24gY29kZSB0aGlzIGFzc2VydGlvbiB3YXMgdHJpZ2dlcmVkIGZyb20uIEF0IGZpcnN0IGdsYW5jZSwgdGhlIGVycm9yIG1lc3NhZ2UgZG9lc24ndCBsb29rIGhlbHBmdWwsIGFzIGl0IHJlZmVycyB0byBhIGZpbGUgaW5zaWRlIEVpZ2VuISBIb3dldmVyLCBzaW5jZSB5b3VyIHByb2dyYW0gY3Jhc2hlZCwgaWYgeW91IGNhbiByZXByb2R1Y2UgdGhlIGNyYXNoLCB5b3UgY2FuIGdldCBhIGJhY2t0cmFjZSB1c2luZyBhbnkgZGVidWdnZXIuIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdXNpbmcgR0NDLCB5b3UgY2FuIHVzZSB0aGUgR0RCIGRlYnVnZ2VyIGFzIGZvbGxvd3M6CitcY29kZQorJCBnZGIgLi9teV9wcm9ncmFtICAgICAgICAgICMgU3RhcnQgR0RCIG9uIHlvdXIgcHJvZ3JhbQorPiBydW4gICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcnVubmluZyB5b3VyIHByb2dyYW0KKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdyByZXByb2R1Y2UgdGhlIGNyYXNoIQorPiBidCAgICAgICAgICAgICAgICAgICAgICAgICMgT2J0YWluIHRoZSBiYWNrdHJhY2UKK1xlbmRjb2RlCitOb3cgdGhhdCB5b3Uga25vdyBwcmVjaXNlbHkgd2hlcmUgaW4geW91ciBvd24gY29kZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcsIHJlYWQgb24gdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBuZWVkIHRvIGNoYW5nZS4KKworXHNlY3Rpb24gYzEgQ2F1c2UgMTogU3RydWN0dXJlcyBoYXZpbmcgRWlnZW4gb2JqZWN0cyBhcyBtZW1iZXJzCisKK0lmIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzLAorCitcY29kZQorY2xhc3MgRm9vCit7CisgIC8vLi4uCisgIEVpZ2VuOjpWZWN0b3IyZCB2OworICAvLy4uLgorfTsKKy8vLi4uCitGb28gKmZvbyA9IG5ldyBGb287CitcZW5kY29kZQorCit0aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhpcyBzZXBhcmF0ZSBwYWdlOiBccmVmIFRvcGljU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzICJTdHJ1Y3R1cmVzIEhhdmluZyBFaWdlbiBNZW1iZXJzIi4KKworTm90ZSB0aGF0IGhlcmUsIEVpZ2VuOjpWZWN0b3IyZCBpcyBvbmx5IHVzZWQgYXMgYW4gZXhhbXBsZSwgbW9yZSBnZW5lcmFsbHkgdGhlIGlzc3VlIGFyaXNlcyBmb3IgYWxsIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIi4KKworXHNlY3Rpb24gYzIgQ2F1c2UgMjogU1RMIENvbnRhaW5lcnMgb3IgbWFudWFsIG1lbW9yeSBhbGxvY2F0aW9uCisKK0lmIHlvdSB1c2UgU1RMIENvbnRhaW5lcnMgc3VjaCBhcyBzdGQ6OnZlY3Rvciwgc3RkOjptYXAsIC4uLiwgd2l0aCAlRWlnZW4gb2JqZWN0cywgb3Igd2l0aCBjbGFzc2VzIGNvbnRhaW5pbmcgJUVpZ2VuIG9iamVjdHMsIGxpa2UgdGhpcywKKworXGNvZGUKK3N0ZDo6dmVjdG9yPEVpZ2VuOjpNYXRyaXgyZj4gbXlfdmVjdG9yOworc3RydWN0IG15X2NsYXNzIHsgLi4uIEVpZ2VuOjpNYXRyaXgyZiBtOyAuLi4gfTsKK3N0ZDo6bWFwPGludCwgbXlfY2xhc3M+IG15X21hcDsKK1xlbmRjb2RlCisKK3RoZW4geW91IG5lZWQgdG8gcmVhZCB0aGlzIHNlcGFyYXRlIHBhZ2U6IFxyZWYgVG9waWNTdGxDb250YWluZXJzICJVc2luZyBTVEwgQ29udGFpbmVycyB3aXRoIEVpZ2VuIi4KKworTm90ZSB0aGF0IGhlcmUsIEVpZ2VuOjpNYXRyaXgyZiBpcyBvbmx5IHVzZWQgYXMgYW4gZXhhbXBsZSwgbW9yZSBnZW5lcmFsbHkgdGhlIGlzc3VlIGFyaXNlcyBmb3IgYWxsIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIiBhbmQgXHJlZiBUb3BpY1N0cnVjdEhhdmluZ0VpZ2VuTWVtYmVycyAic3RydWN0dXJlcyBoYXZpbmcgc3VjaCBFaWdlbiBvYmplY3RzIGFzIG1lbWJlciIuCisKK1RoZSBzYW1lIGlzc3VlIHdpbGwgYmUgZXhoaWJpdGVkIGJ5IGFueSBjbGFzc2VzL2Z1bmN0aW9ucyBieS1wYXNzaW5nIG9wZXJhdG9yIG5ldyB0byBhbGxvY2F0ZSBtZW1vcnksIHRoYXQgaXMsIGJ5IHBlcmZvcm1pbmcgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHRoZSBwbGFjZW1lbnQgbmV3IG9wZXJhdG9yLiBUaGlzIGlzIGZvciBpbnN0YW5jZSB0eXBpY2FsbHkgdGhlIGNhc2Ugb2YgXGMgc3RkOjptYWtlX3NoYXJlZCBvciBcYyBzdGQ6OmFsbG9jYXRlX3NoYXJlZCBmb3Igd2hpY2ggaXMgdGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBhbiBccmVmIGFsaWduZWRfYWxsb2NhdG9yICJhbGlnbmVkIGFsbG9jYXRvciIgYXMgZGV0YWlsZWQgaW4gdGhlIFxyZWYgVG9waWNTdGxDb250YWluZXJzICJzb2x1dGlvbiBmb3IgU1RMIGNvbnRhaW5lcnMiLgorCitcc2VjdGlvbiBjMyBDYXVzZSAzOiBQYXNzaW5nIEVpZ2VuIG9iamVjdHMgYnkgdmFsdWUKKworSWYgc29tZSBmdW5jdGlvbiBpbiB5b3VyIGNvZGUgaXMgZ2V0dGluZyBhbiBFaWdlbiBvYmplY3QgcGFzc2VkIGJ5IHZhbHVlLCBsaWtlIHRoaXMsCisKK1xjb2RlCit2b2lkIGZ1bmMoRWlnZW46OlZlY3RvcjRkIHYpOworXGVuZGNvZGUKKwordGhlbiB5b3UgbmVlZCB0byByZWFkIHRoaXMgc2VwYXJhdGUgcGFnZTogXHJlZiBUb3BpY1Bhc3NpbmdCeVZhbHVlICJQYXNzaW5nIEVpZ2VuIG9iamVjdHMgYnkgdmFsdWUgdG8gZnVuY3Rpb25zIi4KKworTm90ZSB0aGF0IGhlcmUsIEVpZ2VuOjpWZWN0b3I0ZCBpcyBvbmx5IHVzZWQgYXMgYW4gZXhhbXBsZSwgbW9yZSBnZW5lcmFsbHkgdGhlIGlzc3VlIGFyaXNlcyBmb3IgYWxsIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIi4KKworXHNlY3Rpb24gYzQgQ2F1c2UgNDogQ29tcGlsZXIgbWFraW5nIGEgd3JvbmcgYXNzdW1wdGlvbiBvbiBzdGFjayBhbGlnbm1lbnQgKGZvciBpbnN0YW5jZSBHQ0Mgb24gV2luZG93cykKKworVGhpcyBpcyBhIG11c3QtcmVhZCBmb3IgcGVvcGxlIHVzaW5nIEdDQyBvbiBXaW5kb3dzIChsaWtlIE1pbkdXIG9yIFRETS1HQ0MpLiBJZiB5b3UgaGF2ZSB0aGlzIGFzc2VydGlvbiBmYWlsdXJlIGluIGFuIGlubm9jZW50IGZ1bmN0aW9uIGRlY2xhcmluZyBhIGxvY2FsIHZhcmlhYmxlIGxpa2UgdGhpczoKKworXGNvZGUKK3ZvaWQgZm9vKCkKK3sKKyAgRWlnZW46OlF1YXRlcm5pb25mIHE7CisgIC8vLi4uCit9CitcZW5kY29kZQorCit0aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhpcyBzZXBhcmF0ZSBwYWdlOiBccmVmIFRvcGljV3JvbmdTdGFja0FsaWdubWVudCAiQ29tcGlsZXIgbWFraW5nIGEgd3JvbmcgYXNzdW1wdGlvbiBvbiBzdGFjayBhbGlnbm1lbnQiLgorCitOb3RlIHRoYXQgaGVyZSwgRWlnZW46OlF1YXRlcm5pb25mIGlzIG9ubHkgdXNlZCBhcyBhbiBleGFtcGxlLCBtb3JlIGdlbmVyYWxseSB0aGUgaXNzdWUgYXJpc2VzIGZvciBhbGwgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiLgorCitcc2VjdGlvbiBleHBsYW5hdGlvbiBHZW5lcmFsIGV4cGxhbmF0aW9uIG9mIHRoaXMgYXNzZXJ0aW9uCisKK1xyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIG9iamVjdHMiIG11c3QgYWJzb2x1dGVseSBiZSBjcmVhdGVkIGF0IDE2LWJ5dGUtYWxpZ25lZCBsb2NhdGlvbnMsIG90aGVyd2lzZSBTSU1EIGluc3RydWN0aW9ucyBhZGRyZXNzaW5nIHRoZW0gd2lsbCBjcmFzaC4KKworRWlnZW4gbm9ybWFsbHkgdGFrZXMgY2FyZSBvZiB0aGVzZSBhbGlnbm1lbnQgaXNzdWVzIGZvciB5b3UsIGJ5IHNldHRpbmcgYW4gYWxpZ25tZW50IGF0dHJpYnV0ZSBvbiB0aGVtIGFuZCBieSBvdmVybG9hZGluZyB0aGVpciAib3BlcmF0b3IgbmV3Ii4KKworSG93ZXZlciB0aGVyZSBhcmUgYSBmZXcgY29ybmVyIGNhc2VzIHdoZXJlIHRoZXNlIGFsaWdubWVudCBzZXR0aW5ncyBnZXQgb3ZlcnJpZGRlbjogdGhleSBhcmUgdGhlIHBvc3NpYmxlIGNhdXNlcyBmb3IgdGhpcyBhc3NlcnRpb24uCisKK1xzZWN0aW9uIGdldHJpZCBJIGRvbid0IGNhcmUgYWJvdXQgb3B0aW1hbCB2ZWN0b3JpemF0aW9uLCBob3cgZG8gSSBnZXQgcmlkIG9mIHRoYXQgc3R1ZmY/CisKK1RocmVlIHBvc3NpYmlsaXRpZXM6Cis8dWw+CisgIDxsaT5Vc2UgdGhlIFxjIERvbnRBbGlnbiBvcHRpb24gdG8gTWF0cml4LCBBcnJheSwgUXVhdGVybmlvbiwgZXRjLiBvYmplY3RzIHRoYXQgZ2l2ZXMgeW91IHRyb3VibGUuIFRoaXMgd2F5IEVpZ2VuIHdvbid0IHRyeSB0byBhbGlnbiB0aGVtLCBhbmQgdGh1cyB3b24idCBhc3N1bWUgYW55IHNwZWNpYWwgYWxpZ25tZW50LiBPbiB0aGUgZG93biBzaWRlLCB5b3Ugd2lsbCBwYXkgdGhlIGNvc3Qgb2YgdW5hbGlnbmVkIGxvYWRzL3N0b3JlcyBmb3IgdGhlbSwgYnV0IG9uIG1vZGVybiBDUFVzLCB0aGUgb3ZlcmhlYWQgaXMgZWl0aGVyIG51bGwgb3IgbWFyZ2luYWwuIFNlZSBcbGluayBTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnNfb3RoZXJzb2x1dGlvbnMgaGVyZSBcZW5kbGluayBmb3IgYW4gZXhhbXBsZS48L2xpPgorICA8bGk+RGVmaW5lIFxsaW5rIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc1BlcmZvcm1hbmNlIEVJR0VOX0RPTlRfQUxJR05fU1RBVElDQUxMWSBcZW5kbGluay4gVGhhdCBkaXNhYmxlcyBhbGwgMTYtYnl0ZSAoYW5kIGFib3ZlKSBzdGF0aWMgYWxpZ25tZW50IGNvZGUsIHdoaWxlIGtlZXBpbmcgMTYtYnl0ZSAob3IgYWJvdmUpIGhlYXAgYWxpZ25tZW50LiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mCisgICAgICB2ZWN0b3JpemluZyBmaXhlZC1zaXplIG9iamVjdHMgKGxpa2UgTWF0cml4NGQpIHRocm91Z2ggdW5hbGlnbmVkIHN0b3JlcyAoYXMgY29udHJvbGxlZCBieSBcbGluayBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNQZXJmb3JtYW5jZSBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFIFxlbmRsaW5rKSwgd2hpbGUga2VlcGluZyB1bmNoYW5nZWQgdGhlIHZlY3Rvcml6YXRpb24gb2YgZHluYW1pYy1zaXplIG9iamVjdHMKKyAgICAgIChsaWtlIE1hdHJpeFhkKS4gQnV0IGRvIG5vdGUgdGhhdCB0aGlzIGJyZWFrcyBBQkkgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHN0YXRpYyBhbGlnbm1lbnQuPC9saT4KKyAgPGxpPk9yIGRlZmluZSBib3RoIFxsaW5rIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc1BlcmZvcm1hbmNlICBFSUdFTl9ET05UX1ZFQ1RPUklaRSBcZW5kbGluayBhbmQgRUlHRU5fRElTQUJMRV9VTkFMSUdORURfQVJSQVlfQVNTRVJULiBUaGlzIGtlZXBzIHRoZQorICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgY29kZSBhbmQgdGh1cyBwcmVzZXJ2ZXMgQUJJIGNvbXBhdGliaWxpdHksIGJ1dCBjb21wbGV0ZWx5IGRpc2FibGVzIHZlY3Rvcml6YXRpb24uPC9saT4KKzwvdWw+CisKK0lmIHlvdSB3YW50IHRvIGtub3cgd2h5IGRlZmluaW5nIEVJR0VOX0RPTlRfVkVDVE9SSVpFIGRvZXMgbm90IGJ5IGl0c2VsZiBkaXNhYmxlIDE2LWJ5dGUgYWxpZ25tZW50IGFuZCB0aGUgYXNzZXJ0aW9uLCBoZXJlJ3MgdGhlIGV4cGxhbmF0aW9uOgorCitJdCBkb2Vzbid0IGRpc2FibGUgdGhlIGFzc2VydGlvbiwgYmVjYXVzZSBvdGhlcndpc2UgY29kZSB0aGF0IHJ1bnMgZmluZSB3aXRob3V0IHZlY3Rvcml6YXRpb24gd291bGQgc3VkZGVubHkgY3Jhc2ggd2hlbiBlbmFibGluZyB2ZWN0b3JpemF0aW9uLgorSXQgZG9lc24ndCBkaXNhYmxlIDE2LWJ5dGUgYWxpZ25tZW50LCBiZWNhdXNlIHRoYXQgd291bGQgbWVhbiB0aGF0IHZlY3Rvcml6ZWQgYW5kIG5vbi12ZWN0b3JpemVkIGNvZGUgYXJlIG5vdCBtdXR1YWxseSBBQkktY29tcGF0aWJsZS4gVGhpcyBBQkkgY29tcGF0aWJpbGl0eSBpcyB2ZXJ5IGltcG9ydGFudCwgZXZlbiBmb3IgcGVvcGxlIHdobyBkZXZlbG9wIG9ubHkgYW4gaW4taG91c2UgYXBwbGljYXRpb24sIGFzIGZvciBpbnN0YW5jZSBvbmUgbWF5IHdhbnQgdG8gaGF2ZSBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhIHZlY3Rvcml6ZWQgcGF0aCBhbmQgYSBub24tdmVjdG9yaXplZCBwYXRoLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVXNpbmdCbGFzTGFwYWNrQmFja2VuZHMuZG94IGIvZG9jL1VzaW5nQmxhc0xhcGFja0JhY2tlbmRzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE1OTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1VzaW5nQmxhc0xhcGFja0JhY2tlbmRzLmRveApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIENvcHlyaWdodCAoQykgMjAxMS0yMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IERvY3VtZW50YXRpb24gb24gdGhlIHVzZSBvZiBCTEFTL0xBUEFDSyBsaWJyYXJpZXMgdGhyb3VnaCBFaWdlbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNVc2luZ0JsYXNMYXBhY2sgVXNpbmcgQkxBUy9MQVBBQ0sgZnJvbSAlRWlnZW4KKworCitTaW5jZSAlRWlnZW4gdmVyc2lvbiAzLjMgYW5kIGxhdGVyLCBhbnkgRjc3IGNvbXBhdGlibGUgQkxBUyBvciBMQVBBQ0sgbGlicmFyaWVzIGNhbiBiZSB1c2VkIGFzIGJhY2tlbmRzIGZvciBkZW5zZSBtYXRyaXggcHJvZHVjdHMgYW5kIGRlbnNlIG1hdHJpeCBkZWNvbXBvc2l0aW9ucy4KK0ZvciBpbnN0YW5jZSwgb25lIGNhbiB1c2UgPGEgaHJlZj0iaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvQ291bnRlci9yZWRpcmVjdF90b19ta2wucGhwIj5JbnRlbMKuIE1LTDwvYT4sIEFwcGxlJ3MgQWNjZWxlcmF0ZSBmcmFtZXdvcmsgb24gT1NYLCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ibGFzLm5ldC8iPk9wZW5CTEFTPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjayI+TmV0bGliIExBUEFDSzwvYT4sIGV0Yy4KKworRG8gbm90IG1pc3MgdGhpcyBcbGluayBUb3BpY1VzaW5nSW50ZWxNS0wgcGFnZSBcZW5kbGluayBmb3IgZnVydGhlciBkaXNjdXNzaW9ucyBvbiB0aGUgc3BlY2lmaWMgdXNlIG9mIEludGVswq4gTUtMIChhbHNvIGluY2x1ZGVzIFZNTCwgUEFSRElTTywgZXRjLikKKworSW4gb3JkZXIgdG8gdXNlIGFuIGV4dGVybmFsIEJMQVMgYW5kL29yIExBUEFDSyBsaWJyYXJ5LCB5b3UgbXVzdCBsaW5rIHlvdSBvd24gYXBwbGljYXRpb24gdG8gdGhlIHJlc3BlY3RpdmUgbGlicmFyaWVzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMuCitGb3IgTEFQQUNLLCB5b3UgbXVzdCBhbHNvIGxpbmsgdG8gdGhlIHN0YW5kYXJkIDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svbGFwYWNrZS5odG1sIj5MYXBhY2tlPC9hPiBsaWJyYXJ5LCB3aGljaCBpcyB1c2VkIGFzIGEgY29udmVuaWVudCB0aGluayBsYXllciBiZXR3ZWVuICVFaWdlbidzIEMrKyBjb2RlIGFuZCBMQVBBQ0sgRjc3IGludGVyZmFjZS4gVGhlbiB5b3UgbXVzdCBhY3RpdmF0ZSB0aGVpciB1c2FnZSBieSBkZWZpbmluZyBvbmUgb3IgbXVsdGlwbGUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3MgKFxiIGJlZm9yZSBpbmNsdWRpbmcgYW55ICVFaWdlbidzIGhlYWRlcik6CisKK1xub3RlIEZvciBNYWMgdXNlcnMsIGluIG9yZGVyIHRvIHVzZSB0aGUgbGFwYWNrIHZlcnNpb24gc2hpcHBlZCB3aXRoIHRoZSBBY2NlbGVyYXRlIGZyYW1ld29yaywgeW91IGFsc28gbmVlZCB0aGUgbGFwYWNrZSBsaWJyYXJ5LgorVXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly93d3cubWFjcG9ydHMub3JnLyI+TWFjUG9ydHM8L2E+LCB0aGlzIGlzIGFzIGVhc3kgYXM6CitcY29kZQorc3VkbyBwb3J0IGluc3RhbGwgbGFwYWNrCitcZW5kY29kZQorYW5kIHRoZW4gdXNlIHRoZSBmb2xsb3dpbmcgbGluayBmbGFnczogXGMgLWZyYW1ld29yayBcYyBBY2NlbGVyYXRlIFxjIC9vcHQvbG9jYWwvbGliL2xhcGFjay9saWJsYXBhY2tlLmR5bGliCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+XGMgRUlHRU5fVVNFX0JMQVMgPC90ZD48dGQ+RW5hYmxlcyB0aGUgdXNlIG9mIGV4dGVybmFsIEJMQVMgbGV2ZWwgMiBhbmQgMyByb3V0aW5lcyAoY29tcGF0aWJsZSB3aXRoIGFueSBGNzcgQkxBUyBpbnRlcmZhY2UpPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5cYyBFSUdFTl9VU0VfTEFQQUNLRSA8L3RkPjx0ZD5FbmFibGVzIHRoZSB1c2Ugb2YgZXh0ZXJuYWwgTGFwYWNrIHJvdXRpbmVzIHZpYSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9sYXBhY2tlLmh0bWwiPkxhcGFja2U8L2E+IEMgaW50ZXJmYWNlIHRvIExhcGFjayAoY29tcGF0aWJsZSB3aXRoIGFueSBGNzcgTEFQQUNLIGludGVyZmFjZSk8L3RkPjwvdHI+Cis8dHI+PHRkPlxjIEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCA8L3RkPjx0ZD5TYW1lIGFzIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIGJ1dCBhbGdvcml0aG1zIG9mIGxvd2VyIG51bWVyaWNhbCByb2J1c3RuZXNzIGFyZSBkaXNhYmxlZC4gXG4gVGhpcyBjdXJyZW50bHkgY29uY2VybnMgb25seSBKYWNvYmlTVkQgd2hpY2ggb3RoZXJ3aXNlIHdvdWxkIGJlIHJlcGxhY2VkIGJ5IFxjIGdlc3ZkIHRoYXQgaXMgbGVzcyByb2J1c3QgdGhhbiBKYWNvYmkgcm90YXRpb25zLjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1doZW4gZG9pbmcgc28sIGEgbnVtYmVyIG9mICVFaWdlbidzIGFsZ29yaXRobXMgYXJlIHNpbGVudGx5IHN1YnN0aXR1dGVkIHdpdGggY2FsbHMgdG8gQkxBUyBvciBMQVBBQ0sgcm91dGluZXMuCitUaGVzZSBzdWJzdGl0dXRpb25zIGFwcGx5IG9ubHkgZm9yIFxiIER5bmFtaWMgXGIgb3IgXGIgbGFyZ2UgZW5vdWdoIG9iamVjdHMgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHN0YW5kYXJkIHNjYWxhciB0eXBlczogXGMgZmxvYXQsIFxjIGRvdWJsZSwgXGMgY29tcGxleDxmbG9hdD4sIGFuZCBcYyBjb21wbGV4PGRvdWJsZT4uCitPcGVyYXRpb25zIG9uIG90aGVyIHNjYWxhciB0eXBlcyBvciBtaXhpbmcgcmVhbHMgYW5kIGNvbXBsZXhlcyB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgYnVpbHQtaW4gYWxnb3JpdGhtcy4KKworVGhlIGJyZWFkdGggb2YgJUVpZ2VuIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgaXMgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdy4KKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+RnVuY3Rpb25hbCBkb21haW48L3RoPjx0aD5Db2RlIGV4YW1wbGU8L3RoPjx0aD5CTEFTL0xBUEFDSyByb3V0aW5lczwvdGg+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+Cis8L3RhYmxlPgorSW4gdGhlIGV4YW1wbGVzLCBtMSBhbmQgbTIgYXJlIGRlbnNlIG1hdHJpY2VzIGFuZCB2MSBhbmQgdjIgYXJlIGRlbnNlIHZlY3RvcnMuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9Vc2luZ0ludGVsTUtMLmRveCBiL2RvYy9Vc2luZ0ludGVsTUtMLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWEzYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1VzaW5nSW50ZWxNS0wuZG94CkBAIC0wLDAgKzEsMTA3IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IERvY3VtZW50YXRpb24gb24gdGhlIHVzZSBvZiBJbnRlbCBNS0wgdGhyb3VnaCBFaWdlbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNVc2luZ0ludGVsTUtMIFVzaW5nIEludGVswq4gTUtMIGZyb20gJUVpZ2VuCisKKzwhLS0gXHNlY3Rpb24gVG9waWNVc2luZ0ludGVsTUtMX0ludHJvIEVpZ2VuIGFuZCBJbnRlbMKuIE1hdGggS2VybmVsIExpYnJhcnkgKEludGVswq4gTUtMKSAtLT4KKworU2luY2UgJUVpZ2VuIHZlcnNpb24gMy4xIGFuZCBsYXRlciwgdXNlcnMgY2FuIGJlbmVmaXQgZnJvbSBidWlsdC1pbiBJbnRlbMKuIE1hdGggS2VybmVsIExpYnJhcnkgKE1LTCkgb3B0aW1pemF0aW9ucyB3aXRoIGFuIGluc3RhbGxlZCBjb3B5IG9mIEludGVsIE1LTCAxMC4zIChvciBsYXRlcikuCisKKzxhIGhyZWY9Imh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL0NvdW50ZXIvcmVkaXJlY3RfdG9fbWtsLnBocCI+IEludGVsIE1LTCA8L2E+IHByb3ZpZGVzIGhpZ2hseSBvcHRpbWl6ZWQgbXVsdGktdGhyZWFkZWQgbWF0aGVtYXRpY2FsIHJvdXRpbmVzIGZvcsKgeDg2LWNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcy4KK0ludGVsIE1LTCBpcyBhdmFpbGFibGUgb24gTGludXgsIE1hYyBhbmQgV2luZG93cyBmb3IgYm90aCBJbnRlbDY0IGFuZCBJQTMyIGFyY2hpdGVjdHVyZXMuCisKK1xub3RlCitJbnRlbMKuIE1LTCBpcyBhIHByb3ByaWV0YXJ5IHNvZnR3YXJlIGFuZCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdXNlcnMgdG8gYnV5IG9yIHJlZ2lzdGVyIGZvciBjb21tdW5pdHkgKGZyZWUpIEludGVsIE1LTCBsaWNlbnNlcyBmb3IgdGhlaXIgcHJvZHVjdHMuIE1vcmVvdmVyLCB0aGUgbGljZW5zZSBvZiB0aGUgdXNlciBwcm9kdWN0IGhhcyB0byBhbGxvdyBsaW5raW5nIHRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlIHRoYXQgZXhjbHVkZXMgYW55IHVubW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEdQTC4KKworVXNpbmcgSW50ZWwgTUtMIHRocm91Z2ggJUVpZ2VuIGlzIGVhc3k6CistIyBkZWZpbmUgdGhlIFxjIEVJR0VOX1VTRV9NS0xfQUxMIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgYW55ICVFaWdlbidzIGhlYWRlcgorLSMgbGluayB5b3VyIHByb2dyYW0gdG8gTUtMIGxpYnJhcmllcyAoc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLW1rbC1saW5rLWxpbmUtYWR2aXNvci8iPk1LTCBsaW5raW5nIGFkdmlzb3I8L2E+KQorLSMgb24gYSA2NGJpdHMgc3lzdGVtLCB5b3UgbXVzdCB1c2UgdGhlIExQNjQgaW50ZXJmYWNlIChub3QgdGhlIElMUDY0IG9uZSkKKworV2hlbiBkb2luZyBzbywgYSBudW1iZXIgb2YgJUVpZ2VuJ3MgYWxnb3JpdGhtcyBhcmUgc2lsZW50bHkgc3Vic3RpdHV0ZWQgd2l0aCBjYWxscyB0byBJbnRlbCBNS0wgcm91dGluZXMuCitUaGVzZSBzdWJzdGl0dXRpb25zIGFwcGx5IG9ubHkgZm9yIFxiIER5bmFtaWMgXGIgb3IgXGIgbGFyZ2UgZW5vdWdoIG9iamVjdHMgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHN0YW5kYXJkIHNjYWxhciB0eXBlczogXGMgZmxvYXQsIFxjIGRvdWJsZSwgXGMgY29tcGxleDxmbG9hdD4sIGFuZCBcYyBjb21wbGV4PGRvdWJsZT4uCitPcGVyYXRpb25zIG9uIG90aGVyIHNjYWxhciB0eXBlcyBvciBtaXhpbmcgcmVhbHMgYW5kIGNvbXBsZXhlcyB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgYnVpbHQtaW4gYWxnb3JpdGhtcy4KKworSW4gYWRkaXRpb24geW91IGNhbiBjaG9vc2Ugd2hpY2ggcGFydHMgd2lsbCBiZSBzdWJzdGl0dXRlZCBieSBkZWZpbmluZyBvbmUgb3IgbXVsdGlwbGUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+XGMgRUlHRU5fVVNFX0JMQVMgPC90ZD48dGQ+RW5hYmxlcyB0aGUgdXNlIG9mIGV4dGVybmFsIEJMQVMgbGV2ZWwgMiBhbmQgMyByb3V0aW5lczwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGMgRUlHRU5fVVNFX0xBUEFDS0UgPC90ZD48dGQ+RW5hYmxlcyB0aGUgdXNlIG9mIGV4dGVybmFsIExhcGFjayByb3V0aW5lcyB2aWEgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svbGFwYWNrZS5odG1sIj5MYXBhY2tlPC9hPiBDIGludGVyZmFjZSB0byBMYXBhY2s8L3RkPjwvdHI+Cis8dHI+PHRkPlxjIEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCA8L3RkPjx0ZD5TYW1lIGFzIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIGJ1dCBhbGdvcml0aG0gb2YgbG93ZXIgcm9idXN0bmVzcyBhcmUgZGlzYWJsZWQuIFxuIFRoaXMgY3VycmVudGx5IGNvbmNlcm5zIG9ubHkgSmFjb2JpU1ZEIHdoaWNoIG90aGVyd2lzZSB3b3VsZCBiZSByZXBsYWNlZCBieSBcYyBnZXN2ZCB0aGF0IGlzIGxlc3Mgcm9idXN0IHRoYW4gSmFjb2JpIHJvdGF0aW9ucy48L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxjIEVJR0VOX1VTRV9NS0xfVk1MIDwvdGQ+PHRkPkVuYWJsZXMgdGhlIHVzZSBvZiBJbnRlbCBWTUwgKHZlY3RvciBvcGVyYXRpb25zKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGMgRUlHRU5fVVNFX01LTF9BTEwgPC90ZD48dGQ+RGVmaW5lcyBcYyBFSUdFTl9VU0VfQkxBUywgXGMgRUlHRU5fVVNFX0xBUEFDS0UsIGFuZCBcYyBFSUdFTl9VU0VfTUtMX1ZNTCA8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitOb3RlIHRoYXQgdGhlIEJMQVMgYW5kIExBUEFDS0UgYmFja2VuZHMgY2FuIGJlIGVuYWJsZWQgZm9yIGFueSBGNzcgY29tcGF0aWJsZSBCTEFTIGFuZCBMQVBBQ0sgbGlicmFyaWVzLiBTZWUgdGhpcyBcbGluayBUb3BpY1VzaW5nQmxhc0xhcGFjayBwYWdlIFxlbmRsaW5rIGZvciB0aGUgZGV0YWlscy4KKworRmluYWxseSwgdGhlIFBBUkRJU08gc3BhcnNlIHNvbHZlciBzaGlwcGVkIHdpdGggSW50ZWwgTUtMIGNhbiBiZSB1c2VkIHRocm91Z2ggdGhlIFxyZWYgUGFyZGlzb0xVLCBccmVmIFBhcmRpc29MTFQgYW5kIFxyZWYgUGFyZGlzb0xETFQgY2xhc3NlcyBvZiB0aGUgXHJlZiBQYXJkaXNvU3VwcG9ydF9Nb2R1bGUuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgY292ZXJlZCBieSBcYyBFSUdFTl9VU0VfTUtMX1ZNTDoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+Q29kZSBleGFtcGxlPC90aD48dGg+TUtMIHJvdXRpbmVzPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZQordjI9djEuYXJyYXkoKS5zaW4oKTsKK3YyPXYxLmFycmF5KCkuYXNpbigpOwordjI9djEuYXJyYXkoKS5jb3MoKTsKK3YyPXYxLmFycmF5KCkuYWNvcygpOwordjI9djEuYXJyYXkoKS50YW4oKTsKK3YyPXYxLmFycmF5KCkuZXhwKCk7Cit2Mj12MS5hcnJheSgpLmxvZygpOwordjI9djEuYXJyYXkoKS5zcXJ0KCk7Cit2Mj12MS5hcnJheSgpLnNxdWFyZSgpOwordjI9djEuYXJyYXkoKS5wb3coMS41KTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK3Y/U2luCit2P0FzaW4KK3Y/Q29zCit2P0Fjb3MKK3Y/VGFuCit2P0V4cAordj9Mbgordj9TcXJ0Cit2P1Nxcgordj9Qb3d4CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CitJbiB0aGUgZXhhbXBsZXMsIHYxIGFuZCB2MiBhcmUgZGVuc2UgdmVjdG9ycy4KKworCitcc2VjdGlvbiBUb3BpY1VzaW5nSW50ZWxNS0xfTGlua3MgTGlua3MKKy0gSW50ZWwgTUtMIGNhbiBiZSBwdXJjaGFzZWQgYW5kIGRvd25sb2FkZWQgPGEgaHJlZj0iaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvQ291bnRlci9yZWRpcmVjdF90b19ta2wucGhwIj5oZXJlPC9hPi4KKy0gSW50ZWwgTUtMIGlzIGFsc28gYnVuZGxlZCB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvaW50ZWwtY29tcG9zZXIteGUvIj5JbnRlbCBDb21wb3NlciBYRTwvYT4uCisKKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1VzaW5nTlZDQy5kb3ggYi9kb2MvVXNpbmdOVkNDLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU3NTViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1VzaW5nTlZDQy5kb3gKQEAgLTAsMCArMSwzMiBAQAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNDVURBIFVzaW5nIEVpZ2VuIGluIENVREEga2VybmVscworCitcYiBEaXNjbGFpbWVyOiB0aGlzIHBhZ2UgaXMgYWJvdXQgYW4gXGIgZXhwZXJpbWVudGFsIGZlYXR1cmUgaW4gJUVpZ2VuLgorCitTdGFyaW5nIGZyb20gQ1VEQSA1LjAsIHRoZSBDVURBIGNvbXBpbGVyLCBcYyBudmNjLCBpcyBhYmxlIHRvIHByb3Blcmx5IHBhcnNlICVFaWdlbidzIGNvZGUgKGFsbW9zdCkuCitBIGZldyBhZGFwdGF0aW9ucyBvZiB0aGUgJUVpZ2VuJ3MgY29kZSBhbHJlYWR5IGFsbG93cyB0byB1c2Ugc29tZSBwYXJ0cyBvZiAlRWlnZW4gaW4geW91ciBvd24gQ1VEQSBrZXJuZWxzLgorVG8gdGhpcyBlbmQgeW91IG5lZWQgdGhlIGRldmVsIGJyYW5jaCBvZiAlRWlnZW4sIENVREEgNS4wIG9yIGdyZWF0ZXIgd2l0aCBHQ0MuCisKK0tub3duIGlzc3VlczoKKworIC0gXGMgbnZjYyB3aXRoIE1TIFZpc3VhbCBTdHVkaW8gZG9lcyBub3Qgd29yayAocGF0Y2ggd2VsY29tZSkKKyAKKyAtIFxjIG52Y2Mgd2l0aCBcYyBjbGFuZyBkb2VzIG5vdCB3b3JrIChwYXRjaCB3ZWxjb21lKQorIAorIC0gXGMgbnZjYyA1LjUgd2l0aCBnY2MtNC43IChvciBncmVhdGVyKSBoYXMgaXNzdWVzIHdpdGggdGhlIHN0YW5kYXJkIFxjIFw8bGltaXRzXD4gaGVhZGVyIGZpbGUuIFRvIHdvcmthcm91bmQgdGhpcywgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBiZWZvcmUgaW5jbHVkaW5nIGFueSBvdGhlciBmaWxlczoKKyAgIFxjb2RlCisgICAgLy8gd29ya2Fyb3VuZCBpc3N1ZSBiZXR3ZWVuIGdjYyA+PSA0LjcgYW5kIGN1ZGEgNS41CisgICAgI2lmIChkZWZpbmVkIF9fR05VQ19fKSAmJiAoX19HTlVDX18+NCB8fCBfX0dOVUNfTUlOT1JfXz49NykKKyAgICAgICN1bmRlZiBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlMKKyAgICAgICN1bmRlZiBfR0xJQkNYWF9VU0VfSU5UMTI4CisgICAgI2VuZGlmCisgICBcZW5kY29kZQorICAgCisgLSBPbiA2NGJpdHMgc3lzdGVtIEVpZ2VuIHVzZXMgXGMgbG9uZyBcYyBpbnQgYXMgdGhlIGRlZmF1bHQgdHlwZSBmb3IgaW5kZXhlcyBhbmQgc2l6ZXMuIE9uIENVREEgZGV2aWNlLCBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIGRlZmF1bHQgdG8gMzIgYml0cyBcYyBpbnQuCisgICBIb3dldmVyLCB0byBrZWVwIGhvc3QgYW5kIENVREEgY29kZSBjb21wYXRpYmxlLCB0aGlzIGNhbm5vdCBiZSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgJUVpZ2VuLCBhbmQgdGhlIHVzZXIgaXMgdGh1cyByZXF1aXJlZCB0byBkZWZpbmUgXGMgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIHRvIFxjIGludCB0aHJvdWdob3V0IGhpcyBjb2RlIChvciBvbmx5IGZvciBDVURBIGNvZGUgaWYgdGhlcmUgaXMgbm8gaW50ZXJhY3Rpb24gYmV0d2VlbiBob3N0IGFuZCBDVURBIGNvZGUgdGhyb3VnaCAlRWlnZW4ncyBvYmplY3QpLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvV3JvbmdTdGFja0FsaWdubWVudC5kb3ggYi9kb2MvV3JvbmdTdGFja0FsaWdubWVudC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNTUxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Xcm9uZ1N0YWNrQWxpZ25tZW50LmRveApAQCAtMCwwICsxLDU2IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGVpZ2VuTWFudWFsUGFnZSBUb3BpY1dyb25nU3RhY2tBbGlnbm1lbnQgQ29tcGlsZXIgbWFraW5nIGEgd3JvbmcgYXNzdW1wdGlvbiBvbiBzdGFjayBhbGlnbm1lbnQKKworPGg0Pkl0IGFwcGVhcnMgdGhhdCB0aGlzIHdhcyBhIEdDQyBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiBHQ0MgNC41LgorSWYgeW91IGhpdCB0aGlzIGlzc3VlLCBwbGVhc2UgdXBncmFkZSB0byBHQ0MgNC41IGFuZCByZXBvcnQgdG8gdXMsIHNvIHdlIGNhbiB1cGRhdGUgdGhpcyBwYWdlLjwvaDQ+CisKK1RoaXMgaXMgYW4gaXNzdWUgdGhhdCwgc28gZmFyLCB3ZSBtZXQgb25seSB3aXRoIEdDQyBvbiBXaW5kb3dzOiBmb3IgaW5zdGFuY2UsIE1pbkdXIGFuZCBURE0tR0NDLgorCitCeSBkZWZhdWx0LCBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpcywKKworXGNvZGUKK3ZvaWQgZm9vKCkKK3sKKyAgRWlnZW46OlF1YXRlcm5pb25mIHE7CisgIC8vLi4uCit9CitcZW5kY29kZQorCitHQ0MgYXNzdW1lcyB0aGF0IHRoZSBzdGFjayBpcyBhbHJlYWR5IDE2LWJ5dGUtYWxpZ25lZCBzbyB0aGF0IHRoZSBvYmplY3QgXGEgcSB3aWxsIGJlIGNyZWF0ZWQgYXQgYSAxNi1ieXRlLWFsaWduZWQgbG9jYXRpb24uIEZvciB0aGlzIHJlYXNvbiwgaXQgZG9lc24ndCB0YWtlIGFueSBzcGVjaWFsIGNhcmUgdG8gZXhwbGljaXRseSBhbGlnbiB0aGUgb2JqZWN0IFxhIHEsIGFzIEVpZ2VuIHJlcXVpcmVzLgorCitUaGUgcHJvYmxlbSBpcyB0aGF0LCBpbiBzb21lIHBhcnRpY3VsYXIgY2FzZXMsIHRoaXMgYXNzdW1wdGlvbiBjYW4gYmUgd3Jvbmcgb24gV2luZG93cywgd2hlcmUgdGhlIHN0YWNrIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBoYXZlIDQtYnl0ZSBhbGlnbm1lbnQuIEluZGVlZCwgZXZlbiB0aG91Z2ggR0NDIHRha2VzIGNhcmUgb2YgYWxpZ25pbmcgdGhlIHN0YWNrIGluIHRoZSBtYWluIGZ1bmN0aW9uIGFuZCBkb2VzIGl0cyBiZXN0IHRvIGtlZXAgaXQgYWxpZ25lZCwgd2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkIG9yIGZyb20gYSBiaW5hcnkgY29tcGlsZWQgd2l0aCBhbm90aGVyIGNvbXBpbGVyLCB0aGUgc3RhY2sgYWxpZ25tZW50IGNhbiBiZSBjb3JydXB0ZWQuIFRoaXMgcmVzdWx0cyBpbiB0aGUgb2JqZWN0ICdxJyBiZWluZyBjcmVhdGVkIGF0IGFuIHVuYWxpZ25lZCBsb2NhdGlvbiwgbWFraW5nIHlvdXIgcHJvZ3JhbSBjcmFzaCB3aXRoIHRoZSBccmVmIFRvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQgImFzc2VydGlvbiBvbiB1bmFsaWduZWQgYXJyYXlzIi4gU28gZmFyIHdlIGZvdW5kIHRoZSB0aHJlZSBmb2xsb3dpbmcgc29sdXRpb25zLgorCisKK1xzZWN0aW9uIHNlY19zb2wxIExvY2FsIHNvbHV0aW9uCisKK0EgbG9jYWwgc29sdXRpb24gaXMgdG8gbWFyayBzdWNoIGEgZnVuY3Rpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZToKK1xjb2RlCitfX2F0dHJpYnV0ZV9fKChmb3JjZV9hbGlnbl9hcmdfcG9pbnRlcikpIHZvaWQgZm9vKCkKK3sKKyAgRWlnZW46OlF1YXRlcm5pb25mIHE7CisgIC8vLi4uCit9CitcZW5kY29kZQorUmVhZCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC40LjAvZ2NjL0Z1bmN0aW9uLUF0dHJpYnV0ZXMuaHRtbCNGdW5jdGlvbi1BdHRyaWJ1dGVzIj50aGlzIEdDQyBkb2N1bWVudGF0aW9uPC9hPiB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBkb2VzLiBPZiBjb3Vyc2UgdGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9uIEdDQyBvbiBXaW5kb3dzLCBzbyBmb3IgcG9ydGFiaWxpdHkgeW91J2xsIGhhdmUgdG8gZW5jYXBzdWxhdGUgdGhpcyBpbiBhIG1hY3JvIHdoaWNoIHlvdSBsZWF2ZSBlbXB0eSBvbiBvdGhlciBwbGF0Zm9ybXMuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBzb2x1dGlvbiBpcyB0aGF0IHlvdSBjYW4gZmluZWx5IHNlbGVjdCB3aGljaCBmdW5jdGlvbiBtaWdodCBoYXZlIGEgY29ycnVwdGVkIHN0YWNrIGFsaWdubWVudC4gT2YgY291cnNlIG9uIHRoZSBkb3duc2lkZSB0aGlzIGhhcyB0byBiZSBkb25lIGZvciBldmVyeSBzdWNoIGZ1bmN0aW9uLCBzbyB5b3UgbWF5IHByZWZlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gZ2xvYmFsIHNvbHV0aW9ucy4KKworCitcc2VjdGlvbiBzZWNfc29sMiBHbG9iYWwgc29sdXRpb25zCisKK0EgZ2xvYmFsIHNvbHV0aW9uIGlzIHRvIGVkaXQgeW91ciBwcm9qZWN0IHNvIHRoYXQgd2hlbiBjb21waWxpbmcgd2l0aCBHQ0Mgb24gV2luZG93cywgeW91IHBhc3MgdGhpcyBvcHRpb24gdG8gR0NDOgorXGNvZGUKKy1taW5jb21pbmctc3RhY2stYm91bmRhcnk9MgorXGVuZGNvZGUKK0V4cGxhbmF0aW9uOiB0aGlzIHRlbGxzIEdDQyB0aGF0IHRoZSBzdGFjayBpcyBvbmx5IHJlcXVpcmVkIHRvIGJlIGFsaWduZWQgdG8gMl4yPTQgYnl0ZXMsIHNvIHRoYXQgR0NDIG5vdyBrbm93cyB0aGF0IGl0IHJlYWxseSBtdXN0IHRha2UgZXh0cmEgY2FyZSB0byBob25vciB0aGUgMTYgYnl0ZSBhbGlnbm1lbnQgb2YgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiIHdoZW4gbmVlZGVkLgorCitBbm90aGVyIGdsb2JhbCBzb2x1dGlvbiBpcyB0byBwYXNzIHRoaXMgb3B0aW9uIHRvIGdjYzoKK1xjb2RlCistbXN0YWNrcmVhbGlnbgorXGVuZGNvZGUKK3doaWNoIGhhcyB0aGUgc2FtZSBlZmZlY3QgdGhhbiBhZGRpbmcgdGhlIFxjIGZvcmNlX2FsaWduX2FyZ19wb2ludGVyIGF0dHJpYnV0ZSB0byBhbGwgZnVuY3Rpb25zLgorCitUaGVzZSBnbG9iYWwgc29sdXRpb25zIGFyZSBlYXN5IHRvIHVzZSwgYnV0IG5vdGUgdGhhdCB0aGV5IG1heSBzbG93ZG93biB5b3VyIHByb2dyYW0gYmVjYXVzZSB0aGV5IGxlYWQgdG8gZXh0cmEgcHJvbG9ndWUvZXBpbG9ndWUgaW5zdHJ1Y3Rpb25zIGZvciBldmVyeSBmdW5jdGlvbi4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL2VpZ2VuX25hdnRyZWVfaGFja3MuanMgYi9kb2MvZWlnZW5fbmF2dHJlZV9oYWNrcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdlMDJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VpZ2VuX25hdnRyZWVfaGFja3MuanMKQEAgLTAsMCArMSwyNDAgQEAKKworLy8gZ2VuZXJhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBpbiB0aGUgc2lkZS1uYXYgYmFzZWQgb24gdGhlIGgxL2gyIHRhZ3Mgb2YgdGhlIGN1cnJlbnQgcGFnZS4KK2Z1bmN0aW9uIGdlbmVyYXRlX2F1dG90b2MoKSB7CisgIHZhciBoZWFkZXJzID0gJCgiaDEsIGgyIik7CisgIGlmKGhlYWRlcnMubGVuZ3RoID4gMSkgeworICAgIHZhciB0b2MgPSAkKCIjc2lkZS1uYXYiKS5hcHBlbmQoJzxkaXYgaWQ9Im5hdi10b2MiIGNsYXNzPSJ0b2MiPjxoMz5UYWJsZSBvZiBjb250ZW50czwvaDM+PC9kaXY+Jyk7CisgICAgdG9jID0gJCgiI25hdi10b2MiKTsKKyAgICB2YXIgZm9vdGVySGVpZ2h0ID0gZm9vdGVyLmhlaWdodCgpOworICAgIHRvYyA9IHRvYy5hcHBlbmQoJzx1bD48L3VsPicpOworICAgIHRvYyA9IHRvYy5maW5kKCd1bCcpOworICAgIHZhciBpbmRpY2VzID0gbmV3IEFycmF5KCk7CisgICAgaW5kaWNlc1swXSA9IDA7CisgICAgaW5kaWNlc1sxXSA9IDA7CisKKyAgICB2YXIgaDFjb3VudHMgPSAkKCJoMSIpLmxlbmd0aDsKKyAgICBoZWFkZXJzLmVhY2goZnVuY3Rpb24oaSkgeworICAgICAgdmFyIGN1cnJlbnQgPSAkKHRoaXMpOworICAgICAgdmFyIGxldmVsVGFnID0gY3VycmVudFswXS50YWdOYW1lLmNoYXJBdCgxKTsKKyAgICAgIGlmKGgxY291bnRzPT0wKQorICAgICAgICBsZXZlbFRhZy0tOworICAgICAgdmFyIGN1cl9pZCA9IGN1cnJlbnQuYXR0cigiaWQiKTsKKworICAgICAgaW5kaWNlc1tsZXZlbFRhZy0xXSs9MTsgIAorICAgICAgdmFyIHByZWZpeCA9IGluZGljZXNbMF07CisgICAgICBpZiAobGV2ZWxUYWcgPjEpIHsKKyAgICAgICAgcHJlZml4Kz0iLiIraW5kaWNlc1sxXTsKKyAgICAgIH0KKyAgICAgICAgCisgICAgICAvLyBVbmNvbW1lbnQgdG8gYWRkIG51bWJlciBwcmVmaXhlcworICAgICAgLy8gY3VycmVudC5odG1sKHByZWZpeCArICIgICAiICsgY3VycmVudC5odG1sKCkpOworICAgICAgZm9yKHZhciBsID0gbGV2ZWxUYWc7IGwgPCAyOyArK2wpeworICAgICAgICAgIGluZGljZXNbbF0gPSAwOworICAgICAgfQorCisgICAgICBpZihjdXJfaWQgPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIGN1cnJlbnQuYXR0cignaWQnLCAndGl0bGUnICsgaSk7CisgICAgICAgIGN1cnJlbnQuYWRkQ2xhc3MoJ2FuY2hvcicpOworICAgICAgICB0b2MuYXBwZW5kKCI8bGkgY2xhc3M9J2xldmVsIiArIGxldmVsVGFnICsgIic+PGEgaWQ9J2xpbmsiICsgaSArICInIGhyZWY9JyN0aXRsZSIgKworICAgICAgICAgICAgICAgICAgICBpICsgIicgdGl0bGU9JyIgKyBjdXJyZW50LnByb3AoInRhZ05hbWUiKSArICInPiIgKyBjdXJyZW50LnRleHQoKSArICI8L2E+PC9saT4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRvYy5hcHBlbmQoIjxsaSBjbGFzcz0nbGV2ZWwiICsgbGV2ZWxUYWcgKyAiJz48YSBpZD0nIiArIGN1cl9pZCArICInIGhyZWY9JyN0aXRsZSIgKworICAgICAgICAgICAgICAgICAgICBpICsgIicgdGl0bGU9JyIgKyBjdXJyZW50LnByb3AoInRhZ05hbWUiKSArICInPiIgKyBjdXJyZW50LnRleHQoKSArICI8L2E+PC9saT4iKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXNpemVIZWlnaHQoKTsKKyAgfQorfQorCisKK3ZhciBnbG9iYWxfbmF2dHJlZV9vYmplY3Q7CisKKy8vIE92ZXJsb2FkZWQgdG8gcmVtb3ZlIGxpbmtzIHRvIHNlY3Rpb25zL3N1YnNlY3Rpb25zCitmdW5jdGlvbiBnZXROb2RlKG8sIHBvKQoreworICBwby5jaGlsZHJlblZpc2l0ZWQgPSB0cnVlOworICB2YXIgbCA9IHBvLmNoaWxkcmVuRGF0YS5sZW5ndGgtMTsKKyAgZm9yICh2YXIgaSBpbiBwby5jaGlsZHJlbkRhdGEpIHsKKyAgICB2YXIgbm9kZURhdGEgPSBwby5jaGlsZHJlbkRhdGFbaV07CisgICAgaWYoKCFub2RlRGF0YVsxXSkgfHwgIChub2RlRGF0YVsxXS5pbmRleE9mKCcjJyk9PS0xKSkgLy8gPC0gd2UgYWRkZWQgdGhpcyBsaW5lCisgICAgICBwby5jaGlsZHJlbltpXSA9IG5ld05vZGUobywgcG8sIG5vZGVEYXRhWzBdLCBub2RlRGF0YVsxXSwgbm9kZURhdGFbMl0sIGk9PWwpOworICB9Cit9CisKKy8vIE92ZXJsb2FkZWQgdG8gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBuYXZ0cmVlIHdydCB0aGUgdG9jCitmdW5jdGlvbiByZXNpemVIZWlnaHQoKSAKK3sKKyAgdmFyIHRvYyA9ICQoIiNuYXYtdG9jIik7CisgIHZhciB0b2NIZWlnaHQgPSB0b2MuaGVpZ2h0KCk7ICAvLyA8LSB3ZSBhZGRlZCB0aGlzIGxpbmUKKyAgdmFyIGhlYWRlckhlaWdodCA9IGhlYWRlci5oZWlnaHQoKTsKKyAgdmFyIGZvb3RlckhlaWdodCA9IGZvb3Rlci5oZWlnaHQoKTsKKyAgdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKSAtIGhlYWRlckhlaWdodCAtIGZvb3RlckhlaWdodDsKKyAgY29udGVudC5jc3Moe2hlaWdodDp3aW5kb3dIZWlnaHQgKyAicHgifSk7CisgIG5hdnRyZWUuY3NzKHtoZWlnaHQ6KHdpbmRvd0hlaWdodC10b2NIZWlnaHQpICsgInB4In0pOyAvLyA8LSB3ZSBtb2RpZmllZCB0aGlzIGxpbmUKKyAgc2lkZW5hdi5jc3Moe2hlaWdodDood2luZG93SGVpZ2h0KSArICJweCIsdG9wOiBoZWFkZXJIZWlnaHQrInB4In0pOworfQorCisvLyBPdmVybG9hZGVkIHRvIHNhdmUgdGhlIHJvb3Qgbm9kZSBpbnRvIGdsb2JhbF9uYXZ0cmVlX29iamVjdAorZnVuY3Rpb24gaW5pdE5hdlRyZWUodG9yb290LHJlbHBhdGgpCit7CisgIHZhciBvID0gbmV3IE9iamVjdCgpOworICBnbG9iYWxfbmF2dHJlZV9vYmplY3QgPSBvOyAvLyA8LSB3ZSBhZGRlZCB0aGlzIGxpbmUKKyAgby50b3Jvb3QgPSB0b3Jvb3Q7CisgIG8ubm9kZSA9IG5ldyBPYmplY3QoKTsKKyAgby5ub2RlLmxpID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdi10cmVlLWNvbnRlbnRzIik7CisgIG8ubm9kZS5jaGlsZHJlbkRhdGEgPSBOQVZUUkVFOworICBvLm5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkoKTsKKyAgby5ub2RlLmNoaWxkcmVuVUwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOworICBvLm5vZGUuZ2V0Q2hpbGRyZW5VTCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gby5ub2RlLmNoaWxkcmVuVUw7IH07CisgIG8ubm9kZS5saS5hcHBlbmRDaGlsZChvLm5vZGUuY2hpbGRyZW5VTCk7CisgIG8ubm9kZS5kZXB0aCA9IDA7CisgIG8ubm9kZS5yZWxwYXRoID0gcmVscGF0aDsKKyAgby5ub2RlLmV4cGFuZGVkID0gZmFsc2U7CisgIG8ubm9kZS5pc0xhc3QgPSB0cnVlOworICBvLm5vZGUucGx1c19pbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKyAgby5ub2RlLnBsdXNfaW1nLnNyYyA9IHJlbHBhdGgrImZ0djJwbm9kZS5wbmciOworICBvLm5vZGUucGx1c19pbWcud2lkdGggPSAxNjsKKyAgby5ub2RlLnBsdXNfaW1nLmhlaWdodCA9IDIyOworCisgIGlmIChsb2NhbFN0b3JhZ2VTdXBwb3J0ZWQoKSkgeworICAgIHZhciBuYXZTeW5jID0gJCgnI25hdi1zeW5jJyk7CisgICAgaWYgKGNhY2hlZExpbmsoKSkgeworICAgICAgc2hvd1N5bmNPZmYobmF2U3luYyxyZWxwYXRoKTsKKyAgICAgIG5hdlN5bmMucmVtb3ZlQ2xhc3MoJ3N5bmMnKTsKKyAgICB9IGVsc2UgeworICAgICAgc2hvd1N5bmNPbihuYXZTeW5jLHJlbHBhdGgpOworICAgIH0KKyAgICBuYXZTeW5jLmNsaWNrKGZ1bmN0aW9uKCl7IHRvZ2dsZVN5bmNCdXR0b24ocmVscGF0aCk7IH0pOworICB9CisKKyAgbmF2VG8obyx0b3Jvb3Qsd2luZG93LmxvY2F0aW9uLmhhc2gscmVscGF0aCk7CisKKyAgJCh3aW5kb3cpLmJpbmQoJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbigpeworICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2gubGVuZ3RoPjEpeworICAgICAgIHZhciBhOworICAgICAgIGlmICgkKGxvY2F0aW9uKS5hdHRyKCdoYXNoJykpeworICAgICAgICAgdmFyIGNsc2xpbms9c3RyaXBQYXRoKCQobG9jYXRpb24pLmF0dHIoJ3BhdGhuYW1lJykpKyc6JysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGxvY2F0aW9uKS5hdHRyKCdoYXNoJykuc3Vic3RyaW5nKDEpOworICAgICAgICAgYT0kKCcuaXRlbSBhW2NsYXNzJD0iJytjbHNsaW5rKyciXScpOworICAgICAgIH0KKyAgICAgICBpZiAoYT09bnVsbCB8fCAhJChhKS5wYXJlbnQoKS5wYXJlbnQoKS5oYXNDbGFzcygnc2VsZWN0ZWQnKSl7CisgICAgICAgICAkKCcuaXRlbScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOworICAgICAgICAgJCgnLml0ZW0nKS5yZW1vdmVBdHRyKCdpZCcpOworICAgICAgIH0KKyAgICAgICB2YXIgbGluaz1zdHJpcFBhdGgyKCQobG9jYXRpb24pLmF0dHIoJ3BhdGhuYW1lJykpOworICAgICAgIG5hdlRvKG8sbGluaywkKGxvY2F0aW9uKS5hdHRyKCdoYXNoJykscmVscGF0aCk7CisgICAgIH0gZWxzZSBpZiAoIWFuaW1hdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAkKCcjZG9jLWNvbnRlbnQnKS5zY3JvbGxUb3AoMCk7CisgICAgICAgJCgnLml0ZW0nKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICAgICAkKCcuaXRlbScpLnJlbW92ZUF0dHIoJ2lkJyk7CisgICAgICAgbmF2VG8obyx0b3Jvb3Qsd2luZG93LmxvY2F0aW9uLmhhc2gscmVscGF0aCk7CisgICAgIH0KKyAgfSkKKworICAkKHdpbmRvdykubG9hZChzaG93Um9vdCk7Cit9CisKKy8vIHJldHVybiBmYWxzZSBpZiB0aGUgdGhlIG5vZGUgaGFzIG5vIGNoaWxkcmVuIGF0IGFsbCwgb3IgaGFzIG9ubHkgc2VjdGlvbi9zdWJzZWN0aW9uIGNoaWxkcmVuCitmdW5jdGlvbiBjaGVja0NoaWxkcmVuRGF0YShub2RlKSB7CisgIGlmICghKHR5cGVvZihub2RlLmNoaWxkcmVuRGF0YSk9PT0nc3RyaW5nJykpIHsKKyAgICBmb3IgKHZhciBpIGluIG5vZGUuY2hpbGRyZW5EYXRhKSB7CisgICAgICB2YXIgdXJsID0gbm9kZS5jaGlsZHJlbkRhdGFbaV1bMV07CisgICAgICBpZih1cmwuaW5kZXhPZigiIyIpPT0tMSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gKG5vZGUuY2hpbGRyZW5EYXRhKTsKK30KKworLy8gTW9kaWZpZWQgdG86CisvLyAxIC0gcmVtb3ZlIHRoZSByb290IG5vZGUgCisvLyAyIC0gcmVtb3ZlIHRoZSBzZWN0aW9uL3N1YnNlY3Rpb24gY2hpbGRyZW4KK2Z1bmN0aW9uIGNyZWF0ZUluZGVudChvLGRvbU5vZGUsbm9kZSxsZXZlbCkKK3sKKyAgdmFyIGxldmVsPS0yOyAvLyA8LSB3ZSByZXBsYWNlZCBsZXZlbD0tMSBieSBsZXZlbD0tMgorICB2YXIgbiA9IG5vZGU7CisgIHdoaWxlIChuLnBhcmVudE5vZGUpIHsgbGV2ZWwrKzsgbj1uLnBhcmVudE5vZGU7IH0KKyAgdmFyIGltZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKKyAgaW1nTm9kZS5zdHlsZS5wYWRkaW5nTGVmdD0oMTYqKGxldmVsKSkudG9TdHJpbmcoKSsncHgnOworICBpbWdOb2RlLndpZHRoICA9IDE2OworICBpbWdOb2RlLmhlaWdodCA9IDIyOworICBpbWdOb2RlLmJvcmRlciA9IDA7CisgIGlmIChjaGVja0NoaWxkcmVuRGF0YShub2RlKSkgeyAvLyA8LSB3ZSBtb2RpZmllZCB0aGlzIGxpbmUgdG8gdXNlIGNoZWNrQ2hpbGRyZW5EYXRhKG5vZGUpIGluc3RlYWQgb2Ygbm9kZS5jaGlsZHJlbkRhdGEKKyAgICBub2RlLnBsdXNfaW1nID0gaW1nTm9kZTsKKyAgICBub2RlLmV4cGFuZFRvZ2dsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKKyAgICBub2RlLmV4cGFuZFRvZ2dsZS5ocmVmID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7CisgICAgbm9kZS5leHBhbmRUb2dnbGUub25jbGljayA9IGZ1bmN0aW9uKCkgeworICAgICAgaWYgKG5vZGUuZXhwYW5kZWQpIHsKKyAgICAgICAgJChub2RlLmdldENoaWxkcmVuVUwoKSkuc2xpZGVVcCgiZmFzdCIpOworICAgICAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG5vZGUucmVscGF0aCsiZnR2MnBub2RlLnBuZyI7CisgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4cGFuZE5vZGUobywgbm9kZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgbm9kZS5leHBhbmRUb2dnbGUuYXBwZW5kQ2hpbGQoaW1nTm9kZSk7CisgICAgZG9tTm9kZS5hcHBlbmRDaGlsZChub2RlLmV4cGFuZFRvZ2dsZSk7CisgICAgaW1nTm9kZS5zcmMgPSBub2RlLnJlbHBhdGgrImZ0djJwbm9kZS5wbmciOworICB9IGVsc2UgeworICAgIGltZ05vZGUuc3JjID0gbm9kZS5yZWxwYXRoKyJmdHYybm9kZS5wbmciOworICAgIGRvbU5vZGUuYXBwZW5kQ2hpbGQoaW1nTm9kZSk7CisgIH0gCit9CisKKy8vIE92ZXJsb2FkZWQgdG8gYXV0b21hdGljYWxseSBleHBhbmQgdGhlIHNlbGVjdGVkIG5vZGUKK2Z1bmN0aW9uIHNlbGVjdEFuZEhpZ2hsaWdodChoYXNoLG4pCit7CisgIHZhciBhOworICBpZiAoaGFzaCkgeworICAgIHZhciBsaW5rPXN0cmlwUGF0aCgkKGxvY2F0aW9uKS5hdHRyKCdwYXRobmFtZScpKSsnOicraGFzaC5zdWJzdHJpbmcoMSk7CisgICAgYT0kKCcuaXRlbSBhW2NsYXNzJD0iJytsaW5rKyciXScpOworICB9CisgIGlmIChhICYmIGEubGVuZ3RoKSB7CisgICAgYS5wYXJlbnQoKS5wYXJlbnQoKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKKyAgICBhLnBhcmVudCgpLnBhcmVudCgpLmF0dHIoJ2lkJywnc2VsZWN0ZWQnKTsKKyAgICBoaWdobGlnaHRBbmNob3IoKTsKKyAgfSBlbHNlIGlmIChuKSB7CisgICAgJChuLml0ZW1EaXYpLmFkZENsYXNzKCdzZWxlY3RlZCcpOworICAgICQobi5pdGVtRGl2KS5hdHRyKCdpZCcsJ3NlbGVjdGVkJyk7CisgIH0KKyAgaWYgKCQoJyNuYXYtdHJlZS1jb250ZW50cyAuaXRlbTpmaXJzdCcpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7CisgICAgJCgnI25hdi1zeW5jJykuY3NzKCd0b3AnLCczMHB4Jyk7CisgIH0gZWxzZSB7CisgICAgJCgnI25hdi1zeW5jJykuY3NzKCd0b3AnLCc1cHgnKTsKKyAgfQorICBleHBhbmROb2RlKGdsb2JhbF9uYXZ0cmVlX29iamVjdCwgbiwgdHJ1ZSwgdHJ1ZSk7IC8vIDwtIHdlIGFkZGVkIHRoaXMgbGluZQorICBzaG93Um9vdCgpOworfQorCisKKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAKKyAgZ2VuZXJhdGVfYXV0b3RvYygpOworICAKKyAgKGZ1bmN0aW9uICgpeyAvLyB3YWl0IHVudGlsIHRoZSBmaXJzdCAic2VsZWN0ZWQiIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZAorICAgIHRyeSB7CisgICAgICAKKyAgICAgIC8vIHRoaXMgbGluZSB3aWxsIHRyaWdlciBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gI3NlbGVjdGVkIGVsZW1lbnQsIGkuZS4sIGJlZm9yZSB0aGUgdHJlZSBzdHJ1Y3R1cmUgaXMgY29tcGxldGUuCisgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWQiKS5jbGFzc05hbWUgPSAiaXRlbSBzZWxlY3RlZCI7CisgICAgICAKKyAgICAgIC8vIG9rLCB0aGUgZGVmYXVsdCB0cmVlIGhhcyBiZWVuIGNyZWF0ZWQsIHdlIGNhbiBrZWVwIGdvaW5nLi4uCisgICAgICAKKyAgICAgIC8vIGV4cGFuZCB0aGUgIkNoYXB0ZXJzIiBub2RlCisgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCd1bnN1cHBvcnRlZCcpPT0tMSkKKyAgICAgICAgZXhwYW5kTm9kZShnbG9iYWxfbmF2dHJlZV9vYmplY3QsIGdsb2JhbF9uYXZ0cmVlX29iamVjdC5ub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzJdLCB0cnVlLCB0cnVlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZXhwYW5kTm9kZShnbG9iYWxfbmF2dHJlZV9vYmplY3QsIGdsb2JhbF9uYXZ0cmVlX29iamVjdC5ub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLCB0cnVlLCB0cnVlKTsKKyAgICAgIAorICAgICAgLy8gSGlkZSB0aGUgcm9vdCBub2RlICJFaWdlbiIKKyAgICAgICQoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5kZXguaHRtbCcpWzBdKS5wYXJlbnQoKS5wYXJlbnQoKS5jc3Moe2Rpc3BsYXk6Im5vbmUifSk7CisgICAgICAKKyAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgIHNldFRpbWVvdXQoYXJndW1lbnRzLmNhbGxlZSwgMTApOworICAgIH0KKyAgfSkoKTsKK30pOworCiskKHdpbmRvdykubG9hZChmdW5jdGlvbigpIHsKKyAgcmVzaXplSGVpZ2h0KCk7Cit9KTsKZGlmZiAtLWdpdCBhL2RvYy9laWdlbmRveHkuY3NzIGIvZG9jL2VpZ2VuZG94eS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3NGU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9laWdlbmRveHkuY3NzCkBAIC0wLDAgKzEsMjE2IEBACisKKy8qKioqKioqKiBFaWdlbiBzcGVjaWZpYyBDU1MgY29kZSAqKioqKioqKioqKiovCisKKy8qKioqIFN0eWxlcyByZW1vdmluZyBlbGVtZW50cyAqKioqLworCisvKiByZW1vdmUgdGhlICJtb2R1bGVzfGNsYXNzZXMiIGxpbmsgZm9yIG1vZHVsZSBwYWdlcyAodGhleSBhcmUgYWxyZWFkeSBpbiB0aGUgVE9DKSAqLworZGl2LnN1bW1hcnkgeworICBkaXNwbGF5Om5vbmU7Cit9CisKKy8qIHJlbW92ZSAqLworZGl2LmNvbnRlbnRzIGhyIHsKKyAgZGlzcGxheTpub25lOworfQorCisvKioqKiAqKioqLworCitwLCBkbC53YXJuaW5nLCBkbC5hdHRlbnRpb24sIGRsLm5vdGUKK3sKKyAgbWF4LXdpZHRoOjYwZW07CisgIHRleHQtYWxpZ246anVzdGlmeTsKK30KKworbGkgeworICBtYXgtd2lkdGg6NTVlbTsKKyAgdGV4dC1hbGlnbjpqdXN0aWZ5OyAgCit9CisKK2ltZyB7CisgIGJvcmRlcjogMDsKK30KKworZGl2LmZyYWdtZW50IHsKKyAgZGlzcGxheTp0YWJsZTsgLyogdGhpcyBhbGxvd3MgdGhlIGVsZW1lbnQgdG8gYmUgbGFyZ2VyIHRoYW4gaXRzIHBhcmVudCAqLworICBwYWRkaW5nOiAwcHQ7Cit9CitwcmUuZnJhZ21lbnQgeworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOworCisgIG1hcmdpbjogMnB4IDBweCAycHggMHB4OworICBwYWRkaW5nOiAzcHggNXB4IDNweCA1cHg7Cit9CisKKworCisvKiBDb21tb24gc3R5bGUgZm9yIGFsbCBFaWdlbidzIHRhYmxlcyAqLworCit0YWJsZS5leGFtcGxlLCB0YWJsZS5tYW51YWwsIHRhYmxlLm1hbnVhbC12bCwgdGFibGUubWFudWFsLWhsIHsKKyAgICBtYXgtd2lkdGg6MTAwJTsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiAxcHg7CisgICAgYm9yZGVyLWNvbG9yOiAjY2NjY2NjOworICAgIGZvbnQtc2l6ZTogMWVtOworICAgIAorICAgIGJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgLW1vei1ib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKK30KKwordGFibGUuZXhhbXBsZSB0aCwgdGFibGUubWFudWFsIHRoLCB0YWJsZS5tYW51YWwtdmwgdGgsIHRhYmxlLm1hbnVhbC1obCB0aCB7CisgIHBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOworICB0ZXh0LWFsaWduOiBsZWZ0OworICBwYWRkaW5nLXJpZ2h0OiAxZW07CisgIGNvbG9yOiAjNTU1NTU1OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEU1OworICAKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsY2VudGVyIHRvcCxjZW50ZXIgYm90dG9tLGZyb20oI0ZGRkZGRiksIGNvbG9yLXN0b3AoMC4zLCNGRkZGRkYpLCBjb2xvci1zdG9wKDAuMzAsI0ZGRkZGRiksIGNvbG9yLXN0b3AoMC45OCwjRjRGNEU1KSwgdG8oI0VDRUNERSkpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChjZW50ZXIgdG9wLCAjRkZGRkZGIDAlLCAjRkZGRkZGIDMwJSwgI0Y0RjRFNSA5OCUsICNFQ0VDREUpOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjRkZGRkZGJywgZW5kQ29sb3JzdHI9JyNGNEY0RTUnKTsKK30KKwordGFibGUuZXhhbXBsZSB0ZCwgdGFibGUubWFudWFsIHRkLCB0YWJsZS5tYW51YWwtdmwgdGQsIHRhYmxlLm1hbnVhbC1obCB0ZCB7CisgIHZlcnRpY2FsLWFsaWduOnRvcDsKKyAgYm9yZGVyLXdpZHRoOiAxcHg7CisgIGJvcmRlci1jb2xvcjogI2NjY2NjYzsKK30KKworLyogaGVhZGVyIG9mIGhlYWRlcnMgKi8KK3RhYmxlIHRoLm1ldGEgeworICB0ZXh0LWFsaWduOmNlbnRlcjsKKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworfQorCisvKiBpbnRlcm1lZGlhdGUgaGVhZGVyICovCit0YWJsZSB0aC5pbnRlciB7CisgIHRleHQtYWxpZ246bGVmdDsKKyAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CisgIGJvcmRlci1zdHlsZTpzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsKKyAgYm9yZGVyLXdpZHRoOiAxcHg7CisJYm9yZGVyLWNvbG9yOiAjY2NjY2NjOworfQorCisvKiogY2xhc3MgZm9yIGV4ZW1wbGUgLyBvdXRwdXQgdGFibGVzICoqLworCit0YWJsZS5leGFtcGxlIHsKK30KKwordGFibGUuZXhhbXBsZSB0aCB7Cit9CisKK3RhYmxlLmV4YW1wbGUgdGQgeworICBwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKKyAgdmVydGljYWwtYWxpZ246dG9wOworfQorCisvKiBzdGFuZGFyZCBjbGFzcyBmb3IgdGhlIG1hbnVhbCAqLworCit0YWJsZS5tYW51YWwsIHRhYmxlLm1hbnVhbC12bCwgdGFibGUubWFudWFsLWhsIHsKKyAgICBwYWRkaW5nOiAwLjJlbSAwZW0gMC41ZW0gMGVtOworfQorCit0YWJsZS5tYW51YWwgdGgsIHRhYmxlLm1hbnVhbC12bCB0aCwgdGFibGUubWFudWFsLWhsIHRoIHsKKyAgbWFyZ2luOiAwZW0gMGVtIDAuM2VtIDBlbTsKK30KKwordGFibGUubWFudWFsIHRkLCB0YWJsZS5tYW51YWwtdmwgdGQsIHRhYmxlLm1hbnVhbC1obCB0ZCB7CisgIHBhZGRpbmc6IDAuM2VtIDAuNWVtIDAuM2VtIDAuNWVtOworICB2ZXJ0aWNhbC1hbGlnbjp0b3A7CisgIGJvcmRlci13aWR0aDogMXB4OworfQorCit0YWJsZS5tYW51YWwgdGQuYWx0LCB0YWJsZS5tYW51YWwgdHIuYWx0LCB0YWJsZS5tYW51YWwtdmwgdGQuYWx0LCB0YWJsZS5tYW51YWwtdmwgdHIuYWx0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRFNTsKK30KKwordGFibGUubWFudWFsLXZsIHRoLCB0YWJsZS5tYW51YWwtdmwgdGQsIHRhYmxlLm1hbnVhbC12bCB0ZC5hbHQgeworICBib3JkZXItY29sb3I6ICNjY2NjY2M7CisgIGJvcmRlci13aWR0aDogMXB4OworICBib3JkZXItc3R5bGU6IG5vbmUgc29saWQgbm9uZSBzb2xpZDsKK30KKwordGFibGUubWFudWFsLXZsIHRoLmludGVyIHsKKyAgYm9yZGVyLXN0eWxlOiBzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsKK30KKwordGFibGUubWFudWFsLWhsIHRkIHsKKyAgYm9yZGVyLWNvbG9yOiAjY2NjY2NjOworICBib3JkZXItd2lkdGg6IDFweDsKKyAgYm9yZGVyLXN0eWxlOiBzb2xpZCBub25lIHNvbGlkIG5vbmU7Cit9CisKK3RhYmxlIHRkLmNvZGUgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorCitoMiB7CisgIG1hcmdpbi10b3A6MmVtOworICBib3JkZXItc3R5bGU6IG5vbmUgbm9uZSBzb2xpZCBub25lOworICBib3JkZXItd2lkdGg6IDFweDsKKyAgYm9yZGVyLWNvbG9yOiAjY2NjY2NjOworfQorCisvKioqKiBUYWJsZSBvZiBjb250ZW50IGluIHRoZSBzaWRlLW5hdiAqKioqLworCisKK2Rpdi50b2MgeworICBtYXJnaW46MDsKKyAgcGFkZGluZzogMC4zZW0gMCAwIDA7CisgIHdpZHRoOjEwMCU7CisgIGZsb2F0Om5vbmU7CisgIHBvc2l0aW9uOmFic29sdXRlOworICBib3R0b206MDsKKyAgYm9yZGVyLXJhZGl1czowcHg7CisgIGJvcmRlci1zdHlsZTogc29saWQgbm9uZSBub25lIG5vbmU7Cit9CisKK2Rpdi50b2MgaDMgeworICBtYXJnaW4tbGVmdDogMC41ZW07CisgIG1hcmdpbi1ib3R0b206IDAuMmVtOworfQorCitkaXYudG9jIHVsIHsKKyAgbWFyZ2luOiAwLjJlbSAwIDAuNGVtIDAuNWVtOworfQorCitzcGFuLmNwcDExLHNwYW4uY3BwMTQsc3Bhbi5jcHAxNyB7CisgIGNvbG9yOiAjMTE5OTExOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLyoqKiogb2xkIEVpZ2VuJ3Mgc3R5bGVzICoqKiovCisKKwordGFibGUudHV0b3JpYWxfY29kZSB0ZCB7CisgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIHJlcXVpcmVkIGZvciBGaXJlZm94ICovCisgIHBhZGRpbmc6IDNwdCA1cHQgM3B0IDVwdDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworCisvKiBXaGVuZXZlciBkb3h5Z2VuIG1lZXRzIGEgJ1xuJyBvciBhICc8QlIvPicsIGl0IHdpbGwgcHV0IAorICogdGhlIHRleHQgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIGludG8gYSA8cCBjbGFzcz0ic3RhcnR0ZCI+LgorICogVGhpcyBsaXR0bGUgaGFjayB0b2dldGhlciB3aXRoIHRhYmxlLnR1dG9yaWFsX2NvZGUgdGQubm90ZQorICogYWltcyBhdCBmaXhpbmcgdGhpcyBpc3N1ZS4gKi8KK3RhYmxlLnR1dG9yaWFsX2NvZGUgdGQubm90ZSBwLnN0YXJ0dGQgeworICBtYXJnaW46IDBweDsKKyAgYm9yZGVyOiBub25lOworICBwYWRkaW5nOiAwcHg7Cit9CisKK2Rpdi5laW1haW5tZW51IHsKKyAgdGV4dC1hbGlnbjogICAgIGNlbnRlcjsKK30KKworLyogY2VudGVyIHZlcnNpb24gbnVtYmVyIG9uIG1haW4gcGFnZSAqLworaDMudmVyc2lvbiB7IAorICB0ZXh0LWFsaWduOiAgICAgY2VudGVyOworfQorCisKK3RkLndpZHRoMjBlbSBwLmVuZHRkIHsKKyAgd2lkdGg6ICAyMGVtOworfQpkaWZmIC0tZ2l0IGEvZG9jL2VpZ2VuZG94eV9mb290ZXIuaHRtbC5pbiBiL2RvYy9laWdlbmRveHlfZm9vdGVyLmh0bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4MjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9laWdlbmRveHlfZm9vdGVyLmh0bWwuaW4KQEAgLTAsMCArMSwzNiBAQAorPCEtLSBzdGFydCBmb290ZXIgcGFydCAtLT4KKzwhLS1CRUdJTiBHRU5FUkFURV9UUkVFVklFVy0tPgorPGRpdiBpZD0ibmF2LXBhdGgiIGNsYXNzPSJuYXZwYXRoIj48IS0tIGlkIGlzIG5lZWRlZCBmb3IgdHJlZXZpZXcgZnVuY3Rpb24hIC0tPgorICA8dWw+CisgICAgJG5hdnBhdGgKKyAgICA8bGkgY2xhc3M9ImZvb3RlciI+JGdlbmVyYXRlZGJ5CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4KKyAgICA8aW1nIGNsYXNzPSJmb290ZXIiIHNyYz0iJHJlbHBhdGgkZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIvPjwvYT4gJGRveHlnZW52ZXJzaW9uIDwvbGk+CisgIDwvdWw+Cis8L2Rpdj4KKzwhLS1FTkQgR0VORVJBVEVfVFJFRVZJRVctLT4KKzwhLS1CRUdJTiAhR0VORVJBVEVfVFJFRVZJRVctLT4KKzxociBjbGFzcz0iZm9vdGVyIi8+PGFkZHJlc3MgY2xhc3M9ImZvb3RlciI+PHNtYWxsPgorJGdlbmVyYXRlZGJ5ICYjMTYwOzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+Cis8aW1nIGNsYXNzPSJmb290ZXIiIHNyYz0iJHJlbHBhdGgkZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIvPgorPC9hPiAkZG94eWdlbnZlcnNpb24KKzwvc21hbGw+PC9hZGRyZXNzPgorPCEtLUVORCAhR0VORVJBVEVfVFJFRVZJRVctLT4KKworPCEtLSBQaXdpayAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK3ZhciBwa0Jhc2VVUkwgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3N0YXRzLnN5bHBoaWRlLWNvbnN1bHRpbmcuY29tL3Bpd2lrLyIgOiAiaHR0cDovL3N0YXRzLnN5bHBoaWRlLWNvbnN1bHRpbmcuY29tL3Bpd2lrLyIpOworZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBwa0Jhc2VVUkwgKyAicGl3aWsuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOworPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgordHJ5IHsKK3ZhciBwaXdpa1RyYWNrZXIgPSBQaXdpay5nZXRUcmFja2VyKHBrQmFzZVVSTCArICJwaXdpay5waHAiLCAyMCk7CitwaXdpa1RyYWNrZXIudHJhY2tQYWdlVmlldygpOworcGl3aWtUcmFja2VyLmVuYWJsZUxpbmtUcmFja2luZygpOworfSBjYXRjaCggZXJyICkge30KKzwvc2NyaXB0Pjxub3NjcmlwdD48cD48aW1nIHNyYz0iaHR0cDovL3N0YXRzLnN5bHBoaWRlLWNvbnN1bHRpbmcuY29tL3Bpd2lrL3Bpd2lrLnBocD9pZHNpdGU9MjAiIHN0eWxlPSJib3JkZXI6MCIgYWx0PSIiIC8+PC9wPjwvbm9zY3JpcHQ+Cis8IS0tIEVuZCBQaXdpayBUcmFja2luZyBDb2RlIC0tPgorCis8L2JvZHk+Cis8L2h0bWw+CisKKwpkaWZmIC0tZ2l0IGEvZG9jL2VpZ2VuZG94eV9oZWFkZXIuaHRtbC5pbiBiL2RvYy9laWdlbmRveHlfaGVhZGVyLmh0bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzODU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9laWdlbmRveHlfaGVhZGVyLmh0bWwuaW4KQEAgLTAsMCArMSw2MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQveGh0bWw7Y2hhcnNldD1VVEYtOCIvPgorPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT05Ii8+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRveHlnZW4gJGRveHlnZW52ZXJzaW9uIi8+Cis8IS0tQkVHSU4gUFJPSkVDVF9OQU1FLS0+PHRpdGxlPiRwcm9qZWN0bmFtZTogJHRpdGxlPC90aXRsZT48IS0tRU5EIFBST0pFQ1RfTkFNRS0tPgorPCEtLUJFR0lOICFQUk9KRUNUX05BTUUtLT48dGl0bGU+JHRpdGxlPC90aXRsZT48IS0tRU5EICFQUk9KRUNUX05BTUUtLT4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJHRhYnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkcmVscGF0aCRqcXVlcnkuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHJlbHBhdGgkZHluc2VjdGlvbnMuanMiPjwvc2NyaXB0PgorJHRyZWV2aWV3Ciskc2VhcmNoCiskbWF0aGpheAorPGxpbmsgaHJlZj0iJHJlbHBhdGgkJHN0eWxlc2hlZXQiICAgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJGVpZ2VuZG94eS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPCEtLSAkZXh0cmFzdHlsZXNoZWV0IC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHJlbHBhdGgkZWlnZW5fbmF2dHJlZV9oYWNrcy5qcyI+PC9zY3JpcHQ+Cis8IS0tIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4gLS0+Cis8IS0tIDwvc2NyaXB0PiAtLT4KKworPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJ0b3AiPjwhLS0gZG8gbm90IHJlbW92ZSB0aGlzIGRpdiwgaXQgaXMgY2xvc2VkIGJ5IGRveHlnZW4hIC0tPgorPCEtLSA8YSBuYW1lPSJ0b3AiPjwvYT4gLS0+CisKKzwhLS1CRUdJTiBUSVRMRUFSRUEtLT4KKzxkaXYgaWQ9InRpdGxlYXJlYSI+Cis8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyA8dGJvZHk+CisgPHRyIHN0eWxlPSJoZWlnaHQ6IDU2cHg7Ij4KKyAgPCEtLUJFR0lOIFBST0pFQ1RfTE9HTy0tPgorICA8dGQgaWQ9InByb2plY3Rsb2dvIj48aW1nIGFsdD0iTG9nbyIgc3JjPSIkcmVscGF0aCQkcHJvamVjdGxvZ28iLz48L3RkPgorICA8IS0tRU5EIFBST0pFQ1RfTE9HTy0tPgorICA8IS0tQkVHSU4gUFJPSkVDVF9OQU1FLS0+CisgIDx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OiAwLjVlbTsiPgorICAgPGRpdiBpZD0icHJvamVjdG5hbWUiPjxhIGhyZWY9Imh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnIj4kcHJvamVjdG5hbWU8L2E+CisgICA8IS0tQkVHSU4gUFJPSkVDVF9OVU1CRVItLT4mIzE2MDs8c3BhbiBpZD0icHJvamVjdG51bWJlciI+JHByb2plY3RudW1iZXI8L3NwYW4+PCEtLUVORCBQUk9KRUNUX05VTUJFUi0tPgorICAgPC9kaXY+CisgICA8IS0tQkVHSU4gUFJPSkVDVF9CUklFRi0tPjxkaXYgaWQ9InByb2plY3RicmllZiI+JHByb2plY3RicmllZjwvZGl2PjwhLS1FTkQgUFJPSkVDVF9CUklFRi0tPgorICA8L3RkPgorICA8IS0tRU5EIFBST0pFQ1RfTkFNRS0tPgorICA8IS0tQkVHSU4gIVBST0pFQ1RfTkFNRS0tPgorICAgPCEtLUJFR0lOIFBST0pFQ1RfQlJJRUYtLT4KKyAgICA8dGQgc3R5bGU9InBhZGRpbmctbGVmdDogMC41ZW07Ij4KKyAgICA8ZGl2IGlkPSJwcm9qZWN0YnJpZWYiPiRwcm9qZWN0YnJpZWY8L2Rpdj4KKyAgICA8L3RkPgorICAgPCEtLUVORCBQUk9KRUNUX0JSSUVGLS0+CisgIDwhLS1FTkQgIVBST0pFQ1RfTkFNRS0tPgorICA8IS0tQkVHSU4gRElTQUJMRV9JTkRFWC0tPgorICAgPCEtLUJFR0lOIFNFQVJDSEVOR0lORS0tPgorICAgPHRkPiRzZWFyY2hib3g8L3RkPgorICAgPCEtLUVORCBTRUFSQ0hFTkdJTkUtLT4KKyAgPCEtLUVORCBESVNBQkxFX0lOREVYLS0+CisgPC90cj4KKyA8L3Rib2R5PgorPC90YWJsZT4KKzwvZGl2PgorPCEtLUVORCBUSVRMRUFSRUEtLT4KKzwhLS0gZW5kIGhlYWRlciBwYXJ0IC0tPgorCmRpZmYgLS1naXQgYS9kb2MvZWlnZW5kb3h5X2xheW91dC54bWwuaW4gYi9kb2MvZWlnZW5kb3h5X2xheW91dC54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0YjYyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9laWdlbmRveHlfbGF5b3V0LnhtbC5pbgpAQCAtMCwwICsxLDE3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8ZG94eWdlbmxheW91dCB2ZXJzaW9uPSIxLjAiPgorICA8IS0tIE5hdmlnYXRpb24gaW5kZXggdGFicyBmb3IgSFRNTCBvdXRwdXQgLS0+CisgIDxuYXZpbmRleD4KKyAgICA8dGFiIHR5cGU9InVzZXIiIHVybD0iaW5kZXguaHRtbCIgdGl0bGU9Ik92ZXJ2aWV3IiAvPgorICAgIDx0YWIgdHlwZT0idXNlciIgdXJsPSJAcmVmIEdldHRpbmdTdGFydGVkIiB0aXRsZT0iR2V0dGluZyBzdGFydGVkIiAvPgorICAgIDx0YWIgdHlwZT0ibW9kdWxlcyIgdmlzaWJsZT0ieWVzIiB0aXRsZT0iQ2hhcHRlcnMiIGludHJvPSIiLz4KKyAgICA8dGFiIHR5cGU9Im1haW5wYWdlIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICA8dGFiIHR5cGU9ImNsYXNzbGlzdCIgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIiBpbnRybz0iIi8+Cis8IS0tICAgICA8dGFiIHR5cGU9ImNsYXNzbWVtYmVycyIgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIiBpbnRybz0iIi8+IC0tPgorICA8L25hdmluZGV4PgorCisgIDwhLS0gTGF5b3V0IGRlZmluaXRpb24gZm9yIGEgY2xhc3MgcGFnZSAtLT4KKyAgPGNsYXNzPgorICAgIDxicmllZmRlc2NyaXB0aW9uIHZpc2libGU9Im5vIi8+CisgICAgPGluY2x1ZGVzIHZpc2libGU9IiRTSE9XX0lOQ0xVREVfRklMRVMiLz4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPGluaGVyaXRhbmNlZ3JhcGggdmlzaWJsZT0iJENMQVNTX0dSQVBIIi8+CisgICAgPGNvbGxhYm9yYXRpb25ncmFwaCB2aXNpYmxlPSIkQ09MTEFCT1JBVElPTl9HUkFQSCIvPgorICAgIDxhbGxtZW1iZXJzbGluayB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8bWVtYmVyZGVjbD4KKyAgICAgIDxuZXN0ZWRjbGFzc2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3R5cGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNzbG90cyB0aXRsZT0iIi8+CisgICAgICA8c2lnbmFscyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljc3RhdGljbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljc3RhdGljYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkdHlwZXMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzdGF0aWNtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzdGF0aWNhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwYWNrYWdldHlwZXMgdGl0bGU9IiIvPgorICAgICAgPHBhY2thZ2VtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwYWNrYWdlc3RhdGljbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cGFja2FnZWF0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHBhY2thZ2VzdGF0aWNhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm9wZXJ0aWVzIHRpdGxlPSIiLz4KKyAgICAgIDxldmVudHMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGV0eXBlcyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXN0YXRpY21ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlc3RhdGljYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8ZnJpZW5kcyB0aXRsZT0iIi8+CisgICAgICA8cmVsYXRlZCB0aXRsZT0iIiBzdWJ0aXRsZT0iIi8+CisgICAgICA8bWVtYmVyZ3JvdXBzIHZpc2libGU9InllcyIvPgorICAgIDwvbWVtYmVyZGVjbD4KKyAgICAKKyAgICA8bWVtYmVyZGVmPgorICAgICAgPGlubGluZWNsYXNzZXMgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8Y29uc3RydWN0b3JzIHRpdGxlPSIiLz4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPHJlbGF0ZWQgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8cHJvcGVydGllcyB0aXRsZT0iIi8+CisgICAgICA8ZXZlbnRzIHRpdGxlPSIiLz4KKyAgICA8L21lbWJlcmRlZj4KKyAgICA8dXNlZGZpbGVzIHZpc2libGU9IiRTSE9XX1VTRURfRklMRVMiLz4KKyAgICA8YXV0aG9yc2VjdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgPC9jbGFzcz4KKworICA8IS0tIExheW91dCBkZWZpbml0aW9uIGZvciBhIG5hbWVzcGFjZSBwYWdlIC0tPgorICA8bmFtZXNwYWNlPgorICAgIDxicmllZmRlc2NyaXB0aW9uIHZpc2libGU9InllcyIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPG5lc3RlZG5hbWVzcGFjZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8Y2xhc3NlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICAgIDxtZW1iZXJncm91cHMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICAgIDxkZXRhaWxlZGRlc2NyaXB0aW9uIHRpdGxlPSIiLz4KKyAgICA8bWVtYmVyZGVmPgorICAgICAgPGlubGluZWNsYXNzZXMgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgIDwvbWVtYmVyZGVmPgorICAgIDxhdXRob3JzZWN0aW9uIHZpc2libGU9InllcyIvPgorICA8L25hbWVzcGFjZT4KKworICA8IS0tIExheW91dCBkZWZpbml0aW9uIGZvciBhIGZpbGUgcGFnZSAtLT4KKyAgPGZpbGU+CisgICAgPGJyaWVmZGVzY3JpcHRpb24gdmlzaWJsZT0ieWVzIi8+CisgICAgPGluY2x1ZGVzIHZpc2libGU9IiRTSE9XX0lOQ0xVREVfRklMRVMiLz4KKyAgICA8aW5jbHVkZWdyYXBoIHZpc2libGU9IiRJTkNMVURFX0dSQVBIIi8+CisgICAgPGluY2x1ZGVkYnlncmFwaCB2aXNpYmxlPSIkSU5DTFVERURfQllfR1JBUEgiLz4KKyAgICA8c291cmNlbGluayB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8bWVtYmVyZGVjbD4KKyAgICAgIDxjbGFzc2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPG5hbWVzcGFjZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8ZGVmaW5lcyB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8bWVtYmVyZ3JvdXBzIHZpc2libGU9InllcyIvPgorICAgIDwvbWVtYmVyZGVjbD4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPG1lbWJlcmRlZj4KKyAgICAgIDxpbmxpbmVjbGFzc2VzIHRpdGxlPSIiLz4KKyAgICAgIDxkZWZpbmVzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICA8L21lbWJlcmRlZj4KKyAgICA8YXV0aG9yc2VjdGlvbi8+CisgIDwvZmlsZT4KKworICA8IS0tIExheW91dCBkZWZpbml0aW9uIGZvciBhIGdyb3VwIHBhZ2UgLS0+CisgIDxncm91cD4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJubyIvPgorICAgIDxkZXRhaWxlZGRlc2NyaXB0aW9uIHRpdGxlPSIiLz4KKyAgICA8Z3JvdXBncmFwaCB2aXNpYmxlPSIkR1JPVVBfR1JBUEhTIi8+CisgICAgPG1lbWJlcmRlY2w+CisgICAgICA8bmVzdGVkZ3JvdXBzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGRpcnMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8ZmlsZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8bmFtZXNwYWNlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxjbGFzc2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGRlZmluZXMgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXZhbHVlcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgICAgPHNpZ25hbHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3Nsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxldmVudHMgdGl0bGU9IiIvPgorICAgICAgPHByb3BlcnRpZXMgdGl0bGU9IiIvPgorICAgICAgPGZyaWVuZHMgdGl0bGU9IiIvPgorICAgICAgPG1lbWJlcmdyb3VwcyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8L21lbWJlcmRlY2w+CisgICAgCisgICAgPG1lbWJlcmRlZj4KKyAgICAgIDxwYWdlZG9jcy8+CisgICAgICA8aW5saW5lY2xhc3NlcyB0aXRsZT0iIi8+CisgICAgICA8ZGVmaW5lcyB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtdmFsdWVzIHRpdGxlPSIiLz4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8c2lnbmFscyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPGV2ZW50cyB0aXRsZT0iIi8+CisgICAgICA8cHJvcGVydGllcyB0aXRsZT0iIi8+CisgICAgICA8ZnJpZW5kcyB0aXRsZT0iIi8+CisgICAgPC9tZW1iZXJkZWY+CisgICAgPGF1dGhvcnNlY3Rpb24gdmlzaWJsZT0ieWVzIi8+CisgIDwvZ3JvdXA+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBkaXJlY3RvcnkgcGFnZSAtLT4KKyAgPGRpcmVjdG9yeT4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8ZGlyZWN0b3J5Z3JhcGggdmlzaWJsZT0ieWVzIi8+CisgICAgPG1lbWJlcmRlY2w+CisgICAgICA8ZGlycyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICAgIDxmaWxlcyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8L21lbWJlcmRlY2w+CisgICAgPGRldGFpbGVkZGVzY3JpcHRpb24gdGl0bGU9IiIvPgorICA8L2RpcmVjdG9yeT4KKzwvZG94eWdlbmxheW91dD4KZGlmZiAtLWdpdCBhL2RvYy9laWdlbmRveHlfdGFicy5jc3MgYi9kb2MvZWlnZW5kb3h5X3RhYnMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTIwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWlnZW5kb3h5X3RhYnMuY3NzCkBAIC0wLDAgKzEsNTkgQEAKKy50YWJzLCAudGFiczIsIC50YWJzMyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICB6LWluZGV4OiAxMDE7CisgICAgZm9udC1zaXplOiAxM3B4OworfQorCisudGFiczIgeworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KKy50YWJzMyB7CisgICAgZm9udC1zaXplOiA5cHg7Cit9CisKKy50YWJsaXN0IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiB0YWJsZTsKK30KKworLnRhYmxpc3QgbGkgeworICAgIGZsb2F0OiBsZWZ0OworICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKyAgICBsaW5lLWhlaWdodDogMzZweDsKKyAgICBsaXN0LXN0eWxlOiBub25lOworfQorCisudGFibGlzdCBhIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwYWRkaW5nOiAwIDIwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoJ3RhYl9zLnBuZycpOworICAgIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworICAgIGNvbG9yOiAjMjgzQTVEOworICAgIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy50YWJzMyAudGFibGlzdCBhIHsKKyAgICBwYWRkaW5nOiAwIDEwcHg7Cit9CisKKy50YWJsaXN0IGE6aG92ZXIgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgndGFiX2gucG5nJyk7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgICAgY29sb3I6ICNmZmY7CisgICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMS4wKTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy50YWJsaXN0IGxpLmN1cnJlbnQgYSB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYS5wbmcnKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsKKyAgICBjb2xvcjogI2ZmZjsKKyAgICB0ZXh0LXNoYWRvdzogMHB4IDFweCAxcHggcmdiYSgwLCAwLCAwLCAxLjApOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzLy5rcmF6eSBiL2RvYy9leGFtcGxlcy8ua3JhenkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy8ua3JhenkKQEAgLTAsMCArMSwyIEBACitFWENMVURFIGNvcHlyaWdodAorRVhDTFVERSBsaWNlbnNlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQgYi9kb2MvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIxIEBACitmaWxlKEdMT0IgZXhhbXBsZXNfU1JDUyAiKi5jcHAiKQorCitmb3JlYWNoKGV4YW1wbGVfc3JjICR7ZXhhbXBsZXNfU1JDU30pCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoZXhhbXBsZSAke2V4YW1wbGVfc3JjfSBOQU1FX1dFKQorICBhZGRfZXhlY3V0YWJsZSgke2V4YW1wbGV9ICR7ZXhhbXBsZV9zcmN9KQorICBpZihFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtleGFtcGxlfSAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgVEFSR0VUICR7ZXhhbXBsZX0KKyAgICBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke2V4YW1wbGV9CisgICAgQVJHUyA+JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7ZXhhbXBsZX0ub3V0CisgICkKKyAgYWRkX2RlcGVuZGVuY2llcyhhbGxfZXhhbXBsZXMgJHtleGFtcGxlfSkKK2VuZGZvcmVhY2goZXhhbXBsZV9zcmMpCisKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKCItc3RkPWMrKzExIiBFSUdFTl9DT01QSUxFUl9TVVBQT1JUX0NQUDExKQoraWYoRUlHRU5fQ09NUElMRVJfU1VQUE9SVF9DUFAxMSkKK2VpX2FkZF90YXJnZXRfcHJvcGVydHkobnVsbGFyeV9pbmRleGluZyBDT01QSUxFX0ZMQUdTICItc3RkPWMrKzExIikKK2VuZGlmKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3VzdG9taXppbmdFaWdlbl9Jbmhlcml0YW5jZS5jcHAgYi9kb2MvZXhhbXBsZXMvQ3VzdG9taXppbmdFaWdlbl9Jbmhlcml0YW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkZjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9DdXN0b21pemluZ0VpZ2VuX0luaGVyaXRhbmNlLmNwcApAQCAtMCwwICsxLDMwIEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworY2xhc3MgTXlWZWN0b3JUeXBlIDogcHVibGljIEVpZ2VuOjpWZWN0b3JYZAoreworcHVibGljOgorICAgIE15VmVjdG9yVHlwZSh2b2lkKTpFaWdlbjo6VmVjdG9yWGQoKSB7fQorCisgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdCBNeVZlY3RvclR5cGUgZnJvbSBFaWdlbiBleHByZXNzaW9ucworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBNeVZlY3RvclR5cGUoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICAgIDogRWlnZW46OlZlY3RvclhkKG90aGVyKQorICAgIHsgfQorCisgICAgLy8gVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBhc3NpZ24gRWlnZW4gZXhwcmVzc2lvbnMgdG8gTXlWZWN0b3JUeXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIE15VmVjdG9yVHlwZSYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlIDxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICAgIHRoaXMtPkVpZ2VuOjpWZWN0b3JYZDo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KK307CisKK2ludCBtYWluKCkKK3sKKyAgTXlWZWN0b3JUeXBlIHYgPSBNeVZlY3RvclR5cGU6Ok9uZXMoNCk7CisgIHYoMikgKz0gMTA7CisgIHYgPSAyICogdjsKKyAgc3RkOjpjb3V0IDw8IHYudHJhbnNwb3NlKCkgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL0N3aXNlX2VyZi5jcHAgYi9kb2MvZXhhbXBsZXMvQ3dpc2VfZXJmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2NkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL0N3aXNlX2VyZi5jcHAKQEAgLTAsMCArMSw5IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGVjaWFsRnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworaW50IG1haW4oKQoreworICBBcnJheTRkIHYoLTAuNSwyLDAsLTcpOworICBzdGQ6OmNvdXQgPDwgdi5lcmYoKSA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3dpc2VfZXJmYy5jcHAgYi9kb2MvZXhhbXBsZXMvQ3dpc2VfZXJmYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYjA0YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmZjLmNwcApAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwZWNpYWxGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CitpbnQgbWFpbigpCit7CisgIEFycmF5NGQgdigtMC41LDIsMCwtNyk7CisgIHN0ZDo6Y291dCA8PCB2LmVyZmMoKSA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3dpc2VfbGdhbW1hLmNwcCBiL2RvYy9leGFtcGxlcy9Dd2lzZV9sZ2FtbWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzRmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvQ3dpc2VfbGdhbW1hLmNwcApAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwZWNpYWxGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CitpbnQgbWFpbigpCit7CisgIEFycmF5NGQgdigwLjUsMTAsMCwtMSk7CisgIHN0ZDo6Y291dCA8PCB2LmxnYW1tYSgpIDw8IHN0ZDo6ZW5kbDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZUNvbHNfaW50LmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlQ29sc19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZUNvbHNfaW50LmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoMS4uMyw6KSA9XG4iIDw8IEEubWlkZGxlQ29scygxLDMpIDw8IGVuZGw7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50LmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmU5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50LmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoMi4uMyw6KSA9XG4iIDw8IEEubWlkZGxlUm93cygyLDIpIDw8IGVuZGw7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZUNvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoOiwxLi4zKSA9XG4iIDw8IEEubWlkZGxlQ29sczwzPigxKSA8PCBlbmRsOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5jcHAgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVSb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThiNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGNvbnN0IE4gPSA1OworICAgIE1hdHJpeFhpIEEoTixOKTsKKyAgICBBLnNldFJhbmRvbSgpOworICAgIGNvdXQgPDwgIkEgPVxuIiA8PCBBIDw8ICdcbicgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJBKDEuLjMsOikgPVxuIiA8PCBBLm1pZGRsZVJvd3M8Mz4oMSkgPDwgZW5kbDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUuY3BwIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzOGMwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgRWlnZW46Ok1hdHJpeFhkOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhkIG0oMiwyKTsKKyAgbSgwLDApID0gMzsKKyAgbSgxLDApID0gMi41OworICBtKDAsMSkgPSAtMTsKKyAgbSgxLDEpID0gbSgxLDApICsgbSgwLDEpOworICBzdGQ6OmNvdXQgPDwgbSA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcCBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2R5bmFtaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjc0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGQgbSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKKyAgbSA9IChtICsgTWF0cml4WGQ6OkNvbnN0YW50KDMsMywxLjIpKSAqIDUwOworICBjb3V0IDw8ICJtID0iIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworICBWZWN0b3JYZCB2KDMpOworICB2IDw8IDEsIDIsIDM7CisgIGNvdXQgPDwgIm0gKiB2ID0iIDw8IGVuZGwgPDwgbSAqIHYgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcCBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTExNzUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZTJfZml4ZWQuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtID0gKG0gKyBNYXRyaXgzZDo6Q29uc3RhbnQoMS4yKSkgKiA1MDsKKyAgY291dCA8PCAibSA9IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKKyAgVmVjdG9yM2QgdigxLDIsMyk7CisgIAorICBjb3V0IDw8ICJtICogdiA9IiA8PCBlbmRsIDw8IG0gKiB2IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcCBiL2RvYy9leGFtcGxlcy9UZW1wbGF0ZUtleXdvcmRfZmxleGlibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODUyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcApAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK3ZvaWQgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoTWF0cml4QmFzZTxEZXJpdmVkMT4mIGRzdCwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIHNyYykKK3sKKyAgLyogTm90ZSB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkcyBpbiB0aGUgZm9sbG93aW5nIGxpbmUhICovCisgIGRzdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHNyYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKK30KKworaW50IG1haW4oKQoreworICBNYXRyaXhYaSBtMSA9IE1hdHJpeFhpOjpPbmVzKDUsNSk7CisgIE1hdHJpeFhpIG0yID0gTWF0cml4WGk6OlJhbmRvbSg0LDQpOworICBzdGQ6OmNvdXQgPDwgIm0yIGJlZm9yZSBjb3B5OiIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbTIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgY29weVVwcGVyVHJpYW5ndWxhclBhcnQobTIsIG0xLnRvcExlZnRDb3JuZXIoNCw0KSk7CisgIHN0ZDo6Y291dCA8PCAibTIgYWZ0ZXIgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5OGMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UZW1wbGF0ZUtleXdvcmRfc2ltcGxlLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydChNYXRyaXhYZiYgZHN0LCBjb25zdCBNYXRyaXhYZiYgc3JjKQoreworICBkc3QudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBzcmMudHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgbTEgPSBNYXRyaXhYZjo6T25lcyg0LDQpOworICBNYXRyaXhYZiBtMiA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKKyAgc3RkOjpjb3V0IDw8ICJtMiBiZWZvcmUgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KG0yLCBtMSk7CisgIHN0ZDo6Y291dCA8PCAibTIgYWZ0ZXIgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxJbnBsYWNlTFUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsSW5wbGFjZUxVLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjljNTliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsSW5wbGFjZUxVLmNwcApAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CitzdHJ1Y3QgaW5pdCB7CisgIGluaXQoKSB7IHN0ZDo6Y291dCA8PCAiWyIgPDwgImluaXQiIDw8ICJdIiA8PCBzdGQ6OmVuZGw7IH0KK307Citpbml0IGluaXRfb2JqOworLy8gW2luaXRdCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGQgQSgyLDIpOworICBBIDw8IDIsIC0xLCAxLCAzOworICBjb3V0IDw8ICJIZXJlIGlzIHRoZSBpbnB1dCBtYXRyaXggQSBiZWZvcmUgZGVjb21wb3NpdGlvbjpcbiIgPDwgQSA8PCBlbmRsOworY291dCA8PCAiW2luaXRdIiA8PCBlbmRsOworCitjb3V0IDw8ICJbZGVjbGFyYXRpb25dIiA8PCBlbmRsOworICBQYXJ0aWFsUGl2TFU8UmVmPE1hdHJpeFhkPiA+IGx1KEEpOworICBjb3V0IDw8ICJIZXJlIGlzIHRoZSBpbnB1dCBtYXRyaXggQSBhZnRlciBkZWNvbXBvc2l0aW9uOlxuIiA8PCBBIDw8IGVuZGw7Citjb3V0IDw8ICJbZGVjbGFyYXRpb25dIiA8PCBlbmRsOworCitjb3V0IDw8ICJbbWF0cml4TFVdIiA8PCBlbmRsOworICBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggc3RvcmluZyB0aGUgTCBhbmQgVSBmYWN0b3JzOlxuIiA8PCBsdS5tYXRyaXhMVSgpIDw8IGVuZGw7Citjb3V0IDw8ICJbbWF0cml4TFVdIiA8PCBlbmRsOworCitjb3V0IDw8ICJbc29sdmVdIiA8PCBlbmRsOworICBNYXRyaXhYZCBBMCgyLDIpOyBBMCA8PCAyLCAtMSwgMSwgMzsKKyAgVmVjdG9yWGQgYigyKTsgICAgYiA8PCAxLCAyOworICBWZWN0b3JYZCB4ID0gbHUuc29sdmUoYik7CisgIGNvdXQgPDwgIlJlc2lkdWFsOiAiIDw8IChBMCAqIHggLSBiKS5ub3JtKCkgPDwgZW5kbDsKK2NvdXQgPDwgIltzb2x2ZV0iIDw8IGVuZGw7CisKK2NvdXQgPDwgIlttb2RpZnlBXSIgPDwgZW5kbDsKKyAgQSA8PCAzLCA0LCAtMiwgMTsKKyAgeCA9IGx1LnNvbHZlKGIpOworICBjb3V0IDw8ICJSZXNpZHVhbDogIiA8PCAoQTAgKiB4IC0gYikubm9ybSgpIDw8IGVuZGw7Citjb3V0IDw8ICJbbW9kaWZ5QV0iIDw8IGVuZGw7CisKK2NvdXQgPDwgIltyZWNvbXB1dGVdIiA8PCBlbmRsOworICBBMCA9IEE7IC8vIHNhdmUgQQorICBsdS5jb21wdXRlKEEpOworICB4ID0gbHUuc29sdmUoYik7CisgIGNvdXQgPDwgIlJlc2lkdWFsOiAiIDw8IChBMCAqIHggLSBiKS5ub3JtKCkgPDwgZW5kbDsKK2NvdXQgPDwgIltyZWNvbXB1dGVdIiA8PCBlbmRsOworCitjb3V0IDw8ICJbcmVjb21wdXRlX2JpczBdIiA8PCBlbmRsOworICBNYXRyaXhYZCBBMSgyLDIpOworICBBMSA8PCA1LC0yLDMsNDsKKyAgbHUuY29tcHV0ZShBMSk7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIGlucHV0IG1hdHJpeCBBMSBhZnRlciBkZWNvbXBvc2l0aW9uOlxuIiA8PCBBMSA8PCBlbmRsOworY291dCA8PCAiW3JlY29tcHV0ZV9iaXMwXSIgPDwgZW5kbDsKKworY291dCA8PCAiW3JlY29tcHV0ZV9iaXMxXSIgPDwgZW5kbDsKKyAgeCA9IGx1LnNvbHZlKGIpOworICBjb3V0IDw8ICJSZXNpZHVhbDogIiA8PCAoQTEgKiB4IC0gYikubm9ybSgpIDw8IGVuZGw7Citjb3V0IDw8ICJbcmVjb21wdXRlX2JpczFdIiA8PCBlbmRsOworCit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdDb21wdXRlVHdpY2UuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJhNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcApAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJmIEEsIGI7CisgICBMTFQ8TWF0cml4MmY+IGxsdDsKKyAgIEEgPDwgMiwgLTEsIC0xLCAzOworICAgYiA8PCAxLCAyLCAzLCAxOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBiOlxuIiA8PCBiIDw8IGVuZGw7CisgICBjb3V0IDw8ICJDb21wdXRpbmcgTExUIGRlY29tcG9zaXRpb24uLi4iIDw8IGVuZGw7CisgICBsbHQuY29tcHV0ZShBKTsKKyAgIGNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IGVuZGw7CisgICBBKDEsMSkrKzsKKyAgIGNvdXQgPDwgIlRoZSBtYXRyaXggQSBpcyBub3c6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkNvbXB1dGluZyBMTFQgZGVjb21wb3NpdGlvbi4uLiIgPDwgZW5kbDsKKyAgIGxsdC5jb21wdXRlKEEpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzIG5vdzpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeENvbXB1dGVTb2x2ZUVycm9yLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4Q29tcHV0ZVNvbHZlRXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeENvbXB1dGVTb2x2ZUVycm9yLmNwcApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDEwMCwxMDApOworICAgTWF0cml4WGQgYiA9IE1hdHJpeFhkOjpSYW5kb20oMTAwLDUwKTsKKyAgIE1hdHJpeFhkIHggPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKGIpOworICAgZG91YmxlIHJlbGF0aXZlX2Vycm9yID0gKEEqeCAtIGIpLm5vcm0oKSAvIGIubm9ybSgpOyAvLyBub3JtKCkgaXMgTDIgbm9ybQorICAgY291dCA8PCAiVGhlIHJlbGF0aXZlIGVycm9yIGlzOlxuIiA8PCByZWxhdGl2ZV9lcnJvciA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTlhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlQ29sUGl2SG91c2Vob2xkZXJRUi5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgzZiBBOworICAgVmVjdG9yM2YgYjsKKyAgIEEgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCwxMDsKKyAgIGIgPDwgMywgMywgNDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgYjpcbiIgPDwgYiA8PCBlbmRsOworICAgVmVjdG9yM2YgeCA9IEEuY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKGIpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOlxuIiA8PCB4IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiZWFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4U29sdmVMRExULmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJmIEEsIGI7CisgICBBIDw8IDIsIC0xLCAtMSwgMzsKKyAgIGIgPDwgMSwgMiwgMywgMTsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgYjpcbiIgPDwgYiA8PCBlbmRsOworICAgTWF0cml4MmYgeCA9IEEubGRsdCgpLnNvbHZlKGIpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOlxuIiA8PCB4IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdJbnZlcnNlRGV0ZXJtaW5hbnQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRkZTViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDNmIEE7CisgICBBIDw8IDEsIDIsIDEsCisgICAgICAgIDIsIDEsIDAsCisgICAgICAgIC0xLCAxLCAyOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIlRoZSBkZXRlcm1pbmFudCBvZiBBIGlzICIgPDwgQS5kZXRlcm1pbmFudCgpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJUaGUgaW52ZXJzZSBvZiBBIGlzOlxuIiA8PCBBLmludmVyc2UoKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdSYW5rUmV2ZWFsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE2NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgzZiBBOworICAgQSA8PCAxLCAyLCA1LAorICAgICAgICAyLCAxLCA0LAorICAgICAgICAzLCAwLCAzOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIEZ1bGxQaXZMVTxNYXRyaXgzZj4gbHVfZGVjb21wKEEpOworICAgY291dCA8PCAiVGhlIHJhbmsgb2YgQSBpcyAiIDw8IGx1X2RlY29tcC5yYW5rKCkgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBmb3JtIGEgYmFzaXMgb2YgdGhlIG51bGwtc3BhY2Ugb2YgQTpcbiIKKyAgICAgICAgPDwgbHVfZGVjb21wLmtlcm5lbCgpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgZm9ybSBhIGJhc2lzIG9mIHRoZSBjb2x1bW4tc3BhY2Ugb2YgQTpcbiIKKyAgICAgICAgPDwgbHVfZGVjb21wLmltYWdlKEEpIDw8IGVuZGw7IC8vIHllcywgaGF2ZSB0byBwYXNzIHRoZSBvcmlnaW5hbCBBCit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTVkRTb2x2ZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTVkRTb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiYzAzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NWRFNvbHZlLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsIDIpOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIFZlY3RvclhmIGIgPSBWZWN0b3JYZjo6UmFuZG9tKDMpOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgcmlnaHQgaGFuZCBzaWRlIGI6XG4iIDw8IGIgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIlRoZSBsZWFzdC1zcXVhcmVzIHNvbHV0aW9uIGlzOlxuIgorICAgICAgICA8PCBBLmphY29iaVN2ZChDb21wdXRlVGhpblUgfCBDb21wdXRlVGhpblYpLnNvbHZlKGIpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWQxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJmIEE7CisgICBBIDw8IDEsIDIsIDIsIDM7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQTpcbiIgPDwgQSA8PCBlbmRsOworICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXgyZj4gZWlnZW5zb2x2ZXIoQSk7CisgICBpZiAoZWlnZW5zb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIGFib3J0KCk7CisgICBjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6XG4iIDw8IGVpZ2Vuc29sdmVyLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkhlcmUncyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSBlaWdlbnZlY3RvcnMgb2YgQSBcbiIKKyAgICAgICAgPDwgImNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgZWlnZW52YWx1ZXM6XG4iCisgICAgICAgIDw8IGVpZ2Vuc29sdmVyLmVpZ2VudmVjdG9ycygpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2V0VGhyZXNob2xkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU2YjEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2V0VGhyZXNob2xkLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJkIEE7CisgICBBIDw8IDIsIDEsCisgICAgICAgIDIsIDAuOTk5OTk5OTk5OTsKKyAgIEZ1bGxQaXZMVTxNYXRyaXgyZD4gbHUoQSk7CisgICBjb3V0IDw8ICJCeSBkZWZhdWx0LCB0aGUgcmFuayBvZiBBIGlzIGZvdW5kIHRvIGJlICIgPDwgbHUucmFuaygpIDw8IGVuZGw7CisgICBsdS5zZXRUaHJlc2hvbGQoMWUtNSk7CisgICBjb3V0IDw8ICJXaXRoIHRocmVzaG9sZCAxZS01LCB0aGUgcmFuayBvZiBBIGlzIGZvdW5kIHRvIGJlICIgPDwgbHUucmFuaygpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19hY2Nlc3NvcnMuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzcyMGZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLmNwcApAQCAtMCwwICsxLDI0IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgQXJyYXlYWGYgIG0oMiwyKTsKKyAgCisgIC8vIGFzc2lnbiBzb21lIHZhbHVlcyBjb2VmZmljaWVudCBieSBjb2VmZmljaWVudAorICBtKDAsMCkgPSAxLjA7IG0oMCwxKSA9IDIuMDsKKyAgbSgxLDApID0gMy4wOyBtKDEsMSkgPSBtKDAsMSkgKyBtKDEsMCk7CisgIAorICAvLyBwcmludCB2YWx1ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisgIGNvdXQgPDwgbSA8PCBlbmRsIDw8IGVuZGw7CisgCisgIC8vIHVzaW5nIHRoZSBjb21tYS1pbml0aWFsaXplciBpcyBhbHNvIGFsbG93ZWQKKyAgbSA8PCAxLjAsMi4wLAorICAgICAgIDMuMCw0LjA7CisgICAgIAorICAvLyBwcmludCB2YWx1ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisgIGNvdXQgPDwgbSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWRkaXRpb24uY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWRkaXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGZmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19hZGRpdGlvbi5jcHAKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEFycmF5WFhmIGEoMywzKTsKKyAgQXJyYXlYWGYgYigzLDMpOworICBhIDw8IDEsMiwzLAorICAgICAgIDQsNSw2LAorICAgICAgIDcsOCw5OworICBiIDw8IDEsMiwzLAorICAgICAgIDEsMiwzLAorICAgICAgIDEsMiwzOworICAgICAgIAorICAvLyBBZGRpbmcgdHdvIGFycmF5cworICBjb3V0IDw8ICJhICsgYiA9ICIgPDwgZW5kbCA8PCBhICsgYiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gU3VidHJhY3RpbmcgYSBzY2FsYXIgZnJvbSBhbiBhcnJheQorICBjb3V0IDw8ICJhIC0gMiA9ICIgPDwgZW5kbCA8PCBhIC0gMiA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfY3dpc2Vfb3RoZXIuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfY3dpc2Vfb3RoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19jd2lzZV9vdGhlci5jcHAKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEFycmF5WGYgYSA9IEFycmF5WGY6OlJhbmRvbSg1KTsKKyAgYSAqPSAyOworICBjb3V0IDw8ICJhID0iIDw8IGVuZGwgCisgICAgICAgPDwgYSA8PCBlbmRsOworICBjb3V0IDw8ICJhLmFicygpID0iIDw8IGVuZGwgCisgICAgICAgPDwgYS5hYnMoKSA8PCBlbmRsOworICBjb3V0IDw8ICJhLmFicygpLnNxcnQoKSA9IiA8PCBlbmRsIAorICAgICAgIDw8IGEuYWJzKCkuc3FydCgpIDw8IGVuZGw7CisgIGNvdXQgPDwgImEubWluKGEuYWJzKCkuc3FydCgpKSA9IiA8PCBlbmRsIAorICAgICAgIDw8IGEubWluKGEuYWJzKCkuc3FydCgpKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzFmMDcwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcC5jcHAKQEAgLTAsMCArMSwyMiBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhmIG0oMiwyKTsKKyAgTWF0cml4WGYgbigyLDIpOworICBNYXRyaXhYZiByZXN1bHQoMiwyKTsKKworICBtIDw8IDEsMiwKKyAgICAgICAzLDQ7CisgIG4gPDwgNSw2LAorICAgICAgIDcsODsKKyAgCisgIHJlc3VsdCA9IChtLmFycmF5KCkgKyA0KS5tYXRyaXgoKSAqIG07CisgIGNvdXQgPDwgIi0tIENvbWJpbmF0aW9uIDE6IC0tIiA8PCBlbmRsIDw8IHJlc3VsdCA8PCBlbmRsIDw8IGVuZGw7CisgIHJlc3VsdCA9IChtLmFycmF5KCkgKiBuLmFycmF5KCkpLm1hdHJpeCgpICogbTsKKyAgY291dCA8PCAiLS0gQ29tYmluYXRpb24gMjogLS0iIDw8IGVuZGwgPDwgcmVzdWx0IDw8IGVuZGwgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4LmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE0Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcF9tYXRyaXguY3BwCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBNYXRyaXhYZiBtKDIsMik7CisgIE1hdHJpeFhmIG4oMiwyKTsKKyAgTWF0cml4WGYgcmVzdWx0KDIsMik7CisKKyAgbSA8PCAxLDIsCisgICAgICAgMyw0OworICBuIDw8IDUsNiwKKyAgICAgICA3LDg7CisKKyAgcmVzdWx0ID0gbSAqIG47CisgIGNvdXQgPDwgIi0tIE1hdHJpeCBtKm46IC0tIiA8PCBlbmRsIDw8IHJlc3VsdCA8PCBlbmRsIDw8IGVuZGw7CisgIHJlc3VsdCA9IG0uYXJyYXkoKSAqIG4uYXJyYXkoKTsKKyAgY291dCA8PCAiLS0gQXJyYXkgbSpuOiAtLSIgPDwgZW5kbCA8PCByZXN1bHQgPDwgZW5kbCA8PCBlbmRsOworICByZXN1bHQgPSBtLmN3aXNlUHJvZHVjdChuKTsKKyAgY291dCA8PCAiLS0gV2l0aCBjd2lzZVByb2R1Y3Q6IC0tIiA8PCBlbmRsIDw8IHJlc3VsdCA8PCBlbmRsIDw8IGVuZGw7CisgIHJlc3VsdCA9IG0uYXJyYXkoKSArIDQ7CisgIGNvdXQgPDwgIi0tIEFycmF5IG0gKyA0OiAtLSIgPDwgZW5kbCA8PCByZXN1bHQgPDwgZW5kbCA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19tdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I0MzlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEFycmF5WFhmIGEoMiwyKTsKKyAgQXJyYXlYWGYgYigyLDIpOworICBhIDw8IDEsMiwKKyAgICAgICAzLDQ7CisgIGIgPDwgNSw2LAorICAgICAgIDcsODsKKyAgY291dCA8PCAiYSAqIGIgPSAiIDw8IGVuZGwgPDwgYSAqIGIgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfYmxvY2tfYXNzaWdubWVudC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Jsb2NrX2Fzc2lnbm1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjQ5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Jsb2NrX2Fzc2lnbm1lbnQuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBBcnJheTIyZiBtOworICBtIDw8IDEsMiwKKyAgICAgICAzLDQ7CisgIEFycmF5NDRmIGEgPSBBcnJheTQ0Zjo6Q29uc3RhbnQoMC42KTsKKyAgY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsIDw8IGVuZGw7CisgIGEuYmxvY2s8MiwyPigxLDEpID0gbTsKKyAgY291dCA8PCAiSGVyZSBpcyBub3cgYSB3aXRoIG0gY29waWVkIGludG8gaXRzIGNlbnRyYWwgMngyIGJsb2NrOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgYS5ibG9jaygwLDAsMiwzKSA9IGEuYmxvY2soMiwxLDIsMyk7CisgIGNvdXQgPDwgIkhlcmUgaXMgbm93IGEgd2l0aCBib3R0b20tcmlnaHQgMngzIGJsb2NrIGNvcGllZCBpbnRvIHRvcC1sZWZ0IDJ4MiBibG9jazoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3ZWIwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29scm93LmNwcApAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeFhmIG0oMywzKTsKKyAgbSA8PCAxLDIsMywKKyAgICAgICA0LDUsNiwKKyAgICAgICA3LDgsOTsKKyAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKKyAgY291dCA8PCAiMm5kIFJvdzogIiA8PCBtLnJvdygxKSA8PCBlbmRsOworICBtLmNvbCgyKSArPSAzICogbS5jb2woMCk7CisgIGNvdXQgPDwgIkFmdGVyIGFkZGluZyAzIHRpbWVzIHRoZSBmaXJzdCBjb2x1bW4gaW50byB0aGUgdGhpcmQgY29sdW1uLCB0aGUgbWF0cml4IG0gaXM6XG4iOworICBjb3V0IDw8IG0gPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29ybmVyLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29ybmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTMxNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb3JuZXIuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4NGYgbTsKKyAgbSA8PCAxLCAyLCAzLCA0LAorICAgICAgIDUsIDYsIDcsIDgsCisgICAgICAgOSwgMTAsMTEsMTIsCisgICAgICAgMTMsMTQsMTUsMTY7CisgIGNvdXQgPDwgIm0ubGVmdENvbHMoMikgPSIgPDwgZW5kbCA8PCBtLmxlZnRDb2xzKDIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgY291dCA8PCAibS5ib3R0b21Sb3dzPDI+KCkgPSIgPDwgZW5kbCA8PCBtLmJvdHRvbVJvd3M8Mj4oKSA8PCBlbmRsIDw8IGVuZGw7CisgIG0udG9wTGVmdENvcm5lcigxLDMpID0gbS5ib3R0b21SaWdodENvcm5lcigzLDEpLnRyYW5zcG9zZSgpOworICBjb3V0IDw8ICJBZnRlciBhc3NpZ25tZW50LCBtID0gIiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19wcmludF9ibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlYTRhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4WGYgbSg0LDQpOworICBtIDw8ICAxLCAyLCAzLCA0LAorICAgICAgICA1LCA2LCA3LCA4LAorICAgICAgICA5LDEwLDExLDEyLAorICAgICAgIDEzLDE0LDE1LDE2OworICBjb3V0IDw8ICJCbG9jayBpbiB0aGUgbWlkZGxlIiA8PCBlbmRsOworICBjb3V0IDw8IG0uYmxvY2s8MiwyPigxLDEpIDw8IGVuZGwgPDwgZW5kbDsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMzsgKytpKQorICB7CisgICAgY291dCA8PCAiQmxvY2sgb2Ygc2l6ZSAiIDw8IGkgPDwgIngiIDw8IGkgPDwgZW5kbDsKKyAgICBjb3V0IDw8IG0uYmxvY2soMCwwLGksaSkgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ZlY3Rvci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwYjAyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfdmVjdG9yLmNwcApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46OkFycmF5WGYgdig2KTsKKyAgdiA8PCAxLCAyLCAzLCA0LCA1LCA2OworICBjb3V0IDw8ICJ2LmhlYWQoMykgPSIgPDwgZW5kbCA8PCB2LmhlYWQoMykgPDwgZW5kbCA8PCBlbmRsOworICBjb3V0IDw8ICJ2LnRhaWw8Mz4oKSA9ICIgPDwgZW5kbCA8PCB2LnRhaWw8Mz4oKSA8PCBlbmRsIDw8IGVuZGw7CisgIHYuc2VnbWVudCgxLDQpICo9IDI7CisgIGNvdXQgPDwgImFmdGVyICd2LnNlZ21lbnQoMSw0KSAqPSAyJywgdiA9IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9QYXJ0aWFsTFVfc29sdmUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1BhcnRpYWxMVV9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MDg3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9QYXJ0aWFsTFVfc29sdmUuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgzZiBBOworICAgVmVjdG9yM2YgYjsKKyAgIEEgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCwxMDsKKyAgIGIgPDwgMywgMywgNDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgYjoiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOworICAgVmVjdG9yM2YgeCA9IEEubHUoKS5zb2x2ZShiKTsKKyAgIGNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczoiIDw8IGVuZGwgPDwgeCA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3RfMW5uLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0XzFubi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0YjRkOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0XzFubi5jcHAKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtKDIsNCk7CisgIEVpZ2VuOjpWZWN0b3JYZiB2KDIpOworICAKKyAgbSA8PCAxLCAyMywgNiwgOSwKKyAgICAgICAzLCAxMSwgNywgMjsKKyAgICAgICAKKyAgdiA8PCAyLAorICAgICAgIDM7CisKKyAgTWF0cml4WGY6OkluZGV4IGluZGV4OworICAvLyBmaW5kIG5lYXJlc3QgbmVpZ2hib3VyCisgIChtLmNvbHdpc2UoKSAtIHYpLmNvbHdpc2UoKS5zcXVhcmVkTm9ybSgpLm1pbkNvZWZmKCZpbmRleCk7CisKKyAgY291dCA8PCAiTmVhcmVzdCBuZWlnaGJvdXIgaXMgY29sdW1uICIgPDwgaW5kZXggPDwgIjoiIDw8IGVuZGw7CisgIGNvdXQgPDwgbS5jb2woaW5kZXgpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM4N2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlLmNwcApAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiw0KTsKKyAgRWlnZW46OlZlY3RvclhmIHYoMik7CisgIAorICBtYXQgPDwgMSwgMiwgNiwgOSwKKyAgICAgICAgIDMsIDEsIDcsIDI7CisgICAgICAgICAKKyAgdiA8PCAwLAorICAgICAgIDE7CisgICAgICAgCisgIC8vYWRkIHYgdG8gZWFjaCBjb2x1bW4gb2YgbQorICBtYXQuY29sd2lzZSgpICs9IHY7CisgIAorICBzdGQ6OmNvdXQgPDwgIkJyb2FkY2FzdGluZyByZXN1bHQ6ICIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbWF0IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdjOTZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlX3Jvd3dpc2UuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLDQpOworICBFaWdlbjo6VmVjdG9yWGYgdig0KTsKKyAgCisgIG1hdCA8PCAxLCAyLCA2LCA5LAorICAgICAgICAgMywgMSwgNywgMjsKKyAgICAgICAgIAorICB2IDw8IDAsMSwyLDM7CisgICAgICAgCisgIC8vYWRkIHYgdG8gZWFjaCByb3cgb2YgbQorICBtYXQucm93d2lzZSgpICs9IHYudHJhbnNwb3NlKCk7CisgIAorICBzdGQ6OmNvdXQgPDwgIkJyb2FkY2FzdGluZyByZXN1bHQ6ICIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbWF0IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfY29sd2lzZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2NvbHdpc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjgyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2NvbHdpc2UuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLDQpOworICBtYXQgPDwgMSwgMiwgNiwgOSwKKyAgICAgICAgIDMsIDEsIDcsIDI7CisgIAorICBzdGQ6OmNvdXQgPDwgIkNvbHVtbidzIG1heGltdW06ICIgPDwgc3RkOjplbmRsCisgICA8PCBtYXQuY29sd2lzZSgpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19tYXhub3JtLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5Yzc0NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5jcHAKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworaW50IG1haW4oKQoreworICBNYXRyaXhYZiBtYXQoMiw0KTsKKyAgbWF0IDw8IDEsIDIsIDYsIDksCisgICAgICAgICAzLCAxLCA3LCAyOworICAKKyAgTWF0cml4WGY6OkluZGV4ICAgbWF4SW5kZXg7CisgIGZsb2F0IG1heE5vcm0gPSBtYXQuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCZtYXhJbmRleCk7CisgIAorICBzdGQ6OmNvdXQgPDwgIk1heGltdW0gc3VtIGF0IHBvc2l0aW9uICIgPDwgbWF4SW5kZXggPDwgc3RkOjplbmRsOworCisgIHN0ZDo6Y291dCA8PCAiVGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9yIGlzOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG1hdC5jb2woIG1heEluZGV4ICkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkFuZCBpdHMgc3VtIGlzIGlzOiAiIDw8IG1heE5vcm0gPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2EzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfYm9vbC5jcHAKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIEFycmF5WFhmIGEoMiwyKTsKKyAgCisgIGEgPDwgMSwyLAorICAgICAgIDMsNDsKKworICBjb3V0IDw8ICIoYSA+IDApLmFsbCgpICAgPSAiIDw8IChhID4gMCkuYWxsKCkgPDwgZW5kbDsKKyAgY291dCA8PCAiKGEgPiAwKS5hbnkoKSAgID0gIiA8PCAoYSA+IDApLmFueSgpIDw8IGVuZGw7CisgIGNvdXQgPDwgIihhID4gMCkuY291bnQoKSA9ICIgPDwgKGEgPiAwKS5jb3VudCgpIDw8IGVuZGw7CisgIGNvdXQgPDwgZW5kbDsKKyAgY291dCA8PCAiKGEgPiAyKS5hbGwoKSAgID0gIiA8PCAoYSA+IDIpLmFsbCgpIDw8IGVuZGw7CisgIGNvdXQgPDwgIihhID4gMikuYW55KCkgICA9ICIgPDwgKGEgPiAyKS5hbnkoKSA8PCBlbmRsOworICBjb3V0IDw8ICIoYSA+IDIpLmNvdW50KCkgPSAiIDw8IChhID4gMikuY291bnQoKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0uY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDQzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfbm9ybS5jcHAKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIFZlY3RvclhmIHYoMik7CisgIE1hdHJpeFhmIG0oMiwyKSwgbigyLDIpOworICAKKyAgdiA8PCAtMSwKKyAgICAgICAyOworICAKKyAgbSA8PCAxLC0yLAorICAgICAgIC0zLDQ7CisKKyAgY291dCA8PCAidi5zcXVhcmVkTm9ybSgpID0gIiA8PCB2LnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKKyAgY291dCA8PCAidi5ub3JtKCkgPSAiIDw8IHYubm9ybSgpIDw8IGVuZGw7CisgIGNvdXQgPDwgInYubHBOb3JtPDE+KCkgPSAiIDw8IHYubHBOb3JtPDE+KCkgPDwgZW5kbDsKKyAgY291dCA8PCAidi5scE5vcm08SW5maW5pdHk+KCkgPSAiIDw8IHYubHBOb3JtPEluZmluaXR5PigpIDw8IGVuZGw7CisKKyAgY291dCA8PCBlbmRsOworICBjb3V0IDw8ICJtLnNxdWFyZWROb3JtKCkgPSAiIDw8IG0uc3F1YXJlZE5vcm0oKSA8PCBlbmRsOworICBjb3V0IDw8ICJtLm5vcm0oKSA9ICIgPDwgbS5ub3JtKCkgPDwgZW5kbDsKKyAgY291dCA8PCAibS5scE5vcm08MT4oKSA9ICIgPDwgbS5scE5vcm08MT4oKSA8PCBlbmRsOworICBjb3V0IDw8ICJtLmxwTm9ybTxJbmZpbml0eT4oKSA9ICIgPDwgbS5scE5vcm08SW5maW5pdHk+KCkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19vcGVyYXRvcm5vcm0uY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX29wZXJhdG9ybm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlMjhmYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19vcGVyYXRvcm5vcm0uY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBNYXRyaXhYZiBtKDIsMik7CisgIG0gPDwgMSwtMiwKKyAgICAgICAtMyw0OworCisgIGNvdXQgPDwgIjEtbm9ybShtKSAgICAgPSAiIDw8IG0uY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCkubWF4Q29lZmYoKQorICAgICAgIDw8ICIgPT0gIiAgICAgICAgICAgICA8PCBtLmNvbHdpc2UoKS5scE5vcm08MT4oKS5tYXhDb2VmZigpIDw8IGVuZGw7CisKKyAgY291dCA8PCAiaW5mdHktbm9ybShtKSA9ICIgPDwgbS5jd2lzZUFicygpLnJvd3dpc2UoKS5zdW0oKS5tYXhDb2VmZigpCisgICAgICAgPDwgIiA9PSAiICAgICAgICAgICAgIDw8IG0ucm93d2lzZSgpLmxwTm9ybTwxPigpLm1heENvZWZmKCkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3Rpbmdfcm93d2lzZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Jvd3dpc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDI3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Jvd3dpc2UuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLDQpOworICBtYXQgPDwgMSwgMiwgNiwgOSwKKyAgICAgICAgIDMsIDEsIDcsIDI7CisgIAorICBzdGQ6OmNvdXQgPDwgIlJvdydzIG1heGltdW06ICIgPDwgc3RkOjplbmRsCisgICA8PCBtYXQucm93d2lzZSgpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Zpc2l0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRlOWFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtKDIsMik7CisgIAorICBtIDw8IDEsIDIsCisgICAgICAgMywgNDsKKworICAvL2dldCBsb2NhdGlvbiBvZiBtYXhpbXVtCisgIE1hdHJpeFhmOjpJbmRleCBtYXhSb3csIG1heENvbDsKKyAgZmxvYXQgbWF4ID0gbS5tYXhDb2VmZigmbWF4Um93LCAmbWF4Q29sKTsKKworICAvL2dldCBsb2NhdGlvbiBvZiBtaW5pbXVtCisgIE1hdHJpeFhmOjpJbmRleCBtaW5Sb3csIG1pbkNvbDsKKyAgZmxvYXQgbWluID0gbS5taW5Db2VmZigmbWluUm93LCAmbWluQ29sKTsKKworICBjb3V0IDw8ICJNYXg6ICIgPDwgbWF4IDw8ICAiLCBhdDogIiA8PAorICAgICBtYXhSb3cgPDwgIiwiIDw8IG1heENvbCA8PCBlbmRsOworICBjb3V0IDw8ICJNaW46ICIgPDwgbWluIDw8ICIsIGF0OiAiIDw8CisgICAgIG1pblJvdyA8PCAiLCIgPDwgbWluQ29sIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZHluYW1pY19zaXplLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9zaW1wbGVfZXhhbXBsZV9keW5hbWljX3NpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDI4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZHluYW1pY19zaXplLmNwcApAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIGZvciAoaW50IHNpemU9MTsgc2l6ZTw9NDsgKytzaXplKQorICB7CisgICAgTWF0cml4WGkgbShzaXplLHNpemUrMSk7ICAgICAgICAgLy8gYSAoc2l6ZSl4KHNpemUrMSktbWF0cml4IG9mIGludCdzCisgICAgZm9yIChpbnQgaj0wOyBqPG0uY29scygpOyArK2opICAgLy8gbG9vcCBvdmVyIGNvbHVtbnMKKyAgICAgIGZvciAoaW50IGk9MDsgaTxtLnJvd3MoKTsgKytpKSAvLyBsb29wIG92ZXIgcm93cworICAgICAgICBtKGksaikgPSBpK2oqbS5yb3dzKCk7ICAgICAgIC8vIHRvIGFjY2VzcyBtYXRyaXggY29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBvcGVyYXRvcigpKGludCxpbnQpCisgICAgc3RkOjpjb3V0IDw8IG0gPDwgIlxuXG4iOworICB9CisKKyAgVmVjdG9yWGYgdig0KTsgLy8gYSB2ZWN0b3Igb2YgNCBmbG9hdCdzCisgIC8vIHRvIGFjY2VzcyB2ZWN0b3IgY29lZmZpY2llbnRzLCB1c2UgZWl0aGVyIG9wZXJhdG9yICgpIG9yIG9wZXJhdG9yIFtdCisgIHZbMF0gPSAxOyB2WzFdID0gMjsgdigyKSA9IDM7IHYoMykgPSA0OworICBzdGQ6OmNvdXQgPDwgIlxudjpcbiIgPDwgdiA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZml4ZWRfc2l6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZml4ZWRfc2l6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0Zjk1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9zaW1wbGVfZXhhbXBsZV9maXhlZF9zaXplLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeDNmIG0zOworICBtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OworICBNYXRyaXg0ZiBtNCA9IE1hdHJpeDRmOjpJZGVudGl0eSgpOworICBWZWN0b3I0aSB2NCgxLCAyLCAzLCA0KTsKKworICBzdGQ6OmNvdXQgPDwgIm0zXG4iIDw8IG0zIDw8ICJcbm00OlxuIgorICAgIDw8IG00IDw8ICJcbnY0OlxuIiA8PCB2NCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfQmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U3MTlhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0Jsb2NrLmNwcApAQCAtMCwwICsxLDI3IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFaWdlbjo6QmxvY2s8RGVyaXZlZD4KK3RvcExlZnRDb3JuZXIoTWF0cml4QmFzZTxEZXJpdmVkPiYgbSwgaW50IHJvd3MsIGludCBjb2xzKQoreworICByZXR1cm4gRWlnZW46OkJsb2NrPERlcml2ZWQ+KG0uZGVyaXZlZCgpLCAwLCAwLCByb3dzLCBjb2xzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IEVpZ2VuOjpCbG9jazxjb25zdCBEZXJpdmVkPgordG9wTGVmdENvcm5lcihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLCBpbnQgcm93cywgaW50IGNvbHMpCit7CisgIHJldHVybiBFaWdlbjo6QmxvY2s8Y29uc3QgRGVyaXZlZD4obS5kZXJpdmVkKCksIDAsIDAsIHJvd3MsIGNvbHMpOworfQorCitpbnQgbWFpbihpbnQsIGNoYXIqKikKK3sKKyAgTWF0cml4NGQgbSA9IE1hdHJpeDRkOjpJZGVudGl0eSgpOworICBjb3V0IDw8IHRvcExlZnRDb3JuZXIoNCptLCAyLCAzKSA8PCBlbmRsOyAvLyBjYWxscyB0aGUgY29uc3QgdmVyc2lvbgorICB0b3BMZWZ0Q29ybmVyKG0sIDIsIDMpICo9IDU7ICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KKyAgY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZUJpbmFyeU9wLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZUJpbmFyeU9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODJhZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlQmluYXJ5T3AuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gZGVmaW5lIGEgY3VzdG9tIHRlbXBsYXRlIGJpbmFyeSBmdW5jdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBNYWtlQ29tcGxleE9wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IoTWFrZUNvbXBsZXhPcCkKKyAgdHlwZWRlZiBjb21wbGV4PFNjYWxhcj4gcmVzdWx0X3R5cGU7CisgIGNvbXBsZXg8U2NhbGFyPiBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSBjb25zdCB7IHJldHVybiBjb21wbGV4PFNjYWxhcj4oYSxiKTsgfQorfTsKKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDRkIG0xID0gTWF0cml4NGQ6OlJhbmRvbSgpLCBtMiA9IE1hdHJpeDRkOjpSYW5kb20oKTsKKyAgY291dCA8PCBtMS5iaW5hcnlFeHByKG0yLCBNYWtlQ29tcGxleE9wPGRvdWJsZT4oKSkgPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmNjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcApAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIGRlZmluZSBhIGN1c3RvbSB0ZW1wbGF0ZSB1bmFyeSBmdW5jdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgQ3dpc2VDbGFtcE9wIHsKKyAgQ3dpc2VDbGFtcE9wKGNvbnN0IFNjYWxhciYgaW5mLCBjb25zdCBTY2FsYXImIHN1cCkgOiBtX2luZihpbmYpLCBtX3N1cChzdXApIHt9CisgIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgeCkgY29uc3QgeyByZXR1cm4geDxtX2luZiA/IG1faW5mIDogKHg+bV9zdXAgPyBtX3N1cCA6IHgpOyB9CisgIFNjYWxhciBtX2luZiwgbV9zdXA7Cit9OworCitpbnQgbWFpbihpbnQsIGNoYXIqKikKK3sKKyAgTWF0cml4NGQgbTEgPSBNYXRyaXg0ZDo6UmFuZG9tKCk7CisgIGNvdXQgPDwgbTEgPDwgZW5kbCA8PCAiYmVjb21lczogIiA8PCBlbmRsIDw8IG0xLnVuYXJ5RXhwcihDd2lzZUNsYW1wT3A8ZG91YmxlPigtMC41LDAuNSkpIDw8IGVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4uY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzA2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wX3B0cmZ1bi5jcHAKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvLyBkZWZpbmUgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCBjb2VmZmljaWVudC13aXNlCitkb3VibGUgcmFtcChkb3VibGUgeCkKK3sKKyAgaWYgKHggPiAwKQorICAgIHJldHVybiB4OworICBlbHNlIAorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQsIGNoYXIqKikKK3sKKyAgTWF0cml4NGQgbTEgPSBNYXRyaXg0ZDo6UmFuZG9tKCk7CisgIGNvdXQgPDwgbTEgPDwgZW5kbCA8PCAiYmVjb21lczogIiA8PCBlbmRsIDw8IG0xLnVuYXJ5RXhwcihwdHJfZnVuKHJhbXApKSA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZEJsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZEJsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc4YjMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkQmxvY2suY3BwCkBAIC0wLDAgKzEsMjcgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VpZ2VuOjpCbG9jazxEZXJpdmVkLCAyLCAyPgordG9wTGVmdDJ4MkNvcm5lcihNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQoreworICByZXR1cm4gRWlnZW46OkJsb2NrPERlcml2ZWQsIDIsIDI+KG0uZGVyaXZlZCgpLCAwLCAwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IEVpZ2VuOjpCbG9jazxjb25zdCBEZXJpdmVkLCAyLCAyPgordG9wTGVmdDJ4MkNvcm5lcihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQoreworICByZXR1cm4gRWlnZW46OkJsb2NrPGNvbnN0IERlcml2ZWQsIDIsIDI+KG0uZGVyaXZlZCgpLCAwLCAwKTsKK30KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKKyAgY291dCA8PCB0b3BMZWZ0MngyQ29ybmVyKDQqbSkgPDwgZW5kbDsgLy8gY2FsbHMgdGhlIGNvbnN0IHZlcnNpb24KKyAgdG9wTGVmdDJ4MkNvcm5lcihtKSAqPSAyOyAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5vbi1jb25zdCB2ZXJzaW9uCisgIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRWZWN0b3JCbG9jay5jcHAgYi9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRWZWN0b3JCbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4YzlmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZFZlY3RvckJsb2NrLmNwcApAQCAtMCwwICsxLDI3IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZCwgMj4KK2ZpcnN0VHdvKE1hdHJpeEJhc2U8RGVyaXZlZD4mIHYpCit7CisgIHJldHVybiBFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZCwgMj4odi5kZXJpdmVkKCksIDApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgRWlnZW46OlZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIDI+CitmaXJzdFR3byhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiB2KQoreworICByZXR1cm4gRWlnZW46OlZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIDI+KHYuZGVyaXZlZCgpLCAwKTsKK30KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDxpbnQsMSw2PiB2OyB2IDw8IDEsMiwzLDQsNSw2OworICBjb3V0IDw8IGZpcnN0VHdvKDQqdikgPDwgZW5kbDsgLy8gY2FsbHMgdGhlIGNvbnN0IHZlcnNpb24KKyAgZmlyc3RUd28odikgKj0gMjsgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBub24tY29uc3QgdmVyc2lvbgorICBjb3V0IDw8ICJOb3cgdGhlIHZlY3RvciB2IGlzOiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX1ZlY3RvckJsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19WZWN0b3JCbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMTNkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19WZWN0b3JCbG9jay5jcHAKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRWlnZW46OlZlY3RvckJsb2NrPERlcml2ZWQ+CitzZWdtZW50RnJvbVJhbmdlKE1hdHJpeEJhc2U8RGVyaXZlZD4mIHYsIGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpWZWN0b3JCbG9jazxEZXJpdmVkPih2LmRlcml2ZWQoKSwgc3RhcnQsIGVuZC1zdGFydCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBFaWdlbjo6VmVjdG9yQmxvY2s8Y29uc3QgRGVyaXZlZD4KK3NlZ21lbnRGcm9tUmFuZ2UoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgdiwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICByZXR1cm4gRWlnZW46OlZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+KHYuZGVyaXZlZCgpLCBzdGFydCwgZW5kLXN0YXJ0KTsKK30KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDxpbnQsMSw2PiB2OyB2IDw8IDEsMiwzLDQsNSw2OworICBjb3V0IDw8IHNlZ21lbnRGcm9tUmFuZ2UoMip2LCAyLCA0KSA8PCBlbmRsOyAvLyBjYWxscyB0aGUgY29uc3QgdmVyc2lvbgorICBzZWdtZW50RnJvbVJhbmdlKHYsIDEsIDMpICo9IDU7ICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KKyAgY291dCA8PCAiTm93IHRoZSB2ZWN0b3IgdiBpczoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcCBiL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ5NGIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2Z1bmN0aW9uX3Rha2luZ19laWdlbmJhc2UuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgcHJpbnRfc2l6ZShjb25zdCBFaWdlbkJhc2U8RGVyaXZlZD4mIGIpCit7CisgIHN0ZDo6Y291dCA8PCAic2l6ZSAocm93cywgY29scyk6ICIgPDwgYi5zaXplKCkgPDwgIiAoIiA8PCBiLnJvd3MoKQorICAgICAgICAgICAgPDwgIiwgIiA8PCBiLmNvbHMoKSA8PCAiKSIgPDwgc3RkOjplbmRsOworfQorCitpbnQgbWFpbigpCit7CisgICAgVmVjdG9yM2YgdjsKKyAgICBwcmludF9zaXplKHYpOworICAgIC8vIHYuYXNEaWFnb25hbCgpIHJldHVybnMgYSAzeDMgZGlhZ29uYWwgbWF0cml4IHBzZXVkby1leHByZXNzaW9uCisgICAgcHJpbnRfc2l6ZSh2LmFzRGlhZ29uYWwoKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX3JlZi5jcHAgYi9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX3JlZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyYTIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfcmVmLmNwcApAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vU1ZEPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworZmxvYXQgaW52X2NvbmQoY29uc3QgUmVmPGNvbnN0IE1hdHJpeFhmPiYgYSkKK3sKKyAgY29uc3QgVmVjdG9yWGYgc2luZ192YWxzID0gYS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpOworICByZXR1cm4gc2luZ192YWxzKHNpbmdfdmFscy5zaXplKCktMSkgLyBzaW5nX3ZhbHMoMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4NGYgbSA9IE1hdHJpeDRmOjpSYW5kb20oKTsKKyAgY291dCA8PCAibWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbCA8PCBlbmRsOworICBjb3V0IDw8ICJpbnZfY29uZChtKTogICAgICAgICAgIiA8PCBpbnZfY29uZChtKSAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBjb3V0IDw8ICJpbnZfY29uZChtKDE6MywxOjMpKTogIiA8PCBpbnZfY29uZChtLnRvcExlZnRDb3JuZXIoMywzKSkgICA8PCBlbmRsOworICBjb3V0IDw8ICJpbnZfY29uZChtK0kpOiAgICAgICAgIiA8PCBpbnZfY29uZChtK01hdHJpeDRmOjpJZGVudGl0eSgpKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcCBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlNmFhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAKQEAgLTAsMCArMSwxMSBAQAorLyoKK1RoaXMgcHJvZ3JhbSBpcyBwcmVzZW50ZWQgaW4gc2V2ZXJhbCBmcmFnbWVudHMgaW4gdGhlIGRvYyBwYWdlLgorRXZlcnkgZnJhZ21lbnQgaXMgaW4gaXRzIG93biBmaWxlOyB0aGlzIGZpbGUgc2ltcGx5IGNvbWJpbmVzIHRoZW0uCisqLworCisjaW5jbHVkZSAibWFrZV9jaXJjdWxhbnQuY3BwLnByZWFtYmxlIgorI2luY2x1ZGUgIm1ha2VfY2lyY3VsYW50LmNwcC50cmFpdHMiCisjaW5jbHVkZSAibWFrZV9jaXJjdWxhbnQuY3BwLmV4cHJlc3Npb24iCisjaW5jbHVkZSAibWFrZV9jaXJjdWxhbnQuY3BwLmV2YWx1YXRvciIKKyNpbmNsdWRlICJtYWtlX2NpcmN1bGFudC5jcHAuZW50cnkiCisjaW5jbHVkZSAibWFrZV9jaXJjdWxhbnQuY3BwLm1haW4iCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmVudHJ5IGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5lbnRyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQyZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5lbnRyeQpAQCAtMCwwICsxLDUgQEAKK3RlbXBsYXRlIDxjbGFzcyBBcmdUeXBlPgorQ2lyY3VsYW50PEFyZ1R5cGU+IG1ha2VDaXJjdWxhbnQoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8QXJnVHlwZT4mIGFyZykKK3sKKyAgcmV0dXJuIENpcmN1bGFudDxBcmdUeXBlPihhcmcuZGVyaXZlZCgpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXZhbHVhdG9yIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5ldmFsdWF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhNzllNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXZhbHVhdG9yCkBAIC0wLDAgKzEsMzIgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVHlwZT4KKyAgICBzdHJ1Y3QgZXZhbHVhdG9yPENpcmN1bGFudDxBcmdUeXBlPiA+CisgICAgICA6IGV2YWx1YXRvcl9iYXNlPENpcmN1bGFudDxBcmdUeXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiBDaXJjdWxhbnQ8QXJnVHlwZT4gWHByVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkX2V2YWw8QXJnVHlwZSwgWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+Ojp0eXBlIEFyZ1R5cGVOZXN0ZWQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8QXJnVHlwZU5lc3RlZD46OnR5cGUgQXJnVHlwZU5lc3RlZENsZWFuZWQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICAgIGVudW0geyAKKyAgICAgICAgQ29lZmZSZWFkQ29zdCA9IGV2YWx1YXRvcjxBcmdUeXBlTmVzdGVkQ2xlYW5lZD46OkNvZWZmUmVhZENvc3QsCisgICAgICAgIEZsYWdzID0gRWlnZW46OkNvbE1ham9yIAorICAgICAgfTsKKyAgICAgIAorICAgICAgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICAgICAgOiBtX2FyZ0ltcGwoeHByLm1fYXJnKSwgbV9yb3dzKHhwci5yb3dzKCkpCisgICAgICB7IH0KKworICAgICAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgICAgeworICAgICAgICBJbmRleCBpbmRleCA9IHJvdyAtIGNvbDsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggKz0gbV9yb3dzOworICAgICAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKGluZGV4KTsKKyAgICAgIH0KKworICAgICAgZXZhbHVhdG9yPEFyZ1R5cGVOZXN0ZWRDbGVhbmVkPiBtX2FyZ0ltcGw7CisgICAgICBjb25zdCBJbmRleCBtX3Jvd3M7CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5leHByZXNzaW9uIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5leHByZXNzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGNkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmV4cHJlc3Npb24KQEAgLTAsMCArMSwyMCBAQAordGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGU+CitjbGFzcyBDaXJjdWxhbnQgOiBwdWJsaWMgRWlnZW46Ok1hdHJpeEJhc2U8Q2lyY3VsYW50PEFyZ1R5cGU+ID4KK3sKK3B1YmxpYzoKKyAgQ2lyY3VsYW50KGNvbnN0IEFyZ1R5cGUmIGFyZykKKyAgICA6IG1fYXJnKGFyZykKKyAgeyAKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKEFyZ1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IDEsCisgICAgICAgICAgICAgICAgICAgICAgICBZT1VfVFJJRURfQ0FMTElOR19BX1ZFQ1RPUl9NRVRIT0RfT05fQV9NQVRSSVgpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxDaXJjdWxhbnQ+Ojp0eXBlIE5lc3RlZDsgCisKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2FyZy5yb3dzKCk7IH0KKyAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnLnJvd3MoKTsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZWZfc2VsZWN0b3I8QXJnVHlwZT46OnR5cGUgQXJnVHlwZU5lc3RlZDsKKyAgQXJnVHlwZU5lc3RlZCBtX2FyZzsKK307CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLm1haW4gYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLm1haW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3Zjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAubWFpbgpAQCAtMCwwICsxLDggQEAKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46OlZlY3RvclhkIHZlYyg0KTsKKyAgdmVjIDw8IDEsIDIsIDQsIDg7CisgIEVpZ2VuOjpNYXRyaXhYZCBtYXQ7CisgIG1hdCA9IG1ha2VDaXJjdWxhbnQodmVjKTsKKyAgc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnByZWFtYmxlIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5wcmVhbWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc1Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5wcmVhbWJsZQpAQCAtMCwwICsxLDQgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4gY2xhc3MgQ2lyY3VsYW50OwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC50cmFpdHMgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnRyYWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA0NTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC50cmFpdHMKQEAgLTAsMCArMSwxOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKyAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KKyAgICBzdHJ1Y3QgdHJhaXRzPENpcmN1bGFudDxBcmdUeXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiBFaWdlbjo6RGVuc2UgU3RvcmFnZUtpbmQ7CisgICAgICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXhYcHIgWHByS2luZDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICAgIGVudW0geyAKKyAgICAgICAgRmxhZ3MgPSBFaWdlbjo6Q29sTWFqb3IsCisgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgICAgIH07CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50Mi5jcHAgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQzZGQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50Mi5jcHAKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworLy8gW2NpcmN1bGFudF9mdW5jXQordGVtcGxhdGU8Y2xhc3MgQXJnVHlwZT4KK2NsYXNzIGNpcmN1bGFudF9mdW5jdG9yIHsKKyAgY29uc3QgQXJnVHlwZSAmbV92ZWM7CitwdWJsaWM6CisgIGNpcmN1bGFudF9mdW5jdG9yKGNvbnN0IEFyZ1R5cGUmIGFyZykgOiBtX3ZlYyhhcmcpIHt9CisKKyAgY29uc3QgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyJiBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QgeworICAgIEluZGV4IGluZGV4ID0gcm93IC0gY29sOworICAgIGlmIChpbmRleCA8IDApIGluZGV4ICs9IG1fdmVjLnNpemUoKTsKKyAgICByZXR1cm4gbV92ZWMoaW5kZXgpOworICB9Cit9OworLy8gW2NpcmN1bGFudF9mdW5jXQorCisvLyBbc3F1YXJlXQordGVtcGxhdGU8Y2xhc3MgQXJnVHlwZT4KK3N0cnVjdCBjaXJjdWxhbnRfaGVscGVyIHsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyLAorICAgICAgICAgICAgICAgICBBcmdUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgQXJnVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIENvbE1ham9yLAorICAgICAgICAgICAgICAgICBBcmdUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgQXJnVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU+IE1hdHJpeFR5cGU7Cit9OworLy8gW3NxdWFyZV0KKworLy8gW21ha2VDaXJjdWxhbnRdCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KK0N3aXNlTnVsbGFyeU9wPGNpcmN1bGFudF9mdW5jdG9yPEFyZ1R5cGU+LCB0eXBlbmFtZSBjaXJjdWxhbnRfaGVscGVyPEFyZ1R5cGU+OjpNYXRyaXhUeXBlPgorbWFrZUNpcmN1bGFudChjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxBcmdUeXBlPiYgYXJnKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGNpcmN1bGFudF9oZWxwZXI8QXJnVHlwZT46Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgcmV0dXJuIE1hdHJpeFR5cGU6Ok51bGxhcnlFeHByKGFyZy5zaXplKCksIGFyZy5zaXplKCksIGNpcmN1bGFudF9mdW5jdG9yPEFyZ1R5cGU+KGFyZy5kZXJpdmVkKCkpKTsKK30KKy8vIFttYWtlQ2lyY3VsYW50XQorCisvLyBbbWFpbl0KK2ludCBtYWluKCkKK3sKKyAgRWlnZW46OlZlY3RvclhkIHZlYyg0KTsKKyAgdmVjIDw8IDEsIDIsIDQsIDg7CisgIEVpZ2VuOjpNYXRyaXhYZCBtYXQ7CisgIG1hdCA9IG1ha2VDaXJjdWxhbnQodmVjKTsKKyAgc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7Cit9CisvLyBbbWFpbl0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9tYXRyaXhmcmVlX2NnLmNwcCBiL2RvYy9leGFtcGxlcy9tYXRyaXhmcmVlX2NnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTIwNWFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21hdHJpeGZyZWVfY2cuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CisKK2NsYXNzIE1hdHJpeFJlcGxhY2VtZW50OwordXNpbmcgRWlnZW46OlNwYXJzZU1hdHJpeDsKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIC8vIE1hdHJpeFJlcGxhY2VtZW50IGxvb2tzLWxpa2UgYSBTcGFyc2VNYXRyaXgsIHNvIGxldCdzIGluaGVyaXRzIGl0cyB0cmFpdHM6CisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IHRyYWl0czxNYXRyaXhSZXBsYWNlbWVudD4gOiAgcHVibGljIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiA+CisgIHt9OworfQorfQorCisvLyBFeGFtcGxlIG9mIGEgbWF0cml4LWZyZWUgd3JhcHBlciBmcm9tIGEgdXNlciB0eXBlIHRvIEVpZ2VuJ3MgY29tcGF0aWJsZSB0eXBlCisvLyBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgdGhpcyBleGFtcGxlIHNpbXBseSB3cmFwIGEgRWlnZW46OlNwYXJzZU1hdHJpeC4KK2NsYXNzIE1hdHJpeFJlcGxhY2VtZW50IDogcHVibGljIEVpZ2VuOjpFaWdlbkJhc2U8TWF0cml4UmVwbGFjZW1lbnQ+IHsKK3B1YmxpYzoKKyAgLy8gUmVxdWlyZWQgdHlwZWRlZnMsIGNvbnN0YW50cywgYW5kIG1ldGhvZDoKKyAgdHlwZWRlZiBkb3VibGUgU2NhbGFyOworICB0eXBlZGVmIGRvdWJsZSBSZWFsU2NhbGFyOworICB0eXBlZGVmIGludCBTdG9yYWdlSW5kZXg7CisgIGVudW0geworICAgIENvbHNBdENvbXBpbGVUaW1lID0gRWlnZW46OkR5bmFtaWMsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6RHluYW1pYywKKyAgICBJc1Jvd01ham9yID0gZmFsc2UKKyAgfTsKKworICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbXBfbWF0LT5yb3dzKCk7IH0KKyAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1wX21hdC0+Y29scygpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICBFaWdlbjo6UHJvZHVjdDxNYXRyaXhSZXBsYWNlbWVudCxSaHMsRWlnZW46OkFsaWFzRnJlZVByb2R1Y3Q+IG9wZXJhdG9yKihjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxSaHM+JiB4KSBjb25zdCB7CisgICAgcmV0dXJuIEVpZ2VuOjpQcm9kdWN0PE1hdHJpeFJlcGxhY2VtZW50LFJocyxFaWdlbjo6QWxpYXNGcmVlUHJvZHVjdD4oKnRoaXMsIHguZGVyaXZlZCgpKTsKKyAgfQorCisgIC8vIEN1c3RvbSBBUEk6CisgIE1hdHJpeFJlcGxhY2VtZW50KCkgOiBtcF9tYXQoMCkge30KKworICB2b2lkIGF0dGFjaE15TWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeDxkb3VibGU+ICZtYXQpIHsKKyAgICBtcF9tYXQgPSAmbWF0OworICB9CisgIGNvbnN0IFNwYXJzZU1hdHJpeDxkb3VibGU+IG15X21hdHJpeCgpIGNvbnN0IHsgcmV0dXJuICptcF9tYXQ7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgU3BhcnNlTWF0cml4PGRvdWJsZT4gKm1wX21hdDsKK307CisKKworLy8gSW1wbGVtZW50YXRpb24gb2YgTWF0cml4UmVwbGFjZW1lbnQgKiBFaWdlbjo6RGVuc2VWZWN0b3IgdGhvdWdoIGEgc3BlY2lhbGl6YXRpb24gb2YgaW50ZXJuYWw6OmdlbmVyaWNfcHJvZHVjdF9pbXBsOgorbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICBzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TWF0cml4UmVwbGFjZW1lbnQsIFJocywgU3BhcnNlU2hhcGUsIERlbnNlU2hhcGUsIEdlbXZQcm9kdWN0PiAvLyBHRU1WIHN0YW5kcyBmb3IgbWF0cml4LXZlY3RvcgorICA6IGdlbmVyaWNfcHJvZHVjdF9pbXBsX2Jhc2U8TWF0cml4UmVwbGFjZW1lbnQsUmhzLGdlbmVyaWNfcHJvZHVjdF9pbXBsPE1hdHJpeFJlcGxhY2VtZW50LFJocz4gPgorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PE1hdHJpeFJlcGxhY2VtZW50LFJocz46OlNjYWxhciBTY2FsYXI7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIHN0YXRpYyB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZHN0LCBjb25zdCBNYXRyaXhSZXBsYWNlbWVudCYgbGhzLCBjb25zdCBSaHMmIHJocywgY29uc3QgU2NhbGFyJiBhbHBoYSkKKyAgICB7CisgICAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgaW1wbGVtZW50ICJkc3QgKz0gYWxwaGEgKiBsaHMgKiByaHMiIGlucGxhY2UsCisgICAgICAvLyBob3dldmVyLCBmb3IgaXRlcmF0aXZlIHNvbHZlcnMsIGFscGhhIGlzIGFsd2F5cyBlcXVhbCB0byAxLCBzbyBsZXQncyBub3QgYm90aGVyIGFib3V0IGl0LgorICAgICAgYXNzZXJ0KGFscGhhPT1TY2FsYXIoMSkgJiYgInNjYWxpbmcgaXMgbm90IGltcGxlbWVudGVkIik7CisKKyAgICAgIC8vIEhlcmUgd2UgY291bGQgc2ltcGx5IGNhbGwgZHN0Lm5vYWxpYXMoKSArPSBsaHMubXlfbWF0cml4KCkgKiByaHMsCisgICAgICAvLyBidXQgbGV0J3MgZG8gc29tZXRoaW5nIGZhbmNpZXIgKGFuZCBsZXNzIGVmZmljaWVudCk6CisgICAgICBmb3IoSW5kZXggaT0wOyBpPGxocy5jb2xzKCk7ICsraSkKKyAgICAgICAgZHN0ICs9IHJocyhpKSAqIGxocy5teV9tYXRyaXgoKS5jb2woaSk7CisgICAgfQorICB9OworCit9Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IG4gPSAxMDsKKyAgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IFMgPSBFaWdlbjo6TWF0cml4WGQ6OlJhbmRvbShuLG4pLnNwYXJzZVZpZXcoMC41LDEpOworICBTID0gUy50cmFuc3Bvc2UoKSpTOworCisgIE1hdHJpeFJlcGxhY2VtZW50IEE7CisgIEEuYXR0YWNoTXlNYXRyaXgoUyk7CisKKyAgRWlnZW46OlZlY3RvclhkIGIobiksIHg7CisgIGIuc2V0UmFuZG9tKCk7CisKKyAgLy8gU29sdmUgQXggPSBiIHVzaW5nIHZhcmlvdXMgaXRlcmF0aXZlIHNvbHZlciB3aXRoIG1hdHJpeC1mcmVlIHZlcnNpb246CisgIHsKKyAgICBFaWdlbjo6Q29uanVnYXRlR3JhZGllbnQ8TWF0cml4UmVwbGFjZW1lbnQsIEVpZ2VuOjpMb3dlcnxFaWdlbjo6VXBwZXIsIEVpZ2VuOjpJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBjZzsKKyAgICBjZy5jb21wdXRlKEEpOworICAgIHggPSBjZy5zb2x2ZShiKTsKKyAgICBzdGQ6OmNvdXQgPDwgIkNHOiAgICAgICAjaXRlcmF0aW9uczogIiA8PCBjZy5pdGVyYXRpb25zKCkgPDwgIiwgZXN0aW1hdGVkIGVycm9yOiAiIDw8IGNnLmVycm9yKCkgPDwgc3RkOjplbmRsOworICB9CisKKyAgeworICAgIEVpZ2VuOjpCaUNHU1RBQjxNYXRyaXhSZXBsYWNlbWVudCwgRWlnZW46OklkZW50aXR5UHJlY29uZGl0aW9uZXI+IGJpY2c7CisgICAgYmljZy5jb21wdXRlKEEpOworICAgIHggPSBiaWNnLnNvbHZlKGIpOworICAgIHN0ZDo6Y291dCA8PCAiQmlDR1NUQUI6ICNpdGVyYXRpb25zOiAiIDw8IGJpY2cuaXRlcmF0aW9ucygpIDw8ICIsIGVzdGltYXRlZCBlcnJvcjogIiA8PCBiaWNnLmVycm9yKCkgPDwgc3RkOjplbmRsOworICB9CisKKyAgeworICAgIEVpZ2VuOjpHTVJFUzxNYXRyaXhSZXBsYWNlbWVudCwgRWlnZW46OklkZW50aXR5UHJlY29uZGl0aW9uZXI+IGdtcmVzOworICAgIGdtcmVzLmNvbXB1dGUoQSk7CisgICAgeCA9IGdtcmVzLnNvbHZlKGIpOworICAgIHN0ZDo6Y291dCA8PCAiR01SRVM6ICAgICNpdGVyYXRpb25zOiAiIDw8IGdtcmVzLml0ZXJhdGlvbnMoKSA8PCAiLCBlc3RpbWF0ZWQgZXJyb3I6ICIgPDwgZ21yZXMuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7CisgIH0KKworICB7CisgICAgRWlnZW46OkRHTVJFUzxNYXRyaXhSZXBsYWNlbWVudCwgRWlnZW46OklkZW50aXR5UHJlY29uZGl0aW9uZXI+IGdtcmVzOworICAgIGdtcmVzLmNvbXB1dGUoQSk7CisgICAgeCA9IGdtcmVzLnNvbHZlKGIpOworICAgIHN0ZDo6Y291dCA8PCAiREdNUkVTOiAgICNpdGVyYXRpb25zOiAiIDw8IGdtcmVzLml0ZXJhdGlvbnMoKSA8PCAiLCBlc3RpbWF0ZWQgZXJyb3I6ICIgPDwgZ21yZXMuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7CisgIH0KKworICB7CisgICAgRWlnZW46Ok1JTlJFUzxNYXRyaXhSZXBsYWNlbWVudCwgRWlnZW46Okxvd2VyfEVpZ2VuOjpVcHBlciwgRWlnZW46OklkZW50aXR5UHJlY29uZGl0aW9uZXI+IG1pbnJlczsKKyAgICBtaW5yZXMuY29tcHV0ZShBKTsKKyAgICB4ID0gbWlucmVzLnNvbHZlKGIpOworICAgIHN0ZDo6Y291dCA8PCAiTUlOUkVTOiAgICNpdGVyYXRpb25zOiAiIDw8IG1pbnJlcy5pdGVyYXRpb25zKCkgPDwgIiwgZXN0aW1hdGVkIGVycm9yOiAiIDw8IG1pbnJlcy5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL251bGxhcnlfaW5kZXhpbmcuY3BwIGIvZG9jL2V4YW1wbGVzL251bGxhcnlfaW5kZXhpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2MzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvbnVsbGFyeV9pbmRleGluZy5jcHAKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworLy8gW2Z1bmN0b3JdCit0ZW1wbGF0ZTxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSb3dJbmRleFR5cGUsIGNsYXNzIENvbEluZGV4VHlwZT4KK2NsYXNzIGluZGV4aW5nX2Z1bmN0b3IgeworICBjb25zdCBBcmdUeXBlICZtX2FyZzsKKyAgY29uc3QgUm93SW5kZXhUeXBlICZtX3Jvd0luZGljZXM7CisgIGNvbnN0IENvbEluZGV4VHlwZSAmbV9jb2xJbmRpY2VzOworcHVibGljOgorICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgIFJvd0luZGV4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIENvbEluZGV4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIEFyZ1R5cGU6OkZsYWdzJlJvd01ham9yQml0P1Jvd01ham9yOkNvbE1ham9yLAorICAgICAgICAgICAgICAgICBSb3dJbmRleFR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBDb2xJbmRleFR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlOworCisgIGluZGV4aW5nX2Z1bmN0b3IoY29uc3QgQXJnVHlwZSYgYXJnLCBjb25zdCBSb3dJbmRleFR5cGUmIHJvd19pbmRpY2VzLCBjb25zdCBDb2xJbmRleFR5cGUmIGNvbF9pbmRpY2VzKQorICAgIDogbV9hcmcoYXJnKSwgbV9yb3dJbmRpY2VzKHJvd19pbmRpY2VzKSwgbV9jb2xJbmRpY2VzKGNvbF9pbmRpY2VzKQorICB7fQorCisgIGNvbnN0IHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciYgb3BlcmF0b3IoKSAoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9hcmcobV9yb3dJbmRpY2VzW3Jvd10sIG1fY29sSW5kaWNlc1tjb2xdKTsKKyAgfQorfTsKKy8vIFtmdW5jdG9yXQorCisvLyBbZnVuY3Rpb25dCit0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUm93SW5kZXhUeXBlLCBjbGFzcyBDb2xJbmRleFR5cGU+CitDd2lzZU51bGxhcnlPcDxpbmRleGluZ19mdW5jdG9yPEFyZ1R5cGUsUm93SW5kZXhUeXBlLENvbEluZGV4VHlwZT4sIHR5cGVuYW1lIGluZGV4aW5nX2Z1bmN0b3I8QXJnVHlwZSxSb3dJbmRleFR5cGUsQ29sSW5kZXhUeXBlPjo6TWF0cml4VHlwZT4KK2luZGV4aW5nKGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPEFyZ1R5cGU+JiBhcmcsIGNvbnN0IFJvd0luZGV4VHlwZSYgcm93X2luZGljZXMsIGNvbnN0IENvbEluZGV4VHlwZSYgY29sX2luZGljZXMpCit7CisgIHR5cGVkZWYgaW5kZXhpbmdfZnVuY3RvcjxBcmdUeXBlLFJvd0luZGV4VHlwZSxDb2xJbmRleFR5cGU+IEZ1bmM7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuYzo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICByZXR1cm4gTWF0cml4VHlwZTo6TnVsbGFyeUV4cHIocm93X2luZGljZXMuc2l6ZSgpLCBjb2xfaW5kaWNlcy5zaXplKCksIEZ1bmMoYXJnLmRlcml2ZWQoKSwgcm93X2luZGljZXMsIGNvbF9pbmRpY2VzKSk7Cit9CisvLyBbZnVuY3Rpb25dCisKKworaW50IG1haW4oKQoreworICBzdGQ6OmNvdXQgPDwgIlttYWluMV1cbiI7CisgIEVpZ2VuOjpNYXRyaXhYaSBBID0gRWlnZW46Ok1hdHJpeFhpOjpSYW5kb20oNCw0KTsKKyAgQXJyYXkzaSByaSgxLDIsMSk7CisgIEFycmF5WGkgY2koNik7IGNpIDw8IDMsMiwxLDAsMCwyOworICBFaWdlbjo6TWF0cml4WGkgQiA9IGluZGV4aW5nKEEsIHJpLCBjaSk7CisgIHN0ZDo6Y291dCA8PCAiQSA9IiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCBBIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiQShbIiA8PCByaS50cmFuc3Bvc2UoKSA8PCAiXSwgWyIgPDwgY2kudHJhbnNwb3NlKCkgPDwgIl0pID0iIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IEIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIlttYWluMV1cbiI7CisKKyAgc3RkOjpjb3V0IDw8ICJbbWFpbjJdXG4iOworICBCID0gIGluZGV4aW5nKEEsIHJpKzEsIGNpKTsKKyAgc3RkOjpjb3V0IDw8ICJBKHJpKzEsY2kpID0iIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IEIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIEIgPSAgaW5kZXhpbmcoQSwgQXJyYXlYaTo6TGluU3BhY2VkKDEzLDAsMTIpLnVuYXJ5RXhwcihbXShpbnQgeCl7cmV0dXJuIHglNDt9KSwgQXJyYXlYaTo6TGluU3BhY2VkKDQsMCwzKSk7CisgIHN0ZDo6Y291dCA8PCAiQShBcnJheVhpOjpMaW5TcGFjZWQoMTMsMCwxMikudW5hcnlFeHByKFtdKGludCB4KXtyZXR1cm4geCU0O30pLCBBcnJheVhpOjpMaW5TcGFjZWQoNCwwLDMpKSA9IiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCBCIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKyAgc3RkOjpjb3V0IDw8ICJbbWFpbjJdXG4iOworfQorCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfYWRkX3N1Yi5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfYWRkX3N1Yi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3NDc3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19hZGRfc3ViLmNwcApAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBNYXRyaXgyZCBhOworICBhIDw8IDEsIDIsCisgICAgICAgMywgNDsKKyAgTWF0cml4WGQgYigyLDIpOworICBiIDw8IDIsIDMsCisgICAgICAgMSwgNDsKKyAgc3RkOjpjb3V0IDw8ICJhICsgYiA9XG4iIDw8IGEgKyBiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJhIC0gYiA9XG4iIDw8IGEgLSBiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJEb2luZyBhICs9IGI7IiA8PCBzdGQ6OmVuZGw7CisgIGEgKz0gYjsKKyAgc3RkOjpjb3V0IDw8ICJOb3cgYSA9XG4iIDw8IGEgPDwgc3RkOjplbmRsOworICBWZWN0b3IzZCB2KDEsMiwzKTsKKyAgVmVjdG9yM2QgdygxLDAsMCk7CisgIHN0ZDo6Y291dCA8PCAiLXYgKyB3IC0gdiA9XG4iIDw8IC12ICsgdyAtIHYgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfZG90X2Nyb3NzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzFjOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworaW50IG1haW4oKQoreworICBWZWN0b3IzZCB2KDEsMiwzKTsKKyAgVmVjdG9yM2QgdygwLDEsMik7CisKKyAgY291dCA8PCAiRG90IHByb2R1Y3Q6ICIgPDwgdi5kb3QodykgPDwgZW5kbDsKKyAgZG91YmxlIGRwID0gdi5hZGpvaW50KCkqdzsgLy8gYXV0b21hdGljIGNvbnZlcnNpb24gb2YgdGhlIGlubmVyIHByb2R1Y3QgdG8gYSBzY2FsYXIKKyAgY291dCA8PCAiRG90IHByb2R1Y3QgdmlhIGEgbWF0cml4IHByb2R1Y3Q6ICIgPDwgZHAgPDwgZW5kbDsKKyAgY291dCA8PCAiQ3Jvc3MgcHJvZHVjdDpcbiIgPDwgdi5jcm9zcyh3KSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX21hdHJpeF9tdWwuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX21hdHJpeF9tdWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTM5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfbWF0cml4X211bC5jcHAKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CitpbnQgbWFpbigpCit7CisgIE1hdHJpeDJkIG1hdDsKKyAgbWF0IDw8IDEsIDIsCisgICAgICAgICAzLCA0OworICBWZWN0b3IyZCB1KC0xLDEpLCB2KDIsMCk7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyBtYXQqbWF0OlxuIiA8PCBtYXQqbWF0IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIG1hdCp1OlxuIiA8PCBtYXQqdSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB1XlQqbWF0OlxuIiA8PCB1LnRyYW5zcG9zZSgpKm1hdCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB1XlQqdjpcbiIgPDwgdS50cmFuc3Bvc2UoKSp2IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHUqdl5UOlxuIiA8PCB1KnYudHJhbnNwb3NlKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkxldCdzIG11bHRpcGx5IG1hdCBieSBpdHNlbGYiIDw8IHN0ZDo6ZW5kbDsKKyAgbWF0ID0gbWF0Km1hdDsKKyAgc3RkOjpjb3V0IDw8ICJOb3cgbWF0IGlzIG1hdDpcbiIgPDwgbWF0IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19yZWR1eF9iYXNpYy5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzJmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeDJkIG1hdDsKKyAgbWF0IDw8IDEsIDIsCisgICAgICAgICAzLCA0OworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5zdW0oKTogICAgICAgIiA8PCBtYXQuc3VtKCkgICAgICAgPDwgZW5kbDsKKyAgY291dCA8PCAiSGVyZSBpcyBtYXQucHJvZCgpOiAgICAgICIgPDwgbWF0LnByb2QoKSAgICAgIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0Lm1lYW4oKTogICAgICAiIDw8IG1hdC5tZWFuKCkgICAgICA8PCBlbmRsOworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5taW5Db2VmZigpOiAgIiA8PCBtYXQubWluQ29lZmYoKSAgPDwgZW5kbDsKKyAgY291dCA8PCAiSGVyZSBpcyBtYXQubWF4Q29lZmYoKTogICIgPDwgbWF0Lm1heENvZWZmKCkgIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0LnRyYWNlKCk6ICAgICAiIDw8IG1hdC50cmFjZSgpICAgICA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX3NjYWxhcl9tdWxfZGl2LmNwcCBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmNjViNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4MmQgYTsKKyAgYSA8PCAxLCAyLAorICAgICAgIDMsIDQ7CisgIFZlY3RvcjNkIHYoMSwyLDMpOworICBzdGQ6OmNvdXQgPDwgImEgKiAyLjUgPVxuIiA8PCBhICogMi41IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICIwLjEgKiB2ID1cbiIgPDwgMC4xICogdiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiRG9pbmcgdiAqPSAyOyIgPDwgc3RkOjplbmRsOworICB2ICo9IDI7CisgIHN0ZDo6Y291dCA8PCAiTm93IHYgPVxuIiA8PCB2IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X2NvZWZmaWNpZW50X2FjY2Vzc29ycy5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGExNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhkIG0oMiwyKTsKKyAgbSgwLDApID0gMzsKKyAgbSgxLDApID0gMi41OworICBtKDAsMSkgPSAtMTsKKyAgbSgxLDEpID0gbSgxLDApICsgbSgwLDEpOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOlxuIiA8PCBtIDw8IHN0ZDo6ZW5kbDsKKyAgVmVjdG9yWGQgdigyKTsKKyAgdigwKSA9IDQ7CisgIHYoMSkgPSB2KDApIC0gMTsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjpcbiIgPDwgdiA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemUuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzkyYzNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBNYXRyaXhYZCBtKDIsNSk7CisgIG0ucmVzaXplKDQsMyk7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBtIGlzIG9mIHNpemUgIgorICAgICAgICAgICAgPDwgbS5yb3dzKCkgPDwgIngiIDw8IG0uY29scygpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJJdCBoYXMgIiA8PCBtLnNpemUoKSA8PCAiIGNvZWZmaWNpZW50cyIgPDwgc3RkOjplbmRsOworICBWZWN0b3JYZCB2KDIpOworICB2LnJlc2l6ZSg1KTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgdmVjdG9yIHYgaXMgb2Ygc2l6ZSAiIDw8IHYuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJBcyBhIG1hdHJpeCwgdiBpcyBvZiBzaXplICIKKyAgICAgICAgICAgIDw8IHYucm93cygpIDw8ICJ4IiA8PCB2LmNvbHMoKSA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiZGZhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X3Jlc2l6ZV9maXhlZF9zaXplLmNwcApAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBNYXRyaXg0ZCBtOworICBtLnJlc2l6ZSg0LDQpOyAvLyBubyBvcGVyYXRpb24KKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IG0gaXMgb2Ygc2l6ZSAiCisgICAgICAgICAgICA8PCBtLnJvd3MoKSA8PCAieCIgPDwgbS5jb2xzKCkgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2Z0djJub2RlLnBuZyBiL2RvYy9mdHYybm9kZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjNjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9mdHYybm9kZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2Z0djJwbm9kZS5wbmcgYi9kb2MvZnR2MnBub2RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2Z0djJwbm9kZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzLy5rcmF6eSBiL2RvYy9zbmlwcGV0cy8ua3JhenkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy8ua3JhenkKQEAgLTAsMCArMSwyIEBACitFWENMVURFIGNvcHlyaWdodAorRVhDTFVERSBsaWNlbnNlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcCBiL2RvYy9zbmlwcGV0cy9BbmdsZUF4aXNfbWltaWNfZXVsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmRlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNmIG07CittID0gQW5nbGVBeGlzZigwLjI1Kk1fUEksIFZlY3RvcjNmOjpVbml0WCgpKQorICAqIEFuZ2xlQXhpc2YoMC41Kk1fUEksICBWZWN0b3IzZjo6VW5pdFkoKSkKKyAgKiBBbmdsZUF4aXNmKDAuMzMqTV9QSSwgVmVjdG9yM2Y6OlVuaXRaKCkpOworY291dCA8PCBtIDw8IGVuZGwgPDwgImlzIHVuaXRhcnk6ICIgPDwgbS5pc1VuaXRhcnkoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0JpQ0dTVEFCX3NpbXBsZS5jcHAgYi9kb2Mvc25pcHBldHMvQmlDR1NUQUJfc2ltcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTIwZjRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0JpQ0dTVEFCX3NpbXBsZS5jcHAKQEAgLTAsMCArMSwxMSBAQAorICBpbnQgbiA9IDEwMDAwOworICBWZWN0b3JYZCB4KG4pLCBiKG4pOworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBKG4sbik7CisgIC8qIC4uLiBmaWxsIEEgYW5kIGIgLi4uICovIAorICBCaUNHU1RBQjxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcjsKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIHggPSBzb2x2ZXIuc29sdmUoYik7CisgIHN0ZDo6Y291dCA8PCAiI2l0ZXJhdGlvbnM6ICAgICAiIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgImVzdGltYXRlZCBlcnJvcjogIiA8PCBzb2x2ZXIuZXJyb3IoKSAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgLyogLi4uIHVwZGF0ZSBiIC4uLiAqLworICB4ID0gc29sdmVyLnNvbHZlKGIpOyAvLyBzb2x2ZSBhZ2FpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9CaUNHU1RBQl9zdGVwX2J5X3N0ZXAuY3BwIGIvZG9jL3NuaXBwZXRzL0JpQ0dTVEFCX3N0ZXBfYnlfc3RlcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNDdiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9CaUNHU1RBQl9zdGVwX2J5X3N0ZXAuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyAgaW50IG4gPSAxMDAwMDsKKyAgVmVjdG9yWGQgeChuKSwgYihuKTsKKyAgU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLG4pOworICAvKiAuLi4gZmlsbCBBIGFuZCBiIC4uLiAqLyAKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBzb2x2ZXIoQSk7CisgIC8vIHN0YXJ0IGZyb20gYSByYW5kb20gc29sdXRpb24KKyAgeCA9IFZlY3RvclhkOjpSYW5kb20obik7CisgIHNvbHZlci5zZXRNYXhJdGVyYXRpb25zKDEpOworICBpbnQgaSA9IDA7CisgIGRvIHsKKyAgICB4ID0gc29sdmVyLnNvbHZlV2l0aEd1ZXNzKGIseCk7CisgICAgc3RkOjpjb3V0IDw8IGkgPDwgIiA6ICIgPDwgc29sdmVyLmVycm9yKCkgPDwgc3RkOjplbmRsOworICAgICsraTsKKyAgfSB3aGlsZSAoc29sdmVyLmluZm8oKSE9U3VjY2VzcyAmJiBpPDEwMCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NNYWtlTGlzdHMudHh0IGIvZG9jL3NuaXBwZXRzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWYzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNiBAQAorZmlsZShHTE9CIHNuaXBwZXRzX1NSQ1MgIiouY3BwIikKKworYWRkX2N1c3RvbV90YXJnZXQoYWxsX3NuaXBwZXRzKQorCitmb3JlYWNoKHNuaXBwZXRfc3JjICR7c25pcHBldHNfU1JDU30pCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoc25pcHBldCAke3NuaXBwZXRfc3JjfSBOQU1FX1dFKQorICBzZXQoY29tcGlsZV9zbmlwcGV0X3RhcmdldCBjb21waWxlXyR7c25pcHBldH0pCisgIHNldChjb21waWxlX3NuaXBwZXRfc3JjICR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0uY3BwKQorICBmaWxlKFJFQUQgJHtzbmlwcGV0X3NyY30gc25pcHBldF9zb3VyY2VfY29kZSkKKyAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVfc25pcHBldC5jcHAuaW4KKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30pCisgIGFkZF9leGVjdXRhYmxlKCR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0KKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30pCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke2NvbXBpbGVfc25pcHBldF90YXJnZXR9ICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBlbmRpZigpCisgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICBUQVJHRVQgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fQorICAgIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0KKyAgICBBUkdTID4ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtzbmlwcGV0fS5vdXQKKyAgKQorICBhZGRfZGVwZW5kZW5jaWVzKGFsbF9zbmlwcGV0cyAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9KQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgT0JKRUNUX0RFUEVORFMgJHtzbmlwcGV0X3NyY30pCitlbmRmb3JlYWNoKHNuaXBwZXRfc3JjKQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjIwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOworTWF0cml4M2YgeSA9IE1hdHJpeDNmOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggeToiIDw8IGVuZGwgPDwgeSA8PCBlbmRsOworTWF0cml4M2YgeDsKK3ggPSBtLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh5KTsKK2Fzc2VydCh5LmlzQXBwcm94KG0qeCkpOworY291dCA8PCAiSGVyZSBpcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIG14PXk6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDZiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCkBAIC0wLDAgKzEsMTYgQEAKK01hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCw0KTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNHg0IG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK0NvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhYY2Y+IGNlczsKK2Nlcy5jb21wdXRlKEEpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiIgPDwgZW5kbCA8PCBjZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMsIFYsIGlzOiIgPDwgZW5kbCA8PCBjZXMuZWlnZW52ZWN0b3JzKCkgPDwgZW5kbCA8PCBlbmRsOworCitjb21wbGV4PGZsb2F0PiBsYW1iZGEgPSBjZXMuZWlnZW52YWx1ZXMoKVswXTsKK2NvdXQgPDwgIkNvbnNpZGVyIHRoZSBmaXJzdCBlaWdlbnZhbHVlLCBsYW1iZGEgPSAiIDw8IGxhbWJkYSA8PCBlbmRsOworVmVjdG9yWGNmIHYgPSBjZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApOworY291dCA8PCAiSWYgdiBpcyB0aGUgY29ycmVzcG9uZGluZyBlaWdlbnZlY3RvciwgdGhlbiBsYW1iZGEgKiB2ID0gIiA8PCBlbmRsIDw8IGxhbWJkYSAqIHYgPDwgZW5kbDsKK2NvdXQgPDwgIi4uLiBhbmQgQSAqIHYgPSAiIDw8IGVuZGwgPDwgQSAqIHYgPDwgZW5kbCA8PCBlbmRsOworCitjb3V0IDw8ICJGaW5hbGx5LCBWICogRCAqIFZeKC0xKSA9ICIgPDwgZW5kbAorICAgICA8PCBjZXMuZWlnZW52ZWN0b3JzKCkgKiBjZXMuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkgKiBjZXMuZWlnZW52ZWN0b3JzKCkuaW52ZXJzZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDliZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhjZiBvbmVzID0gTWF0cml4WGNmOjpPbmVzKDMsMyk7CitDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4WGNmPiBjZXMob25lcywgLyogY29tcHV0ZUVpZ2VudmVjdG9ycyA9ICovIGZhbHNlKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIAorICAgICA8PCBlbmRsIDw8IGNlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxYzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhjZiBvbmVzID0gTWF0cml4WGNmOjpPbmVzKDMsMyk7CitDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4WGNmPiBjZXMob25lcyk7Citjb3V0IDw8ICJUaGUgZmlyc3QgZWlnZW52ZWN0b3Igb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpczoiIAorICAgICA8PCBlbmRsIDw8IGNlcy5laWdlbnZlY3RvcnMoKS5jb2woMSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfY29tcHV0ZS5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX2NvbXB1dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTE3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX2NvbXB1dGUuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LDQpOworQ29tcGxleFNjaHVyPE1hdHJpeFhjZj4gc2NodXIoNCk7CitzY2h1ci5jb21wdXRlKEEpOworY291dCA8PCAiVGhlIG1hdHJpeCBUIGluIHRoZSBkZWNvbXBvc2l0aW9uIG9mIEEgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFQoKSA8PCBlbmRsOworc2NodXIuY29tcHV0ZShBLmludmVyc2UoKSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQV4oLTEpIGlzOiIgPDwgZW5kbCA8PCBzY2h1ci5tYXRyaXhUKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VC5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX21hdHJpeFQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODA1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX21hdHJpeFQuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LDQpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA0eDQgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKK0NvbXBsZXhTY2h1cjxNYXRyaXhYY2Y+IHNjaHVyT2ZBKEEsIGZhbHNlKTsgLy8gZmFsc2UgbWVhbnMgZG8gbm90IGNvbXB1dGUgVQorY291dCA8PCAiVGhlIHRyaWFuZ3VsYXIgbWF0cml4IFQgaXM6IiA8PCBlbmRsIDw8IHNjaHVyT2ZBLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhVLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzZDljMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworQ29tcGxleFNjaHVyPE1hdHJpeFhjZj4gc2NodXJPZkEoQSk7Citjb3V0IDw8ICJUaGUgdW5pdGFyeSBtYXRyaXggVSBpczoiIDw8IGVuZGwgPDwgc2NodXJPZkEubWF0cml4VSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLC0yLC0zKTsKK2NvdXQgPDwgdi5hYnMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2FiczIuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2FiczIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGY5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzMi5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwtMiwtMyk7Citjb3V0IDw8IHYuYWJzMigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWNvcy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYWNvcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MzJjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hY29zLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigwLCBzcXJ0KDIuKS8yLCAxKTsKK2NvdXQgPDwgdi5hY29zKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hcmcuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2FyZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0NTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hcmcuY3BwCkBAIC0wLDAgKzEsMyBAQAorQXJyYXlYY2YgdiA9IEFycmF5WGNmOjpSYW5kb20oMyk7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBhcmcodikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hcnJheV9wb3dlcl9hcnJheS5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXJyYXlfcG93ZXJfYXJyYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMmE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXJyYXlfcG93ZXJfYXJyYXkuY3BwCkBAIC0wLDAgKzEsNCBAQAorQXJyYXk8ZG91YmxlLDEsMz4geCg4LDI1LDMpLAorICAgICAgICAgICAgICAgICAgZSgxLi8zLiwwLjUsMi4pOworY291dCA8PCAiWyIgPDwgeCA8PCAiXV5bIiA8PCBlIDw8ICJdID0gIiA8PCB4LnBvdyhlKSA8PCBlbmRsOyAvLyB1c2luZyBBcnJheUJhc2U6OnBvdworY291dCA8PCAiWyIgPDwgeCA8PCAiXV5bIiA8PCBlIDw8ICJdID0gIiA8PCBwb3coeCxlKSA8PCBlbmRsOyAvLyB1c2luZyBFaWdlbjo6cG93CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYXNpbi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXNpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhZDgzOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hc2luLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigwLCBzcXJ0KDIuKS8yLCAxKTsKK2NvdXQgPDwgdi5hc2luKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hdGFuLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hdGFuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDY4NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2F0YW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDUsMCwxKTsKK2NvdXQgPDwgdi5hdGFuKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX2FuZC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9hbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmI2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9hbmQuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KC0xLDIsMSksIHcoLTMsMiwzKTsKK2NvdXQgPDwgKCh2PHcpICYmICh2PDApKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fbm90LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX25vdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMDlmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX25vdC5jcHAKQEAgLTAsMCArMSw1IEBACitBcnJheTNkIHYoMSwyLDMpOwordigxKSAqPSAwLjAvMC4wOwordigyKSAvPSAwLjA7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCAhaXNmaW5pdGUodikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX29yLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2ViMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fb3IuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KC0xLDIsMSksIHcoLTMsMiwzKTsKK2NvdXQgPDwgKCh2PHcpIHx8ICh2PDApKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5feG9yLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX3hvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYmVjOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX3hvci5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoLTEsMiwxKSwgdygtMywyLDMpOworY291dCA8PCAoKHY8dykgXiAodjwwKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jZWlsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jZWlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNmNjYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2NlaWwuY3BwCkBAIC0wLDAgKzEsMyBAQAorQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDcsLTIsMik7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBjZWlsKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfY29zLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODlmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY29zLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdihNX1BJLCBNX1BJLzIsIE1fUEkvMyk7Citjb3V0IDw8IHYuY29zKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3NoLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3NoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGVlNzVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Nvc2guY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDUsMCwxKTsKK2NvdXQgPDwgY29zaCh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2N1YmUuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2N1YmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTQxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY3ViZS5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpOworY291dCA8PCB2LmN1YmUoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2VxdWFsX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9lcXVhbF9lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhOTZmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9lcXVhbF9lcXVhbC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKK2NvdXQgPDwgKHY9PXcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfZXhwLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9leHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjM2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZXhwLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyk7Citjb3V0IDw8IHYuZXhwKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9mbG9vci5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZmxvb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzU2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZmxvb3IuY3BwCkBAIC0wLDAgKzEsMyBAQAorQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDcsLTIsMik7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBmbG9vcih2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXIuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYWQwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZ3JlYXRlci5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKK2NvdXQgPDwgKHY+dykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA4Zjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXJfZXF1YWwuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Citjb3V0IDw8ICh2Pj13KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2ludmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2ludmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjdhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfaW52ZXJzZS5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpOworY291dCA8PCB2LmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzRmluaXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0Zpbml0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNTVmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0Zpbml0ZS5jcHAKQEAgLTAsMCArMSw1IEBACitBcnJheTNkIHYoMSwyLDMpOwordigxKSAqPSAwLjAvMC4wOwordigyKSAvPSAwLjA7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBpc2Zpbml0ZSh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzSW5mLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0luZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3OTMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0luZi5jcHAKQEAgLTAsMCArMSw1IEBACitBcnJheTNkIHYoMSwyLDMpOwordigxKSAqPSAwLjAvMC4wOwordigyKSAvPSAwLjA7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBpc2luZih2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzTmFOLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc05hTi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyYTkzMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc05hTi5jcHAKQEAgLTAsMCArMSw1IEBACitBcnJheTNkIHYoMSwyLDMpOwordigxKSAqPSAwLjAvMC4wOwordigyKSAvPSAwLjA7Citjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCBpc25hbih2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3MuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmQzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbGVzcy5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKK2NvdXQgPDwgKHY8dykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjAwZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3NfZXF1YWwuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Citjb3V0IDw8ICh2PD13KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FjYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZy5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpOworY291dCA8PCB2LmxvZygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbG9nMTAuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZzEwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FlNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZzEwLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5NGQgdigtMSwwLDEsMik7Citjb3V0IDw8IGxvZzEwKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWF4LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9tYXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDI4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWF4LmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigyLDMsNCksIHcoNCwyLDMpOworY291dCA8PCB2Lm1heCh3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX21pbi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzAxYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbi5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpLCB3KDQsMiwzKTsKK2NvdXQgPDwgdi5taW4odykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51cy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OWI5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXMuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKTsKK2NvdXQgPDwgdi01IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXNfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmRlNDlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzX2VxdWFsLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5M2QgdigxLDIsMyk7Cit2IC09IDU7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ub3RfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX25vdF9lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhNDA3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ub3RfZXF1YWwuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Citjb3V0IDw8ICh2IT13KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXMuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDczMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1cy5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpOworY291dCA8PCB2KzUgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQ0YjFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXNfZXF1YWwuY3BwCkBAIC0wLDAgKzEsMyBAQAorQXJyYXkzZCB2KDEsMiwzKTsKK3YgKz0gNTsKK2NvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3Bvdy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzIzZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Bvdy5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoOCwyNyw2NCk7Citjb3V0IDw8IHYucG93KDAuMzMzMzMzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3Byb2R1Y3QuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Byb2R1Y3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGQ2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcHJvZHVjdC5jcHAKQEAgLTAsMCArMSw0IEBACitBcnJheTMzaSBhID0gQXJyYXkzM2k6OlJhbmRvbSgpLCBiID0gQXJyYXkzM2k6OlJhbmRvbSgpOworQXJyYXkzM2kgYyA9IGEgKiBiOworY291dCA8PCAiYTpcbiIgPDwgYSA8PCAiXG5iOlxuIiA8PCBiIDw8ICJcbmM6XG4iIDw8IGMgPDwgZW5kbDsKKwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3F1b3RpZW50LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9xdW90aWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiOWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9xdW90aWVudC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpLCB3KDQsMiwzKTsKK2NvdXQgPDwgdi93IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfcm91bmQuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3JvdW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM4ODIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3JvdW5kLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5WGQgdiA9IEFycmF5WGQ6OkxpblNwYWNlZCg3LC0yLDIpOworY291dCA8PCB2IDw8IGVuZGwgPDwgZW5kbDsKK2NvdXQgPDwgcm91bmQodikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zY2FsYXJfcG93ZXJfYXJyYXkuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NjYWxhcl9wb3dlcl9hcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2OGIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zY2FsYXJfcG93ZXJfYXJyYXkuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXk8ZG91YmxlLDEsMz4gZSgyLC0zLDEuLzMuKTsKK2NvdXQgPDwgIjEwXlsiIDw8IGUgPDwgIl0gPSAiIDw8IHBvdygxMCxlKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NpZ24uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NpZ24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTIwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2lnbi5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoLTMsNSwwKTsKK2NvdXQgPDwgdi5zaWduKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmYTkwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KE1fUEksIE1fUEkvMiwgTV9QSS8zKTsKK2NvdXQgPDwgdi5zaW4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NpbmguY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NpbmguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzliMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2luaC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNSwwLDEpOworY291dCA8PCBzaW5oKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc2xhc2hfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWZkMzJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5M2QgdigzLDIsNCksIHcoNSw0LDIpOwordiAvPSB3OworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc3FydC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYWZlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXJ0LmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsNCk7Citjb3V0IDw8IHYuc3FydCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc3F1YXJlLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXVhcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDRjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc3F1YXJlLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigyLDMsNCk7Citjb3V0IDw8IHYuc3F1YXJlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Rhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1OGVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KE1fUEksIE1fUEkvMiwgTV9QSS8zKTsKK2NvdXQgPDwgdi50YW4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3RhbmguY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3RhbmguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2QwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfdGFuaC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNSwwLDEpOworY291dCA8PCB0YW5oKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfdGltZXNfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3RpbWVzX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc1NTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3RpbWVzX2VxdWFsLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5M2QgdigxLDIsMyksIHcoMiwzLDApOwordiAqPSB3OworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1NGIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkLmNwcApAQCAtMCwwICsxLDIgQEAKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg0LDcsMTApLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhkOjpMaW5TcGFjZWQoNSwwLjAsMS4wKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRJbnQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRJbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2FlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZEludC5jcHAKQEAgLTAsMCArMSw4IEBACitjb3V0IDw8ICJFdmVuIHNwYWNpbmcgaW5wdXRzOiIgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsNCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsOCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsMTUpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8ICJVbmV2ZW4gc3BhY2luZyBpbnB1dHM6IiA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDgsMSw3KS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDgsMSw5KS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDgsMSwxNikudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkX3NlcS5jcHAgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NWM1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEuY3BwCkBAIC0wLDAgKzEsMiBAQAorY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKFNlcXVlbnRpYWwsNCw3LDEwKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZDo6TGluU3BhY2VkKFNlcXVlbnRpYWwsNSwwLjAsMS4wKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9zZXRMaW5TcGFjZWQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9zZXRMaW5TcGFjZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDU0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX3NldExpblNwYWNlZC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRMaW5TcGFjZWQoNSwwLjVmLDEuNWYpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9obm9ybWFsaXplZC5jcHAgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9obm9ybWFsaXplZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxMDc5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX2hub3JtYWxpemVkLmNwcApAQCAtMCwwICsxLDcgQEAKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSw0LER5bmFtaWM+IE1hdHJpeDRYZDsKK01hdHJpeDRYZCBNID0gTWF0cml4NFhkOjpSYW5kb20oNCw1KTsKK1Byb2plY3RpdmUzZCBQKE1hdHJpeDRkOjpSYW5kb20oKSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IE0gaXM6IiA8PCBlbmRsIDw8IE0gPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCAiTS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKToiIDw8IGVuZGwgPDwgTS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSA8PCBlbmRsIDw8IGVuZGw7Citjb3V0IDw8ICJQKk06IiA8PCBlbmRsIDw8IFAqTSA8PCBlbmRsIDw8IGVuZGw7Citjb3V0IDw8ICIoUCpNKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKToiIDw8IGVuZGwgPDwgKFAqTSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkgPDwgZW5kbCA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZS5jcHAgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmQ0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMiwzKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLmNvbHdpc2UoKS5yZXBsaWNhdGU8Mz4oKSA9IC4uLiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5jb2x3aXNlKCkucmVwbGljYXRlPDM+KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZV9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfcmVwbGljYXRlX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliMWI1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZV9pbnQuY3BwCkBAIC0wLDAgKzEsNCBAQAorVmVjdG9yM2kgdiA9IFZlY3RvcjNpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJ2LnJvd3dpc2UoKS5yZXBsaWNhdGUoNSkgPSAuLi4iIDw8IGVuZGw7Citjb3V0IDw8IHYucm93d2lzZSgpLnJlcGxpY2F0ZSg1KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX0VpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX0VpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDlmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfRWlnZW5Tb2x2ZXJfTWF0cml4VHlwZS5jcHAKQEAgLTAsMCArMSwxNiBAQAorTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiw2KTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNng2IG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK0VpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhBKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMsIFYsIGlzOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZlY3RvcnMoKSA8PCBlbmRsIDw8IGVuZGw7CisKK2NvbXBsZXg8ZG91YmxlPiBsYW1iZGEgPSBlcy5laWdlbnZhbHVlcygpWzBdOworY291dCA8PCAiQ29uc2lkZXIgdGhlIGZpcnN0IGVpZ2VudmFsdWUsIGxhbWJkYSA9ICIgPDwgbGFtYmRhIDw8IGVuZGw7CitWZWN0b3JYY2QgdiA9IGVzLmVpZ2VudmVjdG9ycygpLmNvbCgwKTsKK2NvdXQgPDwgIklmIHYgaXMgdGhlIGNvcnJlc3BvbmRpbmcgZWlnZW52ZWN0b3IsIHRoZW4gbGFtYmRhICogdiA9ICIgPDwgZW5kbCA8PCBsYW1iZGEgKiB2IDw8IGVuZGw7Citjb3V0IDw8ICIuLi4gYW5kIEEgKiB2ID0gIiA8PCBlbmRsIDw8IEEuY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpICogdiA8PCBlbmRsIDw8IGVuZGw7CisKK01hdHJpeFhjZCBEID0gZXMuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCk7CitNYXRyaXhYY2QgViA9IGVzLmVpZ2VudmVjdG9ycygpOworY291dCA8PCAiRmluYWxseSwgViAqIEQgKiBWXigtMSkgPSAiIDw8IGVuZGwgPDwgViAqIEQgKiBWLmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Yzk2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAKQEAgLTAsMCArMSw2IEBACitFaWdlblNvbHZlcjxNYXRyaXhYZj4gZXM7CitNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworZXMuY29tcHV0ZShBLCAvKiBjb21wdXRlRWlnZW52ZWN0b3JzID0gKi8gZmFsc2UpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2VzLmNvbXB1dGUoQSArIE1hdHJpeFhmOjpJZGVudGl0eSg0LDQpLCBmYWxzZSk7IC8vIHJlLXVzZSBlcyB0byBjb21wdXRlIGVpZ2VudmFsdWVzIG9mIEErSQorY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEErSSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyODg2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKK0VpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzLCBmYWxzZSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBhcmU6IiAKKyAgICAgPDwgZW5kbCA8PCBlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTVmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworRWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKG9uZXMpOworY291dCA8PCAiVGhlIGZpcnN0IGVpZ2VudmVjdG9yIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgaXM6IgorICAgICA8PCBlbmRsIDw8IGVzLmVpZ2VudmVjdG9ycygpLmNvbCgwKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX3BzZXVkb0VpZ2VudmVjdG9ycy5jcHAgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWUyNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX3BzZXVkb0VpZ2VudmVjdG9ycy5jcHAKQEAgLTAsMCArMSw5IEBACitNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSg2LDYpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA2eDYgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworRWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOworTWF0cml4WGQgRCA9IGVzLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKTsKK01hdHJpeFhkIFYgPSBlcy5wc2V1ZG9FaWdlbnZlY3RvcnMoKTsKK2NvdXQgPDwgIlRoZSBwc2V1ZG8tZWlnZW52YWx1ZSBtYXRyaXggRCBpczoiIDw8IGVuZGwgPDwgRCA8PCBlbmRsOworY291dCA8PCAiVGhlIHBzZXVkby1laWdlbnZlY3RvciBtYXRyaXggViBpczoiIDw8IGVuZGwgPDwgViA8PCBlbmRsOworY291dCA8PCAiRmluYWxseSwgViAqIEQgKiBWXigtMSkgPSAiIDw8IGVuZGwgPDwgViAqIEQgKiBWLmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiYzA3NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOworTWF0cml4M2YgeSA9IE1hdHJpeDNmOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggeToiIDw8IGVuZGwgPDwgeSA8PCBlbmRsOworTWF0cml4M2YgeDsKK3ggPSBtLmZ1bGxQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoeSk7Cithc3NlcnQoeS5pc0FwcHJveChtKngpKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBteD15OiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2ltYWdlLmNwcCBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfaW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2JjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2ltYWdlLmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeDNkIG07CittIDw8IDEsMSwwLAorICAgICAxLDMsMiwKKyAgICAgMCwxLDE7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiTm90aWNlIHRoYXQgdGhlIG1pZGRsZSBjb2x1bW4gaXMgdGhlIHN1bSBvZiB0aGUgdHdvIG90aGVycywgc28gdGhlICIKKyAgICAgPDwgImNvbHVtbnMgYXJlIGxpbmVhcmx5IGRlcGVuZGVudC4iIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBzcGFuIGJ1dCBhcmUgbGluZWFybHkgaW5kZXBlbmRlbnQ6IgorICAgICA8PCBlbmRsIDw8IG0uZnVsbFBpdkx1KCkuaW1hZ2UobSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfa2VybmVsLmNwcCBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfa2VybmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg2ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9rZXJuZWwuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMyw1KTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitNYXRyaXhYZiBrZXIgPSBtLmZ1bGxQaXZMdSgpLmtlcm5lbCgpOworY291dCA8PCAiSGVyZSBpcyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGZvcm0gYSBiYXNpcyBvZiB0aGUga2VybmVsIG9mIG06IgorICAgICA8PCBlbmRsIDw8IGtlciA8PCBlbmRsOworY291dCA8PCAiQnkgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsLCBtKmtlciBpcyB6ZXJvOiIKKyAgICAgPDwgZW5kbCA8PCBtKmtlciA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY4ODIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9zb2x2ZS5jcHAKQEAgLTAsMCArMSwxMSBAQAorTWF0cml4PGZsb2F0LDIsMz4gbSA9IE1hdHJpeDxmbG9hdCwyLDM+OjpSYW5kb20oKTsKK01hdHJpeDJmIHkgPSBNYXRyaXgyZjo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IHk6IiA8PCBlbmRsIDw8IHkgPDwgZW5kbDsKK01hdHJpeDxmbG9hdCwzLDI+IHggPSBtLmZ1bGxQaXZMdSgpLnNvbHZlKHkpOworaWYoKG0qeCkuaXNBcHByb3goeSkpCit7CisgIGNvdXQgPDwgIkhlcmUgaXMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBteD15OiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7Cit9CitlbHNlCisgIGNvdXQgPDwgIlRoZSBlcXVhdGlvbiBteD15IGRvZXMgbm90IGhhdmUgYW55IHNvbHV0aW9uLiIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9HZW5lcmFsaXplZEVpZ2VuU29sdmVyLmNwcCBiL2RvYy9zbmlwcGV0cy9HZW5lcmFsaXplZEVpZ2VuU29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNkYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0dlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuY3BwCkBAIC0wLDAgKzEsNyBAQAorR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhYZj4gZ2VzOworTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIEIgPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7CitnZXMuY29tcHV0ZShBLCBCKTsKK2NvdXQgPDwgIlRoZSAoY29tcGxleCkgbnVtZXJhdG9ycyBvZiB0aGUgZ2VuZXJhbHppZWQgZWlnZW52YWx1ZXMgYXJlOiAiIDw8IGdlcy5hbHBoYXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIChyZWFsKSBkZW5vbWluYXRvcmUgb2YgdGhlIGdlbmVyYWx6aWVkIGVpZ2VudmFsdWVzIGFyZTogIiA8PCBnZXMuYmV0YXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIChjb21wbGV4KSBnZW5lcmFsemllZCBlaWdlbnZhbHVlcyBhcmUgKGFscGhhcy4vYmV0YSk6ICIgPDwgZ2VzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9jb21wdXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGUzNzgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LDQpOworSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4WGNmPiBoZCg0KTsKK2hkLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IEggaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQSBpczoiIDw8IGVuZGwgPDwgaGQubWF0cml4SCgpIDw8IGVuZGw7CitoZC5jb21wdXRlKDIqQSk7IC8vIHJlLXVzZSBoZCB0byBjb21wdXRlIGFuZCBzdG9yZSBkZWNvbXBvc2l0aW9uIG9mIDJBCitjb3V0IDw8ICJUaGUgbWF0cml4IEggaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgMkEgaXM6IiA8PCBlbmRsIDw8IGhkLm1hdHJpeEgoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEguY3BwIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDEzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXg0ZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA0eDQgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CitIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhYZj4gaGVzc09mQShBKTsKK01hdHJpeFhmIEggPSBoZXNzT2ZBLm1hdHJpeEgoKTsKK2NvdXQgPDwgIlRoZSBIZXNzZW5iZXJnIG1hdHJpeCBIIGlzOiIgPDwgZW5kbCA8PCBIIDw8IGVuZGw7CitNYXRyaXhYZiBRID0gaGVzc09mQS5tYXRyaXhRKCk7Citjb3V0IDw8ICJUaGUgb3J0aG9nb25hbCBtYXRyaXggUSBpczoiIDw8IGVuZGwgPDwgUSA8PCBlbmRsOworY291dCA8PCAiUSBIIFFeVCBpczoiIDw8IGVuZGwgPDwgUSAqIEggKiBRLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcCBiL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9wYWNrZWRNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTU5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeDRkIEEgPSBNYXRyaXg0ZDo6UmFuZG9tKDQsNCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeDRkPiBoZXNzT2ZBKEEpOworTWF0cml4NGQgcG0gPSBoZXNzT2ZBLnBhY2tlZE1hdHJpeCgpOworY291dCA8PCAiVGhlIHBhY2tlZCBtYXRyaXggTSBpczoiIDw8IGVuZGwgPDwgcG0gPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSB1cHBlciBIZXNzZW5iZXJnIHBhcnQgY29ycmVzcG9uZHMgdG8gdGhlIG1hdHJpeCBILCB3aGljaCBpczoiIAorICAgICA8PCBlbmRsIDw8IGhlc3NPZkEubWF0cml4SCgpIDw8IGVuZGw7CitWZWN0b3IzZCBoYyA9IGhlc3NPZkEuaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKTsKK2NvdXQgPDwgIlRoZSB2ZWN0b3Igb2YgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIGlzOiIgPDwgZW5kbCA8PCBoYyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyUVJfaG91c2Vob2xkZXJRLmNwcCBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclFSX2hvdXNlaG9sZGVyUS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1OWNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclFSX2hvdXNlaG9sZGVyUS5jcHAKQEAgLTAsMCArMSw3IEBACitNYXRyaXhYZiBBKE1hdHJpeFhmOjpSYW5kb20oNSwzKSksIHRoaW5RKE1hdHJpeFhmOjpJZGVudGl0eSg1LDMpKSwgUTsKK0Euc2V0UmFuZG9tKCk7CitIb3VzZWhvbGRlclFSPE1hdHJpeFhmPiBxcihBKTsKK1EgPSBxci5ob3VzZWhvbGRlclEoKTsKK3RoaW5RID0gcXIuaG91c2Vob2xkZXJRKCkgKiB0aGluUTsKK3N0ZDo6Y291dCA8PCAiVGhlIGNvbXBsZXRlIHVuaXRhcnkgbWF0cml4IFEgaXM6XG4iIDw8IFEgPDwgIlxuXG4iOworc3RkOjpjb3V0IDw8ICJUaGUgdGhpbiBtYXRyaXggUSBpczpcbiIgPDwgdGhpblEgPDwgIlxuXG4iOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyUVJfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyUVJfc29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2U2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKQEAgLTAsMCArMSw5IEBACit0eXBlZGVmIE1hdHJpeDxmbG9hdCwzLDM+IE1hdHJpeDN4MzsKK01hdHJpeDN4MyBtID0gTWF0cml4M3gzOjpSYW5kb20oKTsKK01hdHJpeDNmIHkgPSBNYXRyaXgzZjo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IHk6IiA8PCBlbmRsIDw8IHkgPDwgZW5kbDsKK01hdHJpeDNmIHg7Cit4ID0gbS5ob3VzZWhvbGRlclFyKCkuc29sdmUoeSk7Cithc3NlcnQoeS5pc0FwcHJveChtKngpKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBteD15OiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJTZXF1ZW5jZV9Ib3VzZWhvbGRlclNlcXVlbmNlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzJiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJTZXF1ZW5jZV9Ib3VzZWhvbGRlclNlcXVlbmNlLmNwcApAQCAtMCwwICsxLDMxIEBACitNYXRyaXgzZCB2ID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiVGhlIG1hdHJpeCB2IGlzOiIgPDwgZW5kbDsKK2NvdXQgPDwgdiA8PCBlbmRsOworCitWZWN0b3IzZCB2MCgxLCB2KDEsMCksIHYoMiwwKSk7Citjb3V0IDw8ICJUaGUgZmlyc3QgSG91c2Vob2xkZXIgdmVjdG9yIGlzOiB2XzAgPSAiIDw8IHYwLnRyYW5zcG9zZSgpIDw8IGVuZGw7CitWZWN0b3IzZCB2MSgwLCAxLCB2KDIsMSkpOworY291dCA8PCAiVGhlIHNlY29uZCBIb3VzZWhvbGRlciB2ZWN0b3IgaXM6IHZfMSA9ICIgPDwgdjEudHJhbnNwb3NlKCkgIDw8IGVuZGw7CitWZWN0b3IzZCB2MigwLCAwLCAxKTsKK2NvdXQgPDwgIlRoZSB0aGlyZCBIb3VzZWhvbGRlciB2ZWN0b3IgaXM6IHZfMiA9ICIgPDwgdjIudHJhbnNwb3NlKCkgPDwgZW5kbDsKKworVmVjdG9yM2QgaCA9IFZlY3RvcjNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIlRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgYXJlOiBoID0gIiA8PCBoLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisKK01hdHJpeDNkIEgwID0gTWF0cml4M2Q6OklkZW50aXR5KCkgLSBoKDApICogdjAgKiB2MC5hZGpvaW50KCk7Citjb3V0IDw8ICJUaGUgZmlyc3QgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBpcyByZXByZXNlbnRlZCBieSBIXzAgPSAiIDw8IGVuZGw7Citjb3V0IDw8IEgwIDw8IGVuZGw7CitNYXRyaXgzZCBIMSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpIC0gaCgxKSAqIHYxICogdjEuYWRqb2ludCgpOworY291dCA8PCAiVGhlIHNlY29uZCBIb3VzZWhvbGRlciByZWZsZWN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IEhfMSA9ICIgPDwgZW5kbDsKK2NvdXQgPDwgSDEgPDwgZW5kbDsKK01hdHJpeDNkIEgyID0gTWF0cml4M2Q6OklkZW50aXR5KCkgLSBoKDIpICogdjIgKiB2Mi5hZGpvaW50KCk7Citjb3V0IDw8ICJUaGUgdGhpcmQgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBpcyByZXByZXNlbnRlZCBieSBIXzIgPSAiIDw8IGVuZGw7Citjb3V0IDw8IEgyIDw8IGVuZGw7Citjb3V0IDw8ICJUaGVpciBwcm9kdWN0IGlzIEhfMCBIXzEgSF8yID0gIiA8PCBlbmRsOworY291dCA8PCBIMCAqIEgxICogSDIgPDwgZW5kbDsKKworSG91c2Vob2xkZXJTZXF1ZW5jZTxNYXRyaXgzZCwgVmVjdG9yM2Q+IGhoU2VxKHYsIGgpOworTWF0cml4M2QgaGhTZXFBc01hdHJpeChoaFNlcSk7Citjb3V0IDw8ICJJZiB3ZSBjb25zdHJ1Y3QgYSBIb3VzZWhvbGRlclNlcXVlbmNlIGZyb20gdiBhbmQgaCIgPDwgZW5kbDsKK2NvdXQgPDwgImFuZCBjb252ZXJ0IGl0IHRvIGEgbWF0cml4LCB3ZSBnZXQ6IiA8PCBlbmRsOworY291dCA8PCBoaFNlcUFzTWF0cml4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSU9Gb3JtYXQuY3BwIGIvZG9jL3NuaXBwZXRzL0lPRm9ybWF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVmNWRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0lPRm9ybWF0LmNwcApAQCAtMCwwICsxLDE0IEBACitzdGQ6OnN0cmluZyBzZXAgPSAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworTWF0cml4M2QgbTE7CittMSA8PCAxLjExMTExMSwgMiwgMy4zMzMzMywgNCwgNSwgNiwgNywgOC44ODg4ODgsIDk7CisKK0lPRm9ybWF0IENvbW1hSW5pdEZtdChTdHJlYW1QcmVjaXNpb24sIERvbnRBbGlnbkNvbHMsICIsICIsICIsICIsICIiLCAiIiwgIiA8PCAiLCAiOyIpOworSU9Gb3JtYXQgQ2xlYW5GbXQoNCwgMCwgIiwgIiwgIlxuIiwgIlsiLCAiXSIpOworSU9Gb3JtYXQgT2N0YXZlRm10KFN0cmVhbVByZWNpc2lvbiwgMCwgIiwgIiwgIjtcbiIsICIiLCAiIiwgIlsiLCAiXSIpOworSU9Gb3JtYXQgSGVhdnlGbXQoRnVsbFByZWNpc2lvbiwgMCwgIiwgIiwgIjtcbiIsICJbIiwgIl0iLCAiWyIsICJdIik7CisKK3N0ZDo6Y291dCA8PCBtMSA8PCBzZXA7CitzdGQ6OmNvdXQgPDwgbTEuZm9ybWF0KENvbW1hSW5pdEZtdCkgPDwgc2VwOworc3RkOjpjb3V0IDw8IG0xLmZvcm1hdChDbGVhbkZtdCkgPDwgc2VwOworc3RkOjpjb3V0IDw8IG0xLmZvcm1hdChPY3RhdmVGbXQpIDw8IHNlcDsKK3N0ZDo6Y291dCA8PCBtMS5mb3JtYXQoSGVhdnlGbXQpIDw8IHNlcDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9KYWNvYmlTVkRfYmFzaWMuY3BwIGIvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNGI5YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9KYWNvYmlTVkRfYmFzaWMuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMywyKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitKYWNvYmlTVkQ8TWF0cml4WGY+IHN2ZChtLCBDb21wdXRlVGhpblUgfCBDb21wdXRlVGhpblYpOworY291dCA8PCAiSXRzIHNpbmd1bGFyIHZhbHVlcyBhcmU6IiA8PCBlbmRsIDw8IHN2ZC5zaW5ndWxhclZhbHVlcygpIDw8IGVuZGw7Citjb3V0IDw8ICJJdHMgbGVmdCBzaW5ndWxhciB2ZWN0b3JzIGFyZSB0aGUgY29sdW1ucyBvZiB0aGUgdGhpbiBVIG1hdHJpeDoiIDw8IGVuZGwgPDwgc3ZkLm1hdHJpeFUoKSA8PCBlbmRsOworY291dCA8PCAiSXRzIHJpZ2h0IHNpbmd1bGFyIHZlY3RvcnMgYXJlIHRoZSBjb2x1bW5zIG9mIHRoZSB0aGluIFYgbWF0cml4OiIgPDwgZW5kbCA8PCBzdmQubWF0cml4VigpIDw8IGVuZGw7CitWZWN0b3IzZiByaHMoMSwgMCwgMCk7Citjb3V0IDw8ICJOb3cgY29uc2lkZXIgdGhpcyByaHMgdmVjdG9yOiIgPDwgZW5kbCA8PCByaHMgPDwgZW5kbDsKK2NvdXQgPDwgIkEgbGVhc3Qtc3F1YXJlcyBzb2x1dGlvbiBvZiBtKnggPSByaHMgaXM6IiA8PCBlbmRsIDw8IHN2ZC5zb2x2ZShyaHMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSmFjb2JpX21ha2VHaXZlbnMuY3BwIGIvZG9jL3NuaXBwZXRzL0phY29iaV9tYWtlR2l2ZW5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjczM2MzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0phY29iaV9tYWtlR2l2ZW5zLmNwcApAQCAtMCwwICsxLDYgQEAKK1ZlY3RvcjJmIHYgPSBWZWN0b3IyZjo6UmFuZG9tKCk7CitKYWNvYmlSb3RhdGlvbjxmbG9hdD4gRzsKK0cubWFrZUdpdmVucyh2LngoKSwgdi55KCkpOworY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIHY6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKK3YuYXBwbHlPblRoZUxlZnQoMCwgMSwgRy5hZGpvaW50KCkpOworY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIEonICogdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9KYWNvYmlfbWFrZUphY29iaS5jcHAgYi9kb2Mvc25pcHBldHMvSmFjb2JpX21ha2VKYWNvYmkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSmFjb2JpX21ha2VKYWNvYmkuY3BwCkBAIC0wLDAgKzEsOCBAQAorTWF0cml4MmYgbSA9IE1hdHJpeDJmOjpSYW5kb20oKTsKK20gPSAobSArIG0uYWRqb2ludCgpKS5ldmFsKCk7CitKYWNvYmlSb3RhdGlvbjxmbG9hdD4gSjsKK0oubWFrZUphY29iaShtLCAwLCAxKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CittLmFwcGx5T25UaGVMZWZ0KDAsIDEsIEouYWRqb2ludCgpKTsKK20uYXBwbHlPblRoZVJpZ2h0KDAsIDEsIEopOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEonICogbSAqIEo6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTExUX2V4YW1wbGUuY3BwIGIvZG9jL3NuaXBwZXRzL0xMVF9leGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZiNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0xMVF9leGFtcGxlLmNwcApAQCAtMCwwICsxLDEyIEBACitNYXRyaXhYZCBBKDMsMyk7CitBIDw8IDQsLTEsMiwgLTEsNiwwLCAyLDAsNTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggQSBpcyIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CisKK0xMVDxNYXRyaXhYZD4gbGx0T2ZBKEEpOyAvLyBjb21wdXRlIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIEEKK01hdHJpeFhkIEwgPSBsbHRPZkEubWF0cml4TCgpOyAvLyByZXRyaWV2ZSBmYWN0b3IgTCAgaW4gdGhlIGRlY29tcG9zaXRpb24KKy8vIFRoZSBwcmV2aW91cyB0d28gbGluZXMgY2FuIGFsc28gYmUgd3JpdHRlbiBhcyAiTCA9IEEubGx0KCkubWF0cml4TCgpIgorCitjb3V0IDw8ICJUaGUgQ2hvbGVza3kgZmFjdG9yIEwgaXMiIDw8IGVuZGwgPDwgTCA8PCBlbmRsOworY291dCA8PCAiVG8gY2hlY2sgdGhpcywgbGV0IHVzIGNvbXB1dGUgTCAqIEwudHJhbnNwb3NlKCkiIDw8IGVuZGw7Citjb3V0IDw8IEwgKiBMLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8ICJUaGlzIHNob3VsZCBlcXVhbCB0aGUgbWF0cml4IEEiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTExUX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9MTFRfc29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTVkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTExUX3NvbHZlLmNwcApAQCAtMCwwICsxLDggQEAKK3R5cGVkZWYgTWF0cml4PGZsb2F0LER5bmFtaWMsMj4gRGF0YU1hdHJpeDsKKy8vIGxldCdzIGdlbmVyYXRlIHNvbWUgc2FtcGxlcyBvbiB0aGUgM0QgcGxhbmUgb2YgZXF1YXRpb24geiA9IDJ4KzN5ICh3aXRoIHNvbWUgbm9pc2UpCitEYXRhTWF0cml4IHNhbXBsZXMgPSBEYXRhTWF0cml4OjpSYW5kb20oMTIsMik7CitWZWN0b3JYZiBlbGV2YXRpb25zID0gMipzYW1wbGVzLmNvbCgwKSArIDMqc2FtcGxlcy5jb2woMSkgKyBWZWN0b3JYZjo6UmFuZG9tKDEyKSowLjE7CisvLyBhbmQgbGV0J3Mgc29sdmUgc2FtcGxlcyAqIFt4IHldXlQgPSBlbGV2YXRpb25zIGluIGxlYXN0IHNxdWFyZSBzZW5zZToKK01hdHJpeDxmbG9hdCwyLDE+IHh5CisgPSAoc2FtcGxlcy5hZGpvaW50KCkgKiBzYW1wbGVzKS5sbHQoKS5zb2x2ZSgoc2FtcGxlcy5hZGpvaW50KCkqZWxldmF0aW9ucykpOworY291dCA8PCB4eSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5jcHAgYi9kb2Mvc25pcHBldHMvTGVhc3RTcXVhcmVzTm9ybWFsRXF1YXRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdjZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLCAyKTsKK1ZlY3RvclhmIGIgPSBWZWN0b3JYZjo6UmFuZG9tKDMpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHVzaW5nIG5vcm1hbCBlcXVhdGlvbnMgaXM6XG4iCisgICAgIDw8IChBLnRyYW5zcG9zZSgpICogQSkubGRsdCgpLnNvbHZlKEEudHJhbnNwb3NlKCkgKiBiKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc1FSLmNwcCBiL2RvYy9zbmlwcGV0cy9MZWFzdFNxdWFyZXNRUi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5NzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9MZWFzdFNxdWFyZXNRUi5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLCAyKTsKK1ZlY3RvclhmIGIgPSBWZWN0b3JYZjo6UmFuZG9tKDMpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHVzaW5nIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGlzOlxuIgorICAgICA8PCBBLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShiKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hcF9nZW5lcmFsX3N0cmlkZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX2dlbmVyYWxfc3RyaWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjU3ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hcF9nZW5lcmFsX3N0cmlkZS5jcHAKQEAgLTAsMCArMSw1IEBACitpbnQgYXJyYXlbMjRdOworZm9yKGludCBpID0gMDsgaSA8IDI0OyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgTWFwPE1hdHJpeFhpLCAwLCBTdHJpZGU8RHluYW1pYywyPiA+CisgICAgICAgICAoYXJyYXksIDMsIDMsIFN0cmlkZTxEeW5hbWljLDI+KDgsIDIpKQorICAgICA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hcF9pbm5lcl9zdHJpZGUuY3BwIGIvZG9jL3NuaXBwZXRzL01hcF9pbm5lcl9zdHJpZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWFlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWFwX2lubmVyX3N0cmlkZS5jcHAKQEAgLTAsMCArMSw1IEBACitpbnQgYXJyYXlbMTJdOworZm9yKGludCBpID0gMDsgaSA8IDEyOyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgTWFwPFZlY3RvclhpLCAwLCBJbm5lclN0cmlkZTwyPiA+CisgICAgICAgICAoYXJyYXksIDYpIC8vIHRoZSBpbm5lciBzdHJpZGUgaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAgIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX291dGVyX3N0cmlkZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX291dGVyX3N0cmlkZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZjA1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfb3V0ZXJfc3RyaWRlLmNwcApAQCAtMCwwICsxLDMgQEAKK2ludCBhcnJheVsxMl07Citmb3IoaW50IGkgPSAwOyBpIDwgMTI7ICsraSkgYXJyYXlbaV0gPSBpOworY291dCA8PCBNYXA8TWF0cml4WGksIDAsIE91dGVyU3RyaWRlPD4gPihhcnJheSwgMywgMywgT3V0ZXJTdHJpZGU8Pig0KSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXBfcGxhY2VtZW50X25ldy5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX3BsYWNlbWVudF9uZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDBlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWFwX3BsYWNlbWVudF9uZXcuY3BwCkBAIC0wLDAgKzEsNSBAQAoraW50IGRhdGFbXSA9IHsxLDIsMyw0LDUsNiw3LDgsOX07CitNYXA8Um93VmVjdG9yWGk+IHYoZGF0YSw0KTsKK2NvdXQgPDwgIlRoZSBtYXBwZWQgdmVjdG9yIHYgaXM6ICIgPDwgdiA8PCAiXG4iOworbmV3ICgmdikgTWFwPFJvd1ZlY3RvclhpPihkYXRhKzQsNSk7Citjb3V0IDw8ICJOb3cgdiBpczogIiA8PCB2IDw8ICJcbiI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hcF9zaW1wbGUuY3BwIGIvZG9jL3NuaXBwZXRzL01hcF9zaW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyM2JiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWFwX3NpbXBsZS5jcHAKQEAgLTAsMCArMSwzIEBACitpbnQgYXJyYXlbOV07Citmb3IoaW50IGkgPSAwOyBpIDwgOTsgKytpKSBhcnJheVtpXSA9IGk7Citjb3V0IDw8IE1hcDxNYXRyaXgzaT4oYXJyYXkpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hZGpvaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Fkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODBkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hZGpvaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDJjZiBtID0gTWF0cml4MmNmOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIDJ4MiBjb21wbGV4IG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhZGpvaW50IG9mIG06IiA8PCBlbmRsIDw8IG0uYWRqb2ludCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hbGwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmYyNmYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYWxsLmNwcApAQCAtMCwwICsxLDcgQEAKK1ZlY3RvcjNmIGJveE1pbihWZWN0b3IzZjo6WmVybygpKSwgYm94TWF4KFZlY3RvcjNmOjpPbmVzKCkpOworVmVjdG9yM2YgcDAgPSBWZWN0b3IzZjo6UmFuZG9tKCksIHAxID0gVmVjdG9yM2Y6OlJhbmRvbSgpLmN3aXNlQWJzKCk7CisvLyBsZXQncyBjaGVjayBpZiBwMCBhbmQgcDEgYXJlIGluc2lkZSB0aGUgYXhpcyBhbGlnbmVkIGJveCBkZWZpbmVkIGJ5IHRoZSBjb3JuZXJzIGJveE1pbixib3hNYXg6Citjb3V0IDw8ICJJcyAoIiA8PCBwMC50cmFuc3Bvc2UoKSA8PCAiKSBpbnNpZGUgdGhlIGJveDogIgorICAgICA8PCAoKGJveE1pbi5hcnJheSgpPHAwLmFycmF5KCkpLmFsbCgpICYmIChib3hNYXguYXJyYXkoKT5wMC5hcnJheSgpKS5hbGwoKSkgPDwgZW5kbDsKK2NvdXQgPDwgIklzICgiIDw8IHAxLnRyYW5zcG9zZSgpIDw8ICIpIGluc2lkZSB0aGUgYm94OiAiCisgICAgIDw8ICgoYm94TWluLmFycmF5KCk8cDEuYXJyYXkoKSkuYWxsKCkgJiYgKGJveE1heC5hcnJheSgpPnAxLmFycmF5KCkpLmFsbCgpKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXBwbHlPblRoZUxlZnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXBwbHlPblRoZUxlZnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOThjODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcHBseU9uVGhlTGVmdC5jcHAKQEAgLTAsMCArMSw3IEBACitNYXRyaXgzZiBBID0gTWF0cml4M2Y6OlJhbmRvbSgzLDMpLCBCOworQiA8PCAwLDEsMCwgIAorICAgICAwLDAsMSwgIAorICAgICAxLDAsMDsKK2NvdXQgPDwgIkF0IHN0YXJ0LCBBID0gIiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK0EuYXBwbHlPblRoZUxlZnQoQik7IAorY291dCA8PCAiQWZ0ZXIgYXBwbHlPblRoZUxlZnQsIEEgPSAiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXBwbHlPblRoZVJpZ2h0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiNzFiMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAKQEAgLTAsMCArMSw5IEBACitNYXRyaXgzZiBBID0gTWF0cml4M2Y6OlJhbmRvbSgzLDMpLCBCOworQiA8PCAwLDEsMCwgIAorICAgICAwLDAsMSwgIAorICAgICAxLDAsMDsKK2NvdXQgPDwgIkF0IHN0YXJ0LCBBID0gIiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK0EgKj0gQjsKK2NvdXQgPDwgIkFmdGVyIEEgKj0gQiwgQSA9ICIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CitBLmFwcGx5T25UaGVSaWdodChCKTsgIC8vIGVxdWl2YWxlbnQgdG8gQSAqPSBCCitjb3V0IDw8ICJBZnRlciBhcHBseU9uVGhlUmlnaHQsIEEgPSAiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTUwODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheS5jcHAKQEAgLTAsMCArMSw0IEBACitWZWN0b3IzZCB2KDEsMiwzKTsKK3YuYXJyYXkoKSArPSAzOwordi5hcnJheSgpIC09IDI7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FycmF5X2NvbnN0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FycmF5X2NvbnN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNiMjZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXlfY29uc3QuY3BwCkBAIC0wLDAgKzEsNCBAQAorVmVjdG9yM2QgdigtMSwyLC0zKTsKK2NvdXQgPDwgInRoZSBhYnNvbHV0ZSB2YWx1ZXM6IiA8PCBlbmRsIDw8IHYuYXJyYXkoKS5hYnMoKSA8PCBlbmRsOworY291dCA8PCAidGhlIGFic29sdXRlIHZhbHVlcyBwbHVzIG9uZToiIDw8IGVuZGwgPDwgdi5hcnJheSgpLmFicygpKzEgPDwgZW5kbDsKK2NvdXQgPDwgInN1bSBvZiB0aGUgc3F1YXJlczogIiA8PCB2LmFycmF5KCkuc3F1YXJlKCkuc3VtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXNEaWFnb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMDgyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwCkBAIC0wLDAgKzEgQEAKK2NvdXQgPDwgTWF0cml4M2koVmVjdG9yM2koMiw1LDYpLmFzRGlhZ29uYWwoKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5YjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uYmxvY2s8MiwyPigxLDEpOiIgPDwgZW5kbCA8PCBtLmJsb2NrPDIsMj4oMSwxKSA8PCBlbmRsOworbS5ibG9jazwyLDI+KDEsMSkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnRfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzOGNiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnRfaW50X2ludC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ibG9jaygxLCAxLCAyLCAyKToiIDw8IGVuZGwgPDwgbS5ibG9jaygxLCAxLCAyLCAyKSA8PCBlbmRsOworbS5ibG9jaygxLCAxLCAyLCAyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYm90dG9tTGVmdENvcm5lcl9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFlOTVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYm90dG9tTGVmdENvcm5lcl9pbnRfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBtLmJvdHRvbUxlZnRDb3JuZXIoMiwgMik6IiA8PCBlbmRsOworY291dCA8PCBtLmJvdHRvbUxlZnRDb3JuZXIoMiwgMikgPDwgZW5kbDsKK20uYm90dG9tTGVmdENvcm5lcigyLCAyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBtLmJvdHRvbVJpZ2h0Q29ybmVyKDIsIDIpOiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5ib3R0b21SaWdodENvcm5lcigyLCAyKSA8PCBlbmRsOworbS5ib3R0b21SaWdodENvcm5lcigyLCAyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21Sb3dzX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21Sb3dzX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjYTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJvd3NfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK0FycmF5NDRpIGEgPSBBcnJheTQ0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhcnJheSBhOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEuYm90dG9tUm93cygyKToiIDw8IGVuZGw7Citjb3V0IDw8IGEuYm90dG9tUm93cygyKSA8PCBlbmRsOworYS5ib3R0b21Sb3dzKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgYXJyYXkgYSBpczoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY2FzdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jYXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY4ODBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY2FzdC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgyZCBtZCA9IE1hdHJpeDJkOjpJZGVudGl0eSgpICogMC40NTsKK01hdHJpeDJmIG1mID0gTWF0cml4MmY6OklkZW50aXR5KCk7Citjb3V0IDw8IG1kICsgbWYuY2FzdDxkb3VibGU+KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzkxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2wuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpOworbS5jb2woMSkgPSBWZWN0b3IzZCg0LDUsNik7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbHdpc2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0OGJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbHdpc2UuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBzdW0gb2YgZWFjaCBjb2x1bW46IiA8PCBlbmRsIDw8IG0uY29sd2lzZSgpLnN1bSgpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggY29sdW1uOiIKKyAgICAgPDwgZW5kbCA8PCBtLmN3aXNlQWJzKCkuY29sd2lzZSgpLm1heENvZWZmKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2IwODRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwCkBAIC0wLDAgKzEsMTMgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworTWF0cml4M2QgaW52ZXJzZTsKK2Jvb2wgaW52ZXJ0aWJsZTsKK2RvdWJsZSBkZXRlcm1pbmFudDsKK20uY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soaW52ZXJzZSxkZXRlcm1pbmFudCxpbnZlcnRpYmxlKTsKK2NvdXQgPDwgIkl0cyBkZXRlcm1pbmFudCBpcyAiIDw8IGRldGVybWluYW50IDw8IGVuZGw7CitpZihpbnZlcnRpYmxlKSB7CisgIGNvdXQgPDwgIkl0IGlzIGludmVydGlibGUsIGFuZCBpdHMgaW52ZXJzZSBpczoiIDw8IGVuZGwgPDwgaW52ZXJzZSA8PCBlbmRsOworfQorZWxzZSB7CisgIGNvdXQgPDwgIkl0IGlzIG5vdCBpbnZlcnRpYmxlLiIgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlV2l0aENoZWNrLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlV2l0aENoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNhOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VXaXRoQ2hlY2suY3BwCkBAIC0wLDAgKzEsMTEgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworTWF0cml4M2QgaW52ZXJzZTsKK2Jvb2wgaW52ZXJ0aWJsZTsKK20uY29tcHV0ZUludmVyc2VXaXRoQ2hlY2soaW52ZXJzZSxpbnZlcnRpYmxlKTsKK2lmKGludmVydGlibGUpIHsKKyAgY291dCA8PCAiSXQgaXMgaW52ZXJ0aWJsZSwgYW5kIGl0cyBpbnZlcnNlIGlzOiIgPDwgZW5kbCA8PCBpbnZlcnNlIDw8IGVuZGw7Cit9CitlbHNlIHsKKyAgY291dCA8PCAiSXQgaXMgbm90IGludmVydGlibGUuIiA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFicy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBtKDIsMyk7CittIDw8IDIsIC00LCA2LCAgIAorICAgICAtNSwgMSwgMDsKK2NvdXQgPDwgbS5jd2lzZUFicygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODlhMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMyLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhkIG0oMiwzKTsKK20gPDwgMiwgLTQsIDYsICAgCisgICAgIC01LCAxLCAwOworY291dCA8PCBtLmN3aXNlQWJzMigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUVxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlRXF1YWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzY1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUVxdWFsLmNwcApAQCAtMCwwICsxLDcgQEAKK01hdHJpeFhpIG0oMiwyKTsKK20gPDwgMSwgMCwKKyAgICAgMSwgMTsKK2NvdXQgPDwgIkNvbXBhcmluZyBtIHdpdGggaWRlbnRpdHkgbWF0cml4OiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5jd2lzZUVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLDIpKSA8PCBlbmRsOworaW50IGNvdW50ID0gbS5jd2lzZUVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLDIpKS5jb3VudCgpOworY291dCA8PCAiTnVtYmVyIG9mIGNvZWZmaWNpZW50cyB0aGF0IGFyZSBlcXVhbDogIiA8PCBjb3VudCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VJbnZlcnNlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlMDhmNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBtKDIsMyk7CittIDw8IDIsIDAuNSwgMSwgICAKKyAgICAgMywgMC4yNSwgMTsKK2NvdXQgPDwgbS5jd2lzZUludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNYXguY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNYXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1heC5jcHAKQEAgLTAsMCArMSwyIEBACitWZWN0b3IzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Citjb3V0IDw8IHYuY3dpc2VNYXgodykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWluLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZjNzYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNaW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorVmVjdG9yM2QgdigyLDMsNCksIHcoNCwyLDMpOworY291dCA8PCB2LmN3aXNlTWluKHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTm90RXF1YWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmU0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLmNwcApAQCAtMCwwICsxLDcgQEAKK01hdHJpeFhpIG0oMiwyKTsKK20gPDwgMSwgMCwKKyAgICAgMSwgMTsKK2NvdXQgPDwgIkNvbXBhcmluZyBtIHdpdGggaWRlbnRpdHkgbWF0cml4OiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5jd2lzZU5vdEVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLDIpKSA8PCBlbmRsOworaW50IGNvdW50ID0gbS5jd2lzZU5vdEVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLDIpKS5jb3VudCgpOworY291dCA8PCAiTnVtYmVyIG9mIGNvZWZmaWNpZW50cyB0aGF0IGFyZSBub3QgZXF1YWw6ICIgPDwgY291bnQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUHJvZHVjdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVByb2R1Y3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjNhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVByb2R1Y3QuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4M2kgYSA9IE1hdHJpeDNpOjpSYW5kb20oKSwgYiA9IE1hdHJpeDNpOjpSYW5kb20oKTsKK01hdHJpeDNpIGMgPSBhLmN3aXNlUHJvZHVjdChiKTsKK2NvdXQgPDwgImE6XG4iIDw8IGEgPDwgIlxuYjpcbiIgPDwgYiA8PCAiXG5jOlxuIiA8PCBjIDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VRdW90aWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5MTIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwCkBAIC0wLDAgKzEsMiBAQAorVmVjdG9yM2QgdigyLDMsNCksIHcoNCwyLDMpOworY291dCA8PCB2LmN3aXNlUXVvdGllbnQodykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU2lnbi5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNpZ24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDcxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNpZ24uY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGQgbSgyLDMpOworbSA8PCAgMiwgLTQsIDYsCisgICAgIC01LCAgMSwgMDsKK2NvdXQgPDwgbS5jd2lzZVNpZ24oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VTcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKQEAgLTAsMCArMSwyIEBACitWZWN0b3IzZCB2KDEsMiw0KTsKK2NvdXQgPDwgdi5jd2lzZVNxcnQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjM0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9kaWFnb25hbC5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXgzaSBtID0gTWF0cml4M2k6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgYXJlIHRoZSBjb2VmZmljaWVudHMgb24gdGhlIG1haW4gZGlhZ29uYWwgb2YgbToiIDw8IGVuZGwKKyAgICAgPDwgbS5kaWFnb25hbCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9kaWFnb25hbF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY2YWJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBhcmUgdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgMXN0IHN1cGVyLWRpYWdvbmFsIGFuZCAybmQgc3ViLWRpYWdvbmFsIG9mIG06IiA8PCBlbmRsCisgICAgIDw8IG0uZGlhZ29uYWwoMSkudHJhbnNwb3NlKCkgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsKC0yKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsX3RlbXBsYXRlX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3M2QxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsX3RlbXBsYXRlX2ludC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgYXJlIHRoZSBjb2VmZmljaWVudHMgb24gdGhlIDFzdCBzdXBlci1kaWFnb25hbCBhbmQgMm5kIHN1Yi1kaWFnb25hbCBvZiBtOiIgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsPDE+KCkudHJhbnNwb3NlKCkgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsPC0yPigpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9laWdlbnZhbHVlcy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9laWdlbnZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5Zjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VpZ2VudmFsdWVzLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworVmVjdG9yWGNkIGVpdmFscyA9IG9uZXMuZWlnZW52YWx1ZXMoKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIDw8IGVuZGwgPDwgZWl2YWxzIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9lbmRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VuZF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzU0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9lbmRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LnRhaWwoMik6IiA8PCBlbmRsIDw8IHYudGFpbCgyKSA8PCBlbmRsOwordi50YWlsKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2V2YWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZXZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmM2FhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2V2YWwuY3BwCkBAIC0wLDAgKzEsMTIgQEAKK01hdHJpeDJmIE0gPSBNYXRyaXgyZjo6UmFuZG9tKCk7CitNYXRyaXgyZiBtOworbSA9IE07Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiTm93IHdlIHdhbnQgdG8gY29weSBhIGNvbHVtbiBpbnRvIGEgcm93LiIgPDwgZW5kbDsKK2NvdXQgPDwgIklmIHdlIGRvIG0uY29sKDEpID0gbS5yb3coMCksIHRoZW4gbSBiZWNvbWVzOiIgPDwgZW5kbDsKK20uY29sKDEpID0gbS5yb3coMCk7Citjb3V0IDw8IG0gPDwgZW5kbCA8PCAid2hpY2ggaXMgd3JvbmchIiA8PCBlbmRsOworY291dCA8PCAiTm93IGxldCB1cyBpbnN0ZWFkIGRvIG0uY29sKDEpID0gbS5yb3coMCkuZXZhbCgpLiBUaGVuIG0gYmVjb21lcyIgPDwgZW5kbDsKK20gPSBNOworbS5jb2woMSkgPSBtLnJvdygwKS5ldmFsKCk7Citjb3V0IDw8IG0gPDwgZW5kbCA8PCAid2hpY2ggaXMgcmlnaHQuIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZml4ZWRCbG9ja19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ZpeGVkQmxvY2tfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMTEyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ZpeGVkQmxvY2tfaW50X2ludC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXg0ZCBtID0gVmVjdG9yNGQoMSwyLDMsNCkuYXNEaWFnb25hbCgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5maXhlZDwyLCAyPigyLCAyKToiIDw8IGVuZGwgPDwgbS5ibG9jazwyLCAyPigyLCAyKSA8PCBlbmRsOworbS5ibG9jazwyLCAyPigyLCAwKSA9IG0uYmxvY2s8MiwgMj4oMiwgMik7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9obm9ybWFsaXplZC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9obm9ybWFsaXplZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyY2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hub3JtYWxpemVkLmNwcApAQCAtMCwwICsxLDYgQEAKK1ZlY3RvcjRkIHYgPSBWZWN0b3I0ZDo6UmFuZG9tKCk7CitQcm9qZWN0aXZlM2QgUChNYXRyaXg0ZDo6UmFuZG9tKCkpOworY291dCA8PCAidiAgICAgICAgICAgICAgICAgICA9ICIgPDwgdi50cmFuc3Bvc2UoKSA8PCAiXV5UIiA8PCBlbmRsOworY291dCA8PCAidi5obm9ybWFsaXplZCgpICAgICA9ICIgPDwgdi5obm9ybWFsaXplZCgpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Citjb3V0IDw8ICJQKnYgICAgICAgICAgICAgICAgID0gIiA8PCAoUCp2KS50cmFuc3Bvc2UoKSA8PCAiXV5UIiA8PCBlbmRsOworY291dCA8PCAiKFAqdikuaG5vcm1hbGl6ZWQoKSA9ICIgPDwgKFAqdikuaG5vcm1hbGl6ZWQoKS50cmFuc3Bvc2UoKSA8PCAiXV5UIiA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hvbW9nZW5lb3VzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hvbW9nZW5lb3VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdjMjhmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaG9tb2dlbmVvdXMuY3BwCkBAIC0wLDAgKzEsNiBAQAorVmVjdG9yM2QgdiA9IFZlY3RvcjNkOjpSYW5kb20oKSwgdzsKK1Byb2plY3RpdmUzZCBQKE1hdHJpeDRkOjpSYW5kb20oKSk7Citjb3V0IDw8ICJ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFsiIDw8IHYudHJhbnNwb3NlKCkgPDwgIl1eVCIgPDwgZW5kbDsKK2NvdXQgPDwgImguaG9tb2dlbmVvdXMoKSAgICAgICAgICAgICAgICAgICAgID0gWyIgPDwgdi5ob21vZ2VuZW91cygpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Citjb3V0IDw8ICIoUCAqIHYuaG9tb2dlbmVvdXMoKSkgICAgICAgICAgICAgICA9IFsiIDw8IChQICogdi5ob21vZ2VuZW91cygpKS50cmFuc3Bvc2UoKSA8PCAiXV5UIiA8PCBlbmRsOworY291dCA8PCAiKFAgKiB2LmhvbW9nZW5lb3VzKCkpLmhub3JtYWxpemVkKCkgPSBbIiA8PCAoUCAqIHYuaG9tb2dlbmVvdXMoKSkuZXZhbCgpLmhub3JtYWxpemVkKCkudHJhbnNwb3NlKCkgPDwgIl1eVCIgPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lkZW50aXR5LmNwcApAQCAtMCwwICsxIEBACitjb3V0IDw8IE1hdHJpeDxkb3VibGUsIDMsIDQ+OjpJZGVudGl0eSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eV9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lkZW50aXR5X2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODY0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eV9pbnRfaW50LmNwcApAQCAtMCwwICsxIEBACitjb3V0IDw8IE1hdHJpeFhkOjpJZGVudGl0eSg0LCAzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaW52ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pbnZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYxNDJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaW52ZXJzZS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkl0cyBpbnZlcnNlIGlzOiIgPDwgZW5kbCA8PCBtLmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNEaWFnb25hbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFkNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNEaWFnb25hbC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXgzZCBtID0gMTAwMDAgKiBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKK20oMCwyKSA9IDE7Citjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzRGlhZ29uYWwoKSByZXR1cm5zOiAiIDw8IG0uaXNEaWFnb25hbCgpIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzRGlhZ29uYWwoMWUtMykgcmV0dXJuczogIiA8PCBtLmlzRGlhZ29uYWwoMWUtMykgPDwgZW5kbDsKKwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc0lkZW50aXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I3NTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OklkZW50aXR5KCk7CittKDAsMikgPSAxZS00OworY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAibS5pc0lkZW50aXR5KCkgcmV0dXJuczogIiA8PCBtLmlzSWRlbnRpdHkoKSA8PCBlbmRsOworY291dCA8PCAibS5pc0lkZW50aXR5KDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc0lkZW50aXR5KDFlLTMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc09uZXMuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPbmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJmNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPbmVzLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6T25lcygpOworbSgwLDIpICs9IDFlLTQ7Citjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzT25lcygpIHJldHVybnM6ICIgPDwgbS5pc09uZXMoKSA8PCBlbmRsOworY291dCA8PCAibS5pc09uZXMoMWUtMykgcmV0dXJuczogIiA8PCBtLmlzT25lcygxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPcnRob2dvbmFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT3J0aG9nb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyYWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT3J0aG9nb25hbC5jcHAKQEAgLTAsMCArMSw2IEBACitWZWN0b3IzZCB2KDEsMCwwKTsKK1ZlY3RvcjNkIHcoMWUtNCwwLDEpOworY291dCA8PCAiSGVyZSdzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSdzIHRoZSB2ZWN0b3IgdzoiIDw8IGVuZGwgPDwgdyA8PCBlbmRsOworY291dCA8PCAidi5pc09ydGhvZ29uYWwodykgcmV0dXJuczogIiA8PCB2LmlzT3J0aG9nb25hbCh3KSA8PCBlbmRsOworY291dCA8PCAidi5pc09ydGhvZ29uYWwodywxZS0zKSByZXR1cm5zOiAiIDw8IHYuaXNPcnRob2dvbmFsKHcsMWUtMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzVW5pdGFyeS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1VuaXRhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzdkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1VuaXRhcnkuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpOworbSgwLDIpID0gMWUtNDsKK2NvdXQgPDwgIkhlcmUncyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIm0uaXNVbml0YXJ5KCkgcmV0dXJuczogIiA8PCBtLmlzVW5pdGFyeSgpIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzVW5pdGFyeSgxZS0zKSByZXR1cm5zOiAiIDw8IG0uaXNVbml0YXJ5KDFlLTMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1plcm8uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNaZXJvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmNmZTIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNaZXJvLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6WmVybygpOworbSgwLDIpID0gMWUtNDsKK2NvdXQgPDwgIkhlcmUncyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIm0uaXNaZXJvKCkgcmV0dXJuczogIiA8PCBtLmlzWmVybygpIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzWmVybygxZS0zKSByZXR1cm5zOiAiIDw8IG0uaXNaZXJvKDFlLTMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9sZWZ0Q29sc19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfbGVmdENvbHNfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE5ODRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfbGVmdENvbHNfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK0FycmF5NDRpIGEgPSBBcnJheTQ0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhcnJheSBhOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEubGVmdENvbHMoMik6IiA8PCBlbmRsOworY291dCA8PCBhLmxlZnRDb2xzKDIpIDw8IGVuZGw7CithLmxlZnRDb2xzKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgYXJyYXkgYSBpczoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ub2FsaWFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU0YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgyZCBhLCBiLCBjOyBhIDw8IDEsMiwzLDQ7IGIgPDwgNSw2LDcsODsKK2Mubm9hbGlhcygpID0gYSAqIGI7IC8vIHRoaXMgY29tcHV0ZXMgdGhlIHByb2R1Y3QgZGlyZWN0bHkgdG8gYworY291dCA8PCBjIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzc2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzLmNwcApAQCAtMCwwICsxLDIgQEAKK2NvdXQgPDwgTWF0cml4MmQ6Ok9uZXMoKSA8PCBlbmRsOworY291dCA8PCA2ICogUm93VmVjdG9yNGk6Ok9uZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjE4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzX2ludC5jcHAKQEAgLTAsMCArMSwyIEBACitjb3V0IDw8IDYgKiBSb3dWZWN0b3JYaTo6T25lcyg0KSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZjo6T25lcygyKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmNWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXhYaTo6T25lcygyLDMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vcGVyYXRvck5vcm0uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUyNDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworY291dCA8PCAiVGhlIG9wZXJhdG9yIG5vcm0gb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpcyAiCisgICAgIDw8IG9uZXMub3BlcmF0b3JOb3JtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Byb2QuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcHJvZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmMjdiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Byb2QuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBwcm9kdWN0IG9mIGFsbCB0aGUgY29lZmZpY2llbnRzOiIgPDwgZW5kbCA8PCBtLnByb2QoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYzUyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbS5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCAxMDAgKiBNYXRyaXgyaTo6UmFuZG9tKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbV9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2MWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbV9pbnQuY3BwCkBAIC0wLDAgKzEgQEAKK2NvdXQgPDwgVmVjdG9yWGk6OlJhbmRvbSgyKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXhYaTo6UmFuZG9tKDIsMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTUyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGUuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMiwzKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLnJlcGxpY2F0ZTwzLDI+KCkgPSAuLi4iIDw8IGVuZGw7Citjb3V0IDw8IG0ucmVwbGljYXRlPDMsMj4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGJjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGVfaW50X2ludC5jcHAKQEAgLTAsMCArMSw0IEBACitWZWN0b3IzaSB2ID0gVmVjdG9yM2k6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIHY6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKK2NvdXQgPDwgInYucmVwbGljYXRlKDIsNSkgPSAuLi4iIDw8IGVuZGw7Citjb3V0IDw8IHYucmVwbGljYXRlKDIsNSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JldmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmV2ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0NWEyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JldmVyc2UuY3BwCkBAIC0wLDAgKzEsOCBAQAorTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMyw0KTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0ucmV2ZXJzZSgpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgcmV2ZXJzZSBvZiBtOiIgPDwgZW5kbAorICAgICA8PCBtLnJldmVyc2UoKSgxLDApIDw8IGVuZGw7Citjb3V0IDw8ICJMZXQgdXMgb3ZlcndyaXRlIHRoaXMgY29lZmZpY2llbnQgd2l0aCB0aGUgdmFsdWUgNC4iIDw8IGVuZGw7CittLnJldmVyc2UoKSgxLDApID0gNDsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JpZ2h0Q29sc19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmlnaHRDb2xzX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JpZ2h0Q29sc19pbnQuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS5yaWdodENvbHMoMik6IiA8PCBlbmRsOworY291dCA8PCBhLnJpZ2h0Q29scygyKSA8PCBlbmRsOworYS5yaWdodENvbHMoMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3cuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfcm93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVlNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfcm93LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKK20ucm93KDEpID0gVmVjdG9yM2QoNCw1LDYpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3d3aXNlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvd3dpc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTM5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3d3aXNlLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgc3VtIG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLnJvd3dpc2UoKS5zdW0oKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIHJvdzoiCisgICAgIDw8IGVuZGwgPDwgbS5jd2lzZUFicygpLnJvd3dpc2UoKS5tYXhDb2VmZigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWdtZW50X2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2VnbWVudF9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNkNmQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2VnbWVudF9pbnRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LnNlZ21lbnQoMSwgMik6IiA8PCBlbmRsIDw8IHYuc2VnbWVudCgxLCAyKSA8PCBlbmRsOwordi5zZWdtZW50KDEsIDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGVjdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWxlY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWxlY3QuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4WGkgbSgzLCAzKTsKK20gPDwgMSwgMiwgMywKKyAgICAgNCwgNSwgNiwKKyAgICAgNywgOCwgOTsKK20gPSAobS5hcnJheSgpID49IDUpLnNlbGVjdCgtbSwgbSk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGZhZGpvaW50Vmlldy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWxmYWRqb2ludFZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDNjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWxmYWRqb2ludFZpZXcuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4M2kgbSA9IE1hdHJpeDNpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBzeW1tZXRyaWMgbWF0cml4IGV4dHJhY3RlZCBmcm9tIHRoZSB1cHBlciBwYXJ0IG9mIG06IiA8PCBlbmRsCisgICAgIDw8IE1hdHJpeDNpKG0uc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgc3ltbWV0cmljIG1hdHJpeCBleHRyYWN0ZWQgZnJvbSB0aGUgbG93ZXIgcGFydCBvZiBtOiIgPDwgZW5kbAorICAgICA8PCBNYXRyaXgzaShtLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWNmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXQuY3BwCkBAIC0wLDAgKzEsMTMgQEAKK01hdHJpeDNpIG0xOworbTEgPDwgMSwgMiwgMywKKyAgICAgIDQsIDUsIDYsCisgICAgICA3LCA4LCA5OworY291dCA8PCBtMSA8PCBlbmRsIDw8IGVuZGw7CitNYXRyaXgzaSBtMiA9IE1hdHJpeDNpOjpJZGVudGl0eSgpOworbTIuYmxvY2soMCwwLCAyLDIpIDw8IDEwLCAxMSwgMTIsIDEzOworY291dCA8PCBtMiA8PCBlbmRsIDw8IGVuZGw7CitWZWN0b3IyaSB2MTsKK3YxIDw8IDE0LCAxNTsKK20yIDw8IHYxLnRyYW5zcG9zZSgpLCAxNiwKKyAgICAgIHYxLCBtMS5ibG9jaygxLDEsMiwyKTsKK2NvdXQgPDwgbTIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldElkZW50aXR5LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldElkZW50aXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQwYWEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpaZXJvKCk7CittLmJsb2NrPDMsMz4oMSwwKS5zZXRJZGVudGl0eSgpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRPbmVzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldE9uZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWY5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRPbmVzLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CittLnJvdygxKS5zZXRPbmVzKCk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldFJhbmRvbS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRSYW5kb20uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzI1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRSYW5kb20uY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpaZXJvKCk7CittLmNvbCgxKS5zZXRSYW5kb20oKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0WmVyby5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRaZXJvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjViOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0WmVyby5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworbS5yb3coMSkuc2V0WmVybygpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zdGFydF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc3RhcnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjYxZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc3RhcnRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LmhlYWQoMik6IiA8PCBlbmRsIDw8IHYuaGVhZCgyKSA8PCBlbmRsOwordi5oZWFkKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9ib3R0b21Sb3dzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9ib3R0b21Sb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVhODkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2JvdHRvbVJvd3MuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS5ib3R0b21Sb3dzPDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBhLmJvdHRvbVJvd3M8Mj4oKSA8PCBlbmRsOworYS5ib3R0b21Sb3dzPDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfZW5kLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9lbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2NiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfZW5kLmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LnRhaWwoMik6IiA8PCBlbmRsIDw8IHYudGFpbDwyPigpIDw8IGVuZGw7Cit2LnRhaWw8Mj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIHZlY3RvciB2IGlzOiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2Jsb2NrX2ludF9pbnRfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2Jsb2NrX2ludF9pbnRfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjZWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgYmxvY2s6IiA8PCBlbmRsIDw8IG0uYmxvY2s8MiwgRHluYW1pYz4oMSwgMSwgMiwgMykgPDwgZW5kbDsKK20uYmxvY2s8MiwgRHluYW1pYz4oMSwgMSwgMiwgMykuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3ODkyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lci5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21MZWZ0Q29ybmVyPDIsMj4oKToiIDw8IGVuZGw7Citjb3V0IDw8IG0uYm90dG9tTGVmdENvcm5lcjwyLDI+KCkgPDwgZW5kbDsKK20uYm90dG9tTGVmdENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWRjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21MZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKToiIDw8IGVuZGw7Citjb3V0IDw8IG0uYm90dG9tTGVmdENvcm5lcjwyLER5bmFtaWM+KDIsMikgPDwgZW5kbDsKK20uYm90dG9tTGVmdENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbVJpZ2h0Q29ybmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21SaWdodENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOworbS5ib3R0b21SaWdodENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1NTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21SaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMik6IiA8PCBlbmRsOworY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOworbS5ib3R0b21SaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5OWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BMZWZ0Q29ybmVyPDIsMj4oKToiIDw8IGVuZGw7Citjb3V0IDw8IG0udG9wTGVmdENvcm5lcjwyLDI+KCkgPDwgZW5kbDsKK20udG9wTGVmdENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzc2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BMZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKToiIDw8IGVuZGw7Citjb3V0IDw8IG0udG9wTGVmdENvcm5lcjwyLER5bmFtaWM+KDIsMikgPDwgZW5kbDsKK20udG9wTGVmdENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcFJpZ2h0Q29ybmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2ExNzcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BSaWdodENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOworbS50b3BSaWdodENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BSaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMik6IiA8PCBlbmRsOworY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOworbS50b3BSaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2xlZnRDb2xzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9sZWZ0Q29scy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MjVkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9sZWZ0Q29scy5jcHAKQEAgLTAsMCArMSw2IEBACitBcnJheTQ0aSBhID0gQXJyYXk0NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBhLmxlZnRDb2xzPDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBhLmxlZnRDb2xzPDI+KCkgPDwgZW5kbDsKK2EubGVmdENvbHM8Mj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIGFycmF5IGEgaXM6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9yaWdodENvbHMuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3JpZ2h0Q29scy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4YzBkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9yaWdodENvbHMuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS5yaWdodENvbHM8Mj4oKToiIDw8IGVuZGw7Citjb3V0IDw8IGEucmlnaHRDb2xzPDI+KCkgPDwgZW5kbDsKK2EucmlnaHRDb2xzPDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc2VnbWVudC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc2VnbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0OGI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9zZWdtZW50LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LnNlZ21lbnQ8Mj4oMSk6IiA8PCBlbmRsIDw8IHYuc2VnbWVudDwyPigxKSA8PCBlbmRsOwordi5zZWdtZW50PDI+KDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9zdGFydC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzZiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorUm93VmVjdG9yNGkgdiA9IFJvd1ZlY3RvcjRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHYuaGVhZCgyKToiIDw8IGVuZGwgPDwgdi5oZWFkPDI+KCkgPDwgZW5kbDsKK3YuaGVhZDwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF90b3BSb3dzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF90b3BSb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEwMjUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3RvcFJvd3MuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS50b3BSb3dzPDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBhLnRvcFJvd3M8Mj4oKSA8PCBlbmRsOworYS50b3BSb3dzPDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BMZWZ0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wTGVmdENvcm5lcl9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJjYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wTGVmdENvcm5lcl9pbnRfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBtLnRvcExlZnRDb3JuZXIoMiwgMik6IiA8PCBlbmRsOworY291dCA8PCBtLnRvcExlZnRDb3JuZXIoMiwgMikgPDwgZW5kbDsKK20udG9wTGVmdENvcm5lcigyLCAyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RvcFJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWZhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBtLnRvcFJpZ2h0Q29ybmVyKDIsIDIpOiIgPDwgZW5kbDsKK2NvdXQgPDwgbS50b3BSaWdodENvcm5lcigyLCAyKSA8PCBlbmRsOworbS50b3BSaWdodENvcm5lcigyLCAyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSb3dzX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSb3dzX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkNzVmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RvcFJvd3NfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK0FycmF5NDRpIGEgPSBBcnJheTQ0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhcnJheSBhOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEudG9wUm93cygyKToiIDw8IGVuZGw7Citjb3V0IDw8IGEudG9wUm93cygyKSA8PCBlbmRsOworYS50b3BSb3dzKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgYXJyYXkgYSBpczoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdHJhbnNwb3NlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXgyaSBtID0gTWF0cml4Mmk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHRyYW5zcG9zZSBvZiBtOiIgPDwgZW5kbCA8PCBtLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgdHJhbnNwb3NlIG9mIG06IiA8PCBlbmRsCisgICAgIDw8IG0udHJhbnNwb3NlKCkoMSwwKSA8PCBlbmRsOworY291dCA8PCAiTGV0IHVzIG92ZXJ3cml0ZSB0aGlzIGNvZWZmaWNpZW50IHdpdGggdGhlIHZhbHVlIDAuIiA8PCBlbmRsOworbS50cmFuc3Bvc2UoKSgxLDApID0gMDsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyaWFuZ3VsYXJWaWV3LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyaWFuZ3VsYXJWaWV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2FhMzAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdHJpYW5ndWxhclZpZXcuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4M2kgbSA9IE1hdHJpeDNpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB1cHBlci10cmlhbmd1bGFyIG1hdHJpeCBleHRyYWN0ZWQgZnJvbSBtOiIgPDwgZW5kbAorICAgICA8PCBNYXRyaXgzaShtLnRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHN0cmljdGx5LXVwcGVyLXRyaWFuZ3VsYXIgbWF0cml4IGV4dHJhY3RlZCBmcm9tIG06IiA8PCBlbmRsCisgICAgIDw8IE1hdHJpeDNpKG0udHJpYW5ndWxhclZpZXc8RWlnZW46OlN0cmljdGx5VXBwZXI+KCkpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB1bml0LWxvd2VyLXRyaWFuZ3VsYXIgbWF0cml4IGV4dHJhY3RlZCBmcm9tIG06IiA8PCBlbmRsCisgICAgIDw8IE1hdHJpeDNpKG0udHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRMb3dlcj4oKSkgPDwgZW5kbDsKKy8vIEZJWE1FIG5lZWQgdG8gaW1wbGVtZW50IG91dHB1dCBmb3IgdHJpYW5ndWxhclZpZXdzIChCdWcgODg1KQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyby5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY0OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyby5jcHAKQEAgLTAsMCArMSwyIEBACitjb3V0IDw8IE1hdHJpeDJkOjpaZXJvKCkgPDwgZW5kbDsKK2NvdXQgPDwgUm93VmVjdG9yNGk6Olplcm8oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyb19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyb19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MGE5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludC5jcHAKQEAgLTAsMCArMSwyIEBACitjb3V0IDw8IFJvd1ZlY3RvclhpOjpaZXJvKDQpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhmOjpaZXJvKDIpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyb19pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDk5YzVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyb19pbnRfaW50LmNwcApAQCAtMCwwICsxIEBACitjb3V0IDw8IE1hdHJpeFhpOjpaZXJvKDIsMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9Ob0NoYW5nZV9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGYxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9Ob0NoYW5nZV9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGQgbSgzLDQpOworbS5yZXNpemUoTm9DaGFuZ2UsIDUpOworY291dCA8PCAibTogIiA8PCBtLnJvd3MoKSA8PCAiIHJvd3MsICIgPDwgbS5jb2xzKCkgPDwgIiBjb2xzIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0Yzc4OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitWZWN0b3JYZCB2KDEwKTsKK3YucmVzaXplKDMpOworUm93VmVjdG9yM2QgdzsKK3cucmVzaXplKDMpOyAvLyB0aGlzIGlzIGxlZ2FsLCBidXQgaGFzIG5vIGVmZmVjdAorY291dCA8PCAidjogIiA8PCB2LnJvd3MoKSA8PCAiIHJvd3MsICIgPDwgdi5jb2xzKCkgPDwgIiBjb2xzIiA8PCBlbmRsOworY291dCA8PCAidzogIiA8PCB3LnJvd3MoKSA8PCAiIHJvd3MsICIgPDwgdy5jb2xzKCkgPDwgIiBjb2xzIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X05vQ2hhbmdlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9Ob0NoYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzN2M5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9Ob0NoYW5nZS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXhYZCBtKDMsNCk7CittLnJlc2l6ZSg1LCBOb0NoYW5nZSk7Citjb3V0IDw8ICJtOiAiIDw8IG0ucm93cygpIDw8ICIgcm93cywgIiA8PCBtLmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDQ3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeFhkIG0oMiwzKTsKK20gPDwgMSwyLDMsNCw1LDY7Citjb3V0IDw8ICJoZXJlJ3MgdGhlIDJ4MyBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAibGV0J3MgcmVzaXplIG0gdG8gM3gyLiBUaGlzIGlzIGEgY29uc2VydmF0aXZlIHJlc2l6aW5nIGJlY2F1c2UgMiozPT0zKjIuIiA8PCBlbmRsOworbS5yZXNpemUoMywyKTsKK2NvdXQgPDwgImhlcmUncyB0aGUgM3gyIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJub3cgbGV0J3MgcmVzaXplIG0gdG8gc2l6ZSAyeDIuIFRoaXMgaXMgTk9UIGEgY29uc2VydmF0aXZlIHJlc2l6aW5nLCBzbyBpdCBiZWNvbWVzIHVuaW5pdGlhbGl6ZWQ6IiA8PCBlbmRsOworbS5yZXNpemUoMiwyKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRDb25zdGFudF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRDb25zdGFudF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWE4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldENvbnN0YW50X2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRDb25zdGFudCgzLCA1KTsKK2NvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRDb25zdGFudF9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiOTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXhYZiBtOworbS5zZXRDb25zdGFudCgzLCAzLCA1KTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRJZGVudGl0eV9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0SWRlbnRpdHlfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1OTY3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0SWRlbnRpdHlfaW50X2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXhYZiBtOworbS5zZXRJZGVudGl0eSgzLCAzKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRPbmVzX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldE9uZXNfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJjYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRPbmVzX2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRPbmVzKDMpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldE9uZXNfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldE9uZXNfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmYjY2YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0T25lc19pbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhmIG07CittLnNldE9uZXMoMywgMyk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFJhbmRvbV9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjBkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFJhbmRvbV9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorVmVjdG9yWGYgdjsKK3Yuc2V0UmFuZG9tKDMpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldFJhbmRvbV9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwY2RhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFJhbmRvbV9pbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhmIG07CittLnNldFJhbmRvbSgzLCAzKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRaZXJvX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFplcm9faW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmIxNmMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRaZXJvX2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRaZXJvKDMpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldFplcm9faW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFplcm9faW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ODNiOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0WmVyb19pbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhmIG07CittLnNldFplcm8oMywgMyk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUGl2TFVfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxQaXZMVV9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzNTcwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUGl2TFVfc29sdmUuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKK01hdHJpeFhkIEIgPSBNYXRyaXhYZDo6UmFuZG9tKDMsMik7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBpbnZlcnRpYmxlIG1hdHJpeCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQjoiIDw8IGVuZGwgPDwgQiA8PCBlbmRsOworTWF0cml4WGQgWCA9IEEubHUoKS5zb2x2ZShCKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlICh1bmlxdWUpIHNvbHV0aW9uIFggdG8gdGhlIGVxdWF0aW9uIEFYPUI6IiA8PCBlbmRsIDw8IFggPDwgZW5kbDsKK2NvdXQgPDwgIlJlbGF0aXZlIGVycm9yOiAiIDw8IChBKlgtQikubm9ybSgpIC8gQi5ub3JtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfY291bnQuY3BwIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9jb3VudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzYjNhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfY291bnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitNYXRyaXg8cHRyZGlmZl90LCAzLCAxPiByZXMgPSAobS5hcnJheSgpID49IDAuNSkucm93d2lzZSgpLmNvdW50KCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb3VudCBvZiBlbGVtZW50cyBsYXJnZXIgb3IgZXF1YWwgdGhhbiAwLjUgb2YgZWFjaCByb3c6IiA8PCBlbmRsOworY291dCA8PCByZXMgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbWF4Q29lZmYuY3BwIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9tYXhDb2VmZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmZDM4MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbWF4Q29lZmYuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXhpbXVtIG9mIGVhY2ggY29sdW1uOiIgPDwgZW5kbCA8PCBtLmNvbHdpc2UoKS5tYXhDb2VmZigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X21pbkNvZWZmLmNwcCBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbWluQ29lZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTdiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X21pbkNvZWZmLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWluaW11bSBvZiBlYWNoIGNvbHVtbjoiIDw8IGVuZGwgPDwgbS5jb2x3aXNlKCkubWluQ29lZmYoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9ub3JtLmNwcCBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZjI5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbm9ybS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG5vcm0gb2YgZWFjaCBjb2x1bW46IiA8PCBlbmRsIDw8IG0uY29sd2lzZSgpLm5vcm0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9wcm9kLmNwcCBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfcHJvZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjZjA5YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfcHJvZC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHByb2R1Y3Qgb2YgZWFjaCByb3c6IiA8PCBlbmRsIDw8IG0ucm93d2lzZSgpLnByb2QoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9zcXVhcmVkTm9ybS5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3NxdWFyZWROb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMyOTNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9zcXVhcmVkTm9ybS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHNxdWFyZSBub3JtIG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLnJvd3dpc2UoKS5zcXVhcmVkTm9ybSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3N1bS5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3N1bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MmQzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfc3VtLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgc3VtIG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLnJvd3dpc2UoKS5zdW0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1JlYWxRWl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9SZWFsUVpfY29tcHV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4ZGE0MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9SZWFsUVpfY29tcHV0ZS5jcHAKQEAgLTAsMCArMSwxNyBAQAorTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIEIgPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7CitSZWFsUVo8TWF0cml4WGY+IHF6KDQpOyAvLyBwcmVhbGxvY2F0ZSBzcGFjZSBmb3IgNHg0IG1hdHJpY2VzCitxei5jb21wdXRlKEEsQik7ICAvLyBBID0gUSBTIFosICBCID0gUSBUIFoKKworLy8gcHJpbnQgb3JpZ2luYWwgbWF0cmljZXMgYW5kIHJlc3VsdCBvZiBkZWNvbXBvc2l0aW9uCitjb3V0IDw8ICJBOlxuIiA8PCBBIDw8ICJcbiIgPDwgIkI6XG4iIDw8IEIgPDwgIlxuIjsKK2NvdXQgPDwgIlM6XG4iIDw8IHF6Lm1hdHJpeFMoKSA8PCAiXG4iIDw8ICJUOlxuIiA8PCBxei5tYXRyaXhUKCkgPDwgIlxuIjsKK2NvdXQgPDwgIlE6XG4iIDw8IHF6Lm1hdHJpeFEoKSA8PCAiXG4iIDw8ICJaOlxuIiA8PCBxei5tYXRyaXhaKCkgPDwgIlxuIjsKKworLy8gdmVyaWZ5IHByZWNpc2lvbgorY291dCA8PCAiXG5FcnJvcnM6IgorICA8PCAiXG58QS1RU1p8OiAiIDw8IChBLXF6Lm1hdHJpeFEoKSpxei5tYXRyaXhTKCkqcXoubWF0cml4WigpKS5ub3JtKCkKKyAgPDwgIiwgfEItUVRafDogIiA8PCAoQi1xei5tYXRyaXhRKCkqcXoubWF0cml4VCgpKnF6Lm1hdHJpeFooKSkubm9ybSgpCisgIDw8ICJcbnxRUSogLSBJfDogIiA8PCAocXoubWF0cml4USgpKnF6Lm1hdHJpeFEoKS5hZGpvaW50KCkgLSBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSkubm9ybSgpCisgIDw8ICIsIHxaWiogLSBJfDogIiA8PCAocXoubWF0cml4WigpKnF6Lm1hdHJpeFooKS5hZGpvaW50KCkgLSBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSkubm9ybSgpCisgIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUmVhbFNjaHVyX1JlYWxTY2h1cl9NYXRyaXhUeXBlLmNwcCBiL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTMwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUmVhbFNjaHVyX1JlYWxTY2h1cl9NYXRyaXhUeXBlLmNwcApAQCAtMCwwICsxLDEwIEBACitNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSg2LDYpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA2eDYgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworUmVhbFNjaHVyPE1hdHJpeFhkPiBzY2h1cihBKTsKK2NvdXQgPDwgIlRoZSBvcnRob2dvbmFsIG1hdHJpeCBVIGlzOiIgPDwgZW5kbCA8PCBzY2h1ci5tYXRyaXhVKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCBUIGlzOiIgPDwgZW5kbCA8PCBzY2h1ci5tYXRyaXhUKCkgPDwgZW5kbCA8PCBlbmRsOworCitNYXRyaXhYZCBVID0gc2NodXIubWF0cml4VSgpOworTWF0cml4WGQgVCA9IHNjaHVyLm1hdHJpeFQoKTsKK2NvdXQgPDwgIlUgKiBUICogVV5UID0gIiA8PCBlbmRsIDw8IFUgKiBUICogVS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfY29tcHV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjMjYxMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfY29tcHV0ZS5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworUmVhbFNjaHVyPE1hdHJpeFhmPiBzY2h1cig0KTsKK3NjaHVyLmNvbXB1dGUoQSwgLyogY29tcHV0ZVUgPSAqLyBmYWxzZSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQSBpczoiIDw8IGVuZGwgPDwgc2NodXIubWF0cml4VCgpIDw8IGVuZGw7CitzY2h1ci5jb21wdXRlKEEuaW52ZXJzZSgpLCAvKiBjb21wdXRlVSA9ICovIGZhbHNlKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbiBvZiBBXigtMSkgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlci5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E3ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlci5jcHAKQEAgLTAsMCArMSw3IEBACitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeDRmPiBlczsKK01hdHJpeDRmIFggPSBNYXRyaXg0Zjo6UmFuZG9tKDQsNCk7CitNYXRyaXg0ZiBBID0gWCArIFgudHJhbnNwb3NlKCk7Citlcy5jb21wdXRlKEEpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2VzLmNvbXB1dGUoQSArIE1hdHJpeDRmOjpJZGVudGl0eSg0LDQpKTsgLy8gcmUtdXNlIGVzIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgQStJCitjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQStJIGFyZTogIiA8PCBlcy5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk5YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcApAQCAtMCwwICsxLDE3IEBACitNYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNXg1IG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgbWF0cml4IG9mIGVpZ2VudmVjdG9ycywgViwgaXM6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmVjdG9ycygpIDw8IGVuZGwgPDwgZW5kbDsKKworZG91YmxlIGxhbWJkYSA9IGVzLmVpZ2VudmFsdWVzKClbMF07Citjb3V0IDw8ICJDb25zaWRlciB0aGUgZmlyc3QgZWlnZW52YWx1ZSwgbGFtYmRhID0gIiA8PCBsYW1iZGEgPDwgZW5kbDsKK1ZlY3RvclhkIHYgPSBlcy5laWdlbnZlY3RvcnMoKS5jb2woMCk7Citjb3V0IDw8ICJJZiB2IGlzIHRoZSBjb3JyZXNwb25kaW5nIGVpZ2VudmVjdG9yLCB0aGVuIGxhbWJkYSAqIHYgPSAiIDw8IGVuZGwgPDwgbGFtYmRhICogdiA8PCBlbmRsOworY291dCA8PCAiLi4uIGFuZCBBICogdiA9ICIgPDwgZW5kbCA8PCBBICogdiA8PCBlbmRsIDw8IGVuZGw7CisKK01hdHJpeFhkIEQgPSBlcy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKTsKK01hdHJpeFhkIFYgPSBlcy5laWdlbnZlY3RvcnMoKTsKK2NvdXQgPDwgIkZpbmFsbHksIFYgKiBEICogVl4oLTEpID0gIiA8PCBlbmRsIDw8IFYgKiBEICogVi5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZTIuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiODIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZTIuY3BwCkBAIC0wLDAgKzEsMTYgQEAKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBBID0gWCArIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK1ggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBCID0gWCAqIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJhbmQgYSByYW5kb20gcG9zdGl2ZS1kZWZpbml0ZSBtYXRyaXgsIEI6IiA8PCBlbmRsIDw8IEIgPDwgZW5kbCA8PCBlbmRsOworCitHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEsQik7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIHBlbmNpbCAoQSxCKSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBtYXRyaXggb2YgZWlnZW52ZWN0b3JzLCBWLCBpczoiIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkgPDwgZW5kbCA8PCBlbmRsOworCitkb3VibGUgbGFtYmRhID0gZXMuZWlnZW52YWx1ZXMoKVswXTsKK2NvdXQgPDwgIkNvbnNpZGVyIHRoZSBmaXJzdCBlaWdlbnZhbHVlLCBsYW1iZGEgPSAiIDw8IGxhbWJkYSA8PCBlbmRsOworVmVjdG9yWGQgdiA9IGVzLmVpZ2VudmVjdG9ycygpLmNvbCgwKTsKK2NvdXQgPDwgIklmIHYgaXMgdGhlIGNvcnJlc3BvbmRpbmcgZWlnZW52ZWN0b3IsIHRoZW4gQSAqIHYgPSAiIDw8IGVuZGwgPDwgQSAqIHYgPDwgZW5kbDsKK2NvdXQgPDwgIi4uLiBhbmQgbGFtYmRhICogQiAqIHYgPSAiIDw8IGVuZGwgPDwgbGFtYmRhICogQiAqIHYgPDwgZW5kbCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3NWNjMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZS5jcHAKQEAgLTAsMCArMSw3IEBACitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhmPiBlcyg0KTsKK01hdHJpeFhmIFggPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7CitNYXRyaXhYZiBBID0gWCArIFgudHJhbnNwb3NlKCk7Citlcy5jb21wdXRlKEEpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2VzLmNvbXB1dGUoQSArIE1hdHJpeFhmOjpJZGVudGl0eSg0LDQpKTsgLy8gcmUtdXNlIGVzIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgQStJCitjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQStJIGFyZTogIiA8PCBlcy5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzkyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBBID0gWCAqIFgudHJhbnNwb3NlKCk7CitYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgQiA9IFggKiBYLnRyYW5zcG9zZSgpOworCitHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEsQixFaWdlbnZhbHVlc09ubHkpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBwZW5jaWwgKEEsQikgYXJlOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7Citlcy5jb21wdXRlKEIsQSxmYWxzZSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIHBlbmNpbCAoQixBKSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmYzM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIAorICAgICA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzhiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzKTsKK2NvdXQgPDwgIlRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzOiIgCisgICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDEpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNGM2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0LmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDQsNCk7CitNYXRyaXhYZCBBID0gWCAqIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOworY291dCA8PCAiVGhlIGludmVyc2Ugc3F1YXJlIHJvb3Qgb2YgQSBpczogIiA8PCBlbmRsOworY291dCA8PCBlcy5vcGVyYXRvckludmVyc2VTcXJ0KCkgPDwgZW5kbDsKK2NvdXQgPDwgIldlIGNhbiBhbHNvIGNvbXB1dGUgaXQgd2l0aCBvcGVyYXRvclNxcnQoKSBhbmQgaW52ZXJzZSgpLiBUaGF0IHlpZWxkczogIiA8PCBlbmRsOworY291dCA8PCBlcy5vcGVyYXRvclNxcnQoKS5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9yU3FydC5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWNjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwCkBAIC0wLDAgKzEsOCBAQAorTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNCw0KTsKK01hdHJpeFhkIEEgPSBYICogWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gcG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSk7CitNYXRyaXhYZCBzcXJ0QSA9IGVzLm9wZXJhdG9yU3FydCgpOworY291dCA8PCAiVGhlIHNxdWFyZSByb290IG9mIEEgaXM6ICIgPDwgZW5kbCA8PCBzcXJ0QSA8PCBlbmRsOworY291dCA8PCAiSWYgd2Ugc3F1YXJlIHRoaXMsIHdlIGdldDogIiA8PCBlbmRsIDw8IHNxcnRBKnNxcnRBIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRWaWV3X2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTk4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRWaWV3X2VpZ2VudmFsdWVzLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworVmVjdG9yWGQgZWl2YWxzID0gb25lcy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIDw8IGVuZGwgPDwgZWl2YWxzIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRWaWV3X29wZXJhdG9yTm9ybS5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRWaWV3X29wZXJhdG9yTm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4MGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworY291dCA8PCAiVGhlIG9wZXJhdG9yIG5vcm0gb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpcyAiCisgICAgIDw8IG9uZXMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLm9wZXJhdG9yTm9ybSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU3BhcnNlTWF0cml4X2NvZWZmcy5jcHAgYi9kb2Mvc25pcHBldHMvU3BhcnNlTWF0cml4X2NvZWZmcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxYTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TcGFyc2VNYXRyaXhfY29lZmZzLmNwcApAQCAtMCwwICsxLDkgQEAKK1NwYXJzZU1hdHJpeDxkb3VibGU+IEEoMywzKTsKK0EuaW5zZXJ0KDEsMikgPSAwOworQS5pbnNlcnQoMCwxKSA9IDE7CitBLmluc2VydCgyLDApID0gMjsKK0EubWFrZUNvbXByZXNzZWQoKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggQSBpczoiIDw8IGVuZGwgPDwgTWF0cml4WGQoQSkgPDwgZW5kbDsKK2NvdXQgPDwgIml0IGhhcyAiIDw8IEEubm9uWmVyb3MoKSA8PCAiIHN0b3JlZCBub24gemVybyBjb2VmZmljaWVudHMgdGhhdCBhcmU6ICIgPDwgQS5jb2VmZnMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworQS5jb2VmZnMoKSArPSAxMDsKK2NvdXQgPDwgIkFmdGVyIGFkZGluZyAxMCB0byBldmVyeSBzdG9yZWQgbm9uIHplcm8gY29lZmZpY2llbnQsIHRoZSBtYXRyaXggQSBpczoiIDw8IGVuZGwgPDwgTWF0cml4WGQoQSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI4MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfYmxvY2suY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbWF0KDMsMyk7IAorbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG1hdDpcbiIgPDwgbWF0IDw8IGVuZGw7CisKKy8vIFRoaXMgYXNzaWdubWVudCBzaG93cyB0aGUgYWxpYXNpbmcgcHJvYmxlbQorbWF0LmJvdHRvbVJpZ2h0Q29ybmVyKDIsMikgPSBtYXQudG9wTGVmdENvcm5lcigyLDIpOworY291dCA8PCAiQWZ0ZXIgdGhlIGFzc2lnbm1lbnQsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfYmxvY2tfY29ycmVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbWF0KDMsMyk7IAorbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG1hdDpcbiIgPDwgbWF0IDw8IGVuZGw7CisKKy8vIFRoZSBldmFsKCkgc29sdmVzIHRoZSBhbGlhc2luZyBwcm9ibGVtCittYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwyKSA9IG1hdC50b3BMZWZ0Q29ybmVyKDIsMikuZXZhbCgpOworY291dCA8PCAiQWZ0ZXIgdGhlIGFzc2lnbm1lbnQsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2N3aXNlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2N3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ5ZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfY3dpc2UuY3BwCkBAIC0wLDAgKzEsMjAgQEAKK01hdHJpeFhmIG1hdCgyLDIpOyAKK21hdCA8PCAxLCAyLCAgNCwgNzsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtYXQ6XG4iIDw8IG1hdCA8PCBlbmRsIDw8IGVuZGw7CisKK21hdCA9IDIgKiBtYXQ7Citjb3V0IDw8ICJBZnRlciAnbWF0ID0gMiAqIG1hdCcsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbCA8PCBlbmRsOworCisKK21hdCA9IG1hdCAtIE1hdHJpeFhmOjpJZGVudGl0eSgyLDIpOworY291dCA8PCAiQWZ0ZXIgdGhlIHN1YnRyYWN0aW9uLCBpdCBiZWNvbWVzXG4iIDw8IG1hdCA8PCBlbmRsIDw8IGVuZGw7CisKKworQXJyYXlYWGYgYXJyID0gbWF0OworYXJyID0gYXJyLnNxdWFyZSgpOworY291dCA8PCAiQWZ0ZXIgc3F1YXJpbmcsIGl0IGJlY29tZXNcbiIgPDwgYXJyIDw8IGVuZGwgPDwgZW5kbDsKKworLy8gQ29tYmluaW5nIGFsbCBvcGVyYXRpb25zIGluIG9uZSBzdGF0ZW1lbnQ6CittYXQgPDwgMSwgMiwgIDQsIDc7CittYXQgPSAoMiAqIG1hdCAtIE1hdHJpeFhmOjpJZGVudGl0eSgyLDIpKS5hcnJheSgpLnNxdWFyZSgpOworY291dCA8PCAiRG9pbmcgZXZlcnl0aGluZyBhdCBvbmNlIHlpZWxkc1xuIiA8PCBtYXQgPDwgZW5kbCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2U5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0MS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZiBtYXRBKDIsMik7IAorbWF0QSA8PCAyLCAwLCAgMCwgMjsKK21hdEEgPSBtYXRBICogbWF0QTsKK2NvdXQgPDwgbWF0QTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQyLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZmNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDIuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeFhmIG1hdEEoMiwyKSwgbWF0QigyLDIpOyAKK21hdEEgPDwgMiwgMCwgIDAsIDI7CisKKy8vIFNpbXBsZSBidXQgbm90IHF1aXRlIGFzIGVmZmljaWVudAorbWF0QiA9IG1hdEEgKiBtYXRBOworY291dCA8PCBtYXRCIDw8IGVuZGwgPDwgZW5kbDsKKworLy8gTW9yZSBjb21wbGljYXRlZCBidXQgYWxzbyBtb3JlIGVmZmljaWVudAorbWF0Qi5ub2FsaWFzKCkgPSBtYXRBICogbWF0QTsKK2NvdXQgPDwgbWF0QjsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDEyYTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGYgbWF0QSgyLDIpOyAKK21hdEEgPDwgMiwgMCwgIDAsIDI7CittYXRBLm5vYWxpYXMoKSA9IG1hdEEgKiBtYXRBOworY291dCA8PCBtYXRBOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDQuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODk5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0NC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXhYZiBBKDIsMiksIEIoMywyKTsKK0IgPDwgMiwgMCwgIDAsIDMsIDEsIDE7CitBIDw8IDIsIDAsIDAsIC0yOworQSA9IChCICogQSkuY3dpc2VBYnMoKTsKK2NvdXQgPDwgQTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0NS5jcHAgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0NS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzNmRlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQ1LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeFhmIEEoMiwyKSwgQigzLDIpOworQiA8PCAyLCAwLCAgMCwgMywgMSwgMTsKK0EgPDwgMiwgMCwgMCwgLTI7CitBID0gKEIgKiBBKS5ldmFsKCkuY3dpc2VBYnMoKTsKK2NvdXQgPDwgQTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5jcHAgYi9kb2Mvc25pcHBldHMvVG9waWNTdG9yYWdlT3JkZXJzX2V4YW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjNlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNTdG9yYWdlT3JkZXJzX2V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTggQEAKK01hdHJpeDxpbnQsIDMsIDQsIENvbE1ham9yPiBBY29sbWFqb3I7CitBY29sbWFqb3IgPDwgOCwgMiwgMiwgOSwKKyAgICAgICAgICAgICA5LCAxLCA0LCA0LAorCSAgICAgMywgNSwgNCwgNTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggQToiIDw8IGVuZGw7Citjb3V0IDw8IEFjb2xtYWpvciA8PCBlbmRsIDw8IGVuZGw7IAorCitjb3V0IDw8ICJJbiBtZW1vcnkgKGNvbHVtbi1tYWpvcik6IiA8PCBlbmRsOworZm9yIChpbnQgaSA9IDA7IGkgPCBBY29sbWFqb3Iuc2l6ZSgpOyBpKyspCisgIGNvdXQgPDwgKihBY29sbWFqb3IuZGF0YSgpICsgaSkgPDwgIiAgIjsKK2NvdXQgPDwgZW5kbCA8PCBlbmRsOworCitNYXRyaXg8aW50LCAzLCA0LCBSb3dNYWpvcj4gQXJvd21ham9yID0gQWNvbG1ham9yOworY291dCA8PCAiSW4gbWVtb3J5IChyb3ctbWFqb3IpOiIgPDwgZW5kbDsKK2ZvciAoaW50IGkgPSAwOyBpIDwgQXJvd21ham9yLnNpemUoKTsgaSsrKQorICBjb3V0IDw8ICooQXJvd21ham9yLmRhdGEoKSArIGkpIDw8ICIgICI7Citjb3V0IDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ucmlhbmd1bGFyX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ucmlhbmd1bGFyX3NvbHZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg0NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWFuZ3VsYXJfc29sdmUuY3BwCkBAIC0wLDAgKzEsMTEgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6WmVybygpOworbS50cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkuc2V0T25lcygpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgZW5kbDsKK01hdHJpeDNkIG4gPSBNYXRyaXgzZDo6T25lcygpOworbi50cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKj0gMjsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBuOlxuIiA8PCBuIDw8IGVuZGw7Citjb3V0IDw8ICJBbmQgbm93IGhlcmUgaXMgbS5pbnZlcnNlKCkqbiwgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IgorICAgICAgICAiIG0gaXMgdXBwZXItdHJpYW5ndWxhcjpcbiIKKyAgICAgPDwgbS50cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkuc29sdmUobikgPDwgZW5kbDsKK2NvdXQgPDwgIkFuZCB0aGlzIGlzIG4qbS5pbnZlcnNlKCk6XG4iCisgICAgIDw8IG0udHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpLnNvbHZlPEVpZ2VuOjpPblRoZVJpZ2h0PihuKTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fVHJpZGlhZ29uYWxpemF0aW9uX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDEyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fVHJpZGlhZ29uYWxpemF0aW9uX01hdHJpeFR5cGUuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gc3ltbWV0cmljIDV4NSBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFhkPiB0cmlPZkEoQSk7CitNYXRyaXhYZCBRID0gdHJpT2ZBLm1hdHJpeFEoKTsKK2NvdXQgPDwgIlRoZSBvcnRob2dvbmFsIG1hdHJpeCBRIGlzOiIgPDwgZW5kbCA8PCBRIDw8IGVuZGw7CitNYXRyaXhYZCBUID0gdHJpT2ZBLm1hdHJpeFQoKTsKK2NvdXQgPDwgIlRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpczoiIDw8IGVuZGwgPDwgVCA8PCBlbmRsIDw8IGVuZGw7Citjb3V0IDw8ICJRICogVCAqIFFeVCA9ICIgPDwgZW5kbCA8PCBRICogVCAqIFEudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fY29tcHV0ZS5jcHAgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2NvbXB1dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjJhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2NvbXB1dGUuY3BwCkBAIC0wLDAgKzEsOSBAQAorVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFhmPiB0cmk7CitNYXRyaXhYZiBYID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworTWF0cml4WGYgQSA9IFggKyBYLnRyYW5zcG9zZSgpOwordHJpLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgQSBpczogIiA8PCBlbmRsOworY291dCA8PCB0cmkubWF0cml4VCgpIDw8IGVuZGw7Cit0cmkuY29tcHV0ZSgyKkEpOyAvLyByZS11c2UgdHJpIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgMkEKK2NvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiAyQSBpczogIiA8PCBlbmRsOworY291dCA8PCB0cmkubWF0cml4VCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kZWNvbXBvc2VJblBsYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RjZmNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kZWNvbXBvc2VJblBsYWNlLmNwcApAQCAtMCwwICsxLDEwIEBACitNYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNXg1IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK1ZlY3RvclhkIGRpYWcoNSk7CitWZWN0b3JYZCBzdWJkaWFnKDQpOworaW50ZXJuYWw6OnRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlKEEsIGRpYWcsIHN1YmRpYWcsIHRydWUpOworY291dCA8PCAiVGhlIG9ydGhvZ29uYWwgbWF0cml4IFEgaXM6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBkaWFnb25hbCBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaXM6IiA8PCBlbmRsIDw8IGRpYWcgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBzdWJkaWFnb25hbCBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaXM6IiA8PCBlbmRsIDw8IHN1YmRpYWcgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fZGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fZGlhZ29uYWwuY3BwCkBAIC0wLDAgKzEsMTMgQEAKK01hdHJpeFhjZCBYID0gTWF0cml4WGNkOjpSYW5kb20oNCw0KTsKK01hdHJpeFhjZCBBID0gWCArIFguYWRqb2ludCgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzZWxmLWFkam9pbnQgNHg0IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CisKK1RyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhYY2Q+IHRyaU9mQShBKTsKK01hdHJpeFhkIFQgPSB0cmlPZkEubWF0cml4VCgpOworY291dCA8PCAiVGhlIHRyaWRpYWdvbmFsIG1hdHJpeCBUIGlzOiIgPDwgZW5kbCA8PCBUIDw8IGVuZGwgPDwgZW5kbDsKKworY291dCA8PCAiV2UgY2FuIGFsc28gZXh0cmFjdCB0aGUgZGlhZ29uYWxzIG9mIFQgZGlyZWN0bHkgLi4uIiA8PCBlbmRsOworVmVjdG9yWGQgZGlhZyA9IHRyaU9mQS5kaWFnb25hbCgpOworY291dCA8PCAiVGhlIGRpYWdvbmFsIGlzOiIgPDwgZW5kbCA8PCBkaWFnIDw8IGVuZGw7IAorVmVjdG9yWGQgc3ViZGlhZyA9IHRyaU9mQS5zdWJEaWFnb25hbCgpOworY291dCA8PCAiVGhlIHN1YmRpYWdvbmFsIGlzOiIgPDwgZW5kbCA8PCBzdWJkaWFnIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2hvdXNlaG9sZGVyQ29lZmZpY2llbnRzLmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25faG91c2Vob2xkZXJDb2VmZmljaWVudHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDg3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2hvdXNlaG9sZGVyQ29lZmZpY2llbnRzLmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeDRkIFggPSBNYXRyaXg0ZDo6UmFuZG9tKDQsNCk7CitNYXRyaXg0ZCBBID0gWCArIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA0eDQgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CitUcmlkaWFnb25hbGl6YXRpb248TWF0cml4NGQ+IHRyaU9mQShBKTsKK1ZlY3RvcjNkIGhjID0gdHJpT2ZBLmhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCk7Citjb3V0IDw8ICJUaGUgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cyBpczoiIDw8IGVuZGwgPDwgaGMgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fcGFja2VkTWF0cml4LmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fcGFja2VkTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU1ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXguY3BwCkBAIC0wLDAgKzEsOCBAQAorTWF0cml4NGQgWCA9IE1hdHJpeDRkOjpSYW5kb20oNCw0KTsKK01hdHJpeDRkIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gc3ltbWV0cmljIDR4NCBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK1RyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXg0ZD4gdHJpT2ZBKEEpOworTWF0cml4NGQgcG0gPSB0cmlPZkEucGFja2VkTWF0cml4KCk7Citjb3V0IDw8ICJUaGUgcGFja2VkIG1hdHJpeCBNIGlzOiIgPDwgZW5kbCA8PCBwbSA8PCBlbmRsOworY291dCA8PCAiVGhlIGRpYWdvbmFsIGFuZCBzdWJkaWFnb25hbCBjb3JyZXNwb25kcyB0byB0aGUgbWF0cml4IFQsIHdoaWNoIGlzOiIgCisgICAgIDw8IGVuZGwgPDwgdHJpT2ZBLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQmxvY2suY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTQwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXhYZiBtYXRBKDIsIDIpOworbWF0QSA8PCAxLCAyLCAzLCA0OworTWF0cml4WGYgbWF0Qig0LCA0KTsKK21hdEIgPDwgbWF0QSwgbWF0QS8xMCwgbWF0QS8xMCwgbWF0QTsKK3N0ZDo6Y291dCA8PCBtYXRCIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0NvbW1hVGVtcG9yYXJ5LmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0NvbW1hVGVtcG9yYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGYgbWF0ID0gTWF0cml4WGY6OlJhbmRvbSgyLCAzKTsKK3N0ZDo6Y291dCA8PCBtYXQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK21hdCA9IChNYXRyaXhYZigyLDIpIDw8IDAsIDEsIDEsIDApLmZpbmlzaGVkKCkgKiBtYXQ7CitzdGQ6OmNvdXQgPDwgbWF0IDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0pvaW4uY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fSm9pbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhMjE1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0pvaW4uY3BwCkBAIC0wLDAgKzEsMTEgQEAKK1Jvd1ZlY3RvclhkIHZlYzEoMyk7Cit2ZWMxIDw8IDEsIDIsIDM7CitzdGQ6OmNvdXQgPDwgInZlYzEgPSAiIDw8IHZlYzEgPDwgc3RkOjplbmRsOworCitSb3dWZWN0b3JYZCB2ZWMyKDQpOwordmVjMiA8PCAxLCA0LCA5LCAxNjsKK3N0ZDo6Y291dCA8PCAidmVjMiA9ICIgPDwgdmVjMiA8PCBzdGQ6OmVuZGw7CisKK1Jvd1ZlY3RvclhkIGpvaW5lZCg3KTsKK2pvaW5lZCA8PCB2ZWMxLCB2ZWMyOworc3RkOjpjb3V0IDw8ICJqb2luZWQgPSAiIDw8IGpvaW5lZCA8PCBzdGQ6OmVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9MaW5TcGFjZWQuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fTGluU3BhY2VkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE3M2FiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fTGluU3BhY2VkLmNwcApAQCAtMCwwICsxLDcgQEAKK0FycmF5WFhmIHRhYmxlKDEwLCA0KTsKK3RhYmxlLmNvbCgwKSA9IEFycmF5WGY6OkxpblNwYWNlZCgxMCwgMCwgOTApOwordGFibGUuY29sKDEpID0gTV9QSSAvIDE4MCAqIHRhYmxlLmNvbCgwKTsKK3RhYmxlLmNvbCgyKSA9IHRhYmxlLmNvbCgxKS5zaW4oKTsKK3RhYmxlLmNvbCgzKSA9IHRhYmxlLmNvbCgxKS5jb3MoKTsKK3N0ZDo6Y291dCA8PCAiICBEZWdyZWVzICAgUmFkaWFucyAgICAgIFNpbmUgICAgQ29zaW5lXG4iOworc3RkOjpjb3V0IDw8IHRhYmxlIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1RocmVlV2F5cy5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzQ1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCkBAIC0wLDAgKzEsMjAgQEAKK2NvbnN0IGludCBzaXplID0gNjsKK01hdHJpeFhkIG1hdDEoc2l6ZSwgc2l6ZSk7CittYXQxLnRvcExlZnRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgICA9IE1hdHJpeFhkOjpaZXJvKHNpemUvMiwgc2l6ZS8yKTsKK21hdDEudG9wUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKK21hdDEuYm90dG9tTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKK21hdDEuYm90dG9tUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpID0gTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpOworc3RkOjpjb3V0IDw8IG1hdDEgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworTWF0cml4WGQgbWF0MihzaXplLCBzaXplKTsKK21hdDIudG9wTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0WmVybygpOworbWF0Mi50b3BSaWdodENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0SWRlbnRpdHkoKTsKK21hdDIuYm90dG9tTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0SWRlbnRpdHkoKTsKK21hdDIuYm90dG9tUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpLnNldFplcm8oKTsKK3N0ZDo6Y291dCA8PCBtYXQyIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKK01hdHJpeFhkIG1hdDMoc2l6ZSwgc2l6ZSk7CittYXQzIDw8IE1hdHJpeFhkOjpaZXJvKHNpemUvMiwgc2l6ZS8yKSwgTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKSwKKyAgICAgICAgTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKSwgTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpOworc3RkOjpjb3V0IDw8IG1hdDMgPDwgc3RkOjplbmRsOworCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcApAQCAtMCwwICsxLDEzIEBACitzdGQ6OmNvdXQgPDwgIkEgZml4ZWQtc2l6ZSBhcnJheTpcbiI7CitBcnJheTMzZiBhMSA9IEFycmF5MzNmOjpaZXJvKCk7CitzdGQ6OmNvdXQgPDwgYTEgPDwgIlxuXG4iOworCisKK3N0ZDo6Y291dCA8PCAiQSBvbmUtZGltZW5zaW9uYWwgZHluYW1pYy1zaXplIGFycmF5OlxuIjsKK0FycmF5WGYgYTIgPSBBcnJheVhmOjpaZXJvKDMpOworc3RkOjpjb3V0IDw8IGEyIDw8ICJcblxuIjsKKworCitzdGQ6OmNvdXQgPDwgIkEgdHdvLWRpbWVuc2lvbmFsIGR5bmFtaWMtc2l6ZSBhcnJheTpcbiI7CitBcnJheVhYZiBhMyA9IEFycmF5WFhmOjpaZXJvKDMsIDQpOworc3RkOjpjb3V0IDw8IGEzIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfTWFwX3Jvd21ham9yLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDVhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfTWFwX3Jvd21ham9yLmNwcApAQCAtMCwwICsxLDcgQEAKK2ludCBhcnJheVs4XTsKK2ZvcihpbnQgaSA9IDA7IGkgPCA4OyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgIkNvbHVtbi1tYWpvcjpcbiIgPDwgTWFwPE1hdHJpeDxpbnQsMiw0PiA+KGFycmF5KSA8PCBlbmRsOworY291dCA8PCAiUm93LW1ham9yOlxuIiA8PCBNYXA8TWF0cml4PGludCwyLDQsUm93TWFqb3I+ID4oYXJyYXkpIDw8IGVuZGw7Citjb3V0IDw8ICJSb3ctbWFqb3IgdXNpbmcgc3RyaWRlOlxuIiA8PAorICBNYXA8TWF0cml4PGludCwyLDQ+LCBVbmFsaWduZWQsIFN0cmlkZTwxLDQ+ID4oYXJyYXkpIDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfdXNpbmcuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX01hcF91c2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlNDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfdXNpbmcuY3BwCkBAIC0wLDAgKzEsMjEgQEAKK3R5cGVkZWYgTWF0cml4PGZsb2F0LDEsRHluYW1pYz4gTWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPE1hdHJpeFR5cGU+IE1hcFR5cGU7Cit0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXhUeXBlPiBNYXBUeXBlQ29uc3Q7ICAgLy8gYSByZWFkLW9ubHkgbWFwCitjb25zdCBpbnQgbl9kaW1zID0gNTsKKyAgCitNYXRyaXhUeXBlIG0xKG5fZGltcyksIG0yKG5fZGltcyk7CittMS5zZXRSYW5kb20oKTsKK20yLnNldFJhbmRvbSgpOworZmxvYXQgKnAgPSAmbTIoMCk7ICAvLyBnZXQgdGhlIGFkZHJlc3Mgc3RvcmluZyB0aGUgZGF0YSBmb3IgbTIKK01hcFR5cGUgbTJtYXAocCxtMi5zaXplKCkpOyAgIC8vIG0ybWFwIHNoYXJlcyBkYXRhIHdpdGggbTIKK01hcFR5cGVDb25zdCBtMm1hcGNvbnN0KHAsbTIuc2l6ZSgpKTsgIC8vIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciBtMgorCitjb3V0IDw8ICJtMTogIiA8PCBtMSA8PCBlbmRsOworY291dCA8PCAibTI6ICIgPDwgbTIgPDwgZW5kbDsKK2NvdXQgPDwgIlNxdWFyZWQgZXVjbGlkZWFuIGRpc3RhbmNlOiAiIDw8IChtMS1tMikuc3F1YXJlZE5vcm0oKSA8PCBlbmRsOworY291dCA8PCAiU3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2UsIHVzaW5nIG1hcDogIiA8PAorICAobTEtbTJtYXApLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKK20ybWFwKDMpID0gNzsgICAvLyB0aGlzIHdpbGwgY2hhbmdlIG0yLCBzaW5jZSB0aGV5IHNoYXJlIHRoZSBzYW1lIGFycmF5Citjb3V0IDw8ICJVcGRhdGVkIG0yOiAiIDw8IG0yIDw8IGVuZGw7Citjb3V0IDw8ICJtMiBjb2VmZmljaWVudCAyLCBjb25zdGFudCBhY2Nlc3NvcjogIiA8PCBtMm1hcGNvbnN0KDIpIDw8IGVuZGw7CisvKiBtMm1hcGNvbnN0KDIpID0gNTsgKi8gICAvLyB0aGlzIHlpZWxkcyBhIGNvbXBpbGUtdGltZSBlcnJvcgpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1Jlc2hhcGVNYXQyTWF0LmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0Mk1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0ZDZlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0Mk1hdC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXhYZiBNMSgyLDYpOyAgICAvLyBDb2x1bW4tbWFqb3Igc3RvcmFnZQorTTEgPDwgMSwgMiwgMywgIDQsICA1LCAgNiwKKyAgICAgIDcsIDgsIDksIDEwLCAxMSwgMTI7CisKK01hcDxNYXRyaXhYZj4gTTIoTTEuZGF0YSgpLCA2LDIpOworY291dCA8PCAiTTI6IiA8PCBlbmRsIDw8IE0yIDw8IGVuZGw7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1Jlc2hhcGVNYXQyVmVjLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0MlZlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViZDRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0MlZlYy5jcHAKQEAgLTAsMCArMSwxMSBAQAorTWF0cml4WGYgTTEoMywzKTsgICAgLy8gQ29sdW1uLW1ham9yIHN0b3JhZ2UKK00xIDw8IDEsIDIsIDMsCisgICAgICA0LCA1LCA2LAorICAgICAgNywgOCwgOTsKKworTWFwPFJvd1ZlY3RvclhmPiB2MShNMS5kYXRhKCksIE0xLnNpemUoKSk7Citjb3V0IDw8ICJ2MToiIDw8IGVuZGwgPDwgdjEgPDwgZW5kbDsKKworTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4gTTIoTTEpOworTWFwPFJvd1ZlY3RvclhmPiB2MihNMi5kYXRhKCksIE0yLnNpemUoKSk7Citjb3V0IDw8ICJ2MjoiIDw8IGVuZGwgPDwgdjIgPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfU2xpY2luZ0NvbC5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfU2xpY2luZ0NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2N2ZmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9TbGljaW5nQ29sLmNwcApAQCAtMCwwICsxLDExIEBACitNYXRyaXhYZiBNMSA9IE1hdHJpeFhmOjpSYW5kb20oMyw4KTsKK2NvdXQgPDwgIkNvbHVtbiBtYWpvciBpbnB1dDoiIDw8IGVuZGwgPDwgTTEgPDwgIlxuIjsKK01hcDxNYXRyaXhYZiwwLE91dGVyU3RyaWRlPD4gPiBNMihNMS5kYXRhKCksIE0xLnJvd3MoKSwgKE0xLmNvbHMoKSsyKS8zLCBPdXRlclN0cmlkZTw+KE0xLm91dGVyU3RyaWRlKCkqMykpOworY291dCA8PCAiMSBjb2x1bW4gb3ZlciAzOiIgPDwgZW5kbCA8PCBNMiA8PCAiXG4iOworCit0eXBlZGVmIE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IFJvd01ham9yTWF0cml4WGY7CitSb3dNYWpvck1hdHJpeFhmIE0zKE0xKTsKK2NvdXQgPDwgIlJvdyBtYWpvciBpbnB1dDoiIDw8IGVuZGwgPDwgTTMgPDwgIlxuIjsKK01hcDxSb3dNYWpvck1hdHJpeFhmLDAsU3RyaWRlPER5bmFtaWMsMz4gPiBNNChNMy5kYXRhKCksIE0zLnJvd3MoKSwgKE0zLmNvbHMoKSsyKS8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZTxEeW5hbWljLDM+KE0zLm91dGVyU3RyaWRlKCksMykpOworY291dCA8PCAiMSBjb2x1bW4gb3ZlciAzOiIgPDwgZW5kbCA8PCBNNCA8PCAiXG4iOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9TbGljaW5nVmVjLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9TbGljaW5nVmVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UxMGJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1NsaWNpbmdWZWMuY3BwCkBAIC0wLDAgKzEsNCBAQAorUm93VmVjdG9yWGYgdiA9IFJvd1ZlY3RvclhmOjpMaW5TcGFjZWQoMjAsMCwxOSk7Citjb3V0IDw8ICJJbnB1dDoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworTWFwPFJvd1ZlY3RvclhmLDAsSW5uZXJTdHJpZGU8Mj4gPiB2Mih2LmRhdGEoKSwgdi5zaXplKCkvMik7Citjb3V0IDw8ICJFdmVuOiIgPDwgdjIgPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmEzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNmIG07CittIDw8IDEsIDIsIDMsCisgICAgIDQsIDUsIDYsCisgICAgIDcsIDgsIDk7CitzdGQ6OmNvdXQgPDwgbTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDFiLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDFiLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRiMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMWIuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2YgbTsKK20ucm93KDApIDw8IDEsIDIsIDM7CittLmJsb2NrKDEsMCwyLDIpIDw8IDQsIDUsIDcsIDg7CittLmNvbCgyKS50YWlsKDIpIDw8IDYsIDk7CQkgICAgCitzdGQ6OmNvdXQgPDwgbTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDIuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2MGQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDIuY3BwCkBAIC0wLDAgKzEsNyBAQAoraW50IHJvd3M9NSwgY29scz01OworTWF0cml4WGYgbShyb3dzLGNvbHMpOworbSA8PCAoTWF0cml4M2YoKSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KS5maW5pc2hlZCgpLAorICAgICBNYXRyaXhYZjo6WmVybygzLGNvbHMtMyksCisgICAgIE1hdHJpeFhmOjpaZXJvKHJvd3MtMywzKSwKKyAgICAgTWF0cml4WGY6OklkZW50aXR5KHJvd3MtMyxjb2xzLTMpOworY291dCA8PCBtOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX21hdHJpeF9pbnZlcnNlLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tYXRyaXhfaW52ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmMzI0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tYXRyaXhfaW52ZXJzZS5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXgzZiBBOworVmVjdG9yM2YgYjsKK0EgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCwxMDsKK2IgPDwgMywgMywgNDsKK1ZlY3RvcjNmIHggPSBBLmludmVyc2UoKSAqIGI7Citjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tdWx0aXBsZV9yaHMuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX211bHRpcGxlX3Jocy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxMWE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tdWx0aXBsZV9yaHMuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeDNmIEEoMywzKTsKK0EgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCwxMDsKK01hdHJpeDxmbG9hdCwzLDI+IEI7CitCIDw8IDMsMSwgMywxLCA0LDE7CitNYXRyaXg8ZmxvYXQsMywyPiBYOworWCA9IEEuZnVsbFBpdkx1KCkuc29sdmUoQik7Citjb3V0IDw8ICJUaGUgc29sdXRpb24gd2l0aCByaWdodC1oYW5kIHNpZGUgKDMsMyw0KSBpczoiIDw8IGVuZGw7Citjb3V0IDw8IFguY29sKDApIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgc29sdXRpb24gd2l0aCByaWdodC1oYW5kIHNpZGUgKDEsMSwxKSBpczoiIDw8IGVuZGw7Citjb3V0IDw8IFguY29sKDEpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfcmV1c2VfZGVjb21wb3NpdGlvbi5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfcmV1c2VfZGVjb21wb3NpdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9yZXVzZV9kZWNvbXBvc2l0aW9uLmNwcApAQCAtMCwwICsxLDEzIEBACitNYXRyaXgzZiBBKDMsMyk7CitBIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7CitQYXJ0aWFsUGl2TFU8TWF0cml4M2Y+IGx1T2ZBKEEpOyAvLyBjb21wdXRlIExVIGRlY29tcG9zaXRpb24gb2YgQQorVmVjdG9yM2YgYjsKK2IgPDwgMywzLDQ7CitWZWN0b3IzZiB4OworeCA9IGx1T2ZBLnNvbHZlKGIpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHdpdGggcmlnaHQtaGFuZCBzaWRlICgzLDMsNCkgaXM6IiA8PCBlbmRsOworY291dCA8PCB4IDw8IGVuZGw7CitiIDw8IDEsMSwxOworeCA9IGx1T2ZBLnNvbHZlKGIpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHdpdGggcmlnaHQtaGFuZCBzaWRlICgxLDEsMSkgaXM6IiA8PCBlbmRsOworY291dCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfc2luZ3VsYXIuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3Npbmd1bGFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZmMWVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3Npbmd1bGFyLmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeDNmIEE7CitWZWN0b3IzZiBiOworQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDk7CitiIDw8IDMsIDMsIDQ7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6IiA8PCBlbmRsIDw8IGIgPDwgZW5kbDsKK1ZlY3RvcjNmIHg7Cit4ID0gQS5sdSgpLnNvbHZlKGIpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhci5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxM2YyMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyLmNwcApAQCAtMCwwICsxLDggQEAKK01hdHJpeDNmIEE7CitWZWN0b3IzZiBiOworQSA8PCAxLDIsMywgIDAsNSw2LCAgMCwwLDEwOworYiA8PCAzLCAzLCA0OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciBiOiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CitWZWN0b3IzZiB4ID0gQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShiKTsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczoiIDw8IGVuZGwgPDwgeCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXJfaW5wbGFjZS5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhcl9pbnBsYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFlNjMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXJfaW5wbGFjZS5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXgzZiBBOworVmVjdG9yM2YgYjsKK0EgPDwgMSwyLDMsICAwLDUsNiwgIDAsMCwxMDsKK2IgPDwgMywgMywgNDsKK0EudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKGIpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZU9wX2hvbW9nZW5lb3VzLmNwcCBiL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlT3BfaG9tb2dlbmVvdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTRmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZU9wX2hvbW9nZW5lb3VzLmNwcApAQCAtMCwwICsxLDcgQEAKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwzLER5bmFtaWM+IE1hdHJpeDNYZDsKK01hdHJpeDNYZCBNID0gTWF0cml4M1hkOjpSYW5kb20oMyw1KTsKK1Byb2plY3RpdmUzZCBQKE1hdHJpeDRkOjpSYW5kb20oKSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IE0gaXM6IiA8PCBlbmRsIDw8IE0gPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCAiTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKToiIDw8IGVuZGwgPDwgTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSA8PCBlbmRsIDw8IGVuZGw7Citjb3V0IDw8ICJQICogTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKToiIDw8IGVuZGwgPDwgUCAqIE0uY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCAiUCAqIE0uY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkuaG5vcm1hbGl6ZWQoKTogIiA8PCBlbmRsIDw8IChQICogTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkgPDwgZW5kbCA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlX3JldmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL1ZlY3Rvcndpc2VfcmV2ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2YTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlX3JldmVyc2UuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeFhpIG0gPSBNYXRyaXhYaTo6UmFuZG9tKDMsNCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgcm93d2lzZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0ucm93d2lzZSgpLnJldmVyc2UoKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgY29sd2lzZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0uY29sd2lzZSgpLnJldmVyc2UoKSA8PCBlbmRsOworCitjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgcm93aXNlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwKKzw8IG0ucm93d2lzZSgpLnJldmVyc2UoKSgxLDApIDw8IGVuZGw7Citjb3V0IDw8ICJMZXQgdXMgb3ZlcndyaXRlIHRoaXMgY29lZmZpY2llbnQgd2l0aCB0aGUgdmFsdWUgNC4iIDw8IGVuZGw7CisvL20uY29sd2lzZSgpLnJldmVyc2UoKSgxLDApID0gNDsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9jbGFzc19GdWxsUGl2TFUuY3BwIGIvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlN2ZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9jbGFzc19GdWxsUGl2TFUuY3BwCkBAIC0wLDAgKzEsMTYgQEAKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwgNSwgMz4gTWF0cml4NXgzOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA1LCA1PiBNYXRyaXg1eDU7CitNYXRyaXg1eDMgbSA9IE1hdHJpeDV4Mzo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworRWlnZW46OkZ1bGxQaXZMVTxNYXRyaXg1eDM+IGx1KG0pOworY291dCA8PCAiSGVyZSBpcywgdXAgdG8gcGVybXV0YXRpb25zLCBpdHMgTFUgZGVjb21wb3NpdGlvbiBtYXRyaXg6IgorICAgICA8PCBlbmRsIDw8IGx1Lm1hdHJpeExVKCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIEwgcGFydDoiIDw8IGVuZGw7CitNYXRyaXg1eDUgbCA9IE1hdHJpeDV4NTo6SWRlbnRpdHkoKTsKK2wuYmxvY2s8NSwzPigwLDApLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgPSBsdS5tYXRyaXhMVSgpOworY291dCA8PCBsIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBVIHBhcnQ6IiA8PCBlbmRsOworTWF0cml4NXgzIHUgPSBsdS5tYXRyaXhMVSgpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworY291dCA8PCB1IDw8IGVuZGw7Citjb3V0IDw8ICJMZXQgdXMgbm93IHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBtYXRyaXggbToiIDw8IGVuZGw7Citjb3V0IDw8IGx1LnBlcm11dGF0aW9uUCgpLmludmVyc2UoKSAqIGwgKiB1ICogbHUucGVybXV0YXRpb25RKCkuaW52ZXJzZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvY29tcGlsZV9zbmlwcGV0LmNwcC5pbiBiL2RvYy9zbmlwcGV0cy9jb21waWxlX3NuaXBwZXQuY3BwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2YzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvY29tcGlsZV9zbmlwcGV0LmNwcC5pbgpAQCAtMCwwICsxLDIwIEBACitzdGF0aWMgYm9vbCBlaWdlbl9kaWRfYXNzZXJ0ID0gZmFsc2U7CisjZGVmaW5lIGVpZ2VuX2Fzc2VydChYKSBpZighZWlnZW5fZGlkX2Fzc2VydCAmJiAhKFgpKXsgc3RkOjpjb3V0IDw8ICIjIyMgQXNzZXJ0aW9uIHJhaXNlZCBpbiAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCAiOlxuIiAjWCA8PCAiXG4jIyMgVGhlIGZvbGxvd2luZyB3b3VsZCBoYXBwZW4gd2l0aG91dCBhc3NlcnRpb25zOlxuIjsgZWlnZW5fZGlkX2Fzc2VydCA9IHRydWU7fQorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW4+CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NQorI2VuZGlmCisKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIGNvdXQucHJlY2lzaW9uKDMpOworICAke3NuaXBwZXRfc291cmNlX2NvZGV9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFlN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAKQEAgLTAsMCArMSwxMiBAQAorICBNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOworICBzdGQ6OnB0cmRpZmZfdCBpLCBqOworICBmbG9hdCBtaW5PZk0gPSBtLm1pbkNvZWZmKCZpLCZqKTsKKyAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgZW5kbDsKKyAgY291dCA8PCAiSXRzIG1pbmltdW0gY29lZmZpY2llbnQgKCIgPDwgbWluT2ZNIAorICAgICAgIDw8ICIpIGlzIGF0IHBvc2l0aW9uICgiIDw8IGkgPDwgIiwiIDw8IGogPDwgIilcblxuIjsKKworICBSb3dWZWN0b3I0aSB2ID0gUm93VmVjdG9yNGk6OlJhbmRvbSgpOworICBpbnQgbWF4T2ZWID0gdi5tYXhDb2VmZigmaSk7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiAiIDw8IHYgPDwgZW5kbDsKKyAgY291dCA8PCAiSXRzIG1heGltdW0gY29lZmZpY2llbnQgKCIgPDwgbWF4T2ZWIAorICAgICAgIDw8ICIpIGlzIGF0IHBvc2l0aW9uICIgPDwgaSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5jcHAgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU0NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgyaSBhOyBhIDw8IDEsIDIsIDMsIDQ7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggYTpcbiIgPDwgYSA8PCBlbmRsOworCithID0gYS50cmFuc3Bvc2UoKTsgLy8gISEhIGRvIE5PVCBkbyB0aGlzICEhIQorY291dCA8PCAiYW5kIHRoZSByZXN1bHQgb2YgdGhlIGFsaWFzaW5nIGVmZmVjdDpcbiIgPDwgYSA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ5NmIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9jb25qdWdhdGUuY3BwCkBAIC0wLDAgKzEsMTIgQEAKK01hdHJpeFhjZiBhID0gTWF0cml4WGNmOjpSYW5kb20oMiwyKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhXG4iIDw8IGEgPDwgZW5kbDsKKworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IGFeVFxuIiA8PCBhLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisKKworY291dCA8PCAiSGVyZSBpcyB0aGUgY29uanVnYXRlIG9mIGFcbiIgPDwgYS5jb25qdWdhdGUoKSA8PCBlbmRsOworCisKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhXipcbiIgPDwgYS5hZGpvaW50KCkgPDwgZW5kbDsKKworCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2UuY3BwIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA2OWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeFhmIGEoMiwzKTsgYSA8PCAxLCAyLCAzLCA0LCA1LCA2OworY291dCA8PCAiSGVyZSBpcyB0aGUgaW5pdGlhbCBtYXRyaXggYTpcbiIgPDwgYSA8PCBlbmRsOworCisKK2EudHJhbnNwb3NlSW5QbGFjZSgpOworY291dCA8PCAiYW5kIGFmdGVyIGJlaW5nIHRyYW5zcG9zZWQ6XG4iIDw8IGEgPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfbWF0cml4X2Fzc2lnbm1lbnRfcmVzaXppbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTg5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeFhmIGEoMiwyKTsKK3N0ZDo6Y291dCA8PCAiYSBpcyBvZiBzaXplICIgPDwgYS5yb3dzKCkgPDwgIngiIDw8IGEuY29scygpIDw8IHN0ZDo6ZW5kbDsKK01hdHJpeFhmIGIoMywzKTsKK2EgPSBiOworc3RkOjpjb3V0IDw8ICJhIGlzIG5vdyBvZiBzaXplICIgPDwgYS5yb3dzKCkgPDwgIngiIDw8IGEuY29scygpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0IGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZmJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzUgQEAKK2lmKE5PVCBFSUdFTl9URVNUX05PUVQpCisgIGZpbmRfcGFja2FnZShRdDQpCisgIGlmKFFUNF9GT1VORCkKKyAgICBpbmNsdWRlKCR7UVRfVVNFX0ZJTEV9KQorICBlbmRpZigpCitlbmRpZihOT1QgRUlHRU5fVEVTVF9OT1FUKQorCitpZihRVDRfRk9VTkQpCisgIGFkZF9leGVjdXRhYmxlKFR1dG9yaWFsX3NwYXJzZV9leGFtcGxlIFR1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmNwcCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmNwcCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsX3NwYXJzZV9leGFtcGxlICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99ICR7UVRfUVRDT1JFX0xJQlJBUll9ICR7UVRfUVRHVUlfTElCUkFSWX0pCisKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIFRBUkdFVCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZQorICAgIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uL2h0bWwvCisgICAgQ09NTUFORCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZSBBUkdTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLi9odG1sL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmpwZWcKKyAgKQorCisgIGFkZF9kZXBlbmRlbmNpZXMoYWxsX2V4YW1wbGVzIFR1dG9yaWFsX3NwYXJzZV9leGFtcGxlKQorZW5kaWYoUVQ0X0ZPVU5EKQorCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLXN0ZD1jKysxMSIgRUlHRU5fQ09NUElMRVJfU1VQUE9SVF9DUFAxMSkKK2lmKEVJR0VOX0NPTVBJTEVSX1NVUFBPUlRfQ1BQMTEpCisgIGFkZF9leGVjdXRhYmxlKHJhbmRvbV9jcHAxMSByYW5kb21fY3BwMTEuY3BwKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMocmFuZG9tX2NwcDExICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBhZGRfZGVwZW5kZW5jaWVzKGFsbF9leGFtcGxlcyByYW5kb21fY3BwMTEpCisgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkocmFuZG9tX2NwcDExIENPTVBJTEVfRkxBR1MgIi1zdGQ9YysrMTEiKQorCisgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICBUQVJHRVQgcmFuZG9tX2NwcDExCisgICAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgcmFuZG9tX2NwcDExCisgICAgQVJHUyA+JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3JhbmRvbV9jcHAxMS5vdXQKKyAgKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuY3BwIGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGUxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY2lhbF9leGFtcGxlcy9UdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5jcHAKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3R5cGVkZWYgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IFNwTWF0OyAvLyBkZWNsYXJlcyBhIGNvbHVtbi1tYWpvciBzcGFyc2UgbWF0cml4IHR5cGUgb2YgZG91YmxlCit0eXBlZGVmIEVpZ2VuOjpUcmlwbGV0PGRvdWJsZT4gVDsKKwordm9pZCBidWlsZFByb2JsZW0oc3RkOjp2ZWN0b3I8VD4mIGNvZWZmaWNpZW50cywgRWlnZW46OlZlY3RvclhkJiBiLCBpbnQgbik7Cit2b2lkIHNhdmVBc0JpdG1hcChjb25zdCBFaWdlbjo6VmVjdG9yWGQmIHgsIGludCBuLCBjb25zdCBjaGFyKiBmaWxlbmFtZSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgYXNzZXJ0KGFyZ2M9PTIpOworICAKKyAgaW50IG4gPSAzMDA7ICAvLyBzaXplIG9mIHRoZSBpbWFnZQorICBpbnQgbSA9IG4qbjsgIC8vIG51bWJlciBvZiB1bmtub3dzICg9bnVtYmVyIG9mIHBpeGVscykKKworICAvLyBBc3NlbWJseToKKyAgc3RkOjp2ZWN0b3I8VD4gY29lZmZpY2llbnRzOyAgICAgICAgICAgIC8vIGxpc3Qgb2Ygbm9uLXplcm9zIGNvZWZmaWNpZW50cworICBFaWdlbjo6VmVjdG9yWGQgYihtKTsgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IGhhbmQgc2lkZS12ZWN0b3IgcmVzdWx0aW5nIGZyb20gdGhlIGNvbnN0cmFpbnRzCisgIGJ1aWxkUHJvYmxlbShjb2VmZmljaWVudHMsIGIsIG4pOworCisgIFNwTWF0IEEobSxtKTsKKyAgQS5zZXRGcm9tVHJpcGxldHMoY29lZmZpY2llbnRzLmJlZ2luKCksIGNvZWZmaWNpZW50cy5lbmQoKSk7CisKKyAgLy8gU29sdmluZzoKKyAgRWlnZW46OlNpbXBsaWNpYWxDaG9sZXNreTxTcE1hdD4gY2hvbChBKTsgIC8vIHBlcmZvcm1zIGEgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBvZiBBCisgIEVpZ2VuOjpWZWN0b3JYZCB4ID0gY2hvbC5zb2x2ZShiKTsgICAgICAgICAvLyB1c2UgdGhlIGZhY3Rvcml6YXRpb24gdG8gc29sdmUgZm9yIHRoZSBnaXZlbiByaWdodCBoYW5kIHNpZGUKKworICAvLyBFeHBvcnQgdGhlIHJlc3VsdCB0byBhIGZpbGU6CisgIHNhdmVBc0JpdG1hcCh4LCBuLCBhcmd2WzFdKTsKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGVfZGV0YWlscy5jcHAgYi9kb2Mvc3BlY2lhbF9leGFtcGxlcy9UdXRvcmlhbF9zcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE4YjAxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGVfZGV0YWlscy5jcHAKQEAgLTAsMCArMSw0NCBAQAorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8UUltYWdlPgorCit0eXBlZGVmIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBTcE1hdDsgLy8gZGVjbGFyZXMgYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCB0eXBlIG9mIGRvdWJsZQordHlwZWRlZiBFaWdlbjo6VHJpcGxldDxkb3VibGU+IFQ7CisKK3ZvaWQgaW5zZXJ0Q29lZmZpY2llbnQoaW50IGlkLCBpbnQgaSwgaW50IGosIGRvdWJsZSB3LCBzdGQ6OnZlY3RvcjxUPiYgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yWGQmIGIsIGNvbnN0IEVpZ2VuOjpWZWN0b3JYZCYgYm91bmRhcnkpCit7CisgIGludCBuID0gaW50KGJvdW5kYXJ5LnNpemUoKSk7CisgIGludCBpZDEgPSBpK2oqbjsKKworICAgICAgICBpZihpPT0tMSB8fCBpPT1uKSBiKGlkKSAtPSB3ICogYm91bmRhcnkoaik7IC8vIGNvbnN0cmFpbmVkIGNvZWZmaWNpZW50CisgIGVsc2UgIGlmKGo9PS0xIHx8IGo9PW4pIGIoaWQpIC09IHcgKiBib3VuZGFyeShpKTsgLy8gY29uc3RyYWluZWQgY29lZmZpY2llbnQKKyAgZWxzZSAgY29lZmZzLnB1c2hfYmFjayhUKGlkLGlkMSx3KSk7ICAgICAgICAgICAgICAvLyB1bmtub3duIGNvZWZmaWNpZW50Cit9CisKK3ZvaWQgYnVpbGRQcm9ibGVtKHN0ZDo6dmVjdG9yPFQ+JiBjb2VmZmljaWVudHMsIEVpZ2VuOjpWZWN0b3JYZCYgYiwgaW50IG4pCit7CisgIGIuc2V0WmVybygpOworICBFaWdlbjo6QXJyYXlYZCBib3VuZGFyeSA9IEVpZ2VuOjpBcnJheVhkOjpMaW5TcGFjZWQobiwgMCxNX1BJKS5zaW4oKS5wb3coMik7CisgIGZvcihpbnQgaj0wOyBqPG47ICsraikKKyAgeworICAgIGZvcihpbnQgaT0wOyBpPG47ICsraSkKKyAgICB7CisgICAgICBpbnQgaWQgPSBpK2oqbjsKKyAgICAgIGluc2VydENvZWZmaWNpZW50KGlkLCBpLTEsaiwgLTEsIGNvZWZmaWNpZW50cywgYiwgYm91bmRhcnkpOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGkrMSxqLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSxqLTEsIC0xLCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKKyAgICAgIGluc2VydENvZWZmaWNpZW50KGlkLCBpLGorMSwgLTEsIGNvZWZmaWNpZW50cywgYiwgYm91bmRhcnkpOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGksaiwgICAgNCwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgc2F2ZUFzQml0bWFwKGNvbnN0IEVpZ2VuOjpWZWN0b3JYZCYgeCwgaW50IG4sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQoreworICBFaWdlbjo6QXJyYXk8dW5zaWduZWQgY2hhcixFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gYml0cyA9ICh4KjI1NSkuY2FzdDx1bnNpZ25lZCBjaGFyPigpOworICBRSW1hZ2UgaW1nKGJpdHMuZGF0YSgpLCBuLG4sUUltYWdlOjpGb3JtYXRfSW5kZXhlZDgpOworICBpbWcuc2V0Q29sb3JDb3VudCgyNTYpOworICBmb3IoaW50IGk9MDtpPDI1NjtpKyspIGltZy5zZXRDb2xvcihpLHFSZ2IoaSxpLGkpKTsKKyAgaW1nLnNhdmUoZmlsZW5hbWUpOworfQpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNpYWxfZXhhbXBsZXMvcmFuZG9tX2NwcDExLmNwcCBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL3JhbmRvbV9jcHAxMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NDRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL3JhbmRvbV9jcHAxMS5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cmFuZG9tPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkgeworICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW5lcmF0b3I7CisgIHN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248aW50PiBkaXN0cmlidXRpb24oNC4xKTsKKyAgYXV0byBwb2lzc29uID0gWyZdICgpIHtyZXR1cm4gZGlzdHJpYnV0aW9uKGdlbmVyYXRvcik7fTsKKworICBSb3dWZWN0b3JYaSB2ID0gUm93VmVjdG9yWGk6Ok51bGxhcnlFeHByKDEwLCBwb2lzc29uICk7CisgIHN0ZDo6Y291dCA8PCB2IDw8ICJcbiI7Cit9CmRpZmYgLS1naXQgYS9kb2MvdHV0b3JpYWwuY3BwIGIvZG9jL3R1dG9yaWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJlN2MyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3R1dG9yaWFsLmNwcApAQCAtMCwwICsxLDYyIEBACisjaW5jbHVkZSA8RWlnZW4vQXJyYXk+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHN0ZDo6Y291dC5wcmVjaXNpb24oMik7CisKKyAgLy8gZGVtbyBzdGF0aWMgZnVuY3Rpb25zCisgIEVpZ2VuOjpNYXRyaXgzZiBtMyA9IEVpZ2VuOjpNYXRyaXgzZjo6UmFuZG9tKCk7CisgIEVpZ2VuOjpNYXRyaXg0ZiBtNCA9IEVpZ2VuOjpNYXRyaXg0Zjo6SWRlbnRpdHkoKTsKKworICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDEgKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKKworICAvLyBkZW1vIG5vbi1zdGF0aWMgc2V0Li4uIGZ1bmN0aW9ucworICBtNC5zZXRaZXJvKCk7CisgIG0zLmRpYWdvbmFsKCkuc2V0T25lcygpOworICAKKyAgc3RkOjpjb3V0IDw8ICIqKiogU3RlcCAyICoqKlxubTM6XG4iIDw8IG0zIDw8ICJcbm00OlxuIiA8PCBtNCA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gZGVtbyBmaXhlZC1zaXplIGJsb2NrKCkgZXhwcmVzc2lvbiBhcyBsdmFsdWUgYW5kIGFzIHJ2YWx1ZQorICBtNC5ibG9jazwzLDM+KDAsMSkgPSBtMzsKKyAgbTMucm93KDIpID0gbTQuYmxvY2s8MSwzPigyLDApOworCisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgMyAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworCisgIC8vIGRlbW8gZHluYW1pYy1zaXplIGJsb2NrKCkKKyAgeworICAgIGludCByb3dzID0gMywgY29scyA9IDM7CisgICAgbTQuYmxvY2soMCwxLDMsMykuc2V0SWRlbnRpdHkoKTsKKyAgICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDQgKioqXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworICB9CisKKyAgLy8gZGVtbyB2ZWN0b3IgYmxvY2tzCisgIG00LmRpYWdvbmFsKCkuYmxvY2soMSwyKS5zZXRPbmVzKCk7CisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNSAqKipcbm00LmRpYWdvbmFsKCk6XG4iIDw8IG00LmRpYWdvbmFsKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm00LmRpYWdvbmFsKCkuc3RhcnQoMylcbiIgPDwgbTQuZGlhZ29uYWwoKS5zdGFydCgzKSA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gZGVtbyBjb2VmZi13aXNlIG9wZXJhdGlvbnMKKyAgbTQgPSBtNC5jd2lzZSgpKm00OworICBtMyA9IG0zLmN3aXNlKCkuY29zKCk7CisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNiAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworCisgIC8vIHN1bXMgb2YgY29lZmZpY2llbnRzCisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNyAqKipcbiBtNC5zdW0oKTogIiA8PCBtNC5zdW0oKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibTQuY29sKDIpLnN1bSgpOiAiIDw8IG00LmNvbCgyKS5zdW0oKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibTQuY29sd2lzZSgpLnN1bSgpOlxuIiA8PCBtNC5jb2x3aXNlKCkuc3VtKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm00LnJvd3dpc2UoKS5zdW0oKTpcbiIgPDwgbTQucm93d2lzZSgpLnN1bSgpIDw8IHN0ZDo6ZW5kbDsKKworICAvLyBkZW1vIGludGVsbGlnZW50IGF1dG8tZXZhbHVhdGlvbgorICBtNCA9IG00ICogbTQ7IC8vIGF1dG8tZXZhbHVhdGVzIHNvIG5vIGFsaWFzaW5nIHByb2JsZW0gKHBlcmZvcm1hbmNlIHBlbmFsdHkgaXMgbG93KQorICBFaWdlbjo6TWF0cml4NGYgb3RoZXIgPSAobTQgKiBtNCkubGF6eSgpOyAvLyBmb3JjZXMgbGF6eSBldmFsdWF0aW9uCisgIG00ID0gbTQgKyBtNDsgLy8gaGVyZSBFaWdlbiBnb2VzIGZvciBsYXp5IGV2YWx1YXRpb24sIGFzIHdpdGggbW9zdCBleHByZXNzaW9ucworICBtNCA9IC1tNCArIG00ICsgNSAqIG00OyAvLyBzYW1lIGhlcmUsIEVpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uIGZvciBhbGwgdGhhdC4KKyAgbTQgPSBtNCAqIChtNCArIG00KTsgLy8gaGVyZSBFaWdlbiBjaG9vc2VzIHRvIGZpcnN0IGV2YWx1YXRlIG00ICsgbTQgaW50byBhIHRlbXBvcmFyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZWVkLCBoZXJlIGl0IGlzIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSB0aGlzIGludGVybWVkaWF0ZSByZXN1bHQuCisgIG0zID0gbTMgKiBtNC5ibG9jazwzLDM+KDEsMSk7IC8vIGhlcmUgRWlnZW4gY2hvb3NlcyBOT1QgdG8gZXZhbHVhdGUgYmxvY2soKSBpbnRvIGEgdGVtcG9yYXJ5CisgICAgLy8gYmVjYXVzZSBhY2Nlc3NpbmcgY29lZmZpY2llbnRzIG9mIHRoYXQgYmxvY2sgZXhwcmVzc2lvbiBpcyBub3QgbW9yZSBjb3N0bHkgdGhhbiBhY2Nlc3NpbmcKKyAgICAvLyBjb2VmZmljaWVudHMgb2YgYSBwbGFpbiBtYXRyaXguCisgIG00ID0gbTQgKiBtNC50cmFuc3Bvc2UoKTsgLy8gc2FtZSBoZXJlLCBsYXp5IGV2YWx1YXRpb24gb2YgdGhlIHRyYW5zcG9zZS4KKyAgbTQgPSBtNCAqIG00LnRyYW5zcG9zZSgpLmV2YWwoKTsgLy8gZm9yY2VzIGltbWVkaWF0ZSBldmFsdWF0aW9uIG9mIHRoZSB0cmFuc3Bvc2UKKworICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDggKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2VpZ2VuMy5wYy5pbiBiL2VpZ2VuMy5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY4YTNhCi0tLSAvZGV2L251bGwKKysrIGIvZWlnZW4zLnBjLmluCkBAIC0wLDAgKzEsOSBAQAorcHJlZml4PUBDTUFLRV9JTlNUQUxMX1BSRUZJWEAKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorCitOYW1lOiBFaWdlbjMKK0Rlc2NyaXB0aW9uOiBBIEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5IGZvciBsaW5lYXIgYWxnZWJyYTogdmVjdG9ycywgbWF0cmljZXMsIGFuZCByZWxhdGVkIGFsZ29yaXRobXMKK1JlcXVpcmVzOgorVmVyc2lvbjogQEVJR0VOX1ZFUlNJT05fTlVNQkVSQAorTGliczoKK0NmbGFnczogLUkke3ByZWZpeH0vQElOQ0xVREVfSU5TVEFMTF9ESVJACmRpZmYgLS1naXQgYS9mYWlsdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2ZhaWx0ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzNmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDc1IEBACittZXNzYWdlKFNUQVRVUyAiUnVubmluZyB0aGUgZmFpbHRlc3RzIikKKworZWlfYWRkX2ZhaWx0ZXN0KCJmYWlsdGVzdF9zYW5pdHlfY2hlY2siKQorCitlaV9hZGRfZmFpbHRlc3QoImJsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzAiKQorZWlfYWRkX2ZhaWx0ZXN0KCJibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8xIikKK2VpX2FkZF9mYWlsdGVzdCgiYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMiIpCitlaV9hZGRfZmFpbHRlc3QoInRyYW5zcG9zZV9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwciIpCitlaV9hZGRfZmFpbHRlc3QoImRpYWdvbmFsX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByIikKK2VpX2FkZF9mYWlsdGVzdCgiY3dpc2V1bmFyeXZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIiKQorZWlfYWRkX2ZhaWx0ZXN0KCJ0cmlhbmd1bGFydmlld19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwciIpCitlaV9hZGRfZmFpbHRlc3QoInNlbGZhZGpvaW50dmlld19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwciIpCisKK2VpX2FkZF9mYWlsdGVzdCgiY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMCIpCitlaV9hZGRfZmFpbHRlc3QoImNvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJjb25zdF9xdWFsaWZpZWRfdHJhbnNwb3NlX21ldGhvZF9yZXR2YWwiKQorZWlfYWRkX2ZhaWx0ZXN0KCJjb25zdF9xdWFsaWZpZWRfZGlhZ29uYWxfbWV0aG9kX3JldHZhbCIpCisKK2VpX2FkZF9mYWlsdGVzdCgibWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzAiKQorZWlfYWRkX2ZhaWx0ZXN0KCJtYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMSIpCitlaV9hZGRfZmFpbHRlc3QoIm1hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yIikKK2VpX2FkZF9mYWlsdGVzdCgibWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzMiKQorZWlfYWRkX2ZhaWx0ZXN0KCJtYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfNCIpCisKK2VpX2FkZF9mYWlsdGVzdCgibWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMCIpCitlaV9hZGRfZmFpbHRlc3QoIm1hcF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzAiKQorZWlfYWRkX2ZhaWx0ZXN0KCJibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJ0cmFuc3Bvc2Vfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdCIpCitlaV9hZGRfZmFpbHRlc3QoImRpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QiKQorZWlfYWRkX2ZhaWx0ZXN0KCJjd2lzZXVuYXJ5dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0IikKK2VpX2FkZF9mYWlsdGVzdCgidHJpYW5ndWxhcnZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdCIpCitlaV9hZGRfZmFpbHRlc3QoInNlbGZhZGpvaW50dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0IikKKworZWlfYWRkX2ZhaWx0ZXN0KCJyZWZfMSIpCitlaV9hZGRfZmFpbHRlc3QoInJlZl8yIikKK2VpX2FkZF9mYWlsdGVzdCgicmVmXzMiKQorZWlfYWRkX2ZhaWx0ZXN0KCJyZWZfNCIpCitlaV9hZGRfZmFpbHRlc3QoInJlZl81IikKKworZWlfYWRkX2ZhaWx0ZXN0KCJzd2FwXzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJzd2FwXzIiKQorCitlaV9hZGRfZmFpbHRlc3QoInRlcm5hcnlfMSIpCitlaV9hZGRfZmFpbHRlc3QoInRlcm5hcnlfMiIpCisKK2VpX2FkZF9mYWlsdGVzdCgic3BhcnNlX3JlZl8xIikKK2VpX2FkZF9mYWlsdGVzdCgic3BhcnNlX3JlZl8yIikKK2VpX2FkZF9mYWlsdGVzdCgic3BhcnNlX3JlZl8zIikKK2VpX2FkZF9mYWlsdGVzdCgic3BhcnNlX3JlZl80IikKK2VpX2FkZF9mYWlsdGVzdCgic3BhcnNlX3JlZl81IikKKworZWlfYWRkX2ZhaWx0ZXN0KCJzcGFyc2Vfc3RvcmFnZV9taXNtYXRjaCIpCisKK2VpX2FkZF9mYWlsdGVzdCgicGFydGlhbHBpdmx1X2ludCIpCitlaV9hZGRfZmFpbHRlc3QoImZ1bGxwaXZsdV9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJsbHRfaW50IikKK2VpX2FkZF9mYWlsdGVzdCgibGRsdF9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJxcl9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJjb2xwaXZxcl9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJmdWxscGl2cXJfaW50IikKK2VpX2FkZF9mYWlsdGVzdCgiamFjb2Jpc3ZkX2ludCIpCitlaV9hZGRfZmFpbHRlc3QoImJkY3N2ZF9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJlaWdlbnNvbHZlcl9pbnQiKQorZWlfYWRkX2ZhaWx0ZXN0KCJlaWdlbnNvbHZlcl9jcGx4IikKKworaWYgKEVJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlQpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgICAiJHtFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UfSBvdXQgb2YgJHtFSUdFTl9GQUlMVEVTVF9DT1VOVH0gZmFpbHRlc3RzIEZBSUxFRC4gIgorICAgICAgICAgICJUbyBkZWJ1ZyB0aGVzZSBmYWlsdXJlcywgbWFudWFsbHkgY29tcGlsZSB0aGVzZSBwcm9ncmFtcyBpbiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0sICIKKyAgICAgICAgICAid2l0aCBhbmQgd2l0aG91dCAjZGVmaW5lIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxELiIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIkZhaWx0ZXN0IFNVQ0NFU1M6IGFsbCAke0VJR0VOX0ZBSUxURVNUX0NPVU5UfSBmYWlsdGVzdHMgcGFzc2VkLiIpCisgIG1lc3NhZ2UoU1RBVFVTICIiKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmRjc3ZkX2ludC5jcHAgYi9mYWlsdGVzdC9iZGNzdmRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA3NTJjCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvYmRjc3ZkX2ludC5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL1NWRCIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBCRENTVkQ8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzAuY3BwIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiODIwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzAuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgQmxvY2s8TWF0cml4M2QsMywzPiBiKG0sMCwwKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMS5jcHAgYi9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjZkNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMS5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKKyAgICBCbG9jazxNYXRyaXgzZD4gYihtLDAsMCwzLDMpOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8yLmNwcCBiL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjE4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8yLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIC8vIHJvdy9jb2x1bW4gY29uc3RydWN0b3IKKyAgICBCbG9jazxNYXRyaXgzZCwzLDE+IGIobSwwKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcCBiL2ZhaWx0ZXN0L2Jsb2NrX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5YmViZQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2Jsb2NrX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oKXsKKyAgICBNYXRyaXgzZiBtOworICAgIEJsb2NrPENWX1FVQUxJRklFUiBNYXRyaXgzZj4obSwgMCwgMCwgMywgMykuY29lZmZSZWYoMCwgMCkgPSAxLjBmOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEuY3BwIGIvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNlOTNmCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgQmxvY2s8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmLCAzLCAzPihtLCAwLCAwKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbHBpdnFyX2ludC5jcHAgYi9mYWlsdGVzdC9jb2xwaXZxcl9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTE5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9jb2xwaXZxcl9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9RUiIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IHFyKE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPjo6UmFuZG9tKDEwLDEwKSk7Cit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcCBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YmQ1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIEJsb2NrPE1hdHJpeDNkLDMsMz4gYihtLmJsb2NrPDMsMz4oMCwwKSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzEuY3BwIGIvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0MGMyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzEuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgQmxvY2s8TWF0cml4M2Q+IGIobS5ibG9jaygwLDAsMywzKSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9kaWFnb25hbF9tZXRob2RfcmV0dmFsLmNwcCBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9kaWFnb25hbF9tZXRob2RfcmV0dmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDk1OTRhCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2RpYWdvbmFsX21ldGhvZF9yZXR2YWwuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgRGlhZ29uYWw8TWF0cml4M2Q+IGIobS5kaWFnb25hbCgpKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX3RyYW5zcG9zZV9tZXRob2RfcmV0dmFsLmNwcCBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF90cmFuc3Bvc2VfbWV0aG9kX3JldHZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ZjE5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF90cmFuc3Bvc2VfbWV0aG9kX3JldHZhbC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKKyAgICBUcmFuc3Bvc2U8TWF0cml4M2Q+IGIobS50cmFuc3Bvc2UoKSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcCBiL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNjZjhmCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvY3dpc2V1bmFyeXZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgQ3dpc2VVbmFyeVZpZXc8aW50ZXJuYWw6OnNjYWxhcl9yZWFsX3JlZl9vcDxkb3VibGU+LE1hdHJpeDNkPiB0KG0pOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9jd2lzZXVuYXJ5dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDQxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9jd2lzZXVuYXJ5dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgQ3dpc2VVbmFyeVZpZXc8aW50ZXJuYWw6OnNjYWxhcl9yZWFsX3JlZl9vcDxkb3VibGU+LENWX1FVQUxJRklFUiBNYXRyaXhYZj4obSkuY29lZmZSZWYoMCwgMCkgPSAxLjBmOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9kaWFnb25hbF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAgYi9mYWlsdGVzdC9kaWFnb25hbF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzOThhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2RpYWdvbmFsX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIERpYWdvbmFsPE1hdHJpeDNkPiBkKG0pOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9kaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L2RpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9kaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgRGlhZ29uYWw8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmPihtKS5jb2VmZlJlZigwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2NwbHguY3BwIGIvZmFpbHRlc3QvZWlnZW5zb2x2ZXJfY3BseC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlMjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2NwbHguY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9FaWdlbnZhbHVlcyIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBzdGQ6OmNvbXBsZXg8ZG91YmxlPgorI2Vsc2UKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGVpZyhNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOworfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvZWlnZW5zb2x2ZXJfaW50LmNwcCBiL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhOGRjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2ludC5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0VpZ2VudmFsdWVzIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgU0NBTEFSIGludAorI2Vsc2UKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGVpZyhNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOworfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvZmFpbHRlc3Rfc2FuaXR5X2NoZWNrLmNwcCBiL2ZhaWx0ZXN0L2ZhaWx0ZXN0X3Nhbml0eV9jaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZmE5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2ZhaWx0ZXN0X3Nhbml0eV9jaGVjay5jcHAKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKK1RoaXMgaXMganVzdCBzb21lIHRleHQgdGhhdCB3b24ndCBjb21waWxlIGFzIGEgQysrIGZpbGUsIGFzIGEgYmFzaWMgc2FuaXR5IGNoZWNrIGZvciBmYWlsdGVzdC4KKyNlbHNlCitpbnQgbWFpbigpIHt9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Z1bGxwaXZsdV9pbnQuY3BwIGIvZmFpbHRlc3QvZnVsbHBpdmx1X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkMmM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2Z1bGxwaXZsdV9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9MVSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBGdWxsUGl2TFU8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gbHUoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Z1bGxwaXZxcl9pbnQuY3BwIGIvZmFpbHRlc3QvZnVsbHBpdnFyX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4MmE3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2Z1bGxwaXZxcl9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9RUiIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz4gPiBxcihNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOworfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvamFjb2Jpc3ZkX2ludC5jcHAgYi9mYWlsdGVzdC9qYWNvYmlzdmRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc5MGFlCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvamFjb2Jpc3ZkX2ludC5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL1NWRCIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBKYWNvYmlTVkQ8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2xkbHRfaW50LmNwcCBiL2ZhaWx0ZXN0L2xkbHRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNlNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbGRsdF9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9DaG9sZXNreSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBMRExUPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGxkbHQoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2xsdF9pbnQuY3BwIGIvZmFpbHRlc3QvbGx0X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwMjA2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2xsdF9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9DaG9sZXNreSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBMTFQ8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gbGx0KE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPjo6UmFuZG9tKDEwLDEwKSk7Cit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1Njg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8wLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0cil7CisgICAgTWFwPE1hdHJpeDNmPiBtKHB0cik7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8xLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGExMzRkCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzEuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHNpemUpeworICAgIE1hcDxBcnJheVhmPiBtKHB0ciwgc2l6ZSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmI0YjYyCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scyl7CisgICAgTWFwPE1hdHJpeFhmPiBtKHB0ciwgcm93cywgY29scyk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBmNmYwCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzMuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scyl7CisgICAgTWFwPE1hdHJpeFhmLCBBbGlnbmVkLCBJbm5lclN0cmlkZTwyPiA+IG0ocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTwyPigpKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQuY3BwIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZThjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfNC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oY29uc3QgZmxvYXQgKnB0ciwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpeworICAgIE1hcDxDVl9RVUFMSUZJRVIgTWF0cml4WGYsIFVuYWxpZ25lZCwgT3V0ZXJTdHJpZGU8PiA+IG0ocHRyLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KDIpKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I2YWEwCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oZmxvYXQgKnB0cil7CisgICAgTWFwPENWX1FVQUxJRklFUiBNYXRyaXhYZj4ocHRyLCAxLCAxKS5jb2VmZlJlZigwLDApID0gMS4wZjsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUwNjdjCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oZmxvYXQgKnB0cil7CisgICAgTWFwPENWX1FVQUxJRklFUiBWZWN0b3IzZj4ocHRyKS5jb2VmZlJlZigwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3BhcnRpYWxwaXZsdV9pbnQuY3BwIGIvZmFpbHRlc3QvcGFydGlhbHBpdmx1X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlZjI4MgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3BhcnRpYWxwaXZsdV9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9MVSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBQYXJ0aWFsUGl2TFU8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gbHUoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3FyX2ludC5jcHAgYi9mYWlsdGVzdC9xcl9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjAwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9xcl9pbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9RUiIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIFNDQUxBUiBpbnQKKyNlbHNlCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBIb3VzZWhvbGRlclFSPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IHFyKE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPjo6UmFuZG9tKDEwLDEwKSk7Cit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9yZWZfMS5jcHAgYi9mYWlsdGVzdC9yZWZfMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3OThkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3JlZl8xLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGNhbGxfcmVmKFJlZjxWZWN0b3JYZj4gYSkgeyB9CisKK2ludCBtYWluKCkKK3sKKyAgVmVjdG9yWGYgYSgxMCk7CisgIENWX1FVQUxJRklFUiBWZWN0b3JYZiYgYWMoYSk7CisgIGNhbGxfcmVmKGFjKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3JlZl8yLmNwcCBiL2ZhaWx0ZXN0L3JlZl8yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc3OWNjCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvcmVmXzIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgY2FsbF9yZWYoUmVmPFZlY3RvclhmPiBhKSB7IH0KKworaW50IG1haW4oKQoreworICBNYXRyaXhYZiBBKDEwLDEwKTsKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorICBjYWxsX3JlZihBLnJvdygzKSk7CisjZWxzZQorICBjYWxsX3JlZihBLmNvbCgzKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3JlZl8zLmNwcCBiL2ZhaWx0ZXN0L3JlZl8zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYwMjdkCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvcmVmXzMuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAordm9pZCBjYWxsX3JlZihSZWY8VmVjdG9yWGY+IGEpIHsgfQorI2Vsc2UKK3ZvaWQgY2FsbF9yZWYoY29uc3QgUmVmPGNvbnN0IFZlY3RvclhmPiAmYSkgeyB9CisjZW5kaWYKKworaW50IG1haW4oKQoreworICBWZWN0b3JYZiBhKDEwKTsKKyAgY2FsbF9yZWYoYSthKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3JlZl80LmNwcCBiL2ZhaWx0ZXN0L3JlZl80LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzExZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvcmVmXzQuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgY2FsbF9yZWYoUmVmPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+IGEpIHt9CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgQSgxMCwxMCk7CisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyAgY2FsbF9yZWYoQS50cmFuc3Bvc2UoKSk7CisjZWxzZQorICBjYWxsX3JlZihBKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvcmVmXzUuY3BwIGIvZmFpbHRlc3QvcmVmXzUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NmQ1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9yZWZfNS5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBjYWxsX3JlZihSZWY8VmVjdG9yWGY+IGEpIHsgfQorCitpbnQgbWFpbigpCit7CisgIFZlY3RvclhmIGEoMTApOworICBEZW5zZUJhc2U8VmVjdG9yWGY+ICZhYyhhKTsKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorICBjYWxsX3JlZihhYyk7CisjZWxzZQorICBjYWxsX3JlZihhYy5kZXJpdmVkKCkpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zZWxmYWRqb2ludHZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwIGIvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQwZjgxCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIFNlbGZBZGpvaW50VmlldzxNYXRyaXgzZCxVcHBlcj4gdChtKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwIGIvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWFhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9zZWxmYWRqb2ludHZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oKXsKKyAgICBNYXRyaXhYZiBtOworICAgIFNlbGZBZGpvaW50VmlldzxDVl9RVUFMSUZJRVIgTWF0cml4WGYsVXBwZXI+KG0pLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3BhcnNlX3JlZl8xLmNwcCBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4ZDFmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMS5jcHAKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL1NwYXJzZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGNhbGxfcmVmKFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gYSkgeyB9CisKK2ludCBtYWluKCkKK3sKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBhKDEwLDEwKTsKKyAgQ1ZfUVVBTElGSUVSIFNwYXJzZU1hdHJpeDxmbG9hdD4mIGFjKGEpOworICBjYWxsX3JlZihhYyk7Cit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzIuY3BwIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl8yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM5NDQwCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl8yLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vU3BhcnNlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7IH0KKworaW50IG1haW4oKQoreworICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IEEoMTAsMTApOworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisgIGNhbGxfcmVmKEEucm93KDMpKTsKKyNlbHNlCisgIGNhbGxfcmVmKEEuY29sKDMpKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3BhcnNlX3JlZl8zLmNwcCBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NDliNQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMy5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL1NwYXJzZSIKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKK3ZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7IH0KKyNlbHNlCit2b2lkIGNhbGxfcmVmKGNvbnN0IFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gJmEpIHsgfQorI2VuZGlmCisKK2ludCBtYWluKCkKK3sKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBhKDEwLDEwKTsKKyAgY2FsbF9yZWYoYSthKTsKK30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfNC5jcHAgYi9mYWlsdGVzdC9zcGFyc2VfcmVmXzQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YmI2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9zcGFyc2VfcmVmXzQuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9TcGFyc2UiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBjYWxsX3JlZihSZWY8U3BhcnNlTWF0cml4PGZsb2F0PiA+IGEpIHt9CisKK2ludCBtYWluKCkKK3sKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBBKDEwLDEwKTsKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorICBjYWxsX3JlZihBLnRyYW5zcG9zZSgpKTsKKyNlbHNlCisgIGNhbGxfcmVmKEEpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzUuY3BwIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl81LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc4ZjZmCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl81LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vU3BhcnNlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7IH0KKworaW50IG1haW4oKQoreworICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IGEoMTAsMTApOworICBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiAmYWMoYSk7CisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyAgY2FsbF9yZWYoYWMpOworI2Vsc2UKKyAgY2FsbF9yZWYoYWMuZGVyaXZlZCgpKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3BhcnNlX3N0b3JhZ2VfbWlzbWF0Y2guY3BwIGIvZmFpbHRlc3Qvc3BhcnNlX3N0b3JhZ2VfbWlzbWF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODQwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9zcGFyc2Vfc3RvcmFnZV9taXNtYXRjaC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL1NwYXJzZSIKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordHlwZWRlZiBTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yPiBNYXQxOworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECit0eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+IE1hdDI7CisjZWxzZQordHlwZWRlZiBTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yPiBNYXQyOworI2VuZGlmCisKK2ludCBtYWluKCkKK3sKKyAgTWF0MSBhKDEwLDEwKTsKKyAgTWF0MiBiKDEwLDEwKTsKKyAgYSArPSBiOworfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3dhcF8xLmNwcCBiL2ZhaWx0ZXN0L3N3YXBfMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2Mzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3N3YXBfMS5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBWZWN0b3JYZiBhKDEwKSwgYigxMCk7CisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyAgY29uc3QgRGVuc2VCYXNlPFZlY3RvclhmPiAmYWMoYSk7CisjZWxzZQorICBEZW5zZUJhc2U8VmVjdG9yWGY+ICZhYyhhKTsKKyNlbmRpZgorICBiLnN3YXAoYWMpOworfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3dhcF8yLmNwcCBiL2ZhaWx0ZXN0L3N3YXBfMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMGJhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3N3YXBfMi5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBWZWN0b3JYZiBhKDEwKSwgYigxMCk7CisgIFZlY3RvclhmIGNvbnN0ICZhYyhhKTsKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorICBiLnN3YXAoYWMpOworI2Vsc2UKKyAgYi5zd2FwKGFjLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyNlbmRpZgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3Rlcm5hcnlfMS5jcHAgYi9mYWlsdGVzdC90ZXJuYXJ5XzEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGJjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC90ZXJuYXJ5XzEuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiopCit7CisgIFZlY3RvclhmIGEoMTApLCBiKDEwKTsKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorICBiID0gYXJnYz4xID8gMiphIDogLWE7CisjZWxzZQorICBiID0gYXJnYz4xID8gMiphIDogVmVjdG9yWGYoLWEpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC90ZXJuYXJ5XzIuY3BwIGIvZmFpbHRlc3QvdGVybmFyeV8yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZiMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvdGVybmFyeV8yLmNwcApAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqKQoreworICBWZWN0b3JYZiBhKDEwKSwgYigxMCk7CisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyAgYiA9IGFyZ2M+MSA/IDIqYSA6IGErYTsKKyNlbHNlCisgIGIgPSBhcmdjPjEgPyBWZWN0b3JYZigyKmEpIDogVmVjdG9yWGYoYSthKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvdHJhbnNwb3NlX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcCBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyM2U3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKKyAgICBUcmFuc3Bvc2U8TWF0cml4M2Q+IHQobSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3RyYW5zcG9zZV9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI3ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvdHJhbnNwb3NlX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKCl7CisgICAgTWF0cml4WGYgbTsKKyAgICBUcmFuc3Bvc2U8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmPihtKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3RyaWFuZ3VsYXJ2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcCBiL2ZhaWx0ZXN0L3RyaWFuZ3VsYXJ2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc0NDdlCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeDNkLFVwcGVyPiB0KG0pOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC90cmlhbmd1bGFydmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L3RyaWFuZ3VsYXJ2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzgxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC90cmlhbmd1bGFydmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgVHJpYW5ndWxhclZpZXc8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmLFVwcGVyPihtKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2xhcGFjay9DTWFrZUxpc3RzLnR4dCBiL2xhcGFjay9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODgzZDRjCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDQ5IEBACisKK3Byb2plY3QoRWlnZW5MYXBhY2sgQ1hYKQorCitpbmNsdWRlKCIuLi9jbWFrZS9sYW5ndWFnZV9zdXBwb3J0LmNtYWtlIikKKword29ya2Fyb3VuZF85MjIwKEZvcnRyYW4gRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKworaWYoRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKyAgZW5hYmxlX2xhbmd1YWdlKEZvcnRyYW4gT1BUSU9OQUwpCisgIGlmKE5PVCBDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSKQorICAgIHNldChFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTIE9GRikKKyAgZW5kaWYoKQorZW5kaWYoKQorCithZGRfY3VzdG9tX3RhcmdldChsYXBhY2spCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uL2JsYXMpCisKK3NldChFaWdlbkxhcGFja19TUkNTCitzaW5nbGUuY3BwIGRvdWJsZS5jcHAgY29tcGxleF9zaW5nbGUuY3BwIGNvbXBsZXhfZG91YmxlLmNwcCAuLi9ibGFzL3hlcmJsYS5jcHAKKykKKworaWYoRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKworc2V0KEVpZ2VuTGFwYWNrX1NSQ1MgICR7RWlnZW5MYXBhY2tfU1JDU30KKyAgc2xhcmZ0LmYgIGRsYXJmdC5mICBjbGFyZnQuZiAgemxhcmZ0LmYKKyAgc2xhcmZiLmYgIGRsYXJmYi5mICBjbGFyZmIuZiAgemxhcmZiLmYKKyAgc2xhcmZnLmYgIGRsYXJmZy5mICBjbGFyZmcuZiAgemxhcmZnLmYKKyAgc2xhcmYuZiAgIGRsYXJmLmYgICBjbGFyZi5mICAgemxhcmYuZgorICBzbGFkaXYuZiAgZGxhZGl2LmYgIGNsYWRpdi5mICB6bGFkaXYuZgorICBpbGFzbHIuZiAgaWxhZGxyLmYgIGlsYWNsci5mICBpbGF6bHIuZgorICBpbGFzbGMuZiAgaWxhZGxjLmYgIGlsYWNsYy5mICBpbGF6bGMuZgorICBkbGFweTIuZiAgZGxhcHkzLmYgIHNsYXB5Mi5mICBzbGFweTMuZgorICBjbGFjZ3YuZiAgemxhY2d2LmYKKyAgc2xhbWNoLmYgIGRsYW1jaC5mCisgIHNlY29uZF9OT05FLmYgZHNlY25kX05PTkUuZgorKQorCitvcHRpb24oRUlHRU5fRU5BQkxFX0xBUEFDS19URVNUUyBPRkYgIkVuYmFsZSB0aGUgTGFwYWNrIHVuaXQgdGVzdHMiKQorCitpZihFSUdFTl9FTkFCTEVfTEFQQUNLX1RFU1RTKQorCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoZWlnZW5fZnVsbF9wYXRoX3RvX3JlZmVyZW5jZV9sYXBhY2sgIi4vcmVmZXJlbmNlLyIgQUJTT0xVVEUpCisgIGlmKE5PVCBFWElTVFMgJHtlaWdlbl9mdWxsX3BhdGhfdG9fcmVmZXJlbmNlX2xhcGFja30pCisgICAgIyBEb3dubG9hZCBsYXBhY2sgYW5kIGluc3RhbGwgc291cmNlcyBhbmQgdGVzdGluZyBhdCB0aGUgcmlnaHQgcGxhY2UKKyAgICBtZXNzYWdlKFNUQVRVUyAiRG93bmxvYWQgbGFwYWNrX2FkZG9uc18zLjQuMS50Z3ouLi4iKQorICAgIAorICAgIGZpbGUoRE9XTkxPQUQgImh0dHA6Ly9kb3dubG9hZHMudHV4ZmFtaWx5Lm9yZy9laWdlbi9sYXBhY2tfYWRkb25zXzMuNC4xLnRneiIKKyAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGFwYWNrX2FkZG9uc18zLjQuMS50Z3oiCisgICAgICAgICAgICAgICAgICBJTkFDVElWSVRZX1RJTUVPVVQgMTUKKyAgICAgICAgICAgICAgICAgIFRJTUVPVVQgMjQwCisgICAgICAgICAgICAgICAgICBTVEFUVVMgZG93bmxvYWRfc3RhdHVzCisgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9NRDUgNTc1OGNlNTVhZmNmNzlkYTk4ZGU4YjlkZTE2MTVhZDUKKyAgICAgICAgICAgICAgICAgIFNIT1dfUFJPR1JFU1MpCisgICAgICAgICAgICAgICAgICAKKyAgICBtZXNzYWdlKFNUQVRVUyAke2Rvd25sb2FkX3N0YXR1c30pCisgICAgbGlzdChHRVQgZG93bmxvYWRfc3RhdHVzIDAgZG93bmxvYWRfc3RhdHVzX251bSkKKyAgICBzZXQoZG93bmxvYWRfc3RhdHVzX251bSAwKQorICAgIGlmKGRvd25sb2FkX3N0YXR1c19udW0gRVFVQUwgMCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTZXR1cCBsYXBhY2sgcmVmZXJlbmNlIGFuZCBsYXBhY2sgdW5pdCB0ZXN0cyIpCisgICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCB0YXIgeHpmICAibGFwYWNrX2FkZG9uc18zLjQuMS50Z3oiIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJEb3dubG9hZCBvZiBsYXBhY2tfYWRkb25zXzMuNC4xLnRneiBmYWlsZWQsIExBUEFDSyB1bml0IHRlc3RzIHdvbnQgYmUgZW5hYmxlZCIpCisgICAgICBzZXQoRUlHRU5fRU5BQkxFX0xBUEFDS19URVNUUyBmYWxzZSkKKyAgICBlbmRpZigpCisgICAgICAgICAgICAgICAgICAKKyAgZW5kaWYoKQorICAKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChlaWdlbl9mdWxsX3BhdGhfdG9fcmVmZXJlbmNlX2xhcGFjayAiLi9yZWZlcmVuY2UvIiBBQlNPTFVURSkKKyAgaWYoRVhJU1RTICR7ZWlnZW5fZnVsbF9wYXRoX3RvX3JlZmVyZW5jZV9sYXBhY2t9KQorICAgIHNldChFaWdlbkxhcGFja19mdW5jZmlsZW5hbWVzCisgICAgICAgIHNzeWV2LmYgICBkc3lldi5mICAgY3N5ZXYuZiAgIHpzeWV2LmYKKyAgICAgICAgc3BvdHJmLmYgIGRwb3RyZi5mICBjcG90cmYuZiAgenBvdHJmLmYKKyAgICAgICAgc3BvdHJzLmYgIGRwb3Rycy5mICBjcG90cnMuZiAgenBvdHJzLmYKKyAgICAgICAgc2dldHJmLmYgIGRnZXRyZi5mICBjZ2V0cmYuZiAgemdldHJmLmYKKyAgICAgICAgc2dldHJzLmYgIGRnZXRycy5mICBjZ2V0cnMuZiAgemdldHJzLmYpCisgICAgCisgICAgRklMRShHTE9CIFJlZmVyZW5jZUxhcGFja19TUkNTMCBSRUxBVElWRSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0gInJlZmVyZW5jZS8qLmYiKQorICAgIGZvcmVhY2goZmlsZW5hbWUxIElOIExJU1RTIFJlZmVyZW5jZUxhcGFja19TUkNTMCkKKyAgICAgIHN0cmluZyhSRVBMQUNFICJyZWZlcmVuY2UvIiAiIiBmaWxlbmFtZSAke2ZpbGVuYW1lMX0pCisgICAgICBsaXN0KEZJTkQgRWlnZW5MYXBhY2tfU1JDUyAke2ZpbGVuYW1lfSBpZDEpCisgICAgICBsaXN0KEZJTkQgRWlnZW5MYXBhY2tfZnVuY2ZpbGVuYW1lcyAke2ZpbGVuYW1lfSBpZDIpCisgICAgICBpZigoaWQxIEVRVUFMIC0xKSBBTkQgKGlkMiBFUVVBTCAtMSkpCisgICAgICAgIHNldChSZWZlcmVuY2VMYXBhY2tfU1JDUyAke1JlZmVyZW5jZUxhcGFja19TUkNTfSByZWZlcmVuY2UvJHtmaWxlbmFtZX0pCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKKyAgCisgIAorZW5kaWYoRUlHRU5fRU5BQkxFX0xBUEFDS19URVNUUykKKworZW5kaWYoRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKworYWRkX2xpYnJhcnkoZWlnZW5fbGFwYWNrX3N0YXRpYyAke0VpZ2VuTGFwYWNrX1NSQ1N9ICR7UmVmZXJlbmNlTGFwYWNrX1NSQ1N9KQorYWRkX2xpYnJhcnkoZWlnZW5fbGFwYWNrIFNIQVJFRCAke0VpZ2VuTGFwYWNrX1NSQ1N9KQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoZWlnZW5fbGFwYWNrICBlaWdlbl9ibGFzKQorCitpZihFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTykKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGVpZ2VuX2xhcGFja19zdGF0aWMgJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhlaWdlbl9sYXBhY2sgICAgICAgICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorZW5kaWYoKQorCithZGRfZGVwZW5kZW5jaWVzKGxhcGFjayBlaWdlbl9sYXBhY2sgZWlnZW5fbGFwYWNrX3N0YXRpYykKKworaW5zdGFsbChUQVJHRVRTIGVpZ2VuX2xhcGFjayBlaWdlbl9sYXBhY2tfc3RhdGljCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliKQorCisgICAgICAgIAorICAgICAgICAKK2dldF9maWxlbmFtZV9jb21wb25lbnQoZWlnZW5fZnVsbF9wYXRoX3RvX3Rlc3RpbmdfbGFwYWNrICIuL3Rlc3RpbmcvIiBBQlNPTFVURSkKK2lmKEVYSVNUUyAke2VpZ2VuX2Z1bGxfcGF0aF90b190ZXN0aW5nX2xhcGFja30pCisgIAorICAjIFRoZSBmb2xsb3dpbmcgY29tZXMgZnJvbSBsYXBhY2svVEVTVElORy9DTWFrZUxpc3RzLnR4dAorICAjIEdldCBQeXRob24KKyAgZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCkKKyAgbWVzc2FnZShTVEFUVVMgIkxvb2tpbmcgZm9yIFB5dGhvbiBmb3VuZCAtICR7UFlUSE9OSU5URVJQX0ZPVU5EfSIpCisgIGlmIChQWVRIT05JTlRFUlBfRk9VTkQpCisgICAgbWVzc2FnZShTVEFUVVMgIlVzaW5nIFB5dGhvbiB2ZXJzaW9uICR7UFlUSE9OX1ZFUlNJT05fU1RSSU5HfSIpCisgIGVuZGlmKCkKKworICBzZXQoTEFQQUNLX1NPVVJDRV9ESVIgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICBzZXQoTEFQQUNLX0JJTkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBzZXQoQlVJTERfU0lOR0xFICAgICAgdHJ1ZSkKKyAgc2V0KEJVSUxEX0RPVUJMRSAgICAgIHRydWUpCisgIHNldChCVUlMRF9DT01QTEVYICAgICB0cnVlKQorICBzZXQoQlVJTERfQ09NUExFWDE2RSAgdHJ1ZSkKKyAgCisgIGlmKE1TVkNfVkVSU0lPTikKKyMgIHN0cmluZyhSRVBMQUNFICIvU1RBQ0s6MTAwMDAwMDAiICIvU1RBQ0s6OTAwMDAwMDAwMDAwMDAwMDAwIgorIyAgICBDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1N9IikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIiguKikvU1RBQ0s6KC4qKSAoLiopIiAiXFwxL1NUQUNLOjkwMDAwMDAwMDAwMDAwMDAwMCBcXDMiCisgICAgQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSIpCisgIGVuZGlmKCkKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0aW5nL01BVEdFTikKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0aW5nL0xJTikKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0aW5nL0VJRykKKyAgbWFjcm8oYWRkX2xhcGFja190ZXN0IG91dHB1dCBpbnB1dCB0YXJnZXQpCisgICAgc2V0KFRFU1RfSU5QVVQgIiR7TEFQQUNLX1NPVVJDRV9ESVJ9L3Rlc3RpbmcvJHtpbnB1dH0iKQorICAgIHNldChURVNUX09VVFBVVCAiJHtMQVBBQ0tfQklOQVJZX0RJUn0vdGVzdGluZy8ke291dHB1dH0iKQorICAgIGdldF90YXJnZXRfcHJvcGVydHkoVEVTVF9MT0MgJHt0YXJnZXR9IExPQ0FUSU9OKQorICAgIHN0cmluZyhSRVBMQUNFICIuIiAiXyIgaW5wdXRfbmFtZSAke2lucHV0fSkKKyAgICBzZXQodGVzdE5hbWUgIiR7dGFyZ2V0fV8ke2lucHV0X25hbWV9IikKKyAgICBpZihFWElTVFMgIiR7VEVTVF9JTlBVVH0iKQorICAgICAgYWRkX3Rlc3QoTEFQQUNLLSR7dGVzdE5hbWV9ICIke0NNQUtFX0NPTU1BTkR9IgorICAgICAgICAtRFRFU1Q9JHtURVNUX0xPQ30KKyAgICAgICAgLURJTlBVVD0ke1RFU1RfSU5QVVR9IAorICAgICAgICAtRE9VVFBVVD0ke1RFU1RfT1VUUFVUfSAKKyAgICAgICAgLURJTlRESVI9JHtDTUFLRV9DRkdfSU5URElSfQorICAgICAgICAtUCAiJHtMQVBBQ0tfU09VUkNFX0RJUn0vdGVzdGluZy9ydW50ZXN0LmNtYWtlIikKKyAgICBlbmRpZigpCisgIGVuZG1hY3JvKGFkZF9sYXBhY2tfdGVzdCkKKworICBpZiAoQlVJTERfU0lOR0xFKQorICBhZGRfbGFwYWNrX3Rlc3Qoc3Rlc3Qub3V0IHN0ZXN0LmluIHhsaW50c3RzKQorICAjCisgICMgPT09PT09PT0gU0lOR0xFIFJGUCBMSU4gVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09CisgIGFkZF9sYXBhY2tfdGVzdChzdGVzdF9yZnAub3V0IHN0ZXN0X3JmcC5pbiB4bGludHN0cmZzKQorICAjCisgICMKKyAgIyA9PT09PT09PSBTSU5HTEUgRUlHIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAjCisKKyAgYWRkX2xhcGFja190ZXN0KHNuZXAub3V0IG5lcC5pbiB4ZWlndHN0cykKKworCisgIGFkZF9sYXBhY2tfdGVzdChzc2VwLm91dCBzZXAuaW4geGVpZ3RzdHMpCisKKworICBhZGRfbGFwYWNrX3Rlc3Qoc3N2ZC5vdXQgc3ZkLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNlYy5vdXQgc2VjLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNlZC5vdXQgc2VkLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNnZy5vdXQgc2dnLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNnZC5vdXQgc2dkLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNzYi5vdXQgc3NiLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNzZy5vdXQgc3NnLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNiYWwub3V0IHNiYWwuaW4geGVpZ3RzdHMpCisKKworICBhZGRfbGFwYWNrX3Rlc3Qoc2Jhay5vdXQgc2Jhay5pbiB4ZWlndHN0cykKKworCisgIGFkZF9sYXBhY2tfdGVzdChzZ2JhbC5vdXQgc2diYWwuaW4geGVpZ3RzdHMpCisKKworICBhZGRfbGFwYWNrX3Rlc3Qoc2diYWsub3V0IHNnYmFrLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNiYi5vdXQgc2JiLmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNnbG0ub3V0IGdsbS5pbiB4ZWlndHN0cykKKworCisgIGFkZF9sYXBhY2tfdGVzdChzZ3FyLm91dCBncXIuaW4geGVpZ3RzdHMpCisKKworICBhZGRfbGFwYWNrX3Rlc3Qoc2dzdi5vdXQgZ3N2LmluIHhlaWd0c3RzKQorCisKKyAgYWRkX2xhcGFja190ZXN0KHNjc2Qub3V0IGNzZC5pbiB4ZWlndHN0cykKKworCisgIGFkZF9sYXBhY2tfdGVzdChzbHNlLm91dCBsc2UuaW4geGVpZ3RzdHMpCisgIGVuZGlmKCkKKworICBpZiAoQlVJTERfRE9VQkxFKQorICAjCisgICMgPT09PT09PT0gRE9VQkxFIExJTiBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgYWRkX2xhcGFja190ZXN0KGR0ZXN0Lm91dCBkdGVzdC5pbiB4bGludHN0ZCkKKyAgIworICAjID09PT09PT09IERPVUJMRSBSRlAgTElOIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PQorICBhZGRfbGFwYWNrX3Rlc3QoZHRlc3RfcmZwLm91dCBkdGVzdF9yZnAuaW4geGxpbnRzdHJmZCkKKyAgIworICAjID09PT09PT09IERPVUJMRSBFSUcgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgYWRkX2xhcGFja190ZXN0KGRuZXAub3V0IG5lcC5pbiB4ZWlndHN0ZCkKKworCisgIGFkZF9sYXBhY2tfdGVzdChkc2VwLm91dCBzZXAuaW4geGVpZ3RzdGQpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoZHN2ZC5vdXQgc3ZkLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRlYy5vdXQgZGVjLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRlZC5vdXQgZGVkLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRnZy5vdXQgZGdnLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRnZC5vdXQgZGdkLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRzYi5vdXQgZHNiLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRzZy5vdXQgZHNnLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRiYWwub3V0IGRiYWwuaW4geGVpZ3RzdGQpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoZGJhay5vdXQgZGJhay5pbiB4ZWlndHN0ZCkKKworCisgIGFkZF9sYXBhY2tfdGVzdChkZ2JhbC5vdXQgZGdiYWwuaW4geGVpZ3RzdGQpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoZGdiYWsub3V0IGRnYmFrLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRiYi5vdXQgZGJiLmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRnbG0ub3V0IGdsbS5pbiB4ZWlndHN0ZCkKKworCisgIGFkZF9sYXBhY2tfdGVzdChkZ3FyLm91dCBncXIuaW4geGVpZ3RzdGQpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoZGdzdi5vdXQgZ3N2LmluIHhlaWd0c3RkKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGRjc2Qub3V0IGNzZC5pbiB4ZWlndHN0ZCkKKworCisgIGFkZF9sYXBhY2tfdGVzdChkbHNlLm91dCBsc2UuaW4geGVpZ3RzdGQpCisgIGVuZGlmKCkKKworICBpZiAoQlVJTERfQ09NUExFWCkKKyAgYWRkX2xhcGFja190ZXN0KGN0ZXN0Lm91dCBjdGVzdC5pbiB4bGludHN0YykKKyAgIworICAjID09PT09PT09IENPTVBMRVggUkZQIExJTiBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgYWRkX2xhcGFja190ZXN0KGN0ZXN0X3JmcC5vdXQgY3Rlc3RfcmZwLmluIHhsaW50c3RyZmMpCisgICMKKyAgIyA9PT09PT09PSBDT01QTEVYIEVJRyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBhZGRfbGFwYWNrX3Rlc3QoY25lcC5vdXQgbmVwLmluIHhlaWd0c3RjKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGNzZXAub3V0IHNlcC5pbiB4ZWlndHN0YykKKworCisgIGFkZF9sYXBhY2tfdGVzdChjc3ZkLm91dCBzdmQuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2VjLm91dCBjZWMuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2VkLm91dCBjZWQuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2dnLm91dCBjZ2cuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2dkLm91dCBjZ2QuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY3NiLm91dCBjc2IuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY3NnLm91dCBjc2cuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2JhbC5vdXQgY2JhbC5pbiB4ZWlndHN0YykKKworCisgIGFkZF9sYXBhY2tfdGVzdChjYmFrLm91dCBjYmFrLmluIHhlaWd0c3RjKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGNnYmFsLm91dCBjZ2JhbC5pbiB4ZWlndHN0YykKKworCisgIGFkZF9sYXBhY2tfdGVzdChjZ2Jhay5vdXQgY2diYWsuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2JiLm91dCBjYmIuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2dsbS5vdXQgZ2xtLmluIHhlaWd0c3RjKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGNncXIub3V0IGdxci5pbiB4ZWlndHN0YykKKworCisgIGFkZF9sYXBhY2tfdGVzdChjZ3N2Lm91dCBnc3YuaW4geGVpZ3RzdGMpCisKKworICBhZGRfbGFwYWNrX3Rlc3QoY2NzZC5vdXQgY3NkLmluIHhlaWd0c3RjKQorCisKKyAgYWRkX2xhcGFja190ZXN0KGNsc2Uub3V0IGxzZS5pbiB4ZWlndHN0YykKKyAgZW5kaWYoKQorCisgIGlmIChCVUlMRF9DT01QTEVYMTYpCisgICMKKyAgIyA9PT09PT09PSBDT01QTEVYMTYgTElOIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PQorICBhZGRfbGFwYWNrX3Rlc3QoenRlc3Qub3V0IHp0ZXN0LmluIHhsaW50c3R6KQorICAjCisgICMgPT09PT09PT0gQ09NUExFWDE2IFJGUCBMSU4gVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09CisgIGFkZF9sYXBhY2tfdGVzdCh6dGVzdF9yZnAub3V0IHp0ZXN0X3JmcC5pbiB4bGludHN0cmZ6KQorICAjCisgICMgPT09PT09PT0gQ09NUExFWDE2IEVJRyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBhZGRfbGFwYWNrX3Rlc3Qoem5lcC5vdXQgbmVwLmluIHhlaWd0c3R6KQorCisKKyAgYWRkX2xhcGFja190ZXN0KHpzZXAub3V0IHNlcC5pbiB4ZWlndHN0eikKKworCisgIGFkZF9sYXBhY2tfdGVzdCh6c3ZkLm91dCBzdmQuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemVjLm91dCB6ZWMuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemVkLm91dCB6ZWQuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemdnLm91dCB6Z2cuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemdkLm91dCB6Z2QuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoenNiLm91dCB6c2IuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoenNnLm91dCB6c2cuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemJhbC5vdXQgemJhbC5pbiB4ZWlndHN0eikKKworCisgIGFkZF9sYXBhY2tfdGVzdCh6YmFrLm91dCB6YmFrLmluIHhlaWd0c3R6KQorCisKKyAgYWRkX2xhcGFja190ZXN0KHpnYmFsLm91dCB6Z2JhbC5pbiB4ZWlndHN0eikKKworCisgIGFkZF9sYXBhY2tfdGVzdCh6Z2Jhay5vdXQgemdiYWsuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemJiLm91dCB6YmIuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemdsbS5vdXQgZ2xtLmluIHhlaWd0c3R6KQorCisKKyAgYWRkX2xhcGFja190ZXN0KHpncXIub3V0IGdxci5pbiB4ZWlndHN0eikKKworCisgIGFkZF9sYXBhY2tfdGVzdCh6Z3N2Lm91dCBnc3YuaW4geGVpZ3RzdHopCisKKworICBhZGRfbGFwYWNrX3Rlc3QoemNzZC5vdXQgY3NkLmluIHhlaWd0c3R6KQorCisKKyAgYWRkX2xhcGFja190ZXN0KHpsc2Uub3V0IGxzZS5pbiB4ZWlndHN0eikKKyAgZW5kaWYoKQorCisKKyAgaWYgKEJVSUxEX1NJTVBMRSkKKyAgICAgIGlmIChCVUlMRF9ET1VCTEUpCisgICMKKyAgIyA9PT09PT09PSBTSU5HTEUtRE9VQkxFIFBST1RPIExJTiBURVNUUyA9PT09PT09PT09PT09PQorICAgICAgICAgIGFkZF9sYXBhY2tfdGVzdChkc3Rlc3Qub3V0IGRzdGVzdC5pbiB4bGludHN0ZHMpCisgICAgICBlbmRpZigpCisgIGVuZGlmKCkKKworCisgIGlmIChCVUlMRF9DT01QTEVYKQorICAgICAgaWYgKEJVSUxEX0NPTVBMRVgxNikKKyAgIworICAjID09PT09PT09IENPTVBMRVgtQ09NUExFWDE2IExJTiBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBhZGRfbGFwYWNrX3Rlc3QoemN0ZXN0Lm91dCB6Y3Rlc3QuaW4geGxpbnRzdHpjKQorICAgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtMQVBBQ0tfU09VUkNFX0RJUn0vdGVzdGluZy9sYXBhY2tfdGVzdGluZy5weSAke0xBUEFDS19CSU5BUllfRElSfSkKKyAgYWRkX3Rlc3QoCisgICAgTkFNRSBMQVBBQ0tfVGVzdF9TdW1tYXJ5CisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtMQVBBQ0tfQklOQVJZX0RJUn0KKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICJsYXBhY2tfdGVzdGluZy5weSIKKyAgKQorCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2xhcGFjay9jaG9sZXNreS5jcHAgYi9sYXBhY2svY2hvbGVza3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2JjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibGFwYWNrX2NvbW1vbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorCisvLyBQT1RSRiBjb21wdXRlcyB0aGUgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBvZiBhIHJlYWwgc3ltbWV0cmljIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeCBBLgorRUlHRU5fTEFQQUNLX0ZVTkMocG90cmYsKGNoYXIqIHVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBpbnQgKmluZm8pKQoreworICAqaW5mbyA9IDA7CisgICAgICAgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAqaW5mbyA9IC0xOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgKmluZm8gPSAtMjsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICppbmZvID0gLTQ7CisgIGlmKCppbmZvIT0wKQorICB7CisgICAgaW50IGUgPSAtKmluZm87CisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJQT1RSRiIsICZlLCA2KTsKKyAgfQorCisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBNYXRyaXhUeXBlIEEoYSwqbiwqbiwqbGRhKTsKKyAgaW50IHJldDsKKyAgaWYoVVBMTygqdXBsbyk9PVVQKSByZXQgPSBpbnQoaW50ZXJuYWw6OmxsdF9pbnBsYWNlPFNjYWxhciwgVXBwZXI+OjpibG9ja2VkKEEpKTsKKyAgZWxzZSAgICAgICAgICAgICAgICByZXQgPSBpbnQoaW50ZXJuYWw6OmxsdF9pbnBsYWNlPFNjYWxhciwgTG93ZXI+OjpibG9ja2VkKEEpKTsKKworICBpZihyZXQ+PTApCisgICAgKmluZm8gPSByZXQrMTsKKyAgCisgIHJldHVybiAwOworfQorCisvLyBQT1RSUyBzb2x2ZXMgYSBzeXN0ZW0gb2YgbGluZWFyIGVxdWF0aW9ucyBBKlggPSBCIHdpdGggYSBzeW1tZXRyaWMKKy8vIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeCBBIHVzaW5nIHRoZSBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisvLyBBID0gVSoqVCpVIG9yIEEgPSBMKkwqKlQgY29tcHV0ZWQgYnkgRFBPVFJGLgorRUlHRU5fTEFQQUNLX0ZVTkMocG90cnMsKGNoYXIqIHVwbG8sIGludCAqbiwgaW50ICpucmhzLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmxkYiwgaW50ICppbmZvKSkKK3sKKyAgKmluZm8gPSAwOworICAgICAgICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgKmluZm8gPSAtMTsKKyAgZWxzZSAgaWYoKm48MCkgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCpucmhzPDApICAgICAgICAgICAgICAqaW5mbyA9IC0zOworICBlbHNlICBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgKmluZm8gPSAtNTsKKyAgZWxzZSAgaWYoKmxkYjxzdGQ6Om1heCgxLCpuKSkgICppbmZvID0gLTc7CisgIGlmKCppbmZvIT0wKQorICB7CisgICAgaW50IGUgPSAtKmluZm87CisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJQT1RSUyIsICZlLCA2KTsKKyAgfQorCisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgTWF0cml4VHlwZSBBKGEsKm4sKm4sKmxkYSk7CisgIE1hdHJpeFR5cGUgQihiLCpuLCpucmhzLCpsZGIpOworCisgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgeworICAgIEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuYWRqb2ludCgpLnNvbHZlSW5QbGFjZShCKTsKKyAgICBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlSW5QbGFjZShCKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlSW5QbGFjZShCKTsKKyAgICBBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLmFkam9pbnQoKS5zb2x2ZUluUGxhY2UoQik7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xhcGFjay9jbGFjZ3YuZiBiL2xhcGFjay9jbGFjZ3YuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTllYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2NsYWNndi5mCkBAIC0wLDAgKzEsMTE2IEBACisqPiBcYnJpZWYgXGIgQ0xBQ0dWCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgQ0xBQ0dWICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFjZ3YuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFjZ3YuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFjZ3YuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBDTEFDR1YoIE4sIFgsIElOQ1ggKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCAgICAgICAgICAgIFgoICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gQ0xBQ0dWIGNvbmp1Z2F0ZXMgYSBjb21wbGV4IHZlY3RvciBvZiBsZW5ndGggTi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIFguICBOID49IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFggaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAoMSsoTi0xKSphYnMoSU5DWCkpCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIHZlY3RvciBvZiBsZW5ndGggTiB0byBiZSBjb25qdWdhdGVkLgorKj4gICAgICAgICAgT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbiB3aXRoIGNvbmpnKFgpLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1ggaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIHNwYWNpbmcgYmV0d2VlbiBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIFguCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBDTEFDR1YoIE4sIFgsIElOQ1ggKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgTgorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFgoICogKQorKiAgICAgLi4KKyoKKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSU9GRgorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBDT05KRworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIElOQ1guRVEuMSApIFRIRU4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBOCisgICAgICAgICAgICBYKCBJICkgPSBDT05KRyggWCggSSApICkKKyAgIDEwICAgIENPTlRJTlVFCisgICAgICBFTFNFCisgICAgICAgICBJT0ZGID0gMQorICAgICAgICAgSUYoIElOQ1guTFQuMCApCisgICAgICQgICAgICBJT0ZGID0gMSAtICggTi0xICkqSU5DWAorICAgICAgICAgRE8gMjAgSSA9IDEsIE4KKyAgICAgICAgICAgIFgoIElPRkYgKSA9IENPTkpHKCBYKCBJT0ZGICkgKQorICAgICAgICAgICAgSU9GRiA9IElPRkYgKyBJTkNYCisgICAyMCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDTEFDR1YKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2NsYWRpdi5mIGIvbGFwYWNrL2NsYWRpdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDdhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svY2xhZGl2LmYKQEAgLTAsMCArMSw5NyBAQAorKj4gXGJyaWVmIFxiIENMQURJVgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIENMQURJViArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhZGl2LmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhZGl2LmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhZGl2LmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIENPTVBMRVggRlVOQ1RJT04gQ0xBRElWKCBYLCBZICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCAgICAgICAgICAgIFgsIFkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IENMQURJViA6PSBYIC8gWSwgd2hlcmUgWCBhbmQgWSBhcmUgY29tcGxleC4gIFRoZSBjb21wdXRhdGlvbiBvZiBYIC8gWQorKj4gd2lsbCBub3Qgb3ZlcmZsb3cgb24gYW4gaW50ZXJtZWRpYXJ5IHN0ZXAgdW5sZXNzIHRoZSByZXN1bHRzCisqPiBvdmVyZmxvd3MuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIENPTVBMRVgKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gWQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBZIGlzIENPTVBMRVgKKyo+ICAgICAgICAgIFRoZSBjb21wbGV4IHNjYWxhcnMgWCBhbmQgWS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXhPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBDT01QTEVYIEZVTkNUSU9OIENMQURJViggWCwgWSApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBYLCBZCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkksIFpSCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTEFESVYKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUlNQUcsIENNUExYLCBSRUFMCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBDQUxMIFNMQURJViggUkVBTCggWCApLCBBSU1BRyggWCApLCBSRUFMKCBZICksIEFJTUFHKCBZICksIFpSLAorICAgICAkICAgICAgICAgICAgIFpJICkKKyAgICAgIENMQURJViA9IENNUExYKCBaUiwgWkkgKQorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgQ0xBRElWCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9jbGFyZi5mIGIvbGFwYWNrL2NsYXJmLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMzI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9jbGFyZi5mCkBAIC0wLDAgKzEsMjMyIEBACisqPiBcYnJpZWYgXGIgQ0xBUkYKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBDTEFSRiArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhcmYuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFyZi5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2NsYXJmLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgQ0xBUkYoIFNJREUsIE0sIE4sIFYsIElOQ1YsIFRBVSwgQywgTERDLCBXT1JLICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgQ0hBUkFDVEVSICAgICAgICAgIFNJREUKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorKiAgICAgICBDT01QTEVYICAgICAgICAgICAgVEFVCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBDT01QTEVYICAgICAgICAgICAgQyggTERDLCAqICksIFYoICogKSwgV09SSyggKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBDTEFSRiBhcHBsaWVzIGEgY29tcGxleCBlbGVtZW50YXJ5IHJlZmxlY3RvciBIIHRvIGEgY29tcGxleCBNLWJ5LU4KKyo+IG1hdHJpeCBDLCBmcm9tIGVpdGhlciB0aGUgbGVmdCBvciB0aGUgcmlnaHQuIEggaXMgcmVwcmVzZW50ZWQgaW4gdGhlCisqPiBmb3JtCisqPgorKj4gICAgICAgSCA9IEkgLSB0YXUgKiB2ICogdioqSAorKj4KKyo+IHdoZXJlIHRhdSBpcyBhIGNvbXBsZXggc2NhbGFyIGFuZCB2IGlzIGEgY29tcGxleCB2ZWN0b3IuCisqPgorKj4gSWYgdGF1ID0gMCwgdGhlbiBIIGlzIHRha2VuIHRvIGJlIHRoZSB1bml0IG1hdHJpeC4KKyo+CisqPiBUbyBhcHBseSBIKipIICh0aGUgY29uanVnYXRlIHRyYW5zcG9zZSBvZiBIKSwgc3VwcGx5IGNvbmpnKHRhdSkgaW5zdGVhZAorKj4gdGF1LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGZvcm0gIEggKiBDCisqPiAgICAgICAgICA9ICdSJzogZm9ybSAgQyAqIEgKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFYgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICgxICsgKE0tMSkqYWJzKElOQ1YpKSBpZiBTSURFID0gJ0wnCisqPiAgICAgICAgICAgICAgICAgIG9yICgxICsgKE4tMSkqYWJzKElOQ1YpKSBpZiBTSURFID0gJ1InCisqPiAgICAgICAgICBUaGUgdmVjdG9yIHYgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIEguIFYgaXMgbm90IHVzZWQgaWYKKyo+ICAgICAgICAgIFRBVSA9IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIElOQ1YKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgSU5DViBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgaW5jcmVtZW50IGJldHdlZW4gZWxlbWVudHMgb2Ygdi4gSU5DViA8PiAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBUQVUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVEFVIGlzIENPTVBMRVgKKyo+ICAgICAgICAgIFRoZSB2YWx1ZSB0YXUgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIEguCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEMgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uIChMREMsTikKKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgTS1ieS1OIG1hdHJpeCBDLgorKj4gICAgICAgICAgT24gZXhpdCwgQyBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbWF0cml4IEggKiBDIGlmIFNJREUgPSAnTCcsCisqPiAgICAgICAgICBvciBDICogSCBpZiBTSURFID0gJ1InLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERDIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQy4gTERDID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBXT1JLIGlzIENPTVBMRVggYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgKE4pIGlmIFNJREUgPSAnTCcKKyo+ICAgICAgICAgICAgICAgICAgICAgIG9yIChNKSBpZiBTSURFID0gJ1InCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBDTEFSRiggU0lERSwgTSwgTiwgViwgSU5DViwgVEFVLCBDLCBMREMsIFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgU0lERQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFRBVQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEMoIExEQywgKiApLCBWKCAqICksIFdPUksoICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gKCAxLjBFKzAsIDAuMEUrMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFpFUk8gPSAoIDAuMEUrMCwgMC4wRSswICkgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBBUFBMWUxFRlQKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBMQVNUViwgTEFTVEMKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENHRU1WLCBDR0VSQworKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSUxBQ0xSLCBJTEFDTEMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRSwgSUxBQ0xSLCBJTEFDTEMKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIEFQUExZTEVGVCA9IExTQU1FKCBTSURFLCAnTCcgKQorICAgICAgTEFTVFYgPSAwCisgICAgICBMQVNUQyA9IDAKKyAgICAgIElGKCBUQVUuTkUuWkVSTyApIFRIRU4KKyEgICAgIFNldCB1cCB2YXJpYWJsZXMgZm9yIHNjYW5uaW5nIFYuICBMQVNUViBiZWdpbnMgcG9pbnRpbmcgdG8gdGhlIGVuZAorISAgICAgb2YgVi4KKyAgICAgICAgIElGKCBBUFBMWUxFRlQgKSBUSEVOCisgICAgICAgICAgICBMQVNUViA9IE0KKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBU1RWID0gTgorICAgICAgICAgRU5EIElGCisgICAgICAgICBJRiggSU5DVi5HVC4wICkgVEhFTgorICAgICAgICAgICAgSSA9IDEgKyAoTEFTVFYtMSkgKiBJTkNWCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBJID0gMQorICAgICAgICAgRU5EIElGCishICAgICBMb29rIGZvciB0aGUgbGFzdCBub24temVybyByb3cgaW4gVi4KKyAgICAgICAgIERPIFdISUxFKCBMQVNUVi5HVC4wIC5BTkQuIFYoIEkgKS5FUS5aRVJPICkKKyAgICAgICAgICAgIExBU1RWID0gTEFTVFYgLSAxCisgICAgICAgICAgICBJID0gSSAtIElOQ1YKKyAgICAgICAgIEVORCBETworICAgICAgICAgSUYoIEFQUExZTEVGVCApIFRIRU4KKyEgICAgIFNjYW4gZm9yIHRoZSBsYXN0IG5vbi16ZXJvIGNvbHVtbiBpbiBDKDE6bGFzdHYsOikuCisgICAgICAgICAgICBMQVNUQyA9IElMQUNMQyhMQVNUViwgTiwgQywgTERDKQorICAgICAgICAgRUxTRQorISAgICAgU2NhbiBmb3IgdGhlIGxhc3Qgbm9uLXplcm8gcm93IGluIEMoOiwxOmxhc3R2KS4KKyAgICAgICAgICAgIExBU1RDID0gSUxBQ0xSKE0sIExBU1RWLCBDLCBMREMpCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorISAgICAgTm90ZSB0aGF0IGxhc3RjLmVxLjAgcmVuZGVycyB0aGUgQkxBUyBvcGVyYXRpb25zIG51bGw7IG5vIHNwZWNpYWwKKyEgICAgIGNhc2UgaXMgbmVlZGVkIGF0IHRoaXMgbGV2ZWwuCisgICAgICBJRiggQVBQTFlMRUZUICkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgSCAqIEMKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0diwxOmxhc3RjKSoqSCAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBDR0VNViggJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUViwgTEFTVEMsIE9ORSwKKyAgICAgJCAgICAgICAgICAgQywgTERDLCBWLCBJTkNWLCBaRVJPLCBXT1JLLCAxICkKKyoKKyogICAgICAgICAgIEMoMTpsYXN0diwxOmxhc3RjKSA6PSBDKC4uLikgLSB2KDE6bGFzdHYsMSkgKiB3KDE6bGFzdGMsMSkqKkgKKyoKKyAgICAgICAgICAgIENBTEwgQ0dFUkMoIExBU1RWLCBMQVNUQywgLVRBVSwgViwgSU5DViwgV09SSywgMSwgQywgTERDICkKKyAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQyAqIEgKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0YywxOmxhc3R2KSAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBDR0VNViggJ05vIHRyYW5zcG9zZScsIExBU1RDLCBMQVNUViwgT05FLCBDLCBMREMsCisgICAgICQgICAgICAgICAgIFYsIElOQ1YsIFpFUk8sIFdPUkssIDEgKQorKgorKiAgICAgICAgICAgQygxOmxhc3RjLDE6bGFzdHYpIDo9IEMoLi4uKSAtIHcoMTpsYXN0YywxKSAqIHYoMTpsYXN0diwxKSoqSAorKgorICAgICAgICAgICAgQ0FMTCBDR0VSQyggTEFTVEMsIExBU1RWLCAtVEFVLCBXT1JLLCAxLCBWLCBJTkNWLCBDLCBMREMgKQorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENMQVJGCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9jbGFyZmIuZiBiL2xhcGFjay9jbGFyZmIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGJiZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2NsYXJmYi5mCkBAIC0wLDAgKzEsNzcxIEBACisqPiBcYnJpZWYgXGIgQ0xBUkZCCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgQ0xBUkZCICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFyZmIuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFyZmIuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9jbGFyZmIuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBDTEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgTERULCBDLCBMREMsIFdPUkssIExEV09SSyApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNJREUsIFNUT1JFViwgVFJBTlMKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEQywgTERULCBMRFYsIExEV09SSywgTSwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCAgICAgICAgICAgIEMoIExEQywgKiApLCBUKCBMRFQsICogKSwgViggTERWLCAqICksCisqICAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gQ0xBUkZCIGFwcGxpZXMgYSBjb21wbGV4IGJsb2NrIHJlZmxlY3RvciBIIG9yIGl0cyB0cmFuc3Bvc2UgSCoqSCB0byBhCisqPiBjb21wbGV4IE0tYnktTiBtYXRyaXggQywgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGFwcGx5IEggb3IgSCoqSCBmcm9tIHRoZSBMZWZ0CisqPiAgICAgICAgICA9ICdSJzogYXBwbHkgSCBvciBIKipIIGZyb20gdGhlIFJpZ2h0CisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRSQU5TCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRSQU5TIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICA9ICdOJzogYXBwbHkgSCAoTm8gdHJhbnNwb3NlKQorKj4gICAgICAgICAgPSAnQyc6IGFwcGx5IEgqKkggKENvbmp1Z2F0ZSB0cmFuc3Bvc2UpCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIERJUkVDVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBESVJFQ1QgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIEluZGljYXRlcyBob3cgSCBpcyBmb3JtZWQgZnJvbSBhIHByb2R1Y3Qgb2YgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9ycworKj4gICAgICAgICAgPSAnRic6IEggPSBIKDEpIEgoMikgLiAuIC4gSChrKSAoRm9yd2FyZCkKKyo+ICAgICAgICAgID0gJ0InOiBIID0gSChrKSAuIC4gLiBIKDIpIEgoMSkgKEJhY2t3YXJkKQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBTVE9SRVYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU1RPUkVWIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICBJbmRpY2F0ZXMgaG93IHRoZSB2ZWN0b3JzIHdoaWNoIGRlZmluZSB0aGUgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9ycyBhcmUgc3RvcmVkOgorKj4gICAgICAgICAgPSAnQyc6IENvbHVtbndpc2UKKyo+ICAgICAgICAgID0gJ1InOiBSb3d3aXNlCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBLIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgbWF0cml4IFQgKD0gdGhlIG51bWJlciBvZiBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzIHdob3NlIHByb2R1Y3QgZGVmaW5lcyB0aGUgYmxvY2sgcmVmbGVjdG9yKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIENPTVBMRVggYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsSykgaWYgU1RPUkVWID0gJ0MnCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixNKSBpZiBTVE9SRVYgPSAnUicgYW5kIFNJREUgPSAnTCcKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLE4pIGlmIFNUT1JFViA9ICdSJyBhbmQgU0lERSA9ICdSJworKj4gICAgICAgICAgVGhlIG1hdHJpeCBWLiBTZWUgRnVydGhlciBEZXRhaWxzLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERWIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgVi4KKyo+ICAgICAgICAgIElmIFNUT1JFViA9ICdDJyBhbmQgU0lERSA9ICdMJywgTERWID49IG1heCgxLE0pOworKj4gICAgICAgICAgaWYgU1RPUkVWID0gJ0MnIGFuZCBTSURFID0gJ1InLCBMRFYgPj0gbWF4KDEsTik7CisqPiAgICAgICAgICBpZiBTVE9SRVYgPSAnUicsIExEViA+PSBLLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFQgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uIChMRFQsSykKKyo+ICAgICAgICAgIFRoZSB0cmlhbmd1bGFyIEstYnktSyBtYXRyaXggVCBpbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCisqPiAgICAgICAgICBibG9jayByZWZsZWN0b3IuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFQgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBULiBMRFQgPj0gSy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbixvdXRdIEMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQyBpcyBDT01QTEVYIGFycmF5LCBkaW1lbnNpb24gKExEQyxOKQorKj4gICAgICAgICAgT24gZW50cnksIHRoZSBNLWJ5LU4gbWF0cml4IEMuCisqPiAgICAgICAgICBPbiBleGl0LCBDIGlzIG92ZXJ3cml0dGVuIGJ5IEgqQyBvciBIKipIKkMgb3IgQypIIG9yIEMqSCoqSC4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEQyBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IEMuIExEQyA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFdPUksKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgV09SSyBpcyBDT01QTEVYIGFycmF5LCBkaW1lbnNpb24gKExEV09SSyxLKQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFdPUksKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERXT1JLIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgV09SSy4KKyo+ICAgICAgICAgIElmIFNJREUgPSAnTCcsIExEV09SSyA+PSBtYXgoMSxOKTsKKyo+ICAgICAgICAgIGlmIFNJREUgPSAnUicsIExEV09SSyA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXhPVEhFUmF1eGlsaWFyeQorKgorKj4gXHBhciBGdXJ0aGVyIERldGFpbHM6CisqICA9PT09PT09PT09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiAgVGhlIHNoYXBlIG9mIHRoZSBtYXRyaXggViBhbmQgdGhlIHN0b3JhZ2Ugb2YgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lCisqPiAgdGhlIEgoaSkgaXMgYmVzdCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2l0aCBuID0gNSBhbmQKKyo+ICBrID0gMy4gVGhlIGVsZW1lbnRzIGVxdWFsIHRvIDEgYXJlIG5vdCBzdG9yZWQ7IHRoZSBjb3JyZXNwb25kaW5nCisqPiAgYXJyYXkgZWxlbWVudHMgYXJlIG1vZGlmaWVkIGJ1dCByZXN0b3JlZCBvbiBleGl0LiBUaGUgcmVzdCBvZiB0aGUKKyo+ICBhcnJheSBpcyBub3QgdXNlZC4KKyo+CisqPiAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCAgMSAgICAgICApICAgICAgICAgICAgICAgICBWID0gKCAgMSB2MSB2MSB2MSB2MSApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxICAxICAgICkgICAgICAgICAgICAgICAgICAgICAoICAgICAxIHYyIHYyIHYyICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgIDEgKSAgICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgdjMgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+CisqPiAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICBWID0gKCB2MSB2MSAgMSAgICAgICApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYyIHYyIHYyICAxICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggIDEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjMgdjMgdjMgdjMgIDEgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAgICAxICkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBDTEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICAgIFQsIExEVCwgQywgTERDLCBXT1JLLCBMRFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgRElSRUNULCBTSURFLCBTVE9SRVYsIFRSQU5TCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSywgTERDLCBMRFQsIExEViwgTERXT1JLLCBNLCBOCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQyggTERDLCAqICksIFQoIExEVCwgKiApLCBWKCBMRFYsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gKCAxLjBFKzAsIDAuMEUrMCApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgVFJBTlNUCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgTEFTVFYsIExBU1RDCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNBTUUKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTEFDTFIsIElMQUNMQworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTQU1FLCBJTEFDTFIsIElMQUNMQworKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0NPUFksIENHRU1NLCBDTEFDR1YsIENUUk1NCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENPTkpHCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUKKyoKKyAgICAgIElGKCBNLkxFLjAgLk9SLiBOLkxFLjAgKQorICAgICAkICAgUkVUVVJOCisqCisgICAgICBJRiggTFNBTUUoIFRSQU5TLCAnTicgKSApIFRIRU4KKyAgICAgICAgIFRSQU5TVCA9ICdDJworICAgICAgRUxTRQorICAgICAgICAgVFJBTlNUID0gJ04nCisgICAgICBFTkQgSUYKKyoKKyAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyoKKyAgICAgICAgIElGKCBMU0FNRSggRElSRUNULCAnRicgKSApIFRIRU4KKyoKKyogICAgICAgICAgIExldCAgViA9ICAoIFYxICkgICAgKGZpcnN0IEsgcm93cykKKyogICAgICAgICAgICAgICAgICAgICAoIFYyICkKKyogICAgICAgICAgIHdoZXJlICBWMSAgaXMgdW5pdCBsb3dlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqSCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQUNMUiggTSwgSywgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFDTEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipIICogViAgPSAgKEMxKipIICogVjEgKyBDMioqSCAqIFYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMSoqSAorKgorICAgICAgICAgICAgICAgRE8gMTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0NPUFkoIExBU1RDLCBDKCBKLCAxICksIExEQywgV09SSyggMSwgSiApLCAxICkKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0xBQ0dWKCBMQVNUQywgV09SSyggMSwgSiApLCAxICkKKyAgIDEwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMioqSCAqVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLCBPTkUsIEMoIEsrMSwgMSApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgIFYoIEsrMSwgMSApLCBMRFYsIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCoqSCAgb3IgIFcgKiBUCisqCisgICAgICAgICAgICAgICBDQUxMIENUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCBUUkFOU1QsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFYgKiBXKipICisqCisgICAgICAgICAgICAgICBJRiggTS5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBWMiAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RWLUssIExBU1RDLCBLLCAtT05FLCBWKCBLKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBXT1JLLCBMRFdPUkssIE9ORSwgQyggSysxLCAxICksIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxKipICisqCisgICAgICAgICAgICAgICBDQUxMIENUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICdVbml0JywgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXKipICisqCisgICAgICAgICAgICAgICBETyAzMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBKLCBJICkgPSBDKCBKLCBJICkgLSBDT05KRyggV09SSyggSSwgSiApICkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAzMCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqSCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBQ0xSKCBOLCBLLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQUNMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWICA9ICAoQzEqVjEgKyBDMipWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEKKyoKKyAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIENDT1BZKCBMQVNUQywgQyggMSwgSiApLCAxLCBXT1JLKCAxLCBKICksIDEgKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxCisqCisgICAgICAgICAgICAgICBDQUxMIENUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyICogVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggMSwgSysxICksIExEQywgViggSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUICBvciAgVyAqIFQqKkgKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TLCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBXICogVioqSAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNTSggJ05vIHRyYW5zcG9zZScsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFdPUkssIExEV09SSywgViggSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCAxLCBLKzEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEqKkgKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdMb3dlcicsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgJ1VuaXQnLCBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMSA6PSBDMSAtIFcKKyoKKyAgICAgICAgICAgICAgIERPIDYwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEksIEogKSA9IEMoIEksIEogKSAtIFdPUksoIEksIEogKQorICAgNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDYwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIEVMU0UKKyoKKyogICAgICAgICAgIExldCAgViA9ICAoIFYxICkKKyogICAgICAgICAgICAgICAgICAgICAoIFYyICkgICAgKGxhc3QgSyByb3dzKQorKiAgICAgICAgICAgd2hlcmUgIFYyICBpcyB1bml0IHVwcGVyIHRyaWFuZ3VsYXIuCisqCisgICAgICAgICAgICBJRiggTFNBTUUoIFNJREUsICdMJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgSCAqIEMgIG9yICBIKipIICogQyAgd2hlcmUgIEMgPSAoIEMxICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBQ0xSKCBNLCBLLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQUNMQyggTEFTVFYsIE4sIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMqKkggKiBWICA9ICAoQzEqKkggKiBWMSArIEMyKipIICogVjIpICAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMyKipICisqCisgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBDQ09QWSggTEFTVEMsIEMoIExBU1RWLUsrSiwgMSApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgICAgICAgICAgICAgICAgICBDQUxMIENMQUNHViggTEFTVEMsIFdPUksoIDEsIEogKSwgMSApCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxKipIKlYxCisqCisgICAgICAgICAgICAgICAgICBDQUxMIENHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywgT05FLCBDLCBMREMsIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipIICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdMb3dlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gViAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBWMSAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RWLUssIExBU1RDLCBLLCAtT05FLCBWLCBMRFYsIFdPUkssIExEV09SSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcqKkgKKyoKKyAgICAgICAgICAgICAgIERPIDkwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIExBU1RWLUsrSiwgSSApID0gQyggTEFTVFYtSytKLCBJICkgLQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkpHKCBXT1JLKCBJLCBKICkgKQorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipIICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFDTFIoIE4sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBQ0xSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYgID0gIChDMSpWMSArIEMyKlYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMgorKgorICAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIENDT1BZKCBMQVNUQywgQyggMSwgTEFTVFYtSytKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgIDEwMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxICogVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQywgTERDLCBWLCBMRFYsIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipICisqCisgICAgICAgICAgICAgICBDQUxMIENUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXICogVjEqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBMQVNUVi1LLCBLLCAtT05FLCBXT1JLLCBMRFdPUkssIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcKKyoKKyAgICAgICAgICAgICAgIERPIDEyMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgTEFTVFYtSytKICkgPSBDKCBJLCBMQVNUVi1LK0ogKQorICAgICAkICAgICAgICAgICAgICAgICAgICAtIFdPUksoIEksIEogKQorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTIwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBJRgorKgorICAgICAgRUxTRSBJRiggTFNBTUUoIFNUT1JFViwgJ1InICkgKSBUSEVOCisqCisgICAgICAgICBJRiggTFNBTUUoIERJUkVDVCwgJ0YnICkgKSBUSEVOCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSAgVjIgKSAgICAoVjE6IGZpcnN0IEsgY29sdW1ucykKKyogICAgICAgICAgIHdoZXJlICBWMSAgaXMgdW5pdCB1cHBlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqSCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQUNMQyggSywgTSwgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFDTEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipIICogVioqSCAgPSAgKEMxKipIICogVjEqKkggKyBDMioqSCAqIFYyKipIKSAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMxKipICisqCisgICAgICAgICAgICAgICBETyAxMzAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0NPUFkoIExBU1RDLCBDKCBKLCAxICksIExEQywgV09SSyggMSwgSiApLCAxICkKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0xBQ0dWKCBMQVNUQywgV09SSyggMSwgSiApLCAxICkKKyAgMTMwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgJ1VuaXQnLCBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyKipIKlYyKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIENHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgICdDb25qdWdhdGUgdHJhbnNwb3NlJywgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggSysxLCAxICksIExEQywgViggMSwgSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipIICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVioqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBWMioqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUVi1LLCBMQVNUQywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgViggMSwgSysxICksIExEViwgV09SSywgTERXT1JLLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIEsrMSwgMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXKipICisqCisgICAgICAgICAgICAgICBETyAxNTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDE0MCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEosIEkgKSA9IEMoIEosIEkgKSAtIENPTkpHKCBXT1JLKCBJLCBKICkgKQorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTUwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipIICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFDTEMoIEssIE4sIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBQ0xSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYqKkggID0gIChDMSpWMSoqSCArIEMyKlYyKipIKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMQorKgorICAgICAgICAgICAgICAgRE8gMTYwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIENDT1BZKCBMQVNUQywgQyggMSwgSiApLCAxLCBXT1JLKCAxLCBKICksIDEgKQorICAxNjAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxKipICisqCisgICAgICAgICAgICAgICBDQUxMIENUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzIgKiBWMioqSAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNTSggJ05vIHRyYW5zcG9zZScsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQyggMSwgSysxICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgViggMSwgSysxICksIExEViwgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUICBvciAgVyAqIFQqKkgKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TLCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBXICogVgorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcgKiBWMgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNTSggJ05vIHRyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgTEFTVFYtSywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgV09SSywgTERXT1JLLCBWKCAxLCBLKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIDEsIEsrMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXCisqCisgICAgICAgICAgICAgICBETyAxODAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDE3MCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEksIEogKSA9IEMoIEksIEogKSAtIFdPUksoIEksIEogKQorICAxNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTgwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIEVMU0UKKyoKKyogICAgICAgICAgIExldCAgViA9ICAoIFYxICBWMiApICAgIChWMjogbGFzdCBLIGNvbHVtbnMpCisqICAgICAgICAgICB3aGVyZSAgVjIgIGlzIHVuaXQgbG93ZXIgdHJpYW5ndWxhci4KKyoKKyAgICAgICAgICAgIElGKCBMU0FNRSggU0lERSwgJ0wnICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBIICogQyAgb3IgIEgqKkggKiBDICB3aGVyZSAgQyA9ICggQzEgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFDTEMoIEssIE0sIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBQ0xDKCBMQVNUViwgTiwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyoqSCAqIFYqKkggID0gIChDMSoqSCAqIFYxKipIICsgQzIqKkggKiBWMioqSCkgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMioqSAorKgorICAgICAgICAgICAgICAgRE8gMTkwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIENDT1BZKCBMQVNUQywgQyggTEFTVFYtSytKLCAxICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgV09SSyggMSwgSiApLCAxICkKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0xBQ0dWKCBMQVNUQywgV09SSyggMSwgSiApLCAxICkKKyAgMTkwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxKipIICogVjEqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUQywgSywgTEFTVFYtSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMsIFYsIExEViwgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipIICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdMb3dlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVioqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBWMSoqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUVi1LLCBMQVNUQywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgViwgTERWLCBXT1JLLCBMRFdPUkssIE9ORSwgQywgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgQ1RSTU0oICdSaWdodCcsICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcqKkgKKyoKKyAgICAgICAgICAgICAgIERPIDIxMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMjAwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggTEFTVFYtSytKLCBJICkgPSBDKCBMQVNUVi1LK0osIEkgKSAtCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OSkcoIFdPUksoIEksIEogKSApCisgIDIwMCAgICAgICAgICAgICBDT05USU5VRQorICAyMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVMU0UgSUYoIExTQU1FKCBTSURFLCAnUicgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEMgKiBIICBvciAgQyAqIEgqKkggIHdoZXJlICBDID0gKCBDMSAgQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQUNMQyggSywgTiwgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFDTFIoIE0sIExBU1RWLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDICogVioqSCAgPSAgKEMxKlYxKipIICsgQzIqVjIqKkgpICAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMyCisqCisgICAgICAgICAgICAgICBETyAyMjAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0NPUFkoIExBU1RDLCBDKCAxLCBMQVNUVi1LK0ogKSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgV09SSyggMSwgSiApLCAxICkKKyAgMjIwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxICogVjEqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLCBPTkUsIEMsIExEQywgViwgTERWLCBPTkUsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQgIG9yICBXICogVCoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgVFJBTlMsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFcgKiBWCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMxIDo9IEMxIC0gVyAqIFYxCisqCisgICAgICAgICAgICAgICAgICBDQUxMIENHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBMQVNUVi1LLCBLLCAtT05FLCBXT1JLLCBMRFdPUkssIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggMSwgTEFTVFYtSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gMjQwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAyMzAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBJLCBMQVNUVi1LK0ogKSA9IEMoIEksIExBU1RWLUsrSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgIC0gV09SSyggSSwgSiApCisgIDIzMCAgICAgICAgICAgICBDT05USU5VRQorICAyNDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENMQVJGQgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svY2xhcmZnLmYgYi9sYXBhY2svY2xhcmZnLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ZjM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9jbGFyZmcuZgpAQCAtMCwwICsxLDIwMyBAQAorKj4gXGJyaWVmIFxiIENMQVJGRworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIENMQVJGRyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhcmZnLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhcmZnLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvY2xhcmZnLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgQ0xBUkZHKCBOLCBBTFBIQSwgWCwgSU5DWCwgVEFVICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIE4KKyogICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBUQVUKKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIENPTVBMRVggICAgICAgICAgICBYKCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IENMQVJGRyBnZW5lcmF0ZXMgYSBjb21wbGV4IGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggb2Ygb3JkZXIgbiwgc3VjaAorKj4gdGhhdAorKj4KKyo+ICAgICAgIEgqKkggKiAoIGFscGhhICkgPSAoIGJldGEgKSwgICBIKipIICogSCA9IEkuCisqPiAgICAgICAgICAgICAgKCAgIHggICApICAgKCAgIDAgICkKKyo+CisqPiB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgd2l0aCBiZXRhIHJlYWwsIGFuZCB4IGlzIGFuCisqPiAobi0xKS1lbGVtZW50IGNvbXBsZXggdmVjdG9yLiBIIGlzIHJlcHJlc2VudGVkIGluIHRoZSBmb3JtCisqPgorKj4gICAgICAgSCA9IEkgLSB0YXUgKiAoIDEgKSAqICggMSB2KipIICkgLAorKj4gICAgICAgICAgICAgICAgICAgICAoIHYgKQorKj4KKyo+IHdoZXJlIHRhdSBpcyBhIGNvbXBsZXggc2NhbGFyIGFuZCB2IGlzIGEgY29tcGxleCAobi0xKS1lbGVtZW50CisqPiB2ZWN0b3IuIE5vdGUgdGhhdCBIIGlzIG5vdCBoZXJtaXRpYW4uCisqPgorKj4gSWYgdGhlIGVsZW1lbnRzIG9mIHggYXJlIGFsbCB6ZXJvIGFuZCBhbHBoYSBpcyByZWFsLCB0aGVuIHRhdSA9IDAKKyo+IGFuZCBIIGlzIHRha2VuIHRvIGJlIHRoZSB1bml0IG1hdHJpeC4KKyo+CisqPiBPdGhlcndpc2UgIDEgPD0gcmVhbCh0YXUpIDw9IDIgIGFuZCAgYWJzKHRhdS0xKSA8PSAxIC4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3Rvci4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbixvdXRdIEFMUEhBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEFMUEhBIGlzIENPTVBMRVgKKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgdmFsdWUgYWxwaGEuCisqPiAgICAgICAgICBPbiBleGl0LCBpdCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSB2YWx1ZSBiZXRhLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIENPTVBMRVggYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgKDErKE4tMikqYWJzKElOQ1gpKQorKj4gICAgICAgICAgT24gZW50cnksIHRoZSB2ZWN0b3IgeC4KKyo+ICAgICAgICAgIE9uIGV4aXQsIGl0IGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHZlY3RvciB2LgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1ggaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGluY3JlbWVudCBiZXR3ZWVuIGVsZW1lbnRzIG9mIFguIElOQ1ggPiAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBDT01QTEVYCisqPiAgICAgICAgICBUaGUgdmFsdWUgdGF1LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgY29tcGxleE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgQ0xBUkZHKCBOLCBBTFBIQSwgWCwgSU5DWCwgVEFVICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIE4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgVEFVCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWCggKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgT05FLCBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAxLjBFKzAsIFpFUk8gPSAwLjBFKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBKLCBLTlQKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBISSwgQUxQSFIsIEJFVEEsIFJTQUZNTiwgU0FGTUlOLCBYTk9STQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNDTlJNMiwgU0xBTUNILCBTTEFQWTMKKyAgICAgIENPTVBMRVggICAgICAgICAgICBDTEFESVYKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTQ05STTIsIFNMQU1DSCwgU0xBUFkzLCBDTEFESVYKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBBSU1BRywgQ01QTFgsIFJFQUwsIFNJR04KKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENTQ0FMLCBDU1NDQUwKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIElGKCBOLkxFLjAgKSBUSEVOCisgICAgICAgICBUQVUgPSBaRVJPCisgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorICAgICAgWE5PUk0gPSBTQ05STTIoIE4tMSwgWCwgSU5DWCApCisgICAgICBBTFBIUiA9IFJFQUwoIEFMUEhBICkKKyAgICAgIEFMUEhJID0gQUlNQUcoIEFMUEhBICkKKyoKKyAgICAgIElGKCBYTk9STS5FUS5aRVJPIC5BTkQuIEFMUEhJLkVRLlpFUk8gKSBUSEVOCisqCisqICAgICAgICBIICA9ICBJCisqCisgICAgICAgICBUQVUgPSBaRVJPCisgICAgICBFTFNFCisqCisqICAgICAgICBnZW5lcmFsIGNhc2UKKyoKKyAgICAgICAgIEJFVEEgPSAtU0lHTiggU0xBUFkzKCBBTFBIUiwgQUxQSEksIFhOT1JNICksIEFMUEhSICkKKyAgICAgICAgIFNBRk1JTiA9IFNMQU1DSCggJ1MnICkgLyBTTEFNQ0goICdFJyApCisgICAgICAgICBSU0FGTU4gPSBPTkUgLyBTQUZNSU4KKyoKKyAgICAgICAgIEtOVCA9IDAKKyAgICAgICAgIElGKCBBQlMoIEJFVEEgKS5MVC5TQUZNSU4gKSBUSEVOCisqCisqICAgICAgICAgICBYTk9STSwgQkVUQSBtYXkgYmUgaW5hY2N1cmF0ZTsgc2NhbGUgWCBhbmQgcmVjb21wdXRlIHRoZW0KKyoKKyAgIDEwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBLTlQgPSBLTlQgKyAxCisgICAgICAgICAgICBDQUxMIENTU0NBTCggTi0xLCBSU0FGTU4sIFgsIElOQ1ggKQorICAgICAgICAgICAgQkVUQSA9IEJFVEEqUlNBRk1OCisgICAgICAgICAgICBBTFBISSA9IEFMUEhJKlJTQUZNTgorICAgICAgICAgICAgQUxQSFIgPSBBTFBIUipSU0FGTU4KKyAgICAgICAgICAgIElGKCBBQlMoIEJFVEEgKS5MVC5TQUZNSU4gKQorICAgICAkICAgICAgICAgR08gVE8gMTAKKyoKKyogICAgICAgICAgIE5ldyBCRVRBIGlzIGF0IG1vc3QgMSwgYXQgbGVhc3QgU0FGTUlOCisqCisgICAgICAgICAgICBYTk9STSA9IFNDTlJNMiggTi0xLCBYLCBJTkNYICkKKyAgICAgICAgICAgIEFMUEhBID0gQ01QTFgoIEFMUEhSLCBBTFBISSApCisgICAgICAgICAgICBCRVRBID0gLVNJR04oIFNMQVBZMyggQUxQSFIsIEFMUEhJLCBYTk9STSApLCBBTFBIUiApCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFRBVSA9IENNUExYKCAoIEJFVEEtQUxQSFIgKSAvIEJFVEEsIC1BTFBISSAvIEJFVEEgKQorICAgICAgICAgQUxQSEEgPSBDTEFESVYoIENNUExYKCBPTkUgKSwgQUxQSEEtQkVUQSApCisgICAgICAgICBDQUxMIENTQ0FMKCBOLTEsIEFMUEhBLCBYLCBJTkNYICkKKyoKKyogICAgICAgIElmIEFMUEhBIGlzIHN1Ym5vcm1hbCwgaXQgbWF5IGxvc2UgcmVsYXRpdmUgYWNjdXJhY3kKKyoKKyAgICAgICAgIERPIDIwIEogPSAxLCBLTlQKKyAgICAgICAgICAgIEJFVEEgPSBCRVRBKlNBRk1JTgorIDIwICAgICAgQ09OVElOVUUKKyAgICAgICAgIEFMUEhBID0gQkVUQQorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDTEFSRkcKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2NsYXJmdC5mIGIvbGFwYWNrL2NsYXJmdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTQ0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svY2xhcmZ0LmYKQEAgLTAsMCArMSwzMjggQEAKKyo+IFxicmllZiBcYiBDTEFSRlQKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBDTEFSRlQgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2NsYXJmdC5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2NsYXJmdC5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2NsYXJmdC5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBTVUJST1VUSU5FIENMQVJGVCggRElSRUNULCBTVE9SRVYsIE4sIEssIFYsIExEViwgVEFVLCBULCBMRFQgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBDSEFSQUNURVIgICAgICAgICAgRElSRUNULCBTVE9SRVYKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEVCwgTERWLCBOCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBDT01QTEVYICAgICAgICAgICAgVCggTERULCAqICksIFRBVSggKiApLCBWKCBMRFYsICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gQ0xBUkZUIGZvcm1zIHRoZSB0cmlhbmd1bGFyIGZhY3RvciBUIG9mIGEgY29tcGxleCBibG9jayByZWZsZWN0b3IgSAorKj4gb2Ygb3JkZXIgbiwgd2hpY2ggaXMgZGVmaW5lZCBhcyBhIHByb2R1Y3Qgb2YgayBlbGVtZW50YXJ5IHJlZmxlY3RvcnMuCisqPgorKj4gSWYgRElSRUNUID0gJ0YnLCBIID0gSCgxKSBIKDIpIC4gLiAuIEgoaykgYW5kIFQgaXMgdXBwZXIgdHJpYW5ndWxhcjsKKyo+CisqPiBJZiBESVJFQ1QgPSAnQicsIEggPSBIKGspIC4gLiAuIEgoMikgSCgxKSBhbmQgVCBpcyBsb3dlciB0cmlhbmd1bGFyLgorKj4KKyo+IElmIFNUT1JFViA9ICdDJywgdGhlIHZlY3RvciB3aGljaCBkZWZpbmVzIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvcgorKj4gSChpKSBpcyBzdG9yZWQgaW4gdGhlIGktdGggY29sdW1uIG9mIHRoZSBhcnJheSBWLCBhbmQKKyo+CisqPiAgICBIICA9ICBJIC0gViAqIFQgKiBWKipICisqPgorKj4gSWYgU1RPUkVWID0gJ1InLCB0aGUgdmVjdG9yIHdoaWNoIGRlZmluZXMgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yCisqPiBIKGkpIGlzIHN0b3JlZCBpbiB0aGUgaS10aCByb3cgb2YgdGhlIGFycmF5IFYsIGFuZAorKj4KKyo+ICAgIEggID0gIEkgLSBWKipIICogVCAqIFYKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBESVJFQ1QKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgRElSRUNUIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICBTcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvcnMgYXJlCisqPiAgICAgICAgICBtdWx0aXBsaWVkIHRvIGZvcm0gdGhlIGJsb2NrIHJlZmxlY3RvcjoKKyo+ICAgICAgICAgID0gJ0YnOiBIID0gSCgxKSBIKDIpIC4gLiAuIEgoaykgKEZvcndhcmQpCisqPiAgICAgICAgICA9ICdCJzogSCA9IEgoaykgLiAuIC4gSCgyKSBIKDEpIChCYWNrd2FyZCkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gU1RPUkVWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFNUT1JFViBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgdmVjdG9ycyB3aGljaCBkZWZpbmUgdGhlIGVsZW1lbnRhcnkKKyo+ICAgICAgICAgIHJlZmxlY3RvcnMgYXJlIHN0b3JlZCAoc2VlIGFsc28gRnVydGhlciBEZXRhaWxzKToKKyo+ICAgICAgICAgID0gJ0MnOiBjb2x1bW53aXNlCisqPiAgICAgICAgICA9ICdSJzogcm93d2lzZQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBibG9jayByZWZsZWN0b3IgSC4gTiA+PSAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEsgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSB0cmlhbmd1bGFyIGZhY3RvciBUICg9IHRoZSBudW1iZXIgb2YKKyo+ICAgICAgICAgIGVsZW1lbnRhcnkgcmVmbGVjdG9ycykuIEsgPj0gMS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIENPTVBMRVggYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixLKSBpZiBTVE9SRVYgPSAnQycKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsTikgaWYgU1RPUkVWID0gJ1InCisqPiAgICAgICAgICBUaGUgbWF0cml4IFYuIFNlZSBmdXJ0aGVyIGRldGFpbHMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFYgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBWLgorKj4gICAgICAgICAgSWYgU1RPUkVWID0gJ0MnLCBMRFYgPj0gbWF4KDEsTik7IGlmIFNUT1JFViA9ICdSJywgTERWID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRBVQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBUQVUgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uIChLKQorKj4gICAgICAgICAgVEFVKGkpIG11c3QgY29udGFpbiB0aGUgc2NhbGFyIGZhY3RvciBvZiB0aGUgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9yIEgoaSkuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFQgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uIChMRFQsSykKKyo+ICAgICAgICAgIFRoZSBrIGJ5IGsgdHJpYW5ndWxhciBmYWN0b3IgVCBvZiB0aGUgYmxvY2sgcmVmbGVjdG9yLgorKj4gICAgICAgICAgSWYgRElSRUNUID0gJ0YnLCBUIGlzIHVwcGVyIHRyaWFuZ3VsYXI7IGlmIERJUkVDVCA9ICdCJywgVCBpcworKj4gICAgICAgICAgbG93ZXIgdHJpYW5ndWxhci4gVGhlIHJlc3Qgb2YgdGhlIGFycmF5IGlzIG5vdCB1c2VkLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERUIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgVC4gTERUID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBjb21wbGV4T1RIRVJhdXhpbGlhcnkKKyoKKyo+IFxwYXIgRnVydGhlciBEZXRhaWxzOgorKiAgPT09PT09PT09PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gIFRoZSBzaGFwZSBvZiB0aGUgbWF0cml4IFYgYW5kIHRoZSBzdG9yYWdlIG9mIHRoZSB2ZWN0b3JzIHdoaWNoIGRlZmluZQorKj4gIHRoZSBIKGkpIGlzIGJlc3QgaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBleGFtcGxlIHdpdGggbiA9IDUgYW5kCisqPiAgayA9IDMuIFRoZSBlbGVtZW50cyBlcXVhbCB0byAxIGFyZSBub3Qgc3RvcmVkLgorKj4KKyo+ICBESVJFQ1QgPSAnRicgYW5kIFNUT1JFViA9ICdDJzogICAgICAgICBESVJFQ1QgPSAnRicgYW5kIFNUT1JFViA9ICdSJzoKKyo+CisqPiAgICAgICAgICAgICAgIFYgPSAoICAxICAgICAgICkgICAgICAgICAgICAgICAgIFYgPSAoICAxIHYxIHYxIHYxIHYxICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgIDEgICAgKSAgICAgICAgICAgICAgICAgICAgICggICAgIDEgdjIgdjIgdjIgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiAgMSApICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgMSB2MyB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKQorKj4KKyo+ICBESVJFQ1QgPSAnQicgYW5kIFNUT1JFViA9ICdDJzogICAgICAgICBESVJFQ1QgPSAnQicgYW5kIFNUT1JFViA9ICdSJzoKKyo+CisqPiAgICAgICAgICAgICAgIFYgPSAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgIFYgPSAoIHYxIHYxICAxICAgICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjIgdjIgdjIgIDEgICAgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgMSB2MiB2MyApICAgICAgICAgICAgICAgICAgICAgKCB2MyB2MyB2MyB2MyAgMSApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAxIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgKQorKj4gXGVuZHZlcmJhdGltCisqPgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTVUJST1VUSU5FIENMQVJGVCggRElSRUNULCBTVE9SRVYsIE4sIEssIFYsIExEViwgVEFVLCBULCBMRFQgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgRElSRUNULCBTVE9SRVYKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLLCBMRFQsIExEViwgTgorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFQoIExEVCwgKiApLCBUQVUoICogKSwgViggTERWLCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBPTkUsIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE9ORSA9ICggMS4wRSswLCAwLjBFKzAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBaRVJPID0gKCAwLjBFKzAsIDAuMEUrMCApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgUFJFVkxBU1RWLCBMQVNUVgorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dFTVYsIENMQUNHViwgQ1RSTVYKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0FNRQorICAgICAgRVhURVJOQUwgICAgICAgICAgIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUKKyoKKyAgICAgIElGKCBOLkVRLjAgKQorICAgICAkICAgUkVUVVJOCisqCisgICAgICBJRiggTFNBTUUoIERJUkVDVCwgJ0YnICkgKSBUSEVOCisgICAgICAgICBQUkVWTEFTVFYgPSBOCisgICAgICAgICBETyBJID0gMSwgSworICAgICAgICAgICAgUFJFVkxBU1RWID0gTUFYKCBQUkVWTEFTVFYsIEkgKQorICAgICAgICAgICAgSUYoIFRBVSggSSApLkVRLlpFUk8gKSBUSEVOCisqCisqICAgICAgICAgICAgICBIKGkpICA9ICBJCisqCisgICAgICAgICAgICAgICBETyBKID0gMSwgSQorICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICAgICBnZW5lcmFsIGNhc2UKKyoKKyAgICAgICAgICAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyogICAgICAgICAgICAgICAgIFNraXAgYW55IHRyYWlsaW5nIHplcm9zLgorICAgICAgICAgICAgICAgICAgRE8gTEFTVFYgPSBOLCBJKzEsIC0xCisgICAgICAgICAgICAgICAgICAgICBJRiggViggTEFTVFYsIEkgKS5ORS5aRVJPICkgRVhJVAorICAgICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICBETyBKID0gMSwgSS0xCisgICAgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSAtVEFVKCBJICkgKiBDT05KRyggViggSSAsIEogKSApCisgICAgICAgICAgICAgICAgICBFTkQgRE8gICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIEogPSBNSU4oIExBU1RWLCBQUkVWTEFTVFYgKQorKgorKiAgICAgICAgICAgICAgICAgVCgxOmktMSxpKSA6PSAtIHRhdShpKSAqIFYoaTpqLDE6aS0xKSoqSCAqIFYoaTpqLGkpCisqCisgICAgICAgICAgICAgICAgICBDQUxMIENHRU1WKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsIEotSSwgSS0xLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgLVRBVSggSSApLCBWKCBJKzEsIDEgKSwgTERWLCAKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFYoIEkrMSwgSSApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBUKCAxLCBJICksIDEgKQorICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgU2tpcCBhbnkgdHJhaWxpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IE4sIEkrMSwgLTEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBWKCBJLCBMQVNUViApLk5FLlpFUk8gKSBFWElUCisgICAgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIERPIEogPSAxLCBJLTEKKyAgICAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IC1UQVUoIEkgKSAqIFYoIEogLCBJICkKKyAgICAgICAgICAgICAgICAgIEVORCBETyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgSiA9IE1JTiggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IC0gdGF1KGkpICogVigxOmktMSxpOmopICogVihpLGk6aikqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oICdOJywgJ0MnLCBJLTEsIDEsIEotSSwgLVRBVSggSSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgViggMSwgSSsxICksIExEViwgViggSSwgSSsxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgVCggMSwgSSApLCBMRFQgKSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IFQoMTppLTEsMTppLTEpICogVCgxOmktMSxpKQorKgorICAgICAgICAgICAgICAgQ0FMTCBDVFJNViggJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdOb24tdW5pdCcsIEktMSwgVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEVCwgVCggMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgIFQoIEksIEkgKSA9IFRBVSggSSApCisgICAgICAgICAgICAgICBJRiggSS5HVC4xICkgVEhFTgorICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTUFYKCBQUkVWTEFTVFYsIExBU1RWICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIFBSRVZMQVNUViA9IExBU1RWCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRU5EIERPCisgICAgICBFTFNFCisgICAgICAgICBQUkVWTEFTVFYgPSAxCisgICAgICAgICBETyBJID0gSywgMSwgLTEKKyAgICAgICAgICAgIElGKCBUQVUoIEkgKS5FUS5aRVJPICkgVEhFTgorKgorKiAgICAgICAgICAgICAgSChpKSAgPSAgSQorKgorICAgICAgICAgICAgICAgRE8gSiA9IEksIEsKKyAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgICAgZ2VuZXJhbCBjYXNlCisqCisgICAgICAgICAgICAgICBJRiggSS5MVC5LICkgVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIExTQU1FKCBTVE9SRVYsICdDJyApICkgVEhFTgorKiAgICAgICAgICAgICAgICAgICAgU2tpcCBhbnkgbGVhZGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgICAgIERPIExBU1RWID0gMSwgSS0xCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggViggTEFTVFYsIEkgKS5ORS5aRVJPICkgRVhJVAorICAgICAgICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICAgICBETyBKID0gSSsxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSAtVEFVKCBJICkgKiBDT05KRyggViggTi1LK0kgLCBKICkgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIERPICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICBKID0gTUFYKCBMQVNUViwgUFJFVkxBU1RWICkKKyoKKyogICAgICAgICAgICAgICAgICAgIFQoaSsxOmssaSkgPSAtdGF1KGkpICogVihqOm4taytpLGkrMTprKSoqSCAqIFYoajpuLWsraSxpKQorKgorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNViggJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBOLUsrSS1KLCBLLUksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAtVEFVKCBJICksIFYoIEosIEkrMSApLCBMRFYsIFYoIEosIEkgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE9ORSwgVCggSSsxLCBJICksIDEgKQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgU2tpcCBhbnkgbGVhZGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgICAgIERPIExBU1RWID0gMSwgSS0xCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggViggSSwgTEFTVFYgKS5ORS5aRVJPICkgRVhJVAorICAgICAgICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICAgICBETyBKID0gSSsxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSAtVEFVKCBJICkgKiBWKCBKLCBOLUsrSSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgRE8gICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICBKID0gTUFYKCBMQVNUViwgUFJFVkxBU1RWICkKKyoKKyogICAgICAgICAgICAgICAgICAgIFQoaSsxOmssaSkgPSAtdGF1KGkpICogVihpKzE6ayxqOm4taytpKSAqIFYoaSxqOm4taytpKSoqSAorKgorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIEstSSwgMSwgTi1LK0ktSiwgLVRBVSggSSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgViggSSsxLCBKICksIExEViwgViggSSwgSiApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIFQoIEkrMSwgSSApLCBMRFQgKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBUKGkrMTprLGkpIDo9IFQoaSsxOmssaSsxOmspICogVChpKzE6ayxpKQorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDVFJNViggJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdOb24tdW5pdCcsIEstSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFQoIEkrMSwgSSsxICksIExEVCwgVCggSSsxLCBJICksIDEgKQorICAgICAgICAgICAgICAgICAgSUYoIEkuR1QuMSApIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFBSRVZMQVNUViA9IE1JTiggUFJFVkxBU1RWLCBMQVNUViApCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBQUkVWTEFTVFYgPSBMQVNUVgorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIFQoIEksIEkgKSA9IFRBVSggSSApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBETworICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDTEFSRlQKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2NvbXBsZXhfZG91YmxlLmNwcCBiL2xhcGFjay9jb21wbGV4X2RvdWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljNTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9jb21wbGV4X2RvdWJsZS5jcHAKQEAgLTAsMCArMSwxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBzdGQ6OmNvbXBsZXg8ZG91YmxlPgorI2RlZmluZSBTQ0FMQVJfU1VGRklYIHoKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiWiIKKyNkZWZpbmUgUkVBTF9TQ0FMQVJfU1VGRklYIGQKKyNkZWZpbmUgSVNDT01QTEVYICAgICAxCisKKyNpbmNsdWRlICJjaG9sZXNreS5jcHAiCisjaW5jbHVkZSAibHUuY3BwIgorI2luY2x1ZGUgInN2ZC5jcHAiCmRpZmYgLS1naXQgYS9sYXBhY2svY29tcGxleF9zaW5nbGUuY3BwIGIvbGFwYWNrL2NvbXBsZXhfc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDExYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2NvbXBsZXhfc2luZ2xlLmNwcApAQCAtMCwwICsxLDE4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBTQ0FMQVIgICAgICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4KKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBjCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkMiCisjZGVmaW5lIFJFQUxfU0NBTEFSX1NVRkZJWCBzCisjZGVmaW5lIElTQ09NUExFWCAgICAgMQorCisjaW5jbHVkZSAiY2hvbGVza3kuY3BwIgorI2luY2x1ZGUgImx1LmNwcCIKKyNpbmNsdWRlICJzdmQuY3BwIgpkaWZmIC0tZ2l0IGEvbGFwYWNrL2RsYWRpdi5mIGIvbGFwYWNrL2RsYWRpdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MGE5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZGxhZGl2LmYKQEAgLTAsMCArMSwxMjggQEAKKyo+IFxicmllZiBcYiBETEFESVYKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBETEFESVYgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYWRpdi5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYWRpdi5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYWRpdi5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBTVUJST1VUSU5FIERMQURJViggQSwgQiwgQywgRCwgUCwgUSApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBLCBCLCBDLCBELCBQLCBRCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBETEFESVYgcGVyZm9ybXMgY29tcGxleCBkaXZpc2lvbiBpbiAgcmVhbCBhcml0aG1ldGljCisqPgorKj4gICAgICAgICAgICAgICAgICAgICAgIGEgKyBpKmIKKyo+ICAgICAgICAgICAgcCArIGkqcSA9IC0tLS0tLS0tLQorKj4gICAgICAgICAgICAgICAgICAgICAgIGMgKyBpKmQKKyo+CisqPiBUaGUgYWxnb3JpdGhtIGlzIGR1ZSB0byBSb2JlcnQgTC4gU21pdGggYW5kIGNhbiBiZSBmb3VuZAorKj4gaW4gRC4gS251dGgsIFRoZSBhcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsIFZvbC4yLCBwLjE5NQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIEEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQSBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEIKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQiBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQyBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgRCBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiAgICAgICAgICBUaGUgc2NhbGFycyBhLCBiLCBjLCBhbmQgZCBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFAKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgUCBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBRCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFEgaXMgRE9VQkxFIFBSRUNJU0lPTgorKj4gICAgICAgICAgVGhlIHNjYWxhcnMgcCBhbmQgcSBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgRExBRElWKCBBLCBCLCBDLCBELCBQLCBRICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEsIEIsIEMsIEQsIFAsIFEKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFLCBGCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIEFCUyggRCApLkxULkFCUyggQyApICkgVEhFTgorICAgICAgICAgRSA9IEQgLyBDCisgICAgICAgICBGID0gQyArIEQqRQorICAgICAgICAgUCA9ICggQStCKkUgKSAvIEYKKyAgICAgICAgIFEgPSAoIEItQSpFICkgLyBGCisgICAgICBFTFNFCisgICAgICAgICBFID0gQyAvIEQKKyAgICAgICAgIEYgPSBEICsgQypFCisgICAgICAgICBQID0gKCBCK0EqRSApIC8gRgorICAgICAgICAgUSA9ICggLUErQipFICkgLyBGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERMQURJVgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svZGxhbWNoLmYgYi9sYXBhY2svZGxhbWNoLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzMDdlNQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9kbGFtY2guZgpAQCAtMCwwICsxLDE4OSBAQAorKj4gXGJyaWVmIFxiIERMQU1DSAorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERMQU1DSCggQ01BQ0ggKQorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gRExBTUNIIGRldGVybWluZXMgZG91YmxlIHByZWNpc2lvbiBtYWNoaW5lIHBhcmFtZXRlcnMuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gQ01BQ0gKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSBETEFNQ0g6CisqPiAgICAgICAgICA9ICdFJyBvciAnZScsICAgRExBTUNIIDo9IGVwcworKj4gICAgICAgICAgPSAnUycgb3IgJ3MgLCAgIERMQU1DSCA6PSBzZm1pbgorKj4gICAgICAgICAgPSAnQicgb3IgJ2InLCAgIERMQU1DSCA6PSBiYXNlCisqPiAgICAgICAgICA9ICdQJyBvciAncCcsICAgRExBTUNIIDo9IGVwcypiYXNlCisqPiAgICAgICAgICA9ICdOJyBvciAnbicsICAgRExBTUNIIDo9IHQKKyo+ICAgICAgICAgID0gJ1InIG9yICdyJywgICBETEFNQ0ggOj0gcm5kCisqPiAgICAgICAgICA9ICdNJyBvciAnbScsICAgRExBTUNIIDo9IGVtaW4KKyo+ICAgICAgICAgID0gJ1UnIG9yICd1JywgICBETEFNQ0ggOj0gcm1pbgorKj4gICAgICAgICAgPSAnTCcgb3IgJ2wnLCAgIERMQU1DSCA6PSBlbWF4CisqPiAgICAgICAgICA9ICdPJyBvciAnbycsICAgRExBTUNIIDo9IHJtYXgKKyo+ICAgICAgICAgIHdoZXJlCisqPiAgICAgICAgICBlcHMgICA9IHJlbGF0aXZlIG1hY2hpbmUgcHJlY2lzaW9uCisqPiAgICAgICAgICBzZm1pbiA9IHNhZmUgbWluaW11bSwgc3VjaCB0aGF0IDEvc2ZtaW4gZG9lcyBub3Qgb3ZlcmZsb3cKKyo+ICAgICAgICAgIGJhc2UgID0gYmFzZSBvZiB0aGUgbWFjaGluZQorKj4gICAgICAgICAgcHJlYyAgPSBlcHMqYmFzZQorKj4gICAgICAgICAgdCAgICAgPSBudW1iZXIgb2YgKGJhc2UpIGRpZ2l0cyBpbiB0aGUgbWFudGlzc2EKKyo+ICAgICAgICAgIHJuZCAgID0gMS4wIHdoZW4gcm91bmRpbmcgb2NjdXJzIGluIGFkZGl0aW9uLCAwLjAgb3RoZXJ3aXNlCisqPiAgICAgICAgICBlbWluICA9IG1pbmltdW0gZXhwb25lbnQgYmVmb3JlIChncmFkdWFsKSB1bmRlcmZsb3cKKyo+ICAgICAgICAgIHJtaW4gID0gdW5kZXJmbG93IHRocmVzaG9sZCAtIGJhc2UqKihlbWluLTEpCisqPiAgICAgICAgICBlbWF4ICA9IGxhcmdlc3QgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93CisqPiAgICAgICAgICBybWF4ICA9IG92ZXJmbG93IHRocmVzaG9sZCAgLSAoYmFzZSoqZW1heCkqKDEtZXBzKQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgYXV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBETEFNQ0goIENNQUNIICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ0hBUkFDVEVSICAgICAgICAgIENNQUNICisqICAgICAuLgorKgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBPTkUsIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE9ORSA9IDEuMEQrMCwgWkVSTyA9IDAuMEQrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJORCwgRVBTLCBTRk1JTiwgU01BTEwsIFJNQUNICisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNBTUUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBESUdJVFMsIEVQU0lMT04sIEhVR0UsIE1BWEVYUE9ORU5ULAorICAgICAkICAgICAgICAgICAgICAgICAgIE1JTkVYUE9ORU5ULCBSQURJWCwgVElOWQorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKgorKiAgICAgQXNzdW1lIHJvdW5kaW5nLCBub3QgY2hvcHBpbmcuIEFsd2F5cy4KKyoKKyAgICAgIFJORCA9IE9ORQorKgorICAgICAgSUYoIE9ORS5FUS5STkQgKSBUSEVOCisgICAgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pICogMC41CisgICAgICBFTFNFCisgICAgICAgICBFUFMgPSBFUFNJTE9OKFpFUk8pCisgICAgICBFTkQgSUYKKyoKKyAgICAgIElGKCBMU0FNRSggQ01BQ0gsICdFJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBFUFMKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ1MnICkgKSBUSEVOCisgICAgICAgICBTRk1JTiA9IFRJTlkoWkVSTykKKyAgICAgICAgIFNNQUxMID0gT05FIC8gSFVHRShaRVJPKQorICAgICAgICAgSUYoIFNNQUxMLkdFLlNGTUlOICkgVEhFTgorKgorKiAgICAgICAgICAgVXNlIFNNQUxMIHBsdXMgYSBiaXQsIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiByb3VuZGluZworKiAgICAgICAgICAgY2F1c2luZyBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyAgMS9zZm1pbi4KKyoKKyAgICAgICAgICAgIFNGTUlOID0gU01BTEwqKCBPTkUrRVBTICkKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgUk1BQ0ggPSBTRk1JTgorICAgICAgRUxTRSBJRiggTFNBTUUoIENNQUNILCAnQicgKSApIFRIRU4KKyAgICAgICAgIFJNQUNIID0gUkFESVgoWkVSTykKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ1AnICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IEVQUyAqIFJBRElYKFpFUk8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdOJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBESUdJVFMoWkVSTykKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ1InICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IFJORAorICAgICAgRUxTRSBJRiggTFNBTUUoIENNQUNILCAnTScgKSApIFRIRU4KKyAgICAgICAgIFJNQUNIID0gTUlORVhQT05FTlQoWkVSTykKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ1UnICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IHRpbnkoemVybykKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ0wnICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IE1BWEVYUE9ORU5UKFpFUk8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdPJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBIVUdFKFpFUk8pCisgICAgICBFTFNFCisgICAgICAgICBSTUFDSCA9IFpFUk8KKyAgICAgIEVORCBJRgorKgorICAgICAgRExBTUNIID0gUk1BQ0gKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERMQU1DSAorKgorICAgICAgRU5ECisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyo+IFxicmllZiBcYiBETEFNQzMKKyo+IFxkZXRhaWxzCisqPiBcYiBQdXJwb3NlOgorKj4gXHZlcmJhdGltCisqPiBETEFNQzMgIGlzIGludGVuZGVkIHRvIGZvcmNlICBBICBhbmQgIEIgIHRvIGJlIHN0b3JlZCBwcmlvciB0byBkb2luZworKj4gdGhlIGFkZGl0aW9uIG9mICBBICBhbmQgIEIgLCAgZm9yIHVzZSBpbiBzaXR1YXRpb25zIHdoZXJlIG9wdGltaXplcnMKKyo+IG1pZ2h0IGhvbGQgb25lIG9mIHRoZXNlIGluIGEgcmVnaXN0ZXIuCisqPiBcZW5kdmVyYmF0aW0KKyo+IFxhdXRob3IgTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqPiBcaW5ncm91cCBhdXhPVEhFUmF1eGlsaWFyeQorKj4KKyo+IFxwYXJhbVtpbl0gQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBBIGlzIGEgRE9VQkxFIFBSRUNJU0lPTgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBCCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEIgaXMgYSBET1VCTEUgUFJFQ0lTSU9OCisqPiAgICAgICAgICBUaGUgdmFsdWVzIEEgYW5kIEIuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERMQU1DMyggQSwgQiApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAgICBVbml2LiBvZiBUZW5uZXNzZWUsIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgYW5kIE5BRyBMdGQuLgorKiAgICAgTm92ZW1iZXIgMjAxMAorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEsIEIKKyogICAgIC4uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETEFNQzMgPSBBICsgQgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRExBTUMzCisqCisgICAgICBFTkQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbGFwYWNrL2RsYXB5Mi5mIGIvbGFwYWNrL2RsYXB5Mi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTYyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZGxhcHkyLmYKQEAgLTAsMCArMSwxMDQgQEAKKyo+IFxicmllZiBcYiBETEFQWTIKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBETEFQWTIgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5Mi5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5Mi5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5Mi5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERMQVBZMiggWCwgWSApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBETEFQWTIgcmV0dXJucyBzcXJ0KHgqKjIreSoqMiksIHRha2luZyBjYXJlIG5vdCB0byBjYXVzZSB1bm5lY2Vzc2FyeQorKj4gb3ZlcmZsb3cuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIERPVUJMRSBQUkVDSVNJT04KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gWQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBZIGlzIERPVUJMRSBQUkVDSVNJT04KKyo+ICAgICAgICAgIFggYW5kIFkgc3BlY2lmeSB0aGUgdmFsdWVzIHggYW5kIHkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBhdXhPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERMQVBZMiggWCwgWSApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE9ORSA9IDEuMEQwICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVywgWEFCUywgWUFCUywgWgorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOLCBTUVJUCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBYQUJTID0gQUJTKCBYICkKKyAgICAgIFlBQlMgPSBBQlMoIFkgKQorICAgICAgVyA9IE1BWCggWEFCUywgWUFCUyApCisgICAgICBaID0gTUlOKCBYQUJTLCBZQUJTICkKKyAgICAgIElGKCBaLkVRLlpFUk8gKSBUSEVOCisgICAgICAgICBETEFQWTIgPSBXCisgICAgICBFTFNFCisgICAgICAgICBETEFQWTIgPSBXKlNRUlQoIE9ORSsoIFogLyBXICkqKjIgKQorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBETEFQWTIKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2RsYXB5My5mIGIvbGFwYWNrL2RsYXB5My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTg0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZGxhcHkzLmYKQEAgLTAsMCArMSwxMTEgQEAKKyo+IFxicmllZiBcYiBETEFQWTMKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBETEFQWTMgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5My5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5My5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXB5My5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERMQVBZMyggWCwgWSwgWiApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZLCBaCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBETEFQWTMgcmV0dXJucyBzcXJ0KHgqKjIreSoqMit6KioyKSwgdGFraW5nIGNhcmUgbm90IHRvIGNhdXNlCisqPiB1bm5lY2Vzc2FyeSBvdmVyZmxvdy4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFggaXMgRE9VQkxFIFBSRUNJU0lPTgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBZCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFkgaXMgRE9VQkxFIFBSRUNJU0lPTgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBaCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFogaXMgRE9VQkxFIFBSRUNJU0lPTgorKj4gICAgICAgICAgWCwgWSBhbmQgWiBzcGVjaWZ5IHRoZSB2YWx1ZXMgeCwgeSBhbmQgei4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gRExBUFkzKCBYLCBZLCBaICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFgsIFksIFoKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBXLCBYQUJTLCBZQUJTLCBaQUJTCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBTUVJUCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBYQUJTID0gQUJTKCBYICkKKyAgICAgIFlBQlMgPSBBQlMoIFkgKQorICAgICAgWkFCUyA9IEFCUyggWiApCisgICAgICBXID0gTUFYKCBYQUJTLCBZQUJTLCBaQUJTICkKKyAgICAgIElGKCBXLkVRLlpFUk8gKSBUSEVOCisqICAgICBXIGNhbiBiZSB6ZXJvIGZvciBtYXgoMCxuYW4sMCkKKyogICAgIGFkZGluZyBhbGwgdGhyZWUgZW50cmllcyB0b2dldGhlciB3aWxsIG1ha2Ugc3VyZQorKiAgICAgTmFOIHdpbGwgbm90IGRpc2FwcGVhci4KKyAgICAgICAgIERMQVBZMyA9ICBYQUJTICsgWUFCUyArIFpBQlMKKyAgICAgIEVMU0UKKyAgICAgICAgIERMQVBZMyA9IFcqU1FSVCggKCBYQUJTIC8gVyApKioyKyggWUFCUyAvIFcgKSoqMisKKyAgICAgJCAgICAgICAgICAgICggWkFCUyAvIFcgKSoqMiApCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERMQVBZMworKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svZGxhcmYuZiBiL2xhcGFjay9kbGFyZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZGxhcmYuZgpAQCAtMCwwICsxLDIyNyBAQAorKj4gXGJyaWVmIFxiIERMQVJGCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgRExBUkYgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXJmLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvZGxhcmYuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9kbGFyZi5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBTVUJST1VUSU5FIERMQVJGKCBTSURFLCBNLCBOLCBWLCBJTkNWLCBUQVUsIEMsIExEQywgV09SSyApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBTSURFCisqICAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNWLCBMREMsIE0sIE4KKyogICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFRBVQorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEMoIExEQywgKiApLCBWKCAqICksIFdPUksoICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gRExBUkYgYXBwbGllcyBhIHJlYWwgZWxlbWVudGFyeSByZWZsZWN0b3IgSCB0byBhIHJlYWwgbSBieSBuIG1hdHJpeAorKj4gQywgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0LiBIIGlzIHJlcHJlc2VudGVkIGluIHRoZSBmb3JtCisqPgorKj4gICAgICAgSCA9IEkgLSB0YXUgKiB2ICogdioqVAorKj4KKyo+IHdoZXJlIHRhdSBpcyBhIHJlYWwgc2NhbGFyIGFuZCB2IGlzIGEgcmVhbCB2ZWN0b3IuCisqPgorKj4gSWYgdGF1ID0gMCwgdGhlbiBIIGlzIHRha2VuIHRvIGJlIHRoZSB1bml0IG1hdHJpeC4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBTSURFCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFNJREUgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgID0gJ0wnOiBmb3JtICBIICogQworKj4gICAgICAgICAgPSAnUic6IGZvcm0gIEMgKiBICisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAoMSArIChNLTEpKmFicyhJTkNWKSkgaWYgU0lERSA9ICdMJworKj4gICAgICAgICAgICAgICAgICBvciAoMSArIChOLTEpKmFicyhJTkNWKSkgaWYgU0lERSA9ICdSJworKj4gICAgICAgICAgVGhlIHZlY3RvciB2IGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiBILiBWIGlzIG5vdCB1c2VkIGlmCisqPiAgICAgICAgICBUQVUgPSAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1YgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGluY3JlbWVudCBiZXR3ZWVuIGVsZW1lbnRzIG9mIHYuIElOQ1YgPD4gMC4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiAgICAgICAgICBUaGUgdmFsdWUgdGF1IGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiBILgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gQworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBDIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbiAoTERDLE4pCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIG0gYnkgbiBtYXRyaXggQy4KKyo+ICAgICAgICAgIE9uIGV4aXQsIEMgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIG1hdHJpeCBIICogQyBpZiBTSURFID0gJ0wnLAorKj4gICAgICAgICAgb3IgQyAqIEggaWYgU0lERSA9ICdSJy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEQyBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IEMuIExEQyA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFdPUksKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgV09SSyBpcyBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24KKyo+ICAgICAgICAgICAgICAgICAgICAgICAgIChOKSBpZiBTSURFID0gJ0wnCisqPiAgICAgICAgICAgICAgICAgICAgICBvciAoTSkgaWYgU0lERSA9ICdSJworKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgZG91YmxlT1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBETEFSRiggU0lERSwgTSwgTiwgViwgSU5DViwgVEFVLCBDLCBMREMsIFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgU0lERQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFRBVQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEMoIExEQywgKiApLCBWKCAqICksIFdPUksoICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRCswLCBaRVJPID0gMC4wRCswICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQVBQTFlMRUZUCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgTEFTVFYsIExBU1RDCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBER0VNViwgREdFUgorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSUxBRExSLCBJTEFETEMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRSwgSUxBRExSLCBJTEFETEMKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIEFQUExZTEVGVCA9IExTQU1FKCBTSURFLCAnTCcgKQorICAgICAgTEFTVFYgPSAwCisgICAgICBMQVNUQyA9IDAKKyAgICAgIElGKCBUQVUuTkUuWkVSTyApIFRIRU4KKyEgICAgIFNldCB1cCB2YXJpYWJsZXMgZm9yIHNjYW5uaW5nIFYuICBMQVNUViBiZWdpbnMgcG9pbnRpbmcgdG8gdGhlIGVuZAorISAgICAgb2YgVi4KKyAgICAgICAgIElGKCBBUFBMWUxFRlQgKSBUSEVOCisgICAgICAgICAgICBMQVNUViA9IE0KKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBU1RWID0gTgorICAgICAgICAgRU5EIElGCisgICAgICAgICBJRiggSU5DVi5HVC4wICkgVEhFTgorICAgICAgICAgICAgSSA9IDEgKyAoTEFTVFYtMSkgKiBJTkNWCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBJID0gMQorICAgICAgICAgRU5EIElGCishICAgICBMb29rIGZvciB0aGUgbGFzdCBub24temVybyByb3cgaW4gVi4KKyAgICAgICAgIERPIFdISUxFKCBMQVNUVi5HVC4wIC5BTkQuIFYoIEkgKS5FUS5aRVJPICkKKyAgICAgICAgICAgIExBU1RWID0gTEFTVFYgLSAxCisgICAgICAgICAgICBJID0gSSAtIElOQ1YKKyAgICAgICAgIEVORCBETworICAgICAgICAgSUYoIEFQUExZTEVGVCApIFRIRU4KKyEgICAgIFNjYW4gZm9yIHRoZSBsYXN0IG5vbi16ZXJvIGNvbHVtbiBpbiBDKDE6bGFzdHYsOikuCisgICAgICAgICAgICBMQVNUQyA9IElMQURMQyhMQVNUViwgTiwgQywgTERDKQorICAgICAgICAgRUxTRQorISAgICAgU2NhbiBmb3IgdGhlIGxhc3Qgbm9uLXplcm8gcm93IGluIEMoOiwxOmxhc3R2KS4KKyAgICAgICAgICAgIExBU1RDID0gSUxBRExSKE0sIExBU1RWLCBDLCBMREMpCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorISAgICAgTm90ZSB0aGF0IGxhc3RjLmVxLjAgcmVuZGVycyB0aGUgQkxBUyBvcGVyYXRpb25zIG51bGw7IG5vIHNwZWNpYWwKKyEgICAgIGNhc2UgaXMgbmVlZGVkIGF0IHRoaXMgbGV2ZWwuCisgICAgICBJRiggQVBQTFlMRUZUICkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgSCAqIEMKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0diwxOmxhc3RjKSoqVCAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBER0VNViggJ1RyYW5zcG9zZScsIExBU1RWLCBMQVNUQywgT05FLCBDLCBMREMsIFYsIElOQ1YsCisgICAgICQgICAgICAgICAgIFpFUk8sIFdPUkssIDEgKQorKgorKiAgICAgICAgICAgQygxOmxhc3R2LDE6bGFzdGMpIDo9IEMoLi4uKSAtIHYoMTpsYXN0diwxKSAqIHcoMTpsYXN0YywxKSoqVAorKgorICAgICAgICAgICAgQ0FMTCBER0VSKCBMQVNUViwgTEFTVEMsIC1UQVUsIFYsIElOQ1YsIFdPUkssIDEsIEMsIExEQyApCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIEMgKiBICisqCisgICAgICAgICBJRiggTEFTVFYuR1QuMCApIFRIRU4KKyoKKyogICAgICAgICAgIHcoMTpsYXN0YywxKSA6PSBDKDE6bGFzdGMsMTpsYXN0dikgKiB2KDE6bGFzdHYsMSkKKyoKKyAgICAgICAgICAgIENBTEwgREdFTVYoICdObyB0cmFuc3Bvc2UnLCBMQVNUQywgTEFTVFYsIE9ORSwgQywgTERDLAorICAgICAkICAgICAgICAgICBWLCBJTkNWLCBaRVJPLCBXT1JLLCAxICkKKyoKKyogICAgICAgICAgIEMoMTpsYXN0YywxOmxhc3R2KSA6PSBDKC4uLikgLSB3KDE6bGFzdGMsMSkgKiB2KDE6bGFzdHYsMSkqKlQKKyoKKyAgICAgICAgICAgIENBTEwgREdFUiggTEFTVEMsIExBU1RWLCAtVEFVLCBXT1JLLCAxLCBWLCBJTkNWLCBDLCBMREMgKQorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERMQVJGCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9kbGFyZmIuZiBiL2xhcGFjay9kbGFyZmIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZkM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2RsYXJmYi5mCkBAIC0wLDAgKzEsNzYyIEBACisqPiBcYnJpZWYgXGIgRExBUkZCCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgRExBUkZCICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9kbGFyZmIuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9kbGFyZmIuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9kbGFyZmIuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBETEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgTERULCBDLCBMREMsIFdPUkssIExEV09SSyApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNJREUsIFNUT1JFViwgVFJBTlMKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEQywgTERULCBMRFYsIExEV09SSywgTSwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEMoIExEQywgKiApLCBUKCBMRFQsICogKSwgViggTERWLCAqICksCisqICAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gRExBUkZCIGFwcGxpZXMgYSByZWFsIGJsb2NrIHJlZmxlY3RvciBIIG9yIGl0cyB0cmFuc3Bvc2UgSCoqVCB0byBhCisqPiByZWFsIG0gYnkgbiBtYXRyaXggQywgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGFwcGx5IEggb3IgSCoqVCBmcm9tIHRoZSBMZWZ0CisqPiAgICAgICAgICA9ICdSJzogYXBwbHkgSCBvciBIKipUIGZyb20gdGhlIFJpZ2h0CisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRSQU5TCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRSQU5TIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICA9ICdOJzogYXBwbHkgSCAoTm8gdHJhbnNwb3NlKQorKj4gICAgICAgICAgPSAnVCc6IGFwcGx5IEgqKlQgKFRyYW5zcG9zZSkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gRElSRUNUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIERJUkVDVCBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgSW5kaWNhdGVzIGhvdyBIIGlzIGZvcm1lZCBmcm9tIGEgcHJvZHVjdCBvZiBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzCisqPiAgICAgICAgICA9ICdGJzogSCA9IEgoMSkgSCgyKSAuIC4gLiBIKGspIChGb3J3YXJkKQorKj4gICAgICAgICAgPSAnQic6IEggPSBIKGspIC4gLiAuIEgoMikgSCgxKSAoQmFja3dhcmQpCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFNUT1JFVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBTVE9SRVYgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIEluZGljYXRlcyBob3cgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lIHRoZSBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzIGFyZSBzdG9yZWQ6CisqPiAgICAgICAgICA9ICdDJzogQ29sdW1ud2lzZQorKj4gICAgICAgICAgPSAnUic6IFJvd3dpc2UKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEsgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggVCAoPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRhcnkKKyo+ICAgICAgICAgIHJlZmxlY3RvcnMgd2hvc2UgcHJvZHVjdCBkZWZpbmVzIHRoZSBibG9jayByZWZsZWN0b3IpLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFYgaXMgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixLKSBpZiBTVE9SRVYgPSAnQycKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLE0pIGlmIFNUT1JFViA9ICdSJyBhbmQgU0lERSA9ICdMJworKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsTikgaWYgU1RPUkVWID0gJ1InIGFuZCBTSURFID0gJ1InCisqPiAgICAgICAgICBUaGUgbWF0cml4IFYuIFNlZSBGdXJ0aGVyIERldGFpbHMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFYgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBWLgorKj4gICAgICAgICAgSWYgU1RPUkVWID0gJ0MnIGFuZCBTSURFID0gJ0wnLCBMRFYgPj0gbWF4KDEsTSk7CisqPiAgICAgICAgICBpZiBTVE9SRVYgPSAnQycgYW5kIFNJREUgPSAnUicsIExEViA+PSBtYXgoMSxOKTsKKyo+ICAgICAgICAgIGlmIFNUT1JFViA9ICdSJywgTERWID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVCBpcyBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24gKExEVCxLKQorKj4gICAgICAgICAgVGhlIHRyaWFuZ3VsYXIgayBieSBrIG1hdHJpeCBUIGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyo+ICAgICAgICAgIGJsb2NrIHJlZmxlY3Rvci4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEVCBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFQuIExEVCA+PSBLLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gQworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBDIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbiAoTERDLE4pCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIG0gYnkgbiBtYXRyaXggQy4KKyo+ICAgICAgICAgIE9uIGV4aXQsIEMgaXMgb3ZlcndyaXR0ZW4gYnkgSCpDIG9yIEgqKlQqQyBvciBDKkggb3IgQypIKipULgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERDIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQy4gTERDID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBXT1JLIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbiAoTERXT1JLLEspCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFdPUksgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBXT1JLLgorKj4gICAgICAgICAgSWYgU0lERSA9ICdMJywgTERXT1JLID49IG1heCgxLE4pOworKj4gICAgICAgICAgaWYgU0lERSA9ICdSJywgTERXT1JLID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgZG91YmxlT1RIRVJhdXhpbGlhcnkKKyoKKyo+IFxwYXIgRnVydGhlciBEZXRhaWxzOgorKiAgPT09PT09PT09PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gIFRoZSBzaGFwZSBvZiB0aGUgbWF0cml4IFYgYW5kIHRoZSBzdG9yYWdlIG9mIHRoZSB2ZWN0b3JzIHdoaWNoIGRlZmluZQorKj4gIHRoZSBIKGkpIGlzIGJlc3QgaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBleGFtcGxlIHdpdGggbiA9IDUgYW5kCisqPiAgayA9IDMuIFRoZSBlbGVtZW50cyBlcXVhbCB0byAxIGFyZSBub3Qgc3RvcmVkOyB0aGUgY29ycmVzcG9uZGluZworKj4gIGFycmF5IGVsZW1lbnRzIGFyZSBtb2RpZmllZCBidXQgcmVzdG9yZWQgb24gZXhpdC4gVGhlIHJlc3Qgb2YgdGhlCisqPiAgYXJyYXkgaXMgbm90IHVzZWQuCisqPgorKj4gIERJUkVDVCA9ICdGJyBhbmQgU1RPUkVWID0gJ0MnOiAgICAgICAgIERJUkVDVCA9ICdGJyBhbmQgU1RPUkVWID0gJ1InOgorKj4KKyo+ICAgICAgICAgICAgICAgViA9ICggIDEgICAgICAgKSAgICAgICAgICAgICAgICAgViA9ICggIDEgdjEgdjEgdjEgdjEgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSAgMSAgICApICAgICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MiB2MiB2MiApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyICAxICkgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAxIHYzIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPgorKj4gIERJUkVDVCA9ICdCJyBhbmQgU1RPUkVWID0gJ0MnOiAgICAgICAgIERJUkVDVCA9ICdCJyBhbmQgU1RPUkVWID0gJ1InOgorKj4KKyo+ICAgICAgICAgICAgICAgViA9ICggdjEgdjIgdjMgKSAgICAgICAgICAgICAgICAgViA9ICggdjEgdjEgIDEgICAgICAgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICAgICAgKCB2MiB2MiB2MiAgMSAgICApCisqPiAgICAgICAgICAgICAgICAgICAoICAxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYzIHYzIHYzIHYzICAxICkKKyo+ICAgICAgICAgICAgICAgICAgICggICAgIDEgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgICAgMSApCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgRExBUkZCKCBTSURFLCBUUkFOUywgRElSRUNULCBTVE9SRVYsIE0sIE4sIEssIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBULCBMRFQsIEMsIExEQywgV09SSywgTERXT1JLICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ0hBUkFDVEVSICAgICAgICAgIERJUkVDVCwgU0lERSwgU1RPUkVWLCBUUkFOUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEQywgTERULCBMRFYsIExEV09SSywgTSwgTgorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEMoIExEQywgKiApLCBUKCBMRFQsICogKSwgViggTERWLCAqICksCisgICAgICQgICAgICAgICAgICAgICAgICAgV09SSyggTERXT1JLLCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE9ORSA9IDEuMEQrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ0hBUkFDVEVSICAgICAgICAgIFRSQU5TVAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEosIExBU1RWLCBMQVNUQworKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSUxBRExSLCBJTEFETEMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRSwgSUxBRExSLCBJTEFETEMKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERDT1BZLCBER0VNTSwgRFRSTU0KKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZQorKgorICAgICAgSUYoIE0uTEUuMCAuT1IuIE4uTEUuMCApCisgICAgICQgICBSRVRVUk4KKyoKKyAgICAgIElGKCBMU0FNRSggVFJBTlMsICdOJyApICkgVEhFTgorICAgICAgICAgVFJBTlNUID0gJ1QnCisgICAgICBFTFNFCisgICAgICAgICBUUkFOU1QgPSAnTicKKyAgICAgIEVORCBJRgorKgorICAgICAgSUYoIExTQU1FKCBTVE9SRVYsICdDJyApICkgVEhFTgorKgorICAgICAgICAgSUYoIExTQU1FKCBESVJFQ1QsICdGJyApICkgVEhFTgorKgorKiAgICAgICAgICAgTGV0ICBWID0gICggVjEgKSAgICAoZmlyc3QgSyByb3dzKQorKiAgICAgICAgICAgICAgICAgICAgICggVjIgKQorKiAgICAgICAgICAgd2hlcmUgIFYxICBpcyB1bml0IGxvd2VyIHRyaWFuZ3VsYXIuCisqCisgICAgICAgICAgICBJRiggTFNBTUUoIFNJREUsICdMJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgSCAqIEMgIG9yICBIKipUICogQyAgd2hlcmUgIEMgPSAoIEMxICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBRExSKCBNLCBLLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQURMQyggTEFTVFYsIE4sIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMqKlQgKiBWICA9ICAoQzEqKlQgKiBWMSArIEMyKipUICogVjIpICAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMxKipUCisqCisgICAgICAgICAgICAgICBETyAxMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBEQ09QWSggTEFTVEMsIEMoIEosIDEgKSwgTERDLCBXT1JLKCAxLCBKICksIDEgKQorICAgMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyKipUICpWMgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ1RyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCBLKzEsIDEgKSwgTERDLCBWKCBLKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQqKlQgIG9yICBXICogVAorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgVFJBTlNULCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBWICogVyoqVAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMiA6PSBDMiAtIFYyICogVyoqVAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ05vIHRyYW5zcG9zZScsICdUcmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUVi1LLCBMQVNUQywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgViggSysxLCAxICksIExEViwgV09SSywgTERXT1JLLCBPTkUsCisgICAgICQgICAgICAgICAgICAgICAgIEMoIEsrMSwgMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ1RyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXKipUCisqCisgICAgICAgICAgICAgICBETyAzMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBKLCBJICkgPSBDKCBKLCBJICkgLSBXT1JLKCBJLCBKICkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAzMCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqVCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBRExSKCBOLCBLLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQURMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWICA9ICAoQzEqVjEgKyBDMipWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEKKyoKKyAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIERDT1BZKCBMQVNUQywgQyggMSwgSiApLCAxLCBXT1JLKCAxLCBKICksIDEgKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyICogVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggMSwgSysxICksIExEQywgViggSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUICBvciAgVyAqIFQqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TLCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBXICogVioqVAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcgKiBWMioqVAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ05vIHRyYW5zcG9zZScsICdUcmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgTEFTVFYtSywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgV09SSywgTERXT1JLLCBWKCBLKzEsIDEgKSwgTERWLCBPTkUsCisgICAgICQgICAgICAgICAgICAgICAgIEMoIDEsIEsrMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ1RyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXCisqCisgICAgICAgICAgICAgICBETyA2MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBDKCBJLCBKICkgLSBXT1JLKCBJLCBKICkKKyAgIDUwICAgICAgICAgICAgIENPTlRJTlVFCisgICA2MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSApCisqICAgICAgICAgICAgICAgICAgICAgKCBWMiApICAgIChsYXN0IEsgcm93cykKKyogICAgICAgICAgIHdoZXJlICBWMiAgaXMgdW5pdCB1cHBlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqVCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQURMUiggTSwgSywgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFETEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipUICogViAgPSAgKEMxKipUICogVjEgKyBDMioqVCAqIFYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMioqVAorKgorICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgRENPUFkoIExBU1RDLCBDKCBMQVNUVi1LK0osIDEgKSwgTERDLAorICAgICAkICAgICAgICAgICAgICAgICBXT1JLKCAxLCBKICksIDEgKQorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCBMQVNUVi1LKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMSoqVCpWMQorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ1RyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywgT05FLCBDLCBMREMsIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipUICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdMb3dlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gViAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBWMSAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdObyB0cmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVFYtSywgTEFTVEMsIEssIC1PTkUsIFYsIExEViwgV09SSywgTERXT1JLLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipUCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnVHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCBMQVNUVi1LKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXKipUCisqCisgICAgICAgICAgICAgICBETyA5MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gODAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBMQVNUVi1LK0osIEkgKSA9IEMoIExBU1RWLUsrSiwgSSApIC0gV09SSyhJLCBKKQorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipUICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFETFIoIE4sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBRExSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYgID0gIChDMSpWMSArIEMyKlYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMgorKgorICAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIERDT1BZKCBMQVNUQywgQyggMSwgTi1LK0ogKSwgMSwgV09SSyggMSwgSiApLCAxICkKKyAgMTAwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggTEFTVFYtSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzEgKiBWMQorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ05vIHRyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywgT05FLCBDLCBMREMsIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUICBvciAgVyAqIFQqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdMb3dlcicsIFRSQU5TLCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBXICogVioqVAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMSA6PSBDMSAtIFcgKiBWMSoqVAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNTSggJ05vIHRyYW5zcG9zZScsICdUcmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgTEFTVFYtSywgSywgLU9ORSwgV09SSywgTERXT1JLLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQywgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcKKyoKKyAgICAgICAgICAgICAgIERPIDEyMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgTEFTVFYtSytKICkgPSBDKCBJLCBMQVNUVi1LK0ogKSAtIFdPUksoSSwgSikKKyAgMTEwICAgICAgICAgICAgIENPTlRJTlVFCisgIDEyMCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTkQgSUYKKyoKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBTVE9SRVYsICdSJyApICkgVEhFTgorKgorICAgICAgICAgSUYoIExTQU1FKCBESVJFQ1QsICdGJyApICkgVEhFTgorKgorKiAgICAgICAgICAgTGV0ICBWID0gICggVjEgIFYyICkgICAgKFYxOiBmaXJzdCBLIGNvbHVtbnMpCisqICAgICAgICAgICB3aGVyZSAgVjEgIGlzIHVuaXQgdXBwZXIgdHJpYW5ndWxhci4KKyoKKyAgICAgICAgICAgIElGKCBMU0FNRSggU0lERSwgJ0wnICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBIICogQyAgb3IgIEgqKlQgKiBDICB3aGVyZSAgQyA9ICggQzEgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFETEMoIEssIE0sIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBRExDKCBMQVNUViwgTiwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyoqVCAqIFYqKlQgID0gIChDMSoqVCAqIFYxKipUICsgQzIqKlQgKiBWMioqVCkgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMSoqVAorKgorICAgICAgICAgICAgICAgRE8gMTMwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIERDT1BZKCBMQVNUQywgQyggSiwgMSApLCBMREMsIFdPUksoIDEsIEogKSwgMSApCisgIDEzMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzIqKlQqVjIqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdUcmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggSysxLCAxICksIExEQywgViggMSwgSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipUICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVioqVCAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBWMioqVCAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdUcmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVFYtSywgTEFTVEMsIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFYoIDEsIEsrMSApLCBMRFYsIFdPUkssIExEV09SSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCBLKzEsIDEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVyoqVAorKgorICAgICAgICAgICAgICAgRE8gMTUwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAxNDAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBKLCBJICkgPSBDKCBKLCBJICkgLSBXT1JLKCBJLCBKICkKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgIDE1MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqVCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBRExDKCBLLCBOLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQURMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWKipUICA9ICAoQzEqVjEqKlQgKyBDMipWMioqVCkgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEKKyoKKyAgICAgICAgICAgICAgIERPIDE2MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBEQ09QWSggTEFTVEMsIEMoIDEsIEogKSwgMSwgV09SSyggMSwgSiApLCAxICkKKyAgMTYwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ1RyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMiAqIFYyKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIERHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIDEsIEsrMSApLCBMREMsIFYoIDEsIEsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipUCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXICogVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFdPUkssIExEV09SSywgViggMSwgSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCAxLCBLKzEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gMTgwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAxNzAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBDKCBJLCBKICkgLSBXT1JLKCBJLCBKICkKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgIDE4MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSAgVjIgKSAgICAoVjI6IGxhc3QgSyBjb2x1bW5zKQorKiAgICAgICAgICAgd2hlcmUgIFYyICBpcyB1bml0IGxvd2VyIHRyaWFuZ3VsYXIuCisqCisgICAgICAgICAgICBJRiggTFNBTUUoIFNJREUsICdMJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgSCAqIEMgIG9yICBIKipUICogQyAgd2hlcmUgIEMgPSAoIEMxICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBRExDKCBLLCBNLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQURMQyggTEFTVFYsIE4sIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMqKlQgKiBWKipUICA9ICAoQzEqKlQgKiBWMSoqVCArIEMyKipUICogVjIqKlQpIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIqKlQKKyoKKyAgICAgICAgICAgICAgIERPIDE5MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBEQ09QWSggTEFTVEMsIEMoIExBU1RWLUsrSiwgMSApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgIDE5MCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdMb3dlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxKipUICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdUcmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQywgTERDLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCoqVCAgb3IgIFcgKiBUCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOU1QsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFYqKlQgKiBXKipUCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMxIDo9IEMxIC0gVjEqKlQgKiBXKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIERHRU1NKCAnVHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RWLUssIExBU1RDLCBLLCAtT05FLCBWLCBMRFYsIFdPUkssIExEV09SSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggMSwgTEFTVFYtSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMyIDo9IEMyIC0gVyoqVAorKgorICAgICAgICAgICAgICAgRE8gMjEwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAyMDAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBMQVNUVi1LK0osIEkgKSA9IEMoIExBU1RWLUsrSiwgSSApIC0gV09SSyhJLCBKKQorICAyMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMjEwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipUICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFETEMoIEssIE4sIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBRExSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYqKlQgID0gIChDMSpWMSoqVCArIEMyKlYyKipUKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMgorKgorICAgICAgICAgICAgICAgRE8gMjIwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIERDT1BZKCBMQVNUQywgQyggMSwgTEFTVFYtSytKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgIDIyMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTU0oICdSaWdodCcsICdMb3dlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdObyB0cmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQywgTERDLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipUCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXICogVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssIC1PTkUsIFdPUkssIExEV09SSywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyCisqCisgICAgICAgICAgICAgICBDQUxMIERUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXCisqCisgICAgICAgICAgICAgICBETyAyNDAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDIzMCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEksIExBU1RWLUsrSiApID0gQyggSSwgTEFTVFYtSytKICkgLSBXT1JLKEksIEopCisgIDIzMCAgICAgICAgICAgICBDT05USU5VRQorICAyNDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERMQVJGQgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svZGxhcmZnLmYgYi9sYXBhY2svZGxhcmZnLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YWQyZQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9kbGFyZmcuZgpAQCAtMCwwICsxLDE5NiBAQAorKj4gXGJyaWVmIFxiIERMQVJGRworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIERMQVJGRyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvZGxhcmZnLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvZGxhcmZnLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvZGxhcmZnLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgRExBUkZHKCBOLCBBTFBIQSwgWCwgSU5DWCwgVEFVICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIE4KKyogICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBUQVUKKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYKCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IERMQVJGRyBnZW5lcmF0ZXMgYSByZWFsIGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggb2Ygb3JkZXIgbiwgc3VjaAorKj4gdGhhdAorKj4KKyo+ICAgICAgIEggKiAoIGFscGhhICkgPSAoIGJldGEgKSwgICBIKipUICogSCA9IEkuCisqPiAgICAgICAgICAgKCAgIHggICApICAgKCAgIDAgICkKKyo+CisqPiB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgYW5kIHggaXMgYW4gKG4tMSktZWxlbWVudCByZWFsCisqPiB2ZWN0b3IuIEggaXMgcmVwcmVzZW50ZWQgaW4gdGhlIGZvcm0KKyo+CisqPiAgICAgICBIID0gSSAtIHRhdSAqICggMSApICogKCAxIHYqKlQgKSAsCisqPiAgICAgICAgICAgICAgICAgICAgICggdiApCisqPgorKj4gd2hlcmUgdGF1IGlzIGEgcmVhbCBzY2FsYXIgYW5kIHYgaXMgYSByZWFsIChuLTEpLWVsZW1lbnQKKyo+IHZlY3Rvci4KKyo+CisqPiBJZiB0aGUgZWxlbWVudHMgb2YgeCBhcmUgYWxsIHplcm8sIHRoZW4gdGF1ID0gMCBhbmQgSCBpcyB0YWtlbiB0byBiZQorKj4gdGhlIHVuaXQgbWF0cml4LgorKj4KKyo+IE90aGVyd2lzZSAgMSA8PSB0YXUgPD0gMi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3Rvci4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbixvdXRdIEFMUEhBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEFMUEhBIGlzIERPVUJMRSBQUkVDSVNJT04KKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgdmFsdWUgYWxwaGEuCisqPiAgICAgICAgICBPbiBleGl0LCBpdCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSB2YWx1ZSBiZXRhLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgKDErKE4tMikqYWJzKElOQ1gpKQorKj4gICAgICAgICAgT24gZW50cnksIHRoZSB2ZWN0b3IgeC4KKyo+ICAgICAgICAgIE9uIGV4aXQsIGl0IGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHZlY3RvciB2LgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1ggaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGluY3JlbWVudCBiZXR3ZWVuIGVsZW1lbnRzIG9mIFguIElOQ1ggPiAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBET1VCTEUgUFJFQ0lTSU9OCisqPiAgICAgICAgICBUaGUgdmFsdWUgdGF1LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgZG91YmxlT1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBETEFSRkcoIE4sIEFMUEhBLCBYLCBJTkNYLCBUQVUgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgTgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBUQVUKKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYKCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBPTkUsIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE9ORSA9IDEuMEQrMCwgWkVSTyA9IDAuMEQrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEosIEtOVAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEJFVEEsIFJTQUZNTiwgU0FGTUlOLCBYTk9STQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIERMQU1DSCwgRExBUFkyLCBETlJNMgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERMQU1DSCwgRExBUFkyLCBETlJNMgorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIFNJR04KKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERTQ0FMCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBJRiggTi5MRS4xICkgVEhFTgorICAgICAgICAgVEFVID0gWkVSTworICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFhOT1JNID0gRE5STTIoIE4tMSwgWCwgSU5DWCApCisqCisgICAgICBJRiggWE5PUk0uRVEuWkVSTyApIFRIRU4KKyoKKyogICAgICAgIEggID0gIEkKKyoKKyAgICAgICAgIFRBVSA9IFpFUk8KKyAgICAgIEVMU0UKKyoKKyogICAgICAgIGdlbmVyYWwgY2FzZQorKgorICAgICAgICAgQkVUQSA9IC1TSUdOKCBETEFQWTIoIEFMUEhBLCBYTk9STSApLCBBTFBIQSApCisgICAgICAgICBTQUZNSU4gPSBETEFNQ0goICdTJyApIC8gRExBTUNIKCAnRScgKQorICAgICAgICAgS05UID0gMAorICAgICAgICAgSUYoIEFCUyggQkVUQSApLkxULlNBRk1JTiApIFRIRU4KKyoKKyogICAgICAgICAgIFhOT1JNLCBCRVRBIG1heSBiZSBpbmFjY3VyYXRlOyBzY2FsZSBYIGFuZCByZWNvbXB1dGUgdGhlbQorKgorICAgICAgICAgICAgUlNBRk1OID0gT05FIC8gU0FGTUlOCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgS05UID0gS05UICsgMQorICAgICAgICAgICAgQ0FMTCBEU0NBTCggTi0xLCBSU0FGTU4sIFgsIElOQ1ggKQorICAgICAgICAgICAgQkVUQSA9IEJFVEEqUlNBRk1OCisgICAgICAgICAgICBBTFBIQSA9IEFMUEhBKlJTQUZNTgorICAgICAgICAgICAgSUYoIEFCUyggQkVUQSApLkxULlNBRk1JTiApCisgICAgICQgICAgICAgICBHTyBUTyAxMAorKgorKiAgICAgICAgICAgTmV3IEJFVEEgaXMgYXQgbW9zdCAxLCBhdCBsZWFzdCBTQUZNSU4KKyoKKyAgICAgICAgICAgIFhOT1JNID0gRE5STTIoIE4tMSwgWCwgSU5DWCApCisgICAgICAgICAgICBCRVRBID0gLVNJR04oIERMQVBZMiggQUxQSEEsIFhOT1JNICksIEFMUEhBICkKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgVEFVID0gKCBCRVRBLUFMUEhBICkgLyBCRVRBCisgICAgICAgICBDQUxMIERTQ0FMKCBOLTEsIE9ORSAvICggQUxQSEEtQkVUQSApLCBYLCBJTkNYICkKKyoKKyogICAgICAgIElmIEFMUEhBIGlzIHN1Ym5vcm1hbCwgaXQgbWF5IGxvc2UgcmVsYXRpdmUgYWNjdXJhY3kKKyoKKyAgICAgICAgIERPIDIwIEogPSAxLCBLTlQKKyAgICAgICAgICAgIEJFVEEgPSBCRVRBKlNBRk1JTgorIDIwICAgICAgQ09OVElOVUUKKyAgICAgICAgIEFMUEhBID0gQkVUQQorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBETEFSRkcKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2RsYXJmdC5mIGIvbGFwYWNrL2RsYXJmdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzU1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZGxhcmZ0LmYKQEAgLTAsMCArMSwzMjYgQEAKKyo+IFxicmllZiBcYiBETEFSRlQKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBETEFSRlQgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXJmdC5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXJmdC5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2RsYXJmdC5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBTVUJST1VUSU5FIERMQVJGVCggRElSRUNULCBTVE9SRVYsIE4sIEssIFYsIExEViwgVEFVLCBULCBMRFQgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBDSEFSQUNURVIgICAgICAgICAgRElSRUNULCBTVE9SRVYKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEVCwgTERWLCBOCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVCggTERULCAqICksIFRBVSggKiApLCBWKCBMRFYsICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gRExBUkZUIGZvcm1zIHRoZSB0cmlhbmd1bGFyIGZhY3RvciBUIG9mIGEgcmVhbCBibG9jayByZWZsZWN0b3IgSAorKj4gb2Ygb3JkZXIgbiwgd2hpY2ggaXMgZGVmaW5lZCBhcyBhIHByb2R1Y3Qgb2YgayBlbGVtZW50YXJ5IHJlZmxlY3RvcnMuCisqPgorKj4gSWYgRElSRUNUID0gJ0YnLCBIID0gSCgxKSBIKDIpIC4gLiAuIEgoaykgYW5kIFQgaXMgdXBwZXIgdHJpYW5ndWxhcjsKKyo+CisqPiBJZiBESVJFQ1QgPSAnQicsIEggPSBIKGspIC4gLiAuIEgoMikgSCgxKSBhbmQgVCBpcyBsb3dlciB0cmlhbmd1bGFyLgorKj4KKyo+IElmIFNUT1JFViA9ICdDJywgdGhlIHZlY3RvciB3aGljaCBkZWZpbmVzIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvcgorKj4gSChpKSBpcyBzdG9yZWQgaW4gdGhlIGktdGggY29sdW1uIG9mIHRoZSBhcnJheSBWLCBhbmQKKyo+CisqPiAgICBIICA9ICBJIC0gViAqIFQgKiBWKipUCisqPgorKj4gSWYgU1RPUkVWID0gJ1InLCB0aGUgdmVjdG9yIHdoaWNoIGRlZmluZXMgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yCisqPiBIKGkpIGlzIHN0b3JlZCBpbiB0aGUgaS10aCByb3cgb2YgdGhlIGFycmF5IFYsIGFuZAorKj4KKyo+ICAgIEggID0gIEkgLSBWKipUICogVCAqIFYKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBESVJFQ1QKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgRElSRUNUIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICBTcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvcnMgYXJlCisqPiAgICAgICAgICBtdWx0aXBsaWVkIHRvIGZvcm0gdGhlIGJsb2NrIHJlZmxlY3RvcjoKKyo+ICAgICAgICAgID0gJ0YnOiBIID0gSCgxKSBIKDIpIC4gLiAuIEgoaykgKEZvcndhcmQpCisqPiAgICAgICAgICA9ICdCJzogSCA9IEgoaykgLiAuIC4gSCgyKSBIKDEpIChCYWNrd2FyZCkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gU1RPUkVWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFNUT1JFViBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgdmVjdG9ycyB3aGljaCBkZWZpbmUgdGhlIGVsZW1lbnRhcnkKKyo+ICAgICAgICAgIHJlZmxlY3RvcnMgYXJlIHN0b3JlZCAoc2VlIGFsc28gRnVydGhlciBEZXRhaWxzKToKKyo+ICAgICAgICAgID0gJ0MnOiBjb2x1bW53aXNlCisqPiAgICAgICAgICA9ICdSJzogcm93d2lzZQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBibG9jayByZWZsZWN0b3IgSC4gTiA+PSAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEsgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSB0cmlhbmd1bGFyIGZhY3RvciBUICg9IHRoZSBudW1iZXIgb2YKKyo+ICAgICAgICAgIGVsZW1lbnRhcnkgcmVmbGVjdG9ycykuIEsgPj0gMS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIERPVUJMRSBQUkVDSVNJT04gYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixLKSBpZiBTVE9SRVYgPSAnQycKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsTikgaWYgU1RPUkVWID0gJ1InCisqPiAgICAgICAgICBUaGUgbWF0cml4IFYuIFNlZSBmdXJ0aGVyIGRldGFpbHMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFYgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBWLgorKj4gICAgICAgICAgSWYgU1RPUkVWID0gJ0MnLCBMRFYgPj0gbWF4KDEsTik7IGlmIFNUT1JFViA9ICdSJywgTERWID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRBVQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBUQVUgaXMgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIChLKQorKj4gICAgICAgICAgVEFVKGkpIG11c3QgY29udGFpbiB0aGUgc2NhbGFyIGZhY3RvciBvZiB0aGUgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9yIEgoaSkuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFQgaXMgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIChMRFQsSykKKyo+ICAgICAgICAgIFRoZSBrIGJ5IGsgdHJpYW5ndWxhciBmYWN0b3IgVCBvZiB0aGUgYmxvY2sgcmVmbGVjdG9yLgorKj4gICAgICAgICAgSWYgRElSRUNUID0gJ0YnLCBUIGlzIHVwcGVyIHRyaWFuZ3VsYXI7IGlmIERJUkVDVCA9ICdCJywgVCBpcworKj4gICAgICAgICAgbG93ZXIgdHJpYW5ndWxhci4gVGhlIHJlc3Qgb2YgdGhlIGFycmF5IGlzIG5vdCB1c2VkLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERUIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgVC4gTERUID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBkb3VibGVPVEhFUmF1eGlsaWFyeQorKgorKj4gXHBhciBGdXJ0aGVyIERldGFpbHM6CisqICA9PT09PT09PT09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiAgVGhlIHNoYXBlIG9mIHRoZSBtYXRyaXggViBhbmQgdGhlIHN0b3JhZ2Ugb2YgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lCisqPiAgdGhlIEgoaSkgaXMgYmVzdCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2l0aCBuID0gNSBhbmQKKyo+ICBrID0gMy4gVGhlIGVsZW1lbnRzIGVxdWFsIHRvIDEgYXJlIG5vdCBzdG9yZWQuCisqPgorKj4gIERJUkVDVCA9ICdGJyBhbmQgU1RPUkVWID0gJ0MnOiAgICAgICAgIERJUkVDVCA9ICdGJyBhbmQgU1RPUkVWID0gJ1InOgorKj4KKyo+ICAgICAgICAgICAgICAgViA9ICggIDEgICAgICAgKSAgICAgICAgICAgICAgICAgViA9ICggIDEgdjEgdjEgdjEgdjEgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSAgMSAgICApICAgICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MiB2MiB2MiApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyICAxICkgICAgICAgICAgICAgICAgICAgICAoICAgICAgICAxIHYzIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPgorKj4gIERJUkVDVCA9ICdCJyBhbmQgU1RPUkVWID0gJ0MnOiAgICAgICAgIERJUkVDVCA9ICdCJyBhbmQgU1RPUkVWID0gJ1InOgorKj4KKyo+ICAgICAgICAgICAgICAgViA9ICggdjEgdjIgdjMgKSAgICAgICAgICAgICAgICAgViA9ICggdjEgdjEgIDEgICAgICAgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICAgICAgKCB2MiB2MiB2MiAgMSAgICApCisqPiAgICAgICAgICAgICAgICAgICAoICAxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYzIHYzIHYzIHYzICAxICkKKyo+ICAgICAgICAgICAgICAgICAgICggICAgIDEgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgICAgMSApCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgRExBUkZUKCBESVJFQ1QsIFNUT1JFViwgTiwgSywgViwgTERWLCBUQVUsIFQsIExEVCApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjEpIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIEFwcmlsIDIwMTIKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNUT1JFVgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEVCwgTERWLCBOCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVCggTERULCAqICksIFRBVSggKiApLCBWKCBMRFYsICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRCswLCBaRVJPID0gMC4wRCswICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgUFJFVkxBU1RWLCBMQVNUVgorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgREdFTVYsIERUUk1WCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNBTUUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlCisqCisgICAgICBJRiggTi5FUS4wICkKKyAgICAgJCAgIFJFVFVSTgorKgorICAgICAgSUYoIExTQU1FKCBESVJFQ1QsICdGJyApICkgVEhFTgorICAgICAgICAgUFJFVkxBU1RWID0gTgorICAgICAgICAgRE8gSSA9IDEsIEsKKyAgICAgICAgICAgIFBSRVZMQVNUViA9IE1BWCggSSwgUFJFVkxBU1RWICkKKyAgICAgICAgICAgIElGKCBUQVUoIEkgKS5FUS5aRVJPICkgVEhFTgorKgorKiAgICAgICAgICAgICAgSChpKSAgPSAgSQorKgorICAgICAgICAgICAgICAgRE8gSiA9IDEsIEkKKyAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgICAgZ2VuZXJhbCBjYXNlCisqCisgICAgICAgICAgICAgICBJRiggTFNBTUUoIFNUT1JFViwgJ0MnICkgKSBUSEVOCisqICAgICAgICAgICAgICAgICBTa2lwIGFueSB0cmFpbGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgIERPIExBU1RWID0gTiwgSSsxLCAtMQorICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIExBU1RWLCBJICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgRE8gSiA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogViggSSAsIEogKQorICAgICAgICAgICAgICAgICAgRU5EIERPICAgCisgICAgICAgICAgICAgICAgICBKID0gTUlOKCBMQVNUViwgUFJFVkxBU1RWICkKKyoKKyogICAgICAgICAgICAgICAgIFQoMTppLTEsaSkgOj0gLSB0YXUoaSkgKiBWKGk6aiwxOmktMSkqKlQgKiBWKGk6aixpKQorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNViggJ1RyYW5zcG9zZScsIEotSSwgSS0xLCAtVEFVKCBJICksIAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgViggSSsxLCAxICksIExEViwgViggSSsxLCBJICksIDEsIE9ORSwgCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUKCAxLCBJICksIDEgKQorICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgU2tpcCBhbnkgdHJhaWxpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IE4sIEkrMSwgLTEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBWKCBJLCBMQVNUViApLk5FLlpFUk8gKSBFWElUCisgICAgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIERPIEogPSAxLCBJLTEKKyAgICAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IC1UQVUoIEkgKSAqIFYoIEogLCBJICkKKyAgICAgICAgICAgICAgICAgIEVORCBETyAgIAorICAgICAgICAgICAgICAgICAgSiA9IE1JTiggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IC0gdGF1KGkpICogVigxOmktMSxpOmopICogVihpLGk6aikqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgREdFTVYoICdObyB0cmFuc3Bvc2UnLCBJLTEsIEotSSwgLVRBVSggSSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgViggMSwgSSsxICksIExEViwgViggSSwgSSsxICksIExEViwgT05FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVCggMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVCgxOmktMSxpKSA6PSBUKDE6aS0xLDE6aS0xKSAqIFQoMTppLTEsaSkKKyoKKyAgICAgICAgICAgICAgIENBTEwgRFRSTVYoICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnTm9uLXVuaXQnLCBJLTEsIFQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMRFQsIFQoIDEsIEkgKSwgMSApCisgICAgICAgICAgICAgICBUKCBJLCBJICkgPSBUQVUoIEkgKQorICAgICAgICAgICAgICAgSUYoIEkuR1QuMSApIFRIRU4KKyAgICAgICAgICAgICAgICAgIFBSRVZMQVNUViA9IE1BWCggUFJFVkxBU1RWLCBMQVNUViApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBQUkVWTEFTVFYgPSBMQVNUVgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBETworICAgICAgRUxTRQorICAgICAgICAgUFJFVkxBU1RWID0gMQorICAgICAgICAgRE8gSSA9IEssIDEsIC0xCisgICAgICAgICAgICBJRiggVEFVKCBJICkuRVEuWkVSTyApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEgoaSkgID0gIEkKKyoKKyAgICAgICAgICAgICAgIERPIEogPSBJLCBLCisgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgIEVMU0UKKyoKKyogICAgICAgICAgICAgIGdlbmVyYWwgY2FzZQorKgorICAgICAgICAgICAgICAgSUYoIEkuTFQuSyApIFRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyogICAgICAgICAgICAgICAgICAgIFNraXAgYW55IGxlYWRpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIExBU1RWLCBJICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgICAgRE8gSiA9IEkrMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogViggTi1LK0kgLCBKICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETyAgIAorICAgICAgICAgICAgICAgICAgICAgSiA9IE1BWCggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICAgICBUKGkrMTprLGkpID0gLXRhdShpKSAqIFYoajpuLWsraSxpKzE6aykqKlQgKiBWKGo6bi1rK2ksaSkKKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgREdFTVYoICdUcmFuc3Bvc2UnLCBOLUsrSS1KLCBLLUksIC1UQVUoIEkgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFYoIEosIEkrMSApLCBMRFYsIFYoIEosIEkgKSwgMSwgT05FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVCggSSsxLCBJICksIDEgKQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgU2tpcCBhbnkgbGVhZGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgICAgIERPIExBU1RWID0gMSwgSS0xCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggViggSSwgTEFTVFYgKS5ORS5aRVJPICkgRVhJVAorICAgICAgICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICAgICBETyBKID0gSSsxLCBLCisgICAgICAgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSAtVEFVKCBJICkgKiBWKCBKLCBOLUsrSSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgRE8gICAKKyAgICAgICAgICAgICAgICAgICAgIEogPSBNQVgoIExBU1RWLCBQUkVWTEFTVFYgKQorKgorKiAgICAgICAgICAgICAgICAgICAgVChpKzE6ayxpKSA9IC10YXUoaSkgKiBWKGkrMTprLGo6bi1rK2kpICogVihpLGo6bi1rK2kpKipUCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERHRU1WKCAnTm8gdHJhbnNwb3NlJywgSy1JLCBOLUsrSS1KLAorICAgICAkICAgICAgICAgICAgICAgICAgICAtVEFVKCBJICksIFYoIEkrMSwgSiApLCBMRFYsIFYoIEksIEogKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICAgICBPTkUsIFQoIEkrMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgVChpKzE6ayxpKSA6PSBUKGkrMTprLGkrMTprKSAqIFQoaSsxOmssaSkKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgRFRSTVYoICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnTm9uLXVuaXQnLCBLLUksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUKCBJKzEsIEkrMSApLCBMRFQsIFQoIEkrMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgICAgIElGKCBJLkdULjEgKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICBQUkVWTEFTVFYgPSBNSU4oIFBSRVZMQVNUViwgTEFTVFYgKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTEFTVFYKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBUKCBJLCBJICkgPSBUQVUoIEkgKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTkQgRE8KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRExBUkZUCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9kb3VibGUuY3BwIGIvbGFwYWNrL2RvdWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3OGJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9kb3VibGUuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIFNDQUxBUiAgICAgICAgZG91YmxlCisjZGVmaW5lIFNDQUxBUl9TVUZGSVggZAorI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJEIgorI2RlZmluZSBJU0NPTVBMRVggICAgIDAKKworI2luY2x1ZGUgImNob2xlc2t5LmNwcCIKKyNpbmNsdWRlICJsdS5jcHAiCisjaW5jbHVkZSAiZWlnZW52YWx1ZXMuY3BwIgorI2luY2x1ZGUgInN2ZC5jcHAiCmRpZmYgLS1naXQgYS9sYXBhY2svZHNlY25kX05PTkUuZiBiL2xhcGFjay9kc2VjbmRfTk9ORS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYThkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZHNlY25kX05PTkUuZgpAQCAtMCwwICsxLDUyIEBACisqPiBcYnJpZWYgXGIgRFNFQ05EIHJldHVybnMgbm90aGluZworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIERTRUNORCggKQorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gIERTRUNORCByZXR1cm5zIG5vdGhpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHVzZXIgdGltZSBmb3IgYSBwcm9jZXNzIGluIHNlY29uZHMuCisqPiAgSWYgeW91IGFyZSB1c2luZyB0aGF0IHJvdXRpbmUsIGl0IG1lYW5zIHRoYXQgbmVpdGhlciBFWFRFUk5BTCBFVElNRSwKKyo+ICBFWFRFUk5BTCBFVElNRV8sIElOVEVSTkFMIEVUSU1FLCBJTlRFUk5BTCBDUFVfVElNRSBpcyBhdmFpbGFibGUgIG9uCisqPiAgeW91ciBtYWNoaW5lLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgYXV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBEU0VDTkQoICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyAgICAgIERTRUNORCA9IDAuMEQrMAorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRFNFQ05ECisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9laWdlbnZhbHVlcy5jcHAgYi9sYXBhY2svZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMWM1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImxhcGFja19jb21tb24uaCIKKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKworLy8gY29tcHV0ZXMgZWlnZW4gdmFsdWVzIGFuZCB2ZWN0b3JzIG9mIGEgZ2VuZXJhbCBOLWJ5LU4gbWF0cml4IEEKK0VJR0VOX0xBUEFDS19GVU5DKHN5ZXYsKGNoYXIgKmpvYnosIGNoYXIgKnVwbG8sIGludCogbiwgU2NhbGFyKiBhLCBpbnQgKmxkYSwgU2NhbGFyKiB3LCBTY2FsYXIqIC8qd29yayovLCBpbnQqIGx3b3JrLCBpbnQgKmluZm8pKQoreworICAvLyBUT0RPIGV4cGxvaXQgdGhlIHdvcmsgYnVmZmVyCisgIGJvb2wgcXVlcnlfc2l6ZSA9ICpsd29yaz09LTE7CisgIAorICAqaW5mbyA9IDA7CisgICAgICAgIGlmKCpqb2J6IT0nTicgJiYgKmpvYnohPSdWJykgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTE7CisgIGVsc2UgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTM7CisgIGVsc2UgIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTU7CisgIGVsc2UgIGlmKCghcXVlcnlfc2l6ZSkgJiYgKmx3b3JrPHN0ZDo6bWF4KDEsMyoqbi0xKSkgICppbmZvID0gLTg7CisgICAgCisgIGlmKCppbmZvIT0wKQorICB7CisgICAgaW50IGUgPSAtKmluZm87CisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWUVWICIsICZlLCA2KTsKKyAgfQorICAKKyAgaWYocXVlcnlfc2l6ZSkKKyAgeworICAgICpsd29yayA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmKCpuPT0wKQorICAgIHJldHVybiAwOworICAKKyAgUGxhaW5NYXRyaXhUeXBlIG1hdCgqbiwqbik7CisgIGlmKFVQTE8oKnVwbG8pPT1VUCkgbWF0ID0gbWF0cml4KGEsKm4sKm4sKmxkYSkuYWRqb2ludCgpOworICBlbHNlICAgICAgICAgICAgICAgIG1hdCA9IG1hdHJpeChhLCpuLCpuLCpsZGEpOworICAKKyAgYm9vbCBjb21wdXRlVmVjdG9ycyA9ICpqb2J6PT0nVicgfHwgKmpvYno9PSd2JzsKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxQbGFpbk1hdHJpeFR5cGU+IGVpZyhtYXQsY29tcHV0ZVZlY3RvcnM/Q29tcHV0ZUVpZ2VudmVjdG9yczpFaWdlbnZhbHVlc09ubHkpOworICAKKyAgaWYoZWlnLmluZm8oKT09Tm9Db252ZXJnZW5jZSkKKyAgeworICAgIG1ha2VfdmVjdG9yKHcsKm4pLnNldFplcm8oKTsKKyAgICBpZihjb21wdXRlVmVjdG9ycykKKyAgICAgIG1hdHJpeChhLCpuLCpuLCpsZGEpLnNldElkZW50aXR5KCk7CisgICAgLy8qaW5mbyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIG1ha2VfdmVjdG9yKHcsKm4pID0gZWlnLmVpZ2VudmFsdWVzKCk7CisgIGlmKGNvbXB1dGVWZWN0b3JzKQorICAgIG1hdHJpeChhLCpuLCpuLCpsZGEpID0gZWlnLmVpZ2VudmVjdG9ycygpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sYXBhY2svaWxhY2xjLmYgYi9sYXBhY2svaWxhY2xjLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlYjYxYwotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9pbGFjbGMuZgpAQCAtMCwwICsxLDExOCBAQAorKj4gXGJyaWVmIFxiIElMQUNMQworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIElMQUNMQyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhY2xjLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhY2xjLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhY2xjLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBQ0xDKCBNLCBOLCBBLCBMREEgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTERBLCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IElMQUNMQyBzY2FucyBBIGZvciBpdHMgbGFzdCBub24temVybyBjb2x1bW4uCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEEgaXMgQ09NUExFWCBhcnJheSwgZGltZW5zaW9uIChMREEsTikKKyo+ICAgICAgICAgIFRoZSBtIGJ5IG4gbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMREEgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBBLiBMREEgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgSU5URUdFUiBGVU5DVElPTiBJTEFDTEMoIE0sIE4sIEEsIExEQSApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBNLCBOLCBMREEKKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBMREEsICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgKCBaRVJPID0gKDAuMEUrMCwgMC4wRSswKSApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiBJCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayB0ZXN0IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgb25lIGNvcm5lciBpcyBub24temVyby4KKyAgICAgIElGKCBOLkVRLjAgKSBUSEVOCisgICAgICAgICBJTEFDTEMgPSBOCisgICAgICBFTFNFIElGKCBBKDEsIE4pLk5FLlpFUk8gLk9SLiBBKE0sIE4pLk5FLlpFUk8gKSBUSEVOCisgICAgICAgICBJTEFDTEMgPSBOCisgICAgICBFTFNFCisqICAgICBOb3cgc2NhbiBlYWNoIGNvbHVtbiBmcm9tIHRoZSBlbmQsIHJldHVybmluZyB3aXRoIHRoZSBmaXJzdCBub24temVyby4KKyAgICAgICAgIERPIElMQUNMQyA9IE4sIDEsIC0xCisgICAgICAgICAgICBETyBJID0gMSwgTQorICAgICAgICAgICAgICAgSUYoIEEoSSwgSUxBQ0xDKS5ORS5aRVJPICkgUkVUVVJOCisgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgIEVORCBETworICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2lsYWNsci5mIGIvbGFwYWNrL2lsYWNsci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWIwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svaWxhY2xyLmYKQEAgLTAsMCArMSwxMjEgQEAKKyo+IFxicmllZiBcYiBJTEFDTFIKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBJTEFDTFIgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYWNsci5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYWNsci5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYWNsci5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQUNMUiggTSwgTiwgQSwgTERBICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBJTEFDTFIgc2NhbnMgQSBmb3IgaXRzIGxhc3Qgbm9uLXplcm8gcm93LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBBIGlzIGFycmF5LCBkaW1lbnNpb24gKExEQSxOKQorKj4gICAgICAgICAgVGhlIG0gYnkgbiBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEQSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IEEuIExEQSA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXhPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQUNMUiggTSwgTiwgQSwgTERBICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoIFpFUk8gPSAoMC4wRSswLCAwLjBFKzApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSIEksIEoKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFF1aWNrIHRlc3QgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBvbmUgY29ybmVyIGlzIG5vbi16ZXJvLgorICAgICAgSUYoIE0uRVEuMCApIFRIRU4KKyAgICAgICAgIElMQUNMUiA9IE0KKyAgICAgIEVMU0UgSUYoIEEoTSwgMSkuTkUuWkVSTyAuT1IuIEEoTSwgTikuTkUuWkVSTyApIFRIRU4KKyAgICAgICAgIElMQUNMUiA9IE0KKyAgICAgIEVMU0UKKyogICAgIFNjYW4gdXAgZWFjaCBjb2x1bW4gdHJhY2tpbmcgdGhlIGxhc3QgemVybyByb3cgc2Vlbi4KKyAgICAgICAgIElMQUNMUiA9IDAKKyAgICAgICAgIERPIEogPSAxLCBOCisgICAgICAgICAgICBJPU0KKyAgICAgICAgICAgIERPIFdISUxFKChBKE1BWChJLDEpLEopLkVRLlpFUk8pLkFORC4oSS5HRS4xKSkKKyAgICAgICAgICAgICAgIEk9SS0xCisgICAgICAgICAgICBFTkRETworICAgICAgICAgICAgSUxBQ0xSID0gTUFYKCBJTEFDTFIsIEkgKQorICAgICAgICAgRU5EIERPCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svaWxhZGxjLmYgYi9sYXBhY2svaWxhZGxjLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9pbGFkbGMuZgpAQCAtMCwwICsxLDExOCBAQAorKj4gXGJyaWVmIFxiIElMQURMQworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIElMQURMQyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhZGxjLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhZGxjLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhZGxjLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBRExDKCBNLCBOLCBBLCBMREEgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTERBLCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IElMQURMQyBzY2FucyBBIGZvciBpdHMgbGFzdCBub24temVybyBjb2x1bW4uCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEEgaXMgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIChMREEsTikKKyo+ICAgICAgICAgIFRoZSBtIGJ5IG4gbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMREEgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBBLiBMREEgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBhdXhPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQURMQyggTSwgTiwgQSwgTERBICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIExEQSwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoIFpFUk8gPSAwLjBEKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgSQorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUXVpY2sgdGVzdCBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIG9uZSBjb3JuZXIgaXMgbm9uLXplcm8uCisgICAgICBJRiggTi5FUS4wICkgVEhFTgorICAgICAgICAgSUxBRExDID0gTgorICAgICAgRUxTRSBJRiggQSgxLCBOKS5ORS5aRVJPIC5PUi4gQShNLCBOKS5ORS5aRVJPICkgVEhFTgorICAgICAgICAgSUxBRExDID0gTgorICAgICAgRUxTRQorKiAgICAgTm93IHNjYW4gZWFjaCBjb2x1bW4gZnJvbSB0aGUgZW5kLCByZXR1cm5pbmcgd2l0aCB0aGUgZmlyc3Qgbm9uLXplcm8uCisgICAgICAgICBETyBJTEFETEMgPSBOLCAxLCAtMQorICAgICAgICAgICAgRE8gSSA9IDEsIE0KKyAgICAgICAgICAgICAgIElGKCBBKEksIElMQURMQykuTkUuWkVSTyApIFJFVFVSTgorICAgICAgICAgICAgRU5EIERPCisgICAgICAgICBFTkQgRE8KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9pbGFkbHIuZiBiL2xhcGFjay9pbGFkbHIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE0YzYxCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2lsYWRsci5mCkBAIC0wLDAgKzEsMTIxIEBACisqPiBcYnJpZWYgXGIgSUxBRExSCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgSUxBRExSICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9pbGFkbHIuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9pbGFkbHIuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9pbGFkbHIuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgSU5URUdFUiBGVU5DVElPTiBJTEFETFIoIE0sIE4sIEEsIExEQSApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIElOVEVHRVIgICAgICAgICAgICBNLCBOLCBMREEKKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBMREEsICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gSUxBRExSIHNjYW5zIEEgZm9yIGl0cyBsYXN0IG5vbi16ZXJvIHJvdy4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBNCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE0gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBOIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQSBpcyBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24gKExEQSxOKQorKj4gICAgICAgICAgVGhlIG0gYnkgbiBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEQSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IEEuIExEQSA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBRExSKCBNLCBOLCBBLCBMREEgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTERBLCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gWkVSTworICAgICAgUEFSQU1FVEVSICggWkVSTyA9IDAuMEQrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiBJLCBKCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayB0ZXN0IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgb25lIGNvcm5lciBpcyBub24temVyby4KKyAgICAgIElGKCBNLkVRLjAgKSBUSEVOCisgICAgICAgICBJTEFETFIgPSBNCisgICAgICBFTFNFIElGKCBBKE0sIDEpLk5FLlpFUk8gLk9SLiBBKE0sIE4pLk5FLlpFUk8gKSBUSEVOCisgICAgICAgICBJTEFETFIgPSBNCisgICAgICBFTFNFCisqICAgICBTY2FuIHVwIGVhY2ggY29sdW1uIHRyYWNraW5nIHRoZSBsYXN0IHplcm8gcm93IHNlZW4uCisgICAgICAgICBJTEFETFIgPSAwCisgICAgICAgICBETyBKID0gMSwgTgorICAgICAgICAgICAgST1NCisgICAgICAgICAgICBETyBXSElMRSgoQShNQVgoSSwxKSxKKS5FUS5aRVJPKS5BTkQuKEkuR0UuMSkpCisgICAgICAgICAgICAgICBJPUktMQorICAgICAgICAgICAgRU5ERE8KKyAgICAgICAgICAgIElMQURMUiA9IE1BWCggSUxBRExSLCBJICkKKyAgICAgICAgIEVORCBETworICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2lsYXNsYy5mIGIvbGFwYWNrL2lsYXNsYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGIwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svaWxhc2xjLmYKQEAgLTAsMCArMSwxMTggQEAKKyo+IFxicmllZiBcYiBJTEFTTEMKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBJTEFTTEMgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsYy5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsYy5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsYy5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQVNMQyggTSwgTiwgQSwgTERBICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBJTEFTTEMgc2NhbnMgQSBmb3IgaXRzIGxhc3Qgbm9uLXplcm8gY29sdW1uLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBBIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoTERBLE4pCisqPiAgICAgICAgICBUaGUgbSBieSBuIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERBIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQS4gTERBID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgcmVhbE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBU0xDKCBNLCBOLCBBLCBMREEgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTERBLCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICggWkVSTyA9IDAuMEQrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiBJCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayB0ZXN0IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgb25lIGNvcm5lciBpcyBub24temVyby4KKyAgICAgIElGKCBOLkVRLjAgKSBUSEVOCisgICAgICAgICBJTEFTTEMgPSBOCisgICAgICBFTFNFIElGKCBBKDEsIE4pLk5FLlpFUk8gLk9SLiBBKE0sIE4pLk5FLlpFUk8gKSBUSEVOCisgICAgICAgICBJTEFTTEMgPSBOCisgICAgICBFTFNFCisqICAgICBOb3cgc2NhbiBlYWNoIGNvbHVtbiBmcm9tIHRoZSBlbmQsIHJldHVybmluZyB3aXRoIHRoZSBmaXJzdCBub24temVyby4KKyAgICAgICAgIERPIElMQVNMQyA9IE4sIDEsIC0xCisgICAgICAgICAgICBETyBJID0gMSwgTQorICAgICAgICAgICAgICAgSUYoIEEoSSwgSUxBU0xDKS5ORS5aRVJPICkgUkVUVVJOCisgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgIEVORCBETworICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL2lsYXNsci5mIGIvbGFwYWNrL2lsYXNsci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjczZjQKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svaWxhc2xyLmYKQEAgLTAsMCArMSwxMjEgQEAKKyo+IFxicmllZiBcYiBJTEFTTFIKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBJTEFTTFIgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsci5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsci5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL2lsYXNsci5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQVNMUiggTSwgTiwgQSwgTERBICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBJTEFTTFIgc2NhbnMgQSBmb3IgaXRzIGxhc3Qgbm9uLXplcm8gcm93LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBBIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoTERBLE4pCisqPiAgICAgICAgICBUaGUgbSBieSBuIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERBIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQS4gTERBID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgcmVhbE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBU0xSKCBNLCBOLCBBLCBMREEgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4xKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBBcHJpbCAyMDEyCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTERBLCAqICkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICggWkVSTyA9IDAuMEUrMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiBJLCBKCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayB0ZXN0IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgb25lIGNvcm5lciBpcyBub24temVyby4KKyAgICAgIElGKCBNLkVRLjAgKSBUSEVOCisgICAgICAgICBJTEFTTFIgPSBNCisgICAgICBFTFNFSUYoIEEoTSwgMSkuTkUuWkVSTyAuT1IuIEEoTSwgTikuTkUuWkVSTyApIFRIRU4KKyAgICAgICAgIElMQVNMUiA9IE0KKyAgICAgIEVMU0UKKyogICAgIFNjYW4gdXAgZWFjaCBjb2x1bW4gdHJhY2tpbmcgdGhlIGxhc3QgemVybyByb3cgc2Vlbi4KKyAgICAgICAgIElMQVNMUiA9IDAKKyAgICAgICAgIERPIEogPSAxLCBOCisgICAgICAgICAgICBJPU0KKyAgICAgICAgICAgIERPIFdISUxFKChBKE1BWChJLDEpLEopLkVRLlpFUk8pLkFORC4oSS5HRS4xKSkKKyAgICAgICAgICAgICAgIEk9SS0xCisgICAgICAgICAgICBFTkRETworICAgICAgICAgICAgSUxBU0xSID0gTUFYKCBJTEFTTFIsIEkgKQorICAgICAgICAgRU5EIERPCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svaWxhemxjLmYgYi9sYXBhY2svaWxhemxjLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViMTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9pbGF6bGMuZgpAQCAtMCwwICsxLDExOCBAQAorKj4gXGJyaWVmIFxiIElMQVpMQworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIElMQVpMQyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxjLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxjLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxjLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBWkxDKCBNLCBOLCBBLCBMREEgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTERBLCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IElMQVpMQyBzY2FucyBBIGZvciBpdHMgbGFzdCBub24temVybyBjb2x1bW4uCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEEgaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uIChMREEsTikKKyo+ICAgICAgICAgIFRoZSBtIGJ5IG4gbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMREEgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBBLiBMREEgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4MTZPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQVpMQyggTSwgTiwgQSwgTERBICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoIFpFUk8gPSAoMC4wRCswLCAwLjBEKzApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSIEkKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFF1aWNrIHRlc3QgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBvbmUgY29ybmVyIGlzIG5vbi16ZXJvLgorICAgICAgSUYoIE4uRVEuMCApIFRIRU4KKyAgICAgICAgIElMQVpMQyA9IE4KKyAgICAgIEVMU0UgSUYoIEEoMSwgTikuTkUuWkVSTyAuT1IuIEEoTSwgTikuTkUuWkVSTyApIFRIRU4KKyAgICAgICAgIElMQVpMQyA9IE4KKyAgICAgIEVMU0UKKyogICAgIE5vdyBzY2FuIGVhY2ggY29sdW1uIGZyb20gdGhlIGVuZCwgcmV0dXJuaW5nIHdpdGggdGhlIGZpcnN0IG5vbi16ZXJvLgorICAgICAgICAgRE8gSUxBWkxDID0gTiwgMSwgLTEKKyAgICAgICAgICAgIERPIEkgPSAxLCBNCisgICAgICAgICAgICAgICBJRiggQShJLCBJTEFaTEMpLk5FLlpFUk8gKSBSRVRVUk4KKyAgICAgICAgICAgIEVORCBETworICAgICAgICAgRU5EIERPCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svaWxhemxyLmYgYi9sYXBhY2svaWxhemxyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhYjk0MwotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9pbGF6bHIuZgpAQCAtMCwwICsxLDEyMSBAQAorKj4gXGJyaWVmIFxiIElMQVpMUgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIElMQVpMUiArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxyLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxyLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvaWxhemxyLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIElOVEVHRVIgRlVOQ1RJT04gSUxBWkxSKCBNLCBOLCBBLCBMREEgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgTSwgTiwgTERBCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTERBLCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IElMQVpMUiBzY2FucyBBIGZvciBpdHMgbGFzdCBub24temVybyByb3cuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBBLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEEgaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uIChMREEsTikKKyo+ICAgICAgICAgIFRoZSBtIGJ5IG4gbWF0cml4IEEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEQQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMREEgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBBLiBMREEgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBBcHJpbCAyMDEyCisqCisqPiBcaW5ncm91cCBjb21wbGV4MTZPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIElMQVpMUiggTSwgTiwgQSwgTERBICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE0sIE4sIExEQQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIExEQSwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoIFpFUk8gPSAoMC4wRCswLCAwLjBEKzApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSIEksIEoKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFF1aWNrIHRlc3QgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBvbmUgY29ybmVyIGlzIG5vbi16ZXJvLgorICAgICAgSUYoIE0uRVEuMCApIFRIRU4KKyAgICAgICAgIElMQVpMUiA9IE0KKyAgICAgIEVMU0UgSUYoIEEoTSwgMSkuTkUuWkVSTyAuT1IuIEEoTSwgTikuTkUuWkVSTyApIFRIRU4KKyAgICAgICAgIElMQVpMUiA9IE0KKyAgICAgIEVMU0UKKyogICAgIFNjYW4gdXAgZWFjaCBjb2x1bW4gdHJhY2tpbmcgdGhlIGxhc3QgemVybyByb3cgc2Vlbi4KKyAgICAgICAgIElMQVpMUiA9IDAKKyAgICAgICAgIERPIEogPSAxLCBOCisgICAgICAgICAgICBJPU0KKyAgICAgICAgICAgIERPIFdISUxFKChBKE1BWChJLDEpLEopLkVRLlpFUk8pLkFORC4oSS5HRS4xKSkKKyAgICAgICAgICAgICAgIEk9SS0xCisgICAgICAgICAgICBFTkRETworICAgICAgICAgICAgSUxBWkxSID0gTUFYKCBJTEFaTFIsIEkgKQorICAgICAgICAgRU5EIERPCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svbGFwYWNrX2NvbW1vbi5oIGIvbGFwYWNrL2xhcGFja19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODcyYTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2xhcGFja19jb21tb24uaApAQCAtMCwwICsxLDI5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MQVBBQ0tfQ09NTU9OX0gKKyNkZWZpbmUgRUlHRU5fTEFQQUNLX0NPTU1PTl9ICisKKyNpbmNsdWRlICIuLi9ibGFzL2NvbW1vbi5oIgorI2luY2x1ZGUgIi4uL0VpZ2VuL3NyYy9taXNjL2xhcGFjay5oIgorCisjZGVmaW5lIEVJR0VOX0xBUEFDS19GVU5DKEZVTkMsQVJHTElTVCkgICAgICAgICAgICAgICBcCisgIGV4dGVybiAiQyIgeyBpbnQgRUlHRU5fQkxBU19GVU5DKEZVTkMpIEFSR0xJU1Q7IH0gICBcCisgIGludCBFSUdFTl9CTEFTX0ZVTkMoRlVOQykgQVJHTElTVAorCit0eXBlZGVmIEVpZ2VuOjpNYXA8RWlnZW46OlRyYW5zcG9zaXRpb25zPEVpZ2VuOjpEeW5hbWljLEVpZ2VuOjpEeW5hbWljLGludD4gPiBQaXZvdHNUeXBlOworCisjaWYgSVNDT01QTEVYCisjZGVmaW5lIEVJR0VOX0xBUEFDS19BUkdfSUZfQ09NUExFWChYKSBYLAorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fTEFQQUNLX0FSR19JRl9DT01QTEVYKFgpCisjZW5kaWYKKworCisjZW5kaWYgLy8gRUlHRU5fTEFQQUNLX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9sYXBhY2svbHUuY3BwIGIvbGFwYWNrL2x1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNlYmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL2x1LmNwcApAQCAtMCwwICsxLDg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCisvLyBjb21wdXRlcyBhbiBMVSBmYWN0b3JpemF0aW9uIG9mIGEgZ2VuZXJhbCBNLWJ5LU4gbWF0cml4IEEgdXNpbmcgcGFydGlhbCBwaXZvdGluZyB3aXRoIHJvdyBpbnRlcmNoYW5nZXMKK0VJR0VOX0xBUEFDS19GVU5DKGdldHJmLChpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBpbnQgKmlwaXYsIGludCAqaW5mbykpCit7CisgICppbmZvID0gMDsKKyAgICAgICAgaWYoKm08MCkgICAgICAgICAgICAgICAgICAqaW5mbyA9IC0xOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgKmluZm8gPSAtNDsKKyAgaWYoKmluZm8hPTApCisgIHsKKyAgICBpbnQgZSA9IC0qaW5mbzsKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFVFJGIiwgJmUsIDYpOworICB9CisKKyAgaWYoKm09PTAgfHwgKm49PTApCisgICAgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIGludCBuYl90cmFuc3Bvc2l0aW9uczsKKyAgaW50IHJldCA9IGludChFaWdlbjo6aW50ZXJuYWw6OnBhcnRpYWxfbHVfaW1wbDxTY2FsYXIsQ29sTWFqb3IsaW50PgorICAgICAgICAgICAgICAgICAgICAgOjpibG9ja2VkX2x1KCptLCAqbiwgYSwgKmxkYSwgaXBpdiwgbmJfdHJhbnNwb3NpdGlvbnMpKTsKKworICBmb3IoaW50IGk9MDsgaTxzdGQ6Om1pbigqbSwqbik7ICsraSkKKyAgICBpcGl2W2ldKys7CisKKyAgaWYocmV0Pj0wKQorICAgICppbmZvID0gcmV0KzE7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vR0VUUlMgc29sdmVzIGEgc3lzdGVtIG9mIGxpbmVhciBlcXVhdGlvbnMKKy8vICAgIEEgKiBYID0gQiAgb3IgIEEnICogWCA9IEIKKy8vICB3aXRoIGEgZ2VuZXJhbCBOLWJ5LU4gbWF0cml4IEEgdXNpbmcgdGhlIExVIGZhY3Rvcml6YXRpb24gY29tcHV0ZWQgIGJ5IEdFVFJGCitFSUdFTl9MQVBBQ0tfRlVOQyhnZXRycywoY2hhciAqdHJhbnMsIGludCAqbiwgaW50ICpucmhzLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIGludCAqaXBpdiwgUmVhbFNjYWxhciAqcGIsIGludCAqbGRiLCBpbnQgKmluZm8pKQoreworICAqaW5mbyA9IDA7CisgICAgICAgIGlmKE9QKCp0cmFucyk9PUlOVkFMSUQpICAqaW5mbyA9IC0xOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgKmluZm8gPSAtMjsKKyAgZWxzZSAgaWYoKm5yaHM8MCkgICAgICAgICAgICAgICppbmZvID0gLTM7CisgIGVsc2UgIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAqaW5mbyA9IC01OworICBlbHNlICBpZigqbGRiPHN0ZDo6bWF4KDEsKm4pKSAgKmluZm8gPSAtODsKKyAgaWYoKmluZm8hPTApCisgIHsKKyAgICBpbnQgZSA9IC0qaW5mbzsKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFVFJTIiwgJmUsIDYpOworICB9CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBNYXRyaXhUeXBlIGx1KGEsKm4sKm4sKmxkYSk7CisgIE1hdHJpeFR5cGUgQihiLCpuLCpucmhzLCpsZGIpOworCisgIGZvcihpbnQgaT0wOyBpPCpuOyArK2kpCisgICAgaXBpdltpXS0tOworICBpZihPUCgqdHJhbnMpPT1OT1RSKQorICB7CisgICAgQiA9IFBpdm90c1R5cGUoaXBpdiwqbikgKiBCOworICAgIGx1LnRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS5zb2x2ZUluUGxhY2UoQik7CisgICAgbHUudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKEIpOworICB9CisgIGVsc2UgaWYoT1AoKnRyYW5zKT09VFIpCisgIHsKKyAgICBsdS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50cmFuc3Bvc2UoKS5zb2x2ZUluUGxhY2UoQik7CisgICAgbHUudHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnRyYW5zcG9zZSgpLnNvbHZlSW5QbGFjZShCKTsKKyAgICBCID0gUGl2b3RzVHlwZShpcGl2LCpuKS50cmFuc3Bvc2UoKSAqIEI7CisgIH0KKyAgZWxzZSBpZihPUCgqdHJhbnMpPT1BREopCisgIHsKKyAgICBsdS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5hZGpvaW50KCkuc29sdmVJblBsYWNlKEIpOworICAgIGx1LnRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS5hZGpvaW50KCkuc29sdmVJblBsYWNlKEIpOworICAgIEIgPSBQaXZvdHNUeXBlKGlwaXYsKm4pLnRyYW5zcG9zZSgpICogQjsKKyAgfQorICBmb3IoaW50IGk9MDsgaTwqbjsgKytpKQorICAgIGlwaXZbaV0rKzsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xhcGFjay9zZWNvbmRfTk9ORS5mIGIvbGFwYWNrL3NlY29uZF9OT05FLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlNmQzMwotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zZWNvbmRfTk9ORS5mCkBAIC0wLDAgKzEsNTIgQEAKKyo+IFxicmllZiBcYiBTRUNPTkQgcmV0dXJucyBub3RoaW5nCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgIFJFQUwgRlVOQ1RJT04gU0VDT05EKCApCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiAgU0VDT05EIHJldHVybnMgbm90aGluZyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgdXNlciB0aW1lIGZvciBhIHByb2Nlc3MgaW4gc2Vjb25kcy4KKyo+ICBJZiB5b3UgYXJlIHVzaW5nIHRoYXQgcm91dGluZSwgaXQgbWVhbnMgdGhhdCBuZWl0aGVyIEVYVEVSTkFMIEVUSU1FLAorKj4gIEVYVEVSTkFMIEVUSU1FXywgSU5URVJOQUwgRVRJTUUsIElOVEVSTkFMIENQVV9USU1FIGlzIGF2YWlsYWJsZSAgb24KKyo+ICB5b3VyIG1hY2hpbmUuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBhdXhPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBSRUFMIEZVTkNUSU9OIFNFQ09ORCggKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorICAgICAgU0VDT05EID0gMC4wRSswCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTRUNPTkQKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL3NpbmdsZS5jcHAgYi9sYXBhY2svc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RhM2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBmbG9hdAorI2RlZmluZSBTQ0FMQVJfU1VGRklYIHMKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiUyIKKyNkZWZpbmUgSVNDT01QTEVYICAgICAwCisKKyNpbmNsdWRlICJjaG9sZXNreS5jcHAiCisjaW5jbHVkZSAibHUuY3BwIgorI2luY2x1ZGUgImVpZ2VudmFsdWVzLmNwcCIKKyNpbmNsdWRlICJzdmQuY3BwIgpkaWZmIC0tZ2l0IGEvbGFwYWNrL3NsYWRpdi5mIGIvbGFwYWNrL3NsYWRpdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhM2FmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svc2xhZGl2LmYKQEAgLTAsMCArMSwxMjggQEAKKyo+IFxicmllZiBcYiBTTEFESVYKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBTTEFESVYgKyBkZXBlbmRlbmNpZXMgCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50Z3o/Zm9ybWF0PXRneiZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL3NsYWRpdi5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL3NsYWRpdi5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL3NsYWRpdi5mIj4gCisqPiBbVFhUXTwvYT4KKyo+IFxlbmRodG1sb25seSAKKyoKKyogIERlZmluaXRpb246CisqICA9PT09PT09PT09PQorKgorKiAgICAgICBTVUJST1VUSU5FIFNMQURJViggQSwgQiwgQywgRCwgUCwgUSApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIFJFQUwgICAgICAgICAgICAgICBBLCBCLCBDLCBELCBQLCBRCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBTTEFESVYgcGVyZm9ybXMgY29tcGxleCBkaXZpc2lvbiBpbiAgcmVhbCBhcml0aG1ldGljCisqPgorKj4gICAgICAgICAgICAgICAgICAgICAgIGEgKyBpKmIKKyo+ICAgICAgICAgICAgcCArIGkqcSA9IC0tLS0tLS0tLQorKj4gICAgICAgICAgICAgICAgICAgICAgIGMgKyBpKmQKKyo+CisqPiBUaGUgYWxnb3JpdGhtIGlzIGR1ZSB0byBSb2JlcnQgTC4gU21pdGggYW5kIGNhbiBiZSBmb3VuZAorKj4gaW4gRC4gS251dGgsIFRoZSBhcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcsIFZvbC4yLCBwLjE5NQorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIEEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQSBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEIKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQiBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQyBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgRCBpcyBSRUFMCisqPiAgICAgICAgICBUaGUgc2NhbGFycyBhLCBiLCBjLCBhbmQgZCBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFAKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgUCBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBRCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFEgaXMgUkVBTAorKj4gICAgICAgICAgVGhlIHNjYWxhcnMgcCBhbmQgcSBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgU0xBRElWKCBBLCBCLCBDLCBELCBQLCBRICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEsIEIsIEMsIEQsIFAsIFEKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFLCBGCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIEFCUyggRCApLkxULkFCUyggQyApICkgVEhFTgorICAgICAgICAgRSA9IEQgLyBDCisgICAgICAgICBGID0gQyArIEQqRQorICAgICAgICAgUCA9ICggQStCKkUgKSAvIEYKKyAgICAgICAgIFEgPSAoIEItQSpFICkgLyBGCisgICAgICBFTFNFCisgICAgICAgICBFID0gQyAvIEQKKyAgICAgICAgIEYgPSBEICsgQypFCisgICAgICAgICBQID0gKCBCK0EqRSApIC8gRgorICAgICAgICAgUSA9ICggLUErQipFICkgLyBGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNMQURJVgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svc2xhbWNoLmYgYi9sYXBhY2svc2xhbWNoLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZmFkMAotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zbGFtY2guZgpAQCAtMCwwICsxLDE5MiBAQAorKj4gXGJyaWVmIFxiIFNMQU1DSAorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICBSRUFMICAgICAgICAgICAgIEZVTkNUSU9OIFNMQU1DSCggQ01BQ0ggKQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgIENIQVJBQ1RFUiAgICAgICAgICBDTUFDSAorKiAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFNMQU1DSCBkZXRlcm1pbmVzIHNpbmdsZSBwcmVjaXNpb24gbWFjaGluZSBwYXJhbWV0ZXJzLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIENNQUNICisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgU0xBTUNIOgorKj4gICAgICAgICAgPSAnRScgb3IgJ2UnLCAgIFNMQU1DSCA6PSBlcHMKKyo+ICAgICAgICAgID0gJ1MnIG9yICdzICwgICBTTEFNQ0ggOj0gc2ZtaW4KKyo+ICAgICAgICAgID0gJ0InIG9yICdiJywgICBTTEFNQ0ggOj0gYmFzZQorKj4gICAgICAgICAgPSAnUCcgb3IgJ3AnLCAgIFNMQU1DSCA6PSBlcHMqYmFzZQorKj4gICAgICAgICAgPSAnTicgb3IgJ24nLCAgIFNMQU1DSCA6PSB0CisqPiAgICAgICAgICA9ICdSJyBvciAncicsICAgU0xBTUNIIDo9IHJuZAorKj4gICAgICAgICAgPSAnTScgb3IgJ20nLCAgIFNMQU1DSCA6PSBlbWluCisqPiAgICAgICAgICA9ICdVJyBvciAndScsICAgU0xBTUNIIDo9IHJtaW4KKyo+ICAgICAgICAgID0gJ0wnIG9yICdsJywgICBTTEFNQ0ggOj0gZW1heAorKj4gICAgICAgICAgPSAnTycgb3IgJ28nLCAgIFNMQU1DSCA6PSBybWF4CisqPiAgICAgICAgICB3aGVyZQorKj4gICAgICAgICAgZXBzICAgPSByZWxhdGl2ZSBtYWNoaW5lIHByZWNpc2lvbgorKj4gICAgICAgICAgc2ZtaW4gPSBzYWZlIG1pbmltdW0sIHN1Y2ggdGhhdCAxL3NmbWluIGRvZXMgbm90IG92ZXJmbG93CisqPiAgICAgICAgICBiYXNlICA9IGJhc2Ugb2YgdGhlIG1hY2hpbmUKKyo+ICAgICAgICAgIHByZWMgID0gZXBzKmJhc2UKKyo+ICAgICAgICAgIHQgICAgID0gbnVtYmVyIG9mIChiYXNlKSBkaWdpdHMgaW4gdGhlIG1hbnRpc3NhCisqPiAgICAgICAgICBybmQgICA9IDEuMCB3aGVuIHJvdW5kaW5nIG9jY3VycyBpbiBhZGRpdGlvbiwgMC4wIG90aGVyd2lzZQorKj4gICAgICAgICAgZW1pbiAgPSBtaW5pbXVtIGV4cG9uZW50IGJlZm9yZSAoZ3JhZHVhbCkgdW5kZXJmbG93CisqPiAgICAgICAgICBybWluICA9IHVuZGVyZmxvdyB0aHJlc2hvbGQgLSBiYXNlKiooZW1pbi0xKQorKj4gICAgICAgICAgZW1heCAgPSBsYXJnZXN0IGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdworKj4gICAgICAgICAgcm1heCAgPSBvdmVyZmxvdyB0aHJlc2hvbGQgIC0gKGJhc2UqKmVtYXgpKigxLWVwcykKKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0xBTUNIKCBDTUFDSCApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENIQVJBQ1RFUiAgICAgICAgICBDTUFDSAorKiAgICAgLi4KKyoKKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgT05FLCBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAxLjBFKzAsIFpFUk8gPSAwLjBFKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSTkQsIEVQUywgU0ZNSU4sIFNNQUxMLCBSTUFDSAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgRElHSVRTLCBFUFNJTE9OLCBIVUdFLCBNQVhFWFBPTkVOVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBNSU5FWFBPTkVOVCwgUkFESVgsIFRJTlkKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyoKKyogICAgIEFzc3VtZSByb3VuZGluZywgbm90IGNob3BwaW5nLiBBbHdheXMuCisqCisgICAgICBSTkQgPSBPTkUKKyoKKyAgICAgIElGKCBPTkUuRVEuUk5EICkgVEhFTgorICAgICAgICAgRVBTID0gRVBTSUxPTihaRVJPKSAqIDAuNQorICAgICAgRUxTRQorICAgICAgICAgRVBTID0gRVBTSUxPTihaRVJPKQorICAgICAgRU5EIElGCisqCisgICAgICBJRiggTFNBTUUoIENNQUNILCAnRScgKSApIFRIRU4KKyAgICAgICAgIFJNQUNIID0gRVBTCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdTJyApICkgVEhFTgorICAgICAgICAgU0ZNSU4gPSBUSU5ZKFpFUk8pCisgICAgICAgICBTTUFMTCA9IE9ORSAvIEhVR0UoWkVSTykKKyAgICAgICAgIElGKCBTTUFMTC5HRS5TRk1JTiApIFRIRU4KKyoKKyogICAgICAgICAgIFVzZSBTTUFMTCBwbHVzIGEgYml0LCB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2Ygcm91bmRpbmcKKyogICAgICAgICAgIGNhdXNpbmcgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgIDEvc2ZtaW4uCisqCisgICAgICAgICAgICBTRk1JTiA9IFNNQUxMKiggT05FK0VQUyApCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFJNQUNIID0gU0ZNSU4KKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ0InICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IFJBRElYKFpFUk8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdQJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBFUFMgKiBSQURJWChaRVJPKQorICAgICAgRUxTRSBJRiggTFNBTUUoIENNQUNILCAnTicgKSApIFRIRU4KKyAgICAgICAgIFJNQUNIID0gRElHSVRTKFpFUk8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdSJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBSTkQKKyAgICAgIEVMU0UgSUYoIExTQU1FKCBDTUFDSCwgJ00nICkgKSBUSEVOCisgICAgICAgICBSTUFDSCA9IE1JTkVYUE9ORU5UKFpFUk8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdVJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSB0aW55KHplcm8pCisgICAgICBFTFNFIElGKCBMU0FNRSggQ01BQ0gsICdMJyApICkgVEhFTgorICAgICAgICAgUk1BQ0ggPSBNQVhFWFBPTkVOVChaRVJPKQorICAgICAgRUxTRSBJRiggTFNBTUUoIENNQUNILCAnTycgKSApIFRIRU4KKyAgICAgICAgIFJNQUNIID0gSFVHRShaRVJPKQorICAgICAgRUxTRQorICAgICAgICAgUk1BQ0ggPSBaRVJPCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFNMQU1DSCA9IFJNQUNICisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTTEFNQ0gKKyoKKyAgICAgIEVORAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqPiBcYnJpZWYgXGIgU0xBTUMzCisqPiBcZGV0YWlscworKj4gXGIgUHVycG9zZToKKyo+IFx2ZXJiYXRpbQorKj4gU0xBTUMzICBpcyBpbnRlbmRlZCB0byBmb3JjZSAgQSAgYW5kICBCICB0byBiZSBzdG9yZWQgcHJpb3IgdG8gZG9pbmcKKyo+IHRoZSBhZGRpdGlvbiBvZiAgQSAgYW5kICBCICwgIGZvciB1c2UgaW4gc2l0dWF0aW9ucyB3aGVyZSBvcHRpbWl6ZXJzCisqPiBtaWdodCBob2xkIG9uZSBvZiB0aGVzZSBpbiBhIHJlZ2lzdGVyLgorKj4gXGVuZHZlcmJhdGltCisqPiBcYXV0aG9yIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKj4gXGluZ3JvdXAgYXV4T1RIRVJhdXhpbGlhcnkKKyo+CisqPiBccGFyYW1baW5dIEEKKyo+IFx2ZXJiYXRpbQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBCCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRoZSB2YWx1ZXMgQSBhbmQgQi4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyoKKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0xBTUMzKCBBLCBCICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogICAgIFVuaXYuIG9mIFRlbm5lc3NlZSwgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSBhbmQgTkFHIEx0ZC4uCisqICAgICBOb3ZlbWJlciAyMDEwCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSwgQgorKiAgICAgLi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIFNMQU1DMyA9IEEgKyBCCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTTEFNQzMKKyoKKyAgICAgIEVORAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9sYXBhY2svc2xhcHkyLmYgYi9sYXBhY2svc2xhcHkyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2YjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zbGFweTIuZgpAQCAtMCwwICsxLDEwNCBAQAorKj4gXGJyaWVmIFxiIFNMQVBZMgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIFNMQVBZMiArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkyLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkyLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkyLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0xBUFkyKCBYLCBZICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIFgsIFkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFNMQVBZMiByZXR1cm5zIHNxcnQoeCoqMit5KioyKSwgdGFraW5nIGNhcmUgbm90IHRvIGNhdXNlIHVubmVjZXNzYXJ5CisqPiBvdmVyZmxvdy4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFggaXMgUkVBTAorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBZCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFkgaXMgUkVBTAorKj4gICAgICAgICAgWCBhbmQgWSBzcGVjaWZ5IHRoZSB2YWx1ZXMgeCBhbmQgeS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGF1eE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0xBUFkyKCBYLCBZICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFgsIFkKKyogICAgIC4uCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRTAgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRTAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBXLCBYQUJTLCBZQUJTLCBaCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4sIFNRUlQKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIFhBQlMgPSBBQlMoIFggKQorICAgICAgWUFCUyA9IEFCUyggWSApCisgICAgICBXID0gTUFYKCBYQUJTLCBZQUJTICkKKyAgICAgIFogPSBNSU4oIFhBQlMsIFlBQlMgKQorICAgICAgSUYoIFouRVEuWkVSTyApIFRIRU4KKyAgICAgICAgIFNMQVBZMiA9IFcKKyAgICAgIEVMU0UKKyAgICAgICAgIFNMQVBZMiA9IFcqU1FSVCggT05FKyggWiAvIFcgKSoqMiApCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNMQVBZMgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svc2xhcHkzLmYgYi9sYXBhY2svc2xhcHkzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZjViZgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zbGFweTMuZgpAQCAtMCwwICsxLDExMSBAQAorKj4gXGJyaWVmIFxiIFNMQVBZMworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIFNMQVBZMyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkzLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkzLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcHkzLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0xBUFkzKCBYLCBZLCBaICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIFgsIFksIFoKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFNMQVBZMyByZXR1cm5zIHNxcnQoeCoqMit5KioyK3oqKjIpLCB0YWtpbmcgY2FyZSBub3QgdG8gY2F1c2UKKyo+IHVubmVjZXNzYXJ5IG92ZXJmbG93LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFgKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgWCBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFkKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgWSBpcyBSRUFMCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFoKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgWiBpcyBSRUFMCisqPiAgICAgICAgICBYLCBZIGFuZCBaIHNwZWNpZnkgdGhlIHZhbHVlcyB4LCB5IGFuZCB6LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgYXV4T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUkVBTCAgICAgICAgICAgICBGVU5DVElPTiBTTEFQWTMoIFgsIFksIFogKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCwgWSwgWgorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBFMCApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFcsIFhBQlMsIFlBQlMsIFpBQlMKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIFNRUlQKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIFhBQlMgPSBBQlMoIFggKQorICAgICAgWUFCUyA9IEFCUyggWSApCisgICAgICBaQUJTID0gQUJTKCBaICkKKyAgICAgIFcgPSBNQVgoIFhBQlMsIFlBQlMsIFpBQlMgKQorICAgICAgSUYoIFcuRVEuWkVSTyApIFRIRU4KKyogICAgIFcgY2FuIGJlIHplcm8gZm9yIG1heCgwLG5hbiwwKQorKiAgICAgYWRkaW5nIGFsbCB0aHJlZSBlbnRyaWVzIHRvZ2V0aGVyIHdpbGwgbWFrZSBzdXJlCisqICAgICBOYU4gd2lsbCBub3QgZGlzYXBwZWFyLgorICAgICAgICAgU0xBUFkzID0gIFhBQlMgKyBZQUJTICsgWkFCUworICAgICAgRUxTRQorICAgICAgICAgU0xBUFkzID0gVypTUVJUKCAoIFhBQlMgLyBXICkqKjIrKCBZQUJTIC8gVyApKioyKworICAgICAkICAgICAgICAgICAgKCBaQUJTIC8gVyApKioyICkKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU0xBUFkzCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9zbGFyZi5mIGIvbGFwYWNrL3NsYXJmLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4ZmYzMAotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zbGFyZi5mCkBAIC0wLDAgKzEsMjI3IEBACisqPiBcYnJpZWYgXGIgU0xBUkYKKyoKKyogID09PT09PT09PT09IERPQ1VNRU5UQVRJT04gPT09PT09PT09PT0KKyoKKyogT25saW5lIGh0bWwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQgCisqICAgICAgICAgICAgaHR0cDovL3d3dy5uZXRsaWIub3JnL2xhcGFjay9leHBsb3JlLWh0bWwvIAorKgorKj4gXGh0bWxvbmx5CisqPiBEb3dubG9hZCBTTEFSRiArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcmYuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZi5mIj4gCisqPiBbWklQXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy50eHQ/Zm9ybWF0PXR4dCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL3NsYXJmLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgU0xBUkYoIFNJREUsIE0sIE4sIFYsIElOQ1YsIFRBVSwgQywgTERDLCBXT1JLICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgQ0hBUkFDVEVSICAgICAgICAgIFNJREUKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorKiAgICAgICBSRUFMICAgICAgICAgICAgICAgVEFVCisqICAgICAgIC4uCisqICAgICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorKiAgICAgICBSRUFMICAgICAgICAgICAgICAgQyggTERDLCAqICksIFYoICogKSwgV09SSyggKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBTTEFSRiBhcHBsaWVzIGEgcmVhbCBlbGVtZW50YXJ5IHJlZmxlY3RvciBIIHRvIGEgcmVhbCBtIGJ5IG4gbWF0cml4CisqPiBDLCBmcm9tIGVpdGhlciB0aGUgbGVmdCBvciB0aGUgcmlnaHQuIEggaXMgcmVwcmVzZW50ZWQgaW4gdGhlIGZvcm0KKyo+CisqPiAgICAgICBIID0gSSAtIHRhdSAqIHYgKiB2KipUCisqPgorKj4gd2hlcmUgdGF1IGlzIGEgcmVhbCBzY2FsYXIgYW5kIHYgaXMgYSByZWFsIHZlY3Rvci4KKyo+CisqPiBJZiB0YXUgPSAwLCB0aGVuIEggaXMgdGFrZW4gdG8gYmUgdGhlIHVuaXQgbWF0cml4LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGZvcm0gIEggKiBDCisqPiAgICAgICAgICA9ICdSJzogZm9ybSAgQyAqIEgKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFYgaXMgUkVBTCBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICgxICsgKE0tMSkqYWJzKElOQ1YpKSBpZiBTSURFID0gJ0wnCisqPiAgICAgICAgICAgICAgICAgIG9yICgxICsgKE4tMSkqYWJzKElOQ1YpKSBpZiBTSURFID0gJ1InCisqPiAgICAgICAgICBUaGUgdmVjdG9yIHYgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIEguIFYgaXMgbm90IHVzZWQgaWYKKyo+ICAgICAgICAgIFRBVSA9IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIElOQ1YKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgSU5DViBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgaW5jcmVtZW50IGJldHdlZW4gZWxlbWVudHMgb2Ygdi4gSU5DViA8PiAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBUQVUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVEFVIGlzIFJFQUwKKyo+ICAgICAgICAgIFRoZSB2YWx1ZSB0YXUgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIEguCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEMgaXMgUkVBTCBhcnJheSwgZGltZW5zaW9uIChMREMsTikKKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgbSBieSBuIG1hdHJpeCBDLgorKj4gICAgICAgICAgT24gZXhpdCwgQyBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbWF0cml4IEggKiBDIGlmIFNJREUgPSAnTCcsCisqPiAgICAgICAgICBvciBDICogSCBpZiBTSURFID0gJ1InLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERDIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQy4gTERDID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBXT1JLIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgKE4pIGlmIFNJREUgPSAnTCcKKyo+ICAgICAgICAgICAgICAgICAgICAgIG9yIChNKSBpZiBTSURFID0gJ1InCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCByZWFsT1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBTTEFSRiggU0lERSwgTSwgTiwgViwgSU5DViwgVEFVLCBDLCBMREMsIFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgU0lERQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFRBVQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEMoIExEQywgKiApLCBWKCAqICksIFdPUksoICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRSswLCBaRVJPID0gMC4wRSswICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQVBQTFlMRUZUCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgTEFTVFYsIExBU1RDCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTR0VNViwgU0dFUgorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSUxBU0xSLCBJTEFTTEMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRSwgSUxBU0xSLCBJTEFTTEMKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIEFQUExZTEVGVCA9IExTQU1FKCBTSURFLCAnTCcgKQorICAgICAgTEFTVFYgPSAwCisgICAgICBMQVNUQyA9IDAKKyAgICAgIElGKCBUQVUuTkUuWkVSTyApIFRIRU4KKyEgICAgIFNldCB1cCB2YXJpYWJsZXMgZm9yIHNjYW5uaW5nIFYuICBMQVNUViBiZWdpbnMgcG9pbnRpbmcgdG8gdGhlIGVuZAorISAgICAgb2YgVi4KKyAgICAgICAgIElGKCBBUFBMWUxFRlQgKSBUSEVOCisgICAgICAgICAgICBMQVNUViA9IE0KKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBU1RWID0gTgorICAgICAgICAgRU5EIElGCisgICAgICAgICBJRiggSU5DVi5HVC4wICkgVEhFTgorICAgICAgICAgICAgSSA9IDEgKyAoTEFTVFYtMSkgKiBJTkNWCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBJID0gMQorICAgICAgICAgRU5EIElGCishICAgICBMb29rIGZvciB0aGUgbGFzdCBub24temVybyByb3cgaW4gVi4KKyAgICAgICAgIERPIFdISUxFKCBMQVNUVi5HVC4wIC5BTkQuIFYoIEkgKS5FUS5aRVJPICkKKyAgICAgICAgICAgIExBU1RWID0gTEFTVFYgLSAxCisgICAgICAgICAgICBJID0gSSAtIElOQ1YKKyAgICAgICAgIEVORCBETworICAgICAgICAgSUYoIEFQUExZTEVGVCApIFRIRU4KKyEgICAgIFNjYW4gZm9yIHRoZSBsYXN0IG5vbi16ZXJvIGNvbHVtbiBpbiBDKDE6bGFzdHYsOikuCisgICAgICAgICAgICBMQVNUQyA9IElMQVNMQyhMQVNUViwgTiwgQywgTERDKQorICAgICAgICAgRUxTRQorISAgICAgU2NhbiBmb3IgdGhlIGxhc3Qgbm9uLXplcm8gcm93IGluIEMoOiwxOmxhc3R2KS4KKyAgICAgICAgICAgIExBU1RDID0gSUxBU0xSKE0sIExBU1RWLCBDLCBMREMpCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorISAgICAgTm90ZSB0aGF0IGxhc3RjLmVxLjAgcmVuZGVycyB0aGUgQkxBUyBvcGVyYXRpb25zIG51bGw7IG5vIHNwZWNpYWwKKyEgICAgIGNhc2UgaXMgbmVlZGVkIGF0IHRoaXMgbGV2ZWwuCisgICAgICBJRiggQVBQTFlMRUZUICkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgSCAqIEMKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0diwxOmxhc3RjKSoqVCAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBTR0VNViggJ1RyYW5zcG9zZScsIExBU1RWLCBMQVNUQywgT05FLCBDLCBMREMsIFYsIElOQ1YsCisgICAgICQgICAgICAgICAgIFpFUk8sIFdPUkssIDEgKQorKgorKiAgICAgICAgICAgQygxOmxhc3R2LDE6bGFzdGMpIDo9IEMoLi4uKSAtIHYoMTpsYXN0diwxKSAqIHcoMTpsYXN0YywxKSoqVAorKgorICAgICAgICAgICAgQ0FMTCBTR0VSKCBMQVNUViwgTEFTVEMsIC1UQVUsIFYsIElOQ1YsIFdPUkssIDEsIEMsIExEQyApCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIEMgKiBICisqCisgICAgICAgICBJRiggTEFTVFYuR1QuMCApIFRIRU4KKyoKKyogICAgICAgICAgIHcoMTpsYXN0YywxKSA6PSBDKDE6bGFzdGMsMTpsYXN0dikgKiB2KDE6bGFzdHYsMSkKKyoKKyAgICAgICAgICAgIENBTEwgU0dFTVYoICdObyB0cmFuc3Bvc2UnLCBMQVNUQywgTEFTVFYsIE9ORSwgQywgTERDLAorICAgICAkICAgICAgICAgICBWLCBJTkNWLCBaRVJPLCBXT1JLLCAxICkKKyoKKyogICAgICAgICAgIEMoMTpsYXN0YywxOmxhc3R2KSA6PSBDKC4uLikgLSB3KDE6bGFzdGMsMSkgKiB2KDE6bGFzdHYsMSkqKlQKKyoKKyAgICAgICAgICAgIENBTEwgU0dFUiggTEFTVEMsIExBU1RWLCAtVEFVLCBXT1JLLCAxLCBWLCBJTkNWLCBDLCBMREMgKQorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNMQVJGCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9zbGFyZmIuZiBiL2xhcGFjay9zbGFyZmIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk1OTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3NsYXJmYi5mCkBAIC0wLDAgKzEsNzYzIEBACisqPiBcYnJpZWYgXGIgU0xBUkZCCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgU0xBUkZCICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZmIuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZmIuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZmIuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBTTEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgTERULCBDLCBMREMsIFdPUkssIExEV09SSyApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNJREUsIFNUT1JFViwgVFJBTlMKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEQywgTERULCBMRFYsIExEV09SSywgTSwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIEMoIExEQywgKiApLCBUKCBMRFQsICogKSwgViggTERWLCAqICksCisqICAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gU0xBUkZCIGFwcGxpZXMgYSByZWFsIGJsb2NrIHJlZmxlY3RvciBIIG9yIGl0cyB0cmFuc3Bvc2UgSCoqVCB0byBhCisqPiByZWFsIG0gYnkgbiBtYXRyaXggQywgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGFwcGx5IEggb3IgSCoqVCBmcm9tIHRoZSBMZWZ0CisqPiAgICAgICAgICA9ICdSJzogYXBwbHkgSCBvciBIKipUIGZyb20gdGhlIFJpZ2h0CisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRSQU5TCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRSQU5TIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICA9ICdOJzogYXBwbHkgSCAoTm8gdHJhbnNwb3NlKQorKj4gICAgICAgICAgPSAnVCc6IGFwcGx5IEgqKlQgKFRyYW5zcG9zZSkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gRElSRUNUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIERJUkVDVCBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgSW5kaWNhdGVzIGhvdyBIIGlzIGZvcm1lZCBmcm9tIGEgcHJvZHVjdCBvZiBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzCisqPiAgICAgICAgICA9ICdGJzogSCA9IEgoMSkgSCgyKSAuIC4gLiBIKGspIChGb3J3YXJkKQorKj4gICAgICAgICAgPSAnQic6IEggPSBIKGspIC4gLiAuIEgoMikgSCgxKSAoQmFja3dhcmQpCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFNUT1JFVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBTVE9SRVYgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIEluZGljYXRlcyBob3cgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lIHRoZSBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzIGFyZSBzdG9yZWQ6CisqPiAgICAgICAgICA9ICdDJzogQ29sdW1ud2lzZQorKj4gICAgICAgICAgPSAnUic6IFJvd3dpc2UKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBNIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IEMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEsgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggVCAoPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRhcnkKKyo+ICAgICAgICAgIHJlZmxlY3RvcnMgd2hvc2UgcHJvZHVjdCBkZWZpbmVzIHRoZSBibG9jayByZWZsZWN0b3IpLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFYgaXMgUkVBTCBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixLKSBpZiBTVE9SRVYgPSAnQycKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLE0pIGlmIFNUT1JFViA9ICdSJyBhbmQgU0lERSA9ICdMJworKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsTikgaWYgU1RPUkVWID0gJ1InIGFuZCBTSURFID0gJ1InCisqPiAgICAgICAgICBUaGUgbWF0cml4IFYuIFNlZSBGdXJ0aGVyIERldGFpbHMuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFYgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBWLgorKj4gICAgICAgICAgSWYgU1RPUkVWID0gJ0MnIGFuZCBTSURFID0gJ0wnLCBMRFYgPj0gbWF4KDEsTSk7CisqPiAgICAgICAgICBpZiBTVE9SRVYgPSAnQycgYW5kIFNJREUgPSAnUicsIExEViA+PSBtYXgoMSxOKTsKKyo+ICAgICAgICAgIGlmIFNUT1JFViA9ICdSJywgTERWID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVCBpcyBSRUFMIGFycmF5LCBkaW1lbnNpb24gKExEVCxLKQorKj4gICAgICAgICAgVGhlIHRyaWFuZ3VsYXIgayBieSBrIG1hdHJpeCBUIGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyo+ICAgICAgICAgIGJsb2NrIHJlZmxlY3Rvci4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEVCBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFQuIExEVCA+PSBLLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gQworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBDIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoTERDLE4pCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIG0gYnkgbiBtYXRyaXggQy4KKyo+ICAgICAgICAgIE9uIGV4aXQsIEMgaXMgb3ZlcndyaXR0ZW4gYnkgSCpDIG9yIEgqKlQqQyBvciBDKkggb3IgQypIKipULgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMREMKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERDIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgQy4gTERDID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBXT1JLIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoTERXT1JLLEspCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEV09SSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFdPUksgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBXT1JLLgorKj4gICAgICAgICAgSWYgU0lERSA9ICdMJywgTERXT1JLID49IG1heCgxLE4pOworKj4gICAgICAgICAgaWYgU0lERSA9ICdSJywgTERXT1JLID49IG1heCgxLE0pLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgcmVhbE9USEVSYXV4aWxpYXJ5CisqCisqPiBccGFyIEZ1cnRoZXIgRGV0YWlsczoKKyogID09PT09PT09PT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+ICBUaGUgc2hhcGUgb2YgdGhlIG1hdHJpeCBWIGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUgdmVjdG9ycyB3aGljaCBkZWZpbmUKKyo+ICB0aGUgSChpKSBpcyBiZXN0IGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aXRoIG4gPSA1IGFuZAorKj4gIGsgPSAzLiBUaGUgZWxlbWVudHMgZXF1YWwgdG8gMSBhcmUgbm90IHN0b3JlZDsgdGhlIGNvcnJlc3BvbmRpbmcKKyo+ICBhcnJheSBlbGVtZW50cyBhcmUgbW9kaWZpZWQgYnV0IHJlc3RvcmVkIG9uIGV4aXQuIFRoZSByZXN0IG9mIHRoZQorKj4gIGFycmF5IGlzIG5vdCB1c2VkLgorKj4KKyo+ICBESVJFQ1QgPSAnRicgYW5kIFNUT1JFViA9ICdDJzogICAgICAgICBESVJFQ1QgPSAnRicgYW5kIFNUT1JFViA9ICdSJzoKKyo+CisqPiAgICAgICAgICAgICAgIFYgPSAoICAxICAgICAgICkgICAgICAgICAgICAgICAgIFYgPSAoICAxIHYxIHYxIHYxIHYxICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgIDEgICAgKSAgICAgICAgICAgICAgICAgICAgICggICAgIDEgdjIgdjIgdjIgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiAgMSApICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgMSB2MyB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKQorKj4KKyo+ICBESVJFQ1QgPSAnQicgYW5kIFNUT1JFViA9ICdDJzogICAgICAgICBESVJFQ1QgPSAnQicgYW5kIFNUT1JFViA9ICdSJzoKKyo+CisqPiAgICAgICAgICAgICAgIFYgPSAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgIFYgPSAoIHYxIHYxICAxICAgICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjIgdjIgdjIgIDEgICAgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgMSB2MiB2MyApICAgICAgICAgICAgICAgICAgICAgKCB2MyB2MyB2MyB2MyAgMSApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAxIHYzICkKKyo+ICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgKQorKj4gXGVuZHZlcmJhdGltCisqPgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTVUJST1VUSU5FIFNMQVJGQiggU0lERSwgVFJBTlMsIERJUkVDVCwgU1RPUkVWLCBNLCBOLCBLLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgICAgVCwgTERULCBDLCBMREMsIFdPUkssIExEV09SSyApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNJREUsIFNUT1JFViwgVFJBTlMKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLLCBMREMsIExEVCwgTERWLCBMRFdPUkssIE0sIE4KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBDKCBMREMsICogKSwgVCggTERULCAqICksIFYoIExEViwgKiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFdPUksoIExEV09SSywgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAxLjBFKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENIQVJBQ1RFUiAgICAgICAgICBUUkFOU1QKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBKLCBMQVNUViwgTEFTVEMKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0FNRQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElMQVNMUiwgSUxBU0xDCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNBTUUsIElMQVNMUiwgSUxBU0xDCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTQ09QWSwgU0dFTU0sIFNUUk1NCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUKKyoKKyAgICAgIElGKCBNLkxFLjAgLk9SLiBOLkxFLjAgKQorICAgICAkICAgUkVUVVJOCisqCisgICAgICBJRiggTFNBTUUoIFRSQU5TLCAnTicgKSApIFRIRU4KKyAgICAgICAgIFRSQU5TVCA9ICdUJworICAgICAgRUxTRQorICAgICAgICAgVFJBTlNUID0gJ04nCisgICAgICBFTkQgSUYKKyoKKyAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyoKKyAgICAgICAgIElGKCBMU0FNRSggRElSRUNULCAnRicgKSApIFRIRU4KKyoKKyogICAgICAgICAgIExldCAgViA9ICAoIFYxICkgICAgKGZpcnN0IEsgcm93cykKKyogICAgICAgICAgICAgICAgICAgICAoIFYyICkKKyogICAgICAgICAgIHdoZXJlICBWMSAgaXMgdW5pdCBsb3dlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqVCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQVNMUiggTSwgSywgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFTTEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipUICogViAgPSAgKEMxKipUICogVjEgKyBDMioqVCAqIFYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMSoqVAorKgorICAgICAgICAgICAgICAgRE8gMTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgU0NPUFkoIExBU1RDLCBDKCBKLCAxICksIExEQywgV09SSyggMSwgSiApLCAxICkKKyAgIDEwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMioqVCAqVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdUcmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggSysxLCAxICksIExEQywgViggSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipUICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gViAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBWMiAqIFcqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVFYtSywgTEFTVEMsIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFYoIEsrMSwgMSApLCBMRFYsIFdPUkssIExEV09SSywgT05FLAorICAgICAkICAgICAgICAgICAgICAgICBDKCBLKzEsIDEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdMb3dlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVyoqVAorKgorICAgICAgICAgICAgICAgRE8gMzAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSiwgSSApID0gQyggSiwgSSApIC0gV09SSyggSSwgSiApCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgMzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVMU0UgSUYoIExTQU1FKCBTSURFLCAnUicgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEMgKiBIICBvciAgQyAqIEgqKlQgIHdoZXJlICBDID0gKCBDMSAgQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQVNMUiggTiwgSywgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFTTFIoIE0sIExBU1RWLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDICogViAgPSAgKEMxKlYxICsgQzIqVjIpICAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMxCisqCisgICAgICAgICAgICAgICBETyA0MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBTQ09QWSggTEFTVEMsIEMoIDEsIEogKSwgMSwgV09SSyggMSwgSiApLCAxICkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMiAqIFYyCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIDEsIEsrMSApLCBMREMsIFYoIEsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYqKlQKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXICogVjIqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFdPUkssIExEV09SSywgViggSysxLCAxICksIExEViwgT05FLAorICAgICAkICAgICAgICAgICAgICAgICBDKCAxLCBLKzEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdMb3dlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQyggSSwgSiApIC0gV09SSyggSSwgSiApCisgICA1MCAgICAgICAgICAgICBDT05USU5VRQorICAgNjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgTGV0ICBWID0gICggVjEgKQorKiAgICAgICAgICAgICAgICAgICAgICggVjIgKSAgICAobGFzdCBLIHJvd3MpCisqICAgICAgICAgICB3aGVyZSAgVjIgIGlzIHVuaXQgdXBwZXIgdHJpYW5ndWxhci4KKyoKKyAgICAgICAgICAgIElGKCBMU0FNRSggU0lERSwgJ0wnICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBIICogQyAgb3IgIEgqKlQgKiBDICB3aGVyZSAgQyA9ICggQzEgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFTTFIoIE0sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBU0xDKCBMQVNUViwgTiwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyoqVCAqIFYgID0gIChDMSoqVCAqIFYxICsgQzIqKlQgKiBWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIqKlQKKyoKKyAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIFNDT1BZKCBMQVNUQywgQyggTEFTVFYtSytKLCAxICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgV09SSyggMSwgSiApLCAxICkKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggTEFTVFYtSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzEqKlQqVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdUcmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQywgTERDLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCoqVCAgb3IgIFcgKiBUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOU1QsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFYgKiBXKipUCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMxIDo9IEMxIC0gVjEgKiBXKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RWLUssIExBU1RDLCBLLCAtT05FLCBWLCBMRFYsIFdPUkssIExEV09SSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ1RyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggTEFTVFYtSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMyIDo9IEMyIC0gVyoqVAorKgorICAgICAgICAgICAgICAgRE8gOTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggTEFTVFYtSytKLCBJICkgPSBDKCBMQVNUVi1LK0osIEkgKSAtIFdPUksoSSwgSikKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICA5MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqVCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBU0xSKCBOLCBLLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVNMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWICA9ICAoQzEqVjEgKyBDMipWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIKKyoKKyAgICAgICAgICAgICAgIERPIDEwMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBTQ09QWSggTEFTVEMsIEMoIDEsIE4tSytKICksIDEsIFdPUksoIDEsIEogKSwgMSApCisgIDEwMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxICogVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQywgTERDLCBWLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYqKlQKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTU0oICdObyB0cmFuc3Bvc2UnLCAnVHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssIC1PTkUsIFdPUkssIExEV09SSywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnVHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCBMQVNUVi1LKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXCisqCisgICAgICAgICAgICAgICBETyAxMjAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDExMCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEksIExBU1RWLUsrSiApID0gQyggSSwgTEFTVFYtSytKICkgLSBXT1JLKEksIEopCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAxMjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRU5EIElGCisqCisgICAgICBFTFNFIElGKCBMU0FNRSggU1RPUkVWLCAnUicgKSApIFRIRU4KKyoKKyAgICAgICAgIElGKCBMU0FNRSggRElSRUNULCAnRicgKSApIFRIRU4KKyoKKyogICAgICAgICAgIExldCAgViA9ICAoIFYxICBWMiApICAgIChWMTogZmlyc3QgSyBjb2x1bW5zKQorKiAgICAgICAgICAgd2hlcmUgIFYxICBpcyB1bml0IHVwcGVyIHRyaWFuZ3VsYXIuCisqCisgICAgICAgICAgICBJRiggTFNBTUUoIFNJREUsICdMJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgSCAqIEMgIG9yICBIKipUICogQyAgd2hlcmUgIEMgPSAoIEMxICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBU0xDKCBLLCBNLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVNMQyggTEFTVFYsIE4sIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMqKlQgKiBWKipUICA9ICAoQzEqKlQgKiBWMSoqVCArIEMyKipUICogVjIqKlQpIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEqKlQKKyoKKyAgICAgICAgICAgICAgIERPIDEzMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBTQ09QWSggTEFTVEMsIEMoIEosIDEgKSwgTERDLCBXT1JLKCAxLCBKICksIDEgKQorICAxMzAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnVHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyKipUKlYyKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnVHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIEsrMSwgMSApLCBMREMsIFYoIDEsIEsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCoqVCAgb3IgIFcgKiBUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCBUUkFOU1QsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFYqKlQgKiBXKipUCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMyIDo9IEMyIC0gVjIqKlQgKiBXKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnVHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RWLUssIExBU1RDLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAtT05FLCBWKCAxLCBLKzEgKSwgTERWLCBXT1JLLCBMRFdPUkssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggSysxLCAxICksIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMSA6PSBDMSAtIFcqKlQKKyoKKyAgICAgICAgICAgICAgIERPIDE1MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMTQwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSiwgSSApID0gQyggSiwgSSApIC0gV09SSyggSSwgSiApCisgIDE0MCAgICAgICAgICAgICBDT05USU5VRQorICAxNTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVMU0UgSUYoIExTQU1FKCBTSURFLCAnUicgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEMgKiBIICBvciAgQyAqIEgqKlQgIHdoZXJlICBDID0gKCBDMSAgQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQVNMQyggSywgTiwgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFTTFIoIE0sIExBU1RWLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDICogVioqVCAgPSAgKEMxKlYxKipUICsgQzIqVjIqKlQpICAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMxCisqCisgICAgICAgICAgICAgICBETyAxNjAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgU0NPUFkoIExBU1RDLCBDKCAxLCBKICksIDEsIFdPUksoIDEsIEogKSwgMSApCisgIDE2MCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEqKlQKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdVcHBlcicsICdUcmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzIgKiBWMioqVAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBTR0VNTSggJ05vIHRyYW5zcG9zZScsICdUcmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCAxLCBLKzEgKSwgTERDLCBWKCAxLCBLKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQgIG9yICBXICogVCoqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgVFJBTlMsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFcgKiBWCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMyIDo9IEMyIC0gVyAqIFYyCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBMQVNUVi1LLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAtT05FLCBXT1JLLCBMRFdPUkssIFYoIDEsIEsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggMSwgSysxICksIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYxCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMSA6PSBDMSAtIFcKKyoKKyAgICAgICAgICAgICAgIERPIDE4MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMTcwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQyggSSwgSiApIC0gV09SSyggSSwgSiApCisgIDE3MCAgICAgICAgICAgICBDT05USU5VRQorICAxODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgTGV0ICBWID0gICggVjEgIFYyICkgICAgKFYyOiBsYXN0IEsgY29sdW1ucykKKyogICAgICAgICAgIHdoZXJlICBWMiAgaXMgdW5pdCBsb3dlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqVCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQVNMQyggSywgTSwgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFTTEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipUICogVioqVCAgPSAgKEMxKipUICogVjEqKlQgKyBDMioqVCAqIFYyKipUKSAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMyKipUCisqCisgICAgICAgICAgICAgICBETyAxOTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgU0NPUFkoIExBU1RDLCBDKCBMQVNUVi1LK0osIDEgKSwgTERDLAorICAgICAkICAgICAgICAgICAgICAgICBXT1JLKCAxLCBKICksIDEgKQorICAxOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnVHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMSoqVCAqIFYxKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnVHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLCBPTkUsIEMsIExEQywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQqKlQgIG9yICBXICogVAorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgVFJBTlNULCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBWKipUICogVyoqVAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMSA6PSBDMSAtIFYxKipUICogVyoqVAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBTR0VNTSggJ1RyYW5zcG9zZScsICdUcmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUVi1LLCBMQVNUQywgSywgLU9ORSwgViwgTERWLCBXT1JLLCBMRFdPUkssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQywgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgU1RSTU0oICdSaWdodCcsICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIDEsIExBU1RWLUsrMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcqKlQKKyoKKyAgICAgICAgICAgICAgIERPIDIxMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMjAwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggTEFTVFYtSytKLCBJICkgPSBDKCBMQVNUVi1LK0osIEkgKSAtIFdPUksoSSwgSikKKyAgMjAwICAgICAgICAgICAgIENPTlRJTlVFCisgIDIxMCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqVCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBU0xDKCBLLCBOLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVNMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWKipUICA9ICAoQzEqVjEqKlQgKyBDMipWMioqVCkgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIKKyoKKyAgICAgICAgICAgICAgIERPIDIyMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBTQ09QWSggTEFTVEMsIEMoIDEsIExBU1RWLUsrSiApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICBXT1JLKCAxLCBKICksIDEgKQorICAyMjAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipUCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnVHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMSAqIFYxKipUCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ1RyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLCBPTkUsIEMsIExEQywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQgIG9yICBXICogVCoqVAorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgVFJBTlMsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFcgKiBWCisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMxIDo9IEMxIC0gVyAqIFYxCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBMQVNUVi1LLCBLLCAtT05FLCBXT1JLLCBMRFdPUkssIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBTVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggMSwgTEFTVFYtSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gMjQwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAyMzAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBJLCBMQVNUVi1LK0ogKSA9IEMoIEksIExBU1RWLUsrSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgIC0gV09SSyggSSwgSiApCisgIDIzMCAgICAgICAgICAgICBDT05USU5VRQorICAyNDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNMQVJGQgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svc2xhcmZnLmYgYi9sYXBhY2svc2xhcmZnLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxMGZmYwotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9zbGFyZmcuZgpAQCAtMCwwICsxLDE5NiBAQAorKj4gXGJyaWVmIFxiIFNMQVJGRworKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIFNMQVJGRyArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcmZnLmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcmZnLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvc2xhcmZnLmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgU0xBUkZHKCBOLCBBTFBIQSwgWCwgSU5DWCwgVEFVICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIE4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBUQVUKKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIFJFQUwgICAgICAgICAgICAgICBYKCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFNMQVJGRyBnZW5lcmF0ZXMgYSByZWFsIGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggb2Ygb3JkZXIgbiwgc3VjaAorKj4gdGhhdAorKj4KKyo+ICAgICAgIEggKiAoIGFscGhhICkgPSAoIGJldGEgKSwgICBIKipUICogSCA9IEkuCisqPiAgICAgICAgICAgKCAgIHggICApICAgKCAgIDAgICkKKyo+CisqPiB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgYW5kIHggaXMgYW4gKG4tMSktZWxlbWVudCByZWFsCisqPiB2ZWN0b3IuIEggaXMgcmVwcmVzZW50ZWQgaW4gdGhlIGZvcm0KKyo+CisqPiAgICAgICBIID0gSSAtIHRhdSAqICggMSApICogKCAxIHYqKlQgKSAsCisqPiAgICAgICAgICAgICAgICAgICAgICggdiApCisqPgorKj4gd2hlcmUgdGF1IGlzIGEgcmVhbCBzY2FsYXIgYW5kIHYgaXMgYSByZWFsIChuLTEpLWVsZW1lbnQKKyo+IHZlY3Rvci4KKyo+CisqPiBJZiB0aGUgZWxlbWVudHMgb2YgeCBhcmUgYWxsIHplcm8sIHRoZW4gdGF1ID0gMCBhbmQgSCBpcyB0YWtlbiB0byBiZQorKj4gdGhlIHVuaXQgbWF0cml4LgorKj4KKyo+IE90aGVyd2lzZSAgMSA8PSB0YXUgPD0gMi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3Rvci4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbixvdXRdIEFMUEhBCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEFMUEhBIGlzIFJFQUwKKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgdmFsdWUgYWxwaGEuCisqPiAgICAgICAgICBPbiBleGl0LCBpdCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSB2YWx1ZSBiZXRhLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgKDErKE4tMikqYWJzKElOQ1gpKQorKj4gICAgICAgICAgT24gZW50cnksIHRoZSB2ZWN0b3IgeC4KKyo+ICAgICAgICAgIE9uIGV4aXQsIGl0IGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHZlY3RvciB2LgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1ggaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGluY3JlbWVudCBiZXR3ZWVuIGVsZW1lbnRzIG9mIFguIElOQ1ggPiAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBSRUFMCisqPiAgICAgICAgICBUaGUgdmFsdWUgdGF1LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgcmVhbE9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNVQlJPVVRJTkUgU0xBUkZHKCBOLCBBTFBIQSwgWCwgSU5DWCwgVEFVICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMCkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgTm92ZW1iZXIgMjAxMQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIE4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgVEFVCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCggKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgT05FLCBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAxLjBFKzAsIFpFUk8gPSAwLjBFKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBKLCBLTlQKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBCRVRBLCBSU0FGTU4sIFNBRk1JTiwgWE5PUk0KKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBTTEFNQ0gsIFNMQVBZMiwgU05STTIKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTEFNQ0gsIFNMQVBZMiwgU05STTIKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBTSUdOCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTU0NBTAorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIE4uTEUuMSApIFRIRU4KKyAgICAgICAgIFRBVSA9IFpFUk8KKyAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisgICAgICBYTk9STSA9IFNOUk0yKCBOLTEsIFgsIElOQ1ggKQorKgorICAgICAgSUYoIFhOT1JNLkVRLlpFUk8gKSBUSEVOCisqCisqICAgICAgICBIICA9ICBJCisqCisgICAgICAgICBUQVUgPSBaRVJPCisgICAgICBFTFNFCisqCisqICAgICAgICBnZW5lcmFsIGNhc2UKKyoKKyAgICAgICAgIEJFVEEgPSAtU0lHTiggU0xBUFkyKCBBTFBIQSwgWE5PUk0gKSwgQUxQSEEgKQorICAgICAgICAgU0FGTUlOID0gU0xBTUNIKCAnUycgKSAvIFNMQU1DSCggJ0UnICkKKyAgICAgICAgIEtOVCA9IDAKKyAgICAgICAgIElGKCBBQlMoIEJFVEEgKS5MVC5TQUZNSU4gKSBUSEVOCisqCisqICAgICAgICAgICBYTk9STSwgQkVUQSBtYXkgYmUgaW5hY2N1cmF0ZTsgc2NhbGUgWCBhbmQgcmVjb21wdXRlIHRoZW0KKyoKKyAgICAgICAgICAgIFJTQUZNTiA9IE9ORSAvIFNBRk1JTgorICAgMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEtOVCA9IEtOVCArIDEKKyAgICAgICAgICAgIENBTEwgU1NDQUwoIE4tMSwgUlNBRk1OLCBYLCBJTkNYICkKKyAgICAgICAgICAgIEJFVEEgPSBCRVRBKlJTQUZNTgorICAgICAgICAgICAgQUxQSEEgPSBBTFBIQSpSU0FGTU4KKyAgICAgICAgICAgIElGKCBBQlMoIEJFVEEgKS5MVC5TQUZNSU4gKQorICAgICAkICAgICAgICAgR08gVE8gMTAKKyoKKyogICAgICAgICAgIE5ldyBCRVRBIGlzIGF0IG1vc3QgMSwgYXQgbGVhc3QgU0FGTUlOCisqCisgICAgICAgICAgICBYTk9STSA9IFNOUk0yKCBOLTEsIFgsIElOQ1ggKQorICAgICAgICAgICAgQkVUQSA9IC1TSUdOKCBTTEFQWTIoIEFMUEhBLCBYTk9STSApLCBBTFBIQSApCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFRBVSA9ICggQkVUQS1BTFBIQSApIC8gQkVUQQorICAgICAgICAgQ0FMTCBTU0NBTCggTi0xLCBPTkUgLyAoIEFMUEhBLUJFVEEgKSwgWCwgSU5DWCApCisqCisqICAgICAgICBJZiBBTFBIQSBpcyBzdWJub3JtYWwsIGl0IG1heSBsb3NlIHJlbGF0aXZlIGFjY3VyYWN5CisqCisgICAgICAgICBETyAyMCBKID0gMSwgS05UCisgICAgICAgICAgICBCRVRBID0gQkVUQSpTQUZNSU4KKyAyMCAgICAgIENPTlRJTlVFCisgICAgICAgICBBTFBIQSA9IEJFVEEKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU0xBUkZHCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay9zbGFyZnQuZiBiL2xhcGFjay9zbGFyZnQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGIwNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3NsYXJmdC5mCkBAIC0wLDAgKzEsMzI2IEBACisqPiBcYnJpZWYgXGIgU0xBUkZUCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgU0xBUkZUICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZnQuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZnQuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS9zbGFyZnQuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBTTEFSRlQoIERJUkVDVCwgU1RPUkVWLCBOLCBLLCBWLCBMRFYsIFRBVSwgVCwgTERUICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgQ0hBUkFDVEVSICAgICAgICAgIERJUkVDVCwgU1RPUkVWCisqICAgICAgIElOVEVHRVIgICAgICAgICAgICBLLCBMRFQsIExEViwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgUkVBTCAgICAgICAgICAgICAgIFQoIExEVCwgKiApLCBUQVUoICogKSwgViggTERWLCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFNMQVJGVCBmb3JtcyB0aGUgdHJpYW5ndWxhciBmYWN0b3IgVCBvZiBhIHJlYWwgYmxvY2sgcmVmbGVjdG9yIEgKKyo+IG9mIG9yZGVyIG4sIHdoaWNoIGlzIGRlZmluZWQgYXMgYSBwcm9kdWN0IG9mIGsgZWxlbWVudGFyeSByZWZsZWN0b3JzLgorKj4KKyo+IElmIERJUkVDVCA9ICdGJywgSCA9IEgoMSkgSCgyKSAuIC4gLiBIKGspIGFuZCBUIGlzIHVwcGVyIHRyaWFuZ3VsYXI7CisqPgorKj4gSWYgRElSRUNUID0gJ0InLCBIID0gSChrKSAuIC4gLiBIKDIpIEgoMSkgYW5kIFQgaXMgbG93ZXIgdHJpYW5ndWxhci4KKyo+CisqPiBJZiBTVE9SRVYgPSAnQycsIHRoZSB2ZWN0b3Igd2hpY2ggZGVmaW5lcyB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3IKKyo+IEgoaSkgaXMgc3RvcmVkIGluIHRoZSBpLXRoIGNvbHVtbiBvZiB0aGUgYXJyYXkgViwgYW5kCisqPgorKj4gICAgSCAgPSAgSSAtIFYgKiBUICogVioqVAorKj4KKyo+IElmIFNUT1JFViA9ICdSJywgdGhlIHZlY3RvciB3aGljaCBkZWZpbmVzIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvcgorKj4gSChpKSBpcyBzdG9yZWQgaW4gdGhlIGktdGggcm93IG9mIHRoZSBhcnJheSBWLCBhbmQKKyo+CisqPiAgICBIICA9ICBJIC0gVioqVCAqIFQgKiBWCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gRElSRUNUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIERJUkVDVCBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgU3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3JzIGFyZQorKj4gICAgICAgICAgbXVsdGlwbGllZCB0byBmb3JtIHRoZSBibG9jayByZWZsZWN0b3I6CisqPiAgICAgICAgICA9ICdGJzogSCA9IEgoMSkgSCgyKSAuIC4gLiBIKGspIChGb3J3YXJkKQorKj4gICAgICAgICAgPSAnQic6IEggPSBIKGspIC4gLiAuIEgoMikgSCgxKSAoQmFja3dhcmQpCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFNUT1JFVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBTVE9SRVYgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIFNwZWNpZmllcyBob3cgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lIHRoZSBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzIGFyZSBzdG9yZWQgKHNlZSBhbHNvIEZ1cnRoZXIgRGV0YWlscyk6CisqPiAgICAgICAgICA9ICdDJzogY29sdW1ud2lzZQorKj4gICAgICAgICAgPSAnUic6IHJvd3dpc2UKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBOIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgYmxvY2sgcmVmbGVjdG9yIEguIE4gPj0gMC4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBLIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgdHJpYW5ndWxhciBmYWN0b3IgVCAoPSB0aGUgbnVtYmVyIG9mCisqPiAgICAgICAgICBlbGVtZW50YXJ5IHJlZmxlY3RvcnMpLiBLID49IDEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgViBpcyBSRUFMIGFycmF5LCBkaW1lbnNpb24KKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsSykgaWYgU1RPUkVWID0gJ0MnCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLE4pIGlmIFNUT1JFViA9ICdSJworKj4gICAgICAgICAgVGhlIG1hdHJpeCBWLiBTZWUgZnVydGhlciBkZXRhaWxzLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERWIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgVi4KKyo+ICAgICAgICAgIElmIFNUT1JFViA9ICdDJywgTERWID49IG1heCgxLE4pOyBpZiBTVE9SRVYgPSAnUicsIExEViA+PSBLLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBUQVUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVEFVIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoSykKKyo+ICAgICAgICAgIFRBVShpKSBtdXN0IGNvbnRhaW4gdGhlIHNjYWxhciBmYWN0b3Igb2YgdGhlIGVsZW1lbnRhcnkKKyo+ICAgICAgICAgIHJlZmxlY3RvciBIKGkpLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW291dF0gVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBUIGlzIFJFQUwgYXJyYXksIGRpbWVuc2lvbiAoTERULEspCisqPiAgICAgICAgICBUaGUgayBieSBrIHRyaWFuZ3VsYXIgZmFjdG9yIFQgb2YgdGhlIGJsb2NrIHJlZmxlY3Rvci4KKyo+ICAgICAgICAgIElmIERJUkVDVCA9ICdGJywgVCBpcyB1cHBlciB0cmlhbmd1bGFyOyBpZiBESVJFQ1QgPSAnQicsIFQgaXMKKyo+ICAgICAgICAgIGxvd2VyIHRyaWFuZ3VsYXIuIFRoZSByZXN0IG9mIHRoZSBhcnJheSBpcyBub3QgdXNlZC4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERUCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEVCBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFQuIExEVCA+PSBLLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgQXByaWwgMjAxMgorKgorKj4gXGluZ3JvdXAgcmVhbE9USEVSYXV4aWxpYXJ5CisqCisqPiBccGFyIEZ1cnRoZXIgRGV0YWlsczoKKyogID09PT09PT09PT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+ICBUaGUgc2hhcGUgb2YgdGhlIG1hdHJpeCBWIGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUgdmVjdG9ycyB3aGljaCBkZWZpbmUKKyo+ICB0aGUgSChpKSBpcyBiZXN0IGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aXRoIG4gPSA1IGFuZAorKj4gIGsgPSAzLiBUaGUgZWxlbWVudHMgZXF1YWwgdG8gMSBhcmUgbm90IHN0b3JlZC4KKyo+CisqPiAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCAgMSAgICAgICApICAgICAgICAgICAgICAgICBWID0gKCAgMSB2MSB2MSB2MSB2MSApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxICAxICAgICkgICAgICAgICAgICAgICAgICAgICAoICAgICAxIHYyIHYyIHYyICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgIDEgKSAgICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgdjMgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+CisqPiAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICBWID0gKCB2MSB2MSAgMSAgICAgICApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYyIHYyIHYyICAxICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggIDEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjMgdjMgdjMgdjMgIDEgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAgICAxICkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBTTEFSRlQoIERJUkVDVCwgU1RPUkVWLCBOLCBLLCBWLCBMRFYsIFRBVSwgVCwgTERUICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ0hBUkFDVEVSICAgICAgICAgIERJUkVDVCwgU1RPUkVWCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSywgTERULCBMRFYsIE4KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBUKCBMRFQsICogKSwgVEFVKCAqICksIFYoIExEViwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgT05FLCBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAxLjBFKzAsIFpFUk8gPSAwLjBFKzAgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBKLCBQUkVWTEFTVFYsIExBU1RWCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTR0VNViwgU1RSTVYKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0FNRQorICAgICAgRVhURVJOQUwgICAgICAgICAgIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUKKyoKKyAgICAgIElGKCBOLkVRLjAgKQorICAgICAkICAgUkVUVVJOCisqCisgICAgICBJRiggTFNBTUUoIERJUkVDVCwgJ0YnICkgKSBUSEVOCisgICAgICAgICBQUkVWTEFTVFYgPSBOCisgICAgICAgICBETyBJID0gMSwgSworICAgICAgICAgICAgUFJFVkxBU1RWID0gTUFYKCBJLCBQUkVWTEFTVFYgKQorICAgICAgICAgICAgSUYoIFRBVSggSSApLkVRLlpFUk8gKSBUSEVOCisqCisqICAgICAgICAgICAgICBIKGkpICA9ICBJCisqCisgICAgICAgICAgICAgICBETyBKID0gMSwgSQorICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICAgICBnZW5lcmFsIGNhc2UKKyoKKyAgICAgICAgICAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyogICAgICAgICAgICAgICAgIFNraXAgYW55IHRyYWlsaW5nIHplcm9zLgorICAgICAgICAgICAgICAgICAgRE8gTEFTVFYgPSBOLCBJKzEsIC0xCisgICAgICAgICAgICAgICAgICAgICBJRiggViggTEFTVFYsIEkgKS5ORS5aRVJPICkgRVhJVAorICAgICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICAgICAgICBETyBKID0gMSwgSS0xCisgICAgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSAtVEFVKCBJICkgKiBWKCBJICwgSiApCisgICAgICAgICAgICAgICAgICBFTkQgRE8gICAKKyAgICAgICAgICAgICAgICAgIEogPSBNSU4oIExBU1RWLCBQUkVWTEFTVFYgKQorKgorKiAgICAgICAgICAgICAgICAgVCgxOmktMSxpKSA6PSAtIHRhdShpKSAqIFYoaTpqLDE6aS0xKSoqVCAqIFYoaTpqLGkpCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1WKCAnVHJhbnNwb3NlJywgSi1JLCBJLTEsIC1UQVUoIEkgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFYoIEkrMSwgMSApLCBMRFYsIFYoIEkrMSwgSSApLCAxLCBPTkUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUKCAxLCBJICksIDEgKQorICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgU2tpcCBhbnkgdHJhaWxpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IE4sIEkrMSwgLTEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBWKCBJLCBMQVNUViApLk5FLlpFUk8gKSBFWElUCisgICAgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIERPIEogPSAxLCBJLTEKKyAgICAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IC1UQVUoIEkgKSAqIFYoIEogLCBJICkKKyAgICAgICAgICAgICAgICAgIEVORCBETyAgIAorICAgICAgICAgICAgICAgICAgSiA9IE1JTiggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IC0gdGF1KGkpICogVigxOmktMSxpOmopICogVihpLGk6aikqKlQKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU0dFTVYoICdObyB0cmFuc3Bvc2UnLCBJLTEsIEotSSwgLVRBVSggSSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgViggMSwgSSsxICksIExEViwgViggSSwgSSsxICksIExEViwgCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIFQoIDEsIEkgKSwgMSApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFQoMTppLTEsaSkgOj0gVCgxOmktMSwxOmktMSkgKiBUKDE6aS0xLGkpCisqCisgICAgICAgICAgICAgICBDQUxMIFNUUk1WKCAnVXBwZXInLCAnTm8gdHJhbnNwb3NlJywgJ05vbi11bml0JywgSS0xLCBULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgTERULCBUKCAxLCBJICksIDEgKQorICAgICAgICAgICAgICAgVCggSSwgSSApID0gVEFVKCBJICkKKyAgICAgICAgICAgICAgIElGKCBJLkdULjEgKSBUSEVOCisgICAgICAgICAgICAgICAgICBQUkVWTEFTVFYgPSBNQVgoIFBSRVZMQVNUViwgTEFTVFYgKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTEFTVFYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTkQgRE8KKyAgICAgIEVMU0UKKyAgICAgICAgIFBSRVZMQVNUViA9IDEKKyAgICAgICAgIERPIEkgPSBLLCAxLCAtMQorICAgICAgICAgICAgSUYoIFRBVSggSSApLkVRLlpFUk8gKSBUSEVOCisqCisqICAgICAgICAgICAgICBIKGkpICA9ICBJCisqCisgICAgICAgICAgICAgICBETyBKID0gSSwgSworICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIERPCisgICAgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICAgICBnZW5lcmFsIGNhc2UKKyoKKyAgICAgICAgICAgICAgIElGKCBJLkxULksgKSBUSEVOCisgICAgICAgICAgICAgICAgICBJRiggTFNBTUUoIFNUT1JFViwgJ0MnICkgKSBUSEVOCisqICAgICAgICAgICAgICAgICAgICBTa2lwIGFueSBsZWFkaW5nIHplcm9zLgorICAgICAgICAgICAgICAgICAgICAgRE8gTEFTVFYgPSAxLCBJLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBWKCBMQVNUViwgSSApLk5FLlpFUk8gKSBFWElUCisgICAgICAgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgICAgIERPIEogPSBJKzEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IC1UQVUoIEkgKSAqIFYoIE4tSytJICwgSiApCisgICAgICAgICAgICAgICAgICAgICBFTkQgRE8gICAKKyAgICAgICAgICAgICAgICAgICAgIEogPSBNQVgoIExBU1RWLCBQUkVWTEFTVFYgKQorKgorKiAgICAgICAgICAgICAgICAgICAgVChpKzE6ayxpKSA9IC10YXUoaSkgKiBWKGo6bi1rK2ksaSsxOmspKipUICogVihqOm4taytpLGkpCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNHRU1WKCAnVHJhbnNwb3NlJywgTi1LK0ktSiwgSy1JLCAtVEFVKCBJICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBWKCBKLCBJKzEgKSwgTERWLCBWKCBKLCBJICksIDEsIE9ORSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFQoIEkrMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgIFNraXAgYW55IGxlYWRpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIEksIExBU1RWICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgICAgRE8gSiA9IEkrMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogViggSiwgTi1LK0kgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIERPICAgCisgICAgICAgICAgICAgICAgICAgICBKID0gTUFYKCBMQVNUViwgUFJFVkxBU1RWICkKKyoKKyogICAgICAgICAgICAgICAgICAgIFQoaSsxOmssaSkgPSAtdGF1KGkpICogVihpKzE6ayxqOm4taytpKSAqIFYoaSxqOm4taytpKSoqVAorKgorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTR0VNViggJ05vIHRyYW5zcG9zZScsIEstSSwgTi1LK0ktSiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgLVRBVSggSSApLCBWKCBJKzEsIEogKSwgTERWLCBWKCBJLCBKICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgT05FLCBUKCBJKzEsIEkgKSwgMSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIFQoaSsxOmssaSkgOj0gVChpKzE6ayxpKzE6aykgKiBUKGkrMTprLGkpCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNUUk1WKCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ05vbi11bml0JywgSy1JLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVCggSSsxLCBJKzEgKSwgTERULCBUKCBJKzEsIEkgKSwgMSApCisgICAgICAgICAgICAgICAgICBJRiggSS5HVC4xICkgVEhFTgorICAgICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTUlOKCBQUkVWTEFTVFYsIExBU1RWICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIFBSRVZMQVNUViA9IExBU1RWCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgVCggSSwgSSApID0gVEFVKCBJICkKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRU5EIERPCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNMQVJGVAorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svc3ZkLmNwcCBiL2xhcGFjay9zdmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjMwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svc3ZkLmNwcApAQCAtMCwwICsxLDEzOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibGFwYWNrX2NvbW1vbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKworLy8gY29tcHV0ZXMgdGhlIHNpbmd1bGFyIHZhbHVlcy92ZWN0b3JzIGEgZ2VuZXJhbCBNLWJ5LU4gbWF0cml4IEEgdXNpbmcgZGl2aWRlLWFuZC1jb25xdWVyCitFSUdFTl9MQVBBQ0tfRlVOQyhnZXNkZCwoY2hhciAqam9ieiwgaW50ICptLCBpbnQqIG4sIFNjYWxhciogYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnMsIFNjYWxhciAqdSwgaW50ICpsZHUsIFNjYWxhciAqdnQsIGludCAqbGR2dCwgU2NhbGFyKiAvKndvcmsqLywgaW50KiBsd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9MQVBBQ0tfQVJHX0lGX0NPTVBMRVgoUmVhbFNjYWxhciAqLypyd29yayovKSBpbnQgKiAvKml3b3JrKi8sIGludCAqaW5mbykpCit7CisgIC8vIFRPRE8gZXhwbG9pdCB0aGUgd29yayBidWZmZXIKKyAgYm9vbCBxdWVyeV9zaXplID0gKmx3b3JrPT0tMTsKKyAgaW50IGRpYWdfc2l6ZSA9IChzdGQ6Om1pbikoKm0sKm4pOworICAKKyAgKmluZm8gPSAwOworICAgICAgICBpZigqam9ieiE9J0EnICYmICpqb2J6IT0nUycgJiYgKmpvYnohPSdPJyAmJiAqam9ieiE9J04nKSAgKmluZm8gPSAtMTsKKyAgZWxzZSAgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbyA9IC0zOworICBlbHNlICBpZigqbGRhPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm8gPSAtNTsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTg7CisgIGVsc2UgIGlmKCpsZHUgPDEgfHwgKCpqb2J6PT0nQScgJiYgKmxkdSA8Km0pCisgICAgICAgICAgICAgICAgICAgfHwgKCpqb2J6PT0nTycgJiYgKm08Km4gJiYgKmxkdTwqbSkpICAgICAgICAgICAqaW5mbyA9IC04OworICBlbHNlICBpZigqbGR2dDwxIHx8ICgqam9iej09J0EnICYmICpsZHZ0PCpuKQorICAgICAgICAgICAgICAgICAgIHx8ICgqam9iej09J1MnICYmICpsZHZ0PGRpYWdfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICB8fCAoKmpvYno9PSdPJyAmJiAqbT49Km4gJiYgKmxkdnQ8Km4pKSAgICAgICAgICppbmZvID0gLTEwOworICAKKyAgaWYoKmluZm8hPTApCisgIHsKKyAgICBpbnQgZSA9IC0qaW5mbzsKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFU0REICIsICZlLCA2KTsKKyAgfQorICAKKyAgaWYocXVlcnlfc2l6ZSkKKyAgeworICAgICpsd29yayA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGlmKCpuPT0wIHx8ICptPT0wKQorICAgIHJldHVybiAwOworICAKKyAgUGxhaW5NYXRyaXhUeXBlIG1hdCgqbSwqbik7CisgIG1hdCA9IG1hdHJpeChhLCptLCpuLCpsZGEpOworICAKKyAgaW50IG9wdGlvbiA9ICpqb2J6PT0nQScgPyBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWCisgICAgICAgICAgICAgOiAqam9iej09J1MnID8gQ29tcHV0ZVRoaW5VfENvbXB1dGVUaGluVgorICAgICAgICAgICAgIDogKmpvYno9PSdPJyA/IENvbXB1dGVUaGluVXxDb21wdXRlVGhpblYKKyAgICAgICAgICAgICA6IDA7CisKKyAgQkRDU1ZEPFBsYWluTWF0cml4VHlwZT4gc3ZkKG1hdCxvcHRpb24pOworICAKKyAgbWFrZV92ZWN0b3IocyxkaWFnX3NpemUpID0gc3ZkLnNpbmd1bGFyVmFsdWVzKCkuaGVhZChkaWFnX3NpemUpOworCisgIGlmKCpqb2J6PT0nQScpCisgIHsKKyAgICBtYXRyaXgodSwqbSwqbSwqbGR1KSAgID0gc3ZkLm1hdHJpeFUoKTsKKyAgICBtYXRyaXgodnQsKm4sKm4sKmxkdnQpID0gc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCk7CisgIH0KKyAgZWxzZSBpZigqam9iej09J1MnKQorICB7CisgICAgbWF0cml4KHUsKm0sZGlhZ19zaXplLCpsZHUpICAgPSBzdmQubWF0cml4VSgpOworICAgIG1hdHJpeCh2dCxkaWFnX3NpemUsKm4sKmxkdnQpID0gc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCk7CisgIH0KKyAgZWxzZSBpZigqam9iej09J08nICYmICptPj0qbikKKyAgeworICAgIG1hdHJpeChhLCptLCpuLCpsZGEpICAgPSBzdmQubWF0cml4VSgpOworICAgIG1hdHJpeCh2dCwqbiwqbiwqbGR2dCkgPSBzdmQubWF0cml4VigpLmFkam9pbnQoKTsKKyAgfQorICBlbHNlIGlmKCpqb2J6PT0nTycpCisgIHsKKyAgICBtYXRyaXgodSwqbSwqbSwqbGR1KSAgICAgICAgPSBzdmQubWF0cml4VSgpOworICAgIG1hdHJpeChhLGRpYWdfc2l6ZSwqbiwqbGRhKSA9IHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpOworICB9CisgICAgCisgIHJldHVybiAwOworfQorCisvLyBjb21wdXRlcyB0aGUgc2luZ3VsYXIgdmFsdWVzL3ZlY3RvcnMgYSBnZW5lcmFsIE0tYnktTiBtYXRyaXggQSB1c2luZyB0d28gc2lkZWQgamFjb2JpIGFsZ29yaXRobQorRUlHRU5fTEFQQUNLX0ZVTkMoZ2VzdmQsKGNoYXIgKmpvYnUsIGNoYXIgKmpvYnYsIGludCAqbSwgaW50KiBuLCBTY2FsYXIqIGEsIGludCAqbGRhLCBSZWFsU2NhbGFyICpzLCBTY2FsYXIgKnUsIGludCAqbGR1LCBTY2FsYXIgKnZ0LCBpbnQgKmxkdnQsIFNjYWxhciogLyp3b3JrKi8sIGludCogbHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fTEFQQUNLX0FSR19JRl9DT01QTEVYKFJlYWxTY2FsYXIgKi8qcndvcmsqLykgaW50ICppbmZvKSkKK3sKKyAgLy8gVE9ETyBleHBsb2l0IHRoZSB3b3JrIGJ1ZmZlcgorICBib29sIHF1ZXJ5X3NpemUgPSAqbHdvcms9PS0xOworICBpbnQgZGlhZ19zaXplID0gKHN0ZDo6bWluKSgqbSwqbik7CisgIAorICAqaW5mbyA9IDA7CisgICAgICAgIGlmKCAqam9idSE9J0EnICYmICpqb2J1IT0nUycgJiYgKmpvYnUhPSdPJyAmJiAqam9idSE9J04nKSAqaW5mbyA9IC0xOworICBlbHNlICBpZigoKmpvYnYhPSdBJyAmJiAqam9idiE9J1MnICYmICpqb2J2IT0nTycgJiYgKmpvYnYhPSdOJykKKyAgICAgICAgICAgfHwgKCpqb2J1PT0nTycgJiYgKmpvYnY9PSdPJykpICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbyA9IC0zOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm8gPSAtNDsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTY7CisgIGVsc2UgIGlmKCpsZHUgPDEgfHwgKCgqam9idT09J0EnIHx8ICpqb2J1PT0nUycpICYmICpsZHU8Km0pKSAgICAqaW5mbyA9IC05OworICBlbHNlICBpZigqbGR2dDwxIHx8ICgqam9idj09J0EnICYmICpsZHZ0PCpuKQorICAgICAgICAgICAgICAgICAgIHx8ICgqam9idj09J1MnICYmICpsZHZ0PGRpYWdfc2l6ZSkpICAgICAgICAgICAgKmluZm8gPSAtMTE7CisgIAorICBpZigqaW5mbyE9MCkKKyAgeworICAgIGludCBlID0gLSppbmZvOworICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VTVkQgIiwgJmUsIDYpOworICB9CisgIAorICBpZihxdWVyeV9zaXplKQorICB7CisgICAgKmx3b3JrID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYoKm49PTAgfHwgKm09PTApCisgICAgcmV0dXJuIDA7CisgIAorICBQbGFpbk1hdHJpeFR5cGUgbWF0KCptLCpuKTsKKyAgbWF0ID0gbWF0cml4KGEsKm0sKm4sKmxkYSk7CisgIAorICBpbnQgb3B0aW9uID0gKCpqb2J1PT0nQScgPyBDb21wdXRlRnVsbFUgOiAqam9idT09J1MnIHx8ICpqb2J1PT0nTycgPyBDb21wdXRlVGhpblUgOiAwKQorICAgICAgICAgICAgIHwgKCpqb2J2PT0nQScgPyBDb21wdXRlRnVsbFYgOiAqam9idj09J1MnIHx8ICpqb2J2PT0nTycgPyBDb21wdXRlVGhpblYgOiAwKTsKKyAgCisgIEphY29iaVNWRDxQbGFpbk1hdHJpeFR5cGU+IHN2ZChtYXQsb3B0aW9uKTsKKyAgCisgIG1ha2VfdmVjdG9yKHMsZGlhZ19zaXplKSA9IHN2ZC5zaW5ndWxhclZhbHVlcygpLmhlYWQoZGlhZ19zaXplKTsKKyAgeworICAgICAgICBpZigqam9idT09J0EnKSBtYXRyaXgodSwqbSwqbSwqbGR1KSAgICAgICAgICAgPSBzdmQubWF0cml4VSgpOworICBlbHNlICBpZigqam9idT09J1MnKSBtYXRyaXgodSwqbSxkaWFnX3NpemUsKmxkdSkgICAgPSBzdmQubWF0cml4VSgpOworICBlbHNlICBpZigqam9idT09J08nKSBtYXRyaXgoYSwqbSxkaWFnX3NpemUsKmxkYSkgICAgPSBzdmQubWF0cml4VSgpOworICB9CisgIHsKKyAgICAgICAgaWYoKmpvYnY9PSdBJykgbWF0cml4KHZ0LCpuLCpuLCpsZHZ0KSAgICAgICAgID0gc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCk7CisgIGVsc2UgIGlmKCpqb2J2PT0nUycpIG1hdHJpeCh2dCxkaWFnX3NpemUsKm4sKmxkdnQpICA9IHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpOworICBlbHNlICBpZigqam9idj09J08nKSBtYXRyaXgoYSxkaWFnX3NpemUsKm4sKmxkYSkgICAgPSBzdmQubWF0cml4VigpLmFkam9pbnQoKTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xhcGFjay96bGFjZ3YuZiBiL2xhcGFjay96bGFjZ3YuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMyZTJlCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3psYWNndi5mCkBAIC0wLDAgKzEsMTE2IEBACisqPiBcYnJpZWYgXGIgWkxBQ0dWCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgWkxBQ0dWICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFjZ3YuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFjZ3YuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFjZ3YuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBaTEFDR1YoIE4sIFgsIElOQ1ggKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCoxNiAgICAgICAgIFgoICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gWkxBQ0dWIGNvbmp1Z2F0ZXMgYSBjb21wbGV4IHZlY3RvciBvZiBsZW5ndGggTi4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIFguICBOID49IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFggaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAoMSsoTi0xKSphYnMoSU5DWCkpCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIHZlY3RvciBvZiBsZW5ndGggTiB0byBiZSBjb25qdWdhdGVkLgorKj4gICAgICAgICAgT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbiB3aXRoIGNvbmpnKFgpLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1ggaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIHNwYWNpbmcgYmV0d2VlbiBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIFguCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4MTZPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTVUJST1VUSU5FIFpMQUNHViggTiwgWCwgSU5DWCApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNYLCBOCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWCggKiApCisqICAgICAuLgorKgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJT0ZGCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDT05KRworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIElOQ1guRVEuMSApIFRIRU4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBOCisgICAgICAgICAgICBYKCBJICkgPSBEQ09OSkcoIFgoIEkgKSApCisgICAxMCAgICBDT05USU5VRQorICAgICAgRUxTRQorICAgICAgICAgSU9GRiA9IDEKKyAgICAgICAgIElGKCBJTkNYLkxULjAgKQorICAgICAkICAgICAgSU9GRiA9IDEgLSAoIE4tMSApKklOQ1gKKyAgICAgICAgIERPIDIwIEkgPSAxLCBOCisgICAgICAgICAgICBYKCBJT0ZGICkgPSBEQ09OSkcoIFgoIElPRkYgKSApCisgICAgICAgICAgICBJT0ZGID0gSU9GRiArIElOQ1gKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpMQUNHVgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svemxhZGl2LmYgYi9sYXBhY2svemxhZGl2LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MWRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay96bGFkaXYuZgpAQCAtMCwwICsxLDk3IEBACisqPiBcYnJpZWYgXGIgWkxBRElWCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgWkxBRElWICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFkaXYuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFkaXYuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFkaXYuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgQ09NUExFWCoxNiAgICAgRlVOQ1RJT04gWkxBRElWKCBYLCBZICkKKyogCisqICAgICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCoxNiAgICAgICAgIFgsIFkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFpMQURJViA6PSBYIC8gWSwgd2hlcmUgWCBhbmQgWSBhcmUgY29tcGxleC4gIFRoZSBjb21wdXRhdGlvbiBvZiBYIC8gWQorKj4gd2lsbCBub3Qgb3ZlcmZsb3cgb24gYW4gaW50ZXJtZWRpYXJ5IHN0ZXAgdW5sZXNzIHRoZSByZXN1bHRzCisqPiBvdmVyZmxvd3MuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEFyZ3VtZW50czoKKyogID09PT09PT09PT0KKyoKKyo+IFxwYXJhbVtpbl0gWAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBYIGlzIENPTVBMRVgqMTYKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gWQorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBZIGlzIENPTVBMRVgqMTYKKyo+ICAgICAgICAgIFRoZSBjb21wbGV4IHNjYWxhcnMgWCBhbmQgWS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIE5vdmVtYmVyIDIwMTEKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXgxNk9USEVSYXV4aWxpYXJ5CisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIENPTVBMRVgqMTYgICAgIEZVTkNUSU9OIFpMQURJViggWCwgWSApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBYLCBZCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkksIFpSCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETEFESVYKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgREJMRSwgRENNUExYLCBESU1BRworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgQ0FMTCBETEFESVYoIERCTEUoIFggKSwgRElNQUcoIFggKSwgREJMRSggWSApLCBESU1BRyggWSApLCBaUiwKKyAgICAgJCAgICAgICAgICAgICBaSSApCisgICAgICBaTEFESVYgPSBEQ01QTFgoIFpSLCBaSSApCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBaTEFESVYKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvbGFwYWNrL3psYXJmLmYgYi9sYXBhY2svemxhcmYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YzMTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3psYXJmLmYKQEAgLTAsMCArMSwyMzIgQEAKKyo+IFxicmllZiBcYiBaTEFSRgorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIFpMQVJGICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZi5mIj4gCisqPiBbVEdaXTwvYT4gCisqPiA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvY2dpLWJpbi9uZXRsaWJmaWxlcy56aXA/Zm9ybWF0PXppcCZmaWxlbmFtZT0vbGFwYWNrL2xhcGFja19yb3V0aW5lL3psYXJmLmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvemxhcmYuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBaTEFSRiggU0lERSwgTSwgTiwgViwgSU5DViwgVEFVLCBDLCBMREMsIFdPUksgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBDSEFSQUNURVIgICAgICAgICAgU0lERQorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DViwgTERDLCBNLCBOCisqICAgICAgIENPTVBMRVgqMTYgICAgICAgICBUQVUKKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIENPTVBMRVgqMTYgICAgICAgICBDKCBMREMsICogKSwgViggKiApLCBXT1JLKCAqICkKKyogICAgICAgLi4KKyogIAorKgorKj4gXHBhciBQdXJwb3NlOgorKiAgPT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+IFpMQVJGIGFwcGxpZXMgYSBjb21wbGV4IGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggdG8gYSBjb21wbGV4IE0tYnktTgorKj4gbWF0cml4IEMsIGZyb20gZWl0aGVyIHRoZSBsZWZ0IG9yIHRoZSByaWdodC4gSCBpcyByZXByZXNlbnRlZCBpbiB0aGUKKyo+IGZvcm0KKyo+CisqPiAgICAgICBIID0gSSAtIHRhdSAqIHYgKiB2KipICisqPgorKj4gd2hlcmUgdGF1IGlzIGEgY29tcGxleCBzY2FsYXIgYW5kIHYgaXMgYSBjb21wbGV4IHZlY3Rvci4KKyo+CisqPiBJZiB0YXUgPSAwLCB0aGVuIEggaXMgdGFrZW4gdG8gYmUgdGhlIHVuaXQgbWF0cml4LgorKj4KKyo+IFRvIGFwcGx5IEgqKkgsIHN1cHBseSBjb25qZyh0YXUpIGluc3RlYWQKKyo+IHRhdS4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXJndW1lbnRzOgorKiAgPT09PT09PT09PQorKgorKj4gXHBhcmFtW2luXSBTSURFCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFNJREUgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgID0gJ0wnOiBmb3JtICBIICogQworKj4gICAgICAgICAgPSAnUic6IGZvcm0gIEMgKiBICisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIENPTVBMRVgqMTYgYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAoMSArIChNLTEpKmFicyhJTkNWKSkgaWYgU0lERSA9ICdMJworKj4gICAgICAgICAgICAgICAgICBvciAoMSArIChOLTEpKmFicyhJTkNWKSkgaWYgU0lERSA9ICdSJworKj4gICAgICAgICAgVGhlIHZlY3RvciB2IGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiBILiBWIGlzIG5vdCB1c2VkIGlmCisqPiAgICAgICAgICBUQVUgPSAwLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBJTkNWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIElOQ1YgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGluY3JlbWVudCBiZXR3ZWVuIGVsZW1lbnRzIG9mIHYuIElOQ1YgPD4gMC4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBDT01QTEVYKjE2CisqPiAgICAgICAgICBUaGUgdmFsdWUgdGF1IGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiBILgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gQworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBDIGlzIENPTVBMRVgqMTYgYXJyYXksIGRpbWVuc2lvbiAoTERDLE4pCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIE0tYnktTiBtYXRyaXggQy4KKyo+ICAgICAgICAgIE9uIGV4aXQsIEMgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIG1hdHJpeCBIICogQyBpZiBTSURFID0gJ0wnLAorKj4gICAgICAgICAgb3IgQyAqIEggaWYgU0lERSA9ICdSJy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEQyBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IEMuIExEQyA+PSBtYXgoMSxNKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFdPUksKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgV09SSyBpcyBDT01QTEVYKjE2IGFycmF5LCBkaW1lbnNpb24KKyo+ICAgICAgICAgICAgICAgICAgICAgICAgIChOKSBpZiBTSURFID0gJ0wnCisqPiAgICAgICAgICAgICAgICAgICAgICBvciAoTSkgaWYgU0lERSA9ICdSJworKj4gXGVuZHZlcmJhdGltCisqCisqICBBdXRob3JzOgorKiAgPT09PT09PT0KKyoKKyo+IFxhdXRob3IgVW5pdi4gb2YgVGVubmVzc2VlIAorKj4gXGF1dGhvciBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5IAorKj4gXGF1dGhvciBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgCisqPiBcYXV0aG9yIE5BRyBMdGQuIAorKgorKj4gXGRhdGUgTm92ZW1iZXIgMjAxMQorKgorKj4gXGluZ3JvdXAgY29tcGxleDE2T1RIRVJhdXhpbGlhcnkKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBaTEFSRiggU0lERSwgTSwgTiwgViwgSU5DViwgVEFVLCBDLCBMREMsIFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgU0lERQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1YsIExEQywgTSwgTgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFRBVQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEMoIExEQywgKiApLCBWKCAqICksIFdPUksoICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gKCAxLjBEKzAsIDAuMEQrMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFpFUk8gPSAoIDAuMEQrMCwgMC4wRCswICkgKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBBUFBMWUxFRlQKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBMQVNUViwgTEFTVEMKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpHRU1WLCBaR0VSQworKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTQU1FCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSUxBWkxSLCBJTEFaTEMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRSwgSUxBWkxSLCBJTEFaTEMKKyogICAgIC4uCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIEFQUExZTEVGVCA9IExTQU1FKCBTSURFLCAnTCcgKQorICAgICAgTEFTVFYgPSAwCisgICAgICBMQVNUQyA9IDAKKyAgICAgIElGKCBUQVUuTkUuWkVSTyApIFRIRU4KKyogICAgIFNldCB1cCB2YXJpYWJsZXMgZm9yIHNjYW5uaW5nIFYuICBMQVNUViBiZWdpbnMgcG9pbnRpbmcgdG8gdGhlIGVuZAorKiAgICAgb2YgVi4KKyAgICAgICAgIElGKCBBUFBMWUxFRlQgKSBUSEVOCisgICAgICAgICAgICBMQVNUViA9IE0KKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBU1RWID0gTgorICAgICAgICAgRU5EIElGCisgICAgICAgICBJRiggSU5DVi5HVC4wICkgVEhFTgorICAgICAgICAgICAgSSA9IDEgKyAoTEFTVFYtMSkgKiBJTkNWCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBJID0gMQorICAgICAgICAgRU5EIElGCisqICAgICBMb29rIGZvciB0aGUgbGFzdCBub24temVybyByb3cgaW4gVi4KKyAgICAgICAgIERPIFdISUxFKCBMQVNUVi5HVC4wIC5BTkQuIFYoIEkgKS5FUS5aRVJPICkKKyAgICAgICAgICAgIExBU1RWID0gTEFTVFYgLSAxCisgICAgICAgICAgICBJID0gSSAtIElOQ1YKKyAgICAgICAgIEVORCBETworICAgICAgICAgSUYoIEFQUExZTEVGVCApIFRIRU4KKyogICAgIFNjYW4gZm9yIHRoZSBsYXN0IG5vbi16ZXJvIGNvbHVtbiBpbiBDKDE6bGFzdHYsOikuCisgICAgICAgICAgICBMQVNUQyA9IElMQVpMQyhMQVNUViwgTiwgQywgTERDKQorICAgICAgICAgRUxTRQorKiAgICAgU2NhbiBmb3IgdGhlIGxhc3Qgbm9uLXplcm8gcm93IGluIEMoOiwxOmxhc3R2KS4KKyAgICAgICAgICAgIExBU1RDID0gSUxBWkxSKE0sIExBU1RWLCBDLCBMREMpCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKiAgICAgTm90ZSB0aGF0IGxhc3RjLmVxLjAgcmVuZGVycyB0aGUgQkxBUyBvcGVyYXRpb25zIG51bGw7IG5vIHNwZWNpYWwKKyogICAgIGNhc2UgaXMgbmVlZGVkIGF0IHRoaXMgbGV2ZWwuCisgICAgICBJRiggQVBQTFlMRUZUICkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgSCAqIEMKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0diwxOmxhc3RjKSoqSCAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBaR0VNViggJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUViwgTEFTVEMsIE9ORSwKKyAgICAgJCAgICAgICAgICAgQywgTERDLCBWLCBJTkNWLCBaRVJPLCBXT1JLLCAxICkKKyoKKyogICAgICAgICAgIEMoMTpsYXN0diwxOmxhc3RjKSA6PSBDKC4uLikgLSB2KDE6bGFzdHYsMSkgKiB3KDE6bGFzdGMsMSkqKkgKKyoKKyAgICAgICAgICAgIENBTEwgWkdFUkMoIExBU1RWLCBMQVNUQywgLVRBVSwgViwgSU5DViwgV09SSywgMSwgQywgTERDICkKKyAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQyAqIEgKKyoKKyAgICAgICAgIElGKCBMQVNUVi5HVC4wICkgVEhFTgorKgorKiAgICAgICAgICAgdygxOmxhc3RjLDEpIDo9IEMoMTpsYXN0YywxOmxhc3R2KSAqIHYoMTpsYXN0diwxKQorKgorICAgICAgICAgICAgQ0FMTCBaR0VNViggJ05vIHRyYW5zcG9zZScsIExBU1RDLCBMQVNUViwgT05FLCBDLCBMREMsCisgICAgICQgICAgICAgICAgIFYsIElOQ1YsIFpFUk8sIFdPUkssIDEgKQorKgorKiAgICAgICAgICAgQygxOmxhc3RjLDE6bGFzdHYpIDo9IEMoLi4uKSAtIHcoMTpsYXN0YywxKSAqIHYoMTpsYXN0diwxKSoqSAorKgorICAgICAgICAgICAgQ0FMTCBaR0VSQyggTEFTVEMsIExBU1RWLCAtVEFVLCBXT1JLLCAxLCBWLCBJTkNWLCBDLCBMREMgKQorICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpMQVJGCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay96bGFyZmIuZiBiL2xhcGFjay96bGFyZmIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGZjNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3psYXJmYi5mCkBAIC0wLDAgKzEsNzc0IEBACisqPiBcYnJpZWYgXGIgWkxBUkZCCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgWkxBUkZCICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmIuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmIuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmIuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBaTEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgTERULCBDLCBMREMsIFdPUkssIExEV09SSyApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNJREUsIFNUT1JFViwgVFJBTlMKKyogICAgICAgSU5URUdFUiAgICAgICAgICAgIEssIExEQywgTERULCBMRFYsIExEV09SSywgTSwgTgorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCoxNiAgICAgICAgIEMoIExEQywgKiApLCBUKCBMRFQsICogKSwgViggTERWLCAqICksCisqICAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gWkxBUkZCIGFwcGxpZXMgYSBjb21wbGV4IGJsb2NrIHJlZmxlY3RvciBIIG9yIGl0cyB0cmFuc3Bvc2UgSCoqSCB0byBhCisqPiBjb21wbGV4IE0tYnktTiBtYXRyaXggQywgZnJvbSBlaXRoZXIgdGhlIGxlZnQgb3IgdGhlIHJpZ2h0LgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIFNJREUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU0lERSBpcyBDSEFSQUNURVIqMQorKj4gICAgICAgICAgPSAnTCc6IGFwcGx5IEggb3IgSCoqSCBmcm9tIHRoZSBMZWZ0CisqPiAgICAgICAgICA9ICdSJzogYXBwbHkgSCBvciBIKipIIGZyb20gdGhlIFJpZ2h0CisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIFRSQU5TCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRSQU5TIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICA9ICdOJzogYXBwbHkgSCAoTm8gdHJhbnNwb3NlKQorKj4gICAgICAgICAgPSAnQyc6IGFwcGx5IEgqKkggKENvbmp1Z2F0ZSB0cmFuc3Bvc2UpCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIERJUkVDVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBESVJFQ1QgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIEluZGljYXRlcyBob3cgSCBpcyBmb3JtZWQgZnJvbSBhIHByb2R1Y3Qgb2YgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9ycworKj4gICAgICAgICAgPSAnRic6IEggPSBIKDEpIEgoMikgLiAuIC4gSChrKSAoRm9yd2FyZCkKKyo+ICAgICAgICAgID0gJ0InOiBIID0gSChrKSAuIC4gLiBIKDIpIEgoMSkgKEJhY2t3YXJkKQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBTVE9SRVYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU1RPUkVWIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICBJbmRpY2F0ZXMgaG93IHRoZSB2ZWN0b3JzIHdoaWNoIGRlZmluZSB0aGUgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9ycyBhcmUgc3RvcmVkOgorKj4gICAgICAgICAgPSAnQyc6IENvbHVtbndpc2UKKyo+ICAgICAgICAgID0gJ1InOiBSb3d3aXNlCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE0KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTSBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIG1hdHJpeCBDLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBOCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIE4gaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggQy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gSworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBLIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBvcmRlciBvZiB0aGUgbWF0cml4IFQgKD0gdGhlIG51bWJlciBvZiBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3JzIHdob3NlIHByb2R1Y3QgZGVmaW5lcyB0aGUgYmxvY2sgcmVmbGVjdG9yKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVgorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBWIGlzIENPTVBMRVgqMTYgYXJyYXksIGRpbWVuc2lvbgorKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRFYsSykgaWYgU1RPUkVWID0gJ0MnCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixNKSBpZiBTVE9SRVYgPSAnUicgYW5kIFNJREUgPSAnTCcKKyo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLE4pIGlmIFNUT1JFViA9ICdSJyBhbmQgU0lERSA9ICdSJworKj4gICAgICAgICAgU2VlIEZ1cnRoZXIgRGV0YWlscy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEViBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFYuCisqPiAgICAgICAgICBJZiBTVE9SRVYgPSAnQycgYW5kIFNJREUgPSAnTCcsIExEViA+PSBtYXgoMSxNKTsKKyo+ICAgICAgICAgIGlmIFNUT1JFViA9ICdDJyBhbmQgU0lERSA9ICdSJywgTERWID49IG1heCgxLE4pOworKj4gICAgICAgICAgaWYgU1RPUkVWID0gJ1InLCBMRFYgPj0gSy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBUIGlzIENPTVBMRVgqMTYgYXJyYXksIGRpbWVuc2lvbiAoTERULEspCisqPiAgICAgICAgICBUaGUgdHJpYW5ndWxhciBLLWJ5LUsgbWF0cml4IFQgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorKj4gICAgICAgICAgYmxvY2sgcmVmbGVjdG9yLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBMRFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTERUIGlzIElOVEVHRVIKKyo+ICAgICAgICAgIFRoZSBsZWFkaW5nIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgVC4gTERUID49IEsuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBDCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIEMgaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uIChMREMsTikKKyo+ICAgICAgICAgIE9uIGVudHJ5LCB0aGUgTS1ieS1OIG1hdHJpeCBDLgorKj4gICAgICAgICAgT24gZXhpdCwgQyBpcyBvdmVyd3JpdHRlbiBieSBIKkMgb3IgSCoqSCpDIG9yIEMqSCBvciBDKkgqKkguCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEQworKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMREMgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBDLiBMREMgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBXT1JLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFdPUksgaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uIChMRFdPUkssSykKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERXT1JLCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEV09SSyBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFdPUksuCisqPiAgICAgICAgICBJZiBTSURFID0gJ0wnLCBMRFdPUksgPj0gbWF4KDEsTik7CisqPiAgICAgICAgICBpZiBTSURFID0gJ1InLCBMRFdPUksgPj0gbWF4KDEsTSkuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4MTZPVEhFUmF1eGlsaWFyeQorKgorKj4gXHBhciBGdXJ0aGVyIERldGFpbHM6CisqICA9PT09PT09PT09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiAgVGhlIHNoYXBlIG9mIHRoZSBtYXRyaXggViBhbmQgdGhlIHN0b3JhZ2Ugb2YgdGhlIHZlY3RvcnMgd2hpY2ggZGVmaW5lCisqPiAgdGhlIEgoaSkgaXMgYmVzdCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2l0aCBuID0gNSBhbmQKKyo+ICBrID0gMy4gVGhlIGVsZW1lbnRzIGVxdWFsIHRvIDEgYXJlIG5vdCBzdG9yZWQ7IHRoZSBjb3JyZXNwb25kaW5nCisqPiAgYXJyYXkgZWxlbWVudHMgYXJlIG1vZGlmaWVkIGJ1dCByZXN0b3JlZCBvbiBleGl0LiBUaGUgcmVzdCBvZiB0aGUKKyo+ICBhcnJheSBpcyBub3QgdXNlZC4KKyo+CisqPiAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCAgMSAgICAgICApICAgICAgICAgICAgICAgICBWID0gKCAgMSB2MSB2MSB2MSB2MSApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxICAxICAgICkgICAgICAgICAgICAgICAgICAgICAoICAgICAxIHYyIHYyIHYyICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgIDEgKSAgICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgdjMgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+CisqPiAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICBWID0gKCB2MSB2MSAgMSAgICAgICApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYyIHYyIHYyICAxICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggIDEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjMgdjMgdjMgdjMgIDEgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAgICAxICkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBaTEFSRkIoIFNJREUsIFRSQU5TLCBESVJFQ1QsIFNUT1JFViwgTSwgTiwgSywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICAgIFQsIExEVCwgQywgTERDLCBXT1JLLCBMRFdPUksgKQorKgorKiAgLS0gTEFQQUNLIGF1eGlsaWFyeSByb3V0aW5lICh2ZXJzaW9uIDMuNC4wKSAtLQorKiAgLS0gTEFQQUNLIGlzIGEgc29mdHdhcmUgcGFja2FnZSBwcm92aWRlZCBieSBVbml2LiBvZiBUZW5uZXNzZWUsICAgIC0tCisqICAtLSBVbml2LiBvZiBDYWxpZm9ybmlhIEJlcmtlbGV5LCBVbml2LiBvZiBDb2xvcmFkbyBEZW52ZXIgYW5kIE5BRyBMdGQuLi0tCisqICAgICBOb3ZlbWJlciAyMDExCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgRElSRUNULCBTSURFLCBTVE9SRVYsIFRSQU5TCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSywgTERDLCBMRFQsIExEViwgTERXT1JLLCBNLCBOCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQyggTERDLCAqICksIFQoIExEVCwgKiApLCBWKCBMRFYsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBXT1JLKCBMRFdPUkssICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gKCAxLjBEKzAsIDAuMEQrMCApICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDSEFSQUNURVIgICAgICAgICAgVFJBTlNUCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgTEFTVFYsIExBU1RDCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNBTUUKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTEFaTFIsIElMQVpMQworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTQU1FLCBJTEFaTFIsIElMQVpMQworKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkNPUFksIFpHRU1NLCBaTEFDR1YsIFpUUk1NCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDT05KRworKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlCisqCisgICAgICBJRiggTS5MRS4wIC5PUi4gTi5MRS4wICkKKyAgICAgJCAgIFJFVFVSTgorKgorICAgICAgSUYoIExTQU1FKCBUUkFOUywgJ04nICkgKSBUSEVOCisgICAgICAgICBUUkFOU1QgPSAnQycKKyAgICAgIEVMU0UKKyAgICAgICAgIFRSQU5TVCA9ICdOJworICAgICAgRU5EIElGCisqCisgICAgICBJRiggTFNBTUUoIFNUT1JFViwgJ0MnICkgKSBUSEVOCisqCisgICAgICAgICBJRiggTFNBTUUoIERJUkVDVCwgJ0YnICkgKSBUSEVOCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSApICAgIChmaXJzdCBLIHJvd3MpCisqICAgICAgICAgICAgICAgICAgICAgKCBWMiApCisqICAgICAgICAgICB3aGVyZSAgVjEgIGlzIHVuaXQgbG93ZXIgdHJpYW5ndWxhci4KKyoKKyAgICAgICAgICAgIElGKCBMU0FNRSggU0lERSwgJ0wnICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBIICogQyAgb3IgIEgqKkggKiBDICB3aGVyZSAgQyA9ICggQzEgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFaTFIoIE0sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBWkxDKCBMQVNUViwgTiwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyoqSCAqIFYgID0gIChDMSoqSCAqIFYxICsgQzIqKkggKiBWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEqKkgKKyoKKyAgICAgICAgICAgICAgIERPIDEwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIFpDT1BZKCBMQVNUQywgQyggSiwgMSApLCBMREMsIFdPUksoIDEsIEogKSwgMSApCisgICAgICAgICAgICAgICAgICBDQUxMIFpMQUNHViggTEFTVEMsIFdPUksoIDEsIEogKSwgMSApCisgICAxMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzIqKkggKlYyCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywgT05FLCBDKCBLKzEsIDEgKSwgTERDLAorICAgICAkICAgICAgICAgICAgICAgICBWKCBLKzEsIDEgKSwgTERWLCBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQqKkggIG9yICBXICogVAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgVFJBTlNULCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBWICogVyoqSAorKgorICAgICAgICAgICAgICAgSUYoIE0uR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMyIDo9IEMyIC0gVjIgKiBXKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUVi1LLCBMQVNUQywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgViggSysxLCAxICksIExEViwgV09SSywgTERXT1JLLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIEsrMSwgMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVyoqSAorKgorICAgICAgICAgICAgICAgRE8gMzAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSiwgSSApID0gQyggSiwgSSApIC0gRENPTkpHKCBXT1JLKCBJLCBKICkgKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDMwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipIICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFaTFIoIE4sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBWkxSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYgID0gIChDMSpWMSArIEMyKlYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMQorKgorICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgWkNPUFkoIExBU1RDLCBDKCAxLCBKICksIDEsIFdPUksoIDEsIEogKSwgMSApCisgICA0MCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzIgKiBWMgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNTSggJ05vIHRyYW5zcG9zZScsICdObyB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgSywgTEFTVFYtSywKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCAxLCBLKzEgKSwgTERDLCBWKCBLKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQgIG9yICBXICogVCoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgVFJBTlMsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFcgKiBWKipICisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMyIDo9IEMyIC0gVyAqIFYyKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnTm8gdHJhbnNwb3NlJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICBMQVNUQywgTEFTVFYtSywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgV09SSywgTERXT1JLLCBWKCBLKzEsIDEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIDEsIEsrMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQyggSSwgSiApIC0gV09SSyggSSwgSiApCisgICA1MCAgICAgICAgICAgICBDT05USU5VRQorICAgNjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgTGV0ICBWID0gICggVjEgKQorKiAgICAgICAgICAgICAgICAgICAgICggVjIgKSAgICAobGFzdCBLIHJvd3MpCisqICAgICAgICAgICB3aGVyZSAgVjIgIGlzIHVuaXQgdXBwZXIgdHJpYW5ndWxhci4KKyoKKyAgICAgICAgICAgIElGKCBMU0FNRSggU0lERSwgJ0wnICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBIICogQyAgb3IgIEgqKkggKiBDICB3aGVyZSAgQyA9ICggQzEgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFaTFIoIE0sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBWkxDKCBMQVNUViwgTiwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyoqSCAqIFYgID0gIChDMSoqSCAqIFYxICsgQzIqKkggKiBWMikgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIqKkgKKyoKKyAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIFpDT1BZKCBMQVNUQywgQyggTEFTVFYtSytKLCAxICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgV09SSyggMSwgSiApLCAxICkKKyAgICAgICAgICAgICAgICAgIENBTEwgWkxBQ0dWKCBMQVNUQywgV09SSyggMSwgSiApLCAxICkKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMgorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViggTEFTVFYtSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzEqKkgqVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywgJ05vIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFQqKkggIG9yICBXICogVAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ0xvd2VyJywgVFJBTlNULCAnTm9uLXVuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBULCBMRFQsIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDIDo9IEMgLSBWICogVyoqSAorKgorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBDMSA6PSBDMSAtIFYxICogVyoqSAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNTSggJ05vIHRyYW5zcG9zZScsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVFYtSywgTEFTVEMsIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFYsIExEViwgV09SSywgTERXT1JLLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipICisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICdVbml0JywgTEFTVEMsIEssIE9ORSwgViggTEFTVFYtSysxLCAxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMyIDo9IEMyIC0gVyoqSAorKgorICAgICAgICAgICAgICAgRE8gOTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggTEFTVFYtSytKLCBJICkgPSBDKCBMQVNUVi1LK0osIEkgKSAtCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENPTkpHKCBXT1JLKCBJLCBKICkgKQorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBFTFNFIElGKCBMU0FNRSggU0lERSwgJ1InICkgKSBUSEVOCisqCisqICAgICAgICAgICAgICBGb3JtICBDICogSCAgb3IgIEMgKiBIKipIICB3aGVyZSAgQyA9ICggQzEgIEMyICkKKyoKKyAgICAgICAgICAgICAgIExBU1RWID0gTUFYKCBLLCBJTEFaTFIoIE4sIEssIFYsIExEViApICkKKyAgICAgICAgICAgICAgIExBU1RDID0gSUxBWkxSKCBNLCBMQVNUViwgQywgTERDICkKKyoKKyogICAgICAgICAgICAgIFcgOj0gQyAqIFYgID0gIChDMSpWMSArIEMyKlYyKSAgKHN0b3JlZCBpbiBXT1JLKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDMgorKgorICAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBDQUxMIFpDT1BZKCBMQVNUQywgQyggMSwgTEFTVFYtSytKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgIDEwMCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMxICogVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQywgTERDLCBWLCBMRFYsIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipICisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXICogVjEqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBMQVNUVi1LLCBLLCAtT05FLCBXT1JLLCBMRFdPUkssIFYsIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMioqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAnVW5pdCcsIExBU1RDLCBLLCBPTkUsIFYoIExBU1RWLUsrMSwgMSApLCBMRFYsCisgICAgICQgICAgICAgICAgICAgIFdPUkssIExEV09SSyApCisqCisqICAgICAgICAgICAgICBDMiA6PSBDMiAtIFcKKyoKKyAgICAgICAgICAgICAgIERPIDEyMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSAxLCBMQVNUQworICAgICAgICAgICAgICAgICAgICAgQyggSSwgTEFTVFYtSytKICkgPSBDKCBJLCBMQVNUVi1LK0ogKQorICAgICAkICAgICAgICAgICAgICAgICAgICAtIFdPUksoIEksIEogKQorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTIwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBJRgorKgorICAgICAgRUxTRSBJRiggTFNBTUUoIFNUT1JFViwgJ1InICkgKSBUSEVOCisqCisgICAgICAgICBJRiggTFNBTUUoIERJUkVDVCwgJ0YnICkgKSBUSEVOCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSAgVjIgKSAgICAoVjE6IGZpcnN0IEsgY29sdW1ucykKKyogICAgICAgICAgIHdoZXJlICBWMSAgaXMgdW5pdCB1cHBlciB0cmlhbmd1bGFyLgorKgorICAgICAgICAgICAgSUYoIExTQU1FKCBTSURFLCAnTCcgKSApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEZvcm0gIEggKiBDICBvciAgSCoqSCAqIEMgIHdoZXJlICBDID0gKCBDMSApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggQzIgKQorKgorICAgICAgICAgICAgICAgTEFTVFYgPSBNQVgoIEssIElMQVpMQyggSywgTSwgViwgTERWICkgKQorICAgICAgICAgICAgICAgTEFTVEMgPSBJTEFaTEMoIExBU1RWLCBOLCBDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgVyA6PSBDKipIICogVioqSCAgPSAgKEMxKipIICogVjEqKkggKyBDMioqSCAqIFYyKipIKSAoc3RvcmVkIGluIFdPUkspCisqCisqICAgICAgICAgICAgICBXIDo9IEMxKipICisqCisgICAgICAgICAgICAgICBETyAxMzAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIENBTEwgWkNPUFkoIExBU1RDLCBDKCBKLCAxICksIExEQywgV09SSyggMSwgSiApLCAxICkKKyAgICAgICAgICAgICAgICAgIENBTEwgWkxBQ0dWKCBMQVNUQywgV09SSyggMSwgSiApLCAxICkKKyAgMTMwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgJ1VuaXQnLCBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyKipIKlYyKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgICdDb25qdWdhdGUgdHJhbnNwb3NlJywgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQyggSysxLCAxICksIExEQywgViggMSwgSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBUKipIICBvciAgVyAqIFQKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdVcHBlcicsIFRSQU5TVCwgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVioqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBWMioqSCAqIFcqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBMQVNUVi1LLCBMQVNUQywgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgLU9ORSwgViggMSwgSysxICksIExEViwgV09SSywgTERXT1JLLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMoIEsrMSwgMSApLCBMREMgKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMQorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdVbml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgViwgTERWLCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXKipICisqCisgICAgICAgICAgICAgICBETyAxNTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDE0MCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEosIEkgKSA9IEMoIEosIEkgKSAtIERDT05KRyggV09SSyggSSwgSiApICkKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgIDE1MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqSCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBWkxDKCBLLCBOLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVpMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWKipIICA9ICAoQzEqVjEqKkggKyBDMipWMioqSCkgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzEKKyoKKyAgICAgICAgICAgICAgIERPIDE2MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBaQ09QWSggTEFTVEMsIEMoIDEsIEogKSwgMSwgV09SSyggMSwgSiApLCAxICkKKyAgMTYwICAgICAgICAgIENPTlRJTlVFCisqCisqICAgICAgICAgICAgICBXIDo9IFcgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNTSggJ1JpZ2h0JywgJ1VwcGVyJywgJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgJ1VuaXQnLCBMQVNUQywgSywgT05FLCBWLCBMRFYsIFdPUkssIExEV09SSyApCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIFcgOj0gVyArIEMyICogVjIqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdObyB0cmFuc3Bvc2UnLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgIExBU1RDLCBLLCBMQVNUVi1LLCBPTkUsIEMoIDEsIEsrMSApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgIFYoIDEsIEsrMSApLCBMRFYsIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipICisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnVXBwZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXICogVjIKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFdPUkssIExEV09SSywgViggMSwgSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgT05FLCBDKCAxLCBLKzEgKSwgTERDICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjEKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdVcHBlcicsICdObyB0cmFuc3Bvc2UnLCAnVW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFYsIExEViwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMxIDo9IEMxIC0gVworKgorICAgICAgICAgICAgICAgRE8gMTgwIEogPSAxLCBLCisgICAgICAgICAgICAgICAgICBETyAxNzAgSSA9IDEsIExBU1RDCisgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBDKCBJLCBKICkgLSBXT1JLKCBJLCBKICkKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgIDE4MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBFTFNFCisqCisqICAgICAgICAgICBMZXQgIFYgPSAgKCBWMSAgVjIgKSAgICAoVjI6IGxhc3QgSyBjb2x1bW5zKQorKiAgICAgICAgICAgd2hlcmUgIFYyICBpcyB1bml0IGxvd2VyIHRyaWFuZ3VsYXIuCisqCisgICAgICAgICAgICBJRiggTFNBTUUoIFNJREUsICdMJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgSCAqIEMgIG9yICBIKipIICogQyAgd2hlcmUgIEMgPSAoIEMxICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBWkxDKCBLLCBNLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVpMQyggTEFTVFYsIE4sIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMqKkggKiBWKipIICA9ICAoQzEqKkggKiBWMSoqSCArIEMyKipIICogVjIqKkgpIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIqKkgKKyoKKyAgICAgICAgICAgICAgIERPIDE5MCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBaQ09QWSggTEFTVEMsIEMoIExBU1RWLUsrSiwgMSApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgIFdPUksoIDEsIEogKSwgMSApCisgICAgICAgICAgICAgICAgICBDQUxMIFpMQUNHViggTEFTVEMsIFdPUksoIDEsIEogKSwgMSApCisgIDE5MCAgICAgICAgICBDT05USU5VRQorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVjIqKkgKKyoKKyAgICAgICAgICAgICAgIENBTEwgWlRSTU0oICdSaWdodCcsICdMb3dlcicsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgJ1VuaXQnLCBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorICAgICAgICAgICAgICAgSUYoIExBU1RWLkdULksgKSBUSEVOCisqCisqICAgICAgICAgICAgICAgICBXIDo9IFcgKyBDMSoqSCAqIFYxKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgICdDb25qdWdhdGUgdHJhbnNwb3NlJywgTEFTVEMsIEssIExBU1RWLUssCisgICAgICQgICAgICAgICAgICAgICAgIE9ORSwgQywgTERDLCBWLCBMRFYsIE9ORSwgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCoqSCAgb3IgIFcgKiBUCisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOU1QsICdOb24tdW5pdCcsCisgICAgICQgICAgICAgICAgICAgIExBU1RDLCBLLCBPTkUsIFQsIExEVCwgV09SSywgTERXT1JLICkKKyoKKyogICAgICAgICAgICAgIEMgOj0gQyAtIFYqKkggKiBXKipICisqCisgICAgICAgICAgICAgICBJRiggTEFTVFYuR1QuSyApIFRIRU4KKyoKKyogICAgICAgICAgICAgICAgIEMxIDo9IEMxIC0gVjEqKkggKiBXKipICisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpHRU1NKCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICAgICdDb25qdWdhdGUgdHJhbnNwb3NlJywgTEFTVFYtSywgTEFTVEMsIEssCisgICAgICQgICAgICAgICAgICAgICAgIC1PTkUsIFYsIExEViwgV09SSywgTERXT1JLLCBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyCisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzIgOj0gQzIgLSBXKipICisqCisgICAgICAgICAgICAgICBETyAyMTAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDIwMCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIExBU1RWLUsrSiwgSSApID0gQyggTEFTVFYtSytKLCBJICkgLQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDT05KRyggV09SSyggSSwgSiApICkKKyAgMjAwICAgICAgICAgICAgIENPTlRJTlVFCisgIDIxMCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRUxTRSBJRiggTFNBTUUoIFNJREUsICdSJyApICkgVEhFTgorKgorKiAgICAgICAgICAgICAgRm9ybSAgQyAqIEggIG9yICBDICogSCoqSCAgd2hlcmUgIEMgPSAoIEMxICBDMiApCisqCisgICAgICAgICAgICAgICBMQVNUViA9IE1BWCggSywgSUxBWkxDKCBLLCBOLCBWLCBMRFYgKSApCisgICAgICAgICAgICAgICBMQVNUQyA9IElMQVpMUiggTSwgTEFTVFYsIEMsIExEQyApCisqCisqICAgICAgICAgICAgICBXIDo9IEMgKiBWKipIICA9ICAoQzEqVjEqKkggKyBDMipWMioqSCkgIChzdG9yZWQgaW4gV09SSykKKyoKKyogICAgICAgICAgICAgIFcgOj0gQzIKKyoKKyAgICAgICAgICAgICAgIERPIDIyMCBKID0gMSwgSworICAgICAgICAgICAgICAgICAgQ0FMTCBaQ09QWSggTEFTVEMsIEMoIDEsIExBU1RWLUsrSiApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICBXT1JLKCAxLCBKICksIDEgKQorICAyMjAgICAgICAgICAgQ09OVElOVUUKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyKipICisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnQ29uanVnYXRlIHRyYW5zcG9zZScsCisgICAgICQgICAgICAgICAgICAgICdVbml0JywgTEFTVEMsIEssIE9ORSwgViggMSwgTEFTVFYtSysxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgVyA6PSBXICsgQzEgKiBWMSoqSAorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNTSggJ05vIHRyYW5zcG9zZScsICdDb25qdWdhdGUgdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIEssIExBU1RWLUssIE9ORSwgQywgTERDLCBWLCBMRFYsIE9ORSwKKyAgICAgJCAgICAgICAgICAgICAgICAgV09SSywgTERXT1JLICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgVyA6PSBXICogVCAgb3IgIFcgKiBUKipICisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCBUUkFOUywgJ05vbi11bml0JywKKyAgICAgJCAgICAgICAgICAgICAgTEFTVEMsIEssIE9ORSwgVCwgTERULCBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQyA6PSBDIC0gVyAqIFYKKyoKKyAgICAgICAgICAgICAgIElGKCBMQVNUVi5HVC5LICkgVEhFTgorKgorKiAgICAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXICogVjEKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdObyB0cmFuc3Bvc2UnLCAnTm8gdHJhbnNwb3NlJywKKyAgICAgJCAgICAgICAgICAgICAgICAgTEFTVEMsIExBU1RWLUssIEssIC1PTkUsIFdPUkssIExEV09SSywgViwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICBPTkUsIEMsIExEQyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIFcgOj0gVyAqIFYyCisqCisgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCAnUmlnaHQnLCAnTG93ZXInLCAnTm8gdHJhbnNwb3NlJywgJ1VuaXQnLAorICAgICAkICAgICAgICAgICAgICBMQVNUQywgSywgT05FLCBWKCAxLCBMQVNUVi1LKzEgKSwgTERWLAorICAgICAkICAgICAgICAgICAgICBXT1JLLCBMRFdPUksgKQorKgorKiAgICAgICAgICAgICAgQzEgOj0gQzEgLSBXCisqCisgICAgICAgICAgICAgICBETyAyNDAgSiA9IDEsIEsKKyAgICAgICAgICAgICAgICAgIERPIDIzMCBJID0gMSwgTEFTVEMKKyAgICAgICAgICAgICAgICAgICAgIEMoIEksIExBU1RWLUsrSiApID0gQyggSSwgTEFTVFYtSytKICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgLSBXT1JLKCBJLCBKICkKKyAgMjMwICAgICAgICAgICAgIENPTlRJTlVFCisgIDI0MCAgICAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkxBUkZCCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2xhcGFjay96bGFyZmcuZiBiL2xhcGFjay96bGFyZmcuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBhZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3psYXJmZy5mCkBAIC0wLDAgKzEsMjAzIEBACisqPiBcYnJpZWYgXGIgWkxBUkZHCisqCisqICA9PT09PT09PT09PSBET0NVTUVOVEFUSU9OID09PT09PT09PT09CisqCisqIE9ubGluZSBodG1sIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IAorKiAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0bGliLm9yZy9sYXBhY2svZXhwbG9yZS1odG1sLyAKKyoKKyo+IFxodG1sb25seQorKj4gRG93bmxvYWQgWkxBUkZHICsgZGVwZW5kZW5jaWVzIAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudGd6P2Zvcm1hdD10Z3omZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmcuZiI+IAorKj4gW1RHWl08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMuemlwP2Zvcm1hdD16aXAmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmcuZiI+IAorKj4gW1pJUF08L2E+IAorKj4gPGEgaHJlZj0iaHR0cDovL3d3dy5uZXRsaWIub3JnL2NnaS1iaW4vbmV0bGliZmlsZXMudHh0P2Zvcm1hdD10eHQmZmlsZW5hbWU9L2xhcGFjay9sYXBhY2tfcm91dGluZS96bGFyZmcuZiI+IAorKj4gW1RYVF08L2E+CisqPiBcZW5kaHRtbG9ubHkgCisqCisqICBEZWZpbml0aW9uOgorKiAgPT09PT09PT09PT0KKyoKKyogICAgICAgU1VCUk9VVElORSBaTEFSRkcoIE4sIEFMUEhBLCBYLCBJTkNYLCBUQVUgKQorKiAKKyogICAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgTgorKiAgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIFRBVQorKiAgICAgICAuLgorKiAgICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyogICAgICAgQ09NUExFWCoxNiAgICAgICAgIFgoICogKQorKiAgICAgICAuLgorKiAgCisqCisqPiBccGFyIFB1cnBvc2U6CisqICA9PT09PT09PT09PT09CisqPgorKj4gXHZlcmJhdGltCisqPgorKj4gWkxBUkZHIGdlbmVyYXRlcyBhIGNvbXBsZXggZWxlbWVudGFyeSByZWZsZWN0b3IgSCBvZiBvcmRlciBuLCBzdWNoCisqPiB0aGF0CisqPgorKj4gICAgICAgSCoqSCAqICggYWxwaGEgKSA9ICggYmV0YSApLCAgIEgqKkggKiBIID0gSS4KKyo+ICAgICAgICAgICAgICAoICAgeCAgICkgICAoICAgMCAgKQorKj4KKyo+IHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB3aXRoIGJldGEgcmVhbCwgYW5kIHggaXMgYW4KKyo+IChuLTEpLWVsZW1lbnQgY29tcGxleCB2ZWN0b3IuIEggaXMgcmVwcmVzZW50ZWQgaW4gdGhlIGZvcm0KKyo+CisqPiAgICAgICBIID0gSSAtIHRhdSAqICggMSApICogKCAxIHYqKkggKSAsCisqPiAgICAgICAgICAgICAgICAgICAgICggdiApCisqPgorKj4gd2hlcmUgdGF1IGlzIGEgY29tcGxleCBzY2FsYXIgYW5kIHYgaXMgYSBjb21wbGV4IChuLTEpLWVsZW1lbnQKKyo+IHZlY3Rvci4gTm90ZSB0aGF0IEggaXMgbm90IGhlcm1pdGlhbi4KKyo+CisqPiBJZiB0aGUgZWxlbWVudHMgb2YgeCBhcmUgYWxsIHplcm8gYW5kIGFscGhhIGlzIHJlYWwsIHRoZW4gdGF1ID0gMAorKj4gYW5kIEggaXMgdGFrZW4gdG8gYmUgdGhlIHVuaXQgbWF0cml4LgorKj4KKyo+IE90aGVyd2lzZSAgMSA8PSByZWFsKHRhdSkgPD0gMiAgYW5kICBhYnModGF1LTEpIDw9IDEgLgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luLG91dF0gQUxQSEEKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgQUxQSEEgaXMgQ09NUExFWCoxNgorKj4gICAgICAgICAgT24gZW50cnksIHRoZSB2YWx1ZSBhbHBoYS4KKyo+ICAgICAgICAgIE9uIGV4aXQsIGl0IGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHZhbHVlIGJldGEuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW4sb3V0XSBYCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFggaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAoMSsoTi0yKSphYnMoSU5DWCkpCisqPiAgICAgICAgICBPbiBlbnRyeSwgdGhlIHZlY3RvciB4LgorKj4gICAgICAgICAgT24gZXhpdCwgaXQgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgdmVjdG9yIHYuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIElOQ1gKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgSU5DWCBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgaW5jcmVtZW50IGJldHdlZW4gZWxlbWVudHMgb2YgWC4gSU5DWCA+IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1bb3V0XSBUQVUKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVEFVIGlzIENPTVBMRVgqMTYKKyo+ICAgICAgICAgIFRoZSB2YWx1ZSB0YXUuCisqPiBcZW5kdmVyYmF0aW0KKyoKKyogIEF1dGhvcnM6CisqICA9PT09PT09PQorKgorKj4gXGF1dGhvciBVbml2LiBvZiBUZW5uZXNzZWUgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgCisqPiBcYXV0aG9yIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciAKKyo+IFxhdXRob3IgTkFHIEx0ZC4gCisqCisqPiBcZGF0ZSBOb3ZlbWJlciAyMDExCisqCisqPiBcaW5ncm91cCBjb21wbGV4MTZPVEhFUmF1eGlsaWFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTVUJST1VUSU5FIFpMQVJGRyggTiwgQUxQSEEsIFgsIElOQ1gsIFRBVSApCisqCisqICAtLSBMQVBBQ0sgYXV4aWxpYXJ5IHJvdXRpbmUgKHZlcnNpb24gMy40LjApIC0tCisqICAtLSBMQVBBQ0sgaXMgYSBzb2Z0d2FyZSBwYWNrYWdlIHByb3ZpZGVkIGJ5IFVuaXYuIG9mIFRlbm5lc3NlZSwgICAgLS0KKyogIC0tIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXksIFVuaXYuIG9mIENvbG9yYWRvIERlbnZlciBhbmQgTkFHIEx0ZC4uLS0KKyogICAgIE5vdmVtYmVyIDIwMTEKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNYLCBOCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIFRBVQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFgoICogKQorKiAgICAgLi4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIE9ORSwgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggT05FID0gMS4wRCswLCBaRVJPID0gMC4wRCswICkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSiwgS05UCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEksIEFMUEhSLCBCRVRBLCBSU0FGTU4sIFNBRk1JTiwgWE5PUk0KKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBETEFNQ0gsIERMQVBZMywgRFpOUk0yCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkxBRElWCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRExBTUNILCBETEFQWTMsIERaTlJNMiwgWkxBRElWCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgREJMRSwgRENNUExYLCBESU1BRywgU0lHTgorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkRTQ0FMLCBaU0NBTAorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgSUYoIE4uTEUuMCApIFRIRU4KKyAgICAgICAgIFRBVSA9IFpFUk8KKyAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisgICAgICBYTk9STSA9IERaTlJNMiggTi0xLCBYLCBJTkNYICkKKyAgICAgIEFMUEhSID0gREJMRSggQUxQSEEgKQorICAgICAgQUxQSEkgPSBESU1BRyggQUxQSEEgKQorKgorICAgICAgSUYoIFhOT1JNLkVRLlpFUk8gLkFORC4gQUxQSEkuRVEuWkVSTyApIFRIRU4KKyoKKyogICAgICAgIEggID0gIEkKKyoKKyAgICAgICAgIFRBVSA9IFpFUk8KKyAgICAgIEVMU0UKKyoKKyogICAgICAgIGdlbmVyYWwgY2FzZQorKgorICAgICAgICAgQkVUQSA9IC1TSUdOKCBETEFQWTMoIEFMUEhSLCBBTFBISSwgWE5PUk0gKSwgQUxQSFIgKQorICAgICAgICAgU0FGTUlOID0gRExBTUNIKCAnUycgKSAvIERMQU1DSCggJ0UnICkKKyAgICAgICAgIFJTQUZNTiA9IE9ORSAvIFNBRk1JTgorKgorICAgICAgICAgS05UID0gMAorICAgICAgICAgSUYoIEFCUyggQkVUQSApLkxULlNBRk1JTiApIFRIRU4KKyoKKyogICAgICAgICAgIFhOT1JNLCBCRVRBIG1heSBiZSBpbmFjY3VyYXRlOyBzY2FsZSBYIGFuZCByZWNvbXB1dGUgdGhlbQorKgorICAgMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEtOVCA9IEtOVCArIDEKKyAgICAgICAgICAgIENBTEwgWkRTQ0FMKCBOLTEsIFJTQUZNTiwgWCwgSU5DWCApCisgICAgICAgICAgICBCRVRBID0gQkVUQSpSU0FGTU4KKyAgICAgICAgICAgIEFMUEhJID0gQUxQSEkqUlNBRk1OCisgICAgICAgICAgICBBTFBIUiA9IEFMUEhSKlJTQUZNTgorICAgICAgICAgICAgSUYoIEFCUyggQkVUQSApLkxULlNBRk1JTiApCisgICAgICQgICAgICAgICBHTyBUTyAxMAorKgorKiAgICAgICAgICAgTmV3IEJFVEEgaXMgYXQgbW9zdCAxLCBhdCBsZWFzdCBTQUZNSU4KKyoKKyAgICAgICAgICAgIFhOT1JNID0gRFpOUk0yKCBOLTEsIFgsIElOQ1ggKQorICAgICAgICAgICAgQUxQSEEgPSBEQ01QTFgoIEFMUEhSLCBBTFBISSApCisgICAgICAgICAgICBCRVRBID0gLVNJR04oIERMQVBZMyggQUxQSFIsIEFMUEhJLCBYTk9STSApLCBBTFBIUiApCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFRBVSA9IERDTVBMWCggKCBCRVRBLUFMUEhSICkgLyBCRVRBLCAtQUxQSEkgLyBCRVRBICkKKyAgICAgICAgIEFMUEhBID0gWkxBRElWKCBEQ01QTFgoIE9ORSApLCBBTFBIQS1CRVRBICkKKyAgICAgICAgIENBTEwgWlNDQUwoIE4tMSwgQUxQSEEsIFgsIElOQ1ggKQorKgorKiAgICAgICAgSWYgQUxQSEEgaXMgc3Vibm9ybWFsLCBpdCBtYXkgbG9zZSByZWxhdGl2ZSBhY2N1cmFjeQorKgorICAgICAgICAgRE8gMjAgSiA9IDEsIEtOVAorICAgICAgICAgICAgQkVUQSA9IEJFVEEqU0FGTUlOCisgMjAgICAgICBDT05USU5VRQorICAgICAgICAgQUxQSEEgPSBCRVRBCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpMQVJGRworKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9sYXBhY2svemxhcmZ0LmYgYi9sYXBhY2svemxhcmZ0LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MTUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay96bGFyZnQuZgpAQCAtMCwwICsxLDMyNyBAQAorKj4gXGJyaWVmIFxiIFpMQVJGVAorKgorKiAgPT09PT09PT09PT0gRE9DVU1FTlRBVElPTiA9PT09PT09PT09PQorKgorKiBPbmxpbmUgaHRtbCBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhdCAKKyogICAgICAgICAgICBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2V4cGxvcmUtaHRtbC8gCisqCisqPiBcaHRtbG9ubHkKKyo+IERvd25sb2FkIFpMQVJGVCArIGRlcGVuZGVuY2llcyAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnRnej9mb3JtYXQ9dGd6JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvemxhcmZ0LmYiPiAKKyo+IFtUR1pdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnppcD9mb3JtYXQ9emlwJmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvemxhcmZ0LmYiPiAKKyo+IFtaSVBdPC9hPiAKKyo+IDxhIGhyZWY9Imh0dHA6Ly93d3cubmV0bGliLm9yZy9jZ2ktYmluL25ldGxpYmZpbGVzLnR4dD9mb3JtYXQ9dHh0JmZpbGVuYW1lPS9sYXBhY2svbGFwYWNrX3JvdXRpbmUvemxhcmZ0LmYiPiAKKyo+IFtUWFRdPC9hPgorKj4gXGVuZGh0bWxvbmx5IAorKgorKiAgRGVmaW5pdGlvbjoKKyogID09PT09PT09PT09CisqCisqICAgICAgIFNVQlJPVVRJTkUgWkxBUkZUKCBESVJFQ1QsIFNUT1JFViwgTiwgSywgViwgTERWLCBUQVUsIFQsIExEVCApCisqIAorKiAgICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisqICAgICAgIENIQVJBQ1RFUiAgICAgICAgICBESVJFQ1QsIFNUT1JFVgorKiAgICAgICBJTlRFR0VSICAgICAgICAgICAgSywgTERULCBMRFYsIE4KKyogICAgICAgLi4KKyogICAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisqICAgICAgIENPTVBMRVgqMTYgICAgICAgICBUKCBMRFQsICogKSwgVEFVKCAqICksIFYoIExEViwgKiApCisqICAgICAgIC4uCisqICAKKyoKKyo+IFxwYXIgUHVycG9zZToKKyogID09PT09PT09PT09PT0KKyo+CisqPiBcdmVyYmF0aW0KKyo+CisqPiBaTEFSRlQgZm9ybXMgdGhlIHRyaWFuZ3VsYXIgZmFjdG9yIFQgb2YgYSBjb21wbGV4IGJsb2NrIHJlZmxlY3RvciBICisqPiBvZiBvcmRlciBuLCB3aGljaCBpcyBkZWZpbmVkIGFzIGEgcHJvZHVjdCBvZiBrIGVsZW1lbnRhcnkgcmVmbGVjdG9ycy4KKyo+CisqPiBJZiBESVJFQ1QgPSAnRicsIEggPSBIKDEpIEgoMikgLiAuIC4gSChrKSBhbmQgVCBpcyB1cHBlciB0cmlhbmd1bGFyOworKj4KKyo+IElmIERJUkVDVCA9ICdCJywgSCA9IEgoaykgLiAuIC4gSCgyKSBIKDEpIGFuZCBUIGlzIGxvd2VyIHRyaWFuZ3VsYXIuCisqPgorKj4gSWYgU1RPUkVWID0gJ0MnLCB0aGUgdmVjdG9yIHdoaWNoIGRlZmluZXMgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yCisqPiBIKGkpIGlzIHN0b3JlZCBpbiB0aGUgaS10aCBjb2x1bW4gb2YgdGhlIGFycmF5IFYsIGFuZAorKj4KKyo+ICAgIEggID0gIEkgLSBWICogVCAqIFYqKkgKKyo+CisqPiBJZiBTVE9SRVYgPSAnUicsIHRoZSB2ZWN0b3Igd2hpY2ggZGVmaW5lcyB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3IKKyo+IEgoaSkgaXMgc3RvcmVkIGluIHRoZSBpLXRoIHJvdyBvZiB0aGUgYXJyYXkgViwgYW5kCisqPgorKj4gICAgSCAgPSAgSSAtIFYqKkggKiBUICogVgorKj4gXGVuZHZlcmJhdGltCisqCisqICBBcmd1bWVudHM6CisqICA9PT09PT09PT09CisqCisqPiBccGFyYW1baW5dIERJUkVDVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBESVJFQ1QgaXMgQ0hBUkFDVEVSKjEKKyo+ICAgICAgICAgIFNwZWNpZmllcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9ycyBhcmUKKyo+ICAgICAgICAgIG11bHRpcGxpZWQgdG8gZm9ybSB0aGUgYmxvY2sgcmVmbGVjdG9yOgorKj4gICAgICAgICAgPSAnRic6IEggPSBIKDEpIEgoMikgLiAuIC4gSChrKSAoRm9yd2FyZCkKKyo+ICAgICAgICAgID0gJ0InOiBIID0gSChrKSAuIC4gLiBIKDIpIEgoMSkgKEJhY2t3YXJkKQorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBTVE9SRVYKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgU1RPUkVWIGlzIENIQVJBQ1RFUioxCisqPiAgICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSB2ZWN0b3JzIHdoaWNoIGRlZmluZSB0aGUgZWxlbWVudGFyeQorKj4gICAgICAgICAgcmVmbGVjdG9ycyBhcmUgc3RvcmVkIChzZWUgYWxzbyBGdXJ0aGVyIERldGFpbHMpOgorKj4gICAgICAgICAgPSAnQyc6IGNvbHVtbndpc2UKKyo+ICAgICAgICAgID0gJ1InOiByb3d3aXNlCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIE4KKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgTiBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIGJsb2NrIHJlZmxlY3RvciBILiBOID49IDAuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIEsKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgSyBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIHRyaWFuZ3VsYXIgZmFjdG9yIFQgKD0gdGhlIG51bWJlciBvZgorKj4gICAgICAgICAgZWxlbWVudGFyeSByZWZsZWN0b3JzKS4gSyA+PSAxLgorKj4gXGVuZHZlcmJhdGltCisqPgorKj4gXHBhcmFtW2luXSBWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFYgaXMgQ09NUExFWCoxNiBhcnJheSwgZGltZW5zaW9uCisqPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTERWLEspIGlmIFNUT1JFViA9ICdDJworKj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExEVixOKSBpZiBTVE9SRVYgPSAnUicKKyo+ICAgICAgICAgIFRoZSBtYXRyaXggVi4gU2VlIGZ1cnRoZXIgZGV0YWlscy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gTERWCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIExEViBpcyBJTlRFR0VSCisqPiAgICAgICAgICBUaGUgbGVhZGluZyBkaW1lbnNpb24gb2YgdGhlIGFycmF5IFYuCisqPiAgICAgICAgICBJZiBTVE9SRVYgPSAnQycsIExEViA+PSBtYXgoMSxOKTsgaWYgU1RPUkVWID0gJ1InLCBMRFYgPj0gSy4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtpbl0gVEFVCisqPiBcdmVyYmF0aW0KKyo+ICAgICAgICAgIFRBVSBpcyBDT01QTEVYKjE2IGFycmF5LCBkaW1lbnNpb24gKEspCisqPiAgICAgICAgICBUQVUoaSkgbXVzdCBjb250YWluIHRoZSBzY2FsYXIgZmFjdG9yIG9mIHRoZSBlbGVtZW50YXJ5CisqPiAgICAgICAgICByZWZsZWN0b3IgSChpKS4KKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyo+IFxwYXJhbVtvdXRdIFQKKyo+IFx2ZXJiYXRpbQorKj4gICAgICAgICAgVCBpcyBDT01QTEVYKjE2IGFycmF5LCBkaW1lbnNpb24gKExEVCxLKQorKj4gICAgICAgICAgVGhlIGsgYnkgayB0cmlhbmd1bGFyIGZhY3RvciBUIG9mIHRoZSBibG9jayByZWZsZWN0b3IuCisqPiAgICAgICAgICBJZiBESVJFQ1QgPSAnRicsIFQgaXMgdXBwZXIgdHJpYW5ndWxhcjsgaWYgRElSRUNUID0gJ0InLCBUIGlzCisqPiAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyLiBUaGUgcmVzdCBvZiB0aGUgYXJyYXkgaXMgbm90IHVzZWQuCisqPiBcZW5kdmVyYmF0aW0KKyo+CisqPiBccGFyYW1baW5dIExEVAorKj4gXHZlcmJhdGltCisqPiAgICAgICAgICBMRFQgaXMgSU5URUdFUgorKj4gICAgICAgICAgVGhlIGxlYWRpbmcgZGltZW5zaW9uIG9mIHRoZSBhcnJheSBULiBMRFQgPj0gSy4KKyo+IFxlbmR2ZXJiYXRpbQorKgorKiAgQXV0aG9yczoKKyogID09PT09PT09CisqCisqPiBcYXV0aG9yIFVuaXYuIG9mIFRlbm5lc3NlZSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSAKKyo+IFxhdXRob3IgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIAorKj4gXGF1dGhvciBOQUcgTHRkLiAKKyoKKyo+IFxkYXRlIEFwcmlsIDIwMTIKKyoKKyo+IFxpbmdyb3VwIGNvbXBsZXgxNk9USEVSYXV4aWxpYXJ5CisqCisqPiBccGFyIEZ1cnRoZXIgRGV0YWlsczoKKyogID09PT09PT09PT09PT09PT09PT09PQorKj4KKyo+IFx2ZXJiYXRpbQorKj4KKyo+ICBUaGUgc2hhcGUgb2YgdGhlIG1hdHJpeCBWIGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUgdmVjdG9ycyB3aGljaCBkZWZpbmUKKyo+ICB0aGUgSChpKSBpcyBiZXN0IGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aXRoIG4gPSA1IGFuZAorKj4gIGsgPSAzLiBUaGUgZWxlbWVudHMgZXF1YWwgdG8gMSBhcmUgbm90IHN0b3JlZC4KKyo+CisqPiAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0YnIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCAgMSAgICAgICApICAgICAgICAgICAgICAgICBWID0gKCAgMSB2MSB2MSB2MSB2MSApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxICAxICAgICkgICAgICAgICAgICAgICAgICAgICAoICAgICAxIHYyIHYyIHYyICkKKyo+ICAgICAgICAgICAgICAgICAgICggdjEgdjIgIDEgKSAgICAgICAgICAgICAgICAgICAgICggICAgICAgIDEgdjMgdjMgKQorKj4gICAgICAgICAgICAgICAgICAgKCB2MSB2MiB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkKKyo+CisqPiAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnQyc6ICAgICAgICAgRElSRUNUID0gJ0InIGFuZCBTVE9SRVYgPSAnUic6CisqPgorKj4gICAgICAgICAgICAgICBWID0gKCB2MSB2MiB2MyApICAgICAgICAgICAgICAgICBWID0gKCB2MSB2MSAgMSAgICAgICApCisqPiAgICAgICAgICAgICAgICAgICAoIHYxIHYyIHYzICkgICAgICAgICAgICAgICAgICAgICAoIHYyIHYyIHYyICAxICAgICkKKyo+ICAgICAgICAgICAgICAgICAgICggIDEgdjIgdjMgKSAgICAgICAgICAgICAgICAgICAgICggdjMgdjMgdjMgdjMgIDEgKQorKj4gICAgICAgICAgICAgICAgICAgKCAgICAgMSB2MyApCisqPiAgICAgICAgICAgICAgICAgICAoICAgICAgICAxICkKKyo+IFxlbmR2ZXJiYXRpbQorKj4KKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgU1VCUk9VVElORSBaTEFSRlQoIERJUkVDVCwgU1RPUkVWLCBOLCBLLCBWLCBMRFYsIFRBVSwgVCwgTERUICkKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjQuMSkgLS0KKyogIC0tIExBUEFDSyBpcyBhIHNvZnR3YXJlIHBhY2thZ2UgcHJvdmlkZWQgYnkgVW5pdi4gb2YgVGVubmVzc2VlLCAgICAtLQorKiAgLS0gVW5pdi4gb2YgQ2FsaWZvcm5pYSBCZXJrZWxleSwgVW5pdi4gb2YgQ29sb3JhZG8gRGVudmVyIGFuZCBOQUcgTHRkLi4tLQorKiAgICAgQXByaWwgMjAxMgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ0hBUkFDVEVSICAgICAgICAgIERJUkVDVCwgU1RPUkVWCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSywgTERULCBMRFYsIE4KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBUKCBMRFQsICogKSwgVEFVKCAqICksIFYoIExEViwgKiApCisqICAgICAuLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgT05FLCBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBPTkUgPSAoIDEuMEQrMCwgMC4wRCswICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWkVSTyA9ICggMC4wRCswLCAwLjBEKzAgKSApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEosIFBSRVZMQVNUViwgTEFTVFYKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpHRU1WLCBaTEFDR1YsIFpUUk1WCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNBTUUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlCisqCisgICAgICBJRiggTi5FUS4wICkKKyAgICAgJCAgIFJFVFVSTgorKgorICAgICAgSUYoIExTQU1FKCBESVJFQ1QsICdGJyApICkgVEhFTgorICAgICAgICAgUFJFVkxBU1RWID0gTgorICAgICAgICAgRE8gSSA9IDEsIEsKKyAgICAgICAgICAgIFBSRVZMQVNUViA9IE1BWCggUFJFVkxBU1RWLCBJICkKKyAgICAgICAgICAgIElGKCBUQVUoIEkgKS5FUS5aRVJPICkgVEhFTgorKgorKiAgICAgICAgICAgICAgSChpKSAgPSAgSQorKgorICAgICAgICAgICAgICAgRE8gSiA9IDEsIEkKKyAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgRUxTRQorKgorKiAgICAgICAgICAgICAgZ2VuZXJhbCBjYXNlCisqCisgICAgICAgICAgICAgICBJRiggTFNBTUUoIFNUT1JFViwgJ0MnICkgKSBUSEVOCisqICAgICAgICAgICAgICAgICBTa2lwIGFueSB0cmFpbGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgIERPIExBU1RWID0gTiwgSSsxLCAtMQorICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIExBU1RWLCBJICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgRE8gSiA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogQ09OSkcoIFYoIEkgLCBKICkgKQorICAgICAgICAgICAgICAgICAgRU5EIERPICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBKID0gTUlOKCBMQVNUViwgUFJFVkxBU1RWICkKKyoKKyogICAgICAgICAgICAgICAgIFQoMTppLTEsaSkgOj0gLSB0YXUoaSkgKiBWKGk6aiwxOmktMSkqKkggKiBWKGk6aixpKQorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNViggJ0Nvbmp1Z2F0ZSB0cmFuc3Bvc2UnLCBKLUksIEktMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIC1UQVUoIEkgKSwgViggSSsxLCAxICksIExEViwgCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBWKCBJKzEsIEkgKSwgMSwgT05FLCBUKCAxLCBJICksIDEgKQorICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgU2tpcCBhbnkgdHJhaWxpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IE4sIEkrMSwgLTEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBWKCBJLCBMQVNUViApLk5FLlpFUk8gKSBFWElUCisgICAgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIERPIEogPSAxLCBJLTEKKyAgICAgICAgICAgICAgICAgICAgIFQoIEosIEkgKSA9IC1UQVUoIEkgKSAqIFYoIEogLCBJICkKKyAgICAgICAgICAgICAgICAgIEVORCBETyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgSiA9IE1JTiggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IC0gdGF1KGkpICogVigxOmktMSxpOmopICogVihpLGk6aikqKkgKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdOJywgJ0MnLCBJLTEsIDEsIEotSSwgLVRBVSggSSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgViggMSwgSSsxICksIExEViwgViggSSwgSSsxICksIExEViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgVCggMSwgSSApLCBMRFQgKSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBUKDE6aS0xLGkpIDo9IFQoMTppLTEsMTppLTEpICogVCgxOmktMSxpKQorKgorICAgICAgICAgICAgICAgQ0FMTCBaVFJNViggJ1VwcGVyJywgJ05vIHRyYW5zcG9zZScsICdOb24tdW5pdCcsIEktMSwgVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEVCwgVCggMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgIFQoIEksIEkgKSA9IFRBVSggSSApCisgICAgICAgICAgICAgICBJRiggSS5HVC4xICkgVEhFTgorICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTUFYKCBQUkVWTEFTVFYsIExBU1RWICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIFBSRVZMQVNUViA9IExBU1RWCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBETworICAgICAgRUxTRQorICAgICAgICAgUFJFVkxBU1RWID0gMQorICAgICAgICAgRE8gSSA9IEssIDEsIC0xCisgICAgICAgICAgICBJRiggVEFVKCBJICkuRVEuWkVSTyApIFRIRU4KKyoKKyogICAgICAgICAgICAgIEgoaSkgID0gIEkKKyoKKyAgICAgICAgICAgICAgIERPIEogPSBJLCBLCisgICAgICAgICAgICAgICAgICBUKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgIEVMU0UKKyoKKyogICAgICAgICAgICAgIGdlbmVyYWwgY2FzZQorKgorICAgICAgICAgICAgICAgSUYoIEkuTFQuSyApIFRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBMU0FNRSggU1RPUkVWLCAnQycgKSApIFRIRU4KKyogICAgICAgICAgICAgICAgICAgIFNraXAgYW55IGxlYWRpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIExBU1RWLCBJICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgICAgRE8gSiA9IEkrMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogQ09OSkcoIFYoIE4tSytJICwgSiApICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgSiA9IE1BWCggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICAgICBUKGkrMTprLGkpID0gLXRhdShpKSAqIFYoajpuLWsraSxpKzE6aykqKkggKiBWKGo6bi1rK2ksaSkKKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgWkdFTVYoICdDb25qdWdhdGUgdHJhbnNwb3NlJywgTi1LK0ktSiwgSy1JLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgLVRBVSggSSApLCBWKCBKLCBJKzEgKSwgTERWLCBWKCBKLCBJICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBPTkUsIFQoIEkrMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgIFNraXAgYW55IGxlYWRpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICAgICBETyBMQVNUViA9IDEsIEktMQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFYoIEksIExBU1RWICkuTkUuWkVSTyApIEVYSVQKKyAgICAgICAgICAgICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgICAgRE8gSiA9IEkrMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgVCggSiwgSSApID0gLVRBVSggSSApICogViggSiwgTi1LK0kgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIERPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgSiA9IE1BWCggTEFTVFYsIFBSRVZMQVNUViApCisqCisqICAgICAgICAgICAgICAgICAgICBUKGkrMTprLGkpID0gLXRhdShpKSAqIFYoaSsxOmssajpuLWsraSkgKiBWKGksajpuLWsraSkqKkgKKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgWkdFTU0oICdOJywgJ0MnLCBLLUksIDEsIE4tSytJLUosIC1UQVUoIEkgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFYoIEkrMSwgSiApLCBMRFYsIFYoIEksIEogKSwgTERWLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBUKCBJKzEsIEkgKSwgTERUICkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgVChpKzE6ayxpKSA6PSBUKGkrMTprLGkrMTprKSAqIFQoaSsxOmssaSkKKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgWlRSTVYoICdMb3dlcicsICdObyB0cmFuc3Bvc2UnLCAnTm9uLXVuaXQnLCBLLUksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUKCBJKzEsIEkrMSApLCBMRFQsIFQoIEkrMSwgSSApLCAxICkKKyAgICAgICAgICAgICAgICAgIElGKCBJLkdULjEgKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICBQUkVWTEFTVFYgPSBNSU4oIFBSRVZMQVNUViwgTEFTVFYgKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgUFJFVkxBU1RWID0gTEFTVFYKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBUKCBJLCBJICkgPSBUQVUoIEkgKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTkQgRE8KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkxBUkZUCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvQ01ha2VMaXN0cy50eHQgYi9zY3JpcHRzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWE2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorZ2V0X3Byb3BlcnR5KEVJR0VOX1RFU1RTX0xJU1QgR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RTX0xJU1QpCitjb25maWd1cmVfZmlsZShidWlsZHRlc3RzLmluICR7Q01BS0VfQklOQVJZX0RJUn0vYnVpbGR0ZXN0cy5zaCBAT05MWSkKKworY29uZmlndXJlX2ZpbGUoY2hlY2suaW4gJHtDTUFLRV9CSU5BUllfRElSfS9jaGVjay5zaCBDT1BZT05MWSkKK2NvbmZpZ3VyZV9maWxlKGRlYnVnLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZGVidWcuc2ggQ09QWU9OTFkpCitjb25maWd1cmVfZmlsZShyZWxlYXNlLmluICR7Q01BS0VfQklOQVJZX0RJUn0vcmVsZWFzZS5zaCBDT1BZT05MWSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYnVpbGR0ZXN0cy5pbiBiL3NjcmlwdHMvYnVpbGR0ZXN0cy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjZkNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9idWlsZHRlc3RzLmluCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFtbICQjICE9IDEgfHwgJDEgPT0gKmhlbHAgXV0KK3RoZW4KKyAgZWNobyAidXNhZ2U6ICQwIHJlZ2V4cCIKKyAgZWNobyAiICBCdWlsZHMgdGVzdHMgbWF0Y2hpbmcgdGhlIHJlZ2V4cC4iCisgIGVjaG8gIiAgVGhlIEVJR0VOX01BS0VfQVJHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbGxvd3MgdG8gcGFzcyBhcmdzIHRvICdtYWtlJy4iCisgIGVjaG8gIiAgICBGb3IgZXhhbXBsZSwgdG8gbGF1bmNoIDUgY29uY3VycmVudCBidWlsZHMsIHVzZSBFSUdFTl9NQUtFX0FSR1M9Jy1qNSciCisgIGV4aXQgMAorZmkKKworVEVTVFNMSVNUPSJARUlHRU5fVEVTVFNfTElTVEAiCit0YXJnZXRzX3RvX21ha2U9YGVjaG8gIiRURVNUU0xJU1QiIHwgZWdyZXAgIiQxIiB8IHhhcmdzIGVjaG9gCisKK2lmIFsgLW4gIiR7RUlHRU5fTUFLRV9BUkdTOit4fSIgXQordGhlbgorICBAQ01BS0VfTUFLRV9QUk9HUkFNQCAkdGFyZ2V0c190b19tYWtlICR7RUlHRU5fTUFLRV9BUkdTfQorZWxzZQorICBAQ01BS0VfTUFLRV9QUk9HUkFNQCAkdGFyZ2V0c190b19tYWtlIEBFSUdFTl9URVNUX0JVSUxEX0ZMQUdTQAorZmkKK2V4aXQgJD8KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jZGFzaHRlc3RpbmcuY21ha2UuaW4gYi9zY3JpcHRzL2NkYXNodGVzdGluZy5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNmNTMzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jZGFzaHRlc3RpbmcuY21ha2UuaW4KQEAgLTAsMCArMSw0OSBAQAorCitzZXQoQ1RFU1RfU09VUkNFX0RJUkVDVE9SWSAgIkBDTUFLRV9TT1VSQ0VfRElSQCIpCitzZXQoQ1RFU1RfQklOQVJZX0RJUkVDVE9SWSAgIkBDTUFLRV9CSU5BUllfRElSQCIpCitzZXQoQ1RFU1RfQ01BS0VfR0VORVJBVE9SICAgIkBDTUFLRV9HRU5FUkFUT1JAIikKK3NldChDVEVTVF9CVUlMRF9OQU1FICAgICAgICAiQEJVSUxETkFNRUAiKQorc2V0KENURVNUX1NJVEUgICAgICAgICAgICAgICJAU0lURUAiKQorCitzZXQoTU9ERUwgRXhwZXJpbWVudGFsKQoraWYoJHtDVEVTVF9TQ1JJUFRfQVJHfSBNQVRDSEVTIE5pZ2h0bHkpCisgIHNldChNT0RFTCBOaWdodGx5KQorZWxzZWlmKCR7Q1RFU1RfU0NSSVBUX0FSR30gTUFUQ0hFUyBDb250aW51b3VzKQorICBzZXQoTU9ERUwgQ29udGludW91cykKK2VuZGlmKCkKKworZmluZF9wcm9ncmFtKENURVNUX0hHX0NPTU1BTkQgTkFNRVMgaGcpCitzZXQoQ1RFU1RfVVBEQVRFX0NPTU1BTkQgIiR7Q1RFU1RfSEdfQ09NTUFORH0iKQorCitjdGVzdF9zdGFydCgke01PREVMfSAke0NURVNUX1NPVVJDRV9ESVJFQ1RPUll9ICR7Q1RFU1RfQklOQVJZX0RJUkVDVE9SWX0pCisKK2N0ZXN0X3VwZGF0ZShTT1VSQ0UgIiR7Q1RFU1RfU09VUkNFX0RJUkVDVE9SWX0iKQorY3Rlc3Rfc3VibWl0KFBBUlRTIFVwZGF0ZSBOb3RlcykKKworIyB0byBnZXQgQ1RFU1RfUFJPSkVDVF9TVUJQUk9KRUNUUyBkZWZpbml0aW9uOgoraW5jbHVkZSgiJHtDVEVTVF9TT1VSQ0VfRElSRUNUT1JZfS9DVGVzdENvbmZpZy5jbWFrZSIpCisKK2ZvcmVhY2goc3VicHJvamVjdCAke0NURVNUX1BST0pFQ1RfU1VCUFJPSkVDVFN9KQorICBtZXNzYWdlKCIiKQorICBtZXNzYWdlKCJQcm9jZXNzICR7c3VicHJvamVjdH0iKQorICAKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBTdWJQcm9qZWN0ICR7c3VicHJvamVjdH0pCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgTGFiZWwgJHtzdWJwcm9qZWN0fSkKKworICBjdGVzdF9jb25maWd1cmUoQlVJTEQgJHtDVEVTVF9CSU5BUllfRElSRUNUT1JZfSBTT1VSQ0UgJHtDVEVTVF9TT1VSQ0VfRElSRUNUT1JZfSApCisgIGN0ZXN0X3N1Ym1pdChQQVJUUyBDb25maWd1cmUpCisKKyAgc2V0KENURVNUX0JVSUxEX1RBUkdFVCAiQnVpbGQke3N1YnByb2plY3R9IikKKyAgbWVzc2FnZSgiQnVpbGQgJHtDVEVTVF9CVUlMRF9UQVJHRVR9IikKKyAgY3Rlc3RfYnVpbGQoQlVJTEQgIiR7Q1RFU1RfQklOQVJZX0RJUkVDVE9SWX0iIEFQUEVORCkKKyAgIyBidWlsZHMgdGFyZ2V0ICR7Q1RFU1RfQlVJTERfVEFSR0VUfQorICBjdGVzdF9zdWJtaXQoUEFSVFMgQnVpbGQpCisKKyAgY3Rlc3RfdGVzdChCVUlMRCAiJHtDVEVTVF9CSU5BUllfRElSRUNUT1JZfSIgSU5DTFVERV9MQUJFTCAiJHtzdWJwcm9qZWN0fSIgKQorICAjIHJ1bnMgb25seSB0ZXN0cyB0aGF0IGhhdmUgYSBMQUJFTFMgcHJvcGVydHkgbWF0Y2hpbmcgIiR7c3VicHJvamVjdH0iCisgIAorICBjdGVzdF9jb3ZlcmFnZShCVUlMRCAiJHtDVEVTVF9CSU5BUllfRElSRUNUT1JZfSIgTEFCRUxTICIke3N1YnByb2plY3R9IiApCisgIAorICBjdGVzdF9zdWJtaXQoUEFSVFMgVGVzdCkKKyAgCitlbmRmb3JlYWNoKCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2suaW4gYi9zY3JpcHRzL2NoZWNrLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3MTdlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NoZWNrLmluCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9iYXNoCisjIGNoZWNrIDogc2hvcnRoYW5kIGZvciBtYWtlIGFuZCBjdGVzdCAtUgorCitpZiBbWyAkIyAhPSAxIHx8ICQxID09ICpoZWxwIF1dCit0aGVuCisgIGVjaG8gInVzYWdlOiAkMCByZWdleHAiCisgIGVjaG8gIiAgQnVpbGRzIGFuZCBydW5zIHRlc3RzIG1hdGNoaW5nIHRoZSByZWdleHAuIgorICBlY2hvICIgIFRoZSBFSUdFTl9NQUtFX0FSR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxsb3dzIHRvIHBhc3MgYXJncyB0byAnbWFrZScuIgorICBlY2hvICIgICAgRm9yIGV4YW1wbGUsIHRvIGxhdW5jaCA1IGNvbmN1cnJlbnQgYnVpbGRzLCB1c2UgRUlHRU5fTUFLRV9BUkdTPSctajUnIgorICBlY2hvICIgIFRoZSBFSUdFTl9DVEVTVF9BUkdTIGVudmlyb25tZW50IHZhcmlhYmxlIGFsbG93cyB0byBwYXNzIGFyZ3MgdG8gJ2N0ZXN0Jy4iCisgIGVjaG8gIiAgICBGb3IgZXhhbXBsZSwgd2l0aCBDVGVzdCAyLjgsIHlvdSBjYW4gdXNlIEVJR0VOX0NURVNUX0FSR1M9Jy1qNScuIgorICBleGl0IDAKK2ZpCisKK2lmIFsgLW4gIiR7RUlHRU5fQ1RFU1RfQVJHUzoreH0iIF0KK3RoZW4KKyAgLi9idWlsZHRlc3RzLnNoICIkMSIgJiYgY3Rlc3QgLVIgIiQxIiAke0VJR0VOX0NURVNUX0FSR1N9CitlbHNlCisgIC4vYnVpbGR0ZXN0cy5zaCAiJDEiICYmIGN0ZXN0IC1SICIkMSIKK2ZpCitleGl0ICQ/CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RlYnVnLmluIGIvc2NyaXB0cy9kZWJ1Zy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMzM5ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kZWJ1Zy5pbgpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCitjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9laWdlbl9nZW5fY3JlZGl0cy5jcHAgYi9zY3JpcHRzL2VpZ2VuX2dlbl9jcmVkaXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmU4MTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9laWdlbl9nZW5fY3JlZGl0cy5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaW5lIHRoYXQgbWF5IGNvbnRhaW4gYSBuYW1lIGFuZC9vciBlbWFpbCBhZGRyZXNzLAorLy8gYW5kIHJldHVybnMganVzdCB0aGUgbmFtZSwgd2hpbGUgZml4aW5nIHRoZSAiYmFkIGNhc2VzIi4KK3N0ZDo6c3RyaW5nIGNvbnRyaWJ1dG9yX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUpCit7CisgIHN0cmluZyByZXN1bHQ7CisKKyAgLy8gbGV0J3MgZmlyc3QgdGFrZSBjYXJlIG9mIHRoZSBjYXNlIG9mIGlzb2xhdGVkIGVtYWlsIGFkZHJlc3NlcywgbGlrZQorICAvLyAidXNlckBsb2NhbGhvc3QubG9jYWxkb21haW4iIGVudHJpZXMKKyAgaWYobGluZS5maW5kKCJtYXJrYkBsb2NhbGhvc3QubG9jYWxkb21haW4iKSAhPSBzdHJpbmc6Om5wb3MpCisgIHsKKyAgICByZXR1cm4gIk1hcmsgQm9yZ2VyZGluZyI7CisgIH0KKworICBpZihsaW5lLmZpbmQoImtheWhtYW5AY29udGFjdC5pbnRyYS5jZWEuZnIiKSAhPSBzdHJpbmc6Om5wb3MpCisgIHsKKyAgICByZXR1cm4gIkd1aWxsYXVtZSBTYXVwaW4iOworICB9CisKKyAgLy8gZnJvbSB0aGVyZSBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgZW50cnkgb2YgdGhlIGZvcm0KKyAgLy8gZWl0aGVyOgorICAvLyAgIEJsYSBibGkgQmx1cnAKKyAgLy8gb3I6CisgIC8vICAgQmxhIGJsaSBCbHVycCA8YmJsdXJwQGVtYWlsLmNvbT4KKyAgCisgIHNpemVfdCBwb3NpdGlvbl9vZl9lbWFpbF9hZGRyZXNzID0gbGluZS5maW5kX2ZpcnN0X29mKCc8Jyk7CisgIGlmKHBvc2l0aW9uX29mX2VtYWlsX2FkZHJlc3MgIT0gc3RyaW5nOjpucG9zKQorICB7CisgICAgLy8gdGhlcmUgaXMgYW4gZS1tYWlsIGFkZHJlc3MgaW4gPC4uLj4uCisgICAgCisgICAgLy8gSGF1a2Ugb25jZSBjb21taXR0ZWQgYXMgIkpvaG4gU21pdGgiLCBmaXggdGhhdC4KKyAgICBpZihsaW5lLmZpbmQoImhhdWtlLmhlaWJlbCIpICE9IHN0cmluZzo6bnBvcykKKyAgICAgIHJlc3VsdCA9ICJIYXVrZSBIZWliZWwiOworICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBqdXN0IHJlbW92ZSB0aGUgZS1tYWlsIGFkZHJlc3MKKyAgICAgIHJlc3VsdCA9IGxpbmUuc3Vic3RyKDAsIHBvc2l0aW9uX29mX2VtYWlsX2FkZHJlc3MpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyB0aGVyZSBpcyBubyBlLW1haWwgYWRkcmVzcyBpbiA8Li4uPi4KKyAgICAKKyAgICBpZihsaW5lLmZpbmQoImNvbnZlcnQtcmVwbyIpICE9IHN0cmluZzo6bnBvcykKKyAgICAgIHJlc3VsdCA9ICIiOworICAgIGVsc2UKKyAgICAgIHJlc3VsdCA9IGxpbmU7CisgIH0KKworICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgIHNpemVfdCBsZW5ndGggPSByZXN1bHQubGVuZ3RoKCk7CisgIHdoaWxlKGxlbmd0aCA+PSAxICYmIHJlc3VsdFtsZW5ndGgtMV0gPT0gJyAnKSByZXN1bHQuZXJhc2UoLS1sZW5ndGgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHBhcnNlcyBoZyBjaHVybiBvdXRwdXQgdG8gZ2VuZXJhdGUgYSBjb250cmlidXRvcnMgbWFwLgorbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIG1hcDxzdHJpbmcsaW50PiBjb250cmlidXRvcnNfbWFwOworCisgIHN0cmluZyBsaW5lOworICBpZnN0cmVhbSBjaHVybl9vdXQ7CisgIGNodXJuX291dC5vcGVuKGZpbGVuYW1lLCBpb3M6OmluKTsKKyAgd2hpbGUoIWdldGxpbmUoY2h1cm5fb3V0LGxpbmUpLmVvZigpKQorICB7CisgICAgLy8gcmVtb3ZlIHRoZSBoaXN0b2dyYW1zICIqKioqKioiIHRoYXQgaGcgY2h1cm4gbWF5IGRyYXcgYXQgdGhlIGVuZCBvZiBzb21lIGxpbmVzCisgICAgc2l6ZV90IGZpcnN0X3N0YXIgPSBsaW5lLmZpbmRfZmlyc3Rfb2YoJyonKTsKKyAgICBpZihmaXJzdF9zdGFyICE9IHN0cmluZzo6bnBvcykgbGluZS5lcmFzZShmaXJzdF9zdGFyKTsKKyAgICAKKyAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgICAgc2l6ZV90IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7CisgICAgd2hpbGUobGVuZ3RoID49IDEgJiYgbGluZVtsZW5ndGgtMV0gPT0gJyAnKSBsaW5lLmVyYXNlKC0tbGVuZ3RoKTsKKworICAgIC8vIG5vdyB0aGUgbGFzdCBzcGFjZSBpbmRpY2F0ZXMgd2hlcmUgdGhlIG51bWJlciBzdGFydHMKKyAgICBzaXplX3QgbGFzdF9zcGFjZSA9IGxpbmUuZmluZF9sYXN0X29mKCcgJyk7CisgICAgCisgICAgLy8gZ2V0IHRoZSBudW1iZXIgKG9mIGNoYW5nZXNldHMgb3Igb2YgbW9kaWZpZWQgbGluZXMgZm9yIGVhY2ggY29udHJpYnV0b3IpCisgICAgaW50IG51bWJlcjsKKyAgICBpc3RyaW5nc3RyZWFtKGxpbmUuc3Vic3RyKGxhc3Rfc3BhY2UrMSkpID4+IG51bWJlcjsKKworICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgY29udHJpYnV0b3IKKyAgICBsaW5lLmVyYXNlKGxhc3Rfc3BhY2UpOyAgICAKKyAgICBzdHJpbmcgbmFtZSA9IGNvbnRyaWJ1dG9yX25hbWUobGluZSk7CisgICAgCisgICAgbWFwPHN0cmluZyxpbnQ+OjppdGVyYXRvciBpdCA9IGNvbnRyaWJ1dG9yc19tYXAuZmluZChuYW1lKTsKKyAgICAvLyBpZiBuZXcgY29udHJpYnV0b3IsIGluc2VydAorICAgIGlmKGl0ID09IGNvbnRyaWJ1dG9yc19tYXAuZW5kKCkpCisgICAgICBjb250cmlidXRvcnNfbWFwLmluc2VydChwYWlyPHN0cmluZyxpbnQ+KG5hbWUsIG51bWJlcikpOworICAgIC8vIGlmIGR1cGxpY2F0ZSwganVzdCBhZGQgdGhlIG51bWJlcgorICAgIGVsc2UKKyAgICAgIGl0LT5zZWNvbmQgKz0gbnVtYmVyOworICB9CisgIGNodXJuX291dC5jbG9zZSgpOworCisgIHJldHVybiBjb250cmlidXRvcnNfbWFwOworfQorCisvLyBmaW5kIHRoZSBsYXN0IG5hbWUsIGkuZS4gdGhlIGxhc3Qgd29yZC4KKy8vIGZvciAidmFuIGRlbiBTY2hibGluZyIgdHlwZXMgb2YgbGFzdCBuYW1lcywgdGhhdCdzIG5vdCBhIHByb2JsZW0sIHRoYXQncyBhY3R1YWxseSB3aGF0IHdlIHdhbnQuCitzdHJpbmcgbGFzdG5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKQoreworICBzaXplX3QgbGFzdF9zcGFjZSA9IG5hbWUuZmluZF9sYXN0X29mKCcgJyk7CisgIGlmKGxhc3Rfc3BhY2UgPj0gbmFtZS5sZW5ndGgoKS0xKSByZXR1cm4gbmFtZTsKKyAgZWxzZSByZXR1cm4gbmFtZS5zdWJzdHIobGFzdF9zcGFjZSsxKTsKK30KKworc3RydWN0IGNvbnRyaWJ1dG9yCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgY2hhbmdlZGxpbmVzOworICBpbnQgY2hhbmdlc2V0czsKKyAgc3RyaW5nIHVybDsKKyAgc3RyaW5nIG1pc2M7CisgIAorICBjb250cmlidXRvcigpIDogY2hhbmdlZGxpbmVzKDApLCBjaGFuZ2VzZXRzKDApIHt9CisgIAorICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IGNvbnRyaWJ1dG9yJiBvdGhlcikKKyAgeworICAgIHJldHVybiBsYXN0bmFtZShuYW1lKS5jb21wYXJlKGxhc3RuYW1lKG90aGVyLm5hbWUpKSA8IDA7CisgIH0KK307CisKK3ZvaWQgYWRkX29ubGluZV9pbmZvX2ludG9fY29udHJpYnV0b3JzX2xpc3QobGlzdDxjb250cmlidXRvcj4mIGNvbnRyaWJ1dG9yc19saXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgc3RyaW5nIGxpbmU7CisgIGlmc3RyZWFtIG9ubGluZV9pbmZvOworICBvbmxpbmVfaW5mby5vcGVuKGZpbGVuYW1lLCBpb3M6OmluKTsKKyAgd2hpbGUoIWdldGxpbmUob25saW5lX2luZm8sbGluZSkuZW9mKCkpCisgIHsKKyAgICBzdHJpbmcgaGduYW1lLCByZWFsbmFtZSwgdXJsLCBtaXNjOworICAgIAorICAgIHNpemVfdCBsYXN0X2JhciA9IGxpbmUuZmluZF9sYXN0X29mKCd8Jyk7CisgICAgaWYobGFzdF9iYXIgPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICBpZihsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpCisgICAgICBtaXNjID0gbGluZS5zdWJzdHIobGFzdF9iYXIrMSk7CisgICAgbGluZS5lcmFzZShsYXN0X2Jhcik7CisgICAgCisgICAgbGFzdF9iYXIgPSBsaW5lLmZpbmRfbGFzdF9vZignfCcpOworICAgIGlmKGxhc3RfYmFyID09IHN0cmluZzo6bnBvcykgY29udGludWU7CisgICAgaWYobGFzdF9iYXIgPCBsaW5lLmxlbmd0aCgpKQorICAgICAgdXJsID0gbGluZS5zdWJzdHIobGFzdF9iYXIrMSk7CisgICAgbGluZS5lcmFzZShsYXN0X2Jhcik7CisKKyAgICBsYXN0X2JhciA9IGxpbmUuZmluZF9sYXN0X29mKCd8Jyk7CisgICAgaWYobGFzdF9iYXIgPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICBpZihsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpCisgICAgICByZWFsbmFtZSA9IGxpbmUuc3Vic3RyKGxhc3RfYmFyKzEpOworICAgIGxpbmUuZXJhc2UobGFzdF9iYXIpOworCisgICAgaGduYW1lID0gbGluZTsKKyAgICAKKyAgICAvLyByZW1vdmUgdGhlIGV4YW1wbGUgbGluZQorICAgIGlmKGhnbmFtZS5maW5kKCJNZXJjdXJpYWxOYW1lIikgIT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICAKKyAgICBsaXN0PGNvbnRyaWJ1dG9yPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKGl0PWNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0ICE9IGNvbnRyaWJ1dG9yc19saXN0LmVuZCgpICYmIGl0LT5uYW1lICE9IGhnbmFtZTsgKytpdCkKKyAgICB7fQorICAgIAorICAgIGlmKGl0ID09IGNvbnRyaWJ1dG9yc19saXN0LmVuZCgpKQorICAgIHsKKyAgICAgIGNvbnRyaWJ1dG9yIGM7CisgICAgICBjLm5hbWUgPSByZWFsbmFtZTsKKyAgICAgIGMudXJsID0gdXJsOworICAgICAgYy5taXNjID0gbWlzYzsKKyAgICAgIGNvbnRyaWJ1dG9yc19saXN0LnB1c2hfYmFjayhjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGl0LT5uYW1lID0gcmVhbG5hbWU7CisgICAgICBpdC0+dXJsID0gdXJsOworICAgICAgaXQtPm1pc2MgPSBtaXNjOworICAgIH0KKyAgfQorfQorCitpbnQgbWFpbigpCit7CisgIC8vIHBhcnNlIHRoZSBoZyBjaHVybiBvdXRwdXQgZmlsZXMKKyAgbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZWRsaW5lcy5vdXQiKTsKKyAgLy9tYXA8c3RyaW5nLGludD4gY29udHJpYnV0b3JzX21hcF9mb3JfY2hhbmdlc2V0cyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZXNldHMub3V0Iik7CisgIAorICAvLyBtZXJnZSBpbnRvIHRoZSBjb250cmlidXRvcnMgbGlzdAorICBsaXN0PGNvbnRyaWJ1dG9yPiBjb250cmlidXRvcnNfbGlzdDsKKyAgbWFwPHN0cmluZyxpbnQ+OjppdGVyYXRvciBpdDsKKyAgZm9yKGl0PWNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcy5iZWdpbigpOyBpdCAhPSBjb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VkbGluZXMuZW5kKCk7ICsraXQpCisgIHsKKyAgICBjb250cmlidXRvciBjOworICAgIGMubmFtZSA9IGl0LT5maXJzdDsKKyAgICBjLmNoYW5nZWRsaW5lcyA9IGl0LT5zZWNvbmQ7CisgICAgYy5jaGFuZ2VzZXRzID0gMDsgLy9jb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VzZXRzLmZpbmQoaXQtPmZpcnN0KS0+c2Vjb25kOworICAgIGNvbnRyaWJ1dG9yc19saXN0LnB1c2hfYmFjayhjKTsKKyAgfQorICAKKyAgYWRkX29ubGluZV9pbmZvX2ludG9fY29udHJpYnV0b3JzX2xpc3QoY29udHJpYnV0b3JzX2xpc3QsICJvbmxpbmUtaW5mby5vdXQiKTsKKyAgCisgIGNvbnRyaWJ1dG9yc19saXN0LnNvcnQoKTsKKyAgCisgIGNvdXQgPDwgInt8IGNlbGxwYWRkaW5nPVwiNVwiXG4iOworICBjb3V0IDw8ICIhXG4iOworICBjb3V0IDw8ICIhIExpbmVzIGNoYW5nZWRcbiI7CisgIGNvdXQgPDwgIiFcbiI7CisKKyAgbGlzdDxjb250cmlidXRvcj46Oml0ZXJhdG9yIGl0YzsKKyAgaW50IGkgPSAwOworICBmb3IoaXRjPWNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0YyAhPSBjb250cmlidXRvcnNfbGlzdC5lbmQoKTsgKytpdGMpCisgIHsKKyAgICBpZihpdGMtPm5hbWUubGVuZ3RoKCkgPT0gMCkgY29udGludWU7CisgICAgaWYoaSUyKSBjb3V0IDw8ICJ8LVxuIjsKKyAgICBlbHNlIGNvdXQgPDwgInwtIHN0eWxlPVwiYmFja2dyb3VuZDojRkZGRkQwXCJcbiI7CisgICAgaWYoaXRjLT51cmwubGVuZ3RoKCkpCisgICAgICBjb3V0IDw8ICJ8IFsiIDw8IGl0Yy0+dXJsIDw8ICIgIiA8PCBpdGMtPm5hbWUgPDwgIl1cbiI7CisgICAgZWxzZQorICAgICAgY291dCA8PCAifCAiIDw8IGl0Yy0+bmFtZSA8PCAiXG4iOworICAgIGlmKGl0Yy0+Y2hhbmdlZGxpbmVzKQorICAgICAgY291dCA8PCAifCAiIDw8IGl0Yy0+Y2hhbmdlZGxpbmVzIDw8ICJcbiI7CisgICAgZWxzZQorICAgICAgY291dCA8PCAifCAobm8gaW5mb3JtYXRpb24pXG4iOworICAgIGNvdXQgPDwgInwgIiA8PCBpdGMtPm1pc2MgPDwgIlxuIjsKKyAgICBpKys7CisgIH0KKyAgY291dCA8PCAifH0iIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2VpZ2VuX2dlbl9kb2NzIGIvc2NyaXB0cy9laWdlbl9nZW5fZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODdkY2IzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9laWdlbl9nZW5fZG9jcwpAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKworIyBjb25maWd1cmF0aW9uCisjIFlvdSBzaG91bGQgY2FsbCB0aGlzIHNjcmlwdCB3aXRoIFVTRVIgc2V0IGFzIHlvdSB3YW50LCBlbHNlIHNvbWUgZGVmYXVsdAorIyB3aWxsIGJlIHVzZWQKK1VTRVI9JHtVU0VSOi0nb3J6ZWwnfQorVVBMT0FEX0RJUj1kb3gtZGV2ZWwKKworI3VsaW1pdCAtdiAxMDI0MDAwCisKKyMgc3RlcCAxIDogYnVpbGQKK3JtIGJ1aWxkL2RvYy9odG1sIC1SZgorbWtkaXIgYnVpbGQgLXAKKyhjZCBidWlsZCAmJiBjbWFrZSAuLiAmJiBtYWtlIGRvYykgfHwgeyBlY2hvICJtYWtlIGZhaWxlZCI7IGV4aXQgMTsgfQorCisjc3RlcCAyIDogdXBsb2FkCisjICh0aGUgJy8nIGF0IHRoZSBlbmQgb2YgcGF0aCBpcyB2ZXJ5IGltcG9ydGFudCwgc2VlIHJzeW5jIGRvY3VtZW50YXRpb24pCityc3luYyAtYXogLS1uby1wIC0tZGVsZXRlIGJ1aWxkL2RvYy9odG1sLyAkVVNFUkBzc2gudHV4ZmFtaWx5Lm9yZzplaWdlbi9laWdlbi50dXhmYW1pbHkub3JnLXdlYi9odGRvY3MvJFVQTE9BRF9ESVIvIHx8IHsgZWNobyAidXBsb2FkIGZhaWxlZCI7IGV4aXQgMTsgfQorCisjc3RlcCAzIDogZml4IHRoZSBwZXJtCitzc2ggJFVTRVJAc3NoLnR1eGZhbWlseS5vcmcgImNobW9kIC1SIGcrdyAvaG9tZS9laWdlbi9laWdlbi50dXhmYW1pbHkub3JnLXdlYi9odGRvY3MvJFVQTE9BRF9ESVIiIHx8IHsgZWNobyAicGVybSBmYWlsZWQiOyBleGl0IDE7IH0KKworZWNobyAiVXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlbGVhc2UuaW4gYi9zY3JpcHRzL3JlbGVhc2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGIyZDlkOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmVsZWFzZS5pbgpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCitjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAuCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlbGljZW5zZS5weSBiL3NjcmlwdHMvcmVsaWNlbnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTI2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3JlbGljZW5zZS5weQpAQCAtMCwwICsxLDY5IEBACisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisjIGZvciBsaW5lYXIgYWxnZWJyYS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIEtlaXIgTWllcmxlIDxtaWVybGVAZ21haWwuY29tPgorIworIyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKyMgUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisjIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorIworIyBBdXRob3I6IG1pZXJsZUBnbWFpbC5jb20gKEtlaXIgTWllcmxlKQorIworIyBNYWtlIHRoZSBsb25nLWF3YWl0ZWQgY29udmVyc2lvbiB0byBNUEwuCisKK2xncGwzX2hlYWRlciA9ICcnJworLy8gRWlnZW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKy8vIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisvLyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorLy8gdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gRWlnZW4gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisvLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisvLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIGFuZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKy8vIEVpZ2VuLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisnJycKKworbXBsMl9oZWFkZXIgPSAiIiIKKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworZXhjbHVzaW9ucyA9IHNldChbJ3JlbGljZW5zZS5weSddKQorCitkZWYgdXBkYXRlKHRleHQpOgorICBpZiB0ZXh0LmZpbmQobGdwbDNfaGVhZGVyKSA9PSAtMToKKyAgICByZXR1cm4gdGV4dCwgRmFsc2UKKyAgcmV0dXJuIHRleHQucmVwbGFjZShsZ3BsM19oZWFkZXIsIG1wbDJfaGVhZGVyKSwgVHJ1ZQorCityb290ZGlyID0gc3lzLmFyZ3ZbMV0KK2ZvciByb290LCBzdWJfZm9sZGVycywgZmlsZXMgaW4gb3Mud2Fsayhyb290ZGlyKToKKyAgICBmb3IgYmFzZW5hbWUgaW4gZmlsZXM6CisgICAgICAgIGlmIGJhc2VuYW1lIGluIGV4Y2x1c2lvbnM6CisgICAgICAgICAgcHJpbnQgJ1NLSVBQRUQnLCBmaWxlbmFtZQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIGJhc2VuYW1lKQorICAgICAgICBmbyA9IGZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRleHQgPSBmby5yZWFkKCkKKyAgICAgICAgZm8uY2xvc2UoKQorCisgICAgICAgIHRleHQsIHVwZGF0ZWQgPSB1cGRhdGUodGV4dCkKKyAgICAgICAgaWYgdXBkYXRlZDoKKyAgICAgICAgICBmbyA9IGZpbGUoZmlsZW5hbWUsICJ3IikKKyAgICAgICAgICBmby53cml0ZSh0ZXh0KQorICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICBwcmludCAnVVBEQVRFRCcsIGZpbGVuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJpbnQgJyAgICAgICAnLCBmaWxlbmFtZQpkaWZmIC0tZ2l0IGEvc2lnbmF0dXJlX29mX2VpZ2VuM19tYXRyaXhfbGlicmFyeSBiL3NpZ25hdHVyZV9vZl9laWdlbjNfbWF0cml4X2xpYnJhcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhYWY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hdHVyZV9vZl9laWdlbjNfbWF0cml4X2xpYnJhcnkKQEAgLTAsMCArMSBAQAorVGhpcyBmaWxlIGlzIGp1c3QgdGhlcmUgYXMgYSBzaWduYXR1cmUgdG8gaGVscCBpZGVudGlmeSBkaXJlY3RvcmllcyBjb250YWluaW5nIEVpZ2VuMy4gV2hlbiB3cml0aW5nIGEgc2NyaXB0IGxvb2tpbmcgZm9yIEVpZ2VuMywganVzdCBsb29rIGZvciB0aGlzIGZpbGUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8gaGVscCBkaXNhbWJpZ3VhdGUgd2l0aCBFaWdlbjIuLi4KZGlmZiAtLWdpdCBhL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDdhYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzkwIEBACisjIGdlbmVyYXRlIHNwbGl0IHRlc3QgaGVhZGVyIGZpbGUgb25seSBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QKKyMgaW4gb3JkZXIgdG8gcHJldmVudCBhIHJlYnVpbGQgZXZlcnl0aW1lIGNtYWtlIGlzIGNvbmZpZ3VyZWQKK2lmKE5PVCBFWElTVFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NwbGl0X3Rlc3RfaGVscGVyLmgpICAKKyAgZmlsZShXUklURSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3BsaXRfdGVzdF9oZWxwZXIuaCAiIikKKyAgZm9yZWFjaChpIFJBTkdFIDEgOTk5KQorICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcGxpdF90ZXN0X2hlbHBlci5oCisgICAgICAiI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8ke2l9XG4iCisgICAgICAiI2RlZmluZSBDQUxMX1NVQlRFU1RfJHtpfShGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQylcbiIKKyAgICAgICIjZWxzZVxuIgorICAgICAgIiNkZWZpbmUgQ0FMTF9TVUJURVNUXyR7aX0oRlVOQylcbiIKKyAgICAgICIjZW5kaWZcblxuIgorICAgICkKKyAgZW5kZm9yZWFjaCgpCitlbmRpZigpCisKKyMgY2hlY2sgaWYgd2UgaGF2ZSBhIEZvcnRyYW4gY29tcGlsZXIKK2luY2x1ZGUoIi4uL2NtYWtlL2xhbmd1YWdlX3N1cHBvcnQuY21ha2UiKQorCit3b3JrYXJvdW5kXzkyMjAoRm9ydHJhbiBFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorCitpZihFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorICBlbmFibGVfbGFuZ3VhZ2UoRm9ydHJhbiBPUFRJT05BTCkKKyAgaWYoTk9UIENNQUtFX0ZvcnRyYW5fQ09NUElMRVIpCisgICAgc2V0KEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MgT0ZGKQorICBlbmRpZigpCitlbmRpZigpCisKK2lmKE5PVCBFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorICAjIHNlYXJjaCBmb3IgYSBkZWZhdWx0IExhcGFjayBsaWJyYXJ5IHRvIGNvbXBsZXRlIEVpZ2VuJ3Mgb25lCisgIGZpbmRfcGFja2FnZShMQVBBQ0sgUVVJRVQpCitlbmRpZigpCisKKyMgY29uZmlndXJlIGJsYXMvbGFwYWNrICh1c2UgRWlnZW4ncyBvbmVzKQorc2V0KEVJR0VOX0JMQVNfTElCUkFSSUVTIGVpZ2VuX2JsYXMpCitzZXQoRUlHRU5fTEFQQUNLX0xJQlJBUklFUyBlaWdlbl9sYXBhY2spCisKK3NldChFSUdFTl9URVNUX01BVFJJWF9ESVIgIiIgQ0FDSEUgU1RSSU5HICJFbmFibGUgdGVzdGluZyBvZiByZWFsd29yZCBzcGFyc2UgbWF0cmljZXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgcGF0aCIpCitpZihFSUdFTl9URVNUX01BVFJJWF9ESVIpCisgIGlmKE5PVCBXSU4zMikKKyAgICBtZXNzYWdlKFNUQVRVUyAiVGVzdCByZWFsd29ybGQgc3BhcnNlIG1hdHJpY2VzOiAke0VJR0VOX1RFU1RfTUFUUklYX0RJUn0iKQorICAgIGFkZF9kZWZpbml0aW9ucyggLURURVNUX1JFQUxfQ0FTRVM9IiR7RUlHRU5fVEVTVF9NQVRSSVhfRElSfSIgKQorICBlbHNlKE5PVCBXSU4zMikKKyAgICBtZXNzYWdlKFNUQVRVUyAiUkVBTCBDQVNFUyBDQU4gTk9UIEJFIENVUlJFTlRMWSBURVNURUQgT04gV0lOMzIiKQorICBlbmRpZihOT1QgV0lOMzIpCitlbmRpZihFSUdFTl9URVNUX01BVFJJWF9ESVIpCisKK3NldChTUEFSU0VfTElCUyAiICIpCisKK2ZpbmRfcGFja2FnZShDaG9sbW9kKQoraWYoQ0hPTE1PRF9GT1VORCkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX0NIT0xNT0RfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDSE9MTU9EX0lOQ0xVREVTfSkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7RUlHRU5fQkxBU19MSUJSQVJJRVN9ICR7RUlHRU5fTEFQQUNLX0xJQlJBUklFU30pCisgIHNldChDSE9MTU9EX0FMTF9MSUJTICAke0NIT0xNT0RfTElCUkFSSUVTfSAke0VJR0VOX0JMQVNfTElCUkFSSUVTfSAke0VJR0VOX0xBUEFDS19MSUJSQVJJRVN9KQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJDaG9sbW9kLCAiKQorZWxzZSgpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICJDaG9sbW9kLCAiKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoVW1mcGFjaykKK2lmKFVNRlBBQ0tfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9VTUZQQUNLX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7VU1GUEFDS19JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1VNRlBBQ0tfTElCUkFSSUVTfSAke0VJR0VOX0JMQVNfTElCUkFSSUVTfSkKKyAgc2V0KFVNRlBBQ0tfQUxMX0xJQlMgJHtVTUZQQUNLX0xJQlJBUklFU30gJHtFSUdFTl9CTEFTX0xJQlJBUklFU30pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgIlVtZlBhY2ssICIpCitlbHNlKCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIlVtZlBhY2ssICIpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShTdXBlckxVIDQuMCkKK2lmKFNVUEVSTFVfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9TVVBFUkxVX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U1VQRVJMVV9JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1NVUEVSTFVfTElCUkFSSUVTfSAke0VJR0VOX0JMQVNfTElCUkFSSUVTfSkKKyAgc2V0KFNVUEVSTFVfQUxMX0xJQlMgJHtTVVBFUkxVX0xJQlJBUklFU30gJHtFSUdFTl9CTEFTX0xJQlJBUklFU30pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgICJTdXBlckxVLCAiKQorZWxzZSgpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICAiU3VwZXJMVSwgIikKK2VuZGlmKCkKKworCitmaW5kX3BhY2thZ2UoUEFTVElYIFFVSUVUIENPTVBPTkVOVFMgTUVUSVMgU0NPVENIKQorIyBjaGVjayB0aGF0IHRoZSBQQVNUSVggZm91bmQgaXMgYSB2ZXJzaW9uIHdpdGhvdXQgTVBJCitmaW5kX3BhdGgoUEFTVElYX3Bhc3RpeF9ub21waS5oX0lOQ0xVREVfRElSUworICBOQU1FUyBwYXN0aXhfbm9tcGkuaAorICBISU5UUyAke1BBU1RJWF9JTkNMVURFX0RJUlN9CispCitpZiAoTk9UIFBBU1RJWF9wYXN0aXhfbm9tcGkuaF9JTkNMVURFX0RJUlMpCisgIG1lc3NhZ2UoU1RBVFVTICJBIHZlcnNpb24gb2YgUGFzdGl4IGhhcyBiZWVuIGZvdW5kIGJ1dCBwYXN0aXhfbm9tcGkuaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5jbHVkZSBkaXJlY3RvcnkuIgorICAgICAgICAgICAgICAgICAiIEJlY2F1c2UgRWlnZW4gdGVzdHMgcmVxdWlyZSBhIHZlcnNpb24gd2l0aG91dCBNUEksIHdlIGRpc2FibGUgdGhlIFBhc3RpeCBiYWNrZW5kLiIpCitlbmRpZigpCitpZihQQVNUSVhfRk9VTkQgQU5EIFBBU1RJWF9wYXN0aXhfbm9tcGkuaF9JTkNMVURFX0RJUlMpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9QQVNUSVhfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQQVNUSVhfSU5DTFVERV9ESVJTX0RFUH0pCisgIGlmKFNDT1RDSF9GT1VORCkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U0NPVENIX0lOQ0xVREVfRElSU30pCisgICAgc2V0KFBBU1RJWF9MSUJSQVJJRVMgJHtQQVNUSVhfTElCUkFSSUVTfSAke1NDT1RDSF9MSUJSQVJJRVN9KQorICBlbHNlaWYoTUVUSVNfRk9VTkQpCisgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke01FVElTX0lOQ0xVREVfRElSU30pCisgICAgc2V0KFBBU1RJWF9MSUJSQVJJRVMgJHtQQVNUSVhfTElCUkFSSUVTfSAke01FVElTX0xJQlJBUklFU30pCisgIGVsc2UoU0NPVENIX0ZPVU5EKQorICAgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICAiUGFTdGlYLCAiKQorICBlbmRpZihTQ09UQ0hfRk9VTkQpCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1BBU1RJWF9MSUJSQVJJRVNfREVQfSAke09SREVSSU5HX0xJQlJBUklFU30pCisgIHNldChQQVNUSVhfQUxMX0xJQlMgJHtQQVNUSVhfTElCUkFSSUVTX0RFUH0pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgICJQYVN0aVgsICIpCitlbHNlKCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgICJQYVN0aVgsICIpCitlbmRpZigpCisKK2lmKE1FVElTX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fTUVUSVNfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNRVRJU19JTkNMVURFX0RJUlN9KQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJNRVRJUywgIikKK2Vsc2UoKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiTUVUSVMsICIpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShTUFFSKQoraWYoU1BRUl9GT1VORCBBTkQgQ0hPTE1PRF9GT1VORCBBTkQgKEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MgT1IgTEFQQUNLX0ZPVU5EKSApCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9TUFFSX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U1BRUl9JTkNMVURFU30pCisgIHNldChTUFFSX0FMTF9MSUJTICR7U1BRUl9MSUJSQVJJRVN9ICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7RUlHRU5fTEFQQUNLX0xJQlJBUklFU30gJHtFSUdFTl9CTEFTX0xJQlJBUklFU30gJHtMQVBBQ0tfTElCUkFSSUVTfSkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7U1BRUl9BTExfTElCU30pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgIlNQUVIsICIpCitlbHNlKCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIlNQUVIsICIpCitlbmRpZigpCisKK29wdGlvbihFSUdFTl9URVNUX05PUVQgIkRpc2FibGUgUXQgc3VwcG9ydCBpbiB1bml0IHRlc3RzIiBPRkYpCitpZihOT1QgRUlHRU5fVEVTVF9OT1FUKQorICBmaW5kX3BhY2thZ2UoUXQ0KQorICBpZihRVDRfRk9VTkQpCisgICAgaW5jbHVkZSgke1FUX1VTRV9GSUxFfSkKKyAgICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICAiUXQ0IHN1cHBvcnQsICIpCisgIGVsc2UoKQorICAgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICAiUXQ0IHN1cHBvcnQsICIpCisgIGVuZGlmKCkKK2VuZGlmKE5PVCBFSUdFTl9URVNUX05PUVQpCisKK2lmKFRFU1RfTElCKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fRVhURVJOX0lOU1RBTlRJQVRJT05TPTEiKQorZW5kaWYoVEVTVF9MSUIpCisKK3NldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fQ1VSUkVOVF9TVUJQUk9KRUNUICJPZmZpY2lhbCIpCithZGRfY3VzdG9tX3RhcmdldChCdWlsZE9mZmljaWFsKQorCitlaV9hZGRfdGVzdChyYW5kKQorZWlfYWRkX3Rlc3QobWV0YSkKK2VpX2FkZF90ZXN0KG51bWV4dCkKK2VpX2FkZF90ZXN0KHNpemVvZikKK2VpX2FkZF90ZXN0KGR5bmFsbG9jKQorZWlfYWRkX3Rlc3Qobm9tYWxsb2MpCitlaV9hZGRfdGVzdChmaXJzdF9hbGlnbmVkKQorZWlfYWRkX3Rlc3QobnVsbGFyeSkKK2VpX2FkZF90ZXN0KG1peGluZ3R5cGVzKQorZWlfYWRkX3Rlc3QocGFja2V0bWF0aCAiLURFSUdFTl9GQVNUX01BVEg9MSIpCitlaV9hZGRfdGVzdCh1bmFsaWduZWRhc3NlcnQpCitlaV9hZGRfdGVzdCh2ZWN0b3JpemF0aW9uX2xvZ2ljKQorZWlfYWRkX3Rlc3QoYmFzaWNzdHVmZikKK2VpX2FkZF90ZXN0KGNvbnN0cnVjdG9yKQorZWlfYWRkX3Rlc3QobGluZWFyc3RydWN0dXJlKQorZWlfYWRkX3Rlc3QoaW50ZWdlcl90eXBlcykKK2VpX2FkZF90ZXN0KHVuYWxpZ25lZGNvdW50KQoraWYoTk9UIEVJR0VOX1RFU1RfTk9fRVhDRVBUSU9OUykKKyAgZWlfYWRkX3Rlc3QoZXhjZXB0aW9ucykKK2VuZGlmKCkKK2VpX2FkZF90ZXN0KHJlZHV4KQorZWlfYWRkX3Rlc3QodmlzaXRvcikKK2VpX2FkZF90ZXN0KGJsb2NrKQorZWlfYWRkX3Rlc3QoY29ybmVycykKK2VpX2FkZF90ZXN0KHN3YXApCitlaV9hZGRfdGVzdChyZXNpemUpCitlaV9hZGRfdGVzdChjb25zZXJ2YXRpdmVfcmVzaXplKQorZWlfYWRkX3Rlc3QocHJvZHVjdF9zbWFsbCkKK2VpX2FkZF90ZXN0KHByb2R1Y3RfbGFyZ2UpCitlaV9hZGRfdGVzdChwcm9kdWN0X2V4dHJhKQorZWlfYWRkX3Rlc3QoZGlhZ29uYWxtYXRyaWNlcykKK2VpX2FkZF90ZXN0KGFkam9pbnQpCitlaV9hZGRfdGVzdChkaWFnb25hbCkKK2VpX2FkZF90ZXN0KG1pc2NtYXRyaWNlcykKK2VpX2FkZF90ZXN0KGNvbW1haW5pdGlhbGl6ZXIpCitlaV9hZGRfdGVzdChzbWFsbHZlY3RvcnMpCitlaV9hZGRfdGVzdChtYXBwZWRfbWF0cml4KQorZWlfYWRkX3Rlc3QobWFwc3RyaWRlKQorZWlfYWRkX3Rlc3QobWFwc3RhdGljbWV0aG9kcykKK2VpX2FkZF90ZXN0KGFycmF5KQorZWlfYWRkX3Rlc3QoYXJyYXlfZm9yX21hdHJpeCkKK2VpX2FkZF90ZXN0KGFycmF5X3JlcGxpY2F0ZSkKK2VpX2FkZF90ZXN0KGFycmF5X3JldmVyc2UpCitlaV9hZGRfdGVzdChyZWYpCitlaV9hZGRfdGVzdChpc19zYW1lX2RlbnNlKQorZWlfYWRkX3Rlc3QodHJpYW5ndWxhcikKK2VpX2FkZF90ZXN0KHNlbGZhZGpvaW50KQorZWlfYWRkX3Rlc3QocHJvZHVjdF9zZWxmYWRqb2ludCkKK2VpX2FkZF90ZXN0KHByb2R1Y3Rfc3ltbSkKK2VpX2FkZF90ZXN0KHByb2R1Y3Rfc3lyaykKK2VpX2FkZF90ZXN0KHByb2R1Y3RfdHJtdikKK2VpX2FkZF90ZXN0KHByb2R1Y3RfdHJtbSkKK2VpX2FkZF90ZXN0KHByb2R1Y3RfdHJzb2x2ZSkKK2VpX2FkZF90ZXN0KHByb2R1Y3RfbW10cikKK2VpX2FkZF90ZXN0KHByb2R1Y3Rfbm90ZW1wb3JhcnkpCitlaV9hZGRfdGVzdChzdGFibGVfbm9ybSkKK2VpX2FkZF90ZXN0KHBlcm11dGF0aW9ubWF0cmljZXMpCitlaV9hZGRfdGVzdChiYW5kbWF0cml4KQorZWlfYWRkX3Rlc3QoY2hvbGVza3kpCitlaV9hZGRfdGVzdChsdSkKK2VpX2FkZF90ZXN0KGRldGVybWluYW50KQorZWlfYWRkX3Rlc3QoaW52ZXJzZSkKK2VpX2FkZF90ZXN0KHFyKQorZWlfYWRkX3Rlc3QocXJfY29scGl2b3RpbmcpCitlaV9hZGRfdGVzdChxcl9mdWxscGl2b3RpbmcpCitlaV9hZGRfdGVzdCh1cHBlcmJpZGlhZ29uYWxpemF0aW9uKQorZWlfYWRkX3Rlc3QoaGVzc2VuYmVyZykKK2VpX2FkZF90ZXN0KHNjaHVyX3JlYWwpCitlaV9hZGRfdGVzdChzY2h1cl9jb21wbGV4KQorZWlfYWRkX3Rlc3QoZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQpCitlaV9hZGRfdGVzdChlaWdlbnNvbHZlcl9nZW5lcmljKQorZWlfYWRkX3Rlc3QoZWlnZW5zb2x2ZXJfY29tcGxleCkKK2VpX2FkZF90ZXN0KHJlYWxfcXopCitlaV9hZGRfdGVzdChlaWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsKQorZWlfYWRkX3Rlc3QoamFjb2JpKQorZWlfYWRkX3Rlc3QoamFjb2Jpc3ZkKQorZWlfYWRkX3Rlc3QoYmRjc3ZkKQorZWlfYWRkX3Rlc3QoaG91c2Vob2xkZXIpCitlaV9hZGRfdGVzdChnZW9fb3J0aG9tZXRob2RzKQorZWlfYWRkX3Rlc3QoZ2VvX3F1YXRlcm5pb24pCitlaV9hZGRfdGVzdChnZW9fZXVsZXJhbmdsZXMpCitlaV9hZGRfdGVzdChnZW9fcGFyYW1ldHJpemVkbGluZSkKK2VpX2FkZF90ZXN0KGdlb19hbGlnbmVkYm94KQorZWlfYWRkX3Rlc3QoZ2VvX2h5cGVycGxhbmUpCitlaV9hZGRfdGVzdChnZW9fdHJhbnNmb3JtYXRpb25zKQorZWlfYWRkX3Rlc3QoZ2VvX2hvbW9nZW5lb3VzKQorZWlfYWRkX3Rlc3Qoc3RkdmVjdG9yKQorZWlfYWRkX3Rlc3Qoc3RkdmVjdG9yX292ZXJsb2FkKQorZWlfYWRkX3Rlc3Qoc3RkbGlzdCkKK2VpX2FkZF90ZXN0KHN0ZGxpc3Rfb3ZlcmxvYWQpCitlaV9hZGRfdGVzdChzdGRkZXF1ZSkKK2VpX2FkZF90ZXN0KHN0ZGRlcXVlX292ZXJsb2FkKQorZWlfYWRkX3Rlc3Qoc3BhcnNlX2Jhc2ljKQorZWlfYWRkX3Rlc3Qoc3BhcnNlX2Jsb2NrKQorZWlfYWRkX3Rlc3Qoc3BhcnNlX3ZlY3RvcikKK2VpX2FkZF90ZXN0KHNwYXJzZV9wcm9kdWN0KQorZWlfYWRkX3Rlc3Qoc3BhcnNlX3JlZikKK2VpX2FkZF90ZXN0KHNwYXJzZV9zb2x2ZXJzKQorZWlfYWRkX3Rlc3Qoc3BhcnNlX3Blcm11dGF0aW9ucykKK2VpX2FkZF90ZXN0KHNpbXBsaWNpYWxfY2hvbGVza3kpCitlaV9hZGRfdGVzdChjb25qdWdhdGVfZ3JhZGllbnQpCitlaV9hZGRfdGVzdChpbmNvbXBsZXRlX2Nob2xlc2t5KQorZWlfYWRkX3Rlc3QoYmljZ3N0YWIpCitlaV9hZGRfdGVzdChsc2NnKQorZWlfYWRkX3Rlc3Qoc3BhcnNlbHUpCitlaV9hZGRfdGVzdChzcGFyc2VxcikKK2VpX2FkZF90ZXN0KHVtZXlhbWEpCitlaV9hZGRfdGVzdChuZXN0aW5nX29wcyAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IikKK2VpX2FkZF90ZXN0KHplcm9zaXplZCkKK2VpX2FkZF90ZXN0KGRvbnRhbGlnbikKK2VpX2FkZF90ZXN0KGV2YWx1YXRvcnMpCitpZihOT1QgRUlHRU5fVEVTVF9OT19FWENFUFRJT05TKQorICBlaV9hZGRfdGVzdChzaXplb3ZlcmZsb3cpCitlbmRpZigpCitlaV9hZGRfdGVzdChwcmVjX2ludmVyc2VfNHg0KQorZWlfYWRkX3Rlc3QodmVjdG9yd2lzZW9wKQorZWlfYWRkX3Rlc3Qoc3BlY2lhbF9udW1iZXJzKQorZWlfYWRkX3Rlc3QocnZhbHVlX3R5cGVzKQorZWlfYWRkX3Rlc3QoZGVuc2Vfc3RvcmFnZSkKK2VpX2FkZF90ZXN0KGN0b3JsZWFrKQorZWlfYWRkX3Rlc3QobXBsMm9ubHkpCitlaV9hZGRfdGVzdChpbnBsYWNlX2RlY29tcG9zaXRpb24pCitlaV9hZGRfdGVzdChoYWxmX2Zsb2F0KQorZWlfYWRkX3Rlc3QoYXJyYXlfb2Zfc3RyaW5nKQorCithZGRfZXhlY3V0YWJsZShidWcxMjEzIGJ1ZzEyMTMuY3BwIGJ1ZzEyMTNfbWFpbi5jcHApCisKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKCItZmZhc3QtbWF0aCIgQ09NUElMRVJfU1VQUE9SVF9GQVNUTUFUSCkKK2lmKENPTVBJTEVSX1NVUFBPUlRfRkFTVE1BVEgpCisgIHNldChFSUdFTl9GQVNUTUFUSF9GTEFHUyAiLWZmYXN0LW1hdGgiKQorZWxzZSgpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCIvZnA6ZmFzdCIgQ09NUElMRVJfU1VQUE9SVF9GUEZBU1QpCisgIGlmKENPTVBJTEVSX1NVUFBPUlRfRlBGQVNUKQorICAgIHNldChFSUdFTl9GQVNUTUFUSF9GTEFHUyAiL2ZwOmZhc3QiKQorICBlbmRpZigpCitlbmRpZigpCisKK2VpX2FkZF90ZXN0KGZhc3RtYXRoICIgJHtFSUdFTl9GQVNUTUFUSF9GTEFHU30gIikKKworIyAjIGVpX2FkZF90ZXN0KGRlbnNlTE0pCisKK2lmKFFUNF9GT1VORCkKKyAgZWlfYWRkX3Rlc3QocXR2ZWN0b3IgIiIgIiR7UVRfUVRDT1JFX0xJQlJBUll9IikKK2VuZGlmKFFUNF9GT1VORCkKKworaWYoVU1GUEFDS19GT1VORCkKKyAgZWlfYWRkX3Rlc3QodW1mcGFja19zdXBwb3J0ICIiICIke1VNRlBBQ0tfQUxMX0xJQlN9IikKK2VuZGlmKCkKKworaWYoU1VQRVJMVV9GT1VORCkKKyAgZWlfYWRkX3Rlc3Qoc3VwZXJsdV9zdXBwb3J0ICIiICIke1NVUEVSTFVfQUxMX0xJQlN9IikKK2VuZGlmKCkKKworaWYoQ0hPTE1PRF9GT1VORCkKKyAgZWlfYWRkX3Rlc3QoY2hvbG1vZF9zdXBwb3J0ICIiICIke0NIT0xNT0RfQUxMX0xJQlN9IikKK2VuZGlmKCkKKworaWYoUEFSRElTT19GT1VORCkKKyAgZWlfYWRkX3Rlc3QocGFyZGlzb19zdXBwb3J0ICIiICIke1BBUkRJU09fQUxMX0xJQlN9IikKK2VuZGlmKCkKKworaWYoUEFTVElYX0ZPVU5EIEFORCAoU0NPVENIX0ZPVU5EIE9SIE1FVElTX0ZPVU5EKSkKKyAgZWlfYWRkX3Rlc3QocGFzdGl4X3N1cHBvcnQgIiIgIiR7UEFTVElYX0FMTF9MSUJTfSIpCitlbmRpZigpCisKK2lmKFNQUVJfRk9VTkQgQU5EIENIT0xNT0RfRk9VTkQpCisgIGVpX2FkZF90ZXN0KHNwcXJfc3VwcG9ydCAiIiAiJHtTUFFSX0FMTF9MSUJTfSIpCitlbmRpZigpCisKK2lmKE1FVElTX0ZPVU5EKQorZWlfYWRkX3Rlc3QobWV0aXNfc3VwcG9ydCAiIiAiJHtNRVRJU19MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQ1hYX0NPTVBJTEVSfSIgY21ha2VfY3h4X2NvbXBpbGVyX3RvbG93ZXIpCitpZihjbWFrZV9jeHhfY29tcGlsZXJfdG9sb3dlciBNQVRDSEVTICJxY2MiKQorICBzZXQoQ1hYX0lTX1FDQyAiT04iKQorZW5kaWYoKQorCitlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVElOR19TVU1NQVJZICJDWFg6ICAgICAgICAgICAgICAgJHtDTUFLRV9DWFhfQ09NUElMRVJ9XG4iKQoraWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIEFORCBOT1QgQ1hYX0lTX1FDQykKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IC0tdmVyc2lvbiBDT01NQU5EIGhlYWQgLW4gMSBPVVRQVVRfVkFSSUFCTEUgRUlHRU5fQ1hYX1ZFUlNJT05fU1RSSU5HIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVElOR19TVU1NQVJZICJDWFhfVkVSU0lPTjogICAgICAgJHtFSUdFTl9DWFhfVkVSU0lPTl9TVFJJTkd9XG4iKQorZW5kaWYoKQorZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RJTkdfU1VNTUFSWSAiQ1hYX0ZMQUdTOiAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTfVxuIikKK2VpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNUSU5HX1NVTU1BUlkgIlNwYXJzZSBsaWIgZmxhZ3M6ICAke1NQQVJTRV9MSUJTfVxuIikKKworb3B0aW9uKEVJR0VOX1RFU1RfRUlHRU4yICJSdW4gd2hvbGUgRWlnZW4yIHRlc3Qgc3VpdGUgYWdhaW5zdCBFSUdFTjJfU1VQUE9SVCIgT0ZGKQorbWFya19hc19hZHZhbmNlZChFSUdFTl9URVNUX0VJR0VOMikKK2lmKEVJR0VOX1RFU1RfRUlHRU4yKQorICBtZXNzYWdlKFdBUk5JTkcgIlRoZSBFaWdlbjIgdGVzdCBzdWl0ZSBoYXMgYmVlbiByZW1vdmVkIikKK2VuZGlmKCkKKworIyBib29zdCBNUCB1bml0IHRlc3QKK2ZpbmRfcGFja2FnZShCb29zdCkKK2lmKEJvb3N0X0ZPVU5EKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKyAgZWlfYWRkX3Rlc3QoYm9vc3RtdWx0aXByZWMgIiIgIiR7Qm9vc3RfTElCUkFSSUVTfSIpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgIkJvb3N0Lk11bHRpcHJlY2lzaW9uLCAiKQorZWxzZSgpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICJCb29zdC5NdWx0aXByZWNpc2lvbiwgIikKK2VuZGlmKCkKKworCisjIENVREEgdW5pdCB0ZXN0cworb3B0aW9uKEVJR0VOX1RFU1RfQ1VEQSAiRW5hYmxlIENVREEgc3VwcG9ydCBpbiB1bml0IHRlc3RzIiBPRkYpCitvcHRpb24oRUlHRU5fVEVTVF9DVURBX0NMQU5HICJVc2UgY2xhbmcgaW5zdGVhZCBvZiBudmNjIHRvIGNvbXBpbGUgdGhlIENVREEgdGVzdHMiIE9GRikKKworaWYoRUlHRU5fVEVTVF9DVURBX0NMQU5HIEFORCBOT1QgQ01BS0VfQ1hYX0NPTVBJTEVSIE1BVENIRVMgImNsYW5nIikKKyAgbWVzc2FnZShXQVJOSU5HICJFSUdFTl9URVNUX0NVREFfQ0xBTkcgaXMgc2V0LCBidXQgQ01BS0VfQ1hYX0NPTVBJTEVSIGRvZXMgbm90IGFwcGVhciB0byBiZSBjbGFuZy4iKQorZW5kaWYoKQorCitpZihFSUdFTl9URVNUX0NVREEpCisKK2ZpbmRfcGFja2FnZShDVURBIDUuMCkKK2lmKENVREFfRk9VTkQpCisgIAorICBzZXQoQ1VEQV9QUk9QQUdBVEVfSE9TVF9GTEFHUyBPRkYpCisgIGlmKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJDbGFuZyIpIAorICAgIHNldChDVURBX05WQ0NfRkxBR1MgIi1jY2JpbiAke0NNQUtFX0NfQ09NUElMRVJ9IiBDQUNIRSBTVFJJTkcgIm52Y2MgZmxhZ3MiIEZPUkNFKQorICBlbmRpZigpCisgIGlmKEVJR0VOX1RFU1RfQ1VEQV9DTEFORykKKyAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkPWMrKzExIC0tY3VkYS1ncHUtYXJjaD1zbV8zMCIpCisgIGVuZGlmKCkKKyAgY3VkYV9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgc2V0KEVJR0VOX0FERF9URVNUX0ZJTEVOQU1FX0VYVEVOU0lPTiAgImN1IikKKyAgCisgIGVpX2FkZF90ZXN0KGN1ZGFfYmFzaWMpCisgIAorICB1bnNldChFSUdFTl9BRERfVEVTVF9GSUxFTkFNRV9FWFRFTlNJT04pCisKK2VuZGlmKENVREFfRk9VTkQpCisKK2VuZGlmKEVJR0VOX1RFU1RfQ1VEQSkKKworCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9mYWlsdGVzdHMpICAgIAorYWRkX3Rlc3QoTkFNRSBmYWlsdGVzdHMgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2ZhaWx0ZXN0cyBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gJHtFaWdlbl9TT1VSQ0VfRElSfSAtRyAiJHtDTUFLRV9HRU5FUkFUT1J9IiAtREVJR0VOX0ZBSUxURVNUPU9OKQorCitvcHRpb24oRUlHRU5fVEVTVF9CVUlMRF9ET0NVTUVOVEFUSU9OICJUZXN0IGJ1aWxkaW5nIHRoZSBkb3h5Z2VuIGRvY3VtZW50YXRpb24iIE9GRikKK0lGKEVJR0VOX1RFU1RfQlVJTERfRE9DVU1FTlRBVElPTikKKyAgYWRkX2RlcGVuZGVuY2llcyhidWlsZHRlc3RzIGRvYykKK0VORElGKCkKZGlmZiAtLWdpdCBhL3Rlc3QvYWRqb2ludC5jcHAgYi90ZXN0L2Fkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Fkam9pbnQuY3BwCkBAIC0wLDAgKzEsMjAwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPGJvb2wgSXNJbnRlZ2VyPiBzdHJ1Y3QgYWRqb2ludF9zcGVjaWZpYzsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgYWRqb2ludF9zcGVjaWZpYzx0cnVlPiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFZlYywgdHlwZW5hbWUgTWF0LCB0eXBlbmFtZSBTY2FsYXI+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBWZWMmIHYxLCBjb25zdCBWZWMmIHYyLCBWZWMmIHYzLCBjb25zdCBNYXQmIHNxdWFyZSwgU2NhbGFyIHMxLCBTY2FsYXIgczIpIHsKKyAgICBWRVJJRlkodGVzdF9pc0FwcHJveFdpdGhSZWYoKHMxICogdjEgKyBzMiAqIHYyKS5kb3QodjMpLCAgICAgbnVtZXh0Ojpjb25qKHMxKSAqIHYxLmRvdCh2MykgKyBudW1leHQ6OmNvbmooczIpICogdjIuZG90KHYzKSwgMCkpOworICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZih2My5kb3QoczEgKiB2MSArIHMyICogdjIpLCAgICAgICBzMSp2My5kb3QodjEpK3MyKnYzLmRvdCh2MiksIDApKTsKKyAgICAKKyAgICAvLyBjaGVjayBjb21wYXRpYmlsaXR5IG9mIGRvdCBhbmQgYWRqb2ludAorICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZih2MS5kb3Qoc3F1YXJlICogdjIpLCAoc3F1YXJlLmFkam9pbnQoKSAqIHYxKS5kb3QodjIpLCAwKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGFkam9pbnRfc3BlY2lmaWM8ZmFsc2U+IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjLCB0eXBlbmFtZSBNYXQsIHR5cGVuYW1lIFNjYWxhcj4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFZlYyYgdjEsIGNvbnN0IFZlYyYgdjIsIFZlYyYgdjMsIGNvbnN0IE1hdCYgc3F1YXJlLCBTY2FsYXIgczEsIFNjYWxhciBzMikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAKKyAgICBSZWFsU2NhbGFyIHJlZiA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgPyBSZWFsU2NhbGFyKDApIDogKHN0ZDo6bWF4KSgoczEgKiB2MSArIHMyICogdjIpLm5vcm0oKSx2My5ub3JtKCkpOworICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZigoczEgKiB2MSArIHMyICogdjIpLmRvdCh2MyksICAgICBudW1leHQ6OmNvbmooczEpICogdjEuZG90KHYzKSArIG51bWV4dDo6Y29uaihzMikgKiB2Mi5kb3QodjMpLCByZWYpKTsKKyAgICBWRVJJRlkodGVzdF9pc0FwcHJveFdpdGhSZWYodjMuZG90KHMxICogdjEgKyBzMiAqIHYyKSwgICAgICAgczEqdjMuZG90KHYxKStzMip2My5kb3QodjIpLCByZWYpKTsKKyAgCisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MS5zcXVhcmVkTm9ybSgpLCAgICAgICAgICAgICAgICB2MS5ub3JtKCkgKiB2MS5ub3JtKCkpOworICAgIC8vIGNoZWNrIG5vcm1hbGl6ZWQoKSBhbmQgbm9ybWFsaXplKCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLCB2MS5ub3JtKCkgKiB2MS5ub3JtYWxpemVkKCkpOworICAgIHYzID0gdjE7CisgICAgdjMubm9ybWFsaXplKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgdjEubm9ybSgpICogdjMpOworICAgIFZFUklGWV9JU19BUFBST1godjMsIHYxLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2My5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOworCisgICAgLy8gY2hlY2sgbnVsbCBpbnB1dHMKKyAgICBWRVJJRllfSVNfQVBQUk9YKCh2MSowKS5ub3JtYWxpemVkKCksICh2MSowKSk7CisjaWYgKCFFSUdFTl9BUkNIX2kzODYpIHx8IGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFKQorICAgIFJlYWxTY2FsYXIgdmVyeV9zbWFsbCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCk7CisgICAgVkVSSUZZKCAodjEqdmVyeV9zbWFsbCkubm9ybSgpID09IDAgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCh2MSp2ZXJ5X3NtYWxsKS5ub3JtYWxpemVkKCksICh2MSp2ZXJ5X3NtYWxsKSk7CisgICAgdjMgPSB2MSp2ZXJ5X3NtYWxsOworICAgIHYzLm5vcm1hbGl6ZSgpOworICAgIFZFUklGWV9JU19BUFBST1godjMsICh2MSp2ZXJ5X3NtYWxsKSk7CisjZW5kaWYKKyAgICAKKyAgICAvLyBjaGVjayBjb21wYXRpYmlsaXR5IG9mIGRvdCBhbmQgYWRqb2ludAorICAgIHJlZiA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgPyAwIDogKHN0ZDo6bWF4KSgoc3RkOjptYXgpKHYxLm5vcm0oKSx2Mi5ub3JtKCkpLChzdGQ6Om1heCkoKHNxdWFyZSAqIHYyKS5ub3JtKCksKHNxdWFyZS5hZGpvaW50KCkgKiB2MSkubm9ybSgpKSk7CisgICAgVkVSSUZZKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhYnModjEuZG90KHNxdWFyZSAqIHYyKSAtIChzcXVhcmUuYWRqb2ludCgpICogdjEpLmRvdCh2MikpLCByZWYsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgIAorICAgIC8vIGNoZWNrIHRoYXQgUmFuZG9tKCkubm9ybWFsaXplZCgpIHdvcmtzOiB0cmlja3kgYXMgdGhlIHJhbmRvbSB4cHIgbXVzdCBiZSBldmFsdWF0ZWQgYnkKKyAgICAvLyBub3JtYWxpemVkKCkgaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGNvbnNpc3RlbnQgcmVzdWx0LgorICAgIFZFUklGWV9JU19BUFBST1goVmVjOjpSYW5kb20odjEuc2l6ZSgpKS5ub3JtYWxpemVkKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBhZGpvaW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgVHJhbnNwb3NlLmggQ29uanVnYXRlLmggRG90LmgKKyAgKi8KKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKyAgY29uc3QgSW5kZXggUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIAorICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIHNxdWFyZSA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2MyA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIGNoZWNrIGJhc2ljIGNvbXBhdGliaWxpdHkgb2YgYWRqb2ludCwgdHJhbnNwb3NlLCBjb25qdWdhdGUKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKS5hZGpvaW50KCksICAgIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hZGpvaW50KCkuY29uanVnYXRlKCkudHJhbnNwb3NlKCksICAgIG0xKTsKKworICAvLyBjaGVjayBtdWx0aXBsaWNhdGl2ZSBiZWhhdmlvcgorICBWRVJJRllfSVNfQVBQUk9YKChtMS5hZGpvaW50KCkgKiBtMikuYWRqb2ludCgpLCAgICAgICAgICAgbTIuYWRqb2ludCgpICogbTEpOworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIG0xKS5hZGpvaW50KCksICAgICAgICAgICAgICAgICAgICAgbnVtZXh0Ojpjb25qKHMxKSAqIG0xLmFkam9pbnQoKSk7CisKKyAgLy8gY2hlY2sgYmFzaWMgcHJvcGVydGllcyBvZiBkb3QsIHNxdWFyZWROb3JtCisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb25qKHYxLmRvdCh2MikpLCAgICAgICAgICAgICAgIHYyLmRvdCh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cmVhbCh2MS5kb3QodjEpKSwgICAgICAgICAgICAgICB2MS5zcXVhcmVkTm9ybSgpKTsKKyAgCisgIGFkam9pbnRfc3BlY2lmaWM8TnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcj46OnJ1bih2MSwgdjIsIHYzLCBzcXVhcmUsIHMxLCBzMik7CisgIAorICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKHZ6ZXJvLmRvdCh2MSkpLCAgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSkpOworICAKKyAgLy8gbGlrZSBpbiB0ZXN0QmFzaWNTdHVmZiwgdGVzdCBvcGVyYXRvcigpIHRvIGNoZWNrIGNvbnN0LXF1YWxpZmljYXRpb24KKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb25qdWdhdGUoKShyLGMpLCBudW1leHQ6OmNvbmoobTEocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKShjLHIpLCBudW1leHQ6OmNvbmoobTEocixjKSkpOworCisgIC8vIGNoZWNrIGlucGxhY2UgdHJhbnNwb3NlCisgIG0zID0gbTE7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMS50cmFuc3Bvc2UoKSk7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisgIAorICBpZihQYWNrZXRTaXplPG0zLnJvd3MoKSAmJiBQYWNrZXRTaXplPG0zLmNvbHMoKSkKKyAgeworICAgIG0zID0gbTE7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTMucm93cygpLVBhY2tldFNpemUpOworICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0zLmNvbHMoKS1QYWNrZXRTaXplKTsKKyAgICBtMy50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLFBhY2tldFNpemU+KGksaikudHJhbnNwb3NlSW5QbGFjZSgpOworICAgIFZFUklGWV9JU19BUFBST1goIChtMy50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLFBhY2tldFNpemU+KGksaikpLCAobTEudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPihpLGopLnRyYW5zcG9zZSgpKSApOworICAgIG0zLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oaSxqKS50cmFuc3Bvc2VJblBsYWNlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisgIH0KKworICAvLyBjaGVjayBpbnBsYWNlIGFkam9pbnQKKyAgbTMgPSBtMTsKKyAgbTMuYWRqb2ludEluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMS5hZGpvaW50KCkpOworICBtMy50cmFuc3Bvc2VJblBsYWNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTEuY29uanVnYXRlKCkpOworCisgIC8vIGNoZWNrIG1peGVkIGRvdCBwcm9kdWN0CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSZWFsVmVjdG9yVHlwZTsKKyAgUmVhbFZlY3RvclR5cGUgcnYxID0gUmVhbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5kb3QocnYxLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpKSwgdjEuZG90KHJ2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJ2MS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKS5kb3QodjEpLCBydjEuZG90KHYxKSk7Cit9CisKK3ZvaWQgdGVzdF9hZGpvaW50KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGFkam9pbnQoTWF0cml4M2QoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggYWRqb2ludChNYXRyaXg0ZigpKSApOworICAgIAorICAgIENBTExfU1VCVEVTVF80KCBhZGpvaW50KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYWRqb2ludChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBhZGpvaW50KE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgCisgICAgLy8gQ29tcGxlbWVudCBmb3IgMTI4IGJpdHMgdmVjdG9yaXphdGlvbjoKKyAgICBDQUxMX1NVQlRFU1RfOCggYWRqb2ludChNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF85KCBhZGpvaW50KE1hdHJpeDxpbnQsNCw0PigpKSApOworICAgIAorICAgIC8vIDI1NiBiaXRzIHZlY3Rvcml6YXRpb246CisgICAgQ0FMTF9TVUJURVNUXzEwKCBhZGpvaW50KE1hdHJpeDxmbG9hdCw4LDg+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzExKCBhZGpvaW50KE1hdHJpeDxkb3VibGUsNCw0PigpKSApOworICAgIENBTExfU1VCVEVTVF8xMiggYWRqb2ludChNYXRyaXg8aW50LDgsOD4oKSkgKTsKKyAgfQorICAvLyB0ZXN0IGEgbGFyZ2Ugc3RhdGljIG1hdHJpeCBvbmx5IG9uY2UKKyAgQ0FMTF9TVUJURVNUXzcoIGFkam9pbnQoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xMworICB7CisgICAgTWF0cml4WGNmIGEoMTAsMTApLCBiKDEwLDEwKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGEudHJhbnNwb3NlKCkgKyBiKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYiArIGEudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEgPSBhLmNvbmp1Z2F0ZSgpLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYS5hZGpvaW50KCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEgPSBhLmFkam9pbnQoKSArIGIpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEgPSBiICsgYS5hZGpvaW50KCkpOworCisgICAgLy8gbm8gYXNzZXJ0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgZm9yIHRoZXNlIGNhc2VzOgorICAgIGEudHJhbnNwb3NlKCkgPSBhLnRyYW5zcG9zZSgpOworICAgIGEudHJhbnNwb3NlKCkgKz0gYS50cmFuc3Bvc2UoKTsKKyAgICBhLnRyYW5zcG9zZSgpICs9IGEudHJhbnNwb3NlKCkgKyBiOworICAgIGEudHJhbnNwb3NlKCkgPSBhLmFkam9pbnQoKTsKKyAgICBhLnRyYW5zcG9zZSgpICs9IGEuYWRqb2ludCgpOworICAgIGEudHJhbnNwb3NlKCkgKz0gYS5hZGpvaW50KCkgKyBiOworCisgICAgLy8gcmVncmVzc2lvbiB0ZXN0cyBmb3IgY2hlY2tfZm9yX2FsaWFzaW5nCisgICAgTWF0cml4WGQgYygxMCwxMCk7CisgICAgYyA9IDEuMCAqIE1hdHJpeFhkOjpPbmVzKDEwLDEwKSArIGM7CisgICAgYyA9IE1hdHJpeFhkOjpPbmVzKDEwLDEwKSAqIDEuMCArIGM7CisgICAgYyA9IGMgKyBNYXRyaXhYZDo6T25lcygxMCwxMCkgLmN3aXNlUHJvZHVjdCggTWF0cml4WGQ6Olplcm8oMTAsMTApICk7CisgICAgYyA9IE1hdHJpeFhkOjpPbmVzKDEwLDEwKSAqIE1hdHJpeFhkOjpaZXJvKDEwLDEwKTsKKyAgfQorI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXkuY3BwIGIvdGVzdC9hcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjMzI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXJyYXkuY3BwCkBAIC0wLDAgKzEsNDk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5KGNvbnN0IEFycmF5VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCAxLCBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOyAKKworICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBBcnJheVR5cGUgbTQgPSBtMTsgLy8gY29weSBjb25zdHJ1Y3RvcgorICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtNCk7CisKKyAgQ29sVmVjdG9yVHlwZSBjdjEgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIFJvd1ZlY3RvclR5cGUgcnYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpOworCisgIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHNjYWxhciBhZGRpdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xICsgczEsIHMxICsgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xICsgczEsIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSArIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSAtIG0xLCAoLW0xKStzMSApOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gczEsIG0xIC0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSAtIG0xLCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkgLSBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xKlNjYWxhcigyKSkgLSBzMiwgKG0xK20xKSAtIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMyArPSBzMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEgKyBzMik7CisgIG0zID0gbTE7CisgIG0zIC09IHMxOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSAtIHMxKTsgIAorICAKKyAgLy8gc2NhbGFyIG9wZXJhdG9ycyB2aWEgTWFwcworICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSAtPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgLSBtMik7CisgIAorICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSArPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgKyBtMik7CisgIAorICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSAqPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgKiBtMik7CisgIAorICBtMyA9IG0xOworICBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIG0yID0gKG0yPT0wKS5zZWxlY3QoMSxtMik7CisgIEFycmF5VHlwZTo6TWFwKG0xLmRhdGEoKSwgbTEucm93cygpLCBtMS5jb2xzKCkpIC89IEFycmF5VHlwZTo6TWFwKG0yLmRhdGEoKSwgbTIucm93cygpLCBtMi5jb2xzKCkpOyAgCisgIFZFUklGWV9JU19BUFBST1gobTEsIG0zIC8gbTIpOworCisgIC8vIHJlZHVjdGlvbnMKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKS5jb2x3aXNlKCkuc3VtKCkuc3VtKCksIG0xLmFicygpLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKS5yb3d3aXNlKCkuc3VtKCkuc3VtKCksIG0xLmFicygpLnN1bSgpKTsKKyAgdXNpbmcgc3RkOjphYnM7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMobTEuY29sd2lzZSgpLnN1bSgpLnN1bSgpIC0gbTEuc3VtKCkpLCBtMS5hYnMoKS5zdW0oKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMobTEucm93d2lzZSgpLnN1bSgpLnN1bSgpIC0gbTEuc3VtKCkpLCBtMS5hYnMoKS5zdW0oKSk7CisgIGlmICghaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGFicyhtMS5zdW0oKSAtIChtMSttMikuc3VtKCkpLCBtMS5hYnMoKS5zdW0oKSwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSkKKyAgICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKCgobTErbTIpLnJvd3dpc2UoKS5zdW0oKSkuc3VtKCksIG0xLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCksIG0xLmNvbHdpc2UoKS5yZWR1eChpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPigpKSk7CisKKyAgLy8gdmVjdG9yLXdpc2Ugb3BzCisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMuY29sd2lzZSgpICs9IGN2MSwgbTEuY29sd2lzZSgpICsgY3YxKTsKKyAgbTMgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5jb2x3aXNlKCkgLT0gY3YxLCBtMS5jb2x3aXNlKCkgLSBjdjEpOworICBtMyA9IG0xOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnJvd3dpc2UoKSArPSBydjEsIG0xLnJvd3dpc2UoKSArIHJ2MSk7CisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMucm93d2lzZSgpIC09IHJ2MSwgbTEucm93d2lzZSgpIC0gcnYxKTsKKyAgCisgIC8vIENvbnZlcnNpb24gZnJvbSBzY2FsYXIKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTMgPSBzMSksIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0zID0gMSksICBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0zLnRvcExlZnRDb3JuZXIocm93cyxjb2xzKSA9IDEpLCAgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsMSkpOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwKKyAgICAgICAgICAgICAgICBBcnJheVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljPzI6QXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljPzI6QXJyYXlUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBcnJheVR5cGU6Ok9wdGlvbnM+IEZpeGVkQXJyYXlUeXBlOworICBGaXhlZEFycmF5VHlwZSBmMShzMSk7CisgIFZFUklGWV9JU19BUFBST1goZjEsIEZpeGVkQXJyYXlUeXBlOjpDb25zdGFudChzMSkpOworICBGaXhlZEFycmF5VHlwZSBmMihudW1leHQ6OnJlYWwoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmMiwgRml4ZWRBcnJheVR5cGU6OkNvbnN0YW50KG51bWV4dDo6cmVhbChzMSkpKTsKKyAgRml4ZWRBcnJheVR5cGUgZjMoKGludCkxMDAqbnVtZXh0OjpyZWFsKHMxKSk7CisgIFZFUklGWV9JU19BUFBST1goZjMsIEZpeGVkQXJyYXlUeXBlOjpDb25zdGFudCgoaW50KTEwMCpudW1leHQ6OnJlYWwoczEpKSk7CisgIGYxLnNldFJhbmRvbSgpOworICBGaXhlZEFycmF5VHlwZSBmNChmMS5kYXRhKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGY0LCBmMSk7CisgIAorICAvLyBwb3cKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5wb3coMiksIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwb3cobTEsMiksIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5wb3coMyksIG0xLmN1YmUoKSk7CisgIFZFUklGWV9JU19BUFBST1gocG93KG0xLDMpLCBtMS5jdWJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEpLnBvdygzKSwgLW0xLmN1YmUoKSk7CisgIFZFUklGWV9JU19BUFBST1gocG93KDIqbTEsMyksIDgqbTEuY3ViZSgpKTsKKyAgQXJyYXlUeXBlIGV4cG9uZW50cyA9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgUmVhbFNjYWxhcigyKSk7CisgIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyhtMSxleHBvbmVudHMpLCBtMS5zcXVhcmUoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEucG93KGV4cG9uZW50cyksIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6cG93KDIqbTEsZXhwb25lbnRzKSwgNCptMS5zcXVhcmUoKSk7CisgIFZFUklGWV9JU19BUFBST1goKDIqbTEpLnBvdyhleHBvbmVudHMpLCA0Km0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6cG93KG0xLDIqZXhwb25lbnRzKSwgbTEuc3F1YXJlKCkuc3F1YXJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnBvdygyKmV4cG9uZW50cyksIG0xLnNxdWFyZSgpLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6cG93KG0xKDAsMCksIGV4cG9uZW50cyksIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG0xKDAsMCkqbTEoMCwwKSkpOworCisgIC8vIENoZWNrIHBvc3NpYmxlIGNvbmZsaWN0cyB3aXRoIDFEIGN0b3IKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIER5bmFtaWMsIDE+IE9uZURBcnJheVR5cGU7CisgIE9uZURBcnJheVR5cGUgbzEocm93cyk7CisgIFZFUklGWShvMS5zaXplKCk9PXJvd3MpOworICBPbmVEQXJyYXlUeXBlIG80KChpbnQpcm93cyk7CisgIFZFUklGWShvNC5zaXplKCk9PXJvd3MpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgY29tcGFyaXNvbnMoY29uc3QgQXJyYXlUeXBlJiBtKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG00ID0gbTE7CisgIAorICBtNCA9IChtNC5hYnMoKT09U2NhbGFyKDApKS5zZWxlY3QoMSxtNCk7CisKKyAgVkVSSUZZKCgobTEgKyBTY2FsYXIoMSkpID4gbTEpLmFsbCgpKTsKKyAgVkVSSUZZKCgobTEgLSBTY2FsYXIoMSkpIDwgbTEpLmFsbCgpKTsKKyAgaWYgKHJvd3MqY29scz4xKQorICB7CisgICAgbTMgPSBtMTsKKyAgICBtMyhyLGMpICs9IDE7CisgICAgVkVSSUZZKCEgKG0xIDwgbTMpLmFsbCgpICk7CisgICAgVkVSSUZZKCEgKG0xID4gbTMpLmFsbCgpICk7CisgIH0KKyAgVkVSSUZZKCEobTEgPiBtMiAmJiBtMSA8IG0yKS5hbnkoKSk7CisgIFZFUklGWSgobTEgPD0gbTIgfHwgbTEgPj0gbTIpLmFsbCgpKTsKKworICAvLyBjb21wYXJpc29ucyBhcnJheSB0byBzY2FsYXIKKyAgVkVSSUZZKCAobTEgIT0gKG0xKHIsYykrMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMSA+ICAobTEocixjKS0xKSApLmFueSgpICk7CisgIFZFUklGWSggKG0xIDwgIChtMShyLGMpKzEpICkuYW55KCkgKTsKKyAgVkVSSUZZKCAobTEgPT0gIG0xKHIsYykgICAgKS5hbnkoKSApOworCisgIC8vIGNvbXBhcmlzb25zIHNjYWxhciB0byBhcnJheQorICBWRVJJRlkoICggKG0xKHIsYykrMSkgIT0gbTEpLmFueSgpICk7CisgIFZFUklGWSggKCAobTEocixjKS0xKSA8ICBtMSkuYW55KCkgKTsKKyAgVkVSSUZZKCAoIChtMShyLGMpKzEpID4gIG0xKS5hbnkoKSApOworICBWRVJJRlkoICggIG0xKHIsYykgICAgPT0gbTEpLmFueSgpICk7CisKKyAgLy8gdGVzdCBTZWxlY3QKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xPG0yKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1pbihtMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xPm0yKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1heChtMikgKTsKKyAgU2NhbGFyIG1pZCA9IChtMS5jd2lzZUFicygpLm1pbkNvZWZmKCkgKyBtMS5jd2lzZUFicygpLm1heENvZWZmKCkpL1NjYWxhcigyKTsKKyAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgZm9yIChpbnQgaT0wOyBpPHJvd3M7ICsraSkKKyAgICBtMyhpLGopID0gYWJzKG0xKGksaikpPG1pZCA/IDAgOiBtMShpLGopOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYWJzKCk8QXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoQXJyYXlUeXBlOjpaZXJvKHJvd3MsY29scyksbTEpLCBtMyk7CisgIC8vIHNob3J0ZXIgdmVyc2lvbnM6CisgIFZFUklGWV9JU19BUFBST1goIChtMS5hYnMoKTxBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgwLG0xKSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYWJzKCk+PUFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KG0xLDApLCBtMyk7CisgIC8vIGV2ZW4gc2hvcnRlciB2ZXJzaW9uOgorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYWJzKCk8bWlkKS5zZWxlY3QoMCxtMSksIG0zKTsKKworICAvLyBjb3VudAorICBWRVJJRlkoKChtMS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLmNvdW50KCkgPT0gcm93cypjb2xzKTsKKworICAvLyBhbmQvb3IKKyAgVkVSSUZZKCAobTE8UmVhbFNjYWxhcigwKSAmJiBtMT5SZWFsU2NhbGFyKDApKS5jb3VudCgpID09IDApOworICBWRVJJRlkoIChtMTxSZWFsU2NhbGFyKDApIHx8IG0xPj1SZWFsU2NhbGFyKDApKS5jb3VudCgpID09IHJvd3MqY29scyk7CisgIFJlYWxTY2FsYXIgYSA9IG0xLmFicygpLm1lYW4oKTsKKyAgVkVSSUZZKCAobTE8LWEgfHwgbTE+YSkuY291bnQoKSA9PSAobTEuYWJzKCk+YSkuY291bnQoKSk7CisKKyAgdHlwZWRlZiBBcnJheTx0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4LCBEeW5hbWljLCAxPiBBcnJheU9mSW5kaWNlczsKKworICAvLyBUT0RPIGFsbG93cyBjb2x3aXNlL3Jvd3dpc2UgZm9yIGFycmF5CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLmNvbHdpc2UoKS5jb3VudCgpLCBBcnJheU9mSW5kaWNlczo6Q29uc3RhbnQoY29scyxyb3dzKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLnJvd3dpc2UoKS5jb3VudCgpLCBBcnJheU9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgYXJyYXlfcmVhbChjb25zdCBBcnJheVR5cGUmIG0pCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG00ID0gbTE7CisKKyAgbTQgPSAobTQuYWJzKCk9PVNjYWxhcigwKSkuc2VsZWN0KDEsbTQpOworCisgIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICAvLyB0aGVzZSB0ZXN0cyBhcmUgbW9zdGx5IHRvIGNoZWNrIHBvc3NpYmxlIGNvbXBpbGF0aW9uIGlzc3VlcyB3aXRoIGZyZWUtZnVuY3Rpb25zLgorICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpbigpLCBzaW4obTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb3MoKSwgY29zKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEudGFuKCksIHRhbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFzaW4oKSwgYXNpbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFjb3MoKSwgYWNvcyhtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmF0YW4oKSwgYXRhbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpbmgoKSwgc2luaChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvc2goKSwgY29zaChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRhbmgoKSwgdGFuaChtMSkpOworCisgIFZFUklGWV9JU19BUFBST1gobTEuYXJnKCksIGFyZyhtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnJvdW5kKCksIHJvdW5kKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZmxvb3IoKSwgZmxvb3IobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jZWlsKCksIGNlaWwobTEpKTsKKyAgVkVSSUZZKChtMS5pc05hTigpID09IChFaWdlbjo6aXNuYW4pKG0xKSkuYWxsKCkpOworICBWRVJJRlkoKG0xLmlzSW5mKCkgPT0gKEVpZ2VuOjppc2luZikobTEpKS5hbGwoKSk7CisgIFZFUklGWSgobTEuaXNGaW5pdGUoKSA9PSAoRWlnZW46OmlzZmluaXRlKShtMSkpLmFsbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5pbnZlcnNlKCksIGludmVyc2UobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKSwgYWJzKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWJzMigpLCBhYnMyKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuc3F1YXJlKCksIHNxdWFyZShtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN1YmUoKSwgY3ViZShtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKGNvcyhtMStSZWFsU2NhbGFyKDMpKm0yKSwgY29zKChtMStSZWFsU2NhbGFyKDMpKm0yKS5ldmFsKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zaWduKCksIHNpZ24obTEpKTsKKworCisgIC8vIGF2b2lkIE5hTnMgd2l0aCBhYnMoKSBzbyB2ZXJpZmljYXRpb24gZG9lc24ndCBmYWlsCisgIG0zID0gbTEuYWJzKCk7CisgIFZFUklGWV9JU19BUFBST1gobTMuc3FydCgpLCBzcXJ0KGFicyhtMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5yc3FydCgpLCBTY2FsYXIoMSkvc3FydChhYnMobTEpKSk7CisgIFZFUklGWV9JU19BUFBST1gocnNxcnQobTMpLCBTY2FsYXIoMSkvc3FydChhYnMobTEpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMubG9nKCksIGxvZyhtMykpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLmxvZzFwKCksIGxvZzFwKG0zKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMubG9nMTAoKSwgbG9nMTAobTMpKTsKKworCisgIFZFUklGWSgoIShtMT5tMikgPT0gKG0xPD1tMikpLmFsbCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHNpbihtMS5hc2luKCkpLCBtMSk7CisgIFZFUklGWV9JU19BUFBST1goY29zKG0xLmFjb3MoKSksIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0YW4obTEuYXRhbigpKSwgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKHNpbmgobTEpLCAwLjUqKGV4cChtMSktZXhwKC1tMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb3NoKG0xKSwgMC41KihleHAobTEpK2V4cCgtbTEpKSk7CisgIFZFUklGWV9JU19BUFBST1godGFuaChtMSksICgwLjUqKGV4cChtMSktZXhwKC1tMSkpKS8oMC41KihleHAobTEpK2V4cCgtbTEpKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGFyZyhtMSksICgobTE8MCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkpKnN0ZDo6YWNvcygtMS4wKSk7CisgIFZFUklGWSgocm91bmQobTEpIDw9IGNlaWwobTEpICYmIHJvdW5kKG0xKSA+PSBmbG9vcihtMSkpLmFsbCgpKTsKKyAgVkVSSUZZKChFaWdlbjo6aXNuYW4pKChtMSowLjApLzAuMCkuYWxsKCkpOworICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQvMC4wKS5hbGwoKSk7CisgIFZFUklGWSgoKEVpZ2VuOjppc2Zpbml0ZSkobTEpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTEqMC4wLzAuMCkpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTQvMC4wKSkpLmFsbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChpbnZlcnNlKGludmVyc2UobTEpKSxtMSk7CisgIFZFUklGWSgoYWJzKG0xKSA9PSBtMSB8fCBhYnMobTEpID09IC1tMSkuYWxsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBzcXJ0KGFiczIobTEpKSk7CisgIFZFUklGWV9JU19BUFBST1goIG0xLnNpZ24oKSwgLSgtbTEpLnNpZ24oKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBtMSptMS5zaWduKCksbTEuYWJzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpZ24oKSAqIG0xLmFicygpLCBtMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OmFiczIobnVtZXh0OjpyZWFsKG0xKSkgKyBudW1leHQ6OmFiczIobnVtZXh0OjppbWFnKG0xKSksIG51bWV4dDo6YWJzMihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6YWJzMihyZWFsKG0xKSkgKyBudW1leHQ6OmFiczIoaW1hZyhtMSkpLCBudW1leHQ6OmFiczIobTEpKTsKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnJlYWwobTEpLCBtMSk7CisKKyAgLy8gc2hpZnQgYXJndW1lbnQgb2YgbG9nYXJpdGhtIHNvIHRoYXQgaXQgaXMgbm90IHplcm8KKyAgU2NhbGFyIHNtYWxsTnVtYmVyID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpOworICBWRVJJRllfSVNfQVBQUk9YKChtMyArIHNtYWxsTnVtYmVyKS5sb2coKSAsIGxvZyhhYnMobTEpICsgc21hbGxOdW1iZXIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTMgKyBzbWFsbE51bWJlciArIDEpLmxvZygpICwgbG9nMXAoYWJzKG0xKSArIHNtYWxsTnVtYmVyKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5leHAoKSAqIG0yLmV4cCgpLCBleHAobTErbTIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5leHAoKSwgZXhwKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgLyBtMi5leHAoKSwobTEtbTIpLmV4cCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0zLnBvdyhSZWFsU2NhbGFyKDAuNSkpLCBtMy5zcXJ0KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMyxSZWFsU2NhbGFyKDAuNSkpLCBtMy5zcXJ0KCkpOworCisgIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoLTAuNSkpLCBtMy5yc3FydCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwb3cobTMsUmVhbFNjYWxhcigtMC41KSksIG0zLnJzcXJ0KCkpOworCisgIFZFUklGWV9JU19BUFBST1gobG9nMTAobTMpLCBsb2cobTMpL2xvZygxMCkpOworCisgIC8vIHNjYWxhciBieSBhcnJheSBkaXZpc2lvbgorICBjb25zdCBSZWFsU2NhbGFyIHRpbnkgPSBzcXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSk7CisgIHMxICs9IFNjYWxhcih0aW55KTsKKyAgbTEgKz0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsU2NhbGFyKHRpbnkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMS9tMSwgczEgKiBtMS5pbnZlcnNlKCkpOworCisgIC8vIGNoZWNrIGlucGxhY2UgdHJhbnNwb3NlCisgIG0zID0gbTE7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEudHJhbnNwb3NlKCkpOworICBtMy50cmFuc3Bvc2VJblBsYWNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5X2NvbXBsZXgoY29uc3QgQXJyYXlUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG00ID0gbTE7CisgIAorICBtNC5yZWFsKCkgPSAobTQucmVhbCgpLmFicygpPT1SZWFsU2NhbGFyKDApKS5zZWxlY3QoUmVhbFNjYWxhcigxKSxtNC5yZWFsKCkpOworICBtNC5pbWFnKCkgPSAobTQuaW1hZygpLmFicygpPT1SZWFsU2NhbGFyKDApKS5zZWxlY3QoUmVhbFNjYWxhcigxKSxtNC5pbWFnKCkpOworCisgIEFycmF5PFJlYWxTY2FsYXIsIC0xLCAtMT4gbTMocm93cywgY29scyk7CisKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ucm93cygpOyArK2kpCisgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG0uY29scygpOyArK2opCisgICAgICBtMihpLGopID0gc3FydChtMShpLGopKTsKKworICAvLyB0aGVzZSB0ZXN0cyBhcmUgbW9zdGx5IHRvIGNoZWNrIHBvc3NpYmxlIGNvbXBpbGF0aW9uIGlzc3VlcyB3aXRoIGZyZWUtZnVuY3Rpb25zLgorICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpbigpLCBzaW4obTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb3MoKSwgY29zKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEudGFuKCksIHRhbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpbmgoKSwgc2luaChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvc2goKSwgY29zaChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRhbmgoKSwgdGFuaChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFyZygpLCBhcmcobTEpKTsKKyAgVkVSSUZZKChtMS5pc05hTigpID09IChFaWdlbjo6aXNuYW4pKG0xKSkuYWxsKCkpOworICBWRVJJRlkoKG0xLmlzSW5mKCkgPT0gKEVpZ2VuOjppc2luZikobTEpKS5hbGwoKSk7CisgIFZFUklGWSgobTEuaXNGaW5pdGUoKSA9PSAoRWlnZW46OmlzZmluaXRlKShtMSkpLmFsbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5pbnZlcnNlKCksIGludmVyc2UobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5sb2coKSwgbG9nKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEubG9nMTAoKSwgbG9nMTAobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKSwgYWJzKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWJzMigpLCBhYnMyKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuc3FydCgpLCBzcXJ0KG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuc3F1YXJlKCksIHNxdWFyZShtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN1YmUoKSwgY3ViZShtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKGNvcyhtMStSZWFsU2NhbGFyKDMpKm0yKSwgY29zKChtMStSZWFsU2NhbGFyKDMpKm0yKS5ldmFsKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zaWduKCksIHNpZ24obTEpKTsKKworCisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgKiBtMi5leHAoKSwgZXhwKG0xK20yKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCksIGV4cChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cCgpIC8gbTIuZXhwKCksKG0xLW0yKS5leHAoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzaW5oKG0xKSwgMC41KihleHAobTEpLWV4cCgtbTEpKSk7CisgIFZFUklGWV9JU19BUFBST1goY29zaChtMSksIDAuNSooZXhwKG0xKStleHAoLW0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKHRhbmgobTEpLCAoMC41KihleHAobTEpLWV4cCgtbTEpKSkvKDAuNSooZXhwKG0xKStleHAoLW0xKSkpKTsKKworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5yb3dzKCk7ICsraSkKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbS5jb2xzKCk7ICsraikKKyAgICAgIG0zKGksaikgPSBzdGQ6OmF0YW4yKGltYWcobTEoaSxqKSksIHJlYWwobTEoaSxqKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGFyZyhtMSksIG0zKTsKKworICBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gemVybygwLjAsMC4wKTsKKyAgVkVSSUZZKChFaWdlbjo6aXNuYW4pKG0xKnplcm8vemVybykuYWxsKCkpOworI2lmIEVJR0VOX0NPTVBfTVNWQworICAvLyBtc3ZjIGNvbXBsZXggZGl2aXNpb24gaXMgbm90IHJvYnVzdAorICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQvUmVhbFNjYWxhcigwKSkuYWxsKCkpOworI2Vsc2UKKyNpZiBFSUdFTl9DT01QX0NMQU5HCisgIC8vIGNsYW5nJ3MgY29tcGxleCBkaXZpc2lvbiBpcyBub3RvcmlvdXNseSBicm9rZW4gdG9vCisgIGlmKChudW1leHQ6OmlzaW5mKShtNCgwLDApL1JlYWxTY2FsYXIoMCkpKSB7CisjZW5kaWYKKyAgICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQvemVybykuYWxsKCkpOworI2lmIEVJR0VOX0NPTVBfQ0xBTkcKKyAgfQorICBlbHNlCisgIHsKKyAgICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQucmVhbCgpL3plcm8ucmVhbCgpKS5hbGwoKSk7CisgIH0KKyNlbmRpZgorI2VuZGlmIC8vIE1TVkMKKworICBWRVJJRlkoKChFaWdlbjo6aXNmaW5pdGUpKG0xKSAmJiAoIShFaWdlbjo6aXNmaW5pdGUpKG0xKnplcm8vemVybykpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTEvemVybykpKS5hbGwoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChpbnZlcnNlKGludmVyc2UobTEpKSxtMSk7CisgIFZFUklGWV9JU19BUFBST1goY29uaihtMS5jb25qdWdhdGUoKSksIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnMobTEpLCBzcXJ0KHNxdWFyZShyZWFsKG0xKSkrc3F1YXJlKGltYWcobTEpKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGFicyhtMSksIHNxcnQoYWJzMihtMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsb2cxMChtMSksIGxvZyhtMSkvbG9nKDEwKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuc2lnbigpLCAtKC1tMSkuc2lnbigpICk7CisgIFZFUklGWV9JU19BUFBST1goIG0xLnNpZ24oKSAqIG0xLmFicygpLCBtMSk7CisKKyAgLy8gc2NhbGFyIGJ5IGFycmF5IGRpdmlzaW9uCisgIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgY29uc3QgUmVhbFNjYWxhciB0aW55ID0gc3RkOjpzcXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSk7CisgIHMxICs9IFNjYWxhcih0aW55KTsKKyAgbTEgKz0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsU2NhbGFyKHRpbnkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMS9tMSwgczEgKiBtMS5pbnZlcnNlKCkpOworCisgIC8vIGNoZWNrIGlucGxhY2UgdHJhbnNwb3NlCisgIG0yID0gbTE7CisgIG0yLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEudHJhbnNwb3NlKCkpOworICBtMi50cmFuc3Bvc2VJblBsYWNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgbWluX21heChjb25zdCBBcnJheVR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgLy8gbWluL21heCB3aXRoIGFycmF5CisgIFNjYWxhciBtYXhNMSA9IG0xLm1heENvZWZmKCk7CisgIFNjYWxhciBtaW5NMSA9IG0xLm1pbkNvZWZmKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLCAobTEubWluKShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5taW4pKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSksIChtMS5tYXgpKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1heCkoQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSkpOworCisgIC8vIG1pbi9tYXggd2l0aCBzY2FsYXIgaW5wdXQKKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLCAobTEubWluKSggbWluTTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1pbikoIG1heE0xKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCAobTEubWF4KSggbWF4TTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1heCkoIG1pbk0xKSk7CisKK30KKwordm9pZCB0ZXN0X2FycmF5KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYXJyYXkoQXJyYXk8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGFycmF5KEFycmF5MjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFycmF5KEFycmF5NDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGFycmF5KEFycmF5WFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBhcnJheShBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBhcnJheShBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNvbXBhcmlzb25zKEFycmF5PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjb21wYXJpc29ucyhBcnJheTIyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjb21wYXJpc29ucyhBcnJheTQ0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBjb21wYXJpc29ucyhBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjb21wYXJpc29ucyhBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1pbl9tYXgoQXJyYXk8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1pbl9tYXgoQXJyYXkyMmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWluX21heChBcnJheTQ0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtaW5fbWF4KEFycmF5WFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1pbl9tYXgoQXJyYXlYWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBhcnJheV9yZWFsKEFycmF5PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhcnJheV9yZWFsKEFycmF5MjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFycmF5X3JlYWwoQXJyYXk0NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYXJyYXlfcmVhbChBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzQoIGFycmF5X2NvbXBsZXgoQXJyYXlYWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPGludD46OnR5cGUsIGludCA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPGZsb2F0Pjo6dHlwZSwgZmxvYXQgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxBcnJheTJpPjo6dHlwZSwgQXJyYXlCYXNlPEFycmF5Mmk+ID46OnZhbHVlKSk7CisgIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWJzX29wPGRvdWJsZT4sIEFycmF5WGQgPiBYcHI7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjpnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8WHByPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5QmFzZTxYcHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXlfZm9yX21hdHJpeC5jcHAgYi90ZXN0L2FycmF5X2Zvcl9tYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzIxMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FycmF5X2Zvcl9tYXRyaXguY3BwCkBAIC0wLDAgKzEsMzA0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBhcnJheV9mb3JfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsgCisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBDb2xWZWN0b3JUeXBlIGN2MSA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgUm93VmVjdG9yVHlwZSBydjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CisgIAorICBTY2FsYXIgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgICAgICAKKyAgLy8gc2NhbGFyIGFkZGl0aW9uCisgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSArIHMxLCBzMSArIG0xLmFycmF5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMS5hcnJheSgpICsgczEpLm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpICsgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEqU2NhbGFyKDIpKS5hcnJheSgpIC0gczIpLm1hdHJpeCgpLCAobTErbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMy5hcnJheSgpICs9IHMyOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCAobTEuYXJyYXkoKSArIHMyKS5tYXRyaXgoKSk7CisgIG0zID0gbTE7CisgIG0zLmFycmF5KCkgLT0gczE7CisgIFZFUklGWV9JU19BUFBST1gobTMsIChtMS5hcnJheSgpIC0gczEpLm1hdHJpeCgpKTsKKworICAvLyByZWR1Y3Rpb25zCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5jb2x3aXNlKCkuc3VtKCkuc3VtKCkgLSBtMS5zdW0oKSwgbTEuc3F1YXJlZE5vcm0oKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5yb3d3aXNlKCkuc3VtKCkuc3VtKCkgLSBtMS5zdW0oKSwgbTEuc3F1YXJlZE5vcm0oKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5jb2x3aXNlKCkuc3VtKCkgKyBtMi5jb2x3aXNlKCkuc3VtKCkgLSAobTErbTIpLmNvbHdpc2UoKS5zdW0oKSwgKG0xK20yKS5zcXVhcmVkTm9ybSgpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0xLnJvd3dpc2UoKS5zdW0oKSAtIG0yLnJvd3dpc2UoKS5zdW0oKSAtIChtMS1tMikucm93d2lzZSgpLnN1bSgpLCAobTEtbTIpLnNxdWFyZWROb3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbHdpc2UoKS5zdW0oKSwgbTEuY29sd2lzZSgpLnJlZHV4KGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcixTY2FsYXI+KCkpKTsKKworICAvLyB2ZWN0b3Itd2lzZSBvcHMKKyAgbTMgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5jb2x3aXNlKCkgKz0gY3YxLCBtMS5jb2x3aXNlKCkgKyBjdjEpOworICBtMyA9IG0xOworICBWRVJJRllfSVNfQVBQUk9YKG0zLmNvbHdpc2UoKSAtPSBjdjEsIG0xLmNvbHdpc2UoKSAtIGN2MSk7CisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMucm93d2lzZSgpICs9IHJ2MSwgbTEucm93d2lzZSgpICsgcnYxKTsKKyAgbTMgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5yb3d3aXNlKCkgLT0gcnYxLCBtMS5yb3d3aXNlKCkgLSBydjEpOworICAKKyAgLy8gZW1wdHkgb2JqZWN0cworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKDAsMCwwLGNvbHMpLmNvbHdpc2UoKS5zdW0oKSwgIFJvd1ZlY3RvclR5cGU6Olplcm8oY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKDAsMCxyb3dzLDApLnJvd3dpc2UoKS5wcm9kKCksIENvbFZlY3RvclR5cGU6Ok9uZXMocm93cykpOworICAKKyAgLy8gdmVyaWZ5IHRoZSBjb25zdCBhY2Nlc3NvcnMgZXhpc3QKKyAgY29uc3QgU2NhbGFyJiByZWZfbTEgPSBtLm1hdHJpeCgpLmFycmF5KCkuY29lZmZSZWYoMCk7CisgIGNvbnN0IFNjYWxhciYgcmVmX20yID0gbS5tYXRyaXgoKS5hcnJheSgpLmNvZWZmUmVmKDAsMCk7CisgIGNvbnN0IFNjYWxhciYgcmVmX2ExID0gbS5hcnJheSgpLm1hdHJpeCgpLmNvZWZmUmVmKDApOworICBjb25zdCBTY2FsYXImIHJlZl9hMiA9IG0uYXJyYXkoKS5tYXRyaXgoKS5jb2VmZlJlZigwLDApOworICBWRVJJRlkoJnJlZl9hMSA9PSAmcmVmX20xKTsKKyAgVkVSSUZZKCZyZWZfYTIgPT0gJnJlZl9tMik7CisKKyAgLy8gQ2hlY2sgd3JpdGUgYWNjZXNzb3JzOgorICBtMS5hcnJheSgpLmNvZWZmUmVmKDAsMCkgPSAxOworICBWRVJJRllfSVNfQVBQUk9YKG0xKDAsMCksU2NhbGFyKDEpKTsKKyAgbTEuYXJyYXkoKSgwLDApID0gMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSgwLDApLFNjYWxhcigyKSk7CisgIG0xLmFycmF5KCkubWF0cml4KCkuY29lZmZSZWYoMCwwKSA9IDM7CisgIFZFUklGWV9JU19BUFBST1gobTEoMCwwKSxTY2FsYXIoMykpOworICBtMS5hcnJheSgpLm1hdHJpeCgpKDAsMCkgPSA0OworICBWRVJJRllfSVNfQVBQUk9YKG0xKDAsMCksU2NhbGFyKDQpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjb21wYXJpc29ucyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgVkVSSUZZKCgobTEuYXJyYXkoKSArIFNjYWxhcigxKSkgPiBtMS5hcnJheSgpKS5hbGwoKSk7CisgIFZFUklGWSgoKG0xLmFycmF5KCkgLSBTY2FsYXIoMSkpIDwgbTEuYXJyYXkoKSkuYWxsKCkpOworICBpZiAocm93cypjb2xzPjEpCisgIHsKKyAgICBtMyA9IG0xOworICAgIG0zKHIsYykgKz0gMTsKKyAgICBWRVJJRlkoISAobTEuYXJyYXkoKSA8IG0zLmFycmF5KCkpLmFsbCgpICk7CisgICAgVkVSSUZZKCEgKG0xLmFycmF5KCkgPiBtMy5hcnJheSgpKS5hbGwoKSApOworICB9CisKKyAgLy8gY29tcGFyaXNvbnMgdG8gc2NhbGFyCisgIFZFUklGWSggKG0xLmFycmF5KCkgIT0gKG0xKHIsYykrMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5hcnJheSgpID4gKG0xKHIsYyktMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5hcnJheSgpIDwgKG0xKHIsYykrMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5hcnJheSgpID09IG0xKHIsYykgKS5hbnkoKSApOworICBWRVJJRlkoIG0xLmN3aXNlRXF1YWwobTEocixjKSkuYW55KCkgKTsKKworICAvLyB0ZXN0IFNlbGVjdAorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKTxtMi5hcnJheSgpKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1pbihtMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCk+bTIuYXJyYXkoKSkuc2VsZWN0KG0xLG0yKSwgbTEuY3dpc2VNYXgobTIpICk7CisgIFNjYWxhciBtaWQgPSAobTEuY3dpc2VBYnMoKS5taW5Db2VmZigpICsgbTEuY3dpc2VBYnMoKS5tYXhDb2VmZigpKS9TY2FsYXIoMik7CisgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgbTMoaSxqKSA9IGFicyhtMShpLGopKTxtaWQgPyAwIDogbTEoaSxqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk8TWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkuYXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpLG0xKSwgbTMpOworICAvLyBzaG9ydGVyIHZlcnNpb25zOgorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKS5hYnMoKTxNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKS5hcnJheSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgwLG0xKSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKS5hYnMoKT49TWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkuYXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QobTEsMCksIG0zKTsKKyAgLy8gZXZlbiBzaG9ydGVyIHZlcnNpb246CisgIFZFUklGWV9JU19BUFBST1goIChtMS5hcnJheSgpLmFicygpPG1pZCkuc2VsZWN0KDAsbTEpLCBtMyk7CisKKyAgLy8gY291bnQKKyAgVkVSSUZZKCgobTEuYXJyYXkoKS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLmNvdW50KCkgPT0gcm93cypjb2xzKTsKKworICAvLyBhbmQvb3IKKyAgVkVSSUZZKCAoKG0xLmFycmF5KCk8UmVhbFNjYWxhcigwKSkubWF0cml4KCkgJiYgKG0xLmFycmF5KCk+UmVhbFNjYWxhcigwKSkubWF0cml4KCkpLmNvdW50KCkgPT0gMCk7CisgIFZFUklGWSggKChtMS5hcnJheSgpPFJlYWxTY2FsYXIoMCkpLm1hdHJpeCgpIHx8IChtMS5hcnJheSgpPj1SZWFsU2NhbGFyKDApKS5tYXRyaXgoKSkuY291bnQoKSA9PSByb3dzKmNvbHMpOworICBSZWFsU2NhbGFyIGEgPSBtMS5jd2lzZUFicygpLm1lYW4oKTsKKyAgVkVSSUZZKCAoKG0xLmFycmF5KCk8LWEpLm1hdHJpeCgpIHx8IChtMS5hcnJheSgpPmEpLm1hdHJpeCgpKS5jb3VudCgpID09IChtMS5jd2lzZUFicygpLmFycmF5KCk+YSkuY291bnQoKSk7CisKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXgsIER5bmFtaWMsIDE+IFZlY3Rvck9mSW5kaWNlczsKKworICAvLyBUT0RPIGFsbG93cyBjb2x3aXNlL3Jvd3dpc2UgZm9yIGFycmF5CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkuY29sd2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQoY29scyxyb3dzKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkucm93d2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIGxwTm9ybShjb25zdCBWZWN0b3JUeXBlJiB2KQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBWZWN0b3JUeXBlIHUgPSBWZWN0b3JUeXBlOjpSYW5kb20odi5zaXplKCkpOworCisgIGlmKHYuc2l6ZSgpPT0wKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTxJbmZpbml0eT4oKSwgUmVhbFNjYWxhcigwKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwxPigpLCBSZWFsU2NhbGFyKDApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHUudGVtcGxhdGUgbHBOb3JtPDI+KCksIFJlYWxTY2FsYXIoMCkpOworICAgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08NT4oKSwgUmVhbFNjYWxhcigwKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTxJbmZpbml0eT4oKSwgdS5jd2lzZUFicygpLm1heENvZWZmKCkpOworICB9CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwxPigpLCB1LmN3aXNlQWJzKCkuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHUudGVtcGxhdGUgbHBOb3JtPDI+KCksIHNxcnQodS5hcnJheSgpLmFicygpLnNxdWFyZSgpLnN1bSgpKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpwb3codS50ZW1wbGF0ZSBscE5vcm08NT4oKSwgdHlwZW5hbWUgVmVjdG9yVHlwZTo6UmVhbFNjYWxhcig1KSksIHUuYXJyYXkoKS5hYnMoKS5wb3coNSkuc3VtKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGN3aXNlX21pbl9tYXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgLy8gbWluL21heCB3aXRoIGFycmF5CisgIFNjYWxhciBtYXhNMSA9IG0xLm1heENvZWZmKCk7CisgIFNjYWxhciBtaW5NMSA9IG0xLm1pbkNvZWZmKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgbTEuY3dpc2VNaW4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuY3dpc2VNaW4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCBtMS5jd2lzZU1heChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1heE0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMS5jd2lzZU1heChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSkpOworCisgIC8vIG1pbi9tYXggd2l0aCBzY2FsYXIgaW5wdXQKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgbTEuY3dpc2VNaW4oIG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmN3aXNlTWluKG1heE0xKSk7CisgIFZFUklGWV9JU19BUFBST1goLW0xLCAoLW0xKS5jd2lzZU1pbigtbWluTTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtbTEuYXJyYXkoKSwgKCgtbTEpLmFycmF5KCkubWluKSggLW1pbk0xKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1heE0xKSwgbTEuY3dpc2VNYXgoIG1heE0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmN3aXNlTWF4KG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1goLW0xLCAoLW0xKS5jd2lzZU1heCgtbWF4TTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtbTEuYXJyYXkoKSwgKCgtbTEpLmFycmF5KCkubWF4KSgtbWF4TTEpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLmFycmF5KCksIChtMS5hcnJheSgpLm1pbikoIG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSwgKG0xLmFycmF5KCkubWluKSggbWF4TTEpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLmFycmF5KCksIChtMS5hcnJheSgpLm1heCkoIG1heE0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSwgKG0xLmFycmF5KCkubWF4KSggbWluTTEpKTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUcmFpdHM+IHZvaWQgcmVzaXplKGNvbnN0IE1hdHJpeFRyYWl0cyYgdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFRyYWl0czo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBBcnJheTJEVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsRHluYW1pYywxPiBBcnJheTFEVHlwZTsKKworICBJbmRleCByb3dzID0gdC5yb3dzKCksIGNvbHMgPSB0LmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0ocm93cyxjb2xzKTsKKyAgVmVjdG9yVHlwZSB2KHJvd3MpOworICBBcnJheTJEVHlwZSBhMihyb3dzLGNvbHMpOworICBBcnJheTFEVHlwZSBhMShyb3dzKTsKKworICBtLmFycmF5KCkucmVzaXplKHJvd3MrMSxjb2xzKzEpOworICBWRVJJRlkobS5yb3dzKCk9PXJvd3MrMSAmJiBtLmNvbHMoKT09Y29scysxKTsKKyAgYTIubWF0cml4KCkucmVzaXplKHJvd3MrMSxjb2xzKzEpOworICBWRVJJRlkoYTIucm93cygpPT1yb3dzKzEgJiYgYTIuY29scygpPT1jb2xzKzEpOworICB2LmFycmF5KCkucmVzaXplKGNvbHMpOworICBWRVJJRlkodi5zaXplKCk9PWNvbHMpOworICBhMS5tYXRyaXgoKS5yZXNpemUoY29scyk7CisgIFZFUklGWShhMS5zaXplKCk9PWNvbHMpOworfQorCit0ZW1wbGF0ZTxpbnQ+Cit2b2lkIHJlZ3Jlc3Npb25fYnVnXzY1NCgpCit7CisgIEFycmF5WGYgYSA9IFJvd1ZlY3RvclhmKDMpOworICBWZWN0b3JYZiB2ID0gQXJyYXk8ZmxvYXQsMSxEeW5hbWljPigzKTsKK30KKworLy8gQ2hlY2sgcHJvcGFnYXRpb24gb2YgTHZhbHVlQml0IHRocm91Z2ggQXJyYXkvTWF0cml4LVdyYXBwZXIKK3RlbXBsYXRlPGludD4KK3ZvaWQgcmVncnJzc2lvbl9idWdfMTQxMCgpCit7CisgIGNvbnN0IE1hdHJpeDRpIE07CisgIGNvbnN0IEFycmF5NGkgQTsKKyAgQXJyYXlXcmFwcGVyPGNvbnN0IE1hdHJpeDRpPiBNQSA9IE0uYXJyYXkoKTsKKyAgTUEucm93KDApOworICBNYXRyaXhXcmFwcGVyPGNvbnN0IEFycmF5NGk+IEFNID0gQS5tYXRyaXgoKTsKKyAgQU0ucm93KDApOworCisgIFZFUklGWSgoaW50ZXJuYWw6OnRyYWl0czxBcnJheVdyYXBwZXI8Y29uc3QgTWF0cml4NGk+ID46OkZsYWdzJkx2YWx1ZUJpdCk9PTApOworICBWRVJJRlkoKGludGVybmFsOjp0cmFpdHM8TWF0cml4V3JhcHBlcjxjb25zdCBBcnJheTRpPiA+OjpGbGFncyZMdmFsdWVCaXQpPT0wKTsKKworICBWRVJJRlkoKGludGVybmFsOjp0cmFpdHM8QXJyYXlXcmFwcGVyPE1hdHJpeDRpPiA+OjpGbGFncyZMdmFsdWVCaXQpPT1MdmFsdWVCaXQpOworICBWRVJJRlkoKGludGVybmFsOjp0cmFpdHM8TWF0cml4V3JhcHBlcjxBcnJheTRpPiA+OjpGbGFncyZMdmFsdWVCaXQpPT1MdmFsdWVCaXQpOworfQorCit2b2lkIHRlc3RfYXJyYXlfZm9yX21hdHJpeCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYXJyYXlfZm9yX21hdHJpeChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYXJyYXlfZm9yX21hdHJpeChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY29tcGFyaXNvbnMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjb21wYXJpc29ucyhNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjb21wYXJpc29ucyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBjb21wYXJpc29ucyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjb21wYXJpc29ucyhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGN3aXNlX21pbl9tYXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjd2lzZV9taW5fbWF4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGN3aXNlX21pbl9tYXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY3dpc2VfbWluX21heChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjd2lzZV9taW5fbWF4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbHBOb3JtKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbHBOb3JtKFZlY3RvcjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGxwTm9ybShWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF84KCBscE5vcm0oVmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbHBOb3JtKFZlY3RvclhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbHBOb3JtKFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgQ0FMTF9TVUJURVNUXzUoIGxwTm9ybShWZWN0b3JYZigwKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIGxwTm9ybShWZWN0b3JYY2YoMCkpICk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJlc2l6ZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcmVzaXplKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHJlc2l6ZShNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIENBTExfU1VCVEVTVF82KCByZWdyZXNzaW9uX2J1Z182NTQ8MD4oKSApOworICBDQUxMX1NVQlRFU1RfNiggcmVncnJzc2lvbl9idWdfMTQxMDwwPigpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2FycmF5X29mX3N0cmluZy5jcHAgYi90ZXN0L2FycmF5X29mX3N0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzYjdjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXJyYXlfb2Zfc3RyaW5nLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3ZvaWQgdGVzdF9hcnJheV9vZl9zdHJpbmcoKQoreworICB0eXBlZGVmIEFycmF5PHN0ZDo6c3RyaW5nLDEsRHluYW1pYz4gQXJyYXlYczsKKyAgQXJyYXlYcyBhMSgzKSwgYTIoMyksIGEzKDMpLCBhM3JlZigzKTsKKyAgYTEgPDwgIm9uZSIsICJ0d28iLCAidGhyZWUiOworICBhMiA8PCAiMSIsICIyIiwgIjMiOworICBhM3JlZiA8PCAib25lICgxKSIsICJ0d28gKDIpIiwgInRocmVlICgzKSI7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHMxOworICBzMSA8PCBhMTsKKyAgVkVSSUZZX0lTX0VRVUFMKHMxLnN0cigpLCBzdGQ6OnN0cmluZygiICBvbmUgICAgdHdvICB0aHJlZSIpKTsKKyAgYTMgPSBhMSArIHN0ZDo6c3RyaW5nKCIgKCIpICsgYTIgKyBzdGQ6OnN0cmluZygiKSIpOworICBWRVJJRlkoKGEzPT1hM3JlZikuYWxsKCkpOworCisgIGEzID0gYTE7CisgIGEzICs9IHN0ZDo6c3RyaW5nKCIgKCIpICsgYTIgKyBzdGQ6OnN0cmluZygiKSIpOworICBWRVJJRlkoKGEzPT1hM3JlZikuYWxsKCkpOworCisgIGExLnN3YXAoYTMpOworICBWRVJJRlkoKGExPT1hM3JlZikuYWxsKCkpOworICBWRVJJRlkoKGEzIT1hM3JlZikuYWxsKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcnJheV9yZXBsaWNhdGUuY3BwIGIvdGVzdC9hcnJheV9yZXBsaWNhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWM4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FycmF5X3JlcGxpY2F0ZS5jcHAKQEAgLTAsMCArMSw4MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJlcGxpY2F0ZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFJlcGxpY2F0ZS5jcHAKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVmVjdG9yWDsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisKKyAgTWF0cml4WCB4MSwgeDI7CisgIFZlY3RvclggdngxOworCisgIGludCAgZjEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksCisgICAgICAgZjIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCk7CisKKyAgeDEucmVzaXplKHJvd3MqZjEsY29scypmMik7CisgIGZvcihpbnQgaj0wOyBqPGYyOyBqKyspCisgIGZvcihpbnQgaT0wOyBpPGYxOyBpKyspCisgICAgeDEuYmxvY2soaSpyb3dzLGoqY29scyxyb3dzLGNvbHMpID0gbTE7CisgIFZFUklGWV9JU19BUFBST1goeDEsIG0xLnJlcGxpY2F0ZShmMSxmMikpOworCisgIHgyLnJlc2l6ZSgyKnJvd3MsMypjb2xzKTsKKyAgeDIgPDwgbTIsIG0yLCBtMiwKKyAgICAgICAgbTIsIG0yLCBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgKG0yLnRlbXBsYXRlIHJlcGxpY2F0ZTwyLDM+KCkpKTsKKyAgCisgIHgyLnJlc2l6ZShyb3dzLDMqY29scyk7CisgIHgyIDw8IG0yLCBtMiwgbTI7CisgIFZFUklGWV9JU19BUFBST1goeDIsIChtMi50ZW1wbGF0ZSByZXBsaWNhdGU8MSwzPigpKSk7CisgIAorICB2eDEucmVzaXplKDMqcm93cyxjb2xzKTsKKyAgdngxIDw8IG0yLCBtMiwgbTI7CisgIFZFUklGWV9JU19BUFBST1godngxK3Z4MSwgdngxKyhtMi50ZW1wbGF0ZSByZXBsaWNhdGU8MywxPigpKSk7CisgIAorICB2eDE9bTIrKG0yLmNvbHdpc2UoKS5yZXBsaWNhdGUoMSkpOworICAKKyAgaWYobTIuY29scygpPT0xKQorICAgIFZFUklGWV9JU19BUFBST1gobTIuY29lZmYoMCksIChtMi50ZW1wbGF0ZSByZXBsaWNhdGU8MywxPigpLmNvZWZmKG0yLnJvd3MoKSkpKTsKKworICB4Mi5yZXNpemUocm93cyxmMSk7CisgIGZvciAoaW50IGo9MDsgajxmMTsgKytqKQorICAgIHgyLmNvbChqKSA9IHYxOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2MS5yb3d3aXNlKCkucmVwbGljYXRlKGYxKSk7CisKKyAgdngxLnJlc2l6ZShyb3dzKmYyKTsKKyAgZm9yIChpbnQgaj0wOyBqPGYyOyArK2opCisgICAgdngxLnNlZ21lbnQoaipyb3dzLHJvd3MpID0gdjE7CisgIFZFUklGWV9JU19BUFBST1godngxLCB2MS5jb2x3aXNlKCkucmVwbGljYXRlKGYyKSk7Cit9CisKK3ZvaWQgdGVzdF9hcnJheV9yZXBsaWNhdGUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCByZXBsaWNhdGUoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCByZXBsaWNhdGUoVmVjdG9yMmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcmVwbGljYXRlKFZlY3RvcjNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJlcGxpY2F0ZShWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF81KCByZXBsaWNhdGUoVmVjdG9yWGYoMTYpKSApOworICAgIENBTExfU1VCVEVTVF82KCByZXBsaWNhdGUoVmVjdG9yWGNkKDEwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcnJheV9yZXZlcnNlLmNwcCBiL3Rlc3QvYXJyYXlfcmV2ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkOWY5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXJyYXlfcmV2ZXJzZS5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgUmljYXJkIE1hcnhlciA8ZW1haWxAcmljYXJkbWFyeGVyLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcmV2ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMjsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKworICBNYXRyaXhUeXBlIG0xX3IgPSBtMS5yZXZlcnNlKCk7CisgIC8vIFZlcmlmeSB0aGF0IE1hdHJpeEJhc2U6OnJldmVyc2UoKSB3b3JrcworICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7CisgICAgZm9yICggaW50IGogPSAwOyBqIDwgY29sczsgaisrICkgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMV9yKGksIGopLCBtMShyb3dzIC0gMSAtIGksIGNvbHMgLSAxIC0gaikpOworICAgIH0KKyAgfQorCisgIFJldmVyc2U8TWF0cml4VHlwZT4gbTFfcmQobTEpOworICAvLyBWZXJpZnkgdGhhdCBhIFJldmVyc2UgZGVmYXVsdCAoaW4gYm90aCBkaXJlY3Rpb25zKSBvZiBhbiBleHByZXNzaW9uIHdvcmtzCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JkKGksIGopLCBtMShyb3dzIC0gMSAtIGksIGNvbHMgLSAxIC0gaikpOworICAgIH0KKyAgfQorCisgIFJldmVyc2U8TWF0cml4VHlwZSwgQm90aERpcmVjdGlvbnM+IG0xX3JiKG0xKTsKKyAgLy8gVmVyaWZ5IHRoYXQgYSBSZXZlcnNlIGluIGJvdGggZGlyZWN0aW9ucyBvZiBhbiBleHByZXNzaW9uIHdvcmtzCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JiKGksIGopLCBtMShyb3dzIC0gMSAtIGksIGNvbHMgLSAxIC0gaikpOworICAgIH0KKyAgfQorCisgIFJldmVyc2U8TWF0cml4VHlwZSwgVmVydGljYWw+IG0xX3J2KG0xKTsKKyAgLy8gVmVyaWZ5IHRoYXQgYSBSZXZlcnNlIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb25zIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcnYoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgaikpOworICAgIH0KKyAgfQorCisgIFJldmVyc2U8TWF0cml4VHlwZSwgSG9yaXpvbnRhbD4gbTFfcmgobTEpOworICAvLyBWZXJpZnkgdGhhdCBhIFJldmVyc2UgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9ucyBvZiBhbiBleHByZXNzaW9uIHdvcmtzCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JoKGksIGopLCBtMShpLCBjb2xzIC0gMSAtIGopKTsKKyAgICB9CisgIH0KKworICBWZWN0b3JUeXBlIHYxX3IgPSB2MS5yZXZlcnNlKCk7CisgIC8vIFZlcmlmeSB0aGF0IGEgVmVjdG9yVHlwZTo6cmV2ZXJzZSgpIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIFZFUklGWV9JU19BUFBST1godjFfcihpKSwgdjEocm93cyAtIDEgLSBpKSk7CisgIH0KKworICBNYXRyaXhUeXBlIG0xX2NyID0gbTEuY29sd2lzZSgpLnJldmVyc2UoKTsKKyAgLy8gVmVyaWZ5IHRoYXQgUGFydGlhbFJlZHV4OjpyZXZlcnNlKCkgd29ya3MgKGZvciBjb2x3aXNlKCkpCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX2NyKGksIGopLCBtMShyb3dzIC0gMSAtIGksIGopKTsKKyAgICB9CisgIH0KKworICBNYXRyaXhUeXBlIG0xX3JyID0gbTEucm93d2lzZSgpLnJldmVyc2UoKTsKKyAgLy8gVmVyaWZ5IHRoYXQgUGFydGlhbFJlZHV4OjpyZXZlcnNlKCkgd29ya3MgKGZvciByb3d3aXNlKCkpCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JyKGksIGopLCBtMShpLCBjb2xzIC0gMSAtIGopKTsKKyAgICB9CisgIH0KKworICBTY2FsYXIgeCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBtMS5yZXZlcnNlKCkociwgYykgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIG0xKHJvd3MgLSAxIC0gciwgY29scyAtIDEgLSBjKSk7CisgIAorICBtMiA9IG0xOworICBtMi5yZXZlcnNlSW5QbGFjZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xLnJldmVyc2UoKS5ldmFsKCkpOworICAKKyAgbTIgPSBtMTsKKyAgbTIuY29sKDApLnJldmVyc2VJblBsYWNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKDApLG0xLmNvbCgwKS5yZXZlcnNlKCkuZXZhbCgpKTsKKyAgCisgIG0yID0gbTE7CisgIG0yLnJvdygwKS5yZXZlcnNlSW5QbGFjZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdygwKSxtMS5yb3coMCkucmV2ZXJzZSgpLmV2YWwoKSk7CisgIAorICBtMiA9IG0xOworICBtMi5yb3d3aXNlKCkucmV2ZXJzZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMixtMS5yb3d3aXNlKCkucmV2ZXJzZSgpLmV2YWwoKSk7CisgIAorICBtMiA9IG0xOworICBtMi5jb2x3aXNlKCkucmV2ZXJzZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMixtMS5jb2x3aXNlKCkucmV2ZXJzZSgpLmV2YWwoKSk7CisKKyAgbTEuY29sd2lzZSgpLnJldmVyc2UoKShyLCBjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEocm93cyAtIDEgLSByLCBjKSk7CisKKyAgbTEucm93d2lzZSgpLnJldmVyc2UoKShyLCBjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEociwgY29scyAtIDEgLSBjKSk7Cit9CisKK3ZvaWQgdGVzdF9hcnJheV9yZXZlcnNlKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcmV2ZXJzZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHJldmVyc2UoTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcmV2ZXJzZShNYXRyaXg0ZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCByZXZlcnNlKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHJldmVyc2UoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHJldmVyc2UoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggcmV2ZXJzZShNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggcmV2ZXJzZShNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSApOworICAgIENBTExfU1VCVEVTVF85KCByZXZlcnNlKE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMworICBWZWN0b3I0ZiB4OyB4IDw8IDEsIDIsIDMsIDQ7CisgIFZlY3RvcjRmIHk7IHkgPDwgNCwgMywgMiwgMTsKKyAgVkVSSUZZKHgucmV2ZXJzZSgpWzFdID09IDMpOworICBWRVJJRlkoeC5yZXZlcnNlKCkgPT0geSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYmFuZG1hdHJpeC5jcHAgYi90ZXN0L2JhbmRtYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzM4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2JhbmRtYXRyaXguY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFRoaXMgZmlsZSBpcyB0cmlhbmd1bGFyVmlldyBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBiYW5kbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIF9tKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBfbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBfbS5jb2xzKCk7CisgIEluZGV4IHN1cGVycyA9IF9tLnN1cGVycygpOworICBJbmRleCBzdWJzID0gX20uc3VicygpOworCisgIE1hdHJpeFR5cGUgbShyb3dzLGNvbHMsc3VwZXJzLHN1YnMpOworCisgIERlbnNlTWF0cml4VHlwZSBkbTEocm93cyxjb2xzKTsKKyAgZG0xLnNldFplcm8oKTsKKworICBtLmRpYWdvbmFsKCkuc2V0Q29uc3RhbnQoMTIzKTsKKyAgZG0xLmRpYWdvbmFsKCkuc2V0Q29uc3RhbnQoMTIzKTsKKyAgZm9yIChpbnQgaT0xOyBpPD1tLnN1cGVycygpOysraSkKKyAgeworICAgIG0uZGlhZ29uYWwoaSkuc2V0Q29uc3RhbnQoc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSkpOworICAgIGRtMS5kaWFnb25hbChpKS5zZXRDb25zdGFudChzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihpKSk7CisgIH0KKyAgZm9yIChpbnQgaT0xOyBpPD1tLnN1YnMoKTsrK2kpCisgIHsKKyAgICBtLmRpYWdvbmFsKC1pKS5zZXRDb25zdGFudCgtc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSkpOworICAgIGRtMS5kaWFnb25hbCgtaSkuc2V0Q29uc3RhbnQoLXN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkpKTsKKyAgfQorICAvL3N0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cblxuXG4iOworICBWRVJJRllfSVNfQVBQUk9YKGRtMSxtLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgZm9yIChpbnQgaT0wOyBpPGNvbHM7ICsraSkKKyAgeworICAgIG0uY29sKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkrMSkpOworICAgIGRtMS5jb2woaSkuc2V0Q29uc3RhbnQoc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSsxKSk7CisgIH0KKyAgSW5kZXggZCA9IChzdGQ6Om1pbikocm93cyxjb2xzKTsKKyAgSW5kZXggYSA9IHN0ZDo6bWF4PEluZGV4PigwLGNvbHMtZC1zdXBlcnMpOworICBJbmRleCBiID0gc3RkOjptYXg8SW5kZXg+KDAscm93cy1kLXN1YnMpOworICBpZihhPjApIGRtMS5ibG9jaygwLGQrc3VwZXJzLHJvd3MsYSkuc2V0WmVybygpOworICBkbTEuYmxvY2soMCxzdXBlcnMrMSxjb2xzLXN1cGVycy0xLWEsY29scy1zdXBlcnMtMS1hKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgIGRtMS5ibG9jayhzdWJzKzEsMCxyb3dzLXN1YnMtMS1iLHJvd3Mtc3Vicy0xLWIpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNldFplcm8oKTsKKyAgaWYoYj4wKSBkbTEuYmxvY2soZCtzdWJzLDAsYixjb2xzKS5zZXRaZXJvKCk7CisgIC8vc3RkOjpjZXJyIDw8IG0ubV9kYXRhIDw8ICJcblxuIiA8PCBtLnRvRGVuc2UoKSA8PCAiXG5cbiIgPDwgZG0xIDw8ICJcblxuIjsKKyAgVkVSSUZZX0lTX0FQUFJPWChkbTEsbS50b0RlbnNlTWF0cml4KCkpOworCit9CisKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6QmFuZE1hdHJpeDsKKwordm9pZCB0ZXN0X2JhbmRtYXRyaXgoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgMTAqZ19yZXBlYXQgOyBpKyspIHsKKyAgICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCk7CisgICAgSW5kZXggY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTApOworICAgIEluZGV4IHN1cHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgICAgSW5kZXggc3VicyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgICBDQUxMX1NVQlRFU1QoYmFuZG1hdHJpeChCYW5kTWF0cml4PGZsb2F0Pihyb3dzLGNvbHMsc3VwcyxzdWJzKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9iYXNpY3N0dWZmLmNwcCBiL3Rlc3QvYmFzaWNzdHVmZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkOTFmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYmFzaWNzdHVmZi5jcHAKQEAgLTAsMCArMSwyODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBiYXNpY1N0dWZmKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFNxdWFyZU1hdHJpeFR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+OjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdnplcm8gPSBWZWN0b3JUeXBlOjpaZXJvKHJvd3MpOworICBTcXVhcmVNYXRyaXhUeXBlIHNtMSA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLHJvd3MpLCBzbTIocm93cyxyb3dzKTsKKworICBTY2FsYXIgeCA9IDA7CisgIHdoaWxlKHggPT0gU2NhbGFyKDApKSB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIG0xLmNvZWZmUmVmKHIsYykgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIG0xLmNvZWZmKHIsYykpOworICBtMShyLGMpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMShyLGMpKTsKKyAgdjEuY29lZmZSZWYocikgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHYxLmNvZWZmKHIpKTsKKyAgdjEocikgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHYxKHIpKTsKKyAgdjFbcl0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHYxW3JdKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIHYxLCAgICB2MSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKCAgICAgICAgICAgdjEsICAgIDIqdjEpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oICAgIHZ6ZXJvLCB2MSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggIHZ6ZXJvLCB2MS5zcXVhcmVkTm9ybSgpKTsKKyAgVkVSSUZZX0lTX05PVF9NVUNIX1NNQUxMRVJfVEhBTih2MSwgICAgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIHZ6ZXJvLCB2MS12MSk7CisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgbTEsICAgIG0xKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICBtMSwgICAgMiptMSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggICAgbXplcm8sIG0xKTsKKyAgVkVSSUZZX0lTX05PVF9NVUNIX1NNQUxMRVJfVEhBTihtMSwgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIG16ZXJvLCBtMS1tMSk7CisKKyAgLy8gYWx3YXlzIHRlc3Qgb3BlcmF0b3IoKSBvbiBlYWNoIHJlYWQtb25seSBleHByZXNzaW9uIGNsYXNzLAorICAvLyBpbiBvcmRlciB0byBjaGVjayBjb25zdC1xdWFsaWZpZXJzLgorICAvLyBpbmRlZWQsIGlmIGFuIGV4cHJlc3Npb24gY2xhc3MgKGhlcmUgWmVybykgaXMgbWVhbnQgdG8gYmUgcmVhZC1vbmx5LAorICAvLyBoZW5jZSBoYXMgbm8gX3dyaXRlKCkgbWV0aG9kLCB0aGUgY29ycmVzcG9uZGluZyBNYXRyaXhCYXNlIG1ldGhvZCAoaGVyZSB6ZXJvKCkpCisgIC8vIHNob3VsZCByZXR1cm4gYSBjb25zdC1xdWFsaWZpZWQgb2JqZWN0IHNvIHRoYXQgaXQgaXMgdGhlIGNvbnN0LXF1YWxpZmllZAorICAvLyBvcGVyYXRvcigpIHRoYXQgZ2V0cyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgX3JlYWQoKS4KKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKworICAvLyBub3cgdGVzdCBjb3B5aW5nIGEgcm93LXZlY3RvciBpbnRvIGEgKGNvbHVtbi0pdmVjdG9yIGFuZCBjb252ZXJzZWx5LgorICBzcXVhcmUuY29sKHIpID0gc3F1YXJlLnJvdyhyKS5ldmFsKCk7CisgIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBydihyb3dzKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IGN2KHJvd3MpOworICBydiA9IHNxdWFyZS5yb3cocik7CisgIGN2ID0gc3F1YXJlLmNvbChyKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gocnYsIGN2LnRyYW5zcG9zZSgpKTsKKworICBpZihjb2xzIT0xICYmIHJvd3MhPTEgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSA9IChtMi5ibG9jaygwLDAsIHJvd3MtMSwgY29scy0xKSkpOworICB9CisKKyAgaWYoY29scyE9MSAmJiByb3dzIT0xKQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTFbMF0pOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtMSttMSlbMF0pOworICB9CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IG0xLG0xKTsKKyAgTWF0cml4VHlwZSBtNDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0xLG0xKTsKKworICBtMy5yZWFsKCkgPSBtMS5yZWFsKCk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMSkucmVhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTMpLnJlYWwoKSwgbTEucmVhbCgpKTsKKworICAvLyBjaGVjayA9PSAvICE9IG9wZXJhdG9ycworICBWRVJJRlkobTE9PW0xKTsKKyAgVkVSSUZZKG0xIT1tMik7CisgIFZFUklGWSghKG0xPT1tMikpOworICBWRVJJRlkoIShtMSE9bTEpKTsKKyAgbTEgPSBtMjsKKyAgVkVSSUZZKG0xPT1tMik7CisgIFZFUklGWSghKG0xIT1tMikpOworICAKKyAgLy8gY2hlY2sgYXV0b21hdGljIHRyYW5zcG9zaXRpb24KKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkgPSBzbTEucm93KGkpOworICBWRVJJRllfSVNfQVBQUk9YKHNtMixzbTEudHJhbnNwb3NlKCkpOworICAKKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkubm9hbGlhcygpID0gc20xLnJvdyhpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzbTIsc20xLnRyYW5zcG9zZSgpKTsKKyAgCisgIHNtMi5zZXRaZXJvKCk7CisgIGZvcih0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpPTA7aTxyb3dzOysraSkKKyAgICBzbTIuY29sKGkpLm5vYWxpYXMoKSArPSBzbTEucm93KGkpOworICBWRVJJRllfSVNfQVBQUk9YKHNtMixzbTEudHJhbnNwb3NlKCkpOworICAKKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkubm9hbGlhcygpIC09IHNtMS5yb3coaSk7CisgIFZFUklGWV9JU19BUFBST1goc20yLC1zbTEudHJhbnNwb3NlKCkpOworICAKKyAgLy8gY2hlY2sgdGVybmFyeSB1c2FnZQorICB7CisgICAgYm9vbCBiID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMTApPjU7CisgICAgbTMgPSBiID8gbTEgOiBtMjsKKyAgICBpZihiKSBWRVJJRllfSVNfQVBQUk9YKG0zLG0xKTsKKyAgICBlbHNlICBWRVJJRllfSVNfQVBQUk9YKG0zLG0yKTsKKyAgICBtMyA9IGIgPyAtbTEgOiBtMjsKKyAgICBpZihiKSBWRVJJRllfSVNfQVBQUk9YKG0zLC1tMSk7CisgICAgZWxzZSAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMik7CisgICAgbTMgPSBiID8gbTEgOiAtbTI7CisgICAgaWYoYikgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisgICAgZWxzZSAgVkVSSUZZX0lTX0FQUFJPWChtMywtbTIpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYmFzaWNTdHVmZkNvbXBsZXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUmVhbE1hdHJpeFR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIFZFUklGWShudW1leHQ6OnJlYWwoczEpPT1udW1leHQ6OnJlYWxfcmVmKHMxKSk7CisgIFZFUklGWShudW1leHQ6OmltYWcoczEpPT1udW1leHQ6OmltYWdfcmVmKHMxKSk7CisgIG51bWV4dDo6cmVhbF9yZWYoczEpID0gbnVtZXh0OjpyZWFsKHMyKTsKKyAgbnVtZXh0OjppbWFnX3JlZihzMSkgPSBudW1leHQ6OmltYWcoczIpOworICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHMxLCBzMiwgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpKTsKKyAgLy8gZXh0ZW5kZWQgcHJlY2lzaW9uIGluIEludGVsIEZQVXMgbWVhbnMgdGhhdCBzMSA9PSBzMiBpbiB0aGUgbGluZSBhYm92ZSBpcyBub3QgZ3VhcmFudGVlZC4KKworICBSZWFsTWF0cml4VHlwZSBybTEgPSBSZWFsTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksCisgICAgICAgICAgICAgICAgIHJtMiA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBjbShyb3dzLGNvbHMpOworICBjbS5yZWFsKCkgPSBybTE7CisgIGNtLmltYWcoKSA9IHJtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLnJlYWwoKSwgcm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLmltYWcoKSwgcm0yKTsKKyAgcm0xLnNldFplcm8oKTsKKyAgcm0yLnNldFplcm8oKTsKKyAgcm0xID0gY20ucmVhbCgpOworICBybTIgPSBjbS5pbWFnKCk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KGNtKS5yZWFsKCksIHJtMSk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KGNtKS5pbWFnKCksIHJtMik7CisgIGNtLnJlYWwoKS5zZXRaZXJvKCk7CisgIFZFUklGWShzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLnJlYWwoKS5pc1plcm8oKSk7CisgIFZFUklGWSghc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KGNtKS5pbWFnKCkuaXNaZXJvKCkpOworfQorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzIKK3ZvaWQgY2FzdGluZygpCit7CisgIE1hdHJpeDRmIG0gPSBNYXRyaXg0Zjo6UmFuZG9tKCksIG0yOworICBNYXRyaXg0ZCBuID0gbS5jYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZKG0uaXNBcHByb3gobi5jYXN0PGZsb2F0PigpKSk7CisgIG0yID0gbS5jYXN0PGZsb2F0PigpOyAvLyBjaGVjayB0aGUgc3BlY2lhbGl6YXRpb24gd2hlbiBOZXdUeXBlID09IFR5cGUKKyAgVkVSSUZZKG0uaXNBcHByb3gobTIpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb24oKQoreworICBTY2FsYXIgcmF3WzRdOworICBmb3IoaW50IGs9MDsgazw0OyArK2spCisgICAgcmF3W2tdID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIAorICB7CisgICAgTWF0cml4PFNjYWxhciw0LDE+IG0ocmF3KTsKKyAgICBBcnJheTxTY2FsYXIsNCwxPiBhKHJhdyk7CisgICAgZm9yKGludCBrPTA7IGs8NDsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvcihpbnQgaz0wOyBrPDQ7ICsraykgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsgICAgCisgICAgVkVSSUZZX0lTX0VRVUFMKG0sKE1hdHJpeDxTY2FsYXIsNCwxPihyYXdbMF0scmF3WzFdLHJhd1syXSxyYXdbM10pKSk7CisgICAgVkVSSUZZKChhPT0oQXJyYXk8U2NhbGFyLDQsMT4ocmF3WzBdLHJhd1sxXSxyYXdbMl0scmF3WzNdKSkpLmFsbCgpKTsKKyAgfQorICB7CisgICAgTWF0cml4PFNjYWxhciwzLDE+IG0ocmF3KTsKKyAgICBBcnJheTxTY2FsYXIsMywxPiBhKHJhdyk7CisgICAgZm9yKGludCBrPTA7IGs8MzsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvcihpbnQgaz0wOyBrPDM7ICsraykgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSwoTWF0cml4PFNjYWxhciwzLDE+KHJhd1swXSxyYXdbMV0scmF3WzJdKSkpOworICAgIFZFUklGWSgoYT09QXJyYXk8U2NhbGFyLDMsMT4ocmF3WzBdLHJhd1sxXSxyYXdbMl0pKS5hbGwoKSk7CisgIH0KKyAgeworICAgIE1hdHJpeDxTY2FsYXIsMiwxPiBtKHJhdyksIG0yKCAoRGVuc2VJbmRleChyYXdbMF0pKSwgKERlbnNlSW5kZXgocmF3WzFdKSkgKTsKKyAgICBBcnJheTxTY2FsYXIsMiwxPiBhKHJhdyksICBhMiggKERlbnNlSW5kZXgocmF3WzBdKSksIChEZW5zZUluZGV4KHJhd1sxXSkpICk7CisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSwoTWF0cml4PFNjYWxhciwyLDE+KHJhd1swXSxyYXdbMV0pKSk7CisgICAgVkVSSUZZKChhPT1BcnJheTxTY2FsYXIsMiwxPihyYXdbMF0scmF3WzFdKSkuYWxsKCkpOworICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKG0yKGspID09IERlbnNlSW5kZXgocmF3W2tdKSk7CisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkoYTIoaykgPT0gRGVuc2VJbmRleChyYXdba10pKTsKKyAgfQorICB7CisgICAgTWF0cml4PFNjYWxhciwxLDI+IG0ocmF3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbTIoIChEZW5zZUluZGV4KHJhd1swXSkpLCAoRGVuc2VJbmRleChyYXdbMV0pKSApLAorICAgICAgICAgICAgICAgICAgICAgICBtMyggKGludChyYXdbMF0pKSwgKGludChyYXdbMV0pKSApLAorICAgICAgICAgICAgICAgICAgICAgICBtNCggKGZsb2F0KHJhd1swXSkpLCAoZmxvYXQocmF3WzFdKSkgKTsKKyAgICBBcnJheTxTY2FsYXIsMSwyPiBhKHJhdyksICBhMiggKERlbnNlSW5kZXgocmF3WzBdKSksIChEZW5zZUluZGV4KHJhd1sxXSkpICk7CisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSwoTWF0cml4PFNjYWxhciwxLDI+KHJhd1swXSxyYXdbMV0pKSk7CisgICAgVkVSSUZZKChhPT1BcnJheTxTY2FsYXIsMSwyPihyYXdbMF0scmF3WzFdKSkuYWxsKCkpOworICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKG0yKGspID09IERlbnNlSW5kZXgocmF3W2tdKSk7CisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkoYTIoaykgPT0gRGVuc2VJbmRleChyYXdba10pKTsKKyAgICBmb3IoaW50IGs9MDsgazwyOyArK2spIFZFUklGWShtMyhrKSA9PSBpbnQocmF3W2tdKSk7CisgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkoKG00KGspKSA9PSBTY2FsYXIoZmxvYXQocmF3W2tdKSkpOworICB9CisgIHsKKyAgICBNYXRyaXg8U2NhbGFyLDEsMT4gbShyYXcpLCBtMShyYXdbMF0pLCBtMiggKERlbnNlSW5kZXgocmF3WzBdKSkgKSwgbTMoIChpbnQocmF3WzBdKSkgKTsKKyAgICBBcnJheTxTY2FsYXIsMSwxPiBhKHJhdyksIGExKHJhd1swXSksIGEyKCAoRGVuc2VJbmRleChyYXdbMF0pKSApOworICAgIFZFUklGWShtKDApID09IHJhd1swXSk7CisgICAgVkVSSUZZKGEoMCkgPT0gcmF3WzBdKTsKKyAgICBWRVJJRlkobTEoMCkgPT0gcmF3WzBdKTsKKyAgICBWRVJJRlkoYTEoMCkgPT0gcmF3WzBdKTsKKyAgICBWRVJJRlkobTIoMCkgPT0gRGVuc2VJbmRleChyYXdbMF0pKTsKKyAgICBWRVJJRlkoYTIoMCkgPT0gRGVuc2VJbmRleChyYXdbMF0pKTsKKyAgICBWRVJJRlkobTMoMCkgPT0gaW50KHJhd1swXSkpOworICAgIFZFUklGWV9JU19FUVVBTChtLChNYXRyaXg8U2NhbGFyLDEsMT4ocmF3WzBdKSkpOworICAgIFZFUklGWSgoYT09QXJyYXk8U2NhbGFyLDEsMT4ocmF3WzBdKSkuYWxsKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9iYXNpY3N0dWZmKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYmFzaWNTdHVmZihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGJhc2ljU3R1ZmYoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggYmFzaWNTdHVmZihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYmFzaWNTdHVmZihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBiYXNpY1N0dWZmKE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBiYXNpY1N0dWZmKE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGJhc2ljU3R1ZmYoTWF0cml4PGxvbmcgZG91YmxlLER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIGJhc2ljU3R1ZmZDb21wbGV4KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBiYXNpY1N0dWZmQ29tcGxleChNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorCisgIENBTExfU1VCVEVTVF8xKGZpeGVkU2l6ZU1hdHJpeENvbnN0cnVjdGlvbjx1bnNpZ25lZCBjaGFyPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEoZml4ZWRTaXplTWF0cml4Q29uc3RydWN0aW9uPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzEoZml4ZWRTaXplTWF0cml4Q29uc3RydWN0aW9uPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8xKGZpeGVkU2l6ZU1hdHJpeENvbnN0cnVjdGlvbjxpbnQ+KCkpOworICBDQUxMX1NVQlRFU1RfMShmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb248bG9uZyBpbnQ+KCkpOworICBDQUxMX1NVQlRFU1RfMShmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb248c3RkOjpwdHJkaWZmX3Q+KCkpOworCisgIENBTExfU1VCVEVTVF8yKGNhc3RpbmcoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2JkY3N2ZC5jcHAgYi90ZXN0L2JkY3N2ZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmNjg3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYmRjc3ZkLmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgR2F1dGhpZXIgQnJ1biA8YnJ1bi5nYXV0aGllckBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgTmljb2xhcyBDYXJyZSA8bmljb2xhcy5jYXJyZUBlbnNpbWFnLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIEplYW4gQ2VjY2F0byA8amVhbi5jZWNjYXRvQGVuc2ltYWcuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgUGllcnJlIFpvcHBpdGVsbGkgPHBpZXJyZS56b3BwaXRlbGxpQGVuc2ltYWcuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvCisKKy8vIGRpc2NhcmQgc3RhY2sgYWxsb2NhdGlvbiBhcyB0aGF0IHRvbyBieXBhc3NlcyBtYWxsb2MKKyNkZWZpbmUgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCAwCisjZGVmaW5lIEVJR0VOX1JVTlRJTUVfTk9fTUFMTE9DCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCisKKyNkZWZpbmUgU1ZEX0RFRkFVTFQoTSkgQkRDU1ZEPE0+CisjZGVmaW5lIFNWRF9GT1JfTUlOX05PUk0oTSkgQkRDU1ZEPE0+CisjaW5jbHVkZSAic3ZkX2NvbW1vbi5oIgorCisvLyBDaGVjayBhbGwgdmFyaWFudHMgb2YgSmFjb2JpU1ZECit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBiZGNzdmQoY29uc3QgTWF0cml4VHlwZSYgYSA9IE1hdHJpeFR5cGUoKSwgYm9vbCBwaWNrcmFuZG9tID0gdHJ1ZSkKK3sKKyAgTWF0cml4VHlwZSBtID0gYTsKKyAgaWYocGlja3JhbmRvbSkKKyAgICBzdmRfZmlsbF9yYW5kb20obSk7CisKKyAgQ0FMTF9TVUJURVNUKCggc3ZkX3Rlc3RfYWxsX2NvbXB1dGF0aW9uX29wdGlvbnM8QkRDU1ZEPE1hdHJpeFR5cGU+ID4obSwgZmFsc2UpICApKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgYmRjc3ZkX21ldGhvZCgpCit7CisgIGVudW0geyBTaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIFNpemUsIDE+IFJlYWxWZWNUeXBlOworICBNYXRyaXhUeXBlIG0gPSBNYXRyaXhUeXBlOjpJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0uYmRjU3ZkKCkuc2luZ3VsYXJWYWx1ZXMoKSwgUmVhbFZlY1R5cGU6Ok9uZXMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0uYmRjU3ZkKCkubWF0cml4VSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5iZGNTdmQoKS5tYXRyaXhWKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0uYmRjU3ZkKENvbXB1dGVGdWxsVXxDb21wdXRlRnVsbFYpLnNvbHZlKG0pLCBtKTsKK30KKworLy8gY29tcGFyZSB0aGUgU2luZ3VsYXIgdmFsdWVzIHJldHVybmVkIHdpdGggSmFjb2JpIGFuZCBCZGMKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IAordm9pZCBjb21wYXJlX2JkY19qYWNvYmkoY29uc3QgTWF0cml4VHlwZSYgYSA9IE1hdHJpeFR5cGUoKSwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyA9IDApCit7CisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShhLnJvd3MoKSwgYS5jb2xzKCkpOworICBCRENTVkQ8TWF0cml4VHlwZT4gYmRjX3N2ZChtKTsKKyAgSmFjb2JpU1ZEPE1hdHJpeFR5cGU+IGphY29iaV9zdmQobSk7CisgIFZFUklGWV9JU19BUFBST1goYmRjX3N2ZC5zaW5ndWxhclZhbHVlcygpLCBqYWNvYmlfc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBpZihjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlRnVsbFUpIFZFUklGWV9JU19BUFBST1goYmRjX3N2ZC5tYXRyaXhVKCksIGphY29iaV9zdmQubWF0cml4VSgpKTsKKyAgaWYoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZVRoaW5VKSBWRVJJRllfSVNfQVBQUk9YKGJkY19zdmQubWF0cml4VSgpLCBqYWNvYmlfc3ZkLm1hdHJpeFUoKSk7CisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVGdWxsVikgVkVSSUZZX0lTX0FQUFJPWChiZGNfc3ZkLm1hdHJpeFYoKSwgamFjb2JpX3N2ZC5tYXRyaXhWKCkpOworICBpZihjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblYpIFZFUklGWV9JU19BUFBST1goYmRjX3N2ZC5tYXRyaXhWKCksIGphY29iaV9zdmQubWF0cml4VigpKTsKK30KKwordm9pZCB0ZXN0X2JkY3N2ZCgpCit7CisgIENBTExfU1VCVEVTVF8zKCggc3ZkX3ZlcmlmeV9hc3NlcnQ8QkRDU1ZEPE1hdHJpeDNmPiAgPihNYXRyaXgzZigpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzQoKCBzdmRfdmVyaWZ5X2Fzc2VydDxCRENTVkQ8TWF0cml4NGQ+ICA+KE1hdHJpeDRkKCkpICkpOworICBDQUxMX1NVQlRFU1RfNygoIHN2ZF92ZXJpZnlfYXNzZXJ0PEJEQ1NWRDxNYXRyaXhYZj4gID4oTWF0cml4WGYoMTAsMTIpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBzdmRfdmVyaWZ5X2Fzc2VydDxCRENTVkQ8TWF0cml4WGNkPiA+KE1hdHJpeFhjZCg3LDUpKSApKTsKKyAgCisgIENBTExfU1VCVEVTVF8xMDEoKCBzdmRfYWxsX3RyaXZpYWxfMngyKGJkY3N2ZDxNYXRyaXgyY2Q+KSApKTsKKyAgQ0FMTF9TVUJURVNUXzEwMigoIHN2ZF9hbGxfdHJpdmlhbF8yeDIoYmRjc3ZkPE1hdHJpeDJkPikgKSk7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMygoIGJkY3N2ZDxNYXRyaXgzZj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoIGJkY3N2ZDxNYXRyaXg0ZD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGJkY3N2ZDxNYXRyaXg8ZmxvYXQsMyw1PiA+KCkgKSk7CisKKyAgICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFLzIpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgCisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShyKQorICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoYykKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfNigoICBiZGNzdmQoTWF0cml4PGRvdWJsZSxEeW5hbWljLDI+KHIsMikpICkpOworICAgIENBTExfU1VCVEVTVF83KCggIGJkY3N2ZChNYXRyaXhYZihyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoICBjb21wYXJlX2JkY19qYWNvYmkoTWF0cml4WGYocixjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwKCggYmRjc3ZkKE1hdHJpeFhkKHIsYykpICkpOworICAgIENBTExfU1VCVEVTVF8xMCgoIGNvbXBhcmVfYmRjX2phY29iaShNYXRyaXhYZChyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfOCgoICBiZGNzdmQoTWF0cml4WGNkKHIsYykpICkpOworICAgIENBTExfU1VCVEVTVF84KCggIGNvbXBhcmVfYmRjX2phY29iaShNYXRyaXhYY2QocixjKSkgKSk7CisKKyAgICAvLyBUZXN0IG9uIGluZi9uYW4gbWF0cml4CisgICAgQ0FMTF9TVUJURVNUXzcoICAoc3ZkX2luZl9uYW48QkRDU1ZEPE1hdHJpeFhmPiwgTWF0cml4WGY+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEwKCAoc3ZkX2luZl9uYW48QkRDU1ZEPE1hdHJpeFhkPiwgTWF0cml4WGQ+KCkpICk7CisgIH0KKworICAvLyB0ZXN0IG1hdHJpeGJhc2UgbWV0aG9kCisgIENBTExfU1VCVEVTVF8xKCggYmRjc3ZkX21ldGhvZDxNYXRyaXgyY2Q+KCkgKSk7CisgIENBTExfU1VCVEVTVF8zKCggYmRjc3ZkX21ldGhvZDxNYXRyaXgzZj4oKSApKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzcoIEJEQ1NWRDxNYXRyaXhYZj4oMTAsMTApICk7CisKKyAgLy8gQ2hlY2sgdGhhdCBwcmVhbGxvY2F0aW9uIGF2b2lkcyBzdWJzZXF1ZW50IG1hbGxvY3MKKyAgQ0FMTF9TVUJURVNUXzkoIHN2ZF9wcmVhbGxvY2F0ZTx2b2lkPigpICk7CisKKyAgQ0FMTF9TVUJURVNUXzIoIHN2ZF91bmRlcm92ZXJmbG93PHZvaWQ+KCkgKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9iaWNnc3RhYi5jcHAgYi90ZXN0L2JpY2dzdGFiLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2MwZGQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9iaWNnc3RhYi5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlTGluZWFyU29sdmVycz4KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgST4gdm9pZCB0ZXN0X2JpY2dzdGFiX1QoKQoreworICBCaUNHU1RBQjxTcGFyc2VNYXRyaXg8VCwwLEk+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gICAgIGJpY2dzdGFiX2NvbG1ham9yX2RpYWc7CisgIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxULDAsST4sIElkZW50aXR5UHJlY29uZGl0aW9uZXIgICAgPiAgICAgYmljZ3N0YWJfY29sbWFqb3JfSTsKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQsMCxJPiwgSW5jb21wbGV0ZUxVVDxULEk+ID4gICAgICAgICAgICAgIGJpY2dzdGFiX2NvbG1ham9yX2lsdXQ7CisgIC8vQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgYmljZ3N0YWJfY29sbWFqb3Jfc3NvcjsKKworICBiaWNnc3RhYl9jb2xtYWpvcl9kaWFnLnNldFRvbGVyYW5jZShOdW1UcmFpdHM8VD46OmVwc2lsb24oKSo0KTsKKyAgYmljZ3N0YWJfY29sbWFqb3JfaWx1dC5zZXRUb2xlcmFuY2UoTnVtVHJhaXRzPFQ+OjplcHNpbG9uKCkqNCk7CisgIAorICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYl9jb2xtYWpvcl9kaWFnKSAgKTsKKy8vICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFiX2NvbG1ham9yX2lsdXQpICAgICApOworICAvL0NBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFiX2NvbG1ham9yX3Nzb3IpICAgICApOworfQorCit2b2lkIHRlc3RfYmljZ3N0YWIoKQoreworICBDQUxMX1NVQlRFU1RfMSgodGVzdF9iaWNnc3RhYl9UPGRvdWJsZSxpbnQ+KCkpICk7CisgIENBTExfU1VCVEVTVF8yKCh0ZXN0X2JpY2dzdGFiX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMygodGVzdF9iaWNnc3RhYl9UPGRvdWJsZSxsb25nIGludD4oKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9ibG9jay5jcHAgYi90ZXN0L2Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU2NWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ibG9jay5jcHAKQEAgLTAsMCArMSwyNzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQgLy8gb3RoZXJ3aXNlIHdlIGZhaWwgYXQgY29tcGlsZSB0aW1lIG9uIHVudXNlZCBwYXRocworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFNjYWxhcj4KK3R5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6ZW5hYmxlX2lmPCFOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6SXNDb21wbGV4LHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OnR5cGUKK2Jsb2NrX3JlYWxfb25seShjb25zdCBNYXRyaXhUeXBlICZtMSwgSW5kZXggcjEsIEluZGV4IHIyLCBJbmRleCBjMSwgSW5kZXggYzIsIGNvbnN0IFNjYWxhciYgczEpIHsKKyAgLy8gY2hlY2sgY3dpc2UtRnVuY3Rpb25zOgorICBWRVJJRllfSVNfQVBQUk9YKG0xLnJvdyhyMSkuY3dpc2VNYXgoczEpLCBtMS5jd2lzZU1heChzMSkucm93KHIxKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMxKS5jd2lzZU1pbihzMSksIG0xLmN3aXNlTWluKHMxKS5jb2woYzEpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkuY3dpc2VNaW4oczEpLCBtMS5jd2lzZU1pbihzMSkuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5jd2lzZU1heChzMSksIG0xLmN3aXNlTWF4KHMxKS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpKTsKKyAgCisgIHJldHVybiBTY2FsYXIoMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXI+Cit0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OmVuYWJsZV9pZjxOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6SXNDb21wbGV4LHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OnR5cGUKK2Jsb2NrX3JlYWxfb25seShjb25zdCBNYXRyaXhUeXBlICYsIEluZGV4LCBJbmRleCwgSW5kZXgsIEluZGV4LCBjb25zdCBTY2FsYXImKSB7CisgIHJldHVybiBTY2FsYXIoMCk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBibG9jayhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IER5bmFtaWNNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IER5bmFtaWNWZWN0b3JUeXBlOworICAKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMV9jb3B5ID0gbTEsCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgb25lcyA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggcjEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgIEluZGV4IHIyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4ocjEscm93cy0xKTsKKyAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgIEluZGV4IGMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzEsY29scy0xKTsKKworICBibG9ja19yZWFsX29ubHkobTEsIHIxLCByMiwgYzEsIGMxLCBzMSk7CisKKyAgLy9jaGVjayByb3coKSBhbmQgY29sKCkKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLmNvbChjMSkudHJhbnNwb3NlKCksIG0xLnRyYW5zcG9zZSgpLnJvdyhjMSkpOworICAvL2NoZWNrIG9wZXJhdG9yKCksIGJvdGggY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudCwgb24gcm93KCkgYW5kIGNvbCgpCisgIG0xID0gbTFfY29weTsKKyAgbTEucm93KHIxKSArPSBzMSAqIG0xX2NvcHkucm93KHIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocjEpLCBtMV9jb3B5LnJvdyhyMSkgKyBzMSAqIG0xX2NvcHkucm93KHIyKSk7CisgIC8vIGNoZWNrIG5lc3RlZCBibG9jayB4cHIgb24gbGhzCisgIG0xLnJvdyhyMSkucm93KDApICs9IHMxICogbTFfY29weS5yb3cocjIpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnJvdyhyMSksIG0xX2NvcHkucm93KHIxKSArIFNjYWxhcigyKSAqIHMxICogbTFfY29weS5yb3cocjIpKTsKKyAgbTEgPSBtMV9jb3B5OworICBtMS5jb2woYzEpICs9IHMxICogbTFfY29weS5jb2woYzIpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjMSksIG0xX2NvcHkuY29sKGMxKSArIHMxICogbTFfY29weS5jb2woYzIpKTsKKyAgbTEuY29sKGMxKS5jb2woMCkgKz0gczEgKiBtMV9jb3B5LmNvbChjMik7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMxKSwgbTFfY29weS5jb2woYzEpICsgU2NhbGFyKDIpICogczEgKiBtMV9jb3B5LmNvbChjMikpOworICAKKyAgCisgIC8vY2hlY2sgYmxvY2soKQorICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gYjEoMSwxKTsgYjEoMCwwKSA9IG0xKHIxLGMxKTsKKworICBSb3dWZWN0b3JUeXBlIGJyMShtMS5ibG9jayhyMSwwLDEsY29scykpOworICBWZWN0b3JUeXBlIGJjMShtMS5ibG9jaygwLGMxLHJvd3MsMSkpOworICBWRVJJRllfSVNfRVFVQUwoYjEsIG0xLmJsb2NrKHIxLGMxLDEsMSkpOworICBWRVJJRllfSVNfRVFVQUwobTEucm93KHIxKSwgYnIxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLmNvbChjMSksIGJjMSk7CisgIC8vY2hlY2sgb3BlcmF0b3IoKSwgYm90aCBjb25zdGFudCBhbmQgbm9uLWNvbnN0YW50LCBvbiBibG9jaygpCisgIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkgPSBzMSAqIG0yLmJsb2NrKDAsIDAsIHIyLXIxKzEsYzItYzErMSk7CisgIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkocjItcjEsYzItYzEpID0gbTIuYmxvY2soMCwgMCwgcjItcjErMSxjMi1jMSsxKSgwLDApOworCisgIGVudW0geworICAgIEJsb2NrUm93cyA9IDIsCisgICAgQmxvY2tDb2xzID0gNQorICB9OworICBpZiAocm93cz49NSAmJiBjb2xzPj04KQorICB7CisgICAgLy8gdGVzdCBmaXhlZCBibG9jaygpIGFzIGx2YWx1ZQorICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxCbG9ja0NvbHM+KDEsMSkgKj0gczE7CisgICAgLy8gdGVzdCBvcGVyYXRvcigpIG9uIGZpeGVkIGJsb2NrKCkgYm90aCBhcyBjb25zdGFudCBhbmQgbm9uLWNvbnN0YW50CisgICAgbTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLEJsb2NrQ29scz4oMSwxKSgwLCAzKSA9IG0xLnRlbXBsYXRlIGJsb2NrPDIsNT4oMSwxKSgxLDIpOworICAgIC8vIGNoZWNrIHRoYXQgZml4ZWQgYmxvY2soKSBhbmQgYmxvY2soKSBhZ3JlZQorICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBiID0gbTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLEJsb2NrQ29scz4oMywzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYiwgbTEuYmxvY2soMywzLEJsb2NrUm93cyxCbG9ja0NvbHMpKTsKKworICAgIC8vIHNhbWUgdGVzdHMgd2l0aCBtaXhlZCBmaXhlZC9keW5hbWljIHNpemUKKyAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsRHluYW1pYz4oMSwxLEJsb2NrUm93cyxCbG9ja0NvbHMpICo9IHMxOworICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxEeW5hbWljPigxLDEsQmxvY2tSb3dzLEJsb2NrQ29scykoMCwzKSA9IG0xLnRlbXBsYXRlIGJsb2NrPDIsNT4oMSwxKSgxLDIpOworICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBiMiA9IG0xLnRlbXBsYXRlIGJsb2NrPER5bmFtaWMsQmxvY2tDb2xzPigzLDMsMiw1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYjIsIG0xLmJsb2NrKDMsMyxCbG9ja1Jvd3MsQmxvY2tDb2xzKSk7CisgIH0KKworICBpZiAocm93cz4yKQorICB7CisgICAgLy8gdGVzdCBzdWIgdmVjdG9ycworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLmJsb2NrKDAsMCwyLDEpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgaGVhZDwyPigpLCB2MS5oZWFkKDIpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgaGVhZDwyPigpLCB2MS5zZWdtZW50KDAsMikpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLnRlbXBsYXRlIHNlZ21lbnQ8Mj4oMCkpOworICAgIEluZGV4IGkgPSByb3dzLTI7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIHRhaWw8Mj4oKSwgdjEuYmxvY2soaSwwLDIsMSkpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnRhaWwoMikpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnNlZ21lbnQoaSwyKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIHRhaWw8Mj4oKSwgdjEudGVtcGxhdGUgc2VnbWVudDwyPihpKSk7CisgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0yKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEuc2VnbWVudChpLDIpLCB2MS50ZW1wbGF0ZSBzZWdtZW50PDI+KGkpKTsKKyAgfQorCisgIC8vIHN0cmVzcyBzb21lIGJhc2ljIHN0dWZmcyB3aXRoIGJsb2NrIG1hdHJpY2VzCisgIFZFUklGWShudW1leHQ6OnJlYWwob25lcy5jb2woYzEpLnN1bSgpKSA9PSBSZWFsU2NhbGFyKHJvd3MpKTsKKyAgVkVSSUZZKG51bWV4dDo6cmVhbChvbmVzLnJvdyhyMSkuc3VtKCkpID09IFJlYWxTY2FsYXIoY29scykpOworCisgIFZFUklGWShudW1leHQ6OnJlYWwob25lcy5jb2woYzEpLmRvdChvbmVzLmNvbChjMikpKSA9PSBSZWFsU2NhbGFyKHJvd3MpKTsKKyAgVkVSSUZZKG51bWV4dDo6cmVhbChvbmVzLnJvdyhyMSkuZG90KG9uZXMucm93KHIyKSkpID09IFJlYWxTY2FsYXIoY29scykpOworICAKKyAgLy8gY2hla2MgdGhhdCBsaW5lYXIgYWNjY2Vzc29ycyB3b3JrcyBvbiBibG9ja3MKKyAgbTEgPSBtMV9jb3B5OworICBpZigoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKQorICAgIFZFUklGWV9JU19FUVVBTChtMS5sZWZ0Q29scyhjMSkuY29lZmYocjErYzEqcm93cyksIG0xKHIxLGMxKSk7CisgIGVsc2UKKyAgICBWRVJJRllfSVNfRVFVQUwobTEudG9wUm93cyhyMSkuY29lZmYoYzErcjEqY29scyksIG0xKHIxLGMxKSk7CisgIAorCisgIC8vIG5vdyB0ZXN0IHNvbWUgYmxvY2staW5zaWRlLW9mLWJsb2NrLgorICAKKyAgLy8gZXhwcmVzc2lvbnMgd2l0aCBkaXJlY3QgYWNjZXNzCisgIFZFUklGWV9JU19FUVVBTCggKG0xLmJsb2NrKHIxLGMxLHJvd3MtcjEsY29scy1jMSkuYmxvY2socjItcjEsYzItYzEscm93cy1yMixjb2xzLWMyKSkgLCAobTEuYmxvY2socjIsYzIscm93cy1yMixjb2xzLWMyKSkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAobTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5yb3coMCkpICwgKG0xLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAobTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5jb2woMCkpICwgKG0xLmNvbChjMSkuc2VnbWVudChyMSxyMi1yMSsxKSkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAobTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS50cmFuc3Bvc2UoKS5jb2woMCkpICwgKG0xLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkudHJhbnNwb3NlKCkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAobTEudHJhbnNwb3NlKCkuYmxvY2soYzEscjEsYzItYzErMSxyMi1yMSsxKS5jb2woMCkpICwgKG0xLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkudHJhbnNwb3NlKCkgKTsKKworICAvLyBleHByZXNzaW9ucyB3aXRob3V0IGRpcmVjdCBhY2Nlc3MKKyAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikuYmxvY2socjEsYzEscm93cy1yMSxjb2xzLWMxKS5ibG9jayhyMi1yMSxjMi1jMSxyb3dzLXIyLGNvbHMtYzIpKSAsICgobTErbTIpLmJsb2NrKHIyLGMyLHJvd3MtcjIsY29scy1jMikpICk7CisgIFZFUklGWV9JU19BUFBST1goICgobTErbTIpLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkucm93KDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5jb2woMCkpICwgKChtMSttMikuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xK20yKS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnRyYW5zcG9zZSgpLmNvbCgwKSkgLCAoKG0xK20yKS5yb3cocjEpLnNlZ21lbnQoYzEsYzItYzErMSkpLnRyYW5zcG9zZSgpICk7CisgIFZFUklGWV9JU19BUFBST1goICgobTErbTIpLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkudHJhbnNwb3NlKCkgKTsKKworICAvLyBldmFsdWF0aW9uIGludG8gcGxhaW4gbWF0cmljZXMgZnJvbSBleHByZXNzaW9ucyB3aXRoIGRpcmVjdCBhY2Nlc3MgKHN0cmVzcyBNYXBCYXNlKQorICBEeW5hbWljTWF0cml4VHlwZSBkbTsKKyAgRHluYW1pY1ZlY3RvclR5cGUgZHY7CisgIGRtLnNldFplcm8oKTsKKyAgZG0gPSBtMS5ibG9jayhyMSxjMSxyb3dzLXIxLGNvbHMtYzEpLmJsb2NrKHIyLXIxLGMyLWMxLHJvd3MtcjIsY29scy1jMik7CisgIFZFUklGWV9JU19FUVVBTChkbSwgKG0xLmJsb2NrKHIyLGMyLHJvd3MtcjIsY29scy1jMikpKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5yb3coMCkudHJhbnNwb3NlKCk7CisgIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpOworICBkdiA9IG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkuY29sKDApOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS50cmFuc3Bvc2UoKS5jb2woMCk7CisgIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpLnRyYW5zcG9zZSgpOworICBkdiA9IG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKworICBWRVJJRllfSVNfRVFVQUwoIChtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLDE+KDEsMCwwLDEpKSwgbTEuYmxvY2soMSwwLDAsMSkpOworICBWRVJJRllfSVNfRVFVQUwoIChtMS50ZW1wbGF0ZSBibG9jazwxLER5bmFtaWM+KDAsMSwxLDApKSwgbTEuYmxvY2soMCwxLDEsMCkpOworICBWRVJJRllfSVNfRVFVQUwoICgobTEqMSkudGVtcGxhdGUgYmxvY2s8RHluYW1pYywxPigxLDAsMCwxKSksIG0xLmJsb2NrKDEsMCwwLDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAoKG0xKjEpLnRlbXBsYXRlIGJsb2NrPDEsRHluYW1pYz4oMCwxLDEsMCkpLCBtMS5ibG9jaygwLDEsMSwwKSk7CisKKyAgaWYgKHJvd3M+PTIgJiYgY29scz49MikKKyAgeworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtMSArPSBtMS5jb2woMCkgKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEgLT0gbTEuY29sKDApICk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xLmFycmF5KCkgKj0gbTEuY29sKDApLmFycmF5KCkgKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEuYXJyYXkoKSAvPSBtMS5jb2woMCkuYXJyYXkoKSApOworICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIEluZGV4IHNpemUgPSBtLnNpemUoKTsKKyAgSW5kZXggaW5uZXJTdHJpZGUgPSBtLmlubmVyU3RyaWRlKCk7CisgIEluZGV4IG91dGVyU3RyaWRlID0gbS5vdXRlclN0cmlkZSgpOworICBJbmRleCByb3dTdHJpZGUgPSBtLnJvd1N0cmlkZSgpOworICBJbmRleCBjb2xTdHJpZGUgPSBtLmNvbFN0cmlkZSgpOworICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIqIGRhdGEgPSBtLmRhdGEoKTsKKworICBmb3IoaW50IGo9MDtqPGNvbHM7KytqKQorICAgIGZvcihpbnQgaT0wO2k8cm93czsrK2kpCisgICAgICBWRVJJRlkobS5jb2VmZihpLGopID09IGRhdGFbaSpyb3dTdHJpZGUgKyBqKmNvbFN0cmlkZV0pOworCisgIGlmKCFNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpCisgIHsKKyAgICBmb3IoaW50IGo9MDtqPGNvbHM7KytqKQorICAgICAgZm9yKGludCBpPTA7aTxyb3dzOysraSkKKyAgICAgICAgVkVSSUZZKG0uY29lZmYoaSxqKSA9PSBkYXRhWyhNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGkqb3V0ZXJTdHJpZGUgKyBqKmlubmVyU3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBqKm91dGVyU3RyaWRlICsgaSppbm5lclN0cmlkZV0pOworICB9CisKKyAgaWYoTWF0cml4VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lKQorICB7CisgICAgVkVSSUZZKGlubmVyU3RyaWRlID09IGludCgoJm0uY29lZmYoMSkpLSgmbS5jb2VmZigwKSkpKTsKKyAgICBmb3IgKGludCBpPTA7aTxzaXplOysraSkKKyAgICAgIFZFUklGWShtLmNvZWZmKGkpID09IGRhdGFbaSppbm5lclN0cmlkZV0pOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGRhdGFfYW5kX3N0cmlkZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgSW5kZXggcjIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyMSxyb3dzLTEpOworICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKyAgSW5kZXggYzIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihjMSxjb2xzLTEpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLmJsb2NrKHIxLCBjMSwgcjItcjErMSwgYzItYzErMSkpOworICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS50cmFuc3Bvc2UoKS5ibG9jayhjMSwgcjEsIGMyLWMxKzEsIHIyLXIxKzEpKTsKKyAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEucm93KHIxKSk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLmNvbChjMSkpOworICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS5yb3cocjEpLnRyYW5zcG9zZSgpKTsKKyAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEuY29sKGMxKS50cmFuc3Bvc2UoKSk7Cit9CisKK3ZvaWQgdGVzdF9ibG9jaygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGJsb2NrKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYmxvY2soTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggYmxvY2soTWF0cml4WGNmKDMsIDMpKSApOworICAgIENBTExfU1VCVEVTVF80KCBibG9jayhNYXRyaXhYaSg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGJsb2NrKE1hdHJpeFhjZCgyMCwgMjApKSApOworICAgIENBTExfU1VCVEVTVF82KCBibG9jayhNYXRyaXhYZigyMCwgMjApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzgoIGJsb2NrKE1hdHJpeDxmbG9hdCxEeW5hbWljLDQ+KDMsIDQpKSApOworCisjaWZuZGVmIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisgICAgQ0FMTF9TVUJURVNUXzYoIGRhdGFfYW5kX3N0cmlkZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tKDUsNTApLCBpbnRlcm5hbDo6cmFuZG9tKDUsNTApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggZGF0YV9hbmRfc3RyaWRlKE1hdHJpeDxpbnQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tKDUsNTApLCBpbnRlcm5hbDo6cmFuZG9tKDUsNTApKSkgKTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Jvb3N0bXVsdGlwcmVjLmNwcCBiL3Rlc3QvYm9vc3RtdWx0aXByZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Jvb3N0bXVsdGlwcmVjLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2lmZGVmIEVJR0VOX1RFU1RfTUFYX1NJWkUKKyN1bmRlZiBFSUdFTl9URVNUX01BWF9TSVpFCisjZW5kaWYKKworI2RlZmluZSBFSUdFTl9URVNUX01BWF9TSVpFIDUwCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMQorI2luY2x1ZGUgImNob2xlc2t5LmNwcCIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzIKKyNpbmNsdWRlICJsdS5jcHAiCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8zCisjaW5jbHVkZSAicXIuY3BwIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfNAorI2luY2x1ZGUgInFyX2NvbHBpdm90aW5nLmNwcCIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzUKKyNpbmNsdWRlICJxcl9mdWxscGl2b3RpbmcuY3BwIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfNgorI2luY2x1ZGUgImVpZ2Vuc29sdmVyX3NlbGZhZGpvaW50LmNwcCIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzcKKyNpbmNsdWRlICJlaWdlbnNvbHZlcl9nZW5lcmljLmNwcCIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzgKKyNpbmNsdWRlICJlaWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsLmNwcCIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzkKKyNpbmNsdWRlICJqYWNvYmlzdmQuY3BwIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMTAKKyNpbmNsdWRlICJiZGNzdmQuY3BwIgorI2VuZGlmCisKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKworI3VuZGVmIG1pbgorI3VuZGVmIG1heAorI3VuZGVmIGlzbmFuCisjdW5kZWYgaXNpbmYKKyN1bmRlZiBpc2Zpbml0ZQorCisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vY3BwX2RlY19mbG9hdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vbnVtYmVyLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL2NvbXBsZXguaHBwPgorCituYW1lc3BhY2UgbXAgPSBib29zdDo6bXVsdGlwcmVjaXNpb247Cit0eXBlZGVmIG1wOjpudW1iZXI8bXA6OmNwcF9kZWNfZmxvYXQ8MTAwPiwgbXA6OmV0X29uPiBSZWFsOworCituYW1lc3BhY2UgRWlnZW4geworICB0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8UmVhbD4gOiBHZW5lcmljTnVtVHJhaXRzPFJlYWw+IHsKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gMWUtNTA7IH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMix0eXBlbmFtZSBUMyx0eXBlbmFtZSBUNCx0eXBlbmFtZSBUNT4KKyAgc3RydWN0IE51bVRyYWl0czxib29zdDo6bXVsdGlwcmVjaXNpb246OmRldGFpbDo6ZXhwcmVzc2lvbjxUMSxUMixUMyxUNCxUNT4gPiA6IE51bVRyYWl0czxSZWFsPiB7fTsKKworICB0ZW1wbGF0ZTw+CisgIFJlYWwgdGVzdF9wcmVjaXNpb248UmVhbD4oKSB7IHJldHVybiAxZS01MDsgfQorCisgIC8vIG5lZWRlZCBpbiBDKys5MyBtb2RlIHdoZXJlIG51bWJlciBkb2VzIG5vdCBzdXBwb3J0IGV4cGxpY2l0IGNhc3QuCisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3VHlwZT4KKyAgICBzdHJ1Y3QgY2FzdF9pbXBsPFJlYWwsTmV3VHlwZT4geworICAgICAgc3RhdGljIGlubGluZSBOZXdUeXBlIHJ1bihjb25zdCBSZWFsJiB4KSB7CisgICAgICAgIHJldHVybiB4LnRlbXBsYXRlIGNvbnZlcnRfdG88TmV3VHlwZT4oKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjYXN0X2ltcGw8UmVhbCxzdGQ6OmNvbXBsZXg8UmVhbD4gPiB7CisgICAgICBzdGF0aWMgaW5saW5lIHN0ZDo6Y29tcGxleDxSZWFsPiAgcnVuKGNvbnN0IFJlYWwmIHgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxSZWFsPih4KTsKKyAgICAgIH0KKyAgICB9OworICB9Cit9CisKK25hbWVzcGFjZSBib29zdCB7CituYW1lc3BhY2UgbXVsdGlwcmVjaXNpb24geworICAvLyB0byBtYWtlIEFETCB3b3JrcyBhcyBleHBlY3RlZDoKKyAgdXNpbmcgYm9vc3Q6Om1hdGg6OmlzZmluaXRlOworICB1c2luZyBib29zdDo6bWF0aDo6aXNuYW47CisgIHVzaW5nIGJvb3N0OjptYXRoOjppc2luZjsKKyAgdXNpbmcgYm9vc3Q6Om1hdGg6OmNvcHlzaWduOworICB1c2luZyBib29zdDo6bWF0aDo6aHlwb3Q7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIHN0ZDo6Y29tcGxleDxSZWFsPjoKKyAgUmVhbCBmYWJzKGNvbnN0IFJlYWwmIGEpIHsgcmV0dXJuIGFicyBFSUdFTl9OT1RfQV9NQUNSTyAoYSk7IH0KKyAgUmVhbCBmbWF4KGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsgdXNpbmcgc3RkOjptYXg7IHJldHVybiBtYXgoYSxiKTsgfQorCisgIC8vIHNvbWUgc3BlY2lhbGl6YXRpb24gZm9yIHRoZSB1bml0IHRlc3RzOgorICBpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCkpOworICB9CisKKyAgaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBSZWFsJiBhLCBjb25zdCBSZWFsJiBiKSB7CisgICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKKyAgfQorCisgIGlubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKKyAgfQorCisgIFJlYWwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGNvbnN0IFJlYWwmKSB7CisgICAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCk7CisgIH0KKworICBSZWFsIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgUmVhbCAmYSwgY29uc3QgUmVhbCAmYikgeworICAgIHVzaW5nIEVpZ2VuOjpudW1leHQ6OmFiczI7CisgICAgcmV0dXJuIHNxcnQoYWJzMjxSZWFsPihhLWIpL0VpZ2VuOjpudW1leHQ6Om1pbmk8UmVhbD4oYWJzMihhKSxhYnMyKGIpKSk7CisgIH0KK30KK30KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworfQorCit2b2lkIHRlc3RfYm9vc3RtdWx0aXByZWMoKQoreworICB0eXBlZGVmIE1hdHJpeDxSZWFsLER5bmFtaWMsRHluYW1pYz4gTWF0OworICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8UmVhbD4sRHluYW1pYyxEeW5hbWljPiBNYXRDOworCisgIHN0ZDo6Y291dCA8PCAiTnVtVHJhaXRzPFJlYWw+OjplcHNpbG9uKCkgICAgICAgICA9ICIgPDwgTnVtVHJhaXRzPFJlYWw+OjplcHNpbG9uKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIk51bVRyYWl0czxSZWFsPjo6ZHVtbXlfcHJlY2lzaW9uKCkgPSAiIDw8IE51bVRyYWl0czxSZWFsPjo6ZHVtbXlfcHJlY2lzaW9uKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIk51bVRyYWl0czxSZWFsPjo6bG93ZXN0KCkgICAgICAgICAgPSAiIDw8IE51bVRyYWl0czxSZWFsPjo6bG93ZXN0KCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIk51bVRyYWl0czxSZWFsPjo6aGlnaGVzdCgpICAgICAgICAgPSAiIDw8IE51bVRyYWl0czxSZWFsPjo6aGlnaGVzdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJOdW1UcmFpdHM8UmVhbD46OmRpZ2l0czEwKCkgICAgICAgID0gIiA8PCBOdW1UcmFpdHM8UmVhbD46OmRpZ2l0czEwKCkgPDwgc3RkOjplbmRsOworCisgIC8vIGNoZWtjIHN0cmVhbSBvdXRwdXQKKyAgeworICAgIE1hdCBBKDEwLDEwKTsKKyAgICBBLnNldFJhbmRvbSgpOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IEE7CisgIH0KKyAgeworICAgIE1hdEMgQSgxMCwxMCk7CisgICAgQS5zZXRSYW5kb20oKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBBOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworCisgICAgQ0FMTF9TVUJURVNUXzEoIGNob2xlc2t5KE1hdChzLHMpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzIoIGx1X25vbl9pbnZlcnRpYmxlPE1hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBsdV9pbnZlcnRpYmxlPE1hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBsdV9ub25faW52ZXJ0aWJsZTxNYXRDPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGx1X2ludmVydGlibGU8TWF0Qz4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIHFyKE1hdChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHFyX2ludmVydGlibGU8TWF0PigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNCggcXI8TWF0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGNvZDxNYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcXJfaW52ZXJ0aWJsZTxNYXQ+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF81KCBxcjxNYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcXJfaW52ZXJ0aWJsZTxNYXQ+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF82KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdChzLHMpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzcoIGVpZ2Vuc29sdmVyKE1hdChzLHMpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzgoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0KHMscykpICk7CisKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgIH0KKworICBDQUxMX1NVQlRFU1RfOSgoIGphY29iaXN2ZChNYXQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzEwKCggYmRjc3ZkKE1hdChpbnRlcm5hbDo6cmFuZG9tPGludD4oRUlHRU5fVEVTVF9NQVhfU0laRS80LCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICkpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L2J1ZzEyMTMuY3BwIGIvdGVzdC9idWcxMjEzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE3NjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9idWcxMjEzLmNwcApAQCAtMCwwICsxLDEzIEBACisKKy8vIFRoaXMgYW5vbnltb3VzIGVudW0gaXMgZXNzZW50aWFsIHRvIHRyaWdnZXIgdGhlIGxpbmtpbmcgaXNzdWUKK2VudW0geworICBGb28KK307CisKKyNpbmNsdWRlICJidWcxMjEzLmgiCisKK2Jvb2wgYnVnMTIxM18xKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgeCkKK3sKKyAgcmV0dXJuIGJ1ZzEyMTNfMih4KTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9idWcxMjEzLmggYi90ZXN0L2J1ZzEyMTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBlNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9idWcxMjEzLmgKQEAgLTAsMCArMSw4IEBACisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZGltPgorYm9vbCBidWcxMjEzXzIoY29uc3QgRWlnZW46Ok1hdHJpeDxULGRpbSwxPiYgeCk7CisKK2Jvb2wgYnVnMTIxM18xKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgeCk7CisKZGlmZiAtLWdpdCBhL3Rlc3QvYnVnMTIxM19tYWluLmNwcCBiL3Rlc3QvYnVnMTIxM19tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODAyYzAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9idWcxMjEzX21haW4uY3BwCkBAIC0wLDAgKzEsMTggQEAKKworLy8gVGhpcyBpcyBhIHJlZ3Jlc3Npb24gdW5pdCByZWdhcmRpbmcgYSB3ZWlyZCBsaW5raW5nIGlzc3VlIHdpdGggZ2NjLgorCisjaW5jbHVkZSAiYnVnMTIxMy5oIgorCitpbnQgbWFpbigpCit7CisgIHJldHVybiAwOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBkaW0+Citib29sIGJ1ZzEyMTNfMihjb25zdCBFaWdlbjo6TWF0cml4PFQsZGltLDE+JiApCit7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSBib29sIGJ1ZzEyMTNfMjxmbG9hdCwzPihjb25zdCBFaWdlbjo6VmVjdG9yM2YmKTsKZGlmZiAtLWdpdCBhL3Rlc3QvY2hvbGVza3kuY3BwIGIvdGVzdC9jaG9sZXNreS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkNWFjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsNTA5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisjZGVmaW5lIEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORworI2VuZGlmCisKKyNkZWZpbmUgVEVTVF9FTkFCTEVfVEVNUE9SQVJZX1RSQUNLSU5HCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBVcExvPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBtYXRyaXhfbDFfbm9ybShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CisgIE1hdHJpeFR5cGUgc3ltbSA9IG0udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCk7CisgIHJldHVybiBzeW1tLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdGVtcGxhdGUgPHR5cGVuYW1lLGludD4gY2xhc3MgQ2hvbFR5cGU+IHZvaWQgdGVzdF9jaG9sX3VwZGF0ZShjb25zdCBNYXRyaXhUeXBlJiBzeW1tKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIE1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgTWF0cml4VHlwZSBzeW1tVXAgPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBNYXRyaXhUeXBlIHN5bW1DcHkgPSBzeW1tOworCisgIENob2xUeXBlPE1hdHJpeFR5cGUsTG93ZXI+IGNob2xsbyhzeW1tTG8pOworICBDaG9sVHlwZTxNYXRyaXhUeXBlLFVwcGVyPiBjaG9sdXAoc3ltbVVwKTsKKworICBmb3IgKGludCBrPTA7IGs8MTA7ICsraykKKyAgeworICAgIFZlY3RvclR5cGUgdmVjID0gVmVjdG9yVHlwZTo6UmFuZG9tKHN5bW0ucm93cygpKTsKKyAgICBSZWFsU2NhbGFyIHNpZ21hID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigpOworICAgIHN5bW1DcHkgKz0gc2lnbWEgKiB2ZWMgKiB2ZWMuYWRqb2ludCgpOworCisgICAgLy8gd2UgYXJlIGRvaW5nIHNvbWUgZG93bmRhdGVzLCBzbyBpdCBtaWdodCBiZSB0aGUgY2FzZSB0aGF0IHRoZSBtYXRyaXggaXMgbm90IFNQRCBhbnltb3JlCisgICAgQ2hvbFR5cGU8TWF0cml4VHlwZSxMb3dlcj4gY2hvbChzeW1tQ3B5KTsKKyAgICBpZihjaG9sLmluZm8oKSE9U3VjY2VzcykKKyAgICAgIGJyZWFrOworCisgICAgY2hvbGxvLnJhbmtVcGRhdGUodmVjLCBzaWdtYSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQ3B5LCBjaG9sbG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKworICAgIGNob2x1cC5yYW5rVXBkYXRlKHZlYywgc2lnbWEpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbUNweSwgY2hvbHVwLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjaG9sZXNreShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIExMVC5oIExETFQuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFNxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgTWF0cml4VHlwZSBhMCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBWZWN0b3JUeXBlIHZlY0IgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHZlY1gocm93cyk7CisgIE1hdHJpeFR5cGUgbWF0QiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCBtYXRYKHJvd3MsY29scyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbSA9ICBhMCAqIGEwLmFkam9pbnQoKTsKKyAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoZSBtYXRyaXggaXMgbm90IHNpbmd1bGFyIG9yIG5lYXIgc2luZ3VsYXIKKyAgZm9yIChpbnQgaz0wOyBrPDM7ICsraykKKyAgeworICAgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgICBzeW1tICs9IGExICogYTEuYWRqb2ludCgpOworICB9CisKKyAgeworICAgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbVVwID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICBTcXVhcmVNYXRyaXhUeXBlIHN5bW1MbyA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisKKyAgICBMTFQ8U3F1YXJlTWF0cml4VHlwZSxMb3dlcj4gY2hvbGxvKHN5bW1Mbyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tLCBjaG9sbG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICB2ZWNYID0gY2hvbGxvLnNvbHZlKHZlY0IpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIHZlY1gsIHZlY0IpOworICAgIG1hdFggPSBjaG9sbG8uc29sdmUobWF0Qik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogbWF0WCwgbWF0Qik7CisKKyAgICBjb25zdCBNYXRyaXhUeXBlIHN5bW1Mb19pbnZlcnNlID0gY2hvbGxvLnNvbHZlKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scykpOworICAgIFJlYWxTY2FsYXIgcmNvbmQgPSAoUmVhbFNjYWxhcigxKSAvIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG8pKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG9faW52ZXJzZSk7CisgICAgUmVhbFNjYWxhciByY29uZF9lc3QgPSBjaG9sbG8ucmNvbmQoKTsKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZXN0aW1hdGVkIGNvbmRpdGlvbiBudW1iZXIgaXMgd2l0aGluIGEgZmFjdG9yIG9mIDEwIG9mIHRoZQorICAgIC8vIHRydXRoLgorICAgIFZFUklGWShyY29uZF9lc3QgPiByY29uZCAvIDEwICYmIHJjb25kX2VzdCA8IHJjb25kICogMTApOworCisgICAgLy8gdGVzdCB0aGUgdXBwZXIgbW9kZQorICAgIExMVDxTcXVhcmVNYXRyaXhUeXBlLFVwcGVyPiBjaG9sdXAoc3ltbVVwKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGNob2x1cC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBjaG9sdXAuc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisgICAgbWF0WCA9IGNob2x1cC5zb2x2ZShtYXRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlc3RpbWF0ZWQgY29uZGl0aW9uIG51bWJlciBpcyB3aXRoaW4gYSBmYWN0b3Igb2YgMTAgb2YgdGhlCisgICAgLy8gdHJ1dGguCisgICAgY29uc3QgTWF0cml4VHlwZSBzeW1tVXBfaW52ZXJzZSA9IGNob2x1cC5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpKTsKKyAgICByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcF9pbnZlcnNlKTsKKyAgICByY29uZF9lc3QgPSBjaG9sdXAucmNvbmQoKTsKKyAgICBWRVJJRlkocmNvbmRfZXN0ID4gcmNvbmQgLyAxMCAmJiByY29uZF9lc3QgPCByY29uZCAqIDEwKTsKKworCisgICAgTWF0cml4VHlwZSBuZWcgPSAtc3ltbUxvOworICAgIGNob2xsby5jb21wdXRlKG5lZyk7CisgICAgVkVSSUZZKGNob2xsby5pbmZvKCk9PU51bWVyaWNhbElzc3VlKTsKKworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sbG8ubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sbG8ubWF0cml4VSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhMKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoY2hvbHVwLm1hdHJpeEwoKS50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKSksIE1hdHJpeFR5cGUoY2hvbHVwLm1hdHJpeFUoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sdXAubWF0cml4VSgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sdXAubWF0cml4TCgpKSk7CisKKyAgICAvLyB0ZXN0IHNvbWUgc3BlY2lhbCB1c2UgY2FzZXMgb2YgU2VsZkN3aXNlQmluYXJ5T3A6CisgICAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpOworICAgIG0yID0gbTE7CisgICAgbTIgKz0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSArIHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0QikpOworICAgIG0yID0gbTE7CisgICAgbTIgLT0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSAtIHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0QikpOworICAgIG0yID0gbTE7CisgICAgbTIubm9hbGlhcygpICs9IHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0Qik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEgKyBzeW1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKG1hdEIpKTsKKyAgICBtMiA9IG0xOworICAgIG0yLm5vYWxpYXMoKSAtPSBzeW1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xIC0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKSk7CisgIH0KKworICAvLyBMRExUCisgIHsKKyAgICBpbnQgc2lnbiA9IGludGVybmFsOjpyYW5kb208aW50PigpJTIgPyAxIDogLTE7CisKKyAgICBpZihzaWduID09IC0xKQorICAgIHsKKyAgICAgIHN5bW0gPSAtc3ltbTsgLy8gdGVzdCBhIG5lZ2F0aXZlIG1hdHJpeAorICAgIH0KKworICAgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbVVwID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICBTcXVhcmVNYXRyaXhUeXBlIHN5bW1MbyA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisKKyAgICBMRExUPFNxdWFyZU1hdHJpeFR5cGUsTG93ZXI+IGxkbHRsbyhzeW1tTG8pOworICAgIFZFUklGWShsZGx0bG8uaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHRsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBsZGx0bG8uc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisgICAgbWF0WCA9IGxkbHRsby5zb2x2ZShtYXRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKworICAgIGNvbnN0IE1hdHJpeFR5cGUgc3ltbUxvX2ludmVyc2UgPSBsZGx0bG8uc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxjb2xzKSk7CisgICAgUmVhbFNjYWxhciByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgTG93ZXI+KHN5bW1MbykpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgTG93ZXI+KHN5bW1Mb19pbnZlcnNlKTsKKyAgICBSZWFsU2NhbGFyIHJjb25kX2VzdCA9IGxkbHRsby5yY29uZCgpOworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlc3RpbWF0ZWQgY29uZGl0aW9uIG51bWJlciBpcyB3aXRoaW4gYSBmYWN0b3Igb2YgMTAgb2YgdGhlCisgICAgLy8gdHJ1dGguCisgICAgVkVSSUZZKHJjb25kX2VzdCA+IHJjb25kIC8gMTAgJiYgcmNvbmRfZXN0IDwgcmNvbmQgKiAxMCk7CisKKworICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZSxVcHBlcj4gbGRsdHVwKHN5bW1VcCk7CisgICAgVkVSSUZZKGxkbHR1cC5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgbGRsdHVwLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgdmVjWCA9IGxkbHR1cC5zb2x2ZSh2ZWNCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiB2ZWNYLCB2ZWNCKTsKKyAgICBtYXRYID0gbGRsdHVwLnNvbHZlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIG1hdFgsIG1hdEIpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGVzdGltYXRlZCBjb25kaXRpb24gbnVtYmVyIGlzIHdpdGhpbiBhIGZhY3RvciBvZiAxMCBvZiB0aGUKKyAgICAvLyB0cnV0aC4KKyAgICBjb25zdCBNYXRyaXhUeXBlIHN5bW1VcF9pbnZlcnNlID0gbGRsdHVwLnNvbHZlKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scykpOworICAgIHJjb25kID0gKFJlYWxTY2FsYXIoMSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwX2ludmVyc2UpOworICAgIHJjb25kX2VzdCA9IGxkbHR1cC5yY29uZCgpOworICAgIFZFUklGWShyY29uZF9lc3QgPiByY29uZCAvIDEwICYmIHJjb25kX2VzdCA8IHJjb25kICogMTApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGxkbHRsby5tYXRyaXhMKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGxkbHRsby5tYXRyaXhVKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUobGRsdGxvLm1hdHJpeFUoKS50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKSksIE1hdHJpeFR5cGUobGRsdGxvLm1hdHJpeEwoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShsZGx0dXAubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShsZGx0dXAubWF0cml4VSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGxkbHR1cC5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGxkbHR1cC5tYXRyaXhMKCkpKTsKKworICAgIGlmKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgIHsKKyAgICAgIC8vIG5vdGUgOiBlYWNoIGlucGxhY2UgcGVybXV0YXRpb24gcmVxdWlyZXMgYSBzbWFsbCB0ZW1wb3JhcnkgdmVjdG9yIChtYXNrKQorCisgICAgICAvLyBjaGVjayBpbnBsYWNlIHNvbHZlCisgICAgICBtYXRYID0gbWF0QjsKKyAgICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG1hdFggPSBsZGx0bG8uc29sdmUobWF0WCksIDApOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXRYLCBsZGx0bG8uc29sdmUobWF0QikuZXZhbCgpKTsKKworCisgICAgICBtYXRYID0gbWF0QjsKKyAgICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG1hdFggPSBsZGx0dXAuc29sdmUobWF0WCksIDApOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXRYLCBsZGx0dXAuc29sdmUobWF0QikuZXZhbCgpKTsKKyAgICB9CisKKyAgICAvLyByZXN0b3JlCisgICAgaWYoc2lnbiA9PSAtMSkKKyAgICAgIHN5bW0gPSAtc3ltbTsKKworICAgIC8vIGNoZWNrIG1hdHJpY2VzIGNvbWluZyBmcm9tIGxpbmVhciBjb25zdHJhaW50cyB3aXRoIExhZ3JhbmdlIG11bHRpcGxpZXJzCisgICAgaWYocm93cz49MykKKyAgICB7CisgICAgICBTcXVhcmVNYXRyaXhUeXBlIEEgPSBzeW1tOworICAgICAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0yKTsKKyAgICAgIEEuYm90dG9tUmlnaHRDb3JuZXIoYyxjKS5zZXRaZXJvKCk7CisgICAgICAvLyBNYWtlIHN1cmUgYSBzb2x1dGlvbiBleGlzdHM6CisgICAgICB2ZWNYLnNldFJhbmRvbSgpOworICAgICAgdmVjQiA9IEEgKiB2ZWNYOworICAgICAgdmVjWC5zZXRaZXJvKCk7CisgICAgICBsZGx0bG8uY29tcHV0ZShBKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goQSwgbGRsdGxvLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgICB2ZWNYID0gbGRsdGxvLnNvbHZlKHZlY0IpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChBICogdmVjWCwgdmVjQik7CisgICAgfQorCisgICAgLy8gY2hlY2sgbm9uLWZ1bGwgcmFuayBtYXRyaWNlcworICAgIGlmKHJvd3M+PTMpCisgICAgeworICAgICAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEscm93cy0xKTsKKyAgICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBhID0gTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20ocm93cyxyKTsKKyAgICAgIFNxdWFyZU1hdHJpeFR5cGUgQSA9IGEgKiBhLmFkam9pbnQoKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSBhIHNvbHV0aW9uIGV4aXN0czoKKyAgICAgIHZlY1guc2V0UmFuZG9tKCk7CisgICAgICB2ZWNCID0gQSAqIHZlY1g7CisgICAgICB2ZWNYLnNldFplcm8oKTsKKyAgICAgIGxkbHRsby5jb21wdXRlKEEpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChBLCBsZGx0bG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICAgIHZlY1ggPSBsZGx0bG8uc29sdmUodmVjQik7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKEEgKiB2ZWNYLCB2ZWNCKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBtYXRyaWNlcyB3aXRoIGEgd2lkZSBzcGVjdHJ1bQorICAgIGlmKHJvd3M+PTMpCisgICAgeworICAgICAgdXNpbmcgc3RkOjpwb3c7CisgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgICBSZWFsU2NhbGFyIHMgPSAoc3RkOjptaW4pKDE2LHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDEwLzgpOworICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGEgPSBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbShyb3dzLHJvd3MpOworICAgICAgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPiBkID0gIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsMT46OlJhbmRvbShyb3dzKTsKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8cm93czsgKytrKQorICAgICAgICBkKGspID0gZChrKSpwb3coUmVhbFNjYWxhcigxMCksaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigtcyxzKSk7CisgICAgICBTcXVhcmVNYXRyaXhUeXBlIEEgPSBhICogZC5hc0RpYWdvbmFsKCkgKiBhLmFkam9pbnQoKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSBhIHNvbHV0aW9uIGV4aXN0czoKKyAgICAgIHZlY1guc2V0UmFuZG9tKCk7CisgICAgICB2ZWNCID0gQSAqIHZlY1g7CisgICAgICB2ZWNYLnNldFplcm8oKTsKKyAgICAgIGxkbHRsby5jb21wdXRlKEEpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChBLCBsZGx0bG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICAgIHZlY1ggPSBsZGx0bG8uc29sdmUodmVjQik7CisKKyAgICAgIGlmKGxkbHRsby52ZWN0b3JEKCkucmVhbCgpLmN3aXNlQWJzKCkubWluQ29lZmYoKT5SZWFsU2NhbGFyKDApKQorICAgICAgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKEEgKiB2ZWNYLHZlY0IpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBSZWFsU2NhbGFyIGxhcmdlX3RvbCA9ICBzcXJ0KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpOworICAgICAgICBWRVJJRlkoKEEgKiB2ZWNYKS5pc0FwcHJveCh2ZWNCLCBsYXJnZV90b2wpKTsKKworICAgICAgICArK2dfdGVzdF9sZXZlbDsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChBICogdmVjWCx2ZWNCKTsKKyAgICAgICAgLS1nX3Rlc3RfbGV2ZWw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gdXBkYXRlL2Rvd25kYXRlCisgIENBTExfU1VCVEVTVCgoIHRlc3RfY2hvbF91cGRhdGU8U3F1YXJlTWF0cml4VHlwZSxMTFQ+KHN5bW0pICApKTsKKyAgQ0FMTF9TVUJURVNUKCggdGVzdF9jaG9sX3VwZGF0ZTxTcXVhcmVNYXRyaXhUeXBlLExETFQ+KHN5bW0pICkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5X2NwbHgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLy8gY2xhc3NpYyB0ZXN0CisgIGNob2xlc2t5KG0pOworCisgIC8vIHRlc3QgbWl4aW5nIHJlYWwvc2NhbGFyIHR5cGVzCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBSZWFsTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBSZWFsTWF0cml4VHlwZSBhMCA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgVmVjdG9yVHlwZSB2ZWNCID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2ZWNYKHJvd3MpOworICBNYXRyaXhUeXBlIG1hdEIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgbWF0WChyb3dzLGNvbHMpOworICBSZWFsTWF0cml4VHlwZSBzeW1tID0gIGEwICogYTAuYWRqb2ludCgpOworICAvLyBsZXQncyBtYWtlIHN1cmUgdGhlIG1hdHJpeCBpcyBub3Qgc2luZ3VsYXIgb3IgbmVhciBzaW5ndWxhcgorICBmb3IgKGludCBrPTA7IGs8MzsgKytrKQorICB7CisgICAgUmVhbE1hdHJpeFR5cGUgYTEgPSBSZWFsTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgICAgc3ltbSArPSBhMSAqIGExLmFkam9pbnQoKTsKKyAgfQorCisgIHsKKyAgICBSZWFsTWF0cml4VHlwZSBzeW1tTG8gPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworCisgICAgTExUPFJlYWxNYXRyaXhUeXBlLExvd2VyPiBjaG9sbG8oc3ltbUxvKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGNob2xsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBjaG9sbG8uc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisvLyAgICAgbWF0WCA9IGNob2xsby5zb2x2ZShtYXRCKTsKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKyAgfQorCisgIC8vIExETFQKKyAgeworICAgIGludCBzaWduID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KCklMiA/IDEgOiAtMTsKKworICAgIGlmKHNpZ24gPT0gLTEpCisgICAgeworICAgICAgc3ltbSA9IC1zeW1tOyAvLyB0ZXN0IGEgbmVnYXRpdmUgbWF0cml4CisgICAgfQorCisgICAgUmVhbE1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKworICAgIExETFQ8UmVhbE1hdHJpeFR5cGUsTG93ZXI+IGxkbHRsbyhzeW1tTG8pOworICAgIFZFUklGWShsZGx0bG8uaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHRsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBsZGx0bG8uc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisvLyAgICAgbWF0WCA9IGxkbHRsby5zb2x2ZShtYXRCKTsKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKyAgfQorfQorCisvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDEKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgY2hvbGVza3lfYnVnMjQxKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGVpZ2VuX2Fzc2VydChtLnJvd3MoKSA9PSAyICYmIG0uY29scygpID09IDIpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBNYXRyaXhUeXBlIG1hdEE7CisgIG1hdEEgPDwgMSwgMSwgMSwgMTsKKyAgVmVjdG9yVHlwZSB2ZWNCOworICB2ZWNCIDw8IDEsIDE7CisgIFZlY3RvclR5cGUgdmVjWCA9IG1hdEEubGRsdCgpLnNvbHZlKHZlY0IpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdEEgKiB2ZWNYLCB2ZWNCKTsKK30KKworLy8gTERMVCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrIGZvciBpbmRlZmluaXRlIG1hdHJpY2VzLCBidXQgaGFwcGVucyB0byB3b3JrIGZpbmUgaWYgbWF0cml4IGlzIGRpYWdvbmFsLgorLy8gVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IExETFQgcmVwb3J0cyBjb3JyZWN0bHkgdGhhdCBtYXRyaXggaXMgaW5kZWZpbml0ZS4KKy8vIFNlZSBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD0xMDY5NDIgYW5kIGJ1ZyA3MzYKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgY2hvbGVza3lfZGVmaW5pdGVuZXNzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGVpZ2VuX2Fzc2VydChtLnJvd3MoKSA9PSAyICYmIG0uY29scygpID09IDIpOworICBNYXRyaXhUeXBlIG1hdDsKKyAgTERMVDxNYXRyaXhUeXBlPiBsZGx0KDIpOworCisgIHsKKyAgICBtYXQgPDwgMSwgMCwgMCwgLTE7CisgICAgbGRsdC5jb21wdXRlKG1hdCk7CisgICAgVkVSSUZZKGxkbHQuaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRlkoIWxkbHQuaXNOZWdhdGl2ZSgpKTsKKyAgICBWRVJJRlkoIWxkbHQuaXNQb3NpdGl2ZSgpKTsKKyAgfQorICB7CisgICAgbWF0IDw8IDEsIDIsIDIsIDE7CisgICAgbGRsdC5jb21wdXRlKG1hdCk7CisgICAgVkVSSUZZKGxkbHQuaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRlkoIWxkbHQuaXNOZWdhdGl2ZSgpKTsKKyAgICBWRVJJRlkoIWxkbHQuaXNQb3NpdGl2ZSgpKTsKKyAgfQorICB7CisgICAgbWF0IDw8IDAsIDAsIDAsIDA7CisgICAgbGRsdC5jb21wdXRlKG1hdCk7CisgICAgVkVSSUZZKGxkbHQuaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRlkobGRsdC5pc05lZ2F0aXZlKCkpOworICAgIFZFUklGWShsZGx0LmlzUG9zaXRpdmUoKSk7CisgIH0KKyAgeworICAgIG1hdCA8PCAwLCAwLCAwLCAxOworICAgIGxkbHQuY29tcHV0ZShtYXQpOworICAgIFZFUklGWShsZGx0LmluZm8oKT09U3VjY2Vzcyk7CisgICAgVkVSSUZZKCFsZGx0LmlzTmVnYXRpdmUoKSk7CisgICAgVkVSSUZZKGxkbHQuaXNQb3NpdGl2ZSgpKTsKKyAgfQorICB7CisgICAgbWF0IDw8IC0xLCAwLCAwLCAwOworICAgIGxkbHQuY29tcHV0ZShtYXQpOworICAgIFZFUklGWShsZGx0LmluZm8oKT09U3VjY2Vzcyk7CisgICAgVkVSSUZZKGxkbHQuaXNOZWdhdGl2ZSgpKTsKKyAgICBWRVJJRlkoIWxkbHQuaXNQb3NpdGl2ZSgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgY2hvbGVza3lfZmFpbGx1cmVfY2FzZXMoKQoreworICBNYXRyaXhYZCBtYXQ7CisgIExETFQ8TWF0cml4WGQ+IGxkbHQ7CisKKyAgeworICAgIG1hdC5yZXNpemUoMiwyKTsKKyAgICBtYXQgPDwgMCwgMSwgMSwgMDsKKyAgICBsZGx0LmNvbXB1dGUobWF0KTsKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtYXQsbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIFZFUklGWShsZGx0LmluZm8oKT09TnVtZXJpY2FsSXNzdWUpOworICB9CisjaWYgKCFFSUdFTl9BUkNIX2kzODYpIHx8IGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX1NTRTIpCisgIHsKKyAgICBtYXQucmVzaXplKDMsMyk7CisgICAgbWF0IDw8IC0xLCAtMywgMywKKyAgICAgICAgICAgLTMsIC04Ljk5OTk5OTk5OTk5OTk5OTk5OTksIDEsCisgICAgICAgICAgICAzLCAxLCAwOworICAgIGxkbHQuY29tcHV0ZShtYXQpOworICAgIFZFUklGWShsZGx0LmluZm8oKT09TnVtZXJpY2FsSXNzdWUpOworICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG1hdCxsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgIH0KKyNlbmRpZgorICB7CisgICAgbWF0LnJlc2l6ZSgzLDMpOworICAgIG1hdCA8PCAgMSwgMiwgMywKKyAgICAgICAgICAgIDIsIDQsIDEsCisgICAgICAgICAgICAzLCAxLCAwOworICAgIGxkbHQuY29tcHV0ZShtYXQpOworICAgIFZFUklGWShsZGx0LmluZm8oKT09TnVtZXJpY2FsSXNzdWUpOworICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG1hdCxsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgIH0KKworICB7CisgICAgbWF0LnJlc2l6ZSg4LDgpOworICAgIG1hdCA8PCAgMC4xLCAwLCAtMC4xLCAwLCAwLCAwLCAxLCAwLAorICAgICAgICAgICAgMCwgNC4yNDY2NywgMCwgMi4wMDMzMywgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgIC0wLjEsIDAsIDAuMiwgMCwgLTAuMSwgMCwgMCwgMCwKKyAgICAgICAgICAgIDAsIDIuMDAzMzMsIDAsIDguNDkzMzMsIDAsIDIuMDAzMzMsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAtMC4xLCAwLCAwLjEsIDAsIDAsIDEsCisgICAgICAgICAgICAwLCAwLCAwLCAyLjAwMzMzLCAwLCA0LjI0NjY3LCAwLCAwLAorICAgICAgICAgICAgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDA7CisgICAgbGRsdC5jb21wdXRlKG1hdCk7CisgICAgVkVSSUZZKGxkbHQuaW5mbygpPT1OdW1lcmljYWxJc3N1ZSk7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQoKQoreworICBNYXRyaXhUeXBlIHRtcDsKKworICBMTFQ8TWF0cml4VHlwZT4gbGx0OworICBWRVJJRllfUkFJU0VTX0FTU0VSVChsbHQubWF0cml4TCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsbHQubWF0cml4VSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsbHQuc29sdmUodG1wKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGx0LnNvbHZlSW5QbGFjZSgmdG1wKSkKKworICBMRExUPE1hdHJpeFR5cGU+IGxkbHQ7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGxkbHQubWF0cml4TCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0LnBlcm11dGF0aW9uUCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0LnZlY3RvckQoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGRsdC5pc1Bvc2l0aXZlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGxkbHQuaXNOZWdhdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0LnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGxkbHQuc29sdmVJblBsYWNlKCZ0bXApKQorfQorCit2b2lkIHRlc3RfY2hvbGVza3koKQoreworICBpbnQgcyA9IDA7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNob2xlc2t5KE1hdHJpeDxkb3VibGUsMSwxPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjaG9sZXNreShNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjaG9sZXNreV9idWcyNDEoTWF0cml4MmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY2hvbGVza3lfZGVmaW5pdGVuZXNzKE1hdHJpeDJkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGNob2xlc2t5KE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNob2xlc2t5KE1hdHJpeDRkKCkpICk7CisKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNob2xlc2t5KE1hdHJpeFhkKHMscykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorCisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzYoIGNob2xlc2t5X2NwbHgoTWF0cml4WGNkKHMscykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICB9CisKKyAgQ0FMTF9TVUJURVNUXzQoIGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Y+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzcoIGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Q+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzgoIGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGY+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzIoIGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGQ+KCkgKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzkoIExMVDxNYXRyaXhYZj4oMTApICk7CisgIENBTExfU1VCVEVTVF85KCBMRExUPE1hdHJpeFhmPigxMCkgKTsKKworICBDQUxMX1NVQlRFU1RfMiggY2hvbGVza3lfZmFpbGx1cmVfY2FzZXM8dm9pZD4oKSApOworCisgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUobmJfdGVtcG9yYXJpZXMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAgYi90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZGEyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2hvbG1vZF9zdXBwb3J0LmNwcApAQCAtMCwwICsxLDU3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19ERUJVR19TTUFMTF9QUk9EVUNUX0JMT0NLUworI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKKworI2luY2x1ZGUgPEVpZ2VuL0Nob2xtb2RTdXBwb3J0PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfY2hvbG1vZF9UKCkKK3sKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlTWF0cml4PFQ+LCBMb3dlcj4gZ19jaG9sX2NvbG1ham9yX2xvd2VyOyBnX2Nob2xfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kU3VwZXJub2RhbExMdCk7CisgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGdfY2hvbF9jb2xtYWpvcl91cHBlcjsgZ19jaG9sX2NvbG1ham9yX3VwcGVyLnNldE1vZGUoQ2hvbG1vZFN1cGVybm9kYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBnX2xsdF9jb2xtYWpvcl9sb3dlcjsgIGdfbGx0X2NvbG1ham9yX2xvd2VyLnNldE1vZGUoQ2hvbG1vZFNpbXBsaWNpYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBnX2xsdF9jb2xtYWpvcl91cHBlcjsgIGdfbGx0X2NvbG1ham9yX3VwcGVyLnNldE1vZGUoQ2hvbG1vZFNpbXBsaWNpYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBnX2xkbHRfY29sbWFqb3JfbG93ZXI7IGdfbGRsdF9jb2xtYWpvcl9sb3dlci5zZXRNb2RlKENob2xtb2RMREx0KTsKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlTWF0cml4PFQ+LCBVcHBlcj4gZ19sZGx0X2NvbG1ham9yX3VwcGVyOyBnX2xkbHRfY29sbWFqb3JfdXBwZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7CisgIAorICBDaG9sbW9kU3VwZXJub2RhbExMVDxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBjaG9sX2NvbG1ham9yX2xvd2VyOworICBDaG9sbW9kU3VwZXJub2RhbExMVDxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBjaG9sX2NvbG1ham9yX3VwcGVyOworICBDaG9sbW9kU2ltcGxpY2lhbExMVDxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBsbHRfY29sbWFqb3JfbG93ZXI7CisgIENob2xtb2RTaW1wbGljaWFsTExUPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGxsdF9jb2xtYWpvcl91cHBlcjsKKyAgQ2hvbG1vZFNpbXBsaWNpYWxMRExUPFNwYXJzZU1hdHJpeDxUPiwgTG93ZXI+IGxkbHRfY29sbWFqb3JfbG93ZXI7CisgIENob2xtb2RTaW1wbGljaWFsTERMVDxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBsZGx0X2NvbG1ham9yX3VwcGVyOworCisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhnX2Nob2xfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoZ19jaG9sX2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGx0X2NvbG1ham9yX2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGx0X2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGRsdF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhnX2xkbHRfY29sbWFqb3JfdXBwZXIpOworICAKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNob2xfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2hvbF9jb2xtYWpvcl91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGx0X2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGxkbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl91cHBlcik7CisKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChjaG9sX2NvbG1ham9yX2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChjaG9sX2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChsbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxsdF9jb2xtYWpvcl91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGRsdF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGRsdF9jb2xtYWpvcl91cHBlcik7Cit9CisKK3ZvaWQgdGVzdF9jaG9sbW9kX3N1cHBvcnQoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2Nob2xtb2RfVDxkb3VibGU+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X2Nob2xtb2RfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb21tYWluaXRpYWxpemVyLmNwcCBiL3Rlc3QvY29tbWFpbml0aWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0NGFkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29tbWFpbml0aWFsaXplci5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworCit0ZW1wbGF0ZTxpbnQgTTEsIGludCBNMiwgaW50IE4xLCBpbnQgTjI+Cit2b2lkIHRlc3RfYmxvY2tzKCkKK3sKKyAgTWF0cml4PGludCwgTTErTTIsIE4xK04yPiBtX2ZpeGVkOworICBNYXRyaXhYaSBtX2R5bmFtaWMoTTErTTIsIE4xK04yKTsKKworICBNYXRyaXg8aW50LCBNMSwgTjE+IG1hdDExOyBtYXQxMS5zZXRSYW5kb20oKTsKKyAgTWF0cml4PGludCwgTTEsIE4yPiBtYXQxMjsgbWF0MTIuc2V0UmFuZG9tKCk7CisgIE1hdHJpeDxpbnQsIE0yLCBOMT4gbWF0MjE7IG1hdDIxLnNldFJhbmRvbSgpOworICBNYXRyaXg8aW50LCBNMiwgTjI+IG1hdDIyOyBtYXQyMi5zZXRSYW5kb20oKTsKKworICBNYXRyaXhYaSBtYXR4MTEgPSBtYXQxMSwgbWF0eDEyID0gbWF0MTIsIG1hdHgyMSA9IG1hdDIxLCBtYXR4MjIgPSBtYXQyMjsKKworICB7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQxMiwgbWF0MjEsIG1hdHgyMikuZmluaXNoZWQoKSwgKG1fZHluYW1pYyA8PCBtYXQxMSwgbWF0eDEyLCBtYXQyMSwgbWF0eDIyKS5maW5pc2hlZCgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNMSxOMT4oKSksIG1hdDExKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8TTEsTjI+KCkpLCBtYXQxMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8TTIsTjE+KCkpLCBtYXQyMSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPE0yLE4yPigpKSwgbWF0MjIpOworICAgIFZFUklGWV9JU19FUVVBTCgobV9maXhlZCA8PCBtYXQxMiwgbWF0MTEsIG1hdHgyMSwgbWF0MjIpLmZpbmlzaGVkKCksIChtX2R5bmFtaWMgPDwgbWF0MTIsIG1hdHgxMSwgbWF0eDIxLCBtYXQyMikuZmluaXNoZWQoKSk7CisgIH0KKworICBpZihOMSA+IDApCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCgobV9maXhlZCA8PCBtYXQxMSwgbWF0MTIsIG1hdDExLCBtYXQyMSwgbWF0MjIpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCgobV9maXhlZCA8PCBtYXQxMSwgbWF0MTIsIG1hdDIxLCBtYXQyMSwgbWF0MjIpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBhbGxvdyBpbnNlcnRpb24gb2YgemVyby1jb2x1bW4gYmxvY2tzOgorICAgIFZFUklGWV9JU19FUVVBTCgobV9maXhlZCA8PCBtYXQxMSwgbWF0MTIsIG1hdDExLCBtYXQxMSwgbWF0MjEsIG1hdDIxLCBtYXQyMikuZmluaXNoZWQoKSwgKG1fZHluYW1pYyA8PCBtYXQxMiwgbWF0MjIpLmZpbmlzaGVkKCkpOworICB9CisgIGlmKE0xICE9IE0yKQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKG1fZml4ZWQgPDwgbWF0MTEsIG1hdDIxLCBtYXQxMiwgbWF0MjIpKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPGludCBOPgorc3RydWN0IHRlc3RfYmxvY2tfcmVjdXJzaW9uCit7CisgIHN0YXRpYyB2b2lkIHJ1bigpCisgIHsKKyAgICB0ZXN0X2Jsb2NrczwoTj4+NikmMywgKE4+PjQpJjMsIChOPj4yKSYzLCBOICYgMz4oKTsKKyAgICB0ZXN0X2Jsb2NrX3JlY3Vyc2lvbjxOLTE+OjpydW4oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IHRlc3RfYmxvY2tfcmVjdXJzaW9uPC0xPgoreworICBzdGF0aWMgdm9pZCBydW4oKSB7IH0KK307CisKK3ZvaWQgdGVzdF9jb21tYWluaXRpYWxpemVyKCkKK3sKKyAgTWF0cml4M2QgbTM7CisgIE1hdHJpeDRkIG00OworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCAobTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCkgKTsKKyAgCisgICNpZm5kZWYgX01TQ19WRVIKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIChtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkgKTsKKyAgI2VuZGlmCisKKyAgZG91YmxlIGRhdGFbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKyAgTWF0cml4M2QgcmVmID0gTWFwPE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPiA+KGRhdGEpOworCisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYgKTsKKworICBWZWN0b3IzZCB2ZWNbM107CisgIHZlY1swXSA8PCAxLCA0LCA3OworICB2ZWNbMV0gPDwgMiwgNSwgODsKKyAgdmVjWzJdIDw8IDMsIDYsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0sIHZlY1sxXSwgdmVjWzJdOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYpOworCisgIHZlY1swXSA8PCAxLCAyLCAzOworICB2ZWNbMV0gPDwgNCwgNSwgNjsKKyAgdmVjWzJdIDw8IDcsIDgsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0udHJhbnNwb3NlKCksCisgICAgICAgIDQsIDUsIDYsCisgICAgICAgIHZlY1syXS50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmKTsKKworCisgIC8vIHJlY3Vyc2l2ZWx5IHRlc3QgYWxsIGJsb2NrLXNpemVzIGZyb20gMCB0byAzOgorICB0ZXN0X2Jsb2NrX3JlY3Vyc2lvbjwoMTw8OCkgLSAxPigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb25qdWdhdGVfZ3JhZGllbnQuY3BwIGIvdGVzdC9jb25qdWdhdGVfZ3JhZGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjJmZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nvbmp1Z2F0ZV9ncmFkaWVudC5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlTGluZWFyU29sdmVycz4KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgST4gdm9pZCB0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudF9UKCkKK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8VCwwLEk+IFNwYXJzZU1hdHJpeFR5cGU7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyICAgICAgPiBjZ19jb2xtYWpvcl9sb3dlcl9kaWFnOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciAgICAgID4gY2dfY29sbWFqb3JfdXBwZXJfZGlhZzsKKyAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXJ8VXBwZXI+IGNnX2NvbG1ham9yX2xvdXBfZGlhZzsKKyAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IGNnX2NvbG1ham9yX2xvd2VyX0k7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIFVwcGVyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBjZ19jb2xtYWpvcl91cHBlcl9JOworCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX2xvd2VyX2RpYWcpICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19jb2xtYWpvcl91cHBlcl9kaWFnKSAgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG91cF9kaWFnKSAgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX2xvd2VyX0kpICAgICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19jb2xtYWpvcl91cHBlcl9JKSAgICAgKTsKK30KKwordm9pZCB0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudCgpCit7CisgIENBTExfU1VCVEVTVF8xKCggdGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVDxkb3VibGUsaW50PigpICkpOworICBDQUxMX1NVQlRFU1RfMigoIHRlc3RfY29uanVnYXRlX2dyYWRpZW50X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCB0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudF9UPGRvdWJsZSxsb25nIGludD4oKSApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY29uc2VydmF0aXZlX3Jlc2l6ZS5jcHAgYi90ZXN0L2NvbnNlcnZhdGl2ZV9yZXNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODQyMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbnNlcnZhdGl2ZV9yZXNpemUuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU3RvcmFnZT4KK3ZvaWQgcnVuX21hdHJpeF90ZXN0cygpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCBTdG9yYWdlPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIE1hdHJpeFR5cGUgbSwgbjsKKworICAvLyBib3VuZGFyeSBjYXNlcyAuLi4KKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSgxLDUwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCwxLDUwKSk7CisKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCwxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCw1MCwxKSk7CisKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCw1MCk7CisgIFZFUklGWV9JU19BUFBST1gobSwgbi5ibG9jaygwLDAsNTAsNTApKTsKKworICAvLyByYW5kb20gc2hyaW5raW5nIC4uLgorICBmb3IgKGludCBpPTA7IGk8MjU7ICsraSkKKyAgeworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDUwKTsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSw1MCk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplKHJvd3MsY29scyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCxyb3dzLGNvbHMpKTsKKyAgfQorCisgIC8vIHJhbmRvbSBncm93aW5nIHdpdGggemVyb2luZyAuLi4KKyAgZm9yIChpbnQgaT0wOyBpPDI1OyArK2kpCisgIHsKKyAgICBjb25zdCBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oNTAsNzUpOworICAgIGNvbnN0IEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig1MCw3NSk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykpOworICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jaygwLDAsbi5yb3dzKCksbi5jb2xzKCkpLCBuKTsKKyAgICBWRVJJRlkoIHJvd3M8PTUwIHx8IG0uYmxvY2soNTAsMCxyb3dzLTUwLGNvbHMpLnN1bSgpID09IFNjYWxhcigwKSApOworICAgIFZFUklGWSggY29sczw9NTAgfHwgbS5ibG9jaygwLDUwLHJvd3MsY29scy01MCkuc3VtKCkgPT0gU2NhbGFyKDApICk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcnVuX3ZlY3Rvcl90ZXN0cygpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgRWlnZW46OkR5bmFtaWM+IFZlY3RvclR5cGU7CisKKyAgVmVjdG9yVHlwZSBtLCBuOworCisgIC8vIGJvdW5kYXJ5IGNhc2VzIC4uLgorICBtID0gbiA9IFZlY3RvclR5cGU6OlJhbmRvbSg1MCk7CisgIG0uY29uc2VydmF0aXZlUmVzaXplKDEpOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLDEpKTsKKworICBtID0gbiA9IFZlY3RvclR5cGU6OlJhbmRvbSg1MCk7CisgIG0uY29uc2VydmF0aXZlUmVzaXplKDUwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCw1MCkpOworICAKKyAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShtLnJvd3MoKSwxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCwxKSk7CisKKyAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShtLnJvd3MoKSw1MCk7CisgIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsNTApKTsKKworICAvLyByYW5kb20gc2hyaW5raW5nIC4uLgorICBmb3IgKGludCBpPTA7IGk8NTA7ICsraSkKKyAgeworICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOworICAgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKKyAgICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShzaXplKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLHNpemUpKTsKKyAgICAKKyAgICBtID0gbiA9IFZlY3RvclR5cGU6OlJhbmRvbSg1MCk7CisgICAgbS5jb25zZXJ2YXRpdmVSZXNpemUobS5yb3dzKCksIHNpemUpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsc2l6ZSkpOworICB9CisKKyAgLy8gcmFuZG9tIGdyb3dpbmcgd2l0aCB6ZXJvaW5nIC4uLgorICBmb3IgKGludCBpPTA7IGk8NTA7ICsraSkKKyAgeworICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDEwMCk7CisgICAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShWZWN0b3JUeXBlOjpaZXJvKHNpemUpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uc2VnbWVudCgwLDUwKSwgbik7CisgICAgVkVSSUZZKCBzaXplPD01MCB8fCBtLnNlZ21lbnQoNTAsc2l6ZS01MCkuc3VtKCkgPT0gU2NhbGFyKDApICk7CisgICAgCisgICAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz46Olplcm8oMSxzaXplKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLnNlZ21lbnQoMCw1MCksIG4pOworICAgIFZFUklGWSggc2l6ZTw9NTAgfHwgbS5zZWdtZW50KDUwLHNpemUtNTApLnN1bSgpID09IFNjYWxhcigwKSApOworICB9Cit9CisKK3ZvaWQgdGVzdF9jb25zZXJ2YXRpdmVfcmVzaXplKCkKK3sKKyAgZm9yKGludCBpPTA7IGk8Z19yZXBlYXQ7ICsraSkKKyAgeworICAgIENBTExfU1VCVEVTVF8xKChydW5fbWF0cml4X3Rlc3RzPGludCwgRWlnZW46OlJvd01ham9yPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKHJ1bl9tYXRyaXhfdGVzdHM8aW50LCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigocnVuX21hdHJpeF90ZXN0czxmbG9hdCwgRWlnZW46OlJvd01ham9yPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHJ1bl9tYXRyaXhfdGVzdHM8ZmxvYXQsIEVpZ2VuOjpDb2xNYWpvcj4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChydW5fbWF0cml4X3Rlc3RzPGRvdWJsZSwgRWlnZW46OlJvd01ham9yPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHJ1bl9tYXRyaXhfdGVzdHM8ZG91YmxlLCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgocnVuX21hdHJpeF90ZXN0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBFaWdlbjo6Um93TWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgocnVuX21hdHJpeF90ZXN0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgocnVuX21hdHJpeF90ZXN0czxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgRWlnZW46OlJvd01ham9yPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKHJ1bl9tYXRyaXhfdGVzdHM8c3RkOjpjb21wbGV4PGRvdWJsZT4sIEVpZ2VuOjpDb2xNYWpvcj4oKSkpOworCisgICAgQ0FMTF9TVUJURVNUXzEoKHJ1bl92ZWN0b3JfdGVzdHM8aW50PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHJ1bl92ZWN0b3JfdGVzdHM8ZmxvYXQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygocnVuX3ZlY3Rvcl90ZXN0czxkb3VibGU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgocnVuX3ZlY3Rvcl90ZXN0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChydW5fdmVjdG9yX3Rlc3RzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NvbnN0cnVjdG9yLmNwcCBiL3Rlc3QvY29uc3RydWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzllMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbnN0cnVjdG9yLmNwcApAQCAtMCwwICsxLDg0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNyBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IFdyYXBwZXIKK3sKKyAgTWF0cml4VHlwZSBtX21hdDsKKyAgaW5saW5lIFdyYXBwZXIoY29uc3QgTWF0cml4VHlwZSAmeCkgOiBtX21hdCh4KSB7fQorICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgTWF0cml4VHlwZSYgKCkgY29uc3QgeyByZXR1cm4gbV9tYXQ7IH0KKyAgaW5saW5lIG9wZXJhdG9yIE1hdHJpeFR5cGUmICgpIHsgcmV0dXJuIG1fbWF0OyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGN0b3JfaW5pdDEoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLy8gQ2hlY2sgbG9naWMgaW4gUGxhaW5PYmplY3RCYXNlOjpfaW5pdDEKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBNYXRyaXhUeXBlIG0xKG0wKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBNYXRyaXhUeXBlIG0yKG0wK20wKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBNYXRyaXhUeXBlIG0yKG0wLmJsb2NrKDAsMCxyb3dzLGNvbHMpKSAsIDEpOworCisgIFdyYXBwZXI8TWF0cml4VHlwZT4gd3JhcHBlcihtMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBNYXRyaXhUeXBlIG0zKHdyYXBwZXIpICwgMSk7Cit9CisKKwordm9pZCB0ZXN0X2NvbnN0cnVjdG9yKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGN0b3JfaW5pdDEoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIHsKKyAgICBNYXRyaXg8SW5kZXgsMSwxPiBhKDEyMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMyk7CisgIH0KKyAgeworICAgIE1hdHJpeDxJbmRleCwxLDE+IGEoMTIzLjApOworICAgIFZFUklGWV9JU19FUVVBTChhWzBdLCAxMjMpOworICB9CisgIHsKKyAgICBNYXRyaXg8ZmxvYXQsMSwxPiBhKDEyMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMy5mKTsKKyAgfQorICB7CisgICAgQXJyYXk8SW5kZXgsMSwxPiBhKDEyMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMyk7CisgIH0KKyAgeworICAgIEFycmF5PEluZGV4LDEsMT4gYSgxMjMuMCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMyk7CisgIH0KKyAgeworICAgIEFycmF5PGZsb2F0LDEsMT4gYSgxMjMpOworICAgIFZFUklGWV9JU19FUVVBTChhWzBdLCAxMjMuZik7CisgIH0KKyAgeworICAgIEFycmF5PEluZGV4LDMsMz4gYSgxMjMpOworICAgIFZFUklGWV9JU19FUVVBTChhKDQpLCAxMjMpOworICB9CisgIHsKKyAgICBBcnJheTxJbmRleCwzLDM+IGEoMTIzLjApOworICAgIFZFUklGWV9JU19FUVVBTChhKDQpLCAxMjMpOworICB9CisgIHsKKyAgICBBcnJheTxmbG9hdCwzLDM+IGEoMTIzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYSg0KSwgMTIzLmYpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Nvcm5lcnMuY3BwIGIvdGVzdC9jb3JuZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY0YzMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JuZXJzLmNwcApAQCAtMCwwICsxLDExOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgQ09NUEFSRV9DT1JORVIoQSxCKSBcCisgIFZFUklGWV9JU19FUVVBTChtYXRyaXguQSwgbWF0cml4LkIpOyBcCisgIFZFUklGWV9JU19FUVVBTChjb25zdF9tYXRyaXguQSwgY29uc3RfbWF0cml4LkIpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvcm5lcnMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEscm93cyk7CisgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpOworCisgIE1hdHJpeFR5cGUgbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIGNvbnN0IE1hdHJpeFR5cGUgY29uc3RfbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisKKyAgQ09NUEFSRV9DT1JORVIodG9wTGVmdENvcm5lcihyLGMpLCBibG9jaygwLDAscixjKSk7CisgIENPTVBBUkVfQ09STkVSKHRvcFJpZ2h0Q29ybmVyKHIsYyksIGJsb2NrKDAsY29scy1jLHIsYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21MZWZ0Q29ybmVyKHIsYyksIGJsb2NrKHJvd3MtciwwLHIsYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21SaWdodENvcm5lcihyLGMpLCBibG9jayhyb3dzLXIsY29scy1jLHIsYykpOworCisgIEluZGV4IHNyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzKSAtIDE7CisgIEluZGV4IG5yID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLXNyKTsKKyAgSW5kZXggc2MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpIC0gMTsKKyAgSW5kZXggbmMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMtc2MpOworCisgIENPTVBBUkVfQ09STkVSKHRvcFJvd3MociksIGJsb2NrKDAsMCxyLGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlUm93cyhzcixuciksIGJsb2NrKHNyLDAsbnIsY29scykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21Sb3dzKHIpLCBibG9jayhyb3dzLXIsMCxyLGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobGVmdENvbHMoYyksIGJsb2NrKDAsMCxyb3dzLGMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlQ29scyhzYyxuYyksIGJsb2NrKDAsc2Mscm93cyxuYykpOworICBDT01QQVJFX0NPUk5FUihyaWdodENvbHMoYyksIGJsb2NrKDAsY29scy1jLHJvd3MsYykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgQ1Jvd3MsIGludCBDQ29scywgaW50IFNSb3dzLCBpbnQgU0NvbHM+IHZvaWQgY29ybmVyc19maXhlZHNpemUoKQoreworICBNYXRyaXhUeXBlIG1hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworICBjb25zdCBNYXRyaXhUeXBlIGNvbnN0X21hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworCisgIGVudW0geworICAgIHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgciA9IENSb3dzLAorICAgIGMgPSBDQ29scywKKwlzciA9IFNSb3dzLAorCXNjID0gU0NvbHMKKyAgfTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPigwLGNvbHMtYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsYz4ocm93cy1yLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPihyb3dzLXIsY29scy1jKSkpOworCisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsRHluYW1pYz4ocixjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsRHluYW1pYz4ocixjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUm93czxyPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KDAsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgbWlkZGxlUm93czxyPihzcikpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4oc3IsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tUm93czxyPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KHJvd3MtciwwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBsZWZ0Q29sczxjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgbWlkZGxlQ29sczxjPihzYykpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCxzYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgcmlnaHRDb2xzPGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCxjb2xzLWMpKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsYz4oMCwwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsYz4oMCxjb2xzLWMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KHJvd3MtciwwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsYz4ocm93cy1yLGNvbHMtYykpKTsKKworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPER5bmFtaWMsYz4ocixjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPER5bmFtaWMsYz4ocixjKSkpOworCisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcFJvd3M8cj4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIG1pZGRsZVJvd3M8cj4oc3IpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KHNyLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJvd3M8cj4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPihyb3dzLXIsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgbGVmdENvbHM8Yz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIG1pZGRsZUNvbHM8Yz4oc2MpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsc2MpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHJpZ2h0Q29sczxjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsY29scy1jKSkpOworfQorCit2b2lkIHRlc3RfY29ybmVycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNvcm5lcnMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjb3JuZXJzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGNvcm5lcnMoTWF0cml4PGludCwxMCwxMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggY29ybmVycyhNYXRyaXhYY2YoNSwgNykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNvcm5lcnMoTWF0cml4WGYoMjEsIDIwKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCggY29ybmVyc19maXhlZHNpemU8TWF0cml4PGZsb2F0LCAxLCAxPiwgMSwgMSwgMCwgMD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIGNvcm5lcnNfZml4ZWRzaXplPE1hdHJpeDRkLDIsMiwxLDE+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBjb3JuZXJzX2ZpeGVkc2l6ZTxNYXRyaXg8aW50LDEwLDEyPiw0LDcsNSwyPigpICkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2N0b3JsZWFrLmNwcCBiL3Rlc3QvY3RvcmxlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNThmNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2N0b3JsZWFrLmNwcApAQCAtMCwwICsxLDY5IEBACisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPiAgLy8gc3RkOjpleGNlcHRpb24KKworc3RydWN0IEZvbworeworICBzdGF0aWMgSW5kZXggb2JqZWN0X2NvdW50OworICBzdGF0aWMgSW5kZXggb2JqZWN0X2xpbWl0OworICBpbnQgZHVtbXk7CisKKyAgRm9vKCkKKyAgeworI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyAgICAvLyBUT0RPOiBJcyB0aGlzIHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcz8KKyAgICBpZiAoRm9vOjpvYmplY3RfY291bnQgPiBGb286Om9iamVjdF9saW1pdCkgeyBzdGQ6OmNvdXQgPDwgIlxuVGhyb3chXG4iOyB0aHJvdyBGb286OkZhaWwoKTsgfQorI2VuZGlmCisJICBzdGQ6OmNvdXQgPDwgJysnOworICAgICsrRm9vOjpvYmplY3RfY291bnQ7CisgIH0KKworICB+Rm9vKCkKKyAgeworCSAgc3RkOjpjb3V0IDw8ICctJzsKKyAgICAtLUZvbzo6b2JqZWN0X2NvdW50OworICB9CisKKyAgY2xhc3MgRmFpbCA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7fTsKK307CisKK0luZGV4IEZvbzo6b2JqZWN0X2NvdW50ID0gMDsKK0luZGV4IEZvbzo6b2JqZWN0X2xpbWl0ID0gMDsKKworI3VuZGVmIEVJR0VOX1RFU1RfTUFYX1NJWkUKKyNkZWZpbmUgRUlHRU5fVEVTVF9NQVhfU0laRSAzCisKK3ZvaWQgdGVzdF9jdG9ybGVhaygpCit7CisgIHR5cGVkZWYgTWF0cml4PEZvbywgRHluYW1pYywgRHluYW1pYz4gTWF0cml4WDsKKyAgdHlwZWRlZiBNYXRyaXg8Rm9vLCBEeW5hbWljLCAxPiBWZWN0b3JYOworICBGb286Om9iamVjdF9jb3VudCA9IDA7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSksIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIEZvbzo6b2JqZWN0X2xpbWl0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cypjb2xzIC0gMik7CisgICAgc3RkOjpjb3V0IDw8ICJvYmplY3RfbGltaXQgPSIgPDwgRm9vOjpvYmplY3RfbGltaXQgPDwgc3RkOjplbmRsOworI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyAgICB0cnkKKyAgICB7CisjZW5kaWYKKyAgICAJc3RkOjpjb3V0IDw8ICAgICAgICJcbk1hdHJpeFggbSgiIDw8IHJvd3MgPDwgIiwgIiA8PCBjb2xzIDw8ICIpO1xuIjsKKyAgICAgIE1hdHJpeFggbShyb3dzLCBjb2xzKTsKKyNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgICBWRVJJRlkoZmFsc2UpOyAgLy8gbm90IHJlYWNoZWQgaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZAorICAgIH0KKyAgICBjYXRjaCAoY29uc3QgRm9vOjpGYWlsJikgeyAvKiBpZ25vcmUgKi8gfQorI2VuZGlmCisgICAgVkVSSUZZX0lTX0VRVUFMKEluZGV4KDApLCBGb286Om9iamVjdF9jb3VudCk7CisKKyAgICB7CisgICAgICBGb286Om9iamVjdF9saW1pdCA9IChyb3dzKzEpKihjb2xzKzEpOworICAgICAgTWF0cml4WCBBKHJvd3MsIGNvbHMpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKEZvbzo6b2JqZWN0X2NvdW50LCByb3dzKmNvbHMpOworICAgICAgVmVjdG9yWCB2PUEucm93KDApOworICAgICAgVkVSSUZZX0lTX0VRVUFMKEZvbzo6b2JqZWN0X2NvdW50LCAocm93cysxKSpjb2xzKTsKKyAgICAgIHYgPSBBLmNvbCgwKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChGb286Om9iamVjdF9jb3VudCwgcm93cyooY29scysxKSk7CisgICAgfQorICAgIFZFUklGWV9JU19FUVVBTChJbmRleCgwKSwgRm9vOjpvYmplY3RfY291bnQpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2N1ZGFfYmFzaWMuY3UgYi90ZXN0L2N1ZGFfYmFzaWMuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZTQxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3VkYV9iYXNpYy5jdQpAQCAtMCwwICsxLDE3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIHdvcmthcm91bmQgaXNzdWUgYmV0d2VlbiBnY2MgPj0gNC43IGFuZCBjdWRhIDUuNQorI2lmIChkZWZpbmVkIF9fR05VQ19fKSAmJiAoX19HTlVDX18+NCB8fCBfX0dOVUNfTUlOT1JfXz49NykKKyAgI3VuZGVmIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUworICAjdW5kZWYgX0dMSUJDWFhfVVNFX0lOVDEyOAorI2VuZGlmCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3VkYV9iYXNpYworI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50CisKKyNpbmNsdWRlIDxtYXRoX2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGN1ZGEuaD4KKyNpZiBkZWZpbmVkIF9fQ1VEQUNDX1ZFUl9fICYmIF9fQ1VEQUNDX1ZFUl9fID49IDcwNTAwCisjaW5jbHVkZSA8Y3VkYV9mcDE2Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiY3VkYV9jb21tb24uaCIKKworLy8gQ2hlY2sgdGhhdCBkZW5zZSBtb2R1bGVzIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQgYnkgbnZjYworI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCisvLyBzdHJ1Y3QgRm9veworLy8gICBFSUdFTl9ERVZJQ0VfRlVOQworLy8gICB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IGZsb2F0KiBtYXRzLCBmbG9hdCogdmVjcykgY29uc3QgeworLy8gICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKy8vICAgLy8gICBNYXRyaXgzZiBNKGRhdGEpOworLy8gICAvLyAgIFZlY3RvcjNmIHgoZGF0YSs5KTsKKy8vICAgLy8gICBNYXA8VmVjdG9yM2Y+KGRhdGErOSkgPSBNLmludmVyc2UoKSAqIHg7CisvLyAgICAgTWF0cml4M2YgTShtYXRzK2kvMTYpOworLy8gICAgIFZlY3RvcjNmIHgodmVjcytpKjMpOworLy8gICAvLyAgIHVzaW5nIHN0ZDo6bWluOworLy8gICAvLyAgIHVzaW5nIHN0ZDo6c3FydDsKKy8vICAgICBNYXA8VmVjdG9yM2Y+KHZlY3MraSozKSA8PCB4Lm1pbkNvZWZmKCksIDEsIDI7Ly8gLyB4LmRvdCh4KTsvLyhNLmludmVyc2UoKSAqICB4KSAvIHgueCgpOworLy8gICAgIC8veCA9IHgqMiArIHgueSgpICogeCArIHggKiB4Lm1heENvZWZmKCkgLSB4IC8geC5zdW0oKTsKKy8vICAgfQorLy8gfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBjb2VmZl93aXNlIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICBUIHgxKGluK2kpOworICAgIFQgeDIoaW4raSsxKTsKKyAgICBUIHgzKGluK2krMik7CisgICAgTWFwPFQ+IHJlcyhvdXQraSpUOjpNYXhTaXplQXRDb21waWxlVGltZSk7CisgICAgCisgICAgcmVzLmFycmF5KCkgKz0gKGluWzBdICogeDEgKyB4MikuYXJyYXkoKSAqIHgzLmFycmF5KCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgcmVwbGljYXRlIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICBUIHgxKGluK2kpOworICAgIGludCBzdGVwICAgPSB4MS5zaXplKCkgKiA0OworICAgIGludCBzdHJpZGUgPSAzICogc3RlcDsKKyAgICAKKyAgICB0eXBlZGVmIE1hcDxBcnJheTx0eXBlbmFtZSBUOjpTY2FsYXIsRHluYW1pYyxEeW5hbWljPiA+IE1hcFR5cGU7CisgICAgTWFwVHlwZShvdXQraSpzdHJpZGUrMCpzdGVwLCB4MS5yb3dzKCkqMiwgeDEuY29scygpKjIpID0geDEucmVwbGljYXRlKDIsMik7CisgICAgTWFwVHlwZShvdXQraSpzdHJpZGUrMSpzdGVwLCB4MS5yb3dzKCkqMywgeDEuY29scygpKSA9IGluW2ldICogeDEuY29sd2lzZSgpLnJlcGxpY2F0ZSgzKTsKKyAgICBNYXBUeXBlKG91dCtpKnN0cmlkZSsyKnN0ZXAsIHgxLnJvd3MoKSwgeDEuY29scygpKjMpID0gaW5baV0gKiB4MS5yb3d3aXNlKCkucmVwbGljYXRlKDMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHJlZHV4IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICBpbnQgTiA9IDEwOworICAgIFQgeDEoaW4raSk7CisgICAgb3V0W2kqTiswXSA9IHgxLm1pbkNvZWZmKCk7CisgICAgb3V0W2kqTisxXSA9IHgxLm1heENvZWZmKCk7CisgICAgb3V0W2kqTisyXSA9IHgxLnN1bSgpOworICAgIG91dFtpKk4rM10gPSB4MS5wcm9kKCk7CisgICAgb3V0W2kqTis0XSA9IHgxLm1hdHJpeCgpLnNxdWFyZWROb3JtKCk7CisgICAgb3V0W2kqTis1XSA9IHgxLm1hdHJpeCgpLm5vcm0oKTsKKyAgICBvdXRbaSpOKzZdID0geDEuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CisgICAgb3V0W2kqTis3XSA9IHgxLnJvd3dpc2UoKS5tYXhDb2VmZigpLnN1bSgpOworICAgIG91dFtpKk4rOF0gPSB4MS5tYXRyaXgoKS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RydWN0IHByb2RfdGVzdCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDE6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQxOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBUMTo6U2NhbGFyLCBUMTo6Um93c0F0Q29tcGlsZVRpbWUsIFQyOjpDb2xzQXRDb21waWxlVGltZT4gVDM7CisgICAgVDEgeDEoaW4raSk7CisgICAgVDIgeDIoaW4raSsxKTsKKyAgICBNYXA8VDM+IHJlcyhvdXQraSpUMzo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOworICAgIHJlcyArPSBpbltpXSAqIHgxICogeDI7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBkaWFnb25hbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDE6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQxOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICBUMSB4MShpbitpKTsKKyAgICBNYXA8VDI+IHJlcyhvdXQraSpUMjo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOworICAgIHJlcyArPSB4MS5kaWFnb25hbCgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGVpZ2VudmFsdWVzIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKKyAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBUOjpTY2FsYXIsIFQ6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWM7CisgICAgVCBNKGluK2kpOworICAgIE1hcDxWZWM+IHJlcyhvdXQraSpWZWM6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKKyAgICBUIEEgPSBNKk0uYWRqb2ludCgpOworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8VD4gZWlnOworICAgIGVpZy5jb21wdXRlRGlyZWN0KE0pOworICAgIHJlcyA9IGVpZy5laWdlbnZhbHVlcygpOworICB9Cit9OworCit2b2lkIHRlc3RfY3VkYV9iYXNpYygpCit7CisgIGVpX3Rlc3RfaW5pdF9jdWRhKCk7CisgIAorICBpbnQgbnRocmVhZHMgPSAxMDA7CisgIEVpZ2VuOjpWZWN0b3JYZiBpbiwgb3V0OworICAKKyAgI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgIGludCBkYXRhX3NpemUgPSBudGhyZWFkcyAqIDUxMjsKKyAgaW4uc2V0UmFuZG9tKGRhdGFfc2l6ZSk7CisgIG91dC5zZXRSYW5kb20oZGF0YV9zaXplKTsKKyAgI2VuZGlmCisgIAorICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKGNvZWZmX3dpc2U8VmVjdG9yM2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOworICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKGNvZWZmX3dpc2U8QXJyYXk0NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOworICAKKyAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fY3VkYShyZXBsaWNhdGU8QXJyYXk0Zj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisgIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2N1ZGEocmVwbGljYXRlPEFycmF5MzNmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKKyAgCisgIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2N1ZGEocmVkdXg8QXJyYXk0Zj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisgIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2N1ZGEocmVkdXg8TWF0cml4M2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOworICAKKyAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fY3VkYShwcm9kX3Rlc3Q8TWF0cml4M2YsTWF0cml4M2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOworICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKHByb2RfdGVzdDxNYXRyaXg0ZixWZWN0b3I0Zj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisgIAorICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKGRpYWdvbmFsPE1hdHJpeDNmLFZlY3RvcjNmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fY3VkYShkaWFnb25hbDxNYXRyaXg0ZixWZWN0b3I0Zj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisgIAorICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKGVpZ2VudmFsdWVzPE1hdHJpeDNmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fY3VkYShlaWdlbnZhbHVlczxNYXRyaXgyZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3VkYV9jb21tb24uaCBiL3Rlc3QvY3VkYV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzM3NjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jdWRhX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTAxIEBACisKKyNpZm5kZWYgRUlHRU5fVEVTVF9DVURBX0NPTU1PTl9ICisjZGVmaW5lIEVJR0VOX1RFU1RfQ1VEQV9DT01NT05fSAorCisjaW5jbHVkZSA8Y3VkYS5oPgorI2luY2x1ZGUgPGN1ZGFfcnVudGltZS5oPgorI2luY2x1ZGUgPGN1ZGFfcnVudGltZV9hcGkuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmbmRlZiBfX0NVREFDQ19fCitkaW0zIHRocmVhZElkeCwgYmxvY2tEaW0sIGJsb2NrSWR4OworI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUgSW5wdXQsIHR5cGVuYW1lIE91dHB1dD4KK3ZvaWQgcnVuX29uX2NwdShjb25zdCBLZXJuZWwmIGtlciwgaW50IG4sIGNvbnN0IElucHV0JiBpbiwgT3V0cHV0JiBvdXQpCit7CisgIGZvcihpbnQgaT0wOyBpPG47IGkrKykKKyAgICBrZXIoaSwgaW4uZGF0YSgpLCBvdXQuZGF0YSgpKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+CitfX2dsb2JhbF9fCit2b2lkIHJ1bl9vbl9jdWRhX21ldGFfa2VybmVsKGNvbnN0IEtlcm5lbCBrZXIsIGludCBuLCBjb25zdCBJbnB1dCogaW4sIE91dHB1dCogb3V0KQoreworICBpbnQgaSA9IHRocmVhZElkeC54ICsgYmxvY2tJZHgueCpibG9ja0RpbS54OworICBpZihpPG4pIHsKKyAgICBrZXIoaSwgaW4sIG91dCk7CisgIH0KK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Cit2b2lkIHJ1bl9vbl9jdWRhKGNvbnN0IEtlcm5lbCYga2VyLCBpbnQgbiwgY29uc3QgSW5wdXQmIGluLCBPdXRwdXQmIG91dCkKK3sKKyAgdHlwZW5hbWUgSW5wdXQ6OlNjYWxhciogIGRfaW47CisgIHR5cGVuYW1lIE91dHB1dDo6U2NhbGFyKiBkX291dDsKKyAgc3RkOjpwdHJkaWZmX3QgaW5fYnl0ZXMgID0gaW4uc2l6ZSgpICAqIHNpemVvZih0eXBlbmFtZSBJbnB1dDo6U2NhbGFyKTsKKyAgc3RkOjpwdHJkaWZmX3Qgb3V0X2J5dGVzID0gb3V0LnNpemUoKSAqIHNpemVvZih0eXBlbmFtZSBPdXRwdXQ6OlNjYWxhcik7CisgIAorICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luKSwgIGluX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworICAKKyAgY3VkYU1lbWNweShkX2luLCAgaW4uZGF0YSgpLCAgaW5fYnl0ZXMsICBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgY3VkYU1lbWNweShkX291dCwgb3V0LmRhdGEoKSwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgCisgIC8vIFNpbXBsZSBhbmQgbm9uLW9wdGltYWwgMUQgbWFwcGluZyBhc3N1bWluZyBuIGlzIG5vdCB0b28gbGFyZ2UKKyAgLy8gVGhhdCdzIG9ubHkgZm9yIHVuaXQgdGVzdGluZyEKKyAgZGltMyBCbG9ja3MoMTI4KTsKKyAgZGltMyBHcmlkcyggKG4raW50KEJsb2Nrcy54KS0xKS9pbnQoQmxvY2tzLngpICk7CisKKyAgY3VkYVRocmVhZFN5bmNocm9uaXplKCk7CisgIHJ1bl9vbl9jdWRhX21ldGFfa2VybmVsPDw8R3JpZHMsQmxvY2tzPj4+KGtlciwgbiwgZF9pbiwgZF9vdXQpOworICBjdWRhVGhyZWFkU3luY2hyb25pemUoKTsKKyAgCisgIC8vIGNoZWNrIGlucHV0cyBoYXZlIG5vdCBiZWVuIG1vZGlmaWVkCisgIGN1ZGFNZW1jcHkoY29uc3RfY2FzdDx0eXBlbmFtZSBJbnB1dDo6U2NhbGFyKj4oaW4uZGF0YSgpKSwgIGRfaW4sICBpbl9ieXRlcywgIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpOworICBjdWRhTWVtY3B5KG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpOworICAKKyAgY3VkYUZyZWUoZF9pbik7CisgIGN1ZGFGcmVlKGRfb3V0KTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Cit2b2lkIHJ1bl9hbmRfY29tcGFyZV90b19jdWRhKGNvbnN0IEtlcm5lbCYga2VyLCBpbnQgbiwgY29uc3QgSW5wdXQmIGluLCBPdXRwdXQmIG91dCkKK3sKKyAgSW5wdXQgIGluX3JlZiwgIGluX2N1ZGE7CisgIE91dHB1dCBvdXRfcmVmLCBvdXRfY3VkYTsKKyAgI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgIGluX3JlZiA9IGluX2N1ZGEgPSBpbjsKKyAgb3V0X3JlZiA9IG91dF9jdWRhID0gb3V0OworICAjZW5kaWYKKyAgcnVuX29uX2NwdSAoa2VyLCBuLCBpbl9yZWYsICBvdXRfcmVmKTsKKyAgcnVuX29uX2N1ZGEoa2VyLCBuLCBpbl9jdWRhLCBvdXRfY3VkYSk7CisgICNpZm5kZWYgX19DVURBX0FSQ0hfXworICBWRVJJRllfSVNfQVBQUk9YKGluX3JlZiwgaW5fY3VkYSk7CisgIFZFUklGWV9JU19BUFBST1gob3V0X3JlZiwgb3V0X2N1ZGEpOworICAjZW5kaWYKK30KKworCit2b2lkIGVpX3Rlc3RfaW5pdF9jdWRhKCkKK3sKKyAgaW50IGRldmljZSA9IDA7CisgIGN1ZGFEZXZpY2VQcm9wIGRldmljZVByb3A7CisgIGN1ZGFHZXREZXZpY2VQcm9wZXJ0aWVzKCZkZXZpY2VQcm9wLCBkZXZpY2UpOworICBzdGQ6OmNvdXQgPDwgIkNVREEgZGV2aWNlIGluZm86XG4iOworICBzdGQ6OmNvdXQgPDwgIiAgbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAiIDw8IGRldmljZVByb3AubmFtZSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgY2FwYWJpbGl0eTogICAgICAgICAgICAgICAgICAiIDw8IGRldmljZVByb3AubWFqb3IgPDwgIi4iIDw8IGRldmljZVByb3AubWlub3IgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIG11bHRpUHJvY2Vzc29yQ291bnQ6ICAgICAgICAgIiA8PCBkZXZpY2VQcm9wLm11bHRpUHJvY2Vzc29yQ291bnQgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIG1heFRocmVhZHNQZXJNdWx0aVByb2Nlc3NvcjogIiA8PCBkZXZpY2VQcm9wLm1heFRocmVhZHNQZXJNdWx0aVByb2Nlc3NvciA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgd2FycFNpemU6ICAgICAgICAgICAgICAgICAgICAiIDw8IGRldmljZVByb3Aud2FycFNpemUgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIHJlZ3NQZXJCbG9jazogICAgICAgICAgICAgICAgIiA8PCBkZXZpY2VQcm9wLnJlZ3NQZXJCbG9jayA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgY29uY3VycmVudEtlcm5lbHM6ICAgICAgICAgICAiIDw8IGRldmljZVByb3AuY29uY3VycmVudEtlcm5lbHMgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIGNsb2NrUmF0ZTogICAgICAgICAgICAgICAgICAgIiA8PCBkZXZpY2VQcm9wLmNsb2NrUmF0ZSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgY2FuTWFwSG9zdE1lbW9yeTogICAgICAgICAgICAiIDw8IGRldmljZVByb3AuY2FuTWFwSG9zdE1lbW9yeSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIiAgY29tcHV0ZU1vZGU6ICAgICAgICAgICAgICAgICAiIDw8IGRldmljZVByb3AuY29tcHV0ZU1vZGUgPDwgIlxuIjsKK30KKworI2VuZGlmIC8vIEVJR0VOX1RFU1RfQ1VEQV9DT01NT05fSApkaWZmIC0tZ2l0IGEvdGVzdC9kZW5zZUxNLmNwcCBiL3Rlc3QvZGVuc2VMTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhNzM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGVuc2VMTS5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIERlc2lyZSBOdWVudHNhIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTGV2ZW5iZXJnTWFycXVhcmR0PgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IERlbnNlTE0gOiBEZW5zZUZ1bmN0b3I8U2NhbGFyPgoreworICB0eXBlZGVmIERlbnNlRnVuY3RvcjxTY2FsYXI+IEJhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SmFjb2JpYW5UeXBlIEphY29iaWFuVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgCisgIERlbnNlTE0oaW50IG4sIGludCBtKSA6IERlbnNlRnVuY3RvcjxTY2FsYXI+KG4sbSkgCisgIHsgfQorIAorICBWZWN0b3JUeXBlIG1vZGVsKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBWZWN0b3JUeXBlJiB4KQorICB7CisgICAgVmVjdG9yVHlwZSB5OyAvLyBTaG91bGQgY2hhbmdlIHRvIHVzZSBleHByZXNzaW9uIHRlbXBsYXRlCisgICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsgCisgICAgaW50IG4gPSBCYXNlOjppbnB1dHMoKTsKKyAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpJTIgPT0gMCk7CisgICAgZWlnZW5fYXNzZXJ0KHV2LnNpemUoKSA9PSBuKTsKKyAgICBlaWdlbl9hc3NlcnQoeC5zaXplKCkgPT0gbSk7CisgICAgeS5zZXRaZXJvKG0pOworICAgIGludCBoYWxmID0gbi8yOworICAgIFZlY3RvckJsb2NrPGNvbnN0IFZlY3RvclR5cGU+IHUodXYsIDAsIGhhbGYpOworICAgIFZlY3RvckJsb2NrPGNvbnN0IFZlY3RvclR5cGU+IHYodXYsIGhhbGYsIGhhbGYpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKQorICAgICAgICB5KGopICs9IHUoaSkqc3RkOjpleHAoLSh4KGopLWkpKih4KGopLWkpLyh2KGkpKnYoaSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHk7CisgICAgCisgIH0KKyAgdm9pZCBpbml0UG9pbnRzKFZlY3RvclR5cGUmIHV2X3JlZiwgVmVjdG9yVHlwZSYgeCkKKyAgeworICAgIG1feCA9IHg7CisgICAgbV95ID0gdGhpcy0+bW9kZWwodXZfcmVmLCB4KTsKKyAgfQorICAKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIGZ2ZWMpCisgIHsKKyAgICAKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgICBpbnQgbiA9IEJhc2U6OmlucHV0cygpOworICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCklMiA9PSAwKTsKKyAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpID09IG4pOworICAgIGVpZ2VuX2Fzc2VydChmdmVjLnNpemUoKSA9PSBtKTsKKyAgICBpbnQgaGFsZiA9IG4vMjsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB1KHV2LCAwLCBoYWxmKTsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB2KHV2LCBoYWxmLCBoYWxmKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKKyAgICB7CisgICAgICBmdmVjKGopID0gbV95KGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspCisgICAgICB7CisgICAgICAgIGZ2ZWMoaikgLT0gdShpKSAqc3RkOjpleHAoLShtX3goaiktaSkqKG1feChqKS1pKS8odihpKSp2KGkpKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JUeXBlJiB1diwgSmFjb2JpYW5UeXBlJiBmamFjKQorICB7CisgICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsgCisgICAgaW50IG4gPSBCYXNlOjppbnB1dHMoKTsKKyAgICBlaWdlbl9hc3NlcnQobiA9PSB1di5zaXplKCkpOworICAgIGVpZ2VuX2Fzc2VydChmamFjLnJvd3MoKSA9PSBtKTsKKyAgICBlaWdlbl9hc3NlcnQoZmphYy5jb2xzKCkgPT0gbik7CisgICAgaW50IGhhbGYgPSBuLzI7CisgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdSh1diwgMCwgaGFsZik7CisgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdih1diwgaGFsZiwgaGFsZik7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCisgICAgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspCisgICAgICB7CisgICAgICAgIGZqYWMuY29lZmZSZWYoaixpKSA9IC1zdGQ6OmV4cCgtKG1feChqKS1pKSoobV94KGopLWkpLyh2KGkpKnYoaSkpKTsKKyAgICAgICAgZmphYy5jb2VmZlJlZihqLGkraGFsZikgPSAtMi4qdShpKSoobV94KGopLWkpKihtX3goaiktaSkvKHN0ZDo6cG93KHYoaSksMykpICogc3RkOjpleHAoLShtX3goaiktaSkqKG1feChqKS1pKS8odihpKSp2KGkpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIFZlY3RvclR5cGUgbV94LCBtX3k7IC8vRGF0YSBQb2ludHMKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgoraW50IHRlc3RfbWluaW1pemVMTShGdW5jdG9yVHlwZSYgZnVuY3RvciwgVmVjdG9yVHlwZSYgdXYpCit7CisgIExldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZT4gbG0oZnVuY3Rvcik7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsgCisgIAorICBpbmZvID0gbG0ubWluaW1pemUodXYpOworICAKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICAvL0ZJWE1FIENoZWNrIG90aGVyIHBhcmFtZXRlcnMKKyAgcmV0dXJuIGluZm87Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgoraW50IHRlc3RfbG1kZXIoRnVuY3RvclR5cGUmIGZ1bmN0b3IsIFZlY3RvclR5cGUmIHV2KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsgCisgIExldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZT4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5sbWRlcjEodXYpOworICAKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICAvL0ZJWE1FIENoZWNrIG90aGVyIHBhcmFtZXRlcnMKKyAgcmV0dXJuIGluZm87Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgoraW50IHRlc3RfbWluaW1pemVTdGVwcyhGdW5jdG9yVHlwZSYgZnVuY3RvciwgVmVjdG9yVHlwZSYgdXYpCit7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsgICAKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplSW5pdCh1dik7CisgIGlmIChpbmZvPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCisgICAgICByZXR1cm4gaW5mbzsKKyAgZG8gCisgIHsKKyAgICBpbmZvID0gbG0ubWluaW1pemVPbmVTdGVwKHV2KTsKKyAgfSB3aGlsZSAoaW5mbz09TGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJ1bm5pbmcpOworICAKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICAvL0ZJWE1FIENoZWNrIG90aGVyIHBhcmFtZXRlcnMKKyAgcmV0dXJuIGluZm87Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfZGVuc2VMTV9UKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8VCxEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgIAorICBpbnQgaW5wdXRzID0gMTA7IAorICBpbnQgdmFsdWVzID0gMTAwMDsgCisgIERlbnNlTE08VD4gZGVuc2VfZ2F1c3NpYW4oaW5wdXRzLCB2YWx1ZXMpOworICBWZWN0b3JUeXBlIHV2KGlucHV0cyksdXZfcmVmKGlucHV0cyk7CisgIFZlY3RvclR5cGUgeCh2YWx1ZXMpOworICAKKyAgLy8gR2VuZXJhdGUgdGhlIHJlZmVyZW5jZSBzb2x1dGlvbiAKKyAgdXZfcmVmIDw8IC0yLCAxLCA0ICw4LCA2LCAxLjgsIDEuMiwgMS4xLCAxLjkgLCAzOworICAKKyAgLy9HZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIGRhdGEgcG9pbnRzCisgIHguc2V0UmFuZG9tKCk7CisgIHggPSAxMCp4OworICB4LmFycmF5KCkgKz0gMTA7CisgIGRlbnNlX2dhdXNzaWFuLmluaXRQb2ludHModXZfcmVmLCB4KTsKKyAgCisgIC8vIEdlbmVyYXRlIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgCisgIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHUodXYsIDAsIGlucHV0cy8yKTsgCisgIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHYodXYsIGlucHV0cy8yLCBpbnB1dHMvMik7CisgIAorICAvLyBTb2x2ZSB0aGUgb3B0aW1pemF0aW9uIHByb2JsZW0KKyAgCisgIC8vU29sdmUgaW4gb25lIGdvCisgIHUuc2V0T25lcygpOyB2LnNldE9uZXMoKTsKKyAgdGVzdF9taW5pbWl6ZUxNKGRlbnNlX2dhdXNzaWFuLCB1dik7CisgIAorICAvL1NvbHZlIHVudGlsIHRoZSBtYWNoaW5lIHByZWNpc2lvbgorICB1LnNldE9uZXMoKTsgdi5zZXRPbmVzKCk7CisgIHRlc3RfbG1kZXIoZGVuc2VfZ2F1c3NpYW4sIHV2KTsgCisgIAorICAvLyBTb2x2ZSBzdGVwIGJ5IHN0ZXAKKyAgdi5zZXRPbmVzKCk7IHUuc2V0T25lcygpOworICB0ZXN0X21pbmltaXplU3RlcHMoZGVuc2VfZ2F1c3NpYW4sIHV2KTsKKyAgCit9CisKK3ZvaWQgdGVzdF9kZW5zZUxNKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9kZW5zZUxNX1Q8ZG91YmxlPigpKTsKKyAgCisgIC8vIENBTExfU1VCVEVTVF8yKHRlc3Rfc3BhcnNlTE1fVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGVuc2Vfc3RvcmFnZS5jcHAgYi90ZXN0L2RlbnNlX3N0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzcxMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RlbnNlX3N0b3JhZ2UuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFJvd3MsIGludCBDb2xzPgordm9pZCBkZW5zZV9zdG9yYWdlX2NvcHkoKQoreworICBzdGF0aWMgY29uc3QgaW50IFNpemUgPSAoKFJvd3M9PUR5bmFtaWMgfHwgQ29scz09RHluYW1pYykgPyBEeW5hbWljIDogUm93cypDb2xzKTsKKyAgdHlwZWRlZiBEZW5zZVN0b3JhZ2U8VCxTaXplLCBSb3dzLENvbHMsIDA+IERlbnNlU3RvcmFnZVR5cGU7CisgIAorICBjb25zdCBpbnQgcm93cyA9IChSb3dzPT1EeW5hbWljKSA/IDQgOiBSb3dzOworICBjb25zdCBpbnQgY29scyA9IChDb2xzPT1EeW5hbWljKSA/IDMgOiBDb2xzOworICBjb25zdCBpbnQgc2l6ZSA9IHJvd3MqY29sczsKKyAgRGVuc2VTdG9yYWdlVHlwZSByZWZlcmVuY2Uoc2l6ZSwgcm93cywgY29scyk7CisgIFQqIHJhd19yZWZlcmVuY2UgPSByZWZlcmVuY2UuZGF0YSgpOworICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHJhd19yZWZlcmVuY2VbaV0gPSBzdGF0aWNfY2FzdDxUPihpKTsKKyAgICAKKyAgRGVuc2VTdG9yYWdlVHlwZSBjb3BpZWRfcmVmZXJlbmNlKHJlZmVyZW5jZSk7CisgIGNvbnN0IFQqIHJhd19jb3BpZWRfcmVmZXJlbmNlID0gY29waWVkX3JlZmVyZW5jZS5kYXRhKCk7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgICAgVkVSSUZZX0lTX0VRVUFMKHJhd19yZWZlcmVuY2VbaV0sIHJhd19jb3BpZWRfcmVmZXJlbmNlW2ldKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBSb3dzLCBpbnQgQ29scz4KK3ZvaWQgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50KCkKK3sKKyAgc3RhdGljIGNvbnN0IGludCBTaXplID0gKChSb3dzPT1EeW5hbWljIHx8IENvbHM9PUR5bmFtaWMpID8gRHluYW1pYyA6IFJvd3MqQ29scyk7CisgIHR5cGVkZWYgRGVuc2VTdG9yYWdlPFQsU2l6ZSwgUm93cyxDb2xzLCAwPiBEZW5zZVN0b3JhZ2VUeXBlOworICAKKyAgY29uc3QgaW50IHJvd3MgPSAoUm93cz09RHluYW1pYykgPyA0IDogUm93czsKKyAgY29uc3QgaW50IGNvbHMgPSAoQ29scz09RHluYW1pYykgPyAzIDogQ29sczsKKyAgY29uc3QgaW50IHNpemUgPSByb3dzKmNvbHM7CisgIERlbnNlU3RvcmFnZVR5cGUgcmVmZXJlbmNlKHNpemUsIHJvd3MsIGNvbHMpOworICBUKiByYXdfcmVmZXJlbmNlID0gcmVmZXJlbmNlLmRhdGEoKTsKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgICByYXdfcmVmZXJlbmNlW2ldID0gc3RhdGljX2Nhc3Q8VD4oaSk7CisgICAgCisgIERlbnNlU3RvcmFnZVR5cGUgY29waWVkX3JlZmVyZW5jZTsKKyAgY29waWVkX3JlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKyAgY29uc3QgVCogcmF3X2NvcGllZF9yZWZlcmVuY2UgPSBjb3BpZWRfcmVmZXJlbmNlLmRhdGEoKTsKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgICBWRVJJRllfSVNfRVFVQUwocmF3X3JlZmVyZW5jZVtpXSwgcmF3X2NvcGllZF9yZWZlcmVuY2VbaV0pOworfQorCit2b2lkIHRlc3RfZGVuc2Vfc3RvcmFnZSgpCit7CisgIGRlbnNlX3N0b3JhZ2VfY29weTxpbnQsRHluYW1pYyxEeW5hbWljPigpOyAgCisgIGRlbnNlX3N0b3JhZ2VfY29weTxpbnQsRHluYW1pYywzPigpOworICBkZW5zZV9zdG9yYWdlX2NvcHk8aW50LDQsRHluYW1pYz4oKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PGludCw0LDM+KCk7CisKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PGZsb2F0LER5bmFtaWMsRHluYW1pYz4oKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PGZsb2F0LER5bmFtaWMsMz4oKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PGZsb2F0LDQsRHluYW1pYz4oKTsgIAorICBkZW5zZV9zdG9yYWdlX2NvcHk8ZmxvYXQsNCwzPigpOworICAKKyAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PGludCxEeW5hbWljLER5bmFtaWM+KCk7ICAKKyAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PGludCxEeW5hbWljLDM+KCk7CisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxpbnQsNCxEeW5hbWljPigpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8aW50LDQsMz4oKTsKKworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8ZmxvYXQsRHluYW1pYyxEeW5hbWljPigpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8ZmxvYXQsRHluYW1pYywzPigpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8ZmxvYXQsNCxEeW5hbWljPigpOyAgCisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxmbG9hdCw0LDM+KCk7ICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwIGIvdGVzdC9kZXRlcm1pbmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4ZjNhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MVT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBkZXRlcm1pbmFudChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIERldGVybWluYW50LmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggc2l6ZSA9IG0ucm93cygpOworCisgIE1hdHJpeFR5cGUgbTEoc2l6ZSwgc2l6ZSksIG0yKHNpemUsIHNpemUpOworICBtMS5zZXRSYW5kb20oKTsKKyAgbTIuc2V0UmFuZG9tKCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgU2NhbGFyIHggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpJZGVudGl0eShzaXplLCBzaXplKS5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSptMikuZXZhbCgpLmRldGVybWluYW50KCksIG0xLmRldGVybWluYW50KCkgKiBtMi5kZXRlcm1pbmFudCgpKTsKKyAgaWYoc2l6ZT09MSkgcmV0dXJuOworICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsKKyAgSW5kZXggajsKKyAgZG8geworICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplLTEpOworICB9IHdoaWxlKGo9PWkpOworICBtMiA9IG0xOworICBtMi5yb3coaSkuc3dhcChtMi5yb3coaikpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmRldGVybWluYW50KCksIC1tMS5kZXRlcm1pbmFudCgpKTsKKyAgbTIgPSBtMTsKKyAgbTIuY29sKGkpLnN3YXAobTIuY29sKGopKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCAtbTEuZGV0ZXJtaW5hbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgbTIudHJhbnNwb3NlKCkuZGV0ZXJtaW5hbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb25qKG0yLmRldGVybWluYW50KCkpLCBtMi5hZGpvaW50KCkuZGV0ZXJtaW5hbnQoKSk7CisgIG0yID0gbTE7CisgIG0yLnJvdyhpKSArPSB4Km0yLnJvdyhqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93KGkpICo9IHg7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgbTEuZGV0ZXJtaW5hbnQoKSAqIHgpOworICAKKyAgLy8gY2hlY2sgZW1wdHkgbWF0cml4CisgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2soMCwwLDAsMCkuZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKK30KKwordm9pZCB0ZXN0X2RldGVybWluYW50KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IDA7CisgICAgQ0FMTF9TVUJURVNUXzEoIGRldGVybWluYW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgMiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgMywgMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgNCwgND4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggZGV0ZXJtaW5hbnQoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxMCwgMTA+KCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGRldGVybWluYW50KE1hdHJpeFhkKHMsIHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaWFnb25hbC5jcHAgYi90ZXN0L2RpYWdvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU0NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaWFnb25hbC5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGRpYWdvbmFsKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vY2hlY2sgZGlhZ29uYWwoKQorICBWRVJJRllfSVNfQVBQUk9YKG0xLmRpYWdvbmFsKCksIG0xLnRyYW5zcG9zZSgpLmRpYWdvbmFsKCkpOworICBtMi5kaWFnb25hbCgpID0gMiAqIG0xLmRpYWdvbmFsKCk7CisgIG0yLmRpYWdvbmFsKClbMF0gKj0gMzsKKworICBpZiAocm93cz4yKQorICB7CisgICAgZW51bSB7CisgICAgICBOMSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjIgPyAgMiA6IDAsCisgICAgICBOMiA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjEgPyAtMSA6IDAKKyAgICB9OworCisgICAgLy8gY2hlY2sgc3ViL3N1cGVyIGRpYWdvbmFsCisgICAgaWYoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgICAgeworICAgICAgVkVSSUZZKG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpLlJvd3NBdENvbXBpbGVUaW1lID09IG0xLmRpYWdvbmFsKE4xKS5zaXplKCkpOworICAgICAgVkVSSUZZKG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpLlJvd3NBdENvbXBpbGVUaW1lID09IG0xLmRpYWdvbmFsKE4yKS5zaXplKCkpOworICAgIH0KKworICAgIG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpID0gMiAqIG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpOworICAgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgZGlhZ29uYWw8TjE+KCksIHN0YXRpY19jYXN0PFNjYWxhcj4oMikgKiBtMS5kaWFnb25hbChOMSkpOworICAgIG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpWzBdICo9IDM7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMT4oKVswXSwgc3RhdGljX2Nhc3Q8U2NhbGFyPig2KSAqIG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpWzBdKTsKKworCisgICAgbTIudGVtcGxhdGUgZGlhZ29uYWw8TjI+KCkgPSAyICogbTEudGVtcGxhdGUgZGlhZ29uYWw8TjI+KCk7CisgICAgbTIudGVtcGxhdGUgZGlhZ29uYWw8TjI+KClbMF0gKj0gMzsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpWzBdLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDYpICogbTEudGVtcGxhdGUgZGlhZ29uYWw8TjI+KClbMF0pOworCisgICAgbTIuZGlhZ29uYWwoTjEpID0gMiAqIG0xLmRpYWdvbmFsKE4xKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDIpICogbTEuZGlhZ29uYWwoTjEpKTsKKyAgICBtMi5kaWFnb25hbChOMSlbMF0gKj0gMzsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmRpYWdvbmFsKE4xKVswXSwgc3RhdGljX2Nhc3Q8U2NhbGFyPig2KSAqIG0xLmRpYWdvbmFsKE4xKVswXSk7CisKKyAgICBtMi5kaWFnb25hbChOMikgPSAyICogbTEuZGlhZ29uYWwoTjIpOworICAgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgZGlhZ29uYWw8TjI+KCksIHN0YXRpY19jYXN0PFNjYWxhcj4oMikgKiBtMS5kaWFnb25hbChOMikpOworICAgIG0yLmRpYWdvbmFsKE4yKVswXSAqPSAzOworICAgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWwoTjIpWzBdLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDYpICogbTEuZGlhZ29uYWwoTjIpWzBdKTsKKworICAgIG0yLmRpYWdvbmFsKE4yKS54KCkgPSBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmRpYWdvbmFsKE4yKS54KCksIHMxKTsKKyAgICBtMi5kaWFnb25hbChOMikuY29lZmZSZWYoMCkgPSBTY2FsYXIoMikqczE7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5kaWFnb25hbChOMikuY29lZmYoMCksIFNjYWxhcigyKSpzMSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBkaWFnb25hbF9hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkgeworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIGlmIChyb3dzPj0yICYmIGNvbHM+PTIpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEgKz0gbTEuZGlhZ29uYWwoKSApOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtMSAtPSBtMS5kaWFnb25hbCgpICk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xLmFycmF5KCkgKj0gbTEuZGlhZ29uYWwoKS5hcnJheSgpICk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xLmFycmF5KCkgLz0gbTEuZGlhZ29uYWwoKS5hcnJheSgpICk7CisgIH0KK30KKwordm9pZCB0ZXN0X2RpYWdvbmFsKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWwoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDQsIDk+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsKE1hdHJpeDxmbG9hdCwgNywgMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZGlhZ29uYWwoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZGlhZ29uYWwoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsKE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsKE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbChNYXRyaXg8ZmxvYXQsRHluYW1pYyw0PigzLCA0KSkgKTsKKyAgfQorCisgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbF9hc3NlcnQoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlhZ29uYWxtYXRyaWNlcy5jcHAgYi90ZXN0L2RpYWdvbmFsbWF0cmljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNmRjOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RpYWdvbmFsbWF0cmljZXMuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBkaWFnb25hbG1hdHJpY2VzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBDb2xzPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIFJvd3M+IFNxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRHluTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsIFJvd3M+IExlZnREaWFnb25hbE1hdHJpeDsKKyAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsIENvbHM+IFJpZ2h0RGlhZ29uYWxNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cz09RHluYW1pYz9EeW5hbWljOjIqUm93cywgQ29scz09RHluYW1pYz9EeW5hbWljOjIqQ29scz4gQmlnTWF0cml4OworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHJ2MSA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKSwKKyAgICAgICAgICAgICBydjIgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CisgIExlZnREaWFnb25hbE1hdHJpeCBsZG0xKHYxKSwgbGRtMih2Mik7CisgIFJpZ2h0RGlhZ29uYWxNYXRyaXggcmRtMShydjEpLCByZG0yKHJ2Mik7CisgIAorICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBTcXVhcmVNYXRyaXhUeXBlIHNxX20xICh2MS5hc0RpYWdvbmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCB2MS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpKTsKKyAgc3FfbTEgPSB2MS5hc0RpYWdvbmFsKCk7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIHYxLmFzRGlhZ29uYWwoKS50b0RlbnNlTWF0cml4KCkpOworICBTcXVhcmVNYXRyaXhUeXBlIHNxX20yID0gdjEuYXNEaWFnb25hbCgpOworICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCBzcV9tMik7CisgIAorICBsZG0xID0gdjEuYXNEaWFnb25hbCgpOworICBMZWZ0RGlhZ29uYWxNYXRyaXggbGRtMyh2MSk7CisgIFZFUklGWV9JU19BUFBST1gobGRtMS5kaWFnb25hbCgpLCBsZG0zLmRpYWdvbmFsKCkpOworICBMZWZ0RGlhZ29uYWxNYXRyaXggbGRtNCA9IHYxLmFzRGlhZ29uYWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsZG0xLmRpYWdvbmFsKCksIGxkbTQuZGlhZ29uYWwoKSk7CisgIAorICBzcV9tMS5ibG9jaygwLDAscm93cyxyb3dzKSA9IGxkbTE7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIGxkbTEudG9EZW5zZU1hdHJpeCgpKTsKKyAgc3FfbTEudHJhbnNwb3NlKCkgPSBsZG0xOworICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCBsZG0xLnRvRGVuc2VNYXRyaXgoKSk7CisgIAorICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKTsKKyAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKCAoKGxkbTEgKiBtMSkoaSxqKSkgICwgbGRtMS5kaWFnb25hbCgpKGkpICogbTEoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKGxkbTEgKiAobTErbTIpKShpLGopKSAgLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiAobTErbTIpKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSAqIHJkbTEpKGksaikpICAsIHJkbTEuZGlhZ29uYWwoKShqKSAqIG0xKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCh2MS5hc0RpYWdvbmFsKCkgKiBtMSkoaSxqKSkgICwgdjEoaSkgKiBtMShpLGopICk7CisgIFZFUklGWV9JU19BUFBST1goICgobTEgKiBydjEuYXNEaWFnb25hbCgpKShpLGopKSAgLCBydjEoaikgKiBtMShpLGopICk7CisgIFZFUklGWV9JU19BUFBST1goICgoKHYxK3YyKS5hc0RpYWdvbmFsKCkgKiBtMSkoaSxqKSkgICwgKHYxK3YyKShpKSAqIG0xKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCgodjErdjIpLmFzRGlhZ29uYWwoKSAqIChtMSttMikpKGksaikpICAsICh2MSt2MikoaSkgKiAobTErbTIpKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSAqIChydjErcnYyKS5hc0RpYWdvbmFsKCkpKGksaikpICAsIChydjErcnYyKShqKSAqIG0xKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCgobTErbTIpICogKHJ2MStydjIpLmFzRGlhZ29uYWwoKSkoaSxqKSkgICwgKHJ2MStydjIpKGopICogKG0xK20yKShpLGopICk7CisgIAorICBpZihyb3dzPjEpCisgIHsKKyAgICBEeW5NYXRyaXhUeXBlIHRtcCA9IG0xLnRvcFJvd3Mocm93cy8yKSwgcmVzOworICAgIFZFUklGWV9JU19BUFBST1goIChyZXMgPSBtMS50b3BSb3dzKHJvd3MvMikgKiBydjEuYXNEaWFnb25hbCgpKSwgdG1wICogcnYxLmFzRGlhZ29uYWwoKSApOworICAgIFZFUklGWV9JU19BUFBST1goIChyZXMgPSB2MS5oZWFkKHJvd3MvMikuYXNEaWFnb25hbCgpKm0xLnRvcFJvd3Mocm93cy8yKSksIHYxLmhlYWQocm93cy8yKS5hc0RpYWdvbmFsKCkqdG1wICk7CisgIH0KKworICBCaWdNYXRyaXggYmlnOworICBiaWcuc2V0WmVybygyKnJvd3MsIDIqY29scyk7CisgIAorICBiaWcuYmxvY2soaSxqLHJvd3MsY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gdjEuYXNEaWFnb25hbCgpICogYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpKSAsIHYxLmFzRGlhZ29uYWwoKSAqIG0xICk7CisgIAorICBiaWcuYmxvY2soaSxqLHJvd3MsY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpICogcnYxLmFzRGlhZ29uYWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpKSAsIG0xICogcnYxLmFzRGlhZ29uYWwoKSApOworICAKKyAgCisgIC8vIHNjYWxhciBtdWx0aXBsZQorICBWRVJJRllfSVNfQVBQUk9YKExlZnREaWFnb25hbE1hdHJpeChsZG0xKnMxKS5kaWFnb25hbCgpLCBsZG0xLmRpYWdvbmFsKCkgKiBzMSk7CisgIFZFUklGWV9JU19BUFBST1goTGVmdERpYWdvbmFsTWF0cml4KHMxKmxkbTEpLmRpYWdvbmFsKCksIHMxICogbGRtMS5kaWFnb25hbCgpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gobTEgKiAocmRtMSAqIHMxKSwgKG0xICogcmRtMSkgKiBzMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgKiAoczEgKiByZG0xKSwgKG0xICogcmRtMSkgKiBzMSk7CisgIAorICAvLyBEaWFnb25hbCB0byBkZW5zZQorICBzcV9tMS5zZXRSYW5kb20oKTsKKyAgc3FfbTIgPSBzcV9tMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKHNxX20xICs9IChzMSp2MSkuYXNEaWFnb25hbCgpKSwgc3FfbTIgKz0gKHMxKnYxKS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpICk7CisgIFZFUklGWV9JU19BUFBST1goIChzcV9tMSAtPSAoczEqdjEpLmFzRGlhZ29uYWwoKSksIHNxX20yIC09IChzMSp2MSkuYXNEaWFnb25hbCgpLnRvRGVuc2VNYXRyaXgoKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoc3FfbTEgPSAoczEqdjEpLmFzRGlhZ29uYWwoKSksIChzMSp2MSkuYXNEaWFnb25hbCgpLnRvRGVuc2VNYXRyaXgoKSApOworfQorCit0ZW1wbGF0ZTxpbnQ+Cit2b2lkIGJ1Zzk4NygpCit7CisgIE1hdHJpeDNYZCBwb2ludHMgPSBNYXRyaXgzWGQ6OlJhbmRvbSgzLCAzKTsKKyAgVmVjdG9yMmQgZGlhZyA9IFZlY3RvcjJkOjpSYW5kb20oKTsKKyAgTWF0cml4MlhkIHRtcDEgPSBwb2ludHMudG9wUm93czwyPigpLCByZXMxLCByZXMyOworICBWRVJJRllfSVNfQVBQUk9YKCByZXMxID0gZGlhZy5hc0RpYWdvbmFsKCkgKiBwb2ludHMudG9wUm93czwyPigpLCByZXMyID0gZGlhZy5hc0RpYWdvbmFsKCkgKiB0bXAxICk7CisgIE1hdHJpeDJkIHRtcDIgPSBwb2ludHMudG9wTGVmdENvcm5lcjwyLDI+KCk7CisgIFZFUklGWV9JU19BUFBST1goKCByZXMxID0gcG9pbnRzLnRvcExlZnRDb3JuZXI8MiwyPigpKmRpYWcuYXNEaWFnb25hbCgpKSAsIHJlczIgPSB0bXAyKmRpYWcuYXNEaWFnb25hbCgpICk7Cit9CisKK3ZvaWQgdGVzdF9kaWFnb25hbG1hdHJpY2VzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4M2YoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg8ZG91YmxlLDMsMyxSb3dNYWpvcj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxmbG9hdCw0LDQsUm93TWFqb3I+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIENBTExfU1VCVEVTVF8xMCggYnVnOTg3PDA+KCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZG9udGFsaWduLmNwcCBiL3Rlc3QvZG9udGFsaWduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQzY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kb250YWxpZ24uY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzEgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfMiB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF8zIHx8IGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzQKKyNkZWZpbmUgRUlHRU5fRE9OVF9BTElHTgorI2VsaWYgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNSB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF82IHx8IGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzcgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfOAorI2RlZmluZSBFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkKKyNlbmRpZgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBkb250YWxpZ24oY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzcXVhcmUgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxyb3dzKTsKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworCisgIFZFUklGWV9JU19BUFBST1godiwgc3F1YXJlICogc3F1YXJlLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh2KSk7CisgIHNxdWFyZSA9IHNxdWFyZS5pbnZlcnNlKCkuZXZhbCgpOworICBhID0gc3F1YXJlICogYTsKKyAgc3F1YXJlID0gc3F1YXJlKnNxdWFyZTsKKyAgdiA9IHNxdWFyZSAqIHY7CisgIHYgPSBhLmFkam9pbnQoKSAqIHY7CisgIFZFUklGWShzcXVhcmUuZGV0ZXJtaW5hbnQoKSAhPSBTY2FsYXIoMCkpOworCisgIC8vIGJ1ZyAyMTk6IE1hcEFsaWduZWQoKSB3YXMgZ2l2aW5nIGFuIGFzc2VydCB3aXRoIEVJR0VOX0RPTlRfQUxJR04sIGJlY2F1c2UgTWFwIEZsYWdzIHdlcmUgbWlzY29tcHV0ZWQKKyAgU2NhbGFyKiBhcnJheSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHJvd3MpOworICB2ID0gVmVjdG9yVHlwZTo6TWFwQWxpZ25lZChhcnJheSwgcm93cyk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheSwgcm93cyk7Cit9CisKK3ZvaWQgdGVzdF9kb250YWxpZ24oKQoreworI2lmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzEgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNQorICBkb250YWxpZ24oTWF0cml4M2QoKSk7CisgIGRvbnRhbGlnbihNYXRyaXg0ZigpKTsKKyNlbGlmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzIgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNgorICBkb250YWxpZ24oTWF0cml4M2NkKCkpOworICBkb250YWxpZ24oTWF0cml4NGNmKCkpOworI2VsaWYgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfMyB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF83CisgIGRvbnRhbGlnbihNYXRyaXg8ZmxvYXQsIDMyLCAzMj4oKSk7CisgIGRvbnRhbGlnbihNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMzIsIDMyPigpKTsKKyNlbGlmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzQgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfOAorICBkb250YWxpZ24oTWF0cml4WGQoMzIsIDMyKSk7CisgIGRvbnRhbGlnbihNYXRyaXhYY2YoMzIsIDMyKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZHluYWxsb2MuY3BwIGIvdGVzdC9keW5hbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYzcwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZHluYWxsb2MuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpZiBFSUdFTl9NQVhfQUxJR05fQllURVM+MAorI2RlZmluZSBBTElHTk1FTlQgRUlHRU5fTUFYX0FMSUdOX0JZVEVTCisjZWxzZQorI2RlZmluZSBBTElHTk1FTlQgMQorI2VuZGlmCisKK3R5cGVkZWYgTWF0cml4PGZsb2F0LDgsMT4gVmVjdG9yOGY7CisKK3ZvaWQgY2hlY2tfaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MoKQoreworICBmb3IoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorICB7CisgICAgY2hhciAqcCA9IChjaGFyKilpbnRlcm5hbDo6aGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MoaSk7CisgICAgVkVSSUZZKGludGVybmFsOjpVSW50UHRyKHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBpbnRlcm5hbDo6aGFuZG1hZGVfYWxpZ25lZF9mcmVlKHApOworICB9Cit9CisKK3ZvaWQgY2hlY2tfYWxpZ25lZF9tYWxsb2MoKQoreworICBmb3IoaW50IGkgPSBBTElHTk1FTlQ7IGkgPCAxMDAwOyBpKyspCisgIHsKKyAgICBjaGFyICpwID0gKGNoYXIqKWludGVybmFsOjphbGlnbmVkX21hbGxvYyhpKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIocCklQUxJR05NRU5UPT0wKTsKKyAgICAvLyBpZiB0aGUgYnVmZmVyIGlzIHdyb25nbHkgYWxsb2NhdGVkIHRoaXMgd2lsbCBnaXZlIGEgYmFkIHdyaXRlIC0tPiBjaGVjayB3aXRoIHZhbGdyaW5kCisgICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXT0wOworICAgIGludGVybmFsOjphbGlnbmVkX2ZyZWUocCk7CisgIH0KK30KKwordm9pZCBjaGVja19hbGlnbmVkX25ldygpCit7CisgIGZvcihpbnQgaSA9IEFMSUdOTUVOVDsgaSA8IDEwMDA7IGkrKykKKyAgeworICAgIGZsb2F0ICpwID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PGZsb2F0PihpKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIocCklQUxJR05NRU5UPT0wKTsKKyAgICAvLyBpZiB0aGUgYnVmZmVyIGlzIHdyb25nbHkgYWxsb2NhdGVkIHRoaXMgd2lsbCBnaXZlIGEgYmFkIHdyaXRlIC0tPiBjaGVjayB3aXRoIHZhbGdyaW5kCisgICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXT0wOworICAgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShwLGkpOworICB9Cit9CisKK3ZvaWQgY2hlY2tfYWxpZ25lZF9zdGFja19hbGxvYygpCit7CisgIGZvcihpbnQgaSA9IEFMSUdOTUVOVDsgaSA8IDQwMDsgaSsrKQorICB7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKGZsb2F0LHAsaSwwKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIocCklQUxJR05NRU5UPT0wKTsKKyAgICAvLyBpZiB0aGUgYnVmZmVyIGlzIHdyb25nbHkgYWxsb2NhdGVkIHRoaXMgd2lsbCBnaXZlIGEgYmFkIHdyaXRlIC0tPiBjaGVjayB3aXRoIHZhbGdyaW5kCisgICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXT0wOworICB9Cit9CisKKworLy8gdGVzdCBjb21waWxhdGlvbiB3aXRoIGJvdGggYSBzdHJ1Y3QgYW5kIGEgY2xhc3MuLi4KK3N0cnVjdCBNeVN0cnVjdAoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIGNoYXIgZHVtbXljaGFyOworICBWZWN0b3I4ZiBhdmVjOworfTsKKworY2xhc3MgTXlDbGFzc0EKK3sKKyAgcHVibGljOgorICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKKyAgICBjaGFyIGR1bW15Y2hhcjsKKyAgICBWZWN0b3I4ZiBhdmVjOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBjaGVja19keW5hbGlnbmVkKCkKK3sKKyAgLy8gVE9ETyBoYXZlIHRvIGJlIHVwZGF0ZWQgb25jZSB3ZSBzdXBwb3J0IG11bHRpcGxlIGFsaWdubWVudCB2YWx1ZXMKKyAgaWYoVDo6U2l6ZUF0Q29tcGlsZVRpbWUgJSBBTElHTk1FTlQgPT0gMCkKKyAgeworICAgIFQqIG9iaiA9IG5ldyBUOworICAgIFZFUklGWShUOjpOZWVkc1RvQWxpZ249PTEpOworICAgIFZFUklGWShpbnRlcm5hbDo6VUludFB0cihvYmopJUFMSUdOTUVOVD09MCk7CisgICAgZGVsZXRlIG9iajsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGNoZWNrX2N1c3RvbV9uZXdfZGVsZXRlKCkKK3sKKyAgeworICAgIFQqIHQgPSBuZXcgVDsKKyAgICBkZWxldGUgdDsKKyAgfQorICAKKyAgeworICAgIHN0ZDo6c2l6ZV90IE4gPSBpbnRlcm5hbDo6cmFuZG9tPHN0ZDo6c2l6ZV90PigxLDEwKTsKKyAgICBUKiB0ID0gbmV3IFRbTl07CisgICAgZGVsZXRlW10gdDsKKyAgfQorICAKKyNpZiBFSUdFTl9NQVhfQUxJR05fQllURVM+MAorICB7CisgICAgVCogdCA9IHN0YXRpY19jYXN0PFQgKj4oKFQ6Om9wZXJhdG9yIG5ldykoc2l6ZW9mKFQpKSk7CisgICAgKFQ6Om9wZXJhdG9yIGRlbGV0ZSkodCwgc2l6ZW9mKFQpKTsKKyAgfQorICAKKyAgeworICAgIFQqIHQgPSBzdGF0aWNfY2FzdDxUICo+KChUOjpvcGVyYXRvciBuZXcpKHNpemVvZihUKSkpOworICAgIChUOjpvcGVyYXRvciBkZWxldGUpKHQpOworICB9CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X2R5bmFsbG9jKCkKK3sKKyAgLy8gbG93IGxldmVsIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24KKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hhbmRtYWRlX2FsaWduZWRfbWFsbG9jKCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxpZ25lZF9tYWxsb2MoKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGlnbmVkX25ldygpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsaWduZWRfc3RhY2tfYWxsb2MoKSk7CisKKyAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQorICB7CisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19jdXN0b21fbmV3X2RlbGV0ZTxWZWN0b3I0Zj4oKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfY3VzdG9tX25ld19kZWxldGU8VmVjdG9yMmY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2N1c3RvbV9uZXdfZGVsZXRlPE1hdHJpeDRmPigpICk7CisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19jdXN0b21fbmV3X2RlbGV0ZTxNYXRyaXhYaT4oKSApOworICB9CisgIAorICAvLyBjaGVjayBzdGF0aWMgYWxsb2NhdGlvbiwgd2hvIGtub3dzID8KKyAgI2lmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMKKyAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQorICB7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yNGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3IyZD4oKSApOworICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPE1hdHJpeDRmPigpICk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yNGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0aT4oKSApOworICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPFZlY3RvcjhmPigpICk7CisgIH0KKworICB7CisgICAgTXlTdHJ1Y3QgZm9vMDsgIFZFUklGWShpbnRlcm5hbDo6VUludFB0cihmb28wLmF2ZWMuZGF0YSgpKSVBTElHTk1FTlQ9PTApOworICAgIE15Q2xhc3NBIGZvb0E7ICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIoZm9vQS5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgfQorICAKKyAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLCBzaW5nbGUgb2JqZWN0CisgIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdCoxMDA7ICsraSkKKyAgeworICAgIE15U3RydWN0ICpmb28wID0gbmV3IE15U3RydWN0KCk7ICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIoZm9vMC0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0EoKTsgIFZFUklGWShpbnRlcm5hbDo6VUludFB0cihmb29BLT5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgICBkZWxldGUgZm9vMDsKKyAgICBkZWxldGUgZm9vQTsKKyAgfQorCisgIC8vIGR5bmFtaWMgYWxsb2NhdGlvbiwgYXJyYXkKKyAgY29uc3QgaW50IE4gPSAxMDsKKyAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQorICB7CisgICAgTXlTdHJ1Y3QgKmZvbzAgPSBuZXcgTXlTdHJ1Y3RbTl07ICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIoZm9vMC0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0FbTl07ICBWRVJJRlkoaW50ZXJuYWw6OlVJbnRQdHIoZm9vQS0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgZGVsZXRlW10gZm9vMDsKKyAgICBkZWxldGVbXSBmb29BOworICB9CisgICNlbmRpZgorICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yc3VwcG9ydC5jcHAgYi90ZXN0L2VpZ2VuMnN1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWQ5ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMnN1cHBvcnQuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTjJfU1VQUE9SVAorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGVpZ2VuMnN1cHBvcnQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgU2NhbGFyICBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgLy8gc2NhbGFyIGFkZGl0aW9uCisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKSArIHMxLCBzMSArIG0xLmN3aXNlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkgKyBzMSwgTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSArIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEqU2NhbGFyKDIpKS5jd2lzZSgpIC0gczIsIChtMSttMSkgLSBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczIpICk7CisgIG0zID0gbTE7CisgIG0zLmN3aXNlKCkgKz0gczI7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmN3aXNlKCkgKyBzMik7CisgIG0zID0gbTE7CisgIG0zLmN3aXNlKCkgLT0gczE7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmN3aXNlKCkgLSBzMSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb3JuZXIoVG9wTGVmdCwxLDEpKSwgKG0xLmJsb2NrKDAsMCwxLDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEudGVtcGxhdGUgY29ybmVyPDEsMT4oVG9wTGVmdCkpLCAobTEudGVtcGxhdGUgYmxvY2s8MSwxPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnN0YXJ0KDEpKSwgKG0xLmNvbCgwKS5zZWdtZW50KDAsMSkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb2woMCkudGVtcGxhdGUgc3RhcnQ8MT4oKSksIChtMS5jb2woMCkuc2VnbWVudCgwLDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLmVuZCgxKSksIChtMS5jb2woMCkuc2VnbWVudChyb3dzLTEsMSkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb2woMCkudGVtcGxhdGUgZW5kPDE+KCkpLCAobTEuY29sKDApLnNlZ21lbnQocm93cy0xLDEpKSk7CisgIAorICB1c2luZyBzdGQ6OmNvczsKKyAgdXNpbmcgbnVtZXh0OjpyZWFsOworICB1c2luZyBudW1leHQ6OmFiczI7CisgIFZFUklGWV9JU19FUVVBTChlaV9jb3MoczEpLCBjb3MoczEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpX3JlYWwoczEpLCByZWFsKHMxKSk7CisgIFZFUklGWV9JU19FUVVBTChlaV9hYnMyKHMxKSwgYWJzMihzMSkpOworCisgIG0xLm1pbm9yKDAsMCk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJzdXBwb3J0KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggZWlnZW4yc3VwcG9ydChNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW4yc3VwcG9ydChNYXRyaXhYZCgxLDEpKSApOworICAgIENBTExfU1VCVEVTVF80KCBlaWdlbjJzdXBwb3J0KE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGVpZ2VuMnN1cHBvcnQoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW4yc3VwcG9ydChNYXRyaXhYZigyMDAsMjAwKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggZWlnZW4yc3VwcG9ydChNYXRyaXhYY2QoMTAwLDEwMCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW5zb2x2ZXJfY29tcGxleC5jcHAgYi90ZXN0L2VpZ2Vuc29sdmVyX2NvbXBsZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2IxYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2Vuc29sdmVyX2NvbXBsZXguY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gYm9vbCBmaW5kX3Bpdm90KHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciB0b2wsIE1hdHJpeFR5cGUgJmRpZmZzLCBJbmRleCBjb2w9MCkKK3sKKyAgYm9vbCBtYXRjaCA9IGRpZmZzLmRpYWdvbmFsKCkuc3VtKCkgPD0gdG9sOworICBpZihtYXRjaCB8fCBjb2w9PWRpZmZzLmNvbHMoKSkKKyAgeworICAgIHJldHVybiBtYXRjaDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBJbmRleCBuID0gZGlmZnMuY29scygpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbmRleCxJbmRleD4gPiB0cmFuc3Bvc2l0aW9uczsKKyAgICBmb3IoSW5kZXggaT1jb2w7IGk8bjsgKytpKQorICAgIHsKKyAgICAgIEluZGV4IGJlc3RfaW5kZXgoMCk7CisgICAgICBpZihkaWZmcy5jb2woY29sKS5zZWdtZW50KGNvbCxuLWkpLm1pbkNvZWZmKCZiZXN0X2luZGV4KSA+IHRvbCkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGJlc3RfaW5kZXggKz0gY29sOworICAgICAgCisgICAgICBkaWZmcy5yb3coY29sKS5zd2FwKGRpZmZzLnJvdyhiZXN0X2luZGV4KSk7CisgICAgICBpZihmaW5kX3Bpdm90KHRvbCxkaWZmcyxjb2wrMSkpIHJldHVybiB0cnVlOworICAgICAgZGlmZnMucm93KGNvbCkuc3dhcChkaWZmcy5yb3coYmVzdF9pbmRleCkpOworICAgICAgCisgICAgICAvLyBtb3ZlIGN1cnJlbnQgcGl2b3QgdG8gdGhlIGVuZAorICAgICAgZGlmZnMucm93KG4tKGktY29sKS0xKS5zd2FwKGRpZmZzLnJvdyhiZXN0X2luZGV4KSk7CisgICAgICB0cmFuc3Bvc2l0aW9ucy5wdXNoX2JhY2soc3RkOjpwYWlyPEluZGV4LEluZGV4PihuLShpLWNvbCktMSxiZXN0X2luZGV4KSk7CisgICAgfQorICAgIC8vIHJlc3RvcmUKKyAgICBmb3IoSW5kZXggaz10cmFuc3Bvc2l0aW9ucy5zaXplKCktMTsgaz49MDsgLS1rKQorICAgICAgZGlmZnMucm93KHRyYW5zcG9zaXRpb25zW2tdLmZpcnN0KS5zd2FwKGRpZmZzLnJvdyh0cmFuc3Bvc2l0aW9uc1trXS5zZWNvbmQpKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIENoZWNrIHRoYXQgdHdvIGNvbHVtbiB2ZWN0b3JzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHVwdG8gcGVybXV0YXRpb25zLgorICogSW5pdGlhbGx5LCB0aGlzIG1ldGhvZCBjaGVja2VkIHRoYXQgdGhlIGstdGggcG93ZXIgc3VtcyBhcmUgZXF1YWwgZm9yIGFsbCBrID0gMSwgLi4uLCB2ZWMxLnJvd3MoKSwKKyAqIGhvd2V2ZXIgdGhpcyBzdHJhdGVneSBpcyBudW1lcmljYWxseSBpbmFjdXJhdGUgYmVjYXVzZSBvZiBudW1lcmljYWwgY2FuY2VsbGF0aW9uIGlzc3Vlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgdmVyaWZ5X2lzX2FwcHJveF91cHRvX3Blcm11dGF0aW9uKGNvbnN0IFZlY3RvclR5cGUmIHZlYzEsIGNvbnN0IFZlY3RvclR5cGUmIHZlYzIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIFZFUklGWSh2ZWMxLmNvbHMoKSA9PSAxKTsKKyAgVkVSSUZZKHZlYzIuY29scygpID09IDEpOworICBWRVJJRlkodmVjMS5yb3dzKCkgPT0gdmVjMi5yb3dzKCkpOworICAKKyAgSW5kZXggbiA9IHZlYzEucm93cygpOworICBSZWFsU2NhbGFyIHRvbCA9IHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkqdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSpudW1leHQ6Om1heGkodmVjMS5zcXVhcmVkTm9ybSgpLHZlYzIuc3F1YXJlZE5vcm0oKSk7CisgIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gZGlmZnMgPSAodmVjMS5yb3d3aXNlKCkucmVwbGljYXRlKG4pIC0gdmVjMi5yb3d3aXNlKCkucmVwbGljYXRlKG4pLnRyYW5zcG9zZSgpKS5jd2lzZUFiczIoKTsKKyAgCisgIFZFUklGWSggZmluZF9waXZvdCh0b2wsIGRpZmZzKSApOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBDb21wbGV4RWlnZW5Tb2x2ZXIuaCwgYW5kIGluZGlyZWN0bHkgQ29tcGxleFNjaHVyLmgKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSAgYS5hZGpvaW50KCkgKiBhOworCisgIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTAoc3ltbUEpOworICBWRVJJRllfSVNfRVFVQUwoZWkwLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19BUFBST1goc3ltbUEgKiBlaTAuZWlnZW52ZWN0b3JzKCksIGVpMC5laWdlbnZlY3RvcnMoKSAqIGVpMC5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSk7CisKKyAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMShhKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpMS5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfQVBQUk9YKGEgKiBlaTEuZWlnZW52ZWN0b3JzKCksIGVpMS5laWdlbnZlY3RvcnMoKSAqIGVpMS5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSk7CisgIC8vIE5vdGU6IElmIE1hdHJpeFR5cGUgaXMgcmVhbCB0aGVuIGEuZWlnZW52YWx1ZXMoKSB1c2VzIEVpZ2VuU29sdmVyIGFuZCB0aHVzCisgIC8vIGFub3RoZXIgYWxnb3JpdGhtIHNvIHJlc3VsdHMgbWF5IGRpZmZlciBzbGlnaHRseQorICB2ZXJpZnlfaXNfYXBwcm94X3VwdG9fcGVybXV0YXRpb24oYS5laWdlbnZhbHVlcygpLCBlaTEuZWlnZW52YWx1ZXMoKSk7CisKKyAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMjsKKyAgZWkyLnNldE1heEl0ZXJhdGlvbnMoQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjptX21heEl0ZXJhdGlvbnNQZXJSb3cgKiByb3dzKS5jb21wdXRlKGEpOworICBWRVJJRllfSVNfRVFVQUwoZWkyLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChlaTIuZWlnZW52ZWN0b3JzKCksIGVpMS5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9JU19FUVVBTChlaTIuZWlnZW52YWx1ZXMoKSwgZWkxLmVpZ2VudmFsdWVzKCkpOworICBpZiAocm93cyA+IDIpIHsKKyAgICBlaTIuc2V0TWF4SXRlcmF0aW9ucygxKS5jb21wdXRlKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaTIuaW5mbygpLCBOb0NvbnZlcmdlbmNlKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZWkyLmdldE1heEl0ZXJhdGlvbnMoKSwgMSk7CisgIH0KKworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlOb0VpdmVjcyhhLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTChlaU5vRWl2ZWNzLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19BUFBST1goZWkxLmVpZ2VudmFsdWVzKCksIGVpTm9FaXZlY3MuZWlnZW52YWx1ZXMoKSk7CisKKyAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBpc3N1ZSAjNjYKKyAgTWF0cml4VHlwZSB6ID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpOworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWl6KHopOworICBWRVJJRlkoKGVpei5laWdlbnZhbHVlcygpLmN3aXNlRXF1YWwoMCkpLmFsbCgpKTsKKworICBNYXRyaXhUeXBlIGlkID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1goaWQub3BlcmF0b3JOb3JtKCksIFJlYWxTY2FsYXIoMSkpOworCisgIGlmIChyb3dzID4gMSAmJiByb3dzIDwgMjApCisgIHsKKyAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgorICAgIGEoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaU5hTihhKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZWlOYU4uaW5mbygpLCBOb0NvbnZlcmdlbmNlKTsKKyAgfQorCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDEwOTgKKyAgeworICAgIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWcoYS5hZGpvaW50KCkgKiBhKTsKKyAgICBlaWcuY29tcHV0ZShhLmFkam9pbnQoKSAqIGEpOworICB9CisKKyAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNDc4CisgIHsKKyAgICBhLnNldFplcm8oKTsKKyAgICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkzKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaTMuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oZWkzLmVpZ2VudmFsdWVzKCkubm9ybSgpLFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKmVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSkuZXZhbCgpLmlzSWRlbnRpdHkoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWc7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZhbHVlcygpKTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20obS5yb3dzKCksbS5jb2xzKCkpOworICBlaWcuY29tcHV0ZShhLCBmYWxzZSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbnNvbHZlcl9jb21wbGV4KCkKK3sKKyAgaW50IHMgPSAwOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0Y2YoKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXIoTWF0cml4WGNkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcihNYXRyaXgzZigpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgfQorICBDQUxMX1NVQlRFU1RfMSggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg0Y2YoKSkgKTsKKyAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeFhjZChzLHMpKSApOworICBDQUxMX1NVQlRFU1RfMyggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4M2YoKSkgKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzUoQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFhmPiB0bXAocykpOworICAKKyAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsLmNwcCBiL3Rlc3QvZWlnZW5zb2x2ZXJfZ2VuZXJhbGl6ZWRfcmVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwODM4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW5zb2x2ZXJfZ2VuZXJhbGl6ZWRfcmVhbC5jcHAKQEAgLTAsMCArMSw5NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fUlVOVElNRV9OT19NQUxMT0MKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBHZW5lcmFsaXplZEVpZ2VuU29sdmVyLmgKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgYiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGExID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgYjEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBzcGRBID0gIGEuYWRqb2ludCgpICogYSArIGExLmFkam9pbnQoKSAqIGExOworICBNYXRyaXhUeXBlIHNwZEIgPSAgYi5hZGpvaW50KCkgKiBiICsgYjEuYWRqb2ludCgpICogYjE7CisKKyAgLy8gbGV0cyBjb21wYXJlIHRvIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcgorICB7CisgICAgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IHN5bW1FaWcoc3BkQSwgc3BkQik7CisgICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWcoc3BkQSwgc3BkQik7CisKKyAgICBWRVJJRllfSVNfRVFVQUwoZWlnLmVpZ2VudmFsdWVzKCkuaW1hZygpLmN3aXNlQWJzKCkubWF4Q29lZmYoKSwgMCk7CisKKyAgICBWZWN0b3JUeXBlIHJlYWxFaWdlbnZhbHVlcyA9IGVpZy5laWdlbnZhbHVlcygpLnJlYWwoKTsKKyAgICBzdGQ6OnNvcnQocmVhbEVpZ2VudmFsdWVzLmRhdGEoKSwgcmVhbEVpZ2VudmFsdWVzLmRhdGEoKStyZWFsRWlnZW52YWx1ZXMuc2l6ZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlYWxFaWdlbnZhbHVlcywgc3ltbUVpZy5laWdlbnZhbHVlcygpKTsKKworICAgIC8vIGNoZWNrIGVpZ2VudmVjdG9ycworICAgIHR5cGVuYW1lIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OkVpZ2VudmVjdG9yc1R5cGUgRCA9IGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKTsKKyAgICB0eXBlbmFtZSBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjpFaWdlbnZlY3RvcnNUeXBlIFYgPSBlaWcuZWlnZW52ZWN0b3JzKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcGRBKlYsIHNwZEIqVipEKTsKKyAgfQorCisgIC8vIG5vbiBzeW1tZXRyaWMgY2FzZToKKyAgeworICAgIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnKHJvd3MpOworICAgIC8vIFRPRE8gZW5hYmxlIGZ1bGwtcHJlYWxvY2F0aW9uIG9mIHJlcXVpcmVkIG1lbW9yeSwgdGhpcyBwcm9iYWJseSByZXF1aXJlcyBhbiBpbi1wbGFjZSBtb2RlIGZvciBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgorICAgIC8vRWlnZW46OmludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICAgIGVpZy5jb21wdXRlKGEsYik7CisgICAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgICBmb3IoSW5kZXggaz0wOyBrPGNvbHM7ICsraykKKyAgICB7CisgICAgICBNYXRyaXg8Q29tcGxleFNjYWxhcixEeW5hbWljLER5bmFtaWM+IHRtcCA9IChlaWcuYmV0YXMoKShrKSphKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCkgLSBlaWcuYWxwaGFzKCkoaykqYjsKKyAgICAgIGlmKHRtcC5zaXplKCk+MSAmJiB0bXAubm9ybSgpPihzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKSkKKyAgICAgICAgdG1wIC89IHRtcC5ub3JtKCk7CisgICAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHN0ZDo6YWJzKHRtcC5kZXRlcm1pbmFudCgpKSwgU2NhbGFyKDEpICk7CisgICAgfQorICAgIC8vIGNoZWNrIGVpZ2VudmVjdG9ycworICAgIHR5cGVuYW1lIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OkVpZ2VudmVjdG9yc1R5cGUgRCA9IGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKTsKKyAgICB0eXBlbmFtZSBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjpFaWdlbnZlY3RvcnNUeXBlIFYgPSBlaWcuZWlnZW52ZWN0b3JzKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhKlYsIGIqVipEKTsKKyAgfQorCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDEwOTgKKyAgeworICAgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWcxKGEuYWRqb2ludCgpICogYSxiLmFkam9pbnQoKSAqIGIpOworICAgIGVpZzEuY29tcHV0ZShhLmFkam9pbnQoKSAqIGEsYi5hZGpvaW50KCkgKiBiKTsKKyAgICBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpZzIoYS5hZGpvaW50KCkgKiBhLGIuYWRqb2ludCgpICogYik7CisgICAgZWlnMi5jb21wdXRlKGEuYWRqb2ludCgpICogYSxiLmFkam9pbnQoKSAqIGIpOworICB9Cit9CisKK3ZvaWQgdGVzdF9laWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IDA7CisgICAgQ0FMTF9TVUJURVNUXzEoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4NGYoKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChNYXRyaXhYZChzLHMpKSApOworCisgICAgLy8gc29tZSB0cml2aWFsIGJ1dCBpbXBsZW1lbnRhdGlvbi13aXNlIHNwZWNpYWwgY2FzZXMKKyAgICBDQUxMX1NVQlRFU1RfMiggZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChNYXRyaXhYZCgxLDEpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeFhkKDIsMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4MmQoKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW5zb2x2ZXJfZ2VuZXJpYy5jcHAgYi90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyaWMuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCwyMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBlaWdlbnNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEVpZ2VuU29sdmVyLmgKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSZWFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWw+IENvbXBsZXg7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBzeW1tQSA9ICBhLmFkam9pbnQoKSAqIGEgKyBhMS5hZGpvaW50KCkgKiBhMTsKKworICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTAoc3ltbUEpOworICBWRVJJRllfSVNfRVFVQUwoZWkwLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19BUFBST1goc3ltbUEgKiBlaTAucHNldWRvRWlnZW52ZWN0b3JzKCksIGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIGVpMC5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKChzeW1tQS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpICogKGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpLAorICAgIChlaTAucHNldWRvRWlnZW52ZWN0b3JzKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4PigpKSAqIChlaTAuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpKTsKKworICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTEoYSk7CisgIFZFUklGWV9JU19FUVVBTChlaTEuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhICogZWkxLnBzZXVkb0VpZ2VudmVjdG9ycygpLCBlaTEucHNldWRvRWlnZW52ZWN0b3JzKCkgKiBlaTEucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLnRlbXBsYXRlIGNhc3Q8Q29tcGxleD4oKSAqIGVpMS5laWdlbnZlY3RvcnMoKSwKKyAgICAgICAgICAgICAgICAgICBlaTEuZWlnZW52ZWN0b3JzKCkgKiBlaTEuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGVpMS5laWdlbnZlY3RvcnMoKS5jb2x3aXNlKCkubm9ybSgpLCBSZWFsVmVjdG9yVHlwZTo6T25lcyhyb3dzKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goYS5laWdlbnZhbHVlcygpLCBlaTEuZWlnZW52YWx1ZXMoKSk7CisKKyAgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkyOworICBlaTIuc2V0TWF4SXRlcmF0aW9ucyhSZWFsU2NodXI8TWF0cml4VHlwZT46Om1fbWF4SXRlcmF0aW9uc1BlclJvdyAqIHJvd3MpLmNvbXB1dGUoYSk7CisgIFZFUklGWV9JU19FUVVBTChlaTIuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpMi5laWdlbnZlY3RvcnMoKSwgZWkxLmVpZ2VudmVjdG9ycygpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpMi5laWdlbnZhbHVlcygpLCBlaTEuZWlnZW52YWx1ZXMoKSk7CisgIGlmIChyb3dzID4gMikgeworICAgIGVpMi5zZXRNYXhJdGVyYXRpb25zKDEpLmNvbXB1dGUoYSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGVpMi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICAgIFZFUklGWV9JU19FUVVBTChlaTIuZ2V0TWF4SXRlcmF0aW9ucygpLCAxKTsKKyAgfQorCisgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpTm9FaXZlY3MoYSwgZmFsc2UpOworICBWRVJJRllfSVNfRVFVQUwoZWlOb0VpdmVjcy5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfQVBQUk9YKGVpMS5laWdlbnZhbHVlcygpLCBlaU5vRWl2ZWNzLmVpZ2VudmFsdWVzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGVpMS5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCksIGVpTm9FaXZlY3MucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpKTsKKworICBNYXRyaXhUeXBlIGlkID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1goaWQub3BlcmF0b3JOb3JtKCksIFJlYWxTY2FsYXIoMSkpOworCisgIGlmIChyb3dzID4gMiAmJiByb3dzIDwgMjApCisgIHsKKyAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgorICAgIGEoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpTmFOKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaU5hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9CisKKyAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTA5OAorICB7CisgICAgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnKGEuYWRqb2ludCgpICogYSk7CisgICAgZWlnLmNvbXB1dGUoYS5hZGpvaW50KCkgKiBhKTsKKyAgfQorCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDQ3OAorICB7CisgICAgYS5zZXRaZXJvKCk7CisgICAgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkzKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaTMuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oZWkzLmVpZ2VudmFsdWVzKCkubm9ybSgpLFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKmVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSkuZXZhbCgpLmlzSWRlbnRpdHkoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpZzsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZhbHVlcygpKTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20obS5yb3dzKCksbS5jb2xzKCkpOworICBlaWcuY29tcHV0ZShhLCBmYWxzZSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbnNvbHZlcl9nZW5lcmljKCkKK3sKKyAgaW50IHMgPSAwOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0ZigpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcihNYXRyaXhYZChzLHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKworICAgIC8vIHNvbWUgdHJpdmlhbCBidXQgaW1wbGVtZW50YXRpb24td2lzZSB0cmlja3kgY2FzZXMKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXIoTWF0cml4WGQoMSwxKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXIoTWF0cml4WGQoMiwyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggZWlnZW5zb2x2ZXIoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGVpZ2Vuc29sdmVyKE1hdHJpeDJkKCkpICk7CisgIH0KKworICBDQUxMX1NVQlRFU1RfMSggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg0ZigpKSApOworICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgQ0FMTF9TVUJURVNUXzIoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4WGQocyxzKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDJkKCkpICk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF81KEVpZ2VuU29sdmVyPE1hdHJpeFhmPiB0bXAocykpOworCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDQxMAorICBDQUxMX1NVQlRFU1RfMigKKyAgeworICAgICBNYXRyaXhYZCBBKDEsMSk7CisgICAgIEEoMCwwKSA9IHN0ZDo6c3FydCgtMS4pOyAvLyBpcyBOb3QtYS1OdW1iZXIKKyAgICAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeFhkPiBzb2x2ZXIoQSk7CisgICAgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIuaW5mbygpLCBOdW1lcmljYWxJc3N1ZSk7CisgIH0KKyAgKTsKKyAgCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzIKKyAgeworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDc5MworICAgIE1hdHJpeFhkIGEoMywzKTsKKyAgICBhIDw8IDAsICAwLCAgMSwKKyAgICAgICAgMSwgIDEsIDEsCisgICAgICAgIDEsIDFlKzIwMCwgIDE7CisgICAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlaWcoYSk7CisgICAgZG91YmxlIHNjYWxlID0gMWUtMjAwOyAvLyBzY2FsZSB0byBhdm9pZCBvdmVyZmxvdyBkdXJpbmcgdGhlIGNvbXBhcmlzb25zCisgICAgVkVSSUZZX0lTX0FQUFJPWChhICogZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpKnNjYWxlLCBlaWcucHNldWRvRWlnZW52ZWN0b3JzKCkgKiBlaWcucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpKnNjYWxlKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGEgKiBlaWcuZWlnZW52ZWN0b3JzKCkqc2NhbGUsIGVpZy5laWdlbnZlY3RvcnMoKSAqIGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSpzY2FsZSk7CisgIH0KKyAgeworICAgIC8vIGNoZWNrIGEgY2FzZSB3aGVyZSBhbGwgZWlnZW52YWx1ZXMgYXJlIG51bGwuCisgICAgTWF0cml4WGQgYSgyLDIpOworICAgIGEgPDwgMSwgIDEsCisgICAgICAgIC0xLCAtMTsKKyAgICBFaWdlbjo6RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVpZyhhKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKS5zcXVhcmVkTm9ybSgpLCAyLik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoYSAqIGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSkubm9ybSgpKzEuLCAxLik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpICogZWlnLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSkubm9ybSgpKzEuLCAxLik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoYSAqIGVpZy5laWdlbnZlY3RvcnMoKSkubm9ybSgpKzEuLCAxLik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoZWlnLmVpZ2VudmVjdG9ycygpICogZWlnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKS5ub3JtKCkrMS4sIDEuKTsKKyAgfQorI2VuZGlmCisgIAorICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX3NlbGZhZGpvaW50LmNwcCBiL3Rlc3QvZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YWQ0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2Vuc29sdmVyX3NlbGZhZGpvaW50LmNwcApAQCAtMCwwICsxLDI3NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic3ZkX2ZpbGwuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlQ29yZT4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXJfZXNzZW50aWFsX2NoZWNrKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBSZWFsU2NhbGFyIGVpdmFsX2VwcyA9IG51bWV4dDo6bWluaTxSZWFsU2NhbGFyPih0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpLCAgTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKjIwMDAwKTsKKyAgCisgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlTeW1tKG0pOworICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tLmluZm8oKSwgU3VjY2Vzcyk7CisKKyAgUmVhbFNjYWxhciBzY2FsaW5nID0gbS5jd2lzZUFicygpLm1heENvZWZmKCk7CisKKyAgaWYoc2NhbGluZzwoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKQorICB7CisgICAgVkVSSUZZKGVpU3ltbS5laWdlbnZhbHVlcygpLmN3aXNlQWJzKCkubWF4Q29lZmYoKSA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChtLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbS5laWdlbnZlY3RvcnMoKSkvc2NhbGluZywKKyAgICAgICAgICAgICAgICAgICAgIChlaVN5bW0uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW0uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpL3NjYWxpbmcpOworICB9CisgIFZFUklGWV9JU19BUFBST1gobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKSwgZWlTeW1tLmVpZ2VudmFsdWVzKCkpOworICBWRVJJRllfSVNfVU5JVEFSWShlaVN5bW0uZWlnZW52ZWN0b3JzKCkpOworCisgIGlmKG0uY29scygpPD00KQorICB7CisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaURpcmVjdDsKKyAgICBlaURpcmVjdC5jb21wdXRlRGlyZWN0KG0pOyAgCisgICAgVkVSSUZZX0lTX0VRVUFMKGVpRGlyZWN0LmluZm8oKSwgU3VjY2Vzcyk7CisgICAgaWYoISBlaVN5bW0uZWlnZW52YWx1ZXMoKS5pc0FwcHJveChlaURpcmVjdC5laWdlbnZhbHVlcygpLCBlaXZhbF9lcHMpICkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgInJlZmVyZW5jZSBlaWdlbnZhbHVlczogIiA8PCBlaVN5bW0uZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgPDwgIm9idGFpbmVkIGVpZ2VudmFsdWVzOiAgIiA8PCBlaURpcmVjdC5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8ICJcbiIKKyAgICAgICAgICAgICAgICA8PCAiZGlmZjogICAgICAgICAgICAgICAgICAiIDw8IChlaVN5bW0uZWlnZW52YWx1ZXMoKS1laURpcmVjdC5laWdlbnZhbHVlcygpKS50cmFuc3Bvc2UoKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgPDwgImVycm9yIChlcHMpOiAgICAgICAgICAgIiA8PCAoZWlTeW1tLmVpZ2VudmFsdWVzKCktZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSkubm9ybSgpIC8gZWlTeW1tLmVpZ2VudmFsdWVzKCkubm9ybSgpIDw8ICIgICgiIDw8IGVpdmFsX2VwcyA8PCAiKVxuIjsKKyAgICB9CisgICAgaWYoc2NhbGluZzwoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKQorICAgIHsKKyAgICAgIFZFUklGWShlaURpcmVjdC5laWdlbnZhbHVlcygpLmN3aXNlQWJzKCkubWF4Q29lZmYoKSA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1goZWlTeW1tLmVpZ2VudmFsdWVzKCkvc2NhbGluZywgZWlEaXJlY3QuZWlnZW52YWx1ZXMoKS9zY2FsaW5nKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goKG0udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlEaXJlY3QuZWlnZW52ZWN0b3JzKCkpL3NjYWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIChlaURpcmVjdC5laWdlbnZlY3RvcnMoKSAqIGVpRGlyZWN0LmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKS9zY2FsaW5nKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKS9zY2FsaW5nLCBlaURpcmVjdC5laWdlbnZhbHVlcygpL3NjYWxpbmcpOworICAgIH0KKworICAgIFZFUklGWV9JU19VTklUQVJZKGVpRGlyZWN0LmVpZ2VudmVjdG9ycygpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBFaWdlblNvbHZlci5oLCBTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmggKGFuZCBpbmRpcmVjdGx5OiBUcmlkaWFnb25hbGl6YXRpb24uaCkKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGExID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSAgYS5hZGpvaW50KCkgKiBhICsgYTEuYWRqb2ludCgpICogYTE7CisgIE1hdHJpeFR5cGUgc3ltbUMgPSBzeW1tQTsKKyAgCisgIHN2ZF9maWxsX3JhbmRvbShzeW1tQSxTeW1tZXRyaWMpOworCisgIHN5bW1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc2V0WmVybygpOworICBzeW1tQy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnNldFplcm8oKTsKKworICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBiMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIHN5bW1CID0gYi5hZGpvaW50KCkgKiBiICsgYjEuYWRqb2ludCgpICogYjE7CisgIHN5bW1CLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc2V0WmVybygpOworICAKKyAgQ0FMTF9TVUJURVNUKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhzeW1tQSkgKTsKKworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbShzeW1tQSk7CisgIC8vIGdlbmVyYWxpemVkIGVpZ2VuIHBiCisgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1HZW4oc3ltbUMsIHN5bW1CKTsKKworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbU5vRWl2ZWNzKHN5bW1BLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTChlaVN5bW1Ob0VpdmVjcy5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfQVBQUk9YKGVpU3ltbS5laWdlbnZhbHVlcygpLCBlaVN5bW1Ob0VpdmVjcy5laWdlbnZhbHVlcygpKTsKKyAgCisgIC8vIGdlbmVyYWxpemVkIGVpZ2VuIHByb2JsZW0gQXggPSBsQngKKyAgZWlTeW1tR2VuLmNvbXB1dGUoc3ltbUMsIHN5bW1CLEF4X2xCeCk7CisgIFZFUklGWV9JU19FUVVBTChlaVN5bW1HZW4uaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZKChzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkpLmlzQXBwcm94KAorICAgICAgICAgIHN5bW1CLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW1HZW4uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLCBsYXJnZXJFcHMpKTsKKworICAvLyBnZW5lcmFsaXplZCBlaWdlbiBwcm9ibGVtIEJBeCA9IGx4CisgIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1DLCBzeW1tQixCQXhfbHgpOworICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tR2VuLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWSgoc3ltbUIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHN5bW1DLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSkpLmlzQXBwcm94KAorICAgICAgICAgKGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSksIGxhcmdlckVwcykpOworCisgIC8vIGdlbmVyYWxpemVkIGVpZ2VuIHByb2JsZW0gQUJ4ID0gbHgKKyAgZWlTeW1tR2VuLmNvbXB1dGUoc3ltbUMsIHN5bW1CLEFCeF9seCk7CisgIFZFUklGWV9JU19FUVVBTChlaVN5bW1HZW4uaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZKChzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoc3ltbUIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpKSkuaXNBcHByb3goCisgICAgICAgICAoZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpICogZWlTeW1tR2VuLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKSwgbGFyZ2VyRXBzKSk7CisKKworICBlaVN5bW0uY29tcHV0ZShzeW1tQyk7CisgIE1hdHJpeFR5cGUgc3FydFN5bW1BID0gZWlTeW1tLm9wZXJhdG9yU3FydCgpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKSwgc3FydFN5bW1BKnNxcnRTeW1tQSk7CisgIFZFUklGWV9JU19BUFBST1goc3FydFN5bW1BLCBzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkqZWlTeW1tLm9wZXJhdG9ySW52ZXJzZVNxcnQoKSk7CisKKyAgTWF0cml4VHlwZSBpZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOworICBWRVJJRllfSVNfQVBQUk9YKGlkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5vcGVyYXRvck5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1VbmluaXRpYWxpemVkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaVN5bW1VbmluaXRpYWxpemVkLmluZm8oKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQuZWlnZW52YWx1ZXMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQuZWlnZW52ZWN0b3JzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaVN5bW1VbmluaXRpYWxpemVkLm9wZXJhdG9yU3FydCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlTeW1tVW5pbml0aWFsaXplZC5vcGVyYXRvckludmVyc2VTcXJ0KCkpOworCisgIGVpU3ltbVVuaW5pdGlhbGl6ZWQuY29tcHV0ZShzeW1tQSwgZmFsc2UpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaVN5bW1VbmluaXRpYWxpemVkLmVpZ2VudmVjdG9ycygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlTeW1tVW5pbml0aWFsaXplZC5vcGVyYXRvclNxcnQoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQub3BlcmF0b3JJbnZlcnNlU3FydCgpKTsKKworICAvLyB0ZXN0IFRyaWRpYWdvbmFsaXphdGlvbidzIG1ldGhvZHMKKyAgVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+IHRyaWRpYWcoc3ltbUMpOworICBWRVJJRllfSVNfQVBQUk9YKHRyaWRpYWcuZGlhZ29uYWwoKSwgdHJpZGlhZy5tYXRyaXhUKCkuZGlhZ29uYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1godHJpZGlhZy5zdWJEaWFnb25hbCgpLCB0cmlkaWFnLm1hdHJpeFQoKS50ZW1wbGF0ZSBkaWFnb25hbDwtMT4oKSk7CisgIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gVCA9IHRyaWRpYWcubWF0cml4VCgpOworICBpZihyb3dzPjEgJiYgY29scz4xKSB7CisgICAgLy8gRklYTUUgY2hlY2sgdGhhdCB1cHBlciBhbmQgbG93ZXIgcGFydCBhcmUgMDoKKyAgICAvL1ZFUklGWShULnRvcFJpZ2h0Q29ybmVyKHJvd3MtMiwgY29scy0yKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5pc1plcm8oKSk7CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWCh0cmlkaWFnLmRpYWdvbmFsKCksIFQuZGlhZ29uYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1godHJpZGlhZy5zdWJEaWFnb25hbCgpLCBULnRlbXBsYXRlIGRpYWdvbmFsPDE+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKSwgdHJpZGlhZy5tYXRyaXhRKCkgKiB0cmlkaWFnLm1hdHJpeFQoKS5ldmFsKCkgKiBNYXRyaXhUeXBlKHRyaWRpYWcubWF0cml4USgpKS5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKSwgdHJpZGlhZy5tYXRyaXhRKCkgKiB0cmlkaWFnLm1hdHJpeFQoKSAqIHRyaWRpYWcubWF0cml4USgpLmFkam9pbnQoKSk7CisgIAorICAvLyBUZXN0IGNvbXB1dGF0aW9uIG9mIGVpZ2VudmFsdWVzIGZyb20gdHJpZGlhZ29uYWwgbWF0cml4CisgIGlmKHJvd3MgPiAxKQorICB7CisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1UcmlkaWFnOworICAgIGVpU3ltbVRyaWRpYWcuY29tcHV0ZUZyb21UcmlkaWFnb25hbCh0cmlkaWFnLm1hdHJpeFQoKS5kaWFnb25hbCgpLCB0cmlkaWFnLm1hdHJpeFQoKS5kaWFnb25hbCgtMSksIENvbXB1dGVFaWdlbnZlY3RvcnMpOworICAgIFZFUklGWV9JU19BUFBST1goZWlTeW1tLmVpZ2VudmFsdWVzKCksIGVpU3ltbVRyaWRpYWcuZWlnZW52YWx1ZXMoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0cmlkaWFnLm1hdHJpeFQoKSwgZWlTeW1tVHJpZGlhZy5laWdlbnZlY3RvcnMoKS5yZWFsKCkgKiBlaVN5bW1UcmlkaWFnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpICogZWlTeW1tVHJpZGlhZy5laWdlbnZlY3RvcnMoKS5yZWFsKCkudHJhbnNwb3NlKCkpOworICB9CisKKyAgaWYgKHJvd3MgPiAxICYmIHJvd3MgPCAyMCkKKyAgeworICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCisgICAgc3ltbUMoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlTeW1tTmFOKHN5bW1DKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tTmFOLmluZm8oKSwgTm9Db252ZXJnZW5jZSk7CisgIH0KKworICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMDk4CisgIHsKKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpZyhhLmFkam9pbnQoKSAqIGEpOworICAgIGVpZy5jb21wdXRlKGEuYWRqb2ludCgpICogYSk7CisgIH0KKworICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA0NzgKKyAgeworICAgIGEuc2V0WmVybygpOworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkzKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaTMuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oZWkzLmVpZ2VudmFsdWVzKCkubm9ybSgpLFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKmVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSkuZXZhbCgpLmlzSWRlbnRpdHkoKSk7CisgIH0KK30KKwordGVtcGxhdGU8aW50Pgordm9pZCBidWdfODU0KCkKK3sKKyAgTWF0cml4M2QgbTsKKyAgbSA8PCA4NTAuOTYxLCA1MS45NjYsIDAsCisgICAgICAgNTEuOTY2LCAyNTQuODQxLCAwLAorICAgICAgICAgICAgMCwgICAgICAgMCwgMDsKKyAgc2VsZmFkam9pbnRlaWdlbnNvbHZlcl9lc3NlbnRpYWxfY2hlY2sobSk7Cit9CisKK3RlbXBsYXRlPGludD4KK3ZvaWQgYnVnXzEwMTQoKQoreworICBNYXRyaXgzZCBtOworICBtIDw8ICAgICAgICAwLjExMTExMTExMTExMTExMTE0NjU4LCAwLCAwLAorICAgICAgIDAsICAgICAwLjExMTExMTExMTExMTExMTA5MTA3LCAwLAorICAgICAgIDAsIDAsICAwLjExMTExMTExMTExMTExMTA3NzE5OworICBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhtKTsKK30KKwordGVtcGxhdGU8aW50Pgordm9pZCBidWdfMTIyNSgpCit7CisgIE1hdHJpeDNkIG0xLCBtMjsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIG0xID0gbTEqbTEudHJhbnNwb3NlKCk7CisgIG0yID0gbTEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4M2Q+IGVpZzEobTEpOworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeDNkPiBlaWcyKG0yLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goZWlnMS5laWdlbnZhbHVlcygpLCBlaWcyLmVpZ2VudmFsdWVzKCkpOworfQorCit0ZW1wbGF0ZTxpbnQ+Cit2b2lkIGJ1Z18xMjA0KCkKK3sKKyAgU3BhcnNlTWF0cml4PGRvdWJsZT4gQSgyLDIpOworICBBLnNldElkZW50aXR5KCk7CisgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+ID4gZWlnKEEpOworfQorCit2b2lkIHRlc3RfZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQoKQoreworICBpbnQgcyA9IDA7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgLy8gdHJpdmlhbCB0ZXN0IGZvciAxeDEgbWF0cmljZXM6CisgICAgQ0FMTF9TVUJURVNUXzEoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIC8vIHZlcnkgaW1wb3J0YW50IHRvIHRlc3QgM3gzIGFuZCAyeDIgbWF0cmljZXMgc2luY2Ugd2UgcHJvdmlkZSBzcGVjaWFsIHBhdGhzIGZvciB0aGVtCisgICAgQ0FMTF9TVUJURVNUXzEyKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEyKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDJkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEzKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEzKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4NGQoKSkgKTsKKyAgICAKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZihzLHMpKSApOworICAgIENBTExfU1VCVEVTVF80KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGNkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ocyxzKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisKKyAgICAvLyBzb21lIHRyaXZpYWwgYnV0IGltcGxlbWVudGF0aW9uLXdpc2UgdHJpY2t5IGNhc2VzCisgICAgQ0FMTF9TVUJURVNUXzQoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGQoMSwxKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZCgyLDIpKSApOworICAgIENBTExfU1VCVEVTVF82KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsMSwxPigpKSApOworICAgIENBTExfU1VCVEVTVF83KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsMiwyPigpKSApOworICB9CisgIAorICBDQUxMX1NVQlRFU1RfMTMoIGJ1Z184NTQ8MD4oKSApOworICBDQUxMX1NVQlRFU1RfMTMoIGJ1Z18xMDE0PDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzEzKCBidWdfMTIwNDwwPigpICk7CisgIENBTExfU1VCVEVTVF8xMyggYnVnXzEyMjU8MD4oKSApOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgQ0FMTF9TVUJURVNUXzgoU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZj4gdG1wMShzKSk7CisgIENBTExfU1VCVEVTVF84KFRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhYZj4gdG1wMihzKSk7CisgIAorICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvZXZhbHVhdG9yX2NvbW1vbi5oIGIvdGVzdC9ldmFsdWF0b3JfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXZhbHVhdG9yX2NvbW1vbi5oCmRpZmYgLS1naXQgYS90ZXN0L2V2YWx1YXRvcnMuY3BwIGIvdGVzdC9ldmFsdWF0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQ1YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ldmFsdWF0b3JzLmNwcApAQCAtMCwwICsxLDQ5OSBAQAorCisjaW5jbHVkZSAibWFpbi5oIgorCituYW1lc3BhY2UgRWlnZW4geworCisgIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CisgIGNvbnN0IFByb2R1Y3Q8TGhzLFJocz4KKyAgcHJvZChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICByZXR1cm4gUHJvZHVjdDxMaHMsUmhzPihsaHMscmhzKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CisgIGNvbnN0IFByb2R1Y3Q8TGhzLFJocyxMYXp5UHJvZHVjdD4KKyAgbGF6eXByb2QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgcmV0dXJuIFByb2R1Y3Q8TGhzLFJocyxMYXp5UHJvZHVjdD4obGhzLHJocyk7CisgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgRHN0WHByVHlwZSYgY29weV91c2luZ19ldmFsdWF0b3IoY29uc3QgRWlnZW5CYXNlPERzdFhwclR5cGU+ICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYykKKyAgeworICAgIGNhbGxfYXNzaWdubWVudChkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7CisgICAgcmV0dXJuIGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBTdG9yYWdlQmFzZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KKyAgRUlHRU5fU1RST05HX0lOTElORQorICBjb25zdCBEc3RYcHJUeXBlJiBjb3B5X3VzaW5nX2V2YWx1YXRvcihjb25zdCBOb0FsaWFzPERzdFhwclR5cGUsIFN0b3JhZ2VCYXNlPiYgZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMpCisgIHsKKyAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LCBzcmMuZGVyaXZlZCgpLCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworICAgIHJldHVybiBkc3QuZXhwcmVzc2lvbigpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIERzdFhwclR5cGUmIGNvcHlfdXNpbmdfZXZhbHVhdG9yKGNvbnN0IFBsYWluT2JqZWN0QmFzZTxEc3RYcHJUeXBlPiAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMpCisgIHsKKyAgICAjaWZkZWYgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HCisgICAgZWlnZW5fYXNzZXJ0KChkc3Quc2l6ZSgpPT0wIHx8IChJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyAoZHN0LnNpemUoKSA9PSBzcmMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRzdC5yb3dzKCkgPT0gc3JjLnJvd3MoKSAmJiBkc3QuY29scygpID09IHNyYy5jb2xzKCkpKSkKKyAgICAgICAgICAgICAgICAmJiAiU2l6ZSBtaXNtYXRjaC4gQXV0b21hdGljIHJlc2l6aW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HIGlzIGRlZmluZWQiKTsKKyAgI2Vsc2UKKyAgICBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkucmVzaXplTGlrZShzcmMuZGVyaXZlZCgpKTsKKyAgI2VuZGlmCisgICAgCisgICAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKKyAgICByZXR1cm4gZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KKyAgdm9pZCBhZGRfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBjYWxsX2Fzc2lnbm1lbnQoY29uc3RfY2FzdDxEc3RYcHJUeXBlJj4oZHN0KSwgc3JjLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgorICB2b2lkIHN1YnRyYWN0X2Fzc2lnbl91c2luZ19ldmFsdWF0b3IoY29uc3QgRHN0WHByVHlwZSYgZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgY2FsbF9hc3NpZ25tZW50KGNvbnN0X2Nhc3Q8RHN0WHByVHlwZSY+KGRzdCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KKyAgdm9pZCBtdWx0aXBseV9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIGNhbGxfYXNzaWdubWVudChkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjptdWxfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KKyAgdm9pZCBkaXZpZGVfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBzcmMuZGVyaXZlZCgpLCBpbnRlcm5hbDo6ZGl2X2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KKyAgdm9pZCBzd2FwX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBzcmMuY29uc3RfY2FzdF9kZXJpdmVkKCksIGludGVybmFsOjpzd2FwX2Fzc2lnbl9vcDxTY2FsYXI+KCkpOworICB9CisKKyAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UsIHR5cGVuYW1lIFNyYywgdHlwZW5hbWUgRnVuYz4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNhbGxfYXNzaWdubWVudChjb25zdCBOb0FsaWFzPERzdCxTdG9yYWdlQmFzZT4mIGRzdCwgY29uc3QgU3JjJiBzcmMsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgICAgeworICAgICAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRzdC5leHByZXNzaW9uKCksIHNyYywgZnVuYyk7CisgICAgfQorICB9CisgIAorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiBsb25nIGdldF9jb3N0KGNvbnN0IFhwclR5cGUmICkgeyByZXR1cm4gRWlnZW46OmludGVybmFsOjpldmFsdWF0b3I8WHByVHlwZT46OkNvZWZmUmVhZENvc3Q7IH0KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihERVNULEVYUFIpIFZFUklGWV9JU19BUFBST1goY29weV91c2luZ19ldmFsdWF0b3IoREVTVCwoRVhQUikpLCAoRVhQUikuZXZhbCgpKTsKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKERFU1QsRVhQUixSRUYpIFZFUklGWV9JU19BUFBST1goY29weV91c2luZ19ldmFsdWF0b3IoREVTVCwoRVhQUikpLCAoUkVGKS5ldmFsKCkpOworCit2b2lkIHRlc3RfZXZhbHVhdG9ycygpCit7CisgIC8vIFRlc3RpbmcgTWF0cml4IGV2YWx1YXRvciBhbmQgVHJhbnNwb3NlCisgIFZlY3RvcjJkIHYgPSBWZWN0b3IyZDo6UmFuZG9tKCk7CisgIGNvbnN0IFZlY3RvcjJkIHZfY29uc3Qodik7CisgIFZlY3RvcjJkIHYyOworICBSb3dWZWN0b3IyZCB3OworCisgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHYyLCB2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodjIsIHZfY29uc3QpOworCisgIC8vIFRlc3RpbmcgVHJhbnNwb3NlCisgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIHYudHJhbnNwb3NlKCkpOyAvLyBUcmFuc3Bvc2UgYXMgcnZhbHVlCisgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIHZfY29uc3QudHJhbnNwb3NlKCkpOworCisgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKHcudHJhbnNwb3NlKCksIHYpOyAvLyBUcmFuc3Bvc2UgYXMgbHZhbHVlCisgIFZFUklGWV9JU19BUFBST1godyx2LnRyYW5zcG9zZSgpLmV2YWwoKSk7CisKKyAgY29weV91c2luZ19ldmFsdWF0b3Iody50cmFuc3Bvc2UoKSwgdl9jb25zdCk7CisgIFZFUklGWV9JU19BUFBST1godyx2X2NvbnN0LnRyYW5zcG9zZSgpLmV2YWwoKSk7CisKKyAgLy8gVGVzdGluZyBBcnJheSBldmFsdWF0b3IKKyAgeworICAgIEFycmF5WFhmIGEoMiwzKTsKKyAgICBBcnJheVhYZiBiKDMsMik7CisgICAgYSA8PCAxLDIsMywgNCw1LDY7CisgICAgY29uc3QgQXJyYXlYWGYgYV9jb25zdChhKTsKKworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGIsIGEudHJhbnNwb3NlKCkpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYiwgYV9jb25zdC50cmFuc3Bvc2UoKSk7CisKKyAgICAvLyBUZXN0aW5nIEN3aXNlTnVsbGFyeU9wIGV2YWx1YXRvcgorICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKHcsIFJvd1ZlY3RvcjJkOjpSYW5kb20oKSk7CisgICAgVkVSSUZZKCh3LmFycmF5KCkgPj0gLTEpLmFsbCgpICYmICh3LmFycmF5KCkgPD0gMSkuYWxsKCkpOyAvLyBub3QgZWFzeSB0byB0ZXN0IC4uLgorCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodywgUm93VmVjdG9yMmQ6Olplcm8oKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUih3LCBSb3dWZWN0b3IyZDo6Q29uc3RhbnQoMykpOworICAgIAorICAgIC8vIG1peCBDd2lzZU51bGxhcnlPcCBhbmQgdHJhbnNwb3NlCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodywgVmVjdG9yMmQ6Olplcm8oKS50cmFuc3Bvc2UoKSk7CisgIH0KKworICB7CisgICAgLy8gdGVzdCBwcm9kdWN0IGV4cHJlc3Npb25zCisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMDApOworICAgIE1hdHJpeFhmIGEocyxzKSwgYihzLHMpLCBjKHMscyksIGQocyxzKTsKKyAgICBhLnNldFJhbmRvbSgpOworICAgIGIuc2V0UmFuZG9tKCk7CisgICAgYy5zZXRSYW5kb20oKTsKKyAgICBkLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGQsIChhICsgYikpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGQsIChhICsgYikudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihkLCBwcm9kKGEsYiksIGEqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQubm9hbGlhcygpLCBwcm9kKGEsYiksIGEqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHByb2QoYSxiKSArIGMsIGEqYiArIGMpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihkLCBzICogcHJvZChhLGIpLCBzICogYSpiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoZCwgcHJvZChhLGIpLnRyYW5zcG9zZSgpLCAoYSpiKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHByb2QoYSxiKSArIHByb2QoYixjKSwgYSpiICsgYipjKTsKKworICAgIC8vIGNoZWNrIHRoYXQgcHJvZCB3b3JrcyBldmVuIHdpdGggYWxpYXNpbmcgcHJlc2VudAorICAgIGMgPSBhKmE7CisgICAgY29weV91c2luZ19ldmFsdWF0b3IoYSwgcHJvZChhLGEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGEsYyk7CisKKyAgICAvLyBjaGVjayBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHByb2R1Y3RzCisgICAgZCA9IGM7CisgICAgYWRkX2Fzc2lnbl91c2luZ19ldmFsdWF0b3IoYy5ub2FsaWFzKCksIHByb2QoYSxiKSk7CisgICAgZC5ub2FsaWFzKCkgKz0gYSpiOworICAgIFZFUklGWV9JU19BUFBST1goYywgZCk7CisKKyAgICBkID0gYzsKKyAgICBzdWJ0cmFjdF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGMubm9hbGlhcygpLCBwcm9kKGEsYikpOworICAgIGQubm9hbGlhcygpIC09IGEqYjsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGMsIGQpOworICB9CisKKyAgeworICAgIC8vIHRlc3QgcHJvZHVjdCB3aXRoIGFsbCBwb3NzaWJsZSBzaXplcworICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKKyAgICBNYXRyaXg8ZmxvYXQsICAgICAgMSwgICAgICAxPiBtMTEsIHJlczExOyAgbTExLnNldFJhbmRvbSgxLDEpOworICAgIE1hdHJpeDxmbG9hdCwgICAgICAxLCAgICAgIDQ+IG0xNCwgcmVzMTQ7ICBtMTQuc2V0UmFuZG9tKDEsNCk7CisgICAgTWF0cml4PGZsb2F0LCAgICAgIDEsRHluYW1pYz4gbTFYLCByZXMxWDsgIG0xWC5zZXRSYW5kb20oMSxzKTsKKyAgICBNYXRyaXg8ZmxvYXQsICAgICAgNCwgICAgICAxPiBtNDEsIHJlczQxOyAgbTQxLnNldFJhbmRvbSg0LDEpOworICAgIE1hdHJpeDxmbG9hdCwgICAgICA0LCAgICAgIDQ+IG00NCwgcmVzNDQ7ICBtNDQuc2V0UmFuZG9tKDQsNCk7CisgICAgTWF0cml4PGZsb2F0LCAgICAgIDQsRHluYW1pYz4gbTRYLCByZXM0WDsgIG00WC5zZXRSYW5kb20oNCxzKTsKKyAgICBNYXRyaXg8ZmxvYXQsRHluYW1pYywgICAgICAxPiBtWDEsIHJlc1gxOyAgbVgxLnNldFJhbmRvbShzLDEpOworICAgIE1hdHJpeDxmbG9hdCxEeW5hbWljLCAgICAgIDQ+IG1YNCwgcmVzWDQ7ICBtWDQuc2V0UmFuZG9tKHMsNCk7CisgICAgTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYz4gbVhYLCByZXNYWDsgIG1YWC5zZXRSYW5kb20ocyxzKTsKKworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxMSwgcHJvZChtMTEsbTExKSwgbTExKm0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczExLCBwcm9kKG0xNCxtNDEpLCBtMTQqbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTEsIHByb2QobTFYLG1YMSksIG0xWCptWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxNCwgcHJvZChtMTEsbTE0KSwgbTExKm0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczE0LCBwcm9kKG0xNCxtNDQpLCBtMTQqbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTQsIHByb2QobTFYLG1YNCksIG0xWCptWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxWCwgcHJvZChtMTEsbTFYKSwgbTExKm0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczFYLCBwcm9kKG0xNCxtNFgpLCBtMTQqbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMVgsIHByb2QobTFYLG1YWCksIG0xWCptWFgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0MSwgcHJvZChtNDEsbTExKSwgbTQxKm0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQxLCBwcm9kKG00NCxtNDEpLCBtNDQqbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDEsIHByb2QobTRYLG1YMSksIG00WCptWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0NCwgcHJvZChtNDEsbTE0KSwgbTQxKm0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQ0LCBwcm9kKG00NCxtNDQpLCBtNDQqbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDQsIHByb2QobTRYLG1YNCksIG00WCptWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0WCwgcHJvZChtNDEsbTFYKSwgbTQxKm0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczRYLCBwcm9kKG00NCxtNFgpLCBtNDQqbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNFgsIHByb2QobTRYLG1YWCksIG00WCptWFgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYMSwgcHJvZChtWDEsbTExKSwgbVgxKm0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1gxLCBwcm9kKG1YNCxtNDEpLCBtWDQqbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDEsIHByb2QobVhYLG1YMSksIG1YWCptWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYNCwgcHJvZChtWDEsbTE0KSwgbVgxKm0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1g0LCBwcm9kKG1YNCxtNDQpLCBtWDQqbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDQsIHByb2QobVhYLG1YNCksIG1YWCptWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYWCwgcHJvZChtWDEsbTFYKSwgbVgxKm0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1hYLCBwcm9kKG1YNCxtNFgpLCBtWDQqbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWFgsIHByb2QobVhYLG1YWCksIG1YWCptWFgpOworICB9CisKKyAgeworICAgIEFycmF5WFhmIGEoMiwzKTsKKyAgICBBcnJheVhYZiBiKDMsMik7CisgICAgYSA8PCAxLDIsMywgNCw1LDY7CisgICAgY29uc3QgQXJyYXlYWGYgYV9jb25zdChhKTsKKyAgICAKKyAgICAvLyB0aGlzIGRvZXMgbm90IHdvcmsgYmVjYXVzZSBSYW5kb20gaXMgZXZhbC1iZWZvcmUtbmVzdGVkOiAKKyAgICAvLyBjb3B5X3VzaW5nX2V2YWx1YXRvcih3LCBWZWN0b3IyZDo6UmFuZG9tKCkudHJhbnNwb3NlKCkpOworCisgICAgLy8gdGVzdCBDd2lzZVVuYXJ5T3AKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUih2MiwgMyAqIHYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsICgzICogdikudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGIsIChhICsgMykudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGIsICgyICogYV9jb25zdCArIDMpLnRyYW5zcG9zZSgpKTsKKworICAgIC8vIHRlc3QgQ3dpc2VCaW5hcnlPcAorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHYyLCB2ICsgVmVjdG9yMmQ6Ok9uZXMoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodywgKHYgKyBWZWN0b3IyZDo6T25lcygpKS50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QoUm93VmVjdG9yMmQ6OkNvbnN0YW50KDMpKSk7CisKKyAgICAvLyBkeW5hbWljIG1hdHJpY2VzIGFuZCBhcnJheXMKKyAgICBNYXRyaXhYZCBtYXQxKDYsNiksIG1hdDIoNiw2KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXQxLCBNYXRyaXhYZDo6SWRlbnRpdHkoNiw2KSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobWF0MiwgbWF0MSk7CisgICAgY29weV91c2luZ19ldmFsdWF0b3IobWF0Mi50cmFuc3Bvc2UoKSwgbWF0MSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLnRyYW5zcG9zZSgpLCBtYXQxKTsKKworICAgIEFycmF5WFhkIGFycjEoNiw2KSwgYXJyMig2LDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjEsIEFycmF5WFhkOjpDb25zdGFudCg2LDYsIDMuMCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIGFycjEpOworICAgIAorICAgIC8vIHRlc3QgYXV0b21hdGljIHJlc2l6aW5nCisgICAgbWF0Mi5yZXNpemUoMywzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXQyLCBtYXQxKTsKKyAgICBhcnIyLnJlc2l6ZSg5LDkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIGFycjEpOworCisgICAgLy8gdGVzdCBkaXJlY3QgdHJhdmVyc2FsCisgICAgTWF0cml4M2YgbTM7CisgICAgQXJyYXkzM2YgYTM7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMsIE1hdHJpeDNmOjpJZGVudGl0eSgpKTsgIC8vIG1hdHJpeCwgbnVsbGFyeQorICAgIC8vIFRPRE86IGZpbmQgYSB3YXkgdG8gdGVzdCBkaXJlY3QgdHJhdmVyc2FsIHdpdGggYXJyYXkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMy50cmFuc3Bvc2UoKSwgTWF0cml4M2Y6OklkZW50aXR5KCkudHJhbnNwb3NlKCkpOyAgLy8gdHJhbnNwb3NlCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMsIDIgKiBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7ICAvLyB1bmFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSArIE1hdHJpeDNmOjpaZXJvKCkpOyAgLy8gYmluYXJ5CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMuYmxvY2soMCwwLDIsMiksIE1hdHJpeDNmOjpJZGVudGl0eSgpLmJsb2NrKDEsMSwyLDIpKTsgIC8vIGJsb2NrCisKKyAgICAvLyB0ZXN0IGxpbmVhciB0cmF2ZXJzYWwKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMywgTWF0cml4M2Y6Olplcm8oKSk7ICAvLyBtYXRyaXgsIG51bGxhcnkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhMywgQXJyYXkzM2Y6Olplcm8oKSk7ICAvLyBhcnJheQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLnRyYW5zcG9zZSgpLCBNYXRyaXgzZjo6WmVybygpLnRyYW5zcG9zZSgpKTsgIC8vIHRyYW5zcG9zZQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCAyICogTWF0cml4M2Y6Olplcm8oKSk7ICAvLyB1bmFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCBNYXRyaXgzZjo6WmVybygpICsgbTMpOyAgLy8gYmluYXJ5ICAKKworICAgIC8vIHRlc3QgaW5uZXIgdmVjdG9yaXphdGlvbgorICAgIE1hdHJpeDRmIG00LCBtNHNyYyA9IE1hdHJpeDRmOjpSYW5kb20oKTsKKyAgICBBcnJheTQ0ZiBhNCwgYTRzcmMgPSBNYXRyaXg0Zjo6UmFuZG9tKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQsIG00c3JjKTsgIC8vIG1hdHJpeAorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGE0LCBhNHNyYyk7ICAvLyBhcnJheQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG00LnRyYW5zcG9zZSgpLCBtNHNyYy50cmFuc3Bvc2UoKSk7ICAvLyB0cmFuc3Bvc2UKKyAgICAvLyBUT0RPOiBmaW5kIG91dCB3aHkgTWF0cml4NGY6Olplcm8oKSBkb2VzIG5vdCBhbGxvdyBpbm5lciB2ZWN0b3JpemF0aW9uCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQsIDIgKiBtNHNyYyk7ICAvLyB1bmFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG00LCBtNHNyYyArIG00c3JjKTsgIC8vIGJpbmFyeQorCisgICAgLy8gdGVzdCBsaW5lYXIgdmVjdG9yaXphdGlvbgorICAgIE1hdHJpeFhmIG1YKDYsNiksIG1Yc3JjID0gTWF0cml4WGY6OlJhbmRvbSg2LDYpOworICAgIEFycmF5WFhmIGFYKDYsNiksIGFYc3JjID0gQXJyYXlYWGY6OlJhbmRvbSg2LDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCBtWHNyYyk7ICAvLyBtYXRyaXgKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhWCwgYVhzcmMpOyAgLy8gYXJyYXkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWC50cmFuc3Bvc2UoKSwgbVhzcmMudHJhbnNwb3NlKCkpOyAgLy8gdHJhbnNwb3NlCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobVgsIE1hdHJpeFhmOjpaZXJvKDYsNikpOyAgLy8gbnVsbGFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCAyICogbVhzcmMpOyAgLy8gdW5hcnkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWCwgbVhzcmMgKyBtWHNyYyk7ICAvLyBiaW5hcnkKKworICAgIC8vIHRlc3QgYmxvY2tzIGFuZCBzbGljZSB2ZWN0b3JpemF0aW9uCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQsIChtWHNyYy5ibG9jazw0LDQ+KDEsMCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhWCwgQXJyYXlYWGY6OkNvbnN0YW50KDEwLCAxMCwgMy4wKS5ibG9jaygyLCAzLCA2LCA2KSk7CisKKyAgICBNYXRyaXg0ZiBtNHJlZiA9IG00OworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKG00LmJsb2NrKDEsIDEsIDIsIDMpLCBtMy5ib3R0b21Sb3dzKDIpKTsKKyAgICBtNHJlZi5ibG9jaygxLCAxLCAyLCAzKSA9IG0zLmJvdHRvbVJvd3MoMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCwgbTRyZWYpOworCisgICAgbVguc2V0SWRlbnRpdHkoMjAsMjApOworICAgIE1hdHJpeFhmIG1YcmVmID0gTWF0cml4WGY6OklkZW50aXR5KDIwLDIwKTsKKyAgICBtWHNyYyA9IE1hdHJpeFhmOjpSYW5kb20oOSwxMik7CisgICAgY29weV91c2luZ19ldmFsdWF0b3IobVguYmxvY2soNCwgNCwgOSwgMTIpLCBtWHNyYyk7CisgICAgbVhyZWYuYmxvY2soNCwgNCwgOSwgMTIpID0gbVhzcmM7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtWCwgbVhyZWYpOworCisgICAgLy8gdGVzdCBNYXAKKyAgICBjb25zdCBmbG9hdCByYXdbM10gPSB7MSwyLDN9OworICAgIGZsb2F0IGJ1ZmZlclszXSA9IHswLDAsMH07CisgICAgVmVjdG9yM2YgdjM7CisgICAgQXJyYXkzZiBhM2Y7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodjMsIE1hcDxjb25zdCBWZWN0b3IzZj4ocmF3KSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYTNmLCBNYXA8Y29uc3QgQXJyYXkzZj4ocmF3KSk7CisgICAgVmVjdG9yM2Y6Ok1hcChidWZmZXIpID0gMip2MzsKKyAgICBWRVJJRlkoYnVmZmVyWzBdID09IDIpOworICAgIFZFUklGWShidWZmZXJbMV0gPT0gNCk7CisgICAgVkVSSUZZKGJ1ZmZlclsyXSA9PSA2KTsKKworICAgIC8vIHRlc3QgQ3dpc2VVbmFyeVZpZXcKKyAgICBtYXQxLnNldFJhbmRvbSgpOworICAgIG1hdDIuc2V0SWRlbnRpdHkoKTsKKyAgICBNYXRyaXhYY2QgbWF0WGNkKDYsNiksIG1hdFhjZF9yZWYoNiw2KTsKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihtYXRYY2QucmVhbCgpLCBtYXQxKTsKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihtYXRYY2QuaW1hZygpLCBtYXQyKTsKKyAgICBtYXRYY2RfcmVmLnJlYWwoKSA9IG1hdDE7CisgICAgbWF0WGNkX3JlZi5pbWFnKCkgPSBtYXQyOworICAgIFZFUklGWV9JU19BUFBST1gobWF0WGNkLCBtYXRYY2RfcmVmKTsKKworICAgIC8vIHRlc3QgU2VsZWN0CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYVgsIChhWHNyYyA+IDApLnNlbGVjdChhWHNyYywgLWFYc3JjKSk7CisKKyAgICAvLyB0ZXN0IFJlcGxpY2F0ZQorICAgIG1Yc3JjID0gTWF0cml4WGY6OlJhbmRvbSg2LCA2KTsKKyAgICBWZWN0b3JYZiB2WCA9IFZlY3RvclhmOjpSYW5kb20oNik7CisgICAgbVgucmVzaXplKDYsIDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCBtWHNyYy5jb2x3aXNlKCkgKyB2WCk7CisgICAgbWF0WGNkLnJlc2l6ZSgxMiwgMTIpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1hdFhjZCwgbWF0WGNkX3JlZi5yZXBsaWNhdGUoMiwyKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobWF0WGNkLCAobWF0WGNkX3JlZi5yZXBsaWNhdGU8MiwyPigpKSk7CisKKyAgICAvLyB0ZXN0IHBhcnRpYWwgcmVkdWN0aW9ucworICAgIFZlY3RvclhkIHZlYzEoNik7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodmVjMSwgbWF0MS5yb3d3aXNlKCkuc3VtKCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHZlYzEsIG1hdDEuY29sd2lzZSgpLnN1bSgpLnRyYW5zcG9zZSgpKTsKKworICAgIC8vIHRlc3QgTWF0cml4V3JhcHBlciBhbmQgQXJyYXlXcmFwcGVyCisgICAgbWF0MS5zZXRSYW5kb20oNiw2KTsKKyAgICBhcnIxLnNldFJhbmRvbSg2LDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1hdDIsIGFycjEubWF0cml4KCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIG1hdDEuYXJyYXkoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobWF0MiwgKGFycjEgKyAyKS5tYXRyaXgoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYXJyMiwgbWF0MS5hcnJheSgpICsgMik7CisgICAgbWF0Mi5hcnJheSgpID0gYXJyMSAqIGFycjE7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLCAoYXJyMSAqIGFycjEpLm1hdHJpeCgpKTsKKyAgICBhcnIyLm1hdHJpeCgpID0gTWF0cml4WGQ6OklkZW50aXR5KDYsNik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhcnIyLCBNYXRyaXhYZDo6SWRlbnRpdHkoNiw2KS5hcnJheSgpKTsKKworICAgIC8vIHRlc3QgUmV2ZXJzZQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIGFycjEucmV2ZXJzZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhcnIyLCBhcnIxLmNvbHdpc2UoKS5yZXZlcnNlKCkpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIGFycjEucm93d2lzZSgpLnJldmVyc2UoKSk7CisgICAgYXJyMi5yZXZlcnNlKCkgPSBhcnIxOworICAgIFZFUklGWV9JU19BUFBST1goYXJyMiwgYXJyMS5yZXZlcnNlKCkpOworICAgIG1hdDIuYXJyYXkoKSA9IG1hdDEuYXJyYXkoKS5yZXZlcnNlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLmFycmF5KCksIG1hdDEuYXJyYXkoKS5yZXZlcnNlKCkpOworCisgICAgLy8gdGVzdCBEaWFnb25hbAorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHZlYzEsIG1hdDEuZGlhZ29uYWwoKSk7CisgICAgdmVjMS5yZXNpemUoNSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodmVjMSwgbWF0MS5kaWFnb25hbCgxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodmVjMSwgbWF0MS5kaWFnb25hbDwtMT4oKSk7CisgICAgdmVjMS5zZXRSYW5kb20oKTsKKworICAgIG1hdDIgPSBtYXQxOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKG1hdDEuZGlhZ29uYWwoMSksIHZlYzEpOworICAgIG1hdDIuZGlhZ29uYWwoMSkgPSB2ZWMxOworICAgIFZFUklGWV9JU19BUFBST1gobWF0MSwgbWF0Mik7CisKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihtYXQxLmRpYWdvbmFsPC0xPigpLCBtYXQxLmRpYWdvbmFsKDEpKTsKKyAgICBtYXQyLmRpYWdvbmFsPC0xPigpID0gbWF0Mi5kaWFnb25hbCgxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDEsIG1hdDIpOworICB9CisgIAorICB7CisgICAgLy8gdGVzdCBzd2FwcGluZworICAgIE1hdHJpeFhkIG1hdDEsIG1hdDIsIG1hdDFyZWYsIG1hdDJyZWY7CisgICAgbWF0MXJlZiA9IG1hdDEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsIDYpOworICAgIG1hdDJyZWYgPSBtYXQyID0gMiAqIG1hdDEgKyBNYXRyaXhYZDo6SWRlbnRpdHkoNiwgNik7CisgICAgc3dhcF91c2luZ19ldmFsdWF0b3IobWF0MSwgbWF0Mik7CisgICAgbWF0MXJlZi5zd2FwKG1hdDJyZWYpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0MSwgbWF0MXJlZik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLCBtYXQycmVmKTsKKworICAgIHN3YXBfdXNpbmdfZXZhbHVhdG9yKG1hdDEuYmxvY2soMCwgMCwgMywgMyksIG1hdDIuYmxvY2soMywgMywgMywgMykpOworICAgIG1hdDFyZWYuYmxvY2soMCwgMCwgMywgMykuc3dhcChtYXQycmVmLmJsb2NrKDMsIDMsIDMsIDMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDEsIG1hdDFyZWYpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0MiwgbWF0MnJlZik7CisKKyAgICBzd2FwX3VzaW5nX2V2YWx1YXRvcihtYXQxLnJvdygyKSwgbWF0Mi5jb2woMykudHJhbnNwb3NlKCkpOworICAgIG1hdDEucm93KDIpLnN3YXAobWF0Mi5jb2woMykudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0MSwgbWF0MXJlZik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLCBtYXQycmVmKTsKKyAgfQorCisgIHsKKyAgICAvLyB0ZXN0IGNvbXBvdW5kIGFzc2lnbm1lbnQKKyAgICBjb25zdCBNYXRyaXg0ZCBtYXRfY29uc3QgPSBNYXRyaXg0ZDo6UmFuZG9tKCk7IAorICAgIE1hdHJpeDRkIG1hdCwgbWF0X3JlZjsKKyAgICBtYXQgPSBtYXRfcmVmID0gTWF0cml4NGQ6OklkZW50aXR5KCk7CisgICAgYWRkX2Fzc2lnbl91c2luZ19ldmFsdWF0b3IobWF0LCBtYXRfY29uc3QpOworICAgIG1hdF9yZWYgKz0gbWF0X2NvbnN0OworICAgIFZFUklGWV9JU19BUFBST1gobWF0LCBtYXRfcmVmKTsKKworICAgIHN1YnRyYWN0X2Fzc2lnbl91c2luZ19ldmFsdWF0b3IobWF0LnJvdygxKSwgMiptYXQucm93KDIpKTsKKyAgICBtYXRfcmVmLnJvdygxKSAtPSAyKm1hdF9yZWYucm93KDIpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0LCBtYXRfcmVmKTsKKworICAgIGNvbnN0IEFycmF5WFhmIGFycl9jb25zdCA9IEFycmF5WFhmOjpSYW5kb20oNSwzKTsgCisgICAgQXJyYXlYWGYgYXJyLCBhcnJfcmVmOworICAgIGFyciA9IGFycl9yZWYgPSBBcnJheVhYZjo6Q29uc3RhbnQoNSwgMywgMC41KTsKKyAgICBtdWx0aXBseV9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGFyciwgYXJyX2NvbnN0KTsKKyAgICBhcnJfcmVmICo9IGFycl9jb25zdDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGFyciwgYXJyX3JlZik7CisKKyAgICBkaXZpZGVfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihhcnIucm93KDEpLCBhcnIucm93KDIpICsgMSk7CisgICAgYXJyX3JlZi5yb3coMSkgLz0gKGFycl9yZWYucm93KDIpICsgMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhcnIsIGFycl9yZWYpOworICB9CisgIAorICB7CisgICAgLy8gdGVzdCB0cmlhbmd1bGFyIHNoYXBlcworICAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNiksIEIoNiw2KSwgQyg2LDYpLCBEKDYsNik7CisgICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihCLCBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBNYXRyaXhYZChBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKSk7CisgICAgCisgICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihCLCBBLnRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKSwgTWF0cml4WGQoQS50cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkpKTsKKyAgICAKKyAgICBBLnNldFJhbmRvbSgpO0Iuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIEEudHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpLCBNYXRyaXhYZChBLnRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSkpOworICAgIAorICAgIEEuc2V0UmFuZG9tKCk7Qi5zZXRSYW5kb20oKTsKKyAgICBDID0gQjsgQy50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IEE7CisgICAgY29weV91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgQSk7CisgICAgVkVSSUZZKEIuaXNBcHByb3goQykgJiYgImNvcHlfdXNpbmdfZXZhbHVhdG9yKEIudHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIEEpIik7CisgICAgCisgICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOworICAgIEMgPSBCOyBDLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gQS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihCLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKyAgICBWRVJJRlkoQi5pc0FwcHJveChDKSAmJiAiY29weV91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgQS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSkiKTsKKyAgICAKKyAgICAKKyAgICBBLnNldFJhbmRvbSgpO0Iuc2V0UmFuZG9tKCk7CisgICAgQyA9IEI7IEMudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgPSBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRyYW5zcG9zZSgpOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKEIudHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudHJhbnNwb3NlKCkpOworICAgIFZFUklGWShCLmlzQXBwcm94KEMpICYmICJjb3B5X3VzaW5nX2V2YWx1YXRvcihCLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRyYW5zcG9zZSgpKSIpOworICAgIAorICAgIAorICAgIEEuc2V0UmFuZG9tKCk7Qi5zZXRSYW5kb20oKTsgQyA9IEI7IEQgPSBBOworICAgIEMudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc3dhcChELnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKyAgICBzd2FwX3VzaW5nX2V2YWx1YXRvcihCLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKyAgICBWRVJJRlkoQi5pc0FwcHJveChDKSAmJiAic3dhcF91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkiKTsKKyAgICAKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgcHJvZChBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLEEpLCBNYXRyaXhYZChBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKkEpKTsKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgcHJvZChBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSxBKSwgTWF0cml4WGQoQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkqQSkpOworICB9CisKKyAgeworICAgIC8vIHRlc3QgZGlhZ29uYWwgc2hhcGVzCisgICAgVmVjdG9yWGQgZCA9IFZlY3RvclhkOjpSYW5kb20oNik7CisgICAgTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiw2KSwgQig2LDYpOworICAgIEEuc2V0UmFuZG9tKCk7Qi5zZXRSYW5kb20oKTsKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgbGF6eXByb2QoZC5hc0RpYWdvbmFsKCksQSksIE1hdHJpeFhkKGQuYXNEaWFnb25hbCgpKkEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgbGF6eXByb2QoQSxkLmFzRGlhZ29uYWwoKSksIE1hdHJpeFhkKEEqZC5hc0RpYWdvbmFsKCkpKTsKKyAgfQorCisgIHsKKyAgICAvLyB0ZXN0IENvZWZmUmVhZENvc3QKKyAgICBNYXRyaXg0ZCBhLCBiOworICAgIFZFUklGWV9JU19FUVVBTCggZ2V0X2Nvc3QoYSksIDEgKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGErYiksIDMpOworICAgIFZFUklGWV9JU19FUVVBTCggZ2V0X2Nvc3QoMiphK2IpLCA0KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEqYiksIDEpOworICAgIFZFUklGWV9JU19FUVVBTCggZ2V0X2Nvc3QoYS5sYXp5UHJvZHVjdChiKSksIDE1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEqKGEqYikpLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEubGF6eVByb2R1Y3QoYSpiKSksIDE1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEqKGErYikpLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEubGF6eVByb2R1Y3QoYStiKSksIDE1KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9leGNlcHRpb25zLmNwcCBiL3Rlc3QvZXhjZXB0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzZmI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXhjZXB0aW9ucy5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisvLyBWYXJpb3VzIHNhbml0eSB0ZXN0cyB3aXRoIGV4Y2VwdGlvbnM6CisvLyAgLSBubyBtZW1vcnkgbGVhayB3aGVuIGEgY3VzdG9tIHNjYWxhciB0eXBlIHRyb3cgYW4gZXhjZXB0aW9ucworLy8gIC0gdG9kbzogY29tcGxldGUgdGhlIGxpc3Qgb2YgdGVzdHMhCisKKyNkZWZpbmUgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVCAxMDAwMDAwMDAKKworI2luY2x1ZGUgIm1haW4uaCIKKworc3RydWN0IG15X2V4Y2VwdGlvbgoreworICBteV9leGNlcHRpb24oKSB7fQorICB+bXlfZXhjZXB0aW9uKCkge30KK307CisgICAgCitjbGFzcyBTY2FsYXJXaXRoRXhjZXB0aW9ucworeworICBwdWJsaWM6CisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMoKSB7IGluaXQoKTsgfQorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zKGNvbnN0IGZsb2F0JiBfdikgeyBpbml0KCk7ICp2ID0gX3Y7IH0KKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyhjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3RoZXIpIHsgaW5pdCgpOyAqdiA9ICoob3RoZXIudik7IH0KKyAgICB+U2NhbGFyV2l0aEV4Y2VwdGlvbnMoKSB7CisgICAgICBkZWxldGUgdjsKKyAgICAgIGluc3RhbmNlcy0tOworICAgIH0KKworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgIHYgPSBuZXcgZmxvYXQ7CisgICAgICBpbnN0YW5jZXMrKzsKKyAgICB9CisKKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyBvcGVyYXRvcisoY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIGNvdW50ZG93bi0tOworICAgICAgaWYoY291bnRkb3duPD0wKQorICAgICAgICB0aHJvdyBteV9leGNlcHRpb24oKTsKKyAgICAgIHJldHVybiBTY2FsYXJXaXRoRXhjZXB0aW9ucygqdisqb3RoZXIudik7CisgICAgfQorICAgIAorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zIG9wZXJhdG9yLShjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gU2NhbGFyV2l0aEV4Y2VwdGlvbnMoKnYtKm90aGVyLnYpOyB9CisgICAgCisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMgb3BlcmF0b3IqKGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBTY2FsYXJXaXRoRXhjZXB0aW9ucygoKnYpKigqb3RoZXIudikpOyB9CisgICAgCisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG9wZXJhdG9yKz0oY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKQorICAgIHsgKnYrPSpvdGhlci52OyByZXR1cm4gKnRoaXM7IH0KKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3BlcmF0b3ItPShjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3RoZXIpCisgICAgeyAqdi09Km90aGVyLnY7IHJldHVybiAqdGhpczsgfQorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKQorICAgIHsgKnYgPSAqKG90aGVyLnYpOyByZXR1cm4gKnRoaXM7IH0KKyAgCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiAqdj09Km90aGVyLnY7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuICp2IT0qb3RoZXIudjsgfQorICAgIAorICAgIGZsb2F0KiB2OworICAgIHN0YXRpYyBpbnQgaW5zdGFuY2VzOworICAgIHN0YXRpYyBpbnQgY291bnRkb3duOworfTsKKworU2NhbGFyV2l0aEV4Y2VwdGlvbnMgcmVhbChjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyAmeCkgeyByZXR1cm4geDsgfQorU2NhbGFyV2l0aEV4Y2VwdGlvbnMgaW1hZyhjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyAmICkgeyByZXR1cm4gMDsgfQorU2NhbGFyV2l0aEV4Y2VwdGlvbnMgY29uaihjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyAmeCkgeyByZXR1cm4geDsgfQorCitpbnQgU2NhbGFyV2l0aEV4Y2VwdGlvbnM6Omluc3RhbmNlcyA9IDA7CitpbnQgU2NhbGFyV2l0aEV4Y2VwdGlvbnM6OmNvdW50ZG93biA9IDA7CisKKworI2RlZmluZSBDSEVDS19NRU1MRUFLKE9QKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zOjpjb3VudGRvd24gPSAxMDA7ICAgICAgICAgICAgICAgICAgXAorICAgIGludCBiZWZvcmUgPSBTY2FsYXJXaXRoRXhjZXB0aW9uczo6aW5zdGFuY2VzOyAgICAgICAgICAgXAorICAgIGJvb2wgZXhjZXB0aW9uX3Rocm93biA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHJ5IHsgT1A7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2F0Y2ggKG15X2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleGNlcHRpb25fdGhyb3duID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWRVJJRlkoU2NhbGFyV2l0aEV4Y2VwdGlvbnM6Omluc3RhbmNlcz09YmVmb3JlICYmICJtZW1vcnkgbGVhayBkZXRlY3RlZCBpbiAiICYmIEVJR0VOX01BS0VTVFJJTkcoT1ApKTsgXAorICAgIH0gXAorICAgIFZFUklGWShleGNlcHRpb25fdGhyb3duICYmICIgbm8gZXhjZXB0aW9uIHRocm93biBpbiAiICYmIEVJR0VOX01BS0VTVFJJTkcoT1ApKTsgXAorICB9CisKK3ZvaWQgbWVtb3J5bGVhaygpCit7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXJXaXRoRXhjZXB0aW9ucyxEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXJXaXRoRXhjZXB0aW9ucyxEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7CisgIAorICB7CisgICAgaW50IG4gPSA1MDsKKyAgICBWZWN0b3JUeXBlIHYwKG4pLCB2MShuKTsKKyAgICBNYXRyaXhUeXBlIG0wKG4sbiksIG0xKG4sbiksIG0yKG4sbik7CisgICAgdjAuc2V0T25lcygpOyB2MS5zZXRPbmVzKCk7CisgICAgbTAuc2V0T25lcygpOyBtMS5zZXRPbmVzKCk7IG0yLnNldE9uZXMoKTsKKyAgICBDSEVDS19NRU1MRUFLKHYwID0gbTAgKiBtMSAqIHYxKTsKKyAgICBDSEVDS19NRU1MRUFLKG0yID0gbTAgKiBtMSAqIG0yKTsKKyAgICBDSEVDS19NRU1MRUFLKCh2MCt2MSkuZG90KHYwK3YxKSk7CisgIH0KKyAgVkVSSUZZKFNjYWxhcldpdGhFeGNlcHRpb25zOjppbnN0YW5jZXM9PTAgJiYgImdsb2JhbCBtZW1vcnkgbGVhayBkZXRlY3RlZCBpbiAiICYmIEVJR0VOX01BS0VTVFJJTkcoT1ApKTsgXAorfQorCit2b2lkIHRlc3RfZXhjZXB0aW9ucygpCit7CisgIENBTExfU1VCVEVTVCggbWVtb3J5bGVhaygpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Zhc3RtYXRoLmNwcCBiL3Rlc3QvZmFzdG1hdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWRiMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Zhc3RtYXRoLmNwcApAQCAtMCwwICsxLDk5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3ZvaWQgY2hlY2soYm9vbCBiLCBib29sIHJlZikKK3sKKyAgc3RkOjpjb3V0IDw8IGI7CisgIGlmKGI9PXJlZikKKyAgICBzdGQ6OmNvdXQgPDwgIiBPSyAgIjsKKyAgZWxzZQorICAgIHN0ZDo6Y291dCA8PCAiIEJBRCAiOworfQorCisjaWYgRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX0NPTVBfTVNWQyA8IDE4MDAKK25hbWVzcGFjZSBzdGQgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIChpc2Zpbml0ZSkoVCB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgKGlzbmFuKShUIHgpIHsgcmV0dXJuIF9pc25hbih4KTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIChpc2luZikoVCB4KSB7IHJldHVybiBfZnBjbGFzcyh4KT09X0ZQQ0xBU1NfTklORiB8fCBfZnBjbGFzcyh4KT09X0ZQQ0xBU1NfUElORjsgfQorfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGNoZWNrX2luZl9uYW4oYm9vbCBkcnlydW4pIHsKKyAgTWF0cml4PFQsRHluYW1pYywxPiBtKDEwKTsKKyAgbS5zZXRSYW5kb20oKTsKKyAgbSgzKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OnF1aWV0X05hTigpOworCisgIGlmKGRyeXJ1bikKKyAgeworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc2Zpbml0ZSgiIDw8IG0oMykgPDwgIikgPSAiOyBjaGVjaygoc3RkOjppc2Zpbml0ZSkobSgzKSksZmFsc2UpOyBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzZmluaXRlID0gIjsgY2hlY2soKG51bWV4dDo6aXNmaW5pdGUpKG0oMykpLCBmYWxzZSk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc2luZigiIDw8IG0oMykgPDwgIikgICAgPSAiOyBjaGVjaygoc3RkOjppc2luZikobSgzKSksZmFsc2UpOyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzaW5mICAgID0gIjsgY2hlY2soKG51bWV4dDo6aXNpbmYpKG0oMykpLCBmYWxzZSk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc25hbigiIDw8IG0oMykgPDwgIikgICAgPSAiOyBjaGVjaygoc3RkOjppc25hbikobSgzKSksdHJ1ZSk7ICAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzbmFuICAgID0gIjsgY2hlY2soKG51bWV4dDo6aXNuYW4pKG0oMykpLCB0cnVlKTsgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJhbGxGaW5pdGU6ICI7IGNoZWNrKG0uYWxsRmluaXRlKCksIDApOyBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImhhc05hTjogICAgIjsgY2hlY2sobS5oYXNOYU4oKSwgMSk7ICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICB9CisgIGVsc2UKKyAgeworICAgIFZFUklGWSggIShudW1leHQ6OmlzZmluaXRlKShtKDMpKSApOworICAgIFZFUklGWSggIShudW1leHQ6OmlzaW5mKShtKDMpKSApOworICAgIFZFUklGWSggIChudW1leHQ6OmlzbmFuKShtKDMpKSApOworICAgIFZFUklGWSggIW0uYWxsRmluaXRlKCkgKTsKKyAgICBWRVJJRlkoICBtLmhhc05hTigpICk7CisgIH0KKyAgVCBoaWRkZW5femVybyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4pKCkqKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbikoKTsKKyAgbSg0KSAvPSBoaWRkZW5femVybzsKKyAgaWYoZHJ5cnVuKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzZmluaXRlKCIgPDwgbSg0KSA8PCAiKSA9ICI7IGNoZWNrKChzdGQ6OmlzZmluaXRlKShtKDQpKSxmYWxzZSk7IHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNmaW5pdGUgPSAiOyBjaGVjaygobnVtZXh0Ojppc2Zpbml0ZSkobSg0KSksIGZhbHNlKTsgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzaW5mKCIgPDwgbSg0KSA8PCAiKSAgICA9ICI7IGNoZWNrKChzdGQ6OmlzaW5mKShtKDQpKSx0cnVlKTsgICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNpbmYgICAgPSAiOyBjaGVjaygobnVtZXh0Ojppc2luZikobSg0KSksIHRydWUpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNuYW4oIiA8PCBtKDQpIDw8ICIpICAgID0gIjsgY2hlY2soKHN0ZDo6aXNuYW4pKG0oNCkpLGZhbHNlKTsgICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc25hbiAgICA9ICI7IGNoZWNrKChudW1leHQ6OmlzbmFuKShtKDQpKSwgZmFsc2UpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImFsbEZpbml0ZTogIjsgY2hlY2sobS5hbGxGaW5pdGUoKSwgMCk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiaGFzTmFOOiAgICAiOyBjaGVjayhtLmhhc05hTigpLCAxKTsgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0KKyAgZWxzZQorICB7CisgICAgVkVSSUZZKCAhKG51bWV4dDo6aXNmaW5pdGUpKG0oNCkpICk7CisgICAgVkVSSUZZKCAgKG51bWV4dDo6aXNpbmYpKG0oNCkpICk7CisgICAgVkVSSUZZKCAhKG51bWV4dDo6aXNuYW4pKG0oNCkpICk7CisgICAgVkVSSUZZKCAhbS5hbGxGaW5pdGUoKSApOworICAgIFZFUklGWSggIG0uaGFzTmFOKCkgKTsKKyAgfQorICBtKDMpID0gMDsKKyAgaWYoZHJ5cnVuKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzZmluaXRlKCIgPDwgbSgzKSA8PCAiKSA9ICI7IGNoZWNrKChzdGQ6OmlzZmluaXRlKShtKDMpKSx0cnVlKTsgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc2Zpbml0ZSA9ICI7IGNoZWNrKChudW1leHQ6OmlzZmluaXRlKShtKDMpKSwgdHJ1ZSk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc2luZigiIDw8IG0oMykgPDwgIikgICAgPSAiOyBjaGVjaygoc3RkOjppc2luZikobSgzKSksZmFsc2UpOyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzaW5mICAgID0gIjsgY2hlY2soKG51bWV4dDo6aXNpbmYpKG0oMykpLCBmYWxzZSk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc25hbigiIDw8IG0oMykgPDwgIikgICAgPSAiOyBjaGVjaygoc3RkOjppc25hbikobSgzKSksZmFsc2UpOyAgICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc25hbiAgICA9ICI7IGNoZWNrKChudW1leHQ6OmlzbmFuKShtKDMpKSwgZmFsc2UpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImFsbEZpbml0ZTogIjsgY2hlY2sobS5hbGxGaW5pdGUoKSwgMCk7IHN0ZDo6Y291dCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiaGFzTmFOOiAgICAiOyBjaGVjayhtLmhhc05hTigpLCAwKTsgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBWRVJJRlkoICAobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSkgKTsKKyAgICBWRVJJRlkoICEobnVtZXh0Ojppc2luZikobSgzKSkgKTsKKyAgICBWRVJJRlkoICEobnVtZXh0Ojppc25hbikobSgzKSkgKTsKKyAgICBWRVJJRlkoICFtLmFsbEZpbml0ZSgpICk7CisgICAgVkVSSUZZKCAhbS5oYXNOYU4oKSApOworICB9Cit9CisKK3ZvaWQgdGVzdF9mYXN0bWF0aCgpIHsKKyAgc3RkOjpjb3V0IDw8ICIqKiogZmxvYXQgKioqIFxuXG4iOyBjaGVja19pbmZfbmFuPGZsb2F0Pih0cnVlKTsKKyAgc3RkOjpjb3V0IDw8ICIqKiogZG91YmxlICoqKlxuXG4iOyBjaGVja19pbmZfbmFuPGRvdWJsZT4odHJ1ZSk7CisgIHN0ZDo6Y291dCA8PCAiKioqIGxvbmcgZG91YmxlICoqKiBcblxuIjsgY2hlY2tfaW5mX25hbjxsb25nIGRvdWJsZT4odHJ1ZSk7CisKKyAgY2hlY2tfaW5mX25hbjxmbG9hdD4oZmFsc2UpOworICBjaGVja19pbmZfbmFuPGRvdWJsZT4oZmFsc2UpOworICBjaGVja19pbmZfbmFuPGxvbmcgZG91YmxlPihmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2ZpcnN0X2FsaWduZWQuY3BwIGIvdGVzdC9maXJzdF9hbGlnbmVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJkNGJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9maXJzdF9hbGlnbmVkLmNwcApAQCAtMCwwICsxLDUxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihTY2FsYXIgKmFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgY29uc3QgaW50IHBhY2tldF9zaXplID0gc2l6ZW9mKFNjYWxhcikgKiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICBWRVJJRlkoKChzaXplX3QoYXJyYXkpICsgc2l6ZW9mKFNjYWxhcikgKiBpbnRlcm5hbDo6Zmlyc3RfZGVmYXVsdF9hbGlnbmVkKGFycmF5LCBzaXplKSkgJSBwYWNrZXRfc2l6ZSkgPT0gMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQoreworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYXJyYXkpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc2l6ZSk7CisgIFZFUklGWShpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplID09IDEgfHwgaW50ZXJuYWw6OmZpcnN0X2RlZmF1bHRfYWxpZ25lZChhcnJheSwgc2l6ZSkgPT0gc2l6ZSk7Cit9CisKK3N0cnVjdCBzb21lX25vbl92ZWN0b3JpemFibGVfdHlwZSB7IGZsb2F0IHg7IH07CisKK3ZvaWQgdGVzdF9maXJzdF9hbGlnbmVkKCkKK3sKKyAgRUlHRU5fQUxJR04xNiBmbG9hdCBhcnJheV9mbG9hdFsxMDBdOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0LCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrMSwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzIsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCszLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrNCwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzUsIDUwKTsKKyAgCisgIEVJR0VOX0FMSUdOMTYgZG91YmxlIGFycmF5X2RvdWJsZVsxMDBdOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZSwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZSsxLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlKzIsIDUwKTsKKyAgCisgIGRvdWJsZSAqYXJyYXlfZG91YmxlX3BsdXNfNF9ieXRlcyA9IChkb3VibGUqKShpbnRlcm5hbDo6VUludFB0cihhcnJheV9kb3VibGUpKzQpOworICB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlX3BsdXNfNF9ieXRlcywgNTApOworICB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlX3BsdXNfNF9ieXRlcysxLCA1MCk7CisgIAorICBzb21lX25vbl92ZWN0b3JpemFibGVfdHlwZSBhcnJheV9ub252ZWNbMTAwXTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9ub252ZWMsIDEwMCk7CisgIHRlc3Rfbm9uZV9hbGlnbmVkX2hlbHBlcihhcnJheV9ub252ZWMsIDEwMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19hbGlnbmVkYm94LmNwcCBiL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzM5YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb19hbGlnbmVkYm94LmNwcApAQCAtMCwwICsxLDE4OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKKyNpbmNsdWRlPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fRE9OVF9JTkxJTkUKK3ZvaWQga2lsbF9leHRyYV9wcmVjaXNpb24oVCYgeCkgeyBlaWdlbl9hc3NlcnQoKHZvaWQqKSgmeCkgIT0gKHZvaWQqKTApOyB9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgQm94VHlwZT4gdm9pZCBhbGlnbmVkYm94KGNvbnN0IEJveFR5cGUmIF9ib3gpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgQWxpZ25lZEJveC5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgQm94VHlwZTo6SW5kZXggSW5kZXg7ICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBCb3hUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgY29uc3QgSW5kZXggZGltID0gX2JveC5kaW0oKTsKKworICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgd2hpbGUoIHAxID09IHAwICl7CisgICAgICBwMSA9ICBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsgfQorICBSZWFsU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigwLDEpOworCisgIEJveFR5cGUgYjAoZGltKTsKKyAgQm94VHlwZSBiMShWZWN0b3JUeXBlOjpSYW5kb20oZGltKSxWZWN0b3JUeXBlOjpSYW5kb20oZGltKSk7CisgIEJveFR5cGUgYjI7CisgIAorICBraWxsX2V4dHJhX3ByZWNpc2lvbihiMSk7CisgIGtpbGxfZXh0cmFfcHJlY2lzaW9uKHAwKTsKKyAga2lsbF9leHRyYV9wcmVjaXNpb24ocDEpOworCisgIGIwLmV4dGVuZChwMCk7CisgIGIwLmV4dGVuZChwMSk7CisgIFZFUklGWShiMC5jb250YWlucyhwMCpzMSsoU2NhbGFyKDEpLXMxKSpwMSkpOworICBWRVJJRlkoYjAuY29udGFpbnMoYjAuY2VudGVyKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChiMC5jZW50ZXIoKSwocDArcDEpL1NjYWxhcigyKSk7CisKKyAgKGIyID0gYjApLmV4dGVuZChiMSk7CisgIFZFUklGWShiMi5jb250YWlucyhiMCkpOworICBWRVJJRlkoYjIuY29udGFpbnMoYjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChiMi5jbGFtcChiMCksIGIwKTsKKworICAvLyBpbnRlcnNlY3Rpb24KKyAgQm94VHlwZSBib3gxKFZlY3RvclR5cGU6OlJhbmRvbShkaW0pKTsKKyAgYm94MS5leHRlbmQoVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSkpOworICBCb3hUeXBlIGJveDIoVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSkpOworICBib3gyLmV4dGVuZChWZWN0b3JUeXBlOjpSYW5kb20oZGltKSk7CisKKyAgVkVSSUZZKGJveDEuaW50ZXJzZWN0cyhib3gyKSA9PSAhYm94MS5pbnRlcnNlY3Rpb24oYm94MikuaXNFbXB0eSgpKTsgCisKKyAgLy8gYWxpZ25tZW50IC0tIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBtZW1vcnkgYWxpZ25tZW50IGFzc2VydGlvbgorICBCb3hUeXBlICpicDAgPSBuZXcgQm94VHlwZShkaW0pOworICBCb3hUeXBlICpicDEgPSBuZXcgQm94VHlwZShkaW0pOworICBicDAtPmV4dGVuZCgqYnAxKTsKKyAgZGVsZXRlIGJwMDsKKyAgZGVsZXRlIGJwMTsKKworICAvLyBzYW1wbGluZworICBmb3IoIGludCBpPTA7IGk8MTA7ICsraSApCisgIHsKKyAgICAgIFZlY3RvclR5cGUgciA9IGIwLnNhbXBsZSgpOworICAgICAgVkVSSUZZKGIwLmNvbnRhaW5zKHIpKTsKKyAgfQorCit9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCb3hUeXBlPgordm9pZCBhbGlnbmVkYm94Q2FzdFRlc3RzKGNvbnN0IEJveFR5cGUmIF9ib3gpCit7CisgIC8vIGNhc3RpbmcgIAorICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgY29uc3QgSW5kZXggZGltID0gX2JveC5kaW0oKTsKKworICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKworICBCb3hUeXBlIGIwKGRpbSk7CisKKyAgYjAuZXh0ZW5kKHAwKTsKKyAgYjAuZXh0ZW5kKHAxKTsKKworICBjb25zdCBpbnQgRGltID0gQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOworICBBbGlnbmVkQm94PE90aGVyU2NhbGFyLERpbT4gaHAxZiA9IGIwLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxiMCk7CisgIEFsaWduZWRCb3g8U2NhbGFyLERpbT4gaHAxZCA9IGIwLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYjApOworfQorCisKK3ZvaWQgc3BlY2lmaWNUZXN0MSgpCit7CisgICAgVmVjdG9yMmYgbTsgbSA8PCAtMS4wZiwgLTIuMGY7CisgICAgVmVjdG9yMmYgTTsgTSA8PCAgMS4wZiwgIDUuMGY7CisKKyAgICB0eXBlZGVmIEFsaWduZWRCb3gyZiAgQm94VHlwZTsKKyAgICBCb3hUeXBlIGJveCggbSwgTSApOworCisgICAgVmVjdG9yMmYgc2lkZXMgPSBNLW07CisgICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlcywgYm94LnNpemVzKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKVsxXSApOworICAgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpLm1heENvZWZmKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzBdLCBib3guc2l6ZXMoKS5taW5Db2VmZigpICk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAxNC4wZiwgYm94LnZvbHVtZSgpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggNTMuMGYsIGJveC5kaWFnb25hbCgpLnNxdWFyZWROb3JtKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBzdGQ6OnNxcnQoIDUzLjBmICksIGJveC5kaWFnb25hbCgpLm5vcm0oKSApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWCggbSwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tTGVmdCApICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggTSwgYm94LmNvcm5lciggQm94VHlwZTo6VG9wUmlnaHQgKSApOworICAgIFZlY3RvcjJmIGJvdHRvbVJpZ2h0OyBib3R0b21SaWdodCA8PCBNWzBdLCBtWzFdOworICAgIFZlY3RvcjJmIHRvcExlZnQ7IHRvcExlZnQgPDwgbVswXSwgTVsxXTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBib3R0b21SaWdodCwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tUmlnaHQgKSApOworICAgIFZFUklGWV9JU19BUFBST1goIHRvcExlZnQsIGJveC5jb3JuZXIoIEJveFR5cGU6OlRvcExlZnQgKSApOworfQorCisKK3ZvaWQgc3BlY2lmaWNUZXN0MigpCit7CisgICAgVmVjdG9yM2kgbTsgbSA8PCAtMSwgLTIsIDA7CisgICAgVmVjdG9yM2kgTTsgTSA8PCAgMSwgIDUsIDM7CisKKyAgICB0eXBlZGVmIEFsaWduZWRCb3gzaSAgQm94VHlwZTsKKyAgICBCb3hUeXBlIGJveCggbSwgTSApOworCisgICAgVmVjdG9yM2kgc2lkZXMgPSBNLW07CisgICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlcywgYm94LnNpemVzKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKVsxXSApOworICAgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpLm1heENvZWZmKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzBdLCBib3guc2l6ZXMoKS5taW5Db2VmZigpICk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKCA0MiwgYm94LnZvbHVtZSgpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggNjIsIGJveC5kaWFnb25hbCgpLnNxdWFyZWROb3JtKCkgKTsKKworICAgIFZFUklGWV9JU19BUFBST1goIG0sIGJveC5jb3JuZXIoIEJveFR5cGU6OkJvdHRvbUxlZnRGbG9vciApICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggTSwgYm94LmNvcm5lciggQm94VHlwZTo6VG9wUmlnaHRDZWlsICkgKTsKKyAgICBWZWN0b3IzaSBib3R0b21SaWdodEZsb29yOyBib3R0b21SaWdodEZsb29yIDw8IE1bMF0sIG1bMV0sIG1bMl07CisgICAgVmVjdG9yM2kgdG9wTGVmdEZsb29yOyB0b3BMZWZ0Rmxvb3IgPDwgbVswXSwgTVsxXSwgbVsyXTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBib3R0b21SaWdodEZsb29yLCBib3guY29ybmVyKCBCb3hUeXBlOjpCb3R0b21SaWdodEZsb29yICkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCB0b3BMZWZ0Rmxvb3IsIGJveC5jb3JuZXIoIEJveFR5cGU6OlRvcExlZnRGbG9vciApICk7Cit9CisKKwordm9pZCB0ZXN0X2dlb19hbGlnbmVkYm94KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspCisgIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYWxpZ25lZGJveChBbGlnbmVkQm94MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYWxpZ25lZGJveENhc3RUZXN0cyhBbGlnbmVkQm94MmYoKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8zKCBhbGlnbmVkYm94KEFsaWduZWRCb3gzZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBhbGlnbmVkYm94Q2FzdFRlc3RzKEFsaWduZWRCb3gzZigpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzUoIGFsaWduZWRib3goQWxpZ25lZEJveDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDRkKCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNyggYWxpZ25lZGJveChBbGlnbmVkQm94MWQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggYWxpZ25lZGJveENhc3RUZXN0cyhBbGlnbmVkQm94MWQoKSkgKTsKKworICAgIENBTExfU1VCVEVTVF85KCBhbGlnbmVkYm94KEFsaWduZWRCb3gxaSgpKSApOworICAgIENBTExfU1VCVEVTVF8xMCggYWxpZ25lZGJveChBbGlnbmVkQm94MmkoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoIGFsaWduZWRib3goQWxpZ25lZEJveDNpKCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMTQoIGFsaWduZWRib3goQWxpZ25lZEJveDxkb3VibGUsRHluYW1pYz4oNCkpICk7CisgIH0KKyAgQ0FMTF9TVUJURVNUXzEyKCBzcGVjaWZpY1Rlc3QxKCkgKTsKKyAgQ0FMTF9TVUJURVNUXzEzKCBzcGVjaWZpY1Rlc3QyKCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX2V1bGVyYW5nbGVzLmNwcCBiL3Rlc3QvZ2VvX2V1bGVyYW5nbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJlYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nZW9fZXVsZXJhbmdsZXMuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB2ZXJpZnlfZXVsZXIoY29uc3QgTWF0cml4PFNjYWxhciwzLDE+JiBlYSwgaW50IGksIGludCBqLCBpbnQgaykKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworICB1c2luZyBzdGQ6OmFiczsKKyAgTWF0cml4MyBtKEFuZ2xlQXhpc3goZWFbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYVsxXSwgVmVjdG9yMzo6VW5pdChqKSkgKiBBbmdsZUF4aXN4KGVhWzJdLCBWZWN0b3IzOjpVbml0KGspKSk7CisgIFZlY3RvcjMgZWFiaXMgPSBtLmV1bGVyQW5nbGVzKGksIGosIGspOworICBNYXRyaXgzIG1iaXMoQW5nbGVBeGlzeChlYWJpc1swXSwgVmVjdG9yMzo6VW5pdChpKSkgKiBBbmdsZUF4aXN4KGVhYmlzWzFdLCBWZWN0b3IzOjpVbml0KGopKSAqIEFuZ2xlQXhpc3goZWFiaXNbMl0sIFZlY3RvcjM6OlVuaXQoaykpKTsgCisgIFZFUklGWV9JU19BUFBST1gobSwgIG1iaXMpOyAKKyAgLyogSWYgST09SywgYW5kIGVhWzFdPT0wLCB0aGVuIHRoZXJlIG5vIHVuaXF1ZSBzb2x1dGlvbi4gKi8gCisgIC8qIFRoZSByZW1hcmsgYXBwbHkgaW4gdGhlIGNhc2Ugd2hlcmUgSSE9SywgYW5kIHxlYVsxXXwgaXMgY2xvc2UgdG8gcGkvMi4gKi8gCisgIGlmKCAoaSE9ayB8fCBlYVsxXSE9MCkgJiYgKGk9PWsgfHwgIWludGVybmFsOjppc0FwcHJveChhYnMoZWFbMV0pLFNjYWxhcihFSUdFTl9QSS8yKSx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKSApIAorICAgIFZFUklGWSgoZWEtZWFiaXMpLm5vcm0oKSA8PSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpOworICAKKyAgLy8gYXBwcm94X29yX2xlc3NfdGhhbiBkb2VzIG5vdCB3b3JrIGZvciAwCisgIFZFUklGWSgwIDwgZWFiaXNbMF0gfHwgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihlYWJpc1swXSwgU2NhbGFyKDEpKSk7CisgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKGVhYmlzWzBdLCBTY2FsYXIoRUlHRU5fUEkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oLVNjYWxhcihFSUdFTl9QSSksIGVhYmlzWzFdKTsKKyAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oZWFiaXNbMV0sIFNjYWxhcihFSUdFTl9QSSkpOworICBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTigtU2NhbGFyKEVJR0VOX1BJKSwgZWFiaXNbMl0pOworICBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTihlYWJpc1syXSwgU2NhbGFyKEVJR0VOX1BJKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBjaGVja19hbGxfdmFyKGNvbnN0IE1hdHJpeDxTY2FsYXIsMywxPiYgZWEpCit7CisgIHZlcmlmeV9ldWxlcihlYSwgMCwxLDIpOworICB2ZXJpZnlfZXVsZXIoZWEsIDAsMSwwKTsKKyAgdmVyaWZ5X2V1bGVyKGVhLCAwLDIsMSk7CisgIHZlcmlmeV9ldWxlcihlYSwgMCwyLDApOworCisgIHZlcmlmeV9ldWxlcihlYSwgMSwyLDApOworICB2ZXJpZnlfZXVsZXIoZWEsIDEsMiwxKTsKKyAgdmVyaWZ5X2V1bGVyKGVhLCAxLDAsMik7CisgIHZlcmlmeV9ldWxlcihlYSwgMSwwLDEpOworCisgIHZlcmlmeV9ldWxlcihlYSwgMiwwLDEpOworICB2ZXJpZnlfZXVsZXIoZWEsIDIsMCwyKTsKKyAgdmVyaWZ5X2V1bGVyKGVhLCAyLDEsMCk7CisgIHZlcmlmeV9ldWxlcihlYSwgMiwxLDIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZXVsZXJhbmdsZXMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwzLDE+IEFycmF5MzsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzeDsKKworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CisgIFF1YXRlcm5pb254IHExOworICBxMSA9IEFuZ2xlQXhpc3goYSwgVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpKTsKKyAgTWF0cml4MyBtOworICBtID0gcTE7CisgIAorICBWZWN0b3IzIGVhID0gbS5ldWxlckFuZ2xlcygwLDEsMik7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICBlYSA9IG0uZXVsZXJBbmdsZXMoMCwxLDApOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgCisgIC8vIENoZWNrIHdpdGggcHVyZWx5IHJhbmRvbSBRdWF0ZXJuaW9uOgorICBxMS5jb2VmZnMoKSA9IFF1YXRlcm5pb254OjpDb2VmZmljaWVudHM6OlJhbmRvbSgpLm5vcm1hbGl6ZWQoKTsKKyAgbSA9IHExOworICBlYSA9IG0uZXVsZXJBbmdsZXMoMCwxLDIpOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgZWEgPSBtLmV1bGVyQW5nbGVzKDAsMSwwKTsKKyAgY2hlY2tfYWxsX3ZhcihlYSk7CisgIAorICAvLyBDaGVjayB3aXRoIHJhbmRvbSBhbmdsZXMgaW4gcmFuZ2UgWzA6cGldeFstcGk6cGldeFstcGk6cGldLgorICBlYSA9IChBcnJheTM6OlJhbmRvbSgpICsgQXJyYXkzKDEsMCwwKSkqU2NhbGFyKEVJR0VOX1BJKSpBcnJheTMoMC41LDEsMSk7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWFbMl0gPSBlYVswXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLFNjYWxhcihFSUdFTl9QSSkpOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgCisgIGVhWzBdID0gZWFbMV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCxTY2FsYXIoRUlHRU5fUEkpKTsKKyAgY2hlY2tfYWxsX3ZhcihlYSk7CisgIAorICBlYVsxXSA9IDA7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWEuaGVhZCgyKS5zZXRaZXJvKCk7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWEuc2V0WmVybygpOworICBjaGVja19hbGxfdmFyKGVhKTsKK30KKwordm9pZCB0ZXN0X2dlb19ldWxlcmFuZ2xlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGV1bGVyYW5nbGVzPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGV1bGVyYW5nbGVzPGRvdWJsZT4oKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19ob21vZ2VuZW91cy5jcHAgYi90ZXN0L2dlb19ob21vZ2VuZW91cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4N2M3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX2hvbW9nZW5lb3VzLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IFNpemU+IHZvaWQgaG9tb2dlbmVvdXModm9pZCkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBIb21vZ2VuZW91cy5oCisgICovCisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZT4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsMSwgQ29sTWFqb3I+IFZlY3RvclR5cGU7CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSxTaXplPiBITWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSwxPiBIVmVjdG9yVHlwZTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSxTaXplKzE+ICAgVDFNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSsxLFNpemUrMT4gVDJNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSsxLFNpemU+IFQzTWF0cml4VHlwZTsKKworICBWZWN0b3JUeXBlIHYwID0gVmVjdG9yVHlwZTo6UmFuZG9tKCksCisgICAgICAgICAgICAgb25lcyA9IFZlY3RvclR5cGU6Ok9uZXMoKTsKKworICBIVmVjdG9yVHlwZSBodjAgPSBIVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisKKyAgTWF0cml4VHlwZSBtMCA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworCisgIEhNYXRyaXhUeXBlIGhtMCA9IEhNYXRyaXhUeXBlOjpSYW5kb20oKTsKKworICBodjAgPDwgdjAsIDE7CisgIFZFUklGWV9JU19BUFBST1godjAuaG9tb2dlbmVvdXMoKSwgaHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MCwgaHYwLmhub3JtYWxpemVkKCkpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MC5ob21vZ2VuZW91cygpLnN1bSgpLCBodjAuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYwLmhvbW9nZW5lb3VzKCkubWluQ29lZmYoKSwgaHYwLm1pbkNvZWZmKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYwLmhvbW9nZW5lb3VzKCkubWF4Q29lZmYoKSwgaHYwLm1heENvZWZmKCkpOworCisgIGhtMCA8PCBtMCwgb25lcy50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMC5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgaG0wKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMCwgaG0wLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKKyAgaG0wLnJvdyhTaXplLTEpLnNldFJhbmRvbSgpOworICBmb3IoaW50IGo9MDsgajxTaXplOyArK2opCisgICAgbTAuY29sKGopID0gaG0wLmNvbChqKS5oZWFkKFNpemUpIC8gaG0wKFNpemUsaik7CisgIFZFUklGWV9JU19BUFBST1gobTAsIGhtMC5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisKKyAgVDFNYXRyaXhUeXBlIHQxID0gVDFNYXRyaXhUeXBlOjpSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MSAqICh2MC5ob21vZ2VuZW91cygpLmV2YWwoKSksIHQxICogdjAuaG9tb2dlbmVvdXMoKSk7CisgIFZFUklGWV9JU19BUFBST1godDEgKiAobTAuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSwgdDEgKiBtMC5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSk7CisKKyAgVDJNYXRyaXhUeXBlIHQyID0gVDJNYXRyaXhUeXBlOjpSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MiAqICh2MC5ob21vZ2VuZW91cygpLmV2YWwoKSksIHQyICogdjAuaG9tb2dlbmVvdXMoKSk7CisgIFZFUklGWV9JU19BUFBST1godDIgKiAobTAuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSwgdDIgKiBtMC5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSk7CisgIFZFUklGWV9JU19BUFBST1godDIgKiAodjAuaG9tb2dlbmVvdXMoKS5hc0RpYWdvbmFsKCkpLCB0MiAqIGh2MC5hc0RpYWdvbmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCh2MC5ob21vZ2VuZW91cygpLmFzRGlhZ29uYWwoKSkgKiB0MiwgaHYwLmFzRGlhZ29uYWwoKSAqIHQyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCh2MC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKS5ldmFsKCkpICogdDIsCisgICAgICAgICAgICAgICAgICAgIHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpICogdDIpOworICBWRVJJRllfSVNfQVBQUk9YKChtMC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKS5ldmFsKCkpICogdDIsCisgICAgICAgICAgICAgICAgICAgIG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpICogdDIpOworCisgIFQzTWF0cml4VHlwZSB0MyA9IFQzTWF0cml4VHlwZTo6UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1goKHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MywKKyAgICAgICAgICAgICAgICAgICAgdjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Myk7CisgIFZFUklGWV9JU19BUFBST1goKG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MywKKyAgICAgICAgICAgICAgICAgICAgbTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Myk7CisKKyAgLy8gdGVzdCBwcm9kdWN0IHdpdGggYSBUcmFuc2Zvcm0gb2JqZWN0CisgIFRyYW5zZm9ybTxTY2FsYXIsIFNpemUsIEFmZmluZT4gYWZmOworICBUcmFuc2Zvcm08U2NhbGFyLCBTaXplLCBBZmZpbmVDb21wYWN0PiBjYWZmOworICBUcmFuc2Zvcm08U2NhbGFyLCBTaXplLCBQcm9qZWN0aXZlPiBwcm9qOworICBNYXRyaXg8U2NhbGFyLCBTaXplLCBEeW5hbWljPiAgIHB0czsKKyAgTWF0cml4PFNjYWxhciwgU2l6ZSsxLCBEeW5hbWljPiBwdHMxLCBwdHMyOworCisgIGFmZi5hZmZpbmUoKS5zZXRSYW5kb20oKTsKKyAgcHJvaiA9IGNhZmYgPSBhZmY7CisgIHB0cy5zZXRSYW5kb20oU2l6ZSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwyMCkpOworICAKKyAgcHRzMSA9IHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhZmYgICogcHRzLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLCAoYWZmICAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjYWZmICogcHRzLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLCAoY2FmZiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwcm9qICogcHRzLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLCAocHJvaiAqIHB0czEpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChhZmYgICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCksICBhZmYgICogcHRzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoY2FmZiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCBjYWZmICogcHRzKTsKKyAgCisgIHB0czIgPSBwdHMxOworICBwdHMyLnJvdyhTaXplKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYWZmICAqIHB0czIpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCBhZmYgICogcHRzMi5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goKGNhZmYgKiBwdHMyKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgY2FmZiAqIHB0czIuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChwcm9qICogcHRzMikuY29sd2lzZSgpLmhub3JtYWxpemVkKCksIChwcm9qICogcHRzMi5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOworICAKKyAgLy8gVGVzdCBjb21iaW5hdGlvbiBvZiBob21vZ2VuZW91cworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCggKHQyICogdjAuaG9tb2dlbmVvdXMoKSkuaG5vcm1hbGl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHQyLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8U2l6ZSxTaXplPigpICogdjAgKyB0Mi50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxTaXplLDE+KCkpCisgICAgICAgICAgICAgICAgICAgICAvICgodDIudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjwxLFNpemU+KCkqdjApLnZhbHVlKCkgKyB0MihTaXplLFNpemUpKSApOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCggKHQyICogcHRzLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKE1hdHJpeDxTY2FsYXIsIFNpemUrMSwgRHluYW1pYz4odDIgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSkgKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goICh0MiAubGF6eVByb2R1Y3QoIHYwLmhvbW9nZW5lb3VzKCkgKSkuaG5vcm1hbGl6ZWQoKSwgKHQyICogdjAuaG9tb2dlbmVvdXMoKSkuaG5vcm1hbGl6ZWQoKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAodDIgLmxhenlQcm9kdWN0ICAoIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSApKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgKHQyICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkgKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goICh2MC50cmFuc3Bvc2UoKS5ob21vZ2VuZW91cygpIC5sYXp5UHJvZHVjdCggdDIgKSkuaG5vcm1hbGl6ZWQoKSwgKHYwLnRyYW5zcG9zZSgpLmhvbW9nZW5lb3VzKCkqdDIpLmhub3JtYWxpemVkKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKHB0cy50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAubGF6eVByb2R1Y3QoIHQyICkpLnJvd3dpc2UoKS5obm9ybWFsaXplZCgpLCAocHRzMS50cmFuc3Bvc2UoKSp0Mikucm93d2lzZSgpLmhub3JtYWxpemVkKCkgKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCAodDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiB2MC5ob21vZ2VuZW91cygpKS5ldmFsKCksICh0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpodjApICk7Cit9CisKK3ZvaWQgdGVzdF9nZW9faG9tb2dlbmVvdXMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCggaG9tb2dlbmVvdXM8ZmxvYXQsMT4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIGhvbW9nZW5lb3VzPGRvdWJsZSwzPigpICkpOworICAgIENBTExfU1VCVEVTVF8zKCggaG9tb2dlbmVvdXM8ZG91YmxlLDg+KCkgKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwIGIvdGVzdC9nZW9faHlwZXJwbGFuZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4OTI4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIEh5cGVycGxhbmVUeXBlPiB2b2lkIGh5cGVycGxhbmUoY29uc3QgSHlwZXJwbGFuZVR5cGUmIF9wbGFuZSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBIeXBlcnBsYW5lLmgKKyAgKi8KKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgSHlwZXJwbGFuZVR5cGU6OkluZGV4IEluZGV4OworICBjb25zdCBJbmRleCBkaW0gPSBfcGxhbmUuZGltKCk7CisgIGVudW0geyBPcHRpb25zID0gSHlwZXJwbGFuZVR5cGU6Ok9wdGlvbnMgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlOworCisgIFZlY3RvclR5cGUgcDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworCisgIFZlY3RvclR5cGUgbjAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisgIFZlY3RvclR5cGUgbjEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisKKyAgSHlwZXJwbGFuZVR5cGUgcGwwKG4wLCBwMCk7CisgIEh5cGVycGxhbmVUeXBlIHBsMShuMSwgcDEpOworICBIeXBlcnBsYW5lVHlwZSBwbDIgPSBwbDE7CisKKyAgU2NhbGFyIHMwID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIFZFUklGWV9JU19BUFBST1goIG4xLmRvdChuMSksIFNjYWxhcigxKSApOworCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwwLmFic0Rpc3RhbmNlKHAwKSwgU2NhbGFyKDEpICk7CisgIGlmKG51bWV4dDo6YWJzMihzMCk+UmVhbFNjYWxhcigxZS02KSkKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBwbDEuc2lnbmVkRGlzdGFuY2UocDEgKyBuMSAqIHMwKSwgczApOworICBlbHNlCisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBhYnMocGwxLnNpZ25lZERpc3RhbmNlKHAxICsgbjEgKiBzMCkgLSBzMCksIFNjYWxhcigxKSApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMS5zaWduZWREaXN0YW5jZShwbDEucHJvamVjdGlvbihwMCkpLCBTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDEuYWJzRGlzdGFuY2UocDEgKyAgcGwxLm5vcm1hbCgpLnVuaXRPcnRob2dvbmFsKCkgKiBzMSksIFNjYWxhcigxKSApOworCisgIC8vIHRyYW5zZm9ybQorICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgIHsKKyAgICBNYXRyaXhUeXBlIHJvdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sZGltKS5ob3VzZWhvbGRlclFyKCkuaG91c2Vob2xkZXJRKCk7CisgICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gc2NhbGluZyhWZWN0b3JUeXBlOjpSYW5kb20oKSk7CisgICAgVHJhbnNsYXRpb248U2NhbGFyLEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gdHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIAorICAgIHdoaWxlKHNjYWxpbmcuZGlhZ29uYWwoKS5jd2lzZUFicygpLm1pbkNvZWZmKCk8UmVhbFNjYWxhcigxZS00KSkgc2NhbGluZy5kaWFnb25hbCgpID0gVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCxJc29tZXRyeSkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCpzY2FsaW5nKS5hYnNEaXN0YW5jZSgocm90KnNjYWxpbmcpICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBwbDIubm9ybWFsKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpICk7CisgICAgcGwyID0gcGwxOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3Qqc2NhbGluZyp0cmFuc2xhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWJzRGlzdGFuY2UoKHJvdCpzY2FsaW5nKnRyYW5zbGF0aW9uKSAqIHAxKSwgU2NhbGFyKDEpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggcGwyLm5vcm1hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSApOworICAgIHBsMiA9IHBsMTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMi50cmFuc2Zvcm0ocm90KnRyYW5zbGF0aW9uLElzb21ldHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFic0Rpc3RhbmNlKChyb3QqdHJhbnNsYXRpb24pICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBwbDIubm9ybWFsKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpICk7CisgIH0KKworICAvLyBjYXN0aW5nCisgIGNvbnN0IGludCBEaW0gPSBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOworICBIeXBlcnBsYW5lPE90aGVyU2NhbGFyLERpbSxPcHRpb25zPiBocDFmID0gcGwxLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxwbDEpOworICBIeXBlcnBsYW5lPFNjYWxhcixEaW0sT3B0aW9ucz4gaHAxZCA9IHBsMS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHBsMSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBsaW5lcygpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLCAyPiBITGluZTsKKyAgdHlwZWRlZiBQYXJhbWV0cml6ZWRMaW5lPFNjYWxhciwgMj4gUExpbmU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyLDE+IFZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gQ29lZmZzVHlwZTsKKworICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgeworICAgIFZlY3RvciBjZW50ZXIgPSBWZWN0b3I6OlJhbmRvbSgpOworICAgIFZlY3RvciB1ID0gVmVjdG9yOjpSYW5kb20oKTsKKyAgICBWZWN0b3IgdiA9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgU2NhbGFyIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICB3aGlsZSAoYWJzKGEtMSkgPCBTY2FsYXIoMWUtNCkpIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICB3aGlsZSAodS5ub3JtKCkgPCBTY2FsYXIoMWUtNCkpIHUgPSBWZWN0b3I6OlJhbmRvbSgpOworICAgIHdoaWxlICh2Lm5vcm0oKSA8IFNjYWxhcigxZS00KSkgdiA9IFZlY3Rvcjo6UmFuZG9tKCk7CisKKyAgICBITGluZSBsaW5lX3UgPSBITGluZTo6VGhyb3VnaChjZW50ZXIgKyB1LCBjZW50ZXIgKyBhKnUpOworICAgIEhMaW5lIGxpbmVfdiA9IEhMaW5lOjpUaHJvdWdoKGNlbnRlciArIHYsIGNlbnRlciArIGEqdik7CisKKyAgICAvLyB0aGUgbGluZSBlcXVhdGlvbnMgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgc28gdGhhdCBhXjIrYl4yPTEKKyAgICBWRVJJRllfSVNfQVBQUk9YKGxpbmVfdS5ub3JtYWwoKS5ub3JtKCksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChsaW5lX3Yubm9ybWFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworCisgICAgVmVjdG9yIHJlc3VsdCA9IGxpbmVfdS5pbnRlcnNlY3Rpb24obGluZV92KTsKKworICAgIC8vIHRoZSBsaW5lcyBzaG91bGQgaW50ZXJzZWN0IGF0IHRoZSBwb2ludCB3ZSBjYWxsZWQgImNlbnRlciIKKyAgICBpZihhYnMoYS0xKSA+IFNjYWxhcigxZS0yKSAmJiBhYnModi5ub3JtYWxpemVkKCkuZG90KHUubm9ybWFsaXplZCgpKSk8U2NhbGFyKDAuOSkpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCwgY2VudGVyKTsKKworICAgIC8vIGNoZWNrIGNvbnZlcnNpb25zIGJldHdlZW4gdHdvIHR5cGVzIG9mIGxpbmVzCisgICAgUExpbmUgcGwobGluZV91KTsgLy8gZ2NjIDMuMyB3aWxsIGNvbW1pdCBzdWljaWRlIGlmIHdlIGRvbid0IG5hbWUgdGhpcyB2YXJpYWJsZQorICAgIEhMaW5lIGxpbmVfdTIocGwpOworICAgIENvZWZmc1R5cGUgY29udmVydGVkX2NvZWZmcyA9IGxpbmVfdTIuY29lZmZzKCk7CisgICAgaWYobGluZV91Mi5ub3JtYWwoKS5kb3QobGluZV91Lm5vcm1hbCgpKTxTY2FsYXIoMCkpCisgICAgICBjb252ZXJ0ZWRfY29lZmZzID0gLWxpbmVfdTIuY29lZmZzKCk7CisgICAgVkVSSUZZKGxpbmVfdS5jb2VmZnMoKS5pc0FwcHJveChjb252ZXJ0ZWRfY29lZmZzKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHBsYW5lcygpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLCAzPiBQbGFuZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICB7CisgICAgVmVjdG9yIHYwID0gVmVjdG9yOjpSYW5kb20oKTsKKyAgICBWZWN0b3IgdjEodjApLCB2Mih2MCk7CisgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSk+MC4yNSkKKyAgICAgIHYxICs9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSk+MC4yNSkKKyAgICAgIHYyICs9IHYxICogc3RkOjpwb3coaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTYpKTsKKyAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKT4wLjI1KQorICAgICAgdjIgKz0gVmVjdG9yOjpSYW5kb20oKSAqIHN0ZDo6cG93KGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLDEpLGludGVybmFsOjpyYW5kb208aW50PigxLDE2KSk7CisKKyAgICBQbGFuZSBwMCA9IFBsYW5lOjpUaHJvdWdoKHYwLCB2MSwgdjIpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChwMC5ub3JtYWwoKS5ub3JtKCksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHAwLmFic0Rpc3RhbmNlKHYwKSwgU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4ocDAuYWJzRGlzdGFuY2UodjEpLCBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihwMC5hYnNEaXN0YW5jZSh2MiksIFNjYWxhcigxKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGh5cGVycGxhbmVfYWxpZ25tZW50KCkKK3sKKyAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwzLEF1dG9BbGlnbj4gUGxhbmUzYTsKKyAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwzLERvbnRBbGlnbj4gUGxhbmUzdTsKKworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MVs0XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTJbNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkzWzQrMV07CisgIFNjYWxhciogYXJyYXkzdSA9IGFycmF5MysxOworCisgIFBsYW5lM2EgKnAxID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkxKSkgUGxhbmUzYTsKKyAgUGxhbmUzdSAqcDIgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTIpKSBQbGFuZTN1OworICBQbGFuZTN1ICpwMyA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBQbGFuZTN1OworICAKKyAgcDEtPmNvZWZmcygpLnNldFJhbmRvbSgpOworICAqcDIgPSAqcDE7CisgICpwMyA9ICpwMTsKKworICBWRVJJRllfSVNfQVBQUk9YKHAxLT5jb2VmZnMoKSwgcDItPmNvZWZmcygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwMS0+Y29lZmZzKCksIHAzLT5jb2VmZnMoKSk7CisgIAorICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkUpICYmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMgPiAwCisgIGlmKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplPD00KQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCg6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTN1KSkgUGxhbmUzYSkpOworICAjZW5kaWYKK30KKworCit2b2lkIHRlc3RfZ2VvX2h5cGVycGxhbmUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8ZmxvYXQsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LDM+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGh5cGVycGxhbmUoSHlwZXJwbGFuZTxmbG9hdCwzLERvbnRBbGlnbj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaHlwZXJwbGFuZV9hbGlnbm1lbnQ8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGRvdWJsZSw0PigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbGluZXM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbGluZXM8ZG91YmxlPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHBsYW5lczxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF81KCBwbGFuZXM8ZG91YmxlPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX29ydGhvbWV0aG9kcy5jcHAgYi90ZXN0L2dlb19vcnRob21ldGhvZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzhkZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb19vcnRob21ldGhvZHMuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKKy8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgIEdlb21ldHJ5L09ydGhvTWV0aG9kcy5oCisqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgb3J0aG9tZXRob2RzXzMoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsMT4gVmVjdG9yNDsKKworICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCksCisgICAgICAgICAgdjEgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MiA9IFZlY3RvcjM6OlJhbmRvbSgpOworCisgIC8vIGNyb3NzIHByb2R1Y3QKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYxLmNyb3NzKHYyKS5kb3QodjEpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEuZG90KHYxLmNyb3NzKHYyKSksIFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MS5jcm9zcyh2MikuZG90KHYyKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYyLmRvdCh2MS5jcm9zcyh2MikpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEuY3Jvc3MoVmVjdG9yMzo6UmFuZG9tKCkpLmRvdCh2MSksIFNjYWxhcigxKSk7CisgIE1hdHJpeDMgbWF0MzsKKyAgbWF0MyA8PCB2MC5ub3JtYWxpemVkKCksCisgICAgICAgICAodjAuY3Jvc3ModjEpKS5ub3JtYWxpemVkKCksCisgICAgICAgICAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOworICBWRVJJRlkobWF0My5pc1VuaXRhcnkoKSk7CisgIAorICBtYXQzLnNldFJhbmRvbSgpOworICBWRVJJRllfSVNfQVBQUk9YKHYwLmNyb3NzKG1hdDMqdjEpLCAtKG1hdDMqdjEpLmNyb3NzKHYwKSk7CisgIFZFUklGWV9JU19BUFBST1godjAuY3Jvc3MobWF0My5sYXp5UHJvZHVjdCh2MSkpLCAtKG1hdDMubGF6eVByb2R1Y3QodjEpKS5jcm9zcyh2MCkpOworCisgIC8vIGNvbHdpc2Uvcm93d2lzZSBjcm9zcyBwcm9kdWN0CisgIG1hdDMuc2V0UmFuZG9tKCk7CisgIFZlY3RvcjMgdmVjMyA9IFZlY3RvcjM6OlJhbmRvbSgpOworICBNYXRyaXgzIG1jcm9zczsKKyAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwyKTsKKyAgbWNyb3NzID0gbWF0My5jb2x3aXNlKCkuY3Jvc3ModmVjMyk7CisgIFZFUklGWV9JU19BUFBST1gobWNyb3NzLmNvbChpKSwgbWF0My5jb2woaSkuY3Jvc3ModmVjMykpOworICAKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKChtYXQzLmFkam9pbnQoKSAqIG1hdDMuY29sd2lzZSgpLmNyb3NzKHZlYzMpKS5kaWFnb25hbCgpLmN3aXNlQWJzKCkuc3VtKCksIFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTigobWF0My5hZGpvaW50KCkgKiBtYXQzLmNvbHdpc2UoKS5jcm9zcyhWZWN0b3IzOjpSYW5kb20oKSkpLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5zdW0oKSwgU2NhbGFyKDEpKTsKKyAgCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTigodmVjMy5hZGpvaW50KCkgKiBtYXQzLmNvbHdpc2UoKS5jcm9zcyh2ZWMzKSkuY3dpc2VBYnMoKS5zdW0oKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCh2ZWMzLmFkam9pbnQoKSAqIE1hdHJpeDM6OlJhbmRvbSgpLmNvbHdpc2UoKS5jcm9zcyh2ZWMzKSkuY3dpc2VBYnMoKS5zdW0oKSwgU2NhbGFyKDEpKTsKKyAgCisgIG1jcm9zcyA9IG1hdDMucm93d2lzZSgpLmNyb3NzKHZlYzMpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zcy5yb3coaSksIG1hdDMucm93KGkpLmNyb3NzKHZlYzMpKTsKKworICAvLyBjcm9zczMKKyAgVmVjdG9yNCB2NDAgPSBWZWN0b3I0OjpSYW5kb20oKSwKKyAgICAgICAgICB2NDEgPSBWZWN0b3I0OjpSYW5kb20oKSwKKyAgICAgICAgICB2NDIgPSBWZWN0b3I0OjpSYW5kb20oKTsKKyAgdjQwLncoKSA9IHY0MS53KCkgPSB2NDIudygpID0gMDsKKyAgdjQyLnRlbXBsYXRlIGhlYWQ8Mz4oKSA9IHY0MC50ZW1wbGF0ZSBoZWFkPDM+KCkuY3Jvc3ModjQxLnRlbXBsYXRlIGhlYWQ8Mz4oKSk7CisgIFZFUklGWV9JU19BUFBST1godjQwLmNyb3NzMyh2NDEpLCB2NDIpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjQwLmNyb3NzMyhWZWN0b3I0OjpSYW5kb20oKSkuZG90KHY0MCksIFNjYWxhcigxKSk7CisgIAorICAvLyBjaGVjayBtaXhlZCBwcm9kdWN0CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIDMsIDE+IFJlYWxWZWN0b3IzOworICBSZWFsVmVjdG9yMyBydjEgPSBSZWFsVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godjEuY3Jvc3MocnYxLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpKSwgdjEuY3Jvc3MocnYxKSk7CisgIFZFUklGWV9JU19BUFBST1gocnYxLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLmNyb3NzKHYxKSwgcnYxLmNyb3NzKHYxKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemU+IHZvaWQgb3J0aG9tZXRob2RzKGludCBzaXplPVNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsU2l6ZT4gTWF0cml4M047CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLDM+IE1hdHJpeE4zOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworCisgIFZlY3RvclR5cGUgdjAgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CisKKyAgLy8gdW5pdE9ydGhvZ29uYWwKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYwLnVuaXRPcnRob2dvbmFsKCkuZG90KHYwKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MC51bml0T3J0aG9nb25hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisKKyAgaWYgKHNpemU+PTMpCisgIHsKKyAgICB2MC50ZW1wbGF0ZSBoZWFkPDI+KCkuc2V0WmVybygpOworICAgIHYwLnRhaWwoc2l6ZS0yKS5zZXRSYW5kb20oKTsKKworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MC51bml0T3J0aG9nb25hbCgpLmRvdCh2MCksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MC51bml0T3J0aG9nb25hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisgIH0KKworICAvLyBjb2x3aXNlL3Jvd3dpc2UgY3Jvc3MgcHJvZHVjdAorICBWZWN0b3IzIHZlYzMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxzaXplLTEpOworCisgIE1hdHJpeDNOIG1hdDNOKDMsc2l6ZSksIG1jcm9zczNOKDMsc2l6ZSk7CisgIG1hdDNOLnNldFJhbmRvbSgpOworICBtY3Jvc3MzTiA9IG1hdDNOLmNvbHdpc2UoKS5jcm9zcyh2ZWMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtY3Jvc3MzTi5jb2woaSksIG1hdDNOLmNvbChpKS5jcm9zcyh2ZWMzKSk7CisKKyAgTWF0cml4TjMgbWF0TjMoc2l6ZSwzKSwgbWNyb3NzTjMoc2l6ZSwzKTsKKyAgbWF0TjMuc2V0UmFuZG9tKCk7CisgIG1jcm9zc04zID0gbWF0TjMucm93d2lzZSgpLmNyb3NzKHZlYzMpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zc04zLnJvdyhpKSwgbWF0TjMucm93KGkpLmNyb3NzKHZlYzMpKTsKK30KKwordm9pZCB0ZXN0X2dlb19vcnRob21ldGhvZHMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBvcnRob21ldGhvZHNfMzxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBvcnRob21ldGhvZHNfMzxkb3VibGU+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggb3J0aG9tZXRob2RzXzM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIChvcnRob21ldGhvZHM8ZmxvYXQsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggKG9ydGhvbWV0aG9kczxkb3VibGUsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggKG9ydGhvbWV0aG9kczxmbG9hdCwzPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCAob3J0aG9tZXRob2RzPGRvdWJsZSwzPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCAob3J0aG9tZXRob2RzPGZsb2F0LDc+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIChvcnRob21ldGhvZHM8c3RkOjpjb21wbGV4PGRvdWJsZT4sOD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggKG9ydGhvbWV0aG9kczxmbG9hdCxEeW5hbWljPigzNikpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIChvcnRob21ldGhvZHM8ZG91YmxlLER5bmFtaWM+KDM1KSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9fcGFyYW1ldHJpemVkbGluZS5jcHAgYi90ZXN0L2dlb19wYXJhbWV0cml6ZWRsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY1ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nZW9fcGFyYW1ldHJpemVkbGluZS5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgTGluZVR5cGU+IHZvaWQgcGFyYW1ldHJpemVkbGluZShjb25zdCBMaW5lVHlwZSYgX2xpbmUpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUGFyYW1ldHJpemVkTGluZS5oCisgICovCisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIExpbmVUeXBlOjpJbmRleCBJbmRleDsKKyAgY29uc3QgSW5kZXggZGltID0gX2xpbmUuZGltKCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGluZVR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBMaW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgSHlwZXJwbGFuZTxTY2FsYXIsTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBIeXBlcnBsYW5lVHlwZTsKKworICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKworICBWZWN0b3JUeXBlIGQwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSkubm9ybWFsaXplZCgpOworCisgIExpbmVUeXBlIGwwKHAwLCBkMCk7CisKKyAgU2NhbGFyIHMwID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMSA9IGFicyhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMC5kaXN0YW5jZShwMCksIFJlYWxTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMC5kaXN0YW5jZShwMCtzMCpkMCksIFJlYWxTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKGwwLnByb2plY3Rpb24ocDEpLXAxKS5ub3JtKCksIGwwLmRpc3RhbmNlKHAxKSApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKGwwLnByb2plY3Rpb24ocDEpKSwgUmVhbFNjYWxhcigxKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBTY2FsYXIobDAuZGlzdGFuY2UoKHAwK3MwKmQwKSArIGQwLnVuaXRPcnRob2dvbmFsKCkgKiBzMSkpLCBzMSApOworCisgIC8vIGNhc3RpbmcKKyAgY29uc3QgaW50IERpbSA9IExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHZXREaWZmZXJlbnRUeXBlPFNjYWxhcj46OnR5cGUgT3RoZXJTY2FsYXI7CisgIFBhcmFtZXRyaXplZExpbmU8T3RoZXJTY2FsYXIsRGltPiBocDFmID0gbDAudGVtcGxhdGUgY2FzdDxPdGhlclNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGwwKTsKKyAgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsRGltPiBocDFkID0gbDAudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxsMCk7CisKKyAgLy8gaW50ZXJzZWN0aW9ucworICBWZWN0b3JUeXBlIHAyID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisgIFZlY3RvclR5cGUgbjIgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisgIEh5cGVycGxhbmVUeXBlIGhwKHAyLG4yKTsKKyAgU2NhbGFyIHQgPSBsMC5pbnRlcnNlY3Rpb25QYXJhbWV0ZXIoaHApOworICBWZWN0b3JUeXBlIHBpID0gbDAucG9pbnRBdCh0KTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGhwLnNpZ25lZERpc3RhbmNlKHBpKSwgUmVhbFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihsMC5kaXN0YW5jZShwaSksIFJlYWxTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKGwwLmludGVyc2VjdGlvblBvaW50KGhwKSwgcGkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQoKQoreworICB0eXBlZGVmIFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLDQsQXV0b0FsaWduPiBMaW5lNGE7CisgIHR5cGVkZWYgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsNCxEb250QWxpZ24+IExpbmU0dTsKKworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MVsxNl07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkyWzE2XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTNbMTYrMV07CisgIFNjYWxhciogYXJyYXkzdSA9IGFycmF5MysxOworCisgIExpbmU0YSAqcDEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBMaW5lNGE7CisgIExpbmU0dSAqcDIgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTIpKSBMaW5lNHU7CisgIExpbmU0dSAqcDMgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTN1KSkgTGluZTR1OworICAKKyAgcDEtPm9yaWdpbigpLnNldFJhbmRvbSgpOworICBwMS0+ZGlyZWN0aW9uKCkuc2V0UmFuZG9tKCk7CisgICpwMiA9ICpwMTsKKyAgKnAzID0gKnAxOworCisgIFZFUklGWV9JU19BUFBST1gocDEtPm9yaWdpbigpLCBwMi0+b3JpZ2luKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHAxLT5vcmlnaW4oKSwgcDMtPm9yaWdpbigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwMS0+ZGlyZWN0aW9uKCksIHAyLT5kaXJlY3Rpb24oKSk7CisgIFZFUklGWV9JU19BUFBST1gocDEtPmRpcmVjdGlvbigpLCBwMy0+ZGlyZWN0aW9uKCkpOworICAKKyAgI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFKSAmJiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPjAKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU8PTQpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBMaW5lNGEpKTsKKyAgI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9nZW9fcGFyYW1ldHJpemVkbGluZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxmbG9hdCwyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8ZmxvYXQsMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQ8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcGFyYW1ldHJpemVkbGluZShQYXJhbWV0cml6ZWRMaW5lPGRvdWJsZSw0PigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBwYXJhbWV0cml6ZWRsaW5lX2FsaWdubWVudDxkb3VibGU+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcGFyYW1ldHJpemVkbGluZShQYXJhbWV0cml6ZWRMaW5lPHN0ZDo6Y29tcGxleDxkb3VibGU+LDU+KCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX3F1YXRlcm5pb24uY3BwIGIvdGVzdC9nZW9fcXVhdGVybmlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ODllNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX3F1YXRlcm5pb24uY3BwCkBAIC0wLDAgKzEsMjg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IE1hdGhpZXUgR2F1dGllciA8bWF0aGlldS5nYXV0aWVyQGNlYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIGJvdW5kZWRfYWNvcyhUIHYpCit7CisgIHVzaW5nIHN0ZDo6YWNvczsKKyAgdXNpbmcgc3RkOjptaW47CisgIHVzaW5nIHN0ZDo6bWF4OworICByZXR1cm4gYWNvcygobWF4KShUKC0xKSwobWluKSh2LFQoMSkpKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRUeXBlPiB2b2lkIGNoZWNrX3NsZXJwKGNvbnN0IFF1YXRUeXBlJiBxMCwgY29uc3QgUXVhdFR5cGUmIHExKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBQTsKKworICBTY2FsYXIgbGFyZ2VFcHMgPSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCk7CisKKyAgU2NhbGFyIHRoZXRhX3RvdCA9IEFBKHExKnEwLmludmVyc2UoKSkuYW5nbGUoKTsKKyAgaWYodGhldGFfdG90PlNjYWxhcihFSUdFTl9QSSkpCisgICAgdGhldGFfdG90ID0gU2NhbGFyKDIuKSpTY2FsYXIoRUlHRU5fUEkpLXRoZXRhX3RvdDsKKyAgZm9yKFNjYWxhciB0PTA7IHQ8PVNjYWxhcigxLjAwMSk7IHQrPVNjYWxhcigwLjEpKQorICB7CisgICAgUXVhdFR5cGUgcSA9IHEwLnNsZXJwKHQscTEpOworICAgIFNjYWxhciB0aGV0YSA9IEFBKHEqcTAuaW52ZXJzZSgpKS5hbmdsZSgpOworICAgIFZFUklGWShhYnMocS5ub3JtKCkgLSAxKSA8IGxhcmdlRXBzKTsKKyAgICBpZih0aGV0YV90b3Q9PTApICBWRVJJRlkodGhldGFfdG90PT0wKTsKKyAgICBlbHNlICAgICAgICAgICAgICBWRVJJRlkoYWJzKHRoZXRhIC0gdCAqIHRoZXRhX3RvdCkgPCBsYXJnZUVwcyk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4gdm9pZCBxdWF0ZXJuaW9uKHZvaWQpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUXVhdGVybmlvbi5oCisgICovCisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+IFF1YXRlcm5pb254OworICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc3g7CisKKyAgU2NhbGFyIGxhcmdlRXBzID0gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGZsb2F0Pjo6dmFsdWUpCisgICAgbGFyZ2VFcHMgPSBTY2FsYXIoMWUtMyk7CisKKyAgU2NhbGFyIGVwcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDFlLTIpOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgICAgICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCksCisgICAgICAgICAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKworICBTY2FsYXIgIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpLAorICAgICAgICAgIGIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOworCisgIC8vIFF1YXRlcm5pb246IElkZW50aXR5KCksIHNldElkZW50aXR5KCk7CisgIFF1YXRlcm5pb254IHExLCBxMjsKKyAgcTIuc2V0SWRlbnRpdHkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChRdWF0ZXJuaW9ueChRdWF0ZXJuaW9ueDo6SWRlbnRpdHkoKSkuY29lZmZzKCksIHEyLmNvZWZmcygpKTsKKyAgcTEuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1gocTEuY29lZmZzKCksIChxMSpxMikuY29lZmZzKCkpOworCisgIC8vIGNvbmNhdGVuYXRpb24KKyAgcTEgKj0gcTI7CisKKyAgcTEgPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeChhLCB2MS5ub3JtYWxpemVkKCkpOworCisgIC8vIGFuZ3VsYXIgZGlzdGFuY2UKKyAgU2NhbGFyIHJlZmFuZ2xlID0gYWJzKEFuZ2xlQXhpc3gocTEuaW52ZXJzZSgpKnEyKS5hbmdsZSgpKTsKKyAgaWYgKHJlZmFuZ2xlPlNjYWxhcihFSUdFTl9QSSkpCisgICAgcmVmYW5nbGUgPSBTY2FsYXIoMikqU2NhbGFyKEVJR0VOX1BJKSAtIHJlZmFuZ2xlOworCisgIGlmKChxMS5jb2VmZnMoKS1xMi5jb2VmZnMoKSkubm9ybSgpID4gMTAqbGFyZ2VFcHMpCisgIHsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKHExLmFuZ3VsYXJEaXN0YW5jZShxMikgLSByZWZhbmdsZSksIFNjYWxhcigxKSk7CisgIH0KKworICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKHExICogdjIsIHExLnRvUm90YXRpb25NYXRyaXgoKSAqIHYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHEyICogdjIsCisgICAgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOworCisgIFZFUklGWSggIChxMipxMSkuaXNBcHByb3gocTEqcTIsIGxhcmdlRXBzKQorICAgICAgICB8fCAhKHEyICogcTEgKiB2MikuaXNBcHByb3gocTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpKTsKKworICBxMiA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSp2MSxxMip2MSk7CisKKyAgTWF0cml4MyByb3QxKHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSp2MSxyb3QxKnYxKTsKKyAgUXVhdGVybmlvbnggcTMocm90MS50cmFuc3Bvc2UoKSpyb3QxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMyp2MSx2MSk7CisKKworICAvLyBhbmdsZS1heGlzIGNvbnZlcnNpb24KKyAgQW5nbGVBeGlzeCBhYSA9IEFuZ2xlQXhpc3gocTEpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KGFhKSAqIHYxKTsKKworICAvLyBEbyBub3QgZXhlY3V0ZSB0aGUgdGVzdCBpZiB0aGUgcm90YXRpb24gYW5nbGUgaXMgYWxtb3N0IHplcm8sIG9yCisgIC8vIHRoZSByb3RhdGlvbiBheGlzIGFuZCB2MSBhcmUgYWxtb3N0IHBhcmFsbGVsLgorICBpZiAoYWJzKGFhLmFuZ2xlKCkpID4gNSp0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkKKyAgICAgICYmIChhYS5heGlzKCkgLSB2MS5ub3JtYWxpemVkKCkpLm5vcm0oKSA8IFNjYWxhcigxLjk5KQorICAgICAgJiYgKGFhLmF4aXMoKSArIHYxLm5vcm1hbGl6ZWQoKSkubm9ybSgpIDwgU2NhbGFyKDEuOTkpKQorICB7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpKjIsYWEuYXhpcygpKSkgKiB2MSk7CisgIH0KKworICAvLyBmcm9tIHR3byB2ZWN0b3IgY3JlYXRpb24KKyAgVkVSSUZZX0lTX0FQUFJPWCggdjIubm9ybWFsaXplZCgpLChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwgdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCB2MS5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MSkqdjEpLm5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goLXYxLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsLXYxKSp2MSkubm9ybWFsaXplZCgpKTsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixkb3VibGU+Ojp2YWx1ZSkKKyAgeworICAgIHYzID0gKHYxLmFycmF5KCkrZXBzKS5tYXRyaXgoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCB2My5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MykqdjEpLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgtdjMubm9ybWFsaXplZCgpLChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwtdjMpKnYxKS5ub3JtYWxpemVkKCkpOworICB9CisKKyAgLy8gZnJvbSB0d28gdmVjdG9yIGNyZWF0aW9uIHN0YXRpYyBmdW5jdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKCB2Mi5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCB2MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjEpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKC12MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwtdjEpKnYxKS5ub3JtYWxpemVkKCkpOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGRvdWJsZT46OnZhbHVlKQorICB7CisgICAgdjMgPSAodjEuYXJyYXkoKStlcHMpLm1hdHJpeCgpOworICAgIFZFUklGWV9JU19BUFBST1goIHYzLm5vcm1hbGl6ZWQoKSwoUXVhdGVybmlvbng6OkZyb21Ud29WZWN0b3JzKHYxLCB2MykqdjEpLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgtdjMubm9ybWFsaXplZCgpLChRdWF0ZXJuaW9ueDo6RnJvbVR3b1ZlY3RvcnModjEsLXYzKSp2MSkubm9ybWFsaXplZCgpKTsKKyAgfQorCisgIC8vIGludmVyc2UgYW5kIGNvbmp1Z2F0ZQorICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmNvbmp1Z2F0ZSgpICogdjEpLCB2MSk7CisKKyAgLy8gdGVzdCBjYXN0aW5nCisgIFF1YXRlcm5pb248ZmxvYXQ+IHExZiA9IHExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHExKTsKKyAgUXVhdGVybmlvbjxkb3VibGU+IHExZCA9IHExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHExZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxxMSk7CisKKyAgLy8gdGVzdCBidWcgMzY5IC0gaW1wcm9wZXIgYWxpZ25tZW50LgorICBRdWF0ZXJuaW9ueCAqcSA9IG5ldyBRdWF0ZXJuaW9ueDsKKyAgZGVsZXRlIHE7CisKKyAgcTEgPSBRdWF0ZXJuaW9ueDo6VW5pdFJhbmRvbSgpOworICBxMiA9IFF1YXRlcm5pb254OjpVbml0UmFuZG9tKCk7CisgIGNoZWNrX3NsZXJwKHExLHEyKTsKKworICBxMSA9IEFuZ2xlQXhpc3goYiwgdjEubm9ybWFsaXplZCgpKTsKKyAgcTIgPSBBbmdsZUF4aXN4KGIrU2NhbGFyKEVJR0VOX1BJKSwgdjEubm9ybWFsaXplZCgpKTsKKyAgY2hlY2tfc2xlcnAocTEscTIpOworCisgIHExID0gQW5nbGVBeGlzeChiLCAgdjEubm9ybWFsaXplZCgpKTsKKyAgcTIgPSBBbmdsZUF4aXN4KC1iLCAtdjEubm9ybWFsaXplZCgpKTsKKyAgY2hlY2tfc2xlcnAocTEscTIpOworCisgIHExID0gUXVhdGVybmlvbng6OlVuaXRSYW5kb20oKTsKKyAgcTIuY29lZmZzKCkgPSAtcTEuY29lZmZzKCk7CisgIGNoZWNrX3NsZXJwKHExLHEyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1hcFF1YXRlcm5pb24odm9pZCl7CisgIHR5cGVkZWYgTWFwPFF1YXRlcm5pb248U2NhbGFyPiwgQWxpZ25lZD4gTVF1YXRlcm5pb25BOworICB0eXBlZGVmIE1hcDxjb25zdCBRdWF0ZXJuaW9uPFNjYWxhcj4sIEFsaWduZWQ+IE1DUXVhdGVybmlvbkE7CisgIHR5cGVkZWYgTWFwPFF1YXRlcm5pb248U2NhbGFyPiA+IE1RdWF0ZXJuaW9uVUE7CisgIHR5cGVkZWYgTWFwPGNvbnN0IFF1YXRlcm5pb248U2NhbGFyPiA+IE1DUXVhdGVybmlvblVBOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworICAKKyAgVmVjdG9yMyB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgICAgICAgIHYxID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIFNjYWxhciAgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CisKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTFbNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkyWzRdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5M1s0KzFdOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IGFycmF5MysxOworICAKKyAgTVF1YXRlcm5pb25BICAgIG1xMShhcnJheTEpOworICBNQ1F1YXRlcm5pb25BICAgbWNxMShhcnJheTEpOworICBNUXVhdGVybmlvbkEgICAgbXEyKGFycmF5Mik7CisgIE1RdWF0ZXJuaW9uVUEgICBtcTMoYXJyYXkzdW5hbGlnbmVkKTsKKyAgTUNRdWF0ZXJuaW9uVUEgIG1jcTMoYXJyYXkzdW5hbGlnbmVkKTsKKworLy8gIHN0ZDo6Y2VyciA8PCBhcnJheTEgPDwgIiAiIDw8IGFycmF5MiA8PCAiICIgPDwgYXJyYXkzIDw8ICJcbiI7CisgIG1xMSA9IEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKTsKKyAgbXEyID0gbXExOworICBtcTMgPSBtcTE7CisKKyAgUXVhdGVybmlvbnggcTEgPSBtcTE7CisgIFF1YXRlcm5pb254IHEyID0gbXEyOworICBRdWF0ZXJuaW9ueCBxMyA9IG1xMzsKKyAgUXVhdGVybmlvbnggcTQgPSBNQ1F1YXRlcm5pb25VQShhcnJheTN1bmFsaWduZWQpOworCisgIFZFUklGWV9JU19BUFBST1gocTEuY29lZmZzKCksIHEyLmNvZWZmcygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS5jb2VmZnMoKSwgcTMuY29lZmZzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHE0LmNvZWZmcygpLCBxMy5jb2VmZnMoKSk7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChNUXVhdGVybmlvbkEoYXJyYXkzdW5hbGlnbmVkKSkpOworICAjZW5kaWYKKyAgICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtcTEgKiAobXExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG1xMSAqIChtcTEuY29uanVnYXRlKCkgKiB2MSksIHYxKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gobWNxMSAqIChtY3ExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcTEgKiAobWNxMS5jb25qdWdhdGUoKSAqIHYxKSwgdjEpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtcTMgKiAobXEzLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG1xMyAqIChtcTMuY29uanVnYXRlKCkgKiB2MSksIHYxKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gobWNxMyAqIChtY3EzLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcTMgKiAobWNxMy5jb25qdWdhdGUoKSAqIHYxKSwgdjEpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtcTEqbXEyLCBxMSpxMik7CisgIFZFUklGWV9JU19BUFBST1gobXEzKm1xMiwgcTMqcTIpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcTEqbXEyLCBxMSpxMik7CisgIFZFUklGWV9JU19BUFBST1gobWNxMyptcTIsIHEzKnEyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHF1YXRlcm5pb25BbGlnbm1lbnQodm9pZCl7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXIsQXV0b0FsaWduPiBRdWF0ZXJuaW9uQTsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcixEb250QWxpZ24+IFF1YXRlcm5pb25VQTsKKworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MVs0XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTJbNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkzWzQrMV07CisgIFNjYWxhciogYXJyYXl1bmFsaWduZWQgPSBhcnJheTMrMTsKKworICBRdWF0ZXJuaW9uQSAqcTEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBRdWF0ZXJuaW9uQTsKKyAgUXVhdGVybmlvblVBICpxMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIFF1YXRlcm5pb25VQTsKKyAgUXVhdGVybmlvblVBICpxMyA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5dW5hbGlnbmVkKSkgUXVhdGVybmlvblVBOworCisgIHExLT5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgKnEyID0gKnExOworICAqcTMgPSAqcTE7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS0+Y29lZmZzKCksIHEyLT5jb2VmZnMoKSk7CisgIFZFUklGWV9JU19BUFBST1gocTEtPmNvZWZmcygpLCBxMy0+Y29lZmZzKCkpOworICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkUpICYmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM+MAorICBpZihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUgJiYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTw9NCkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCgoOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXl1bmFsaWduZWQpKSBRdWF0ZXJuaW9uQSkpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPiB2b2lkIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYpCit7CisgIC8vIHRoZXJlJ3MgYSBsb3QgdGhhdCB3ZSBjYW4ndCB0ZXN0IGhlcmUgd2hpbGUgc3RpbGwgaGF2aW5nIHRoaXMgdGVzdCBjb21waWxlIQorICAvLyB0aGUgb25seSBwb3NzaWJsZSBhcHByb2FjaCB3b3VsZCBiZSB0byBydW4gYSBzY3JpcHQgdHJ5aW5nIHRvIGNvbXBpbGUgc3R1ZmYgYW5kIGNoZWNraW5nIHRoYXQgaXQgZmFpbHMuCisgIC8vIENNYWtlIGNhbiBoZWxwIHdpdGggdGhhdC4KKworICAvLyB2ZXJpZnkgdGhhdCBtYXAtdG8tY29uc3QgZG9uJ3QgaGF2ZSBMdmFsdWVCaXQKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0PFBsYWluT2JqZWN0VHlwZT46OnR5cGUgQ29uc3RQbGFpbk9iamVjdFR5cGU7CisgIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD46OkZsYWdzICYgTHZhbHVlQml0KSApOworfQorCit2b2lkIHRlc3RfZ2VvX3F1YXRlcm5pb24oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCggcXVhdGVybmlvbjxmbG9hdCxBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFF1YXRlcm5pb25mKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBxdWF0ZXJuaW9uPGRvdWJsZSxBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFF1YXRlcm5pb25kKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBxdWF0ZXJuaW9uPGZsb2F0LERvbnRBbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoIHF1YXRlcm5pb248ZG91YmxlLERvbnRBbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIHF1YXRlcm5pb25BbGlnbm1lbnQ8ZmxvYXQ+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKCBxdWF0ZXJuaW9uQWxpZ25tZW50PGRvdWJsZT4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWFwUXVhdGVybmlvbjxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBRdWF0ZXJuaW9uPGRvdWJsZT4oKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb190cmFuc2Zvcm1hdGlvbnMuY3BwIGIvdGVzdC9nZW9fdHJhbnNmb3JtYXRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzhlNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nZW9fdHJhbnNmb3JtYXRpb25zLmNwcApAQCAtMCwwICsxLDY0NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorTWF0cml4PFQsMiwxPiBhbmdsZVRvVmVjKFQgYSkKK3sKKyAgcmV0dXJuIE1hdHJpeDxULDIsMT4oc3RkOjpjb3MoYSksIHN0ZDo6c2luKGEpKTsKK30KKworLy8gVGhpcyBwZXJtaXRzIHRvIHdvcmthcm91bmQgYSBidWcgaW4gY2xhbmcvbGx2bSBjb2RlIGdlbmVyYXRpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUKK3ZvaWQgZG9udF9vdmVyX29wdGltaXplKFQmIHgpIHsgdm9sYXRpbGUgdHlwZW5hbWUgVDo6U2NhbGFyIHRtcCA9IHgoMCk7IHgoMCkgPSB0bXA7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+IHZvaWQgbm9uX3Byb2plY3RpdmVfb25seSgpCit7CisgICAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBDcm9zcy5oIFF1YXRlcm5pb24uaCwgVHJhbnNmb3JtLmNwcAorICAqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTM7CisgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDM+IEFsaWduZWRTY2FsaW5nMzsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMz4gVHJhbnNsYXRpb24zOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOworCisgIFRyYW5zZm9ybTMgdDAsIHQxLCB0MjsKKworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CisKKyAgUXVhdGVybmlvbnggcTEsIHEyOworCisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworCisgIHQwID0gVHJhbnNmb3JtMzo6SWRlbnRpdHkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgVHJhbnNmb3JtMzo6TWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisKKyAgdDAubGluZWFyKCkgPSBxMS50b1JvdGF0aW9uTWF0cml4KCk7CisKKyAgdjAgPDwgNTAsIDIsIDE7CisgIHQwLnNjYWxlKHYwKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCAodDAgKiBWZWN0b3IzKDEsMCwwKSkudGVtcGxhdGUgaGVhZDwzPigpLm5vcm0oKSwgdjAueCgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB2MSA8PCAxLCAyLCAzOworICB0MC5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDAuc2NhbGUodjEpOworICB0MS5saW5lYXIoKSA9IHExLmNvbmp1Z2F0ZSgpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDEucHJlc2NhbGUodjEuY3dpc2VJbnZlcnNlKCkpOworICB0MS50cmFuc2xhdGUoLXYwKTsKKworICBWRVJJRlkoKHQwICogdDEpLm1hdHJpeCgpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKKyAgdDEuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MCwgcTEsIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MS5tYXRyaXgoKSwgdDAubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQxKnYxLCB0MCp2MSk7CisKKyAgLy8gdHJhbnNsYXRpb24gKiB2ZWN0b3IKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgodDAgKiB2MSkudGVtcGxhdGUgaGVhZDwzPigpLCBUcmFuc2xhdGlvbjModjApICogdjEpOworCisgIC8vIEFsaWduZWRTY2FsaW5nICogdmVjdG9yCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnNjYWxlKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgodDAgKiB2MSkudGVtcGxhdGUgaGVhZDwzPigpLCBBbGlnbmVkU2NhbGluZzModjApICogdjEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgT3B0aW9ucz4gdm9pZCB0cmFuc2Zvcm1hdGlvbnMoKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIENyb3NzLmggUXVhdGVybmlvbi5oLCBUcmFuc2Zvcm0uY3BwCisgICovCisgIHVzaW5nIHN0ZDo6Y29zOworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsND4gTWF0cml4NDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsMT4gVmVjdG9yNDsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzeDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLDIsTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm0yOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtMzo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwzPiBBbGlnbmVkU2NhbGluZzM7CisgIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLDI+IFRyYW5zbGF0aW9uMjsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMz4gVHJhbnNsYXRpb24zOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOworICBNYXRyaXgzIG1hdHJvdDEsIG07CisKKyAgU2NhbGFyIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOworICBTY2FsYXIgczAgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgCisgIHdoaWxlKHYwLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgdjAgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgd2hpbGUodjEubm9ybSgpIDwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOworCisgIFZFUklGWV9JU19BUFBST1godjAsIEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKSAqIHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtdjAsIEFuZ2xlQXhpc3goU2NhbGFyKEVJR0VOX1BJKSwgdjAudW5pdE9ydGhvZ29uYWwoKSkgKiB2MCk7CisgIGlmKGFicyhjb3MoYSkpID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChjb3MoYSkqdjAuc3F1YXJlZE5vcm0oKSwgdjAuZG90KEFuZ2xlQXhpc3goYSwgdjAudW5pdE9ydGhvZ29uYWwoKSkgKiB2MCkpOworICB9CisgIG0gPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLmFkam9pbnQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXgzOjpJZGVudGl0eSgpLCBtICogQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXgzOjpJZGVudGl0eSgpLCBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkgKiBtKTsKKworICBRdWF0ZXJuaW9ueCBxMSwgcTI7CisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworICBxMiA9IEFuZ2xlQXhpc3goYSwgdjEubm9ybWFsaXplZCgpKTsKKworICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgorICBtYXRyb3QxID0gQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMzo6VW5pdFgoKSkKKyAgICAgICAgICAqIEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjM6OlVuaXRZKCkpCisgICAgICAgICAgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzOjpVbml0WigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRyb3QxICogdjEsCisgICAgICAgQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMygxLDAsMCkpLnRvUm90YXRpb25NYXRyaXgoKQorICAgICogKEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjMoMCwxLDApKS50b1JvdGF0aW9uTWF0cml4KCkKKyAgICAqIChBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzKDAsMCwxKSkudG9Sb3RhdGlvbk1hdHJpeCgpICogdjEpKSk7CisKKyAgLy8gYW5nbGUtYXhpcyBjb252ZXJzaW9uCisgIEFuZ2xlQXhpc3ggYWEgPSBBbmdsZUF4aXN4KHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChhYSkgKiB2MSk7CisgIAorICAvLyBUaGUgZm9sbG93aW5nIHRlc3QgaXMgc3RhYmxlIG9ubHkgaWYgMiphbmdsZSAhPSBhbmdsZSBhbmQgdjEgaXMgbm90IGNvbGluZWFyIHdpdGggYXhpcworICBpZiggKGFicyhhYS5hbmdsZSgpKSA+IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgJiYgKGFicyhhYS5heGlzKCkuZG90KHYxLm5vcm1hbGl6ZWQoKSkpPChTY2FsYXIoMSktU2NhbGFyKDQpKnRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpICkKKyAgeworICAgIFZFUklGWSggIShxMSAqIHYxKS5pc0FwcHJveChRdWF0ZXJuaW9ueChBbmdsZUF4aXN4KGFhLmFuZ2xlKCkqMixhYS5heGlzKCkpKSAqIHYxKSApOworICB9CisKKyAgYWEuZnJvbVJvdGF0aW9uTWF0cml4KGFhLnRvUm90YXRpb25NYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoYWEpICogdjEpOworICAvLyBUaGUgZm9sbG93aW5nIHRlc3QgaXMgc3RhYmxlIG9ubHkgaWYgMiphbmdsZSAhPSBhbmdsZSBhbmQgdjEgaXMgbm90IGNvbGluZWFyIHdpdGggYXhpcworICBpZiggKGFicyhhYS5hbmdsZSgpKSA+IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgJiYgKGFicyhhYS5heGlzKCkuZG90KHYxLm5vcm1hbGl6ZWQoKSkpPChTY2FsYXIoMSktU2NhbGFyKDQpKnRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpICkKKyAgeworICAgIFZFUklGWSggIShxMSAqIHYxKS5pc0FwcHJveChRdWF0ZXJuaW9ueChBbmdsZUF4aXN4KGFhLmFuZ2xlKCkqMixhYS5heGlzKCkpKSAqIHYxKSApOworICB9CisKKyAgLy8gQW5nbGVBeGlzCisgIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChhLHYxLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYSx2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOworCisgIEFuZ2xlQXhpc3ggYWExOworICBtID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBhYTEgPSBtOworICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3gobSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CisKKyAgLy8gVHJhbnNmb3JtCisgIC8vIFRPRE8gY29tcGxldGUgdGhlIHRlc3RzICEKKyAgYSA9IDA7CisgIHdoaWxlIChhYnMoYSk8U2NhbGFyKDAuMSkpCisgICAgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKDAuNCkqU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKDAuNCkqU2NhbGFyKEVJR0VOX1BJKSk7CisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworICBUcmFuc2Zvcm0zIHQwLCB0MSwgdDI7CisKKyAgLy8gZmlyc3QgdGVzdCBzZXRJZGVudGl0eSgpIGFuZCBJZGVudGl0eSgpCisgIHQwLnNldElkZW50aXR5KCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIFRyYW5zZm9ybTM6Ok1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworICB0MC5tYXRyaXgoKS5zZXRaZXJvKCk7CisgIHQwID0gVHJhbnNmb3JtMzo6SWRlbnRpdHkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgVHJhbnNmb3JtMzo6TWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDEuc2V0SWRlbnRpdHkoKTsKKyAgdjEgPDwgMSwgMiwgMzsKKyAgdDAubGluZWFyKCkgPSBxMS50b1JvdGF0aW9uTWF0cml4KCk7CisgIHQwLnByZXRyYW5zbGF0ZSh2MCk7CisgIHQwLnNjYWxlKHYxKTsKKyAgdDEubGluZWFyKCkgPSBxMS5jb25qdWdhdGUoKS50b1JvdGF0aW9uTWF0cml4KCk7CisgIHQxLnByZXNjYWxlKHYxLmN3aXNlSW52ZXJzZSgpKTsKKyAgdDEudHJhbnNsYXRlKC12MCk7CisKKyAgVkVSSUZZKCh0MCAqIHQxKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworCisgIHQxLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjAsIHExLCB2MSk7CisgIFZFUklGWV9JU19BUFBST1godDEubWF0cml4KCksIHQwLm1hdHJpeCgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOyB0MC5zY2FsZSh2MCkucm90YXRlKHExLnRvUm90YXRpb25NYXRyaXgoKSk7CisgIHQxLnNldElkZW50aXR5KCk7IHQxLnNjYWxlKHYwKS5yb3RhdGUocTEpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsgdDAuc2NhbGUodjApLnJvdGF0ZShBbmdsZUF4aXN4KHExKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHQwLnNjYWxlKGEpLm1hdHJpeCgpLCB0MS5zY2FsZShWZWN0b3IzOjpDb25zdGFudChhKSkubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLnByZXNjYWxlKGEpLm1hdHJpeCgpLCB0MS5wcmVzY2FsZShWZWN0b3IzOjpDb25zdGFudChhKSkubWF0cml4KCkpOworCisgIC8vIE1vcmUgdHJhbnNmb3JtIGNvbnN0cnVjdG9ycywgb3BlcmF0b3I9LCBvcGVyYXRvcio9CisKKyAgTWF0cml4MyBtYXQzID0gTWF0cml4Mzo6UmFuZG9tKCk7CisgIE1hdHJpeDQgbWF0NDsKKyAgbWF0NCA8PCBtYXQzICwgVmVjdG9yMzo6WmVybygpICwgVmVjdG9yNDo6WmVybygpLnRyYW5zcG9zZSgpOworICBUcmFuc2Zvcm0zIHRtYXQzKG1hdDMpLCB0bWF0NChtYXQ0KTsKKyAgaWYoTW9kZSE9aW50KEFmZmluZUNvbXBhY3QpKQorICAgIHRtYXQ0Lm1hdHJpeCgpKDMsMykgPSBTY2FsYXIoMSk7CisgIFZFUklGWV9JU19BUFBST1godG1hdDMubWF0cml4KCksIHRtYXQ0Lm1hdHJpeCgpKTsKKworICBTY2FsYXIgYTMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOworICBWZWN0b3IzIHYzID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpOworICBBbmdsZUF4aXN4IGFhMyhhMywgdjMpOworICBUcmFuc2Zvcm0zIHQzKGFhMyk7CisgIFRyYW5zZm9ybTMgdDQ7CisgIHQ0ID0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnJvdGF0ZShBbmdsZUF4aXN4KC1hMyx2MykpOworICBWRVJJRllfSVNfQVBQUk9YKHQ0Lm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKyAgdDQgKj0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisKKyAgZG8geworICAgIHYzID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgICAgZG9udF9vdmVyX29wdGltaXplKHYzKTsKKyAgfSB3aGlsZSAodjMuY3dpc2VBYnMoKS5taW5Db2VmZigpPE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworICBUcmFuc2xhdGlvbjMgdHYzKHYzKTsKKyAgVHJhbnNmb3JtMyB0NSh0djMpOworICB0NCA9IHR2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NS5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworICB0NC50cmFuc2xhdGUoKC12MykuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NC5tYXRyaXgoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisgIHQ0ICo9IHR2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NS5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworCisgIEFsaWduZWRTY2FsaW5nMyBzdjModjMpOworICBUcmFuc2Zvcm0zIHQ2KHN2Myk7CisgIHQ0ID0gc3YzOworICBWRVJJRllfSVNfQVBQUk9YKHQ2Lm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnNjYWxlKHYzLmN3aXNlSW52ZXJzZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NC5tYXRyaXgoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisgIHQ0ICo9IHN2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0Ni5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworCisgIC8vIG1hdHJpeCAqIHRyYW5zZm9ybQorICBWRVJJRllfSVNfQVBQUk9YKCh0My5tYXRyaXgoKSp0NCkubWF0cml4KCksICh0Myp0NCkubWF0cml4KCkpOworCisgIC8vIGNoYWluZWQgVHJhbnNmb3JtIHByb2R1Y3QKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKHQzKnQ0KSp0NSkubWF0cml4KCksICh0MyoodDQqdDUpKS5tYXRyaXgoKSk7CisKKyAgLy8gY2hlY2sgdGhhdCBUcmFuc2Zvcm0gcHJvZHVjdCBkb2Vzbid0IGhhdmUgYWxpYXNpbmcgcHJvYmxlbXMKKyAgdDUgPSB0NDsKKyAgdDUgPSB0NSp0NTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NSwgdDQqdDQpOworCisgIC8vIDJEIHRyYW5zZm9ybWF0aW9uCisgIFRyYW5zZm9ybTIgdDIwLCB0MjE7CisgIFZlY3RvcjIgdjIwID0gVmVjdG9yMjo6UmFuZG9tKCk7CisgIFZlY3RvcjIgdjIxID0gVmVjdG9yMjo6UmFuZG9tKCk7CisgIGZvciAoaW50IGs9MDsgazwyOyArK2spCisgICAgaWYgKGFicyh2MjFba10pPFNjYWxhcigxZS0zKSkgdjIxW2tdID0gU2NhbGFyKDFlLTMpOworICB0MjEuc2V0SWRlbnRpdHkoKTsKKyAgdDIxLmxpbmVhcigpID0gUm90YXRpb24yRDxTY2FsYXI+KGEpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MjAuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MjAsYSx2MjEpLm1hdHJpeCgpLAorICAgIHQyMS5wcmV0cmFuc2xhdGUodjIwKS5zY2FsZSh2MjEpLm1hdHJpeCgpKTsKKworICB0MjEuc2V0SWRlbnRpdHkoKTsKKyAgdDIxLmxpbmVhcigpID0gUm90YXRpb24yRDxTY2FsYXI+KC1hKS50b1JvdGF0aW9uTWF0cml4KCk7CisgIFZFUklGWSggKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCxhLHYyMSkKKyAgICAgICAgKiAodDIxLnByZXNjYWxlKHYyMS5jd2lzZUludmVyc2UoKSkudHJhbnNsYXRlKC12MjApKSkubWF0cml4KCkuaXNJZGVudGl0eSh0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICk7CisKKyAgLy8gVHJhbnNmb3JtIC0gbmV3IEFQSQorICAvLyAzRAorICB0MC5zZXRJZGVudGl0eSgpOworICB0MC5yb3RhdGUocTEpLnNjYWxlKHYwKS50cmFuc2xhdGUodjApOworICAvLyBtYXQgKiBhbGlnbmVkIHNjYWxpbmcgYW5kIG1hdCAqIHRyYW5zbGF0aW9uCisgIHQxID0gKE1hdHJpeDMocTEpICogQWxpZ25lZFNjYWxpbmczKHYwKSkgKiBUcmFuc2xhdGlvbjModjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIHQxID0gKE1hdHJpeDMocTEpICogRWlnZW46OlNjYWxpbmcodjApKSAqIFRyYW5zbGF0aW9uMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgdDEgPSAocTEgKiBFaWdlbjo6U2NhbGluZyh2MCkpICogVHJhbnNsYXRpb24zKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyBtYXQgKiB0cmFuc2Zvcm1hdGlvbiBhbmQgYWxpZ25lZCBzY2FsaW5nICogdHJhbnNsYXRpb24KKyAgdDEgPSBNYXRyaXgzKHExKSAqIChBbGlnbmVkU2NhbGluZzModjApICogVHJhbnNsYXRpb24zKHYwKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnNjYWxlKHMwKS50cmFuc2xhdGUodjApOworICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwKSAqIFRyYW5zbGF0aW9uMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgdDAucHJlc2NhbGUoczApOworICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwKSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIAorICB0MCA9IHQzOworICB0MC5zY2FsZShzMCk7CisgIHQxID0gdDMgKiBFaWdlbjo6U2NhbGluZyhzMCxzMCxzMCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgdDAucHJlc2NhbGUoczApOworICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwLHMwLHMwKSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgdDAgPSB0MzsKKyAgdDAuc2NhbGUoczApOworICB0MSA9IHQzICogRWlnZW46OlNjYWxpbmcoczApOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIHQwLnByZXNjYWxlKHMwKTsKKyAgdDEgPSBFaWdlbjo6U2NhbGluZyhzMCkgKiB0MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnByZXJvdGF0ZShxMSkucHJlc2NhbGUodjApLnByZXRyYW5zbGF0ZSh2MCk7CisgIC8vIHRyYW5zbGF0aW9uICogYWxpZ25lZCBzY2FsaW5nIGFuZCB0cmFuc2Zvcm1hdGlvbiAqIG1hdAorICB0MSA9IChUcmFuc2xhdGlvbjModjApICogQWxpZ25lZFNjYWxpbmczKHYwKSkgKiBUcmFuc2Zvcm0zKHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyBzY2FsaW5nICogbWF0IGFuZCB0cmFuc2xhdGlvbiAqIG1hdAorICB0MSA9IFRyYW5zbGF0aW9uMyh2MCkgKiAoQWxpZ25lZFNjYWxpbmczKHYwKSAqIFRyYW5zZm9ybTMocTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnNjYWxlKHYwKS50cmFuc2xhdGUodjApLnJvdGF0ZShxMSk7CisgIC8vIHRyYW5zbGF0aW9uICogbWF0IGFuZCBhbGlnbmVkIHNjYWxpbmcgKiB0cmFuc2Zvcm1hdGlvbgorICB0MSA9IEFsaWduZWRTY2FsaW5nMyh2MCkgKiAoVHJhbnNsYXRpb24zKHYwKSAqIFRyYW5zZm9ybTMocTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2Zvcm1hdGlvbiAqIGFsaWduZWQgc2NhbGluZworICB0MC5zY2FsZSh2MCk7CisgIHQxICo9IEFsaWduZWRTY2FsaW5nMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgdDEgPSBBbGlnbmVkU2NhbGluZzModjApICogKFRyYW5zbGF0aW9uMyh2MCkgKiBUcmFuc2Zvcm0zKHExKSk7CisgIHQxID0gdDEgKiB2MC5hc0RpYWdvbmFsKCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gdHJhbnNmb3JtYXRpb24gKiB0cmFuc2xhdGlvbgorICB0MC50cmFuc2xhdGUodjApOworICB0MSA9IHQxICogVHJhbnNsYXRpb24zKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2xhdGlvbiAqIHRyYW5zZm9ybWF0aW9uCisgIHQwLnByZXRyYW5zbGF0ZSh2MCk7CisgIHQxID0gVHJhbnNsYXRpb24zKHYwKSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gdHJhbnNmb3JtICogcXVhdGVybmlvbgorICB0MC5yb3RhdGUocTEpOworICB0MSA9IHQxICogcTE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyB0cmFuc2xhdGlvbiAqIHF1YXRlcm5pb24KKyAgdDAudHJhbnNsYXRlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKFRyYW5zbGF0aW9uMyh2MSkgKiBxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyBhbGlnbmVkIHNjYWxpbmcgKiBxdWF0ZXJuaW9uCisgIHQwLnNjYWxlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKEFsaWduZWRTY2FsaW5nMyh2MSkgKiBxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyBxdWF0ZXJuaW9uICogdHJhbnNmb3JtCisgIHQwLnByZXJvdGF0ZShxMSk7CisgIHQxID0gcTEgKiB0MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiB0cmFuc2xhdGlvbgorICB0MC5yb3RhdGUocTEpLnRyYW5zbGF0ZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBUcmFuc2xhdGlvbjModjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiBhbGlnbmVkIHNjYWxpbmcKKyAgdDAucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBBbGlnbmVkU2NhbGluZzModjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHRlc3QgdHJhbnNmb3JtIGludmVyc2lvbgorICB0MC5zZXRJZGVudGl0eSgpOworICB0MC50cmFuc2xhdGUodjApOworICBkbyB7CisgICAgdDAubGluZWFyKCkuc2V0UmFuZG9tKCk7CisgIH0gd2hpbGUodDAubGluZWFyKCkuamFjb2JpU3ZkKCkuc2luZ3VsYXJWYWx1ZXMoKSgyKTx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpOworICBNYXRyaXg0IHQwNDQgPSBNYXRyaXg0OjpaZXJvKCk7CisgIHQwNDQoMywzKSA9IDE7CisgIHQwNDQuYmxvY2soMCwwLHQwLm1hdHJpeCgpLnJvd3MoKSw0KSA9IHQwLm1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmludmVyc2UoQWZmaW5lKS5tYXRyaXgoKSwgdDA0NC5pbnZlcnNlKCkuYmxvY2soMCwwLHQwLm1hdHJpeCgpLnJvd3MoKSw0KSk7CisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKTsKKyAgdDA0NCA9IE1hdHJpeDQ6Olplcm8oKTsKKyAgdDA0NCgzLDMpID0gMTsKKyAgdDA0NC5ibG9jaygwLDAsdDAubWF0cml4KCkucm93cygpLDQpID0gdDAubWF0cml4KCk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShJc29tZXRyeSkubWF0cml4KCksIHQwNDQuaW52ZXJzZSgpLmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkpOworCisgIE1hdHJpeDMgbWF0X3JvdGF0aW9uLCBtYXRfc2NhbGluZzsKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKS5yb3RhdGUocTEpLnNjYWxlKHYxKTsKKyAgdDAuY29tcHV0ZVJvdGF0aW9uU2NhbGluZygmbWF0X3JvdGF0aW9uLCAmbWF0X3NjYWxpbmcpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmxpbmVhcigpLCBtYXRfcm90YXRpb24gKiBtYXRfc2NhbGluZyk7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uKm1hdF9yb3RhdGlvbi5hZGpvaW50KCksIE1hdHJpeDM6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbi5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworICB0MC5jb21wdXRlU2NhbGluZ1JvdGF0aW9uKCZtYXRfc2NhbGluZywgJm1hdF9yb3RhdGlvbik7CisgIFZFUklGWV9JU19BUFBST1godDAubGluZWFyKCksIG1hdF9zY2FsaW5nICogbWF0X3JvdGF0aW9uKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24qbWF0X3JvdGF0aW9uLmFkam9pbnQoKSwgTWF0cml4Mzo6SWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uLmRldGVybWluYW50KCksIFNjYWxhcigxKSk7CisKKyAgLy8gdGVzdCBjYXN0aW5nCisgIFRyYW5zZm9ybTxmbG9hdCwzLE1vZGU+IHQxZiA9IHQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1godDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHQxKTsKKyAgVHJhbnNmb3JtPGRvdWJsZSwzLE1vZGU+IHQxZCA9IHQxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHQxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSx0MSk7CisKKyAgVHJhbnNsYXRpb24zIHRyMSh2MCk7CisgIFRyYW5zbGF0aW9uPGZsb2F0LDM+IHRyMWYgPSB0cjEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHRyMSk7CisgIFRyYW5zbGF0aW9uPGRvdWJsZSwzPiB0cjFkID0gdHIxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHRyMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdHIxKTsKKworICBBbmdsZUF4aXM8ZmxvYXQ+IGFhMWYgPSBhYTEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGFhMSk7CisgIEFuZ2xlQXhpczxkb3VibGU+IGFhMWQgPSBhYTEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1goYWExZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxhYTEpOworCisgIFJvdGF0aW9uMkQ8U2NhbGFyPiByMmQxKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKKyAgUm90YXRpb24yRDxmbG9hdD4gcjJkMWYgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisgIFJvdGF0aW9uMkQ8ZG91YmxlPiByMmQxZCA9IHIyZDEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisgIAorICBmb3IoaW50IGs9MDsgazwxMDA7ICsraykKKyAgeworICAgIFNjYWxhciBhbmdsZSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAwLDEwMCk7CisgICAgUm90YXRpb24yRDxTY2FsYXI+IHJvdDIoYW5nbGUpOworICAgIFZFUklGWSggcm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSA+PSAwICk7CisgICAgVkVSSUZZKCByb3QyLnNtYWxsZXN0UG9zaXRpdmVBbmdsZSgpIDw9IFNjYWxhcigyKSpTY2FsYXIoRUlHRU5fUEkpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggYW5nbGVUb1ZlYyhyb3QyLnNtYWxsZXN0UG9zaXRpdmVBbmdsZSgpKSwgYW5nbGVUb1ZlYyhyb3QyLmFuZ2xlKCkpICk7CisgICAgCisgICAgVkVSSUZZKCByb3QyLnNtYWxsZXN0QW5nbGUoKSA+PSAtU2NhbGFyKEVJR0VOX1BJKSApOworICAgIFZFUklGWSggcm90Mi5zbWFsbGVzdEFuZ2xlKCkgPD0gIFNjYWxhcihFSUdFTl9QSSkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBhbmdsZVRvVmVjKHJvdDIuc21hbGxlc3RBbmdsZSgpKSwgYW5nbGVUb1ZlYyhyb3QyLmFuZ2xlKCkpICk7CisKKyAgICBNYXRyaXg8U2NhbGFyLDIsMj4gcm90Ml9hc19tYXQocm90Mik7CisgICAgUm90YXRpb24yRDxTY2FsYXI+IHJvdDMocm90Ml9hc19tYXQpOworICAgIFZFUklGWV9JU19BUFBST1goIGFuZ2xlVG9WZWMocm90Mi5zbWFsbGVzdEFuZ2xlKCkpLCAgYW5nbGVUb1ZlYyhyb3QzLmFuZ2xlKCkpICk7CisgIH0KKworICBzMCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAwLDEwMCk7CisgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xMDAsMTAwKTsKKyAgUm90YXRpb24yRDxTY2FsYXI+IFIwKHMwKSwgUjEoczEpOworICAKKyAgdDIwID0gVHJhbnNsYXRpb24yKHYyMCkgKiAoUjAgKiBFaWdlbjo6U2NhbGluZyhzMCkpOworICB0MjEgPSBUcmFuc2xhdGlvbjIodjIwKSAqIFIwICogRWlnZW46OlNjYWxpbmcoczApOworICBWRVJJRllfSVNfQVBQUk9YKHQyMCx0MjEpOworICAKKyAgdDIwID0gVHJhbnNsYXRpb24yKHYyMCkgKiAoUjAgKiBSMC5pbnZlcnNlKCkgKiBFaWdlbjo6U2NhbGluZyhzMCkpOworICB0MjEgPSBUcmFuc2xhdGlvbjIodjIwKSAqIEVpZ2VuOjpTY2FsaW5nKHMwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MjAsdDIxKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goczAsIChSMC5zbGVycCgwLCBSMSkpLmFuZ2xlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCBhbmdsZVRvVmVjKFIxLnNtYWxsZXN0UG9zaXRpdmVBbmdsZSgpKSwgYW5nbGVUb1ZlYygoUjAuc2xlcnAoMSwgUjEpKS5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChSMC5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSwgKFIwLnNsZXJwKDAuNSwgUjApKS5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSk7CisKKyAgaWYoc3RkOjpjb3MoczApPjApCisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKChSMC5zbGVycCgwLjUsIFIwLmludmVyc2UoKSkpLnNtYWxsZXN0QW5nbGUoKSwgU2NhbGFyKDEpKTsKKyAgZWxzZQorICAgIFZFUklGWV9JU19BUFBST1goU2NhbGFyKEVJR0VOX1BJKSwgKFIwLnNsZXJwKDAuNSwgUjAuaW52ZXJzZSgpKSkuc21hbGxlc3RQb3NpdGl2ZUFuZ2xlKCkpOworICAKKyAgLy8gQ2hlY2sgcGF0aCBsZW5ndGgKKyAgU2NhbGFyIGwgPSAwOworICBpbnQgcGF0aF9zdGVwcyA9IDEwMDsKKyAgZm9yKGludCBrPTA7IGs8cGF0aF9zdGVwczsgKytrKQorICB7CisgICAgU2NhbGFyIGExID0gUjAuc2xlcnAoU2NhbGFyKGspL1NjYWxhcihwYXRoX3N0ZXBzKSwgUjEpLmFuZ2xlKCk7CisgICAgU2NhbGFyIGEyID0gUjAuc2xlcnAoU2NhbGFyKGsrMSkvU2NhbGFyKHBhdGhfc3RlcHMpLCBSMSkuYW5nbGUoKTsKKyAgICBsICs9IHN0ZDo6YWJzKGEyLWExKTsKKyAgfQorICBWRVJJRlkobDw9U2NhbGFyKEVJR0VOX1BJKSooU2NhbGFyKDEpK051bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkqU2NhbGFyKHBhdGhfc3RlcHMvMikpKTsKKyAgCisgIC8vIGNoZWNrIGJhc2ljIGZlYXR1cmVzCisgIHsKKyAgICBSb3RhdGlvbjJEPFNjYWxhcj4gcjE7ICAgICAgICAgICAvLyBkZWZhdWx0IGN0b3IKKyAgICByMSA9IFJvdGF0aW9uMkQ8U2NhbGFyPihzMCk7ICAgICAvLyBjb3B5IGFzc2lnbm1lbnQKKyAgICBWRVJJRllfSVNfQVBQUk9YKHIxLmFuZ2xlKCksczApOworICAgIFJvdGF0aW9uMkQ8U2NhbGFyPiByMihyMSk7ICAgICAgIC8vIGNvcHkgY3RvcgorICAgIFZFUklGWV9JU19BUFBST1gocjIuYW5nbGUoKSxzMCk7CisgIH0KKworICB7CisgICAgVHJhbnNmb3JtMyB0MzIoTWF0cml4NDo6UmFuZG9tKCkpLCB0MzMsIHQzNDsKKyAgICB0MzQgPSB0MzMgPSB0MzI7CisgICAgdDMyLnNjYWxlKHYwKTsKKyAgICB0MzMqPUFsaWduZWRTY2FsaW5nMyh2MCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0MzIubWF0cml4KCksIHQzMy5tYXRyaXgoKSk7CisgICAgdDMzID0gdDM0ICogQWxpZ25lZFNjYWxpbmczKHYwKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHQzMi5tYXRyaXgoKSwgdDMzLm1hdHJpeCgpKTsKKyAgfQorCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgUCwgdHlwZW5hbWUgUSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgSD4KK3ZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHlfbGVmdChjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgUCYgcCwgY29uc3QgUSYgcSwgY29uc3QgViYgdiwgY29uc3QgSCYgaCkKK3sKKyAgVkVSSUZZX0lTX0FQUFJPWCggcSooYTEqdiksIChxKmExKSp2ICk7CisgIFZFUklGWV9JU19BUFBST1goIHEqKGEyKnYpLCAocSphMikqdiApOworICBWRVJJRllfSVNfQVBQUk9YKCBxKihwKmgpLmhub3JtYWxpemVkKCksICAoKHEqcCkqaCkuaG5vcm1hbGl6ZWQoKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIFAsIHR5cGVuYW1lIFEsIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEg+Cit2b2lkIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5Mihjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgUCYgcCwgY29uc3QgUSYgcSwgY29uc3QgViYgdiwgY29uc3QgSCYgaCkKK3sKKyAgVkVSSUZZX0lTX0FQUFJPWCggYTEqKHEqdiksIChhMSpxKSp2ICk7CisgIFZFUklGWV9JU19BUFBST1goIGEyKihxKnYpLCAoYTIqcSkqdiApOworICBWRVJJRllfSVNfQVBQUk9YKCBwICoocSp2KS5ob21vZ2VuZW91cygpLCAocCAqcSkqdi5ob21vZ2VuZW91cygpICk7CisKKyAgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHlfbGVmdChhMSwgYTIscCwgcSwgdiwgaCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE9wdGlvbnMsdHlwZW5hbWUgUm90YXRpb25UeXBlPgordm9pZCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eShjb25zdCBSb3RhdGlvblR5cGUmIFIpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSsxLDE+IEhWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltLERpbT4gTGluZWFyVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSsxLERpbSsxPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZUNvbXBhY3QsT3B0aW9ucz4gQWZmaW5lQ29tcGFjdFR5cGU7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lLE9wdGlvbnM+IEFmZmluZVR5cGU7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZSxPcHRpb25zPiBQcm9qZWN0aXZlVHlwZTsKKyAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsRGltPiBTY2FsaW5nVHlwZTsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPiBUcmFuc2xhdGlvblR5cGU7CisKKyAgQWZmaW5lQ29tcGFjdFR5cGUgQTFjOyBBMWMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIEFmZmluZUNvbXBhY3RUeXBlIEEyYzsgQTJjLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBBZmZpbmVUeXBlIEExKEExYyk7CisgIEFmZmluZVR5cGUgQTIoQTJjKTsKKyAgUHJvamVjdGl2ZVR5cGUgUDE7IFAxLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisgIFZlY3RvclR5cGUgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20oKTsKKyAgSFZlY3RvclR5cGUgaDEgPSBIVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBMaW5lYXJUeXBlIEwgPSBMaW5lYXJUeXBlOjpSYW5kb20oKTsKKyAgTWF0cml4VHlwZSBNID0gTWF0cml4VHlwZTo6UmFuZG9tKCk7CisKKyAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIEEyLCB2MiwgaDEpICk7CisgIENBTExfU1VCVEVTVCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBBMmMsIHYyLCBoMSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIHYxLmFzRGlhZ29uYWwoKSwgdjIsIGgxKSApOworICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgU2NhbGluZ1R5cGUodjEpLCB2MiwgaDEpICk7CisgIENBTExfU1VCVEVTVCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBTY2FsaW5nKHYxKSwgdjIsIGgxKSApOworICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgU2NhbGluZyhzMSksIHYyLCBoMSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIFRyYW5zbGF0aW9uVHlwZSh2MSksIHYyLCBoMSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eV9sZWZ0KEExYywgQTEsIFAxLCBMLCB2MiwgaDEpICk7CisgIENBTExfU1VCVEVTVCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBSLCB2MiwgaDEpICk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggQTEqKE0qaDEpLCAoQTEqTSkqaDEgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggQTFjKihNKmgxKSwgKEExYypNKSpoMSApOworICBWRVJJRllfSVNfQVBQUk9YKCBQMSooTSpoMSksIChQMSpNKSpoMSApOworCisgIFZFUklGWV9JU19BUFBST1goIE0qKEExKmgxKSwgKE0qQTEpKmgxICk7CisgIFZFUklGWV9JU19BUFBST1goIE0qKEExYypoMSksIChNKkExYykqaDEgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggTSooUDEqaDEpLCAgKChNKlAxKSpoMSkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHRyYW5zZm9ybV9hbGlnbm1lbnQoKQoreworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxQcm9qZWN0aXZlLEF1dG9BbGlnbj4gUHJvamVjdGl2ZTNhOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxQcm9qZWN0aXZlLERvbnRBbGlnbj4gUHJvamVjdGl2ZTN1OworCisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkxWzE2XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTJbMTZdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5M1sxNisxXTsKKyAgU2NhbGFyKiBhcnJheTN1ID0gYXJyYXkzKzE7CisKKyAgUHJvamVjdGl2ZTNhICpwMSA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MSkpIFByb2plY3RpdmUzYTsKKyAgUHJvamVjdGl2ZTN1ICpwMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIFByb2plY3RpdmUzdTsKKyAgUHJvamVjdGl2ZTN1ICpwMyA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBQcm9qZWN0aXZlM3U7CisgIAorICBwMS0+bWF0cml4KCkuc2V0UmFuZG9tKCk7CisgICpwMiA9ICpwMTsKKyAgKnAzID0gKnAxOworCisgIFZFUklGWV9JU19BUFBST1gocDEtPm1hdHJpeCgpLCBwMi0+bWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHAxLT5tYXRyaXgoKSwgcDMtPm1hdHJpeCgpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goICgqcDEpICogKCpwMSksICgqcDIpKigqcDMpKTsKKyAgCisgICNpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRSkgJiYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUz4wCisgIGlmKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCgoOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIFByb2plY3RpdmUzYSkpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4gdm9pZCB0cmFuc2Zvcm1fcHJvZHVjdHMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltKzEsRGltKzE+IE1hdDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLE9wdGlvbnM+IFByb2o7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lLE9wdGlvbnM+IEFmZjsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IEFmZkM7CisKKyAgUHJvaiBwOyBwLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBBZmYgYTsgYS5saW5lYXIoKS5zZXRSYW5kb20oKTsgYS50cmFuc2xhdGlvbigpLnNldFJhbmRvbSgpOworICBBZmZDIGFjID0gYTsKKworICBNYXQgcF9tKHAubWF0cml4KCkpLCBhX20oYS5tYXRyaXgoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgocCpwKS5tYXRyaXgoKSwgcF9tKnBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGEqYSkubWF0cml4KCksIGFfbSphX20pOworICBWRVJJRllfSVNfQVBQUk9YKChwKmEpLm1hdHJpeCgpLCBwX20qYV9tKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYSpwKS5tYXRyaXgoKSwgYV9tKnBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjKmEpLm1hdHJpeCgpLCBhX20qYV9tKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYSphYykubWF0cml4KCksIGFfbSphX20pOworICBWRVJJRllfSVNfQVBQUk9YKChwKmFjKS5tYXRyaXgoKSwgcF9tKmFfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjKnApLm1hdHJpeCgpLCBhX20qcF9tKTsKK30KKwordm9pZCB0ZXN0X2dlb190cmFuc2Zvcm1hdGlvbnMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxBZmZpbmUsQXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggbm9uX3Byb2plY3RpdmVfb25seTxkb3VibGUsQWZmaW5lLEF1dG9BbGlnbj4oKSApKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMigoIHRyYW5zZm9ybWF0aW9uczxmbG9hdCxBZmZpbmVDb21wYWN0LEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIG5vbl9wcm9qZWN0aXZlX29ubHk8ZmxvYXQsQWZmaW5lQ29tcGFjdCxBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCB0cmFuc2Zvcm1fYWxpZ25tZW50PGZsb2F0PigpICkpOworICAgIAorICAgIENBTExfU1VCVEVTVF8zKCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsUHJvamVjdGl2ZSxEb250QWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCB0cmFuc2Zvcm1fYWxpZ25tZW50PGRvdWJsZT4oKSApKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfNCgoIHRyYW5zZm9ybWF0aW9uczxmbG9hdCxBZmZpbmUsUm93TWFqb3J8QXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF80KCggbm9uX3Byb2plY3RpdmVfb25seTxmbG9hdCxBZmZpbmUsUm93TWFqb3I+KCkgKSk7CisgICAgCisgICAgQ0FMTF9TVUJURVNUXzUoKCB0cmFuc2Zvcm1hdGlvbnM8ZG91YmxlLEFmZmluZUNvbXBhY3QsUm93TWFqb3J8QXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF81KCggbm9uX3Byb2plY3RpdmVfb25seTxkb3VibGUsQWZmaW5lQ29tcGFjdCxSb3dNYWpvcj4oKSApKTsKKworICAgIENBTExfU1VCVEVTVF82KCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLFJvd01ham9yfEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsUHJvamVjdGl2ZSxSb3dNYWpvcnxEb250QWxpZ24+KCkgKSk7CisKKworICAgIENBTExfU1VCVEVTVF83KCggdHJhbnNmb3JtX3Byb2R1Y3RzPGRvdWJsZSwzLFJvd01ham9yfEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoIHRyYW5zZm9ybV9wcm9kdWN0czxmbG9hdCwyLEF1dG9BbGlnbj4oKSApKTsKKworICAgIENBTExfU1VCVEVTVF84KCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHk8ZG91YmxlLDIsQ29sTWFqb3I+KFJvdGF0aW9uMkQ8ZG91YmxlPihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSpkb3VibGUoRUlHRU5fUEkpKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTxkb3VibGUsMyxDb2xNYWpvcj4oUXVhdGVybmlvbmQ6OlVuaXRSYW5kb20oKSkgKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGFsZl9mbG9hdC5jcHAgYi90ZXN0L2hhbGZfZmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjQxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hhbGZfZmxvYXQuY3BwCkBAIC0wLDAgKzEsMjY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS9hcmNoL0NVREEvSGFsZi5oPgorCisvLyBNYWtlIHN1cmUgaXQncyBwb3NzaWJsZSB0byBmb3J3YXJkIGRlY2xhcmUgRWlnZW46OmhhbGYKK25hbWVzcGFjZSBFaWdlbiB7CitzdHJ1Y3QgaGFsZjsKK30KKwordXNpbmcgRWlnZW46OmhhbGY7CisKK3ZvaWQgdGVzdF9jb252ZXJzaW9uKCkKK3sKKyAgdXNpbmcgRWlnZW46OmhhbGZfaW1wbDo6X19oYWxmOworCisgIC8vIENvbnZlcnNpb24gZnJvbSBmbG9hdC4KKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoMS4wZikueCwgMHgzYzAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoMC41ZikueCwgMHgzODAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoMC4zMzMzM2YpLngsIDB4MzU1NSk7CisgIFZFUklGWV9JU19FUVVBTChoYWxmKDAuMGYpLngsIDB4MDAwMCk7CisgIFZFUklGWV9JU19FUVVBTChoYWxmKC0wLjBmKS54LCAweDgwMDApOworICBWRVJJRllfSVNfRVFVQUwoaGFsZig2NTUwNC4wZikueCwgMHg3YmZmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoNjU1MzYuMGYpLngsIDB4N2MwMCk7ICAvLyBCZWNvbWVzIGluZmluaXR5LgorCisgIC8vIERlbm9ybWFscy4KKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoLTUuOTYwNDZlLTA4ZikueCwgMHg4MDAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoNS45NjA0NmUtMDhmKS54LCAweDAwMDEpOworICBWRVJJRllfSVNfRVFVQUwoaGFsZigxLjE5MjA5ZS0wN2YpLngsIDB4MDAwMik7CisKKyAgLy8gVmVyaWZ5IHJvdW5kLXRvLW5lYXJlc3QtZXZlbiBiZWhhdmlvci4KKyAgZmxvYXQgdmFsMSA9IGZsb2F0KGhhbGYoX19oYWxmKDB4M2MwMCkpKTsKKyAgZmxvYXQgdmFsMiA9IGZsb2F0KGhhbGYoX19oYWxmKDB4M2MwMSkpKTsKKyAgZmxvYXQgdmFsMyA9IGZsb2F0KGhhbGYoX19oYWxmKDB4M2MwMikpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYoMC41ZiAqICh2YWwxICsgdmFsMikpLngsIDB4M2MwMCk7CisgIFZFUklGWV9JU19FUVVBTChoYWxmKDAuNWYgKiAodmFsMiArIHZhbDMpKS54LCAweDNjMDIpOworCisgIC8vIENvbnZlcnNpb24gZnJvbSBpbnQuCisgIFZFUklGWV9JU19FUVVBTChoYWxmKC0xKS54LCAweGJjMDApOworICBWRVJJRllfSVNfRVFVQUwoaGFsZigwKS54LCAweDAwMDApOworICBWRVJJRllfSVNfRVFVQUwoaGFsZigxKS54LCAweDNjMDApOworICBWRVJJRllfSVNfRVFVQUwoaGFsZigyKS54LCAweDQwMDApOworICBWRVJJRllfSVNfRVFVQUwoaGFsZigzKS54LCAweDQyMDApOworCisgIC8vIENvbnZlcnNpb24gZnJvbSBib29sLgorICBWRVJJRllfSVNfRVFVQUwoaGFsZihmYWxzZSkueCwgMHgwMDAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGhhbGYodHJ1ZSkueCwgMHgzYzAwKTsKKworICAvLyBDb252ZXJzaW9uIHRvIGZsb2F0LgorICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoaGFsZihfX2hhbGYoMHgwMDAwKSkpLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KGhhbGYoX19oYWxmKDB4M2MwMCkpKSwgMS4wZik7CisKKyAgLy8gRGVub3JtYWxzLgorICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KGhhbGYoX19oYWxmKDB4ODAwMSkpKSwgLTUuOTYwNDZlLTA4Zik7CisgIFZFUklGWV9JU19BUFBST1goZmxvYXQoaGFsZihfX2hhbGYoMHgwMDAxKSkpLCA1Ljk2MDQ2ZS0wOGYpOworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KGhhbGYoX19oYWxmKDB4MDAwMikpKSwgMS4xOTIwOWUtMDdmKTsKKworICAvLyBOYU5zIGFuZCBpbmZpbml0aWVzLgorICBWRVJJRlkoIShudW1leHQ6OmlzaW5mKShmbG9hdChoYWxmKDY1NTA0LjBmKSkpKTsgIC8vIExhcmdlc3QgZmluaXRlIG51bWJlci4KKyAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikoZmxvYXQoaGFsZigwLjBmKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShmbG9hdChoYWxmKF9faGFsZigweGZjMDApKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShmbG9hdChoYWxmKF9faGFsZigweGZjMDEpKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShmbG9hdChoYWxmKF9faGFsZigweDdjMDApKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShmbG9hdChoYWxmKF9faGFsZigweDdjMDEpKSkpKTsKKworI2lmICFFSUdFTl9DT01QX01TVkMKKyAgLy8gVmlzdWFsIFN0dWRpbyBlcnJvcnMgb3V0IG9uIGRpdmlzaW9ucyBieSAwCisgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZmxvYXQoaGFsZigwLjAgLyAwLjApKSkpOworICBWRVJJRlkoKG51bWV4dDo6aXNpbmYpKGZsb2F0KGhhbGYoMS4wIC8gMC4wKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShmbG9hdChoYWxmKC0xLjAgLyAwLjApKSkpOworI2VuZGlmCisKKyAgLy8gRXhhY3RseSBzYW1lIGNoZWNrcyBhcyBhYm92ZSwganVzdCBkaXJlY3RseSBvbiB0aGUgaGFsZiByZXByZXNlbnRhdGlvbi4KKyAgVkVSSUZZKCEobnVtZXh0Ojppc2luZikoaGFsZihfX2hhbGYoMHg3YmZmKSkpKTsKKyAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikoaGFsZihfX2hhbGYoMHgwMDAwKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShoYWxmKF9faGFsZigweGZjMDApKSkpOworICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKGhhbGYoX19oYWxmKDB4ZmMwMSkpKSk7CisgIFZFUklGWSgobnVtZXh0Ojppc2luZikoaGFsZihfX2hhbGYoMHg3YzAwKSkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShoYWxmKF9faGFsZigweDdjMDEpKSkpOworCisjaWYgIUVJR0VOX0NPTVBfTVNWQworICAvLyBWaXN1YWwgU3R1ZGlvIGVycm9ycyBvdXQgb24gZGl2aXNpb25zIGJ5IDAKKyAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShoYWxmKDAuMCAvIDAuMCkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShoYWxmKDEuMCAvIDAuMCkpKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShoYWxmKC0xLjAgLyAwLjApKSk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X251bXRyYWl0cygpCit7CisgIHN0ZDo6Y291dCA8PCAiZXBzaWxvbiAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjplcHNpbG9uKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBOdW1UcmFpdHM8aGFsZj46OmVwc2lsb24oKS54IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiaGlnaGVzdCAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjpoaWdoZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBOdW1UcmFpdHM8aGFsZj46OmhpZ2hlc3QoKS54IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibG93ZXN0ICAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+Ojpsb3dlc3QoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IE51bVRyYWl0czxoYWxmPjo6bG93ZXN0KCkueCA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm1pbiAgICAgICAgICAgPSAiIDw8IChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBoYWxmKChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkpLnggPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJkZW5vcm0gbWluICAgID0gIiA8PCAoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6ZGVub3JtX21pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IGhhbGYoKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OmRlbm9ybV9taW4pKCkpLnggPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJpbmZpbml0eSAgICAgID0gIiA8PCBOdW1UcmFpdHM8aGFsZj46OmluZmluaXR5KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBOdW1UcmFpdHM8aGFsZj46OmluZmluaXR5KCkueCA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgInF1aWV0IG5hbiAgICAgPSAiIDw8IE51bVRyYWl0czxoYWxmPjo6cXVpZXRfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBOdW1UcmFpdHM8aGFsZj46OnF1aWV0X05hTigpLnggPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJzaWduYWxpbmcgbmFuID0gIiA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpzaWduYWxpbmdfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpzaWduYWxpbmdfTmFOKCkueCA8PCAiKSIgPDwgc3RkOjplbmRsOworCisgIFZFUklGWShOdW1UcmFpdHM8aGFsZj46OklzU2lnbmVkKTsKKworICBWRVJJRllfSVNfRVFVQUwoIHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OmluZmluaXR5KCkueCwgaGFsZihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkueCApOworICBWRVJJRllfSVNfRVFVQUwoIHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnF1aWV0X05hTigpLngsIGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKS54ICk7CisgIFZFUklGWV9JU19FUVVBTCggc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6c2lnbmFsaW5nX05hTigpLngsIGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnNpZ25hbGluZ19OYU4oKSkueCApOworICBWRVJJRlkoIChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkgPiBoYWxmKDAuZikgKTsKKyAgVkVSSUZZKCAoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6ZGVub3JtX21pbikoKSA+IGhhbGYoMC5mKSApOworICBWRVJJRlkoIChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkvaGFsZigyKSA+IGhhbGYoMC5mKSApOworICBWRVJJRllfSVNfRVFVQUwoIChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpkZW5vcm1fbWluKSgpL2hhbGYoMiksIGhhbGYoMC5mKSApOworfQorCit2b2lkIHRlc3RfYXJpdGhtZXRpYygpCit7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChoYWxmKDIpICsgaGFsZigyKSksIDQpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoaGFsZigyKSArIGhhbGYoLTIpKSwgMCk7CisgIFZFUklGWV9JU19BUFBST1goZmxvYXQoaGFsZigwLjMzMzMzZikgKyBoYWxmKDAuNjY2NjdmKSksIDEuMGYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoaGFsZigyLjBmKSAqIGhhbGYoLTUuNWYpKSwgLTExLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChoYWxmKDEuMGYpIC8gaGFsZigzLjBmKSksIDAuMzMzMzNmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KC1oYWxmKDQwOTYuMGYpKSwgLTQwOTYuMGYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoLWhhbGYoLTQwOTYuMGYpKSwgNDA5Ni4wZik7Cit9CisKK3ZvaWQgdGVzdF9jb21wYXJpc29uKCkKK3sKKyAgVkVSSUZZKGhhbGYoMS4wZikgPiBoYWxmKDAuNWYpKTsKKyAgVkVSSUZZKGhhbGYoMC41ZikgPCBoYWxmKDEuMGYpKTsKKyAgVkVSSUZZKCEoaGFsZigxLjBmKSA8IGhhbGYoMC41ZikpKTsKKyAgVkVSSUZZKCEoaGFsZigwLjVmKSA+IGhhbGYoMS4wZikpKTsKKworICBWRVJJRlkoIShoYWxmKDQuMGYpID4gaGFsZig0LjBmKSkpOworICBWRVJJRlkoIShoYWxmKDQuMGYpIDwgaGFsZig0LjBmKSkpOworCisgIFZFUklGWSghKGhhbGYoMC4wZikgPCBoYWxmKC0wLjBmKSkpOworICBWRVJJRlkoIShoYWxmKC0wLjBmKSA8IGhhbGYoMC4wZikpKTsKKyAgVkVSSUZZKCEoaGFsZigwLjBmKSA+IGhhbGYoLTAuMGYpKSk7CisgIFZFUklGWSghKGhhbGYoLTAuMGYpID4gaGFsZigwLjBmKSkpOworCisgIFZFUklGWShoYWxmKDAuMmYpID4gaGFsZigtMS4wZikpOworICBWRVJJRlkoaGFsZigtMS4wZikgPCBoYWxmKDAuMmYpKTsKKyAgVkVSSUZZKGhhbGYoLTE2LjBmKSA8IGhhbGYoLTE1LjBmKSk7CisKKyAgVkVSSUZZKGhhbGYoMS4wZikgPT0gaGFsZigxLjBmKSk7CisgIFZFUklGWShoYWxmKDEuMGYpICE9IGhhbGYoMi4wZikpOworCisgIC8vIENvbXBhcmlzb25zIHdpdGggTmFOcyBhbmQgaW5maW5pdGllcy4KKyNpZiAhRUlHRU5fQ09NUF9NU1ZDCisgIC8vIFZpc3VhbCBTdHVkaW8gZXJyb3JzIG91dCBvbiBkaXZpc2lvbnMgYnkgMAorICBWRVJJRlkoIShoYWxmKDAuMCAvIDAuMCkgPT0gaGFsZigwLjAgLyAwLjApKSk7CisgIFZFUklGWShoYWxmKDAuMCAvIDAuMCkgIT0gaGFsZigwLjAgLyAwLjApKTsKKworICBWRVJJRlkoIShoYWxmKDEuMCkgPT0gaGFsZigwLjAgLyAwLjApKSk7CisgIFZFUklGWSghKGhhbGYoMS4wKSA8IGhhbGYoMC4wIC8gMC4wKSkpOworICBWRVJJRlkoIShoYWxmKDEuMCkgPiBoYWxmKDAuMCAvIDAuMCkpKTsKKyAgVkVSSUZZKGhhbGYoMS4wKSAhPSBoYWxmKDAuMCAvIDAuMCkpOworCisgIFZFUklGWShoYWxmKDEuMCkgPCBoYWxmKDEuMCAvIDAuMCkpOworICBWRVJJRlkoaGFsZigxLjApID4gaGFsZigtMS4wIC8gMC4wKSk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X2Jhc2ljX2Z1bmN0aW9ucygpCit7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChudW1leHQ6OmFicyhoYWxmKDMuNWYpKSksIDMuNWYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoYWJzKGhhbGYoMy41ZikpKSwgMy41Zik7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChudW1leHQ6OmFicyhoYWxmKC0zLjVmKSkpLCAzLjVmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KGFicyhoYWxmKC0zLjVmKSkpLCAzLjVmKTsKKworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQobnVtZXh0OjpmbG9vcihoYWxmKDMuNWYpKSksIDMuMGYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoZmxvb3IoaGFsZigzLjVmKSkpLCAzLjBmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KG51bWV4dDo6Zmxvb3IoaGFsZigtMy41ZikpKSwgLTQuMGYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoZmxvb3IoaGFsZigtMy41ZikpKSwgLTQuMGYpOworCisgIFZFUklGWV9JU19FUVVBTChmbG9hdChudW1leHQ6OmNlaWwoaGFsZigzLjVmKSkpLCA0LjBmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KGNlaWwoaGFsZigzLjVmKSkpLCA0LjBmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KG51bWV4dDo6Y2VpbChoYWxmKC0zLjVmKSkpLCAtMy4wZik7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChjZWlsKGhhbGYoLTMuNWYpKSksIC0zLjBmKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KG51bWV4dDo6c3FydChoYWxmKDAuMGYpKSksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KHNxcnQoaGFsZigwLjBmKSkpLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OnNxcnQoaGFsZig0LjBmKSkpLCAyLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChzcXJ0KGhhbGYoNC4wZikpKSwgMi4wZik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OnBvdyhoYWxmKDAuMGYpLCBoYWxmKDEuMGYpKSksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KHBvdyhoYWxmKDAuMGYpLCBoYWxmKDEuMGYpKSksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KG51bWV4dDo6cG93KGhhbGYoMi4wZiksIGhhbGYoMi4wZikpKSwgNC4wZik7CisgIFZFUklGWV9JU19BUFBST1goZmxvYXQocG93KGhhbGYoMi4wZiksIGhhbGYoMi4wZikpKSwgNC4wZik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KG51bWV4dDo6ZXhwKGhhbGYoMC4wZikpKSwgMS4wZik7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChleHAoaGFsZigwLjBmKSkpLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OmV4cChoYWxmKEVJR0VOX1BJKSkpLCAyMC5mICsgZmxvYXQoRUlHRU5fUEkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChleHAoaGFsZihFSUdFTl9QSSkpKSwgMjAuZiArIGZsb2F0KEVJR0VOX1BJKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KG51bWV4dDo6bG9nKGhhbGYoMS4wZikpKSwgMC4wZik7CisgIFZFUklGWV9JU19FUVVBTChmbG9hdChsb2coaGFsZigxLjBmKSkpLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OmxvZyhoYWxmKDEwLjBmKSkpLCAyLjMwMjczZik7CisgIFZFUklGWV9JU19BUFBST1goZmxvYXQobG9nKGhhbGYoMTAuMGYpKSksIDIuMzAyNzNmKTsKKworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQobnVtZXh0Ojpsb2cxcChoYWxmKDAuMGYpKSksIDAuMGYpOworICBWRVJJRllfSVNfRVFVQUwoZmxvYXQobG9nMXAoaGFsZigwLjBmKSkpLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OmxvZzFwKGhhbGYoMTAuMGYpKSksIDIuMzk3ODk1M2YpOworICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KGxvZzFwKGhhbGYoMTAuMGYpKSksIDIuMzk3ODk1M2YpOworfQorCit2b2lkIHRlc3RfdHJpZ29ub21ldHJpY19mdW5jdGlvbnMoKQoreworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Y29zKGhhbGYoMC4wZikpLCBoYWxmKGNvc2YoMC4wZikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb3MoaGFsZigwLjBmKSksIGhhbGYoY29zZigwLjBmKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Y29zKGhhbGYoRUlHRU5fUEkpKSwgaGFsZihjb3NmKEVJR0VOX1BJKSkpOworICAvL1ZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb3MoaGFsZihFSUdFTl9QSS8yKSksIGhhbGYoY29zZihFSUdFTl9QSS8yKSkpOworICAvL1ZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb3MoaGFsZigzKkVJR0VOX1BJLzIpKSwgaGFsZihjb3NmKDMqRUlHRU5fUEkvMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OmNvcyhoYWxmKDMuNWYpKSwgaGFsZihjb3NmKDMuNWYpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnNpbihoYWxmKDAuMGYpKSwgaGFsZihzaW5mKDAuMGYpKSk7CisgIFZFUklGWV9JU19BUFBST1goc2luKGhhbGYoMC4wZikpLCBoYWxmKHNpbmYoMC4wZikpKTsKKyAgLy8gIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZihFSUdFTl9QSSkpLCBoYWxmKHNpbmYoRUlHRU5fUEkpKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZihFSUdFTl9QSS8yKSksIGhhbGYoc2luZihFSUdFTl9QSS8yKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6c2luKGhhbGYoMypFSUdFTl9QSS8yKSksIGhhbGYoc2luZigzKkVJR0VOX1BJLzIpKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZigzLjVmKSksIGhhbGYoc2luZigzLjVmKSkpOworCisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojp0YW4oaGFsZigwLjBmKSksIGhhbGYodGFuZigwLjBmKSkpOworICBWRVJJRllfSVNfQVBQUk9YKHRhbihoYWxmKDAuMGYpKSwgaGFsZih0YW5mKDAuMGYpKSk7CisgIC8vICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6dGFuKGhhbGYoRUlHRU5fUEkpKSwgaGFsZih0YW5mKEVJR0VOX1BJKSkpOworICAvLyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnRhbihoYWxmKEVJR0VOX1BJLzIpKSwgaGFsZih0YW5mKEVJR0VOX1BJLzIpKSk7CisgIC8vVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnRhbihoYWxmKDMqRUlHRU5fUEkvMikpLCBoYWxmKHRhbmYoMypFSUdFTl9QSS8yKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6dGFuKGhhbGYoMy41ZikpLCBoYWxmKHRhbmYoMy41ZikpKTsKK30KKwordm9pZCB0ZXN0X2FycmF5KCkKK3sKKyAgdHlwZWRlZiBBcnJheTxoYWxmLDEsRHluYW1pYz4gQXJyYXlYaDsKKyAgSW5kZXggc2l6ZSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTApOworICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzaXplLTEpOworICBBcnJheVhoIGExID0gQXJyYXlYaDo6UmFuZG9tKHNpemUpLCBhMiA9IEFycmF5WGg6OlJhbmRvbShzaXplKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggYTErYTEsIGhhbGYoMikqYTEgKTsKKyAgVkVSSUZZKCAoYTEuYWJzKCkgPj0gaGFsZigwKSkuYWxsKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKGExKmExKS5zcXJ0KCksIGExLmFicygpICk7CisKKyAgVkVSSUZZKCAoKGExLm1pbikoYTIpIDw9IChhMS5tYXgpKGEyKSkuYWxsKCkgKTsKKyAgYTEoaSkgPSBoYWxmKC0xMC4pOworICBWRVJJRllfSVNfRVFVQUwoIGExLm1pbkNvZWZmKCksIGhhbGYoLTEwLikgKTsKKyAgYTEoaSkgPSBoYWxmKDEwLik7CisgIFZFUklGWV9JU19FUVVBTCggYTEubWF4Q29lZmYoKSwgaGFsZigxMC4pICk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IGExOworfQorCit2b2lkIHRlc3RfaGFsZl9mbG9hdCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbnZlcnNpb24oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X251bXRyYWl0cygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJpdGhtZXRpYygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29tcGFyaXNvbigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYmFzaWNfZnVuY3Rpb25zKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90cmlnb25vbWV0cmljX2Z1bmN0aW9ucygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJyYXkoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hlc3NlbmJlcmcuY3BwIGIvdGVzdC9oZXNzZW5iZXJnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmJjMTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oZXNzZW5iZXJnLmNwcApAQCAtMCwwICsxLDYyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplPiB2b2lkIGhlc3NlbmJlcmcoaW50IHNpemUgPSBTaXplKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSxTaXplPiBNYXRyaXhUeXBlOworCisgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogQSA9IFUgSCBVKiBhbmQgSCBpcyBIZXNzZW5iZXJnCisgIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7CisgICAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgICAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4VHlwZT4gaGVzcyhtKTsKKyAgICBNYXRyaXhUeXBlIFEgPSBoZXNzLm1hdHJpeFEoKTsKKyAgICBNYXRyaXhUeXBlIEggPSBoZXNzLm1hdHJpeEgoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIFEgKiBIICogUS5hZGpvaW50KCkpOworICAgIGZvcihpbnQgcm93ID0gMjsgcm93IDwgc2l6ZTsgKytyb3cpIHsKKyAgICAgIGZvcihpbnQgY29sID0gMDsgY29sIDwgcm93LTE7ICsrY29sKSB7CisJVkVSSUZZKEgocm93LGNvbCkgPT0gKHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcikwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUZXN0IHdoZXRoZXIgY29tcHV0ZSgpIGFuZCBjb25zdHJ1Y3RvciByZXR1cm5zIHNhbWUgcmVzdWx0CisgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4VHlwZT4gY3MxOworICBjczEuY29tcHV0ZShBKTsKKyAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4VHlwZT4gY3MyKEEpOworICBWRVJJRllfSVNfRVFVQUwoY3MxLm1hdHJpeEgoKS5ldmFsKCksIGNzMi5tYXRyaXhIKCkuZXZhbCgpKTsKKyAgTWF0cml4VHlwZSBjczFRID0gY3MxLm1hdHJpeFEoKTsKKyAgTWF0cml4VHlwZSBjczJRID0gY3MyLm1hdHJpeFEoKTsgIAorICBWRVJJRllfSVNfRVFVQUwoY3MxUSwgY3MyUSk7CisKKyAgLy8gVGVzdCBhc3NlcnRpb25zIGZvciB3aGVuIHVzZWQgdW5pbml0aWFsaXplZAorICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBoZXNzVW5pbml0aWFsaXplZDsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIGhlc3NVbmluaXRpYWxpemVkLm1hdHJpeEgoKSApOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCggaGVzc1VuaW5pdGlhbGl6ZWQubWF0cml4USgpICk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBoZXNzVW5pbml0aWFsaXplZC5ob3VzZWhvbGRlckNvZWZmaWNpZW50cygpICk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBoZXNzVW5pbml0aWFsaXplZC5wYWNrZWRNYXRyaXgoKSApOworCisgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3IgcGFja2VkTWF0cml4KCkgYW5kIGhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCkKK30KKwordm9pZCB0ZXN0X2hlc3NlbmJlcmcoKQoreworICBDQUxMX1NVQlRFU1RfMSgoIGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4sMT4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIoKCBoZXNzZW5iZXJnPHN0ZDo6Y29tcGxleDxkb3VibGU+LDI+KCkgKSk7CisgIENBTExfU1VCVEVTVF8zKCggaGVzc2VuYmVyZzxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDQ+KCkgKSk7CisgIENBTExfU1VCVEVTVF80KCggaGVzc2VuYmVyZzxmbG9hdCxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgIENBTExfU1VCVEVTVF81KCggaGVzc2VuYmVyZzxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF82KEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFhmPigxMCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9ob3VzZWhvbGRlci5jcHAgYi90ZXN0L2hvdXNlaG9sZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY2YjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ob3VzZWhvbGRlci5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGhvdXNlaG9sZGVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBib29sIGV2ZW4gPSB0cnVlOworICBldmVuID0gIWV2ZW47CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgSG91c2Vob2xkZXIuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBpbnRlcm5hbDo6ZGVjcmVtZW50X3NpemU8TWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+OjpyZXQsIDE+IEVzc2VudGlhbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBIQmxvY2tNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IEhDb2VmZnNWZWN0b3JUeXBlOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBUTWF0cml4VHlwZTsKKyAgCisgIE1hdHJpeDxTY2FsYXIsIEVJR0VOX1NJWkVfTUFYKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSwgMT4gX3RtcCgoc3RkOjptYXgpKHJvd3MsY29scykpOworICBTY2FsYXIqIHRtcCA9ICZfdG1wLmNvZWZmUmVmKDAsMCk7CisKKyAgU2NhbGFyIGJldGE7CisgIFJlYWxTY2FsYXIgYWxwaGE7CisgIEVzc2VudGlhbFZlY3RvclR5cGUgZXNzZW50aWFsOworCisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHYyOworICB2MiA9IHYxOworICB2MS5tYWtlSG91c2Vob2xkZXIoZXNzZW50aWFsLCBiZXRhLCBhbHBoYSk7CisgIHYxLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5ub3JtKCksIHYyLm5vcm0oKSk7CisgIGlmKHJvd3M+PTIpIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MS50YWlsKHJvd3MtMSkubm9ybSgpLCB2MS5ub3JtKCkpOworICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgdjIgPSB2MTsKKyAgdjEuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWwsYmV0YSx0bXApOworICBWRVJJRllfSVNfQVBQUk9YKHYxLm5vcm0oKSwgdjIubm9ybSgpKTsKKworICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yKHJvd3MsIGNvbHMpOworCisgIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBpZihldmVuKSB2MS50YWlsKHJvd3MtMSkuc2V0WmVybygpOworICBtMS5jb2x3aXNlKCkgPSB2MTsKKyAgbTIgPSBtMTsKKyAgbTEuY29sKDApLm1ha2VIb3VzZWhvbGRlcihlc3NlbnRpYWwsIGJldGEsIGFscGhhKTsKKyAgbTEuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWwsYmV0YSx0bXApOworICBWRVJJRllfSVNfQVBQUk9YKG0xLm5vcm0oKSwgbTIubm9ybSgpKTsKKyAgaWYocm93cz49MikgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0xLmJsb2NrKDEsMCxyb3dzLTEsY29scykubm9ybSgpLCBtMS5ub3JtKCkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obnVtZXh0OjppbWFnKG0xKDAsMCkpLCBudW1leHQ6OnJlYWwobTEoMCwwKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cmVhbChtMSgwLDApKSwgYWxwaGEpOworCisgIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBpZihldmVuKSB2MS50YWlsKHJvd3MtMSkuc2V0WmVybygpOworICBTcXVhcmVNYXRyaXhUeXBlIG0zKHJvd3Mscm93cyksIG00KHJvd3Mscm93cyk7CisgIG0zLnJvd3dpc2UoKSA9IHYxLnRyYW5zcG9zZSgpOworICBtNCA9IG0zOworICBtMy5yb3coMCkubWFrZUhvdXNlaG9sZGVyKGVzc2VudGlhbCwgYmV0YSwgYWxwaGEpOworICBtMy5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChlc3NlbnRpYWwsYmV0YSx0bXApOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vcm0oKSwgbTQubm9ybSgpKTsKKyAgaWYocm93cz49MikgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0zLmJsb2NrKDAsMSxyb3dzLHJvd3MtMSkubm9ybSgpLCBtMy5ub3JtKCkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obnVtZXh0OjppbWFnKG0zKDAsMCkpLCBudW1leHQ6OnJlYWwobTMoMCwwKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cmVhbChtMygwLDApKSwgYWxwaGEpOworCisgIC8vIHRlc3QgaG91c2Vob2xkZXIgc2VxdWVuY2Ugb24gdGhlIGxlZnQgd2l0aCBhIHNoaWZ0CisKKyAgSW5kZXggc2hpZnQgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzdGQ6Om1heDxJbmRleD4ocm93cy0yLDApKTsKKyAgSW5kZXggYnJvd3MgPSByb3dzIC0gc2hpZnQ7CisgIG0xLnNldFJhbmRvbShyb3dzLCBjb2xzKTsKKyAgSEJsb2NrTWF0cml4VHlwZSBoYm0gPSBtMS5ibG9jayhzaGlmdCwwLGJyb3dzLGNvbHMpOworICBIb3VzZWhvbGRlclFSPEhCbG9ja01hdHJpeFR5cGU+IHFyKGhibSk7CisgIG0yID0gbTE7CisgIG0yLmJsb2NrKHNoaWZ0LDAsYnJvd3MsY29scykgPSBxci5tYXRyaXhRUigpOworICBIQ29lZmZzVmVjdG9yVHlwZSBoYyA9IHFyLmhDb2VmZnMoKS5jb25qdWdhdGUoKTsKKyAgSG91c2Vob2xkZXJTZXF1ZW5jZTxNYXRyaXhUeXBlLCBIQ29lZmZzVmVjdG9yVHlwZT4gaHNlcShtMiwgaGMpOworICBoc2VxLnNldExlbmd0aChoYy5zaXplKCkpLnNldFNoaWZ0KHNoaWZ0KTsKKyAgVkVSSUZZKGhzZXEubGVuZ3RoKCkgPT0gaGMuc2l6ZSgpKTsKKyAgVkVSSUZZKGhzZXEuc2hpZnQoKSA9PSBzaGlmdCk7CisgIAorICBNYXRyaXhUeXBlIG01ID0gbTI7CisgIG01LmJsb2NrKHNoaWZ0LDAsYnJvd3MsY29scykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goaHNlcSAqIG01LCBtMSk7IC8vIHRlc3QgYXBwbHlpbmcgaHNlcSBkaXJlY3RseQorICBtMyA9IGhzZXE7CisgIFZFUklGWV9JU19BUFBST1gobTMgKiBtNSwgbTEpOyAvLyB0ZXN0IGV2YWx1YXRpbmcgaHNlcSB0byBhIGRlbnNlIG1hdHJpeCwgdGhlbiBhcHBseWluZworICAKKyAgU3F1YXJlTWF0cml4VHlwZSBoc2VxX21hdCA9IGhzZXE7CisgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfY29uaiA9IGhzZXEuY29uanVnYXRlKCk7CisgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfYWRqID0gaHNlcS5hZGpvaW50KCk7CisgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfdHJhbnMgPSBoc2VxLnRyYW5zcG9zZSgpOworICBTcXVhcmVNYXRyaXhUeXBlIG02ID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LmFkam9pbnQoKSwgICAgaHNlcV9tYXRfYWRqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChoc2VxX21hdC5jb25qdWdhdGUoKSwgIGhzZXFfbWF0X2NvbmopOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LnRyYW5zcG9zZSgpLCAgaHNlcV9tYXRfdHJhbnMpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0ICogbTYsICAgICAgICAgICAgIGhzZXFfbWF0ICogbTYpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LmFkam9pbnQoKSAqIG02LCAgIGhzZXFfbWF0X2FkaiAqIG02KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChoc2VxX21hdC5jb25qdWdhdGUoKSAqIG02LCBoc2VxX21hdF9jb25qICogbTYpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LnRyYW5zcG9zZSgpICogbTYsIGhzZXFfbWF0X3RyYW5zICogbTYpOworICBWRVJJRllfSVNfQVBQUk9YKG02ICogaHNlcV9tYXQsICAgICAgICAgICAgIG02ICogaHNlcV9tYXQpOworICBWRVJJRllfSVNfQVBQUk9YKG02ICogaHNlcV9tYXQuYWRqb2ludCgpLCAgIG02ICogaHNlcV9tYXRfYWRqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNiAqIGhzZXFfbWF0LmNvbmp1Z2F0ZSgpLCBtNiAqIGhzZXFfbWF0X2NvbmopOworICBWRVJJRllfSVNfQVBQUk9YKG02ICogaHNlcV9tYXQudHJhbnNwb3NlKCksIG02ICogaHNlcV9tYXRfdHJhbnMpOworCisgIC8vIHRlc3QgaG91c2Vob2xkZXIgc2VxdWVuY2Ugb24gdGhlIHJpZ2h0IHdpdGggYSBzaGlmdAorCisgIFRNYXRyaXhUeXBlIHRtMiA9IG0yLnRyYW5zcG9zZSgpOworICBIb3VzZWhvbGRlclNlcXVlbmNlPFRNYXRyaXhUeXBlLCBIQ29lZmZzVmVjdG9yVHlwZSwgT25UaGVSaWdodD4gcmhzZXEodG0yLCBoYyk7CisgIHJoc2VxLnNldExlbmd0aChoYy5zaXplKCkpLnNldFNoaWZ0KHNoaWZ0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHNlcSAqIG01LCBtMSk7IC8vIHRlc3QgYXBwbHlpbmcgcmhzZXEgZGlyZWN0bHkKKyAgbTMgPSByaHNlcTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyAqIG01LCBtMSk7IC8vIHRlc3QgZXZhbHVhdGluZyByaHNlcSB0byBhIGRlbnNlIG1hdHJpeCwgdGhlbiBhcHBseWluZworfQorCit2b2lkIHRlc3RfaG91c2Vob2xkZXIoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBob3VzZWhvbGRlcihNYXRyaXg8ZG91YmxlLDIsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaG91c2Vob2xkZXIoTWF0cml4PGZsb2F0LDIsMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggaG91c2Vob2xkZXIoTWF0cml4PGRvdWJsZSwzLDU+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGhvdXNlaG9sZGVyKE1hdHJpeDxmbG9hdCw0LDQ+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGhvdXNlaG9sZGVyKE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggaG91c2Vob2xkZXIoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggaG91c2Vob2xkZXIoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF84KCBob3VzZWhvbGRlcihNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9pbmNvbXBsZXRlX2Nob2xlc2t5LmNwcCBiL3Rlc3QvaW5jb21wbGV0ZV9jaG9sZXNreS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmZmU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW5jb21wbGV0ZV9jaG9sZXNreS5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisvLyAjZGVmaW5lIEVJR0VOX0RPTlRfVkVDVE9SSVpFCisvLyAjZGVmaW5lIEVJR0VOX01BWF9BTElHTl9CWVRFUyAwCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vSXRlcmF0aXZlU29sdmVycz4KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgST4gdm9pZCB0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVCgpCit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFQsMCxJPiBTcGFyc2VNYXRyaXhUeXBlOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIExvd2VyLCBBTURPcmRlcmluZzxJPiA+ID4gICAgICAgIGNnX2lsbHRfbG93ZXJfYW1kOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIExvd2VyLCBOYXR1cmFsT3JkZXJpbmc8ST4gPiA+ICAgIGNnX2lsbHRfbG93ZXJfbmF0OworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIFVwcGVyLCBBTURPcmRlcmluZzxJPiA+ID4gICAgICAgIGNnX2lsbHRfdXBwZXJfYW1kOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIFVwcGVyLCBOYXR1cmFsT3JkZXJpbmc8ST4gPiA+ICAgIGNnX2lsbHRfdXBwZXJfbmF0OworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlcnxMb3dlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIExvd2VyLCBBTURPcmRlcmluZzxJPiA+ID4gIGNnX2lsbHRfdXBsb19hbWQ7CisgIAorCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2lsbHRfbG93ZXJfYW1kKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19pbGx0X2xvd2VyX25hdCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfaWxsdF91cHBlcl9hbWQpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2lsbHRfdXBwZXJfbmF0KSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19pbGx0X3VwbG9fYW1kKSApOworfQorCit2b2lkIHRlc3RfaW5jb21wbGV0ZV9jaG9sZXNreSgpCit7CisgIENBTExfU1VCVEVTVF8xKCggdGVzdF9pbmNvbXBsZXRlX2Nob2xlc2t5X1Q8ZG91YmxlLGludD4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIoKCB0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50PigpICkpOworICBDQUxMX1NVQlRFU1RfMygoIHRlc3RfaW5jb21wbGV0ZV9jaG9sZXNreV9UPGRvdWJsZSxsb25nIGludD4oKSApKTsKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xCisgICAgLy8gcmVncmVzc2lvbiBmb3IgYnVnIDExNTAKKyAgZm9yKGludCBOID0gMTsgTjwyMDsgKytOKQorICB7CisgICAgRWlnZW46Ok1hdHJpeFhkIGIoIE4sIE4gKTsKKyAgICBiLnNldE9uZXMoKTsKKworICAgIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBtKCBOLCBOICk7CisgICAgbS5yZXNlcnZlKEVpZ2VuOjpWZWN0b3JYaTo6Q29uc3RhbnQoTiw0KSk7CisgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBOOyArK2kgKQorICAgIHsKKyAgICAgICAgbS5pbnNlcnQoIGksIGkgKSA9IDE7CisgICAgICAgIG0uY29lZmZSZWYoIGksIGkgLyAyICkgPSAyOworICAgICAgICBtLmNvZWZmUmVmKCBpLCBpIC8gMyApID0gMjsKKyAgICAgICAgbS5jb2VmZlJlZiggaSwgaSAvIDQgKSA9IDI7CisgICAgfQorCisgICAgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IEE7CisgICAgQSA9IG0gKiBtLnRyYW5zcG9zZSgpOworCisgICAgRWlnZW46OkNvbmp1Z2F0ZUdyYWRpZW50PEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiwKKyAgICAgICAgRWlnZW46Okxvd2VyIHwgRWlnZW46OlVwcGVyLAorICAgICAgICBFaWdlbjo6SW5jb21wbGV0ZUNob2xlc2t5PGRvdWJsZT4gPiBzb2x2ZXIoIEEgKTsKKyAgICBWRVJJRlkoc29sdmVyLnByZWNvbmRpdGlvbmVyKCkuaW5mbygpID09IEVpZ2VuOjpTdWNjZXNzKTsKKyAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBFaWdlbjo6U3VjY2Vzcyk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9pbnBsYWNlX2RlY29tcG9zaXRpb24uY3BwIGIvdGVzdC9pbnBsYWNlX2RlY29tcG9zaXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDBkOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2lucGxhY2VfZGVjb21wb3NpdGlvbi5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKworLy8gVGhpcyBmaWxlIHRlc3QgaW5wbGFjZSBkZWNvbXBvc2l0aW9uIHRocm91Z2ggUmVmPD4sIGFzIHN1cHBvcnRlZCBieSBDaG9sZXNreSwgTFUsIGFuZCBRUiBkZWNvbXBvc2l0aW9ucy4KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVjVHlwZSx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGlucGxhY2UoYm9vbCBzcXVhcmUgPSBmYWxzZSwgYm9vbCBTUEQgPSBmYWxzZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSaHNUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBSZXNUeXBlOworCisgIEluZGV4IHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSA6IEluZGV4KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKTsKKyAgSW5kZXggY29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljID8gKHNxdWFyZT9yb3dzOmludGVybmFsOjpyYW5kb208SW5kZXg+KDIscm93cykpICAgIDogSW5kZXgoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpOworCisgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBSaHNUeXBlIGIgPSBSaHNUeXBlOjpSYW5kb20ocm93cyk7CisgIFJlc1R5cGUgeChjb2xzKTsKKworICBpZihTUEQpCisgIHsKKyAgICBhc3NlcnQoc3F1YXJlKTsKKyAgICBBLnRvcFJvd3MoY29scykgPSBBLnRvcFJvd3MoY29scykuYWRqb2ludCgpICogQS50b3BSb3dzKGNvbHMpOworICAgIEEuZGlhZ29uYWwoKS5hcnJheSgpICs9IDFlLTM7CisgIH0KKworICBNYXRyaXhUeXBlIEEwID0gQTsKKyAgTWF0cml4VHlwZSBBMSA9IEE7CisKKyAgRGVjVHlwZSBkZWMoQSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udGVudCBvZiBBIGhhcyBiZWVuIG1vZGlmaWVkCisgIFZFUklGWV9JU19OT1RfQVBQUk9YKCBBLCBBMCApOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGRlY29tcG9zaXRpb24gaXMgY29ycmVjdDoKKyAgaWYocm93cz09Y29scykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goIEEwICogKHggPSBkZWMuc29sdmUoYikpLCBiICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiICk7CisgIH0KKworICAvLyBDaGVjayB0aGF0IG1vZGlmeWluZyBBIGJyZWFrcyB0aGUgY3VycmVudCBkZWM6CisgIEEuc2V0UmFuZG9tKCk7CisgIGlmKHJvd3M9PWNvbHMpCisgIHsKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQTAgKiAoeCA9IGRlYy5zb2x2ZShiKSksIGIgKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiICk7CisgIH0KKworICAvLyBDaGVjayB0aGF0IGNhbGxpbmcgY29tcHV0ZShBMSkgZG9lcyBub3QgbW9kaWZ5IEExOgorICBBID0gQTA7CisgIGRlYy5jb21wdXRlKEExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKEEwLEExKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goIEEsIEEwICk7CisgIGlmKHJvd3M9PWNvbHMpCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgYiApOworICB9CisgIGVsc2UKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goIEEwLnRyYW5zcG9zZSgpICogQTAgKiAoeCA9IGRlYy5zb2x2ZShiKSksIEEwLnRyYW5zcG9zZSgpICogYiApOworICB9Cit9CisKKwordm9pZCB0ZXN0X2lucGxhY2VfZGVjb21wb3NpdGlvbigpCit7CisgIEVJR0VOX1VOVVNFRCB0eXBlZGVmIE1hdHJpeDxkb3VibGUsNCwzPiBNYXRyaXg0M2Q7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBpbnBsYWNlPExMVDxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPih0cnVlLHRydWUpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggaW5wbGFjZTxMTFQ8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSx0cnVlKSApKTsKKworICAgIENBTExfU1VCVEVTVF8yKCggaW5wbGFjZTxMRExUPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KHRydWUsdHJ1ZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBpbnBsYWNlPExETFQ8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSx0cnVlKSApKTsKKworICAgIENBTExfU1VCVEVTVF8zKCggaW5wbGFjZTxQYXJ0aWFsUGl2TFU8UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4odHJ1ZSxmYWxzZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBpbnBsYWNlPFBhcnRpYWxQaXZMVTxSZWY8TWF0cml4NGQ+ID4sIE1hdHJpeDRkPih0cnVlLGZhbHNlKSApKTsKKworICAgIENBTExfU1VCVEVTVF80KCggaW5wbGFjZTxGdWxsUGl2TFU8UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4odHJ1ZSxmYWxzZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBpbnBsYWNlPEZ1bGxQaXZMVTxSZWY8TWF0cml4NGQ+ID4sIE1hdHJpeDRkPih0cnVlLGZhbHNlKSApKTsKKworICAgIENBTExfU1VCVEVTVF81KCggaW5wbGFjZTxIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KGZhbHNlLGZhbHNlKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGlucGxhY2U8SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4NDNkPiA+LCBNYXRyaXg0M2Q+KGZhbHNlLGZhbHNlKSApKTsKKworICAgIENBTExfU1VCVEVTVF82KCggaW5wbGFjZTxDb2xQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KGZhbHNlLGZhbHNlKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIGlucGxhY2U8Q29sUGl2SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4NDNkPiA+LCBNYXRyaXg0M2Q+KGZhbHNlLGZhbHNlKSApKTsKKworICAgIENBTExfU1VCVEVTVF83KCggaW5wbGFjZTxGdWxsUGl2SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPihmYWxzZSxmYWxzZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKCBpbnBsYWNlPEZ1bGxQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsZmFsc2UpICkpOworCisgICAgQ0FMTF9TVUJURVNUXzgoKCBpbnBsYWNlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4oZmFsc2UsZmFsc2UpICkpOworICAgIENBTExfU1VCVEVTVF84KCggaW5wbGFjZTxDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsZmFsc2UpICkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2ludGVnZXJfdHlwZXMuY3BwIGIvdGVzdC9pbnRlZ2VyX3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFmNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlZ2VyX3R5cGVzLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKworI3VuZGVmIFZFUklGWV9JU19BUFBST1gKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWChhLCBiKSBWRVJJRlkoKGEpPT0oYikpOworI3VuZGVmIFZFUklGWV9JU19OT1RfQVBQUk9YCisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSgoYSkhPShiKSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgZW51bSB7IGlzX3NpZ25lZCA9IChTY2FsYXIoLTEpID4gU2NhbGFyKDApKSA/IDAgOiAxIH07CisgIFZFUklGWShpc19zaWduZWQgPT0gMSk7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisKKyAgZG8geworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICB9IHdoaWxlKG0xID09IG16ZXJvIHx8IG0xID09IG0yKTsKKworICAvLyBjaGVjayBsaW5lYXIgc3RydWN0dXJlCisKKyAgU2NhbGFyIHMxOworICBkbyB7CisgICAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfSB3aGlsZShzMSA9PSAwKTsKKworICBWRVJJRllfSVNfRVFVQUwoLSgtbTEpLCAgICAgICAgICAgICAgICAgIG0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKC1tMittMSttMiwgICAgICAgICAgICAgICBtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoLW0xK20yKSpzMSwgICAgICAgICAgICAgLXMxKm0xK3MxKm0yKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnRlZ2VyX3R5cGVfdGVzdHMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIFZFUklGWShOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKTsKKyAgZW51bSB7IGlzX3NpZ25lZCA9IChTY2FsYXIoLTEpID4gU2NhbGFyKDApKSA/IDAgOiAxIH07CisgIFZFUklGWShpbnQoTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkKSA9PSBpc19zaWduZWQpOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKyAgU3F1YXJlTWF0cml4VHlwZSBpZGVudGl0eSA9IFNxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgICAgICAgIHNxdWFyZSA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgVmVjdG9yVHlwZSB2MShyb3dzKSwKKyAgICAgICAgICAgICB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CisKKyAgZG8geworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICB9IHdoaWxlKG0xID09IG16ZXJvIHx8IG0xID09IG0yKTsKKworICBkbyB7CisgICAgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIH0gd2hpbGUodjEgPT0gdnplcm8gfHwgdjEgPT0gdjIpOworCisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgdjEsICAgIHYxKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICB2MSwgICAgMip2MSk7CisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgdnplcm8sIHYxLXYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtMSwgICAgbTEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWCggICAgICAgICAgIG0xLCAgICAyKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtemVybywgbTEtbTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSxtMSk7CisgIE1hdHJpeFR5cGUgbTQ7CisgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMSxtMSk7CisKKyAgbTMucmVhbCgpID0gbTEucmVhbCgpOworICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMykucmVhbCgpLCBzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTEpLnJlYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIG0xLnJlYWwoKSk7CisKKyAgLy8gY2hlY2sgPT0gLyAhPSBvcGVyYXRvcnMKKyAgVkVSSUZZKG0xPT1tMSk7CisgIFZFUklGWShtMSE9bTIpOworICBWRVJJRlkoIShtMT09bTIpKTsKKyAgVkVSSUZZKCEobTEhPW0xKSk7CisgIG0xID0gbTI7CisgIFZFUklGWShtMT09bTIpOworICBWRVJJRlkoIShtMSE9bTIpKTsKKworICAvLyBjaGVjayBsaW5lYXIgc3RydWN0dXJlCisKKyAgU2NhbGFyIHMxOworICBkbyB7CisgICAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfSB3aGlsZShzMSA9PSAwKTsKKworICBWRVJJRllfSVNfRVFVQUwobTErbTEsICAgICAgICAgICAgICAgICAgIDIqbTEpOworICBWRVJJRllfSVNfRVFVQUwobTErbTItbTEsICAgICAgICAgICAgICAgIG0yKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xKnMxLCAgICAgICAgICAgICAgICAgICBzMSptMSk7CisgIFZFUklGWV9JU19FUVVBTCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOworICBtMyA9IG0yOyBtMyArPSBtMTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0zLCAgICAgICAgICAgICAgICAgICAgICBtMSttMik7CisgIG0zID0gbTI7IG0zIC09IG0xOworICBWRVJJRllfSVNfRVFVQUwobTMsICAgICAgICAgICAgICAgICAgICAgIG0yLW0xKTsKKyAgbTMgPSBtMjsgbTMgKj0gczE7CisgIFZFUklGWV9JU19FUVVBTChtMywgICAgICAgICAgICAgICAgICAgICAgczEqbTIpOworCisgIC8vIGNoZWNrIG1hdHJpeCBwcm9kdWN0LgorCisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHkgKiBtMSwgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSAqIChtMSArIG0yKSwgc3F1YXJlICogbTEgKyBzcXVhcmUgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTIpLnRyYW5zcG9zZSgpICogc3F1YXJlLCBtMS50cmFuc3Bvc2UoKSAqIHNxdWFyZSArIG0yLnRyYW5zcG9zZSgpICogc3F1YXJlKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiBtMi50cmFuc3Bvc2UoKSkgKiBtMSwgbTEgKiAobTIudHJhbnNwb3NlKCkgKiBtMSkpOworfQorCit2b2lkIHRlc3RfaW50ZWdlcl90eXBlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgaW50LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcsIDMsIDQ+KCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMiggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nLCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nLCAyLCAyPigpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8Y2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOworICAgIENBTExfU1VCVEVTVF8zKCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaWduZWQgY2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzQoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgY2hhciwgMywgMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBjaGFyLCBEeW5hbWljLCBEeW5hbWljPigyMCwgMjApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzUoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8c2hvcnQsIER5bmFtaWMsIDQ+KDcsIDQpKSApOworICAgIENBTExfU1VCVEVTVF81KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaG9ydCwgRHluYW1pYywgND4oNywgNCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNiggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBzaG9ydCwgNCwgND4oKSkgKTsKKworICAgIENBTExfU1VCVEVTVF83KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcgbG9uZywgMTEsIDEzPigpKSApOworICAgIENBTExfU1VCVEVTVF83KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nIGxvbmcsIDExLCAxMz4oKSkgKTsKKworICAgIENBTExfU1VCVEVTVF84KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcgbG9uZywgRHluYW1pYywgNT4oMSwgNSkpICk7CisgIH0KKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfOQorICBWRVJJRllfSVNfRVFVQUwoaW50ZXJuYWw6OnNjYWxhcl9kaXZfY29zdDxpbnQ+Ojp2YWx1ZSwgOCk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6c2NhbGFyX2Rpdl9jb3N0PHVuc2lnbmVkIGludD46OnZhbHVlLCA4KTsKKyAgaWYoc2l6ZW9mKGxvbmcpPnNpemVvZihpbnQpKSB7CisgICAgVkVSSUZZKGludGVybmFsOjpzY2FsYXJfZGl2X2Nvc3Q8bG9uZz46OnZhbHVlID4gaW50ZXJuYWw6OnNjYWxhcl9kaXZfY29zdDxpbnQ+Ojp2YWx1ZSk7CisgICAgVkVSSUZZKGludGVybmFsOjpzY2FsYXJfZGl2X2Nvc3Q8dW5zaWduZWQgbG9uZz46OnZhbHVlID4gaW50ZXJuYWw6OnNjYWxhcl9kaXZfY29zdDxpbnQ+Ojp2YWx1ZSk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9pbnZlcnNlLmNwcCBiL3Rlc3QvaW52ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2Nzc3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW52ZXJzZS5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MVT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEludmVyc2UuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyb3dzLHJvd3Mscm93cyxtMSk7CisgIG0yID0gbTEuaW52ZXJzZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMi5pbnZlcnNlKCkgKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChTY2FsYXIoMikqbTIpLmludmVyc2UoKSwgbTIuaW52ZXJzZSgpKlNjYWxhcigwLjUpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGlkZW50aXR5LCBtMS5pbnZlcnNlKCkgKiBtMSApOworICBWRVJJRllfSVNfQVBQUk9YKGlkZW50aXR5LCBtMSAqIG0xLmludmVyc2UoKSApOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmludmVyc2UoKS5pbnZlcnNlKCkgKTsKKworICAvLyBzaW5jZSBmb3IgdGhlIGdlbmVyYWwgY2FzZSB3ZSBpbXBsZW1lbnQgc2VwYXJhdGVseSByb3ctbWFqb3IgYW5kIGNvbC1tYWpvciwgdGVzdCB0aGF0CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShtMS50cmFuc3Bvc2UoKS5pbnZlcnNlKCkpLCBNYXRyaXhUeXBlKG0xLmludmVyc2UoKS50cmFuc3Bvc2UoKSkpOworCisjaWYgIWRlZmluZWQoRUlHRU5fVEVTVF9QQVJUXzUpICYmICFkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF82KQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIAorICAvL2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrIHRlc3RzCisgIC8vRmlyc3Q6IGFuIGludmVydGlibGUgbWF0cml4CisgIGJvb2wgaW52ZXJ0aWJsZTsKKyAgUmVhbFNjYWxhciBkZXQ7CisKKyAgbTIuc2V0WmVybygpOworICBtMS5jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhtMiwgZGV0LCBpbnZlcnRpYmxlKTsKKyAgVkVSSUZZKGludmVydGlibGUpOworICBWRVJJRllfSVNfQVBQUk9YKGlkZW50aXR5LCBtMSptMik7CisgIFZFUklGWV9JU19BUFBST1goZGV0LCBtMS5kZXRlcm1pbmFudCgpKTsKKworICBtMi5zZXRaZXJvKCk7CisgIG0xLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKG0yLCBpbnZlcnRpYmxlKTsKKyAgVkVSSUZZKGludmVydGlibGUpOworICBWRVJJRllfSVNfQVBQUk9YKGlkZW50aXR5LCBtMSptMik7CisKKyAgLy9TZWNvbmQ6IGEgcmFuayBvbmUgbWF0cml4IChub3QgaW52ZXJ0aWJsZSwgZXhjZXB0IGZvciAxeDEgbWF0cmljZXMpCisgIFZlY3RvclR5cGUgdjMgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIE1hdHJpeFR5cGUgbTMgPSB2Myp2My50cmFuc3Bvc2UoKSwgbTQocm93cyxjb2xzKTsKKyAgbTMuY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2sobTQsIGRldCwgaW52ZXJ0aWJsZSk7CisgIFZFUklGWSggcm93cz09MSA/IGludmVydGlibGUgOiAhaW52ZXJ0aWJsZSApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKGRldC1tMy5kZXRlcm1pbmFudCgpKSwgUmVhbFNjYWxhcigxKSk7CisgIG0zLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKG00LCBpbnZlcnRpYmxlKTsKKyAgVkVSSUZZKCByb3dzPT0xID8gaW52ZXJ0aWJsZSA6ICFpbnZlcnRpYmxlICk7CisgIAorICAvLyBjaGVjayB3aXRoIHN1Ym1hdHJpY2VzCisgIHsKKyAgICBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSsxLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSsxLCBNYXRyaXhUeXBlOjpPcHRpb25zPiBtNTsKKyAgICBtNS5zZXRSYW5kb20oKTsKKyAgICBtNS50b3BMZWZ0Q29ybmVyKHJvd3Mscm93cykgPSBtMTsKKyAgICBtMiA9IG01LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8TWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KCkuaW52ZXJzZSgpOworICAgIFZFUklGWV9JU19BUFBST1goIChtNS50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPigpKSwgbTIuaW52ZXJzZSgpICk7CisgIH0KKyNlbmRpZgorCisgIC8vIGNoZWNrIGluLXBsYWNlIGludmVyc2lvbgorICBpZihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT49MiAmJiBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZTw9NCkKKyAgeworICAgIC8vIGluLXBsYWNlIGlzIGZvcmJpZGRlbgorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xID0gbTEuaW52ZXJzZSgpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtMiA9IG0xLmludmVyc2UoKTsKKyAgICBtMSA9IG0xLmludmVyc2UoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLG0yKTsKKyAgfQorfQorCit2b2lkIHRlc3RfaW52ZXJzZSgpCit7CisgIGludCBzID0gMDsKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggaW52ZXJzZShNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaW52ZXJzZShNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBpbnZlcnNlKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGludmVyc2UoTWF0cml4NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggaW52ZXJzZShNYXRyaXg8ZmxvYXQsNCw0LERvbnRBbGlnbj4oKSkgKTsKKyAgICAKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDMyMCk7IAorICAgIENBTExfU1VCVEVTVF81KCBpbnZlcnNlKE1hdHJpeFhmKHMscykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMjUsMTAwKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggaW52ZXJzZShNYXRyaXhYY2QocyxzKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgICAgCisgICAgQ0FMTF9TVUJURVNUXzcoIGludmVyc2UoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggaW52ZXJzZShNYXRyaXg8ZG91YmxlLDQsNCxEb250QWxpZ24+KCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaXNfc2FtZV9kZW5zZS5jcHAgYi90ZXN0L2lzX3NhbWVfZGVuc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzgzOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2lzX3NhbWVfZGVuc2UuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordXNpbmcgaW50ZXJuYWw6OmlzX3NhbWVfZGVuc2U7CisKK3ZvaWQgdGVzdF9pc19zYW1lX2RlbnNlKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gQ29sTWF0cml4WGQ7CisgIENvbE1hdHJpeFhkIG0xKDEwLDEwKTsKKyAgUmVmPENvbE1hdHJpeFhkPiByZWZfbTEobTEpOworICBSZWY8Y29uc3QgQ29sTWF0cml4WGQ+IGNvbnN0X3JlZl9tMShtMSk7CisgIFZFUklGWShpc19zYW1lX2RlbnNlKG0xLG0xKSk7CisgIFZFUklGWShpc19zYW1lX2RlbnNlKG0xLHJlZl9tMSkpOworICBWRVJJRlkoaXNfc2FtZV9kZW5zZShjb25zdF9yZWZfbTEsbTEpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZGVuc2UoY29uc3RfcmVmX20xLHJlZl9tMSkpOworICAKKyAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEuYmxvY2soMCwwLG0xLnJvd3MoKSxtMS5jb2xzKCkpLG0xKSk7CisgIFZFUklGWSghaXNfc2FtZV9kZW5zZShtMS5yb3coMCksbTEuY29sKDApKSk7CisgIAorICBSZWY8Y29uc3QgQ29sTWF0cml4WGQ+IGNvbnN0X3JlZl9tMV9yb3cobTEucm93KDEpKTsKKyAgVkVSSUZZKCFpc19zYW1lX2RlbnNlKG0xLnJvdygxKSxjb25zdF9yZWZfbTFfcm93KSk7CisgIAorICBSZWY8Y29uc3QgQ29sTWF0cml4WGQ+IGNvbnN0X3JlZl9tMV9jb2wobTEuY29sKDEpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEuY29sKDEpLGNvbnN0X3JlZl9tMV9jb2wpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvamFjb2JpLmNwcCBiL3Rlc3QvamFjb2JpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NkNDEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYWNvYmkuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEphY29iaVNjYWxhcj4KK3ZvaWQgamFjb2JpKGNvbnN0IE1hdHJpeFR5cGUmIG0gPSBNYXRyaXhUeXBlKCkpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgTWF0cml4PEphY29iaVNjYWxhciwgMiwgMT4gSmFjb2JpVmVjdG9yOworCisgIGNvbnN0IE1hdHJpeFR5cGUgYShNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scykpOworCisgIEphY29iaVZlY3RvciB2ID0gSmFjb2JpVmVjdG9yOjpSYW5kb20oKS5ub3JtYWxpemVkKCk7CisgIEphY29iaVNjYWxhciBjID0gdi54KCksIHMgPSB2LnkoKTsKKyAgSmFjb2JpUm90YXRpb248SmFjb2JpU2NhbGFyPiByb3QoYywgcyk7CisKKyAgeworICAgIEluZGV4IHAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOworICAgIEluZGV4IHE7CisgICAgZG8geworICAgICAgcSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSk7CisgICAgfSB3aGlsZSAocSA9PSBwKTsKKworICAgIE1hdHJpeFR5cGUgYiA9IGE7CisgICAgYi5hcHBseU9uVGhlTGVmdChwLCBxLCByb3QpOworICAgIFZFUklGWV9JU19BUFBST1goYi5yb3cocCksIGMgKiBhLnJvdyhwKSArIG51bWV4dDo6Y29uaihzKSAqIGEucm93KHEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGIucm93KHEpLCAtcyAqIGEucm93KHApICsgbnVtZXh0Ojpjb25qKGMpICogYS5yb3cocSkpOworICB9CisKKyAgeworICAgIEluZGV4IHAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICAgIEluZGV4IHE7CisgICAgZG8geworICAgICAgcSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgICAgfSB3aGlsZSAocSA9PSBwKTsKKworICAgIE1hdHJpeFR5cGUgYiA9IGE7CisgICAgYi5hcHBseU9uVGhlUmlnaHQocCwgcSwgcm90KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGIuY29sKHApLCBjICogYS5jb2wocCkgLSBzICogYS5jb2wocSkpOworICAgIFZFUklGWV9JU19BUFBST1goYi5jb2wocSksIG51bWV4dDo6Y29uaihzKSAqIGEuY29sKHApICsgbnVtZXh0Ojpjb25qKGMpICogYS5jb2wocSkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9qYWNvYmkoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCggamFjb2JpPE1hdHJpeDNmLCBmbG9hdD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIGphY29iaTxNYXRyaXg0ZCwgZG91YmxlPigpICkpOworICAgIENBTExfU1VCVEVTVF8zKCggamFjb2JpPE1hdHJpeDRjZiwgZmxvYXQ+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBqYWNvYmk8TWF0cml4NGNmLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApKTsKKworICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLzIpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLzIpOworICAgIENBTExfU1VCVEVTVF80KCggamFjb2JpPE1hdHJpeFhmLCBmbG9hdD4oTWF0cml4WGYocixjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKCBqYWNvYmk8TWF0cml4WGNkLCBkb3VibGU+KE1hdHJpeFhjZChyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGphY29iaTxNYXRyaXhYY2QsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oTWF0cml4WGNkKHIsYykpICkpOworICAgIC8vIGNvbXBsZXg8ZmxvYXQ+IGlzIHJlYWxseSBpbXBvcnRhbnQgdG8gdGVzdCBhcyBpdCBpcyB0aGUgb25seSB3YXkgdG8gY292ZXIgY29uanVnYXRpb24gaXNzdWVzIGluIGNlcnRhaW4gdW5hbGlnbmVkIHBhdGhzCisgICAgQ0FMTF9TVUJURVNUXzYoKCBqYWNvYmk8TWF0cml4WGNmLCBmbG9hdD4oTWF0cml4WGNmKHIsYykpICkpOworICAgIENBTExfU1VCVEVTVF82KCggamFjb2JpPE1hdHJpeFhjZiwgc3RkOjpjb21wbGV4PGZsb2F0PiA+KE1hdHJpeFhjZihyLGMpKSApKTsKKyAgICAKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHIpOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvamFjb2Jpc3ZkLmNwcCBiL3Rlc3QvamFjb2Jpc3ZkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVmNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9qYWNvYmlzdmQuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gZGlzY2FyZCBzdGFjayBhbGxvY2F0aW9uIGFzIHRoYXQgdG9vIGJ5cGFzc2VzIG1hbGxvYworI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDAKKyNkZWZpbmUgRUlHRU5fUlVOVElNRV9OT19NQUxMT0MKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCisjZGVmaW5lIFNWRF9ERUZBVUxUKE0pIEphY29iaVNWRDxNPgorI2RlZmluZSBTVkRfRk9SX01JTl9OT1JNKE0pIEphY29iaVNWRDxNLENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4KKyNpbmNsdWRlICJzdmRfY29tbW9uLmgiCisKKy8vIENoZWNrIGFsbCB2YXJpYW50cyBvZiBKYWNvYmlTVkQKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGphY29iaXN2ZChjb25zdCBNYXRyaXhUeXBlJiBhID0gTWF0cml4VHlwZSgpLCBib29sIHBpY2tyYW5kb20gPSB0cnVlKQoreworICBNYXRyaXhUeXBlIG0gPSBhOworICBpZihwaWNrcmFuZG9tKQorICAgIHN2ZF9maWxsX3JhbmRvbShtKTsKKworICBDQUxMX1NVQlRFU1QoKCBzdmRfdGVzdF9hbGxfY29tcHV0YXRpb25fb3B0aW9uczxKYWNvYmlTVkQ8TWF0cml4VHlwZSwgRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4gPihtLCB0cnVlKSAgKSk7IC8vIGNoZWNrIGZ1bGwgb25seQorICBDQUxMX1NVQlRFU1QoKCBzdmRfdGVzdF9hbGxfY29tcHV0YXRpb25fb3B0aW9uczxKYWNvYmlTVkQ8TWF0cml4VHlwZSwgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiAgPihtLCBmYWxzZSkgKSk7CisgIENBTExfU1VCVEVTVCgoIHN2ZF90ZXN0X2FsbF9jb21wdXRhdGlvbl9vcHRpb25zPEphY29iaVNWRDxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+ICAgICAgICA+KG0sIGZhbHNlKSApKTsKKyAgaWYobS5yb3dzKCk9PW0uY29scygpKQorICAgIENBTExfU1VCVEVTVCgoIHN2ZF90ZXN0X2FsbF9jb21wdXRhdGlvbl9vcHRpb25zPEphY29iaVNWRDxNYXRyaXhUeXBlLCBOb1FSUHJlY29uZGl0aW9uZXI+ICAgICAgICAgICAgICAgPihtLCBmYWxzZSkgKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgc3ZkX3ZlcmlmeV9hc3NlcnQ8SmFjb2JpU1ZEPE1hdHJpeFR5cGU+ID4obSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIGVudW0geworICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisgIGEuc2V0WmVybygpOworCisgIGlmIChDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKQorICB7CisgICAgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+IHN2ZF9mdWxscXI7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkX2Z1bGxxci5jb21wdXRlKGEsIENvbXB1dGVGdWxsVXxDb21wdXRlVGhpblYpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZF9mdWxscXIuY29tcHV0ZShhLCBDb21wdXRlVGhpblV8Q29tcHV0ZVRoaW5WKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmRfZnVsbHFyLmNvbXB1dGUoYSwgQ29tcHV0ZVRoaW5VfENvbXB1dGVGdWxsVikpCisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgamFjb2Jpc3ZkX21ldGhvZCgpCit7CisgIGVudW0geyBTaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIFNpemUsIDE+IFJlYWxWZWNUeXBlOworICBNYXRyaXhUeXBlIG0gPSBNYXRyaXhUeXBlOjpJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0uamFjb2JpU3ZkKCkuc2luZ3VsYXJWYWx1ZXMoKSwgUmVhbFZlY1R5cGU6Ok9uZXMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0uamFjb2JpU3ZkKCkubWF0cml4VSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5qYWNvYmlTdmQoKS5tYXRyaXhWKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0uamFjb2JpU3ZkKENvbXB1dGVGdWxsVXxDb21wdXRlRnVsbFYpLnNvbHZlKG0pLCBtKTsKK30KKwordm9pZCB0ZXN0X2phY29iaXN2ZCgpCit7CisgIENBTExfU1VCVEVTVF8zKCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4M2YoKSkgKSk7CisgIENBTExfU1VCVEVTVF80KCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4NGQoKSkgKSk7CisgIENBTExfU1VCVEVTVF83KCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4WGYoMTAsMTIpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBqYWNvYmlzdmRfdmVyaWZ5X2Fzc2VydChNYXRyaXhYY2QoNyw1KSkgKSk7CisgIAorICBDQUxMX1NVQlRFU1RfMTEoc3ZkX2FsbF90cml2aWFsXzJ4MihqYWNvYmlzdmQ8TWF0cml4MmNkPikpOworICBDQUxMX1NVQlRFU1RfMTIoc3ZkX2FsbF90cml2aWFsXzJ4MihqYWNvYmlzdmQ8TWF0cml4MmQ+KSk7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMygoIGphY29iaXN2ZDxNYXRyaXgzZj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoIGphY29iaXN2ZDxNYXRyaXg0ZD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGphY29iaXN2ZDxNYXRyaXg8ZmxvYXQsMyw1PiA+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKCBqYWNvYmlzdmQ8TWF0cml4PGRvdWJsZSxEeW5hbWljLDI+ID4oTWF0cml4PGRvdWJsZSxEeW5hbWljLDI+KDEwLDIpKSApKTsKKworICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDMwKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAzMCk7CisgICAgCisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShyKQorICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoYykKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMTAoKCBqYWNvYmlzdmQ8TWF0cml4WGQ+KE1hdHJpeFhkKHIsYykpICkpOworICAgIENBTExfU1VCVEVTVF83KCggamFjb2Jpc3ZkPE1hdHJpeFhmPihNYXRyaXhYZihyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfOCgoIGphY29iaXN2ZDxNYXRyaXhYY2Q+KE1hdHJpeFhjZChyLGMpKSApKTsKKyAgICAodm9pZCkgcjsKKyAgICAodm9pZCkgYzsKKworICAgIC8vIFRlc3Qgb24gaW5mL25hbiBtYXRyaXgKKyAgICBDQUxMX1NVQlRFU1RfNyggIChzdmRfaW5mX25hbjxKYWNvYmlTVkQ8TWF0cml4WGY+LCBNYXRyaXhYZj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoIChzdmRfaW5mX25hbjxKYWNvYmlTVkQ8TWF0cml4WGQ+LCBNYXRyaXhYZD4oKSkgKTsKKworICAgIC8vIGJ1ZzEzOTUgdGVzdCBjb21waWxlLXRpbWUgdmVjdG9ycyBhcyBpbnB1dAorICAgIENBTExfU1VCVEVTVF8xMygoIGphY29iaXN2ZF92ZXJpZnlfYXNzZXJ0KE1hdHJpeDxkb3VibGUsNiwxPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMTMoKCBqYWNvYmlzdmRfdmVyaWZ5X2Fzc2VydChNYXRyaXg8ZG91YmxlLDEsNj4oKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEzKCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4PGRvdWJsZSxEeW5hbWljLDE+KHIpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMTMoKCBqYWNvYmlzdmRfdmVyaWZ5X2Fzc2VydChNYXRyaXg8ZG91YmxlLDEsRHluYW1pYz4oYykpICkpOworICB9CisKKyAgQ0FMTF9TVUJURVNUXzcoKCBqYWNvYmlzdmQ8TWF0cml4WGY+KE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBqYWNvYmlzdmQ8TWF0cml4WGNkPihNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRS8zKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRS8zKSkpICkpOworCisgIC8vIHRlc3QgbWF0cml4YmFzZSBtZXRob2QKKyAgQ0FMTF9TVUJURVNUXzEoKCBqYWNvYmlzdmRfbWV0aG9kPE1hdHJpeDJjZD4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCBqYWNvYmlzdmRfbWV0aG9kPE1hdHJpeDNmPigpICkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfNyggSmFjb2JpU1ZEPE1hdHJpeFhmPigxMCwxMCkgKTsKKworICAvLyBDaGVjayB0aGF0IHByZWFsbG9jYXRpb24gYXZvaWRzIHN1YnNlcXVlbnQgbWFsbG9jcworICBDQUxMX1NVQlRFU1RfOSggc3ZkX3ByZWFsbG9jYXRlPHZvaWQ+KCkgKTsKKworICBDQUxMX1NVQlRFU1RfMiggc3ZkX3VuZGVyb3ZlcmZsb3c8dm9pZD4oKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9saW5lYXJzdHJ1Y3R1cmUuY3BwIGIvdGVzdC9saW5lYXJzdHJ1Y3R1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDc0YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpbmVhcnN0cnVjdHVyZS5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCitzdGF0aWMgYm9vbCBnX2NhbGxlZDsKKyNkZWZpbmUgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4geyBnX2NhbGxlZCB8PSAoIWludGVybmFsOjppc19zYW1lPExoc1NjYWxhcixSaHNTY2FsYXI+Ojp2YWx1ZSk7IH0KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBsaW5lYXJTdHJ1Y3R1cmUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgQ3dpc2VVbmFyeU9wLmgsIEN3aXNlQmluYXJ5T3AuaCwgU2VsZkN3aXNlQmluYXJ5T3AuaCAKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICAvLyB0aGlzIHRlc3QgcmVsaWVzIGEgbG90IG9uIFJhbmRvbS5oLCBhbmQgdGhlcmUncyBub3QgbXVjaCBtb3JlIHRoYXQgd2UgY2FuIGRvCisgIC8vIHRvIHRlc3QgaXQsIGhlbmNlIEkgY29uc2lkZXIgdGhhdCB3ZSB3aWxsIGhhdmUgdGVzdGVkIFJhbmRvbS5oCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIHdoaWxlIChhYnMoczEpPFJlYWxTY2FsYXIoMWUtMykpIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIFZFUklGWV9JU19BUFBST1goLSgtbTEpLCAgICAgICAgICAgICAgICAgIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSttMSwgICAgICAgICAgICAgICAgICAgMiptMSk7CisgIFZFUklGWV9JU19BUFBST1gobTErbTItbTEsICAgICAgICAgICAgICAgIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtbTIrbTErbTIsICAgICAgICAgICAgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xKnMxLCAgICAgICAgICAgICAgICAgICBzMSptMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xK20yKSpzMSwgICAgICAgICAgICAgIHMxKm0xK3MxKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xK20yKSpzMSwgICAgICAgICAgICAgLXMxKm0xK3MxKm0yKTsKKyAgbTMgPSBtMjsgbTMgKz0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0xK20yKTsKKyAgbTMgPSBtMjsgbTMgLT0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0yLW0xKTsKKyAgbTMgPSBtMjsgbTMgKj0gczE7CisgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIHMxKm0yKTsKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCisgIHsKKyAgICBtMyA9IG0yOyBtMyAvPSBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCAgICAgICAgICAgICAgICAgICAgbTIvczEpOworICB9CisKKyAgLy8gYWdhaW4sIHRlc3Qgb3BlcmF0b3IoKSB0byBjaGVjayBjb25zdC1xdWFsaWZpY2F0aW9uCisgIFZFUklGWV9JU19BUFBST1goKC1tMSkocixjKSwgLShtMShyLGMpKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xLW0yKShyLGMpLCAobTEocixjKSktKG0yKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKHIsYyksIChtMShyLGMpKSsobTIocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChzMSptMSkocixjKSwgczEqKG0xKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEqczEpKHIsYyksIChtMShyLGMpKSpzMSk7CisgIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQorICAgIFZFUklGWV9JU19BUFBST1goKG0xL3MxKShyLGMpLCAobTEocixjKSkvczEpOworCisgIC8vIHVzZSAuYmxvY2sgdG8gZGlzYWJsZSB2ZWN0b3JpemF0aW9uIGFuZCBjb21wYXJlIHRvIHRoZSB2ZWN0b3JpemVkIHZlcnNpb24KKyAgVkVSSUZZX0lTX0FQUFJPWChtMSttMS5ibG9jaygwLDAscm93cyxjb2xzKSwgbTErbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlUHJvZHVjdChtMS5ibG9jaygwLDAscm93cyxjb2xzKSksIG0xLmN3aXNlUHJvZHVjdChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gbTEuYmxvY2soMCwwLHJvd3MsY29scyksIG0xIC0gbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpICogczEsIG0xICogczEpOworfQorCisvLyBNYWtlIHN1cmUgdGhhdCBjb21wbGV4ICogcmVhbCBhbmQgcmVhbCAqIGNvbXBsZXggYXJlIHByb3Blcmx5IG9wdGltaXplZAordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCByZWFsX2NvbXBsZXgoRGVuc2VJbmRleCByb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIERlbnNlSW5kZXggY29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAKKyAgUmVhbFNjYWxhciBzID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICAKKyAgZ19jYWxsZWQgPSBmYWxzZTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzKm0xLCBTY2FsYXIocykqbTEpOworICBWRVJJRlkoZ19jYWxsZWQgJiYgInJlYWwgKiBtYXRyaXg8Y29tcGxleD4gbm90IHByb3Blcmx5IG9wdGltaXplZCIpOworICAKKyAgZ19jYWxsZWQgPSBmYWxzZTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSpzLCBtMSpTY2FsYXIocykpOworICBWRVJJRlkoZ19jYWxsZWQgJiYgIm1hdHJpeDxjb21wbGV4PiAqIHJlYWwgbm90IHByb3Blcmx5IG9wdGltaXplZCIpOworICAKKyAgZ19jYWxsZWQgPSBmYWxzZTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS9zLCBtMS9TY2FsYXIocykpOworICBWRVJJRlkoZ19jYWxsZWQgJiYgIm1hdHJpeDxjb21wbGV4PiAvIHJlYWwgbm90IHByb3Blcmx5IG9wdGltaXplZCIpOworCisgIGdfY2FsbGVkID0gZmFsc2U7CisgIFZFUklGWV9JU19BUFBST1gocyttMS5hcnJheSgpLCBTY2FsYXIocykrbTEuYXJyYXkoKSk7CisgIFZFUklGWShnX2NhbGxlZCAmJiAicmVhbCArIG1hdHJpeDxjb21wbGV4PiBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CisKKyAgZ19jYWxsZWQgPSBmYWxzZTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hcnJheSgpK3MsIG0xLmFycmF5KCkrU2NhbGFyKHMpKTsKKyAgVkVSSUZZKGdfY2FsbGVkICYmICJtYXRyaXg8Y29tcGxleD4gKyByZWFsIG5vdCBwcm9wZXJseSBvcHRpbWl6ZWQiKTsKKworICBnX2NhbGxlZCA9IGZhbHNlOworICBWRVJJRllfSVNfQVBQUk9YKHMtbTEuYXJyYXkoKSwgU2NhbGFyKHMpLW0xLmFycmF5KCkpOworICBWRVJJRlkoZ19jYWxsZWQgJiYgInJlYWwgLSBtYXRyaXg8Y29tcGxleD4gbm90IHByb3Blcmx5IG9wdGltaXplZCIpOworCisgIGdfY2FsbGVkID0gZmFsc2U7CisgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKS1zLCBtMS5hcnJheSgpLVNjYWxhcihzKSk7CisgIFZFUklGWShnX2NhbGxlZCAmJiAibWF0cml4PGNvbXBsZXg+IC0gcmVhbCBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7Cit9CisKK3ZvaWQgdGVzdF9saW5lYXJzdHJ1Y3R1cmUoKQoreworICBnX2NhbGxlZCA9IHRydWU7CisgIFZFUklGWShnX2NhbGxlZCk7IC8vIGF2b2lkIGB1bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbmAgd2FybmluZy4KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbGluZWFyU3RydWN0dXJlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbGluZWFyU3RydWN0dXJlKE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGxpbmVhclN0cnVjdHVyZShWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbGluZWFyU3RydWN0dXJlKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbGluZWFyU3RydWN0dXJlKE1hdHJpeFhmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF83KCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4WGkgKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoIGxpbmVhclN0cnVjdHVyZShBcnJheVhYZiAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoIGxpbmVhclN0cnVjdHVyZShBcnJheVhYY2YgKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgCisgICAgQ0FMTF9TVUJURVNUXzExKCByZWFsX2NvbXBsZXg8TWF0cml4NGNkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzExKCByZWFsX2NvbXBsZXg8TWF0cml4WGNmPigxMCwxMCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoIHJlYWxfY29tcGxleDxBcnJheVhYY2Y+KDEwLDEwKSApOworICB9CisgIAorI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF80CisgIHsKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCAvPXNjYWxhciBhbmQgL3NjYWxhciBkbyBub3Qgb3ZlcmZsb3cKKyAgICAvLyByYXRpb25hbDogMS4wLzQuOTRlLTMyMCBvdmVyZmxvdywgYnV0IG0vNC45NGUtMzIwIHNob3VsZCBub3QKKyAgICBNYXRyaXg0ZCBtMiwgbTM7CisgICAgbTMgPSBtMiA9ICBNYXRyaXg0ZDo6UmFuZG9tKCkqMWUtMjA7CisgICAgbTIgPSBtMiAvIDQuOWUtMzIwOworICAgIFZFUklGWV9JU19BUFBST1gobTIuY3dpc2VRdW90aWVudChtMiksIE1hdHJpeDRkOjpPbmVzKCkpOworICAgIG0zIC89IDQuOWUtMzIwOworICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2VRdW90aWVudChtMyksIE1hdHJpeDRkOjpPbmVzKCkpOworICAgIAorICAgIAorICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbHNjZy5jcHAgYi90ZXN0L2xzY2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWVlMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xzY2cuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9sc2NnX1QoKQoreworICBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXg8VD4gPiBsc2NnX2NvbG1ham9yX2RpYWc7CisgIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gbHNjZ19jb2xtYWpvcl9JOworICBMZWFzdFNxdWFyZXNDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXg8VCxSb3dNYWpvcj4gPiBsc2NnX3Jvd21ham9yX2RpYWc7CisgIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxULFJvd01ham9yPiwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gbHNjZ19yb3dtYWpvcl9JOworCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGxzY2dfY29sbWFqb3JfZGlhZykgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGxzY2dfY29sbWFqb3JfSSkgICAgICk7CisgIAorICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKGxzY2dfY29sbWFqb3JfZGlhZykgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcobHNjZ19jb2xtYWpvcl9JKSAgICAgKTsKKworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhsc2NnX3Jvd21ham9yX2RpYWcpICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhsc2NnX3Jvd21ham9yX0kpICAgICApOworCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9kaWFnKSAgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2VfbGVhc3RzcXVhcmVfc29sdmluZyhsc2NnX3Jvd21ham9yX0kpICAgICApOworfQorCit2b2lkIHRlc3RfbHNjZygpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfbHNjZ19UPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfbHNjZ19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2x1LmNwcCBiL3Rlc3QvbHUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODdmNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1LmNwcApAQCAtMCwwICsxLDI4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBtYXRyaXhfbDFfbm9ybShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CisgIHJldHVybiBtLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbHVfbm9uX2ludmVydGlibGUoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBMVS5oCisgICovCisgIEluZGV4IHJvd3MsIGNvbHMsIGNvbHMyOworICBpZihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICB9CisgIGVsc2UKKyAgeworICAgIHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZTsKKyAgfQorICBpZihNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgY29sczIgPSBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU7CisgIH0KKworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6a2VybmVsX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiA+OjpSZXR1cm5UeXBlIEtlcm5lbE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmltYWdlX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiA+OjpSZXR1cm5UeXBlIEltYWdlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgQ01hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFJNYXRyaXhUeXBlOworCisgIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworCisgIC8vIFRoZSBpbWFnZSBvZiB0aGUgemVybyBtYXRyaXggc2hvdWxkIGNvbnNpc3Qgb2YgYSBzaW5nbGUgKHplcm8pIGNvbHVtbiB2ZWN0b3IKKyAgVkVSSUZZKChNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykuZnVsbFBpdkx1KCkuaW1hZ2UoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKS5jb2xzKCkgPT0gMSkpOworCisgIE1hdHJpeFR5cGUgbTEocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMyKTsKKyAgQ01hdHJpeFR5cGUgbTIoY29scywgY29sczIpOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCByb3dzLCBjb2xzLCBtMSk7CisKKyAgRnVsbFBpdkxVPE1hdHJpeFR5cGU+IGx1OworCisgIC8vIFRoZSBzcGVjaWFsIHZhbHVlIDAuMDEgYmVsb3cgd29ya3Mgd2VsbCBpbiB0ZXN0cy4gS2VlcCBpbiBtaW5kIHRoYXQgd2UncmUgb25seSBjb21wdXRpbmcgdGhlIHJhbmsKKyAgLy8gb2Ygc2luZ3VsYXIgdmFsdWVzIGFyZSBlaXRoZXIgMCBvciAxLgorICAvLyBTbyBpdCdzIG5vdCBjbGVhciBhdCBhbGwgdGhhdCB0aGUgZXBzaWxvbiBzaG91bGQgcGxheSBhbnkgcm9sZSB0aGVyZS4KKyAgbHUuc2V0VGhyZXNob2xkKFJlYWxTY2FsYXIoMC4wMSkpOworICBsdS5jb21wdXRlKG0xKTsKKworICBNYXRyaXhUeXBlIHUocm93cyxjb2xzKTsKKyAgdSA9IGx1Lm1hdHJpeExVKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFJNYXRyaXhUeXBlIGwgPSBSTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxyb3dzKTsKKyAgbC5ibG9jaygwLDAscm93cywoc3RkOjptaW4pKHJvd3MsY29scykpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkKKyAgICA9IGx1Lm1hdHJpeExVKCkuYmxvY2soMCwwLHJvd3MsKHN0ZDo6bWluKShyb3dzLGNvbHMpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGx1LnBlcm11dGF0aW9uUCgpICogbTEgKiBsdS5wZXJtdXRhdGlvblEoKSwgbCp1KTsKKworICBLZXJuZWxNYXRyaXhUeXBlIG0xa2VybmVsID0gbHUua2VybmVsKCk7CisgIEltYWdlTWF0cml4VHlwZSBtMWltYWdlID0gbHUuaW1hZ2UobTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIGx1LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgIFZFUklGWShyYW5rID09IGx1LnJhbmsoKSk7CisgIFZFUklGWShjb2xzIC0gbHUucmFuaygpID09IGx1LmRpbWVuc2lvbk9mS2VybmVsKCkpOworICBWRVJJRlkoIWx1LmlzSW5qZWN0aXZlKCkpOworICBWRVJJRlkoIWx1LmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKCFsdS5pc1N1cmplY3RpdmUoKSk7CisgIFZFUklGWSgobTEgKiBtMWtlcm5lbCkuaXNNdWNoU21hbGxlclRoYW4obTEpKTsKKyAgVkVSSUZZKG0xaW1hZ2UuZnVsbFBpdkx1KCkucmFuaygpID09IHJhbmspOworICBWRVJJRllfSVNfQVBQUk9YKG0xICogbTEuYWRqb2ludCgpICogbTFpbWFnZSwgbTFpbWFnZSk7CisKKyAgbTIgPSBDTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsY29sczIpOworICBtMyA9IG0xKm0yOworICBtMiA9IENNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIC8vIHRlc3QgdGhhdCB0aGUgY29kZSwgd2hpY2ggZG9lcyByZXNpemUoKSwgbWF5IGJlIGFwcGxpZWQgdG8gYW4geHByCisgIG0yLmJsb2NrKDAsMCxtMi5yb3dzKCksbTIuY29scygpKSA9IGx1LnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworCisgIC8vIHRlc3Qgc29sdmUgd2l0aCB0cmFuc3Bvc2VkCisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29sczIpOworICBtMiA9IG0xLnRyYW5zcG9zZSgpKm0zOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgbHUudGVtcGxhdGUgX3NvbHZlX2ltcGxfdHJhbnNwb3NlZDxmYWxzZT4obTIsIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEudHJhbnNwb3NlKCkqbTMpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgbTMgPSBsdS50cmFuc3Bvc2UoKS5zb2x2ZShtMik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnRyYW5zcG9zZSgpKm0zKTsKKworICAvLyB0ZXN0IHNvbHZlIHdpdGggY29uanVnYXRlIHRyYW5zcG9zZWQKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzMik7CisgIG0yID0gbTEuYWRqb2ludCgpKm0zOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgbHUudGVtcGxhdGUgX3NvbHZlX2ltcGxfdHJhbnNwb3NlZDx0cnVlPihtMiwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5hZGpvaW50KCkqbTMpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgbTMgPSBsdS5hZGpvaW50KCkuc29sdmUobTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5hZGpvaW50KCkqbTMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X2ludmVydGlibGUoKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIExVLmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBJbmRleCBzaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU7CisgIGlmKCBzaXplPT1EeW5hbWljKQorICAgIHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworCisgIE1hdHJpeFR5cGUgbTEoc2l6ZSwgc2l6ZSksIG0yKHNpemUsIHNpemUpLCBtMyhzaXplLCBzaXplKTsKKyAgRnVsbFBpdkxVPE1hdHJpeFR5cGU+IGx1OworICBsdS5zZXRUaHJlc2hvbGQoUmVhbFNjYWxhcigwLjAxKSk7CisgIGRvIHsKKyAgICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICAgIGx1LmNvbXB1dGUobTEpOworICB9IHdoaWxlKCFsdS5pc0ludmVydGlibGUoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbHUucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgVkVSSUZZKDAgPT0gbHUuZGltZW5zaW9uT2ZLZXJuZWwoKSk7CisgIFZFUklGWShsdS5rZXJuZWwoKS5jb2xzKCkgPT0gMSk7IC8vIHRoZSBrZXJuZWwoKSBzaG91bGQgY29uc2lzdCBvZiBhIHNpbmdsZSAoemVybykgY29sdW1uIHZlY3RvcgorICBWRVJJRlkoc2l6ZSA9PSBsdS5yYW5rKCkpOworICBWRVJJRlkobHUuaXNJbmplY3RpdmUoKSk7CisgIFZFUklGWShsdS5pc1N1cmplY3RpdmUoKSk7CisgIFZFUklGWShsdS5pc0ludmVydGlibGUoKSk7CisgIFZFUklGWShsdS5pbWFnZShtMSkuZnVsbFBpdkx1KCkuaXNJbnZlcnRpYmxlKCkpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMiA9IGx1LnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworICBNYXRyaXhUeXBlIG0xX2ludmVyc2UgPSBsdS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludmVyc2UqbTMpOworCisgIFJlYWxTY2FsYXIgcmNvbmQgPSAoUmVhbFNjYWxhcigxKSAvIG1hdHJpeF9sMV9ub3JtKG0xKSkgLyBtYXRyaXhfbDFfbm9ybShtMV9pbnZlcnNlKTsKKyAgY29uc3QgUmVhbFNjYWxhciByY29uZF9lc3QgPSBsdS5yY29uZCgpOworICAvLyBWZXJpZnkgdGhhdCB0aGUgZXN0aW1hdGVkIGNvbmRpdGlvbiBudW1iZXIgaXMgd2l0aGluIGEgZmFjdG9yIG9mIDEwIG9mIHRoZQorICAvLyB0cnV0aC4KKyAgVkVSSUZZKHJjb25kX2VzdCA+IHJjb25kIC8gMTAgJiYgcmNvbmRfZXN0IDwgcmNvbmQgKiAxMCk7CisKKyAgLy8gdGVzdCBzb2x2ZSB3aXRoIHRyYW5zcG9zZWQKKyAgbHUudGVtcGxhdGUgX3NvbHZlX2ltcGxfdHJhbnNwb3NlZDxmYWxzZT4obTMsIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEudHJhbnNwb3NlKCkqbTIpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMyA9IGx1LnRyYW5zcG9zZSgpLnNvbHZlKG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEudHJhbnNwb3NlKCkqbTMpOworCisgIC8vIHRlc3Qgc29sdmUgd2l0aCBjb25qdWdhdGUgdHJhbnNwb3NlZAorICBsdS50ZW1wbGF0ZSBfc29sdmVfaW1wbF90cmFuc3Bvc2VkPHRydWU+KG0zLCBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmFkam9pbnQoKSptMik7CisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0zID0gbHUuYWRqb2ludCgpLnNvbHZlKG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuYWRqb2ludCgpKm0zKTsKKworICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyAzMDIKKyAgTWF0cml4VHlwZSBtNCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBWRVJJRllfSVNfQVBQUk9YKGx1LnNvbHZlKG0zKm00KSwgbHUuc29sdmUobTMpKm00KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBsdV9wYXJ0aWFsX3BpdigpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUGFydGlhbFBpdkxVLmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBJbmRleCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSw0KTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7CisgIG0xLnNldFJhbmRvbSgpOworICBQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT4gcGx1KG0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBwbHUucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMiA9IHBsdS5zb2x2ZShtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKm0yKTsKKyAgTWF0cml4VHlwZSBtMV9pbnZlcnNlID0gcGx1LmludmVyc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfaW52ZXJzZSptMyk7CisKKyAgUmVhbFNjYWxhciByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm0obTEpKSAvIG1hdHJpeF9sMV9ub3JtKG0xX2ludmVyc2UpOworICBjb25zdCBSZWFsU2NhbGFyIHJjb25kX2VzdCA9IHBsdS5yY29uZCgpOworICAvLyBWZXJpZnkgdGhhdCB0aGUgZXN0aW1hdGUgaXMgd2l0aGluIGEgZmFjdG9yIG9mIDEwIG9mIHRoZSB0cnV0aC4KKyAgVkVSSUZZKHJjb25kX2VzdCA+IHJjb25kIC8gMTAgJiYgcmNvbmRfZXN0IDwgcmNvbmQgKiAxMCk7CisKKyAgLy8gdGVzdCBzb2x2ZSB3aXRoIHRyYW5zcG9zZWQKKyAgcGx1LnRlbXBsYXRlIF9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQ8ZmFsc2U+KG0zLCBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLnRyYW5zcG9zZSgpKm0yKTsKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgbTMgPSBwbHUudHJhbnNwb3NlKCkuc29sdmUobTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS50cmFuc3Bvc2UoKSptMyk7CisKKyAgLy8gdGVzdCBzb2x2ZSB3aXRoIGNvbmp1Z2F0ZSB0cmFuc3Bvc2VkCisgIHBsdS50ZW1wbGF0ZSBfc29sdmVfaW1wbF90cmFuc3Bvc2VkPHRydWU+KG0zLCBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmFkam9pbnQoKSptMik7CisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0zID0gcGx1LmFkam9pbnQoKS5zb2x2ZShtMik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLmFkam9pbnQoKSptMyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbHVfdmVyaWZ5X2Fzc2VydCgpCit7CisgIE1hdHJpeFR5cGUgdG1wOworCisgIEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiBsdTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUubWF0cml4TFUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUucGVybXV0YXRpb25QKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LnBlcm11dGF0aW9uUSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5rZXJuZWwoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuaW1hZ2UodG1wKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuc29sdmUodG1wKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuZGV0ZXJtaW5hbnQoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUucmFuaygpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5kaW1lbnNpb25PZktlcm5lbCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5pc0luamVjdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5pc1N1cmplY3RpdmUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuaXNJbnZlcnRpYmxlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LmludmVyc2UoKSkKKworICBQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT4gcGx1OworICBWRVJJRllfUkFJU0VTX0FTU0VSVChwbHUubWF0cml4TFUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocGx1LnBlcm11dGF0aW9uUCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChwbHUuc29sdmUodG1wKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocGx1LmRldGVybWluYW50KCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHBsdS5pbnZlcnNlKCkpCit9CisKK3ZvaWQgdGVzdF9sdSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeDNmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGx1X2ludmVydGlibGU8TWF0cml4M2Y+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzIoIChsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXg8ZG91YmxlLCA0LCA2PiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIChsdV92ZXJpZnlfYXNzZXJ0PE1hdHJpeDxkb3VibGUsIDQsIDY+ID4oKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8zKCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGY+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF80KCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSApOworICAgIENBTExfU1VCVEVTVF80KCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGx1X3BhcnRpYWxfcGl2PE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGQ+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF81KCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbHVfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Y+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF82KCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbHVfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbHVfcGFydGlhbF9waXY8TWF0cml4WGNkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNkPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNygoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeDxmbG9hdCxEeW5hbWljLDE2PiA+KCkgKSk7CisKKyAgICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgICBDQUxMX1NVQlRFU1RfOSggUGFydGlhbFBpdkxVPE1hdHJpeFhmPigxMCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggRnVsbFBpdkxVPE1hdHJpeFhmPigxMCwgMjApOyApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L21haW4uaCBiL3Rlc3QvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTMyNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21haW4uaApAQCAtMCwwICsxLDc1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworLy8gVGhlIGZvbGxvd2luZyBpbmNsdWRlcyBvZiBTVEwgaGVhZGVycyBoYXZlIHRvIGJlIGRvbmUgX2JlZm9yZV8gdGhlCisvLyBkZWZpbml0aW9uIG9mIG1hY3JvcyBtaW4oKSBhbmQgbWF4KCkuICBUaGUgcmVhc29uIGlzIHRoYXQgbWFueSBTVEwKKy8vIGltcGxlbWVudGF0aW9ucyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IGFzIHRoZSBtaW4gYW5kIG1heCBzeW1ib2xzIGNvbGxpZGUKKy8vIHdpdGggdGhlIFNUTCBmdW5jdGlvbnMgc3RkOm1pbigpIGFuZCBzdGQ6Om1heCgpLiAgVGhlIFNUTCBoZWFkZXJzIG1heSBjaGVjaworLy8gZm9yIHRoZSBtYWNybyBkZWZpbml0aW9uIG9mIG1pbi9tYXggYW5kIGlzc3VlIGEgd2FybmluZyBvciB1bmRlZmluZSB0aGUKKy8vIG1hY3Jvcy4KKy8vCisvLyBTdGlsbCwgV2luZG93cyBkZWZpbmVzIG1pbigpIGFuZCBtYXgoKSBpbiB3aW5kZWYuaCBhcyBwYXJ0IG9mIHRoZSByZWd1bGFyCisvLyBXaW5kb3dzIHN5c3RlbSBpbnRlcmZhY2VzIGFuZCBtYW55IG90aGVyIFdpbmRvd3MgQVBJcyBkZXBlbmQgb24gdGhlc2UKKy8vIG1hY3JvcyBiZWluZyBhdmFpbGFibGUuICBUbyBwcmV2ZW50IHRoZSBtYWNybyBleHBhbnNpb24gb2YgbWluL21heCBhbmQgdG8KKy8vIG1ha2UgRWlnZW4gY29tcGF0aWJsZSB3aXRoIHRoZSBXaW5kb3dzIGVudmlyb25tZW50IGFsbCBmdW5jdGlvbiBjYWxscyBvZgorLy8gc3RkOjptaW4oKSBhbmQgc3RkOjptYXgoKSBoYXZlIHRvIGJlIHdyaXR0ZW4gd2l0aCBwYXJlbnRoZXNpcyBhcm91bmQgdGhlCisvLyBmdW5jdGlvbiBuYW1lLgorLy8KKy8vIEFsbCBTVEwgaGVhZGVycyB1c2VkIGJ5IEVpZ2VuIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlLiAgQmVjYXVzZSBtYWluLmggaXMKKy8vIGluY2x1ZGVkIGJlZm9yZSBhbnkgRWlnZW4gaGVhZGVyIGFuZCBiZWNhdXNlIHRoZSBTVEwgaGVhZGVycyBhcmUgZ3VhcmRlZAorLy8gYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLCBubyBTVEwgaGVhZGVyIHdpbGwgc2VlIG91ciBvd24gbWluL21heCBtYWNybworLy8gZGVmaW5pdGlvbnMuCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bGlzdD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8cmFuZG9tPgorI2lmZGVmIEVJR0VOX1VTRV9USFJFQURTCisjaW5jbHVkZSA8ZnV0dXJlPgorI2VuZGlmCisjZW5kaWYKKworLy8gVG8gdGVzdCB0aGF0IGFsbCBjYWxscyBmcm9tIEVpZ2VuIGNvZGUgdG8gc3RkOjptaW4oKSBhbmQgc3RkOjptYXgoKSBhcmUKKy8vIHByb3RlY3RlZCBieSBwYXJlbnRoZXNpcyBhZ2FpbnN0IG1hY3JvIGV4cGFuc2lvbiwgdGhlIG1pbigpL21heCgpIG1hY3JvcworLy8gYXJlIGRlZmluZWQgaGVyZSBhbmQgYW55IG5vdC1wYXJlbnRoZXNpemVkIG1pbi9tYXggY2FsbCB3aWxsIGNhdXNlIGEKKy8vIGNvbXBpbGVyIGVycm9yLgorI2RlZmluZSBtaW4oQSxCKSBwbGVhc2VfcHJvdGVjdF95b3VyX21pbl93aXRoX3BhcmVudGhlc2VzCisjZGVmaW5lIG1heChBLEIpIHBsZWFzZV9wcm90ZWN0X3lvdXJfbWF4X3dpdGhfcGFyZW50aGVzZXMKKyNkZWZpbmUgaXNuYW4oWCkgcGxlYXNlX3Byb3RlY3RfeW91cl9pc25hbl93aXRoX3BhcmVudGhlc2VzCisjZGVmaW5lIGlzaW5mKFgpIHBsZWFzZV9wcm90ZWN0X3lvdXJfaXNpbmZfd2l0aF9wYXJlbnRoZXNlcworI2RlZmluZSBpc2Zpbml0ZShYKSBwbGVhc2VfcHJvdGVjdF95b3VyX2lzZmluaXRlX3dpdGhfcGFyZW50aGVzZXMKKyNpZmRlZiBNX1BJCisjdW5kZWYgTV9QSQorI2VuZGlmCisjZGVmaW5lIE1fUEkgcGxlYXNlX3VzZV9FSUdFTl9QSV9pbnN0ZWFkX29mX01fUEkKKworI2RlZmluZSBGT1JCSURERU5fSURFTlRJRklFUiAodGhpc19pZGVudGlmaWVyX2lzX2ZvcmJpZGRlbl90b19hdm9pZF9jbGFzaGVzKSB0aGlzX2lkZW50aWZpZXJfaXNfZm9yYmlkZGVuX3RvX2F2b2lkX2NsYXNoZXMKKy8vIEIwIGlzIGRlZmluZWQgaW4gUE9TSVggaGVhZGVyIHRlcm1pb3MuaAorI2RlZmluZSBCMCBGT1JCSURERU5fSURFTlRJRklFUgorCisvLyBVbml0IHRlc3RzIGNhbGxpbmcgRWlnZW4ncyBibGFzIGxpYnJhcnkgbXVzdCBwcmVzZXJ2ZSB0aGUgZGVmYXVsdCBibG9ja2luZyBzaXplCisvLyB0byBhdm9pZCB0cm91Ymxlcy4KKyNpZm5kZWYgRUlHRU5fTk9fREVCVUdfU01BTExfUFJPRFVDVF9CTE9DS1MKKyNkZWZpbmUgRUlHRU5fREVCVUdfU01BTExfUFJPRFVDVF9CTE9DS1MKKyNlbmRpZgorCisvLyBzaHV0cyBkb3duIElDQydzIHJlbWFyayAjNTkzOiB2YXJpYWJsZSAiWFhYIiB3YXMgc2V0IGJ1dCBuZXZlciB1c2VkCisjZGVmaW5lIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoWCkgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKFgpCisKKyNpZmRlZiBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKworc3RhdGljIGxvbmcgaW50IG5iX3RlbXBvcmFyaWVzOworc3RhdGljIGxvbmcgaW50IG5iX3RlbXBvcmFyaWVzX29uX2Fzc2VydCA9IC0xOworCitpbmxpbmUgdm9pZCBvbl90ZW1wb3JhcnlfY3JlYXRpb24obG9uZyBpbnQgc2l6ZSkgeworICAvLyBoZXJlJ3MgYSBncmVhdCBwbGFjZSB0byBzZXQgYSBicmVha3BvaW50IHdoZW4gZGVidWdnaW5nIGZhaWx1cmVzIGluIHRoaXMgdGVzdCEKKyAgaWYoc2l6ZSE9MCkgbmJfdGVtcG9yYXJpZXMrKzsKKyAgaWYobmJfdGVtcG9yYXJpZXNfb25fYXNzZXJ0PjApIGFzc2VydChuYl90ZW1wb3JhcmllczxuYl90ZW1wb3Jhcmllc19vbl9hc3NlcnQpOworfQorCisjZGVmaW5lIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4geyBvbl90ZW1wb3JhcnlfY3JlYXRpb24oc2l6ZSk7IH0KKworI2RlZmluZSBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChYUFIsTikge1wKKyAgICBuYl90ZW1wb3JhcmllcyA9IDA7IFwKKyAgICBYUFI7IFwKKyAgICBpZihuYl90ZW1wb3JhcmllcyE9TikgeyBzdGQ6OmNlcnIgPDwgIm5iX3RlbXBvcmFyaWVzID09ICIgPDwgbmJfdGVtcG9yYXJpZXMgPDwgIlxuIjsgfVwKKyAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09TiApOyBcCisgIH0KKyAgCisjZW5kaWYKKworLy8gdGhlIGZvbGxvd2luZyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNtYWtlCisjaW5jbHVkZSAic3BsaXRfdGVzdF9oZWxwZXIuaCIKKworI2lmZGVmIE5ERUJVRworI3VuZGVmIE5ERUJVRworI2VuZGlmCisKKy8vIE9uIHdpbmRvd3MgQ0UsIE5ERUJVRyBpcyBhdXRvbWF0aWNhbGx5IGRlZmluZWQgPGFzc2VydC5oPiBpZiBOREVCVUcgaXMgbm90IGRlZmluZWQuCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworLy8gYm91bmRzIGludGVnZXIgdmFsdWVzIGZvciBBbHRpVmVjCisjaWYgZGVmaW5lZChfX0FMVElWRUNfXykgfHwgZGVmaW5lZChfX1ZTWF9fKQorI2RlZmluZSBFSUdFTl9NQUtJTkdfRE9DUworI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fVEVTVF9GVU5DCisjZXJyb3IgRUlHRU5fVEVTVF9GVU5DIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9SRVBFQVQgMTAKKworbmFtZXNwYWNlIEVpZ2VuCit7CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ190ZXN0X3N0YWNrOworICAvLyBsZXZlbCA9PSAwIDw9PiBhYm9ydCBpZiB0ZXN0IGZhaWwKKyAgLy8gbGV2ZWwgPj0gMSA8PT4gd2FybmluZyBtZXNzYWdlIHRvIHN0ZDo6Y2VyciBpZiB0ZXN0IGZhaWwKKyAgc3RhdGljIGludCBnX3Rlc3RfbGV2ZWwgPSAwOworICBzdGF0aWMgaW50IGdfcmVwZWF0OworICBzdGF0aWMgdW5zaWduZWQgaW50IGdfc2VlZDsKKyAgc3RhdGljIGJvb2wgZ19oYXNfc2V0X3JlcGVhdCwgZ19oYXNfc2V0X3NlZWQ7Cit9CisKKyNkZWZpbmUgVFJBQ0sgc3RkOjpjZXJyIDw8IF9fRklMRV9fIDw8ICIgIiA8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGwKKy8vICNkZWZpbmUgVFJBQ0sgd2hpbGUoKQorCisjZGVmaW5lIEVJX1BQX01BS0VfU1RSSU5HMihTKSAjUworI2RlZmluZSBFSV9QUF9NQUtFX1NUUklORyhTKSBFSV9QUF9NQUtFX1NUUklORzIoUykKKworI2RlZmluZSBFSUdFTl9ERUZBVUxUX0lPX0ZPUk1BVCBJT0Zvcm1hdCg0LCAwLCAiICAiLCAiXG4iLCAiIiwgIiIsICIiLCAiIikKKworI2lmIChkZWZpbmVkKF9DUFBVTldJTkQpIHx8IGRlZmluZWQoX19FWENFUFRJT05TKSkgJiYgIWRlZmluZWQoX19DVURBX0FSQ0hfXykKKyAgI2RlZmluZSBFSUdFTl9FWENFUFRJT05TCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKKworICBuYW1lc3BhY2UgRWlnZW4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHNob3VsZF9yYWlzZV9hbl9hc3NlcnQgPSBmYWxzZTsKKworICAgIC8vIFVzZWQgdG8gYXZvaWQgdG8gcmFpc2UgdHdvIGV4Y2VwdGlvbnMgYXQgYSB0aW1lIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgZXhjZXB0aW9uIGlzIG5vdCBwcm9wZXJseSBjYXVnaHQuCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBzZWNvbmQgZXhjZXB0aW9ucyBpcyB0cmlnZ2VyZWQgaW4gYSBkZXN0cnVjdG9yLgorICAgIHN0YXRpYyBib29sIG5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7CisgICAgc3RhdGljIGJvb2wgcmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSB0cnVlOworCisgICAgc3RydWN0IGVpZ2VuX2Fzc2VydF9leGNlcHRpb24KKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9CisgICAgICB+ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpIHsgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7IH0KKyAgICB9OworICB9CisgIC8vIElmIEVJR0VOX0RFQlVHX0FTU0VSVFMgaXMgZGVmaW5lZCBhbmQgaWYgbm8gYXNzZXJ0aW9uIGlzIHRyaWdnZXJlZCB3aGlsZQorICAvLyBvbmUgc2hvdWxkIGhhdmUgYmVlbiwgdGhlbiB0aGUgbGlzdCBvZiBleGNlY3V0ZWQgYXNzZXJ0aW9ucyBpcyBwcmludGVkIG91dC4KKyAgLy8KKyAgLy8gRUlHRU5fREVCVUdfQVNTRVJUUyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0IGFzIGl0CisgIC8vIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBjb21waWxhdGlvbiB0aW1lCisgIC8vIGFuZCBtaWdodCBldmVuIGludHJvZHVjZSBzaWRlIGVmZmVjdHMgdGhhdCB3b3VsZCBoaWRlCisgIC8vIHNvbWUgbWVtb3J5IGVycm9ycy4KKyAgI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0VSVFMKKworICAgIG5hbWVzcGFjZSBFaWdlbgorICAgIHsKKyAgICAgIG5hbWVzcGFjZSBpbnRlcm5hbAorICAgICAgeworICAgICAgICBzdGF0aWMgYm9vbCBwdXNoX2Fzc2VydCA9IGZhbHNlOworICAgICAgfQorICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlaWdlbl9hc3NlcnRfbGlzdDsKKyAgICB9CisgICAgI2RlZmluZSBlaWdlbl9hc3NlcnQoYSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKCAoIShhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkgKSAgICAgXAorICAgICAgeyBcCisgICAgICAgIGlmKHJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlKSBcCisgICAgICAgICAgc3RkOjpjZXJyIDw8ICAjYSA8PCAiICIgX19GSUxFX18gPDwgIigiIDw8IF9fTElORV9fIDw8ICIpXG4iOyBcCisgICAgICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IHRydWU7ICAgICAgIFwKKyAgICAgICAgRUlHRU5fVEhST1dfWChFaWdlbjo6ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpKTsgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmIChFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0KSAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWlnZW5fYXNzZXJ0X2xpc3QucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKEVJX1BQX01BS0VfU1RSSU5HKF9fRklMRV9fKSAiICgiIEVJX1BQX01BS0VfU1RSSU5HKF9fTElORV9fKSAiKSA6ICIgI2EpICk7IFwKKyAgICAgIH0KKworICAgICNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjplaWdlbl9hc3NlcnRfbGlzdC5jbGVhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpwdXNoX2Fzc2VydCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6cmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiT25lIG9mIHRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBzaG91bGQgaGF2ZSBiZWVuIHRyaWdnZXJlZDpcbiI7ICBcCisgICAgICAgICAgZm9yICh1aW50IGFpPTAgOyBhaTxlaWdlbl9hc3NlcnRfbGlzdC5zaXplKCkgOyArK2FpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiICAiIDw8IGVpZ2VuX2Fzc2VydF9saXN0W2FpXSA8PCAiXG4iOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFZFUklGWShFaWdlbjo6c2hvdWxkX3JhaXNlX2FuX2Fzc2VydCAmJiAjIGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0ID0gZmFsc2U7IFZFUklGWSh0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjpyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpwdXNoX2Fzc2VydCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfQorICAgICNlbmRpZiAvL0VJR0VOX0VYQ0VQVElPTlMKKworICAjZWxpZiAhZGVmaW5lZChfX0NVREFDQ19fKSAvLyBFSUdFTl9ERUJVR19BU1NFUlRTCisgICAgLy8gc2VlIGJ1ZyA4OS4gVGhlIGNvcHlfYm9vbCBoZXJlIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGdjYyA8PSA0LjMKKyAgICAjZGVmaW5lIGVpZ2VuX2Fzc2VydChhKSBcCisgICAgICBpZiggKCFFaWdlbjo6aW50ZXJuYWw6OmNvcHlfYm9vbChhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkgKVwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IHRydWU7ICAgICAgICAgXAorICAgICAgICBpZihyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSkgIFwKKyAgICAgICAgICBlaWdlbl9wbGFpbl9hc3NlcnQoYSk7ICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEVJR0VOX1RIUk9XX1goRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24oKSk7IFwKKyAgICAgIH0KKyAgICAjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworICAgICAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6cmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSBmYWxzZTsgICAgICAgICAgXAorICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFZFUklGWShFaWdlbjo6c2hvdWxkX3JhaXNlX2FuX2Fzc2VydCAmJiAjIGEpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXRjaCAoRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24mKSB7IFZFUklGWSh0cnVlKTsgfSAgXAorICAgICAgICBFaWdlbjo6cmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSB0cnVlOyAgICAgICAgICAgXAorICAgICAgfQorICAgICNlbmRpZiAvL0VJR0VOX0VYQ0VQVElPTlMKKyAgI2VuZGlmIC8vIEVJR0VOX0RFQlVHX0FTU0VSVFMKKworI2lmbmRlZiBWRVJJRllfUkFJU0VTX0FTU0VSVAorICAjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpIFwKKyAgICBzdGQ6OmNvdXQgPDwgIkNhbid0IFZFUklGWV9SQUlTRVNfQVNTRVJUKCAiICNhICIgKSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWRcbiI7CisjZW5kaWYKKyAgICAKKyAgI2lmICFkZWZpbmVkKF9fQ1VEQUNDX18pCisgICNkZWZpbmUgRUlHRU5fVVNFX0NVU1RPTV9BU1NFUlQKKyAgI2VuZGlmCisKKyNlbHNlIC8vIEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORworCisgICNkZWZpbmUgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSkge30KKworI2VuZGlmIC8vIEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORworCisKKyNkZWZpbmUgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HCisjaW5jbHVkZSA8RWlnZW4vUVI+IC8vIHJlcXVpcmVkIGZvciBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuaworCitpbmxpbmUgdm9pZCB2ZXJpZnlfaW1wbChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciAqdGVzdG5hbWUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpjb25kaXRpb25fYXNfc3RyaW5nKQoreworICBpZiAoIWNvbmRpdGlvbikKKyAgeworICAgIGlmKEVpZ2VuOjpnX3Rlc3RfbGV2ZWw+MCkKKyAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCB0ZXN0bmFtZSA8PCAiIGZhaWxlZCBpbiAiIDw8IGZpbGUgPDwgIiAoIiA8PCBsaW5lIDw8ICIpIgorICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgIiA8PCBjb25kaXRpb25fYXNfc3RyaW5nIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIlN0YWNrOlxuIjsKKyAgICBjb25zdCBpbnQgdGVzdF9zdGFja19zaXplID0gc3RhdGljX2Nhc3Q8aW50PihFaWdlbjo6Z190ZXN0X3N0YWNrLnNpemUoKSk7CisgICAgZm9yKGludCBpPXRlc3Rfc3RhY2tfc2l6ZS0xOyBpPj0wOyAtLWkpCisgICAgICBzdGQ6OmNlcnIgPDwgIiAgLSAiIDw8IEVpZ2VuOjpnX3Rlc3Rfc3RhY2tbaV0gPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlxuIjsKKyAgICBpZihFaWdlbjo6Z190ZXN0X2xldmVsPT0wKQorICAgICAgYWJvcnQoKTsKKyAgfQorfQorCisjZGVmaW5lIFZFUklGWShhKSA6OnZlcmlmeV9pbXBsKGEsIGdfdGVzdF9zdGFjay5iYWNrKCkuY19zdHIoKSwgX19GSUxFX18sIF9fTElORV9fLCBFSV9QUF9NQUtFX1NUUklORyhhKSkKKworI2RlZmluZSBWRVJJRllfR0UoYSwgYikgOjp2ZXJpZnlfaW1wbChhID49IGIsIGdfdGVzdF9zdGFjay5iYWNrKCkuY19zdHIoKSwgX19GSUxFX18sIF9fTElORV9fLCBFSV9QUF9NQUtFX1NUUklORyhhID49IGIpKQorI2RlZmluZSBWRVJJRllfTEUoYSwgYikgOjp2ZXJpZnlfaW1wbChhIDw9IGIsIGdfdGVzdF9zdGFjay5iYWNrKCkuY19zdHIoKSwgX19GSUxFX18sIF9fTElORV9fLCBFSV9QUF9NQUtFX1NUUklORyhhIDw9IGIpKQorCisKKyNkZWZpbmUgVkVSSUZZX0lTX0VRVUFMKGEsIGIpIFZFUklGWSh0ZXN0X2lzX2VxdWFsKGEsIGIsIHRydWUpKQorI2RlZmluZSBWRVJJRllfSVNfTk9UX0VRVUFMKGEsIGIpIFZFUklGWSh0ZXN0X2lzX2VxdWFsKGEsIGIsIGZhbHNlKSkKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWChhLCBiKSBWRVJJRlkodmVyaWZ5SXNBcHByb3goYSwgYikpCisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSghdGVzdF9pc0FwcHJveChhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGEsIGIpIFZFUklGWSh0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfTk9UX01VQ0hfU01BTExFUl9USEFOKGEsIGIpIFZFUklGWSghdGVzdF9pc011Y2hTbWFsbGVyVGhhbihhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oYSwgYikgVkVSSUZZKHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfTk9UX0FQUFJPWF9PUl9MRVNTX1RIQU4oYSwgYikgVkVSSUZZKCF0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbihhLCBiKSkKKworI2RlZmluZSBWRVJJRllfSVNfVU5JVEFSWShhKSBWRVJJRlkodGVzdF9pc1VuaXRhcnkoYSkpCisKKyNkZWZpbmUgQ0FMTF9TVUJURVNUKEZVTkMpIGRvIHsgXAorICAgIGdfdGVzdF9zdGFjay5wdXNoX2JhY2soRUlfUFBfTUFLRV9TVFJJTkcoRlVOQykpOyBcCisgICAgRlVOQzsgXAorICAgIGdfdGVzdF9zdGFjay5wb3BfYmFjaygpOyBcCisgIH0gd2hpbGUgKDApCisKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpIHsgcmV0dXJuIDFlLTNmOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpIHsgcmV0dXJuIDFlLTY7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpIHsgcmV0dXJuIDFlLTZsOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQordGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCk7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gPigpIHsgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpOyB9CisKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3Qgc2hvcnQmIGEsIGNvbnN0IHNob3J0JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPHNob3J0PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCB1bnNpZ25lZCBzaG9ydCYgYSwgY29uc3QgdW5zaWduZWQgc2hvcnQmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248dW5zaWduZWQgbG9uZz4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3QgdW5zaWduZWQgaW50JiBhLCBjb25zdCB1bnNpZ25lZCBpbnQmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248dW5zaWduZWQgaW50PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBsb25nJiBhLCBjb25zdCBsb25nJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPGxvbmc+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IHVuc2lnbmVkIGxvbmcmIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248dW5zaWduZWQgbG9uZz4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxpbnQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IGludCYgYSwgY29uc3QgaW50JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGludD4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IGludCYgYSwgY29uc3QgaW50JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxpbnQ+KCkpOyB9CisKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3QgZmxvYXQmIGEsIGNvbnN0IGZsb2F0JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBmbG9hdCYgYSwgY29uc3QgZmxvYXQmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBmbG9hdCYgYSwgY29uc3QgZmxvYXQmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsgfQorCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgZG91YmxlJiBhLCBjb25zdCBkb3VibGUmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgZG91YmxlJiBhLCBjb25zdCBkb3VibGUmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSk7IH0KKworI2lmbmRlZiBFSUdFTl9URVNUX05PX0NPTVBMRVgKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsgfQorCisjaWZuZGVmIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gPigpKTsgfQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3QgbG9uZyBkb3VibGUmIGEsIGNvbnN0IGxvbmcgZG91YmxlJiBiKQoreworICAgIGJvb2wgcmV0ID0gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpKTsKKyAgICBpZiAoIXJldCkgc3RkOjpjZXJyCisgICAgICAgIDw8IHN0ZDo6ZW5kbCA8PCAiICAgIGFjdHVhbCAgID0gIiA8PCBhCisgICAgICAgIDw8IHN0ZDo6ZW5kbCA8PCAiICAgIGV4cGVjdGVkID0gIiA8PCBiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIHJldDsKK30KKworaW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpKTsgfQorI2VuZGlmIC8vIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IGhhbGYmIGEsIGNvbnN0IGhhbGYmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248aGFsZj4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxoYWxmPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgaGFsZiYgYSwgY29uc3QgaGFsZiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248aGFsZj4oKSk7IH0KKworLy8gdGVzdF9yZWxhdGl2ZV9lcnJvciByZXR1cm5zIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgYiBhcyBhIHJlYWwgc2NhbGFyIGFzIHVzZWQgaW4gaXNBcHByb3guCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUMTo6UmVhbFNjYWxhcj46Ok5vbkludGVnZXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBFaWdlbkJhc2U8VDE+ICZhLCBjb25zdCBFaWdlbkJhc2U8VDI+ICZiKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIFQxOjpSZWFsU2NhbGFyPjo6Tm9uSW50ZWdlciBSZWFsU2NhbGFyOworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8VDEsMj46OnR5cGUgZWEoYS5kZXJpdmVkKCkpOworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8VDIsMj46OnR5cGUgZWIoYi5kZXJpdmVkKCkpOworICByZXR1cm4gc3FydChSZWFsU2NhbGFyKChlYS1lYikuY3dpc2VBYnMyKCkuc3VtKCkpIC8gUmVhbFNjYWxhcigoc3RkOjptaW4pKGViLmN3aXNlQWJzMigpLnN1bSgpLGVhLmN3aXNlQWJzMigpLnN1bSgpKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIFQxOjpSZWFsU2NhbGFyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgVDEgJmEsIGNvbnN0IFQyICZiLCBjb25zdCB0eXBlbmFtZSBUMTo6Q29lZmZpY2llbnRzKiA9IDApCit7CisgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEuY29lZmZzKCksIGIuY29lZmZzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIFQxOjpTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBUMSAmYSwgY29uc3QgVDIgJmIsIGNvbnN0IHR5cGVuYW1lIFQxOjpNYXRyaXhUeXBlKiA9IDApCit7CisgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEubWF0cml4KCksIGIubWF0cml4KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgRD4KK1MgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBUcmFuc2xhdGlvbjxTLEQ+ICZhLCBjb25zdCBUcmFuc2xhdGlvbjxTLEQ+ICZiKQoreworICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcihhLnZlY3RvcigpLCBiLnZlY3RvcigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFMsIGludCBELCBpbnQgTz4KK1MgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBQYXJhbWV0cml6ZWRMaW5lPFMsRCxPPiAmYSwgY29uc3QgUGFyYW1ldHJpemVkTGluZTxTLEQsTz4gJmIpCit7CisgIHJldHVybiAoc3RkOjptYXgpKHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5vcmlnaW4oKSwgYi5vcmlnaW4oKSksIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5vcmlnaW4oKSwgYi5vcmlnaW4oKSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgaW50IEQ+CitTIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQWxpZ25lZEJveDxTLEQ+ICZhLCBjb25zdCBBbGlnbmVkQm94PFMsRD4gJmIpCit7CisgIHJldHVybiAoc3RkOjptYXgpKHRlc3RfcmVsYXRpdmVfZXJyb3IoKGEubWluKSgpLCAoYi5taW4pKCkpLCB0ZXN0X3JlbGF0aXZlX2Vycm9yKChhLm1heCkoKSwgKGIubWF4KSgpKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZU1hdHJpeEJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIFQxOjpSZWFsU2NhbGFyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgTWF0cml4QmFzZTxUMT4gJmEsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8VDI+ICZiKQoreworICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcihhLGIudG9EZW5zZSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgU3BhcnNlTWF0cml4QmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQxLHR5cGVuYW1lIFQyPgordHlwZW5hbWUgVDE6OlJlYWxTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQxPiAmYSwgY29uc3QgTWF0cml4QmFzZTxUMj4gJmIpCit7CisgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEudG9EZW5zZSgpLGIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTcGFyc2VNYXRyaXhCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Cit0eXBlbmFtZSBUMTo6UmVhbFNjYWxhciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8VDE+ICZhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQyPiAmYikKK3sKKyAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS50b0RlbnNlKCksYi50b0RlbnNlKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBOdW1UcmFpdHM8VDE+OjpSZWFsPjo6Tm9uSW50ZWdlciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFQxICZhLCBjb25zdCBUMiAmYiwgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxpbnRlcm5hbDo6aXNfYXJpdGhtZXRpYzx0eXBlbmFtZSBOdW1UcmFpdHM8VDE+OjpSZWFsPjo6dmFsdWUsIFQxPjo6dHlwZSogPSAwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBOdW1UcmFpdHM8VDE+OjpSZWFsPjo6Tm9uSW50ZWdlciBSZWFsU2NhbGFyOworICByZXR1cm4gbnVtZXh0OjpzcXJ0KFJlYWxTY2FsYXIobnVtZXh0OjphYnMyKGEtYikpL1JlYWxTY2FsYXIoKG51bWV4dDo6bWluaSkobnVtZXh0OjphYnMyKGEpLG51bWV4dDo6YWJzMihiKSkpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBSb3RhdGlvbjJEPFQ+ICZhLCBjb25zdCBSb3RhdGlvbjJEPFQ+ICZiKQoreworICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcihhLmFuZ2xlKCksIGIuYW5nbGUoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQW5nbGVBeGlzPFQ+ICZhLCBjb25zdCBBbmdsZUF4aXM8VD4gJmIpCit7CisgIHJldHVybiAoc3RkOjptYXgpKHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5hbmdsZSgpLCBiLmFuZ2xlKCkpLCB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEuYXhpcygpLCBiLmF4aXMoKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgdHlwZW5hbWUgVHlwZTE6OlNjYWxhciogPSAwKSAvLyBFbmFibGVkIGZvciBFaWdlbidzIHR5cGUgb25seQoreworICByZXR1cm4gYS5pc0FwcHJveChiLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBUeXBlMTo6U2NhbGFyPigpKTsKK30KKworLy8gZ2V0X3Rlc3RfcHJlY2lzaW9uIGlzIGEgc21hbGwgd3JhcHBlciB0byB0ZXN0X3ByZWNpc2lvbiBhbGxvd2luZyB0byByZXR1cm4gdGhlIHNjYWxhciBwcmVjaXNpb24gZm9yIGVpdGhlciBzY2FsYXJzIG9yIGV4cHJlc3Npb25zCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIFQ6OlNjYWxhcj46OlJlYWwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGNvbnN0IFQmLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqID0gMCkKK3sKKyAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUOjpTY2FsYXI+OjpSZWFsPigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIGdldF90ZXN0X3ByZWNpc2lvbihjb25zdCBUJix0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPGludGVybmFsOjppc19hcml0aG1ldGljPHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbD46OnZhbHVlLCBUPjo6dHlwZSogPSAwKQoreworICByZXR1cm4gdGVzdF9wcmVjaXNpb248dHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsPigpOworfQorCisvLyB2ZXJpZnlJc0FwcHJveCBpcyBhIHdyYXBwZXIgdG8gdGVzdF9pc0FwcHJveCB0aGF0IG91dHB1dHMgdGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgbWFnbml0dWRlIGlmIHRoZSB0ZXN0IGZhaWxzLgordGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyPgoraW5saW5lIGJvb2wgdmVyaWZ5SXNBcHByb3goY29uc3QgVHlwZTEmIGEsIGNvbnN0IFR5cGUyJiBiKQoreworICBib29sIHJldCA9IHRlc3RfaXNBcHByb3goYSxiKTsKKyAgaWYoIXJldCkKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiRGlmZmVyZW5jZSB0b28gbGFyZ2Ugd3J0IHRvbGVyYW5jZSAiIDw8IGdldF90ZXN0X3ByZWNpc2lvbihhKSAgPDwgIiwgcmVsYXRpdmUgZXJyb3IgaXM6ICIgPDwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLGIpIDw8IHN0ZDo6ZW5kbDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBUaGUgaWRlYSBiZWhpbmQgdGhpcyBmdW5jdGlvbiBpcyB0byBjb21wYXJlIHRoZSB0d28gc2NhbGFycyBhIGFuZCBiIHdoZXJlCisvLyB0aGUgc2NhbGFyIHJlZiBpcyBhIGhpbnQgYWJvdXQgdGhlIGV4cGVjdGVkIG9yZGVyIG9mIG1hZ25pdHVkZSBvZiBhIGFuZCBiLgorLy8gV0FSTklORzogdGhlIHNjYWxhciBhIGFuZCBiIG11c3QgYmUgcG9zaXRpdmUKKy8vIFRoZXJlZm9yZSwgaWYgZm9yIHNvbWUgcmVhc29uIGEgYW5kIGIgYXJlIHZlcnkgc21hbGwgY29tcGFyZWQgdG8gcmVmLAorLy8gd2Ugd29uJ3QgaXNzdWUgYSBmYWxzZSBuZWdhdGl2ZS4KKy8vIFRoaXMgdGVzdCBjb3VsZCBiZTogYWJzKGEtYikgPD0gZXBzICogcmVmCisvLyBIb3dldmVyLCBpdCBzZWVtcyB0aGF0IHNpbXBseSBjb21wYXJpbmcgYStyZWYgYW5kIGIrcmVmIGlzIG1vcmUgc2Vuc2l0aXZlIHRvIHRydWUgZXJyb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsdHlwZW5hbWUgU2NhbGFyUmVmPgoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveFdpdGhSZWYoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIsIGNvbnN0IFNjYWxhclJlZiYgcmVmKQoreworICByZXR1cm4gdGVzdF9pc0FwcHJveChhK3JlZiwgYityZWYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDE+JiBtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIG0yKQoreworICByZXR1cm4gbTEuaXNNdWNoU21hbGxlclRoYW4obTIsIHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZDE+OjpTY2FsYXI+KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCYgcykKK3sKKyAgcmV0dXJuIG0uaXNNdWNoU21hbGxlclRoYW4ocywgdGVzdF9wcmVjaXNpb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPigpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBib29sIHRlc3RfaXNVbml0YXJ5KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pCit7CisgIHJldHVybiBtLmlzVW5pdGFyeSh0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+KCkpOworfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIElDQyB3YXJuaW5nCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCB0ZXN0X2lzX2VxdWFsKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQsIGJvb2wgZXhwZWN0X2VxdWFsPXRydWUpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCB0ZXN0X2lzX2VxdWFsKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQsIGJvb2wgZXhwZWN0X2VxdWFsKQoreworICAgIGlmICgoYWN0dWFsPT1leHBlY3RlZCkgPT0gZXhwZWN0X2VxdWFsKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBmYWxzZToKKyAgICBzdGQ6OmNlcnIKKyAgICAgICAgPDwgIlxuICAgIGFjdHVhbCAgID0gIiA8PCBhY3R1YWwKKyAgICAgICAgPDwgIlxuICAgIGV4cGVjdGVkICIgPDwgKGV4cGVjdF9lcXVhbCA/ICI9ICIgOiAiIT0iKSA8PCBleHBlY3RlZCA8PCAiXG5cbiI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogQ3JlYXRlcyBhIHJhbmRvbSBQYXJ0aWFsIElzb21ldHJ5IG1hdHJpeCBvZiBnaXZlbiByYW5rLgorICAqCisgICogQSBwYXJ0aWFsIGlzb21ldHJ5IGlzIGEgbWF0cml4IGFsbCBvZiB3aG9zZSBzaW5ndWxhciB2YWx1ZXMgYXJlIGVpdGhlciAwIG9yIDEuCisgICogVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byB0ZXN0IHJhbmstcmV2ZWFsaW5nIGFsZ29yaXRobXMuCisgICovCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIElDQyB3YXJuaW5nCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhJbmRleCBkZXNpcmVkX3JhbmssIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIG0pOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsoSW5kZXggZGVzaXJlZF9yYW5rLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CisgIGVudW0geyBSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIENvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBSb3dzPiBNYXRyaXhBVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzLCBDb2xzPiBNYXRyaXhCVHlwZTsKKworICBpZihkZXNpcmVkX3JhbmsgPT0gMCkKKyAgeworICAgIG0uc2V0WmVybyhyb3dzLGNvbHMpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmKGRlc2lyZWRfcmFuayA9PSAxKQorICB7CisgICAgLy8gaGVyZSB3ZSBub3JtYWxpemUgdGhlIHZlY3RvcnMgdG8gZ2V0IGEgcGFydGlhbCBpc29tZXRyeQorICAgIG0gPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cykubm9ybWFsaXplZCgpICogVmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpLm5vcm1hbGl6ZWQoKS50cmFuc3Bvc2UoKTsKKyAgICByZXR1cm47CisgIH0KKworICBNYXRyaXhBVHlwZSBhID0gTWF0cml4QVR5cGU6OlJhbmRvbShyb3dzLHJvd3MpOworICBNYXRyaXhUeXBlIGQgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpOworICBNYXRyaXhCVHlwZSAgYiA9IE1hdHJpeEJUeXBlOjpSYW5kb20oY29scyxjb2xzKTsKKworICAvLyBzZXQgdGhlIGRpYWdvbmFsIHN1Y2ggdGhhdCBvbmx5IGRlc2lyZWRfcmFuayBub24temVybyBlbnRyaWVzIHJlYW1haW4KKyAgY29uc3QgSW5kZXggZGlhZ19zaXplID0gKHN0ZDo6bWluKShkLnJvd3MoKSxkLmNvbHMoKSk7CisgIGlmKGRpYWdfc2l6ZSAhPSBkZXNpcmVkX3JhbmspCisgICAgZC5kaWFnb25hbCgpLnNlZ21lbnQoZGVzaXJlZF9yYW5rLCBkaWFnX3NpemUtZGVzaXJlZF9yYW5rKSA9IFZlY3RvclR5cGU6Olplcm8oZGlhZ19zaXplLWRlc2lyZWRfcmFuayk7CisKKyAgSG91c2Vob2xkZXJRUjxNYXRyaXhBVHlwZT4gcXJhKGEpOworICBIb3VzZWhvbGRlclFSPE1hdHJpeEJUeXBlPiBxcmIoYik7CisgIG0gPSBxcmEuaG91c2Vob2xkZXJRKCkgKiBkICogcXJiLmhvdXNlaG9sZGVyUSgpOworfQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIElDQyB3YXJuaW5nCit0ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU+Cit2b2lkIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKFBlcm11dGF0aW9uVmVjdG9yVHlwZSYgdiwgSW5kZXggc2l6ZSk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU+Cit2b2lkIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKFBlcm11dGF0aW9uVmVjdG9yVHlwZSYgdiwgSW5kZXggc2l6ZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHYucmVzaXplKHNpemUpOworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHYoaSkgPSBTY2FsYXIoaSk7CisgIGlmKHNpemUgPT0gMSkgcmV0dXJuOworICBmb3IoSW5kZXggbiA9IDA7IG4gPCAzICogc2l6ZTsgKytuKQorICB7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUtMSk7CisgICAgSW5kZXggajsKKyAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsgd2hpbGUoaj09aSk7CisgICAgc3RkOjpzd2FwKHYoaSksIHYoaikpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgaXNOb3ROYU4oY29uc3QgVCYgeCkKK3sKKyAgcmV0dXJuIHg9PXg7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgaXNQbHVzSW5mKGNvbnN0IFQmIHgpCit7CisgIHJldHVybiB4ID4gTnVtVHJhaXRzPFQ+OjpoaWdoZXN0KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgaXNNaW51c0luZihjb25zdCBUJiB4KQoreworICByZXR1cm4geCA8IE51bVRyYWl0czxUPjo6bG93ZXN0KCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxmbG9hdD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxkb3VibGU+IHsgdHlwZWRlZiBmbG9hdCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU8c3RkOjpjb21wbGV4PFQ+ID4KK3sgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxUPjo6dHlwZT4gdHlwZTsgfTsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBJQ0Mgd2FybmluZwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lKCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyB0eXBlX25hbWUoKSAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gIm90aGVyIjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZmxvYXQ+KCkgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICJmbG9hdCI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPGRvdWJsZT4oKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiZG91YmxlIjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8bG9uZyBkb3VibGU+KCkgICAgICAgICAgICAgICAgIHsgcmV0dXJuICJsb25nIGRvdWJsZSI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPGludD4oKSAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiaW50IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgICAgICAgIHsgcmV0dXJuICJjb21wbGV4PGZsb2F0PiI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSAgICAgICB7IHJldHVybiAiY29tcGxleDxkb3VibGU+IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGxvbmcgZG91YmxlPiA+KCkgIHsgcmV0dXJuICJjb21wbGV4PGxvbmcgZG91YmxlPiI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxpbnQ+ID4oKSAgICAgICAgICB7IHJldHVybiAiY29tcGxleDxpbnQ+IjsgfQorCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBtYWluIHRlc3QgZnVuY3Rpb24KK3ZvaWQgRUlHRU5fQ0FUKHRlc3RfLEVJR0VOX1RFU1RfRlVOQykoKTsKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbmxpbmUgdm9pZCBzZXRfcmVwZWF0X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgZXJybm8gPSAwOworICBnX3JlcGVhdCA9IGludChzdHJ0b3VsKHN0ciwgMCwgMTApKTsKKyAgaWYoZXJybm8gfHwgZ19yZXBlYXQgPD0gMCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiSW52YWxpZCByZXBlYXQgdmFsdWUgIiA8PCBzdHIgPDwgc3RkOjplbmRsOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBnX2hhc19zZXRfcmVwZWF0ID0gdHJ1ZTsKK30KKworaW5saW5lIHZvaWQgc2V0X3NlZWRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworICBlcnJubyA9IDA7CisgIGdfc2VlZCA9IGludChzdHJ0b3VsKHN0ciwgMCwgMTApKTsKKyAgaWYoZXJybm8gfHwgZ19zZWVkID09IDApCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgIkludmFsaWQgc2VlZCB2YWx1ZSAiIDw8IHN0ciA8PCBzdGQ6OmVuZGw7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIGdfaGFzX3NldF9zZWVkID0gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBnX2hhc19zZXRfcmVwZWF0ID0gZmFsc2U7CisgICAgZ19oYXNfc2V0X3NlZWQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRfaGVscCA9IGZhbHNlOworCisgICAgZm9yKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZihhcmd2W2ldWzBdID09ICdyJykKKyAgICAgIHsKKyAgICAgICAgaWYoZ19oYXNfc2V0X3JlcGVhdCkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQXJndW1lbnQgIiA8PCBhcmd2W2ldIDw8ICIgY29uZmxpY3Rpbmcgd2l0aCBhIGZvcm1lciBhcmd1bWVudCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHNldF9yZXBlYXRfZnJvbV9zdHJpbmcoYXJndltpXSsxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAncycpCisgICAgICB7CisgICAgICAgIGlmKGdfaGFzX3NldF9zZWVkKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJBcmd1bWVudCAiIDw8IGFyZ3ZbaV0gPDwgIiBjb25mbGljdGluZyB3aXRoIGEgZm9ybWVyIGFyZ3VtZW50IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgIHNldF9zZWVkX2Zyb21fc3RyaW5nKGFyZ3ZbaV0rMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG5lZWRfaGVscCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYobmVlZF9oZWxwKQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiVGhpcyB0ZXN0IGFwcGxpY2F0aW9uIHRha2VzIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgYXJndW1lbnRzOiIgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICIgIHJOICAgICBSZXBlYXQgZWFjaCB0ZXN0IE4gdGltZXMgKGRlZmF1bHQ6ICIgPDwgREVGQVVMVF9SRVBFQVQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICBzTiAgICAgVXNlIE4gYXMgc2VlZCBmb3IgcmFuZG9tIG51bWJlcnMgKGRlZmF1bHQ6IGJhc2VkIG9uIGN1cnJlbnQgdGltZSkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIklmIGRlZmluZWQsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgRUlHRU5fUkVQRUFUIGFuZCBFSUdFTl9TRUVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIndpbGwgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgcGFyYW1ldGVycy4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGNoYXIgKmVudl9FSUdFTl9SRVBFQVQgPSBnZXRlbnYoIkVJR0VOX1JFUEVBVCIpOworICAgIGlmKCFnX2hhc19zZXRfcmVwZWF0ICYmIGVudl9FSUdFTl9SRVBFQVQpCisgICAgICBzZXRfcmVwZWF0X2Zyb21fc3RyaW5nKGVudl9FSUdFTl9SRVBFQVQpOworICAgIGNoYXIgKmVudl9FSUdFTl9TRUVEID0gZ2V0ZW52KCJFSUdFTl9TRUVEIik7CisgICAgaWYoIWdfaGFzX3NldF9zZWVkICYmIGVudl9FSUdFTl9TRUVEKQorICAgICAgc2V0X3NlZWRfZnJvbV9zdHJpbmcoZW52X0VJR0VOX1NFRUQpOworCisgICAgaWYoIWdfaGFzX3NldF9zZWVkKSBnX3NlZWQgPSAodW5zaWduZWQgaW50KSB0aW1lKE5VTEwpOworICAgIGlmKCFnX2hhc19zZXRfcmVwZWF0KSBnX3JlcGVhdCA9IERFRkFVTFRfUkVQRUFUOworCisgICAgc3RkOjpjb3V0IDw8ICJJbml0aWFsaXppbmcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCBzZWVkICIgPDwgZ19zZWVkIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiU2VlZDogIiA8PCBnX3NlZWQ7CisgICAgZ190ZXN0X3N0YWNrLnB1c2hfYmFjayhzcy5zdHIoKSk7CisgICAgc3JhbmQoZ19zZWVkKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlJlcGVhdGluZyBlYWNoIHRlc3QgIiA8PCBnX3JlcGVhdCA8PCAiIHRpbWVzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBFaWdlbjo6Z190ZXN0X3N0YWNrLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhFSV9QUF9NQUtFX1NUUklORyhFSUdFTl9URVNUX0ZVTkMpKSk7CisKKyAgICBFSUdFTl9DQVQodGVzdF8sRUlHRU5fVEVTVF9GVU5DKSgpOworICAgIHJldHVybiAwOworfQorCisvLyBUaGVzZSB3YXJuaW5nIGFyZSBkaXNhYmxlZCBoZXJlIHN1Y2ggdGhhdCB0aGV5IGFyZSBzdGlsbCBPTiB3aGVuIHBhcnNpbmcgRWlnZW4ncyBoZWFkZXIgZmlsZXMuCisjaWYgZGVmaW5lZCBfX0lOVEVMX0NPTVBJTEVSCisgIC8vIHJlbWFyayAjMzgzOiB2YWx1ZSBjb3BpZWQgdG8gdGVtcG9yYXJ5LCByZWZlcmVuY2UgdG8gdGVtcG9yYXJ5IHVzZWQKKyAgLy8gIC0+IHRoaXMgd2FybmluZyBpcyByYWlzZWQgZXZlbiBmb3IgbGVnYWwgdXNhZ2UgYXM6IGdfdGVzdF9zdGFjay5wdXNoX2JhY2soImZvbyIpOyB3aGVyZSBnX3Rlc3Rfc3RhY2sgaXMgYSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4KKyAgLy8gcmVtYXJrICMxNDE4OiBleHRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggbm8gcHJpb3IgZGVjbGFyYXRpb24KKyAgLy8gIC0+IHRoaXMgd2FybmluZyBpcyByYWlzZWQgZm9yIGFsbCBvdXIgdGVzdCBmdW5jdGlvbnMuIERlY2xhcmluZyB0aGVtIHN0YXRpYyB3b3VsZCBmaXggdGhlIGlzc3VlLgorICAvLyB3YXJuaW5nICMyNzk6IGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAgLy8gcmVtYXJrICMxNTcyOiBmbG9hdGluZy1wb2ludCBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBhcmUgdW5yZWxpYWJsZQorICAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyNzkgMzgzIDE0MTggMTU3MgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorICAvLyA0NTAzIC0gZGVjb3JhdGVkIG5hbWUgbGVuZ3RoIGV4Y2VlZGVkLCBuYW1lIHdhcyB0cnVuY2F0ZWQKKyAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUwMykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXBwZWRfbWF0cml4LmNwcCBiL3Rlc3QvbWFwcGVkX21hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4NGM1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFwcGVkX21hdHJpeC5jcHAKQEAgLTAsMCArMSwyMTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVCAvLyB0dXJuIHN0YXRpYyBhc3NlcnRzIGludG8gcnVudGltZSBhc3NlcnRzIGluIG9yZGVyIHRvIGNoZWNrIHRoZW0KKyNlbmRpZgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjZGVmaW5lIEVJR0VOX1RFU1RNQVBfTUFYX1NJWkUgMjU2CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgbWFwX2NsYXNzX3ZlY3Rvcihjb25zdCBWZWN0b3JUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggc2l6ZSA9IG0uc2l6ZSgpOworCisgIFNjYWxhciogYXJyYXkxID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7CisgIFNjYWxhciogYXJyYXkyID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7CisgIFNjYWxhciogYXJyYXkzID0gbmV3IFNjYWxhcltzaXplKzFdOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChpbnRlcm5hbDo6VUludFB0cihhcnJheTMpJUVJR0VOX01BWF9BTElHTl9CWVRFUykgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworICBTY2FsYXIgIGFycmF5NFtFSUdFTl9URVNUTUFQX01BWF9TSVpFXTsKKworICBNYXA8VmVjdG9yVHlwZSwgQWxpZ25lZE1heD4oYXJyYXkxLCBzaXplKSA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgTWFwPFZlY3RvclR5cGUsIEFsaWduZWRNYXg+KGFycmF5Miwgc2l6ZSkgPSBNYXA8VmVjdG9yVHlwZSxBbGlnbmVkTWF4PihhcnJheTEsIHNpemUpOworICBNYXA8VmVjdG9yVHlwZT4oYXJyYXkzdW5hbGlnbmVkLCBzaXplKSA9IE1hcDxWZWN0b3JUeXBlPihhcnJheTEsIHNpemUpOworICBNYXA8VmVjdG9yVHlwZT4oYXJyYXk0LCBzaXplKSAgICAgICAgICA9IE1hcDxWZWN0b3JUeXBlLEFsaWduZWRNYXg+KGFycmF5MSwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWExID0gTWFwPFZlY3RvclR5cGUsIEFsaWduZWRNYXg+KGFycmF5MSwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEyID0gTWFwPFZlY3RvclR5cGUsIEFsaWduZWRNYXg+KGFycmF5Miwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEzID0gTWFwPFZlY3RvclR5cGU+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWE0ID0gTWFwPFZlY3RvclR5cGU+KGFycmF5NCwgc2l6ZSk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hNCk7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHNpemU+PUFsaWduZWRNYXgpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKE1hcDxWZWN0b3JUeXBlLEFsaWduZWRNYXg+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkpKQorICAjZW5kaWYKKworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYXJyYXkxLCBzaXplKTsKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5Miwgc2l6ZSk7CisgIGRlbGV0ZVtdIGFycmF5MzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXBfY2xhc3NfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKSwgc2l6ZSA9IHJvd3MqY29sczsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgLy8gYXJyYXkxIGFuZCBhcnJheTIgLT4gYWxpZ25lZCBoZWFwIGFsbG9jYXRpb24KKyAgU2NhbGFyKiBhcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJyYXkxW2ldID0gU2NhbGFyKDEpOworICBTY2FsYXIqIGFycmF5MiA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOworICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBhcnJheTJbaV0gPSBTY2FsYXIoMSk7CisgIC8vIGFycmF5M3VuYWxpZ25lZCAtPiB1bmFsaWduZWQgcG9pbnRlciB0byBoZWFwCisgIFNjYWxhciogYXJyYXkzID0gbmV3IFNjYWxhcltzaXplKzFdOworICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZSsxOyBpKyspIGFycmF5M1tpXSA9IFNjYWxhcigxKTsKKyAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSBpbnRlcm5hbDo6VUludFB0cihhcnJheTMpJUVJR0VOX01BWF9BTElHTl9CWVRFUyA9PSAwID8gYXJyYXkzKzEgOiBhcnJheTM7CisgIFNjYWxhciBhcnJheTRbMjU2XTsKKyAgaWYoc2l6ZTw9MjU2KQorICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5NFtpXSA9IFNjYWxhcigxKTsKKyAgCisgIE1hcDxNYXRyaXhUeXBlPiBtYXAxKGFycmF5MSwgcm93cywgY29scyk7CisgIE1hcDxNYXRyaXhUeXBlLCBBbGlnbmVkTWF4PiBtYXAyKGFycmF5Miwgcm93cywgY29scyk7CisgIE1hcDxNYXRyaXhUeXBlPiBtYXAzKGFycmF5M3VuYWxpZ25lZCwgcm93cywgY29scyk7CisgIE1hcDxNYXRyaXhUeXBlPiBtYXA0KGFycmF5NCwgcm93cywgY29scyk7CisgIAorICBWRVJJRllfSVNfRVFVQUwobWFwMSwgTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hcDIsIE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKSk7CisgIFZFUklGWV9JU19FUVVBTChtYXAzLCBNYXRyaXhUeXBlOjpPbmVzKHJvd3MsY29scykpOworICBtYXAxID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIG1hcDIgPSBtYXAxOworICBtYXAzID0gbWFwMTsKKyAgTWF0cml4VHlwZSBtYTEgPSBtYXAxOworICBNYXRyaXhUeXBlIG1hMiA9IG1hcDI7CisgIE1hdHJpeFR5cGUgbWEzID0gbWFwMzsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hcDEsIG1hcDIpOworICBWRVJJRllfSVNfRVFVQUwobWFwMSwgbWFwMyk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hcDMpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSptYXAxLCBzMSptYXAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSptYTEsIHMxKm1hMik7CisgIFZFUklGWV9JU19FUVVBTChzMSptYTEsIHMxKm1hMyk7CisgIFZFUklGWV9JU19BUFBST1goczEqbWFwMSwgczEqbWFwMyk7CisgIAorICBtYXAyICo9IHMxOworICBtYXAzICo9IHMxOworICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDIpOworICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDMpOworICAKKyAgaWYoc2l6ZTw9MjU2KQorICB7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1hcDQsIE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKSk7CisgICAgbWFwNCA9IG1hcDE7CisgICAgTWF0cml4VHlwZSBtYTQgPSBtYXA0OworICAgIFZFUklGWV9JU19FUVVBTChtYXAxLCBtYXA0KTsKKyAgICBWRVJJRllfSVNfRVFVQUwobWExLCBtYXA0KTsKKyAgICBWRVJJRllfSVNfRVFVQUwobWExLCBtYTQpOworICAgIFZFUklGWV9JU19BUFBST1goczEqbWFwMSwgczEqbWFwNCk7CisgICAgCisgICAgbWFwNCAqPSBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDQpOworICB9CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5MSwgc2l6ZSk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTIsIHNpemUpOworICBkZWxldGVbXSBhcnJheTM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgbWFwX3N0YXRpY19tZXRob2RzKGNvbnN0IFZlY3RvclR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCBzaXplID0gbS5zaXplKCk7CisKKyAgU2NhbGFyKiBhcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIFNjYWxhciogYXJyYXkzdW5hbGlnbmVkID0gaW50ZXJuYWw6OlVJbnRQdHIoYXJyYXkzKSVFSUdFTl9NQVhfQUxJR05fQllURVMgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworCisgIFZlY3RvclR5cGU6Ok1hcEFsaWduZWQoYXJyYXkxLCBzaXplKSA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgVmVjdG9yVHlwZTo6TWFwKGFycmF5Miwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZTo6TWFwKGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTEgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTIgPSBWZWN0b3JUeXBlOjpNYXBBbGlnbmVkKGFycmF5Miwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEzID0gVmVjdG9yVHlwZTo6TWFwKGFycmF5M3VuYWxpZ25lZCwgc2l6ZSk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5MSwgc2l6ZSk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTIsIHNpemUpOworICBkZWxldGVbXSBhcnJheTM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gdm9pZCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmKQoreworICAvLyB0aGVyZSdzIGEgbG90IHRoYXQgd2UgY2FuJ3QgdGVzdCBoZXJlIHdoaWxlIHN0aWxsIGhhdmluZyB0aGlzIHRlc3QgY29tcGlsZSEKKyAgLy8gdGhlIG9ubHkgcG9zc2libGUgYXBwcm9hY2ggd291bGQgYmUgdG8gcnVuIGEgc2NyaXB0IHRyeWluZyB0byBjb21waWxlIHN0dWZmIGFuZCBjaGVja2luZyB0aGF0IGl0IGZhaWxzLgorICAvLyBDTWFrZSBjYW4gaGVscCB3aXRoIHRoYXQuCisKKyAgLy8gdmVyaWZ5IHRoYXQgbWFwLXRvLWNvbnN0IGRvbid0IGhhdmUgTHZhbHVlQml0CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdDxQbGFpbk9iamVjdFR5cGU+Ojp0eXBlIENvbnN0UGxhaW5PYmplY3RUeXBlOworICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWRNYXg+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoTWFwPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWRNYXg+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBtYXBfbm90X2FsaWduZWRfb25fc2NhbGFyKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggc2l6ZSA9IDExOworICBTY2FsYXIqIGFycmF5MSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KChzaXplKzEpKihzaXplKzEpKzEpOworICBTY2FsYXIqIGFycmF5MiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4oc2l6ZW9mKFNjYWxhcikvMitzdGQ6OnNpemVfdChhcnJheTEpKTsKKyAgTWFwPE1hdHJpeFR5cGUsMCxPdXRlclN0cmlkZTw+ID4gbWFwMihhcnJheTIsIHNpemUsIHNpemUsIE91dGVyU3RyaWRlPD4oc2l6ZSsxKSk7CisgIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgbWFwMiA9IG0yOworICBWRVJJRllfSVNfRVFVQUwobTIsIG1hcDIpOworICAKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgTWFwPFZlY3RvclR5cGU+IG1hcDMoYXJyYXkyLCBzaXplKTsKKyAgTWF0cml4VHlwZSB2MyA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgbWFwMyA9IHYzOworICBWRVJJRllfSVNfRVFVQUwodjMsIG1hcDMpOworICAKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5MSwgKHNpemUrMSkqKHNpemUrMSkrMSk7Cit9CisKK3ZvaWQgdGVzdF9tYXBwZWRfbWF0cml4KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX3ZlY3RvcihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3I0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvclhkKDEzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX3ZlY3RvcihSb3dWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvclhjZig4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYaSgxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFZlY3RvclhpKDEyKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX21hdHJpeChNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8xMSggbWFwX2NsYXNzX21hdHJpeChNYXRyaXg8ZmxvYXQsMyw1PigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX21hdHJpeChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApKSkgKTsKKworICAgIENBTExfU1VCVEVTVF82KCBtYXBfc3RhdGljX21ldGhvZHMoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggbWFwX3N0YXRpY19tZXRob2RzKFZlY3RvcjNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIG1hcF9zdGF0aWNfbWV0aG9kcyhSb3dWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF85KCBtYXBfc3RhdGljX21ldGhvZHMoVmVjdG9yWGNkKDgpKSApOworICAgIENBTExfU1VCVEVTVF8xMCggbWFwX3N0YXRpY19tZXRob2RzKFZlY3RvclhmKDEyKSkgKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMTEoIG1hcF9ub3RfYWxpZ25lZF9vbl9zY2FsYXI8ZG91YmxlPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RhdGljbWV0aG9kcy5jcHAgYi90ZXN0L21hcHN0YXRpY21ldGhvZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjcyZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21hcHN0YXRpY21ldGhvZHMuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK2Zsb2F0ICpwdHI7Citjb25zdCBmbG9hdCAqY29uc3RfcHRyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsCisgICAgICAgICBib29sIElzRHluYW1pY1NpemUgPSBQbGFpbk9iamVjdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMsCisgICAgICAgICBib29sIElzVmVjdG9yID0gUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUKKz4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGwge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgYm9vbCBJc1ZlY3Rvcj4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCBmYWxzZSwgSXNWZWN0b3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBQbGFpbk9iamVjdFR5cGUmIG0pCisgIHsKKyAgICBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCBJc1ZlY3Rvcj46OnJ1bihtKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSksIGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0cikuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBJbm5lclN0cmlkZTw+KGkpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIElubmVyU3RyaWRlPDI+KCkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBJbm5lclN0cmlkZTwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBJbm5lclN0cmlkZTw0PigpKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBJbm5lclN0cmlkZTw1PigpKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgT3V0ZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIE91dGVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBPdXRlclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgT3V0ZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgT3V0ZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgT3V0ZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLGopKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgU3RyaWRlPDIsRHluYW1pYz4oMixpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgU3RyaWRlPER5bmFtaWMsMz4oaSwzKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksaikpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBTdHJpZGU8MiwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgU3RyaWRlPDMsND4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgU3RyaWRlPDIsND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgU3RyaWRlPDUsMz4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCBmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlOjpJbmRleCBJbmRleDsKKyAgICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSksIGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgcm93cywgY29scykuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw+KGkpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHJvd3MsIGNvbHMsIElubmVyU3RyaWRlPDI+KCkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw0PigpKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw1PigpKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLGopKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgU3RyaWRlPDIsRHluYW1pYz4oMixpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsMz4oaSwzKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksaikpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8MiwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgU3RyaWRlPDMsND4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDIsND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDUsMz4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCB0cnVlPgoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUGxhaW5PYmplY3RUeXBlJiB2KQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OkluZGV4IEluZGV4OworICAgIEluZGV4IHNpemUgPSB2LnNpemUoKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHNpemUpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBzaXplKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBzaXplKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBzaXplKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBzaXplLCBJbm5lclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3ZvaWQgbWFwc3RhdGljbWV0aG9kcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmIG0pCit7CisgIG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGU+OjpydW4obSk7CisgIFZFUklGWSh0cnVlKTsgLy8ganVzdCB0byBhdm9pZCAndW51c2VkIGZ1bmN0aW9uJyB3YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9tYXBzdGF0aWNtZXRob2RzKCkKK3sKKyAgcHRyID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PGZsb2F0PigxMDAwKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcHRyW2ldID0gZmxvYXQoaSk7CisKKyAgY29uc3RfcHRyID0gcHRyOworCisgIENBTExfU1VCVEVTVF8xKCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICkpOworICBDQUxMX1NVQlRFU1RfMSgoIG1hcHN0YXRpY21ldGhvZHMoVmVjdG9yMmYoKSkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3IzZigpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeDJmKCkpICkpOworICBDQUxMX1NVQlRFU1RfMygoIG1hcHN0YXRpY21ldGhvZHMoTWF0cml4NGYoKSkgKSk7CisgIENBTExfU1VCVEVTVF8zKCggbWFwc3RhdGljbWV0aG9kcyhBcnJheTRmKCkpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXkzZigpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzQoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5MzNmKCkpICkpOworICBDQUxMX1NVQlRFU1RfNSgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXk0NGYoKSkgKSk7CisgIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZigxKSkgKSk7CisgIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZig4KSkgKSk7CisgIENBTExfU1VCVEVTVF82KCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXhYZigxLDEpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzYoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeFhmKDUsNykpICkpOworICBDQUxMX1NVQlRFU1RfNygoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYZigxKSkgKSk7CisgIENBTExfU1VCVEVTVF83KCggbWFwc3RhdGljbWV0aG9kcyhBcnJheVhmKDUpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5WFhmKDEsMSkpICkpOworICBDQUxMX1NVQlRFU1RfOCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYWGYoOCw2KSkgKSk7CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKHB0ciwgMTAwMCk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RyaWRlLmNwcCBiL3Rlc3QvbWFwc3RyaWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU4ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYXBzdHJpZGUuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPGludCBBbGlnbm1lbnQsdHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCBtYXBfY2xhc3NfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCBzaXplID0gbS5zaXplKCk7CisKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworCisgIEluZGV4IGFycmF5c2l6ZSA9IDMqc2l6ZTsKKyAgCisgIFNjYWxhciogYV9hcnJheSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KGFycmF5c2l6ZSsxKTsKKyAgU2NhbGFyKiBhcnJheSA9IGFfYXJyYXk7CisgIGlmKEFsaWdubWVudCE9QWxpZ25lZCkKKyAgICBhcnJheSA9IChTY2FsYXIqKShpbnRlcm5hbDo6SW50UHRyKGFfYXJyYXkpICsgKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OkFsaWduZWRPblNjYWxhcj9zaXplb2YoU2NhbGFyKTpzaXplb2YodHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwpKSk7CisKKyAgeworICAgIE1hcDxWZWN0b3JUeXBlLCBBbGlnbm1lbnQsIElubmVyU3RyaWRlPDM+ID4gbWFwKGFycmF5LCBzaXplKTsKKyAgICBtYXAgPSB2OworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgeworICAgICAgVkVSSUZZKGFycmF5WzMqaV0gPT0gdltpXSk7CisgICAgICBWRVJJRlkobWFwW2ldID09IHZbaV0pOworICAgIH0KKyAgfQorCisgIHsKKyAgICBNYXA8VmVjdG9yVHlwZSwgVW5hbGlnbmVkLCBJbm5lclN0cmlkZTxEeW5hbWljPiA+IG1hcChhcnJheSwgc2l6ZSwgSW5uZXJTdHJpZGU8RHluYW1pYz4oMikpOworICAgIG1hcCA9IHY7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICB7CisgICAgICBWRVJJRlkoYXJyYXlbMippXSA9PSB2W2ldKTsKKyAgICAgIFZFUklGWShtYXBbaV0gPT0gdltpXSk7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFfYXJyYXksIGFycmF5c2l6ZSsxKTsKK30KKwordGVtcGxhdGU8aW50IEFsaWdubWVudCx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG1hcF9jbGFzc19tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgX20pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCByb3dzID0gX20ucm93cygpLCBjb2xzID0gX20uY29scygpOworCisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBJbmRleCBhcnJheXNpemUgPSAyKihyb3dzKzQpKihjb2xzKzQpOworCisgIFNjYWxhciogYV9hcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihhcnJheXNpemUrMSk7CisgIFNjYWxhciogYXJyYXkxID0gYV9hcnJheTE7CisgIGlmKEFsaWdubWVudCE9QWxpZ25lZCkKKyAgICBhcnJheTEgPSAoU2NhbGFyKikoaW50ZXJuYWw6OkludFB0cihhX2FycmF5MSkgKyAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6QWxpZ25lZE9uU2NhbGFyP3NpemVvZihTY2FsYXIpOnNpemVvZih0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCkpKTsKKworICBTY2FsYXIgYV9hcnJheTJbMjU2XTsKKyAgU2NhbGFyKiBhcnJheTIgPSBhX2FycmF5MjsKKyAgaWYoQWxpZ25tZW50IT1BbGlnbmVkKQorICAgIGFycmF5MiA9IChTY2FsYXIqKShpbnRlcm5hbDo6SW50UHRyKGFfYXJyYXkyKSArIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXI/c2l6ZW9mKFNjYWxhcik6c2l6ZW9mKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsKSkpOworICBlbHNlCisgICAgYXJyYXkyID0gKFNjYWxhciopKCgoaW50ZXJuYWw6OlVJbnRQdHIoYV9hcnJheTIpK0VJR0VOX01BWF9BTElHTl9CWVRFUy0xKS9FSUdFTl9NQVhfQUxJR05fQllURVMpKkVJR0VOX01BWF9BTElHTl9CWVRFUyk7CisgIEluZGV4IG1heHNpemUyID0gYV9hcnJheTIgLSBhcnJheTIgKyAyNTY7CisgIAorICAvLyB0ZXN0IG5vIGlubmVyIHN0cmlkZSBhbmQgc29tZSBkeW5hbWljIG91dGVyIHN0cmlkZQorICBmb3IoaW50IGs9MDsgazwyOyArK2spCisgIHsKKyAgICBpZihrPT0xICYmIChtLmlubmVyU2l6ZSgpKzEpKm0ub3V0ZXJTaXplKCkgPiBtYXhzaXplMikKKyAgICAgIGJyZWFrOworICAgIFNjYWxhciogYXJyYXkgPSAoaz09MCA/IGFycmF5MSA6IGFycmF5Mik7CisgICAgCisgICAgTWFwPE1hdHJpeFR5cGUsIEFsaWdubWVudCwgT3V0ZXJTdHJpZGU8RHluYW1pYz4gPiBtYXAoYXJyYXksIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPER5bmFtaWM+KG0uaW5uZXJTaXplKCkrMSkpOworICAgIG1hcCA9IG07CisgICAgVkVSSUZZKG1hcC5vdXRlclN0cmlkZSgpID09IG1hcC5pbm5lclNpemUoKSsxKTsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgbS5vdXRlclNpemUoKTsgKytpKQorICAgICAgZm9yKGludCBqID0gMDsgaiA8IG0uaW5uZXJTaXplKCk7ICsraikKKyAgICAgIHsKKyAgICAgICAgVkVSSUZZKGFycmF5W21hcC5vdXRlclN0cmlkZSgpKmkral0gPT0gbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopKTsKKyAgICAgICAgVkVSSUZZKG1hcC5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopID09IG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgICB9CisgICAgVkVSSUZZX0lTX0FQUFJPWChzMSptYXAsczEqbSk7CisgICAgbWFwICo9IHMxOworICAgIFZFUklGWV9JU19BUFBST1gobWFwLHMxKm0pOworICB9CisKKyAgLy8gdGVzdCBubyBpbm5lciBzdHJpZGUgYW5kIGFuIG91dGVyIHN0cmlkZSBvZiArNC4gVGhpcyBpcyBxdWl0ZSBpbXBvcnRhbnQgYXMgZm9yIGZpeGVkLXNpemUgbWF0cmljZXMsCisgIC8vIHRoaXMgYWxsb3dzIHRvIGhpdCB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIGl0J3MgdmVjdG9yaXphYmxlLgorICBmb3IoaW50IGs9MDsgazwyOyArK2spCisgIHsKKyAgICBpZihrPT0xICYmIChtLmlubmVyU2l6ZSgpKzQpKm0ub3V0ZXJTaXplKCkgPiBtYXhzaXplMikKKyAgICAgIGJyZWFrOworICAgIFNjYWxhciogYXJyYXkgPSAoaz09MCA/IGFycmF5MSA6IGFycmF5Mik7CisgICAgCisgICAgZW51bSB7CisgICAgICBJbm5lclNpemUgPSBNYXRyaXhUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSW5uZXJTaXplPT1EeW5hbWljID8gRHluYW1pYyA6IElubmVyU2l6ZSs0CisgICAgfTsKKyAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTxPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWU+ID4KKyAgICAgIG1hcChhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPihtLmlubmVyU2l6ZSgpKzQpKTsKKyAgICBtYXAgPSBtOworICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkrNCk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIFZFUklGWShhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK2pdID09IG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgICAgIFZFUklGWShtYXAuY29lZmZCeU91dGVySW5uZXIoaSxqKSA9PSBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgICAgfQorICAgIFZFUklGWV9JU19BUFBST1goczEqbWFwLHMxKm0pOworICAgIG1hcCAqPSBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hcCxzMSptKTsKKyAgfQorCisgIC8vIHRlc3QgYm90aCBpbm5lciBzdHJpZGUgYW5kIG91dGVyIHN0cmlkZQorICBmb3IoaW50IGs9MDsgazwyOyArK2spCisgIHsKKyAgICBpZihrPT0xICYmICgyKm0uaW5uZXJTaXplKCkrMSkqKG0ub3V0ZXJTaXplKCkqMikgPiBtYXhzaXplMikKKyAgICAgIGJyZWFrOworICAgIFNjYWxhciogYXJyYXkgPSAoaz09MCA/IGFycmF5MSA6IGFycmF5Mik7CisgICAgCisgICAgTWFwPE1hdHJpeFR5cGUsIEFsaWdubWVudCwgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4gPiBtYXAoYXJyYXksIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLER5bmFtaWM+KDIqbS5pbm5lclNpemUoKSsxLCAyKSk7CisgICAgbWFwID0gbTsKKyAgICBWRVJJRlkobWFwLm91dGVyU3RyaWRlKCkgPT0gMiptYXAuaW5uZXJTaXplKCkrMSk7CisgICAgVkVSSUZZKG1hcC5pbm5lclN0cmlkZSgpID09IDIpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtLm91dGVyU2l6ZSgpOyArK2kpCisgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbS5pbm5lclNpemUoKTsgKytqKQorICAgICAgeworICAgICAgICBWRVJJRlkoYXJyYXlbbWFwLm91dGVyU3RyaWRlKCkqaSttYXAuaW5uZXJTdHJpZGUoKSpqXSA9PSBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgICAgICBWRVJJRlkobWFwLmNvZWZmQnlPdXRlcklubmVyKGksaikgPT0gbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopKTsKKyAgICAgIH0KKyAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcCxzMSptKTsKKyAgICBtYXAgKj0gczE7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXAsczEqbSk7CisgIH0KKworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYV9hcnJheTEsIGFycmF5c2l6ZSsxKTsKK30KKwordm9pZCB0ZXN0X21hcHN0cmlkZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgaW50IG1heG4gPSAzMDsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX3ZlY3RvcjxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yNGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvcjRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oUm93VmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFJvd1ZlY3RvcjRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfdmVjdG9yPFVuYWxpZ25lZD4oVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc19tYXRyaXg8QWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCwzLDU+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsMyw1PigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCw0LDg+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsNCw4PigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4biksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4biksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF82KCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICAKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKG1heG4pOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L21ldGEuY3BwIGIvdGVzdC9tZXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGRlYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tZXRhLmNwcApAQCAtMCwwICsxLDk3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorYm9vbCBjaGVja19pc19jb252ZXJ0aWJsZShjb25zdCBGcm9tJiwgY29uc3QgVG8mKQoreworICByZXR1cm4gaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPEZyb20sVG8+Ojp2YWx1ZTsKK30KKwordm9pZCB0ZXN0X21ldGEoKQoreworICBWRVJJRlkoKGludGVybmFsOjpjb25kaXRpb25hbDwoMzw0KSxpbnRlcm5hbDo6dHJ1ZV90eXBlLCBpbnRlcm5hbDo6ZmFsc2VfdHlwZT46OnR5cGU6OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGZsb2F0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsZG91YmxlPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsZmxvYXQmPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsY29uc3QgZmxvYXQmPjo6dmFsdWUpKTsKKyAgCisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsPGNvbnN0IGZsb2F0Jj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8Y29uc3QgZmxvYXQqPjo6dHlwZSA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbDxjb25zdCBmbG9hdComPjo6dHlwZSA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbDxmbG9hdCoqPjo6dHlwZSA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbDxmbG9hdCoqJj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8ZmxvYXQqIGNvbnN0IComPjo6dHlwZSA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbDxmbG9hdCogY29uc3Q+Ojp0eXBlID46OnZhbHVlKSk7CisKKyAgLy8gdGVzdCBhZGRfY29uc3QKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Q8ZmxvYXQ+Ojp0eXBlLCBjb25zdCBmbG9hdCA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdDxmbG9hdCo+Ojp0eXBlLCBmbG9hdCogY29uc3Q+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdDxmbG9hdCBjb25zdCo+Ojp0eXBlLCBmbG9hdCBjb25zdCogY29uc3Q+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdDxmbG9hdCY+Ojp0eXBlLCBmbG9hdCYgPjo6dmFsdWUpKTsKKworICAvLyB0ZXN0IHJlbW92ZV9jb25zdAorICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxmbG9hdCBjb25zdCogY29uc3Q+Ojp0eXBlLCBmbG9hdCBjb25zdCogPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjpyZW1vdmVfY29uc3Q8ZmxvYXQgY29uc3QqPjo6dHlwZSwgZmxvYXQgY29uc3QqID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PGZsb2F0KiBjb25zdD46OnR5cGUsIGZsb2F0KiA+Ojp2YWx1ZSkpOworCisgIC8vIHRlc3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGUKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxmbG9hdCY+Ojp0eXBlLCBmbG9hdCBjb25zdCYgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxmbG9hdCo+Ojp0eXBlLCBmbG9hdCBjb25zdCogPjo6dmFsdWUpKTsKKworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPGZsb2F0Pjo6dHlwZSwgY29uc3QgZmxvYXQgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxjb25zdCBmbG9hdD46OnR5cGUsIGNvbnN0IGZsb2F0ID46OnZhbHVlKSk7CisKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxjb25zdCBmbG9hdCogY29uc3Q+Ojp0eXBlLCBjb25zdCBmbG9hdCogY29uc3Q+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPGZsb2F0KiBjb25zdD46OnR5cGUsIGNvbnN0IGZsb2F0KiBjb25zdD46OnZhbHVlKSk7CisgIAorICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxmbG9hdCY+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGNvbnN0IGZsb2F0LGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPGNvbnN0IGZsb2F0Jj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9wb2ludGVyPGZsb2F0Kj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8Y29uc3QgZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9wb2ludGVyPGNvbnN0IGZsb2F0Kj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9wb2ludGVyPGZsb2F0KiBjb25zdCA+Ojp0eXBlID46OnZhbHVlKSk7CisgIAorICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8ZmxvYXQsZG91YmxlPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxpbnQsZG91YmxlPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxkb3VibGUsaW50Pjo6dmFsdWUgKSk7CisgIFZFUklGWSgoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixkb3VibGU+Ojp2YWx1ZSApKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPEFycmF5MzNmLE1hdHJpeDNmPjo6dmFsdWUgKSk7CisvLyAgIFZFUklGWSgoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxNYXRyaXgzZixNYXRyaXgzZD46OnZhbHVlICkpOyAvL2RvZXMgbm90IHdvcmsgYmVjYXVzZSB0aGUgY29udmVyc2lvbiBpcyBwcmV2ZW50ZWQgYnkgYSBzdGF0aWMgYXNzZXJ0aW9uCisgIFZFUklGWSgoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxBcnJheTMzZixpbnQ+Ojp2YWx1ZSApKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE1hdHJpeFhmLGZsb2F0Pjo6dmFsdWUgKSk7CisgIHsKKyAgICBmbG9hdCBmOworICAgIE1hdHJpeFhmIEEsIEI7CisgICAgVmVjdG9yWGYgYSwgYjsKKyAgICBWRVJJRlkoKCBjaGVja19pc19jb252ZXJ0aWJsZShhLmRvdChiKSwgZikgKSk7CisgICAgVkVSSUZZKCggY2hlY2tfaXNfY29udmVydGlibGUoYS50cmFuc3Bvc2UoKSpiLCBmKSApKTsKKyAgICBWRVJJRlkoKCFjaGVja19pc19jb252ZXJ0aWJsZShBKkIsIGYpICkpOworICAgIFZFUklGWSgoIGNoZWNrX2lzX2NvbnZlcnRpYmxlKEEqQiwgQSkgKSk7CisgIH0KKyAgCisgIFZFUklGWShpbnRlcm5hbDo6bWV0YV9zcXJ0PDE+OjpyZXQgPT0gMSk7CisgICNkZWZpbmUgVkVSSUZZX01FVEFfU1FSVChYKSBWRVJJRlkoaW50ZXJuYWw6Om1ldGFfc3FydDxYPjo6cmV0ID09IGludChzdGQ6OnNxcnQoZG91YmxlKFgpKSkpCisgIFZFUklGWV9NRVRBX1NRUlQoMik7CisgIFZFUklGWV9NRVRBX1NRUlQoMyk7CisgIFZFUklGWV9NRVRBX1NRUlQoNCk7CisgIFZFUklGWV9NRVRBX1NRUlQoNSk7CisgIFZFUklGWV9NRVRBX1NRUlQoNik7CisgIFZFUklGWV9NRVRBX1NRUlQoOCk7CisgIFZFUklGWV9NRVRBX1NRUlQoOSk7CisgIFZFUklGWV9NRVRBX1NRUlQoMTUpOworICBWRVJJRllfTUVUQV9TUVJUKDE2KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgxNyk7CisgIFZFUklGWV9NRVRBX1NRUlQoMjU1KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgyNTYpOworICBWRVJJRllfTUVUQV9TUVJUKDI1Nyk7CisgIFZFUklGWV9NRVRBX1NRUlQoMTAyMyk7CisgIFZFUklGWV9NRVRBX1NRUlQoMTAyNCk7CisgIFZFUklGWV9NRVRBX1NRUlQoMTAyNSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L21ldGlzX3N1cHBvcnQuY3BwIGIvdGVzdC9tZXRpc19zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdjNTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tZXRpc19zdXBwb3J0LmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlTFU+CisjaW5jbHVkZSA8RWlnZW4vTWV0aXNTdXBwb3J0PgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwYXJzZUV4dHJhPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfbWV0aXNfVCgpCit7CisgIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIE1ldGlzT3JkZXJpbmc8aW50PiA+IHNwYXJzZWx1X21ldGlzOworICAKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X21ldGlzKTsgCit9CisKK3ZvaWQgdGVzdF9tZXRpc19zdXBwb3J0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9tZXRpc19UPGRvdWJsZT4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L21pc2NtYXRyaWNlcy5jcHAgYi90ZXN0L21pc2NtYXRyaWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyMGRjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWlzY21hdHJpY2VzLmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtaXNjTWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBEaWFnb25hbE1hdHJpeC5oIE9uZXMuaAorICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLCByMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgdjFbMF07CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgc3F1YXJlKHYxLmFzRGlhZ29uYWwoKSk7CisgIGlmKHI9PXIyKSBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZShyLHIyKSwgdjFbcl0pOworICBlbHNlIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihzcXVhcmUocixyMiksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICBzcXVhcmUgPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIHJvd3MpOworICBzcXVhcmUuZGlhZ29uYWwoKSA9IFZlY3RvclR5cGU6Ok9uZXMocm93cyk7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlLCBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSk7Cit9CisKK3ZvaWQgdGVzdF9taXNjbWF0cmljZXMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBtaXNjTWF0cmljZXMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtaXNjTWF0cmljZXMoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWlzY01hdHJpY2VzKE1hdHJpeFhjZigzLCAzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWlzY01hdHJpY2VzKE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWlzY01hdHJpY2VzKE1hdHJpeFhjZCgyMCwgMjApKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L21peGluZ3R5cGVzLmNwcCBiL3Rlc3QvbWl4aW5ndHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21peGluZ3R5cGVzLmNwcApAQCAtMCwwICsxLDMwMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIHdvcmsgYXJvdW5kICJ1bmluaXRpYWxpemVkIiB3YXJuaW5ncyBhbmQgZ2l2ZSB0aGF0IG9wdGlvbiBzb21lIHRlc3RpbmcKKyNkZWZpbmUgRUlHRU5fSU5JVElBTElaRV9NQVRSSUNFU19CWV9aRVJPCisKKyNpZm5kZWYgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUIC8vIHR1cm4gc3RhdGljIGFzc2VydHMgaW50byBydW50aW1lIGFzc2VydHMgaW4gb3JkZXIgdG8gY2hlY2sgdGhlbQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8xKSB8fCBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8yKSB8fCBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8zKQorCisjaWZuZGVmIEVJR0VOX0RPTlRfVkVDVE9SSVpFCisjZGVmaW5lIEVJR0VOX0RPTlRfVkVDVE9SSVpFCisjZW5kaWYKKworI2VuZGlmCisKK3N0YXRpYyBib29sIGdfY2FsbGVkOworI2RlZmluZSBFSUdFTl9TQ0FMQVJfQklOQVJZX09QX1BMVUdJTiB7IGdfY2FsbGVkIHw9ICghaW50ZXJuYWw6OmlzX3NhbWU8TGhzU2NhbGFyLFJoc1NjYWxhcj46OnZhbHVlKTsgfQorCisjaW5jbHVkZSAibWFpbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjZGVmaW5lIFZFUklGWV9NSVhfU0NBTEFSKFhQUixSRUYpIFwKKyAgZ19jYWxsZWQgPSBmYWxzZTsgXAorICBWRVJJRllfSVNfQVBQUk9YKFhQUixSRUYpOyBcCisgIFZFUklGWSggZ19jYWxsZWQgJiYgI1hQUiIgbm90IHByb3Blcmx5IG9wdGltaXplZCIpOworCit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVR5cGU+IHZvaWQgbWl4aW5ndHlwZXMoaW50IHNpemUgPSBTaXplQXRDb21waWxlVHlwZSkKK3sKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICAgQ0Y7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PGRvdWJsZT4gIENEOworICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfZjsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9kOworICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9jZjsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFNpemVBdENvbXBpbGVUeXBlLCBTaXplQXRDb21waWxlVHlwZT4gTWF0X2NkOworICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgU2l6ZUF0Q29tcGlsZVR5cGUsIDE+IFZlY19mOworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfZDsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgU2l6ZUF0Q29tcGlsZVR5cGUsIDE+IFZlY19jZjsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfY2Q7CisKKyAgTWF0X2YgbWYgICAgPSBNYXRfZjo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIE1hdF9kIG1kICAgID0gbWYudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIC8vTWF0X2QgcmQgICAgPSBtZDsKKyAgTWF0X2NmIG1jZiAgPSBNYXRfY2Y6OlJhbmRvbShzaXplLHNpemUpOworICBNYXRfY2QgbWNkICA9IG1jZi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCk7CisgIE1hdF9jZCByY2QgPSBtY2Q7CisgIFZlY19mIHZmICAgID0gVmVjX2Y6OlJhbmRvbShzaXplLDEpOworICBWZWNfZCB2ZCAgICA9IHZmLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWZWNfY2YgdmNmICA9IFZlY19jZjo6UmFuZG9tKHNpemUsMSk7CisgIFZlY19jZCB2Y2QgID0gdmNmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKTsKKyAgZmxvYXQgICAgICAgICAgIHNmICA9IGludGVybmFsOjpyYW5kb208ZmxvYXQ+KCk7CisgIGRvdWJsZSAgICAgICAgICBzZCAgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKTsKKyAgY29tcGxleDxmbG9hdD4gIHNjZiA9IGludGVybmFsOjpyYW5kb208Y29tcGxleDxmbG9hdD4gPigpOworICBjb21wbGV4PGRvdWJsZT4gc2NkID0gaW50ZXJuYWw6OnJhbmRvbTxjb21wbGV4PGRvdWJsZT4gPigpOworCisgIG1mK21mOworCisgIGZsb2F0ICBlcHNmID0gc3RkOjpzcXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+IDo6bWluIEVJR0VOX0VNUFRZICgpKTsKKyAgZG91YmxlIGVwc2QgPSBzdGQ6OnNxcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptaW4gRUlHRU5fRU1QVFkgKCkpOworCisgIHdoaWxlKHN0ZDo6YWJzKHNmICk8ZXBzZikgc2YgID0gaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oKTsKKyAgd2hpbGUoc3RkOjphYnMoc2QgKTxlcHNkKSBzZiAgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKTsKKyAgd2hpbGUoc3RkOjphYnMoc2NmKTxlcHNmKSBzY2YgPSBpbnRlcm5hbDo6cmFuZG9tPENGPigpOworICB3aGlsZShzdGQ6OmFicyhzY2QpPGVwc2QpIHNjZCA9IGludGVybmFsOjpyYW5kb208Q0Q+KCk7CisKKy8vICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobWYrbWQpOyAvLyBkb2VzIG5vdCBldmVuIGNvbXBpbGUKKworI2lmZGVmIEVJR0VOX0RPTlRfVkVDVE9SSVpFCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHZmPXZkKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQodmYrPXZkKTsKKyNlbmRpZgorICAKKyAgLy8gY2hlY2sgc2NhbGFyIHByb2R1Y3RzCisgIFZFUklGWV9NSVhfU0NBTEFSKHZjZiAqIHNmICwgdmNmICogY29tcGxleDxmbG9hdD4oc2YpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoc2QgKiB2Y2QgLCBjb21wbGV4PGRvdWJsZT4oc2QpICogdmNkKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmYgKiBzY2YgLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAqIHNjZik7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNjZCAqIHZkICwgc2NkICogdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpKTsKKworICBWRVJJRllfTUlYX1NDQUxBUih2Y2YgKiAyICwgdmNmICogY29tcGxleDxmbG9hdD4oMikpOworICBWRVJJRllfTUlYX1NDQUxBUih2Y2YgKiAyLjEgLCB2Y2YgKiBjb21wbGV4PGZsb2F0PigyLjEpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoMiAqIHZjZiwgdmNmICogY29tcGxleDxmbG9hdD4oMikpOworICBWRVJJRllfTUlYX1NDQUxBUigyLjEgKiB2Y2YgLCB2Y2YgKiBjb21wbGV4PGZsb2F0PigyLjEpKTsKKworICAvLyBjaGVjayBzY2FsYXIgcXVvdGllbnRzCisgIFZFUklGWV9NSVhfU0NBTEFSKHZjZiAvIHNmICwgdmNmIC8gY29tcGxleDxmbG9hdD4oc2YpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmYgLyBzY2YgLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAvIHNjZik7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZmLmFycmF5KCkgIC8gc2NmLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hcnJheSgpIC8gc2NmKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoc2NkIC8gdmQuYXJyYXkoKSAsIHNjZCAvIHZkLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKS5hcnJheSgpKTsKKworICAvLyBjaGVjayBzY2FsYXIgaW5jcmVtZW50CisgIFZFUklGWV9NSVhfU0NBTEFSKHZjZi5hcnJheSgpICsgc2YgLCB2Y2YuYXJyYXkoKSArIGNvbXBsZXg8ZmxvYXQ+KHNmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNkICArIHZjZC5hcnJheSgpLCBjb21wbGV4PGRvdWJsZT4oc2QpICsgdmNkLmFycmF5KCkpOworICBWRVJJRllfTUlYX1NDQUxBUih2Zi5hcnJheSgpICArIHNjZiwgdmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkuYXJyYXkoKSArIHNjZik7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNjZCArIHZkLmFycmF5KCkgLCBzY2QgKyB2ZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkuYXJyYXkoKSk7CisKKyAgLy8gY2hlY2sgc2NhbGFyIHN1YnRyYWN0aW9ucworICBWRVJJRllfTUlYX1NDQUxBUih2Y2YuYXJyYXkoKSAtIHNmICwgdmNmLmFycmF5KCkgLSBjb21wbGV4PGZsb2F0PihzZikpOworICBWRVJJRllfTUlYX1NDQUxBUihzZCAgLSB2Y2QuYXJyYXkoKSwgY29tcGxleDxkb3VibGU+KHNkKSAtIHZjZC5hcnJheSgpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmYuYXJyYXkoKSAgLSBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgLSBzY2YpOworICBWRVJJRllfTUlYX1NDQUxBUihzY2QgLSB2ZC5hcnJheSgpICwgc2NkIC0gdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpLmFycmF5KCkpOworCisgIC8vIGNoZWNrIHNjYWxhciBwb3dlcnMKKyAgVkVSSUZZX01JWF9TQ0FMQVIoIHBvdyh2Y2YuYXJyYXkoKSwgc2YpLCAgICAgICAgRWlnZW46OnBvdyh2Y2YuYXJyYXkoKSwgY29tcGxleDxmbG9hdD4oc2YpKSApOworICBWRVJJRllfTUlYX1NDQUxBUiggdmNmLmFycmF5KCkucG93KHNmKSAsICAgICAgICBFaWdlbjo6cG93KHZjZi5hcnJheSgpLCBjb21wbGV4PGZsb2F0PihzZikpICk7CisgIFZFUklGWV9NSVhfU0NBTEFSKCBwb3coc2QsIHZjZC5hcnJheSgpKSwgICAgICAgIEVpZ2VuOjpwb3coY29tcGxleDxkb3VibGU+KHNkKSwgdmNkLmFycmF5KCkpICk7CisgIFZFUklGWV9NSVhfU0NBTEFSKCBFaWdlbjo6cG93KHZmLmFycmF5KCksIHNjZiksIEVpZ2VuOjpwb3codmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkuYXJyYXkoKSwgc2NmKSApOworICBWRVJJRllfTUlYX1NDQUxBUiggdmYuYXJyYXkoKS5wb3coc2NmKSAsICAgICAgICBFaWdlbjo6cG93KHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCksIHNjZikgKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoIEVpZ2VuOjpwb3coc2NkLCB2ZC5hcnJheSgpKSwgRWlnZW46OnBvdyhzY2QsIHZkLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKS5hcnJheSgpKSApOworCisgIC8vIGNoZWNrIGRvdCBwcm9kdWN0CisgIHZmLmRvdCh2Zik7CisjaWYgMCAvLyB3ZSBnZXQgb3RoZXIgY29tcGlsYXRpb24gZXJyb3JzIGhlcmUgdGhhbiBqdXN0IHN0YXRpYyBhc3NlcnRzCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHZkLmRvdCh2ZikpOworI2VuZGlmCisgIFZFUklGWV9JU19BUFBST1godmNmLmRvdCh2ZiksIHZjZi5kb3QodmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkpKTsKKworICAvLyBjaGVjayBkaWFnb25hbCBwcm9kdWN0CisgIFZFUklGWV9JU19BUFBST1godmYuYXNEaWFnb25hbCgpICogbWNmLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hc0RpYWdvbmFsKCkgKiBtY2YpOworICBWRVJJRllfSVNfQVBQUk9YKHZjZC5hc0RpYWdvbmFsKCkgKiBtZCwgdmNkLmFzRGlhZ29uYWwoKSAqIG1kLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKSk7CisgIFZFUklGWV9JU19BUFBST1gobWNmICogdmYuYXNEaWFnb25hbCgpLCBtY2YgKiB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hc0RpYWdvbmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1kICogdmNkLmFzRGlhZ29uYWwoKSwgbWQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpICogdmNkLmFzRGlhZ29uYWwoKSk7CisKKy8vICAgdmQuYXNEaWFnb25hbCgpICogbWY7ICAgIC8vIGRvZXMgbm90IGV2ZW4gY29tcGlsZQorLy8gICB2Y2QuYXNEaWFnb25hbCgpICogbWY7ICAgLy8gZG9lcyBub3QgZXZlbiBjb21waWxlCisKKyAgLy8gY2hlY2sgaW5uZXIgcHJvZHVjdAorICBWRVJJRllfSVNfQVBQUk9YKCh2Zi50cmFuc3Bvc2UoKSAqIHZjZikudmFsdWUoKSwgKHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLnRyYW5zcG9zZSgpICogdmNmKS52YWx1ZSgpKTsKKworICAvLyBjaGVjayBvdXRlciBwcm9kdWN0CisgIFZFUklGWV9JU19BUFBST1goKHZmICogdmNmLnRyYW5zcG9zZSgpKS5ldmFsKCksICh2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAqIHZjZi50cmFuc3Bvc2UoKSkuZXZhbCgpKTsKKworICAvLyBjb2VmZiB3aXNlIHByb2R1Y3QKKworICBWRVJJRllfSVNfQVBQUk9YKCh2ZiAqIHZjZi50cmFuc3Bvc2UoKSkuZXZhbCgpLCAodmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkgKiB2Y2YudHJhbnNwb3NlKCkpLmV2YWwoKSk7CisKKyAgTWF0X2NkIG1jZDIgPSBtY2Q7CisgIFZFUklGWV9JU19BUFBST1gobWNkLmFycmF5KCkgKj0gbWQuYXJyYXkoKSwgbWNkMi5hcnJheSgpICo9IG1kLmFycmF5KCkudGVtcGxhdGUgY2FzdDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworICAKKyAgLy8gY2hlY2sgbWF0cml4LW1hdHJpeCBwcm9kdWN0cworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1kKm1jZCwgKHNkKm1kKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZCptZCwgc2QqbWNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCptZCptY2QsIHNjZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCptY2QqbWQsIHNjZCptY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiptZiptY2YsIHNmKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkqbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YqbWYsIHNmKm1jZiptZi50ZW1wbGF0ZSBjYXN0PENGPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YqbWYqbWNmLCBzY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSptY2YpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZiptY2YqbWYsIHNjZiptY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCptZC5hZGpvaW50KCkqbWNkLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFkam9pbnQoKSptY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZC5hZGpvaW50KCkqbWQsIHNkKm1jZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QqbWQuYWRqb2ludCgpKm1jZC5hZGpvaW50KCksIChzZCptZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYWRqb2ludCgpKm1jZC5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZC5hZGpvaW50KCkqbWQuYWRqb2ludCgpLCBzZCptY2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCptZCptY2QuYWRqb2ludCgpLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZCptZC5hZGpvaW50KCksIHNkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmFkam9pbnQoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiptZi5hZGpvaW50KCkqbWNmLCAoc2YqbWYpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpLmFkam9pbnQoKSptY2YpOworICBWRVJJRllfSVNfQVBQUk9YKHNmKm1jZi5hZGpvaW50KCkqbWYsIHNmKm1jZi5hZGpvaW50KCkqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YqbWYuYWRqb2ludCgpKm1jZi5hZGpvaW50KCksIChzZiptZikudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkuYWRqb2ludCgpKm1jZi5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNmKm1jZi5hZGpvaW50KCkqbWYuYWRqb2ludCgpLCBzZiptY2YuYWRqb2ludCgpKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiptZiptY2YuYWRqb2ludCgpLCAoc2YqbWYpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKm1jZi5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNmKm1jZiptZi5hZGpvaW50KCksIHNmKm1jZiptZi50ZW1wbGF0ZSBjYXN0PENGPigpLmFkam9pbnQoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiptZip2Y2YsIChzZiptZikudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkqdmNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YqbWYqdmNmLChzY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSkuZXZhbCgpKnZjZik7CisgIFZFUklGWV9JU19BUFBST1goc2YqbWNmKnZmLCBzZiptY2YqdmYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NmKm1jZip2ZixzY2YqbWNmKnZmLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpOworCisgIFZFUklGWV9JU19BUFBST1goc2YqdmNmLmFkam9pbnQoKSptZiwgIHNmKnZjZi5hZGpvaW50KCkqbWYudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZip2Y2YuYWRqb2ludCgpKm1mLCBzY2YqdmNmLmFkam9pbnQoKSptZi50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YqdmYuYWRqb2ludCgpKm1jZiwgIHNmKnZmLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSptY2YpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZip2Zi5hZGpvaW50KCkqbWNmLCBzY2YqdmYuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKm1jZik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCptZCp2Y2QsIChzZCptZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqdmNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWQqdmNkLChzY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKSkuZXZhbCgpKnZjZCk7CisgIFZFUklGWV9JU19BUFBST1goc2QqbWNkKnZkLCBzZCptY2QqdmQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCptY2QqdmQsc2NkKm1jZCp2ZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCp2Y2QuYWRqb2ludCgpKm1kLCAgc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NkKnZjZC5hZGpvaW50KCkqbWQsIHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCp2ZC5hZGpvaW50KCkqbWNkLCAgc2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZCk7CisgIFZFUklGWV9JU19BUFBST1goc2NkKnZkLmFkam9pbnQoKSptY2QsIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCBzZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCAgc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggc2QqdmNkLmFkam9pbnQoKSptZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgIHNkKnZjZC5hZGpvaW50KCkqbWQudHJhbnNwb3NlKCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBzY2QqdmNkLmFkam9pbnQoKSptZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goIHNkKnZkLmFkam9pbnQoKSptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksICBzZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgc2NkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKCBzZCp2ZC5hZGpvaW50KCkqbWNkLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCAgc2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NkKnZkLmFkam9pbnQoKSptY2QudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKworICAvLyBOb3Qgc3VwcG9ydGVkIHlldDogdHJtbQorLy8gICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZCptZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgIHNkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisvLyAgIFZFUklGWV9JU19BUFBST1goc2NkKm1jZCptZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgc2NkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisvLyAgIFZFUklGWV9JU19BUFBST1goc2QqbWQqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCAgc2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKy8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWQqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBzY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKworICAvLyBOb3Qgc3VwcG9ydGVkIHlldDogc3ltdgorLy8gICBWRVJJRllfSVNfQVBQUk9YKHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCAgc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOworLy8gICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgc2NkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsKKy8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2ZC5hZGpvaW50KCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsKKy8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisKKyAgLy8gTm90IHN1cHBvcnRlZCB5ZXQ6IHN5bW0KKy8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsKKy8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisvLyAgIFZFUklGWV9JU19BUFBST1goc2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksICBzZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisvLyAgIFZFUklGWV9JU19BUFBST1goc2NkKnZkLmFkam9pbnQoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCBzY2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOworCisgIHJjZC5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0X2NkKHJjZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHNkICogbWNkICogbWQpLAorICAgICAgICAgICAgICAgICAgIE1hdF9jZCgoc2QgKiBtY2QgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRfY2QocmNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gc2QgKiBtZCAqIG1jZCksCisgICAgICAgICAgICAgICAgICAgTWF0X2NkKChzZCAqIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICogbWNkKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdF9jZChyY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBzY2QgKiBtY2QgKiBtZCksCisgICAgICAgICAgICAgICAgICAgTWF0X2NkKChzY2QgKiBtY2QgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRfY2QocmNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gc2NkICogbWQgKiBtY2QpLAorICAgICAgICAgICAgICAgICAgIE1hdF9jZCgoc2NkICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKiBtY2QpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKSk7CisKKworICBWRVJJRllfSVNfQVBQUk9YKCBtZC5hcnJheSgpICAqIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICogbWNkLmFycmF5KCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkgKiBtZC5hcnJheSgpLCAgbWNkLmFycmF5KCkgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggbWQuYXJyYXkoKSAgKyBtY2QuYXJyYXkoKSwgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSArIG1jZC5hcnJheSgpICk7CisgIFZFUklGWV9JU19BUFBST1goIG1jZC5hcnJheSgpICsgbWQuYXJyYXkoKSwgIG1jZC5hcnJheSgpICsgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSApOworCisgIFZFUklGWV9JU19BUFBST1goIG1kLmFycmF5KCkgIC0gbWNkLmFycmF5KCksIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgLSBtY2QuYXJyYXkoKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBtY2QuYXJyYXkoKSAtIG1kLmFycmF5KCksICBtY2QuYXJyYXkoKSAtIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgKTsKKworICBpZihtY2QuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpPmVwc2QpCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBtZC5hcnJheSgpIC8gbWNkLmFycmF5KCksIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgLyBtY2QuYXJyYXkoKSApOworICB9CisgIGlmKG1kLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKT5lcHNkKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkgLyBtZC5hcnJheSgpLCBtY2QuYXJyYXkoKSAvIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgKTsKKyAgfQorCisgIGlmKG1kLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKT5lcHNkIHx8IG1jZC5hcnJheSgpLmFicygpLm1pbkNvZWZmKCk+ZXBzZCkKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goIG1kLmFycmF5KCkucG93KG1jZC5hcnJheSgpKSwgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKS5wb3cobWNkLmFycmF5KCkpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkucG93KG1kLmFycmF5KCkpLCAgbWNkLmFycmF5KCkucG93KG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkpICk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBwb3cobWQuYXJyYXkoKSxtY2QuYXJyYXkoKSksIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkucG93KG1jZC5hcnJheSgpKSApOworICAgIFZFUklGWV9JU19BUFBST1goIHBvdyhtY2QuYXJyYXkoKSxtZC5hcnJheSgpKSwgIG1jZC5hcnJheSgpLnBvdyhtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpKSApOworICB9CisKKyAgcmNkID0gbWNkOworICBWRVJJRllfSVNfQVBQUk9YKCByY2QgPSBtZCwgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKTsKKyAgcmNkID0gbWNkOworICBWRVJJRllfSVNfQVBQUk9YKCByY2QgKz0gbWQsIG1jZCArIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICk7CisgIHJjZCA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkIC09IG1kLCBtY2QgLSBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSApOworICByY2QgPSBtY2Q7CisgIFZFUklGWV9JU19BUFBST1goIHJjZC5hcnJheSgpICo9IG1kLmFycmF5KCksIG1jZC5hcnJheSgpICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSApOworICByY2QgPSBtY2Q7CisgIGlmKG1kLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKT5lcHNkKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLmFycmF5KCkgLz0gbWQuYXJyYXkoKSwgbWNkLmFycmF5KCkgLyBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICk7CisgIH0KKworICByY2QgPSBtY2Q7CisgIFZFUklGWV9JU19BUFBST1goIHJjZC5ub2FsaWFzKCkgKz0gbWQgKyBtY2QqbWQsIG1jZCArIChtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSkgKyBtY2QqKG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSAgPSBtZCptZCwgICAgICAgKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIHJjZCA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSArPSBtZCptZCwgbWNkICsgKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIHJjZCA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSAtPSBtZCptZCwgbWNkIC0gKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSAgPSBtY2QgKyBtZCptZCwgICAgICAgbWNkICsgKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIHJjZCA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSArPSBtY2QgKyBtZCptZCwgbWNkICsgbWNkICsgKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIHJjZCA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSAtPSBtY2QgKyBtZCptZCwgICAgICAgICAgIC0gKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7Cit9CisKK3ZvaWQgdGVzdF9taXhpbmd0eXBlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEobWl4aW5ndHlwZXM8Mz4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWl4aW5ndHlwZXM8ND4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWl4aW5ndHlwZXM8RHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKTsKKworICAgIENBTExfU1VCVEVTVF80KG1peGluZ3R5cGVzPDM+KCkpOworICAgIENBTExfU1VCVEVTVF81KG1peGluZ3R5cGVzPDQ+KCkpOworICAgIENBTExfU1VCVEVTVF82KG1peGluZ3R5cGVzPER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbXBsMm9ubHkuY3BwIGIvdGVzdC9tcGwyb25seS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwNGQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbXBsMm9ubHkuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9NUEwyX09OTFkKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDb3JlPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUxVPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZVFSPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKyNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VuPgorCitpbnQgbWFpbigpCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXN0aW5nX29wcy5jcHAgYi90ZXN0L25lc3Rpbmdfb3BzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE5YjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXN0aW5nX29wcy5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgVEVTVF9FTkFCTEVfVEVNUE9SQVJZX1RSQUNLSU5HCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlIDxpbnQgTiwgdHlwZW5hbWUgWHByVHlwZT4KK3ZvaWQgdXNlX25fdGltZXMoY29uc3QgWHByVHlwZSAmeHByKQoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8WHByVHlwZSxOPjo6dHlwZSBtYXQoeHByKTsKKyAgdHlwZW5hbWUgWHByVHlwZTo6UGxhaW5PYmplY3QgcmVzKG1hdC5yb3dzKCksIG1hdC5jb2xzKCkpOworICBuYl90ZW1wb3Jhcmllcy0tOyAvLyByZW1vdmUgcmVzCisgIHJlcy5zZXRaZXJvKCk7CisgIGZvcihpbnQgaT0wOyBpPE47ICsraSkKKyAgICByZXMgKz0gbWF0OworfQorCit0ZW1wbGF0ZSA8aW50IE4sIHR5cGVuYW1lIFJlZmVyZW5jZVR5cGUsIHR5cGVuYW1lIFhwclR5cGU+Citib29sIHZlcmlmeV9ldmFsX3R5cGUoY29uc3QgWHByVHlwZSAmLCBjb25zdCBSZWZlcmVuY2VUeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8WHByVHlwZSxOPjo6dHlwZSBFdmFsVHlwZTsKKyAgcmV0dXJuIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEV2YWxUeXBlPjo6dHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmVmZXJlbmNlVHlwZT46OnR5cGU+Ojp2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcnVuX25lc3Rpbmdfb3BzXzEoY29uc3QgTWF0cml4VHlwZSYgX20pCit7CisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxNYXRyaXhUeXBlLDI+Ojp0eXBlIG0oX20pOworCisgIC8vIE1ha2UgcmVhbGx5IHN1cmUgdGhhdCB3ZSBhcmUgaW4gZGVidWcgbW9kZSEKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnZW5fYXNzZXJ0KGZhbHNlKSk7CisKKyAgLy8gVGhlIG9ubHkgaW50ZW50aW9uIG9mIHRoZXNlIHRlc3RzIGlzIHRvIGVuc3VyZSB0aGF0IHRoaXMgY29kZSBkb2VzCisgIC8vIG5vdCB0cmlnZ2VyIGFueSBhc3NlcnRzIG9yIHNlZ21lbnRhdGlvbiBmYXVsdHMuLi4gbW9yZSB0byBjb21lLgorICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuc3VtKCksIChtLnRyYW5zcG9zZSgpICogbSkuZGlhZ29uYWwoKS5zdW0oKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuYXJyYXkoKS5hYnMoKS5zdW0oKSwgKG0udHJhbnNwb3NlKCkgKiBtKS5kaWFnb25hbCgpLmFycmF5KCkuYWJzKCkuc3VtKCkgKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmFycmF5KCkuYWJzKCkuc3VtKCksIChtLnRyYW5zcG9zZSgpICogbSkuYXJyYXkoKS5hYnMoKS5zdW0oKSApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBydW5fbmVzdGluZ19vcHNfMihjb25zdCBNYXRyaXhUeXBlJiBfbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBJbmRleCByb3dzID0gX20ucm93cygpOworICBJbmRleCBjb2xzID0gX20uY29scygpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeDxTY2FsYXIsTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsQ29sTWFqb3I+IG0yOworCisgIGlmKChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYykpCisgIHsKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MT4obTEgKyBtMSptMSksIDEgKTsKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MTA+KG0xICsgbTEqbTEpLCAxICk7CisKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MT4obTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEuY29sKDApKSksIDEgKTsKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MTA+KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAxICk7CisKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MT4oU2NhbGFyKDIpKm0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAyICk7IC8vIEZJWE1FIGNvdWxkIGJlIG9uZSBieSBhcHBseWluZyB0aGUgc2NhbGluZyBpbi1wbGFjZSBvbiB0aGUgc29sdmUgcmVzdWx0CisgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHVzZV9uX3RpbWVzPDE+KG0xLmNvbCgwKSttMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMS5jb2woMCkpKSwgMiApOyAvLyBGSVhNRSBjb3VsZCBiZSBvbmUgYnkgYWRkaW5nIG0xLmNvbCgpIGlucGxhY2UKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MTA+KG0xLmNvbCgwKSttMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMS5jb2woMCkpKSwgMiApOworICB9CisKKyAgeworICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxMD4obTEsIG0xKSApOworICAgIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KQorICAgIHsKKyAgICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwzPigyKm0xLCAyKm0xKSApOworICAgICAgVkVSSUZZKCB2ZXJpZnlfZXZhbF90eXBlPDQ+KDIqbTEsIG0xKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVkVSSUZZKCB2ZXJpZnlfZXZhbF90eXBlPDI+KDIqbTEsIDIqbTEpICk7CisgICAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8Mz4oMiptMSwgbTEpICk7CisgICAgfQorICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwyPihtMSttMSwgbTErbTEpICk7CisgICAgVkVSSUZZKCB2ZXJpZnlfZXZhbF90eXBlPDM+KG0xK20xLCBtMSkgKTsKKyAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8MT4obTEqbTEudHJhbnNwb3NlKCksIG0yKSApOworICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMSoobTErbTEpLnRyYW5zcG9zZSgpLCBtMikgKTsKKyAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8Mj4obTEqbTEudHJhbnNwb3NlKCksIG0yKSApOworICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMSttMSptMSwgbTEpICk7CisKKyAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8MT4obTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEpLCBtMSkgKTsKKyAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8MT4obTErbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEpLCBtMSkgKTsKKyAgfQorfQorCisKK3ZvaWQgdGVzdF9uZXN0aW5nX29wcygpCit7CisgIENBTExfU1VCVEVTVF8xKHJ1bl9uZXN0aW5nX29wc18xKE1hdHJpeFhmOjpSYW5kb20oMjUsMjUpKSk7CisgIENBTExfU1VCVEVTVF8yKHJ1bl9uZXN0aW5nX29wc18xKE1hdHJpeFhjZDo6UmFuZG9tKDI1LDI1KSkpOworICBDQUxMX1NVQlRFU1RfMyhydW5fbmVzdGluZ19vcHNfMShNYXRyaXg0Zjo6UmFuZG9tKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQocnVuX25lc3Rpbmdfb3BzXzEoTWF0cml4MmQ6OlJhbmRvbSgpKSk7CisKKyAgSW5kZXggcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBDQUxMX1NVQlRFU1RfMSggcnVuX25lc3Rpbmdfb3BzXzIoTWF0cml4WGYocyxzKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzIoIHJ1bl9uZXN0aW5nX29wc18yKE1hdHJpeFhjZChzLHMpKSApOworICBDQUxMX1NVQlRFU1RfMyggcnVuX25lc3Rpbmdfb3BzXzIoTWF0cml4NGYoKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIHJ1bl9uZXN0aW5nX29wc18yKE1hdHJpeDJkKCkpICk7CisgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvbm9tYWxsb2MuY3BwIGIvdGVzdC9ub21hbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3NTZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvbm9tYWxsb2MuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gZGlzY2FyZCBzdGFjayBhbGxvY2F0aW9uIGFzIHRoYXQgdG9vIGJ5cGFzc2VzIG1hbGxvYworI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDAKKy8vIGhlYXAgYWxsb2NhdGlvbiB3aWxsIHJhaXNlIGFuIGFzc2VydCBpZiBlbmFibGVkIGF0IHJ1bnRpbWUKKyNkZWZpbmUgRUlHRU5fUlVOVElNRV9OT19NQUxMT0MKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbm9tYWxsb2MoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNoZWNrIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXJlIGlzc3VlZCB3aXRoIGZpeGVkLXNpemUgbWF0cmljZXMKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIFZFUklGWV9JU19BUFBST1goKG0xK20yKSpzMSwgICAgICAgICAgICAgIHMxKm0xK3MxKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKHIsYyksIChtMShyLGMpKSsobTIocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlUHJvZHVjdChtMS5ibG9jaygwLDAscm93cyxjb2xzKSksIChtMS5hcnJheSgpKm0xLmFycmF5KCkpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEqbTEudHJhbnNwb3NlKCkpKm0yLCAgbTEqKG0xLnRyYW5zcG9zZSgpKm0yKSk7CisgIAorICBtMi5jb2woMCkubm9hbGlhcygpID0gbTEgKiBtMS5jb2woMCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEuYWRqb2ludCgpICogbTEuY29sKDApOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xICogbTEucm93KDApLmFkam9pbnQoKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS5hZGpvaW50KCkgKiBtMS5yb3coMCkuYWRqb2ludCgpOworCisgIG0yLnJvdygwKS5ub2FsaWFzKCkgPSBtMS5yb3coMCkgKiBtMTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5yb3coMCkgKiBtMS5hZGpvaW50KCk7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMS5hZGpvaW50KCk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTIpOworICAKKyAgbTIuY29sKDApLm5vYWxpYXMoKSA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogbTEuY29sKDApOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0xLmNvbCgwKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0xLnJvdygwKS5hZGpvaW50KCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogbTEucm93KDApLmFkam9pbnQoKTsKKworICBtMi5yb3coMCkubm9hbGlhcygpID0gbTEucm93KDApICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEucm93KDApICogbTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0yKTsKKyAgCisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMS5jb2woMCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIG0xLmNvbCgwKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMS5yb3coMCkuYWRqb2ludCgpOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMS5yb3coMCkuYWRqb2ludCgpOworCisgIG0yLnJvdygwKS5ub2FsaWFzKCkgPSBtMS5yb3coMCkgKiBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEucm93KDApICogbTEuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0yKTsKKyAgCisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbCgwKSwtMSk7CisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKG0xLnJvdygwKSwtMSk7CisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbCgwKSwgbTEuY29sKDApKTsgLy8gcmFuay0yCisKKyAgLy8gVGhlIGZvbGxvd2luZyBmYW5jeSBtYXRyaXgtbWF0cml4IHByb2R1Y3RzIGFyZSBub3Qgc2FmZSB5ZXQgcmVnYXJkaW5nIHN0YXRpYyBhbGxvY2F0aW9uCisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xKTsKKyAgbTIgKz0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMTsKKyAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBtMiAqIG0yOworICBtMSArPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMixtMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY3Rtc19kZWNvbXBvc2l0aW9ucygpCit7CisgIGNvbnN0IGludCBtYXhTaXplID0gMTY7CisgIGNvbnN0IGludCBzaXplICAgID0gMTI7CisKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLCBtYXhTaXplPiBNYXRyaXg7CisKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpEeW5hbWljLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsIDE+IFZlY3RvcjsKKworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8c3RkOjpjb21wbGV4PFNjYWxhcj4sCisgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwgbWF4U2l6ZT4gQ29tcGxleE1hdHJpeDsKKworICBjb25zdCBNYXRyaXggQShNYXRyaXg6OlJhbmRvbShzaXplLCBzaXplKSksIEIoTWF0cml4OjpSYW5kb20oc2l6ZSwgc2l6ZSkpOworICBNYXRyaXggWChzaXplLHNpemUpOworICBjb25zdCBDb21wbGV4TWF0cml4IGNvbXBsZXhBKENvbXBsZXhNYXRyaXg6OlJhbmRvbShzaXplLCBzaXplKSk7CisgIGNvbnN0IE1hdHJpeCBzYUEgPSBBLmFkam9pbnQoKSAqIEE7CisgIGNvbnN0IFZlY3RvciBiKFZlY3Rvcjo6UmFuZG9tKHNpemUpKTsKKyAgVmVjdG9yIHgoc2l6ZSk7CisKKyAgLy8gQ2hvbGVza3kgbW9kdWxlCisgIEVpZ2VuOjpMTFQ8TWF0cml4PiAgTExUOyAgTExULmNvbXB1dGUoQSk7CisgIFggPSBMTFQuc29sdmUoQik7CisgIHggPSBMTFQuc29sdmUoYik7CisgIEVpZ2VuOjpMRExUPE1hdHJpeD4gTERMVDsgTERMVC5jb21wdXRlKEEpOworICBYID0gTERMVC5zb2x2ZShCKTsKKyAgeCA9IExETFQuc29sdmUoYik7CisKKyAgLy8gRWlnZW52YWx1ZXMgbW9kdWxlCisgIEVpZ2VuOjpIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxDb21wbGV4TWF0cml4PiBoZXNzRGVjb21wOyAgICAgICAgaGVzc0RlY29tcC5jb21wdXRlKGNvbXBsZXhBKTsKKyAgRWlnZW46OkNvbXBsZXhTY2h1cjxDb21wbGV4TWF0cml4PiAgICAgICAgICAgIGNTY2h1cihzaXplKTsgICAgICBjU2NodXIuY29tcHV0ZShjb21wbGV4QSk7CisgIEVpZ2VuOjpDb21wbGV4RWlnZW5Tb2x2ZXI8Q29tcGxleE1hdHJpeD4gICAgICBjRWlnU29sdmVyOyAgICAgICAgY0VpZ1NvbHZlci5jb21wdXRlKGNvbXBsZXhBKTsKKyAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeD4gICAgICAgICAgICAgICAgICAgIGVpZ1NvbHZlcjsgICAgICAgICBlaWdTb2x2ZXIuY29tcHV0ZShBKTsKKyAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4PiAgICAgICAgIHNhRWlnU29sdmVyKHNpemUpOyBzYUVpZ1NvbHZlci5jb21wdXRlKHNhQSk7CisgIEVpZ2VuOjpUcmlkaWFnb25hbGl6YXRpb248TWF0cml4PiAgICAgICAgICAgICB0cmlkaWFnOyAgICAgICAgICAgdHJpZGlhZy5jb21wdXRlKHNhQSk7CisKKyAgLy8gTFUgbW9kdWxlCisgIEVpZ2VuOjpQYXJ0aWFsUGl2TFU8TWF0cml4PiBwcExVOyBwcExVLmNvbXB1dGUoQSk7CisgIFggPSBwcExVLnNvbHZlKEIpOworICB4ID0gcHBMVS5zb2x2ZShiKTsKKyAgRWlnZW46OkZ1bGxQaXZMVTxNYXRyaXg+ICAgIGZwTFU7IGZwTFUuY29tcHV0ZShBKTsKKyAgWCA9IGZwTFUuc29sdmUoQik7CisgIHggPSBmcExVLnNvbHZlKGIpOworCisgIC8vIFFSIG1vZHVsZQorICBFaWdlbjo6SG91c2Vob2xkZXJRUjxNYXRyaXg+ICAgICAgICBoUVI7ICBoUVIuY29tcHV0ZShBKTsKKyAgWCA9IGhRUi5zb2x2ZShCKTsKKyAgeCA9IGhRUi5zb2x2ZShiKTsKKyAgRWlnZW46OkNvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PiAgY3BRUjsgY3BRUi5jb21wdXRlKEEpOworICBYID0gY3BRUi5zb2x2ZShCKTsKKyAgeCA9IGNwUVIuc29sdmUoYik7CisgIEVpZ2VuOjpGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg+IGZwUVI7IGZwUVIuY29tcHV0ZShBKTsKKyAgLy8gRklYTUUgWCA9IGZwUVIuc29sdmUoQik7CisgIHggPSBmcFFSLnNvbHZlKGIpOworCisgIC8vIFNWRCBtb2R1bGUKKyAgRWlnZW46OkphY29iaVNWRDxNYXRyaXg+IGpTVkQ7IGpTVkQuY29tcHV0ZShBLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworfQorCit2b2lkIHRlc3RfemVyb3NpemVkKCkgeworICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yczoKKyAgRWlnZW46Ok1hdHJpeFhkIEE7CisgIEVpZ2VuOjpWZWN0b3JYZCB2OworICAvLyBleHBsaWNpdCB6ZXJvLXNpemVkOgorICBFaWdlbjo6QXJyYXlYWGQgQTAoMCwwKTsKKyAgRWlnZW46OkFycmF5WGQgdjAoMCk7CisKKyAgLy8gYXNzaWduaW5nIGVtcHR5IG9iamVjdHMgdG8gZWFjaCBvdGhlcjoKKyAgQT1BMDsKKyAgdj12MDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB0ZXN0X3JlZmVyZW5jZShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IEZsYWcgICAgICAgICAgPSAgTWF0cml4VHlwZTo6SXNSb3dNYWpvciA/IEVpZ2VuOjpSb3dNYWpvciA6IEVpZ2VuOjpDb2xNYWpvcn07CisgIGVudW0geyBUcmFuc3Bvc2VGbGFnID0gIU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBFaWdlbjo6Um93TWFqb3IgOiBFaWdlbjo6Q29sTWFqb3J9OworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHM9bS5jb2xzKCk7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywgRmxhZyAgICAgICAgID4gTWF0cml4WDsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCBUcmFuc3Bvc2VGbGFnPiBNYXRyaXhYVDsKKyAgLy8gRHluYW1pYyByZWZlcmVuY2U6CisgIHR5cGVkZWYgRWlnZW46OlJlZjxjb25zdCBNYXRyaXhYICA+IFJlZjsKKyAgdHlwZWRlZiBFaWdlbjo6UmVmPGNvbnN0IE1hdHJpeFhUID4gUmVmVDsKKworICBSZWYgcjEobSk7CisgIFJlZiByMihtLmJsb2NrKHJvd3MvMywgY29scy80LCByb3dzLzIsIGNvbHMvMikpOworICBSZWZUIHIzKG0udHJhbnNwb3NlKCkpOworICBSZWZUIHI0KG0udG9wTGVmdENvcm5lcihyb3dzLzIsIGNvbHMvMikudHJhbnNwb3NlKCkpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFJlZlQgcjUobSkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChSZWYgcjYobS50cmFuc3Bvc2UoKSkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChSZWYgcjcoU2NhbGFyKDIpICogbSkpOworCisgIC8vIENvcHkgY29uc3RydWN0b3JzIHNoYWxsIGFsc28gbmV2ZXIgbWFsbG9jCisgIFJlZiByOCA9IHIxOworICBSZWZUIHI5ID0gcjM7CisKKyAgLy8gSW5pdGlhbGl6aW5nIGZyb20gYSBjb21wYXRpYmxlIFJlZiBzaGFsbCBhbHNvIG5ldmVyIG1hbGxvYworICBFaWdlbjo6UmVmPGNvbnN0IE1hdHJpeFgsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+ID4gcjEwPXI4LCByMTE9bTsKKworICAvLyBJbml0aWFsaXppbmcgZnJvbSBhbiBpbmNvbXBhdGlibGUgUmVmIHdpbGwgbWFsbG9jOgorICB0eXBlZGVmIEVpZ2VuOjpSZWY8Y29uc3QgTWF0cml4WCwgQWxpZ25lZD4gUmVmQWxpZ25lZDsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoUmVmQWxpZ25lZCByMTI9cjEwKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoUmVmIHIxMz1yMTApOyAvLyByMTAgaGFzIG1vcmUgZHluYW1pYyBzdHJpZGVzCisKK30KKwordm9pZCB0ZXN0X25vbWFsbG9jKCkKK3sKKyAgLy8gY3JlYXRlIHNvbWUgZHluYW1pYyBvYmplY3RzCisgIEVpZ2VuOjpNYXRyaXhYZCBNMSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKKyAgUmVmPGNvbnN0IE1hdHJpeFhkPiBSMSA9IDIuMCpNMTsgLy8gUmVmIHJlcXVpcmVzIHRlbXBvcmFyeQorCisgIC8vIGZyb20gaGVyZSBvbiBwcm9oaWJpdCBtYWxsb2M6CisgIEVpZ2VuOjppbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKGZhbHNlKTsKKworICAvLyBjaGVjayB0aGF0IG91ciBvcGVyYXRvciBuZXcgaXMgaW5kZWVkIGNhbGxlZDoKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoTWF0cml4WGQgZHVtbXkoTWF0cml4WGQ6OlJhbmRvbSgzLDMpKSk7CisgIENBTExfU1VCVEVTVF8xKG5vbWFsbG9jKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzIobm9tYWxsb2MoTWF0cml4NGQoKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMobm9tYWxsb2MoTWF0cml4PGZsb2F0LDMyLDMyPigpKSApOworICAKKyAgLy8gQ2hlY2sgZGVjb21wb3NpdGlvbiBtb2R1bGVzIHdpdGggZHluYW1pYyBtYXRyaWNlcyB0aGF0IGhhdmUgYSBrbm93biBjb21waWxlLXRpbWUgbWF4IHNpemUgKGN0bXMpCisgIENBTExfU1VCVEVTVF80KGN0bXNfZGVjb21wb3NpdGlvbnM8ZmxvYXQ+KCkpOworCisgIENBTExfU1VCVEVTVF81KHRlc3RfemVyb3NpemVkKCkpOworCisgIENBTExfU1VCVEVTVF82KHRlc3RfcmVmZXJlbmNlKE1hdHJpeDxmbG9hdCwzMiwzMj4oKSkpOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0X3JlZmVyZW5jZShSMSkpOworICBDQUxMX1NVQlRFU1RfOChSZWY8TWF0cml4WGQ+IFIyID0gTTEudG9wUm93czwyPigpOyB0ZXN0X3JlZmVyZW5jZShSMikpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9udWxsYXJ5LmNwcCBiL3Rlc3QvbnVsbGFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkNTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbnVsbGFyeS5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vIENvcHlyaWdodCAoQykgMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Citib29sIGVxdWFsc0lkZW50aXR5KGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgU2NhbGFyIHplcm8gPSBzdGF0aWNfY2FzdDxTY2FsYXI+KDApOworCisgIGJvb2wgb2ZmRGlhZ09LID0gdHJ1ZTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IEEucm93cygpOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGogPSBpKzE7IGogPCBBLmNvbHMoKTsgKytqKSB7CisgICAgICBvZmZEaWFnT0sgPSBvZmZEaWFnT0sgJiYgKEEoaSxqKSA9PSB6ZXJvKTsKKyAgICB9CisgIH0KKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IEEucm93cygpOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgKHN0ZDo6bWluKShpLCBBLmNvbHMoKSk7ICsraikgeworICAgICAgb2ZmRGlhZ09LID0gb2ZmRGlhZ09LICYmIChBKGksaikgPT0gemVybyk7CisgICAgfQorICB9CisKKyAgYm9vbCBkaWFnT0sgPSAoQS5kaWFnb25hbCgpLmFycmF5KCkgPT0gMSkuYWxsKCk7CisgIHJldHVybiBvZmZEaWFnT0sgJiYgZGlhZ09LOworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIGNoZWNrX2V4dHJlbWl0eV9hY2N1cmFjeShjb25zdCBWZWN0b3JUeXBlICZ2LCBjb25zdCB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgJmxvdywgY29uc3QgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyICZoaWdoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIFJlYWxTY2FsYXIgcHJlYyA9IGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSA/IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkqMTAgOiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpLzEwOworICBJbmRleCBzaXplID0gdi5zaXplKCk7CisKKyAgaWYoc2l6ZTwyMCkKKyAgICByZXR1cm47CisKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGlmKGk8NSB8fCBpPnNpemUtNikKKyAgICB7CisgICAgICBTY2FsYXIgcmVmID0gKGxvdypSZWFsU2NhbGFyKHNpemUtaS0xKSkvUmVhbFNjYWxhcihzaXplLTEpICsgKGhpZ2gqUmVhbFNjYWxhcihpKSkvUmVhbFNjYWxhcihzaXplLTEpOworICAgICAgaWYoc3RkOjphYnMocmVmKT4xKQorICAgICAgeworICAgICAgICBpZighaW50ZXJuYWw6OmlzQXBwcm94KHYoaSksIHJlZiwgcHJlYykpCisgICAgICAgICAgc3RkOjpjb3V0IDw8IHYoaSkgPDwgIiAhPSAiIDw8IHJlZiA8PCAiICA7IHJlbGF0aXZlIGVycm9yOiAiIDw8IHN0ZDo6YWJzKCh2KGkpLXJlZikvcmVmKSA8PCAiICA7IHJlcXVpcmVkIHByZWNpc2lvbjogIiA8PCBwcmVjIDw8ICIgIDsgcmFuZ2U6ICIgPDwgbG93IDw8ICIsIiA8PCBoaWdoIDw8ICIgIDsgaTogIiA8PCBpIDw8ICJcbiI7CisgICAgICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3godihpKSwgKGxvdypSZWFsU2NhbGFyKHNpemUtaS0xKSkvUmVhbFNjYWxhcihzaXplLTEpICsgKGhpZ2gqUmVhbFNjYWxhcihpKSkvUmVhbFNjYWxhcihzaXplLTEpLCBwcmVjKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIHRlc3RWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUmIGJhc2UpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisKKyAgY29uc3QgSW5kZXggc2l6ZSA9IGJhc2Uuc2l6ZSgpOworICAKKyAgU2NhbGFyIGhpZ2ggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTUwMCw1MDApOworICBTY2FsYXIgbG93ID0gKHNpemUgPT0gMSA/IGhpZ2ggOiBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTUwMCw1MDApKTsKKyAgaWYgKGxvdz5oaWdoKSBzdGQ6OnN3YXAobG93LGhpZ2gpOworCisgIC8vIGNoZWNrIGxvdz09aGlnaAorICBpZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLmYsMS5mKTwwLjA1ZikKKyAgICBsb3cgPSBoaWdoOworICAvLyBjaGVjayBhYnMobG93KSA+PiBhYnMoaGlnaCkKKyAgZWxzZSBpZihzaXplPjIgJiYgc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4X2V4cG9uZW50MTA+MCAmJiBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLmYsMS5mKTwwLjFmKQorICAgIGxvdyA9IC1pbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMSwyKSAqIFJlYWxTY2FsYXIoc3RkOjpwb3coUmVhbFNjYWxhcigxMCksc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4X2V4cG9uZW50MTAvMikpOworCisgIGNvbnN0IFNjYWxhciBzdGVwID0gKChzaXplID09IDEpID8gMSA6IChoaWdoLWxvdykvKHNpemUtMSkpOworCisgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdCB5aWVsZHMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gZG8KKyAgVmVjdG9yVHlwZSBtKGJhc2UpOworICBtLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKworICBpZighTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKKyAgeworICAgIFZlY3RvclR5cGUgbihzaXplKTsKKyAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICAgICAgbihpKSA9IGxvdytpKnN0ZXA7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLG4pOworCisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19leHRyZW1pdHlfYWNjdXJhY3kobSwgbG93LCBoaWdoKSApOworICB9CisKKyAgaWYoKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSB8fCAoKGhpZ2gtbG93KT49c2l6ZSAmJiAoSW5kZXgoaGlnaC1sb3cpJShzaXplLTEpKT09MCkgfHwgKEluZGV4KGhpZ2gtbG93KzEpPHNpemUgJiYgKHNpemUlSW5kZXgoaGlnaC1sb3crMSkpPT0wKSkKKyAgeworICAgIFZlY3RvclR5cGUgbihzaXplKTsKKyAgICBpZigoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIHx8IChoaWdoLWxvdz49c2l6ZSkpCisgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICAgICAgICBuKGkpID0gc2l6ZT09MSA/IGxvdyA6IChsb3cgKyAoKGhpZ2gtbG93KSpTY2FsYXIoaSkpLyhzaXplLTEpKTsKKyAgICBlbHNlCisgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICAgICAgICBuKGkpID0gc2l6ZT09MSA/IGxvdyA6IGxvdyArIFNjYWxhcigoZG91YmxlKGhpZ2gtbG93KzEpKmRvdWJsZShpKSkvZG91YmxlKHNpemUpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sbik7CisKKyAgICAvLyByYW5kb20gYWNjZXNzIHZlcnNpb24KKyAgICBtID0gVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsbG93LGhpZ2gpOworICAgIFZFUklGWV9JU19BUFBST1gobSxuKTsKKyAgICBWRVJJRlkoIGludGVybmFsOjppc0FwcHJveChtKG0uc2l6ZSgpLTEpLGhpZ2gpICk7CisgICAgVkVSSUZZKCBzaXplPT0xIHx8IGludGVybmFsOjppc0FwcHJveChtKDApLGxvdykgKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobShtLnNpemUoKS0xKSAsIGhpZ2gpOworICAgIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQorICAgICAgQ0FMTF9TVUJURVNUKCBjaGVja19leHRyZW1pdHlfYWNjdXJhY3kobSwgbG93LCBoaWdoKSApOworICB9CisKKyAgVkVSSUZZKCBtKG0uc2l6ZSgpLTEpIDw9IGhpZ2ggKTsKKyAgVkVSSUZZKCAobS5hcnJheSgpIDw9IGhpZ2gpLmFsbCgpICk7CisgIFZFUklGWSggKG0uYXJyYXkoKSA+PSBsb3cpLmFsbCgpICk7CisKKworICBWRVJJRlkoIG0obS5zaXplKCktMSkgPj0gbG93ICk7CisgIGlmKHNpemU+PTEpCisgIHsKKyAgICBWRVJJRlkoIGludGVybmFsOjppc0FwcHJveChtKDApLGxvdykgKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSgwKSAsIGxvdyk7CisgIH0KKworICAvLyBjaGVjayB3aGV0aGVyIGV2ZXJ5dGhpbmcgd29ya3Mgd2l0aCByb3cgYW5kIGNvbCBtYWpvciB2ZWN0b3JzCisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiByb3dfdmVjdG9yKHNpemUpOworICBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gY29sX3ZlY3RvcihzaXplKTsKKyAgcm93X3ZlY3Rvci5zZXRMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCk7CisgIGNvbF92ZWN0b3Iuc2V0TGluU3BhY2VkKHNpemUsbG93LGhpZ2gpOworICAvLyB3aGVuIHVzaW5nIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gKGUuZy4sIEZQVSkgdGhlIHJlbGF0aXZlIGVycm9yIG1pZ2h0IGV4Y2VlZCAxIGJpdAorICAvLyB3aGVuIGNvbXB1dGluZyB0aGUgc3F1YXJlZCBzdW0gaW4gaXNBcHByb3gsIHRodXMgdGhlIDJ4IGZhY3Rvci4KKyAgVkVSSUZZKCByb3dfdmVjdG9yLmlzQXBwcm94KGNvbF92ZWN0b3IudHJhbnNwb3NlKCksIFNjYWxhcigyKSpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSk7CisKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHNpemVfY2hhbmdlcihzaXplKzUwKTsKKyAgc2l6ZV9jaGFuZ2VyLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKyAgVkVSSUZZKCBzaXplX2NoYW5nZXIuc2l6ZSgpID09IHNpemUgKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMSwxPiBTY2FsYXJNYXRyaXg7CisgIFNjYWxhck1hdHJpeCBzY2FsYXI7CisgIHNjYWxhci5zZXRMaW5TcGFjZWQoMSxsb3csaGlnaCk7CisgIFZFUklGWV9JU19BUFBST1goIHNjYWxhciwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBTY2FsYXJNYXRyaXg6OkxpblNwYWNlZCgxLGxvdyxoaWdoKSwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOworCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDUyNiAobGluZWFyIHZlY3Rvcml6ZWQgdHJhbnN2ZXJzYWwpCisgIGlmIChzaXplID4gMSAmJiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpKSB7CisgICAgbS50YWlsKHNpemUtMSkuc2V0TGluU3BhY2VkKGxvdywgaGlnaCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtKHNpemUtMSksIGhpZ2gpOworICB9CisKKyAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTM4MyAoTGluU3BhY2VkIHdpdGggZW1wdHkgc2l6ZS9yYW5nZSkKKyAgeworICAgIEluZGV4IG4wID0gVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyAwIDogVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgbG93ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgbSA9IFZlY3RvclR5cGU6OkxpblNwYWNlZChuMCxsb3csbG93LTEpOworICAgIFZFUklGWShtLnNpemUoKT09bjApOworCisgICAgaWYoVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKFZlY3RvclR5cGU6OkxpblNwYWNlZChuMCwwLFNjYWxhcihuMC0xKSkuc3VtKCksU2NhbGFyKDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChWZWN0b3JUeXBlOjpMaW5TcGFjZWQobjAsbG93LGxvdy0xKS5zdW0oKSxTY2FsYXIoMCkpOworICAgIH0KKworICAgIG0uc2V0TGluU3BhY2VkKG4wLDAsU2NhbGFyKG4wLTEpKTsKKyAgICBWRVJJRlkobS5zaXplKCk9PW4wKTsKKyAgICBtLnNldExpblNwYWNlZChuMCxsb3csbG93LTEpOworICAgIFZFUklGWShtLnNpemUoKT09bjApOworCisgICAgLy8gZW1wdHkgcmFuZ2Ugb25seToKKyAgICBWRVJJRllfSVNfQVBQUk9YKFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLGxvdyxsb3cpLFZlY3RvclR5cGU6OkNvbnN0YW50KHNpemUsbG93KSk7CisgICAgbS5zZXRMaW5TcGFjZWQoc2l6ZSxsb3csbG93KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sVmVjdG9yVHlwZTo6Q29uc3RhbnQoc2l6ZSxsb3cpKTsKKworICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCisgICAgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWCggVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsbG93LFNjYWxhcihsb3crc2l6ZS0xKSksIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLFNjYWxhcihsb3crc2l6ZS0xKSxsb3cpLnJldmVyc2UoKSApOworCisgICAgICBpZihWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgbmVnYXRpdmUgbXVsdGlwbGljYXRvciBwYXRoOgorICAgICAgICBmb3IoSW5kZXggaz0xOyBrPDU7ICsraykKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKCBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSxsb3csU2NhbGFyKGxvdysoc2l6ZS0xKSprKSksIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLFNjYWxhcihsb3crKHNpemUtMSkqayksbG93KS5yZXZlcnNlKCkgKTsKKyAgICAgICAgLy8gQ2hlY2sgbmVnYXRpdmUgZGl2aXNvciBwYXRoOgorICAgICAgICBmb3IoSW5kZXggaz0xOyBrPDU7ICsraykKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKCBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSprLGxvdyxTY2FsYXIobG93K3NpemUtMSkpLCBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSprLFNjYWxhcihsb3crc2l6ZS0xKSxsb3cpLnJldmVyc2UoKSApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgY29uc3QgSW5kZXggcm93cyA9IG0ucm93cygpOworICBjb25zdCBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisKKyAgU2NhbGFyIHMxOworICBkbyB7CisgICAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfSB3aGlsZShhYnMoczEpPFJlYWxTY2FsYXIoMWUtNSkgJiYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSk7CisKKyAgTWF0cml4VHlwZSBBOworICBBLnNldElkZW50aXR5KHJvd3MsIGNvbHMpOworICBWRVJJRlkoZXF1YWxzSWRlbnRpdHkoQSkpOworICBWRVJJRlkoZXF1YWxzSWRlbnRpdHkoTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykpKTsKKworCisgIEEgPSBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpOworICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICBWRVJJRllfSVNfQVBQUk9YKCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpKGksaiksIHMxICk7CisgIFZFUklGWV9JU19BUFBST1goIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkuY29lZmYoaSxqKSwgczEgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggQShpLGopLCBzMSApOworfQorCit2b2lkIHRlc3RfbnVsbGFyeSgpCit7CisgIENBTExfU1VCVEVTVF8xKCB0ZXN0TWF0cml4VHlwZShNYXRyaXgyZCgpKSApOworICBDQUxMX1NVQlRFU1RfMiggdGVzdE1hdHJpeFR5cGUoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSkpICk7CisgIENBTExfU1VCVEVTVF8zKCB0ZXN0TWF0cml4VHlwZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDApLGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCkpKSApOworICAKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0KjEwOyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfNCggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwMDApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggdGVzdFZlY3RvclR5cGUoVmVjdG9yNGQoKSkgKTsgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMgorICAgIENBTExfU1VCVEVTVF82KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF83KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3JYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDAwMCkpKSApOworICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3IzZigpKSApOworICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsOCwxPigpKSApOworICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsMSwxPigpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzkoIHRlc3RWZWN0b3JUeXBlKFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoIHRlc3RWZWN0b3JUeXBlKFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50Pig5LDMwMCkpKSApOworICAgIENBTExfU1VCVEVTVF85KCB0ZXN0VmVjdG9yVHlwZShNYXRyaXg8aW50LDEsMT4oKSkgKTsKKyAgfQorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzYKKyAgLy8gQXNzaWdubWVudCBvZiBhIFJvd1ZlY3RvclhkIHRvIGEgTWF0cml4WGQgKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnICM3OSkuCisgIFZFUklGWSggKE1hdHJpeFhkKFJvd1ZlY3RvclhkOjpMaW5TcGFjZWQoMywgMCwgMSkpIC0gUm93VmVjdG9yM2QoMCwgMC41LCAxKSkubm9ybSgpIDwgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkgKTsKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzkKKyAgLy8gQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgaXNzdWUKKyAgeworICAgIGludCBuID0gNjAwMDA7CisgICAgQXJyYXlYaSBhMShuKSwgYTIobik7CisgICAgYTEuc2V0TGluU3BhY2VkKG4sIDAsIG4tMSk7CisgICAgZm9yKGludCBpPTA7IGk8bjsgKytpKQorICAgICAgYTIoaSkgPSBpOworICAgIFZFUklGWV9JU19BUFBST1goYTEsYTIpOworICB9CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xMAorICAvLyBjaGVjayBzb21lIGludGVybmFsIGxvZ2ljCisgIFZFUklGWSgoICBpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnZhbHVlICkpOworICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGRvdWJsZT4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGRvdWJsZT4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICBpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGRvdWJsZT4gPjo6cmV0ICkpOworCisgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxkb3VibGU+ID46OnZhbHVlICkpOworICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPGRvdWJsZT4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICBpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPGRvdWJsZT4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICFpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPGRvdWJsZT4gPjo6cmV0ICkpOworCisgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxmbG9hdCxmbG9hdD4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICBpbnRlcm5hbDo6aGFzX3VuYXJ5X29wZXJhdG9yPGludGVybmFsOjpsaW5zcGFjZWRfb3A8ZmxvYXQsZmxvYXQ+ID46OnZhbHVlICkpOworICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc19iaW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxmbG9hdCxmbG9hdD4gPjo6dmFsdWUgKSk7CisgIFZFUklGWSgoICBpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGZsb2F0LGZsb2F0PiA+OjpyZXQgKSk7CisKKyAgLy8gUmVncmVzc2lvbiB1bml0IHRlc3QgZm9yIGEgd2VpcmQgTVNWQyBidWcuCisgIC8vIFNlYXJjaCAibnVsbGFyeV93cmFwcGVyX3dvcmthcm91bmRfbXN2YyIgaW4gQ29yZUV2YWx1YXRvcnMuaCBmb3IgdGhlIGRldGFpbHMuCisgIC8vIFNlZSBhbHNvIHRyYWl0czxSZWY+OjptYXRjaC4KKyAgeworICAgIE1hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsMyk7CisgICAgUmVmPGNvbnN0IE1hdHJpeFhmPiBSID0gMi4wKkE7CisgICAgVkVSSUZZX0lTX0FQUFJPWChSLCBBK0EpOworCisgICAgUmVmPGNvbnN0IE1hdHJpeFhmPiBSMSA9IE1hdHJpeFhmOjpSYW5kb20oMywzKStBOworCisgICAgVmVjdG9yWGkgViA9IFZlY3RvclhpOjpSYW5kb20oMyk7CisgICAgUmVmPGNvbnN0IFZlY3RvclhpPiBSMiA9IFZlY3RvclhpOjpMaW5TcGFjZWQoMywxLDMpK1Y7CisgICAgVkVSSUZZX0lTX0FQUFJPWChSMiwgVitWZWN0b3IzaSgxLDIsMykpOworCisgICAgVkVSSUZZKCggIGludGVybmFsOjpoYXNfbnVsbGFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGZsb2F0PiA+Ojp2YWx1ZSApKTsKKyAgICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGZsb2F0PiA+Ojp2YWx1ZSApKTsKKyAgICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc19iaW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxmbG9hdD4gPjo6dmFsdWUgKSk7CisgICAgVkVSSUZZKCggIGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZmxvYXQ+ID46OnJldCApKTsKKworICAgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxpbnQsaW50PiA+Ojp2YWx1ZSApKTsKKyAgICBWRVJJRlkoKCAgaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludCxpbnQ+ID46OnZhbHVlICkpOworICAgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludCxpbnQ+ID46OnZhbHVlICkpOworICAgIFZFUklGWSgoICBpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludCxpbnQ+ID46OnJldCApKTsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L251bWV4dC5jcHAgYi90ZXN0L251bWV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlMzNlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbnVtZXh0LmNwcApAQCAtMCwwICsxLDUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNyBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGNoZWNrX2FicygpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgUmVhbDsKKworICBpZihOdW1UcmFpdHM8VD46OklzU2lnbmVkKQorICAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicygtVCgxKSksIFQoMSkpOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjphYnMoVCgwKSksIFQoMCkpOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjphYnMoVCgxKSksIFQoMSkpOworCisgIGZvcihpbnQgaz0wOyBrPGdfcmVwZWF0KjEwMDsgKytrKQorICB7CisgICAgVCB4ID0gaW50ZXJuYWw6OnJhbmRvbTxUPigpOworICAgIGlmKCFpbnRlcm5hbDo6aXNfc2FtZTxULGJvb2w+Ojp2YWx1ZSkKKyAgICAgIHggPSB4L1JlYWwoMik7CisgICAgaWYoTnVtVHJhaXRzPFQ+OjpJc1NpZ25lZCkKKyAgICB7CisgICAgICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjphYnMoeCksIG51bWV4dDo6YWJzKC14KSk7CisgICAgICBWRVJJRlkoIG51bWV4dDo6YWJzKC14KSA+PSBSZWFsKDApKTsKKyAgICB9CisgICAgVkVSSUZZKCBudW1leHQ6OmFicyh4KSA+PSBSZWFsKDApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBudW1leHQ6OmFiczIoeCksIG51bWV4dDo6YWJzMihudW1leHQ6OmFicyh4KSkgKTsKKyAgfQorfQorCit2b2lkIHRlc3RfbnVtZXh0KCkgeworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxib29sPigpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHNpZ25lZCBjaGFyPigpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHVuc2lnbmVkIGNoYXI+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8c2hvcnQ+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8dW5zaWduZWQgc2hvcnQ+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8aW50PigpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHVuc2lnbmVkIGludD4oKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxsb25nPigpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHVuc2lnbmVkIGxvbmc+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8aGFsZj4oKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2FiczxmbG9hdD4oKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxkb3VibGU+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8bG9uZyBkb3VibGU+KCkgKTsKKworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2FiczxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX2FiczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcGFja2V0bWF0aC5jcHAgYi90ZXN0L3BhY2tldG1hdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BhY2tldG1hdGguY3BwCkBAIC0wLDAgKzEsNjQxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInVuc3VwcG9ydGVkL0VpZ2VuL1NwZWNpYWxGdW5jdGlvbnMiCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fPj02CisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdpZ25vcmVkLWF0dHJpYnV0ZXMiCisjZW5kaWYKKy8vIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UKK2NvbnN0IGJvb2wgZ192ZWN0b3JpemVfc3NlID0gdHJ1ZTsKKyNlbHNlCitjb25zdCBib29sIGdfdmVjdG9yaXplX3NzZSA9IGZhbHNlOworI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBuZWdhdGUoY29uc3QgVCYgeCkgeyByZXR1cm4gLXg7IH0KK30KK30KKworLy8gTk9URTogd2UgZGlzYmFsZSBpbmxpbmluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byB3b3JrYXJvdW5kIGEgR0NDIGlzc3VlIHdoZW4gdXNpbmcgLU8zIGFuZCB0aGUgaTM4NyBGUFUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IEVJR0VOX0RPTlRfSU5MSU5FCitib29sIGlzQXBwcm94QWJzKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcmVmdmFsdWUpCit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYS1iLCByZWZ2YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gYm9vbCBhcmVBcHByb3hBYnMoY29uc3QgU2NhbGFyKiBhLCBjb25zdCBTY2FsYXIqIGIsIGludCBzaXplLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcmVmdmFsdWUpCit7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBpZiAoIWlzQXBwcm94QWJzKGFbaV0sYltpXSxyZWZ2YWx1ZSkpCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJyZWY6IFsiIDw8IE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gPihhLHNpemUpIDw8ICJdIiA8PCAiICE9IHZlYzogWyIgPDwgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPiA+KGIsc2l6ZSkgPDwgIl1cbiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGJvb2wgYXJlQXBwcm94KGNvbnN0IFNjYWxhciogYSwgY29uc3QgU2NhbGFyKiBiLCBpbnQgc2l6ZSkKK3sKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGlmIChhW2ldIT1iW2ldICYmICFpbnRlcm5hbDo6aXNBcHByb3goYVtpXSxiW2ldKSkKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgInJlZjogWyIgPDwgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPiA+KGEsc2l6ZSkgPDwgIl0iIDw8ICIgIT0gdmVjOiBbIiA8PCBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+ID4oYixzaXplKSA8PCAiXVxuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQ1dJU0UxKFJFRk9QLCBQT1ApIHsgXAorICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKSBcCisgICAgcmVmW2ldID0gUkVGT1AoZGF0YTFbaV0pOyBcCisgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIFBPUChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKTsgXAorICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICNQT1ApOyBcCit9CisKK3RlbXBsYXRlPGJvb2wgQ29uZCx0eXBlbmFtZSBQYWNrZXQ+CitzdHJ1Y3QgcGFja2V0X2hlbHBlcgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgUGFja2V0IGxvYWQoY29uc3QgVCogZnJvbSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZnJvbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBzdG9yZShUKiB0bywgY29uc3QgUGFja2V0JiB4KSBjb25zdCB7IGludGVybmFsOjpwc3RvcmUodG8seCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KK3N0cnVjdCBwYWNrZXRfaGVscGVyPGZhbHNlLFBhY2tldD4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFQgbG9hZChjb25zdCBUKiBmcm9tKSBjb25zdCB7IHJldHVybiAqZnJvbTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBUJiB4KSBjb25zdCB7ICp0byA9IHg7IH0KK307CisKKyNkZWZpbmUgQ0hFQ0tfQ1dJU0UxX0lGKENPTkQsIFJFRk9QLCBQT1ApIGlmKENPTkQpIHsgXAorICBwYWNrZXRfaGVscGVyPENPTkQsUGFja2V0PiBoOyBcCisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpIFwKKyAgICByZWZbaV0gPSBSRUZPUChkYXRhMVtpXSk7IFwKKyAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSkpKTsgXAorICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICNQT1ApOyBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfQ1dJU0UyX0lGKENPTkQsIFJFRk9QLCBQT1ApIGlmKENPTkQpIHsgXAorICBwYWNrZXRfaGVscGVyPENPTkQsUGFja2V0PiBoOyBcCisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpIFwKKyAgICByZWZbaV0gPSBSRUZPUChkYXRhMVtpXSwgZGF0YTFbaStQYWNrZXRTaXplXSk7IFwKKyAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksaC5sb2FkKGRhdGExK1BhY2tldFNpemUpKSk7IFwKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAorfQorCisjZGVmaW5lIFJFRl9BREQoYSxiKSAoKGEpKyhiKSkKKyNkZWZpbmUgUkVGX1NVQihhLGIpICgoYSktKGIpKQorI2RlZmluZSBSRUZfTVVMKGEsYikgKChhKSooYikpCisjZGVmaW5lIFJFRl9ESVYoYSxiKSAoKGEpLyhiKSkKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHBhY2tldG1hdGgoKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUcmFpdHM6OnR5cGUgUGFja2V0OworICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IFBhY2tldFRyYWl0czo6c2l6ZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIGNvbnN0IGludCBtYXhfc2l6ZSA9IFBhY2tldFNpemUgPiA0ID8gUGFja2V0U2l6ZSA6IDQ7CisgIGNvbnN0IGludCBzaXplID0gUGFja2V0U2l6ZSptYXhfc2l6ZTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhMVtzaXplXTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhMltzaXplXTsKKyAgRUlHRU5fQUxJR05fTUFYIFBhY2tldCBwYWNrZXRzW1BhY2tldFNpemUqMl07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgcmVmW3NpemVdOworICBSZWFsU2NhbGFyIHJlZnZhbHVlID0gMDsKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkvUmVhbFNjYWxhcihQYWNrZXRTaXplKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpL1JlYWxTY2FsYXIoUGFja2V0U2l6ZSk7CisgICAgcmVmdmFsdWUgPSAoc3RkOjptYXgpKHJlZnZhbHVlLGFicyhkYXRhMVtpXSkpOworICB9CisKKyAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKTsKKyAgVkVSSUZZKGFyZUFwcHJveChkYXRhMSwgZGF0YTIsIFBhY2tldFNpemUpICYmICJhbGlnbmVkIGxvYWQvc3RvcmUiKTsKKworICBmb3IgKGludCBvZmZzZXQ9MDsgb2Zmc2V0PFBhY2tldFNpemU7ICsrb2Zmc2V0KQorICB7CisgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBsb2FkdTxQYWNrZXQ+KGRhdGExK29mZnNldCkpOworICAgIFZFUklGWShhcmVBcHByb3goZGF0YTErb2Zmc2V0LCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImludGVybmFsOjpwbG9hZHUiKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldD0wOyBvZmZzZXQ8UGFja2V0U2l6ZTsgKytvZmZzZXQpCisgIHsKKyAgICBpbnRlcm5hbDo6cHN0b3JldShkYXRhMitvZmZzZXQsIGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSk7CisgICAgVkVSSUZZKGFyZUFwcHJveChkYXRhMSwgZGF0YTIrb2Zmc2V0LCBQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBzdG9yZXUiKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldD0wOyBvZmZzZXQ8UGFja2V0U2l6ZTsgKytvZmZzZXQpCisgIHsKKyAgICBwYWNrZXRzWzBdID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpOworICAgIHBhY2tldHNbMV0gPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMStQYWNrZXRTaXplKTsKKyAgICAgICAgIGlmIChvZmZzZXQ9PTApIGludGVybmFsOjpwYWxpZ248MD4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xKSBpbnRlcm5hbDo6cGFsaWduPDE+KHBhY2tldHNbMF0sIHBhY2tldHNbMV0pOworICAgIGVsc2UgaWYgKG9mZnNldD09MikgaW50ZXJuYWw6OnBhbGlnbjwyPihwYWNrZXRzWzBdLCBwYWNrZXRzWzFdKTsKKyAgICBlbHNlIGlmIChvZmZzZXQ9PTMpIGludGVybmFsOjpwYWxpZ248Mz4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT00KSBpbnRlcm5hbDo6cGFsaWduPDQ+KHBhY2tldHNbMF0sIHBhY2tldHNbMV0pOworICAgIGVsc2UgaWYgKG9mZnNldD09NSkgaW50ZXJuYWw6OnBhbGlnbjw1PihwYWNrZXRzWzBdLCBwYWNrZXRzWzFdKTsKKyAgICBlbHNlIGlmIChvZmZzZXQ9PTYpIGludGVybmFsOjpwYWxpZ248Nj4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT03KSBpbnRlcm5hbDo6cGFsaWduPDc+KHBhY2tldHNbMF0sIHBhY2tldHNbMV0pOworICAgIGVsc2UgaWYgKG9mZnNldD09OCkgaW50ZXJuYWw6OnBhbGlnbjw4PihwYWNrZXRzWzBdLCBwYWNrZXRzWzFdKTsKKyAgICBlbHNlIGlmIChvZmZzZXQ9PTkpIGludGVybmFsOjpwYWxpZ248OT4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xMCkgaW50ZXJuYWw6OnBhbGlnbjwxMD4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xMSkgaW50ZXJuYWw6OnBhbGlnbjwxMT4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xMikgaW50ZXJuYWw6OnBhbGlnbjwxMj4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xMykgaW50ZXJuYWw6OnBhbGlnbjwxMz4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xNCkgaW50ZXJuYWw6OnBhbGlnbjwxND4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xNSkgaW50ZXJuYWw6OnBhbGlnbjwxNT4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgcGFja2V0c1swXSk7CisKKyAgICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbaStvZmZzZXRdOworCisgICAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBhbGlnbiIpOworICB9CisKKyAgVkVSSUZZKCghUGFja2V0VHJhaXRzOjpWZWN0b3JpemFibGUpIHx8IFBhY2tldFRyYWl0czo6SGFzQWRkKTsKKyAgVkVSSUZZKCghUGFja2V0VHJhaXRzOjpWZWN0b3JpemFibGUpIHx8IFBhY2tldFRyYWl0czo6SGFzU3ViKTsKKyAgVkVSSUZZKCghUGFja2V0VHJhaXRzOjpWZWN0b3JpemFibGUpIHx8IFBhY2tldFRyYWl0czo6SGFzTXVsKTsKKyAgVkVSSUZZKCghUGFja2V0VHJhaXRzOjpWZWN0b3JpemFibGUpIHx8IFBhY2tldFRyYWl0czo6SGFzTmVnYXRlKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsaW50Pjo6dmFsdWUpIHx8ICghUGFja2V0VHJhaXRzOjpWZWN0b3JpemFibGUpIHx8IFBhY2tldFRyYWl0czo6SGFzRGl2KTsKKworICBDSEVDS19DV0lTRTJfSUYoUGFja2V0VHJhaXRzOjpIYXNBZGQsIFJFRl9BREQsICBpbnRlcm5hbDo6cGFkZCk7CisgIENIRUNLX0NXSVNFMl9JRihQYWNrZXRUcmFpdHM6Okhhc1N1YiwgUkVGX1NVQiwgIGludGVybmFsOjpwc3ViKTsKKyAgQ0hFQ0tfQ1dJU0UyX0lGKFBhY2tldFRyYWl0czo6SGFzTXVsLCBSRUZfTVVMLCAgaW50ZXJuYWw6OnBtdWwpOworICBDSEVDS19DV0lTRTJfSUYoUGFja2V0VHJhaXRzOjpIYXNEaXYsIFJFRl9ESVYsIGludGVybmFsOjpwZGl2KTsKKworICBDSEVDS19DV0lTRTEoaW50ZXJuYWw6Om5lZ2F0ZSwgaW50ZXJuYWw6OnBuZWdhdGUpOworICBDSEVDS19DV0lTRTEobnVtZXh0Ojpjb25qLCBpbnRlcm5hbDo6cGNvbmopOworCisgIGZvcihpbnQgb2Zmc2V0PTA7b2Zmc2V0PDM7KytvZmZzZXQpCisgIHsKKyAgICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbb2Zmc2V0XTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihkYXRhMVtvZmZzZXRdKSk7CisgICAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBzZXQxIik7CisgIH0KKworICB7CisgICAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemUqNDsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbaS9QYWNrZXRTaXplXTsKKyAgICBQYWNrZXQgQTAsIEExLCBBMiwgQTM7CisgICAgaW50ZXJuYWw6OnBicm9hZGNhc3Q0PFBhY2tldD4oZGF0YTEsIEEwLCBBMSwgQTIsIEEzKTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyKzAqUGFja2V0U2l6ZSwgQTApOworICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIrMSpQYWNrZXRTaXplLCBBMSk7CisgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMisyKlBhY2tldFNpemUsIEEyKTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyKzMqUGFja2V0U2l6ZSwgQTMpOworICAgIFZFUklGWShhcmVBcHByb3gocmVmLCBkYXRhMiwgNCpQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBicm9hZGNhc3Q0Iik7CisgIH0KKworICB7CisgICAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemUqMjsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbaS9QYWNrZXRTaXplXTsKKyAgICBQYWNrZXQgQTAsIEExOworICAgIGludGVybmFsOjpwYnJvYWRjYXN0MjxQYWNrZXQ+KGRhdGExLCBBMCwgQTEpOworICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIrMCpQYWNrZXRTaXplLCBBMCk7CisgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMisxKlBhY2tldFNpemUsIEExKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIDIqUGFja2V0U2l6ZSkgJiYgImludGVybmFsOjpwYnJvYWRjYXN0MiIpOworICB9CisKKyAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChkYXRhMVswXSwgaW50ZXJuYWw6OnBmaXJzdChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJiAiaW50ZXJuYWw6OnBmaXJzdCIpOworCisgIGlmKFBhY2tldFNpemU+MSkKKyAgeworICAgIGZvcihpbnQgb2Zmc2V0PTA7b2Zmc2V0PDQ7KytvZmZzZXQpCisgICAgeworICAgICAgZm9yKGludCBpPTA7aTxQYWNrZXRTaXplLzI7KytpKQorICAgICAgICByZWZbMippKzBdID0gcmVmWzIqaSsxXSA9IGRhdGExW29mZnNldCtpXTsKKyAgICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsaW50ZXJuYWw6OnBsb2FkZHVwPFBhY2tldD4oZGF0YTErb2Zmc2V0KSk7CisgICAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJwbG9hZGR1cCIpOworICAgIH0KKyAgfQorCisgIGlmKFBhY2tldFNpemU+MikKKyAgeworICAgIGZvcihpbnQgb2Zmc2V0PTA7b2Zmc2V0PDQ7KytvZmZzZXQpCisgICAgeworICAgICAgZm9yKGludCBpPTA7aTxQYWNrZXRTaXplLzQ7KytpKQorICAgICAgICByZWZbNCppKzBdID0gcmVmWzQqaSsxXSA9IHJlZls0KmkrMl0gPSByZWZbNCppKzNdID0gZGF0YTFbb2Zmc2V0K2ldOworICAgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMixpbnRlcm5hbDo6cGxvYWRxdWFkPFBhY2tldD4oZGF0YTErb2Zmc2V0KSk7CisgICAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJwbG9hZHF1YWQiKTsKKyAgICB9CisgIH0KKworICByZWZbMF0gPSAwOworICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgIHJlZlswXSArPSBkYXRhMVtpXTsKKyAgVkVSSUZZKGlzQXBwcm94QWJzKHJlZlswXSwgaW50ZXJuYWw6OnByZWR1eChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpLCByZWZ2YWx1ZSkgJiYgImludGVybmFsOjpwcmVkdXgiKTsKKworICB7CisgICAgZm9yIChpbnQgaT0wOyBpPDQ7ICsraSkKKyAgICAgIHJlZltpXSA9IDA7CisgICAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICAgIHJlZltpJTRdICs9IGRhdGExW2ldOworICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGludGVybmFsOjpwcmVkdXhfZG93bnRvNChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemU+ND9QYWNrZXRTaXplLzI6UGFja2V0U2l6ZSkgJiYgImludGVybmFsOjpwcmVkdXhfZG93bnRvNCIpOworICB9CisKKyAgcmVmWzBdID0gMTsKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICByZWZbMF0gKj0gZGF0YTFbaV07CisgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4X211bChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJiAiaW50ZXJuYWw6OnByZWR1eF9tdWwiKTsKKworICBmb3IgKGludCBqPTA7IGo8UGFja2V0U2l6ZTsgKytqKQorICB7CisgICAgcmVmW2pdID0gMDsKKyAgICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgICAgcmVmW2pdICs9IGRhdGExW2kraipQYWNrZXRTaXplXTsKKyAgICBwYWNrZXRzW2pdID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEraipQYWNrZXRTaXplKTsKKyAgfQorICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cHJlZHV4cChwYWNrZXRzKSk7CisgIFZFUklGWShhcmVBcHByb3hBYnMocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSwgcmVmdmFsdWUpICYmICJpbnRlcm5hbDo6cHJlZHV4cCIpOworCisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgcmVmW2ldID0gZGF0YTFbUGFja2V0U2l6ZS1pLTFdOworICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cHJldmVyc2UoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSk7CisgIFZFUklGWShhcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImludGVybmFsOjpwcmV2ZXJzZSIpOworCisgIGludGVybmFsOjpQYWNrZXRCbG9jazxQYWNrZXQ+IGtlcm5lbDsKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgeworICAgIGtlcm5lbC5wYWNrZXRbaV0gPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMStpKlBhY2tldFNpemUpOworICB9CisgIHB0cmFuc3Bvc2Uoa2VybmVsKTsKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgeworICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGtlcm5lbC5wYWNrZXRbaV0pOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgUGFja2V0U2l6ZTsgKytqKSB7CisgICAgICBWRVJJRlkoaXNBcHByb3hBYnMoZGF0YTJbal0sIGRhdGExW2kraipQYWNrZXRTaXplXSwgcmVmdmFsdWUpICYmICJwdHJhbnNwb3NlIik7CisgICAgfQorICB9CisKKyAgaWYgKFBhY2tldFRyYWl0czo6SGFzQmxlbmQpIHsKKyAgICBQYWNrZXQgdGhlblBhY2tldCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKTsKKyAgICBQYWNrZXQgZWxzZVBhY2tldCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGEyKTsKKyAgICBFSUdFTl9BTElHTl9NQVggaW50ZXJuYWw6OlNlbGVjdG9yPFBhY2tldFNpemU+IHNlbGVjdG9yOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICBzZWxlY3Rvci5zZWxlY3RbaV0gPSBpOworICAgIH0KKworICAgIFBhY2tldCBibGVuZCA9IGludGVybmFsOjpwYmxlbmQoc2VsZWN0b3IsIHRoZW5QYWNrZXQsIGVsc2VQYWNrZXQpOworICAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgcmVzdWx0W3NpemVdOworICAgIGludGVybmFsOjpwc3RvcmUocmVzdWx0LCBibGVuZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIFZFUklGWShpc0FwcHJveEFicyhyZXN1bHRbaV0sIChzZWxlY3Rvci5zZWxlY3RbaV0gPyBkYXRhMVtpXSA6IGRhdGEyW2ldKSwgcmVmdmFsdWUpKTsKKyAgICB9CisgIH0KKworICBpZiAoUGFja2V0VHJhaXRzOjpIYXNCbGVuZCB8fCBnX3ZlY3Rvcml6ZV9zc2UpIHsKKyAgICAvLyBwaW5zZXJ0Zmlyc3QKKyAgICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbaV07CisgICAgU2NhbGFyIHMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICByZWZbMF0gPSBzOworICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGludGVybmFsOjpwaW5zZXJ0Zmlyc3QoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpLHMpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cGluc2VydGZpcnN0Iik7CisgIH0KKworICBpZiAoUGFja2V0VHJhaXRzOjpIYXNCbGVuZCB8fCBnX3ZlY3Rvcml6ZV9zc2UpIHsKKyAgICAvLyBwaW5zZXJ0bGFzdAorICAgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICByZWZbaV0gPSBkYXRhMVtpXTsKKyAgICBTY2FsYXIgcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIHJlZltQYWNrZXRTaXplLTFdID0gczsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGluc2VydGxhc3QoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpLHMpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cGluc2VydGxhc3QiKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFja2V0bWF0aF9yZWFsKCkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPiBQYWNrZXRUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHJhaXRzOjp0eXBlIFBhY2tldDsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgPSBQYWNrZXRUcmFpdHM6OnNpemU7CisKKyAgY29uc3QgaW50IHNpemUgPSBQYWNrZXRTaXplKjQ7CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgZGF0YTFbUGFja2V0VHJhaXRzOjpzaXplKjRdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGRhdGEyW1BhY2tldFRyYWl0czo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciByZWZbUGFja2V0VHJhaXRzOjpzaXplKjRdOworCisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwxKSAqIHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMywzKSk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEsMSkgKiBzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTMsMykpOworICB9CisgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc1Npbiwgc3RkOjpzaW4sIGludGVybmFsOjpwc2luKTsKKyAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzQ29zLCBzdGQ6OmNvcywgaW50ZXJuYWw6OnBjb3MpOworICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNUYW4sIHN0ZDo6dGFuLCBpbnRlcm5hbDo6cHRhbik7CisKKyAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzUm91bmQsIG51bWV4dDo6cm91bmQsIGludGVybmFsOjpwcm91bmQpOworICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNDZWlsLCBudW1leHQ6OmNlaWwsIGludGVybmFsOjpwY2VpbCk7CisgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc0Zsb29yLCBudW1leHQ6OmZsb29yLCBpbnRlcm5hbDo6cGZsb29yKTsKKworICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICB7CisgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEsMSk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEsMSk7CisgIH0KKyAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzQVNpbiwgc3RkOjphc2luLCBpbnRlcm5hbDo6cGFzaW4pOworICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNBQ29zLCBzdGQ6OmFjb3MsIGludGVybmFsOjpwYWNvcyk7CisKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC04Nyw4OCk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTg3LDg4KTsKKyAgfQorICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIHN0ZDo6ZXhwLCBpbnRlcm5hbDo6cGV4cCk7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwxKSAqIHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPigtNiw2KSk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEsMSkgKiBzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTYsNikpOworICB9CisgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc1RhbmgsIHN0ZDo6dGFuaCwgaW50ZXJuYWw6OnB0YW5oKTsKKyAgaWYoUGFja2V0VHJhaXRzOjpIYXNFeHAgJiYgUGFja2V0VHJhaXRzOjpzaXplPj0yKQorICB7CisgICAgZGF0YTFbMF0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIGRhdGExWzFdID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgICAgcGFja2V0X2hlbHBlcjxQYWNrZXRUcmFpdHM6Okhhc0V4cCxQYWNrZXQ+IGg7CisgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBleHAoaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMF0pKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc3RkOjpleHAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpLCBkYXRhMlsxXSk7CisKKyAgICBkYXRhMVswXSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKyAgICBkYXRhMVsxXSA9IDA7CisgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBleHAoaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmV4cCgtc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpLCBkYXRhMlswXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6ZXhwKFNjYWxhcigwKSksIGRhdGEyWzFdKTsKKworICAgIGRhdGExWzBdID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKSgpOworICAgIGRhdGExWzFdID0gLShzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKTsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGV4cChoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6ZXhwKChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKSksIGRhdGEyWzBdKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc3RkOjpleHAoLShzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKSksIGRhdGEyWzFdKTsKKworICAgIGRhdGExWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpkZW5vcm1fbWluKCk7CisgICAgZGF0YTFbMV0gPSAtc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpkZW5vcm1fbWluKCk7CisgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBleHAoaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmV4cChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmRlbm9ybV9taW4oKSksIGRhdGEyWzBdKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc3RkOjpleHAoLXN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6ZGVub3JtX21pbigpKSwgZGF0YTJbMV0pOworICB9CisKKyAgaWYgKFBhY2tldFRyYWl0czo6SGFzVGFuaCkgeworICAgIC8vIE5PVEUgdGhpcyB0ZXN0IG1pZ2ggZmFpbCB3aXRoIEdDQyBwcmlvciB0byA2LjMsIHNlZSBNYXRoRnVuY3Rpb25zSW1wbC5oIGZvciBkZXRhaWxzLgorICAgIGRhdGExWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBwYWNrZXRfaGVscGVyPGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1RhbmgsUGFja2V0PiBoOworICAgIGguc3RvcmUoZGF0YTIsIGludGVybmFsOjpwdGFuaChoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICB9CisKKyNpZiBFSUdFTl9IQVNfQzk5X01BVEgKKyAgeworICAgIGRhdGExWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBwYWNrZXRfaGVscGVyPGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0xHYW1tYSxQYWNrZXQ+IGg7CisgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBsZ2FtbWEoaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMF0pKTsKKyAgfQorICB7CisgICAgZGF0YTFbMF0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIHBhY2tldF9oZWxwZXI8aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzRXJmLFBhY2tldD4gaDsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGVyZihoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICB9CisgIHsKKyAgICBkYXRhMVswXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgcGFja2V0X2hlbHBlcjxpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNFcmZjLFBhY2tldD4gaDsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGVyZmMoaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMF0pKTsKKyAgfQorI2VuZGlmICAvLyBFSUdFTl9IQVNfQzk5X01BVEgKKworICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICB7CisgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwxKSAqIHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPigtNiw2KSk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwxKSAqIHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPigtNiw2KSk7CisgIH0KKworICBpZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpPDAuMWYpCisgICAgZGF0YTFbaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIFBhY2tldFNpemUpXSA9IDA7CisgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc1NxcnQsIHN0ZDo6c3FydCwgaW50ZXJuYWw6OnBzcXJ0KTsKKyAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzTG9nLCBzdGQ6OmxvZywgaW50ZXJuYWw6OnBsb2cpOworI2lmIEVJR0VOX0hBU19DOTlfTUFUSCAmJiAoX19jcGx1c3BsdXMgPiAxOTk3MTFMKQorICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNMb2cxcCwgc3RkOjpsb2cxcCwgaW50ZXJuYWw6OnBsb2cxcCk7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNMR2FtbWEsIHN0ZDo6bGdhbW1hLCBpbnRlcm5hbDo6cGxnYW1tYSk7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNFcmYsIHN0ZDo6ZXJmLCBpbnRlcm5hbDo6cGVyZik7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNFcmZjLCBzdGQ6OmVyZmMsIGludGVybmFsOjpwZXJmYyk7CisjZW5kaWYKKworICBpZihQYWNrZXRUcmFpdHM6Okhhc0xvZyAmJiBQYWNrZXRUcmFpdHM6OnNpemU+PTIpCisgIHsKKyAgICBkYXRhMVswXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgZGF0YTFbMV0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKyAgICBwYWNrZXRfaGVscGVyPFBhY2tldFRyYWl0czo6SGFzTG9nLFBhY2tldD4gaDsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvZyhoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmxvZyhzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKSksIGRhdGEyWzFdKTsKKworICAgIGRhdGExWzBdID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICAgIGRhdGExWzFdID0gMDsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvZyhoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmxvZyhTY2FsYXIoMCkpLCBkYXRhMlsxXSk7CisKKyAgICBkYXRhMVswXSA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKTsKKyAgICBkYXRhMVsxXSA9IC0oc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CisgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBsb2coaC5sb2FkKGRhdGExKSkpOworICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmxvZygoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCkpLCBkYXRhMlswXSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlsxXSkpOworCisgICAgZGF0YTFbMF0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmRlbm9ybV9taW4oKTsKKyAgICBkYXRhMVsxXSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmRlbm9ybV9taW4oKTsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvZyhoLmxvYWQoZGF0YTEpKSk7CisgICAgLy8gVkVSSUZZX0lTX0VRVUFMKHN0ZDo6bG9nKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6ZGVub3JtX21pbigpKSwgZGF0YTJbMF0pOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMV0pKTsKKworICAgIGRhdGExWzBdID0gU2NhbGFyKC0xLjBmKTsKKyAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvZyhoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICAgIGguc3RvcmUoZGF0YTIsIGludGVybmFsOjpwc3FydChoLmxvYWQoZGF0YTEpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMV0pKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFja2V0bWF0aF9ub3Rjb21wbGV4KCkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPiBQYWNrZXRUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHJhaXRzOjp0eXBlIFBhY2tldDsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgPSBQYWNrZXRUcmFpdHM6OnNpemU7CisKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhMVtQYWNrZXRUcmFpdHM6OnNpemUqNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgZGF0YTJbUGFja2V0VHJhaXRzOjpzaXplKjRdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIHJlZltQYWNrZXRUcmFpdHM6OnNpemUqNF07CisKKyAgQXJyYXk8U2NhbGFyLER5bmFtaWMsMT46Ok1hcChkYXRhMSwgUGFja2V0VHJhaXRzOjpzaXplKjQpLnNldFJhbmRvbSgpOworCisgIHJlZlswXSA9IGRhdGExWzBdOworICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgIHJlZlswXSA9IChzdGQ6Om1pbikocmVmWzBdLGRhdGExW2ldKTsKKyAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbMF0sIGludGVybmFsOjpwcmVkdXhfbWluKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpICYmICJpbnRlcm5hbDo6cHJlZHV4X21pbiIpOworCisgIFZFUklGWSgoIVBhY2tldFRyYWl0czo6VmVjdG9yaXphYmxlKSB8fCBQYWNrZXRUcmFpdHM6Okhhc01pbik7CisgIFZFUklGWSgoIVBhY2tldFRyYWl0czo6VmVjdG9yaXphYmxlKSB8fCBQYWNrZXRUcmFpdHM6Okhhc01heCk7CisKKyAgQ0hFQ0tfQ1dJU0UyX0lGKFBhY2tldFRyYWl0czo6SGFzTWluLCAoc3RkOjptaW4pLCBpbnRlcm5hbDo6cG1pbik7CisgIENIRUNLX0NXSVNFMl9JRihQYWNrZXRUcmFpdHM6Okhhc01heCwgKHN0ZDo6bWF4KSwgaW50ZXJuYWw6OnBtYXgpOworICBDSEVDS19DV0lTRTEoYWJzLCBpbnRlcm5hbDo6cGFicyk7CisKKyAgcmVmWzBdID0gZGF0YTFbMF07CisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgcmVmWzBdID0gKHN0ZDo6bWF4KShyZWZbMF0sZGF0YTFbaV0pOworICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJlZlswXSwgaW50ZXJuYWw6OnByZWR1eF9tYXgoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYgImludGVybmFsOjpwcmVkdXhfbWF4Iik7CisKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICByZWZbaV0gPSBkYXRhMVswXStTY2FsYXIoaSk7CisgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGludGVybmFsOjpwbHNldDxQYWNrZXQ+KGRhdGExWzBdKSk7CisgIFZFUklGWShhcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImludGVybmFsOjpwbHNldCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsYm9vbCBDb25qTGhzLGJvb2wgQ29ualJocz4gdm9pZCB0ZXN0X2NvbmpfaGVscGVyKFNjYWxhciogZGF0YTEsIFNjYWxhciogZGF0YTIsIFNjYWxhciogcmVmLCBTY2FsYXIqIHB2YWwpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPiBQYWNrZXRUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHJhaXRzOjp0eXBlIFBhY2tldDsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgPSBQYWNrZXRUcmFpdHM6OnNpemU7CisKKyAgaW50ZXJuYWw6OmNvbmpfaWY8Q29uakxocz4gY2owOworICBpbnRlcm5hbDo6Y29ual9pZjxDb25qUmhzPiBjajE7CisgIGludGVybmFsOjpjb25qX2hlbHBlcjxTY2FsYXIsU2NhbGFyLENvbmpMaHMsQ29ualJocz4gY2o7CisgIGludGVybmFsOjpjb25qX2hlbHBlcjxQYWNrZXQsUGFja2V0LENvbmpMaHMsQ29ualJocz4gcGNqOworCisgIGZvcihpbnQgaT0wO2k8UGFja2V0U2l6ZTsrK2kpCisgIHsKKyAgICByZWZbaV0gPSBjajAoZGF0YTFbaV0pICogY2oxKGRhdGEyW2ldKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJlZltpXSwgY2oucG11bChkYXRhMVtpXSxkYXRhMltpXSkpICYmICJjb25qX2hlbHBlciBwbXVsIik7CisgIH0KKyAgaW50ZXJuYWw6OnBzdG9yZShwdmFsLHBjai5wbXVsKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSxpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMikpKTsKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIHB2YWwsIFBhY2tldFNpemUpICYmICJjb25qX2hlbHBlciBwbXVsIik7CisKKyAgZm9yKGludCBpPTA7aTxQYWNrZXRTaXplOysraSkKKyAgeworICAgIFNjYWxhciB0bXAgPSByZWZbaV07CisgICAgcmVmW2ldICs9IGNqMChkYXRhMVtpXSkgKiBjajEoZGF0YTJbaV0pOworICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmW2ldLCBjai5wbWFkZChkYXRhMVtpXSxkYXRhMltpXSx0bXApKSAmJiAiY29ual9oZWxwZXIgcG1hZGQiKTsKKyAgfQorICBpbnRlcm5hbDo6cHN0b3JlKHB2YWwscGNqLnBtYWRkKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSxpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMiksaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4ocHZhbCkpKTsKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIHB2YWwsIFBhY2tldFNpemUpICYmICJjb25qX2hlbHBlciBwbWFkZCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFja2V0bWF0aF9jb21wbGV4KCkKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUcmFpdHM6OnR5cGUgUGFja2V0OworICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IFBhY2tldFRyYWl0czo6c2l6ZTsKKworICBjb25zdCBpbnQgc2l6ZSA9IFBhY2tldFNpemUqNDsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhMVtQYWNrZXRTaXplKjRdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGRhdGEyW1BhY2tldFNpemUqNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgcmVmW1BhY2tldFNpemUqNF07CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgcHZhbFtQYWNrZXRTaXplKjRdOworCisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDFlMik7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSAqIFNjYWxhcigxZTIpOworICB9CisKKyAgdGVzdF9jb25qX2hlbHBlcjxTY2FsYXIsZmFsc2UsZmFsc2U+IChkYXRhMSxkYXRhMixyZWYscHZhbCk7CisgIHRlc3RfY29ual9oZWxwZXI8U2NhbGFyLGZhbHNlLHRydWU+ICAoZGF0YTEsZGF0YTIscmVmLHB2YWwpOworICB0ZXN0X2NvbmpfaGVscGVyPFNjYWxhcix0cnVlLGZhbHNlPiAgKGRhdGExLGRhdGEyLHJlZixwdmFsKTsKKyAgdGVzdF9jb25qX2hlbHBlcjxTY2FsYXIsdHJ1ZSx0cnVlPiAgIChkYXRhMSxkYXRhMixyZWYscHZhbCk7CisKKyAgeworICAgIGZvcihpbnQgaT0wO2k8UGFja2V0U2l6ZTsrK2kpCisgICAgICByZWZbaV0gPSBTY2FsYXIoc3RkOjppbWFnKGRhdGExW2ldKSxzdGQ6OnJlYWwoZGF0YTFbaV0pKTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKHB2YWwsaW50ZXJuYWw6OnBjcGx4ZmxpcChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgcHZhbCwgUGFja2V0U2l6ZSkgJiYgInBjcGx4ZmxpcCIpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBwYWNrZXRtYXRoX3NjYXR0ZXJfZ2F0aGVyKCkKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUcmFpdHM6OnR5cGUgUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGNvbnN0IGludCBQYWNrZXRTaXplID0gUGFja2V0VHJhaXRzOjpzaXplOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGRhdGExW1BhY2tldFNpemVdOworICBSZWFsU2NhbGFyIHJlZnZhbHVlID0gMDsKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgeworICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkvUmVhbFNjYWxhcihQYWNrZXRTaXplKTsKKyAgfQorCisgIGludCBzdHJpZGUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwyMCk7CisKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBidWZmZXJbUGFja2V0U2l6ZSoyMF07CisgIG1lbXNldChidWZmZXIsIDAsIDIwKlBhY2tldFNpemUqc2l6ZW9mKFNjYWxhcikpOworICBQYWNrZXQgcGFja2V0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpOworICBpbnRlcm5hbDo6cHNjYXR0ZXI8U2NhbGFyLCBQYWNrZXQ+KGJ1ZmZlciwgcGFja2V0LCBzdHJpZGUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZSoyMDsgKytpKSB7CisgICAgaWYgKChpJXN0cmlkZSkgPT0gMCAmJiBpPHN0cmlkZSpQYWNrZXRTaXplKSB7CisgICAgICBWRVJJRlkoaXNBcHByb3hBYnMoYnVmZmVyW2ldLCBkYXRhMVtpL3N0cmlkZV0sIHJlZnZhbHVlKSAmJiAicHNjYXR0ZXIiKTsKKyAgICB9IGVsc2UgeworICAgICAgVkVSSUZZKGlzQXBwcm94QWJzKGJ1ZmZlcltpXSwgU2NhbGFyKDApLCByZWZ2YWx1ZSkgJiYgInBzY2F0dGVyIik7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemUqNzsgKytpKSB7CisgICAgYnVmZmVyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkvUmVhbFNjYWxhcihQYWNrZXRTaXplKTsKKyAgfQorICBwYWNrZXQgPSBpbnRlcm5hbDo6cGdhdGhlcjxTY2FsYXIsIFBhY2tldD4oYnVmZmVyLCA3KTsKKyAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMSwgcGFja2V0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICBWRVJJRlkoaXNBcHByb3hBYnMoZGF0YTFbaV0sIGJ1ZmZlcltpKjddLCByZWZ2YWx1ZSkgJiYgInBnYXRoZXIiKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcGFja2V0bWF0aCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHBhY2tldG1hdGg8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGFja2V0bWF0aDxkb3VibGU+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcGFja2V0bWF0aDxpbnQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcGFja2V0bWF0aDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOworICAgIENBTExfU1VCVEVTVF81KCBwYWNrZXRtYXRoPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzEoIHBhY2tldG1hdGhfbm90Y29tcGxleDxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYWNrZXRtYXRoX25vdGNvbXBsZXg8ZG91YmxlPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHBhY2tldG1hdGhfbm90Y29tcGxleDxpbnQ+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBwYWNrZXRtYXRoX3JlYWw8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGFja2V0bWF0aF9yZWFsPGRvdWJsZT4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzQoIHBhY2tldG1hdGhfY29tcGxleDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOworICAgIENBTExfU1VCVEVTVF81KCBwYWNrZXRtYXRoX2NvbXBsZXg8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMSggcGFja2V0bWF0aF9zY2F0dGVyX2dhdGhlcjxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYWNrZXRtYXRoX3NjYXR0ZXJfZ2F0aGVyPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBwYWNrZXRtYXRoX3NjYXR0ZXJfZ2F0aGVyPGludD4oKSApOworICAgIENBTExfU1VCVEVTVF80KCBwYWNrZXRtYXRoX3NjYXR0ZXJfZ2F0aGVyPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHBhY2tldG1hdGhfc2NhdHRlcl9nYXRoZXI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcGFyZGlzb19zdXBwb3J0LmNwcCBiL3Rlc3QvcGFyZGlzb19zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VmYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wYXJkaXNvX3N1cHBvcnQuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8qIAorICAgSW50ZWwgQ29weXJpZ2h0IChDKSAuLi4uCisqLworCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL1BhcmRpc29TdXBwb3J0PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfcGFyZGlzb19UKCkKK3sKKyAgUGFyZGlzb0xMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIExvd2VyPiBwYXJkaXNvX2xsdF9sb3dlcjsKKyAgUGFyZGlzb0xMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIFVwcGVyPiBwYXJkaXNvX2xsdF91cHBlcjsKKyAgUGFyZGlzb0xETFQgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBMb3dlcj4gcGFyZGlzb19sZGx0X2xvd2VyOworICBQYXJkaXNvTERMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIFVwcGVyPiBwYXJkaXNvX2xkbHRfdXBwZXI7CisgIFBhcmRpc29MVSAgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+ID4gcGFyZGlzb19sdTsKKworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFyZGlzb19sbHRfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFyZGlzb19sbHRfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFyZGlzb19sZGx0X2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGRsdF91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhwYXJkaXNvX2x1KTsKK30KKwordm9pZCB0ZXN0X3BhcmRpc29fc3VwcG9ydCgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfcGFyZGlzb19UPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9wYXJkaXNvX1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9wYXJkaXNvX1Q8IHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9wYXJkaXNvX1Q8IHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcCBiL3Rlc3QvcGFzdGl4X3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmY4NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcApAQCAtMCwwICsxLDU0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19ERUJVR19TTUFMTF9QUk9EVUNUX0JMT0NLUworI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKKyNpbmNsdWRlIDxFaWdlbi9QYVN0aVhTdXBwb3J0PgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwYXJzZUV4dHJhPgorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9wYXN0aXhfVCgpCit7CisgIFBhc3RpeExMVDwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46Okxvd2VyID4gcGFzdGl4X2xsdF9sb3dlcjsKKyAgUGFzdGl4TERMVDwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46Okxvd2VyID4gcGFzdGl4X2xkbHRfbG93ZXI7CisgIFBhc3RpeExMVDwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46OlVwcGVyID4gcGFzdGl4X2xsdF91cHBlcjsKKyAgUGFzdGl4TERMVDwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46OlVwcGVyID4gcGFzdGl4X2xkbHRfdXBwZXI7CisgIFBhc3RpeExVPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gcGFzdGl4X2x1OworCisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhwYXN0aXhfbGx0X2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhc3RpeF9sZGx0X2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhc3RpeF9sbHRfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFzdGl4X2xkbHRfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcocGFzdGl4X2x1KTsKKworICAvLyBTb21lIGNvbXBpbGF0aW9uIGNoZWNrOgorICBwYXN0aXhfbGx0X2xvd2VyLmlwYXJtKCk7CisgIHBhc3RpeF9sbHRfbG93ZXIuZHBhcm0oKTsKKyAgcGFzdGl4X2xkbHRfbG93ZXIuaXBhcm0oKTsKKyAgcGFzdGl4X2xkbHRfbG93ZXIuZHBhcm0oKTsKKyAgcGFzdGl4X2x1LmlwYXJtKCk7CisgIHBhc3RpeF9sdS5kcGFybSgpOworfQorCisvLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZWxmYWRqb2ludCBtYXRyaWNlcyB3aXRoIFBhU3RpWC4gCisvLyBDb21wbGV4IHN5bW1ldHJpYyBtYXRyaWNlcyBzaG91bGQgcGFzcyB0aG91Z2gKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9wYXN0aXhfVF9MVSgpCit7CisgIFBhc3RpeExVPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gcGFzdGl4X2x1OworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcocGFzdGl4X2x1KTsKK30KKwordm9pZCB0ZXN0X3Bhc3RpeF9zdXBwb3J0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9wYXN0aXhfVDxmbG9hdD4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfcGFzdGl4X1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzMoICh0ZXN0X3Bhc3RpeF9UX0xVPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKSApOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3Bhc3RpeF9UX0xVPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9IApkaWZmIC0tZ2l0IGEvdGVzdC9wZXJtdXRhdGlvbm1hdHJpY2VzLmNwcCBiL3Rlc3QvcGVybXV0YXRpb25tYXRyaWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxMjY2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGVybXV0YXRpb25tYXRyaWNlcy5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKyAgCisjaW5jbHVkZSAibWFpbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwZXJtdXRhdGlvbm1hdHJpY2VzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMgfTsKKyAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxSb3dzPiBMZWZ0UGVybXV0YXRpb25UeXBlOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIFJvd3MsIDE+IExlZnRQZXJtdXRhdGlvblZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWFwPExlZnRQZXJtdXRhdGlvblR5cGU+IE1hcExlZnRQZXJtOworICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PENvbHM+IFJpZ2h0UGVybXV0YXRpb25UeXBlOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIENvbHMsIDE+IFJpZ2h0UGVybXV0YXRpb25WZWN0b3JUeXBlOworICB0eXBlZGVmIE1hcDxSaWdodFBlcm11dGF0aW9uVHlwZT4gTWFwUmlnaHRQZXJtOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbV9vcmlnaW5hbCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBMZWZ0UGVybXV0YXRpb25WZWN0b3JUeXBlIGx2OworICByYW5kb21QZXJtdXRhdGlvblZlY3Rvcihsdiwgcm93cyk7CisgIExlZnRQZXJtdXRhdGlvblR5cGUgbHAobHYpOworICBSaWdodFBlcm11dGF0aW9uVmVjdG9yVHlwZSBydjsKKyAgcmFuZG9tUGVybXV0YXRpb25WZWN0b3IocnYsIGNvbHMpOworICBSaWdodFBlcm11dGF0aW9uVHlwZSBycChydik7CisgIE1hdHJpeFR5cGUgbV9wZXJtdXRlZCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobV9wZXJtdXRlZCA9IGxwICogbV9vcmlnaW5hbCAqIHJwLCAxKTsgLy8gMSB0ZW1wIGZvciBzdWIgZXhwcmVzc2lvbiAibHAgKiBtX29yaWdpbmFsIgorCisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyBpKyspCisgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7IGorKykKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkKGx2KGkpLGopLCBtX29yaWdpbmFsKGkscnYoaikpKTsKKworICBNYXRyaXg8U2NhbGFyLFJvd3MsUm93cz4gbG0obHApOworICBNYXRyaXg8U2NhbGFyLENvbHMsQ29scz4gcm0ocnApOworCisgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbG0qbV9vcmlnaW5hbCpybSk7CisgIAorICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobV9wZXJtdXRlZCA9IGxwICogbV9wZXJtdXRlZCAqIHJwLCAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBsbSptX29yaWdpbmFsKnJtKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gobHAuaW52ZXJzZSgpKm1fcGVybXV0ZWQqcnAuaW52ZXJzZSgpLCBtX29yaWdpbmFsKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsdi5hc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpKm1fcGVybXV0ZWQqcnYuYXNQZXJtdXRhdGlvbigpLmludmVyc2UoKSwgbV9vcmlnaW5hbCk7CisgIFZFUklGWV9JU19BUFBST1goTWFwTGVmdFBlcm0obHYuZGF0YSgpLGx2LnNpemUoKSkuaW52ZXJzZSgpKm1fcGVybXV0ZWQqTWFwUmlnaHRQZXJtKHJ2LmRhdGEoKSxydi5zaXplKCkpLmludmVyc2UoKSwgbV9vcmlnaW5hbCk7CisgIAorICBWRVJJRlkoKGxwKmxwLmludmVyc2UoKSkudG9EZW5zZU1hdHJpeCgpLmlzSWRlbnRpdHkoKSk7CisgIFZFUklGWSgobHYuYXNQZXJtdXRhdGlvbigpKmx2LmFzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkpLnRvRGVuc2VNYXRyaXgoKS5pc0lkZW50aXR5KCkpOworICBWRVJJRlkoKE1hcExlZnRQZXJtKGx2LmRhdGEoKSxsdi5zaXplKCkpKk1hcExlZnRQZXJtKGx2LmRhdGEoKSxsdi5zaXplKCkpLmludmVyc2UoKSkudG9EZW5zZU1hdHJpeCgpLmlzSWRlbnRpdHkoKSk7CisKKyAgTGVmdFBlcm11dGF0aW9uVmVjdG9yVHlwZSBsdjI7CisgIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKGx2Miwgcm93cyk7CisgIExlZnRQZXJtdXRhdGlvblR5cGUgbHAyKGx2Mik7CisgIE1hdHJpeDxTY2FsYXIsUm93cyxSb3dzPiBsbTIobHAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobHAqbHAyKS50b0RlbnNlTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIGxtKmxtMik7CisgIFZFUklGWV9JU19BUFBST1goKGx2LmFzUGVybXV0YXRpb24oKSpsdjIuYXNQZXJtdXRhdGlvbigpKS50b0RlbnNlTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIGxtKmxtMik7CisgIFZFUklGWV9JU19BUFBST1goKE1hcExlZnRQZXJtKGx2LmRhdGEoKSxsdi5zaXplKCkpKk1hcExlZnRQZXJtKGx2Mi5kYXRhKCksbHYyLnNpemUoKSkpLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgbG0qbG0yKTsKKworICBMZWZ0UGVybXV0YXRpb25UeXBlIGlkZW50aXR5cDsKKyAgaWRlbnRpdHlwLnNldElkZW50aXR5KHJvd3MpOworICBWRVJJRllfSVNfQVBQUk9YKG1fb3JpZ2luYWwsIGlkZW50aXR5cCptX29yaWdpbmFsKTsKKyAgCisgIC8vIGNoZWNrIGlucGxhY2UgcGVybXV0YXRpb25zCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKT0gbHAuaW52ZXJzZSgpICogbV9wZXJtdXRlZCwgMSk7IC8vIDEgdGVtcCB0byBhbGxvY2F0ZSB0aGUgbWFzaworICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIGxwLmludmVyc2UoKSptX29yaWdpbmFsKTsKKyAgCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IG1fcGVybXV0ZWQgKiBycC5pbnZlcnNlKCksIDEpOyAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBtX29yaWdpbmFsKnJwLmludmVyc2UoKSk7CisgIAorICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobV9wZXJtdXRlZC5ub2FsaWFzKCkgPSBscCAqIG1fcGVybXV0ZWQsIDEpOyAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBscCptX29yaWdpbmFsKTsKKyAgCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IG1fcGVybXV0ZWQgKiBycCwgMSk7IC8vIDEgdGVtcCB0byBhbGxvY2F0ZSB0aGUgbWFzaworICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIG1fb3JpZ2luYWwqcnApOworCisgIGlmKHJvd3M+MSAmJiBjb2xzPjEpCisgIHsKKyAgICBscDIgPSBscDsKKyAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKTsKKyAgICBJbmRleCBqOworICAgIGRvIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOyB3aGlsZShqPT1pKTsKKyAgICBscDIuYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVMZWZ0KGksIGopOworICAgIGxtID0gbHA7CisgICAgbG0ucm93KGkpLnN3YXAobG0ucm93KGopKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGxtLCBscDIudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpKTsKKworICAgIFJpZ2h0UGVybXV0YXRpb25UeXBlIHJwMiA9IHJwOworICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICAgIGRvIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOyB3aGlsZShqPT1pKTsKKyAgICBycDIuYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChpLCBqKTsKKyAgICBybSA9IHJwOworICAgIHJtLmNvbChpKS5zd2FwKHJtLmNvbChqKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChybSwgcnAyLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSk7CisgIH0KKworICB7CisgICAgLy8gc2ltcGxlIGNvbXBpbGF0aW9uIGNoZWNrCisgICAgTWF0cml4PFNjYWxhciwgQ29scywgQ29scz4gQSA9IHJwOworICAgIE1hdHJpeDxTY2FsYXIsIENvbHMsIENvbHM+IEIgPSBycC50cmFuc3Bvc2UoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEsIEIudHJhbnNwb3NlKCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGJ1Zzg5MCgpCit7CisgIHR5cGVkZWYgTWF0cml4PFQsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFQsIER5bmFtaWMsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4gUzsKKyAgdHlwZWRlZiBNYXA8TWF0cml4VHlwZSwgQWxpZ25lZCwgUz4gTWFwVHlwZTsKKyAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljPiBQZXJtOworICAKKyAgVmVjdG9yVHlwZSB2MSgyKSwgdjIoMiksIG9wKDQpLCByaHMoMik7CisgIHYxIDw8IDY2Niw2Njc7CisgIG9wIDw8IDEsMCwwLDE7CisgIHJocyA8PCA0Miw0MjsKKyAgCisgIFBlcm0gUCgyKTsKKyAgUC5pbmRpY2VzKCkgPDwgMSwgMDsKKworICBNYXBUeXBlKHYxLmRhdGEoKSwyLDEsUygxLDEpKSA9IFAgKiBNYXBUeXBlKHJocy5kYXRhKCksMiwxLFMoMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1godjEsIChQICogcmhzKS5ldmFsKCkpOworICAKKyAgTWFwVHlwZSh2MS5kYXRhKCksMiwxLFMoMSwxKSkgPSBQLmludmVyc2UoKSAqIE1hcFR5cGUocmhzLmRhdGEoKSwyLDEsUygxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgKFAuaW52ZXJzZSgpICogcmhzKS5ldmFsKCkpOworfQorCit2b2lkIHRlc3RfcGVybXV0YXRpb25tYXRyaWNlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGRvdWJsZSwzLDMsUm93TWFqb3I+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXg8ZG91YmxlLDQwLDYwPigpKSApOworICAgIENBTExfU1VCVEVTVF82KCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPigyMCwgMzApKSApOworICAgIENBTExfU1VCVEVTVF83KCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeFhjZigxNSwgMTApKSApOworICB9CisgIENBTExfU1VCVEVTVF81KCBidWc4OTA8ZG91YmxlPigpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3ByZWNfaW52ZXJzZV80eDQuY3BwIGIvdGVzdC9wcmVjX2ludmVyc2VfNHg0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZhZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcmVjX2ludmVyc2VfNHg0LmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGludmVyc2VfcGVybXV0YXRpb25fNHg0KCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBWZWN0b3I0aSBpbmRpY2VzKDAsMSwyLDMpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjQ7ICsraSkKKyAgeworICAgIE1hdHJpeFR5cGUgbSA9IFBlcm11dGF0aW9uTWF0cml4PDQ+KGluZGljZXMpOworICAgIE1hdHJpeFR5cGUgaW52ID0gbS5pbnZlcnNlKCk7CisgICAgZG91YmxlIGVycm9yID0gZG91YmxlKCAobSppbnYtTWF0cml4VHlwZTo6SWRlbnRpdHkoKSkubm9ybSgpIC8gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSApOworICAgIEVJR0VOX0RFQlVHX1ZBUihlcnJvcikKKyAgICBWRVJJRlkoZXJyb3IgPT0gMC4wKTsKKyAgICBzdGQ6Om5leHRfcGVybXV0YXRpb24oaW5kaWNlcy5kYXRhKCksaW5kaWNlcy5kYXRhKCkrNCk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlX2dlbmVyYWxfNHg0KGludCByZXBlYXQpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBkb3VibGUgZXJyb3Jfc3VtID0gMC4sIGVycm9yX21heCA9IDAuOworICBmb3IoaW50IGkgPSAwOyBpIDwgcmVwZWF0OyArK2kpCisgIHsKKyAgICBNYXRyaXhUeXBlIG07CisgICAgUmVhbFNjYWxhciBhYnNkZXQ7CisgICAgZG8geworICAgICAgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworICAgICAgYWJzZGV0ID0gYWJzKG0uZGV0ZXJtaW5hbnQoKSk7CisgICAgfSB3aGlsZShhYnNkZXQgPCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKTsKKyAgICBNYXRyaXhUeXBlIGludiA9IG0uaW52ZXJzZSgpOworICAgIGRvdWJsZSBlcnJvciA9IGRvdWJsZSggKG0qaW52LU1hdHJpeFR5cGU6OklkZW50aXR5KCkpLm5vcm0oKSAqIGFic2RldCAvIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKTsKKyAgICBlcnJvcl9zdW0gKz0gZXJyb3I7CisgICAgZXJyb3JfbWF4ID0gKHN0ZDo6bWF4KShlcnJvcl9tYXgsIGVycm9yKTsKKyAgfQorICBzdGQ6OmNlcnIgPDwgImludmVyc2VfZ2VuZXJhbF80eDQsIFNjYWxhciA9ICIgPDwgdHlwZV9uYW1lPFNjYWxhcj4oKSA8PCBzdGQ6OmVuZGw7CisgIGRvdWJsZSBlcnJvcl9hdmcgPSBlcnJvcl9zdW0gLyByZXBlYXQ7CisgIEVJR0VOX0RFQlVHX1ZBUihlcnJvcl9hdmcpOworICBFSUdFTl9ERUJVR19WQVIoZXJyb3JfbWF4KTsKKyAgIC8vIEZJWE1FIHRoYXQgMS4yNSB1c2VkIHRvIGJlIGEgMS4wIHVudGlsIHRoZSBOdW1UcmFpdHMgY2hhbmdlcyBvbiAyOCBBcHJpbCAyMDEwLCB3aGF0J3MgZ29pbmcgd3Jvbmc/PworICAgLy8gRklYTUUgdGhhdCAxLjI1IHVzZWQgdG8gYmUgMS4yIHVudGlsIHdlIHRlc3RlZCBnY2MgNC4xIG9uIDMwIEp1bmUgMjAxMCBhbmQgZ290IDEuMjEuCisgIFZFUklGWShlcnJvcl9hdmcgPCAoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCA/IDguMCA6IDEuMjUpKTsKKyAgVkVSSUZZKGVycm9yX21heCA8IChOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ID8gNjQuMCA6IDIwLjApKTsKKworICB7CisgICAgaW50IHMgPSA1Oy8vaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQsMTApOworICAgIGludCBpID0gMDsvL2ludGVybmFsOjpyYW5kb208aW50PigwLHMtNCk7CisgICAgaW50IGogPSAwOy8vaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscy00KTsKKyAgICBNYXRyaXg8U2NhbGFyLDUsNT4gbWF0KHMscyk7CisgICAgbWF0LnNldFJhbmRvbSgpOworICAgIE1hdHJpeFR5cGUgc3VibWF0ID0gbWF0LnRlbXBsYXRlIGJsb2NrPDQsND4oaSxqKTsKKyAgICBNYXRyaXhUeXBlIG1hdF9pbnYgPSBtYXQudGVtcGxhdGUgYmxvY2s8NCw0PihpLGopLmludmVyc2UoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdF9pbnYsIHN1Ym1hdC5pbnZlcnNlKCkpOworICAgIG1hdC50ZW1wbGF0ZSBibG9jazw0LDQ+KGksaikgPSBzdWJtYXQuaW52ZXJzZSgpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0X2ludiwgKG1hdC50ZW1wbGF0ZSBibG9jazw0LDQ+KGksaikpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcHJlY19pbnZlcnNlXzR4NCgpCit7CisgIENBTExfU1VCVEVTVF8xKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg0Zj4oKSkpOworICBDQUxMX1NVQlRFU1RfMSgoIGludmVyc2VfZ2VuZXJhbF80eDQ8TWF0cml4NGY+KDIwMDAwMCAqIGdfcmVwZWF0KSApKTsKKyAgQ0FMTF9TVUJURVNUXzEoKCBpbnZlcnNlX2dlbmVyYWxfNHg0PE1hdHJpeDxmbG9hdCw0LDQsUm93TWFqb3I+ID4oMjAwMDAwICogZ19yZXBlYXQpICkpOworCisgIENBTExfU1VCVEVTVF8yKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigpKSk7CisgIENBTExfU1VCVEVTVF8yKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxDb2xNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7CisKKyAgQ0FMTF9TVUJURVNUXzMoKGludmVyc2VfcGVybXV0YXRpb25fNHg0PE1hdHJpeDRjZj4oKSkpOworICBDQUxMX1NVQlRFU1RfMygoaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg0Y2Y+KDUwMDAwICogZ19yZXBlYXQpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3QuaCBiL3Rlc3QvcHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjUxMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3QuaApAQCAtMCwwICsxLDIzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK2Jvb2wgYXJlTm90QXBwcm94KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDE+JiBtMSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIG0yLCB0eXBlbmFtZSBEZXJpdmVkMTo6UmVhbFNjYWxhciBlcHNpbG9uID0gTnVtVHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCit7CisgIHJldHVybiAhKChtMS1tMikuY3dpc2VBYnMyKCkubWF4Q29lZmYoKSA8IGVwc2lsb24gKiBlcHNpbG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICogKHN0ZDo6bWF4KShtMS5jd2lzZUFiczIoKS5tYXhDb2VmZigpLCBtMi5jd2lzZUFiczIoKS5tYXhDb2VmZigpKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcHJvZHVjdChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIElkZW50aXR5LmggUHJvZHVjdC5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUm93VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFJvd1NxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBDb2xTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Db2xNYWpvcjpSb3dNYWpvcj4gT3RoZXJNYWpvck1hdHJpeFR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBSb3dTcXVhcmVNYXRyaXhUeXBlCisgICAgICAgICAgICAgaWRlbnRpdHkgPSBSb3dTcXVhcmVNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBSb3dTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyksCisgICAgICAgICAgICAgcmVzID0gUm93U3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBDb2xTcXVhcmVNYXRyaXhUeXBlCisgICAgICAgICAgICAgc3F1YXJlMiA9IENvbFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzKSwKKyAgICAgICAgICAgICByZXMyID0gQ29sU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpOworICBSb3dWZWN0b3JUeXBlIHYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBDb2xWZWN0b3JUeXBlIHZjMiA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShjb2xzKSwgdmNyZXMoY29scyk7CisgIE90aGVyTWFqb3JNYXRyaXhUeXBlIHRtMSA9IG0xOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIEluZGV4IHIgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpLAorICAgICAgICBjMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgLy8gYmVnaW4gdGVzdGluZyBQcm9kdWN0Lmg6IG9ubHkgYXNzb2NpYXRpdml0eSBmb3Igbm93CisgIC8vICh3ZSB1c2UgVHJhbnNwb3NlLmggYnV0IHRoaXMgZG9lc24ndCBjb3VudCBhcyBhIHRlc3QgZm9yIGl0KQorICBWRVJJRllfSVNfQVBQUk9YKChtMSptMS50cmFuc3Bvc2UoKSkqbTIsICBtMSoobTEudHJhbnNwb3NlKCkqbTIpKTsKKyAgbTMgPSBtMTsKKyAgbTMgKj0gbTEudHJhbnNwb3NlKCkgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTEgKiAobTEudHJhbnNwb3NlKCkqbTIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTEgKiAobTEudHJhbnNwb3NlKCkqbTIpKTsKKworICAvLyBjb250aW51ZSB0ZXN0aW5nIFByb2R1Y3QuaDogZGlzdHJpYnV0aXZpdHkKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUqKG0xICsgbTIpLCAgICAgICAgc3F1YXJlKm0xK3NxdWFyZSptMik7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlKihtMSAtIG0yKSwgICAgICAgIHNxdWFyZSptMS1zcXVhcmUqbTIpOworCisgIC8vIGNvbnRpbnVlIHRlc3RpbmcgUHJvZHVjdC5oOiBjb21wYXRpYmlsaXR5IHdpdGggU2NhbGFyTXVsdGlwbGUuaAorICBWRVJJRllfSVNfQVBQUk9YKHMxKihzcXVhcmUqbTEpLCAgICAgICAgICAoczEqc3F1YXJlKSptMSk7CisgIFZFUklGWV9JU19BUFBST1goczEqKHNxdWFyZSptMSksICAgICAgICAgIHNxdWFyZSoobTEqczEpKTsKKworICAvLyB0ZXN0IFByb2R1Y3QuaCB0b2dldGhlciB3aXRoIElkZW50aXR5LmgKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkqdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLnRyYW5zcG9zZSgpLCAgICAgICAgICB2MS50cmFuc3Bvc2UoKSAqIGlkZW50aXR5KTsKKyAgLy8gYWdhaW4sIHRlc3Qgb3BlcmF0b3IoKSB0byBjaGVjayBjb25zdC1xdWFsaWZpY2F0aW9uCisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykocixjKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPihyPT1jKSk7CisKKyAgaWYgKHJvd3MhPWNvbHMpCisgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0zID0gbTEqbTEpOworCisgIC8vIHRlc3QgdGhlIHByZXZpb3VzIHRlc3RzIHdlcmUgbm90IHNjcmV3ZWQgdXAgYmVjYXVzZSBvcGVyYXRvciogcmV0dXJucyAwCisgIC8vICh3ZSB1c2UgdGhlIG1vcmUgYWNjdXJhdGUgZGVmYXVsdCBlcHNpbG9uKQorICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCisgIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KG0xLnRyYW5zcG9zZSgpKm0yLG0yLnRyYW5zcG9zZSgpKm0xKSk7CisgIH0KKworICAvLyB0ZXN0IG9wdGltaXplZCBvcGVyYXRvcis9IHBhdGgKKyAgcmVzID0gc3F1YXJlOworICByZXMubm9hbGlhcygpICs9IG0xICogbTIudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBzcXVhcmUgKyBtMSAqIG0yLnRyYW5zcG9zZSgpKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cyxjb2xzKT4xKQorICB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsc3F1YXJlICsgbTIgKiBtMS50cmFuc3Bvc2UoKSkpOworICB9CisgIHZjcmVzID0gdmMyOworICB2Y3Jlcy5ub2FsaWFzKCkgKz0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Y3JlcywgdmMyICsgbTEudHJhbnNwb3NlKCkgKiB2MSk7CisKKyAgLy8gdGVzdCBvcHRpbWl6ZWQgb3BlcmF0b3ItPSBwYXRoCisgIHJlcyA9IHNxdWFyZTsKKyAgcmVzLm5vYWxpYXMoKSAtPSBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlIC0gKG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cyxjb2xzKT4xKQorICB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsc3F1YXJlIC0gbTIgKiBtMS50cmFuc3Bvc2UoKSkpOworICB9CisgIHZjcmVzID0gdmMyOworICB2Y3Jlcy5ub2FsaWFzKCkgLT0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Y3JlcywgdmMyIC0gbTEudHJhbnNwb3NlKCkgKiB2MSk7CisKKyAgLy8gdGVzdCBkID89IGErYipjIHJ1bGVzCisgIHJlcy5ub2FsaWFzKCkgPSBzcXVhcmUgKyBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlICsgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisgIHJlcy5ub2FsaWFzKCkgKz0gc3F1YXJlICsgbTEgKiBtMi50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIDIqKHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgcmVzLm5vYWxpYXMoKSAtPSBzcXVhcmUgKyBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlICsgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisKKyAgLy8gdGVzdCBkID89IGEtYipjIHJ1bGVzCisgIHJlcy5ub2FsaWFzKCkgPSBzcXVhcmUgLSBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlIC0gbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisgIHJlcy5ub2FsaWFzKCkgKz0gc3F1YXJlIC0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIDIqKHNxdWFyZSAtIG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgcmVzLm5vYWxpYXMoKSAtPSBzcXVhcmUgLSBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlIC0gbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisKKworICB0bTEgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0bTEudHJhbnNwb3NlKCkgKiB2MSwgbTEudHJhbnNwb3NlKCkgKiB2MSk7CisgIFZFUklGWV9JU19BUFBST1godjEudHJhbnNwb3NlKCkgKiB0bTEsIHYxLnRyYW5zcG9zZSgpICogbTEpOworCisgIC8vIHRlc3Qgc3VibWF0cml4IGFuZCBtYXRyaXgvdmVjdG9yIHByb2R1Y3QKKyAgZm9yIChpbnQgaT0wOyBpPHJvd3M7ICsraSkKKyAgICByZXMucm93KGkpID0gbTEucm93KGkpICogbTIudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBtMSAqIG0yLnRyYW5zcG9zZSgpKTsKKyAgLy8gdGhlIG90aGVyIHdheSByb3VuZDoKKyAgZm9yIChpbnQgaT0wOyBpPHJvd3M7ICsraSkKKyAgICByZXMuY29sKGkpID0gbTEgKiBtMi50cmFuc3Bvc2UoKS5jb2woaSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBtMSAqIG0yLnRyYW5zcG9zZSgpKTsKKworICByZXMyID0gc3F1YXJlMjsKKyAgcmVzMi5ub2FsaWFzKCkgKz0gbTEudHJhbnNwb3NlKCkgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLCBzcXVhcmUyICsgbTEudHJhbnNwb3NlKCkgKiBtMik7CisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciAmJiAoc3RkOjptaW4pKHJvd3MsY29scyk+MSkKKyAgeworICAgIFZFUklGWShhcmVOb3RBcHByb3gocmVzMixzcXVhcmUyICsgbTIudHJhbnNwb3NlKCkgKiBtMSkpOworICB9CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMuY29sKHIpLm5vYWxpYXMoKSA9IHNxdWFyZS5hZGpvaW50KCkgKiBzcXVhcmUuY29sKHIpLCAoc3F1YXJlLmFkam9pbnQoKSAqIHNxdWFyZS5jb2wocikpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLmNvbChyKS5ub2FsaWFzKCkgPSBzcXVhcmUgKiBzcXVhcmUuY29sKHIpLCAoc3F1YXJlICogc3F1YXJlLmNvbChyKSkuZXZhbCgpKTsKKworICAvLyB2ZWN0b3IgYXQgcnVudGltZSAoc2VlIGJ1ZyAxMTY2KQorICB7CisgICAgUm93U3F1YXJlTWF0cml4VHlwZSByZWYoc3F1YXJlKTsKKyAgICBDb2xTcXVhcmVNYXRyaXhUeXBlIHJlZjIoc3F1YXJlMik7CisgICAgcmVmID0gcmVzID0gc3F1YXJlOworICAgIFZFUklGWV9JU19BUFBST1gocmVzLmJsb2NrKDAsMCwxLHJvd3MpLm5vYWxpYXMoKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSwgICAgICAgICAgICAocmVmLnJvdygwKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSkpOworICAgIFZFUklGWV9JU19BUFBST1gocmVzLmJsb2NrKDAsMCwxLHJvd3MpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKDAsMCxyb3dzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpLCAocmVmLnJvdygwKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSkpOworICAgIFZFUklGWV9JU19BUFBST1gocmVzLmJsb2NrKDAsMCwxLHJvd3MpLm5vYWxpYXMoKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZSwgICAgICAgICAgICAgICAgICAgICAgICAocmVmLnJvdygwKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZSkpOworICAgIFZFUklGWV9JU19BUFBST1gocmVzLmJsb2NrKDAsMCwxLHJvd3MpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKDAsMCxyb3dzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlLCAgICAgICAgICAgICAocmVmLnJvdygwKSA9IG0xLmNvbCgwKS50cmFuc3Bvc2UoKSAqIHNxdWFyZSkpOworICAgIHJlZjIgPSByZXMyID0gc3F1YXJlMjsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlczIuYmxvY2soMCwwLDEsY29scykubm9hbGlhcygpID0gbTEucm93KDApICogc3F1YXJlMi50cmFuc3Bvc2UoKSwgICAgICAgICAgICAgICAgICAgICAgKHJlZjIucm93KDApID0gbTEucm93KDApICogc3F1YXJlMi50cmFuc3Bvc2UoKSkpOworICAgIFZFUklGWV9JU19BUFBST1gocmVzMi5ibG9jaygwLDAsMSxjb2xzKS5ub2FsaWFzKCkgPSBtMS5ibG9jaygwLDAsMSxjb2xzKSAqIHNxdWFyZTIudHJhbnNwb3NlKCksICAgICAgICAgICAocmVmMi5yb3coMCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyLnRyYW5zcG9zZSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLmJsb2NrKDAsMCwxLGNvbHMpLm5vYWxpYXMoKSA9IG0xLnJvdygwKSAqIHNxdWFyZTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWYyLnJvdygwKSA9IG0xLnJvdygwKSAqIHNxdWFyZTIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlczIuYmxvY2soMCwwLDEsY29scykubm9hbGlhcygpID0gbTEuYmxvY2soMCwwLDEsY29scykgKiBzcXVhcmUyLCAgICAgICAgICAgICAgICAgICAgICAgKHJlZjIucm93KDApID0gbTEucm93KDApICogc3F1YXJlMikpOworICB9CisKKyAgLy8gdmVjdG9yLmJsb2NrKCkgKHNlZSBidWcgMTI4MykKKyAgeworICAgIFJvd1ZlY3RvclR5cGUgdzEocm93cyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUgKiB2MS5ibG9jaygwLDAscm93cywxKSwgc3F1YXJlICogdjEpOworICAgIFZFUklGWV9JU19BUFBST1godzEubm9hbGlhcygpID0gc3F1YXJlICogdjEuYmxvY2soMCwwLHJvd3MsMSksIHNxdWFyZSAqIHYxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcxLmJsb2NrKDAsMCxyb3dzLDEpLm5vYWxpYXMoKSA9IHNxdWFyZSAqIHYxLmJsb2NrKDAsMCxyb3dzLDEpLCBzcXVhcmUgKiB2MSk7CisKKyAgICBNYXRyaXg8U2NhbGFyLDEsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IHcyKGNvbHMpOworICAgIFZFUklGWV9JU19BUFBST1godmMyLmJsb2NrKDAsMCxjb2xzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ub2FsaWFzKCkgPSB2YzIuYmxvY2soMCwwLGNvbHMsMSkudHJhbnNwb3NlKCkgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLmJsb2NrKDAsMCwxLGNvbHMpLm5vYWxpYXMoKSA9IHZjMi5ibG9jaygwLDAsY29scywxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOworCisgICAgdmMyID0gc3F1YXJlMi5ibG9jaygwLDAsMSxjb2xzKS50cmFuc3Bvc2UoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZTIuYmxvY2soMCwwLDEsY29scykgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLm5vYWxpYXMoKSA9IHNxdWFyZTIuYmxvY2soMCwwLDEsY29scykgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLmJsb2NrKDAsMCwxLGNvbHMpLm5vYWxpYXMoKSA9IHNxdWFyZTIuYmxvY2soMCwwLDEsY29scykgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKworICAgIHZjMiA9IHNxdWFyZTIuYmxvY2soMCwwLGNvbHMsMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUyLmJsb2NrKDAsMCxjb2xzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsMCxjb2xzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ibG9jaygwLDAsMSxjb2xzKS5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsMCxjb2xzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgIH0KKworICAvLyBpbm5lciBwcm9kdWN0CisgIHsKKyAgICBTY2FsYXIgeCA9IHNxdWFyZTIucm93KGMpICogc3F1YXJlMi5jb2woYzIpOworICAgIFZFUklGWV9JU19BUFBST1goeCwgc3F1YXJlMi5yb3coYykudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KHNxdWFyZTIuY29sKGMyKSkuc3VtKCkpOworICB9CisKKyAgLy8gb3V0ZXIgcHJvZHVjdAorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYykgKiBtMS5yb3cociksIG0xLmJsb2NrKDAsYyxyb3dzLDEpICogbTEuYmxvY2sociwwLDEsY29scykpOworICAgIFZFUklGWV9JU19BUFBST1gobTEucm93KHIpLnRyYW5zcG9zZSgpICogbTEuY29sKGMpLnRyYW5zcG9zZSgpLCBtMS5ibG9jayhyLDAsMSxjb2xzKS50cmFuc3Bvc2UoKSAqIG0xLmJsb2NrKDAsYyxyb3dzLDEpLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKDAsYyxyb3dzLDEpICogbTEucm93KHIpLCBtMS5ibG9jaygwLGMscm93cywxKSAqIG0xLmJsb2NrKHIsMCwxLGNvbHMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjKSAqIG0xLmJsb2NrKHIsMCwxLGNvbHMpLCBtMS5ibG9jaygwLGMscm93cywxKSAqIG0xLmJsb2NrKHIsMCwxLGNvbHMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmxlZnRDb2xzKDEpICogbTEucm93KHIpLCBtMS5ibG9jaygwLDAscm93cywxKSAqIG0xLmJsb2NrKHIsMCwxLGNvbHMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjKSAqIG0xLnRvcFJvd3MoMSksIG0xLmJsb2NrKDAsYyxyb3dzLDEpICogbTEuYmxvY2soMCwwLDEsY29scykpOworICB9CisKKyAgLy8gQWxpYXNpbmcKKyAgeworICAgIENvbFZlY3RvclR5cGUgeChjb2xzKTsgeC5zZXRSYW5kb20oKTsKKyAgICBDb2xWZWN0b3JUeXBlIHooeCk7CisgICAgQ29sVmVjdG9yVHlwZSB5KGNvbHMpOyB5LnNldFplcm8oKTsKKyAgICBDb2xTcXVhcmVNYXRyaXhUeXBlIEEoY29scyxjb2xzKTsgQS5zZXRSYW5kb20oKTsKKyAgICAvLyBDd2lzZUJpbmFyeU9wCisgICAgVkVSSUZZX0lTX0FQUFJPWCh4ID0geSArIEEqeCwgQSp6KTsKKyAgICB4ID0gejsKKyAgICAvLyBDd2lzZVVuYXJ5T3AKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBTY2FsYXIoMS4pKihBKngpLCBBKnopOworICB9CisKKyAgLy8gcmVncmVzc2lvbiBmb3IgYmxhc190cmFpcworICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUgKiAoc3F1YXJlKnNxdWFyZSkudHJhbnNwb3NlKCksIHNxdWFyZSAqIHNxdWFyZS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUgKiAoLShzcXVhcmUqc3F1YXJlKSksIC1zcXVhcmUgKiBzcXVhcmUgKiBzcXVhcmUpOworICAgIFZFUklGWV9JU19BUFBST1goc3F1YXJlICogKHMxKihzcXVhcmUqc3F1YXJlKSksIHMxICogc3F1YXJlICogc3F1YXJlICogc3F1YXJlKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSAqIChzcXVhcmUqc3F1YXJlKS5jb25qdWdhdGUoKSwgc3F1YXJlICogc3F1YXJlLmNvbmp1Z2F0ZSgpICogc3F1YXJlLmNvbmp1Z2F0ZSgpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfZXh0cmEuY3BwIGIvdGVzdC9wcm9kdWN0X2V4dHJhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmI4NTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X2V4dHJhLmNwcApAQCAtMCwwICsxLDM3NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcHJvZHVjdF9leHRyYShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgRHluYW1pYz4gUm93VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQ+IE90aGVyTWFqb3JNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIGlkZW50aXR5ID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgIHJlcyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUyID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpLAorICAgICAgICAgICAgIHJlczIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyk7CisgIFJvd1ZlY3RvclR5cGUgdjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHZycmVzKHJvd3MpOworICBDb2xWZWN0b3JUeXBlIHZjMiA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShjb2xzKSwgdmNyZXMoY29scyk7CisgIE90aGVyTWFqb3JNYXRyaXhUeXBlIHRtMSA9IG0xOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSBtMSAqIG0yLmFkam9pbnQoKSwgICAgICAgICAgICAgICAgIG0xICogbTIuYWRqb2ludCgpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gbTEuYWRqb2ludCgpICogc3F1YXJlLmFkam9pbnQoKSwgICBtMS5hZGpvaW50KCkuZXZhbCgpICogc3F1YXJlLmFkam9pbnQoKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IG0xLmFkam9pbnQoKSAqIG0yLCAgICAgICAgICAgICAgICAgbTEuYWRqb2ludCgpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpICogbTIsICAgICAgICAgIChzMSAqIG0xLmFkam9pbnQoKSkuZXZhbCgpICogbTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9ICgoczEgKiBtMSkuYWRqb2ludCgpKSAqIG0yLCAgICAgICAgKG51bWV4dDo6Y29uaihzMSkgKiBtMS5hZGpvaW50KCkpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoLSBtMS5hZGpvaW50KCkgKiBzMSkgKiAoczMgKiBtMiksICgtIG0xLmFkam9pbnQoKSAgKiBzMSkuZXZhbCgpICogKHMzICogbTIpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKHMyICogbTEuYWRqb2ludCgpICogczEpICogbTIsICAgICAoczIgKiBtMS5hZGpvaW50KCkgICogczEpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoLW0xKnMyKSAqIHMxKm0yLmFkam9pbnQoKSwgICAgICAgICgtbTEqczIpLmV2YWwoKSAqIChzMSptMi5hZGpvaW50KCkpLmV2YWwoKSk7CisKKyAgLy8gYSB2ZXJ5IHRyaWNreSBjYXNlIHdoZXJlIGEgc2NhbGUgZmFjdG9yIGhhcyB0byBiZSBhdXRvbWF0aWNhbGx5IGNvbmp1Z2F0ZWQ6CisgIFZFUklGWV9JU19BUFBST1goIG0xLmFkam9pbnQoKSAqIChzMSptMikuY29uanVnYXRlKCksIChtMS5hZGpvaW50KCkpLmV2YWwoKSAqICgoczEqbTIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCkpOworCisKKyAgLy8gdGVzdCBhbGwgcG9zc2libGUgY29uanVnYXRlIGNvbWJpbmF0aW9ucyBmb3IgdGhlIGZvdXIgbWF0cml4LXZlY3RvciBwcm9kdWN0IGNhc2VzOgorCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5jb25qdWdhdGUoKSAqIHMyKSAqIChzMSAqIHZjMiksCisgICAgICAgICAgICAgICAgICAgKC1tMS5jb25qdWdhdGUoKSpzMikuZXZhbCgpICogKHMxICogdmMyKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEgKiBzMikgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEqczIpLmV2YWwoKSAqIChzMSAqIHZjMi5jb25qdWdhdGUoKSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmNvbmp1Z2F0ZSgpICogczIpICogKHMxICogdmMyLmNvbmp1Z2F0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLmV2YWwoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIudHJhbnNwb3NlKCkpICogKC1tMS5hZGpvaW50KCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLnRyYW5zcG9zZSgpKS5ldmFsKCkgKiAoLW0xLmFkam9pbnQoKSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIuYWRqb2ludCgpKSAqICgtbTEudHJhbnNwb3NlKCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLmFkam9pbnQoKSkuZXZhbCgpICogKC1tMS50cmFuc3Bvc2UoKSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIuYWRqb2ludCgpKSAqICgtbTEuYWRqb2ludCgpICogczIpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHZjMi5hZGpvaW50KCkpLmV2YWwoKSAqICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5hZGpvaW50KCkgKiBzMikgKiAoczEgKiB2MS50cmFuc3Bvc2UoKSksCisgICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLnRyYW5zcG9zZSgpKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEudHJhbnNwb3NlKCkgKiBzMikgKiAoczEgKiB2MS5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEudHJhbnNwb3NlKCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLmFkam9pbnQoKSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmFkam9pbnQoKSAqIHMyKSAqIChzMSAqIHYxLmFkam9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLmFkam9pbnQoKSkuZXZhbCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIHYxKSAqICgtbTEuY29uanVnYXRlKCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdjEpLmV2YWwoKSAqICgtbTEuY29uanVnYXRlKCkqczIpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxICogdjEuY29uanVnYXRlKCkpICogKC1tMSAqIHMyKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiB2MS5jb25qdWdhdGUoKSkuZXZhbCgpICogKC1tMSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2MS5jb25qdWdhdGUoKSkgKiAoLW0xLmNvbmp1Z2F0ZSgpICogczIpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHYxLmNvbmp1Z2F0ZSgpKS5ldmFsKCkgKiAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5hZGpvaW50KCkgKiBzMikgKiAoczEgKiB2MS5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CisKKyAgLy8gdGVzdCB0aGUgdmVjdG9yLW1hdHJpeCBwcm9kdWN0IHdpdGggbm9uIGFsaWduZWQgc3RhcnRzCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0yKTsKKyAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTEuY29scygpLTIpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxtMS5yb3dzKCktaSk7CisgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG0xLmNvbHMoKS1qKTsKKyAgSW5kZXggaTIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0xKTsKKyAgSW5kZXggajIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLmNvbHMoKS0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChqMikuYWRqb2ludCgpICogbTEuYmxvY2soMCxqLG0xLnJvd3MoKSxjKSwgbTEuY29sKGoyKS5hZGpvaW50KCkuZXZhbCgpICogbTEuYmxvY2soMCxqLG0xLnJvd3MoKSxjKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKGksMCxyLG0xLmNvbHMoKSkgKiBtMS5yb3coaTIpLmFkam9pbnQoKSwgbTEuYmxvY2soaSwwLHIsbTEuY29scygpKS5ldmFsKCkgKiBtMS5yb3coaTIpLmFkam9pbnQoKS5ldmFsKCkpOworICAKKyAgLy8gcmVncmVzc2lvbiB0ZXN0CisgIE1hdHJpeFR5cGUgdG1wID0gbTEgKiBtMS5hZGpvaW50KCkgKiBzMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0bXAsIG0xICogbTEuYWRqb2ludCgpICogczEpOworCisgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDEzNDMsIGFzc2lnbm1lbnQgdG8gYXJyYXlzCisgIEFycmF5PFNjYWxhcixEeW5hbWljLDE+IGExID0gbTEgKiB2YzI7CisgIFZFUklGWV9JU19BUFBST1goYTEubWF0cml4KCksbTEqdmMyKTsKKyAgQXJyYXk8U2NhbGFyLER5bmFtaWMsMT4gYTIgPSBzMSAqIChtMSAqIHZjMik7CisgIFZFUklGWV9JU19BUFBST1goYTIubWF0cml4KCksczEqbTEqdmMyKTsKKyAgQXJyYXk8U2NhbGFyLDEsRHluYW1pYz4gYTMgPSB2MSAqIG0xOworICBWRVJJRllfSVNfQVBQUk9YKGEzLm1hdHJpeCgpLHYxKm0xKTsKKyAgQXJyYXk8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gYTQgPSBtMSAqIG0yLmFkam9pbnQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhNC5tYXRyaXgoKSxtMSptMi5hZGpvaW50KCkpOworfQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyByZXBvcnRlZCBhdCBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD05Njk0Nwordm9pZCBtYXRfbWF0X3NjYWxhcl9zY2FsYXJfcHJvZHVjdCgpCit7CisgIEVpZ2VuOjpNYXRyaXgyWGQgZE5keHkoMiwgMyk7CisgIGROZHh5IDw8IC0wLjUsIDAuNSwgMCwKKyAgICAgICAgICAgLTAuMywgMCwgMC4zOworICBkb3VibGUgZGV0ID0gNi4wLCB3dCA9IDAuNTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkTmR4eS50cmFuc3Bvc2UoKSpkTmR4eSpkZXQqd3QsIGRldCp3dCpkTmR4eS50cmFuc3Bvc2UoKSpkTmR4eSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPiAKK3ZvaWQgemVyb19zaXplZF9vYmplY3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKKyAgY29uc3QgaW50IFBhY2tldFNpemUxID0gUGFja2V0U2l6ZT4xID8gIFBhY2tldFNpemUtMSA6IDE7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworICAKKyAgeworICAgIE1hdHJpeFR5cGUgcmVzLCBhKHJvd3MsMCksIGIoMCxjb2xzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEqYiksIE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKSApOworICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9YSphLnRyYW5zcG9zZSgpKSwgTWF0cml4VHlwZTo6WmVybyhyb3dzLHJvd3MpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1iLnRyYW5zcG9zZSgpKmIpLCBNYXRyaXhUeXBlOjpaZXJvKGNvbHMsY29scykgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWIudHJhbnNwb3NlKCkqYS50cmFuc3Bvc2UoKSksIE1hdHJpeFR5cGU6Olplcm8oY29scyxyb3dzKSApOworICB9CisgIAorICB7CisgICAgTWF0cml4VHlwZSByZXMsIGEocm93cyxjb2xzKSwgYihjb2xzLDApOworICAgIHJlcyA9IGEqYjsKKyAgICBWRVJJRlkocmVzLnJvd3MoKT09cm93cyAmJiByZXMuY29scygpPT0wKTsKKyAgICBiLnJlc2l6ZSgwLHJvd3MpOworICAgIHJlcyA9IGIqYTsKKyAgICBWRVJJRlkocmVzLnJvd3MoKT09MCAmJiByZXMuY29scygpPT1jb2xzKTsKKyAgfQorICAKKyAgeworICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwwPiBhOworICAgIE1hdHJpeDxTY2FsYXIsMCwxPiBiOworICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwxPiByZXM7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hKmIpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUsMSkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEubGF6eVByb2R1Y3QoYikpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUsMSkgKTsKKyAgfQorICAKKyAgeworICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZTEsMD4gYTsKKyAgICBNYXRyaXg8U2NhbGFyLDAsMT4gYjsKKyAgICBNYXRyaXg8U2NhbGFyLFBhY2tldFNpemUxLDE+IHJlczsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEqYiksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZTEsMSkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEubGF6eVByb2R1Y3QoYikpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUxLDEpICk7CisgIH0KKyAgCisgIHsKKyAgICBNYXRyaXg8U2NhbGFyLFBhY2tldFNpemUsRHluYW1pYz4gYShQYWNrZXRTaXplLDApOworICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBiKDAsMSk7CisgICAgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLDE+IHJlczsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEqYiksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZSwxKSApOworICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9YS5sYXp5UHJvZHVjdChiKSksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZSwxKSApOworICB9CisgIAorICB7CisgICAgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplMSxEeW5hbWljPiBhKFBhY2tldFNpemUxLDApOworICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBiKDAsMSk7CisgICAgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplMSwxPiByZXM7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hKmIpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUxLDEpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hLmxhenlQcm9kdWN0KGIpKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplMSwxKSApOworICB9Cit9CisKK3RlbXBsYXRlPGludD4KK3ZvaWQgYnVnXzEyNygpCit7CisgIC8vIEJ1ZyAxMjcKKyAgLy8KKyAgLy8gYSBwcm9kdWN0IG9mIHRoZSBmb3JtIGxocypyaHMgd2l0aAorICAvLworICAvLyBsaHM6CisgIC8vIHJvd3MgPSAxLCBjb2xzID0gNAorICAvLyBSb3dzQXRDb21waWxlVGltZSA9IDEsIENvbHNBdENvbXBpbGVUaW1lID0gLTEKKyAgLy8gTWF4Um93c0F0Q29tcGlsZVRpbWUgPSAxLCBNYXhDb2xzQXRDb21waWxlVGltZSA9IDUKKyAgLy8KKyAgLy8gcmhzOgorICAvLyByb3dzID0gNCwgY29scyA9IDAKKyAgLy8gUm93c0F0Q29tcGlsZVRpbWUgPSAtMSwgQ29sc0F0Q29tcGlsZVRpbWUgPSAtMQorICAvLyBNYXhSb3dzQXRDb21waWxlVGltZSA9IDUsIE1heENvbHNBdENvbXBpbGVUaW1lID0gMQorICAvLworICAvLyB3YXMgZmFpbGluZyBvbiBhIHJ1bnRpbWUgYXNzZXJ0aW9uLCBiZWNhdXNlIGl0IGhhZCBiZWVuIG1pcy1jb21waWxlZCBhcyBhIGRvdCBwcm9kdWN0IGJlY2F1c2UgUHJvZHVjdC5oIHdhcyB1c2luZyB0aGUKKyAgLy8gbWF4LXNpemVzIHRvIGRldGVjdCBzaXplIDEgaW5kaWNhdGluZyB2ZWN0b3JzLCBhbmQgdGhhdCBkaWRuJ3QgYWNjb3VudCBmb3IgMC1zaXplZCBvYmplY3Qgd2l0aCBtYXgtc2l6ZSAxLgorCisgIE1hdHJpeDxmbG9hdCwxLER5bmFtaWMsUm93TWFqb3IsMSw1PiBhKDEsNCk7CisgIE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3IsNSwxPiBiKDQsMCk7CisgIGEqYjsKK30KKwordGVtcGxhdGU8aW50PiB2b2lkIGJ1Z184MTcoKQoreworICBBcnJheVhYZiBCID0gQXJyYXlYWGY6OlJhbmRvbSgxMCwxMCksIEM7CisgIFZlY3RvclhmIHggPSBWZWN0b3JYZjo6UmFuZG9tKDEwKTsKKyAgQyA9ICh4LnRyYW5zcG9zZSgpKkIubWF0cml4KCkpOworICBCID0gKHgudHJhbnNwb3NlKCkqQi5tYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goQixDKTsKK30KKwordGVtcGxhdGU8aW50Pgordm9pZCB1bmFsaWduZWRfb2JqZWN0cygpCit7CisgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIGJ1ZyByZXBvcnRlZCBoZXJlOgorICAvLyBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD0xMDc1NDEKKyAgLy8gUmVjYWxsIHRoZSBtYXRyaXgqdmVjdG9yIGtlcm5lbCBhdm9pZCB1bmFsaWduZWQgbG9hZHMgYnkgbG9hZGluZyB0d28gcGFja2V0cyBhbmQgdGhlbiByZWFzc2VtYmxlIHRoZW4uCisgIC8vIFRoZXJlIHdhcyBhIG1pc3Rha2UgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSB2YWxpZCByYW5nZSBmb3IgZnVsbHkgdW5hbGlnbmVkIG9iamVjdHM6IGluIHNvbWUgcmFyZSBjYXNlcywKKyAgLy8gbWVtb3J5IHdhcyByZWFkIG91dHNpZGUgdGhlIGFsbG9jYXRlZCBtYXRyaXggbWVtb3J5LiBUaG91Z2ggdGhlIHZhbHVlcyB3ZXJlIG5vdCB1c2VkLCB0aGlzIG1pZ2h0IHJhaXNlIHNlZ2ZhdWx0LgorICBmb3IoaW50IG09NDUwO208NDYwOysrbSkKKyAgeworICAgIGZvcihpbnQgbj04O248MTI7KytuKQorICAgIHsKKyAgICAgIE1hdHJpeFhmIE0obSwgbik7CisgICAgICBWZWN0b3JYZiB2MShuKSwgcjEoNTAwKTsKKyAgICAgIFJvd1ZlY3RvclhmIHYyKG0pLCByMigxNik7CisKKyAgICAgIE0uc2V0UmFuZG9tKCk7CisgICAgICB2MS5zZXRSYW5kb20oKTsKKyAgICAgIHYyLnNldFJhbmRvbSgpOworICAgICAgZm9yKGludCBvPTA7IG88NDsgKytvKQorICAgICAgeworICAgICAgICByMS5zZWdtZW50KG8sbSkubm9hbGlhcygpID0gTSAqIHYxOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHIxLnNlZ21lbnQobyxtKSwgTSAqIE1hdHJpeFhmKHYxKSk7CisgICAgICAgIHIyLnNlZ21lbnQobyxuKS5ub2FsaWFzKCkgPSB2MiAqIE07CisgICAgICAgIFZFUklGWV9JU19BUFBST1gocjIuc2VnbWVudChvLG4pLCBNYXRyaXhYZih2MikgKiBNKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FCitJbmRleCB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZShJbmRleCBtLCBJbmRleCBuLCBJbmRleCBrKQoreworICBJbmRleCBtYyhtKSwgbmMobiksIGtjKGspOworICBpbnRlcm5hbDo6Y29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPFQsVD4oa2MsIG1jLCBuYyk7CisgIHJldHVybiBrYyttYytuYzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0luZGV4IGNvbXB1dGVfYmxvY2tfc2l6ZSgpCit7CisgIEluZGV4IHJldCA9IDA7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDEsMSk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDAsMSk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDEsMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDAsMSk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDEsMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDAsMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDAsMCk7CisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lPgordm9pZCBhbGlhc2luZ193aXRoX3Jlc2l6ZSgpCit7CisgIEluZGV4IG0gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxMCw1MCk7CisgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxMCw1MCk7CisgIE1hdHJpeFhkIEEsIEIsIEMobSxuKSwgRChtLG0pOworICBWZWN0b3JYZCBhLCBiLCBjKG4pOworICBDLnNldFJhbmRvbSgpOworICBELnNldFJhbmRvbSgpOworICBjLnNldFJhbmRvbSgpOworICBkb3VibGUgcyA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigxLDEwKTsKKworICBBID0gQzsKKyAgQiA9IEEgKiBBLnRyYW5zcG9zZSgpOworICBBID0gQSAqIEEudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1goQSxCKTsKKworICBBID0gQzsKKyAgQiA9IChBICogQS50cmFuc3Bvc2UoKSkvczsKKyAgQSA9IChBICogQS50cmFuc3Bvc2UoKSkvczsKKyAgVkVSSUZZX0lTX0FQUFJPWChBLEIpOworCisgIEEgPSBDOworICBCID0gKEEgKiBBLnRyYW5zcG9zZSgpKSArIEQ7CisgIEEgPSAoQSAqIEEudHJhbnNwb3NlKCkpICsgRDsKKyAgVkVSSUZZX0lTX0FQUFJPWChBLEIpOworCisgIEEgPSBDOworICBCID0gRCArIChBICogQS50cmFuc3Bvc2UoKSk7CisgIEEgPSBEICsgKEEgKiBBLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBLEIpOworCisgIEEgPSBDOworICBCID0gcyAqIChBICogQS50cmFuc3Bvc2UoKSk7CisgIEEgPSBzICogKEEgKiBBLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBLEIpOworCisgIEEgPSBDOworICBhID0gYzsKKyAgYiA9IChBICogYSkvczsKKyAgYSA9IChBICogYSkvczsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLGIpOworfQorCit0ZW1wbGF0ZTxpbnQ+Cit2b2lkIGJ1Z18xMzA4KCkKK3sKKyAgaW50IG4gPSAxMDsKKyAgTWF0cml4WGQgcihuLG4pOworICBWZWN0b3JYZCB2ID0gVmVjdG9yWGQ6OlJhbmRvbShuKTsKKyAgciA9IHYgKiBSb3dWZWN0b3JYZDo6T25lcyhuKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyLCB2LnJvd3dpc2UoKS5yZXBsaWNhdGUobikpOworICByID0gVmVjdG9yWGQ6Ok9uZXMobikgKiB2LnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHIsIHYucm93d2lzZSgpLnJlcGxpY2F0ZShuKS50cmFuc3Bvc2UoKSk7CisKKyAgTWF0cml4NGQgb25lczQ0ID0gTWF0cml4NGQ6Ok9uZXMoKTsKKyAgTWF0cml4NGQgbTQ0ID0gTWF0cml4NGQ6Ok9uZXMoKSAqIE1hdHJpeDRkOjpPbmVzKCk7CisgIFZFUklGWV9JU19BUFBST1gobTQ0LE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gobTQ0Lm5vYWxpYXMoKT1vbmVzNDQqTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNDQubm9hbGlhcygpPW9uZXM0NC50cmFuc3Bvc2UoKSpNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCk9TWF0cml4NGQ6Ok9uZXMoKSpvbmVzNDQsIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gobTQ0Lm5vYWxpYXMoKT1NYXRyaXg0ZDo6T25lcygpKm9uZXM0NC50cmFuc3Bvc2UoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsNCw0LFJvd01ham9yPiBSTWF0cml4NGQ7CisgIFJNYXRyaXg0ZCByNDQgPSBNYXRyaXg0ZDo6T25lcygpICogTWF0cml4NGQ6Ok9uZXMoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQsTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPW9uZXM0NCpNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9b25lczQ0LnRyYW5zcG9zZSgpKk1hdHJpeDRkOjpPbmVzKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKT1NYXRyaXg0ZDo6T25lcygpKm9uZXM0NCwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPU1hdHJpeDRkOjpPbmVzKCkqb25lczQ0LnRyYW5zcG9zZSgpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9b25lczQ0KlJNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9b25lczQ0LnRyYW5zcG9zZSgpKlJNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9Uk1hdHJpeDRkOjpPbmVzKCkqb25lczQ0LCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9Uk1hdHJpeDRkOjpPbmVzKCkqb25lczQ0LnRyYW5zcG9zZSgpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworCisvLyAgIFJvd1ZlY3RvcjRkIHI0OworICBtNDQuc2V0T25lcygpOworICByNDQuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCkgKz0gbTQ0LnJvdygwKS50cmFuc3Bvc2UoKSAqIFJvd1ZlY3RvcjRkOjpPbmVzKCksIG9uZXM0NCk7CisgIHI0NC5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSArPSBtNDQuY29sKDApICogUm93VmVjdG9yNGQ6Ok9uZXMoKSwgb25lczQ0KTsKKyAgcjQ0LnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpICs9IFZlY3RvcjRkOjpPbmVzKCkgKiBtNDQucm93KDApLCBvbmVzNDQpOworICByNDQuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCkgKz0gVmVjdG9yNGQ6Ok9uZXMoKSAqIG00NC5jb2woMCkudHJhbnNwb3NlKCksIG9uZXM0NCk7Cit9CisKK3ZvaWQgdGVzdF9wcm9kdWN0X2V4dHJhKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcHJvZHVjdF9leHRyYShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0X2V4dHJhKE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdF9tYXRfc2NhbGFyX3NjYWxhcl9wcm9kdWN0KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdF9leHRyYShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHByb2R1Y3RfZXh0cmEoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApOworICAgIENBTExfU1VCVEVTVF8xKCB6ZXJvX3NpemVkX29iamVjdHMoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorICBDQUxMX1NVQlRFU1RfNSggYnVnXzEyNzwwPigpICk7CisgIENBTExfU1VCVEVTVF81KCBidWdfODE3PDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzUoIGJ1Z18xMzA4PDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzYoIHVuYWxpZ25lZF9vYmplY3RzPDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzcoIGNvbXB1dGVfYmxvY2tfc2l6ZTxmbG9hdD4oKSApOworICBDQUxMX1NVQlRFU1RfNyggY29tcHV0ZV9ibG9ja19zaXplPGRvdWJsZT4oKSApOworICBDQUxMX1NVQlRFU1RfNyggY29tcHV0ZV9ibG9ja19zaXplPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSApOworICBDQUxMX1NVQlRFU1RfOCggYWxpYXNpbmdfd2l0aF9yZXNpemU8dm9pZD4oKSApOworCit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfbGFyZ2UuY3BwIGIvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDVjZDQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJwcm9kdWN0LmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfYWxpYXNpbmcoKQoreworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7CisgIHR5cGVkZWYgTWF0cml4PFQsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxULER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgVmVjdG9yVHlwZSB4KGNvbHMpOyB4LnNldFJhbmRvbSgpOworICBWZWN0b3JUeXBlIHooeCk7CisgIFZlY3RvclR5cGUgeShyb3dzKTsgeS5zZXRaZXJvKCk7CisgIE1hdHJpeFR5cGUgQShyb3dzLGNvbHMpOyBBLnNldFJhbmRvbSgpOworICAvLyBDd2lzZUJpbmFyeU9wCisgIFZFUklGWV9JU19BUFBST1goeCA9IHkgKyBBKngsIEEqeik7ICAgICAvLyBPSyBiZWNhdXNlICJ5ICsgQSp4IiBpcyBtYXJrZWQgYXMgImFzc3VtZS1hbGlhc2luZyIKKyAgeCA9IHo7CisgIC8vIEN3aXNlVW5hcnlPcAorICBWRVJJRllfSVNfQVBQUk9YKHggPSBUKDEuKSooQSp4KSwgQSp6KTsgLy8gT0sgYmVjYXVzZSAxKihBKngpIGlzIHJlcGxhY2VkIGJ5ICgxKkEqeCkgd2hpY2ggaXMgYSBQcm9kdWN0PD4gZXhwcmVzc2lvbgorICB4ID0gejsKKyAgLy8gVkVSSUZZX0lTX0FQUFJPWCh4ID0geS1BKngsIC1BKnopOyAgIC8vIE5vdCBPSyBpbiAzLjMgYmVjYXVzZSB4IGlzIHJlc2l6ZWQgYmVmb3JlIEEqeCBnZXRzIGV2YWx1YXRlZAorICB4ID0gejsKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3RfbGFyZ2UoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0KE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3QoTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcHJvZHVjdChNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzEoIHRlc3RfYWxpYXNpbmc8ZmxvYXQ+KCkgKTsKKyAgfQorCisjaWYgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNgorICB7CisgICAgLy8gdGVzdCBhIHNwZWNpZmljIGlzc3VlIGluIERpYWdvbmFsUHJvZHVjdAorICAgIGludCBOID0gMTAwMDAwMDsKKyAgICBWZWN0b3JYZiB2ID0gVmVjdG9yWGY6Ok9uZXMoTik7CisgICAgTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpPbmVzKE4sMyk7CisgICAgbSA9ICh2K3YpLmFzRGlhZ29uYWwoKSAqIG07CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBNYXRyaXhYZjo6Q29uc3RhbnQoTiwzLDIpKTsKKyAgfQorCisgIHsKKyAgICAvLyB0ZXN0IGRlZmVycmVkIHJlc2l6aW5nIGluIE1hdHJpeDo6b3BlcmF0b3I9CisgICAgTWF0cml4WGYgYSA9IE1hdHJpeFhmOjpSYW5kb20oMTAsNCksIGIgPSBNYXRyaXhYZjo6UmFuZG9tKDQsMTApLCBjID0gYTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChhID0gYSAqIGIpLCAoYyAqIGIpLmV2YWwoKSk7CisgIH0KKworICB7CisgICAgLy8gY2hlY2sgdGhlIGZ1bmN0aW9ucyB0byBzZXR1cCBibG9ja2luZyBzaXplcyBjb21waWxlIGFuZCBkbyBub3Qgc2VnZmF1bHQKKyAgICAvLyBGSVhNRSBjaGVjayB0aGV5IGRvIHdoYXQgdGhleSBhcmUgc3VwcG9zZWQgdG8gZG8gISEKKyAgICBzdGQ6OnB0cmRpZmZfdCBsMSA9IGludGVybmFsOjpyYW5kb208aW50PigxMDAwMCwyMDAwMCk7CisgICAgc3RkOjpwdHJkaWZmX3QgbDIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAwMDAwLDIwMDAwMCk7CisgICAgc3RkOjpwdHJkaWZmX3QgbDMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAwMDAwMCwyMDAwMDAwKTsKKyAgICBzZXRDcHVDYWNoZVNpemVzKGwxLGwyLGwzKTsKKyAgICBWRVJJRlkobDE9PWwxQ2FjaGVTaXplKCkpOworICAgIFZFUklGWShsMj09bDJDYWNoZVNpemUoKSk7CisgICAgc3RkOjpwdHJkaWZmX3QgazEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMTAwKSoxNjsKKyAgICBzdGQ6OnB0cmRpZmZfdCBtMSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCwxMDApKjE2OworICAgIHN0ZDo6cHRyZGlmZl90IG4xID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDEwMCkqMTY7CisgICAgLy8gb25seSBtYWtlcyBzdXJlIGl0IGNvbXBpbGVzIGZpbmUKKyAgICBpbnRlcm5hbDo6Y29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPGZsb2F0LGZsb2F0LHN0ZDo6cHRyZGlmZl90PihrMSxtMSxuMSwxKTsKKyAgfQorCisgIHsKKyAgICAvLyB0ZXN0IHJlZ3Jlc3Npb24gaW4gcm93LXZlY3RvciBieSBtYXRyaXggKGJhZCBNYXAgdHlwZSkKKyAgICBNYXRyaXhYZiBtYXQxKDEwLDMyKTsgbWF0MS5zZXRSYW5kb20oKTsKKyAgICBNYXRyaXhYZiBtYXQyKDMyLDMyKTsgbWF0Mi5zZXRSYW5kb20oKTsKKyAgICBNYXRyaXhYZiByMSA9IG1hdDEucm93KDIpKm1hdDIudHJhbnNwb3NlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyMSwgKG1hdDEucm93KDIpKm1hdDIudHJhbnNwb3NlKCkpLmV2YWwoKSk7CisKKyAgICBNYXRyaXhYZiByMiA9IG1hdDEucm93KDIpKm1hdDI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyMiwgKG1hdDEucm93KDIpKm1hdDIpLmV2YWwoKSk7CisgIH0KKworICB7CisgICAgRWlnZW46Ok1hdHJpeFhkIEEoMTAsMTApLCBCLCBDOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgQyA9IEE7CisgICAgZm9yKGludCBrPTA7IGs8Nzk7ICsraykKKyAgICAgIEMgPSBDICogQTsKKyAgICBCLm5vYWxpYXMoKSA9ICgoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkgKiAoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkpCisgICAgICAgICAgICAgICAgKiAoKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpICogKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEIsQyk7CisgIH0KKyNlbmRpZgorCisgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDcxNDoKKyNpZiBkZWZpbmVkIEVJR0VOX0hBU19PUEVOTVAKKyAgb21wX3NldF9keW5hbWljKDEpOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF82KCBwcm9kdWN0KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X21tdHIuY3BwIGIvdGVzdC9wcm9kdWN0X21tdHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTI0YjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3RfbW10ci5jcHAKQEAgLTAsMCArMSw5NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNyBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgQ0hFQ0tfTU1UUihERVNULCBUUkksIE9QKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYzID0gREVTVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYyID0gcmVmMSA9IERFU1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERVNULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFRSST4oKSBPUDsgICAgICAgICAgIFwKKyAgICByZWYxIE9QOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFRSST4oKSAgICAgICAgICAgICAgIFwKKyAgICAgID0gcmVmMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCk7ICAgICAgICAgIFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKERFU1QscmVmMik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgREVTVCA9IHJlZjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMyA9IHJlZjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMy5kaWFnb25hbCgpID0gREVTVC5kaWFnb25hbCgpOyAgICAgICAgICAgICAgICBcCisgICAgREVTVC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkl8WmVyb0RpYWc+KCkgT1A7ICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChERVNULHJlZjMpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1tdHIoaW50IHNpemUpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IE1hdHJpeENvbE1hajsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4gTWF0cml4Um93TWFqOworCisgIERlbnNlSW5kZXggb3RoZXJzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxEZW5zZUluZGV4PigxLDIwMCk7CisgIAorICBNYXRyaXhDb2xNYWogbWF0YyA9IE1hdHJpeENvbE1hajo6WmVybyhzaXplLCBzaXplKTsKKyAgTWF0cml4Um93TWFqIG1hdHIgPSBNYXRyaXhSb3dNYWo6Olplcm8oc2l6ZSwgc2l6ZSk7CisgIE1hdHJpeENvbE1haiByZWYxKHNpemUsIHNpemUpLCByZWYyKHNpemUsIHNpemUpLCByZWYzKHNpemUsc2l6ZSk7CisgIAorICBNYXRyaXhDb2xNYWogc29jKHNpemUsb3RoZXJzaXplKTsgc29jLnNldFJhbmRvbSgpOworICBNYXRyaXhDb2xNYWogb3NjKG90aGVyc2l6ZSxzaXplKTsgb3NjLnNldFJhbmRvbSgpOworICBNYXRyaXhSb3dNYWogc29yKHNpemUsb3RoZXJzaXplKTsgc29yLnNldFJhbmRvbSgpOworICBNYXRyaXhSb3dNYWogb3NyKG90aGVyc2l6ZSxzaXplKTsgb3NyLnNldFJhbmRvbSgpOworICBNYXRyaXhDb2xNYWogc3FjKHNpemUsc2l6ZSk7IHNxYy5zZXRSYW5kb20oKTsKKyAgTWF0cml4Um93TWFqIHNxcihzaXplLHNpemUpOyBzcXIuc2V0UmFuZG9tKCk7CisgIAorICBTY2FsYXIgcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgPSBzKnNvYypzb3IuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgPSBzKihzb2Mqc29jLmFkam9pbnQoKSkpOworICBDSEVDS19NTVRSKG1hdHIsIExvd2VyLCA9IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCA9IHNvYyoocypzb3IuYWRqb2ludCgpKSk7CisgIAorICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCArPSBzKnNvYypzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgKz0gcyooc29jKnNvci50cmFuc3Bvc2UoKSkpOworICBDSEVDS19NTVRSKG1hdHIsIExvd2VyLCArPSBzKnNvcipzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRyLCBVcHBlciwgKz0gc29jKihzKnNvYy5hZGpvaW50KCkpKTsKKyAgCisgIENIRUNLX01NVFIobWF0YywgTG93ZXIsIC09IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCAtPSBzKihvc2MudHJhbnNwb3NlKCkqb3NjLmNvbmp1Z2F0ZSgpKSk7CisgIENIRUNLX01NVFIobWF0ciwgTG93ZXIsIC09IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCAtPSBzb2MqKHMqc29jLmFkam9pbnQoKSkpOworICAKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgLT0gcypzcXIqc3FjLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgPSBzKnNxYypzcXIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCArPSBzKnNxcipzcWMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCA9IHMqc3FjKnNxYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisgIAorICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCA9IChzKnNxcikudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqc3FjKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgLT0gKHMqc3FjKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSpzcWMpOworICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCA9IChzKnNxcikudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkqc3FjKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgKz0gKHMqc3FjKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpzcWMpOworCisgIC8vIGNoZWNrIGFsaWFzaW5nCisgIHJlZjIgPSByZWYxID0gbWF0YzsKKyAgcmVmMSA9IHNxYy5hZGpvaW50KCkgKiBtYXRjICogc3FjOworICByZWYyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gcmVmMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbWF0Yy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHNxYy5hZGpvaW50KCkgKiBtYXRjICogc3FjOworICBWRVJJRllfSVNfQVBQUk9YKG1hdGMsIHJlZjIpOworCisgIHJlZjIgPSByZWYxID0gbWF0YzsKKyAgcmVmMSA9IHNxYyAqIG1hdGMgKiBzcWMuYWRqb2ludCgpOworICByZWYyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gcmVmMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgbWF0Yy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IHNxYyAqIG1hdGMgKiBzcWMuYWRqb2ludCgpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdGMsIHJlZjIpOworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9tbXRyKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgQ0FMTF9TVUJURVNUXzEoKG1tdHI8ZmxvYXQ+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8yKChtbXRyPGRvdWJsZT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKG1tdHI8c3RkOjpjb21wbGV4PGZsb2F0PiA+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKG1tdHI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfbm90ZW1wb3JhcnkuY3BwIGIvdGVzdC9wcm9kdWN0X25vdGVtcG9yYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU5MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X25vdGVtcG9yYXJ5LmNwcApAQCAtMCwwICsxLDE2MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgVEVTVF9FTkFCTEVfVEVNUE9SQVJZX1RSQUNLSU5HCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcHJvZHVjdF9ub3RlbXBvcmFyeShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiBUaGlzIHRlc3QgY2hlY2tzIHRoZSBudW1iZXIgb2YgdGVtcG9yYXJpZXMgY3JlYXRlZAorICAgKiBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgYSBjb21wbGV4IGV4cHJlc3Npb24gKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+IENvbE1ham9yTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gUm93TWFqb3JNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIENvbE1ham9yTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIFJvd1ZlY3RvclR5cGUgcnYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCBydnJlcyhyb3dzKTsKKyAgQ29sVmVjdG9yVHlwZSBjdjEgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20oY29scyksIGN2cmVzKGNvbHMpOworICBSb3dNYWpvck1hdHJpeFR5cGUgcm0zKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCisgICAgICAgIGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxjb2xzLWMwKSwKKyAgICAgICAgcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCisgICAgICAgIHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxyb3dzLXIwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSAobTEgKiBtMi5hZGpvaW50KCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zID0gKG0xICogbTIuYWRqb2ludCgpKS50cmFuc3Bvc2UoKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMSAqIG0yLmFkam9pbnQoKSwgMCk7CisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zID0gczEgKiAobTEgKiBtMi50cmFuc3Bvc2UoKSksIDEpOworLy8gICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSBtMyArIHMxICogKG0xICogbTIudHJhbnNwb3NlKCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMxICogKG0xICogbTIudHJhbnNwb3NlKCkpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSBtMyArIChtMSAqIG0yLmFkam9pbnQoKSksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSBtMyAtIChtMSAqIG0yLmFkam9pbnQoKSksIDEpOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMyA9IG0zICsgKG0xICogbTIuYWRqb2ludCgpKS50cmFuc3Bvc2UoKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMyArIG0xICogbTIudHJhbnNwb3NlKCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpICs9IG0zICsgbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgLT0gbTMgKyBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9ICBtMyAtIG0xICogbTIudHJhbnNwb3NlKCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpICs9IG0zIC0gbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgLT0gbTMgLSBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gczEgKiBtMSAqIHMyICogbTIuYWRqb2ludCgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMxICogbTEgKiBzMiAqIChtMSpzMyttMipzMikuYWRqb2ludCgpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IChzMSAqIG0xKS5hZGpvaW50KCkgKiBzMiAqIG0yLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSArPSBzMSAqICgtbTEqczMpLmFkam9pbnQoKSAqIChzMiAqIG0yICogczMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSAtPSBzMSAqIChtMS50cmFuc3Bvc2UoKSAqIG0yKSwgMCk7CisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoKCBtMy5ibG9jayhyMCxyMCxyMSxyMSkubm9hbGlhcygpICs9IC1tMS5ibG9jayhyMCxjMCxyMSxjMSkgKiAoczIqbTIuYmxvY2socjAsYzAscjEsYzEpKS5hZGpvaW50KCkgKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCggbTMuYmxvY2socjAscjAscjEscjEpLm5vYWxpYXMoKSAtPSBzMSAqIG0xLmJsb2NrKHIwLGMwLHIxLGMxKSAqIG0yLmJsb2NrKGMwLHIwLGMxLHIxKSApLCAwKTsKKworICAvLyBOT1RFIHRoaXMgaXMgYmVjYXVzZSB0aGUgQmxvY2sgZXhwcmVzc2lvbiBpcyBub3QgaGFuZGxlZCB5ZXQgYnkgb3VyIGV4cHJlc3Npb24gYW5hbHlzZXIKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoKCBtMy5ibG9jayhyMCxyMCxyMSxyMSkubm9hbGlhcygpID0gczEgKiBtMS5ibG9jayhyMCxjMCxyMSxjMSkgKiAoczEqbTIpLmJsb2NrKGMwLHIwLGMxLHIxKSApLCAxKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IChzMSAqIG0xKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIG0yLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogKG0yK20yKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMubm9hbGlhcygpID0gKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkgKiBtMi5hZGpvaW50KCksIDApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IChtMSAqIG0yLmFkam9pbnQoKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgLT0gKG0xICogbTIuYWRqb2ludCgpKSwgMCk7CisKKyAgLy8gTk9URSB0aGlzIGlzIGJlY2F1c2UgdGhlIGJsYXNfdHJhaXRzIHJlcXVpcmUgaW5uZXJzdHJpZGU9PTEgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhY3R1YWxseSBuZWVkZWQgZm9yIHRoZSB0cmlhbmd1bGFyIHByb2R1Y3RzCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMuY29sKGMwKS5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIChzMiptMi5yb3coYzApKS5hZGpvaW50KCksIDEpOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMudHJhbnNwb3NlKCkpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IChzMSAqIG0xKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKC1tMipzMykuYWRqb2ludCgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMyICogbTIuYWRqb2ludCgpICogKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYWRqb2ludCgpLCAwKTsKKworICAvLyBOT1RFIHRoaXMgaXMgYmVjYXVzZSB0aGUgYmxhc190cmFpdHMgcmVxdWlyZSBpbm5lcnN0cmlkZT09MSB0byBhdm9pZCBhIHRlbXBvcmFyeSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlIGFjdHVhbGx5IG5lZWRlZCBmb3IgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdHMKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmNvbChjMCkubm9hbGlhcygpID0gKHMxICogbTEpLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoLW0yLnJvdyhjMCkqczMpLmFkam9pbnQoKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5jb2woYzApLm5vYWxpYXMoKSAtPSAoczEgKiBtMSkuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqICgtbTIucm93KGMwKSpzMykuYWRqb2ludCgpLCAxKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMuYmxvY2socjAsYzAscjEsYzEpLm5vYWxpYXMoKSArPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMxKm0yLmJsb2NrKHIwLGMwLHIxLGMxKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMuYmxvY2socjAsYzAscjEsYzEpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKHIwLHIwLHIxLHIxKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMi5ibG9jayhyMCxjMCxyMSxjMSksIDApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMi5hZGpvaW50KCkpLCAwKTsKKworICAvLyBIZXJlIHdlIHdpbGwgZ2V0IDEgdGVtcG9yYXJ5IGZvciBlYWNoIHJlc2l6ZSBvcGVyYXRpb24gb2YgdGhlIGxocyBvcGVyYXRvcjsgcmVzaXplKHIxLGMxKSB3b3VsZCBsZWFkIHRvIHplcm8gdGVtcG9yYXJpZXMKKyAgbTMucmVzaXplKDEsMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYmxvY2socjAsYzAscjEsYzEpLCAxKTsKKyAgbTMucmVzaXplKDEsMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpICAqIG0yLmJsb2NrKHIwLGMwLHIxLGMxKSwgMSk7CisKKyAgLy8gWmVybyB0ZW1wb3JhcmllcyBmb3IgbGF6eSBwcm9kdWN0cyAuLi4KKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKS5sYXp5UHJvZHVjdChtMykpLmRpYWdvbmFsKCkuc3VtKCksIDAgKTsKKworICAvLyAuLi4gYW5kIGV2ZW4gbm8gdGVtcG9yYXJ5IGZvciBldmVuIGRlZXBseSAoPj0yKSBuZXN0ZWQgcHJvZHVjdHMKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKSAqIG0zKS5kaWFnb25hbCgpLnN1bSgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBTY2FsYXIgdG1wID0gMDsgdG1wICs9IFNjYWxhcihSZWFsU2NhbGFyKDEpKSAvICAobTMudHJhbnNwb3NlKCkgKiBtMykuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLnN1bSgpLCAwICk7CisKKyAgLy8gWmVybyB0ZW1wb3JhcmllcyBmb3IgLi4uIENvZWZmQmFzZWRQcm9kdWN0TW9kZQorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMuY29sKDApLnRlbXBsYXRlIGhlYWQ8NT4oKSAqIG0zLmNvbCgwKS50cmFuc3Bvc2UoKSArIG0zLmNvbCgwKS50ZW1wbGF0ZSBoZWFkPDU+KCkgKiBtMy5jb2woMCkudHJhbnNwb3NlKCksIDAgKTsKKworICAvLyBDaGVjayBtYXRyaXggKiB2ZWN0b3JzCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgPSBtMSAqIGN2MSwgMCApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpIC09IG0xICogY3YxLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgLT0gbTEgKiBtMi5jb2woMCksIDAgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSAtPSBtMSAqIHJ2MS5hZGpvaW50KCksIDAgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSAtPSBtMSAqIG0yLnJvdygwKS50cmFuc3Bvc2UoKSwgMCApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgPSAobTErbTEpICogY3YxLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgPSAocm0zK3JtMykgKiBjdjEsIDAgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSA9IChtMSttMSkgKiAobTEqY3YxKSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpID0gKHJtMytybTMpICogKG0xKmN2MSksIDEgKTsKKworICAvLyBDaGVjayBvdXRlciBwcm9kdWN0cworICBtMyA9IGN2MSAqIHJ2MTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IGN2MSAqIHJ2MSwgMCApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gKGN2MStjdjEpICogKHJ2MStydjEpLCAxICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSAobTEqY3YxKSAqIChydjEpLCAxICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgKz0gKG0xKmN2MSkgKiAocnYxKSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChjdjEpICogKHJ2MSAqIG0xKSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSAtPSAoY3YxKSAqIChydjEgKiBtMSksIDEgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgPSAobTEqY3YxKSAqIChydjEgKiBtMSksIDIgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgKz0gKG0xKmN2MSkgKiAocnYxICogbTEpLCAyICk7CisKKyAgLy8gQ2hlY2sgbmVzdGVkIHByb2R1Y3RzCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgPSBtMS5hZGpvaW50KCkgKiBtMSAqIGN2MSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcnZyZXMubm9hbGlhcygpID0gcnYxICogKG0xICogbTIuYWRqb2ludCgpKSwgMSApOworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9ub3RlbXBvcmFyeSgpCit7CisgIGludCBzOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTYsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHByb2R1Y3Rfbm90ZW1wb3JhcnkoTWF0cml4WGYocywgcykpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3Rfbm90ZW1wb3JhcnkoTWF0cml4WGQocywgcykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTYsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdF9ub3RlbXBvcmFyeShNYXRyaXhYY2YocyxzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdF9ub3RlbXBvcmFyeShNYXRyaXhYY2QocyxzKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9zZWxmYWRqb2ludC5jcHAgYi90ZXN0L3Byb2R1Y3Rfc2VsZmFkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzY4YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3Rfc2VsZmFkam9pbnQuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHByb2R1Y3Rfc2VsZmFkam9pbnQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIER5bmFtaWMsIFJvd01ham9yPiBSaHNNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTM7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjMocm93cyk7CisgIFJvd1ZlY3RvclR5cGUgcjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgICAgcjIgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIFJoc01hdHJpeFR5cGUgbTQgPSBSaHNNYXRyaXhUeXBlOjpSYW5kb20ocm93cywxMCk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBtMSA9IChtMS5hZGpvaW50KCkgKyBtMSkuZXZhbCgpOworCisgIC8vIHJhbmsyIHVwZGF0ZQorICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZSh2MSx2Mik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIChtMSArIHYxICogdjIuYWRqb2ludCgpKyB2MiAqIHYxLmFkam9pbnQoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSgtdjEsczIqdjIsczMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCAobTEgKyAoczMqKC12MSkqKHMyKnYyKS5hZGpvaW50KCkrbnVtZXh0Ojpjb25qKHMzKSooczIqdjIpKigtdjEpLmFkam9pbnQoKSkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUoLXMyKnIxLmFkam9pbnQoKSxyMi5hZGpvaW50KCkqczMsczEpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCAobTEgKyBzMSooLXMyKnIxLmFkam9pbnQoKSkqKHIyLmFkam9pbnQoKSpzMykuYWRqb2ludCgpICsgbnVtZXh0Ojpjb25qKHMxKSoocjIuYWRqb2ludCgpKnMzKSAqICgtczIqcjEuYWRqb2ludCgpKS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgaWYgKHJvd3M+MSkKKyAgeworICAgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgICAgbTIuYmxvY2soMSwxLHJvd3MtMSxjb2xzLTEpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHYxLnRhaWwocm93cy0xKSx2Mi5oZWFkKGNvbHMtMSkpOworICAgIG0zID0gbTE7CisgICAgbTMuYmxvY2soMSwxLHJvd3MtMSxjb2xzLTEpICs9IHYxLnRhaWwocm93cy0xKSAqIHYyLmhlYWQoY29scy0xKS5hZGpvaW50KCkrIHYyLmhlYWQoY29scy0xKSAqIHYxLnRhaWwocm93cy0xKS5hZGpvaW50KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcHJvZHVjdF9zZWxmYWRqb2ludCgpCit7CisgIGludCBzID0gMDsKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXgzZCgpKSApOworICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeFhjZihzLCBzKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgICAgCisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzUoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4WGNkKHMscykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXhYZChzLHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgICAKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ocyxzKSkgKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9zbWFsbC5jcHAgYi90ZXN0L3Byb2R1Y3Rfc21hbGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmRkOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3Rfc21hbGwuY3BwCkBAIC0wLDAgKzEsMjkzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjaW5jbHVkZSAicHJvZHVjdC5oIgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCisvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA0NDcKK3RlbXBsYXRlPGludD4KK3ZvaWQgcHJvZHVjdDF4MSgpCit7CisgIE1hdHJpeDxmbG9hdCwxLDM+IG1hdEFzdGF0aWM7CisgIE1hdHJpeDxmbG9hdCwzLDE+IG1hdEJzdGF0aWM7CisgIG1hdEFzdGF0aWMuc2V0UmFuZG9tKCk7CisgIG1hdEJzdGF0aWMuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1goIChtYXRBc3RhdGljICogbWF0QnN0YXRpYykuY29lZmYoMCwwKSwgCisgICAgICAgICAgICAgICAgICAgIG1hdEFzdGF0aWMuY3dpc2VQcm9kdWN0KG1hdEJzdGF0aWMudHJhbnNwb3NlKCkpLnN1bSgpICk7CisKKyAgTWF0cml4WGYgbWF0QWR5bmFtaWMoMSwzKTsKKyAgTWF0cml4WGYgbWF0QmR5bmFtaWMoMywxKTsKKyAgbWF0QWR5bmFtaWMuc2V0UmFuZG9tKCk7CisgIG1hdEJkeW5hbWljLnNldFJhbmRvbSgpOworICBWRVJJRllfSVNfQVBQUk9YKCAobWF0QWR5bmFtaWMgKiBtYXRCZHluYW1pYykuY29lZmYoMCwwKSwgCisgICAgICAgICAgICAgICAgICAgIG1hdEFkeW5hbWljLmN3aXNlUHJvZHVjdChtYXRCZHluYW1pYy50cmFuc3Bvc2UoKSkuc3VtKCkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQj4KK2NvbnN0IFRDJiByZWZfcHJvZChUQyAmQywgY29uc3QgVEEgJkEsIGNvbnN0IFRCICZCKQoreworICBmb3IoSW5kZXggaT0wO2k8Qy5yb3dzKCk7KytpKQorICAgIGZvcihJbmRleCBqPTA7ajxDLmNvbHMoKTsrK2opCisgICAgICBmb3IoSW5kZXggaz0wO2s8QS5jb2xzKCk7KytrKQorICAgICAgICBDLmNvZWZmUmVmKGksaikgKz0gQS5jb2VmZihpLGspICogQi5jb2VmZihrLGopOworICByZXR1cm4gQzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgRGVwdGgsIGludCBPQywgaW50IE9BLCBpbnQgT0I+Cit0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPCEgKCAoUm93cyA9PTEmJkRlcHRoIT0xJiZPQT09Q29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoRGVwdGg9PTEmJlJvd3MgIT0xJiZPQT09Um93TWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoQ29scyA9PTEmJkRlcHRoIT0xJiZPQj09Um93TWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoRGVwdGg9PTEmJkNvbHMgIT0xJiZPQj09Q29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUm93cyA9PTEmJkNvbHMgIT0xJiZPQz09Q29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoQ29scyA9PTEmJlJvd3MgIT0xJiZPQz09Um93TWFqb3IpKSx2b2lkPjo6dHlwZQordGVzdF9sYXp5X3NpbmdsZShpbnQgcm93cywgaW50IGNvbHMsIGludCBkZXB0aCkKK3sKKyAgTWF0cml4PFQsUm93cyxEZXB0aCxPQT4gQShyb3dzLGRlcHRoKTsgQS5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFQsRGVwdGgsQ29scyxPQj4gQihkZXB0aCxjb2xzKTsgQi5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFQsUm93cyxDb2xzLE9DPiAgQyhyb3dzLGNvbHMpOyAgQy5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFQsUm93cyxDb2xzLE9DPiAgRChDKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChDKz1BLmxhenlQcm9kdWN0KEIpLCByZWZfcHJvZChELEEsQikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgUm93cywgaW50IENvbHMsIGludCBEZXB0aCwgaW50IE9DLCBpbnQgT0EsIGludCBPQj4KK3R5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8ICAoIChSb3dzID09MSYmRGVwdGghPTEmJk9BPT1Db2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChEZXB0aD09MSYmUm93cyAhPTEmJk9BPT1Sb3dNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChDb2xzID09MSYmRGVwdGghPTEmJk9CPT1Sb3dNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChEZXB0aD09MSYmQ29scyAhPTEmJk9CPT1Db2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSb3dzID09MSYmQ29scyAhPTEmJk9DPT1Db2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChDb2xzID09MSYmUm93cyAhPTEmJk9DPT1Sb3dNYWpvcikpLHZvaWQ+Ojp0eXBlCit0ZXN0X2xhenlfc2luZ2xlKGludCwgaW50LCBpbnQpCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBSb3dzLCBpbnQgQ29scywgaW50IERlcHRoPgordm9pZCB0ZXN0X2xhenlfYWxsX2xheW91dChpbnQgcm93cz1Sb3dzLCBpbnQgY29scz1Db2xzLCBpbnQgZGVwdGg9RGVwdGgpCit7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsQ29sTWFqb3IsQ29sTWFqb3IsQ29sTWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsUm93TWFqb3IsQ29sTWFqb3IsQ29sTWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsQ29sTWFqb3IsUm93TWFqb3IsQ29sTWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsUm93TWFqb3IsUm93TWFqb3IsQ29sTWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsQ29sTWFqb3IsQ29sTWFqb3IsUm93TWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsUm93TWFqb3IsQ29sTWFqb3IsUm93TWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsQ29sTWFqb3IsUm93TWFqb3IsUm93TWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9zaW5nbGU8VCxSb3dzLENvbHMsRGVwdGgsUm93TWFqb3IsUm93TWFqb3IsUm93TWFqb3I+KHJvd3MsY29scyxkZXB0aCkgKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfbGF6eV9sMSgpCit7CisgIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOworICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKKyAgaW50IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOworCisgIC8vIElubmVyCisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDI+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDM+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDg+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDk+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLC0xPigxLDEsZGVwdGgpICkpOworCisgIC8vIE91dGVyCisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiwxLDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwyLDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiwyLDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMywzLDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw0LDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw4LDE+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwtMSwxPig0LGNvbHMpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDcsLTEsMT4oNyxjb2xzKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwtMSw4LDE+KHJvd3MpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDMsMT4ocm93cykgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsLTEsLTEsMT4ocm93cyxjb2xzKSApKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9sYXp5X2wyKCkKK3sKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7CisgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOworICBpbnQgZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7CisKKyAgLy8gbWF0LXZlYworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsMSwyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsMSw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSwyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDUsMSw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw1PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw2PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDYsMSw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDgsMSw4PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDEsND4ocm93cykgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwxLC0xPig0LDEsZGVwdGgpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDEsLTE+KHJvd3MsMSxkZXB0aCkgKSk7CisKKyAgLy8gdmVjLW1hdAorICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsMiwyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsMiw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCwyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNSw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw1PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw2PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNiw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsOCw4PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsLTEsIDQ+KDEsY29scykgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwgNCwtMT4oMSw0LGRlcHRoKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwxLC0xLC0xPigxLGNvbHMsZGVwdGgpICkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2xhenlfbDMoKQoreworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7CisgIGludCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKKyAgLy8gbWF0LW1hdAorICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsNCwyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsNiw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMywyPigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsOCw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDUsNiw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMiw1PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsNyw2PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDYsOCw0PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDgsMyw4PigpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDYsND4ocm93cykgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwzLC0xPig0LDMsZGVwdGgpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDYsLTE+KHJvd3MsNixkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsOCwyLDI+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNSwyLDQ+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw0LDI+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsOCw0LDQ+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNiw1LDQ+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw0LDU+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMyw0LDY+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiw2LDQ+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNyw4LDg+KCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsOCwtMSwgND4oOCxjb2xzKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwzLCA0LC0xPigzLDQsZGVwdGgpICkpOworICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsLTEsLTE+KDQsY29scyxkZXB0aCkgKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsaW50IE4saW50IE0saW50IEs+Cit2b2lkIHRlc3RfbGluZWFyX2J1dF9ub3RfdmVjdG9yaXphYmxlKCkKK3sKKyAgLy8gQ2hlY2sgdHJpY2t5IGNhc2VzIGZvciB3aGljaCB0aGUgcmVzdWx0IG9mIHRoZSBwcm9kdWN0IGlzIGEgdmVjdG9yIGFuZCB0aHVzIG11c3QgZXhoaWJpdCB0aGUgTGluZWFyQml0IGZsYWcsCisgIC8vIGJ1dCBpcyBub3QgdmVjdG9yaXphYmxlIGFsb25nIHRoZSBsaW5lYXIgZGltZW5zaW9uLgorICBJbmRleCBuID0gTj09RHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMzIpIDogTjsKKyAgSW5kZXggbSA9IE09PUR5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDMyKSA6IE07CisgIEluZGV4IGsgPSBLPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwzMikgOiBLOworCisgIHsKKyAgICBNYXRyaXg8VCxOLE0rMT4gQTsgQS5zZXRSYW5kb20obixtKzEpOworICAgIE1hdHJpeDxULE0qMixLPiBCOyBCLnNldFJhbmRvbShtKjIsayk7CisgICAgTWF0cml4PFQsMSxLPiBDOworICAgIE1hdHJpeDxULDEsSz4gUjsKKworICAgIEMubm9hbGlhcygpID0gQS50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPDEsTT4oKSAqIChCLnRlbXBsYXRlIHRvcFJvd3M8TT4oKStCLnRlbXBsYXRlIGJvdHRvbVJvd3M8TT4oKSk7CisgICAgUi5ub2FsaWFzKCkgPSBBLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8MSxNPigpICogKEIudGVtcGxhdGUgdG9wUm93czxNPigpK0IudGVtcGxhdGUgYm90dG9tUm93czxNPigpKS5ldmFsKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChDLFIpOworICB9CisKKyAgeworICAgIE1hdHJpeDxULE0rMSxOLFJvd01ham9yPiBBOyBBLnNldFJhbmRvbShtKzEsbik7CisgICAgTWF0cml4PFQsSyxNKjIsUm93TWFqb3I+IEI7IEIuc2V0UmFuZG9tKGssbSoyKTsKKyAgICBNYXRyaXg8VCxLLDE+IEM7CisgICAgTWF0cml4PFQsSywxPiBSOworCisgICAgQy5ub2FsaWFzKCkgPSAoQi50ZW1wbGF0ZSBsZWZ0Q29sczxNPigpK0IudGVtcGxhdGUgcmlnaHRDb2xzPE0+KCkpICAgICAgICAqIEEudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNLDE+KCk7CisgICAgUi5ub2FsaWFzKCkgPSAoQi50ZW1wbGF0ZSBsZWZ0Q29sczxNPigpK0IudGVtcGxhdGUgcmlnaHRDb2xzPE0+KCkpLmV2YWwoKSAqIEEudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNLDE+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChDLFIpOworICB9Cit9CisKK3RlbXBsYXRlPGludCBSb3dzPgordm9pZCBidWdfMTMxMSgpCit7CisgIE1hdHJpeDwgZG91YmxlLCBSb3dzLCAyID4gQTsgIEEuc2V0UmFuZG9tKCk7CisgIFZlY3RvcjJkIGIgPSBWZWN0b3IyZDo6UmFuZG9tKCkgOworICBNYXRyaXg8ZG91YmxlLFJvd3MsMT4gcmVzOworICByZXMubm9hbGlhcygpID0gMS4gKiAoQSAqIGIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSpiKTsKKyAgcmVzLm5vYWxpYXMoKSA9IDEuKkEgKiBiOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSpiKTsKKyAgcmVzLm5vYWxpYXMoKSA9ICgxLipBKS5sYXp5UHJvZHVjdChiKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIEEqYik7CisgIHJlcy5ub2FsaWFzKCkgPSAoMS4qQSkubGF6eVByb2R1Y3QoMS4qYik7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBBKmIpOworICByZXMubm9hbGlhcygpID0gKEEpLmxhenlQcm9kdWN0KDEuKmIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSpiKTsKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3Rfc21hbGwoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0KE1hdHJpeDxmbG9hdCwgMywgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcHJvZHVjdChNYXRyaXg8aW50LCAzLCAxNz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggcHJvZHVjdChNYXRyaXg8ZG91YmxlLCAzLCAxNz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdChNYXRyaXgzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHByb2R1Y3QoTWF0cml4NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggcHJvZHVjdDF4MTwwPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMTEoIHRlc3RfbGF6eV9sMTxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8xMiggdGVzdF9sYXp5X2wyPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEzKCB0ZXN0X2xhenlfbDM8ZmxvYXQ+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF8yMSggdGVzdF9sYXp5X2wxPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8yMiggdGVzdF9sYXp5X2wyPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8yMyggdGVzdF9sYXp5X2wzPGRvdWJsZT4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMxKCB0ZXN0X2xhenlfbDE8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMzIoIHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOworICAgIENBTExfU1VCVEVTVF8zMyggdGVzdF9sYXp5X2wzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNDEoIHRlc3RfbGF6eV9sMTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNDIoIHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNDMoIHRlc3RfbGF6eV9sMzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF83KCggdGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGU8ZmxvYXQsMiwxLER5bmFtaWM+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKCB0ZXN0X2xpbmVhcl9idXRfbm90X3ZlY3Rvcml6YWJsZTxmbG9hdCwzLDEsRHluYW1pYz4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoIHRlc3RfbGluZWFyX2J1dF9ub3RfdmVjdG9yaXphYmxlPGZsb2F0LDIsMSwxNj4oKSApKTsKKworICAgIENBTExfU1VCVEVTVF82KCBidWdfMTMxMTwzPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGJ1Z18xMzExPDU+KCkgKTsKKyAgfQorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzYKKyAgeworICAgIC8vIHRlc3QgY29tcGlsYXRpb24gb2YgKG91dGVyX3Byb2R1Y3QpICogdmVjdG9yCisgICAgVmVjdG9yM2YgdiA9IFZlY3RvcjNmOjpSYW5kb20oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCAodiAqIHYudHJhbnNwb3NlKCkpICogdiwgKHYgKiB2LnRyYW5zcG9zZSgpKS5ldmFsKCkgKiB2KTsKKyAgfQorICAKKyAgeworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgcHVsbC1yZXF1ZXN0ICM5MworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxPiBBOyAgQS5zZXRSYW5kb20oKTsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMTgsIDE+IEI7IEIuc2V0UmFuZG9tKCk7CisgICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDEsIDE4PiBDOyBDLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1goQiAqIEEuaW52ZXJzZSgpLCBCICogQS5pbnZlcnNlKClbMF0pOworICAgIFZFUklGWV9JU19BUFBST1goQS5pbnZlcnNlKCkgKiBDLCBBLmludmVyc2UoKVswXSAqIEMpOworICB9CisKKyAgeworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxMCwgMTA+IEEsIEIsIEM7CisgICAgQS5zZXRSYW5kb20oKTsKKyAgICBDID0gQTsKKyAgICBmb3IoaW50IGs9MDsgazw3OTsgKytrKQorICAgICAgQyA9IEMgKiBBOworICAgIEIubm9hbGlhcygpID0gKCgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSAqICgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSkKKyAgICAgICAgICAgICAgICAqICgoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkgKiAoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkpOworICAgIFZFUklGWV9JU19BUFBST1goQixDKTsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfc3ltbS5jcHAgYi90ZXN0L3Byb2R1Y3Rfc3ltbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0NDM4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF9zeW1tLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemUsIGludCBPdGhlclNpemU+IHZvaWQgc3ltbShpbnQgc2l6ZSA9IFNpemUsIGludCBvdGhlcnNpemUgPSBPdGhlclNpemUpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSwgU2l6ZT4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBPdGhlclNpemU+IFJoczE7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgT3RoZXJTaXplLCBTaXplPiBSaHMyOworICBlbnVtIHsgb3JkZXIgPSBPdGhlclNpemU9PTEgPyAwIDogUm93TWFqb3IgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBPdGhlclNpemUsb3JkZXI+IFJoczM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgSW5kZXggcm93cyA9IHNpemU7CisgIEluZGV4IGNvbHMgPSBzaXplOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zOworCisgIG0xID0gKG0xK20xLmFkam9pbnQoKSkuZXZhbCgpOworCisgIFJoczEgcmhzMSA9IFJoczE6OlJhbmRvbShjb2xzLCBvdGhlcnNpemUpLCByaHMxMihjb2xzLCBvdGhlcnNpemUpLCByaHMxMyhjb2xzLCBvdGhlcnNpemUpOworICBSaHMyIHJoczIgPSBSaHMyOjpSYW5kb20ob3RoZXJzaXplLCByb3dzKSwgcmhzMjIob3RoZXJzaXplLCByb3dzKSwgcmhzMjMob3RoZXJzaXplLCByb3dzKTsKKyAgUmhzMyByaHMzID0gUmhzMzo6UmFuZG9tKGNvbHMsIG90aGVyc2l6ZSksIHJoczMyKGNvbHMsIG90aGVyc2l6ZSksIHJoczMzKGNvbHMsIG90aGVyc2l6ZSk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIG0zID0gbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICBWRVJJRllfSVNfRVFVQUwobTEsIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKSAqIChzMipyaHMxKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudHJhbnNwb3NlKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xLnRyYW5zcG9zZSgpKSAqIChzMipyaHMxKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnRyYW5zcG9zZSgpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xLnRyYW5zcG9zZSgpKSAqIChzMipyaHMxKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikuY29uanVnYXRlKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKS5jb25qdWdhdGUoKSAqIChzMipyaHMxKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmNvbmp1Z2F0ZSgpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKS5jb25qdWdhdGUoKSAqIChzMipyaHMxKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIChzMipyaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkuYWRqb2ludCgpICogKHMyKnJoczEpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuYWRqb2ludCgpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKS5hZGpvaW50KCkgKiAoczIqcmhzMSkpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7IHJoczEyLnNldFJhbmRvbSgpOyByaHMxMyA9IHJoczEyOworICBtMyA9IG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgKz0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIqcmhzMSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgKz0gKHMxKm0xKSAqIChzMipyaHMxKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczIuYWRqb2ludCgpKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkgKiAoczIqcmhzMi5hZGpvaW50KCkpKTsKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIqcmhzMi5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKSAqIChzMipyaHMyLmFkam9pbnQoKSkpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEqbTIuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIqcmhzMi5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xLmFkam9pbnQoKSkgKiAoczIqcmhzMi5hZGpvaW50KCkpKTsKKworICAvLyB0ZXN0IHJvdyBtYWpvciA9IDwuLi4+CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7IHJoczEyLnNldFJhbmRvbSgpOyByaHMxMyA9IHJoczEyOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyIC09IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczMpLAorICAgICAgICAgICAgICAgICAgIHJoczEzIC09IChzMSptMSkgKiAoczIgKiByaHMzKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMi5hZGpvaW50KCkpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMzKS5jb25qdWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMS5hZGpvaW50KCkpICogKHMyKnJoczMpLmNvbmp1Z2F0ZSgpKTsKKworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7IHJoczEzID0gcmhzMTI7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIubm9hbGlhcygpICs9IHMxICogKChtMi5hZGpvaW50KCkpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMzKS5jb25qdWdhdGUoKSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgKz0gKHMxKm0xLmFkam9pbnQoKSkgKiAoczIqcmhzMykuY29uanVnYXRlKCkpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMjIgPSAocmhzMikgKiAobTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgcmhzMjMgPSAocmhzMikgKiAobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMyMiA9IChzMipyaHMyKSAqIChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLCByaHMyMyA9IChzMipyaHMyKSAqIChzMSptMSkpOworCit9CisKK3ZvaWQgdGVzdF9wcm9kdWN0X3N5bW0oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspCisgIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHN5bW08ZmxvYXQsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBzeW1tPGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIHN5bW08c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBzeW1tPHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSApKTsKKworICAgIENBTExfU1VCVEVTVF81KCggc3ltbTxmbG9hdCxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIHN5bW08ZG91YmxlLER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworICAgIENBTExfU1VCVEVTVF83KCggc3ltbTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworICAgIENBTExfU1VCVEVTVF84KCggc3ltbTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3N5cmsuY3BwIGIvdGVzdC9wcm9kdWN0X3N5cmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMGYwZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3Rfc3lyay5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN5cmsoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgUm93TWFqb3I+IFJNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBSaHMxOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBSaHMyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBEeW5hbWljLFJvd01ham9yPiBSaHMzOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIFJNYXRyaXhUeXBlIHJtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICBSaHMxIHJoczEgPSBSaHMxOjpSYW5kb20oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSwgY29scyk7IFJoczEgcmhzMTEgPSBSaHMxOjpSYW5kb20ocmhzMS5yb3dzKCksIGNvbHMpOworICBSaHMyIHJoczIgPSBSaHMyOjpSYW5kb20ocm93cywgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSk7IFJoczIgcmhzMjIgPSBSaHMyOjpSYW5kb20ocm93cywgcmhzMi5jb2xzKCkpOworICBSaHMzIHJoczMgPSBSaHMzOjpSYW5kb20oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSwgcm93cyk7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIAorICBJbmRleCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUocmhzMixzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBzMSAqIHJoczIgICogcmhzMjIuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiByaHMyICogcmhzMjIuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMyLHMxKS5fZXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gczEgKiByaHMyMiAqIHJoczIuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMjIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxLmFkam9pbnQoKSAqIHJoczEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IHMxICogcmhzMTEuYWRqb2ludCgpICogcmhzMSkubmVzdGVkRXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHJoczExLmFkam9pbnQoKSAqIHJoczEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICAKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxLmFkam9pbnQoKSAqIHJoczEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHMxICogcmhzMS5hZGpvaW50KCkgKiByaHMxMSkubmVzdGVkRXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHJoczEuYWRqb2ludCgpICogcmhzMTEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIAorICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUocmhzMy5hZGpvaW50KCksczEpLl9leHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMy5hZGpvaW50KCkgKiByaHMzKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKKworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUocmhzMy5hZGpvaW50KCksczEpLl9leHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMy5hZGpvaW50KCkgKiByaHMzKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgbTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYyksczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgICAgICAgICAgICAgICAgICAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpICogbTEuY29sKGMpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICBybTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChybTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpICogbTEuY29sKGMpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IHMxICogbTMuY29sKGMpICogbTEuY29sKGMpLmFkam9pbnQoKSkubmVzdGVkRXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMy5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIHJtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKHJtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSBzMSAqIG0xLmNvbChjKSAqIG0zLmNvbChjKS5hZGpvaW50KCkpLm5lc3RlZEV4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpICogbTMuY29sKGMpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICAKKyAgbTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYykuY29uanVnYXRlKCksczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykuY29uanVnYXRlKCkgKiBtMS5jb2woYykuY29uanVnYXRlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgICAgICAgICAgICAgICAgICAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLmNvbmp1Z2F0ZSgpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICAKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEucm93KGMpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICBybTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChybTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEucm93KGMpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IHMxICogbTMucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkubmVzdGVkRXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMy5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIHJtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKHJtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBzMSAqIG0zLnJvdyhjKS50cmFuc3Bvc2UoKSAqIG0xLnJvdyhjKS50cmFuc3Bvc2UoKS5hZGpvaW50KCkpLm5lc3RlZEV4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTMucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICAKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEucm93KGMpLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIG0xLnJvdyhjKS5hZGpvaW50KCkgKiBtMS5yb3coYykuYWRqb2ludCgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9zeXJrKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgaW50IHM7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF8xKCBzeXJrKE1hdHJpeFhmKHMsIHMpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzeXJrKE1hdHJpeFhkKHMsIHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgICAKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc3lyayhNYXRyaXhYY2YocywgcykpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHN5cmsoTWF0cml4WGNkKHMsIHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3RybW0uY3BwIGIvdGVzdC9wcm9kdWN0X3RybW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTU1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3RfdHJtbS5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW50IGdldF9yYW5kb21fc2l6ZSgpCit7CisgIGNvbnN0IGludCBmYWN0b3IgPSBOdW1UcmFpdHM8VD46OlJlYWRDb3N0OworICBjb25zdCBpbnQgbWF4X3Rlc3Rfc2l6ZSA9IEVJR0VOX1RFU1RfTUFYX1NJWkU+MipmYWN0b3IgPyBFSUdFTl9URVNUX01BWF9TSVpFL2ZhY3RvciA6IEVJR0VOX1RFU1RfTUFYX1NJWkU7CisgIHJldHVybiBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhfdGVzdF9zaXplKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IFRyaU9yZGVyLCBpbnQgT3RoZXJPcmRlciwgaW50IFJlc09yZGVyLCBpbnQgT3RoZXJDb2xzPgordm9pZCB0cm1tKGludCByb3dzPWdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCksCisgICAgICAgICAgaW50IGNvbHM9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwKKyAgICAgICAgICBpbnQgb3RoZXJDb2xzID0gT3RoZXJDb2xzPT1EeW5hbWljP2dldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCk6T3RoZXJDb2xzKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLFRyaU9yZGVyPiBUcmlNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLE90aGVyQ29scyxPdGhlckNvbHM9PTE/Q29sTWFqb3I6T3RoZXJPcmRlcj4gT25UaGVSaWdodDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE90aGVyQ29scyxEeW5hbWljLE90aGVyQ29scz09MT9Sb3dNYWpvcjpPdGhlck9yZGVyPiBPblRoZUxlZnQ7CisgIAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxPdGhlckNvbHMsT3RoZXJDb2xzPT0xP0NvbE1ham9yOlJlc09yZGVyPiBSZXNYUzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE90aGVyQ29scyxEeW5hbWljLE90aGVyQ29scz09MT9Sb3dNYWpvcjpSZXNPcmRlcj4gUmVzU1g7CisKKyAgVHJpTWF0cml4ICBtYXQocm93cyxjb2xzKSwgdHJpKHJvd3MsY29scyksIHRyaVRyKGNvbHMscm93cyk7CisgIAorICBPblRoZVJpZ2h0ICBnZV9yaWdodChjb2xzLG90aGVyQ29scyk7CisgIE9uVGhlTGVmdCAgIGdlX2xlZnQob3RoZXJDb2xzLHJvd3MpOworICBSZXNTWCAgICAgICBnZV9zeCwgZ2Vfc3hfc2F2ZTsKKyAgUmVzWFMgICAgICAgZ2VfeHMsIGdlX3hzX3NhdmU7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIG1hdC5zZXRSYW5kb20oKTsKKyAgdHJpID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7CisgIHRyaVRyID0gbWF0LnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7CisgIGdlX3JpZ2h0LnNldFJhbmRvbSgpOworICBnZV9sZWZ0LnNldFJhbmRvbSgpOworCisgIFZFUklGWV9JU19BUFBST1goIGdlX3hzID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiBnZV9yaWdodCwgdHJpICogZ2VfcmlnaHQpOworICBWRVJJRllfSVNfQVBQUk9YKCBnZV9zeCA9IGdlX2xlZnQgKiBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSwgZ2VfbGVmdCAqIHRyaSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKCBnZV94cy5ub2FsaWFzKCkgPSBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX3JpZ2h0LCB0cmkgKiBnZV9yaWdodCk7CisgIFZFUklGWV9JU19BUFBST1goIGdlX3N4Lm5vYWxpYXMoKSA9IGdlX2xlZnQgKiBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSwgZ2VfbGVmdCAqIHRyaSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMubm9hbGlhcygpID0gKHMxKm1hdC5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIqZ2VfbGVmdC50cmFuc3Bvc2UoKSksIHMxKnRyaVRyLmNvbmp1Z2F0ZSgpICogKHMyKmdlX2xlZnQudHJhbnNwb3NlKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3gubm9hbGlhcygpID0gZ2VfcmlnaHQudHJhbnNwb3NlKCkgKiBtYXQuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCksIGdlX3JpZ2h0LnRyYW5zcG9zZSgpICogdHJpVHIuY29uanVnYXRlKCkpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMubm9hbGlhcygpID0gKHMxKm1hdC5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIqZ2VfbGVmdC5hZGpvaW50KCkpLCBzMSp0cmlUci5jb25qdWdhdGUoKSAqIChzMipnZV9sZWZ0LmFkam9pbnQoKSkpOworICBWRVJJRllfSVNfQVBQUk9YKCBnZV9zeC5ub2FsaWFzKCkgPSBnZV9yaWdodC5hZGpvaW50KCkgKiBtYXQuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCksIGdlX3JpZ2h0LmFkam9pbnQoKSAqIHRyaVRyLmNvbmp1Z2F0ZSgpKTsKKworICBnZV94c19zYXZlID0gZ2VfeHM7CisgIFZFUklGWV9JU19BUFBST1goIChnZV94c19zYXZlICsgczEqdHJpVHIuY29uanVnYXRlKCkgKiAoczIqZ2VfbGVmdC5hZGpvaW50KCkpKS5ldmFsKCksIGdlX3hzLm5vYWxpYXMoKSArPSAoczEqbWF0LmFkam9pbnQoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIChzMipnZV9sZWZ0LmFkam9pbnQoKSkgKTsKKyAgZ2Vfc3guc2V0UmFuZG9tKCk7CisgIGdlX3N4X3NhdmUgPSBnZV9zeDsKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3hfc2F2ZSAtIChnZV9yaWdodC5hZGpvaW50KCkgKiAoLXMxICogdHJpVHIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCksIGdlX3N4Lm5vYWxpYXMoKSAtPSAoZ2VfcmlnaHQuYWRqb2ludCgpICogKC1zMSAqIG1hdCkuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkpLmV2YWwoKSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKCBnZV94cyA9IChzMSptYXQpLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfbGVmdC5hZGpvaW50KCksIG51bWV4dDo6Y29uaihzMSkgKiB0cmlUci5jb25qdWdhdGUoKSAqIGdlX2xlZnQuYWRqb2ludCgpKTsKKyAgCisgIC8vIFRPRE8gY2hlY2sgd2l0aCBzdWItbWF0cml4IGV4cHJlc3Npb25zID8KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IFRyaU9yZGVyPgordm9pZCB0cm12KGludCByb3dzPWdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCksIGludCBjb2xzPWdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkpCit7CisgIHRybW08U2NhbGFyLE1vZGUsVHJpT3JkZXIsQ29sTWFqb3IsQ29sTWFqb3IsMT4ocm93cyxjb2xzLDEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgVHJpT3JkZXIsIGludCBPdGhlck9yZGVyLCBpbnQgUmVzT3JkZXI+Cit2b2lkIHRybW0oaW50IHJvd3M9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwgaW50IGNvbHM9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwgaW50IG90aGVyQ29scyA9IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkpCit7CisgIHRybW08U2NhbGFyLE1vZGUsVHJpT3JkZXIsT3RoZXJPcmRlcixSZXNPcmRlcixEeW5hbWljPihyb3dzLGNvbHMsb3RoZXJDb2xzKTsKK30KKworI2RlZmluZSBDQUxMX0FMTF9PUkRFUlMoTkIsU0NBTEFSLE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBDb2xNYWpvcj4oKSkpOyAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBSb3dNYWpvcj4oKSkpOworCisgIAorI2RlZmluZSBDQUxMX0FMTChOQixTQ0FMQVIpICAgICAgICAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLFVwcGVyKSAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRVcHBlcikgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5VXBwZXIpICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLExvd2VyKSAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRMb3dlcikgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5TG93ZXIpCisgIAorCit2b2lkIHRlc3RfcHJvZHVjdF90cm1tKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgQ0FMTF9BTEwoMSxmbG9hdCk7ICAgICAgICAgICAgICAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMTsxMTE7MjE7MTIxOzMxOzEzMQorICAgIENBTExfQUxMKDIsZG91YmxlKTsgICAgICAgICAgICAgICAvLyAgRUlHRU5fU1VGRklYRVM7MTI7MTEyOzIyOzEyMjszMjsxMzIKKyAgICBDQUxMX0FMTCgzLHN0ZDo6Y29tcGxleDxmbG9hdD4pOyAgLy8gIEVJR0VOX1NVRkZJWEVTOzEzOzExMzsyMzsxMjM7MzM7MTMzCisgICAgQ0FMTF9BTEwoNCxzdGQ6OmNvbXBsZXg8ZG91YmxlPik7IC8vICBFSUdFTl9TVUZGSVhFUzsxNDsxMTQ7MjQ7MTI0OzM0OzEzNAorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAgYi90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhMjAyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF90cm12LmNwcApAQCAtMCwwICsxLDkxIEBACisvLyBUaGlzIGZpbGUgaXMgdHJpYW5ndWxhclZpZXcgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdHJtdihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBSZWFsU2NhbGFyIGxhcmdlckVwcyA9IDEwKnRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCk7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICAvLyBjaGVjayB3aXRoIGEgY29sdW1uLW1ham9yIG1hdHJpeAorICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKChtMyAqIHYxKS5pc0FwcHJveChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpOworICBWRVJJRlkoKG0zICogdjEpLmlzQXBwcm94KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSAqIHYxLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdExvd2VyPigpOworICBWRVJJRlkoKG0zICogdjEpLmlzQXBwcm94KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKTsKKyAgVkVSSUZZKChtMyAqIHYxKS5pc0FwcHJveChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdFVwcGVyPigpICogdjEsIGxhcmdlckVwcykpOworCisgIC8vIGNoZWNrIGNvbmp1Z2F0ZWQgYW5kIHNjYWxhciBtdWx0aXBsZSBleHByZXNzaW9ucyAoY29sLW1ham9yKQorICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKCgoczEqbTMpLmNvbmp1Z2F0ZSgpICogdjEpLmlzQXBwcm94KChzMSptMSkuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKTsKKyAgVkVSSUZZKChtMy5jb25qdWdhdGUoKSAqIHYxLmNvbmp1Z2F0ZSgpKS5pc0FwcHJveChtMS5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiB2MS5jb25qdWdhdGUoKSwgbGFyZ2VyRXBzKSk7CisKKyAgLy8gY2hlY2sgd2l0aCBhIHJvdy1tYWpvciBtYXRyaXgKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CisgIFZFUklGWSgobTMudHJhbnNwb3NlKCkgKiB2MSkuaXNBcHByb3gobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKChtMy50cmFuc3Bvc2UoKSAqIHYxKS5pc0FwcHJveChtMS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKTsKKyAgVkVSSUZZKChtMy50cmFuc3Bvc2UoKSAqIHYxKS5pc0FwcHJveChtMS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdExvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0TG93ZXI+KCk7CisgIFZFUklGWSgobTMudHJhbnNwb3NlKCkgKiB2MSkuaXNBcHByb3gobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKSAqIHYxLCBsYXJnZXJFcHMpKTsKKworICAvLyBjaGVjayBjb25qdWdhdGVkIGFuZCBzY2FsYXIgbXVsdGlwbGUgZXhwcmVzc2lvbnMgKHJvdy1tYWpvcikKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CisgIFZFUklGWSgobTMuYWRqb2ludCgpICogdjEpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOworICBWRVJJRlkoKG0zLmFkam9pbnQoKSAqIChzMSp2MS5jb25qdWdhdGUoKSkpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiAoczEqdjEuY29uanVnYXRlKCkpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdFVwcGVyPigpOworCisgIC8vIGNoZWNrIHRyYW5zcG9zZWQgY2FzZXM6CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOworICBWRVJJRlkoKHYxLnRyYW5zcG9zZSgpICogbTMpLmlzQXBwcm94KHYxLnRyYW5zcG9zZSgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKCh2MS5hZGpvaW50KCkgKiBtMykuaXNBcHByb3godjEuYWRqb2ludCgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKCh2MS5hZGpvaW50KCkgKiBtMy5hZGpvaW50KCkpLmlzQXBwcm94KHYxLmFkam9pbnQoKSAqIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKS5hZGpvaW50KCksIGxhcmdlckVwcykpOworCisgIC8vIFRPRE8gY2hlY2sgd2l0aCBzdWItbWF0cmljZXMKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3RfdHJtdigpCit7CisgIGludCBzID0gMDsKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHRybXYoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCB0cm12KE1hdHJpeDxmbG9hdCwgMiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggdHJtdihNYXRyaXgzZCgpKSApOworICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpOworICAgIENBTExfU1VCVEVTVF80KCB0cm12KE1hdHJpeFhjZihzLHMpKSApOworICAgIENBTExfU1VCVEVTVF81KCB0cm12KE1hdHJpeFhjZChzLHMpKSApOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKyAgICAKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHRybXYoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ocywgcykpICk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdHJzb2x2ZS5jcHAgYi90ZXN0L3Byb2R1Y3RfdHJzb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5N2ZhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF90cnNvbHZlLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgVkVSSUZZX1RSU00oVFJJLFhCKSB7IFwKKyAgICAoWEIpLnNldFJhbmRvbSgpOyByZWYgPSAoWEIpOyBcCisgICAgKFRSSSkuc29sdmVJblBsYWNlKFhCKTsgXAorICAgIFZFUklGWV9JU19BUFBST1goKFRSSSkudG9EZW5zZU1hdHJpeCgpICogKFhCKSwgcmVmKTsgXAorICAgIChYQikuc2V0UmFuZG9tKCk7IHJlZiA9IChYQik7IFwKKyAgICAoWEIpID0gKFRSSSkuc29sdmUoWEIpOyBcCisgICAgVkVSSUZZX0lTX0FQUFJPWCgoVFJJKS50b0RlbnNlTWF0cml4KCkgKiAoWEIpLCByZWYpOyBcCisgIH0KKworI2RlZmluZSBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKFRSSSxYQikgeyBcCisgICAgKFhCKS5zZXRSYW5kb20oKTsgcmVmID0gKFhCKTsgXAorICAgIChUUkkpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxPblRoZVJpZ2h0PihYQi50cmFuc3Bvc2UoKSk7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKChYQikudHJhbnNwb3NlKCkgKiAoVFJJKS50cmFuc3Bvc2UoKS50b0RlbnNlTWF0cml4KCksIHJlZi50cmFuc3Bvc2UoKSk7IFwKKyAgICAoWEIpLnNldFJhbmRvbSgpOyByZWYgPSAoWEIpOyBcCisgICAgKFhCKS50cmFuc3Bvc2UoKSA9IChUUkkpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHNvbHZlPE9uVGhlUmlnaHQ+KFhCLnRyYW5zcG9zZSgpKTsgXAorICAgIFZFUklGWV9JU19BUFBST1goKFhCKS50cmFuc3Bvc2UoKSAqIChUUkkpLnRyYW5zcG9zZSgpLnRvRGVuc2VNYXRyaXgoKSwgcmVmLnRyYW5zcG9zZSgpKTsgXAorICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZSwgaW50IENvbHM+IHZvaWQgdHJzb2x2ZShpbnQgc2l6ZT1TaXplLGludCBjb2xzPUNvbHMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZSxDb2xNYWpvcj4gY21MaHMoc2l6ZSxzaXplKTsKKyAgTWF0cml4PFNjYWxhcixTaXplLFNpemUsUm93TWFqb3I+IHJtTGhzKHNpemUsc2l6ZSk7CisKKyAgZW51bSB7ICBjb2xtYWpvciA9IFNpemU9PTEgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgICAgIHJvd21ham9yID0gQ29scz09MSA/IENvbE1ham9yIDogUm93TWFqb3IgfTsKKyAgTWF0cml4PFNjYWxhcixTaXplLENvbHMsY29sbWFqb3I+IGNtUmhzKHNpemUsY29scyk7CisgIE1hdHJpeDxTY2FsYXIsU2l6ZSxDb2xzLHJvd21ham9yPiBybVJocyhzaXplLGNvbHMpOworICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxjb2xtYWpvcj4gcmVmKHNpemUsY29scyk7CisKKyAgY21MaHMuc2V0UmFuZG9tKCk7IGNtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7IGNtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKKyAgcm1MaHMuc2V0UmFuZG9tKCk7IHJtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7IHJtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKKworICBWRVJJRllfVFJTTShjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShjbUxocy5hZGpvaW50KCkgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMpOworICBWRVJJRllfVFJTTShjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgcm1SaHMpOworICBWRVJJRllfVFJTTShjbUxocy5hZGpvaW50KCkgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgcm1SaHMpOworCisgIFZFUklGWV9UUlNNKGNtTGhzLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKKworICBWRVJJRllfVFJTTShybUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShybUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKKworCisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQoY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBybVJocyk7CisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQoY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJtUmhzKTsKKworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSwgcm1SaHMpOworCisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQocm1MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChybUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKKworICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSk7CisgIFZFUklGWV9UUlNNKHJtTGhzLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBybVJocy5jb2woYykpOworICBWRVJJRllfVFJTTShjbUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMuY29sKGMpKTsKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3RfdHJzb2x2ZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykKKyAgeworICAgIC8vIG1hdHJpY2VzCisgICAgQ0FMTF9TVUJURVNUXzEoKHRyc29sdmU8ZmxvYXQsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigodHJzb2x2ZTxkb3VibGUsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygodHJzb2x2ZTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkpOworICAgIENBTExfU1VCVEVTVF80KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkpOworCisgICAgLy8gdmVjdG9ycworICAgIENBTExfU1VCVEVTVF81KCh0cnNvbHZlPGZsb2F0LER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKHRyc29sdmU8ZG91YmxlLER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF84KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgCisgICAgLy8gbWV0YS11bnJvbGxlcnMKKyAgICBDQUxMX1NVQlRFU1RfOSgodHJzb2x2ZTxmbG9hdCw0LDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoKHRyc29sdmU8ZG91YmxlLDQsMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xMSgodHJzb2x2ZTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDQsMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xMigodHJzb2x2ZTxmbG9hdCwxLDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTMoKHRyc29sdmU8ZmxvYXQsMSwyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzE0KCh0cnNvbHZlPGZsb2F0LDMsMT4oKSkpOworICAgIAorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3FyLmNwcCBiL3Rlc3QvcXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2MxZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3FyLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHFyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gTWF0cml4UVR5cGU7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXJPZkEoYSk7CisKKyAgTWF0cml4UVR5cGUgcSA9IHFyT2ZBLmhvdXNlaG9sZGVyUSgpOworICBWRVJJRllfSVNfVU5JVEFSWShxKTsKKworICBNYXRyaXhUeXBlIHIgPSBxck9mQS5tYXRyaXhRUigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGEsIHFyT2ZBLmhvdXNlaG9sZGVyUSgpICogcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4gdm9pZCBxcl9maXhlZHNpemUoKQoreworICBlbnVtIHsgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gbTEgPSBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz46OlJhbmRvbSgpOworICBIb3VzZWhvbGRlclFSPE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiA+IHFyKG0xKTsKKworICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gciA9IHFyLm1hdHJpeFFSKCk7CisgIC8vIEZJWE1FIG5lZWQgYmV0dGVyIHdheSB0byBjb25zdHJ1Y3QgdHJhcGV6b2lkCisgIGZvcihpbnQgaSA9IDA7IGkgPCBSb3dzOyBpKyspIGZvcihpbnQgaiA9IDA7IGogPCBDb2xzOyBqKyspIGlmKGk+aikgcihpLGopID0gU2NhbGFyKDApOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIHFyLmhvdXNlaG9sZGVyUSgpICogcik7CisKKyAgTWF0cml4PFNjYWxhcixDb2xzLENvbHMyPiBtMiA9IE1hdHJpeDxTY2FsYXIsQ29scyxDb2xzMj46OlJhbmRvbShDb2xzLENvbHMyKTsKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHMyPiBtMyA9IG0xKm0yOworICBtMiA9IE1hdHJpeDxTY2FsYXIsQ29scyxDb2xzMj46OlJhbmRvbShDb2xzLENvbHMyKTsKKyAgbTIgPSBxci5zb2x2ZShtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKm0yKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl9pbnZlcnRpYmxlKCkKK3sKKyAgdXNpbmcgc3RkOjpsb2c7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OnBvdzsKKyAgdXNpbmcgc3RkOjptYXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDUwKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7CisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkKKyAgeworICAgIC8vIGxldCdzIGJ1aWxkIGEgbWF0cml4IG1vcmUgc3RhYmxlIHRvIGludmVyc2UKKyAgICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKjQpOworICAgIG0xICs9IGEgKiBhLmFkam9pbnQoKTsKKyAgfQorCisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXIobTEpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMiA9IHFyLnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworCisgIC8vIG5vdyBjb25zdHJ1Y3QgYSBtYXRyaXggd2l0aCBwcmVzY3JpYmVkIGRldGVybWluYW50CisgIG0xLnNldFplcm8oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgbTEoaSxpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBSZWFsU2NhbGFyIGFic2RldCA9IGFicyhtMS5kaWFnb25hbCgpLnByb2QoKSk7CisgIG0zID0gcXIuaG91c2Vob2xkZXJRKCk7IC8vIGdldCBhIHVuaXRhcnkKKyAgbTEgPSBtMyAqIG0xICogbTM7CisgIHFyLmNvbXB1dGUobTEpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZyhhYnNkZXQpLCBxci5sb2dBYnNEZXRlcm1pbmFudCgpKTsKKyAgLy8gVGhpcyB0ZXN0IGlzIHRyaWNreSBpZiB0aGUgZGV0ZXJtaW5hbnQgYmVjb21lcyB0b28gc21hbGwuCisgIC8vIFNpbmNlIHdlIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIHdpdGggbWFnbml0dWRlIHJyYW5nZSBbMCwxXSwgdGhlIGF2ZXJhZ2UgZGV0ZXJtaW5hbnQgaXMgMC41XnNpemUKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBhYnMoYWJzZGV0LXFyLmFic0RldGVybWluYW50KCkpLCBudW1leHQ6Om1heGkoUmVhbFNjYWxhcihwb3coMC41LHNpemUpKSxudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oYWJzKGFic2RldCksYWJzKHFyLmFic0RldGVybWluYW50KCkpKSkgKTsKKyAgCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCit7CisgIE1hdHJpeFR5cGUgdG1wOworCisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXI7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLm1hdHJpeFFSKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmhvdXNlaG9sZGVyUSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5hYnNEZXRlcm1pbmFudCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQorfQorCit2b2lkIHRlc3RfcXIoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgQ0FMTF9TVUJURVNUXzEoIHFyKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgIENBTExfU1VCVEVTVF8yKCBxcihNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgIENBTExfU1VCVEVTVF8zKCggcXJfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwzLDQ+LCAyID4oKSApKTsKKyAgIENBTExfU1VCVEVTVF80KCggcXJfZml4ZWRzaXplPE1hdHJpeDxkb3VibGUsNiwyPiwgNCA+KCkgKSk7CisgICBDQUxMX1NVQlRFU1RfNSgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLDIsNT4sIDcgPigpICkpOworICAgQ0FMTF9TVUJURVNUXzExKCBxcihNYXRyaXg8ZmxvYXQsMSwxPigpKSApOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHFyX2ludmVydGlibGU8TWF0cml4WGNmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHFyX2ludmVydGlibGU8TWF0cml4WGNkPigpICk7CisgIH0KKworICBDQUxMX1NVQlRFU1RfOShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEwKHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Q+KCkpOworICBDQUxMX1NVQlRFU1RfMShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzYocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSk7CisgIENBTExfU1VCVEVTVF83KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzgocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfMTIoSG91c2Vob2xkZXJRUjxNYXRyaXhYZj4oMTAsIDIwKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcCBiL3Rlc3QvcXJfY29scGl2b3RpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWQyN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcApAQCAtMCwwICsxLDM0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNvZCgpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggY29sczIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggcmFuayA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIChzdGQ6Om1pbikocm93cywgY29scykgLSAxKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgTWF0cml4UVR5cGU7CisgIE1hdHJpeFR5cGUgbWF0cml4OworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCByb3dzLCBjb2xzLCBtYXRyaXgpOworICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGNvZChtYXRyaXgpOworICBWRVJJRlkocmFuayA9PSBjb2QucmFuaygpKTsKKyAgVkVSSUZZKGNvbHMgLSBjb2QucmFuaygpID09IGNvZC5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKCFjb2QuaXNJbmplY3RpdmUoKSk7CisgIFZFUklGWSghY29kLmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKCFjb2QuaXNTdXJqZWN0aXZlKCkpOworCisgIE1hdHJpeFFUeXBlIHEgPSBjb2QuaG91c2Vob2xkZXJRKCk7CisgIFZFUklGWV9JU19VTklUQVJZKHEpOworCisgIE1hdHJpeFR5cGUgeiA9IGNvZC5tYXRyaXhaKCk7CisgIFZFUklGWV9JU19VTklUQVJZKHopOworCisgIE1hdHJpeFR5cGUgdDsKKyAgdC5zZXRaZXJvKHJvd3MsIGNvbHMpOworICB0LnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykgPQorICAgICAgY29kLm1hdHJpeFQoKS50b3BMZWZ0Q29ybmVyKHJhbmssIHJhbmspLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworCisgIE1hdHJpeFR5cGUgYyA9IHEgKiB0ICogeiAqIGNvZC5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobWF0cml4LCBjKTsKKworICBNYXRyaXhUeXBlIGV4YWN0X3NvbHV0aW9uID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMyKTsKKyAgTWF0cml4VHlwZSByaHMgPSBtYXRyaXggKiBleGFjdF9zb2x1dGlvbjsKKyAgTWF0cml4VHlwZSBjb2Rfc29sdXRpb24gPSBjb2Quc29sdmUocmhzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMsIG1hdHJpeCAqIGNvZF9zb2x1dGlvbik7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgZ2V0IHRoZSBzYW1lIG1pbmltdW0tbm9ybSBzb2x1dGlvbiBhcyB0aGUgU1ZELgorICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gc3ZkKG1hdHJpeCwgQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZVRoaW5WKTsKKyAgTWF0cml4VHlwZSBzdmRfc29sdXRpb24gPSBzdmQuc29sdmUocmhzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb2Rfc29sdXRpb24sIHN2ZF9zb2x1dGlvbik7CisKKyAgTWF0cml4VHlwZSBwaW52ID0gY29kLnBzZXVkb0ludmVyc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb2Rfc29sdXRpb24sIHBpbnYgKiByaHMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IENvbHMyPgordm9pZCBjb2RfZml4ZWRzaXplKCkgeworICBlbnVtIHsKKyAgICBSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgaW50IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgKHN0ZDo6bWluKShpbnQoUm93cyksIGludChDb2xzKSkgLSAxKTsKKyAgTWF0cml4PFNjYWxhciwgUm93cywgQ29scz4gbWF0cml4OworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCBSb3dzLCBDb2xzLCBtYXRyaXgpOworICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHM+ID4gY29kKG1hdHJpeCk7CisgIFZFUklGWShyYW5rID09IGNvZC5yYW5rKCkpOworICBWRVJJRlkoQ29scyAtIGNvZC5yYW5rKCkgPT0gY29kLmRpbWVuc2lvbk9mS2VybmVsKCkpOworICBWRVJJRlkoY29kLmlzSW5qZWN0aXZlKCkgPT0gKHJhbmsgPT0gUm93cykpOworICBWRVJJRlkoY29kLmlzU3VyamVjdGl2ZSgpID09IChyYW5rID09IENvbHMpKTsKKyAgVkVSSUZZKGNvZC5pc0ludmVydGlibGUoKSA9PSAoY29kLmlzSW5qZWN0aXZlKCkgJiYgY29kLmlzU3VyamVjdGl2ZSgpKSk7CisKKyAgTWF0cml4PFNjYWxhciwgQ29scywgQ29sczI+IGV4YWN0X3NvbHV0aW9uOworICBleGFjdF9zb2x1dGlvbi5zZXRSYW5kb20oQ29scywgQ29sczIpOworICBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzMj4gcmhzID0gbWF0cml4ICogZXhhY3Rfc29sdXRpb247CisgIE1hdHJpeDxTY2FsYXIsIENvbHMsIENvbHMyPiBjb2Rfc29sdXRpb24gPSBjb2Quc29sdmUocmhzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMsIG1hdHJpeCAqIGNvZF9zb2x1dGlvbik7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgZ2V0IHRoZSBzYW1lIG1pbmltdW0tbm9ybSBzb2x1dGlvbiBhcyB0aGUgU1ZELgorICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gc3ZkKG1hdHJpeCwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKKyAgTWF0cml4PFNjYWxhciwgQ29scywgQ29sczI+IHN2ZF9zb2x1dGlvbiA9IHN2ZC5zb2x2ZShyaHMpOworICBWRVJJRllfSVNfQVBQUk9YKGNvZF9zb2x1dGlvbiwgc3ZkX3NvbHV0aW9uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcigpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKSwgY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSksIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggcmFuayA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIChzdGQ6Om1pbikocm93cywgY29scyktMSk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICBNYXRyaXhUeXBlIG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLHJvd3MsY29scyxtMSk7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXIobTEpOworICBWRVJJRllfSVNfRVFVQUwocmFuaywgcXIucmFuaygpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNvbHMgLSBxci5yYW5rKCksIHFyLmRpbWVuc2lvbk9mS2VybmVsKCkpOworICBWRVJJRlkoIXFyLmlzSW5qZWN0aXZlKCkpOworICBWRVJJRlkoIXFyLmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKCFxci5pc1N1cmplY3RpdmUoKSk7CisKKyAgTWF0cml4UVR5cGUgcSA9IHFyLmhvdXNlaG9sZGVyUSgpOworICBWRVJJRllfSVNfVU5JVEFSWShxKTsKKworICBNYXRyaXhUeXBlIHIgPSBxci5tYXRyaXhRUigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBNYXRyaXhUeXBlIGMgPSBxICogciAqIHFyLmNvbHNQZXJtdXRhdGlvbigpLmludmVyc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgYyk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkaWFnb25hbCBlbGVtZW50cyBpbiBSIGFyZQorICAvLyBub24taW5jcmVhc2luZyB1bnRpbCB0aGV5IHJlYWNoIHRoZSBzaW5ndWxhcml0eSB0aHJlc2hvbGQuCisgIFJlYWxTY2FsYXIgdGhyZXNob2xkID0KKyAgICAgIHNxcnQoUmVhbFNjYWxhcihyb3dzKSkgKiBudW1leHQ6OmFicyhyKDAsIDApKSAqIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpIC0gMTsgKytpKSB7CisgICAgUmVhbFNjYWxhciB4ID0gbnVtZXh0OjphYnMocihpLCBpKSk7CisgICAgUmVhbFNjYWxhciB5ID0gbnVtZXh0OjphYnMocihpICsgMSwgaSArIDEpKTsKKyAgICBpZiAoeCA8IHRocmVzaG9sZCAmJiB5IDwgdGhyZXNob2xkKSBjb250aW51ZTsKKyAgICBpZiAoIXRlc3RfaXNBcHByb3hPckxlc3NUaGFuKHksIHgpKSB7CisgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsgKytqKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiaSA9ICIgPDwgaiA8PCAiLCB8cl9paXwgPSAiIDw8IG51bWV4dDo6YWJzKHIoaiwgaikpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbHVyZSBhdCBpPSIgPDwgaSA8PCAiLCByYW5rPSIgPDwgcmFuaworICAgICAgICAgICAgICAgIDw8ICIsIHRocmVzaG9sZD0iIDw8IHRocmVzaG9sZCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHksIHgpOworICB9CisKKyAgTWF0cml4VHlwZSBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLGNvbHMyKTsKKyAgTWF0cml4VHlwZSBtMyA9IG0xKm0yOworICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLGNvbHMyKTsKKyAgbTIgPSBxci5zb2x2ZShtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKm0yKTsKKworICB7CisgICAgSW5kZXggc2l6ZSA9IHJvd3M7CisgICAgZG8geworICAgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgICAgIHFyLmNvbXB1dGUobTEpOworICAgIH0gd2hpbGUoIXFyLmlzSW52ZXJ0aWJsZSgpKTsKKyAgICBNYXRyaXhUeXBlIG0xX2ludiA9IHFyLmludmVyc2UoKTsKKyAgICBtMyA9IG0xICogTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsY29sczIpOworICAgIG0yID0gcXIuc29sdmUobTMpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludiptMyk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IENvbHMyPiB2b2lkIHFyX2ZpeGVkc2l6ZSgpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisgIGVudW0geyBSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIENvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBpbnQgcmFuayA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAoc3RkOjptaW4pKGludChSb3dzKSwgaW50KENvbHMpKS0xKTsKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLFJvd3MsQ29scyxtMSk7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PFNjYWxhcixSb3dzLENvbHM+ID4gcXIobTEpOworICBWRVJJRllfSVNfRVFVQUwocmFuaywgcXIucmFuaygpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKENvbHMgLSBxci5yYW5rKCksIHFyLmRpbWVuc2lvbk9mS2VybmVsKCkpOworICBWRVJJRllfSVNfRVFVQUwocXIuaXNJbmplY3RpdmUoKSwgKHJhbmsgPT0gUm93cykpOworICBWRVJJRllfSVNfRVFVQUwocXIuaXNTdXJqZWN0aXZlKCksIChyYW5rID09IENvbHMpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHFyLmlzSW52ZXJ0aWJsZSgpLCAocXIuaXNJbmplY3RpdmUoKSAmJiBxci5pc1N1cmplY3RpdmUoKSkpOworCisgIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiByID0gcXIubWF0cml4UVIoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IGMgPSBxci5ob3VzZWhvbGRlclEoKSAqIHIgKiBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIGMpOworCisgIE1hdHJpeDxTY2FsYXIsQ29scyxDb2xzMj4gbTIgPSBNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+OjpSYW5kb20oQ29scyxDb2xzMik7CisgIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzMj4gbTMgPSBtMSptMjsKKyAgbTIgPSBNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+OjpSYW5kb20oQ29scyxDb2xzMik7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7CisgIC8vIFZlcmlmeSB0aGF0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgaW4gUiBhcmUKKyAgLy8gbm9uLWluY3JlYXNpbmcgdW50aWwgdGhleSByZWFjaGUgdGhlIHNpbmd1bGFyaXR5IHRocmVzaG9sZC4KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPQorICAgICAgc3FydChSZWFsU2NhbGFyKFJvd3MpKSAqIChzdGQ6OmFicykocigwLCAwKSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgKHN0ZDo6bWluKShpbnQoUm93cyksIGludChDb2xzKSkgLSAxOyArK2kpIHsKKyAgICBSZWFsU2NhbGFyIHggPSBudW1leHQ6OmFicyhyKGksIGkpKTsKKyAgICBSZWFsU2NhbGFyIHkgPSBudW1leHQ6OmFicyhyKGkgKyAxLCBpICsgMSkpOworICAgIGlmICh4IDwgdGhyZXNob2xkICYmIHkgPCB0aHJlc2hvbGQpIGNvbnRpbnVlOworICAgIGlmICghdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oeSwgeCkpIHsKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCAoc3RkOjptaW4pKGludChSb3dzKSwgaW50KENvbHMpKTsgKytqKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiaSA9ICIgPDwgaiA8PCAiLCB8cl9paXwgPSAiIDw8IG51bWV4dDo6YWJzKHIoaiwgaikpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbHVyZSBhdCBpPSIgPDwgaSA8PCAiLCByYW5rPSIgPDwgcmFuaworICAgICAgICAgICAgICAgIDw8ICIsIHRocmVzaG9sZD0iIDw8IHRocmVzaG9sZCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHksIHgpOworICB9Cit9CisKKy8vIFRoaXMgdGVzdCBpcyBtZWFudCB0byB2ZXJpZnkgdGhhdCBwaXZvdHMgYXJlIGNob3NlbiBzdWNoIHRoYXQKKy8vIGV2ZW4gZm9yIGEgZ3JhZGVkIG1hdHJpeCwgdGhlIGRpYWdvbmFsIG9mIFIgZmFsbHMgb2Ygcm91Z2hseQorLy8gbW9ub3RvbmljYWxseSB1bnRpbCBpdCByZWFjaGVzIHRoZSB0aHJlc2hvbGQgZm9yIHNpbmd1bGFyaXR5LgorLy8gV2UgdXNlIHRoZSBzby1jYWxsZWQgS2FoYW4gbWF0cml4LCB3aGljaCBpcyBhIGZhbW91cyBjb3VudGVyLWV4YW1wbGUKKy8vIGZvciByYW5rLXJldmVhbGluZyBRUi4gU2VlCisvLyBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2xhd25zcGRmL2xhd24xNzYucGRmCisvLyBwYWdlIDMgZm9yIG1vcmUgZGV0YWlsLgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl9rYWhhbl9tYXRyaXgoKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSAzMDAsIGNvbHMgPSByb3dzOworCisgIE1hdHJpeFR5cGUgbTE7CisgIG0xLnNldFplcm8ocm93cyxjb2xzKTsKKyAgUmVhbFNjYWxhciBzID0gc3RkOjpwb3coTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCksIDEuMCAvIHJvd3MpOworICBSZWFsU2NhbGFyIGMgPSBzdGQ6OnNxcnQoMSAtIHMqcyk7CisgIFJlYWxTY2FsYXIgcG93X3NfaSgxLjApOyAvLyBwb3cocyxpKQorICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CisgICAgbTEoaSwgaSkgPSBwb3dfc19pOworICAgIG0xLnJvdyhpKS50YWlsKHJvd3MgLSBpIC0gMSkgPSAtcG93X3NfaSAqIGMgKiBNYXRyaXhUeXBlOjpPbmVzKDEsIHJvd3MgLSBpIC0gMSk7CisgICAgcG93X3NfaSAqPSBzOworICB9CisgIG0xID0gKG0xICsgbTEudHJhbnNwb3NlKCkpLmV2YWwoKTsKKyAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihtMSk7CisgIE1hdHJpeFR5cGUgciA9IHFyLm1hdHJpeFFSKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisKKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPQorICAgICAgc3RkOjpzcXJ0KFJlYWxTY2FsYXIocm93cykpICogbnVtZXh0OjphYnMocigwLCAwKSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSAtIDE7ICsraSkgeworICAgIFJlYWxTY2FsYXIgeCA9IG51bWV4dDo6YWJzKHIoaSwgaSkpOworICAgIFJlYWxTY2FsYXIgeSA9IG51bWV4dDo6YWJzKHIoaSArIDEsIGkgKyAxKSk7CisgICAgaWYgKHggPCB0aHJlc2hvbGQgJiYgeSA8IHRocmVzaG9sZCkgY29udGludWU7CisgICAgaWYgKCF0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbih5LCB4KSkgeworICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IChzdGQ6Om1pbikocm93cywgY29scyk7ICsraikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImkgPSAiIDw8IGogPDwgIiwgfHJfaWl8ID0gIiA8PCBudW1leHQ6OmFicyhyKGosIGopKSA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWx1cmUgYXQgaT0iIDw8IGkgPDwgIiwgcmFuaz0iIDw8IHFyLnJhbmsoKQorICAgICAgICAgICAgICAgIDw8ICIsIHRocmVzaG9sZD0iIDw8IHRocmVzaG9sZCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHksIHgpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfaW52ZXJ0aWJsZSgpCit7CisgIHVzaW5nIHN0ZDo6bG9nOworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsNTApOworCisgIE1hdHJpeFR5cGUgbTEoc2l6ZSwgc2l6ZSksIG0yKHNpemUsIHNpemUpLCBtMyhzaXplLCBzaXplKTsKKyAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKQorICB7CisgICAgLy8gbGV0J3MgYnVpbGQgYSBtYXRyaXggbW9yZSBzdGFibGUgdG8gaW52ZXJzZQorICAgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUqMik7CisgICAgbTEgKz0gYSAqIGEuYWRqb2ludCgpOworICB9CisKKyAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihtMSk7CisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0yID0gcXIuc29sdmUobTMpOworICAvL1ZFUklGWV9JU19BUFBST1gobTMsIG0xKm0yKTsKKworICAvLyBub3cgY29uc3RydWN0IGEgbWF0cml4IHdpdGggcHJlc2NyaWJlZCBkZXRlcm1pbmFudAorICBtMS5zZXRaZXJvKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG0xKGksaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgUmVhbFNjYWxhciBhYnNkZXQgPSBhYnMobTEuZGlhZ29uYWwoKS5wcm9kKCkpOworICBtMyA9IHFyLmhvdXNlaG9sZGVyUSgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0xID0gbTMgKiBtMSAqIG0zOworICBxci5jb21wdXRlKG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnNkZXQsIHFyLmFic0RldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZyhhYnNkZXQpLCBxci5sb2dBYnNEZXRlcm1pbmFudCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl92ZXJpZnlfYXNzZXJ0KCkKK3sKKyAgTWF0cml4VHlwZSB0bXA7CisKKyAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcjsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIubWF0cml4UVIoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuc29sdmUodG1wKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaG91c2Vob2xkZXJRKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmRpbWVuc2lvbk9mS2VybmVsKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmlzSW5qZWN0aXZlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmlzU3VyamVjdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5pc0ludmVydGlibGUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaW52ZXJzZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5hYnNEZXRlcm1pbmFudCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQorfQorCit2b2lkIHRlc3RfcXJfY29scGl2b3RpbmcoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBxcjxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBxcjxNYXRyaXhYZD4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBxcjxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZmxvYXQsMyw1PiwgNCA+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKCBxcl9maXhlZHNpemU8TWF0cml4PGRvdWJsZSw2LDI+LCAzID4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLDEsMT4sIDEgPigpICkpOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY29kPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNvZDxNYXRyaXhYZD4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjb2Q8TWF0cml4WGNkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBjb2RfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwzLDU+LCA0ID4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGNvZF9maXhlZHNpemU8TWF0cml4PGRvdWJsZSw2LDI+LCAzID4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGNvZF9maXhlZHNpemU8TWF0cml4PGRvdWJsZSwxLDE+LCAxID4oKSApKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHFyX2ludmVydGlibGU8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZD4oKSApOworICB9CisKKyAgQ0FMTF9TVUJURVNUXzcocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSk7CisgIENBTExfU1VCVEVTVF84KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Q+KCkpOworICBDQUxMX1NVQlRFU1RfMShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSk7CisgIENBTExfU1VCVEVTVF82KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzMocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfOShDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFhmPigxMCwgMjApKTsKKworICBDQUxMX1NVQlRFU1RfMSggcXJfa2FoYW5fbWF0cml4PE1hdHJpeFhmPigpICk7CisgIENBTExfU1VCVEVTVF8yKCBxcl9rYWhhbl9tYXRyaXg8TWF0cml4WGQ+KCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcCBiL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU4OWMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9xcl9mdWxscGl2b3RpbmcuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXIoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IG1heF9zaXplID0gRUlHRU5fVEVTVF9NQVhfU0laRTsKKyAgSW5kZXggbWluX3NpemUgPSBudW1leHQ6Om1heGkoMSxFSUdFTl9URVNUX01BWF9TSVpFLzEwKTsKKyAgSW5kZXggcm93cyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSxtYXhfc2l6ZSksCisgICAgICAgIGNvbHMgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4obWluX3NpemUsbWF4X3NpemUpLAorICAgICAgICBjb2xzMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KG1pbl9zaXplLG1heF9zaXplKSwKKyAgICAgICAgcmFuayAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICBNYXRyaXhUeXBlIG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLHJvd3MsY29scyxtMSk7CisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJhbmssIHFyLnJhbmsoKSk7CisgIFZFUklGWV9JU19FUVVBTChjb2xzIC0gcXIucmFuaygpLCBxci5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKCFxci5pc0luamVjdGl2ZSgpKTsKKyAgVkVSSUZZKCFxci5pc0ludmVydGlibGUoKSk7CisgIFZFUklGWSghcXIuaXNTdXJqZWN0aXZlKCkpOworCisgIE1hdHJpeFR5cGUgciA9IHFyLm1hdHJpeFFSKCk7CisgIAorICBNYXRyaXhRVHlwZSBxID0gcXIubWF0cml4USgpOworICBWRVJJRllfSVNfVU5JVEFSWShxKTsKKyAgCisgIC8vIEZJWE1FIG5lZWQgYmV0dGVyIHdheSB0byBjb25zdHJ1Y3QgdHJhcGV6b2lkCisgIGZvcihpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIGZvcihpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIGlmKGk+aikgcihpLGopID0gU2NhbGFyKDApOworCisgIE1hdHJpeFR5cGUgYyA9IHFyLm1hdHJpeFEoKSAqIHIgKiBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgYyk7CisgIAorICAvLyBzdHJlc3MgdGhlIFJldHVybkJ5VmFsdWUgbWVjaGFuaXNtCisgIE1hdHJpeFR5cGUgdG1wOworICBWRVJJRllfSVNfQVBQUk9YKHRtcC5ub2FsaWFzKCkgPSBxci5tYXRyaXhRKCkgKiByLCAocXIubWF0cml4USgpICogcikuZXZhbCgpKTsKKyAgCisgIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIE1hdHJpeFR5cGUgbTMgPSBtMSptMjsKKyAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7CisKKyAgeworICAgIEluZGV4IHNpemUgPSByb3dzOworICAgIGRvIHsKKyAgICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgICAgICBxci5jb21wdXRlKG0xKTsKKyAgICB9IHdoaWxlKCFxci5pc0ludmVydGlibGUoKSk7CisgICAgTWF0cml4VHlwZSBtMV9pbnYgPSBxci5pbnZlcnNlKCk7CisgICAgbTMgPSBtMSAqIE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLGNvbHMyKTsKKyAgICBtMiA9IHFyLnNvbHZlKG0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMV9pbnYqbTMpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfaW52ZXJ0aWJsZSgpCit7CisgIHVzaW5nIHN0ZDo6bG9nOworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggbWF4X3NpemUgPSBudW1leHQ6Om1pbmkoNTAsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIEluZGV4IG1pbl9zaXplID0gbnVtZXh0OjptYXhpKDEsRUlHRU5fVEVTVF9NQVhfU0laRS8xMCk7CisgIEluZGV4IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSxtYXhfc2l6ZSk7CisKKyAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworCisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpCisgIHsKKyAgICAvLyBsZXQncyBidWlsZCBhIG1hdHJpeCBtb3JlIHN0YWJsZSB0byBpbnZlcnNlCisgICAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSoyKTsKKyAgICBtMSArPSBhICogYS5hZGpvaW50KCk7CisgIH0KKworICBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihtMSk7CisgIFZFUklGWShxci5pc0luamVjdGl2ZSgpKTsKKyAgVkVSSUZZKHFyLmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKHFyLmlzU3VyamVjdGl2ZSgpKTsKKworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMiA9IHFyLnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworCisgIC8vIG5vdyBjb25zdHJ1Y3QgYSBtYXRyaXggd2l0aCBwcmVzY3JpYmVkIGRldGVybWluYW50CisgIG0xLnNldFplcm8oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgbTEoaSxpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBSZWFsU2NhbGFyIGFic2RldCA9IGFicyhtMS5kaWFnb25hbCgpLnByb2QoKSk7CisgIG0zID0gcXIubWF0cml4USgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0xID0gbTMgKiBtMSAqIG0zOworICBxci5jb21wdXRlKG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnNkZXQsIHFyLmFic0RldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZyhhYnNkZXQpLCBxci5sb2dBYnNEZXRlcm1pbmFudCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl92ZXJpZnlfYXNzZXJ0KCkKK3sKKyAgTWF0cml4VHlwZSB0bXA7CisKKyAgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXI7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLm1hdHJpeFFSKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLm1hdHJpeFEoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuZGltZW5zaW9uT2ZLZXJuZWwoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaXNJbmplY3RpdmUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaXNTdXJqZWN0aXZlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmlzSW52ZXJ0aWJsZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5pbnZlcnNlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmFic0RldGVybWluYW50KCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmxvZ0Fic0RldGVybWluYW50KCkpCit9CisKK3ZvaWQgdGVzdF9xcl9mdWxscGl2b3RpbmcoKQoreworIGZvcihpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgICAvLyBGSVhNRSA6IHZlcnkgd2VpcmQgYnVnIGhlcmUKKy8vICAgICBDQUxMX1NVQlRFU1QocXIoTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggcXI8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcXI8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcXI8TWF0cml4WGNkPigpICk7CisgIH0KKworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHFyX2ludmVydGlibGU8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgfQorCisgIENBTExfU1VCVEVTVF81KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Y+KCkpOworICBDQUxMX1NVQlRFU1RfNihxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNkPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZj4oKSk7CisgIENBTExfU1VCVEVTVF8yKHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGQ+KCkpOworICBDQUxMX1NVQlRFU1RfNChxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhjZj4oKSk7CisgIENBTExfU1VCVEVTVF8zKHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNkPigpKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzcoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4WGY+KDEwLCAyMCkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDEwLDIwPiA+KDEwLDIwKSkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDEwLDIwPiA+KE1hdHJpeDxmbG9hdCwxMCwyMD46OlJhbmRvbSgpKSkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDIwLDEwPiA+KDIwLDEwKSkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDIwLDEwPiA+KE1hdHJpeDxmbG9hdCwyMCwxMD46OlJhbmRvbSgpKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9xdHZlY3Rvci5jcHAgYi90ZXN0L3F0dmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU4ODVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9xdHZlY3Rvci5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9XT1JLX0FST1VORF9RVF9CVUdfQ0FMTElOR19XUk9OR19PUEVSQVRPUl9ORVdfRklYRURfSU5fUVRfNF81CisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8UXRDb3JlL1FWZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vUXRBbGlnbmVkTWFsbG9jPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19xdHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgUVZlY3RvcjxNYXRyaXhUeXBlPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHkpOworICB9CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5maWxsKHksMjIpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHNpemVfdCkmKHZbMjJdKSA9PSAoc2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKKworICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgTWF0cml4VHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcihpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIFFWZWN0b3I8VHJhbnNmb3JtVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYuZmlsbCh5LDIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGludChpKTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV0ubWF0cml4KCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5tYXRyaXgoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpOworICBRVmVjdG9yPFF1YXRlcm5pb25UeXBlPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5maWxsKHksMjIpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHNpemVfdCkmKHZbMjJdKSA9PSAoc2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpbnQoaSk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLmNvZWZmcygpPT13WyhpLTIzKSV3LnNpemUoKV0uY29lZmZzKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9xdHZlY3RvcigpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShBZmZpbmUyZigpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lM2YoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKEFmZmluZTNkKCkpKTsKKyAgLy9DQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKFRyYW5zZm9ybTRkKCkpKTsKKworICAvLyBzb21lIFF1YXRlcm5pb24KKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfcXVhdGVybmlvbihRdWF0ZXJuaW9uZigpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JhbmQuY3BwIGIvdGVzdC9yYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNmMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYW5kLmNwcApAQCAtMCwwICsxLDExOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBTY2FsYXIgY2hlY2tfaW5fcmFuZ2UoU2NhbGFyIHgsIFNjYWxhciB5KQoreworICBTY2FsYXIgciA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPih4LHkpOworICBWRVJJRlkocj49eCk7CisgIGlmKHk+PXgpCisgIHsKKyAgICBWRVJJRlkocjw9eSk7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBjaGVja19hbGxfaW5fcmFuZ2UoU2NhbGFyIHgsIFNjYWxhciB5KQoreworICBBcnJheTxpbnQsMSxEeW5hbWljPiBtYXNrKHkteCsxKTsKKyAgbWFzay5maWxsKDApOworICBsb25nIG4gPSAoeS14KzEpKjMyOworICBmb3IobG9uZyBrPTA7IGs8bjsgKytrKQorICB7CisgICAgbWFzayggY2hlY2tfaW5fcmFuZ2UoeCx5KS14ICkrKzsKKyAgfQorICBmb3IoSW5kZXggaT0wOyBpPG1hc2suc2l6ZSgpOyArK2kpCisgICAgaWYobWFzayhpKT09MCkKKyAgICAgIHN0ZDo6Y291dCA8PCAiV0FSTklORzogdmFsdWUgIiA8PCB4K2kgPDwgIiBub3QgcmVhY2hlZC4iIDw8IHN0ZDo6ZW5kbDsKKyAgVkVSSUZZKCAobWFzaz4wKS5hbGwoKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgY2hlY2tfaGlzdG9ncmFtKFNjYWxhciB4LCBTY2FsYXIgeSwgaW50IGJpbnMpCit7CisgIEFycmF5PGludCwxLER5bmFtaWM+IGhpc3QoYmlucyk7CisgIGhpc3QuZmlsbCgwKTsKKyAgaW50IGYgPSAxMDAwMDA7CisgIGludCBuID0gYmlucypmOworICBpbnQ2NCByYW5nZSA9IGludDY0KHkpLWludDY0KHgpOworICBpbnQgZGl2aXNvciA9IGludCgocmFuZ2UrMSkvYmlucyk7CisgIGFzc2VydCgoKHJhbmdlKzEpJWJpbnMpPT0wKTsKKyAgZm9yKGludCBrPTA7IGs8bjsgKytrKQorICB7CisgICAgU2NhbGFyIHIgPSBjaGVja19pbl9yYW5nZSh4LHkpOworICAgIGhpc3QoIGludCgoaW50NjQociktaW50NjQoeCkpL2Rpdmlzb3IpICkrKzsKKyAgfQorICBWRVJJRlkoICgoKGhpc3QuY2FzdDxkb3VibGU+KCkvZG91YmxlKGYpKS0xLjApLmFicygpPDAuMDIpLmFsbCgpICk7Cit9CisKK3ZvaWQgdGVzdF9yYW5kKCkKK3sKKyAgbG9uZyBsb25nX3JlZiA9IE51bVRyYWl0czxsb25nPjo6aGlnaGVzdCgpLzEwOworICBzaWduZWQgY2hhciBjaGFyX29mZnNldCA9IChzdGQ6Om1pbikoZ19yZXBlYXQsNjQpOworICBzaWduZWQgY2hhciBzaG9ydF9vZmZzZXQgPSAoc3RkOjptaW4pKGdfcmVwZWF0LDE2MDAwKTsKKworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQqMTAwMDA7IGkrKykgeworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oMTAsMTEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZmxvYXQ+KDEuMjQyMzQ1MjMsMS4yNDIzNDUyMykpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oLTEsMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oLTE0MzIuMjM1MiwtMTQzMi4yMzUyKSk7CisKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigxMCwxMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxkb3VibGU+KDEuMjQyMzQ1MjMsMS4yNDIzNDUyMykpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxkb3VibGU+KC0xLDEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigtMTQzMi4yMzUyLC0xNDMyLjIzNTIpKTsKKworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KDAsLTEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8c2hvcnQ+KDAsLTEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8bG9uZz4oMCwtMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KC02NzM0NTYsNjczNDU2KSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGludD4oLVJBTkRfTUFYKzEwLFJBTkRfTUFYLTEwKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPHNob3J0PigtMjQzNDUsMjQzNDUpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8bG9uZz4oLWxvbmdfcmVmLGxvbmdfcmVmKSk7CisgIH0KKworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigxMSwxMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigxMSwxMStjaGFyX29mZnNldCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigtNSw1KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2lnbmVkIGNoYXI+KC0xMS1jaGFyX29mZnNldCwtMTEpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oLTEyNiwtMTI2K2NoYXJfb2Zmc2V0KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2lnbmVkIGNoYXI+KDEyNi1jaGFyX29mZnNldCwxMjYpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oLTEyNiwxMjYpKTsKKworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigxMSwxMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigxMSwxMStzaG9ydF9vZmZzZXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaG9ydD4oLTUsNSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMTEtc2hvcnRfb2Zmc2V0LC0xMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMjQzNDUsLTI0MzQ1K3Nob3J0X29mZnNldCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigyNDM0NSwyNDM0NStzaG9ydF9vZmZzZXQpKTsKKworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGludD4oMTEsMTEpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDExLDExK2dfcmVwZWF0KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtNSw1KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtMTEtZ19yZXBlYXQsLTExKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtNjczNDU2LC02NzM0NTYrZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDY3MzQ1Niw2NzM0NTYrZ19yZXBlYXQpKTsKKworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGxvbmc+KDExLDExKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oMTEsMTErZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPigtNSw1KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oLTExLWdfcmVwZWF0LC0xMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGxvbmc+KC1sb25nX3JlZiwtbG9uZ19yZWYrZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPiggbG9uZ19yZWYsIGxvbmdfcmVmK2dfcmVwZWF0KSk7CisKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hpc3RvZ3JhbTxpbnQ+KC01LDUsMTEpKTsKKyAgaW50IGJpbnMgPSAxMDA7CisgIENBTExfU1VCVEVTVChjaGVja19oaXN0b2dyYW08aW50PigtMzMzMywtMzMzMytiaW5zKigzMzMzL2JpbnMpLTEsYmlucykpOworICBiaW5zID0gMTAwMDsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hpc3RvZ3JhbTxpbnQ+KC1SQU5EX01BWCsxMCwtUkFORF9NQVgrMTArYmlucyooUkFORF9NQVgvYmlucyktMSxiaW5zKSk7CisgIENBTExfU1VCVEVTVChjaGVja19oaXN0b2dyYW08aW50PigtUkFORF9NQVgrMTAsLWludDY0KFJBTkRfTUFYKSsxMCtiaW5zKigyKmludDY0KFJBTkRfTUFYKS9iaW5zKS0xLGJpbnMpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcmVhbF9xei5jcHAgYi90ZXN0L3JlYWxfcXouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWMzMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JlYWxfcXouY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIEFsZXhleSBLb3JlcGFub3YgPGthaWthaWthaUB5YW5kZXgucnU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1JVTlRJTUVfTk9fTUFMTE9DCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCByZWFsX3F6KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUmVhbFFaLmgKKyAgKi8KKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIEluZGV4IGRpbSA9IG0uY29scygpOworICAKKyAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKGRpbSxkaW0pLAorICAgICAgICAgICAgIEIgPSBNYXRyaXhUeXBlOjpSYW5kb20oZGltLGRpbSk7CisKKworICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA5ODU6IFJhbmRvbWx5IHNldCByb3dzIG9yIGNvbHVtbnMgdG8gemVybworICBJbmRleCBrPWludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGRpbS0xKTsKKyAgc3dpdGNoKGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSkgeworICBjYXNlIDA6CisgICAgQS5yb3coaykuc2V0WmVybygpOyBicmVhazsKKyAgY2FzZSAxOgorICAgIEEuY29sKGspLnNldFplcm8oKTsgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBCLnJvdyhrKS5zZXRaZXJvKCk7IGJyZWFrOworICBjYXNlIDM6CisgICAgQi5jb2woaykuc2V0WmVybygpOyBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIFJlYWxRWjxNYXRyaXhUeXBlPiBxeihkaW0pOworICAvLyBUT0RPIGVuYWJsZSBmdWxsLXByZWFsb2NhdGlvbiBvZiByZXF1aXJlZCBtZW1vcnksIHRoaXMgcHJvYmFibHkgcmVxdWlyZXMgYW4gaW4tcGxhY2UgbW9kZSBmb3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24KKyAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7CisgIHF6LmNvbXB1dGUoQSxCKTsKKyAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgCisgIFZFUklGWV9JU19FUVVBTChxei5pbmZvKCksIFN1Y2Nlc3MpOworICAvLyBjaGVjayBmb3IgemVyb3MKKyAgYm9vbCBhbGxfemVyb3MgPSB0cnVlOworICBmb3IgKEluZGV4IGk9MDsgaTxBLmNvbHMoKTsgaSsrKQorICAgIGZvciAoSW5kZXggaj0wOyBqPGk7IGorKykgeworICAgICAgaWYgKGFicyhxei5tYXRyaXhUKCkoaSxqKSkhPVNjYWxhcigwLjApKQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBUKCIgPDwgaSA8PCAiLCIgPDwgaiA8PCAiKSA9ICIgPDwgcXoubWF0cml4VCgpKGksaikgPDwgc3RkOjplbmRsOworICAgICAgICBhbGxfemVyb3MgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChqPGktMSAmJiBhYnMocXoubWF0cml4UygpKGksaikpIT1TY2FsYXIoMC4wKSkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogUygiIDw8IGkgPDwgIiwiIDw8IGogPDwgIikgPSAiIDw8IHF6Lm1hdHJpeFMoKShpLGopIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgYWxsX3plcm9zID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoaj09aS0xICYmIGo+MCAmJiBhYnMocXoubWF0cml4UygpKGksaikpIT1TY2FsYXIoMC4wKSAmJiBhYnMocXoubWF0cml4UygpKGktMSxqLTEpKSE9U2NhbGFyKDAuMCkpCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IFMoIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIpID0gIiA8PCBxei5tYXRyaXhTKCkoaSxqKSAgPDwgIiAmJiBTKCIgPDwgaS0xIDw8ICIsIiA8PCBqLTEgPDwgIikgPSAiIDw8IHF6Lm1hdHJpeFMoKShpLTEsai0xKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGFsbF96ZXJvcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgVkVSSUZZX0lTX0VRVUFMKGFsbF96ZXJvcywgdHJ1ZSk7CisgIFZFUklGWV9JU19BUFBST1gocXoubWF0cml4USgpKnF6Lm1hdHJpeFMoKSpxei5tYXRyaXhaKCksIEEpOworICBWRVJJRllfSVNfQVBQUk9YKHF6Lm1hdHJpeFEoKSpxei5tYXRyaXhUKCkqcXoubWF0cml4WigpLCBCKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxei5tYXRyaXhRKCkqcXoubWF0cml4USgpLmFkam9pbnQoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoZGltLGRpbSkpOworICBWRVJJRllfSVNfQVBQUk9YKHF6Lm1hdHJpeFooKSpxei5tYXRyaXhaKCkuYWRqb2ludCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eShkaW0sZGltKSk7Cit9CisKK3ZvaWQgdGVzdF9yZWFsX3F6KCkKK3sKKyAgaW50IHMgPSAwOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCByZWFsX3F6KE1hdHJpeDRmKCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHJlYWxfcXooTWF0cml4WGQocyxzKSkgKTsKKworICAgIC8vIHNvbWUgdHJpdmlhbCBidXQgaW1wbGVtZW50YXRpb24td2lzZSB0cmlja3kgY2FzZXMKKyAgICBDQUxMX1NVQlRFU1RfMiggcmVhbF9xeihNYXRyaXhYZCgxLDEpKSApOworICAgIENBTExfU1VCVEVTVF8yKCByZWFsX3F6KE1hdHJpeFhkKDIsMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHJlYWxfcXooTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJlYWxfcXooTWF0cml4MmQoKSkgKTsKKyAgfQorICAKKyAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9yZWR1eC5jcHAgYi90ZXN0L3JlZHV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODllMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZWR1eC5jcHAKQEAgLTAsMCArMSwxNzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhSZWR1eChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgLy8gVGhlIGVudHJpZXMgb2YgbTEgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbiBbMCwxXSwgc28gbTEucHJvZCgpIGlzIHZlcnkgc21hbGwuIFRoaXMgbWF5IGxlYWQgdG8gdGVzdAorICAvLyBmYWlsdXJlcyBpZiB3ZSB1bmRlcmZsb3cgaW50byBkZW5vcm1hbHMuIFRodXMsIHdlIHNjYWxlIHNvIHRoYXQgZW50cmllcyBhcmUgY2xvc2UgdG8gMS4KKyAgTWF0cml4VHlwZSBtMV9mb3JfcHJvZCA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykgKyBSZWFsU2NhbGFyKDAuMikgKiBtMTsKKworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKS5zdW0oKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpPbmVzKHJvd3MsIGNvbHMpLnN1bSgpLCBTY2FsYXIoZmxvYXQocm93cypjb2xzKSkpOyAvLyB0aGUgZmxvYXQoKSBoZXJlIHRvIHNodXQgdXAgZXhjZXNzaXZlIE1TVkMgd2FybmluZyBhYm91dCBpbnQtPmNvbXBsZXggY29udmVyc2lvbiBiZWluZyBsb3NzeQorICBTY2FsYXIgcygwKSwgcCgxKSwgbWluYyhudW1leHQ6OnJlYWwobTEuY29lZmYoMCkpKSwgbWF4YyhudW1leHQ6OnJlYWwobTEuY29lZmYoMCkpKTsKKyAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgeworICAgIHMgKz0gbTEoaSxqKTsKKyAgICBwICo9IG0xX2Zvcl9wcm9kKGksaik7CisgICAgbWluYyA9IChzdGQ6Om1pbikobnVtZXh0OjpyZWFsKG1pbmMpLCBudW1leHQ6OnJlYWwobTEoaSxqKSkpOworICAgIG1heGMgPSAoc3RkOjptYXgpKG51bWV4dDo6cmVhbChtYXhjKSwgbnVtZXh0OjpyZWFsKG0xKGksaikpKTsKKyAgfQorICBjb25zdCBTY2FsYXIgbWVhbiA9IHMvU2NhbGFyKFJlYWxTY2FsYXIocm93cypjb2xzKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zdW0oKSwgcyk7CisgIFZFUklGWV9JU19BUFBST1gobTEubWVhbigpLCBtZWFuKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMV9mb3JfcHJvZC5wcm9kKCksIHApOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnJlYWwoKS5taW5Db2VmZigpLCBudW1leHQ6OnJlYWwobWluYykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnJlYWwoKS5tYXhDb2VmZigpLCBudW1leHQ6OnJlYWwobWF4YykpOworCisgIC8vIHRlc3Qgc2xpY2UgdmVjdG9yaXphdGlvbiBhc3N1bWluZyBhc3NpZ24gaXMgb2sKKyAgSW5kZXggcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgIEluZGV4IGMwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KHIwKzEscm93cyktcjA7CisgIEluZGV4IGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzArMSxjb2xzKS1jMDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCxyMSxjMSkuc3VtKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5ldmFsKCkuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5tZWFuKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5ldmFsKCkubWVhbigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMV9mb3JfcHJvZC5ibG9jayhyMCxjMCxyMSxjMSkucHJvZCgpLCBtMV9mb3JfcHJvZC5ibG9jayhyMCxjMCxyMSxjMSkuZXZhbCgpLnByb2QoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAscjEsYzEpLnJlYWwoKS5taW5Db2VmZigpLCBtMS5ibG9jayhyMCxjMCxyMSxjMSkucmVhbCgpLmV2YWwoKS5taW5Db2VmZigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCxyMSxjMSkucmVhbCgpLm1heENvZWZmKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5yZWFsKCkuZXZhbCgpLm1heENvZWZmKCkpOworCisgIC8vIHJlZ3Jlc3Npb24gZm9yIGJ1ZyAxMDkwCisgIGNvbnN0IGludCBSMSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPj0yID8gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUvMiA6IDY7CisgIGNvbnN0IGludCBDMSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPj0yID8gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUvMiA6IDY7CisgIGlmKFIxPD1yb3dzLXIwICYmIEMxPD1jb2xzLWMwKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLnRlbXBsYXRlIGJsb2NrPFIxLEMxPihyMCxjMCkuc3VtKCkpLCBtMS5ibG9jayhyMCxjMCxSMSxDMSkuc3VtKCkgKTsKKyAgfQorICAKKyAgLy8gdGVzdCBlbXB0eSBvYmplY3RzCisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAsMCwwKS5zdW0oKSwgICBTY2FsYXIoMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLDAsMCkucHJvZCgpLCAgU2NhbGFyKDEpKTsKKworICAvLyB0ZXN0IG5lc3RpbmcgY29tcGxleCBleHByZXNzaW9uCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCAobTEubWF0cml4KCkqbTEubWF0cml4KCkudHJhbnNwb3NlKCkpLnN1bSgpLCAoTWF0cml4VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lICYmIE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT0xID8gMCA6IDEpICk7CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gbTIocm93cyxyb3dzKTsKKyAgbTIuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCAoKG0xLm1hdHJpeCgpKm0xLm1hdHJpeCgpLnRyYW5zcG9zZSgpKSttMikuc3VtKCksKE1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSE9MSA/IDAgOiAxKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgdmVjdG9yUmVkdXgoY29uc3QgVmVjdG9yVHlwZSYgdykKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBJbmRleCBzaXplID0gdy5zaXplKCk7CisKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworICBWZWN0b3JUeXBlIHZfZm9yX3Byb2QgPSBWZWN0b3JUeXBlOjpPbmVzKHNpemUpICsgU2NhbGFyKDAuMikgKiB2OyAvLyBzZWUgY29tbWVudCBhYm92ZSBkZWNsYXJhdGlvbiBvZiBtMV9mb3JfcHJvZAorCisgIGZvcihpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspCisgIHsKKyAgICBTY2FsYXIgcygwKSwgcCgxKTsKKyAgICBSZWFsU2NhbGFyIG1pbmMobnVtZXh0OjpyZWFsKHYuY29lZmYoMCkpKSwgbWF4YyhudW1leHQ6OnJlYWwodi5jb2VmZigwKSkpOworICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspCisgICAgeworICAgICAgcyArPSB2W2pdOworICAgICAgcCAqPSB2X2Zvcl9wcm9kW2pdOworICAgICAgbWluYyA9IChzdGQ6Om1pbikobWluYywgbnVtZXh0OjpyZWFsKHZbal0pKTsKKyAgICAgIG1heGMgPSAoc3RkOjptYXgpKG1heGMsIG51bWV4dDo6cmVhbCh2W2pdKSk7CisgICAgfQorICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMocyAtIHYuaGVhZChpKS5zdW0oKSksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChwLCB2X2Zvcl9wcm9kLmhlYWQoaSkucHJvZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYucmVhbCgpLmhlYWQoaSkubWluQ29lZmYoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCB2LnJlYWwoKS5oZWFkKGkpLm1heENvZWZmKCkpOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemUtMTsgaSsrKQorICB7CisgICAgU2NhbGFyIHMoMCksIHAoMSk7CisgICAgUmVhbFNjYWxhciBtaW5jKG51bWV4dDo6cmVhbCh2LmNvZWZmKGkpKSksIG1heGMobnVtZXh0OjpyZWFsKHYuY29lZmYoaSkpKTsKKyAgICBmb3IoaW50IGogPSBpOyBqIDwgc2l6ZTsgaisrKQorICAgIHsKKyAgICAgIHMgKz0gdltqXTsKKyAgICAgIHAgKj0gdl9mb3JfcHJvZFtqXTsKKyAgICAgIG1pbmMgPSAoc3RkOjptaW4pKG1pbmMsIG51bWV4dDo6cmVhbCh2W2pdKSk7CisgICAgICBtYXhjID0gKHN0ZDo6bWF4KShtYXhjLCBudW1leHQ6OnJlYWwodltqXSkpOworICAgIH0KKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKHMgLSB2LnRhaWwoc2l6ZS1pKS5zdW0oKSksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChwLCB2X2Zvcl9wcm9kLnRhaWwoc2l6ZS1pKS5wcm9kKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWluYywgdi5yZWFsKCkudGFpbChzaXplLWkpLm1pbkNvZWZmKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkudGFpbChzaXplLWkpLm1heENvZWZmKCkpOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemUvMjsgaSsrKQorICB7CisgICAgU2NhbGFyIHMoMCksIHAoMSk7CisgICAgUmVhbFNjYWxhciBtaW5jKG51bWV4dDo6cmVhbCh2LmNvZWZmKGkpKSksIG1heGMobnVtZXh0OjpyZWFsKHYuY29lZmYoaSkpKTsKKyAgICBmb3IoaW50IGogPSBpOyBqIDwgc2l6ZS1pOyBqKyspCisgICAgeworICAgICAgcyArPSB2W2pdOworICAgICAgcCAqPSB2X2Zvcl9wcm9kW2pdOworICAgICAgbWluYyA9IChzdGQ6Om1pbikobWluYywgbnVtZXh0OjpyZWFsKHZbal0pKTsKKyAgICAgIG1heGMgPSAoc3RkOjptYXgpKG1heGMsIG51bWV4dDo6cmVhbCh2W2pdKSk7CisgICAgfQorICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMocyAtIHYuc2VnbWVudChpLCBzaXplLTIqaSkuc3VtKCkpLCBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1gocCwgdl9mb3JfcHJvZC5zZWdtZW50KGksIHNpemUtMippKS5wcm9kKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWluYywgdi5yZWFsKCkuc2VnbWVudChpLCBzaXplLTIqaSkubWluQ29lZmYoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCB2LnJlYWwoKS5zZWdtZW50KGksIHNpemUtMippKS5tYXhDb2VmZigpKTsKKyAgfQorICAKKyAgLy8gdGVzdCBlbXB0eSBvYmplY3RzCisgIFZFUklGWV9JU19BUFBST1godi5oZWFkKDApLnN1bSgpLCAgIFNjYWxhcigwKSk7CisgIFZFUklGWV9JU19BUFBST1godi50YWlsKDApLnByb2QoKSwgIFNjYWxhcigxKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHYuaGVhZCgwKS5tZWFuKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2LmhlYWQoMCkubWluQ29lZmYoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHYuaGVhZCgwKS5tYXhDb2VmZigpKTsKK30KKwordm9pZCB0ZXN0X3JlZHV4KCkKK3sKKyAgLy8gdGhlIG1heCBzaXplIGNhbm5vdCBiZSB0b28gbGFyZ2UsIG90aGVyd2lzZSByZWR1eGlvbiBvcGVyYXRpb25zIG9idmlvdXNseSBnZW5lcmF0ZSBsYXJnZSBlcnJvcnMuCisgIGludCBtYXhzaXplID0gKHN0ZDo6bWluKSgxMDAsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUobWF4c2l6ZSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hdHJpeFJlZHV4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWF0cml4UmVkdXgoQXJyYXk8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KEFycmF5MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWF0cml4UmVkdXgoQXJyYXkyMmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoQXJyYXk0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXRyaXhSZWR1eChBcnJheTQ0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXRyaXhSZWR1eChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWF0cml4UmVkdXgoQXJyYXlYWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hdHJpeFJlZHV4KE1hdHJpeFhkIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXRyaXhSZWR1eChBcnJheVhYZCAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbWF0cml4UmVkdXgoTWF0cml4WGkgKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hdHJpeFJlZHV4KEFycmF5WFhpIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KFZlY3RvcjRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KEFycmF5NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yUmVkdXgoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCB2ZWN0b3JSZWR1eChBcnJheVhkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggdmVjdG9yUmVkdXgoVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF84KCB2ZWN0b3JSZWR1eChBcnJheVhmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9yZWYuY3BwIGIvdGVzdC9yZWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OWRiMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JlZi5jcHAKQEAgLTAsMCArMSwyODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAxMyBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgdW5pdCB0ZXN0IGNhbm5vdCBiZSBlYXNpbHkgd3JpdHRlbiB0byB3b3JrIHdpdGggRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyNpZmRlZiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorI3VuZGVmIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisjZW5kaWYKKworI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKworI2luY2x1ZGUgIm1haW4uaCIKKworLy8gdGVzdCBSZWYuaAorCisvLyBEZWFsIHdpdGggaTM4NyBleHRlbmRlZCBwcmVjaXNpb24KKyNpZiBFSUdFTl9BUkNIX2kzODYgJiYgIShFSUdFTl9BUkNIX3g4Nl82NCkKKworI2lmIEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgJiYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDQpCisjcHJhZ21hIEdDQyBvcHRpbWl6ZSAoIi1mZmxvYXQtc3RvcmUiKQorI2Vsc2UKKyN1bmRlZiBWRVJJRllfSVNfRVFVQUwKKyNkZWZpbmUgVkVSSUZZX0lTX0VRVUFMKFgsWSkgVkVSSUZZX0lTX0FQUFJPWChYLFkpCisjZW5kaWYKKworI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcmVmX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLE1hdHJpeFR5cGU6Ok9wdGlvbnM+IER5bk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljLE1hdHJpeFR5cGU6Ok9wdGlvbnM+IFJlYWxEeW5NYXRyaXhUeXBlOworICAKKyAgdHlwZWRlZiBSZWY8TWF0cml4VHlwZT4gUmVmTWF0OworICB0eXBlZGVmIFJlZjxEeW5NYXRyaXhUeXBlPiBSZWZEeW5NYXQ7CisgIHR5cGVkZWYgUmVmPGNvbnN0IER5bk1hdHJpeFR5cGU+IENvbnN0UmVmRHluTWF0OworICB0eXBlZGVmIFJlZjxSZWFsRHluTWF0cml4VHlwZSAsIDAsIFN0cmlkZTxEeW5hbWljLER5bmFtaWM+ID4gUmVmUmVhbE1hdFdpdGhTdHJpZGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpLCBjb2xzID0gbS5jb2xzKCk7CisgIAorICBNYXRyaXhUeXBlICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgbTIgPSBtMTsKKyAgCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgIEluZGV4IGJyb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLWkpOworICBJbmRleCBiY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scy1qKTsKKyAgCisgIFJlZk1hdCBybTAgPSBtMTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJtMCwgbTEpOworICBSZWZEeW5NYXQgcm0xID0gbTE7CisgIFZFUklGWV9JU19FUVVBTChybTEsIG0xKTsKKyAgUmVmRHluTWF0IHJtMiA9IG0xLmJsb2NrKGksaixicm93cyxiY29scyk7CisgIFZFUklGWV9JU19FUVVBTChybTIsIG0xLmJsb2NrKGksaixicm93cyxiY29scykpOworICBybTIuc2V0T25lcygpOworICBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpLnNldE9uZXMoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLCBtMik7CisgIAorICBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpLnNldFJhbmRvbSgpOworICBybTIgPSBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpOworICBWRVJJRllfSVNfRVFVQUwobTEsIG0yKTsKKyAgCisgIENvbnN0UmVmRHluTWF0IHJtMyA9IG0xLmJsb2NrKGksaixicm93cyxiY29scyk7CisgIG0xLmJsb2NrKGksaixicm93cyxiY29scykgKj0gMjsKKyAgbTIuYmxvY2soaSxqLGJyb3dzLGJjb2xzKSAqPSAyOworICBWRVJJRllfSVNfRVFVQUwocm0zLCBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpKTsKKyAgUmVmUmVhbE1hdFdpdGhTdHJpZGUgcm00ID0gbTEucmVhbCgpOworICBWRVJJRllfSVNfRVFVQUwocm00LCBtMi5yZWFsKCkpOworICBybTQuYXJyYXkoKSArPSAxOworICBtMi5yZWFsKCkuYXJyYXkoKSArPSAxOworICBWRVJJRllfSVNfRVFVQUwobTEsIG0yKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCByZWZfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDEsVmVjdG9yVHlwZTo6T3B0aW9ucz4gRHluTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDEsVmVjdG9yVHlwZTo6T3B0aW9ucz4gUmVhbER5bk1hdHJpeFR5cGU7CisgIAorICB0eXBlZGVmIFJlZjxWZWN0b3JUeXBlPiBSZWZNYXQ7CisgIHR5cGVkZWYgUmVmPER5bk1hdHJpeFR5cGU+IFJlZkR5bk1hdDsKKyAgdHlwZWRlZiBSZWY8Y29uc3QgRHluTWF0cml4VHlwZT4gQ29uc3RSZWZEeW5NYXQ7CisgIHR5cGVkZWYgUmVmPFJlYWxEeW5NYXRyaXhUeXBlICwgMCwgSW5uZXJTdHJpZGU8PiA+IFJlZlJlYWxNYXRXaXRoU3RyaWRlOworICB0eXBlZGVmIFJlZjxEeW5NYXRyaXhUeXBlICwgMCwgSW5uZXJTdHJpZGU8PiA+IFJlZk1hdFdpdGhTdHJpZGU7CisKKyAgSW5kZXggc2l6ZSA9IG0uc2l6ZSgpOworICAKKyAgVmVjdG9yVHlwZSAgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSksCisgICAgICAgICAgICAgIHYyID0gdjE7CisgIE1hdHJpeFR5cGUgbWF0MSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpLAorICAgICAgICAgICAgIG1hdDIgPSBtYXQxLAorICAgICAgICAgICAgIG1hdDMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNpemUtMSk7CisgIEluZGV4IGJzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxzaXplLWkpOworICAKKyAgUmVmTWF0IHJtMCA9IHYxOworICBWRVJJRllfSVNfRVFVQUwocm0wLCB2MSk7CisgIFJlZkR5bk1hdCBydjEgPSB2MTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJ2MSwgdjEpOworICBSZWZEeW5NYXQgcnYyID0gdjEuc2VnbWVudChpLGJzaXplKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJ2MiwgdjEuc2VnbWVudChpLGJzaXplKSk7CisgIHJ2Mi5zZXRPbmVzKCk7CisgIHYyLnNlZ21lbnQoaSxic2l6ZSkuc2V0T25lcygpOworICBWRVJJRllfSVNfRVFVQUwodjEsIHYyKTsKKyAgCisgIHYyLnNlZ21lbnQoaSxic2l6ZSkuc2V0UmFuZG9tKCk7CisgIHJ2MiA9IHYyLnNlZ21lbnQoaSxic2l6ZSk7CisgIFZFUklGWV9JU19FUVVBTCh2MSwgdjIpOworICAKKyAgQ29uc3RSZWZEeW5NYXQgcm0zID0gdjEuc2VnbWVudChpLGJzaXplKTsKKyAgdjEuc2VnbWVudChpLGJzaXplKSAqPSAyOworICB2Mi5zZWdtZW50KGksYnNpemUpICo9IDI7CisgIFZFUklGWV9JU19FUVVBTChybTMsIHYyLnNlZ21lbnQoaSxic2l6ZSkpOworICAKKyAgUmVmUmVhbE1hdFdpdGhTdHJpZGUgcm00ID0gdjEucmVhbCgpOworICBWRVJJRllfSVNfRVFVQUwocm00LCB2Mi5yZWFsKCkpOworICBybTQuYXJyYXkoKSArPSAxOworICB2Mi5yZWFsKCkuYXJyYXkoKSArPSAxOworICBWRVJJRllfSVNfRVFVQUwodjEsIHYyKTsKKyAgCisgIFJlZk1hdFdpdGhTdHJpZGUgcm01ID0gbWF0MS5yb3coaSkudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19FUVVBTChybTUsIG1hdDEucm93KGkpLnRyYW5zcG9zZSgpKTsKKyAgcm01LmFycmF5KCkgKz0gMTsKKyAgbWF0Mi5yb3coaSkuYXJyYXkoKSArPSAxOworICBWRVJJRllfSVNfRVFVQUwobWF0MSwgbWF0Mik7CisgIHJtNS5ub2FsaWFzKCkgPSBybTQudHJhbnNwb3NlKCkgKiBtYXQzOworICBtYXQyLnJvdyhpKSA9IHYyLnJlYWwoKS50cmFuc3Bvc2UoKSAqIG1hdDM7CisgIFZFUklGWV9JU19BUFBST1gobWF0MSwgbWF0Mik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gdm9pZCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmKQoreworICAvLyB2ZXJpZnkgdGhhdCByZWYtdG8tY29uc3QgZG9uJ3QgaGF2ZSBMdmFsdWVCaXQKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0PFBsYWluT2JqZWN0VHlwZT46OnR5cGUgQ29uc3RQbGFpbk9iamVjdFR5cGU7CisgIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPFJlZjxDb25zdFBsYWluT2JqZWN0VHlwZT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPFJlZjxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKFJlZjxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD46OkZsYWdzICYgTHZhbHVlQml0KSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8xKFJlZjxWZWN0b3JYZj4gYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMihjb25zdCBSZWY8Y29uc3QgVmVjdG9yWGY+JiBhLCBjb25zdCBCICZiKSB7IFZFUklGWV9JU19FUVVBTChhLGIpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8zKFJlZjxWZWN0b3JYZiwwLElubmVyU3RyaWRlPD4gPiBhLCBjb25zdCBCICZiKSB7IFZFUklGWV9JU19FUVVBTChhLGIpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl80KGNvbnN0IFJlZjxjb25zdCBWZWN0b3JYZiwwLElubmVyU3RyaWRlPD4gPiYgYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNShSZWY8TWF0cml4WGYsMCxPdXRlclN0cmlkZTw+ID4gYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNihjb25zdCBSZWY8Y29uc3QgTWF0cml4WGYsMCxPdXRlclN0cmlkZTw+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEsYik7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzcoUmVmPE1hdHJpeDxmbG9hdCxEeW5hbWljLDM+ID4gYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQorCit2b2lkIGNhbGxfcmVmKCkKK3sKKyAgVmVjdG9yWGNmIGNhICA9IFZlY3RvclhjZjo6UmFuZG9tKDEwKTsKKyAgVmVjdG9yWGYgYSAgICA9IFZlY3RvclhmOjpSYW5kb20oMTApOworICBSb3dWZWN0b3JYZiBiID0gUm93VmVjdG9yWGY6OlJhbmRvbSgxMCk7CisgIE1hdHJpeFhmIEEgICAgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDEwKTsKKyAgUm93VmVjdG9yM2YgYyA9IFJvd1ZlY3RvcjNmOjpSYW5kb20oKTsKKyAgY29uc3QgVmVjdG9yWGYmIGFjKGEpOworICBWZWN0b3JCbG9jazxWZWN0b3JYZj4gYWIoYSwwLDMpOworICBjb25zdCBWZWN0b3JCbG9jazxWZWN0b3JYZj4gYWJjKGEsMCwzKTsKKyAgCisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoYSxhKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKGIsYi50cmFuc3Bvc2UoKSksIDApOworLy8gICBjYWxsX3JlZl8xKGFjLGE8Yyk7ICAgICAgICAgICAvLyBkb2VzIG5vdCBjb21waWxlIGJlY2F1c2UgYWMgaXMgY29uc3QKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoYWIsYWIpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoYS5oZWFkKDQpLGEuaGVhZCg0KSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShhYmMsYWJjKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKEEuY29sKDMpLEEuY29sKDMpKSwgMCk7CisvLyAgIGNhbGxfcmVmXzEoQS5yb3coMyksQS5yb3coMykpOyAgICAvLyBkb2VzIG5vdCBjb21waWxlIGJlY2F1c2UgaW5uZXJzdHJpZGUhPTEKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzMoQS5yb3coMyksQS5yb3coMykudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoQS5yb3coMyksQS5yb3coMykudHJhbnNwb3NlKCkpLCAwKTsKKy8vICAgY2FsbF9yZWZfMShhK2EsIGErYSk7ICAgICAgICAgIC8vIGRvZXMgbm90IGNvbXBpbGUgZm9yIG9idmlvdXMgcmVhc29uCisKKyAgTWF0cml4WGYgdG1wID0gQSpBLmNvbCgxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoQSpBLmNvbCgxKSwgdG1wKSwgMSk7ICAgICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoYWMuaGVhZCg1KSxhYy5oZWFkKDUpKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKGFjLGFjKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKGEsYSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihhYixhYiksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihhLmhlYWQoNCksYS5oZWFkKDQpKSwgMCk7CisgIHRtcCA9IGErYTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoYSthLHRtcCksIDEpOyAgICAgICAgICAgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcAorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihjYS5pbWFnKCksY2EuaW1hZygpKSwgMSk7ICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wCisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoYWMuaGVhZCg1KSxhYy5oZWFkKDUpKSwgMCk7CisgIHRtcCA9IGErYTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoYSthLHRtcCksIDEpOyAgICAgICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl80KGNhLmltYWcoKSxjYS5pbWFnKCkpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNShhLGEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoYS5oZWFkKDMpLGEuaGVhZCgzKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNShBLEEpLCAwKTsKKy8vICAgY2FsbF9yZWZfNShBLnRyYW5zcG9zZSgpLEEudHJhbnNwb3NlKCkpOyAgIC8vIGRvZXMgbm90IGNvbXBpbGUgYmVjYXVzZSBzdG9yYWdlIG9yZGVyIGRvZXMgbm90IG1hdGNoCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KEEuYmxvY2soMSwxLDIsMiksQS5ibG9jaygxLDEsMiwyKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNShiLGIpLCAwKTsgICAgICAgICAgICAgLy8gc3RvcmFnZSBvcmRlciBkbyBub3QgbWF0Y2gsIGJ1dCB0aGlzIGlzIGEgZGVnZW5lcmF0ZSBjYXNlIHRoYXQgc2hvdWxkIHdvcmsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoYS5yb3coMyksYS5yb3coMykpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihhLGEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzYoYS5oZWFkKDMpLGEuaGVhZCgzKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihBLnJvdygzKSxBLnJvdygzKSksIDEpOyAgICAgICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wIHRob3V0aCBpdCBjb3VsZCBiZSBhdm9pZGVkIGJ5IHZpZXdpbmcgaXQgYXMgYSAxeG4gbWF0cml4CisgIHRtcCA9IEErQTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzYoQStBLHRtcCksIDEpOyAgICAgICAgICAgICAgICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzYoQSxBKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl82KEEudHJhbnNwb3NlKCksQS50cmFuc3Bvc2UoKSksIDEpOyAgICAgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcCBiZWNhdXNlIHRoZSBzdG9yYWdlIG9yZGVycyBkbyBub3QgbWF0Y2gKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzYoQS5ibG9jaygxLDEsMiwyKSxBLmJsb2NrKDEsMSwyLDIpKSwgMCk7CisgIAorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNyhjLGMpLCAwKTsKK30KKwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4gUm93TWF0cml4WGQ7CitpbnQgdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMShSZWY8TWF0cml4WGQ+ICkgICAgICAgeyByZXR1cm4gMTsgfQoraW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEoUmVmPFJvd01hdHJpeFhkPiApICAgIHsgcmV0dXJuIDI7IH0KK2ludCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4xKFJlZjxNYXRyaXhYZj4gKSAgICAgICB7IHJldHVybiAzOyB9CisKK2ludCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKFJlZjxjb25zdCBNYXRyaXhYZD4gKSB7IHJldHVybiA0OyB9CitpbnQgdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihSZWY8Y29uc3QgTWF0cml4WGY+ICkgeyByZXR1cm4gNTsgfQorCit2b2lkIHRlc3RfcmVmX2FtYmlndW91cyhjb25zdCBSZWY8Y29uc3QgQXJyYXlYZD4gJkEsIFJlZjxBcnJheVhkPiBCKQoreworICBCID0gQTsKKyAgQiA9IEEgLSBBOworfQorCisvLyBTZWUgYWxzbyBidWcgOTY5Cit2b2lkIHRlc3RfcmVmX292ZXJsb2FkcygpCit7CisgIE1hdHJpeFhkIEFkLCBCZDsKKyAgUm93TWF0cml4WGQgckFkLCByQmQ7CisgIFZFUklGWSggdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMShBZCk9PTEgKTsKKyAgVkVSSUZZKCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4xKHJBZCk9PTIgKTsKKyAgCisgIE1hdHJpeFhmIEFmLCBCZjsKKyAgVkVSSUZZKCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKEFkKT09NCApOworICBWRVJJRlkoIHRlc3RfcmVmX292ZXJsb2FkX2Z1bjIoQWQrQmQpPT00ICk7CisgIFZFUklGWSggdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihBZitCZik9PTUgKTsKKyAgCisgIEFycmF5WGQgQSwgQjsKKyAgdGVzdF9yZWZfYW1iaWd1b3VzKEEsIEIpOworfQorCit2b2lkIHRlc3RfcmVmKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcmVmX3ZlY3RvcihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcmVmX3ZlY3RvcihWZWN0b3I0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCByZWZfdmVjdG9yKFZlY3RvcjRjZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCByZWZfdmVjdG9yKFZlY3RvclhjZig4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcmVmX3ZlY3RvcihWZWN0b3JYaSgxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFZlY3RvclhpKDEyKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCByZWZfbWF0cml4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcmVmX21hdHJpeChNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8xKCByZWZfbWF0cml4KE1hdHJpeDxmbG9hdCwzLDU+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJlZl9tYXRyaXgoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCkpKSApOworICAgIENBTExfU1VCVEVTVF80KCByZWZfbWF0cml4KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwxMCwxNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcmVmX21hdHJpeChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggY2FsbF9yZWYoKSApOworICB9CisgIAorICBDQUxMX1NVQlRFU1RfNyggdGVzdF9yZWZfb3ZlcmxvYWRzKCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcmVzaXplLmNwcCBiL3Rlc3QvcmVzaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWRhYWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZXNpemUuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEtlaXIgTWllcmxlIDxtaWVybGVAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8RGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHM+Cit2b2lkIHJlc2l6ZUxpa2VUZXN0KCkKK3sKKyAgTWF0cml4WGYgQShyb3dzLCBjb2xzKTsKKyAgTWF0cml4WGYgQjsKKyAgTWF0cml4PGRvdWJsZSwgcm93cywgY29scz4gQzsKKyAgQi5yZXNpemVMaWtlKEEpOworICBDLnJlc2l6ZUxpa2UoQik7ICAvLyBTaG91bGRuJ3QgY3Jhc2guCisgIFZFUklGWShCLnJvd3MoKSA9PSByb3dzICYmIEIuY29scygpID09IGNvbHMpOworCisgIFZlY3RvclhmIHgocm93cyk7CisgIFJvd1ZlY3RvclhmIHk7CisgIHkucmVzaXplTGlrZSh4KTsKKyAgVkVSSUZZKHkucm93cygpID09IDEgJiYgeS5jb2xzKCkgPT0gcm93cyk7CisKKyAgeS5yZXNpemUoY29scyk7CisgIHgucmVzaXplTGlrZSh5KTsKKyAgVkVSSUZZKHgucm93cygpID09IGNvbHMgJiYgeC5jb2xzKCkgPT0gMSk7Cit9CisKK3ZvaWQgcmVzaXplTGlrZVRlc3QxMigpIHsgcmVzaXplTGlrZVRlc3Q8MSwyPigpOyB9Cit2b2lkIHJlc2l6ZUxpa2VUZXN0MTAyMCgpIHsgcmVzaXplTGlrZVRlc3Q8MTAsMjA+KCk7IH0KK3ZvaWQgcmVzaXplTGlrZVRlc3QzMSgpIHsgcmVzaXplTGlrZVRlc3Q8MywxPigpOyB9CisKK3ZvaWQgdGVzdF9yZXNpemUoKQoreworICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QxMigpICk7CisgIENBTExfU1VCVEVTVChyZXNpemVMaWtlVGVzdDEwMjAoKSApOworICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QzMSgpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3J2YWx1ZV90eXBlcy5jcHAgYi90ZXN0L3J2YWx1ZV90eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4N2YxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnZhbHVlX3R5cGVzLmNwcApAQCAtMCwwICsxLDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKwordXNpbmcgaW50ZXJuYWw6OlVJbnRQdHI7CisKKyNpZiBFSUdFTl9IQVNfUlZBTFVFX1JFRkVSRU5DRVMKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBydmFsdWVfY29weWFzc2lnbihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIC8vIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aGljaCB3ZSBhcmUgYWJvdXQgdG8gZGVzdHJveSBieSBtb3ZpbmcKKyAgTWF0cml4VHlwZSB0bXAgPSBtOworICBVSW50UHRyIHNyY19hZGRyZXNzID0gcmVpbnRlcnByZXRfY2FzdDxVSW50UHRyPih0bXAuZGF0YSgpKTsKKyAgCisgIC8vIG1vdmUgdGhlIHRlbXBvcmFyeSB0byBuCisgIE1hdHJpeFR5cGUgbiA9IHN0ZDo6bW92ZSh0bXApOworICBVSW50UHRyIGRzdF9hZGRyZXNzID0gcmVpbnRlcnByZXRfY2FzdDxVSW50UHRyPihuLmRhdGEoKSk7CisKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljfHwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgIHsKKyAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBtb3ZlZCB0aGUgZ3V0cworICAgIFZFUklGWV9JU19FUVVBTChzcmNfYWRkcmVzcywgZHN0X2FkZHJlc3MpOworICB9CisKKyAgLy8gdmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnQgZGlkIG5vdCBjaGFuZ2UKKyAgU2NhbGFyIGFic19kaWZmID0gKG0tbikuYXJyYXkoKS5hYnMoKS5zdW0oKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGFic19kaWZmLCBTY2FsYXIoMCkpOworfQorI2Vsc2UKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBydmFsdWVfY29weWFzc2lnbihjb25zdCBNYXRyaXhUeXBlJikge30KKyNlbmRpZgorCit2b2lkIHRlc3RfcnZhbHVlX3R5cGVzKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIE1hdHJpeFhmOjpSYW5kb20oNTAsNTApLmV2YWwoKSApKTsKKyAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5WFhmOjpSYW5kb20oNTAsNTApLmV2YWwoKSApKTsKKworICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbiggTWF0cml4PGZsb2F0LDEsRHluYW1pYz46OlJhbmRvbSg1MCkuZXZhbCgpICkpOworICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsMSxEeW5hbWljPjo6UmFuZG9tKDUwKS5ldmFsKCkgKSk7CisKKyAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIE1hdHJpeDxmbG9hdCxEeW5hbWljLDE+OjpSYW5kb20oNTApLmV2YWwoKSApKTsKKyAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LER5bmFtaWMsMT46OlJhbmRvbSg1MCkuZXZhbCgpICkpOworICAKKyAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LDIsMT46OlJhbmRvbSgpLmV2YWwoKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LDMsMT46OlJhbmRvbSgpLmV2YWwoKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LDQsMT46OlJhbmRvbSgpLmV2YWwoKSApKTsKKworICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsMiwyPjo6UmFuZG9tKCkuZXZhbCgpICkpOworICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsMywzPjo6UmFuZG9tKCkuZXZhbCgpICkpOworICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsNCw0Pjo6UmFuZG9tKCkuZXZhbCgpICkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2h1cl9jb21wbGV4LmNwcCBiL3Rlc3Qvc2NodXJfY29tcGxleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViNzhlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NodXJfY29tcGxleC5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMiBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2NodXIoaW50IHNpemUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OkNvbXBsZXhTY2FsYXIgQ29tcGxleFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OkNvbXBsZXhNYXRyaXhUeXBlIENvbXBsZXhNYXRyaXhUeXBlOworCisgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogVCBpcyB0cmlhbmd1bGFyIGFuZCBBID0gVSBUIFUqCisgIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7CisgICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICAgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2NodXJPZkEuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBDb21wbGV4TWF0cml4VHlwZSBVID0gc2NodXJPZkEubWF0cml4VSgpOworICAgIENvbXBsZXhNYXRyaXhUeXBlIFQgPSBzY2h1ck9mQS5tYXRyaXhUKCk7CisgICAgZm9yKGludCByb3cgPSAxOyByb3cgPCBzaXplOyArK3JvdykgeworICAgICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCByb3c7ICsrY29sKSB7CisgICAgICAgIFZFUklGWShUKHJvdyxjb2wpID09ICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIpMCk7CisgICAgICB9CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1goQS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCksIFUgKiBUICogVS5hZGpvaW50KCkpOworICB9CisKKyAgLy8gVGVzdCBhc3NlcnRzIHdoZW4gbm90IGluaXRpYWxpemVkCisgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBjc1VuaW5pdGlhbGl6ZWQ7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNzVW5pbml0aWFsaXplZC5tYXRyaXhUKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjc1VuaW5pdGlhbGl6ZWQubWF0cml4VSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY3NVbmluaXRpYWxpemVkLmluZm8oKSk7CisgIAorICAvLyBUZXN0IHdoZXRoZXIgY29tcHV0ZSgpIGFuZCBjb25zdHJ1Y3RvciByZXR1cm5zIHNhbWUgcmVzdWx0CisgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzMTsKKyAgY3MxLmNvbXB1dGUoQSk7CisgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBjczIoQSk7CisgIFZFUklGWV9JU19FUVVBTChjczEuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMi5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfRVFVQUwoY3MxLm1hdHJpeFQoKSwgY3MyLm1hdHJpeFQoKSk7CisgIFZFUklGWV9JU19FUVVBTChjczEubWF0cml4VSgpLCBjczIubWF0cml4VSgpKTsKKworICAvLyBUZXN0IG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKyAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzMzsKKyAgY3MzLnNldE1heEl0ZXJhdGlvbnMoQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjptX21heEl0ZXJhdGlvbnNQZXJSb3cgKiBzaXplKS5jb21wdXRlKEEpOworICBWRVJJRllfSVNfRVFVQUwoY3MzLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChjczMubWF0cml4VCgpLCBjczEubWF0cml4VCgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMy5tYXRyaXhVKCksIGNzMS5tYXRyaXhVKCkpOworICBjczMuc2V0TWF4SXRlcmF0aW9ucygxKS5jb21wdXRlKEEpOworICBWRVJJRllfSVNfRVFVQUwoY3MzLmluZm8oKSwgc2l6ZSA+IDEgPyBOb0NvbnZlcmdlbmNlIDogU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChjczMuZ2V0TWF4SXRlcmF0aW9ucygpLCAxKTsKKworICBNYXRyaXhUeXBlIEF0cmlhbmd1bGFyID0gQTsKKyAgQXRyaWFuZ3VsYXIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS5zZXRaZXJvKCk7IAorICBjczMuc2V0TWF4SXRlcmF0aW9ucygxKS5jb21wdXRlKEF0cmlhbmd1bGFyKTsgLy8gdHJpYW5ndWxhciBtYXRyaWNlcyBkbyBub3QgbmVlZCBhbnkgaXRlcmF0aW9ucworICBWRVJJRllfSVNfRVFVQUwoY3MzLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChjczMubWF0cml4VCgpLCBBdHJpYW5ndWxhci50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCkpOworICBWRVJJRllfSVNfRVFVQUwoY3MzLm1hdHJpeFUoKSwgQ29tcGxleE1hdHJpeFR5cGU6OklkZW50aXR5KHNpemUsIHNpemUpKTsKKworICAvLyBUZXN0IGNvbXB1dGF0aW9uIG9mIG9ubHkgVCwgbm90IFUKKyAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzT25seVQoQSwgZmFsc2UpOworICBWRVJJRllfSVNfRVFVQUwoY3NPbmx5VC5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfRVFVQUwoY3MxLm1hdHJpeFQoKSwgY3NPbmx5VC5tYXRyaXhUKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjc09ubHlULm1hdHJpeFUoKSk7CisKKyAgaWYgKHNpemUgPiAxICYmIHNpemUgPCAyMCkKKyAgeworICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCisgICAgQSgwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzTmFOKEEpOworICAgIFZFUklGWV9JU19FUVVBTChjc05hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zY2h1cl9jb21wbGV4KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEoKCBzY2h1cjxNYXRyaXg0Y2Q+KCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggc2NodXI8TWF0cml4WGNmPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCBzY2h1cjxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMT4gPigpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIHNjaHVyPE1hdHJpeDxmbG9hdCwgMywgMywgRWlnZW46OlJvd01ham9yPiA+KCkgKSk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF81KENvbXBsZXhTY2h1cjxNYXRyaXhYZj4oMTApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc2NodXJfcmVhbC5jcHAgYi90ZXN0L3NjaHVyX3JlYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWRlODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaHVyX3JlYWwuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCwyMDEyIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB2ZXJpZnlJc1F1YXNpVHJpYW5ndWxhcihjb25zdCBNYXRyaXhUeXBlJiBUKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIGNvbnN0IEluZGV4IHNpemUgPSBULmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIC8vIENoZWNrIFQgaXMgbG93ZXIgSGVzc2VuYmVyZworICBmb3IoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCByb3cgLSAxOyArK2NvbCkgeworICAgICAgVkVSSUZZKFQocm93LGNvbCkgPT0gU2NhbGFyKDApKTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0aGF0IGFueSBub24temVybyBvbiB0aGUgc3ViZGlhZ29uYWwgaXMgZm9sbG93ZWQgYnkgYSB6ZXJvIGFuZCBpcworICAvLyBwYXJ0IG9mIGEgMngyIGRpYWdvbmFsIGJsb2NrIHdpdGggaW1hZ2luYXJ5IGVpZ2VudmFsdWVzLgorICBmb3IoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgaWYgKFQocm93LHJvdy0xKSAhPSBTY2FsYXIoMCkpIHsKKyAgICAgIFZFUklGWShyb3cgPT0gc2l6ZS0xIHx8IFQocm93KzEscm93KSA9PSAwKTsKKyAgICAgIFNjYWxhciB0ciA9IFQocm93LTEscm93LTEpICsgVChyb3cscm93KTsKKyAgICAgIFNjYWxhciBkZXQgPSBUKHJvdy0xLHJvdy0xKSAqIFQocm93LHJvdykgLSBUKHJvdy0xLHJvdykgKiBUKHJvdyxyb3ctMSk7CisgICAgICBWRVJJRlkoNCAqIGRldCA+IHRyICogdHIpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNjaHVyKGludCBzaXplID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpCit7CisgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogVCBpcyBxdWFzaS10cmlhbmd1bGFyIGFuZCBBID0gVSBUIFUqCisgIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7CisgICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2NodXJPZkEuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBNYXRyaXhUeXBlIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisgICAgTWF0cml4VHlwZSBUID0gc2NodXJPZkEubWF0cml4VCgpOworICAgIHZlcmlmeUlzUXVhc2lUcmlhbmd1bGFyKFQpOworICAgIFZFUklGWV9JU19BUFBST1goQSwgVSAqIFQgKiBVLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIC8vIFRlc3QgYXNzZXJ0cyB3aGVuIG5vdCBpbml0aWFsaXplZAorICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnNVbmluaXRpYWxpemVkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChyc1VuaW5pdGlhbGl6ZWQubWF0cml4VCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocnNVbmluaXRpYWxpemVkLm1hdHJpeFUoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHJzVW5pbml0aWFsaXplZC5pbmZvKCkpOworICAKKyAgLy8gVGVzdCB3aGV0aGVyIGNvbXB1dGUoKSBhbmQgY29uc3RydWN0b3IgcmV0dXJucyBzYW1lIHJlc3VsdAorICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiByczE7CisgIHJzMS5jb21wdXRlKEEpOworICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnMyKEEpOworICBWRVJJRllfSVNfRVFVQUwocnMxLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChyczIuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJzMS5tYXRyaXhUKCksIHJzMi5tYXRyaXhUKCkpOworICBWRVJJRllfSVNfRVFVQUwocnMxLm1hdHJpeFUoKSwgcnMyLm1hdHJpeFUoKSk7CisKKyAgLy8gVGVzdCBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zCisgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiByczM7CisgIHJzMy5zZXRNYXhJdGVyYXRpb25zKFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6bV9tYXhJdGVyYXRpb25zUGVyUm93ICogc2l6ZSkuY29tcHV0ZShBKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJzMy5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfRVFVQUwocnMzLm1hdHJpeFQoKSwgcnMxLm1hdHJpeFQoKSk7CisgIFZFUklGWV9JU19FUVVBTChyczMubWF0cml4VSgpLCByczEubWF0cml4VSgpKTsKKyAgaWYgKHNpemUgPiAyKSB7CisgICAgcnMzLnNldE1heEl0ZXJhdGlvbnMoMSkuY29tcHV0ZShBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocnMzLmluZm8oKSwgTm9Db252ZXJnZW5jZSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJzMy5nZXRNYXhJdGVyYXRpb25zKCksIDEpOworICB9CisKKyAgTWF0cml4VHlwZSBBdHJpYW5ndWxhciA9IEE7CisgIEF0cmlhbmd1bGFyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOyAKKyAgcnMzLnNldE1heEl0ZXJhdGlvbnMoMSkuY29tcHV0ZShBdHJpYW5ndWxhcik7IC8vIHRyaWFuZ3VsYXIgbWF0cmljZXMgZG8gbm90IG5lZWQgYW55IGl0ZXJhdGlvbnMKKyAgVkVSSUZZX0lTX0VRVUFMKHJzMy5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfQVBQUk9YKHJzMy5tYXRyaXhUKCksIEF0cmlhbmd1bGFyKTsgLy8gYXBwcm94IGJlY2F1c2Ugb2Ygc2NhbGluZy4uLgorICBWRVJJRllfSVNfRVFVQUwocnMzLm1hdHJpeFUoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoc2l6ZSwgc2l6ZSkpOworCisgIC8vIFRlc3QgY29tcHV0YXRpb24gb2Ygb25seSBULCBub3QgVQorICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnNPbmx5VChBLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTChyc09ubHlULmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChyczEubWF0cml4VCgpLCByc09ubHlULm1hdHJpeFQoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHJzT25seVQubWF0cml4VSgpKTsKKworICBpZiAoc2l6ZSA+IDIgJiYgc2l6ZSA8IDIwKQorICB7CisgICAgLy8gVGVzdCBtYXRyaXggd2l0aCBOYU4KKyAgICBBKDAsMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OnF1aWV0X05hTigpOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiByc05hTihBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocnNOYU4uaW5mbygpLCBOb0NvbnZlcmdlbmNlKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc2NodXJfcmVhbCgpCit7CisgIENBTExfU1VCVEVTVF8xKCggc2NodXI8TWF0cml4NGY+KCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggc2NodXI8TWF0cml4WGQ+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCkpICkpOworICBDQUxMX1NVQlRFU1RfMygoIHNjaHVyPE1hdHJpeDxmbG9hdCwgMSwgMT4gPigpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIHNjaHVyPE1hdHJpeDxkb3VibGUsIDMsIDMsIEVpZ2VuOjpSb3dNYWpvcj4gPigpICkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfNShSZWFsU2NodXI8TWF0cml4WGY+KDEwKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NlbGZhZGpvaW50LmNwcCBiL3Rlc3Qvc2VsZmFkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDAxZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NlbGZhZGpvaW50LmNwcApAQCAtMCwwICsxLDcyIEBACisvLyBUaGlzIGZpbGUgaXMgdHJpYW5ndWxhclZpZXcgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhlIGJhc2ljIHNlbGZhZGpvaW50VmlldyBBUEksCisvLyB0aGUgcmVsYXRlZCBwcm9kdWN0cyBhbmQgZGVjb21wb3NpdGlvbnMgYXJlIHRlc3RlZCBpbiBzcGVjaWZpYyBmaWxlcy4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzZWxmYWRqb2ludChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtNChyb3dzLCBjb2xzKTsKKworICBtMS5kaWFnb25hbCgpID0gbTEuZGlhZ29uYWwoKS5yZWFsKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisKKyAgLy8gY2hlY2sgc2VsZmFkam9pbnQgdG8gZGVuc2UKKyAgbTMgPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSksIE1hdHJpeFR5cGUobTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTMuYWRqb2ludCgpKTsKKworICBtMyA9IG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKSwgTWF0cml4VHlwZShtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMy5hZGpvaW50KCkpOworCisgIG0zID0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICBtNCA9IG0yOworICBtNCArPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1gobTQsIG0yK20zKTsKKworICBtMyA9IG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgbTQgPSBtMjsKKyAgbTQgLT0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMi1tMyk7Cit9CisKK3ZvaWQgYnVnXzE1OSgpCit7CisgIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCkuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobSkKK30KKwordm9pZCB0ZXN0X3NlbGZhZGpvaW50KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBzZWxmYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc2VsZmFkam9pbnQoTWF0cml4M2NmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHNlbGZhZGpvaW50KE1hdHJpeFhjZChzLHMpKSApOworICAgIENBTExfU1VCVEVTVF81KCBzZWxmYWRqb2ludChNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihzLCBzKSkgKTsKKyAgICAKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCisgIH0KKyAgCisgIENBTExfU1VCVEVTVF8xKCBidWdfMTU5KCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltcGxpY2lhbF9jaG9sZXNreS5jcHAgYi90ZXN0L3NpbXBsaWNpYWxfY2hvbGVza3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWM4MTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NpbXBsaWNpYWxfY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBJPiB2b2lkIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UKCkKK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8VCwwLEk+IFNwYXJzZU1hdHJpeFR5cGU7CisgIFNpbXBsaWNpYWxDaG9sZXNreTxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlcj4gY2hvbF9jb2xtYWpvcl9sb3dlcl9hbWQ7CisgIFNpbXBsaWNpYWxDaG9sZXNreTxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlcj4gY2hvbF9jb2xtYWpvcl91cHBlcl9hbWQ7CisgIFNpbXBsaWNpYWxMTFQ8ICAgICBTcGFyc2VNYXRyaXhUeXBlLCBMb3dlcj4gbGx0X2NvbG1ham9yX2xvd2VyX2FtZDsKKyAgU2ltcGxpY2lhbExMVDwgICAgIFNwYXJzZU1hdHJpeFR5cGUsIFVwcGVyPiBsbHRfY29sbWFqb3JfdXBwZXJfYW1kOworICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgTG93ZXI+IGxkbHRfY29sbWFqb3JfbG93ZXJfYW1kOworICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgVXBwZXI+IGxkbHRfY29sbWFqb3JfdXBwZXJfYW1kOworICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgTG93ZXIsIE5hdHVyYWxPcmRlcmluZzxJPiA+IGxkbHRfY29sbWFqb3JfbG93ZXJfbmF0OworICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgVXBwZXIsIE5hdHVyYWxPcmRlcmluZzxJPiA+IGxkbHRfY29sbWFqb3JfdXBwZXJfbmF0OworCisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX2xvd2VyX2FtZCk7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX3VwcGVyX2FtZCk7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsbHRfY29sbWFqb3JfbG93ZXJfYW1kKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGxsdF9jb2xtYWpvcl91cHBlcl9hbWQpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl9sb3dlcl9hbWQpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl91cHBlcl9hbWQpOworICAKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChjaG9sX2NvbG1ham9yX2xvd2VyX2FtZCk7CisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoY2hvbF9jb2xtYWpvcl91cHBlcl9hbWQpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxsdF9jb2xtYWpvcl9sb3dlcl9hbWQpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxsdF9jb2xtYWpvcl91cHBlcl9hbWQpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxkbHRfY29sbWFqb3JfbG93ZXJfYW1kKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChsZGx0X2NvbG1ham9yX3VwcGVyX2FtZCk7CisgIAorICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl9sb3dlcl9uYXQsIDMwMCwgMTAwMCk7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsZGx0X2NvbG1ham9yX3VwcGVyX25hdCwgMzAwLCAxMDAwKTsKK30KKwordm9pZCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3koKQoreworICBDQUxMX1NVQlRFU1RfMSgoIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZSxpbnQ+KCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggdGVzdF9zaW1wbGljaWFsX2Nob2xlc2t5X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVDxkb3VibGUsbG9uZyBpbnQ+KCkgKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NpemVvZi5jcHAgYi90ZXN0L3NpemVvZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhZDIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2l6ZW9mLmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdmVyaWZ5U2l6ZU9mKGNvbnN0IE1hdHJpeFR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSE9RHluYW1pYyAmJiBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSE9RHluYW1pYykKKyAgICBWRVJJRllfSVNfRVFVQUwoc3RkOjpwdHJkaWZmX3Qoc2l6ZW9mKE1hdHJpeFR5cGUpKSxzdGQ6OnB0cmRpZmZfdChzaXplb2YoU2NhbGFyKSkqc3RkOjpwdHJkaWZmX3QoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUpKTsKKyAgZWxzZQorICAgIFZFUklGWV9JU19FUVVBTChzaXplb2YoTWF0cml4VHlwZSksc2l6ZW9mKFNjYWxhciopICsgMiAqIHNpemVvZih0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCkpOworfQorCit2b2lkIHRlc3Rfc2l6ZW9mKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDIsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDMsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDQsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDUsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDYsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDcsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDgsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDksIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDEwLCAxPigpKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCAxMSwgMT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihBcnJheTxmbG9hdCwgMTIsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoVmVjdG9yMmQoKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihWZWN0b3I0ZigpKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDRkKCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGRvdWJsZSwgNCwgMj4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8Ym9vbCwgNywgNT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXhYY2YoMywgMykpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGkoOCwgMTIpKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeFhjZCgyMCwgMjApKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpICk7CisgIAorICBWRVJJRlkoc2l6ZW9mKHN0ZDo6Y29tcGxleDxmbG9hdD4pID09IDIqc2l6ZW9mKGZsb2F0KSk7CisgIFZFUklGWShzaXplb2Yoc3RkOjpjb21wbGV4PGRvdWJsZT4pID09IDIqc2l6ZW9mKGRvdWJsZSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaXplb3ZlcmZsb3cuY3BwIGIvdGVzdC9zaXplb3ZlcmZsb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGQyMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NpemVvdmVyZmxvdy5jcHAKQEAgLTAsMCArMSw2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjZGVmaW5lIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIHRocmV3ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYpIHsgdGhyZXcgPSB0cnVlOyB9ICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZKHRocmV3ICYmICJzaG91bGQgaGF2ZSB0aHJvd24gYmFkX2FsbG9jOiAiICNhKTsgICAgIFwKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0cmlnZ2VyTWF0cml4QmFkQWxsb2MoSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpICk7CisgIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoIE1hdHJpeFR5cGUgbTsgbS5yZXNpemUocm93cywgY29scykgKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggTWF0cml4VHlwZSBtOyBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzLCBjb2xzKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB0cmlnZ2VyVmVjdG9yQmFkQWxsb2MoSW5kZXggc2l6ZSkKK3sKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggVmVjdG9yVHlwZSB2KHNpemUpICk7CisgIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoIFZlY3RvclR5cGUgdjsgdi5yZXNpemUoc2l6ZSkgKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggVmVjdG9yVHlwZSB2OyB2LmNvbnNlcnZhdGl2ZVJlc2l6ZShzaXplKSApOworfQorCit2b2lkIHRlc3Rfc2l6ZW92ZXJmbG93KCkKK3sKKyAgLy8gdGhlcmUgYXJlIDIgbGV2ZWxzIG9mIG92ZXJmbG93IGNoZWNraW5nLiBmaXJzdCBpbiBQbGFpbk9iamVjdEJhc2UuaCB3ZSBjaGVjayBmb3Igb3ZlcmZsb3cgaW4gcm93cypjb2xzIGNvbXB1dGF0aW9ucy4KKyAgLy8gdGhpcyBpcyB0ZXN0ZWQgaW4gdGVzdHMgb2YgdGhlIGZvcm0gdGltZXNfaXRzZWxmX2dpdmVzXzAgKiB0aW1lc19pdHNlbGZfZ2l2ZXNfMAorICAvLyBUaGVuIGluIE1lbW9yeS5oIHdlIGNoZWNrIGZvciBvdmVyZmxvdyBpbiBzaXplICogc2l6ZW9mKFQpIGNvbXB1dGF0aW9ucy4KKyAgLy8gdGhpcyBpcyB0ZXN0ZWQgaW4gdGVzdHMgb2YgdGhlIGZvcm0gdGltZXNfNF9naXZlc18wICogc2l6ZW9mKGZsb2F0KQorICAKKyAgc2l6ZV90IHRpbWVzX2l0c2VsZl9naXZlc18wID0gc2l6ZV90KDEpIDw8ICg4ICogc2l6ZW9mKEluZGV4KSAvIDIpOworICBWRVJJRlkodGltZXNfaXRzZWxmX2dpdmVzXzAgKiB0aW1lc19pdHNlbGZfZ2l2ZXNfMCA9PSAwKTsKKworICBzaXplX3QgdGltZXNfNF9naXZlc18wID0gc2l6ZV90KDEpIDw8ICg4ICogc2l6ZW9mKEluZGV4KSAtIDIpOworICBWRVJJRlkodGltZXNfNF9naXZlc18wICogNCA9PSAwKTsKKworICBzaXplX3QgdGltZXNfOF9naXZlc18wID0gc2l6ZV90KDEpIDw8ICg4ICogc2l6ZW9mKEluZGV4KSAtIDMpOworICBWRVJJRlkodGltZXNfOF9naXZlc18wICogOCA9PSAwKTsKKworICB0cmlnZ2VyTWF0cml4QmFkQWxsb2M8TWF0cml4WGY+KHRpbWVzX2l0c2VsZl9naXZlc18wLCB0aW1lc19pdHNlbGZfZ2l2ZXNfMCk7CisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZj4odGltZXNfaXRzZWxmX2dpdmVzXzAgLyA0LCB0aW1lc19pdHNlbGZfZ2l2ZXNfMCk7CisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZj4odGltZXNfNF9naXZlc18wLCAxKTsKKworICB0cmlnZ2VyTWF0cml4QmFkQWxsb2M8TWF0cml4WGQ+KHRpbWVzX2l0c2VsZl9naXZlc18wLCB0aW1lc19pdHNlbGZfZ2l2ZXNfMCk7CisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZD4odGltZXNfaXRzZWxmX2dpdmVzXzAgLyA4LCB0aW1lc19pdHNlbGZfZ2l2ZXNfMCk7CisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZD4odGltZXNfOF9naXZlc18wLCAxKTsKKyAgCisgIHRyaWdnZXJWZWN0b3JCYWRBbGxvYzxWZWN0b3JYZj4odGltZXNfNF9naXZlc18wKTsKKyAgCisgIHRyaWdnZXJWZWN0b3JCYWRBbGxvYzxWZWN0b3JYZD4odGltZXNfOF9naXZlc18wKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc21hbGx2ZWN0b3JzLmNwcCBiL3Rlc3Qvc21hbGx2ZWN0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE1MTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zbWFsbHZlY3RvcnMuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzbWFsbFZlY3RvcnMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIDI+IFYyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFYzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIDQ+IFY0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IFZYOworICBTY2FsYXIgeDEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHgyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICB4MyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgeDQgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgVjIgdjIoeDEsIHgyKTsKKyAgVjMgdjMoeDEsIHgyLCB4Myk7CisgIFY0IHY0KHgxLCB4MiwgeDMsIHg0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MSwgdjIueCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MSwgdjMueCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MSwgdjQueCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgdjIueSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgdjMueSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgdjQueSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MywgdjMueigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MywgdjQueigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4NCwgdjQudygpKTsKKworICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWMygyLCAxKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWMygzLCAyKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWMyhTY2FsYXIoMyksIDEpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFYzKDMsIFNjYWxhcigxKSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjMoU2NhbGFyKDMpLCBTY2FsYXIoMSkpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFYzKFNjYWxhcigxMjMpLCBTY2FsYXIoMTIzKSkpCisKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWNCgxLCAzKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWNCgyLCA0KSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWNCgxLCBTY2FsYXIoNCkpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFY0KFNjYWxhcigxKSwgNCkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjQoU2NhbGFyKDEpLCBTY2FsYXIoNCkpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFY0KFNjYWxhcigxMjMpLCBTY2FsYXIoMTIzKSkpCisKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWWCgzLCAyKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWWChTY2FsYXIoMyksIDEpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFZYKDMsIFNjYWxhcigxKSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVlgoU2NhbGFyKDMpLCBTY2FsYXIoMSkpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFZYKFNjYWxhcigxMjMpLCBTY2FsYXIoMTIzKSkpCisgIH0KK30KKwordm9pZCB0ZXN0X3NtYWxsdmVjdG9ycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUKHNtYWxsVmVjdG9yczxpbnQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUKHNtYWxsVmVjdG9yczxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2UuaCBiL3Rlc3Qvc3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxMmUxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RFU1RTUEFSU0VfSAorI2RlZmluZSBFSUdFTl9URVNUU1BBUlNFX0gKKworI2RlZmluZSBFSUdFTl9ZRVNfSV9LTk9XX1NQQVJTRV9NT0RVTEVfSVNfTk9UX1NUQUJMRV9ZRVQKKworI2luY2x1ZGUgIm1haW4uaCIKKworI2lmIEVJR0VOX0dOVUNfQVRfTEVBU1QoNCwwKSAmJiAhZGVmaW5lZCBfX0lDQyAmJiAhZGVmaW5lZChfX2NsYW5nX18pCisKKyNpZmRlZiBtaW4KKyN1bmRlZiBtaW4KKyNlbmRpZgorCisjaWZkZWYgbWF4CisjdW5kZWYgbWF4CisjZW5kaWYKKworI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorI2RlZmluZSBFSUdFTl9VTk9SREVSRURfTUFQX1NVUFBPUlQKK25hbWVzcGFjZSBzdGQgeworICB1c2luZyBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDsKK30KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fR09PR0xFSEFTSF9TVVBQT1JUCisgICNpbmNsdWRlIDxnb29nbGUvc3BhcnNlX2hhc2hfbWFwPgorI2VuZGlmCisKKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisKK2VudW0geworICBGb3JjZU5vblplcm9EaWFnID0gMSwKKyAgTWFrZUxvd2VyVHJpYW5ndWxhciA9IDIsCisgIE1ha2VVcHBlclRyaWFuZ3VsYXIgPSA0LAorICBGb3JjZVJlYWxEaWFnID0gOAorfTsKKworLyogSW5pdGlhbGl6ZXMgYm90aCBhIHNwYXJzZSBhbmQgZGVuc2UgbWF0cml4IHdpdGggc2FtZSByYW5kb20gdmFsdWVzLAorICogYW5kIGEgcmF0aW8gb2YgXGEgZGVuc2l0eSBub24gemVybyBlbnRyaWVzLgorICogXHBhcmFtIGZsYWdzIGlzIGEgdW5pb24gb2YgRm9yY2VOb25aZXJvRGlhZywgTWFrZUxvd2VyVHJpYW5ndWxhciBhbmQgTWFrZVVwcGVyVHJpYW5ndWxhcgorICogICAgICAgIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIHNoYXBlIG9mIHRoZSBtYXRyaXguCisgKiBccGFyYW0gemVyb0Nvb3JkcyBhbmQgbm9uemVyb0Nvb3JkcyBhbGxvd3MgdG8gZ2V0IHRoZSBjb29yZGluYXRlIGxpc3RzIG9mIHRoZSBub24gemVybywKKyAqICAgICAgICBhbmQgemVybyBjb2VmZmljaWVudHMgcmVzcGVjdGl2ZWx5LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IE9wdDEsaW50IE9wdDIsdHlwZW5hbWUgU3RvcmFnZUluZGV4PiB2b2lkCitpbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxPcHQxPiYgcmVmTWF0LAorICAgICAgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdDIsU3RvcmFnZUluZGV4PiYgc3BhcnNlTWF0LAorICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRyaXg8U3RvcmFnZUluZGV4LDIsMT4gPiogemVyb0Nvb3JkcyA9IDAsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdHJpeDxTdG9yYWdlSW5kZXgsMiwxPiA+KiBub256ZXJvQ29vcmRzID0gMCkKK3sKKyAgZW51bSB7IElzUm93TWFqb3IgPSBTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdDIsU3RvcmFnZUluZGV4Pjo6SXNSb3dNYWpvciB9OworICBzcGFyc2VNYXQuc2V0WmVybygpOworICAvL3NwYXJzZU1hdC5yZXNlcnZlKGludChyZWZNYXQucm93cygpKnJlZk1hdC5jb2xzKCkqZGVuc2l0eSkpOworICBzcGFyc2VNYXQucmVzZXJ2ZShWZWN0b3JYaTo6Q29uc3RhbnQoSXNSb3dNYWpvciA/IHJlZk1hdC5yb3dzKCkgOiByZWZNYXQuY29scygpLCBpbnQoKDEuNSpkZW5zaXR5KSooSXNSb3dNYWpvcj9yZWZNYXQuY29scygpOnJlZk1hdC5yb3dzKCkpKSkpOworICAKKyAgZm9yKEluZGV4IGo9MDsgajxzcGFyc2VNYXQub3V0ZXJTaXplKCk7IGorKykKKyAgeworICAgIC8vc3BhcnNlTWF0LnN0YXJ0VmVjKGopOworICAgIGZvcihJbmRleCBpPTA7IGk8c3BhcnNlTWF0LmlubmVyU2l6ZSgpOyBpKyspCisgICAgeworICAgICAgSW5kZXggYWkoaSksIGFqKGopOworICAgICAgaWYoSXNSb3dNYWpvcikKKyAgICAgICAgc3RkOjpzd2FwKGFpLGFqKTsKKyAgICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IFNjYWxhcigwKTsKKyAgICAgIGlmICgoZmxhZ3MmRm9yY2VOb25aZXJvRGlhZykgJiYgKGk9PWopKQorICAgICAgeworICAgICAgICAvLyBGSVhNRTogdGhlIGZvbGxvd2luZyBpcyB0b28gY29uc2VydmF0aXZlCisgICAgICAgIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSpTY2FsYXIoMy4pOworICAgICAgICB2ID0gdip2OworICAgICAgICBpZihudW1leHQ6OnJlYWwodik+MCkgdiArPSBTY2FsYXIoNSk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB2IC09IFNjYWxhcig1KTsKKyAgICAgIH0KKyAgICAgIGlmICgoZmxhZ3MgJiBNYWtlTG93ZXJUcmlhbmd1bGFyKSAmJiBhaj5haSkKKyAgICAgICAgdiA9IFNjYWxhcigwKTsKKyAgICAgIGVsc2UgaWYgKChmbGFncyAmIE1ha2VVcHBlclRyaWFuZ3VsYXIpICYmIGFqPGFpKQorICAgICAgICB2ID0gU2NhbGFyKDApOworCisgICAgICBpZiAoKGZsYWdzJkZvcmNlUmVhbERpYWcpICYmIChpPT1qKSkKKyAgICAgICAgdiA9IG51bWV4dDo6cmVhbCh2KTsKKworICAgICAgaWYgKHYhPVNjYWxhcigwKSkKKyAgICAgIHsKKyAgICAgICAgLy9zcGFyc2VNYXQuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGkpID0gdjsKKyAgICAgICAgc3BhcnNlTWF0Lmluc2VydEJ5T3V0ZXJJbm5lcihqLGkpID0gdjsKKyAgICAgICAgaWYgKG5vbnplcm9Db29yZHMpCisgICAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKE1hdHJpeDxTdG9yYWdlSW5kZXgsMiwxPiAoYWksYWopKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHplcm9Db29yZHMpCisgICAgICB7CisgICAgICAgIHplcm9Db29yZHMtPnB1c2hfYmFjayhNYXRyaXg8U3RvcmFnZUluZGV4LDIsMT4gKGFpLGFqKSk7CisgICAgICB9CisgICAgICByZWZNYXQoYWksYWopID0gdjsKKyAgICB9CisgIH0KKyAgLy9zcGFyc2VNYXQuZmluYWxpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBPcHQxLGludCBPcHQyLHR5cGVuYW1lIEluZGV4PiB2b2lkCitpbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYywgT3B0MT4mIHJlZk1hdCwKKyAgICAgICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXIsIE9wdDIsIEluZGV4PiYgc3BhcnNlTWF0LAorICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRyaXg8SW5kZXgsMiwxPiA+KiB6ZXJvQ29vcmRzID0gMCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0cml4PEluZGV4LDIsMT4gPiogbm9uemVyb0Nvb3JkcyA9IDApCit7CisgIGVudW0geyBJc1Jvd01ham9yID0gRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXIsT3B0MixJbmRleD46OklzUm93TWFqb3IgfTsKKyAgc3BhcnNlTWF0LnNldFplcm8oKTsKKyAgc3BhcnNlTWF0LnJlc2VydmUoaW50KHJlZk1hdC5yb3dzKCkqcmVmTWF0LmNvbHMoKSpkZW5zaXR5KSk7CisgIGZvcihpbnQgaj0wOyBqPHNwYXJzZU1hdC5vdXRlclNpemUoKTsgaisrKQorICB7CisgICAgc3BhcnNlTWF0LnN0YXJ0VmVjKGopOyAvLyBub3QgbmVlZGVkIGZvciBEeW5hbWljU3BhcnNlTWF0cml4CisgICAgZm9yKGludCBpPTA7IGk8c3BhcnNlTWF0LmlubmVyU2l6ZSgpOyBpKyspCisgICAgeworICAgICAgaW50IGFpKGkpLCBhaihqKTsKKyAgICAgIGlmKElzUm93TWFqb3IpCisgICAgICAgIHN0ZDo6c3dhcChhaSxhaik7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7CisgICAgICBpZiAoKGZsYWdzJkZvcmNlTm9uWmVyb0RpYWcpICYmIChpPT1qKSkKKyAgICAgIHsKKyAgICAgICAgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKlNjYWxhcigzLik7CisgICAgICAgIHYgPSB2KnYgKyBTY2FsYXIoNS4pOworICAgICAgfQorICAgICAgaWYgKChmbGFncyAmIE1ha2VMb3dlclRyaWFuZ3VsYXIpICYmIGFqPmFpKQorICAgICAgICB2ID0gU2NhbGFyKDApOworICAgICAgZWxzZSBpZiAoKGZsYWdzICYgTWFrZVVwcGVyVHJpYW5ndWxhcikgJiYgYWo8YWkpCisgICAgICAgIHYgPSBTY2FsYXIoMCk7CisKKyAgICAgIGlmICgoZmxhZ3MmRm9yY2VSZWFsRGlhZykgJiYgKGk9PWopKQorICAgICAgICB2ID0gbnVtZXh0OjpyZWFsKHYpOworCisgICAgICBpZiAodiE9U2NhbGFyKDApKQorICAgICAgeworICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGkpID0gdjsKKyAgICAgICAgaWYgKG5vbnplcm9Db29yZHMpCisgICAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKE1hdHJpeDxJbmRleCwyLDE+IChhaSxhaikpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoemVyb0Nvb3JkcykKKyAgICAgIHsKKyAgICAgICAgemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKE1hdHJpeDxJbmRleCwyLDE+IChhaSxhaikpOworICAgICAgfQorICAgICAgcmVmTWF0KGFpLGFqKSA9IHY7CisgICAgfQorICB9CisgIHNwYXJzZU1hdC5maW5hbGl6ZSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IE9wdGlvbnMsdHlwZW5hbWUgSW5kZXg+IHZvaWQKK2luaXRTcGFyc2UoZG91YmxlIGRlbnNpdHksCisgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiYgcmVmVmVjLAorICAgICAgICAgICBTcGFyc2VWZWN0b3I8U2NhbGFyLE9wdGlvbnMsSW5kZXg+JiBzcGFyc2VWZWMsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBub256ZXJvQ29vcmRzID0gMCkKK3sKKyAgc3BhcnNlVmVjLnJlc2VydmUoaW50KHJlZlZlYy5zaXplKCkqZGVuc2l0eSkpOworICBzcGFyc2VWZWMuc2V0WmVybygpOworICBmb3IoaW50IGk9MDsgaTxyZWZWZWMuc2l6ZSgpOyBpKyspCisgIHsKKyAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7CisgICAgaWYgKHYhPVNjYWxhcigwKSkKKyAgICB7CisgICAgICBzcGFyc2VWZWMuaW5zZXJ0QmFjayhpKSA9IHY7CisgICAgICBpZiAobm9uemVyb0Nvb3JkcykKKyAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOworICAgIH0KKyAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQorICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgcmVmVmVjW2ldID0gdjsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IE9wdGlvbnMsdHlwZW5hbWUgSW5kZXg+IHZvaWQKK2luaXRTcGFyc2UoZG91YmxlIGRlbnNpdHksCisgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPiYgcmVmVmVjLAorICAgICAgICAgICBTcGFyc2VWZWN0b3I8U2NhbGFyLE9wdGlvbnMsSW5kZXg+JiBzcGFyc2VWZWMsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiBub256ZXJvQ29vcmRzID0gMCkKK3sKKyAgc3BhcnNlVmVjLnJlc2VydmUoaW50KHJlZlZlYy5zaXplKCkqZGVuc2l0eSkpOworICBzcGFyc2VWZWMuc2V0WmVybygpOworICBmb3IoaW50IGk9MDsgaTxyZWZWZWMuc2l6ZSgpOyBpKyspCisgIHsKKyAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7CisgICAgaWYgKHYhPVNjYWxhcigwKSkKKyAgICB7CisgICAgICBzcGFyc2VWZWMuaW5zZXJ0QmFjayhpKSA9IHY7CisgICAgICBpZiAobm9uemVyb0Nvb3JkcykKKyAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOworICAgIH0KKyAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQorICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgcmVmVmVjW2ldID0gdjsKKyAgfQorfQorCisKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYT4KKyNlbmRpZiAvLyBFSUdFTl9URVNUU1BBUlNFX0gKZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlTE0uY3BwIGIvdGVzdC9zcGFyc2VMTS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxNDhmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlTE0uY3BwCkBAIC0wLDAgKzEsMTc2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTnVlbnRzYSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MZXZlbmJlcmdNYXJxdWFyZHQ+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc3BhcnNlR2F1c3NpYW5UZXN0IDogU3BhcnNlRnVuY3RvcjxTY2FsYXIsIGludD4KK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBTcGFyc2VGdW5jdG9yPFNjYWxhcixpbnQ+IEJhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SmFjb2JpYW5UeXBlIEphY29iaWFuVHlwZTsKKyAgc3BhcnNlR2F1c3NpYW5UZXN0KGludCBpbnB1dHMsIGludCB2YWx1ZXMpIDogU3BhcnNlRnVuY3RvcjxTY2FsYXIsaW50PihpbnB1dHMsdmFsdWVzKQorICB7IH0KKyAgCisgIFZlY3RvclR5cGUgbW9kZWwoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIHgpCisgIHsKKyAgICBWZWN0b3JUeXBlIHk7IC8vQ2hhbmdlIHRoaXMgdG8gdXNlIGV4cHJlc3Npb24gdGVtcGxhdGUKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgICBpbnQgbiA9IEJhc2U6OmlucHV0cygpOworICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCklMiA9PSAwKTsKKyAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpID09IG4pOworICAgIGVpZ2VuX2Fzc2VydCh4LnNpemUoKSA9PSBtKTsKKyAgICB5LnNldFplcm8obSk7CisgICAgaW50IGhhbGYgPSBuLzI7CisgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdSh1diwgMCwgaGFsZik7CisgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdih1diwgaGFsZiwgaGFsZik7CisgICAgU2NhbGFyIGNvZWZmOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKSAKKyAgICAgIHsKKyAgICAgICAgY29lZmYgPSAoeChqKS1pKS92KGkpOworICAgICAgICBjb2VmZiAqPSBjb2VmZjsKKyAgICAgICAgaWYgKGNvZWZmIDwgMS4gJiYgY29lZmYgPiAwLikKKyAgICAgICAgICB5KGopICs9IHUoaSkqc3RkOjpwb3coKDEtY29lZmYpLCAyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHk7CisgIH0KKyAgdm9pZCBpbml0UG9pbnRzKFZlY3RvclR5cGUmIHV2X3JlZiwgVmVjdG9yVHlwZSYgeCkKKyAgeworICAgIG1feCA9IHg7CisgICAgbV95ID0gdGhpcy0+bW9kZWwodXZfcmVmLHgpOworICB9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBWZWN0b3JUeXBlJiBmdmVjKQorICB7CisgICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsgCisgICAgaW50IG4gPSBCYXNlOjppbnB1dHMoKTsKKyAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpJTIgPT0gMCk7CisgICAgZWlnZW5fYXNzZXJ0KHV2LnNpemUoKSA9PSBuKTsKKyAgICBpbnQgaGFsZiA9IG4vMjsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB1KHV2LCAwLCBoYWxmKTsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB2KHV2LCBoYWxmLCBoYWxmKTsKKyAgICBmdmVjID0gbV95OworICAgIFNjYWxhciBjb2VmZjsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKKyAgICB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbGY7IGkrKykKKyAgICAgIHsKKyAgICAgICAgY29lZmYgPSAobV94KGopLWkpL3YoaSk7CisgICAgICAgIGNvZWZmICo9IGNvZWZmOworICAgICAgICBpZiAoY29lZmYgPCAxLiAmJiBjb2VmZiA+IDAuKQorICAgICAgICAgIGZ2ZWMoaikgLT0gdShpKSpzdGQ6OnBvdygoMS1jb2VmZiksIDIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaW50IGRmKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBKYWNvYmlhblR5cGUmIGZqYWMpCisgIHsKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgICBpbnQgbiA9IEJhc2U6OmlucHV0cygpOworICAgIGVpZ2VuX2Fzc2VydChuID09IHV2LnNpemUoKSk7CisgICAgZWlnZW5fYXNzZXJ0KGZqYWMucm93cygpID09IG0pOworICAgIGVpZ2VuX2Fzc2VydChmamFjLmNvbHMoKSA9PSBuKTsKKyAgICBpbnQgaGFsZiA9IG4vMjsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB1KHV2LCAwLCBoYWxmKTsKKyAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB2KHV2LCBoYWxmLCBoYWxmKTsKKyAgICBTY2FsYXIgY29lZmY7CisgICAgCisgICAgLy9EZXJpdmF0aXZlcyB3aXRoIHJlc3BlY3QgdG8gdQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGhhbGY7IGNvbCsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG07IHJvdysrKQorICAgICAgeworICAgICAgICBjb2VmZiA9IChtX3gocm93KS1jb2wpL3YoY29sKTsKKyAgICAgICAgICBjb2VmZiA9IGNvZWZmKmNvZWZmOworICAgICAgICBpZihjb2VmZiA8IDEuICYmIGNvZWZmID4gMC4pCisgICAgICAgIHsKKyAgICAgICAgICBmamFjLmNvZWZmUmVmKHJvdyxjb2wpID0gLSgxLWNvZWZmKSooMS1jb2VmZik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy9EZXJpdmF0aXZlcyB3aXRoIHJlc3BlY3QgdG8gdgorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGhhbGY7IGNvbCsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG07IHJvdysrKQorICAgICAgeworICAgICAgICBjb2VmZiA9IChtX3gocm93KS1jb2wpL3YoY29sKTsKKyAgICAgICAgY29lZmYgPSBjb2VmZipjb2VmZjsKKyAgICAgICAgaWYoY29lZmYgPCAxLiAmJiBjb2VmZiA+IDAuKQorICAgICAgICB7CisgICAgICAgICAgZmphYy5jb2VmZlJlZihyb3csY29sK2hhbGYpID0gLTQgKiAodShjb2wpL3YoY29sKSkqY29lZmYqKDEtY29lZmYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIAorICBWZWN0b3JUeXBlIG1feCwgbV95OyAvL0RhdGEgcG9pbnRzCit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3Rfc3BhcnNlTE1fVCgpCit7CisgIHR5cGVkZWYgTWF0cml4PFQsRHluYW1pYywxPiBWZWN0b3JUeXBlOworICAKKyAgaW50IGlucHV0cyA9IDEwOworICBpbnQgdmFsdWVzID0gMjAwMDsKKyAgc3BhcnNlR2F1c3NpYW5UZXN0PFQ+IHNwYXJzZV9nYXVzc2lhbihpbnB1dHMsIHZhbHVlcyk7CisgIFZlY3RvclR5cGUgdXYoaW5wdXRzKSx1dl9yZWYoaW5wdXRzKTsKKyAgVmVjdG9yVHlwZSB4KHZhbHVlcyk7CisgIC8vIEdlbmVyYXRlIHRoZSByZWZlcmVuY2Ugc29sdXRpb24gCisgIHV2X3JlZiA8PCAtMiwgMSwgNCAsOCwgNiwgMS44LCAxLjIsIDEuMSwgMS45ICwgMzsKKyAgLy9HZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIGRhdGEgcG9pbnRzCisgIHguc2V0UmFuZG9tKCk7CisgIHggPSAxMCp4OworICB4LmFycmF5KCkgKz0gMTA7CisgIHNwYXJzZV9nYXVzc2lhbi5pbml0UG9pbnRzKHV2X3JlZiwgeCk7CisgIAorICAKKyAgLy8gR2VuZXJhdGUgdGhlIGluaXRpYWwgcGFyYW1ldGVycyAKKyAgVmVjdG9yQmxvY2s8VmVjdG9yVHlwZT4gdSh1diwgMCwgaW5wdXRzLzIpOyAKKyAgVmVjdG9yQmxvY2s8VmVjdG9yVHlwZT4gdih1diwgaW5wdXRzLzIsIGlucHV0cy8yKTsKKyAgdi5zZXRPbmVzKCk7CisgIC8vR2VuZXJhdGUgdSBvciBTb2x2ZSBmb3IgdSBmcm9tIHYKKyAgdS5zZXRPbmVzKCk7CisgIAorICAvLyBTb2x2ZSB0aGUgb3B0aW1pemF0aW9uIHByb2JsZW0KKyAgTGV2ZW5iZXJnTWFycXVhcmR0PHNwYXJzZUdhdXNzaWFuVGVzdDxUPiA+IGxtKHNwYXJzZV9nYXVzc2lhbik7CisgIGludCBpbmZvOworLy8gICBpbmZvID0gbG0ubWluaW1pemUodXYpOworICAKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sMSk7CisgICAgLy8gRG8gYSBzdGVwIGJ5IHN0ZXAgc29sdXRpb24gYW5kIHNhdmUgdGhlIHJlc2lkdWFsIAorICBpbnQgbWF4aXRlciA9IDIwMDsKKyAgaW50IGl0ZXIgPSAwOworICBNYXRyaXhYZCBFcnIodmFsdWVzLCBtYXhpdGVyKTsKKyAgTWF0cml4WGQgTW9kKHZhbHVlcywgbWF4aXRlcik7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgc3RhdHVzOyAKKyAgc3RhdHVzID0gbG0ubWluaW1pemVJbml0KHV2KTsKKyAgaWYgKHN0YXR1cz09TGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzKQorICAgICAgcmV0dXJuIDsKKworfQordm9pZCB0ZXN0X3NwYXJzZUxNKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9zcGFyc2VMTV9UPGRvdWJsZT4oKSk7CisgIAorICAvLyBDQUxMX1NVQlRFU1RfMih0ZXN0X3NwYXJzZUxNX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9iYXNpYy5jcHAgYi90ZXN0L3NwYXJzZV9iYXNpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0OTg1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlX2Jhc2ljLmNwcApAQCAtMCwwICsxLDY4OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBEYW5pZWwgR29tZXogRmVycm8gPGRnb21lemZlcnJvQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK3N0YXRpYyBsb25nIGdfcmVhbGxvY19jb3VudCA9IDA7CisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DT01QUkVTU0VEX1NUT1JBR0VfUkVBTExPQ0FURV9QTFVHSU4gZ19yZWFsbG9jX2NvdW50Kys7CisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfYmFzaWMoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCwyLDE+IFZlY3RvcjI7CisgIAorICBjb25zdCBJbmRleCByb3dzID0gcmVmLnJvd3MoKTsKKyAgY29uc3QgSW5kZXggY29scyA9IHJlZi5jb2xzKCk7CisgIC8vY29uc3QgSW5kZXggaW5uZXIgPSByZWYuaW5uZXJTaXplKCk7CisgIC8vY29uc3QgSW5kZXggb3V0ZXIgPSByZWYub3V0ZXJTaXplKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgZW51bSB7IEZsYWdzID0gU3BhcnNlTWF0cml4VHlwZTo6RmxhZ3MgfTsKKworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIFNjYWxhciBlcHMgPSAxZS02OworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICB7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIERlbnNlVmVjdG9yIHZlYzEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpOworCisgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMj4gemVyb0Nvb3JkczsKKyAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyPiBub256ZXJvQ29vcmRzOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQsIG0sIDAsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisKKyAgICAvLyB0ZXN0IGNvZWZmIGFuZCBjb2VmZlJlZgorICAgIGZvciAoc3RkOjpzaXplX3QgaT0wOyBpPHplcm9Db29yZHMuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBtLmNvZWZmKHplcm9Db29yZHNbaV0ueCgpLHplcm9Db29yZHNbaV0ueSgpKSwgZXBzICk7CisgICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxTcGFyc2VNYXRyaXhUeXBlLFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3M+ID46OnZhbHVlKQorICAgICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5jb2VmZlJlZih6ZXJvQ29vcmRzW2ldLngoKSx6ZXJvQ29vcmRzW2ldLnkoKSkgPSA1ICk7CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAgIGlmKCFub256ZXJvQ29vcmRzLmVtcHR5KCkpIHsKKyAgICAgIG0uY29lZmZSZWYobm9uemVyb0Nvb3Jkc1swXS54KCksIG5vbnplcm9Db29yZHNbMF0ueSgpKSA9IFNjYWxhcig1KTsKKyAgICAgIHJlZk1hdC5jb2VmZlJlZihub256ZXJvQ29vcmRzWzBdLngoKSwgbm9uemVyb0Nvb3Jkc1swXS55KCkpID0gU2NhbGFyKDUpOworICAgIH0KKworICAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAgICAgLy8gdGVzdCBhc3NlcnRpb24KKyAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtLmNvZWZmUmVmKC0xLDEpID0gMCApOworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0uY29lZmZSZWYoMCxtLmNvbHMoKSkgPSAwICk7CisgICAgfQorCisgICAgLy8gdGVzdCBpbnNlcnQgKGlubmVyIHJhbmRvbSkKKyAgICB7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOworICAgICAgbTEuc2V0WmVybygpOworICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLGNvbHMpOworICAgICAgYm9vbCBjYWxsX3Jlc2VydmUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyOworICAgICAgSW5kZXggbm56ID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsaW50KHJvd3MpLzIpOworICAgICAgaWYoY2FsbF9yZXNlcnZlKQorICAgICAgeworICAgICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQorICAgICAgICAgIG0yLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLCBpbnQobm56KSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgbTIucmVzZXJ2ZShtMi5vdXRlclNpemUoKSAqIG5ueik7CisgICAgICB9CisgICAgICBnX3JlYWxsb2NfY291bnQgPSAwOworICAgICAgZm9yIChJbmRleCBqPTA7IGo8Y29sczsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGs9MDsgazxubno7ICsraykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgICAgICAgICAgaWYgKG0xLmNvZWZmKGksaik9PVNjYWxhcigwKSkKKyAgICAgICAgICAgIG0yLmluc2VydChpLGopID0gbTEoaSxqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGlmKGNhbGxfcmVzZXJ2ZSAmJiAhU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgIHsKKyAgICAgICAgVkVSSUZZKGdfcmVhbGxvY19jb3VudD09MCk7CisgICAgICB9CisgICAgICAKKyAgICAgIG0yLmZpbmFsaXplKCk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xKTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGluc2VydCAoZnVsbHkgcmFuZG9tKQorICAgIHsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBtMS5zZXRaZXJvKCk7CisgICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsY29scyk7CisgICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQorICAgICAgICBtMi5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgMikpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHJvd3MqY29sczsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICAgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICAgICAgICBpZiAoKG0xLmNvZWZmKGksaik9PVNjYWxhcigwKSkgJiYgKGludGVybmFsOjpyYW5kb208aW50PigpJTIpKQorICAgICAgICAgIG0yLmluc2VydChpLGopID0gbTEoaSxqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICAgIG0yLmNvZWZmUmVmKGksaikgKz0gdjsKKyAgICAgICAgICBtMShpLGopICs9IHY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOworICAgIH0KKyAgICAKKyAgICAvLyB0ZXN0IGluc2VydCAodW4tY29tcHJlc3NlZCkKKyAgICBmb3IoaW50IG1vZGU9MDttb2RlPDQ7Kyttb2RlKQorICAgIHsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBtMS5zZXRaZXJvKCk7CisgICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsY29scyk7CisgICAgICBWZWN0b3JYaSByKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgKChtb2RlJTIpPT0wKSA/IGludChtMi5pbm5lclNpemUoKSkgOiBzdGQ6Om1heDxpbnQ+KDEsaW50KG0yLmlubmVyU2l6ZSgpKS84KSkpOworICAgICAgbTIucmVzZXJ2ZShyKTsKKyAgICAgIGZvciAoSW5kZXggaz0wOyBrPHJvd3MqY29sczsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICAgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICAgICAgICBpZiAobTEuY29lZmYoaSxqKT09U2NhbGFyKDApKQorICAgICAgICAgIG0yLmluc2VydChpLGopID0gbTEoaSxqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBpZihtb2RlPT0zKQorICAgICAgICAgIG0yLnJlc2VydmUocik7CisgICAgICB9CisgICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQorICAgICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMixtMSk7CisgICAgfQorCisgIC8vIHRlc3QgYmFzaWMgY29tcHV0YXRpb25zCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNMSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk0yID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTTMgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNNCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cywgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0zKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQocm93cywgY29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0xLCBtMSk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0yLCBtMik7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0zLCBtMyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk00LCBtNCk7CisKKyAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCisgICAgICBtMS5tYWtlQ29tcHJlc3NlZCgpOworCisgICAgSW5kZXggbTFfbm56ID0gbTEubm9uWmVyb3MoKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEqczEsIHJlZk0xKnMxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xK20yLCByZWZNMStyZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSttMittMywgcmVmTTErcmVmTTIrcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2VQcm9kdWN0KG0xK20yKSwgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk0xK3JlZk0yKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSpzMS1tMiwgcmVmTTEqczEtcmVmTTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTEvczEsIHJlZk0xL3MxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgbTFfbm56KTsKKworICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmlubmVyVmVjdG9yKDApLmRvdChyZWZNMi5yb3coMCkpLCByZWZNMS5yb3coMCkuZG90KHJlZk0yLnJvdygwKSkpOworICAgIGVsc2UKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTEuaW5uZXJWZWN0b3IoMCkuZG90KHJlZk0yLmNvbCgwKSksIHJlZk0xLmNvbCgwKS5kb3QocmVmTTIuY29sKDApKSk7CisKKyAgICBEZW5zZVZlY3RvciBydiA9IERlbnNlVmVjdG9yOjpSYW5kb20obTEuY29scygpKTsKKyAgICBEZW5zZVZlY3RvciBjdiA9IERlbnNlVmVjdG9yOjpSYW5kb20obTEucm93cygpKTsKKyAgICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtMS5yb3dzKCktMik7CisgICAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTEuY29scygpLTEpOworICAgIFZFUklGWV9JU19BUFBST1goKCBtMS50ZW1wbGF0ZSBibG9jazwxLER5bmFtaWM+KHIsMCwxLG0xLmNvbHMoKSkuZG90KHJ2KSkgLCByZWZNMS5yb3cocikuZG90KHJ2KSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocikuZG90KHJ2KSwgcmVmTTEucm93KHIpLmRvdChydikpOworICAgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMpLmRvdChjdiksIHJlZk0xLmNvbChjKS5kb3QoY3YpKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEuY29uanVnYXRlKCksIHJlZk0xLmNvbmp1Z2F0ZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLnJlYWwoKSwgcmVmTTEucmVhbCgpKTsKKworICAgIHJlZk00LnNldFJhbmRvbSgpOworICAgIC8vIHNwYXJzZSBjd2lzZSogZGVuc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlUHJvZHVjdChyZWZNNCksIHJlZk0zLmN3aXNlUHJvZHVjdChyZWZNNCkpOworICAgIC8vIGRlbnNlIGN3aXNlKiBzcGFyc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk00LmN3aXNlUHJvZHVjdChtMyksIHJlZk00LmN3aXNlUHJvZHVjdChyZWZNMykpOworLy8gICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2UoKS9yZWZNNCwgcmVmTTMuY3dpc2UoKS9yZWZNNCk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk00ICsgbTMsIHJlZk00ICsgcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1gobTMgKyByZWZNNCwgcmVmTTMgKyByZWZNNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNNCAtIG0zLCByZWZNNCAtIHJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zIC0gcmVmTTQsIHJlZk0zIC0gcmVmTTQpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIFJlYWxTY2FsYXIoMC41KSptMykuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBSZWFsU2NhbGFyKDAuNSkqcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIG0zKlJlYWxTY2FsYXIoMC41KSkuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBSZWFsU2NhbGFyKDAuNSkqcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIG0zLmN3aXNlUHJvZHVjdChtMykpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk0zKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBSZWFsU2NhbGFyKDAuNSkqbTMpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgUmVhbFNjYWxhcigwLjUpKnJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBtMypSZWFsU2NhbGFyKDAuNSkpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgUmVhbFNjYWxhcigwLjUpKnJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyAobTMrbTMpKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIChyZWZNMytyZWZNMykpOworICAgIFZFUklGWV9JU19BUFBST1goKChyZWZNMyttMykrUmVhbFNjYWxhcigwLjUpKm0zKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNMyArIChyZWZNMytyZWZNMykpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIChyZWZNMyttMykpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgKHJlZk0zK3JlZk0zKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgKG0zK3JlZk0zKSkuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyAocmVmTTMrcmVmTTMpKTsKKworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5zdW0oKSwgcmVmTTEuc3VtKCkpOworCisgICAgbTQgPSBtMTsgcmVmTTQgPSBtNDsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEqPXMxLCByZWZNMSo9czEpOworICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOworICAgIFZFUklGWV9JU19BUFBST1gobTEvPXMxLCByZWZNMS89czEpOworICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSs9bTIsIHJlZk0xKz1yZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS09bTIsIHJlZk0xLT1yZWZNMik7CisKKyAgICBpZiAocm93cz49MiAmJiBjb2xzPj0yKQorICAgIHsKKyAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtMSArPSBtMS5pbm5lclZlY3RvcigwKSApOworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xIC09IG0xLmlubmVyVmVjdG9yKDApICk7CisgICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggcmVmTTEgLT0gbTEuaW5uZXJWZWN0b3IoMCkgKTsKKyAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCByZWZNMSArPSBtMS5pbm5lclZlY3RvcigwKSApOworICAgICAgbTEgPSBtNDsgcmVmTTEgPSByZWZNNDsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGFsaWFzaW5nCisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEgPSAtbTEpLCAocmVmTTEgPSAtcmVmTTEpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobTEubm9uWmVyb3MoKSwgbTFfbm56KTsKKyAgICBtMSA9IG00OyByZWZNMSA9IHJlZk00OworICAgIFZFUklGWV9JU19BUFBST1goKG0xID0gbTEudHJhbnNwb3NlKCkpLCAocmVmTTEgPSByZWZNMS50cmFuc3Bvc2UoKS5ldmFsKCkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobTEubm9uWmVyb3MoKSwgbTFfbm56KTsKKyAgICBtMSA9IG00OyByZWZNMSA9IHJlZk00OworICAgIFZFUklGWV9JU19BUFBST1goKG0xID0gLW0xLnRyYW5zcG9zZSgpKSwgKHJlZk0xID0gLXJlZk0xLnRyYW5zcG9zZSgpLmV2YWwoKSkpOworICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOworICAgIG0xID0gbTQ7IHJlZk0xID0gcmVmTTQ7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKz0gLW0xKSwgKHJlZk0xICs9IC1yZWZNMSkpOworICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOworICAgIG0xID0gbTQ7IHJlZk0xID0gcmVmTTQ7CisKKyAgICBpZihtMS5pc0NvbXByZXNzZWQoKSkKKyAgICB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvZWZmcygpLnN1bSgpLCBtMS5zdW0oKSk7CisgICAgICBtMS5jb2VmZnMoKSArPSBzMTsKKyAgICAgIGZvcihJbmRleCBqID0gMDsgajxtMS5vdXRlclNpemUoKTsgKytqKQorICAgICAgICBmb3IodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtMSxqKTsgaXQ7ICsraXQpCisgICAgICAgICAgcmVmTTEoaXQucm93KCksIGl0LmNvbCgpKSArPSBzMTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk0xKTsKKyAgICB9CisKKyAgICAvLyBhbmQvb3IKKyAgICB7CisgICAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxib29sLCBTcGFyc2VNYXRyaXhUeXBlOjpPcHRpb25zLCB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXg+IFNwQm9vbDsKKyAgICAgIFNwQm9vbCBtYjEgPSBtMS5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpOworICAgICAgU3BCb29sIG1iMiA9IG0yLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobWIxLnRlbXBsYXRlIGNhc3Q8aW50PigpLnN1bSgpLCByZWZNMS5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKChtYjEgJiYgbWIyKS50ZW1wbGF0ZSBjYXN0PGludD4oKS5zdW0oKSwgKHJlZk0xLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkgJiYgcmVmTTIucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKG1iMSB8fCBtYjIpLnRlbXBsYXRlIGNhc3Q8aW50PigpLnN1bSgpLCAocmVmTTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSB8fCByZWZNMi5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpKS5jb3VudCgpKTsKKyAgICAgIFNwQm9vbCBtYjMgPSBtYjEgJiYgbWIyOworICAgICAgaWYobWIxLmNvZWZmcygpLmFsbCgpICYmIG1iMi5jb2VmZnMoKS5hbGwoKSkKKyAgICAgIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1iMy5ub25aZXJvcygpLCAocmVmTTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSAmJiByZWZNMi5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpKS5jb3VudCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0ZXN0IHJldmVyc2UgaXRlcmF0b3JzCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gcmVmX3ZhbHVlKG0yLmlubmVyU2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gcmVmX2luZGV4KG0yLmlubmVyU2l6ZSgpKTsKKyAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCisgICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgIGZvcihJbmRleCBqID0gMDsgajxtMi5vdXRlclNpemUoKTsgKytqKQorICAgIHsKKyAgICAgIEluZGV4IGNvdW50X2ZvcndhcmQgPSAwOworCisgICAgICBmb3IodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtMixqKTsgaXQ7ICsraXQpCisgICAgICB7CisgICAgICAgIHJlZl92YWx1ZVtyZWZfdmFsdWUuc2l6ZSgpLTEtY291bnRfZm9yd2FyZF0gPSBpdC52YWx1ZSgpOworICAgICAgICByZWZfaW5kZXhbcmVmX2luZGV4LnNpemUoKS0xLWNvdW50X2ZvcndhcmRdID0gaXQuaW5kZXgoKTsKKyAgICAgICAgY291bnRfZm9yd2FyZCsrOworICAgICAgfQorICAgICAgSW5kZXggY291bnRfcmV2ZXJzZSA9IDA7CisgICAgICBmb3IodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6UmV2ZXJzZUlubmVySXRlcmF0b3IgaXQobTIsaik7IGl0OyAtLWl0KQorICAgICAgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKCBzdGQ6OmFicyhyZWZfdmFsdWVbcmVmX3ZhbHVlLnNpemUoKS1jb3VudF9mb3J3YXJkK2NvdW50X3JldmVyc2VdKSsxLCBzdGQ6OmFicyhpdC52YWx1ZSgpKSsxKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCByZWZfaW5kZXhbcmVmX2luZGV4LnNpemUoKS1jb3VudF9mb3J3YXJkK2NvdW50X3JldmVyc2VdICwgaXQuaW5kZXgoKSk7CisgICAgICAgIGNvdW50X3JldmVyc2UrKzsKKyAgICAgIH0KKyAgICAgIFZFUklGWV9JU19FUVVBTChjb3VudF9mb3J3YXJkLCBjb3VudF9yZXZlcnNlKTsKKyAgICB9CisgIH0KKworICAvLyB0ZXN0IHRyYW5zcG9zZQorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnRyYW5zcG9zZSgpLmV2YWwoKSwgcmVmTWF0Mi50cmFuc3Bvc2UoKS5ldmFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTIudHJhbnNwb3NlKCksIHJlZk1hdDIudHJhbnNwb3NlKCkpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChTcGFyc2VNYXRyaXhUeXBlKG0yLmFkam9pbnQoKSksIHJlZk1hdDIuYWRqb2ludCgpKTsKKyAgICAKKyAgICAvLyBjaGVjayBpc0FwcHJveCBoYW5kbGVzIG9wcG9zaXRlIHN0b3JhZ2Ugb3JkZXIKKyAgICB0eXBlbmFtZSBUcmFuc3Bvc2U8U3BhcnNlTWF0cml4VHlwZT46OlBsYWluT2JqZWN0IG0zKG0yKTsKKyAgICBWRVJJRlkobTIuaXNBcHByb3gobTMpKTsKKyAgfQorCisgIC8vIHRlc3QgcHJ1bmUKKyAgeworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTTIocm93cywgY29scyk7CisgICAgcmVmTTIuc2V0WmVybygpOworICAgIGludCBjb3VudEZhbHNlTm9uWmVybyA9IDA7CisgICAgaW50IGNvdW50VHJ1ZU5vblplcm8gPSAwOworICAgIG0yLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLCBpbnQobTIuaW5uZXJTaXplKCkpKSk7CisgICAgZm9yIChJbmRleCBqPTA7IGo8bTIuY29scygpOyArK2opCisgICAgeworICAgICAgZm9yIChJbmRleCBpPTA7IGk8bTIucm93cygpOyArK2kpCisgICAgICB7CisgICAgICAgIGZsb2F0IHggPSBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpOworICAgICAgICBpZiAoeDwwLjFmKQorICAgICAgICB7CisgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHg8MC41ZikKKyAgICAgICAgeworICAgICAgICAgIGNvdW50RmFsc2VOb25aZXJvKys7CisgICAgICAgICAgbTIuaW5zZXJ0KGksaikgPSBTY2FsYXIoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY291bnRUcnVlTm9uWmVybysrOworICAgICAgICAgIG0yLmluc2VydChpLGopID0gU2NhbGFyKDEpOworICAgICAgICAgIHJlZk0yKGksaikgPSBTY2FsYXIoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKQorICAgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKKyAgICBWRVJJRlkoY291bnRGYWxzZU5vblplcm8rY291bnRUcnVlTm9uWmVybyA9PSBtMi5ub25aZXJvcygpKTsKKyAgICBpZihjb3VudFRydWVOb25aZXJvPjApCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNMik7CisgICAgbTIucHJ1bmUoU2NhbGFyKDEpKTsKKyAgICBWRVJJRlkoY291bnRUcnVlTm9uWmVybz09bTIubm9uWmVyb3MoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTTIpOworICB9CisKKyAgLy8gdGVzdCBzZXRGcm9tVHJpcGxldHMKKyAgeworICAgIHR5cGVkZWYgVHJpcGxldDxTY2FsYXIsU3RvcmFnZUluZGV4PiBUcmlwbGV0VHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxUcmlwbGV0VHlwZT4gdHJpcGxldHM7CisgICAgSW5kZXggbnRyaXBsZXRzID0gcm93cypjb2xzOworICAgIHRyaXBsZXRzLnJlc2VydmUobnRyaXBsZXRzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXRfc3VtICA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0X3Byb2QgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdF9sYXN0ID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cyxjb2xzKTsKKworICAgIGZvcihJbmRleCBpPTA7aTxudHJpcGxldHM7KytpKQorICAgIHsKKyAgICAgIFN0b3JhZ2VJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxTdG9yYWdlSW5kZXg+KDAsU3RvcmFnZUluZGV4KHJvd3MtMSkpOworICAgICAgU3RvcmFnZUluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPFN0b3JhZ2VJbmRleD4oMCxTdG9yYWdlSW5kZXgoY29scy0xKSk7CisgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgdHJpcGxldHMucHVzaF9iYWNrKFRyaXBsZXRUeXBlKHIsYyx2KSk7CisgICAgICByZWZNYXRfc3VtKHIsYykgKz0gdjsKKyAgICAgIGlmKHN0ZDo6YWJzKHJlZk1hdF9wcm9kKHIsYykpPT0wKQorICAgICAgICByZWZNYXRfcHJvZChyLGMpID0gdjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVmTWF0X3Byb2QocixjKSAqPSB2OworICAgICAgcmVmTWF0X2xhc3QocixjKSA9IHY7CisgICAgfQorICAgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworICAgIG0uc2V0RnJvbVRyaXBsZXRzKHRyaXBsZXRzLmJlZ2luKCksIHRyaXBsZXRzLmVuZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdF9zdW0pOworCisgICAgbS5zZXRGcm9tVHJpcGxldHModHJpcGxldHMuYmVnaW4oKSwgdHJpcGxldHMuZW5kKCksIHN0ZDo6bXVsdGlwbGllczxTY2FsYXI+KCkpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0X3Byb2QpOworI2lmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKQorICAgIG0uc2V0RnJvbVRyaXBsZXRzKHRyaXBsZXRzLmJlZ2luKCksIHRyaXBsZXRzLmVuZCgpLCBbXSAoU2NhbGFyLFNjYWxhciBiKSB7IHJldHVybiBiOyB9KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdF9sYXN0KTsKKyNlbmRpZgorICB9CisgIAorICAvLyB0ZXN0IE1hcAorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0Mihyb3dzLCBjb2xzKSwgcmVmTWF0Myhyb3dzLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQzLCBtMyk7CisgICAgeworICAgICAgTWFwPFNwYXJzZU1hdHJpeFR5cGU+IG1hcE1hdDIobTIucm93cygpLCBtMi5jb2xzKCksIG0yLm5vblplcm9zKCksIG0yLm91dGVySW5kZXhQdHIoKSwgbTIuaW5uZXJJbmRleFB0cigpLCBtMi52YWx1ZVB0cigpLCBtMi5pbm5lck5vblplcm9QdHIoKSk7CisgICAgICBNYXA8U3BhcnNlTWF0cml4VHlwZT4gbWFwTWF0MyhtMy5yb3dzKCksIG0zLmNvbHMoKSwgbTMubm9uWmVyb3MoKSwgbTMub3V0ZXJJbmRleFB0cigpLCBtMy5pbm5lckluZGV4UHRyKCksIG0zLnZhbHVlUHRyKCksIG0zLmlubmVyTm9uWmVyb1B0cigpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobWFwTWF0MittYXBNYXQzLCByZWZNYXQyK3JlZk1hdDMpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXBNYXQyK21hcE1hdDMsIHJlZk1hdDIrcmVmTWF0Myk7CisgICAgfQorICAgIHsKKyAgICAgIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsU3BhcnNlTWF0cml4VHlwZTo6T3B0aW9ucyxTdG9yYWdlSW5kZXg+IG1hcE1hdDIobTIucm93cygpLCBtMi5jb2xzKCksIG0yLm5vblplcm9zKCksIG0yLm91dGVySW5kZXhQdHIoKSwgbTIuaW5uZXJJbmRleFB0cigpLCBtMi52YWx1ZVB0cigpLCBtMi5pbm5lck5vblplcm9QdHIoKSk7CisgICAgICBNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLFNwYXJzZU1hdHJpeFR5cGU6Ok9wdGlvbnMsU3RvcmFnZUluZGV4PiBtYXBNYXQzKG0zLnJvd3MoKSwgbTMuY29scygpLCBtMy5ub25aZXJvcygpLCBtMy5vdXRlckluZGV4UHRyKCksIG0zLmlubmVySW5kZXhQdHIoKSwgbTMudmFsdWVQdHIoKSwgbTMuaW5uZXJOb25aZXJvUHRyKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXBNYXQyK21hcE1hdDMsIHJlZk1hdDIrcmVmTWF0Myk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hcE1hdDIrbWFwTWF0MywgcmVmTWF0MityZWZNYXQzKTsKKyAgICB9CisKKyAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgICAgbTIuY29lZmZSZWYoaSxqKSA9IDEyMzsKKyAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCisgICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBtYXBNYXQyKHJvd3MsIGNvbHMsIG0yLm5vblplcm9zKCksIG0yLm91dGVySW5kZXhQdHIoKSwgbTIuaW5uZXJJbmRleFB0cigpLCBtMi52YWx1ZVB0cigpLCAgbTIuaW5uZXJOb25aZXJvUHRyKCkpOworICAgIFZFUklGWV9JU19FUVVBTChtMi5jb2VmZihpLGopLFNjYWxhcigxMjMpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobWFwTWF0Mi5jb2VmZihpLGopLFNjYWxhcigxMjMpKTsKKyAgICBtYXBNYXQyLmNvZWZmUmVmKGksaikgPSAtMTIzOworICAgIFZFUklGWV9JU19FUVVBTChtMi5jb2VmZihpLGopLFNjYWxhcigtMTIzKSk7CisgIH0KKworICAvLyB0ZXN0IHRyaWFuZ3VsYXJWaWV3CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyKHJvd3MsIGNvbHMpLCByZWZNYXQzKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgcmVmTWF0MyA9IHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgICAgbTMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWZNYXQzKTsKKworICAgIHJlZk1hdDMgPSByZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICAgIG0zID0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisKKyAgICB7CisgICAgICByZWZNYXQzID0gcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CisgICAgICBtMyA9IG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZk1hdDMpOworCisgICAgICByZWZNYXQzID0gcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCk7CisgICAgICBtMyA9IG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZk1hdDMpOworICAgIH0KKworICAgIHJlZk1hdDMgPSByZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCk7CisgICAgbTMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpOworICAgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZk1hdDMpOworCisgICAgcmVmTWF0MyA9IHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKTsKKyAgICBtMyA9IG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisKKyAgICAvLyBjaGVjayBzcGFyc2UtdHJpYW5ndWxhciB0byBkZW5zZQorICAgIHJlZk1hdDMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTWF0MywgRGVuc2VNYXRyaXgocmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpKSk7CisgIH0KKyAgCisgIC8vIHRlc3Qgc2VsZmFkam9pbnRWaWV3CisgIGlmKCFTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0Mihyb3dzLCByb3dzKSwgcmVmTWF0Myhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIHJvd3MpLCBtMyhyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIHJlZk1hdDMgPSByZWZNYXQyLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBtMyA9IG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWZNYXQzKTsKKworICAgIHJlZk1hdDMgKz0gcmVmTWF0Mi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgbTMgKz0gbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICAgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZk1hdDMpOworCisgICAgcmVmTWF0MyAtPSByZWZNYXQyLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBtMyAtPSBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisKKyAgICAvLyBzZWxmYWRqb2ludFZpZXcgb25seSB3b3JrcyBmb3Igc3F1YXJlIG1hdHJpY2VzOgorICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQocm93cywgcm93cysxKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtNC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG00LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisgIH0KKyAgCisgIC8vIHRlc3Qgc3BhcnNlVmlldworICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmV2YWwoKSwgcmVmTWF0Mi5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKworICAgIC8vIHNwYXJzZSB2aWV3IG9uIGV4cHJlc3Npb25zOgorICAgIFZFUklGWV9JU19BUFBST1goKHMxKm0yKS5ldmFsKCksIChzMSpyZWZNYXQyKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChtMittMikuZXZhbCgpLCAocmVmTWF0MityZWZNYXQyKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChtMiptMikuZXZhbCgpLCAocmVmTWF0Mi5sYXp5UHJvZHVjdChyZWZNYXQyKSkuc3BhcnNlVmlldygpLmV2YWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTIqbTIpLmV2YWwoKSwgKHJlZk1hdDIqcmVmTWF0Mikuc3BhcnNlVmlldygpLmV2YWwoKSk7CisgIH0KKworICAvLyB0ZXN0IGRpYWdvbmFsCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWwoKSwgcmVmTWF0Mi5kaWFnb25hbCgpLmV2YWwoKSk7CisgICAgRGVuc2VWZWN0b3IgZCA9IG0yLmRpYWdvbmFsKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkLCByZWZNYXQyLmRpYWdvbmFsKCkuZXZhbCgpKTsKKyAgICBkID0gbTIuZGlhZ29uYWwoKS5hcnJheSgpOworICAgIFZFUklGWV9JU19BUFBST1goZCwgcmVmTWF0Mi5kaWFnb25hbCgpLmV2YWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChjb25zdF9jYXN0PGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUmPihtMikuZGlhZ29uYWwoKSwgcmVmTWF0Mi5kaWFnb25hbCgpLmV2YWwoKSk7CisgICAgCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnKTsKKyAgICBtMi5kaWFnb25hbCgpICAgICAgKz0gcmVmTWF0Mi5kaWFnb25hbCgpOworICAgIHJlZk1hdDIuZGlhZ29uYWwoKSArPSByZWZNYXQyLmRpYWdvbmFsKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisgIH0KKyAgCisgIC8vIHRlc3QgZGlhZ29uYWwgdG8gc3BhcnNlCisgIHsKKyAgICBEZW5zZVZlY3RvciBkID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gZC5hc0RpYWdvbmFsKCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBtMiA9IGQuYXNEaWFnb25hbCgpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTMoZC5hc0RpYWdvbmFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZk1hdDIpOworICAgIHJlZk1hdDIgKz0gZC5hc0RpYWdvbmFsKCk7CisgICAgbTIgKz0gZC5hc0RpYWdvbmFsKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisgIH0KKyAgCisgIC8vIHRlc3QgY29uc2VydmF0aXZlIHJlc2l6ZQorICB7CisgICAgICBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCxTdG9yYWdlSW5kZXg+ID4gaW5jOworICAgICAgaWYocm93cyA+IDMgJiYgY29scyA+IDIpCisgICAgICAgIGluYy5wdXNoX2JhY2soc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCxTdG9yYWdlSW5kZXg+KC0zLC0yKSk7CisgICAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsU3RvcmFnZUluZGV4PigwLDApKTsKKyAgICAgIGluYy5wdXNoX2JhY2soc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCxTdG9yYWdlSW5kZXg+KDMsMikpOworICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oMywwKSk7CisgICAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsU3RvcmFnZUluZGV4PigwLDMpKTsKKyAgICAgIAorICAgICAgZm9yKHNpemVfdCBpID0gMDsgaTwgaW5jLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFN0b3JhZ2VJbmRleCBpbmNSb3dzID0gaW5jW2ldLmZpcnN0OworICAgICAgICBTdG9yYWdlSW5kZXggaW5jQ29scyA9IGluY1tpXS5zZWNvbmQ7CisgICAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cywgY29scyk7CisgICAgICAgIERlbnNlTWF0cml4IHJlZk1hdDEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDEsIG0xKTsKKyAgICAgICAgCisgICAgICAgIG0xLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzK2luY1Jvd3MsIGNvbHMraW5jQ29scyk7CisgICAgICAgIHJlZk1hdDEuY29uc2VydmF0aXZlUmVzaXplKHJvd3MraW5jUm93cywgY29scytpbmNDb2xzKTsKKyAgICAgICAgaWYgKGluY1Jvd3MgPiAwKSByZWZNYXQxLmJvdHRvbVJvd3MoaW5jUm93cykuc2V0WmVybygpOworICAgICAgICBpZiAoaW5jQ29scyA+IDApIHJlZk1hdDEucmlnaHRDb2xzKGluY0NvbHMpLnNldFplcm8oKTsKKyAgICAgICAgCisgICAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk1hdDEpOworICAgICAgICAKKyAgICAgICAgLy8gSW5zZXJ0IG5ldyB2YWx1ZXMKKyAgICAgICAgaWYgKGluY1Jvd3MgPiAwKSAKKyAgICAgICAgICBtMS5pbnNlcnQobTEucm93cygpLTEsIDApID0gcmVmTWF0MShyZWZNYXQxLnJvd3MoKS0xLCAwKSA9IDE7CisgICAgICAgIGlmIChpbmNDb2xzID4gMCkgCisgICAgICAgICAgbTEuaW5zZXJ0KDAsIG0xLmNvbHMoKS0xKSA9IHJlZk1hdDEoMCwgcmVmTWF0MS5jb2xzKCktMSkgPSAxOworICAgICAgICAgIAorICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCByZWZNYXQxKTsKKyAgICAgICAgICAKKyAgICAgICAgICAKKyAgICAgIH0KKyAgfQorCisgIC8vIHRlc3QgSWRlbnRpdHkgbWF0cml4CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQxID0gRGVuc2VNYXRyaXg6OklkZW50aXR5KHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cywgcm93cyk7CisgICAgbTEuc2V0SWRlbnRpdHkoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCByZWZNYXQxKTsKKyAgICBmb3IoaW50IGs9MDsgazxyb3dzKnJvd3MvNDsgKytrKQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICAgICAgU2NhbGFyIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgIG0xLmNvZWZmUmVmKGksaikgPSB2OworICAgICAgcmVmTWF0MS5jb2VmZlJlZihpLGopID0gdjsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk1hdDEpOworICAgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwxMCk8MikKKyAgICAgICAgbTEubWFrZUNvbXByZXNzZWQoKTsKKyAgICB9CisgICAgbTEuc2V0SWRlbnRpdHkoKTsKKyAgICByZWZNYXQxLnNldElkZW50aXR5KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgcmVmTWF0MSk7CisgIH0KKworICAvLyB0ZXN0IGFycmF5L3ZlY3RvciBvZiBJbm5lckl0ZXJhdG9yCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgSXRlcmF0b3JUeXBlOworCisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKKyAgICBJdGVyYXRvclR5cGUgc3RhdGljX2FycmF5WzJdOworICAgIHN0YXRpY19hcnJheVswXSA9IEl0ZXJhdG9yVHlwZShtMiwwKTsKKyAgICBzdGF0aWNfYXJyYXlbMV0gPSBJdGVyYXRvclR5cGUobTIsbTIub3V0ZXJTaXplKCktMSk7CisgICAgVkVSSUZZKCBzdGF0aWNfYXJyYXlbMF0gfHwgbTIuaW5uZXJWZWN0b3Ioc3RhdGljX2FycmF5WzBdLm91dGVyKCkpLm5vblplcm9zKCkgPT0gMCApOworICAgIFZFUklGWSggc3RhdGljX2FycmF5WzFdIHx8IG0yLmlubmVyVmVjdG9yKHN0YXRpY19hcnJheVsxXS5vdXRlcigpKS5ub25aZXJvcygpID09IDAgKTsKKyAgICBpZihzdGF0aWNfYXJyYXlbMF0gJiYgc3RhdGljX2FycmF5WzFdKQorICAgIHsKKyAgICAgICsrKHN0YXRpY19hcnJheVsxXSk7CisgICAgICBzdGF0aWNfYXJyYXlbMV0gPSBJdGVyYXRvclR5cGUobTIsMCk7CisgICAgICBWRVJJRlkoIHN0YXRpY19hcnJheVsxXSApOworICAgICAgVkVSSUZZKCBzdGF0aWNfYXJyYXlbMV0uaW5kZXgoKSA9PSBzdGF0aWNfYXJyYXlbMF0uaW5kZXgoKSApOworICAgICAgVkVSSUZZKCBzdGF0aWNfYXJyYXlbMV0ub3V0ZXIoKSA9PSBzdGF0aWNfYXJyYXlbMF0ub3V0ZXIoKSApOworICAgICAgVkVSSUZZKCBzdGF0aWNfYXJyYXlbMV0udmFsdWUoKSA9PSBzdGF0aWNfYXJyYXlbMF0udmFsdWUoKSApOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEl0ZXJhdG9yVHlwZT4gaXRlcnMoMik7CisgICAgaXRlcnNbMF0gPSBJdGVyYXRvclR5cGUobTIsMCk7CisgICAgaXRlcnNbMV0gPSBJdGVyYXRvclR5cGUobTIsbTIub3V0ZXJTaXplKCktMSk7CisgIH0KK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPgordm9pZCBiaWdfc3BhcnNlX3RyaXBsZXQoSW5kZXggcm93cywgSW5kZXggY29scywgZG91YmxlIGRlbnNpdHkpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgVHJpcGxldDxTY2FsYXIsSW5kZXg+IFRyaXBsZXRUeXBlOworICBzdGQ6OnZlY3RvcjxUcmlwbGV0VHlwZT4gdHJpcGxldHM7CisgIGRvdWJsZSBuZWxlbWVudHMgPSBkZW5zaXR5ICogcm93cypjb2xzOworICBWRVJJRlkobmVsZW1lbnRzPj0wICYmIG5lbGVtZW50cyA8ICBOdW1UcmFpdHM8U3RvcmFnZUluZGV4Pjo6aGlnaGVzdCgpKTsKKyAgSW5kZXggbnRyaXBsZXRzID0gSW5kZXgobmVsZW1lbnRzKTsKKyAgdHJpcGxldHMucmVzZXJ2ZShudHJpcGxldHMpOworICBTY2FsYXIgc3VtID0gU2NhbGFyKDApOworICBmb3IoSW5kZXggaT0wO2k8bnRyaXBsZXRzOysraSkKKyAgeworICAgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgICAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKyAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIHRyaXBsZXRzLnB1c2hfYmFjayhUcmlwbGV0VHlwZShyLGMsdikpOworICAgIHN1bSArPSB2OworICB9CisgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworICBtLnNldEZyb21UcmlwbGV0cyh0cmlwbGV0cy5iZWdpbigpLCB0cmlwbGV0cy5lbmQoKSk7CisgIFZFUklGWShtLm5vblplcm9zKCkgPD0gbnRyaXBsZXRzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdW0sIG0uc3VtKCkpOworfQorCisKK3ZvaWQgdGVzdF9zcGFyc2VfYmFzaWMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDIwMCksIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMjAwKTsKKyAgICBpZihFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsNCkgPT0gMCkgeworICAgICAgciA9IGM7IC8vIGNoZWNrIHNxdWFyZSBtYXRyaWNlcyBpbiAyNSUgb2YgdHJpZXMKKyAgICB9CisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHIrYyk7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZT4oMSwgMSkpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIENvbE1ham9yPihyLCBjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBSb3dNYWpvcj4ociwgYykpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGU+KHIsIGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yLGxvbmcgaW50PihyLCBjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcixsb25nIGludD4ociwgYykpICkpOworICAgIAorICAgIHIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKKyAgICBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDEwMCk7CisgICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKKyAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCisgICAgfQorICAgIAorICAgIENBTExfU1VCVEVTVF82KCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3Isc2hvcnQgaW50PihzaG9ydChyKSwgc2hvcnQoYykpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yLHNob3J0IGludD4oc2hvcnQociksIHNob3J0KGMpKSkgKSk7CisgIH0KKworICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA5MDA6IChtYW51YWxseSBpbnNlcnQgaGlnaGVyIHZhbHVlcyBoZXJlLCBpZiB5b3UgaGF2ZSBlbm91Z2ggUkFNKToKKyAgQ0FMTF9TVUJURVNUXzMoKGJpZ19zcGFyc2VfdHJpcGxldDxTcGFyc2VNYXRyaXg8ZmxvYXQsIFJvd01ham9yLCBpbnQ+ID4oMTAwMDAsIDEwMDAwLCAwLjEyNSkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoKGJpZ19zcGFyc2VfdHJpcGxldDxTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvciwgbG9uZyBpbnQ+ID4oMTAwMDAsIDEwMDAwLCAwLjEyNSkpKTsKKworICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMTA1CisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzcKKyAgeworICAgIGludCBuID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigyMDAsNjAwKTsKKyAgICBTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sMCwgbG9uZz4gbWF0KG4sIG4pOworICAgIHN0ZDo6Y29tcGxleDxkb3VibGU+IHZhbDsKKworICAgIGZvcihpbnQgaT0wOyBpPG47ICsraSkKKyAgICB7CisgICAgICBtYXQuY29lZmZSZWYoaSwgaSUobi8xMCkpID0gdmFsOworICAgICAgVkVSSUZZKG1hdC5kYXRhKCkuYWxsb2NhdGVkU2l6ZSgpPDIwKm4pOworICAgIH0KKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9ibG9jay5jcHAgYi90ZXN0L3NwYXJzZV9ibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwYjNiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlX2Jsb2NrLmNwcApAQCAtMCwwICsxLDMxNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6ZW5hYmxlX2lmPChUOjpGbGFncyZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0LCB0eXBlbmFtZSBUOjpSb3dYcHI+Ojp0eXBlCitpbm5lcnZlYyhUJiBBLCBJbmRleCBpKQoreworICByZXR1cm4gQS5yb3coaSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OmVuYWJsZV9pZjwoVDo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wLCB0eXBlbmFtZSBUOjpDb2xYcHI+Ojp0eXBlCitpbm5lcnZlYyhUJiBBLCBJbmRleCBpKQoreworICByZXR1cm4gQS5jb2woaSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX2Jsb2NrKGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUmIHJlZikKK3sKKyAgY29uc3QgSW5kZXggcm93cyA9IHJlZi5yb3dzKCk7CisgIGNvbnN0IEluZGV4IGNvbHMgPSByZWYuY29scygpOworICBjb25zdCBJbmRleCBpbm5lciA9IHJlZi5pbm5lclNpemUoKTsKKyAgY29uc3QgSW5kZXggb3V0ZXIgPSByZWYub3V0ZXJTaXplKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yP1Jvd01ham9yOkNvbE1ham9yPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+IFJvd0RlbnNlVmVjdG9yOworICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxTY2FsYXI+IFNwYXJzZVZlY3RvclR5cGU7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIHsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0ocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0ID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdCwgbSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdCk7CisKKyAgICAvLyB0ZXN0IElubmVySXRlcmF0b3JzIGFuZCBCbG9jayBleHByZXNzaW9ucworICAgIGZvciAoaW50IHQ9MDsgdDwxMDsgKyt0KQorICAgIHsKKyAgICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMik7CisgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTIpOworICAgICAgSW5kZXggdyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scy1qKTsKKyAgICAgIEluZGV4IGggPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLHJvd3MtaSk7CisKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KSwgcmVmTWF0LmJsb2NrKGksaixoLHcpKTsKKyAgICAgIGZvcihJbmRleCBjPTA7IGM8dzsgYysrKQorICAgICAgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykuY29sKGMpLCByZWZNYXQuYmxvY2soaSxqLGgsdykuY29sKGMpKTsKKyAgICAgICAgZm9yKEluZGV4IHI9MDsgcjxoOyByKyspCisgICAgICAgIHsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpLCByZWZNYXQuYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpKTsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykuY29lZmYocixjKSwgcmVmTWF0LmJsb2NrKGksaixoLHcpLmNvZWZmKHIsYykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IoSW5kZXggcj0wOyByPGg7IHIrKykKKyAgICAgIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLnJvdyhyKSwgcmVmTWF0LmJsb2NrKGksaixoLHcpLnJvdyhyKSk7CisgICAgICAgIGZvcihJbmRleCBjPTA7IGM8dzsgYysrKQorICAgICAgICB7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLnJvdyhyKS5jb2VmZihjKSwgcmVmTWF0LmJsb2NrKGksaixoLHcpLnJvdyhyKS5jb2VmZihjKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLmNvZWZmKHIsYyksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2VmZihyLGMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLHcpLCByZWZNYXQubWlkZGxlQ29scyhqLHcpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksaCksIHJlZk1hdC5taWRkbGVSb3dzKGksaCkpOworICAgICAgZm9yKEluZGV4IHI9MDsgcjxoOyByKyspCisgICAgICB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVDb2xzKGosdykucm93KHIpLCByZWZNYXQubWlkZGxlQ29scyhqLHcpLnJvdyhyKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksaCkucm93KHIpLCByZWZNYXQubWlkZGxlUm93cyhpLGgpLnJvdyhyKSk7CisgICAgICAgIGZvcihJbmRleCBjPTA7IGM8dzsgYysrKQorICAgICAgICB7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmNvbChjKS5jb2VmZihyKSwgcmVmTWF0LmNvbChjKS5jb2VmZihyKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLnJvdyhyKS5jb2VmZihjKSwgcmVmTWF0LnJvdyhyKS5jb2VmZihjKSk7CisgICAgICAgICAgCisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZUNvbHMoaix3KS5jb2VmZihyLGMpLCByZWZNYXQubWlkZGxlQ29scyhqLHcpLmNvZWZmKHIsYykpOworICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksaCkuY29lZmYocixjKSwgcmVmTWF0Lm1pZGRsZVJvd3MoaSxoKS5jb2VmZihyLGMpKTsKKyAgICAgICAgICBpZihtLm1pZGRsZUNvbHMoaix3KS5jb2VmZihyLGMpICE9IFNjYWxhcigwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLHcpLmNvZWZmUmVmKHIsYyksIHJlZk1hdC5taWRkbGVDb2xzKGosdykuY29lZmYocixjKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKG0ubWlkZGxlUm93cyhpLGgpLmNvZWZmKHIsYykgIT0gU2NhbGFyKDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksaCkuY29lZmYocixjKSwgcmVmTWF0Lm1pZGRsZVJvd3MoaSxoKS5jb2VmZihyLGMpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvcihJbmRleCBjPTA7IGM8dzsgYysrKQorICAgICAgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLHcpLmNvbChjKSwgcmVmTWF0Lm1pZGRsZUNvbHMoaix3KS5jb2woYykpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlUm93cyhpLGgpLmNvbChjKSwgcmVmTWF0Lm1pZGRsZVJvd3MoaSxoKS5jb2woYykpOworICAgICAgfQorICAgIH0KKworICAgIGZvcihJbmRleCBjPTA7IGM8Y29sczsgYysrKQorICAgIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5jb2woYykgKyBtLmNvbChjKSwgKG0gKyBtKS5jb2woYykpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmNvbChjKSArIG0uY29sKGMpLCByZWZNYXQuY29sKGMpICsgcmVmTWF0LmNvbChjKSk7CisgICAgfQorCisgICAgZm9yKEluZGV4IHI9MDsgcjxyb3dzOyByKyspCisgICAgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLnJvdyhyKSArIG0ucm93KHIpLCAobSArIG0pLnJvdyhyKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ucm93KHIpICsgbS5yb3cociksIHJlZk1hdC5yb3cocikgKyByZWZNYXQucm93KHIpKTsKKyAgICB9CisgIH0KKworICAvLyB0ZXN0IGlubmVyVmVjdG9yKCkKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgSW5kZXggajAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG91dGVyLTEpOworICAgIEluZGV4IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0xKTsKKyAgICBJbmRleCByMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgICBJbmRleCBjMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3IoajApLCBpbm5lcnZlYyhyZWZNYXQyLGowKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCkrbTIuaW5uZXJWZWN0b3IoajEpLCBpbm5lcnZlYyhyZWZNYXQyLGowKStpbm5lcnZlYyhyZWZNYXQyLGoxKSk7CisKKyAgICBtMi5pbm5lclZlY3RvcihqMCkgKj0gU2NhbGFyKDIpOworICAgIGlubmVydmVjKHJlZk1hdDIsajApICo9IFNjYWxhcigyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKKworICAgIG0yLnJvdyhyMCkgKj0gU2NhbGFyKDMpOworICAgIHJlZk1hdDIucm93KHIwKSAqPSBTY2FsYXIoMyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisKKyAgICBtMi5jb2woYzApICo9IFNjYWxhcig0KTsKKyAgICByZWZNYXQyLmNvbChjMCkgKj0gU2NhbGFyKDQpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOworCisgICAgbTIucm93KHIwKSAvPSBTY2FsYXIoMyk7CisgICAgcmVmTWF0Mi5yb3cocjApIC89IFNjYWxhcigzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKKworICAgIG0yLmNvbChjMCkgLz0gU2NhbGFyKDQpOworICAgIHJlZk1hdDIuY29sKGMwKSAvPSBTY2FsYXIoNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisKKyAgICBTcGFyc2VWZWN0b3JUeXBlIHYxOworICAgIFZFUklGWV9JU19BUFBST1godjEgPSBtMi5jb2woYzApICogNCwgcmVmTWF0Mi5jb2woYzApKjQpOworICAgIFZFUklGWV9JU19BUFBST1godjEgPSBtMi5yb3cocjApICogNCwgcmVmTWF0Mi5yb3cocjApLnRyYW5zcG9zZSgpKjQpOworCisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLGNvbHMpOworICAgIG0zLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG91dGVyLGludChpbm5lci8yKSkpOworICAgIGZvcihJbmRleCBqPTA7IGo8b3V0ZXI7ICsraikKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8KHN0ZDo6bWluKShqLGlubmVyKTsgKytrKQorICAgICAgICBtMy5pbnNlcnRCeU91dGVySW5uZXIoaixrKSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oaysxKTsKKyAgICBmb3IoSW5kZXggaj0wOyBqPChzdGQ6Om1pbikob3V0ZXIsIGlubmVyKTsgKytqKQorICAgIHsKKyAgICAgIFZFUklGWShqPT1udW1leHQ6OnJlYWwobTMuaW5uZXJWZWN0b3Ioaikubm9uWmVyb3MoKSkpOworICAgICAgaWYoaj4wKQorICAgICAgICBWRVJJRlkoaj09bnVtZXh0OjpyZWFsKG0zLmlubmVyVmVjdG9yKGopLmxhc3RDb2VmZigpKSk7CisgICAgfQorICAgIG0zLm1ha2VDb21wcmVzc2VkKCk7CisgICAgZm9yKEluZGV4IGo9MDsgajwoc3RkOjptaW4pKG91dGVyLCBpbm5lcik7ICsraikKKyAgICB7CisgICAgICBWRVJJRlkoaj09bnVtZXh0OjpyZWFsKG0zLmlubmVyVmVjdG9yKGopLm5vblplcm9zKCkpKTsKKyAgICAgIGlmKGo+MCkKKyAgICAgICAgVkVSSUZZKGo9PW51bWV4dDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5sYXN0Q29lZmYoKSkpOworICAgIH0KKworICAgIFZFUklGWShtMy5pbm5lclZlY3RvcihqMCkubm9uWmVyb3MoKSA9PSBtMy50cmFuc3Bvc2UoKS5pbm5lclZlY3RvcihqMCkubm9uWmVyb3MoKSk7CisKKy8vICAgICBtMi5pbm5lclZlY3RvcihqMCkgPSAyKm0yLmlubmVyVmVjdG9yKGoxKTsKKy8vICAgICByZWZNYXQyLmNvbChqMCkgPSAyKnJlZk1hdDIuY29sKGoxKTsKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKKyAgfQorCisgIC8vIHRlc3QgaW5uZXJWZWN0b3JzKCkKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKT4wLjVmKSBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0yKTsKKyAgICBJbmRleCBqMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMik7CisgICAgSW5kZXggbjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG91dGVyLShzdGQ6Om1heCkoajAsajEpKTsKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsbjApLCByZWZNYXQyLmJsb2NrKGowLDAsbjAsY29scykpOworICAgIGVsc2UKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSwgcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApKTsKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsbjApK20yLmlubmVyVmVjdG9ycyhqMSxuMCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIubWlkZGxlUm93cyhqMCxuMCkrcmVmTWF0Mi5taWRkbGVSb3dzKGoxLG4wKSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsbjApK20yLmlubmVyVmVjdG9ycyhqMSxuMCksCisgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApK3JlZk1hdDIuYmxvY2soMCxqMSxyb3dzLG4wKSk7CisgICAgCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisgICAgCisgICAgVkVSSUZZKG0yLmlubmVyVmVjdG9ycyhqMCxuMCkubm9uWmVyb3MoKSA9PSBtMi50cmFuc3Bvc2UoKS5pbm5lclZlY3RvcnMoajAsbjApLm5vblplcm9zKCkpOworICAgIAorICAgIG0yLmlubmVyVmVjdG9ycyhqMCxuMCkgPSBtMi5pbm5lclZlY3RvcnMoajAsbjApICsgbTIuaW5uZXJWZWN0b3JzKGoxLG4wKTsKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgcmVmTWF0Mi5taWRkbGVSb3dzKGowLG4wKSA9IChyZWZNYXQyLm1pZGRsZVJvd3MoajAsbjApICsgcmVmTWF0Mi5taWRkbGVSb3dzKGoxLG4wKSkuZXZhbCgpOworICAgIGVsc2UKKyAgICAgIHJlZk1hdDIubWlkZGxlQ29scyhqMCxuMCkgPSAocmVmTWF0Mi5taWRkbGVDb2xzKGowLG4wKSArIHJlZk1hdDIubWlkZGxlQ29scyhqMSxuMCkpLmV2YWwoKTsKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKKyAgfQorCisgIC8vIHRlc3QgZ2VuZXJpYyBibG9ja3MKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgSW5kZXggajAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG91dGVyLTIpOworICAgIEluZGV4IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0yKTsKKyAgICBJbmRleCBuMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsb3V0ZXItKHN0ZDo6bWF4KShqMCxqMSkpOworICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKGowLDAsbjAsY29scyksIHJlZk1hdDIuYmxvY2soajAsMCxuMCxjb2xzKSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5ibG9jaygwLGowLHJvd3MsbjApLCByZWZNYXQyLmJsb2NrKDAsajAscm93cyxuMCkpOworICAgIAorICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKGowLDAsbjAsY29scykrbTIuYmxvY2soajEsMCxuMCxjb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgICByZWZNYXQyLmJsb2NrKGowLDAsbjAsY29scykrcmVmTWF0Mi5ibG9jayhqMSwwLG4wLGNvbHMpKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKDAsajAscm93cyxuMCkrbTIuYmxvY2soMCxqMSxyb3dzLG4wKSwKKyAgICAgICAgICAgICAgICAgICAgICByZWZNYXQyLmJsb2NrKDAsajAscm93cyxuMCkrcmVmTWF0Mi5ibG9jaygwLGoxLHJvd3MsbjApKTsKKyAgICAgIAorICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0yLm91dGVyU2l6ZSgpLTEpOworICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKKyAgICAgIG0yLmlubmVyVmVjdG9yKGkpID0gbTIuaW5uZXJWZWN0b3IoaSkgKiBzMTsKKyAgICAgIHJlZk1hdDIucm93KGkpID0gcmVmTWF0Mi5yb3coaSkgKiBzMTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIscmVmTWF0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIG0yLmlubmVyVmVjdG9yKGkpID0gbTIuaW5uZXJWZWN0b3IoaSkgKiBzMTsKKyAgICAgIHJlZk1hdDIuY29sKGkpID0gcmVmTWF0Mi5jb2woaSkgKiBzMTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIscmVmTWF0Mik7CisgICAgfQorICAgIAorICAgIEluZGV4IHIwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTIpOworICAgIEluZGV4IGMwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTIpOworICAgIEluZGV4IHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLXIwKTsKKyAgICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scy1jMCk7CisgICAgCisgICAgVkVSSUZZX0lTX0FQUFJPWChEZW5zZVZlY3RvcihtMi5jb2woYzApKSwgcmVmTWF0Mi5jb2woYzApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChjMCksIHJlZk1hdDIuY29sKGMwKSk7CisgICAgCisgICAgVkVSSUZZX0lTX0FQUFJPWChSb3dEZW5zZVZlY3RvcihtMi5yb3cocjApKSwgcmVmTWF0Mi5yb3cocjApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyMCksIHJlZk1hdDIucm93KHIwKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKHIwLGMwLHIxLGMxKSwgcmVmTWF0Mi5ibG9jayhyMCxjMCxyMSxjMSkpOworICAgIFZFUklGWV9JU19BUFBST1goKDIqbTIpLmJsb2NrKHIwLGMwLHIxLGMxKSwgKDIqcmVmTWF0MikuYmxvY2socjAsYzAscjEsYzEpKTsKKworICAgIGlmKG0yLm5vblplcm9zKCk+MCkKKyAgICB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKKyAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTMocm93cywgY29scyk7CisgICAgICBEZW5zZU1hdHJpeCByZWZNYXQzKHJvd3MsIGNvbHMpOyByZWZNYXQzLnNldFplcm8oKTsKKyAgICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKTsKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8bjsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBvMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMSk7CisgICAgICAgIEluZGV4IG8yID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0xKTsKKyAgICAgICAgaWYoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgICAgeworICAgICAgICAgIG0zLmlubmVyVmVjdG9yKG8xKSA9IG0yLnJvdyhvMik7CisgICAgICAgICAgcmVmTWF0My5yb3cobzEpID0gcmVmTWF0Mi5yb3cobzIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG0zLmlubmVyVmVjdG9yKG8xKSA9IG0yLmNvbChvMik7CisgICAgICAgICAgcmVmTWF0My5jb2wobzEpID0gcmVmTWF0Mi5jb2wobzIpOworICAgICAgICB9CisgICAgICAgIGlmKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkKKyAgICAgICAgICBtMy5tYWtlQ29tcHJlc3NlZCgpOworICAgICAgfQorICAgICAgaWYobTMubm9uWmVyb3MoKT4wKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfYmxvY2soKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDIwMCksIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMjAwKTsKKyAgICBpZihFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsNCkgPT0gMCkgeworICAgICAgciA9IGM7IC8vIGNoZWNrIHNxdWFyZSBtYXRyaWNlcyBpbiAyNSUgb2YgdHJpZXMKKyAgICB9CisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHIrYyk7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PGRvdWJsZT4oMSwgMSkpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlPihyLCBjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvcj4ociwgYykpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgUm93TWFqb3I+KHIsIGMpKSApKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMygoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yLGxvbmcgaW50PihyLCBjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcixsb25nIGludD4ociwgYykpICkpOworICAgIAorICAgIHIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKKyAgICBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDEwMCk7CisgICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKKyAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCisgICAgfQorICAgIAorICAgIENBTExfU1VCVEVTVF80KCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3Isc2hvcnQgaW50PihzaG9ydChyKSwgc2hvcnQoYykpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yLHNob3J0IGludD4oc2hvcnQociksIHNob3J0KGMpKSkgKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlX3Blcm11dGF0aW9ucy5jcHAgYi90ZXN0L3NwYXJzZV9wZXJtdXRhdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmNjZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZV9wZXJtdXRhdGlvbnMuY3BwCkBAIC0wLDAgKzEsMjM2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCitzdGF0aWMgbG9uZyBpbnQgbmJfdHJhbnNwb3NlZF9jb3BpZXM7CisjZGVmaW5lIEVJR0VOX1NQQVJTRV9UUkFOU1BPU0VEX0NPUFlfUExVR0lOIHtuYl90cmFuc3Bvc2VkX2NvcGllcysrO30KKyNkZWZpbmUgVkVSSUZZX1RSQU5TUE9TSVRJT05fQ09VTlQoWFBSLE4pIHtcCisgICAgbmJfdHJhbnNwb3NlZF9jb3BpZXMgPSAwOyBcCisgICAgWFBSOyBcCisgICAgaWYobmJfdHJhbnNwb3NlZF9jb3BpZXMhPU4pIHN0ZDo6Y2VyciA8PCAibmJfdHJhbnNwb3NlZF9jb3BpZXMgPT0gIiA8PCBuYl90cmFuc3Bvc2VkX2NvcGllcyA8PCAiXG4iOyBcCisgICAgVkVSSUZZKCAoI1hQUikgJiYgbmJfdHJhbnNwb3NlZF9jb3BpZXM9PU4gKTsgXAorICB9CisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgaXNfc29ydGVkKGNvbnN0IFQmIG1hdCkgeworICBmb3IoSW5kZXggayA9IDA7IGs8bWF0Lm91dGVyU2l6ZSgpOyArK2spCisgIHsKKyAgICBJbmRleCBwcmV2ID0gLTE7CisgICAgZm9yKHR5cGVuYW1lIFQ6OklubmVySXRlcmF0b3IgaXQobWF0LGspOyBpdDsgKytpdCkKKyAgICB7CisgICAgICBpZihwcmV2Pj1pdC5pbmRleCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBwcmV2ID0gaXQuaW5kZXgoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8VCwxPjo6dHlwZSBldmFsKGNvbnN0IFQgJnhwcikKK3sKKyAgVkVSSUZZKCBpbnQoaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFQsMT46OnR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA9PSBpbnQoaW50ZXJuYWw6OmV2YWx1YXRvcjxUPjo6RmxhZ3MmUm93TWFqb3JCaXQpICk7CisgIHJldHVybiB4cHI7Cit9CisKK3RlbXBsYXRlPGludCBPdGhlclN0b3JhZ2UsIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX3Blcm11dGF0aW9ucyhjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpCit7CisgIGNvbnN0IEluZGV4IHJvd3MgPSByZWYucm93cygpOworICBjb25zdCBJbmRleCBjb2xzID0gcmVmLmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgT3RoZXJTdG9yYWdlLCBTdG9yYWdlSW5kZXg+IE90aGVyU3BhcnNlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCxEeW5hbWljLDE+IFZlY3Rvckk7CisvLyAgIGJvb2wgSXNSb3dNYWpvcjEgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yOworLy8gICBib29sIElzUm93TWFqb3IyID0gT3RoZXJTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yOworICAKKyAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKKyAgCisgIFNwYXJzZU1hdHJpeFR5cGUgbWF0KHJvd3MsIGNvbHMpLCB1cChyb3dzLGNvbHMpLCBsbyhyb3dzLGNvbHMpOworICBPdGhlclNwYXJzZU1hdHJpeFR5cGUgcmVzOworICBEZW5zZU1hdHJpeCBtYXRfZCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpLCB1cF9zeW1fZCwgbG9fc3ltX2QsIHJlc19kOworICAKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIG1hdF9kLCBtYXQsIDApOworCisgIHVwID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBsbyA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgCisgIHVwX3N5bV9kID0gbWF0X2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICBsb19zeW1fZCA9IG1hdF9kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gobWF0LCBtYXRfZCk7CisgIFZFUklGWV9JU19BUFBST1godXAsIERlbnNlTWF0cml4KG1hdF9kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1gobG8sIERlbnNlTWF0cml4KG1hdF9kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKSk7CisgIAorICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljPiBwLCBwX251bGw7CisgIFZlY3RvckkgcGk7CisgIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKHBpLCBjb2xzKTsKKyAgcC5pbmRpY2VzKCkgPSBwaTsKKworICBWRVJJRlkoIGlzX3NvcnRlZCggOjpldmFsKG1hdCpwKSApKTsKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdCpwICkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCggOjpldmFsKG1hdCpwKSwgMCk7CisgIC8vVkVSSUZZX1RSQU5TUE9TSVRJT05fQ09VTlQoIHJlcyA9IG1hdCpwLCBJc1Jvd01ham9yID8gMSA6IDAgKTsKKyAgcmVzX2QgPSBtYXRfZCpwOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibWF0KnAiKTsKKworICBWRVJJRlkoIGlzX3NvcnRlZCggOjpldmFsKHAqbWF0KSApKTsKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IHAqbWF0ICkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCggOjpldmFsKHAqbWF0KSwgMCk7CisgIHJlc19kID0gcCptYXRfZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInAqbWF0Iik7CisKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIChtYXQqcCkuZXZhbCgpICkpOworICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gbWF0KnAuaW52ZXJzZSgpICkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCggOjpldmFsKG1hdCpwLmludmVyc2UoKSksIDApOworICByZXNfZCA9IG1hdCpwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgIm1hdCppbnYocCkiKTsKKworICBWRVJJRlkoIGlzX3NvcnRlZCggKHAqbWF0K3AqbWF0KS5ldmFsKCkgKSk7CisgIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBwLmludmVyc2UoKSptYXQgKSk7CisgIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwocC5pbnZlcnNlKCkqbWF0KSwgMCk7CisgIHJlc19kID0gcC5pbnZlcnNlKCkqbWF0X2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJpbnYocCkqbWF0Iik7CisKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIChwICogbWF0ICogcC5pbnZlcnNlKCkpLmV2YWwoKSApKTsKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50d2lzdGVkQnkocCkgKSk7CisgIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwocCAqIG1hdCAqIHAuaW52ZXJzZSgpKSwgMCk7CisgIHJlc19kID0gKHAgKiBtYXRfZCkgKiBwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInAqbWF0KmludihwKSIpOworCisgIAorICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocF9udWxsKSApKTsKKyAgcmVzX2QgPSB1cF9zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gZnVsbCIpOworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCkgKSk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHRvIGZ1bGwiKTsKKyAgCisgIAorICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwX251bGwpICkpOworICByZXNfZCA9IHVwX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdG8gZnVsbCIpOworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocF9udWxsKSApKTsKKyAgcmVzX2QgPSBsb19zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImxvd2VyIHNlbGZhZGpvaW50IGZ1bGwiKTsKKworCisgIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICkpOworICByZXNfZCA9IHVwX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0byBmdWxsIik7CisKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKSk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHRvIGZ1bGwiKTsKKworICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICkpOworICByZXNfZCA9IHVwX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdG8gZnVsbCIpOworCisgIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKSk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJsb3dlciBzZWxmYWRqb2ludCBmdWxsIik7CisKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgcmVzX2QgPSB1cF9zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gdXBwZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgcmVzX2QgPSB1cF9zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gbG93ZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgcmVzX2QgPSBsb19zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gdXBwZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgcmVzX2QgPSBsb19zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gbG93ZXIiKTsKKworICAKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIHVwcGVyIik7CisgIAorICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogbG9fc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdHdpc3RlZCB0byB1cHBlciIpOworICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApOworICByZXNfZCA9ICgocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHR3aXN0ZWQgdG8gbG93ZXIiKTsKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIGxvd2VyIik7CisgIAorICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogdXBfc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gdXBwZXIiKTsKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApOworICByZXNfZCA9ICgocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJsb3dlciBzZWxmYWRqb2ludCB0d2lzdGVkIHRvIHVwcGVyIik7CisgIAorICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBsb3dlciIpOworICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogdXBfc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gbG93ZXIiKTsKKworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudHdpc3RlZEJ5KHApICkpOworICByZXNfZCA9IChwICogdXBfc3ltX2QpICogcC5pbnZlcnNlKCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IHVwcGVyIHR3aXN0ZWQgdG8gZnVsbCIpOworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApICkpOworICByZXNfZCA9IChwICogbG9fc3ltX2QpICogcC5pbnZlcnNlKCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHR3aXN0ZWQgdG8gZnVsbCIpOworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCkgKSk7CisgIHJlc19kID0gKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gZnVsbCIpOworICAKKyAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocCkgKSk7CisgIHJlc19kID0gKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImxvd2VyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gZnVsbCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgc3BhcnNlX3Blcm11dGF0aW9uc19hbGwoaW50IHNpemUpCit7CisgIENBTExfU1VCVEVTVCgoIHNwYXJzZV9wZXJtdXRhdGlvbnM8Q29sTWFqb3I+KFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPihzaXplLHNpemUpKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggc3BhcnNlX3Blcm11dGF0aW9uczxDb2xNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3I+KHNpemUsc2l6ZSkpICkpOworICBDQUxMX1NVQlRFU1QoKCBzcGFyc2VfcGVybXV0YXRpb25zPFJvd01ham9yPihTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4oc2l6ZSxzaXplKSkgKSk7CisgIENBTExfU1VCVEVTVCgoIHNwYXJzZV9wZXJtdXRhdGlvbnM8Um93TWFqb3I+KFNwYXJzZU1hdHJpeDxTY2FsYXIsIFJvd01ham9yPihzaXplLHNpemUpKSApKTsKK30KKwordm9pZCB0ZXN0X3NwYXJzZV9wZXJtdXRhdGlvbnMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoICBzcGFyc2VfcGVybXV0YXRpb25zX2FsbDxkb3VibGU+KHMpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggIHNwYXJzZV9wZXJtdXRhdGlvbnNfYWxsPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4ocykgKSk7CisgIH0KKworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjpwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlPixPblRoZVJpZ2h0LGZhbHNlLFNwYXJzZVNoYXBlPjo6UmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8UHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlPixQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWM+LEFsaWFzRnJlZVByb2R1Y3Q+LDE+Ojp0eXBlPjo6dmFsdWUpKTsKKworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjpwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlPixPblRoZUxlZnQsZmFsc2UsU3BhcnNlU2hhcGU+OjpSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpuZXN0ZWRfZXZhbDxQcm9kdWN0PFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYz4sU3BhcnNlTWF0cml4PGRvdWJsZT4sQWxpYXNGcmVlUHJvZHVjdD4sMT46OnR5cGU+Ojp2YWx1ZSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfcHJvZHVjdC5jcHAgYi90ZXN0L3NwYXJzZV9wcm9kdWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc1ODY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2VfcHJvZHVjdC5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCitzdGF0aWMgbG9uZyBpbnQgbmJfdGVtcG9yYXJpZXM7CisKK2lubGluZSB2b2lkIG9uX3RlbXBvcmFyeV9jcmVhdGlvbigpIHsKKyAgLy8gaGVyZSdzIGEgZ3JlYXQgcGxhY2UgdG8gc2V0IGEgYnJlYWtwb2ludCB3aGVuIGRlYnVnZ2luZyBmYWlsdXJlcyBpbiB0aGlzIHRlc3QhCisgIG5iX3RlbXBvcmFyaWVzKys7Cit9CisKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0NSRUFURV9URU1QT1JBUllfUExVR0lOIHsgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKCk7IH0KKworI2luY2x1ZGUgInNwYXJzZS5oIgorCisjZGVmaW5lIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKFhQUixOKSB7XAorICAgIG5iX3RlbXBvcmFyaWVzID0gMDsgXAorICAgIENBTExfU1VCVEVTVCggWFBSICk7IFwKKyAgICBpZihuYl90ZW1wb3JhcmllcyE9Tikgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKKyAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09TiApOyBcCisgIH0KKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX3Byb2R1Y3QoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIEluZGV4IG4gPSAxMDA7CisgIGNvbnN0IEluZGV4IHJvd3MgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxuKTsKKyAgY29uc3QgSW5kZXggY29scyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG4pOworICBjb25zdCBJbmRleCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsbik7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IEZsYWdzID0gU3BhcnNlTWF0cml4VHlwZTo6RmxhZ3MgfTsKKworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMik7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gUm93RGVuc2VWZWN0b3I7CisgIHR5cGVkZWYgU3BhcnNlVmVjdG9yPFNjYWxhciwwLFN0b3JhZ2VJbmRleD4gQ29sU3BWZWN0b3I7CisgIHR5cGVkZWYgU3BhcnNlVmVjdG9yPFNjYWxhcixSb3dNYWpvcixTdG9yYWdlSW5kZXg+IFJvd1NwVmVjdG9yOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICAvLyB0ZXN0IG1hdHJpeC1tYXRyaXggcHJvZHVjdAorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiAgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBkZXB0aCk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MnQgPSBEZW5zZU1hdHJpeDo6WmVybyhkZXB0aCwgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MyAgPSBEZW5zZU1hdHJpeDo6WmVybyhkZXB0aCwgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0M3QgPSBEZW5zZU1hdHJpeDo6WmVybyhjb2xzLCBkZXB0aCk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NCAgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQ0dCA9IERlbnNlTWF0cml4OjpaZXJvKGNvbHMsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk1hdDUgID0gRGVuc2VNYXRyaXg6OlJhbmRvbShkZXB0aCwgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NiAgPSBEZW5zZU1hdHJpeDo6UmFuZG9tKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IGRtNCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworLy8gICAgIERlbnNlVmVjdG9yIGR2MSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMiAocm93cywgZGVwdGgpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTJ0KGRlcHRoLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0zIChkZXB0aCwgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtM3QoY29scywgZGVwdGgpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQgKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTR0KGNvbHMsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTYocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQyLCAgbTIpOworICAgIGluaXRTcGFyc2UoZGVuc2l0eSwgcmVmTWF0MnQsIG0ydCk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQzLCAgbTMpOworICAgIGluaXRTcGFyc2UoZGVuc2l0eSwgcmVmTWF0M3QsIG0zdCk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQ0LCAgbTQpOworICAgIGluaXRTcGFyc2UoZGVuc2l0eSwgcmVmTWF0NHQsIG00dCk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQ2LCBtNik7CisKKy8vICAgICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGRlcHRoLTEpOworCisgICAgLy8gc3BhcnNlICogc3BhcnNlCisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMiptMywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTJ0LnRyYW5zcG9zZSgpKm0zLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTJ0LnRyYW5zcG9zZSgpKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMiptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIqbTMvczEsIHJlZk1hdDQgPSByZWZNYXQyKnJlZk1hdDMvczEpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMiptMypzMSwgcmVmTWF0NCA9IHJlZk1hdDIqcmVmTWF0MypzMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IHMyKm0yKm0zKnMxLCByZWZNYXQ0ID0gczIqcmVmTWF0MipyZWZNYXQzKnMxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gKG0yK20yKSptMywgcmVmTWF0NCA9IChyZWZNYXQyK3JlZk1hdDIpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMiptMy5sZWZ0Q29scyhjb2xzLzIpLCByZWZNYXQ0ID0gcmVmTWF0MipyZWZNYXQzLmxlZnRDb2xzKGNvbHMvMikpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMioobTMrbTMpLmxlZnRDb2xzKGNvbHMvMiksIHJlZk1hdDQgPSByZWZNYXQyKihyZWZNYXQzK3JlZk1hdDMpLmxlZnRDb2xzKGNvbHMvMikpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTMpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptMykucHJ1bmVkKDApLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCkpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTN0LnRyYW5zcG9zZSgpKS5wcnVuZWQoMCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJpZ2h0IHByb2R1Y3QgaW1wbGVtZW50YXRpb24gaXMgY2FsbGVkOgorICAgIGlmKCghU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikgJiYgbTIucm93cygpPD1tMy5jb2xzKCkpCisgICAgeworICAgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTQgPSBtMiptMywgMyk7IC8vIDEgdGVtcCBmb3IgdGhlIHJlc3VsdCArIDIgZm9yIHRyYW5zcG9zaW5nIGFuZCBnZXQgYSBzb3J0ZWQgcmVzdWx0LgorICAgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTQgPSAobTIqbTMpLnBydW5lZCgwKSwgMSk7CisgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtNCA9IChtMiptMykuZXZhbCgpLnBydW5lZCgwKSwgNCk7CisgICAgfQorCisgICAgLy8gYW5kIHRoYXQgcHJ1bmluZyBpcyBlZmZlY3RpdmU6CisgICAgeworICAgICAgRGVuc2VNYXRyaXggQWQoMiwyKTsKKyAgICAgIEFkIDw8IC0xLCAxLCAxLCAxOworICAgICAgU3BhcnNlTWF0cml4VHlwZSBBcyhBZC5zcGFyc2VWaWV3KCkpLCBCKDIsMik7CisgICAgICBWRVJJRllfSVNfRVFVQUwoIChBcypBcy50cmFuc3Bvc2UoKSkuZXZhbCgpLm5vblplcm9zKCksIDQpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKCAoQWQqQWQudHJhbnNwb3NlKCkpLmV2YWwoKS5zcGFyc2VWaWV3KCkuZXZhbCgpLm5vblplcm9zKCksIDIpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKCAoQXMqQXMudHJhbnNwb3NlKCkpLnBydW5lZCgxZS02KS5ldmFsKCkubm9uWmVyb3MoKSwgMik7CisgICAgfQorCisgICAgLy8gZGVuc2UgPz0gc3BhcnNlICogc3BhcnNlCisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPW0yKm0zLCByZWZNYXQ0ID1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00Kz1tMiptMywgcmVmTWF0NCs9cmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC09bTIqbTMsIHJlZk1hdDQtPXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPW0ydC50cmFuc3Bvc2UoKSptMywgcmVmTWF0NCA9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQrPW0ydC50cmFuc3Bvc2UoKSptMywgcmVmTWF0NCs9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQtPW0ydC50cmFuc3Bvc2UoKSptMywgcmVmTWF0NC09cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPW0ydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCs9bTJ0LnRyYW5zcG9zZSgpKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0NCs9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00LT1tMnQudHJhbnNwb3NlKCkqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0LT1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPW0yKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0NCA9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQrPW0yKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0NCs9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQtPW0yKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0NC09cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMiptMypzMSwgcmVmTWF0NCA9IHJlZk1hdDIqcmVmTWF0MypzMSk7CisKKyAgICAvLyB0ZXN0IGFsaWFzaW5nCisgICAgbTQgPSBtMjsgcmVmTWF0NCA9IHJlZk1hdDI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tNCptMywgcmVmTWF0ND1yZWZNYXQ0KnJlZk1hdDMpOworCisgICAgLy8gc3BhcnNlICogZGVuc2UgbWF0cml4CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqcmVmTWF0MywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0yKnJlZk1hdDN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0ydC50cmFuc3Bvc2UoKSpyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0ydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1tMipyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9ZG00K20yKnJlZk1hdDMsIHJlZk1hdDQ9cmVmTWF0NCtyZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00Kz1tMipyZWZNYXQzLCByZWZNYXQ0Kz1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00LT1tMipyZWZNYXQzLCByZWZNYXQ0LT1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00Lm5vYWxpYXMoKSs9bTIqcmVmTWF0MywgcmVmTWF0NCs9cmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5ub2FsaWFzKCktPW0yKnJlZk1hdDMsIHJlZk1hdDQtPXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqKHJlZk1hdDMrcmVmTWF0MyksIHJlZk1hdDQ9cmVmTWF0MioocmVmTWF0MytyZWZNYXQzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTJ0LnRyYW5zcG9zZSgpKihyZWZNYXQzK3JlZk1hdDUpKjAuNSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSoocmVmTWF0MytyZWZNYXQ1KSowLjUpOworICAgIAorICAgIC8vIHNwYXJzZSAqIGRlbnNlIHZlY3RvcgorICAgIFZFUklGWV9JU19BUFBST1goZG00LmNvbCgwKT1tMipyZWZNYXQzLmNvbCgwKSwgcmVmTWF0NC5jb2woMCk9cmVmTWF0MipyZWZNYXQzLmNvbCgwKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQuY29sKDApPW0yKnJlZk1hdDN0LnRyYW5zcG9zZSgpLmNvbCgwKSwgcmVmTWF0NC5jb2woMCk9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKS5jb2woMCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00LmNvbCgwKT1tMnQudHJhbnNwb3NlKCkqcmVmTWF0My5jb2woMCksIHJlZk1hdDQuY29sKDApPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMuY29sKDApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5jb2woMCk9bTJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpLmNvbCgwKSwgcmVmTWF0NC5jb2woMCk9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0M3QudHJhbnNwb3NlKCkuY29sKDApKTsKKworICAgIC8vIGRlbnNlICogc3BhcnNlCisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9cmVmTWF0MiptMywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PWRtNCtyZWZNYXQyKm0zLCByZWZNYXQ0PXJlZk1hdDQrcmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCs9cmVmTWF0MiptMywgcmVmTWF0NCs9cmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC09cmVmTWF0MiptMywgcmVmTWF0NC09cmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5ub2FsaWFzKCkrPXJlZk1hdDIqbTMsIHJlZk1hdDQrPXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpLT1yZWZNYXQyKm0zLCByZWZNYXQ0LT1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDIqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKm0zLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICAvLyBzcGFyc2UgKiBkZW5zZSBhbmQgZGVuc2UgKiBzcGFyc2Ugb3V0ZXIgcHJvZHVjdAorICAgIHsKKyAgICAgIEluZGV4IGMgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkZXB0aC0xKTsKKyAgICAgIEluZGV4IHIgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICAgICAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgICAgICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsZGVwdGgtMSk7CisgICAgICBEZW5zZU1hdHJpeCBkbTUgID0gRGVuc2VNYXRyaXg6OlJhbmRvbShkZXB0aCwgY29scyk7CisKKyAgICAgIFZFUklGWV9JU19BUFBST1goIG00PW0yLmNvbChjKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLmNvbChjKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKCBtND1tMi5taWRkbGVDb2xzKGMsMSkqZG01LmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5jb2woYykqZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIuY29sKGMpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIuY29sKGMpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKKyAgICAgIAorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtND1kbTUuY29sKGMxKSptMi5jb2woYykudHJhbnNwb3NlKCksIHJlZk1hdDQ9ZG01LmNvbChjMSkqcmVmTWF0Mi5jb2woYykudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtND1kbTUuY29sKGMxKSptMi5taWRkbGVDb2xzKGMsMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9ZG01LmNvbChjMSkqcmVmTWF0Mi5jb2woYykudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9ZG01LmNvbChjMSkqbTIuY29sKGMpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PWRtNS5jb2woYzEpKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKKworICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbTQ9ZG01LnJvdyhyMSkudHJhbnNwb3NlKCkqbTIuY29sKGMpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PWRtNS5yb3cocjEpLnRyYW5zcG9zZSgpKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goZG00PWRtNS5yb3cocjEpLnRyYW5zcG9zZSgpKm0yLmNvbChjKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSpyZWZNYXQyLmNvbChjKS50cmFuc3Bvc2UoKSk7CisKKyAgICAgIFZFUklGWV9JU19BUFBST1goIG00PW0yLnJvdyhyKS50cmFuc3Bvc2UoKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLnJvdyhyKS50cmFuc3Bvc2UoKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKCBtND1tMi5taWRkbGVSb3dzKHIsMSkudHJhbnNwb3NlKCkqZG01LmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5yb3cocikudHJhbnNwb3NlKCkqZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIucm93KHIpLnRyYW5zcG9zZSgpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIucm93KHIpLnRyYW5zcG9zZSgpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKKworICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbTQ9ZG01LmNvbChjMSkqbTIucm93KHIpLCByZWZNYXQ0PWRtNS5jb2woYzEpKnJlZk1hdDIucm93KHIpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goIG00PWRtNS5jb2woYzEpKm0yLm1pZGRsZVJvd3MociwxKSwgcmVmTWF0ND1kbTUuY29sKGMxKSpyZWZNYXQyLnJvdyhyKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1kbTUuY29sKGMxKSptMi5yb3cociksIHJlZk1hdDQ9ZG01LmNvbChjMSkqcmVmTWF0Mi5yb3cocikpOworCisgICAgICBWRVJJRllfSVNfQVBQUk9YKCBtND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSptMi5yb3cociksIHJlZk1hdDQ9ZG01LnJvdyhyMSkudHJhbnNwb3NlKCkqcmVmTWF0Mi5yb3cocikpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9ZG01LnJvdyhyMSkudHJhbnNwb3NlKCkqbTIucm93KHIpLCByZWZNYXQ0PWRtNS5yb3cocjEpLnRyYW5zcG9zZSgpKnJlZk1hdDIucm93KHIpKTsKKyAgICB9CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG02PW02Km02LCByZWZNYXQ2PXJlZk1hdDYqcmVmTWF0Nik7CisgICAgCisgICAgLy8gc3BhcnNlIG1hdHJpeCAqIHNwYXJzZSB2ZWN0b3IKKyAgICBDb2xTcFZlY3RvciBjdjAoY29scyksIGN2MTsKKyAgICBEZW5zZVZlY3RvciBkY3YwKGNvbHMpLCBkY3YxOworICAgIGluaXRTcGFyc2UoMipkZW5zaXR5LGRjdjAsIGN2MCk7CisgICAgCisgICAgUm93U3BWZWN0b3IgcnYwKGRlcHRoKSwgcnYxOworICAgIFJvd0RlbnNlVmVjdG9yIGRydjAoZGVwdGgpLCBkcnYxKHJ2MSk7CisgICAgaW5pdFNwYXJzZSgyKmRlbnNpdHksZHJ2MCwgcnYwKTsKKworICAgIFZFUklGWV9JU19BUFBST1goY3YxPW0zKmN2MCwgZGN2MT1yZWZNYXQzKmRjdjApOyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJ2MT1ydjAqbTMsIGRydjE9ZHJ2MCpyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGN2MT1tM3QuYWRqb2ludCgpKmN2MCwgZGN2MT1yZWZNYXQzdC5hZGpvaW50KCkqZGN2MCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChjdjE9cnYwKm0zLCBkY3YxPWRydjAqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChydjE9bTMqY3YwLCBkcnYxPXJlZk1hdDMqZGN2MCk7CisgIH0KKyAgCisgIC8vIHRlc3QgbWF0cml4IC0gZGlhZ29uYWwgcHJvZHVjdAorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTTIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMyA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IGQzID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLER5bmFtaWM+IGQxKERlbnNlVmVjdG9yOjpSYW5kb20oY29scykpOworICAgIERpYWdvbmFsTWF0cml4PFNjYWxhcixEeW5hbWljPiBkMihEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTMocm93cywgY29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0yLCBtMik7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0zLCBtMyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMipkMSwgcmVmTTM9cmVmTTIqZDEpOworICAgIFZFUklGWV9JU19BUFBST1gobTM9bTIudHJhbnNwb3NlKCkqZDIsIHJlZk0zPXJlZk0yLnRyYW5zcG9zZSgpKmQyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPWQyKm0yLCByZWZNMz1kMipyZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1kMSptMi50cmFuc3Bvc2UoKSwgcmVmTTM9ZDEqcmVmTTIudHJhbnNwb3NlKCkpOworICAgIAorICAgIC8vIGFsc28gY2hlY2sgd2l0aCBhIFNwYXJzZVdyYXBwZXI6CisgICAgRGVuc2VWZWN0b3IgdjEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKGNvbHMpOworICAgIERlbnNlVmVjdG9yIHYyID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKyAgICBEZW5zZVZlY3RvciB2MyA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMip2MS5hc0RpYWdvbmFsKCksIHJlZk0zPXJlZk0yKnYxLmFzRGlhZ29uYWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMi50cmFuc3Bvc2UoKSp2Mi5hc0RpYWdvbmFsKCksIHJlZk0zPXJlZk0yLnRyYW5zcG9zZSgpKnYyLmFzRGlhZ29uYWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz12Mi5hc0RpYWdvbmFsKCkqbTIsIHJlZk0zPXYyLmFzRGlhZ29uYWwoKSpyZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz12MS5hc0RpYWdvbmFsKCkqbTIudHJhbnNwb3NlKCksIHJlZk0zPXYxLmFzRGlhZ29uYWwoKSpyZWZNMi50cmFuc3Bvc2UoKSk7CisgICAgCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz12Mi5hc0RpYWdvbmFsKCkqbTIqdjEuYXNEaWFnb25hbCgpLCByZWZNMz12Mi5hc0RpYWdvbmFsKCkqcmVmTTIqdjEuYXNEaWFnb25hbCgpKTsKKworICAgIFZFUklGWV9JU19BUFBST1godjI9bTIqdjEuYXNEaWFnb25hbCgpKnYxLCByZWZNMip2MS5hc0RpYWdvbmFsKCkqdjEpOworICAgIFZFUklGWV9JU19BUFBST1godjM9djIuYXNEaWFnb25hbCgpKm0yKnYxLCB2Mi5hc0RpYWdvbmFsKCkqcmVmTTIqdjEpOworICAgIAorICAgIC8vIGV2YWx1YXRlIHRvIGEgZGVuc2UgbWF0cml4IHRvIGNoZWNrIHRoZSAucm93KCkgYW5kIC5jb2woKSBpdGVyYXRvciBmdW5jdGlvbnMKKyAgICBWRVJJRllfSVNfQVBQUk9YKGQzPW0yKmQxLCByZWZNMz1yZWZNMipkMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkMz1tMi50cmFuc3Bvc2UoKSpkMiwgcmVmTTM9cmVmTTIudHJhbnNwb3NlKCkqZDIpOworICAgIFZFUklGWV9JU19BUFBST1goZDM9ZDIqbTIsIHJlZk0zPWQyKnJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGQzPWQxKm0yLnRyYW5zcG9zZSgpLCByZWZNMz1kMSpyZWZNMi50cmFuc3Bvc2UoKSk7CisgIH0KKworICAvLyB0ZXN0IHNlbGYtYWRqb2ludCBhbmQgdHJpYW5ndWxhci12aWV3IHByb2R1Y3RzCisgIHsKKyAgICBEZW5zZU1hdHJpeCBiID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCB4ID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZYID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZVcCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZkxvID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmUyA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZkEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG1VcChyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG1Mbyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG1TKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbUEocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZkEsIG1BKTsKKyAgICBkbyB7CisgICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmVXAsIG1VcCwgRm9yY2VSZWFsRGlhZ3wvKkZvcmNlTm9uWmVyb0RpYWd8Ki9NYWtlVXBwZXJUcmlhbmd1bGFyKTsKKyAgICB9IHdoaWxlIChyZWZVcC5pc1plcm8oKSk7CisgICAgcmVmTG8gPSByZWZVcC5hZGpvaW50KCk7CisgICAgbUxvID0gbVVwLmFkam9pbnQoKTsKKyAgICByZWZTID0gcmVmVXAgKyByZWZMbzsKKyAgICByZWZTLmRpYWdvbmFsKCkgKj0gMC41OworICAgIG1TID0gbVVwICsgbUxvOworICAgIC8vIFRPRE8gYmUgYWJsZSB0byBhZGRyZXNzIHRoZSBkaWFnb25hbC4uLi4KKyAgICBmb3IgKGludCBrPTA7IGs8bVMub3V0ZXJTaXplKCk7ICsraykKKyAgICAgIGZvciAodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtUyxrKTsgaXQ7ICsraXQpCisgICAgICAgIGlmIChpdC5pbmRleCgpID09IGspCisgICAgICAgICAgaXQudmFsdWVSZWYoKSAqPSBTY2FsYXIoMC41KTsKKworICAgIFZFUklGWV9JU19BUFBST1gocmVmUy5hZGpvaW50KCksIHJlZlMpOworICAgIFZFUklGWV9JU19BUFBST1gobVMuYWRqb2ludCgpLCBtUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtUywgcmVmUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1TKmIsIHJlZlg9cmVmUypiKTsKKworICAgIC8vIHNwYXJzZSBzZWxmYWRqb2ludFZpZXcgd2l0aCBkZW5zZSBtYXRyaWNlcworICAgIFZFUklGWV9JU19BUFBST1goeD1tVXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKmIsIHJlZlg9cmVmUypiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9bUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSpiLCByZWZYPXJlZlMqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1TLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcnxMb3dlcj4oKSpiLCByZWZYPXJlZlMqYik7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1VcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksICAgICAgIHJlZlg9YipyZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCksICAgICAgIHJlZlg9YipyZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1TLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcnxMb3dlcj4oKSwgIHJlZlg9YipyZWZTKTsKKworICAgIFZFUklGWV9JU19BUFBST1goeC5ub2FsaWFzKCkrPW1VcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkqYiwgcmVmWCs9cmVmUypiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHgubm9hbGlhcygpLT1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKmIsIHJlZlgtPXJlZlMqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4Lm5vYWxpYXMoKSs9bVMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyfExvd2VyPigpKmIsIHJlZlgrPXJlZlMqYik7CisgICAgCisgICAgLy8gc3BhcnNlIHNlbGZhZGpvaW50VmlldyB3aXRoIHNwYXJzZSBtYXRyaWNlcworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVNyZXMocm93cyxyb3dzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSptUywKKyAgICAgICAgICAgICAgICAgICAgIHJlZlggPSByZWZMby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkqcmVmUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1TICogbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZlggPSByZWZTICogcmVmTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsKKyAgICAKKyAgICAvLyBzcGFyc2UgdHJpYW5ndWxhclZpZXcgd2l0aCBkZW5zZSBtYXRyaWNlcworICAgIFZFUklGWV9JU19BUFBST1goeD1tQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSpiLCByZWZYPXJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKmIsIHJlZlg9cmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiptQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgcmVmWD1iKnJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICAgIFZFUklGWV9JU19BUFBST1goeD1iKm1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCByZWZYPWIqcmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisgICAgCisgICAgLy8gc3BhcnNlIHRyaWFuZ3VsYXJWaWV3IHdpdGggc3BhcnNlIG1hdHJpY2VzCisgICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKm1TLCAgIHJlZlggPSByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKnJlZlMpOworICAgIFZFUklGWV9JU19BUFBST1gobVNyZXMgPSBtUyAqIG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCByZWZYID0gcmVmUyAqIHJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICAgIFZFUklGWV9JU19BUFBST1gobVNyZXMgPSBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSptUywgICByZWZYID0gcmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSpyZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbVMgKiBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgcmVmWCA9IHJlZlMgKiByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKyAgfQorfQorCisvLyBOZXcgdGVzdCBmb3IgQnVnIGluIFNwYXJzZVRpbWVEZW5zZVByb2R1Y3QKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsIHR5cGVuYW1lIERlbnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfcHJvZHVjdF9yZWdyZXNzaW9uX3Rlc3QoKQoreworICAvLyBUaGlzIGNvZGUgZG9lcyBub3QgY29tcGlsZSB3aXRoIGFmZmxpY3RlZCB2ZXJzaW9ucyBvZiB0aGUgYnVnCisgIFNwYXJzZU1hdHJpeFR5cGUgc20xKDMsMik7CisgIERlbnNlTWF0cml4VHlwZSBtMigyLDIpOworICBzbTEuc2V0WmVybygpOworICBtMi5zZXRaZXJvKCk7CisKKyAgRGVuc2VNYXRyaXhUeXBlIG0zID0gc20xKm0yOworCisKKyAgLy8gVGhpcyBjb2RlIHByb2R1Y2VzIGEgc2VnZmF1bHQgd2l0aCBhZmZsaWN0ZWQgdmVyc2lvbnMgb2YgYW5vdGhlciBTcGFyc2VUaW1lRGVuc2VQcm9kdWN0CisgIC8vIGJ1ZworCisgIFNwYXJzZU1hdHJpeFR5cGUgc20yKDIwMDAwLDIpOworICBzbTIuc2V0WmVybygpOworICBEZW5zZU1hdHJpeFR5cGUgbTQoc20yKm0yKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCBtNCgwLDApLCAwLjAgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBidWdfOTQyKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiAgICAgVmVjdG9yOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPiBDb2xTcE1hdDsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvcj4gUm93U3BNYXQ7CisgIENvbFNwTWF0IGNtQSgxLDEpOworICBjbUEuaW5zZXJ0KDAsMCkgPSAxOworCisgIFJvd1NwTWF0IHJtQSgxLDEpOworICBybUEuaW5zZXJ0KDAsMCkgPSAxOworCisgIFZlY3RvciBkKDEpOworICBkWzBdID0gMjsKKyAgCisgIGRvdWJsZSByZXMgPSAyOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCBjbUEqZC5hc0RpYWdvbmFsKCkgKS5ldmFsKCkuY29lZmYoMCwwKSwgcmVzICk7CisgIFZFUklGWV9JU19BUFBST1goICggZC5hc0RpYWdvbmFsKCkqcm1BICkuZXZhbCgpLmNvZWZmKDAsMCksIHJlcyApOworICBWRVJJRllfSVNfQVBQUk9YKCAoIHJtQSpkLmFzRGlhZ29uYWwoKSApLmV2YWwoKS5jb2VmZigwLDApLCByZXMgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCBkLmFzRGlhZ29uYWwoKSpjbUEgKS5ldmFsKCkuY29lZmYoMCwwKSwgcmVzICk7Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfcHJvZHVjdCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIChidWdfOTQyPGRvdWJsZT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3IgPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yID4gPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCAoc3BhcnNlX3Byb2R1Y3Q8U3BhcnNlTWF0cml4PGZsb2F0LENvbE1ham9yLGxvbmcgaW50PiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIChzcGFyc2VfcHJvZHVjdF9yZWdyZXNzaW9uX3Rlc3Q8U3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4sIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPiA+KCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlX3JlZi5jcHAgYi90ZXN0L3NwYXJzZV9yZWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTYwNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZV9yZWYuY3BwCkBAIC0wLDAgKzEsMTM5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGlzIHVuaXQgdGVzdCBjYW5ub3QgYmUgZWFzaWx5IHdyaXR0ZW4gdG8gd29yayB3aXRoIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisjaWZkZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyN1bmRlZiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorI2VuZGlmCisKK3N0YXRpYyBsb25nIGludCBuYl90ZW1wb3JhcmllczsKKworaW5saW5lIHZvaWQgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKCkgeworICAvLyBoZXJlJ3MgYSBncmVhdCBwbGFjZSB0byBzZXQgYSBicmVha3BvaW50IHdoZW4gZGVidWdnaW5nIGZhaWx1cmVzIGluIHRoaXMgdGVzdCEKKyAgbmJfdGVtcG9yYXJpZXMrKzsKK30KKworI2RlZmluZSBFSUdFTl9TUEFSU0VfQ1JFQVRFX1RFTVBPUkFSWV9QTFVHSU4geyBvbl90ZW1wb3JhcnlfY3JlYXRpb24oKTsgfQorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNvcmU+CisKKyNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLE4pIHtcCisgICAgbmJfdGVtcG9yYXJpZXMgPSAwOyBcCisgICAgQ0FMTF9TVUJURVNUKCBYUFIgKTsgXAorICAgIGlmKG5iX3RlbXBvcmFyaWVzIT1OKSBzdGQ6OmNlcnIgPDwgIm5iX3RlbXBvcmFyaWVzID09ICIgPDwgbmJfdGVtcG9yYXJpZXMgPDwgIlxuIjsgXAorICAgIFZFUklGWSggKCNYUFIpICYmIG5iX3RlbXBvcmFyaWVzPT1OICk7IFwKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+IHZvaWQgY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoY29uc3QgUGxhaW5PYmplY3RUeXBlJikKK3sKKyAgLy8gdmVyaWZ5IHRoYXQgcmVmLXRvLWNvbnN0IGRvbid0IGhhdmUgTHZhbHVlQml0CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdDxQbGFpbk9iamVjdFR5cGU+Ojp0eXBlIENvbnN0UGxhaW5PYmplY3RUeXBlOworICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGU+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSggIShSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMShSZWY8U3BhcnNlTWF0cml4PGZsb2F0PiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8yKGNvbnN0IFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8zKGNvbnN0IFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8ZmxvYXQ+LCBTdGFuZGFyZENvbXByZXNzZWRGb3JtYXQ+JiBhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWShhLmlzQ29tcHJlc3NlZCgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNChSZWY8U3BhcnNlVmVjdG9yPGZsb2F0PiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl81KGNvbnN0IFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8ZmxvYXQ+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQorCit2b2lkIGNhbGxfcmVmKCkKK3sKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiAgICAgICAgICAgICAgIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDEwKS5zcGFyc2VWaWV3KDAuNSwxKTsKKyAgU3BhcnNlTWF0cml4PGZsb2F0LFJvd01ham9yPiAgICAgIEIgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDEwKS5zcGFyc2VWaWV3KDAuNSwxKTsKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiAgICAgICAgICAgICAgIEMgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDEwKS5zcGFyc2VWaWV3KDAuNSwxKTsKKyAgQy5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChDLm91dGVyU2l6ZSgpLCAyKSk7CisgIGNvbnN0IFNwYXJzZU1hdHJpeDxmbG9hdD4mICAgICAgICBBYyhBKTsKKyAgQmxvY2s8U3BhcnNlTWF0cml4PGZsb2F0PiA+ICAgICAgIEFiKEEsMCwxLCAzLDMpOworICBjb25zdCBCbG9jazxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gQWJjKEEsMCwxLDMsMyk7CisgIFNwYXJzZVZlY3RvcjxmbG9hdD4gICAgICAgICAgICAgICB2YyA9ICBWZWN0b3JYZjo6UmFuZG9tKDEwKS5zcGFyc2VWaWV3KDAuNSwxKTsKKyAgU3BhcnNlVmVjdG9yPGZsb2F0LFJvd01ham9yPiAgICAgIHZyID0gIFZlY3RvclhmOjpSYW5kb20oMTApLnNwYXJzZVZpZXcoMC41LDEpOworICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IEFBID0gQSpBOworICAKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBLCBBKSwgIDApOworLy8gICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBYywgQWMpLCAgMCk7IC8vIGRvZXMgbm90IGNvbXBpbGUgb24gcHVycG9zZQorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBLCBBKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBLCBBKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBYyxBYyksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBYyxBYyksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBK0EsMipBYyksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBK0EsMipBYyksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCLCBCKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhCLCBCKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCLnRyYW5zcG9zZSgpLCBCLnRyYW5zcG9zZSgpKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhCLnRyYW5zcG9zZSgpLCBCLnRyYW5zcG9zZSgpKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBKkEsIEFBKSwgIDMpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBKkEsIEFBKSwgIDMpOworICAKKyAgVkVSSUZZKCFDLmlzQ29tcHJlc3NlZCgpKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzMoQywgQyksICAxKTsKKyAgCisgIFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gQXIoQSk7CisgIFZFUklGWV9JU19BUFBST1goQXIrQXIsIEErQSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKEFyLCBBKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBciwgQSksICAwKTsKKyAgCisgIFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQsUm93TWFqb3I+ID4gQnIoQik7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKEJyLnRyYW5zcG9zZSgpLCBCci50cmFuc3Bvc2UoKSksICAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoQnIsIEJyKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCci50cmFuc3Bvc2UoKSwgQnIudHJhbnNwb3NlKCkpLCAgMCk7CisgIAorICBSZWY8Y29uc3QgU3BhcnNlTWF0cml4PGZsb2F0PiA+IEFyYyhBKTsKKy8vICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoQXJjLCBBcmMpLCAgMCk7IC8vIGRvZXMgbm90IGNvbXBpbGUgb24gcHVycG9zZQorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBcmMsIEFyYyksICAwKTsKKyAgCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEubWlkZGxlQ29scygxLDMpLCBBLm1pZGRsZUNvbHMoMSwzKSksICAwKTsKKyAgCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEuY29sKDIpLCBBLmNvbCgyKSksICAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIodmMsIHZjKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMih2ci50cmFuc3Bvc2UoKSwgdnIudHJhbnNwb3NlKCkpLCAgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKHZyLCB2ci50cmFuc3Bvc2UoKSksICAwKTsKKyAgCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEuYmxvY2soMSwxLDMsMyksIEEuYmxvY2soMSwxLDMsMykpLCAgMSk7IC8vIHNob3VsZCBiZSAwIChhbGxvY2F0ZSBzdGFydHMvbm56IG9ubHkpCisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQodmMsIHZjKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNCh2ciwgdnIudHJhbnNwb3NlKCkpLCAgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KHZjLCB2YyksICAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUodnIsIHZyLnRyYW5zcG9zZSgpKSwgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNChBLmNvbCgyKSwgQS5jb2woMikpLCAgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KEEuY29sKDIpLCBBLmNvbCgyKSksICAwKTsKKyAgLy8gVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoQS5yb3coMiksIEEucm93KDIpLnRyYW5zcG9zZSgpKSwgIDEpOyAvLyBkb2VzIG5vdCBjb21waWxlIG9uIHB1cnBvc2UKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoQS5yb3coMiksIEEucm93KDIpLnRyYW5zcG9zZSgpKSwgIDEpOworfQorCit2b2lkIHRlc3Rfc3BhcnNlX3JlZigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFNwYXJzZU1hdHJpeDxmbG9hdD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY2FsbF9yZWYoKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFNwYXJzZVZlY3RvcjxmbG9hdD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoU3BhcnNlVmVjdG9yPGRvdWJsZSxSb3dNYWpvcj4oKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2Vfc29sdmVyLmggYi90ZXN0L3NwYXJzZV9zb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ1YmMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2Vfc29sdmVyLmgKQEAgLTAsMCArMSw1NjUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlQ29yZT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3MsdHlwZW5hbWUgUmVzdWx0Pgordm9pZCBzb2x2ZV93aXRoX2d1ZXNzKEl0ZXJhdGl2ZVNvbHZlckJhc2U8U29sdmVyPiYgc29sdmVyLCBjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiBnLCBSZXN1bHQgJngpIHsKKyAgaWYoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKQorICB7CisgICAgLy8gV2l0aCBhIHRlbXBvcmFyeSB0aHJvdWdoIGV2YWx1YXRvcjxTb2x2ZVdpdGhHdWVzcz4KKyAgICB4ID0gc29sdmVyLmRlcml2ZWQoKS5zb2x2ZVdpdGhHdWVzcyhiLGcpICsgUmVzdWx0OjpaZXJvKHgucm93cygpLCB4LmNvbHMoKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gZGlyZWN0IGV2YWx1YXRpb24gd2l0aGluIHggdGhyb3VnaCBBc3NpZ25tZW50PFJlc3VsdCxTb2x2ZVdpdGhHdWVzcz4KKyAgICB4ID0gc29sdmVyLmRlcml2ZWQoKS5zb2x2ZVdpdGhHdWVzcyhiLmRlcml2ZWQoKSxnKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3MsdHlwZW5hbWUgUmVzdWx0Pgordm9pZCBzb2x2ZV93aXRoX2d1ZXNzKFNwYXJzZVNvbHZlckJhc2U8U29sdmVyPiYgc29sdmVyLCBjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiAsIFJlc3VsdCYgeCkgeworICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCisgICAgeCA9IHNvbHZlci5kZXJpdmVkKCkuc29sdmUoYikgKyBSZXN1bHQ6Olplcm8oeC5yb3dzKCksIHguY29scygpKTsKKyAgZWxzZQorICAgIHggPSBzb2x2ZXIuZGVyaXZlZCgpLnNvbHZlKGIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3MsdHlwZW5hbWUgUmVzdWx0Pgordm9pZCBzb2x2ZV93aXRoX2d1ZXNzKFNwYXJzZVNvbHZlckJhc2U8U29sdmVyPiYgc29sdmVyLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiAsIFJlc3VsdCYgeCkgeworICB4ID0gc29sdmVyLmRlcml2ZWQoKS5zb2x2ZShiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlbnNlTWF0LCB0eXBlbmFtZSBEZW5zZVJocz4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgUmhzJiBiLCBjb25zdCBEZW5zZU1hdCYgZEEsIGNvbnN0IERlbnNlUmhzJiBkYikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgRGVuc2VSaHMgcmVmWCA9IGRBLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZShkYik7CisgIHsKKyAgICBSaHMgeChBLmNvbHMoKSwgYi5jb2xzKCkpOworICAgIFJocyBvbGRiID0gYjsKKworICAgIHNvbHZlci5jb21wdXRlKEEpOworICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUiB8IHNwYXJzZSBzb2x2ZXIgdGVzdGluZywgZmFjdG9yaXphdGlvbiBmYWlsZWQgKCIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIpXG4iOworICAgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2Vzcyk7CisgICAgfQorICAgIHggPSBzb2x2ZXIuc29sdmUoYik7CisgICAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkcgfCBzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHNvbHZpbmcgZmFpbGVkICgiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiKVxuIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOworICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKKyAgICB4LnNldFplcm8oKTsKKyAgICBzb2x2ZV93aXRoX2d1ZXNzKHNvbHZlciwgYiwgeCwgeCk7CisgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAic29sdmluZyBmYWlsZWQgd2hlbiB1c2luZyBhbmFseXplUGF0dGVybi9mYWN0b3JpemUgQVBJIik7CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOworICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgCisgICAgeC5zZXRaZXJvKCk7CisgICAgLy8gdGVzdCB0aGUgYW5hbHl6ZS9mYWN0b3JpemUgQVBJCisgICAgc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOworICAgIHNvbHZlci5mYWN0b3JpemUoQSk7CisgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAiZmFjdG9yaXphdGlvbiBmYWlsZWQgd2hlbiB1c2luZyBhbmFseXplUGF0dGVybi9mYWN0b3JpemUgQVBJIik7CisgICAgeCA9IHNvbHZlci5zb2x2ZShiKTsKKyAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBTdWNjZXNzICYmICJzb2x2aW5nIGZhaWxlZCB3aGVuIHVzaW5nIGFuYWx5emVQYXR0ZXJuL2ZhY3Rvcml6ZSBBUEkiKTsKKyAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICAKKyAgICB4LnNldFplcm8oKTsKKyAgICAvLyB0ZXN0IHdpdGggTWFwCisgICAgTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixNYXQ6Ok9wdGlvbnMsU3RvcmFnZUluZGV4PiBBbShBLnJvd3MoKSwgQS5jb2xzKCksIEEubm9uWmVyb3MoKSwgY29uc3RfY2FzdDxTdG9yYWdlSW5kZXgqPihBLm91dGVySW5kZXhQdHIoKSksIGNvbnN0X2Nhc3Q8U3RvcmFnZUluZGV4Kj4oQS5pbm5lckluZGV4UHRyKCkpLCBjb25zdF9jYXN0PFNjYWxhcio+KEEudmFsdWVQdHIoKSkpOworICAgIHNvbHZlci5jb21wdXRlKEFtKTsKKyAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBTdWNjZXNzICYmICJmYWN0b3JpemF0aW9uIGZhaWxlZCB3aGVuIHVzaW5nIE1hcCIpOworICAgIERlbnNlUmhzIGR4KHJlZlgpOworICAgIGR4LnNldFplcm8oKTsKKyAgICBNYXA8RGVuc2VSaHM+IHhtKGR4LmRhdGEoKSwgZHgucm93cygpLCBkeC5jb2xzKCkpOworICAgIE1hcDxjb25zdCBEZW5zZVJocz4gYm0oZGIuZGF0YSgpLCBkYi5yb3dzKCksIGRiLmNvbHMoKSk7CisgICAgeG0gPSBzb2x2ZXIuc29sdmUoYm0pOworICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MgJiYgInNvbHZpbmcgZmFpbGVkIHdoZW4gdXNpbmcgTWFwIik7CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYm0pICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKKyAgICBWRVJJRlkoeG0uaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgfQorICAKKyAgLy8gaWYgbm90IHRvbyBsYXJnZSwgZG8gc29tZSBleHRyYSBjaGVjazoKKyAgaWYoQS5yb3dzKCk8MjAwMCkKKyAgeworICAgIC8vIHRlc3QgaW5pdGlhbGl6YXRpb24gY3RvcgorICAgIHsKKyAgICAgIFJocyB4KGIucm93cygpLCBiLmNvbHMoKSk7CisgICAgICBTb2x2ZXIgc29sdmVyMihBKTsKKyAgICAgIFZFUklGWShzb2x2ZXIyLmluZm8oKSA9PSBTdWNjZXNzKTsKKyAgICAgIHggPSBzb2x2ZXIyLnNvbHZlKGIpOworICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGRlbnNlIEJsb2NrIGFzIHRoZSByZXN1bHQgYW5kIHJoczoKKyAgICB7CisgICAgICBEZW5zZVJocyB4KHJlZlgucm93cygpLCByZWZYLmNvbHMoKSk7CisgICAgICBEZW5zZVJocyBvbGRiKGRiKTsKKyAgICAgIHguc2V0WmVybygpOworICAgICAgeC5ibG9jaygwLDAseC5yb3dzKCkseC5jb2xzKCkpID0gc29sdmVyLnNvbHZlKGRiLmJsb2NrKDAsMCxkYi5yb3dzKCksZGIuY29scygpKSk7CisgICAgICBWRVJJRlkob2xkYi5pc0FwcHJveChkYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOworICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IHVuY29tcHJlc3NlZCBpbnB1dHMKKyAgICB7CisgICAgICBNYXQgQTIgPSBBOworICAgICAgQTIucmVzZXJ2ZSgoQXJyYXlYZjo6UmFuZG9tKEEub3V0ZXJTaXplKCkpKzIpLnRlbXBsYXRlIGNhc3Q8dHlwZW5hbWUgTWF0OjpTdG9yYWdlSW5kZXg+KCkuZXZhbCgpKTsKKyAgICAgIHNvbHZlci5jb21wdXRlKEEyKTsKKyAgICAgIFJocyB4ID0gc29sdmVyLnNvbHZlKGIpOworICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGV4cHJlc3Npb24gYXMgaW5wdXQKKyAgICB7CisgICAgICBzb2x2ZXIuY29tcHV0ZSgwLjUqKEErQSkpOworICAgICAgUmhzIHggPSBzb2x2ZXIuc29sdmUoYik7CisgICAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworCisgICAgICBTb2x2ZXIgc29sdmVyMigwLjUqKEErQSkpOworICAgICAgUmhzIHgyID0gc29sdmVyMi5zb2x2ZShiKTsKKyAgICAgIFZFUklGWSh4Mi5pc0FwcHJveChyZWZYLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocz4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhTb2x2ZXImIHNvbHZlciwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBSaHMmIGIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgZnVsbEEsIGNvbnN0IFJocyYgcmVmWCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgCisgIFJocyB4KEEuY29scygpLCBiLmNvbHMoKSk7CisKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SIHwgc3BhcnNlIHNvbHZlciB0ZXN0aW5nLCBmYWN0b3JpemF0aW9uIGZhaWxlZCAoIiA8PCB0eXBlaWQoU29sdmVyKS5uYW1lKCkgPDwgIilcbiI7CisgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2Vzcyk7CisgIH0KKyAgeCA9IHNvbHZlci5zb2x2ZShiKTsKKyAgCisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkcgfCBzcGFyc2Ugc29sdmVyIHRlc3RpbmcsIHNvbHZpbmcgZmFpbGVkICgiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiKVxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIFJlYWxTY2FsYXIgcmVzX2Vycm9yID0gKGZ1bGxBKngtYikubm9ybSgpL2Iubm9ybSgpOyAgCisgIFZFUklGWSggKHJlc19lcnJvciA8PSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkgKSAmJiAic3BhcnNlIHNvbHZlciBmYWlsZWQgd2l0aG91dCBub3RpY2luZyBpdCIpOyAKKworICAKKyAgaWYocmVmWC5zaXplKCkgIT0gMCAmJiAocmVmWCAtIHgpLm5vcm0oKS9yZWZYLm5vcm0oKSA+IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORyB8IGZvdW5kIHNvbHV0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwcm92aWRlZCByZWZlcmVuY2Ugb25lXG4iOworICB9CisgIAorfQordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBEZW5zZU1hdD4KK3ZvaWQgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IERlbnNlTWF0JiBkQSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgCisgIHNvbHZlci5jb21wdXRlKEEpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJXQVJOSU5HIHwgc3BhcnNlIHNvbHZlciB0ZXN0aW5nOiBmYWN0b3JpemF0aW9uIGZhaWxlZCAoY2hlY2tfc3BhcnNlX2RldGVybWluYW50KVxuIjsKKyAgICByZXR1cm47CisgIH0KKworICBTY2FsYXIgcmVmRGV0ID0gZEEuZGV0ZXJtaW5hbnQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZWZEZXQsc29sdmVyLmRldGVybWluYW50KCkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBEZW5zZU1hdD4KK3ZvaWQgY2hlY2tfc3BhcnNlX2Fic19kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlciwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBEZW5zZU1hdCYgZEEpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworICAKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkcgfCBzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IGZhY3Rvcml6YXRpb24gZmFpbGVkIChjaGVja19zcGFyc2VfYWJzX2RldGVybWluYW50KVxuIjsKKyAgICByZXR1cm47CisgIH0KKworICBTY2FsYXIgcmVmRGV0ID0gYWJzKGRBLmRldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlZkRldCxzb2x2ZXIuYWJzRGV0ZXJtaW5hbnQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgRGVuc2VNYXQ+CitpbnQgZ2VuZXJhdGVfc3BhcnNlX3NwZF9wcm9ibGVtKFNvbHZlciYgLCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgaGFsZkEsIERlbnNlTWF0JiBkQSwgaW50IG1heFNpemUgPSAzMDApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworCisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4U2l6ZSk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8oc2l6ZSpzaXplKSwgMC4wMSk7CisKKyAgTWF0IE0oc2l6ZSwgc2l6ZSk7CisgIERlbnNlTWF0cml4IGRNKHNpemUsIHNpemUpOworCisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkTSwgTSwgRm9yY2VOb25aZXJvRGlhZyk7CisKKyAgQSA9IE0gKiBNLmFkam9pbnQoKTsKKyAgZEEgPSBkTSAqIGRNLmFkam9pbnQoKTsKKyAgCisgIGhhbGZBLnJlc2l6ZShzaXplLHNpemUpOworICBpZihTb2x2ZXI6OlVwTG89PShMb3dlcnxVcHBlcikpCisgICAgaGFsZkEgPSBBOworICBlbHNlCisgICAgaGFsZkEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFNvbHZlcjo6VXBMbz4oKS5yYW5rVXBkYXRlKE0pOworICAKKyAgcmV0dXJuIHNpemU7Cit9CisKKworI2lmZGVmIFRFU1RfUkVBTF9DQVNFUwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIHN0ZDo6c3RyaW5nIGdldF9tYXRyaXhmb2xkZXIoKQoreworICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gVEVTVF9SRUFMX0NBU0VTOyAKKyAgaWYoIGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlICkKKyAgICBtYXRfZm9sZGVyICA9IG1hdF9mb2xkZXIgKyBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4oIi9jb21wbGV4LyIpOworICBlbHNlCisgICAgbWF0X2ZvbGRlciA9IG1hdF9mb2xkZXIgKyBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4oIi9yZWFsLyIpOworICByZXR1cm4gbWF0X2ZvbGRlcjsKK30KK3N0ZDo6c3RyaW5nIHN5bV90b19zdHJpbmcoaW50IHN5bSkKK3sKKyAgaWYoc3ltPT1TeW1tZXRyaWMpIHJldHVybiAiU3ltbWV0cmljICI7CisgIGlmKHN5bT09U1BEKSAgICAgICByZXR1cm4gIlNQRCAiOworICByZXR1cm4gIiI7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RkOjpzdHJpbmcgc29sdmVyX3N0YXRzKGNvbnN0IEl0ZXJhdGl2ZVNvbHZlckJhc2U8RGVyaXZlZD4gJnNvbHZlcikKK3sKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgIiBpdGVycywgZXJyb3I6ICIgPDwgc29sdmVyLmVycm9yKCk7CisgIHJldHVybiBzcy5zdHIoKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdGQ6OnN0cmluZyBzb2x2ZXJfc3RhdHMoY29uc3QgU3BhcnNlU29sdmVyQmFzZTxEZXJpdmVkPiAmLypzb2x2ZXIqLykKK3sKKyAgcmV0dXJuICIiOworfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIsIGludCBtYXhTaXplID0gMzAwLCBpbnQgbWF4UmVhbFdvcmxkU2l6ZSA9IDEwMDAwMCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvciwgU3RvcmFnZUluZGV4PiBTcE1hdDsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLCAwLCBTdG9yYWdlSW5kZXg+IFNwVmVjOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHByb2JsZW0KKyAgTWF0IEEsIGhhbGZBOworICBEZW5zZU1hdHJpeCBkQTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgaW50IHNpemUgPSBnZW5lcmF0ZV9zcGFyc2Vfc3BkX3Byb2JsZW0oc29sdmVyLCBBLCBoYWxmQSwgZEEsIG1heFNpemUpOworCisgICAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbmQgc2lkZXMKKyAgICBpbnQgcmhzQ29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDE2KTsKKyAgICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHNpemUqcmhzQ29scyksIDAuMSk7CisgICAgU3BNYXQgQihzaXplLHJoc0NvbHMpOworICAgIERlbnNlVmVjdG9yIGIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHNpemUpOworICAgIERlbnNlTWF0cml4IGRCKHNpemUscmhzQ29scyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIGRCLCBCLCBGb3JjZU5vblplcm9EaWFnKTsKKyAgICBTcFZlYyBjID0gQi5jb2woMCk7CisgICAgRGVuc2VWZWN0b3IgZGMgPSBkQi5jb2woMCk7CisgIAorICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCAgICAgYiwgIGRBLCBiKSAgKTsKKyAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgaGFsZkEsIGIsICBkQSwgYikgICk7CisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsICAgICBkQiwgZEEsIGRCKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBoYWxmQSwgZEIsIGRBLCBkQikgKTsKKyAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgICAgIEIsICBkQSwgZEIpICk7CisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBCLCAgZEEsIGRCKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCAgICAgYywgIGRBLCBkYykgKTsKKyAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgaGFsZkEsIGMsICBkQSwgZGMpICk7CisgICAgCisgICAgLy8gY2hlY2sgb25seSBvbmNlCisgICAgaWYoaT09MCkKKyAgICB7CisgICAgICBiID0gRGVuc2VWZWN0b3I6Olplcm8oc2l6ZSk7CisgICAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGIsIGRBLCBiKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIEZpcnN0LCBnZXQgdGhlIGZvbGRlciAKKyNpZmRlZiBURVNUX1JFQUxfQ0FTRVMKKyAgLy8gVGVzdCByZWFsIHByb2JsZW1zIHdpdGggZG91YmxlIHByZWNpc2lvbiBvbmx5CisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCwgZG91YmxlPjo6dmFsdWUpCisgIHsKKyAgICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gZ2V0X21hdHJpeGZvbGRlcjxTY2FsYXI+KCk7CisgICAgTWF0cml4TWFya2V0SXRlcmF0b3I8U2NhbGFyPiBpdChtYXRfZm9sZGVyKTsKKyAgICBmb3IgKDsgaXQ7ICsraXQpCisgICAgeworICAgICAgaWYgKGl0LnN5bSgpID09IFNQRCl7CisgICAgICAgIEEgPSBpdC5tYXRyaXgoKTsKKyAgICAgICAgaWYoQS5kaWFnb25hbCgpLnNpemUoKSA8PSBtYXhSZWFsV29ybGRTaXplKQorICAgICAgICB7CisgICAgICAgICAgRGVuc2VWZWN0b3IgYiA9IGl0LnJocygpOworICAgICAgICAgIERlbnNlVmVjdG9yIHJlZlggPSBpdC5yZWZYKCk7CisgICAgICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgU3RvcmFnZUluZGV4PiBwbnVsbDsKKyAgICAgICAgICBoYWxmQS5yZXNpemUoQS5yb3dzKCksIEEuY29scygpKTsKKyAgICAgICAgICBpZihTb2x2ZXI6OlVwTG8gPT0gKExvd2VyfFVwcGVyKSkKKyAgICAgICAgICAgIGhhbGZBID0gQTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBoYWxmQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8U29sdmVyOjpVcExvPigpID0gQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkudHdpc3RlZEJ5KHBudWxsKTsKKyAgICAgICAgICAKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIklORk8gfCBUZXN0aW5nICIgPDwgc3ltX3RvX3N0cmluZyhpdC5zeW0oKSkgPDwgInNwYXJzZSBwcm9ibGVtICIgPDwgaXQubWF0bmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IEEucm93cygpIDw8ICJ4IiA8PCBBLmNvbHMoKSA8PCAiKSB1c2luZyAiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiLi4uIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZ19yZWFsX2Nhc2VzKHNvbHZlciwgQSwgICAgIGIsIEEsIHJlZlgpICk7CisgICAgICAgICAgc3RkOjpzdHJpbmcgc3RhdHMgPSBzb2x2ZXJfc3RhdHMoc29sdmVyKTsKKyAgICAgICAgICBpZihzdGF0cy5zaXplKCk+MCkKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiSU5GTyB8ICAiIDw8IHN0YXRzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nX3JlYWxfY2FzZXMoc29sdmVyLCBoYWxmQSwgYiwgQSwgcmVmWCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIklORk8gfCBTa2lwIHNwYXJzZSBwcm9ibGVtIFwiIiA8PCBpdC5tYXRuYW1lKCkgPDwgIlwiICh0b28gbGFyZ2UpIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbHNlCisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShtYXhSZWFsV29ybGRTaXplKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHByb2JsZW0KKyAgTWF0IEEsIGhhbGZBOworICBEZW5zZU1hdHJpeCBkQTsKKyAgZ2VuZXJhdGVfc3BhcnNlX3NwZF9wcm9ibGVtKHNvbHZlciwgQSwgaGFsZkEsIGRBLCAzMCk7CisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBjaGVja19zcGFyc2VfZGV0ZXJtaW5hbnQoc29sdmVyLCBBLCAgICAgZEEpOworICAgIGNoZWNrX3NwYXJzZV9kZXRlcm1pbmFudChzb2x2ZXIsIGhhbGZBLCBkQSApOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgRGVuc2VNYXQ+CitJbmRleCBnZW5lcmF0ZV9zcGFyc2Vfc3F1YXJlX3Byb2JsZW0oU29sdmVyJiwgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhTaXplID0gMzAwLCBpbnQgb3B0aW9ucyA9IEZvcmNlTm9uWmVyb0RpYWcpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFNpemUpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHNpemUqc2l6ZSksIDAuMDEpOworICAKKyAgQS5yZXNpemUoc2l6ZSxzaXplKTsKKyAgZEEucmVzaXplKHNpemUsc2l6ZSk7CisKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIGRBLCBBLCBvcHRpb25zKTsKKyAgCisgIHJldHVybiBzaXplOworfQorCisKK3N0cnVjdCBwcnVuZV9jb2x1bW4geworICBJbmRleCBtX2NvbDsKKyAgcHJ1bmVfY29sdW1uKEluZGV4IGNvbCkgOiBtX2NvbChjb2wpIHt9CisgIHRlbXBsYXRlPGNsYXNzIFNjYWxhcj4KKyAgYm9vbCBvcGVyYXRvcigpKEluZGV4LCBJbmRleCBjb2wsIGNvbnN0IFNjYWxhciYpIGNvbnN0IHsKKyAgICByZXR1cm4gY29sICE9IG1fY29sOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIsIGludCBtYXhTaXplID0gMzAwLCBpbnQgbWF4UmVhbFdvcmxkU2l6ZSA9IDEwMDAwMCwgYm9vbCBjaGVja0RlZmljaWVudCA9IGZhbHNlKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsIHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4PiBTcE1hdDsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLCAwLCB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleD4gU3BWZWM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKworICBpbnQgcmhzQ29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDE2KTsKKworICBNYXQgQTsKKyAgRGVuc2VNYXRyaXggZEE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIEluZGV4IHNpemUgPSBnZW5lcmF0ZV9zcGFyc2Vfc3F1YXJlX3Byb2JsZW0oc29sdmVyLCBBLCBkQSwgbWF4U2l6ZSk7CisKKyAgICBBLm1ha2VDb21wcmVzc2VkKCk7CisgICAgRGVuc2VWZWN0b3IgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20oc2l6ZSk7CisgICAgRGVuc2VNYXRyaXggZEIoc2l6ZSxyaHNDb2xzKTsKKyAgICBTcE1hdCBCKHNpemUscmhzQ29scyk7CisgICAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhzaXplKnJoc0NvbHMpLCAwLjEpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQiwgQiwgRm9yY2VOb25aZXJvRGlhZyk7CisgICAgQi5tYWtlQ29tcHJlc3NlZCgpOworICAgIFNwVmVjIGMgPSBCLmNvbCgwKTsKKyAgICBEZW5zZVZlY3RvciBkYyA9IGRCLmNvbCgwKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBiLCAgZEEsIGIpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBkQiwgZEEsIGRCKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgQiwgIGRBLCBkQikpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGMsICBkQSwgZGMpKTsKKyAgICAKKyAgICAvLyBjaGVjayBvbmx5IG9uY2UKKyAgICBpZihpPT0wKQorICAgIHsKKyAgICAgIGIgPSBEZW5zZVZlY3Rvcjo6WmVybyhzaXplKTsKKyAgICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgZEEsIGIpOworICAgIH0KKyAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyA3OTIgKHN0cnVjdHVyYWxseSByYW5rIGRlZmljaWVudCBtYXRyaWNlcyk6CisgICAgaWYoY2hlY2tEZWZpY2llbnQgJiYgc2l6ZT4xKSB7CisgICAgICBJbmRleCBjb2wgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxpbnQoc2l6ZS0xKSk7CisgICAgICBBLnBydW5lKHBydW5lX2NvbHVtbihjb2wpKTsKKyAgICAgIHNvbHZlci5jb21wdXRlKEEpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHNvbHZlci5pbmZvKCksIE51bWVyaWNhbElzc3VlKTsKKyAgICB9CisgIH0KKyAgCisgIC8vIEZpcnN0LCBnZXQgdGhlIGZvbGRlciAKKyNpZmRlZiBURVNUX1JFQUxfQ0FTRVMKKyAgLy8gVGVzdCByZWFsIHByb2JsZW1zIHdpdGggZG91YmxlIHByZWNpc2lvbiBvbmx5CisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCwgZG91YmxlPjo6dmFsdWUpCisgIHsKKyAgICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gZ2V0X21hdHJpeGZvbGRlcjxTY2FsYXI+KCk7CisgICAgTWF0cml4TWFya2V0SXRlcmF0b3I8U2NhbGFyPiBpdChtYXRfZm9sZGVyKTsKKyAgICBmb3IgKDsgaXQ7ICsraXQpCisgICAgeworICAgICAgQSA9IGl0Lm1hdHJpeCgpOworICAgICAgaWYoQS5kaWFnb25hbCgpLnNpemUoKSA8PSBtYXhSZWFsV29ybGRTaXplKQorICAgICAgeworICAgICAgICBEZW5zZVZlY3RvciBiID0gaXQucmhzKCk7CisgICAgICAgIERlbnNlVmVjdG9yIHJlZlggPSBpdC5yZWZYKCk7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiSU5GTyB8IFRlc3RpbmcgIiA8PCBzeW1fdG9fc3RyaW5nKGl0LnN5bSgpKSA8PCAic3BhcnNlIHByb2JsZW0gIiA8PCBpdC5tYXRuYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgQS5yb3dzKCkgPDwgIngiIDw8IEEuY29scygpIDw8ICIpIHVzaW5nICIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nX3JlYWxfY2FzZXMoc29sdmVyLCBBLCBiLCBBLCByZWZYKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0YXRzID0gc29sdmVyX3N0YXRzKHNvbHZlcik7CisgICAgICAgIGlmKHN0YXRzLnNpemUoKT4wKQorICAgICAgICAgIHN0ZDo6Y291dCA8PCAiSU5GTyB8ICAiIDw8IHN0YXRzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJJTkZPIHwgU0tJUCBzcGFyc2UgcHJvYmxlbSBcIiIgPDwgaXQubWF0bmFtZSgpIDw8ICJcIiAodG9vIGxhcmdlKSIgPDwgc3RkOjplbmRsOworICAgICAgfQorICAgIH0KKyAgfQorI2Vsc2UKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG1heFJlYWxXb3JsZFNpemUpOworI2VuZGlmCisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyPiB2b2lkIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgLy8gZ2VuZXJhdGUgdGhlIHByb2JsZW0KKyAgICBNYXQgQTsKKyAgICBEZW5zZU1hdHJpeCBkQTsKKyAgICAKKyAgICBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxLDMwKTsKKyAgICBkQS5zZXRSYW5kb20oc2l6ZSxzaXplKTsKKyAgICAKKyAgICBkQSA9IChkQS5hcnJheSgpLmFicygpPDAuMykuc2VsZWN0KDAsZEEpOworICAgIGRBLmRpYWdvbmFsKCkgPSAoZEEuZGlhZ29uYWwoKS5hcnJheSgpPT0wKS5zZWxlY3QoMSxkQS5kaWFnb25hbCgpKTsKKyAgICBBID0gZEEuc3BhcnNlVmlldygpOworICAgIEEubWFrZUNvbXByZXNzZWQoKTsKKyAgCisgICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgQSwgZEEpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX2Fic19kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgLy8gZ2VuZXJhdGUgdGhlIHByb2JsZW0KKyAgICBNYXQgQTsKKyAgICBEZW5zZU1hdHJpeCBkQTsKKyAgICBnZW5lcmF0ZV9zcGFyc2Vfc3F1YXJlX3Byb2JsZW0oc29sdmVyLCBBLCBkQSwgMzApOworICAgIEEubWFrZUNvbXByZXNzZWQoKTsKKyAgICBjaGVja19zcGFyc2VfYWJzX2RldGVybWluYW50KHNvbHZlciwgQSwgZEEpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgRGVuc2VNYXQ+Cit2b2lkIGdlbmVyYXRlX3NwYXJzZV9sZWFzdHNxdWFyZV9wcm9ibGVtKFNvbHZlciYsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCwgaW50IG9wdGlvbnMgPSBGb3JjZU5vblplcm9EaWFnKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworCisgIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4U2l6ZSk7CisgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEscm93cyk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIAorICBBLnJlc2l6ZShyb3dzLGNvbHMpOworICBkQS5yZXNpemUocm93cyxjb2xzKTsKKworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIG9wdGlvbnMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvciwgdHlwZW5hbWUgTWF0OjpTdG9yYWdlSW5kZXg+IFNwTWF0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisKKyAgaW50IHJoc0NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxNik7CisKKyAgTWF0IEE7CisgIERlbnNlTWF0cml4IGRBOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBnZW5lcmF0ZV9zcGFyc2VfbGVhc3RzcXVhcmVfcHJvYmxlbShzb2x2ZXIsIEEsIGRBKTsKKworICAgIEEubWFrZUNvbXByZXNzZWQoKTsKKyAgICBEZW5zZVZlY3RvciBiID0gRGVuc2VWZWN0b3I6OlJhbmRvbShBLnJvd3MoKSk7CisgICAgRGVuc2VNYXRyaXggZEIoQS5yb3dzKCkscmhzQ29scyk7CisgICAgU3BNYXQgQihBLnJvd3MoKSxyaHNDb2xzKTsKKyAgICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKEEucm93cygpKnJoc0NvbHMpLCAwLjEpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQiwgQiwgRm9yY2VOb25aZXJvRGlhZyk7CisgICAgQi5tYWtlQ29tcHJlc3NlZCgpOworICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgIGRBLCBiKTsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGRCLCBkQSwgZEIpOworICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgQiwgIGRBLCBkQik7CisgICAgCisgICAgLy8gY2hlY2sgb25seSBvbmNlCisgICAgaWYoaT09MCkKKyAgICB7CisgICAgICBiID0gRGVuc2VWZWN0b3I6Olplcm8oQS5yb3dzKCkpOworICAgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBiLCBkQSwgYik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9zb2x2ZXJzLmNwcCBiL3Rlc3Qvc3BhcnNlX3NvbHZlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZV9zb2x2ZXJzLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkCitpbml0U1BEKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4mIHJlZk1hdCwKKyAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4mIHNwYXJzZU1hdCkKK3sKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGF1eChyZWZNYXQucm93cygpLHJlZk1hdC5jb2xzKCkpOworICBpbml0U3BhcnNlKGRlbnNpdHkscmVmTWF0LHNwYXJzZU1hdCk7CisgIHJlZk1hdCA9IHJlZk1hdCAqIHJlZk1hdC5hZGpvaW50KCk7CisgIGZvciAoaW50IGs9MDsgazwyOyArK2spCisgIHsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksYXV4LHNwYXJzZU1hdCxGb3JjZU5vblplcm9EaWFnKTsKKyAgICByZWZNYXQgKz0gYXV4ICogYXV4LmFkam9pbnQoKTsKKyAgfQorICBzcGFyc2VNYXQuc2V0WmVybygpOworICBmb3IgKGludCBqPTAgOyBqPHNwYXJzZU1hdC5jb2xzKCk7ICsraikKKyAgICBmb3IgKGludCBpPWogOyBpPHNwYXJzZU1hdC5yb3dzKCk7ICsraSkKKyAgICAgIGlmIChyZWZNYXQoaSxqKSE9U2NhbGFyKDApKQorICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0KGksaikgPSByZWZNYXQoaSxqKTsKKyAgc3BhcnNlTWF0LmZpbmFsaXplKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2Vfc29sdmVycyhpbnQgcm93cywgaW50IGNvbHMpCit7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgLy8gU2NhbGFyIGVwcyA9IDFlLTY7CisKKyAgRGVuc2VWZWN0b3IgdmVjMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHplcm9Db29yZHM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBub256ZXJvQ29vcmRzOworCisgIC8vIHRlc3QgdHJpYW5ndWxhciBzb2x2ZXIKKyAgeworICAgIERlbnNlVmVjdG9yIHZlYzIgPSB2ZWMxLCB2ZWMzID0gdmVjMTsKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtMihyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisKKyAgICAvLyBsb3dlciAtIGRlbnNlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOworCisgICAgLy8gdXBwZXIgLSBkZW5zZQorICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlVXBwZXJUcmlhbmd1bGFyLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMyKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMzKSk7CisgICAgeworICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4gY20yKG0yKTsKKyAgICAgIC8vSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggbm56LCBJbmRleCogb3V0ZXJJbmRleFB0ciwgSW5kZXgqIGlubmVySW5kZXhQdHIsIFNjYWxhciogdmFsdWVQdHIKKyAgICAgIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1tMihyb3dzLCBjb2xzLCBjbTIubm9uWmVyb3MoKSwgY20yLm91dGVySW5kZXhQdHIoKSwgY20yLmlubmVySW5kZXhQdHIoKSwgY20yLnZhbHVlUHRyKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgICBtbTIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOworICAgIH0KKworICAgIC8vIGxvd2VyIC0gdHJhbnNwb3NlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOworCisgICAgLy8gdXBwZXIgLSB0cmFuc3Bvc2UKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWd8TWFrZVVwcGVyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZSh2ZWMzKSk7CisKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXRCKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk1hdEIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKworICAgIC8vIGxvd2VyIC0gc3BhcnNlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXRCLCBtYXRCKTsKKyAgICByZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlSW5QbGFjZShyZWZNYXRCKTsKKyAgICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobWF0Qik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXRCLnRvRGVuc2UoKSwgcmVmTWF0Qik7CisKKyAgICAvLyB1cHBlciAtIHNwYXJzZQorICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlVXBwZXJUcmlhbmd1bGFyKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0QiwgbWF0Qik7CisgICAgcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UocmVmTWF0Qik7CisgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0QiwgcmVmTWF0Qik7CisKKyAgICAvLyB0ZXN0IGRlcHJlY2F0ZWQgQVBJCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2Vfc29sdmVycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX3NvbHZlcnM8ZG91YmxlPig4LCA4KSApOworICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKTsKKyAgICBDQUxMX1NVQlRFU1RfMihzcGFyc2Vfc29sdmVyczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMscykgKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzcGFyc2Vfc29sdmVyczxkb3VibGU+KHMscykgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfdmVjdG9yLmNwcCBiL3Rlc3Qvc3BhcnNlX3ZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMWRkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlX3ZlY3Rvci5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBTdG9yYWdlSW5kZXg+IHZvaWQgc3BhcnNlX3ZlY3RvcihpbnQgcm93cywgaW50IGNvbHMpCit7CisgIGRvdWJsZSBkZW5zaXR5TWF0ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIGRvdWJsZSBkZW5zaXR5VmVjID0gKHN0ZDo6bWF4KSg4Li8ocm93cyksIDAuMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLDAsU3RvcmFnZUluZGV4PiBTcGFyc2VWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsMCxTdG9yYWdlSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7CisgIFNjYWxhciBlcHMgPSAxZS02OworCisgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cyxyb3dzKTsKKyAgU3BhcnNlVmVjdG9yVHlwZSB2MShyb3dzKSwgdjIocm93cyksIHYzKHJvd3MpOworICBEZW5zZU1hdHJpeCByZWZNMSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICBEZW5zZVZlY3RvciByZWZWMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgIHJlZlYyID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICAgcmVmVjMgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpOworCisgIHN0ZDo6dmVjdG9yPGludD4gemVyb2Nvb3Jkcywgbm9uemVyb2Nvb3JkczsKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHlWZWMsIHJlZlYxLCB2MSwgJnplcm9jb29yZHMsICZub256ZXJvY29vcmRzKTsKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHlNYXQsIHJlZk0xLCBtMSk7CisKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHlWZWMsIHJlZlYyLCB2Mik7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5VmVjLCByZWZWMywgdjMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHRlc3QgY29lZmYgYW5kIGNvZWZmUmVmCisgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTx6ZXJvY29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCB2MS5jb2VmZih6ZXJvY29vcmRzW2ldKSwgZXBzICk7CisgICAgLy9WRVJJRllfUkFJU0VTX0FTU0VSVCggdjEuY29lZmZSZWYoemVyb2Nvb3Jkc1tpXSkgPSA1ICk7CisgIH0KKyAgeworICAgIFZFUklGWShpbnQobm9uemVyb2Nvb3Jkcy5zaXplKCkpID09IHYxLm5vblplcm9zKCkpOworICAgIGludCBqPTA7CisgICAgZm9yICh0eXBlbmFtZSBTcGFyc2VWZWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KHYxKTsgaXQ7ICsraXQsKytqKQorICAgIHsKKyAgICAgIFZFUklGWShub256ZXJvY29vcmRzW2pdPT1pdC5pbmRleCgpKTsKKyAgICAgIFZFUklGWShpdC52YWx1ZSgpPT12MS5jb2VmZihpdC5pbmRleCgpKSk7CisgICAgICBWRVJJRlkoaXQudmFsdWUoKT09cmVmVjEuY29lZmYoaXQuaW5kZXgoKSkpOworICAgIH0KKyAgfQorICBWRVJJRllfSVNfQVBQUk9YKHYxLCByZWZWMSk7CisgIAorICAvLyB0ZXN0IGNvZWZmUmVmIHdpdGggcmVhbGxvY2F0aW9uCisgIHsKKyAgICBTcGFyc2VWZWN0b3JUeXBlIHY0KHJvd3MpOworICAgIERlbnNlVmVjdG9yIHY1ID0gRGVuc2VWZWN0b3I6Olplcm8ocm93cyk7CisgICAgZm9yKGludCBrPTA7IGs8cm93czsgKytrKQorICAgIHsKKyAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICAgIFNjYWxhciB2ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgICB2NC5jb2VmZlJlZihpKSArPSB2OworICAgICAgdjUuY29lZmZSZWYoaSkgKz0gdjsKKyAgICB9CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2NCx2NSk7CisgIH0KKworICB2MS5jb2VmZlJlZihub256ZXJvY29vcmRzWzBdKSA9IFNjYWxhcig1KTsKKyAgcmVmVjEuY29lZmZSZWYobm9uemVyb2Nvb3Jkc1swXSkgPSBTY2FsYXIoNSk7CisgIFZFUklGWV9JU19BUFBST1godjEsIHJlZlYxKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYxK3YyLCByZWZWMStyZWZWMik7CisgIFZFUklGWV9JU19BUFBST1godjErdjIrdjMsIHJlZlYxK3JlZlYyK3JlZlYzKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYxKnMxLXYyLCByZWZWMSpzMS1yZWZWMik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSo9czEsIHJlZlYxKj1zMSk7CisgIFZFUklGWV9JU19BUFBST1godjEvPXMxLCByZWZWMS89czEpOworCisgIFZFUklGWV9JU19BUFBST1godjErPXYyLCByZWZWMSs9cmVmVjIpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLT12MiwgcmVmVjEtPXJlZlYyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdCh2MiksIHJlZlYxLmRvdChyZWZWMikpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdChyZWZWMiksIHJlZlYxLmRvdChyZWZWMikpOworCisgIFZFUklGWV9JU19BUFBST1gobTEqdjIsIHJlZk0xKnJlZlYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5kb3QobTEqdjIpLCByZWZWMS5kb3QocmVmTTEqcmVmVjIpKTsKKyAgeworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdChtMS5jb2woaSkpLCByZWZWMS5kb3QocmVmTTEuY29sKGkpKSk7CisgIH0KKworCisgIFZFUklGWV9JU19BUFBST1godjEuc3F1YXJlZE5vcm0oKSwgcmVmVjEuc3F1YXJlZE5vcm0oKSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKHYxLmJsdWVOb3JtKCksIHJlZlYxLmJsdWVOb3JtKCkpOworCisgIC8vIHRlc3QgYWxpYXNpbmcKKyAgVkVSSUZZX0lTX0FQUFJPWCgodjEgPSAtdjEpLCAocmVmVjEgPSAtcmVmVjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgodjEgPSB2MS50cmFuc3Bvc2UoKSksIChyZWZWMSA9IHJlZlYxLnRyYW5zcG9zZSgpLmV2YWwoKSkpOworICBWRVJJRllfSVNfQVBQUk9YKCh2MSArPSAtdjEpLCAocmVmVjEgKz0gLXJlZlYxKSk7CisgIAorICAvLyBzcGFyc2UgbWF0cml4IHRvIHNwYXJzZSB2ZWN0b3IKKyAgU3BhcnNlTWF0cml4VHlwZSBtdjE7CisgIFZFUklGWV9JU19BUFBST1goKG12MT12MSksdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG12MSwodjE9bXYxKSk7CisgIFZFUklGWV9JU19BUFBST1gobXYxLCh2MT1tdjEudHJhbnNwb3NlKCkpKTsKKyAgCisgIC8vIGNoZWNrIGNvcHkgdG8gZGVuc2UgdmVjdG9yIHdpdGggdHJhbnNwb3NlCisgIHJlZlYzLnJlc2l6ZSgwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZWZWMyA9IHYxLnRyYW5zcG9zZSgpLHYxLnRvRGVuc2UoKSk7IAorICBWRVJJRllfSVNfQVBQUk9YKERlbnNlVmVjdG9yKHYxKSx2MS50b0RlbnNlKCkpOyAKKworICAvLyB0ZXN0IGNvbnNlcnZhdGl2ZSByZXNpemUKKyAgeworICAgIHN0ZDo6dmVjdG9yPFN0b3JhZ2VJbmRleD4gaW5jOworICAgIGlmKHJvd3MgPiAzKQorICAgICAgaW5jLnB1c2hfYmFjaygtMyk7CisgICAgaW5jLnB1c2hfYmFjaygwKTsKKyAgICBpbmMucHVzaF9iYWNrKDMpOworICAgIGluYy5wdXNoX2JhY2soMSk7CisgICAgaW5jLnB1c2hfYmFjaygxMCk7CisKKyAgICBmb3Ioc3RkOjpzaXplX3QgaSA9IDA7IGk8IGluYy5zaXplKCk7IGkrKykgeworICAgICAgU3RvcmFnZUluZGV4IGluY1Jvd3MgPSBpbmNbaV07CisgICAgICBTcGFyc2VWZWN0b3JUeXBlIHZlYzEocm93cyk7CisgICAgICBEZW5zZVZlY3RvciByZWZWZWMxID0gRGVuc2VWZWN0b3I6Olplcm8ocm93cyk7CisgICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eVZlYywgcmVmVmVjMSwgdmVjMSk7CisKKyAgICAgIHZlYzEuY29uc2VydmF0aXZlUmVzaXplKHJvd3MraW5jUm93cyk7CisgICAgICByZWZWZWMxLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzK2luY1Jvd3MpOworICAgICAgaWYgKGluY1Jvd3MgPiAwKSByZWZWZWMxLnRhaWwoaW5jUm93cykuc2V0WmVybygpOworCisgICAgICBWRVJJRllfSVNfQVBQUk9YKHZlYzEsIHJlZlZlYzEpOworCisgICAgICAvLyBJbnNlcnQgbmV3IHZhbHVlcworICAgICAgaWYgKGluY1Jvd3MgPiAwKQorICAgICAgICB2ZWMxLmluc2VydCh2ZWMxLnJvd3MoKS0xKSA9IHJlZlZlYzEocmVmVmVjMS5yb3dzKCktMSkgPSAxOworCisgICAgICBWRVJJRllfSVNfQVBQUk9YKHZlYzEsIHJlZlZlYzEpOworICAgIH0KKyAgfQorCit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfdmVjdG9yKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwMCk7CisgICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKKyAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCisgICAgfQorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShyK2MpOworCisgICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfdmVjdG9yPGRvdWJsZSxpbnQ+KDgsIDgpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggc3BhcnNlX3ZlY3RvcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50PihyLCBjKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV92ZWN0b3I8ZG91YmxlLGxvbmcgaW50PihyLCBjKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV92ZWN0b3I8ZG91YmxlLHNob3J0PihyLCBjKSApKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZWx1LmNwcCBiL3Rlc3Qvc3BhcnNlbHUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMDAwYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZWx1LmNwcApAQCAtMCwwICsxLDQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFNwYXJzZUxVIHNvbHZlIGRvZXMgbm90IGFjY2VwdCBjb2x1bW4gbWFqb3IgbWF0cmljZXMgZm9yIHRoZSBkZXN0aW5hdGlvbi4KKy8vIEhvd2V2ZXIsIGFzIGV4cGVjdGVkLCB0aGUgZ2VuZXJpYyBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcgcm91dGluZXMgcHJvZHVjZXMgcm93LW1ham9yCisvLyByaHMgYW5kIGRlc3RpbmF0aW9uIG1hdHJpY2VzIHdoZW4gY29tcGlsZWQgd2l0aCBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorCisjaWZkZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyN1bmRlZiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorI2VuZGlmCisKKyNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlTFU+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9zcGFyc2VsdV9UKCkKK3sKKyAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiAvKiwgQ09MQU1ET3JkZXJpbmc8aW50PiovID4gc3BhcnNlbHVfY29sYW1kOyAvLyBDT0xBTURPcmRlcmluZyBpcyB0aGUgZGVmYXVsdAorICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBBTURPcmRlcmluZzxpbnQ+ID4gc3BhcnNlbHVfYW1kOyAKKyAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yLCBsb25nIGludD4sIE5hdHVyYWxPcmRlcmluZzxsb25nIGludD4gPiBzcGFyc2VsdV9uYXR1cmFsOworICAKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X2NvbGFtZCwgIDMwMCwgMTAwMDAwLCB0cnVlKTsgCisgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzcGFyc2VsdV9hbWQsICAgICAzMDAsICAxMDAwMCwgdHJ1ZSk7CisgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzcGFyc2VsdV9uYXR1cmFsLCAzMDAsICAgMjAwMCwgdHJ1ZSk7CisgIAorICBjaGVja19zcGFyc2Vfc3F1YXJlX2Fic19kZXRlcm1pbmFudChzcGFyc2VsdV9jb2xhbWQpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX2Fic19kZXRlcm1pbmFudChzcGFyc2VsdV9hbWQpOworICAKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChzcGFyc2VsdV9jb2xhbWQpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHNwYXJzZWx1X2FtZCk7Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2VsdSgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3Rfc3BhcnNlbHVfVDxmbG9hdD4oKSk7IAorICBDQUxMX1NVQlRFU1RfMih0ZXN0X3NwYXJzZWx1X1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9zcGFyc2VsdV9UPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsgCisgIENBTExfU1VCVEVTVF80KHRlc3Rfc3BhcnNlbHVfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2Vxci5jcHAgYi90ZXN0L3NwYXJzZXFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODYwNWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2Vxci5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIERlc2lyZSBOdWVudHNhIFdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxNCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorI2luY2x1ZGUgInNwYXJzZS5oIgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZVFSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKE1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFJvd3MgPSAzMDAsIGludCBtYXhDb2xzID0gMTUwKQoreworICBlaWdlbl9hc3NlcnQobWF4Um93cyA+PSBtYXhDb2xzKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFJvd3MpOworICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heENvbHMpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICAKKyAgQS5yZXNpemUocm93cyxjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsY29scyk7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQSwgQSxGb3JjZU5vblplcm9EaWFnKTsKKyAgQS5tYWtlQ29tcHJlc3NlZCgpOworICBpbnQgbm9wID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLDEpID4gMC41ID8gY29scy8yIDogMCk7CisgIGZvcihpbnQgaz0wOyBrPG5vcDsgKytrKQorICB7CisgICAgaW50IGowID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKTsKKyAgICBpbnQgajEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICAgIFNjYWxhciBzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgQS5jb2woajApICA9IHMgKiBBLmNvbChqMSk7CisgICAgZEEuY29sKGowKSA9IHMgKiBkQS5jb2woajEpOworICB9CisgIAorLy8gICBpZihyb3dzPGNvbHMpIHsKKy8vICAgICBBLmNvbnNlcnZhdGl2ZVJlc2l6ZShjb2xzLGNvbHMpOworLy8gICAgIGRBLmNvbnNlcnZhdGl2ZVJlc2l6ZShjb2xzLGNvbHMpOworLy8gICAgIGRBLmJvdHRvbVJvd3MoY29scy1yb3dzKS5zZXRaZXJvKCk7CisvLyAgIH0KKyAgCisgIHJldHVybiByb3dzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgdGVzdF9zcGFyc2Vxcl9zY2FsYXIoKQoreworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3I+IE1hdHJpeFR5cGU7IAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIE1hdHJpeFR5cGUgQTsKKyAgRGVuc2VNYXQgZEE7CisgIERlbnNlVmVjdG9yIHJlZlgseCxiOyAKKyAgU3BhcnNlUVI8TWF0cml4VHlwZSwgQ09MQU1ET3JkZXJpbmc8aW50PiA+IHNvbHZlcjsgCisgIGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKEEsZEEpOworICAKKyAgYiA9IGRBICogRGVuc2VWZWN0b3I6OlJhbmRvbShBLmNvbHMoKSk7CisgIHNvbHZlci5jb21wdXRlKEEpOworICBpZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpPjAuNWYpCisgICAgc29sdmVyLmZhY3Rvcml6ZShBKTsgIC8vIHRoaXMgY2hlY2tzIHRoYXQgY2FsbGluZyBhbmFseXplUGF0dGVybiBpcyBub3QgbmVlZGVkIGlmIHRoZSBwYXR0ZXJuIGRvIG5vdCBjaGFuZ2UuCisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBRUiBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKKyAgICBleGl0KDApOworICAgIHJldHVybjsKKyAgfQorICB4ID0gc29sdmVyLnNvbHZlKGIpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBmYWlsZWRcbiI7CisgICAgZXhpdCgwKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIFZFUklGWV9JU19BUFBST1goQSAqIHgsIGIpOworICAKKyAgLy9Db21wYXJlIHdpdGggYSBkZW5zZSBRUiBzb2x2ZXIKKyAgQ29sUGl2SG91c2Vob2xkZXJRUjxEZW5zZU1hdD4gZHFyKGRBKTsKKyAgcmVmWCA9IGRxci5zb2x2ZShiKTsKKyAgCisgIFZFUklGWV9JU19FUVVBTChkcXIucmFuaygpLCBzb2x2ZXIucmFuaygpKTsKKyAgaWYoc29sdmVyLnJhbmsoKT09QS5jb2xzKCkpIC8vIGZ1bGwgcmFuaworICAgIFZFUklGWV9JU19BUFBST1goeCwgcmVmWCk7CisvLyAgIGVsc2UKKy8vICAgICBWRVJJRlkoKGRBICogcmVmWCAtIGIpLm5vcm0oKSAqIDIgPiAoQSAqIHggLSBiKS5ub3JtKCkgKTsKKworICAvLyBDb21wdXRlIGV4cGxpY2l0bHkgdGhlIG1hdHJpeCBRCisgIE1hdHJpeFR5cGUgUSwgUXRRLCBpZE07CisgIFEgPSBzb2x2ZXIubWF0cml4USgpOworICAvL0NoZWNrICB8fFEnICogUSAtIEkgfHwKKyAgUXRRID0gUSAqIFEuYWRqb2ludCgpOworICBpZE0ucmVzaXplKFEucm93cygpLCBRLnJvd3MoKSk7IGlkTS5zZXRJZGVudGl0eSgpOworICBWRVJJRlkoaWRNLmlzQXBwcm94KFF0USkpOworICAKKyAgLy8gUSB0byBkZW5zZQorICBEZW5zZU1hdCBkUTsKKyAgZFEgPSBzb2x2ZXIubWF0cml4USgpOworICBWRVJJRllfSVNfQVBQUk9YKFEsIGRRKTsKK30KK3ZvaWQgdGVzdF9zcGFyc2VxcigpCit7CisgIGZvcihpbnQgaT0wOyBpPGdfcmVwZWF0OyArK2kpCisgIHsKKyAgICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NwYXJzZXFyX3NjYWxhcjxkb3VibGU+KCkpOworICAgIENBTExfU1VCVEVTVF8yKHRlc3Rfc3BhcnNlcXJfc2NhbGFyPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zcGVjaWFsX251bWJlcnMuY3BwIGIvdGVzdC9zcGVjaWFsX251bWJlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwZWNpYWxfbnVtYmVycy5jcHAKQEAgLTAsMCArMSw1OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgc3BlY2lhbF9udW1iZXJzKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLER5bmFtaWM+IE1hdFR5cGU7CisgIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDApOworICAKKyAgU2NhbGFyIG5hbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgIFNjYWxhciBpbmYgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmluZmluaXR5KCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAKKyAgTWF0VHlwZSBtMSAgICA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLAorICAgICAgICAgIG1uYW4gID0gTWF0VHlwZTo6UmFuZG9tKHJvd3MsY29scyksCisgICAgICAgICAgbWluZiAgPSBNYXRUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwKKyAgICAgICAgICBtYm90aCA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICAgICAgICAgIAorICBpbnQgbiA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEwKTsKKyAgZm9yKGludCBrPTA7IGs8bjsgKytrKQorICB7CisgICAgbW5hbihpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSA9IG5hbjsKKyAgICBtaW5mKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksIGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpID0gaW5mOworICB9CisgIG1ib3RoID0gbW5hbiArIG1pbmY7CisgIAorICBWRVJJRlkoIW0xLmhhc05hTigpKTsKKyAgVkVSSUZZKG0xLmFsbEZpbml0ZSgpKTsKKyAgCisgIFZFUklGWShtbmFuLmhhc05hTigpKTsKKyAgVkVSSUZZKChzMSptbmFuKS5oYXNOYU4oKSk7CisgIFZFUklGWSghbWluZi5oYXNOYU4oKSk7CisgIFZFUklGWSghKDIqbWluZikuaGFzTmFOKCkpOworICBWRVJJRlkobWJvdGguaGFzTmFOKCkpOworICBWRVJJRlkobWJvdGguYXJyYXkoKS5oYXNOYU4oKSk7CisgIAorICBWRVJJRlkoIW1uYW4uYWxsRmluaXRlKCkpOworICBWRVJJRlkoIW1pbmYuYWxsRmluaXRlKCkpOworICBWRVJJRlkoIShtaW5mLW1ib3RoKS5hbGxGaW5pdGUoKSk7CisgIFZFUklGWSghbWJvdGguYWxsRmluaXRlKCkpOworICBWRVJJRlkoIW1ib3RoLmFycmF5KCkuYWxsRmluaXRlKCkpOworfQorCit2b2lkIHRlc3Rfc3BlY2lhbF9udW1iZXJzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IDEwKmdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3BlY2lhbF9udW1iZXJzPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwZWNpYWxfbnVtYmVyczxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcHFyX3N1cHBvcnQuY3BwIGIvdGVzdC9zcHFyX3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwcXJfc3VwcG9ydC5jcHAKQEAgLTAsMCArMSw2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRGVzaXJlIE51ZW50c2EgV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisKKyNkZWZpbmUgRUlHRU5fTk9fREVCVUdfU01BTExfUFJPRFVDVF9CTE9DS1MKKyNpbmNsdWRlICJzcGFyc2UuaCIKKyNpbmNsdWRlIDxFaWdlbi9TUFFSU3VwcG9ydD4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKE1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFJvd3MgPSAzMDAsIGludCBtYXhDb2xzID0gMzAwKQoreworICBlaWdlbl9hc3NlcnQobWF4Um93cyA+PSBtYXhDb2xzKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFJvd3MpOworICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLHJvd3MpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICAKKyAgQS5yZXNpemUocm93cyxjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsY29scyk7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQSwgQSxGb3JjZU5vblplcm9EaWFnKTsKKyAgQS5tYWtlQ29tcHJlc3NlZCgpOworICByZXR1cm4gcm93czsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHRlc3Rfc3Bxcl9zY2FsYXIoKQoreworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3I+IE1hdHJpeFR5cGU7IAorICBNYXRyaXhUeXBlIEE7CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBkQTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIERlbnNlVmVjdG9yIHJlZlgseCxiOyAKKyAgU1BRUjxNYXRyaXhUeXBlPiBzb2x2ZXI7IAorICBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShBLGRBKTsKKyAgCisgIEluZGV4IG0gPSBBLnJvd3MoKTsKKyAgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20obSk7CisgIHNvbHZlci5jb21wdXRlKEEpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBmYWlsZWRcbiI7CisgICAgZXhpdCgwKTsKKyAgICByZXR1cm47CisgIH0KKyAgeCA9IHNvbHZlci5zb2x2ZShiKTsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAic3BhcnNlIFFSIGZhY3Rvcml6YXRpb24gZmFpbGVkXG4iOworICAgIGV4aXQoMCk7CisgICAgcmV0dXJuOworICB9ICAKKyAgLy9Db21wYXJlIHdpdGggYSBkZW5zZSBzb2x2ZXIKKyAgcmVmWCA9IGRBLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShiKTsKKyAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKK30KK3ZvaWQgdGVzdF9zcHFyX3N1cHBvcnQoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NwcXJfc2NhbGFyPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3Rfc3Bxcl9zY2FsYXI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhYmxlX25vcm0uY3BwIGIvdGVzdC9zdGFibGVfbm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlYjVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RhYmxlX25vcm0uY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fRE9OVF9JTkxJTkUgVCBjb3B5KGNvbnN0IFQmIHgpCit7CisgIHJldHVybiB4OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN0YWJsZV9ub3JtKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgU3RhYmxlTm9ybS5oCisgICovCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAKKyAgYm9vbCBjb21wbGV4X3JlYWxfcHJvZHVjdF9vayA9IHRydWU7CisKKyAgLy8gQ2hlY2sgdGhlIGJhc2ljIG1hY2hpbmUtZGVwZW5kZW50IGNvbnN0YW50cy4KKyAgeworICAgIGludCBpYmV0YSwgaXQsIGllbWluLCBpZW1heDsKKworICAgIGliZXRhID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6cmFkaXg7ICAgICAgICAgLy8gYmFzZSBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycworICAgIGl0ICAgID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6ZGlnaXRzOyAgICAgICAgLy8gbnVtYmVyIG9mIGJhc2UtYmV0YSBkaWdpdHMgaW4gbWFudGlzc2EKKyAgICBpZW1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbl9leHBvbmVudDsgIC8vIG1pbmltdW0gZXhwb25lbnQKKyAgICBpZW1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDsgIC8vIG1heGltdW0gZXhwb25lbnQKKworICAgIFZFUklGWSggKCEoaWVtaW4gPiAxIC0gMippdCB8fCAxK2l0PmllbWF4IHx8IChpdD09MiAmJiBpYmV0YTw1KSB8fCAoaXQ8PTQgJiYgaWJldGEgPD0gMyApIHx8IGl0PDIpKQorICAgICAgICAgICAmJiAidGhlIHN0YWJsZSBub3JtIGFsZ29yaXRobSBjYW5ub3QgYmUgZ3VhcmFudGVlZCBvbiB0aGlzIGNvbXB1dGVyIik7CisgICAgCisgICAgU2NhbGFyIGluZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmluZmluaXR5KCk7CisgICAgaWYoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiAobnVtZXh0Ojppc25hbikoaW5mKlJlYWxTY2FsYXIoMSkpICkKKyAgICB7CisgICAgICBjb21wbGV4X3JlYWxfcHJvZHVjdF9vayA9IGZhbHNlOworICAgICAgc3RhdGljIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgaWYoZmlyc3QpCisgICAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogY29tcGlsZXIgbWVzcyB1cCBjb21wbGV4KnJlYWwgcHJvZHVjdCwgIiA8PCBpbmYgPDwgIiAqICIgPDwgMS4wIDw8ICIgPSAiIDw8IGluZipSZWFsU2NhbGFyKDEpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICB9CisKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICAvLyBnZXQgYSBub24temVybyByYW5kb20gZmFjdG9yCisgIFNjYWxhciBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKKyAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIGJpZyA9IGZhY3RvciAqICgoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4KSgpICogUmVhbFNjYWxhcigxZS00KSk7CisgIAorICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKKyAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHNtYWxsID0gZmFjdG9yICogKChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkgKiBSZWFsU2NhbGFyKDFlNCkpOworCisgIE1hdHJpeFR5cGUgIHZ6ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgdnJhbmQgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgIHZiaWcocm93cywgY29scyksCisgICAgICAgICAgICAgIHZzbWFsbChyb3dzLGNvbHMpOworCisgIHZiaWcuZmlsbChiaWcpOworICB2c21hbGwuZmlsbChzbWFsbCk7CisKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHZ6ZXJvLm5vcm0oKSwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnN0YWJsZU5vcm0oKSwgICAgICB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmh5cG90Tm9ybSgpLCAgICAgICB2cmFuZC5ub3JtKCkpOworCisgIFJlYWxTY2FsYXIgc2l6ZSA9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KG0uc2l6ZSgpKTsKKworICAvLyB0ZXN0IG51bWV4dDo6aXNmaW5pdGUKKyAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkoIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmluZmluaXR5KCkpKTsKKyAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkoc3FydCgtYWJzKGJpZykpKSk7CisKKyAgLy8gdGVzdCBvdmVyZmxvdworICBWRVJJRlkoKG51bWV4dDo6aXNmaW5pdGUpKHNxcnQoc2l6ZSkqYWJzKGJpZykpKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goc3FydChjb3B5KHZiaWcuc3F1YXJlZE5vcm0oKSkpLCBhYnMoc3FydChzaXplKSpiaWcpKTsgLy8gaGVyZSB0aGUgZGVmYXVsdCBub3JtIG11c3QgZmFpbAorICBWRVJJRllfSVNfQVBQUk9YKHZiaWcuc3RhYmxlTm9ybSgpLCBzcXJ0KHNpemUpKmFicyhiaWcpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2YmlnLmJsdWVOb3JtKCksICAgc3FydChzaXplKSphYnMoYmlnKSk7CisgIFZFUklGWV9JU19BUFBST1godmJpZy5oeXBvdE5vcm0oKSwgIHNxcnQoc2l6ZSkqYWJzKGJpZykpOworCisgIC8vIHRlc3QgdW5kZXJmbG93CisgIFZFUklGWSgobnVtZXh0Ojppc2Zpbml0ZSkoc3FydChzaXplKSphYnMoc21hbGwpKSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHNxcnQoY29weSh2c21hbGwuc3F1YXJlZE5vcm0oKSkpLCAgIGFicyhzcXJ0KHNpemUpKnNtYWxsKSk7IC8vIGhlcmUgdGhlIGRlZmF1bHQgbm9ybSBtdXN0IGZhaWwKKyAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwuc3RhYmxlTm9ybSgpLCBzcXJ0KHNpemUpKmFicyhzbWFsbCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZzbWFsbC5ibHVlTm9ybSgpLCAgIHNxcnQoc2l6ZSkqYWJzKHNtYWxsKSk7CisgIFZFUklGWV9JU19BUFBST1godnNtYWxsLmh5cG90Tm9ybSgpLCAgc3FydChzaXplKSphYnMoc21hbGwpKTsKKworICAvLyBUZXN0IGNvbXBpbGF0aW9uIG9mIGN3aXNlKCkgdmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmNvbHdpc2UoKS5zdGFibGVOb3JtKCksICAgICAgdnJhbmQuY29sd2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQuY29sd2lzZSgpLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5jb2x3aXNlKCkubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5jb2x3aXNlKCkuaHlwb3ROb3JtKCksICAgICAgIHZyYW5kLmNvbHdpc2UoKS5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnJvd3dpc2UoKS5zdGFibGVOb3JtKCksICAgICAgdnJhbmQucm93d2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQucm93d2lzZSgpLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5yb3d3aXNlKCkubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5yb3d3aXNlKCkuaHlwb3ROb3JtKCksICAgICAgIHZyYW5kLnJvd3dpc2UoKS5ub3JtKCkpOworICAKKyAgLy8gdGVzdCBOYU4sICtpbmYsIC1pbmYgCisgIE1hdHJpeFR5cGUgdjsKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKworICAvLyBOYU4KKyAgeworICAgIHYgPSB2cmFuZDsKKyAgICB2KGksaikgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnNxdWFyZWROb3JtKCkpKTsgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYubm9ybSgpKSk7ICAgICAgICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5ub3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnN0YWJsZU5vcm0oKSkpOyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuc3RhYmxlTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ibHVlTm9ybSgpKSk7ICAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2LmJsdWVOb3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lmh5cG90Tm9ybSgpKSk7ICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuaHlwb3ROb3JtKCkpKTsKKyAgfQorICAKKyAgLy8gK2luZgorICB7CisgICAgdiA9IHZyYW5kOworICAgIHYoaSxqKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmluZmluaXR5KCk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5zcXVhcmVkTm9ybSgpKSk7ICAgVkVSSUZZKGlzUGx1c0luZih2LnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lm5vcm0oKSkpOyAgICAgICAgICBWRVJJRlkoaXNQbHVzSW5mKHYubm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5zdGFibGVOb3JtKCkpKTsKKyAgICBpZihjb21wbGV4X3JlYWxfcHJvZHVjdF9vayl7CisgICAgICBWRVJJRlkoaXNQbHVzSW5mKHYuc3RhYmxlTm9ybSgpKSk7CisgICAgfQorICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOyAgICAgIFZFUklGWShpc1BsdXNJbmYodi5ibHVlTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5oeXBvdE5vcm0oKSkpOyAgICAgVkVSSUZZKGlzUGx1c0luZih2Lmh5cG90Tm9ybSgpKSk7CisgIH0KKyAgCisgIC8vIC1pbmYKKyAgeworICAgIHYgPSB2cmFuZDsKKyAgICB2KGksaikgPSAtc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnNxdWFyZWROb3JtKCkpKTsgICBWRVJJRlkoaXNQbHVzSW5mKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYubm9ybSgpKSk7ICAgICAgICAgIFZFUklGWShpc1BsdXNJbmYodi5ub3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnN0YWJsZU5vcm0oKSkpOworICAgIGlmKGNvbXBsZXhfcmVhbF9wcm9kdWN0X29rKSB7CisgICAgICBWRVJJRlkoaXNQbHVzSW5mKHYuc3RhYmxlTm9ybSgpKSk7CisgICAgfQorICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOyAgICAgIFZFUklGWShpc1BsdXNJbmYodi5ibHVlTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5oeXBvdE5vcm0oKSkpOyAgICAgVkVSSUZZKGlzUGx1c0luZih2Lmh5cG90Tm9ybSgpKSk7CisgIH0KKyAgCisgIC8vIG1peAorICB7CisgICAgSW5kZXggaTIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgICAgSW5kZXggajIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgICAgdiA9IHZyYW5kOworICAgIHYoaSxqKSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjppbmZpbml0eSgpOworICAgIHYoaTIsajIpID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5zcXVhcmVkTm9ybSgpKSk7ICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2LnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lm5vcm0oKSkpOyAgICAgICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYubm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5zdGFibGVOb3JtKCkpKTsgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2LnN0YWJsZU5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOyAgICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5ibHVlTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5oeXBvdE5vcm0oKSkpOyAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2Lmh5cG90Tm9ybSgpKSk7CisgIH0KKworICAvLyBzdGFibGVOb3JtYWxpemVbZF0KKyAgeworICAgIFZFUklGWV9JU19BUFBST1godnJhbmQuc3RhYmxlTm9ybWFsaXplZCgpLCB2cmFuZC5ub3JtYWxpemVkKCkpOworICAgIE1hdHJpeFR5cGUgdmNvcHkodnJhbmQpOworICAgIHZjb3B5LnN0YWJsZU5vcm1hbGl6ZSgpOworICAgIFZFUklGWV9JU19BUFBST1godmNvcHksIHZyYW5kLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgodnJhbmQuc3RhYmxlTm9ybWFsaXplZCgpKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1godmNvcHkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCh2YmlnLnN0YWJsZU5vcm1hbGl6ZWQoKSkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCh2c21hbGwuc3RhYmxlTm9ybWFsaXplZCgpKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOworICAgIFJlYWxTY2FsYXIgYmlnX3NjYWxpbmcgPSAoKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heCkoKSAqIFJlYWxTY2FsYXIoMWUtNCkpOworICAgIFZFUklGWV9JU19BUFBST1godmJpZy9iaWdfc2NhbGluZywgKHZiaWcuc3RhYmxlTm9ybSgpICogdmJpZy5zdGFibGVOb3JtYWxpemVkKCkpLmV2YWwoKS9iaWdfc2NhbGluZyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwsIHZzbWFsbC5zdGFibGVOb3JtKCkgKiB2c21hbGwuc3RhYmxlTm9ybWFsaXplZCgpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3RhYmxlX25vcm0oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBzdGFibGVfbm9ybShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHN0YWJsZV9ub3JtKFZlY3RvcjRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHN0YWJsZV9ub3JtKFZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxMCwyMDAwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHN0YWJsZV9ub3JtKFZlY3RvclhmKGludGVybmFsOjpyYW5kb208aW50PigxMCwyMDAwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHN0YWJsZV9ub3JtKFZlY3RvclhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMjAwMCkpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N0ZGRlcXVlLmNwcCBiL3Rlc3Qvc3RkZGVxdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNGI0NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0ZGRlcXVlLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TdGREZXF1ZT4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIAorICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+IHYoMTAsIE1hdHJpeFR5cGUocm93cyxjb2xzKSksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCp2aSwgKndpKTsKKyAgICArK3ZpOworICAgICsrd2k7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7ICAKKyAgdi5iYWNrKCkgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Cit2b2lkIGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpOworICBzdGQ6OmRlcXVlPFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCp2aSwgKndpKTsKKyAgICArK3ZpOworICAgICsrd2k7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHYuYmFjaygpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6ZGVxdWU8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+IHYoMTApLCB3KDIwLCB5KTsKKyAgdi5mcm9udCgpID0geDsKKyAgdy5mcm9udCgpID0gdy5iYWNrKCk7CisgIFZFUklGWV9JU19BUFBST1gody5mcm9udCgpLCB3LmJhY2soKSk7CisgIHYgPSB3OworCisgIHR5cGVuYW1lIHN0ZDo6ZGVxdWU8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOworICAgICsrdmk7CisgICAgKyt3aTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdi5iYWNrKCkgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Cit9CisKK3ZvaWQgdGVzdF9zdGRkZXF1ZSgpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoVmVjdG9yMmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4M2YoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXgyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChWZWN0b3I0ZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXg0ZCgpKSk7CisKKyAgLy8gc29tZSBkeW5hbWljIHNpemVzCisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworCisgIC8vIHNvbWUgVHJhbnNmb3JtCisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShBZmZpbmUyZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShBZmZpbmUzZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShBZmZpbmUzZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZGRlcXVlX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKFF1YXRlcm5pb25kKCkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RkZGVxdWVfb3ZlcmxvYWQuY3BwIGIvdGVzdC9zdGRkZXF1ZV9vdmVybG9hZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhNjE4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkZGVxdWVfb3ZlcmxvYWQuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vU3RkRGVxdWU+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK0VJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oVmVjdG9yNGYpCisKK0VJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oTWF0cml4MmYpCitFSUdFTl9ERUZJTkVfU1RMX0RFUVVFX1NQRUNJQUxJWkFUSU9OKE1hdHJpeDRmKQorRUlHRU5fREVGSU5FX1NUTF9ERVFVRV9TUEVDSUFMSVpBVElPTihNYXRyaXg0ZCkKKworRUlHRU5fREVGSU5FX1NUTF9ERVFVRV9TUEVDSUFMSVpBVElPTihBZmZpbmUzZikKK0VJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oQWZmaW5lM2QpCisKK0VJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oUXVhdGVybmlvbmYpCitFSUdFTl9ERUZJTkVfU1RMX0RFUVVFX1NQRUNJQUxJWkFUSU9OKFF1YXRlcm5pb25kKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggcm93cyA9IG0ucm93cygpOworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIHN0ZDo6ZGVxdWU8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZShyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgZGVxdWUgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgTWF0cml4VHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIHN0ZDo6ZGVxdWU8VHJhbnNmb3JtVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIGRlcXVlIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKTsKKyAgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIGRlcXVlIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3RkZGVxdWVfb3ZlcmxvYWQoKQoreworICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDNkKCkpKTsKKworICAvLyBzb21lIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeFhjZigxMCwxMCkpKTsKKworICAvLyBzb21lIFRyYW5zZm9ybQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAvLyBkb2VzIG5vdCBuZWVkIHRoZSBzcGVjaWFsaXphdGlvbiAoMisxKV4yID0gOQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oQWZmaW5lM2YoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oQWZmaW5lM2QoKSkpOworCisgIC8vIHNvbWUgUXVhdGVybmlvbgorICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkZGVxdWVfcXVhdGVybmlvbihRdWF0ZXJuaW9uZCgpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N0ZGxpc3QuY3BwIGIvdGVzdC9zdGRsaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NjZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdGRsaXN0LmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TdGRMaXN0PgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19zdGRsaXN0X21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIHN0ZDo6bGlzdDxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+IHYoMTAsIE1hdHJpeFR5cGUocm93cyxjb2xzKSksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CisgICAgKyt2aTsKKyAgICArK3dpOworICB9CisKKyAgdi5yZXNpemUoMjEpOyAgCisgIHYuYmFjaygpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGRsaXN0X3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpOworICBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHYuZnJvbnQoKSA9IHg7CisgIHcuZnJvbnQoKSA9IHcuYmFjaygpOworICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOworICB2ID0gdzsKKworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7CisgIHR5cGVuYW1lIHN0ZDo6bGlzdDxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCp2aSwgKndpKTsKKyAgICArK3ZpOworICAgICsrd2k7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHYuYmFjaygpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkbGlzdF9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKTsKKyAgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHYuZnJvbnQoKSA9IHg7CisgIHcuZnJvbnQoKSA9IHcuYmFjaygpOworICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOworICB2ID0gdzsKKworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CisgICAgKyt2aTsKKyAgICArK3dpOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2LmJhY2soKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKK30KKwordm9pZCB0ZXN0X3N0ZGxpc3QoKQoreworICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoVmVjdG9yMmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeDNkKCkpKTsKKworICAvLyBzb21lIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXgyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXg0ZCgpKSk7CisKKyAgLy8gc29tZSBkeW5hbWljIHNpemVzCisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRsaXN0X3RyYW5zZm9ybShBZmZpbmUzZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGxpc3RfdHJhbnNmb3JtKEFmZmluZTNkKCkpKTsKKworICAvLyBzb21lIFF1YXRlcm5pb24KKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkbGlzdF9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkbGlzdF9xdWF0ZXJuaW9uKFF1YXRlcm5pb25kKCkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RkbGlzdF9vdmVybG9hZC5jcHAgYi90ZXN0L3N0ZGxpc3Rfb3ZlcmxvYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTEwYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0ZGxpc3Rfb3ZlcmxvYWQuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vU3RkTGlzdD4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworRUlHRU5fREVGSU5FX1NUTF9MSVNUX1NQRUNJQUxJWkFUSU9OKFZlY3RvcjRmKQorCitFSUdFTl9ERUZJTkVfU1RMX0xJU1RfU1BFQ0lBTElaQVRJT04oTWF0cml4MmYpCitFSUdFTl9ERUZJTkVfU1RMX0xJU1RfU1BFQ0lBTElaQVRJT04oTWF0cml4NGYpCitFSUdFTl9ERUZJTkVfU1RMX0xJU1RfU1BFQ0lBTElaQVRJT04oTWF0cml4NGQpCisKK0VJR0VOX0RFRklORV9TVExfTElTVF9TUEVDSUFMSVpBVElPTihBZmZpbmUzZikKK0VJR0VOX0RFRklORV9TVExfTElTVF9TUEVDSUFMSVpBVElPTihBZmZpbmUzZCkKKworRUlHRU5fREVGSU5FX1NUTF9MSVNUX1NQRUNJQUxJWkFUSU9OKFF1YXRlcm5pb25mKQorRUlHRU5fREVGSU5FX1NUTF9MSVNUX1NQRUNJQUxJWkFUSU9OKFF1YXRlcm5pb25kKQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCBjbGFzcyBQb3NpdGlvbj4KK3R5cGVuYW1lIENvbnRhaW5lcjo6aXRlcmF0b3IgZ2V0KENvbnRhaW5lciAmIGMsIFBvc2l0aW9uIHBvc2l0aW9uKQoreworICB0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOworICBzdGQ6OmFkdmFuY2UoaXQsIHBvc2l0aW9uKTsKKyAgcmV0dXJuIGl0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCBjbGFzcyBQb3NpdGlvbiwgY2xhc3MgVmFsdWU+Cit2b2lkIHNldChDb250YWluZXIgJiBjLCBQb3NpdGlvbiBwb3NpdGlvbiwgY29uc3QgVmFsdWUgJiB2YWx1ZSkKK3sKKyAgdHlwZW5hbWUgQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsKKyAgc3RkOjphZHZhbmNlKGl0LCBwb3NpdGlvbik7CisgICppdCA9IHZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19zdGRsaXN0X21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjpsaXN0PE1hdHJpeFR5cGU+IHYoMTAsIE1hdHJpeFR5cGUocm93cyxjb2xzKSksIHcoMjAsIHkpOworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8TWF0cml4VHlwZT46Oml0ZXJhdG9yIGl0diA9IGdldCh2LCA1KTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGU+OjppdGVyYXRvciBpdHcgPSBnZXQodywgNik7CisgICppdHYgPSB4OworICAqaXR3ID0gKml0djsKKyAgVkVSSUZZX0lTX0FQUFJPWCgqaXR3LCAqaXR2KTsKKyAgdiA9IHc7CisgIGl0diA9IHYuYmVnaW4oKTsKKyAgaXR3ID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKml0dywgKml0dik7CisgICAgKytpdHY7CisgICAgKytpdHc7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHNldCh2LCAyMCwgeCk7CisgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIxKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKCpnZXQodiwgMjIpLCB4KTsKKworICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSBsaXN0IGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIE1hdHJpeFR5cGUqIHJlZiA9ICYoKmdldCh3LCAwKSk7CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0mKCpnZXQodywgMCkpKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjaygqZ2V0KHcsIGkldy5zaXplKCkpKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkoKCpnZXQodiwgaSkpPT0oKmdldCh3LCAoaS0yMykldy5zaXplKCkpKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKKyAgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGU+IHYoMTApLCB3KDIwLCB5KTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGU+OjppdGVyYXRvciBpdHYgPSBnZXQodiwgNSk7CisgIHR5cGVuYW1lIHN0ZDo6bGlzdDxUcmFuc2Zvcm1UeXBlPjo6aXRlcmF0b3IgaXR3ID0gZ2V0KHcsIDYpOworICAqaXR2ID0geDsKKyAgKml0dyA9ICppdHY7CisgIFZFUklGWV9JU19BUFBST1goKml0dywgKml0dik7CisgIHYgPSB3OworICBpdHYgPSB2LmJlZ2luKCk7CisgIGl0dyA9IHcuYmVnaW4oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCppdHcsICppdHYpOworICAgICsraXR2OworICAgICsraXR3OworICB9CisKKyAgdi5yZXNpemUoMjEpOworICBzZXQodiwgMjAsIHgpOworICBWRVJJRllfSVNfQVBQUk9YKCpnZXQodiwgMjApLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMSksIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIyKSwgeCk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgbGlzdCBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBUcmFuc2Zvcm1UeXBlKiByZWYgPSAmKCpnZXQodywgMCkpOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JigqZ2V0KHcsIDApKSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2soKmdldCh3LCBpJXcuc2l6ZSgpKSk7CisgIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKGdldCh2LCBpKS0+bWF0cml4KCk9PWdldCh3LCAoaS0yMykldy5zaXplKCkpLT5tYXRyaXgoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGU+OjppdGVyYXRvciBpdHYgPSBnZXQodiwgNSk7CisgIHR5cGVuYW1lIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZT46Oml0ZXJhdG9yIGl0dyA9IGdldCh3LCA2KTsKKyAgKml0diA9IHg7CisgICppdHcgPSAqaXR2OworICBWRVJJRllfSVNfQVBQUk9YKCppdHcsICppdHYpOworICB2ID0gdzsKKyAgaXR2ID0gdi5iZWdpbigpOworICBpdHcgPSB3LmJlZ2luKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgqaXR3LCAqaXR2KTsKKyAgICArK2l0djsKKyAgICArK2l0dzsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgc2V0KHYsIDIwLCB4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIwKSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKCpnZXQodiwgMjEpLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMiksIHgpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIGxpc3QgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgUXVhdGVybmlvblR5cGUqIHJlZiA9ICYoKmdldCh3LCAwKSk7CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0mKCpnZXQodywgMCkpKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjaygqZ2V0KHcsIGkldy5zaXplKCkpKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkoZ2V0KHYsIGkpLT5jb2VmZnMoKT09Z2V0KHcsIChpLTIzKSV3LnNpemUoKSktPmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3RkbGlzdF9vdmVybG9hZCgpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChWZWN0b3IyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeDNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeDJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeDRkKCkpKTsKKworICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeFhjZigxMCwxMCkpKTsKKworICAvLyBzb21lIFRyYW5zZm9ybQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRsaXN0X3RyYW5zZm9ybShBZmZpbmUyZigpKSk7IC8vIGRvZXMgbm90IG5lZWQgdGhlIHNwZWNpYWxpemF0aW9uICgyKzEpXjIgPSA5CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGxpc3RfdHJhbnNmb3JtKEFmZmluZTNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lM2QoKSkpOworCisgIC8vIHNvbWUgUXVhdGVybmlvbgorICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGRsaXN0X3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGRsaXN0X3F1YXRlcm5pb24oUXVhdGVybmlvbmQoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdGR2ZWN0b3IuY3BwIGIvdGVzdC9zdGR2ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2IzMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0ZHZlY3Rvci5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggcm93cyA9IG0ucm93cygpOworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIHN0ZDo6dmVjdG9yPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID4gdigxMCwgTWF0cml4VHlwZShyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoaW50ZXJuYWw6OlVJbnRQdHIpJih2WzIyXSkgPT0gKGludGVybmFsOjpVSW50UHRyKSYodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKKworICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgTWF0cml4VHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpOworICBzdGQ6OnZlY3RvcjxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+IHYoMTApLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6VUludFB0cikmKHZbMjJdKSA9PSAoaW50ZXJuYWw6OlVJbnRQdHIpJih2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBUcmFuc2Zvcm1UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5tYXRyaXgoKT09d1soaS0yMykldy5zaXplKCldLm1hdHJpeCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpOworICBzdGQ6OnZlY3RvcjxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKGludGVybmFsOjpVSW50UHRyKSYodlsyMl0pID09IChpbnRlcm5hbDo6VUludFB0cikmKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBRdWF0ZXJuaW9uVHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV0uY29lZmZzKCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5jb2VmZnMoKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X3N0ZHZlY3RvcigpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShQcm9qZWN0aXZlMmYoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFByb2plY3RpdmUzZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oUHJvamVjdGl2ZTNkKCkpKTsKKyAgLy9DQUxMX1NVQlRFU1QoaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFByb2plY3RpdmU0ZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmQoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdGR2ZWN0b3Jfb3ZlcmxvYWQuY3BwIGIvdGVzdC9zdGR2ZWN0b3Jfb3ZlcmxvYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTY2NTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0ZHZlY3Rvcl9vdmVybG9hZC5jcHAKQEAgLTAsMCArMSwxNjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKFZlY3RvcjRmKQorCitFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTihNYXRyaXgyZikKK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKE1hdHJpeDRmKQorRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oTWF0cml4NGQpCisKK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKEFmZmluZTNmKQorRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oQWZmaW5lM2QpCisKK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKFF1YXRlcm5pb25mKQorRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oUXVhdGVybmlvbmQpCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggcm93cyA9IG0ucm93cygpOworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIHN0ZDo6dmVjdG9yPE1hdHJpeFR5cGU+IHYoMTAsIE1hdHJpeFR5cGUocm93cyxjb2xzKSksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKGludGVybmFsOjpVSW50UHRyKSYodlsyMl0pID09IChpbnRlcm5hbDo6VUludFB0cikmKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIE1hdHJpeFR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldPT13WyhpLTIzKSV3LnNpemUoKV0pOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKKyAgc3RkOjp2ZWN0b3I8VHJhbnNmb3JtVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKGludGVybmFsOjpVSW50UHRyKSYodlsyMl0pID09IChpbnRlcm5hbDo6VUludFB0cikmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFF1YXRlcm5pb25UeXBlPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoaW50ZXJuYWw6OlVJbnRQdHIpJih2WzIyXSkgPT0gKGludGVybmFsOjpVSW50UHRyKSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3RkdmVjdG9yX292ZXJsb2FkKCkKK3sKKyAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yMmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgzZCgpKSk7CisKKyAgLy8gc29tZSB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZCgpKSk7CisKKyAgLy8gc29tZSBkeW5hbWljIHNpemVzCisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvclhkKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhjZigxMCwxMCkpKTsKKworICAvLyBzb21lIFRyYW5zZm9ybQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKEFmZmluZTJmKCkpKTsgLy8gZG9lcyBub3QgbmVlZCB0aGUgc3BlY2lhbGl6YXRpb24gKDIrMSleMiA9IDkKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShBZmZpbmUzZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lM2QoKSkpOworCisgIC8vIHNvbWUgUXVhdGVybmlvbgorICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihRdWF0ZXJuaW9uZigpKSk7CisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25kKCkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3VwZXJsdV9zdXBwb3J0LmNwcCBiL3Rlc3Qvc3VwZXJsdV9zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE3YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdXBlcmx1X3N1cHBvcnQuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX0RFQlVHX1NNQUxMX1BST0RVQ1RfQkxPQ0tTCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorCisjaW5jbHVkZSA8RWlnZW4vU3VwZXJMVVN1cHBvcnQ+CisKK3ZvaWQgdGVzdF9zdXBlcmx1X3N1cHBvcnQoKQoreworICBTdXBlckxVPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc3VwZXJsdV9kb3VibGVfY29sbWFqb3I7CisgIFN1cGVyTFU8U3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4gPiBzdXBlcmx1X2NwbHhkb3VibGVfY29sbWFqb3I7CisgIENBTExfU1VCVEVTVF8xKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoc3VwZXJsdV9kb3VibGVfY29sbWFqb3IpICAgICAgKTsKKyAgQ0FMTF9TVUJURVNUXzIoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzdXBlcmx1X2NwbHhkb3VibGVfY29sbWFqb3IpICApOworICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChzdXBlcmx1X2RvdWJsZV9jb2xtYWpvcikgICAgICApOworICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChzdXBlcmx1X2NwbHhkb3VibGVfY29sbWFqb3IpICApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdmRfY29tbW9uLmggYi90ZXN0L3N2ZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDVkNWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdmRfY29tbW9uLmgKQEAgLTAsMCArMSw0ODMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTQgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIFNWRF9ERUZBVUxUCisjZXJyb3IgYSBtYWNybyBTVkRfREVGQVVMVChNYXRyaXhUeXBlKSBtdXN0IGJlIGRlZmluZWQgcHJpb3IgdG8gaW5jbHVkaW5nIHN2ZF9jb21tb24uaAorI2VuZGlmCisKKyNpZm5kZWYgU1ZEX0ZPUl9NSU5fTk9STQorI2Vycm9yIGEgbWFjcm8gU1ZEX0ZPUl9NSU5fTk9STShNYXRyaXhUeXBlKSBtdXN0IGJlIGRlZmluZWQgcHJpb3IgdG8gaW5jbHVkaW5nIHN2ZF9jb21tb24uaAorI2VuZGlmCisKKyNpbmNsdWRlICJzdmRfZmlsbC5oIgorCisvLyBDaGVjayB0aGF0IHRoZSBtYXRyaXggbSBpcyBwcm9wZXJseSByZWNvbnN0cnVjdGVkIGFuZCB0aGF0IHRoZSBVIGFuZCBWIGZhY3RvcnMgYXJlIHVuaXRhcnkKKy8vIFRoZSBTVkQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFN2ZFR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHN2ZF9jaGVja19mdWxsKGNvbnN0IE1hdHJpeFR5cGUmIG0sIGNvbnN0IFN2ZFR5cGUmIHN2ZCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgUm93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gTWF0cml4VlR5cGU7CisKKyAgTWF0cml4VHlwZSBzaWdtYSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKTsKKyAgc2lnbWEuZGlhZ29uYWwoKSA9IHN2ZC5zaW5ndWxhclZhbHVlcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICBNYXRyaXhVVHlwZSB1ID0gc3ZkLm1hdHJpeFUoKTsKKyAgTWF0cml4VlR5cGUgdiA9IHN2ZC5tYXRyaXhWKCk7CisgIFJlYWxTY2FsYXIgc2NhbGluZyA9IG0uY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICBpZihzY2FsaW5nPChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpCisgIHsKKyAgICBWRVJJRlkoc2lnbWEuY3dpc2VBYnMoKS5tYXhDb2VmZigpIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpOworICB9CisgIGVsc2UKKyAgeworICAgIFZFUklGWV9JU19BUFBST1gobS9zY2FsaW5nLCB1ICogKHNpZ21hL3NjYWxpbmcpICogdi5hZGpvaW50KCkpOworICB9CisgIFZFUklGWV9JU19VTklUQVJZKHUpOworICBWRVJJRllfSVNfVU5JVEFSWSh2KTsKK30KKworLy8gQ29tcGFyZSBwYXJ0aWFsIFNWRCBkZWZpbmVkIGJ5IGNvbXB1dGF0aW9uT3B0aW9ucyB0byBhIGZ1bGwgU1ZEIHJlZmVyZW5jZVN2ZAordGVtcGxhdGU8dHlwZW5hbWUgU3ZkVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc3ZkX2NvbXBhcmVfdG9fZnVsbChjb25zdCBNYXRyaXhUeXBlJiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ZkVHlwZSYgcmVmZXJlbmNlU3ZkKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIEluZGV4IGRpYWdTaXplID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKyAgUmVhbFNjYWxhciBwcmVjID0gdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKKworICBTdmRUeXBlIHN2ZChtLCBjb21wdXRhdGlvbk9wdGlvbnMpOworCisgIFZFUklGWV9JU19BUFBST1goc3ZkLnNpbmd1bGFyVmFsdWVzKCksIHJlZmVyZW5jZVN2ZC5zaW5ndWxhclZhbHVlcygpKTsKKyAgCisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIChDb21wdXRlRnVsbFZ8Q29tcHV0ZVRoaW5WKSkKKyAgeworICAgIFZFUklGWSggKHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKnN2ZC5tYXRyaXhWKCkpLmlzSWRlbnRpdHkocHJlYykgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBzdmQubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmFzRGlhZ29uYWwoKSAqIHN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VTdmQubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHJlZmVyZW5jZVN2ZC5zaW5ndWxhclZhbHVlcygpLmFzRGlhZ29uYWwoKSAqIHJlZmVyZW5jZVN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSk7CisgIH0KKyAgCisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIChDb21wdXRlRnVsbFV8Q29tcHV0ZVRoaW5VKSkKKyAgeworICAgIFZFUklGWSggKHN2ZC5tYXRyaXhVKCkuYWRqb2ludCgpKnN2ZC5tYXRyaXhVKCkpLmlzSWRlbnRpdHkocHJlYykgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBzdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmN3aXNlQWJzMigpLmFzRGlhZ29uYWwoKSAqIHN2ZC5tYXRyaXhVKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VTdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHJlZmVyZW5jZVN2ZC5zaW5ndWxhclZhbHVlcygpLmN3aXNlQWJzMigpLmFzRGlhZ29uYWwoKSAqIHJlZmVyZW5jZVN2ZC5tYXRyaXhVKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSk7CisgIH0KKyAgCisgIC8vIFRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZSBub3QgY3JpdGljYWwuCisgIC8vIEZvciBpbnN0YW5jZSwgd2l0aCBEaXZlZCZDb25xdWVyIFNWRCwgaWYgb25seSB0aGUgZmFjdG9yICdWJyBpcyBjb21wdXRlZHQgdGhlbiBkaWZmZXJlbnQgbWF0cml4LW1hdHJpeCBwcm9kdWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZAorICAvLyBhbmQgdGhlIHJlc3VsdGluZyAnVicgZmFjdG9yIG1pZ2h0IGJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHdoZW4gdGhlIFNWRCBkZWNvbXBvc2l0aW9uIGlzIG5vdCB1bmlxdWUsIGVzcGVjaWFsbHkgd2l0aCBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LgorICArK2dfdGVzdF9sZXZlbDsKKyAgaWYoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZUZ1bGxVKSAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VSgpLCByZWZlcmVuY2VTdmQubWF0cml4VSgpKTsKKyAgaWYoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZVRoaW5VKSAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VSgpLCByZWZlcmVuY2VTdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSk7CisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVGdWxsVikgIFZFUklGWV9JU19BUFBST1goc3ZkLm1hdHJpeFYoKS5jd2lzZUFicygpLCByZWZlcmVuY2VTdmQubWF0cml4VigpLmN3aXNlQWJzKCkpOworICBpZihjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblYpICBWRVJJRllfSVNfQVBQUk9YKHN2ZC5tYXRyaXhWKCksIHJlZmVyZW5jZVN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpKTsKKyAgLS1nX3Rlc3RfbGV2ZWw7Cit9CisKKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdmRUeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzdmRfbGVhc3Rfc3F1YXJlKGNvbnN0IE1hdHJpeFR5cGUmIG0sIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IFJoc1R5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IFNvbHV0aW9uVHlwZTsKKworICBSaHNUeXBlIHJocyA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLCBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBjb2xzKSk7CisgIFN2ZFR5cGUgc3ZkKG0sIGNvbXB1dGF0aW9uT3B0aW9ucyk7CisKKyAgICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGRvdWJsZT46OnZhbHVlKSBzdmQuc2V0VGhyZXNob2xkKDFlLTgpOworICBlbHNlIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgIHN2ZC5zZXRUaHJlc2hvbGQoMmUtNCk7CisKKyAgU29sdXRpb25UeXBlIHggPSBzdmQuc29sdmUocmhzKTsKKyAgIAorICBSZWFsU2NhbGFyIHJlc2lkdWFsID0gKG0qeC1yaHMpLm5vcm0oKTsKKyAgUmVhbFNjYWxhciByaHNfbm9ybSA9IHJocy5ub3JtKCk7CisgIGlmKCF0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKHJlc2lkdWFsLHJocy5ub3JtKCkpKQorICB7CisgICAgLy8gXl5eIElmIHRoZSByZXNpZHVhbCBpcyB2ZXJ5IHNtYWxsLCB0aGVuIHdlIGhhdmUgYW4gZXhhY3Qgc29sdXRpb24sIHNvIHdlIGFyZSBhbHJlYWR5IGdvb2QuCisgICAgCisgICAgLy8gZXZhbHVhdGUgbm9ybWFsIGVxdWF0aW9uIHdoaWNoIHdvcmtzIGFsc28gZm9yIGxlYXN0LXNxdWFyZXMgc29sdXRpb25zCisgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixkb3VibGU+Ojp2YWx1ZSB8fCBzdmQucmFuaygpPT1tLmRpYWdvbmFsKCkuc2l6ZSgpKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICAgIC8vIFRoaXMgdGVzdCBpcyBub3Qgc3RhYmxlIHdpdGggc2luZ2xlIHByZWNpc2lvbi4KKyAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBzcXVhcmluZyBtIHNpZ25pY2FudGx5IGFmZmVjdHMgdGhlIHByZWNpc2lvbi4gICAgICAKKyAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgKytnX3Rlc3RfbGV2ZWw7CisgICAgICAKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5hZGpvaW50KCkqKG0qeCksbS5hZGpvaW50KCkqcmhzKTsKKyAgICAgIAorICAgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKSAtLWdfdGVzdF9sZXZlbDsKKyAgICB9CisgICAgCisgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudGx5IGJldHRlciBzb2x1dGlvbiBpbiB0aGUgbmVpZ2hib3Job29kIG9mIHgKKyAgICBmb3IoSW5kZXggaz0wO2s8eC5yb3dzKCk7KytrKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YWJzOworICAgICAgCisgICAgICBTb2x1dGlvblR5cGUgeSh4KTsKKyAgICAgIHkucm93KGspID0gKFJlYWxTY2FsYXIoMSkrMipOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkqeC5yb3coayk7CisgICAgICBSZWFsU2NhbGFyIHJlc2lkdWFsX3kgPSAobSp5LXJocykubm9ybSgpOworICAgICAgVkVSSUZZKCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGFicyhyZXNpZHVhbF95LXJlc2lkdWFsKSwgcmhzX25vcm0pIHx8IHJlc2lkdWFsIDwgcmVzaWR1YWxfeSApOworICAgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKSArK2dfdGVzdF9sZXZlbDsKKyAgICAgIFZFUklGWSggdGVzdF9pc0FwcHJveChyZXNpZHVhbF95LHJlc2lkdWFsKSB8fCByZXNpZHVhbCA8IHJlc2lkdWFsX3kgKTsKKyAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgLS1nX3Rlc3RfbGV2ZWw7CisgICAgICAKKyAgICAgIHkucm93KGspID0gKFJlYWxTY2FsYXIoMSktMipOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkqeC5yb3coayk7CisgICAgICByZXNpZHVhbF95ID0gKG0qeS1yaHMpLm5vcm0oKTsKKyAgICAgIFZFUklGWSggdGVzdF9pc011Y2hTbWFsbGVyVGhhbihhYnMocmVzaWR1YWxfeS1yZXNpZHVhbCksIHJoc19ub3JtKSB8fCByZXNpZHVhbCA8IHJlc2lkdWFsX3kgKTsKKyAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgKytnX3Rlc3RfbGV2ZWw7CisgICAgICBWRVJJRlkoIHRlc3RfaXNBcHByb3gocmVzaWR1YWxfeSxyZXNpZHVhbCkgfHwgcmVzaWR1YWwgPCByZXNpZHVhbF95ICk7CisgICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpIC0tZ190ZXN0X2xldmVsOworICAgIH0KKyAgfQorfQorCisvLyBjaGVjayBtaW5pbWFsIG5vcm0gc29sdXRpb25zLCB0aGUgaW5vcHV0IG1hdHJpeCBtIGlzIG9ubHkgdXNlZCB0byByZWNvdmVyIHByb2JsZW0gc2l6ZQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc3ZkX21pbl9ub3JtKGNvbnN0IE1hdHJpeFR5cGUmIG0sIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIGVudW0geworICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBTb2x1dGlvblR5cGU7CisKKyAgLy8gZ2VuZXJhdGUgYSBmdWxsLXJhbmsgbSB4IG4gcHJvYmxlbSB3aXRoIG08bgorICBlbnVtIHsKKyAgICBSYW5rQXRDb21waWxlVGltZTIgPSBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiAoQ29sc0F0Q29tcGlsZVRpbWUpLzIrMSwKKyAgICBSb3dzQXRDb21waWxlVGltZTMgPSBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiBDb2xzQXRDb21waWxlVGltZSsxCisgIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUmFua0F0Q29tcGlsZVRpbWUyLCBDb2xzQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUmFua0F0Q29tcGlsZVRpbWUyLCAxPiBSaHNUeXBlMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgUmFua0F0Q29tcGlsZVRpbWUyPiBNYXRyaXhUeXBlMlQ7CisgIEluZGV4IHJhbmsgPSBSYW5rQXRDb21waWxlVGltZTI9PUR5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpIDogSW5kZXgoUmFua0F0Q29tcGlsZVRpbWUyKTsKKyAgTWF0cml4VHlwZTIgbTIocmFuayxjb2xzKTsKKyAgaW50IGd1YXJkID0gMDsKKyAgZG8geworICAgIG0yLnNldFJhbmRvbSgpOworICB9IHdoaWxlKFNWRF9GT1JfTUlOX05PUk0oTWF0cml4VHlwZTIpKG0yKS5zZXRUaHJlc2hvbGQodGVzdF9wcmVjaXNpb248U2NhbGFyPigpKS5yYW5rKCkhPXJhbmsgJiYgKCsrZ3VhcmQpPDEwKTsKKyAgVkVSSUZZKGd1YXJkPDEwKTsKKworICBSaHNUeXBlMiByaHMyID0gUmhzVHlwZTI6OlJhbmRvbShyYW5rKTsKKyAgLy8gdXNlIFFSIHRvIGZpbmQgYSByZWZlcmVuY2UgbWluaW1hbCBub3JtIHNvbHV0aW9uCisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZTJUPiBxcihtMi5hZGpvaW50KCkpOworICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gdG1wID0gcXIubWF0cml4UVIoKS50b3BMZWZ0Q29ybmVyKHJhbmsscmFuaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuYWRqb2ludCgpLnNvbHZlKHJoczIpOworICB0bXAuY29uc2VydmF0aXZlUmVzaXplKGNvbHMpOworICB0bXAudGFpbChjb2xzLXJhbmspLnNldFplcm8oKTsKKyAgU29sdXRpb25UeXBlIHgyMSA9IHFyLmhvdXNlaG9sZGVyUSgpICogdG1wOworICAvLyBub3cgY2hlY2sgd2l0aCBTVkQKKyAgU1ZEX0ZPUl9NSU5fTk9STShNYXRyaXhUeXBlMikgc3ZkMihtMiwgY29tcHV0YXRpb25PcHRpb25zKTsKKyAgU29sdXRpb25UeXBlIHgyMiA9IHN2ZDIuc29sdmUocmhzMik7CisgIFZFUklGWV9JU19BUFBST1gobTIqeDIxLCByaHMyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMip4MjIsIHJoczIpOworICBWRVJJRllfSVNfQVBQUk9YKHgyMSwgeDIyKTsKKworICAvLyBOb3cgY2hlY2sgd2l0aCBhIHJhbmsgZGVmaWNpZW50IG1hdHJpeAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lMywgQ29sc0F0Q29tcGlsZVRpbWU+IE1hdHJpeFR5cGUzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lMywgMT4gUmhzVHlwZTM7CisgIEluZGV4IHJvd3MzID0gUm93c0F0Q29tcGlsZVRpbWUzPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4ocmFuaysxLDIqY29scykgOiBJbmRleChSb3dzQXRDb21waWxlVGltZTMpOworICBNYXRyaXg8U2NhbGFyLFJvd3NBdENvbXBpbGVUaW1lMyxEeW5hbWljPiBDID0gTWF0cml4PFNjYWxhcixSb3dzQXRDb21waWxlVGltZTMsRHluYW1pYz46OlJhbmRvbShyb3dzMyxyYW5rKTsKKyAgTWF0cml4VHlwZTMgbTMgPSBDICogbTI7CisgIFJoc1R5cGUzIHJoczMgPSBDICogcmhzMjsKKyAgU1ZEX0ZPUl9NSU5fTk9STShNYXRyaXhUeXBlMykgc3ZkMyhtMywgY29tcHV0YXRpb25PcHRpb25zKTsKKyAgU29sdXRpb25UeXBlIHgzID0gc3ZkMy5zb2x2ZShyaHMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyp4MywgcmhzMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMqeDIxLCByaHMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMip4MywgcmhzMik7CisgIFZFUklGWV9JU19BUFBST1goeDIxLCB4Myk7Cit9CisKKy8vIENoZWNrIGZ1bGwsIGNvbXBhcmVfdG9fZnVsbCwgbGVhc3Rfc3F1YXJlLCBhbmQgbWluX25vcm0gZm9yIGFsbCBwb3NzaWJsZSBjb21wdXRlLW9wdGlvbnMKK3RlbXBsYXRlPHR5cGVuYW1lIFN2ZFR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHN2ZF90ZXN0X2FsbF9jb21wdXRhdGlvbl9vcHRpb25zKGNvbnN0IE1hdHJpeFR5cGUmIG0sIGJvb2wgZnVsbF9vbmx5KQoreworLy8gICBpZiAoUVJQcmVjb25kaXRpb25lciA9PSBOb1FSUHJlY29uZGl0aW9uZXIgJiYgbS5yb3dzKCkgIT0gbS5jb2xzKCkpCisvLyAgICAgcmV0dXJuOworICBTdmRUeXBlIGZ1bGxTdmQobSwgQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisgIENBTExfU1VCVEVTVCgoIHN2ZF9jaGVja19mdWxsKG0sIGZ1bGxTdmQpICkpOworICBDQUxMX1NVQlRFU1QoKCBzdmRfbGVhc3Rfc3F1YXJlPFN2ZFR5cGU+KG0sIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVikgKSk7CisgIENBTExfU1VCVEVTVCgoIHN2ZF9taW5fbm9ybShtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpICkpOworICAKKyAgI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorICAvLyByZW1hcmsgIzExMTogc3RhdGVtZW50IGlzIHVucmVhY2hhYmxlCisgICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDExMQorICAjZW5kaWYKKyAgaWYoZnVsbF9vbmx5KQorICAgIHJldHVybjsKKworICBDQUxMX1NVQlRFU1QoKCBzdmRfY29tcGFyZV90b19mdWxsKG0sIENvbXB1dGVGdWxsVSwgZnVsbFN2ZCkgKSk7CisgIENBTExfU1VCVEVTVCgoIHN2ZF9jb21wYXJlX3RvX2Z1bGwobSwgQ29tcHV0ZUZ1bGxWLCBmdWxsU3ZkKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggc3ZkX2NvbXBhcmVfdG9fZnVsbChtLCAwLCBmdWxsU3ZkKSApKTsKKworICBpZiAoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgeworICAgIC8vIHRoaW4gVS9WIGFyZSBvbmx5IGF2YWlsYWJsZSB3aXRoIGR5bmFtaWMgbnVtYmVyIG9mIGNvbHVtbnMKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfY29tcGFyZV90b19mdWxsKG0sIENvbXB1dGVGdWxsVXxDb21wdXRlVGhpblYsIGZ1bGxTdmQpICkpOworICAgIENBTExfU1VCVEVTVCgoIHN2ZF9jb21wYXJlX3RvX2Z1bGwobSwgICAgICAgICAgICAgIENvbXB1dGVUaGluViwgZnVsbFN2ZCkgKSk7CisgICAgQ0FMTF9TVUJURVNUKCggc3ZkX2NvbXBhcmVfdG9fZnVsbChtLCBDb21wdXRlVGhpblV8Q29tcHV0ZUZ1bGxWLCBmdWxsU3ZkKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfY29tcGFyZV90b19mdWxsKG0sIENvbXB1dGVUaGluVSAgICAgICAgICAgICAsIGZ1bGxTdmQpICkpOworICAgIENBTExfU1VCVEVTVCgoIHN2ZF9jb21wYXJlX3RvX2Z1bGwobSwgQ29tcHV0ZVRoaW5VfENvbXB1dGVUaGluViwgZnVsbFN2ZCkgKSk7CisgICAgCisgICAgQ0FMTF9TVUJURVNUKCggc3ZkX2xlYXN0X3NxdWFyZTxTdmRUeXBlPihtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlVGhpblYpICkpOworICAgIENBTExfU1VCVEVTVCgoIHN2ZF9sZWFzdF9zcXVhcmU8U3ZkVHlwZT4obSwgQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZUZ1bGxWKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfbGVhc3Rfc3F1YXJlPFN2ZFR5cGU+KG0sIENvbXB1dGVUaGluVSB8IENvbXB1dGVUaGluVikgKSk7CisKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfbWluX25vcm0obSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZVRoaW5WKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfbWluX25vcm0obSwgQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZUZ1bGxWKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBzdmRfbWluX25vcm0obSwgQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZVRoaW5WKSApKTsKKworICAgIC8vIHRlc3QgcmVjb25zdHJ1Y3Rpb24KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIEluZGV4IGRpYWdTaXplID0gKHN0ZDo6bWluKShtLnJvd3MoKSwgbS5jb2xzKCkpOworICAgIFN2ZFR5cGUgc3ZkKG0sIENvbXB1dGVUaGluVSB8IENvbXB1dGVUaGluVik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBzdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmFzRGlhZ29uYWwoKSAqIHN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSk7CisgIH0KK30KKworCisvLyB3b3JrIGFyb3VuZCBzdHVwaWQgbXN2YyBlcnJvciB3aGVuIGNvbnN0cnVjdGluZyBhdCBjb21waWxlIHRpbWUgYW4gZXhwcmVzc2lvbiB0aGF0IGludm9sdmVzCisvLyBhIGRpdmlzaW9uIGJ5IHplcm8sIGV2ZW4gaWYgdGhlIG51bWVyaWMgdHlwZSBoYXMgZmxvYXRpbmcgcG9pbnQKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciB6ZXJvKCkgeyByZXR1cm4gU2NhbGFyKDApOyB9CisKKy8vIHdvcmthcm91bmQgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24gaW4gSUNDCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBFSUdFTl9ET05UX0lOTElORSAgVCBzdWIoVCBhLCBUIGIpIHsgcmV0dXJuIGEgLSBiOyB9CisKKy8vIGFsbCB0aGlzIGZ1bmN0aW9uIGRvZXMgaXMgdmVyaWZ5IHdlIGRvbid0IGl0ZXJhdGUgaW5maW5pdGVseSBvbiBuYW4vaW5mIHZhbHVlcwordGVtcGxhdGU8dHlwZW5hbWUgU3ZkVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc3ZkX2luZl9uYW4oKQoreworICBTdmRUeXBlIHN2ZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBTY2FsYXIgc29tZV9pbmYgPSBTY2FsYXIoMSkgLyB6ZXJvPFNjYWxhcj4oKTsKKyAgVkVSSUZZKHN1Yihzb21lX2luZiwgc29tZV9pbmYpICE9IHN1Yihzb21lX2luZiwgc29tZV9pbmYpKTsKKyAgc3ZkLmNvbXB1dGUoTWF0cml4VHlwZTo6Q29uc3RhbnQoMTAsMTAsc29tZV9pbmYpLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworCisgIFNjYWxhciBuYW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICBWRVJJRlkobmFuICE9IG5hbik7CisgIHN2ZC5jb21wdXRlKE1hdHJpeFR5cGU6OkNvbnN0YW50KDEwLDEwLG5hbiksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6WmVybygxMCwxMCk7CisgIG0oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsOSksIGludGVybmFsOjpyYW5kb208aW50PigwLDkpKSA9IHNvbWVfaW5mOworICBzdmQuY29tcHV0ZShtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworCisgIG0gPSBNYXRyaXhUeXBlOjpaZXJvKDEwLDEwKTsKKyAgbShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCw5KSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsOSkpID0gbmFuOworICBzdmQuY29tcHV0ZShtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworICAKKyAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNzkxCisgIG0ucmVzaXplKDMsMyk7CisgIG0gPDwgMCwgICAgMipOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpLCAgMC41LAorICAgICAgIDAsICAgLTAuNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgbmFuLCAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgc3ZkLmNvbXB1dGUobSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKKyAgCisgIG0ucmVzaXplKDQsNCk7CisgIG0gPDwgIDEsIDAsIDAsIDAsCisgICAgICAgIDAsIDMsIDEsIDJlLTMwOCwKKyAgICAgICAgMSwgMCwgMSwgbmFuLAorICAgICAgICAwLCBuYW4sIG5hbiwgMDsKKyAgc3ZkLmNvbXB1dGUobSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKK30KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjg2OiBKYWNvYmlTVkQgbG9vcHMgaW5kZWZpbml0ZWx5IHdpdGggc29tZQorLy8gbWF0cmljZXMgY29udGFpbmluZyBkZW5vcm1hbCBudW1iZXJzLgordGVtcGxhdGU8dHlwZW5hbWU+Cit2b2lkIHN2ZF91bmRlcm92ZXJmbG93KCkKK3sKKyNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKy8vIHNodXQgdXAgd2FybmluZyAjMjM5OiBmbG9hdGluZyBwb2ludCB1bmRlcmZsb3cKKyNwcmFnbWEgd2FybmluZyBwdXNoCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyMzkKKyNlbmRpZgorICBNYXRyaXgyZCBNOworICBNIDw8IC03LjkwODg0ZS0zMTMsIC00Ljk0ZS0zMjQsCisgICAgICAgICAgICAgICAgIDAsIDUuNjA4NDRlLTMxMzsKKyAgU1ZEX0RFRkFVTFQoTWF0cml4MmQpIHN2ZDsKKyAgc3ZkLmNvbXB1dGUoTSxDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgQ0FMTF9TVUJURVNUKCBzdmRfY2hlY2tfZnVsbChNLHN2ZCkgKTsKKyAgCisgIC8vIENoZWNrIGFsbCAyeDIgbWF0cmljZXMgbWFkZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29lZmZpY2llbnRzOgorICBWZWN0b3JYZCB2YWx1ZV9zZXQoOSk7CisgIHZhbHVlX3NldCA8PCAwLCAxLCAtMSwgNS42MDg0NGUtMzEzLCAtNS42MDg0NGUtMzEzLCA0Ljk0ZS0zMjQsIC00Ljk0ZS0zMjQsIC00Ljk0ZS0yMjMsIDQuOTRlLTIyMzsKKyAgQXJyYXk0aSBpZCgwLDAsMCwwKTsKKyAgaW50IGsgPSAwOworICBkbworICB7CisgICAgTSA8PCB2YWx1ZV9zZXQoaWQoMCkpLCB2YWx1ZV9zZXQoaWQoMSkpLCB2YWx1ZV9zZXQoaWQoMikpLCB2YWx1ZV9zZXQoaWQoMykpOworICAgIHN2ZC5jb21wdXRlKE0sQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisgICAgQ0FMTF9TVUJURVNUKCBzdmRfY2hlY2tfZnVsbChNLHN2ZCkgKTsKKworICAgIGlkKGspKys7CisgICAgaWYoaWQoayk+PXZhbHVlX3NldC5zaXplKCkpCisgICAgeworICAgICAgd2hpbGUoazwzICYmIGlkKGspPj12YWx1ZV9zZXQuc2l6ZSgpKSBpZCgrK2spKys7CisgICAgICBpZC5oZWFkKGspLnNldFplcm8oKTsKKyAgICAgIGs9MDsKKyAgICB9CisKKyAgfSB3aGlsZSgoaWQ8aW50KHZhbHVlX3NldC5zaXplKCkpKS5hbGwoKSk7CisgIAorI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorI3ByYWdtYSB3YXJuaW5nIHBvcAorI2VuZGlmCisgIAorICAvLyBDaGVjayBmb3Igb3ZlcmZsb3c6CisgIE1hdHJpeDNkIE0zOworICBNMyA8PCA0LjQzMzE5Nzg0NDI1MDI5NDRlKzMwNywgLTUuODU4NTM2Mzc1MjAyODY4MGUrMzA3LCAgNi40NTI3MDE3NDQzNDEyOTY0ZSszMDcsCisgICAgICAgIDMuNzg0MTY5NTYwMTQwNjM1OGUrMzA3LCAgMi40MzMxNzAyNzg5NzQwNjE3ZSszMDYsIC0zLjUyMzU3MDcxNDAyNzI5MDVlKzMwNywKKyAgICAgICAtOC43MTkwODg3NjE4MDI4MzU1ZSszMDcsIC03LjM0NTMyMTM3MDkyMzIxOTNlKzMwNywgLTIuNDM2NzM2MzY4NDQ3MjEwNWUrMzA3OworCisgIFNWRF9ERUZBVUxUKE1hdHJpeDNkKSBzdmQzOworICBzdmQzLmNvbXB1dGUoTTMsQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7IC8vIGp1c3QgY2hlY2sgd2UgZG9uJ3QgbG9vcCBpbmRlZmluaXRlbHkKKyAgQ0FMTF9TVUJURVNUKCBzdmRfY2hlY2tfZnVsbChNMyxzdmQzKSApOworfQorCisvLyB2b2lkIGphY29iaXN2ZChjb25zdCBNYXRyaXhUeXBlJiBhID0gTWF0cml4VHlwZSgpLCBib29sIHBpY2tyYW5kb20gPSB0cnVlKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzdmRfYWxsX3RyaXZpYWxfMngyKCB2b2lkICgqY2IpKGNvbnN0IE1hdHJpeFR5cGUmLGJvb2wpICkKK3sKKyAgTWF0cml4VHlwZSBNOworICBWZWN0b3JYZCB2YWx1ZV9zZXQoMyk7CisgIHZhbHVlX3NldCA8PCAwLCAxLCAtMTsKKyAgQXJyYXk0aSBpZCgwLDAsMCwwKTsKKyAgaW50IGsgPSAwOworICBkbworICB7CisgICAgTSA8PCB2YWx1ZV9zZXQoaWQoMCkpLCB2YWx1ZV9zZXQoaWQoMSkpLCB2YWx1ZV9zZXQoaWQoMikpLCB2YWx1ZV9zZXQoaWQoMykpOworICAgIAorICAgIGNiKE0sZmFsc2UpOworICAgIAorICAgIGlkKGspKys7CisgICAgaWYoaWQoayk+PXZhbHVlX3NldC5zaXplKCkpCisgICAgeworICAgICAgd2hpbGUoazwzICYmIGlkKGspPj12YWx1ZV9zZXQuc2l6ZSgpKSBpZCgrK2spKys7CisgICAgICBpZC5oZWFkKGspLnNldFplcm8oKTsKKyAgICAgIGs9MDsKKyAgICB9CisgICAgCisgIH0gd2hpbGUoKGlkPGludCh2YWx1ZV9zZXQuc2l6ZSgpKSkuYWxsKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgc3ZkX3ByZWFsbG9jYXRlKCkKK3sKKyAgVmVjdG9yM2YgdigzLmYsIDIuZiwgMS5mKTsKKyAgTWF0cml4WGYgbSA9IHYuYXNEaWFnb25hbCgpOworCisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChWZWN0b3JYZiB0bXAoMTApOykKKyAgU1ZEX0RFRkFVTFQoTWF0cml4WGYpIHN2ZDsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgc3ZkLmNvbXB1dGUobSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkLnNpbmd1bGFyVmFsdWVzKCksIHYpOworCisgIFNWRF9ERUZBVUxUKE1hdHJpeFhmKSBzdmQyKDMsMyk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICBzdmQyLmNvbXB1dGUobSk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkMi5zaW5ndWxhclZhbHVlcygpLCB2KTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkMi5tYXRyaXhVKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQyLm1hdHJpeFYoKSk7CisgIHN2ZDIuY29tcHV0ZShtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworICBWRVJJRllfSVNfQVBQUk9YKHN2ZDIubWF0cml4VSgpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkMi5tYXRyaXhWKCksIE1hdHJpeDNmOjpJZGVudGl0eSgpKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7CisgIHN2ZDIuY29tcHV0ZShtKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKworICBTVkRfREVGQVVMVChNYXRyaXhYZikgc3ZkMygzLDMsQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICBzdmQyLmNvbXB1dGUobSk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkMi5zaW5ndWxhclZhbHVlcygpLCB2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdmQyLm1hdHJpeFUoKSwgTWF0cml4M2Y6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHN2ZDIubWF0cml4VigpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICBzdmQyLmNvbXB1dGUobSwgQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFN2ZFR5cGUsdHlwZW5hbWUgTWF0cml4VHlwZT4gCit2b2lkIHN2ZF92ZXJpZnlfYXNzZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgMT4gUmhzVHlwZTsKKyAgUmhzVHlwZSByaHMocm93cyk7CisgIFN2ZFR5cGUgc3ZkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQuc2luZ3VsYXJWYWx1ZXMoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLm1hdHJpeFYoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLnNvbHZlKHJocykpCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisgIGEuc2V0WmVybygpOworICBzdmQuY29tcHV0ZShhLCAwKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLm1hdHJpeFUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLm1hdHJpeFYoKSkKKyAgc3ZkLnNpbmd1bGFyVmFsdWVzKCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZC5zb2x2ZShyaHMpKQorICAgIAorICBpZiAoQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKKyAgeworICAgIHN2ZC5jb21wdXRlKGEsIENvbXB1dGVUaGluVSk7CisgICAgc3ZkLm1hdHJpeFUoKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VigpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZC5zb2x2ZShyaHMpKQorICAgIHN2ZC5jb21wdXRlKGEsIENvbXB1dGVUaGluVik7CisgICAgc3ZkLm1hdHJpeFYoKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VSgpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZC5zb2x2ZShyaHMpKQorICB9CisgIGVsc2UKKyAgeworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZC5jb21wdXRlKGEsIENvbXB1dGVUaGluVSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLmNvbXB1dGUoYSwgQ29tcHV0ZVRoaW5WKSkKKyAgfQorfQorCisjdW5kZWYgU1ZEX0RFRkFVTFQKKyN1bmRlZiBTVkRfRk9SX01JTl9OT1JNCmRpZmYgLS1naXQgYS90ZXN0L3N2ZF9maWxsLmggYi90ZXN0L3N2ZF9maWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3N2MwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3ZkX2ZpbGwuaApAQCAtMCwwICsxLDExOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitBcnJheTxULDQsMT4gZm91cl9kZW5vcm1zKCk7CisKK3RlbXBsYXRlPD4KK0FycmF5NGYgZm91cl9kZW5vcm1zKCkgeyByZXR1cm4gQXJyYXk0Zig1LjYwODQ0ZS0zOWYsIC01LjYwODQ0ZS0zOWYsIDQuOTRlLTQ0ZiwgLTQuOTRlLTQ0Zik7IH0KK3RlbXBsYXRlPD4KK0FycmF5NGQgZm91cl9kZW5vcm1zKCkgeyByZXR1cm4gQXJyYXk0ZCg1LjYwODQ0ZS0zMTMsIC01LjYwODQ0ZS0zMTMsIDQuOTRlLTMyNCwgLTQuOTRlLTMyNCk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitBcnJheTxULDQsMT4gZm91cl9kZW5vcm1zKCkgeyByZXR1cm4gZm91cl9kZW5vcm1zPGRvdWJsZT4oKS5jYXN0PFQ+KCk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc3ZkX2ZpbGxfcmFuZG9tKE1hdHJpeFR5cGUgJm0sIGludCBPcHRpb24gPSAwKQoreworICB1c2luZyBzdGQ6OnBvdzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggZGlhZ1NpemUgPSAoc3RkOjptaW4pKG0ucm93cygpLCBtLmNvbHMoKSk7CisgIFJlYWxTY2FsYXIgcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDEwLzQ7CisgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KDEscyk7CisgIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsMT4gZCA9ICBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDE+OjpSYW5kb20oZGlhZ1NpemUpOworICBmb3IoSW5kZXggaz0wOyBrPGRpYWdTaXplOyArK2spCisgICAgZChrKSA9IGQoaykqcG93KFJlYWxTY2FsYXIoMTApLGludGVybmFsOjpyYW5kb208UmVhbFNjYWxhcj4oLXMscykpOworCisgIGJvb2wgZHVwICAgICA9IGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IDM7CisgIGJvb2wgdW5pdF91diA9IGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IChkdXA/NzozKTsgLy8gaWYgd2UgZHVwbGljYXRlIHNvbWUgZGlhZ29uYWwgZW50cmllcywgdGhlbiBpbmNyZWFzZSB0aGUgY2hhbmNlIHRvIHByZXNlcnZlIHRoZW0gdXNpbmcgdW5pdGFyeSBVIGFuZCBWIGZhY3RvcnMKKyAgCisgIC8vIGR1cGxpY2F0ZSBzb21lIHNpbmd1bGFyIHZhbHVlcworICBpZihkdXApCisgIHsKKyAgICBJbmRleCBuID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkLnNpemUoKS0xKTsKKyAgICBmb3IoSW5kZXggaT0wOyBpPG47ICsraSkKKyAgICAgIGQoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkLnNpemUoKS0xKSkgPSBkKGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsZC5zaXplKCktMSkpOworICB9CisgIAorICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gVShtLnJvd3MoKSxkaWFnU2l6ZSk7CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBWVChkaWFnU2l6ZSxtLmNvbHMoKSk7CisgIGlmKHVuaXRfdXYpCisgIHsKKyAgICAvLyBpbiB2ZXJ5IHJhcmUgY2FzZXMgbGV0J3MgdHJ5IHdpdGggYSBwdXJlIGRpYWdvbmFsIG1hdHJpeAorICAgIGlmKGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IDEpCisgICAgeworICAgICAgVS5zZXRJZGVudGl0eSgpOworICAgICAgVlQuc2V0SWRlbnRpdHkoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rKGRpYWdTaXplLFUucm93cygpLCBVLmNvbHMoKSwgVSk7CisgICAgICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhkaWFnU2l6ZSxWVC5yb3dzKCksIFZULmNvbHMoKSwgVlQpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBVLnNldFJhbmRvbSgpOworICAgIFZULnNldFJhbmRvbSgpOworICB9CisgIAorICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gc2FtcGxlcyg5KTsKKyAgc2FtcGxlcyA8PCAwLCBmb3VyX2Rlbm9ybXM8UmVhbFNjYWxhcj4oKSwKKyAgICAgICAgICAgIC1SZWFsU2NhbGFyKDEpL051bVRyYWl0czxSZWFsU2NhbGFyPjo6aGlnaGVzdCgpLCBSZWFsU2NhbGFyKDEpL051bVRyYWl0czxSZWFsU2NhbGFyPjo6aGlnaGVzdCgpLCAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpLCBwb3coKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSwwLjgpOworICAKKyAgaWYoT3B0aW9uPT1TeW1tZXRyaWMpCisgIHsKKyAgICBtID0gVSAqIGQuYXNEaWFnb25hbCgpICogVS50cmFuc3Bvc2UoKTsKKyAgICAKKyAgICAvLyByYW5kb21seSBudWxsaWZ5IHNvbWUgcm93cy9jb2x1bW5zCisgICAgeworICAgICAgSW5kZXggY291bnQgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigtZGlhZ1NpemUsZGlhZ1NpemUpOworICAgICAgZm9yKEluZGV4IGs9MDsgazxjb3VudDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkaWFnU2l6ZS0xKTsKKyAgICAgICAgbS5yb3coaSkuc2V0WmVybygpOworICAgICAgICBtLmNvbChpKS5zZXRaZXJvKCk7CisgICAgICB9CisgICAgICBpZihjb3VudDwwKQorICAgICAgLy8gKHBhcnRseSkgY2FuY2VsIHNvbWUgY29lZmZzCisgICAgICBpZighKGR1cCAmJiB1bml0X3V2KSkKKyAgICAgIHsKKyAgICAgICAgCisgICAgICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0uc2l6ZSgpLTEpOworICAgICAgICBmb3IoSW5kZXggaz0wOyBrPG47ICsraykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0ucm93cygpLTEpOworICAgICAgICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0uY29scygpLTEpOworICAgICAgICAgIG0oaixpKSA9IG0oaSxqKSA9IHNhbXBsZXMoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzYW1wbGVzLnNpemUoKS0xKSk7CisgICAgICAgICAgaWYoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKKyAgICAgICAgICAgICooJm51bWV4dDo6cmVhbF9yZWYobShqLGkpKSsxKSA9ICooJm51bWV4dDo6cmVhbF9yZWYobShpLGopKSsxKSA9IHNhbXBsZXMucmVhbCgpKGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsc2FtcGxlcy5zaXplKCktMSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIG0gPSBVICogZC5hc0RpYWdvbmFsKCkgKiBWVDsKKyAgICAvLyAocGFydGx5KSBjYW5jZWwgc29tZSBjb2VmZnMKKyAgICBpZighKGR1cCAmJiB1bml0X3V2KSkKKyAgICB7CisgICAgICBJbmRleCBuID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLnNpemUoKS0xKTsKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8bjsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLnJvd3MoKS0xKTsKKyAgICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbS5jb2xzKCktMSk7CisgICAgICAgIG0oaSxqKSA9IHNhbXBsZXMoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzYW1wbGVzLnNpemUoKS0xKSk7CisgICAgICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgICAgICAgKigmbnVtZXh0OjpyZWFsX3JlZihtKGksaikpKzEpID0gc2FtcGxlcy5yZWFsKCkoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzYW1wbGVzLnNpemUoKS0xKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3Qvc3dhcC5jcHAgYi90ZXN0L3N3YXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmUzNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N3YXAuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IG90aGVyX21hdHJpeF90eXBlCit7CisgIHR5cGVkZWYgaW50IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK3N0cnVjdCBvdGhlcl9tYXRyaXhfdHlwZTxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnNeUm93TWFqb3IsIF9NYXhSb3dzLCBfTWF4Q29scz4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc3dhcChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIG90aGVyX21hdHJpeF90eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIE90aGVyTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGVpZ2VuX2Fzc2VydCgoIWludGVybmFsOjppc19zYW1lPE1hdHJpeFR5cGUsT3RoZXJNYXRyaXhUeXBlPjo6dmFsdWUpKTsKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggcm93cyA9IG0ucm93cygpOworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIAorICAvLyBjb25zdHJ1Y3QgMyBtYXRyaXggZ3VhcmFudGVlZCB0byBiZSBkaXN0aW5jdAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSArIFNjYWxhcigxMDApICogTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxjb2xzKTsKKyAgT3RoZXJNYXRyaXhUeXBlIG0zID0gT3RoZXJNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSArIFNjYWxhcigyMDApICogT3RoZXJNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpOworICAKKyAgTWF0cml4VHlwZSBtMV9jb3B5ID0gbTE7CisgIE1hdHJpeFR5cGUgbTJfY29weSA9IG0yOworICBPdGhlck1hdHJpeFR5cGUgbTNfY29weSA9IG0zOworICAKKyAgLy8gdGVzdCBzd2FwcGluZyAyIG1hdHJpY2VzIG9mIHNhbWUgdHlwZQorICBTY2FsYXIgKmQxPW0xLmRhdGEoKSwgKmQyPW0yLmRhdGEoKTsKKyAgbTEuc3dhcChtMik7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTJfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTFfY29weSk7CisgIGlmKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICB7CisgICAgVkVSSUZZKG0xLmRhdGEoKT09ZDIpOworICAgIFZFUklGWShtMi5kYXRhKCk9PWQxKTsKKyAgfQorICBtMSA9IG0xX2NvcHk7CisgIG0yID0gbTJfY29weTsKKyAgCisgIC8vIHRlc3Qgc3dhcHBpbmcgMiBtYXRyaWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAgbTEuc3dhcChtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTNfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTMgPSBtM19jb3B5OworICAKKyAgLy8gdGVzdCBzd2FwcGluZyBtYXRyaXggd2l0aCBleHByZXNzaW9uCisgIG0xLnN3YXAobTIuYmxvY2soMCwwLHJvd3MsY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLG0yX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xX2NvcHkpOworICBtMSA9IG0xX2NvcHk7CisgIG0yID0gbTJfY29weTsKKworICAvLyB0ZXN0IHN3YXBwaW5nIHR3byBleHByZXNzaW9ucyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAgbTEudHJhbnNwb3NlKCkuc3dhcChtMy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTNfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTMgPSBtM19jb3B5OworICAKKyAgaWYobTEucm93cygpPjEpCisgIHsKKyAgICAvLyB0ZXN0IGFzc2VydGlvbiBvbiBtaXNtYXRjaGluZyBzaXplIC0tIG1hdHJpeCBjYXNlCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuc3dhcChtMS5yb3coMCkpKTsKKyAgICAvLyB0ZXN0IGFzc2VydGlvbiBvbiBtaXNtYXRjaGluZyBzaXplIC0tIHhwciBjYXNlCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEucm93KDApLnN3YXAobTEpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3dhcCgpCit7CisgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIENBTExfU1VCVEVTVF8xKCBzd2FwKE1hdHJpeDNmKCkpICk7IC8vIGZpeGVkIHNpemUsIG5vIHZlY3Rvcml6YXRpb24gCisgIENBTExfU1VCVEVTVF8yKCBzd2FwKE1hdHJpeDRkKCkpICk7IC8vIGZpeGVkIHNpemUsIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24gCisgIENBTExfU1VCVEVTVF8zKCBzd2FwKE1hdHJpeFhkKHMscykpICk7IC8vIGR5biBzaXplLCBubyB2ZWN0b3JpemF0aW9uIAorICBDQUxMX1NVQlRFU1RfNCggc3dhcChNYXRyaXhYZihzLHMpKSApOyAvLyBkeW4gc2l6ZSwgcG9zc2libGUgdmVjdG9yaXphdGlvbiAKKyAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC90cmlhbmd1bGFyLmNwcCBiL3Rlc3QvdHJpYW5ndWxhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2ODU2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdHJpYW5ndWxhci5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8vIFRoaXMgZmlsZSBpcyB0cmlhbmd1bGFyVmlldyBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdHJpYW5ndWxhcl9zcXVhcmUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworCisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbTQocm93cywgY29scyksCisgICAgICAgICAgICAgcjEocm93cywgY29scyksCisgICAgICAgICAgICAgcjIocm93cywgY29scyk7CisgIFZlY3RvclR5cGUgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisKKyAgTWF0cml4VHlwZSBtMXVwID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIE1hdHJpeFR5cGUgbTJ1cCA9IG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworCisgIGlmIChyb3dzKmNvbHM+MSkKKyAgeworICAgIFZFUklGWShtMXVwLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICAgIFZFUklGWShtMnVwLnRyYW5zcG9zZSgpLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICAgIFZFUklGWSghbTIuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgIH0KKworLy8gICBWRVJJRllfSVNfQVBQUk9YKG0xdXAudHJhbnNwb3NlKCkgKiBtMiwgbTEudXBwZXIoKS50cmFuc3Bvc2UoKS5sb3dlcigpICogbTIpOworCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcis9CisgIHIxLnNldFplcm8oKTsKKyAgcjIuc2V0WmVybygpOworICByMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSAgbTE7CisgIHIyICs9IG0xdXA7CisgIFZFUklGWV9JU19BUFBST1gocjEscjIpOworCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcj0KKyAgbTEuc2V0WmVybygpOworICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IG0yLnRyYW5zcG9zZSgpICsgbTI7CisgIG0zID0gbTIudHJhbnNwb3NlKCkgKyBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50cmFuc3Bvc2UoKS50b0RlbnNlTWF0cml4KCksIG0xKTsKKworICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3I9CisgIG0xLnNldFplcm8oKTsKKyAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgPSBtMi50cmFuc3Bvc2UoKSArIG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSwgbTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCkudG9EZW5zZU1hdHJpeCgpLAorICAgICAgICAgICAgICAgICAgIG0zLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgd2hpbGUgKG51bWV4dDo6YWJzMihtMShpLGkpKTxSZWFsU2NhbGFyKDFlLTEpKSBtMShpLGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IHRybTQobTQpOworICAvLyB0ZXN0IGJhY2sgYW5kIGZvcndhcmQgc3Vic2l0dXRpb24gd2l0aCBhIHZlY3RvciBhcyB0aGUgcmhzCisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWSh2Mi5pc0FwcHJveChtMy5hZGpvaW50KCkgKiAobTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHYyKSksIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkodjIuaXNBcHByb3gobTMudHJhbnNwb3NlKCkgKiAobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodjIpKSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWSh2Mi5pc0FwcHJveChtMyAqIChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2MikpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHYyLmlzQXBwcm94KG0zLmNvbmp1Z2F0ZSgpICogKG0xLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHYyKSksIGxhcmdlckVwcykpOworCisgIC8vIHRlc3QgYmFjayBhbmQgZm9yd2FyZCBzdWJzdGl0dXRpb24gd2l0aCBhIG1hdHJpeCBhcyB0aGUgcmhzCisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWShtMi5pc0FwcHJveChtMy5hZGpvaW50KCkgKiAobTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0yKSksIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkobTIuaXNBcHByb3gobTMudHJhbnNwb3NlKCkgKiAobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUobTIpKSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWShtMi5pc0FwcHJveChtMyAqIChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShtMikpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKG0yLmlzQXBwcm94KG0zLmNvbmp1Z2F0ZSgpICogKG0xLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0yKSksIGxhcmdlckVwcykpOworCisgIC8vIGNoZWNrIE0gKiBpbnYoTCkgdXNpbmcgaW4gcGxhY2UgQVBJCisgIG00ID0gbTM7CisgIG0xLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKS5zb2x2ZUluUGxhY2UodHJtNCk7CisgIFZFUklGWV9JU19BUFBST1gobTQgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCksIG0zKTsKKworICAvLyBjaGVjayBNICogaW52KFUpIHVzaW5nIGluIHBsYWNlIEFQSQorICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBtNCA9IG0zOworICBtMy50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkuc29sdmVJblBsYWNlKHRybTQpOworICBWRVJJRllfSVNfQVBQUk9YKG00ICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpLCBtMyk7CisKKyAgLy8gY2hlY2sgc29sdmUgd2l0aCB1bml0IGRpYWdvbmFsCisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpOworICBWRVJJRlkobTIuaXNBcHByb3gobTMgKiAobTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpLnNvbHZlKG0yKSksIGxhcmdlckVwcykpOworCisvLyAgIFZFUklGWSgoICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorLy8gICAgICAgICAgICogbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworCisgIC8vIHRlc3Qgc3dhcAorICBtMS5zZXRPbmVzKCk7CisgIG0yLnNldFplcm8oKTsKKyAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc3dhcChtMSk7CisgIG0zLnNldFplcm8oKTsKKyAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0T25lcygpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0zKTsKKyAgCisgIG0xLnNldFJhbmRvbSgpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgRHluYW1pYz4gbTUoY29scywgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMjApKTsgIG01LnNldFJhbmRvbSgpOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gbTYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMjApLCByb3dzKTsgIG02LnNldFJhbmRvbSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogbTUsIG0zKm01KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNiptMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgbTYqbTMpOworCisgIG0xdXAgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMXVwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMXVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xdXApOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xdXAuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMXVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xdXAuYWRqb2ludCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5kaWFnb25hbCgpLCBtMS5kaWFnb25hbCgpKTsKKworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdHJpYW5ndWxhcl9yZWN0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBlbnVtIHsgUm93cyA9ICBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9ICBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbTQocm93cywgY29scyksCisgICAgICAgICAgICAgcjEocm93cywgY29scyksCisgICAgICAgICAgICAgcjIocm93cywgY29scyk7CisKKyAgTWF0cml4VHlwZSBtMXVwID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIE1hdHJpeFR5cGUgbTJ1cCA9IG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworCisgIGlmIChyb3dzPjEgJiYgY29scz4xKQorICB7CisgICAgVkVSSUZZKG0xdXAuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgICAgVkVSSUZZKG0ydXAudHJhbnNwb3NlKCkuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgICAgVkVSSUZZKCFtMi5pc0xvd2VyVHJpYW5ndWxhcigpKTsKKyAgfQorCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcis9CisgIHIxLnNldFplcm8oKTsKKyAgcjIuc2V0WmVybygpOworICByMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSAgbTE7CisgIHIyICs9IG0xdXA7CisgIFZFUklGWV9JU19BUFBST1gocjEscjIpOworCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcj0KKyAgbTEuc2V0WmVybygpOworICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IDMgKiBtMjsKKyAgbTMgPSAzICogbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CisKKworICBtMS5zZXRaZXJvKCk7CisgIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gMyAqIG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSwgbTEpOworCisgIG0xLnNldFplcm8oKTsKKyAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKSA9IDMgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSwgbTEpOworCisKKyAgbTEuc2V0WmVybygpOworICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpID0gMyAqIG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CisgIG0xLnNldFJhbmRvbSgpOworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRlkobTIuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgIFZFUklGWSghbTIuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKTsKKyAgVkVSSUZZKG0yLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICBWRVJJRlkobTIuZGlhZ29uYWwoKS5pc011Y2hTbWFsbGVyVGhhbihSZWFsU2NhbGFyKDEpKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpOworICBWRVJJRlkobTIuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgIG0yLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBTY2FsYXIoMSk7CisgIFZFUklGWShtMi5kaWFnb25hbCgpLmlzTXVjaFNtYWxsZXJUaGFuKFJlYWxTY2FsYXIoMSkpKTsKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKG0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICBWRVJJRlkoIW0yLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCk7CisgIFZFUklGWShtMi5pc0xvd2VyVHJpYW5ndWxhcigpKTsKKyAgVkVSSUZZKG0yLmRpYWdvbmFsKCkuaXNNdWNoU21hbGxlclRoYW4oUmVhbFNjYWxhcigxKSkpOworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKTsKKyAgVkVSSUZZKG0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICBtMi5kaWFnb25hbCgpLmFycmF5KCkgLT0gU2NhbGFyKDEpOworICBWRVJJRlkobTIuZGlhZ29uYWwoKS5pc011Y2hTbWFsbGVyVGhhbihSZWFsU2NhbGFyKDEpKSk7CisgIC8vIHRlc3Qgc3dhcAorICBtMS5zZXRPbmVzKCk7CisgIG0yLnNldFplcm8oKTsKKyAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc3dhcChtMSk7CisgIG0zLnNldFplcm8oKTsKKyAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0T25lcygpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0zKTsKK30KKwordm9pZCBidWdfMTU5KCkKK3sKKyAgTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG0pCit9CisKK3ZvaWQgdGVzdF90cmlhbmd1bGFyKCkKK3sKKyAgaW50IG1heHNpemUgPSAoc3RkOjptaW4pKEVJR0VOX1RFU1RfTUFYX1NJWkUsMjApOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspCisgIHsKKyAgICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigyLG1heHNpemUpOyBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHIpCisgICAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMixtYXhzaXplKTsgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShjKQorCisgICAgQ0FMTF9TVUJURVNUXzEoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggdHJpYW5ndWxhcl9zcXVhcmUoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXgzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0Piw4LCA4PigpKSApOworICAgIENBTExfU1VCVEVTVF81KCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXhYY2QocixyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggdHJpYW5ndWxhcl9zcXVhcmUoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ociwgcikpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNyggdHJpYW5ndWxhcl9yZWN0KE1hdHJpeDxmbG9hdCwgNCwgNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggdHJpYW5ndWxhcl9yZWN0KE1hdHJpeDxkb3VibGUsIDYsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoIHRyaWFuZ3VsYXJfcmVjdChNYXRyaXhYY2YociwgYykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHRyaWFuZ3VsYXJfcmVjdChNYXRyaXhYY2QociwgYykpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHRyaWFuZ3VsYXJfcmVjdChNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihyLCBjKSkgKTsKKyAgfQorICAKKyAgQ0FMTF9TVUJURVNUXzEoIGJ1Z18xNTkoKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bWV5YW1hLmNwcCBiL3Rlc3QvdW1leWFtYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4MDkyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW1leWFtYS5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCisjaW5jbHVkZSA8RWlnZW4vTFU+IC8vIHJlcXVpcmVkIGZvciBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudAorI2luY2x1ZGUgPEVpZ2VuL1NWRD4gLy8gcmVxdWlyZWQgZm9yIFNWRAorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKy8vICBDb25zdHJ1Y3RzIGEgcmFuZG9tIG1hdHJpeCBmcm9tIHRoZSB1bml0YXJ5IGdyb3VwIFUoc2l6ZSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VpZ2VuOjpNYXRyaXg8VCwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiByYW5kTWF0cml4VW5pdGFyeShpbnQgc2l6ZSkKK3sKKyAgdHlwZWRlZiBUIFNjYWxhcjsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiBNYXRyaXhUeXBlOworCisgIE1hdHJpeFR5cGUgUTsKKworICBpbnQgbWF4X3RyaWVzID0gNDA7CisgIGRvdWJsZSBpc191bml0YXJ5ID0gZmFsc2U7CisKKyAgd2hpbGUgKCFpc191bml0YXJ5ICYmIG1heF90cmllcyA+IDApCisgIHsKKyAgICAvLyBpbml0aWFsaXplIHJhbmRvbSBtYXRyaXgKKyAgICBRID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworCisgICAgLy8gb3J0aG9nb25hbGl6ZSBjb2x1bW5zIHVzaW5nIHRoZSBHcmFtLVNjaG1pZHQgYWxnb3JpdGhtCisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZTsgKytjb2wpCisgICAgeworICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6Q29sWHByIGNvbFZlYyA9IFEuY29sKGNvbCk7CisgICAgICBmb3IgKGludCBwcmV2Q29sID0gMDsgcHJldkNvbCA8IGNvbDsgKytwcmV2Q29sKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb2xYcHIgcHJldkNvbFZlYyA9IFEuY29sKHByZXZDb2wpOworICAgICAgICBjb2xWZWMgLT0gY29sVmVjLmRvdChwcmV2Q29sVmVjKSpwcmV2Q29sVmVjOworICAgICAgfQorICAgICAgUS5jb2woY29sKSA9IGNvbFZlYy5ub3JtYWxpemVkKCk7CisgICAgfQorCisgICAgLy8gdGhpcyBhZGRpdGlvbmFsIG9ydGhvZ29uYWxpemF0aW9uIGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhlb3J5IGJ1dCBzaG91bGQgZW5oYW5jZQorICAgIC8vIHRoZSBudW1lcmljYWwgb3J0aG9nb25hbGl0eSBvZiB0aGUgbWF0cml4CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsgKytyb3cpCisgICAgeworICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6Um93WHByIHJvd1ZlYyA9IFEucm93KHJvdyk7CisgICAgICBmb3IgKGludCBwcmV2Um93ID0gMDsgcHJldlJvdyA8IHJvdzsgKytwcmV2Um93KQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSb3dYcHIgcHJldlJvd1ZlYyA9IFEucm93KHByZXZSb3cpOworICAgICAgICByb3dWZWMgLT0gcm93VmVjLmRvdChwcmV2Um93VmVjKSpwcmV2Um93VmVjOworICAgICAgfQorICAgICAgUS5yb3cocm93KSA9IHJvd1ZlYy5ub3JtYWxpemVkKCk7CisgICAgfQorCisgICAgLy8gZmluYWwgY2hlY2sKKyAgICBpc191bml0YXJ5ID0gUS5pc1VuaXRhcnkoKTsKKyAgICAtLW1heF90cmllczsKKyAgfQorCisgIGlmIChtYXhfdHJpZXMgPT0gMCkKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInJhbmRNYXRyaXhVbml0YXJ5OiBDb3VsZCBub3QgY29uc3RydWN0IHVuaXRhcnkgbWF0cml4ISIpOworCisgIHJldHVybiBROworfQorCisvLyAgQ29uc3RydWN0cyBhIHJhbmRvbSBtYXRyaXggZnJvbSB0aGUgc3BlY2lhbCB1bml0YXJ5IGdyb3VwIFNVKHNpemUpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFaWdlbjo6TWF0cml4PFQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gcmFuZE1hdHJpeFNwZWNpYWxVbml0YXJ5KGludCBzaXplKQoreworICB0eXBlZGVmIFQgU2NhbGFyOworCisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0cml4VHlwZTsKKworICAvLyBpbml0aWFsaXplIHVuaXRhcnkgbWF0cml4CisgIE1hdHJpeFR5cGUgUSA9IHJhbmRNYXRyaXhVbml0YXJ5PFNjYWxhcj4oc2l6ZSk7CisKKyAgLy8gdHdlYWsgdGhlIGZpcnN0IGNvbHVtbiB0byBtYWtlIHRoZSBkZXRlcm1pbmFudCBiZSAxCisgIFEuY29sKDApICo9IG51bWV4dDo6Y29uaihRLmRldGVybWluYW50KCkpOworCisgIHJldHVybiBROworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcnVuX3Rlc3QoaW50IGRpbSwgaW50IG51bV9lbGVtZW50cykKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IE1hdHJpeFg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIDE+IFZlY3Rvclg7CisKKyAgLy8gTVVTVCBiZSBwb3NpdGl2ZSBiZWNhdXNlIGluIGFueSBvdGhlciBjYXNlIGRldChjUl90KSBtYXkgYmVjb21lIG5lZ2F0aXZlIGZvcgorICAvLyBvZGQgZGltZW5zaW9ucyEKKyAgY29uc3QgU2NhbGFyIGMgPSBhYnMoaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkpOworCisgIE1hdHJpeFggUiA9IHJhbmRNYXRyaXhTcGVjaWFsVW5pdGFyeTxTY2FsYXI+KGRpbSk7CisgIFZlY3RvclggdCA9IFNjYWxhcig1MCkqVmVjdG9yWDo6UmFuZG9tKGRpbSwxKTsKKworICBNYXRyaXhYIGNSX3QgPSBNYXRyaXhYOjpJZGVudGl0eShkaW0rMSxkaW0rMSk7CisgIGNSX3QuYmxvY2soMCwwLGRpbSxkaW0pID0gYypSOworICBjUl90LmJsb2NrKDAsZGltLGRpbSwxKSA9IHQ7CisKKyAgTWF0cml4WCBzcmMgPSBNYXRyaXhYOjpSYW5kb20oZGltKzEsIG51bV9lbGVtZW50cyk7CisgIHNyYy5yb3coZGltKSA9IE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+OjpDb25zdGFudChudW1fZWxlbWVudHMsIFNjYWxhcigxKSk7CisKKyAgTWF0cml4WCBkc3QgPSBjUl90KnNyYzsKKworICBNYXRyaXhYIGNSX3RfdW1leWFtYSA9IHVtZXlhbWEoc3JjLmJsb2NrKDAsMCxkaW0sbnVtX2VsZW1lbnRzKSwgZHN0LmJsb2NrKDAsMCxkaW0sbnVtX2VsZW1lbnRzKSk7CisKKyAgY29uc3QgU2NhbGFyIGVycm9yID0gKCBjUl90X3VtZXlhbWEqc3JjIC0gZHN0ICkubm9ybSgpIC8gZHN0Lm5vcm0oKTsKKyAgVkVSSUZZKGVycm9yIDwgU2NhbGFyKDQwKSpzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbWVuc2lvbj4KK3ZvaWQgcnVuX2ZpeGVkX3NpemVfdGVzdChpbnQgbnVtX2VsZW1lbnRzKQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24rMSwgRHluYW1pYz4gTWF0cml4WDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24rMSwgRGltZW5zaW9uKzE+IEhvbU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24sIERpbWVuc2lvbj4gRml4ZWRNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltZW5zaW9uLCAxPiBGaXhlZFZlY3RvcjsKKworICBjb25zdCBpbnQgZGltID0gRGltZW5zaW9uOworCisgIC8vIE1VU1QgYmUgcG9zaXRpdmUgYmVjYXVzZSBpbiBhbnkgb3RoZXIgY2FzZSBkZXQoY1JfdCkgbWF5IGJlY29tZSBuZWdhdGl2ZSBmb3IKKyAgLy8gb2RkIGRpbWVuc2lvbnMhCisgIC8vIEFsc28gaWYgYyBpcyB0byBzbWFsbCBjb21wYXJlZCB0byB0Lm5vcm0oKSwgcHJvYmxlbSBpcyBpbGwtcG9zZWQgKGNmLiBCdWcgNzQ0KQorICBjb25zdCBTY2FsYXIgYyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLjUsIDIuMCk7CisKKyAgRml4ZWRNYXRyaXggUiA9IHJhbmRNYXRyaXhTcGVjaWFsVW5pdGFyeTxTY2FsYXI+KGRpbSk7CisgIEZpeGVkVmVjdG9yIHQgPSBTY2FsYXIoMzIpKkZpeGVkVmVjdG9yOjpSYW5kb20oZGltLDEpOworCisgIEhvbU1hdHJpeCBjUl90ID0gSG9tTWF0cml4OjpJZGVudGl0eShkaW0rMSxkaW0rMSk7CisgIGNSX3QuYmxvY2soMCwwLGRpbSxkaW0pID0gYypSOworICBjUl90LmJsb2NrKDAsZGltLGRpbSwxKSA9IHQ7CisKKyAgTWF0cml4WCBzcmMgPSBNYXRyaXhYOjpSYW5kb20oZGltKzEsIG51bV9lbGVtZW50cyk7CisgIHNyYy5yb3coZGltKSA9IE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+OjpDb25zdGFudChudW1fZWxlbWVudHMsIFNjYWxhcigxKSk7CisKKyAgTWF0cml4WCBkc3QgPSBjUl90KnNyYzsKKworICBCbG9jazxNYXRyaXhYLCBEaW1lbnNpb24sIER5bmFtaWM+IHNyY19ibG9jayhzcmMsMCwwLGRpbSxudW1fZWxlbWVudHMpOworICBCbG9jazxNYXRyaXhYLCBEaW1lbnNpb24sIER5bmFtaWM+IGRzdF9ibG9jayhkc3QsMCwwLGRpbSxudW1fZWxlbWVudHMpOworCisgIEhvbU1hdHJpeCBjUl90X3VtZXlhbWEgPSB1bWV5YW1hKHNyY19ibG9jaywgZHN0X2Jsb2NrKTsKKworICBjb25zdCBTY2FsYXIgZXJyb3IgPSAoIGNSX3RfdW1leWFtYSpzcmMgLSBkc3QgKS5zcXVhcmVkTm9ybSgpOworCisgIFZFUklGWShlcnJvciA8IFNjYWxhcigxNikqc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworfQorCit2b2lkIHRlc3RfdW1leWFtYSgpCit7CisgIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdDsgKytpKQorICB7CisgICAgY29uc3QgaW50IG51bV9lbGVtZW50cyA9IGludGVybmFsOjpyYW5kb208aW50Pig0MCw1MDApOworCisgICAgLy8gd29ya3MgYWxzbyBmb3IgZGltZW5zaW9ucyBiaWdnZXIgdGhhbiAzLi4uCisgICAgZm9yIChpbnQgZGltPTI7IGRpbTw4OyArK2RpbSkKKyAgICB7CisgICAgICBDQUxMX1NVQlRFU1RfMShydW5fdGVzdDxNYXRyaXhYZD4oZGltLCBudW1fZWxlbWVudHMpKTsKKyAgICAgIENBTExfU1VCVEVTVF8yKHJ1bl90ZXN0PE1hdHJpeFhmPihkaW0sIG51bV9lbGVtZW50cykpOworICAgIH0KKworICAgIENBTExfU1VCVEVTVF8zKChydW5fZml4ZWRfc2l6ZV90ZXN0PGZsb2F0LCAyPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZmxvYXQsIDM+KG51bV9lbGVtZW50cykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgocnVuX2ZpeGVkX3NpemVfdGVzdDxmbG9hdCwgND4obnVtX2VsZW1lbnRzKSkpOworCisgICAgQ0FMTF9TVUJURVNUXzYoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCAyPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCAzPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCA0PihudW1fZWxlbWVudHMpKSk7CisgIH0KKworICAvLyBUaG9zZSB0d28gY2FsbHMgZG9uJ3QgY29tcGlsZSBhbmQgcmVzdWx0IGluIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZXMhCisgIC8vIHVtZXlhbWEoTWF0cml4WGNmKCksTWF0cml4WGNmKCkpOworICAvLyB1bWV5YW1hKE1hdHJpeFhjZCgpLE1hdHJpeFhjZCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW1mcGFja19zdXBwb3J0LmNwcCBiL3Rlc3QvdW1mcGFja19zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2FiMTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bWZwYWNrX3N1cHBvcnQuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX0RFQlVHX1NNQUxMX1BST0RVQ1RfQkxPQ0tTCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorCisjaW5jbHVkZSA8RWlnZW4vVW1mUGFja1N1cHBvcnQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF91bWZwYWNrX3N1cHBvcnRfVCgpCit7CisgIFVtZlBhY2tMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gdW1mcGFja19jb2xtYWpvcjsKKyAgVW1mUGFja0xVPFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4gPiB1bWZwYWNrX3Jvd21ham9yOworICAKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHVtZnBhY2tfY29sbWFqb3IpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcodW1mcGFja19yb3dtYWpvcik7CisgIAorICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHVtZnBhY2tfY29sbWFqb3IpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHVtZnBhY2tfcm93bWFqb3IpOworfQorCit2b2lkIHRlc3RfdW1mcGFja19zdXBwb3J0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF91bWZwYWNrX3N1cHBvcnRfVDxkb3VibGU+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X3VtZnBhY2tfc3VwcG9ydF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvdW5hbGlnbmVkYXNzZXJ0LmNwcCBiL3Rlc3QvdW5hbGlnbmVkYXNzZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzFhMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bmFsaWduZWRhc3NlcnQuY3BwCkBAIC0wLDAgKzEsMTgwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZiBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8xKQorICAvLyBkZWZhdWx0CisjZWxpZiBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8yKQorICAjZGVmaW5lIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVMgMTYKKyAgI2RlZmluZSBFSUdFTl9NQVhfQUxJR05fQllURVMgMTYKKyNlbGlmIGRlZmluZWQoRUlHRU5fVEVTVF9QQVJUXzMpCisgICNkZWZpbmUgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUyAzMgorICAjZGVmaW5lIEVJR0VOX01BWF9BTElHTl9CWVRFUyAzMgorI2VsaWYgZGVmaW5lZChFSUdFTl9URVNUX1BBUlRfNCkKKyAgI2RlZmluZSBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTIDY0CisgICNkZWZpbmUgRUlHRU5fTUFYX0FMSUdOX0JZVEVTIDY0CisjZW5kaWYKKworI2luY2x1ZGUgIm1haW4uaCIKKwordHlwZWRlZiBNYXRyaXg8ZmxvYXQsICA2LDE+IFZlY3RvcjZmOwordHlwZWRlZiBNYXRyaXg8ZmxvYXQsICA4LDE+IFZlY3RvcjhmOwordHlwZWRlZiBNYXRyaXg8ZmxvYXQsIDEyLDE+IFZlY3RvcjEyZjsKKwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA1LDE+IFZlY3RvcjVkOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA2LDE+IFZlY3RvcjZkOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA3LDE+IFZlY3RvcjdkOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA4LDE+IFZlY3RvcjhkOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA5LDE+IFZlY3RvcjlkOwordHlwZWRlZiBNYXRyaXg8ZG91YmxlLDEwLDE+IFZlY3RvcjEwZDsKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwxMiwxPiBWZWN0b3IxMmQ7CisKK3N0cnVjdCBUZXN0TmV3MQoreworICBNYXRyaXhYZCBtOyAvLyBnb29kOiBtIHdpbGwgYWxsb2NhdGUgaXRzIG93biBhcnJheSwgdGFraW5nIGNhcmUgb2YgYWxpZ25tZW50LgorICBUZXN0TmV3MSgpIDogbSgyMCwyMCkge30KK307CisKK3N0cnVjdCBUZXN0TmV3MgoreworICBNYXRyaXgzZCBtOyAvLyBnb29kOiBtJ3Mgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLCBzbyBtIGRvZXNuJ3QgaGF2ZSB0byBiZSAxNi1ieXRlIGFsaWduZWQsCisgICAgICAgICAgICAgIC8vIDgtYnl0ZSBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggaGVyZSwgd2hpY2ggd2UnbGwgZ2V0IGF1dG9tYXRpY2FsbHkKK307CisKK3N0cnVjdCBUZXN0TmV3MworeworICBWZWN0b3IyZiBtOyAvLyBnb29kOiBtJ3Mgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLCBzbyBtIGRvZXNuJ3QgaGF2ZSB0byBiZSAxNi1ieXRlIGFsaWduZWQKK307CisKK3N0cnVjdCBUZXN0TmV3NAoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIFZlY3RvcjJkIG07CisgIGZsb2F0IGY7IC8vIG1ha2UgdGhlIHN0cnVjdCBoYXZlIHNpemVvZiUxNiE9MCB0byBtYWtlIGl0IGEgbGl0dGxlIG1vcmUgdHJpY2t5IHdoZW4gd2UgYWxsb3cgYW4gYXJyYXkgb2YgMiBzdWNoIG9iamVjdHMKK307CisKK3N0cnVjdCBUZXN0TmV3NQoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIGZsb2F0IGY7IC8vIHRyeSB0aGUgZiBhdCBmaXJzdCAtLSB0aGUgRUlHRU5fQUxJR05fTUFYIGF0dHJpYnV0ZSBvZiBtIHNob3VsZCBtYWtlIHRoYXQgc3RpbGwgd29yaworICBNYXRyaXg0ZiBtOworfTsKKworc3RydWN0IFRlc3ROZXc2Cit7CisgIE1hdHJpeDxmbG9hdCwyLDIsRG9udEFsaWduPiBtOyAvLyBnb29kOiBubyBhbGlnbm1lbnQgcmVxdWVzdGVkCisgIGZsb2F0IGY7Cit9OworCit0ZW1wbGF0ZTxib29sIEFsaWduPiBzdHJ1Y3QgRGVwZW5kcworeworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKEFsaWduKQorICBWZWN0b3IyZCBtOworICBmbG9hdCBmOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2QoKQoreworICBUICp4LCAqeTsKKyAgeCA9IG5ldyBUOworICBkZWxldGUgeDsKKyAgeSA9IG5ldyBUWzJdOworICBkZWxldGVbXSB5OworfQorCisjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUz4wCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBjb25zdHJ1Y3RfYXRfYm91bmRhcnkoaW50IGJvdW5kYXJ5KQoreworICBjaGFyIGJ1ZltzaXplb2YoVCkrMjU2XTsKKyAgc2l6ZV90IF9idWYgPSByZWludGVycHJldF9jYXN0PGludGVybmFsOjpVSW50UHRyPihidWYpOworICBfYnVmICs9IChFSUdFTl9NQVhfQUxJR05fQllURVMgLSAoX2J1ZiAlIEVJR0VOX01BWF9BTElHTl9CWVRFUykpOyAvLyBtYWtlIDE2LzMyLy4uLi1ieXRlIGFsaWduZWQKKyAgX2J1ZiArPSBib3VuZGFyeTsgLy8gbWFrZSBleGFjdCBib3VuZGFyeS1hbGlnbmVkCisgIFQgKnggPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihfYnVmKSkgVDsKKyAgeFswXS5zZXRaZXJvKCk7IC8vIGp1c3QgaW4gb3JkZXIgdG8gc2lsZW5jZSB3YXJuaW5ncworICB4LT5+VCgpOworfQorI2VuZGlmCisKK3ZvaWQgdW5hbGlnbmVkYXNzZXJ0KCkKK3sKKyNpZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPjAKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjJmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjNmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRmPigxNik7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I2Zj4oNCk7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I4Zj4oRUlHRU5fTUFYX0FMSUdOX0JZVEVTKTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjEyZj4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4MmY+KDE2KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PE1hdHJpeDNmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PE1hdHJpeDRmPihFSUdFTl9NQVhfQUxJR05fQllURVMpOworCisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IyZD4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yM2Q+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yNGQ+KEVJR0VOX01BWF9BTElHTl9CWVRFUyk7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I1ZD4oNCk7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I2ZD4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yN2Q+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yOGQ+KEVJR0VOX01BWF9BTElHTl9CWVRFUyk7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I5ZD4oNCk7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IxMGQ+KDE2KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjEyZD4oRUlHRU5fTUFYX0FMSUdOX0JZVEVTKTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PE1hdHJpeDJkPihFSUdFTl9NQVhfQUxJR05fQllURVMpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4M2Q+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4NGQ+KEVJR0VOX01BWF9BTElHTl9CWVRFUyk7CisKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjJjZj4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yM2NmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjJjZD4oRUlHRU5fTUFYX0FMSUdOX0JZVEVTKTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjNjZD4oMTYpOworI2VuZGlmCisKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8VGVzdE5ldzE+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPFRlc3ROZXcyPigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxUZXN0TmV3Mz4oKTsKKworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxUZXN0TmV3ND4oKTsKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8VGVzdE5ldzU+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPFRlc3ROZXc2PigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxEZXBlbmRzPHRydWU+ID4oKTsKKworI2lmIEVJR0VOX01BWF9TVEFUSUNfQUxJR05fQllURVM+MAorICBpZihFSUdFTl9NQVhfQUxJR05fQllURVM+PTE2KQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRmPig4KSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjhmPig4KSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjEyZj4oOCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IyZD4oOCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I0ZD4oOCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I2ZD4oOCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3I4ZD4oOCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IxMGQ+KDgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMTJkPig4KSk7CisgICAgLy8gQ29tcGxleGVzIGFyZSBkaXNhYmxlZCBiZWNhdXNlIHRoZSBjb21waWxlciBtaWdodCBhZ2dyZXNzaXZlbHkgdmVjdG9yaXplCisgICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggY29lZmZzIHRvIDAgYmVmb3JlIHdlIGNhbiBjaGVjayBmb3IgYWxpZ25lZG5lc3MKKyAgICAvL1ZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IyY2Y+KDgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yNGk+KDgpKTsKKyAgfQorICBmb3IoaW50IGI9ODsgYjxFSUdFTl9NQVhfQUxJR05fQllURVM7IGIrPTgpCisgIHsKKyAgICBpZihiPDMyKSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjhmPihiKSk7CisgICAgaWYoYjw2NCkgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXg0Zj4oYikpOworICAgIGlmKGI8MzIpICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yNGQ+KGIpKTsKKyAgICBpZihiPDMyKSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PE1hdHJpeDJkPihiKSk7CisgICAgaWYoYjwxMjgpIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXg0ZD4oYikpOworICAgIC8vaWYoYjwzMikgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IyY2Q+KGIpKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgdGVzdF91bmFsaWduZWRhc3NlcnQoKQoreworICBDQUxMX1NVQlRFU1QodW5hbGlnbmVkYXNzZXJ0KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bmFsaWduZWRjb3VudC5jcHAgYi90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZmZWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bmFsaWduZWRjb3VudC5jcHAKQEAgLTAsMCArMSw1MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCitzdGF0aWMgaW50IG5iX2xvYWQ7CitzdGF0aWMgaW50IG5iX2xvYWR1Oworc3RhdGljIGludCBuYl9zdG9yZTsKK3N0YXRpYyBpbnQgbmJfc3RvcmV1OworCisjZGVmaW5lIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCAgICB7IG5iX2xvYWQrKzsgICAgfQorI2RlZmluZSBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCAgeyBuYl9sb2FkdSsrOyAgIH0KKyNkZWZpbmUgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSAgIHsgbmJfc3RvcmUrKzsgICB9CisjZGVmaW5lIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSB7IG5iX3N0b3JldSsrOyAgfQorCisjZGVmaW5lIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChYUFIsQUwsVUwsQVMsVVMpIHtcCisgICAgbmJfbG9hZCA9IG5iX2xvYWR1ID0gbmJfc3RvcmUgPSBuYl9zdG9yZXUgPSAwOyBcCisgICAgWFBSOyBcCisgICAgaWYoIShuYl9sb2FkPT1BTCAmJiBuYl9sb2FkdT09VUwgJiYgbmJfc3RvcmU9PUFTICYmIG5iX3N0b3JldT09VVMpKSBcCisgICAgICBzdGQ6OmNlcnIgPDwgIiA+PiAiIDw8IG5iX2xvYWQgPDwgIiwgIiA8PCBuYl9sb2FkdSA8PCAiLCAiIDw8IG5iX3N0b3JlIDw8ICIsICIgPDwgbmJfc3RvcmV1IDw8ICJcbiI7IFwKKyAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl9sb2FkPT1BTCAmJiBuYl9sb2FkdT09VUwgJiYgbmJfc3RvcmU9PUFTICYmIG5iX3N0b3JldT09VVMgKTsgXAorICB9CisKKworI2luY2x1ZGUgIm1haW4uaCIKKwordm9pZCB0ZXN0X3VuYWxpZ25lZGNvdW50KCkKK3sKKyAgI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX0FWWCkKKyAgVmVjdG9yWGYgYSg0MCksIGIoNDApOworICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYSArPSBiLCAxMCwgMCwgNSwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgKz0gYi5zZWdtZW50KDAsNDApLCA1LCA1LCA1LCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAtPSBiLnNlZ21lbnQoMCw0MCksIDUsIDUsIDUsIDApOworICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDApICo9IDMuNSwgNSwgMCwgNSwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgLz0gMy41LCA1LCAwLCA1LCAwKTsKKyAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKQorICBWZWN0b3JYZiBhKDQwKSwgYig0MCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhICs9IGIsIDIwLCAwLCAxMCwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgKz0gYi5zZWdtZW50KDAsNDApLCAxMCwgMTAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAtPSBiLnNlZ21lbnQoMCw0MCksIDEwLCAxMCwgMTAsIDApOworICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDApICo9IDMuNSwgMTAsIDAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAvPSAzLjUsIDEwLCAwLCAxMCwgMCk7CisgICNlbHNlCisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBpcyB0byBlbGltaW5hdGUgInZhcmlhYmxlIG5vdCB1c2VkIiB3YXJuaW5ncworICBuYl9sb2FkID0gbmJfbG9hZHUgPSBuYl9zdG9yZSA9IG5iX3N0b3JldSA9IDA7CisgIGludCBhKDApLCBiKDApOworICBWRVJJRlkoYT09Yik7CisgICNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91cHBlcmJpZGlhZ29uYWxpemF0aW9uLmNwcCBiL3Rlc3QvdXBwZXJiaWRpYWdvbmFsaXphdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3YjM0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdXBwZXJiaWRpYWdvbmFsaXphdGlvbi5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB1cHBlcmJpZGlhZyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSZWFsTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBUcmFuc3Bvc2VNYXRyaXhUeXBlOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBpbnRlcm5hbDo6VXBwZXJCaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhUeXBlPiB1YmQoYSk7CisgIFJlYWxNYXRyaXhUeXBlIGIocm93cywgY29scyk7CisgIGIuc2V0WmVybygpOworICBiLmJsb2NrKDAsMCxjb2xzLGNvbHMpID0gdWJkLmJpZGlhZ29uYWwoKTsKKyAgTWF0cml4VHlwZSBjID0gdWJkLmhvdXNlaG9sZGVyVSgpICogYiAqIHViZC5ob3VzZWhvbGRlclYoKS5hZGpvaW50KCk7CisgIFZFUklGWV9JU19BUFBST1goYSxjKTsKKyAgVHJhbnNwb3NlTWF0cml4VHlwZSBkID0gdWJkLmhvdXNlaG9sZGVyVigpICogYi5hZGpvaW50KCkgKiB1YmQuaG91c2Vob2xkZXJVKCkuYWRqb2ludCgpOworICBWRVJJRllfSVNfQVBQUk9YKGEuYWRqb2ludCgpLGQpOworfQorCit2b2lkIHRlc3RfdXBwZXJiaWRpYWdvbmFsaXphdGlvbigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICBDQUxMX1NVQlRFU1RfMSggdXBwZXJiaWRpYWcoTWF0cml4WGYoMywzKSkgKTsKKyAgIENBTExfU1VCVEVTVF8yKCB1cHBlcmJpZGlhZyhNYXRyaXhYZCgxNywxMikpICk7CisgICBDQUxMX1NVQlRFU1RfMyggdXBwZXJiaWRpYWcoTWF0cml4WGNmKDIwLDIwKSkgKTsKKyAgIENBTExfU1VCVEVTVF80KCB1cHBlcmJpZGlhZyhNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYyxEeW5hbWljLFJvd01ham9yPigxNiwxNSkpICk7CisgICBDQUxMX1NVQlRFU1RfNSggdXBwZXJiaWRpYWcoTWF0cml4PGZsb2F0LDYsND4oKSkgKTsKKyAgIENBTExfU1VCVEVTVF82KCB1cHBlcmJpZGlhZyhNYXRyaXg8ZmxvYXQsNSw1PigpKSApOworICAgQ0FMTF9TVUJURVNUXzcoIHVwcGVyYmlkaWFnKE1hdHJpeDxkb3VibGUsNCwzPigpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3ZlY3Rvcml6YXRpb25fbG9naWMuY3BwIGIvdGVzdC92ZWN0b3JpemF0aW9uX2xvZ2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MxNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC92ZWN0b3JpemF0aW9uX2xvZ2ljLmNwcApAQCAtMCwwICsxLDQxOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzEKKyNkZWZpbmUgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSAxCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8yCisjZGVmaW5lIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgMAorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUgorI3VuZGVmIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisjZW5kaWYKKyNkZWZpbmUgRUlHRU5fREVCVUdfQVNTSUdOCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCit1c2luZyBpbnRlcm5hbDo6ZGVtYW5nbGVfZmxhZ3M7Cit1c2luZyBpbnRlcm5hbDo6ZGVtYW5nbGVfdHJhdmVyc2FsOwordXNpbmcgaW50ZXJuYWw6OmRlbWFuZ2xlX3Vucm9sbGluZzsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+Citib29sIHRlc3RfYXNzaWduKGNvbnN0IERzdCYsIGNvbnN0IFNyYyYsIGludCB0cmF2ZXJzYWwsIGludCB1bnJvbGxpbmcpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmNvcHlfdXNpbmdfZXZhbHVhdG9yX3RyYWl0czxpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdD4saW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLHR5cGVuYW1lIFNyYzo6U2NhbGFyPiA+IHRyYWl0czsKKyAgYm9vbCByZXMgPSB0cmFpdHM6OlRyYXZlcnNhbD09dHJhdmVyc2FsOworICBpZih1bnJvbGxpbmc9PUlubmVyVW5yb2xsaW5nK0NvbXBsZXRlVW5yb2xsaW5nKQorICAgIHJlcyA9IHJlcyAmJiAoaW50KHRyYWl0czo6VW5yb2xsaW5nKT09SW5uZXJVbnJvbGxpbmcgfHwgaW50KHRyYWl0czo6VW5yb2xsaW5nKT09Q29tcGxldGVVbnJvbGxpbmcpOworICBlbHNlCisgICAgcmVzID0gcmVzICYmIGludCh0cmFpdHM6OlVucm9sbGluZyk9PXVucm9sbGluZzsKKyAgaWYoIXJlcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiU3JjOiAiIDw8IGRlbWFuZ2xlX2ZsYWdzKFNyYzo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgICAgIiA8PCBkZW1hbmdsZV9mbGFncyhpbnRlcm5hbDo6ZXZhbHVhdG9yPFNyYz46OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJEc3Q6ICIgPDwgZGVtYW5nbGVfZmxhZ3MoRHN0OjpGbGFncykgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICAgICAiIDw8IGRlbWFuZ2xlX2ZsYWdzKGludGVybmFsOjpldmFsdWF0b3I8RHN0Pjo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKKyAgICB0cmFpdHM6OmRlYnVnKCk7CisgICAgc3RkOjpjZXJyIDw8ICIgRXhwZWN0ZWQgVHJhdmVyc2FsID09ICIgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKHRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgPDwgIiBnb3QgIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhaXRzOjpUcmF2ZXJzYWwpIDw8ICJcbiI7CisgICAgc3RkOjpjZXJyIDw8ICIgRXhwZWN0ZWQgVW5yb2xsaW5nID09ICIgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHVucm9sbGluZykKKyAgICAgICAgICAgICAgPDwgIiBnb3QgIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodHJhaXRzOjpVbnJvbGxpbmcpIDw8ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+Citib29sIHRlc3RfYXNzaWduKGludCB0cmF2ZXJzYWwsIGludCB1bnJvbGxpbmcpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmNvcHlfdXNpbmdfZXZhbHVhdG9yX3RyYWl0czxpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdD4saW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLHR5cGVuYW1lIFNyYzo6U2NhbGFyPiA+IHRyYWl0czsKKyAgYm9vbCByZXMgPSB0cmFpdHM6OlRyYXZlcnNhbD09dHJhdmVyc2FsICYmIHRyYWl0czo6VW5yb2xsaW5nPT11bnJvbGxpbmc7CisgIGlmKCFyZXMpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlNyYzogIiA8PCBkZW1hbmdsZV9mbGFncyhTcmM6OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgICAgICIgPDwgZGVtYW5nbGVfZmxhZ3MoaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+OjpGbGFncykgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiRHN0OiAiIDw8IGRlbWFuZ2xlX2ZsYWdzKERzdDo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgICAgIiA8PCBkZW1hbmdsZV9mbGFncyhpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdD46OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CisgICAgdHJhaXRzOjpkZWJ1ZygpOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFRyYXZlcnNhbCA9PSAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmF2ZXJzYWwpCisgICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKHRyYWl0czo6VHJhdmVyc2FsKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFVucm9sbGluZyA9PSAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh1bnJvbGxpbmcpCisgICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHRyYWl0czo6VW5yb2xsaW5nKSA8PCAiXG4iOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwcj4KK2Jvb2wgdGVzdF9yZWR1eChjb25zdCBYcHImLCBpbnQgdHJhdmVyc2FsLCBpbnQgdW5yb2xsaW5nKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwcjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cmVkdXhfdHJhaXRzPGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcixTY2FsYXI+LGludGVybmFsOjpyZWR1eF9ldmFsdWF0b3I8WHByPiA+IHRyYWl0czsKKyAgCisgIGJvb2wgcmVzID0gdHJhaXRzOjpUcmF2ZXJzYWw9PXRyYXZlcnNhbCAmJiB0cmFpdHM6OlVucm9sbGluZz09dW5yb2xsaW5nOworICBpZighcmVzKQorICB7CisgICAgc3RkOjpjZXJyIDw8IGRlbWFuZ2xlX2ZsYWdzKFhwcjo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgZGVtYW5nbGVfZmxhZ3MoaW50ZXJuYWw6OmV2YWx1YXRvcjxYcHI+OjpGbGFncykgPDwgc3RkOjplbmRsOworICAgIHRyYWl0czo6ZGVidWcoKTsKKyAgICAKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKQorICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmFpdHM6OlRyYXZlcnNhbCkgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBVbnJvbGxpbmcgPT0gIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodW5yb2xsaW5nKQorICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh0cmFpdHM6OlVucm9sbGluZykgPDwgIlxuIjsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgRW5hYmxlID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlPgorc3RydWN0IHZlY3Rvcml6YXRpb25fbG9naWMKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OmhhbGYgSGFsZlBhY2tldFR5cGU7CisgIGVudW0geworICAgIFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplLAorICAgIEhhbGZQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxIYWxmUGFja2V0VHlwZT46OnNpemUKKyAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKCkKKyAgeworICAgIAorICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLDE+IFZlY3RvcjE7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yWDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYWDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSxQYWNrZXRTaXplPiBNYXRyaXgxMTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMipQYWNrZXRTaXplLDIqUGFja2V0U2l6ZT4gTWF0cml4MjI7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzE2OjQqUGFja2V0U2l6ZSwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT80KlBhY2tldFNpemU6MTY+IE1hdHJpeDQ0OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8xNjo0KlBhY2tldFNpemUsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/NCpQYWNrZXRTaXplOjE2LERvbnRBbGlnbnxFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTj4gTWF0cml4NDR1OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0KlBhY2tldFNpemUsNCpQYWNrZXRTaXplLENvbE1ham9yPiBNYXRyaXg0NGM7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQqUGFja2V0U2l6ZSw0KlBhY2tldFNpemUsUm93TWFqb3I+IE1hdHJpeDQ0cjsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwKKyAgICAgICAgKFBhY2tldFNpemU9PTggPyA0IDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gMSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gMiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDIgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpCisgICAgICA+IE1hdHJpeDE7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNCA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDEgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDIgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAyIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgIERvbnRBbGlnbnwoKE1hdHJpeDE6OkZsYWdzJlJvd01ham9yQml0KT9Sb3dNYWpvcjpDb2xNYWpvcik+IE1hdHJpeDF1OworCisgICAgLy8gdGhpcyB0eXBlIGlzIG1hZGUgc3VjaCB0aGF0IGl0IGNhbiBvbmx5IGJlIHZlY3Rvcml6ZWQgd2hlbiB2aWV3ZWQgYXMgYSBsaW5lYXIgMUQgdmVjdG9yCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDQgOiBQYWNrZXRTaXplPT00ID8gNiA6IFBhY2tldFNpemU9PTIgPyAoKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MjozKSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/ICgoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8zOjIpIDogLypQYWNrZXRTaXplPT0xID8qLyAzKQorICAgICAgPiBNYXRyaXgzOworICAgIAorICAgICNpZiAhRUlHRU5fR0NDX0FORF9BUkNIX0RPRVNOVF9XQU5UX1NUQUNLX0FMSUdOTUVOVAorICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkrVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkuY3dpc2VQcm9kdWN0KFZlY3RvcjEoKSksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpK1ZlY3RvcjEoKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLmN3aXNlUHJvZHVjdChWZWN0b3IxKCkpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NDQoKSxNYXRyaXg0NCgpK01hdHJpeDQ0KCksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NHUoKSxNYXRyaXg0NCgpK01hdHJpeDQ0KCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVW5yb2xsaW5nIDogTm9VbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxKCksTWF0cml4MSgpK01hdHJpeDEoKSwKKyAgICAgIChNYXRyaXgxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lICUgUGFja2V0U2l6ZSk9PTAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLAorICAgICAgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxdSgpLE1hdHJpeDEoKStNYXRyaXgxKCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gKChNYXRyaXgxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lICUgUGFja2V0U2l6ZSk9PTAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NGMoKS5jb2woMSksTWF0cml4NDRjKCkuY29sKDIpK01hdHJpeDQ0YygpLmNvbCgzKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDQ0cigpLnJvdygyKSxNYXRyaXg0NHIoKS5yb3coMSkrTWF0cml4NDRyKCkucm93KDEpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBpZihQYWNrZXRTaXplPjEpCisgICAgeworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMyxDb2xNYWpvcj4gTWF0cml4MzNjOworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMSxDb2xNYWpvcj4gVmVjdG9yMzsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzM2MoKS5yb3coMiksTWF0cml4MzNjKCkucm93KDEpK01hdHJpeDMzYygpLnJvdygxKSwKKyAgICAgICAgTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMygpLFZlY3RvcjMoKStWZWN0b3IzKCksCisgICAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoSGFsZlBhY2tldFNpemU9PTEgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKSA6IChIYWxmUGFja2V0U2l6ZT09MSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCksIENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MzNjKCkuY29sKDApLE1hdHJpeDMzYygpLmNvbCgxKStNYXRyaXgzM2MoKS5jb2woMSksCisgICAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoSGFsZlBhY2tldFNpemU9PTEgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKSA6IChIYWxmUGFja2V0U2l6ZT09MSA/IFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCksCisgICAgICAgICgoIUVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUpICYmIEhhbGZQYWNrZXRTaXplPT0xKSA/IE5vVW5yb2xsaW5nIDogQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDMoKSxNYXRyaXgzKCkuY3dpc2VQcm9kdWN0KE1hdHJpeDMoKSksCisgICAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDxTY2FsYXIsMTcsMTc+KCksTWF0cml4PFNjYWxhciwxNywxNz4oKStNYXRyaXg8U2NhbGFyLDE3LDE3PigpLAorICAgICAgICBIYWxmUGFja2V0U2l6ZT09MSAgICAgICAgICAgICA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCAgOgorICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZWFyVHJhdmVyc2FsLAorICAgICAgICBOb1Vucm9sbGluZykpOworCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MTEoKSwgTWF0cml4MTEoKStNYXRyaXgxMSgpLElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLE1hdHJpeDxTY2FsYXIsMTcsMTc+KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPigyLDMpK01hdHJpeDxTY2FsYXIsMTcsMTc+KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPig4LDQpLAorICAgICAgICAoRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSkgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBEZWZhdWx0VHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZ3xJbm5lclVucm9sbGluZykpOworCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLE1hdHJpeDExKCkqVmVjdG9yMSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MTEoKSxNYXRyaXgxMSgpLmxhenlQcm9kdWN0KE1hdHJpeDExKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxJbm5lclVucm9sbGluZytDb21wbGV0ZVVucm9sbGluZykpOworICAgIH0KKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvcjEoKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwzPigpLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4MygpLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NDQoKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDQ0KCkudGVtcGxhdGUgYmxvY2s8KE1hdHJpeDE6OkZsYWdzJlJvd01ham9yQml0KT80OlBhY2tldFNpemUsKE1hdHJpeDE6OkZsYWdzJlJvd01ham9yQml0KT9QYWNrZXRTaXplOjQ+KDEsMiksCisgICAgICBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NGMoKS50ZW1wbGF0ZSBibG9jazwyKlBhY2tldFNpemUsMT4oMSwyKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDQ0cigpLnRlbXBsYXRlIGJsb2NrPDEsMipQYWNrZXRTaXplPigyLDEpLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKCh0ZXN0X2Fzc2lnbjwKKyAgICAgICAgICAgIE1hcDxNYXRyaXgyMiwgQWxpZ25lZE1heCwgT3V0ZXJTdHJpZGU8MypQYWNrZXRTaXplPiA+LAorICAgICAgICAgICAgTWF0cml4MjIKKyAgICAgICAgICAgID4oSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSkpOworCisgICAgVkVSSUZZKCh0ZXN0X2Fzc2lnbjwKKyAgICAgICAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLEVJR0VOX1BMQUlOX0VOVU1fTUFYKDIsUGFja2V0U2l6ZSksRUlHRU5fUExBSU5fRU5VTV9NQVgoMixQYWNrZXRTaXplKT4sIEFsaWduZWRNYXgsIElubmVyU3RyaWRlPDMqUGFja2V0U2l6ZT4gPiwKKyAgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsRUlHRU5fUExBSU5fRU5VTV9NQVgoMixQYWNrZXRTaXplKSxFSUdFTl9QTEFJTl9FTlVNX01BWCgyLFBhY2tldFNpemUpPgorICAgICAgICAgICAgPihEZWZhdWx0VHJhdmVyc2FsLFBhY2tldFNpemU+PTg/SW5uZXJVbnJvbGxpbmc6Q29tcGxldGVVbnJvbGxpbmcpKSk7CisKKyAgICBWRVJJRlkoKHRlc3RfYXNzaWduKE1hdHJpeDExKCksIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSxFSUdFTl9QTEFJTl9FTlVNX01JTigyLFBhY2tldFNpemUpPigpKk1hdHJpeDxTY2FsYXIsRUlHRU5fUExBSU5fRU5VTV9NSU4oMixQYWNrZXRTaXplKSxQYWNrZXRTaXplPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpKTsKKyAgICAjZW5kaWYKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXhYWCgxMCwxMCksTWF0cml4WFgoMjAsMjApLmJsb2NrKDEwLDEwLDIsMyksCisgICAgICBTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvclgoMTApLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxOb1Vucm9sbGluZykpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljPFNjYWxhcixmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKCkge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBFbmFibGUgPSAhaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlPjo6aGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZT46OnZhbHVlID4KK3N0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGYKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGU+OjpoYWxmIFBhY2tldFR5cGU7CisgIGVudW0geworICAgIFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bigpCisgIHsKKyAgICAKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwxPiBWZWN0b3IxOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLFBhY2tldFNpemU+IE1hdHJpeDExOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw1KlBhY2tldFNpemUsNyxDb2xNYWpvcj4gTWF0cml4NTc7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMqUGFja2V0U2l6ZSw1LENvbE1ham9yPiBNYXRyaXgzNTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNSpQYWNrZXRTaXplLDcsRG9udEFsaWdufENvbE1ham9yPiBNYXRyaXg1N3U7CisvLyAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzE2OjQqUGFja2V0U2l6ZSwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT80KlBhY2tldFNpemU6MTY+IE1hdHJpeDQ0OworLy8gICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8xNjo0KlBhY2tldFNpemUsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/NCpQYWNrZXRTaXplOjE2LERvbnRBbGlnbnxFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTj4gTWF0cml4NDR1OworLy8gICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0KlBhY2tldFNpemUsNCpQYWNrZXRTaXplLENvbE1ham9yPiBNYXRyaXg0NGM7CisvLyAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQqUGFja2V0U2l6ZSw0KlBhY2tldFNpemUsUm93TWFqb3I+IE1hdHJpeDQ0cjsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwKKyAgICAgICAgKFBhY2tldFNpemU9PTggPyA0IDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gMSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gMiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDIgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpCisgICAgICA+IE1hdHJpeDE7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNCA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDEgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDIgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAyIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgIERvbnRBbGlnbnwoKE1hdHJpeDE6OkZsYWdzJlJvd01ham9yQml0KT9Sb3dNYWpvcjpDb2xNYWpvcik+IE1hdHJpeDF1OworCisgICAgLy8gdGhpcyB0eXBlIGlzIG1hZGUgc3VjaCB0aGF0IGl0IGNhbiBvbmx5IGJlIHZlY3Rvcml6ZWQgd2hlbiB2aWV3ZWQgYXMgYSBsaW5lYXIgMUQgdmVjdG9yCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDQgOiBQYWNrZXRTaXplPT00ID8gNiA6IFBhY2tldFNpemU9PTIgPyAoKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MjozKSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/ICgoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8zOjIpIDogLypQYWNrZXRTaXplPT0xID8qLyAzKQorICAgICAgPiBNYXRyaXgzOworICAgIAorICAgICNpZiAhRUlHRU5fR0NDX0FORF9BUkNIX0RPRVNOVF9XQU5UX1NUQUNLX0FMSUdOTUVOVAorICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkrVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxQYWNrZXRTaXplPigwKS5kZXJpdmVkKCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksU2NhbGFyKDIuMSkqVmVjdG9yMSgpLVZlY3RvcjEoKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksKFNjYWxhcigyLjEpKlZlY3RvcjEoKS50ZW1wbGF0ZSBzZWdtZW50PFBhY2tldFNpemU+KDApLVZlY3RvcjEoKS50ZW1wbGF0ZSBzZWdtZW50PFBhY2tldFNpemU+KDApKS5kZXJpdmVkKCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLmN3aXNlUHJvZHVjdChWZWN0b3IxKCkpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworCisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKStWZWN0b3IxKCksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKS5jd2lzZVByb2R1Y3QoVmVjdG9yMSgpKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDU3KCksTWF0cml4NTcoKStNYXRyaXg1NygpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLElubmVyVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NTd1KCksTWF0cml4NTcoKStNYXRyaXg1NygpLAorICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCwKKyAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyBJbm5lclVucm9sbGluZyA6IE5vVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MXUoKSxNYXRyaXgxKCkrTWF0cml4MSgpLAorICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/ICgoTWF0cml4MTo6SW5uZXJTaXplQXRDb21waWxlVGltZSAlIFBhY2tldFNpemUpPT0wID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCkgOiBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgICAgCisgICAgaWYoUGFja2V0U2l6ZT4xKQorICAgIHsKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDMsQ29sTWFqb3I+IE1hdHJpeDMzYzsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzM2MoKS5yb3coMiksTWF0cml4MzNjKCkucm93KDEpK01hdHJpeDMzYygpLnJvdygxKSwKKyAgICAgICAgTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MzNjKCkuY29sKDApLE1hdHJpeDMzYygpLmNvbCgxKStNYXRyaXgzM2MoKS5jb2woMSksCisgICAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoUGFja2V0U2l6ZT09MSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwpIDogTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICAgICAgICAgIAorICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDMoKSxNYXRyaXgzKCkuY3dpc2VRdW90aWVudChNYXRyaXgzKCkpLAorICAgICAgICBQYWNrZXRUcmFpdHM6Okhhc0RpdiA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgICAgCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PFNjYWxhciwxNywxNz4oKSxNYXRyaXg8U2NhbGFyLDE3LDE3PigpK01hdHJpeDxTY2FsYXIsMTcsMTc+KCksCisgICAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoUGFja2V0U2l6ZT09MSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwpIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgICBOb1Vucm9sbGluZykpOworICAgICAgICAKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLE1hdHJpeDxTY2FsYXIsMTcsMTc+KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPigyLDMpK01hdHJpeDxTY2FsYXIsMTcsMTc+KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPig4LDQpLAorICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogRGVmYXVsdFRyYXZlcnNhbCxQYWNrZXRTaXplPjQ/SW5uZXJVbnJvbGxpbmc6Q29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxNYXRyaXgxMSgpKlZlY3RvcjEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksTWF0cml4MTEoKS5sYXp5UHJvZHVjdChNYXRyaXgxMSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcrQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICB9CisgICAgCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoVmVjdG9yMSgpLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLDM+KCksCisgICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXgzKCksCisgICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXgzNSgpLAorICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NTcoKS50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLDM+KDEsMCksCisgICAgICBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkoKHRlc3RfYXNzaWduPAorICAgICAgICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRUlHRU5fUExBSU5fRU5VTV9NQVgoMixQYWNrZXRTaXplKSxFSUdFTl9QTEFJTl9FTlVNX01BWCgyLFBhY2tldFNpemUpPiwgQWxpZ25lZE1heCwgSW5uZXJTdHJpZGU8MypQYWNrZXRTaXplPiA+LAorICAgICAgICAgICAgTWF0cml4PFNjYWxhcixFSUdFTl9QTEFJTl9FTlVNX01BWCgyLFBhY2tldFNpemUpLEVJR0VOX1BMQUlOX0VOVU1fTUFYKDIsUGFja2V0U2l6ZSk+CisgICAgICAgICAgICA+KERlZmF1bHRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKSk7CisKKyAgICBWRVJJRlkoKHRlc3RfYXNzaWduKE1hdHJpeDU3KCksIE1hdHJpeDxTY2FsYXIsNSpQYWNrZXRTaXplLDM+KCkqTWF0cml4PFNjYWxhciwzLDc+KCksCisgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIElubmVyVW5yb2xsaW5nfENvbXBsZXRlVW5yb2xsaW5nKSkpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8U2NhbGFyLGZhbHNlPgoreworICBzdGF0aWMgdm9pZCBydW4oKSB7fQorfTsKKwordm9pZCB0ZXN0X3ZlY3Rvcml6YXRpb25fbG9naWMoKQoreworCisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFCisKKyAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljPGludD46OnJ1bigpICk7CisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpYzxmbG9hdD46OnJ1bigpICk7CisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpYzxkb3VibGU+OjpydW4oKSApOworICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSApOworICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6cnVuKCkgKTsKKyAgCisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPGludD46OnJ1bigpICk7CisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPGZsb2F0Pjo6cnVuKCkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8ZG91YmxlPjo6cnVuKCkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSApOworICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWNfaGFsZjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+OjpydW4oKSApOworICAKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+OjpWZWN0b3JpemFibGUpCisgIHsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PGZsb2F0LDMsMz4oKSxNYXRyaXg8ZmxvYXQsMywzPigpK01hdHJpeDxmbG9hdCwzLDM+KCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgICAgCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4PGZsb2F0LDUsMj4oKSwKKyAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsIDogRGVmYXVsdFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICB9CisgIAorICBpZihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxkb3VibGU+OjpWZWN0b3JpemFibGUpCisgIHsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PGRvdWJsZSwzLDM+KCksTWF0cml4PGRvdWJsZSwzLDM+KCkrTWF0cml4PGRvdWJsZSwzLDM+KCksCisgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIAorICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxkb3VibGUsNywzPigpLAorICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgIH0KKyNlbmRpZiAvLyBFSUdFTl9WRUNUT1JJWkUKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC92ZWN0b3J3aXNlb3AuY3BwIGIvdGVzdC92ZWN0b3J3aXNlb3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWI1NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZlY3Rvcndpc2VvcC5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE1IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgdmVjdG9yd2lzZW9wX2FycmF5KGNvbnN0IEFycmF5VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCAxLCBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIENvbFZlY3RvclR5cGUgY29sdmVjID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHJvd3ZlYyA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKTsKKworICAvLyB0ZXN0IGFkZGl0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpICs9IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpICsgY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSArIGNvbHZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpICs9IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLmNvbHdpc2UoKSArIGNvbHZlYy50cmFuc3Bvc2UoKSk7CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpICs9IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpICsgcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSArIHJvd3ZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpICs9IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSArIHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisKKyAgLy8gdGVzdCBzdWJzdHJhY3Rpb24KKworICBtMiA9IG0xOworICBtMi5jb2x3aXNlKCkgLT0gY29sdmVjOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5jb2x3aXNlKCkgLSBjb2x2ZWMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChjKSwgbTEuY29sKGMpIC0gY29sdmVjKTsKKworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMi5jb2x3aXNlKCkgLT0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuY29sd2lzZSgpIC0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKworICBtMiA9IG0xOworICBtMi5yb3d3aXNlKCkgLT0gcm93dmVjOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5yb3d3aXNlKCkgLSByb3d2ZWMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyKSwgbTEucm93KHIpIC0gcm93dmVjKTsKKworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMi5yb3d3aXNlKCkgLT0gcm93dmVjLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEucm93d2lzZSgpIC0gcm93dmVjLnRyYW5zcG9zZSgpKTsKKworICAvLyB0ZXN0IG11bHRpcGxpY2F0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpICo9IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpICogY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSAqIGNvbHZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpICo9IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLmNvbHdpc2UoKSAqIGNvbHZlYy50cmFuc3Bvc2UoKSk7CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpICo9IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpICogcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSAqIHJvd3ZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpICo9IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSAqIHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisKKyAgLy8gdGVzdCBxdW90aWVudAorCisgIG0yID0gbTE7CisgIG0yLmNvbHdpc2UoKSAvPSBjb2x2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLmNvbHdpc2UoKSAvIGNvbHZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKGMpLCBtMS5jb2woYykgLyBjb2x2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLmNvbHdpc2UoKSAvPSBjb2x2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5jb2x3aXNlKCkgLyBjb2x2ZWMudHJhbnNwb3NlKCkpOworCisgIG0yID0gbTE7CisgIG0yLnJvd3dpc2UoKSAvPSByb3d2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSAvIHJvd3ZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikgLyByb3d2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLnJvd3dpc2UoKSAvPSByb3d2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5yb3d3aXNlKCkgLyByb3d2ZWMudHJhbnNwb3NlKCkpOworCisgIG0yID0gbTE7CisgIC8vIHllcywgdGhlcmUgbWlnaHQgYmUgYW4gYWxpYXNpbmcgaXNzdWUgdGhlcmUgYnV0ICIucm93d2lzZSgpIC89IgorICAvLyBpcyBzdXBwb3NlZCB0byBldmFsdWF0ZSAiIG0yLmNvbHdpc2UoKS5zdW0oKSIgaW50byBhIHRlbXBvcmFyeSB0byBhdm9pZAorICAvLyBldmFsdWF0aW5nIHRoZSByZWR1Y3Rpb24gbXVsdGlwbGUgdGltZXMKKyAgaWYoQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZT4yIHx8IEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgIHsKKyAgICBtMi5yb3d3aXNlKCkgLz0gbTIuY29sd2lzZSgpLnN1bSgpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSAvIG0xLmNvbHdpc2UoKS5zdW0oKSk7CisgIH0KKworICAvLyBhbGwvYW55CisgIEFycmF5PGJvb2wsRHluYW1pYyxEeW5hbWljPiBtYihyb3dzLGNvbHMpOworICBtYiA9IChtMS5yZWFsKCk8PTAuNykuY29sd2lzZSgpLmFsbCgpOworICBWRVJJRlkoIChtYi5jb2woYykgPT0gKG0xLnJlYWwoKS5jb2woYyk8PTAuNykuYWxsKCkpLmFsbCgpICk7CisgIG1iID0gKG0xLnJlYWwoKTw9MC43KS5yb3d3aXNlKCkuYWxsKCk7CisgIFZFUklGWSggKG1iLnJvdyhyKSA9PSAobTEucmVhbCgpLnJvdyhyKTw9MC43KS5hbGwoKSkuYWxsKCkgKTsKKworICBtYiA9IChtMS5yZWFsKCk+PTAuNykuY29sd2lzZSgpLmFueSgpOworICBWRVJJRlkoIChtYi5jb2woYykgPT0gKG0xLnJlYWwoKS5jb2woYyk+PTAuNykuYW55KCkpLmFsbCgpICk7CisgIG1iID0gKG0xLnJlYWwoKT49MC43KS5yb3d3aXNlKCkuYW55KCk7CisgIFZFUklGWSggKG1iLnJvdyhyKSA9PSAobTEucmVhbCgpLnJvdyhyKT49MC43KS5hbnkoKSkuYWxsKCkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB2ZWN0b3J3aXNlb3BfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSZWFsUm93VmVjdG9yVHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIENvbFZlY3RvclR5cGUgY29sdmVjID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHJvd3ZlYyA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKTsKKyAgUmVhbENvbFZlY3RvclR5cGUgcmNyZXM7CisgIFJlYWxSb3dWZWN0b3JUeXBlIHJycmVzOworCisgIC8vIHRlc3QgYWRkaXRpb24KKworICBtMiA9IG0xOworICBtMi5jb2x3aXNlKCkgKz0gY29sdmVjOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5jb2x3aXNlKCkgKyBjb2x2ZWMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChjKSwgbTEuY29sKGMpICsgY29sdmVjKTsKKworICBpZihyb3dzPjEpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMi5jb2x3aXNlKCkgKz0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5jb2x3aXNlKCkgKyBjb2x2ZWMudHJhbnNwb3NlKCkpOworICB9CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpICs9IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpICsgcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSArIHJvd3ZlYyk7CisKKyAgaWYoY29scz4xKQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpICs9IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEucm93d2lzZSgpICsgcm93dmVjLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIC8vIHRlc3Qgc3Vic3RyYWN0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpIC09IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpIC0gY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSAtIGNvbHZlYyk7CisKKyAgaWYocm93cz4xKQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpIC09IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuY29sd2lzZSgpIC0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIG0yID0gbTE7CisgIG0yLnJvd3dpc2UoKSAtPSByb3d2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSAtIHJvd3ZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikgLSByb3d2ZWMpOworCisgIGlmKGNvbHM+MSkKKyAgeworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLnJvd3dpc2UoKSAtPSByb3d2ZWMudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSAtIHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIH0KKworICAvLyB0ZXN0IG5vcm0KKyAgcnJyZXMgPSBtMS5jb2x3aXNlKCkubm9ybSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJycmVzKGMpLCBtMS5jb2woYykubm9ybSgpKTsKKyAgcmNyZXMgPSBtMS5yb3d3aXNlKCkubm9ybSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJjcmVzKHIpLCBtMS5yb3cocikubm9ybSgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLCBtMS5jb2x3aXNlKCkudGVtcGxhdGUgbHBOb3JtPDE+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlQWJzKCkucm93d2lzZSgpLnN1bSgpLCBtMS5yb3d3aXNlKCkudGVtcGxhdGUgbHBOb3JtPDE+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlQWJzKCkuY29sd2lzZSgpLm1heENvZWZmKCksIG0xLmNvbHdpc2UoKS50ZW1wbGF0ZSBscE5vcm08SW5maW5pdHk+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlQWJzKCkucm93d2lzZSgpLm1heENvZWZmKCksIG0xLnJvd3dpc2UoKS50ZW1wbGF0ZSBscE5vcm08SW5maW5pdHk+KCkpOworCisgIC8vIHJlZ3Jlc3Npb24gZm9yIGJ1ZyAxMTU4CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCkueCgpLCBtMS5jb2woMCkuY3dpc2VBYnMoKS5zdW0oKSk7CisKKyAgLy8gdGVzdCBub3JtYWxpemVkCisgIG0yID0gbTEuY29sd2lzZSgpLm5vcm1hbGl6ZWQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKS5ub3JtYWxpemVkKCkpOworICBtMiA9IG0xLnJvd3dpc2UoKS5ub3JtYWxpemVkKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikubm9ybWFsaXplZCgpKTsKKworICAvLyB0ZXN0IG5vcm1hbGl6ZQorICBtMiA9IG0xOworICBtMi5jb2x3aXNlKCkubm9ybWFsaXplKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKGMpLCBtMS5jb2woYykubm9ybWFsaXplZCgpKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpLm5vcm1hbGl6ZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyKSwgbTEucm93KHIpLm5vcm1hbGl6ZWQoKSk7CisKKyAgLy8gdGVzdCB3aXRoIHBhcnRpYWwgcmVkdWN0aW9uIG9mIHByb2R1Y3RzCisgIE1hdHJpeDxTY2FsYXIsTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IG0xbTEgPSBtMSAqIG0xLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEgKiBtMS50cmFuc3Bvc2UoKSkuY29sd2lzZSgpLnN1bSgpLCBtMW0xLmNvbHdpc2UoKS5zdW0oKSk7CisgIE1hdHJpeDxTY2FsYXIsMSxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gdG1wKHJvd3MpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdG1wID0gKG0xICogbTEudHJhbnNwb3NlKCkpLmNvbHdpc2UoKS5zdW0oKSwgMSk7CisKKyAgbTIgPSBtMS5yb3d3aXNlKCkgLSAobTEuY29sd2lzZSgpLnN1bSgpL1JlYWxTY2FsYXIobTEucm93cygpKSkuZXZhbCgpOworICBtMSA9IG0xLnJvd3dpc2UoKSAtIChtMS5jb2x3aXNlKCkuc3VtKCkvUmVhbFNjYWxhcihtMS5yb3dzKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEsIG0yICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMiA9IChtMS5yb3d3aXNlKCkgLSBtMS5jb2x3aXNlKCkuc3VtKCkvUmVhbFNjYWxhcihtMS5yb3dzKCkpKSwgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIT0xID8gMSA6IDApICk7Cit9CisKK3ZvaWQgdGVzdF92ZWN0b3J3aXNlb3AoKQoreworICBDQUxMX1NVQlRFU1RfMSggdmVjdG9yd2lzZW9wX2FycmF5KEFycmF5MjJjZCgpKSApOworICBDQUxMX1NVQlRFU1RfMiggdmVjdG9yd2lzZW9wX2FycmF5KEFycmF5PGRvdWJsZSwgMywgMj4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoIHZlY3Rvcndpc2VvcF9hcnJheShBcnJheVhYZigzLCA0KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIHZlY3Rvcndpc2VvcF9tYXRyaXgoTWF0cml4NGNmKCkpICk7CisgIENBTExfU1VCVEVTVF81KCB2ZWN0b3J3aXNlb3BfbWF0cml4KE1hdHJpeDxmbG9hdCw0LDU+KCkpICk7CisgIENBTExfU1VCVEVTVF82KCB2ZWN0b3J3aXNlb3BfbWF0cml4KE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIENBTExfU1VCVEVTVF83KCB2ZWN0b3J3aXNlb3BfbWF0cml4KFZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzcoIHZlY3Rvcndpc2VvcF9tYXRyaXgoUm93VmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC92aXNpdG9yLmNwcCBiL3Rlc3QvdmlzaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MTcwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmlzaXRvci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhWaXNpdG9yKGNvbnN0IE1hdHJpeFR5cGUmIHApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gcC5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBwLmNvbHMoKTsKKworICAvLyBjb25zdHJ1Y3QgYSByYW5kb20gbWF0cml4IHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudAorICBNYXRyaXhUeXBlIG07CisgIG0gPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IG0uc2l6ZSgpOyBpKyspCisgICAgZm9yKEluZGV4IGkyID0gMDsgaTIgPCBpOyBpMisrKQorICAgICAgd2hpbGUobShpKSA9PSBtKGkyKSkgLy8geWVzLCA9PQorICAgICAgICBtKGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIAorICBTY2FsYXIgbWluYyA9IFNjYWxhcigxMDAwKSwgbWF4YyA9IFNjYWxhcigtMTAwMCk7CisgIEluZGV4IG1pbnJvdz0wLG1pbmNvbD0wLG1heHJvdz0wLG1heGNvbD0wOworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzOyBqKyspCisgIGZvcihJbmRleCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgeworICAgIGlmKG0oaSxqKSA8IG1pbmMpCisgICAgeworICAgICAgbWluYyA9IG0oaSxqKTsKKyAgICAgIG1pbnJvdyA9IGk7CisgICAgICBtaW5jb2wgPSBqOworICAgIH0KKyAgICBpZihtKGksaikgPiBtYXhjKQorICAgIHsKKyAgICAgIG1heGMgPSBtKGksaik7CisgICAgICBtYXhyb3cgPSBpOworICAgICAgbWF4Y29sID0gajsKKyAgICB9CisgIH0KKyAgSW5kZXggZWlnZW5fbWlucm93LCBlaWdlbl9taW5jb2wsIGVpZ2VuX21heHJvdywgZWlnZW5fbWF4Y29sOworICBTY2FsYXIgZWlnZW5fbWluYywgZWlnZW5fbWF4YzsKKyAgZWlnZW5fbWluYyA9IG0ubWluQ29lZmYoJmVpZ2VuX21pbnJvdywmZWlnZW5fbWluY29sKTsKKyAgZWlnZW5fbWF4YyA9IG0ubWF4Q29lZmYoJmVpZ2VuX21heHJvdywmZWlnZW5fbWF4Y29sKTsKKyAgVkVSSUZZKG1pbnJvdyA9PSBlaWdlbl9taW5yb3cpOworICBWRVJJRlkobWF4cm93ID09IGVpZ2VuX21heHJvdyk7CisgIFZFUklGWShtaW5jb2wgPT0gZWlnZW5fbWluY29sKTsKKyAgVkVSSUZZKG1heGNvbCA9PSBlaWdlbl9tYXhjb2wpOworICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIGVpZ2VuX21pbmMpOworICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIGVpZ2VuX21heGMpOworICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIG0ubWluQ29lZmYoKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF4YywgbS5tYXhDb2VmZigpKTsKKworICBlaWdlbl9tYXhjID0gKG0uYWRqb2ludCgpKm0pLm1heENvZWZmKCZlaWdlbl9tYXhyb3csJmVpZ2VuX21heGNvbCk7CisgIGVpZ2VuX21heGMgPSAobS5hZGpvaW50KCkqbSkuZXZhbCgpLm1heENvZWZmKCZtYXhyb3csJm1heGNvbCk7CisgIFZFUklGWShtYXhyb3cgPT0gZWlnZW5fbWF4cm93KTsKKyAgVkVSSUZZKG1heGNvbCA9PSBlaWdlbl9tYXhjb2wpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIHZlY3RvclZpc2l0b3IoY29uc3QgVmVjdG9yVHlwZSYgdykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IHNpemUgPSB3LnNpemUoKTsKKworICAvLyBjb25zdHJ1Y3QgYSByYW5kb20gdmVjdG9yIHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudAorICBWZWN0b3JUeXBlIHY7CisgIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBmb3IoSW5kZXggaTIgPSAwOyBpMiA8IGk7IGkyKyspCisgICAgICB3aGlsZSh2KGkpID09IHYoaTIpKSAvLyB5ZXMsID09CisgICAgICAgIHYoaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgCisgIFNjYWxhciBtaW5jID0gdigwKSwgbWF4YyA9IHYoMCk7CisgIEluZGV4IG1pbmlkeD0wLCBtYXhpZHg9MDsKKyAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICB7CisgICAgaWYodihpKSA8IG1pbmMpCisgICAgeworICAgICAgbWluYyA9IHYoaSk7CisgICAgICBtaW5pZHggPSBpOworICAgIH0KKyAgICBpZih2KGkpID4gbWF4YykKKyAgICB7CisgICAgICBtYXhjID0gdihpKTsKKyAgICAgIG1heGlkeCA9IGk7CisgICAgfQorICB9CisgIEluZGV4IGVpZ2VuX21pbmlkeCwgZWlnZW5fbWF4aWR4OworICBTY2FsYXIgZWlnZW5fbWluYywgZWlnZW5fbWF4YzsKKyAgZWlnZW5fbWluYyA9IHYubWluQ29lZmYoJmVpZ2VuX21pbmlkeCk7CisgIGVpZ2VuX21heGMgPSB2Lm1heENvZWZmKCZlaWdlbl9tYXhpZHgpOworICBWRVJJRlkobWluaWR4ID09IGVpZ2VuX21pbmlkeCk7CisgIFZFUklGWShtYXhpZHggPT0gZWlnZW5fbWF4aWR4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCBlaWdlbl9taW5jKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCBlaWdlbl9tYXhjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCB2Lm1pbkNvZWZmKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIHYubWF4Q29lZmYoKSk7CisgIAorICBJbmRleCBpZHgwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzaXplLTEpOworICBJbmRleCBpZHgxID0gZWlnZW5fbWluaWR4OworICBJbmRleCBpZHgyID0gZWlnZW5fbWF4aWR4OworICBWZWN0b3JUeXBlIHYxKHYpLCB2Mih2KTsKKyAgdjEoaWR4MCkgPSB2MShpZHgxKTsKKyAgdjIoaWR4MCkgPSB2MihpZHgyKTsKKyAgdjEubWluQ29lZmYoJmVpZ2VuX21pbmlkeCk7CisgIHYyLm1heENvZWZmKCZlaWdlbl9tYXhpZHgpOworICBWRVJJRlkoZWlnZW5fbWluaWR4ID09IChzdGQ6Om1pbikoaWR4MCxpZHgxKSk7CisgIFZFUklGWShlaWdlbl9tYXhpZHggPT0gKHN0ZDo6bWluKShpZHgwLGlkeDIpKTsKK30KKwordm9pZCB0ZXN0X3Zpc2l0b3IoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBtYXRyaXhWaXNpdG9yKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWF0cml4VmlzaXRvcihNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXRyaXhWaXNpdG9yKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1hdHJpeFZpc2l0b3IoTWF0cml4WGQoOCwgMTIpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXRyaXhWaXNpdG9yKE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPigyMCwgMjApKSApOworICAgIENBTExfU1VCVEVTVF82KCBtYXRyaXhWaXNpdG9yKE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgfQorICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF83KCB2ZWN0b3JWaXNpdG9yKFZlY3RvcjRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclZpc2l0b3IoTWF0cml4PGludCwxMiwxPigpKSApOworICAgIENBTExfU1VCVEVTVF84KCB2ZWN0b3JWaXNpdG9yKFZlY3RvclhkKDEwKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggdmVjdG9yVmlzaXRvcihSb3dWZWN0b3JYZCgxMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEwKCB2ZWN0b3JWaXNpdG9yKFZlY3RvclhmKDMzKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC96ZXJvc2l6ZWQuY3BwIGIvdGVzdC96ZXJvc2l6ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3N2ZmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3plcm9zaXplZC5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHplcm9SZWR1Y3Rpb24oY29uc3QgTWF0cml4VHlwZSYgbSkgeworICAvLyBSZWR1Y3Rpb25zIHRoYXQgbXVzdCBob2xkIGZvciB6ZXJvIHNpemVkIG9iamVjdHMKKyAgVkVSSUZZKG0uYWxsKCkpOworICBWRVJJRlkoIW0uYW55KCkpOworICBWRVJJRlkobS5wcm9kKCk9PTEpOworICBWRVJJRlkobS5zdW0oKT09MCk7CisgIFZFUklGWShtLmNvdW50KCk9PTApOworICBWRVJJRlkobS5hbGxGaW5pdGUoKSk7CisgIFZFUklGWSghbS5oYXNOYU4oKSk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB6ZXJvU2l6ZWRNYXRyaXgoKQoreworICBNYXRyaXhUeXBlIHQxOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gMCkKKyAgeworICAgIHplcm9SZWR1Y3Rpb24odDEpOworICAgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKQorICAgICAgVkVSSUZZKHQxLnJvd3MoKSA9PSAwKTsKKyAgICBpZiAoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKKyAgICAgIFZFUklGWSh0MS5jb2xzKCkgPT0gMCk7CisKKyAgICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyAmJiBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKQorICAgIHsKKworICAgICAgTWF0cml4VHlwZSB0MigwLCAwKSwgdDModDEpOworICAgICAgVkVSSUZZKHQyLnJvd3MoKSA9PSAwKTsKKyAgICAgIFZFUklGWSh0Mi5jb2xzKCkgPT0gMCk7CisKKyAgICAgIHplcm9SZWR1Y3Rpb24odDIpOworICAgICAgVkVSSUZZKHQxPT10Mik7CisgICAgfQorICB9CisKKyAgaWYoTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUhPTAgJiYgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUhPTApCisgIHsKKyAgICBJbmRleCByb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKSA6IEluZGV4KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKTsKKyAgICBJbmRleCBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKSA6IEluZGV4KE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKTsKKyAgICBNYXRyaXhUeXBlIG0ocm93cyxjb2xzKTsKKyAgICB6ZXJvUmVkdWN0aW9uKG0udGVtcGxhdGUgYmxvY2s8MCxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4oMCwwLDAsY29scykpOworICAgIHplcm9SZWR1Y3Rpb24obS50ZW1wbGF0ZSBibG9jazxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwwPigwLDAscm93cywwKSk7CisgICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPDAsMT4oMCwwKSk7CisgICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPDEsMD4oMCwwKSk7CisgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IHByb2QgPSBtLnRlbXBsYXRlIGJsb2NrPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLDA+KDAsMCxyb3dzLDApICogbS50ZW1wbGF0ZSBibG9jazwwLE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPigwLDAsMCxjb2xzKTsKKyAgICBWRVJJRlkocHJvZC5yb3dzKCk9PXJvd3MgJiYgcHJvZC5jb2xzKCk9PWNvbHMpOworICAgIFZFUklGWShwcm9kLmlzWmVybygpKTsKKyAgICBwcm9kID0gbS50ZW1wbGF0ZSBibG9jazwxLDA+KDAsMCkgKiBtLnRlbXBsYXRlIGJsb2NrPDAsMT4oMCwwKTsKKyAgICBWRVJJRlkocHJvZC5zaXplKCk9PTEpOworICAgIFZFUklGWShwcm9kLmlzWmVybygpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIHplcm9TaXplZFZlY3RvcigpCit7CisgIFZlY3RvclR5cGUgdDE7CisKKyAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PTApCisgIHsKKyAgICB6ZXJvUmVkdWN0aW9uKHQxKTsKKyAgICBWRVJJRlkodDEuc2l6ZSgpID09IDApOworICAgIFZlY3RvclR5cGUgdDIoRGVuc2VJbmRleCgwKSk7IC8vIERlbnNlSW5kZXggZGlzYW1iaWd1YXRlcyB3aXRoIDAtdGhlLW51bGwtcG9pbnRlciAoZXJyb3Igd2l0aCBnY2MgNC40IGFuZCBNU1ZDOCkKKyAgICBWRVJJRlkodDIuc2l6ZSgpID09IDApOworICAgIHplcm9SZWR1Y3Rpb24odDIpOworCisgICAgVkVSSUZZKHQxPT10Mik7CisgIH0KK30KKwordm9pZCB0ZXN0X3plcm9zaXplZCgpCit7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXgyZD4oKTsKKyAgemVyb1NpemVkTWF0cml4PE1hdHJpeDNpPigpOworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4PGZsb2F0LCAyLCBEeW5hbWljPiA+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXhYZj4oKTsKKyAgemVyb1NpemVkTWF0cml4PE1hdHJpeDxmbG9hdCwgMCwgMD4gPigpOworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4PGZsb2F0LCBEeW5hbWljLCAwLCAwLCAwLCAwPiA+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXg8ZmxvYXQsIDAsIER5bmFtaWMsIDAsIDAsIDA+ID4oKTsKKyAgemVyb1NpemVkTWF0cml4PE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgMCwgMCwgMD4gPigpOworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4PGZsb2F0LCAwLCA0PiA+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXg8ZmxvYXQsIDQsIDA+ID4oKTsKKworICB6ZXJvU2l6ZWRWZWN0b3I8VmVjdG9yMmQ+KCk7CisgIHplcm9TaXplZFZlY3RvcjxWZWN0b3IzaT4oKTsKKyAgemVyb1NpemVkVmVjdG9yPFZlY3RvclhmPigpOworICB6ZXJvU2l6ZWRWZWN0b3I8TWF0cml4PGZsb2F0LCAwLCAxPiA+KCk7CisgIHplcm9TaXplZFZlY3RvcjxNYXRyaXg8ZmxvYXQsIDEsIDA+ID4oKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAorYWRkX3N1YmRpcmVjdG9yeShFaWdlbikKK2FkZF9zdWJkaXJlY3RvcnkoZG9jIEVYQ0xVREVfRlJPTV9BTEwpCitpZihFSUdFTl9MRUFWRV9URVNUX0lOX0FMTF9UQVJHRVQpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkgIyBjYW4ndCBkbyBFWENMVURFX0ZST01fQUxMIGhlcmUsIGJyZWFrcyBDVGVzdAorZWxzZSgpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCBFWENMVURFX0ZST01fQUxMKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjVmMDcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9BZG9sY0ZvcndhcmQKQEAgLTAsMCArMSwxNTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQURMT0NfRk9SV0FSRAorI2RlZmluZSBFSUdFTl9BRExPQ19GT1JXQVJECisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYWRvbGMncyBhZG91YmxlIHR5cGUgaW4gZm9yd2FyZCBtb2RlLgorLy8gQURPTC1DIGlzIGEgQysrIGF1dG9tYXRpYyBkaWZmZXJlbnRpYXRpb24gbGlicmFyeSwKKy8vIHNlZSBodHRwczovL3Byb2plY3RzLmNvaW4tb3Iub3JnL0FET0wtQyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGRpcmVjdGlvbnMgaXMgY29udHJvbGxlZCBieQorLy8gdGhlIHByZXByb2Nlc3NvciB0b2tlbiBOVU1CRVJfRElSRUNUSU9OUy4gVGhlIGRlZmF1bHQgaXMgMi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQURPTENfVEFQRUxFU1MKKyNpZm5kZWYgTlVNQkVSX0RJUkVDVElPTlMKKyMgZGVmaW5lIE5VTUJFUl9ESVJFQ1RJT05TIDIKKyNlbmRpZgorI2luY2x1ZGUgPGFkb2xjL2FkdGwuaD4KKworLy8gYWRvbGMgZGVmaW5lcyBzb21lIHZlcnkgc3R1cGlkIG1hY3JvczoKKyNpZiBkZWZpbmVkKG1hbGxvYykKKyMgdW5kZWYgbWFsbG9jCisjZW5kaWYKKworI2lmIGRlZmluZWQoY2FsbG9jKQorIyB1bmRlZiBjYWxsb2MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChyZWFsbG9jKQorIyB1bmRlZiByZWFsbG9jCisjZW5kaWYKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorICAqIFxkZWZncm91cCBBZG9sY0ZvcndhcmRfTW9kdWxlIEFkb2xjIGZvcndhcmQgbW9kdWxlCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYWRvbGMncyBhZG91YmxlIHR5cGUgaW4gZm9yd2FyZCBtb2RlLgorICAqIEFET0wtQyBpcyBhIEMrKyBhdXRvbWF0aWMgZGlmZmVyZW50aWF0aW9uIGxpYnJhcnksCisgICogc2VlIGh0dHBzOi8vcHJvamVjdHMuY29pbi1vci5vcmcvQURPTC1DIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAqIEl0IG1haW5seSBjb25zaXN0cyBpbjoKKyAgKiAgLSBhIHN0cnVjdCBFaWdlbjo6TnVtVHJhaXRzPGFkdGw6OmFkb3VibGU+IHNwZWNpYWxpemF0aW9uCisgICogIC0gb3ZlcmxvYWRzIG9mIGludGVybmFsOjoqIG1hdGggZnVuY3Rpb24gZm9yIGFkdGw6OmFkb3VibGUgdHlwZS4KKyAgKgorICAqIE5vdGUgdGhhdCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgZGlyZWN0aW9ucyBpcyBjb250cm9sbGVkIGJ5CisgICogdGhlIHByZXByb2Nlc3NvciB0b2tlbiBOVU1CRVJfRElSRUNUSU9OUy4gVGhlIGRlZmF1bHQgaXMgMi4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0Fkb2xjU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqLworICAvL0B7CisKK30gLy8gbmFtZXNwYWNlIEVpZ2VuCisKKy8vIEVpZ2VuJ3MgcmVxdWlyZSBhIGZldyBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB3aGljaCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlCisvLyB0aGFuIHRoZSBjdXN0b20gc2NhbGFyIHR5cGUgb3duIG5hbWVzcGFjZQorbmFtZXNwYWNlIGFkdGwgeworCitpbmxpbmUgY29uc3QgYWRvdWJsZSYgY29uaihjb25zdCBhZG91YmxlJiB4KSAgeyByZXR1cm4geDsgfQoraW5saW5lIGNvbnN0IGFkb3VibGUmIHJlYWwoY29uc3QgYWRvdWJsZSYgeCkgIHsgcmV0dXJuIHg7IH0KK2lubGluZSBhZG91YmxlIGltYWcoY29uc3QgYWRvdWJsZSYpICAgIHsgcmV0dXJuIDAuOyB9CitpbmxpbmUgYWRvdWJsZSBhYnMoY29uc3QgYWRvdWJsZSYgIHgpICB7IHJldHVybiBmYWJzKHgpOyB9CitpbmxpbmUgYWRvdWJsZSBhYnMyKGNvbnN0IGFkb3VibGUmIHgpICB7IHJldHVybiB4Kng7IH0KKworfQorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8YWR0bDo6YWRvdWJsZT4KKyAgICA6IE51bVRyYWl0czxkb3VibGU+Cit7CisgIHR5cGVkZWYgYWR0bDo6YWRvdWJsZSBSZWFsOworICB0eXBlZGVmIGFkdGw6OmFkb3VibGUgTm9uSW50ZWdlcjsKKyAgdHlwZWRlZiBhZHRsOjphZG91YmxlIE5lc3RlZDsKKyAgZW51bSB7CisgICAgSXNDb21wbGV4ID0gMCwKKyAgICBJc0ludGVnZXIgPSAwLAorICAgIElzU2lnbmVkID0gMSwKKyAgICBSZXF1aXJlSW5pdGlhbGl6YXRpb24gPSAxLAorICAgIFJlYWRDb3N0ID0gMSwKKyAgICBBZGRDb3N0ID0gMSwKKyAgICBNdWxDb3N0ID0gMQorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4gY2xhc3MgQWRvbGNGb3J3YXJkSmFjb2JpYW4gOiBwdWJsaWMgRnVuY3RvcgoreworICB0eXBlZGVmIGFkdGw6OmFkb3VibGUgQWN0aXZlU2NhbGFyOworcHVibGljOgorCisgIEFkb2xjRm9yd2FyZEphY29iaWFuKCkgOiBGdW5jdG9yKCkge30KKyAgQWRvbGNGb3J3YXJkSmFjb2JpYW4oY29uc3QgRnVuY3RvciYgZikgOiBGdW5jdG9yKGYpIHt9CisKKyAgLy8gZm9yd2FyZCBjb25zdHJ1Y3RvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDA+CisgIEFkb2xjRm9yd2FyZEphY29iaWFuKGNvbnN0IFQwJiBhMCkgOiBGdW5jdG9yKGEwKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgIEFkb2xjRm9yd2FyZEphY29iaWFuKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExKSA6IEZ1bmN0b3IoYTAsIGExKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBBZG9sY0ZvcndhcmRKYWNvYmlhbihjb25zdCBUMCYgYTAsIGNvbnN0IFQxJiBhMSwgY29uc3QgVDEmIGEyKSA6IEZ1bmN0b3IoYTAsIGExLCBhMikge30KKworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OklucHV0VHlwZSBJbnB1dFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpKYWNvYmlhblR5cGUgSmFjb2JpYW5UeXBlOworCisgIHR5cGVkZWYgTWF0cml4PEFjdGl2ZVNjYWxhciwgSW5wdXRUeXBlOjpTaXplQXRDb21waWxlVGltZSwgMT4gQWN0aXZlSW5wdXQ7CisgIHR5cGVkZWYgTWF0cml4PEFjdGl2ZVNjYWxhciwgVmFsdWVUeXBlOjpTaXplQXRDb21waWxlVGltZSwgMT4gQWN0aXZlVmFsdWU7CisKKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfamFjKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KHYhPTApOworICAgIGlmICghX2phYykKKyAgICB7CisgICAgICBGdW5jdG9yOjpvcGVyYXRvcigpKHgsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEphY29iaWFuVHlwZSYgamFjID0gKl9qYWM7CisKKyAgICBBY3RpdmVJbnB1dCBheCA9IHgudGVtcGxhdGUgY2FzdDxBY3RpdmVTY2FsYXI+KCk7CisgICAgQWN0aXZlVmFsdWUgYXYoamFjLnJvd3MoKSk7CisKKyAgICBmb3IgKGludCBqPTA7IGo8amFjLmNvbHMoKTsgaisrKQorICAgICAgZm9yIChpbnQgaT0wOyBpPGphYy5jb2xzKCk7IGkrKykKKyAgICAgICAgYXhbaV0uc2V0QURWYWx1ZShqLCBpPT1qID8gMSA6IDApOworCisgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKShheCwgJmF2KTsKKworICAgIGZvciAoaW50IGk9MDsgaTxqYWMucm93cygpOyBpKyspCisgICAgeworICAgICAgKCp2KVtpXSA9IGF2W2ldLmdldFZhbHVlKCk7CisgICAgICBmb3IgKGludCBqPTA7IGo8amFjLmNvbHMoKTsgaisrKQorICAgICAgICBqYWMuY29lZmZSZWYoaSxqKSA9IGF2W2ldLmdldEFEVmFsdWUoaik7CisgICAgfQorICB9Citwcm90ZWN0ZWQ6CisKK307CisKKy8vQH0KKworfQorCisjZW5kaWYgLy8gRUlHRU5fQURMT0NfRk9SV0FSRApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQWxpZ25lZFZlY3RvcjMgYi91bnN1cHBvcnRlZC9FaWdlbi9BbGlnbmVkVmVjdG9yMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E4NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQWxpZ25lZFZlY3RvcjMKQEAgLTAsMCArMSwyMjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FMSUdORURfVkVDVE9SMworI2RlZmluZSBFSUdFTl9BTElHTkVEX1ZFQ1RPUjMKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCituYW1lc3BhY2UgRWlnZW4geworCisvKioKKyAgKiBcZGVmZ3JvdXAgQWxpZ25lZFZlY3RvcjNfTW9kdWxlIEFsaWduZWQgdmVjdG9yMyBtb2R1bGUKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0FsaWduZWRWZWN0b3IzPgorICAqIFxlbmRjb2RlCisgICovCisgIC8vQHsKKworCisvKiogXGNsYXNzIEFsaWduZWRWZWN0b3IzCisgICoKKyAgKiBcYnJpZWYgQSB2ZWN0b3JpemF0aW9uIGZyaWVuZGx5IDNEIHZlY3RvcgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgM0QgdmVjdG9yIGludGVybmFsbHkgdXNpbmcgYSA0RCB2ZWN0b3IKKyAgKiBzdWNoIHRoYXQgdmVjdG9yaXphdGlvbiBjYW4gYmUgc2VhbWxlc3NseSBlbmFibGVkLiBPZiBjb3Vyc2UsCisgICogdGhlIHNhbWUgcmVzdWx0IGNhbiBiZSBhY2hpZXZlZCBieSBkaXJlY3RseSB1c2luZyBhIDREIHZlY3Rvci4KKyAgKiBUaGlzIGNsYXNzIG1ha2VzIHRoaXMgcHJvY2VzcyBzaW1wbGVyLgorICAqCisgICovCisvLyBUT0RPIHNwZWNpYWxpemUgQ3dpc2UKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IGNsYXNzIEFsaWduZWRWZWN0b3IzOworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gc3RydWN0IHRyYWl0czxBbGlnbmVkVmVjdG9yMzxfU2NhbGFyPiA+CisgIDogdHJhaXRzPE1hdHJpeDxfU2NhbGFyLDMsMSwwLDQsMT4gPgoreworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gY2xhc3MgQWxpZ25lZFZlY3RvcjMKKyAgOiBwdWJsaWMgTWF0cml4QmFzZTxBbGlnbmVkVmVjdG9yMzxfU2NhbGFyPiA+Cit7CisgICAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhciw0LDE+IENvZWZmVHlwZTsKKyAgICBDb2VmZlR5cGUgbV9jb2VmZnM7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWF0cml4QmFzZTxBbGlnbmVkVmVjdG9yMzxfU2NhbGFyPiA+IEJhc2U7CQorICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoQWxpZ25lZFZlY3RvcjMpCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqOworCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiAzOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiAxOyB9CisgICAgCisgICAgU2NhbGFyKiBkYXRhKCkgeyByZXR1cm4gbV9jb2VmZnMuZGF0YSgpOyB9CisgICAgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMuZGF0YSgpOyB9CisgICAgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiAxOyB9CisgICAgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiAzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7IHJldHVybiBtX2NvZWZmcy5jb2VmZihyb3csIGNvbCk7IH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsgcmV0dXJuIG1fY29lZmZzLmNvZWZmUmVmKHJvdywgY29sKTsgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9jb2VmZnMuY29lZmYoaW5kZXgpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7IHJldHVybiBtX2NvZWZmcy5jb2VmZlJlZihpbmRleCk7fQorCisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgeikKKyAgICAgIDogbV9jb2VmZnMoeCwgeSwgeiwgU2NhbGFyKDApKQorICAgIHt9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMoY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKQorICAgICAgOiBCYXNlKCksIG1fY29lZmZzKG90aGVyLm1fY29lZmZzKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCBpbnQgU2l6ZT1YcHJUeXBlOjpTaXplQXRDb21waWxlVGltZT4KKyAgICBzdHJ1Y3QgZ2VuZXJpY19hc3NpZ25fc2VsZWN0b3Ige307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiBzdHJ1Y3QgZ2VuZXJpY19hc3NpZ25fc2VsZWN0b3I8WHByVHlwZSw0PgorICAgIHsKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oQWxpZ25lZFZlY3RvcjMmIGRlc3QsIGNvbnN0IFhwclR5cGUmIHNyYykKKyAgICAgIHsKKyAgICAgICAgZGVzdC5tX2NvZWZmcyA9IHNyYzsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IGdlbmVyaWNfYXNzaWduX3NlbGVjdG9yPFhwclR5cGUsMz4KKyAgICB7CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQgcnVuKEFsaWduZWRWZWN0b3IzJiBkZXN0LCBjb25zdCBYcHJUeXBlJiBzcmMpCisgICAgICB7CisgICAgICAgIGRlc3QubV9jb2VmZnMudGVtcGxhdGUgaGVhZDwzPigpID0gc3JjOworICAgICAgICBkZXN0Lm1fY29lZmZzLncoKSA9IFNjYWxhcigwKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgZ2VuZXJpY19hc3NpZ25fc2VsZWN0b3I8RGVyaXZlZD46OnJ1bigqdGhpcyxvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyYgb3BlcmF0b3I9KGNvbnN0IEFsaWduZWRWZWN0b3IzJiBvdGhlcikKKyAgICB7IG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7IHJldHVybiAqdGhpczsgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgZ2VuZXJpY19hc3NpZ25fc2VsZWN0b3I8RGVyaXZlZD46OnJ1bigqdGhpcyxvdGhlci5kZXJpdmVkKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyBvcGVyYXRvcisoY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIEFsaWduZWRWZWN0b3IzKG1fY29lZmZzICsgb3RoZXIubV9jb2VmZnMpOyB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMmIG9wZXJhdG9yKz0oY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKQorICAgIHsgbV9jb2VmZnMgKz0gb3RoZXIubV9jb2VmZnM7IHJldHVybiAqdGhpczsgfQorCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzIG9wZXJhdG9yLShjb25zdCBBbGlnbmVkVmVjdG9yMyYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gQWxpZ25lZFZlY3RvcjMobV9jb2VmZnMgLSBvdGhlci5tX2NvZWZmcyk7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyBvcGVyYXRvci09KGNvbnN0IEFsaWduZWRWZWN0b3IzJiBvdGhlcikKKyAgICB7IG1fY29lZmZzIC09IG90aGVyLm1fY29lZmZzOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyBvcGVyYXRvciooY29uc3QgU2NhbGFyJiBzKSBjb25zdAorICAgIHsgcmV0dXJuIEFsaWduZWRWZWN0b3IzKG1fY29lZmZzICogcyk7IH0KKworICAgIGlubGluZSBmcmllbmQgQWxpZ25lZFZlY3RvcjMgb3BlcmF0b3IqKGNvbnN0IFNjYWxhciYgcyxjb25zdCBBbGlnbmVkVmVjdG9yMyYgdmVjKQorICAgIHsgcmV0dXJuIEFsaWduZWRWZWN0b3IzKHMgKiB2ZWMubV9jb2VmZnMpOyB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMmIG9wZXJhdG9yKj0oY29uc3QgU2NhbGFyJiBzKQorICAgIHsgbV9jb2VmZnMgKj0gczsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMgb3BlcmF0b3IvKGNvbnN0IFNjYWxhciYgcykgY29uc3QKKyAgICB7IHJldHVybiBBbGlnbmVkVmVjdG9yMyhtX2NvZWZmcyAvIHMpOyB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMmIG9wZXJhdG9yLz0oY29uc3QgU2NhbGFyJiBzKQorICAgIHsgbV9jb2VmZnMgLz0gczsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyIGRvdChjb25zdCBBbGlnbmVkVmVjdG9yMyYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fY29lZmZzLncoKT09U2NhbGFyKDApKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChvdGhlci5tX2NvZWZmcy53KCk9PVNjYWxhcigwKSk7CisgICAgICByZXR1cm4gbV9jb2VmZnMuZG90KG90aGVyLm1fY29lZmZzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBub3JtYWxpemUoKQorICAgIHsKKyAgICAgIG1fY29lZmZzIC89IG5vcm0oKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMgbm9ybWFsaXplZCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIEFsaWduZWRWZWN0b3IzKG1fY29lZmZzIC8gbm9ybSgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHN1bSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fY29lZmZzLncoKT09U2NhbGFyKDApKTsKKyAgICAgIHJldHVybiBtX2NvZWZmcy5zdW0oKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHNxdWFyZWROb3JtKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9jb2VmZnMudygpPT1TY2FsYXIoMCkpOworICAgICAgcmV0dXJuIG1fY29lZmZzLnNxdWFyZWROb3JtKCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciBub3JtKCkgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgICByZXR1cm4gc3FydChzcXVhcmVkTm9ybSgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMgY3Jvc3MoY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBbGlnbmVkVmVjdG9yMyhtX2NvZWZmcy5jcm9zczMob3RoZXIubV9jb2VmZnMpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGlubGluZSBib29sIGlzQXBwcm94KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyLCBjb25zdCBSZWFsU2NhbGFyJiBlcHM9TnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvZWZmcy50ZW1wbGF0ZSBoZWFkPDM+KCkuaXNBcHByb3gob3RoZXIsZXBzKTsKKyAgICB9CisgICAgCisgICAgQ29lZmZUeXBlJiBjb2VmZnMoKSB7IHJldHVybiBtX2NvZWZmczsgfQorICAgIGNvbnN0IENvZWZmVHlwZSYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitzdHJ1Y3QgZXZhbDxBbGlnbmVkVmVjdG9yMzxfU2NhbGFyPiwgRGVuc2U+Cit7CisgdHlwZWRlZiBjb25zdCBBbGlnbmVkVmVjdG9yMzxfU2NhbGFyPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBldmFsdWF0b3I8QWxpZ25lZFZlY3RvcjM8U2NhbGFyPiA+CisgIDogZXZhbHVhdG9yPE1hdHJpeDxTY2FsYXIsNCwxPiA+Cit7CisgIHR5cGVkZWYgQWxpZ25lZFZlY3RvcjM8U2NhbGFyPiBYcHJUeXBlOworICB0eXBlZGVmIGV2YWx1YXRvcjxNYXRyaXg8U2NhbGFyLDQsMT4gPiBCYXNlOworICAKKyAgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUgJm0pIDogQmFzZShtLmNvZWZmcygpKSB7fSAgCit9OworCit9CisKKy8vQH0KKworfQorCisjZW5kaWYgLy8gRUlHRU5fQUxJR05FRF9WRUNUT1IzCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9BcnBhY2tTdXBwb3J0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vQXJwYWNrU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2EyNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQXJwYWNrU3VwcG9ydApAQCAtMCwwICsxLDMxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVJQQUNLU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9BUlBBQ0tTVVBQT1JUX01PRFVMRV9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaD4KKworLyoqIFxkZWZncm91cCBBcnBhY2tTdXBwb3J0X01vZHVsZSBBcnBhY2sgc3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd3JhcHBlciB0byBBcnBhY2ssIGEgbGlicmFyeSBmb3Igc3BhcnNlIGVpZ2VudmFsdWUgZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0FycGFja1N1cHBvcnQ+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNob2xlc2t5PgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9BcnBhY2tTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaD4KKworI2VuZGlmIC8vIEVJR0VOX0FSUEFDS1NVUFBPUlRfTU9EVUxFX0gKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9BdXRvRGlmZiBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0F1dG9EaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjViN2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9BdXRvRGlmZgpAQCAtMCwwICsxLDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FVVE9ESUZGX01PRFVMRQorI2RlZmluZSBFSUdFTl9BVVRPRElGRl9NT0RVTEUKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqCisgICogXGRlZmdyb3VwIEF1dG9EaWZmX01vZHVsZSBBdXRvIERpZmYgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBmZWF0dXJlcyBmb3J3YXJkIGF1dG9tYXRpYyBkaWZmZXJlbnRhdGlvbiB2aWEgYSBzaW1wbGUKKyAgKiB0ZW1wbGF0ZWQgc2NhbGFyIHR5cGUgd3JhcHBlciBBdXRvRGlmZlNjYWxhci4KKyAgKgorICAqIFdhcm5pbmcgOiB0aGlzIHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLCB3aGljaAorICAqIGlzIGEgZGlmZmVyZW50IG1ldGhvZCBhbmQgaGFzIGl0cyBvd24gbW9kdWxlIGluIEVpZ2VuIDogXHJlZiBOdW1lcmljYWxEaWZmX01vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0F1dG9EaWZmPgorICAqIFxlbmRjb2RlCisgICovCisvL0B7CisKK30KKworI2luY2x1ZGUgInNyYy9BdXRvRGlmZi9BdXRvRGlmZlNjYWxhci5oIgorLy8gI2luY2x1ZGUgInNyYy9BdXRvRGlmZi9BdXRvRGlmZlZlY3Rvci5oIgorI2luY2x1ZGUgInNyYy9BdXRvRGlmZi9BdXRvRGlmZkphY29iaWFuLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7CisvL0B9Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9BVVRPRElGRl9NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0JWSCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0JWSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYxYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQlZICkBAIC0wLDAgKzEsOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IElseWEgQmFyYW4gPGliYXJhbkBtaXQuZWR1PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CVkhfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fQlZIX01PRFVMRV9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8cXVldWU+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorICAqIFxkZWZncm91cCBCVkhfTW9kdWxlIEJWSCBtb2R1bGUKKyAgKiBcYnJpZWYgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBib3VuZGluZyB2b2x1bWUgaGllcmFyY2h5IGFsZ29yaXRobXMKKyAgKiBhbmQgcmVmZXJlbmNlIHRyZWUgaW1wbGVtZW50YXRpb25zLgorICAqCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9CVkg+CisgICogXGVuZGNvZGUKKyAgKgorICAqIEEgYm91bmRpbmcgdm9sdW1lIGhpZXJhcmNoeSAoQlZIKSBjYW4gYWNjZWxlcmF0ZSBtYW55IGdlb21ldHJpYyBxdWVyaWVzLiAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uCisgICogb2YgdGhlIHR3byBiYXNpYyBhbGdvcml0aG1zIG92ZXIgYSBCVkg6IGludGVyc2VjdGlvbiBvZiBhIHF1ZXJ5IG9iamVjdCBhZ2FpbnN0IGFsbCBvYmplY3RzIGluIHRoZSBoaWVyYXJjaHkgYW5kIG1pbmltaXphdGlvbgorICAqIG9mIGEgZnVuY3Rpb24gb3ZlciB0aGUgb2JqZWN0cyBpbiB0aGUgaGllcmFyY2h5LiAgSXQgYWxzbyBwcm92aWRlcyBpbnRlcnNlY3Rpb24gYW5kIG1pbmltaXphdGlvbiBvdmVyIGEgY2FydGVzaWFuIHByb2R1Y3Qgb2YKKyAgKiB0d28gQlZIJ3MuICBBIEJWSCBhY2NlbGVyYXRlcyBpbnRlcnNlY3Rpb24gYnkgdXNpbmcgdGhlIGZhY3QgdGhhdCBpZiBhIHF1ZXJ5IG9iamVjdCBkb2VzIG5vdCBpbnRlcnNlY3QgYSB2b2x1bWUsIHRoZW4gaXQgY2Fubm90CisgICogaW50ZXJzZWN0IGFueSBvYmplY3QgY29udGFpbmVkIGluIHRoYXQgdm9sdW1lLiAgU2ltaWxhcmx5LCBhIEJWSCBhY2NlbGVyYXRlcyBtaW5pbWl6YXRpb24gYmVjYXVzZSB0aGUgbWluaW11bSBvZiBhIGZ1bmN0aW9uCisgICogb3ZlciBhIHZvbHVtZSBpcyBubyBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gb2YgYSBmdW5jdGlvbiBvdmVyIGFueSBvYmplY3QgY29udGFpbmVkIGluIGl0LgorICAqCisgICogU29tZSBzYW1wbGUgcXVlcmllcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluIHRlcm1zIG9mIGludGVyc2VjdGlvbiBhcmU6CisgICogICAtIERldGVybWluZSBhbGwgcG9pbnRzIHdoZXJlIGEgcmF5IGludGVyc2VjdHMgYSB0cmlhbmdsZSBtZXNoCisgICogICAtIEdpdmVuIGEgc2V0IG9mIHBvaW50cywgZGV0ZXJtaW5lIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYSBxdWVyeSBzcGhlcmUKKyAgKiAgIC0gR2l2ZW4gYSBzZXQgb2Ygc3BoZXJlcywgZGV0ZXJtaW5lIHdoaWNoIGNvbnRhaW4gdGhlIHF1ZXJ5IHBvaW50CisgICogICAtIEdpdmVuIGEgc2V0IG9mIGRpc2tzLCBkZXRlcm1pbmUgaWYgYW55IGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIGEgcXVlcnkgcmVjdGFuZ2xlIChyZXByZXNlbnQgZWFjaCAyRCBkaXNrIGFzIGEgcG9pbnQgXGYkKHgseSxyKVxmJAorICAqICAgICBpbiAzRCBhbmQgcmVwcmVzZW50IHRoZSByZWN0YW5nbGUgYXMgYSBweXJhbWlkIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgYW5kIHNocmlua2luZyBpbiB0aGUgXGYkclxmJCBkaXJlY3Rpb24pCisgICogICAtIEdpdmVuIGEgc2V0IG9mIHBvaW50cywgY291bnQgaG93IG1hbnkgcGFpcnMgYXJlIFxmJGRccG1cZXBzaWxvblxmJCBhcGFydCAoZG9uZSBieSBsb29raW5nIGF0IHRoZSBjYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aGUgc2V0CisgICogICAgIG9mIHBvaW50cyB3aXRoIGl0c2VsZikKKyAgKgorICAqIFNvbWUgc2FtcGxlIHF1ZXJpZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiB0ZXJtcyBvZiBmdW5jdGlvbiBtaW5pbWl6YXRpb24gb3ZlciBhIHNldCBvZiBvYmplY3RzIGFyZToKKyAgKiAgIC0gRmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gYSByYXkgYW5kIGEgdHJpYW5nbGUgbWVzaCBjbG9zZXN0IHRvIHRoZSByYXkgb3JpZ2luIChmdW5jdGlvbiBpcyBpbmZpbml0ZSBvZmYgdGhlIHJheSkKKyAgKiAgIC0gR2l2ZW4gYSBwb2x5bGluZSBhbmQgYSBxdWVyeSBwb2ludCwgZGV0ZXJtaW5lIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBwb2x5bGluZSB0byB0aGUgcXVlcnkKKyAgKiAgIC0gRmluZCB0aGUgZGlhbWV0ZXIgb2YgYSBwb2ludCBjbG91ZCAoZG9uZSBieSBsb29raW5nIGF0IHRoZSBjYXJ0ZXNpYW4gcHJvZHVjdCBhbmQgdXNpbmcgbmVnYXRpdmUgZGlzdGFuY2UgYXMgdGhlIGZ1bmN0aW9uKQorICAqICAgLSBEZXRlcm1pbmUgaG93IGZhciB0d28gbWVzaGVzIGFyZSBmcm9tIGNvbGxpZGluZyAodGhpcyBpcyBhbHNvIGEgY2FydGVzaWFuIHByb2R1Y3QgcXVlcnkpCisgICoKKyAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRlY291cGxlcyB0aGUgYmFzaWMgYWxnb3JpdGhtcyBib3RoIGZyb20gdGhlIHR5cGUgb2YgaGllcmFyY2h5IChhbmQgdGhlIHR5cGVzIG9mIHRoZSBib3VuZGluZyB2b2x1bWVzKSBhbmQKKyAgKiBmcm9tIHRoZSBwYXJ0aWN1bGFycyBvZiB0aGUgcXVlcnkuICBUbyBlbmFibGUgYWJzdHJhY3Rpb24gZnJvbSB0aGUgQlZILCB0aGUgQlZIIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBhIGdlbmVyaWMgbWVjaGFuaXNtCisgICogZm9yIHRyYXZlcnNhbC4gIFRvIGFic3RyYWN0IGZyb20gdGhlIHF1ZXJ5LCB0aGUgcXVlcnkgaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgcmVzdWx0cy4KKyAgKgorICAqIFRvIGJlIHVzZWQgaW4gdGhlIGFsZ29yaXRobXMsIGEgaGllcmFyY2h5IG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgdHJhdmVyc2FsIG1lY2hhbmlzbSAoc2VlIEtkQlZIIGZvciBhIHNhbXBsZSBpbXBsZW1lbnRhdGlvbik6IFxjb2RlCisgICAgICB0eXBlZGVmIFZvbHVtZSAgLy90aGUgdHlwZSBvZiBib3VuZGluZyB2b2x1bWUKKyAgICAgIHR5cGVkZWYgT2JqZWN0ICAvL3RoZSB0eXBlIG9mIG9iamVjdCBpbiB0aGUgaGllcmFyY2h5CisgICAgICB0eXBlZGVmIEluZGV4ICAgLy9hIHJlZmVyZW5jZSB0byBhIG5vZGUgaW4gdGhlIGhpZXJhcmNoeS0tdHlwaWNhbGx5IGFuIGludCBvciBhIHBvaW50ZXIKKyAgICAgIHR5cGVkZWYgVm9sdW1lSXRlcmF0b3IgLy9hbiBpdGVyYXRvciB0eXBlIG92ZXIgbm9kZSBjaGlsZHJlbi0tcmV0dXJucyBJbmRleAorICAgICAgdHlwZWRlZiBPYmplY3RJdGVyYXRvciAvL2FuIGl0ZXJhdG9yIG92ZXIgb2JqZWN0IChsZWFmKSBjaGlsZHJlbi0tcmV0dXJucyBjb25zdCBPYmplY3QgJgorICAgICAgSW5kZXggZ2V0Um9vdEluZGV4KCkgY29uc3QgLy9yZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgaGllcmFyY2h5IHJvb3QKKyAgICAgIGNvbnN0IFZvbHVtZSAmZ2V0Vm9sdW1lKEluZGV4IGluZGV4KSBjb25zdCAvL3JldHVybnMgdGhlIGJvdW5kaW5nIHZvbHVtZSBvZiB0aGUgbm9kZSBhdCBnaXZlbiBpbmRleAorICAgICAgdm9pZCBnZXRDaGlsZHJlbihJbmRleCBpbmRleCwgVm9sdW1lSXRlcmF0b3IgJm91dFZCZWdpbiwgVm9sdW1lSXRlcmF0b3IgJm91dFZFbmQsCisgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0SXRlcmF0b3IgJm91dE9CZWdpbiwgT2JqZWN0SXRlcmF0b3IgJm91dE9FbmQpIGNvbnN0CisgICAgICAvL2dldENoaWxkcmVuIHRha2VzIGEgbm9kZSBpbmRleCBhbmQgbWFrZXMgW291dFZCZWdpbiwgb3V0VkVuZCkgcmFuZ2Ugb3ZlciBpdHMgbm9kZSBjaGlsZHJlbgorICAgICAgLy9hbmQgW291dE9CZWdpbiwgb3V0T0VuZCkgcmFuZ2Ugb3ZlciBpdHMgb2JqZWN0IGNoaWxkcmVuCisgICAgXGVuZGNvZGUKKyAgKgorICAqIFRvIHVzZSB0aGUgaGllcmFyY2h5LCBjYWxsIEJWSW50ZXJzZWN0IG9yIEJWTWluaW1pemUsIHBhc3NpbmcgaXQgYSBCVkggKG9yIHR3bywgZm9yIGNhcnRlc2lhbiBwcm9kdWN0KSBhbmQgYSBtaW5pbWl6ZXIgb3IgaW50ZXJzZWN0b3IuCisgICogRm9yIGFuIGludGVyc2VjdGlvbiBxdWVyeSBvbiBhIHNpbmdsZSBCVkgsIHRoZSBpbnRlcnNlY3RvciBlbmNhcHN1bGF0ZXMgdGhlIHF1ZXJ5IGFuZCBtdXN0IHByb3ZpZGUgdHdvIGZ1bmN0aW9uczoKKyAgKiBcY29kZQorICAgICAgYm9vbCBpbnRlcnNlY3RWb2x1bWUoY29uc3QgVm9sdW1lICZ2b2x1bWUpIC8vcmV0dXJucyB0cnVlIGlmIHRoZSBxdWVyeSBpbnRlcnNlY3RzIHRoZSB2b2x1bWUKKyAgICAgIGJvb2wgaW50ZXJzZWN0T2JqZWN0KGNvbnN0IE9iamVjdCAmb2JqZWN0KSAvL3JldHVybnMgdHJ1ZSBpZiB0aGUgaW50ZXJzZWN0aW9uIHNlYXJjaCBzaG91bGQgdGVybWluYXRlIGltbWVkaWF0ZWx5CisgICAgXGVuZGNvZGUKKyAgKiBUaGUgZ3VhcmFudGVlIHRoYXQgQlZJbnRlcnNlY3QgcHJvdmlkZXMgaXMgdGhhdCBpbnRlcnNlY3RPYmplY3Qgd2lsbCBiZSBjYWxsZWQgb24gZXZlcnkgb2JqZWN0IHdob3NlIGJvdW5kaW5nIHZvbHVtZQorICAqIGludGVyc2VjdHMgdGhlIHF1ZXJ5IChidXQgcG9zc2libHkgb24gb3RoZXIgb2JqZWN0cyB0b28pIHVubGVzcyB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQgcHJlbWF0dXJlbHkuICBJdCBpcyB0aGUKKyAgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW50ZXJzZWN0T2JqZWN0IGZ1bmN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJlc3VsdHMgaW4gd2hhdGV2ZXIgbWFubmVyIGlzIGFwcHJvcHJpYXRlLgorICAqIFRoZSBjYXJ0ZXNpYW4gcHJvZHVjdCBpbnRlcnNlY3Rpb24gYW5kIHRoZSBCVk1pbmltaXplIHF1ZXJpZXMgYXJlIHNpbWlsYXItLXNlZSB0aGVpciBpbmRpdmlkdWFsIGRvY3VtZW50YXRpb24uCisgICoKKyAgKiBUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGJ1dCBjb21wbGV0ZSBleGFtcGxlIGZvciBob3cgdG8gdXNlIHRoZSBCVkggdG8gYWNjZWxlcmF0ZSB0aGUgc2VhcmNoIGZvciBhIGNsb3Nlc3QgcmVkLWJsdWUgcG9pbnQgcGFpcjoKKyAgKiBcaW5jbHVkZSBCVkhfRXhhbXBsZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBCVkhfRXhhbXBsZS5vdXQKKyAgKi8KK30KKworLy9AeworCisjaW5jbHVkZSAic3JjL0JWSC9CVkFsZ29yaXRobXMuaCIKKyNpbmNsdWRlICJzcmMvQlZIL0tkQlZILmgiCisKKy8vQH0KKworI2VuZGlmIC8vIEVJR0VOX0JWSF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9FaWdlbi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzFhMDYwCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMiBAQAorc2V0KEVpZ2VuX0hFQURFUlMgCisgIEFkb2xjRm9yd2FyZAorICBBbGlnbmVkVmVjdG9yMworICBBcnBhY2tTdXBwb3J0CisgIEF1dG9EaWZmCisgIEJWSAorICBFdWxlckFuZ2xlcworICBGRlQKKyAgSXRlcmF0aXZlU29sdmVycyAKKyAgS3JvbmVja2VyUHJvZHVjdAorICBMZXZlbmJlcmdNYXJxdWFyZHQKKyAgTWF0cml4RnVuY3Rpb25zIAorICBNb3JlVmVjdG9yaXphdGlvbgorICBNUFJlYWxTdXBwb3J0CisgIE5vbkxpbmVhck9wdGltaXphdGlvbgorICBOdW1lcmljYWxEaWZmCisgIE9wZW5HTFN1cHBvcnQKKyAgUG9seW5vbWlhbHMKKyAgU2t5bGluZSAKKyAgU3BhcnNlRXh0cmEKKyAgU3BlY2lhbEZ1bmN0aW9ucworICBTcGxpbmVzCisgICkKKworaW5zdGFsbChGSUxFUworICAke0VpZ2VuX0hFQURFUlN9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4gQ09NUE9ORU5UIERldmVsCisgICkKKworaW5zdGFsbChESVJFQ1RPUlkgc3JjIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4gQ09NUE9ORU5UIERldmVsIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2FkZF9zdWJkaXJlY3RvcnkoQ1hYMTEpCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWVkMjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDggQEAKK3NldChFaWdlbl9DWFgxMV9IRUFERVJTIFRlbnNvciBUZW5zb3JTeW1tZXRyeSBUaHJlYWRQb29sKQorCitpbnN0YWxsKEZJTEVTCisgICR7RWlnZW5fQ1hYMTFfSEVBREVSU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMSBDT01QT05FTlQgRGV2ZWwKKyAgKQorCitpbnN0YWxsKERJUkVDVE9SWSBzcmMgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMSBDT01QT05FTlQgRGV2ZWwgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvciBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNiNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yCkBAIC0wLDAgKzEsMTUyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8jaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9NT0RVTEUKKy8vI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfTU9EVUxFCisKKyNpbmNsdWRlICIuLi8uLi8uLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wKKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKyN1bmRlZiBpc25hbgorI3VuZGVmIGlzaW5mCisjdW5kZWYgaXNmaW5pdGUKKyNpbmNsdWRlIDxTWUNML3N5Y2wuaHBwPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNlbmRpZgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaD4KKworI2luY2x1ZGUgIi4uL1NwZWNpYWxGdW5jdGlvbnMiCisjaW5jbHVkZSAic3JjL3V0aWwvQ1hYMTFNZXRhLmgiCisjaW5jbHVkZSAic3JjL3V0aWwvTWF4U2l6ZVZlY3Rvci5oIgorCisvKiogXGRlZmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUgVGVuc29yIE1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBUZW5zb3IgY2xhc3MgZm9yIHN0b3JpbmcgYXJiaXRyYXJpbHkgaW5kZXhlZAorICAqIG9iamVjdHMuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2lmZGVmIF9XSU4zMgordHlwZWRlZiBfX2ludDE2IGludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgdWludDE2X3Q7Cit0eXBlZGVmIF9faW50MzIgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPiAxOTk3MTEgfHwgRUlHRU5fQ09NUF9NU1ZDID49IDE5MDAKKyNpbmNsdWRlIDxyYW5kb20+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjZWxzZQorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVVNFX1RIUkVBRFMKKyNpbmNsdWRlICJUaHJlYWRQb29sIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9VU0VfR1BVCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3VkYV9ydW50aW1lLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvck1hY3Jvcy5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRm9yd2FyZERlY2xhcmF0aW9ucy5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yTWV0YS5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRnVuY3RvcnMuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckNvc3RNb2RlbC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRGV2aWNlRGVmYXVsdC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRGV2aWNlVGhyZWFkUG9vbC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRGV2aWNlQ3VkYS5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRGV2aWNlU3ljbC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29ySW5kZXhMaXN0LmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JEaW1lbnNpb25MaXN0LmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JEaW1lbnNpb25zLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JJbml0aWFsaXplci5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yVHJhaXRzLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JSYW5kb20uaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclVJbnQxMjguaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckludERpdi5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yR2xvYmFsRnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckJhc2UuaCIKKworI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRXZhbHVhdG9yLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JFeHByLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JSZWR1Y3Rpb24uaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclJlZHVjdGlvbkN1ZGEuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckFyZ01heC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yQ29uY2F0ZW5hdGlvbi5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25NYXBwZXIuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uQmxvY2tpbmcuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvblRocmVhZFBvb2wuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uQ3VkYS5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yQ29udm9sdXRpb24uaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckZGVC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yUGF0Y2guaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckltYWdlUGF0Y2guaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclZvbHVtZVBhdGNoLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JCcm9hZGNhc3RpbmcuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckNoaXBwaW5nLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JJbmZsYXRpb24uaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckxheW91dFN3YXAuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvck1vcnBoaW5nLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JQYWRkaW5nLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JSZXZlcnNlLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JTaHVmZmxpbmcuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclN0cmlkaW5nLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JDdXN0b21PcC5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRXZhbFRvLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JGb3JjZWRFdmFsLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JHZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvckFzc2lnbi5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yU2Nhbi5oIgorCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JTeWNsLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JFeGVjdXRvci5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRGV2aWNlLmgiCisKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclN0b3JhZ2UuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvci5oIgorI2luY2x1ZGUgInNyYy9UZW5zb3IvVGVuc29yRml4ZWRTaXplLmgiCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JNYXAuaCIKKyNpbmNsdWRlICJzcmMvVGVuc29yL1RlbnNvclJlZi5oIgorCisjaW5jbHVkZSAic3JjL1RlbnNvci9UZW5zb3JJTy5oIgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmg+CisKKy8vI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvclN5bW1ldHJ5IGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yU3ltbWV0cnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxYjBjMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvclN5bW1ldHJ5CkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBTZWlsZXIgPGNocmlzdGlhbkBpd2FrZC5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfTU9EVUxFCisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUlNZTU1FVFJZX01PRFVMRQorCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaD4KKworI2luY2x1ZGUgInNyYy91dGlsL0NYWDExTWV0YS5oIgorCisvKiogXGRlZmdyb3VwIENYWDExX1RlbnNvclN5bW1ldHJ5X01vZHVsZSBUZW5zb3IgU3ltbWV0cnkgTW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNsYXNzZXMgdGhhdCBhbGxvdyBmb3IgdGhlIGRlZmluaXRpb24gb2YKKyAgKiBzeW1tZXRyaWVzIHcuci50LiB0ZW5zb3IgaW5kaWNlcy4KKyAgKgorICAqIEluY2x1ZGluZyB0aGlzIG1vZHVsZSB3aWxsIGltcGxpY2l0bHkgaW5jbHVkZSB0aGUgVGVuc29yIG1vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1RlbnNvclN5bW1ldHJ5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvVGVuc29yU3ltbWV0cnkvdXRpbC9UZW1wbGF0ZUdyb3VwVGhlb3J5LmgiCisjaW5jbHVkZSAic3JjL1RlbnNvclN5bW1ldHJ5L1N5bW1ldHJ5LmgiCisjaW5jbHVkZSAic3JjL1RlbnNvclN5bW1ldHJ5L1N0YXRpY1N5bW1ldHJ5LmgiCisjaW5jbHVkZSAic3JjL1RlbnNvclN5bW1ldHJ5L0R5bmFtaWNTeW1tZXRyeS5oIgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmg+CisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JTWU1NRVRSWV9NT0RVTEUKKworLyoKKyAqIGthdGU6IHNwYWNlLWluZGVudCBvbjsgaW5kZW50LXdpZHRoIDI7IG1peGVkaW5kZW50IG9mZjsgaW5kZW50LW1vZGUgY3N0eWxlOworICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UaHJlYWRQb29sIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGhyZWFkUG9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ2MzdlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGhyZWFkUG9vbApAQCAtMCwwICsxLDY1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfTU9EVUxFCisjZGVmaW5lIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfTU9EVUxFCisKKyNpbmNsdWRlICIuLi8uLi8uLi9FaWdlbi9Db3JlIgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaD4KKworLyoqIFxkZWZncm91cCBDWFgxMV9UaHJlYWRQb29sX01vZHVsZSBDKysxMSBUaHJlYWRQb29sIE1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgMiB0aHJlYWRwb29sIGltcGxlbWVudGF0aW9ucworICAqICAtIGEgc2ltcGxlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorICAqICAtIGEgZmFzdGVyIG5vbiBibG9ja2luZyBpbXBsZW1lbnRhdGlvbgorICAqCisgICogVGhpcyBtb2R1bGUgcmVxdWlyZXMgQysrMTEuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UaHJlYWRQb29sPgorICAqIFxlbmRjb2RlCisgICovCisKKworLy8gVGhlIGNvZGUgZGVwZW5kcyBvbiBDWFgxMSwgc28gb25seSBpbmNsdWRlIHRoZSBtb2R1bGUgaWYgdGhlCisvLyBjb21waWxlciBzdXBwb3J0cyBpdC4KKyNpZiBfX2NwbHVzcGx1cyA+IDE5OTcxMUwgfHwgRUlHRU5fQ09NUF9NU1ZDID49IDE5MDAKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAic3JjL3V0aWwvQ1hYMTFNZXRhLmgiCisjaW5jbHVkZSAic3JjL3V0aWwvTWF4U2l6ZVZlY3Rvci5oIgorCisjaW5jbHVkZSAic3JjL1RocmVhZFBvb2wvVGhyZWFkTG9jYWwuaCIKKyNpbmNsdWRlICJzcmMvVGhyZWFkUG9vbC9UaHJlYWRZaWVsZC5oIgorI2luY2x1ZGUgInNyYy9UaHJlYWRQb29sL0V2ZW50Q291bnQuaCIKKyNpbmNsdWRlICJzcmMvVGhyZWFkUG9vbC9SdW5RdWV1ZS5oIgorI2luY2x1ZGUgInNyYy9UaHJlYWRQb29sL1RocmVhZFBvb2xJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzcmMvVGhyZWFkUG9vbC9UaHJlYWRFbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgInNyYy9UaHJlYWRQb29sL1NpbXBsZVRocmVhZFBvb2wuaCIKKyNpbmNsdWRlICJzcmMvVGhyZWFkUG9vbC9Ob25CbG9ja2luZ1RocmVhZFBvb2wuaCIKKworI2VuZGlmCisKKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaD4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfTU9EVUxFCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvUkVBRE1FLm1kIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlODM4MQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTc1NyBAQAorIyBFaWdlbiBUZW5zb3JzCisKK1RlbnNvcnMgYXJlIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzIG9mIGVsZW1lbnRzLiBFbGVtZW50cyBhcmUgdHlwaWNhbGx5IHNjYWxhcnMsCitidXQgbW9yZSBjb21wbGV4IHR5cGVzIHN1Y2ggYXMgc3RyaW5ncyBhcmUgYWxzbyBzdXBwb3J0ZWQuCisKK1tUT0NdCisKKyMjIFRlbnNvciBDbGFzc2VzCisKK1lvdSBjYW4gbWFuaXB1bGF0ZSBhIHRlbnNvciB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXMuICBUaGV5IGFsbCBhcmUgaW4KK3RoZSBuYW1lc3BhY2UgYGBgOjpFaWdlbi5gYGAKKworCisjIyMgQ2xhc3MgVGVuc29yPGRhdGFfdHlwZSwgcmFuaz4KKworVGhpcyBpcyB0aGUgY2xhc3MgdG8gdXNlIHRvIGNyZWF0ZSBhIHRlbnNvciBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciBpdC4gIFRoZQorY2xhc3MgaXMgdGVtcGxhdGl6ZWQgd2l0aCB0aGUgdGVuc29yIGRhdGF0eXBlLCBzdWNoIGFzIGZsb2F0IG9yIGludCwgYW5kIHRoZQordGVuc29yIHJhbmsuICBUaGUgcmFuayBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMsIGZvciBleGFtcGxlIHJhbmsgMiBpcyBhCittYXRyaXguCisKK1RlbnNvcnMgb2YgdGhpcyBjbGFzcyBhcmUgcmVzaXphYmxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhc3NpZ24gYSB0ZW5zb3Igb2YgYQorZGlmZmVyZW50IHNpemUgdG8gYSBUZW5zb3IsIHRoYXQgdGVuc29yIGlzIHJlc2l6ZWQgdG8gbWF0Y2ggaXRzIG5ldyB2YWx1ZS4KKworIyMjIyBDb25zdHJ1Y3RvciBUZW5zb3I8ZGF0YV90eXBlLCByYW5rPihzaXplMCwgc2l6ZTEsIC4uLikKKworQ29uc3RydWN0b3IgZm9yIGEgVGVuc29yLiAgVGhlIGNvbnN0cnVjdG9yIG11c3QgYmUgcGFzc2VkIGBgYHJhbmtgYGAgaW50ZWdlcnMKK2luZGljYXRpbmcgdGhlIHNpemVzIG9mIHRoZSBpbnN0YW5jZSBhbG9uZyBlYWNoIG9mIHRoZSB0aGUgYGBgcmFua2BgYAorZGltZW5zaW9ucy4KKworICAgIC8vIENyZWF0ZSBhIHRlbnNvciBvZiByYW5rIDMgb2Ygc2l6ZXMgMiwgMywgNC4gIFRoaXMgdGVuc29yIG93bnMKKyAgICAvLyBtZW1vcnkgdG8gaG9sZCAyNCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgKDI0ID0gMiB4IDMgeCA0KS4KKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHRfM2QoMiwgMywgNCk7CisKKyAgICAvLyBSZXNpemUgdF8zZCBieSBhc3NpZ25pbmcgYSB0ZW5zb3Igb2YgZGlmZmVyZW50IHNpemVzLCBidXQgc2FtZSByYW5rLgorICAgIHRfM2QgPSBUZW5zb3I8ZmxvYXQsIDM+KDMsIDQsIDMpOworCisjIyMjIENvbnN0cnVjdG9yIFRlbnNvcjxkYXRhX3R5cGUsIHJhbms+KHNpemVfYXJyYXkpCisKK0NvbnN0cnVjdG9yIHdoZXJlIHRoZSBzaXplcyBmb3IgdGhlIGNvbnN0cnVjdG9yIGFyZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2YKK3ZhbHVlcyBpbnN0ZWFkIG9mIGFuIGV4cGxpY2l0bHkgbGlzdCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGFycmF5IHR5cGUgdG8gdXNlIGlzCitgYGBFaWdlbjo6YXJyYXk8RWlnZW46OkluZGV4PmBgYC4gIFRoZSBhcnJheSBjYW4gYmUgY29uc3RydWN0ZWQgYXV0b21hdGljYWxseQorZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorCisgICAgLy8gQ3JlYXRlIGEgdGVuc29yIG9mIHN0cmluZ3Mgb2YgcmFuayAyIHdpdGggc2l6ZXMgNSwgNy4KKyAgICBUZW5zb3I8c3RyaW5nLCAyPiB0XzJkKHs1LCA3fSk7CisKKworIyMjIENsYXNzIFRlbnNvckZpeGVkU2l6ZTxkYXRhX3R5cGUsIFNpemVzPHNpemUwLCBzaXplMSwgLi4uPj4KKworQ2xhc3MgdG8gdXNlIGZvciB0ZW5zb3JzIG9mIGZpeGVkIHNpemUsIHdoZXJlIHRoZSBzaXplIGlzIGtub3duIGF0IGNvbXBpbGUKK3RpbWUuICBGaXhlZCBzaXplZCB0ZW5zb3JzIGNhbiBwcm92aWRlIHZlcnkgZmFzdCBjb21wdXRhdGlvbnMgYmVjYXVzZSBhbGwgdGhlaXIKK2RpbWVuc2lvbnMgYXJlIGtub3duIGJ5IHRoZSBjb21waWxlci4gIEZpeGVkU2l6ZSB0ZW5zb3JzIGFyZSBub3QgcmVzaXphYmxlLgorCitJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgZml4ZWQgc2l6ZSB0ZW5zb3IgaXMgc21hbGwgZW5vdWdoIHRoZQordGVuc29yIGRhdGEgaXMgaGVsZCBvbnRvIHRoZSBzdGFjayBhbmQgZG9lcyBub3QgY2F1c2UgaGVhcCBhbGxvY2F0aW9uIGFuZCBmcmVlLgorCisgICAgLy8gQ3JlYXRlIGEgNCB4IDMgdGVuc29yIG9mIGZsb2F0cy4KKyAgICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDQsIDM+PiB0XzR4MzsKKworIyMjIENsYXNzIFRlbnNvck1hcDxUZW5zb3I8ZGF0YV90eXBlLCByYW5rPj4KKworVGhpcyBpcyB0aGUgY2xhc3MgdG8gdXNlIHRvIGNyZWF0ZSBhIHRlbnNvciBvbiB0b3Agb2YgbWVtb3J5IGFsbG9jYXRlZCBhbmQKK293bmVkIGJ5IGFub3RoZXIgcGFydCBvZiB5b3VyIGNvZGUuICBJdCBhbGxvd3MgdG8gdmlldyBhbnkgcGllY2Ugb2YgYWxsb2NhdGVkCittZW1vcnkgYXMgYSBUZW5zb3IuICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkbyBub3Qgb3duIHRoZSBtZW1vcnkgd2hlcmUgdGhlCitkYXRhIGFyZSBzdG9yZWQuCisKK0EgVGVuc29yTWFwIGlzIG5vdCByZXNpemFibGUgYmVjYXVzZSBpdCBkb2VzIG5vdCBvd24gdGhlIG1lbW9yeSB3aGVyZSBpdHMgZGF0YQorYXJlIHN0b3JlZC4KKworIyMjIyBDb25zdHJ1Y3RvciBUZW5zb3JNYXA8VGVuc29yPGRhdGFfdHlwZSwgcmFuaz4+KGRhdGEsIHNpemUwLCBzaXplMSwgLi4uKQorCitDb25zdHJ1Y3RvciBmb3IgYSBUZW5zb3IuICBUaGUgY29uc3RydWN0b3IgbXVzdCBiZSBwYXNzZWQgYSBwb2ludGVyIHRvIHRoZQorc3RvcmFnZSBmb3IgdGhlIGRhdGEsIGFuZCAicmFuayIgc2l6ZSBhdHRyaWJ1dGVzLiAgVGhlIHN0b3JhZ2UgaGFzIHRvIGJlCitsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlIGRhdGEuCisKKyAgICAvLyBNYXAgYSB0ZW5zb3Igb2YgaW50cyBvbiB0b3Agb2Ygc3RhY2stYWxsb2NhdGVkIHN0b3JhZ2UuCisgICAgaW50IHN0b3JhZ2VbMTI4XTsgIC8vIDIgeCA0IHggMiB4IDggPSAxMjgKKyAgICBUZW5zb3JNYXA8VGVuc29yPGludCwgND4+IHRfNGQoc3RvcmFnZSwgMiwgNCwgMiwgOCk7CisKKyAgICAvLyBUaGUgc2FtZSBzdG9yYWdlIGNhbiBiZSB2aWV3ZWQgYXMgYSBkaWZmZXJlbnQgdGVuc29yLgorICAgIC8vIFlvdSBjYW4gYWxzbyBwYXNzIHRoZSBzaXplcyBhcyBhbiBhcnJheS4KKyAgICBUZW5zb3JNYXA8VGVuc29yPGludCwgMj4+IHRfMmQoc3RvcmFnZSwgMTYsIDgpOworCisgICAgLy8gWW91IGNhbiBhbHNvIG1hcCBmaXhlZC1zaXplIHRlbnNvcnMuICBIZXJlIHdlIGdldCBhIDFkIHZpZXcgb2YKKyAgICAvLyB0aGUgMmQgZml4ZWQtc2l6ZSB0ZW5zb3IuCisgICAgVGVuc29yPGZsb2F0LCBTaXplczw0LCA1Pj4gdF80eDM7CisgICAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMT4+IHRfMTIodF80eDMsIDEyKTsKKworCisjIyMjIENsYXNzIFRlbnNvclJlZgorCitTZWUgQXNzaWduaW5nIHRvIGEgVGVuc29yUmVmIGJlbG93LgorCisjIyBBY2Nlc3NpbmcgVGVuc29yIEVsZW1lbnRzCisKKyMjIyMgPGRhdGFfdHlwZT4gdGVuc29yKGluZGV4MCwgaW5kZXgxLi4uKQorCitSZXR1cm4gdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24gYGBgKGluZGV4MCwgaW5kZXgxLi4uKWBgYCBpbiB0ZW5zb3IKK2BgYHRlbnNvcmBgYC4gIFlvdSBtdXN0IHBhc3MgYXMgbWFueSBwYXJhbWV0ZXJzIGFzIHRoZSByYW5rIG9mIGBgYHRlbnNvcmBgYC4KK1RoZSBleHByZXNzaW9uIGNhbiBiZSB1c2VkIGFzIGFuIGwtdmFsdWUgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUKK3NwZWNpZmllZCBwb3NpdGlvbi4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBvZiB0aGUgZGF0YXR5cGUgb2YgdGhlIHRlbnNvci4KKworICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24gKDAsIDEsIDApOworICAgIFRlbnNvcjxmbG9hdCwgMz4gdF8zZCgyLCAzLCA0KTsKKyAgICB0XzNkKDAsIDEsIDApID0gMTIuMGY7CisKKyAgICAvLyBJbml0aWFsaXplIGFsbCBlbGVtZW50cyB0byByYW5kb20gdmFsdWVzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgeworICAgICAgICAgIHRfM2QoaSwgaiwgaykgPSAuLi5zb21lIHJhbmRvbSB2YWx1ZS4uLjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIFByaW50IGVsZW1lbnRzIG9mIGEgdGVuc29yLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBMT0coSU5GTykgPDwgdF8zZChpLCAwLCAwKTsKKyAgICB9CisKKworIyMgVGVuc29yTGF5b3V0CisKK1RoZSB0ZW5zb3IgbGlicmFyeSBzdXBwb3J0cyAyIGxheW91dHM6IGBgYENvbE1ham9yYGBgICh0aGUgZGVmYXVsdCkgYW5kCitgYGBSb3dNYWpvcmBgYC4gIE9ubHkgdGhlIGRlZmF1bHQgY29sdW1uIG1ham9yIGxheW91dCBpcyBjdXJyZW50bHkgZnVsbHkKK3N1cHBvcnRlZCwgYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QgcmVjb21tZW5kZWQgdG8gYXR0ZW1wdCB0byB1c2UgdGhlIHJvdyBtYWpvcgorbGF5b3V0IGF0IHRoZSBtb21lbnQuCisKK1RoZSBsYXlvdXQgb2YgYSB0ZW5zb3IgaXMgb3B0aW9uYWxseSBzcGVjaWZpZWQgYXMgcGFydCBvZiBpdHMgdHlwZS4gSWYgbm90CitzcGVjaWZpZWQgZXhwbGljaXRseSBjb2x1bW4gbWFqb3IgaXMgYXNzdW1lZC4KKworICAgIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IGNvbF9tYWpvcjsgIC8vIGVxdWl2YWxlbnQgdG8gVGVuc29yPGZsb2F0LCAzPgorICAgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiA+IHJvd19tYWpvcihkYXRhLCAuLi4pOworCitBbGwgdGhlIGFyZ3VtZW50cyB0byBhbiBleHByZXNzaW9uIG11c3QgdXNlIHRoZSBzYW1lIGxheW91dC4gQXR0ZW1wdGluZyB0byBtaXgKK2RpZmZlcmVudCBsYXlvdXRzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsYXRpb24gZXJyb3IuCisKK0l0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgbGF5b3V0IG9mIGEgdGVuc29yIG9yIGFuIGV4cHJlc3Npb24gdXNpbmcgdGhlCitgYGBzd2FwX2xheW91dCgpYGBgIG1ldGhvZC4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYWxzbyByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUKK2RpbWVuc2lvbnMuCisKKyAgICBUZW5zb3I8ZmxvYXQsIDIsIENvbE1ham9yPiBjb2xfbWFqb3IoMiwgNCk7CisgICAgVGVuc29yPGZsb2F0LCAyLCBSb3dNYWpvcj4gcm93X21ham9yKDIsIDQpOworCisgICAgVGVuc29yPGZsb2F0LCAyPiBjb2xfbWFqb3JfcmVzdWx0ID0gY29sX21ham9yOyAgLy8gb2ssIGxheW91dHMgbWF0Y2gKKyAgICBUZW5zb3I8ZmxvYXQsIDI+IGNvbF9tYWpvcl9yZXN1bHQgPSByb3dfbWFqb3I7ICAvLyB3aWxsIG5vdCBjb21waWxlCisKKyAgICAvLyBTaW1wbGUgbGF5b3V0IHN3YXAKKyAgICBjb2xfbWFqb3JfcmVzdWx0ID0gcm93X21ham9yLnN3YXBfbGF5b3V0KCk7CisgICAgZWlnZW5fYXNzZXJ0KGNvbF9tYWpvcl9yZXN1bHQuZGltZW5zaW9uKDApID09IDQpOworICAgIGVpZ2VuX2Fzc2VydChjb2xfbWFqb3JfcmVzdWx0LmRpbWVuc2lvbigxKSA9PSAyKTsKKworICAgIC8vIFN3YXAgdGhlIGxheW91dCBhbmQgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBkaW1lbnNpb25zCisgICAgYXJyYXk8aW50LCAyPiBzaHVmZmxlKDEsIDApOworICAgIGNvbF9tYWpvcl9yZXN1bHQgPSByb3dfbWFqb3Iuc3dhcF9sYXlvdXQoKS5zaHVmZmxlKHNodWZmbGUpOworICAgIGVpZ2VuX2Fzc2VydChjb2xfbWFqb3JfcmVzdWx0LmRpbWVuc2lvbigwKSA9PSAyKTsKKyAgICBlaWdlbl9hc3NlcnQoY29sX21ham9yX3Jlc3VsdC5kaW1lbnNpb24oMSkgPT0gNCk7CisKKworIyMgVGVuc29yIE9wZXJhdGlvbnMKKworVGhlIEVpZ2VuIFRlbnNvciBsaWJyYXJ5IHByb3ZpZGVzIGEgdmFzdCBsaWJyYXJ5IG9mIG9wZXJhdGlvbnMgb24gVGVuc29yczoKK251bWVyaWNhbCBvcGVyYXRpb25zIHN1Y2ggYXMgYWRkaXRpb24gYW5kIG11bHRpcGxpY2F0aW9uLCBnZW9tZXRyeSBvcGVyYXRpb25zCitzdWNoIGFzIHNsaWNpbmcgYW5kIHNodWZmbGluZywgZXRjLiAgVGhlc2Ugb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG1ldGhvZHMKK29mIHRoZSBUZW5zb3IgY2xhc3NlcywgYW5kIGluIHNvbWUgY2FzZXMgYXMgb3BlcmF0b3Igb3ZlcmxvYWRzLiAgRm9yIGV4YW1wbGUKK3RoZSBmb2xsb3dpbmcgY29kZSBjb21wdXRlcyB0aGUgZWxlbWVudHdpc2UgYWRkaXRpb24gb2YgdHdvIHRlbnNvcnM6CisKKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHQxKDIsIDMsIDQpOworICAgIC4uLnNldCBzb21lIHZhbHVlcyBpbiB0MS4uLgorICAgIFRlbnNvcjxmbG9hdCwgMz4gdDIoMiwgMywgNCk7CisgICAgLi4uc2V0IHNvbWUgdmFsdWVzIGluIHQyLi4uCisgICAgLy8gU2V0IHQzIHRvIHRoZSBlbGVtZW50IHdpc2Ugc3VtIG9mIHQxIGFuZCB0MgorICAgIFRlbnNvcjxmbG9hdCwgMz4gdDMgPSB0MSArIHQyOworCitXaGlsZSB0aGUgY29kZSBhYm92ZSBsb29rcyBlYXN5IGVub3VnaCwgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUKK2V4cHJlc3Npb24gYGBgdDEgKyB0MmBgYCBpcyBub3QgYWN0dWFsbHkgYWRkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvcnMuICBUaGUKK2V4cHJlc3Npb24gaW5zdGVhZCBjb25zdHJ1Y3RzIGEgInRlbnNvciBvcGVyYXRvciIgb2JqZWN0IG9mIHRoZSBjbGFzcworVGVuc29yQ3dpc2VCaW5hcnlPcDxzY2FsYXJfc3VtPiwgd2hpY2ggaGFzIHJlZmVyZW5jZXMgdG8gdGhlIHRlbnNvcnMKK2BgYHQxYGBgIGFuZCBgYGB0MmBgYC4gIFRoaXMgaXMgYSBzbWFsbCBDKysgb2JqZWN0IHRoYXQga25vd3MgaG93IHRvIGFkZAorYGBgdDFgYGAgYW5kIGBgYHQyYGBgLiAgSXQgaXMgb25seSB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBhc3NpZ25lZAordG8gdGhlIHRlbnNvciBgYGB0M2BgYCB0aGF0IHRoZSBhZGRpdGlvbiBpcyBhY3R1YWxseSBwZXJmb3JtZWQuICBUZWNobmljYWxseSwKK3RoaXMgaGFwcGVucyB0aHJvdWdoIHRoZSBvdmVybG9hZGluZyBvZiBgYGBvcGVyYXRvcj0oKWBgYCBpbiB0aGUgVGVuc29yIGNsYXNzLgorCitUaGlzIG1lY2hhbmlzbSBmb3IgY29tcHV0aW5nIHRlbnNvciBleHByZXNzaW9ucyBhbGxvd3MgZm9yIGxhenkgZXZhbHVhdGlvbiBhbmQKK29wdGltaXphdGlvbnMgd2hpY2ggYXJlIHdoYXQgbWFrZSB0aGUgdGVuc29yIGxpYnJhcnkgdmVyeSBmYXN0LgorCitPZiBjb3Vyc2UsIHRoZSB0ZW5zb3Igb3BlcmF0b3JzIGRvIG5lc3QsIGFuZCB0aGUgZXhwcmVzc2lvbiBgYGB0MSArIHQyICoKKzAuM2ZgYGAgaXMgYWN0dWFsbHkgcmVwcmVzZW50ZWQgd2l0aCB0aGUgKGFwcHJveGltYXRlKSB0cmVlIG9mIG9wZXJhdG9yczoKKworICAgIFRlbnNvckN3aXNlQmluYXJ5T3A8c2NhbGFyX3N1bT4odDEsIFRlbnNvckN3aXNlVW5hcnlPcDxzY2FsYXJfbXVsPih0MiwgMC4zZikpCisKKworIyMjIFRlbnNvciBPcGVyYXRpb25zIGFuZCBDKysgImF1dG8iCisKK0JlY2F1c2UgVGVuc29yIG9wZXJhdGlvbnMgY3JlYXRlIHRlbnNvciBvcGVyYXRvcnMsIHRoZSBDKysgYGBgYXV0b2BgYCBrZXl3b3JkCitkb2VzIG5vdCBoYXZlIGl0cyBpbnR1aXRpdmUgbWVhbmluZy4gIENvbnNpZGVyIHRoZXNlIDIgbGluZXMgb2YgY29kZToKKworICAgIFRlbnNvcjxmbG9hdCwgMz4gdDMgPSB0MSArIHQyOworICAgIGF1dG8gdDQgPSB0MSArIHQyOworCitJbiB0aGUgZmlyc3QgbGluZSB3ZSBhbGxvY2F0ZSB0aGUgdGVuc29yIGBgYHQzYGBgIGFuZCBpdCB3aWxsIGNvbnRhaW4gdGhlCityZXN1bHQgb2YgdGhlIGFkZGl0aW9uIG9mIGBgYHQxYGBgIGFuZCBgYGB0MmBgYC4gIEluIHRoZSBzZWNvbmQgbGluZSwgYGBgdDRgYGAKK2lzIGFjdHVhbGx5IHRoZSB0cmVlIG9mIHRlbnNvciBvcGVyYXRvcnMgdGhhdCB3aWxsIGNvbXB1dGUgdGhlIGFkZGl0aW9uIG9mCitgYGB0MWBgYCBhbmQgYGBgdDJgYGAuICBJbiBmYWN0LCBgYGB0NGBgYCBpcyAqbm90KiBhIHRlbnNvciBhbmQgeW91IGNhbm5vdCBnZXQKK3RoZSB2YWx1ZXMgb2YgaXRzIGVsZW1lbnRzOgorCisgICAgVGVuc29yPGZsb2F0LCAzPiB0MyA9IHQxICsgdDI7CisgICAgY291dCA8PCB0MygwLCAwLCAwKTsgIC8vIE9LIHByaW50cyB0aGUgdmFsdWUgb2YgdDEoMCwgMCwgMCkgKyB0MigwLCAwLCAwKQorCisgICAgYXV0byB0NCA9IHQxICsgdDI7CisgICAgY291dCA8PCB0NCgwLCAwLCAwKTsgIC8vIENvbXBpbGF0aW9uIGVycm9yIQorCitXaGVuIHlvdSB1c2UgYGBgYXV0b2BgYCB5b3UgZG8gbm90IGdldCBhIFRlbnNvciBhcyBhIHJlc3VsdCBidXQgaW5zdGVhZCBhCitub24tZXZhbHVhdGVkIGV4cHJlc3Npb24uICBTbyBvbmx5IHVzZSBgYGBhdXRvYGBgIHRvIGRlbGF5IGV2YWx1YXRpb24uCisKK1VuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHNpbmdsZSB1bmRlcmx5aW5nIGNvbmNyZXRlIHR5cGUgZm9yIGhvbGRpbmcKK25vbi1ldmFsdWF0ZWQgZXhwcmVzc2lvbnMsIGhlbmNlIHlvdSBoYXZlIHRvIHVzZSBhdXRvIGluIHRoZSBjYXNlIHdoZW4geW91IGRvCit3YW50IHRvIGhvbGQgbm9uLWV2YWx1YXRlZCBleHByZXNzaW9ucy4KKworV2hlbiB5b3UgbmVlZCB0aGUgcmVzdWx0cyBvZiBzZXQgb2YgdGVuc29yIGNvbXB1dGF0aW9ucyB5b3UgaGF2ZSB0byBhc3NpZ24gdGhlCityZXN1bHQgdG8gYSBUZW5zb3IgdGhhdCB3aWxsIGJlIGNhcGFibGUgb2YgaG9sZGluZyBvbnRvIHRoZW0uICBUaGlzIGNhbiBiZQorZWl0aGVyIGEgbm9ybWFsIFRlbnNvciwgYSBmaXhlZCBzaXplIFRlbnNvciwgb3IgYSBUZW5zb3JNYXAgb24gYW4gZXhpc3RpbmcKK3BpZWNlIG9mIG1lbW9yeS4gIEFsbCB0aGUgZm9sbG93aW5nIHdpbGwgd29yazoKKworICAgIGF1dG8gdDQgPSB0MSArIHQyOworCisgICAgVGVuc29yPGZsb2F0LCAzPiByZXN1bHQgPSB0NDsgIC8vIENvdWxkIGFsc28gYmU6IHJlc3VsdCh0NCk7CisgICAgY291dCA8PCByZXN1bHQoMCwgMCwgMCk7CisKKyAgICBUZW5zb3JNYXA8ZmxvYXQsIDQ+IHJlc3VsdCg8YSBmbG9hdCogd2l0aCBlbm91Z2ggc3BhY2U+LCA8c2l6ZTA+LCAuLi4pID0gdDQ7CisgICAgY291dCA8PCByZXN1bHQoMCwgMCwgMCk7CisKKyAgICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPHNpemUwLCAuLi4+PiByZXN1bHQgPSB0NDsKKyAgICBjb3V0IDw8IHJlc3VsdCgwLCAwLCAwKTsKKworVW50aWwgeW91IG5lZWQgdGhlIHJlc3VsdHMsIHlvdSBjYW4ga2VlcCB0aGUgb3BlcmF0aW9uIGFyb3VuZCwgYW5kIGV2ZW4gcmV1c2UKK2l0IGZvciBhZGRpdGlvbmFsIG9wZXJhdGlvbnMuICBBcyBsb25nIGFzIHlvdSBrZWVwIHRoZSBleHByZXNzaW9uIGFzIGFuCitvcGVyYXRpb24sIG5vIGNvbXB1dGF0aW9uIGlzIHBlcmZvcm1lZC4KKworICAgIC8vIE9uZSB3YXkgdG8gY29tcHV0ZSBleHAoKHQxICsgdDIpICogMC4yZik7CisgICAgYXV0byB0MyA9IHQxICsgdDI7CisgICAgYXV0byB0NCA9IHQzICogMC4yZjsKKyAgICBhdXRvIHQ1ID0gdDQuZXhwKCk7CisgICAgVGVuc29yPGZsb2F0LCAzPiByZXN1bHQgPSB0NTsKKworICAgIC8vIEFub3RoZXIgd2F5LCBleGFjdGx5IGFzIGVmZmljaWVudCBhcyB0aGUgcHJldmlvdXMgb25lOgorICAgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0ID0gKCh0MSArIHQyKSAqIDAuMmYpLmV4cCgpOworCisjIyMgQ29udHJvbGxpbmcgV2hlbiBFeHByZXNzaW9uIGFyZSBFdmFsdWF0ZWQKKworVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBjb250cm9sIHdoZW4gZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZDoKKworKiAgIEFzc2lnbm1lbnQgdG8gYSBUZW5zb3IsIFRlbnNvckZpeGVkU2l6ZSwgb3IgVGVuc29yTWFwLgorKiAgIFVzZSBvZiB0aGUgZXZhbCgpIG1ldGhvZC4KKyogICBBc3NpZ25tZW50IHRvIGEgVGVuc29yUmVmLgorCisjIyMjIEFzc2lnbmluZyB0byBhIFRlbnNvciwgVGVuc29yRml4ZWRTaXplLCBvciBUZW5zb3JNYXAuCisKK1RoZSBtb3N0IGNvbW1vbiB3YXkgdG8gZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBpcyB0byBhc3NpZ24gaXQgdG8gYSBUZW5zb3IuICBJbgordGhlIGV4YW1wbGUgYmVsb3csIHRoZSBgYGBhdXRvYGBgIGRlY2xhcmF0aW9ucyBtYWtlIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisiT3BlcmF0aW9ucyIsIG5vdCBUZW5zb3JzLCBhbmQgZG8gbm90IGNhdXNlIHRoZSBleHByZXNzaW9ucyB0byBiZSBldmFsdWF0ZWQuCitUaGUgYXNzaWdubWVudCB0byB0aGUgVGVuc29yIGBgYHJlc3VsdGBgYCBjYXVzZXMgdGhlIGV2YWx1YXRpb24gb2YgYWxsIHRoZQorb3BlcmF0aW9ucy4KKworICAgIGF1dG8gdDMgPSB0MSArIHQyOyAgICAgICAgICAgICAvLyB0MyBpcyBhbiBPcGVyYXRpb24uCisgICAgYXV0byB0NCA9IHQzICogMC4yZjsgICAgICAgICAgIC8vIHQ0IGlzIGFuIE9wZXJhdGlvbi4KKyAgICBhdXRvIHQ1ID0gdDQuZXhwKCk7ICAgICAgICAgICAgLy8gdDUgaXMgYW4gT3BlcmF0aW9uLgorICAgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0ID0gdDU7ICAvLyBUaGUgb3BlcmF0aW9ucyBhcmUgZXZhbHVhdGVkLgorCitJZiB5b3Uga25vdyB0aGUgcmFua3MgYW5kIHNpemVzIG9mIHRoZSBPcGVyYXRpb24gdmFsdWUgeW91IGNhbiBhc3NpZ24gdGhlCitPcGVyYXRpb24gdG8gYSBUZW5zb3JGaXhlZFNpemUgaW5zdGVhZCBvZiBhIFRlbnNvciwgd2hpY2ggaXMgYSBiaXQgbW9yZQorZWZmaWNpZW50LgorCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZSByZXN1bHQgaXMgYSA0eDR4MiB0ZW5zb3IhCisgICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCA0LCA0LCAyPiByZXN1bHQgPSB0NTsKKworU2ltaWFybHksIGFzc2lnbmluZyBhbiBleHByZXNzaW9uIHRvIGEgVGVuc29yTWFwIGNhdXNlcyBpdHMgZXZhbHVhdGlvbi4gIExpa2UKK3RlbnNvcnMgb2YgdHlwZSBUZW5zb3JGaXhlZFNpemUsIFRlbnNvck1hcHMgY2Fubm90IGJlIHJlc2l6ZWQgc28gdGhleSBoYXZlIHRvCitoYXZlIHRoZSByYW5rIGFuZCBzaXplcyBvZiB0aGUgZXhwcmVzc2lvbiB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGVtLgorCisjIyMjIENhbGxpbmcgZXZhbCgpLgorCitXaGVuIHlvdSBjb21wdXRlIGxhcmdlIGNvbXBvc2l0ZSBleHByZXNzaW9ucywgeW91IHNvbWV0aW1lcyB3YW50IHRvIHRlbGwgRWlnZW4KK3RoYXQgYW4gaW50ZXJtZWRpYXRlIHZhbHVlIGluIHRoZSBleHByZXNzaW9uIHRyZWUgaXMgd29ydGggZXZhbHVhdGluZyBhaGVhZCBvZgordGltZS4gIFRoaXMgaXMgZG9uZSBieSBpbnNlcnRpbmcgYSBjYWxsIHRvIHRoZSBgYGBldmFsKClgYGAgbWV0aG9kIG9mIHRoZQorZXhwcmVzc2lvbiBPcGVyYXRpb24uCisKKyAgICAvLyBUaGUgcHJldmlvdXMgZXhhbXBsZSBjb3VsZCBoYXZlIGJlZW4gd3JpdHRlbjoKKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCA9ICgodDEgKyB0MikgKiAwLjJmKS5leHAoKTsKKworICAgIC8vIElmIHlvdSB3YW50IHRvIGNvbXB1dGUgKHQxICsgdDIpIG9uY2UgYWhlYWQgb2YgdGltZSB5b3UgY2FuIHdyaXRlOgorICAgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0ID0gKCh0MSArIHQyKS5ldmFsKCkgKiAwLjJmKS5leHAoKTsKKworU2VtYW50aWNhbGx5LCBjYWxsaW5nIGBgYGV2YWwoKWBgYCBpcyBlcXVpdmFsZW50IHRvIG1hdGVyaWFsaXppbmcgdGhlIHZhbHVlIG9mCit0aGUgZXhwcmVzc2lvbiBpbiBhIHRlbXBvcmFyeSBUZW5zb3Igb2YgdGhlIHJpZ2h0IHNpemUuICBUaGUgY29kZSBhYm92ZSBpbgorZWZmZWN0IGRvZXM6CisKKyAgICAvLyAuZXZhbCgpIGtub3dzIHRoZSBzaXplIQorICAgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgNCwgNCwgMj4gdG1wID0gdDEgKyB0MjsKKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCA9ICh0bXAgKiAwLjJmKS5leHAoKTsKKworTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgYGBgZXZhbCgpYGBgIGlzIGl0c2VsZiBhbiBPcGVyYXRpb24sIHNvIHRoZQorZm9sbG93aW5nIGNvZGUgZG9lcyBub3QgZG8gd2hhdCB5b3UgbWF5IHRoaW5rOgorCisgICAgLy8gSGVyZSB0MyBpcyBhbiBldmFsdWF0aW9uIE9wZXJhdGlvbi4gIHQzIGhhcyBub3QgYmVlbiBldmFsdWF0ZWQgeWV0LgorICAgIGF1dG8gdDMgPSAodDEgKyB0MikuZXZhbCgpOworCisgICAgLy8gWW91IGNhbiB1c2UgdDMgaW4gYW5vdGhlciBleHByZXNzaW9uLiAgU3RpbGwgbm8gZXZhbHVhdGlvbi4KKyAgICBhdXRvIHQ0ID0gKHQzICogMC4yZikuZXhwKCk7CisKKyAgICAvLyBUaGUgdmFsdWUgaXMgZXZhbHVhdGVkIHdoZW4geW91IGFzc2lnbiB0aGUgT3BlcmF0aW9uIHRvIGEgVGVuc29yLCB1c2luZworICAgIC8vIGFuIGludGVybWVkaWF0ZSB0ZW5zb3IgdG8gcmVwcmVzZW50IHQzLngKKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCA9IHQ0OworCitXaGlsZSBpbiB0aGUgZXhhbXBsZXMgYWJvdmUgY2FsbGluZyBgYGBldmFsKClgYGAgZG9lcyBub3QgbWFrZSBhIGRpZmZlcmVuY2UgaW4KK3BlcmZvcm1hbmNlLCBpbiBvdGhlciBjYXNlcyBpdCBjYW4gbWFrZSBhIGh1Z2UgZGlmZmVyZW5jZS4gIEluIHRoZSBleHByZXNzaW9uCitiZWxvdyB0aGUgYGBgYnJvYWRjYXN0KClgYGAgZXhwcmVzc2lvbiBjYXVzZXMgdGhlIGBgYFgubWF4aW11bSgpYGBgIGV4cHJlc3Npb24KK3RvIGJlIGV2YWx1YXRlZCBtYW55IHRpbWVzOgorCisgICAgVGVuc29yPC4uLj4gWCAuLi47CisgICAgVGVuc29yPC4uLj4gWSA9ICgoWCAtIFgubWF4aW11bShkZXB0aF9kaW0pLnJlc2hhcGUoZGltczJkKS5icm9hZGNhc3QoYmNhc3QpKQorICAgICAgICAgICAgICAgICAgICAgKiBiZXRhKS5leHAoKTsKKworSW5zZXJ0aW5nIGEgY2FsbCB0byBgYGBldmFsKClgYGAgYmV0d2VlbiB0aGUgYGBgbWF4aW11bSgpYGBgIGFuZAorYGBgcmVzaGFwZSgpYGBgIGNhbGxzIGd1YXJhbnRlZXMgdGhhdCBtYXhpbXVtKCkgaXMgb25seSBjb21wdXRlZCBvbmNlIGFuZAorZ3JlYXRseSBzcGVlZHMtdXAgZXhlY3V0aW9uOgorCisgICAgVGVuc29yPC4uLj4gWSA9CisgICAgICAoKFggLSBYLm1heGltdW0oZGVwdGhfZGltKS5ldmFsKCkucmVzaGFwZShkaW1zMmQpLmJyb2FkY2FzdChiY2FzdCkpCisgICAgICAgICogYmV0YSkuZXhwKCk7CisKK0luIHRoZSBvdGhlciBleGFtcGxlIGJlbG93LCB0aGUgdGVuc29yIGBgYFlgYGAgaXMgYm90aCB1c2VkIGluIHRoZSBleHByZXNzaW9uCithbmQgaXRzIGFzc2lnbm1lbnQuICBUaGlzIGlzIGFuIGFsaWFzaW5nIHByb2JsZW0gYW5kIGlmIHRoZSBldmFsdWF0aW9uIGlzIG5vdAorZG9uZSBpbiB0aGUgcmlnaHQgb3JkZXIgWSB3aWxsIGJlIHVwZGF0ZWQgaW5jcmVtZW50YWxseSBkdXJpbmcgdGhlIGV2YWx1YXRpb24KK3Jlc3VsdGluZyBpbiBib2d1cyByZXN1bHRzOgorCisgICAgIFRlbnNvcjwuLi4+IFkgLi4uOworICAgICBZID0gWSAvIChZLnN1bShkZXB0aF9kaW0pLnJlc2hhcGUoZGltczJkKS5icm9hZGNhc3QoYmNhc3QpKTsKKworSW5zZXJ0aW5nIGEgY2FsbCB0byBgYGBldmFsKClgYGAgYmV0d2VlbiB0aGUgYGBgc3VtKClgYGAgYW5kIGBgYHJlc2hhcGUoKWBgYAorZXhwcmVzc2lvbnMgZW5zdXJlcyB0aGF0IHRoZSBzdW0gaXMgY29tcHV0ZWQgYmVmb3JlIGFueSB1cGRhdGVzIHRvIGBgYFlgYGAgYXJlCitkb25lLgorCisgICAgIFkgPSBZIC8gKFkuc3VtKGRlcHRoX2RpbSkuZXZhbCgpLnJlc2hhcGUoZGltczJkKS5icm9hZGNhc3QoYmNhc3QpKTsKKworTm90ZSB0aGF0IGFuIGV2YWwgYXJvdW5kIHRoZSBmdWxsIHJpZ2h0IGhhbmQgc2lkZSBleHByZXNzaW9uIGlzIG5vdCBuZWVkZWQKK2JlY2F1c2UgdGhlIGdlbmVyYXRlZCBoYXMgdG8gY29tcHV0ZSB0aGUgaS10aCB2YWx1ZSBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlCitiZWZvcmUgYXNzaWduaW5nIGl0IHRvIHRoZSBsZWZ0IGhhbmQgc2lkZS4KKworSG93ZXZlciwgaWYgeW91IHdlcmUgYXNzaWduaW5nIHRoZSBleHByZXNzaW9uIHZhbHVlIHRvIGEgc2h1ZmZsZSBvZiBgYGBZYGBgCit0aGVuIHlvdSB3b3VsZCBuZWVkIHRvIGZvcmNlIGFuIGV2YWwgZm9yIGNvcnJlY3RuZXNzIGJ5IGFkZGluZyBhbiBgYGBldmFsKClgYGAKK2NhbGwgZm9yIHRoZSByaWdodCBoYW5kIHNpZGU6CisKKyAgICAgWS5zaHVmZmxlKC4uLikgPQorICAgICAgICAoWSAvIChZLnN1bShkZXB0aF9kaW0pLmV2YWwoKS5yZXNoYXBlKGRpbXMyZCkuYnJvYWRjYXN0KGJjYXN0KSkpLmV2YWwoKTsKKworCisjIyMjIEFzc2lnbmluZyB0byBhIFRlbnNvclJlZi4KKworSWYgeW91IG5lZWQgdG8gYWNjZXNzIG9ubHkgYSBmZXcgZWxlbWVudHMgZnJvbSB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiB5b3UKK2NhbiBhdm9pZCBtYXRlcmlhbGl6aW5nIHRoZSB2YWx1ZSBpbiBhIGZ1bGwgdGVuc29yIGJ5IHVzaW5nIGEgVGVuc29yUmVmLgorCitBIFRlbnNvclJlZiBpcyBhIHNtYWxsIHdyYXBwZXIgY2xhc3MgZm9yIGFueSBFaWdlbiBPcGVyYXRpb24uICBJdCBwcm92aWRlcworb3ZlcmxvYWRzIGZvciB0aGUgYGBgKClgYGAgb3BlcmF0b3IgdGhhdCBsZXQgeW91IGFjY2VzcyBpbmRpdmlkdWFsIHZhbHVlcyBpbgordGhlIGV4cHJlc3Npb24uICBUZW5zb3JSZWYgaXMgY29udmVuaWVudCwgYmVjYXVzZSB0aGUgT3BlcmF0aW9uIHRoZW1zZWx2ZXMgZG8KK25vdCBwcm92aWRlIGEgd2F5IHRvIGFjY2VzcyBpbmRpdmlkdWFsIGVsZW1lbnRzLgorCisgICAgLy8gQ3JlYXRlIGEgVGVuc29yUmVmIGZvciB0aGUgZXhwcmVzc2lvbi4gIFRoZSBleHByZXNzaW9uIGlzIG5vdAorICAgIC8vIGV2YWx1YXRlZCB5ZXQuCisgICAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgMz4gPiByZWYgPSAoKHQxICsgdDIpICogMC4yZikuZXhwKCk7CisKKyAgICAvLyBVc2UgInJlZiIgdG8gYWNjZXNzIGluZGl2aWR1YWwgZWxlbWVudHMuICBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQKKyAgICAvLyBvbiB0aGUgZmx5LgorICAgIGZsb2F0IGF0XzAgPSByZWYoMCwgMCwgMCk7CisgICAgY291dCA8PCByZWYoMCwgMSwgMCk7CisKK09ubHkgdXNlIFRlbnNvclJlZiB3aGVuIHlvdSBuZWVkIGEgc3Vic2V0IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb24uCitUZW5zb3JSZWYgb25seSBjb21wdXRlcyB0aGUgdmFsdWVzIHlvdSBhY2Nlc3MuICBIb3dldmVyIG5vdGUgdGhhdCBpZiB5b3UgYXJlCitnb2luZyB0byBhY2Nlc3MgYWxsIHRoZSB2YWx1ZXMgaXQgd2lsbCBiZSBtdWNoIGZhc3RlciB0byBtYXRlcmlhbGl6ZSB0aGUKK3Jlc3VsdHMgaW4gYSBUZW5zb3IgZmlyc3QuCisKK0luIHNvbWUgY2FzZXMsIGlmIHRoZSBmdWxsIFRlbnNvciByZXN1bHQgd291bGQgYmUgdmVyeSBsYXJnZSwgeW91IG1heSBzYXZlCittZW1vcnkgYnkgYWNjZXNzaW5nIGl0IGFzIGEgVGVuc29yUmVmLiAgQnV0IG5vdCBhbHdheXMuICBTbyBkb24ndCBjb3VudCBvbiBpdC4KKworCisjIyMgQ29udHJvbGxpbmcgSG93IEV4cHJlc3Npb25zIEFyZSBFdmFsdWF0ZWQKKworVGhlIHRlbnNvciBsaWJyYXJ5IHByb3ZpZGVzIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSB2YXJpb3VzIG9wZXJhdGlvbnMKK3N1Y2ggYXMgY29udHJhY3Rpb25zIGFuZCBjb252b2x1dGlvbnMuICBUaGUgaW1wbGVtZW50YXRpb25zIGFyZSBvcHRpbWl6ZWQgZm9yCitkaWZmZXJlbnQgZW52aXJvbm1lbnRzOiBzaW5nbGUgdGhyZWFkZWQgb24gQ1BVLCBtdWx0aSB0aHJlYWRlZCBvbiBDUFUsIG9yIG9uIGEKK0dQVSB1c2luZyBjdWRhLiAgQWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlIGFkZGVkIGxhdGVyLgorCitZb3UgY2FuIGNob29zZSB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byB1c2Ugd2l0aCB0aGUgYGBgZGV2aWNlKClgYGAgY2FsbC4gIElmCit5b3UgZG8gbm90IGNob29zZSBhbiBpbXBsZW1lbnRhdGlvbiBleHBsaWNpdGx5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQKK3VzZXMgYSBzaW5nbGUgdGhyZWFkIG9uIHRoZSBDUFUgaXMgdXNlZC4KKworVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gb3B0aW1pemVkIGZvciByZWNlbnQgSW50ZWwgQ1BVcywgdGFraW5nCithZHZhbnRhZ2Ugb2YgU1NFLCBBVlgsIGFuZCBGTUEgaW5zdHJ1Y3Rpb25zLiAgV29yayBpcyBvbmdvaW5nIHRvIHR1bmUgdGhlCitsaWJyYXJ5IG9uIEFSTSBDUFVzLiAgTm90ZSB0aGF0IHlvdSBuZWVkIHRvIHBhc3MgY29tcGlsZXItZGVwZW5kZW50IGZsYWdzCit0byBlbmFibGUgdGhlIHVzZSBvZiBTU0UsIEFWWCwgYW5kIG90aGVyIGluc3RydWN0aW9ucy4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBhZGRzIHR3byB0ZW5zb3JzIHVzaW5nIHRoZSBkZWZhdWx0CitzaW5nbGUtdGhyZWFkZWQgQ1BVIGltcGxlbWVudGF0aW9uOgorCisgICAgVGVuc29yPGZsb2F0LCAyPiBhKDMwLCA0MCk7CisgICAgVGVuc29yPGZsb2F0LCAyPiBiKDMwLCA0MCk7CisgICAgVGVuc29yPGZsb2F0LCAyPiBjID0gYSArIGI7CisKK1RvIGNob29zZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiB5b3UgaGF2ZSB0byBpbnNlcnQgYSBgYGBkZXZpY2UoKWBgYCBjYWxsCitiZWZvcmUgdGhlIGFzc2lnbm1lbnQgb2YgdGhlIHJlc3VsdC4gIEZvciB0ZWNobmljYWwgQysrIHJlYXNvbnMgdGhpcyByZXF1aXJlcwordGhhdCB0aGUgVGVuc29yIGZvciB0aGUgcmVzdWx0IGJlIGRlY2xhcmVkIG9uIGl0cyBvd24uICBUaGlzIG1lYW5zIHRoYXQgeW91CitoYXZlIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4KKworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+IGMoMzAsIDQwKTsKKyAgICBjLmRldmljZSguLi4pID0gYSArIGI7CisKK1RoZSBjYWxsIHRvIGBgYGRldmljZSgpYGBgIG11c3QgYmUgdGhlIGxhc3QgY2FsbCBvbiB0aGUgbGVmdCBvZiB0aGUgb3BlcmF0b3I9LgorCitZb3UgbXVzdCBwYXNzIHRvIHRoZSBgYGBkZXZpY2UoKWBgYCBjYWxsIGFuIEVpZ2VuIGRldmljZSBvYmplY3QuICBUaGVyZSBhcmUKK3ByZXNlbnRseSB0aHJlZSBkZXZpY2VzIHlvdSBjYW4gdXNlOiBEZWZhdWx0RGV2aWNlLCBUaHJlYWRQb29sRGV2aWNlIGFuZAorR3B1RGV2aWNlLgorCisKKyMjIyMgRXZhbHVhdGluZyBXaXRoIHRoZSBEZWZhdWx0RGV2aWNlCisKK1RoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBub3QgaW5zZXJ0aW5nIGEgYGBgZGV2aWNlKClgYGAgY2FsbC4KKworICAgIERlZmF1bHREZXZpY2UgbXlfZGV2aWNlOworICAgIGMuZGV2aWNlKG15X2RldmljZSkgPSBhICsgYjsKKworIyMjIyBFdmFsdWF0aW5nIHdpdGggYSBUaHJlYWQgUG9vbAorCisgICAgLy8gQ3JlYXRlIHRoZSBFaWdlbiBUaHJlYWRQb29sRGV2aWNlLgorICAgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIG15X2RldmljZSg0IC8qIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSAqLyk7CisKKyAgICAvLyBOb3cganVzdCB1c2UgdGhlIGRldmljZSB3aGVuIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMuCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYygzMCwgNTApOworICAgIGMuZGV2aWNlKG15X2RldmljZSkgPSBhLmNvbnRyYWN0KGIsIGRvdF9wcm9kdWN0X2RpbXMpOworCisKKyMjIyMgRXZhbHVhdGluZyBPbiBHUFUKKworVGhpcyBpcyBwcmVzZW50bHkgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIGp1c3QgdXNpbmcgYSB0aHJlYWQgcG9vbCBkZXZpY2UuCitZb3UgbmVlZCB0byBjcmVhdGUgYSBHUFUgZGV2aWNlIGJ1dCB5b3UgYWxzbyBuZWVkIHRvIGV4cGxpY2l0bHkgYWxsb2NhdGUgdGhlCittZW1vcnkgZm9yIHRlbnNvcnMgd2l0aCBjdWRhLgorCisKKyMjIEFQSSBSZWZlcmVuY2UKKworIyMjIERhdGF0eXBlcworCitJbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgdGVuc29yIG1ldGhvZHMgYW5kIE9wZXJhdGlvbiB3ZSBtZW50aW9uIGRhdGF0eXBlcwordGhhdCBhcmUgdGVuc29yLXR5cGUgc3BlY2lmaWM6CisKKyMjIyMgPFRlbnNvci1UeXBlPjo6RGltZW5zaW9ucworCitBY3RzIGxpa2UgYW4gYXJyYXkgb2YgaW50cy4gIEhhcyBhbiBgYGBpbnQgc2l6ZWBgYCBhdHRyaWJ1dGUsIGFuZCBjYW4gYmUKK2luZGV4ZWQgbGlrZSBhbiBhcnJheSB0byBhY2Nlc3MgaW5kaXZpZHVhbCB2YWx1ZXMuICBVc2VkIHRvIHJlcHJlc2VudCB0aGUKK2RpbWVuc2lvbnMgb2YgYSB0ZW5zb3IuICBTZWUgYGBgZGltZW5zaW9ucygpYGBgLgorCisjIyMjIDxUZW5zb3ItVHlwZT46OkluZGV4CisKK0FjdHMgbGlrZSBhbiBgYGBpbnRgYGAuICBVc2VkIGZvciBpbmRleGluZyB0ZW5zb3JzIGFsb25nIHRoZWlyIGRpbWVuc2lvbnMuICBTZWUKK2BgYG9wZXJhdG9yKClgYGAsIGBgYGRpbWVuc2lvbigpYGBgLCBhbmQgYGBgc2l6ZSgpYGBgLgorCisjIyMjIDxUZW5zb3ItVHlwZT46OlNjYWxhcgorCitSZXByZXNlbnRzIHRoZSBkYXRhdHlwZSBvZiBpbmRpdmlkdWFsIHRlbnNvciBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBmb3IgYQorYGBgVGVuc29yPGZsb2F0PmBgYCwgYGBgU2NhbGFyYGBgIGlzIHRoZSB0eXBlIGBgYGZsb2F0YGBgLiAgU2VlCitgYGBzZXRDb25zdGFudCgpYGBgLgorCisjIyMjIDxPcGVyYXRpb24+CisKK1dlIHVzZSB0aGlzIHBzZXVkbyB0eXBlIHRvIGluZGljYXRlIHRoYXQgYSB0ZW5zb3IgT3BlcmF0aW9uIGlzIHJldHVybmVkIGJ5IGEKK21ldGhvZC4gIFdlIGluZGljYXRlIGluIHRoZSB0ZXh0IHRoZSB0eXBlIGFuZCBkaW1lbnNpb25zIG9mIHRoZSB0ZW5zb3IgdGhhdCB0aGUKK09wZXJhdGlvbiByZXR1cm5zIGFmdGVyIGV2YWx1YXRpb24uCisKK1RoZSBPcGVyYXRpb24gd2lsbCBoYXZlIHRvIGJlIGV2YWx1YXRlZCwgZm9yIGV4YW1wbGUgYnkgYXNzaWduaW5nIGl0IHRvIGEKK3RlbnNvciwgYmVmb3JlIHlvdSBjYW4gYWNjZXNzIHRoZSB2YWx1ZXMgb2YgdGhlIHJlc3VsdGluZyB0ZW5zb3IuICBZb3UgY2FuIGFsc28KK2FjY2VzcyB0aGUgdmFsdWVzIHRocm91Z2ggYSBUZW5zb3JSZWYuCisKKworIyMgQnVpbHQtaW4gVGVuc29yIE1ldGhvZHMKKworVGhlc2UgYXJlIHVzdWFsIEMrKyBtZXRob2RzIHRoYXQgYWN0IG9uIHRlbnNvcnMgaW1tZWRpYXRlbHkuICBUaGV5IGFyZSBub3QKK09wZXJhdGlvbnMgd2hpY2ggcHJvdmlkZSBkZWxheWVkIGV2YWx1YXRpb24gb2YgdGhlaXIgcmVzdWx0cy4gIFVubGVzcyBzcGVjaWZpZWQKK290aGVyd2lzZSwgYWxsIHRoZSBtZXRob2RzIGxpc3RlZCBiZWxvdyBhcmUgYXZhaWxhYmxlIG9uIGFsbCB0ZW5zb3IgY2xhc3NlczoKK1RlbnNvciwgVGVuc29yRml4ZWRTaXplLCBhbmQgVGVuc29yTWFwLgorCisjIyBNZXRhZGF0YQorCisjIyMgaW50IE51bURpbWVuc2lvbnMKKworQ29uc3RhbnQgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgYSBUZW5zb3IuICBUaGlzIGlzIGFsc28KK2tub3duIGFzIHRoZSB0ZW5zb3IgInJhbmsiLgorCisgICAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiBhKDMsIDQpOworICAgICAgY291dCA8PCAiRGltcyAiIDw8IGEuTnVtRGltZW5zaW9uczsKKyAgICAgID0+IERpbXMgMgorCisjIyMgRGltZW5zaW9ucyBkaW1lbnNpb25zKCkKKworUmV0dXJucyBhbiBhcnJheS1saWtlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRlbnNvci4KK1RoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZGltZW5zaW9ucygpIHJlc3VsdCBpcyA8VGVuc29yLVR5cGU+OjpEaW1lbnNpb25zLgorCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYSgzLCA0KTsKKyAgICBjb25zdCBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyYgZCA9IGEuZGltZW5zaW9ucygpOworICAgIGNvdXQgPDwgIkRpbSBzaXplOiAiIDw8IGQuc2l6ZSA8PCAiLCBkaW0gMDogIiA8PCBkWzBdCisgICAgICAgICA8PCAiLCBkaW0gMTogIiA8PCBkWzFdOworICAgID0+IERpbSBzaXplOiAyLCBkaW0gMDogMywgZGltIDE6IDQKKworSWYgeW91IHVzZSBhIEMrKzExIGNvbXBpbGVyLCB5b3UgY2FuIHVzZSBgYGBhdXRvYGBgIHRvIHNpbXBsaWZ5IHRoZSBjb2RlOgorCisgICAgY29uc3QgYXV0byYgZCA9IGEuZGltZW5zaW9ucygpOworICAgIGNvdXQgPDwgIkRpbSBzaXplOiAiIDw8IGQuc2l6ZSA8PCAiLCBkaW0gMDogIiA8PCBkWzBdCisgICAgICAgICA8PCAiLCBkaW0gMTogIiA8PCBkWzFdOworICAgID0+IERpbSBzaXplOiAyLCBkaW0gMDogMywgZGltIDE6IDQKKworIyMjIEluZGV4IGRpbWVuc2lvbihJbmRleCBuKQorCitSZXR1cm5zIHRoZSBuLXRoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLiAgVGhlIGFjdHVhbCB0eXBlIG9mIHRoZQorYGBgZGltZW5zaW9uKClgYGAgcmVzdWx0IGlzIGBgYDxUZW5zb3ItVHlwZT46OkluZGV4YGBgLCBidXQgeW91IGNhbgorYWx3YXlzIHVzZSBpdCBsaWtlIGFuIGludC4KKworICAgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYSgzLCA0KTsKKyAgICAgIGludCBkaW0xID0gYS5kaW1lbnNpb24oMSk7CisgICAgICBjb3V0IDw8ICJEaW0gMTogIiA8PCBkaW0xOworICAgICAgPT4gRGltIDE6IDQKKworIyMjIEluZGV4IHNpemUoKQorCitSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRlbnNvci4gIFRoaXMgaXMgdGhlIHByb2R1Y3Qgb2YgYWxsCit0aGUgdGVuc29yIGRpbWVuc2lvbnMuICBUaGUgYWN0dWFsIHR5cGUgb2YgdGhlIGBgYHNpemUoKWBgYCByZXN1bHQgaXMKK2BgYDxUZW5zb3ItVHlwZT46OkluZGV4YGBgLCBidXQgeW91IGNhbiBhbHdheXMgdXNlIGl0IGxpa2UgYW4gaW50LgorCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYSgzLCA0KTsKKyAgICBjb3V0IDw8ICJTaXplOiAiIDw8IGEuc2l6ZSgpOworICAgID0+IFNpemU6IDEyCisKKworIyMjIEdldHRpbmcgRGltZW5zaW9ucyBGcm9tIEFuIE9wZXJhdGlvbgorCitBIGZldyBvcGVyYXRpb25zIHByb3ZpZGUgYGBgZGltZW5zaW9ucygpYGBgIGRpcmVjdGx5LAorZS5nLiBgYGBUZW5zb3JSZXNsaWNpbmdPcGBgYC4gIE1vc3Qgb3BlcmF0aW9ucyBkZWZlciBjYWxjdWxhdGluZyBkaW1lbnNpb25zCit1bnRpbCB0aGUgb3BlcmF0aW9uIGlzIGJlaW5nIGV2YWx1YXRlZC4gIElmIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUgZGltZW5zaW9ucworb2YgYSBkZWZlcnJlZCBvcGVyYXRpb24sIHlvdSBjYW4gd3JhcCBpdCBpbiBhIFRlbnNvclJlZiAoc2VlIEFzc2lnbmluZyB0byBhCitUZW5zb3JSZWYgYWJvdmUpLCB3aGljaCBwcm92aWRlcyBgYGBkaW1lbnNpb25zKClgYGAgYW5kIGBgYGRpbWVuc2lvbigpYGBgIGFzCithYm92ZS4KKworVGVuc29yUmVmIGNhbiBhbHNvIHdyYXAgdGhlIHBsYWluIFRlbnNvciB0eXBlcywgc28gdGhpcyBpcyBhIHVzZWZ1bCBpZGlvbSBpbgordGVtcGxhdGVkIGNvbnRleHRzIHdoZXJlIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBjb3VsZCBiZSBlaXRoZXIgYSByYXcgVGVuc29yCitvciBzb21lIGRlZmVycmVkIG9wZXJhdGlvbiAoZS5nLiBhIHNsaWNlIG9mIGEgVGVuc29yKS4gIEluIHRoaXMgY2FzZSwgdGhlCit0ZW1wbGF0ZSBjb2RlIGNhbiB3cmFwIHRoZSBvYmplY3QgaW4gYSBUZW5zb3JSZWYgYW5kIHJlYXNvbiBhYm91dCBpdHMKK2RpbWVuc2lvbmFsaXR5IHdoaWxlIHJlbWFpbmluZyBhZ25vc3RpYyB0byB0aGUgdW5kZXJseWluZyB0eXBlLgorCisKKyMjIENvbnN0cnVjdG9ycworCisjIyMgVGVuc29yCisKK0NyZWF0ZXMgYSB0ZW5zb3Igb2YgdGhlIHNwZWNpZmllZCBzaXplLiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBtdXN0IGJlIGVxdWFsCit0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLiBUaGUgY29udGVudCBvZiB0aGUgdGVuc29yIGlzIG5vdCBpbml0aWFsaXplZC4KKworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+IGEoMywgNCk7CisgICAgY291dCA8PCAiTnVtUm93czogIiA8PCBhLmRpbWVuc2lvbigwKSA8PCAiIE51bUNvbHM6ICIgPDwgYS5kaW1lbnNpb24oMSkgPDwgZW5kbDsKKyAgICA9PiBOdW1Sb3dzOiAzIE51bUNvbHM6IDQKKworIyMjIFRlbnNvckZpeGVkU2l6ZQorCitDcmVhdGVzIGEgdGVuc29yIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZS4gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIFNpemU8PgordGVtcGxhdGUgcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIHJhbmsgb2YgdGhlIHRlbnNvci4gVGhlIGNvbnRlbnQgb2YgdGhlIHRlbnNvcgoraXMgbm90IGluaXRpYWxpemVkLgorCisgICAgRWlnZW46OlRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZTwzLCA0Pj4gYTsKKyAgICBjb3V0IDw8ICJSYW5rOiAiIDw8IGEucmFuaygpIDw8IGVuZGw7CisgICAgPT4gUmFuazogMgorICAgIGNvdXQgPDwgIk51bVJvd3M6ICIgPDwgYS5kaW1lbnNpb24oMCkgPDwgIiBOdW1Db2xzOiAiIDw8IGEuZGltZW5zaW9uKDEpIDw8IGVuZGw7CisgICAgPT4gTnVtUm93czogMyBOdW1Db2xzOiA0CisKKyMjIyBUZW5zb3JNYXAKKworQ3JlYXRlcyBhIHRlbnNvciBtYXBwaW5nIGFuIGV4aXN0aW5nIGFycmF5IG9mIGRhdGEuIFRoZSBkYXRhIG11c3Qgbm90IGJlIGZyZWVkCit1bnRpbCB0aGUgVGVuc29yTWFwIGlzIGRpc2NhcmRlZCwgYW5kIHRoZSBzaXplIG9mIHRoZSBkYXRhIG11c3QgYmUgbGFyZ2UgZW5vdWdoCit0byBhY2NvbW9kYXRlIG9mIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHRlbnNvci4KKworICAgIGZsb2F0IGRhdGFbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9OworICAgIEVpZ2VuOjpUZW5zb3JNYXA8ZmxvYXQsIDI+IGEoZGF0YSwgMywgNCk7CisgICAgY291dCA8PCAiTnVtUm93czogIiA8PCBhLmRpbWVuc2lvbigwKSA8PCAiIE51bUNvbHM6ICIgPDwgYS5kaW1lbnNpb24oMSkgPDwgZW5kbDsKKyAgICA9PiBOdW1Sb3dzOiAzIE51bUNvbHM6IDQKKyAgICBjb3V0IDw8ICJhKDEsIDIpOiAiIDw8IGEoMSwgMikgPDwgZW5kbDsKKyAgICA9PiBhKDEsIDIpOiA5CisKKworIyMgQ29udGVudHMgSW5pdGlhbGl6YXRpb24KKworV2hlbiBhIG5ldyBUZW5zb3Igb3IgYSBuZXcgVGVuc29yRml4ZWRTaXplIGFyZSBjcmVhdGVkLCBtZW1vcnkgaXMgYWxsb2NhdGVkIHRvCitob2xkIGFsbCB0aGUgdGVuc29yIGVsZW1lbnRzLCBidXQgdGhlIG1lbW9yeSBpcyBub3QgaW5pdGlhbGl6ZWQuICBTaW1pbGFybHksCit3aGVuIGEgbmV3IFRlbnNvck1hcCBpcyBjcmVhdGVkIG9uIHRvcCBvZiBub24taW5pdGlhbGl6ZWQgbWVtb3J5IHRoZSBtZW1vcnkgaXRzCitjb250ZW50cyBhcmUgbm90IGluaXRpYWxpemVkLgorCitZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIG1ldGhvZHMgYmVsb3cgdG8gaW5pdGlhbGl6ZSB0aGUgdGVuc29yIG1lbW9yeS4gIFRoZXNlCitoYXZlIGFuIGltbWVkaWF0ZSBlZmZlY3Qgb24gdGhlIHRlbnNvciBhbmQgcmV0dXJuIHRoZSB0ZW5zb3IgaXRzZWxmIGFzIGEKK3Jlc3VsdC4gIFRoZXNlIGFyZSBub3QgdGVuc29yIE9wZXJhdGlvbnMgd2hpY2ggZGVsYXkgZXZhbHVhdGlvbi4KKworIyMjIDxUZW5zb3ItVHlwZT4gc2V0Q29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWwpCisKK1NldHMgYWxsIGVsZW1lbnRzIG9mIHRoZSB0ZW5zb3IgdG8gdGhlIGNvbnN0YW50IHZhbHVlIGBgYHZhbGBgYC4gIGBgYFNjYWxhcmBgYAoraXMgdGhlIHR5cGUgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIHRlbnNvci4gIFlvdSBjYW4gcGFzcyBhbnkgdmFsdWUgdGhhdCBpcworY29udmVydGlibGUgdG8gdGhhdCB0eXBlLgorCitSZXR1cm5zIHRoZSB0ZW5zb3IgaXRzZWxmIGluIGNhc2UgeW91IHdhbnQgdG8gY2hhaW4gYW5vdGhlciBjYWxsLgorCisgICAgYS5zZXRDb25zdGFudCgxMi4zZik7CisgICAgY291dCA8PCAiQ29uc3RhbnQ6ICIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIENvbnN0YW50OgorICAgIDEyLjMgMTIuMyAxMi4zIDEyLjMKKyAgICAxMi4zIDEyLjMgMTIuMyAxMi4zCisgICAgMTIuMyAxMi4zIDEyLjMgMTIuMworCitOb3RlIHRoYXQgYGBgc2V0Q29uc3RhbnQoKWBgYCBjYW4gYmUgdXNlZCBvbiBhbnkgdGVuc29yIHdoZXJlIHRoZSBlbGVtZW50IHR5cGUKK2hhcyBhIGNvcHkgY29uc3RydWN0b3IgYW5kIGFuIGBgYG9wZXJhdG9yPSgpYGBgOgorCisgICAgRWlnZW46OlRlbnNvcjxzdHJpbmcsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRDb25zdGFudCgieW9sbyIpOworICAgIGNvdXQgPDwgIlN0cmluZyB0ZW5zb3I6ICIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIFN0cmluZyB0ZW5zb3I6CisgICAgeW9sbyB5b2xvIHlvbG8KKyAgICB5b2xvIHlvbG8geW9sbworCisKKyMjIyA8VGVuc29yLVR5cGU+IHNldFplcm8oKQorCitGaWxscyB0aGUgdGVuc29yIHdpdGggemVyb3MuICBFcXVpdmFsZW50IHRvIGBgYHNldENvbnN0YW50KFNjYWxhcigwKSlgYGAuCitSZXR1cm5zIHRoZSB0ZW5zb3IgaXRzZWxmIGluIGNhc2UgeW91IHdhbnQgdG8gY2hhaW4gYW5vdGhlciBjYWxsLgorCisgICAgYS5zZXRaZXJvKCk7CisgICAgY291dCA8PCAiWmVyb3M6ICIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIFplcm9zOgorICAgIDAgMCAwIDAKKyAgICAwIDAgMCAwCisgICAgMCAwIDAgMAorCisKKyMjIyA8VGVuc29yLVR5cGU+IHNldFZhbHVlcyh7Li5pbml0aWFsaXplcl9saXN0fSkKKworRmlsbHMgdGhlIHRlbnNvciB3aXRoIGV4cGxpY2l0IHZhbHVlcyBzcGVjaWZpZWQgaW4gYSBzdGQ6OmluaXRpYWxpemVyX2xpc3QuCitUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBkZXBlbmRzIG9uIHRoZSB0eXBlIGFuZCByYW5rIG9mIHRoZSB0ZW5zb3IuCisKK0lmIHRoZSB0ZW5zb3IgaGFzIHJhbmsgTiwgdGhlIGluaXRpYWxpemVyIGxpc3QgbXVzdCBiZSBuZXN0ZWQgTiB0aW1lcy4gIFRoZQorbW9zdCBkZWVwbHkgbmVzdGVkIGxpc3RzIG11c3QgY29udGFpbnMgUCBzY2FsYXJzIG9mIHRoZSBUZW5zb3IgdHlwZSB3aGVyZSBQIGlzCit0aGUgc2l6ZSBvZiB0aGUgbGFzdCBkaW1lbnNpb24gb2YgdGhlIFRlbnNvci4KKworRm9yIGV4YW1wbGUsIGZvciBhIGBgYFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgMiwgMz5gYGAgdGhlIGluaXRpYWxpemVyIGxpc3QgbXVzdAorY29udGFpbnMgMiBsaXN0cyBvZiAzIGZsb2F0cyBlYWNoLgorCitgYGBzZXRWYWx1ZXMoKWBgYCByZXR1cm5zIHRoZSB0ZW5zb3IgaXRzZWxmIGluIGNhc2UgeW91IHdhbnQgdG8gY2hhaW4gYW5vdGhlcgorY2FsbC4KKworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRWYWx1ZXMoe3swLjBmLCAxLjBmLCAyLjBmfSwgezMuMGYsIDQuMGYsIDUuMGZ9fSk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIGEKKyAgICAwIDEgMgorICAgIDMgNCA1CisKK0lmIGEgbGlzdCBpcyB0b28gc2hvcnQsIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoZSB0ZW5zb3Igd2lsbCBub3QgYmUKK2NoYW5nZWQuICBUaGlzIGlzIHZhbGlkIGF0IGVhY2ggbGV2ZWwgb2YgbmVzdGluZy4gIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcKK2NvZGUgb25seSBzZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGVuc29yLgorCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRDb25zdGFudCgxMDAwKTsKKyAgICBhLnNldFZhbHVlcyh7ezEwLCAyMCwgMzB9fSk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIGEKKyAgICAxMCAgIDIwICAgMzAKKyAgICAxMDAwIDEwMDAgMTAwMAorCisjIyMgPFRlbnNvci1UeXBlPiBzZXRSYW5kb20oKQorCitGaWxscyB0aGUgdGVuc29yIHdpdGggcmFuZG9tIHZhbHVlcy4gIFJldHVybnMgdGhlIHRlbnNvciBpdHNlbGYgaW4gY2FzZSB5b3UKK3dhbnQgdG8gY2hhaW4gYW5vdGhlciBjYWxsLgorCisgICAgYS5zZXRSYW5kb20oKTsKKyAgICBjb3V0IDw8ICJSYW5kb206ICIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIFJhbmRvbToKKyAgICAgIDAuNjgwMzc1ICAgIDAuNTk2ODggIC0wLjMyOTU1NCAgICAwLjEwNzk0CisgICAgIC0wLjIxMTIzNCAgIDAuODIzMjk1ICAgMC41MzY0NTkgLTAuMDQ1MjA1OQorICAgICAgMC41NjYxOTggIC0wLjYwNDg5NyAgLTAuNDQ0NDUxICAgMC4yNTc3NDIKKworWW91IGNhbiBjdXN0b21pemUgYGBgc2V0UmFuZG9tKClgYGAgYnkgcHJvdmlkaW5nIHlvdXIgb3duIHJhbmRvbSBudW1iZXIKK2dlbmVyYXRvciBhcyBhIHRlbXBsYXRlIGFyZ3VtZW50OgorCisgICAgYS5zZXRSYW5kb208TXlSYW5kb21HZW5lcmF0b3I+KCk7CisKK0hlcmUsIGBgYE15UmFuZG9tR2VuZXJhdG9yYGBgIG11c3QgYmUgYSBzdHJ1Y3Qgd2l0aCB0aGUgZm9sbG93aW5nIG1lbWJlcgorZnVuY3Rpb25zLCB3aGVyZSBTY2FsYXIgYW5kIEluZGV4IGFyZSB0aGUgc2FtZSBhcyBgYGA8VGVuc29yLVR5cGU+OjpTY2FsYXJgYGAKK2FuZCBgYGA8VGVuc29yLVR5cGU+OjpJbmRleGBgYC4KKworU2VlIGBgYHN0cnVjdCBVbmlmb3JtUmFuZG9tR2VuZXJhdG9yYGBgIGluIFRlbnNvckZ1bmN0b3JzLmggZm9yIGFuIGV4YW1wbGUuCisKKyAgICAvLyBDdXN0b20gbnVtYmVyIGdlbmVyYXRvciBmb3IgdXNlIHdpdGggc2V0UmFuZG9tKCkuCisgICAgc3RydWN0IE15UmFuZG9tR2VuZXJhdG9yIHsKKyAgICAgIC8vIERlZmF1bHQgYW5kIGNvcHkgY29uc3RydWN0b3JzLiBCb3RoIGFyZSBuZWVkZWQKKyAgICAgIE15UmFuZG9tR2VuZXJhdG9yKCkgeyB9CisgICAgICBNeVJhbmRvbUdlbmVyYXRvcihjb25zdCBNeVJhbmRvbUdlbmVyYXRvciYgKSB7IH0KKworICAgICAgLy8gUmV0dXJuIGEgcmFuZG9tIHZhbHVlIHRvIGJlIHVzZWQuICAiZWxlbWVudF9sb2NhdGlvbiIgaXMgdGhlCisgICAgICAvLyBsb2NhdGlvbiBvZiB0aGUgZW50cnkgdG8gc2V0IGluIHRoZSB0ZW5zb3IsIGl0IGNhbiB0eXBpY2FsbHkKKyAgICAgIC8vIGJlIGlnbm9yZWQuCisgICAgICBTY2FsYXIgb3BlcmF0b3IoKShFaWdlbjo6RGVuc2VJbmRleCBlbGVtZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OkRlbnNlSW5kZXggLyp1bnVzZWQqLyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDxyYW5kb21seSBnZW5lcmF0ZWQgdmFsdWUgb2YgdHlwZSBUPjsKKyAgICAgIH0KKworICAgICAgLy8gU2FtZSBhcyBhYm92ZSBidXQgZ2VuZXJhdGVzIHNldmVyYWwgbnVtYmVycyBhdCBhIHRpbWUuCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIHBhY2tldE9wKAorICAgICAgICAgIEVpZ2VuOjpEZW5zZUluZGV4IHBhY2tldF9sb2NhdGlvbiwgRWlnZW46OkRlbnNlSW5kZXggLyp1bnVzZWQqLyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDxhIHBhY2tldCBvZiByYW5kb21seSBnZW5lcmF0ZWQgdmFsdWVzPjsKKyAgICAgIH0KKyAgICB9OworCitZb3UgY2FuIGFsc28gdXNlIG9uZSBvZiB0aGUgMiByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUKK3RlbnNvciBsaWJyYXJ5OgorKiAgIFVuaWZvcm1SYW5kb21HZW5lcmF0b3IKKyogICBOb3JtYWxSYW5kb21HZW5lcmF0b3IKKworCisjIyBEYXRhIEFjY2VzcworCitUaGUgVGVuc29yLCBUZW5zb3JGaXhlZFNpemUsIGFuZCBUZW5zb3JSZWYgY2xhc3NlcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcKK2FjY2Vzc29ycyB0byBhY2Nlc3MgdGhlIHRlbnNvciBjb2VmZmljaWVudHM6CisKKyAgICBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKQorICAgIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBmaXJzdEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykKKyAgICBTY2FsYXImIG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKQorICAgIFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBmaXJzdEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykKKworVGhlIG51bWJlciBvZiBpbmRpY2VzIG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsgb2YgdGhlIHRlbnNvci4gTW9yZW92ZXIsIHRoZXNlCithY2Nlc3NvcnMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGVuc29yIGV4cHJlc3Npb25zLiBJbiBvcmRlciB0byBhY2Nlc3MgdGhlCit2YWx1ZXMgb2YgYSB0ZW5zb3IgZXhwcmVzc2lvbiwgdGhlIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgZXZhbHVhdGVkIG9yCit3cmFwcGVkIGluIGEgVGVuc29yUmVmLgorCisKKyMjIyBTY2FsYXIqIGRhdGEoKSBhbmQgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QKKworUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0b3JhZ2UgZm9yIHRoZSB0ZW5zb3IuICBUaGUgcG9pbnRlciBpcyBjb25zdCBpZiB0aGUKK3RlbnNvciB3YXMgY29uc3QuICBUaGlzIGFsbG93cyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBkYXRhLiAgVGhlIGxheW91dCBvZiB0aGUKK2RhdGEgZGVwZW5kcyBvbiB0aGUgdGVuc29yIGxheW91dDogUm93TWFqb3Igb3IgQ29sTWFqb3IuCisKK1RoaXMgYWNjZXNzIGlzIHVzdWFsbHkgb25seSBuZWVkZWQgZm9yIHNwZWNpYWwgY2FzZXMsIGZvciBleGFtcGxlIHdoZW4gbWl4aW5nCitFaWdlbiBUZW5zb3IgY29kZSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKworU2NhbGFyIGlzIHRoZSB0eXBlIG9mIGRhdGEgc3RvcmVkIGluIHRoZSB0ZW5zb3IuCisKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiBhKDMsIDQpOworICAgIGZsb2F0KiBhX2RhdGEgPSBhLmRhdGEoKTsKKyAgICBhX2RhdGFbMF0gPSAxMjMuNDVmOworICAgIGNvdXQgPDwgImEoMCwgMCk6ICIgPDwgYSgwLCAwKTsKKyAgICA9PiBhKDAsIDApOiAxMjMuNDUKKworCisjIyBUZW5zb3IgT3BlcmF0aW9ucworCitBbGwgdGhlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdyByZXR1cm4gbm9uIGV2YWx1YXRlZCB0ZW5zb3IgYGBgT3BlcmF0aW9uc2BgYC4KK1RoZXNlIGNhbiBiZSBjaGFpbmVkOiB5b3UgY2FuIGFwcGx5IGFub3RoZXIgVGVuc29yIE9wZXJhdGlvbiB0byB0aGUgdmFsdWUKK3JldHVybmVkIGJ5IHRoZSBtZXRob2QuCisKK1RoZSBjaGFpbiBvZiBPcGVyYXRpb24gaXMgZXZhbHVhdGVkIGxhemlseSwgdHlwaWNhbGx5IHdoZW4gaXQgaXMgYXNzaWduZWQgdG8gYQordGVuc29yLiAgU2VlICJDb250cm9sbGluZyB3aGVuIEV4cHJlc3Npb24gYXJlIEV2YWx1YXRlZCIgZm9yIG1vcmUgZGV0YWlscyBhYm91dAordGhlaXIgZXZhbHVhdGlvbi4KKworIyMjIDxPcGVyYXRpb24+IGNvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHRlbnNvciBidXQKK3doZXJlIGFsbCBlbGVtZW50cyBoYXZlIHRoZSB2YWx1ZSBgYGB2YWxgYGAuCisKK1RoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB5b3Ugd2FudCB0byBhZGQgb3Igc3VidHJhY3QgYSBjb25zdGFudCBmcm9tIGEKK3RlbnNvciwgb3IgbXVsdGlwbHkgZXZlcnkgZWxlbWVudCBvZiBhIHRlbnNvciBieSBhIHNjYWxhci4KKworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRDb25zdGFudCgxLjBmKTsKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiBiID0gYSArIGEuY29uc3RhbnQoMi4wZik7CisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYyA9IGIgKiBiLmNvbnN0YW50KDAuMmYpOworICAgIGNvdXQgPDwgImEiIDw8IGVuZGwgPDwgYSA8PCBlbmRsIDw8IGVuZGw7CisgICAgY291dCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJjIiA8PCBlbmRsIDw8IGMgPDwgZW5kbCA8PCBlbmRsOworICAgID0+CisgICAgYQorICAgIDEgMSAxCisgICAgMSAxIDEKKworICAgIGIKKyAgICAzIDMgMworICAgIDMgMyAzCisKKyAgICBjCisgICAgMC42IDAuNiAwLjYKKyAgICAwLjYgMC42IDAuNgorCisjIyMgPE9wZXJhdGlvbj4gcmFuZG9tKCkKKworUmV0dXJucyBhIHRlbnNvciBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkaW1lbnNpb25zIGFzIHRoZSBjdXJyZW50IHRlbnNvcgorYnV0IHdoZXJlIGFsbCBlbGVtZW50cyBoYXZlIHJhbmRvbSB2YWx1ZXMuCisKK1RoaXMgaXMgZm9yIGV4YW1wbGUgdXNlZnVsIHRvIGFkZCByYW5kb20gdmFsdWVzIHRvIGFuIGV4aXN0aW5nIHRlbnNvci4KK1RoZSBnZW5lcmF0aW9uIG9mIHJhbmRvbSB2YWx1ZXMgY2FuIGJlIGN1c3RvbWl6ZWQgaW4gdGhlIHNhbWUgbWFubmVyCithcyBmb3IgYGBgc2V0UmFuZG9tKClgYGAuCisKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiBhKDIsIDMpOworICAgIGEuc2V0Q29uc3RhbnQoMS4wZik7CisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYiA9IGEgKyBhLnJhbmRvbSgpOworICAgIGNvdXQgPDwgImEiIDw8IGVuZGwgPDwgYSA8PCBlbmRsIDw8IGVuZGw7CisgICAgY291dCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIGEKKyAgICAxIDEgMQorICAgIDEgMSAxCisKKyAgICBiCisgICAgMS42ODAzOCAgIDEuNTY2MiAgMS44MjMyOQorICAgIDAuNzg4NzY2ICAxLjU5Njg4IDAuMzk1MTAzCisKKworIyMgVW5hcnkgRWxlbWVudCBXaXNlIE9wZXJhdGlvbnMKKworQWxsIHRoZXNlIG9wZXJhdGlvbnMgdGFrZSBhIHNpbmdsZSBpbnB1dCB0ZW5zb3IgYXMgYXJndW1lbnQgYW5kIHJldHVybiBhIHRlbnNvcgorb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgdGVuc29yIHRvIHdoaWNoIHRoZXkgYXJlIGFwcGxpZWQuICBUaGUKK3JlcXVlc3RlZCBvcGVyYXRpb25zIGFyZSBhcHBsaWVkIHRvIGVhY2ggZWxlbWVudCBpbmRlcGVuZGVudGx5LgorCisjIyMgPE9wZXJhdGlvbj4gb3BlcmF0b3ItKCkKKworUmV0dXJucyBhIHRlbnNvciBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkaW1lbnNpb25zIGFzIHRoZSBvcmlnaW5hbCB0ZW5zb3IKK2NvbnRhaW5pbmcgdGhlIG9wcG9zaXRlIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29yLgorCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYSgyLCAzKTsKKyAgICBhLnNldENvbnN0YW50KDEuMGYpOworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+IGIgPSAtYTsKKyAgICBjb3V0IDw8ICJhIiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCBlbmRsOworICAgIGNvdXQgPDwgImIiIDw8IGVuZGwgPDwgYiA8PCBlbmRsIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgMSAxIDEKKyAgICAxIDEgMQorCisgICAgYgorICAgIC0xIC0xIC0xCisgICAgLTEgLTEgLTEKKworIyMjIDxPcGVyYXRpb24+IHNxcnQoKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHRlbnNvcgorY29udGFpbmluZyB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3IuCisKKyMjIyA8T3BlcmF0aW9uPiByc3FydCgpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgdGVuc29yCitjb250YWluaW5nIHRoZSBpbnZlcnNlIHNxdWFyZSByb290cyBvZiB0aGUgb3JpZ2luYWwgdGVuc29yLgorCisjIyMgPE9wZXJhdGlvbj4gc3F1YXJlKCkKKworUmV0dXJucyBhIHRlbnNvciBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkaW1lbnNpb25zIGFzIHRoZSBvcmlnaW5hbCB0ZW5zb3IKK2NvbnRhaW5pbmcgdGhlIHNxdWFyZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvciB2YWx1ZXMuCisKKyMjIyA8T3BlcmF0aW9uPiBpbnZlcnNlKCkKKworUmV0dXJucyBhIHRlbnNvciBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkaW1lbnNpb25zIGFzIHRoZSBvcmlnaW5hbCB0ZW5zb3IKK2NvbnRhaW5pbmcgdGhlIGludmVyc2Ugb2YgdGhlIG9yaWdpbmFsIHRlbnNvciB2YWx1ZXMuCisKKyMjIyA8T3BlcmF0aW9uPiBleHAoKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHRlbnNvcgorY29udGFpbmluZyB0aGUgZXhwb25lbnRpYWwgb2YgdGhlIG9yaWdpbmFsIHRlbnNvci4KKworIyMjIDxPcGVyYXRpb24+IGxvZygpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgdGVuc29yCitjb250YWluaW5nIHRoZSBuYXR1cmFsIGxvZ2FyaXRobXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvci4KKworIyMjIDxPcGVyYXRpb24+IGFicygpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgdGVuc29yCitjb250YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvci4KKworIyMjIDxPcGVyYXRpb24+IHBvdyhTY2FsYXIgZXhwb25lbnQpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgdGVuc29yCitjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvciB0byB0aGUgcG93ZXIgb2YgdGhlCitleHBvbmVudC4KKworVGhlIHR5cGUgb2YgdGhlIGV4cG9uZW50LCBTY2FsYXIsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUKK3RlbnNvciBjb2VmZmljaWVudHMuICBGb3IgZXhhbXBsZSwgb25seSBpbnRlZ2VyIGV4cG9uZW50cyBjYW4gYmUgdXNlZCBpbgorY29uanVudGlvbiB3aXRoIHRlbnNvcnMgb2YgaW50ZWdlciB2YWx1ZXMuCisKK1lvdSBjYW4gdXNlIGNhc3QoKSB0byBsaWZ0IHRoaXMgcmVzdHJpY3Rpb24uICBGb3IgZXhhbXBsZSB0aGlzIGNvbXB1dGVzCitjdWJpYyByb290cyBvZiBhbiBpbnQgVGVuc29yOgorCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRWYWx1ZXMoe3swLCAxLCA4fSwgezI3LCA2NCwgMTI1fX0pOworICAgIEVpZ2VuOjpUZW5zb3I8ZG91YmxlLCAyPiBiID0gYS5jYXN0PGRvdWJsZT4oKS5wb3coMS4wIC8gMy4wKTsKKyAgICBjb3V0IDw8ICJhIiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCBlbmRsOworICAgIGNvdXQgPDwgImIiIDw8IGVuZGwgPDwgYiA8PCBlbmRsIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgMCAgIDEgICA4CisgICAgMjcgIDY0IDEyNQorCisgICAgYgorICAgIDAgMSAyCisgICAgMyA0IDUKKworIyMjIDxPcGVyYXRpb24+ICBvcGVyYXRvciAqIChTY2FsYXIgc2NhbGUpCisKK011bHRpcGxpZXMgYWxsIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIGlucHV0IHRlbnNvciBieSB0aGUgcHJvdmlkZWQgc2NhbGUuCisKKyMjIyA8T3BlcmF0aW9uPiAgY3dpc2VNYXgoU2NhbGFyIHRocmVzaG9sZCkKK1RPRE8KKworIyMjIDxPcGVyYXRpb24+ICBjd2lzZU1pbihTY2FsYXIgdGhyZXNob2xkKQorVE9ETworCisjIyMgPE9wZXJhdGlvbj4gIHVuYXJ5RXhwcihjb25zdCBDdXN0b21VbmFyeU9wJiBmdW5jKQorVE9ETworCisKKyMjIEJpbmFyeSBFbGVtZW50IFdpc2UgT3BlcmF0aW9ucworCitUaGVzZSBvcGVyYXRpb25zIHRha2UgdHdvIGlucHV0IHRlbnNvcnMgYXMgYXJndW1lbnRzLiBUaGUgMiBpbnB1dCB0ZW5zb3JzIHNob3VsZAorYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucy4gVGhlIHJlc3VsdCBpcyBhIHRlbnNvciBvZiB0aGUgc2FtZQorZGltZW5zaW9ucyBhcyB0aGUgdGVuc29ycyB0byB3aGljaCB0aGV5IGFyZSBhcHBsaWVkLCBhbmQgdW5sZXNzIG90aGVyd2lzZQorc3BlY2lmaWVkIGl0IGlzIGFsc28gb2YgdGhlIHNhbWUgdHlwZS4gVGhlIHJlcXVlc3RlZCBvcGVyYXRpb25zIGFyZSBhcHBsaWVkIHRvCitlYWNoIHBhaXIgb2YgZWxlbWVudHMgaW5kZXBlbmRlbnRseS4KKworIyMjIDxPcGVyYXRpb24+IG9wZXJhdG9yKyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGRpbWVuc2lvbnMgYXMgdGhlIGlucHV0IHRlbnNvcnMKK2NvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IHdpc2Ugc3VtcyBvZiB0aGUgaW5wdXRzLgorCisjIyMgPE9wZXJhdGlvbj4gb3BlcmF0b3ItKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQgdGVuc29ycworY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgd2lzZSBkaWZmZXJlbmNlcyBvZiB0aGUgaW5wdXRzLgorCisjIyMgPE9wZXJhdGlvbj4gb3BlcmF0b3IqKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQgdGVuc29ycworY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgd2lzZSBwcm9kdWN0cyBvZiB0aGUgaW5wdXRzLgorCisjIyMgPE9wZXJhdGlvbj4gb3BlcmF0b3IvKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgdGhlIHNhbWUgdHlwZSBhbmQgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQgdGVuc29ycworY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgd2lzZSBxdW90aWVudHMgb2YgdGhlIGlucHV0cy4KKworVGhpcyBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkIGZvciBpbnRlZ2VyIHR5cGVzLgorCisjIyMgPE9wZXJhdGlvbj4gY3dpc2VNYXgoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKworUmV0dXJucyBhIHRlbnNvciBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkaW1lbnNpb25zIGFzIHRoZSBpbnB1dCB0ZW5zb3JzCitjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCB3aXNlIG1heGltdW1zIG9mIHRoZSBpbnB1dHMuCisKKyMjIyA8T3BlcmF0aW9uPiBjd2lzZU1pbihjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGRpbWVuc2lvbnMgYXMgdGhlIGlucHV0IHRlbnNvcnMKK2NvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IHdpc2UgbWltaW11bXMgb2YgdGhlIGlucHV0cy4KKworIyMjIDxPcGVyYXRpb24+IExvZ2ljYWwgb3BlcmF0b3JzCisKK1RoZSBmb2xsb3dpbmcgbG9naWNhbCBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsOgorCisqICAgb3BlcmF0b3ImJihjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorKiAgIG9wZXJhdG9yfHwoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyogICBvcGVyYXRvcjwoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyogICBvcGVyYXRvcjw9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisqICAgb3BlcmF0b3I+KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisqICAgb3BlcmF0b3I+PShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorKiAgIG9wZXJhdG9yPT0oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyogICBvcGVyYXRvciE9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisKK1RoZXkgYWxsIHJldHVybiBhIHRlbnNvciBvZiBib29sZWFuIHZhbHVlcy4KKworCisjIyBTZWxlY3Rpb24gKHNlbGVjdChjb25zdCBUaGVuRGVyaXZlZCYgdGhlblRlbnNvciwgY29uc3QgRWxzZURlcml2ZWQmIGVsc2VUZW5zb3IpCisKK1NlbGVjdGlvbiBpcyBhIGNvZWZmaWNpZW50LXdpc2UgdGVybmFyeSBvcGVyYXRvciB0aGF0IGlzIHRoZSB0ZW5zb3IgZXF1aXZhbGVudAordG8gdGhlIGlmLXRoZW4tZWxzZSBvcGVyYXRpb24uCisKKyAgICBUZW5zb3I8Ym9vbCwgMz4gaWYgPSAuLi47CisgICAgVGVuc29yPGZsb2F0LCAzPiB0aGVuID0gLi4uOworICAgIFRlbnNvcjxmbG9hdCwgMz4gZWxzZSA9IC4uLjsKKyAgICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCA9IGlmLnNlbGVjdCh0aGVuLCBlbHNlKTsKKworVGhlIDMgYXJndW1lbnRzIG11c3QgYmUgb2YgdGhlIHNhbWUgZGltZW5zaW9ucywgd2hpY2ggd2lsbCBhbHNvIGJlIHRoZSBkaW1lbnNpb24KK29mIHRoZSByZXN1bHQuICBUaGUgJ2lmJyB0ZW5zb3IgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHRoZSAndGhlbicgYW5kIHRoZQorJ2Vsc2UnIHRlbnNvciBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUsIHdoaWNoIHdpbGwgYWxzbyBiZSB0aGUgdHlwZSBvZiB0aGUKK3Jlc3VsdC4KKworRWFjaCBjb2VmZmljaWVudCBpbiB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGluIHRoZQorJ3RoZW4nIHRlbnNvciBpZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgJ2lmJyB0ZW5zb3IgaXMgdHJ1ZS4gSWYgbm90LCB0aGUKK3Jlc3VsdGluZyBjb2VmZmljaWVudCB3aWxsIGNvbWUgZnJvbSB0aGUgJ2Vsc2UnIHRlbnNvci4KKworCisjIyBDb250cmFjdGlvbgorCitUZW5zb3IgKmNvbnRyYWN0aW9ucyogYXJlIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIG1hdHJpeCBwcm9kdWN0IHRvIHRoZQorbXVsdGlkaW1lbnNpb25hbCBjYXNlLgorCisgICAgLy8gQ3JlYXRlIDIgbWF0cmljZXMgdXNpbmcgdGVuc29ycyBvZiByYW5rIDIKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSgyLCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezEsIDIsIDN9LCB7NiwgNSwgNH19KTsKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYigzLCAyKTsKKyAgICBhLnNldFZhbHVlcyh7ezEsIDJ9LCB7NCwgNX0sIHs1LCA2fX0pOworCisgICAgLy8gQ29tcHV0ZSB0aGUgdHJhZGl0aW9uYWwgbWF0cml4IHByb2R1Y3QKKyAgICBhcnJheTxJbmRleFBhaXI8aW50PiwgMT4gcHJvZHVjdF9kaW1zID0geyBJbmRleFBhaXIoMSwgMCkgfTsKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gQUIgPSBhLmNvbnRyYWN0KGIsIHByb2R1Y3RfZGltcyk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlIG1hdHJpY2VzCisgICAgYXJyYXk8SW5kZXhQYWlyPGludD4sIDE+IHRyYW5zcG9zZV9wcm9kdWN0X2RpbXMgPSB7IEluZGV4UGFpcigwLCAxKSB9OworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBBdEJ0ID0gYS5jb250cmFjdChiLCB0cmFuc3Bvc2VkX3Byb2R1Y3RfZGltcyk7CisKKworIyMgUmVkdWN0aW9uIE9wZXJhdGlvbnMKKworQSAqUmVkdWN0aW9uKiBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciB3aXRoIGZld2VyIGRpbWVuc2lvbnMgdGhhbiB0aGUKK29yaWdpbmFsIHRlbnNvci4gIFRoZSB2YWx1ZXMgaW4gdGhlIHJldHVybmVkIHRlbnNvciBhcmUgY29tcHV0ZWQgYnkgYXBwbHlpbmcgYQorKnJlZHVjdGlvbiBvcGVyYXRvciogdG8gc2xpY2VzIG9mIHZhbHVlcyBmcm9tIHRoZSBvcmlnaW5hbCB0ZW5zb3IuICBZb3Ugc3BlY2lmeQordGhlIGRpbWVuc2lvbnMgYWxvbmcgd2hpY2ggdGhlIHNsaWNlcyBhcmUgbWFkZS4KKworVGhlIEVpZ2VuIFRlbnNvciBsaWJyYXJ5IHByb3ZpZGVzIGEgc2V0IG9mIHByZWRlZmluZWQgcmVkdWN0aW9uIG9wZXJhdG9ycyBzdWNoCithcyBgYGBtYXhpbXVtKClgYGAgYW5kIGBgYHN1bSgpYGBgIGFuZCBsZXRzIHlvdSBkZWZpbmUgYWRkaXRpb25hbCBvcGVyYXRvcnMgYnkKK2ltcGxlbWVudGluZyBhIGZldyBtZXRob2RzIGZyb20gYSByZWR1Y3RvciB0ZW1wbGF0ZS4KKworIyMjIFJlZHVjdGlvbiBEaW1lbnNpb25zCisKK0FsbCByZWR1Y3Rpb24gb3BlcmF0aW9ucyB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlciBvZiB0eXBlCitgYGA8VGVuc29yVHlwZT46OkRpbWVuc2lvbnNgYGAgd2hpY2ggY2FuIGFsd2F5cyBiZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2YKK2ludHMuICBUaGVzZSBhcmUgY2FsbGVkIHRoZSAicmVkdWN0aW9uIGRpbWVuc2lvbnMuIiAgVGhlIHZhbHVlcyBhcmUgdGhlIGluZGljZXMKK29mIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCB0ZW5zb3Igb3ZlciB3aGljaCB0aGUgcmVkdWN0aW9uIGlzIGRvbmUuICBUaGUKK3BhcmFtZXRlciBjYW4gaGF2ZSBhdCBtb3N0IGFzIG1hbnkgZWxlbWVudCBhcyB0aGUgcmFuayBvZiB0aGUgaW5wdXQgdGVuc29yOworZWFjaCBlbGVtZW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSB0ZW5zb3IgcmFuaywgYXMgaXQgaW5kaWNhdGVzIG9uZSBvZiB0aGUKK2RpbWVuc2lvbnMgdG8gcmVkdWNlLgorCitFYWNoIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXQgdGVuc29yIHNob3VsZCBvY2N1ciBhdCBtb3N0IG9uY2UgaW4gdGhlIHJlZHVjdGlvbgorZGltZW5zaW9ucyBhcyB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVtb3ZlIGR1cGxpY2F0ZXMuCisKK1RoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGluIHRoZSByZWR1Y3Rpb24gZGltZW5zaW9ucyBkb2VzIG5vdCBhZmZlY3QgdGhlCityZXN1bHRzLCBidXQgdGhlIGNvZGUgbWF5IGV4ZWN1dGUgZmFzdGVyIGlmIHlvdSBsaXN0IHRoZSBkaW1lbnNpb25zIGluCitpbmNyZWFzaW5nIG9yZGVyLgorCitFeGFtcGxlOiBSZWR1Y3Rpb24gYWxvbmcgb25lIGRpbWVuc2lvbi4KKworICAgIC8vIENyZWF0ZSBhIHRlbnNvciBvZiAyIGRpbWVuc2lvbnMKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSgyLCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezEsIDIsIDN9LCB7NiwgNSwgNH19KTsKKyAgICAvLyBSZWR1Y2UgaXQgYWxvbmcgdGhlIHNlY29uZCBkaW1lbnNpb24gKDEpLi4uCisgICAgRWlnZW46OmFycmF5PGludCwgMT4gZGltcyh7MSAvKiBkaW1lbnNpb24gdG8gcmVkdWNlICovfSk7CisgICAgLy8gLi4udXNpbmcgdGhlICJtYXhpbXVtIiBvcGVyYXRvci4KKyAgICAvLyBUaGUgcmVzdWx0IGlzIGEgdGVuc29yIHdpdGggb25lIGRpbWVuc2lvbi4gIFRoZSBzaXplIG9mCisgICAgLy8gdGhhdCBkaW1lbnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IChub24tcmVkdWNlZCkgZGltZW5zaW9uIG9mIGEuCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDE+IGIgPSBhLm1heGltdW0oZGltcyk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJiIiA8PCBlbmRsIDw8IGIgPDwgZW5kbCA8PCBlbmRsOworICAgID0+CisgICAgYQorICAgIDEgMiAzCisgICAgNiA1IDQKKworICAgIGIKKyAgICAzCisgICAgNgorCitFeGFtcGxlOiBSZWR1Y3Rpb24gYWxvbmcgdHdvIGRpbWVuc2lvbnMuCisKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzLCBFaWdlbjo6Q29sTWFqb3I+IGEoMiwgMywgNCk7CisgICAgYS5zZXRWYWx1ZXMoe3t7MC4wZiwgMS4wZiwgMi4wZiwgMy4wZn0sCisgICAgICAgICAgICAgICAgICB7Ny4wZiwgNi4wZiwgNS4wZiwgNC4wZn0sCisgICAgICAgICAgICAgICAgICB7OC4wZiwgOS4wZiwgMTAuMGYsIDExLjBmfX0sCisgICAgICAgICAgICAgICAgIHt7MTIuMGYsIDEzLjBmLCAxNC4wZiwgMTUuMGZ9LAorICAgICAgICAgICAgICAgICAgezE5LjBmLCAxOC4wZiwgMTcuMGYsIDE2LjBmfSwKKyAgICAgICAgICAgICAgICAgIHsyMC4wZiwgMjEuMGYsIDIyLjBmLCAyMy4wZn19fSk7CisgICAgLy8gVGhlIHRlbnNvciBhIGhhcyAzIGRpbWVuc2lvbnMuICBXZSByZWR1Y2UgYWxvbmcgdGhlCisgICAgLy8gZmlyc3QgMiwgcmVzdWx0aW5nIGluIGEgdGVuc29yIHdpdGggYSBzaW5nbGUgZGltZW5zaW9uCisgICAgLy8gb2Ygc2l6ZSA0ICh0aGUgbGFzdCBkaW1lbnNpb24gb2YgYS4pCisgICAgLy8gTm90ZSB0aGF0IHdlIHBhc3MgdGhlIGFycmF5IG9mIHJlZHVjdGlvbiBkaW1lbnNpb25zCisgICAgLy8gZGlyZWN0bHkgdG8gdGhlIG1heGltdW0oKSBjYWxsLgorICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIEVpZ2VuOjpDb2xNYWpvcj4gYiA9CisgICAgICAgIGEubWF4aW11bShFaWdlbjo6YXJyYXk8aW50LCAyPih7MCwgMX0pKTsKKyAgICBjb3V0IDw8ICJiIiA8PCBlbmRsIDw8IGIgPDwgZW5kbCA8PCBlbmRsOworICAgID0+CisgICAgYgorICAgIDIwCisgICAgMjEKKyAgICAyMgorICAgIDIzCisKKyMjIyMgUmVkdWN0aW9uIGFsb25nIGFsbCBkaW1lbnNpb25zCisKK0FzIGEgc3BlY2lhbCBjYXNlLCBpZiB5b3UgcGFzcyBubyBwYXJhbWV0ZXIgdG8gYSByZWR1Y3Rpb24gb3BlcmF0aW9uIHRoZQorb3JpZ2luYWwgdGVuc29yIGlzIHJlZHVjZWQgYWxvbmcgKmFsbCogaXRzIGRpbWVuc2lvbnMuICBUaGUgcmVzdWx0IGlzIGEKK3NjYWxhciwgcmVwcmVzZW50ZWQgYXMgYSB6ZXJvLWRpbWVuc2lvbiB0ZW5zb3IuCisKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBhKDIsIDMsIDQpOworICAgIGEuc2V0VmFsdWVzKHt7ezAuMGYsIDEuMGYsIDIuMGYsIDMuMGZ9LAorICAgICAgICAgICAgICAgICAgezcuMGYsIDYuMGYsIDUuMGYsIDQuMGZ9LAorICAgICAgICAgICAgICAgICAgezguMGYsIDkuMGYsIDEwLjBmLCAxMS4wZn19LAorICAgICAgICAgICAgICAgICB7ezEyLjBmLCAxMy4wZiwgMTQuMGYsIDE1LjBmfSwKKyAgICAgICAgICAgICAgICAgIHsxOS4wZiwgMTguMGYsIDE3LjBmLCAxNi4wZn0sCisgICAgICAgICAgICAgICAgICB7MjAuMGYsIDIxLjBmLCAyMi4wZiwgMjMuMGZ9fX0pOworICAgIC8vIFJlZHVjZSBhbG9uZyBhbGwgZGltZW5zaW9ucyB1c2luZyB0aGUgc3VtKCkgb3BlcmF0b3IuCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMD4gYiA9IGEuc3VtKCk7CisgICAgY291dCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICA9PgorICAgIGIKKyAgICAyNzYKKworCisjIyMgPE9wZXJhdGlvbj4gc3VtKGNvbnN0IERpbWVuc2lvbnMmIG5ld19kaW1zKQorIyMjIDxPcGVyYXRpb24+IHN1bSgpCisKK1JlZHVjZSBhIHRlbnNvciB1c2luZyB0aGUgc3VtKCkgb3BlcmF0b3IuICBUaGUgcmVzdWx0aW5nIHZhbHVlcworYXJlIHRoZSBzdW0gb2YgdGhlIHJlZHVjZWQgdmFsdWVzLgorCisjIyMgPE9wZXJhdGlvbj4gbWVhbihjb25zdCBEaW1lbnNpb25zJiBuZXdfZGltcykKKyMjIyA8T3BlcmF0aW9uPiBtZWFuKCkKKworUmVkdWNlIGEgdGVuc29yIHVzaW5nIHRoZSBtZWFuKCkgb3BlcmF0b3IuICBUaGUgcmVzdWx0aW5nIHZhbHVlcworYXJlIHRoZSBtZWFuIG9mIHRoZSByZWR1Y2VkIHZhbHVlcy4KKworIyMjIDxPcGVyYXRpb24+IG1heGltdW0oY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMpCisjIyMgPE9wZXJhdGlvbj4gbWF4aW11bSgpCisKK1JlZHVjZSBhIHRlbnNvciB1c2luZyB0aGUgbWF4aW11bSgpIG9wZXJhdG9yLiAgVGhlIHJlc3VsdGluZyB2YWx1ZXMgYXJlIHRoZQorbGFyZ2VzdCBvZiB0aGUgcmVkdWNlZCB2YWx1ZXMuCisKKyMjIyA8T3BlcmF0aW9uPiBtaW5pbXVtKGNvbnN0IERpbWVuc2lvbnMmIG5ld19kaW1zKQorIyMjIDxPcGVyYXRpb24+IG1pbmltdW0oKQorCitSZWR1Y2UgYSB0ZW5zb3IgdXNpbmcgdGhlIG1pbmltdW0oKSBvcGVyYXRvci4gIFRoZSByZXN1bHRpbmcgdmFsdWVzCithcmUgdGhlIHNtYWxsZXN0IG9mIHRoZSByZWR1Y2VkIHZhbHVlcy4KKworIyMjIDxPcGVyYXRpb24+IHByb2QoY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMpCisjIyMgPE9wZXJhdGlvbj4gcHJvZCgpCisKK1JlZHVjZSBhIHRlbnNvciB1c2luZyB0aGUgcHJvZCgpIG9wZXJhdG9yLiAgVGhlIHJlc3VsdGluZyB2YWx1ZXMKK2FyZSB0aGUgcHJvZHVjdCBvZiB0aGUgcmVkdWNlZCB2YWx1ZXMuCisKKyMjIyA8T3BlcmF0aW9uPiBhbGwoY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMpCisjIyMgPE9wZXJhdGlvbj4gYWxsKCkKK1JlZHVjZSBhIHRlbnNvciB1c2luZyB0aGUgYWxsKCkgb3BlcmF0b3IuICBDYXN0cyB0ZW5zb3IgdG8gYm9vbCBhbmQgdGhlbiBjaGVja3MKK3doZXRoZXIgYWxsIGVsZW1lbnRzIGFyZSB0cnVlLiAgUnVucyB0aHJvdWdoIGFsbCBlbGVtZW50cyByYXRoZXIgdGhhbgorc2hvcnQtY2lyY3VpdGluZywgc28gbWF5IGJlIHNpZ25pZmljYW50bHkgaW5lZmZpY2llbnQuCisKKyMjIyA8T3BlcmF0aW9uPiBhbnkoY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMpCisjIyMgPE9wZXJhdGlvbj4gYW55KCkKK1JlZHVjZSBhIHRlbnNvciB1c2luZyB0aGUgYW55KCkgb3BlcmF0b3IuICBDYXN0cyB0ZW5zb3IgdG8gYm9vbCBhbmQgdGhlbiBjaGVja3MKK3doZXRoZXIgYW55IGVsZW1lbnQgaXMgdHJ1ZS4gIFJ1bnMgdGhyb3VnaCBhbGwgZWxlbWVudHMgcmF0aGVyIHRoYW4KK3Nob3J0LWNpcmN1aXRpbmcsIHNvIG1heSBiZSBzaWduaWZpY2FudGx5IGluZWZmaWNpZW50LgorCisKKyMjIyA8T3BlcmF0aW9uPiByZWR1Y2UoY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMsIGNvbnN0IFJlZHVjZXImIHJlZHVjZXIpCisKK1JlZHVjZSBhIHRlbnNvciB1c2luZyBhIHVzZXItZGVmaW5lZCByZWR1Y3Rpb24gb3BlcmF0b3IuICBTZWUgYGBgU3VtUmVkdWNlcmBgYAoraW4gVGVuc29yRnVuY3RvcnMuaCBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGltcGxlbWVudCBhIHJlZHVjdGlvbiBvcGVyYXRvci4KKworCisjIyBTY2FuIE9wZXJhdGlvbnMKKworQSAqU2Nhbiogb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBvcmlnaW5hbAordGVuc29yLiBUaGUgb3BlcmF0aW9uIHBlcmZvcm1zIGFuIGluY2x1c2l2ZSBzY2FuIGFsb25nIHRoZSBzcGVjaWZpZWQKK2F4aXMsIHdoaWNoIG1lYW5zIGl0IGNvbXB1dGVzIGEgcnVubmluZyB0b3RhbCBhbG9uZyB0aGUgYXhpcyBmb3IgYSBnaXZlbgorcmVkdWN0aW9uIG9wZXJhdGlvbi4KK0lmIHRoZSByZWR1Y3Rpb24gb3BlcmF0aW9uIGNvcnJlc3BvbmRzIHRvIHN1bW1hdGlvbiwgdGhlbiB0aGlzIGNvbXB1dGVzIHRoZQorcHJlZml4IHN1bSBvZiB0aGUgdGVuc29yIGFsb25nIHRoZSBnaXZlbiBheGlzLgorCitFeGFtcGxlOgorZGQgYSBjb21tZW50IHRvIHRoaXMgbGluZQorCisgICAgLy8gQ3JlYXRlIGEgdGVuc29yIG9mIDIgZGltZW5zaW9ucworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBhKDIsIDMpOworICAgIGEuc2V0VmFsdWVzKHt7MSwgMiwgM30sIHs0LCA1LCA2fX0pOworICAgIC8vIFNjYW4gaXQgYWxvbmcgdGhlIHNlY29uZCBkaW1lbnNpb24gKDEpIHVzaW5nIHN1bW1hdGlvbgorICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBiID0gYS5jdW1zdW0oMSk7CisgICAgLy8gVGhlIHJlc3VsdCBpcyBhIHRlbnNvciB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIGlucHV0CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJiIiA8PCBlbmRsIDw8IGIgPDwgZW5kbCA8PCBlbmRsOworICAgID0+CisgICAgYQorICAgIDEgMiAzCisgICAgNiA1IDQKKworICAgIGIKKyAgICAxICAzICA2CisgICAgNCAgOSAxNQorCisjIyMgPE9wZXJhdGlvbj4gY3Vtc3VtKGNvbnN0IEluZGV4JiBheGlzKQorCitQZXJmb3JtIGEgc2NhbiBieSBzdW1taW5nIGNvbnNlY3V0aXZlIGVudHJpZXMuCisKKyMjIyA8T3BlcmF0aW9uPiBjdW1wcm9kKGNvbnN0IEluZGV4JiBheGlzKQorCitQZXJmb3JtIGEgc2NhbiBieSBtdWx0aXBseWluZyBjb25zZWN1dGl2ZSBlbnRyaWVzLgorCisKKyMjIENvbnZvbHV0aW9ucworCisjIyMgPE9wZXJhdGlvbj4gY29udm9sdmUoY29uc3QgS2VybmVsJiBrZXJuZWwsIGNvbnN0IERpbWVuc2lvbnMmIGRpbXMpCisKK1JldHVybnMgYSB0ZW5zb3IgdGhhdCBpcyB0aGUgb3V0cHV0IG9mIHRoZSBjb252b2x1dGlvbiBvZiB0aGUgaW5wdXQgdGVuc29yIHdpdGggdGhlIGtlcm5lbCwKK2Fsb25nIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9ucyBvZiB0aGUgaW5wdXQgdGVuc29yLiBUaGUgZGltZW5zaW9uIHNpemUgZm9yIGRpbWVuc2lvbnMgb2YgdGhlIG91dHB1dCB0ZW5zb3IKK3doaWNoIHdlcmUgcGFydCBvZiB0aGUgY29udm9sdXRpb24gd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBmb3JtdWxhOgorb3V0cHV0X2RpbV9zaXplID0gaW5wdXRfZGltX3NpemUgLSBrZXJuZWxfZGltX3NpemUgKyAxIChyZXF1aXJlczogaW5wdXRfZGltX3NpemUgPj0ga2VybmVsX2RpbV9zaXplKS4KK1RoZSBkaW1lbnNpb24gc2l6ZXMgZm9yIGRpbWVuc2lvbnMgdGhhdCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBjb252b2x1dGlvbiB3aWxsIHJlbWFpbiB0aGUgc2FtZS4KK1BlcmZvcm1hbmNlIG9mIHRoZSBjb252b2x1dGlvbiBjYW4gZGVwZW5kIG9uIHRoZSBsZW5ndGggb2YgdGhlIHN0cmlkZShzKSBvZiB0aGUgaW5wdXQgdGVuc29yIGRpbWVuc2lvbihzKSBhbG9uZyB3aGljaCB0aGUKK2NvbnZvbHV0aW9uIGlzIGNvbXB1dGVkICh0aGUgZmlyc3QgZGltZW5zaW9uIGhhcyB0aGUgc2hvcnRlc3Qgc3RyaWRlIGZvciBDb2xNYWpvciwgd2hlcmVhcyBSb3dNYWpvcidzIHNob3J0ZXN0IHN0cmlkZSBpcworZm9yIHRoZSBsYXN0IGRpbWVuc2lvbikuCisKKyAgICAvLyBDb21wdXRlIGNvbnZvbHV0aW9uIGFsb25nIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGRpbWVuc2lvbi4KKyAgICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0KDMsIDMsIDcsIDExKTsKKyAgICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IGtlcm5lbCgyLCAyKTsKKyAgICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IG91dHB1dCgzLCAyLCA2LCAxMSk7CisgICAgaW5wdXQuc2V0UmFuZG9tKCk7CisgICAga2VybmVsLnNldFJhbmRvbSgpOworCisgICAgRWlnZW46OmFycmF5PHB0cmRpZmZfdCwgMj4gZGltcyh7MSwgMn0pOyAgLy8gU3BlY2lmeSBzZWNvbmQgYW5kIHRoaXJkIGRpbWVuc2lvbiBmb3IgY29udm9sdXRpb24uCisgICAgb3V0cHV0ID0gaW5wdXQuY29udm9sdmUoa2VybmVsLCBkaW1zKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDY7ICsraykgeworICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTE7ICsrbCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0cHV0KGksaixrLGwpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dChpLGorMCxrKzAsbCkgKiBrZXJuZWwoMCwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisxLGsrMCxsKSAqIGtlcm5lbCgxLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwpICoga2VybmVsKDAsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzEsbCkgKiBrZXJuZWwoMSwxKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0LCBleHBlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisKKyMjIEdlb21ldHJpY2FsIE9wZXJhdGlvbnMKKworVGhlc2Ugb3BlcmF0aW9ucyByZXR1cm4gYSBUZW5zb3Igd2l0aCBkaWZmZXJlbnQgZGltZW5zaW9ucyB0aGFuIHRoZSBvcmlnaW5hbAorVGVuc29yLiAgVGhleSBjYW4gYmUgdXNlZCB0byBhY2Nlc3Mgc2xpY2VzIG9mIHRlbnNvcnMsIHNlZSB0aGVtIHdpdGggZGlmZmVyZW50CitkaW1lbnNpb25zLCBvciBwYWQgdGVuc29ycyB3aXRoIGFkZGl0aW9uYWwgZGF0YS4KKworIyMjIDxPcGVyYXRpb24+IHJlc2hhcGUoY29uc3QgRGltZW5zaW9ucyYgbmV3X2RpbXMpCisKK1JldHVybnMgYSB2aWV3IG9mIHRoZSBpbnB1dCB0ZW5zb3IgdGhhdCBoYXMgYmVlbiByZXNoYXBlZCB0byB0aGUgc3BlY2lmaWVkCituZXcgZGltZW5zaW9ucy4gIFRoZSBhcmd1bWVudCBuZXdfZGltcyBpcyBhbiBhcnJheSBvZiBJbmRleCB2YWx1ZXMuICBUaGUKK3Jhbmsgb2YgdGhlIHJlc3VsdGluZyB0ZW5zb3IgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBuZXdfZGltcy4KKworVGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSBzaXplcyBpbiB0aGUgbmV3IGRpbWVuc2lvbiBhcnJheSBtdXN0IGJlIGVxdWFsIHRvCit0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCB0ZW5zb3IuCisKKyAgICAvLyBJbmNyZWFzZSB0aGUgcmFuayBvZiB0aGUgaW5wdXQgdGVuc29yIGJ5IGludHJvZHVjaW5nIGEgbmV3IGRpbWVuc2lvbgorICAgIC8vIG9mIHNpemUgMS4KKyAgICBUZW5zb3I8ZmxvYXQsIDI+IGlucHV0KDcsIDExKTsKKyAgICBhcnJheTxpbnQsIDM+IHRocmVlX2RpbXN7ezcsIDExLCAxfX07CisgICAgVGVuc29yPGZsb2F0LCAzPiByZXN1bHQgPSBpbnB1dC5yZXNoYXBlKHRocmVlX2RpbXMpOworCisgICAgLy8gRGVjcmVhc2UgdGhlIHJhbmsgb2YgdGhlIGlucHV0IHRlbnNvciBieSBtZXJnaW5nIDIgZGltZW5zaW9uczsKKyAgICBhcnJheTxpbnQsIDE+IG9uZV9kaW17ezcgKiAxMX19OworICAgIFRlbnNvcjxmbG9hdCwgMT4gcmVzdWx0ID0gaW5wdXQucmVzaGFwZShvbmVfZGltKTsKKworVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgbW92ZSBhbnkgZGF0YSBpbiB0aGUgaW5wdXQgdGVuc29yLCBzbyB0aGUgcmVzdWx0aW5nCitjb250ZW50cyBvZiBhIHJlc2hhcGVkIFRlbnNvciBkZXBlbmQgb24gdGhlIGRhdGEgbGF5b3V0IG9mIHRoZSBvcmlnaW5hbCBUZW5zb3IuCisKK0ZvciBleGFtcGxlIHRoaXMgaXMgd2hhdCBoYXBwZW5zIHdoZW4geW91IGBgYHJlc2hhcGUoKWBgYCBhIDJEIENvbE1ham9yIHRlbnNvcgordG8gb25lIGRpbWVuc2lvbjoKKworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDIsIEVpZ2VuOjpDb2xNYWpvcj4gYSgyLCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezAuMGYsIDEwMC4wZiwgMjAwLjBmfSwgezMwMC4wZiwgNDAwLjBmLCA1MDAuMGZ9fSk7CisgICAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPiBvbmVfZGltKHszICogMn0pOworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIEVpZ2VuOjpDb2xNYWpvcj4gYiA9IGEucmVzaGFwZShvbmVfZGltKTsKKyAgICBjb3V0IDw8ICJiIiA8PCBlbmRsIDw8IGIgPDwgZW5kbDsKKyAgICA9PgorICAgIGIKKyAgICAgIDAKKyAgICAzMDAKKyAgICAxMDAKKyAgICA0MDAKKyAgICAyMDAKKyAgICA1MDAKKworVGhpcyBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgMkQgVGVuc29yIGlzIFJvd01ham9yOgorCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRWlnZW46OlJvd01ham9yPiBhKDIsIDMpOworICAgIGEuc2V0VmFsdWVzKHt7MC4wZiwgMTAwLjBmLCAyMDAuMGZ9LCB7MzAwLjBmLCA0MDAuMGYsIDUwMC4wZn19KTsKKyAgICBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+IG9uZV9kaW0oezMgKiAyfSk7CisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgRWlnZW46OlJvd01ham9yPiBiID0gYS5yZXNoYXBlKG9uZV9kaW0pOworICAgIGNvdXQgPDwgImIiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOworICAgID0+CisgICAgYgorICAgICAgMAorICAgIDEwMAorICAgIDIwMAorICAgIDMwMAorICAgIDQwMAorICAgIDUwMAorCitUaGUgcmVzaGFwZSBvcGVyYXRpb24gaXMgYSBsdmFsdWUuIEluIG90aGVyIHdvcmRzLCBpdCBjYW4gYmUgdXNlZCBvbiB0aGUgbGVmdAorc2lkZSBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KKworVGhlIHByZXZpb3VzIGV4YW1wbGUgY2FuIGJlIHJld3JpdHRlbiBhcyBmb2xsb3c6CisKKyAgICBFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBFaWdlbjo6Q29sTWFqb3I+IGEoMiwgMyk7CisgICAgYS5zZXRWYWx1ZXMoe3swLjBmLCAxMDAuMGYsIDIwMC4wZn0sIHszMDAuMGYsIDQwMC4wZiwgNTAwLjBmfX0pOworICAgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMj4gdHdvX2RpbSh7MiwgM30pOworICAgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIEVpZ2VuOjpDb2xNYWpvcj4gYjsKKyAgICBiLnJlc2hhcGUodHdvX2RpbSkgPSBhOworICAgIGNvdXQgPDwgImIiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOworICAgID0+CisgICAgYgorICAgICAgMAorICAgIDMwMAorICAgIDEwMAorICAgIDQwMAorICAgIDIwMAorICAgIDUwMAorCitOb3RlIHRoYXQgImIiIGl0c2VsZiB3YXMgbm90IHJlc2hhcGVkIGJ1dCB0aGF0IGluc3RlYWQgdGhlIGFzc2lnbm1lbnQgaXMgZG9uZSB0bwordGhlIHJlc2hhcGUgdmlldyBvZiBiLgorCisKKyMjIyA8T3BlcmF0aW9uPiBzaHVmZmxlKGNvbnN0IFNodWZmbGUmIHNodWZmbGUpCisKK1JldHVybnMgYSBjb3B5IG9mIHRoZSBpbnB1dCB0ZW5zb3Igd2hvc2UgZGltZW5zaW9ucyBoYXZlIGJlZW4KK3Jlb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwZXJtdXRhdGlvbi4gVGhlIGFyZ3VtZW50IHNodWZmbGUKK2lzIGFuIGFycmF5IG9mIEluZGV4IHZhbHVlcy4gSXRzIHNpemUgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0Cit0ZW5zb3IuIEl0IG11c3QgY29udGFpbiBhIHBlcm11dGF0aW9uIG9mIDAsIDEsIC4uLiwgcmFuayAtIDEuIFRoZSBpLXRoCitkaW1lbnNpb24gb2YgdGhlIG91dHB1dCB0ZW5zb3IgZXF1YWxzIHRvIHRoZSBzaXplIG9mIHRoZSBzaHVmZmxlW2ldLXRoCitkaW1lbnNpb24gb2YgdGhlIGlucHV0IHRlbnNvci4gRm9yIGV4YW1wbGU6CisKKyAgICAvLyBTaHVmZmxlIGFsbCBkaW1lbnNpb25zIHRvIHRoZSBsZWZ0IGJ5IDEuCisgICAgVGVuc29yPGZsb2F0LCAzPiBpbnB1dCgyMCwgMzAsIDUwKTsKKyAgICAvLyAuLi4gc2V0IHNvbWUgdmFsdWVzIGluIGlucHV0LgorICAgIFRlbnNvcjxmbG9hdCwgMz4gb3V0cHV0ID0gaW5wdXQuc2h1ZmZsZSh7MSwgMiwgMH0pCisKKyAgICBlaWdlbl9hc3NlcnQob3V0cHV0LmRpbWVuc2lvbigwKSA9PSAzMCk7CisgICAgZWlnZW5fYXNzZXJ0KG91dHB1dC5kaW1lbnNpb24oMSkgPT0gNTApOworICAgIGVpZ2VuX2Fzc2VydChvdXRwdXQuZGltZW5zaW9uKDIpID09IDIwKTsKKworSW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgdGVuc29yIGFyZSBzaHVmZmxlZCBhY2NvcmRpbmdseSB0byBmb3JtdWxhdGUKK2luZGljZXMgaW50byB0aGUgaW5wdXQgdGVuc29yLiBGb3IgZXhhbXBsZSwgb25lIGNhbiBhc3NlcnQgaW4gdGhlIGFib3ZlCitjb2RlIHNuaXBwZXQgdGhhdDoKKworICAgIGVpZ2VuX2Fzc2VydChvdXRwdXQoMywgNywgMTEpID09IGlucHV0KDExLCAzLCA3KSk7CisKK0luIGdlbmVyYWwsIG9uZSBjYW4gYXNzZXJ0IHRoYXQKKworICAgIGVpZ2VuX2Fzc2VydChvdXRwdXQoLi4uLCBpbmRpY2VzW3NodWZmbGVbaV1dLCAuLi4pID09CisgICAgICAgICAgICAgICAgIGlucHV0KC4uLiwgaW5kaWNlc1tpXSwgLi4uKSkKKworVGhlIHNodWZmbGUgb3BlcmF0aW9uIHJlc3VsdHMgaW4gYSBsdmFsdWUsIHdoaWNoIG1lYW5zIHRoYXQgaXQgY2FuIGJlIGFzc2lnbmVkCit0by4gSW4gb3RoZXIgd29yZHMsIGl0IGNhbiBiZSB1c2VkIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisKK0xldCdzIHJld3JpdGUgdGhlIHByZXZpb3VzIGV4YW1wbGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmZWF0dXJlOgorCisgICAgLy8gU2h1ZmZsZSBhbGwgZGltZW5zaW9ucyB0byB0aGUgbGVmdCBieSAxLgorICAgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMjAsIDMwLCA1MCk7CisgICAgLy8gLi4uIHNldCBzb21lIHZhbHVlcyBpbiBpbnB1dC4KKyAgICBUZW5zb3I8ZmxvYXQsIDM+IG91dHB1dCgzMCwgNTAsIDIwKTsKKyAgICBvdXRwdXQuc2h1ZmZsZSh7MiwgMCwgMX0pID0gaW5wdXQ7CisKKworIyMjIDxPcGVyYXRpb24+IHN0cmlkZShjb25zdCBTdHJpZGVzJiBzdHJpZGVzKQorCitSZXR1cm5zIGEgdmlldyBvZiB0aGUgaW5wdXQgdGVuc29yIHRoYXQgc3RyaWRlcyAoc2tpcHMgc3RyaWRlLTEKK2VsZW1lbnRzKSBhbG9uZyBlYWNoIG9mIHRoZSBkaW1lbnNpb25zLiAgVGhlIGFyZ3VtZW50IHN0cmlkZXMgaXMgYW4KK2FycmF5IG9mIEluZGV4IHZhbHVlcy4gIFRoZSBkaW1lbnNpb25zIG9mIHRoZSByZXN1bHRpbmcgdGVuc29yIGFyZQorY2VpbChpbnB1dF9kaW1lbnNpb25zW2ldIC8gc3RyaWRlc1tpXSkuCisKK0ZvciBleGFtcGxlIHRoaXMgaXMgd2hhdCBoYXBwZW5zIHdoZW4geW91IGBgYHN0cmlkZSgpYGBgIGEgMkQgdGVuc29yOgorCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDI+IGEoNCwgMyk7CisgICAgYS5zZXRWYWx1ZXMoe3swLCAxMDAsIDIwMH0sIHszMDAsIDQwMCwgNTAwfSwgezYwMCwgNzAwLCA4MDB9LCB7OTAwLCAxMDAwLCAxMTAwfX0pOworICAgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMj4gc3RyaWRlcyh7MywgMn0pOworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBiID0gYS5zdHJpZGUoc3RyaWRlcyk7CisgICAgY291dCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CisgICAgPT4KKyAgICBiCisgICAgICAgMCAgIDIwMAorICAgICA5MDAgIDExMDAKKworSXQgaXMgcG9zc2libGUgdG8gYXNzaWduIGEgdGVuc29yIHRvIGEgc3RyaWRlOgorICAgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMjAsIDMwLCA1MCk7CisgICAgLy8gLi4uIHNldCBzb21lIHZhbHVlcyBpbiBpbnB1dC4KKyAgICBUZW5zb3I8ZmxvYXQsIDM+IG91dHB1dCg0MCwgOTAsIDIwMCk7CisgICAgb3V0cHV0LnN0cmlkZSh7MiwgMywgNH0pID0gaW5wdXQ7CisKKworIyMjIDxPcGVyYXRpb24+IHNsaWNlKGNvbnN0IFN0YXJ0SW5kaWNlcyYgb2Zmc2V0cywgY29uc3QgU2l6ZXMmIGV4dGVudHMpCisKK1JldHVybnMgYSBzdWItdGVuc29yIG9mIHRoZSBnaXZlbiB0ZW5zb3IuIEZvciBlYWNoIGRpbWVuc2lvbiBpLCB0aGUgc2xpY2UgaXMKK21hZGUgb2YgdGhlIGNvZWZmaWNpZW50cyBzdG9yZWQgYmV0d2VlbiBvZmZzZXRbaV0gYW5kIG9mZnNldFtpXSArIGV4dGVudHNbaV0gaW4KK3RoZSBpbnB1dCB0ZW5zb3IuCisKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSg0LCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezAsIDEwMCwgMjAwfSwgezMwMCwgNDAwLCA1MDB9LAorICAgICAgICAgICAgICAgICB7NjAwLCA3MDAsIDgwMH0sIHs5MDAsIDEwMDAsIDExMDB9fSk7CisgICAgRWlnZW46OmFycmF5PGludCwgMj4gb2Zmc2V0cyA9IHsxLCAwfTsKKyAgICBFaWdlbjo6YXJyYXk8aW50LCAyPiBleHRlbnRzID0gezIsIDJ9OworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAxPiBzbGljZSA9IGEuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgICAgMCAgIDEwMCAgIDIwMAorICAgICAzMDAgICA0MDAgICA1MDAKKyAgICAgNjAwICAgNzAwICAgODAwCisgICAgIDkwMCAgMTAwMCAgMTEwMAorICAgIGNvdXQgPDwgInNsaWNlIiA8PCBlbmRsIDw8IHNsaWNlIDw8IGVuZGw7CisgICAgPT4KKyAgICBzbGljZQorICAgICAzMDAgICA0MDAKKyAgICAgNjAwICAgNzAwCisKKworIyMjIDxPcGVyYXRpb24+IGNoaXAoY29uc3QgSW5kZXggb2Zmc2V0LCBjb25zdCBJbmRleCBkaW0pCisKK0EgY2hpcCBpcyBhIHNwZWNpYWwga2luZCBvZiBzbGljZS4gSXQgaXMgdGhlIHN1YnRlbnNvciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGluCit0aGUgZGltZW5zaW9uIGRpbS4gVGhlIHJldHVybmVkIHRlbnNvciBoYXMgb25lIGZld2VyIGRpbWVuc2lvbiB0aGFuIHRoZSBpbnB1dAordGVuc29yOiB0aGUgZGltZW5zaW9uIGRpbSBpcyByZW1vdmVkLgorCitGb3IgZXhhbXBsZSwgYSBtYXRyaXggY2hpcCB3b3VsZCBiZSBlaXRoZXIgYSByb3cgb3IgYSBjb2x1bW4gb2YgdGhlIGlucHV0CittYXRyaXguCisKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSg0LCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezAsIDEwMCwgMjAwfSwgezMwMCwgNDAwLCA1MDB9LAorICAgICAgICAgICAgICAgICB7NjAwLCA3MDAsIDgwMH0sIHs5MDAsIDEwMDAsIDExMDB9fSk7CisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDE+IHJvd18zID0gYS5jaGlwKDIsIDApOworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAxPiBjb2xfMiA9IGEuY2hpcCgxLCAxKTsKKyAgICBjb3V0IDw8ICJhIiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKKyAgICA9PgorICAgIGEKKyAgICAgICAwICAgMTAwICAgMjAwCisgICAgIDMwMCAgIDQwMCAgIDUwMAorICAgICA2MDAgICA3MDAgICA4MDAKKyAgICAgOTAwICAxMDAwICAxMTAwCisgICAgY291dCA8PCAicm93XzMiIDw8IGVuZGwgPDwgcm93XzMgPDwgZW5kbDsKKyAgICA9PgorICAgIHJvd18zCisgICAgICAgNjAwICAgNzAwICAgODAwCisgICAgY291dCA8PCAiY29sXzIiIDw8IGVuZGwgPDwgY29sXzIgPDwgZW5kbDsKKyAgICA9PgorICAgIGNvbF8yCisgICAgICAgMTAwICAgNDAwICAgNzAwICAgIDEwMDAKKworSXQgaXMgcG9zc2libGUgdG8gYXNzaWduIHZhbHVlcyB0byBhIHRlbnNvciBjaGlwIHNpbmNlIHRoZSBjaGlwIG9wZXJhdGlvbiBpcyBhCitsdmFsdWUuIEZvciBleGFtcGxlOgorCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDE+IGEoMyk7CisgICAgYS5zZXRWYWx1ZXMoe3sxMDAsIDIwMCwgMzAwfX0pOworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBiKDIsIDMpOworICAgIGIuc2V0WmVybygpOworICAgIGIuY2hpcCgwLCAwKSA9IGE7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgIDEwMAorICAgICAyMDAKKyAgICAgMzAwCisgICAgY291dCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CisgICAgPT4KKyAgICBiCisgICAgICAgMTAwICAgMjAwICAgMzAwCisgICAgICAgICAwICAgICAwICAgICAwCisKKworIyMjIDxPcGVyYXRpb24+IHJldmVyc2UoY29uc3QgUmV2ZXJzZURpbWVuc2lvbnMmIHJldmVyc2UpCisKK1JldHVybnMgYSB2aWV3IG9mIHRoZSBpbnB1dCB0ZW5zb3IgdGhhdCByZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGNvZWZmaWNpZW50cworYWxvbmcgYSBzdWJzZXQgb2YgdGhlIGRpbWVuc2lvbnMuICBUaGUgYXJndW1lbnQgcmV2ZXJzZSBpcyBhbiBhcnJheSBvZiBib29sZWFuCit2YWx1ZXMgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIG9yZGVyIG9mIHRoZSBjb2VmZmljaWVudHMgc2hvdWxkIGJlCityZXZlcnNlZCBhbG9uZyBlYWNoIG9mIHRoZSBkaW1lbnNpb25zLiAgVGhpcyBvcGVyYXRpb24gcHJlc2VydmVzIHRoZSBkaW1lbnNpb25zCitvZiB0aGUgaW5wdXQgdGVuc29yLgorCitGb3IgZXhhbXBsZSB0aGlzIGlzIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBgYGByZXZlcnNlKClgYGAgdGhlIGZpcnN0IGRpbWVuc2lvbgorb2YgYSAyRCB0ZW5zb3I6CisKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSg0LCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezAsIDEwMCwgMjAwfSwgezMwMCwgNDAwLCA1MDB9LAorICAgICAgICAgICAgICAgIHs2MDAsIDcwMCwgODAwfSwgezkwMCwgMTAwMCwgMTEwMH19KTsKKyAgICBFaWdlbjo6YXJyYXk8Ym9vbCwgMj4gcmV2ZXJzZSh7dHJ1ZSwgZmFsc2V9KTsKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYiA9IGEucmV2ZXJzZShyZXZlcnNlKTsKKyAgICBjb3V0IDw8ICJhIiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgICAgMCAgIDEwMCAgIDIwMAorICAgICAzMDAgICA0MDAgICA1MDAKKyAgICAgNjAwICAgNzAwICAgODAwCisgICAgIDkwMCAgMTAwMCAgMTEwMAorICAgIGIKKyAgICAgOTAwICAxMDAwICAxMTAwCisgICAgIDYwMCAgIDcwMCAgIDgwMAorICAgICAzMDAgICA0MDAgICA1MDAKKyAgICAgICAwICAgMTAwICAgMjAwCisKKworIyMjIDxPcGVyYXRpb24+IGJyb2FkY2FzdChjb25zdCBCcm9hZGNhc3QmIGJyb2FkY2FzdCkKKworUmV0dXJucyBhIHZpZXcgb2YgdGhlIGlucHV0IHRlbnNvciBpbiB3aGljaCB0aGUgaW5wdXQgaXMgcmVwbGljYXRlZCBvbmUgdG8gbWFueQordGltZXMuCitUaGUgYnJvYWRjYXN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBjb3BpZXMgb2YgdGhlIGlucHV0IHRlbnNvciBuZWVkIHRvIGJlCittYWRlIGluIGVhY2ggb2YgdGhlIGRpbWVuc2lvbnMuCisKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYSgyLCAzKTsKKyAgICBhLnNldFZhbHVlcyh7ezAsIDEwMCwgMjAwfSwgezMwMCwgNDAwLCA1MDB9fSk7CisgICAgRWlnZW46OmFycmF5PGludCwgMj4gYmNhc3QoezMsIDJ9KTsKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYiA9IGEuYnJvYWRjYXN0KGJjYXN0KTsKKyAgICBjb3V0IDw8ICJhIiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCAiYiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CisgICAgPT4KKyAgICBhCisgICAgICAgMCAgIDEwMCAgIDIwMAorICAgICAzMDAgICA0MDAgICA1MDAKKyAgICBiCisgICAgICAgMCAgIDEwMCAgIDIwMCAgICAwICAgMTAwICAgMjAwCisgICAgIDMwMCAgIDQwMCAgIDUwMCAgMzAwICAgNDAwICAgNTAwCisgICAgICAgMCAgIDEwMCAgIDIwMCAgICAwICAgMTAwICAgMjAwCisgICAgIDMwMCAgIDQwMCAgIDUwMCAgMzAwICAgNDAwICAgNTAwCisgICAgICAgMCAgIDEwMCAgIDIwMCAgICAwICAgMTAwICAgMjAwCisgICAgIDMwMCAgIDQwMCAgIDUwMCAgMzAwICAgNDAwICAgNTAwCisKKyMjIyA8T3BlcmF0aW9uPiBjb25jYXRlbmF0ZShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyLCBBeGlzIGF4aXMpCisKK1RPRE8KKworIyMjIDxPcGVyYXRpb24+ICBwYWQoY29uc3QgUGFkZGluZ0RpbWVuc2lvbnMmIHBhZGRpbmcpCisKK1JldHVybnMgYSB2aWV3IG9mIHRoZSBpbnB1dCB0ZW5zb3IgaW4gd2hpY2ggdGhlIGlucHV0IGlzIHBhZGRlZCB3aXRoIHplcm9zLgorCisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDI+IGEoMiwgMyk7CisgICAgYS5zZXRWYWx1ZXMoe3swLCAxMDAsIDIwMH0sIHszMDAsIDQwMCwgNTAwfX0pOworICAgIEVpZ2VuOjphcnJheTxwYWlyPGludCwgaW50PiwgMj4gcGFkZGluZ3M7CisgICAgcGFkZGluZ3NbMF0gPSBtYWtlX3BhaXIoMCwgMSk7CisgICAgcGFkZGluZ3NbMV0gPSBtYWtlX3BhaXIoMiwgMyk7CisgICAgRWlnZW46OlRlbnNvcjxpbnQsIDI+IGIgPSBhLnBhZChwYWRkaW5ncyk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgImIiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOworICAgID0+CisgICAgYQorICAgICAgIDAgICAxMDAgICAyMDAKKyAgICAgMzAwICAgNDAwICAgNTAwCisgICAgYgorICAgICAgIDAgICAgIDAgICAgIDAgICAgMAorICAgICAgIDAgICAgIDAgICAgIDAgICAgMAorICAgICAgIDAgICAxMDAgICAyMDAgICAgMAorICAgICAzMDAgICA0MDAgICA1MDAgICAgMAorICAgICAgIDAgICAgIDAgICAgIDAgICAgMAorICAgICAgIDAgICAgIDAgICAgIDAgICAgMAorICAgICAgIDAgICAgIDAgICAgIDAgICAgMAorCisKKyMjIyA8T3BlcmF0aW9uPiAgZXh0cmFjdF9wYXRjaGVzKGNvbnN0IFBhdGNoRGltcyYgcGF0Y2hfZGltcykKKworUmV0dXJucyBhIHRlbnNvciBvZiBjb2VmZmljaWVudCBwYXRjaGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCB0ZW5zb3IsIHdoZXJlCitlYWNoIHBhdGNoIGlzIG9mIGRpbWVuc2lvbiBzcGVjaWZpZWQgYnkgJ3BhdGNoX2RpbXMnLiBUaGUgcmV0dXJuZWQgdGVuc29yIGhhcworb25lIGdyZWF0ZXIgZGltZW5zaW9uIHRoYW4gdGhlIGlucHV0IHRlbnNvciwgd2hpY2ggaXMgdXNlZCB0byBpbmRleCBlYWNoIHBhdGNoLgorVGhlIHBhdGNoIGluZGV4IGluIHRoZSBvdXRwdXQgdGVuc29yIGRlcGVuZHMgb24gdGhlIGRhdGEgbGF5b3V0IG9mIHRoZSBpbnB1dAordGVuc29yOiB0aGUgcGF0Y2ggaW5kZXggaXMgdGhlIGxhc3QgZGltZW5zaW9uIENvbE1ham9yIGxheW91dCwgYW5kIHRoZSBmaXJzdAorZGltZW5zaW9uIGluIFJvd01ham9yIGxheW91dC4KKworRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgaW5wdXQgdGVuc29yOgorCisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRlbnNvcigzLDQpOworICB0ZW5zb3Iuc2V0VmFsdWVzKHt7MC4wZiwgMS4wZiwgMi4wZiwgMy4wZn0sCisgICAgICAgICAgICAgICAgICAgIHs0LjBmLCA1LjBmLCA2LjBmLCA3LjBmfSwKKyAgICAgICAgICAgICAgICAgICAgezguMGYsIDkuMGYsIDEwLjBmLCAxMS4wZn19KTsKKworICBjb3V0IDw8ICJ0ZW5zb3I6ICIgPDwgZW5kbCA8PCB0ZW5zb3IgPDwgZW5kbDsKKz0+Cit0ZW5zb3I6CisgMCAgIDEgICAyICAgMworIDQgICA1ICAgNiAgIDcKKyA4ICAgOSAgMTAgIDExCisKK1NpeCAyeDIgcGF0Y2hlcyBjYW4gYmUgZXh0cmFjdGVkIGFuZCBpbmRleGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZToKKworICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBwYXRjaDsKKyAgRWlnZW46OmFycmF5PHB0cmRpZmZfdCwgMj4gcGF0Y2hfZGltczsKKyAgcGF0Y2hfZGltc1swXSA9IDI7CisgIHBhdGNoX2RpbXNbMV0gPSAyOworICBwYXRjaCA9IHRlbnNvci5leHRyYWN0X3BhdGNoZXMocGF0Y2hfZGltcyk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgNjsgKytrKSB7CisgICAgY291dCA8PCAicGF0Y2ggaW5kZXg6ICIgPDwgayA8PCBlbmRsOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgICAgICAgIGNvdXQgPDwgcGF0Y2goaSwgaiwgaykgPDwgIiAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgcGF0Y2goaywgaSwgaikgPDwgIiAiOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisKK1RoaXMgY29kZSByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHdoZW4gdGhlIGRhdGEgbGF5b3V0IGlzIENvbE1ham9yOgorCitwYXRjaCBpbmRleDogMAorMCAxCis0IDUKK3BhdGNoIGluZGV4OiAxCis0IDUKKzggOQorcGF0Y2ggaW5kZXg6IDIKKzEgMgorNSA2CitwYXRjaCBpbmRleDogMworNSA2Cis5IDEwCitwYXRjaCBpbmRleDogNAorMiAzCis2IDcKK3BhdGNoIGluZGV4OiA1Cis2IDcKKzEwIDExCisKK1RoaXMgY29kZSByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHdoZW4gdGhlIGRhdGEgbGF5b3V0IGlzIFJvd01ham9yOgorKE5PVEU6IHRoZSBzZXQgb2YgcGF0Y2hlcyBpcyB0aGUgc2FtZSBhcyBpbiBDb2xNYWpvciwgYnV0IGFyZSBpbmRleGVkIGRpZmZlcmVudGx5KS4KKworcGF0Y2ggaW5kZXg6IDAKKzAgMQorNCA1CitwYXRjaCBpbmRleDogMQorMSAyCis1IDYKK3BhdGNoIGluZGV4OiAyCisyIDMKKzYgNworcGF0Y2ggaW5kZXg6IDMKKzQgNQorOCA5CitwYXRjaCBpbmRleDogNAorNSA2Cis5IDEwCitwYXRjaCBpbmRleDogNQorNiA3CisxMCAxMQorCisjIyMgPE9wZXJhdGlvbj4gIGV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhjb25zdCBJbmRleCBwYXRjaF9yb3dzLCBjb25zdCBJbmRleCBwYXRjaF9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCByb3dfc3RyaWRlLCBjb25zdCBJbmRleCBjb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWRkaW5nVHlwZSBwYWRkaW5nX3R5cGUpCisKK1JldHVybnMgYSB0ZW5zb3Igb2YgY29lZmZpY2llbnQgaW1hZ2UgcGF0Y2hlcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgdGVuc29yLAord2hpY2ggaXMgZXhwZWN0ZWQgdG8gaGF2ZSBkaW1lbnNpb25zIG9yZGVyZWQgYXMgZm9sbG93cyAoZGVwZW5kaW5nIG9uIHRoZSBkYXRhCitsYXlvdXQgb2YgdGhlIGlucHV0IHRlbnNvciwgYW5kIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBkaW1lbnNpb25zICdOJyk6CisKKyopIENvbE1ham9yCisxc3QgZGltZW5zaW9uOiBjaGFubmVscyAob2Ygc2l6ZSBkKQorMm5kIGRpbWVuc2lvbjogcm93cyAob2Ygc2l6ZSByKQorM3JkIGRpbWVuc2lvbjogY29sdW1ucyAob2Ygc2l6ZSBjKQorNHRoLU50aCBkaW1lbnNpb246IHRpbWUgKGZvciB2aWRlbykgb3IgYmF0Y2ggKGZvciBidWxrIHByb2Nlc3NpbmcpLgorCisqKSBSb3dNYWpvciAocmV2ZXJzZSBvcmRlciBvZiBDb2xNYWpvcikKKzFzdC1OdGggZGltZW5zaW9uOiB0aW1lIChmb3IgdmlkZW8pIG9yIGJhdGNoIChmb3IgYnVsayBwcm9jZXNzaW5nKS4KK04rMSd0aCBkaW1lbnNpb246IGNvbHVtbnMgKG9mIHNpemUgYykKK04rMid0aCBkaW1lbnNpb246IHJvd3MgKG9mIHNpemUgcikKK04rMyd0aCBkaW1lbnNpb246IGNoYW5uZWxzIChvZiBzaXplIGQpCisKK1RoZSByZXR1cm5lZCB0ZW5zb3IgaGFzIG9uZSBncmVhdGVyIGRpbWVuc2lvbiB0aGFuIHRoZSBpbnB1dCB0ZW5zb3IsIHdoaWNoIGlzCit1c2VkIHRvIGluZGV4IGVhY2ggcGF0Y2guIFRoZSBwYXRjaCBpbmRleCBpbiB0aGUgb3V0cHV0IHRlbnNvciBkZXBlbmRzIG9uIHRoZQorZGF0YSBsYXlvdXQgb2YgdGhlIGlucHV0IHRlbnNvcjogdGhlIHBhdGNoIGluZGV4IGlzIHRoZSA0J3RoIGRpbWVuc2lvbiBpbgorQ29sTWFqb3IgbGF5b3V0LCBhbmQgdGhlIDQndGggZnJvbSB0aGUgbGFzdCBkaW1lbnNpb24gaW4gUm93TWFqb3IgbGF5b3V0LgorCitGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBpbnB1dCB0ZW5zb3Igd2l0aCB0aGUgZm9sbG93aW5nIGRpbWVuc2lvbgorc2l6ZXM6CisgKikgZGVwdGg6ICAgMgorICopIHJvd3M6ICAgIDMKKyAqKSBjb2x1bW5zOiA1CisgKikgYmF0Y2g6ICAgNworCisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsMyw1LDcpOworICBUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7CisKKzJ4MiBpbWFnZSBwYXRjaGVzIGNhbiBiZSBleHRyYWN0ZWQgYW5kIGluZGV4ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgorCisqKSAyRCBwYXRjaDogQ29sTWFqb3IgKHBhdGNoIGluZGV4ZWQgYnkgc2Vjb25kLXRvLWxhc3QgZGltZW5zaW9uKQorICBUZW5zb3I8ZmxvYXQsIDU+IHR3b2RfcGF0Y2g7CisgIHR3b2RfcGF0Y2ggPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPDIsIDI+KCk7CisgIC8vIHR3b2RfcGF0Y2guZGltZW5zaW9uKDApID09IDIKKyAgLy8gdHdvZF9wYXRjaC5kaW1lbnNpb24oMSkgPT0gMgorICAvLyB0d29kX3BhdGNoLmRpbWVuc2lvbigyKSA9PSAyCisgIC8vIHR3b2RfcGF0Y2guZGltZW5zaW9uKDMpID09IDMqNQorICAvLyB0d29kX3BhdGNoLmRpbWVuc2lvbig0KSA9PSA3CisKKyopIDJEIHBhdGNoOiBSb3dNYWpvciAocGF0Y2ggaW5kZXhlZCBieSB0aGUgc2Vjb25kIGRpbWVuc2lvbikKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gdHdvZF9wYXRjaF9yb3dfbWFqb3I7CisgIHR3b2RfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXM8MiwgMj4oKTsKKyAgLy8gdHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApID09IDcKKyAgLy8gdHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpID09IDMqNQorICAvLyB0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMikgPT0gMgorICAvLyB0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMykgPT0gMgorICAvLyB0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oNCkgPT0gMgorCisjIyBTcGVjaWFsIE9wZXJhdGlvbnMKKworIyMjIDxPcGVyYXRpb24+IGNhc3Q8VD4oKQorCitSZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgVCB3aXRoIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHRlbnNvci4KK1RoZSByZXR1cm5lZCB0ZW5zb3IgY29udGFpbnMgdGhlIHZhbHVlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29yIGNvbnZlcnRlZCB0bwordHlwZSBULgorCisgICAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gYSgyLCAzKTsKKyAgICBFaWdlbjo6VGVuc29yPGludCwgMj4gYiA9IGEuY2FzdDxpbnQ+KCk7CisKK1RoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBkbyBlbGVtZW50LXdpc2UgZGl2aXNpb24gb2YKK1RlbnNvcnMgb2YgaW50ZWdlcnMuICBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBUZW5zb3IgbGlicmFyeQorYnV0IHlvdSBjYW4gZWFzaWx5IGNhc3QgdGhlIHRlbnNvcnMgdG8gZmxvYXRzIHRvIGRvIHRoZSBkaXZpc2lvbjoKKworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBhKDIsIDMpOworICAgIGEuc2V0VmFsdWVzKHt7MCwgMSwgMn0sIHszLCA0LCA1fX0pOworICAgIEVpZ2VuOjpUZW5zb3I8aW50LCAyPiBiID0KKyAgICAgICAgKGEuY2FzdDxmbG9hdD4oKSAvIGEuY29uc3RhbnQoMikuY2FzdDxmbG9hdD4oKSkuY2FzdDxpbnQ+KCk7CisgICAgY291dCA8PCAiYSIgPDwgZW5kbCA8PCBhIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJiIiA8PCBlbmRsIDw8IGIgPDwgZW5kbCA8PCBlbmRsOworICAgID0+CisgICAgYQorICAgIDAgMSAyCisgICAgMyA0IDUKKworICAgIGIKKyAgICAwIDAgMQorICAgIDEgMiAyCisKKworIyMjIDxPcGVyYXRpb24+ICAgICBldmFsKCkKKworVE9ETworCisKKyMjIFJlcHJlc2VudGF0aW9uIG9mIHNjYWxhciB2YWx1ZXMKKworU2NhbGFyIHZhbHVlcyBhcmUgb2Z0ZW4gcmVwcmVzZW50ZWQgYnkgdGVuc29ycyBvZiBzaXplIDEgYW5kIHJhbmsgMS4gSXQgd291bGQgYmUKK21vcmUgbG9naWNhbCBhbmQgdXNlciBmcmllbmRseSB0byB1c2UgdGVuc29ycyBvZiByYW5rIDAgaW5zdGVhZC4gRm9yIGV4YW1wbGUKK1RlbnNvcjxULCBOPjo6bWF4aW11bSgpIGN1cnJlbnRseSByZXR1cm5zIGEgVGVuc29yPFQsIDE+LiBTaW1pbGFybHksIHRoZSBpbm5lcgorcHJvZHVjdCBvZiAyIDFkIHRlbnNvcnMgKHRocm91Z2ggY29udHJhY3Rpb25zKSByZXR1cm5zIGEgMWQgdGVuc29yLiBJbiB0aGUKK2Z1dHVyZSB0aGVzZSBvcGVyYXRpb25zIG1pZ2h0IGJlIHVwZGF0ZWQgdG8gcmV0dXJuIDBkIHRlbnNvcnMgaW5zdGVhZC4KKworIyMgTGltaXRhdGlvbnMKKworKiAgIFRoZSBudW1iZXIgb2YgdGVuc29yIGRpbWVuc2lvbnMgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gMjUwIHdoZW4gdXNpbmcgYQorICAgIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgY3h4MTEuIEl0IGlzIGxpbWl0ZWQgdG8gb25seSA1IGZvciBvbGRlciBjb21waWxlcnMuCisqICAgVGhlIEluZGV4TGlzdCBjbGFzcyByZXF1aXJlcyBhIGN4eDExIGNvbXBsaWFudCBjb21waWxlci4gWW91IGNhbiB1c2UgYW4KKyAgICBhcnJheSBvZiBpbmRpY2VzIGluc3RlYWQgaWYgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIGEgbW9kZXJuIGNvbXBpbGVyLgorKiAgIE9uIEdQVXMgb25seSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXJlIHByb3Blcmx5IHRlc3RlZCBhbmQgb3B0aW1pemVkIGZvci4KKyogICBDb21wbGV4IGFuZCBpbnRlZ2VyIHZhbHVlcyBhcmUga25vd24gdG8gYmUgYnJva2VuIG9uIEdQVXMuIElmIHlvdSB0cnkgdG8gdXNlCisgICAgdGhlbSB5b3UnbGwgbW9zdCBsaWtlbHkgZW5kIHVwIHRyaWdnZXJpbmcgYSBzdGF0aWMgYXNzZXJ0aW9uIGZhaWx1cmUgc3VjaCBhcworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQocGFja2V0U2l6ZSA+IDEsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKworCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQwYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3IuaApAQCAtMCwwICsxLDUyNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBTZWlsZXIgPGNocmlzdGlhbkBpd2FrZC5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvcgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUaGUgdGVuc29yIGNsYXNzLgorICAqCisgICogVGhlICVUZW5zb3IgY2xhc3MgaXMgdGhlIHdvcmstaG9yc2UgZm9yIGFsbCBcZW0gZGVuc2UgdGVuc29ycyB3aXRoaW4gRWlnZW4uCisgICoKKyAgKiBUaGUgJVRlbnNvciBjbGFzcyBlbmNvbXBhc3NlcyBvbmx5IGR5bmFtaWMtc2l6ZSBvYmplY3RzIHNvIGZhci4KKyAgKgorICAqIFRoZSBmaXJzdCB0d28gdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQ6CisgICogXHRwYXJhbSBTY2FsYXJfIFxhbmNob3IgdGVuc29yX3RwYXJhbV9zY2FsYXIgTnVtZXJpYyB0eXBlLCBlLmcuIGZsb2F0LCBkb3VibGUsIGludCBvciBzdGQ6OmNvbXBsZXg8ZmxvYXQ+LgorICAqICAgICAgICAgICAgICAgICBVc2VyIGRlZmluZWQgc2NhbGFyIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYXMgd2VsbCAoc2VlIFxyZWYgdXNlcl9kZWZpbmVkX3NjYWxhcnMgImhlcmUiKS4KKyAgKiBcdHBhcmFtIE51bUluZGljZXNfIE51bWJlciBvZiBpbmRpY2VzIChpLmUuIHJhbmsgb2YgdGhlIHRlbnNvcikKKyAgKgorICAqIFRoZSByZW1haW5pbmcgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwgLS0gaW4gbW9zdCBjYXNlcyB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLgorICAqIFx0cGFyYW0gT3B0aW9uc18gXGFuY2hvciB0ZW5zb3JfdHBhcmFtX29wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiBlaXRoZXIgXGIgI1Jvd01ham9yIG9yIFxiICNDb2xNYWpvciwgYW5kIG9mIGVpdGhlcgorICAqICAgICAgICAgICAgICAgICBcYiAjQXV0b0FsaWduIG9yIFxiICNEb250QWxpZ24uCisgICogICAgICAgICAgICAgICAgIFRoZSBmb3JtZXIgY29udHJvbHMgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgInN0b3JhZ2Ugb3JkZXIiLCBhbmQgZGVmYXVsdHMgdG8gY29sdW1uLW1ham9yLiBUaGUgbGF0dGVyIGNvbnRyb2xzIGFsaWdubWVudCwgd2hpY2ggaXMgcmVxdWlyZWQKKyAgKiAgICAgICAgICAgICAgICAgZm9yIHZlY3Rvcml6YXRpb24uIEl0IGRlZmF1bHRzIHRvIGFsaWduaW5nIHRlbnNvcnMuIE5vdGUgdGhhdCB0ZW5zb3JzIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBhbnkgb3BlcmF0aW9ucyB0aGF0IHByb2ZpdCBmcm9tIHZlY3Rvcml6YXRpb24uCisgICogICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN1Y2ggb3BlcmF0aW9ucyAoaS5lLiBhZGRpbmcgdHdvIHRlbnNvcnMgZXRjLikgaXMgcGxhbm5lZC4KKyAgKgorICAqIFlvdSBjYW4gYWNjZXNzIGVsZW1lbnRzIG9mIHRlbnNvcnMgdXNpbmcgbm9ybWFsIHN1YnNjcmlwdGluZzoKKyAgKgorICAqIFxjb2RlCisgICogRWlnZW46OlRlbnNvcjxkb3VibGUsIDQ+IHQoMTAsIDEwLCAxMCwgMTApOworICAqIHQoMCwgMSwgMiwgMykgPSA0Mi4wOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ0VpZ2VuIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX1RFTlNPUl9QTFVHSU4uCisgICoKKyAgKiA8aT48Yj5Tb21lIG5vdGVzOjwvYj48L2k+CisgICoKKyAgKiA8ZGw+CisgICogPGR0PjxiPlJlbGF0aW9uIHRvIG90aGVyIHBhcnRzIG9mIEVpZ2VuOjwvYj48L2R0PgorICAqIDxkZD5UaGUgbWlkdGVybSBkZXZlbG9wZW1lbnQgZ29hbCBmb3IgdGhpcyBjbGFzcyBpcyB0byBoYXZlIGEgc2ltaWxhciBoaWVyYXJjaHkgYXMgRWlnZW4gdXNlcyBmb3IgbWF0cmljZXMsIHNvIHRoYXQKKyAgKiB0YWtpbmcgYmxvY2tzIG9yIHVzaW5nIHRlbnNvcnMgaW4gZXhwcmVzc2lvbnMgaXMgZWFzaWx5IHBvc3NpYmxlLCBpbmNsdWRpbmcgYW4gaW50ZXJmYWNlIHdpdGggdGhlIHZlY3Rvci9tYXRyaXggY29kZQorICAqIGJ5IHByb3ZpZGluZyAuYXNNYXRyaXgoKSBhbmQgLmFzVmVjdG9yKCkgKG9yIHNpbWlsYXIpIG1ldGhvZHMgZm9yIHJhbmsgMiBhbmQgMSB0ZW5zb3JzLiBIb3dldmVyLCBjdXJyZW50bHksIHRoZSAlVGVuc29yCisgICogY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhbnkgb2YgdGhlc2UgZmVhdHVyZXMgYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGFzIGEgc3RhbmQtYWxvbmUgY2xhc3MgdGhhdCBqdXN0IGFsbG93cyBmb3IKKyAgKiBjb2VmZmljaWVudCBhY2Nlc3MuIEFsc28sIHdoZW4gZml4ZWQtc2l6ZSB0ZW5zb3JzIGFyZSBpbXBsZW1lbnRlZCwgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgaXMgbGlrZWx5IHRvCisgICogY2hhbmdlIGRyYW1hdGljYWxseS48L2RkPgorICAqIDwvZGw+CisgICoKKyAgKiBccmVmIFRvcGljU3RvcmFnZU9yZGVycworICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zXywgdHlwZW5hbWUgSW5kZXhUeXBlXz4KK2NsYXNzIFRlbnNvciA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvcjxTY2FsYXJfLCBOdW1JbmRpY2VzXywgT3B0aW9uc18sIEluZGV4VHlwZV8+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgVGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4gU2VsZjsKKyAgICB0eXBlZGVmIFRlbnNvckJhc2U8VGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4gPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8U2VsZj46OnR5cGUgTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTZWxmPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNlbGY+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNjYWxhcl8gU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIElzQWxpZ25lZCA9IGJvb2woRUlHRU5fTUFYX0FMSUdOX0JZVEVTPjApICYgIShPcHRpb25zXyZEb250QWxpZ24pLAorICAgICAgTGF5b3V0ID0gT3B0aW9uc18gJiBSb3dNYWpvciA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICBDb29yZEFjY2VzcyA9IHRydWUsCisgICAgICBSYXdBY2Nlc3MgPSB0cnVlCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW9ucyA9IE9wdGlvbnNfOworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtSW5kaWNlcyA9IE51bUluZGljZXNfOworICAgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1JbmRpY2VzXz4gRGltZW5zaW9uczsKKworICBwcm90ZWN0ZWQ6CisgICAgVGVuc29yU3RvcmFnZTxTY2FsYXIsIERpbWVuc2lvbnMsIE9wdGlvbnM+IG1fc3RvcmFnZTsKKworI2lmZGVmIEVJR0VOX0hBU19TRklOQUUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21JbmRpY2VzPgorICAgIHN0cnVjdCBpc09mTm9ybWFsSW5kZXh7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19hcnJheSA9IGludGVybmFsOjppc19iYXNlX29mPGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiwgQ3VzdG9tSW5kaWNlcz46OnZhbHVlOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ID0gTnVtVHJhaXRzPEN1c3RvbUluZGljZXM+OjpJc0ludGVnZXI7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGlzX2FycmF5IHwgaXNfaW50OworICAgIH07CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgLy8gTWV0YWRhdGEKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsoKSAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBOdW1JbmRpY2VzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24oc3RkOjpzaXplX3QgbikgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVtuXTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgICAgICAgICAgICAgZGltZW5zaW9ucygpICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZS5kaW1lbnNpb25zKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUoKSAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2Uuc2l6ZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSgpICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyICAgICAgICAgICAgICAgICAgKmRhdGEoKSAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKCk7IH0KKworICAgIC8vIFRoaXMgbWFrZXMgRUlHRU5fSU5JVElBTElaRV9DT0VGRlNfSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIC8vIHdvcmssIGJlY2F1c2UgdGhhdCB1c2VzIGJhc2UoKS5jb2VmZlJlZigpIC0gYW5kIHdlIGRvbid0IHlldAorICAgIC8vIGltcGxlbWVudCBhIHNpbWlsYXIgY2xhc3MgaGllcmFyY2h5CisgICAgaW5saW5lIFNlbGYmIGJhc2UoKSAgICAgICAgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIGlubGluZSBjb25zdCBTZWxmJiBiYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4IHNlY29uZEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGluZGljZXMgdXNlZCB0byBhY2Nlc3MgYSB0ZW5zb3IgY29lZmZpY2llbnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YuLi4ob3RoZXJJbmRpY2VzKSArIDIgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmV0dXJuIGNvZWZmKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPnt7Zmlyc3RJbmRleCwgc2Vjb25kSW5kZXgsIG90aGVySW5kaWNlcy4uLn19KTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIG5vcm1hbCBpbmRpY2VzCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKGNvbnN0IGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgaW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoY2hlY2tJbmRleFJhbmdlKGluZGljZXMpKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2xpbmVhcml6ZWRJbmRleChpbmRpY2VzKV07CisgICAgfQorCisgICAgLy8gY3VzdG9tIGluZGljZXMKKyNpZmRlZiBFSUdFTl9IQVNfU0ZJTkFFCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tSW5kaWNlcywKKyAgICAgICAgICAgICBFSUdFTl9TRklOQUVfRU5BQkxFX0lGKCAhKGlzT2ZOb3JtYWxJbmRleDxDdXN0b21JbmRpY2VzPjo6dmFsdWUpICkKKyAgICA+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKEN1c3RvbUluZGljZXMmIGluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gY29lZmYoaW50ZXJuYWw6OmN1c3RvbUluZGljZXMyQXJyYXk8SW5kZXgsTnVtSW5kaWNlcz4oaW5kaWNlcykpOworICAgIH0KKyNlbmRpZgorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpWzBdOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgfQorCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEluZGV4VHlwZXM+CisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggZmlyc3RJbmRleCwgSW5kZXggc2Vjb25kSW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKQorICAgIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMiA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gY29lZmZSZWYoYXJyYXk8SW5kZXgsIE51bUluZGljZXM+e3tmaXJzdEluZGV4LCBzZWNvbmRJbmRleCwgb3RoZXJJbmRpY2VzLi4ufX0pOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gbm9ybWFsIGluZGljZXMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChjaGVja0luZGV4UmFuZ2UoaW5kaWNlcykpOworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbbGluZWFyaXplZEluZGV4KGluZGljZXMpXTsKKyAgICB9CisKKyAgICAvLyBjdXN0b20gaW5kaWNlcworI2lmZGVmIEVJR0VOX0hBU19TRklOQUUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21JbmRpY2VzLAorICAgICAgICAgICAgIEVJR0VOX1NGSU5BRV9FTkFCTEVfSUYoICEoaXNPZk5vcm1hbEluZGV4PEN1c3RvbUluZGljZXM+Ojp2YWx1ZSkgKQorICAgICAgICAgICAgID4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoQ3VzdG9tSW5kaWNlcyYgaW5kaWNlcykKKyAgICB7CisgICAgICAgIHJldHVybiBjb2VmZlJlZihpbnRlcm5hbDo6Y3VzdG9tSW5kaWNlczJBcnJheTxJbmRleCxOdW1JbmRpY2VzPihpbmRpY2VzKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAwLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbMF07CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4IHNlY29uZEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGluZGljZXMgdXNlZCB0byBhY2Nlc3MgYSB0ZW5zb3IgY29lZmZpY2llbnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YuLi4ob3RoZXJJbmRpY2VzKSArIDIgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoYXJyYXk8SW5kZXgsIE51bUluZGljZXM+e3tmaXJzdEluZGV4LCBzZWNvbmRJbmRleCwgb3RoZXJJbmRpY2VzLi4ufX0pOworICAgIH0KKyNlbHNlCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNvZWZmKGFycmF5PEluZGV4LCAyPihpMCwgaTEpKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb2VmZihhcnJheTxJbmRleCwgMz4oaTAsIGkxLCBpMikpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb2VmZihhcnJheTxJbmRleCwgND4oaTAsIGkxLCBpMiwgaTMpKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyLCBJbmRleCBpMywgSW5kZXggaTQpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNvZWZmKGFycmF5PEluZGV4LCA1PihpMCwgaTEsIGkyLCBpMywgaTQpKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGN1c3RvbSBpbmRpY2VzCisjaWZkZWYgRUlHRU5fSEFTX1NGSU5BRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUluZGljZXMsCisgICAgICAgICAgICAgRUlHRU5fU0ZJTkFFX0VOQUJMRV9JRiggIShpc09mTm9ybWFsSW5kZXg8Q3VzdG9tSW5kaWNlcz46OnZhbHVlKSApCisgICAgPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEN1c3RvbUluZGljZXMmIGluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gY29lZmYoaW50ZXJuYWw6OmN1c3RvbUluZGljZXMyQXJyYXk8SW5kZXgsTnVtSW5kaWNlcz4oaW5kaWNlcykpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gbm9ybWFsIGluZGljZXMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNvZWZmKGluZGljZXMpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBjb2VmZihpbmRleCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAwLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIGNvZWZmKCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yW10oSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgLy8gVGhlIGJyYWNrZXQgb3BlcmF0b3IgaXMgb25seSBmb3IgdmVjdG9ycywgdXNlIHRoZSBwYXJlbnRoZXNpcyBvcGVyYXRvciBpbnN0ZWFkLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1JbmRpY2VzID09IDEsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgICByZXR1cm4gY29lZmYoaW5kZXgpOworICAgIH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPgorICAgIGlubGluZSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggZmlyc3RJbmRleCwgSW5kZXggc2Vjb25kSW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKQorICAgIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMiA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gb3BlcmF0b3IoKShhcnJheTxJbmRleCwgTnVtSW5kaWNlcz57e2ZpcnN0SW5kZXgsIHNlY29uZEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgfQorI2Vsc2UKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSkKKyAgICB7CisgICAgICByZXR1cm4gY29lZmZSZWYoYXJyYXk8SW5kZXgsIDI+KGkwLCBpMSkpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIpCisgICAgeworICAgICAgcmV0dXJuIGNvZWZmUmVmKGFycmF5PEluZGV4LCAzPihpMCwgaTEsIGkyKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMiwgSW5kZXggaTMpCisgICAgeworICAgICAgcmV0dXJuIGNvZWZmUmVmKGFycmF5PEluZGV4LCA0PihpMCwgaTEsIGkyLCBpMykpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzLCBJbmRleCBpNCkKKyAgICB7CisgICAgICByZXR1cm4gY29lZmZSZWYoYXJyYXk8SW5kZXgsIDU+KGkwLCBpMSwgaTIsIGkzLCBpNCkpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gbm9ybWFsIGluZGljZXMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpCisgICAgeworICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGljZXMpOworICAgIH0KKworICAgIC8vIGN1c3RvbSBpbmRpY2VzCisjaWZkZWYgRUlHRU5fSEFTX1NGSU5BRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUluZGljZXMsCisgICAgICAgICAgICAgRUlHRU5fU0ZJTkFFX0VOQUJMRV9JRiggIShpc09mTm9ybWFsSW5kZXg8Q3VzdG9tSW5kaWNlcz46OnZhbHVlKSApCisgICAgPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEN1c3RvbUluZGljZXMmIGluZGljZXMpCisgICAgeworICAgICAgcmV0dXJuIGNvZWZmUmVmKGludGVybmFsOjpjdXN0b21JbmRpY2VzMkFycmF5PEluZGV4LE51bUluZGljZXM+KGluZGljZXMpKTsKKyAgICB9CisjZW5kaWYKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAwLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIGNvZWZmUmVmKCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yW10oSW5kZXggaW5kZXgpCisgICAgeworICAgICAgLy8gVGhlIGJyYWNrZXQgb3BlcmF0b3IgaXMgb25seSBmb3IgdmVjdG9ycywgdXNlIHRoZSBwYXJlbnRoZXNpcyBvcGVyYXRvciBpbnN0ZWFkCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yKCkKKyAgICAgIDogbV9zdG9yYWdlKCkKKyAgICB7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvcihjb25zdCBTZWxmJiBvdGhlcikKKyAgICAgIDogbV9zdG9yYWdlKG90aGVyLm1fc3RvcmFnZSkKKyAgICB7CisgICAgfQorCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEluZGV4VHlwZXM+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3IoSW5kZXggZmlyc3REaW1lbnNpb24sIEluZGV4VHlwZXMuLi4gb3RoZXJEaW1lbnNpb25zKQorICAgICAgICA6IG1fc3RvcmFnZShmaXJzdERpbWVuc2lvbiwgb3RoZXJEaW1lbnNpb25zLi4uKQorICAgIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyB1c2VkIHRvIGNvbnN0cnVjdCBhIHRlbnNvciBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZi4uLihvdGhlckRpbWVuc2lvbnMpICsgMSA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgfQorI2Vsc2UKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFRlbnNvcihJbmRleCBkaW0xKQorICAgICAgOiBtX3N0b3JhZ2UoZGltMSwgYXJyYXk8SW5kZXgsIDE+KGRpbTEpKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoMSA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yKEluZGV4IGRpbTEsIEluZGV4IGRpbTIpCisgICAgICA6IG1fc3RvcmFnZShkaW0xKmRpbTIsIGFycmF5PEluZGV4LCAyPihkaW0xLCBkaW0yKSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKDIgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvcihJbmRleCBkaW0xLCBJbmRleCBkaW0yLCBJbmRleCBkaW0zKQorICAgICAgOiBtX3N0b3JhZ2UoZGltMSpkaW0yKmRpbTMsIGFycmF5PEluZGV4LCAzPihkaW0xLCBkaW0yLCBkaW0zKSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKDMgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvcihJbmRleCBkaW0xLCBJbmRleCBkaW0yLCBJbmRleCBkaW0zLCBJbmRleCBkaW00KQorICAgICAgOiBtX3N0b3JhZ2UoZGltMSpkaW0yKmRpbTMqZGltNCwgYXJyYXk8SW5kZXgsIDQ+KGRpbTEsIGRpbTIsIGRpbTMsIGRpbTQpKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoNCA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yKEluZGV4IGRpbTEsIEluZGV4IGRpbTIsIEluZGV4IGRpbTMsIEluZGV4IGRpbTQsIEluZGV4IGRpbTUpCisgICAgICA6IG1fc3RvcmFnZShkaW0xKmRpbTIqZGltMypkaW00KmRpbTUsIGFycmF5PEluZGV4LCA1PihkaW0xLCBkaW0yLCBkaW0zLCBkaW00LCBkaW01KSkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKDUgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIH0KKyNlbmRpZgorCisgICAgLyoqIE5vcm1hbCBEaW1lbnNpb24gKi8KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFRlbnNvcihjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGRpbWVuc2lvbnMpCisgICAgICAgIDogbV9zdG9yYWdlKGludGVybmFsOjphcnJheV9wcm9kKGRpbWVuc2lvbnMpLCBkaW1lbnNpb25zKQorICAgIHsKKyAgICAgIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvcihjb25zdCBUZW5zb3JCYXNlPE90aGVyRGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+JiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvciwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlci5kZXJpdmVkKCkpOworICAgICAgcmVzaXplKFRlbnNvckV2YWx1YXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+KGFzc2lnbiwgRGVmYXVsdERldmljZSgpKS5kaW1lbnNpb25zKCkpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT46OnJ1bihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yKGNvbnN0IFRlbnNvckJhc2U8T3RoZXJEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4mIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyLmRlcml2ZWQoKSk7CisgICAgICByZXNpemUoVGVuc29yRXZhbHVhdG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpLmRpbWVuc2lvbnMoKSk7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yJiBvcGVyYXRvcj0oY29uc3QgVGVuc29yJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvciwgY29uc3QgVGVuc29yPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICByZXNpemUoVGVuc29yRXZhbHVhdG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpLmRpbWVuc2lvbnMoKSk7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3ImIG9wZXJhdG9yPShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIHJlc2l6ZShUZW5zb3JFdmFsdWF0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSkuZGltZW5zaW9ucygpKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgcmVzaXplKEluZGV4IGZpcnN0RGltZW5zaW9uLCBJbmRleFR5cGVzLi4uIG90aGVyRGltZW5zaW9ucykKKyAgICB7CisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdXNlZCB0byByZXNpemUgYSB0ZW5zb3IgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YuLi4ob3RoZXJEaW1lbnNpb25zKSArIDEgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmVzaXplKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPnt7Zmlyc3REaW1lbnNpb24sIG90aGVyRGltZW5zaW9ucy4uLn19KTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qKiBOb3JtYWwgRGltZW5zaW9uICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXNpemUoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBkaW1lbnNpb25zKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgSW5kZXggc2l6ZSA9IEluZGV4KDEpOworICAgICAgZm9yIChpID0gMDsgaSA8IE51bUluZGljZXM7IGkrKykgeworICAgICAgICBpbnRlcm5hbDo6Y2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdzxEeW5hbWljPjo6cnVuKHNpemUsIGRpbWVuc2lvbnNbaV0pOworICAgICAgICBzaXplICo9IGRpbWVuc2lvbnNbaV07CisgICAgICB9CisgICAgICAjaWZkZWYgRUlHRU5fSU5JVElBTElaRV9DT0VGRlMKKyAgICAgICAgYm9vbCBzaXplX2NoYW5nZWQgPSBzaXplICE9IHRoaXMtPnNpemUoKTsKKyAgICAgICAgbV9zdG9yYWdlLnJlc2l6ZShzaXplLCBkaW1lbnNpb25zKTsKKyAgICAgICAgaWYoc2l6ZV9jaGFuZ2VkKSBFSUdFTl9JTklUSUFMSVpFX0NPRUZGU19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgICAjZWxzZQorICAgICAgICBtX3N0b3JhZ2UucmVzaXplKHNpemUsIGRpbWVuc2lvbnMpOworICAgICAgI2VuZGlmCisgICAgfQorCisgICAgLy8gV2h5IHRoaXMgb3ZlcmxvYWQsIERTaXplcyBpcyBkZXJpdmVkIGZyb20gYXJyYXkgPz8/IC8vCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXNpemUoY29uc3QgRFNpemVzPEluZGV4LCBOdW1JbmRpY2VzPiYgZGltZW5zaW9ucykgeworICAgICAgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGRpbXM7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bUluZGljZXM7ICsraSkgeworICAgICAgICBkaW1zW2ldID0gZGltZW5zaW9uc1tpXTsKKyAgICAgIH0KKyAgICAgIHJlc2l6ZShkaW1zKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgcmVzaXplKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG86IHJhbmsgMCB0ZW5zb3JzIGhhdmUgZml4ZWQgc2l6ZQorICAgIH0KKworICAgIC8qKiBDdXN0b20gRGltZW5zaW9uICovCisjaWZkZWYgRUlHRU5fSEFTX1NGSU5BRQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbURpbWVuc2lvbiwKKyAgICAgICAgICAgICBFSUdFTl9TRklOQUVfRU5BQkxFX0lGKCAhKGlzT2ZOb3JtYWxJbmRleDxDdXN0b21EaW1lbnNpb24+Ojp2YWx1ZSkgKQorICAgID4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVzaXplKEN1c3RvbURpbWVuc2lvbiYgZGltZW5zaW9ucykKKyAgICB7CisgICAgICByZXNpemUoaW50ZXJuYWw6OmN1c3RvbUluZGljZXMyQXJyYXk8SW5kZXgsTnVtSW5kaWNlcz4oZGltZW5zaW9ucykpOworICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0VNVUxBVEVfQ1hYMTFfTUVUQV9ICisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIHN0ZDo6cHRyZGlmZl90Li4uIEluZGljZXM+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICB2b2lkIHJlc2l6ZShjb25zdCBTaXplczxJbmRpY2VzLi4uPiYgZGltZW5zaW9ucykgeworICAgICAgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGRpbXM7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bUluZGljZXM7ICsraSkgeworICAgICAgICBkaW1zW2ldID0gc3RhdGljX2Nhc3Q8SW5kZXg+KGRpbWVuc2lvbnNbaV0pOworICAgICAgfQorICAgICAgcmVzaXplKGRpbXMpOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFYxLCBzdGQ6OnNpemVfdCBWMiwgc3RkOjpzaXplX3QgVjMsIHN0ZDo6c2l6ZV90IFY0LCBzdGQ6OnNpemVfdCBWNT4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIHZvaWQgcmVzaXplKGNvbnN0IFNpemVzPFYxLCBWMiwgVjMsIFY0LCBWNT4mIGRpbWVuc2lvbnMpIHsKKyAgICAgIGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiBkaW1zOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1JbmRpY2VzOyArK2kpIHsKKyAgICAgICAgZGltc1tpXSA9IHN0YXRpY19jYXN0PEluZGV4PihkaW1lbnNpb25zW2ldKTsKKyAgICAgIH0KKyAgICAgIHJlc2l6ZShkaW1zKTsKKyAgICB9CisjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisKKyAgICBib29sIGNoZWNrSW5kZXhSYW5nZShjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgaW50ZXJuYWw6OmFycmF5X2FwcGx5X2FuZF9yZWR1Y2U7CisgICAgICB1c2luZyBpbnRlcm5hbDo6YXJyYXlfemlwX2FuZF9yZWR1Y2U7CisgICAgICB1c2luZyBpbnRlcm5hbDo6Z3JlYXRlcl9lcXVhbF96ZXJvX29wOworICAgICAgdXNpbmcgaW50ZXJuYWw6OmxvZ2ljYWxfYW5kX29wOworICAgICAgdXNpbmcgaW50ZXJuYWw6Omxlc3Nlcl9vcDsKKworICAgICAgcmV0dXJuCisgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGluZGljZXMgYXJlIGFsbCA+PSAwCisgICAgICAgIGFycmF5X2FwcGx5X2FuZF9yZWR1Y2U8bG9naWNhbF9hbmRfb3AsIGdyZWF0ZXJfZXF1YWxfemVyb19vcD4oaW5kaWNlcykgJiYKKyAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgaW5kaWNlcyBmaXQgaW4gdGhlIGRpbWVuc2lvbnMKKyAgICAgICAgYXJyYXlfemlwX2FuZF9yZWR1Y2U8bG9naWNhbF9hbmRfb3AsIGxlc3Nlcl9vcD4oaW5kaWNlcywgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBsaW5lYXJpemVkSW5kZXgoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpLkluZGV4T2ZSb3dNYWpvcihpbmRpY2VzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpLkluZGV4T2ZDb2xNYWpvcihpbmRpY2VzKTsKKyAgICAgIH0KKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JBcmdNYXguaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQXJnTWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2ZjQwYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQXJnTWF4LmgKQEAgLTAsMCArMSwyOTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEV1Z2VuZSBCcmV2ZG8gPGVicmV2ZG9AZ21haWwuY29tPgorLy8gICAgICAgICAgICAgICAgICAgIEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9BUkdfTUFYX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9BUkdfTUFYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcY2xhc3MgVGVuc29ySW5kZXhUdXBsZQorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUZW5zb3IgKyBJbmRleCBUdXBsZSBjbGFzcy4KKyAgKgorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JJbmRleFR1cGxlT3A8WHByVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBUdXBsZTxJbmRleCwgdHlwZW5hbWUgWHByVHJhaXRzOjpTY2FsYXI+IFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29ySW5kZXhUdXBsZU9wPFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29ySW5kZXhUdXBsZU9wPFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29ySW5kZXhUdXBsZU9wPFhwclR5cGU+LCAxLAorICAgICAgICAgICAgICB0eXBlbmFtZSBldmFsPFRlbnNvckluZGV4VHVwbGVPcDxYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckluZGV4VHVwbGVPcDxYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29ySW5kZXhUdXBsZU9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29ySW5kZXhUdXBsZU9wPFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckluZGV4VHVwbGVPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29ySW5kZXhUdXBsZU9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29ySW5kZXhUdXBsZU9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29ySW5kZXhUdXBsZU9wPjo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgVHVwbGU8SW5kZXgsIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT4gQ29lZmZSZXR1cm5UeXBlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29ySW5kZXhUdXBsZU9wKGNvbnN0IFhwclR5cGUmIGV4cHIpCisgICAgICA6IG1feHByKGV4cHIpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKK307CisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckluZGV4VHVwbGVPcDxBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvckluZGV4VHVwbGVPcDxBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPERpbWVuc2lvbnM+Ojp2YWx1ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQqLyBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MqLyBmYWxzZSwKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSkgeyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtX2ltcGwuZGltZW5zaW9ucygpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIENvZWZmUmV0dXJuVHlwZShpbmRleCwgbV9pbXBsLmNvZWZmKGluZGV4KSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgcmV0dXJuIG1faW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKyBUZW5zb3JPcENvc3QoMCwgMCwgMSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyBwcm90ZWN0ZWQ6CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcY2xhc3MgVGVuc29yVHVwbGVJbmRleAorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBDb252ZXJ0cyB0byBUZW5zb3I8VHVwbGU8SW5kZXgsIFNjYWxhcj4gPiBhbmQgcmVkdWNlcyB0byBUZW5zb3I8SW5kZXg+LgorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCB0cmFpdHM8VGVuc29yVHVwbGVSZWR1Y2VyT3A8UmVkdWNlT3AsIERpbXMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHJhaXRzPFhwclR5cGU+IFhwclRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgSW5kZXggU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9ucyAtIGFycmF5X3NpemU8RGltcz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlT3AsIHR5cGVuYW1lIERpbXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JUdXBsZVJlZHVjZXJPcDxSZWR1Y2VPcCwgRGltcywgWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JUdXBsZVJlZHVjZXJPcDxSZWR1Y2VPcCwgRGltcywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yVHVwbGVSZWR1Y2VyT3A8UmVkdWNlT3AsIERpbXMsIFhwclR5cGU+LCAxLAorICAgICAgICAgICAgICB0eXBlbmFtZSBldmFsPFRlbnNvclR1cGxlUmVkdWNlck9wPFJlZHVjZU9wLCBEaW1zLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclR1cGxlUmVkdWNlck9wPFJlZHVjZU9wLCBEaW1zLCBYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIFRlbnNvclR1cGxlUmVkdWNlck9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yVHVwbGVSZWR1Y2VyT3A8UmVkdWNlT3AsIERpbXMsIFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclR1cGxlUmVkdWNlck9wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JUdXBsZVJlZHVjZXJPcD46OnR5cGUgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclR1cGxlUmVkdWNlck9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yVHVwbGVSZWR1Y2VyT3A+OjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBJbmRleCBDb2VmZlJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JUdXBsZVJlZHVjZXJPcChjb25zdCBYcHJUeXBlJiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZHVjZU9wJiByZWR1Y2Vfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJldHVybl9kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGltcyYgcmVkdWNlX2RpbXMpCisgICAgICA6IG1feHByKGV4cHIpLCBtX3JlZHVjZV9vcChyZWR1Y2Vfb3ApLCBtX3JldHVybl9kaW0ocmV0dXJuX2RpbSksIG1fcmVkdWNlX2RpbXMocmVkdWNlX2RpbXMpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgUmVkdWNlT3AmIHJlZHVjZV9vcCgpIGNvbnN0IHsgcmV0dXJuIG1fcmVkdWNlX29wOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgRGltcyYgcmVkdWNlX2RpbXMoKSBjb25zdCB7IHJldHVybiBtX3JlZHVjZV9kaW1zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgaW50IHJldHVybl9kaW0oKSBjb25zdCB7IHJldHVybiBtX3JldHVybl9kaW07IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFJlZHVjZU9wIG1fcmVkdWNlX29wOworICAgIGNvbnN0IGludCBtX3JldHVybl9kaW07CisgICAgY29uc3QgRGltcyBtX3JlZHVjZV9kaW1zOworfTsKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZU9wLCB0eXBlbmFtZSBEaW1zLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclR1cGxlUmVkdWNlck9wPFJlZHVjZU9wLCBEaW1zLCBBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvclR1cGxlUmVkdWNlck9wPFJlZHVjZU9wLCBEaW1zLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JJbmRleFR1cGxlT3A8QXJnVHlwZT46OkNvZWZmUmV0dXJuVHlwZSBUdXBsZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPFJlZHVjZU9wLCBEaW1zLCBjb25zdCBUZW5zb3JJbmRleFR1cGxlT3A8QXJnVHlwZT4gPiwgRGV2aWNlPjo6RGltZW5zaW9ucyBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JJbmRleFR1cGxlT3A8QXJnVHlwZT4gLCBEZXZpY2U+OjpEaW1lbnNpb25zIElucHV0RGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8SW5wdXREaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIE51bURpbXM+IFN0cmlkZURpbXM7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gLypUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkKi8gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gLypUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzKi8gZmFsc2UsCisgICAgQmxvY2tBY2Nlc3MgPSBmYWxzZSwKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVkdWN0aW9uT3A8UmVkdWNlT3AsIERpbXMsIGNvbnN0IFRlbnNvckluZGV4VHVwbGVPcDxBcmdUeXBlPiA+LCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1fb3JpZ19pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKSwKKyAgICAgICAgbV9pbXBsKG9wLmV4cHJlc3Npb24oKS5pbmRleF90dXBsZXMoKS5yZWR1Y2Uob3AucmVkdWNlX2RpbXMoKSwgb3AucmVkdWNlX29wKCkpLCBkZXZpY2UpLAorICAgICAgICBtX3JldHVybl9kaW0ob3AucmV0dXJuX2RpbSgpKSB7CisKKyAgICBnZW5fc3RyaWRlcyhtX29yaWdfaW1wbC5kaW1lbnNpb25zKCksIG1fc3RyaWRlcyk7CisgICAgaWYgKExheW91dCA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgY29uc3QgSW5kZXggdG90YWxfc2l6ZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fb3JpZ19pbXBsLmRpbWVuc2lvbnMoKSk7CisgICAgICBtX3N0cmlkZV9tb2QgPSAobV9yZXR1cm5fZGltIDwgTnVtRGltcyAtIDEpID8gbV9zdHJpZGVzW21fcmV0dXJuX2RpbSArIDFdIDogdG90YWxfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgSW5kZXggdG90YWxfc2l6ZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fb3JpZ19pbXBsLmRpbWVuc2lvbnMoKSk7CisgICAgICBtX3N0cmlkZV9tb2QgPSAobV9yZXR1cm5fZGltID4gMCkgPyBtX3N0cmlkZXNbbV9yZXR1cm5fZGltIC0gMV0gOiB0b3RhbF9zaXplOworICAgIH0KKyAgICBtX3N0cmlkZV9kaXYgPSBtX3N0cmlkZXNbbV9yZXR1cm5fZGltXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9pbXBsLmRpbWVuc2lvbnMoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqIC8qZGF0YSovKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1faW1wbC5jbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QgeworICAgIGNvbnN0IFR1cGxlVHlwZSB2ID0gbV9pbXBsLmNvZWZmKGluZGV4KTsKKyAgICByZXR1cm4gKG1fcmV0dXJuX2RpbSA8IDApID8gdi5maXJzdCA6ICh2LmZpcnN0ICUgbV9zdHJpZGVfbW9kKSAvIG1fc3RyaWRlX2RpdjsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IDEuMCArCisgICAgICAgIChtX3JldHVybl9kaW0gPCAwID8gMC4wIDogKFRlbnNvck9wQ29zdDo6TW9kQ29zdDxJbmRleD4oKSArIFRlbnNvck9wQ29zdDo6RGl2Q29zdDxJbmRleD4oKSkpOworICAgIHJldHVybiBtX29yaWdfaW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsgVGVuc29yT3BDb3N0KDAsIDAsIGNvbXB1dGVfY29zdCk7CisgIH0KKworIHByaXZhdGU6CisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgZ2VuX3N0cmlkZXMoY29uc3QgSW5wdXREaW1lbnNpb25zJiBkaW1zLCBTdHJpZGVEaW1zJiBzdHJpZGVzKSB7CisgICAgaWYgKG1fcmV0dXJuX2RpbSA8IDApIHsKKyAgICAgIHJldHVybjsgIC8vIFdvbid0IGJlIHVzaW5nIHRoZSBzdHJpZGVzLgorICAgIH0KKyAgICBlaWdlbl9hc3NlcnQobV9yZXR1cm5fZGltIDwgTnVtRGltcyAmJgorICAgICAgICAgICAgICAgICAiQXNraW5nIHRvIGNvbnZlcnQgaW5kZXggdG8gYSBkaW1lbnNpb24gb3V0c2lkZSBvZiB0aGUgcmFuayIpOworCisgICAgLy8gQ2FsY3VsYXRlIG1fc3RyaWRlX2RpdiBhbmQgbV9zdHJpZGVfbW9kLCB3aGljaCBhcmUgdXNlZCB0bworICAgIC8vIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgYW4gaW5kZXggdy5yLnQuIHRoZSBtX3JldHVybl9kaW0uCisgICAgaWYgKExheW91dCA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgc3RyaWRlc1swXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBzdHJpZGVzW2ldID0gc3RyaWRlc1tpLTFdICogZGltc1tpLTFdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHJpZGVzW051bURpbXMtMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBzdHJpZGVzW2ldID0gc3RyaWRlc1tpKzFdICogZGltc1tpKzFdOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29ySW5kZXhUdXBsZU9wPEFyZ1R5cGU+LCBEZXZpY2U+IG1fb3JpZ19pbXBsOworICBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVkdWN0aW9uT3A8UmVkdWNlT3AsIERpbXMsIGNvbnN0IFRlbnNvckluZGV4VHVwbGVPcDxBcmdUeXBlPiA+LCBEZXZpY2U+IG1faW1wbDsKKyAgY29uc3QgaW50IG1fcmV0dXJuX2RpbTsKKyAgU3RyaWRlRGltcyBtX3N0cmlkZXM7CisgIEluZGV4IG1fc3RyaWRlX21vZDsKKyAgSW5kZXggbV9zdHJpZGVfZGl2OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0FSR19NQVhfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JBc3NpZ24uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQXNzaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2YmUyMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQXNzaWduLmgKQEAgLTAsMCArMSwxODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9BU1NJR05fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0FTU0lHTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yQXNzaWduCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRoZSB0ZW5zb3IgYXNzaWdubWVudCBjbGFzcy4KKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgcmVwcmVzZW50cyB0aGUgYXNzaWdubWVudCBvZiB0aGUgdmFsdWVzIHJlc3VsdGluZyBmcm9tIHRoZSBldmFsdWF0aW9uIG9mCisgICogdGhlIHJocyBleHByZXNzaW9uIHRvIHRoZSBtZW1vcnkgbG9jYXRpb25zIGRlbm90ZWQgYnkgdGhlIGxocyBleHByZXNzaW9uLgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckFzc2lnbk9wPExoc1hwclR5cGUsIFJoc1hwclR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHNYcHJUeXBlPjo6SW5kZXg+Ojp0eXBlIEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZCBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkIFJoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IE51bURpbWVuc2lvbnMgPSBpbnRlcm5hbDo6dHJhaXRzPExoc1hwclR5cGU+OjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IGludGVybmFsOjp0cmFpdHM8TGhzWHByVHlwZT46OkxheW91dDsKKworICBlbnVtIHsKKyAgICBGbGFncyA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JBc3NpZ25PcDxMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckFzc2lnbk9wPExoc1hwclR5cGUsIFJoc1hwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQXNzaWduT3A8TGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yQXNzaWduT3A8TGhzWHByVHlwZSwgUmhzWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK2NsYXNzIFRlbnNvckFzc2lnbk9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yQXNzaWduT3A8TGhzWHByVHlwZSwgUmhzWHByVHlwZT4gPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQXNzaWduT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIExoc1hwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yQXNzaWduT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JBc3NpZ25PcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckFzc2lnbk9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JBc3NpZ25PcChMaHNYcHJUeXBlJiBsaHMsIGNvbnN0IFJoc1hwclR5cGUmIHJocykKKyAgICAgIDogbV9saHNfeHByKGxocyksIG1fcmhzX3hwcihyaHMpIHt9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9ucyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgTGhzWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBsaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gKigodHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgTGhzWHByVHlwZTo6TmVzdGVkPjo6dHlwZSopJm1fbGhzX3hwcik7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICByaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9yaHNfeHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZD46OnR5cGUmIG1fbGhzX3hwcjsKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHNYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJiBtX3Joc194cHI7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIExlZnRBcmdUeXBlLCB0eXBlbmFtZSBSaWdodEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQXNzaWduT3A8TGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCAmIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBSYXdBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OlJhd0FjY2VzcworICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpIDoKKyAgICAgIG1fbGVmdEltcGwob3AubGhzRXhwcmVzc2lvbigpLCBkZXZpY2UpLAorICAgICAgbV9yaWdodEltcGwob3AucmhzRXhwcmVzc2lvbigpLCBkZXZpY2UpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OkxheW91dCkpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0CisgIHsKKyAgICAvLyBUaGUgZGltZW5zaW9ucyBvZiB0aGUgbGhzIGFuZCB0aGUgcmhzIHRlbnNvcnMgc2hvdWxkIGJlIGVxdWFsIHRvIHByZXZlbnQKKyAgICAvLyBvdmVyZmxvd3MgYW5kIGVuc3VyZSB0aGUgcmVzdWx0IGlzIGZ1bGx5IGluaXRpYWxpemVkLgorICAgIC8vIFRPRE86IHVzZSBsZWZ0IGltcGwgaW5zdGVhZCBpZiByaWdodCBpbXBsIGRpbWVuc2lvbnMgYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZS4KKyAgICByZXR1cm4gbV9yaWdodEltcGwuZGltZW5zaW9ucygpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciopIHsKKyAgICBlaWdlbl9hc3NlcnQoZGltZW5zaW9uc19tYXRjaChtX2xlZnRJbXBsLmRpbWVuc2lvbnMoKSwgbV9yaWdodEltcGwuZGltZW5zaW9ucygpKSk7CisgICAgbV9sZWZ0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICAvLyBJZiB0aGUgbGhzIHByb3ZpZGVzIHJhdyBhY2Nlc3MgdG8gaXRzIHN0b3JhZ2UgYXJlYSAoaS5lLiBpZiBtX2xlZnRJbXBsLmRhdGEoKSByZXR1cm5zIGEgbm9uCisgICAgLy8gbnVsbCB2YWx1ZSksIGF0dGVtcHQgdG8gZXZhbHVhdGUgdGhlIHJocyBleHByZXNzaW9uIGluIHBsYWNlLiBSZXR1cm5zIHRydWUgaWZmIGluIHBsYWNlCisgICAgLy8gZXZhbHVhdGlvbiBpc24ndCBzdXBwb3J0ZWQgYW5kIHRoZSBjYWxsZXIgc3RpbGwgbmVlZHMgdG8gbWFudWFsbHkgYXNzaWduIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCisgICAgLy8gYnkgdGhlIHJocyB0byB0aGUgbGhzLgorICAgIHJldHVybiBtX3JpZ2h0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChtX2xlZnRJbXBsLmRhdGEoKSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9sZWZ0SW1wbC5jbGVhbnVwKCk7CisgICAgbV9yaWdodEltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGV2YWxTY2FsYXIoSW5kZXggaSkgeworICAgIG1fbGVmdEltcGwuY29lZmZSZWYoaSkgPSBtX3JpZ2h0SW1wbC5jb2VmZihpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZXZhbFBhY2tldChJbmRleCBpKSB7CisgICAgY29uc3QgaW50IExoc1N0b3JlTW9kZSA9IFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkID8gQWxpZ25lZCA6IFVuYWxpZ25lZDsKKyAgICBjb25zdCBpbnQgUmhzTG9hZE1vZGUgPSBUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQgPyBBbGlnbmVkIDogVW5hbGlnbmVkOworICAgIG1fbGVmdEltcGwudGVtcGxhdGUgd3JpdGVQYWNrZXQ8TGhzU3RvcmVNb2RlPihpLCBtX3JpZ2h0SW1wbC50ZW1wbGF0ZSBwYWNrZXQ8UmhzTG9hZE1vZGU+KGkpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9sZWZ0SW1wbC5jb2VmZihpbmRleCk7CisgIH0KKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2xlZnRJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGV2YWxQYWNrZXQgb3IgZXZhbFNjYWxhciBpcyBjYWxsZWQgdG8gcGVyZm9ybSB0aGUKKyAgICAvLyBhc3NpZ25tZW50IGFuZCBhY2NvdW50IGZvciB0aGUgY29zdCBvZiB0aGUgd3JpdGUgaGVyZSwgYnV0IHJlZHVjZSBsZWZ0CisgICAgLy8gY29zdCBieSBvbmUgbG9hZCBiZWNhdXNlIHdlIGFyZSB1c2luZyBtX2xlZnRJbXBsLmNvZWZmUmVmLgorICAgIFRlbnNvck9wQ29zdCBsZWZ0ID0gbV9sZWZ0SW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCk7CisgICAgcmV0dXJuIG1fcmlnaHRJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIFRlbnNvck9wQ29zdCgKKyAgICAgICAgICAgICAgIG51bWV4dDo6bWF4aSgwLjAsIGxlZnQuYnl0ZXNfbG9hZGVkKCkgLSBzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSksCisgICAgICAgICAgICAgICBsZWZ0LmJ5dGVzX3N0b3JlZCgpLCBsZWZ0LmNvbXB1dGVfY3ljbGVzKCkpICsKKyAgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCB2ZWN0b3JpemVkLCBQYWNrZXRTaXplKTsKKyAgfQorCisgIC8vLyByZXF1aXJlZCBieSBzeWNsIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGFjY2Vzc29yCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPiYgbGVmdF9pbXBsKCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0SW1wbDsgfQorICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+JiByaWdodF9pbXBsKCkgY29uc3QgeyByZXR1cm4gbV9yaWdodEltcGw7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2xlZnRJbXBsLmRhdGEoKTsgfQorCisgcHJpdmF0ZToKKyAgVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+IG1fbGVmdEltcGw7CisgIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT4gbV9yaWdodEltcGw7Cit9OworCit9CisKKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQVNTSUdOX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQmFzZS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0NWE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQmFzZS5oCkBAIC0wLDAgKzEsMTAxMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0JBU0VfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0JBU0VfSAorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yQmFzZQorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUaGUgdGVuc29yIGJhc2UgY2xhc3MuCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIHRoZSBjb21tb24gcGFyZW50IG9mIHRoZSBUZW5zb3IgYW5kIFRlbnNvck1hcCBjbGFzcywgdGh1cworICAqIG1ha2luZyBpdCBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIGNsYXNzIGludGVyY2hhbmdhYmx5IGluIGV4cHJlc3Npb25zLgorICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgVGVuc29yQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPiBEZXJpdmVkVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZFRyYWl0czo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWRUcmFpdHM6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxTY2FsYXI+Ojp0eXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBEZXJpdmVkVHJhaXRzOjpOdW1EaW1lbnNpb25zOworCisgICAgLy8gR2VuZXJpYyBudWxsYXJ5IG9wZXJhdGlvbiBzdXBwb3J0LgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIGNvbnN0IERlcml2ZWQ+CisgICAgbnVsbGFyeUV4cHIoY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ3dpc2VOdWxsYXJ5T3A8Q3VzdG9tTnVsbGFyeU9wLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGZ1bmMpOworICAgIH0KKworICAgIC8vIENvZWZmaWNpZW50LXdpc2UgbnVsbGFyeSBvcGVyYXRvcnMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGNvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsdWUpIGNvbnN0IHsKKyAgICAgIHJldHVybiBudWxsYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4odmFsdWUpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OlVuaWZvcm1SYW5kb21HZW5lcmF0b3I8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICByYW5kb20oKSBjb25zdCB7CisgICAgICByZXR1cm4gbnVsbGFyeUV4cHIoaW50ZXJuYWw6OlVuaWZvcm1SYW5kb21HZW5lcmF0b3I8U2NhbGFyPigpKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmRvbUdlbmVyYXRvcj4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlTnVsbGFyeU9wPFJhbmRvbUdlbmVyYXRvciwgY29uc3QgRGVyaXZlZD4KKyAgICByYW5kb20oY29uc3QgUmFuZG9tR2VuZXJhdG9yJiBnZW4gPSBSYW5kb21HZW5lcmF0b3IoKSkgY29uc3QgeworICAgICAgcmV0dXJuIG51bGxhcnlFeHByKGdlbik7CisgICAgfQorCisgICAgLy8gVGVuc29yIGdlbmVyYXRpb24KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBjb25zdCBEZXJpdmVkPgorICAgIGdlbmVyYXRlKGNvbnN0IEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGdlbmVyYXRvcik7CisgICAgfQorCisgICAgLy8gR2VuZXJpYyB1bmFyeSBvcGVyYXRpb24gc3VwcG9ydC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ3VzdG9tVW5hcnlPcD4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxDdXN0b21VbmFyeU9wLCBjb25zdCBEZXJpdmVkPgorICAgIHVuYXJ5RXhwcihjb25zdCBDdXN0b21VbmFyeU9wJiBmdW5jKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ3dpc2VVbmFyeU9wPEN1c3RvbVVuYXJ5T3AsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZnVuYyk7CisgICAgfQorCisgICAgLy8gQ29lZmZpY2llbnQtd2lzZSB1bmFyeSBvcGVyYXRvcnMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3FydF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIHNxcnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfc3FydF9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zaWduX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgc2lnbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9zaWduX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3JzcXJ0X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgcnNxcnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfcnNxcnRfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3F1YXJlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgc3F1YXJlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX3NxdWFyZV9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jdWJlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgY3ViZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9jdWJlX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICBpbnZlcnNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfdGFuaF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIHRhbmgoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfdGFuaF9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9sZ2FtbWFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICBsZ2FtbWEoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfbGdhbW1hX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZ2FtbWFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICBkaWdhbW1hKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2RpZ2FtbWFfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICAvLyBpZ2FtbWEoYSA9IHRoaXMsIHggPSBvdGhlcikKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaWdhbW1hX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBpZ2FtbWEoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGJpbmFyeUV4cHIob3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX2lnYW1tYV9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIC8vIGlnYW1tYWMoYSA9IHRoaXMsIHggPSBvdGhlcikKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaWdhbW1hY19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgaWdhbW1hYyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfaWdhbW1hY19vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIC8vIHpldGEoeCA9IHRoaXMsIHEgPSBvdGhlcikKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfemV0YV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgemV0YShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfemV0YV9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIC8vIHBvbHlnYW1tYShuID0gdGhpcywgeCA9IG90aGVyKQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wb2x5Z2FtbWFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIHBvbHlnYW1tYShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfcG9seWdhbW1hX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2VyZl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGVyZigpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9lcmZfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZXJmY19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGVyZmMoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfZXJmY19vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zaWdtb2lkX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgc2lnbW9pZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9zaWdtb2lkX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2V4cF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGV4cCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9leHBfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbG9nX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgbG9nKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2xvZ19vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9sb2cxcF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGxvZzFwKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2xvZzFwX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Fic19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGFicygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9hYnNfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgY29uanVnYXRlKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OmJpbmQybmRfb3A8aW50ZXJuYWw6OnNjYWxhcl9wb3dfb3A8U2NhbGFyLFNjYWxhcj4gPiwgY29uc3QgRGVyaXZlZD4KKyAgICBwb3coU2NhbGFyIGV4cG9uZW50KSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpiaW5kMm5kX29wPGludGVybmFsOjpzY2FsYXJfcG93X29wPFNjYWxhcixTY2FsYXI+ID4oZXhwb25lbnQpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcmVhbF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIHJlYWwoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfcmVhbF9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9pbWFnX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgaW1hZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9pbWFnX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPgorICAgIG9wZXJhdG9yKyAoU2NhbGFyIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPiA+KHJocykpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBmcmllbmQKKyAgICBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OmJpbmQxc3Rfb3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPgorICAgIG9wZXJhdG9yKyAoU2NhbGFyIGxocywgY29uc3QgRGVyaXZlZCYgcmhzKSB7CisgICAgICByZXR1cm4gcmhzLnVuYXJ5RXhwcihpbnRlcm5hbDo6YmluZDFzdF9vcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+ID4obGhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyLFNjYWxhcj4gPiwgY29uc3QgRGVyaXZlZD4KKyAgICBvcGVyYXRvci0gKFNjYWxhciByaHMpIGNvbnN0IHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE51bVRyYWl0czxTY2FsYXI+OjpJc1NpZ25lZCB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6dmFsdWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyLFNjYWxhcj4gPihyaHMpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgZnJpZW5kCisgICAgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpiaW5kMXN0X29wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+ID4sIGNvbnN0IERlcml2ZWQ+CisgICAgb3BlcmF0b3ItIChTY2FsYXIgbGhzLCBjb25zdCBEZXJpdmVkJiByaHMpIHsKKyAgICAgIHJldHVybiByaHMudW5hcnlFeHByKGludGVybmFsOjpiaW5kMXN0X29wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+ID4obGhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyLFNjYWxhcj4gPiwgY29uc3QgRGVyaXZlZD4KKyAgICBvcGVyYXRvciogKFNjYWxhciByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OmJpbmQybmRfb3A8aW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcixTY2FsYXI+ID4ocmhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGZyaWVuZAorICAgIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6YmluZDFzdF9vcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPgorICAgIG9wZXJhdG9yKiAoU2NhbGFyIGxocywgY29uc3QgRGVyaXZlZCYgcmhzKSB7CisgICAgICByZXR1cm4gcmhzLnVuYXJ5RXhwcihpbnRlcm5hbDo6YmluZDFzdF9vcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiA+KGxocykpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OmJpbmQybmRfb3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXIsU2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPgorICAgIG9wZXJhdG9yLyAoU2NhbGFyIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6YmluZDJuZF9vcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcixTY2FsYXI+ID4ocmhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGZyaWVuZAorICAgIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6YmluZDFzdF9vcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4gPiwgY29uc3QgRGVyaXZlZD4KKyAgICBvcGVyYXRvci8gKFNjYWxhciBsaHMsIGNvbnN0IERlcml2ZWQmIHJocykgeworICAgICAgcmV0dXJuIHJocy51bmFyeUV4cHIoaW50ZXJuYWw6OmJpbmQxc3Rfb3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXI+ID4obGhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21vZF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIG9wZXJhdG9yJSAoU2NhbGFyIHJocykgY29uc3QgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0VfVFJZX01PRCk7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfbW9kX29wPFNjYWxhcj4ocmhzKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tYXhfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiA+CisgICAgY3dpc2VNYXgoU2NhbGFyIHRocmVzaG9sZCkgY29uc3QgeworICAgICAgcmV0dXJuIGN3aXNlTWF4KGNvbnN0YW50KHRocmVzaG9sZCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWluX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IFRlbnNvckN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gPgorICAgIGN3aXNlTWluKFNjYWxhciB0aHJlc2hvbGQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjd2lzZU1pbihjb25zdGFudCh0aHJlc2hvbGQpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTmV3VHlwZT4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckNvbnZlcnNpb25PcDxOZXdUeXBlLCBjb25zdCBEZXJpdmVkPgorICAgIGNhc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ29udmVyc2lvbk9wPE5ld1R5cGUsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3JvdW5kX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgcm91bmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfcm91bmRfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY2VpbF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGNlaWwoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfY2VpbF9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9mbG9vcl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIGZsb29yKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2Zsb29yX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgLy8gR2VuZXJpYyBiaW5hcnkgb3BlcmF0aW9uIHN1cHBvcnQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEN1c3RvbUJpbmFyeU9wLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPEN1c3RvbUJpbmFyeU9wLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgYmluYXJ5RXhwcihjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyLCBjb25zdCBDdXN0b21CaW5hcnlPcCYgZnVuYykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckN3aXNlQmluYXJ5T3A8Q3VzdG9tQmluYXJ5T3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlciwgZnVuYyk7CisgICAgfQorCisgICAgLy8gQ29lZmZpY2llbnQtd2lzZSBiaW5hcnkgb3BlcmF0b3JzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yKyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yLShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvciooY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGJpbmFyeUV4cHIob3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yLyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyPigpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWF4X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBjd2lzZU1heChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfbWF4X29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgY3dpc2VNaW4oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGJpbmFyeUV4cHIob3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXI+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX2FuZF9vcCwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yJiYoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGJpbmFyeUV4cHIob3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5fYW5kX29wKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX29yX29wLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgb3BlcmF0b3J8fChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfYm9vbGVhbl9vcl9vcCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYm9vbGVhbl94b3Jfb3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvcl4oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGJpbmFyeUV4cHIob3RoZXIuZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5feG9yX29wKCkpOworICAgIH0KKworICAgIC8vIENvbXBhcmlzb25zIGFuZCB0ZXN0cy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0xUPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yPChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0xUPigpKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9MRT4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvcjw9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiaW5hcnlFeHByKG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfTEU+KCkpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0dUPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIG9wZXJhdG9yPihjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0dUPigpKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9HRT4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvcj49KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiaW5hcnlFeHByKG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfR0U+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfRVE+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+CisgICAgb3BlcmF0b3I9PShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gYmluYXJ5RXhwcihvdGhlci5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0VRPigpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX05FUT4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBvcGVyYXRvciE9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBiaW5hcnlFeHByKG90aGVyLmRlcml2ZWQoKSwgaW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfTkVRPigpKTsKKyAgICB9CisKKyAgICAvLyBjb21wYXJpc29ucyBhbmQgdGVzdHMgZm9yIFNjYWxhcnMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9MVD4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IFRlbnNvckN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gPgorICAgIG9wZXJhdG9yPChTY2FsYXIgdGhyZXNob2xkKSBjb25zdCB7CisgICAgICByZXR1cm4gb3BlcmF0b3I8KGNvbnN0YW50KHRocmVzaG9sZCkpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9MRT4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IFRlbnNvckN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gPgorICAgIG9wZXJhdG9yPD0oU2NhbGFyIHRocmVzaG9sZCkgY29uc3QgeworICAgICAgcmV0dXJuIG9wZXJhdG9yPD0oY29uc3RhbnQodGhyZXNob2xkKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0dUPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiA+CisgICAgb3BlcmF0b3I+KFNjYWxhciB0aHJlc2hvbGQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBvcGVyYXRvcj4oY29uc3RhbnQodGhyZXNob2xkKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY21wX29wPFNjYWxhciwgU2NhbGFyLCBpbnRlcm5hbDo6Y21wX0dFPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiA+CisgICAgb3BlcmF0b3I+PShTY2FsYXIgdGhyZXNob2xkKSBjb25zdCB7CisgICAgICByZXR1cm4gb3BlcmF0b3I+PShjb25zdGFudCh0aHJlc2hvbGQpKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jbXBfb3A8U2NhbGFyLCBTY2FsYXIsIGludGVybmFsOjpjbXBfRVE+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBUZW5zb3JDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+ID4KKyAgICBvcGVyYXRvcj09KFNjYWxhciB0aHJlc2hvbGQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBvcGVyYXRvcj09KGNvbnN0YW50KHRocmVzaG9sZCkpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9ORVE+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBUZW5zb3JDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+ID4KKyAgICBvcGVyYXRvciE9KFNjYWxhciB0aHJlc2hvbGQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBvcGVyYXRvciE9KGNvbnN0YW50KHRocmVzaG9sZCkpOworICAgIH0KKworICAgIC8vIENoZWNrcworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorICAgIChpc25hbikoKSBjb25zdCB7CisgICAgICByZXR1cm4gdW5hcnlFeHByKGludGVybmFsOjpzY2FsYXJfaXNuYW5fb3A8U2NhbGFyPigpKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2lzaW5mX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgKGlzaW5mKSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1bmFyeUV4cHIoaW50ZXJuYWw6OnNjYWxhcl9pc2luZl9vcDxTY2FsYXI+KCkpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaXNmaW5pdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICAoaXNmaW5pdGUpKCkgY29uc3QgeworICAgICAgcmV0dXJuIHVuYXJ5RXhwcihpbnRlcm5hbDo6c2NhbGFyX2lzZmluaXRlX29wPFNjYWxhcj4oKSk7CisgICAgfQorCisgICAgLy8gQ29lZmZpY2llbnQtd2lzZSB0ZXJuYXJ5IG9wZXJhdG9ycy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZCwgdHlwZW5hbWUgRWxzZURlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTZWxlY3RPcDxjb25zdCBEZXJpdmVkLCBjb25zdCBUaGVuRGVyaXZlZCwgY29uc3QgRWxzZURlcml2ZWQ+CisgICAgc2VsZWN0KGNvbnN0IFRoZW5EZXJpdmVkJiB0aGVuVGVuc29yLCBjb25zdCBFbHNlRGVyaXZlZCYgZWxzZVRlbnNvcikgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclNlbGVjdE9wPGNvbnN0IERlcml2ZWQsIGNvbnN0IFRoZW5EZXJpdmVkLCBjb25zdCBFbHNlRGVyaXZlZD4oZGVyaXZlZCgpLCB0aGVuVGVuc29yLmRlcml2ZWQoKSwgZWxzZVRlbnNvci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8vIENvbnRyYWN0aW9ucy4KKyAgICB0eXBlZGVmIEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+IERpbWVuc2lvblBhaXI7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIHR5cGVuYW1lIERpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDb250cmFjdGlvbk9wPGNvbnN0IERpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBjb250cmFjdChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyLCBjb25zdCBEaW1lbnNpb25zJiBkaW1zKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ29udHJhY3Rpb25PcDxjb25zdCBEaW1lbnNpb25zLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBkaW1zKTsKKyAgICB9CisKKyAgICAvLyBDb252b2x1dGlvbnMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsRGVyaXZlZCwgdHlwZW5hbWUgRGltZW5zaW9ucz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckNvbnZvbHV0aW9uT3A8Y29uc3QgRGltZW5zaW9ucywgY29uc3QgRGVyaXZlZCwgY29uc3QgS2VybmVsRGVyaXZlZD4KKyAgICBjb252b2x2ZShjb25zdCBLZXJuZWxEZXJpdmVkJiBrZXJuZWwsIGNvbnN0IERpbWVuc2lvbnMmIGRpbXMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JDb252b2x1dGlvbk9wPGNvbnN0IERpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQsIGNvbnN0IEtlcm5lbERlcml2ZWQ+KGRlcml2ZWQoKSwga2VybmVsLmRlcml2ZWQoKSwgZGltcyk7CisgICAgfQorCisgICAgLy8gRm91cmllciB0cmFuc2Zvcm1zCisgICAgdGVtcGxhdGUgPGludCBGRlREYXRhVHlwZSwgaW50IEZGVERpcmVjdGlvbiwgdHlwZW5hbWUgRkZUPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yRkZUT3A8Y29uc3QgRkZULCBjb25zdCBEZXJpdmVkLCBGRlREYXRhVHlwZSwgRkZURGlyZWN0aW9uPgorICAgIGZmdChjb25zdCBGRlQmIGZmdCkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckZGVE9wPGNvbnN0IEZGVCwgY29uc3QgRGVyaXZlZCwgRkZURGF0YVR5cGUsIEZGVERpcmVjdGlvbj4oZGVyaXZlZCgpLCBmZnQpOworICAgIH0KKworICAgIC8vIFNjYW4uCisgICAgdHlwZWRlZiBUZW5zb3JTY2FuT3A8aW50ZXJuYWw6OlN1bVJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGVyaXZlZD4gVGVuc29yU2NhblN1bU9wOworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTY2FuU3VtT3AKKyAgICBjdW1zdW0oY29uc3QgSW5kZXgmIGF4aXMsIGJvb2wgZXhjbHVzaXZlID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JTY2FuU3VtT3AoZGVyaXZlZCgpLCBheGlzLCBleGNsdXNpdmUpOworICAgIH0KKworICAgIHR5cGVkZWYgVGVuc29yU2Nhbk9wPGludGVybmFsOjpQcm9kUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEZXJpdmVkPiBUZW5zb3JTY2FuUHJvZE9wOworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTY2FuUHJvZE9wCisgICAgY3VtcHJvZChjb25zdCBJbmRleCYgYXhpcywgYm9vbCBleGNsdXNpdmUgPSBmYWxzZSkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclNjYW5Qcm9kT3AoZGVyaXZlZCgpLCBheGlzLCBleGNsdXNpdmUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWR1Y2VyPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTY2FuT3A8UmVkdWNlciwgY29uc3QgRGVyaXZlZD4KKyAgICBzY2FuKGNvbnN0IEluZGV4JiBheGlzLCBjb25zdCBSZWR1Y2VyJiByZWR1Y2VyLCBib29sIGV4Y2x1c2l2ZSA9IGZhbHNlKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yU2Nhbk9wPFJlZHVjZXIsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgYXhpcywgZXhjbHVzaXZlLCByZWR1Y2VyKTsKKyAgICB9CisKKyAgICAvLyBSZWR1Y3Rpb25zLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6OlN1bVJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGltcywgY29uc3QgRGVyaXZlZD4KKyAgICBzdW0oY29uc3QgRGltcyYgZGltcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpTdW1SZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZGltcywgaW50ZXJuYWw6OlN1bVJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPigpKTsKKyAgICB9CisKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6U3VtUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiwgY29uc3QgRGVyaXZlZD4KKyAgICBzdW0oKSBjb25zdCB7CisgICAgICBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiBpbl9kaW1zOworICAgICAgcmV0dXJuIFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpTdW1SZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGluX2RpbXMsIGludGVybmFsOjpTdW1SZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERpbXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWVhblJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGltcywgY29uc3QgRGVyaXZlZD4KKyAgICBtZWFuKGNvbnN0IERpbXMmIGRpbXMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWVhblJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGltcywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBkaW1zLCBpbnRlcm5hbDo6TWVhblJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPigpKTsKKyAgICB9CisKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWVhblJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4sIGNvbnN0IERlcml2ZWQ+CisgICAgbWVhbigpIGNvbnN0IHsKKyAgICAgIERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+IGluX2RpbXM7CisgICAgICByZXR1cm4gVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6Ok1lYW5SZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGluX2RpbXMsIGludGVybmFsOjpNZWFuUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6OlByb2RSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbXMsIGNvbnN0IERlcml2ZWQ+CisgICAgcHJvZChjb25zdCBEaW1zJiBkaW1zKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6OlByb2RSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZGltcywgaW50ZXJuYWw6OlByb2RSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4oKSk7CisgICAgfQorCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6OlByb2RSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPgorICAgIHByb2QoKSBjb25zdCB7CisgICAgICBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiBpbl9kaW1zOworICAgICAgcmV0dXJuIFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpQcm9kUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBpbl9kaW1zLCBpbnRlcm5hbDo6UHJvZFJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPigpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGltcz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpNYXhSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbXMsIGNvbnN0IERlcml2ZWQ+CisgICAgbWF4aW11bShjb25zdCBEaW1zJiBkaW1zKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6Ok1heFJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPiwgY29uc3QgRGltcywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBkaW1zLCBpbnRlcm5hbDo6TWF4UmVkdWNlcjxDb2VmZlJldHVyblR5cGU+KCkpOworICAgIH0KKworICAgIGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpNYXhSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPgorICAgIG1heGltdW0oKSBjb25zdCB7CisgICAgICBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiBpbl9kaW1zOworICAgICAgcmV0dXJuIFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpNYXhSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGluX2RpbXMsIGludGVybmFsOjpNYXhSZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4oKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERpbXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWluUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEaW1zLCBjb25zdCBEZXJpdmVkPgorICAgIG1pbmltdW0oY29uc3QgRGltcyYgZGltcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclJlZHVjdGlvbk9wPGludGVybmFsOjpNaW5SZWR1Y2VyPENvZWZmUmV0dXJuVHlwZT4sIGNvbnN0IERpbXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZGltcywgaW50ZXJuYWw6Ok1pblJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlPigpKTsKKyAgICB9CisKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWluUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiwgY29uc3QgRGVyaXZlZD4KKyAgICBtaW5pbXVtKCkgY29uc3QgeworICAgICAgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4gaW5fZGltczsKKyAgICAgIHJldHVybiBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6TWluUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+LCBjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBOdW1EaW1lbnNpb25zPiwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBpbl9kaW1zLCBpbnRlcm5hbDo6TWluUmVkdWNlcjxDb2VmZlJldHVyblR5cGU+KCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6OkFuZFJlZHVjZXIsIGNvbnN0IERpbXMsIGNvbnN0IFRlbnNvckNvbnZlcnNpb25PcDxib29sLCBjb25zdCBEZXJpdmVkPiA+CisgICAgYWxsKGNvbnN0IERpbXMmIGRpbXMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PGJvb2w+KCkucmVkdWNlKGRpbXMsIGludGVybmFsOjpBbmRSZWR1Y2VyKCkpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxpbnRlcm5hbDo6QW5kUmVkdWNlciwgY29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4sIGNvbnN0IFRlbnNvckNvbnZlcnNpb25PcDxib29sLCBjb25zdCBEZXJpdmVkPiA+CisgICAgYWxsKCkgY29uc3QgeworICAgICAgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4gaW5fZGltczsKKyAgICAgIHJldHVybiBjYXN0PGJvb2w+KCkucmVkdWNlKGluX2RpbXMsIGludGVybmFsOjpBbmRSZWR1Y2VyKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6Ok9yUmVkdWNlciwgY29uc3QgRGltcywgY29uc3QgVGVuc29yQ29udmVyc2lvbk9wPGJvb2wsIGNvbnN0IERlcml2ZWQ+ID4KKyAgICBhbnkoY29uc3QgRGltcyYgZGltcykgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Ym9vbD4oKS5yZWR1Y2UoZGltcywgaW50ZXJuYWw6Ok9yUmVkdWNlcigpKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUmVkdWN0aW9uT3A8aW50ZXJuYWw6Ok9yUmVkdWNlciwgY29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4sIGNvbnN0IFRlbnNvckNvbnZlcnNpb25PcDxib29sLCBjb25zdCBEZXJpdmVkPiA+CisgICAgYW55KCkgY29uc3QgeworICAgICAgRGltZW5zaW9uTGlzdDxJbmRleCwgTnVtRGltZW5zaW9ucz4gaW5fZGltczsKKyAgICAgIHJldHVybiBjYXN0PGJvb2w+KCkucmVkdWNlKGluX2RpbXMsIGludGVybmFsOjpPclJlZHVjZXIoKSk7CisgICAgfQorCisgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yVHVwbGVSZWR1Y2VyT3A8CisgICAgICBpbnRlcm5hbDo6QXJnTWF4VHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4sCisgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltZW5zaW9ucz4sIGNvbnN0IERlcml2ZWQ+CisgICAgYXJnbWF4KCkgY29uc3QgeworICAgICAgYXJyYXk8SW5kZXgsIE51bURpbWVuc2lvbnM+IGluX2RpbXM7CisgICAgICBmb3IgKGludCBkID0gMDsgZCA8IE51bURpbWVuc2lvbnM7ICsrZCkgaW5fZGltc1tkXSA9IGQ7CisgICAgICByZXR1cm4gVGVuc29yVHVwbGVSZWR1Y2VyT3A8CisgICAgICAgIGludGVybmFsOjpBcmdNYXhUdXBsZVJlZHVjZXI8VHVwbGU8SW5kZXgsIENvZWZmUmV0dXJuVHlwZT4gPiwKKyAgICAgICAgY29uc3QgYXJyYXk8SW5kZXgsIE51bURpbWVuc2lvbnM+LAorICAgICAgICBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpBcmdNYXhUdXBsZVJlZHVjZXI8VHVwbGU8SW5kZXgsIENvZWZmUmV0dXJuVHlwZT4gPigpLCAtMSwgaW5fZGltcyk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclR1cGxlUmVkdWNlck9wPAorICAgICAgaW50ZXJuYWw6OkFyZ01pblR1cGxlUmVkdWNlcjxUdXBsZTxJbmRleCwgQ29lZmZSZXR1cm5UeXBlPiA+LAorICAgICAgY29uc3QgYXJyYXk8SW5kZXgsIE51bURpbWVuc2lvbnM+LCBjb25zdCBEZXJpdmVkPgorICAgIGFyZ21pbigpIGNvbnN0IHsKKyAgICAgIGFycmF5PEluZGV4LCBOdW1EaW1lbnNpb25zPiBpbl9kaW1zOworICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCBOdW1EaW1lbnNpb25zOyArK2QpIGluX2RpbXNbZF0gPSBkOworICAgICAgcmV0dXJuIFRlbnNvclR1cGxlUmVkdWNlck9wPAorICAgICAgICBpbnRlcm5hbDo6QXJnTWluVHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4sCisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1lbnNpb25zPiwKKyAgICAgICAgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBpbnRlcm5hbDo6QXJnTWluVHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4oKSwgLTEsIGluX2RpbXMpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JUdXBsZVJlZHVjZXJPcDwKKyAgICAgIGludGVybmFsOjpBcmdNYXhUdXBsZVJlZHVjZXI8VHVwbGU8SW5kZXgsIENvZWZmUmV0dXJuVHlwZT4gPiwKKyAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAxPiwgY29uc3QgRGVyaXZlZD4KKyAgICBhcmdtYXgoY29uc3QgaW50IHJldHVybl9kaW0pIGNvbnN0IHsKKyAgICAgIGFycmF5PEluZGV4LCAxPiBpbl9kaW1zOworICAgICAgaW5fZGltc1swXSA9IHJldHVybl9kaW07CisgICAgICByZXR1cm4gVGVuc29yVHVwbGVSZWR1Y2VyT3A8CisgICAgICAgIGludGVybmFsOjpBcmdNYXhUdXBsZVJlZHVjZXI8VHVwbGU8SW5kZXgsIENvZWZmUmV0dXJuVHlwZT4gPiwKKyAgICAgICAgY29uc3QgYXJyYXk8SW5kZXgsIDE+LAorICAgICAgICBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpBcmdNYXhUdXBsZVJlZHVjZXI8VHVwbGU8SW5kZXgsIENvZWZmUmV0dXJuVHlwZT4gPigpLCByZXR1cm5fZGltLCBpbl9kaW1zKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yVHVwbGVSZWR1Y2VyT3A8CisgICAgICBpbnRlcm5hbDo6QXJnTWluVHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4sCisgICAgICBjb25zdCBhcnJheTxJbmRleCwgMT4sIGNvbnN0IERlcml2ZWQ+CisgICAgYXJnbWluKGNvbnN0IGludCByZXR1cm5fZGltKSBjb25zdCB7CisgICAgICBhcnJheTxJbmRleCwgMT4gaW5fZGltczsKKyAgICAgIGluX2RpbXNbMF0gPSByZXR1cm5fZGltOworICAgICAgcmV0dXJuIFRlbnNvclR1cGxlUmVkdWNlck9wPAorICAgICAgICBpbnRlcm5hbDo6QXJnTWluVHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4sCisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAxPiwKKyAgICAgICAgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBpbnRlcm5hbDo6QXJnTWluVHVwbGVSZWR1Y2VyPFR1cGxlPEluZGV4LCBDb2VmZlJldHVyblR5cGU+ID4oKSwgcmV0dXJuX2RpbSwgaW5fZGltcyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIERpbXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxSZWR1Y2VyLCBjb25zdCBEaW1zLCBjb25zdCBEZXJpdmVkPgorICAgIHJlZHVjZShjb25zdCBEaW1zJiBkaW1zLCBjb25zdCBSZWR1Y2VyJiByZWR1Y2VyKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmVkdWN0aW9uT3A8UmVkdWNlciwgY29uc3QgRGltcywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBkaW1zLCByZWR1Y2VyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQnJvYWRjYXN0PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQnJvYWRjYXN0aW5nT3A8Y29uc3QgQnJvYWRjYXN0LCBjb25zdCBEZXJpdmVkPgorICAgIGJyb2FkY2FzdChjb25zdCBCcm9hZGNhc3QmIGJyb2FkY2FzdCkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckJyb2FkY2FzdGluZ09wPGNvbnN0IEJyb2FkY2FzdCwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBicm9hZGNhc3QpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBeGlzLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDb25jYXRlbmF0aW9uT3A8QXhpcywgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorICAgIGNvbmNhdGVuYXRlKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIsIEF4aXMgYXhpcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpLCBheGlzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGF0Y2hEaW1zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUGF0Y2hPcDxjb25zdCBQYXRjaERpbXMsIGNvbnN0IERlcml2ZWQ+CisgICAgZXh0cmFjdF9wYXRjaGVzKGNvbnN0IFBhdGNoRGltcyYgcGF0Y2hfZGltcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclBhdGNoT3A8Y29uc3QgUGF0Y2hEaW1zLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHBhdGNoX2RpbXMpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JJbWFnZVBhdGNoT3A8RHluYW1pYywgRHluYW1pYywgY29uc3QgRGVyaXZlZD4KKyAgICBleHRyYWN0X2ltYWdlX3BhdGNoZXMoY29uc3QgSW5kZXggcGF0Y2hfcm93cyA9IDEsIGNvbnN0IEluZGV4IHBhdGNoX2NvbHMgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCByb3dfc3RyaWRlID0gMSwgY29uc3QgSW5kZXggY29sX3N0cmlkZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IGluX3Jvd19zdHJpZGUgPSAxLCBjb25zdCBJbmRleCBpbl9jb2xfc3RyaWRlID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFkZGluZ1R5cGUgcGFkZGluZ190eXBlID0gUEFERElOR19TQU1FLCBjb25zdCBTY2FsYXIgcGFkZGluZ192YWx1ZSA9IFNjYWxhcigwKSkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckltYWdlUGF0Y2hPcDxEeW5hbWljLCBEeW5hbWljLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHBhdGNoX3Jvd3MsIHBhdGNoX2NvbHMsIHJvd19zdHJpZGUsIGNvbF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3Jvd19zdHJpZGUsIGluX2NvbF9zdHJpZGUsIDEsIDEsIHBhZGRpbmdfdHlwZSwgcGFkZGluZ192YWx1ZSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckltYWdlUGF0Y2hPcDxEeW5hbWljLCBEeW5hbWljLCBjb25zdCBEZXJpdmVkPgorICAgIGV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhjb25zdCBJbmRleCBwYXRjaF9yb3dzLCBjb25zdCBJbmRleCBwYXRjaF9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCByb3dfc3RyaWRlLCBjb25zdCBJbmRleCBjb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBpbl9yb3dfc3RyaWRlLCBjb25zdCBJbmRleCBpbl9jb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGUsIGNvbnN0IEluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggcGFkZGluZ190b3AsIGNvbnN0IEluZGV4IHBhZGRpbmdfYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBwYWRkaW5nX2xlZnQsY29uc3QgSW5kZXggcGFkZGluZ19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyIHBhZGRpbmdfdmFsdWUpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JJbWFnZVBhdGNoT3A8RHluYW1pYywgRHluYW1pYywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBwYXRjaF9yb3dzLCBwYXRjaF9jb2xzLCByb3dfc3RyaWRlLCBjb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yb3dfc3RyaWRlLCBpbl9jb2xfc3RyaWRlLCByb3dfaW5mbGF0ZV9zdHJpZGUsIGNvbF9pbmZsYXRlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ190b3AsIHBhZGRpbmdfYm90dG9tLCBwYWRkaW5nX2xlZnQsIHBhZGRpbmdfcmlnaHQsIHBhZGRpbmdfdmFsdWUpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JWb2x1bWVQYXRjaE9wPER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWMsIGNvbnN0IERlcml2ZWQ+CisgICAgZXh0cmFjdF92b2x1bWVfcGF0Y2hlcyhjb25zdCBJbmRleCBwYXRjaF9wbGFuZXMsIGNvbnN0IEluZGV4IHBhdGNoX3Jvd3MsIGNvbnN0IEluZGV4IHBhdGNoX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBwbGFuZV9zdHJpZGUgPSAxLCBjb25zdCBJbmRleCByb3dfc3RyaWRlID0gMSwgY29uc3QgSW5kZXggY29sX3N0cmlkZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYWRkaW5nVHlwZSBwYWRkaW5nX3R5cGUgPSBQQURESU5HX1NBTUUsIGNvbnN0IFNjYWxhciBwYWRkaW5nX3ZhbHVlID0gU2NhbGFyKDApKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yVm9sdW1lUGF0Y2hPcDxEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHBhdGNoX3BsYW5lcywgcGF0Y2hfcm93cywgcGF0Y2hfY29scywgcGxhbmVfc3RyaWRlLCByb3dfc3RyaWRlLCBjb2xfc3RyaWRlLCAxLCAxLCAxLCAxLCAxLCAxLCBwYWRkaW5nX3R5cGUsIHBhZGRpbmdfdmFsdWUpOworICAgIH0KKworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclZvbHVtZVBhdGNoT3A8RHluYW1pYywgRHluYW1pYywgRHluYW1pYywgY29uc3QgRGVyaXZlZD4KKyAgICBleHRyYWN0X3ZvbHVtZV9wYXRjaGVzKGNvbnN0IEluZGV4IHBhdGNoX3BsYW5lcywgY29uc3QgSW5kZXggcGF0Y2hfcm93cywgY29uc3QgSW5kZXggcGF0Y2hfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHBsYW5lX3N0cmlkZSwgY29uc3QgSW5kZXggcm93X3N0cmlkZSwgY29uc3QgSW5kZXggY29sX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHBsYW5lX2luZmxhdGVfc3RyaWRlLCBjb25zdCBJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGUsIGNvbnN0IEluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHBhZGRpbmdfdG9wX3osIGNvbnN0IEluZGV4IHBhZGRpbmdfYm90dG9tX3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBwYWRkaW5nX3RvcCwgY29uc3QgSW5kZXggcGFkZGluZ19ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBwYWRkaW5nX2xlZnQsIGNvbnN0IEluZGV4IHBhZGRpbmdfcmlnaHQsIGNvbnN0IFNjYWxhciBwYWRkaW5nX3ZhbHVlID0gU2NhbGFyKDApKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yVm9sdW1lUGF0Y2hPcDxEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHBhdGNoX3BsYW5lcywgcGF0Y2hfcm93cywgcGF0Y2hfY29scywgcGxhbmVfc3RyaWRlLCByb3dfc3RyaWRlLCBjb2xfc3RyaWRlLCAxLCAxLCAxLCBwbGFuZV9pbmZsYXRlX3N0cmlkZSwgcm93X2luZmxhdGVfc3RyaWRlLCBjb2xfaW5mbGF0ZV9zdHJpZGUsIHBhZGRpbmdfdG9wX3osIHBhZGRpbmdfYm90dG9tX3osIHBhZGRpbmdfdG9wLCBwYWRkaW5nX2JvdHRvbSwgcGFkZGluZ19sZWZ0LCBwYWRkaW5nX3JpZ2h0LCBwYWRkaW5nX3ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBNb3JwaGluZyBvcGVyYXRvcnMuCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckxheW91dFN3YXBPcDxjb25zdCBEZXJpdmVkPgorICAgIHN3YXBfbGF5b3V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckxheW91dFN3YXBPcDxjb25zdCBEZXJpdmVkPihkZXJpdmVkKCkpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTmV3RGltZW5zaW9ucz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclJlc2hhcGluZ09wPGNvbnN0IE5ld0RpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+CisgICAgcmVzaGFwZShjb25zdCBOZXdEaW1lbnNpb25zJiBuZXdEaW1lbnNpb25zKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmVzaGFwaW5nT3A8Y29uc3QgTmV3RGltZW5zaW9ucywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBuZXdEaW1lbnNpb25zKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU2l6ZXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTbGljaW5nT3A8Y29uc3QgU3RhcnRJbmRpY2VzLCBjb25zdCBTaXplcywgY29uc3QgRGVyaXZlZD4KKyAgICBzbGljZShjb25zdCBTdGFydEluZGljZXMmIHN0YXJ0SW5kaWNlcywgY29uc3QgU2l6ZXMmIHNpemVzKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU2l6ZXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRJbmRpY2VzLCBzaXplcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFN0b3BJbmRpY2VzLCB0eXBlbmFtZSBTdHJpZGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8Y29uc3QgU3RhcnRJbmRpY2VzLCBjb25zdCBTdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcywgY29uc3QgRGVyaXZlZD4KKyAgICBzdHJpZGVkU2xpY2UoY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMsIGNvbnN0IFN0b3BJbmRpY2VzJiBzdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcyYgc3RyaWRlcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU3RvcEluZGljZXMsIGNvbnN0IFN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRJbmRpY2VzLCBzdG9wSW5kaWNlcywgc3RyaWRlcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDxJbmRleCBEaW1JZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIGNvbnN0IERlcml2ZWQ+CisgICAgY2hpcChjb25zdCBJbmRleCBvZmZzZXQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JDaGlwcGluZ09wPERpbUlkLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIG9mZnNldCwgRGltSWQpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ2hpcHBpbmdPcDxEeW5hbWljLCBjb25zdCBEZXJpdmVkPgorICAgIGNoaXAoY29uc3QgSW5kZXggb2Zmc2V0LCBjb25zdCBJbmRleCBkaW0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JDaGlwcGluZ09wPER5bmFtaWMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgb2Zmc2V0LCBkaW0pOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV2ZXJzZURpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZXZlcnNlT3A8Y29uc3QgUmV2ZXJzZURpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+CisgICAgcmV2ZXJzZShjb25zdCBSZXZlcnNlRGltZW5zaW9ucyYgcmV2KSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmV2ZXJzZU9wPGNvbnN0IFJldmVyc2VEaW1lbnNpb25zLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHJldik7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWRkaW5nRGltZW5zaW9ucz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclBhZGRpbmdPcDxjb25zdCBQYWRkaW5nRGltZW5zaW9ucywgY29uc3QgRGVyaXZlZD4KKyAgICBwYWQoY29uc3QgUGFkZGluZ0RpbWVuc2lvbnMmIHBhZGRpbmcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JQYWRkaW5nT3A8Y29uc3QgUGFkZGluZ0RpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgcGFkZGluZywgaW50ZXJuYWw6OnNjYWxhcl9jYXN0X29wPGludCwgU2NhbGFyPigpKDApKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhZGRpbmdEaW1lbnNpb25zPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yUGFkZGluZ09wPGNvbnN0IFBhZGRpbmdEaW1lbnNpb25zLCBjb25zdCBEZXJpdmVkPgorICAgIHBhZChjb25zdCBQYWRkaW5nRGltZW5zaW9ucyYgcGFkZGluZywgY29uc3QgU2NhbGFyIHBhZGRpbmdfdmFsdWUpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JQYWRkaW5nT3A8Y29uc3QgUGFkZGluZ0RpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgcGFkZGluZywgcGFkZGluZ192YWx1ZSk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTaHVmZmxlPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yU2h1ZmZsaW5nT3A8Y29uc3QgU2h1ZmZsZSwgY29uc3QgRGVyaXZlZD4KKyAgICBzaHVmZmxlKGNvbnN0IFNodWZmbGUmIHNodWZmbGUpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JTaHVmZmxpbmdPcDxjb25zdCBTaHVmZmxlLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHNodWZmbGUpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaWRlcz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclN0cmlkaW5nT3A8Y29uc3QgU3RyaWRlcywgY29uc3QgRGVyaXZlZD4KKyAgICBzdHJpZGUoY29uc3QgU3RyaWRlcyYgc3RyaWRlcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclN0cmlkaW5nT3A8Y29uc3QgU3RyaWRlcywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBzdHJpZGVzKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmlkZXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JJbmZsYXRpb25PcDxjb25zdCBTdHJpZGVzLCBjb25zdCBEZXJpdmVkPgorICAgIGluZmxhdGUoY29uc3QgU3RyaWRlcyYgc3RyaWRlcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckluZmxhdGlvbk9wPGNvbnN0IFN0cmlkZXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RyaWRlcyk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBhIHRlbnNvciBjb250YWluaW5nIGluZGV4L3ZhbHVlIHR1cGxlcworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JJbmRleFR1cGxlT3A8Y29uc3QgRGVyaXZlZD4KKyAgICBpbmRleF90dXBsZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29ySW5kZXhUdXBsZU9wPGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIHVuYXJ5IGFuZCBiaW5hcnkgb3BlcmF0aW9ucworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDdXN0b21VbmFyeUZ1bmM+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckN1c3RvbVVuYXJ5T3A8Y29uc3QgQ3VzdG9tVW5hcnlGdW5jLCBjb25zdCBEZXJpdmVkPiBjdXN0b21PcChjb25zdCBDdXN0b21VbmFyeUZ1bmMmIG9wKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ3VzdG9tVW5hcnlPcDxjb25zdCBDdXN0b21VbmFyeUZ1bmMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgb3ApOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBDdXN0b21CaW5hcnlGdW5jPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDdXN0b21CaW5hcnlPcDxjb25zdCBDdXN0b21CaW5hcnlGdW5jLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+IGN1c3RvbU9wKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIsIGNvbnN0IEN1c3RvbUJpbmFyeUZ1bmMmIG9wKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ3VzdG9tQmluYXJ5T3A8Y29uc3QgQ3VzdG9tQmluYXJ5RnVuYywgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLCBvcCk7CisgICAgfQorCisgICAgLy8gRm9yY2UgdGhlIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24uCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckZvcmNlZEV2YWxPcDxjb25zdCBEZXJpdmVkPiBldmFsKCkgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvckZvcmNlZEV2YWxPcDxjb25zdCBEZXJpdmVkPihkZXJpdmVkKCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IE51bUluZGljZXMsIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleFR5cGU+IGZyaWVuZCBjbGFzcyBUZW5zb3I7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGltZW5zaW9ucywgaW50IE9wdGlvbiwgdHlwZW5hbWUgSW5kZXhUeXBlcz4gZnJpZW5kIGNsYXNzIFRlbnNvckZpeGVkU2l6ZTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgQWNjZXNzTGV2ZWw+IGZyaWVuZCBjbGFzcyBUZW5zb3JCYXNlOworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IEFjY2Vzc0xldmVsID0gaW50ZXJuYWw6OmFjY2Vzc29yc19sZXZlbDxEZXJpdmVkPjo6dmFsdWU+CitjbGFzcyBUZW5zb3JCYXNlIDogcHVibGljIFRlbnNvckJhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+IHsKKyBwdWJsaWM6CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+IERlcml2ZWRUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZFRyYWl0czo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IERlcml2ZWRUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTnVtSW5kaWNlcywgaW50IE9wdGlvbnMsIHR5cGVuYW1lIEluZGV4VHlwZT4gZnJpZW5kIGNsYXNzIFRlbnNvcjsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBEaW1lbnNpb25zLCBpbnQgT3B0aW9uLCB0eXBlbmFtZSBJbmRleFR5cGVzPiBmcmllbmQgY2xhc3MgVGVuc29yRml4ZWRTaXplOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGludCBPdGhlckFjY2Vzc0xldmVsPiBmcmllbmQgY2xhc3MgVGVuc29yQmFzZTsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBzZXRaZXJvKCkgeworICAgICAgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigwKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBzZXRDb25zdGFudChjb25zdCBTY2FsYXImIHZhbCkgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKSA9IHRoaXMtPmNvbnN0YW50KHZhbCk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBzZXRSYW5kb20oKSB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpID0gdGhpcy0+cmFuZG9tKCk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5kb21HZW5lcmF0b3I+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBzZXRSYW5kb20oKSB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpID0gdGhpcy0+dGVtcGxhdGUgcmFuZG9tPFJhbmRvbUdlbmVyYXRvcj4oKTsKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIHNldFZhbHVlcygKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OkluaXRpYWxpemVyPERlcml2ZWQsIE51bURpbWVuc2lvbnM+OjpJbml0TGlzdCYgdmFscykgeworICAgICAgVGVuc29yRXZhbHVhdG9yPERlcml2ZWQsIERlZmF1bHREZXZpY2U+IGV2YWwoZGVyaXZlZCgpLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgaW50ZXJuYWw6OmluaXRpYWxpemVfdGVuc29yPERlcml2ZWQsIE51bURpbWVuc2lvbnM+KGV2YWwsIHZhbHMpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisjZW5kaWYgIC8vIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKSA9IGRlcml2ZWQoKSArIG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgRGVyaXZlZCYgb3BlcmF0b3ItPShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpID0gZGVyaXZlZCgpIC0gb3RoZXIuZGVyaXZlZCgpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBEZXJpdmVkJiBvcGVyYXRvcio9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIHsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkgPSBkZXJpdmVkKCkgKiBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIERlcml2ZWQmIG9wZXJhdG9yLz0oY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKSA9IGRlcml2ZWQoKSAvIG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yTGF5b3V0U3dhcE9wPGNvbnN0IERlcml2ZWQ+CisgICAgc3dhcF9sYXlvdXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yTGF5b3V0U3dhcE9wPGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBUZW5zb3JMYXlvdXRTd2FwT3A8RGVyaXZlZD4KKyAgICBzd2FwX2xheW91dCgpIHsKKyAgICAgIHJldHVybiBUZW5zb3JMYXlvdXRTd2FwT3A8RGVyaXZlZD4oZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXhpcywgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yQ29uY2F0ZW5hdGlvbk9wPGNvbnN0IEF4aXMsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KKyAgICBjb25jYXRlbmF0ZShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyLCBjb25zdCBBeGlzJiBheGlzKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ29uY2F0ZW5hdGlvbk9wPGNvbnN0IEF4aXMsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlciwgYXhpcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBeGlzLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBUZW5zb3JDb25jYXRlbmF0aW9uT3A8Y29uc3QgQXhpcywgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPgorICAgIGNvbmNhdGVuYXRlKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIsIGNvbnN0IEF4aXMmIGF4aXMpIHsKKyAgICAgIHJldHVybiBUZW5zb3JDb25jYXRlbmF0aW9uT3A8Y29uc3QgQXhpcywgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLCBheGlzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTmV3RGltZW5zaW9ucz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclJlc2hhcGluZ09wPGNvbnN0IE5ld0RpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+CisgICAgcmVzaGFwZShjb25zdCBOZXdEaW1lbnNpb25zJiBuZXdEaW1lbnNpb25zKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmVzaGFwaW5nT3A8Y29uc3QgTmV3RGltZW5zaW9ucywgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBuZXdEaW1lbnNpb25zKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE5ld0RpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBUZW5zb3JSZXNoYXBpbmdPcDxjb25zdCBOZXdEaW1lbnNpb25zLCBEZXJpdmVkPgorICAgIHJlc2hhcGUoY29uc3QgTmV3RGltZW5zaW9ucyYgbmV3RGltZW5zaW9ucykgeworICAgICAgcmV0dXJuIFRlbnNvclJlc2hhcGluZ09wPGNvbnN0IE5ld0RpbWVuc2lvbnMsIERlcml2ZWQ+KGRlcml2ZWQoKSwgbmV3RGltZW5zaW9ucyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU2l6ZXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTbGljaW5nT3A8Y29uc3QgU3RhcnRJbmRpY2VzLCBjb25zdCBTaXplcywgY29uc3QgRGVyaXZlZD4KKyAgICBzbGljZShjb25zdCBTdGFydEluZGljZXMmIHN0YXJ0SW5kaWNlcywgY29uc3QgU2l6ZXMmIHNpemVzKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU2l6ZXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRJbmRpY2VzLCBzaXplcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFNpemVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgVGVuc29yU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU2l6ZXMsIERlcml2ZWQ+CisgICAgc2xpY2UoY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMsIGNvbnN0IFNpemVzJiBzaXplcykgeworICAgICAgcmV0dXJuIFRlbnNvclNsaWNpbmdPcDxjb25zdCBTdGFydEluZGljZXMsIGNvbnN0IFNpemVzLCBEZXJpdmVkPihkZXJpdmVkKCksIHN0YXJ0SW5kaWNlcywgc2l6ZXMpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFN0b3BJbmRpY2VzLCB0eXBlbmFtZSBTdHJpZGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8Y29uc3QgU3RhcnRJbmRpY2VzLCBjb25zdCBTdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcywgY29uc3QgRGVyaXZlZD4KKyAgICBzdHJpZGVkU2xpY2UoY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMsIGNvbnN0IFN0b3BJbmRpY2VzJiBzdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcyYgc3RyaWRlcykgY29uc3QgeworICAgICAgcmV0dXJuIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU3RvcEluZGljZXMsIGNvbnN0IFN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRJbmRpY2VzLCBzdG9wSW5kaWNlcywgc3RyaWRlcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFN0b3BJbmRpY2VzLCB0eXBlbmFtZSBTdHJpZGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8Y29uc3QgU3RhcnRJbmRpY2VzLCBjb25zdCBTdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcywgRGVyaXZlZD4KKyAgICBzdHJpZGVkU2xpY2UoY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMsIGNvbnN0IFN0b3BJbmRpY2VzJiBzdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcyYgc3RyaWRlcykgeworICAgICAgcmV0dXJuIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPGNvbnN0IFN0YXJ0SW5kaWNlcywgY29uc3QgU3RvcEluZGljZXMsIGNvbnN0IFN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRJbmRpY2VzLCBzdG9wSW5kaWNlcywgc3RyaWRlcyk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPERlbnNlSW5kZXggRGltSWQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JDaGlwcGluZ09wPERpbUlkLCBjb25zdCBEZXJpdmVkPgorICAgIGNoaXAoY29uc3QgSW5kZXggb2Zmc2V0KSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBvZmZzZXQsIERpbUlkKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPEluZGV4IERpbUlkPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgVGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgRGVyaXZlZD4KKyAgICBjaGlwKGNvbnN0IEluZGV4IG9mZnNldCkgeworICAgICAgcmV0dXJuIFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIERlcml2ZWQ+KGRlcml2ZWQoKSwgb2Zmc2V0LCBEaW1JZCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvckNoaXBwaW5nT3A8RHluYW1pYywgY29uc3QgRGVyaXZlZD4KKyAgICBjaGlwKGNvbnN0IEluZGV4IG9mZnNldCwgY29uc3QgSW5kZXggZGltKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yQ2hpcHBpbmdPcDxEeW5hbWljLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIG9mZnNldCwgZGltKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIFRlbnNvckNoaXBwaW5nT3A8RHluYW1pYywgRGVyaXZlZD4KKyAgICBjaGlwKGNvbnN0IEluZGV4IG9mZnNldCwgY29uc3QgSW5kZXggZGltKSB7CisgICAgICByZXR1cm4gVGVuc29yQ2hpcHBpbmdPcDxEeW5hbWljLCBEZXJpdmVkPihkZXJpdmVkKCksIG9mZnNldCwgZGltKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV2ZXJzZURpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JSZXZlcnNlT3A8Y29uc3QgUmV2ZXJzZURpbWVuc2lvbnMsIGNvbnN0IERlcml2ZWQ+CisgICAgcmV2ZXJzZShjb25zdCBSZXZlcnNlRGltZW5zaW9ucyYgcmV2KSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yUmV2ZXJzZU9wPGNvbnN0IFJldmVyc2VEaW1lbnNpb25zLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHJldik7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXZlcnNlRGltZW5zaW9ucz4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIFRlbnNvclJldmVyc2VPcDxjb25zdCBSZXZlcnNlRGltZW5zaW9ucywgRGVyaXZlZD4KKyAgICByZXZlcnNlKGNvbnN0IFJldmVyc2VEaW1lbnNpb25zJiByZXYpIHsKKyAgICAgIHJldHVybiBUZW5zb3JSZXZlcnNlT3A8Y29uc3QgUmV2ZXJzZURpbWVuc2lvbnMsIERlcml2ZWQ+KGRlcml2ZWQoKSwgcmV2KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2h1ZmZsZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFRlbnNvclNodWZmbGluZ09wPGNvbnN0IFNodWZmbGUsIGNvbnN0IERlcml2ZWQ+CisgICAgc2h1ZmZsZShjb25zdCBTaHVmZmxlJiBzaHVmZmxlKSBjb25zdCB7CisgICAgICByZXR1cm4gVGVuc29yU2h1ZmZsaW5nT3A8Y29uc3QgU2h1ZmZsZSwgY29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBzaHVmZmxlKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNodWZmbGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBUZW5zb3JTaHVmZmxpbmdPcDxjb25zdCBTaHVmZmxlLCBEZXJpdmVkPgorICAgIHNodWZmbGUoY29uc3QgU2h1ZmZsZSYgc2h1ZmZsZSkgeworICAgICAgcmV0dXJuIFRlbnNvclNodWZmbGluZ09wPGNvbnN0IFNodWZmbGUsIERlcml2ZWQ+KGRlcml2ZWQoKSwgc2h1ZmZsZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmlkZXM+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBUZW5zb3JTdHJpZGluZ09wPGNvbnN0IFN0cmlkZXMsIGNvbnN0IERlcml2ZWQ+CisgICAgc3RyaWRlKGNvbnN0IFN0cmlkZXMmIHN0cmlkZXMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUZW5zb3JTdHJpZGluZ09wPGNvbnN0IFN0cmlkZXMsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RyaWRlcyk7CisgICAgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpZGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgVGVuc29yU3RyaWRpbmdPcDxjb25zdCBTdHJpZGVzLCBEZXJpdmVkPgorICAgIHN0cmlkZShjb25zdCBTdHJpZGVzJiBzdHJpZGVzKSB7CisgICAgICByZXR1cm4gVGVuc29yU3RyaWRpbmdPcDxjb25zdCBTdHJpZGVzLCBEZXJpdmVkPihkZXJpdmVkKCksIHN0cmlkZXMpOworICAgIH0KKworICAgIC8vIFNlbGVjdCB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXZpY2VUeXBlPgorICAgIFRlbnNvckRldmljZTxEZXJpdmVkLCBEZXZpY2VUeXBlPiBkZXZpY2UoY29uc3QgRGV2aWNlVHlwZSYgZGV2aWNlKSB7CisgICAgICByZXR1cm4gVGVuc29yRGV2aWNlPERlcml2ZWQsIERldmljZVR5cGU+KGRldmljZSwgZGVyaXZlZCgpKTsKKyAgICB9CisKKyBwcm90ZWN0ZWQ6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQkFTRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckJyb2FkY2FzdGluZy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JCcm9hZGNhc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2ZlMzAwCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JCcm9hZGNhc3RpbmcuaApAQCAtMCwwICsxLDM5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0JST0FEQ0FTVElOR19ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQlJPQURDQVNUSU5HX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JCcm9hZGNhc3RpbmcKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIGJyb2FkY2FzdGluZyBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgQnJvYWRjYXN0LCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JCcm9hZGNhc3RpbmdPcDxCcm9hZGNhc3QsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCcm9hZGNhc3QsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JCcm9hZGNhc3RpbmdPcDxCcm9hZGNhc3QsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQnJvYWRjYXN0aW5nT3A8QnJvYWRjYXN0LCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJyb2FkY2FzdCwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQnJvYWRjYXN0aW5nT3A8QnJvYWRjYXN0LCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JCcm9hZGNhc3RpbmdPcDxCcm9hZGNhc3QsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yQnJvYWRjYXN0aW5nT3A8QnJvYWRjYXN0LCBYcHJUeXBlPiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERpbXM+CitzdHJ1Y3QgaXNfaW5wdXRfc2NhbGFyIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzX2lucHV0X3NjYWxhcjxTaXplczw+ID4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworI2lmbmRlZiBFSUdFTl9FTVVMQVRFX0NYWDExX01FVEFfSAordGVtcGxhdGUgPHR5cGVuYW1lIHN0ZDo6c2l6ZV90Li4uIEluZGljZXM+CitzdHJ1Y3QgaXNfaW5wdXRfc2NhbGFyPFNpemVzPEluZGljZXMuLi4+ID4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IChTaXplczxJbmRpY2VzLi4uPjo6dG90YWxfc2l6ZSA9PSAxKTsKK307CisjZW5kaWYKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgQnJvYWRjYXN0LCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yQnJvYWRjYXN0aW5nT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JCcm9hZGNhc3RpbmdPcDxCcm9hZGNhc3QsIFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckJyb2FkY2FzdGluZ09wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvckJyb2FkY2FzdGluZ09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQnJvYWRjYXN0aW5nT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JCcm9hZGNhc3RpbmdPcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQnJvYWRjYXN0aW5nT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgQnJvYWRjYXN0JiBicm9hZGNhc3QpCisgICAgICA6IG1feHByKGV4cHIpLCBtX2Jyb2FkY2FzdChicm9hZGNhc3QpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEJyb2FkY2FzdCYgYnJvYWRjYXN0KCkgY29uc3QgeyByZXR1cm4gbV9icm9hZGNhc3Q7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IEJyb2FkY2FzdCBtX2Jyb2FkY2FzdDsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIEJyb2FkY2FzdCwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JCcm9hZGNhc3RpbmdPcDxCcm9hZGNhc3QsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yQnJvYWRjYXN0aW5nT3A8QnJvYWRjYXN0LCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIElucHV0RGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gdHJ1ZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBtX2Jyb2FkY2FzdChvcC5icm9hZGNhc3QoKSksbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgLy8gVGhlIGJyb2FkY2FzdGluZyBvcCBkb2Vzbid0IGNoYW5nZSB0aGUgcmFuayBvZiB0aGUgdGVuc29yLiBPbmUgY2FuJ3QgYnJvYWRjYXN0IGEgc2NhbGFyCisgICAgLy8gYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSBzY2FsYXIuIEluc3RlYWQgb25lIHNob3VsZCByZXNoYXBlIHRoZSBzY2FsYXIgaW50byBhIGEgTi1ECisgICAgLy8gdGVuc29yIHdpdGggTiA+PSAxIG9mIDEgZWxlbWVudCBmaXJzdCBhbmQgdGhlbiBicm9hZGNhc3QuCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtRGltcyA+IDApLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGNvbnN0IElucHV0RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgY29uc3QgQnJvYWRjYXN0JiBicm9hZGNhc3QgPSBvcC5icm9hZGNhc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgZWlnZW5fYXNzZXJ0KGlucHV0X2RpbXNbaV0gPiAwKTsKKyAgICAgIG1fZGltZW5zaW9uc1tpXSA9IGlucHV0X2RpbXNbaV0gKiBicm9hZGNhc3RbaV07CisgICAgfQorCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9pbnB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgbV9vdXRwdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgIG1faW5wdXRTdHJpZGVzW2ldID0gbV9pbnB1dFN0cmlkZXNbaS0xXSAqIGlucHV0X2RpbXNbaS0xXTsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2ktMV0gKiBtX2RpbWVuc2lvbnNbaS0xXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXSA9IDE7CisgICAgICBtX291dHB1dFN0cmlkZXNbTnVtRGltcy0xXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcy0yOyBpID49IDA7IC0taSkgeworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpKzFdICogbV9kaW1lbnNpb25zW2krMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBpZiAoaW50ZXJuYWw6OmlzX2lucHV0X3NjYWxhcjx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxJbnB1dERpbWVuc2lvbnM+Ojp0eXBlPjo6dmFsdWUpIHsKKyAgICAgIHJldHVybiBtX2ltcGwuY29lZmYoMCk7CisgICAgfQorCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgcmV0dXJuIGNvZWZmQ29sTWFqb3IoaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY29lZmZSb3dNYWpvcihpbmRleCk7CisgICAgfQorICB9CisKKyAgLy8gVE9ETzogYXR0ZW1wdCB0byBzcGVlZCB0aGlzIHVwLiBUaGUgaW50ZWdlciBkaXZpc2lvbnMgYW5kIG1vZHVsbyBhcmUgc2xvdworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZkNvbE1ham9yKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIGlmIChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxCcm9hZGNhc3Q+KGksIDEpKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBtX2ltcGwuZGltZW5zaW9ucygpW2ldKTsKKyAgICAgICAgaW5wdXRJbmRleCArPSBpZHggKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxJbnB1dERpbWVuc2lvbnM+KGksIDEpKSB7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCAlIG1faW1wbC5kaW1lbnNpb25zKClbaV0gPT0gMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5wdXRJbmRleCArPSAoaWR4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgIH0KKyAgICBpZiAoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8QnJvYWRjYXN0PigwLCAxKSkgeworICAgICAgZWlnZW5fYXNzZXJ0KGluZGV4IDwgbV9pbXBsLmRpbWVuc2lvbnMoKVswXSk7CisgICAgICBpbnB1dEluZGV4ICs9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8SW5wdXREaW1lbnNpb25zPigwLCAxKSkgeworICAgICAgICBlaWdlbl9hc3NlcnQoaW5kZXggJSBtX2ltcGwuZGltZW5zaW9ucygpWzBdID09IDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRJbmRleCArPSAoaW5kZXggJSBtX2ltcGwuZGltZW5zaW9ucygpWzBdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmUm93TWFqb3IoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPEJyb2FkY2FzdD4oaSwgMSkpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCA8IG1faW1wbC5kaW1lbnNpb25zKClbaV0pOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPElucHV0RGltZW5zaW9ucz4oaSwgMSkpIHsKKyAgICAgICAgICBlaWdlbl9hc3NlcnQoaWR4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSA9PSAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnB1dEluZGV4ICs9IChpZHggJSBtX2ltcGwuZGltZW5zaW9ucygpW2ldKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgfQorICAgIGlmIChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxCcm9hZGNhc3Q+KE51bURpbXMtMSwgMSkpIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA8IG1faW1wbC5kaW1lbnNpb25zKClbTnVtRGltcy0xXSk7CisgICAgICBpbnB1dEluZGV4ICs9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8SW5wdXREaW1lbnNpb25zPihOdW1EaW1zLTEsIDEpKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCAlIG1faW1wbC5kaW1lbnNpb25zKClbTnVtRGltcy0xXSA9PSAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0SW5kZXggKz0gKGluZGV4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtOdW1EaW1zLTFdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGlmIChpbnRlcm5hbDo6aXNfaW5wdXRfc2NhbGFyPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPElucHV0RGltZW5zaW9ucz46OnR5cGU+Ojp2YWx1ZSkgeworICAgICAgcmV0dXJuIGludGVybmFsOjpwc2V0MTxQYWNrZXRSZXR1cm5UeXBlPihtX2ltcGwuY29lZmYoMCkpOworICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIHJldHVybiBwYWNrZXRDb2xNYWpvcjxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcGFja2V0Um93TWFqb3I8TG9hZE1vZGU+KGluZGV4KTsKKyAgICB9CisgIH0KKworICAvLyBJZ25vcmUgdGhlIExvYWRNb2RlIGFuZCBhbHdheXMgdXNlIHVuYWxpZ25lZCBsb2FkcyBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUKKyAgLy8gdGhlIGFsaWdubWVudCBhdCBjb21waWxlIHRpbWUuCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldENvbE1ham9yKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBjb25zdCBJbmRleCBvcmlnaW5hbEluZGV4ID0gaW5kZXg7CisKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPEJyb2FkY2FzdD4oaSwgMSkpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCA8IG1faW1wbC5kaW1lbnNpb25zKClbaV0pOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPElucHV0RGltZW5zaW9ucz4oaSwgMSkpIHsKKyAgICAgICAgICBlaWdlbl9hc3NlcnQoaWR4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSA9PSAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnB1dEluZGV4ICs9IChpZHggJSBtX2ltcGwuZGltZW5zaW9ucygpW2ldKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgfQorICAgIEluZGV4IGlubmVybW9zdExvYzsKKyAgICBpZiAoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8QnJvYWRjYXN0PigwLCAxKSkgeworICAgICAgZWlnZW5fYXNzZXJ0KGluZGV4IDwgbV9pbXBsLmRpbWVuc2lvbnMoKVswXSk7CisgICAgICBpbm5lcm1vc3RMb2MgPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPElucHV0RGltZW5zaW9ucz4oMCwgMSkpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGluZGV4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVswXSA9PSAwKTsKKyAgICAgICAgaW5uZXJtb3N0TG9jID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlubmVybW9zdExvYyA9IGluZGV4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVswXTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRJbmRleCArPSBpbm5lcm1vc3RMb2M7CisKKyAgICAvLyBUb2RvOiB0aGlzIGNvdWxkIGJlIGV4dGVuZGVkIHRvIHRoZSBzZWNvbmQgZGltZW5zaW9uIGlmIHdlJ3JlIG5vdAorICAgIC8vIGJyb2FkY2FzdGluZyBhbG9uZ3NpZGUgdGhlIGZpcnN0IGRpbWVuc2lvbiwgYW5kIHNvIG9uLgorICAgIGlmIChpbm5lcm1vc3RMb2MgKyBQYWNrZXRTaXplIDw9IG1faW1wbC5kaW1lbnNpb25zKClbMF0pIHsKKyAgICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oaW5wdXRJbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVJR0VOX0FMSUdOX01BWCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PENvZWZmUmV0dXJuVHlwZT46OnR5cGUgdmFsdWVzW1BhY2tldFNpemVdOworICAgICAgdmFsdWVzWzBdID0gbV9pbXBsLmNvZWZmKGlucHV0SW5kZXgpOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgICAgdmFsdWVzW2ldID0gY29lZmZDb2xNYWpvcihvcmlnaW5hbEluZGV4K2kpOworICAgICAgfQorICAgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgICByZXR1cm4gcnNsdDsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRSb3dNYWpvcihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCtQYWNrZXRTaXplLTEgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworCisgICAgY29uc3QgSW5kZXggb3JpZ2luYWxJbmRleCA9IGluZGV4OworCisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zIC0gMTsgKytpKSB7CisgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIGlmIChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxCcm9hZGNhc3Q+KGksIDEpKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBtX2ltcGwuZGltZW5zaW9ucygpW2ldKTsKKyAgICAgICAgaW5wdXRJbmRleCArPSBpZHggKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxJbnB1dERpbWVuc2lvbnM+KGksIDEpKSB7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCAlIG1faW1wbC5kaW1lbnNpb25zKClbaV0gPT0gMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5wdXRJbmRleCArPSAoaWR4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgIH0KKyAgICBJbmRleCBpbm5lcm1vc3RMb2M7CisgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPEJyb2FkY2FzdD4oTnVtRGltcy0xLCAxKSkgeworICAgICAgZWlnZW5fYXNzZXJ0KGluZGV4IDwgbV9pbXBsLmRpbWVuc2lvbnMoKVtOdW1EaW1zLTFdKTsKKyAgICAgIGlubmVybW9zdExvYyA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8SW5wdXREaW1lbnNpb25zPihOdW1EaW1zLTEsIDEpKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCAlIG1faW1wbC5kaW1lbnNpb25zKClbTnVtRGltcy0xXSA9PSAwKTsKKyAgICAgICAgaW5uZXJtb3N0TG9jID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlubmVybW9zdExvYyA9IGluZGV4ICUgbV9pbXBsLmRpbWVuc2lvbnMoKVtOdW1EaW1zLTFdOworICAgICAgfQorICAgIH0KKyAgICBpbnB1dEluZGV4ICs9IGlubmVybW9zdExvYzsKKworICAgIC8vIFRvZG86IHRoaXMgY291bGQgYmUgZXh0ZW5kZWQgdG8gdGhlIHNlY29uZCBkaW1lbnNpb24gaWYgd2UncmUgbm90CisgICAgLy8gYnJvYWRjYXN0aW5nIGFsb25nc2lkZSB0aGUgZmlyc3QgZGltZW5zaW9uLCBhbmQgc28gb24uCisgICAgaWYgKGlubmVybW9zdExvYyArIFBhY2tldFNpemUgPD0gbV9pbXBsLmRpbWVuc2lvbnMoKVtOdW1EaW1zLTFdKSB7CisgICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgIHZhbHVlc1swXSA9IG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgIHZhbHVlc1tpXSA9IGNvZWZmUm93TWFqb3Iob3JpZ2luYWxJbmRleCtpKTsKKyAgICAgIH0KKyAgICAgIFBhY2tldFJldHVyblR5cGUgcnNsdCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMpOworICAgICAgcmV0dXJuIHJzbHQ7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIGRvdWJsZSBjb21wdXRlX2Nvc3QgPSBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCk7CisgICAgaWYgKE51bURpbXMgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgY29tcHV0ZV9jb3N0ICs9IFRlbnNvck9wQ29zdDo6RGl2Q29zdDxJbmRleD4oKTsKKyAgICAgICAgaWYgKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPEJyb2FkY2FzdD4oaSwgMSkpIHsKKyAgICAgICAgICBjb21wdXRlX2Nvc3QgKz0KKyAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpNdWxDb3N0PEluZGV4PigpICsgVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8SW5wdXREaW1lbnNpb25zPihpLCAxKSkgeworICAgICAgICAgICAgY29tcHV0ZV9jb3N0ICs9IFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpNb2RDb3N0PEluZGV4PigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXB1dGVfY29zdCArPQorICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpNdWxDb3N0PEluZGV4PigpICsgVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+JiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisKKyAgQnJvYWRjYXN0IGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Jyb2FkY2FzdDsgfQorCisgcHJvdGVjdGVkOgorICBjb25zdCBCcm9hZGNhc3QgbV9icm9hZGNhc3Q7CisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9vdXRwdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9pbnB1dFN0cmlkZXM7CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0JST0FEQ0FTVElOR19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNoaXBwaW5nLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNoaXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhN2VmMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ2hpcHBpbmcuaApAQCAtMCwwICsxLDM4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NISVBQSU5HX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DSElQUElOR19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yS0NoaXBwaW5nUmVzaGFwaW5nCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIEEgY2hpcCBpcyBhIHRoaW4gc2xpY2UsIGNvcnJlc3BvbmRpbmcgdG8gYSBjb2x1bW4gb3IgYSByb3cgaW4gYSAyLWQgdGVuc29yLgorICAqCisgICoKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPERlbnNlSW5kZXggRGltSWQsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnMgLSAxOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8RGVuc2VJbmRleCBEaW1JZCwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTxEZW5zZUluZGV4IERpbUlkLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JDaGlwcGluZ09wPERpbUlkLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDaGlwcGluZ09wPERpbUlkLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIFhwclR5cGU+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBEaW1JZD4KK3N0cnVjdCBEaW1lbnNpb25JZAoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIERpbWVuc2lvbklkKERlbnNlSW5kZXggZGltKSB7CisgICAgZWlnZW5fYXNzZXJ0KGRpbSA9PSBEaW1JZCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZW5zZUluZGV4IGFjdHVhbERpbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGltSWQ7CisgIH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IERpbWVuc2lvbklkPER5bmFtaWM+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGltZW5zaW9uSWQoRGVuc2VJbmRleCBkaW0pIDogYWN0dWFsX2RpbShkaW0pIHsKKyAgICBlaWdlbl9hc3NlcnQoZGltID49IDApOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVuc2VJbmRleCBhY3R1YWxEaW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGFjdHVhbF9kaW07CisgIH0KKyBwcml2YXRlOgorICBjb25zdCBEZW5zZUluZGV4IGFjdHVhbF9kaW07Cit9OworCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisKK3RlbXBsYXRlPERlbnNlSW5kZXggRGltSWQsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBUZW5zb3JDaGlwcGluZ09wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgWHByVHlwZT4gPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ2hpcHBpbmdPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JDaGlwcGluZ09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ2hpcHBpbmdPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNoaXBwaW5nT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckNoaXBwaW5nT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgSW5kZXggb2Zmc2V0LCBjb25zdCBJbmRleCBkaW0pCisgICAgICA6IG1feHByKGV4cHIpLCBtX29mZnNldChvZmZzZXQpLCBtX2RpbShkaW0pIHsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IEluZGV4IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IEluZGV4IGRpbSgpIGNvbnN0IHsgcmV0dXJuIG1fZGltLmFjdHVhbERpbSgpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDaGlwcGluZ09wJiBvcGVyYXRvciA9IChjb25zdCBUZW5zb3JDaGlwcGluZ09wJiBvdGhlcikKKyAgeworICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yQ2hpcHBpbmdPcCwgY29uc3QgVGVuc29yQ2hpcHBpbmdPcD4gQXNzaWduOworICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQ2hpcHBpbmdPcCYgb3BlcmF0b3IgPSAoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyAgeworICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yQ2hpcHBpbmdPcCwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgQXNzaWduIGFzc2lnbigqdGhpcywgb3RoZXIpOworICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7CisgICAgY29uc3QgSW5kZXggbV9vZmZzZXQ7CisgICAgY29uc3QgaW50ZXJuYWw6OkRpbWVuc2lvbklkPERpbUlkPiBtX2RpbTsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPERlbnNlSW5kZXggRGltSWQsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgQXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDaGlwcGluZ09wPERpbUlkLCBBcmdUeXBlPiBYcHJUeXBlOworICBzdGF0aWMgY29uc3QgaW50IE51bUlucHV0RGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IE51bUlucHV0RGltcy0xOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworCisgIGVudW0geworICAgIC8vIEFsaWdubWVudCBjYW4ndCBiZSBndWFyYW50ZWVkIGF0IGNvbXBpbGUgdGltZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZQorICAgIC8vIHNsaWNlIG9mZnNldHMuCisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX2RpbShvcC5kaW0oKSksIG1fZGV2aWNlKGRldmljZSkKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE51bUlucHV0RGltcyA+PSAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICBlaWdlbl9hc3NlcnQoTnVtSW5wdXREaW1zID4gbV9kaW0uYWN0dWFsRGltKCkpOworCisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2ltcGwuZGltZW5zaW9ucygpOworICAgIGVpZ2VuX2Fzc2VydChvcC5vZmZzZXQoKSA8IGlucHV0X2RpbXNbbV9kaW0uYWN0dWFsRGltKCldKTsKKworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bUlucHV0RGltczsgKytpKSB7CisgICAgICBpZiAoaSAhPSBtX2RpbS5hY3R1YWxEaW0oKSkgeworICAgICAgICBtX2RpbWVuc2lvbnNbal0gPSBpbnB1dF9kaW1zW2ldOworICAgICAgICArK2o7CisgICAgICB9CisgICAgfQorCisgICAgbV9zdHJpZGUgPSAxOworICAgIG1faW5wdXRTdHJpZGUgPSAxOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9kaW0uYWN0dWFsRGltKCk7ICsraSkgeworICAgICAgICBtX3N0cmlkZSAqPSBpbnB1dF9kaW1zW2ldOworICAgICAgICBtX2lucHV0U3RyaWRlICo9IGlucHV0X2RpbXNbaV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1JbnB1dERpbXMtMTsgaSA+IG1fZGltLmFjdHVhbERpbSgpOyAtLWkpIHsKKyAgICAgICAgbV9zdHJpZGUgKj0gaW5wdXRfZGltc1tpXTsKKyAgICAgICAgbV9pbnB1dFN0cmlkZSAqPSBpbnB1dF9kaW1zW2ldOworICAgICAgfQorICAgIH0KKyAgICBtX2lucHV0U3RyaWRlICo9IGlucHV0X2RpbXNbbV9kaW0uYWN0dWFsRGltKCldOworICAgIG1faW5wdXRPZmZzZXQgPSBtX3N0cmlkZSAqIG9wLm9mZnNldCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKHNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChQYWNrZXRTaXplID4gMSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICBlaWdlbl9hc3NlcnQoaW5kZXgrUGFja2V0U2l6ZS0xIDwgZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKTsKKworICAgIGlmICgoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpICYmIG1fZGltLmFjdHVhbERpbSgpID09IDApIHx8CisJKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJiBtX2RpbS5hY3R1YWxEaW0oKSA9PSBOdW1JbnB1dERpbXMtMSkpIHsKKyAgICAgIC8vIG1fc3RyaWRlIGlzIGVxdWFsIHRvIDEsIHNvIGxldCdzIGF2b2lkIHRoZSBpbnRlZ2VyIGRpdmlzaW9uLgorICAgICAgZWlnZW5fYXNzZXJ0KG1fc3RyaWRlID09IDEpOworICAgICAgSW5kZXggaW5wdXRJbmRleCA9IGluZGV4ICogbV9pbnB1dFN0cmlkZSArIG1faW5wdXRPZmZzZXQ7CisgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgIHZhbHVlc1tpXSA9IG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgICAgICAgaW5wdXRJbmRleCArPSBtX2lucHV0U3RyaWRlOworICAgICAgfQorICAgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgICByZXR1cm4gcnNsdDsKKyAgICB9IGVsc2UgaWYgKChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgJiYgbV9kaW0uYWN0dWFsRGltKCkgPT0gTnVtSW5wdXREaW1zIC0gMSkgfHwKKwkgICAgICAgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJiBtX2RpbS5hY3R1YWxEaW0oKSA9PSAwKSkgeworICAgICAgLy8gbV9zdHJpZGUgaXMgYXdheXMgZ3JlYXRlciB0aGFuIGluZGV4LCBzbyBsZXQncyBhdm9pZCB0aGUgaW50ZWdlciBkaXZpc2lvbi4KKyAgICAgIGVpZ2VuX2Fzc2VydChtX3N0cmlkZSA+IGluZGV4KTsKKyAgICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCArIG1faW5wdXRPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fc3RyaWRlOworICAgICAgY29uc3QgSW5kZXggcmVtID0gaW5kZXggLSBpZHggKiBtX3N0cmlkZTsKKyAgICAgIGlmIChyZW0gKyBQYWNrZXRTaXplIDw9IG1fc3RyaWRlKSB7CisgICAgICAgIEluZGV4IGlucHV0SW5kZXggPSBpZHggKiBtX2lucHV0U3RyaWRlICsgbV9pbnB1dE9mZnNldCArIHJlbTsKKyAgICAgICAgcmV0dXJuIG1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGlucHV0SW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ3Jvc3MgdGhlIHN0cmlkZSBib3VuZGFyeS4gRmFsbGJhY2sgdG8gc2xvdyBwYXRoLgorICAgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgICAgICB2YWx1ZXNbaV0gPSBjb2VmZihpbmRleCk7CisgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgfQorICAgICAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIHJzbHQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIGRvdWJsZSBjb3N0ID0gMDsKKyAgICBpZiAoKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSAmJgorICAgICAgICAgbV9kaW0uYWN0dWFsRGltKCkgPT0gMCkgfHwKKyAgICAgICAgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJgorICAgICAgICAgbV9kaW0uYWN0dWFsRGltKCkgPT0gTnVtSW5wdXREaW1zIC0gMSkpIHsKKyAgICAgIGNvc3QgKz0gVGVuc29yT3BDb3N0OjpNdWxDb3N0PEluZGV4PigpICsgVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpOworICAgIH0gZWxzZSBpZiAoKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSAmJgorICAgICAgICAgICAgICAgIG1fZGltLmFjdHVhbERpbSgpID09IE51bUlucHV0RGltcyAtIDEpIHx8CisgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oUm93TWFqb3IpICYmCisgICAgICAgICAgICAgICAgbV9kaW0uYWN0dWFsRGltKCkgPT0gMCkpIHsKKyAgICAgIGNvc3QgKz0gVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpOworICAgIH0gZWxzZSB7CisgICAgICBjb3N0ICs9IDMgKiBUZW5zb3JPcENvc3Q6Ok11bENvc3Q8SW5kZXg+KCkgKyBUZW5zb3JPcENvc3Q6OkRpdkNvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAzICogVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpOworICAgIH0KKworICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIGNvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7CisgICAgQ29lZmZSZXR1cm5UeXBlKiByZXN1bHQgPSBjb25zdF9jYXN0PENvZWZmUmV0dXJuVHlwZSo+KG1faW1wbC5kYXRhKCkpOworICAgIGlmICgoKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSAmJiBtX2RpbS5hY3R1YWxEaW0oKSA9PSBOdW1EaW1zKSB8fAorICAgICAgICAgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJiBtX2RpbS5hY3R1YWxEaW0oKSA9PSAwKSkgJiYKKyAgICAgICAgcmVzdWx0KSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgbV9pbnB1dE9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggc3JjQ29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBJbmRleCBpbnB1dEluZGV4OworICAgIGlmICgoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpICYmIG1fZGltLmFjdHVhbERpbSgpID09IDApIHx8CisJKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJiBtX2RpbS5hY3R1YWxEaW0oKSA9PSBOdW1JbnB1dERpbXMtMSkpIHsKKyAgICAgIC8vIG1fc3RyaWRlIGlzIGVxdWFsIHRvIDEsIHNvIGxldCdzIGF2b2lkIHRoZSBpbnRlZ2VyIGRpdmlzaW9uLgorICAgICAgZWlnZW5fYXNzZXJ0KG1fc3RyaWRlID09IDEpOworICAgICAgaW5wdXRJbmRleCA9IGluZGV4ICogbV9pbnB1dFN0cmlkZSArIG1faW5wdXRPZmZzZXQ7CisgICAgfSBlbHNlIGlmICgoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpICYmIG1fZGltLmFjdHVhbERpbSgpID09IE51bUlucHV0RGltcy0xKSB8fAorCSAgICAgICAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oUm93TWFqb3IpICYmIG1fZGltLmFjdHVhbERpbSgpID09IDApKSB7CisgICAgICAvLyBtX3N0cmlkZSBpcyBhd2F5cyBncmVhdGVyIHRoYW4gaW5kZXgsIHNvIGxldCdzIGF2b2lkIHRoZSBpbnRlZ2VyIGRpdmlzaW9uLgorICAgICAgZWlnZW5fYXNzZXJ0KG1fc3RyaWRlID4gaW5kZXgpOworICAgICAgaW5wdXRJbmRleCA9IGluZGV4ICsgbV9pbnB1dE9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX3N0cmlkZTsKKyAgICAgIGlucHV0SW5kZXggPSBpZHggKiBtX2lucHV0U3RyaWRlICsgbV9pbnB1dE9mZnNldDsKKyAgICAgIGluZGV4IC09IGlkeCAqIG1fc3RyaWRlOworICAgICAgaW5wdXRJbmRleCArPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0SW5kZXg7CisgIH0KKworICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgSW5kZXggbV9zdHJpZGU7CisgIEluZGV4IG1faW5wdXRPZmZzZXQ7CisgIEluZGV4IG1faW5wdXRTdHJpZGU7CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKKyAgY29uc3QgaW50ZXJuYWw6OkRpbWVuc2lvbklkPERpbUlkPiBtX2RpbTsKKyAgY29uc3QgRGV2aWNlJiBtX2RldmljZTsKK307CisKKworLy8gRXZhbCBhcyBsdmFsdWUKK3RlbXBsYXRlPERlbnNlSW5kZXggRGltSWQsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8VGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgQXJnVHlwZT4sIERldmljZT4KKyAgOiBwdWJsaWMgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNoaXBwaW5nT3A8RGltSWQsIEFyZ1R5cGU+LCBEZXZpY2U+IEJhc2U7CisgIHR5cGVkZWYgVGVuc29yQ2hpcHBpbmdPcDxEaW1JZCwgQXJnVHlwZT4gWHByVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1JbnB1dERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBOdW1JbnB1dERpbXMtMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IEJhc2Uob3AsIGRldmljZSkKKyAgICB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICByZXR1cm4gdGhpcy0+bV9pbXBsLmNvZWZmUmVmKHRoaXMtPnNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IFN0b3JlTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRSZXR1cm5UeXBlJiB4KQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisKKyAgICBpZiAoKHN0YXRpY19jYXN0PGludD4odGhpcy0+TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSAmJiB0aGlzLT5tX2RpbS5hY3R1YWxEaW0oKSA9PSAwKSB8fAorCShzdGF0aWNfY2FzdDxpbnQ+KHRoaXMtPkxheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihSb3dNYWpvcikgJiYgdGhpcy0+bV9kaW0uYWN0dWFsRGltKCkgPT0gTnVtSW5wdXREaW1zLTEpKSB7CisgICAgICAvLyBtX3N0cmlkZSBpcyBlcXVhbCB0byAxLCBzbyBsZXQncyBhdm9pZCB0aGUgaW50ZWdlciBkaXZpc2lvbi4KKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5tX3N0cmlkZSA9PSAxKTsKKyAgICAgIEVJR0VOX0FMSUdOX01BWCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PENvZWZmUmV0dXJuVHlwZT46OnR5cGUgdmFsdWVzW1BhY2tldFNpemVdOworICAgICAgaW50ZXJuYWw6OnBzdG9yZTxDb2VmZlJldHVyblR5cGUsIFBhY2tldFJldHVyblR5cGU+KHZhbHVlcywgeCk7CisgICAgICBJbmRleCBpbnB1dEluZGV4ID0gaW5kZXggKiB0aGlzLT5tX2lucHV0U3RyaWRlICsgdGhpcy0+bV9pbnB1dE9mZnNldDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMtPm1faW1wbC5jb2VmZlJlZihpbnB1dEluZGV4KSA9IHZhbHVlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRleCArPSB0aGlzLT5tX2lucHV0U3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHN0YXRpY19jYXN0PGludD4odGhpcy0+TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSAmJiB0aGlzLT5tX2RpbS5hY3R1YWxEaW0oKSA9PSBOdW1JbnB1dERpbXMtMSkgfHwKKwkgICAgICAgKHN0YXRpY19jYXN0PGludD4odGhpcy0+TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFJvd01ham9yKSAmJiB0aGlzLT5tX2RpbS5hY3R1YWxEaW0oKSA9PSAwKSkgeworICAgICAgLy8gbV9zdHJpZGUgaXMgYXdheXMgZ3JlYXRlciB0aGFuIGluZGV4LCBzbyBsZXQncyBhdm9pZCB0aGUgaW50ZWdlciBkaXZpc2lvbi4KKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5tX3N0cmlkZSA+IGluZGV4KTsKKyAgICAgIHRoaXMtPm1faW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4ICsgdGhpcy0+bV9pbnB1dE9mZnNldCwgeCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gdGhpcy0+bV9zdHJpZGU7CisgICAgICBjb25zdCBJbmRleCByZW0gPSBpbmRleCAtIGlkeCAqIHRoaXMtPm1fc3RyaWRlOworICAgICAgaWYgKHJlbSArIFBhY2tldFNpemUgPD0gdGhpcy0+bV9zdHJpZGUpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5wdXRJbmRleCA9IGlkeCAqIHRoaXMtPm1faW5wdXRTdHJpZGUgKyB0aGlzLT5tX2lucHV0T2Zmc2V0ICsgcmVtOworICAgICAgICB0aGlzLT5tX2ltcGwudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihpbnB1dEluZGV4LCB4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENyb3NzIHN0cmlkZSBib3VuZGFyeS4gRmFsbGJhY2sgdG8gc2xvdyBwYXRoLgorICAgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgICAgaW50ZXJuYWw6OnBzdG9yZTxDb2VmZlJldHVyblR5cGUsIFBhY2tldFJldHVyblR5cGU+KHZhbHVlcywgeCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgICAgdGhpcy0+Y29lZmZSZWYoaW5kZXgpID0gdmFsdWVzW2ldOworICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NISVBQSU5HX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29uY2F0ZW5hdGlvbi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb25jYXRlbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliZjkwZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29uY2F0ZW5hdGlvbi5oCkBAIC0wLDAgKzEsMzYxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OQ0FURU5BVElPTl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OQ0FURU5BVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yQ29uY2F0ZW5hdGlvbk9wCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBjb25jYXRlbmF0aW9uIGNsYXNzLgorICAqCisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBBeGlzLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JDb25jYXRlbmF0aW9uT3A8QXhpcywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4gPgoreworICAvLyBUeXBlIHByb21vdGlvbiB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHR5cGVzIG9mIHRoZSBsaHMgYW5kIHRoZSByaHMgYXJlIGRpZmZlcmVudC4KKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBMaHNYcHJUeXBlOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmhzWHByVHlwZTo6U2NhbGFyPjo6cmV0IFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzWHByVHlwZT46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHNYcHJUeXBlPjo6U3RvcmFnZUtpbmQ+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHNYcHJUeXBlPjo6SW5kZXg+Ojp0eXBlIEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZCBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkIFJoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gdHJhaXRzPExoc1hwclR5cGU+OjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IHRyYWl0czxMaHNYcHJUeXBlPjo6TGF5b3V0OworICBlbnVtIHsgRmxhZ3MgPSAwIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBeGlzLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yQ29uY2F0ZW5hdGlvbk9wPEF4aXMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQ29uY2F0ZW5hdGlvbk9wPEF4aXMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXhpcywgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQ29uY2F0ZW5hdGlvbk9wPEF4aXMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKK3RlbXBsYXRlPHR5cGVuYW1lIEF4aXMsIHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitjbGFzcyBUZW5zb3JDb25jYXRlbmF0aW9uT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDb25jYXRlbmF0aW9uT3A8QXhpcywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIFdyaXRlQWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNvbmNhdGVuYXRpb25PcD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNvbmNhdGVuYXRpb25PcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDb25jYXRlbmF0aW9uT3A+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ29uY2F0ZW5hdGlvbk9wPjo6dHlwZSBOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgTGhzWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJoc1hwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OnJldCBDb2VmZlJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDb25jYXRlbmF0aW9uT3AoY29uc3QgTGhzWHByVHlwZSYgbGhzLCBjb25zdCBSaHNYcHJUeXBlJiByaHMsIEF4aXMgYXhpcykKKyAgICAgICAgOiBtX2xoc194cHIobGhzKSwgbV9yaHNfeHByKHJocyksIG1fYXhpcyhheGlzKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBMaHNYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGxoc0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2xoc194cHI7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICByaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9yaHNfeHByOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBBeGlzJiBheGlzKCkgY29uc3QgeyByZXR1cm4gbV9heGlzOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQ29uY2F0ZW5hdGlvbk9wJiBvcGVyYXRvciA9IChjb25zdCBUZW5zb3JDb25jYXRlbmF0aW9uT3AmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yQ29uY2F0ZW5hdGlvbk9wLCBjb25zdCBUZW5zb3JDb25jYXRlbmF0aW9uT3A+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQ29uY2F0ZW5hdGlvbk9wJiBvcGVyYXRvciA9IChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yQ29uY2F0ZW5hdGlvbk9wLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgTGhzWHByVHlwZTo6TmVzdGVkIG1fbGhzX3hwcjsKKyAgICB0eXBlbmFtZSBSaHNYcHJUeXBlOjpOZXN0ZWQgbV9yaHNfeHByOworICAgIGNvbnN0IEF4aXMgbV9heGlzOworfTsKKworCisvLyBFdmFsIGFzIHJ2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgQXhpcywgdHlwZW5hbWUgTGVmdEFyZ1R5cGUsIHR5cGVuYW1lIFJpZ2h0QXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDb25jYXRlbmF0aW9uT3A8QXhpcywgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDb25jYXRlbmF0aW9uT3A8QXhpcywgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgUmlnaHROdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPFJpZ2h0QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MgJiBUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBtX2xlZnRJbXBsKG9wLmxoc0V4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9yaWdodEltcGwob3AucmhzRXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX2F4aXMob3AuYXhpcygpKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OkxheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpIHx8IE51bURpbXMgPT0gMSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtRGltcyA9PSBSaWdodE51bURpbXMpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE51bURpbXMgPiAwKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIGVpZ2VuX2Fzc2VydCgwIDw9IG1fYXhpcyAmJiBtX2F4aXMgPCBOdW1EaW1zKTsKKyAgICBjb25zdCBEaW1lbnNpb25zJiBsaHNfZGltcyA9IG1fbGVmdEltcGwuZGltZW5zaW9ucygpOworICAgIGNvbnN0IERpbWVuc2lvbnMmIHJoc19kaW1zID0gbV9yaWdodEltcGwuZGltZW5zaW9ucygpOworICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGZvciAoOyBpIDwgbV9heGlzOyArK2kpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGxoc19kaW1zW2ldID4gMCk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChsaHNfZGltc1tpXSA9PSByaHNfZGltc1tpXSk7CisgICAgICAgIG1fZGltZW5zaW9uc1tpXSA9IGxoc19kaW1zW2ldOworICAgICAgfQorICAgICAgZWlnZW5fYXNzZXJ0KGxoc19kaW1zW2ldID4gMCk7ICAvLyBOb3cgaSA9PSBtX2F4aXMuCisgICAgICBlaWdlbl9hc3NlcnQocmhzX2RpbXNbaV0gPiAwKTsKKyAgICAgIG1fZGltZW5zaW9uc1tpXSA9IGxoc19kaW1zW2ldICsgcmhzX2RpbXNbaV07CisgICAgICBmb3IgKCsraTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBlaWdlbl9hc3NlcnQobGhzX2RpbXNbaV0gPiAwKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGxoc19kaW1zW2ldID09IHJoc19kaW1zW2ldKTsKKyAgICAgICAgbV9kaW1lbnNpb25zW2ldID0gbGhzX2RpbXNbaV07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9sZWZ0U3RyaWRlc1swXSA9IDE7CisgICAgICBtX3JpZ2h0U3RyaWRlc1swXSA9IDE7CisgICAgICBtX291dHB1dFN0cmlkZXNbMF0gPSAxOworCisgICAgICBmb3IgKGludCBqID0gMTsgaiA8IE51bURpbXM7ICsraikgeworICAgICAgICBtX2xlZnRTdHJpZGVzW2pdID0gbV9sZWZ0U3RyaWRlc1tqLTFdICogbGhzX2RpbXNbai0xXTsKKyAgICAgICAgbV9yaWdodFN0cmlkZXNbal0gPSBtX3JpZ2h0U3RyaWRlc1tqLTFdICogcmhzX2RpbXNbai0xXTsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2pdID0gbV9vdXRwdXRTdHJpZGVzW2otMV0gKiBtX2RpbWVuc2lvbnNbai0xXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9sZWZ0U3RyaWRlc1tOdW1EaW1zIC0gMV0gPSAxOworICAgICAgbV9yaWdodFN0cmlkZXNbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zIC0gMV0gPSAxOworCisgICAgICBmb3IgKGludCBqID0gTnVtRGltcyAtIDI7IGogPj0gMDsgLS1qKSB7CisgICAgICAgIG1fbGVmdFN0cmlkZXNbal0gPSBtX2xlZnRTdHJpZGVzW2orMV0gKiBsaHNfZGltc1tqKzFdOworICAgICAgICBtX3JpZ2h0U3RyaWRlc1tqXSA9IG1fcmlnaHRTdHJpZGVzW2orMV0gKiByaHNfZGltc1tqKzFdOworICAgICAgICBtX291dHB1dFN0cmlkZXNbal0gPSBtX291dHB1dFN0cmlkZXNbaisxXSAqIG1fZGltZW5zaW9uc1tqKzFdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIC8vIFRPRE8ocGhsaSk6IEFkZCBzaG9ydC1jaXJjdWl0IG1lbWNweSBldmFsdWF0aW9uIGlmIHVuZGVybHlpbmcgZGF0YSBhcmUgbGluZWFyPworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiAvKmRhdGEqLykKKyAgeworICAgIG1fbGVmdEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgbV9yaWdodEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpCisgIHsKKyAgICBtX2xlZnRJbXBsLmNsZWFudXAoKTsKKyAgICBtX3JpZ2h0SW1wbC5jbGVhbnVwKCk7CisgIH0KKworICAvLyBUT0RPKHBobGkpOiBhdHRlbXB0IHRvIHNwZWVkIHRoaXMgdXAuIFRoZSBpbnRlZ2VyIGRpdmlzaW9ucyBhbmQgbW9kdWxvIGFyZSBzbG93LgorICAvLyBTZWUgQ0wvNzYxODA3MjQgY29tbWVudHMgZm9yIG1vcmUgaWRlYXMuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgLy8gQ29sbGVjdCBkaW1lbnNpb24td2lzZSBpbmRpY2VzIChzdWJzKS4KKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gc3ViczsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgc3Vic1tpXSA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBzdWJzW2ldICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgc3Vic1swXSA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgc3Vic1tpXSA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBzdWJzW2ldICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgc3Vic1tOdW1EaW1zIC0gMV0gPSBpbmRleDsKKyAgICB9CisKKyAgICBjb25zdCBEaW1lbnNpb25zJiBsZWZ0X2RpbXMgPSBtX2xlZnRJbXBsLmRpbWVuc2lvbnMoKTsKKyAgICBpZiAoc3Vic1ttX2F4aXNdIDwgbGVmdF9kaW1zW21fYXhpc10pIHsKKyAgICAgIEluZGV4IGxlZnRfaW5kZXg7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgIGxlZnRfaW5kZXggPSBzdWJzWzBdOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICAgIGxlZnRfaW5kZXggKz0gKHN1YnNbaV0gJSBsZWZ0X2RpbXNbaV0pICogbV9sZWZ0U3RyaWRlc1tpXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGVmdF9pbmRleCA9IHN1YnNbTnVtRGltcyAtIDFdOworICAgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgbGVmdF9pbmRleCArPSAoc3Vic1tpXSAlIGxlZnRfZGltc1tpXSkgKiBtX2xlZnRTdHJpZGVzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbV9sZWZ0SW1wbC5jb2VmZihsZWZ0X2luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgc3Vic1ttX2F4aXNdIC09IGxlZnRfZGltc1ttX2F4aXNdOworICAgICAgY29uc3QgRGltZW5zaW9ucyYgcmlnaHRfZGltcyA9IG1fcmlnaHRJbXBsLmRpbWVuc2lvbnMoKTsKKyAgICAgIEluZGV4IHJpZ2h0X2luZGV4OworICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgICByaWdodF9pbmRleCA9IHN1YnNbMF07CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgICAgcmlnaHRfaW5kZXggKz0gKHN1YnNbaV0gJSByaWdodF9kaW1zW2ldKSAqIG1fcmlnaHRTdHJpZGVzW2ldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByaWdodF9pbmRleCA9IHN1YnNbTnVtRGltcyAtIDFdOworICAgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgcmlnaHRfaW5kZXggKz0gKHN1YnNbaV0gJSByaWdodF9kaW1zW2ldKSAqIG1fcmlnaHRTdHJpZGVzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbV9yaWdodEltcGwuY29lZmYocmlnaHRfaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8ocGhsaSk6IEFkZCBhIHJlYWwgdmVjdG9yaXphdGlvbi4KKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKHBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCArIHBhY2tldFNpemUgLSAxIDwgZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKTsKKworICAgIEVJR0VOX0FMSUdOX01BWCBDb2VmZlJldHVyblR5cGUgdmFsdWVzW3BhY2tldFNpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2V0U2l6ZTsgKytpKSB7CisgICAgICB2YWx1ZXNbaV0gPSBjb2VmZihpbmRleCtpKTsKKyAgICB9CisgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgcmV0dXJuIHJzbHQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IE51bURpbXMgKiAoMiAqIFRlbnNvck9wQ29zdDo6QWRkQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW5zb3JPcENvc3Q6Ok1vZENvc3Q8SW5kZXg+KCkpOworICAgIGNvbnN0IGRvdWJsZSBsaHNfc2l6ZSA9IG1fbGVmdEltcGwuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOworICAgIGNvbnN0IGRvdWJsZSByaHNfc2l6ZSA9IG1fcmlnaHRJbXBsLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKTsKKyAgICByZXR1cm4gKGxoc19zaXplIC8gKGxoc19zaXplICsgcmhzX3NpemUpKSAqCisgICAgICAgICAgICAgICBtX2xlZnRJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIChyaHNfc2l6ZSAvIChsaHNfc2l6ZSArIHJoc19zaXplKSkgKgorICAgICAgICAgICAgICAgbV9yaWdodEltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIGNvbXB1dGVfY29zdCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICAgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX291dHB1dFN0cmlkZXM7CisgICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fbGVmdFN0cmlkZXM7CisgICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fcmlnaHRTdHJpZGVzOworICAgIFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPiBtX2xlZnRJbXBsOworICAgIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT4gbV9yaWdodEltcGw7CisgICAgY29uc3QgQXhpcyBtX2F4aXM7Cit9OworCisvLyBFdmFsIGFzIGx2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgQXhpcywgdHlwZW5hbWUgTGVmdEFyZ1R5cGUsIHR5cGVuYW1lIFJpZ2h0QXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorICBzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgRGV2aWNlPgorICA6IHB1YmxpYyBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29uY2F0ZW5hdGlvbk9wPEF4aXMsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgRGV2aWNlPiBCYXNlOworICB0eXBlZGVmIFRlbnNvckNvbmNhdGVuYXRpb25PcDxBeGlzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MgJiBUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBCYXNlKG9wLCBkZXZpY2UpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICAvLyBDb2xsZWN0IGRpbWVuc2lvbi13aXNlIGluZGljZXMgKHN1YnMpLgorICAgIGFycmF5PEluZGV4LCBCYXNlOjpOdW1EaW1zPiBzdWJzOworICAgIGZvciAoaW50IGkgPSBCYXNlOjpOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgc3Vic1tpXSA9IGluZGV4IC8gdGhpcy0+bV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgaW5kZXggLT0gc3Vic1tpXSAqIHRoaXMtPm1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICB9CisgICAgc3Vic1swXSA9IGluZGV4OworCisgICAgY29uc3QgRGltZW5zaW9ucyYgbGVmdF9kaW1zID0gdGhpcy0+bV9sZWZ0SW1wbC5kaW1lbnNpb25zKCk7CisgICAgaWYgKHN1YnNbdGhpcy0+bV9heGlzXSA8IGxlZnRfZGltc1t0aGlzLT5tX2F4aXNdKSB7CisgICAgICBJbmRleCBsZWZ0X2luZGV4ID0gc3Vic1swXTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgQmFzZTo6TnVtRGltczsgKytpKSB7CisgICAgICAgIGxlZnRfaW5kZXggKz0gKHN1YnNbaV0gJSBsZWZ0X2RpbXNbaV0pICogdGhpcy0+bV9sZWZ0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLT5tX2xlZnRJbXBsLmNvZWZmUmVmKGxlZnRfaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBzdWJzW3RoaXMtPm1fYXhpc10gLT0gbGVmdF9kaW1zW3RoaXMtPm1fYXhpc107CisgICAgICBjb25zdCBEaW1lbnNpb25zJiByaWdodF9kaW1zID0gdGhpcy0+bV9yaWdodEltcGwuZGltZW5zaW9ucygpOworICAgICAgSW5kZXggcmlnaHRfaW5kZXggPSBzdWJzWzBdOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBCYXNlOjpOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgcmlnaHRfaW5kZXggKz0gKHN1YnNbaV0gJSByaWdodF9kaW1zW2ldKSAqIHRoaXMtPm1fcmlnaHRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMtPm1fcmlnaHRJbXBsLmNvZWZmUmVmKHJpZ2h0X2luZGV4KTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IFN0b3JlTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRSZXR1cm5UeXBlJiB4KQorICB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKHBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCArIHBhY2tldFNpemUgLSAxIDwgdGhpcy0+ZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKTsKKworICAgIEVJR0VOX0FMSUdOX01BWCBDb2VmZlJldHVyblR5cGUgdmFsdWVzW3BhY2tldFNpemVdOworICAgIGludGVybmFsOjpwc3RvcmU8Q29lZmZSZXR1cm5UeXBlLCBQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMsIHgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2V0U2l6ZTsgKytpKSB7CisgICAgICBjb2VmZlJlZihpbmRleCtpKSA9IHZhbHVlc1tpXTsKKyAgICB9CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05DQVRFTkFUSU9OX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb24uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGIyOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvbi5oCkBAIC0wLDAgKzEsNjI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVFJBQ1RJT05fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JDb250cmFjdGlvbgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUZW5zb3IgY29udHJhY3Rpb24gY2xhc3MuCisgICoKKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCB0cmFpdHM8VGVuc29yQ29udHJhY3Rpb25PcDxEaW1lbnNpb25zLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiA+Cit7CisgIC8vIFR5cGUgcHJvbW90aW9uIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdHlwZXMgb2YgdGhlIGxocyBhbmQgdGhlIHJocyBhcmUgZGlmZmVyZW50LgorICB0eXBlZGVmIHR5cGVuYW1lIGdlYnBfdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSBMaHNYcHJUeXBlOjpTY2FsYXI+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSBSaHNYcHJUeXBlOjpTY2FsYXI+Ojp0eXBlPjo6UmVzU2NhbGFyIFNjYWxhcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJoc1hwclR5cGU+OjpTdG9yYWdlS2luZD46OnJldCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPExoc1hwclR5cGU+OjpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJoc1hwclR5cGU+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzWHByVHlwZTo6TmVzdGVkIExoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHNYcHJUeXBlOjpOZXN0ZWQgUmhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TGhzTmVzdGVkPjo6dHlwZSBfTGhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8UmhzTmVzdGVkPjo6dHlwZSBfUmhzTmVzdGVkOworCisgIC8vIEZyb20gTnVtRGltcyBiZWxvdy4KKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gdHJhaXRzPFJoc1hwclR5cGU+OjpOdW1EaW1lbnNpb25zICsgdHJhaXRzPFJoc1hwclR5cGU+OjpOdW1EaW1lbnNpb25zIC0gMiAqIGFycmF5X3NpemU8RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IHRyYWl0czxMaHNYcHJUeXBlPjo6TGF5b3V0OworCisgIGVudW0geworICAgIEZsYWdzID0gMAorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvckNvbnRyYWN0aW9uT3A8RGltZW5zaW9ucywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JDb250cmFjdGlvbk9wPERpbWVuc2lvbnMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQ29udHJhY3Rpb25PcDxEaW1lbnNpb25zLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDb250cmFjdGlvbk9wPERpbWVuc2lvbnMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yQ29udHJhY3Rpb25PcDxEaW1lbnNpb25zLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kaWNlc18sIHR5cGVuYW1lIExlZnRBcmdUeXBlXywgdHlwZW5hbWUgUmlnaHRBcmdUeXBlXywgdHlwZW5hbWUgRGV2aWNlXz4KK3N0cnVjdCB0cmFpdHM8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNvbnRyYWN0aW9uT3A8SW5kaWNlc18sIExlZnRBcmdUeXBlXywgUmlnaHRBcmdUeXBlXz4sIERldmljZV8+ID4geworICB0eXBlZGVmIEluZGljZXNfIEluZGljZXM7CisgIHR5cGVkZWYgTGVmdEFyZ1R5cGVfIExlZnRBcmdUeXBlOworICB0eXBlZGVmIFJpZ2h0QXJnVHlwZV8gUmlnaHRBcmdUeXBlOworICB0eXBlZGVmIERldmljZV8gRGV2aWNlOworCisgIC8vIEZyb20gTnVtRGltcyBiZWxvdy4KKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gdHJhaXRzPExlZnRBcmdUeXBlXz46Ok51bURpbWVuc2lvbnMgKyB0cmFpdHM8UmlnaHRBcmdUeXBlXz46Ok51bURpbWVuc2lvbnMgLSAyICogYXJyYXlfc2l6ZTxJbmRpY2VzXz46OnZhbHVlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRpY2VzLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorY2xhc3MgVGVuc29yQ29udHJhY3Rpb25PcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckNvbnRyYWN0aW9uT3A8SW5kaWNlcywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ29udHJhY3Rpb25PcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlYnBfdHJhaXRzPHR5cGVuYW1lIExoc1hwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJoc1hwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OlJlc1NjYWxhciBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ29udHJhY3Rpb25PcD46OnR5cGUgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNvbnRyYWN0aW9uT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDb250cmFjdGlvbk9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDb250cmFjdGlvbk9wKAorICAgICAgY29uc3QgTGhzWHByVHlwZSYgbGhzLCBjb25zdCBSaHNYcHJUeXBlJiByaHMsIGNvbnN0IEluZGljZXMmIGRpbXMpCisgICAgICA6IG1fbGhzX3hwcihsaHMpLCBtX3Joc194cHIocmhzKSwgbV9pbmRpY2VzKGRpbXMpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgSW5kaWNlcyYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb25zICovCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgIGxoc0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2xoc194cHI7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHNYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICByaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9yaHNfeHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZCBtX2xoc194cHI7CisgICAgdHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkIG1fcmhzX3hwcjsKKyAgICBjb25zdCBJbmRpY2VzIG1faW5kaWNlczsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBUZW5zb3JDb250cmFjdGlvbkV2YWx1YXRvckJhc2UKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpJbmRpY2VzIEluZGljZXM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TGVmdEFyZ1R5cGUgTGVmdEFyZ1R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UmlnaHRBcmdUeXBlIFJpZ2h0QXJnVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpEZXZpY2UgRGV2aWNlOworCisgIHR5cGVkZWYgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IHRydWUsCisgICAgUGFja2V0QWNjZXNzID0gKGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemUgPiAxKSwKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSB0cnVlCisgIH07CisKKyAgLy8gTW9zdCBvZiB0aGUgY29kZSBpcyBhc3N1bWluZyB0aGF0IGJvdGggaW5wdXQgdGVuc29ycyBhcmUgQ29sTWFqb3IuIElmIHRoZQorICAvLyBpbnB1dHMgYXJlIFJvd01ham9yLCB3ZSB3aWxsICJjaGVhdCIgYnkgc3dhcHBpbmcgdGhlIExIUyBhbmQgUkhTOgorICAvLyBJZiB3ZSB3YW50IHRvIGNvbXB1dGUgQSAqIEIgPSBDLCB3aGVyZSBBIGlzIExIUyBhbmQgQiBpcyBSSFMsIHRoZSBjb2RlCisgIC8vIHdpbGwgcHJldGVuZCBCIGlzIExIUyBhbmQgQSBpcyBSSFMuCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgIHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSwgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT46OnR5cGUgRXZhbExlZnRBcmdUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvciksIFJpZ2h0QXJnVHlwZSwgTGVmdEFyZ1R5cGU+Ojp0eXBlIEV2YWxSaWdodEFyZ1R5cGU7CisKKyAgc3RhdGljIGNvbnN0IGludCBMRGltcyA9CisgICAgICBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8RXZhbExlZnRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgUkRpbXMgPQorICAgICAgaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV2YWxSaWdodEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBDb250cmFjdERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxJbmRpY2VzPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IExEaW1zICsgUkRpbXMgLSAyICogQ29udHJhY3REaW1zOworCisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIENvbnRyYWN0RGltcz4gY29udHJhY3RfdDsKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgTERpbXMgLSBDb250cmFjdERpbXM+IGxlZnRfbm9jb250cmFjdF90OworICB0eXBlZGVmIGFycmF5PEluZGV4LCBSRGltcyAtIENvbnRyYWN0RGltcz4gcmlnaHRfbm9jb250cmFjdF90OworCisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVGVuc29yQ29udHJhY3Rpb25FdmFsdWF0b3JCYXNlKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IG1fbGVmdEltcGwoY2hvb3NlKENvbmQ8c3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5saHNFeHByZXNzaW9uKCksIG9wLnJoc0V4cHJlc3Npb24oKSksIGRldmljZSksCisgICAgbV9yaWdodEltcGwoY2hvb3NlKENvbmQ8c3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yaHNFeHByZXNzaW9uKCksIG9wLmxoc0V4cHJlc3Npb24oKSksIGRldmljZSksCisgICAgICAgIG1fZGV2aWNlKGRldmljZSksCisgICAgICAgIG1fcmVzdWx0KE5VTEwpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSA9PQorCQkJICAgc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8UmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisKKworICAgIERTaXplczxJbmRleCwgTERpbXM+IGV2YWxfbGVmdF9kaW1zOworICAgIERTaXplczxJbmRleCwgUkRpbXM+IGV2YWxfcmlnaHRfZGltczsKKyAgICBhcnJheTxJbmRleFBhaXI8SW5kZXg+LCBDb250cmFjdERpbXM+IGV2YWxfb3BfaW5kaWNlczsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAvLyBGb3IgQ29sTWFqb3IsIHdlIGtlZXAgdXNpbmcgdGhlIGV4aXN0aW5nIGRpbWVuc2lvbnMKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTERpbXM7IGkrKykgeworICAgICAgICBldmFsX2xlZnRfZGltc1tpXSA9IG1fbGVmdEltcGwuZGltZW5zaW9ucygpW2ldOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRGltczsgaSsrKSB7CisgICAgICAgIGV2YWxfcmlnaHRfZGltc1tpXSA9IG1fcmlnaHRJbXBsLmRpbWVuc2lvbnMoKVtpXTsKKyAgICAgIH0KKyAgICAgIC8vIFdlIGtlZXAgdGhlIHBhaXJzIG9mIGNvbnRyYWN0aW5nIGluZGljZXMuCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENvbnRyYWN0RGltczsgaSsrKSB7CisgICAgICAgIGV2YWxfb3BfaW5kaWNlc1tpXS5maXJzdCA9IG9wLmluZGljZXMoKVtpXS5maXJzdDsKKyAgICAgICAgZXZhbF9vcF9pbmRpY2VzW2ldLnNlY29uZCA9IG9wLmluZGljZXMoKVtpXS5zZWNvbmQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEZvciBSb3dNYWpvciwgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBleGlzdGluZyBkaW1lbnNpb25zCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExEaW1zOyBpKyspIHsKKyAgICAgICAgZXZhbF9sZWZ0X2RpbXNbaV0gPSBtX2xlZnRJbXBsLmRpbWVuc2lvbnMoKVtMRGltcyAtIGkgLSAxXTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkRpbXM7IGkrKykgeworICAgICAgICBldmFsX3JpZ2h0X2RpbXNbaV0gPSBtX3JpZ2h0SW1wbC5kaW1lbnNpb25zKClbUkRpbXMgLSBpIC0gMV07CisgICAgICB9CisgICAgICAvLyBXZSBuZWVkIHRvIGZsaXAgYWxsIHRoZSBwYWlycyBvZiBjb250cmFjdGluZyBpbmRpY2VzIGFzIHdlbGwgYXMKKyAgICAgIC8vIHJldmVyc2luZyB0aGUgZGltZW5zaW9ucy4KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ29udHJhY3REaW1zOyBpKyspIHsKKyAgICAgICAgZXZhbF9vcF9pbmRpY2VzW2ldLmZpcnN0ID0gTERpbXMgLSAxIC0gb3AuaW5kaWNlcygpW0NvbnRyYWN0RGltcyAtIDEgLSBpXS5zZWNvbmQ7CisgICAgICAgIGV2YWxfb3BfaW5kaWNlc1tpXS5zZWNvbmQgPSBSRGltcyAtIDEgLSBvcC5pbmRpY2VzKClbQ29udHJhY3REaW1zIC0gMSAtIGldLmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgYXhlcyBhbmQgbWFrZSBzdXJlIHRoZSBmaXJzdCBpbmRleCBpbiBldmFsX29wX2luZGljZXMKKyAgICAvLyBpcyBpbmNyZWFzaW5nLiBVc2luZyBPKG5eMikgc29ydGluZyBpcyBPSyBzaW5jZSBDb250cmFjdERpbXMgaXMgc21hbGwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IENvbnRyYWN0RGltczsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBDb250cmFjdERpbXM7IGorKykgeworICAgICAgICBlaWdlbl9hc3NlcnQoZXZhbF9vcF9pbmRpY2VzW2pdLmZpcnN0ICE9IGV2YWxfb3BfaW5kaWNlc1tpXS5maXJzdCAmJgorICAgICAgICAgICAgICAgICAgICAgZXZhbF9vcF9pbmRpY2VzW2pdLnNlY29uZCAhPSBldmFsX29wX2luZGljZXNbaV0uc2Vjb25kICYmCisgICAgICAgICAgICAgICAgICAgICAiY29udHJhY3Rpb24gYXhlcyBzaG91bGQgYmUgdW5pcXVlIik7CisgICAgICAgIGlmIChldmFsX29wX2luZGljZXNbal0uZmlyc3QgPCBldmFsX29wX2luZGljZXNbaV0uZmlyc3QpIHsKKyAgICAgICAgICBudW1leHQ6OnN3YXAoZXZhbF9vcF9pbmRpY2VzW2pdLCBldmFsX29wX2luZGljZXNbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYXJyYXk8SW5kZXgsIExEaW1zPiBsaHNfc3RyaWRlczsKKyAgICBsaHNfc3RyaWRlc1swXSA9IDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRGltcy0xOyArK2kpIHsKKyAgICAgIGxoc19zdHJpZGVzW2krMV0gPSBsaHNfc3RyaWRlc1tpXSAqIGV2YWxfbGVmdF9kaW1zW2ldOworICAgIH0KKworICAgIGFycmF5PEluZGV4LCBSRGltcz4gcmhzX3N0cmlkZXM7CisgICAgcmhzX3N0cmlkZXNbMF0gPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkRpbXMtMTsgKytpKSB7CisgICAgICByaHNfc3RyaWRlc1tpKzFdID0gcmhzX3N0cmlkZXNbaV0gKiBldmFsX3JpZ2h0X2RpbXNbaV07CisgICAgfQorCisgICAgaWYgKG1faV9zdHJpZGVzLnNpemUoKSA+IDApIG1faV9zdHJpZGVzWzBdID0gMTsKKyAgICBpZiAobV9qX3N0cmlkZXMuc2l6ZSgpID4gMCkgbV9qX3N0cmlkZXNbMF0gPSAxOworICAgIGlmIChtX2tfc3RyaWRlcy5zaXplKCkgPiAwKSBtX2tfc3RyaWRlc1swXSA9IDE7CisKKyAgICBtX2lfc2l6ZSA9IDE7CisgICAgbV9qX3NpemUgPSAxOworICAgIG1fa19zaXplID0gMTsKKworICAgIC8vIFRvIGNvbXB1dGUgdGhlIGRpbWVuc2lvbiwgd2Ugc2ltcGx5IGNvbmNhdGVuYXRlIHRoZSBub24tY29udHJhY3RpbmcKKyAgICAvLyBkaW1lbnNpb25zIG9mIHRoZSBsZWZ0IGFuZCB0aGVuIHRoZSByaWdodCB0ZW5zb3IuIEFkZGl0aW9uYWxseSwgd2UgYWxzbworICAgIC8vIGNvbXB1dGUgdGhlIHN0cmlkZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGVmdCBub24tY29udHJhY3RpbmcKKyAgICAvLyBkaW1lbnNpb25zIGFuZCByaWdodCBub24tY29udHJhY3RpbmcgZGltZW5zaW9ucy4KKyAgICBtX2xoc19pbm5lcl9kaW1fY29udGlndW91cyA9IHRydWU7CisgICAgaW50IGRpbV9pZHggPSAwOworICAgIHVuc2lnbmVkIGludCBub2NvbnRyYWN0X2lkeCA9IDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExEaW1zOyBpKyspIHsKKyAgICAgIC8vIGZpbmQgaWYgd2UgYXJlIGNvbnRyYWN0aW5nIG9uIGluZGV4IGkgb2YgbGVmdCB0ZW5zb3IKKyAgICAgIGJvb2wgY29udHJhY3RpbmcgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQ29udHJhY3REaW1zOyBqKyspIHsKKyAgICAgICAgaWYgKGV2YWxfb3BfaW5kaWNlc1tqXS5maXJzdCA9PSBpKSB7CisgICAgICAgICAgY29udHJhY3RpbmcgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWNvbnRyYWN0aW5nKSB7CisgICAgICAgIC8vIGFkZCBkaW1lbnNpb24gc2l6ZSB0byBvdXRwdXQgZGltZW5zaW9ucworICAgICAgICBtX2RpbWVuc2lvbnNbZGltX2lkeF0gPSBldmFsX2xlZnRfZGltc1tpXTsKKyAgICAgICAgbV9sZWZ0X25vY29udHJhY3Rfc3RyaWRlc1tub2NvbnRyYWN0X2lkeF0gPSBsaHNfc3RyaWRlc1tpXTsKKyAgICAgICAgaWYgKGRpbV9pZHggIT0gaSkgeworICAgICAgICAgIG1fbGhzX2lubmVyX2RpbV9jb250aWd1b3VzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vY29udHJhY3RfaWR4KzEgPCBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxsZWZ0X25vY29udHJhY3RfdD46OnZhbHVlKSB7CisgICAgICAgICAgbV9pX3N0cmlkZXNbbm9jb250cmFjdF9pZHgrMV0gPQorICAgICAgICAgICAgICBtX2lfc3RyaWRlc1tub2NvbnRyYWN0X2lkeF0gKiBldmFsX2xlZnRfZGltc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX2lfc2l6ZSA9IG1faV9zdHJpZGVzW25vY29udHJhY3RfaWR4XSAqIGV2YWxfbGVmdF9kaW1zW2ldOworICAgICAgICB9CisgICAgICAgIGRpbV9pZHgrKzsKKyAgICAgICAgbm9jb250cmFjdF9pZHgrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBub2NvbnRyYWN0X2lkeCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRGltczsgaSsrKSB7CisgICAgICBib29sIGNvbnRyYWN0aW5nID0gZmFsc2U7CisgICAgICAvLyBmaW5kIGlmIHdlIGFyZSBjb250cmFjdGluZyBvbiBpbmRleCBpIG9mIHJpZ2h0IHRlbnNvcgorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb250cmFjdERpbXM7IGorKykgeworICAgICAgICBpZiAoZXZhbF9vcF9pbmRpY2VzW2pdLnNlY29uZCA9PSBpKSB7CisgICAgICAgICAgY29udHJhY3RpbmcgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWNvbnRyYWN0aW5nKSB7CisgICAgICAgIG1fZGltZW5zaW9uc1tkaW1faWR4XSA9IGV2YWxfcmlnaHRfZGltc1tpXTsKKyAgICAgICAgaWYgKG5vY29udHJhY3RfaWR4KzEgPCBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxyaWdodF9ub2NvbnRyYWN0X3Q+Ojp2YWx1ZSkgeworICAgICAgICAgIG1fal9zdHJpZGVzW25vY29udHJhY3RfaWR4KzFdID0KKyAgICAgICAgICAgICAgbV9qX3N0cmlkZXNbbm9jb250cmFjdF9pZHhdICogZXZhbF9yaWdodF9kaW1zW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fal9zaXplID0gbV9qX3N0cmlkZXNbbm9jb250cmFjdF9pZHhdICogZXZhbF9yaWdodF9kaW1zW2ldOworICAgICAgICB9CisgICAgICAgIG1fcmlnaHRfbm9jb250cmFjdF9zdHJpZGVzW25vY29udHJhY3RfaWR4XSA9IHJoc19zdHJpZGVzW2ldOworICAgICAgICBkaW1faWR4Kys7CisgICAgICAgIG5vY29udHJhY3RfaWR4Kys7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIHN0cmlkZXMgY29ycmVzcG9uZGluZyB0byB0aGUgY29udHJhY3RpbmcgZGltZW5zaW9ucy4gV2UKKyAgICAvLyBhc3N1bWVkIGFib3ZlIHRoYXQgbm9uLWNvbnRyYWN0aW5nIGF4ZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIG9yZGVyCisgICAgLy8gaW4gdGhlIG1hdHJpeCBhcyB0aGV5IGFyZSBpbiB0aGUgdGVuc29yLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IKKyAgICAvLyBjb250cmFjdGluZyBheGVzLiBBcyB0aGUgY29udHJhY3RpbmcgYXhlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUgaW4KKyAgICAvLyBlYWNoIHRlbnNvciwgd2UnbGwgb25seSBsb29rIGF0IHRoZSBmaXJzdCB0ZW5zb3IgaGVyZS4KKyAgICBtX3Joc19pbm5lcl9kaW1fY29udGlndW91cyA9IHRydWU7CisgICAgbV9yaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ29udHJhY3REaW1zOyBpKyspIHsKKyAgICAgIEluZGV4IGxlZnQgPSBldmFsX29wX2luZGljZXNbaV0uZmlyc3Q7CisgICAgICBJbmRleCByaWdodCA9IGV2YWxfb3BfaW5kaWNlc1tpXS5zZWNvbmQ7CisKKyAgICAgIEluZGV4IHNpemUgPSBldmFsX2xlZnRfZGltc1tsZWZ0XTsKKyAgICAgIGVpZ2VuX2Fzc2VydChzaXplID09IGV2YWxfcmlnaHRfZGltc1tyaWdodF0gJiYKKyAgICAgICAgICAgICAgICAgICAiQ29udHJhY3Rpb24gYXhlcyBtdXN0IGJlIHNhbWUgc2l6ZSIpOworCisgICAgICBpZiAoaSsxIDwgc3RhdGljX2Nhc3Q8aW50PihpbnRlcm5hbDo6YXJyYXlfc2l6ZTxjb250cmFjdF90Pjo6dmFsdWUpKSB7CisgICAgICAgIG1fa19zdHJpZGVzW2krMV0gPSBtX2tfc3RyaWRlc1tpXSAqIHNpemU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX2tfc2l6ZSA9IG1fa19zdHJpZGVzW2ldICogc2l6ZTsKKyAgICAgIH0KKyAgICAgIG1fbGVmdF9jb250cmFjdGluZ19zdHJpZGVzW2ldID0gbGhzX3N0cmlkZXNbbGVmdF07CisgICAgICBtX3JpZ2h0X2NvbnRyYWN0aW5nX3N0cmlkZXNbaV0gPSByaHNfc3RyaWRlc1tyaWdodF07CisKKyAgICAgIGlmIChpID4gMCAmJiByaWdodCA8IGV2YWxfb3BfaW5kaWNlc1tpLTFdLnNlY29uZCkgeworICAgICAgICBtX3Joc19pbm5lcl9kaW1fcmVvcmRlcmVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChyaWdodCAhPSBpKSB7CisgICAgICAgIG1fcmhzX2lubmVyX2RpbV9jb250aWd1b3VzID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIGxheW91dCBpcyBSb3dNYWpvciwgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBtX2RpbWVuc2lvbnMKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oUm93TWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gMCwgaiA9IE51bURpbXMgLSAxOyBpIDwgajsgaSsrLCBqLS0pIHsKKyAgICAgICAgbnVtZXh0Ojpzd2FwKG1fZGltZW5zaW9uc1tpXSwgbV9kaW1lbnNpb25zW2pdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiBkYXRhKSB7CisgICAgbV9sZWZ0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBtX3JpZ2h0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgZXZhbFRvKGRhdGEpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBtX3Jlc3VsdCA9IHN0YXRpY19jYXN0PFNjYWxhciAqPihtX2RldmljZS5hbGxvY2F0ZShkaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoU2NhbGFyKSkpOworICAgICAgZXZhbFRvKG1fcmVzdWx0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgZXZhbFRvKFNjYWxhciogYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm1fbGhzX2lubmVyX2RpbV9jb250aWd1b3VzKSB7CisgICAgICBpZiAodGhpcy0+bV9yaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQpIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPnRlbXBsYXRlIGV2YWxQcm9kdWN0PHRydWUsIHRydWUsIHRydWUsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPnRlbXBsYXRlIGV2YWxQcm9kdWN0PHRydWUsIHRydWUsIGZhbHNlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgIGlmICh0aGlzLT5tX3Joc19pbm5lcl9kaW1fcmVvcmRlcmVkKSB7CisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLT50ZW1wbGF0ZSBldmFsUHJvZHVjdDx0cnVlLCBmYWxzZSwgdHJ1ZSwgVW5hbGlnbmVkPihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKS0+dGVtcGxhdGUgZXZhbFByb2R1Y3Q8dHJ1ZSwgZmFsc2UsIGZhbHNlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAodGhpcy0+bV9yaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQpIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPnRlbXBsYXRlIGV2YWxQcm9kdWN0PGZhbHNlLCB0cnVlLCB0cnVlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLT50ZW1wbGF0ZSBldmFsUHJvZHVjdDxmYWxzZSwgdHJ1ZSwgZmFsc2UsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQpIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPnRlbXBsYXRlIGV2YWxQcm9kdWN0PGZhbHNlLCBmYWxzZSwgdHJ1ZSwgVW5hbGlnbmVkPihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKS0+dGVtcGxhdGUgZXZhbFByb2R1Y3Q8ZmFsc2UsIGZhbHNlLCBmYWxzZSwgVW5hbGlnbmVkPihidWZmZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGJvb2wgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBib29sIHJoc19pbm5lcl9kaW1fY29udGlndW91cywgYm9vbCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgaW50IEFsaWdubWVudD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBldmFsR2VtdihTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBtX2lfc2l6ZTsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gbV9rX3NpemU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbExlZnRBcmdUeXBlOjpTY2FsYXI+Ojp0eXBlIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbFJpZ2h0QXJnVHlwZTo6U2NhbGFyPjo6dHlwZSBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbExlZnRBcmdUeXBlLCBEZXZpY2U+IExlZnRFdmFsdWF0b3I7CisgICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbFJpZ2h0QXJnVHlwZSwgRGV2aWNlPiBSaWdodEV2YWx1YXRvcjsKKyAgICBjb25zdCBJbmRleCBsaHNfcGFja2V0X3NpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIExlZnRFdmFsdWF0b3I6OlBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIGNvbnN0IEluZGV4IHJoc19wYWNrZXRfc2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8dHlwZW5hbWUgUmlnaHRFdmFsdWF0b3I6OlBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIGNvbnN0IGludCBsaHNfYWxpZ25tZW50ID0gTGVmdEV2YWx1YXRvcjo6SXNBbGlnbmVkID8gQWxpZ25lZCA6IFVuYWxpZ25lZDsKKyAgICBjb25zdCBpbnQgcmhzX2FsaWdubWVudCA9IFJpZ2h0RXZhbHVhdG9yOjpJc0FsaWduZWQgPyBBbGlnbmVkIDogVW5hbGlnbmVkOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uSW5wdXRNYXBwZXI8TGhzU2NhbGFyLCBJbmRleCwgaW50ZXJuYWw6OkxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRFdmFsdWF0b3IsIGxlZnRfbm9jb250cmFjdF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3RfdCwgbGhzX3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGxoc19hbGlnbm1lbnQ+IExoc01hcHBlcjsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uSW5wdXRNYXBwZXI8UmhzU2NhbGFyLCBJbmRleCwgaW50ZXJuYWw6OlJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0RXZhbHVhdG9yLCByaWdodF9ub2NvbnRyYWN0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdF90LCByaHNfcGFja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgcmhzX2FsaWdubWVudD4gUmhzTWFwcGVyOworCisgICAgTGhzTWFwcGVyIGxocyhtX2xlZnRJbXBsLCBtX2xlZnRfbm9jb250cmFjdF9zdHJpZGVzLCBtX2lfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgIG1fbGVmdF9jb250cmFjdGluZ19zdHJpZGVzLCBtX2tfc3RyaWRlcyk7CisgICAgUmhzTWFwcGVyIHJocyhtX3JpZ2h0SW1wbCwgbV9yaWdodF9ub2NvbnRyYWN0X3N0cmlkZXMsIG1fal9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgbV9yaWdodF9jb250cmFjdGluZ19zdHJpZGVzLCBtX2tfc3RyaWRlcyk7CisKKyAgICBjb25zdCBTY2FsYXIgYWxwaGEoMSk7CisgICAgY29uc3QgSW5kZXggcmVzSW5jcigxKTsKKworICAgIC8vIHplcm8gb3V0IHRoZSByZXN1bHQgYnVmZmVyICh3aGljaCBtdXN0IGJlIG9mIHNpemUgYXQgbGVhc3Qgcm93cyAqIHNpemVvZihTY2FsYXIpCisgICAgbV9kZXZpY2UubWVtc2V0KGJ1ZmZlciwgMCwgcm93cyAqIHNpemVvZihTY2FsYXIpKTsKKworICAgIGludGVybmFsOjpnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsTGhzTWFwcGVyLENvbE1ham9yLGZhbHNlLFJoc1NjYWxhcixSaHNNYXBwZXIsZmFsc2U+OjpydW4oCisgICAgICAgIHJvd3MsIGNvbHMsIGxocywgcmhzLAorICAgICAgICBidWZmZXIsIHJlc0luY3IsIGFscGhhKTsKKyAgfQorCisgIHRlbXBsYXRlIDxib29sIGxoc19pbm5lcl9kaW1fY29udGlndW91cywgYm9vbCByaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGJvb2wgcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQsIGludCBBbGlnbm1lbnQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgZXZhbEdlbW0oU2NhbGFyKiBidWZmZXIpIGNvbnN0IHsKKyAgICAvLyBjb2x1bW5zIGluIGxlZnQgc2lkZSwgcm93cyBpbiByaWdodCBzaWRlCisgICAgY29uc3QgSW5kZXggayA9IHRoaXMtPm1fa19zaXplOworCisgICAgLy8gcm93cyBpbiBsZWZ0IHNpZGUKKyAgICBjb25zdCBJbmRleCBtID0gdGhpcy0+bV9pX3NpemU7CisKKyAgICAvLyBjb2x1bW5zIGluIHJpZ2h0IHNpZGUKKyAgICBjb25zdCBJbmRleCBuID0gdGhpcy0+bV9qX3NpemU7CisKKyAgICAvLyB6ZXJvIG91dCB0aGUgcmVzdWx0IGJ1ZmZlciAod2hpY2ggbXVzdCBiZSBvZiBzaXplIGF0IGxlYXN0IG0gKiBuICogc2l6ZW9mKFNjYWxhcikKKyAgICB0aGlzLT5tX2RldmljZS5tZW1zZXQoYnVmZmVyLCAwLCBtICogbiAqIHNpemVvZihTY2FsYXIpKTsKKworICAgIC8vIGRlZmluZSBtciwgbnIsIGFuZCBhbGwgb2YgbXkgZGF0YSBtYXBwZXIgdHlwZXMKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbExlZnRBcmdUeXBlOjpTY2FsYXI+Ojp0eXBlIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbFJpZ2h0QXJnVHlwZTo6U2NhbGFyPjo6dHlwZSBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VicF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+IFRyYWl0czsKKworICAgIGNvbnN0IEluZGV4IG5yID0gVHJhaXRzOjpucjsKKyAgICBjb25zdCBJbmRleCBtciA9IFRyYWl0czo6bXI7CisKKyAgICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxFdmFsTGVmdEFyZ1R5cGUsIERldmljZT4gTGVmdEV2YWx1YXRvcjsKKyAgICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxFdmFsUmlnaHRBcmdUeXBlLCBEZXZpY2U+IFJpZ2h0RXZhbHVhdG9yOworCisgICAgY29uc3QgSW5kZXggbGhzX3BhY2tldF9zaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBMZWZ0RXZhbHVhdG9yOjpQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKyAgICBjb25zdCBJbmRleCByaHNfcGFja2V0X3NpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIFJpZ2h0RXZhbHVhdG9yOjpQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uSW5wdXRNYXBwZXI8TGhzU2NhbGFyLCBJbmRleCwgaW50ZXJuYWw6OkxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRFdmFsdWF0b3IsIGxlZnRfbm9jb250cmFjdF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3RfdCwgbGhzX3BhY2tldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIFVuYWxpZ25lZD4gTGhzTWFwcGVyOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VGVuc29yQ29udHJhY3Rpb25JbnB1dE1hcHBlcjxSaHNTY2FsYXIsIEluZGV4LCBpbnRlcm5hbDo6UmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRFdmFsdWF0b3IsIHJpZ2h0X25vY29udHJhY3RfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3QsIHJoc19wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbm5lcl9kaW1fY29udGlndW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbm5lcl9kaW1fcmVvcmRlcmVkLCBVbmFsaWduZWQ+IFJoc01hcHBlcjsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IE91dHB1dE1hcHBlcjsKKworICAgIC8vIERlY2xhcmUgR0VCUCBwYWNraW5nIGFuZCBrZXJuZWwgc3RydWN0cworICAgIGludGVybmFsOjpnZW1tX3BhY2tfbGhzPExoc1NjYWxhciwgSW5kZXgsIHR5cGVuYW1lIExoc01hcHBlcjo6U3ViTWFwcGVyLCBtciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgQ29sTWFqb3I+IHBhY2tfbGhzOworICAgIGludGVybmFsOjpnZW1tX3BhY2tfcmhzPFJoc1NjYWxhciwgSW5kZXgsIHR5cGVuYW1lIFJoc01hcHBlcjo6U3ViTWFwcGVyLCBuciwgQ29sTWFqb3I+IHBhY2tfcmhzOworCisgICAgaW50ZXJuYWw6OmdlYnBfa2VybmVsPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT3V0cHV0TWFwcGVyLCBtciwgbnIsIGZhbHNlLCBmYWxzZT4gZ2VicDsKKworICAgIC8vIGluaXRpYWxpemUgZGF0YSBtYXBwZXJzCisgICAgTGhzTWFwcGVyIGxocyh0aGlzLT5tX2xlZnRJbXBsLCB0aGlzLT5tX2xlZnRfbm9jb250cmFjdF9zdHJpZGVzLCB0aGlzLT5tX2lfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgIHRoaXMtPm1fbGVmdF9jb250cmFjdGluZ19zdHJpZGVzLCB0aGlzLT5tX2tfc3RyaWRlcyk7CisKKyAgICBSaHNNYXBwZXIgcmhzKHRoaXMtPm1fcmlnaHRJbXBsLCB0aGlzLT5tX3JpZ2h0X25vY29udHJhY3Rfc3RyaWRlcywgdGhpcy0+bV9qX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICB0aGlzLT5tX3JpZ2h0X2NvbnRyYWN0aW5nX3N0cmlkZXMsIHRoaXMtPm1fa19zdHJpZGVzKTsKKworICAgIE91dHB1dE1hcHBlciBvdXRwdXQoYnVmZmVyLCBtKTsKKworICAgIC8vIFNpemVzIG9mIHRoZSBibG9ja3MgdG8gbG9hZCBpbiBjYWNoZS4gU2VlIHRoZSBHb3RvIHBhcGVyIGZvciBkZXRhaWxzLgorICAgIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbkJsb2NraW5nPExoc01hcHBlciwgUmhzTWFwcGVyLCBJbmRleCwgaW50ZXJuYWw6OlNoYXJkQnlDb2w+IGJsb2NraW5nKGssIG0sIG4sIDEpOworICAgIGNvbnN0IEluZGV4IGtjID0gYmxvY2tpbmcua2MoKTsKKyAgICBjb25zdCBJbmRleCBtYyA9IG51bWV4dDo6bWluaShtLCBibG9ja2luZy5tYygpKTsKKyAgICBjb25zdCBJbmRleCBuYyA9IG51bWV4dDo6bWluaShuLCBibG9ja2luZy5uYygpKTsKKyAgICBjb25zdCBJbmRleCBzaXplQSA9IG1jICoga2M7CisgICAgY29uc3QgSW5kZXggc2l6ZUIgPSBrYyAqIG5jOworCisgICAgTGhzU2NhbGFyKiBibG9ja0EgPSBzdGF0aWNfY2FzdDxMaHNTY2FsYXIgKj4odGhpcy0+bV9kZXZpY2UuYWxsb2NhdGUoc2l6ZUEgKiBzaXplb2YoTGhzU2NhbGFyKSkpOworICAgIFJoc1NjYWxhciogYmxvY2tCID0gc3RhdGljX2Nhc3Q8UmhzU2NhbGFyICo+KHRoaXMtPm1fZGV2aWNlLmFsbG9jYXRlKHNpemVCICogc2l6ZW9mKFJoc1NjYWxhcikpKTsKKworICAgIGZvcihJbmRleCBpMj0wOyBpMjxtOyBpMis9bWMpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gbnVtZXh0OjptaW5pKGkyK21jLG0pLWkyOworICAgICAgZm9yIChJbmRleCBrMiA9IDA7IGsyIDwgazsgazIgKz0ga2MpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJzaG9vdCByaWdodCBlZGdlIG9mIGxlZnQgbWF0cml4LCB0aGVuIHBhY2sgdmVydGljYWwgcGFuZWwKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gbnVtZXh0OjptaW5pKGsyICsga2MsIGspIC0gazI7CisgICAgICAgIHBhY2tfbGhzKGJsb2NrQSwgbGhzLmdldFN1Yk1hcHBlcihpMiwgazIpLCBhY3R1YWxfa2MsIGFjdHVhbF9tYywgMCwgMCk7CisKKyAgICAgICAgLy8gc2VyaWVzIG9mIGhvcml6b250YWwgYmxvY2tzCisgICAgICAgIGZvciAoSW5kZXggajIgPSAwOyBqMiA8IG47IGoyICs9IG5jKSB7CisgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJzaG9vdCByaWdodCBlZGdlIG9mIHJpZ2h0IG1hdHJpeCwgdGhlbiBwYWNrIGJsb2NrCisgICAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX25jID0gbnVtZXh0OjptaW5pKGoyICsgbmMsIG4pIC0gajI7CisgICAgICAgICAgcGFja19yaHMoYmxvY2tCLCByaHMuZ2V0U3ViTWFwcGVyKGsyLCBqMiksIGFjdHVhbF9rYywgYWN0dWFsX25jLCAwLCAwKTsKKworICAgICAgICAgIC8vIGNhbGwgZ2VicCAobWF0cml4IGtlcm5lbCkKKyAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVycyBoZXJlIGFyZSBjb3BpZWQgZnJvbSBFaWdlbidzIEdFTU0gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICBnZWJwKG91dHB1dC5nZXRTdWJNYXBwZXIoaTIsIGoyKSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBhY3R1YWxfbmMsIFNjYWxhcigxKSwgLTEsIC0xLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRoaXMtPm1fZGV2aWNlLmRlYWxsb2NhdGUoYmxvY2tBKTsKKyAgICB0aGlzLT5tX2RldmljZS5kZWFsbG9jYXRlKGJsb2NrQik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2xlZnRJbXBsLmNsZWFudXAoKTsKKyAgICBtX3JpZ2h0SW1wbC5jbGVhbnVwKCk7CisKKyAgICBpZiAobV9yZXN1bHQgIT0gTlVMTCkgeworICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShtX3Jlc3VsdCk7CisgICAgICBtX3Jlc3VsdCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9yZXN1bHRbaW5kZXhdOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QgY29zdFBlckNvZWZmKGJvb2wpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVuc29yT3BDb3N0KHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCAwKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFJldHVyblR5cGUsIExvYWRNb2RlPihtX3Jlc3VsdCArIGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9yZXN1bHQ7IH0KKworICBwcm90ZWN0ZWQ6CisgIC8vIFByZXZlbnQgYXNzaWdubWVudAorICBUZW5zb3JDb250cmFjdGlvbkV2YWx1YXRvckJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IFRlbnNvckNvbnRyYWN0aW9uRXZhbHVhdG9yQmFzZSYpOworICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKworICBjb250cmFjdF90IG1fa19zdHJpZGVzOworICBjb250cmFjdF90IG1fbGVmdF9jb250cmFjdGluZ19zdHJpZGVzOworICBjb250cmFjdF90IG1fcmlnaHRfY29udHJhY3Rpbmdfc3RyaWRlczsKKworICBib29sIG1fbGhzX2lubmVyX2RpbV9jb250aWd1b3VzOworICBib29sIG1fcmhzX2lubmVyX2RpbV9jb250aWd1b3VzOworICBib29sIG1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQ7CisKKyAgbGVmdF9ub2NvbnRyYWN0X3QgbV9pX3N0cmlkZXM7CisgIHJpZ2h0X25vY29udHJhY3RfdCBtX2pfc3RyaWRlczsKKyAgbGVmdF9ub2NvbnRyYWN0X3QgbV9sZWZ0X25vY29udHJhY3Rfc3RyaWRlczsKKyAgcmlnaHRfbm9jb250cmFjdF90IG1fcmlnaHRfbm9jb250cmFjdF9zdHJpZGVzOworCisgIEluZGV4IG1faV9zaXplOworICBJbmRleCBtX2pfc2l6ZTsKKyAgSW5kZXggbV9rX3NpemU7CisKKyAgVGVuc29yRXZhbHVhdG9yPEV2YWxMZWZ0QXJnVHlwZSwgRGV2aWNlPiBtX2xlZnRJbXBsOworICBUZW5zb3JFdmFsdWF0b3I8RXZhbFJpZ2h0QXJnVHlwZSwgRGV2aWNlPiBtX3JpZ2h0SW1wbDsKKyAgY29uc3QgRGV2aWNlJiBtX2RldmljZTsKKyAgU2NhbGFyKiBtX3Jlc3VsdDsKK307CisKKworLy8gZXZhbHVhdG9yIGZvciBkZWZhdWx0IGRldmljZQordGVtcGxhdGU8dHlwZW5hbWUgSW5kaWNlcywgdHlwZW5hbWUgTGVmdEFyZ1R5cGUsIHR5cGVuYW1lIFJpZ2h0QXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDb250cmFjdGlvbk9wPEluZGljZXMsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+LCBEZXZpY2U+IDoKKyAgICBwdWJsaWMgVGVuc29yQ29udHJhY3Rpb25FdmFsdWF0b3JCYXNlPAorICAgICAgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNvbnRyYWN0aW9uT3A8SW5kaWNlcywgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4sIERldmljZT4gPiB7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckNvbnRyYWN0aW9uT3A8SW5kaWNlcywgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4sIERldmljZT4gU2VsZjsKKyAgdHlwZWRlZiBUZW5zb3JDb250cmFjdGlvbkV2YWx1YXRvckJhc2U8U2VsZj4gQmFzZTsKKworICB0eXBlZGVmIFRlbnNvckNvbnRyYWN0aW9uT3A8SW5kaWNlcywgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcj46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKworICBlbnVtIHsKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OkxheW91dAorICB9OworCisgIC8vIE1vc3Qgb2YgdGhlIGNvZGUgaXMgYXNzdW1pbmcgdGhhdCBib3RoIGlucHV0IHRlbnNvcnMgYXJlIENvbE1ham9yLiBJZiB0aGUKKyAgLy8gaW5wdXRzIGFyZSBSb3dNYWpvciwgd2Ugd2lsbCAiY2hlYXQiIGJ5IHN3YXBwaW5nIHRoZSBMSFMgYW5kIFJIUzoKKyAgLy8gSWYgd2Ugd2FudCB0byBjb21wdXRlIEEgKiBCID0gQywgd2hlcmUgQSBpcyBMSFMgYW5kIEIgaXMgUkhTLCB0aGUgY29kZQorICAvLyB3aWxsIHByZXRlbmQgQiBpcyBMSFMgYW5kIEEgaXMgUkhTLgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvciksIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+Ojp0eXBlIEV2YWxMZWZ0QXJnVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpLCBSaWdodEFyZ1R5cGUsIExlZnRBcmdUeXBlPjo6dHlwZSBFdmFsUmlnaHRBcmdUeXBlOworCisgIHN0YXRpYyBjb25zdCBpbnQgTERpbXMgPQorICAgICAgaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV2YWxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IFJEaW1zID0KKyAgICAgIGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxFdmFsUmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgQ29udHJhY3REaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8SW5kaWNlcz46OnZhbHVlOworCisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIENvbnRyYWN0RGltcz4gY29udHJhY3RfdDsKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgTERpbXMgLSBDb250cmFjdERpbXM+IGxlZnRfbm9jb250cmFjdF90OworICB0eXBlZGVmIGFycmF5PEluZGV4LCBSRGltcyAtIENvbnRyYWN0RGltcz4gcmlnaHRfbm9jb250cmFjdF90OworCisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IExEaW1zICsgUkRpbXMgLSAyICogQ29udHJhY3REaW1zOworCisgIC8vIENvdWxkIHdlIHVzZSBOdW1EaW1lbnNpb25zIGhlcmU/CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpIDoKKyAgICAgIEJhc2Uob3AsIGRldmljZSkgeyB9CisKKyAgdGVtcGxhdGUgPGJvb2wgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBib29sIHJoc19pbm5lcl9kaW1fY29udGlndW91cywgYm9vbCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgaW50IEFsaWdubWVudD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBldmFsUHJvZHVjdChTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIGlmICh0aGlzLT5tX2pfc2l6ZSA9PSAxKSB7CisgICAgICB0aGlzLT50ZW1wbGF0ZSBldmFsR2VtdjxsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIHJoc19pbm5lcl9kaW1fY29udGlndW91cywgcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQsIEFsaWdubWVudD4oYnVmZmVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLT50ZW1wbGF0ZSBldmFsR2VtbTxsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIHJoc19pbm5lcl9kaW1fY29udGlndW91cywgcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQsIEFsaWdubWVudD4oYnVmZmVyKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25CbG9ja2luZy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvbkJsb2NraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmN2I0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25CbG9ja2luZy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05UUkFDVElPTl9CTE9DS0lOR19ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVFJBQ1RJT05fQkxPQ0tJTkdfSAorCisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitlbnVtIHsKKyAgU2hhcmRCeVJvdyA9IDAsCisgIFNoYXJkQnlDb2wgPSAxCit9OworCisKKy8vIERlZmF1bHQgQmxvY2tpbmcgU3RyYXRlZ3kKK3RlbXBsYXRlIDx0eXBlbmFtZSBMaHNNYXBwZXIsIHR5cGVuYW1lIFJoc01hcHBlciwgdHlwZW5hbWUgSW5kZXgsIGludCBTaGFyZGluZ1R5cGU9U2hhcmRCeUNvbD4KK2NsYXNzIFRlbnNvckNvbnRyYWN0aW9uQmxvY2tpbmcgeworIHB1YmxpYzoKKworICB0eXBlZGVmIHR5cGVuYW1lIExoc01hcHBlcjo6U2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHNNYXBwZXI6OlNjYWxhciBSaHNTY2FsYXI7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29yQ29udHJhY3Rpb25CbG9ja2luZyhJbmRleCBrLCBJbmRleCBtLCBJbmRleCBuLCBJbmRleCBudW1fdGhyZWFkcyA9IDEpIDoKKyAgICAgIGtjXyhrKSwgbWNfKG0pLCBuY18obikKKyAgeworICAgIGlmIChTaGFyZGluZ1R5cGUgPT0gU2hhcmRCeUNvbCkgeworICAgICAgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPExoc1NjYWxhciwgUmhzU2NhbGFyLCAxPihrY18sIG1jXywgbmNfLCBudW1fdGhyZWFkcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPExoc1NjYWxhciwgUmhzU2NhbGFyLCAxPihrY18sIG5jXywgbWNfLCBudW1fdGhyZWFkcyk7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBJbmRleCBrYygpIGNvbnN0IHsgcmV0dXJuIGtjXzsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIEluZGV4IG1jKCkgY29uc3QgeyByZXR1cm4gbWNfOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgSW5kZXggbmMoKSBjb25zdCB7IHJldHVybiBuY187IH0KKworIHByaXZhdGU6CisgIEluZGV4IGtjXzsKKyAgSW5kZXggbWNfOworICBJbmRleCBuY187Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX0JMT0NLSU5HX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25DdWRhLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uQ3VkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWRiYjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uQ3VkYS5oCkBAIC0wLDAgKzEsMTM5MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgTmF2ZGVlcCBKYWl0bHkgPG5kamFpdGx5QGdvb2dsZS5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgRXJpYyBNYXJ0aW4gPGVyaWNAZXJpY21hcnQuaW4+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVFJBQ1RJT05fQ1VEQV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVFJBQ1RJT05fQ1VEQV9ICisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9HUFUpICYmIGRlZmluZWQoX19DVURBQ0NfXykKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgTGhzTWFwcGVyLAorICAgICAgICAgdHlwZW5hbWUgUmhzTWFwcGVyLCB0eXBlbmFtZSBPdXRwdXRNYXBwZXIsIGJvb2wgbmVlZHNfZWRnZV9jaGVjaz4KK19fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitFaWdlbkNvbnRyYWN0aW9uS2VybmVsSW50ZXJuYWwoY29uc3QgTGhzTWFwcGVyIGxocywgY29uc3QgUmhzTWFwcGVyIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRNYXBwZXIgb3V0cHV0LCBTY2FsYXIqIGxoc19zaG1lbSwgU2NhbGFyKiByaHNfc2htZW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1fc2l6ZSwgY29uc3QgSW5kZXggbl9zaXplLCBjb25zdCBJbmRleCBrX3NpemUpIHsKKworICBjb25zdCBJbmRleCBtX2Jsb2NrX2lkeCA9IGJsb2NrSWR4Lng7CisgIGNvbnN0IEluZGV4IG5fYmxvY2tfaWR4ID0gYmxvY2tJZHgueTsKKworICBjb25zdCBJbmRleCBiYXNlX20gPSA2NCAqIG1fYmxvY2tfaWR4OworICBjb25zdCBJbmRleCBiYXNlX24gPSA2NCAqIG5fYmxvY2tfaWR4OworCisgIC8vIGRlY2xhcmUgYW5kIGluaXRpYWxpemUgNjQgcmVnaXN0ZXJzIGZvciBvdXRwdXQgOHg4IGJsb2NrCisKKyAgLy8gcHJlZmV0Y2ggcmVnaXN0ZXJzCisgIFNjYWxhciBsaHNfcGYwOworICBTY2FsYXIgbGhzX3BmMTsKKyAgU2NhbGFyIGxoc19wZjI7CisgIFNjYWxhciBsaHNfcGYzOworICBTY2FsYXIgbGhzX3BmNDsKKyAgU2NhbGFyIGxoc19wZjU7CisgIFNjYWxhciBsaHNfcGY2OworICBTY2FsYXIgbGhzX3BmNzsKKworICBTY2FsYXIgcmhzX3BmMDsKKyAgU2NhbGFyIHJoc19wZjE7CisgIFNjYWxhciByaHNfcGYyOworICBTY2FsYXIgcmhzX3BmMzsKKyAgU2NhbGFyIHJoc19wZjQ7CisgIFNjYWxhciByaHNfcGY1OworICBTY2FsYXIgcmhzX3BmNjsKKyAgU2NhbGFyIHJoc19wZjc7CisKKyAgLy8gc2hhcmVkIG1lbW9yeSBpcyBmb3JtYXR0ZWQKKyAgLy8gKGNvbnRyYWN0IGlkeCBpbiBibG9jaywgbm9jb250cmFjdCBpZHggaW4gYmxvY2ssIGJsb2NrIGlkeCkKKyAgLy8gd2hlcmUgYmxvY2sgaWR4IGlzIGNvbHVtbiBtYWpvci4gVGhpcyB0cmFuc3Bvc2l0aW9uIGxpbWl0cyB0aGUgbnVtYmVyIG9mCisgIC8vIGJhbmsgY29uZmxpY3RzIHdoZW4gcmVhZGluZyB0aGUgTEhTLiBUaGUgY29yZSBpZGVhIGlzIHRoYXQgc2luY2UgdGhlIGNvbnRyYWN0aW5nCisgIC8vIGluZGV4IGlzIHNoYXJlZCBieSBib3RoIHNpZGVzLCB0aGVuIHRoZSBjb250cmFjdGluZyBpbmRleCBzaG91bGQgYmUgaW4gdGhyZWFkSWR4LnguCisKKyAgLy8gT24gdGhlIExIUywgd2UgcGFkIGVhY2ggcm93IGluc2lkZSBvZiBlYWNoIGJsb2NrIHdpdGggYW4gZXh0cmEgZWxlbWVudC4gVGhpcyBtYWtlcworICAvLyBlYWNoIGJsb2NrIDggcm93cyBvZiA5IGVsZW1lbnRzLCB3aGljaCBpcyA3MiBlbGVtZW50cy4gVGhpcyBnaXZlcyBubyBiYW5rIGNvbmZsaWN0cworICAvLyBvbiB3cml0ZXMgYW5kIHZlcnkgZmV3IDItd2F5IGNvbmZsaWN0cyBvbiByZWFkcy4gVGhlcmUgaXMgYW4gOHg4IGdyaWQgb2YgdGhlc2UgYmxvY2tzLgorCisgIC8vIE9uIHRoZSBSSFMgd2UganVzdCBhZGQgOCBwYWRkaW5nIGVsZW1lbnRzIHRvIHRoZSBlbmQgb2YgZWFjaCBibG9jay4gVGhpcyBnaXZlcyBubyBiYW5rCisgIC8vIGNvbmZsaWN0cyBvbiB3cml0ZXMgYW5kIGFsc28gbm9uZSBvbiByZWFkcy4KKworICAvLyBzdG9yYWdlIGluZGljZXMKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF9iYXNlID0gdGhyZWFkSWR4LnkgKiA3MiArIHRocmVhZElkeC54ICogOSArIHRocmVhZElkeC56OworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4X2Jhc2UgPSB0aHJlYWRJZHgueSAqIDcyICsgdGhyZWFkSWR4LnogKiA4ICsgdGhyZWFkSWR4Lng7CisKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF8wID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogMDsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF8xID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogMTsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF8yID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogMjsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF8zID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogMzsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF80ID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogNDsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF81ID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogNTsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF82ID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogNjsKKyAgY29uc3QgSW5kZXggbGhzX3N0b3JlX2lkeF83ID0gbGhzX3N0b3JlX2lkeF9iYXNlICsgNTc2ICogNzsKKworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzAgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiAwOworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzEgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiAxOworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzIgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiAyOworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzMgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiAzOworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzQgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiA0OworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzUgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiA1OworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzYgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiA2OworICBjb25zdCBJbmRleCByaHNfc3RvcmVfaWR4XzcgPSByaHNfc3RvcmVfaWR4X2Jhc2UgKyA1NzYgKiA3OworCisgIC8vIGluIHRoZSBsb2FkaW5nIGNvZGUsIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBpbXBvcnRhbnQ6CisgIC8vIHRocmVhZElkeC54OiB0aGUgdmVydGljYWwgcG9zaXRpb24gaW4gYW4gOHg4IGJsb2NrCisgIC8vIHRocmVhZElkeC55OiB0aGUgdmVydGljYWwgaW5kZXggb2YgdGhlIDh4OCBibG9jayBpbiB0aGUgZ3JpZAorICAvLyB0aHJlYWRJZHguejogdGhlIGhvcml6b250YWwgcG9zaXRpb24gaW4gYW4gOHg4IGJsb2NrCisgIC8vIGs6IHRoZSBob3Jpem9udGFsIGluZGV4IG9mIHRoZSA4eDggYmxvY2sgaW4gdGhlIGdyaWQKKyAgLy8KKyAgLy8gVGhlIGsgcGFyYW1ldGVyIGlzIGltcGxpY2l0IChpdCB3YXMgdGhlIGxvb3AgY291bnRlciBmb3IgYSBsb29wIHRoYXQgd2VudAorICAvLyBmcm9tIDAgdG8gPDgsIGJ1dCBub3cgdGhhdCBsb29wIGlzIHVucm9sbGVkIGluIHRoZSBiZWxvdyBjb2RlLgorCisgIGNvbnN0IEluZGV4IGxvYWRfaWR4X3ZlcnQgPSB0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHgueTsKKyAgY29uc3QgSW5kZXggbGhzX3ZlcnQgPSBiYXNlX20gKyBsb2FkX2lkeF92ZXJ0OworCisjZGVmaW5lIHByZWZldGNoSW50b1JlZ2lzdGVycyhiYXNlX2spICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaHNfcGYwID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGhzX3BmMSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxoc19wZjIgPSBjb252KDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaHNfcGYzID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGhzX3BmNCA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxoc19wZjUgPSBjb252KDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaHNfcGY2ID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGhzX3BmNyA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByaHNfcGYwID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmhzX3BmMSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJoc19wZjIgPSBjb252KDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByaHNfcGYzID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmhzX3BmNCA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJoc19wZjUgPSBjb252KDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByaHNfcGY2ID0gY29udigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmhzX3BmNyA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIW5lZWRzX2VkZ2VfY2hlY2sgfHwgbGhzX3ZlcnQgPCBtX3NpemUpIHsgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBJbmRleCBsaHNfaG9yaXpfMCA9IGJhc2VfayArIHRocmVhZElkeC56ICsgMCAqIDg7ICAgXAorICAgICAgY29uc3QgSW5kZXggbGhzX2hvcml6XzEgPSBiYXNlX2sgKyB0aHJlYWRJZHgueiArIDEgKiA4OyAgIFwKKyAgICAgIGNvbnN0IEluZGV4IGxoc19ob3Jpel8yID0gYmFzZV9rICsgdGhyZWFkSWR4LnogKyAyICogODsgICBcCisgICAgICBjb25zdCBJbmRleCBsaHNfaG9yaXpfMyA9IGJhc2VfayArIHRocmVhZElkeC56ICsgMyAqIDg7ICAgXAorICAgICAgY29uc3QgSW5kZXggbGhzX2hvcml6XzQgPSBiYXNlX2sgKyB0aHJlYWRJZHgueiArIDQgKiA4OyAgIFwKKyAgICAgIGNvbnN0IEluZGV4IGxoc19ob3Jpel81ID0gYmFzZV9rICsgdGhyZWFkSWR4LnogKyA1ICogODsgICBcCisgICAgICBjb25zdCBJbmRleCBsaHNfaG9yaXpfNiA9IGJhc2VfayArIHRocmVhZElkeC56ICsgNiAqIDg7ICAgXAorICAgICAgY29uc3QgSW5kZXggbGhzX2hvcml6XzcgPSBiYXNlX2sgKyB0aHJlYWRJZHgueiArIDcgKiA4OyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIW5lZWRzX2VkZ2VfY2hlY2sgfHwgbGhzX2hvcml6XzcgPCBrX3NpemUpIHsgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjIgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYzID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmNCA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjUgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel81KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGY2ID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfNik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmNyA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzcpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKGxoc19ob3Jpel82IDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjIgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYzID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmNCA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjUgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel81KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGY2ID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfNik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gZWxzZSBpZiAobGhzX2hvcml6XzUgPCBrX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjAgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYxID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMiA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjMgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8zKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGY0ID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfNCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmNSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzUpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKGxoc19ob3Jpel80IDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjIgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYzID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmNCA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKGxoc19ob3Jpel8zIDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjIgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYzID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gZWxzZSBpZiAobGhzX2hvcml6XzIgPCBrX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxoc19wZjAgPSBsaHMobGhzX3ZlcnQsIGxoc19ob3Jpel8wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYxID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMiA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKGxoc19ob3Jpel8xIDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGhzX3BmMSA9IGxocyhsaHNfdmVydCwgbGhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKGxoc19ob3Jpel8wIDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaHNfcGYwID0gbGhzKGxoc192ZXJ0LCBsaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBJbmRleCByaHNfdmVydCA9IGJhc2VfayArIGxvYWRfaWR4X3ZlcnQ7ICAgICAgICAgICAgICBcCisgICAgaWYgKCFuZWVkc19lZGdlX2NoZWNrIHx8IHJoc192ZXJ0IDwga19zaXplKSB7ICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgSW5kZXggcmhzX2hvcml6XzAgPSBiYXNlX24gKyB0aHJlYWRJZHgueiArIDAgKiA4OyAgIFwKKyAgICAgIGNvbnN0IEluZGV4IHJoc19ob3Jpel8xID0gYmFzZV9uICsgdGhyZWFkSWR4LnogKyAxICogODsgICBcCisgICAgICBjb25zdCBJbmRleCByaHNfaG9yaXpfMiA9IGJhc2VfbiArIHRocmVhZElkeC56ICsgMiAqIDg7ICAgXAorICAgICAgY29uc3QgSW5kZXggcmhzX2hvcml6XzMgPSBiYXNlX24gKyB0aHJlYWRJZHgueiArIDMgKiA4OyAgIFwKKyAgICAgIGNvbnN0IEluZGV4IHJoc19ob3Jpel80ID0gYmFzZV9uICsgdGhyZWFkSWR4LnogKyA0ICogODsgICBcCisgICAgICBjb25zdCBJbmRleCByaHNfaG9yaXpfNSA9IGJhc2VfbiArIHRocmVhZElkeC56ICsgNSAqIDg7ICAgXAorICAgICAgY29uc3QgSW5kZXggcmhzX2hvcml6XzYgPSBiYXNlX24gKyB0aHJlYWRJZHgueiArIDYgKiA4OyAgIFwKKyAgICAgIGNvbnN0IEluZGV4IHJoc19ob3Jpel83ID0gYmFzZV9uICsgdGhyZWFkSWR4LnogKyA3ICogODsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHJoc19ob3Jpel83IDwgbl9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjEgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8xKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYyID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMyA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjQgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel80KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGY1ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfNSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmNiA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzYpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjcgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel83KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIGlmIChyaHNfaG9yaXpfNiA8IG5fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjEgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8xKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYyID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMyA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjQgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel80KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGY1ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfNSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmNiA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzYpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKHJoc19ob3Jpel81IDwgbl9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYwID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMSA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjIgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYzID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmNCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjUgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel81KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIGlmIChyaHNfaG9yaXpfNCA8IG5fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjEgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8xKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYyID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMyA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjQgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel80KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIGlmIChyaHNfaG9yaXpfMyA8IG5fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjEgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8xKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYyID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMyA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgaWYgKHJoc19ob3Jpel8yIDwgbl9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByaHNfcGYwID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXpfMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMSA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjIgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8yKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIGlmIChyaHNfaG9yaXpfMSA8IG5fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJoc19wZjEgPSByaHMocmhzX3ZlcnQsIHJoc19ob3Jpel8xKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIGlmIChyaHNfaG9yaXpfMCA8IG5fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmhzX3BmMCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6XzApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgd3JpdGVSZWdUb1NobWVtKF8pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfMF0gPSBsaHNfcGYwOyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfMF0gPSByaHNfcGYwOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfMV0gPSBsaHNfcGYxOyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfMV0gPSByaHNfcGYxOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfMl0gPSBsaHNfcGYyOyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfMl0gPSByaHNfcGYyOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfM10gPSBsaHNfcGYzOyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfM10gPSByaHNfcGYzOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfNF0gPSBsaHNfcGY0OyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfNF0gPSByaHNfcGY0OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfNV0gPSBsaHNfcGY1OyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfNV0gPSByaHNfcGY1OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfNl0gPSBsaHNfcGY2OyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfNl0gPSByaHNfcGY2OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbGhzX3NobWVtW2xoc19zdG9yZV9pZHhfN10gPSBsaHNfcGY3OyAgICAgICAgIFwKKyAgcmhzX3NobWVtW3Joc19zdG9yZV9pZHhfN10gPSByaHNfcGY3OyAgICAgICAgIFwKKworICAvLyBkZWNsYXJlIGFuZCBpbml0aWFsaXplIHJlc3VsdCBhcnJheQorI2RlZmluZSByZXMoaSwgaikgX3Jlc18jI2kjI2oKKyNkZWZpbmUgaW5pdFJlc3VsdFJvdyhpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCAwKSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCAxKSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCAyKSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCAzKSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCA0KSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCA1KSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCA2KSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgU2NhbGFyIHJlcyhpLCA3KSA9IGNvbnYoMCk7ICAgICAgICAgICAgICAgICAgIFwKKworICBpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8aW50LCBTY2FsYXI+IGNvbnY7CisgIGluaXRSZXN1bHRSb3coMCk7CisgIGluaXRSZXN1bHRSb3coMSk7CisgIGluaXRSZXN1bHRSb3coMik7CisgIGluaXRSZXN1bHRSb3coMyk7CisgIGluaXRSZXN1bHRSb3coNCk7CisgIGluaXRSZXN1bHRSb3coNSk7CisgIGluaXRSZXN1bHRSb3coNik7CisgIGluaXRSZXN1bHRSb3coNyk7CisjdW5kZWYgaW5pdFJlc3VsdFJvdworCisgIGZvciAoSW5kZXggYmFzZV9rID0gMDsgYmFzZV9rIDwga19zaXplOyBiYXNlX2sgKz0gNjQpIHsKKyAgICAvLyB3YWl0IGZvciBwcmV2aW91cyBpdGVyYXRpb24gdG8gZmluaXNoIHdpdGggc2htZW0uIERlc3BpdGUgY29tbW9uIHNlbnNlLAorICAgIC8vIHRoZSBjb2RlIGlzIGEgYml0IGZhc3RlciB3aXRoIHRoaXMgaGVyZSB0aGVuIGF0IGJvdHRvbSBvZiBsb29wCisgICAgX19zeW5jdGhyZWFkcygpOworCisgICAgcHJlZmV0Y2hJbnRvUmVnaXN0ZXJzKGJhc2Vfayk7CisgICAgd3JpdGVSZWdUb1NobWVtKCk7CisKKyAgICAjdW5kZWYgcHJlZmV0Y2hJbnRvUmVnaXN0ZXJzCisgICAgI3VuZGVmIHdyaXRlUmVnVG9TaG1lbQorCisgICAgLy8gd2FpdCBmb3Igc2hhcmVkIG1lbSBwYWNraW5nIHRvIGJlIGRvbmUgYmVmb3JlIHN0YXJ0aW5nIGNvbXB1dGF0aW9uCisgICAgX19zeW5jdGhyZWFkcygpOworCisgICAgLy8gY29tcHV0ZSA4eDggbWF0cml4IHByb2R1Y3QgYnkgb3V0ZXIgcHJvZHVjdC4gVGhpcyBpbnZvbHZlcyBwYWNraW5nIG9uZSBjb2x1bW4KKyAgICAvLyBvZiBMSFMgYW5kIG9uZSByb3cgb2YgUkhTIGludG8gcmVnaXN0ZXJzICh0YWtlcyAxNiByZWdpc3RlcnMpLgorCisjZGVmaW5lIGxjb2woaSkgX2xjb2wjI2kKKyAgICBTY2FsYXIgbGNvbCgwKTsKKyAgICBTY2FsYXIgbGNvbCgxKTsKKyAgICBTY2FsYXIgbGNvbCgyKTsKKyAgICBTY2FsYXIgbGNvbCgzKTsKKyAgICBTY2FsYXIgbGNvbCg0KTsKKyAgICBTY2FsYXIgbGNvbCg1KTsKKyAgICBTY2FsYXIgbGNvbCg2KTsKKyAgICBTY2FsYXIgbGNvbCg3KTsKKworI2RlZmluZSBycm93KGopIF9ycm93IyNqCisgICAgU2NhbGFyIHJyb3coMCk7CisgICAgU2NhbGFyIHJyb3coMSk7CisgICAgU2NhbGFyIHJyb3coMik7CisgICAgU2NhbGFyIHJyb3coMyk7CisgICAgU2NhbGFyIHJyb3coNCk7CisgICAgU2NhbGFyIHJyb3coNSk7CisgICAgU2NhbGFyIHJyb3coNik7CisgICAgU2NhbGFyIHJyb3coNyk7CisKKyAgICAvLyBOb3cgeCBjb3JyZXNwb25kcyB0byBrLCB5IHRvIG0sIGFuZCB6IHRvIG4KKyAgICBjb25zdCBTY2FsYXIqIGxoc19ibG9jayA9ICZsaHNfc2htZW1bdGhyZWFkSWR4LnggKyA5ICogdGhyZWFkSWR4LnldOworICAgIGNvbnN0IFNjYWxhciogcmhzX2Jsb2NrID0gJnJoc19zaG1lbVt0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHguel07CisKKyNkZWZpbmUgbGhzX2VsZW1lbnQoaSwgaikgbGhzX2Jsb2NrWzcyICogKChpKSArIDggKiAoaikpXQorI2RlZmluZSByaHNfZWxlbWVudChpLCBqKSByaHNfYmxvY2tbNzIgKiAoKGkpICsgOCAqIChqKSldCisKKyNkZWZpbmUgbG9hZERhdGEoaSwgaikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsY29sKDApID0gbGhzX2VsZW1lbnQoMCwgaik7ICAgICAgICAgICAgICAgXAorICAgIHJyb3coMCkgPSByaHNfZWxlbWVudChpLCAwKTsgICAgICAgICAgICAgICBcCisgICAgbGNvbCgxKSA9IGxoc19lbGVtZW50KDEsIGopOyAgICAgICAgICAgICAgIFwKKyAgICBycm93KDEpID0gcmhzX2VsZW1lbnQoaSwgMSk7ICAgICAgICAgICAgICAgXAorICAgIGxjb2woMikgPSBsaHNfZWxlbWVudCgyLCBqKTsgICAgICAgICAgICAgICBcCisgICAgcnJvdygyKSA9IHJoc19lbGVtZW50KGksIDIpOyAgICAgICAgICAgICAgIFwKKyAgICBsY29sKDMpID0gbGhzX2VsZW1lbnQoMywgaik7ICAgICAgICAgICAgICAgXAorICAgIHJyb3coMykgPSByaHNfZWxlbWVudChpLCAzKTsgICAgICAgICAgICAgICBcCisgICAgbGNvbCg0KSA9IGxoc19lbGVtZW50KDQsIGopOyAgICAgICAgICAgICAgIFwKKyAgICBycm93KDQpID0gcmhzX2VsZW1lbnQoaSwgNCk7ICAgICAgICAgICAgICAgXAorICAgIGxjb2woNSkgPSBsaHNfZWxlbWVudCg1LCBqKTsgICAgICAgICAgICAgICBcCisgICAgcnJvdyg1KSA9IHJoc19lbGVtZW50KGksIDUpOyAgICAgICAgICAgICAgIFwKKyAgICBsY29sKDYpID0gbGhzX2VsZW1lbnQoNiwgaik7ICAgICAgICAgICAgICAgXAorICAgIHJyb3coNikgPSByaHNfZWxlbWVudChpLCA2KTsgICAgICAgICAgICAgICBcCisgICAgbGNvbCg3KSA9IGxoc19lbGVtZW50KDcsIGopOyAgICAgICAgICAgICAgIFwKKyAgICBycm93KDcpID0gcmhzX2VsZW1lbnQoaSwgNyk7ICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIGNvbXB1dGVDb2woaikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzKDAsIGopICs9IGxjb2woMCkgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDEsIGopICs9IGxjb2woMSkgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDIsIGopICs9IGxjb2woMikgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDMsIGopICs9IGxjb2woMykgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDQsIGopICs9IGxjb2woNCkgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDUsIGopICs9IGxjb2woNSkgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDYsIGopICs9IGxjb2woNikgKiBycm93KGopOyAgICAgICAgICAgICBcCisgICAgcmVzKDcsIGopICs9IGxjb2woNykgKiBycm93KGopOyAgICAgICAgICAgICBcCisKKyNkZWZpbmUgY29tcHV0ZVBhc3MoaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkRGF0YShpLCBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb21wdXRlQ29sKDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworICAgIGNvbXB1dGVQYXNzKDApOworICAgIGNvbXB1dGVQYXNzKDEpOworICAgIGNvbXB1dGVQYXNzKDIpOworICAgIGNvbXB1dGVQYXNzKDMpOworICAgIGNvbXB1dGVQYXNzKDQpOworICAgIGNvbXB1dGVQYXNzKDUpOworICAgIGNvbXB1dGVQYXNzKDYpOworICAgIGNvbXB1dGVQYXNzKDcpOworCisjdW5kZWYgbGNvbAorI3VuZGVmIHJyb3cKKyN1bmRlZiBsaHNfZWxlbWVudAorI3VuZGVmIHJoc19lbGVtZW50CisjdW5kZWYgbG9hZERhdGEKKyN1bmRlZiBjb21wdXRlQ29sCisjdW5kZWYgY29tcHV0ZVBhc3MKKyAgfSAvLyBlbmQgbG9vcCBvdmVyIGsKKworICAvLyB3ZSd2ZSBub3cgaXRlcmF0ZWQgb3ZlciBhbGwgb2YgdGhlIGxhcmdlIChpZSB3aWR0aCA2NCkgayBibG9ja3MgYW5kCisgIC8vIGFjY3VtdWxhdGVkIHJlc3VsdHMgaW4gcmVnaXN0ZXJzLiBBdCB0aGlzIHBvaW50IHRocmVhZCAoeCwgeSwgeikgY29udGFpbnMKKyAgLy8gdGhlIHN1bSBhY3Jvc3MgYWxsIGJpZyBrIGJsb2NrcyBvZiB0aGUgcHJvZHVjdCBvZiBsaXR0bGUgayBibG9jayBvZiBpbmRleCAoeCwgeSkKKyAgLy8gd2l0aCBibG9jayBvZiBpbmRleCAoeSwgeikuIFRvIGNvbXB1dGUgdGhlIGZpbmFsIG91dHB1dCwgd2UgbmVlZCB0byByZWR1Y2UKKyAgLy8gdGhlIDggdGhyZWFkcyBvdmVyIHkgYnkgc3VtbWF0aW9uLgorI2RlZmluZSBzaHVmZmxlSW5jKGksIGosIG1hc2spIHJlcyhpLCBqKSArPSBfX3NoZmxfeG9yKHJlcyhpLCBqKSwgbWFzaykKKworI2RlZmluZSByZWR1Y2VSb3coaSwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDAsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDEsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDIsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDMsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDQsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDUsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDYsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBzaHVmZmxlSW5jKGksIDcsIG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIHJlZHVjZU1hdHJpeChtYXNrKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdygwLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdygxLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdygyLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdygzLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdyg0LCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdyg1LCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdyg2LCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZHVjZVJvdyg3LCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyAgLy8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgcmVkdWN0aW9uLCBub3cgZWFjaCB0aHJlYWQgb2YgaW5kZXggKF8sIHksIHopCisgIC8vIGNvbnRhaW5zIHRoZSBjb3JyZWN0IHZhbHVlcyBpbiBpdHMgcmVnaXN0ZXJzIHRoYXQgYmVsb25nIGluIHRoZSBvdXRwdXQKKyAgLy8gYmxvY2sKKyAgcmVkdWNlTWF0cml4KDEpOworICByZWR1Y2VNYXRyaXgoMik7CisgIHJlZHVjZU1hdHJpeCg0KTsKKworI3VuZGVmIHNodWZmbGVJbmMKKyN1bmRlZiByZWR1Y2VSb3cKKyN1bmRlZiByZWR1Y2VNYXRyaXgKKworICAvLyBub3cgd2UgbmVlZCB0byBjb3B5IHRoZSA2NCB2YWx1ZXMgaW50byBtYWluIG1lbW9yeS4gV2UgY2FuJ3Qgc3BsaXQgd29yaworICAvLyBhbW9uZyB0aHJlYWRzIGJlY2F1c2UgYWxsIHZhcmlhYmxlcyBhcmUgaW4gcmVnaXN0ZXJzLiBUaGVyZSdzIDIgd2F5cworICAvLyB0byBkbyB0aGlzOgorICAvLyAoMSkgaGF2ZSAxIHRocmVhZCBkbyA2NCB3cml0ZXMgZnJvbSByZWdpc3RlcnMgaW50byBnbG9iYWwgbWVtb3J5CisgIC8vICgyKSBoYXZlIDEgdGhyZWFkIGRvIDY0IHdyaXRlcyBpbnRvIHNoYXJlZCBtZW1vcnksIGFuZCB0aGVuIDggdGhyZWFkcworICAvLyAgICAgZWFjaCBkbyA4IHdyaXRlcyBpbnRvIGdsb2JhbCBtZW1vcnkuIFdlIGNhbiBqdXN0IG92ZXJ3cml0ZSB0aGUgc2hhcmVkCisgIC8vICAgICBtZW1vcnkgZnJvbSB0aGUgcHJvYmxlbSB3ZSBqdXN0IHNvbHZlZC4KKyAgLy8gKDIpIGlzIHNsaWdodGx5IGZhc3RlciB0aGFuICgxKSBkdWUgdG8gbGVzcyBicmFuY2hpbmcgYW5kIG1vcmUgSUxQCisKKyAgLy8gVE9ETzogd29uJ3QgeWllbGQgbXVjaCBnYWluLCBidXQgY291bGQganVzdCB1c2UgY3VycmVudGx5IHVudXNlZCBzaGFyZWQgbWVtCisgIC8vICAgICAgIGFuZCB0aGVuIHdlIHdvbid0IGhhdmUgdG8gc3luYworICAvLyB3YWl0IGZvciBzaGFyZWQgbWVtIHRvIGJlIG91dCBvZiB1c2UKKyAgX19zeW5jdGhyZWFkcygpOworCisjZGVmaW5lIHdyaXRlUmVzdWx0U2htZW0oaSwgaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxoc19zaG1lbVtpICsgOCAqIHRocmVhZElkeC55ICsgNjQgKiB0aHJlYWRJZHgueiArIDUxMiAqIGpdID0gcmVzKGksIGopOyBcCisKKyNkZWZpbmUgd3JpdGVSb3coaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCAwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCAxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCAyKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCAzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCA0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCA1KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCA2KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd3JpdGVSZXN1bHRTaG1lbShpLCA3KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKworICBpZiAodGhyZWFkSWR4LnggPT0gMCkgeworICAgIHdyaXRlUm93KDApOworICAgIHdyaXRlUm93KDEpOworICAgIHdyaXRlUm93KDIpOworICAgIHdyaXRlUm93KDMpOworICAgIHdyaXRlUm93KDQpOworICAgIHdyaXRlUm93KDUpOworICAgIHdyaXRlUm93KDYpOworICAgIHdyaXRlUm93KDcpOworICB9CisjdW5kZWYgd3JpdGVSZXN1bHRTaG1lbQorI3VuZGVmIHdyaXRlUm93CisKKyAgY29uc3QgaW50IG1heF9pX3dyaXRlID0gbnVtZXh0OjptaW5pKChpbnQpKChtX3NpemUgLSBiYXNlX20gLSB0aHJlYWRJZHgueSArIDcpIC8gOCksIDgpOworICBjb25zdCBpbnQgbWF4X2pfd3JpdGUgPSBudW1leHQ6Om1pbmkoKGludCkoKG5fc2l6ZSAtIGJhc2VfbiAtIHRocmVhZElkeC56ICsgNykgLyA4KSwgOCk7CisKKyAgaWYgKHRocmVhZElkeC54IDwgbWF4X2lfd3JpdGUpIHsKKyAgICBpZiAobWF4X2pfd3JpdGUgPT0gOCkgeworICAgICAgLy8gVE9ETzogY2FuIGkgdHJhZGUgYmFuayBjb25mbGljdHMgZm9yIGNvYWxlc2NlZCB3cml0ZXM/CisgICAgICBTY2FsYXIgdmFsMCA9IGxoc19zaG1lbVt0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHgueSArIDY0ICogdGhyZWFkSWR4LnogKyA1MTIgKiAwXTsKKyAgICAgIFNjYWxhciB2YWwxID0gbGhzX3NobWVtW3RocmVhZElkeC54ICsgOCAqIHRocmVhZElkeC55ICsgNjQgKiB0aHJlYWRJZHgueiArIDUxMiAqIDFdOworICAgICAgU2NhbGFyIHZhbDIgPSBsaHNfc2htZW1bdGhyZWFkSWR4LnggKyA4ICogdGhyZWFkSWR4LnkgKyA2NCAqIHRocmVhZElkeC56ICsgNTEyICogMl07CisgICAgICBTY2FsYXIgdmFsMyA9IGxoc19zaG1lbVt0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHgueSArIDY0ICogdGhyZWFkSWR4LnogKyA1MTIgKiAzXTsKKyAgICAgIFNjYWxhciB2YWw0ID0gbGhzX3NobWVtW3RocmVhZElkeC54ICsgOCAqIHRocmVhZElkeC55ICsgNjQgKiB0aHJlYWRJZHgueiArIDUxMiAqIDRdOworICAgICAgU2NhbGFyIHZhbDUgPSBsaHNfc2htZW1bdGhyZWFkSWR4LnggKyA4ICogdGhyZWFkSWR4LnkgKyA2NCAqIHRocmVhZElkeC56ICsgNTEyICogNV07CisgICAgICBTY2FsYXIgdmFsNiA9IGxoc19zaG1lbVt0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHgueSArIDY0ICogdGhyZWFkSWR4LnogKyA1MTIgKiA2XTsKKyAgICAgIFNjYWxhciB2YWw3ID0gbGhzX3NobWVtW3RocmVhZElkeC54ICsgOCAqIHRocmVhZElkeC55ICsgNjQgKiB0aHJlYWRJZHgueiArIDUxMiAqIDddOworCisgICAgICBvdXRwdXQoYmFzZV9tICsgdGhyZWFkSWR4LnkgKyA4ICogdGhyZWFkSWR4LngsIGJhc2VfbiArIHRocmVhZElkeC56ICsgOCAqIDApID0gdmFsMDsKKyAgICAgIG91dHB1dChiYXNlX20gKyB0aHJlYWRJZHgueSArIDggKiB0aHJlYWRJZHgueCwgYmFzZV9uICsgdGhyZWFkSWR4LnogKyA4ICogMSkgPSB2YWwxOworICAgICAgb3V0cHV0KGJhc2VfbSArIHRocmVhZElkeC55ICsgOCAqIHRocmVhZElkeC54LCBiYXNlX24gKyB0aHJlYWRJZHgueiArIDggKiAyKSA9IHZhbDI7CisgICAgICBvdXRwdXQoYmFzZV9tICsgdGhyZWFkSWR4LnkgKyA4ICogdGhyZWFkSWR4LngsIGJhc2VfbiArIHRocmVhZElkeC56ICsgOCAqIDMpID0gdmFsMzsKKyAgICAgIG91dHB1dChiYXNlX20gKyB0aHJlYWRJZHgueSArIDggKiB0aHJlYWRJZHgueCwgYmFzZV9uICsgdGhyZWFkSWR4LnogKyA4ICogNCkgPSB2YWw0OworICAgICAgb3V0cHV0KGJhc2VfbSArIHRocmVhZElkeC55ICsgOCAqIHRocmVhZElkeC54LCBiYXNlX24gKyB0aHJlYWRJZHgueiArIDggKiA1KSA9IHZhbDU7CisgICAgICBvdXRwdXQoYmFzZV9tICsgdGhyZWFkSWR4LnkgKyA4ICogdGhyZWFkSWR4LngsIGJhc2VfbiArIHRocmVhZElkeC56ICsgOCAqIDYpID0gdmFsNjsKKyAgICAgIG91dHB1dChiYXNlX20gKyB0aHJlYWRJZHgueSArIDggKiB0aHJlYWRJZHgueCwgYmFzZV9uICsgdGhyZWFkSWR4LnogKyA4ICogNykgPSB2YWw3OworICAgIH0gZWxzZSB7CisjcHJhZ21hIHVucm9sbCA3CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1heF9qX3dyaXRlOyBqKyspIHsKKyAgICAgICAgU2NhbGFyIHZhbCA9IGxoc19zaG1lbVt0aHJlYWRJZHgueCArIDggKiB0aHJlYWRJZHgueSArIDY0ICogdGhyZWFkSWR4LnogKyA1MTIgKiBqXTsKKyAgICAgICAgb3V0cHV0KGJhc2VfbSArIHRocmVhZElkeC55ICsgOCAqIHRocmVhZElkeC54LCBiYXNlX24gKyB0aHJlYWRJZHgueiArIDggKiBqKSA9IHZhbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyN1bmRlZiByZXMKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNNYXBwZXIsCisgICAgICAgICB0eXBlbmFtZSBSaHNNYXBwZXIsIHR5cGVuYW1lIE91dHB1dE1hcHBlcj4KK19fZ2xvYmFsX18gdm9pZAorX19sYXVuY2hfYm91bmRzX18oNTEyKQorRWlnZW5Db250cmFjdGlvbktlcm5lbChjb25zdCBMaHNNYXBwZXIgbGhzLCBjb25zdCBSaHNNYXBwZXIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRNYXBwZXIgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtX3NpemUsIGNvbnN0IEluZGV4IG5fc2l6ZSwgY29uc3QgSW5kZXgga19zaXplKSB7CisgIF9fc2hhcmVkX18gU2NhbGFyIGxoc19zaG1lbVs3MiAqIDY0XTsKKyAgX19zaGFyZWRfXyBTY2FsYXIgcmhzX3NobWVtWzcyICogNjRdOworCisgIGNvbnN0IEluZGV4IG1fYmxvY2tfaWR4ID0gYmxvY2tJZHgueDsKKyAgY29uc3QgSW5kZXggbl9ibG9ja19pZHggPSBibG9ja0lkeC55OworCisgIGNvbnN0IEluZGV4IGJhc2VfbSA9IDY0ICogbV9ibG9ja19pZHg7CisgIGNvbnN0IEluZGV4IGJhc2VfbiA9IDY0ICogbl9ibG9ja19pZHg7CisKKyAgaWYgKGJhc2VfbSArIDYzIDwgbV9zaXplICYmIGJhc2VfbiArIDYzIDwgbl9zaXplKSB7CisgICAgRWlnZW5Db250cmFjdGlvbktlcm5lbEludGVybmFsPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXIsIGZhbHNlPihsaHMsIHJocywgb3V0cHV0LCBsaHNfc2htZW0sIHJoc19zaG1lbSwgbV9zaXplLCBuX3NpemUsIGtfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgRWlnZW5Db250cmFjdGlvbktlcm5lbEludGVybmFsPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXIsIHRydWU+KGxocywgcmhzLCBvdXRwdXQsIGxoc19zaG1lbSwgcmhzX3NobWVtLCBtX3NpemUsIG5fc2l6ZSwga19zaXplKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNNYXBwZXIsCisgICAgICAgICB0eXBlbmFtZSBSaHNNYXBwZXIsIHR5cGVuYW1lIE91dHB1dE1hcHBlciwgYm9vbCBDSEVDS19MSFNfQk9VTkRBUlksCisgICAgICAgICBib29sIENIRUNLX1JIU19CT1VOREFSWT4KK19fZGV2aWNlX18gRUlHRU5fU1RST05HX0lOTElORSB2b2lkCitFaWdlbkZsb2F0Q29udHJhY3Rpb25LZXJuZWxJbnRlcm5hbDE2eDE2KGNvbnN0IExoc01hcHBlciBsaHMsIGNvbnN0IFJoc01hcHBlciByaHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dE1hcHBlciBvdXRwdXQsIGZsb2F0MiBsaHNfc2htZW0yW11bMTZdLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDIgcmhzX3NobWVtMltdWzhdLCBjb25zdCBJbmRleCBtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG5fc2l6ZSwgY29uc3QgSW5kZXgga19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBiYXNlX20sIGNvbnN0IEluZGV4IGJhc2VfbikgeworICB0eXBlZGVmIGZsb2F0IFNjYWxhcjsKKworICAvLyBwcmVmZXRjaCByZWdpc3RlcnMKKyAgZmxvYXQ0IGxoc19wZjAsIHJoc19wZjA7CisKKyAgZmxvYXQ0IHJlc3VsdHNbNF07CisgIGZvciAoaW50IGk9MDsgaSA8IDQ7IGkrKykgeworICAgIHJlc3VsdHNbaV0ueCA9IHJlc3VsdHNbaV0ueSA9IHJlc3VsdHNbaV0ueiA9IHJlc3VsdHNbaV0udyA9IDA7CisgIH0KKworCisjZGVmaW5lIHByZWZldGNoX2xocyhyZWcsIHJvdywgY29sKSAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDSEVDS19MSFNfQk9VTkRBUlkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoY29sIDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlZyA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihyb3csIGNvbCk7ICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoY29sIDwga19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChyb3cgKyAzIDwgbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KHJvdywgY29sKTsgICBcCisgICAgICAgIH0gZWxzZSBpZiAocm93ICsgMiA8IG1fc2l6ZSkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnggPWxocyhyb3cgKyAwLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnkgPWxocyhyb3cgKyAxLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnogPWxocyhyb3cgKyAyLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAocm93ICsgMSA8IG1fc2l6ZSkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnggPWxocyhyb3cgKyAwLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnkgPWxocyhyb3cgKyAxLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAocm93ICA8IG1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVnLnggPWxocyhyb3cgKyAwLCBjb2wpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKworICBJbmRleCBsaHNfdmVydCA9IGJhc2VfbSt0aHJlYWRJZHgueCo0OworCisgIGZvciAoSW5kZXggayA9IDA7IGsgPCBrX3NpemU7IGsgKz0gMTYpIHsKKyAgICBsaHNfcGYwID0gaW50ZXJuYWw6OnBzZXQxPGZsb2F0ND4oMCk7CisgICAgcmhzX3BmMCA9IGludGVybmFsOjpwc2V0MTxmbG9hdDQ+KDApOworCisgICAgSW5kZXggbGhzX2hvcml6ID0gdGhyZWFkSWR4LnkrazsKKyAgICBwcmVmZXRjaF9saHMobGhzX3BmMCwgbGhzX3ZlcnQsIGxoc19ob3JpeikKKworICAgIEluZGV4IHJoc192ZXJ0ID0gaysodGhyZWFkSWR4LnglNCkqNDsKKyAgICBJbmRleCByaHNfaG9yaXowID0gKHRocmVhZElkeC54Pj4yKSt0aHJlYWRJZHgueSo0K2Jhc2VfbjsKKworICAgIGlmICghQ0hFQ0tfUkhTX0JPVU5EQVJZKSB7CisgICAgICBpZiAoKHJoc192ZXJ0ICsgMykgPCBrX3NpemUpIHsKKyAgICAgICAgLy8ganVzdCBDSEVDS19SSFNfQk9VTkRBUlkKKyAgICAgICAgcmhzX3BmMCA9IHJocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4ocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgfSBlbHNlIGlmIChyaHNfdmVydCArIDIgPCBrX3NpemUpIHsKKyAgICAgICAgLy8ganVzdCBDSEVDS19SSFNfQk9VTkRBUlkKKyAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgcmhzX3BmMC55ID0gcmhzKHJoc192ZXJ0ICsgMSwgcmhzX2hvcml6MCk7CisgICAgICAgIHJoc19wZjAueiA9IHJocyhyaHNfdmVydCArIDIsIHJoc19ob3JpejApOworICAgICAgfSBlbHNlIGlmIChyaHNfdmVydCArIDEgPCBrX3NpemUpIHsKKyAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgcmhzX3BmMC55ID0gcmhzKHJoc192ZXJ0ICsgMSwgcmhzX2hvcml6MCk7CisgICAgICB9IGVsc2UgaWYgKHJoc192ZXJ0ICA8IGtfc2l6ZSkgeworICAgICAgICByaHNfcGYwLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocmhzX2hvcml6MCA8IG5fc2l6ZSkgeworICAgICAgICBpZiAoKHJoc192ZXJ0ICsgMykgPCBrX3NpemUpIHsKKyAgICAgICAgICByaHNfcGYwID0gcmhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihyaHNfdmVydCwgcmhzX2hvcml6MCk7CisgICAgICAgIH0gZWxzZSBpZiAoKHJoc192ZXJ0ICsgMikgPCBrX3NpemUpIHsKKyAgICAgICAgICByaHNfcGYwLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICAgIHJoc19wZjAueSA9IHJocyhyaHNfdmVydCArIDEsIHJoc19ob3JpejApOworICAgICAgICAgIHJoc19wZjAueiA9IHJocyhyaHNfdmVydCArIDIsIHJoc19ob3JpejApOworICAgICAgICB9IGVsc2UgaWYgKChyaHNfdmVydCArIDEpIDwga19zaXplKSB7CisgICAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgICByaHNfcGYwLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXowKTsKKyAgICAgICAgfSBlbHNlIGlmIChyaHNfdmVydCAgPCBrX3NpemUpIHsKKyAgICAgICAgICByaHNfcGYwLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZsb2F0IHgxLCB4MiA7CisgICAgLy8gdGhlIGZvbGxvd2luZyBjYW4gYmUgYSBiaXR3aXNlIG9wZXJhdGlvbi4uLi4uIHNvbWUgZGF5LgorICAgIGlmKCh0aHJlYWRJZHgueCU4KSA8IDQpIHsKKyAgICAgIHgxID0gcmhzX3BmMC55OworICAgICAgeDIgPSByaHNfcGYwLnc7CisgICAgfSBlbHNlIHsKKyAgICAgIHgxID0gcmhzX3BmMC54OworICAgICAgeDIgPSByaHNfcGYwLno7CisgICAgfQorICAgIHgxID0gX19zaGZsX3hvcih4MSwgNCk7CisgICAgeDIgPSBfX3NoZmxfeG9yKHgyLCA0KTsKKyAgICBpZigodGhyZWFkSWR4LnglOCkgPCA0KSB7CisgICAgICByaHNfcGYwLnkgPSB4MTsKKyAgICAgIHJoc19wZjAudyA9IHgyOworICAgIH0gZWxzZSB7CisgICAgICByaHNfcGYwLnggPSB4MTsKKyAgICAgIHJoc19wZjAueiA9IHgyOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgNjQgZmVhdHVyZXMuCisgICAgLy8gUm93IDAgLT4gdGltZXMgKDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMykgZm9yIGZlYXR1cmVzIDAsIDEuCisgICAgLy8gUm93IDEgLT4gdGltZXMgKDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMykgZm9yIGZlYXR1cmVzIDIsIDMuCisgICAgLy8gLi4uCisgICAgLy8gUm93IDMxIC0+IHRpbWVzICgwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMpIGZvciBmZWF0dXJlcyA2MiwgNjMKKyAgICAvLyBSb3cgMzIgLT4gdGltZXMgKDIsIDYsIDEwLCAxNCwgMywgNywgMTEsIDE1KSBmb3IgZmVhdHVyZXMgMCwgMQorICAgIC8vIC4uLgorICAgIHJoc19zaG1lbTJbKHRocmVhZElkeC54Pj4zKSsgdGhyZWFkSWR4LnkqMl1bdGhyZWFkSWR4LnglOF0gPSBtYWtlX2Zsb2F0MihyaHNfcGYwLngsIHJoc19wZjAueSk7CisgICAgcmhzX3NobWVtMlsodGhyZWFkSWR4Lng+PjMpKyB0aHJlYWRJZHgueSoyKzMyXVt0aHJlYWRJZHgueCU4XSA9IG1ha2VfZmxvYXQyKHJoc19wZjAueiwgcmhzX3BmMC53KTsKKworICAgIC8vIFJvdyAwICh0aW1lIDApIC0+IGZlYXR1cmVzICgwLCAxKSwgKDQsIDUpLCAuLiAoMjgsIDI5KSwgKDMyLCAzMyksIC4uICAoNjAsIDYxKQorICAgIC8vIFJvdyAxICh0aW1lIDEpIC0+IGZlYXR1cmVzICgwLCAxKSwgKDQsIDUpLCAuLiAoMjgsIDI5KSwgKDMyLCAzMyksIC4uICAoNjAsIDYxKQorICAgIC8vIC4uLgorICAgIC8vIFJvdyAxNSAodGltZSAxNSkgLT4gZmVhdHVyZXMgKDAsIDEpLCAoNCwgNSksIC4uICgyOCwgMjkpLCAoMzIsIDMzKSwgLi4gICg2MCwgNjEpCisgICAgLy8gUm93IDE2ICh0aW1lIDApIC0+IGZlYXR1cmVzICgyLCAzKSwgKDYsIDcpLCAuLiAoMzAsIDMxKSwgKDM0LCAzNSksIC4uICAoNjIsIDYzKQorICAgIC8vIC4uLgorCisgICAgbGhzX3NobWVtMlt0aHJlYWRJZHgueV1bdGhyZWFkSWR4LnhdID0gbWFrZV9mbG9hdDIobGhzX3BmMC54LCBsaHNfcGYwLnkpOworICAgIGxoc19zaG1lbTJbdGhyZWFkSWR4LnkrMTZdW3RocmVhZElkeC54XSA9IG1ha2VfZmxvYXQyKGxoc19wZjAueiwgbGhzX3BmMC53KTsKKworCisjZGVmaW5lIGFkZF92YWxzKGZsMSwgZmwyLCBmcjEsIGZyMilcCisgICAgcmVzdWx0c1swXS54ICs9IGZsMS54ICogZnIxLng7XAorICAgIHJlc3VsdHNbMF0ueSArPSBmbDEueSAqIGZyMS54O1wKKyAgICByZXN1bHRzWzBdLnogKz0gZmwyLnggKiBmcjEueDtcCisgICAgcmVzdWx0c1swXS53ICs9IGZsMi55ICogZnIxLng7XAorXAorICAgIHJlc3VsdHNbMV0ueCArPSBmbDEueCAqIGZyMS55O1wKKyAgICByZXN1bHRzWzFdLnkgKz0gZmwxLnkgKiBmcjEueTtcCisgICAgcmVzdWx0c1sxXS56ICs9IGZsMi54ICogZnIxLnk7XAorICAgIHJlc3VsdHNbMV0udyArPSBmbDIueSAqIGZyMS55O1wKK1wKKyAgICByZXN1bHRzWzJdLnggKz0gZmwxLnggKiBmcjIueDtcCisgICAgcmVzdWx0c1syXS55ICs9IGZsMS55ICogZnIyLng7XAorICAgIHJlc3VsdHNbMl0ueiArPSBmbDIueCAqIGZyMi54O1wKKyAgICByZXN1bHRzWzJdLncgKz0gZmwyLnkgKiBmcjIueDtcCitcCisgICAgcmVzdWx0c1szXS54ICs9IGZsMS54ICogZnIyLnk7XAorICAgIHJlc3VsdHNbM10ueSArPSBmbDEueSAqIGZyMi55O1wKKyAgICByZXN1bHRzWzNdLnogKz0gZmwyLnggKiBmcjIueTtcCisgICAgcmVzdWx0c1szXS53ICs9IGZsMi55ICogZnIyLnk7XAorCisgICAgX19zeW5jdGhyZWFkcygpOworCisgICAgLy8gRG8gdGhlIG11bHRpcGxpZXMuCisgICAgI3ByYWdtYSB1bnJvbGwKKyAgICBmb3IgKGludCBrb2ZmID0gMDsga29mZiA8IDE2OyBrb2ZmICsrKSB7CisgICAgICAvLyAzMiB4IHRocmVhZHMuCisgICAgICBmbG9hdDIgZmwxID0gbGhzX3NobWVtMltrb2ZmXVt0aHJlYWRJZHgueF07CisgICAgICBmbG9hdDIgZmwyID0gbGhzX3NobWVtMltrb2ZmICsgMTZdW3RocmVhZElkeC54XTsKKworICAgICAgaW50IHN0YXJ0X2ZlYXR1cmUgPSB0aHJlYWRJZHgueSAqIDQ7CisgICAgICBmbG9hdDIgZnIxID0gcmhzX3NobWVtMlsoc3RhcnRfZmVhdHVyZT4+MSkgKyAzMiooKGtvZmYlNCkvMildW2tvZmYvNCArIChrb2ZmJTIpKjRdOworICAgICAgZmxvYXQyIGZyMiA9IHJoc19zaG1lbTJbKHN0YXJ0X2ZlYXR1cmU+PjEpICsgMSArIDMyKigoa29mZiU0KS8yKV1ba29mZi80ICsgKGtvZmYlMikqNF07CisKKyAgICAgIGFkZF92YWxzKGZsMSwgZmwyLCBmcjEsIGZyMikKKyAgICB9CisgICAgX19zeW5jdGhyZWFkcygpOworICB9CisKKyN1bmRlZiBwcmVmZXRjaF9saHMKKyN1bmRlZiBhZGRfdmFscworCisgIEluZGV4IGhvcml6X2Jhc2UgPSB0aHJlYWRJZHgueSo0K2Jhc2VfbjsKKyAgaWYgKCFDSEVDS19MSFNfQk9VTkRBUlkgJiYgIUNIRUNLX1JIU19CT1VOREFSWSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDEsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueTsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDMsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0udzsKKyAgICB9CisgIH0gZWxzZSBpZiAoIUNIRUNLX1JIU19CT1VOREFSWSkgeworICAgIC8vIENIRUNLIExIUworICAgIGlmIChsaHNfdmVydCArIDMgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAxLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnk7CisgICAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMywgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS53OworICAgICAgfQorICAgIH0gZWxzZSBpZiAobGhzX3ZlcnQgKyAyIDwgbV9zaXplKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMSwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS55OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAyLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLno7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsaHNfdmVydCArIDEgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAxLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsaHNfdmVydCAgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghQ0hFQ0tfTEhTX0JPVU5EQVJZKSB7CisgICAgLy8gQ0hFQ0sgUkhTCisgICAgLyoKKyAgICBpbnQgbmNvbHNfcmVtID0gZm1pbmYobl9zaXplLSBob3Jpel9iYXNlLCA0KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5jb2xzX3JlbTsgaSsrKSB7CisgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDEsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueTsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDMsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0udzsKKyAgICB9Ki8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKGhvcml6X2Jhc2UraSA8IG5fc2l6ZSkgeworICAgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMSwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS55OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAyLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLno7CisgICAgICAgIG91dHB1dChsaHNfdmVydCArIDMsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0udzsKKyAgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIENIRUNLIGJvdGggYm91bmRhcmllcy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKGhvcml6X2Jhc2UraSA8IG5fc2l6ZSkgeworICAgICAgICBpZiAobGhzX3ZlcnQgPCBtX3NpemUpCisgICAgICAgICAgb3V0cHV0KGxoc192ZXJ0LCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLng7CisgICAgICAgIGlmIChsaHNfdmVydCArIDEgPCBtX3NpemUpCisgICAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMSwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS55OworICAgICAgICBpZiAobGhzX3ZlcnQgKyAyIDwgbV9zaXplKQorICAgICAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgICAgaWYgKGxoc192ZXJ0ICsgMyA8IG1fc2l6ZSkKKyAgICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAzLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnc7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIExoc01hcHBlciwKKyAgICAgICAgIHR5cGVuYW1lIFJoc01hcHBlciwgdHlwZW5hbWUgT3V0cHV0TWFwcGVyLCBib29sIENIRUNLX0xIU19CT1VOREFSWSwKKyAgICAgICAgIGJvb2wgQ0hFQ0tfUkhTX0JPVU5EQVJZPgorX19kZXZpY2VfXyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQKK0VpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbEludGVybmFsKGNvbnN0IExoc01hcHBlciBsaHMsIGNvbnN0IFJoc01hcHBlciByaHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dE1hcHBlciBvdXRwdXQsIGZsb2F0MiBsaHNfc2htZW0yW11bMzJdLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDIgcmhzX3NobWVtMltdWzhdLCBjb25zdCBJbmRleCBtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG5fc2l6ZSwgY29uc3QgSW5kZXgga19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBiYXNlX20sIGNvbnN0IEluZGV4IGJhc2VfbikgeworICB0eXBlZGVmIGZsb2F0IFNjYWxhcjsKKworICAvLyBwcmVmZXRjaCByZWdpc3RlcnMKKyAgZmxvYXQ0IGxoc19wZjAsIGxoc19wZjEsIGxoc19wZjIsIGxoc19wZjM7CisgIGZsb2F0NCByaHNfcGYwLCByaHNfcGYxOworCisgIGZsb2F0NCByZXN1bHRzWzhdOworICBmb3IgKGludCBpPTA7IGkgPCA4OyBpKyspIHsKKyAgICByZXN1bHRzW2ldLnggPSByZXN1bHRzW2ldLnkgPSByZXN1bHRzW2ldLnogPSByZXN1bHRzW2ldLncgPSAwOworICB9CisKKworICBJbmRleCBsaHNfdmVydCA9IGJhc2VfbSt0aHJlYWRJZHgueCo0Kyh0aHJlYWRJZHgueSU0KSozMjsKKyAgZm9yIChJbmRleCBrID0gMDsgayA8IGtfc2l6ZTsgayArPSAzMikgeworICAgIGxoc19wZjAgPSBpbnRlcm5hbDo6cHNldDE8ZmxvYXQ0PigwKTsKKyAgICBsaHNfcGYxID0gaW50ZXJuYWw6OnBzZXQxPGZsb2F0ND4oMCk7CisgICAgbGhzX3BmMiA9IGludGVybmFsOjpwc2V0MTxmbG9hdDQ+KDApOworICAgIGxoc19wZjMgPSBpbnRlcm5hbDo6cHNldDE8ZmxvYXQ0PigwKTsKKworICAgIHJoc19wZjAgPSBpbnRlcm5hbDo6cHNldDE8ZmxvYXQ0PigwKTsKKyAgICByaHNfcGYxID0gaW50ZXJuYWw6OnBzZXQxPGZsb2F0ND4oMCk7CisKKyAgICAgaWYgKCFDSEVDS19MSFNfQk9VTkRBUlkpIHsKKyAgICAgIGlmICgodGhyZWFkSWR4LnkvNCtrKzI0KSA8IGtfc2l6ZSkgeworICAgICAgICBsaHNfcGYwID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgIGxoc19wZjEgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICBsaHNfcGYyID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKzE2KSk7CisgICAgICAgIGxoc19wZjMgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2srMjQpKTsKKyAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQraysxNikgPCBrX3NpemUpIHsKKyAgICAgICAgbGhzX3BmMCA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICBsaHNfcGYxID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgbGhzX3BmMiA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQraysxNikpOworICAgICAgfSBlbHNlIGlmICgodGhyZWFkSWR4LnkvNCtrKzgpIDwga19zaXplKSB7CisgICAgICAgIGxoc19wZjAgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2spKTsKKyAgICAgICAgbGhzX3BmMSA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICB9IGVsc2UgaWYgKCh0aHJlYWRJZHgueS80K2spIDwga19zaXplKSB7CisgICAgICAgIGxoc19wZjAgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2spKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8ganVzdCBDSEVDS19MSFNfQk9VTkRBUlkKKyAgICAgIGlmIChsaHNfdmVydCArIDMgPCBtX3NpemUpIHsKKyAgICAgICAgaWYgKCh0aHJlYWRJZHgueS80K2srMjQpIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMCA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICAgIGxoc19wZjIgPWxocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4obGhzX3ZlcnQsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgICBsaHNfcGYzID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKzI0KSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQraysxNikgPCBrX3NpemUpIHsKKyAgICAgICAgICBsaHNfcGYwID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMSA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMiA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQraysxNikpOworICAgICAgICB9IGVsc2UgaWYgKCh0aHJlYWRJZHgueS80K2srOCkgPCBrX3NpemUpIHsKKyAgICAgICAgICBsaHNfcGYwID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMSA9bGhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihsaHNfdmVydCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQraykgPCBrX3NpemUpIHsKKyAgICAgICAgICBsaHNfcGYwID1saHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KGxoc192ZXJ0LCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobGhzX3ZlcnQgKyAyIDwgbV9zaXplKSB7CisgICAgICAgIGlmICgodGhyZWFkSWR4LnkvNCtrKzI0KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueiA9bGhzKGxoc192ZXJ0ICsgMiwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMS55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYxLnogPWxocyhsaHNfdmVydCArIDIsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICAgIGxoc19wZjIueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraysxNikpOworICAgICAgICAgIGxoc19wZjIueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraysxNikpOworICAgICAgICAgIGxoc19wZjIueiA9bGhzKGxoc192ZXJ0ICsgMiwgKHRocmVhZElkeC55LzQraysxNikpOworICAgICAgICAgIGxoc19wZjMueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraysyNCkpOworICAgICAgICAgIGxoc19wZjMueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraysyNCkpOworICAgICAgICAgIGxoc19wZjMueiA9bGhzKGxoc192ZXJ0ICsgMiwgKHRocmVhZElkeC55LzQraysyNCkpOworICAgICAgICB9IGVsc2UgaWYgKCh0aHJlYWRJZHgueS80K2srMTYpIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMC54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC56ID1saHMobGhzX3ZlcnQgKyAyLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMS54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYxLnkgPWxocyhsaHNfdmVydCArIDEsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICAgIGxoc19wZjEueiA9bGhzKGxoc192ZXJ0ICsgMiwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMi54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKzE2KSk7CisgICAgICAgICAgbGhzX3BmMi55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKzE2KSk7CisgICAgICAgICAgbGhzX3BmMi56ID1saHMobGhzX3ZlcnQgKyAyLCAodGhyZWFkSWR4LnkvNCtrKzE2KSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQrays4KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueiA9bGhzKGxoc192ZXJ0ICsgMiwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMS55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYxLnogPWxocyhsaHNfdmVydCArIDIsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICB9IGVsc2UgaWYgKCh0aHJlYWRJZHgueS80K2spIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMC54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC56ID1saHMobGhzX3ZlcnQgKyAyLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobGhzX3ZlcnQgKyAxIDwgbV9zaXplKSB7CisgICAgICAgIGlmICgodGhyZWFkSWR4LnkvNCtrKzI0KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMS55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYyLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgICBsaHNfcGYyLnkgPWxocyhsaHNfdmVydCArIDEsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgICBsaHNfcGYzLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2srMjQpKTsKKyAgICAgICAgICBsaHNfcGYzLnkgPWxocyhsaHNfdmVydCArIDEsICh0aHJlYWRJZHgueS80K2srMjQpKTsKKyAgICAgICAgfSBlbHNlIGlmICgodGhyZWFkSWR4LnkvNCtrKzE2KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjAueSA9bGhzKGxoc192ZXJ0ICsgMSwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMS55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYyLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgICBsaHNfcGYyLnkgPWxocyhsaHNfdmVydCArIDEsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgfSBlbHNlIGlmICgodGhyZWFkSWR4LnkvNCtrKzgpIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMC54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMS54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYxLnkgPWxocyhsaHNfdmVydCArIDEsICh0aHJlYWRJZHgueS80K2srOCkpOworICAgICAgICB9IGVsc2UgaWYgKCh0aHJlYWRJZHgueS80K2spIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMC54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMC55ID1saHMobGhzX3ZlcnQgKyAxLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobGhzX3ZlcnQgPCBtX3NpemUpIHsKKyAgICAgICAgaWYgKCh0aHJlYWRJZHgueS80K2srMjQpIDwga19zaXplKSB7CisgICAgICAgICAgbGhzX3BmMC54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKSk7CisgICAgICAgICAgbGhzX3BmMS54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKzgpKTsKKyAgICAgICAgICBsaHNfcGYyLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2srMTYpKTsKKyAgICAgICAgICBsaHNfcGYzLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2srMjQpKTsKKyAgICAgICAgfSBlbHNlIGlmICgodGhyZWFkSWR4LnkvNCtrKzE2KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgICAgbGhzX3BmMi54ID1saHMobGhzX3ZlcnQgKyAwLCAodGhyZWFkSWR4LnkvNCtrKzE2KSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQrays4KSA8IGtfc2l6ZSkgeworICAgICAgICAgIGxoc19wZjAueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQraykpOworICAgICAgICAgIGxoc19wZjEueCA9bGhzKGxoc192ZXJ0ICsgMCwgKHRocmVhZElkeC55LzQrays4KSk7CisgICAgICAgIH0gZWxzZSBpZiAoKHRocmVhZElkeC55LzQraykgPCBrX3NpemUpIHsKKyAgICAgICAgICBsaHNfcGYwLnggPWxocyhsaHNfdmVydCArIDAsICh0aHJlYWRJZHgueS80K2spKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBfX3N5bmN0aHJlYWRzKCk7CisgICAgSW5kZXggcmhzX3ZlcnQgPSBrK3RocmVhZElkeC54KjQ7CisgICAgSW5kZXggcmhzX2hvcml6MCA9IHRocmVhZElkeC55KjIrYmFzZV9uOworICAgIEluZGV4IHJoc19ob3JpejEgPSB0aHJlYWRJZHgueSoyKzErYmFzZV9uOworICAgIGlmICghQ0hFQ0tfUkhTX0JPVU5EQVJZKSB7CisgICAgICBpZiAoKHJoc192ZXJ0ICsgMykgPCBrX3NpemUpIHsKKyAgICAgICAgLy8ganVzdCBDSEVDS19SSFNfQk9VTkRBUlkKKyAgICAgICAgcmhzX3BmMCA9IHJocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4ocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICByaHNfcGYxID0gcmhzLmxvYWRQYWNrZXQ8VW5hbGlnbmVkPihyaHNfdmVydCwgcmhzX2hvcml6MSk7CisgICAgICB9IGVsc2UgaWYgKHJoc192ZXJ0ICsgMiA8IGtfc2l6ZSkgeworICAgICAgICAvLyBqdXN0IENIRUNLX1JIU19CT1VOREFSWQorICAgICAgICByaHNfcGYwLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICByaHNfcGYwLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXowKTsKKyAgICAgICAgcmhzX3BmMC56ID0gcmhzKHJoc192ZXJ0ICsgMiwgcmhzX2hvcml6MCk7CisgICAgICAgIHJoc19wZjEueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MSk7CisgICAgICAgIHJoc19wZjEueSA9IHJocyhyaHNfdmVydCArIDEsIHJoc19ob3JpejEpOworICAgICAgICByaHNfcGYxLnogPSByaHMocmhzX3ZlcnQgKyAyLCByaHNfaG9yaXoxKTsKKyAgICAgIH0gZWxzZSBpZiAocmhzX3ZlcnQgKyAxIDwga19zaXplKSB7CisgICAgICAgIHJoc19wZjAueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MCk7CisgICAgICAgIHJoc19wZjAueSA9IHJocyhyaHNfdmVydCArIDEsIHJoc19ob3JpejApOworICAgICAgICByaHNfcGYxLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejEpOworICAgICAgICByaHNfcGYxLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXoxKTsKKyAgICAgIH0gZWxzZSBpZiAocmhzX3ZlcnQgIDwga19zaXplKSB7CisgICAgICAgIHJoc19wZjAueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MCk7CisgICAgICAgIHJoc19wZjEueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyaHNfaG9yaXoxIDwgbl9zaXplKSB7CisgICAgICAgIGlmICgocmhzX3ZlcnQgKyAzKSA8IGtfc2l6ZSkgeworICAgICAgICAgIC8vIGp1c3QgQ0hFQ0tfUkhTX0JPVU5EQVJZCisgICAgICAgICAgcmhzX3BmMCA9IHJocy5sb2FkUGFja2V0PFVuYWxpZ25lZD4ocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICAgIHJoc19wZjEgPSByaHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KHJoc192ZXJ0LCByaHNfaG9yaXoxKTsKKyAgICAgICAgfSBlbHNlIGlmIChyaHNfdmVydCArIDIgPCBrX3NpemUpIHsKKyAgICAgICAgICAvLyBqdXN0IENIRUNLX1JIU19CT1VOREFSWQorICAgICAgICAgIHJoc19wZjAueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MCk7CisgICAgICAgICAgcmhzX3BmMC55ID0gcmhzKHJoc192ZXJ0ICsgMSwgcmhzX2hvcml6MCk7CisgICAgICAgICAgcmhzX3BmMC56ID0gcmhzKHJoc192ZXJ0ICsgMiwgcmhzX2hvcml6MCk7CisgICAgICAgICAgcmhzX3BmMS54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXoxKTsKKyAgICAgICAgICByaHNfcGYxLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXoxKTsKKyAgICAgICAgICByaHNfcGYxLnogPSByaHMocmhzX3ZlcnQgKyAyLCByaHNfaG9yaXoxKTsKKyAgICAgICAgfSBlbHNlIGlmIChrK3RocmVhZElkeC54KjQgKyAxIDwga19zaXplKSB7CisgICAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgICByaHNfcGYwLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXowKTsKKyAgICAgICAgICByaHNfcGYxLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejEpOworICAgICAgICAgIHJoc19wZjEueSA9IHJocyhyaHNfdmVydCArIDEsIHJoc19ob3JpejEpOworICAgICAgICB9IGVsc2UgaWYgKGsrdGhyZWFkSWR4LngqNCAgPCBrX3NpemUpIHsKKyAgICAgICAgICByaHNfcGYwLnggPSByaHMocmhzX3ZlcnQsIHJoc19ob3JpejApOworICAgICAgICAgIHJoc19wZjEueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocmhzX2hvcml6MCA8IG5fc2l6ZSkgeworICAgICAgICBpZiAoKHJoc192ZXJ0ICsgMykgPCBrX3NpemUpIHsKKyAgICAgICAgICAvLyBqdXN0IENIRUNLX1JIU19CT1VOREFSWQorICAgICAgICAgIHJoc19wZjAgPSByaHMubG9hZFBhY2tldDxVbmFsaWduZWQ+KHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgfSBlbHNlIGlmICgocmhzX3ZlcnQgKyAyKSA8IGtfc2l6ZSkgeworICAgICAgICAgIC8vIGp1c3QgQ0hFQ0tfUkhTX0JPVU5EQVJZCisgICAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgICByaHNfcGYwLnkgPSByaHMocmhzX3ZlcnQgKyAxLCByaHNfaG9yaXowKTsKKyAgICAgICAgICByaHNfcGYwLnogPSByaHMocmhzX3ZlcnQgKyAyLCByaHNfaG9yaXowKTsKKyAgICAgICAgfSBlbHNlIGlmICgocmhzX3ZlcnQgKyAxKSA8IGtfc2l6ZSkgeworICAgICAgICAgIHJoc19wZjAueCA9IHJocyhyaHNfdmVydCwgcmhzX2hvcml6MCk7CisgICAgICAgICAgcmhzX3BmMC55ID0gcmhzKHJoc192ZXJ0ICsgMSwgcmhzX2hvcml6MCk7CisgICAgICAgIH0gZWxzZSBpZiAocmhzX3ZlcnQgIDwga19zaXplKSB7CisgICAgICAgICAgcmhzX3BmMC54ID0gcmhzKHJoc192ZXJ0LCByaHNfaG9yaXowKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBfX3N5bmN0aHJlYWRzKCk7CisgICAgLy8gTG9hZGVkLiBEbyBjb21wdXRhdGlvbgorICAgIC8vIFJvdyAwIC0+IHRpbWVzICgwLCA0LCA4LCAuLiAyOCkgZm9yIGZlYXR1cmVzIDAsIDEuCisgICAgLy8gUm93IDEgLT4gdGltZXMgKDAsIDQsIDgsIC4uIDI4KSBmb3IgZmVhdHVyZXMgMiwgMy4KKyAgICAvLyAuLgorICAgIC8vIFJvdyAzMSAtPiB0aW1lcyAoMCwgNCwgOCwgLi4gMjgpIGZvciBmZWF0dXJlcyA2MiwgNjMKKyAgICByaHNfc2htZW0yW3RocmVhZElkeC55XVt0aHJlYWRJZHgueF0gPSBtYWtlX2Zsb2F0MihyaHNfcGYwLngsIHJoc19wZjEueCk7CisgICAgLy8gUm93IDMyIC0+IHRpbWVzICgxLCA1LCA5LCAuLiAyOSkgZm9yIGZlYXR1cmVzIDAsIDEuCisgICAgLy8gUm93IDMzIC0+IHRpbWVzICgxLCA1LCA5LCAuLiAyOSkgZm9yIGZlYXR1cmVzIDIsIDMuCisgICAgLy8gLi4KKyAgICByaHNfc2htZW0yW3RocmVhZElkeC55KzMyXVt0aHJlYWRJZHgueF0gPSBtYWtlX2Zsb2F0MihyaHNfcGYwLnksIHJoc19wZjEueSk7CisgICAgLy8gUm93IDY0IC0+IHRpbWVzICgyLCA2LCAxMCwgLi4gMzApIGZvciBmZWF0dXJlcyAwLCAxLgorICAgIC8vIFJvdyA2NSAtPiB0aW1lcyAoMiwgNiwgMTAsIC4uIDMwKSBmb3IgZmVhdHVyZXMgMiwgMy4KKyAgICByaHNfc2htZW0yW3RocmVhZElkeC55KzY0XVt0aHJlYWRJZHgueF0gPSBtYWtlX2Zsb2F0MihyaHNfcGYwLnosIHJoc19wZjEueik7CisgICAgLy8gUm93IDk2IC0+IHRpbWVzICgzLCA3LCAxMSwgLi4gMzEpIGZvciBmZWF0dXJlcyAwLCAxLgorICAgIC8vIFJvdyA5NyAtPiB0aW1lcyAoMywgNywgMTEsIC4uIDMxKSBmb3IgZmVhdHVyZXMgMiwgMy4KKyAgICByaHNfc2htZW0yW3RocmVhZElkeC55Kzk2XVt0aHJlYWRJZHgueF0gPSBtYWtlX2Zsb2F0MihyaHNfcGYwLncsIHJoc19wZjEudyk7CisKKyAgICAvLyBMSFMuCisgICAgLy8gUm93IDAgKHRpbWUgMCkgLT4gZmVhdHVyZXMgKDAsIDEpLCAoNCwgNSksIC4uICgyOCwgMjkpLCAoMzIsIDMzKSwgLi4gICg2MCwgNjEpIC4uICgxMjQsIDEyNSkKKyAgICAvLyBSb3cgMSAodGltZSAxKSAtPiBmZWF0dXJlcyAoMCwgMSksICg0LCA1KSwgLi4gKDI4LCAyOSksICgzMiwgMzMpLCAuLiAgKDYwLCA2MSkgLi4gKDEyNCwgMTI1KQorICAgIC8vIC4uLgorICAgIC8vIFJvdyA4ICh0aW1lIDApIC0+IGZlYXR1cmVzICgyLCAzKSwgKDYsIDcpLCAuLiAoMzAsIDMxKSwgKDM0LCAzNSksIC4uICAoNjIsIDYzKSAuLiAoMTI2LCAxMjcpCisgICAgLy8gUm93IDE1ICh0aW1lIDcpIC0+IGZlYXR1cmVzICgyLCAzKSwgKDYsIDcpLCAuLiAoMzAsIDMxKSwgKDM0LCAzNSksIC4uICAoNjIsIDYzKSAuLiAoMTI2LCAxMjcpCisKKworI2RlZmluZSBhZGRfdmFscyhhX2ZlYXQxLCBhX2ZlYXQyLCBmMSwgZjIsIGYzLCBmNClcCisgICAgICByZXN1bHRzWzBdLnggKz0gYV9mZWF0MS54ICogZjEueDtcCisgICAgICByZXN1bHRzWzFdLnggKz0gYV9mZWF0MS54ICogZjEueTtcCisgICAgICByZXN1bHRzWzJdLnggKz0gYV9mZWF0MS54ICogZjIueDtcCisgICAgICByZXN1bHRzWzNdLnggKz0gYV9mZWF0MS54ICogZjIueTtcCisgICAgICByZXN1bHRzWzRdLnggKz0gYV9mZWF0MS54ICogZjMueDtcCisgICAgICByZXN1bHRzWzVdLnggKz0gYV9mZWF0MS54ICogZjMueTtcCisgICAgICByZXN1bHRzWzZdLnggKz0gYV9mZWF0MS54ICogZjQueDtcCisgICAgICByZXN1bHRzWzddLnggKz0gYV9mZWF0MS54ICogZjQueTtcCitcCisgICAgICByZXN1bHRzWzBdLnkgKz0gYV9mZWF0MS55ICogZjEueDtcCisgICAgICByZXN1bHRzWzFdLnkgKz0gYV9mZWF0MS55ICogZjEueTtcCisgICAgICByZXN1bHRzWzJdLnkgKz0gYV9mZWF0MS55ICogZjIueDtcCisgICAgICByZXN1bHRzWzNdLnkgKz0gYV9mZWF0MS55ICogZjIueTtcCisgICAgICByZXN1bHRzWzRdLnkgKz0gYV9mZWF0MS55ICogZjMueDtcCisgICAgICByZXN1bHRzWzVdLnkgKz0gYV9mZWF0MS55ICogZjMueTtcCisgICAgICByZXN1bHRzWzZdLnkgKz0gYV9mZWF0MS55ICogZjQueDtcCisgICAgICByZXN1bHRzWzddLnkgKz0gYV9mZWF0MS55ICogZjQueTtcCitcCisgICAgICByZXN1bHRzWzBdLnogKz0gYV9mZWF0Mi54ICogZjEueDtcCisgICAgICByZXN1bHRzWzFdLnogKz0gYV9mZWF0Mi54ICogZjEueTtcCisgICAgICByZXN1bHRzWzJdLnogKz0gYV9mZWF0Mi54ICogZjIueDtcCisgICAgICByZXN1bHRzWzNdLnogKz0gYV9mZWF0Mi54ICogZjIueTtcCisgICAgICByZXN1bHRzWzRdLnogKz0gYV9mZWF0Mi54ICogZjMueDtcCisgICAgICByZXN1bHRzWzVdLnogKz0gYV9mZWF0Mi54ICogZjMueTtcCisgICAgICByZXN1bHRzWzZdLnogKz0gYV9mZWF0Mi54ICogZjQueDtcCisgICAgICByZXN1bHRzWzddLnogKz0gYV9mZWF0Mi54ICogZjQueTtcCitcCisgICAgICByZXN1bHRzWzBdLncgKz0gYV9mZWF0Mi55ICogZjEueDtcCisgICAgICByZXN1bHRzWzFdLncgKz0gYV9mZWF0Mi55ICogZjEueTtcCisgICAgICByZXN1bHRzWzJdLncgKz0gYV9mZWF0Mi55ICogZjIueDtcCisgICAgICByZXN1bHRzWzNdLncgKz0gYV9mZWF0Mi55ICogZjIueTtcCisgICAgICByZXN1bHRzWzRdLncgKz0gYV9mZWF0Mi55ICogZjMueDtcCisgICAgICByZXN1bHRzWzVdLncgKz0gYV9mZWF0Mi55ICogZjMueTtcCisgICAgICByZXN1bHRzWzZdLncgKz0gYV9mZWF0Mi55ICogZjQueDtcCisgICAgICByZXN1bHRzWzddLncgKz0gYV9mZWF0Mi55ICogZjQueTtcCisKKyAgICBsaHNfc2htZW0yW3RocmVhZElkeC55LzRdW3RocmVhZElkeC54Kyh0aHJlYWRJZHgueSU0KSo4XSA9IG1ha2VfZmxvYXQyKGxoc19wZjAueCwgbGhzX3BmMC55KTsKKyAgICBsaHNfc2htZW0yW3RocmVhZElkeC55LzQrOF1bdGhyZWFkSWR4LngrKHRocmVhZElkeC55JTQpKjhdID0gbWFrZV9mbG9hdDIobGhzX3BmMS54LCBsaHNfcGYxLnkpOworICAgIGxoc19zaG1lbTJbdGhyZWFkSWR4LnkvNCsxNl1bdGhyZWFkSWR4LngrKHRocmVhZElkeC55JTQpKjhdID0gbWFrZV9mbG9hdDIobGhzX3BmMi54LCBsaHNfcGYyLnkpOworICAgIGxoc19zaG1lbTJbdGhyZWFkSWR4LnkvNCsyNF1bdGhyZWFkSWR4LngrKHRocmVhZElkeC55JTQpKjhdID0gbWFrZV9mbG9hdDIobGhzX3BmMy54LCBsaHNfcGYzLnkpOworCisgICAgbGhzX3NobWVtMlt0aHJlYWRJZHgueS80ICsgMzJdW3RocmVhZElkeC54Kyh0aHJlYWRJZHgueSU0KSo4XSA9IG1ha2VfZmxvYXQyKGxoc19wZjAueiwgbGhzX3BmMC53KTsKKyAgICBsaHNfc2htZW0yW3RocmVhZElkeC55LzQgKyA0MF1bdGhyZWFkSWR4LngrKHRocmVhZElkeC55JTQpKjhdID0gbWFrZV9mbG9hdDIobGhzX3BmMS56LCBsaHNfcGYxLncpOworICAgIGxoc19zaG1lbTJbdGhyZWFkSWR4LnkvNCArIDQ4XVt0aHJlYWRJZHgueCsodGhyZWFkSWR4LnklNCkqOF0gPSBtYWtlX2Zsb2F0MihsaHNfcGYyLnosIGxoc19wZjIudyk7CisgICAgbGhzX3NobWVtMlt0aHJlYWRJZHgueS80ICsgNTZdW3RocmVhZElkeC54Kyh0aHJlYWRJZHgueSU0KSo4XSA9IG1ha2VfZmxvYXQyKGxoc19wZjMueiwgbGhzX3BmMy53KTsKKworICAgIF9fc3luY3RocmVhZHMoKTsKKworICAgIC8vIERvIHRoZSBtdWx0aXBsaWVzLgorICAgICNwcmFnbWEgdW5yb2xsCisgICAgZm9yIChpbnQga29mZiA9IDA7IGtvZmYgPCAzMjsga29mZiArKykgeworICAgICAgZmxvYXQyIGEzID0gbGhzX3NobWVtMltrb2ZmXVt0aHJlYWRJZHgueCArICh0aHJlYWRJZHgueSAlIDQpICogOF07CisgICAgICBmbG9hdDIgYTQgPSBsaHNfc2htZW0yW2tvZmYgKyAzMl1bdGhyZWFkSWR4LnggKyAodGhyZWFkSWR4LnkgJSA0KSAqIDhdOworCisgICAgICAvLyBmaXJzdCBmZWF0dXJlIGlzIGF0ICh0aHJlYWRJZHgueS80KSAqIDggbGFzdCBpcyBhdCBzdGFydCArIDguCisgICAgICBpbnQgc3RhcnRfZmVhdHVyZSA9ICh0aHJlYWRJZHgueSAvIDQpICogODsKKworICAgICAgZmxvYXQyIGJyMSA9IHJoc19zaG1lbTJbc3RhcnRfZmVhdHVyZS8yICsgICAgIChrb2ZmICUgNCkgKiAzMl1ba29mZi80XTsKKyAgICAgIGZsb2F0MiBicjIgPSByaHNfc2htZW0yW3N0YXJ0X2ZlYXR1cmUvMiArIDEgKyAoa29mZiAlIDQpICogMzJdW2tvZmYvNF07CisgICAgICBmbG9hdDIgYnIzID0gcmhzX3NobWVtMltzdGFydF9mZWF0dXJlLzIgKyAyICsgKGtvZmYgJSA0KSAqIDMyXVtrb2ZmLzRdOworICAgICAgZmxvYXQyIGJyNCA9IHJoc19zaG1lbTJbc3RhcnRfZmVhdHVyZS8yICsgMyArIChrb2ZmICUgNCkgKiAzMl1ba29mZi80XTsKKworICAgICAgYWRkX3ZhbHMoYTMsIGE0LCBicjEsIGJyMiwgYnIzLCBicjQpCisgICAgfQorICAgIF9fc3luY3RocmVhZHMoKTsKKyAgfSAvLyBlbmQgbG9vcCBvdmVyIGsKKworCisgIF9fc3luY3RocmVhZHMoKTsKKyAgSW5kZXggaG9yaXpfYmFzZSA9ICh0aHJlYWRJZHgueS80KSo4K2Jhc2VfbjsKKyAgaWYgKCFDSEVDS19MSFNfQk9VTkRBUlkgJiYgIUNIRUNLX1JIU19CT1VOREFSWSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDEsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueTsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgIG91dHB1dChsaHNfdmVydCArIDMsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0udzsKKyAgICB9CisgIH0gZWxzZSBpZiAoIUNIRUNLX1JIU19CT1VOREFSWSkgeworICAgIGlmIChsaHNfdmVydCArIDMgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAxLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnk7CisgICAgICAgIG91dHB1dChsaHNfdmVydCArIDIsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0uejsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMywgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS53OworICAgICAgfQorICAgIH0gZWxzZSBpZiAobGhzX3ZlcnQgKyAyIDwgbV9zaXplKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMSwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS55OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAyLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLno7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsaHNfdmVydCArIDEgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAxLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsaHNfdmVydCAgPCBtX3NpemUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIG91dHB1dChsaHNfdmVydCwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS54OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghQ0hFQ0tfTEhTX0JPVU5EQVJZKSB7CisgICAgLy8gQ0hFQ0sgQk9VTkRBUllfQgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICBpZiAoaG9yaXpfYmFzZSArIGkgPCBuX3NpemUpIHsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0LCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLng7CisgICAgICAgIG91dHB1dChsaHNfdmVydCArIDEsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueTsKKyAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMiwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS56OworICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAzLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnc7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIENIRUNLIGJvdGggYm91bmRhcmllcy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgaWYgKGhvcml6X2Jhc2UgKyBpIDwgbl9zaXplKSB7CisgICAgICAgIGlmIChsaHNfdmVydCA8IG1fc2l6ZSkKKyAgICAgICAgICBvdXRwdXQobGhzX3ZlcnQsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0ueDsKKyAgICAgICAgaWYgKGxoc192ZXJ0ICsgMSA8IG1fc2l6ZSkKKyAgICAgICAgICBvdXRwdXQobGhzX3ZlcnQgKyAxLCBob3Jpel9iYXNlICsgaSkgPSByZXN1bHRzW2ldLnk7CisgICAgICAgIGlmIChsaHNfdmVydCArIDIgPCBtX3NpemUpCisgICAgICAgICAgb3V0cHV0KGxoc192ZXJ0ICsgMiwgaG9yaXpfYmFzZSArIGkpID0gcmVzdWx0c1tpXS56OworICAgICAgICBpZiAobGhzX3ZlcnQgKyAzIDwgbV9zaXplKQorICAgICAgICAgIG91dHB1dChsaHNfdmVydCArIDMsIGhvcml6X2Jhc2UgKyBpKSA9IHJlc3VsdHNbaV0udzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgTGhzTWFwcGVyLAorICAgICAgICAgdHlwZW5hbWUgUmhzTWFwcGVyLCB0eXBlbmFtZSBPdXRwdXRNYXBwZXI+CitfX2dsb2JhbF9fIHZvaWQKK19fbGF1bmNoX2JvdW5kc19fKDI1NikKK0VpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbChjb25zdCBMaHNNYXBwZXIgbGhzLCBjb25zdCBSaHNNYXBwZXIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRNYXBwZXIgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtX3NpemUsIGNvbnN0IEluZGV4IG5fc2l6ZSwgY29uc3QgSW5kZXgga19zaXplKSB7CisgIF9fc2hhcmVkX18gZmxvYXQyIGxoc19zaG1lbVs2NCozMl07CisgIF9fc2hhcmVkX18gZmxvYXQyIHJoc19zaG1lbVsxMjgqOF07CisKKyAgdHlwZWRlZiBmbG9hdDIgTEhTX01FTVs2NF1bMzJdOworICB0eXBlZGVmIGZsb2F0MiBSSFNfTUVNWzEyOF1bOF07CisKKyAgdHlwZWRlZiBmbG9hdDIgTEhTX01FTTE2eDE2WzMyXVsxNl07CisgIHR5cGVkZWYgZmxvYXQyIFJIU19NRU0xNngxNls2NF1bOF07CisKKyAgY29uc3QgSW5kZXggbV9ibG9ja19pZHggPSBibG9ja0lkeC54OworICBjb25zdCBJbmRleCBuX2Jsb2NrX2lkeCA9IGJsb2NrSWR4Lnk7CisKKyAgY29uc3QgSW5kZXggYmFzZV9tID0gMTI4ICogbV9ibG9ja19pZHg7CisgIGNvbnN0IEluZGV4IGJhc2VfbiA9IDY0ICogbl9ibG9ja19pZHg7CisKKyAgYm9vbCBjaGVja19yaHMgPSAoYmFzZV9uICsgNjMpID49IG5fc2l6ZTsKKyAgYm9vbCBjaGVja19saHMxMjggPSAoYmFzZV9tICsgMTI3KSA+PSBtX3NpemU7CisKKyAgaWYgKCFjaGVja19yaHMpIHsKKyAgICBpZiAoIWNoZWNrX2xoczEyOCkgeworICAgICAgLy8gPj0gMTI4IHJvd3MgbGVmdAorICAgICAgRWlnZW5GbG9hdENvbnRyYWN0aW9uS2VybmVsSW50ZXJuYWw8SW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXIsIGZhbHNlLCBmYWxzZT4oCisgICAgICAgICAgICAgICAgICAgICBsaHMsIHJocywgb3V0cHV0LCAqKChMSFNfTUVNICopIGxoc19zaG1lbSksICooKFJIU19NRU0gKikgcmhzX3NobWVtKSwgbV9zaXplLCBuX3NpemUsIGtfc2l6ZSwgYmFzZV9tLCBiYXNlX24pOworICAgIH0gZWxzZSB7CisgICAgICBFaWdlbkZsb2F0Q29udHJhY3Rpb25LZXJuZWxJbnRlcm5hbDxJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlciwgdHJ1ZSwgZmFsc2U+KAorICAgICAgICAgICAgICAgICAgICAgbGhzLCByaHMsIG91dHB1dCwgKigoTEhTX01FTSAqKSBsaHNfc2htZW0pLCAqKChSSFNfTUVNICopIHJoc19zaG1lbSksIG1fc2l6ZSwgbl9zaXplLCBrX3NpemUsIGJhc2VfbSwgYmFzZV9uKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFjaGVja19saHMxMjgpIHsKKyAgICAgIC8vID49IDEyOCByb3dzIGxlZnQKKyAgICAgIEVpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbEludGVybmFsPEluZGV4LCBMaHNNYXBwZXIsIFJoc01hcHBlciwgT3V0cHV0TWFwcGVyLCBmYWxzZSwgdHJ1ZT4oCisgICAgICAgICAgICAgICAgICAgICBsaHMsIHJocywgb3V0cHV0LCAqKChMSFNfTUVNICopIGxoc19zaG1lbSksICooKFJIU19NRU0gKikgcmhzX3NobWVtKSwgbV9zaXplLCBuX3NpemUsIGtfc2l6ZSwgYmFzZV9tLCBiYXNlX24pOworICAgIH0gZWxzZSB7CisgICAgICBFaWdlbkZsb2F0Q29udHJhY3Rpb25LZXJuZWxJbnRlcm5hbDxJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlciwgdHJ1ZSwgdHJ1ZT4oCisgICAgICAgICAgICAgICAgICAgICBsaHMsIHJocywgb3V0cHV0LCAqKChMSFNfTUVNICopIGxoc19zaG1lbSksICooKFJIU19NRU0gKikgcmhzX3NobWVtKSwgbV9zaXplLCBuX3NpemUsIGtfc2l6ZSwgYmFzZV9tLCBiYXNlX24pOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgTGhzTWFwcGVyLAorICAgICAgICAgdHlwZW5hbWUgUmhzTWFwcGVyLCB0eXBlbmFtZSBPdXRwdXRNYXBwZXI+CitfX2dsb2JhbF9fIHZvaWQKK19fbGF1bmNoX2JvdW5kc19fKDI1NikKK0VpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbDE2eDE2KGNvbnN0IExoc01hcHBlciBsaHMsIGNvbnN0IFJoc01hcHBlciByaHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dE1hcHBlciBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1fc2l6ZSwgY29uc3QgSW5kZXggbl9zaXplLCBjb25zdCBJbmRleCBrX3NpemUpIHsKKyAgX19zaGFyZWRfXyBmbG9hdDIgbGhzX3NobWVtWzMyXVsxNl07CisgIF9fc2hhcmVkX18gZmxvYXQyIHJoc19zaG1lbVs2NF1bOF07CisKKyAgY29uc3QgSW5kZXggbV9ibG9ja19pZHggPSBibG9ja0lkeC54OworICBjb25zdCBJbmRleCBuX2Jsb2NrX2lkeCA9IGJsb2NrSWR4Lnk7CisKKyAgY29uc3QgSW5kZXggYmFzZV9tID0gNjQgKiBtX2Jsb2NrX2lkeDsKKyAgY29uc3QgSW5kZXggYmFzZV9uID0gNjQgKiBuX2Jsb2NrX2lkeDsKKworICBpZiAoYmFzZV9tICsgNjMgPCBtX3NpemUpIHsKKyAgICBpZiAoYmFzZV9uICsgNjMgPCBuX3NpemUpIHsKKyAgICAgIEVpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbEludGVybmFsMTZ4MTY8SW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXIsIGZhbHNlLCBmYWxzZT4obGhzLCByaHMsIG91dHB1dCwgbGhzX3NobWVtLCByaHNfc2htZW0sIG1fc2l6ZSwgbl9zaXplLCBrX3NpemUsIGJhc2VfbSwgYmFzZV9uKTsKKyAgICB9IGVsc2UgeworICAgICAgRWlnZW5GbG9hdENvbnRyYWN0aW9uS2VybmVsSW50ZXJuYWwxNngxNjxJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlciwgZmFsc2UsIHRydWU+KGxocywgcmhzLCBvdXRwdXQsIGxoc19zaG1lbSwgcmhzX3NobWVtLCBtX3NpemUsIG5fc2l6ZSwga19zaXplLCBiYXNlX20sIGJhc2Vfbik7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiYXNlX24gKyA2MyA8IG5fc2l6ZSkgeworICAgICAgRWlnZW5GbG9hdENvbnRyYWN0aW9uS2VybmVsSW50ZXJuYWwxNngxNjxJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlciwgdHJ1ZSwgZmFsc2U+KGxocywgcmhzLCBvdXRwdXQsIGxoc19zaG1lbSwgcmhzX3NobWVtLCBtX3NpemUsIG5fc2l6ZSwga19zaXplLCBiYXNlX20sIGJhc2Vfbik7CisgICAgfSBlbHNlIHsKKyAgICAgIEVpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbEludGVybmFsMTZ4MTY8SW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXIsIHRydWUsIHRydWU+KGxocywgcmhzLCBvdXRwdXQsIGxoc19zaG1lbSwgcmhzX3NobWVtLCBtX3NpemUsIG5fc2l6ZSwga19zaXplLCBiYXNlX20sIGJhc2Vfbik7CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kaWNlcywgdHlwZW5hbWUgTGVmdEFyZ1R5cGUsIHR5cGVuYW1lIFJpZ2h0QXJnVHlwZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgR3B1RGV2aWNlPiA6CisgICAgcHVibGljIFRlbnNvckNvbnRyYWN0aW9uRXZhbHVhdG9yQmFzZTxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgR3B1RGV2aWNlPiA+IHsKKworICB0eXBlZGVmIEdwdURldmljZSBEZXZpY2U7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgRGV2aWNlPiBTZWxmOworICB0eXBlZGVmIFRlbnNvckNvbnRyYWN0aW9uRXZhbHVhdG9yQmFzZTxTZWxmPiBCYXNlOworCisgIHR5cGVkZWYgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgR3B1RGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworCisgIGVudW0geworICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICB9OworCisgIC8vIE1vc3Qgb2YgdGhlIGNvZGUgaXMgYXNzdW1pbmcgdGhhdCBib3RoIGlucHV0IHRlbnNvcnMgYXJlIENvbE1ham9yLiBJZiB0aGUKKyAgLy8gaW5wdXRzIGFyZSBSb3dNYWpvciwgd2Ugd2lsbCAiY2hlYXQiIGJ5IHN3YXBwaW5nIHRoZSBMSFMgYW5kIFJIUzoKKyAgLy8gSWYgd2Ugd2FudCB0byBjb21wdXRlIEEgKiBCID0gQywgd2hlcmUgQSBpcyBMSFMgYW5kIEIgaXMgUkhTLCB0aGUgY29kZQorICAvLyB3aWxsIHByZXRlbmQgQiBpcyBMSFMgYW5kIEEgaXMgUkhTLgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvciksIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+Ojp0eXBlIEV2YWxMZWZ0QXJnVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpLCBSaWdodEFyZ1R5cGUsIExlZnRBcmdUeXBlPjo6dHlwZSBFdmFsUmlnaHRBcmdUeXBlOworCisgIHN0YXRpYyBjb25zdCBpbnQgTERpbXMgPQorICAgICAgaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV2YWxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IFJEaW1zID0KKyAgICAgIGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxFdmFsUmlnaHRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgQ29udHJhY3REaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8SW5kaWNlcz46OnZhbHVlOworCisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIExEaW1zPiBsZWZ0X2RpbV9tYXBwZXJfdDsKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgUkRpbXM+IHJpZ2h0X2RpbV9tYXBwZXJfdDsKKworICB0eXBlZGVmIGFycmF5PEluZGV4LCBDb250cmFjdERpbXM+IGNvbnRyYWN0X3Q7CisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIExEaW1zIC0gQ29udHJhY3REaW1zPiBsZWZ0X25vY29udHJhY3RfdDsKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgUkRpbXMgLSBDb250cmFjdERpbXM+IHJpZ2h0X25vY29udHJhY3RfdDsKKworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBMRGltcyArIFJEaW1zIC0gMiAqIENvbnRyYWN0RGltczsKKworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKworICAvLyB0eXBlZGVmcyBuZWVkZWQgaW4gZXZhbFRvCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBFdmFsTGVmdEFyZ1R5cGU6OlNjYWxhcj46OnR5cGUgTGhzU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbFJpZ2h0QXJnVHlwZTo6U2NhbGFyPjo6dHlwZSBSaHNTY2FsYXI7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbExlZnRBcmdUeXBlLCBEZXZpY2U+IExlZnRFdmFsdWF0b3I7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPEV2YWxSaWdodEFyZ1R5cGUsIERldmljZT4gUmlnaHRFdmFsdWF0b3I7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBMZWZ0RXZhbHVhdG9yOjpEaW1lbnNpb25zIExlZnREaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFJpZ2h0RXZhbHVhdG9yOjpEaW1lbnNpb25zIFJpZ2h0RGltZW5zaW9uczsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKSA6CisgICAgICBCYXNlKG9wLCBkZXZpY2UpIHt9CisKKyAgLy8gV2UgbmVlZCB0byByZWRlZmluZSB0aGlzIG1ldGhvZCB0byBtYWtlIG52Y2MgaGFwcHkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogZGF0YSkgeworICAgIHRoaXMtPm1fbGVmdEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgdGhpcy0+bV9yaWdodEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgaWYgKGRhdGEpIHsKKyAgICAgIGV2YWxUbyhkYXRhKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy0+bV9yZXN1bHQgPSBzdGF0aWNfY2FzdDxTY2FsYXIgKj4odGhpcy0+bV9kZXZpY2UuYWxsb2NhdGUodGhpcy0+ZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKFNjYWxhcikpKTsKKyAgICAgIGV2YWxUbyh0aGlzLT5tX3Jlc3VsdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIGV2YWxUbyhTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIGlmICh0aGlzLT5tX2xoc19pbm5lcl9kaW1fY29udGlndW91cykgeworICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9jb250aWd1b3VzKSB7CisgICAgICAgIGlmICh0aGlzLT5tX3Joc19pbm5lcl9kaW1fcmVvcmRlcmVkKSB7CisgICAgICAgICAgZXZhbFR5cGVkPHRydWUsIHRydWUsIHRydWUsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBldmFsVHlwZWQ8dHJ1ZSwgdHJ1ZSwgZmFsc2UsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQpIHsKKyAgICAgICAgICBldmFsVHlwZWQ8dHJ1ZSwgZmFsc2UsIHRydWUsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBldmFsVHlwZWQ8dHJ1ZSwgZmFsc2UsIGZhbHNlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAodGhpcy0+bV9yaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1fcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQpIHsKKyAgICAgICAgICBldmFsVHlwZWQ8ZmFsc2UsIHRydWUsIHRydWUsIFVuYWxpZ25lZD4oYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBldmFsVHlwZWQ8ZmFsc2UsIHRydWUsIGZhbHNlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgIGlmICh0aGlzLT5tX3Joc19pbm5lcl9kaW1fcmVvcmRlcmVkKSB7CisgICAgICAgICAgZXZhbFR5cGVkPGZhbHNlLCBmYWxzZSwgdHJ1ZSwgVW5hbGlnbmVkPihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGV2YWxUeXBlZDxmYWxzZSwgZmFsc2UsIGZhbHNlLCBVbmFsaWduZWQ+KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNNYXBwZXIsIHR5cGVuYW1lIFJoc01hcHBlciwgdHlwZW5hbWUgT3V0cHV0TWFwcGVyPiBzdHJ1Y3QgTGF1bmNoS2VybmVscyB7CisgICAgc3RhdGljIHZvaWQgUnVuKGNvbnN0IExoc01hcHBlciYgbGhzLCBjb25zdCBSaHNNYXBwZXImIHJocywgY29uc3QgT3V0cHV0TWFwcGVyJiBvdXRwdXQsIEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGssIGNvbnN0IEdwdURldmljZSYgZGV2aWNlKSB7CisgICAgY29uc3QgSW5kZXggbV9ibG9ja3MgPSAobSArIDYzKSAvIDY0OworICAgIGNvbnN0IEluZGV4IG5fYmxvY2tzID0gKG4gKyA2MykgLyA2NDsKKyAgICBjb25zdCBkaW0zIG51bV9ibG9ja3MobV9ibG9ja3MsIG5fYmxvY2tzLCAxKTsKKyAgICBjb25zdCBkaW0zIGJsb2NrX3NpemUoOCwgOCwgOCk7CisgICAgTEFVTkNIX0NVREFfS0VSTkVMKChFaWdlbkNvbnRyYWN0aW9uS2VybmVsPFNjYWxhciwgSW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXI+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgMCwgZGV2aWNlLCBsaHMsIHJocywgb3V0cHV0LCBtLCBuLCBrKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNNYXBwZXIsIHR5cGVuYW1lIFJoc01hcHBlciwgdHlwZW5hbWUgT3V0cHV0TWFwcGVyPiBzdHJ1Y3QgTGF1bmNoS2VybmVsczxmbG9hdCwgZmxvYXQsIEluZGV4LCBMaHNNYXBwZXIsIFJoc01hcHBlciwgT3V0cHV0TWFwcGVyPiB7CisgICAgc3RhdGljIHZvaWQgUnVuKGNvbnN0IExoc01hcHBlciYgbGhzLCBjb25zdCBSaHNNYXBwZXImIHJocywgY29uc3QgT3V0cHV0TWFwcGVyJiBvdXRwdXQsIEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGssIGNvbnN0IEdwdURldmljZSYgZGV2aWNlKSB7CisgICAgICBpZiAobSA8IDc2OCB8fCBuIDwgNzY4KSB7CisgICAgICAgIGNvbnN0IEluZGV4IG1fYmxvY2tzID0gKG0gKyA2MykgLyA2NDsKKyAgICAgICAgY29uc3QgSW5kZXggbl9ibG9ja3MgPSAobiArIDYzKSAvIDY0OworICAgICAgICBjb25zdCBkaW0zIG51bV9ibG9ja3MobV9ibG9ja3MsIG5fYmxvY2tzLCAxKTsKKyAgICAgICAgY29uc3QgZGltMyBibG9ja19zaXplKDE2LCAxNiwgMSk7CisgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5GbG9hdENvbnRyYWN0aW9uS2VybmVsMTZ4MTY8SW5kZXgsIExoc01hcHBlciwgUmhzTWFwcGVyLCBPdXRwdXRNYXBwZXI+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgMCwgZGV2aWNlLCBsaHMsIHJocywgb3V0cHV0LCBtLCBuLCBrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEluZGV4IG1fYmxvY2tzID0gKG0gKyAxMjcpIC8gMTI4OworICAgICAgICBjb25zdCBJbmRleCBuX2Jsb2NrcyA9IChuICsgNjMpIC8gNjQ7CisgICAgICAgIGNvbnN0IGRpbTMgbnVtX2Jsb2NrcyhtX2Jsb2Nrcywgbl9ibG9ja3MsIDEpOworICAgICAgICBjb25zdCBkaW0zIGJsb2NrX3NpemUoOCwgMzIsIDEpOworICAgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEVpZ2VuRmxvYXRDb250cmFjdGlvbktlcm5lbDxJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlcj4pLCBudW1fYmxvY2tzLCBibG9ja19zaXplLCAwLCBkZXZpY2UsIGxocywgcmhzLCBvdXRwdXQsIG0sIG4sIGspOworICAgICAgfQorICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Ym9vbCBsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGJvb2wgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBib29sIHJoc19pbm5lcl9kaW1fcmVvcmRlcmVkLCBpbnQgQWxpZ25tZW50PgorICB2b2lkIGV2YWxUeXBlZChTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIC8vIGNvbHVtbnMgaW4gbGVmdCBzaWRlLCByb3dzIGluIHJpZ2h0IHNpZGUKKyAgICBjb25zdCBJbmRleCBrID0gdGhpcy0+bV9rX3NpemU7CisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGspCisKKyAgICAvLyByb3dzIGluIGxlZnQgc2lkZQorICAgIGNvbnN0IEluZGV4IG0gPSB0aGlzLT5tX2lfc2l6ZTsKKworICAgIC8vIGNvbHVtbnMgaW4gcmlnaHQgc2lkZQorICAgIGNvbnN0IEluZGV4IG4gPSB0aGlzLT5tX2pfc2l6ZTsKKworICAgIC8vIHplcm8gb3V0IHRoZSByZXN1bHQgYnVmZmVyICh3aGljaCBtdXN0IGJlIG9mIHNpemUgYXQgbGVhc3QgbSAqIG4gKiBzaXplb2YoU2NhbGFyKQorICAgIHRoaXMtPm1fZGV2aWNlLm1lbXNldChidWZmZXIsIDAsIG0gKiBuICogc2l6ZW9mKFNjYWxhcikpOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VGVuc29yQ29udHJhY3Rpb25JbnB1dE1hcHBlcjxMaHNTY2FsYXIsIEluZGV4LCBpbnRlcm5hbDo6TGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEV2YWx1YXRvciwgbGVmdF9ub2NvbnRyYWN0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdF90LCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIFVuYWxpZ25lZD4gTGhzTWFwcGVyOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VGVuc29yQ29udHJhY3Rpb25JbnB1dE1hcHBlcjxSaHNTY2FsYXIsIEluZGV4LCBpbnRlcm5hbDo6UmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRFdmFsdWF0b3IsIHJpZ2h0X25vY29udHJhY3RfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3QsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgVW5hbGlnbmVkPiBSaHNNYXBwZXI7CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIENvbE1ham9yPiBPdXRwdXRNYXBwZXI7CisKKworICAgIC8vIGluaXRpYWxpemUgZGF0YSBtYXBwZXJzCisgICAgTGhzTWFwcGVyIGxocyh0aGlzLT5tX2xlZnRJbXBsLCB0aGlzLT5tX2xlZnRfbm9jb250cmFjdF9zdHJpZGVzLCB0aGlzLT5tX2lfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgIHRoaXMtPm1fbGVmdF9jb250cmFjdGluZ19zdHJpZGVzLCB0aGlzLT5tX2tfc3RyaWRlcyk7CisKKyAgICBSaHNNYXBwZXIgcmhzKHRoaXMtPm1fcmlnaHRJbXBsLCB0aGlzLT5tX3JpZ2h0X25vY29udHJhY3Rfc3RyaWRlcywgdGhpcy0+bV9qX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICB0aGlzLT5tX3JpZ2h0X2NvbnRyYWN0aW5nX3N0cmlkZXMsIHRoaXMtPm1fa19zdHJpZGVzKTsKKworICAgIE91dHB1dE1hcHBlciBvdXRwdXQoYnVmZmVyLCBtKTsKKworICAgIHNldEN1ZGFTaGFyZWRNZW1Db25maWcoY3VkYVNoYXJlZE1lbUJhbmtTaXplRWlnaHRCeXRlKTsKKyAgICBMYXVuY2hLZXJuZWxzPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgTGhzTWFwcGVyLCBSaHNNYXBwZXIsIE91dHB1dE1hcHBlcj46OlJ1bihsaHMsIHJocywgb3V0cHV0LCAgbSwgbiwgaywgdGhpcy0+bV9kZXZpY2UpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1VTRV9HUFUgYW5kIF9fQ1VEQUNDX18KKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX0NVREFfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvbk1hcHBlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvbk1hcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMmNiM2YKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnRyYWN0aW9uTWFwcGVyLmgKQEAgLTAsMCArMSw0NjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05UUkFDVElPTl9NQVBQRVJfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX01BUFBFUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2VudW0geworICBSaHMgPSAwLAorICBMaHMgPSAxCit9OworCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEVpZ2VuIGJsYXNfZGF0YV9tYXBwZXIgY2xhc3MgZm9yIHRlbnNvcnMuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRlbnNvciwgYm9vbCBIYXNSYXdBY2Nlc3M+IHN0cnVjdCBDb2VmZkxvYWRlciB7CisgIGVudW0geworICAgIERpcmVjdE9mZnNldHMgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgQ29lZmZMb2FkZXIoY29uc3QgVGVuc29yJiB0ZW5zb3IpIDogbV90ZW5zb3IodGVuc29yKSB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIHZvaWQgb2Zmc2V0QnVmZmVyKHR5cGVuYW1lIFRlbnNvcjo6SW5kZXgpIHsKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInVuc3VwcG9ydGVkIik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIHR5cGVuYW1lIFRlbnNvcjo6U2NhbGFyIGNvZWZmKHR5cGVuYW1lIFRlbnNvcjo6SW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdGVuc29yLmNvZWZmKGluZGV4KTsgfQorCisgdGVtcGxhdGU8aW50IExvYWRNb2RlPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgdHlwZW5hbWUgVGVuc29yOjpQYWNrZXRSZXR1cm5UeXBlIHBhY2tldCh0eXBlbmFtZSBUZW5zb3I6OkluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fdGVuc29yLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICB9CisKKworIHByaXZhdGU6CisgIGNvbnN0IFRlbnNvciBtX3RlbnNvcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW5zb3I+IHN0cnVjdCBDb2VmZkxvYWRlcjxUZW5zb3IsIHRydWU+IHsKKyAgZW51bSB7CisgICAgRGlyZWN0T2Zmc2V0cyA9IHRydWUKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIENvZWZmTG9hZGVyKGNvbnN0IFRlbnNvciYgdGVuc29yKSA6IG1fZGF0YSh0ZW5zb3IuZGF0YSgpKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdm9pZCBvZmZzZXRCdWZmZXIodHlwZW5hbWUgVGVuc29yOjpJbmRleCBvZmZzZXQpIHsKKyAgICBtX2RhdGEgKz0gb2Zmc2V0OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSB0eXBlbmFtZSBUZW5zb3I6OlNjYWxhciBjb2VmZih0eXBlbmFtZSBUZW5zb3I6OkluZGV4IGluZGV4KSBjb25zdCB7IHJldHVybiBsb2FkQ29uc3RhbnQobV9kYXRhK2luZGV4KTsgfQorCisgdGVtcGxhdGU8aW50IExvYWRNb2RlPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgdHlwZW5hbWUgVGVuc29yOjpQYWNrZXRSZXR1cm5UeXBlIHBhY2tldCh0eXBlbmFtZSBUZW5zb3I6OkluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHRfcm88dHlwZW5hbWUgVGVuc29yOjpQYWNrZXRSZXR1cm5UeXBlLCBMb2FkTW9kZT4obV9kYXRhICsgaW5kZXgpOworICB9CisgcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I6OlNjYWxhciBTY2FsYXI7CisgIGNvbnN0IFNjYWxhciogbV9kYXRhOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IHNpZGUsCisgICAgICAgICB0eXBlbmFtZSBUZW5zb3IsCisgICAgICAgICB0eXBlbmFtZSBub2NvbnRyYWN0X3QsIHR5cGVuYW1lIGNvbnRyYWN0X3QsCisgICAgICAgICBpbnQgcGFja2V0X3NpemUsIGJvb2wgaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGludCBBbGlnbm1lbnQ+CitjbGFzcyBTaW1wbGVUZW5zb3JDb250cmFjdGlvbk1hcHBlciB7CisgIHB1YmxpYzoKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgU2ltcGxlVGVuc29yQ29udHJhY3Rpb25NYXBwZXIoY29uc3QgVGVuc29yJiB0ZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vY29udHJhY3RfdCYgbm9jb250cmFjdF9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2NvbnRyYWN0X3QmIGlqX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0X3QmIGNvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0X3QmIGtfc3RyaWRlcykgOgorICAgICAgbV90ZW5zb3IodGVuc29yKSwKKyAgICAgIG1fbm9jb250cmFjdF9zdHJpZGVzKG5vY29udHJhY3Rfc3RyaWRlcyksCisgICAgICBtX2lqX3N0cmlkZXMoaWpfc3RyaWRlcyksCisgICAgICBtX2NvbnRyYWN0X3N0cmlkZXMoY29udHJhY3Rfc3RyaWRlcyksCisgICAgICBtX2tfc3RyaWRlcyhrX3N0cmlkZXMpIHsgfQorCisgIGVudW0geworICAgIERpcmVjdE9mZnNldHMgPSBDb2VmZkxvYWRlcjxUZW5zb3IsIFRlbnNvcjo6UmF3QWNjZXNzPjo6RGlyZWN0T2Zmc2V0cworICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdm9pZCBvZmZzZXRCdWZmZXIodHlwZW5hbWUgVGVuc29yOjpJbmRleCBvZmZzZXQpIHsKKyAgICBtX3RlbnNvci5vZmZzZXRCdWZmZXIob2Zmc2V0KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaChJbmRleCAvKmkqLykgeyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKShJbmRleCByb3cpIGNvbnN0IHsKKyAgICAvLyBjb2x1bW4gbWFqb3IgYXNzdW1wdGlvbgorICAgIHJldHVybiBvcGVyYXRvcigpKHJvdywgMCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdCB7CisgICAgcmV0dXJuIG1fdGVuc29yLmNvZWZmKGNvbXB1dGVJbmRleChyb3csIGNvbCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb21wdXRlSW5kZXgoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsKKyAgICBjb25zdCBib29sIGxlZnQgPSAoc2lkZSA9PSBMaHMpOworICAgIEluZGV4IG5vY29udHJhY3RfdmFsID0gbGVmdCA/IHJvdyA6IGNvbDsKKyAgICBJbmRleCBsaW5pZHggPSAwOworICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5X3NpemU8bm9jb250cmFjdF90Pjo6dmFsdWUpIC0gMTsgaSA+IDA7IGktLSkgeworICAgICAgY29uc3QgSW5kZXggaWR4ID0gbm9jb250cmFjdF92YWwgLyBtX2lqX3N0cmlkZXNbaV07CisgICAgICBsaW5pZHggKz0gaWR4ICogbV9ub2NvbnRyYWN0X3N0cmlkZXNbaV07CisgICAgICBub2NvbnRyYWN0X3ZhbCAtPSBpZHggKiBtX2lqX3N0cmlkZXNbaV07CisgICAgfQorICAgIGlmIChhcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvcjo6RGltZW5zaW9ucz46OnZhbHVlID4gYXJyYXlfc2l6ZTxjb250cmFjdF90Pjo6dmFsdWUpIHsKKyAgICAgIGlmIChzaWRlID09IExocyAmJiBpbm5lcl9kaW1fY29udGlndW91cykgeworICAgICAgICBlaWdlbl9hc3NlcnQobV9ub2NvbnRyYWN0X3N0cmlkZXNbMF0gPT0gMSk7CisgICAgICAgIGxpbmlkeCArPSBub2NvbnRyYWN0X3ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpbmlkeCArPSBub2NvbnRyYWN0X3ZhbCAqIG1fbm9jb250cmFjdF9zdHJpZGVzWzBdOworICAgICAgfQorICAgIH0KKworICAgIEluZGV4IGNvbnRyYWN0X3ZhbCA9IGxlZnQgPyBjb2wgOiByb3c7CisgICAgaWYoYXJyYXlfc2l6ZTxjb250cmFjdF90Pjo6dmFsdWUgPiAwKSB7CisgICAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihhcnJheV9zaXplPGNvbnRyYWN0X3Q+Ojp2YWx1ZSkgLSAxOyBpID4gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGNvbnRyYWN0X3ZhbCAvIG1fa19zdHJpZGVzW2ldOworICAgICAgICBsaW5pZHggKz0gaWR4ICogbV9jb250cmFjdF9zdHJpZGVzW2ldOworICAgICAgICBjb250cmFjdF92YWwgLT0gaWR4ICogbV9rX3N0cmlkZXNbaV07CisgICAgICB9CisKKyAgICAgIGlmIChzaWRlID09IFJocyAmJiBpbm5lcl9kaW1fY29udGlndW91cykgeworICAgICAgICBlaWdlbl9hc3NlcnQobV9jb250cmFjdF9zdHJpZGVzWzBdID09IDEpOworICAgICAgICBsaW5pZHggKz0gY29udHJhY3RfdmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGluaWR4ICs9IGNvbnRyYWN0X3ZhbCAqIG1fY29udHJhY3Rfc3RyaWRlc1swXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGluaWR4OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleFBhaXI8SW5kZXg+IGNvbXB1dGVJbmRleFBhaXIoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IEluZGV4IGRpc3RhbmNlKSBjb25zdCB7CisgICAgY29uc3QgYm9vbCBsZWZ0ID0gKHNpZGUgPT0gTGhzKTsKKyAgICBJbmRleCBub2NvbnRyYWN0X3ZhbFsyXSA9IHtsZWZ0ID8gcm93IDogY29sLCBsZWZ0ID8gcm93ICsgZGlzdGFuY2UgOiBjb2x9OworICAgIEluZGV4IGxpbmlkeFsyXSA9IHswLCAwfTsKKyAgICBpZiAoYXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3I6OkRpbWVuc2lvbnM+Ojp2YWx1ZSA+IGFycmF5X3NpemU8Y29udHJhY3RfdD46OnZhbHVlKSB7CisgICAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihhcnJheV9zaXplPG5vY29udHJhY3RfdD46OnZhbHVlKSAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IG5vY29udHJhY3RfdmFsWzBdIC8gbV9pal9zdHJpZGVzW2ldOworICAgICAgICBjb25zdCBJbmRleCBpZHgxID0gbm9jb250cmFjdF92YWxbMV0gLyBtX2lqX3N0cmlkZXNbaV07CisgICAgICAgIGxpbmlkeFswXSArPSBpZHgwICogbV9ub2NvbnRyYWN0X3N0cmlkZXNbaV07CisgICAgICAgIGxpbmlkeFsxXSArPSBpZHgxICogbV9ub2NvbnRyYWN0X3N0cmlkZXNbaV07CisgICAgICAgIG5vY29udHJhY3RfdmFsWzBdIC09IGlkeDAgKiBtX2lqX3N0cmlkZXNbaV07CisgICAgICAgIG5vY29udHJhY3RfdmFsWzFdIC09IGlkeDEgKiBtX2lqX3N0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpZiAoc2lkZSA9PSBMaHMgJiYgaW5uZXJfZGltX2NvbnRpZ3VvdXMpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG1fbm9jb250cmFjdF9zdHJpZGVzWzBdID09IDEpOworICAgICAgICBsaW5pZHhbMF0gKz0gbm9jb250cmFjdF92YWxbMF07CisgICAgICAgIGxpbmlkeFsxXSArPSBub2NvbnRyYWN0X3ZhbFsxXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpbmlkeFswXSArPSBub2NvbnRyYWN0X3ZhbFswXSAqIG1fbm9jb250cmFjdF9zdHJpZGVzWzBdOworICAgICAgICBsaW5pZHhbMV0gKz0gbm9jb250cmFjdF92YWxbMV0gKiBtX25vY29udHJhY3Rfc3RyaWRlc1swXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleCBjb250cmFjdF92YWxbMl0gPSB7bGVmdCA/IGNvbCA6IHJvdywgbGVmdCA/IGNvbCA6IHJvdyArIGRpc3RhbmNlfTsKKyAgICBpZiAoYXJyYXlfc2l6ZTxjb250cmFjdF90Pjo6dmFsdWU+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5X3NpemU8Y29udHJhY3RfdD46OnZhbHVlKSAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGNvbnRyYWN0X3ZhbFswXSAvIG1fa19zdHJpZGVzW2ldOworICAgICAgICBjb25zdCBJbmRleCBpZHgxID0gY29udHJhY3RfdmFsWzFdIC8gbV9rX3N0cmlkZXNbaV07CisgICAgICAgIGxpbmlkeFswXSArPSBpZHgwICogbV9jb250cmFjdF9zdHJpZGVzW2ldOworICAgICAgICBsaW5pZHhbMV0gKz0gaWR4MSAqIG1fY29udHJhY3Rfc3RyaWRlc1tpXTsKKyAgICAgICAgY29udHJhY3RfdmFsWzBdIC09IGlkeDAgKiBtX2tfc3RyaWRlc1tpXTsKKyAgICAgICAgY29udHJhY3RfdmFsWzFdIC09IGlkeDEgKiBtX2tfc3RyaWRlc1tpXTsKKyAgICAgIH0KKworICAgICAgaWYgKHNpZGUgPT0gUmhzICYmIGlubmVyX2RpbV9jb250aWd1b3VzKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2NvbnRyYWN0X3N0cmlkZXNbMF0gPT0gMSk7CisgICAgICAgIGxpbmlkeFswXSArPSBjb250cmFjdF92YWxbMF07CisgICAgICAgIGxpbmlkeFsxXSArPSBjb250cmFjdF92YWxbMV07CisgICAgICB9IGVsc2UgeworICAgICAgICBsaW5pZHhbMF0gKz0gY29udHJhY3RfdmFsWzBdICogbV9jb250cmFjdF9zdHJpZGVzWzBdOworICAgICAgICBsaW5pZHhbMV0gKz0gY29udHJhY3RfdmFsWzFdICogbV9jb250cmFjdF9zdHJpZGVzWzBdOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gSW5kZXhQYWlyPEluZGV4PihsaW5pZHhbMF0sIGxpbmlkeFsxXSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIEluZGV4IGZpcnN0QWxpZ25lZChJbmRleCBzaXplKSBjb25zdCB7CisgICAgLy8gT25seSBjbGFpbSBhbGlnbm1lbnQgd2hlbiB3ZSBjYW4gY29tcHV0ZSB0aGUgYWN0dWFsIHN0cmlkZSAoaWUgd2hlbiB3ZSdyZQorICAgIC8vIGRlYWxpbmcgd2l0aCB0aGUgbGhzIHdpdGggaW5uZXJfZGltX2NvbnRpZ3VvdXMuIFRoaXMgaXMgYmVjYXVzZSB0aGUKKyAgICAvLyBtYXRyaXgtdmVjdG9yIHByb2R1Y3QgcmVsaWVzIG9uIHRoZSBzdHJpZGUgd2hlbiBkZWFsaW5nIHdpdGggYWxpZ25lZCBpbnB1dHMuCisgICAgcmV0dXJuIChBbGlnbm1lbnQgPT0gQWxpZ25lZCkgJiYgKHNpZGUgPT0gTGhzKSAmJiBpbm5lcl9kaW1fY29udGlndW91cyA/IDAgOiBzaXplOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgSW5kZXggc3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiAoKHNpZGUgPT0gTGhzKSAmJiBpbm5lcl9kaW1fY29udGlndW91cyAmJiBhcnJheV9zaXplPGNvbnRyYWN0X3Q+Ojp2YWx1ZSA+IDApID8gbV9jb250cmFjdF9zdHJpZGVzWzBdIDogMTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBDb2VmZkxvYWRlcjxUZW5zb3IsIFRlbnNvcjo6UmF3QWNjZXNzPiBtX3RlbnNvcjsKKyAgY29uc3Qgbm9jb250cmFjdF90IG1fbm9jb250cmFjdF9zdHJpZGVzOworICBjb25zdCBub2NvbnRyYWN0X3QgbV9pal9zdHJpZGVzOworICBjb25zdCBjb250cmFjdF90IG1fY29udHJhY3Rfc3RyaWRlczsKKyAgY29uc3QgY29udHJhY3RfdCBtX2tfc3RyaWRlczsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IHNpZGUsCisgICAgICAgICB0eXBlbmFtZSBUZW5zb3IsCisgICAgICAgICB0eXBlbmFtZSBub2NvbnRyYWN0X3QsIHR5cGVuYW1lIGNvbnRyYWN0X3QsCisgICAgICAgICBpbnQgcGFja2V0X3NpemUsIGJvb2wgaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICBib29sIGlubmVyX2RpbV9yZW9yZGVyZWQsIGludCBBbGlnbm1lbnQ+CitjbGFzcyBCYXNlVGVuc29yQ29udHJhY3Rpb25NYXBwZXIgOiBwdWJsaWMgU2ltcGxlVGVuc29yQ29udHJhY3Rpb25NYXBwZXI8U2NhbGFyLCBJbmRleCwgc2lkZSwgVGVuc29yLCBub2NvbnRyYWN0X3QsIGNvbnRyYWN0X3QsIHBhY2tldF9zaXplLCBpbm5lcl9kaW1fY29udGlndW91cywgQWxpZ25tZW50PgoreworIHB1YmxpYzoKKyAgdHlwZWRlZiBTaW1wbGVUZW5zb3JDb250cmFjdGlvbk1hcHBlcjxTY2FsYXIsIEluZGV4LCBzaWRlLCBUZW5zb3IsIG5vY29udHJhY3RfdCwgY29udHJhY3RfdCwgcGFja2V0X3NpemUsIGlubmVyX2RpbV9jb250aWd1b3VzLCBBbGlnbm1lbnQ+IFBhcmVudE1hcHBlcjsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBCYXNlVGVuc29yQ29udHJhY3Rpb25NYXBwZXIoY29uc3QgVGVuc29yJiB0ZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2NvbnRyYWN0X3QmIG5vY29udHJhY3Rfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vY29udHJhY3RfdCYgaWpfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0X3QmIGNvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cmFjdF90JiBrX3N0cmlkZXMpIDoKKyAgUGFyZW50TWFwcGVyKHRlbnNvciwgbm9jb250cmFjdF9zdHJpZGVzLCBpal9zdHJpZGVzLCBjb250cmFjdF9zdHJpZGVzLCBrX3N0cmlkZXMpIHsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yOjpQYWNrZXRSZXR1cm5UeXBlIFBhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6aGFsZiBIYWxmUGFja2V0OworCisgIHRlbXBsYXRlIDxpbnQgQWxpZ25tZW50VHlwZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQgbG9hZFBhY2tldChJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgLy8gd2hvbGUgbWV0aG9kIG1ha2VzIGNvbHVtbiBtYWpvciBhc3N1bXB0aW9uCisKKyAgICAvLyBkb24ndCBuZWVkIHRvIGFkZCBvZmZzZXRzIGZvciBub3cgKGJlY2F1c2Ugb3BlcmF0b3IgaGFuZGxlcyB0aGF0KQorICAgIC8vIGN1cnJlbnQgY29kZSBhc3N1bWVzIHBhY2tldCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChwYWNrZXRfc2l6ZSAlIDIgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIGlmIChUZW5zb3I6OlBhY2tldEFjY2VzcyAmJiBpbm5lcl9kaW1fY29udGlndW91cyAmJiAhaW5uZXJfZGltX3Jlb3JkZXJlZCkgeworICAgICAgY29uc3QgSW5kZXggaW5kZXggPSB0aGlzLT5jb21wdXRlSW5kZXgoaSwgaik7CisgICAgICBlaWdlbl9hc3NlcnQodGhpcy0+Y29tcHV0ZUluZGV4KGkrcGFja2V0X3NpemUtMSwgaikgPT0gaW5kZXggKyBwYWNrZXRfc2l6ZS0xKTsKKyAgICAgIHJldHVybiB0aGlzLT5tX3RlbnNvci50ZW1wbGF0ZSBwYWNrZXQ8QWxpZ25tZW50VHlwZT4oaW5kZXgpOworICAgIH0KKworICAgIGNvbnN0IEluZGV4UGFpcjxJbmRleD4gaW5kZXhQYWlyID0gdGhpcy0+Y29tcHV0ZUluZGV4UGFpcihpLCBqLCBwYWNrZXRfc2l6ZSAtIDEpOworICAgIGNvbnN0IEluZGV4IGZpcnN0ID0gaW5kZXhQYWlyLmZpcnN0OworICAgIGNvbnN0IEluZGV4IGxhc3QgPSBpbmRleFBhaXIuc2Vjb25kOworCisgICAgLy8gV2UgY2FuIGFsd2F5cyBkbyBvcHRpbWl6ZWQgcGFja2V0IHJlYWRzIGZyb20gbGVmdCBoYW5kIHNpZGUgcmlnaHQgbm93LCBiZWNhdXNlCisgICAgLy8gdGhlIHZlcnRpY2FsIG1hdHJpeCBkaW1lbnNpb24gb24gdGhlIGxlZnQgaGFuZCBzaWRlIGlzIG5ldmVyIGNvbnRyYWN0aW5nLgorICAgIC8vIE9uIHRoZSByaWdodCBoYW5kIHNpZGUgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgY29udHJhY3RpbmcgZGltZW5zaW9ucyBtYXkgaGF2ZQorICAgIC8vIGJlZW4gc2h1ZmZsZWQgZmlyc3QuCisgICAgaWYgKFRlbnNvcjo6UGFja2V0QWNjZXNzICYmCisgICAgICAgIChzaWRlID09IExocyB8fCBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxjb250cmFjdF90Pjo6dmFsdWUgPD0gMSB8fCAhaW5uZXJfZGltX3Jlb3JkZXJlZCkgJiYKKyAgICAgICAgKGxhc3QgLSBmaXJzdCkgPT0gKHBhY2tldF9zaXplIC0gMSkpIHsKKworICAgICAgcmV0dXJuIHRoaXMtPm1fdGVuc29yLnRlbXBsYXRlIHBhY2tldDxBbGlnbm1lbnRUeXBlPihmaXJzdCk7CisgICAgfQorCisgICAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhW3BhY2tldF9zaXplXTsKKworICAgIGRhdGFbMF0gPSB0aGlzLT5tX3RlbnNvci5jb2VmZihmaXJzdCk7CisgICAgZm9yIChJbmRleCBrID0gMTsgayA8IHBhY2tldF9zaXplIC0gMTsgayArPSAyKSB7CisgICAgICBjb25zdCBJbmRleFBhaXI8SW5kZXg+IGludGVybmFsX3BhaXIgPSB0aGlzLT5jb21wdXRlSW5kZXhQYWlyKGkgKyBrLCBqLCAxKTsKKyAgICAgIGRhdGFba10gPSB0aGlzLT5tX3RlbnNvci5jb2VmZihpbnRlcm5hbF9wYWlyLmZpcnN0KTsKKyAgICAgIGRhdGFbayArIDFdID0gdGhpcy0+bV90ZW5zb3IuY29lZmYoaW50ZXJuYWxfcGFpci5zZWNvbmQpOworICAgIH0KKyAgICBkYXRhW3BhY2tldF9zaXplIC0gMV0gPSB0aGlzLT5tX3RlbnNvci5jb2VmZihsYXN0KTsKKworICAgIHJldHVybiBwbG9hZDxQYWNrZXQ+KGRhdGEpOworICB9CisKKyAgdGVtcGxhdGUgPGludCBBbGlnbm1lbnRUeXBlPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIEhhbGZQYWNrZXQgbG9hZEhhbGZQYWNrZXQoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIC8vIHdob2xlIG1ldGhvZCBtYWtlcyBjb2x1bW4gbWFqb3IgYXNzdW1wdGlvbgorCisgICAgLy8gZG9uJ3QgbmVlZCB0byBhZGQgb2Zmc2V0cyBmb3Igbm93IChiZWNhdXNlIG9wZXJhdG9yIGhhbmRsZXMgdGhhdCkKKyAgICBjb25zdCBJbmRleCBoYWxmX3BhY2tldF9zaXplID0gdW5wYWNrZXRfdHJhaXRzPEhhbGZQYWNrZXQ+OjpzaXplOworICAgIGlmIChoYWxmX3BhY2tldF9zaXplID09IHBhY2tldF9zaXplKSB7CisgICAgICByZXR1cm4gbG9hZFBhY2tldDxBbGlnbm1lbnRUeXBlPihpLCBqKTsKKyAgICB9CisgICAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhW2hhbGZfcGFja2V0X3NpemVdOworICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBoYWxmX3BhY2tldF9zaXplOyBrKyspIHsKKyAgICAgIGRhdGFba10gPSBvcGVyYXRvcigpKGkgKyBrLCBqKTsKKyAgICB9CisgICAgcmV0dXJuIHBsb2FkPEhhbGZQYWNrZXQ+KGRhdGEpOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBzaWRlLAorICAgICAgICAgdHlwZW5hbWUgVGVuc29yLAorICAgICAgICAgdHlwZW5hbWUgbm9jb250cmFjdF90LCB0eXBlbmFtZSBjb250cmFjdF90LAorICAgICAgICAgYm9vbCBpbm5lcl9kaW1fY29udGlndW91cywKKyAgICAgICAgIGJvb2wgaW5uZXJfZGltX3Jlb3JkZXJlZCwgaW50IEFsaWdubWVudD4KK2NsYXNzIEJhc2VUZW5zb3JDb250cmFjdGlvbk1hcHBlcjxTY2FsYXIsIEluZGV4LCBzaWRlLCBUZW5zb3IsIG5vY29udHJhY3RfdCwgY29udHJhY3RfdCwgMSwgaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGlubmVyX2RpbV9yZW9yZGVyZWQsIEFsaWdubWVudD4gOiBwdWJsaWMgU2ltcGxlVGVuc29yQ29udHJhY3Rpb25NYXBwZXI8U2NhbGFyLCBJbmRleCwgc2lkZSwgVGVuc29yLCBub2NvbnRyYWN0X3QsIGNvbnRyYWN0X3QsIDEsIGlubmVyX2RpbV9jb250aWd1b3VzLCBBbGlnbm1lbnQ+Cit7CisgcHVibGljOgorICB0eXBlZGVmIFNpbXBsZVRlbnNvckNvbnRyYWN0aW9uTWFwcGVyPFNjYWxhciwgSW5kZXgsIHNpZGUsIFRlbnNvciwgbm9jb250cmFjdF90LCBjb250cmFjdF90LCAxLCBpbm5lcl9kaW1fY29udGlndW91cywgQWxpZ25tZW50PiBQYXJlbnRNYXBwZXI7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgQmFzZVRlbnNvckNvbnRyYWN0aW9uTWFwcGVyKGNvbnN0IFRlbnNvciYgdGVuc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9jb250cmFjdF90JiBub2NvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2NvbnRyYWN0X3QmIGlqX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cmFjdF90JiBjb250cmFjdF9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJhY3RfdCYga19zdHJpZGVzKSA6CisgIFBhcmVudE1hcHBlcih0ZW5zb3IsIG5vY29udHJhY3Rfc3RyaWRlcywgaWpfc3RyaWRlcywgY29udHJhY3Rfc3RyaWRlcywga19zdHJpZGVzKSB7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjo6UGFja2V0UmV0dXJuVHlwZSBQYWNrZXQ7CisgIHRlbXBsYXRlIDxpbnQ+IEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IGxvYWRQYWNrZXQoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgZGF0YVsxXTsKKyAgICBkYXRhWzBdID0gdGhpcy0+bV90ZW5zb3IuY29lZmYodGhpcy0+Y29tcHV0ZUluZGV4KGksIGopKTsKKyAgICByZXR1cm4gcGxvYWQ8dHlwZW5hbWUgVGVuc29yOjpQYWNrZXRSZXR1cm5UeXBlPihkYXRhKTsKKyAgfQorICB0ZW1wbGF0ZSA8aW50PiBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldCBsb2FkSGFsZlBhY2tldChJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgcmV0dXJuIGxvYWRQYWNrZXQoaSwgaik7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IHNpZGUsCisgICAgICAgICB0eXBlbmFtZSBUZW5zb3IsCisgICAgICAgICB0eXBlbmFtZSBub2NvbnRyYWN0X3QsIHR5cGVuYW1lIGNvbnRyYWN0X3QsCisgICAgICAgICBpbnQgcGFja2V0X3NpemUsCisgICAgICAgICBib29sIGlubmVyX2RpbV9jb250aWd1b3VzLCBib29sIGlubmVyX2RpbV9yZW9yZGVyZWQsIGludCBBbGlnbm1lbnQ+CitjbGFzcyBUZW5zb3JDb250cmFjdGlvblN1Yk1hcHBlciB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjo6UGFja2V0UmV0dXJuVHlwZSBQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OmhhbGYgSGFsZlBhY2tldDsKKworICB0eXBlZGVmIEJhc2VUZW5zb3JDb250cmFjdGlvbk1hcHBlcjxTY2FsYXIsIEluZGV4LCBzaWRlLCBUZW5zb3IsIG5vY29udHJhY3RfdCwgY29udHJhY3RfdCwgcGFja2V0X3NpemUsIGlubmVyX2RpbV9jb250aWd1b3VzLCBpbm5lcl9kaW1fcmVvcmRlcmVkLCBBbGlnbm1lbnQ+IFBhcmVudE1hcHBlcjsKKyAgdHlwZWRlZiBUZW5zb3JDb250cmFjdGlvblN1Yk1hcHBlcjxTY2FsYXIsIEluZGV4LCBzaWRlLCBUZW5zb3IsIG5vY29udHJhY3RfdCwgY29udHJhY3RfdCwgcGFja2V0X3NpemUsIGlubmVyX2RpbV9jb250aWd1b3VzLCBpbm5lcl9kaW1fcmVvcmRlcmVkLCBBbGlnbm1lbnQ+IFNlbGY7CisgIHR5cGVkZWYgU2VsZiBMaW5lYXJNYXBwZXI7CisKKyAgZW51bSB7CisgICAgLy8gV2UgY2FuIHVzZSBkaXJlY3Qgb2Zmc2V0cyBpZmYgdGhlIHBhcmVudCBtYXBwZXIgc3VwcG9ydHMgdGhlbiBhbmQgd2UgY2FuIGNvbXB1dGUgdGhlIHN0cmlkZXMuCisgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGFsc28gZW5hYmxlIGRpcmVjdCBvZmZzZXRzIGZvciB0aGUgUmhzIGNhc2UuCisgICAgVXNlRGlyZWN0T2Zmc2V0cyA9IFBhcmVudE1hcHBlcjo6RGlyZWN0T2Zmc2V0cyAmJiAoc2lkZSA9PSBMaHMpICYmIGlubmVyX2RpbV9jb250aWd1b3VzICYmIChhcnJheV9zaXplPGNvbnRyYWN0X3Q+Ojp2YWx1ZSA+IDApCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29yQ29udHJhY3Rpb25TdWJNYXBwZXIoY29uc3QgUGFyZW50TWFwcGVyJiBiYXNlX21hcHBlciwgSW5kZXggdmVydF9vZmZzZXQsIEluZGV4IGhvcml6X29mZnNldCkKKyAgICAgIDogbV9iYXNlX21hcHBlcihiYXNlX21hcHBlciksIG1fdmVydF9vZmZzZXQodmVydF9vZmZzZXQpLCBtX2hvcml6X29mZnNldChob3Jpel9vZmZzZXQpIHsKKyAgICAvLyBCYWtlIHRoZSBvZmZzZXRzIGludG8gdGhlIGJ1ZmZlciB1c2VkIGJ5IHRoZSBiYXNlIG1hcHBlciB3aGVuZXZlciBwb3NzaWJsZS4gVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gcmVjb21wdXRlCisgICAgLy8gdGhpcyBvZmZzZXQgZXZlcnkgdGltZSB3ZSBhdHRlbXB0IHRvIGFjY2VzcyBhIGNvZWZmaWNpZW50LgorICAgIGlmIChVc2VEaXJlY3RPZmZzZXRzKSB7CisgICAgICBJbmRleCBzdHJpZGUgPSBtX2Jhc2VfbWFwcGVyLnN0cmlkZSgpOworICAgICAgbV9iYXNlX21hcHBlci5vZmZzZXRCdWZmZXIodmVydF9vZmZzZXQgKyBob3Jpel9vZmZzZXQgKiBzdHJpZGUpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgU2NhbGFyIG9wZXJhdG9yKCkoSW5kZXggaSkgY29uc3QgeworICAgIGlmIChVc2VEaXJlY3RPZmZzZXRzKSB7CisgICAgICByZXR1cm4gbV9iYXNlX21hcHBlcihpLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIoaSArIG1fdmVydF9vZmZzZXQsIG1faG9yaXpfb2Zmc2V0KTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGksIEluZGV4IGopIGNvbnN0IHsKKyAgICBpZiAoVXNlRGlyZWN0T2Zmc2V0cykgeworICAgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIoaSwgaik7CisgICAgfQorICAgIHJldHVybiBtX2Jhc2VfbWFwcGVyKGkgKyBtX3ZlcnRfb2Zmc2V0LCBqICsgbV9ob3Jpel9vZmZzZXQpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBQYWNrZXQgbG9hZFBhY2tldChJbmRleCBpKSBjb25zdCB7CisgICAgaWYgKFVzZURpcmVjdE9mZnNldHMpIHsKKyAgICAgIHJldHVybiBtX2Jhc2VfbWFwcGVyLnRlbXBsYXRlIGxvYWRQYWNrZXQ8QWxpZ25tZW50PihpLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIudGVtcGxhdGUgbG9hZFBhY2tldDxBbGlnbm1lbnQ+KGkgKyBtX3ZlcnRfb2Zmc2V0LCBtX2hvcml6X29mZnNldCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBQYWNrZXQgbG9hZFBhY2tldChJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgaWYgKFVzZURpcmVjdE9mZnNldHMpIHsKKyAgICAgIHJldHVybiBtX2Jhc2VfbWFwcGVyLnRlbXBsYXRlIGxvYWRQYWNrZXQ8QWxpZ25tZW50PihpLCBqKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIudGVtcGxhdGUgbG9hZFBhY2tldDxBbGlnbm1lbnQ+KGkgKyBtX3ZlcnRfb2Zmc2V0LCBqICsgbV9ob3Jpel9vZmZzZXQpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBIYWxmUGFja2V0IGxvYWRIYWxmUGFja2V0KEluZGV4IGkpIGNvbnN0IHsKKyAgICBpZiAoVXNlRGlyZWN0T2Zmc2V0cykgeworICAgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIudGVtcGxhdGUgbG9hZEhhbGZQYWNrZXQ8QWxpZ25tZW50PihpLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIudGVtcGxhdGUgbG9hZEhhbGZQYWNrZXQ8QWxpZ25tZW50PihpICsgbV92ZXJ0X29mZnNldCwgbV9ob3Jpel9vZmZzZXQpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIHN0b3JlUGFja2V0KEluZGV4IGksIFBhY2tldCBwKSBjb25zdCB7CisgICAgaWYgKFVzZURpcmVjdE9mZnNldHMpIHsKKyAgICAgIG1fYmFzZV9tYXBwZXIuc3RvcmVQYWNrZXQoaSwgMCwgcCk7CisgICAgfQorICAgIG1fYmFzZV9tYXBwZXIuc3RvcmVQYWNrZXQoaSArIG1fdmVydF9vZmZzZXQsIG1faG9yaXpfb2Zmc2V0LCBwKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgTGluZWFyTWFwcGVyIGdldExpbmVhck1hcHBlcihJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgaWYgKFVzZURpcmVjdE9mZnNldHMpIHsKKyAgICAgIHJldHVybiBMaW5lYXJNYXBwZXIobV9iYXNlX21hcHBlciwgaSwgaik7CisgICAgfQorICAgIHJldHVybiBMaW5lYXJNYXBwZXIobV9iYXNlX21hcHBlciwgaSArIG1fdmVydF9vZmZzZXQsIGogKyBtX2hvcml6X29mZnNldCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0VCwgaW50IEFsaWdubWVudFR5cGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgUGFja2V0VCBsb2FkKEluZGV4IGkpIGNvbnN0IHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxQYWNrZXRULCBQYWNrZXQ+Ojp2YWx1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgY29uc3QgaW50IEFjdHVhbEFsaWdubWVudCA9IChBbGlnbm1lbnRUeXBlID09IEFsaWduZWQpICYmIChBbGlnbm1lbnQgPT0gQWxpZ25lZCkgPyBBbGlnbmVkIDogVW5hbGlnbmVkOworICAgIGlmIChVc2VEaXJlY3RPZmZzZXRzKSB7CisgICAgIHJldHVybiBtX2Jhc2VfbWFwcGVyLnRlbXBsYXRlIGxvYWRQYWNrZXQ8QWN0dWFsQWxpZ25tZW50PihpLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmFzZV9tYXBwZXIudGVtcGxhdGUgbG9hZFBhY2tldDxBY3R1YWxBbGlnbm1lbnQ+KGkgKyBtX3ZlcnRfb2Zmc2V0LCBtX2hvcml6X29mZnNldCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2wgYWxpZ25lZChJbmRleCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgUGFyZW50TWFwcGVyIG1fYmFzZV9tYXBwZXI7CisgIGNvbnN0IEluZGV4IG1fdmVydF9vZmZzZXQ7CisgIGNvbnN0IEluZGV4IG1faG9yaXpfb2Zmc2V0OworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCB0eXBlbmFtZSBJbmRleCwgaW50IHNpZGUsCisgICAgICAgICB0eXBlbmFtZSBUZW5zb3IsCisgICAgICAgICB0eXBlbmFtZSBub2NvbnRyYWN0X3QsIHR5cGVuYW1lIGNvbnRyYWN0X3QsCisgICAgICAgICBpbnQgcGFja2V0X3NpemUsCisgICAgICAgICBib29sIGlubmVyX2RpbV9jb250aWd1b3VzLCBib29sIGlubmVyX2RpbV9yZW9yZGVyZWQsIGludCBBbGlnbm1lbnQ+CitjbGFzcyBUZW5zb3JDb250cmFjdGlvbklucHV0TWFwcGVyCisgIDogcHVibGljIEJhc2VUZW5zb3JDb250cmFjdGlvbk1hcHBlcjxTY2FsYXJfLCBJbmRleCwgc2lkZSwgVGVuc29yLCBub2NvbnRyYWN0X3QsIGNvbnRyYWN0X3QsIHBhY2tldF9zaXplLCBpbm5lcl9kaW1fY29udGlndW91cywgaW5uZXJfZGltX3Jlb3JkZXJlZCwgQWxpZ25tZW50PiB7CisKKyBwdWJsaWM6CisgIHR5cGVkZWYgU2NhbGFyXyBTY2FsYXI7CisgIHR5cGVkZWYgQmFzZVRlbnNvckNvbnRyYWN0aW9uTWFwcGVyPFNjYWxhciwgSW5kZXgsIHNpZGUsIFRlbnNvciwgbm9jb250cmFjdF90LCBjb250cmFjdF90LCBwYWNrZXRfc2l6ZSwgaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGlubmVyX2RpbV9yZW9yZGVyZWQsIEFsaWdubWVudD4gQmFzZTsKKyAgdHlwZWRlZiBUZW5zb3JDb250cmFjdGlvblN1Yk1hcHBlcjxTY2FsYXIsIEluZGV4LCBzaWRlLCBUZW5zb3IsIG5vY29udHJhY3RfdCwgY29udHJhY3RfdCwgcGFja2V0X3NpemUsIGlubmVyX2RpbV9jb250aWd1b3VzLCBpbm5lcl9kaW1fcmVvcmRlcmVkLCBBbGlnbm1lbnQ+IFN1Yk1hcHBlcjsKKyAgdHlwZWRlZiBTdWJNYXBwZXIgVmVjdG9yTWFwcGVyOworCisgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvckNvbnRyYWN0aW9uSW5wdXRNYXBwZXIoY29uc3QgVGVuc29yJiB0ZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9jb250cmFjdF90JiBub2NvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9jb250cmFjdF90JiBpal9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0X3QmIGNvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJhY3RfdCYga19zdHJpZGVzKQorICAgICAgOiBCYXNlKHRlbnNvciwgbm9jb250cmFjdF9zdHJpZGVzLCBpal9zdHJpZGVzLCBjb250cmFjdF9zdHJpZGVzLCBrX3N0cmlkZXMpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3ViTWFwcGVyIGdldFN1Yk1hcHBlcihJbmRleCBpLCBJbmRleCBqKSBjb25zdCB7CisgICAgcmV0dXJuIFN1Yk1hcHBlcigqdGhpcywgaSwgaik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFZlY3Rvck1hcHBlciBnZXRWZWN0b3JNYXBwZXIoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIHJldHVybiBWZWN0b3JNYXBwZXIoKnRoaXMsIGksIGopOworICB9Cit9OworCisKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05UUkFDVElPTl9NQVBQRVJfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb250cmFjdGlvblRocmVhZFBvb2wuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25UaHJlYWRQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxNmNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udHJhY3Rpb25UaHJlYWRQb29sLmgKQEAgLTAsMCArMSwxMDUyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVFJBQ1RJT05fVEhSRUFEX1BPT0xfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlRSQUNUSU9OX1RIUkVBRF9QT09MX0gKKworLy8gZXZhbHVhdG9yIGZvciB0aHJlYWQgcG9vbCBkZXZpY2UKKyNpZmRlZiBFSUdFTl9VU0VfVEhSRUFEUworCituYW1lc3BhY2UgRWlnZW4geworCisjaWZkZWYgRUlHRU5fVVNFX1NJTVBMRV9USFJFQURfUE9PTAorbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBMaHNNYXBwZXIsIHR5cGVuYW1lIEluZGV4Pgorc3RydWN0IHBhY2tMaHNBcmcgeworICBMaHNTY2FsYXIqIGJsb2NrQTsKKyAgY29uc3QgTGhzTWFwcGVyJiBsaHM7CisgIGNvbnN0IEluZGV4IG1fc3RhcnQ7CisgIGNvbnN0IEluZGV4IGtfc3RhcnQ7CisgIGNvbnN0IEluZGV4IG1jOworICBjb25zdCBJbmRleCBrYzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBSaHNNYXBwZXIsIHR5cGVuYW1lIE91dHB1dE1hcHBlciwgdHlwZW5hbWUgSW5kZXg+CitzdHJ1Y3QgcGFja1Joc0FuZEtlcm5lbEFyZyB7CisgIGNvbnN0IE1heFNpemVWZWN0b3I8TGhzU2NhbGFyKj4qIGJsb2NrQXM7CisgIFJoc1NjYWxhciogYmxvY2tCOworICBjb25zdCBSaHNNYXBwZXImIHJoczsKKyAgT3V0cHV0TWFwcGVyJiBvdXRwdXQ7CisgIGNvbnN0IEluZGV4IG07CisgIGNvbnN0IEluZGV4IGs7CisgIGNvbnN0IEluZGV4IG47CisgIGNvbnN0IEluZGV4IG1jOworICBjb25zdCBJbmRleCBrYzsKKyAgY29uc3QgSW5kZXggbmM7CisgIGNvbnN0IEluZGV4IG51bV90aHJlYWRzOworICBjb25zdCBJbmRleCBudW1fYmxvY2tBczsKKyAgY29uc3QgSW5kZXggbWF4X207CisgIGNvbnN0IEluZGV4IGtfYmxvY2tfaWR4OworICBjb25zdCBJbmRleCBtX2Jsb2NrX2lkeDsKKyAgY29uc3QgSW5kZXggbl9ibG9ja19pZHg7CisgIGNvbnN0IEluZGV4IG1fYmxvY2tzOworICBjb25zdCBJbmRleCBuX2Jsb2NrczsKKyAgTWF4U2l6ZVZlY3RvcjxOb3RpZmljYXRpb24qPioga2VybmVsX25vdGlmaWNhdGlvbnM7CisgIGNvbnN0IE1heFNpemVWZWN0b3I8Tm90aWZpY2F0aW9uKj4qIGxoc19ub3RpZmljYXRpb25zOworICBjb25zdCBib29sIG5lZWRfdG9fcGFjazsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKyNlbmRpZiAgLy8gRUlHRU5fVVNFX1NJTVBMRV9USFJFQURfUE9PTAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRpY2VzLCB0eXBlbmFtZSBMZWZ0QXJnVHlwZSwgdHlwZW5hbWUgUmlnaHRBcmdUeXBlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDb250cmFjdGlvbk9wPEluZGljZXMsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+LCBUaHJlYWRQb29sRGV2aWNlPiA6CisgICAgcHVibGljIFRlbnNvckNvbnRyYWN0aW9uRXZhbHVhdG9yQmFzZTxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udHJhY3Rpb25PcDxJbmRpY2VzLCBMZWZ0QXJnVHlwZSwgUmlnaHRBcmdUeXBlPiwgVGhyZWFkUG9vbERldmljZT4gPiB7CisKKyAgdHlwZWRlZiBUaHJlYWRQb29sRGV2aWNlIERldmljZTsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDb250cmFjdGlvbk9wPEluZGljZXMsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+LCBEZXZpY2U+IFNlbGY7CisgIHR5cGVkZWYgVGVuc29yQ29udHJhY3Rpb25FdmFsdWF0b3JCYXNlPFNlbGY+IEJhc2U7CisKKyAgdHlwZWRlZiBUZW5zb3JDb250cmFjdGlvbk9wPEluZGljZXMsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXI+Ojp0eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisKKyAgZW51bSB7CisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgIH07CisKKyAgLy8gTW9zdCBvZiB0aGUgY29kZSBpcyBhc3N1bWluZyB0aGF0IGJvdGggaW5wdXQgdGVuc29ycyBhcmUgQ29sTWFqb3IuIElmIHRoZQorICAvLyBpbnB1dHMgYXJlIFJvd01ham9yLCB3ZSB3aWxsICJjaGVhdCIgYnkgc3dhcHBpbmcgdGhlIExIUyBhbmQgUkhTOgorICAvLyBJZiB3ZSB3YW50IHRvIGNvbXB1dGUgQSAqIEIgPSBDLCB3aGVyZSBBIGlzIExIUyBhbmQgQiBpcyBSSFMsIHRoZSBjb2RlCisgIC8vIHdpbGwgcHJldGVuZCBCIGlzIExIUyBhbmQgQSBpcyBSSFMuCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgIHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSwgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT46OnR5cGUgRXZhbExlZnRBcmdUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvciksIFJpZ2h0QXJnVHlwZSwgTGVmdEFyZ1R5cGU+Ojp0eXBlIEV2YWxSaWdodEFyZ1R5cGU7CisKKyAgc3RhdGljIGNvbnN0IGludCBMRGltcyA9CisgICAgICBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8RXZhbExlZnRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQgUkRpbXMgPQorICAgICAgaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV2YWxSaWdodEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBDb250cmFjdERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxJbmRpY2VzPjo6dmFsdWU7CisKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgTERpbXM+IGxlZnRfZGltX21hcHBlcl90OworICB0eXBlZGVmIGFycmF5PEluZGV4LCBSRGltcz4gcmlnaHRfZGltX21hcHBlcl90OworCisgIHR5cGVkZWYgYXJyYXk8SW5kZXgsIENvbnRyYWN0RGltcz4gY29udHJhY3RfdDsKKyAgdHlwZWRlZiBhcnJheTxJbmRleCwgTERpbXMgLSBDb250cmFjdERpbXM+IGxlZnRfbm9jb250cmFjdF90OworICB0eXBlZGVmIGFycmF5PEluZGV4LCBSRGltcyAtIENvbnRyYWN0RGltcz4gcmlnaHRfbm9jb250cmFjdF90OworCisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IExEaW1zICsgUkRpbXMgLSAyICogQ29udHJhY3REaW1zOworCisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIC8vIHR5cGVkZWZzIG5lZWRlZCBpbiBldmFsVG8KKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIEV2YWxMZWZ0QXJnVHlwZTo6U2NhbGFyPjo6dHlwZSBMaHNTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBFdmFsUmlnaHRBcmdUeXBlOjpTY2FsYXI+Ojp0eXBlIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VicF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+IFRyYWl0czsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxFdmFsTGVmdEFyZ1R5cGUsIERldmljZT4gTGVmdEV2YWx1YXRvcjsKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbFJpZ2h0QXJnVHlwZSwgRGV2aWNlPiBSaWdodEV2YWx1YXRvcjsKKworICBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKSA6CisgICAgICBCYXNlKG9wLCBkZXZpY2UpIHt9CisKKyNpZm5kZWYgRUlHRU5fVVNFX1NJTVBMRV9USFJFQURfUE9PTAorICB0ZW1wbGF0ZSA8Ym9vbCBsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGJvb2wgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLAorICAgICAgICAgICAgYm9vbCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgaW50IEFsaWdubWVudD4KKyAgdm9pZCBldmFsUHJvZHVjdChTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIHR5cGVkZWYKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBFdmFsTGVmdEFyZ1R5cGU6OlNjYWxhcj46OnR5cGUKKyAgICAgICAgICAgIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgRXZhbFJpZ2h0QXJnVHlwZTo6U2NhbGFyPjo6dHlwZQorICAgICAgICAgICAgUmhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmdlYnBfdHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPiBUcmFpdHM7CisgICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbExlZnRBcmdUeXBlLCBEZXZpY2U+IExlZnRFdmFsdWF0b3I7CisgICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8RXZhbFJpZ2h0QXJnVHlwZSwgRGV2aWNlPiBSaWdodEV2YWx1YXRvcjsKKyAgICB0eXBlZGVmIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbklucHV0TWFwcGVyPAorICAgICAgICBMaHNTY2FsYXIsIEluZGV4LCBpbnRlcm5hbDo6TGhzLCBMZWZ0RXZhbHVhdG9yLCBsZWZ0X25vY29udHJhY3RfdCwKKyAgICAgICAgY29udHJhY3RfdCwgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSwKKyAgICAgICAgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBmYWxzZSwgVW5hbGlnbmVkPgorICAgICAgICBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VGVuc29yQ29udHJhY3Rpb25JbnB1dE1hcHBlcjwKKyAgICAgICAgUmhzU2NhbGFyLCBJbmRleCwgaW50ZXJuYWw6OlJocywgUmlnaHRFdmFsdWF0b3IsIHJpZ2h0X25vY29udHJhY3RfdCwKKyAgICAgICAgY29udHJhY3RfdCwgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSwKKyAgICAgICAgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgVW5hbGlnbmVkPgorICAgICAgICBSaHNNYXBwZXI7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBDb2xNYWpvcj4gT3V0cHV0TWFwcGVyOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fcGFja19saHM8TGhzU2NhbGFyLCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIExoc01hcHBlcjo6U3ViTWFwcGVyLCBUcmFpdHM6Om1yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXRzOjpMaHNQcm9ncmVzcywgQ29sTWFqb3I+CisgICAgICAgIExoc1BhY2tlcjsKKyAgICB0eXBlZGVmIGludGVybmFsOjpnZW1tX3BhY2tfcmhzPAorICAgICAgICBSaHNTY2FsYXIsIEluZGV4LCB0eXBlbmFtZSBSaHNNYXBwZXI6OlN1Yk1hcHBlciwgVHJhaXRzOjpuciwgQ29sTWFqb3I+CisgICAgICAgIFJoc1BhY2tlcjsKKyAgICB0eXBlZGVmIGludGVybmFsOjpnZWJwX2tlcm5lbDxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE91dHB1dE1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBmYWxzZSwgZmFsc2U+CisgICAgICAgIEdlYnBLZXJuZWw7CisKKyAgICBjb25zdCBJbmRleCBtID0gdGhpcy0+bV9pX3NpemU7CisgICAgY29uc3QgSW5kZXggbiA9IHRoaXMtPm1fal9zaXplOworICAgIGNvbnN0IEluZGV4IGsgPSB0aGlzLT5tX2tfc2l6ZTsKKyAgICBpZiAobSA9PSAwIHx8IG4gPT0gMCB8fCBrID09IDApIHJldHVybjsKKworICAgIC8vIENvbXB1dGUgYSBzZXQgb2YgYWxnb3JpdGhtIHBhcmFtZXRlcnM6CisgICAgLy8gLSBrZXJuZWwgYmxvY2sgc2l6ZXMgKGJtLCBibiwgYmspCisgICAgLy8gLSB0YXNrIGdyYWluIHNpemVzIChudW1iZXIgb2Yga2VybmVscyBleGVjdXRlZCBwZXIgdGFzazogZ20sIGduKQorICAgIC8vIC0gbnVtYmVyIG9mIHRocmVhZHMKKyAgICAvLyAtIHNoYXJkaW5nIGJ5IHJvdy9jb2x1bW4KKyAgICAvLyAtIHBhcmFsbGVsIHBhY2tpbmcgb3IgZmlyc3QgbGhzIHRoZW4gcmhzCisgICAgLy8gYW5kIHNvbWUgZGVyaXZlZCBwYXJhbWV0ZXJzOgorICAgIC8vIC0gbnVtYmVyIG9mIHRhc2tzIChubSwgbm4sIG5rKQorICAgIC8vIC0gbnVtYmVyIG9mIGtlcm5lbHMgKG5tMCwgbm4wKQorICAgIC8vIFVuZm9ydHVuYXRlbHksIGFsbCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB0aWdodGx5IGludGVyZGVwZW5kZW50LgorICAgIC8vIFNvIGluIHNvbWUgY2FzZXMgd2UgZmlyc3QgY29tcHV0ZSBhcHByb3hpbWF0ZSB2YWx1ZXMsIHRoZW4gY29tcHV0ZSBvdGhlcgorICAgIC8vIHZhbHVlcyBiYXNlZCBvbiB0aGVzZSBhcHByb3hpbWF0aW9ucyBhbmQgdGhlbiByZWZpbmUgdGhlIGFwcHJveGltYXRpb25zLgorCisgICAgLy8gVGhlcmUgYXJlIGxvdHMgb2YgaGV1cmlzdGljcyBoZXJlLiBUaGVyZSBpcyBzb21lIHJlYXNvbmluZyBiZWhpbmQgdGhlbSwKKyAgICAvLyBidXQgdWx0aW1hdGVseSB0aGV5IGFyZSBqdXN0IHR1bmVkIG9uIGNvbnRyYWN0aW9uIGJlbmNobWFya3MgZm9yCisgICAgLy8gZGlmZmVyZW50IGlucHV0IGNvbmZpZ3VyYXRpb25zLCB0aHJlYWQgY291bnRzIGFuZCBpbnN0cnVjdGlvbiBzZXRzLgorICAgIC8vIFNvIGZlZWwgZnJlZSB0byBxdWVzdGlvbiBhbnkgb2YgdGhlbS4KKworICAgIC8vIENvbXB1dGUgd2hldGhlciB3ZSB3YW50IHRvIHNoYXJkIGJ5IHJvdyBvciBieSBjb2x1bW4uCisgICAgLy8gVGhpcyBpcyBhIGZpcnN0IGFwcHJveGltYXRpb24sIGl0IHdpbGwgYmUgcmVmaW5lZCBsYXRlci4gU2luY2Ugd2UgZG9uJ3QKKyAgICAvLyBrbm93IG51bWJlciBvZiB0aHJlYWRzIHlldCB3ZSB1c2UgMiwgYmVjYXVzZSB3aGF0J3Mgd2UgYXJlIG1vc3QKKyAgICAvLyBpbnRlcmVzdGVkIGluIGF0IHRoaXMgcG9pbnQgaXMgd2hldGhlciBpdCBtYWtlcyBzZW5zZSB0byB1c2UKKyAgICAvLyBwYXJhbGxlbGl6YXRpb24gYXQgYWxsIG9yIG5vdC4KKyAgICBib29sIHNoYXJkX2J5X2NvbCA9IHNoYXJkQnlDb2wobSwgbiwgMik7CisKKyAgICAvLyBGaXJzdCBhcHByb3hpbWF0aW9uIG9mIGtlcm5lbCBibG9ja2luZyBzaXplcy4KKyAgICAvLyBBZ2Fpbiwgd2UgZG9uJ3Qga25vdyBudW1iZXIgb2YgdGhyZWFkcyB5ZXQsIHNvIHdlIHVzZSAyLgorICAgIEluZGV4IGJtLCBibiwgYms7CisgICAgaWYgKHNoYXJkX2J5X2NvbCkgeworICAgICAgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uQmxvY2tpbmc8TGhzTWFwcGVyLCBSaHNNYXBwZXIsIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlNoYXJkQnlDb2w+CisgICAgICAgICAgYmxvY2tpbmcoaywgbSwgbiwgMik7CisgICAgICBibSA9IGJsb2NraW5nLm1jKCk7CisgICAgICBibiA9IGJsb2NraW5nLm5jKCk7CisgICAgICBiayA9IGJsb2NraW5nLmtjKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbkJsb2NraW5nPExoc01hcHBlciwgUmhzTWFwcGVyLCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpTaGFyZEJ5Um93PgorICAgICAgICAgIGJsb2NraW5nKGssIG0sIG4sIDIpOworICAgICAgYm0gPSBibG9ja2luZy5tYygpOworICAgICAgYm4gPSBibG9ja2luZy5uYygpOworICAgICAgYmsgPSBibG9ja2luZy5rYygpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgb3B0aW1hbCBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAvLyBOb3RlOiB3ZSB1c2UgYmsgaW5zdGVhZCBvZiBrIGhlcmUgYmVjYXVzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhbW91bnQgb2YKKyAgICAvLyBfcGFyYWxsZWxpemFibGVfIGNvbXB1dGF0aW9ucywgYW5kIGNvbXB1dGF0aW9ucyBhcmUgbm90IHBhcmFsbGVsaXphYmxlCisgICAgLy8gYWNyb3NzIGsgZGltZW5zaW9uLgorICAgIGNvbnN0IFRlbnNvck9wQ29zdCBjb3N0ID0KKyAgICAgICAgY29udHJhY3Rpb25Db3N0KG0sIG4sIGJtLCBibiwgYmssIHNoYXJkX2J5X2NvbCwgZmFsc2UpOworICAgIGludCBudW1fdGhyZWFkcyA9IFRlbnNvckNvc3RNb2RlbDxUaHJlYWRQb29sRGV2aWNlPjo6bnVtVGhyZWFkcygKKyAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihuKSAqIG0sIGNvc3QsIHRoaXMtPm1fZGV2aWNlLm51bVRocmVhZHMoKSk7CisKKyAgICAvLyBUT0RPKGR2eXVrb3YpOiB0aGlzIGlzIGEgc3RvcC1nYXAgdG8gcHJldmVudCByZWdyZXNzaW9ucyB3aGlsZSB0aGUgY29zdAorICAgIC8vIG1vZGVsIGlzIG5vdCB0dW5lZC4gUmVtb3ZlIHRoaXMgd2hlbiB0aGUgY29zdCBtb2RlbCBpcyB0dW5lZC4KKyAgICBpZiAobiA9PSAxKSBudW1fdGhyZWFkcyA9IDE7CisKKyAgICBpZiAobnVtX3RocmVhZHMgPT0gMSkgeworICAgICAgLy8gVGhlIHNpbmdsZS10aHJlYWRlZCBhbGdvcml0aG0gc2hvdWxkIGJlIGZhc3RlciBpbiB0aGlzIGNhc2UuCisgICAgICBpZiAobiA9PSAxKQorICAgICAgICB0aGlzLT50ZW1wbGF0ZSBldmFsR2VtdjxsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbm5lcl9kaW1fY29udGlndW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2lubmVyX2RpbV9yZW9yZGVyZWQsIEFsaWdubWVudD4oYnVmZmVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhpcy0+dGVtcGxhdGUgZXZhbEdlbW08bGhzX2lubmVyX2RpbV9jb250aWd1b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbm5lcl9kaW1fcmVvcmRlcmVkLCBBbGlnbm1lbnQ+KGJ1ZmZlcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgd2Uga25vdyBudW1iZXIgb2YgdGhyZWFkcywgcmVjYWxjdWxhdGUgc2hhcmRpbmcgYW5kIGJsb2NraW5nLgorICAgIHNoYXJkX2J5X2NvbCA9IHNoYXJkQnlDb2wobSwgbiwgbnVtX3RocmVhZHMpOworICAgIGlmIChzaGFyZF9ieV9jb2wpIHsKKyAgICAgIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbkJsb2NraW5nPExoc01hcHBlciwgUmhzTWFwcGVyLCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpTaGFyZEJ5Q29sPgorICAgICAgICAgIGJsb2NraW5nKGssIG0sIG4sIG51bV90aHJlYWRzKTsKKyAgICAgIGJtID0gYmxvY2tpbmcubWMoKTsKKyAgICAgIGJuID0gYmxvY2tpbmcubmMoKTsKKyAgICAgIGJrID0gYmxvY2tpbmcua2MoKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uQmxvY2tpbmc8TGhzTWFwcGVyLCBSaHNNYXBwZXIsIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlNoYXJkQnlSb3c+CisgICAgICAgICAgYmxvY2tpbmcoaywgbSwgbiwgbnVtX3RocmVhZHMpOworICAgICAgYm0gPSBibG9ja2luZy5tYygpOworICAgICAgYm4gPSBibG9ja2luZy5uYygpOworICAgICAgYmsgPSBibG9ja2luZy5rYygpOworICAgIH0KKworICAgIC8vIE51bWJlciBvZiBrZXJuZWxzIGZvciBlYWNoIGRpbWVuc2lvbi4KKyAgICBJbmRleCBubTAgPSBkaXZ1cChtLCBibSk7CisgICAgSW5kZXggbm4wID0gZGl2dXAobiwgYm4pOworICAgIEluZGV4IG5rID0gZGl2dXAoaywgYmspOworCisgICAgLy8gQ2FsY3VsYXRlIHRhc2sgZ3JhaW4gc2l6ZSAobnVtYmVyIG9mIGtlcm5lbHMgZXhlY3V0ZWQgcGVyIHRhc2spLgorICAgIC8vIFRoaXMgdGFzayBzaXplIGNvYXJzZW5pbmcgc2VydmVzIHR3byBwdXJwb3NlczoKKyAgICAvLyAxLiBJdCByZWR1Y2VzIHBlci10YXNrIG92ZXJoZWFkcyBpbmNsdWRpbmcgc3luY2hyb25pemF0aW9uIG92ZXJoZWFkcy4KKyAgICAvLyAyLiBJdCBhbGxvd3MgdG8gdXNlIGNhY2hlcyBiZXR0ZXIgKHJldXNlIHRoZSBzYW1lIHBhY2tlZCByaHMgaW4gc2V2ZXJhbAorICAgIC8vIGNvbnNlY3V0aXZlIGtlcm5lbHMpLgorICAgIEluZGV4IGdtID0gMTsKKyAgICBJbmRleCBnbiA9IDE7CisgICAgLy8gSWYgd2UgYXJlIHNoYXJkaW5nIGJ5IGNvbHVtbiwgdGhlbiB3ZSBwcmVmZXIgdG8gcmVkdWNlIHJvd3MgZmlyc3QuCisgICAgaWYgKHNoYXJkX2J5X2NvbCkgeworICAgICAgZ20gPSBjb2Fyc2VuTShtLCBuLCBibSwgYm4sIGJrLCBnbiwgbnVtX3RocmVhZHMsIHNoYXJkX2J5X2NvbCk7CisgICAgICBnbiA9IGNvYXJzZW5OKG0sIG4sIGJtLCBibiwgYmssIGdtLCBudW1fdGhyZWFkcywgc2hhcmRfYnlfY29sKTsKKyAgICB9IGVsc2UgeworICAgICAgZ24gPSBjb2Fyc2VuTihtLCBuLCBibSwgYm4sIGJrLCBnbSwgbnVtX3RocmVhZHMsIHNoYXJkX2J5X2NvbCk7CisgICAgICBnbSA9IGNvYXJzZW5NKG0sIG4sIGJtLCBibiwgYmssIGduLCBudW1fdGhyZWFkcywgc2hhcmRfYnlfY29sKTsKKyAgICB9CisgICAgLy8gTnVtYmVyIG9mIHRhc2tzIGluIGVhY2ggZGltZW5zaW9uLgorICAgIEluZGV4IG5tID0gZGl2dXAobm0wLCBnbSk7CisgICAgSW5kZXggbm4gPSBkaXZ1cChubjAsIGduKTsKKworICAgIC8vIExhc3QgYnkgbm90IGxlYXN0LCBkZWNpZGUgd2hldGhlciB3ZSB3YW50IHRvIGlzc3VlIGJvdGggbGhzIGFuZCByaHMKKyAgICAvLyBwYWNraW5nIGluIHBhcmFsbGVsOyBvciBpc3N1ZSBsaHMgcGFja2luZyBmaXJzdCwgYW5kIHRoZW4gaXNzdWUgcmhzCisgICAgLy8gcGFja2luZyB3aGVuIGxocyBwYWNraW5nIGNvbXBsZXRlcyAoZm9yICFzaGFyZF9ieV9jb2wgbGhzIGFuZCByaHMgYXJlCisgICAgLy8gc3dhcHBlZCkuIFBhcmFsbGVsIHBhY2tpbmcgYWxsb3dzIG1vcmUgcGFyYWxsZWxpc20gKGZvciBib3RoIHBhY2tpbmcgYW5kCisgICAgLy8ga2VybmVscyksIHdoaWxlIHNlcXVlbnRpYWwgcGFja2luZyBwcm92aWRlcyBiZXR0ZXIgbG9jYWxpdHkgKG9uY2UKKyAgICAvLyBhIHRocmVhZCBmaW5pc2hlcyByaHMgcGFja2luZyBpdCBwcm9jZWVkIHRvIGtlcm5lbHMgd2l0aCB0aGF0IHJocykuCisgICAgLy8gRmlyc3QsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHBhcmFsbGVsIHBhY2tpbmcgaWYgdGhlcmUgYXJlIGZldyB0YXNrcy4KKyAgICBib29sIHBhcmFsbGVsX3BhY2sgPSBudW1fdGhyZWFkcyA+PSBubSAqIG5uOworICAgIC8vIEFsc28gZG8gcGFyYWxsZWwgcGFja2luZyBpZiBhbGwgZGF0YSBmaXRzIGludG8gTDIkLgorICAgIGlmIChtICogYmsgKiBJbmRleChzaXplb2YoTGhzU2NhbGFyKSkgKyBuICogYmsgKiBJbmRleChzaXplb2YoUmhzU2NhbGFyKSkgPD0KKyAgICAgICAgbDJDYWNoZVNpemUoKSAqIG51bV90aHJlYWRzKQorICAgICAgcGFyYWxsZWxfcGFjayA9IHRydWU7CisgICAgLy8gQnV0IGRvbid0IGRvIGl0IGlmIHdlIHdpbGwgdXNlIGVhY2ggcmhzIG9ubHkgb25jZS4gTG9jYWxpdHkgc2VlbXMgdG8gYmUKKyAgICAvLyBtb3JlIGltcG9ydGFudCBpbiB0aGlzIGNhc2UuCisgICAgaWYgKChzaGFyZF9ieV9jb2wgPyBubSA6IG5uKSA9PSAxKSBwYXJhbGxlbF9wYWNrID0gZmFsc2U7CisKKyAgICBMaHNNYXBwZXIgbGhzKHRoaXMtPm1fbGVmdEltcGwsIHRoaXMtPm1fbGVmdF9ub2NvbnRyYWN0X3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICB0aGlzLT5tX2lfc3RyaWRlcywgdGhpcy0+bV9sZWZ0X2NvbnRyYWN0aW5nX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICB0aGlzLT5tX2tfc3RyaWRlcyk7CisKKyAgICBSaHNNYXBwZXIgcmhzKHRoaXMtPm1fcmlnaHRJbXBsLCB0aGlzLT5tX3JpZ2h0X25vY29udHJhY3Rfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgIHRoaXMtPm1fal9zdHJpZGVzLCB0aGlzLT5tX3JpZ2h0X2NvbnRyYWN0aW5nX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICB0aGlzLT5tX2tfc3RyaWRlcyk7CisKKyAgICBDb250ZXh0PExoc1BhY2tlciwgUmhzUGFja2VyLCBHZWJwS2VybmVsLCBMaHNNYXBwZXIsIFJoc01hcHBlciwKKyAgICAgICAgICAgIE91dHB1dE1hcHBlcj4odGhpcy0+bV9kZXZpY2UsIG51bV90aHJlYWRzLCBsaHMsIHJocywgYnVmZmVyLCBtLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrLCBibSwgYm4sIGJrLCBubSwgbm4sIG5rLCBnbSwgZ24sIG5tMCwgbm4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZF9ieV9jb2wsIHBhcmFsbGVsX3BhY2spCisgICAgICAgIC5ydW4oKTsKKyAgfQorCisgIC8vIENvbnRleHQgY29vcmRpbmF0ZXMgYSBzaW5nbGUgcGFyYWxsZWwgZ2VtbSBvcGVyYXRpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNQYWNrZXIsIHR5cGVuYW1lIFJoc1BhY2tlciwgdHlwZW5hbWUgR2VicEtlcm5lbCwKKyAgICAgICAgICAgIHR5cGVuYW1lIExoc01hcHBlciwgdHlwZW5hbWUgUmhzTWFwcGVyLCB0eXBlbmFtZSBPdXRwdXRNYXBwZXI+CisgIGNsYXNzIENvbnRleHQgeworICAgcHVibGljOgorICAgIENvbnRleHQoY29uc3QgRGV2aWNlJiBkZXZpY2UsIGludCBudW1fdGhyZWFkcywgTGhzTWFwcGVyJiBsaHMsCisgICAgICAgICAgICBSaHNNYXBwZXImIHJocywgU2NhbGFyKiBidWZmZXIsIEluZGV4IHRtLCBJbmRleCB0biwgSW5kZXggdGssIEluZGV4IGJtLAorICAgICAgICAgICAgSW5kZXggYm4sIEluZGV4IGJrLCBJbmRleCBubSwgSW5kZXggbm4sIEluZGV4IG5rLCBJbmRleCBnbSwKKyAgICAgICAgICAgIEluZGV4IGduLCBJbmRleCBubTAsIEluZGV4IG5uMCwgYm9vbCBzaGFyZF9ieV9jb2wsCisgICAgICAgICAgICBib29sIHBhcmFsbGVsX3BhY2spCisgICAgICAgIDogZGV2aWNlXyhkZXZpY2UpLAorICAgICAgICAgIGxoc18obGhzKSwKKyAgICAgICAgICByaHNfKHJocyksCisgICAgICAgICAgYnVmZmVyXyhidWZmZXIpLAorICAgICAgICAgIG91dHB1dF8oYnVmZmVyLCB0bSksCisgICAgICAgICAgbnVtX3RocmVhZHNfKG51bV90aHJlYWRzKSwKKyAgICAgICAgICBzaGFyZF9ieV9jb2xfKHNoYXJkX2J5X2NvbCksCisgICAgICAgICAgcGFyYWxsZWxfcGFja18ocGFyYWxsZWxfcGFjayksCisgICAgICAgICAgbV8odG0pLAorICAgICAgICAgIG5fKHRuKSwKKyAgICAgICAgICBrXyh0ayksCisgICAgICAgICAgYm1fKGJtKSwKKyAgICAgICAgICBibl8oYm4pLAorICAgICAgICAgIGJrXyhiayksCisgICAgICAgICAgbm1fKG5tKSwKKyAgICAgICAgICBubl8obm4pLAorICAgICAgICAgIG5rXyhuayksCisgICAgICAgICAgZ21fKGdtKSwKKyAgICAgICAgICBnbl8oZ24pLAorICAgICAgICAgIG5tMF8obm0wKSwKKyAgICAgICAgICBubjBfKG5uMCkKKyAgeworICAgICAgZm9yIChJbmRleCB4ID0gMDsgeCA8IFA7IHgrKykgeworICAgICAgICAvLyBOb3JtYWwgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgZm9yIGsgc2xpY2Ugc3dpdGNoIGlzCisgICAgICAgIC8vIG5tXyArIG5uXyArIG5tXyAqIG5uXy4gSG93ZXZlciwgZmlyc3QgUCAtIDEgc2xpY2VzIHdpbGwgcmVjZWl2ZSBvbmx5CisgICAgICAgIC8vIG5tXyArIG5uXyBub3RpZmljYXRpb25zLCBiZWNhdXNlIHRoZXkgd2lsbCBub3QgcmVjZWl2ZSBub3RpZmljYXRpb25zCisgICAgICAgIC8vIGZyb20gcHJlY2VlZGluZyBrZXJuZWxzLgorICAgICAgICBzdGF0ZV9zd2l0Y2hfW3hdID0KKyAgICAgICAgICAgIHggPT0gMAorICAgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICAgIDogKHBhcmFsbGVsX3BhY2tfID8gbm5fICsgbm1fIDogKHNoYXJkX2J5X2NvbF8gPyBubl8gOiBubV8pKSArCisgICAgICAgICAgICAgICAgICAgICAgKHggPT0gUCAtIDEgPyBubV8gKiBubl8gOiAwKTsKKyAgICAgICAgc3RhdGVfcGFja2luZ19yZWFkeV9beF0gPQorICAgICAgICAgICAgcGFyYWxsZWxfcGFja18gPyAwIDogKHNoYXJkX2J5X2NvbF8gPyBubV8gOiBubl8pOworICAgICAgICBzdGF0ZV9rZXJuZWxfW3hdID0gbmV3IHN0ZDo6YXRvbWljPHVpbnQ4X3Q+KltubV9dOworICAgICAgICBmb3IgKEluZGV4IG0gPSAwOyBtIDwgbm1fOyBtKyspIHsKKyAgICAgICAgICBzdGF0ZV9rZXJuZWxfW3hdW21dID0gbmV3IHN0ZDo6YXRvbWljPHVpbnQ4X3Q+W25uX107CisgICAgICAgICAgLy8gS2VybmVscyBnZW5lcmFsbHkgcmVjZWl2ZSAzIG5vdGlmaWNhdGlvbnMgKHByZXZpb3VzIGtlcm5lbCArIDIKKyAgICAgICAgICAvLyBwYWNraW5nKSwgYnV0IHRoZSBmaXJzdCBzbGljZSB3b24ndCBnZXQgbm90aWZpY2F0aW9ucyBmcm9tIHByZXZpb3VzCisgICAgICAgICAgLy8ga2VybmVscy4KKyAgICAgICAgICBmb3IgKEluZGV4IG4gPSAwOyBuIDwgbm5fOyBuKyspCisgICAgICAgICAgICBzdGF0ZV9rZXJuZWxfW3hdW21dW25dLnN0b3JlKAorICAgICAgICAgICAgICAgICh4ID09IDAgPyAwIDogMSkgKyAocGFyYWxsZWxfcGFja18gPyAyIDogMSksCisgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBwYWNrZWQgcmhzL2xocyBtYXRyaWNlcy4KKyAgICAgIHNpemVfdCBhbGlnbiA9IG51bWV4dDo6bWF4aShFSUdFTl9NQVhfQUxJR05fQllURVMsIDEpOworICAgICAgc2l6ZV90IGxoc19zaXplID0KKyAgICAgICAgICBkaXZ1cDxzaXplX3Q+KGJtXyAqIGJrXyAqIHNpemVvZihMaHNTY2FsYXIpLCBhbGlnbikgKiBhbGlnbjsKKyAgICAgIHNpemVfdCByaHNfc2l6ZSA9CisgICAgICAgICAgZGl2dXA8c2l6ZV90Pihibl8gKiBia18gKiBzaXplb2YoUmhzU2NhbGFyKSwgYWxpZ24pICogYWxpZ247CisgICAgICBwYWNrZWRfbWVtXyA9IHN0YXRpY19jYXN0PGNoYXIqPihpbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgKG5tMF8gKiBsaHNfc2l6ZSArIG5uMF8gKiByaHNfc2l6ZSkgKiBzdGQ6Om1pbjxzaXplX3Q+KG5rXywgUCAtIDEpKSk7CisgICAgICBjaGFyKiBtZW0gPSBzdGF0aWNfY2FzdDxjaGFyKj4ocGFja2VkX21lbV8pOworICAgICAgZm9yIChJbmRleCB4ID0gMDsgeCA8IG51bWV4dDo6bWluaTxJbmRleD4obmtfLCBQIC0gMSk7IHgrKykgeworICAgICAgICBwYWNrZWRfbGhzX1t4XS5yZXNpemUobm0wXyk7CisgICAgICAgIGZvciAoSW5kZXggbSA9IDA7IG0gPCBubTBfOyBtKyspIHsKKyAgICAgICAgICBwYWNrZWRfbGhzX1t4XVttXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TGhzU2NhbGFyKj4obWVtKTsKKyAgICAgICAgICBtZW0gKz0gbGhzX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgcGFja2VkX3Joc19beF0ucmVzaXplKG5uMF8pOworICAgICAgICBmb3IgKEluZGV4IG4gPSAwOyBuIDwgbm4wXzsgbisrKSB7CisgICAgICAgICAgcGFja2VkX3Joc19beF1bbl0gPSByZWludGVycHJldF9jYXN0PFJoc1NjYWxhcio+KG1lbSk7CisgICAgICAgICAgbWVtICs9IHJoc19zaXplOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgfkNvbnRleHQoKSB7CisgICAgICBmb3IgKEluZGV4IHggPSAwOyB4IDwgUDsgeCsrKSB7CisgICAgICAgIGZvciAoSW5kZXggbSA9IDA7IG0gPCBubV87IG0rKykgZGVsZXRlW10gc3RhdGVfa2VybmVsX1t4XVttXTsKKyAgICAgICAgZGVsZXRlW10gc3RhdGVfa2VybmVsX1t4XTsKKyAgICAgIH0KKyAgICAgIGludGVybmFsOjphbGlnbmVkX2ZyZWUocGFja2VkX21lbV8pOworICAgIH0KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgLy8gS2ljayBvZmYgcGFja2luZyBvZiB0aGUgZmlyc3Qgc2xpY2UuCisgICAgICBzaWduYWxfc3dpdGNoKDAsIDEpOworICAgICAgLy8gV2FpdCBmb3Igb3ZlcmFsbCBjb21wbGV0aW9uLgorICAgICAgLy8gVE9ETyhkdnl1a292KTogdGhpcyB3YWl0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLgorICAgICAgLy8gSWYgbnRocmVhZHMgY29udHJhY3Rpb25zIGFyZSBjb25jdXJyZW50bHkgc3VibWl0dGVkIGZyb20gd29ya2VyCisgICAgICAvLyB0aHJlYWRzLCB0aGlzIHdhaXQgd2lsbCBibG9jayBhbGwgd29ya2VyIHRocmVhZHMgYW5kIHRoZSBzeXN0ZW0gd2lsbAorICAgICAgLy8gZGVhZGxvY2suCisgICAgICBkb25lXy5XYWl0KCk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIE5vdGlmaWNhdGlvbiBkb25lXzsKKyAgICBjb25zdCBEZXZpY2UmIGRldmljZV87CisgICAgTGhzTWFwcGVyJiBsaHNfOworICAgIFJoc01hcHBlciYgcmhzXzsKKyAgICBTY2FsYXIqIGNvbnN0IGJ1ZmZlcl87CisgICAgT3V0cHV0TWFwcGVyIG91dHB1dF87CisgICAgY29uc3QgaW50IG51bV90aHJlYWRzXzsKKyAgICBjb25zdCBib29sIHNoYXJkX2J5X2NvbF87CisgICAgY29uc3QgYm9vbCBwYXJhbGxlbF9wYWNrXzsKKyAgICAvLyBNYXRyaXggc2l6ZXMuCisgICAgY29uc3QgSW5kZXggbV87CisgICAgY29uc3QgSW5kZXggbl87CisgICAgY29uc3QgSW5kZXgga187CisgICAgLy8gQmxvY2sgc2l6ZXMuCisgICAgY29uc3QgSW5kZXggYm1fOworICAgIGNvbnN0IEluZGV4IGJuXzsKKyAgICBjb25zdCBJbmRleCBia187CisgICAgLy8gTnVtYmVyIG9mIHRhc2tzLgorICAgIGNvbnN0IEluZGV4IG5tXzsKKyAgICBjb25zdCBJbmRleCBubl87CisgICAgY29uc3QgSW5kZXggbmtfOworICAgIC8vIFRhc2sgZ3JhaW4gc2l6ZXMgKG51bWJlciBvZiBrZXJuZWxzIGV4ZWN1dGVkIHBlciB0YXNrKS4KKyAgICBjb25zdCBJbmRleCBnbV87CisgICAgY29uc3QgSW5kZXggZ25fOworICAgIC8vIE51bWJlciBvZiBibG9ja3MgKHRoaXMgaXMgZGlmZmVyZW50IGZyb20gbmlfL25uXyBiZWNhdXNlIG9mIHRhc2sgc2l6ZQorICAgIC8vIGNvYXJzZW5pbmcpLgorICAgIGNvbnN0IEluZGV4IG5tMF87CisgICAgY29uc3QgSW5kZXggbm4wXzsKKworICAgIC8vIFBhcmFsbGVsaXphdGlvbiBzdHJhdGVneS4KKyAgICAvLworICAgIC8vIEJsb2NrcyByZWxhdGVkIHRvIHRoZSBzYW1lIGsgYmxvY2sgY2FuIHJ1biBpbiBwYXJhbGxlbCBiZWNhdXNlIHRoZXkgd3JpdGUKKyAgICAvLyB0byBkaWZmZXJlbnQgb3V0cHV0IGJsb2Nrcy4gU28gd2UgcGFyYWxsZWxpemUgd2l0aGluIGsgc2xpY2VzLCB0aGlzCisgICAgLy8gZ2l2ZXMgdXMgcGFyYWxsZWxpc20gbGV2ZWwgb2YgbSB4IG4uIEJlZm9yZSB3ZSBjYW4gc3RhcnQgYW55IGtlcm5lbHMKKyAgICAvLyByZWxhdGVkIHRvIGstdGggc2xpY2UsIHdlIG5lZWQgdG8gaXNzdWUgbSBsaHMgcGFja2luZyB0YXNrcyBhbmQgbiByaHMKKyAgICAvLyBwYWNraW5nIHRhc2tzLgorICAgIC8vCisgICAgLy8gSG93ZXZlciwgdGhlcmUgaXMgYSBib3R0bGVuZWNrIHdoZW4gd2UgYXJlIGZpbmlzaGluZyBrZXJuZWxzIGZvciBrLXRoCisgICAgLy8gc2xpY2UgKGF0IHRoZSB2ZXJ5IGVuZCB0aGVyZSBpcyBvbmx5IDEgcnVubmFibGUga2VybmVsKS4gVG8gbWl0aWdhdGUgdGhpcworICAgIC8vIGJvdHRsZW5lY2sgd2UgYWxsb3cga2VybmVscyBmcm9tIGstdGggYW5kIGsrMS10aCBzbGljZXMgdG8gcnVuIGluCisgICAgLy8gcGFyYWxsZWwuIE5vdGUgdGhhdCAobSwgbiwgaykgYW5kIChtLCBuLCBrKzEpIGtlcm5lbHMgd3JpdGUgdG8gdGhlIHNhbWUKKyAgICAvLyBvdXRwdXQgYmxvY2ssIHNvIHRoZXkgbXVzdCBub3QgcnVuIGluIHBhcmFsbGVsLgorICAgIC8vCisgICAgLy8gVGhpcyBnaXZlcyB1cyB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY3kgZ3JhcGguCisgICAgLy8gT24gZWFjaCBrIHNsaWNlIHdlIGhhdmUgbSB4IG4ga2VybmVsIHRhc2tzLCBtIGxocyBwYWtpbmcgdGFza3MgYW5kIG4gcmhzCisgICAgLy8gcGFja2luZyB0YXNrcy4KKyAgICAvLyBLZXJuZWwgKG0sIG4sIGspIGNhbiBzdGFydCB3aGVuOgorICAgIC8vICAtIGtlcm5lbCAobSwgbiwgay0xKSBoYXMgZmluaXNoZWQKKyAgICAvLyAgLSBsaHMgcGFja2luZyAobSwgaykgaGFzIGZpbmlzaGVkCisgICAgLy8gIC0gcmhzIHBhY2tpbmcgKG4sIGspIGhhcyBmaW5pc2hlZAorICAgIC8vIExocy9yaHMgcGFja2luZyBjYW4gc3RhcnQgd2hlbjoKKyAgICAvLyAgLSBhbGwgay0xIHBhY2tpbmcgaGFzIGZpbmlzaGVkIChhcnRpZmljaWFsbHkgaW1wb3NlZCB0byBsaW1pdCBhbW91bnQgb2YKKyAgICAvLyAgcGFyYWxsZWwgcGFja2luZykKKyAgICAvLworICAgIC8vIE9uIHRvcCBvZiB0aGF0IHdlIGxpbWl0IHJ1bm5hYmxlIHRhc2tzIHRvIHR3byBjb25zZWN1dGl2ZSBrIHNsaWNlcy4KKyAgICAvLyBUaGlzIGlzIGRvbmUgdG8gbGltaXQgYW1vdW50IG9mIG1lbW9yeSB3ZSBuZWVkIGZvciBwYWNrZWQgbGhzL3JocworICAgIC8vIChmb3IgZWFjaCBrIHNsaWNlIHdlIG5lZWQgbSpiayArIG4qYmsgbWVtb3J5IGluIHBhY2tlZF9saHNfL3BhY2tlZF9yaHNfKS4KKyAgICAvLworICAgIC8vIHN0YXRlX3N3aXRjaF8gdHJhY2tzIHdoZW4gd2UgYXJlIHJlYWR5IHRvIHN3aXRjaCB0byB0aGUgbmV4dCBrIHNsaWNlLgorICAgIC8vIHN0YXRlX2tlcm5lbF9bbV1bbl0gdHJhY2tzIHdoZW4gd2UgYXJlIHJlYWR5IHRvIGtpY2sgb2ZmIGtlcm5lbCAobSwgbikuCisgICAgLy8gVGhlc2UgdmFyaWFibGUgYXJlIHJvbGxpbmcgb3ZlciAzIGNvbnNlY3V0aXZlIGsgc2xpY2VzOiBmaXJzdCB0d28gd2UgYXJlCisgICAgLy8gYWN0aXZlbHkgZXhlY3V0aW5nICsgb25lIHRvIHRyYWNrIGNvbXBsZXRpb24gb2Yga2VybmVscyBpbiB0aGUgc2Vjb25kCisgICAgLy8gc2xpY2UuCisgICAgc3RhdGljIGNvbnN0IEluZGV4IFAgPSAzOworICAgIHZvaWQqIHBhY2tlZF9tZW1fOworICAgIHN0ZDo6dmVjdG9yPExoc1NjYWxhcio+IHBhY2tlZF9saHNfW1AgLSAxXTsKKyAgICBzdGQ6OnZlY3RvcjxSaHNTY2FsYXIqPiBwYWNrZWRfcmhzX1tQIC0gMV07CisgICAgc3RkOjphdG9taWM8dWludDhfdD4qKiBzdGF0ZV9rZXJuZWxfW1BdOworICAgIC8vIHN0YXRlX3N3aXRjaF8gaXMgZnJlcXVlbnRseSBtb2RpZmllZCBieSB3b3JrZXIgdGhyZWFkcywgd2hpbGUgb3RoZXIKKyAgICAvLyBmaWVsZHMgYXJlIHJlYWQtb25seSBhZnRlciBjb25zdHJ1Y3Rvci4gTGV0J3MgbW92ZSBpdCB0byBhIHNlcGFyYXRlIGNhY2hlCisgICAgLy8gbGluZSB0byByZWR1Y2UgY2FjaGUtY29oZXJlbmN5IHRyYWZmaWMuCisgICAgY2hhciBwYWRfWzEyOF07CisgICAgc3RkOjphdG9taWM8SW5kZXg+IHN0YXRlX3BhY2tpbmdfcmVhZHlfW1BdOworICAgIHN0ZDo6YXRvbWljPEluZGV4PiBzdGF0ZV9zd2l0Y2hfW1BdOworCisgICAgdm9pZCBwYWNrX2xocyhJbmRleCBtLCBJbmRleCBrKSB7CisgICAgICBjb25zdCBJbmRleCBtZW5kID0gbSAqIGdtXyArIGdtKG0pOworICAgICAgZm9yIChJbmRleCBtMSA9IG0gKiBnbV87IG0xIDwgbWVuZDsgbTErKykKKyAgICAgICAgTGhzUGFja2VyKCkocGFja2VkX2xoc19bayAlIChQIC0gMSldW20xXSwKKyAgICAgICAgICAgICAgICAgICAgbGhzXy5nZXRTdWJNYXBwZXIobTEgKiBibV8sIGsgKiBia18pLCBiayhrKSwgYm0obTEpKTsKKworICAgICAgaWYgKCFwYXJhbGxlbF9wYWNrXyAmJiBzaGFyZF9ieV9jb2xfKSB7CisgICAgICAgIHNpZ25hbF9wYWNraW5nKGspOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2lnbmFsX3N3aXRjaChrICsgMSk7CisgICAgICAgIGZvciAoSW5kZXggbiA9IG5uXyAtIDE7IG4gPj0gMDsgbi0tKSBzaWduYWxfa2VybmVsKG0sIG4sIGssIG4gPT0gMCk7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwYWNrX3JocyhJbmRleCBuLCBJbmRleCBrKSB7CisgICAgICBjb25zdCBJbmRleCBuZW5kID0gbiAqIGduXyArIGduKG4pOworICAgICAgZm9yIChJbmRleCBuMSA9IG4gKiBnbl87IG4xIDwgbmVuZDsgbjErKykgeworICAgICAgICBpZiAoayA9PSAwKSB7CisgICAgICAgICAgLy8gWmVybyB0aGUgb3V0cHV0IG1lbW9yeSBpbiBwYXJhbGxlbC4KKyAgICAgICAgICAvLyBPbiAxMDAwMHgyeDEwMDAwIG1tIHplcm9pbmcgY2FuIGVhc2lseSB0YWtlIGhhbGYgb2YgdGltZS4KKyAgICAgICAgICAvLyBaZXJvIChibiB4IG0pIHJvdy4gU2FmZSB0byBkbyBoZXJlIGJlY2F1c2UgYWxsIGtlcm5lbHMgdGhhdCB3aWxsCisgICAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBtZW1vcnkgZGVwZW5kIG9uIGNvbXBsZXRpb24gb2YgdGhpcyB0YXNrLgorICAgICAgICAgIC8vIE5vdGU6IGRvbid0IGNhbGwgZGV2aWNlXy5tZW1zZXQoKSBoZXJlLiBkZXZpY2VfLm1lbXNldCgpIGJsb2NrcyBvbgorICAgICAgICAgIC8vIHRocmVhZCBwb29sIHdvcmtlciB0aHJlYWQsIHdoaWNoIGNhbiBsZWFkIHRvIHVuZGVydXRpbGl6YXRpb24gYW5kCisgICAgICAgICAgLy8gZGVhZGxvY2tzLgorICAgICAgICAgIG1lbXNldChidWZmZXJfICsgbjEgKiBibl8gKiBtXywgMCwgYm4objEpICogbV8gKiBzaXplb2YoU2NhbGFyKSk7CisgICAgICAgIH0KKyAgICAgICAgUmhzUGFja2VyKCkocGFja2VkX3Joc19bayAlIChQIC0gMSldW24xXSwKKyAgICAgICAgICAgICAgICAgICAgcmhzXy5nZXRTdWJNYXBwZXIoayAqIGJrXywgbjEgKiBibl8pLCBiayhrKSwgYm4objEpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFsbGVsX3BhY2tfIHx8IHNoYXJkX2J5X2NvbF8pIHsKKyAgICAgICAgc2lnbmFsX3N3aXRjaChrICsgMSk7CisgICAgICAgIGZvciAoSW5kZXggbSA9IG5tXyAtIDE7IG0gPj0gMDsgbS0tKSBzaWduYWxfa2VybmVsKG0sIG4sIGssIG0gPT0gMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzaWduYWxfcGFja2luZyhrKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGtlcm5lbChJbmRleCBtLCBJbmRleCBuLCBJbmRleCBrKSB7CisgICAgICAvLyBOb3RlOiBvcmRlciBvZiBpdGVyYXRpb24gbWF0dGVycyBoZXJlLiBJdGVyYXRpb24gb3ZlciBtIGlzIGlubmVybW9zdAorICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHJldXNlIHRoZSBzYW1lIHBhY2tlZCByaHMgaW4gY29uc2VxdWV0aXZlIHRhc2tzCisgICAgICAvLyAocmhzIGZpdHMgaW50byBMMiQgd2hpbGUgbGhzIG9ubHkgaW50byBMMyQpLgorICAgICAgY29uc3QgSW5kZXggbmVuZCA9IG4gKiBnbl8gKyBnbihuKTsKKyAgICAgIGNvbnN0IEluZGV4IG1lbmQgPSBtICogZ21fICsgZ20obSk7CisgICAgICBpZiAoc2hhcmRfYnlfY29sXykgeworICAgICAgICBmb3IgKEluZGV4IG4xID0gbiAqIGduXzsgbjEgPCBuZW5kOyBuMSsrKSB7CisgICAgICAgICAgZm9yIChJbmRleCBtMSA9IG0gKiBnbV87IG0xIDwgbWVuZDsgbTErKykKKyAgICAgICAgICAgIEdlYnBLZXJuZWwoKShvdXRwdXRfLmdldFN1Yk1hcHBlcihtMSAqIGJtXywgbjEgKiBibl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZF9saHNfW2sgJSAoUCAtIDEpXVttMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkX3Joc19bayAlIChQIC0gMSldW24xXSwgYm0obTEpLCBiayhrKSwgYm4objEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcigxKSwgLTEsIC0xLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChJbmRleCBtMSA9IG0gKiBnbV87IG0xIDwgbWVuZDsgbTErKykKKyAgICAgICAgICBmb3IgKEluZGV4IG4xID0gbiAqIGduXzsgbjEgPCBuZW5kOyBuMSsrKSB7CisgICAgICAgICAgICBHZWJwS2VybmVsKCkob3V0cHV0Xy5nZXRTdWJNYXBwZXIobTEgKiBibV8sIG4xICogYm5fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWRfbGhzX1trICUgKFAgLSAxKV1bbTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZF9yaHNfW2sgJSAoUCAtIDEpXVtuMV0sIGJtKG0xKSwgYmsoayksIGJuKG4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIoMSksIC0xLCAtMSwgMCwgMCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgc2lnbmFsX2tlcm5lbChtLCBuLCBrICsgMSwgZmFsc2UpOworICAgICAgc2lnbmFsX3N3aXRjaChrICsgMik7CisgICAgfQorCisgICAgdm9pZCBzaWduYWxfcGFja2luZyhJbmRleCBrKSB7CisgICAgICBlaWdlbl9hc3NlcnQoIXBhcmFsbGVsX3BhY2tfKTsKKyAgICAgIEluZGV4IHMgPSBzdGF0ZV9wYWNraW5nX3JlYWR5X1trICUgUF0uZmV0Y2hfc3ViKDEpOworICAgICAgZWlnZW5fYXNzZXJ0KHMgPiAwKTsKKyAgICAgIGlmIChzICE9IDEpIHJldHVybjsKKyAgICAgIHN0YXRlX3BhY2tpbmdfcmVhZHlfW2sgJSBQXSA9IHNoYXJkX2J5X2NvbF8gPyBubV8gOiBubl87CisgICAgICBlbnF1ZXVlX3BhY2tpbmcoaywgc2hhcmRfYnlfY29sXyk7CisgICAgfQorCisgICAgdm9pZCBzaWduYWxfa2VybmVsKEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGssIGJvb2wgc3luYykgeworICAgICAgc3RkOjphdG9taWM8dWludDhfdD4qIHN0YXRlID0gJnN0YXRlX2tlcm5lbF9bayAlIFBdW21dW25dOworICAgICAgSW5kZXggcyA9IHN0YXRlLT5sb2FkKCk7CisgICAgICBlaWdlbl9hc3NlcnQocyA+IDApOworICAgICAgaWYgKHMgIT0gMSAmJiBzdGF0ZS0+ZmV0Y2hfc3ViKDEpICE9IDEpIHJldHVybjsKKyAgICAgIHN0YXRlLT5zdG9yZShwYXJhbGxlbF9wYWNrXyA/IDMgOiAyLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIGlmIChzeW5jKQorICAgICAgICBrZXJuZWwobSwgbiwgayk7CisgICAgICBlbHNlCisgICAgICAgIGRldmljZV8uZW5xdWV1ZU5vTm90aWZpY2F0aW9uKFs9XSgpIHsga2VybmVsKG0sIG4sIGspOyB9KTsKKyAgICB9CisKKyAgICB2b2lkIHNpZ25hbF9zd2l0Y2goSW5kZXggaywgSW5kZXggdiA9IDEpIHsKKyAgICAgIEluZGV4IHMgPSBzdGF0ZV9zd2l0Y2hfW2sgJSBQXS5mZXRjaF9zdWIodik7CisgICAgICBlaWdlbl9hc3NlcnQocyA+PSB2KTsKKyAgICAgIGlmIChzICE9IHYpIHJldHVybjsKKworICAgICAgLy8gUmVhZHkgdG8gc3dpdGNoIHRvIHRoZSBuZXh0IGsgc2xpY2UuCisgICAgICAvLyBSZXNldCBjb3VudGVyIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICBzdGF0ZV9zd2l0Y2hfW2sgJSBQXSA9CisgICAgICAgICAgKHBhcmFsbGVsX3BhY2tfID8gbm1fICsgbm5fIDogKHNoYXJkX2J5X2NvbF8gPyBubl8gOiBubV8pKSArCisgICAgICAgICAgbm1fICogbm5fOworICAgICAgaWYgKGsgPCBua18pIHsKKyAgICAgICAgLy8gSXNzdWUgbGhzL3JocyBwYWNraW5nLiBUaGVpciBjb21wbGV0aW9uIHdpbGwgaW4gdHVybiBraWNrIG9mZgorICAgICAgICAvLyBrZXJuZWxzLgorICAgICAgICBpZiAocGFyYWxsZWxfcGFja18pIHsKKyAgICAgICAgICBlbnF1ZXVlX3BhY2tpbmcoaywgIXNoYXJkX2J5X2NvbF8pOworICAgICAgICAgIGVucXVldWVfcGFja2luZyhrLCBzaGFyZF9ieV9jb2xfKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaGFyZF9ieV9jb2xfKSB7CisgICAgICAgICAgZW5xdWV1ZV9wYWNraW5nKGssIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnF1ZXVlX3BhY2tpbmcoaywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXJtaW5hdGlvbiBoYW5kbGluZy4KKyAgICAgICAgLy8gQmVjYXVzZSBrZXJuZWwgY29tcGxldGlvbiBzaWduYWxzIGsgKyAyIHN3aXRjaCwgd2UgbmVlZCB0byBmaW5pc2ggbmsKKyAgICAgICAgLy8gKyAyIHNsaWNlcyB3aXRob3V0IGlzc3VpbmcgYW55IHRhc2tzIG9uIG5rICsgMSBzbGljZS4gU28gaGVyZSB3ZQorICAgICAgICAvLyBwcmV0ZW5kIHRoYXQgYWxsIG5rICsgMSBwYWNraW5nIHRhc2tzIGp1c3QgZmluaXNoIGluc3RhbnRseTsgc28gdGhhdAorICAgICAgICAvLyBuayArIDIgc3dpdGNoIG9ubHkgd2FpdHMgZm9yIGNvbXBsZXRpb24gb2Ygbmsga2VybmVscy4KKyAgICAgIH0gZWxzZSBpZiAoayA9PSBua18pIHsKKyAgICAgICAgc2lnbmFsX3N3aXRjaChrICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbF9wYWNrXyA/IG5tXyArIG5uXyA6IChzaGFyZF9ieV9jb2xfID8gbm5fIDogbm1fKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb25lXy5Ob3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbnF1ZXVlIGFsbCByaHMvbGhzIHBhY2tpbmcgZm9yIGstdGggc2xpY2UuCisgICAgdm9pZCBlbnF1ZXVlX3BhY2tpbmcoSW5kZXggaywgYm9vbCByaHMpIHsKKyAgICAgIGVucXVldWVfcGFja2luZ19oZWxwZXIoMCwgcmhzID8gbm5fIDogbm1fLCBrLCByaHMpOworICAgIH0KKworICAgIHZvaWQgZW5xdWV1ZV9wYWNraW5nX2hlbHBlcihJbmRleCBzdGFydCwgSW5kZXggZW5kLCBJbmRleCBrLCBib29sIHJocykgeworICAgICAgaWYgKGVuZCAtIHN0YXJ0ID09IDEpIHsKKyAgICAgICAgaWYgKHJocykKKyAgICAgICAgICBwYWNrX3JocyhzdGFydCwgayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYWNrX2xocyhzdGFydCwgayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBJbmRleCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKKyAgICAgICAgZGV2aWNlXy5lbnF1ZXVlTm9Ob3RpZmljYXRpb24oCisgICAgICAgICAgICBbPV0oKSB7IGVucXVldWVfcGFja2luZ19oZWxwZXIobWlkLCBlbmQsIGssIHJocyk7IH0pOworICAgICAgICBkZXZpY2VfLmVucXVldWVOb05vdGlmaWNhdGlvbigKKyAgICAgICAgICAgIFs9XSgpIHsgZW5xdWV1ZV9wYWNraW5nX2hlbHBlcihzdGFydCwgbWlkLCBrLCByaHMpOyB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBCbG9jayBzaXplcyB3aXRoIGFjY291bnRpbmcgZm9yIHBvdGVudGlhbGx5IGluY29tcGxldGUgbGFzdCBibG9jay4KKyAgICBJbmRleCBibShJbmRleCBtKSBjb25zdCB7IHJldHVybiBtICsgMSA8IG5tMF8gPyBibV8gOiBtXyArIGJtXyAtIGJtXyAqIG5tMF87IH0KKyAgICBJbmRleCBibihJbmRleCBuKSBjb25zdCB7IHJldHVybiBuICsgMSA8IG5uMF8gPyBibl8gOiBuXyArIGJuXyAtIGJuXyAqIG5uMF87IH0KKyAgICBJbmRleCBiayhJbmRleCBrKSBjb25zdCB7IHJldHVybiBrICsgMSA8IG5rXyA/IGJrXyA6IGtfICsgYmtfIC0gYmtfICogbmtfOyB9CisgICAgLy8gVGFzayBncmFpbiBzaXplcyBhY2NvdW50aW5nIGZvciBwb3RlbnRpYWxseSBpbmNvbXBsZXRlIGxhc3QgdGFzay4KKyAgICBJbmRleCBnbShJbmRleCBtKSBjb25zdCB7IHJldHVybiBtICsgMSA8IG5tXyA/IGdtXyA6IG5tMF8gKyBnbV8gLSBnbV8gKiBubV87IH0KKyAgICBJbmRleCBnbihJbmRleCBuKSBjb25zdCB7IHJldHVybiBuICsgMSA8IG5uXyA/IGduXyA6IG5uMF8gKyBnbl8gLSBnbl8gKiBubl87IH0KKworICAgIENvbnRleHQoY29uc3QgQ29udGV4dCYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENvbnRleHQmKSA9IGRlbGV0ZTsKKyAgfTsKKworICAvLyBEZWNpZGUgd2hldGhlciB3ZSB3YW50IHRvIHNoYXJkIG0geCBuIGNvbnRyYWN0aW9uIGJ5IGNvbHVtbnMgb3IgYnkgcm93cy4KKyAgc3RhdGljIGJvb2wgc2hhcmRCeUNvbChJbmRleCBtLCBJbmRleCBuLCBJbmRleCBudW1fdGhyZWFkcykgeworICAgIC8vIE5vdGU6IHdlIGFyZSBjb21wYXJpbmcgYm90aCBuIGFuZCBtIGFnYWluc3QgVHJhaXRzOjpuciwgaXQgaXMgbm90CisgICAgLy8gYSBtaXN0YWtlLiBXZSBhcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IGJvdGggbiBhbmQgbSB3aWxsIGZpdCBpbnRvCisgICAgLy8gdGhlIG1haW4gc2hhcmRpbmcgZGltZW5zaW9uLgorCisgICAgLy8gU2hhcmRpbmcgYnkgY29sdW1uIGlzIHRoZSBkZWZhdWx0CisgICAgLy8gLi4uIHVubGVzcyB0aGVyZSBpcyBlbm91Z2ggZGF0YSBmb3IgdmVjdG9yaXphdGlvbiBvdmVyIHJvd3MKKyAgICBpZiAobSAvIG51bV90aHJlYWRzID49IFRyYWl0czo6bnIgJiYKKyAgICAgICAgLy8gYW5kIG5vdCBlbm91Z2ggZGF0YSBmb3IgdmVjdG9yaXphdGlvbiBvdmVyIGNvbHVtbnMKKyAgICAgICAgKG4gLyBudW1fdGhyZWFkcyA8IFRyYWl0czo6bnIgfHwKKyAgICAgICAgIC8vIC4uLiBvciBiYXJlbHkgZW5vdWdoIGRhdGEgZm9yIHZlY3Rvcml6YXRpb24gb3ZlciBjb2x1bW5zLAorICAgICAgICAgLy8gYnV0IGl0IGlzIG5vdCBldmVubHkgZGl2aWRhYmxlIGFjcm9zcyB0aHJlYWRzCisgICAgICAgICAobiAvIG51bV90aHJlYWRzIDwgNCAqIFRyYWl0czo6bnIgJiYKKyAgICAgICAgICAobiAlIChudW1fdGhyZWFkcyAqIFRyYWl0czo6bnIpKSAhPSAwICYmCisgICAgICAgICAgLy8gLi4uIGFuZCBpdCBpcyBldmVubHkgZGl2aWRhYmxlIGFjcm9zcyB0aHJlYWRzIGZvciByb3dzCisgICAgICAgICAgKChtICUgKG51bV90aHJlYWRzICogVHJhaXRzOjpucikpID09IDAgfHwKKyAgICAgICAgICAgLy8gLi4gb3IgaXQgaXMgbm90IGV2ZW5seSBkaXZpZGFibGUgZm9yIGJvdGggZGltZW5zaW9ucyBidXQKKyAgICAgICAgICAgLy8gdGhlcmUgaXMgbXVjaCBtb3JlIGRhdGEgb3ZlciByb3dzIHNvIHRoYXQgY29ybmVyIGVmZmVjdHMgYXJlCisgICAgICAgICAgIC8vIG1pdGlnYXRlZC4KKyAgICAgICAgICAgKG0gLyBuID49IDYpKSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIFdhaXQsIG9yIGlmIG1hdHJpY2VzIGFyZSBqdXN0IHN1YnN0YW50aWFsbHkgcHJvbG9uZ2VkIG92ZXIgdGhlIG90aGVyCisgICAgLy8gZGltZW5zaW9uLgorICAgIGlmIChuIC8gbnVtX3RocmVhZHMgPCAxNiAqIFRyYWl0czo6bnIgJiYgbSA+IG4gKiAzMikgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgSW5kZXggY29hcnNlbk0oSW5kZXggbSwgSW5kZXggbiwgSW5kZXggYm0sIEluZGV4IGJuLCBJbmRleCBiaywgSW5kZXggZ24sCisgICAgICAgICAgICAgICAgIGludCBudW1fdGhyZWFkcywgYm9vbCBzaGFyZF9ieV9jb2wpIGNvbnN0IHsKKyAgICBJbmRleCBnbSA9IDE7CisgICAgSW5kZXggZ20xID0gMTsKKyAgICBJbmRleCBubTAgPSBkaXZ1cChtLCBibSk7CisgICAgSW5kZXggbm0xID0gbm0wOworICAgIGZvciAoOzspIHsKKyAgICAgIC8vIEZpbmQgdGhlIG5leHQgY2FuZGlkYXRlIGZvciBtIGdyYWluIHNpemUuIEl0IG5lZWRzIHRvIHJlc3VsdCBpbgorICAgICAgLy8gZGlmZmVyZW50IG51bWJlciBvZiBibG9ja3MuIEUuZy4gaWYgd2UgaGF2ZSAxMCBrZXJuZWxzLCB3ZSB3YW50IHRvIHRyeQorICAgICAgLy8gNSBhbmQgMTAsIGJ1dCBub3QgNiwgNywgOCBhbmQgOS4KKyAgICAgIHdoaWxlIChnbTEgPD0gbm0wICYmIG5tMSA9PSBkaXZ1cChubTAsIGdtMSkpIGdtMSsrOworICAgICAgaWYgKGdtMSA+IG5tMCkgYnJlYWs7CisgICAgICAvLyBDaGVjayB0aGUgY2FuZGlkYXRlLgorICAgICAgaW50IHJlcyA9IGNoZWNrR3JhaW4obSwgbiwgYm0sIGJuLCBiaywgZ20xLCBnbiwgZ20sIGduLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkX2J5X2NvbCk7CisgICAgICBpZiAocmVzIDwgMCkgYnJlYWs7CisgICAgICBubTEgPSBkaXZ1cChubTAsIGdtMSk7CisgICAgICBpZiAocmVzID09IDApIGNvbnRpbnVlOworICAgICAgLy8gQ29tbWl0IG5ldyBncmFpbiBzaXplLgorICAgICAgZ20gPSBnbTE7CisgICAgfQorICAgIHJldHVybiBnbTsKKyAgfQorCisgIEluZGV4IGNvYXJzZW5OKEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGJtLCBJbmRleCBibiwgSW5kZXggYmssIEluZGV4IGdtLAorICAgICAgICAgICAgICAgICBpbnQgbnVtX3RocmVhZHMsIGJvb2wgc2hhcmRfYnlfY29sKSBjb25zdCB7CisgICAgSW5kZXggZ24gPSAxOworICAgIEluZGV4IGduMSA9IDE7CisgICAgSW5kZXggbm4wID0gZGl2dXAobiwgYm4pOworICAgIEluZGV4IG5uMSA9IG5uMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICB3aGlsZSAoZ24xIDw9IG5uMCAmJiBubjEgPT0gZGl2dXAobm4wLCBnbjEpKSBnbjErKzsKKyAgICAgIGlmIChnbjEgPiBubjApIGJyZWFrOworICAgICAgaW50IHJlcyA9IGNoZWNrR3JhaW4obSwgbiwgYm0sIGJuLCBiaywgZ20sIGduMSwgZ20sIGduLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkX2J5X2NvbCk7CisgICAgICBpZiAocmVzIDwgMCkgYnJlYWs7CisgICAgICBubjEgPSBkaXZ1cChubjAsIGduMSk7CisgICAgICBpZiAocmVzID09IDApIGNvbnRpbnVlOworICAgICAgZ24gPSBnbjE7CisgICAgfQorICAgIHJldHVybiBnbjsKKyAgfQorCisgIC8vIGNoZWNrR3JhaW4gY2hlY2tzIHdoZXRoZXIgZ3JhaW4gKGdtLCBnbikgaXMgc3VpdGFibGUgYW5kIGlzIGJldHRlciB0aGFuCisgIC8vIChvbGRnbSwgb2xkZ24pLgorICBpbnQgY2hlY2tHcmFpbihJbmRleCBtLCBJbmRleCBuLCBJbmRleCBibSwgSW5kZXggYm4sIEluZGV4IGJrLCBJbmRleCBnbSwKKyAgICAgICAgICAgICAgICAgSW5kZXggZ24sIEluZGV4IG9sZGdtLCBJbmRleCBvbGRnbiwgaW50IG51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICBib29sIHNoYXJkX2J5X2NvbCkgY29uc3QgeworICAgIGNvbnN0IFRlbnNvck9wQ29zdCBjb3N0ID0KKyAgICAgICAgY29udHJhY3Rpb25Db3N0KGJtICogZ20sIGJuICogZ24sIGJtLCBibiwgYmssIHNoYXJkX2J5X2NvbCwgdHJ1ZSk7CisgICAgZG91YmxlIHRhc2tTaXplID0gVGVuc29yQ29zdE1vZGVsPFRocmVhZFBvb2xEZXZpY2U+Ojp0YXNrU2l6ZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihibSkgKiBnbSAqIGJuICogZ24sIGNvc3QpOworICAgIC8vIElmIHRoZSB0YXNrIGlzIHRvbyBzbWFsbCwgdGhlbiB3ZSBhZ3JlZSBvbiBpdCByZWdhcmRsZXNzIG9mIGFueXRoaW5nCisgICAgLy8gZWxzZS4gT3RoZXJ3aXNlIHN5bmNocm9uaXphdGlvbiBvdmVyaGVhZHMgd2lsbCBkb21pbmF0ZS4KKyAgICBpZiAodGFza1NpemUgPCAxKSByZXR1cm4gMTsKKyAgICAvLyBJZiBpdCBpcyB0b28gbGFyZ2UsIHRoZW4gd2UgcmVqZWN0IGl0IGFuZCBhbGwgbGFyZ2VyIHRhc2tzLgorICAgIGlmICh0YXNrU2l6ZSA+IDIpIHJldHVybiAtMTsKKyAgICAvLyBOb3cgd2UgYXJlIGluIHByZXN1bWFibHkgZ29vZCB0YXNrIHNpemUgcmFuZ2UuCisgICAgLy8gVGhlIG1haW4gZGVjaWRpbmcgZmFjdG9yIGhlcmUgaXMgcGFyYWxsZWxpc20uIENvbnNpZGVyIHRoYXQgd2UgaGF2ZSAxMgorICAgIC8vIGtlcm5lbHMgYW5kIDQgdGhyZWFkcy4gR3JhaW5zIG9mIDIsIDMgYW5kIDQgYWxsIHlpZWxkIGdvb2QgdGFzayBzaXplcy4KKyAgICAvLyBCdXQgMi80IHlpZWxkIDYvMyB0YXNrcywgd2hpY2ggZ2l2ZXMgdXMgcGFyYWxsZWxpc20gb2YgMC43NSAoYXQgbW9zdCAzLzQKKyAgICAvLyBvZiBjb3JlcyB3aWxsIGJlIGJ1c3kpLiBXaGlsZSBncmFpbiBzaXplIDMgZ2l2ZXMgdXMgNCB0YXNrcywgd2hpY2ggZ2l2ZXMKKyAgICAvLyB1cyBwYXJhbGxlbGlzbSBvZiAxICh3ZSBjYW4gbG9hZCBhbGwgY29yZXMpLgorICAgIEluZGV4IG5tMCA9IGRpdnVwKG0sIGJtKTsKKyAgICBJbmRleCBubjAgPSBkaXZ1cChuLCBibik7CisgICAgSW5kZXggbmV3X3Rhc2tzID0gZGl2dXAobm0wLCBnbSkgKiBkaXZ1cChubjAsIGduKTsKKyAgICBkb3VibGUgbmV3X3BhcmFsbGVsaXNtID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihuZXdfdGFza3MpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpdnVwPGludD4obmV3X3Rhc2tzLCBudW1fdGhyZWFkcykgKiBudW1fdGhyZWFkcyk7CisgICAgSW5kZXggb2xkX3Rhc2tzID0gZGl2dXAobm0wLCBvbGRnbSkgKiBkaXZ1cChubjAsIG9sZGduKTsKKyAgICBkb3VibGUgb2xkX3BhcmFsbGVsaXNtID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihvbGRfdGFza3MpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpdnVwPGludD4ob2xkX3Rhc2tzLCBudW1fdGhyZWFkcykgKiBudW1fdGhyZWFkcyk7CisgICAgaWYgKG5ld19wYXJhbGxlbGlzbSA+IG9sZF9wYXJhbGxlbGlzbSB8fCBuZXdfcGFyYWxsZWxpc20gPT0gMSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKworI2Vsc2UgIC8vIEVJR0VOX1VTRV9TSU1QTEVfVEhSRUFEX1BPT0wKKworICB0ZW1wbGF0ZSA8Ym9vbCBsaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsIGJvb2wgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBib29sIHJoc19pbm5lcl9kaW1fcmVvcmRlcmVkLCBpbnQgQWxpZ25tZW50PgorICB2b2lkIGV2YWxQcm9kdWN0KFNjYWxhciogYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm1fal9zaXplID09IDEpIHsKKyAgICAgIHRoaXMtPnRlbXBsYXRlIGV2YWxHZW12PGxoc19pbm5lcl9kaW1fY29udGlndW91cywgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgQWxpZ25tZW50PihidWZmZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGV2YWxHZW1tPGxoc19pbm5lcl9kaW1fY29udGlndW91cywgcmhzX2lubmVyX2RpbV9jb250aWd1b3VzLCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgQWxpZ25tZW50PihidWZmZXIpOworICB9CisKKyAgdGVtcGxhdGUgPGJvb2wgbGhzX2lubmVyX2RpbV9jb250aWd1b3VzLCBib29sIHJoc19pbm5lcl9kaW1fY29udGlndW91cywgYm9vbCByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgaW50IEFsaWdubWVudD4KKyAgdm9pZCBldmFsR2VtbShTY2FsYXIqIGJ1ZmZlcikgY29uc3QgeworICAgIC8vIGNvbHVtbnMgaW4gbGVmdCBzaWRlLCByb3dzIGluIHJpZ2h0IHNpZGUKKyAgICBjb25zdCBJbmRleCBrID0gdGhpcy0+bV9rX3NpemU7CisKKyAgICAvLyByb3dzIGluIGxlZnQgc2lkZQorICAgIGNvbnN0IEluZGV4IG0gPSB0aGlzLT5tX2lfc2l6ZTsKKworICAgIC8vIGNvbHVtbnMgaW4gcmlnaHQgc2lkZQorICAgIGNvbnN0IEluZGV4IG4gPSB0aGlzLT5tX2pfc2l6ZTsKKworICAgIC8vIHplcm8gb3V0IHRoZSByZXN1bHQgYnVmZmVyICh3aGljaCBtdXN0IGJlIG9mIHNpemUgYXQgbGVhc3QgbSAqIG4gKiBzaXplb2YoU2NhbGFyKQorICAgIHRoaXMtPm1fZGV2aWNlLm1lbXNldChidWZmZXIsIDAsIG0gKiBuICogc2l6ZW9mKFNjYWxhcikpOworCisKKyAgICBjb25zdCBpbnQgbGhzX3BhY2tldF9zaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBMZWZ0RXZhbHVhdG9yOjpQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKyAgICBjb25zdCBpbnQgcmhzX3BhY2tldF9zaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBSaWdodEV2YWx1YXRvcjo6UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbklucHV0TWFwcGVyPExoc1NjYWxhciwgSW5kZXgsIGludGVybmFsOjpMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0RXZhbHVhdG9yLCBsZWZ0X25vY29udHJhY3RfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3QsIGxoc19wYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoc19pbm5lcl9kaW1fY29udGlndW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBVbmFsaWduZWQ+IExoc01hcHBlcjsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckNvbnRyYWN0aW9uSW5wdXRNYXBwZXI8UmhzU2NhbGFyLCBJbmRleCwgaW50ZXJuYWw6OlJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0RXZhbHVhdG9yLCByaWdodF9ub2NvbnRyYWN0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdF90LCByaHNfcGFja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX2NvbnRpZ3VvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5uZXJfZGltX3Jlb3JkZXJlZCwgVW5hbGlnbmVkPiBSaHNNYXBwZXI7CisKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIENvbE1ham9yPiBPdXRwdXRNYXBwZXI7CisKKyAgICAvLyBUT0RPOiBwYWNraW5nIGNvdWxkIGJlIGZhc3RlciBzb21ldGltZXMgaWYgd2Ugc3VwcG9ydGVkIHJvdyBtYWpvciB0ZW5zb3IgbWFwcGVycworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fcGFja19saHM8TGhzU2NhbGFyLCBJbmRleCwgdHlwZW5hbWUgTGhzTWFwcGVyOjpTdWJNYXBwZXIsIFRyYWl0czo6bXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdHM6Okxoc1Byb2dyZXNzLCBDb2xNYWpvcj4gTGhzUGFja2VyOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fcGFja19yaHM8UmhzU2NhbGFyLCBJbmRleCwgdHlwZW5hbWUgUmhzTWFwcGVyOjpTdWJNYXBwZXIsIFRyYWl0czo6bnIsIENvbE1ham9yPiBSaHNQYWNrZXI7CisKKyAgICAvLyBUT0RPOiByZXBsYWNlIGZhbHNlLCBmYWxzZSB3aXRoIGNvbmp1Z2F0ZSB2YWx1ZXM/CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Z2VicF9rZXJuZWw8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIEluZGV4LCBPdXRwdXRNYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgZmFsc2UsIGZhbHNlPiBHZWJwS2VybmVsOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6cGFja0xoc0FyZzxMaHNTY2FsYXIsIExoc01hcHBlciwgSW5kZXg+IHBhY2tMQXJnOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tSaHNBbmRLZXJuZWxBcmc8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIFJoc01hcHBlciwgT3V0cHV0TWFwcGVyLCBJbmRleD4gcGFja1JLQXJnOworCisgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIG1hcHBlcnMKKyAgICBMaHNNYXBwZXIgbGhzKHRoaXMtPm1fbGVmdEltcGwsIHRoaXMtPm1fbGVmdF9ub2NvbnRyYWN0X3N0cmlkZXMsIHRoaXMtPm1faV9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgdGhpcy0+bV9sZWZ0X2NvbnRyYWN0aW5nX3N0cmlkZXMsIHRoaXMtPm1fa19zdHJpZGVzKTsKKworICAgIFJoc01hcHBlciByaHModGhpcy0+bV9yaWdodEltcGwsIHRoaXMtPm1fcmlnaHRfbm9jb250cmFjdF9zdHJpZGVzLCB0aGlzLT5tX2pfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgIHRoaXMtPm1fcmlnaHRfY29udHJhY3Rpbmdfc3RyaWRlcywgdGhpcy0+bV9rX3N0cmlkZXMpOworCisgICAgT3V0cHV0TWFwcGVyIG91dHB1dChidWZmZXIsIG0pOworCisgICAgLy8gY29tcHV0ZSBibG9jayBzaXplcyAod2hpY2ggZGVwZW5kIG9uIG51bWJlciBvZiB0aHJlYWRzKQorICAgIGNvbnN0IEluZGV4IG51bV90aHJlYWRzID0gdGhpcy0+bV9kZXZpY2UubnVtVGhyZWFkcygpOworICAgIGludGVybmFsOjpUZW5zb3JDb250cmFjdGlvbkJsb2NraW5nPExoc01hcHBlciwgUmhzTWFwcGVyLCBJbmRleCwgaW50ZXJuYWw6OlNoYXJkQnlDb2w+IGJsb2NraW5nKGssIG0sIG4sIG51bV90aHJlYWRzKTsKKyAgICBJbmRleCBtYyA9IGJsb2NraW5nLm1jKCk7CisgICAgSW5kZXggbmMgPSBibG9ja2luZy5uYygpOworICAgIEluZGV4IGtjID0gYmxvY2tpbmcua2MoKTsKKyAgICBlaWdlbl9hc3NlcnQobWMgPD0gbSk7CisgICAgZWlnZW5fYXNzZXJ0KG5jIDw9IG4pOworICAgIGVpZ2VuX2Fzc2VydChrYyA8PSBrKTsKKworI2RlZmluZSBDRUlMX0RJVihhLCBiKSAoKChhKSArIChiKSAtIDEpIC8gKGIpKQorICAgIGNvbnN0IEluZGV4IGtfYmxvY2tzID0gQ0VJTF9ESVYoaywga2MpOworICAgIGNvbnN0IEluZGV4IG5fYmxvY2tzID0gQ0VJTF9ESVYobiwgbmMpOworICAgIGNvbnN0IEluZGV4IG1fYmxvY2tzID0gQ0VJTF9ESVYobSwgbWMpOworICAgIGNvbnN0IEluZGV4IHNpemVBID0gbWMgKiBrYzsKKyAgICBjb25zdCBJbmRleCBzaXplQiA9IGtjICogbmM7CisKKyAgICAvKiAgICBjb3V0IDw8ICJtOiAiIDw8IG0gPDwgIiBuOiAiIDw8IG4gPDwgIiBrOiAiIDw8IGsgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJtYzogIiA8PCBtYyA8PCAiIG5jOiAiIDw8IG5jIDw8ICIga2M6ICIgPDwga2MgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJtX2Jsb2NrczogIiA8PCBtX2Jsb2NrcyA8PCAiIG5fYmxvY2tzOiAiIDw8IG5fYmxvY2tzIDw8ICIga19ibG9ja3M6ICIgPDwga19ibG9ja3MgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJudW0gdGhyZWFkczogIiA8PCBudW1fdGhyZWFkcyA8PCBlbmRsOworICAgICovCisKKyAgICAvLyBub3RlOiBtX2RldmljZS5hbGxvY2F0ZSBzaG91bGQgcmV0dXJuIDE2IGJ5dGUgYWxpZ25lZCBwb2ludGVycywgYnV0IGlmIGJsb2NrQSBhbmQgYmxvY2tCCisgICAgLy8gICAgICAgYXJlbid0IDE2IGJ5dGUgYWxpZ25lZCBzZWdmYXVsdHMgd2lsbCBoYXBwZW4gZHVlIHRvIFNJTUQgaW5zdHJ1Y3Rpb25zCisgICAgLy8gbm90ZTogWW91IGNhbiBnZXQgYXdheSB3aXRoIGFsbG9jYXRpbmcganVzdCBhIHNpbmdsZSBibG9ja0EgYW5kIG9mZnNldHMgYW5kIG1lZXQgdGhlCisgICAgLy8gICAgICAgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgLy8gICAgICAgKFRyYWl0czo6bXIgKiBzaXplb2YoUmVzU2NhbGFyKSkgJSAxNiA9PSAwCisgICAgY29uc3QgSW5kZXggbnVtQmxvY2tBcyA9IG51bWV4dDo6bWluaShudW1fdGhyZWFkcywgbV9ibG9ja3MpOworICAgIE1heFNpemVWZWN0b3I8TGhzU2NhbGFyICo+IGJsb2NrQXMobnVtX3RocmVhZHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgeworICAgICAgYmxvY2tBcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8TGhzU2NhbGFyICo+KHRoaXMtPm1fZGV2aWNlLmFsbG9jYXRlKHNpemVBICogc2l6ZW9mKExoc1NjYWxhcikpKSk7CisgICAgfQorCisgICAgLy8gVG8gY2lyY3VtdmVudCBhbGlnbm1lbnQgaXNzdWVzLCBJJ20ganVzdCBnb2luZyB0byBzZXBhcmF0ZWx5IGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGVhY2ggdGhyZWFkCisgICAgLy8gVE9ETzogaXMgdGhpcyB0b28gbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGU/IFRoaXMgc2ltcGxpZmllcyBjb2RpbmcgYSBsb3QsIGJ1dCBpcyB3YXN0ZWZ1bC4KKyAgICAvLyAgICAgICBPdGhlciBvcHRpb25zOiAoMSkgcmV1c2UgbWVtb3J5IHdoZW4gYSB0aHJlYWQgZmluaXNoZXMuIGNvbjogdHJpY2t5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgKDIpIGFsbG9jYXRlIGJsb2NrIEIgbWVtb3J5IGluIGVhY2ggdGhyZWFkLiBjb246IG92ZXJoZWFkCisgICAgTWF4U2l6ZVZlY3RvcjxSaHNTY2FsYXIgKj4gYmxvY2tCcyhuX2Jsb2Nrcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX2Jsb2NrczsgaSsrKSB7CisgICAgICBibG9ja0JzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxSaHNTY2FsYXIgKj4odGhpcy0+bV9kZXZpY2UuYWxsb2NhdGUoc2l6ZUIgKiBzaXplb2YoUmhzU2NhbGFyKSkpKTsKKyAgICB9CisKKyAgICAvLyBsaHNfbm90aWZpY2F0aW9ucyBzdGFydHMgd2l0aCBhbGwgbnVsbCBOb3RpZmljYXRpb25zCisgICAgTWF4U2l6ZVZlY3RvcjxOb3RpZmljYXRpb24qPiBsaHNfbm90aWZpY2F0aW9ucyhudW1fdGhyZWFkcywgbnVsbHB0cik7CisKKyAgICAvLyB0aGlzIHNob3VsZCByZWFsbHkgYmUgbnVtQmxvY2tBcyAqIG5fYmxvY2tzOworICAgIGNvbnN0IEluZGV4IG51bV9rZXJuZWxfbm90aWZpY2F0aW9ucyA9IG51bV90aHJlYWRzICogbl9ibG9ja3M7CisgICAgTWF4U2l6ZVZlY3RvcjxOb3RpZmljYXRpb24qPiBrZXJuZWxfbm90aWZpY2F0aW9ucyhudW1fa2VybmVsX25vdGlmaWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisKKyAgICBmb3IgKEluZGV4IGtfYmxvY2tfaWR4ID0gMDsga19ibG9ja19pZHggPCBrX2Jsb2Nrczsga19ibG9ja19pZHgrKykgeworICAgICAgY29uc3QgSW5kZXgga19zdGFydCA9IGtfYmxvY2tfaWR4ICoga2M7CisgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnNob290IHJpZ2h0IGVkZ2Ugb2YgbGVmdCBtYXRyaXgKKyAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9rYyA9IG51bWV4dDo6bWluaShrX3N0YXJ0ICsga2MsIGspIC0ga19zdGFydDsKKworICAgICAgZm9yIChJbmRleCBtX2Jsb2NrX2lkeCA9IDA7IG1fYmxvY2tfaWR4IDwgbV9ibG9ja3M7IG1fYmxvY2tfaWR4ICs9IG51bUJsb2NrQXMpIHsKKyAgICAgICAgY29uc3QgSW5kZXggbnVtX2Jsb2NrcyA9IG51bWV4dDo6bWluaShtX2Jsb2Nrcy1tX2Jsb2NrX2lkeCwgbnVtQmxvY2tBcyk7CisKKyAgICAgICAgZm9yIChJbmRleCBtdF9ibG9ja19pZHggPSBtX2Jsb2NrX2lkeDsgbXRfYmxvY2tfaWR4IDwgbV9ibG9ja19pZHgrbnVtX2Jsb2NrczsgbXRfYmxvY2tfaWR4KyspIHsKKyAgICAgICAgICBjb25zdCBJbmRleCBtX3N0YXJ0ID0gbXRfYmxvY2tfaWR4ICogbWM7CisgICAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gbnVtZXh0OjptaW5pKG1fc3RhcnQgKyBtYywgbSkgLSBtX3N0YXJ0OworICAgICAgICAgIGVpZ2VuX2Fzc2VydChhY3R1YWxfbWMgPiAwKTsKKworICAgICAgICAgIEluZGV4IGJsb2NrQUlkID0gKGtfYmxvY2tfaWR4ICogbV9ibG9ja3MgKyBtdF9ibG9ja19pZHgpICUgbnVtX3RocmVhZHM7CisKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5fYmxvY2tzOyArK2kpIHsKKyAgICAgICAgICAgIEluZGV4IG5vdGlmaWNhdGlvbl9pZCA9IChibG9ja0FJZCAqIG5fYmxvY2tzICsgaSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBhbnkgY3VycmVudCBrZXJuZWxzIHVzaW5nIHRoaXMgc2xvdCB0byBjb21wbGV0ZQorICAgICAgICAgICAgLy8gYmVmb3JlIHVzaW5nIGl0LgorICAgICAgICAgICAgaWYgKGtlcm5lbF9ub3RpZmljYXRpb25zW25vdGlmaWNhdGlvbl9pZF0pIHsKKyAgICAgICAgICAgICAgd2FpdF91bnRpbF9yZWFkeShrZXJuZWxfbm90aWZpY2F0aW9uc1tub3RpZmljYXRpb25faWRdKTsKKyAgICAgICAgICAgICAgZGVsZXRlIGtlcm5lbF9ub3RpZmljYXRpb25zW25vdGlmaWNhdGlvbl9pZF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZXJuZWxfbm90aWZpY2F0aW9uc1tub3RpZmljYXRpb25faWRdID0gbmV3IE5vdGlmaWNhdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCBwYWNrTEFyZyBhcmcgPSB7CisgICAgICAgICAgICBibG9ja0FzW2Jsb2NrQUlkXSwgLy8gYmxvY2tBCisgICAgICAgICAgICBsaHMsICAgICAgICAvLyBsaHMKKyAgICAgICAgICAgIG1fc3RhcnQsICAgIC8vIG0KKyAgICAgICAgICAgIGtfc3RhcnQsICAgIC8vIGsKKyAgICAgICAgICAgIGFjdHVhbF9tYywgIC8vIG1jCisgICAgICAgICAgICBhY3R1YWxfa2MsICAvLyBrYworICAgICAgICAgIH07CisKKyAgICAgICAgICAvLyBEZWxldGUgYW55IGV4aXN0aW5nIG5vdGlmaWNhdGlvbiBzaW5jZSB3ZSBtYXkgYmUKKyAgICAgICAgICAvLyByZXBsYWNpbmcgaXQuICBUaGUgYWxnb3JpdGhtIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBhcmUKKyAgICAgICAgICAvLyBubyBleGlzdGluZyB3YWl0ZXJzIG9uIHRoaXMgbm90aWZpY2F0aW9uLgorICAgICAgICAgIGRlbGV0ZSBsaHNfbm90aWZpY2F0aW9uc1tibG9ja0FJZF07CisgICAgICAgICAgbGhzX25vdGlmaWNhdGlvbnNbYmxvY2tBSWRdID0KKyAgICAgICAgICB0aGlzLT5tX2RldmljZS5lbnF1ZXVlKCZTZWxmOjpwYWNrTGhzPHBhY2tMQXJnLCBMaHNQYWNrZXI+LCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHN0YXJ0IGtlcm5lbHMuCisgICAgICAgIGNvbnN0IEluZGV4IG1fYmFzZV9zdGFydCA9IG1fYmxvY2tfaWR4ICogbWM7CisgICAgICAgIGNvbnN0IGJvb2wgbmVlZF90b19wYWNrID0gbV9ibG9ja19pZHggPT0gMDsKKworICAgICAgICBmb3IgKEluZGV4IG5fYmxvY2tfaWR4ID0gMDsgbl9ibG9ja19pZHggPCBuX2Jsb2Nrczsgbl9ibG9ja19pZHgrKykgeworICAgICAgICAgIGNvbnN0IEluZGV4IG5fc3RhcnQgPSBuX2Jsb2NrX2lkeCAqIG5jOworICAgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9uYyA9IG51bWV4dDo6bWluaShuX3N0YXJ0ICsgbmMsIG4pIC0gbl9zdGFydDsKKworICAgICAgICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGUgcHJldmlvdXMga2VybmVscyBhcmUgYWxsIGRvbmUgYmVmb3JlIG92ZXJ3cml0aW5nIHJocy4gQWxzbyB3YWl0IGlmCisgICAgICAgICAgLy8gd2UncmUgZ29pbmcgdG8gc3RhcnQgbmV3IGsuIEluIGJvdGggY2FzZXMgbmVlZF90b19wYWNrIGlzIHRydWUuCisgICAgICAgICAgaWYgKG5lZWRfdG9fcGFjaykgeworICAgICAgICAgICAgZm9yIChJbmRleCBpID0gbnVtX2Jsb2NrczsgaSA8IG51bV90aHJlYWRzOyArK2kpIHsKKyAgICAgICAgICAgICAgSW5kZXggYmxvY2tBSWQgPSAoa19ibG9ja19pZHggKiBtX2Jsb2NrcyArIGkgKyBtX2Jsb2NrX2lkeCkgJSBudW1fdGhyZWFkczsKKyAgICAgICAgICAgICAgSW5kZXggZnV0dXJlX2lkID0gKGJsb2NrQUlkICogbl9ibG9ja3MgKyBuX2Jsb2NrX2lkeCk7CisgICAgICAgICAgICAgIHdhaXRfdW50aWxfcmVhZHkoa2VybmVsX25vdGlmaWNhdGlvbnNbZnV0dXJlX2lkXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcGFja1JLQXJnIGFyZyA9IHsKKyAgICAgICAgICAgICZibG9ja0FzLCAvLyBibG9ja0EKKyAgICAgICAgICAgIGJsb2NrQnNbbl9ibG9ja19pZHhdLCAvLyBibG9ja0IKKyAgICAgICAgICAgIHJocywgICAgICAgICAgLy8gcmhzCisgICAgICAgICAgICBvdXRwdXQsICAgICAgIC8vIG91dHB1dAorICAgICAgICAgICAgbV9iYXNlX3N0YXJ0LCAvLyBtCisgICAgICAgICAgICBrX3N0YXJ0LCAgICAgIC8vIGsKKyAgICAgICAgICAgIG5fc3RhcnQsICAgICAgLy8gbgorICAgICAgICAgICAgbWMsICAgICAgICAgICAvLyBtYworICAgICAgICAgICAgYWN0dWFsX2tjLCAgICAvLyBrYworICAgICAgICAgICAgYWN0dWFsX25jLCAgICAvLyBuYworICAgICAgICAgICAgbnVtX3RocmVhZHMsCisgICAgICAgICAgICBudW1CbG9ja0FzLAorICAgICAgICAgICAgbSwKKyAgICAgICAgICAgIGtfYmxvY2tfaWR4LAorICAgICAgICAgICAgbV9ibG9ja19pZHgsCisgICAgICAgICAgICBuX2Jsb2NrX2lkeCwgLy8gbl9ibG9ja19pZHgKKyAgICAgICAgICAgIG1fYmxvY2tzLCAvLyBtX2Jsb2NrcworICAgICAgICAgICAgbl9ibG9ja3MsIC8vIG5fYmxvY2tzCisgICAgICAgICAgICAma2VybmVsX25vdGlmaWNhdGlvbnMsIC8vIGtlcm5lbCBub3RpZmljYXRpb25zCisgICAgICAgICAgICAmbGhzX25vdGlmaWNhdGlvbnMsICAgIC8vIGxocyBub3RpZmljYXRpb25zCisgICAgICAgICAgICBuZWVkX3RvX3BhY2ssIC8vIG5lZWRfdG9fcGFjaworICAgICAgICAgIH07CisKKyAgICAgICAgICAvLyBXZSBhc3luY2hyb25vdXNseSBraWNrIG9mZiB0aGlzIGZ1bmN0aW9uLCB3aGljaCBlbmRzIHVwCisgICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBhcHByb3ByaWF0ZSBrZXJuZWxfbm90aWZpY2F0aW9ucyBvYmplY3RzLAorICAgICAgICAgIC8vIHdoaWNoIHRoaXMgdGhyZWFkIHdhaXRzIG9uIGJlZm9yZSBleGl0aW5nLgorICAgICAgICAgIHRoaXMtPm1fZGV2aWNlLmVucXVldWVOb05vdGlmaWNhdGlvbigmU2VsZjo6cGFja1Joc0FuZEtlcm5lbDxwYWNrUktBcmcsIFJoc1BhY2tlciwgR2VicEtlcm5lbD4sIGFyZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBrZXJuZWxzIGFyZSBkb25lLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2VybmVsX25vdGlmaWNhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHdhaXRfdW50aWxfcmVhZHkoa2VybmVsX25vdGlmaWNhdGlvbnNbaV0pOworICAgICAgZGVsZXRlIGtlcm5lbF9ub3RpZmljYXRpb25zW2ldOworICAgIH0KKworICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBmb3IgbGhzIG5vdGlmaWNhdGlvbnMgc2luY2UgdGhleSBzaG91bGQgaGF2ZQorICAgIC8vIGFscmVhZHkgYmVlbiB3YWl0ZWQgb24uICBKdXN0IGNsZWFuIHRoZW0gdXAuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaHNfbm90aWZpY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgZGVsZXRlIGxoc19ub3RpZmljYXRpb25zW2ldOworICAgIH0KKworICAgIC8vIGRlYWxsb2NhdGUgYWxsIG9mIHRoZSBtZW1vcnkgZm9yIGJvdGggQSBhbmQgQidzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBibG9ja0FzLnNpemUoKTsgaSsrKSB7CisgICAgICB0aGlzLT5tX2RldmljZS5kZWFsbG9jYXRlKGJsb2NrQXNbaV0pOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJsb2NrQnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHRoaXMtPm1fZGV2aWNlLmRlYWxsb2NhdGUoYmxvY2tCc1tpXSk7CisgICAgfQorCisjdW5kZWYgQ0VJTF9ESVYKKyAgfQorCisgIC8qCisgICAqIFBhY2tzIGEgTEhTIGJsb2NrIG9mIHNpemUgKG10LCBrYykgc3RhcnRpbmcgYXQgbGhzKG0sIGspLiBCZWZvcmUgcGFja2luZworICAgKiB0aGUgTEhTIGJsb2NrLCBjaGVjayB0aGF0IGFsbCBvZiB0aGUga2VybmVscyB0aGF0IHdvcmtlZCBvbiB0aGUgc2FtZQorICAgKiBtdF9ibG9ja19pZHggaW4gdGhlIHByZXZpb3VzIG1fYmxvY2sgYXJlIGRvbmUuCisgICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcGFja0xBcmcsIHR5cGVuYW1lIExoc1BhY2tlcj4KKyAgc3RhdGljIHZvaWQgcGFja0xocyhjb25zdCBwYWNrTEFyZyBhcmcpIHsKKyAgICAvLyBwZXJmb3JtIGFjdHVhbCBwYWNraW5nCisgICAgTGhzUGFja2VyIHBhY2tfbGhzOworICAgIHBhY2tfbGhzKGFyZy5ibG9ja0EsIGFyZy5saHMuZ2V0U3ViTWFwcGVyKGFyZy5tX3N0YXJ0LCBhcmcua19zdGFydCksIGFyZy5rYywgYXJnLm1jKTsKKyAgfQorCisgIC8qCisgICAqIFBhY2tzIGEgUkhTIGJsb2NrIG9mIHNpemUgKGtjLCBuYykgc3RhcnRpbmcgYXQgKGssIG4pIGFmdGVyIGNoZWNraW5nIHRoYXQKKyAgICogYWxsIGtlcm5lbHMgaW4gdGhlIHByZXZpb3VzIGJsb2NrIGFyZSBkb25lLgorICAgKiBUaGVuIGZvciBlYWNoIExIUyBmdXR1cmUsIHdlIHdhaXQgb24gdGhlIGZ1dHVyZSBhbmQgdGhlbiBjYWxsIEdFQlAKKyAgICogb24gdGhlIGFyZWEgcGFja2VkIGJ5IHRoZSBmdXR1cmUgKHdoaWNoIHN0YXJ0cyBhdAorICAgKiBibG9ja0EgKyBmdXR1cmVfaWR4ICogbXQgKiBrYykgb24gdGhlIExIUyBhbmQgd2l0aCB0aGUgZnVsbCBwYWNrZWQKKyAgICogUkhTIGJsb2NrLgorICAgKiBUaGUgb3V0cHV0IG9mIHRoaXMgR0VCUCBpcyB3cml0dGVuIHRvIG91dHB1dChtICsgaSAqIG10LCBuKS4KKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBwYWNrUktBcmcsIHR5cGVuYW1lIFJoc1BhY2tlciwgdHlwZW5hbWUgR2VicEtlcm5lbD4KKyAgc3RhdGljIHZvaWQgcGFja1Joc0FuZEtlcm5lbChwYWNrUktBcmcgYXJnKSB7CisgICAgaWYgKGFyZy5uZWVkX3RvX3BhY2spIHsKKyAgICAgIFJoc1BhY2tlciBwYWNrX3JoczsKKyAgICAgIHBhY2tfcmhzKGFyZy5ibG9ja0IsIGFyZy5yaHMuZ2V0U3ViTWFwcGVyKGFyZy5rLCBhcmcubiksIGFyZy5rYywgYXJnLm5jKTsKKyAgICB9CisKKyAgICBHZWJwS2VybmVsIGdlYnA7CisgICAgZm9yIChJbmRleCBtdF9ibG9ja19pZHggPSAwOyBtdF9ibG9ja19pZHggPCBhcmcubnVtX2Jsb2NrQXM7IG10X2Jsb2NrX2lkeCsrKSB7CisgICAgICBjb25zdCBJbmRleCBtX2Jhc2Vfc3RhcnQgPSBhcmcubSArIGFyZy5tYyptdF9ibG9ja19pZHg7CisgICAgICBpZiAobV9iYXNlX3N0YXJ0IDwgYXJnLm1heF9tKSB7CisgICAgICAgIEluZGV4IGJsb2NrQUlkID0gKGFyZy5rX2Jsb2NrX2lkeCAqIGFyZy5tX2Jsb2NrcyArIG10X2Jsb2NrX2lkeCArIGFyZy5tX2Jsb2NrX2lkeCkgJSBhcmcubnVtX3RocmVhZHM7CisgICAgICAgIHdhaXRfdW50aWxfcmVhZHkoKCphcmcubGhzX25vdGlmaWNhdGlvbnMpW2Jsb2NrQUlkXSk7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IG51bWV4dDo6bWluaShtX2Jhc2Vfc3RhcnQgKyBhcmcubWMsIGFyZy5tYXhfbSkgLSBtX2Jhc2Vfc3RhcnQ7CisgICAgICAgIGdlYnAoYXJnLm91dHB1dC5nZXRTdWJNYXBwZXIobV9iYXNlX3N0YXJ0LCBhcmcubiksCisgICAgICAgICAgICAgKCphcmcuYmxvY2tBcylbYmxvY2tBSWRdLCBhcmcuYmxvY2tCLAorICAgICAgICAgICAgIGFjdHVhbF9tYywgYXJnLmtjLCBhcmcubmMsIFNjYWxhcigxKSwgLTEsIC0xLCAwLCAwKTsKKworICAgICAgICAvLyBOb3RpZnkgdGhhdCB0aGUga2VybmVsIGlzIGRvbmUuCisgICAgICAgIGNvbnN0IEluZGV4IHNldF9pZHggPSBibG9ja0FJZCAqIGFyZy5uX2Jsb2NrcyArIGFyZy5uX2Jsb2NrX2lkeDsKKyAgICAgICAgKCphcmcua2VybmVsX25vdGlmaWNhdGlvbnMpW3NldF9pZHhdLT5Ob3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAgLy8gRUlHRU5fVVNFX1NJTVBMRV9USFJFQURfUE9PTAorCisgIFRlbnNvck9wQ29zdCBjb250cmFjdGlvbkNvc3QoSW5kZXggbSwgSW5kZXggbiwgSW5kZXggYm0sIEluZGV4IGJuLCBJbmRleCBiaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNoYXJkX2J5X2NvbCwgYm9vbCBwcmVwYWNrZWQpIGNvbnN0IHsKKyAgICBjb25zdCBpbnQgcGFja2VkX3NpemUgPSBzdGQ6Om1pbjxpbnQ+KFBhY2tldFR5cGU8TGhzU2NhbGFyLCBEZXZpY2U+OjpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0VHlwZTxSaHNTY2FsYXIsIERldmljZT46OnNpemUpOworICAgIGNvbnN0IGludCBvdXRwdXRfcGFja2V0X3NpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIGNvbnN0IGRvdWJsZSBrZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYmspOworICAgIC8vIFBlYWsgVkZNQSBiYW5kd2lkdGggaXMgMC41LiBIb3dldmVyIGlmIHdlIGhhdmUgbm90IGVub3VnaCBkYXRhIGZvcgorICAgIC8vIHZlY3Rvcml6YXRpb24gYmFuZHdpZHRoIGRyb3BzLiBUaGUgNC4wIGFuZCAyLjAgYmFuZHdpZHRoIGlzIGRldGVybWluZWQKKyAgICAvLyBleHBlcmltZW50YWxseS4KKyAgICBkb3VibGUgY29tcHV0ZUJhbmR3aWR0aCA9IGJrID09IDEgPyA0LjAgOgorICAgICAgICAgIChzaGFyZF9ieV9jb2wgPyBibiA6IGJtKSA8IFRyYWl0czo6bnIgfHwKKyAgICAgICAgICAoc2hhcmRfYnlfY29sID8gYm0gOiBibikgPCBUcmFpdHM6Om1yID8gMi4wIDogMC41OworI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkVfRk1BCisgICAgLy8gQmFuZHdpZHRoIG9mIGFsbCBvZiBWRk1BL01VTFBTL0FERFBTIGlzIDAuNSBvbiBsYXRlc3QgSW50ZWwgcHJvY2Vzc29ycy4KKyAgICAvLyBIb3dldmVyIGZvciBNVUxQUy9BRERQUyB3ZSBoYXZlIGRlcGVuZGVudCBzZXF1ZW5jZSBvZiAyIHN1Y2ggaW5zdHJ1Y3Rpb25zLAorICAgIC8vIHNvIG92ZXJhbGwgYmFuZHdpZHRoIGlzIDEuMC4KKyAgICBpZiAoY29tcHV0ZUJhbmR3aWR0aCA9PSAwLjUpIGNvbXB1dGVCYW5kd2lkdGggPSAxLjA7CisjZW5kaWYKKyAgICAvLyBDb21wdXRhdGlvbnMuCisgICAgVGVuc29yT3BDb3N0IGNvc3QgPSBUZW5zb3JPcENvc3QoMCwgMCwga2QgKiBjb21wdXRlQmFuZHdpZHRoLCB0cnVlLCBwYWNrZWRfc2l6ZSk7CisgICAgLy8gT3V0cHV0IHN0b3Jlcy4KKyAgICBjb3N0ICs9IFRlbnNvck9wQ29zdCgwLCBzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSwgMCwgdHJ1ZSwgb3V0cHV0X3BhY2tldF9zaXplKTsKKyAgICBpZiAocHJlcGFja2VkKSB7CisgICAgICAvLyBQYWNraW5nIGFuZCBrZXJuZWxzIGFyZSBleGVjdXRlZCBpbiBkaWZmZXJlbnQgdGFza3MuIFdoZW4gd2UgY2FsY3VsYXRlCisgICAgICAvLyB0YXNrIGdyYWluIHNpemUgd2UgbG9vayBvbmx5IGF0IGtlcm5lbCBjb3N0IGFzc3VtaW5nIHRoYXQga2VybmVsCisgICAgICAvLyBpcyBtb3JlIGV4cGVuc2l2ZSB0aGFuIHBhY2tpbmcuCisgICAgICByZXR1cm4gY29zdDsKKyAgICB9CisgICAgLy8gTGhzL3JocyBsb2FkcyArIGNvbXB1dGF0aW9ucy4KKyAgICBUZW5zb3JPcENvc3QgbGhzQ29zdCA9IHRoaXMtPm1fbGVmdEltcGwuY29zdFBlckNvZWZmKHRydWUpICogKGtkIC8gbik7CisgICAgVGVuc29yT3BDb3N0IHJoc0Nvc3QgPSB0aGlzLT5tX3JpZ2h0SW1wbC5jb3N0UGVyQ29lZmYodHJ1ZSkgKiAoa2QgLyBtKTsKKyAgICAvLyBMaHMgcGFja2luZyBtZW1vcnkgY29zdCBkb2VzIG5vdCBjb250cmlidXRlIGNvbnNpZGVyYWJseSB0byBvdmVyYWxsCisgICAgLy8gZXhlY3V0aW9uIHRpbWUgYmVjYXVzZSBsaHMgaXMgcHJlZmV0Y2hlZCBlYXJseSBhbmQgYWNjZXNzZWQgc2VxdWVudGlhbGx5LgorICAgIGlmIChzaGFyZF9ieV9jb2wpCisgICAgICBsaHNDb3N0LmRyb3BNZW1vcnlDb3N0KCk7CisgICAgZWxzZQorICAgICAgcmhzQ29zdC5kcm9wTWVtb3J5Q29zdCgpOworICAgIHJldHVybiBjb3N0ICsgbGhzQ29zdCArIHJoc0Nvc3Q7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX1VTRV9USFJFQURTCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05UUkFDVElPTl9USFJFQURfUE9PTF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnZlcnNpb24uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGE2OTQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnZlcnNpb24uaApAQCAtMCwwICsxLDI3OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlZFUlNJT05fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0NPTlZFUlNJT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckNvbnZlcnNpb25PcAorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUZW5zb3IgY29udmVyc2lvbiBjbGFzcy4gVGhpcyBjbGFzcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB2ZWN0b3JpemUKKyAgKiB0eXBlIGNhc3Rpbmcgb3BlcmF0aW9ucyB3aGVuIHRoZSBudW1iZXIgb2Ygc2NhbGFycyBwZXIgcGFja2V0IGluIHRoZSBzb3VyY2UKKyAgKiBhbmQgdGhlIGRlc3RpbmF0aW9uIHR5cGUgZGlmZmVyCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0VHlwZSwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCB0cmFpdHM8VGVuc29yQ29udmVyc2lvbk9wPFRhcmdldFR5cGUsIFhwclR5cGU+ID4KK3sKKyAgLy8gVHlwZSBwcm9tb3Rpb24gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0eXBlcyBvZiB0aGUgbGhzIGFuZCB0aGUgcmhzIGFyZSBkaWZmZXJlbnQuCisgIHR5cGVkZWYgVGFyZ2V0VHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IHRyYWl0czxYcHJUeXBlPjo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSB0cmFpdHM8WHByVHlwZT46OkxheW91dDsKKyAgZW51bSB7IEZsYWdzID0gMCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0VHlwZSwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvckNvbnZlcnNpb25PcDxUYXJnZXRUeXBlLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckNvbnZlcnNpb25PcDxUYXJnZXRUeXBlLCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRhcmdldFR5cGUsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvckNvbnZlcnNpb25PcDxUYXJnZXRUeXBlLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDb252ZXJzaW9uT3A8VGFyZ2V0VHlwZSwgWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDb252ZXJzaW9uT3A8VGFyZ2V0VHlwZSwgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yLCB0eXBlbmFtZSBTcmNQYWNrZXQsIHR5cGVuYW1lIFRndFBhY2tldCwgaW50IFNyY0NvZWZmUmF0aW8sIGludCBUZ3RDb2VmZlJhdGlvPgorc3RydWN0IFBhY2tldENvbnZlcnRlciB7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0Q29udmVydGVyKGNvbnN0IFRlbnNvckV2YWx1YXRvciYgaW1wbCkKKyAgICAgIDogbV9pbXBsKGltcGwpIHt9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZ3RQYWNrZXQgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwY2FzdDxTcmNQYWNrZXQsIFRndFBhY2tldD4obV9pbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yJiBtX2ltcGw7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3IsIHR5cGVuYW1lIFNyY1BhY2tldCwgdHlwZW5hbWUgVGd0UGFja2V0Pgorc3RydWN0IFBhY2tldENvbnZlcnRlcjxUZW5zb3JFdmFsdWF0b3IsIFNyY1BhY2tldCwgVGd0UGFja2V0LCAyLCAxPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0Q29udmVydGVyKGNvbnN0IFRlbnNvckV2YWx1YXRvciYgaW1wbCkKKyAgICAgIDogbV9pbXBsKGltcGwpIHt9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlLCB0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZ3RQYWNrZXQgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgY29uc3QgaW50IFNyY1BhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFNyY1BhY2tldD46OnNpemU7CisKKyAgICBTcmNQYWNrZXQgc3JjMSA9IG1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KTsKKyAgICBTcmNQYWNrZXQgc3JjMiA9IG1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4ICsgU3JjUGFja2V0U2l6ZSk7CisgICAgVGd0UGFja2V0IHJlc3VsdCA9IGludGVybmFsOjpwY2FzdDxTcmNQYWNrZXQsIFRndFBhY2tldD4oc3JjMSwgc3JjMik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yJiBtX2ltcGw7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yLCB0eXBlbmFtZSBTcmNQYWNrZXQsIHR5cGVuYW1lIFRndFBhY2tldD4KK3N0cnVjdCBQYWNrZXRDb252ZXJ0ZXI8VGVuc29yRXZhbHVhdG9yLCBTcmNQYWNrZXQsIFRndFBhY2tldCwgNCwgMT4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldENvbnZlcnRlcihjb25zdCBUZW5zb3JFdmFsdWF0b3ImIGltcGwpCisgICAgICA6IG1faW1wbChpbXBsKSB7fQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGd0UGFja2V0IHBhY2tldChJbmRleCBpbmRleCkgY29uc3QgeworICAgIGNvbnN0IGludCBTcmNQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxTcmNQYWNrZXQ+OjpzaXplOworCisgICAgU3JjUGFja2V0IHNyYzEgPSBtX2ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCk7CisgICAgU3JjUGFja2V0IHNyYzIgPSBtX2ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCArIFNyY1BhY2tldFNpemUpOworICAgIFNyY1BhY2tldCBzcmMzID0gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXggKyAyICogU3JjUGFja2V0U2l6ZSk7CisgICAgU3JjUGFja2V0IHNyYzQgPSBtX2ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCArIDMgKiBTcmNQYWNrZXRTaXplKTsKKyAgICBUZ3RQYWNrZXQgcmVzdWx0ID0gaW50ZXJuYWw6OnBjYXN0PFNyY1BhY2tldCwgVGd0UGFja2V0PihzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyBwcml2YXRlOgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3ImIG1faW1wbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3IsIHR5cGVuYW1lIFNyY1BhY2tldCwgdHlwZW5hbWUgVGd0UGFja2V0Pgorc3RydWN0IFBhY2tldENvbnZlcnRlcjxUZW5zb3JFdmFsdWF0b3IsIFNyY1BhY2tldCwgVGd0UGFja2V0LCAxLCAyPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0Q29udmVydGVyKGNvbnN0IFRlbnNvckV2YWx1YXRvciYgaW1wbCkKKyAgICAgIDogbV9pbXBsKGltcGwpLCBtX21heEluZGV4KGltcGwuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSB7fQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZSwgdHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGd0UGFja2V0IHBhY2tldChJbmRleCBpbmRleCkgY29uc3QgeworICAgIGNvbnN0IGludCBTcmNQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxTcmNQYWNrZXQ+OjpzaXplOworICAgIC8vIE9ubHkgY2FsbCBtX2ltcGwucGFja2V0KCkgd2hlbiB3ZSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgZGF0YS4gVGhpcworICAgIC8vIGVuc3VyZXMgdGhhdCB3ZSBkb24ndCBjb21wdXRlIHRoZSBzdWJleHByZXNzaW9uIHR3aWNlLiBXZSBtYXkgaG93ZXZlciBsb2FkIHNvbWUKKyAgICAvLyBjb2VmZmljaWVudHMgdHdpY2UsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIGRvZXNuJ3QgbmVnYXRpdmVseSBpbXBhY3QgcGVyZm9ybWFuY2UuCisgICAgaWYgKG1faW1wbC5kYXRhKCkgJiYgKGluZGV4ICsgU3JjUGFja2V0U2l6ZSA8IG1fbWF4SW5kZXgpKSB7CisgICAgICAvLyBGb3JjZSB1bmFsaWduZWQgbWVtb3J5IGxvYWRzIHNpbmNlIHdlIGNhbid0IGVuc3VyZSBhbGlnbm1lbnQgYW55bW9yZQorICAgICAgcmV0dXJuIGludGVybmFsOjpwY2FzdDxTcmNQYWNrZXQsIFRndFBhY2tldD4obV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGluZGV4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBUZ3RQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxUZ3RQYWNrZXQ+OjpzaXplOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFNyY1BhY2tldD46OnR5cGUgU3JjVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxUZ3RQYWNrZXQ+Ojp0eXBlIFRndFR5cGU7CisgICAgICBpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8U3JjVHlwZSwgVGd0VHlwZT4gY29udmVydGVyOworICAgICAgRUlHRU5fQUxJR05fTUFYIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8VGd0UGFja2V0Pjo6dHlwZSB2YWx1ZXNbVGd0UGFja2V0U2l6ZV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRndFBhY2tldFNpemU7ICsraSkgeworICAgICAgICB2YWx1ZXNbaV0gPSBjb252ZXJ0ZXIobV9pbXBsLmNvZWZmKGluZGV4K2kpKTsKKyAgICAgIH0KKyAgICAgIFRndFBhY2tldCByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFRndFBhY2tldD4odmFsdWVzKTsKKyAgICAgIHJldHVybiByc2x0OworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yJiBtX2ltcGw7CisgIGNvbnN0IHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjo6SW5kZXggbV9tYXhJbmRleDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRhcmdldFR5cGUsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBUZW5zb3JDb252ZXJzaW9uT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDb252ZXJzaW9uT3A8VGFyZ2V0VHlwZSwgWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNvbnZlcnNpb25PcD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckNvbnZlcnNpb25PcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDb252ZXJzaW9uT3A+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ29udmVyc2lvbk9wPjo6dHlwZSBOZXN0ZWQ7CisgICAgdHlwZWRlZiBTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQ29udmVyc2lvbk9wKGNvbnN0IFhwclR5cGUmIHhwcikKKyAgICAgICAgOiBtX3hwcih4cHIpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKK307CisKK3RlbXBsYXRlIDxib29sIFNhbWVUeXBlLCB0eXBlbmFtZSBFdmFsLCB0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBDb252ZXJzaW9uU3ViRXhwckV2YWwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIHJ1bihFdmFsJiBpbXBsLCBTY2FsYXIqKSB7CisgICAgaW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV2YWwsIHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IENvbnZlcnNpb25TdWJFeHByRXZhbDx0cnVlLCBFdmFsLCBTY2FsYXI+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBydW4oRXZhbCYgaW1wbCwgU2NhbGFyKiBkYXRhKSB7CisgICAgcmV0dXJuIGltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoZGF0YSk7CisgIH0KK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIFRhcmdldFR5cGUsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udmVyc2lvbk9wPFRhcmdldFR5cGUsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yQ29udmVyc2lvbk9wPFRhcmdldFR5cGUsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKyAgdHlwZWRlZiBUYXJnZXRUeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiBUYXJnZXRUeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZ1R5cGU+OjpTY2FsYXI+Ojp0eXBlIFNyY1R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPFNyY1R5cGUsIERldmljZT46OnR5cGUgUGFja2V0U291cmNlVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSB0cnVlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpCisgIHsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1faW1wbC5kaW1lbnNpb25zKCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiBkYXRhKQorICB7CisgICAgcmV0dXJuIENvbnZlcnNpb25TdWJFeHByRXZhbDxpbnRlcm5hbDo6aXNfc2FtZTxUYXJnZXRUeXBlLCBTcmNUeXBlPjo6dmFsdWUsIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+LCBTY2FsYXI+OjpydW4obV9pbXBsLCBkYXRhKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkKKyAgeworICAgIG1faW1wbC5jbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGludGVybmFsOjpzY2FsYXJfY2FzdF9vcDxTcmNUeXBlLCBUYXJnZXRUeXBlPiBjb252ZXJ0ZXI7CisgICAgcmV0dXJuIGNvbnZlcnRlcihtX2ltcGwuY29lZmYoaW5kZXgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGNvbnN0IGJvb2wgVmVjdG9yaXphYmxlID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmCisgICAgICAgIGludGVybmFsOjp0eXBlX2Nhc3RpbmdfdHJhaXRzPFNyY1R5cGUsIFRhcmdldFR5cGU+OjpWZWN0b3JpemVkQ2FzdDsKKyAgICByZXR1cm4gUGFja2V0Q29udjxMb2FkTW9kZSwgVmVjdG9yaXphYmxlPjo6cnVuKG1faW1wbCwgaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIGNvbnN0IGRvdWJsZSBjYXN0X2Nvc3QgPSBUZW5zb3JPcENvc3Q6OkNhc3RDb3N0PFNyY1R5cGUsIFRhcmdldFR5cGU+KCk7CisgICAgaWYgKHZlY3Rvcml6ZWQpIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBTcmNDb2VmZlJhdGlvID0KKyAgICAgICAgICBpbnRlcm5hbDo6dHlwZV9jYXN0aW5nX3RyYWl0czxTcmNUeXBlLCBUYXJnZXRUeXBlPjo6U3JjQ29lZmZSYXRpbzsKKyAgICAgIGNvbnN0IGRvdWJsZSBUZ3RDb2VmZlJhdGlvID0KKyAgICAgICAgICBpbnRlcm5hbDo6dHlwZV9jYXN0aW5nX3RyYWl0czxTcmNUeXBlLCBUYXJnZXRUeXBlPjo6VGd0Q29lZmZSYXRpbzsKKyAgICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICogKFNyY0NvZWZmUmF0aW8gLyBQYWNrZXRTaXplKSArCisgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIFRndENvZWZmUmF0aW8gKiAoY2FzdF9jb3N0IC8gUGFja2V0U2l6ZSkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArIFRlbnNvck9wQ29zdCgwLCAwLCBjYXN0X2Nvc3QpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICBwcm90ZWN0ZWQ6CisgIHRlbXBsYXRlIDxpbnQgTG9hZE1vZGUsIGJvb2wgQWN0dWFsbHlWZWN0b3JpemU+CisgIHN0cnVjdCBQYWNrZXRDb252IHsKKyAgICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHJ1bihjb25zdCBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiYgaW1wbCwgSW5kZXggaW5kZXgpIHsKKyAgICAgIGludGVybmFsOjpzY2FsYXJfY2FzdF9vcDxTcmNUeXBlLCBUYXJnZXRUeXBlPiBjb252ZXJ0ZXI7CisgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgIHZhbHVlc1tpXSA9IGNvbnZlcnRlcihpbXBsLmNvZWZmKGluZGV4K2kpKTsKKyAgICAgIH0KKyAgICAgIFBhY2tldFJldHVyblR5cGUgcnNsdCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMpOworICAgICAgcmV0dXJuIHJzbHQ7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxpbnQgTG9hZE1vZGU+CisgIHN0cnVjdCBQYWNrZXRDb252PExvYWRNb2RlLCB0cnVlPiB7CisgICAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBydW4oY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4mIGltcGwsIEluZGV4IGluZGV4KSB7CisgICAgICBjb25zdCBpbnQgU3JjQ29lZmZSYXRpbyA9IGludGVybmFsOjp0eXBlX2Nhc3RpbmdfdHJhaXRzPFNyY1R5cGUsIFRhcmdldFR5cGU+OjpTcmNDb2VmZlJhdGlvOworICAgICAgY29uc3QgaW50IFRndENvZWZmUmF0aW8gPSBpbnRlcm5hbDo6dHlwZV9jYXN0aW5nX3RyYWl0czxTcmNUeXBlLCBUYXJnZXRUeXBlPjo6VGd0Q29lZmZSYXRpbzsKKyAgICAgIFBhY2tldENvbnZlcnRlcjxUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiwgUGFja2V0U291cmNlVHlwZSwgUGFja2V0UmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBTcmNDb2VmZlJhdGlvLCBUZ3RDb2VmZlJhdGlvPiBjb252ZXJ0ZXIoaW1wbCk7CisgICAgICByZXR1cm4gY29udmVydGVyLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0KKyAgfTsKKworICBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBtX2ltcGw7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVkVSU0lPTl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnZvbHV0aW9uLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckNvbnZvbHV0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZjc0MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29udm9sdXRpb24uaApAQCAtMCwwICsxLDExMDQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT05WT0xVVElPTl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVk9MVVRJT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckNvbnZvbHV0aW9uCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBjb252b2x1dGlvbiBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIElucHV0RGltcywgaW50IE51bUtlcm5lbERpbXMsIGludCBMYXlvdXQ+CitjbGFzcyBJbmRleE1hcHBlciB7CisgcHVibGljOgorICBJbmRleE1hcHBlcihjb25zdCBJbnB1dERpbXMmIGlucHV0X2RpbXMsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1LZXJuZWxEaW1zPiYga2VybmVsX2RpbXMsCisgICAgICAgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCBOdW1LZXJuZWxEaW1zPiYgaW5kaWNlcykgeworCisgICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IGRpbWVuc2lvbnMgPSBpbnB1dF9kaW1zOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtS2VybmVsRGltczsgKytpKSB7CisgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGluZGljZXNbaV07CisgICAgICBjb25zdCBJbmRleCBpbnB1dF9kaW0gPSBpbnB1dF9kaW1zW2luZGV4XTsKKyAgICAgIGNvbnN0IEluZGV4IGtlcm5lbF9kaW0gPSBrZXJuZWxfZGltc1tpXTsKKyAgICAgIGNvbnN0IEluZGV4IHJlc3VsdF9kaW0gPSBpbnB1dF9kaW0gLSBrZXJuZWxfZGltICsgMTsKKyAgICAgIGRpbWVuc2lvbnNbaW5kZXhdID0gcmVzdWx0X2RpbTsKKyAgICB9CisKKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gaW5wdXRTdHJpZGVzOworICAgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBvdXRwdXRTdHJpZGVzOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGlucHV0U3RyaWRlc1swXSA9IDE7CisgICAgICBvdXRwdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgIGlucHV0U3RyaWRlc1tpXSA9IGlucHV0U3RyaWRlc1tpLTFdICogaW5wdXRfZGltc1tpLTFdOworICAgICAgICBvdXRwdXRTdHJpZGVzW2ldID0gb3V0cHV0U3RyaWRlc1tpLTFdICogZGltZW5zaW9uc1tpLTFdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnB1dFN0cmlkZXNbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIG91dHB1dFN0cmlkZXNbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KE51bURpbXMpIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgaW5wdXRTdHJpZGVzW2ldID0gaW5wdXRTdHJpZGVzW2kgKyAxXSAqIGlucHV0X2RpbXNbaSArIDFdOworICAgICAgICBvdXRwdXRTdHJpZGVzW2ldID0gb3V0cHV0U3RyaWRlc1tpICsgMV0gKiBkaW1lbnNpb25zW2kgKyAxXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gY3VkYUlucHV0RGltZW5zaW9uczsKKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gY3VkYU91dHB1dERpbWVuc2lvbnM7CisgICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IHRtcCA9IGRpbWVuc2lvbnM7CisgICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG9yZGVyaW5nOworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1EaW1zIC0gTnVtS2VybmVsRGltczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bUtlcm5lbERpbXM7ICsraSkgeworICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpICsgb2Zmc2V0OworICAgICAgb3JkZXJpbmdbaW5kZXhdID0gaW5kaWNlc1tpXTsKKyAgICAgIHRtcFtpbmRpY2VzW2ldXSA9IC0xOworICAgICAgY3VkYUlucHV0RGltZW5zaW9uc1tpbmRleF0gPSBpbnB1dF9kaW1zW2luZGljZXNbaV1dOworICAgICAgY3VkYU91dHB1dERpbWVuc2lvbnNbaW5kZXhdID0gZGltZW5zaW9uc1tpbmRpY2VzW2ldXTsKKyAgICB9CisKKyAgICBpbnQgd3JpdHRlbiA9IHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKQorICAgICAgICAgICAgICAgICAgICAgID8gTnVtS2VybmVsRGltcworICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgaWYgKHRtcFtpXSA+PSAwKSB7CisgICAgICAgIG9yZGVyaW5nW3dyaXR0ZW5dID0gaTsKKyAgICAgICAgY3VkYUlucHV0RGltZW5zaW9uc1t3cml0dGVuXSA9IGlucHV0X2RpbXNbaV07CisgICAgICAgIGN1ZGFPdXRwdXREaW1lbnNpb25zW3dyaXR0ZW5dID0gZGltZW5zaW9uc1tpXTsKKyAgICAgICAgKyt3cml0dGVuOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IGlucHV0U3RyaWRlc1tvcmRlcmluZ1tpXV07CisgICAgICBtX291dHB1dFN0cmlkZXNbaV0gPSBvdXRwdXRTdHJpZGVzW29yZGVyaW5nW2ldXTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBpZiAoaSA+IE51bUtlcm5lbERpbXMpIHsKKyAgICAgICAgICBtX2N1ZGFJbnB1dFN0cmlkZXNbaV0gPQorICAgICAgICAgICAgICBtX2N1ZGFJbnB1dFN0cmlkZXNbaSAtIDFdICogY3VkYUlucHV0RGltZW5zaW9uc1tpIC0gMV07CisgICAgICAgICAgbV9jdWRhT3V0cHV0U3RyaWRlc1tpXSA9CisgICAgICAgICAgICAgIG1fY3VkYU91dHB1dFN0cmlkZXNbaSAtIDFdICogY3VkYU91dHB1dERpbWVuc2lvbnNbaSAtIDFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fY3VkYUlucHV0U3RyaWRlc1tpXSA9IDE7CisgICAgICAgICAgbV9jdWRhT3V0cHV0U3RyaWRlc1tpXSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBpZiAoaSArIDEgPCBvZmZzZXQpIHsKKyAgICAgICAgICBtX2N1ZGFJbnB1dFN0cmlkZXNbaV0gPQorICAgICAgICAgICAgICBtX2N1ZGFJbnB1dFN0cmlkZXNbaSArIDFdICogY3VkYUlucHV0RGltZW5zaW9uc1tpICsgMV07CisgICAgICAgICAgbV9jdWRhT3V0cHV0U3RyaWRlc1tpXSA9CisgICAgICAgICAgICAgIG1fY3VkYU91dHB1dFN0cmlkZXNbaSArIDFdICogY3VkYU91dHB1dERpbWVuc2lvbnNbaSArIDFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fY3VkYUlucHV0U3RyaWRlc1tpXSA9IDE7CisgICAgICAgICAgbV9jdWRhT3V0cHV0U3RyaWRlc1tpXSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IG1hcEN1ZGFJbnB1dFBsYW5lVG9UZW5zb3JJbnB1dE9mZnNldChJbmRleCBwKSBjb25zdCB7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgZCA9IE51bURpbXMgLSAxOyBkID4gTnVtS2VybmVsRGltczsgLS1kKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IHAgLyBtX2N1ZGFJbnB1dFN0cmlkZXNbZF07CisgICAgICAgIGlucHV0SW5kZXggKz0gaWR4ICogbV9pbnB1dFN0cmlkZXNbZF07CisgICAgICAgIHAgLT0gaWR4ICogbV9jdWRhSW5wdXRTdHJpZGVzW2RdOworICAgICAgfQorICAgICAgaW5wdXRJbmRleCArPSBwICogbV9pbnB1dFN0cmlkZXNbTnVtS2VybmVsRGltc107CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6cHRyZGlmZl90IGxpbWl0ID0gMDsKKyAgICAgIGlmIChOdW1LZXJuZWxEaW1zIDwgTnVtRGltcykgeworICAgICAgICBsaW1pdCA9IE51bURpbXMgLSBOdW1LZXJuZWxEaW1zIC0gMTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgbGltaXQ7ICsrZCkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBwIC8gbV9jdWRhSW5wdXRTdHJpZGVzW2RdOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2RdOworICAgICAgICBwIC09IGlkeCAqIG1fY3VkYUlucHV0U3RyaWRlc1tkXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kZXggKz0gcCAqIG1faW5wdXRTdHJpZGVzW2xpbWl0XTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0SW5kZXg7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEluZGV4IG1hcEN1ZGFPdXRwdXRQbGFuZVRvVGVuc29yT3V0cHV0T2Zmc2V0KEluZGV4IHApIGNvbnN0IHsKKyAgICBJbmRleCBvdXRwdXRJbmRleCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgZCA9IE51bURpbXMgLSAxOyBkID4gTnVtS2VybmVsRGltczsgLS1kKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IHAgLyBtX2N1ZGFPdXRwdXRTdHJpZGVzW2RdOworICAgICAgICBvdXRwdXRJbmRleCArPSBpZHggKiBtX291dHB1dFN0cmlkZXNbZF07CisgICAgICAgIHAgLT0gaWR4ICogbV9jdWRhT3V0cHV0U3RyaWRlc1tkXTsKKyAgICAgIH0KKyAgICAgIG91dHB1dEluZGV4ICs9IHAgKiBtX291dHB1dFN0cmlkZXNbTnVtS2VybmVsRGltc107CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6cHRyZGlmZl90IGxpbWl0ID0gMDsKKyAgICAgIGlmIChOdW1LZXJuZWxEaW1zIDwgTnVtRGltcykgeworICAgICAgICBsaW1pdCA9IE51bURpbXMgLSBOdW1LZXJuZWxEaW1zIC0gMTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgbGltaXQ7ICsrZCkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBwIC8gbV9jdWRhT3V0cHV0U3RyaWRlc1tkXTsKKyAgICAgICAgb3V0cHV0SW5kZXggKz0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2RdOworICAgICAgICBwIC09IGlkeCAqIG1fY3VkYU91dHB1dFN0cmlkZXNbZF07CisgICAgICB9CisgICAgICBvdXRwdXRJbmRleCArPSBwICogbV9vdXRwdXRTdHJpZGVzW2xpbWl0XTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dEluZGV4OworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBtYXBDdWRhSW5wdXRLZXJuZWxUb1RlbnNvcklucHV0T2Zmc2V0KEluZGV4IGkpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtRGltcyAtIE51bUtlcm5lbERpbXM7CisgICAgcmV0dXJuIGkgKiBtX2lucHV0U3RyaWRlc1tvZmZzZXRdOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBtYXBDdWRhT3V0cHV0S2VybmVsVG9UZW5zb3JPdXRwdXRPZmZzZXQoSW5kZXggaSkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1EaW1zIC0gTnVtS2VybmVsRGltczsKKyAgICByZXR1cm4gaSAqIG1fb3V0cHV0U3RyaWRlc1tvZmZzZXRdOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBtYXBDdWRhSW5wdXRLZXJuZWxUb1RlbnNvcklucHV0T2Zmc2V0KEluZGV4IGksIEluZGV4IGopIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtRGltcyAtIE51bUtlcm5lbERpbXM7CisgICAgcmV0dXJuIGkgKiBtX2lucHV0U3RyaWRlc1tvZmZzZXRdICsgaiAqIG1faW5wdXRTdHJpZGVzW29mZnNldCArIDFdOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBJbmRleCBtYXBDdWRhT3V0cHV0S2VybmVsVG9UZW5zb3JPdXRwdXRPZmZzZXQoSW5kZXggaSwgSW5kZXggaikgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1EaW1zIC0gTnVtS2VybmVsRGltczsKKyAgICByZXR1cm4gaSAqIG1fb3V0cHV0U3RyaWRlc1tvZmZzZXRdICsgaiAqIG1fb3V0cHV0U3RyaWRlc1tvZmZzZXQgKyAxXTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggbWFwQ3VkYUlucHV0S2VybmVsVG9UZW5zb3JJbnB1dE9mZnNldChJbmRleCBpLCBJbmRleCBqLCBJbmRleCBrKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bURpbXMgLSBOdW1LZXJuZWxEaW1zOworICAgIHJldHVybiBpICogbV9pbnB1dFN0cmlkZXNbb2Zmc2V0XSArIGogKiBtX2lucHV0U3RyaWRlc1tvZmZzZXQgKyAxXSArCisgICAgICAgICAgIGsgKiBtX2lucHV0U3RyaWRlc1tvZmZzZXQgKyAyXTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgSW5kZXggbWFwQ3VkYU91dHB1dEtlcm5lbFRvVGVuc29yT3V0cHV0T2Zmc2V0KEluZGV4IGksIEluZGV4IGosIEluZGV4IGspIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtRGltcyAtIE51bUtlcm5lbERpbXM7CisgICAgcmV0dXJuIGkgKiBtX291dHB1dFN0cmlkZXNbb2Zmc2V0XSArIGogKiBtX291dHB1dFN0cmlkZXNbb2Zmc2V0ICsgMV0gKworICAgICAgICAgICBrICogbV9vdXRwdXRTdHJpZGVzW29mZnNldCArIDJdOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxJbnB1dERpbXM+Ojp2YWx1ZTsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9vdXRwdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9jdWRhSW5wdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9jdWRhT3V0cHV0U3RyaWRlczsKK307CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEaW1lbnNpb25zLCB0eXBlbmFtZSBJbnB1dFhwclR5cGUsIHR5cGVuYW1lIEtlcm5lbFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckNvbnZvbHV0aW9uT3A8RGltZW5zaW9ucywgSW5wdXRYcHJUeXBlLCBLZXJuZWxYcHJUeXBlPiA+Cit7CisgIC8vIFR5cGUgcHJvbW90aW9uIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdHlwZXMgb2YgdGhlIGxocyBhbmQgdGhlIHJocyBhcmUgZGlmZmVyZW50LgorICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIElucHV0WHByVHlwZTo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEtlcm5lbFhwclR5cGU6OlNjYWxhcj46OnJldCBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgdHJhaXRzPElucHV0WHByVHlwZT46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxLZXJuZWxYcHJUeXBlPjo6U3RvcmFnZUtpbmQ+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxJbnB1dFhwclR5cGU+OjpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEtlcm5lbFhwclR5cGU+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW5wdXRYcHJUeXBlOjpOZXN0ZWQgTGhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEtlcm5lbFhwclR5cGU6Ok5lc3RlZCBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IHRyYWl0czxJbnB1dFhwclR5cGU+OjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IHRyYWl0czxJbnB1dFhwclR5cGU+OjpMYXlvdXQ7CisKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEaW1lbnNpb25zLCB0eXBlbmFtZSBJbnB1dFhwclR5cGUsIHR5cGVuYW1lIEtlcm5lbFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JDb252b2x1dGlvbk9wPERpbWVuc2lvbnMsIElucHV0WHByVHlwZSwgS2VybmVsWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JDb252b2x1dGlvbk9wPERpbWVuc2lvbnMsIElucHV0WHByVHlwZSwgS2VybmVsWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEaW1lbnNpb25zLCB0eXBlbmFtZSBJbnB1dFhwclR5cGUsIHR5cGVuYW1lIEtlcm5lbFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvckNvbnZvbHV0aW9uT3A8RGltZW5zaW9ucywgSW5wdXRYcHJUeXBlLCBLZXJuZWxYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDb252b2x1dGlvbk9wPERpbWVuc2lvbnMsIElucHV0WHByVHlwZSwgS2VybmVsWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDb252b2x1dGlvbk9wPERpbWVuc2lvbnMsIElucHV0WHByVHlwZSwgS2VybmVsWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGljZXMsIHR5cGVuYW1lIElucHV0WHByVHlwZSwgdHlwZW5hbWUgS2VybmVsWHByVHlwZT4KK2NsYXNzIFRlbnNvckNvbnZvbHV0aW9uT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDb252b2x1dGlvbk9wPEluZGljZXMsIElucHV0WHByVHlwZSwgS2VybmVsWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ29udm9sdXRpb25PcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnByb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIElucHV0WHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBLZXJuZWxYcHJUeXBlOjpDb2VmZlJldHVyblR5cGU+OjpyZXQgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvckNvbnZvbHV0aW9uT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDb252b2x1dGlvbk9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ29udm9sdXRpb25PcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yQ29udm9sdXRpb25PcChjb25zdCBJbnB1dFhwclR5cGUmIGlucHV0LCBjb25zdCBLZXJuZWxYcHJUeXBlJiBrZXJuZWwsIGNvbnN0IEluZGljZXMmIGRpbXMpCisgICAgICA6IG1faW5wdXRfeHByKGlucHV0KSwgbV9rZXJuZWxfeHByKGtlcm5lbCksIG1faW5kaWNlcyhkaW1zKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IEluZGljZXMmIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb25zICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIElucHV0WHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBpbnB1dEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2lucHV0X3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIEtlcm5lbFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAga2VybmVsRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fa2VybmVsX3hwcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBJbnB1dFhwclR5cGU6Ok5lc3RlZCBtX2lucHV0X3hwcjsKKyAgICB0eXBlbmFtZSBLZXJuZWxYcHJUeXBlOjpOZXN0ZWQgbV9rZXJuZWxfeHByOworICAgIGNvbnN0IEluZGljZXMgbV9pbmRpY2VzOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRpY2VzLCB0eXBlbmFtZSBJbnB1dEFyZ1R5cGUsIHR5cGVuYW1lIEtlcm5lbEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ29udm9sdXRpb25PcDxJbmRpY2VzLCBJbnB1dEFyZ1R5cGUsIEtlcm5lbEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yQ29udm9sdXRpb25PcDxJbmRpY2VzLCBJbnB1dEFyZ1R5cGUsIEtlcm5lbEFyZ1R5cGU+IFhwclR5cGU7CisKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bUtlcm5lbERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxJbmRpY2VzPjo6dmFsdWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkICYgVGVuc29yRXZhbHVhdG9yPEtlcm5lbEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MgJiBUZW5zb3JFdmFsdWF0b3I8S2VybmVsQXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbnB1dEltcGwob3AuaW5wdXRFeHByZXNzaW9uKCksIGRldmljZSksIG1fa2VybmVsSW1wbChvcC5rZXJuZWxFeHByZXNzaW9uKCksIGRldmljZSksIG1fa2VybmVsQXJnKG9wLmtlcm5lbEV4cHJlc3Npb24oKSksIG1fa2VybmVsKE5VTEwpLCBtX2xvY2FsX2tlcm5lbChmYWxzZSksIG1fZGV2aWNlKGRldmljZSkKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKHN0YXRpY19jYXN0PGludD4oVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxLZXJuZWxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIGNvbnN0IHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2lucHV0SW1wbC5kaW1lbnNpb25zKCk7CisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEtlcm5lbEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGtlcm5lbF9kaW1zID0gbV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKTsKKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIG1faW5wdXRTdHJpZGVbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9pbnB1dFN0cmlkZVtpXSA9IG1faW5wdXRTdHJpZGVbaSAtIDFdICogaW5wdXRfZGltc1tpIC0gMV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1faW5wdXRTdHJpZGVbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgbV9pbnB1dFN0cmlkZVtpXSA9IG1faW5wdXRTdHJpZGVbaSArIDFdICogaW5wdXRfZGltc1tpICsgMV07CisgICAgICB9CisgICAgfQorCisgICAgbV9kaW1lbnNpb25zID0gbV9pbnB1dEltcGwuZGltZW5zaW9ucygpOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtS2VybmVsRGltczsgKytpKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gb3AuaW5kaWNlcygpW2ldOworICAgICAgICBjb25zdCBJbmRleCBpbnB1dF9kaW0gPSBpbnB1dF9kaW1zW2luZGV4XTsKKyAgICAgICAgY29uc3QgSW5kZXgga2VybmVsX2RpbSA9IGtlcm5lbF9kaW1zW2ldOworICAgICAgICBjb25zdCBJbmRleCByZXN1bHRfZGltID0gaW5wdXRfZGltIC0ga2VybmVsX2RpbSArIDE7CisgICAgICAgIG1fZGltZW5zaW9uc1tpbmRleF0gPSByZXN1bHRfZGltOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICBtX2tlcm5lbFN0cmlkZVtpXSA9IG1fa2VybmVsU3RyaWRlW2kgLSAxXSAqIGtlcm5lbF9kaW1zW2kgLSAxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX2tlcm5lbFN0cmlkZVswXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgbV9pbmRleFN0cmlkZVtpXSA9IG1faW5wdXRTdHJpZGVbaW5kZXhdOworICAgICAgfQorCisgICAgICBtX291dHB1dFN0cmlkZVswXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBtX291dHB1dFN0cmlkZVtpXSA9IG1fb3V0cHV0U3RyaWRlW2kgLSAxXSAqIG1fZGltZW5zaW9uc1tpIC0gMV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1LZXJuZWxEaW1zIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBvcC5pbmRpY2VzKClbaV07CisgICAgICAgIGNvbnN0IEluZGV4IGlucHV0X2RpbSA9IGlucHV0X2RpbXNbaW5kZXhdOworICAgICAgICBjb25zdCBJbmRleCBrZXJuZWxfZGltID0ga2VybmVsX2RpbXNbaV07CisgICAgICAgIGNvbnN0IEluZGV4IHJlc3VsdF9kaW0gPSBpbnB1dF9kaW0gLSBrZXJuZWxfZGltICsgMTsKKyAgICAgICAgbV9kaW1lbnNpb25zW2luZGV4XSA9IHJlc3VsdF9kaW07CisgICAgICAgIGlmIChpIDwgTnVtS2VybmVsRGltcyAtIDEpIHsKKyAgICAgICAgICBtX2tlcm5lbFN0cmlkZVtpXSA9IG1fa2VybmVsU3RyaWRlW2kgKyAxXSAqIGtlcm5lbF9kaW1zW2kgKyAxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX2tlcm5lbFN0cmlkZVtOdW1LZXJuZWxEaW1zIC0gMV0gPSAxOworICAgICAgICB9CisgICAgICAgIG1faW5kZXhTdHJpZGVbaV0gPSBtX2lucHV0U3RyaWRlW2luZGV4XTsKKyAgICAgIH0KKworICAgICAgbV9vdXRwdXRTdHJpZGVbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVbaV0gPSBtX291dHB1dFN0cmlkZVtpICsgMV0gKiBtX2RpbWVuc2lvbnNbaSArIDFdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqKSB7CisgICAgbV9pbnB1dEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcHJlbG9hZEtlcm5lbCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1faW5wdXRJbXBsLmNsZWFudXAoKTsKKyAgICBpZiAobV9sb2NhbF9rZXJuZWwpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUoKHZvaWQqKW1fa2VybmVsKTsKKyAgICAgIG1fbG9jYWxfa2VybmVsID0gZmFsc2U7CisgICAgfQorICAgIG1fa2VybmVsID0gTlVMTDsKKyAgfQorCisgIHZvaWQgZXZhbFRvKHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciogYnVmZmVyKSB7CisgICAgZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCk7ICsraSkgeworICAgICAgYnVmZmVyW2ldICs9IGNvZWZmKGkpOworICAgIH0KKyAgICBjbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIENvZWZmUmV0dXJuVHlwZSByZXN1bHQgPSBDb2VmZlJldHVyblR5cGUoMCk7CisgICAgY29udm9sdmUoZmlyc3RJbnB1dChpbmRleCksIDAsIE51bUtlcm5lbERpbXMtMSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChjb25zdCBJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEluZGV4IGluZGljZXNbMl0gPSB7aW5kZXgsIGluZGV4K1BhY2tldFNpemUtMX07CisgICAgSW5kZXggc3RhcnRJbnB1dHNbMl0gPSB7MCwgMH07CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDAgPSBpbmRpY2VzWzBdIC8gbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDEgPSBpbmRpY2VzWzFdIC8gbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICAgIHN0YXJ0SW5wdXRzWzBdICs9IGlkeDAgKiBtX2lucHV0U3RyaWRlW2ldOworICAgICAgICBzdGFydElucHV0c1sxXSArPSBpZHgxICogbV9pbnB1dFN0cmlkZVtpXTsKKyAgICAgICAgaW5kaWNlc1swXSAtPSBpZHgwICogbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICAgIGluZGljZXNbMV0gLT0gaWR4MSAqIG1fb3V0cHV0U3RyaWRlW2ldOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGluZGljZXNbMF0gLyBtX291dHB1dFN0cmlkZVtpXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MSA9IGluZGljZXNbMV0gLyBtX291dHB1dFN0cmlkZVtpXTsKKyAgICAgICAgc3RhcnRJbnB1dHNbMF0gKz0gaWR4MCAqIG1faW5wdXRTdHJpZGVbaV07CisgICAgICAgIHN0YXJ0SW5wdXRzWzFdICs9IGlkeDEgKiBtX2lucHV0U3RyaWRlW2ldOworICAgICAgICBpbmRpY2VzWzBdIC09IGlkeDAgKiBtX291dHB1dFN0cmlkZVtpXTsKKyAgICAgICAgaW5kaWNlc1sxXSAtPSBpZHgxICogbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICB9CisgICAgfQorICAgIHN0YXJ0SW5wdXRzWzBdICs9IGluZGljZXNbMF07CisgICAgc3RhcnRJbnB1dHNbMV0gKz0gaW5kaWNlc1sxXTsKKworICAgIGlmIChzdGFydElucHV0c1sxXS1zdGFydElucHV0c1swXSA9PSBQYWNrZXRTaXplLTEpIHsKKyAgICAgIFBhY2tldFJldHVyblR5cGUgcmVzdWx0ID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KDApOworICAgICAgY29udm9sdmVQYWNrZXQoc3RhcnRJbnB1dHNbMF0sIDAsIE51bUtlcm5lbERpbXMtMSwgcmVzdWx0KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgZGF0YVtQYWNrZXRTaXplXTsKKyAgICAgIGRhdGFbMF0gPSBTY2FsYXIoMCk7CisgICAgICBjb252b2x2ZShzdGFydElucHV0c1swXSwgMCwgTnVtS2VybmVsRGltcy0xLCBkYXRhWzBdKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgUGFja2V0U2l6ZS0xOyArK2kpIHsKKyAgICAgICAgZGF0YVtpXSA9IFNjYWxhcigwKTsKKyAgICAgICAgY29udm9sdmUoZmlyc3RJbnB1dChpbmRleCtpKSwgMCwgTnVtS2VybmVsRGltcy0xLCBkYXRhW2ldKTsKKyAgICAgIH0KKyAgICAgIGRhdGFbUGFja2V0U2l6ZS0xXSA9IFNjYWxhcigwKTsKKyAgICAgIGNvbnZvbHZlKHN0YXJ0SW5wdXRzWzFdLCAwLCBOdW1LZXJuZWxEaW1zLTEsIGRhdGFbUGFja2V0U2l6ZS0xXSk7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KGRhdGEpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0CisgIGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICBjb25zdCBkb3VibGUga2VybmVsX3NpemUgPSBtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOworICAgIC8vIFdlIGlnbm9yZSB0aGUgdXNlIG9mIGZ1c2VkIG11bHRpcGx5LWFkZC4KKyAgICBjb25zdCBkb3VibGUgY29udm9sdmVfY29tcHV0ZV9jb3N0ID0KKyAgICAgICAgVGVuc29yT3BDb3N0OjpBZGRDb3N0PFNjYWxhcj4oKSArIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxTY2FsYXI+KCk7CisgICAgY29uc3QgZG91YmxlIGZpcnN0SW5kZXhfY29tcHV0ZV9jb3N0ID0KKyAgICAgICAgTnVtRGltcyAqCisgICAgICAgICgyICogVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpICsgMiAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICBUZW5zb3JPcENvc3Q6OkRpdkNvc3Q8SW5kZXg+KCkpOworICAgIHJldHVybiBUZW5zb3JPcENvc3QoMCwgMCwgZmlyc3RJbmRleF9jb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpICsKKyAgICAgICAgICAga2VybmVsX3NpemUgKiAobV9pbnB1dEltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9rZXJuZWxJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb252b2x2ZV9jb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXRTaXplKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyBwcml2YXRlOgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGZpcnN0SW5wdXQoSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBJbmRleCBzdGFydElucHV0ID0gMDsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX291dHB1dFN0cmlkZVtpXTsKKyAgICAgICAgc3RhcnRJbnB1dCArPSBpZHggKiBtX2lucHV0U3RyaWRlW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZVtpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zIC0gMTsgKytpKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICAgIHN0YXJ0SW5wdXQgKz0gaWR4ICogbV9pbnB1dFN0cmlkZVtpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVbaV07CisgICAgICB9CisgICAgfQorICAgIHN0YXJ0SW5wdXQgKz0gaW5kZXg7CisgICAgcmV0dXJuIHN0YXJ0SW5wdXQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnZvbHZlKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4IGZpcnN0S2VybmVsLCBpbnQgRGltSW5kZXgsIENvZWZmUmV0dXJuVHlwZSYgYWNjdW0pIGNvbnN0IHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKClbRGltSW5kZXhdOyArK2opIHsKKyAgICAgIGNvbnN0IEluZGV4IGlucHV0ID0gZmlyc3RJbmRleCArIGogKiBtX2luZGV4U3RyaWRlW0RpbUluZGV4XTsKKyAgICAgIGNvbnN0IEluZGV4IGtlcm5lbCA9IGZpcnN0S2VybmVsICsgaiAqIG1fa2VybmVsU3RyaWRlW0RpbUluZGV4XTsKKyAgICAgIGlmIChEaW1JbmRleCA+IDApIHsKKyAgICAgICAgY29udm9sdmUoaW5wdXQsIGtlcm5lbCwgRGltSW5kZXgtMSwgYWNjdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjdW0gKz0gbV9pbnB1dEltcGwuY29lZmYoaW5wdXQpICogbV9rZXJuZWxba2VybmVsXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNvbnZvbHZlUGFja2V0KEluZGV4IGZpcnN0SW5kZXgsIEluZGV4IGZpcnN0S2VybmVsLCBpbnQgRGltSW5kZXgsIFBhY2tldCYgYWNjdW0pIGNvbnN0IHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKClbRGltSW5kZXhdOyArK2opIHsKKyAgICAgIGNvbnN0IEluZGV4IGlucHV0ID0gZmlyc3RJbmRleCArIGogKiBtX2luZGV4U3RyaWRlW0RpbUluZGV4XTsKKyAgICAgIGNvbnN0IEluZGV4IGtlcm5lbCA9IGZpcnN0S2VybmVsICsgaiAqIG1fa2VybmVsU3RyaWRlW0RpbUluZGV4XTsKKyAgICAgIGlmIChEaW1JbmRleCA+IDApIHsKKyAgICAgICAgY29udm9sdmVQYWNrZXQoaW5wdXQsIGtlcm5lbCwgRGltSW5kZXgtMSwgYWNjdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjdW0gPSBpbnRlcm5hbDo6cG1hZGQ8UGFja2V0PihtX2lucHV0SW1wbC50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkPihpbnB1dCksIGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KG1fa2VybmVsW2tlcm5lbF0pLCBhY2N1bSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWxvYWRLZXJuZWwoKSB7CisgICAgLy8gRG9uJ3QgbWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIGtlcm5lbCB1bmxlc3Mgd2UgaGF2ZSB0byAoaS5lLiBpdCdzIGFuCisgICAgLy8gZXhwcmVzc2lvbiB0aGF0IG5lZWRzIHRvIGJlIGV2YWx1YXRlZCkKKyAgICBjb25zdCBTY2FsYXIqIGluX3BsYWNlID0gbV9rZXJuZWxJbXBsLmRhdGEoKTsKKyAgICBpZiAoaW5fcGxhY2UpIHsKKyAgICAgIG1fa2VybmVsID0gaW5fcGxhY2U7CisgICAgICBtX2xvY2FsX2tlcm5lbCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzaXplX3Qga2VybmVsX3N6ID0gbV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihTY2FsYXIpOworICAgICAgU2NhbGFyKiBsb2NhbCA9IChTY2FsYXIqKW1fZGV2aWNlLmFsbG9jYXRlKGtlcm5lbF9zeik7CisgICAgICB0eXBlZGVmIFRlbnNvckV2YWxUb09wPGNvbnN0IEtlcm5lbEFyZ1R5cGU+IEV2YWxUbzsKKyAgICAgIEV2YWxUbyBldmFsVG9UbXAobG9jYWwsIG1fa2VybmVsQXJnKTsKKyAgICAgIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gaW50ZXJuYWw6OklzVmVjdG9yaXphYmxlPERldmljZSwgS2VybmVsQXJnVHlwZT46OnZhbHVlOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEV2YWxUbywgRGV2aWNlLCBQYWNrZXRBY2Nlc3M+OjpydW4oZXZhbFRvVG1wLCBtX2RldmljZSk7CisKKyAgICAgIG1fa2VybmVsID0gbG9jYWw7CisgICAgICBtX2xvY2FsX2tlcm5lbCA9IHRydWU7CisgICAgfQorICB9CisKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGU7CisgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX291dHB1dFN0cmlkZTsKKworICBhcnJheTxJbmRleCwgTnVtS2VybmVsRGltcz4gbV9pbmRleFN0cmlkZTsKKyAgYXJyYXk8SW5kZXgsIE51bUtlcm5lbERpbXM+IG1fa2VybmVsU3RyaWRlOworICBUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBEZXZpY2U+IG1faW5wdXRJbXBsOworICBUZW5zb3JFdmFsdWF0b3I8S2VybmVsQXJnVHlwZSwgRGV2aWNlPiBtX2tlcm5lbEltcGw7CisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworCisgIEtlcm5lbEFyZ1R5cGUgbV9rZXJuZWxBcmc7CisgIGNvbnN0IFNjYWxhciogbV9rZXJuZWw7CisgIGJvb2wgbV9sb2NhbF9rZXJuZWw7CisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7Cit9OworCisKKworCisvLyBVc2UgYW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBldmFsdWF0aW9uIGNvZGUgZm9yIEdQVXMgd2hlbmV2ZXIgcG9zc2libGUuCisjaWYgZGVmaW5lZChFSUdFTl9VU0VfR1BVKSAmJiBkZWZpbmVkKF9fQ1VEQUNDX18pCisKK3RlbXBsYXRlIDxpbnQgU3RhdGljS2VybmVsU2l6ZT4KK3N0cnVjdCBHZXRLZXJuZWxTaXplIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBpbnQgb3BlcmF0b3IoKSAoY29uc3QgaW50IC8qa2VybmVsU2l6ZSovKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRpY0tlcm5lbFNpemU7CisgIH0KK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdldEtlcm5lbFNpemU8RHluYW1pYz4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBvcGVyYXRvcigpIChjb25zdCBpbnQga2VybmVsU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBrZXJuZWxTaXplOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRFdmFsdWF0b3IsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBJbnB1dERpbXMsCisgICAgICAgICAgaW50IFN0YXRpY0tlcm5lbFNpemU+CitfX2dsb2JhbF9fIHZvaWQgRWlnZW5Db252b2x1dGlvbktlcm5lbDFEKAorICAgIElucHV0RXZhbHVhdG9yIGV2YWwsCisgICAgY29uc3QgaW50ZXJuYWw6OkluZGV4TWFwcGVyPEluZGV4LCBJbnB1dERpbXMsIDEsIElucHV0RXZhbHVhdG9yOjpMYXlvdXQ+CisgICAgICAgIGluZGV4TWFwcGVyLAorICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0IGtlcm5lbCwgY29uc3QgaW50IG51bVBsYW5lcywgY29uc3QgaW50IG51bVgsCisgICAgY29uc3QgaW50IG1heFgsIGNvbnN0IGludCBrZXJuZWxTaXplLCBmbG9hdCogYnVmZmVyKSB7CisgIGV4dGVybiBfX3NoYXJlZF9fIGZsb2F0IHNbXTsKKworICBjb25zdCBpbnQgZmlyc3RfeCA9IGJsb2NrSWR4LnggKiBtYXhYOworICBjb25zdCBpbnQgbGFzdF94ID0gKGZpcnN0X3ggKyBtYXhYIDwgbnVtWCA/IGZpcnN0X3ggKyBtYXhYIDogbnVtWCkgLSAxOworICBjb25zdCBpbnQgbnVtX3hfaW5wdXQgPSBsYXN0X3ggLSBmaXJzdF94ICsgR2V0S2VybmVsU2l6ZTxTdGF0aWNLZXJuZWxTaXplPigpKGtlcm5lbFNpemUpOworICBjb25zdCBpbnQgbnVtX3hfb3V0cHV0ID0gbGFzdF94IC0gZmlyc3RfeCArIDE7CisKKyAgY29uc3QgaW50IGZpcnN0X3BsYW5lID0gYmxvY2tJZHgueSAqIGJsb2NrRGltLnk7CisgIGNvbnN0IGludCBwbGFuZV9zdHJpZGUgPSBibG9ja0RpbS55ICogZ3JpZERpbS55OworCisgIGZvciAoaW50IHAgPSBmaXJzdF9wbGFuZSArIHRocmVhZElkeC55OyBwIDwgbnVtUGxhbmVzOyBwICs9IHBsYW5lX3N0cmlkZSkgeworICAgIC8vIExvYWQgaW5wdXRzIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBjb25zdCBpbnQgcGxhbmVfaW5wdXRfb2Zmc2V0ID0gaW5kZXhNYXBwZXIubWFwQ3VkYUlucHV0UGxhbmVUb1RlbnNvcklucHV0T2Zmc2V0KHApOworICAgIGNvbnN0IGludCBwbGFuZV9rZXJuZWxfb2Zmc2V0ID0gdGhyZWFkSWR4LnkgKiBudW1feF9pbnB1dDsKKyAgICAjcHJhZ21hIHVucm9sbAorICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueDsgaSA8IG51bV94X2lucHV0OyBpICs9IGJsb2NrRGltLngpIHsKKyAgICAgIGNvbnN0IGludCB0ZW5zb3JfaW5kZXggPSBwbGFuZV9pbnB1dF9vZmZzZXQgKyBpbmRleE1hcHBlci5tYXBDdWRhSW5wdXRLZXJuZWxUb1RlbnNvcklucHV0T2Zmc2V0KGkrZmlyc3RfeCk7CisgICAgICBzW2kgKyBwbGFuZV9rZXJuZWxfb2Zmc2V0XSA9IGV2YWwuY29lZmYodGVuc29yX2luZGV4KTsKKyAgICB9CisKKyAgICBfX3N5bmN0aHJlYWRzKCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBjb252b2x1dGlvbgorICAgIGNvbnN0IGludCBwbGFuZV9vdXRwdXRfb2Zmc2V0ID0gaW5kZXhNYXBwZXIubWFwQ3VkYU91dHB1dFBsYW5lVG9UZW5zb3JPdXRwdXRPZmZzZXQocCk7CisKKyAgICAjcHJhZ21hIHVucm9sbAorICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueDsgaSA8IG51bV94X291dHB1dDsgaSArPSBibG9ja0RpbS54KSB7CisgICAgICBjb25zdCBpbnQga2VybmVsX29mZnNldCA9IHBsYW5lX2tlcm5lbF9vZmZzZXQgKyBpOworICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wZjsKKyAgICAgICNwcmFnbWEgdW5yb2xsCisgICAgICBmb3IgKGludCBrID0gMDsgayA8IEdldEtlcm5lbFNpemU8U3RhdGljS2VybmVsU2l6ZT4oKShrZXJuZWxTaXplKTsgKytrKSB7CisgICAgICAgIHJlc3VsdCArPSBzW2sgKyBrZXJuZWxfb2Zmc2V0XSAqIGtlcm5lbFtrXTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGludCB0ZW5zb3JfaW5kZXggPSBwbGFuZV9vdXRwdXRfb2Zmc2V0ICsgaW5kZXhNYXBwZXIubWFwQ3VkYU91dHB1dEtlcm5lbFRvVGVuc29yT3V0cHV0T2Zmc2V0KGkrZmlyc3RfeCk7CisgICAgICBidWZmZXJbdGVuc29yX2luZGV4XSA9IHJlc3VsdDsKKyAgICB9CisgICAgX19zeW5jdGhyZWFkcygpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRFdmFsdWF0b3IsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBJbnB1dERpbXMsCisgICAgICAgICAgaW50IFN0YXRpY0tlcm5lbFNpemVYLCBpbnQgU3RhdGljS2VybmVsU2l6ZVk+CitfX2dsb2JhbF9fIHZvaWQgRWlnZW5Db252b2x1dGlvbktlcm5lbDJEKAorICAgIElucHV0RXZhbHVhdG9yIGV2YWwsCisgICAgY29uc3QgaW50ZXJuYWw6OkluZGV4TWFwcGVyPEluZGV4LCBJbnB1dERpbXMsIDIsIElucHV0RXZhbHVhdG9yOjpMYXlvdXQ+CisgICAgICAgIGluZGV4TWFwcGVyLAorICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0IGtlcm5lbCwgY29uc3QgaW50IG51bVBsYW5lcywgY29uc3QgaW50IG51bVgsCisgICAgY29uc3QgaW50IG1heFgsIGNvbnN0IGludCBudW1ZLCBjb25zdCBpbnQgbWF4WSwgY29uc3QgaW50IGtlcm5lbFNpemVYLAorICAgIGNvbnN0IGludCBrZXJuZWxTaXplWSwgZmxvYXQqIGJ1ZmZlcikgeworICBleHRlcm4gX19zaGFyZWRfXyBmbG9hdCBzW107CisKKyAgY29uc3QgaW50IGZpcnN0X3ggPSBibG9ja0lkeC54ICogbWF4WDsKKyAgY29uc3QgaW50IGxhc3RfeCA9IChmaXJzdF94ICsgbWF4WCA8IG51bVggPyBmaXJzdF94ICsgbWF4WCA6IG51bVgpIC0gMTsKKyAgY29uc3QgaW50IG51bV94X2lucHV0ID0gbGFzdF94IC0gZmlyc3RfeCArIEdldEtlcm5lbFNpemU8U3RhdGljS2VybmVsU2l6ZVg+KCkoa2VybmVsU2l6ZVgpOworICBjb25zdCBpbnQgbnVtX3hfb3V0cHV0ID0gbGFzdF94IC0gZmlyc3RfeCArIDE7CisKKyAgY29uc3QgaW50IGZpcnN0X3kgPSBibG9ja0lkeC55ICogbWF4WTsKKyAgY29uc3QgaW50IGxhc3RfeSA9IChmaXJzdF95ICsgbWF4WSA8IG51bVkgPyBmaXJzdF95ICsgbWF4WSA6IG51bVkpIC0gMTsKKyAgY29uc3QgaW50IG51bV95X2lucHV0ID0gbGFzdF95IC0gZmlyc3RfeSArIEdldEtlcm5lbFNpemU8U3RhdGljS2VybmVsU2l6ZVk+KCkoa2VybmVsU2l6ZVkpOworICBjb25zdCBpbnQgbnVtX3lfb3V0cHV0ID0gbGFzdF95IC0gZmlyc3RfeSArIDE7CisKKyAgY29uc3QgaW50IGZpcnN0X3BsYW5lID0gYmxvY2tJZHgueiAqIGJsb2NrRGltLno7CisgIGNvbnN0IGludCBwbGFuZV9zdHJpZGUgPSBibG9ja0RpbS56ICogZ3JpZERpbS56OworCisgIGZvciAoaW50IHAgPSBmaXJzdF9wbGFuZSArIHRocmVhZElkeC56OyBwIDwgbnVtUGxhbmVzOyBwICs9IHBsYW5lX3N0cmlkZSkgeworCisgICAgY29uc3QgaW50IHBsYW5lX2lucHV0X29mZnNldCA9IGluZGV4TWFwcGVyLm1hcEN1ZGFJbnB1dFBsYW5lVG9UZW5zb3JJbnB1dE9mZnNldChwKTsKKyAgICBjb25zdCBpbnQgcGxhbmVfa2VybmVsX29mZnNldCA9IHRocmVhZElkeC56ICogbnVtX3lfaW5wdXQ7CisKKyAgICAvLyBMb2FkIGlucHV0cyB0byBzaGFyZWQgbWVtb3J5CisgICAgI3ByYWdtYSB1bnJvbGwKKyAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4Lnk7IGogPCBudW1feV9pbnB1dDsgaiArPSBibG9ja0RpbS55KSB7CisgICAgICBjb25zdCBpbnQgaW5wdXRfb2Zmc2V0ID0gbnVtX3hfaW5wdXQgKiAoaiArIHBsYW5lX2tlcm5lbF9vZmZzZXQpOworICAgICAgI3ByYWdtYSB1bnJvbGwKKyAgICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueDsgaSA8IG51bV94X2lucHV0OyBpICs9IGJsb2NrRGltLngpIHsKKyAgICAgICAgY29uc3QgaW50IHRlbnNvcl9pbmRleCA9IHBsYW5lX2lucHV0X29mZnNldCArIGluZGV4TWFwcGVyLm1hcEN1ZGFJbnB1dEtlcm5lbFRvVGVuc29ySW5wdXRPZmZzZXQoaStmaXJzdF94LCBqK2ZpcnN0X3kpOworICAgICAgICBzW2kgKyBpbnB1dF9vZmZzZXRdID0gZXZhbC5jb2VmZih0ZW5zb3JfaW5kZXgpOworICAgICAgfQorICAgIH0KKworICAgIF9fc3luY3RocmVhZHMoKTsKKworICAgIC8vIENvbnZvbHV0aW9uCisgICAgY29uc3QgaW50IHBsYW5lX291dHB1dF9vZmZzZXQgPSBpbmRleE1hcHBlci5tYXBDdWRhT3V0cHV0UGxhbmVUb1RlbnNvck91dHB1dE9mZnNldChwKTsKKworICAgICNwcmFnbWEgdW5yb2xsCisgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC55OyBqIDwgbnVtX3lfb3V0cHV0OyBqICs9IGJsb2NrRGltLnkpIHsKKyAgICAgICNwcmFnbWEgdW5yb2xsCisgICAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4Lng7IGkgPCBudW1feF9vdXRwdXQ7IGkgKz0gYmxvY2tEaW0ueCkgeworICAgICAgICBmbG9hdCByZXN1bHQgPSAwLjBmOworICAgICAgICAjcHJhZ21hIHVucm9sbAorICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IEdldEtlcm5lbFNpemU8U3RhdGljS2VybmVsU2l6ZVk+KCkoa2VybmVsU2l6ZVkpOyArK2wpIHsKKyAgICAgICAgICBjb25zdCBpbnQga2VybmVsX29mZnNldCA9IGtlcm5lbFNpemVYICogbDsKKyAgICAgICAgICBjb25zdCBpbnQgaW5wdXRfb2Zmc2V0ID0gaSArIG51bV94X2lucHV0ICogKGogKyBsICsgcGxhbmVfa2VybmVsX29mZnNldCk7CisgICAgICAgICAgI3ByYWdtYSB1bnJvbGwKKyAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IEdldEtlcm5lbFNpemU8U3RhdGljS2VybmVsU2l6ZVg+KCkoa2VybmVsU2l6ZVgpOyArK2spIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBzW2sgKyBpbnB1dF9vZmZzZXRdICoga2VybmVsW2sgKyBrZXJuZWxfb2Zmc2V0XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IHRlbnNvcl9pbmRleCA9IHBsYW5lX291dHB1dF9vZmZzZXQgKyBpbmRleE1hcHBlci5tYXBDdWRhT3V0cHV0S2VybmVsVG9UZW5zb3JPdXRwdXRPZmZzZXQoaStmaXJzdF94LCBqK2ZpcnN0X3kpOworICAgICAgICBidWZmZXJbdGVuc29yX2luZGV4XSA9IHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfX3N5bmN0aHJlYWRzKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEV2YWx1YXRvciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIElucHV0RGltcz4KK19fZ2xvYmFsX18gdm9pZCBFaWdlbkNvbnZvbHV0aW9uS2VybmVsM0QoCisgICAgSW5wdXRFdmFsdWF0b3IgZXZhbCwKKyAgICBjb25zdCBpbnRlcm5hbDo6SW5kZXhNYXBwZXI8SW5kZXgsIElucHV0RGltcywgMywgSW5wdXRFdmFsdWF0b3I6OkxheW91dD4KKyAgICAgICAgaW5kZXhNYXBwZXIsCisgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3Qga2VybmVsLCBjb25zdCBzaXplX3QgbnVtUGxhbmVzLCBjb25zdCBzaXplX3QgbnVtWCwKKyAgICBjb25zdCBzaXplX3QgbWF4WCwgY29uc3Qgc2l6ZV90IG51bVksIGNvbnN0IHNpemVfdCBtYXhZLCBjb25zdCBzaXplX3QgbnVtWiwKKyAgICBjb25zdCBzaXplX3QgbWF4WiwgY29uc3Qgc2l6ZV90IGtlcm5lbFNpemVYLCBjb25zdCBzaXplX3Qga2VybmVsU2l6ZVksCisgICAgY29uc3Qgc2l6ZV90IGtlcm5lbFNpemVaLCBmbG9hdCogYnVmZmVyKSB7CisgIGV4dGVybiBfX3NoYXJlZF9fIGZsb2F0IHNbXTsKKworICAvLyBMb2FkIGlucHV0cyB0byBzaGFyZWQgbWVtb3J5CisgIGNvbnN0IGludCBmaXJzdF94ID0gYmxvY2tJZHgueCAqIG1heFg7CisgIGNvbnN0IGludCBsYXN0X3ggPSAoZmlyc3RfeCArIG1heFggPCBudW1YID8gZmlyc3RfeCArIG1heFggOiBudW1YKSAtIDE7CisgIGNvbnN0IGludCBudW1feF9pbnB1dCA9IGxhc3RfeCAtIGZpcnN0X3ggKyBrZXJuZWxTaXplWDsKKworICBjb25zdCBpbnQgZmlyc3RfeSA9IGJsb2NrSWR4LnkgKiBtYXhZOworICBjb25zdCBpbnQgbGFzdF95ID0gKGZpcnN0X3kgKyBtYXhZIDwgbnVtWSA/IGZpcnN0X3kgKyBtYXhZIDogbnVtWSkgLSAxOworICBjb25zdCBpbnQgbnVtX3lfaW5wdXQgPSBsYXN0X3kgLSBmaXJzdF95ICsga2VybmVsU2l6ZVk7CisKKyAgY29uc3QgaW50IGZpcnN0X3ogPSBibG9ja0lkeC56ICogbWF4WjsKKyAgY29uc3QgaW50IGxhc3RfeiA9IChmaXJzdF96ICsgbWF4WiA8IG51bVogPyBmaXJzdF96ICsgbWF4WiA6IG51bVopIC0gMTsKKyAgY29uc3QgaW50IG51bV96X2lucHV0ID0gbGFzdF96IC0gZmlyc3RfeiArIGtlcm5lbFNpemVaOworCisgIGZvciAoaW50IHAgPSAwOyBwIDwgbnVtUGxhbmVzOyArK3ApIHsKKworICAgIGNvbnN0IGludCBwbGFuZV9pbnB1dF9vZmZzZXQgPSBpbmRleE1hcHBlci5tYXBDdWRhSW5wdXRQbGFuZVRvVGVuc29ySW5wdXRPZmZzZXQocCk7CisgICAgY29uc3QgaW50IHBsYW5lX2tlcm5lbF9vZmZzZXQgPSAwOworCisgICAgZm9yIChpbnQgayA9IHRocmVhZElkeC56OyBrIDwgbnVtX3pfaW5wdXQ7IGsgKz0gYmxvY2tEaW0ueikgeworICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC55OyBqIDwgbnVtX3lfaW5wdXQ7IGogKz0gYmxvY2tEaW0ueSkgeworICAgICAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4Lng7IGkgPCBudW1feF9pbnB1dDsgaSArPSBibG9ja0RpbS54KSB7CisgICAgICAgICAgY29uc3QgaW50IHRlbnNvcl9pbmRleCA9IHBsYW5lX2lucHV0X29mZnNldCArIGluZGV4TWFwcGVyLm1hcEN1ZGFJbnB1dEtlcm5lbFRvVGVuc29ySW5wdXRPZmZzZXQoaStmaXJzdF94LCBqK2ZpcnN0X3ksIGsrZmlyc3Rfeik7CisgICAgICAgICAgc1tpICsgbnVtX3hfaW5wdXQgKiAoaiArIG51bV95X2lucHV0ICogKGsgKyBwbGFuZV9rZXJuZWxfb2Zmc2V0KSldID0gZXZhbC5jb2VmZih0ZW5zb3JfaW5kZXgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgX19zeW5jdGhyZWFkcygpOworCisgICAgLy8gQ29udm9sdXRpb24KKyAgICBjb25zdCBpbnQgbnVtX3pfb3V0cHV0ID0gbGFzdF96IC0gZmlyc3RfeiArIDE7CisgICAgY29uc3QgaW50IG51bV95X291dHB1dCA9IGxhc3RfeSAtIGZpcnN0X3kgKyAxOworICAgIGNvbnN0IGludCBudW1feF9vdXRwdXQgPSBsYXN0X3ggLSBmaXJzdF94ICsgMTsKKyAgICBjb25zdCBpbnQgcGxhbmVfb3V0cHV0X29mZnNldCA9IGluZGV4TWFwcGVyLm1hcEN1ZGFPdXRwdXRQbGFuZVRvVGVuc29yT3V0cHV0T2Zmc2V0KHApOworCisgICAgZm9yIChpbnQgayA9IHRocmVhZElkeC56OyBrIDwgbnVtX3pfb3V0cHV0OyBrICs9IGJsb2NrRGltLnopIHsKKyAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueTsgaiA8IG51bV95X291dHB1dDsgaiArPSBibG9ja0RpbS55KSB7CisgICAgICAgIGZvciAoaW50IGkgPSB0aHJlYWRJZHgueDsgaSA8IG51bV94X291dHB1dDsgaSArPSBibG9ja0RpbS54KSB7CisgICAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wZjsKKyAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGtlcm5lbFNpemVaOyArK24pIHsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwga2VybmVsU2l6ZVk7ICsrbSkgeworICAgICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGtlcm5lbFNpemVYOyArK2wpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gc1tpICsgbCArIG51bV94X2lucHV0ICogKGogKyBtICsgbnVtX3lfaW5wdXQgKiAoayArIG4gKyBwbGFuZV9rZXJuZWxfb2Zmc2V0KSldICoga2VybmVsW2wgKyBrZXJuZWxTaXplWCAqIChtICsga2VybmVsU2l6ZVkgKiBuKV07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY29uc3QgaW50IHRlbnNvcl9pbmRleCA9IHBsYW5lX291dHB1dF9vZmZzZXQgKyBpbmRleE1hcHBlci5tYXBDdWRhT3V0cHV0S2VybmVsVG9UZW5zb3JPdXRwdXRPZmZzZXQoaStmaXJzdF94LCBqK2ZpcnN0X3ksIGsrZmlyc3Rfeik7CisgICAgICAgICAgYnVmZmVyW3RlbnNvcl9pbmRleF0gPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgX19zeW5jdGhyZWFkcygpOworICB9Cit9OworCisKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kaWNlcywgdHlwZW5hbWUgSW5wdXRBcmdUeXBlLCB0eXBlbmFtZSBLZXJuZWxBcmdUeXBlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDb252b2x1dGlvbk9wPEluZGljZXMsIElucHV0QXJnVHlwZSwgS2VybmVsQXJnVHlwZT4sIEdwdURldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDb252b2x1dGlvbk9wPEluZGljZXMsIElucHV0QXJnVHlwZSwgS2VybmVsQXJnVHlwZT4gWHByVHlwZTsKKworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSAgaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgR3B1RGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bUtlcm5lbERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxJbmRpY2VzPjo6dmFsdWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxLZXJuZWxBcmdUeXBlLCBHcHVEZXZpY2U+OjpEaW1lbnNpb25zIEtlcm5lbERpbWVuc2lvbnM7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgR3B1RGV2aWNlPjo6SXNBbGlnbmVkICYgVGVuc29yRXZhbHVhdG9yPEtlcm5lbEFyZ1R5cGUsIEdwdURldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZSwKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IEdwdURldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2lucHV0SW1wbChvcC5pbnB1dEV4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9rZXJuZWxBcmcob3Aua2VybmVsRXhwcmVzc2lvbigpKSwgbV9rZXJuZWxJbXBsKG9wLmtlcm5lbEV4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9pbmRpY2VzKG9wLmluZGljZXMoKSksIG1fYnVmKE5VTEwpLCBtX2tlcm5lbChOVUxMKSwgbV9sb2NhbF9rZXJuZWwoZmFsc2UpLCBtX2RldmljZShkZXZpY2UpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT46OkxheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8S2VybmVsQXJnVHlwZSwgR3B1RGV2aWNlPjo6TGF5b3V0KSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisKKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+OjpEaW1lbnNpb25zJiBpbnB1dF9kaW1zID0gbV9pbnB1dEltcGwuZGltZW5zaW9ucygpOworICAgIGNvbnN0IHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxLZXJuZWxBcmdUeXBlLCBHcHVEZXZpY2U+OjpEaW1lbnNpb25zJiBrZXJuZWxfZGltcyA9IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKCk7CisKKyAgICBtX2RpbWVuc2lvbnMgPSBtX2lucHV0SW1wbC5kaW1lbnNpb25zKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1LZXJuZWxEaW1zOyArK2kpIHsKKyAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gb3AuaW5kaWNlcygpW2ldOworICAgICAgY29uc3QgSW5kZXggaW5wdXRfZGltID0gaW5wdXRfZGltc1tpbmRleF07CisgICAgICBjb25zdCBJbmRleCBrZXJuZWxfZGltID0ga2VybmVsX2RpbXNbaV07CisgICAgICBjb25zdCBJbmRleCByZXN1bHRfZGltID0gaW5wdXRfZGltIC0ga2VybmVsX2RpbSArIDE7CisgICAgICBtX2RpbWVuc2lvbnNbaW5kZXhdID0gcmVzdWx0X2RpbTsKKyAgICB9CisgIH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIEdwdURldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbnB1dEFyZ1R5cGU6OlNjYWxhciBTY2FsYXI7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqIGRhdGEpIHsKKyAgICBwcmVsb2FkS2VybmVsKCk7CisgICAgbV9pbnB1dEltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgaWYgKGRhdGEpIHsKKyAgICAgIGV4ZWN1dGVFdmFsKGRhdGEpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBtX2J1ZiA9IChTY2FsYXIqKW1fZGV2aWNlLmFsbG9jYXRlKGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihTY2FsYXIpKTsKKyAgICAgIGV4ZWN1dGVFdmFsKG1fYnVmKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1faW5wdXRJbXBsLmNsZWFudXAoKTsKKyAgICBpZiAobV9idWYpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9idWYpOworICAgICAgbV9idWYgPSBOVUxMOworICAgIH0KKyAgICBpZiAobV9sb2NhbF9rZXJuZWwpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUoKHZvaWQqKW1fa2VybmVsKTsKKyAgICAgIG1fbG9jYWxfa2VybmVsID0gZmFsc2U7CisgICAgfQorICAgIG1fa2VybmVsID0gTlVMTDsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVsb2FkS2VybmVsKCkgeworICAgIC8vIERvbid0IG1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXJuZWwgdW5sZXNzIHdlIGhhdmUgdG8gKGkuZS4gaXQncyBhbgorICAgIC8vIGV4cHJlc3Npb24gdGhhdCBuZWVkcyB0byBiZSBldmFsdWF0ZWQpCisgICAgY29uc3QgU2NhbGFyKiBpbl9wbGFjZSA9IG1fa2VybmVsSW1wbC5kYXRhKCk7CisgICAgaWYgKGluX3BsYWNlKSB7CisgICAgICBtX2tlcm5lbCA9IGluX3BsYWNlOworICAgICAgbV9sb2NhbF9rZXJuZWwgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IGtlcm5lbF9zeiA9IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKKyAgICAgIFNjYWxhciogbG9jYWwgPSAoU2NhbGFyKiltX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfc3opOworICAgICAgdHlwZWRlZiBUZW5zb3JFdmFsVG9PcDxjb25zdCBLZXJuZWxBcmdUeXBlPiBFdmFsVG87CisgICAgICBFdmFsVG8gZXZhbFRvVG1wKGxvY2FsLCBtX2tlcm5lbEFyZyk7CisgICAgICBjb25zdCBib29sIFBhY2tldEFjY2VzcyA9IGludGVybmFsOjpJc1ZlY3Rvcml6YWJsZTxHcHVEZXZpY2UsIEtlcm5lbEFyZ1R5cGU+Ojp2YWx1ZTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBFdmFsVG8sIEdwdURldmljZSwgUGFja2V0QWNjZXNzPjo6cnVuKGV2YWxUb1RtcCwgbV9kZXZpY2UpOworCisgICAgICBtX2tlcm5lbCA9IGxvY2FsOworICAgICAgbV9sb2NhbF9rZXJuZWwgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2VpbCh1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBpbnQgZGVub20pIHsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgcm91bmRlZF90b3dhcmRfemVybyA9IG51bSAvIGRlbm9tOworICAgIGlmIChudW0gPiByb3VuZGVkX3Rvd2FyZF96ZXJvICogZGVub20pIHsKKyAgICAgIHJldHVybiByb3VuZGVkX3Rvd2FyZF96ZXJvICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kZWRfdG93YXJkX3plcm87CisgIH0KKworICB2b2lkIGV4ZWN1dGVFdmFsKFNjYWxhciogZGF0YSkgY29uc3QgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgR3B1RGV2aWNlPjo6RGltZW5zaW9ucyBJbnB1dERpbXM7CisKKyAgICBjb25zdCBpbnQgbWF4U2hhcmVkTWVtID0gbV9kZXZpY2Uuc2hhcmVkTWVtUGVyQmxvY2soKTsKKyAgICBjb25zdCBpbnQgbWF4VGhyZWFkc1BlckJsb2NrID0gbV9kZXZpY2UubWF4Q3VkYVRocmVhZHNQZXJCbG9jaygpOworICAgIGNvbnN0IGludCBtYXhCbG9ja3NQZXJQcm9jZXNzb3IgPSBtX2RldmljZS5tYXhDdWRhVGhyZWFkc1Blck11bHRpUHJvY2Vzc29yKCkgLyBtYXhUaHJlYWRzUGVyQmxvY2s7CisgICAgY29uc3QgaW50IG51bU11bHRpUHJvY2Vzc29ycyA9IG1fZGV2aWNlLmdldE51bUN1ZGFNdWx0aVByb2Nlc3NvcnMoKTsKKyAgICBjb25zdCBpbnQgd2FycFNpemUgPSAzMjsKKworICAgIHN3aXRjaCAoTnVtS2VybmVsRGltcykgeworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGNvbnN0IGludCBrZXJuZWxfc2l6ZSA9IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCk7CisKKyAgICAgICAgY29uc3QgaW50IG51bVggPSBkaW1lbnNpb25zKClbbV9pbmRpY2VzWzBdXTsKKyAgICAgICAgY29uc3QgaW50IG51bVAgPSBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkgLyBudW1YOworICAgICAgICBpbnQgbWF4WDsKKyAgICAgICAgZGltMyBibG9ja19zaXplOworCisgICAgICAgIGNvbnN0IGludCBzaW5nbGVfc3RyaWRlX2RpbSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikKKyAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICA6IG1faW5wdXRJbXBsLmRpbWVuc2lvbnMoKS5yYW5rKCkgLSAxOworICAgICAgICBpZiAobV9pbmRpY2VzWzBdID09IHNpbmdsZV9zdHJpZGVfZGltKSB7CisgICAgICAgICAgLy8gTWF4aW11bSB0aGUgcmV1c2UKKyAgICAgICAgICBjb25zdCBpbnQgaW5uZXJfZGltID0gKChtYXhTaGFyZWRNZW0gLyAoc2l6ZW9mKFNjYWxhcikpIC0ga2VybmVsX3NpemUgKyAxICsgMzEpIC8gMzIpICogMzI7CisgICAgICAgICAgbWF4WCA9IG51bWV4dDo6bWluaTxpbnQ+KGlubmVyX2RpbSwgbnVtWCk7CisgICAgICAgICAgY29uc3QgaW50IG1heFAgPSBudW1leHQ6Om1pbmk8aW50PihtYXhTaGFyZWRNZW0gLyAoKGtlcm5lbF9zaXplIC0gMSArIG1heFgpICogc2l6ZW9mKFNjYWxhcikpLCBudW1QKTsKKyAgICAgICAgICBibG9ja19zaXplLnggPSBudW1leHQ6Om1pbmkobWF4VGhyZWFkc1BlckJsb2NrLCBtYXhYKTsKKyAgICAgICAgICBibG9ja19zaXplLnkgPSBudW1leHQ6Om1pbmk8aW50PihtYXhUaHJlYWRzUGVyQmxvY2sgLyBibG9ja19zaXplLngsIG1heFApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIFJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZSBhbG9uZ3NpZGUgdGhlIGlubmVyIG1vc3QgZGltZW5zaW9uLCB0aGF0IGlzIHRoZSBwbGFuZQorICAgICAgICAgIGNvbnN0IGludCBpbm5lcl9kaW0gPSBtYXhTaGFyZWRNZW0gLyAoKHdhcnBTaXplICsga2VybmVsX3NpemUpICogc2l6ZW9mKFNjYWxhcikpOworICAgICAgICAgIGNvbnN0IGludCBtYXhQID0gbnVtZXh0OjptaW5pPGludD4oaW5uZXJfZGltLCBudW1QKTsKKyAgICAgICAgICBtYXhYID0gbnVtZXh0OjptaW5pPGludD4obWF4U2hhcmVkTWVtIC8gKGlubmVyX2RpbSAqIHNpemVvZihTY2FsYXIpKSAtIGtlcm5lbF9zaXplICsgMSwgbnVtWCk7CisKKyAgICAgICAgICBibG9ja19zaXplLnggPSBudW1leHQ6Om1pbmkod2FycFNpemUsIG1heFgpOworICAgICAgICAgIGJsb2NrX3NpemUueSA9IG51bWV4dDo6bWluaTxpbnQ+KG1heFRocmVhZHNQZXJCbG9jay9ibG9ja19zaXplLngsIG1heFApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50IHNoYXJlZF9tZW0gPSBibG9ja19zaXplLnkgKiAobWF4WCArIGtlcm5lbF9zaXplIC0gMSkgKiBzaXplb2YoU2NhbGFyKTsKKyAgICAgICAgYXNzZXJ0KHNoYXJlZF9tZW0gPD0gbWF4U2hhcmVkTWVtKTsKKworICAgICAgICBjb25zdCBpbnQgbnVtX3hfYmxvY2tzID0gY2VpbChudW1YLCBtYXhYKTsKKyAgICAgICAgY29uc3QgaW50IGJsb2Nrc1BlclByb2Nlc3NvciA9IG51bWV4dDo6bWluaShtYXhCbG9ja3NQZXJQcm9jZXNzb3IsIG1heFNoYXJlZE1lbSAvIHNoYXJlZF9tZW0pOworICAgICAgICBjb25zdCBpbnQgbnVtX3lfYmxvY2tzID0gY2VpbChudW1NdWx0aVByb2Nlc3NvcnMgKiBibG9ja3NQZXJQcm9jZXNzb3IsIG51bV94X2Jsb2Nrcyk7CisKKyAgICAgICAgZGltMyBudW1fYmxvY2tzKG51bV94X2Jsb2NrcywgbnVtZXh0OjptaW5pPGludD4obnVtX3lfYmxvY2tzLCBjZWlsKG51bVAsIGJsb2NrX3NpemUueSkpKTsKKworCisgICAgICAgIC8vY291dCA8PCAibGF1bmNoaW5nIDFEIGtlcm5lbCB3aXRoIGJsb2NrX3NpemUueDogIiA8PCBibG9ja19zaXplLnggPDwgIiBibG9ja19zaXplLnk6ICIgPDwgYmxvY2tfc2l6ZS55IDw8ICIgbnVtX2Jsb2Nrcy54OiAiIDw8IG51bV9ibG9ja3MueCA8PCAiIG51bV9ibG9ja3MueTogIiA8PCBudW1fYmxvY2tzLnkgPDwgIiBtYXhYOiAiIDw8IG1heFggPDwgIiBzaGFyZWRfbWVtOiAiIDw8IHNoYXJlZF9tZW0gPDwgIiBpbiBzdHJlYW0gIiA8PCBtX2RldmljZS5zdHJlYW0oKSA8PCBlbmRsOworCisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAxPiBpbmRpY2VzKG1faW5kaWNlc1swXSk7CisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAxPiBrZXJuZWxfZGltcyhtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpWzBdKTsKKyAgICAgICAgaW50ZXJuYWw6OkluZGV4TWFwcGVyPEluZGV4LCBJbnB1dERpbXMsIDEsIExheW91dD4gaW5kZXhNYXBwZXIoCisgICAgICAgICAgICBtX2lucHV0SW1wbC5kaW1lbnNpb25zKCksIGtlcm5lbF9kaW1zLCBpbmRpY2VzKTsKKyAgICAgICAgc3dpdGNoKGtlcm5lbF9zaXplKSB7CisgICAgICAgICAgY2FzZSA0OiB7CisgICAgICAgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEVpZ2VuQ29udm9sdXRpb25LZXJuZWwxRDxUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+LCBJbmRleCwgSW5wdXREaW1zLCA0PiksIG51bV9ibG9ja3MsIGJsb2NrX3NpemUsIHNoYXJlZF9tZW0sIG1fZGV2aWNlLCBtX2lucHV0SW1wbCwgaW5kZXhNYXBwZXIsIG1fa2VybmVsLCBudW1QLCBudW1YLCBtYXhYLCA0LCBkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDc6IHsKKyAgICAgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5Db252b2x1dGlvbktlcm5lbDFEPFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT4sIEluZGV4LCBJbnB1dERpbXMsIDc+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgc2hhcmVkX21lbSwgbV9kZXZpY2UsIG1faW5wdXRJbXBsLCBpbmRleE1hcHBlciwgbV9rZXJuZWwsIG51bVAsIG51bVgsIG1heFgsIDcsIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5Db252b2x1dGlvbktlcm5lbDFEPFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT4sIEluZGV4LCBJbnB1dERpbXMsIER5bmFtaWM+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgc2hhcmVkX21lbSwgbV9kZXZpY2UsIG1faW5wdXRJbXBsLCBpbmRleE1hcHBlciwgbV9rZXJuZWwsIG51bVAsIG51bVgsIG1heFgsIGtlcm5lbF9zaXplLCBkYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgMjogeworICAgICAgICBjb25zdCBpbnQgaWR4WCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgPyAwIDogMTsKKyAgICAgICAgY29uc3QgaW50IGlkeFkgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpID8gMSA6IDA7CisgICAgICAgIGNvbnN0IGludCBrZXJuZWxfc2l6ZV94ID0gbV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKVtpZHhYXTsKKyAgICAgICAgY29uc3QgaW50IGtlcm5lbF9zaXplX3kgPSBtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpW2lkeFldOworCisgICAgICAgIGNvbnN0IGludCBudW1YID0gZGltZW5zaW9ucygpW21faW5kaWNlc1tpZHhYXV07CisgICAgICAgIGNvbnN0IGludCBudW1ZID0gZGltZW5zaW9ucygpW21faW5kaWNlc1tpZHhZXV07CisgICAgICAgIGNvbnN0IGludCBudW1QID0gZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpIC8gKG51bVgqbnVtWSk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgc2NhbGluZ19mYWN0b3IgPSBzcXJ0ZihzdGF0aWNfY2FzdDxmbG9hdD4obWF4U2hhcmVkTWVtKSAvIChzaXplb2YoU2NhbGFyKSAqIGtlcm5lbF9zaXplX3kgKiBrZXJuZWxfc2l6ZV94KSk7CisKKyAgICAgICAgLy8gU25hcCBtYXhYIHRvIHdhcnAgc2l6ZQorICAgICAgICBpbnQgaW5uZXJfZGltID0gKChzdGF0aWNfY2FzdDxpbnQ+KHNjYWxpbmdfZmFjdG9yICoga2VybmVsX3NpemVfeCkgLSBrZXJuZWxfc2l6ZV94ICsgMSArIDMyKSAvIDMyKSAqIDMyOworICAgICAgICBjb25zdCBpbnQgbWF4WCA9IG51bWV4dDo6bWluaTxpbnQ+KGlubmVyX2RpbSwgbnVtWCk7CisgICAgICAgIGNvbnN0IGludCBtYXhZID0gbnVtZXh0OjptaW5pPGludD4obWF4U2hhcmVkTWVtIC8gKHNpemVvZihTY2FsYXIpICogKG1heFggKyBrZXJuZWxfc2l6ZV94IC0gMSkpIC0ga2VybmVsX3NpemVfeSArIDEsIG51bVkpOworICAgICAgICBjb25zdCBpbnQgbWF4UCA9IG51bWV4dDo6bWluaTxpbnQ+KG1heFNoYXJlZE1lbSAvICgoa2VybmVsX3NpemVfeCAtIDEgKyBtYXhYKSAqIChrZXJuZWxfc2l6ZV95IC0gMSArIG1heFkpICogc2l6ZW9mKFNjYWxhcikpLCBudW1QKTsKKworICAgICAgICBkaW0zIGJsb2NrX3NpemU7CisgICAgICAgIGJsb2NrX3NpemUueCA9IG51bWV4dDo6bWluaSgxMDI0LCBtYXhYKTsKKyAgICAgICAgYmxvY2tfc2l6ZS55ID0gbnVtZXh0OjptaW5pPGludD4oMTAyNC9ibG9ja19zaXplLngsIG1heFkpOworICAgICAgICBibG9ja19zaXplLnogPSBudW1leHQ6Om1pbmk8aW50PigxMDI0LyhibG9ja19zaXplLngqYmxvY2tfc2l6ZS55KSwgbWF4UCk7CisKKyAgICAgICAgY29uc3QgaW50IHNoYXJlZF9tZW0gPSBibG9ja19zaXplLnogKiAobWF4WCArIGtlcm5lbF9zaXplX3ggLSAxKSAqIChtYXhZICsga2VybmVsX3NpemVfeSAtIDEpICogc2l6ZW9mKFNjYWxhcik7CisgICAgICAgIGFzc2VydChzaGFyZWRfbWVtIDw9IG1heFNoYXJlZE1lbSk7CisKKyAgICAgICAgY29uc3QgaW50IG51bV94X2Jsb2NrcyA9IGNlaWwobnVtWCwgbWF4WCk7CisgICAgICAgIGNvbnN0IGludCBudW1feV9ibG9ja3MgPSBjZWlsKG51bVksIG1heFkpOworICAgICAgICBjb25zdCBpbnQgYmxvY2tzUGVyUHJvY2Vzc29yID0gbnVtZXh0OjptaW5pKG1heEJsb2Nrc1BlclByb2Nlc3NvciwgbWF4U2hhcmVkTWVtIC8gc2hhcmVkX21lbSk7CisgICAgICAgIGNvbnN0IGludCBudW1fel9ibG9ja3MgPSBjZWlsKG51bU11bHRpUHJvY2Vzc29ycyAqIGJsb2Nrc1BlclByb2Nlc3NvciwgbnVtX3hfYmxvY2tzICogbnVtX3lfYmxvY2tzKTsKKworICAgICAgICBkaW0zIG51bV9ibG9ja3MobnVtX3hfYmxvY2tzLCBudW1feV9ibG9ja3MsIG51bWV4dDo6bWluaTxpbnQ+KG51bV96X2Jsb2NrcywgY2VpbChudW1QLCBibG9ja19zaXplLnopKSk7CisKKworICAgICAgICAvL2NvdXQgPDwgImxhdW5jaGluZyAyRCBrZXJuZWwgd2l0aCBibG9ja19zaXplLng6ICIgPDwgYmxvY2tfc2l6ZS54IDw8ICIgYmxvY2tfc2l6ZS55OiAiIDw8IGJsb2NrX3NpemUueSAgPDwgIiBibG9ja19zaXplLno6ICIgPDwgYmxvY2tfc2l6ZS56IDw8ICIgbnVtX2Jsb2Nrcy54OiAiIDw8IG51bV9ibG9ja3MueCA8PCAiIG51bV9ibG9ja3MueTogIiA8PCBudW1fYmxvY2tzLnkgPDwgIiBudW1fYmxvY2tzLno6ICIgPDwgbnVtX2Jsb2Nrcy56IDw8ICIgbWF4WDogIiA8PCBtYXhYIDw8ICIgbWF4WTogIiA8PCBtYXhZIDw8ICIgbWF4UDogIiA8PCBtYXhQIDw8ICIgc2hhcmVkX21lbTogIiA8PCBzaGFyZWRfbWVtIDw8ICIgaW4gc3RyZWFtICIgPDwgbV9kZXZpY2Uuc3RyZWFtKCkgPDwgZW5kbDsKKworICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgMj4gaW5kaWNlcyhtX2luZGljZXNbaWR4WF0sIG1faW5kaWNlc1tpZHhZXSk7CisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAyPiBrZXJuZWxfZGltcyhtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpW2lkeFhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKVtpZHhZXSk7CisgICAgICAgIGludGVybmFsOjpJbmRleE1hcHBlcjxJbmRleCwgSW5wdXREaW1zLCAyLCBMYXlvdXQ+IGluZGV4TWFwcGVyKAorICAgICAgICAgICAgbV9pbnB1dEltcGwuZGltZW5zaW9ucygpLCBrZXJuZWxfZGltcywgaW5kaWNlcyk7CisgICAgICAgIHN3aXRjaCAoa2VybmVsX3NpemVfeCkgeworICAgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgc3dpdGNoIChrZXJuZWxfc2l6ZV95KSB7CisgICAgICAgICAgICAgIGNhc2UgNzogeworICAgICAgICAgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5Db252b2x1dGlvbktlcm5lbDJEPFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT4sIEluZGV4LCBJbnB1dERpbXMsIDQsIDc+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgc2hhcmVkX21lbSwgbV9kZXZpY2UsIG1faW5wdXRJbXBsLCBpbmRleE1hcHBlciwgbV9rZXJuZWwsIG51bVAsIG51bVgsIG1heFgsIG51bVksIG1heFksIDQsIDcsIGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEVpZ2VuQ29udm9sdXRpb25LZXJuZWwyRDxUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+LCBJbmRleCwgSW5wdXREaW1zLCA0LCBEeW5hbWljPiksIG51bV9ibG9ja3MsIGJsb2NrX3NpemUsIHNoYXJlZF9tZW0sIG1fZGV2aWNlLCBtX2lucHV0SW1wbCwgaW5kZXhNYXBwZXIsIG1fa2VybmVsLCBudW1QLCBudW1YLCBtYXhYLCBudW1ZLCBtYXhZLCA0LCBrZXJuZWxfc2l6ZV95LCBkYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgNzogeworICAgICAgICAgICAgc3dpdGNoIChrZXJuZWxfc2l6ZV95KSB7CisgICAgICAgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5Db252b2x1dGlvbktlcm5lbDJEPFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT4sIEluZGV4LCBJbnB1dERpbXMsIDcsIDQ+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgc2hhcmVkX21lbSwgbV9kZXZpY2UsIG1faW5wdXRJbXBsLCBpbmRleE1hcHBlciwgbV9rZXJuZWwsIG51bVAsIG51bVgsIG1heFgsIG51bVksIG1heFksIDcsIDQsIGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEVpZ2VuQ29udm9sdXRpb25LZXJuZWwyRDxUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+LCBJbmRleCwgSW5wdXREaW1zLCA3LCBEeW5hbWljPiksIG51bV9ibG9ja3MsIGJsb2NrX3NpemUsIHNoYXJlZF9tZW0sIG1fZGV2aWNlLCBtX2lucHV0SW1wbCwgaW5kZXhNYXBwZXIsIG1fa2VybmVsLCBudW1QLCBudW1YLCBtYXhYLCBudW1ZLCBtYXhZLCA3LCBrZXJuZWxfc2l6ZV95LCBkYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoRWlnZW5Db252b2x1dGlvbktlcm5lbDJEPFRlbnNvckV2YWx1YXRvcjxJbnB1dEFyZ1R5cGUsIEdwdURldmljZT4sIEluZGV4LCBJbnB1dERpbXMsIER5bmFtaWMsIER5bmFtaWM+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgc2hhcmVkX21lbSwgbV9kZXZpY2UsIG1faW5wdXRJbXBsLCBpbmRleE1hcHBlciwgbV9rZXJuZWwsIG51bVAsIG51bVgsIG1heFgsIG51bVksIG1heFksIGtlcm5lbF9zaXplX3gsIGtlcm5lbF9zaXplX3ksIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgY29uc3QgaW50IGlkeFggPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpID8gMCA6IDI7CisgICAgICAgIGNvbnN0IGludCBpZHhZID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSA/IDEgOiAxOworICAgICAgICBjb25zdCBpbnQgaWR4WiA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgPyAyIDogMDsKKworICAgICAgICBjb25zdCBpbnQga2VybmVsX3NpemVfeCA9IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKClbaWR4WF07CisgICAgICAgIGNvbnN0IGludCBrZXJuZWxfc2l6ZV95ID0gbV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKVtpZHhZXTsKKyAgICAgICAgY29uc3QgaW50IGtlcm5lbF9zaXplX3ogPSBtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpW2lkeFpdOworCisgICAgICAgIGNvbnN0IGludCBudW1YID0gZGltZW5zaW9ucygpW21faW5kaWNlc1tpZHhYXV07CisgICAgICAgIGNvbnN0IGludCBudW1ZID0gZGltZW5zaW9ucygpW21faW5kaWNlc1tpZHhZXV07CisgICAgICAgIGNvbnN0IGludCBudW1aID0gZGltZW5zaW9ucygpW21faW5kaWNlc1tpZHhaXV07CisgICAgICAgIGNvbnN0IGludCBudW1QID0gZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpIC8gKG51bVgqbnVtWSpudW1aKTsKKworICAgICAgICBjb25zdCBpbnQgbWF4WCA9IG51bWV4dDo6bWluaTxpbnQ+KDEyOCwgbnVtZXh0OjptaW5pPGludD4obWF4U2hhcmVkTWVtIC8gKHNpemVvZihTY2FsYXIpICoga2VybmVsX3NpemVfeSAqIGtlcm5lbF9zaXplX3opIC0ga2VybmVsX3NpemVfeCArIDEsIG51bVgpKTsKKyAgICAgICAgY29uc3QgaW50IG1heFkgPSBudW1leHQ6Om1pbmk8aW50PigxMjgsIG51bWV4dDo6bWluaTxpbnQ+KG1heFNoYXJlZE1lbSAvIChzaXplb2YoU2NhbGFyKSAqIChtYXhYICsga2VybmVsX3NpemVfeCAtIDEpICoga2VybmVsX3NpemVfeikgLSBrZXJuZWxfc2l6ZV95ICsgMSwgbnVtWSkpOworICAgICAgICBjb25zdCBpbnQgbWF4WiA9IG51bWV4dDo6bWluaTxpbnQ+KDEyOCwgbnVtZXh0OjptaW5pPGludD4obWF4U2hhcmVkTWVtIC8gKHNpemVvZihTY2FsYXIpICogKG1heFggKyBrZXJuZWxfc2l6ZV94IC0gMSkgKiAobWF4WSArIGtlcm5lbF9zaXplX3kgLSAxKSkgLSBrZXJuZWxfc2l6ZV96ICsgMSwgbnVtWikpOworCisgICAgICAgIGRpbTMgYmxvY2tfc2l6ZTsKKyAgICAgICAgYmxvY2tfc2l6ZS54ID0gbnVtZXh0OjptaW5pKDMyLCBtYXhYKTsKKyAgICAgICAgYmxvY2tfc2l6ZS55ID0gbnVtZXh0OjptaW5pKDMyLCBtYXhZKTsKKyAgICAgICAgYmxvY2tfc2l6ZS56ID0gbnVtZXh0OjptaW5pPGludD4oMTAyNC8oYmxvY2tfc2l6ZS54KmJsb2NrX3NpemUueSksIG1heFopOworICAgICAgICBkaW0zIG51bV9ibG9ja3MoY2VpbChudW1YLCBtYXhYKSwgY2VpbChudW1ZLCBtYXhZKSwgY2VpbChudW1aLCBtYXhaKSk7CisKKyAgICAgICAgY29uc3QgaW50IHNoYXJlZF9tZW0gPSAobWF4WCArIGtlcm5lbF9zaXplX3ggLSAxKSAqIChtYXhZICsga2VybmVsX3NpemVfeSAtIDEpICogKG1heFogKyBrZXJuZWxfc2l6ZV96IC0gMSkgKiBzaXplb2YoU2NhbGFyKTsKKyAgICAgICAgYXNzZXJ0KHNoYXJlZF9tZW0gPD0gbWF4U2hhcmVkTWVtKTsKKworICAgICAgICAvL2NvdXQgPDwgImxhdW5jaGluZyAzRCBrZXJuZWwgd2l0aCBibG9ja19zaXplLng6ICIgPDwgYmxvY2tfc2l6ZS54IDw8ICIgYmxvY2tfc2l6ZS55OiAiIDw8IGJsb2NrX3NpemUueSAgPDwgIiBibG9ja19zaXplLno6ICIgPDwgYmxvY2tfc2l6ZS56IDw8ICIgbnVtX2Jsb2Nrcy54OiAiIDw8IG51bV9ibG9ja3MueCA8PCAiIG51bV9ibG9ja3MueTogIiA8PCBudW1fYmxvY2tzLnkgPDwgIiBudW1fYmxvY2tzLno6ICIgPDwgbnVtX2Jsb2Nrcy56ICA8PCAiIHNoYXJlZF9tZW06ICIgPDwgc2hhcmVkX21lbSA8PCAiIGluIHN0cmVhbSAiIDw8IG1fZGV2aWNlLnN0cmVhbSgpIDw8IGVuZGw7CisgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCAzPiBpbmRpY2VzKG1faW5kaWNlc1tpZHhYXSwgbV9pbmRpY2VzW2lkeFldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGljZXNbaWR4Wl0pOworICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgMz4ga2VybmVsX2RpbXMobV9rZXJuZWxJbXBsLmRpbWVuc2lvbnMoKVtpZHhYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKClbaWR4WV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2tlcm5lbEltcGwuZGltZW5zaW9ucygpW2lkeFpdKTsKKyAgICAgICAgaW50ZXJuYWw6OkluZGV4TWFwcGVyPEluZGV4LCBJbnB1dERpbXMsIDMsIExheW91dD4gaW5kZXhNYXBwZXIoCisgICAgICAgICAgICBtX2lucHV0SW1wbC5kaW1lbnNpb25zKCksIGtlcm5lbF9kaW1zLCBpbmRpY2VzKTsKKworICAgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEVpZ2VuQ29udm9sdXRpb25LZXJuZWwzRDxUZW5zb3JFdmFsdWF0b3I8SW5wdXRBcmdUeXBlLCBHcHVEZXZpY2U+LCBJbmRleCwgSW5wdXREaW1zPiksIG51bV9ibG9ja3MsIGJsb2NrX3NpemUsIHNoYXJlZF9tZW0sIG1fZGV2aWNlLCBtX2lucHV0SW1wbCwgaW5kZXhNYXBwZXIsIG1fa2VybmVsLCBudW1QLCBudW1YLCBtYXhYLCBudW1ZLCBtYXhZLCBudW1aLCBtYXhaLCBrZXJuZWxfc2l6ZV94LCBrZXJuZWxfc2l6ZV95LCBrZXJuZWxfc2l6ZV96LCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtS2VybmVsRGltcyA+PSAxICYmIE51bUtlcm5lbERpbXMgPD0gMyksIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX09CSkVDVFNfT0ZfQV9TUEVDSUZJQ19TSVpFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2J1Zik7CisgICAgZWlnZW5fYXNzZXJ0KGluZGV4IDwgbV9kaW1lbnNpb25zLlRvdGFsU2l6ZSgpKTsKKyAgICByZXR1cm4gbV9idWZbaW5kZXhdOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KGNvbnN0IEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1fYnVmKTsKKyAgICBlaWdlbl9hc3NlcnQoaW5kZXggPCBtX2RpbWVuc2lvbnMuVG90YWxTaXplKCkpOworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFJldHVyblR5cGUsIExvYWRNb2RlPihtX2J1ZitpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgLy8gVE9ETyhybWxhcnNlbik6IEZJWE1FOiBGb3Igbm93LCB0aGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSBDUFUgY29zdAorICAgIC8vIG1vZGVsLgorICAgIGNvbnN0IGRvdWJsZSBrZXJuZWxfc2l6ZSA9IG1fa2VybmVsSW1wbC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCk7CisgICAgLy8gV2UgaWdub3JlIHRoZSB1c2Ugb2YgZnVzZWQgbXVsdGlwbHktYWRkLgorICAgIGNvbnN0IGRvdWJsZSBjb252b2x2ZV9jb21wdXRlX2Nvc3QgPQorICAgICAgICBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8U2NhbGFyPigpICsgVGVuc29yT3BDb3N0OjpNdWxDb3N0PFNjYWxhcj4oKTsKKyAgICBjb25zdCBkb3VibGUgZmlyc3RJbmRleF9jb21wdXRlX2Nvc3QgPQorICAgICAgICBOdW1EaW1zICoKKyAgICAgICAgKDIgKiBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCkgKyAyICogVGVuc29yT3BDb3N0OjpNdWxDb3N0PEluZGV4PigpICsKKyAgICAgICAgIFRlbnNvck9wQ29zdDo6RGl2Q29zdDxJbmRleD4oKSk7CisgICAgcmV0dXJuIFRlbnNvck9wQ29zdCgwLCAwLCBmaXJzdEluZGV4X2NvbXB1dGVfY29zdCwgdmVjdG9yaXplZCwgUGFja2V0U2l6ZSkgKworICAgICAgICAgICBrZXJuZWxfc2l6ZSAqIChtX2lucHV0SW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBtX2tlcm5lbEltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIGNvbnZvbHZlX2NvbXB1dGVfY29zdCwgdmVjdG9yaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFNpemUpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gTm8gYXNzaWdubWVudCAoY29waWVzIGFyZSBuZWVkZWQgYnkgdGhlIGtlcm5lbHMpCisgIFRlbnNvckV2YWx1YXRvciYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yRXZhbHVhdG9yJik7CisKKyAgVGVuc29yRXZhbHVhdG9yPElucHV0QXJnVHlwZSwgR3B1RGV2aWNlPiBtX2lucHV0SW1wbDsKKyAgVGVuc29yRXZhbHVhdG9yPEtlcm5lbEFyZ1R5cGUsIEdwdURldmljZT4gbV9rZXJuZWxJbXBsOworICBLZXJuZWxBcmdUeXBlIG1fa2VybmVsQXJnOworICBJbmRpY2VzIG1faW5kaWNlczsKKyAgRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7CisgIFNjYWxhciogbV9idWY7CisgIGNvbnN0IFNjYWxhciogbV9rZXJuZWw7CisgIGJvb2wgbV9sb2NhbF9rZXJuZWw7CisKKyAgY29uc3QgR3B1RGV2aWNlJiBtX2RldmljZTsKK307CisjZW5kaWYKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ09OVk9MVVRJT05fSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDb3N0TW9kZWwuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29zdE1vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ29zdE1vZGVsLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IFJhc211cyBNdW5rIExhcnNlbiA8cm1sYXJzZW5AZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT1NUX01PREVMX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT1NUX01PREVMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JFdmFsdWF0b3IKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQSBjb3N0IG1vZGVsIHVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgZm9yIGV2YWx1YXRpbmcKKyAgKiB0ZW5zb3IgZXhwcmVzc2lvbi4KKyAgKgorICAqLworCisvLyBDbGFzcyBzdG9yaW5nIHRoZSBjb3N0IG9mIGV2YWx1YXRpbmcgYSB0ZW5zb3IgZXhwcmVzc2lvbiBpbiB0ZXJtcyBvZiB0aGUKKy8vIGVzdGltYXRlZCBudW1iZXIgb2Ygb3BlcmFuZCBieXRlcyBsb2FkcywgYnl0ZXMgc3RvcmVkLCBhbmQgY29tcHV0ZSBjeWNsZXMuCitjbGFzcyBUZW5zb3JPcENvc3QgeworIHB1YmxpYzoKKyAgLy8gVE9ETyhybWxhcnNlbik6IEZpeCB0aGUgc2NhbGFyIG9wIGNvc3RzIGluIEVpZ2VuIHByb3Blci4gRXZlbiBhIHNpbXBsZQorICAvLyBtb2RlbCBiYXNlZCBvbiBtaW5pbWFsIHJlY2lwcm9jYWwgdGhyb3VnaHB1dCBudW1iZXJzIGZyb20gSW50ZWwgb3IKKyAgLy8gQWduZXIgRm9nJ3MgdGFibGVzIHdvdWxkIGJlIGJldHRlciB0aGFuIHdoYXQgaXMgdGhlcmUgbm93LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZT4KKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IE11bENvc3QoKSB7CisgICAgcmV0dXJuIGludGVybmFsOjpmdW5jdG9yX3RyYWl0czwKKyAgICAgICAgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPEFyZ1R5cGUsIEFyZ1R5cGU+ID46OkNvc3Q7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGU+CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBBZGRDb3N0KCkgeworICAgIHJldHVybiBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8QXJnVHlwZT4gPjo6Q29zdDsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZT4KKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IERpdkNvc3QoKSB7CisgICAgcmV0dXJuIGludGVybmFsOjpmdW5jdG9yX3RyYWl0czwKKyAgICAgICAgaW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxBcmdUeXBlLCBBcmdUeXBlPiA+OjpDb3N0OworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUeXBlPgorICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBpbnQgTW9kQ29zdCgpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPGludGVybmFsOjpzY2FsYXJfbW9kX29wPEFyZ1R5cGU+ID46OkNvc3Q7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5cGUsIHR5cGVuYW1lIFRhcmdldFR5cGU+CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBDYXN0Q29zdCgpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPAorICAgICAgICBpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8U3JjVHlwZSwgVGFyZ2V0VHlwZT4gPjo6Q29zdDsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIFRlbnNvck9wQ29zdCgpIDogYnl0ZXNfbG9hZGVkXygwKSwgYnl0ZXNfc3RvcmVkXygwKSwgY29tcHV0ZV9jeWNsZXNfKDApIHt9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIFRlbnNvck9wQ29zdChkb3VibGUgYnl0ZXNfbG9hZGVkLCBkb3VibGUgYnl0ZXNfc3RvcmVkLCBkb3VibGUgY29tcHV0ZV9jeWNsZXMpCisgICAgICA6IGJ5dGVzX2xvYWRlZF8oYnl0ZXNfbG9hZGVkKSwKKyAgICAgICAgYnl0ZXNfc3RvcmVkXyhieXRlc19zdG9yZWQpLAorICAgICAgICBjb21wdXRlX2N5Y2xlc18oY29tcHV0ZV9jeWNsZXMpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgVGVuc29yT3BDb3N0KGRvdWJsZSBieXRlc19sb2FkZWQsIGRvdWJsZSBieXRlc19zdG9yZWQsIGRvdWJsZSBjb21wdXRlX2N5Y2xlcywKKyAgICAgICAgICAgICAgIGJvb2wgdmVjdG9yaXplZCwgZG91YmxlIHBhY2tldF9zaXplKQorICAgICAgOiBieXRlc19sb2FkZWRfKGJ5dGVzX2xvYWRlZCksCisgICAgICAgIGJ5dGVzX3N0b3JlZF8oYnl0ZXNfc3RvcmVkKSwKKyAgICAgICAgY29tcHV0ZV9jeWNsZXNfKHZlY3Rvcml6ZWQgPyBjb21wdXRlX2N5Y2xlcyAvIHBhY2tldF9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29tcHV0ZV9jeWNsZXMpIHsKKyAgICBlaWdlbl9hc3NlcnQoYnl0ZXNfbG9hZGVkID49IDAgJiYgKG51bWV4dDo6aXNmaW5pdGUpKGJ5dGVzX2xvYWRlZCkpOworICAgIGVpZ2VuX2Fzc2VydChieXRlc19zdG9yZWQgPj0gMCAmJiAobnVtZXh0Ojppc2Zpbml0ZSkoYnl0ZXNfc3RvcmVkKSk7CisgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVfY3ljbGVzID49IDAgJiYgKG51bWV4dDo6aXNmaW5pdGUpKGNvbXB1dGVfY3ljbGVzKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBieXRlc19sb2FkZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ5dGVzX2xvYWRlZF87CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgYnl0ZXNfc3RvcmVkKCkgY29uc3QgeworICAgIHJldHVybiBieXRlc19zdG9yZWRfOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIGNvbXB1dGVfY3ljbGVzKCkgY29uc3QgeworICAgIHJldHVybiBjb21wdXRlX2N5Y2xlc187CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgdG90YWxfY29zdCgKKyAgICAgIGRvdWJsZSBsb2FkX2Nvc3QsIGRvdWJsZSBzdG9yZV9jb3N0LCBkb3VibGUgY29tcHV0ZV9jb3N0KSBjb25zdCB7CisgICAgcmV0dXJuIGxvYWRfY29zdCAqIGJ5dGVzX2xvYWRlZF8gKyBzdG9yZV9jb3N0ICogYnl0ZXNfc3RvcmVkXyArCisgICAgICAgICAgIGNvbXB1dGVfY29zdCAqIGNvbXB1dGVfY3ljbGVzXzsKKyAgfQorCisgIC8vIERyb3AgbWVtb3J5IGFjY2VzcyBjb21wb25lbnQuIEludGVuZGVkIGZvciBjYXNlcyB3aGVuIG1lbW9yeSBhY2Nlc3NlcyBhcmUKKyAgLy8gc2VxdWVudGlhbCBvciBhcmUgY29tcGxldGVseSBtYXNrZWQgYnkgY29tcHV0YXRpb25zLgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGRyb3BNZW1vcnlDb3N0KCkgeworICAgIGJ5dGVzX2xvYWRlZF8gPSAwOworICAgIGJ5dGVzX3N0b3JlZF8gPSAwOworICB9CisKKyAgLy8gVE9ETyhybWxhcnNlbik6IERlZmluZSBtaW4gaW4gdGVybXMgb2YgdG90YWwgY29zdCwgbm90IGVsZW1lbnR3aXNlLgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjd2lzZU1pbigKKyAgICAgIGNvbnN0IFRlbnNvck9wQ29zdCYgcmhzKSBjb25zdCB7CisgICAgZG91YmxlIGJ5dGVzX2xvYWRlZCA9IG51bWV4dDo6bWluaShieXRlc19sb2FkZWRfLCByaHMuYnl0ZXNfbG9hZGVkKCkpOworICAgIGRvdWJsZSBieXRlc19zdG9yZWQgPSBudW1leHQ6Om1pbmkoYnl0ZXNfc3RvcmVkXywgcmhzLmJ5dGVzX3N0b3JlZCgpKTsKKyAgICBkb3VibGUgY29tcHV0ZV9jeWNsZXMgPSBudW1leHQ6Om1pbmkoY29tcHV0ZV9jeWNsZXNfLCByaHMuY29tcHV0ZV9jeWNsZXMoKSk7CisgICAgcmV0dXJuIFRlbnNvck9wQ29zdChieXRlc19sb2FkZWQsIGJ5dGVzX3N0b3JlZCwgY29tcHV0ZV9jeWNsZXMpOworICB9CisKKyAgLy8gVE9ETyhybWxhcnNlbik6IERlZmluZSBtYXggaW4gdGVybXMgb2YgdG90YWwgY29zdCwgbm90IGVsZW1lbnR3aXNlLgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjd2lzZU1heCgKKyAgICAgIGNvbnN0IFRlbnNvck9wQ29zdCYgcmhzKSBjb25zdCB7CisgICAgZG91YmxlIGJ5dGVzX2xvYWRlZCA9IG51bWV4dDo6bWF4aShieXRlc19sb2FkZWRfLCByaHMuYnl0ZXNfbG9hZGVkKCkpOworICAgIGRvdWJsZSBieXRlc19zdG9yZWQgPSBudW1leHQ6Om1heGkoYnl0ZXNfc3RvcmVkXywgcmhzLmJ5dGVzX3N0b3JlZCgpKTsKKyAgICBkb3VibGUgY29tcHV0ZV9jeWNsZXMgPSBudW1leHQ6Om1heGkoY29tcHV0ZV9jeWNsZXNfLCByaHMuY29tcHV0ZV9jeWNsZXMoKSk7CisgICAgcmV0dXJuIFRlbnNvck9wQ29zdChieXRlc19sb2FkZWQsIGJ5dGVzX3N0b3JlZCwgY29tcHV0ZV9jeWNsZXMpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QmIG9wZXJhdG9yKz0oCisgICAgICBjb25zdCBUZW5zb3JPcENvc3QmIHJocykgeworICAgIGJ5dGVzX2xvYWRlZF8gKz0gcmhzLmJ5dGVzX2xvYWRlZCgpOworICAgIGJ5dGVzX3N0b3JlZF8gKz0gcmhzLmJ5dGVzX3N0b3JlZCgpOworICAgIGNvbXB1dGVfY3ljbGVzXyArPSByaHMuY29tcHV0ZV9jeWNsZXMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCYgb3BlcmF0b3IqPShkb3VibGUgcmhzKSB7CisgICAgYnl0ZXNfbG9hZGVkXyAqPSByaHM7CisgICAgYnl0ZXNfc3RvcmVkXyAqPSByaHM7CisgICAgY29tcHV0ZV9jeWNsZXNfICo9IHJoczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZyaWVuZCBUZW5zb3JPcENvc3Qgb3BlcmF0b3IrKAorICAgICAgVGVuc29yT3BDb3N0IGxocywgY29uc3QgVGVuc29yT3BDb3N0JiByaHMpIHsKKyAgICBsaHMgKz0gcmhzOworICAgIHJldHVybiBsaHM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmcmllbmQgVGVuc29yT3BDb3N0IG9wZXJhdG9yKigKKyAgICAgIFRlbnNvck9wQ29zdCBsaHMsIGRvdWJsZSByaHMpIHsKKyAgICBsaHMgKj0gcmhzOworICAgIHJldHVybiBsaHM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBmcmllbmQgVGVuc29yT3BDb3N0IG9wZXJhdG9yKigKKyAgICAgIGRvdWJsZSBsaHMsIFRlbnNvck9wQ29zdCByaHMpIHsKKyAgICByaHMgKj0gbGhzOworICAgIHJldHVybiByaHM7CisgIH0KKworICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlbnNvck9wQ29zdCYgdGMpIHsKKyAgICByZXR1cm4gb3MgPDwgIltieXRlc19sb2FkZWQgPSAiIDw8IHRjLmJ5dGVzX2xvYWRlZCgpCisgICAgICAgICAgICAgIDw8ICIsIGJ5dGVzX3N0b3JlZCA9ICIgPDwgdGMuYnl0ZXNfc3RvcmVkKCkKKyAgICAgICAgICAgICAgPDwgIiwgY29tcHV0ZV9jeWNsZXMgPSAiIDw8IHRjLmNvbXB1dGVfY3ljbGVzKCkgPDwgIl0iOworICB9CisKKyBwcml2YXRlOgorICBkb3VibGUgYnl0ZXNfbG9hZGVkXzsKKyAgZG91YmxlIGJ5dGVzX3N0b3JlZF87CisgIGRvdWJsZSBjb21wdXRlX2N5Y2xlc187Cit9OworCisvLyBUT0RPKHJtbGFyc2VuKTogSW1wbGVtZW50IGEgcG9saWN5IHRoYXQgY2hvb3NlcyBhbiAib3B0aW1hbCIgbnVtYmVyIG9mIHRoZWFkcworLy8gaW4gWzE6bWF4X3RocmVhZHNdIGluc3RlYWQgb2YganVzdCBzd2l0Y2hpbmcgbXVsdGktdGhyZWFkaW5nIG9mZiBmb3Igc21hbGwKKy8vIHdvcmsgdW5pdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlPgorY2xhc3MgVGVuc29yQ29zdE1vZGVsIHsKKyBwdWJsaWM6CisgIC8vIFNjYWxpbmcgZnJvbSBFaWdlbiBjb21wdXRlIGNvc3QgdG8gZGV2aWNlIGN5Y2xlcy4KKyAgc3RhdGljIGNvbnN0IGludCBrRGV2aWNlQ3ljbGVzUGVyQ29tcHV0ZUN5Y2xlID0gMTsKKworIC8vIENvc3RzIGluIGRldmljZSBjeWNsZXMuCisgIHN0YXRpYyBjb25zdCBpbnQga1N0YXJ0dXBDeWNsZXMgPSAxMDAwMDA7CisgIHN0YXRpYyBjb25zdCBpbnQga1BlclRocmVhZEN5Y2xlcyA9IDEwMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludCBrVGFza1NpemUgPSA0MDAwMDsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBbMTptYXhfdGhyZWFkc10gdG8gdXNlIGZvcgorICAvLyBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gb3V0cHV0IHNpemUgYW5kIGNvc3QgcGVyCisgIC8vIGNvZWZmaWNpZW50LgorICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBpbnQgbnVtVGhyZWFkcygKKyAgICAgIGRvdWJsZSBvdXRwdXRfc2l6ZSwgY29uc3QgVGVuc29yT3BDb3N0JiBjb3N0X3Blcl9jb2VmZiwgaW50IG1heF90aHJlYWRzKSB7CisgICAgZG91YmxlIGNvc3QgPSB0b3RhbENvc3Qob3V0cHV0X3NpemUsIGNvc3RfcGVyX2NvZWZmKTsKKyAgICBpbnQgdGhyZWFkcyA9IChjb3N0IC0ga1N0YXJ0dXBDeWNsZXMpIC8ga1BlclRocmVhZEN5Y2xlcyArIDAuOTsKKyAgICByZXR1cm4gbnVtZXh0OjptaW5pKG1heF90aHJlYWRzLCBudW1leHQ6Om1heGkoMSwgdGhyZWFkcykpOworICB9CisKKyAgLy8gdGFza1NpemUgYXNzZXNzZXMgcGFyYWxsZWwgdGFzayBzaXplLgorICAvLyBWYWx1ZSBvZiAxLjAgbWVhbnMgaWRlYWwgcGFyYWxsZWwgdGFzayBzaXplLiBWYWx1ZXMgPCAxLjAgbWVhbiB0aGF0IHRhc2sKKyAgLy8gZ3JhbnVsYXJpdHkgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIHRvIG1pdGlnYXRlIHBhcmFsbGVsaXphdGlvbiBvdmVyaGVhZHMuCisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSB0YXNrU2l6ZSgKKyAgICAgIGRvdWJsZSBvdXRwdXRfc2l6ZSwgY29uc3QgVGVuc29yT3BDb3N0JiBjb3N0X3Blcl9jb2VmZikgeworICAgIHJldHVybiB0b3RhbENvc3Qob3V0cHV0X3NpemUsIGNvc3RfcGVyX2NvZWZmKSAvIGtUYXNrU2l6ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHRvdGFsQ29zdCgKKyAgICAgIGRvdWJsZSBvdXRwdXRfc2l6ZSwgY29uc3QgVGVuc29yT3BDb3N0JiBjb3N0X3Blcl9jb2VmZikgeworICAgIC8vIENvc3Qgb2YgbWVtb3J5IGZldGNoZXMgZnJvbSBMMiBjYWNoZS4gNjQgaXMgdHlwaWNhbCBjYWNoZSBsaW5lIHNpemUuCisgICAgLy8gMTEgaXMgTDIgY2FjaGUgbGF0ZW5jeSBvbiBIYXN3ZWxsLgorICAgIC8vIFdlIGRvbid0IGtub3cgd2hldGhlciBkYXRhIGlzIGluIEwxLCBMMiBvciBMMy4gQnV0IHdlIGFyZSBtb3N0IGludGVyZXN0ZWQKKyAgICAvLyBpbiBzaW5nbGUtdGhyZWFkZWQgY29tcHV0YXRpb25hbCB0aW1lIGFyb3VuZCAxMDB1cy0xMG1zIChzbWFsbGVyIHRpbWUKKyAgICAvLyBpcyB0b28gc21hbGwgZm9yIHBhcmFsbGVsaXphdGlvbiwgbGFyZ2VyIHRpbWUgaXMgbm90IGludGVyc3RpbmcKKyAgICAvLyBlaXRoZXIgYmVjYXVzZSB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYWxsIGF2YWlsYWJsZSB0aHJlYWRzIGFscmVhZHkpLgorICAgIC8vIEFuZCBmb3IgdGhlIHRhcmdldCB0aW1lIHJhbmdlLCBMMiBzZWVtcyB0byBiZSB3aGF0IG1hdHRlcnMuIERhdGEgc2V0CisgICAgLy8gZml0dGluZyBpbnRvIEwxIGlzIHRvbyBzbWFsbCB0byB0YWtlIG5vdGljZWFibGUgdGltZS4gRGF0YSBzZXQgZml0dGluZworICAgIC8vIG9ubHkgaW50byBMMyBwcmVzdW1hYmx5IHdpbGwgdGFrZSBtb3JlIHRoYW4gMTBtcyB0byBsb2FkIGFuZCBwcm9jZXNzLgorICAgIGNvbnN0IGRvdWJsZSBrTG9hZEN5Y2xlcyA9IDEuMCAvIDY0ICogMTE7CisgICAgY29uc3QgZG91YmxlIGtTdG9yZUN5Y2xlcyA9IDEuMCAvIDY0ICogMTE7CisgICAgLy8gU2NhbGluZyBmcm9tIEVpZ2VuIGNvbXB1dGUgY29zdCB0byBkZXZpY2UgY3ljbGVzLgorICAgIHJldHVybiBvdXRwdXRfc2l6ZSAqCisgICAgICAgIGNvc3RfcGVyX2NvZWZmLnRvdGFsX2Nvc3Qoa0xvYWRDeWNsZXMsIGtTdG9yZUN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlQ3ljbGVzUGVyQ29tcHV0ZUN5Y2xlKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DT1NUX01PREVMX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ3VzdG9tT3AuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yQ3VzdG9tT3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIwZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JDdXN0b21PcC5oCkBAIC0wLDAgKzEsMzEzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfQ1VTVE9NX09QX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DVVNUT01fT1BfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckN1c3RvbVVuYXJ5T3AKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIGN1c3RvbSBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tVW5hcnlGdW5jLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JDdXN0b21VbmFyeU9wPEN1c3RvbVVuYXJ5RnVuYywgWHByVHlwZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE5lc3RlZD46OnR5cGUgX05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gdHJhaXRzPFhwclR5cGU+OjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IHRyYWl0czxYcHJUeXBlPjo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tVW5hcnlGdW5jLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yQ3VzdG9tVW5hcnlPcDxDdXN0b21VbmFyeUZ1bmMsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQ3VzdG9tVW5hcnlPcDxDdXN0b21VbmFyeUZ1bmMsIFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tVW5hcnlGdW5jLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JDdXN0b21VbmFyeU9wPEN1c3RvbVVuYXJ5RnVuYywgWHByVHlwZT4gPgoreworICB0eXBlZGVmIFRlbnNvckN1c3RvbVVuYXJ5T3A8Q3VzdG9tVW5hcnlGdW5jLCBYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tVW5hcnlGdW5jLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yQ3VzdG9tVW5hcnlPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckN1c3RvbVVuYXJ5T3A8Q3VzdG9tVW5hcnlGdW5jLCBYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN1c3RvbVVuYXJ5T3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JDdXN0b21VbmFyeU9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDdXN0b21VbmFyeU9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDdXN0b21VbmFyeU9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDdXN0b21VbmFyeU9wKGNvbnN0IFhwclR5cGUmIGV4cHIsIGNvbnN0IEN1c3RvbVVuYXJ5RnVuYyYgZnVuYykKKyAgICAgIDogbV9leHByKGV4cHIpLCBtX2Z1bmMoZnVuYykge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBjb25zdCBDdXN0b21VbmFyeUZ1bmMmIGZ1bmMoKSBjb25zdCB7IHJldHVybiBtX2Z1bmM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9leHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX2V4cHI7CisgICAgY29uc3QgQ3VzdG9tVW5hcnlGdW5jIG1fZnVuYzsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbVVuYXJ5RnVuYywgdHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDdXN0b21VbmFyeU9wPEN1c3RvbVVuYXJ5RnVuYywgWHByVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDdXN0b21VbmFyeU9wPEN1c3RvbVVuYXJ5RnVuYywgWHByVHlwZT4gQXJnVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZ1R5cGU+OjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OnRyYWl0czxBcmdUeXBlPjo6TnVtRGltZW5zaW9uczsKKyAgdHlwZWRlZiBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXI+Ojp0eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OnR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUgPiAxKSwKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxYcHJUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBBcmdUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1fb3Aob3ApLCBtX2RldmljZShkZXZpY2UpLCBtX3Jlc3VsdChOVUxMKQorICB7CisgICAgbV9kaW1lbnNpb25zID0gb3AuZnVuYygpLmRpbWVuc2lvbnMob3AuZXhwcmVzc2lvbigpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChDb2VmZlJldHVyblR5cGUqIGRhdGEpIHsKKyAgICBpZiAoZGF0YSkgeworICAgICAgZXZhbFRvKGRhdGEpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBtX3Jlc3VsdCA9IHN0YXRpY19jYXN0PENvZWZmUmV0dXJuVHlwZSo+KAorICAgICAgICAgIG1fZGV2aWNlLmFsbG9jYXRlKGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihTY2FsYXIpKSk7CisgICAgICBldmFsVG8obV9yZXN1bHQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgaWYgKG1fcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9yZXN1bHQpOworICAgICAgbV9yZXN1bHQgPSBOVUxMOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcmVzdWx0W2luZGV4XTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRSZXR1cm5UeXBlLCBMb2FkTW9kZT4obV9yZXN1bHQgKyBpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgLy8gVE9ETyhybWxhcnNlbik6IEV4dGVuZCBDdXN0b21PcCBBUEkgdG8gcmV0dXJuIGl0cyBjb3N0IGVzdGltYXRlLgorICAgIHJldHVybiBUZW5zb3JPcENvc3Qoc2l6ZW9mKENvZWZmUmV0dXJuVHlwZSksIDAsIDAsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgQ29lZmZSZXR1cm5UeXBlKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9yZXN1bHQ7IH0KKworIHByb3RlY3RlZDoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBldmFsVG8oU2NhbGFyKiBkYXRhKSB7CisgICAgVGVuc29yTWFwPFRlbnNvcjxDb2VmZlJldHVyblR5cGUsIE51bURpbXMsIExheW91dCwgSW5kZXg+ID4gcmVzdWx0KAorICAgICAgICBkYXRhLCBtX2RpbWVuc2lvbnMpOworICAgIG1fb3AuZnVuYygpLmV2YWwobV9vcC5leHByZXNzaW9uKCksIHJlc3VsdCwgbV9kZXZpY2UpOworICB9CisKKyAgRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7CisgIGNvbnN0IEFyZ1R5cGUgbV9vcDsKKyAgY29uc3QgRGV2aWNlJiBtX2RldmljZTsKKyAgQ29lZmZSZXR1cm5UeXBlKiBtX3Jlc3VsdDsKK307CisKKworCisvKiogXGNsYXNzIFRlbnNvckN1c3RvbUJpbmFyeU9wCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBjdXN0b20gY2xhc3MuCisgICoKKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUJpbmFyeUZ1bmMsIHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckN1c3RvbUJpbmFyeU9wPEN1c3RvbUJpbmFyeUZ1bmMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgTGhzWHByVHlwZTo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNYcHJUeXBlOjpTY2FsYXI+OjpyZXQgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBMaHNYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJoc1hwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OnJldCBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgdHJhaXRzPExoc1hwclR5cGU+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzWHByVHlwZT46OlN0b3JhZ2VLaW5kPjo6cmV0IFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzWHByVHlwZT46OkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzWHByVHlwZT46OkluZGV4Pjo6dHlwZSBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNYcHJUeXBlOjpOZXN0ZWQgTGhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIFJoc1hwclR5cGU6Ok5lc3RlZCBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IHRyYWl0czxMaHNYcHJUeXBlPjo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSB0cmFpdHM8TGhzWHByVHlwZT46OkxheW91dDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUJpbmFyeUZ1bmMsIHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JDdXN0b21CaW5hcnlPcDxDdXN0b21CaW5hcnlGdW5jLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckN1c3RvbUJpbmFyeU9wPEN1c3RvbUJpbmFyeUZ1bmMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tQmluYXJ5RnVuYywgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQ3VzdG9tQmluYXJ5T3A8Q3VzdG9tQmluYXJ5RnVuYywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4gPgoreworICB0eXBlZGVmIFRlbnNvckN1c3RvbUJpbmFyeU9wPEN1c3RvbUJpbmFyeUZ1bmMsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21CaW5hcnlGdW5jLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorY2xhc3MgVGVuc29yQ3VzdG9tQmluYXJ5T3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDdXN0b21CaW5hcnlPcDxDdXN0b21CaW5hcnlGdW5jLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN1c3RvbUJpbmFyeU9wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN1c3RvbUJpbmFyeU9wPjo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPFRlbnNvckN1c3RvbUJpbmFyeU9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDdXN0b21CaW5hcnlPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VGVuc29yQ3VzdG9tQmluYXJ5T3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckN1c3RvbUJpbmFyeU9wKGNvbnN0IExoc1hwclR5cGUmIGxocywgY29uc3QgUmhzWHByVHlwZSYgcmhzLCBjb25zdCBDdXN0b21CaW5hcnlGdW5jJiBmdW5jKQorCisgICAgICA6IG1fbGhzX3hwcihsaHMpLCBtX3Joc194cHIocmhzKSwgbV9mdW5jKGZ1bmMpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgQ3VzdG9tQmluYXJ5RnVuYyYgZnVuYygpIGNvbnN0IHsgcmV0dXJuIG1fZnVuYzsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgIGxoc0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2xoc194cHI7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHNYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICByaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9yaHNfeHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZCBtX2xoc194cHI7CisgICAgdHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkIG1fcmhzX3hwcjsKKyAgICBjb25zdCBDdXN0b21CaW5hcnlGdW5jIG1fZnVuYzsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUJpbmFyeUZ1bmMsIHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ3VzdG9tQmluYXJ5T3A8Q3VzdG9tQmluYXJ5RnVuYywgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDdXN0b21CaW5hcnlPcDxDdXN0b21CaW5hcnlGdW5jLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8WHByVHlwZT46OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpOdW1EaW1lbnNpb25zOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSA+IDEpLAorICAgIEJsb2NrQWNjZXNzID0gZmFsc2UsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPExoc1hwclR5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9vcChvcCksIG1fZGV2aWNlKGRldmljZSksIG1fcmVzdWx0KE5VTEwpCisgIHsKKyAgICBtX2RpbWVuc2lvbnMgPSBvcC5mdW5jKCkuZGltZW5zaW9ucyhvcC5saHNFeHByZXNzaW9uKCksIG9wLnJoc0V4cHJlc3Npb24oKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKiBkYXRhKSB7CisgICAgaWYgKGRhdGEpIHsKKyAgICAgIGV2YWxUbyhkYXRhKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbV9yZXN1bHQgPSBzdGF0aWNfY2FzdDxTY2FsYXIgKj4obV9kZXZpY2UuYWxsb2NhdGUoZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKFNjYWxhcikpKTsKKyAgICAgIGV2YWxUbyhtX3Jlc3VsdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBpZiAobV9yZXN1bHQgIT0gTlVMTCkgeworICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShtX3Jlc3VsdCk7CisgICAgICBtX3Jlc3VsdCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9yZXN1bHRbaW5kZXhdOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFJldHVyblR5cGUsIExvYWRNb2RlPihtX3Jlc3VsdCArIGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICAvLyBUT0RPKHJtbGFyc2VuKTogRXh0ZW5kIEN1c3RvbU9wIEFQSSB0byByZXR1cm4gaXRzIGNvc3QgZXN0aW1hdGUuCisgICAgcmV0dXJuIFRlbnNvck9wQ29zdChzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSwgMCwgMCwgdmVjdG9yaXplZCwgUGFja2V0U2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX3Jlc3VsdDsgfQorCisgcHJvdGVjdGVkOgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGV2YWxUbyhTY2FsYXIqIGRhdGEpIHsKKyAgICBUZW5zb3JNYXA8VGVuc29yPFNjYWxhciwgTnVtRGltcywgTGF5b3V0PiA+IHJlc3VsdChkYXRhLCBtX2RpbWVuc2lvbnMpOworICAgIG1fb3AuZnVuYygpLmV2YWwobV9vcC5saHNFeHByZXNzaW9uKCksIG1fb3AucmhzRXhwcmVzc2lvbigpLCByZXN1bHQsIG1fZGV2aWNlKTsKKyAgfQorCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBjb25zdCBYcHJUeXBlIG1fb3A7CisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7CisgIENvZWZmUmV0dXJuVHlwZSogbV9yZXN1bHQ7Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9DVVNUT01fT1BfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2UuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllNTBhMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JEZXZpY2UKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUHNldWRvIGV4cHJlc3Npb24gcHJvdmlkaW5nIGFuIG9wZXJhdG9yID0gdGhhdCB3aWxsIGV2YWx1YXRlIGl0cyBhcmd1bWVudAorICAqIG9uIHRoZSBzcGVjaWZpZWQgY29tcHV0aW5nICdkZXZpY2UnIChHUFUsIHRocmVhZCBwb29sLCAuLi4pCisgICoKKyAgKiBFeGFtcGxlOgorICAqICAgIEMuZGV2aWNlKEVJR0VOX0dQVSkgPSBBICsgQjsKKyAgKgorICAqIFRvZG86IG9wZXJhdG9yICo9IGFuZCAvPS4KKyAgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBEZXZpY2VUeXBlPiBjbGFzcyBUZW5zb3JEZXZpY2UgeworICBwdWJsaWM6CisgICAgVGVuc29yRGV2aWNlKGNvbnN0IERldmljZVR5cGUmIGRldmljZSwgRXhwcmVzc2lvblR5cGUmIGV4cHJlc3Npb24pIDogbV9kZXZpY2UoZGV2aWNlKSwgbV9leHByZXNzaW9uKGV4cHJlc3Npb24pIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JEZXZpY2UmIG9wZXJhdG9yPShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPEV4cHJlc3Npb25UeXBlLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24obV9leHByZXNzaW9uLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2VUeXBlPjo6cnVuKGFzc2lnbiwgbV9kZXZpY2UpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckRldmljZSYgb3BlcmF0b3IrPShjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgICAgIHR5cGVkZWYgVGVuc29yQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LCBjb25zdCBFeHByZXNzaW9uVHlwZSwgY29uc3QgT3RoZXJEZXJpdmVkPiBTdW07CisgICAgICBTdW0gc3VtKG1fZXhwcmVzc2lvbiwgb3RoZXIpOworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxFeHByZXNzaW9uVHlwZSwgY29uc3QgU3VtPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKG1fZXhwcmVzc2lvbiwgc3VtKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZVR5cGU+OjpydW4oYXNzaWduLCBtX2RldmljZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRGV2aWNlJiBvcGVyYXRvci09KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICAgICAgdHlwZWRlZiBUZW5zb3JDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LCBjb25zdCBFeHByZXNzaW9uVHlwZSwgY29uc3QgT3RoZXJEZXJpdmVkPiBEaWZmZXJlbmNlOworICAgICAgRGlmZmVyZW5jZSBkaWZmZXJlbmNlKG1fZXhwcmVzc2lvbiwgb3RoZXIpOworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxFeHByZXNzaW9uVHlwZSwgY29uc3QgRGlmZmVyZW5jZT4gQXNzaWduOworICAgICAgQXNzaWduIGFzc2lnbihtX2V4cHJlc3Npb24sIGRpZmZlcmVuY2UpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlVHlwZT46OnJ1bihhc3NpZ24sIG1fZGV2aWNlKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IERldmljZVR5cGUmIG1fZGV2aWNlOworICAgIEV4cHJlc3Npb25UeXBlJiBtX2V4cHJlc3Npb247Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlQ3VkYS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VDdWRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1NzY3YgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlQ3VkYS5oCkBAIC0wLDAgKzEsMzM3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWYgZGVmaW5lZChFSUdFTl9VU0VfR1BVKSAmJiAhZGVmaW5lZChFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9DVURBX0gpCisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX0NVREFfSAorCituYW1lc3BhY2UgRWlnZW4geworCitzdGF0aWMgY29uc3QgaW50IGtDdWRhU2NyYXRjaFNpemUgPSAxMDI0OworCisvLyBUaGlzIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRoYXQgR1BVRGV2aWNlIGNhbiB0YWtlIHRvIHVzZQorLy8gQ1VEQSBzdHJlYW1zIHVuZGVybmVhdGguCitjbGFzcyBTdHJlYW1JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+U3RyZWFtSW50ZXJmYWNlKCkge30KKworICB2aXJ0dWFsIGNvbnN0IGN1ZGFTdHJlYW1fdCYgc3RyZWFtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IGN1ZGFEZXZpY2VQcm9wJiBkZXZpY2VQcm9wZXJ0aWVzKCkgY29uc3QgPSAwOworCisgIC8vIEFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgYWN0dWFsIGRldmljZSB3aGVyZSB0aGUgY29tcHV0YXRpb24gd2lsbCBydW4KKyAgdmlydHVhbCB2b2lkKiBhbGxvY2F0ZShzaXplX3QgbnVtX2J5dGVzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlKHZvaWQqIGJ1ZmZlcikgY29uc3QgPSAwOworCisgIC8vIFJldHVybiBhIHNjcmF0Y2hwYWQgYnVmZmVyIG9mIHNpemUgMWsKKyAgdmlydHVhbCB2b2lkKiBzY3JhdGNocGFkKCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybiBhIHNlbWFwaG9yZS4gVGhlIHNlbWFwaG9yZSBpcyBpbml0aWFsbHkgaW5pdGlhbGl6ZWQgdG8gMCwgYW5kCisgIC8vIGVhY2gga2VybmVsIHVzaW5nIGl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXNldHRpbmcgdG8gMCB1cG9uIGNvbXBsZXRpb24KKyAgLy8gdG8gbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IHRoZSBzZW1hcGhvcmUgaXMgYWx3YXlzIGVxdWFsIHRvIDAgdXBvbgorICAvLyBlYWNoIGtlcm5lbCBzdGFydC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQqIHNlbWFwaG9yZSgpIGNvbnN0ID0gMDsKK307CisKK3N0YXRpYyBjdWRhRGV2aWNlUHJvcCogbV9kZXZpY2VQcm9wZXJ0aWVzOworc3RhdGljIGJvb2wgbV9kZXZpY2VQcm9wSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURldmljZVByb3AoKSB7CisgIGlmICghbV9kZXZpY2VQcm9wSW5pdGlhbGl6ZWQpIHsKKyAgICAvLyBBdHRlbXB0cyB0byBlbnN1cmUgcHJvcGVyIGJlaGF2aW9yIGluIHRoZSBjYXNlIG9mIG11bHRpcGxlIHRocmVhZHMKKyAgICAvLyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gc2ltdWx0YW5lb3VzbHkuIFRoaXMgd291bGQgYmUgdHJpdmlhbCB0bworICAgIC8vIGltcGxlbWVudCBpZiB3ZSBjb3VsZCB1c2Ugc3RkOjptdXRleCwgYnV0IHVuZm9ydHVuYXRlbHkgbXV0ZXggZG9uJ3QKKyAgICAvLyBjb21waWxlIHdpdGggbnZjYywgc28gd2UgcmVzb3J0IHRvIGF0b21pY3MgYW5kIHRocmVhZCBmZW5jZXMgaW5zdGVhZC4KKyAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciB1c2VzIGEgY29tcGlsZXIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgYysrMTEgd2UKKyAgICAvLyBjYW4ndCBlbnN1cmUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgdGhyZWFkIHNhZmUuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBmaXJzdCh0cnVlKTsKKyAgICBpZiAoZmlyc3QuZXhjaGFuZ2UoZmFsc2UpKSB7CisjZWxzZQorICAgIHN0YXRpYyBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisjZW5kaWYKKyAgICAgIC8vIFdlJ3JlIHRoZSBmaXJzdCB0aHJlYWQgdG8gcmVhY2ggdGhpcyBwb2ludC4KKyAgICAgIGludCBudW1fZGV2aWNlczsKKyAgICAgIGN1ZGFFcnJvcl90IHN0YXR1cyA9IGN1ZGFHZXREZXZpY2VDb3VudCgmbnVtX2RldmljZXMpOworICAgICAgaWYgKHN0YXR1cyAhPSBjdWRhU3VjY2VzcykgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG51bWJlciBvZiBDVURBIGRldmljZXM6ICIKKyAgICAgICAgICAgICAgICAgIDw8IGN1ZGFHZXRFcnJvclN0cmluZyhzdGF0dXMpCisgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGFzc2VydChzdGF0dXMgPT0gY3VkYVN1Y2Nlc3MpOworICAgICAgfQorICAgICAgbV9kZXZpY2VQcm9wZXJ0aWVzID0gbmV3IGN1ZGFEZXZpY2VQcm9wW251bV9kZXZpY2VzXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldmljZXM7ICsraSkgeworICAgICAgICBzdGF0dXMgPSBjdWRhR2V0RGV2aWNlUHJvcGVydGllcygmbV9kZXZpY2VQcm9wZXJ0aWVzW2ldLCBpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBjdWRhU3VjY2VzcykgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQ1VEQSBkZXZpY2UgIyIKKyAgICAgICAgICAgICAgICAgICAgPDwgaQorICAgICAgICAgICAgICAgICAgICA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGN1ZGFHZXRFcnJvclN0cmluZyhzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhc3NlcnQoc3RhdHVzID09IGN1ZGFTdWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworI2VuZGlmCisgICAgICBtX2RldmljZVByb3BJbml0aWFsaXplZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gaW5pdGl0aWFsaXplIHRoZSBwcm9wZXJ0aWVzLgorICAgICAgd2hpbGUgKCFtX2RldmljZVByb3BJbml0aWFsaXplZCkgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworI2VuZGlmCisgICAgICAgIHNsZWVwKDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgY3VkYVN0cmVhbV90IGRlZmF1bHRfc3RyZWFtID0gY3VkYVN0cmVhbURlZmF1bHQ7CisKK2NsYXNzIEN1ZGFTdHJlYW1EZXZpY2UgOiBwdWJsaWMgU3RyZWFtSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIC8vIFVzZSB0aGUgZGVmYXVsdCBzdHJlYW0gb24gdGhlIGN1cnJlbnQgZGV2aWNlCisgIEN1ZGFTdHJlYW1EZXZpY2UoKSA6IHN0cmVhbV8oJmRlZmF1bHRfc3RyZWFtKSwgc2NyYXRjaF8oTlVMTCksIHNlbWFwaG9yZV8oTlVMTCkgeworICAgIGN1ZGFHZXREZXZpY2UoJmRldmljZV8pOworICAgIGluaXRpYWxpemVEZXZpY2VQcm9wKCk7CisgIH0KKyAgLy8gVXNlIHRoZSBkZWZhdWx0IHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIGRldmljZQorICBDdWRhU3RyZWFtRGV2aWNlKGludCBkZXZpY2UpIDogc3RyZWFtXygmZGVmYXVsdF9zdHJlYW0pLCBkZXZpY2VfKGRldmljZSksIHNjcmF0Y2hfKE5VTEwpLCBzZW1hcGhvcmVfKE5VTEwpIHsKKyAgICBpbml0aWFsaXplRGV2aWNlUHJvcCgpOworICB9CisgIC8vIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gTm90ZSB0aGF0IGl0J3MgdGhlCisgIC8vIGNhbGxlciByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtIGNhbiBydW4gb24KKyAgLy8gdGhlIHNwZWNpZmllZCBkZXZpY2UuIElmIG5vIGRldmljZSBpcyBzcGVjaWZpZWQgdGhlIGNvZGUKKyAgLy8gYXNzdW1lcyB0aGF0IHRoZSBzdHJlYW0gaXMgYXNzb2NpYXRlZCB0byB0aGUgY3VycmVudCBncHUgZGV2aWNlLgorICBDdWRhU3RyZWFtRGV2aWNlKGNvbnN0IGN1ZGFTdHJlYW1fdCogc3RyZWFtLCBpbnQgZGV2aWNlID0gLTEpCisgICAgICA6IHN0cmVhbV8oc3RyZWFtKSwgZGV2aWNlXyhkZXZpY2UpLCBzY3JhdGNoXyhOVUxMKSwgc2VtYXBob3JlXyhOVUxMKSB7CisgICAgaWYgKGRldmljZSA8IDApIHsKKyAgICAgIGN1ZGFHZXREZXZpY2UoJmRldmljZV8pOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbnVtX2RldmljZXM7CisgICAgICBjdWRhRXJyb3JfdCBlcnIgPSBjdWRhR2V0RGV2aWNlQ291bnQoJm51bV9kZXZpY2VzKTsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShlcnIpCisgICAgICBhc3NlcnQoZXJyID09IGN1ZGFTdWNjZXNzKTsKKyAgICAgIGFzc2VydChkZXZpY2UgPCBudW1fZGV2aWNlcyk7CisgICAgICBkZXZpY2VfID0gZGV2aWNlOworICAgIH0KKyAgICBpbml0aWFsaXplRGV2aWNlUHJvcCgpOworICB9CisKKyAgdmlydHVhbCB+Q3VkYVN0cmVhbURldmljZSgpIHsKKyAgICBpZiAoc2NyYXRjaF8pIHsKKyAgICAgIGRlYWxsb2NhdGUoc2NyYXRjaF8pOworICAgIH0KKyAgfQorCisgIGNvbnN0IGN1ZGFTdHJlYW1fdCYgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gKnN0cmVhbV87IH0KKyAgY29uc3QgY3VkYURldmljZVByb3AmIGRldmljZVByb3BlcnRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZGV2aWNlUHJvcGVydGllc1tkZXZpY2VfXTsKKyAgfQorICB2aXJ0dWFsIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBudW1fYnl0ZXMpIGNvbnN0IHsKKyAgICBjdWRhRXJyb3JfdCBlcnIgPSBjdWRhU2V0RGV2aWNlKGRldmljZV8pOworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShlcnIpCisgICAgYXNzZXJ0KGVyciA9PSBjdWRhU3VjY2Vzcyk7CisgICAgdm9pZCogcmVzdWx0OworICAgIGVyciA9IGN1ZGFNYWxsb2MoJnJlc3VsdCwgbnVtX2J5dGVzKTsKKyAgICBhc3NlcnQoZXJyID09IGN1ZGFTdWNjZXNzKTsKKyAgICBhc3NlcnQocmVzdWx0ICE9IE5VTEwpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgdmlydHVhbCB2b2lkIGRlYWxsb2NhdGUodm9pZCogYnVmZmVyKSBjb25zdCB7CisgICAgY3VkYUVycm9yX3QgZXJyID0gY3VkYVNldERldmljZShkZXZpY2VfKTsKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZXJyKQorICAgIGFzc2VydChlcnIgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChidWZmZXIgIT0gTlVMTCk7CisgICAgZXJyID0gY3VkYUZyZWUoYnVmZmVyKTsKKyAgICBhc3NlcnQoZXJyID09IGN1ZGFTdWNjZXNzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCogc2NyYXRjaHBhZCgpIGNvbnN0IHsKKyAgICBpZiAoc2NyYXRjaF8gPT0gTlVMTCkgeworICAgICAgc2NyYXRjaF8gPSBhbGxvY2F0ZShrQ3VkYVNjcmF0Y2hTaXplICsgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIH0KKyAgICByZXR1cm4gc2NyYXRjaF87CisgIH0KKworICB2aXJ0dWFsIHVuc2lnbmVkIGludCogc2VtYXBob3JlKCkgY29uc3QgeworICAgIGlmIChzZW1hcGhvcmVfID09IE5VTEwpIHsKKyAgICAgIGNoYXIqIHNjcmF0Y2ggPSBzdGF0aWNfY2FzdDxjaGFyKj4oc2NyYXRjaHBhZCgpKSArIGtDdWRhU2NyYXRjaFNpemU7CisgICAgICBzZW1hcGhvcmVfID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQqPihzY3JhdGNoKTsKKyAgICAgIGN1ZGFFcnJvcl90IGVyciA9IGN1ZGFNZW1zZXRBc3luYyhzZW1hcGhvcmVfLCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgKnN0cmVhbV8pOworICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGVycikKKyAgICAgIGFzc2VydChlcnIgPT0gY3VkYVN1Y2Nlc3MpOworICAgIH0KKyAgICByZXR1cm4gc2VtYXBob3JlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgY3VkYVN0cmVhbV90KiBzdHJlYW1fOworICBpbnQgZGV2aWNlXzsKKyAgbXV0YWJsZSB2b2lkKiBzY3JhdGNoXzsKKyAgbXV0YWJsZSB1bnNpZ25lZCBpbnQqIHNlbWFwaG9yZV87Cit9OworCitzdHJ1Y3QgR3B1RGV2aWNlIHsKKyAgLy8gVGhlIFN0cmVhbUludGVyZmFjZSBpcyBub3Qgb3duZWQ6IHRoZSBjYWxsZXIgaXMKKyAgLy8gcmVzcG9uc2libGUgZm9yIGl0cyBpbml0aWFsaXphdGlvbiBhbmQgZXZlbnR1YWwgZGVzdHJ1Y3Rpb24uCisgIGV4cGxpY2l0IEdwdURldmljZShjb25zdCBTdHJlYW1JbnRlcmZhY2UqIHN0cmVhbSkgOiBzdHJlYW1fKHN0cmVhbSksIG1heF9ibG9ja3NfKElOVF9NQVgpIHsKKyAgICBlaWdlbl9hc3NlcnQoc3RyZWFtKTsKKyAgfQorICBleHBsaWNpdCBHcHVEZXZpY2UoY29uc3QgU3RyZWFtSW50ZXJmYWNlKiBzdHJlYW0sIGludCBudW1fYmxvY2tzKSA6IHN0cmVhbV8oc3RyZWFtKSwgbWF4X2Jsb2Nrc18obnVtX2Jsb2NrcykgeworICAgIGVpZ2VuX2Fzc2VydChzdHJlYW0pOworICB9CisgIC8vIFRPRE8oYnN0ZWluZXIpOiBUaGlzIGlzIGFuIGludGVybmFsIEFQSSwgd2Ugc2hvdWxkIG5vdCBleHBvc2UgaXQuCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgY3VkYVN0cmVhbV90JiBzdHJlYW0oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPnN0cmVhbSgpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkKiBhbGxvY2F0ZShzaXplX3QgbnVtX2J5dGVzKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPmFsbG9jYXRlKG51bV9ieXRlcyk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBidWZmZXIpIGNvbnN0IHsKKyAgICBzdHJlYW1fLT5kZWFsbG9jYXRlKGJ1ZmZlcik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQqIHNjcmF0Y2hwYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPnNjcmF0Y2hwYWQoKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdW5zaWduZWQgaW50KiBzZW1hcGhvcmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPnNlbWFwaG9yZSgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbWNweSh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IG4pIGNvbnN0IHsKKyNpZm5kZWYgX19DVURBX0FSQ0hfXworICAgIGN1ZGFFcnJvcl90IGVyciA9IGN1ZGFNZW1jcHlBc3luYyhkc3QsIHNyYywgbiwgY3VkYU1lbWNweURldmljZVRvRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fLT5zdHJlYW0oKSk7CisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGVycikKKyAgICBhc3NlcnQoZXJyID09IGN1ZGFTdWNjZXNzKTsKKyNlbHNlCisgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiVGhlIGRlZmF1bHQgZGV2aWNlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgdG8gZ2VuZXJhdGUga2VybmVsIGNvZGUiKTsKKyNlbmRpZgorICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbWNweUhvc3RUb0RldmljZSh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBjdWRhRXJyb3JfdCBlcnIgPQorICAgICAgICBjdWRhTWVtY3B5QXN5bmMoZHN0LCBzcmMsIG4sIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UsIHN0cmVhbV8tPnN0cmVhbSgpKTsKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZXJyKQorICAgIGFzc2VydChlcnIgPT0gY3VkYVN1Y2Nlc3MpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbWNweURldmljZVRvSG9zdCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBjdWRhRXJyb3JfdCBlcnIgPQorICAgICAgICBjdWRhTWVtY3B5QXN5bmMoZHN0LCBzcmMsIG4sIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIHN0cmVhbV8tPnN0cmVhbSgpKTsKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZXJyKQorICAgIGFzc2VydChlcnIgPT0gY3VkYVN1Y2Nlc3MpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbXNldCh2b2lkKiBidWZmZXIsIGludCBjLCBzaXplX3QgbikgY29uc3QgeworI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgICAgY3VkYUVycm9yX3QgZXJyID0gY3VkYU1lbXNldEFzeW5jKGJ1ZmZlciwgYywgbiwgc3RyZWFtXy0+c3RyZWFtKCkpOworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShlcnIpCisgICAgYXNzZXJ0KGVyciA9PSBjdWRhU3VjY2Vzcyk7CisjZWxzZQorICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIlRoZSBkZWZhdWx0IGRldmljZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIHRvIGdlbmVyYXRlIGtlcm5lbCBjb2RlIik7CisjZW5kaWYKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgc2l6ZV90IG51bVRocmVhZHMoKSBjb25zdCB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gMzI7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNpemVfdCBmaXJzdExldmVsQ2FjaGVTaXplKCkgY29uc3QgeworICAgIC8vIEZJWE1FCisgICAgcmV0dXJuIDQ4KjEwMjQ7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNpemVfdCBsYXN0TGV2ZWxDYWNoZVNpemUoKSBjb25zdCB7CisgICAgLy8gV2Ugd29uJ3QgdHJ5IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBsMiBjYWNoZSBmb3IgdGhlIHRpbWUgYmVpbmcsIGFuZAorICAgIC8vIHRoZXJlIGlzIG5vIGwzIGNhY2hlIG9uIGN1ZGEgZGV2aWNlcy4KKyAgICByZXR1cm4gZmlyc3RMZXZlbENhY2hlU2l6ZSgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHN5bmNocm9uaXplKCkgY29uc3QgeworI2lmIGRlZmluZWQoX19DVURBQ0NfXykgJiYgIWRlZmluZWQoX19DVURBX0FSQ0hfXykKKyAgICBjdWRhRXJyb3JfdCBlcnIgPSBjdWRhU3RyZWFtU3luY2hyb25pemUoc3RyZWFtXy0+c3RyZWFtKCkpOworICAgIGlmIChlcnIgIT0gY3VkYVN1Y2Nlc3MpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3IgZGV0ZWN0ZWQgaW4gQ1VEQSBzdHJlYW06ICIKKyAgICAgICAgICAgICAgICA8PCBjdWRhR2V0RXJyb3JTdHJpbmcoZXJyKQorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGFzc2VydChlcnIgPT0gY3VkYVN1Y2Nlc3MpOworICAgIH0KKyNlbHNlCisgICAgYXNzZXJ0KGZhbHNlICYmICJUaGUgZGVmYXVsdCBkZXZpY2Ugc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCB0byBnZW5lcmF0ZSBrZXJuZWwgY29kZSIpOworI2VuZGlmCisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBnZXROdW1DdWRhTXVsdGlQcm9jZXNzb3JzKCkgY29uc3QgeworICAgIHJldHVybiBzdHJlYW1fLT5kZXZpY2VQcm9wZXJ0aWVzKCkubXVsdGlQcm9jZXNzb3JDb3VudDsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBtYXhDdWRhVGhyZWFkc1BlckJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBzdHJlYW1fLT5kZXZpY2VQcm9wZXJ0aWVzKCkubWF4VGhyZWFkc1BlckJsb2NrOworICB9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IG1heEN1ZGFUaHJlYWRzUGVyTXVsdGlQcm9jZXNzb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPmRldmljZVByb3BlcnRpZXMoKS5tYXhUaHJlYWRzUGVyTXVsdGlQcm9jZXNzb3I7CisgIH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBpbnQgc2hhcmVkTWVtUGVyQmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPmRldmljZVByb3BlcnRpZXMoKS5zaGFyZWRNZW1QZXJCbG9jazsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBtYWpvckRldmljZVZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPmRldmljZVByb3BlcnRpZXMoKS5tYWpvcjsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBtaW5vckRldmljZVZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmVhbV8tPmRldmljZVByb3BlcnRpZXMoKS5taW5vcjsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IG1heEJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4X2Jsb2Nrc187CisgIH0KKworICAvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgQ1VEQSBydW50aW1lIHJlY29yZGVkIGFuIGVycm9yIGZvciB0aGUKKyAgLy8gdW5kZXJseWluZyBzdHJlYW0gZGV2aWNlLgorICBpbmxpbmUgYm9vbCBvaygpIGNvbnN0IHsKKyNpZmRlZiBfX0NVREFDQ19fCisgICAgY3VkYUVycm9yX3QgZXJyb3IgPSBjdWRhU3RyZWFtUXVlcnkoc3RyZWFtXy0+c3RyZWFtKCkpOworICAgIHJldHVybiAoZXJyb3IgPT0gY3VkYVN1Y2Nlc3MpIHx8IChlcnJvciA9PSBjdWRhRXJyb3JOb3RSZWFkeSk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICB9CisKKyBwcml2YXRlOgorICBjb25zdCBTdHJlYW1JbnRlcmZhY2UqIHN0cmVhbV87CisgIGludCBtYXhfYmxvY2tzXzsKK307CisKKyNkZWZpbmUgTEFVTkNIX0NVREFfS0VSTkVMKGtlcm5lbCwgZ3JpZHNpemUsIGJsb2Nrc2l6ZSwgc2hhcmVkbWVtLCBkZXZpY2UsIC4uLikgICAgICAgICAgICAgXAorICAoa2VybmVsKSA8PDwgKGdyaWRzaXplKSwgKGJsb2Nrc2l6ZSksIChzaGFyZWRtZW0pLCAoZGV2aWNlKS5zdHJlYW0oKSA+Pj4gKF9fVkFfQVJHU19fKTsgICBcCisgIGFzc2VydChjdWRhR2V0TGFzdEVycm9yKCkgPT0gY3VkYVN1Y2Nlc3MpOworCisKKy8vIEZJWE1FOiBTaG91bGQgYmUgZGV2aWNlIGFuZCBrZXJuZWwgc3BlY2lmaWMuCisjaWZkZWYgX19DVURBQ0NfXworc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSB2b2lkIHNldEN1ZGFTaGFyZWRNZW1Db25maWcoY3VkYVNoYXJlZE1lbUNvbmZpZyBjb25maWcpIHsKKyNpZm5kZWYgX19DVURBX0FSQ0hfXworICBjdWRhRXJyb3JfdCBzdGF0dXMgPSBjdWRhRGV2aWNlU2V0U2hhcmVkTWVtQ29uZmlnKGNvbmZpZyk7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzdGF0dXMpCisgIGFzc2VydChzdGF0dXMgPT0gY3VkYVN1Y2Nlc3MpOworI2Vsc2UKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGNvbmZpZykKKyNlbmRpZgorfQorI2VuZGlmCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9DVURBX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlRGVmYXVsdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VEZWZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxNDEzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGV2aWNlRGVmYXVsdC5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9ERVZJQ0VfREVGQVVMVF9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX0RFRkFVTFRfSAorCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8vIERlZmF1bHQgZGV2aWNlIGZvciB0aGUgbWFjaGluZSAodHlwaWNhbGx5IGEgc2luZ2xlIGNwdSBjb3JlKQorc3RydWN0IERlZmF1bHREZXZpY2UgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBudW1fYnl0ZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKG51bV9ieXRlcyk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGRlYWxsb2NhdGUodm9pZCogYnVmZmVyKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OmFsaWduZWRfZnJlZShidWZmZXIpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtZW1jcHkodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgOjptZW1jcHkoZHN0LCBzcmMsIG4pOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtZW1jcHlIb3N0VG9EZXZpY2Uodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCBuKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWVtY3B5RGV2aWNlVG9Ib3N0KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbikgY29uc3QgeworICAgIG1lbWNweShkc3QsIHNyYywgbik7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbXNldCh2b2lkKiBidWZmZXIsIGludCBjLCBzaXplX3QgbikgY29uc3QgeworICAgIDo6bWVtc2V0KGJ1ZmZlciwgYywgbik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHNpemVfdCBudW1UaHJlYWRzKCkgY29uc3QgeworI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgICAgLy8gUnVubmluZyBvbiB0aGUgaG9zdCBDUFUKKyAgICByZXR1cm4gMTsKKyNlbHNlCisgICAgLy8gUnVubmluZyBvbiBhIENVREEgZGV2aWNlCisgICAgcmV0dXJuIDMyOworI2VuZGlmCisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHNpemVfdCBmaXJzdExldmVsQ2FjaGVTaXplKCkgY29uc3QgeworI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgICAgLy8gUnVubmluZyBvbiB0aGUgaG9zdCBDUFUKKyAgICByZXR1cm4gbDFDYWNoZVNpemUoKTsKKyNlbHNlCisgICAgLy8gUnVubmluZyBvbiBhIENVREEgZGV2aWNlLCByZXR1cm4gdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IGF2YWlsYWJsZS4KKyAgICByZXR1cm4gNDgqMTAyNDsKKyNlbmRpZgorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzaXplX3QgbGFzdExldmVsQ2FjaGVTaXplKCkgY29uc3QgeworI2lmbmRlZiBfX0NVREFfQVJDSF9fCisgICAgLy8gUnVubmluZyBzaW5nbGUgdGhyZWFkZWQgb24gdGhlIGhvc3QgQ1BVCisgICAgcmV0dXJuIGwzQ2FjaGVTaXplKCk7CisjZWxzZQorICAgIC8vIFJ1bm5pbmcgb24gYSBDVURBIGRldmljZQorICAgIHJldHVybiBmaXJzdExldmVsQ2FjaGVTaXplKCk7CisjZW5kaWYKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IG1ham9yRGV2aWNlVmVyc2lvbigpIGNvbnN0IHsKKyNpZm5kZWYgX19DVURBX0FSQ0hfXworICAgIC8vIFJ1bm5pbmcgc2luZ2xlIHRocmVhZGVkIG9uIHRoZSBob3N0IENQVQorICAgIC8vIFNob3VsZCByZXR1cm4gYW4gZW51bSB0aGF0IGVuY29kZXMgdGhlIElTQSBzdXBwb3J0ZWQgYnkgdGhlIENQVQorICAgIHJldHVybiAxOworI2Vsc2UKKyAgICAvLyBSdW5uaW5nIG9uIGEgQ1VEQSBkZXZpY2UKKyAgICByZXR1cm4gX19DVURBX0FSQ0hfXyAvIDEwMDsKKyNlbmRpZgorICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX0RFRkFVTFRfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VTeWNsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRldmljZVN5Y2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzAzOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VTeWNsLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9TWUNMKSAmJiAhZGVmaW5lZChFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9TWUNMX0gpCisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX1NZQ0xfSAorCituYW1lc3BhY2UgRWlnZW4geworc3RydWN0IFN5Y2xEZXZpY2UgeworICAvLy8gY2xhc3MgbWVtYmVycworICAvLy8gc3ljbCBxdWV1ZQorICBtdXRhYmxlIGNsOjpzeWNsOjpxdWV1ZSBtX3F1ZXVlOworICAvLy8gc3RkOjptYXAgaXMgdGhlIGNvbnRhaW5lciB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNyZWF0ZSBvbmx5IG9uZSBidWZmZXIKKyAgLy8vIHBlciBwb2ludGVyLiBUaGUgbGlmZXNwYW4gb2YgdGhlIGJ1ZmZlciBub3cgZGVwZW5kcyBvbiB0aGUgbGlmZXNwYW4gb2YgU3ljbERldmljZS4KKyAgLy8vIElmIGEgbm9uLXJlYWQtb25seSBwb2ludGVyIGlzIG5lZWRlZCB0byBiZSBhY2Nlc3NlZCBvbiB0aGUgaG9zdCB3ZSBzaG91bGQgbWFudWFsbHkgZGVhbGxvY2F0ZSBpdC4KKyAgbXV0YWJsZSBzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPj4gYnVmZmVyX21hcDsKKyAgLy8vIGNyZWF0aW5nIGRldmljZSBieSB1c2luZyBzZWxlY3RvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBkZXZfU2VsZWN0b3I+IFN5Y2xEZXZpY2UoZGV2X1NlbGVjdG9yIHMpCisgIDoKKyNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgIG1fcXVldWUoY2w6OnN5Y2w6OnF1ZXVlKHMsIFs9XShjbDo6c3ljbDo6ZXhjZXB0aW9uX2xpc3QgbCkgeworICAgIGZvciAoY29uc3QgYXV0byYgZSA6IGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oZSk7CisgICAgICB9IGNhdGNoIChjbDo6c3ljbDo6ZXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgfQorICB9KSkKKyNlbHNlCisgIG1fcXVldWUoY2w6OnN5Y2w6OnF1ZXVlKHMpKQorI2VuZGlmCisgIHt9CisgIC8vIGRlc3RydWN0b3IKKyAgflN5Y2xEZXZpY2UoKSB7IGRlYWxsb2NhdGVfYWxsKCk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBkZWFsbG9jYXRlKFQgKnApIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gYnVmZmVyX21hcC5maW5kKHApOworICAgIGlmIChpdCAhPSBidWZmZXJfbWFwLmVuZCgpKSB7CisgICAgICBidWZmZXJfbWFwLmVyYXNlKGl0KTsKKyAgICAgIGludGVybmFsOjphbGlnbmVkX2ZyZWUocCk7CisgICAgfQorICB9CisgIHZvaWQgZGVhbGxvY2F0ZV9hbGwoKSBjb25zdCB7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4+OjppdGVyYXRvciBpdD1idWZmZXJfbWFwLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0IT1idWZmZXJfbWFwLmVuZCgpKSB7CisgICAgICBhdXRvIHA9aXQtPmZpcnN0OworICAgICAgYnVmZmVyX21hcC5lcmFzZShpdCk7CisgICAgICBpbnRlcm5hbDo6YWxpZ25lZF9mcmVlKGNvbnN0X2Nhc3Q8dm9pZCo+KHApKTsKKyAgICAgIGl0PWJ1ZmZlcl9tYXAuYmVnaW4oKTsKKyAgICB9CisgICAgYnVmZmVyX21hcC5jbGVhcigpOworICB9CisKKyAgLy8vIGNyZWF0aW9uIG9mIHN5Y2wgYWNjZXNzb3IgZm9yIGEgYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIGZpcnN0IHRyaWVzIHRvIGZpbmQKKyAgLy8vIHRoZSBidWZmZXIgaW4gdGhlIGJ1ZmZlcl9tYXAuIElmIGZvdW5kIGl0IGdldHMgdGhlIGFjY2Vzc29yIGZyb20gaXQsIGlmIG5vdCwKKyAgLy8vdGhlIGZ1bmN0aW9uIHRoZW4gYWRkcyBhbiBlbnRyeSBieSBjcmVhdGluZyBhIHN5Y2wgYnVmZmVyIGZvciB0aGF0IHBhcnRpY3VsYXIgcG9pbnRlci4KKyAgdGVtcGxhdGUgPGNsOjpzeWNsOjphY2Nlc3M6Om1vZGUgQWNNZCwgdHlwZW5hbWUgVD4gaW5saW5lIGNsOjpzeWNsOjphY2Nlc3NvcjxULCAxLCBBY01kLCBjbDo6c3ljbDo6YWNjZXNzOjp0YXJnZXQ6Omdsb2JhbF9idWZmZXI+CisgIGdldF9zeWNsX2FjY2Vzc29yKHNpemVfdCBudW1fYnl0ZXMsIGNsOjpzeWNsOjpoYW5kbGVyICZjZ2gsIGNvbnN0IFQgKiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldF9zeWNsX2J1ZmZlcjxUPihudW1fYnl0ZXMsIHB0ciktPnRlbXBsYXRlIGdldF9hY2Nlc3M8QWNNZCwgY2w6OnN5Y2w6OmFjY2Vzczo6dGFyZ2V0OjpnbG9iYWxfYnVmZmVyPihjZ2gpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSAgc3RkOjpwYWlyPHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+Pjo6aXRlcmF0b3IsYm9vbD4gYWRkX3N5Y2xfYnVmZmVyKGNvbnN0IFQgKnB0ciwgc2l6ZV90IG51bV9ieXRlcykgY29uc3QgeworICAgIHVzaW5nIFR5cGUgPSBjbDo6c3ljbDo6YnVmZmVyPFQsIDE+OworICAgIHN0ZDo6cGFpcjxzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPj46Oml0ZXJhdG9yLGJvb2w+IHJldCA9IGJ1ZmZlcl9tYXAuaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPj4ocHRyLCBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4obmV3IFR5cGUoY2w6OnN5Y2w6OnJhbmdlPDE+KG51bV9ieXRlcykpLAorICAgICAgW10odm9pZCAqZGF0YU1lbSkgeyBkZWxldGUgc3RhdGljX2Nhc3Q8VHlwZSo+KGRhdGFNZW0pOyB9KSkpOworICAgIChzdGF0aWNfY2FzdDxUeXBlKj4oYnVmZmVyX21hcC5hdChwdHIpLmdldCgpKSktPnNldF9maW5hbF9kYXRhKG51bGxwdHIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIGNsOjpzeWNsOjpidWZmZXI8VCwgMT4qIGdldF9zeWNsX2J1ZmZlcihzaXplX3QgbnVtX2J5dGVzLGNvbnN0IFQgKiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmJ1ZmZlcjxULCAxPio+KGFkZF9zeWNsX2J1ZmZlcihwdHIsIG51bV9ieXRlcykuZmlyc3QtPnNlY29uZC5nZXQoKSk7CisgIH0KKworICAvLy8gYWxsb2NhdGluZyBtZW1vcnkgb24gdGhlIGNwdQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgKmFsbG9jYXRlKHNpemVfdCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2MoOCk7CisgIH0KKworICAvLyBzb21lIHJ1bnRpbWUgY29uZGl0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIGhlcmUKKyAgYm9vbCBpc0RldmljZVN1aXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgOjptZW1jcHkoZHN0LCBzcmMsIG4pOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbWNweUhvc3RUb0RldmljZShUICpkc3QsIGNvbnN0IFQgKnNyYywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBhdXRvIGhvc3RfYWNjPSAoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmJ1ZmZlcjxULCAxPio+KGFkZF9zeWNsX2J1ZmZlcihkc3QsIG4pLmZpcnN0LT5zZWNvbmQuZ2V0KCkpKS0+IHRlbXBsYXRlIGdldF9hY2Nlc3M8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6ZGlzY2FyZF93cml0ZSwgY2w6OnN5Y2w6OmFjY2Vzczo6dGFyZ2V0Ojpob3N0X2J1ZmZlcj4oKTsKKyAgICBtZW1jcHkoaG9zdF9hY2MuZ2V0X3BvaW50ZXIoKSwgc3JjLCBuKTsKKyAgfQorIC8vLyB3aGl0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBzeWNsLCB0aGUgZGF0YSBpcyBjb3BpZWQgdHdpY2UgZnJvbSBkZXZpY2UgdG8gaG9zdC4gVGhpcyB3aWxsIGJlIGZpeGVkIHNvb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtZW1jcHlEZXZpY2VUb0hvc3QoVCAqZHN0LCBjb25zdCBUICpzcmMsIHNpemVfdCBuKSBjb25zdCB7CisgICAgYXV0byBpdCA9IGJ1ZmZlcl9tYXAuZmluZChzcmMpOworICAgIGlmIChpdCAhPSBidWZmZXJfbWFwLmVuZCgpKSB7CisgICAgICBhdXRvIGhvc3RfYWNjPSAoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmJ1ZmZlcjxULCAxPio+KGl0LT5zZWNvbmQuZ2V0KCkpKS0+IHRlbXBsYXRlIGdldF9hY2Nlc3M8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6cmVhZCwgY2w6OnN5Y2w6OmFjY2Vzczo6dGFyZ2V0Ojpob3N0X2J1ZmZlcj4oKTsKKyAgICAgIG1lbWNweShkc3QsaG9zdF9hY2MuZ2V0X3BvaW50ZXIoKSwgIG4pOworICAgIH0gZWxzZXsKKyAgICAgIGVpZ2VuX2Fzc2VydCgibm8gZGV2aWNlIG1lbW9yeSBmb3VuZC4gVGhlIG1lbW9yeSBtaWdodCBiZSBkZXN0cm95ZWQgYmVmb3JlIGNyZWF0aW9uIik7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbXNldCh2b2lkICpidWZmZXIsIGludCBjLCBzaXplX3QgbikgY29uc3QgeworICAgIDo6bWVtc2V0KGJ1ZmZlciwgYywgbik7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBpbnQgbWFqb3JEZXZpY2VWZXJzaW9uKCkgY29uc3QgeworICByZXR1cm4gMTsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfREVWSUNFX1NZQ0xfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VUaHJlYWRQb29sLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRldmljZVRocmVhZFBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjk2ODBhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JEZXZpY2VUaHJlYWRQb29sLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9USFJFQURTKSAmJiAhZGVmaW5lZChFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9USFJFQURfUE9PTF9IKQorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9USFJFQURfUE9PTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8vIFVzZSB0aGUgU2ltcGxlVGhyZWFkUG9vbCBieSBkZWZhdWx0LiBXZSdsbCBzd2l0Y2ggdG8gdGhlIG5ldyBub24gYmxvY2tpbmcKKy8vIHRocmVhZCBwb29sIGxhdGVyLgorI2lmbmRlZiBFSUdFTl9VU0VfU0lNUExFX1RIUkVBRF9QT09MCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW52PiB1c2luZyBUaHJlYWRQb29sVGVtcGwgPSBOb25CbG9ja2luZ1RocmVhZFBvb2xUZW1wbDxFbnY+OwordHlwZWRlZiBOb25CbG9ja2luZ1RocmVhZFBvb2wgVGhyZWFkUG9vbDsKKyNlbHNlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW52PiB1c2luZyBUaHJlYWRQb29sVGVtcGwgPSBTaW1wbGVUaHJlYWRQb29sVGVtcGw8RW52PjsKK3R5cGVkZWYgU2ltcGxlVGhyZWFkUG9vbCBUaHJlYWRQb29sOworI2VuZGlmCisKKworLy8gQmFycmllciBpcyBhbiBvYmplY3QgdGhhdCBhbGxvd3Mgb25lIG9yIG1vcmUgdGhyZWFkcyB0byB3YWl0IHVudGlsCisvLyBOb3RpZnkgaGFzIGJlZW4gY2FsbGVkIGEgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy4KK2NsYXNzIEJhcnJpZXIgeworIHB1YmxpYzoKKyAgQmFycmllcih1bnNpZ25lZCBpbnQgY291bnQpIDogc3RhdGVfKGNvdW50IDw8IDEpLCBub3RpZmllZF8oZmFsc2UpIHsKKyAgICBlaWdlbl9hc3NlcnQoKChjb3VudCA8PCAxKSA+PiAxKSA9PSBjb3VudCk7CisgIH0KKyAgfkJhcnJpZXIoKSB7CisgICAgZWlnZW5fYXNzZXJ0KChzdGF0ZV8+PjEpID09IDApOworICB9CisKKyAgdm9pZCBOb3RpZnkoKSB7CisgICAgdW5zaWduZWQgaW50IHYgPSBzdGF0ZV8uZmV0Y2hfc3ViKDIsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpIC0gMjsKKyAgICBpZiAodiAhPSAxKSB7CisgICAgICBlaWdlbl9hc3NlcnQoKCh2ICsgMikgJiB+MSkgIT0gMCk7CisgICAgICByZXR1cm47ICAvLyBlaXRoZXIgY291bnQgaGFzIG5vdCBkcm9wcGVkIHRvIDAsIG9yIHdhaXRlciBpcyBub3Qgd2FpdGluZworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGwobXVfKTsKKyAgICBlaWdlbl9hc3NlcnQoIW5vdGlmaWVkXyk7CisgICAgbm90aWZpZWRfID0gdHJ1ZTsKKyAgICBjdl8ubm90aWZ5X2FsbCgpOworICB9CisKKyAgdm9pZCBXYWl0KCkgeworICAgIHVuc2lnbmVkIGludCB2ID0gc3RhdGVfLmZldGNoX29yKDEsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAgIGlmICgodiA+PiAxKSA9PSAwKSByZXR1cm47CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsKG11Xyk7CisgICAgd2hpbGUgKCFub3RpZmllZF8pIHsKKyAgICAgIGN2Xy53YWl0KGwpOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjptdXRleCBtdV87CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2XzsKKyAgc3RkOjphdG9taWM8dW5zaWduZWQgaW50PiBzdGF0ZV87ICAvLyBsb3cgYml0IGlzIHdhaXRlciBmbGFnCisgIGJvb2wgbm90aWZpZWRfOworfTsKKworCisvLyBOb3RpZmljYXRpb24gaXMgYW4gb2JqZWN0IHRoYXQgYWxsb3dzIGEgdXNlciB0byB0byB3YWl0IGZvciBhbm90aGVyCisvLyB0aHJlYWQgdG8gc2lnbmFsIGEgbm90aWZpY2F0aW9uIHRoYXQgYW4gZXZlbnQgaGFzIG9jY3VycmVkLgorLy8KKy8vIE11bHRpcGxlIHRocmVhZHMgY2FuIHdhaXQgb24gdGhlIHNhbWUgTm90aWZpY2F0aW9uIG9iamVjdCwKKy8vIGJ1dCBvbmx5IG9uZSBjYWxsZXIgbXVzdCBjYWxsIE5vdGlmeSgpIG9uIHRoZSBvYmplY3QuCitzdHJ1Y3QgTm90aWZpY2F0aW9uIDogQmFycmllciB7CisgIE5vdGlmaWNhdGlvbigpIDogQmFycmllcigxKSB7fTsKK307CisKKworLy8gUnVucyBhbiBhcmJpdHJhcnkgZnVuY3Rpb24gYW5kIHRoZW4gY2FsbHMgTm90aWZ5KCkgb24gdGhlIHBhc3NlZCBpbgorLy8gTm90aWZpY2F0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZS4uLiBBcmdzPiBzdHJ1Y3QgRnVuY3Rpb25XcmFwcGVyV2l0aE5vdGlmaWNhdGlvbgoreworICBzdGF0aWMgdm9pZCBydW4oTm90aWZpY2F0aW9uKiBuLCBGdW5jdGlvbiBmLCBBcmdzLi4uIGFyZ3MpIHsKKyAgICBmKGFyZ3MuLi4pOworICAgIGlmIChuKSB7CisgICAgICBuLT5Ob3RpZnkoKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUuLi4gQXJncz4gc3RydWN0IEZ1bmN0aW9uV3JhcHBlcldpdGhCYXJyaWVyCit7CisgIHN0YXRpYyB2b2lkIHJ1bihCYXJyaWVyKiBiLCBGdW5jdGlvbiBmLCBBcmdzLi4uIGFyZ3MpIHsKKyAgICBmKGFyZ3MuLi4pOworICAgIGlmIChiKSB7CisgICAgICBiLT5Ob3RpZnkoKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTeW5jVHlwZT4KK3N0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgd2FpdF91bnRpbF9yZWFkeShTeW5jVHlwZSogbikgeworICBpZiAobikgeworICAgIG4tPldhaXQoKTsKKyAgfQorfQorCisKKy8vIEJ1aWxkIGEgdGhyZWFkIHBvb2wgZGV2aWNlIG9uIHRvcCB0aGUgYW4gZXhpc3RpbmcgcG9vbCBvZiB0aHJlYWRzLgorc3RydWN0IFRocmVhZFBvb2xEZXZpY2UgeworICAvLyBUaGUgb3duZXJzaGlwIG9mIHRoZSB0aHJlYWQgcG9vbCByZW1haW5zIHdpdGggdGhlIGNhbGxlci4KKyAgVGhyZWFkUG9vbERldmljZShUaHJlYWRQb29sSW50ZXJmYWNlKiBwb29sLCBpbnQgbnVtX2NvcmVzKSA6IHBvb2xfKHBvb2wpLCBudW1fdGhyZWFkc18obnVtX2NvcmVzKSB7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBudW1fYnl0ZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKG51bV9ieXRlcyk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBidWZmZXIpIGNvbnN0IHsKKyAgICBpbnRlcm5hbDo6YWxpZ25lZF9mcmVlKGJ1ZmZlcik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWVtY3B5KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbikgY29uc3QgeworICAgIDo6bWVtY3B5KGRzdCwgc3JjLCBuKTsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWVtY3B5SG9zdFRvRGV2aWNlKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbikgY29uc3QgeworICAgIG1lbWNweShkc3QsIHNyYywgbik7CisgIH0KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbWNweURldmljZVRvSG9zdCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIG4pOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1lbXNldCh2b2lkKiBidWZmZXIsIGludCBjLCBzaXplX3QgbikgY29uc3QgeworICAgIDo6bWVtc2V0KGJ1ZmZlciwgYywgbik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBudW1UaHJlYWRzKCkgY29uc3QgeworICAgIHJldHVybiBudW1fdGhyZWFkc187CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNpemVfdCBmaXJzdExldmVsQ2FjaGVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBsMUNhY2hlU2l6ZSgpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBzaXplX3QgbGFzdExldmVsQ2FjaGVTaXplKCkgY29uc3QgeworICAgIC8vIFRoZSBsMyBjYWNoZSBzaXplIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGUgY29yZXMuCisgICAgcmV0dXJuIGwzQ2FjaGVTaXplKCkgLyBudW1fdGhyZWFkc187CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBtYWpvckRldmljZVZlcnNpb24oKSBjb25zdCB7CisgICAgLy8gU2hvdWxkIHJldHVybiBhbiBlbnVtIHRoYXQgZW5jb2RlcyB0aGUgSVNBIHN1cHBvcnRlZCBieSB0aGUgQ1BVCisgICAgcmV0dXJuIDE7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgTm90aWZpY2F0aW9uKiBlbnF1ZXVlKEZ1bmN0aW9uJiYgZiwgQXJncyYmLi4uIGFyZ3MpIGNvbnN0IHsKKyAgICBOb3RpZmljYXRpb24qIG4gPSBuZXcgTm90aWZpY2F0aW9uKCk7CisgICAgcG9vbF8tPlNjaGVkdWxlKHN0ZDo6YmluZCgmRnVuY3Rpb25XcmFwcGVyV2l0aE5vdGlmaWNhdGlvbjxGdW5jdGlvbiwgQXJncy4uLj46OnJ1biwgbiwgZiwgYXJncy4uLikpOworICAgIHJldHVybiBuOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEZ1bmN0aW9uLCBjbGFzcy4uLiBBcmdzPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZW5xdWV1ZV93aXRoX2JhcnJpZXIoQmFycmllciogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uJiYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MmJi4uLiBhcmdzKSBjb25zdCB7CisgICAgcG9vbF8tPlNjaGVkdWxlKHN0ZDo6YmluZCgKKyAgICAgICAgJkZ1bmN0aW9uV3JhcHBlcldpdGhCYXJyaWVyPEZ1bmN0aW9uLCBBcmdzLi4uPjo6cnVuLCBiLCBmLCBhcmdzLi4uKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24sIGNsYXNzLi4uIEFyZ3M+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBlbnF1ZXVlTm9Ob3RpZmljYXRpb24oRnVuY3Rpb24mJiBmLCBBcmdzJiYuLi4gYXJncykgY29uc3QgeworICAgIHBvb2xfLT5TY2hlZHVsZShzdGQ6OmJpbmQoZiwgYXJncy4uLikpOworICB9CisKKyAgLy8gUmV0dXJucyBhIGxvZ2ljYWwgdGhyZWFkIGluZGV4IGJldHdlZW4gMCBhbmQgcG9vbF8tPk51bVRocmVhZHMoKSAtIDEgaWYKKyAgLy8gY2FsbGVkIGZyb20gb25lIG9mIHRoZSB0aHJlYWRzIGluIHBvb2xfLiBSZXR1cm5zIC0xIG90aGVyd2lzZS4KKyAgRUlHRU5fU1RST05HX0lOTElORSBpbnQgY3VycmVudFRocmVhZElkKCkgY29uc3QgeworICAgIHJldHVybiBwb29sXy0+Q3VycmVudFRocmVhZElkKCk7CisgIH0KKworICAvLyBwYXJhbGxlbEZvciBleGVjdXRlcyBmIHdpdGggWzAsIG4pIGFyZ3VtZW50cyBpbiBwYXJhbGxlbCBhbmQgd2FpdHMgZm9yCisgIC8vIGNvbXBsZXRpb24uIEYgYWNjZXB0cyBhIGhhbGYtb3BlbiBpbnRlcnZhbCBbZmlyc3QsIGxhc3QpLgorICAvLyBCbG9jayBzaXplIGlzIGNob29zZW4gYmFzZWQgb24gdGhlIGl0ZXJhdGlvbiBjb3N0IGFuZCByZXN1bHRpbmcgcGFyYWxsZWwKKyAgLy8gZWZmaWNpZW5jeS4gSWYgYmxvY2tfYWxpZ24gaXMgbm90IG51bGxwdHIsIGl0IGlzIGNhbGxlZCB0byByb3VuZCB1cCB0aGUKKyAgLy8gYmxvY2sgc2l6ZS4KKyAgdm9pZCBwYXJhbGxlbEZvcihJbmRleCBuLCBjb25zdCBUZW5zb3JPcENvc3QmIGNvc3QsCisgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxJbmRleChJbmRleCk+IGJsb2NrX2FsaWduLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChJbmRleCwgSW5kZXgpPiBmKSBjb25zdCB7CisgICAgdHlwZWRlZiBUZW5zb3JDb3N0TW9kZWw8VGhyZWFkUG9vbERldmljZT4gQ29zdE1vZGVsOworICAgIGlmIChuIDw9IDEgfHwgbnVtVGhyZWFkcygpID09IDEgfHwKKyAgICAgICAgQ29zdE1vZGVsOjpudW1UaHJlYWRzKG4sIGNvc3QsIHN0YXRpY19jYXN0PGludD4obnVtVGhyZWFkcygpKSkgPT0gMSkgeworICAgICAgZigwLCBuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgYmxvY2sgc2l6ZSBiYXNlZCBvbiAoMSkgdGhlIGl0ZXJhdGlvbiBjb3N0IGFuZCAoMikgcGFyYWxsZWwKKyAgICAvLyBlZmZpY2llbmN5LiBXZSB3YW50IGJsb2NrcyB0byBiZSBub3QgdG9vIHNtYWxsIHRvIG1pdGlnYXRlCisgICAgLy8gcGFyYWxsZWxpemF0aW9uIG92ZXJoZWFkczsgbm90IHRvbyBsYXJnZSB0byBtaXRpZ2F0ZSB0YWlsCisgICAgLy8gZWZmZWN0IGFuZCBwb3RlbnRpYWwgbG9hZCBpbWJhbGFuY2UgYW5kIHdlIGFsc28gd2FudCBudW1iZXIKKyAgICAvLyBvZiBibG9ja3MgdG8gYmUgZXZlbmx5IGRpdmlkYWJsZSBhY3Jvc3MgdGhyZWFkcy4KKworICAgIGRvdWJsZSBibG9ja19zaXplX2YgPSAxLjAgLyBDb3N0TW9kZWw6OnRhc2tTaXplKDEsIGNvc3QpOworICAgIEluZGV4IGJsb2NrX3NpemUgPSBudW1leHQ6Om1pbmkobiwgbnVtZXh0OjptYXhpPEluZGV4PigxLCBibG9ja19zaXplX2YpKTsKKyAgICBjb25zdCBJbmRleCBtYXhfYmxvY2tfc2l6ZSA9CisgICAgICAgIG51bWV4dDo6bWluaShuLCBudW1leHQ6Om1heGk8SW5kZXg+KDEsIDIgKiBibG9ja19zaXplX2YpKTsKKyAgICBpZiAoYmxvY2tfYWxpZ24pIHsKKyAgICAgIEluZGV4IG5ld19ibG9ja19zaXplID0gYmxvY2tfYWxpZ24oYmxvY2tfc2l6ZSk7CisgICAgICBlaWdlbl9hc3NlcnQobmV3X2Jsb2NrX3NpemUgPj0gYmxvY2tfc2l6ZSk7CisgICAgICBibG9ja19zaXplID0gbnVtZXh0OjptaW5pKG4sIG5ld19ibG9ja19zaXplKTsKKyAgICB9CisgICAgSW5kZXggYmxvY2tfY291bnQgPSBkaXZ1cChuLCBibG9ja19zaXplKTsKKyAgICAvLyBDYWxjdWxhdGUgcGFyYWxsZWwgZWZmaWNpZW5jeSBhcyBmcmFjdGlvbiBvZiB0b3RhbCBDUFUgdGltZSB1c2VkIGZvcgorICAgIC8vIGNvbXB1dGF0aW9uczoKKyAgICBkb3VibGUgbWF4X2VmZmljaWVuY3kgPQorICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGJsb2NrX2NvdW50KSAvCisgICAgICAgIChkaXZ1cDxpbnQ+KGJsb2NrX2NvdW50LCBudW1UaHJlYWRzKCkpICogbnVtVGhyZWFkcygpKTsKKyAgICAvLyBOb3cgdHJ5IHRvIGluY3JlYXNlIGJsb2NrIHNpemUgdXAgdG8gbWF4X2Jsb2NrX3NpemUgYXMgbG9uZyBhcyBpdAorICAgIC8vIGRvZXNuJ3QgZGVjcmVhc2UgcGFyYWxsZWwgZWZmaWNpZW5jeS4KKyAgICBmb3IgKEluZGV4IHByZXZfYmxvY2tfY291bnQgPSBibG9ja19jb3VudDsgcHJldl9ibG9ja19jb3VudCA+IDE7KSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBuZXh0IGJsb2NrIHNpemUgdGhhdCBkaXZpZGVzIHNpemUgaW50byBhIHNtYWxsZXIgbnVtYmVyCisgICAgICAvLyBvZiBibG9ja3MgdGhhbiB0aGUgY3VycmVudCBibG9ja19zaXplLgorICAgICAgSW5kZXggY29hcnNlcl9ibG9ja19zaXplID0gZGl2dXAobiwgcHJldl9ibG9ja19jb3VudCAtIDEpOworICAgICAgaWYgKGJsb2NrX2FsaWduKSB7CisgICAgICAgIEluZGV4IG5ld19ibG9ja19zaXplID0gYmxvY2tfYWxpZ24oY29hcnNlcl9ibG9ja19zaXplKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG5ld19ibG9ja19zaXplID49IGNvYXJzZXJfYmxvY2tfc2l6ZSk7CisgICAgICAgIGNvYXJzZXJfYmxvY2tfc2l6ZSA9IG51bWV4dDo6bWluaShuLCBuZXdfYmxvY2tfc2l6ZSk7CisgICAgICB9CisgICAgICBpZiAoY29hcnNlcl9ibG9ja19zaXplID4gbWF4X2Jsb2NrX3NpemUpIHsKKyAgICAgICAgYnJlYWs7ICAvLyBSZWFjaGVkIG1heCBibG9jayBzaXplLiBTdG9wLgorICAgICAgfQorICAgICAgLy8gUmVjYWxjdWxhdGUgcGFyYWxsZWwgZWZmaWNpZW5jeS4KKyAgICAgIGNvbnN0IEluZGV4IGNvYXJzZXJfYmxvY2tfY291bnQgPSBkaXZ1cChuLCBjb2Fyc2VyX2Jsb2NrX3NpemUpOworICAgICAgZWlnZW5fYXNzZXJ0KGNvYXJzZXJfYmxvY2tfY291bnQgPCBwcmV2X2Jsb2NrX2NvdW50KTsKKyAgICAgIHByZXZfYmxvY2tfY291bnQgPSBjb2Fyc2VyX2Jsb2NrX2NvdW50OworICAgICAgY29uc3QgZG91YmxlIGNvYXJzZXJfZWZmaWNpZW5jeSA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihjb2Fyc2VyX2Jsb2NrX2NvdW50KSAvCisgICAgICAgICAgKGRpdnVwPGludD4oY29hcnNlcl9ibG9ja19jb3VudCwgbnVtVGhyZWFkcygpKSAqIG51bVRocmVhZHMoKSk7CisgICAgICBpZiAoY29hcnNlcl9lZmZpY2llbmN5ICsgMC4wMSA+PSBtYXhfZWZmaWNpZW5jeSkgeworICAgICAgICAvLyBUYWtpbmcgaXQuCisgICAgICAgIGJsb2NrX3NpemUgPSBjb2Fyc2VyX2Jsb2NrX3NpemU7CisgICAgICAgIGJsb2NrX2NvdW50ID0gY29hcnNlcl9ibG9ja19jb3VudDsKKyAgICAgICAgaWYgKG1heF9lZmZpY2llbmN5IDwgY29hcnNlcl9lZmZpY2llbmN5KSB7CisgICAgICAgICAgbWF4X2VmZmljaWVuY3kgPSBjb2Fyc2VyX2VmZmljaWVuY3k7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWN1cnNpdmVseSBkaXZpZGUgc2l6ZSBpbnRvIGhhbHZlcyB1bnRpbCB3ZSByZWFjaCBibG9ja19zaXplLgorICAgIC8vIERpdmlzaW9uIGNvZGUgcm91bmRzIG1pZCB0byBibG9ja19zaXplLCBzbyB3ZSBhcmUgZ3VhcmFudGVlZCB0byBnZXQKKyAgICAvLyBibG9ja19jb3VudCBsZWF2ZXMgdGhhdCBkbyBhY3R1YWwgY29tcHV0YXRpb25zLgorICAgIEJhcnJpZXIgYmFycmllcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGJsb2NrX2NvdW50KSk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEluZGV4LCBJbmRleCk+IGhhbmRsZVJhbmdlOworICAgIGhhbmRsZVJhbmdlID0gWz0sICZoYW5kbGVSYW5nZSwgJmJhcnJpZXIsICZmXShJbmRleCBmaXJzdCwgSW5kZXggbGFzdCkgeworICAgICAgaWYgKGxhc3QgLSBmaXJzdCA8PSBibG9ja19zaXplKSB7CisgICAgICAgIC8vIFNpbmdsZSBibG9jayBvciBsZXNzLCBleGVjdXRlIGRpcmVjdGx5LgorICAgICAgICBmKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgYmFycmllci5Ob3RpZnkoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gU3BsaXQgaW50byBoYWx2ZXMgYW5kIHN1Ym1pdCB0byB0aGUgcG9vbC4KKyAgICAgIEluZGV4IG1pZCA9IGZpcnN0ICsgZGl2dXAoKGxhc3QgLSBmaXJzdCkgLyAyLCBibG9ja19zaXplKSAqIGJsb2NrX3NpemU7CisgICAgICBwb29sXy0+U2NoZWR1bGUoWz0sICZoYW5kbGVSYW5nZV0oKSB7IGhhbmRsZVJhbmdlKG1pZCwgbGFzdCk7IH0pOworICAgICAgcG9vbF8tPlNjaGVkdWxlKFs9LCAmaGFuZGxlUmFuZ2VdKCkgeyBoYW5kbGVSYW5nZShmaXJzdCwgbWlkKTsgfSk7CisgICAgfTsKKyAgICBoYW5kbGVSYW5nZSgwLCBuKTsKKyAgICBiYXJyaWVyLldhaXQoKTsKKyAgfQorCisgIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIHBhcmFsbGVsRm9yIHRoYXQgZG9lcyBub3QgYWxpZ24gYmxvY2tzLgorICB2b2lkIHBhcmFsbGVsRm9yKEluZGV4IG4sIGNvbnN0IFRlbnNvck9wQ29zdCYgY29zdCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoSW5kZXgsIEluZGV4KT4gZikgY29uc3QgeworICAgIHBhcmFsbGVsRm9yKG4sIGNvc3QsIG51bGxwdHIsIHN0ZDo6bW92ZShmKSk7CisgIH0KKworIHByaXZhdGU6CisgIFRocmVhZFBvb2xJbnRlcmZhY2UqIHBvb2xfOworICBpbnQgbnVtX3RocmVhZHNfOworfTsKKworCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RFVklDRV9USFJFQURfUE9PTF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRpbWVuc2lvbkxpc3QuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGltZW5zaW9uTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzBlNDUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRpbWVuc2lvbkxpc3QuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RJTUVOU0lPTl9MSVNUX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9ESU1FTlNJT05fTElTVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBUZW5zb3JEaW1lbnNpb25MaXN0CisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFNwZWNpYWwgY2FzZSBvZiB0ZW5zb3IgaW5kZXggbGlzdCB1c2VkIHRvIGxpc3QgYWxsIHRoZSBkaW1lbnNpb25zIG9mIGEgdGVuc29yIG9mIHJhbmsgbi4KKyAgKgorICAqIFxzYSBUZW5zb3IKKyAgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPiBzdHJ1Y3QgRGltZW5zaW9uTGlzdCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKKyAgY29uc3QgSW5kZXggb3BlcmF0b3JbXSAoY29uc3QgSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaTsgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+IHN0cnVjdCBhcnJheV9zaXplPERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gUmFuazsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4gc3RydWN0IGFycmF5X3NpemU8Y29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBSYW5rOworfTsKKwordGVtcGxhdGU8RGVuc2VJbmRleCBuLCB0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4gY29uc3QgSW5kZXggYXJyYXlfZ2V0KERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+JikgeworICByZXR1cm4gbjsKK30KK3RlbXBsYXRlPERlbnNlSW5kZXggbiwgdHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+IGNvbnN0IEluZGV4IGFycmF5X2dldChjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiYpIHsKKyAgcmV0dXJuIG47Cit9CisKKworI2lmIEVJR0VOX0hBU19DT05TVEVYUFIKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBpbmRleF9rbm93bl9zdGF0aWNhbGx5X2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCkgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X2tub3duX3N0YXRpY2FsbHlfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBhbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5X2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgYWxsX2luZGljZXNfa25vd25fc3RhdGljYWxseV9pbXBsPGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlX2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlX2ltcGw8Y29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2VxX2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIGkgPT0gdmFsdWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9lcV9pbXBsPGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBpID09IHZhbHVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9uZV9pbXBsPERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBpICE9IHZhbHVlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfbmVfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IERlbnNlSW5kZXggdmFsdWUpIHsKKyAgICByZXR1cm4gaSAhPSB2YWx1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZ3RfaW1wbDxEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IERlbnNlSW5kZXggdmFsdWUpIHsKKyAgICByZXR1cm4gaSA+IHZhbHVlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZ3RfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IERlbnNlSW5kZXggdmFsdWUpIHsKKyAgICByZXR1cm4gaSA+IHZhbHVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9sdF9pbXBsPERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBpIDwgdmFsdWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9sdF9pbXBsPGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBpIDwgdmFsdWU7CisgIH0KK307CisKKyNlbHNlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfa25vd25fc3RhdGljYWxseV9pbXBsPERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfa25vd25fc3RhdGljYWxseV9pbXBsPGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBhbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5X2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2wgcnVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGFsbF9pbmRpY2VzX2tub3duX3N0YXRpY2FsbHlfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBpbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2VfaW1wbDxEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlX2ltcGw8Y29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2wgcnVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9lcV9pbXBsPERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4LCBjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZXFfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfbmVfaW1wbDxEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCl7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfbmVfaW1wbDxjb25zdCBEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBSYW5rPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZ3RfaW1wbDxEaW1lbnNpb25MaXN0PEluZGV4LCBSYW5rPiA+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2d0X2ltcGw8Y29uc3QgRGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgUmFuaz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2x0X2ltcGw8RGltZW5zaW9uTGlzdDxJbmRleCwgUmFuaz4gPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IFJhbms+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9sdF9pbXBsPGNvbnN0IERpbWVuc2lvbkxpc3Q8SW5kZXgsIFJhbms+ID4geworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4LCBjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworI2VuZGlmCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9ESU1FTlNJT05fTElTVF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRpbWVuc2lvbnMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRGltZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGNkZWIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckRpbWVuc2lvbnMuaApAQCAtMCwwICsxLDQyOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RJTUVOU0lPTlNfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0RJTUVOU0lPTlNfSAorCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBUZW5zb3JEaW1lbnNpb25zCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFNldCBvZiBjbGFzc2VzIHVzZWQgdG8gZW5jb2RlIGFuZCBzdG9yZSB0aGUgZGltZW5zaW9ucyBvZiBhIFRlbnNvci4KKyAgKgorICAqIFRoZSBTaXplcyBjbGFzcyBlbmNvZGVzIGFzIHBhcnQgb2YgdGhlIHR5cGUgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGFuZCB0aGUKKyAgKiBzaXplcyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGltZW5zaW9uLiBJdCB1c2VzIG5vIHN0b3JhZ2Ugc3BhY2Ugc2luY2UgaXQgaXMKKyAgKiBlbnRpcmVseSBrbm93biBhdCBjb21waWxlIHRpbWUuCisgICogVGhlIERTaXplcyBjbGFzcyBpcyBpdHMgZHluYW1pYyBzaWJsaW5nOiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMga25vd24KKyAgKiBhdCBjb21waWxlIHRpbWUgYnV0IHRoZSBzaXplcyBhcmUgc2V0IGR1cmluZyBleGVjdXRpb24uCisgICoKKyAgKiBcc2EgVGVuc29yCisgICovCisKKy8vIEJvaWxlcnBsYXRlIGNvZGUKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IG4sIHR5cGVuYW1lIERpbWVuc2lvbj4gc3RydWN0IGRnZXQgeworICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgdmFsdWUgPSBnZXQ8biwgRGltZW5zaW9uPjo6dmFsdWU7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCBzdGQ6OnNpemVfdCBuLCBib29sIFJvd01ham9yPgorc3RydWN0IGZpeGVkX3NpemVfdGVuc29yX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyCit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1lbnNpb25zPiBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIEluZGV4IHJ1bihhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4gY29uc3QmIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMpCisgIHsKKyAgICByZXR1cm4gYXJyYXlfZ2V0PFJvd01ham9yID8gbiAtIDEgOiAoTnVtSW5kaWNlcyAtIG4pPihpbmRpY2VzKSArCisgICAgICAgIGRnZXQ8Um93TWFqb3IgPyBuIC0gMSA6IChOdW1JbmRpY2VzIC0gbiksIERpbWVuc2lvbnM+Ojp2YWx1ZSAqCisgICAgICAgIGZpeGVkX3NpemVfdGVuc29yX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyPEluZGV4LCBOdW1JbmRpY2VzLCBuIC0gMSwgUm93TWFqb3I+OjpydW4oaW5kaWNlcywgZGltZW5zaW9ucyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCBib29sIFJvd01ham9yPgorc3RydWN0IGZpeGVkX3NpemVfdGVuc29yX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyPEluZGV4LCBOdW1JbmRpY2VzLCAwLCBSb3dNYWpvcj4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgSW5kZXggcnVuKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiBjb25zdCYsIGNvbnN0IERpbWVuc2lvbnMmKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBuPgorc3RydWN0IGZpeGVkX3NpemVfdGVuc29yX2luZGV4X2V4dHJhY3Rpb25faGVscGVyCit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1lbnNpb25zPiBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIEluZGV4IHJ1bihjb25zdCBJbmRleCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucykKKyAgeworICAgIGNvbnN0IEluZGV4IG11bHQgPSAoaW5kZXggPT0gbi0xKSA/IDEgOiAwOworICAgIHJldHVybiBhcnJheV9nZXQ8bi0xPihkaW1lbnNpb25zKSAqIG11bHQgKworICAgICAgICBmaXhlZF9zaXplX3RlbnNvcl9pbmRleF9leHRyYWN0aW9uX2hlbHBlcjxJbmRleCwgbiAtIDE+OjpydW4oaW5kZXgsIGRpbWVuc2lvbnMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KK3N0cnVjdCBmaXhlZF9zaXplX3RlbnNvcl9pbmRleF9leHRyYWN0aW9uX2hlbHBlcjxJbmRleCwgMD4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERpbWVuc2lvbnM+IEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBpbmxpbmUgSW5kZXggcnVuKGNvbnN0IEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaW1lbnNpb25zJikKKyAgeworICAgIHJldHVybiAwOworICB9CisgIH07CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvLyBGaXhlZCBzaXplCisjaWZuZGVmIEVJR0VOX0VNVUxBVEVfQ1hYMTFfTUVUQV9ICit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3RkOjpwdHJkaWZmX3QuLi4gSW5kaWNlcz4KK3N0cnVjdCBTaXplcyA6IGludGVybmFsOjpudW1lcmljX2xpc3Q8c3RkOjpwdHJkaWZmX3QsIEluZGljZXMuLi4+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6bnVtZXJpY19saXN0PHN0ZDo6cHRyZGlmZl90LCBJbmRpY2VzLi4uPiBCYXNlOworICBzdGF0aWMgY29uc3Qgc3RkOjpwdHJkaWZmX3QgdG90YWxfc2l6ZSA9IGludGVybmFsOjphcmdfcHJvZChJbmRpY2VzLi4uKTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6cHRyZGlmZl90IHJhbmsoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2U6OmNvdW50OworICB9CisKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpwdHJkaWZmX3QgVG90YWxTaXplKCkgeworICAgIHJldHVybiBpbnRlcm5hbDo6YXJnX3Byb2QoSW5kaWNlcy4uLik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTaXplcygpIHsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVuc2VJbmRleD4KKyAgZXhwbGljaXQgRUlHRU5fREVWSUNFX0ZVTkMgU2l6ZXMoY29uc3QgYXJyYXk8RGVuc2VJbmRleCwgQmFzZTo6Y291bnQ+JiAvKmluZGljZXMqLykgeworICAgIC8vIHRvZG86IGFkZCBhc3NlcnRpb24KKyAgfQorI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIERlbnNlSW5kZXg+IEVJR0VOX0RFVklDRV9GVU5DIFNpemVzKERlbnNlSW5kZXguLi4pIHsgfQorICBleHBsaWNpdCBFSUdFTl9ERVZJQ0VfRlVOQyBTaXplcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwdHJkaWZmX3Q+IC8qbCovKSB7CisgICAgLy8gdG9kbzogYWRkIGFzc2VydGlvbgorICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gU2l6ZXMmIG9wZXJhdG9yID0gKGNvbnN0IFQmIC8qb3RoZXIqLykgeworICAgIC8vIGFkZCBhc3NlcnRpb24gZmFpbHVyZSBpZiB0aGUgc2l6ZSBvZiBvdGhlciBpcyBkaWZmZXJlbnQKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6cHRyZGlmZl90IG9wZXJhdG9yW10gKGNvbnN0IHN0ZDo6c2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpmaXhlZF9zaXplX3RlbnNvcl9pbmRleF9leHRyYWN0aW9uX2hlbHBlcjxzdGQ6OnB0cmRpZmZfdCwgQmFzZTo6Y291bnQ+OjpydW4oaW5kZXgsICp0aGlzKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZW5zZUluZGV4PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHNpemVfdCBJbmRleE9mQ29sTWFqb3IoY29uc3QgYXJyYXk8RGVuc2VJbmRleCwgQmFzZTo6Y291bnQ+JiBpbmRpY2VzKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpmaXhlZF9zaXplX3RlbnNvcl9pbmRleF9saW5lYXJpemF0aW9uX2hlbHBlcjxEZW5zZUluZGV4LCBCYXNlOjpjb3VudCwgQmFzZTo6Y291bnQsIGZhbHNlPjo6cnVuKGluZGljZXMsICpzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcykpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZW5zZUluZGV4PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHNpemVfdCBJbmRleE9mUm93TWFqb3IoY29uc3QgYXJyYXk8RGVuc2VJbmRleCwgQmFzZTo6Y291bnQ+JiBpbmRpY2VzKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpmaXhlZF9zaXplX3RlbnNvcl9pbmRleF9saW5lYXJpemF0aW9uX2hlbHBlcjxEZW5zZUluZGV4LCBCYXNlOjpjb3VudCwgQmFzZTo6Y291bnQsIHRydWU+OjpydW4oaW5kaWNlcywgKnN0YXRpY19jYXN0PGNvbnN0IEJhc2UqPih0aGlzKSk7CisgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3RkOjpwdHJkaWZmX3QuLi4gSW5kaWNlcz4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpwdHJkaWZmX3QgYXJyYXlfcHJvZChjb25zdCBTaXplczxJbmRpY2VzLi4uPiYpIHsKKyAgcmV0dXJuIFNpemVzPEluZGljZXMuLi4+Ojp0b3RhbF9zaXplOworfQorfQorCisjZWxzZQorCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3Qgbj4KK3N0cnVjdCBub25femVyb19zaXplIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6dHlwZTJ2YWw8c3RkOjpzaXplX3QsIG4+IHR5cGU7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBub25femVyb19zaXplPDA+IHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6bnVsbF90eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgVjE9MCwgc3RkOjpzaXplX3QgVjI9MCwgc3RkOjpzaXplX3QgVjM9MCwgc3RkOjpzaXplX3QgVjQ9MCwgc3RkOjpzaXplX3QgVjU9MD4gc3RydWN0IFNpemVzIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bWFrZV90eXBlX2xpc3Q8dHlwZW5hbWUgbm9uX3plcm9fc2l6ZTxWMT46OnR5cGUsIHR5cGVuYW1lIG5vbl96ZXJvX3NpemU8VjI+Ojp0eXBlLCB0eXBlbmFtZSBub25femVyb19zaXplPFYzPjo6dHlwZSwgdHlwZW5hbWUgbm9uX3plcm9fc2l6ZTxWND46OnR5cGUsIHR5cGVuYW1lIG5vbl96ZXJvX3NpemU8VjU+Ojp0eXBlID46OnR5cGUgQmFzZTsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBjb3VudCA9IEJhc2U6OmNvdW50OworICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgdG90YWxfc2l6ZSA9IGludGVybmFsOjphcmdfcHJvZDxCYXNlPjo6dmFsdWU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzaXplX3QgcmFuaygpIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnQ7CisgIH0KKworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzaXplX3QgVG90YWxTaXplKCkgeworICAgIHJldHVybiBpbnRlcm5hbDo6YXJnX3Byb2Q8QmFzZT46OnZhbHVlOworICB9CisKKyAgU2l6ZXMoKSB7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlbnNlSW5kZXg+CisgIGV4cGxpY2l0IFNpemVzKGNvbnN0IGFycmF5PERlbnNlSW5kZXgsIEJhc2U6OmNvdW50PiYgLyppbmRpY2VzKi8pIHsKKyAgICAvLyB0b2RvOiBhZGQgYXNzZXJ0aW9uCisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFNpemVzJiBvcGVyYXRvciA9IChjb25zdCBUJiAvKm90aGVyKi8pIHsKKyAgICAvLyBhZGQgYXNzZXJ0aW9uIGZhaWx1cmUgaWYgdGhlIHNpemUgb2Ygb3RoZXIgaXMgZGlmZmVyZW50CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBEZW5zZUluZGV4PiBTaXplcyhEZW5zZUluZGV4Li4uIC8qaW5kaWNlcyovKSB7IH0KKyAgZXhwbGljaXQgU2l6ZXMoc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c2l6ZV90PikgeworICAgIC8vIHRvZG86IGFkZCBhc3NlcnRpb24KKyAgfQorI2Vsc2UKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgU2l6ZXMoY29uc3QgRGVuc2VJbmRleCkgeworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIFNpemVzKGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgpIHsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBTaXplcyhjb25zdCBEZW5zZUluZGV4LCBjb25zdCBEZW5zZUluZGV4LCBjb25zdCBEZW5zZUluZGV4KSB7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2l6ZXMoY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCwgY29uc3QgRGVuc2VJbmRleCkgeworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIFNpemVzKGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgsIGNvbnN0IERlbnNlSW5kZXgpIHsKKyAgfQorI2VuZGlmCisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZW5zZUluZGV4IG9wZXJhdG9yW10gKGNvbnN0IGludCBpbmRleCkgY29uc3QgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGludGVybmFsOjpnZXQ8MCwgQmFzZT46OnZhbHVlOworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gaW50ZXJuYWw6OmdldDwxLCBCYXNlPjo6dmFsdWU7CisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBpbnRlcm5hbDo6Z2V0PDIsIEJhc2U+Ojp2YWx1ZTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIGludGVybmFsOjpnZXQ8MywgQmFzZT46OnZhbHVlOworICAgICAgY2FzZSA0OgorICAgICAgICByZXR1cm4gaW50ZXJuYWw6OmdldDw0LCBCYXNlPjo6dmFsdWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgImluZGV4IG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZW5zZUluZGV4PigtMSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlbnNlSW5kZXg+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgc2l6ZV90IEluZGV4T2ZDb2xNYWpvcihjb25zdCBhcnJheTxEZW5zZUluZGV4LCBCYXNlOjpjb3VudD4mIGluZGljZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OmZpeGVkX3NpemVfdGVuc29yX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyPERlbnNlSW5kZXgsIEJhc2U6OmNvdW50LCBCYXNlOjpjb3VudCwgZmFsc2U+OjpydW4oaW5kaWNlcywgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQmFzZSo+KHRoaXMpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVuc2VJbmRleD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBzaXplX3QgSW5kZXhPZlJvd01ham9yKGNvbnN0IGFycmF5PERlbnNlSW5kZXgsIEJhc2U6OmNvdW50PiYgaW5kaWNlcykgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6Zml4ZWRfc2l6ZV90ZW5zb3JfaW5kZXhfbGluZWFyaXphdGlvbl9oZWxwZXI8RGVuc2VJbmRleCwgQmFzZTo6Y291bnQsIEJhc2U6OmNvdW50LCB0cnVlPjo6cnVuKGluZGljZXMsICpyZWludGVycHJldF9jYXN0PGNvbnN0IEJhc2UqPih0aGlzKSk7CisgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgVjEsIHN0ZDo6c2l6ZV90IFYyLCBzdGQ6OnNpemVfdCBWMywgc3RkOjpzaXplX3QgVjQsIHN0ZDo6c2l6ZV90IFY1PgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OnNpemVfdCBhcnJheV9wcm9kKGNvbnN0IFNpemVzPFYxLCBWMiwgVjMsIFY0LCBWNT4mKSB7CisgIHJldHVybiBTaXplczxWMSwgVjIsIFYzLCBWNCwgVjU+Ojp0b3RhbF9zaXplOworfQorfQorCisjZW5kaWYKKworLy8gQm9pbGVycGxhdGUKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgTnVtSW5kaWNlcywgc3RkOjpzaXplX3QgbiwgYm9vbCBSb3dNYWpvcj4KK3N0cnVjdCB0ZW5zb3JfaW5kZXhfbGluZWFyaXphdGlvbl9oZWxwZXIKK3sKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgSW5kZXggcnVuKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiBjb25zdCYgaW5kaWNlcywgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGNvbnN0JiBkaW1lbnNpb25zKQorICB7CisgICAgcmV0dXJuIGFycmF5X2dldDxSb3dNYWpvciA/IG4gOiAoTnVtSW5kaWNlcyAtIG4gLSAxKT4oaW5kaWNlcykgKworICAgICAgYXJyYXlfZ2V0PFJvd01ham9yID8gbiA6IChOdW1JbmRpY2VzIC0gbiAtIDEpPihkaW1lbnNpb25zKSAqCisgICAgICAgIHRlbnNvcl9pbmRleF9saW5lYXJpemF0aW9uX2hlbHBlcjxJbmRleCwgTnVtSW5kaWNlcywgbiAtIDEsIFJvd01ham9yPjo6cnVuKGluZGljZXMsIGRpbWVuc2lvbnMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgTnVtSW5kaWNlcywgYm9vbCBSb3dNYWpvcj4KK3N0cnVjdCB0ZW5zb3JfaW5kZXhfbGluZWFyaXphdGlvbl9oZWxwZXI8SW5kZXgsIE51bUluZGljZXMsIDAsIFJvd01ham9yPgoreworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBJbmRleCBydW4oYXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGNvbnN0JiBpbmRpY2VzLCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4gY29uc3QmKQorICB7CisgICAgcmV0dXJuIGFycmF5X2dldDxSb3dNYWpvciA/IDAgOiBOdW1JbmRpY2VzIC0gMT4oaW5kaWNlcyk7CisgIH0KK307Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCisvLyBEeW5hbWljIHNpemUKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZW5zZUluZGV4LCBpbnQgTnVtRGltcz4KK3N0cnVjdCBEU2l6ZXMgOiBhcnJheTxEZW5zZUluZGV4LCBOdW1EaW1zPiB7CisgIHR5cGVkZWYgYXJyYXk8RGVuc2VJbmRleCwgTnVtRGltcz4gQmFzZTsKKyAgc3RhdGljIGNvbnN0IGludCBjb3VudCA9IE51bURpbXM7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzaXplX3QgcmFuaygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtRGltczsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVuc2VJbmRleCBUb3RhbFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIChOdW1EaW1zID09IDApID8gMSA6IGludGVybmFsOjphcnJheV9wcm9kKCpzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcykpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEU2l6ZXMoKSB7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAoKnRoaXMpW2ldID0gMDsKKyAgICB9CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgRFNpemVzKGNvbnN0IGFycmF5PERlbnNlSW5kZXgsIE51bURpbXM+JiBhKSA6IEJhc2UoYSkgeyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgZXhwbGljaXQgRFNpemVzKGNvbnN0IERlbnNlSW5kZXggaTApIHsKKyAgICBlaWdlbl9hc3NlcnQoTnVtRGltcyA9PSAxKTsKKyAgICAoKnRoaXMpWzBdID0gaTA7CisgIH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBEU2l6ZXMoRGVuc2VJbmRleCBmaXJzdERpbWVuc2lvbiwgRGVuc2VJbmRleCBzZWNvbmREaW1lbnNpb24sIEluZGV4VHlwZXMuLi4gb3RoZXJEaW1lbnNpb25zKSA6IEJhc2Uoe3tmaXJzdERpbWVuc2lvbiwgc2Vjb25kRGltZW5zaW9uLCBvdGhlckRpbWVuc2lvbnMuLi59fSkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mLi4uKG90aGVyRGltZW5zaW9ucykgKyAyID09IE51bURpbXMsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgfQorI2Vsc2UKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRFNpemVzKGNvbnN0IERlbnNlSW5kZXggaTAsIGNvbnN0IERlbnNlSW5kZXggaTEpIHsKKyAgICBlaWdlbl9hc3NlcnQoTnVtRGltcyA9PSAyKTsKKyAgICAoKnRoaXMpWzBdID0gaTA7CisgICAgKCp0aGlzKVsxXSA9IGkxOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIERTaXplcyhjb25zdCBEZW5zZUluZGV4IGkwLCBjb25zdCBEZW5zZUluZGV4IGkxLCBjb25zdCBEZW5zZUluZGV4IGkyKSB7CisgICAgZWlnZW5fYXNzZXJ0KE51bURpbXMgPT0gMyk7CisgICAgKCp0aGlzKVswXSA9IGkwOworICAgICgqdGhpcylbMV0gPSBpMTsKKyAgICAoKnRoaXMpWzJdID0gaTI7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRFNpemVzKGNvbnN0IERlbnNlSW5kZXggaTAsIGNvbnN0IERlbnNlSW5kZXggaTEsIGNvbnN0IERlbnNlSW5kZXggaTIsIGNvbnN0IERlbnNlSW5kZXggaTMpIHsKKyAgICBlaWdlbl9hc3NlcnQoTnVtRGltcyA9PSA0KTsKKyAgICAoKnRoaXMpWzBdID0gaTA7CisgICAgKCp0aGlzKVsxXSA9IGkxOworICAgICgqdGhpcylbMl0gPSBpMjsKKyAgICAoKnRoaXMpWzNdID0gaTM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRFNpemVzKGNvbnN0IERlbnNlSW5kZXggaTAsIGNvbnN0IERlbnNlSW5kZXggaTEsIGNvbnN0IERlbnNlSW5kZXggaTIsIGNvbnN0IERlbnNlSW5kZXggaTMsIGNvbnN0IERlbnNlSW5kZXggaTQpIHsKKyAgICBlaWdlbl9hc3NlcnQoTnVtRGltcyA9PSA1KTsKKyAgICAoKnRoaXMpWzBdID0gaTA7CisgICAgKCp0aGlzKVsxXSA9IGkxOworICAgICgqdGhpcylbMl0gPSBpMjsKKyAgICAoKnRoaXMpWzNdID0gaTM7CisgICAgKCp0aGlzKVs0XSA9IGk0OworICB9CisjZW5kaWYKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBEU2l6ZXMmIG9wZXJhdG9yID0gKGNvbnN0IGFycmF5PERlbnNlSW5kZXgsIE51bURpbXM+JiBvdGhlcikgeworICAgICpzdGF0aWNfY2FzdDxCYXNlKj4odGhpcykgPSBvdGhlcjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBIGNvbnN0ZXhwciB3b3VsZCBiZSBzbyBtdWNoIGJldHRlciBoZXJlCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVuc2VJbmRleCBJbmRleE9mQ29sTWFqb3IoY29uc3QgYXJyYXk8RGVuc2VJbmRleCwgTnVtRGltcz4mIGluZGljZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnRlbnNvcl9pbmRleF9saW5lYXJpemF0aW9uX2hlbHBlcjxEZW5zZUluZGV4LCBOdW1EaW1zLCBOdW1EaW1zIC0gMSwgZmFsc2U+OjpydW4oaW5kaWNlcywgKnN0YXRpY19jYXN0PGNvbnN0IEJhc2UqPih0aGlzKSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBEZW5zZUluZGV4IEluZGV4T2ZSb3dNYWpvcihjb25zdCBhcnJheTxEZW5zZUluZGV4LCBOdW1EaW1zPiYgaW5kaWNlcykgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6dGVuc29yX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyPERlbnNlSW5kZXgsIE51bURpbXMsIE51bURpbXMgLSAxLCB0cnVlPjo6cnVuKGluZGljZXMsICpzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcykpOworICB9Cit9OworCisKKworCisvLyBCb2lsZXJwbGF0ZQorbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCBzdGQ6OnNpemVfdCBuLCBib29sIFJvd01ham9yPgorc3RydWN0IHRlbnNvcl92c2l6ZV9pbmRleF9saW5lYXJpemF0aW9uX2hlbHBlcgoreworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBJbmRleCBydW4oYXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGNvbnN0JiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxEZW5zZUluZGV4PiBjb25zdCYgZGltZW5zaW9ucykKKyAgeworICAgIHJldHVybiBhcnJheV9nZXQ8Um93TWFqb3IgPyBuIDogKE51bUluZGljZXMgLSBuIC0gMSk+KGluZGljZXMpICsKKyAgICAgIGFycmF5X2dldDxSb3dNYWpvciA/IG4gOiAoTnVtSW5kaWNlcyAtIG4gLSAxKT4oZGltZW5zaW9ucykgKgorICAgICAgICB0ZW5zb3JfdnNpemVfaW5kZXhfbGluZWFyaXphdGlvbl9oZWxwZXI8SW5kZXgsIE51bUluZGljZXMsIG4gLSAxLCBSb3dNYWpvcj46OnJ1bihpbmRpY2VzLCBkaW1lbnNpb25zKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IE51bUluZGljZXMsIGJvb2wgUm93TWFqb3I+CitzdHJ1Y3QgdGVuc29yX3ZzaXplX2luZGV4X2xpbmVhcml6YXRpb25faGVscGVyPEluZGV4LCBOdW1JbmRpY2VzLCAwLCBSb3dNYWpvcj4KK3sKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgSW5kZXggcnVuKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiBjb25zdCYgaW5kaWNlcywgc3RkOjp2ZWN0b3I8RGVuc2VJbmRleD4gY29uc3QmKQorICB7CisgICAgcmV0dXJuIGFycmF5X2dldDxSb3dNYWpvciA/IDAgOiBOdW1JbmRpY2VzIC0gMT4oaW5kaWNlcyk7CisgIH0KK307Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlbnNlSW5kZXgsIGludCBOdW1EaW1zPiBzdHJ1Y3QgYXJyYXlfc2l6ZTxjb25zdCBEU2l6ZXM8RGVuc2VJbmRleCwgTnVtRGltcz4gPiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBOdW1EaW1zOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZW5zZUluZGV4LCBpbnQgTnVtRGltcz4gc3RydWN0IGFycmF5X3NpemU8RFNpemVzPERlbnNlSW5kZXgsIE51bURpbXM+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gTnVtRGltczsKK307CisjaWZuZGVmIEVJR0VOX0VNVUxBVEVfQ1hYMTFfTUVUQV9ICit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3RkOjpwdHJkaWZmX3QuLi4gSW5kaWNlcz4gc3RydWN0IGFycmF5X3NpemU8Y29uc3QgU2l6ZXM8SW5kaWNlcy4uLj4gPiB7CitzdGF0aWMgY29uc3Qgc3RkOjpwdHJkaWZmX3QgdmFsdWUgPSBTaXplczxJbmRpY2VzLi4uPjo6Y291bnQ7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIHN0ZDo6cHRyZGlmZl90Li4uIEluZGljZXM+IHN0cnVjdCBhcnJheV9zaXplPFNpemVzPEluZGljZXMuLi4+ID4geworc3RhdGljIGNvbnN0IHN0ZDo6cHRyZGlmZl90IHZhbHVlID0gU2l6ZXM8SW5kaWNlcy4uLj46OmNvdW50OworfTsKK3RlbXBsYXRlIDxzdGQ6OnB0cmRpZmZfdCBuLCB0eXBlbmFtZSBzdGQ6OnB0cmRpZmZfdC4uLiBJbmRpY2VzPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6cHRyZGlmZl90IGFycmF5X2dldChjb25zdCBTaXplczxJbmRpY2VzLi4uPiYpIHsKKyAgcmV0dXJuIGdldDxuLCBpbnRlcm5hbDo6bnVtZXJpY19saXN0PHN0ZDo6c2l6ZV90LCBJbmRpY2VzLi4uPiA+Ojp2YWx1ZTsKK30KK3RlbXBsYXRlIDxzdGQ6OnB0cmRpZmZfdCBuPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6cHRyZGlmZl90IGFycmF5X2dldChjb25zdCBTaXplczw+JikgeworICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsKKyAgcmV0dXJuIC0xOworfQorI2Vsc2UKK3RlbXBsYXRlIDxzdGQ6OnNpemVfdCBWMSwgc3RkOjpzaXplX3QgVjIsIHN0ZDo6c2l6ZV90IFYzLCBzdGQ6OnNpemVfdCBWNCwgc3RkOjpzaXplX3QgVjU+IHN0cnVjdCBhcnJheV9zaXplPGNvbnN0IFNpemVzPFYxLFYyLFYzLFY0LFY1PiA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IFNpemVzPFYxLFYyLFYzLFY0LFY1Pjo6Y291bnQ7Cit9OwordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFYxLCBzdGQ6OnNpemVfdCBWMiwgc3RkOjpzaXplX3QgVjMsIHN0ZDo6c2l6ZV90IFY0LCBzdGQ6OnNpemVfdCBWNT4gc3RydWN0IGFycmF5X3NpemU8U2l6ZXM8VjEsVjIsVjMsVjQsVjU+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gU2l6ZXM8VjEsVjIsVjMsVjQsVjU+Ojpjb3VudDsKK307Cit0ZW1wbGF0ZSA8c3RkOjpzaXplX3Qgbiwgc3RkOjpzaXplX3QgVjEsIHN0ZDo6c2l6ZV90IFYyLCBzdGQ6OnNpemVfdCBWMywgc3RkOjpzaXplX3QgVjQsIHN0ZDo6c2l6ZV90IFY1PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6c2l6ZV90IGFycmF5X2dldChjb25zdCBTaXplczxWMSxWMixWMyxWNCxWNT4mKSB7CisgIHJldHVybiBnZXQ8biwgdHlwZW5hbWUgU2l6ZXM8VjEsVjIsVjMsVjQsVjU+OjpCYXNlPjo6dmFsdWU7Cit9CisKKyNlbmRpZgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEaW1zMSwgdHlwZW5hbWUgRGltczIsIHNpemVfdCBuLCBzaXplX3QgbT4KK3N0cnVjdCBzaXplc19tYXRjaF9iZWxvd19kaW0geworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgIGlubGluZSBib29sIHJ1bihEaW1zMSYsIERpbXMyJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEaW1zMSwgdHlwZW5hbWUgRGltczIsIHNpemVfdCBuPgorc3RydWN0IHNpemVzX21hdGNoX2JlbG93X2RpbTxEaW1zMSwgRGltczIsIG4sIG4+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DICBpbmxpbmUgYm9vbCBydW4oRGltczEmIGRpbXMxLCBEaW1zMiYgZGltczIpIHsKKyAgICByZXR1cm4gKGFycmF5X2dldDxuLTE+KGRpbXMxKSA9PSBhcnJheV9nZXQ8bi0xPihkaW1zMikpICYKKyAgICAgICAgc2l6ZXNfbWF0Y2hfYmVsb3dfZGltPERpbXMxLCBEaW1zMiwgbi0xLCBuLTE+OjpydW4oZGltczEsIGRpbXMyKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEaW1zMSwgdHlwZW5hbWUgRGltczI+CitzdHJ1Y3Qgc2l6ZXNfbWF0Y2hfYmVsb3dfZGltPERpbXMxLCBEaW1zMiwgMCwgMD4geworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgIGlubGluZSBib29sIHJ1bihEaW1zMSYsIERpbXMyJikgeworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGltczEsIHR5cGVuYW1lIERpbXMyPgorRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBkaW1lbnNpb25zX21hdGNoKERpbXMxJiBkaW1zMSwgRGltczImIGRpbXMyKSB7CisgIHJldHVybiBpbnRlcm5hbDo6c2l6ZXNfbWF0Y2hfYmVsb3dfZGltPERpbXMxLCBEaW1zMiwgaW50ZXJuYWw6OmFycmF5X3NpemU8RGltczE+Ojp2YWx1ZSwgaW50ZXJuYWw6OmFycmF5X3NpemU8RGltczI+Ojp2YWx1ZT46OnJ1bihkaW1zMSwgZGltczIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRElNRU5TSU9OU19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckV2YWxUby5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JFdmFsVG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjk4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JFdmFsVG8uaApAQCAtMCwwICsxLDE4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VWQUxfVE9fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VWQUxfVE9fSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckZvcmNlZEV2YWwKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHJlc2hhcGluZyBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckV2YWxUb09wPFhwclR5cGUsIE1ha2VQb2ludGVyXz4gPgoreworICAvLyBUeXBlIHByb21vdGlvbiB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHR5cGVzIG9mIHRoZSBsaHMgYW5kIHRoZSByaHMgYXJlIGRpZmZlcmVudC4KKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKKworICBlbnVtIHsKKyAgICBGbGFncyA9IDAKKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHN0cnVjdCBNYWtlUG9pbnRlciB7CisgICAgLy8gSW50ZXJtZWRpYXRlIHR5cGVkZWYgdG8gd29ya2Fyb3VuZCBNU1ZDIGlzc3VlLgorICAgIHR5cGVkZWYgTWFrZVBvaW50ZXJfPFQ+IE1ha2VQb2ludGVyVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1ha2VQb2ludGVyVDo6VHlwZSBUeXBlOworICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgZXZhbDxUZW5zb3JFdmFsVG9PcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yRXZhbFRvT3A8WHByVHlwZSwgTWFrZVBvaW50ZXJfPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorc3RydWN0IG5lc3RlZDxUZW5zb3JFdmFsVG9PcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvckV2YWxUb09wPFhwclR5cGUsIE1ha2VQb2ludGVyXz4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JFdmFsVG9PcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorY2xhc3MgVGVuc29yRXZhbFRvT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JFdmFsVG9PcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckV2YWxUb09wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OnR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1ha2VQb2ludGVyXzxDb2VmZlJldHVyblR5cGU+OjpUeXBlIFBvaW50ZXJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvckV2YWxUb09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yRXZhbFRvT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JFdmFsVG9PcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbFRvT3AoUG9pbnRlclR5cGUgYnVmZmVyLCBjb25zdCBYcHJUeXBlJiBleHByKQorICAgICAgOiBtX3hwcihleHByKSwgbV9idWZmZXIoYnVmZmVyKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgUG9pbnRlclR5cGUgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIFBvaW50ZXJUeXBlIG1fYnVmZmVyOworfTsKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckV2YWxUb09wPEFyZ1R5cGUsIE1ha2VQb2ludGVyXz4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JFdmFsVG9PcDxBcmdUeXBlLCBNYWtlUG9pbnRlcl8+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSB0cnVlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX2RldmljZShkZXZpY2UpLAorICAgICAgICAgIG1fYnVmZmVyKG9wLmJ1ZmZlcigpKSwgbV9vcChvcCksIG1fZXhwcmVzc2lvbihvcC5leHByZXNzaW9uKCkpCisgIHsgfQorCisgIC8vIFVzZWQgZm9yIGFjY2Vzc29yIGV4dHJhY3Rpb24gaW4gU1lDTCBNYW5hZ2VkIFRlbnNvck1hcDoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBYcHJUeXBlJiBvcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9vcDsKKyAgfQorICAKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB+VGVuc29yRXZhbHVhdG9yKCkgeworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPGNvbnN0IFRlbnNvckV2YWxUb09wPEFyZ1R5cGUsIE1ha2VQb2ludGVyXz4gPjo6dGVtcGxhdGUgTWFrZVBvaW50ZXI8Q29lZmZSZXR1cm5UeXBlPjo6VHlwZSBEZXZpY2VQb2ludGVyOworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsLmRpbWVuc2lvbnMoKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChEZXZpY2VQb2ludGVyIHNjYWxhcikgeworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzY2FsYXIpOworICAgIGVpZ2VuX2Fzc2VydChzY2FsYXIgPT0gTlVMTCk7CisgICAgcmV0dXJuIG1faW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChtX2J1ZmZlcik7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZXZhbFNjYWxhcihJbmRleCBpKSB7CisgICAgbV9idWZmZXJbaV0gPSBtX2ltcGwuY29lZmYoaSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGV2YWxQYWNrZXQoSW5kZXggaSkgeworICAgIGludGVybmFsOjpwc3RvcmV0PENvZWZmUmV0dXJuVHlwZSwgUGFja2V0UmV0dXJuVHlwZSwgQWxpZ25lZD4obV9idWZmZXIgKyBpLCBtX2ltcGwudGVtcGxhdGUgcGFja2V0PFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQgPyBBbGlnbmVkIDogVW5hbGlnbmVkPihpKSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9idWZmZXJbaW5kZXhdOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8UGFja2V0UmV0dXJuVHlwZSwgTG9hZE1vZGU+KG1fYnVmZmVyICsgaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGV2YWxQYWNrZXQgb3IgZXZhbFNjYWxhciBpcyBjYWxsZWQgdG8gcGVyZm9ybSB0aGUKKyAgICAvLyBhc3NpZ25tZW50IGFuZCBhY2NvdW50IGZvciB0aGUgY29zdCBvZiB0aGUgd3JpdGUgaGVyZS4KKyAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgIFRlbnNvck9wQ29zdCgwLCBzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSwgMCwgdmVjdG9yaXplZCwgUGFja2V0U2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBEZXZpY2VQb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2J1ZmZlcjsgfQorICBBcmdUeXBlIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb247IH0KKworICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiYgaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQorICAvLy8gYWRkZWQgZm9yIHN5Y2wgaW4gb3JkZXIgdG8gY29uc3RydWN0IHRoZSBidWZmZXIgZnJvbSB0aGUgc3ljbCBkZXZpY2UKKyAgY29uc3QgRGV2aWNlJiBkZXZpY2UoKSBjb25zdHtyZXR1cm4gbV9kZXZpY2U7fQorCisgcHJpdmF0ZToKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBjb25zdCBEZXZpY2UmIG1fZGV2aWNlOworICBEZXZpY2VQb2ludGVyIG1fYnVmZmVyOworICBjb25zdCBYcHJUeXBlJiBtX29wOworICBjb25zdCBBcmdUeXBlIG1fZXhwcmVzc2lvbjsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VWQUxfVE9fSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JFdmFsdWF0b3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRXZhbHVhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0Y2UwNwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRXZhbHVhdG9yLmgKQEAgLTAsMCArMSw2MzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9FVkFMVUFUT1JfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VWQUxVQVRPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yRXZhbHVhdG9yCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRoZSB0ZW5zb3IgZXZhbHVhdG9yIGNsYXNzZXMuCisgICoKKyAgKiBUaGVzZSBjbGFzc2VzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHRlbnNvciBleHByZXNzaW9uLgorICAqCisgICogVE9ETzogYWRkIHN1cHBvcnQgZm9yIG1vcmUgdHlwZXMgb2YgZXhwcmVzc2lvbnMsIGluIHBhcnRpY3VsYXIgZXhwcmVzc2lvbnMKKyAgKiBsZWFkaW5nIHRvIGx2YWx1ZXMgKHNsaWNpbmcsIHJlc2hhcGluZywgZXRjLi4uKQorICAqLworCisvLyBHZW5lcmljIGV2YWx1YXRvcgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKworICAvLyBOdW1EaW1lbnNpb25zIGlzIC0xIGZvciB2YXJpYWJsZSBkaW0gdGVuc29ycworICBzdGF0aWMgY29uc3QgaW50IE51bUNvb3JkcyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnMgPiAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpOdW1EaW1lbnNpb25zIDogMDsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBEZXJpdmVkOjpJc0FsaWduZWQsCisgICAgUGFja2V0QWNjZXNzID0gKGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemUgPiAxKSwKKyAgICBMYXlvdXQgPSBEZXJpdmVkOjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBOdW1Db29yZHMgPiAwLAorICAgIFJhd0FjY2VzcyA9IHRydWUKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBEZXJpdmVkJiBtLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9kYXRhKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6dGVtcGxhdGUgTWFrZVBvaW50ZXI8U2NhbGFyPjo6VHlwZT4obS5kYXRhKCkpKSwgbV9kaW1zKG0uZGltZW5zaW9ucygpKSwgbV9kZXZpY2UoZGV2aWNlKSwgbV9pbXBsKG0pCisgIHsgfQorCisgIC8vIFVzZWQgZm9yIGFjY2Vzc29yIGV4dHJhY3Rpb24gaW4gU1lDTCBNYW5hZ2VkIFRlbnNvck1hcDoKKyAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbXM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKiBkZXN0KSB7CisgICAgaWYgKGRlc3QpIHsKKyAgICAgIG1fZGV2aWNlLm1lbWNweSgodm9pZCopZGVzdCwgbV9kYXRhLCBzaXplb2YoU2NhbGFyKSAqIG1fZGltcy5Ub3RhbFNpemUoKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChtX2RhdGEpOworICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KSB7CisgICAgZWlnZW5fYXNzZXJ0KG1fZGF0YSk7CisgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRSZXR1cm5UeXBlLCBMb2FkTW9kZT4obV9kYXRhICsgaW5kZXgpOworICB9CisKKyAgdGVtcGxhdGUgPGludCBTdG9yZU1vZGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0UmV0dXJuVHlwZSYgeCkKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cHN0b3JldDxTY2FsYXIsIFBhY2tldFJldHVyblR5cGUsIFN0b3JlTW9kZT4obV9kYXRhICsgaW5kZXgsIHgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoY29uc3QgYXJyYXk8RGVuc2VJbmRleCwgTnVtQ29vcmRzPiYgY29vcmRzKSBjb25zdCB7CisgICAgZWlnZW5fYXNzZXJ0KG1fZGF0YSk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgcmV0dXJuIG1fZGF0YVttX2RpbXMuSW5kZXhPZkNvbE1ham9yKGNvb3JkcyldOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbV9kYXRhW21fZGltcy5JbmRleE9mUm93TWFqb3IoY29vcmRzKV07CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGNvZWZmUmVmKGNvbnN0IGFycmF5PERlbnNlSW5kZXgsIE51bUNvb3Jkcz4mIGNvb3JkcykgeworICAgIGVpZ2VuX2Fzc2VydChtX2RhdGEpOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIHJldHVybiBtX2RhdGFbbV9kaW1zLkluZGV4T2ZDb2xNYWpvcihjb29yZHMpXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1fZGF0YVttX2RpbXMuSW5kZXhPZlJvd01ham9yKGNvb3JkcyldOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVuc29yT3BDb3N0KHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCAwLCB2ZWN0b3JpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBNYWtlUG9pbnRlcjxTY2FsYXI+OjpUeXBlIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBjb25zdHJ1Y3Qgc3ljbCBidWZmZXIgZnJvbSByYXcgcG9pbnRlcgorICBjb25zdCBEZXZpY2UmIGRldmljZSgpIGNvbnN0e3JldHVybiBtX2RldmljZTt9CisKKyBwcm90ZWN0ZWQ6CisgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OnRlbXBsYXRlIE1ha2VQb2ludGVyPFNjYWxhcj46OlR5cGUgbV9kYXRhOworICBEaW1lbnNpb25zIG1fZGltczsKKyAgY29uc3QgRGV2aWNlJiBtX2RldmljZTsKKyAgY29uc3QgRGVyaXZlZCYgbV9pbXBsOworfTsKKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitUIGxvYWRDb25zdGFudChjb25zdCBUKiBhZGRyZXNzKSB7CisgIHJldHVybiAqYWRkcmVzczsKK30KKy8vIFVzZSB0aGUgdGV4dHVyZSBjYWNoZSBvbiBDVURBIGRldmljZXMgd2hlbmV2ZXIgcG9zc2libGUKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmIF9fQ1VEQV9BUkNIX18gPj0gMzUwCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitmbG9hdCBsb2FkQ29uc3RhbnQoY29uc3QgZmxvYXQqIGFkZHJlc3MpIHsKKyAgcmV0dXJuIF9fbGRnKGFkZHJlc3MpOworfQordGVtcGxhdGUgPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorZG91YmxlIGxvYWRDb25zdGFudChjb25zdCBkb3VibGUqIGFkZHJlc3MpIHsKKyAgcmV0dXJuIF9fbGRnKGFkZHJlc3MpOworfQordGVtcGxhdGUgPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorRWlnZW46OmhhbGYgbG9hZENvbnN0YW50KGNvbnN0IEVpZ2VuOjpoYWxmKiBhZGRyZXNzKSB7CisgIHJldHVybiBFaWdlbjo6aGFsZihoYWxmX2ltcGw6OnJhd191aW50MTZfdG9faGFsZihfX2xkZygmYWRkcmVzcy0+eCkpKTsKK30KKyNlbmRpZgorfQorCisKKy8vIERlZmF1bHQgZXZhbHVhdG9yIGZvciBydmFsdWVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IERlcml2ZWQsIERldmljZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgLy8gTnVtRGltZW5zaW9ucyBpcyAtMSBmb3IgdmFyaWFibGUgZGltIHRlbnNvcnMKKyAgc3RhdGljIGNvbnN0IGludCBOdW1Db29yZHMgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpOdW1EaW1lbnNpb25zID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TnVtRGltZW5zaW9ucyA6IDA7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gRGVyaXZlZDo6SXNBbGlnbmVkLAorICAgIFBhY2tldEFjY2VzcyA9IChpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplID4gMSksCisgICAgTGF5b3V0ID0gRGVyaXZlZDo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gTnVtQ29vcmRzID4gMCwKKyAgICBSYXdBY2Nlc3MgPSB0cnVlCisgIH07CisKKyAgLy8gVXNlZCBmb3IgYWNjZXNzb3IgZXh0cmFjdGlvbiBpbiBTWUNMIE1hbmFnZWQgVGVuc29yTWFwOgorICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgRGVyaXZlZCYgbSwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1fZGF0YShtLmRhdGEoKSksIG1fZGltcyhtLmRpbWVuc2lvbnMoKSksIG1fZGV2aWNlKGRldmljZSksIG1faW1wbChtKQorICB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbXM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKiBkYXRhKSB7CisgICAgaWYgKCFOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxTY2FsYXI+Ojp0eXBlPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uICYmIGRhdGEpIHsKKyAgICAgIG1fZGV2aWNlLm1lbWNweSgodm9pZCopZGF0YSwgbV9kYXRhLCBtX2RpbXMuVG90YWxTaXplKCkgKiBzaXplb2YoU2NhbGFyKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChtX2RhdGEpOworICAgIHJldHVybiBsb2FkQ29uc3RhbnQobV9kYXRhK2luZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0X3JvPFBhY2tldFJldHVyblR5cGUsIExvYWRNb2RlPihtX2RhdGEgKyBpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihjb25zdCBhcnJheTxEZW5zZUluZGV4LCBOdW1Db29yZHM+JiBjb29yZHMpIGNvbnN0IHsKKyAgICBlaWdlbl9hc3NlcnQobV9kYXRhKTsKKyAgICBjb25zdCBJbmRleCBpbmRleCA9IChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpID8gbV9kaW1zLkluZGV4T2ZDb2xNYWpvcihjb29yZHMpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1fZGltcy5JbmRleE9mUm93TWFqb3IoY29vcmRzKTsKKyAgICByZXR1cm4gbG9hZENvbnN0YW50KG1fZGF0YStpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgcmV0dXJuIFRlbnNvck9wQ29zdChzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSwgMCwgMCwgdmVjdG9yaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6dGVtcGxhdGUgTWFrZVBvaW50ZXI8Y29uc3QgU2NhbGFyPjo6VHlwZSBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgLy8vIGFkZGVkIGZvciBzeWNsIGluIG9yZGVyIHRvIGNvbnN0cnVjdCB0aGUgYnVmZmVyIGZyb20gdGhlIHN5Y2wgZGV2aWNlCisgIGNvbnN0IERldmljZSYgZGV2aWNlKCkgY29uc3R7cmV0dXJuIG1fZGV2aWNlO30KKworIHByb3RlY3RlZDoKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6dGVtcGxhdGUgTWFrZVBvaW50ZXI8Y29uc3QgU2NhbGFyPjo6VHlwZSBtX2RhdGE7CisgIERpbWVuc2lvbnMgbV9kaW1zOworICBjb25zdCBEZXZpY2UmIG1fZGV2aWNlOworICBjb25zdCBEZXJpdmVkJiBtX2ltcGw7Cit9OworCisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZU51bGxhcnlPcCAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBOdWxsYXJ5T3AsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3A8TnVsbGFyeU9wLCBBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvckN3aXNlTnVsbGFyeU9wPE51bGxhcnlPcCwgQXJnVHlwZT4gWHByVHlwZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSB0cnVlLAorICAgIFBhY2tldEFjY2VzcyA9IGludGVybmFsOjpmdW5jdG9yX3RyYWl0czxOdWxsYXJ5T3A+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLCBtX2FyZ0ltcGwob3AubmVzdGVkRXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX3dyYXBwZXIoKQorICB7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnSW1wbC5kaW1lbnNpb25zKCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKikgeyByZXR1cm4gdHJ1ZTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3dyYXBwZXIobV9mdW5jdG9yLCBpbmRleCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV93cmFwcGVyLnRlbXBsYXRlIHBhY2tldE9wPFBhY2tldFJldHVyblR5cGUsIEluZGV4PihtX2Z1bmN0b3IsIGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0CisgIGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVuc29yT3BDb3N0KHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCAwLCB2ZWN0b3JpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4mIGltcGwoKSBjb25zdCB7IHJldHVybiBtX2FyZ0ltcGw7IH0KKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgTnVsbGFyeU9wIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworCisgcHJpdmF0ZToKKyAgY29uc3QgTnVsbGFyeU9wIG1fZnVuY3RvcjsKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9hcmdJbXBsOworICBjb25zdCBpbnRlcm5hbDo6bnVsbGFyeV93cmFwcGVyPENvZWZmUmV0dXJuVHlwZSxOdWxsYXJ5T3A+IG1fd3JhcHBlcjsKK307CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZVVuYXJ5T3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgQXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgQXJnVHlwZT4gWHByVHlwZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MgJiBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8VW5hcnlPcD46OlBhY2tldEFjY2VzcywKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLAorICAgICAgbV9hcmdJbXBsKG9wLm5lc3RlZEV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnSW1wbC5kaW1lbnNpb25zKCk7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKikgeworICAgIG1fYXJnSW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2FyZ0ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3RvcihtX2FyZ0ltcGwuY29lZmYoaW5kZXgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Z1bmN0b3IucGFja2V0T3AobV9hcmdJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICBjb25zdCBkb3VibGUgZnVuY3Rvcl9jb3N0ID0gaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPFVuYXJ5T3A+OjpDb3N0OworICAgIHJldHVybiBtX2FyZ0ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIGZ1bmN0b3JfY29zdCwgdmVjdG9yaXplZCwgUGFja2V0U2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gJiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9hcmdJbXBsOyB9CisgIC8vLyBhZGRlZCBmb3Igc3ljbCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgdGhlIGJ1ZmZlciBmcm9tIHN5Y2wgZGV2aWNlCisgIFVuYXJ5T3AgZnVuY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZnVuY3RvcjsgfQorCisKKyBwcml2YXRlOgorICBjb25zdCBVbmFyeU9wIG1fZnVuY3RvcjsKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9hcmdJbXBsOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZUJpbmFyeU9wIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMZWZ0QXJnVHlwZSwgdHlwZW5hbWUgUmlnaHRBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExlZnRBcmdUeXBlLCBSaWdodEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yQ3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGVmdEFyZ1R5cGUsIFJpZ2h0QXJnVHlwZT4gWHByVHlwZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCAmIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmCisgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPEJpbmFyeU9wPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxMZWZ0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLAorICAgICAgbV9sZWZ0SW1wbChvcC5saHNFeHByZXNzaW9uKCksIGRldmljZSksCisgICAgICBtX3JpZ2h0SW1wbChvcC5yaHNFeHByZXNzaW9uKCksIGRldmljZSkKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKHN0YXRpY19jYXN0PGludD4oVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oVGVuc29yRXZhbHVhdG9yPFJpZ2h0QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSB8fCBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpOdW1EaW1lbnNpb25zIDw9IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGVpZ2VuX2Fzc2VydChkaW1lbnNpb25zX21hdGNoKG1fbGVmdEltcGwuZGltZW5zaW9ucygpLCBtX3JpZ2h0SW1wbC5kaW1lbnNpb25zKCkpKTsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0CisgIHsKKyAgICAvLyBUT0RPOiB1c2UgcmlnaHQgaW1wbCBpbnN0ZWFkIGlmIHJpZ2h0IGltcGwgZGltZW5zaW9ucyBhcmUga25vd24gYXQgY29tcGlsZSB0aW1lLgorICAgIHJldHVybiBtX2xlZnRJbXBsLmRpbWVuc2lvbnMoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChDb2VmZlJldHVyblR5cGUqKSB7CisgICAgbV9sZWZ0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBtX3JpZ2h0SW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2xlZnRJbXBsLmNsZWFudXAoKTsKKyAgICBtX3JpZ2h0SW1wbC5jbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yKG1fbGVmdEltcGwuY29lZmYoaW5kZXgpLCBtX3JpZ2h0SW1wbC5jb2VmZihpbmRleCkpOworICB9CisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Z1bmN0b3IucGFja2V0T3AobV9sZWZ0SW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSwgbV9yaWdodEltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIGNvbnN0IGRvdWJsZSBmdW5jdG9yX2Nvc3QgPSBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpDb3N0OworICAgIHJldHVybiBtX2xlZnRJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIG1fcmlnaHRJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBmdW5jdG9yX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgQ29lZmZSZXR1cm5UeXBlKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8TGVmdEFyZ1R5cGUsIERldmljZT4mIGxlZnRfaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdEltcGw7IH0KKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yPFJpZ2h0QXJnVHlwZSwgRGV2aWNlPiYgcmlnaHRfaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHRJbXBsOyB9CisgIC8vLyByZXF1aXJlZCBieSBzeWNsIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGFjY2Vzc29yCisgIEJpbmFyeU9wIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEJpbmFyeU9wIG1fZnVuY3RvcjsKKyAgVGVuc29yRXZhbHVhdG9yPExlZnRBcmdUeXBlLCBEZXZpY2U+IG1fbGVmdEltcGw7CisgIFRlbnNvckV2YWx1YXRvcjxSaWdodEFyZ1R5cGUsIERldmljZT4gbV9yaWdodEltcGw7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDd2lzZVRlcm5hcnlPcCAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUZXJuYXJ5T3AsIHR5cGVuYW1lIEFyZzFUeXBlLCB0eXBlbmFtZSBBcmcyVHlwZSwgdHlwZW5hbWUgQXJnM1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQ3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxVHlwZSwgQXJnMlR5cGUsIEFyZzNUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvckN3aXNlVGVybmFyeU9wPFRlcm5hcnlPcCwgQXJnMVR5cGUsIEFyZzJUeXBlLCBBcmczVHlwZT4gWHByVHlwZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnMVR5cGUsIERldmljZT46OklzQWxpZ25lZCAmIFRlbnNvckV2YWx1YXRvcjxBcmcyVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkICYgVGVuc29yRXZhbHVhdG9yPEFyZzNUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZzFUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MgJiBUZW5zb3JFdmFsdWF0b3I8QXJnMlR5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmIFRlbnNvckV2YWx1YXRvcjxBcmczVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzICYKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8VGVybmFyeU9wPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmcxVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IG1fZnVuY3RvcihvcC5mdW5jdG9yKCkpLAorICAgICAgbV9hcmcxSW1wbChvcC5hcmcxRXhwcmVzc2lvbigpLCBkZXZpY2UpLAorICAgICAgbV9hcmcySW1wbChvcC5hcmcyRXhwcmVzc2lvbigpLCBkZXZpY2UpLAorICAgICAgbV9hcmczSW1wbChvcC5hcmczRXhwcmVzc2lvbigpLCBkZXZpY2UpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxBcmcxVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxBcmczVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSB8fCBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpOdW1EaW1lbnNpb25zIDw9IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxBcmcxVHlwZT46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QXJnMlR5cGU+OjpTdG9yYWdlS2luZD46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JBR0VfS0lORF9NVVNUX01BVENIKQorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QXJnMVR5cGU+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzNUeXBlPjo6U3RvcmFnZUtpbmQ+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBTVE9SQUdFX0tJTkRfTVVTVF9NQVRDSCkKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzFUeXBlPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxBcmcyVHlwZT46OkluZGV4Pjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgU1RPUkFHRV9JTkRFWF9NVVNUX01BVENIKQorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QXJnMVR5cGU+OjpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEFyZzNUeXBlPjo6SW5kZXg+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBTVE9SQUdFX0lOREVYX01VU1RfTUFUQ0gpCisKKyAgICBlaWdlbl9hc3NlcnQoZGltZW5zaW9uc19tYXRjaChtX2FyZzFJbXBsLmRpbWVuc2lvbnMoKSwgbV9hcmcySW1wbC5kaW1lbnNpb25zKCkpICYmIGRpbWVuc2lvbnNfbWF0Y2gobV9hcmcxSW1wbC5kaW1lbnNpb25zKCksIG1fYXJnM0ltcGwuZGltZW5zaW9ucygpKSk7CisgIH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxYcHJUeXBlPjo6U2NhbGFyIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmcxVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdAorICB7CisgICAgLy8gVE9ETzogdXNlIGFyZzIgb3IgYXJnMyBkaW1lbnNpb25zIGlmIHRoZXkgYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZS4KKyAgICByZXR1cm4gbV9hcmcxSW1wbC5kaW1lbnNpb25zKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKikgeworICAgIG1fYXJnMUltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgbV9hcmcySW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBtX2FyZzNJbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1fYXJnMUltcGwuY2xlYW51cCgpOworICAgIG1fYXJnMkltcGwuY2xlYW51cCgpOworICAgIG1fYXJnM0ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fZnVuY3RvcihtX2FyZzFJbXBsLmNvZWZmKGluZGV4KSwgbV9hcmcySW1wbC5jb2VmZihpbmRleCksIG1fYXJnM0ltcGwuY29lZmYoaW5kZXgpKTsKKyAgfQorICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9mdW5jdG9yLnBhY2tldE9wKG1fYXJnMUltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FyZzJJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcmczSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgY29uc3QgZG91YmxlIGZ1bmN0b3JfY29zdCA9IGludGVybmFsOjpmdW5jdG9yX3RyYWl0czxUZXJuYXJ5T3A+OjpDb3N0OworICAgIHJldHVybiBtX2FyZzFJbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIG1fYXJnMkltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgbV9hcmczSW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICBUZW5zb3JPcENvc3QoMCwgMCwgZnVuY3Rvcl9jb3N0LCB2ZWN0b3JpemVkLCBQYWNrZXRTaXplKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIENvZWZmUmV0dXJuVHlwZSogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8QXJnMVR5cGUsIERldmljZT4gJiBhcmcxSW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fYXJnMUltcGw7IH0KKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZzJUeXBlLCBEZXZpY2U+JiBhcmcySW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fYXJnMkltcGw7IH0KKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYWNjZXNzb3IKKyAgY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZzNUeXBlLCBEZXZpY2U+JiBhcmczSW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fYXJnM0ltcGw7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IFRlcm5hcnlPcCBtX2Z1bmN0b3I7CisgIFRlbnNvckV2YWx1YXRvcjxBcmcxVHlwZSwgRGV2aWNlPiBtX2FyZzFJbXBsOworICBUZW5zb3JFdmFsdWF0b3I8QXJnMlR5cGUsIERldmljZT4gbV9hcmcySW1wbDsKKyAgVGVuc29yRXZhbHVhdG9yPEFyZzNUeXBlLCBEZXZpY2U+IG1fYXJnM0ltcGw7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlbGVjdE9wIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIElmQXJnVHlwZSwgdHlwZW5hbWUgVGhlbkFyZ1R5cGUsIHR5cGVuYW1lIEVsc2VBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNlbGVjdE9wPElmQXJnVHlwZSwgVGhlbkFyZ1R5cGUsIEVsc2VBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvclNlbGVjdE9wPElmQXJnVHlwZSwgVGhlbkFyZ1R5cGUsIEVsc2VBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gVGVuc29yRXZhbHVhdG9yPFRoZW5BcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQgJiBUZW5zb3JFdmFsdWF0b3I8RWxzZUFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8VGhlbkFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcyAmIFRlbnNvckV2YWx1YXRvcjxFbHNlQXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzICYKKyAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNCbGVuZCwKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8SWZBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgIDogbV9jb25kSW1wbChvcC5pZkV4cHJlc3Npb24oKSwgZGV2aWNlKSwKKyAgICAgIG1fdGhlbkltcGwob3AudGhlbkV4cHJlc3Npb24oKSwgZGV2aWNlKSwKKyAgICAgIG1fZWxzZUltcGwob3AuZWxzZUV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8SWZBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oVGVuc29yRXZhbHVhdG9yPFRoZW5BcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxJZkFyZ1R5cGUsIERldmljZT46OkxheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8RWxzZUFyZ1R5cGUsIERldmljZT46OkxheW91dCkpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGVpZ2VuX2Fzc2VydChkaW1lbnNpb25zX21hdGNoKG1fY29uZEltcGwuZGltZW5zaW9ucygpLCBtX3RoZW5JbXBsLmRpbWVuc2lvbnMoKSkpOworICAgIGVpZ2VuX2Fzc2VydChkaW1lbnNpb25zX21hdGNoKG1fdGhlbkltcGwuZGltZW5zaW9ucygpLCBtX2Vsc2VJbXBsLmRpbWVuc2lvbnMoKSkpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPElmQXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdAorICB7CisgICAgLy8gVE9ETzogdXNlIHRoZW4gb3IgZWxzZSBpbXBsIGluc3RlYWQgaWYgdGhleSBoYXBwZW4gdG8gYmUga25vd24gYXQgY29tcGlsZSB0aW1lLgorICAgIHJldHVybiBtX2NvbmRJbXBsLmRpbWVuc2lvbnMoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChDb2VmZlJldHVyblR5cGUqKSB7CisgICAgbV9jb25kSW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBtX3RoZW5JbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIG1fZWxzZUltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9jb25kSW1wbC5jbGVhbnVwKCk7CisgICAgbV90aGVuSW1wbC5jbGVhbnVwKCk7CisgICAgbV9lbHNlSW1wbC5jbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9jb25kSW1wbC5jb2VmZihpbmRleCkgPyBtX3RoZW5JbXBsLmNvZWZmKGluZGV4KSA6IG1fZWxzZUltcGwuY29lZmYoaW5kZXgpOworICB9CisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBpbnRlcm5hbDo6U2VsZWN0b3I8UGFja2V0U2l6ZT4gc2VsZWN0OworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIHNlbGVjdC5zZWxlY3RbaV0gPSBtX2NvbmRJbXBsLmNvZWZmKGluZGV4K2kpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJuYWw6OnBibGVuZChzZWxlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90aGVuSW1wbC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Vsc2VJbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0CisgIGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9jb25kSW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICBtX3RoZW5JbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKQorICAgICAgICAuY3dpc2VNYXgobV9lbHNlSW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisgIC8vLyByZXF1aXJlZCBieSBzeWNsIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGFjY2Vzc29yCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxJZkFyZ1R5cGUsIERldmljZT4gJiBjb25kX2ltcGwoKSBjb25zdCB7IHJldHVybiBtX2NvbmRJbXBsOyB9CisgIC8vLyByZXF1aXJlZCBieSBzeWNsIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGFjY2Vzc29yCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxUaGVuQXJnVHlwZSwgRGV2aWNlPiYgdGhlbl9pbXBsKCkgY29uc3QgeyByZXR1cm4gbV90aGVuSW1wbDsgfQorICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8RWxzZUFyZ1R5cGUsIERldmljZT4mIGVsc2VfaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxzZUltcGw7IH0KKworIHByaXZhdGU6CisgIFRlbnNvckV2YWx1YXRvcjxJZkFyZ1R5cGUsIERldmljZT4gbV9jb25kSW1wbDsKKyAgVGVuc29yRXZhbHVhdG9yPFRoZW5BcmdUeXBlLCBEZXZpY2U+IG1fdGhlbkltcGw7CisgIFRlbnNvckV2YWx1YXRvcjxFbHNlQXJnVHlwZSwgRGV2aWNlPiBtX2Vsc2VJbXBsOworfTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRVZBTFVBVE9SX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRXhlY3V0b3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRXhlY3V0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFkNzdjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JFeGVjdXRvci5oCkBAIC0wLDAgKzEsMjg4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRVhFQ1VUT1JfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VYRUNVVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JFeGVjdXRvcgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUaGUgdGVuc29yIGV4ZWN1dG9yIGNsYXNzLgorICAqCisgICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbGF1bmNoIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBleHByZXNzaW9uIG9uCisgICogdGhlIHNwZWNpZmllZCBjb21wdXRpbmcgZGV2aWNlLgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gRGVmYXVsdCBzdHJhdGVneTogdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIHdpdGggYSBzaW5nbGUgY3B1IHRocmVhZC4KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb24sIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGU+CitjbGFzcyBUZW5zb3JFeGVjdXRvcgoreworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uOjpJbmRleCBJbmRleDsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBFeHByZXNzaW9uJiBleHByLCBjb25zdCBEZXZpY2UmIGRldmljZSA9IERldmljZSgpKQorICB7CisgICAgVGVuc29yRXZhbHVhdG9yPEV4cHJlc3Npb24sIERldmljZT4gZXZhbHVhdG9yKGV4cHIsIGRldmljZSk7CisgICAgY29uc3QgYm9vbCBuZWVkc19hc3NpZ24gPSBldmFsdWF0b3IuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgaWYgKG5lZWRzX2Fzc2lnbikKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBzaXplID0gYXJyYXlfcHJvZChldmFsdWF0b3IuZGltZW5zaW9ucygpKTsKKyAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgZXZhbHVhdG9yLmV2YWxTY2FsYXIoaSk7CisgICAgICB9CisgICAgfQorICAgIGV2YWx1YXRvci5jbGVhbnVwKCk7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvbj4KK2NsYXNzIFRlbnNvckV4ZWN1dG9yPEV4cHJlc3Npb24sIERlZmF1bHREZXZpY2UsIHRydWU+Cit7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEV4cHJlc3Npb246OkluZGV4IEluZGV4OworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IEV4cHJlc3Npb24mIGV4cHIsIGNvbnN0IERlZmF1bHREZXZpY2UmIGRldmljZSA9IERlZmF1bHREZXZpY2UoKSkKKyAgeworICAgIFRlbnNvckV2YWx1YXRvcjxFeHByZXNzaW9uLCBEZWZhdWx0RGV2aWNlPiBldmFsdWF0b3IoZXhwciwgZGV2aWNlKTsKKyAgICBjb25zdCBib29sIG5lZWRzX2Fzc2lnbiA9IGV2YWx1YXRvci5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBpZiAobmVlZHNfYXNzaWduKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IHNpemUgPSBhcnJheV9wcm9kKGV2YWx1YXRvci5kaW1lbnNpb25zKCkpOworICAgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSB1bnBhY2tldF90cmFpdHM8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV4cHJlc3Npb24sIERlZmF1bHREZXZpY2U+OjpQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKyAgICAgIC8vIEdpdmUgdGhlIGNvbXBpbGVyIGEgc3Ryb25nIGhpbnQgdG8gdW5yb2xsIHRoZSBsb29wLiBCdXQgZG9uJ3QgaW5zaXN0CisgICAgICAvLyBvbiB1bnJvbGxpbmcsIGJlY2F1c2UgaWYgdGhlIGZ1bmN0aW9uIGlzIGV4cGVuc2l2ZSB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdAorICAgICAgLy8gdW5yb2xsIHRoZSBsb29wIGF0IHRoZSBleHBlbnNlIG9mIGlubGluaW5nLgorICAgICAgY29uc3QgSW5kZXggVW5yb2xsZWRTaXplID0gKHNpemUgLyAoNCAqIFBhY2tldFNpemUpKSAqIDQgKiBQYWNrZXRTaXplOworICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IFVucm9sbGVkU2l6ZTsgaSArPSA0KlBhY2tldFNpemUpIHsKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgIGV2YWx1YXRvci5ldmFsUGFja2V0KGkgKyBqICogUGFja2V0U2l6ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnN0IEluZGV4IFZlY3Rvcml6ZWRTaXplID0gKHNpemUgLyBQYWNrZXRTaXplKSAqIFBhY2tldFNpemU7CisgICAgICBmb3IgKEluZGV4IGkgPSBVbnJvbGxlZFNpemU7IGkgPCBWZWN0b3JpemVkU2l6ZTsgaSArPSBQYWNrZXRTaXplKSB7CisgICAgICAgIGV2YWx1YXRvci5ldmFsUGFja2V0KGkpOworICAgICAgfQorICAgICAgZm9yIChJbmRleCBpID0gVmVjdG9yaXplZFNpemU7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgZXZhbHVhdG9yLmV2YWxTY2FsYXIoaSk7CisgICAgICB9CisgICAgfQorICAgIGV2YWx1YXRvci5jbGVhbnVwKCk7CisgIH0KK307CisKKworCisvLyBNdWx0aWNvcmUgc3RyYXRlZ3k6IHRoZSBpbmRleCBzcGFjZSBpcyBwYXJ0aXRpb25lZCBhbmQgZWFjaCBwYXJ0aXRpb24gaXMgZXhlY3V0ZWQgb24gYSBzaW5nbGUgY29yZQorI2lmZGVmIEVJR0VOX1VTRV9USFJFQURTCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXZhbHVhdG9yLCB0eXBlbmFtZSBJbmRleCwgYm9vbCBWZWN0b3JpemFibGU+CitzdHJ1Y3QgRXZhbFJhbmdlIHsKKyAgc3RhdGljIHZvaWQgcnVuKEV2YWx1YXRvciogZXZhbHVhdG9yX2luLCBjb25zdCBJbmRleCBmaXJzdCwgY29uc3QgSW5kZXggbGFzdCkgeworICAgIEV2YWx1YXRvciBldmFsdWF0b3IgPSAqZXZhbHVhdG9yX2luOworICAgIGVpZ2VuX2Fzc2VydChsYXN0ID49IGZpcnN0KTsKKyAgICBmb3IgKEluZGV4IGkgPSBmaXJzdDsgaSA8IGxhc3Q7ICsraSkgeworICAgICAgZXZhbHVhdG9yLmV2YWxTY2FsYXIoaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIEluZGV4IGFsaWduQmxvY2tTaXplKEluZGV4IHNpemUpIHsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV2YWx1YXRvciwgdHlwZW5hbWUgSW5kZXg+CitzdHJ1Y3QgRXZhbFJhbmdlPEV2YWx1YXRvciwgSW5kZXgsIHRydWU+IHsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gdW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIEV2YWx1YXRvcjo6UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgc3RhdGljIHZvaWQgcnVuKEV2YWx1YXRvciogZXZhbHVhdG9yX2luLCBjb25zdCBJbmRleCBmaXJzdCwgY29uc3QgSW5kZXggbGFzdCkgeworICAgIEV2YWx1YXRvciBldmFsdWF0b3IgPSAqZXZhbHVhdG9yX2luOworICAgIGVpZ2VuX2Fzc2VydChsYXN0ID49IGZpcnN0KTsKKyAgICBJbmRleCBpID0gZmlyc3Q7CisgICAgaWYgKGxhc3QgLSBmaXJzdCA+PSBQYWNrZXRTaXplKSB7CisgICAgICBlaWdlbl9hc3NlcnQoZmlyc3QgJSBQYWNrZXRTaXplID09IDApOworICAgICAgSW5kZXggbGFzdF9jaHVua19vZmZzZXQgPSBsYXN0IC0gNCAqIFBhY2tldFNpemU7CisgICAgICAvLyBHaXZlIHRoZSBjb21waWxlciBhIHN0cm9uZyBoaW50IHRvIHVucm9sbCB0aGUgbG9vcC4gQnV0IGRvbid0IGluc2lzdAorICAgICAgLy8gb24gdW5yb2xsaW5nLCBiZWNhdXNlIGlmIHRoZSBmdW5jdGlvbiBpcyBleHBlbnNpdmUgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QKKyAgICAgIC8vIHVucm9sbCB0aGUgbG9vcCBhdCB0aGUgZXhwZW5zZSBvZiBpbmxpbmluZy4KKyAgICAgIGZvciAoOyBpIDw9IGxhc3RfY2h1bmtfb2Zmc2V0OyBpICs9IDQqUGFja2V0U2l6ZSkgeworICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgZXZhbHVhdG9yLmV2YWxQYWNrZXQoaSArIGogKiBQYWNrZXRTaXplKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdF9jaHVua19vZmZzZXQgPSBsYXN0IC0gUGFja2V0U2l6ZTsKKyAgICAgIGZvciAoOyBpIDw9IGxhc3RfY2h1bmtfb2Zmc2V0OyBpICs9IFBhY2tldFNpemUpIHsKKyAgICAgICAgZXZhbHVhdG9yLmV2YWxQYWNrZXQoaSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoOyBpIDwgbGFzdDsgKytpKSB7CisgICAgICBldmFsdWF0b3IuZXZhbFNjYWxhcihpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgSW5kZXggYWxpZ25CbG9ja1NpemUoSW5kZXggc2l6ZSkgeworICAgIC8vIEFsaWduIGJsb2NrIHNpemUgdG8gcGFja2V0IHNpemUgYW5kIGFjY291bnQgZm9yIHVucm9sbGluZyBpbiBydW4gYWJvdmUuCisgICAgaWYgKHNpemUgPj0gMTYgKiBQYWNrZXRTaXplKSB7CisgICAgICByZXR1cm4gKHNpemUgKyA0ICogUGFja2V0U2l6ZSAtIDEpICYgfig0ICogUGFja2V0U2l6ZSAtIDEpOworICAgIH0KKyAgICAvLyBBbGlnbmluZyB0byA0ICogUGFja2V0U2l6ZSB3b3VsZCBpbmNyZWFzZSBibG9jayBzaXplIGJ5IG1vcmUgdGhhbiAyNSUuCisgICAgcmV0dXJuIChzaXplICsgUGFja2V0U2l6ZSAtIDEpICYgfihQYWNrZXRTaXplIC0gMSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByZXNzaW9uLCBib29sIFZlY3Rvcml6YWJsZT4KK2NsYXNzIFRlbnNvckV4ZWN1dG9yPEV4cHJlc3Npb24sIFRocmVhZFBvb2xEZXZpY2UsIFZlY3Rvcml6YWJsZT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBFeHByZXNzaW9uJiBleHByLCBjb25zdCBUaHJlYWRQb29sRGV2aWNlJiBkZXZpY2UpCisgIHsKKyAgICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxFeHByZXNzaW9uLCBUaHJlYWRQb29sRGV2aWNlPiBFdmFsdWF0b3I7CisgICAgRXZhbHVhdG9yIGV2YWx1YXRvcihleHByLCBkZXZpY2UpOworICAgIGNvbnN0IGJvb2wgbmVlZHNfYXNzaWduID0gZXZhbHVhdG9yLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIGlmIChuZWVkc19hc3NpZ24pCisgICAgeworICAgICAgY29uc3QgSW5kZXggc2l6ZSA9IGFycmF5X3Byb2QoZXZhbHVhdG9yLmRpbWVuc2lvbnMoKSk7CisjaWYgIWRlZmluZWQoRUlHRU5fVVNFX1NJTVBMRV9USFJFQURfUE9PTCkKKyAgICAgIGRldmljZS5wYXJhbGxlbEZvcihzaXplLCBldmFsdWF0b3IuY29zdFBlckNvZWZmKFZlY3Rvcml6YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbFJhbmdlPEV2YWx1YXRvciwgSW5kZXgsIFZlY3Rvcml6YWJsZT46OmFsaWduQmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsmZXZhbHVhdG9yXShJbmRleCBmaXJzdCwgSW5kZXggbGFzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbFJhbmdlPEV2YWx1YXRvciwgSW5kZXgsIFZlY3Rvcml6YWJsZT46OnJ1bigmZXZhbHVhdG9yLCBmaXJzdCwgbGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisjZWxzZQorICAgICAgc2l6ZV90IG51bV90aHJlYWRzID0gZGV2aWNlLm51bVRocmVhZHMoKTsKKyAgICAgIGlmIChudW1fdGhyZWFkcyA+IDEpIHsKKyAgICAgICAgbnVtX3RocmVhZHMgPSBUZW5zb3JDb3N0TW9kZWw8VGhyZWFkUG9vbERldmljZT46Om51bVRocmVhZHMoCisgICAgICAgICAgICBzaXplLCBldmFsdWF0b3IuY29zdFBlckNvZWZmKFZlY3Rvcml6YWJsZSksIG51bV90aHJlYWRzKTsKKyAgICAgIH0KKyAgICAgIGlmIChudW1fdGhyZWFkcyA9PSAxKSB7CisgICAgICAgIEV2YWxSYW5nZTxFdmFsdWF0b3IsIEluZGV4LCBWZWN0b3JpemFibGU+OjpydW4oJmV2YWx1YXRvciwgMCwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gdW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIEV2YWx1YXRvcjo6UGFja2V0UmV0dXJuVHlwZT46OnNpemUgOiAxOworICAgICAgICBJbmRleCBibG9ja3N6ID0gc3RkOjpjZWlsPEluZGV4PihzdGF0aWNfY2FzdDxmbG9hdD4oc2l6ZSkvbnVtX3RocmVhZHMpICsgUGFja2V0U2l6ZSAtIDE7CisgICAgICAgIGNvbnN0IEluZGV4IGJsb2Nrc2l6ZSA9IG51bWV4dDo6bWF4aTxJbmRleD4oUGFja2V0U2l6ZSwgKGJsb2Nrc3ogLSAoYmxvY2tzeiAlIFBhY2tldFNpemUpKSk7CisgICAgICAgIGNvbnN0IEluZGV4IG51bWJsb2NrcyA9IHNpemUgLyBibG9ja3NpemU7CisKKyAgICAgICAgQmFycmllciBiYXJyaWVyKG51bWJsb2Nrcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmxvY2tzOyArK2kpIHsKKyAgICAgICAgICBkZXZpY2UuZW5xdWV1ZV93aXRoX2JhcnJpZXIoCisgICAgICAgICAgICAgICZiYXJyaWVyLCAmRXZhbFJhbmdlPEV2YWx1YXRvciwgSW5kZXgsIFZlY3Rvcml6YWJsZT46OnJ1biwKKyAgICAgICAgICAgICAgJmV2YWx1YXRvciwgaSAqIGJsb2Nrc2l6ZSwgKGkgKyAxKSAqIGJsb2Nrc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bWJsb2NrcyAqIGJsb2Nrc2l6ZSA8IHNpemUpIHsKKyAgICAgICAgICBFdmFsUmFuZ2U8RXZhbHVhdG9yLCBJbmRleCwgVmVjdG9yaXphYmxlPjo6cnVuKAorICAgICAgICAgICAgICAmZXZhbHVhdG9yLCBudW1ibG9ja3MgKiBibG9ja3NpemUsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGJhcnJpZXIuV2FpdCgpOworICAgICAgfQorI2VuZGlmICAvLyBkZWZpbmVkKCFFSUdFTl9VU0VfU0lNUExFX1RIUkVBRF9QT09MKQorICAgIH0KKyAgICBldmFsdWF0b3IuY2xlYW51cCgpOworICB9Cit9OworI2VuZGlmICAvLyBFSUdFTl9VU0VfVEhSRUFEUworCisKKy8vIEdQVTogdGhlIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gaXMgb2ZmbG9hZGVkIHRvIGEgR1BVLgorI2lmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJlc3Npb24sIGJvb2wgVmVjdG9yaXphYmxlPgorY2xhc3MgVGVuc29yRXhlY3V0b3I8RXhwcmVzc2lvbiwgR3B1RGV2aWNlLCBWZWN0b3JpemFibGU+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRXhwcmVzc2lvbjo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBFeHByZXNzaW9uJiBleHByLCBjb25zdCBHcHVEZXZpY2UmIGRldmljZSk7Cit9OworCisKKyNpZiBkZWZpbmVkKF9fQ1VEQUNDX18pCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXZhbHVhdG9yLCB0eXBlbmFtZSBJbmRleCwgYm9vbCBWZWN0b3JpemFibGU+CitzdHJ1Y3QgRWlnZW5NZXRhS2VybmVsRXZhbCB7CisgIHN0YXRpYyBfX2RldmljZV9fIEVJR0VOX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBydW4oRXZhbHVhdG9yJiBldmFsLCBJbmRleCBmaXJzdCwgSW5kZXggbGFzdCwgSW5kZXggc3RlcF9zaXplKSB7CisgICAgZm9yIChJbmRleCBpID0gZmlyc3Q7IGkgPCBsYXN0OyBpICs9IHN0ZXBfc2l6ZSkgeworICAgICAgZXZhbC5ldmFsU2NhbGFyKGkpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV2YWx1YXRvciwgdHlwZW5hbWUgSW5kZXg+CitzdHJ1Y3QgRWlnZW5NZXRhS2VybmVsRXZhbDxFdmFsdWF0b3IsIEluZGV4LCB0cnVlPiB7CisgIHN0YXRpYyBfX2RldmljZV9fIEVJR0VOX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBydW4oRXZhbHVhdG9yJiBldmFsLCBJbmRleCBmaXJzdCwgSW5kZXggbGFzdCwgSW5kZXggc3RlcF9zaXplKSB7CisgICAgY29uc3QgSW5kZXggUGFja2V0U2l6ZSA9IHVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBFdmFsdWF0b3I6OlBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIGNvbnN0IEluZGV4IHZlY3Rvcml6ZWRfc2l6ZSA9IChsYXN0IC8gUGFja2V0U2l6ZSkgKiBQYWNrZXRTaXplOworICAgIGNvbnN0IEluZGV4IHZlY3Rvcml6ZWRfc3RlcF9zaXplID0gc3RlcF9zaXplICogUGFja2V0U2l6ZTsKKworICAgIC8vIFVzZSB0aGUgdmVjdG9yIHBhdGgKKyAgICBmb3IgKEluZGV4IGkgPSBmaXJzdCAqIFBhY2tldFNpemU7IGkgPCB2ZWN0b3JpemVkX3NpemU7CisgICAgICAgICBpICs9IHZlY3Rvcml6ZWRfc3RlcF9zaXplKSB7CisgICAgICBldmFsLmV2YWxQYWNrZXQoaSk7CisgICAgfQorICAgIGZvciAoSW5kZXggaSA9IHZlY3Rvcml6ZWRfc2l6ZSArIGZpcnN0OyBpIDwgbGFzdDsgaSArPSBzdGVwX3NpemUpIHsKKyAgICAgIGV2YWwuZXZhbFNjYWxhcihpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFdmFsdWF0b3IsIHR5cGVuYW1lIEluZGV4PgorX19nbG9iYWxfXyB2b2lkCitfX2xhdW5jaF9ib3VuZHNfXygxMDI0KQorRWlnZW5NZXRhS2VybmVsKEV2YWx1YXRvciBldmFsLCBJbmRleCBzaXplKSB7CisKKyAgY29uc3QgSW5kZXggZmlyc3RfaW5kZXggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OworICBjb25zdCBJbmRleCBzdGVwX3NpemUgPSBibG9ja0RpbS54ICogZ3JpZERpbS54OworCisgIGNvbnN0IGJvb2wgdmVjdG9yaXphYmxlID0gRXZhbHVhdG9yOjpQYWNrZXRBY2Nlc3MgJiBFdmFsdWF0b3I6OklzQWxpZ25lZDsKKyAgRWlnZW5NZXRhS2VybmVsRXZhbDxFdmFsdWF0b3IsIEluZGV4LCB2ZWN0b3JpemFibGU+OjpydW4oZXZhbCwgZmlyc3RfaW5kZXgsIHNpemUsIHN0ZXBfc2l6ZSk7Cit9CisKKy8qc3RhdGljKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByZXNzaW9uLCBib29sIFZlY3Rvcml6YWJsZT4KK2lubGluZSB2b2lkIFRlbnNvckV4ZWN1dG9yPEV4cHJlc3Npb24sIEdwdURldmljZSwgVmVjdG9yaXphYmxlPjo6cnVuKAorICAgIGNvbnN0IEV4cHJlc3Npb24mIGV4cHIsIGNvbnN0IEdwdURldmljZSYgZGV2aWNlKSB7CisgIFRlbnNvckV2YWx1YXRvcjxFeHByZXNzaW9uLCBHcHVEZXZpY2U+IGV2YWx1YXRvcihleHByLCBkZXZpY2UpOworICBjb25zdCBib29sIG5lZWRzX2Fzc2lnbiA9IGV2YWx1YXRvci5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgaWYgKG5lZWRzX2Fzc2lnbikgeworICAgIGNvbnN0IGludCBibG9ja19zaXplID0gZGV2aWNlLm1heEN1ZGFUaHJlYWRzUGVyQmxvY2soKTsKKyAgICBjb25zdCBpbnQgbWF4X2Jsb2NrcyA9IGRldmljZS5nZXROdW1DdWRhTXVsdGlQcm9jZXNzb3JzKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLm1heEN1ZGFUaHJlYWRzUGVyTXVsdGlQcm9jZXNzb3IoKSAvIGJsb2NrX3NpemU7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IGFycmF5X3Byb2QoZXZhbHVhdG9yLmRpbWVuc2lvbnMoKSk7CisgICAgLy8gQ3JlYXRlIGEgbGVhc3Qgb25lIGJsb2NrIHRvIGVuc3VyZSB3ZSB3b24ndCBjcmFzaCB3aGVuIHRlbnNvcmZsb3cgY2FsbHMgd2l0aCB0ZW5zb3JzIG9mIHNpemUgMC4KKyAgICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9IG51bWV4dDo6bWF4aTxpbnQ+KG51bWV4dDo6bWluaTxpbnQ+KG1heF9ibG9ja3MsIGRpdnVwPGludD4oc2l6ZSwgYmxvY2tfc2l6ZSkpLCAxKTsKKworICAgIExBVU5DSF9DVURBX0tFUk5FTCgKKyAgICAgICAgKEVpZ2VuTWV0YUtlcm5lbDxUZW5zb3JFdmFsdWF0b3I8RXhwcmVzc2lvbiwgR3B1RGV2aWNlPiwgSW5kZXg+KSwKKyAgICAgICAgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgMCwgZGV2aWNlLCBldmFsdWF0b3IsIHNpemUpOworICB9CisgIGV2YWx1YXRvci5jbGVhbnVwKCk7Cit9CisKKyNlbmRpZiAgLy8gX19DVURBQ0NfXworI2VuZGlmICAvLyBFSUdFTl9VU0VfR1BVCisKKy8vIFNZQ0wgRXhlY3V0b3IgcG9saWN5CisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJlc3Npb24sIGJvb2wgVmVjdG9yaXphYmxlPgorY2xhc3MgVGVuc29yRXhlY3V0b3I8RXhwcmVzc2lvbiwgU3ljbERldmljZSwgVmVjdG9yaXphYmxlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgRXhwcmVzc2lvbiAmZXhwciwgY29uc3QgU3ljbERldmljZSAmZGV2aWNlKSB7CisgICAgLy8gY2FsbCBUZW5zb3JTWUNMIG1vZHVsZQorICAgIFRlbnNvclN5Y2w6OnJ1bihleHByLCBkZXZpY2UpOworICB9Cit9OworCisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9FWEVDVVRPUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckV4cHIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZGZjN2EKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckV4cHIuaApAQCAtMCwwICsxLDM3MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VYUFJfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0VYUFJfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckV4cHIKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIGV4cHJlc3Npb24gY2xhc3Nlcy4KKyAgKgorICAqIFRoZSBUZW5zb3JDd2lzZU51bGxhcnlPcCBjbGFzcyBhcHBsaWVzIGEgbnVsbGFyeSBvcGVyYXRvcnMgdG8gYW4gZXhwcmVzc2lvbi4KKyAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGdlbmVyYXRlIGNvbnN0YW50cy4KKyAgKgorICAqIFRoZSBUZW5zb3JDd2lzZVVuYXJ5T3AgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIHdoZXJlIGEgdW5hcnkgb3BlcmF0b3IKKyAgKiAoZS5nLiBjd2lzZVNxcnQpIGlzIGFwcGxpZWQgdG8gYW4gZXhwcmVzc2lvbi4KKyAgKgorICAqIFRoZSBUZW5zb3JDd2lzZUJpbmFyeU9wIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiB3aGVyZSBhIGJpbmFyeQorICAqIG9wZXJhdG9yIChlLmcuIGFkZGl0aW9uKSBpcyBhcHBsaWVkIHRvIGEgbGhzIGFuZCBhIHJocyBleHByZXNzaW9uLgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsIFhwclR5cGU+ID4KKyAgICA6IHRyYWl0czxYcHJUeXBlPgoreworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgWHByVHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlIF9YcHJUeXBlTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7CisKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAwCisgIH07Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBOdWxsYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBUZW5zb3JDd2lzZU51bGxhcnlPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckN3aXNlTnVsbGFyeU9wPE51bGxhcnlPcCwgWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDd2lzZU51bGxhcnlPcD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgICAgdHlwZWRlZiBUZW5zb3JDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsIFhwclR5cGU+IE5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN3aXNlTnVsbGFyeU9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDd2lzZU51bGxhcnlPcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDd2lzZU51bGxhcnlPcChjb25zdCBYcHJUeXBlJiB4cHIsIGNvbnN0IE51bGxhcnlPcCYgZnVuYyA9IE51bGxhcnlPcCgpKQorICAgICAgICA6IG1feHByKHhwciksIG1fZnVuY3RvcihmdW5jKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBOdWxsYXJ5T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IE51bGxhcnlPcCBtX2Z1bmN0b3I7Cit9OworCisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+CisgICAgOiB0cmFpdHM8WHByVHlwZT4KK3sKKyAgLy8gVE9ETyhwaGxpKTogQWRkIElucHV0U2NhbGFyLCBJbnB1dFBhY2tldC4gIENoZWNrIHJlZmVyZW5jZXMgdG8KKyAgLy8gY3VycmVudCBTY2FsYXIvUGFja2V0IHRvIHNlZSBpZiB0aGUgaW50ZW50IGlzIElucHV0IG9yIE91dHB1dC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8VW5hcnlPcCh0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIpPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHJhaXRzPFhwclR5cGU+IFhwclRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgWHByVHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlIF9YcHJUeXBlTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yQ3dpc2VVbmFyeU9wPFVuYXJ5T3AsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wPFVuYXJ5T3AsIFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQ3dpc2VVbmFyeU9wPFVuYXJ5T3AsIFhwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvckN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgdHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIFRlbnNvckN3aXNlVW5hcnlPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgICAvLyBUT0RPKHBobGkpOiBBZGQgSW5wdXRTY2FsYXIsIElucHV0UGFja2V0LiAgQ2hlY2sgcmVmZXJlbmNlcyB0bworICAgIC8vIGN1cnJlbnQgU2NhbGFyL1BhY2tldCB0byBzZWUgaWYgdGhlIGludGVudCBpcyBJbnB1dCBvciBPdXRwdXQuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDd2lzZVVuYXJ5T3A+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ3dpc2VVbmFyeU9wPjo6dHlwZSBOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDd2lzZVVuYXJ5T3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN3aXNlVW5hcnlPcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDd2lzZVVuYXJ5T3AoY29uc3QgWHByVHlwZSYgeHByLCBjb25zdCBVbmFyeU9wJiBmdW5jID0gVW5hcnlPcCgpKQorICAgICAgOiBtX3hwcih4cHIpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgVW5hcnlPcCYgZnVuY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZnVuY3RvcjsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFVuYXJ5T3AgbV9mdW5jdG9yOworfTsKKworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgQmluYXJ5T3AsIHR5cGVuYW1lIExoc1hwclR5cGUsIHR5cGVuYW1lIFJoc1hwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+ID4KK3sKKyAgLy8gVHlwZSBwcm9tb3Rpb24gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0eXBlcyBvZiB0aGUgbGhzIGFuZCB0aGUgcmhzCisgIC8vIGFyZSBkaWZmZXJlbnQuCisgIC8vIFRPRE8ocGhsaSk6IEFkZCBMaHMvUmhzU2NhbGFyLCBMaHMvUmhzUGFja2V0LiAgQ2hlY2sgcmVmZXJlbmNlcyB0bworICAvLyBjdXJyZW50IFNjYWxhci9QYWNrZXQgdG8gc2VlIGlmIHRoZSBpbnRlbnQgaXMgSW5wdXRzIG9yIE91dHB1dC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICBCaW5hcnlPcCh0eXBlbmFtZSBMaHNYcHJUeXBlOjpTY2FsYXIsCisgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNYcHJUeXBlOjpTY2FsYXIpPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHJhaXRzPExoc1hwclR5cGU+IFhwclRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX3N0b3JhZ2VfdHlwZTwKKyAgICAgIHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6U3RvcmFnZUtpbmQsCisgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzWHByVHlwZT46OlN0b3JhZ2VLaW5kPjo6cmV0IFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTwKKyAgICAgIHR5cGVuYW1lIHRyYWl0czxMaHNYcHJUeXBlPjo6SW5kZXgsCisgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzWHByVHlwZT46OkluZGV4Pjo6dHlwZSBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNYcHJUeXBlOjpOZXN0ZWQgTGhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIFJoc1hwclR5cGU6Ok5lc3RlZCBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKKworICBlbnVtIHsKKyAgICBGbGFncyA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yQ3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzWHByVHlwZSwgUmhzWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExoc1hwclR5cGUsIFJoc1hwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzWHByVHlwZSwgdHlwZW5hbWUgUmhzWHByVHlwZT4KK2NsYXNzIFRlbnNvckN3aXNlQmluYXJ5T3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHNYcHJUeXBlLCBSaHNYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgICAvLyBUT0RPKHBobGkpOiBBZGQgTGhzL1Joc1NjYWxhciwgTGhzL1Joc1BhY2tldC4gIENoZWNrIHJlZmVyZW5jZXMgdG8KKyAgICAvLyBjdXJyZW50IFNjYWxhci9QYWNrZXQgdG8gc2VlIGlmIHRoZSBpbnRlbnQgaXMgSW5wdXRzIG9yIE91dHB1dC4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN3aXNlQmluYXJ5T3A+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ3dpc2VCaW5hcnlPcD46OnR5cGUgTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ3dpc2VCaW5hcnlPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ3dpc2VCaW5hcnlPcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDd2lzZUJpbmFyeU9wKGNvbnN0IExoc1hwclR5cGUmIGxocywgY29uc3QgUmhzWHByVHlwZSYgcmhzLCBjb25zdCBCaW5hcnlPcCYgZnVuYyA9IEJpbmFyeU9wKCkpCisgICAgICAgIDogbV9saHNfeHByKGxocyksIG1fcmhzX3hwcihyaHMpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgQmluYXJ5T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb25zICovCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBMaHNYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGxoc0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2xoc194cHI7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICByaHNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9yaHNfeHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIExoc1hwclR5cGU6Ok5lc3RlZCBtX2xoc194cHI7CisgICAgdHlwZW5hbWUgUmhzWHByVHlwZTo6TmVzdGVkIG1fcmhzX3hwcjsKKyAgICBjb25zdCBCaW5hcnlPcCBtX2Z1bmN0b3I7Cit9OworCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUZXJuYXJ5T3AsIHR5cGVuYW1lIEFyZzFYcHJUeXBlLCB0eXBlbmFtZSBBcmcyWHByVHlwZSwgdHlwZW5hbWUgQXJnM1hwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckN3aXNlVGVybmFyeU9wPFRlcm5hcnlPcCwgQXJnMVhwclR5cGUsIEFyZzJYcHJUeXBlLCBBcmczWHByVHlwZT4gPgoreworICAvLyBUeXBlIHByb21vdGlvbiB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHR5cGVzIG9mIHRoZSBhcmdzIGFyZSBkaWZmZXJlbnQuCisgIHR5cGVkZWYgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgVGVybmFyeU9wKHR5cGVuYW1lIEFyZzFYcHJUeXBlOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgQXJnMlhwclR5cGU6OlNjYWxhciwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBBcmczWHByVHlwZTo6U2NhbGFyKT46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxBcmcxWHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxBcmcxWHByVHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxBcmcxWHByVHlwZT46OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFyZzFYcHJUeXBlOjpOZXN0ZWQgQXJnMU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcmcyWHByVHlwZTo6TmVzdGVkIEFyZzJOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJnM1hwclR5cGU6Ok5lc3RlZCBBcmczTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8QXJnMU5lc3RlZD46OnR5cGUgX0FyZzFOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxBcmcyTmVzdGVkPjo6dHlwZSBfQXJnMk5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPEFyZzNOZXN0ZWQ+Ojp0eXBlIF9BcmczTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7CisKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUZXJuYXJ5T3AsIHR5cGVuYW1lIEFyZzFYcHJUeXBlLCB0eXBlbmFtZSBBcmcyWHByVHlwZSwgdHlwZW5hbWUgQXJnM1hwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzFYcHJUeXBlLCBBcmcyWHByVHlwZSwgQXJnM1hwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yQ3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxWHByVHlwZSwgQXJnMlhwclR5cGUsIEFyZzNYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRlcm5hcnlPcCwgdHlwZW5hbWUgQXJnMVhwclR5cGUsIHR5cGVuYW1lIEFyZzJYcHJUeXBlLCB0eXBlbmFtZSBBcmczWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yQ3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxWHByVHlwZSwgQXJnMlhwclR5cGUsIEFyZzNYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzFYcHJUeXBlLCBBcmcyWHByVHlwZSwgQXJnM1hwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yQ3dpc2VUZXJuYXJ5T3A8VGVybmFyeU9wLCBBcmcxWHByVHlwZSwgQXJnMlhwclR5cGUsIEFyZzNYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgVGVybmFyeU9wLCB0eXBlbmFtZSBBcmcxWHByVHlwZSwgdHlwZW5hbWUgQXJnMlhwclR5cGUsIHR5cGVuYW1lIEFyZzNYcHJUeXBlPgorY2xhc3MgVGVuc29yQ3dpc2VUZXJuYXJ5T3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JDd2lzZVRlcm5hcnlPcDxUZXJuYXJ5T3AsIEFyZzFYcHJUeXBlLCBBcmcyWHByVHlwZSwgQXJnM1hwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yQ3dpc2VUZXJuYXJ5T3A+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yQ3dpc2VUZXJuYXJ5T3A+Ojp0eXBlIE5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckN3aXNlVGVybmFyeU9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JDd2lzZVRlcm5hcnlPcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JDd2lzZVRlcm5hcnlPcChjb25zdCBBcmcxWHByVHlwZSYgYXJnMSwgY29uc3QgQXJnMlhwclR5cGUmIGFyZzIsIGNvbnN0IEFyZzNYcHJUeXBlJiBhcmczLCBjb25zdCBUZXJuYXJ5T3AmIGZ1bmMgPSBUZXJuYXJ5T3AoKSkKKyAgICAgICAgOiBtX2FyZzFfeHByKGFyZzEpLCBtX2FyZzJfeHByKGFyZzIpLCBtX2FyZzNfeHByKGFyZzMpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgVGVybmFyeU9wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9ucyAqLworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgQXJnMVhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgYXJnMUV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2FyZzFfeHByOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIEFyZzJYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGFyZzJFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9hcmcyX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBBcmczWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBhcmczRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fYXJnM194cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgQXJnMVhwclR5cGU6Ok5lc3RlZCBtX2FyZzFfeHByOworICAgIHR5cGVuYW1lIEFyZzJYcHJUeXBlOjpOZXN0ZWQgbV9hcmcyX3hwcjsKKyAgICB0eXBlbmFtZSBBcmczWHByVHlwZTo6TmVzdGVkIG1fYXJnM194cHI7CisgICAgY29uc3QgVGVybmFyeU9wIG1fZnVuY3RvcjsKK307CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIElmWHByVHlwZSwgdHlwZW5hbWUgVGhlblhwclR5cGUsIHR5cGVuYW1lIEVsc2VYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JTZWxlY3RPcDxJZlhwclR5cGUsIFRoZW5YcHJUeXBlLCBFbHNlWHByVHlwZT4gPgorICAgIDogdHJhaXRzPFRoZW5YcHJUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUaGVuWHByVHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHJhaXRzPFRoZW5YcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgdHJhaXRzPFRoZW5YcHJUeXBlPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEVsc2VYcHJUeXBlPjo6U3RvcmFnZUtpbmQ+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxFbHNlWHByVHlwZT46OkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8VGhlblhwclR5cGU+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgSWZYcHJUeXBlOjpOZXN0ZWQgSWZOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGhlblhwclR5cGU6Ok5lc3RlZCBUaGVuTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVsc2VYcHJUeXBlOjpOZXN0ZWQgRWxzZU5lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gWHByVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSWZYcHJUeXBlLCB0eXBlbmFtZSBUaGVuWHByVHlwZSwgdHlwZW5hbWUgRWxzZVhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JTZWxlY3RPcDxJZlhwclR5cGUsIFRoZW5YcHJUeXBlLCBFbHNlWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JTZWxlY3RPcDxJZlhwclR5cGUsIFRoZW5YcHJUeXBlLCBFbHNlWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJZlhwclR5cGUsIHR5cGVuYW1lIFRoZW5YcHJUeXBlLCB0eXBlbmFtZSBFbHNlWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yU2VsZWN0T3A8SWZYcHJUeXBlLCBUaGVuWHByVHlwZSwgRWxzZVhwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvclNlbGVjdE9wPElmWHByVHlwZSwgVGhlblhwclR5cGUsIEVsc2VYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclNlbGVjdE9wPElmWHByVHlwZSwgVGhlblhwclR5cGUsIEVsc2VYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKK3RlbXBsYXRlPHR5cGVuYW1lIElmWHByVHlwZSwgdHlwZW5hbWUgVGhlblhwclR5cGUsIHR5cGVuYW1lIEVsc2VYcHJUeXBlPgorY2xhc3MgVGVuc29yU2VsZWN0T3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JTZWxlY3RPcDxJZlhwclR5cGUsIFRoZW5YcHJUeXBlLCBFbHNlWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTZWxlY3RPcD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBUaGVuWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEVsc2VYcHJUeXBlOjpDb2VmZlJldHVyblR5cGU+OjpyZXQgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yU2VsZWN0T3A+Ojp0eXBlIE5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclNlbGVjdE9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTZWxlY3RPcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBUZW5zb3JTZWxlY3RPcChjb25zdCBJZlhwclR5cGUmIGFfY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFRoZW5YcHJUeXBlJiBhX3RoZW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRWxzZVhwclR5cGUmIGFfZWxzZSkKKyAgICAgIDogbV9jb25kaXRpb24oYV9jb25kaXRpb24pLCBtX3RoZW4oYV90aGVuKSwgbV9lbHNlKGFfZWxzZSkKKyAgICB7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgSWZYcHJUeXBlJiBpZkV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2NvbmRpdGlvbjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBUaGVuWHByVHlwZSYgdGhlbkV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3RoZW47IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgRWxzZVhwclR5cGUmIGVsc2VFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9lbHNlOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIElmWHByVHlwZTo6TmVzdGVkIG1fY29uZGl0aW9uOworICAgIHR5cGVuYW1lIFRoZW5YcHJUeXBlOjpOZXN0ZWQgbV90aGVuOworICAgIHR5cGVuYW1lIEVsc2VYcHJUeXBlOjpOZXN0ZWQgbV9lbHNlOworfTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRVhQUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckZGVC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JGRlQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGViNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JGRlQuaApAQCAtMCwwICsxLDY1MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgSmlhbndlaSBDdWkgPHRodWNqd0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRkZUX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9GRlRfSAorCisvLyBUaGlzIGNvZGUgcmVxdWlyZXMgdGhlIGFiaWxpdHkgdG8gaW5pdGlhbGl6ZSBhcnJheXMgb2YgY29uc3RhbnQKKy8vIHZhbHVlcyBkaXJlY3RseSBpbnNpZGUgYSBjbGFzcy4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMIHx8IEVJR0VOX0NPTVBfTVNWQyA+PSAxOTAwCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yRkZUCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBGRlQgY2xhc3MuCisgICoKKyAgKiBUT0RPOgorICAqIFZlY3Rvcml6ZSB0aGUgQ29vbGV5IFR1a2V5IGFuZCB0aGUgQmx1ZXN0ZWluIGFsZ29yaXRobQorICAqIEFkZCBzdXBwb3J0IGZvciBtdWx0aXRocmVhZGVkIGV2YWx1YXRpb24KKyAgKiBJbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvbiBHUFUKKyAgKi8KKwordGVtcGxhdGUgPGJvb2wgTmVlZFVwcmFkZT4gc3RydWN0IE1ha2VDb21wbGV4IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIFQgb3BlcmF0b3IoKSAoY29uc3QgVCYgdmFsKSBjb25zdCB7IHJldHVybiB2YWw7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYWtlQ29tcGxleDx0cnVlPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGQ6OmNvbXBsZXg8VD4gb3BlcmF0b3IoKSAoY29uc3QgVCYgdmFsKSBjb25zdCB7IHJldHVybiBzdGQ6OmNvbXBsZXg8VD4odmFsLCAwKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1ha2VDb21wbGV4PGZhbHNlPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGQ6OmNvbXBsZXg8VD4gb3BlcmF0b3IoKSAoY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiB2YWwpIGNvbnN0IHsgcmV0dXJuIHZhbDsgfQorfTsKKwordGVtcGxhdGUgPGludCBSZXN1bHRUeXBlPiBzdHJ1Y3QgUGFydE9mIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgb3BlcmF0b3IoKSAoY29uc3QgVCYgdmFsKSBjb25zdCB7IHJldHVybiB2YWw7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBQYXJ0T2Y8UmVhbFBhcnQ+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgb3BlcmF0b3IoKSAoY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiB2YWwpIGNvbnN0IHsgcmV0dXJuIHZhbC5yZWFsKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBQYXJ0T2Y8SW1hZ1BhcnQ+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgb3BlcmF0b3IoKSAoY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiB2YWwpIGNvbnN0IHsgcmV0dXJuIHZhbC5pbWFnKCk7IH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRkZULCB0eXBlbmFtZSBYcHJUeXBlLCBpbnQgRkZUUmVzdWx0VHlwZSwgaW50IEZGVERpcj4KK3N0cnVjdCB0cmFpdHM8VGVuc29yRkZUT3A8RkZULCBYcHJUeXBlLCBGRlRSZXN1bHRUeXBlLCBGRlREaXI+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+IHsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBYcHJUcmFpdHM6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OlNjYWxhciBJbnB1dFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxGRlRSZXN1bHRUeXBlID09IFJlYWxQYXJ0IHx8IEZGVFJlc3VsdFR5cGUgPT0gSW1hZ1BhcnQsIFJlYWxTY2FsYXIsIENvbXBsZXhTY2FsYXI+Ojp0eXBlIE91dHB1dFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE5lc3RlZD46OnR5cGUgX05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gWHByVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZGVCwgdHlwZW5hbWUgWHByVHlwZSwgaW50IEZGVFJlc3VsdFR5cGUsIGludCBGRlREaXJlY3Rpb24+CitzdHJ1Y3QgZXZhbDxUZW5zb3JGRlRPcDxGRlQsIFhwclR5cGUsIEZGVFJlc3VsdFR5cGUsIEZGVERpcmVjdGlvbj4sIEVpZ2VuOjpEZW5zZT4geworICB0eXBlZGVmIGNvbnN0IFRlbnNvckZGVE9wPEZGVCwgWHByVHlwZSwgRkZUUmVzdWx0VHlwZSwgRkZURGlyZWN0aW9uPiYgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGRlQsIHR5cGVuYW1lIFhwclR5cGUsIGludCBGRlRSZXN1bHRUeXBlLCBpbnQgRkZURGlyZWN0aW9uPgorc3RydWN0IG5lc3RlZDxUZW5zb3JGRlRPcDxGRlQsIFhwclR5cGUsIEZGVFJlc3VsdFR5cGUsIEZGVERpcmVjdGlvbj4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yRkZUT3A8RkZULCBYcHJUeXBlLCBGRlRSZXN1bHRUeXBlLCBGRlREaXJlY3Rpb24+ID46OnR5cGU+IHsKKyAgdHlwZWRlZiBUZW5zb3JGRlRPcDxGRlQsIFhwclR5cGUsIEZGVFJlc3VsdFR5cGUsIEZGVERpcmVjdGlvbj4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZGVCwgdHlwZW5hbWUgWHByVHlwZSwgaW50IEZGVFJlc3VsdFR5cGUsIGludCBGRlREaXI+CitjbGFzcyBUZW5zb3JGRlRPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckZGVE9wPEZGVCwgWHByVHlwZSwgRkZUUmVzdWx0VHlwZSwgRkZURGlyPiwgUmVhZE9ubHlBY2Nlc3NvcnM+IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yRkZUT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxGRlRSZXN1bHRUeXBlID09IFJlYWxQYXJ0IHx8IEZGVFJlc3VsdFR5cGUgPT0gSW1hZ1BhcnQsIFJlYWxTY2FsYXIsIENvbXBsZXhTY2FsYXI+Ojp0eXBlIE91dHB1dFNjYWxhcjsKKyAgdHlwZWRlZiBPdXRwdXRTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvckZGVE9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yRkZUT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JGRlRPcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRkZUT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgRkZUJiBmZnQpCisgICAgICA6IG1feHByKGV4cHIpLCBtX2ZmdChmZnQpIHt9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgY29uc3QgRkZUJiBmZnQoKSBjb25zdCB7IHJldHVybiBtX2ZmdDsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmIGV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1feHByOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKKyAgY29uc3QgRkZUIG1fZmZ0OworfTsKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlIDx0eXBlbmFtZSBGRlQsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZSwgaW50IEZGVFJlc3VsdFR5cGUsIGludCBGRlREaXI+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckZGVE9wPEZGVCwgQXJnVHlwZSwgRkZUUmVzdWx0VHlwZSwgRkZURGlyPiwgRGV2aWNlPiB7CisgIHR5cGVkZWYgVGVuc29yRkZUT3A8RkZULCBBcmdUeXBlLCBGRlRSZXN1bHRUeXBlLCBGRlREaXI+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMgSW5wdXREaW1lbnNpb25zOworICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U2NhbGFyIElucHV0U2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxGRlRSZXN1bHRUeXBlID09IFJlYWxQYXJ0IHx8IEZGVFJlc3VsdFR5cGUgPT0gSW1hZ1BhcnQsIFJlYWxTY2FsYXIsIENvbXBsZXhTY2FsYXI+Ojp0eXBlIE91dHB1dFNjYWxhcjsKKyAgdHlwZWRlZiBPdXRwdXRTY2FsYXIgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8T3V0cHV0U2NhbGFyLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gdHJ1ZSwKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkgOiBtX2ZmdChvcC5mZnQoKSksIG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSksIG1fZGF0YShOVUxMKSwgbV9kZXZpY2UoZGV2aWNlKSB7CisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2ltcGwuZGltZW5zaW9ucygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICBlaWdlbl9hc3NlcnQoaW5wdXRfZGltc1tpXSA+IDApOworICAgICAgbV9kaW1lbnNpb25zW2ldID0gaW5wdXRfZGltc1tpXTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX3N0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9zdHJpZGVzW2ldID0gbV9zdHJpZGVzW2kgLSAxXSAqIG1fZGltZW5zaW9uc1tpIC0gMV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1fc3RyaWRlc1tOdW1EaW1zIC0gMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX3N0cmlkZXNbaV0gPSBtX3N0cmlkZXNbaSArIDFdICogbV9kaW1lbnNpb25zW2kgKyAxXTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9zaXplID0gbV9kaW1lbnNpb25zLlRvdGFsU2l6ZSgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtX2RpbWVuc2lvbnM7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoT3V0cHV0U2NhbGFyKiBkYXRhKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIGlmIChkYXRhKSB7CisgICAgICBldmFsVG9CdWYoZGF0YSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fZGF0YSA9IChDb2VmZlJldHVyblR5cGUqKW1fZGV2aWNlLmFsbG9jYXRlKHNpemVvZihDb2VmZlJldHVyblR5cGUpICogbV9zaXplKTsKKyAgICAgIGV2YWxUb0J1ZihtX2RhdGEpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgaWYgKG1fZGF0YSkgeworICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShtX2RhdGEpOworICAgICAgbV9kYXRhID0gTlVMTDsKKyAgICB9CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFBhY2tldFJldHVyblR5cGUKKyAgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8UGFja2V0UmV0dXJuVHlwZSwgTG9hZE1vZGU+KG1fZGF0YSArIGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0CisgIGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVuc29yT3BDb3N0KHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCAwLCB2ZWN0b3JpemVkLCBQYWNrZXRTaXplKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisKKyBwcml2YXRlOgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZXZhbFRvQnVmKE91dHB1dFNjYWxhciogZGF0YSkgeworICAgIGNvbnN0IGJvb2wgd3JpdGVfdG9fb3V0ID0gaW50ZXJuYWw6OmlzX3NhbWU8T3V0cHV0U2NhbGFyLCBDb21wbGV4U2NhbGFyPjo6dmFsdWU7CisgICAgQ29tcGxleFNjYWxhciogYnVmID0gd3JpdGVfdG9fb3V0ID8gKENvbXBsZXhTY2FsYXIqKWRhdGEgOiAoQ29tcGxleFNjYWxhciopbV9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKENvbXBsZXhTY2FsYXIpICogbV9zaXplKTsKKworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtX3NpemU7ICsraSkgeworICAgICAgYnVmW2ldID0gTWFrZUNvbXBsZXg8aW50ZXJuYWw6OmlzX3NhbWU8SW5wdXRTY2FsYXIsIFJlYWxTY2FsYXI+Ojp2YWx1ZT4oKShtX2ltcGwuY29lZmYoaSkpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9mZnQuc2l6ZSgpOyArK2kpIHsKKyAgICAgIEluZGV4IGRpbSA9IG1fZmZ0W2ldOworICAgICAgZWlnZW5fYXNzZXJ0KGRpbSA+PSAwICYmIGRpbSA8IE51bURpbXMpOworICAgICAgSW5kZXggbGluZV9sZW4gPSBtX2RpbWVuc2lvbnNbZGltXTsKKyAgICAgIGVpZ2VuX2Fzc2VydChsaW5lX2xlbiA+PSAxKTsKKyAgICAgIENvbXBsZXhTY2FsYXIqIGxpbmVfYnVmID0gKENvbXBsZXhTY2FsYXIqKW1fZGV2aWNlLmFsbG9jYXRlKHNpemVvZihDb21wbGV4U2NhbGFyKSAqIGxpbmVfbGVuKTsKKyAgICAgIGNvbnN0IGJvb2wgaXNfcG93ZXJfb2ZfdHdvID0gaXNQb3dlck9mVHdvKGxpbmVfbGVuKTsKKyAgICAgIGNvbnN0IEluZGV4IGdvb2RfY29tcG9zaXRlID0gaXNfcG93ZXJfb2ZfdHdvID8gMCA6IGZpbmRHb29kQ29tcG9zaXRlKGxpbmVfbGVuKTsKKyAgICAgIGNvbnN0IEluZGV4IGxvZ19sZW4gPSBpc19wb3dlcl9vZl90d28gPyBnZXRMb2cyKGxpbmVfbGVuKSA6IGdldExvZzIoZ29vZF9jb21wb3NpdGUpOworCisgICAgICBDb21wbGV4U2NhbGFyKiBhID0gaXNfcG93ZXJfb2ZfdHdvID8gTlVMTCA6IChDb21wbGV4U2NhbGFyKiltX2RldmljZS5hbGxvY2F0ZShzaXplb2YoQ29tcGxleFNjYWxhcikgKiBnb29kX2NvbXBvc2l0ZSk7CisgICAgICBDb21wbGV4U2NhbGFyKiBiID0gaXNfcG93ZXJfb2ZfdHdvID8gTlVMTCA6IChDb21wbGV4U2NhbGFyKiltX2RldmljZS5hbGxvY2F0ZShzaXplb2YoQ29tcGxleFNjYWxhcikgKiBnb29kX2NvbXBvc2l0ZSk7CisgICAgICBDb21wbGV4U2NhbGFyKiBwb3Nfal9iYXNlX3Bvd2VyZWQgPSBpc19wb3dlcl9vZl90d28gPyBOVUxMIDogKENvbXBsZXhTY2FsYXIqKW1fZGV2aWNlLmFsbG9jYXRlKHNpemVvZihDb21wbGV4U2NhbGFyKSAqIChsaW5lX2xlbiArIDEpKTsKKyAgICAgIGlmICghaXNfcG93ZXJfb2ZfdHdvKSB7CisgICAgICAgIC8vIENvbXB1dGUgdHdpZGRsZSBmYWN0b3JzCisgICAgICAgIC8vICAgdF9uID0gZXhwKHNxcnQoLTEpICogcGkgKiBuXjIgLyBsaW5lX2xlbikKKyAgICAgICAgLy8gZm9yIG4gPSAwLCAxLC4uLiwgbGluZV9sZW4tMS4KKyAgICAgICAgLy8gRm9yIG4gPiAyIHdlIHVzZSB0aGUgcmVjdXJyZW5jZSB0X24gPSB0X3tuLTF9XjIgLyB0X3tuLTJ9ICogdF8xXjIKKyAgICAgICAgcG9zX2pfYmFzZV9wb3dlcmVkWzBdID0gQ29tcGxleFNjYWxhcigxLCAwKTsKKyAgICAgICAgaWYgKGxpbmVfbGVuID4gMSkgeworICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgcGlfb3Zlcl9sZW4oRUlHRU5fUEkgLyBsaW5lX2xlbik7CisgICAgICAgICAgY29uc3QgQ29tcGxleFNjYWxhciBwb3Nfal9iYXNlID0gQ29tcGxleFNjYWxhcigKKwkgICAgICAgc3RkOjpjb3MocGlfb3Zlcl9sZW4pLCBzdGQ6OnNpbihwaV9vdmVyX2xlbikpOworICAgICAgICAgIHBvc19qX2Jhc2VfcG93ZXJlZFsxXSA9IHBvc19qX2Jhc2U7CisgICAgICAgICAgaWYgKGxpbmVfbGVuID4gMikgeworICAgICAgICAgICAgY29uc3QgQ29tcGxleFNjYWxhciBwb3Nfal9iYXNlX3NxID0gcG9zX2pfYmFzZSAqIHBvc19qX2Jhc2U7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMjsgaiA8IGxpbmVfbGVuICsgMTsgKytqKSB7CisgICAgICAgICAgICAgIHBvc19qX2Jhc2VfcG93ZXJlZFtqXSA9IHBvc19qX2Jhc2VfcG93ZXJlZFtqIC0gMV0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Nfal9iYXNlX3Bvd2VyZWRbaiAtIDFdIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zX2pfYmFzZV9wb3dlcmVkW2ogLSAyXSAqIHBvc19qX2Jhc2Vfc3E7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoSW5kZXggcGFydGlhbF9pbmRleCA9IDA7IHBhcnRpYWxfaW5kZXggPCBtX3NpemUgLyBsaW5lX2xlbjsgKytwYXJ0aWFsX2luZGV4KSB7CisgICAgICAgIGNvbnN0IEluZGV4IGJhc2Vfb2Zmc2V0ID0gZ2V0QmFzZU9mZnNldEZyb21JbmRleChwYXJ0aWFsX2luZGV4LCBkaW0pOworCisgICAgICAgIC8vIGdldCBkYXRhIGludG8gbGluZV9idWYKKyAgICAgICAgY29uc3QgSW5kZXggc3RyaWRlID0gbV9zdHJpZGVzW2RpbV07CisgICAgICAgIGlmIChzdHJpZGUgPT0gMSkgeworICAgICAgICAgIG1lbWNweShsaW5lX2J1ZiwgJmJ1ZltiYXNlX29mZnNldF0sIGxpbmVfbGVuKnNpemVvZihDb21wbGV4U2NhbGFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgSW5kZXggb2Zmc2V0ID0gYmFzZV9vZmZzZXQ7CisgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaW5lX2xlbjsgKytqLCBvZmZzZXQgKz0gc3RyaWRlKSB7CisgICAgICAgICAgICBsaW5lX2J1ZltqXSA9IGJ1ZltvZmZzZXRdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3NzIHRoZSBsaW5lCisgICAgICAgIGlmIChpc19wb3dlcl9vZl90d28pIHsKKyAgICAgICAgICBwcm9jZXNzRGF0YUxpbmVDb29sZXlUdWtleShsaW5lX2J1ZiwgbGluZV9sZW4sIGxvZ19sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHByb2Nlc3NEYXRhTGluZUJsdWVzdGVpbihsaW5lX2J1ZiwgbGluZV9sZW4sIGdvb2RfY29tcG9zaXRlLCBsb2dfbGVuLCBhLCBiLCBwb3Nfal9iYXNlX3Bvd2VyZWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgYmFjaworICAgICAgICBpZiAoRkZURGlyID09IEZGVF9GT1JXQVJEICYmIHN0cmlkZSA9PSAxKSB7CisgICAgICAgICAgbWVtY3B5KCZidWZbYmFzZV9vZmZzZXRdLCBsaW5lX2J1ZiwgbGluZV9sZW4qc2l6ZW9mKENvbXBsZXhTY2FsYXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJbmRleCBvZmZzZXQgPSBiYXNlX29mZnNldDsKKyAgICAgICAgICBjb25zdCBDb21wbGV4U2NhbGFyIGRpdl9mYWN0b3IgPSAgQ29tcGxleFNjYWxhcigxLjAgLyBsaW5lX2xlbiwgMCk7CisgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaW5lX2xlbjsgKytqLCBvZmZzZXQgKz0gc3RyaWRlKSB7CisgICAgICAgICAgICAgYnVmW29mZnNldF0gPSAoRkZURGlyID09IEZGVF9GT1JXQVJEKSA/IGxpbmVfYnVmW2pdIDogbGluZV9idWZbal0gKiBkaXZfZmFjdG9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShsaW5lX2J1Zik7CisgICAgICBpZiAoIWlzX3Bvd2VyX29mX3R3bykgeworICAgICAgICBtX2RldmljZS5kZWFsbG9jYXRlKGEpOworICAgICAgICBtX2RldmljZS5kZWFsbG9jYXRlKGIpOworICAgICAgICBtX2RldmljZS5kZWFsbG9jYXRlKHBvc19qX2Jhc2VfcG93ZXJlZCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYoIXdyaXRlX3RvX291dCkgeworICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKSB7CisgICAgICAgIGRhdGFbaV0gPSBQYXJ0T2Y8RkZUUmVzdWx0VHlwZT4oKShidWZbaV0pOworICAgICAgfQorICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShidWYpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RhdGljIGJvb2wgaXNQb3dlck9mVHdvKEluZGV4IHgpIHsKKyAgICBlaWdlbl9hc3NlcnQoeCA+IDApOworICAgIHJldHVybiAhKHggJiAoeCAtIDEpKTsKKyAgfQorCisgIC8vIFRoZSBjb21wb3NpdGUgbnVtYmVyIGZvciBwYWRkaW5nLCB1c2VkIGluIEJsdWVzdGVpbidzIEZGVCBhbGdvcml0aG0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBzdGF0aWMgSW5kZXggZmluZEdvb2RDb21wb3NpdGUoSW5kZXggbikgeworICAgIEluZGV4IGkgPSAyOworICAgIHdoaWxlIChpIDwgMiAqIG4gLSAxKSBpICo9IDI7CisgICAgcmV0dXJuIGk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0YXRpYyBJbmRleCBnZXRMb2cyKEluZGV4IG0pIHsKKyAgICBJbmRleCBsb2cybSA9IDA7CisgICAgd2hpbGUgKG0gPj49IDEpIGxvZzJtKys7CisgICAgcmV0dXJuIGxvZzJtOworICB9CisKKyAgLy8gQ2FsbCBDb29sZXkgVHVrZXkgYWxnb3JpdGhtIGRpcmVjdGx5LCBkYXRhIGxlbmd0aCBtdXN0IGJlIHBvd2VyIG9mIDIKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByb2Nlc3NEYXRhTGluZUNvb2xleVR1a2V5KENvbXBsZXhTY2FsYXIqIGxpbmVfYnVmLCBJbmRleCBsaW5lX2xlbiwgSW5kZXggbG9nX2xlbikgeworICAgIGVpZ2VuX2Fzc2VydChpc1Bvd2VyT2ZUd28obGluZV9sZW4pKTsKKyAgICBzY3JhbWJsZV9GRlQobGluZV9idWYsIGxpbmVfbGVuKTsKKyAgICBjb21wdXRlXzFEX0J1dHRlcmZseTxGRlREaXI+KGxpbmVfYnVmLCBsaW5lX2xlbiwgbG9nX2xlbik7CisgIH0KKworICAvLyBDYWxsIEJsdWVzdGVpbidzIEZGVCBhbGdvcml0aG0sIG0gaXMgYSBnb29kIGNvbXBvc2l0ZSBudW1iZXIgZ3JlYXRlciB0aGFuICgyICogbiAtIDEpLCB1c2VkIGFzIHRoZSBwYWRkaW5nIGxlbmd0aAorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJvY2Vzc0RhdGFMaW5lQmx1ZXN0ZWluKENvbXBsZXhTY2FsYXIqIGxpbmVfYnVmLCBJbmRleCBsaW5lX2xlbiwgSW5kZXggZ29vZF9jb21wb3NpdGUsIEluZGV4IGxvZ19sZW4sIENvbXBsZXhTY2FsYXIqIGEsIENvbXBsZXhTY2FsYXIqIGIsIGNvbnN0IENvbXBsZXhTY2FsYXIqIHBvc19qX2Jhc2VfcG93ZXJlZCkgeworICAgIEluZGV4IG4gPSBsaW5lX2xlbjsKKyAgICBJbmRleCBtID0gZ29vZF9jb21wb3NpdGU7CisgICAgQ29tcGxleFNjYWxhciogZGF0YSA9IGxpbmVfYnVmOworCisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgaWYoRkZURGlyID09IEZGVF9GT1JXQVJEKSB7CisgICAgICAgIGFbaV0gPSBkYXRhW2ldICogbnVtZXh0Ojpjb25qKHBvc19qX2Jhc2VfcG93ZXJlZFtpXSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYVtpXSA9IGRhdGFbaV0gKiBwb3Nfal9iYXNlX3Bvd2VyZWRbaV07CisgICAgICB9CisgICAgfQorICAgIGZvciAoSW5kZXggaSA9IG47IGkgPCBtOyArK2kpIHsKKyAgICAgIGFbaV0gPSBDb21wbGV4U2NhbGFyKDAsIDApOworICAgIH0KKworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgIGlmKEZGVERpciA9PSBGRlRfRk9SV0FSRCkgeworICAgICAgICBiW2ldID0gcG9zX2pfYmFzZV9wb3dlcmVkW2ldOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJbaV0gPSBudW1leHQ6OmNvbmoocG9zX2pfYmFzZV9wb3dlcmVkW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChJbmRleCBpID0gbjsgaSA8IG0gLSBuOyArK2kpIHsKKyAgICAgIGJbaV0gPSBDb21wbGV4U2NhbGFyKDAsIDApOworICAgIH0KKyAgICBmb3IgKEluZGV4IGkgPSBtIC0gbjsgaSA8IG07ICsraSkgeworICAgICAgaWYoRkZURGlyID09IEZGVF9GT1JXQVJEKSB7CisgICAgICAgIGJbaV0gPSBwb3Nfal9iYXNlX3Bvd2VyZWRbbS1pXTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBiW2ldID0gbnVtZXh0Ojpjb25qKHBvc19qX2Jhc2VfcG93ZXJlZFttLWldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzY3JhbWJsZV9GRlQoYSwgbSk7CisgICAgY29tcHV0ZV8xRF9CdXR0ZXJmbHk8RkZUX0ZPUldBUkQ+KGEsIG0sIGxvZ19sZW4pOworCisgICAgc2NyYW1ibGVfRkZUKGIsIG0pOworICAgIGNvbXB1dGVfMURfQnV0dGVyZmx5PEZGVF9GT1JXQVJEPihiLCBtLCBsb2dfbGVuKTsKKworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtOyArK2kpIHsKKyAgICAgIGFbaV0gKj0gYltpXTsKKyAgICB9CisKKyAgICBzY3JhbWJsZV9GRlQoYSwgbSk7CisgICAgY29tcHV0ZV8xRF9CdXR0ZXJmbHk8RkZUX1JFVkVSU0U+KGEsIG0sIGxvZ19sZW4pOworCisgICAgLy9EbyB0aGUgc2NhbGluZyBhZnRlciBpZmZ0CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG07ICsraSkgeworICAgICAgYVtpXSAvPSBtOworICAgIH0KKworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgIGlmKEZGVERpciA9PSBGRlRfRk9SV0FSRCkgeworICAgICAgICBkYXRhW2ldID0gYVtpXSAqIG51bWV4dDo6Y29uaihwb3Nfal9iYXNlX3Bvd2VyZWRbaV0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGRhdGFbaV0gPSBhW2ldICogcG9zX2pfYmFzZV9wb3dlcmVkW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgc3RhdGljIHZvaWQgc2NyYW1ibGVfRkZUKENvbXBsZXhTY2FsYXIqIGRhdGEsIEluZGV4IG4pIHsKKyAgICBlaWdlbl9hc3NlcnQoaXNQb3dlck9mVHdvKG4pKTsKKyAgICBJbmRleCBqID0gMTsKKyAgICBmb3IgKEluZGV4IGkgPSAxOyBpIDwgbjsgKytpKXsKKyAgICAgIGlmIChqID4gaSkgeworICAgICAgICBzdGQ6OnN3YXAoZGF0YVtqLTFdLCBkYXRhW2ktMV0pOworICAgICAgfQorICAgICAgSW5kZXggbSA9IG4gPj4gMTsKKyAgICAgIHdoaWxlIChtID49IDIgJiYgaiA+IG0pIHsKKyAgICAgICAgaiAtPSBtOworICAgICAgICBtID4+PSAxOworICAgICAgfQorICAgICAgaiArPSBtOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxpbnQgRGlyPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYnV0dGVyZmx5XzIoQ29tcGxleFNjYWxhciogZGF0YSkgeworICAgIENvbXBsZXhTY2FsYXIgdG1wID0gZGF0YVsxXTsKKyAgICBkYXRhWzFdID0gZGF0YVswXSAtIGRhdGFbMV07CisgICAgZGF0YVswXSArPSB0bXA7CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IERpcj4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGJ1dHRlcmZseV80KENvbXBsZXhTY2FsYXIqIGRhdGEpIHsKKyAgICBDb21wbGV4U2NhbGFyIHRtcFs0XTsKKyAgICB0bXBbMF0gPSBkYXRhWzBdICsgZGF0YVsxXTsKKyAgICB0bXBbMV0gPSBkYXRhWzBdIC0gZGF0YVsxXTsKKyAgICB0bXBbMl0gPSBkYXRhWzJdICsgZGF0YVszXTsKKyAgICBpZiAoRGlyID09IEZGVF9GT1JXQVJEKSB7CisgICAgICB0bXBbM10gPSBDb21wbGV4U2NhbGFyKDAuMCwgLTEuMCkgKiAoZGF0YVsyXSAtIGRhdGFbM10pOworICAgIH0gZWxzZSB7CisgICAgICB0bXBbM10gPSBDb21wbGV4U2NhbGFyKDAuMCwgMS4wKSAqIChkYXRhWzJdIC0gZGF0YVszXSk7CisgICAgfQorICAgIGRhdGFbMF0gPSB0bXBbMF0gKyB0bXBbMl07CisgICAgZGF0YVsxXSA9IHRtcFsxXSArIHRtcFszXTsKKyAgICBkYXRhWzJdID0gdG1wWzBdIC0gdG1wWzJdOworICAgIGRhdGFbM10gPSB0bXBbMV0gLSB0bXBbM107CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IERpcj4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGJ1dHRlcmZseV84KENvbXBsZXhTY2FsYXIqIGRhdGEpIHsKKyAgICBDb21wbGV4U2NhbGFyIHRtcF8xWzhdOworICAgIENvbXBsZXhTY2FsYXIgdG1wXzJbOF07CisKKyAgICB0bXBfMVswXSA9IGRhdGFbMF0gKyBkYXRhWzFdOworICAgIHRtcF8xWzFdID0gZGF0YVswXSAtIGRhdGFbMV07CisgICAgdG1wXzFbMl0gPSBkYXRhWzJdICsgZGF0YVszXTsKKyAgICBpZiAoRGlyID09IEZGVF9GT1JXQVJEKSB7CisgICAgICB0bXBfMVszXSA9IChkYXRhWzJdIC0gZGF0YVszXSkgKiBDb21wbGV4U2NhbGFyKDAsIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wXzFbM10gPSAoZGF0YVsyXSAtIGRhdGFbM10pICogQ29tcGxleFNjYWxhcigwLCAxKTsKKyAgICB9CisgICAgdG1wXzFbNF0gPSBkYXRhWzRdICsgZGF0YVs1XTsKKyAgICB0bXBfMVs1XSA9IGRhdGFbNF0gLSBkYXRhWzVdOworICAgIHRtcF8xWzZdID0gZGF0YVs2XSArIGRhdGFbN107CisgICAgaWYgKERpciA9PSBGRlRfRk9SV0FSRCkgeworICAgICAgdG1wXzFbN10gPSAoZGF0YVs2XSAtIGRhdGFbN10pICogQ29tcGxleFNjYWxhcigwLCAtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcF8xWzddID0gKGRhdGFbNl0gLSBkYXRhWzddKSAqIENvbXBsZXhTY2FsYXIoMCwgMSk7CisgICAgfQorICAgIHRtcF8yWzBdID0gdG1wXzFbMF0gKyB0bXBfMVsyXTsKKyAgICB0bXBfMlsxXSA9IHRtcF8xWzFdICsgdG1wXzFbM107CisgICAgdG1wXzJbMl0gPSB0bXBfMVswXSAtIHRtcF8xWzJdOworICAgIHRtcF8yWzNdID0gdG1wXzFbMV0gLSB0bXBfMVszXTsKKyAgICB0bXBfMls0XSA9IHRtcF8xWzRdICsgdG1wXzFbNl07CisvLyBTUVJUMkRJVjIgPSBzcXJ0KDIpLzIKKyNkZWZpbmUgU1FSVDJESVYyIDAuNzA3MTA2NzgxMTg2NTQ3NgorICAgIGlmIChEaXIgPT0gRkZUX0ZPUldBUkQpIHsKKyAgICAgIHRtcF8yWzVdID0gKHRtcF8xWzVdICsgdG1wXzFbN10pICogQ29tcGxleFNjYWxhcihTUVJUMkRJVjIsIC1TUVJUMkRJVjIpOworICAgICAgdG1wXzJbNl0gPSAodG1wXzFbNF0gLSB0bXBfMVs2XSkgKiBDb21wbGV4U2NhbGFyKDAsIC0xKTsKKyAgICAgIHRtcF8yWzddID0gKHRtcF8xWzVdIC0gdG1wXzFbN10pICogQ29tcGxleFNjYWxhcigtU1FSVDJESVYyLCAtU1FSVDJESVYyKTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wXzJbNV0gPSAodG1wXzFbNV0gKyB0bXBfMVs3XSkgKiBDb21wbGV4U2NhbGFyKFNRUlQyRElWMiwgU1FSVDJESVYyKTsKKyAgICAgIHRtcF8yWzZdID0gKHRtcF8xWzRdIC0gdG1wXzFbNl0pICogQ29tcGxleFNjYWxhcigwLCAxKTsKKyAgICAgIHRtcF8yWzddID0gKHRtcF8xWzVdIC0gdG1wXzFbN10pICogQ29tcGxleFNjYWxhcigtU1FSVDJESVYyLCBTUVJUMkRJVjIpOworICAgIH0KKyAgICBkYXRhWzBdID0gdG1wXzJbMF0gKyB0bXBfMls0XTsKKyAgICBkYXRhWzFdID0gdG1wXzJbMV0gKyB0bXBfMls1XTsKKyAgICBkYXRhWzJdID0gdG1wXzJbMl0gKyB0bXBfMls2XTsKKyAgICBkYXRhWzNdID0gdG1wXzJbM10gKyB0bXBfMls3XTsKKyAgICBkYXRhWzRdID0gdG1wXzJbMF0gLSB0bXBfMls0XTsKKyAgICBkYXRhWzVdID0gdG1wXzJbMV0gLSB0bXBfMls1XTsKKyAgICBkYXRhWzZdID0gdG1wXzJbMl0gLSB0bXBfMls2XTsKKyAgICBkYXRhWzddID0gdG1wXzJbM10gLSB0bXBfMls3XTsKKyAgfQorCisgIHRlbXBsYXRlIDxpbnQgRGlyPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYnV0dGVyZmx5XzFEX21lcmdlKAorICAgICAgQ29tcGxleFNjYWxhciogZGF0YSwgSW5kZXggbiwgSW5kZXggbl9wb3dlcl9vZl8yKSB7CisgICAgLy8gT3JpZ2luYWwgY29kZToKKyAgICAvLyBSZWFsU2NhbGFyIHd0ZW1wID0gc3RkOjpzaW4oTV9QSS9uKTsKKyAgICAvLyBSZWFsU2NhbGFyIHdwaSA9ICAtc3RkOjpzaW4oMiAqIE1fUEkvbik7CisgICAgY29uc3QgUmVhbFNjYWxhciB3dGVtcCA9IG1fc2luX1BJX2Rpdl9uX0xVVFtuX3Bvd2VyX29mXzJdOworICAgIGNvbnN0IFJlYWxTY2FsYXIgd3BpID0gKERpciA9PSBGRlRfRk9SV0FSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fbWludXNfc2luXzJfUElfZGl2X25fTFVUW25fcG93ZXJfb2ZfMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1tX21pbnVzX3Npbl8yX1BJX2Rpdl9uX0xVVFtuX3Bvd2VyX29mXzJdOworCisgICAgY29uc3QgQ29tcGxleFNjYWxhciB3cCh3dGVtcCwgd3BpKTsKKyAgICBjb25zdCBDb21wbGV4U2NhbGFyIHdwX29uZSA9IHdwICsgQ29tcGxleFNjYWxhcigxLCAwKTsKKyAgICBjb25zdCBDb21wbGV4U2NhbGFyIHdwX29uZV8yID0gd3Bfb25lICogd3Bfb25lOworICAgIGNvbnN0IENvbXBsZXhTY2FsYXIgd3Bfb25lXzMgPSB3cF9vbmVfMiAqIHdwX29uZTsKKyAgICBjb25zdCBDb21wbGV4U2NhbGFyIHdwX29uZV80ID0gd3Bfb25lXzMgKiB3cF9vbmU7CisgICAgY29uc3QgSW5kZXggbjIgPSBuIC8gMjsKKyAgICBDb21wbGV4U2NhbGFyIHcoMS4wLCAwLjApOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBuMjsgaSArPSA0KSB7CisgICAgICAgQ29tcGxleFNjYWxhciB0ZW1wMChkYXRhW2kgKyBuMl0gKiB3KTsKKyAgICAgICBDb21wbGV4U2NhbGFyIHRlbXAxKGRhdGFbaSArIDEgKyBuMl0gKiB3ICogd3Bfb25lKTsKKyAgICAgICBDb21wbGV4U2NhbGFyIHRlbXAyKGRhdGFbaSArIDIgKyBuMl0gKiB3ICogd3Bfb25lXzIpOworICAgICAgIENvbXBsZXhTY2FsYXIgdGVtcDMoZGF0YVtpICsgMyArIG4yXSAqIHcgKiB3cF9vbmVfMyk7CisgICAgICAgdyA9IHcgKiB3cF9vbmVfNDsKKworICAgICAgIGRhdGFbaSArIG4yXSA9IGRhdGFbaV0gLSB0ZW1wMDsKKyAgICAgICBkYXRhW2ldICs9IHRlbXAwOworCisgICAgICAgZGF0YVtpICsgMSArIG4yXSA9IGRhdGFbaSArIDFdIC0gdGVtcDE7CisgICAgICAgZGF0YVtpICsgMV0gKz0gdGVtcDE7CisKKyAgICAgICBkYXRhW2kgKyAyICsgbjJdID0gZGF0YVtpICsgMl0gLSB0ZW1wMjsKKyAgICAgICBkYXRhW2kgKyAyXSArPSB0ZW1wMjsKKworICAgICAgIGRhdGFbaSArIDMgKyBuMl0gPSBkYXRhW2kgKyAzXSAtIHRlbXAzOworICAgICAgIGRhdGFbaSArIDNdICs9IHRlbXAzOworICAgIH0KKyAgfQorCisgdGVtcGxhdGUgPGludCBEaXI+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb21wdXRlXzFEX0J1dHRlcmZseSgKKyAgICAgIENvbXBsZXhTY2FsYXIqIGRhdGEsIEluZGV4IG4sIEluZGV4IG5fcG93ZXJfb2ZfMikgeworICAgIGVpZ2VuX2Fzc2VydChpc1Bvd2VyT2ZUd28obikpOworICAgIGlmIChuID4gOCkgeworICAgICAgY29tcHV0ZV8xRF9CdXR0ZXJmbHk8RGlyPihkYXRhLCBuIC8gMiwgbl9wb3dlcl9vZl8yIC0gMSk7CisgICAgICBjb21wdXRlXzFEX0J1dHRlcmZseTxEaXI+KGRhdGEgKyBuIC8gMiwgbiAvIDIsIG5fcG93ZXJfb2ZfMiAtIDEpOworICAgICAgYnV0dGVyZmx5XzFEX21lcmdlPERpcj4oZGF0YSwgbiwgbl9wb3dlcl9vZl8yKTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gOCkgeworICAgICAgYnV0dGVyZmx5Xzg8RGlyPihkYXRhKTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gNCkgeworICAgICAgYnV0dGVyZmx5XzQ8RGlyPihkYXRhKTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gMikgeworICAgICAgYnV0dGVyZmx5XzI8RGlyPihkYXRhKTsKKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGdldEJhc2VPZmZzZXRGcm9tSW5kZXgoSW5kZXggaW5kZXgsIEluZGV4IG9taXR0ZWRfZGltKSBjb25zdCB7CisgICAgSW5kZXggcmVzdWx0ID0gMDsKKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IG9taXR0ZWRfZGltOyAtLWkpIHsKKyAgICAgICAgY29uc3QgSW5kZXggcGFydGlhbF9tX3N0cmlkZSA9IG1fc3RyaWRlc1tpXSAvIG1fZGltZW5zaW9uc1tvbWl0dGVkX2RpbV07CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gcGFydGlhbF9tX3N0cmlkZTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogcGFydGlhbF9tX3N0cmlkZTsKKyAgICAgICAgcmVzdWx0ICs9IGlkeCAqIG1fc3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSBpbmRleDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgb21pdHRlZF9kaW07ICsraSkgeworICAgICAgICBjb25zdCBJbmRleCBwYXJ0aWFsX21fc3RyaWRlID0gbV9zdHJpZGVzW2ldIC8gbV9kaW1lbnNpb25zW29taXR0ZWRfZGltXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBwYXJ0aWFsX21fc3RyaWRlOworICAgICAgICBpbmRleCAtPSBpZHggKiBwYXJ0aWFsX21fc3RyaWRlOworICAgICAgICByZXN1bHQgKz0gaWR4ICogbV9zdHJpZGVzW2ldOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IGluZGV4OworICAgIH0KKyAgICAvLyBWYWx1ZSBvZiBpbmRleF9jb29yZHNbb21pdHRlZF9kaW1dIGlzIG5vdCBkZXRlcm1pbmVkIHRvIHRoaXMgc3RlcAorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGdldEluZGV4RnJvbU9mZnNldChJbmRleCBiYXNlLCBJbmRleCBvbWl0dGVkX2RpbSwgSW5kZXggb2Zmc2V0KSBjb25zdCB7CisgICAgSW5kZXggcmVzdWx0ID0gYmFzZSArIG9mZnNldCAqIG1fc3RyaWRlc1tvbWl0dGVkX2RpbV0gOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworIHByb3RlY3RlZDoKKyAgSW5kZXggbV9zaXplOworICBjb25zdCBGRlQmIG1fZmZ0OworICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fc3RyaWRlczsKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBDb2VmZlJldHVyblR5cGUqIG1fZGF0YTsKKyAgY29uc3QgRGV2aWNlJiBtX2RldmljZTsKKworICAvLyBUaGlzIHdpbGwgc3VwcG9ydCBhIG1heGltdW0gRkZUIHNpemUgb2YgMl4zMiBmb3IgZWFjaCBkaW1lbnNpb24KKyAgLy8gbV9zaW5fUElfZGl2X25fTFVUW2ldID0gKC0yKSAqIHN0ZDo6c2luKE1fUEkgLyBzdGQ6OnBvdygyLGkpKSBeIDI7CisgIGNvbnN0IFJlYWxTY2FsYXIgbV9zaW5fUElfZGl2X25fTFVUWzMyXSA9IHsKKyAgICBSZWFsU2NhbGFyKDAuMCksCisgICAgUmVhbFNjYWxhcigtMiksCisgICAgUmVhbFNjYWxhcigtMC45OTk5OTk5OTk5OTk5OTkpLAorICAgIFJlYWxTY2FsYXIoLTAuMjkyODkzMjE4ODEzNDUzKSwKKyAgICBSZWFsU2NhbGFyKC0wLjA3NjEyMDQ2NzQ4ODcxMzApLAorICAgIFJlYWxTY2FsYXIoLTAuMDE5MjE0NzE5NTk2NzY5NiksCisgICAgUmVhbFNjYWxhcigtMC4wMDQ4MTUyNzMzMjc4MDMxMSksCisgICAgUmVhbFNjYWxhcigtMC4wMDEyMDQ1NDM3OTQ4Mjc2MSksCisgICAgUmVhbFNjYWxhcigtMy4wMTE4MTMwMzc5NTc3OWUtMDQpLAorICAgIFJlYWxTY2FsYXIoLTcuNTI5ODE2MDg1NTQ1OTJlLTA1KSwKKyAgICBSZWFsU2NhbGFyKC0xLjg4MjQ3MTczOTg4NTc0ZS0wNSksCisgICAgUmVhbFNjYWxhcigtNC43MDYxOTA0MjM4Mjg1MmUtMDYpLAorICAgIFJlYWxTY2FsYXIoLTEuMTc2NTQ4Mjk4MDkwMDdlLTA2KSwKKyAgICBSZWFsU2NhbGFyKC0yLjk0MTM3MTE3NzgwODQwZS0wNyksCisgICAgUmVhbFNjYWxhcigtNy4zNTM0MjgyMTQ4ODU1MGUtMDgpLAorICAgIFJlYWxTY2FsYXIoLTEuODM4MzU3MDcwNjE5MTZlLTA4KSwKKyAgICBSZWFsU2NhbGFyKC00LjU5NTg5MjY4NzEwOTAzZS0wOSksCisgICAgUmVhbFNjYWxhcigtMS4xNDg5NzMxNzI0MzczMmUtMDkpLAorICAgIFJlYWxTY2FsYXIoLTIuODcyNDMyOTMxNTA1ODZlLTEwKSwKKyAgICBSZWFsU2NhbGFyKCAtNy4xODEwODIzMjkwMjI1MGUtMTEpLAorICAgIFJlYWxTY2FsYXIoLTEuNzk1MjcwNTgyMjcxNzRlLTExKSwKKyAgICBSZWFsU2NhbGFyKC00LjQ4ODE3NjQ1NTY4OTQxZS0xMiksCisgICAgUmVhbFNjYWxhcigtMS4xMjIwNDQxMTM5MjI5OGUtMTIpLAorICAgIFJlYWxTY2FsYXIoLTIuODA1MTEwMjg0ODA3ODVlLTEzKSwKKyAgICBSZWFsU2NhbGFyKC03LjAxMjc3NTcxMjAxOTg1ZS0xNCksCisgICAgUmVhbFNjYWxhcigtMS43NTMxOTM5MjgwMDQ5OGUtMTQpLAorICAgIFJlYWxTY2FsYXIoLTQuMzgyOTg0ODIwMDEyNDdlLTE1KSwKKyAgICBSZWFsU2NhbGFyKC0xLjA5NTc0NjIwNTAwMzEyZS0xNSksCisgICAgUmVhbFNjYWxhcigtMi43MzkzNjU1MTI1MDc4MWUtMTYpLAorICAgIFJlYWxTY2FsYXIoLTYuODQ4NDEzNzgxMjY5NDllLTE3KSwKKyAgICBSZWFsU2NhbGFyKC0xLjcxMjEwMzQ0NTMxNzM3ZS0xNyksCisgICAgUmVhbFNjYWxhcigtNC4yODAyNTg2MTMyOTM0M2UtMTgpCisgIH07CisKKyAgLy8gbV9taW51c19zaW5fMl9QSV9kaXZfbl9MVVRbaV0gPSAtc3RkOjpzaW4oMiAqIE1fUEkgLyBzdGQ6OnBvdygyLGkpKTsKKyAgY29uc3QgUmVhbFNjYWxhciBtX21pbnVzX3Npbl8yX1BJX2Rpdl9uX0xVVFszMl0gPSB7CisgICAgUmVhbFNjYWxhcigwLjApLAorICAgIFJlYWxTY2FsYXIoMC4wKSwKKyAgICBSZWFsU2NhbGFyKC0xLjAwMDAwMDAwMDAwMDAwZSswMCksCisgICAgUmVhbFNjYWxhcigtNy4wNzEwNjc4MTE4NjU0N2UtMDEpLAorICAgIFJlYWxTY2FsYXIoLTMuODI2ODM0MzIzNjUwOTBlLTAxKSwKKyAgICBSZWFsU2NhbGFyKC0xLjk1MDkwMzIyMDE2MTI4ZS0wMSksCisgICAgUmVhbFNjYWxhcigtOS44MDE3MTQwMzI5NTYwNmUtMDIpLAorICAgIFJlYWxTY2FsYXIoLTQuOTA2NzY3NDMyNzQxODBlLTAyKSwKKyAgICBSZWFsU2NhbGFyKC0yLjQ1NDEyMjg1MjI5MTIzZS0wMiksCisgICAgUmVhbFNjYWxhcigtMS4yMjcxNTM4Mjg1NzE5OWUtMDIpLAorICAgIFJlYWxTY2FsYXIoLTYuMTM1ODg0NjQ5MTU0NDhlLTAzKSwKKyAgICBSZWFsU2NhbGFyKC0zLjA2Nzk1Njc2Mjk2NTk4ZS0wMyksCisgICAgUmVhbFNjYWxhcigtMS41MzM5ODAxODYyODQ3N2UtMDMpLAorICAgIFJlYWxTY2FsYXIoLTcuNjY5OTAzMTg3NDI3MDRlLTA0KSwKKyAgICBSZWFsU2NhbGFyKC0zLjgzNDk1MTg3NTcxMzk2ZS0wNCksCisgICAgUmVhbFNjYWxhcigtMS45MTc0NzU5NzMxMDcwM2UtMDQpLAorICAgIFJlYWxTY2FsYXIoLTkuNTg3Mzc5OTA5NTk3NzNlLTA1KSwKKyAgICBSZWFsU2NhbGFyKC00Ljc5MzY4OTk2MDMwNjY5ZS0wNSksCisgICAgUmVhbFNjYWxhcigtMi4zOTY4NDQ5ODA4NDE4MmUtMDUpLAorICAgIFJlYWxTY2FsYXIoLTEuMTk4NDIyNDkwNTA2OTdlLTA1KSwKKyAgICBSZWFsU2NhbGFyKC01Ljk5MjExMjQ1MjY0MjQzZS0wNiksCisgICAgUmVhbFNjYWxhcigtMi45OTYwNTYyMjYzMzQ2NmUtMDYpLAorICAgIFJlYWxTY2FsYXIoLTEuNDk4MDI4MTEzMTY5MDFlLTA2KSwKKyAgICBSZWFsU2NhbGFyKC03LjQ5MDE0MDU2NTg0NzE2ZS0wNyksCisgICAgUmVhbFNjYWxhcigtMy43NDUwNzAyODI5MjM4NGUtMDcpLAorICAgIFJlYWxTY2FsYXIoLTEuODcyNTM1MTQxNDYxOTVlLTA3KSwKKyAgICBSZWFsU2NhbGFyKC05LjM2MjY3NTcwNzMwOTgxZS0wOCksCisgICAgUmVhbFNjYWxhcigtNC42ODEzMzc4NTM2NTQ5MWUtMDgpLAorICAgIFJlYWxTY2FsYXIoLTIuMzQwNjY4OTI2ODI3NDZlLTA4KSwKKyAgICBSZWFsU2NhbGFyKC0xLjE3MDMzNDQ2MzQxMzczZS0wOCksCisgICAgUmVhbFNjYWxhcigtNS44NTE2NzIzMTcwNjg2NGUtMDkpLAorICAgIFJlYWxTY2FsYXIoLTIuOTI1ODM2MTU4NTM0MzJlLTA5KQorICB9OworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX0hBU19DT05TVEVYUFIKKworCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRkZUX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRml4ZWRTaXplLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckZpeGVkU2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZWU1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckZpeGVkU2l6ZS5oCkBAIC0wLDAgKzEsMzg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRklYRURfU0laRV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRklYRURfU0laRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yRml4ZWRTaXplCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRoZSBmaXhlZCBzaXplZCB2ZXJzaW9uIG9mIHRoZSB0ZW5zb3IgY2xhc3MuCisgICoKKyAgKiBUaGUgZml4ZWQgc2l6ZWQgZXF1aXZhbGVudCBvZgorICAqIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IHQoMywgNSwgNyk7CisgICogaXMKKyAgKiBFaWdlbjo6VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplPDMsNSw3Pj4gdDsKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXywgdHlwZW5hbWUgRGltZW5zaW9uc18sIGludCBPcHRpb25zXywgdHlwZW5hbWUgSW5kZXhUeXBlPgorY2xhc3MgVGVuc29yRml4ZWRTaXplIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yRml4ZWRTaXplPFNjYWxhcl8sIERpbWVuc2lvbnNfLCBPcHRpb25zXywgSW5kZXhUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zXywgT3B0aW9uc18sIEluZGV4VHlwZT4gU2VsZjsKKyAgICB0eXBlZGVmIFRlbnNvckJhc2U8VGVuc29yRml4ZWRTaXplPFNjYWxhcl8sIERpbWVuc2lvbnNfLCBPcHRpb25zXywgSW5kZXhUeXBlPiA+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxTZWxmPjo6dHlwZSBOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNlbGY+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8U2VsZj46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgU2NhbGFyXyBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW9ucyA9IE9wdGlvbnNfOworCisgICAgZW51bSB7CisgICAgICBJc0FsaWduZWQgPSBib29sKEVJR0VOX01BWF9BTElHTl9CWVRFUz4wKSwKKyAgICAgIExheW91dCA9IE9wdGlvbnNfICYgUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgQ29vcmRBY2Nlc3MgPSB0cnVlLAorICAgICAgUmF3QWNjZXNzID0gdHJ1ZQorICAgIH07CisKKyAgdHlwZWRlZiBEaW1lbnNpb25zXyBEaW1lbnNpb25zOworICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgTnVtSW5kaWNlcyA9IERpbWVuc2lvbnM6OmNvdW50OworCisgIHByb3RlY3RlZDoKKyAgVGVuc29yU3RvcmFnZTxTY2FsYXIsIERpbWVuc2lvbnMsIE9wdGlvbnM+IG1fc3RvcmFnZTsKKworICBwdWJsaWM6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCAgICAgICAgICAgICAgICAgICAgcmFuaygpICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIE51bUluZGljZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4ICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24oc3RkOjpzaXplX3QgbikgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVtuXTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgICAgICAgIGRpbWVuc2lvbnMoKSAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCAgICAgICAgICAgICAgICAgICAgc2l6ZSgpICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZS5zaXplKCk7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciAgICAgICAgICAgICAgICAgICAqZGF0YSgpICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyICAgICAgICAgICAgICpkYXRhKCkgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpOyB9CisKKyAgICAvLyBUaGlzIG1ha2VzIEVJR0VOX0lOSVRJQUxJWkVfQ09FRkZTX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICAvLyB3b3JrLCBiZWNhdXNlIHRoYXQgdXNlcyBiYXNlKCkuY29lZmZSZWYoKSAtIGFuZCB3ZSBkb24ndCB5ZXQKKyAgICAvLyBpbXBsZW1lbnQgYSBzaW1pbGFyIGNsYXNzIGhpZXJhcmNoeQorICAgIGlubGluZSBTZWxmJiBiYXNlKCkgICAgICAgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICBpbmxpbmUgY29uc3QgU2VsZiYgYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggZmlyc3RJbmRleCwgSW5kZXhUeXBlcy4uLiBvdGhlckluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgLy8gVGhlIG51bWJlciBvZiBpbmRpY2VzIHVzZWQgdG8gYWNjZXNzIGEgdGVuc29yIGNvZWZmaWNpZW50IG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsgb2YgdGhlIHRlbnNvci4KKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mLi4uKG90aGVySW5kaWNlcykgKyAxID09IE51bUluZGljZXMsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICAgIHJldHVybiBjb2VmZihhcnJheTxJbmRleCwgTnVtSW5kaWNlcz57e2ZpcnN0SW5kZXgsIG90aGVySW5kaWNlcy4uLn19KTsKKyAgICB9CisjZW5kaWYKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKGNvbnN0IGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgaW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoY2hlY2tJbmRleFJhbmdlKGluZGljZXMpKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2xpbmVhcml6ZWRJbmRleChpbmRpY2VzKV07CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpWzBdOworICAgIH0KKworCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEluZGV4VHlwZXM+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKQorICAgIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMSA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gY29lZmZSZWYoYXJyYXk8SW5kZXgsIE51bUluZGljZXM+e3tmaXJzdEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgfQorI2VuZGlmCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGNoZWNrSW5kZXhSYW5nZShpbmRpY2VzKSk7CisgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtsaW5lYXJpemVkSW5kZXgoaW5kaWNlcyldOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZigpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1JbmRpY2VzID09IDAsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVswXTsKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBmaXJzdEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGluZGljZXMgdXNlZCB0byBhY2Nlc3MgYSB0ZW5zb3IgY29lZmZpY2llbnQgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YuLi4ob3RoZXJJbmRpY2VzKSArIDEgPT0gTnVtSW5kaWNlcywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoYXJyYXk8SW5kZXgsIE51bUluZGljZXM+e3tmaXJzdEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgfQorI2Vsc2UKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSkgY29uc3QKKyAgICB7CisgICAgICBpZiAoT3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkxICsgaTAgKiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzFdOworICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgaTEgKiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzBdOworICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMikgY29uc3QKKyAgICB7CisgICAgICBpZiAoT3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMiArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMl0gKiAoaTEgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzFdICogaTApOworICAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTAgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzBdICogKGkxICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsxXSAqIGkyKTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTMgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzNdICogKGkyICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsyXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiBpMCkpOworICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVswXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiAoaTIgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzJdICogaTMpKTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzLCBJbmRleCBpNCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoT3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGk0ICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVs0XSAqIChpMyArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbM10gKiAoaTIgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzJdICogKGkxICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsxXSAqIGkwKSkpOworICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVswXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiAoaTIgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzJdICogKGkzICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVszXSAqIGk0KSkpOworICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChjaGVja0luZGV4UmFuZ2UoaW5kaWNlcykpOworICAgICAgcmV0dXJuIGNvZWZmKGluZGljZXMpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIGNvZWZmKGluZGV4KTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICAgIHJldHVybiBjb2VmZigpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yW10oSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgLy8gVGhlIGJyYWNrZXQgb3BlcmF0b3IgaXMgb25seSBmb3IgdmVjdG9ycywgdXNlIHRoZSBwYXJlbnRoZXNpcyBvcGVyYXRvciBpbnN0ZWFkLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1JbmRpY2VzID09IDEsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgICByZXR1cm4gY29lZmYoaW5kZXgpOworICAgIH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKQorICAgIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMSA9PSBOdW1JbmRpY2VzLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gb3BlcmF0b3IoKShhcnJheTxJbmRleCwgTnVtSW5kaWNlcz57e2ZpcnN0SW5kZXgsIG90aGVySW5kaWNlcy4uLn19KTsKKyAgICB9CisjZWxzZQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxKQorICAgIHsKKyAgICAgICBpZiAoT3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMSArIGkwICogbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsxXTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMCArIGkxICogbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVswXTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIpCisgICAgeworICAgICAgIGlmIChPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkyICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsyXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiBpMCk7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVswXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiBpMik7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICAgIH0KKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyLCBJbmRleCBpMykKKyAgICB7CisgICAgICBpZiAoT3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkzICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVszXSAqIChpMiArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMl0gKiAoaTEgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzFdICogaTApKTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMCArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMF0gKiAoaTEgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzFdICogKGkyICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsyXSAqIGkzKSk7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICAgIH0KKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyLCBJbmRleCBpMywgSW5kZXggaTQpCisgICAgeworICAgICAgaWYgKE9wdGlvbnMmUm93TWFqb3IpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpNCArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbNF0gKiAoaTMgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzNdICogKGkyICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsyXSAqIChpMSArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMV0gKiBpMCkpKTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMCArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbMF0gKiAoaTEgKyBtX3N0b3JhZ2UuZGltZW5zaW9ucygpWzFdICogKGkyICsgbV9zdG9yYWdlLmRpbWVuc2lvbnMoKVsyXSAqIChpMyArIG1fc3RvcmFnZS5kaW1lbnNpb25zKClbM10gKiBpNCkpKTsKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGNoZWNrSW5kZXhSYW5nZShpbmRpY2VzKSk7CisgICAgICByZXR1cm4gY29lZmZSZWYoaW5kaWNlcyk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAwLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIGNvZWZmUmVmKCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgb3BlcmF0b3JbXShJbmRleCBpbmRleCkKKyAgICB7CisgICAgICAvLyBUaGUgYnJhY2tldCBvcGVyYXRvciBpcyBvbmx5IGZvciB2ZWN0b3JzLCB1c2UgdGhlIHBhcmVudGhlc2lzIG9wZXJhdG9yIGluc3RlYWQKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAxLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JGaXhlZFNpemUoKQorICAgICAgOiBtX3N0b3JhZ2UoKQorICAgIHsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRml4ZWRTaXplKGNvbnN0IFNlbGYmIG90aGVyKQorICAgICAgOiBtX3N0b3JhZ2Uob3RoZXIubV9zdG9yYWdlKQorICAgIHsKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfUlZBTFVFX1JFRkVSRU5DRVMKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckZpeGVkU2l6ZShTZWxmJiYgb3RoZXIpCisgICAgICA6IG1fc3RvcmFnZShvdGhlci5tX3N0b3JhZ2UpCisgICAgeworICAgIH0KKyNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JGaXhlZFNpemUoY29uc3QgVGVuc29yQmFzZTxPdGhlckRlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JGaXhlZFNpemUsIGNvbnN0IE90aGVyRGVyaXZlZD4gQXNzaWduOworICAgICAgQXNzaWduIGFzc2lnbigqdGhpcywgb3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckZpeGVkU2l6ZShjb25zdCBUZW5zb3JCYXNlPE90aGVyRGVyaXZlZCwgV3JpdGVBY2Nlc3NvcnM+JiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvckZpeGVkU2l6ZSwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlci5kZXJpdmVkKCkpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT46OnJ1bihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckZpeGVkU2l6ZSYgb3BlcmF0b3I9KGNvbnN0IFRlbnNvckZpeGVkU2l6ZSYgb3RoZXIpCisgICAgeworICAgICAgLy8gRklYTUU6IGNoZWNrIHRoYXQgdGhlIGRpbWVuc2lvbnMgb2Ygb3RoZXIgbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgKnRoaXMuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoaXMgaXNuJ3QgcG9zc2libGUgeWV0IHdoZW4gdGhlIHJocyBpcyBhbiBleHByZXNzaW9uLgorICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxTZWxmLCBjb25zdCBUZW5zb3JGaXhlZFNpemU+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckZpeGVkU2l6ZSYgb3BlcmF0b3I9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisgICAgeworICAgICAgLy8gRklYTUU6IGNoZWNrIHRoYXQgdGhlIGRpbWVuc2lvbnMgb2Ygb3RoZXIgbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgKnRoaXMuCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoaXMgaXNuJ3QgcG9zc2libGUgeWV0IHdoZW4gdGhlIHJocyBpcyBhbiBleHByZXNzaW9uLgorICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxTZWxmLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgY2hlY2tJbmRleFJhbmdlKGNvbnN0IGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgLyppbmRpY2VzKi8pIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgaW50ZXJuYWw6OmFycmF5X2FwcGx5X2FuZF9yZWR1Y2U7CisgICAgICB1c2luZyBpbnRlcm5hbDo6YXJyYXlfemlwX2FuZF9yZWR1Y2U7CisgICAgICB1c2luZyBpbnRlcm5hbDo6Z3JlYXRlcl9lcXVhbF96ZXJvX29wOworICAgICAgdXNpbmcgaW50ZXJuYWw6OmxvZ2ljYWxfYW5kX29wOworICAgICAgdXNpbmcgaW50ZXJuYWw6Omxlc3Nlcl9vcDsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGluZGljZXMgYXJlIGFsbCA+PSAwCisgICAgICAgICAgLyogICAgICAgYXJyYXlfYXBwbHlfYW5kX3JlZHVjZTxsb2dpY2FsX2FuZF9vcCwgZ3JlYXRlcl9lcXVhbF96ZXJvX29wPihpbmRpY2VzKSAmJgorICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBpbmRpY2VzIGZpdCBpbiB0aGUgZGltZW5zaW9ucworICAgICAgICBhcnJheV96aXBfYW5kX3JlZHVjZTxsb2dpY2FsX2FuZF9vcCwgbGVzc2VyX29wPihpbmRpY2VzLCBtX3N0b3JhZ2UuZGltZW5zaW9ucygpKTsqLworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBsaW5lYXJpemVkSW5kZXgoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpLkluZGV4T2ZSb3dNYWpvcihpbmRpY2VzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGltZW5zaW9ucygpLkluZGV4T2ZDb2xNYWpvcihpbmRpY2VzKTsKKyAgICAgIH0KKyAgICB9Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9GSVhFRF9TSVpFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRm9yY2VkRXZhbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JGb3JjZWRFdmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkNWViMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRm9yY2VkRXZhbC5oCkBAIC0wLDAgKzEsMTY3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRk9SQ0VEX0VWQUxfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0ZPUkNFRF9FVkFMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JGb3JjZWRFdmFsCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciByZXNoYXBpbmcgY2xhc3MuCisgICoKKyAgKgorICAqLworLy8vIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfIGlzIGFkZGVkIHRvIGNvbnZlcnQgdGhlIGhvc3QgcG9pbnRlciB0byB0aGUgZGV2aWNlIHBvaW50ZXIuCisvLy8gSXQgaXMgYWRkZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgZm9yIG91ciBkZXZpY2UgY29tcGlsZXIgVCogaXMgbm90IGFsbG93ZWQuCisvLy8gSWYgd2Ugd2FudGVkIHRvIHVzZSB0aGUgc2FtZSBFdmFsdWF0b3IgZnVuY3Rpb25zIHdlIGhhdmUgdG8gY29udmVydCB0aGF0IHR5cGUgdG8gb3VyIHBvaW50ZXIgVC4KKy8vLyBUaGlzIGlzIGRvbmUgdGhyb3VnaCBvdXIgTWFrZVBvaW50ZXJfIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBUeXBlIGluIHRoZSBNYWtlUG9pbnRlcl88VD4gaXMgVCogLgorLy8vIFRoZXJlZm9yZSwgYnkgYWRkaW5nIHRoZSBkZWZhdWx0IHZhbHVlLCB3ZSBtYW5hZ2VkIHRvIGNvbnZlcnQgdGhlIHR5cGUgYW5kIGl0IGRvZXMgbm90IGJyZWFrIGFueQorLy8vIGV4aXN0aW5nIGNvZGUgYXMgaXRzIGRlZmF1bHQgdmFsdWUgaXMgVCouCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckZvcmNlZEV2YWxPcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+ID4KK3sKKyAgLy8gVHlwZSBwcm9tb3Rpb24gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0eXBlcyBvZiB0aGUgbGhzIGFuZCB0aGUgcmhzIGFyZSBkaWZmZXJlbnQuCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxYcHJUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7CisKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAwCisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgTWFrZVBvaW50ZXIgeworICAgIC8vIEludGVybWVkaWF0ZSB0eXBlZGVmIHRvIHdvcmthcm91bmQgTVNWQyBpc3N1ZS4KKyAgICB0eXBlZGVmIE1ha2VQb2ludGVyXzxUPiBNYWtlUG9pbnRlclQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYWtlUG9pbnRlclQ6OlR5cGUgVHlwZTsKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorc3RydWN0IGV2YWw8VGVuc29yRm9yY2VkRXZhbE9wPFhwclR5cGUsIE1ha2VQb2ludGVyXz4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JGb3JjZWRFdmFsT3A8WHByVHlwZSwgTWFrZVBvaW50ZXJfPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorc3RydWN0IG5lc3RlZDxUZW5zb3JGb3JjZWRFdmFsT3A8WHByVHlwZSwgTWFrZVBvaW50ZXJfPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JGb3JjZWRFdmFsT3A8WHByVHlwZSwgTWFrZVBvaW50ZXJfPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvckZvcmNlZEV2YWxPcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXz4KK2NsYXNzIFRlbnNvckZvcmNlZEV2YWxPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvckZvcmNlZEV2YWxPcDxYcHJUeXBlLCBNYWtlUG9pbnRlcl8+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckZvcmNlZEV2YWxPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGU+Ojp0eXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JGb3JjZWRFdmFsT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JGb3JjZWRFdmFsT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JGb3JjZWRFdmFsT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckZvcmNlZEV2YWxPcChjb25zdCBYcHJUeXBlJiBleHByKQorICAgICAgOiBtX3hwcihleHByKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckZvcmNlZEV2YWxPcDxBcmdUeXBlLCBNYWtlUG9pbnRlcl8+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yRm9yY2VkRXZhbE9wPEFyZ1R5cGUsIE1ha2VQb2ludGVyXz4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IHRydWUsCisgICAgUGFja2V0QWNjZXNzID0gKFBhY2tldFNpemUgPiAxKSwKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIFJhd0FjY2VzcyA9IHRydWUKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorCS8vLyBvcF8gaXMgdXNlZCBmb3Igc3ljbAorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX29wKG9wLmV4cHJlc3Npb24oKSksIG1fZGV2aWNlKGRldmljZSksIG1fYnVmZmVyKE5VTEwpCisgIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2ltcGwuZGltZW5zaW9ucygpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKENvZWZmUmV0dXJuVHlwZSopIHsKKyAgICBjb25zdCBJbmRleCBudW1WYWx1ZXMgPSAgaW50ZXJuYWw6OmFycmF5X3Byb2QobV9pbXBsLmRpbWVuc2lvbnMoKSk7CisgICAgbV9idWZmZXIgPSAoQ29lZmZSZXR1cm5UeXBlKiltX2RldmljZS5hbGxvY2F0ZShudW1WYWx1ZXMgKiBzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSk7CisgICAgLy8gU2hvdWxkIGluaXRpYWxpemUgdGhlIG1lbW9yeSBpbiBjYXNlIHdlJ3JlIGRlYWxpbmcgd2l0aCBub24gUE9EIHR5cGVzLgorICAgIGlmIChOdW1UcmFpdHM8Q29lZmZSZXR1cm5UeXBlPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uKSB7CisgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgbmV3KG1fYnVmZmVyK2kpIENvZWZmUmV0dXJuVHlwZSgpOworICAgICAgfQorICAgIH0KKyAgICB0eXBlZGVmIFRlbnNvckV2YWxUb09wPCBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PEFyZ1R5cGU+Ojp0eXBlID4gRXZhbFRvOworICAgIEV2YWxUbyBldmFsVG9UbXAobV9idWZmZXIsIG1fb3ApOworICAgIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gaW50ZXJuYWw6OklzVmVjdG9yaXphYmxlPERldmljZSwgY29uc3QgQXJnVHlwZT46OnZhbHVlOworICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBFdmFsVG8sIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8RGV2aWNlPjo6dHlwZSwgUGFja2V0QWNjZXNzPjo6cnVuKGV2YWxUb1RtcCwgbV9kZXZpY2UpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9idWZmZXIpOworICAgIG1fYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1fYnVmZmVyW2luZGV4XTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFJldHVyblR5cGUsIExvYWRNb2RlPihtX2J1ZmZlciArIGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVuc29yT3BDb3N0KHNpemVvZihDb2VmZlJldHVyblR5cGUpLCAwLCAwLCB2ZWN0b3JpemVkLCBQYWNrZXRTaXplKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHR5cGVuYW1lIE1ha2VQb2ludGVyPFNjYWxhcj46OlR5cGUgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYnVmZmVyOyB9CisKKyAgLy8vIHJlcXVpcmVkIGJ5IHN5Y2wgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgc3ljbCBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiYgaW1wbCgpIHsgcmV0dXJuIG1faW1wbDsgfQorICAvLy8gdXNlZCBieSBzeWNsIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBzeWNsIGJ1ZmZlcgorICBjb25zdCBEZXZpY2UmIGRldmljZSgpIGNvbnN0e3JldHVybiBtX2RldmljZTt9CisgcHJpdmF0ZToKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBjb25zdCBBcmdUeXBlIG1fb3A7CisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7CisgIHR5cGVuYW1lIE1ha2VQb2ludGVyPENvZWZmUmV0dXJuVHlwZT46OlR5cGUgbV9idWZmZXI7Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9GT1JDRURfRVZBTF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckZvcndhcmREZWNsYXJhdGlvbnMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRm9yd2FyZERlY2xhcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjgwM2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckZvcndhcmREZWNsYXJhdGlvbnMuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0ZPUldBUkRfREVDTEFSQVRJT05TX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9GT1JXQVJEX0RFQ0xBUkFUSU9OU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8vIE1ha2VQb2ludGVyIGNsYXNzIGlzIHVzZWQgYXMgYSBjb250YWluZXIgb2YgdGhlIGFkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlcgorLy8gb24gdGhlIGhvc3QgYW5kIG9uIHRoZSBkZXZpY2UuIEZyb20gdGhlIGhvc3Qgc2lkZSBpdCBnZW5lcmF0ZXMgdGhlIFQqIHBvaW50ZXIKKy8vIGFuZCB3aGVuIEVJR0VOX1VTRV9TWUNMIGlzIHVzZWQgaXQgY29uc3RydWN0IGEgYnVmZmVyIHdpdGggYSBtYXBfYWxsb2NhdG9yIHRvCisvLyBUKiBtX2RhdGEgb24gdGhlIGhvc3QuIEl0IGlzIGFsd2F5cyBjYWxsZWQgb24gdGhlIGRldmljZS4KKy8vIFNwZWNpYWxpc2F0aW9uIG9mIE1ha2VQb2ludGVyIGNsYXNzIGZvciBjcmVhdGluZyB0aGUgc3ljbCBidWZmZXIgd2l0aAorLy8gbWFwX2FsbG9jYXRvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBNYWtlUG9pbnRlciB7CisgIHR5cGVkZWYgVCogVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnNfID0gVW5hbGlnbmVkLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXyA9IE1ha2VQb2ludGVyPiBjbGFzcyBUZW5zb3JNYXA7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zXyA9IDAsIHR5cGVuYW1lIEluZGV4VHlwZSA9IERlbnNlSW5kZXg+IGNsYXNzIFRlbnNvcjsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcl8sIHR5cGVuYW1lIERpbWVuc2lvbnMsIGludCBPcHRpb25zXyA9IDAsIHR5cGVuYW1lIEluZGV4VHlwZSA9IERlbnNlSW5kZXg+IGNsYXNzIFRlbnNvckZpeGVkU2l6ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gY2xhc3MgVGVuc29yUmVmOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IEFjY2Vzc0xldmVsPiBjbGFzcyBUZW5zb3JCYXNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBOdWxsYXJ5T3AsIHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gY2xhc3MgVGVuc29yQ3dpc2VOdWxsYXJ5T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBYcHJUeXBlPiBjbGFzcyBUZW5zb3JDd2lzZVVuYXJ5T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGVmdFhwclR5cGUsIHR5cGVuYW1lIFJpZ2h0WHByVHlwZT4gY2xhc3MgVGVuc29yQ3dpc2VCaW5hcnlPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFRlcm5hcnlPcCwgdHlwZW5hbWUgQXJnMVhwclR5cGUsIHR5cGVuYW1lIEFyZzJYcHJUeXBlLCB0eXBlbmFtZSBBcmczWHByVHlwZT4gY2xhc3MgVGVuc29yQ3dpc2VUZXJuYXJ5T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJZlhwclR5cGUsIHR5cGVuYW1lIFRoZW5YcHJUeXBlLCB0eXBlbmFtZSBFbHNlWHByVHlwZT4gY2xhc3MgVGVuc29yU2VsZWN0T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8gPSBNYWtlUG9pbnRlciA+IGNsYXNzIFRlbnNvclJlZHVjdGlvbk9wOwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29ySW5kZXhUdXBsZU9wOwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlT3AsIHR5cGVuYW1lIERpbXMsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvclR1cGxlUmVkdWNlck9wOwordGVtcGxhdGU8dHlwZW5hbWUgQXhpcywgdHlwZW5hbWUgTGVmdFhwclR5cGUsIHR5cGVuYW1lIFJpZ2h0WHByVHlwZT4gY2xhc3MgVGVuc29yQ29uY2F0ZW5hdGlvbk9wOwordGVtcGxhdGU8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgTGVmdFhwclR5cGUsIHR5cGVuYW1lIFJpZ2h0WHByVHlwZT4gY2xhc3MgVGVuc29yQ29udHJhY3Rpb25PcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFRhcmdldFR5cGUsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvckNvbnZlcnNpb25PcDsKK3RlbXBsYXRlPHR5cGVuYW1lIERpbWVuc2lvbnMsIHR5cGVuYW1lIElucHV0WHByVHlwZSwgdHlwZW5hbWUgS2VybmVsWHByVHlwZT4gY2xhc3MgVGVuc29yQ29udm9sdXRpb25PcDsKK3RlbXBsYXRlPHR5cGVuYW1lIEZGVCwgdHlwZW5hbWUgWHByVHlwZSwgaW50IEZGVERhdGFUeXBlLCBpbnQgRkZURGlyZWN0aW9uPiBjbGFzcyBUZW5zb3JGRlRPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFBhdGNoRGltLCB0eXBlbmFtZSBYcHJUeXBlPiBjbGFzcyBUZW5zb3JQYXRjaE9wOwordGVtcGxhdGU8RGVuc2VJbmRleCBSb3dzLCBEZW5zZUluZGV4IENvbHMsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvckltYWdlUGF0Y2hPcDsKK3RlbXBsYXRlPERlbnNlSW5kZXggUGxhbmVzLCBEZW5zZUluZGV4IFJvd3MsIERlbnNlSW5kZXggQ29scywgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yVm9sdW1lUGF0Y2hPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIEJyb2FkY2FzdCwgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yQnJvYWRjYXN0aW5nT3A7Cit0ZW1wbGF0ZTxEZW5zZUluZGV4IERpbUlkLCB0eXBlbmFtZSBYcHJUeXBlPiBjbGFzcyBUZW5zb3JDaGlwcGluZ09wOwordGVtcGxhdGU8dHlwZW5hbWUgTmV3RGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yUmVzaGFwaW5nT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPiBjbGFzcyBUZW5zb3JMYXlvdXRTd2FwT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFNpemVzLCB0eXBlbmFtZSBYcHJUeXBlPiBjbGFzcyBUZW5zb3JTbGljaW5nT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSZXZlcnNlRGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yUmV2ZXJzZU9wOwordGVtcGxhdGU8dHlwZW5hbWUgUGFkZGluZ0RpbWVuc2lvbnMsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvclBhZGRpbmdPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNodWZmbGUsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvclNodWZmbGluZ09wOwordGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yU3RyaWRpbmdPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU3RvcEluZGljZXMsIHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wOwordGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29ySW5mbGF0aW9uT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBHZW5lcmF0b3IsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvckdlbmVyYXRvck9wOwordGVtcGxhdGU8dHlwZW5hbWUgTGVmdFhwclR5cGUsIHR5cGVuYW1lIFJpZ2h0WHByVHlwZT4gY2xhc3MgVGVuc29yQXNzaWduT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgWHByVHlwZT4gY2xhc3MgVGVuc29yU2Nhbk9wOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21VbmFyeUZ1bmMsIHR5cGVuYW1lIFhwclR5cGU+IGNsYXNzIFRlbnNvckN1c3RvbVVuYXJ5T3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21CaW5hcnlGdW5jLCB0eXBlbmFtZSBMaHNYcHJUeXBlLCB0eXBlbmFtZSBSaHNYcHJUeXBlPiBjbGFzcyBUZW5zb3JDdXN0b21CaW5hcnlPcDsKKwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8gPSBNYWtlUG9pbnRlcj4gY2xhc3MgVGVuc29yRXZhbFRvT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXyA9IE1ha2VQb2ludGVyPiBjbGFzcyBUZW5zb3JGb3JjZWRFdmFsT3A7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBEZXZpY2VUeXBlPiBjbGFzcyBUZW5zb3JEZXZpY2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBEZXZpY2U+IHN0cnVjdCBUZW5zb3JFdmFsdWF0b3I7CisKK3N0cnVjdCBEZWZhdWx0RGV2aWNlOworc3RydWN0IFRocmVhZFBvb2xEZXZpY2U7CitzdHJ1Y3QgR3B1RGV2aWNlOworc3RydWN0IFN5Y2xEZXZpY2U7CisKK2VudW0gRkZUUmVzdWx0VHlwZSB7CisgIFJlYWxQYXJ0ID0gMCwKKyAgSW1hZ1BhcnQgPSAxLAorICBCb3RoUGFydHMgPSAyCit9OworCitlbnVtIEZGVERpcmVjdGlvbiB7CisgICAgRkZUX0ZPUldBUkQgPSAwLAorICAgIEZGVF9SRVZFUlNFID0gMQorfTsKKworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBFeHByZXNzaW9uPgorc3RydWN0IElzVmVjdG9yaXphYmxlIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBUZW5zb3JFdmFsdWF0b3I8RXhwcmVzc2lvbiwgRGV2aWNlPjo6UGFja2V0QWNjZXNzOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJlc3Npb24+CitzdHJ1Y3QgSXNWZWN0b3JpemFibGU8R3B1RGV2aWNlLCBFeHByZXNzaW9uPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gVGVuc29yRXZhbHVhdG9yPEV4cHJlc3Npb24sIEdwdURldmljZT46OlBhY2tldEFjY2VzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvckV2YWx1YXRvcjxFeHByZXNzaW9uLCBHcHVEZXZpY2U+OjpJc0FsaWduZWQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcmVzc2lvbiwgdHlwZW5hbWUgRGV2aWNlLAorICAgICAgICAgIGJvb2wgVmVjdG9yaXphYmxlID0gSXNWZWN0b3JpemFibGU8RGV2aWNlLCBFeHByZXNzaW9uPjo6dmFsdWU+CitjbGFzcyBUZW5zb3JFeGVjdXRvcjsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0ZPUldBUkRfREVDTEFSQVRJT05TX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRnVuY3RvcnMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yRnVuY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNmNmRjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JGdW5jdG9ycy5oCkBAIC0wLDAgKzEsNDg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfRlVOQ1RPUlNfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0ZVTkNUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgbW9kdWxvIGJldHdlZW4gYW4gYXJyYXkgYW5kIGEgc2NhbGFyLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9tb2Rfb3AgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBzY2FsYXJfbW9kX29wKGNvbnN0IFNjYWxhciYgZGl2aXNvcikgOiBtX2Rpdmlzb3IoZGl2aXNvcikge30KKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsgcmV0dXJuIGEgJSBtX2Rpdmlzb3I7IH0KKyAgY29uc3QgU2NhbGFyIG1fZGl2aXNvcjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9tb2Rfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gc2NhbGFyX2Rpdl9jb3N0PFNjYWxhcixmYWxzZT46OnZhbHVlLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIG1vZHVsbyBiZXR3ZWVuIDIgYXJyYXlzLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9tb2QyX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX21vZDJfb3ApOworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSBjb25zdCB7IHJldHVybiBhICUgYjsgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX21vZDJfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gc2NhbGFyX2Rpdl9jb3N0PFNjYWxhcixmYWxzZT46OnZhbHVlLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9mbW9kX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Ztb2Rfb3ApOworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhcgorICBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSBjb25zdCB7CisgICAgcmV0dXJuIG51bWV4dDo6Zm1vZChhLCBiKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Ztb2Rfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7IENvc3QgPSAxMywgIC8vIFJlY2lwcm9jYWwgdGhyb3VnaHB1dCBvZiBGUFJFTSBvbiBIYXN3ZWxsLgorICAgICAgICAgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsKK307CisKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHNpZ21vaWQgb2YgYSBzY2FsYXIKKyAgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheUJhc2U6OnNpZ21vaWQoKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc2NhbGFyX3NpZ21vaWRfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfc2lnbW9pZF9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIG9wZXJhdG9yKCkoY29uc3QgVCYgeCkgY29uc3QgeworICAgIGNvbnN0IFQgb25lID0gVCgxKTsKKyAgICByZXR1cm4gb25lIC8gKG9uZSArIG51bWV4dDo6ZXhwKC14KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIHgpIGNvbnN0IHsKKyAgICBjb25zdCBQYWNrZXQgb25lID0gcHNldDE8UGFja2V0PihUKDEpKTsKKyAgICByZXR1cm4gcGRpdihvbmUsIHBhZGQob25lLCBwZXhwKHBuZWdhdGUoeCkpKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9zaWdtb2lkX29wPFQ+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFQ+OjpBZGRDb3N0ICogMiArIE51bVRyYWl0czxUPjo6TXVsQ29zdCAqIDYsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxUPjo6SGFzQWRkICYmIHBhY2tldF90cmFpdHM8VD46Okhhc0RpdiAmJgorICAgICAgICAgICAgICAgICAgIHBhY2tldF90cmFpdHM8VD46Okhhc05lZ2F0ZSAmJiBwYWNrZXRfdHJhaXRzPFQ+OjpIYXNFeHAKKyAgfTsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzIHsKKyAgZW51bSB7CisgICAgQ29zdCA9IDEsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKKy8vIFN0YW5kYXJkIHJlZHVjdGlvbiBmdW5jdG9ycwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTdW1SZWR1Y2VyCit7CisgIHN0YXRpYyBjb25zdCBib29sIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8VD46Okhhc0FkZDsKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNTdGF0ZWZ1bCA9IGZhbHNlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgVCB0LCBUKiBhY2N1bSkgY29uc3QgeworICAgIGludGVybmFsOjpzY2FsYXJfc3VtX29wPFQ+IHN1bV9vcDsKKyAgICAqYWNjdW0gPSBzdW1fb3AoKmFjY3VtLCB0KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlUGFja2V0KGNvbnN0IFBhY2tldCYgcCwgUGFja2V0KiBhY2N1bSkgY29uc3QgeworICAgICgqYWNjdW0pID0gcGFkZDxQYWNrZXQ+KCphY2N1bSwgcCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgaW5pdGlhbGl6ZSgpIGNvbnN0IHsKKyAgICBpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8aW50LCBUPiBjb252OworICAgIHJldHVybiBjb252KDApOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IGluaXRpYWxpemVQYWNrZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBzZXQxPFBhY2tldD4oaW5pdGlhbGl6ZSgpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemUoY29uc3QgVCBhY2N1bSkgY29uc3QgeworICAgIHJldHVybiBhY2N1bTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldCBmaW5hbGl6ZVBhY2tldChjb25zdCBQYWNrZXQmIHZhY2N1bSkgY29uc3QgeworICAgIHJldHVybiB2YWNjdW07CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIGZpbmFsaXplQm90aChjb25zdCBUIHNhY2N1bSwgY29uc3QgUGFja2V0JiB2YWNjdW0pIGNvbnN0IHsKKyAgICBpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxUPiBzdW1fb3A7CisgICAgcmV0dXJuIHN1bV9vcChzYWNjdW0sIHByZWR1eCh2YWNjdW0pKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCByZWR1Y2VyX3RyYWl0czxTdW1SZWR1Y2VyPFQ+LCBEZXZpY2U+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBQYWNrZXRUeXBlPFQsIERldmljZT46Okhhc0FkZAorICB9OworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE1lYW5SZWR1Y2VyCit7CisgIHN0YXRpYyBjb25zdCBib29sIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8VD46Okhhc0FkZCAmJiAhTnVtVHJhaXRzPFQ+OjpJc0ludGVnZXI7CisgIHN0YXRpYyBjb25zdCBib29sIElzU3RhdGVmdWwgPSB0cnVlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgTWVhblJlZHVjZXIoKSA6IHNjYWxhckNvdW50XygwKSwgcGFja2V0Q291bnRfKDApIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgVCB0LCBUKiBhY2N1bSkgeworICAgIGludGVybmFsOjpzY2FsYXJfc3VtX29wPFQ+IHN1bV9vcDsKKyAgICAqYWNjdW0gPSBzdW1fb3AoKmFjY3VtLCB0KTsKKyAgICBzY2FsYXJDb3VudF8rKzsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlUGFja2V0KGNvbnN0IFBhY2tldCYgcCwgUGFja2V0KiBhY2N1bSkgeworICAgICgqYWNjdW0pID0gcGFkZDxQYWNrZXQ+KCphY2N1bSwgcCk7CisgICAgcGFja2V0Q291bnRfKys7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgaW5pdGlhbGl6ZSgpIGNvbnN0IHsKKyAgICBpbnRlcm5hbDo6c2NhbGFyX2Nhc3Rfb3A8aW50LCBUPiBjb252OworICAgIHJldHVybiBjb252KDApOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IGluaXRpYWxpemVQYWNrZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBzZXQxPFBhY2tldD4oaW5pdGlhbGl6ZSgpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemUoY29uc3QgVCBhY2N1bSkgY29uc3QgeworICAgIHJldHVybiBhY2N1bSAvIHNjYWxhckNvdW50XzsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldCBmaW5hbGl6ZVBhY2tldChjb25zdCBQYWNrZXQmIHZhY2N1bSkgY29uc3QgeworICAgIHJldHVybiBwZGl2KHZhY2N1bSwgcHNldDE8UGFja2V0PihwYWNrZXRDb3VudF8pKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemVCb3RoKGNvbnN0IFQgc2FjY3VtLCBjb25zdCBQYWNrZXQmIHZhY2N1bSkgY29uc3QgeworICAgIGludGVybmFsOjpzY2FsYXJfc3VtX29wPFQ+IHN1bV9vcDsKKyAgICByZXR1cm4gc3VtX29wKHNhY2N1bSwgcHJlZHV4KHZhY2N1bSkpIC8gKHNjYWxhckNvdW50XyArIHBhY2tldENvdW50XyAqIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjpzaXplKTsKKyAgfQorCisgIHByb3RlY3RlZDoKKyAgICBEZW5zZUluZGV4IHNjYWxhckNvdW50XzsKKyAgICBEZW5zZUluZGV4IHBhY2tldENvdW50XzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgcmVkdWNlcl90cmFpdHM8TWVhblJlZHVjZXI8VD4sIERldmljZT4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFQ+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IFBhY2tldFR5cGU8VCwgRGV2aWNlPjo6SGFzQWRkCisgIH07Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIElzTWF4ID0gdHJ1ZSwgYm9vbCBJc0ludGVnZXIgPSB0cnVlPgorc3RydWN0IE1pbk1heEJvdHRvbVZhbHVlIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBib3R0b21fdmFsdWUoKSB7CisgICAgcmV0dXJuIEVpZ2VuOjpOdW1UcmFpdHM8VD46Omxvd2VzdCgpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTWluTWF4Qm90dG9tVmFsdWU8VCwgdHJ1ZSwgZmFsc2U+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBib3R0b21fdmFsdWUoKSB7CisgICAgcmV0dXJuIC1FaWdlbjo6TnVtVHJhaXRzPFQ+OjppbmZpbml0eSgpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTWluTWF4Qm90dG9tVmFsdWU8VCwgZmFsc2UsIHRydWU+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBib3R0b21fdmFsdWUoKSB7CisgICAgcmV0dXJuIEVpZ2VuOjpOdW1UcmFpdHM8VD46OmhpZ2hlc3QoKTsKKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IE1pbk1heEJvdHRvbVZhbHVlPFQsIGZhbHNlLCBmYWxzZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBUIGJvdHRvbV92YWx1ZSgpIHsKKyAgICByZXR1cm4gRWlnZW46Ok51bVRyYWl0czxUPjo6aW5maW5pdHkoKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE1heFJlZHVjZXIKK3sKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxUPjo6SGFzTWF4OworICBzdGF0aWMgY29uc3QgYm9vbCBJc1N0YXRlZnVsID0gZmFsc2U7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZShjb25zdCBUIHQsIFQqIGFjY3VtKSBjb25zdCB7CisgICAgaWYgKHQgPiAqYWNjdW0pIHsgKmFjY3VtID0gdDsgfQorICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2VQYWNrZXQoY29uc3QgUGFja2V0JiBwLCBQYWNrZXQqIGFjY3VtKSBjb25zdCB7CisgICAgKCphY2N1bSkgPSBwbWF4PFBhY2tldD4oKmFjY3VtLCBwKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgaW5pdGlhbGl6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWluTWF4Qm90dG9tVmFsdWU8VCwgdHJ1ZSwgRWlnZW46Ok51bVRyYWl0czxUPjo6SXNJbnRlZ2VyPjo6Ym90dG9tX3ZhbHVlKCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQgaW5pdGlhbGl6ZVBhY2tldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHNldDE8UGFja2V0Pihpbml0aWFsaXplKCkpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBmaW5hbGl6ZShjb25zdCBUIGFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIGFjY3VtOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IGZpbmFsaXplUGFja2V0KGNvbnN0IFBhY2tldCYgdmFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIHZhY2N1bTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemVCb3RoKGNvbnN0IFQgc2FjY3VtLCBjb25zdCBQYWNrZXQmIHZhY2N1bSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6Om1heGkoc2FjY3VtLCBwcmVkdXhfbWF4KHZhY2N1bSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzPE1heFJlZHVjZXI8VD4sIERldmljZT4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFQ+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IFBhY2tldFR5cGU8VCwgRGV2aWNlPjo6SGFzTWF4CisgIH07Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgTWluUmVkdWNlcgoreworICBzdGF0aWMgY29uc3QgYm9vbCBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFQ+OjpIYXNNaW47CisgIHN0YXRpYyBjb25zdCBib29sIElzU3RhdGVmdWwgPSBmYWxzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFQgdCwgVCogYWNjdW0pIGNvbnN0IHsKKyAgICBpZiAodCA8ICphY2N1bSkgeyAqYWNjdW0gPSB0OyB9CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZVBhY2tldChjb25zdCBQYWNrZXQmIHAsIFBhY2tldCogYWNjdW0pIGNvbnN0IHsKKyAgICAoKmFjY3VtKSA9IHBtaW48UGFja2V0PigqYWNjdW0sIHApOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBpbml0aWFsaXplKCkgY29uc3QgeworICAgIHJldHVybiBNaW5NYXhCb3R0b21WYWx1ZTxULCBmYWxzZSwgRWlnZW46Ok51bVRyYWl0czxUPjo6SXNJbnRlZ2VyPjo6Ym90dG9tX3ZhbHVlKCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQgaW5pdGlhbGl6ZVBhY2tldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcHNldDE8UGFja2V0Pihpbml0aWFsaXplKCkpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBmaW5hbGl6ZShjb25zdCBUIGFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIGFjY3VtOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0IGZpbmFsaXplUGFja2V0KGNvbnN0IFBhY2tldCYgdmFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIHZhY2N1bTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemVCb3RoKGNvbnN0IFQgc2FjY3VtLCBjb25zdCBQYWNrZXQmIHZhY2N1bSkgY29uc3QgeworICAgIHJldHVybiBudW1leHQ6Om1pbmkoc2FjY3VtLCBwcmVkdXhfbWluKHZhY2N1bSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzPE1pblJlZHVjZXI8VD4sIERldmljZT4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFQ+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IFBhY2tldFR5cGU8VCwgRGV2aWNlPjo6SGFzTWluCisgIH07Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUHJvZFJlZHVjZXIKK3sKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxUPjo6SGFzTXVsOworICBzdGF0aWMgY29uc3QgYm9vbCBJc1N0YXRlZnVsID0gZmFsc2U7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZShjb25zdCBUIHQsIFQqIGFjY3VtKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFQ+IHByb2Rfb3A7CisgICAgKCphY2N1bSkgPSBwcm9kX29wKCphY2N1bSwgdCk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZVBhY2tldChjb25zdCBQYWNrZXQmIHAsIFBhY2tldCogYWNjdW0pIGNvbnN0IHsKKyAgICAoKmFjY3VtKSA9IHBtdWw8UGFja2V0PigqYWNjdW0sIHApOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIGluaXRpYWxpemUoKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OnNjYWxhcl9jYXN0X29wPGludCwgVD4gY29udjsKKyAgICByZXR1cm4gY29udigxKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldCBpbml0aWFsaXplUGFja2V0KCkgY29uc3QgeworICAgIHJldHVybiBwc2V0MTxQYWNrZXQ+KGluaXRpYWxpemUoKSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIGZpbmFsaXplKGNvbnN0IFQgYWNjdW0pIGNvbnN0IHsKKyAgICByZXR1cm4gYWNjdW07CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQgZmluYWxpemVQYWNrZXQoY29uc3QgUGFja2V0JiB2YWNjdW0pIGNvbnN0IHsKKyAgICByZXR1cm4gdmFjY3VtOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBmaW5hbGl6ZUJvdGgoY29uc3QgVCBzYWNjdW0sIGNvbnN0IFBhY2tldCYgdmFjY3VtKSBjb25zdCB7CisgICAgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFQ+IHByb2Rfb3A7CisgICAgcmV0dXJuIHByb2Rfb3Aoc2FjY3VtLCBwcmVkdXhfbXVsKHZhY2N1bSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzPFByb2RSZWR1Y2VyPFQ+LCBEZXZpY2U+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxUPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBQYWNrZXRUeXBlPFQsIERldmljZT46Okhhc011bAorICB9OworfTsKKworCitzdHJ1Y3QgQW5kUmVkdWNlcgoreworICBzdGF0aWMgY29uc3QgYm9vbCBQYWNrZXRBY2Nlc3MgPSBmYWxzZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNTdGF0ZWZ1bCA9IGZhbHNlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoYm9vbCB0LCBib29sKiBhY2N1bSkgY29uc3QgeworICAgICphY2N1bSA9ICphY2N1bSAmJiB0OworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBpbml0aWFsaXplKCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBmaW5hbGl6ZShib29sIGFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIGFjY3VtOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzPEFuZFJlZHVjZXIsIERldmljZT4geworICBlbnVtIHsKKyAgICBDb3N0ID0gMSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZQorICB9OworfTsKKworCitzdHJ1Y3QgT3JSZWR1Y2VyIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gZmFsc2U7CisgIHN0YXRpYyBjb25zdCBib29sIElzU3RhdGVmdWwgPSBmYWxzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGJvb2wgdCwgYm9vbCogYWNjdW0pIGNvbnN0IHsKKyAgICAqYWNjdW0gPSAqYWNjdW0gfHwgdDsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgaW5pdGlhbGl6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGZpbmFsaXplKGJvb2wgYWNjdW0pIGNvbnN0IHsKKyAgICByZXR1cm4gYWNjdW07CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgcmVkdWNlcl90cmFpdHM8T3JSZWR1Y2VyLCBEZXZpY2U+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IDEsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKKworLy8gQXJnbWluL0FyZ21heCByZWR1Y2VycwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBBcmdNYXhUdXBsZVJlZHVjZXIKK3sKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gZmFsc2U7CisgIHN0YXRpYyBjb25zdCBib29sIElzU3RhdGVmdWwgPSBmYWxzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFQgdCwgVCogYWNjdW0pIGNvbnN0IHsKKyAgICBpZiAodC5zZWNvbmQgPiBhY2N1bS0+c2Vjb25kKSB7ICphY2N1bSA9IHQ7IH0KKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgaW5pdGlhbGl6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVCgwLCBOdW1UcmFpdHM8dHlwZW5hbWUgVDo6c2Vjb25kX3R5cGU+Ojpsb3dlc3QoKSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIGZpbmFsaXplKGNvbnN0IFQmIGFjY3VtKSBjb25zdCB7CisgICAgcmV0dXJuIGFjY3VtOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IHJlZHVjZXJfdHJhaXRzPEFyZ01heFR1cGxlUmVkdWNlcjxUPiwgRGV2aWNlPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8VD46OkFkZENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBBcmdNaW5UdXBsZVJlZHVjZXIKK3sKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gZmFsc2U7CisgIHN0YXRpYyBjb25zdCBib29sIElzU3RhdGVmdWwgPSBmYWxzZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFQmIHQsIFQqIGFjY3VtKSBjb25zdCB7CisgICAgaWYgKHQuc2Vjb25kIDwgYWNjdW0tPnNlY29uZCkgeyAqYWNjdW0gPSB0OyB9CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIGluaXRpYWxpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIFQoMCwgTnVtVHJhaXRzPHR5cGVuYW1lIFQ6OnNlY29uZF90eXBlPjo6aGlnaGVzdCgpKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQgZmluYWxpemUoY29uc3QgVCYgYWNjdW0pIGNvbnN0IHsKKyAgICByZXR1cm4gYWNjdW07CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgcmVkdWNlcl90cmFpdHM8QXJnTWluVHVwbGVSZWR1Y2VyPFQ+LCBEZXZpY2U+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZQorICB9OworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXgsIHNpemVfdCBOdW1EaW1zPgorY2xhc3MgR2F1c3NpYW5HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gZmFsc2U7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgR2F1c3NpYW5HZW5lcmF0b3IoY29uc3QgYXJyYXk8VCwgTnVtRGltcz4mIG1lYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxULCBOdW1EaW1zPiYgc3RkX2RldnMpCisgICAgICA6IG1fbWVhbnMobWVhbnMpCisgIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgbV90d29fc2lnbWFzW2ldID0gc3RkX2RldnNbaV0gKiBzdGRfZGV2c1tpXSAqIDI7CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVCBvcGVyYXRvcigpKGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgY29vcmRpbmF0ZXMpIGNvbnN0IHsKKyAgICBUIHRtcCA9IFQoMCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgIFQgb2Zmc2V0ID0gY29vcmRpbmF0ZXNbaV0gLSBtX21lYW5zW2ldOworICAgICAgdG1wICs9IG9mZnNldCAqIG9mZnNldCAvIG1fdHdvX3NpZ21hc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIG51bWV4dDo6ZXhwKC10bXApOworICB9CisKKyBwcml2YXRlOgorICBhcnJheTxULCBOdW1EaW1zPiBtX21lYW5zOworICBhcnJheTxULCBOdW1EaW1zPiBtX3R3b19zaWdtYXM7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXgsIHNpemVfdCBOdW1EaW1zPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPEdhdXNzaWFuR2VuZXJhdG9yPFQsIEluZGV4LCBOdW1EaW1zPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bURpbXMgKiAoMiAqIE51bVRyYWl0czxUPjo6QWRkQ29zdCArIE51bVRyYWl0czxUPjo6TXVsQ29zdCArCisgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3F1b3RpZW50X29wPFQsIFQ+ID46OkNvc3QpICsKKyAgICAgICAgICAgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2V4cF9vcDxUPiA+OjpDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IEdhdXNzaWFuR2VuZXJhdG9yPFQsIEluZGV4LCBOdW1EaW1zPjo6UGFja2V0QWNjZXNzCisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9GVU5DVE9SU19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckdlbmVyYXRvci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFkNDkzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHZW5lcmF0b3IuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0dFTkVSQVRPUl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfR0VORVJBVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JHZW5lcmF0b3IKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIGdlbmVyYXRvciBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgR2VuZXJhdG9yLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JHZW5lcmF0b3JPcDxHZW5lcmF0b3IsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBHZW5lcmF0b3IsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JHZW5lcmF0b3JPcDxHZW5lcmF0b3IsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEdlbmVyYXRvciwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JHZW5lcmF0b3JPcDxHZW5lcmF0b3IsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgR2VuZXJhdG9yLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yR2VuZXJhdG9yT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JHZW5lcmF0b3JPcDxHZW5lcmF0b3IsIFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckdlbmVyYXRvck9wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvckdlbmVyYXRvck9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yR2VuZXJhdG9yT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JHZW5lcmF0b3JPcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yR2VuZXJhdG9yT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgR2VuZXJhdG9yJiBnZW5lcmF0b3IpCisgICAgICA6IG1feHByKGV4cHIpLCBtX2dlbmVyYXRvcihnZW5lcmF0b3IpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IEdlbmVyYXRvciYgZ2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9nZW5lcmF0b3I7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IEdlbmVyYXRvciBtX2dlbmVyYXRvcjsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIEdlbmVyYXRvciwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JHZW5lcmF0b3JPcDxHZW5lcmF0b3IsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yR2VuZXJhdG9yT3A8R2VuZXJhdG9yLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPERpbWVuc2lvbnM+Ojp2YWx1ZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gKGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemUgPiAxKSwKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1fZ2VuZXJhdG9yKG9wLmdlbmVyYXRvcigpKQorICB7CisgICAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gaW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSk7CisgICAgbV9kaW1lbnNpb25zID0gaW1wbC5kaW1lbnNpb25zKCk7CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX3N0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9zdHJpZGVzW2ldID0gbV9zdHJpZGVzW2kgLSAxXSAqIG1fZGltZW5zaW9uc1tpIC0gMV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1fc3RyaWRlc1tOdW1EaW1zIC0gMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX3N0cmlkZXNbaV0gPSBtX3N0cmlkZXNbaSArIDFdICogbV9kaW1lbnNpb25zW2kgKyAxXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiAvKmRhdGEqLykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gY29vcmRzOworICAgIGV4dHJhY3RfY29vcmRpbmF0ZXMoaW5kZXgsIGNvb3Jkcyk7CisgICAgcmV0dXJuIG1fZ2VuZXJhdG9yKGNvb3Jkcyk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBjb25zdCBpbnQgcGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgocGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K3BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1twYWNrZXRTaXplXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7ICsraSkgeworICAgICAgdmFsdWVzW2ldID0gY29lZmYoaW5kZXgraSk7CisgICAgfQorICAgIFBhY2tldFJldHVyblR5cGUgcnNsdCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMpOworICAgIHJldHVybiByc2x0OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QKKyAgY29zdFBlckNvZWZmKGJvb2wpIGNvbnN0IHsKKyAgICAvLyBUT0RPKHJtbGFyc2VuKTogVGhpcyBpcyBqdXN0IGEgcGxhY2Vob2xkZXIuIERlZmluZSBpbnRlcmZhY2UgdG8gbWFrZQorICAgIC8vIGdlbmVyYXRvcnMgcmV0dXJuIHRoZWlyIGNvc3QuCisgICAgcmV0dXJuIFRlbnNvck9wQ29zdCgwLCAwLCBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8U2NhbGFyPigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW5zb3JPcENvc3Q6Ok11bENvc3Q8U2NhbGFyPigpKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworIHByb3RlY3RlZDoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIGV4dHJhY3RfY29vcmRpbmF0ZXMoSW5kZXggaW5kZXgsIGFycmF5PEluZGV4LCBOdW1EaW1zPiYgY29vcmRzKSBjb25zdCB7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9zdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX3N0cmlkZXNbaV07CisgICAgICAgIGNvb3Jkc1tpXSA9IGlkeDsKKyAgICAgIH0KKyAgICAgIGNvb3Jkc1swXSA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX3N0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fc3RyaWRlc1tpXTsKKyAgICAgICAgY29vcmRzW2ldID0gaWR4OworICAgICAgfQorICAgICAgY29vcmRzW051bURpbXMtMV0gPSBpbmRleDsKKyAgICB9CisgIH0KKworICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fc3RyaWRlczsKKyAgR2VuZXJhdG9yIG1fZ2VuZXJhdG9yOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0dFTkVSQVRPUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckdsb2JhbEZ1bmN0aW9ucy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHbG9iYWxGdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjViODYxCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHbG9iYWxGdW5jdGlvbnMuaApAQCAtMCwwICsxLDMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBFdWdlbmUgQnJldmRvIDxlYnJldmRvQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9HTE9CQUxfRlVOQ1RJT05TX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9HTE9CQUxfRlVOQ1RJT05TX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjcHAxMSBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGJldGFpbmMoXGEgeCwgXGEgYSwgXGEgYikgdG8gdGhlIGdpdmVuIHRlbnNvcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgcmVndWxhcml6ZWQgaW5jb21wbGV0ZSBiZXRhIGZ1bmN0aW9uIChpbnRlZ3JhbCkuCisgKgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQURlcml2ZWQsIHR5cGVuYW1lIEJEZXJpdmVkLCB0eXBlbmFtZSBYRGVyaXZlZD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QKKyAgICBUZW5zb3JDd2lzZVRlcm5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2JldGFpbmNfb3A8dHlwZW5hbWUgWERlcml2ZWQ6OlNjYWxhcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQURlcml2ZWQsIGNvbnN0IEJEZXJpdmVkLCBjb25zdCBYRGVyaXZlZD4KKyAgICBiZXRhaW5jKGNvbnN0IEFEZXJpdmVkJiBhLCBjb25zdCBCRGVyaXZlZCYgYiwgY29uc3QgWERlcml2ZWQmIHgpIHsKKyAgcmV0dXJuIFRlbnNvckN3aXNlVGVybmFyeU9wPAorICAgICAgaW50ZXJuYWw6OnNjYWxhcl9iZXRhaW5jX29wPHR5cGVuYW1lIFhEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBBRGVyaXZlZCwKKyAgICAgIGNvbnN0IEJEZXJpdmVkLCBjb25zdCBYRGVyaXZlZD4oCisgICAgICBhLCBiLCB4LCBpbnRlcm5hbDo6c2NhbGFyX2JldGFpbmNfb3A8dHlwZW5hbWUgWERlcml2ZWQ6OlNjYWxhcj4oKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9HTE9CQUxfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySU8uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTAxYzVkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJTy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JT19ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU9fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcmludCB0aGUgdGVuc29yIGFzIGEgMmQgbWF0cml4Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yLCBpbnQgUmFuaz4KK3N0cnVjdCBUZW5zb3JQcmludGVyIHsKKyAgc3RhdGljIHZvaWQgcnVuIChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZW5zb3ImIHRlbnNvcikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBUZW5zb3I6OlNjYWxhcj46OnR5cGUgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yOjpJbmRleCBJbmRleDsKKyAgICBjb25zdCBJbmRleCB0b3RhbF9zaXplID0gaW50ZXJuYWw6OmFycmF5X3Byb2QodGVuc29yLmRpbWVuc2lvbnMoKSk7CisgICAgaWYgKHRvdGFsX3NpemUgPiAwKSB7CisgICAgICBjb25zdCBJbmRleCBmaXJzdF9kaW0gPSBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2dldDwwPih0ZW5zb3IuZGltZW5zaW9ucygpKTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgbGF5b3V0ID0gVGVuc29yOjpMYXlvdXQ7CisgICAgICBNYXA8Y29uc3QgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBsYXlvdXQ+ID4gbWF0cml4KGNvbnN0X2Nhc3Q8U2NhbGFyKj4odGVuc29yLmRhdGEoKSksIGZpcnN0X2RpbSwgdG90YWxfc2l6ZS9maXJzdF9kaW0pOworICAgICAgb3MgPDwgbWF0cml4OworICAgIH0KKyAgfQorfTsKKworCisvLyBQcmludCB0aGUgdGVuc29yIGFzIGEgdmVjdG9yCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yPgorc3RydWN0IFRlbnNvclByaW50ZXI8VGVuc29yLCAxPiB7CisgIHN0YXRpYyB2b2lkIHJ1biAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVuc29yJiB0ZW5zb3IpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgVGVuc29yOjpTY2FsYXI+Ojp0eXBlIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjo6SW5kZXggSW5kZXg7CisgICAgY29uc3QgSW5kZXggdG90YWxfc2l6ZSA9IGludGVybmFsOjphcnJheV9wcm9kKHRlbnNvci5kaW1lbnNpb25zKCkpOworICAgIGlmICh0b3RhbF9zaXplID4gMCkgeworICAgICAgTWFwPGNvbnN0IEFycmF5PFNjYWxhciwgRHluYW1pYywgMT4gPiBhcnJheShjb25zdF9jYXN0PFNjYWxhcio+KHRlbnNvci5kYXRhKCkpLCB0b3RhbF9zaXplKTsKKyAgICAgIG9zIDw8IGFycmF5OworICAgIH0KKyAgfQorfTsKKworCisvLyBQcmludCB0aGUgdGVuc29yIGFzIGEgc2NhbGFyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yPgorc3RydWN0IFRlbnNvclByaW50ZXI8VGVuc29yLCAwPiB7CisgIHN0YXRpYyB2b2lkIHJ1biAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVuc29yJiB0ZW5zb3IpIHsKKyAgICBvcyA8PCB0ZW5zb3IuY29lZmYoMCk7CisgIH0KK307Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVuc29yQmFzZTxULCBSZWFkT25seUFjY2Vzc29ycz4mIGV4cHIpIHsKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yRm9yY2VkRXZhbE9wPGNvbnN0IFQ+LCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgRXZhbHVhdG9yOjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgLy8gRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gaWYgbmVlZGVkCisgIFRlbnNvckZvcmNlZEV2YWxPcDxjb25zdCBUPiBldmFsID0gZXhwci5ldmFsKCk7CisgIEV2YWx1YXRvciB0ZW5zb3IoZXZhbCwgRGVmYXVsdERldmljZSgpKTsKKyAgdGVuc29yLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworCisgIC8vIFByaW50IHRoZSByZXN1bHQKKyAgc3RhdGljIGNvbnN0IGludCByYW5rID0gaW50ZXJuYWw6OmFycmF5X3NpemU8RGltZW5zaW9ucz46OnZhbHVlOworICBpbnRlcm5hbDo6VGVuc29yUHJpbnRlcjxFdmFsdWF0b3IsIHJhbms+OjpydW4ob3MsIHRlbnNvcik7CisKKyAgLy8gQ2xlYW51cC4KKyAgdGVuc29yLmNsZWFudXAoKTsKKyAgcmV0dXJuIG9zOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU9fSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbWFnZVBhdGNoLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckltYWdlUGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY4NTZlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbWFnZVBhdGNoLmgKQEAgLTAsMCArMSw1MDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JTUFHRV9QQVRDSF9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU1BR0VfUEFUQ0hfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckltYWdlUGF0Y2gKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUGF0Y2ggZXh0cmFjdGlvbiBzcGVjaWFsaXplZCBmb3IgaW1hZ2UgcHJvY2Vzc2luZy4KKyAgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgaW5wdXQgaGFzIGEgbGVhc3QgMyBkaW1lbnNpb25zIG9yZGVyZWQgYXMgZm9sbG93OgorICAqICAxc3QgZGltZW5zaW9uOiBjaGFubmVscyAob2Ygc2l6ZSBkKQorICAqICAybmQgZGltZW5zaW9uOiByb3dzIChvZiBzaXplIHIpCisgICogIDNyZCBkaW1lbnNpb246IGNvbHVtbnMgKG9mIHNpemUgYykKKyAgKiAgVGhlcmUgY2FuIGJlIGFkZGl0aW9uYWwgZGltZW5zaW9ucyBzdWNoIGFzIHRpbWUgKGZvciB2aWRlbykgb3IgYmF0Y2ggKGZvcgorICAqIGJ1bGsgcHJvY2Vzc2luZyBhZnRlciB0aGUgZmlyc3QgMy4KKyAgKiBDYWxsaW5nIHRoZSBpbWFnZSBwYXRjaCBjb2RlIHdpdGggcGF0Y2hfcm93cyBhbmQgcGF0Y2hfY29scyBpcyBlcXVpdmFsZW50CisgICogdG8gY2FsbGluZyB0aGUgcmVndWxhciBwYXRjaCBleHRyYWN0aW9uIGNvZGUgd2l0aCBwYXJhbWV0ZXJzIGQsIHBhdGNoX3Jvd3MsCisgICogcGF0Y2hfY29scywgYW5kIDEgZm9yIGFsbCB0aGUgYWRkaXRpb25hbCBkaW1lbnNpb25zLgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPERlbnNlSW5kZXggUm93cywgRGVuc2VJbmRleCBDb2xzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JJbWFnZVBhdGNoT3A8Um93cywgQ29scywgWHByVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcj46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9ucyArIDE7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTxEZW5zZUluZGV4IFJvd3MsIERlbnNlSW5kZXggQ29scywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvckltYWdlUGF0Y2hPcDxSb3dzLCBDb2xzLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckltYWdlUGF0Y2hPcDxSb3dzLCBDb2xzLCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPERlbnNlSW5kZXggUm93cywgRGVuc2VJbmRleCBDb2xzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JJbWFnZVBhdGNoT3A8Um93cywgQ29scywgWHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29ySW1hZ2VQYXRjaE9wPFJvd3MsIENvbHMsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29ySW1hZ2VQYXRjaE9wPFJvd3MsIENvbHMsIFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPERlbnNlSW5kZXggUm93cywgRGVuc2VJbmRleCBDb2xzLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29ySW1hZ2VQYXRjaE9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29ySW1hZ2VQYXRjaE9wPFJvd3MsIENvbHMsIFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckltYWdlUGF0Y2hPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JJbWFnZVBhdGNoT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JJbWFnZVBhdGNoT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JJbWFnZVBhdGNoT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckltYWdlUGF0Y2hPcChjb25zdCBYcHJUeXBlJiBleHByLCBEZW5zZUluZGV4IHBhdGNoX3Jvd3MsIERlbnNlSW5kZXggcGF0Y2hfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCByb3dfc3RyaWRlcywgRGVuc2VJbmRleCBjb2xfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCBpbl9yb3dfc3RyaWRlcywgRGVuc2VJbmRleCBpbl9jb2xfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGVzLCBEZW5zZUluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZGRpbmdUeXBlIHBhZGRpbmdfdHlwZSwgU2NhbGFyIHBhZGRpbmdfdmFsdWUpCisgICAgICA6IG1feHByKGV4cHIpLCBtX3BhdGNoX3Jvd3MocGF0Y2hfcm93cyksIG1fcGF0Y2hfY29scyhwYXRjaF9jb2xzKSwKKyAgICAgICAgbV9yb3dfc3RyaWRlcyhyb3dfc3RyaWRlcyksIG1fY29sX3N0cmlkZXMoY29sX3N0cmlkZXMpLAorICAgICAgICBtX2luX3Jvd19zdHJpZGVzKGluX3Jvd19zdHJpZGVzKSwgbV9pbl9jb2xfc3RyaWRlcyhpbl9jb2xfc3RyaWRlcyksCisgICAgICAgIG1fcm93X2luZmxhdGVfc3RyaWRlcyhyb3dfaW5mbGF0ZV9zdHJpZGVzKSwgbV9jb2xfaW5mbGF0ZV9zdHJpZGVzKGNvbF9pbmZsYXRlX3N0cmlkZXMpLAorICAgICAgICBtX3BhZGRpbmdfZXhwbGljaXQoZmFsc2UpLCBtX3BhZGRpbmdfdG9wKDApLCBtX3BhZGRpbmdfYm90dG9tKDApLCBtX3BhZGRpbmdfbGVmdCgwKSwgbV9wYWRkaW5nX3JpZ2h0KDApLAorICAgICAgICBtX3BhZGRpbmdfdHlwZShwYWRkaW5nX3R5cGUpLCBtX3BhZGRpbmdfdmFsdWUocGFkZGluZ192YWx1ZSkge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckltYWdlUGF0Y2hPcChjb25zdCBYcHJUeXBlJiBleHByLCBEZW5zZUluZGV4IHBhdGNoX3Jvd3MsIERlbnNlSW5kZXggcGF0Y2hfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCByb3dfc3RyaWRlcywgRGVuc2VJbmRleCBjb2xfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCBpbl9yb3dfc3RyaWRlcywgRGVuc2VJbmRleCBpbl9jb2xfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGVzLCBEZW5zZUluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlSW5kZXggcGFkZGluZ190b3AsIERlbnNlSW5kZXggcGFkZGluZ19ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlSW5kZXggcGFkZGluZ19sZWZ0LCBEZW5zZUluZGV4IHBhZGRpbmdfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciBwYWRkaW5nX3ZhbHVlKQorICAgICAgOiBtX3hwcihleHByKSwgbV9wYXRjaF9yb3dzKHBhdGNoX3Jvd3MpLCBtX3BhdGNoX2NvbHMocGF0Y2hfY29scyksCisgICAgICAgIG1fcm93X3N0cmlkZXMocm93X3N0cmlkZXMpLCBtX2NvbF9zdHJpZGVzKGNvbF9zdHJpZGVzKSwKKyAgICAgICAgbV9pbl9yb3dfc3RyaWRlcyhpbl9yb3dfc3RyaWRlcyksIG1faW5fY29sX3N0cmlkZXMoaW5fY29sX3N0cmlkZXMpLAorICAgICAgICBtX3Jvd19pbmZsYXRlX3N0cmlkZXMocm93X2luZmxhdGVfc3RyaWRlcyksIG1fY29sX2luZmxhdGVfc3RyaWRlcyhjb2xfaW5mbGF0ZV9zdHJpZGVzKSwKKyAgICAgICAgbV9wYWRkaW5nX2V4cGxpY2l0KHRydWUpLCBtX3BhZGRpbmdfdG9wKHBhZGRpbmdfdG9wKSwgbV9wYWRkaW5nX2JvdHRvbShwYWRkaW5nX2JvdHRvbSksCisgICAgICAgIG1fcGFkZGluZ19sZWZ0KHBhZGRpbmdfbGVmdCksIG1fcGFkZGluZ19yaWdodChwYWRkaW5nX3JpZ2h0KSwKKyAgICAgICAgbV9wYWRkaW5nX3R5cGUoUEFERElOR19WQUxJRCksIG1fcGFkZGluZ192YWx1ZShwYWRkaW5nX3ZhbHVlKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IHBhdGNoX3Jvd3MoKSBjb25zdCB7IHJldHVybiBtX3BhdGNoX3Jvd3M7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggcGF0Y2hfY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcGF0Y2hfY29sczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCByb3dfc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcm93X3N0cmlkZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggY29sX3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX2NvbF9zdHJpZGVzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IGluX3Jvd19zdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gbV9pbl9yb3dfc3RyaWRlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBpbl9jb2xfc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1faW5fY29sX3N0cmlkZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggcm93X2luZmxhdGVfc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcm93X2luZmxhdGVfc3RyaWRlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBjb2xfaW5mbGF0ZV9zdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xfaW5mbGF0ZV9zdHJpZGVzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBib29sIHBhZGRpbmdfZXhwbGljaXQoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfZXhwbGljaXQ7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggcGFkZGluZ190b3AoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdG9wOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IHBhZGRpbmdfYm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9wYWRkaW5nX2JvdHRvbTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYWRkaW5nX2xlZnQoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfbGVmdDsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYWRkaW5nX3JpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9wYWRkaW5nX3JpZ2h0OyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBQYWRkaW5nVHlwZSBwYWRkaW5nX3R5cGUoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdHlwZTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2NhbGFyIHBhZGRpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdmFsdWU7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYXRjaF9yb3dzOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYXRjaF9jb2xzOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9yb3dfc3RyaWRlczsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1fY29sX3N0cmlkZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX2luX3Jvd19zdHJpZGVzOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9pbl9jb2xfc3RyaWRlczsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1fcm93X2luZmxhdGVfc3RyaWRlczsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1fY29sX2luZmxhdGVfc3RyaWRlczsKKyAgICBjb25zdCBib29sIG1fcGFkZGluZ19leHBsaWNpdDsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1fcGFkZGluZ190b3A7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhZGRpbmdfYm90dG9tOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYWRkaW5nX2xlZnQ7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhZGRpbmdfcmlnaHQ7CisgICAgY29uc3QgUGFkZGluZ1R5cGUgbV9wYWRkaW5nX3R5cGU7CisgICAgY29uc3QgU2NhbGFyIG1fcGFkZGluZ192YWx1ZTsKK307CisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTxEZW5zZUluZGV4IFJvd3MsIERlbnNlSW5kZXggQ29scywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JJbWFnZVBhdGNoT3A8Um93cywgQ29scywgQXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JJbWFnZVBhdGNoT3A8Um93cywgQ29scywgQXJnVHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1JbnB1dERpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBOdW1JbnB1dERpbXMgKyAxOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcj46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JJbWFnZVBhdGNoT3A8Um93cywgQ29scywgQXJnVHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZT4gU2VsZjsKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBJbXBsOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtRGltcyA+PSA0KSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIG1fcGFkZGluZ1ZhbHVlID0gb3AucGFkZGluZ192YWx1ZSgpOworCisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2ltcGwuZGltZW5zaW9ucygpOworCisgICAgLy8gQ2FjaGVzIGEgZmV3IHZhcmlhYmxlcy4KKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX2lucHV0RGVwdGggPSBpbnB1dF9kaW1zWzBdOworICAgICAgbV9pbnB1dFJvd3MgPSBpbnB1dF9kaW1zWzFdOworICAgICAgbV9pbnB1dENvbHMgPSBpbnB1dF9kaW1zWzJdOworICAgIH0gZWxzZSB7CisgICAgICBtX2lucHV0RGVwdGggPSBpbnB1dF9kaW1zW051bUlucHV0RGltcy0xXTsKKyAgICAgIG1faW5wdXRSb3dzID0gaW5wdXRfZGltc1tOdW1JbnB1dERpbXMtMl07CisgICAgICBtX2lucHV0Q29scyA9IGlucHV0X2RpbXNbTnVtSW5wdXREaW1zLTNdOworICAgIH0KKworICAgIG1fcm93X3N0cmlkZXMgPSBvcC5yb3dfc3RyaWRlcygpOworICAgIG1fY29sX3N0cmlkZXMgPSBvcC5jb2xfc3RyaWRlcygpOworCisgICAgLy8gSW5wdXQgc3RyaWRlcyBhbmQgZWZmZWN0aXZlIGlucHV0L3BhdGNoIHNpemUKKyAgICBtX2luX3Jvd19zdHJpZGVzID0gb3AuaW5fcm93X3N0cmlkZXMoKTsKKyAgICBtX2luX2NvbF9zdHJpZGVzID0gb3AuaW5fY29sX3N0cmlkZXMoKTsKKyAgICBtX3Jvd19pbmZsYXRlX3N0cmlkZXMgPSBvcC5yb3dfaW5mbGF0ZV9zdHJpZGVzKCk7CisgICAgbV9jb2xfaW5mbGF0ZV9zdHJpZGVzID0gb3AuY29sX2luZmxhdGVfc3RyaWRlcygpOworICAgIC8vIFRoZSAiZWZmZWN0aXZlIiBpbnB1dCByb3dzIGFuZCBpbnB1dCBjb2xzIGFyZSB0aGUgaW5wdXQgcm93cyBhbmQgY29scworICAgIC8vIGFmdGVyIGluZmxhdGluZyB0aGVtIHdpdGggemVyb3MuCisgICAgLy8gRm9yIGV4YW1wbGVzLCBhIDJ4MyBtYXRyaXggd2l0aCByb3dfaW5mbGF0ZV9zdHJpZGVzIGFuZAorICAgIC8vIGNvbF9pbmZsYXRlX3N0cmlkZXMgb2YgMiBjb21lcyBmcm9tOgorICAgIC8vICAgQSBCIEMKKyAgICAvLyAgIEQgRSBGCisgICAgLy8KKyAgICAvLyB0byBhIG1hdHJpeCBpcyAzIHggNToKKyAgICAvLworICAgIC8vICAgQSAuIEIgLiBDCisgICAgLy8gICAuIC4gLiAuIC4KKyAgICAvLyAgIEQgLiBFIC4gRgorCisgICAgbV9pbnB1dF9yb3dzX2VmZiA9IChtX2lucHV0Um93cyAtIDEpICogbV9yb3dfaW5mbGF0ZV9zdHJpZGVzICsgMTsKKyAgICBtX2lucHV0X2NvbHNfZWZmID0gKG1faW5wdXRDb2xzIC0gMSkgKiBtX2NvbF9pbmZsYXRlX3N0cmlkZXMgKyAxOworICAgIG1fcGF0Y2hfcm93c19lZmYgPSBvcC5wYXRjaF9yb3dzKCkgKyAob3AucGF0Y2hfcm93cygpIC0gMSkgKiAobV9pbl9yb3dfc3RyaWRlcyAtIDEpOworICAgIG1fcGF0Y2hfY29sc19lZmYgPSBvcC5wYXRjaF9jb2xzKCkgKyAob3AucGF0Y2hfY29scygpIC0gMSkgKiAobV9pbl9jb2xfc3RyaWRlcyAtIDEpOworCisgICAgaWYgKG9wLnBhZGRpbmdfZXhwbGljaXQoKSkgeworICAgICAgbV9vdXRwdXRSb3dzID0gbnVtZXh0OjpjZWlsKChtX2lucHV0X3Jvd3NfZWZmICsgb3AucGFkZGluZ190b3AoKSArIG9wLnBhZGRpbmdfYm90dG9tKCkgLSBtX3BhdGNoX3Jvd3NfZWZmICsgMS5mKSAvIHN0YXRpY19jYXN0PGZsb2F0PihtX3Jvd19zdHJpZGVzKSk7CisgICAgICBtX291dHB1dENvbHMgPSBudW1leHQ6OmNlaWwoKG1faW5wdXRfY29sc19lZmYgKyBvcC5wYWRkaW5nX2xlZnQoKSArIG9wLnBhZGRpbmdfcmlnaHQoKSAtIG1fcGF0Y2hfY29sc19lZmYgKyAxLmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29sX3N0cmlkZXMpKTsKKyAgICAgIG1fcm93UGFkZGluZ1RvcCA9IG9wLnBhZGRpbmdfdG9wKCk7CisgICAgICBtX2NvbFBhZGRpbmdMZWZ0ID0gb3AucGFkZGluZ19sZWZ0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENvbXB1dGluZyBwYWRkaW5nIGZyb20gdGhlIHR5cGUKKyAgICAgIHN3aXRjaCAob3AucGFkZGluZ190eXBlKCkpIHsKKyAgICAgICAgY2FzZSBQQURESU5HX1ZBTElEOgorICAgICAgICAgIG1fb3V0cHV0Um93cyA9IG51bWV4dDo6Y2VpbCgobV9pbnB1dF9yb3dzX2VmZiAtIG1fcGF0Y2hfcm93c19lZmYgKyAxLmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fcm93X3N0cmlkZXMpKTsKKyAgICAgICAgICBtX291dHB1dENvbHMgPSBudW1leHQ6OmNlaWwoKG1faW5wdXRfY29sc19lZmYgLSBtX3BhdGNoX2NvbHNfZWZmICsgMS5mKSAvIHN0YXRpY19jYXN0PGZsb2F0PihtX2NvbF9zdHJpZGVzKSk7CisgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwYWRkaW5nCisgICAgICAgICAgbV9yb3dQYWRkaW5nVG9wID0gbnVtZXh0OjptYXhpPEluZGV4PigwLCAoKG1fb3V0cHV0Um93cyAtIDEpICogbV9yb3dfc3RyaWRlcyArIG1fcGF0Y2hfcm93c19lZmYgLSBtX2lucHV0X3Jvd3NfZWZmKSAvIDIpOworICAgICAgICAgIG1fY29sUGFkZGluZ0xlZnQgPSBudW1leHQ6Om1heGk8SW5kZXg+KDAsICgobV9vdXRwdXRDb2xzIC0gMSkgKiBtX2NvbF9zdHJpZGVzICsgbV9wYXRjaF9jb2xzX2VmZiAtIG1faW5wdXRfY29sc19lZmYpIC8gMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFERElOR19TQU1FOgorICAgICAgICAgIG1fb3V0cHV0Um93cyA9IG51bWV4dDo6Y2VpbChtX2lucHV0X3Jvd3NfZWZmIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fcm93X3N0cmlkZXMpKTsKKyAgICAgICAgICBtX291dHB1dENvbHMgPSBudW1leHQ6OmNlaWwobV9pbnB1dF9jb2xzX2VmZiAvIHN0YXRpY19jYXN0PGZsb2F0PihtX2NvbF9zdHJpZGVzKSk7CisgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwYWRkaW5nCisgICAgICAgICAgbV9yb3dQYWRkaW5nVG9wID0gKChtX291dHB1dFJvd3MgLSAxKSAqIG1fcm93X3N0cmlkZXMgKyBtX3BhdGNoX3Jvd3NfZWZmIC0gbV9pbnB1dF9yb3dzX2VmZikgLyAyOworICAgICAgICAgIG1fY29sUGFkZGluZ0xlZnQgPSAoKG1fb3V0cHV0Q29scyAtIDEpICogbV9jb2xfc3RyaWRlcyArIG1fcGF0Y2hfY29sc19lZmYgLSBtX2lucHV0X2NvbHNfZWZmKSAvIDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJ1bmV4cGVjdGVkIHBhZGRpbmciKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWlnZW5fYXNzZXJ0KG1fb3V0cHV0Um93cyA+IDApOworICAgIGVpZ2VuX2Fzc2VydChtX291dHB1dENvbHMgPiAwKTsKKworICAgIC8vIERpbWVuc2lvbnMgZm9yIHJlc3VsdCBvZiBleHRyYWN0aW9uLgorICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIC8vIENvbE1ham9yCisgICAgICAvLyAwOiBkZXB0aAorICAgICAgLy8gMTogcGF0Y2hfcm93cworICAgICAgLy8gMjogcGF0Y2hfY29scworICAgICAgLy8gMzogbnVtYmVyIG9mIHBhdGNoZXMKKyAgICAgIC8vIDQgYW5kIGJleW9uZDogYW55dGhpbmcgZWxzZSAoc3VjaCBhcyBiYXRjaCkuCisgICAgICBtX2RpbWVuc2lvbnNbMF0gPSBpbnB1dF9kaW1zWzBdOworICAgICAgbV9kaW1lbnNpb25zWzFdID0gb3AucGF0Y2hfcm93cygpOworICAgICAgbV9kaW1lbnNpb25zWzJdID0gb3AucGF0Y2hfY29scygpOworICAgICAgbV9kaW1lbnNpb25zWzNdID0gbV9vdXRwdXRSb3dzICogbV9vdXRwdXRDb2xzOworICAgICAgZm9yIChpbnQgaSA9IDQ7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9kaW1lbnNpb25zW2ldID0gaW5wdXRfZGltc1tpLTFdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBSb3dNYWpvcgorICAgICAgLy8gTnVtRGltcy0xOiBkZXB0aAorICAgICAgLy8gTnVtRGltcy0yOiBwYXRjaF9yb3dzCisgICAgICAvLyBOdW1EaW1zLTM6IHBhdGNoX2NvbHMKKyAgICAgIC8vIE51bURpbXMtNDogbnVtYmVyIG9mIHBhdGNoZXMKKyAgICAgIC8vIE51bURpbXMtNSBhbmQgYmV5b25kOiBhbnl0aGluZyBlbHNlIChzdWNoIGFzIGJhdGNoKS4KKyAgICAgIG1fZGltZW5zaW9uc1tOdW1EaW1zLTFdID0gaW5wdXRfZGltc1tOdW1JbnB1dERpbXMtMV07CisgICAgICBtX2RpbWVuc2lvbnNbTnVtRGltcy0yXSA9IG9wLnBhdGNoX3Jvd3MoKTsKKyAgICAgIG1fZGltZW5zaW9uc1tOdW1EaW1zLTNdID0gb3AucGF0Y2hfY29scygpOworICAgICAgbV9kaW1lbnNpb25zW051bURpbXMtNF0gPSBtX291dHB1dFJvd3MgKiBtX291dHB1dENvbHM7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcy01OyBpID49IDA7IC0taSkgeworICAgICAgICBtX2RpbWVuc2lvbnNbaV0gPSBpbnB1dF9kaW1zW2ldOworICAgICAgfQorICAgIH0KKworICAgIC8vIFN0cmlkZXMgZm9yIG1vdmluZyB0aGUgcGF0Y2ggaW4gdmFyaW91cyBkaW1lbnNpb25zLgorICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIG1fY29sU3RyaWRlID0gbV9kaW1lbnNpb25zWzFdOworICAgICAgbV9wYXRjaFN0cmlkZSA9IG1fY29sU3RyaWRlICogbV9kaW1lbnNpb25zWzJdICogbV9kaW1lbnNpb25zWzBdOworICAgICAgbV9vdGhlclN0cmlkZSA9IG1fcGF0Y2hTdHJpZGUgKiBtX2RpbWVuc2lvbnNbM107CisgICAgfSBlbHNlIHsKKyAgICAgIG1fY29sU3RyaWRlID0gbV9kaW1lbnNpb25zW051bURpbXMtMl07CisgICAgICBtX3BhdGNoU3RyaWRlID0gbV9jb2xTdHJpZGUgKiBtX2RpbWVuc2lvbnNbTnVtRGltcy0zXSAqIG1fZGltZW5zaW9uc1tOdW1EaW1zLTFdOworICAgICAgbV9vdGhlclN0cmlkZSA9IG1fcGF0Y2hTdHJpZGUgKiBtX2RpbWVuc2lvbnNbTnVtRGltcy00XTsKKyAgICB9CisKKyAgICAvLyBTdHJpZGVzIGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGlucHV0IHRlbnNvci4KKyAgICBtX3Jvd0lucHV0U3RyaWRlID0gbV9pbnB1dERlcHRoOworICAgIG1fY29sSW5wdXRTdHJpZGUgPSBtX2lucHV0RGVwdGggKiBtX2lucHV0Um93czsKKyAgICBtX3BhdGNoSW5wdXRTdHJpZGUgPSBtX2lucHV0RGVwdGggKiBtX2lucHV0Um93cyAqIG1faW5wdXRDb2xzOworCisgICAgLy8gRmFzdCByZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IHZhcmlhYmxlcy4KKyAgICBtX2Zhc3RPdGhlclN0cmlkZSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX290aGVyU3RyaWRlKTsKKyAgICBtX2Zhc3RQYXRjaFN0cmlkZSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX3BhdGNoU3RyaWRlKTsKKyAgICBtX2Zhc3RDb2xTdHJpZGUgPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9jb2xTdHJpZGUpOworICAgIG1fZmFzdEluZmxhdGVSb3dTdHJpZGUgPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9yb3dfaW5mbGF0ZV9zdHJpZGVzKTsKKyAgICBtX2Zhc3RJbmZsYXRlQ29sU3RyaWRlID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fY29sX2luZmxhdGVfc3RyaWRlcyk7CisgICAgbV9mYXN0SW5wdXRDb2xzRWZmID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1faW5wdXRfY29sc19lZmYpOworCisgICAgLy8gTnVtYmVyIG9mIHBhdGNoZXMgaW4gdGhlIHdpZHRoIGRpbWVuc2lvbi4KKyAgICBtX2Zhc3RPdXRwdXRSb3dzID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fb3V0cHV0Um93cyk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9mYXN0T3V0cHV0RGVwdGggPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9kaW1lbnNpb25zWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9mYXN0T3V0cHV0RGVwdGggPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9kaW1lbnNpb25zW051bURpbXMtMV0pOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqIC8qZGF0YSovKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgLy8gUGF0Y2ggaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgIGNvbnN0IEluZGV4IHBhdGNoSW5kZXggPSBpbmRleCAvIG1fZmFzdFBhdGNoU3RyaWRlOworICAgIC8vIEZpbmQgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCB3cnQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBlbGVtZW50LgorICAgIGNvbnN0IEluZGV4IHBhdGNoT2Zmc2V0ID0gKGluZGV4IC0gcGF0Y2hJbmRleCAqIG1fcGF0Y2hTdHJpZGUpIC8gbV9mYXN0T3V0cHV0RGVwdGg7CisKKyAgICAvLyBPdGhlciB3YXlzIHRvIGluZGV4IHRoaXMgZWxlbWVudC4KKyAgICBjb25zdCBJbmRleCBvdGhlckluZGV4ID0gKE51bURpbXMgPT0gNCkgPyAwIDogaW5kZXggLyBtX2Zhc3RPdGhlclN0cmlkZTsKKyAgICBjb25zdCBJbmRleCBwYXRjaDJESW5kZXggPSAoTnVtRGltcyA9PSA0KSA/IHBhdGNoSW5kZXggOiAoaW5kZXggLSBvdGhlckluZGV4ICogbV9vdGhlclN0cmlkZSkgLyBtX2Zhc3RQYXRjaFN0cmlkZTsKKworICAgIC8vIENhbGN1bGF0ZSBjb2wgaW5kZXggaW4gdGhlIGlucHV0IG9yaWdpbmFsIHRlbnNvci4KKyAgICBjb25zdCBJbmRleCBjb2xJbmRleCA9IHBhdGNoMkRJbmRleCAvIG1fZmFzdE91dHB1dFJvd3M7CisgICAgY29uc3QgSW5kZXggY29sT2Zmc2V0ID0gcGF0Y2hPZmZzZXQgLyBtX2Zhc3RDb2xTdHJpZGU7CisgICAgY29uc3QgSW5kZXggaW5wdXRDb2wgPSBjb2xJbmRleCAqIG1fY29sX3N0cmlkZXMgKyBjb2xPZmZzZXQgKiBtX2luX2NvbF9zdHJpZGVzIC0gbV9jb2xQYWRkaW5nTGVmdDsKKyAgICBjb25zdCBJbmRleCBvcmlnSW5wdXRDb2wgPSAobV9jb2xfaW5mbGF0ZV9zdHJpZGVzID09IDEpID8gaW5wdXRDb2wgOiAoKGlucHV0Q29sID49IDApID8gKGlucHV0Q29sIC8gbV9mYXN0SW5mbGF0ZUNvbFN0cmlkZSkgOiAwKTsKKyAgICBpZiAoaW5wdXRDb2wgPCAwIHx8IGlucHV0Q29sID49IG1faW5wdXRfY29sc19lZmYgfHwKKyAgICAgICAgKChtX2NvbF9pbmZsYXRlX3N0cmlkZXMgIT0gMSkgJiYgKGlucHV0Q29sICE9IG9yaWdJbnB1dENvbCAqIG1fY29sX2luZmxhdGVfc3RyaWRlcykpKSB7CisgICAgICByZXR1cm4gU2NhbGFyKG1fcGFkZGluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgcm93IGluZGV4IGluIHRoZSBvcmlnaW5hbCBpbnB1dCB0ZW5zb3IuCisgICAgY29uc3QgSW5kZXggcm93SW5kZXggPSBwYXRjaDJESW5kZXggLSBjb2xJbmRleCAqIG1fb3V0cHV0Um93czsKKyAgICBjb25zdCBJbmRleCByb3dPZmZzZXQgPSBwYXRjaE9mZnNldCAtIGNvbE9mZnNldCAqIG1fY29sU3RyaWRlOworICAgIGNvbnN0IEluZGV4IGlucHV0Um93ID0gcm93SW5kZXggKiBtX3Jvd19zdHJpZGVzICsgcm93T2Zmc2V0ICogbV9pbl9yb3dfc3RyaWRlcyAtIG1fcm93UGFkZGluZ1RvcDsKKyAgICBjb25zdCBJbmRleCBvcmlnSW5wdXRSb3cgPSAobV9yb3dfaW5mbGF0ZV9zdHJpZGVzID09IDEpID8gaW5wdXRSb3cgOiAoKGlucHV0Um93ID49IDApID8gKGlucHV0Um93IC8gbV9mYXN0SW5mbGF0ZVJvd1N0cmlkZSkgOiAwKTsKKyAgICBpZiAoaW5wdXRSb3cgPCAwIHx8IGlucHV0Um93ID49IG1faW5wdXRfcm93c19lZmYgfHwKKyAgICAgICAgKChtX3Jvd19pbmZsYXRlX3N0cmlkZXMgIT0gMSkgJiYgKGlucHV0Um93ICE9IG9yaWdJbnB1dFJvdyAqIG1fcm93X2luZmxhdGVfc3RyaWRlcykpKSB7CisgICAgICByZXR1cm4gU2NhbGFyKG1fcGFkZGluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgZGVwdGhfaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgPyAwIDogTnVtRGltcyAtIDE7CisgICAgY29uc3QgSW5kZXggZGVwdGggPSBpbmRleCAtIChpbmRleCAvIG1fZmFzdE91dHB1dERlcHRoKSAqIG1fZGltZW5zaW9uc1tkZXB0aF9pbmRleF07CisKKyAgICBjb25zdCBJbmRleCBpbnB1dEluZGV4ID0gZGVwdGggKyBvcmlnSW5wdXRSb3cgKiBtX3Jvd0lucHV0U3RyaWRlICsgb3JpZ0lucHV0Q29sICogbV9jb2xJbnB1dFN0cmlkZSArIG90aGVySW5kZXggKiBtX3BhdGNoSW5wdXRTdHJpZGU7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCtQYWNrZXRTaXplLTEgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworCisgICAgaWYgKG1faW5fcm93X3N0cmlkZXMgIT0gMSB8fCBtX2luX2NvbF9zdHJpZGVzICE9IDEgfHwgbV9yb3dfaW5mbGF0ZV9zdHJpZGVzICE9IDEgfHwgbV9jb2xfaW5mbGF0ZV9zdHJpZGVzICE9IDEpIHsKKyAgICAgIHJldHVybiBwYWNrZXRXaXRoUG9zc2libGVaZXJvKGluZGV4KTsKKyAgICB9CisKKyAgICBjb25zdCBJbmRleCBpbmRpY2VzWzJdID0ge2luZGV4LCBpbmRleCArIFBhY2tldFNpemUgLSAxfTsKKyAgICBjb25zdCBJbmRleCBwYXRjaEluZGV4ID0gaW5kaWNlc1swXSAvIG1fZmFzdFBhdGNoU3RyaWRlOworICAgIGlmIChwYXRjaEluZGV4ICE9IGluZGljZXNbMV0gLyBtX2Zhc3RQYXRjaFN0cmlkZSkgeworICAgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5kZXgpOworICAgIH0KKyAgICBjb25zdCBJbmRleCBvdGhlckluZGV4ID0gKE51bURpbXMgPT0gNCkgPyAwIDogaW5kaWNlc1swXSAvIG1fZmFzdE90aGVyU3RyaWRlOworICAgIGVpZ2VuX2Fzc2VydChvdGhlckluZGV4ID09IGluZGljZXNbMV0gLyBtX2Zhc3RPdGhlclN0cmlkZSk7CisKKyAgICAvLyBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgd3J0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICBjb25zdCBJbmRleCBwYXRjaE9mZnNldHNbMl0gPSB7KGluZGljZXNbMF0gLSBwYXRjaEluZGV4ICogbV9wYXRjaFN0cmlkZSkgLyBtX2Zhc3RPdXRwdXREZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGljZXNbMV0gLSBwYXRjaEluZGV4ICogbV9wYXRjaFN0cmlkZSkgLyBtX2Zhc3RPdXRwdXREZXB0aH07CisKKyAgICBjb25zdCBJbmRleCBwYXRjaDJESW5kZXggPSAoTnVtRGltcyA9PSA0KSA/IHBhdGNoSW5kZXggOiAoaW5kaWNlc1swXSAtIG90aGVySW5kZXggKiBtX290aGVyU3RyaWRlKSAvIG1fZmFzdFBhdGNoU3RyaWRlOworICAgIGVpZ2VuX2Fzc2VydChwYXRjaDJESW5kZXggPT0gKGluZGljZXNbMV0gLSBvdGhlckluZGV4ICogbV9vdGhlclN0cmlkZSkgLyBtX2Zhc3RQYXRjaFN0cmlkZSk7CisKKyAgICBjb25zdCBJbmRleCBjb2xJbmRleCA9IHBhdGNoMkRJbmRleCAvIG1fZmFzdE91dHB1dFJvd3M7CisgICAgY29uc3QgSW5kZXggY29sT2Zmc2V0c1syXSA9IHtwYXRjaE9mZnNldHNbMF0gLyBtX2Zhc3RDb2xTdHJpZGUsIHBhdGNoT2Zmc2V0c1sxXSAvIG1fZmFzdENvbFN0cmlkZX07CisKKyAgICAvLyBDYWxjdWxhdGUgY29sIGluZGljZXMgaW4gdGhlIG9yaWdpbmFsIGlucHV0IHRlbnNvci4KKyAgICBjb25zdCBJbmRleCBpbnB1dENvbHNbMl0gPSB7Y29sSW5kZXggKiBtX2NvbF9zdHJpZGVzICsgY29sT2Zmc2V0c1swXSAtCisgICAgICBtX2NvbFBhZGRpbmdMZWZ0LCBjb2xJbmRleCAqIG1fY29sX3N0cmlkZXMgKyBjb2xPZmZzZXRzWzFdIC0gbV9jb2xQYWRkaW5nTGVmdH07CisgICAgaWYgKGlucHV0Q29sc1sxXSA8IDAgfHwgaW5wdXRDb2xzWzBdID49IG1faW5wdXRDb2xzKSB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KFNjYWxhcihtX3BhZGRpbmdWYWx1ZSkpOworICAgIH0KKworICAgIGlmIChpbnB1dENvbHNbMF0gPT0gaW5wdXRDb2xzWzFdKSB7CisgICAgICBjb25zdCBJbmRleCByb3dJbmRleCA9IHBhdGNoMkRJbmRleCAtIGNvbEluZGV4ICogbV9vdXRwdXRSb3dzOworICAgICAgY29uc3QgSW5kZXggcm93T2Zmc2V0c1syXSA9IHtwYXRjaE9mZnNldHNbMF0gLSBjb2xPZmZzZXRzWzBdKm1fY29sU3RyaWRlLCBwYXRjaE9mZnNldHNbMV0gLSBjb2xPZmZzZXRzWzFdKm1fY29sU3RyaWRlfTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dPZmZzZXRzWzBdIDw9IHJvd09mZnNldHNbMV0pOworICAgICAgLy8gQ2FsY3VsYXRlIGNvbCBpbmRpY2VzIGluIHRoZSBvcmlnaW5hbCBpbnB1dCB0ZW5zb3IuCisgICAgICBjb25zdCBJbmRleCBpbnB1dFJvd3NbMl0gPSB7cm93SW5kZXggKiBtX3Jvd19zdHJpZGVzICsgcm93T2Zmc2V0c1swXSAtCisgICAgICAgIG1fcm93UGFkZGluZ1RvcCwgcm93SW5kZXggKiBtX3Jvd19zdHJpZGVzICsgcm93T2Zmc2V0c1sxXSAtIG1fcm93UGFkZGluZ1RvcH07CisKKyAgICAgIGlmIChpbnB1dFJvd3NbMV0gPCAwIHx8IGlucHV0Um93c1swXSA+PSBtX2lucHV0Um93cykgeworICAgICAgICByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KFNjYWxhcihtX3BhZGRpbmdWYWx1ZSkpOworICAgICAgfQorCisgICAgICBpZiAoaW5wdXRSb3dzWzBdID49IDAgJiYgaW5wdXRSb3dzWzFdIDwgbV9pbnB1dFJvd3MpIHsKKyAgICAgICAgLy8gbm8gcGFkZGluZworICAgICAgICBjb25zdCBpbnQgZGVwdGhfaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgPyAwIDogTnVtRGltcyAtIDE7CisgICAgICAgIGNvbnN0IEluZGV4IGRlcHRoID0gaW5kZXggLSAoaW5kZXggLyBtX2Zhc3RPdXRwdXREZXB0aCkgKiBtX2RpbWVuc2lvbnNbZGVwdGhfaW5kZXhdOworICAgICAgICBjb25zdCBJbmRleCBpbnB1dEluZGV4ID0gZGVwdGggKyBpbnB1dFJvd3NbMF0gKiBtX3Jvd0lucHV0U3RyaWRlICsgaW5wdXRDb2xzWzBdICogbV9jb2xJbnB1dFN0cmlkZSArIG90aGVySW5kZXggKiBtX3BhdGNoSW5wdXRTdHJpZGU7CisgICAgICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oaW5wdXRJbmRleCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+JiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisKKyAgSW5kZXggcm93UGFkZGluZ1RvcCgpIGNvbnN0IHsgcmV0dXJuIG1fcm93UGFkZGluZ1RvcDsgfQorICBJbmRleCBjb2xQYWRkaW5nTGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1fY29sUGFkZGluZ0xlZnQ7IH0KKyAgSW5kZXggb3V0cHV0Um93cygpIGNvbnN0IHsgcmV0dXJuIG1fb3V0cHV0Um93czsgfQorICBJbmRleCBvdXRwdXRDb2xzKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRDb2xzOyB9CisgIEluZGV4IHVzZXJSb3dTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX3Jvd19zdHJpZGVzOyB9CisgIEluZGV4IHVzZXJDb2xTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2NvbF9zdHJpZGVzOyB9CisgIEluZGV4IHVzZXJJblJvd1N0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5fcm93X3N0cmlkZXM7IH0KKyAgSW5kZXggdXNlckluQ29sU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9pbl9jb2xfc3RyaWRlczsgfQorICBJbmRleCByb3dJbmZsYXRlU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9yb3dfaW5mbGF0ZV9zdHJpZGVzOyB9CisgIEluZGV4IGNvbEluZmxhdGVTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2NvbF9pbmZsYXRlX3N0cmlkZXM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdAorICBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgLy8gV2UgY29uc2VydmF0aXZlbHkgZXN0aW1hdGUgdGhlIGNvc3QgZm9yIHRoZSBjb2RlIHBhdGggd2hlcmUgdGhlIGNvbXB1dGVkCisgICAgLy8gaW5kZXggaXMgaW5zaWRlIHRoZSBvcmlnaW5hbCBpbWFnZSBhbmQKKyAgICAvLyBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6Q29vcmRBY2Nlc3MgaXMgZmFsc2UuCisgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IDMgKiBUZW5zb3JPcENvc3Q6OkRpdkNvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICogVGVuc29yT3BDb3N0OjpNdWxDb3N0PEluZGV4PigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKTsKKyAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRXaXRoUG9zc2libGVaZXJvKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fQUxJR05fTUFYIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSB2YWx1ZXNbUGFja2V0U2l6ZV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIHZhbHVlc1tpXSA9IGNvZWZmKGluZGV4K2kpOworICAgIH0KKyAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICByZXR1cm4gcnNsdDsKKyAgfQorCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworCisgIEluZGV4IG1fb3RoZXJTdHJpZGU7CisgIEluZGV4IG1fcGF0Y2hTdHJpZGU7CisgIEluZGV4IG1fY29sU3RyaWRlOworICBJbmRleCBtX3Jvd19zdHJpZGVzOworICBJbmRleCBtX2NvbF9zdHJpZGVzOworCisgIEluZGV4IG1faW5fcm93X3N0cmlkZXM7CisgIEluZGV4IG1faW5fY29sX3N0cmlkZXM7CisgIEluZGV4IG1fcm93X2luZmxhdGVfc3RyaWRlczsKKyAgSW5kZXggbV9jb2xfaW5mbGF0ZV9zdHJpZGVzOworCisgIEluZGV4IG1faW5wdXRfcm93c19lZmY7CisgIEluZGV4IG1faW5wdXRfY29sc19lZmY7CisgIEluZGV4IG1fcGF0Y2hfcm93c19lZmY7CisgIEluZGV4IG1fcGF0Y2hfY29sc19lZmY7CisKKyAgaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+IG1fZmFzdE90aGVyU3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0UGF0Y2hTdHJpZGU7CisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RDb2xTdHJpZGU7CisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RJbmZsYXRlUm93U3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0SW5mbGF0ZUNvbFN0cmlkZTsKKyAgaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+IG1fZmFzdElucHV0Q29sc0VmZjsKKworICBJbmRleCBtX3Jvd0lucHV0U3RyaWRlOworICBJbmRleCBtX2NvbElucHV0U3RyaWRlOworICBJbmRleCBtX3BhdGNoSW5wdXRTdHJpZGU7CisKKyAgSW5kZXggbV9pbnB1dERlcHRoOworICBJbmRleCBtX2lucHV0Um93czsKKyAgSW5kZXggbV9pbnB1dENvbHM7CisKKyAgSW5kZXggbV9vdXRwdXRSb3dzOworICBJbmRleCBtX291dHB1dENvbHM7CisKKyAgSW5kZXggbV9yb3dQYWRkaW5nVG9wOworICBJbmRleCBtX2NvbFBhZGRpbmdMZWZ0OworCisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RPdXRwdXRSb3dzOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0T3V0cHV0RGVwdGg7CisKKyAgU2NhbGFyIG1fcGFkZGluZ1ZhbHVlOworCisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0lNQUdFX1BBVENIX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySW5kZXhMaXN0LmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckluZGV4TGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDlmZWMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckluZGV4TGlzdC5oCkBAIC0wLDAgKzEsNzI1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5ERVhfTElTVF9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5ERVhfTElTVF9ICisKKworI2lmIEVJR0VOX0hBU19DT05TVEVYUFIgJiYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworCisjZGVmaW5lIEVJR0VOX0hBU19JTkRFWF9MSVNUCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBUZW5zb3JJbmRleExpc3QKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU2V0IG9mIGNsYXNzZXMgdXNlZCB0byBlbmNvZGUgYSBzZXQgb2YgVGVuc29yIGRpbWVuc2lvbnMvaW5kaWNlcy4KKyAgKgorICAqIFRoZSBpbmRpY2VzIGluIHRoZSBsaXN0IGNhbiBiZSBrbm93biBhdCBjb21waWxlIHRpbWUgb3IgYXQgcnVudGltZS4gQSBtaXgKKyAgKiBvZiBzdGF0aWMgYW5kIGR5bmFtaWMgaW5kaWNlcyBjYW4gYWxzbyBiZSBwcm92aWRlZCBpZiBuZWVkZWQuIFRoZSB0ZW5zb3IKKyAgKiBjb2RlIHdpbGwgYXR0ZW1wdCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgaW5kaWNlcyB0aGF0IGFyZSBrbm93biBhdAorICAqIGNvbXBpbGUgdGltZSB0byBvcHRpbWl6ZSB0aGUgY29kZSBpdCBnZW5lcmF0ZXMuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgYSBjKysxMSBjb21wbGlhbnQgY29tcGlsZXIuIElmIHlvdXIgY29tcGlsZXIKKyAgKiBpcyBvbGRlciB5b3UgbmVlZCB0byB1c2UgYXJyYXlzIG9mIGluZGljZXMgaW5zdGVhZC4KKyAgKgorICAqIFNldmVyYWwgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGluIHRoZSBjeHgxMV90ZW5zb3JfaW5kZXhfbGlzdC5jcHAgZmlsZS4KKyAgKgorICAqIFxzYSBUZW5zb3IKKyAgKi8KKwordGVtcGxhdGUgPERlbnNlSW5kZXggbj4KK3N0cnVjdCB0eXBlMmluZGV4IHsKKyAgc3RhdGljIGNvbnN0IERlbnNlSW5kZXggdmFsdWUgPSBuOworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgb3BlcmF0b3IgRGVuc2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG47IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBzZXQoRGVuc2VJbmRleCB2YWwpIHsKKyAgICBlaWdlbl9hc3NlcnQodmFsID09IG4pOworICB9Cit9OworCisvLyBUaGlzIGNhbiBiZSB1c2VkIHdpdGggSW5kZXhQYWlyTGlzdCB0byBnZXQgY29tcGlsZS10aW1lIGNvbnN0YW50IHBhaXJzLAorLy8gc3VjaCBhcyBJbmRleFBhaXJMaXN0PHR5cGUyaW5kZXhwYWlyPDEsMj4sIHR5cGUyaW5kZXhwYWlyPDMsND4+KCkuCit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBmLCBEZW5zZUluZGV4IHM+CitzdHJ1Y3QgdHlwZTJpbmRleHBhaXIgeworICBzdGF0aWMgY29uc3QgRGVuc2VJbmRleCBmaXJzdCA9IGY7CisgIHN0YXRpYyBjb25zdCBEZW5zZUluZGV4IHNlY29uZCA9IHM7CisKKyAgY29uc3RleHByIEVJR0VOX0RFVklDRV9GVU5DIG9wZXJhdG9yIEluZGV4UGFpcjxEZW5zZUluZGV4PigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kZXhQYWlyPERlbnNlSW5kZXg+KGYsIHMpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBzZXQoY29uc3QgSW5kZXhQYWlyPERlbnNlSW5kZXg+JiB2YWwpIHsKKyAgICBlaWdlbl9hc3NlcnQodmFsLmZpcnN0ID09IGYpOworICAgIGVpZ2VuX2Fzc2VydCh2YWwuc2Vjb25kID09IHMpOworICB9Cit9OworCisKK3RlbXBsYXRlPERlbnNlSW5kZXggbj4gc3RydWN0IE51bVRyYWl0czx0eXBlMmluZGV4PG4+ID4KK3sKKyAgdHlwZWRlZiBEZW5zZUluZGV4IFJlYWw7CisgIGVudW0geworICAgIElzQ29tcGxleCA9IDAsCisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gZmFsc2UsCisgICAgUmVhZENvc3QgPSAxLAorICAgIEFkZENvc3QgPSAxLAorICAgIE11bENvc3QgPSAxCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGlubGluZSBSZWFsIGVwc2lsb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgUmVhbCBkdW1teV9wcmVjaXNpb24oKSB7IHJldHVybiAwOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBpbmxpbmUgUmVhbCBoaWdoZXN0KCkgeyByZXR1cm4gbjsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgaW5saW5lIFJlYWwgbG93ZXN0KCkgeyByZXR1cm4gbjsgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCB1cGRhdGVfdmFsdWUoVCYgdmFsLCBEZW5zZUluZGV4IG5ld192YWwpIHsKKyAgdmFsID0gbmV3X3ZhbDsKK30KK3RlbXBsYXRlIDxEZW5zZUluZGV4IG4+CitFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHVwZGF0ZV92YWx1ZSh0eXBlMmluZGV4PG4+JiB2YWwsIERlbnNlSW5kZXggbmV3X3ZhbCkgeworICB2YWwuc2V0KG5ld192YWwpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RFVklDRV9GVU5DIHZvaWQgdXBkYXRlX3ZhbHVlKFQmIHZhbCwgSW5kZXhQYWlyPERlbnNlSW5kZXg+IG5ld192YWwpIHsKKyAgdmFsID0gbmV3X3ZhbDsKK30KK3RlbXBsYXRlIDxEZW5zZUluZGV4IGYsIERlbnNlSW5kZXggcz4KK0VJR0VOX0RFVklDRV9GVU5DIHZvaWQgdXBkYXRlX3ZhbHVlKHR5cGUyaW5kZXhwYWlyPGYsIHM+JiB2YWwsIEluZGV4UGFpcjxEZW5zZUluZGV4PiBuZXdfdmFsKSB7CisgIHZhbC5zZXQobmV3X3ZhbCk7Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfY29tcGlsZV90aW1lX2NvbnN0YW50IHsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBpZHg+CitzdHJ1Y3QgaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PHR5cGUyaW5kZXg8aWR4PiA+IHsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBpZHg+CitzdHJ1Y3QgaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PGNvbnN0IHR5cGUyaW5kZXg8aWR4PiA+IHsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBpZHg+CitzdHJ1Y3QgaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PHR5cGUyaW5kZXg8aWR4PiYgPiB7CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OwordGVtcGxhdGUgPERlbnNlSW5kZXggaWR4Pgorc3RydWN0IGlzX2NvbXBpbGVfdGltZV9jb25zdGFudDxjb25zdCB0eXBlMmluZGV4PGlkeD4mID4geworICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPERlbnNlSW5kZXggZiwgRGVuc2VJbmRleCBzPgorc3RydWN0IGlzX2NvbXBpbGVfdGltZV9jb25zdGFudDx0eXBlMmluZGV4cGFpcjxmLCBzPiA+IHsKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHJ1ZTsKK307Cit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBmLCBEZW5zZUluZGV4IHM+CitzdHJ1Y3QgaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PGNvbnN0IHR5cGUyaW5kZXhwYWlyPGYsIHM+ID4geworICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0cnVlOworfTsKK3RlbXBsYXRlIDxEZW5zZUluZGV4IGYsIERlbnNlSW5kZXggcz4KK3N0cnVjdCBpc19jb21waWxlX3RpbWVfY29uc3RhbnQ8dHlwZTJpbmRleHBhaXI8Ziwgcz4mID4geworICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0cnVlOworfTsKK3RlbXBsYXRlIDxEZW5zZUluZGV4IGYsIERlbnNlSW5kZXggcz4KK3N0cnVjdCBpc19jb21waWxlX3RpbWVfY29uc3RhbnQ8Y29uc3QgdHlwZTJpbmRleHBhaXI8Ziwgcz4mID4geworICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPgorc3RydWN0IEluZGV4VHVwbGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIE8+CitzdHJ1Y3QgSW5kZXhUdXBsZTxULCBPLi4uPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBJbmRleFR1cGxlKCkgOiBoZWFkKCksIG90aGVycygpIHsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgSW5kZXhUdXBsZShjb25zdCBUJiB2LCBjb25zdCBPLi4uIG8pIDogaGVhZCh2KSwgb3RoZXJzKG8uLi4pIHsgfQorCisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGNvdW50ID0gMSArIHNpemVvZi4uLihPKTsKKyAgVCBoZWFkOworICBJbmRleFR1cGxlPE8uLi4+IG90aGVyczsKKyAgdHlwZWRlZiBUIEhlYWQ7CisgIHR5cGVkZWYgSW5kZXhUdXBsZTxPLi4uPiBPdGhlcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBJbmRleFR1cGxlPFQ+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4VHVwbGUoKSA6IGhlYWQoKSB7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4VHVwbGUoY29uc3QgVCYgdikgOiBoZWFkKHYpIHsgfQorCisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGNvdW50ID0gMTsKKyAgVCBoZWFkOworICB0eXBlZGVmIFQgSGVhZDsKK307CisKKwordGVtcGxhdGU8aW50IE4sIHR5cGVuYW1lLi4uIFQ+CitzdHJ1Y3QgSW5kZXhUdXBsZUV4dHJhY3RvcjsKKwordGVtcGxhdGU8aW50IE4sIHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIE8+CitzdHJ1Y3QgSW5kZXhUdXBsZUV4dHJhY3RvcjxOLCBULCBPLi4uPiB7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmRleFR1cGxlRXh0cmFjdG9yPE4tMSwgTy4uLj46OlZhbFR5cGUgVmFsVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIFZhbFR5cGUmIGdldF92YWwoSW5kZXhUdXBsZTxULCBPLi4uPiYgdmFsKSB7CisgICAgcmV0dXJuIEluZGV4VHVwbGVFeHRyYWN0b3I8Ti0xLCBPLi4uPjo6Z2V0X3ZhbCh2YWwub3RoZXJzKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgVmFsVHlwZSYgZ2V0X3ZhbChjb25zdCBJbmRleFR1cGxlPFQsIE8uLi4+JiB2YWwpIHsKKyAgICByZXR1cm4gSW5kZXhUdXBsZUV4dHJhY3RvcjxOLTEsIE8uLi4+OjpnZXRfdmFsKHZhbC5vdGhlcnMpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBzZXRfdmFsKEluZGV4VHVwbGU8VCwgTy4uLj4mIHZhbCwgViYgbmV3X3ZhbCkgeworICAgIEluZGV4VHVwbGVFeHRyYWN0b3I8Ti0xLCBPLi4uPjo6c2V0X3ZhbCh2YWwub3RoZXJzLCBuZXdfdmFsKTsKKyAgfQorCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBPPgorICBzdHJ1Y3QgSW5kZXhUdXBsZUV4dHJhY3RvcjwwLCBULCBPLi4uPiB7CisKKyAgdHlwZWRlZiBUIFZhbFR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBWYWxUeXBlJiBnZXRfdmFsKEluZGV4VHVwbGU8VCwgTy4uLj4mIHZhbCkgeworICAgIHJldHVybiB2YWwuaGVhZDsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGNvbnN0IFZhbFR5cGUmIGdldF92YWwoY29uc3QgSW5kZXhUdXBsZTxULCBPLi4uPiYgdmFsKSB7CisgICAgcmV0dXJuIHZhbC5oZWFkOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBzZXRfdmFsKEluZGV4VHVwbGU8VCwgTy4uLj4mIHZhbCwgViYgbmV3X3ZhbCkgeworICAgIHZhbC5oZWFkID0gbmV3X3ZhbDsKKyAgfQorfTsKKworCisKK3RlbXBsYXRlIDxpbnQgTiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gTz4KK0VJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciB0eXBlbmFtZSBJbmRleFR1cGxlRXh0cmFjdG9yPE4sIFQsIE8uLi4+OjpWYWxUeXBlJiBhcnJheV9nZXQoSW5kZXhUdXBsZTxULCBPLi4uPiYgdHVwbGUpIHsKKyAgcmV0dXJuIEluZGV4VHVwbGVFeHRyYWN0b3I8TiwgVCwgTy4uLj46OmdldF92YWwodHVwbGUpOworfQordGVtcGxhdGUgPGludCBOLCB0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBPPgorRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIGNvbnN0IHR5cGVuYW1lIEluZGV4VHVwbGVFeHRyYWN0b3I8TiwgVCwgTy4uLj46OlZhbFR5cGUmIGFycmF5X2dldChjb25zdCBJbmRleFR1cGxlPFQsIE8uLi4+JiB0dXBsZSkgeworICByZXR1cm4gSW5kZXhUdXBsZUV4dHJhY3RvcjxOLCBULCBPLi4uPjo6Z2V0X3ZhbCh0dXBsZSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gTz4KKyAgc3RydWN0IGFycmF5X3NpemU8SW5kZXhUdXBsZTxULCBPLi4uPiA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IEluZGV4VHVwbGU8VCwgTy4uLj46OmNvdW50OworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBPPgorICBzdHJ1Y3QgYXJyYXlfc2l6ZTxjb25zdCBJbmRleFR1cGxlPFQsIE8uLi4+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gSW5kZXhUdXBsZTxULCBPLi4uPjo6Y291bnQ7Cit9OworCisKKworCit0ZW1wbGF0ZSA8RGVuc2VJbmRleCBJZHgsIHR5cGVuYW1lIFZhbHVlVD4KK3N0cnVjdCB0dXBsZV9jb2VmZiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIFZhbHVlVCBnZXQoY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBJbmRleFR1cGxlPFQuLi4+JiB0KSB7CisgICAgLy8gICAgcmV0dXJuIGFycmF5X2dldDxJZHg+KHQpICogKGkgPT0gSWR4KSArIHR1cGxlX2NvZWZmPElkeC0xPjo6Z2V0KGksIHQpICogKGkgIT0gSWR4KTsKKyAgICByZXR1cm4gKGkgPT0gSWR4ID8gYXJyYXlfZ2V0PElkeD4odCkgOiB0dXBsZV9jb2VmZjxJZHgtMSwgVmFsdWVUPjo6Z2V0KGksIHQpKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIHZvaWQgc2V0KGNvbnN0IERlbnNlSW5kZXggaSwgSW5kZXhUdXBsZTxULi4uPiYgdCwgY29uc3QgVmFsdWVUJiB2YWx1ZSkgeworICAgIGlmIChpID09IElkeCkgeworICAgICAgdXBkYXRlX3ZhbHVlKGFycmF5X2dldDxJZHg+KHQpLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHR1cGxlX2NvZWZmPElkeC0xLCBWYWx1ZVQ+OjpzZXQoaSwgdCwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWVfa25vd25fc3RhdGljYWxseShjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IEluZGV4VHVwbGU8VC4uLj4mIHQpIHsKKyAgICByZXR1cm4gKChpID09IElkeCkgJiBpc19jb21waWxlX3RpbWVfY29uc3RhbnQ8dHlwZW5hbWUgSW5kZXhUdXBsZUV4dHJhY3RvcjxJZHgsIFQuLi4+OjpWYWxUeXBlPjo6dmFsdWUpIHx8CisgICAgICAgIHR1cGxlX2NvZWZmPElkeC0xLCBWYWx1ZVQ+Ojp2YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGksIHQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZXNfdXBfdG9fa25vd25fc3RhdGljYWxseShjb25zdCBJbmRleFR1cGxlPFQuLi4+JiB0KSB7CisgICAgcmV0dXJuIGlzX2NvbXBpbGVfdGltZV9jb25zdGFudDx0eXBlbmFtZSBJbmRleFR1cGxlRXh0cmFjdG9yPElkeCwgVC4uLj46OlZhbFR5cGU+Ojp2YWx1ZSAmJgorICAgICAgICB0dXBsZV9jb2VmZjxJZHgtMSwgVmFsdWVUPjo6dmFsdWVzX3VwX3RvX2tub3duX3N0YXRpY2FsbHkodCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlc191cF90b19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlKGNvbnN0IEluZGV4VHVwbGU8VC4uLj4mIHQpIHsKKyAgICByZXR1cm4gaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PHR5cGVuYW1lIEluZGV4VHVwbGVFeHRyYWN0b3I8SWR4LCBULi4uPjo6VmFsVHlwZT46OnZhbHVlICYmCisgICAgICAgICAgIGlzX2NvbXBpbGVfdGltZV9jb25zdGFudDx0eXBlbmFtZSBJbmRleFR1cGxlRXh0cmFjdG9yPElkeCwgVC4uLj46OlZhbFR5cGU+Ojp2YWx1ZSAmJgorICAgICAgICAgICBhcnJheV9nZXQ8SWR4Pih0KSA+IGFycmF5X2dldDxJZHgtMT4odCkgJiYKKyAgICAgICAgICAgdHVwbGVfY29lZmY8SWR4LTEsIFZhbHVlVD46OnZhbHVlc191cF90b19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlKHQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUPgorc3RydWN0IHR1cGxlX2NvZWZmPDAsIFZhbHVlVD4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBWYWx1ZVQgZ2V0KGNvbnN0IERlbnNlSW5kZXggLyppKi8sIGNvbnN0IEluZGV4VHVwbGU8VC4uLj4mIHQpIHsKKyAgICAvLyAgZWlnZW5fYXNzZXJ0IChpID09IDApOyAgLy8gZ2NjIGZhaWxzIHRvIGNvbXBpbGUgYXNzZXJ0aW9ucyBpbiBjb25zdGV4cHIKKyAgICByZXR1cm4gYXJyYXlfZ2V0PDA+KHQpLyogKiAoaSA9PSAwKSovOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgdm9pZCBzZXQoY29uc3QgRGVuc2VJbmRleCBpLCBJbmRleFR1cGxlPFQuLi4+JiB0LCBjb25zdCBWYWx1ZVQgdmFsdWUpIHsKKyAgICBlaWdlbl9hc3NlcnQgKGkgPT0gMCk7CisgICAgdXBkYXRlX3ZhbHVlKGFycmF5X2dldDwwPih0KSwgdmFsdWUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWVfa25vd25fc3RhdGljYWxseShjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IEluZGV4VHVwbGU8VC4uLj4mKSB7CisgICAgcmV0dXJuIGlzX2NvbXBpbGVfdGltZV9jb25zdGFudDx0eXBlbmFtZSBJbmRleFR1cGxlRXh0cmFjdG9yPDAsIFQuLi4+OjpWYWxUeXBlPjo6dmFsdWUgJiAoaSA9PSAwKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWVzX3VwX3RvX2tub3duX3N0YXRpY2FsbHkoY29uc3QgSW5kZXhUdXBsZTxULi4uPiYpIHsKKyAgICByZXR1cm4gaXNfY29tcGlsZV90aW1lX2NvbnN0YW50PHR5cGVuYW1lIEluZGV4VHVwbGVFeHRyYWN0b3I8MCwgVC4uLj46OlZhbFR5cGU+Ojp2YWx1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWVzX3VwX3RvX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2UoY29uc3QgSW5kZXhUdXBsZTxULi4uPiYpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPgorc3RydWN0IEluZGV4TGlzdCA6IGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4geworICBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBEZW5zZUluZGV4IG9wZXJhdG9yW10gKGNvbnN0IERlbnNlSW5kZXggaSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6dHVwbGVfY29lZmY8aW50ZXJuYWw6OmFycmF5X3NpemU8aW50ZXJuYWw6OkluZGV4VHVwbGU8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+Ojp2YWx1ZS0xLCBEZW5zZUluZGV4Pjo6Z2V0KGksICp0aGlzKTsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBEZW5zZUluZGV4IGdldChjb25zdCBEZW5zZUluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnR1cGxlX2NvZWZmPGludGVybmFsOjphcnJheV9zaXplPGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWUtMSwgRGVuc2VJbmRleD46OmdldChpLCAqdGhpcyk7CisgIH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIHNldChjb25zdCBEZW5zZUluZGV4IGksIGNvbnN0IERlbnNlSW5kZXggdmFsdWUpIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnR1cGxlX2NvZWZmPGludGVybmFsOjphcnJheV9zaXplPGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWUtMSwgRGVuc2VJbmRleD46OnNldChpLCAqdGhpcywgdmFsdWUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4TGlzdChjb25zdCBpbnRlcm5hbDo6SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+JiBvdGhlcikgOiBpbnRlcm5hbDo6SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KG90aGVyKSB7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4TGlzdChGaXJzdFR5cGUmIGZpcnN0LCBPdGhlclR5cGVzLi4uIG90aGVyKSA6IGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oZmlyc3QsIG90aGVyLi4uKSB7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4TGlzdCgpIDogaW50ZXJuYWw6OkluZGV4VHVwbGU8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBib29sIHZhbHVlX2tub3duX3N0YXRpY2FsbHkoY29uc3QgRGVuc2VJbmRleCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjp0dXBsZV9jb2VmZjxpbnRlcm5hbDo6YXJyYXlfc2l6ZTxpbnRlcm5hbDo6SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID46OnZhbHVlLTEsIERlbnNlSW5kZXg+Ojp2YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGksICp0aGlzKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgYm9vbCBhbGxfdmFsdWVzX2tub3duX3N0YXRpY2FsbHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjp0dXBsZV9jb2VmZjxpbnRlcm5hbDo6YXJyYXlfc2l6ZTxpbnRlcm5hbDo6SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID46OnZhbHVlLTEsIERlbnNlSW5kZXg+Ojp2YWx1ZXNfdXBfdG9fa25vd25fc3RhdGljYWxseSgqdGhpcyk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgYm9vbCB2YWx1ZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnR1cGxlX2NvZWZmPGludGVybmFsOjphcnJheV9zaXplPGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWUtMSwgRGVuc2VJbmRleD46OnZhbHVlc191cF90b19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlKCp0aGlzKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdFR5cGUsIHR5cGVuYW1lLi4uIE90aGVyVHlwZXM+Citjb25zdGV4cHIgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gbWFrZV9pbmRleF9saXN0KEZpcnN0VHlwZSB2YWwxLCBPdGhlclR5cGVzLi4uIG90aGVyX3ZhbHMpIHsKKyAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KHZhbDEsIG90aGVyX3ZhbHMuLi4pOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBJbmRleFBhaXJMaXN0IDogaW50ZXJuYWw6OkluZGV4VHVwbGU8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiB7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIEluZGV4UGFpcjxEZW5zZUluZGV4PiBvcGVyYXRvcltdIChjb25zdCBEZW5zZUluZGV4IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnR1cGxlX2NvZWZmPGludGVybmFsOjphcnJheV9zaXplPGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWUtMSwgSW5kZXhQYWlyPERlbnNlSW5kZXg+Pjo6Z2V0KGksICp0aGlzKTsKKyAgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgc2V0KGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgSW5kZXhQYWlyPERlbnNlSW5kZXg+IHZhbHVlKSB7CisgICAgcmV0dXJuIGludGVybmFsOjp0dXBsZV9jb2VmZjxpbnRlcm5hbDo6YXJyYXlfc2l6ZTxpbnRlcm5hbDo6SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+Pjo6dmFsdWUtMSwgSW5kZXhQYWlyPERlbnNlSW5kZXg+ID46OnNldChpLCAqdGhpcywgdmFsdWUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgIGNvbnN0ZXhwciBJbmRleFBhaXJMaXN0KGNvbnN0IGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4mIG90aGVyKSA6IGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4ob3RoZXIpIHsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyAgY29uc3RleHByIEluZGV4UGFpckxpc3QoKSA6IGludGVybmFsOjpJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKSB7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgYm9vbCB2YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGNvbnN0IERlbnNlSW5kZXggaSkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbDo6dHVwbGVfY29lZmY8aW50ZXJuYWw6OmFycmF5X3NpemU8aW50ZXJuYWw6OkluZGV4VHVwbGU8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+Ojp2YWx1ZS0xLCBEZW5zZUluZGV4Pjo6dmFsdWVfa25vd25fc3RhdGljYWxseShpLCAqdGhpcyk7CisgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4gc2l6ZV90IGFycmF5X3Byb2QoY29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4mIHNpemVzKSB7CisgIHNpemVfdCByZXN1bHQgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemU8SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWU7ICsraSkgeworICAgIHJlc3VsdCAqPSBzaXplc1tpXTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdFR5cGUsIHR5cGVuYW1lLi4uIE90aGVyVHlwZXM+IHN0cnVjdCBhcnJheV9zaXplPEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gYXJyYXlfc2l6ZTxJbmRleFR1cGxlPEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPjo6dmFsdWU7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPiBzdHJ1Y3QgYXJyYXlfc2l6ZTxjb25zdCBJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IGFycmF5X3NpemU8SW5kZXhUdXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID46OnZhbHVlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPiBzdHJ1Y3QgYXJyYXlfc2l6ZTxJbmRleFBhaXJMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBzdGQ6OnR1cGxlX3NpemU8c3RkOjp0dXBsZTxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID46OnZhbHVlOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4gc3RydWN0IGFycmF5X3NpemU8Y29uc3QgSW5kZXhQYWlyTGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gc3RkOjp0dXBsZV9zaXplPHN0ZDo6dHVwbGU8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlPERlbnNlSW5kZXggTiwgdHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgRGVuc2VJbmRleCBhcnJheV9nZXQoSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4mIGEpIHsKKyAgcmV0dXJuIEluZGV4VHVwbGVFeHRyYWN0b3I8TiwgRmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPjo6Z2V0X3ZhbChhKTsKK30KK3RlbXBsYXRlPERlbnNlSW5kZXggTiwgdHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPiBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgRGVuc2VJbmRleCBhcnJheV9nZXQoY29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4mIGEpIHsKKyAgcmV0dXJuIEluZGV4VHVwbGVFeHRyYWN0b3I8TiwgRmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPjo6Z2V0X3ZhbChhKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaW5kZXhfa25vd25fc3RhdGljYWxseV9pbXBsIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPgorc3RydWN0IGluZGV4X2tub3duX3N0YXRpY2FsbHlfaW1wbDxJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4IGkpIHsKKyAgICByZXR1cm4gSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPgorc3RydWN0IGluZGV4X2tub3duX3N0YXRpY2FsbHlfaW1wbDxjb25zdCBJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4IGkpIHsKKyAgICByZXR1cm4gSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGkpOworICB9Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGFsbF9pbmRpY2VzX2tub3duX3N0YXRpY2FsbHlfaW1wbCB7CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPgorc3RydWN0IGFsbF9pbmRpY2VzX2tub3duX3N0YXRpY2FsbHlfaW1wbDxJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPiA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGNvbnN0ZXhwciBib29sIHJ1bigpIHsKKyAgICByZXR1cm4gSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS5hbGxfdmFsdWVzX2tub3duX3N0YXRpY2FsbHkoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBhbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5X2ltcGw8Y29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkuYWxsX3ZhbHVlc19rbm93bl9zdGF0aWNhbGx5KCk7CisgIH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlX2ltcGwgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KKyAgc3RydWN0IGluZGljZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZV9pbXBsPEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKCkgeworICAgIHJldHVybiBFaWdlbjo6SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZSgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RUeXBlLCB0eXBlbmFtZS4uLiBPdGhlclR5cGVzPgorICBzdHJ1Y3QgaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlX2ltcGw8Y29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIEVpZ2VuOjpJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLnZhbHVlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlKCk7CisgIH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR4Pgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZXFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2VxX2ltcGw8SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSA9PSB2YWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFR5cGUsIHR5cGVuYW1lLi4uIE90aGVyVHlwZXM+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9lcV9pbXBsPGNvbnN0IEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLnZhbHVlX2tub3duX3N0YXRpY2FsbHkoaSkgJgorICAgICAgICAoSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS5nZXQoaSkgPT0gdmFsdWUpOworICB9Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfbmVfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X25lX2ltcGw8SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSAhPSB2YWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFR5cGUsIHR5cGVuYW1lLi4uIE90aGVyVHlwZXM+CitzdHJ1Y3QgaW5kZXhfc3RhdGljYWxseV9uZV9pbXBsPGNvbnN0IEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLnZhbHVlX2tub3duX3N0YXRpY2FsbHkoaSkgJgorICAgICAgICAoSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS5nZXQoaSkgIT0gdmFsdWUpOworICB9Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfZ3RfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2d0X2ltcGw8SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSA+IHZhbHVlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2d0X2ltcGw8Y29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSA+IHZhbHVlKTsKKyAgfQorfTsKKworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGluZGV4X3N0YXRpY2FsbHlfbHRfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2x0X2ltcGw8SW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSA8IHZhbHVlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2x0X2ltcGw8Y29uc3QgSW5kZXhMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4TGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkudmFsdWVfa25vd25fc3RhdGljYWxseShpKSAmCisgICAgICAgIChJbmRleExpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLmdldChpKSA8IHZhbHVlKTsKKyAgfQorfTsKKworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeD4KK3N0cnVjdCBpbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXFfaW1wbDxJbmRleFBhaXJMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4gPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oY29uc3QgRGVuc2VJbmRleCBpLCBjb25zdCBEZW5zZUluZGV4IHZhbHVlKSB7CisgICAgcmV0dXJuIEluZGV4UGFpckxpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLnZhbHVlX2tub3duX3N0YXRpY2FsbHkoaSkgJgorICAgICAgICAoSW5kZXhQYWlyTGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+KCkub3BlcmF0b3JbXShpKS5maXJzdCA9PSB2YWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdFR5cGUsIHR5cGVuYW1lLi4uIE90aGVyVHlwZXM+CitzdHJ1Y3QgaW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxX2ltcGw8Y29uc3QgSW5kZXhQYWlyTGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBJbmRleFBhaXJMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGkpICYKKyAgICAgICAgKEluZGV4UGFpckxpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLm9wZXJhdG9yW10oaSkuZmlyc3QgPT0gdmFsdWUpOworICB9Cit9OworCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR4Pgorc3RydWN0IGluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxX2ltcGw8SW5kZXhQYWlyTGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBJbmRleFBhaXJMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGkpICYKKyAgICAgICAgKEluZGV4UGFpckxpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLm9wZXJhdG9yW10oaSkuc2Vjb25kID09IHZhbHVlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0VHlwZSwgdHlwZW5hbWUuLi4gT3RoZXJUeXBlcz4KK3N0cnVjdCBpbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxX2ltcGw8Y29uc3QgSW5kZXhQYWlyTGlzdDxGaXJzdFR5cGUsIE90aGVyVHlwZXMuLi4+ID4geworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgY29uc3RleHByIGJvb2wgcnVuKGNvbnN0IERlbnNlSW5kZXggaSwgY29uc3QgRGVuc2VJbmRleCB2YWx1ZSkgeworICAgIHJldHVybiBJbmRleFBhaXJMaXN0PEZpcnN0VHlwZSwgT3RoZXJUeXBlcy4uLj4oKS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KGkpICYKKyAgICAgICAgKEluZGV4UGFpckxpc3Q8Rmlyc3RUeXBlLCBPdGhlclR5cGVzLi4uPigpLm9wZXJhdG9yW10oaSkuc2Vjb25kID09IHZhbHVlKTsKKyAgfQorfTsKKworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbHNlCisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbmRleF9rbm93bl9zdGF0aWNhbGx5X2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihjb25zdCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBhbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5X2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGluZGljZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZV9pbXBsIHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2VxX2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihEZW5zZUluZGV4LCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X25lX2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihEZW5zZUluZGV4LCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2d0X2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihEZW5zZUluZGV4LCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpbmRleF9zdGF0aWNhbGx5X2x0X2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihEZW5zZUluZGV4LCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHg+CitzdHJ1Y3QgaW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxX2ltcGwgeworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIHJ1bihEZW5zZUluZGV4LCBEZW5zZUluZGV4KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHg+CitzdHJ1Y3QgaW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcV9pbXBsIHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBydW4oRGVuc2VJbmRleCwgRGVuc2VJbmRleCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmCisKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9DT05TVEVYUFIgYm9vbCBpbmRleF9rbm93bl9zdGF0aWNhbGx5KERlbnNlSW5kZXggaSkgeworICByZXR1cm4gaW5kZXhfa25vd25fc3RhdGljYWxseV9pbXBsPFQ+OjpydW4oaSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGFsbF9pbmRpY2VzX2tub3duX3N0YXRpY2FsbHkoKSB7CisgIHJldHVybiBhbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5X2ltcGw8VD46OnJ1bigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9DT05TVEVYUFIgYm9vbCBpbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2UoKSB7CisgIHJldHVybiBpbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2VfaW1wbDxUPjo6cnVuKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGluZGV4X3N0YXRpY2FsbHlfZXEoRGVuc2VJbmRleCBpLCBEZW5zZUluZGV4IHZhbHVlKSB7CisgIHJldHVybiBpbmRleF9zdGF0aWNhbGx5X2VxX2ltcGw8VD46OnJ1bihpLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGluZGV4X3N0YXRpY2FsbHlfbmUoRGVuc2VJbmRleCBpLCBEZW5zZUluZGV4IHZhbHVlKSB7CisgIHJldHVybiBpbmRleF9zdGF0aWNhbGx5X25lX2ltcGw8VD46OnJ1bihpLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGluZGV4X3N0YXRpY2FsbHlfZ3QoRGVuc2VJbmRleCBpLCBEZW5zZUluZGV4IHZhbHVlKSB7CisgIHJldHVybiBpbmRleF9zdGF0aWNhbGx5X2d0X2ltcGw8VD46OnJ1bihpLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGluZGV4X3N0YXRpY2FsbHlfbHQoRGVuc2VJbmRleCBpLCBEZW5zZUluZGV4IHZhbHVlKSB7CisgIHJldHVybiBpbmRleF9zdGF0aWNhbGx5X2x0X2ltcGw8VD46OnJ1bihpLCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0NPTlNURVhQUiBib29sIGluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcShEZW5zZUluZGV4IGksIERlbnNlSW5kZXggdmFsdWUpIHsKKyAgcmV0dXJuIGluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcV9pbXBsPFQ+OjpydW4oaSwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9DT05TVEVYUFIgYm9vbCBpbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxKERlbnNlSW5kZXggaSwgRGVuc2VJbmRleCB2YWx1ZSkgeworICByZXR1cm4gaW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcV9pbXBsPFQ+OjpydW4oaSwgdmFsdWUpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5ERVhfTElTVF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckluZmxhdGlvbi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbmZsYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkxZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbmZsYXRpb24uaApAQCAtMCwwICsxLDIyOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgS2UgWWFuZyA8eWFuZ2tlQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JTkZMQVRJT05fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0lORkxBVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29ySW5mbGF0aW9uCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBpbmZsYXRpb24gY2xhc3MuCisgICoKKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckluZmxhdGlvbk9wPFN0cmlkZXMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29ySW5mbGF0aW9uT3A8U3RyaWRlcywgWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JJbmZsYXRpb25PcDxTdHJpZGVzLCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvckluZmxhdGlvbk9wPFN0cmlkZXMsIFhwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvckluZmxhdGlvbk9wPFN0cmlkZXMsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29ySW5mbGF0aW9uT3A8U3RyaWRlcywgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIFRlbnNvckluZmxhdGlvbk9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29ySW5mbGF0aW9uT3A8U3RyaWRlcywgWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29ySW5mbGF0aW9uT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29ySW5mbGF0aW9uT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JJbmZsYXRpb25PcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckluZmxhdGlvbk9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JJbmZsYXRpb25PcChjb25zdCBYcHJUeXBlJiBleHByLCBjb25zdCBTdHJpZGVzJiBzdHJpZGVzKQorICAgICAgOiBtX3hwcihleHByKSwgbV9zdHJpZGVzKHN0cmlkZXMpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFN0cmlkZXMmIHN0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX3N0cmlkZXM7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFN0cmlkZXMgbV9zdHJpZGVzOworfTsKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29ySW5mbGF0aW9uT3A8U3RyaWRlcywgQXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JJbmZsYXRpb25PcDxTdHJpZGVzLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQqLyBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIEJsb2NrQWNjZXNzID0gZmFsc2UsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9zdHJpZGVzKG9wLnN0cmlkZXMoKSkKKyAgeworICAgIG1fZGltZW5zaW9ucyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgLy8gRXhwYW5kIGVhY2ggZGltZW5zaW9uIHRvIHRoZSBpbmZsYXRlZCBkaW1lbnNpb24uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgIG1fZGltZW5zaW9uc1tpXSA9IChtX2RpbWVuc2lvbnNbaV0gLSAxKSAqIG9wLnN0cmlkZXMoKVtpXSArIDE7CisgICAgfQorCisgICAgLy8gUmVtZW1iZXIgdGhlIHN0cmlkZXMgZm9yIGZhc3QgZGl2aXNpb24uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgIG1fZmFzdFN0cmlkZXNbaV0gPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9zdHJpZGVzW2ldKTsKKyAgICB9CisKKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9vdXRwdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIG1faW5wdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpLTFdICogbV9kaW1lbnNpb25zW2ktMV07CisgICAgICAgIG1faW5wdXRTdHJpZGVzW2ldID0gbV9pbnB1dFN0cmlkZXNbaS0xXSAqIGlucHV0X2RpbXNbaS0xXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gUm93TWFqb3IKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdID0gMTsKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMtMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX291dHB1dFN0cmlkZXNbaV0gPSBtX291dHB1dFN0cmlkZXNbaSsxXSAqIG1fZGltZW5zaW9uc1tpKzFdOworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIC8vIENvbXB1dGVzIHRoZSBpbnB1dCBpbmRleCBnaXZlbiB0aGUgb3V0cHV0IGluZGV4LiBSZXR1cm5zIHRydWUgaWYgdGhlIG91dHB1dAorICAvLyBpbmRleCBkb2Vzbid0IGZhbGwgaW50byBhIGhvbGUuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBnZXRJbnB1dEluZGV4KEluZGV4IGluZGV4LCBJbmRleCogaW5wdXRJbmRleCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChpbmRleCA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisgICAgKmlucHV0SW5kZXggPSAwOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaWYgKGlkeCAhPSBpZHggLyBtX2Zhc3RTdHJpZGVzW2ldICogbV9zdHJpZGVzW2ldKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbnB1dEluZGV4ICs9IGlkeCAvIG1fc3RyaWRlc1tpXSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpZiAoaW5kZXggIT0gaW5kZXggLyBtX2Zhc3RTdHJpZGVzWzBdICogbV9zdHJpZGVzWzBdKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgICppbnB1dEluZGV4ICs9IGluZGV4IC8gbV9zdHJpZGVzWzBdOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltcyAtIDE7ICsraSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaWYgKGlkeCAhPSBpZHggLyBtX2Zhc3RTdHJpZGVzW2ldICogbV9zdHJpZGVzW2ldKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbnB1dEluZGV4ICs9IGlkeCAvIG1fc3RyaWRlc1tpXSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpZiAoaW5kZXggIT0gaW5kZXggLyBtX2Zhc3RTdHJpZGVzW051bURpbXMtMV0gKiBtX3N0cmlkZXNbTnVtRGltcy0xXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAqaW5wdXRJbmRleCArPSBpbmRleCAvIG1fc3RyaWRlc1tOdW1EaW1zIC0gMV07CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBpZiAoZ2V0SW5wdXRJbmRleChpbmRleCwgJmlucHV0SW5kZXgpKSB7CisgICAgIHJldHVybiBtX2ltcGwuY29lZmYoaW5wdXRJbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICB9CisgIH0KKworICAvLyBUT0RPKHlhbmdrZSk6IG9wdGltaXplIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGFuZCBwcm9kdWNlCisgIC8vIGFsbC16ZXJvIHBhY2tldHMKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgeworICAgICAgdmFsdWVzW2ldID0gY29lZmYoaW5kZXgraSk7CisgICAgfQorICAgIFBhY2tldFJldHVyblR5cGUgcnNsdCA9IGludGVybmFsOjpwbG9hZDxQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMpOworICAgIHJldHVybiByc2x0OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIGNvbnN0IGRvdWJsZSBjb21wdXRlX2Nvc3QgPSBOdW1EaW1zICogKDMgKiBUZW5zb3JPcENvc3Q6OkRpdkNvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBUZW5zb3JPcENvc3Q6Ok11bENvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCkpOworICAgIGNvbnN0IGRvdWJsZSBpbnB1dF9zaXplID0gbV9pbXBsLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKTsKKyAgICBjb25zdCBkb3VibGUgb3V0cHV0X3NpemUgPSBtX2RpbWVuc2lvbnMuVG90YWxTaXplKCk7CisgICAgaWYgKG91dHB1dF9zaXplID09IDApCisgICAgICByZXR1cm4gVGVuc29yT3BDb3N0KCk7CisgICAgcmV0dXJuIG1faW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICBUZW5zb3JPcENvc3Qoc2l6ZW9mKENvZWZmUmV0dXJuVHlwZSkgKiBpbnB1dF9zaXplIC8gb3V0cHV0X3NpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgcHJvdGVjdGVkOgorICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fb3V0cHV0U3RyaWRlczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGVzOworICBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBtX2ltcGw7CisgIGNvbnN0IFN0cmlkZXMgbV9zdHJpZGVzOworICBhcnJheTxpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4sIE51bURpbXM+IG1fZmFzdFN0cmlkZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5GTEFUSU9OX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySW5pdGlhbGl6ZXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySW5pdGlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbml0aWFsaXplci5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JTklUSUFMSVpFUl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5JVElBTElaRVJfSAorCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBUZW5zb3JJbml0aWFsaXplcgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBIZWxwZXIgdGVtcGxhdGUgdG8gaW5pdGlhbGl6ZSBUZW5zb3JzIGZyb20gc3RkOjppbml0aWFsaXplcl9saXN0cy4KKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCBpbnQgTj4KK3N0cnVjdCBJbml0aWFsaXplciB7CisgIHR5cGVkZWYgc3RkOjppbml0aWFsaXplcl9saXN0PAorICAgIHR5cGVuYW1lIEluaXRpYWxpemVyPERlcml2ZWQsIE4gLSAxPjo6SW5pdExpc3Q+IEluaXRMaXN0OworCisgIHN0YXRpYyB2b2lkIHJ1bihUZW5zb3JFdmFsdWF0b3I8RGVyaXZlZCwgRGVmYXVsdERldmljZT4mIHRlbnNvciwKKyAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTx0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OkluZGV4LCB0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnM+KiBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdExpc3QmIHZhbHMpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChhdXRvIHYgOiB2YWxzKSB7CisgICAgICAoKmluZGljZXMpW3RyYWl0czxEZXJpdmVkPjo6TnVtRGltZW5zaW9ucyAtIE5dID0gaSsrOworICAgICAgSW5pdGlhbGl6ZXI8RGVyaXZlZCwgTiAtIDE+OjpydW4odGVuc29yLCBpbmRpY2VzLCB2KTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IEluaXRpYWxpemVyPERlcml2ZWQsIDE+IHsKKyAgdHlwZWRlZiBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+IEluaXRMaXN0OworCisgIHN0YXRpYyB2b2lkIHJ1bihUZW5zb3JFdmFsdWF0b3I8RGVyaXZlZCwgRGVmYXVsdERldmljZT4mIHRlbnNvciwKKyAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTx0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OkluZGV4LCB0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnM+KiBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdExpc3QmIHZhbHMpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgLy8gVGhlcmUgaXMgbGlrZWx5IGEgZmFzdGVyIHdheSB0byBkbyB0aGF0IHRoYW4gaXRlcmF0aW5nLgorICAgIGZvciAoYXV0byB2IDogdmFscykgeworICAgICAgKCppbmRpY2VzKVt0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnMgLSAxXSA9IGkrKzsKKyAgICAgIHRlbnNvci5jb2VmZlJlZigqaW5kaWNlcykgPSB2OworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgSW5pdGlhbGl6ZXI8RGVyaXZlZCwgMD4geworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIEluaXRMaXN0OworCisgIHN0YXRpYyB2b2lkIHJ1bihUZW5zb3JFdmFsdWF0b3I8RGVyaXZlZCwgRGVmYXVsdERldmljZT4mIHRlbnNvciwKKyAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTx0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OkluZGV4LCB0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnM+KiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEluaXRMaXN0JiB2KSB7CisgICAgdGVuc29yLmNvZWZmUmVmKDApID0gdjsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgaW50IE4+Cit2b2lkIGluaXRpYWxpemVfdGVuc29yKFRlbnNvckV2YWx1YXRvcjxEZXJpdmVkLCBEZWZhdWx0RGV2aWNlPiYgdGVuc29yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBJbml0aWFsaXplcjxEZXJpdmVkLCB0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnM+OjpJbml0TGlzdCYgdmFscykgeworICBFaWdlbjo6YXJyYXk8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpJbmRleCwgdHJhaXRzPERlcml2ZWQ+OjpOdW1EaW1lbnNpb25zPiBpbmRpY2VzOworICBJbml0aWFsaXplcjxEZXJpdmVkLCB0cmFpdHM8RGVyaXZlZD46Ok51bURpbWVuc2lvbnM+OjpydW4odGVuc29yLCAmaW5kaWNlcywgdmFscyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfSU5JVElBTElaRVJfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JJbnREaXYuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySW50RGl2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMzkzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29ySW50RGl2LmgKQEAgLTAsMCArMSwyNTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JTlRESVZfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0lOVERJVl9ICisKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIFRlbnNvckludERpdgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBGYXN0IGludGVnZXIgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KKyAgKgorICAqIFNlZSB0aGUgcGFwZXIgZnJvbSBHcmFubHVuZCBhbmQgTW9udGdvbWVyeSBmb3IgZXhwbGFuYXRpb24uCisgICogICAoYXQgaHR0cDovL2R4LmRvaS5vcmcvMTAuMTE0NS83NzM0NzMuMTc4MjQ5KQorICAqCisgICogXHNhIFRlbnNvcgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCituYW1lc3BhY2UgeworCisgIC8vIE5vdGU6IHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdmFsID09IDAKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjxzaXplb2YoVCk9PTQsaW50Pjo6dHlwZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvbnN0IFQgdmFsKQorICB7CisjaWZkZWYgX19DVURBX0FSQ0hfXworICAgIHJldHVybiBfX2Nseih2YWwpOworI2VsaWYgRUlHRU5fQ09NUF9NU1ZDCisgICAgdW5zaWduZWQgbG9uZyBpbmRleDsKKyAgICBfQml0U2NhblJldmVyc2UoJmluZGV4LCB2YWwpOworICAgIHJldHVybiAzMSAtIGluZGV4OworI2Vsc2UKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpID09IDgsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9jbHooc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbCkpOworI2VuZGlmCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorICB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPHNpemVvZihUKT09OCxpbnQ+Ojp0eXBlIGNvdW50X2xlYWRpbmdfemVyb3MoY29uc3QgVCB2YWwpCisgIHsKKyNpZmRlZiBfX0NVREFfQVJDSF9fCisgICAgcmV0dXJuIF9fY2x6bGwodmFsKTsKKyNlbGlmIEVJR0VOX0NPTVBfTVNWQyAmJiBFSUdFTl9BUkNIX3g4Nl82NAorICAgIHVuc2lnbmVkIGxvbmcgaW5kZXg7CisgICAgX0JpdFNjYW5SZXZlcnNlNjQoJmluZGV4LCB2YWwpOworICAgIHJldHVybiA2MyAtIGluZGV4OworI2VsaWYgRUlHRU5fQ09NUF9NU1ZDCisgICAgLy8gTVNWQydzIF9CaXRTY2FuUmV2ZXJzZTY0IGlzIG5vdCBhdmFpbGFibGUgZm9yIDMyYml0cyBidWlsZHMuCisgICAgdW5zaWduZWQgaW50IGxvID0gKHVuc2lnbmVkIGludCkodmFsJjB4ZmZmZmZmZmYpOworICAgIHVuc2lnbmVkIGludCBoaSA9ICh1bnNpZ25lZCBpbnQpKCh2YWw+PjMyKSYweGZmZmZmZmZmKTsKKyAgICBpbnQgbjsKKyAgICBpZihoaT09MCkKKyAgICAgIG4gPSAzMiArIGNvdW50X2xlYWRpbmdfemVyb3M8dW5zaWduZWQgaW50Pihsbyk7CisgICAgZWxzZQorICAgICAgbiA9IGNvdW50X2xlYWRpbmdfemVyb3M8dW5zaWduZWQgaW50PihoaSk7CisgICAgcmV0dXJuIG47CisjZWxzZQorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgPT0gOCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICByZXR1cm4gX19idWlsdGluX2NsemxsKHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2YWwpKTsKKyNlbmRpZgorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBVbnNpZ25lZFRyYWl0cyB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxzaXplb2YoVCkgPT0gOCwgdWludDY0X3QsIHVpbnQzMl90Pjo6dHlwZSB0eXBlOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgRGl2aWRlclRyYWl0cyB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBVbnNpZ25lZFRyYWl0czxUPjo6dHlwZSB0eXBlOworICAgIHN0YXRpYyBjb25zdCBpbnQgTiA9IHNpemVvZihUKSAqIDg7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdWludDMyX3QgbXVsdWgoY29uc3QgdWludDMyX3QgYSwgY29uc3QgVCBiKSB7CisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKQorICAgIHJldHVybiBfX3VtdWxoaShhLCBiKTsKKyNlbHNlCisgICAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oYSkgKiBiKSA+PiAzMjsKKyNlbmRpZgorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdWludDY0X3QgbXVsdWgoY29uc3QgdWludDY0X3QgYSwgY29uc3QgVCBiKSB7CisjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKQorICAgIHJldHVybiBfX3VtdWw2NGhpKGEsIGIpOworI2VsaWYgZGVmaW5lZChfX1NJWkVPRl9JTlQxMjhfXykKKyAgICBfX3VpbnQxMjhfdCB2ID0gc3RhdGljX2Nhc3Q8X191aW50MTI4X3Q+KGEpICogc3RhdGljX2Nhc3Q8X191aW50MTI4X3Q+KGIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4odiA+PiA2NCk7CisjZWxzZQorICAgIHJldHVybiAoVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCB1aW50NjRfdD4oYSkgKiBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MD4sIHVpbnQ2NF90PihiKSkudXBwZXIoKTsKKyNlbmRpZgorICB9CisKKyAgdGVtcGxhdGUgPGludCBOLCB0eXBlbmFtZSBUPgorICBzdHJ1Y3QgRGl2aWRlckhlbHBlciB7CisgICAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgdWludDMyX3QgY29tcHV0ZU11bHRpcGxpZXIoY29uc3QgaW50IGxvZ19kaXYsIGNvbnN0IFQgZGl2aWRlcikgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChOID09IDMyLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IChOK2xvZ19kaXYpKSAvIGRpdmlkZXIgLSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IE4pICsgMSk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgRGl2aWRlckhlbHBlcjw2NCwgVD4geworICAgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIHVpbnQ2NF90IGNvbXB1dGVNdWx0aXBsaWVyKGNvbnN0IGludCBsb2dfZGl2LCBjb25zdCBUIGRpdmlkZXIpIHsKKyNpZiBkZWZpbmVkKF9fU0laRU9GX0lOVDEyOF9fKSAmJiAhZGVmaW5lZChfX0NVREFfQVJDSF9fKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RhdGljX2Nhc3Q8X191aW50MTI4X3Q+KDEpIDw8ICg2NCtsb2dfZGl2KSkgLyBzdGF0aWNfY2FzdDxfX3VpbnQxMjhfdD4oZGl2aWRlcikgLSAoc3RhdGljX2Nhc3Q8X191aW50MTI4X3Q+KDEpIDw8IDY0KSArIDEpOworI2Vsc2UKKyAgICAgIGNvbnN0IHVpbnQ2NF90IHNoaWZ0ID0gMVVMTCA8PCBsb2dfZGl2OworICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHJlc3VsdCA9IFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHN0YXRpY192YWw8MD4gPihzaGlmdCwgMCkgLyBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MD4sIHVpbnQ2NF90PihkaXZpZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwxPiwgc3RhdGljX3ZhbDwwPiA+KDEsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCBzdGF0aWNfdmFsPDE+ID4oMSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdCk7CisjZW5kaWYKKyAgICB9CisgIH07Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgZGl2X2d0X29uZSA9IGZhbHNlPgorc3RydWN0IFRlbnNvckludERpdmlzb3IgeworIHB1YmxpYzoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JJbnREaXZpc29yKCkgeworICAgIG11bHRpcGxpZXIgPSAwOworICAgIHNoaWZ0MSA9IDA7CisgICAgc2hpZnQyID0gMDsKKyAgfQorCisgIC8vIE11c3QgaGF2ZSAwIDwgZGl2aWRlciA8IDJeMzEuIFRoaXMgaXMgcmVsYXhlZCB0bworICAvLyAwIDwgZGl2aWRlciA8IDJeNjMgd2hlbiB1c2luZyA2NC1iaXQgaW5kaWNlcyBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisgIC8vIHRoZSBfX3VpbnQxMjhfdCB0eXBlLgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckludERpdmlzb3IoY29uc3QgVCBkaXZpZGVyKSB7CisgICAgY29uc3QgaW50IE4gPSBEaXZpZGVyVHJhaXRzPFQ+OjpOOworICAgIGVpZ2VuX2Fzc2VydChzdGF0aWNfY2FzdDx0eXBlbmFtZSBVbnNpZ25lZFRyYWl0czxUPjo6dHlwZT4oZGl2aWRlcikgPCBOdW1UcmFpdHM8VW5zaWduZWRUeXBlPjo6aGlnaGVzdCgpLzIpOworICAgIGVpZ2VuX2Fzc2VydChkaXZpZGVyID4gMCk7CisKKyAgICAvLyBmYXN0IGxuMgorICAgIGNvbnN0IGludCBsZWFkaW5nX3plcm9zID0gY291bnRfbGVhZGluZ196ZXJvcyhzdGF0aWNfY2FzdDxVbnNpZ25lZFR5cGU+KGRpdmlkZXIpKTsKKyAgICBpbnQgbG9nX2RpdiA9IE4gLSBsZWFkaW5nX3plcm9zOworICAgIC8vIGlmIGRpdmlkZXIgaXMgYSBwb3dlciBvZiB0d28gdGhlbiBsb2dfZGl2IGlzIDEgbW9yZSB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBpZiAoKHN0YXRpY19jYXN0PHR5cGVuYW1lIFVuc2lnbmVkVHJhaXRzPFQ+Ojp0eXBlPigxKSA8PCAobG9nX2Rpdi0xKSkgPT0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVW5zaWduZWRUcmFpdHM8VD46OnR5cGU+KGRpdmlkZXIpKQorICAgICAgbG9nX2Rpdi0tOworCisgICAgbXVsdGlwbGllciA9IERpdmlkZXJIZWxwZXI8TiwgVD46OmNvbXB1dGVNdWx0aXBsaWVyKGxvZ19kaXYsIGRpdmlkZXIpOworICAgIHNoaWZ0MSA9IGxvZ19kaXYgPiAxID8gMSA6IGxvZ19kaXY7CisgICAgc2hpZnQyID0gbG9nX2RpdiA+IDEgPyBsb2dfZGl2LTEgOiAwOworICB9CisKKyAgLy8gTXVzdCBoYXZlIDAgPD0gbnVtZXJhdG9yLiBPbiBwbGF0Zm9ybXMgdGhhdCBkb250IHN1cHBvcnQgdGhlIF9fdWludDEyOF90CisgIC8vIHR5cGUgbnVtZXJhdG9yIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiAyXjMyLTEuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCBkaXZpZGUoY29uc3QgVCBudW1lcmF0b3IpIGNvbnN0IHsKKyAgICBlaWdlbl9hc3NlcnQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVW5zaWduZWRUcmFpdHM8VD46OnR5cGU+KG51bWVyYXRvcikgPCBOdW1UcmFpdHM8VW5zaWduZWRUeXBlPjo6aGlnaGVzdCgpLzIpOworICAgIC8vZWlnZW5fYXNzZXJ0KG51bWVyYXRvciA+PSAwKTsgLy8gdGhpcyBpcyBpbXBsaWNpdGx5IGFzc2VydGVkIGJ5IHRoZSBsaW5lIGFib3ZlCisKKyAgICBVbnNpZ25lZFR5cGUgdDEgPSBtdWx1aChtdWx0aXBsaWVyLCBudW1lcmF0b3IpOworICAgIFVuc2lnbmVkVHlwZSB0ID0gKHN0YXRpY19jYXN0PFVuc2lnbmVkVHlwZT4obnVtZXJhdG9yKSAtIHQxKSA+PiBzaGlmdDE7CisgICAgcmV0dXJuICh0MSArIHQpID4+IHNoaWZ0MjsKKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBEaXZpZGVyVHJhaXRzPFQ+Ojp0eXBlIFVuc2lnbmVkVHlwZTsKKyAgVW5zaWduZWRUeXBlIG11bHRpcGxpZXI7CisgIGludDMyX3Qgc2hpZnQxOworICBpbnQzMl90IHNoaWZ0MjsKK307CisKKworLy8gT3B0aW1pemVkIHZlcnNpb24gZm9yIHNpZ25lZCAzMiBiaXQgaW50ZWdlcnMuCisvLyBEZXJpdmVkIGZyb20gSGFja2VyJ3MgRGVsaWdodC4KKy8vIE9ubHkgd29ya3MgZm9yIGRpdmlzb3JzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBvbmUKK3RlbXBsYXRlIDw+CitjbGFzcyBUZW5zb3JJbnREaXZpc29yPGludDMyX3QsIHRydWU+IHsKKyBwdWJsaWM6CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29ySW50RGl2aXNvcigpIHsKKyAgICBtYWdpYyA9IDA7CisgICAgc2hpZnQgPSAwOworICB9CisgIC8vIE11c3QgaGF2ZSAyIDw9IGRpdmlkZXIKKyAgRUlHRU5fREVWSUNFX0ZVTkMgVGVuc29ySW50RGl2aXNvcihpbnQzMl90IGRpdmlkZXIpICB7CisgICAgZWlnZW5fYXNzZXJ0KGRpdmlkZXIgPj0gMik7CisgICAgY2FsY01hZ2ljKGRpdmlkZXIpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBpbnQgZGl2aWRlKGNvbnN0IGludDMyX3QgbikgY29uc3QgeworI2lmZGVmIF9fQ1VEQV9BUkNIX18KKyAgICByZXR1cm4gKF9fdW11bGhpKG1hZ2ljLCBuKSA+PiBzaGlmdCk7CisjZWxzZQorICAgIHVpbnQ2NF90IHYgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obWFnaWMpICogc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG4pOworICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHYgPj4gMzIpID4+IHNoaWZ0KTsKKyNlbmRpZgorICB9CisKK3ByaXZhdGU6CisgIC8vIENvbXB1dGUgdGhlIG1hZ2ljIG51bWJlcnMuIFNlZSBIYWNrZXIncyBEZWxpZ2h0IHNlY3Rpb24gMTAgZm9yIGFuIGluCisgIC8vIGRlcHRoIGV4cGxhbmF0aW9uLgorICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNhbGNNYWdpYyhpbnQzMl90IGQpIHsKKyAgIGNvbnN0IHVuc2lnbmVkIHR3bzMxID0gMHg4MDAwMDAwMDsgICAgIC8vIDIqKjMxLgorICAgdW5zaWduZWQgYWQgPSBkOworICAgdW5zaWduZWQgdCA9IHR3bzMxICsgKGFkID4+IDMxKTsKKyAgIHVuc2lnbmVkIGFuYyA9IHQgLSAxIC0gdCVhZDsgICAgIC8vIEFic29sdXRlIHZhbHVlIG9mIG5jLgorICAgaW50IHAgPSAzMTsgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdC4gcC4KKyAgIHVuc2lnbmVkIHExID0gdHdvMzEvYW5jOyAgICAgICAgIC8vIEluaXQuIHExID0gMioqcC98bmN8LgorICAgdW5zaWduZWQgcjEgPSB0d28zMSAtIHExKmFuYzsgICAgLy8gSW5pdC4gcjEgPSByZW0oMioqcCwgfG5jfCkuCisgICB1bnNpZ25lZCBxMiA9IHR3bzMxL2FkOyAgICAgICAgICAvLyBJbml0LiBxMiA9IDIqKnAvfGR8LgorICAgdW5zaWduZWQgcjIgPSB0d28zMSAtIHEyKmFkOyAgICAgLy8gSW5pdC4gcjIgPSByZW0oMioqcCwgfGR8KS4KKyAgIHVuc2lnbmVkIGRlbHRhID0gMDsKKyAgIGRvIHsKKyAgICAgIHAgPSBwICsgMTsKKyAgICAgIHExID0gMipxMTsgICAgICAgICAgIC8vIFVwZGF0ZSBxMSA9IDIqKnAvfG5jfC4KKyAgICAgIHIxID0gMipyMTsgICAgICAgICAgIC8vIFVwZGF0ZSByMSA9IHJlbSgyKipwLCB8bmN8KS4KKyAgICAgIGlmIChyMSA+PSBhbmMpIHsgICAgIC8vIChNdXN0IGJlIGFuIHVuc2lnbmVkCisgICAgICAgICBxMSA9IHExICsgMTsgICAgICAvLyBjb21wYXJpc29uIGhlcmUpLgorICAgICAgICAgcjEgPSByMSAtIGFuYzt9CisgICAgICBxMiA9IDIqcTI7ICAgICAgICAgICAvLyBVcGRhdGUgcTIgPSAyKipwL3xkfC4KKyAgICAgIHIyID0gMipyMjsgICAgICAgICAgIC8vIFVwZGF0ZSByMiA9IHJlbSgyKipwLCB8ZHwpLgorICAgICAgaWYgKHIyID49IGFkKSB7ICAgICAgLy8gKE11c3QgYmUgYW4gdW5zaWduZWQKKyAgICAgICAgIHEyID0gcTIgKyAxOyAgICAgIC8vIGNvbXBhcmlzb24gaGVyZSkuCisgICAgICAgICByMiA9IHIyIC0gYWQ7fQorICAgICAgZGVsdGEgPSBhZCAtIHIyOworICAgfSB3aGlsZSAocTEgPCBkZWx0YSB8fCAocTEgPT0gZGVsdGEgJiYgcjEgPT0gMCkpOworCisgICBtYWdpYyA9ICh1bnNpZ25lZCkocTIgKyAxKTsKKyAgIHNoaWZ0ID0gcCAtIDMyOworICB9CisKKyAgdWludDMyX3QgbWFnaWM7CisgIGludDMyX3Qgc2hpZnQ7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGRpdl9ndF9vbmU+CitzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUIG9wZXJhdG9yIC8gKGNvbnN0IFQmIG51bWVyYXRvciwgY29uc3QgVGVuc29ySW50RGl2aXNvcjxULCBkaXZfZ3Rfb25lPiYgZGl2aXNvcikgeworICByZXR1cm4gZGl2aXNvci5kaXZpZGUobnVtZXJhdG9yKTsKK30KKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9JTlRESVZfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JMYXlvdXRTd2FwLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvckxheW91dFN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDAxMDllCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JMYXlvdXRTd2FwLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9MQVlPVVRfU1dBUF9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfTEFZT1VUX1NXQVBfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvckxheW91dFN3YXAKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3dhcCB0aGUgbGF5b3V0IGZyb20gY29sLW1ham9yIHRvIHJvdy1tYWpvciwgb3Igcm93LW1ham9yCisgICogdG8gY29sLW1ham9yLCBhbmQgaW52ZXJ0IHRoZSBvcmRlciBvZiB0aGUgZGltZW5zaW9ucy4KKyAgKgorICAqIEJld2FyZTogdGhlIGRpbWVuc2lvbnMgYXJlIHJldmVyc2VkIGJ5IHRoaXMgb3BlcmF0aW9uLiBJZiB5b3Ugd2FudCB0bworICAqIHByZXNlcnZlIHRoZSBvcmRlcmluZyBvZiB0aGUgZGltZW5zaW9ucywgeW91IG5lZWQgdG8gY29tYmluZSB0aGlzCisgICogb3BlcmF0aW9uIHdpdGggYSBzaHVmZmxlLgorICAqCisgICogXGV4YW1wbGU6CisgICogVGVuc29yPGZsb2F0LCAyLCBDb2xNYWpvcj4gaW5wdXQoMiwgNCk7CisgICogVGVuc29yPGZsb2F0LCAyLCBSb3dNYWpvcj4gb3V0cHV0ID0gaW5wdXQuc3dhcF9sYXlvdXQoKTsKKyAgKiBlaWdlbl9hc3NlcnQob3V0cHV0LmRpbWVuc2lvbigwKSA9PSA0KTsKKyAgKiBlaWdlbl9hc3NlcnQob3V0cHV0LmRpbWVuc2lvbigxKSA9PSAyKTsKKyAgKgorICAqIGFycmF5PGludCwgMj4gc2h1ZmZsZSgxLCAwKTsKKyAgKiBvdXRwdXQgPSBpbnB1dC5zd2FwX2xheW91dCgpLnNodWZmbGUoc2h1ZmZsZSk7CisgICogZWlnZW5fYXNzZXJ0KG91dHB1dC5kaW1lbnNpb24oMCkgPT0gMik7CisgICogZWlnZW5fYXNzZXJ0KG91dHB1dC5kaW1lbnNpb24oMSkgPT0gNCk7CisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JMYXlvdXRTd2FwT3A8WHByVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IHRyYWl0czxYcHJUeXBlPjo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSAodHJhaXRzPFhwclR5cGU+OjpMYXlvdXQgPT0gQ29sTWFqb3IpID8gUm93TWFqb3IgOiBDb2xNYWpvcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JMYXlvdXRTd2FwT3A8WHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JMYXlvdXRTd2FwT3A8WHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JMYXlvdXRTd2FwT3A8WHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yTGF5b3V0U3dhcE9wPFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yTGF5b3V0U3dhcE9wPFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yTGF5b3V0U3dhcE9wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yTGF5b3V0U3dhcE9wPFhwclR5cGU+LCBXcml0ZUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvckxheW91dFN3YXBPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGU+Ojp0eXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JMYXlvdXRTd2FwT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JMYXlvdXRTd2FwT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JMYXlvdXRTd2FwT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckxheW91dFN3YXBPcChjb25zdCBYcHJUeXBlJiBleHByKQorICAgICAgOiBtX3hwcihleHByKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckxheW91dFN3YXBPcCYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yTGF5b3V0U3dhcE9wJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvckxheW91dFN3YXBPcCwgY29uc3QgVGVuc29yTGF5b3V0U3dhcE9wPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckxheW91dFN3YXBPcCYgb3BlcmF0b3IgPSAoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvckxheW91dFN3YXBPcCwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yTGF5b3V0U3dhcE9wPEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yTGF5b3V0U3dhcE9wPEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBMYXlvdXQgPSAoc3RhdGljX2Nhc3Q8aW50PihUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpSYXdBY2Nlc3MKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSkKKyAgeworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgIG1fZGltZW5zaW9uc1tpXSA9IG1faW1wbC5kaW1lbnNpb25zKClbTnVtRGltcy0xLWldOworICAgIH0KKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKENvZWZmUmV0dXJuVHlwZSogZGF0YSkgeworICAgIHJldHVybiBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoZGF0YSk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbmRleCk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JPcENvc3QgY29zdFBlckNvZWZmKGJvb2wgdmVjdG9yaXplZCkgY29uc3QgeworICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsLmRhdGEoKTsgfQorCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+JiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisKKyBwcm90ZWN0ZWQ6CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKKyAgRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7Cit9OworCisKKy8vIEV2YWwgYXMgbHZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CisgIHN0cnVjdCBUZW5zb3JFdmFsdWF0b3I8VGVuc29yTGF5b3V0U3dhcE9wPEFyZ1R5cGU+LCBEZXZpY2U+CisgIDogcHVibGljIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JMYXlvdXRTd2FwT3A8QXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yTGF5b3V0U3dhcE9wPEFyZ1R5cGU+LCBEZXZpY2U+IEJhc2U7CisgIHR5cGVkZWYgVGVuc29yTGF5b3V0U3dhcE9wPEFyZ1R5cGU+IFhwclR5cGU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IChzdGF0aWNfY2FzdDxpbnQ+KFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBCYXNlKG9wLCBkZXZpY2UpCisgIHsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUmIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7CisgICAgcmV0dXJuIHRoaXMtPm1faW1wbC5jb2VmZlJlZihpbmRleCk7CisgIH0KKyAgdGVtcGxhdGUgPGludCBTdG9yZU1vZGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0UmV0dXJuVHlwZSYgeCkKKyAgeworICAgIHRoaXMtPm1faW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LCB4KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX0xBWU9VVF9TV0FQX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yTWFjcm9zLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvck1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDA3OGIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvck1hY3Jvcy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NRVRBX01BQ1JPU19ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfTUVUQV9NQUNST1NfSAorCisKKy8qKiB1c2UgdGhpcyBtYWNybyBpbiBzZmluYWUgc2VsZWN0aW9uIGluIHRlbXBsYXRlZCBmdW5jdGlvbnMKKyAqCisgKiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgKiAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBpc0JhbmFuYTxUPjo6dmFsdWUgLCBpbnQgPjo6dHlwZSA9IDAKKyAqICAgPgorICogICB2b2lkIGZvbygpe30KKyAqCisgKiAgIGJlY29tZXMgPT4KKyAqCisgKiAgIHRlbXBsYXRlPHR5cGVuYW1lIFRvcG9UeXBlLAorICogICAgICAgICAgIFNGSU5BRV9FTkFCTEVfSUYoIGlzQmFuYW5hPFQ+Ojp2YWx1ZSApCisgKiAgID4KKyAqICAgdm9pZCBmb28oKXt9CisgKi8KKworLy8gU0ZJTkFFIHJlcXVpcmVzIHZhcmlhZGljIHRlbXBsYXRlcworI2lmbmRlZiBfX0NVREFDQ19fCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAvLyBTRklOQUUgZG9lc24ndCB3b3JrIGZvciBnY2MgPD0gNC43CisgICNpZmRlZiBFSUdFTl9DT01QX0dOVUMKKyAgICAjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDgpCisgICAgICAjZGVmaW5lIEVJR0VOX0hBU19TRklOQUUKKyAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIEVJR0VOX0hBU19TRklOQUUKKyAgI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEVJR0VOX1NGSU5BRV9FTkFCTEVfSUYoIF9fY29uZGl0aW9uX18gKSBcCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwgKCBfX2NvbmRpdGlvbl9fICkgLCBpbnQgPjo6dHlwZSA9IDAKKworCisjaWYgRUlHRU5fSEFTX0NPTlNURVhQUgorI2RlZmluZSBFSUdFTl9DT05TVEVYUFIgY29uc3RleHByCisjZWxzZQorI2RlZmluZSBFSUdFTl9DT05TVEVYUFIKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JNYXAuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNTU3NQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yTWFwLmgKQEAgLTAsMCArMSwzMjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NQVBfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX01BUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yTWFwCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIEEgdGVuc29yIGV4cHJlc3Npb24gbWFwcGluZyBhbiBleGlzdGluZyBhcnJheSBvZiBkYXRhLgorICAqCisgICovCisvLy8gdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8gaXMgYWRkZWQgdG8gY29udmVydCB0aGUgaG9zdCBwb2ludGVyIHRvIHRoZSBkZXZpY2UgcG9pbnRlci4KKy8vLyBJdCBpcyBhZGRlZCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBmb3Igb3VyIGRldmljZSBjb21waWxlciBUKiBpcyBub3QgYWxsb3dlZC4KKy8vLyBJZiB3ZSB3YW50ZWQgdG8gdXNlIHRoZSBzYW1lIEV2YWx1YXRvciBmdW5jdGlvbnMgd2UgaGF2ZSB0byBjb252ZXJ0IHRoYXQgdHlwZSB0byBvdXIgcG9pbnRlciBULgorLy8vIFRoaXMgaXMgZG9uZSB0aHJvdWdoIG91ciBNYWtlUG9pbnRlcl8gY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFR5cGUgaW4gdGhlIE1ha2VQb2ludGVyXzxUPiBpcyBUKiAuCisvLy8gVGhlcmVmb3JlLCBieSBhZGRpbmcgdGhlIGRlZmF1bHQgdmFsdWUsIHdlIG1hbmFnZWQgdG8gY29udmVydCB0aGUgdHlwZSBhbmQgaXQgZG9lcyBub3QgYnJlYWsgYW55CisvLy8gZXhpc3RpbmcgY29kZSBhcyBpdHMgZGVmYXVsdCB2YWx1ZSBpcyBUKi4KK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnNfLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXz4gY2xhc3MgVGVuc29yTWFwIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yTWFwPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9uc18sIE1ha2VQb2ludGVyXz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBUZW5zb3JNYXA8UGxhaW5PYmplY3RUeXBlLCBPcHRpb25zXywgTWFrZVBvaW50ZXJfPiBTZWxmOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlOjpCYXNlIEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxTZWxmPjo6dHlwZSBOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFBsYWluT2JqZWN0VHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxQbGFpbk9iamVjdFR5cGU+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UGxhaW5PYmplY3RUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgIC8qICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2woaW50ZXJuYWw6OmlzX2x2YWx1ZTxQbGFpbk9iamVjdFR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyICo+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZTsqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWFrZVBvaW50ZXJfPFNjYWxhcj46OlR5cGUgUG9pbnRlclR5cGU7CisgICAgdHlwZWRlZiBQb2ludGVyVHlwZSBQb2ludGVyQXJnVHlwZTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW9ucyA9IE9wdGlvbnNfOworCisgICAgc3RhdGljIGNvbnN0IEluZGV4IE51bUluZGljZXMgPSBQbGFpbk9iamVjdFR5cGU6Ok51bUluZGljZXM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKworICAgIGVudW0geworICAgICAgSXNBbGlnbmVkID0gKChpbnQoT3B0aW9uc18pJkFsaWduZWQpPT1BbGlnbmVkKSwKKyAgICAgIExheW91dCA9IFBsYWluT2JqZWN0VHlwZTo6TGF5b3V0LAorICAgICAgQ29vcmRBY2Nlc3MgPSB0cnVlLAorICAgICAgUmF3QWNjZXNzID0gdHJ1ZQorICAgIH07CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIpIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoKSB7CisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdXNlZCB0byBjb25zdHJ1Y3QgYSB0ZW5zb3IgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmFuayBvZiB0aGUgdGVuc29yLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoMCA9PSBOdW1JbmRpY2VzIHx8IE51bUluZGljZXMgPT0gRHluYW1pYyksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck1hcChQb2ludGVyQXJnVHlwZSBkYXRhUHRyLCBJbmRleCBmaXJzdERpbWVuc2lvbiwgSW5kZXhUeXBlcy4uLiBvdGhlckRpbWVuc2lvbnMpIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoZmlyc3REaW1lbnNpb24sIG90aGVyRGltZW5zaW9ucy4uLikgeworICAgICAgLy8gVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHVzZWQgdG8gY29uc3RydWN0IGEgdGVuc29yIG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsgb2YgdGhlIHRlbnNvci4KKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKHNpemVvZi4uLihvdGhlckRpbWVuc2lvbnMpICsgMSA9PSBOdW1JbmRpY2VzIHx8IE51bUluZGljZXMgPT0gRHluYW1pYyksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB9CisjZWxzZQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JNYXAoUG9pbnRlckFyZ1R5cGUgZGF0YVB0ciwgSW5kZXggZmlyc3REaW1lbnNpb24pIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoZmlyc3REaW1lbnNpb24pIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyB1c2VkIHRvIGNvbnN0cnVjdCBhIHRlbnNvciBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCgxID09IE51bUluZGljZXMgfHwgTnVtSW5kaWNlcyA9PSBEeW5hbWljKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIsIEluZGV4IGRpbTEsIEluZGV4IGRpbTIpIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoZGltMSwgZGltMikgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgyID09IE51bUluZGljZXMgfHwgTnVtSW5kaWNlcyA9PSBEeW5hbWljLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JNYXAoUG9pbnRlckFyZ1R5cGUgZGF0YVB0ciwgSW5kZXggZGltMSwgSW5kZXggZGltMiwgSW5kZXggZGltMykgOiBtX2RhdGEoZGF0YVB0ciksIG1fZGltZW5zaW9ucyhkaW0xLCBkaW0yLCBkaW0zKSB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKDMgPT0gTnVtSW5kaWNlcyB8fCBOdW1JbmRpY2VzID09IER5bmFtaWMsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck1hcChQb2ludGVyQXJnVHlwZSBkYXRhUHRyLCBJbmRleCBkaW0xLCBJbmRleCBkaW0yLCBJbmRleCBkaW0zLCBJbmRleCBkaW00KSA6IG1fZGF0YShkYXRhUHRyKSwgbV9kaW1lbnNpb25zKGRpbTEsIGRpbTIsIGRpbTMsIGRpbTQpIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoNCA9PSBOdW1JbmRpY2VzIHx8IE51bUluZGljZXMgPT0gRHluYW1pYywgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIsIEluZGV4IGRpbTEsIEluZGV4IGRpbTIsIEluZGV4IGRpbTMsIEluZGV4IGRpbTQsIEluZGV4IGRpbTUpIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoZGltMSwgZGltMiwgZGltMywgZGltNCwgZGltNSkgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCg1ID09IE51bUluZGljZXMgfHwgTnVtSW5kaWNlcyA9PSBEeW5hbWljLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgfQorI2VuZGlmCisKKyAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgZGltZW5zaW9ucykKKyAgICAgIDogbV9kYXRhKGRhdGFQdHIpLCBtX2RpbWVuc2lvbnMoZGltZW5zaW9ucykKKyAgICB7IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEaW1lbnNpb25zPgorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGFQdHIsIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMpCisgICAgICA6IG1fZGF0YShkYXRhUHRyKSwgbV9kaW1lbnNpb25zKGRpbWVuc2lvbnMpCisgICAgeyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck1hcChQbGFpbk9iamVjdFR5cGUmIHRlbnNvcikKKyAgICAgIDogbV9kYXRhKHRlbnNvci5kYXRhKCkpLCBtX2RpbWVuc2lvbnModGVuc29yLmRpbWVuc2lvbnMoKSkKKyAgICB7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByYW5rKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zLnJhbmsoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBkaW1lbnNpb24oSW5kZXggbikgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zW25dOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9ucy5Ub3RhbFNpemUoKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBQb2ludGVyVHlwZSBkYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBvaW50ZXJUeXBlIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiBpbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIC8vICAgICAgZWlnZW5fYXNzZXJ0KGNoZWNrSW5kZXhSYW5nZShpbmRpY2VzKSk7CisgICAgICBpZiAoUGxhaW5PYmplY3RUeXBlOjpPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gbV9kaW1lbnNpb25zLkluZGV4T2ZSb3dNYWpvcihpbmRpY2VzKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IG1fZGltZW5zaW9ucy5JbmRleE9mQ29sTWFqb3IoaW5kaWNlcyk7CisgICAgICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICAgICAgfQorICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtSW5kaWNlcyA9PSAwLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgICByZXR1cm4gbV9kYXRhWzBdOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgfQorCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEluZGV4VHlwZXM+IEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggZmlyc3RJbmRleCwgSW5kZXggc2Vjb25kSW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mLi4uKG90aGVySW5kaWNlcykgKyAyID09IE51bUluZGljZXMsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMmUm93TWFqb3IpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBtX2RpbWVuc2lvbnMuSW5kZXhPZlJvd01ham9yKGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPnt7Zmlyc3RJbmRleCwgc2Vjb25kSW5kZXgsIG90aGVySW5kaWNlcy4uLn19KTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IG1fZGltZW5zaW9ucy5JbmRleE9mQ29sTWFqb3IoYXJyYXk8SW5kZXgsIE51bUluZGljZXM+e3tmaXJzdEluZGV4LCBzZWNvbmRJbmRleCwgb3RoZXJJbmRpY2VzLi4ufX0pOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMmUm93TWFqb3IpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMSArIGkwICogbV9kaW1lbnNpb25zWzFdOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTAgKyBpMSAqIG1fZGltZW5zaW9uc1swXTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMikgY29uc3QKKyAgICB7CisgICAgICBpZiAoUGxhaW5PYmplY3RUeXBlOjpPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkyICsgbV9kaW1lbnNpb25zWzJdICogKGkxICsgbV9kaW1lbnNpb25zWzFdICogaTApOworICAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMCArIG1fZGltZW5zaW9uc1swXSAqIChpMSArIG1fZGltZW5zaW9uc1sxXSAqIGkyKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMiwgSW5kZXggaTMpIGNvbnN0CisgICAgeworICAgICAgaWYgKFBsYWluT2JqZWN0VHlwZTo6T3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkzICsgbV9kaW1lbnNpb25zWzNdICogKGkyICsgbV9kaW1lbnNpb25zWzJdICogKGkxICsgbV9kaW1lbnNpb25zWzFdICogaTApKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgbV9kaW1lbnNpb25zWzBdICogKGkxICsgbV9kaW1lbnNpb25zWzFdICogKGkyICsgbV9kaW1lbnNpb25zWzJdICogaTMpKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMiwgSW5kZXggaTMsIEluZGV4IGk0KSBjb25zdAorICAgIHsKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMmUm93TWFqb3IpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpNCArIG1fZGltZW5zaW9uc1s0XSAqIChpMyArIG1fZGltZW5zaW9uc1szXSAqIChpMiArIG1fZGltZW5zaW9uc1syXSAqIChpMSArIG1fZGltZW5zaW9uc1sxXSAqIGkwKSkpOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTAgKyBtX2RpbWVuc2lvbnNbMF0gKiAoaTEgKyBtX2RpbWVuc2lvbnNbMV0gKiAoaTIgKyBtX2RpbWVuc2lvbnNbMl0gKiAoaTMgKyBtX2RpbWVuc2lvbnNbM10gKiBpNCkpKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKGNvbnN0IGFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgaW5kaWNlcykKKyAgICB7CisgICAgICAvLyAgICAgIGVpZ2VuX2Fzc2VydChjaGVja0luZGV4UmFuZ2UoaW5kaWNlcykpOworICAgICAgaWYgKFBsYWluT2JqZWN0VHlwZTo6T3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IG1fZGltZW5zaW9ucy5JbmRleE9mUm93TWFqb3IoaW5kaWNlcyk7CisgICAgICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBtX2RpbWVuc2lvbnMuSW5kZXhPZkNvbE1ham9yKGluZGljZXMpOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bUluZGljZXMgPT0gMCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgICAgcmV0dXJuIG1fZGF0YVswXTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICAgIH0KKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4IHNlY29uZEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMiA9PSBOdW1JbmRpY2VzIHx8IE51bUluZGljZXMgPT0gRHluYW1pYywgIk51bWJlciBvZiBpbmRpY2VzIHVzZWQgdG8gYWNjZXNzIGEgdGVuc29yIGNvZWZmaWNpZW50IG11c3QgYmUgZXF1YWwgdG8gdGhlIHJhbmsgb2YgdGhlIHRlbnNvci4iKTsKKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE51bURpbXMgPSBzaXplb2YuLi4ob3RoZXJJbmRpY2VzKSArIDI7CisgICAgICBpZiAoUGxhaW5PYmplY3RUeXBlOjpPcHRpb25zJlJvd01ham9yKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gbV9kaW1lbnNpb25zLkluZGV4T2ZSb3dNYWpvcihhcnJheTxJbmRleCwgTnVtRGltcz57e2ZpcnN0SW5kZXgsIHNlY29uZEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgICAgIHJldHVybiBtX2RhdGFbaW5kZXhdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBtX2RpbWVuc2lvbnMuSW5kZXhPZkNvbE1ham9yKGFycmF5PEluZGV4LCBOdW1EaW1zPnt7Zmlyc3RJbmRleCwgc2Vjb25kSW5kZXgsIG90aGVySW5kaWNlcy4uLn19KTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSkKKyAgICB7CisgICAgICAgaWYgKFBsYWluT2JqZWN0VHlwZTo6T3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMSArIGkwICogbV9kaW1lbnNpb25zWzFdOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTAgKyBpMSAqIG1fZGltZW5zaW9uc1swXTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMikKKyAgICB7CisgICAgICAgaWYgKFBsYWluT2JqZWN0VHlwZTo6T3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMiArIG1fZGltZW5zaW9uc1syXSAqIChpMSArIG1fZGltZW5zaW9uc1sxXSAqIGkwKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpMCArIG1fZGltZW5zaW9uc1swXSAqIChpMSArIG1fZGltZW5zaW9uc1sxXSAqIGkyKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMiwgSW5kZXggaTMpCisgICAgeworICAgICAgaWYgKFBsYWluT2JqZWN0VHlwZTo6T3B0aW9ucyZSb3dNYWpvcikgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkzICsgbV9kaW1lbnNpb25zWzNdICogKGkyICsgbV9kaW1lbnNpb25zWzJdICogKGkxICsgbV9kaW1lbnNpb25zWzFdICogaTApKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBJbmRleCBpbmRleCA9IGkwICsgbV9kaW1lbnNpb25zWzBdICogKGkxICsgbV9kaW1lbnNpb25zWzFdICogKGkyICsgbV9kaW1lbnNpb25zWzJdICogaTMpKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImIG9wZXJhdG9yKCkoSW5kZXggaTAsIEluZGV4IGkxLCBJbmRleCBpMiwgSW5kZXggaTMsIEluZGV4IGk0KQorICAgIHsKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMmUm93TWFqb3IpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaW5kZXggPSBpNCArIG1fZGltZW5zaW9uc1s0XSAqIChpMyArIG1fZGltZW5zaW9uc1szXSAqIChpMiArIG1fZGltZW5zaW9uc1syXSAqIChpMSArIG1fZGltZW5zaW9uc1sxXSAqIGkwKSkpOworICAgICAgICByZXR1cm4gbV9kYXRhW2luZGV4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEluZGV4IGluZGV4ID0gaTAgKyBtX2RpbWVuc2lvbnNbMF0gKiAoaTEgKyBtX2RpbWVuc2lvbnNbMV0gKiAoaTIgKyBtX2RpbWVuc2lvbnNbMl0gKiAoaTMgKyBtX2RpbWVuc2lvbnNbM10gKiBpNCkpKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YVtpbmRleF07CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNlbGYmIG9wZXJhdG9yPShjb25zdCBTZWxmJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFNlbGYsIGNvbnN0IFNlbGY+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgU2VsZiYgb3BlcmF0b3I9KGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxTZWxmLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHR5cGVuYW1lIE1ha2VQb2ludGVyXzxTY2FsYXI+OjpUeXBlIG1fZGF0YTsKKyAgICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NQVBfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JNZXRhLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvck1ldGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTU1NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JNZXRhLmgKQEAgLTAsMCArMSwyMTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NRVRBX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NRVRBX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8Ym9vbCBjb25kPiBzdHJ1Y3QgQ29uZCB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitjb25zdCBUMSYgY2hvb3NlKENvbmQ8dHJ1ZT4sIGNvbnN0IFQxJiBmaXJzdCwgY29uc3QgVDImKSB7CisgIHJldHVybiBmaXJzdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitjb25zdCBUMiYgY2hvb3NlKENvbmQ8ZmFsc2U+LCBjb25zdCBUMSYsIGNvbnN0IFQyJiBzZWNvbmQpIHsKKyAgcmV0dXJuIHNlY29uZDsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgWCwgdHlwZW5hbWUgWT4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK1QgZGl2dXAoY29uc3QgWCB4LCBjb25zdCBZIHkpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KCh4ICsgeSAtIDEpIC8geSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVCBkaXZ1cChjb25zdCBUIHgsIGNvbnN0IFQgeSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4oKHggKyB5IC0gMSkgLyB5KTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBuPiBzdHJ1Y3QgbWF4X25fMSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZSA9IG47Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IG1heF9uXzE8MD4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHNpemUgPSAxOworfTsKKworCisvLyBEZWZhdWx0IHBhY2tldCB0eXBlcwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFBhY2tldFR5cGUgOiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIHR5cGU7Cit9OworCisvLyBGb3IgQ1VEQSBwYWNrZXQgdHlwZXMgd2hlbiB1c2luZyBhIEdwdURldmljZQorI2lmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkgJiYgZGVmaW5lZChfX0NVREFDQ19fKSAmJiBkZWZpbmVkKEVJR0VOX0hBU19DVURBX0ZQMTYpCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFBhY2tldFR5cGU8aGFsZiwgR3B1RGV2aWNlPiB7CisgIHR5cGVkZWYgaGFsZjIgdHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBzaXplID0gMjsKKyAgZW51bSB7CisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAxLAorICAgIEhhc0FyZyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAxLAorICAgIEhhc01heCAgICA9IDEsCisgICAgSGFzQ29uaiAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwLAorICAgIEhhc0JsZW5kICA9IDAsCisKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc1NxcnQgICA9IDEsCisgICAgSGFzUnNxcnQgID0gMSwKKyAgICBIYXNFeHAgICAgPSAxLAorICAgIEhhc0xvZyAgICA9IDEsCisgICAgSGFzTG9nMXAgID0gMCwKKyAgICBIYXNMb2cxMCAgPSAwLAorICAgIEhhc1BvdyAgICA9IDEsCisgIH07Cit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9TWUNMKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBQYWNrZXRUeXBlPFQsIFN5Y2xEZXZpY2U+IHsKKyAgdHlwZWRlZiBUIHR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgc2l6ZSA9IDE7CisgIGVudW0geworICAgIEhhc0FkZCAgICA9IDAsCisgICAgSGFzU3ViICAgID0gMCwKKyAgICBIYXNNdWwgICAgPSAwLAorICAgIEhhc05lZ2F0ZSA9IDAsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBcmcgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc0NvbmogICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMCwKKyAgICBIYXNCbGVuZCAgPSAwCisgIH07Cit9OworI2VuZGlmCisKKworLy8gVHVwbGUgbWltaWNzIHN0ZDo6cGFpciBidXQgd29ya3Mgb24gZS5nLiBudmNjLgordGVtcGxhdGUgPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+IHN0cnVjdCBUdXBsZSB7CisgcHVibGljOgorICBVIGZpcnN0OworICBWIHNlY29uZDsKKworICB0eXBlZGVmIFUgZmlyc3RfdHlwZTsKKyAgdHlwZWRlZiBWIHNlY29uZF90eXBlOworCisgIEVJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFR1cGxlKCkgOiBmaXJzdCgpLCBzZWNvbmQoKSB7fQorCisgIEVJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFR1cGxlKGNvbnN0IFUmIGYsIGNvbnN0IFYmIHMpIDogZmlyc3QoZiksIHNlY29uZChzKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVHVwbGUmIG9wZXJhdG9yPSAoY29uc3QgVHVwbGUmIHJocykgeworICAgIGlmICgmcmhzID09IHRoaXMpIHJldHVybiAqdGhpczsKKyAgICBmaXJzdCA9IHJocy5maXJzdDsKKyAgICBzZWNvbmQgPSByaHMuc2Vjb25kOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCBzd2FwKFR1cGxlJiByaHMpIHsKKyAgICB1c2luZyBudW1leHQ6OnN3YXA7CisgICAgc3dhcChmaXJzdCwgcmhzLmZpcnN0KTsKKyAgICBzd2FwKHNlY29uZCwgcmhzLnNlY29uZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgorRUlHRU5fQ09OU1RFWFBSIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBUdXBsZTxVLCBWPiYgeCwgY29uc3QgVHVwbGU8VSwgVj4mIHkpIHsKKyAgcmV0dXJuICh4LmZpcnN0ID09IHkuZmlyc3QgJiYgeC5zZWNvbmQgPT0geS5zZWNvbmQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KK0VJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitib29sIG9wZXJhdG9yIT0oY29uc3QgVHVwbGU8VSwgVj4mIHgsIGNvbnN0IFR1cGxlPFUsIFY+JiB5KSB7CisgIHJldHVybiAhKHggPT0geSk7Cit9CisKKworLy8gQ2FuJ3QgdXNlIHN0ZDo6cGFpcnMgb24gY3VkYSBkZXZpY2VzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSWR4PiBzdHJ1Y3QgSW5kZXhQYWlyIHsKKyAgRUlHRU5fQ09OU1RFWFBSIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgSW5kZXhQYWlyKCkgOiBmaXJzdCgwKSwgc2Vjb25kKDApIHt9CisgIEVJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIEluZGV4UGFpcihJZHggZiwgSWR4IHMpIDogZmlyc3QoZiksIHNlY29uZChzKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgc2V0KEluZGV4UGFpcjxJZHg+IHZhbCkgeworICAgIGZpcnN0ID0gdmFsLmZpcnN0OworICAgIHNlY29uZCA9IHZhbC5zZWNvbmQ7CisgIH0KKworICBJZHggZmlyc3Q7CisgIElkeCBzZWNvbmQ7Cit9OworCisKKyNpZmRlZiBFSUdFTl9IQVNfU0ZJTkFFCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZSwgSW5kZXguLi4gSXM+CisgIEVJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGFycmF5PEluZGV4LCBzaXplb2YuLi4oSXMpPiBjdXN0b21JbmRpY2VzMkFycmF5KEluZGV4VHlwZSYgaWR4LCBudW1lcmljX2xpc3Q8SW5kZXgsIElzLi4uPikgeworICAgIHJldHVybiB7IGlkeFtJc10uLi4gfTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CisgIEVJR0VOX0NPTlNURVhQUiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGFycmF5PEluZGV4LCAwPiBjdXN0b21JbmRpY2VzMkFycmF5KEluZGV4VHlwZSYsIG51bWVyaWNfbGlzdDxJbmRleD4pIHsKKyAgICByZXR1cm4gYXJyYXk8SW5kZXgsIDA+KCk7CisgIH0KKworICAvKiogTWFrZSBhbiBhcnJheSAoZm9yIGluZGV4L2RpbWVuc2lvbnMpIG91dCBvZiBhIGN1c3RvbSBpbmRleCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgTnVtSW5kaWNlcywgdHlwZW5hbWUgSW5kZXhUeXBlPgorICBFSUdFTl9DT05TVEVYUFIgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4gY3VzdG9tSW5kaWNlczJBcnJheShJbmRleFR5cGUmIGlkeCkgeworICAgIHJldHVybiBjdXN0b21JbmRpY2VzMkFycmF5KGlkeCwgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxJbmRleCwgTnVtSW5kaWNlcz46OnR5cGV7fSk7CisgIH0KKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPgorICBzdHJ1Y3QgaXNfYmFzZV9vZgorICB7CisKKyAgICB0eXBlZGVmIGNoYXIgKCZ5ZXMpWzFdOworICAgIHR5cGVkZWYgY2hhciAoJm5vKVsyXTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBCQiwgdHlwZW5hbWUgREQ+CisgICAgc3RydWN0IEhvc3QKKyAgICB7CisgICAgICBvcGVyYXRvciBCQiooKSBjb25zdDsKKyAgICAgIG9wZXJhdG9yIEREKigpOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB5ZXMgY2hlY2soRCosIFQpOworICAgIHN0YXRpYyBubyBjaGVjayhCKiwgaW50KTsKKworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKGNoZWNrKEhvc3Q8QixEPigpLCBpbnQoKSkpID09IHNpemVvZih5ZXMpOworICB9OworCit9CisjZW5kaWYKKworCisKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfTUVUQV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvck1vcnBoaW5nLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvck1vcnBoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0ZjFlMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yTW9ycGhpbmcuaApAQCAtMCwwICsxLDg4OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX01PUlBISU5HX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NT1JQSElOR19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yUmVzaGFwaW5nCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciByZXNoYXBpbmcgY2xhc3MuCisgICoKKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE5ld0RpbWVuc2lvbnMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvclJlc2hhcGluZ09wPE5ld0RpbWVuc2lvbnMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBhcnJheV9zaXplPE5ld0RpbWVuc2lvbnM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE5ld0RpbWVuc2lvbnMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JSZXNoYXBpbmdPcDxOZXdEaW1lbnNpb25zLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJlc2hhcGluZ09wPE5ld0RpbWVuc2lvbnMsIFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTmV3RGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yUmVzaGFwaW5nT3A8TmV3RGltZW5zaW9ucywgWHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yUmVzaGFwaW5nT3A8TmV3RGltZW5zaW9ucywgWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JSZXNoYXBpbmdPcDxOZXdEaW1lbnNpb25zLCBYcHJUeXBlPiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKwordGVtcGxhdGU8dHlwZW5hbWUgTmV3RGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIFRlbnNvclJlc2hhcGluZ09wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yUmVzaGFwaW5nT3A8TmV3RGltZW5zaW9ucywgWHByVHlwZT4sIFdyaXRlQWNjZXNzb3JzPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUmVzaGFwaW5nT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yUmVzaGFwaW5nT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JSZXNoYXBpbmdPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclJlc2hhcGluZ09wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JSZXNoYXBpbmdPcChjb25zdCBYcHJUeXBlJiBleHByLCBjb25zdCBOZXdEaW1lbnNpb25zJiBkaW1zKQorICAgICAgOiBtX3hwcihleHByKSwgbV9kaW1zKGRpbXMpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IE5ld0RpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbXM7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JSZXNoYXBpbmdPcCYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yUmVzaGFwaW5nT3AmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yUmVzaGFwaW5nT3AsIGNvbnN0IFRlbnNvclJlc2hhcGluZ09wPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclJlc2hhcGluZ09wJiBvcGVyYXRvciA9IChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yUmVzaGFwaW5nT3AsIGNvbnN0IE90aGVyRGVyaXZlZD4gQXNzaWduOworICAgICAgQXNzaWduIGFzc2lnbigqdGhpcywgb3RoZXIpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT46OnJ1bihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7CisgICAgY29uc3QgTmV3RGltZW5zaW9ucyBtX2RpbXM7Cit9OworCisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdEaW1lbnNpb25zLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclJlc2hhcGluZ09wPE5ld0RpbWVuc2lvbnMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yUmVzaGFwaW5nT3A8TmV3RGltZW5zaW9ucywgQXJnVHlwZT4gWHByVHlwZTsKKyAgdHlwZWRlZiBOZXdEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OklzQWxpZ25lZCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlJhd0FjY2VzcworICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9kaW1lbnNpb25zKG9wLmRpbWVuc2lvbnMoKSkKKyAgeworICAgIC8vIFRoZSB0b3RhbCBzaXplIG9mIHRoZSByZXNoYXBlZCB0ZW5zb3IgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgc2l6ZQorICAgIC8vIG9mIHRoZSBpbnB1dCB0ZW5zb3IuCisgICAgZWlnZW5fYXNzZXJ0KGludGVybmFsOjphcnJheV9wcm9kKG1faW1wbC5kaW1lbnNpb25zKCkpID09IGludGVybmFsOjphcnJheV9wcm9kKG9wLmRpbWVuc2lvbnMoKSkpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoQ29lZmZSZXR1cm5UeXBlKiBkYXRhKSB7CisgICAgcmV0dXJuIG1faW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChkYXRhKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKGluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgcmV0dXJuIG1faW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFNjYWxhcio+KG1faW1wbC5kYXRhKCkpOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3QgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4mIGltcGwoKSBjb25zdCB7IHJldHVybiBtX2ltcGw7IH0KKworIHByb3RlY3RlZDoKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBOZXdEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKK307CisKKworLy8gRXZhbCBhcyBsdmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIE5ld0RpbWVuc2lvbnMsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KKyAgc3RydWN0IFRlbnNvckV2YWx1YXRvcjxUZW5zb3JSZXNoYXBpbmdPcDxOZXdEaW1lbnNpb25zLCBBcmdUeXBlPiwgRGV2aWNlPgorICA6IHB1YmxpYyBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVzaGFwaW5nT3A8TmV3RGltZW5zaW9ucywgQXJnVHlwZT4sIERldmljZT4KKworeworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZXNoYXBpbmdPcDxOZXdEaW1lbnNpb25zLCBBcmdUeXBlPiwgRGV2aWNlPiBCYXNlOworICB0eXBlZGVmIFRlbnNvclJlc2hhcGluZ09wPE5ld0RpbWVuc2lvbnMsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgTmV3RGltZW5zaW9ucyBEaW1lbnNpb25zOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBMYXlvdXQgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6TGF5b3V0LAorICAgIENvb3JkQWNjZXNzID0gZmFsc2UsICAvLyB0byBiZSBpbXBsZW1lbnRlZAorICAgIFJhd0FjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpSYXdBY2Nlc3MKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgOiBCYXNlKG9wLCBkZXZpY2UpCisgIHsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUmIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7CisgICAgcmV0dXJuIHRoaXMtPm1faW1wbC5jb2VmZlJlZihpbmRleCk7CisgIH0KKyAgdGVtcGxhdGUgPGludCBTdG9yZU1vZGU+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0UmV0dXJuVHlwZSYgeCkKKyAgeworICAgIHRoaXMtPm1faW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LCB4KTsKKyAgfQorfTsKKworCisvKiogXGNsYXNzIFRlbnNvclNsaWNpbmcKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHNsaWNpbmcgY2xhc3MuCisgICoKKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU2l6ZXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvclNsaWNpbmdPcDxTdGFydEluZGljZXMsIFNpemVzLCBYcHJUeXBlPiA+IDogcHVibGljIHRyYWl0czxYcHJUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHJhaXRzPFhwclR5cGU+IFhwclRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE5lc3RlZD46OnR5cGUgX05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gYXJyYXlfc2l6ZTxTdGFydEluZGljZXM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU2l6ZXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFNpemVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgWHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU2l6ZXMsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU2l6ZXMsIFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFNpemVzLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yU2xpY2luZ09wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU2l6ZXMsIFhwclR5cGU+ID4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclNsaWNpbmdPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JTbGljaW5nT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTbGljaW5nT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTbGljaW5nT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclNsaWNpbmdPcChjb25zdCBYcHJUeXBlJiBleHByLCBjb25zdCBTdGFydEluZGljZXMmIGluZGljZXMsIGNvbnN0IFNpemVzJiBzaXplcykKKyAgICAgIDogbV94cHIoZXhwciksIG1faW5kaWNlcyhpbmRpY2VzKSwgbV9zaXplcyhzaXplcykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFNpemVzJiBzaXplcygpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZXM7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU2xpY2luZ09wJiBvcGVyYXRvciA9IChjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgVGVuc29yQXNzaWduT3A8VGVuc29yU2xpY2luZ09wLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JTbGljaW5nT3AmIG9wZXJhdG9yID0gKGNvbnN0IFRlbnNvclNsaWNpbmdPcCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JTbGljaW5nT3AsIGNvbnN0IFRlbnNvclNsaWNpbmdPcD4gQXNzaWduOworICAgICAgQXNzaWduIGFzc2lnbigqdGhpcywgb3RoZXIpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT46OnJ1bihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBTdGFydEluZGljZXMgbV9pbmRpY2VzOworICAgIGNvbnN0IFNpemVzIG1fc2l6ZXM7Cit9OworCisKKy8vIEZpeG1lOiBmaWd1cmUgb3V0IHRoZSBleGFjdCB0aHJlc2hvbGQKK25hbWVzcGFjZSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERldmljZT4gc3RydWN0IE1lbWNweVRyaWdnZXJGb3JTbGljaW5nIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgTWVtY3B5VHJpZ2dlckZvclNsaWNpbmcoY29uc3QgRGV2aWNlJiBkZXZpY2UpIDogdGhyZXNob2xkXygyICogZGV2aWNlLm51bVRocmVhZHMoKSkgeyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3IgKCkoSW5kZXggdmFsKSBjb25zdCB7IHJldHVybiB2YWwgPiB0aHJlc2hvbGRfOyB9CisKKyBwcml2YXRlOgorICBJbmRleCB0aHJlc2hvbGRfOworfTsKKworLy8gSXQgaXMgdmVyeSBleHBlbnNpdmUgdG8gc3RhcnQgdGhlIG1lbWNweSBrZXJuZWwgb24gR1BVOiB3ZSB0aGVyZWZvcmUgb25seQorLy8gdXNlIGl0IGZvciBsYXJnZSBjb3BpZXMuCisjaWZkZWYgRUlHRU5fVVNFX0dQVQordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4PiBzdHJ1Y3QgTWVtY3B5VHJpZ2dlckZvclNsaWNpbmc8SW5kZXgsIEdwdURldmljZT4gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgTWVtY3B5VHJpZ2dlckZvclNsaWNpbmcoY29uc3QgR3B1RGV2aWNlJikgeyB9CisgIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3IgKCkoSW5kZXggdmFsKSBjb25zdCB7IHJldHVybiB2YWwgPiA0KjEwMjQqMTAyNDsgfQorfTsKKyNlbmRpZgorfQorCisvLyBFdmFsIGFzIHJ2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgU3RhcnRJbmRpY2VzLCB0eXBlbmFtZSBTaXplcywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgQXJnVHlwZT4sIERldmljZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgQXJnVHlwZT4gWHByVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8U2l6ZXM+Ojp2YWx1ZTsKKworICBlbnVtIHsKKyAgICAvLyBBbGlnbm1lbnQgY2FuJ3QgYmUgZ3VhcmFudGVlZCBhdCBjb21waWxlIHRpbWUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUKKyAgICAvLyBzbGljZSBvZmZzZXRzIGFuZCBzaXplcy4KKyAgICBJc0FsaWduZWQgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQqL2ZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX2RldmljZShkZXZpY2UpLCBtX2RpbWVuc2lvbnMob3Auc2l6ZXMoKSksIG1fb2Zmc2V0cyhvcC5zdGFydEluZGljZXMoKSkKKyAgeworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxEaW1lbnNpb25zPjo6dmFsdWU7ICsraSkgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faW1wbC5kaW1lbnNpb25zKClbaV0gPj0gb3Auc2l6ZXMoKVtpXSArIG9wLnN0YXJ0SW5kaWNlcygpW2ldKTsKKyAgICB9CisKKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgY29uc3QgU2l6ZXMmIG91dHB1dF9kaW1zID0gb3Auc2l6ZXMoKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX2lucHV0U3RyaWRlc1swXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2ktMV0gKiBpbnB1dF9kaW1zW2ktMV07CisgICAgICB9CisKKyAgICAgLy8gRG9uJ3QgaW5pdGlhbGl6ZSBtX2Zhc3RPdXRwdXRTdHJpZGVzWzBdIHNpbmNlIGl0IHdvbid0IGV2ZXIgYmUgYWNjZXNzZWQuCisgICAgICBtX291dHB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2ktMV0gKiBvdXRwdXRfZGltc1tpLTFdOworICAgICAgICBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fb3V0cHV0U3RyaWRlc1tpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMtMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICB9CisKKyAgICAgLy8gRG9uJ3QgaW5pdGlhbGl6ZSBtX2Zhc3RPdXRwdXRTdHJpZGVzW051bURpbXMtMV0gc2luY2UgaXQgd29uJ3QgZXZlciBiZSBhY2Nlc3NlZC4KKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2krMV0gKiBvdXRwdXRfZGltc1tpKzFdOworICAgICAgICBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fb3V0cHV0U3RyaWRlc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiBTaXplcyBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKENvZWZmUmV0dXJuVHlwZSogZGF0YSkgeworICAgIG1faW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICBpZiAoIU51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PFNjYWxhcj46OnR5cGU+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24gJiYgZGF0YSAmJiBtX2ltcGwuZGF0YSgpKSB7CisgICAgICBJbmRleCBjb250aWd1b3VzX3ZhbHVlcyA9IDE7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgICAgY29udGlndW91c192YWx1ZXMgKj0gZGltZW5zaW9ucygpW2ldOworICAgICAgICAgIGlmIChkaW1lbnNpb25zKClbaV0gIT0gbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gTnVtRGltcy0xOyBpID49IDA7IC0taSkgeworICAgICAgICAgIGNvbnRpZ3VvdXNfdmFsdWVzICo9IGRpbWVuc2lvbnMoKVtpXTsKKyAgICAgICAgICBpZiAoZGltZW5zaW9ucygpW2ldICE9IG1faW1wbC5kaW1lbnNpb25zKClbaV0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gVXNlIG1lbWNweSBpZiBpdCdzIGdvaW5nIHRvIGJlIGZhc3RlciB0aGFuIHVzaW5nIHRoZSByZWd1bGFyIGV2YWx1YXRpb24uCisgICAgICBjb25zdCBNZW1jcHlUcmlnZ2VyRm9yU2xpY2luZzxJbmRleCwgRGV2aWNlPiB0cmlnZ2VyKG1fZGV2aWNlKTsKKyAgICAgIGlmICh0cmlnZ2VyKGNvbnRpZ3VvdXNfdmFsdWVzKSkgeworICAgICAgICBTY2FsYXIqIHNyYyA9IChTY2FsYXIqKW1faW1wbC5kYXRhKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWw6OmFycmF5X3Byb2QoZGltZW5zaW9ucygpKTsgaSArPSBjb250aWd1b3VzX3ZhbHVlcykgeworICAgICAgICAgIEluZGV4IG9mZnNldCA9IHNyY0NvZWZmKGkpOworICAgICAgICAgIG1fZGV2aWNlLm1lbWNweSgodm9pZCopKGRhdGEraSksIHNyYytvZmZzZXQsIGNvbnRpZ3VvdXNfdmFsdWVzICogc2l6ZW9mKFNjYWxhcikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKHNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBjb25zdCBpbnQgcGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgocGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K3BhY2tldFNpemUtMSA8IGludGVybmFsOjphcnJheV9wcm9kKGRpbWVuc2lvbnMoKSkpOworCisgICAgSW5kZXggaW5wdXRJbmRpY2VzW10gPSB7MCwgMH07CisgICAgSW5kZXggaW5kaWNlc1tdID0ge2luZGV4LCBpbmRleCArIHBhY2tldFNpemUgLSAxfTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGluZGljZXNbMF0gLyBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBjb25zdCBJbmRleCBpZHgxID0gaW5kaWNlc1sxXSAvIG1fZmFzdE91dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1swXSArPSAoaWR4MCArIG1fb2Zmc2V0c1tpXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRpY2VzWzFdICs9IChpZHgxICsgbV9vZmZzZXRzW2ldKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzBdIC09IGlkeDAgKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMV0gLT0gaWR4MSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kaWNlc1swXSArPSAoaW5kaWNlc1swXSArIG1fb2Zmc2V0c1swXSk7CisgICAgICBpbnB1dEluZGljZXNbMV0gKz0gKGluZGljZXNbMV0gKyBtX29mZnNldHNbMF0pOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGluZGljZXNbMF0gLyBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBjb25zdCBJbmRleCBpZHgxID0gaW5kaWNlc1sxXSAvIG1fZmFzdE91dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1swXSArPSAoaWR4MCArIG1fb2Zmc2V0c1tpXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRpY2VzWzFdICs9IChpZHgxICsgbV9vZmZzZXRzW2ldKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzBdIC09IGlkeDAgKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMV0gLT0gaWR4MSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kaWNlc1swXSArPSAoaW5kaWNlc1swXSArIG1fb2Zmc2V0c1tOdW1EaW1zLTFdKTsKKyAgICAgIGlucHV0SW5kaWNlc1sxXSArPSAoaW5kaWNlc1sxXSArIG1fb2Zmc2V0c1tOdW1EaW1zLTFdKTsKKyAgICB9CisgICAgaWYgKGlucHV0SW5kaWNlc1sxXSAtIGlucHV0SW5kaWNlc1swXSA9PSBwYWNrZXRTaXplIC0gMSkgeworICAgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kaWNlc1swXSk7CisgICAgICByZXR1cm4gcnNsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1twYWNrZXRTaXplXTsKKyAgICAgIHZhbHVlc1swXSA9IG1faW1wbC5jb2VmZihpbnB1dEluZGljZXNbMF0pOworICAgICAgdmFsdWVzW3BhY2tldFNpemUtMV0gPSBtX2ltcGwuY29lZmYoaW5wdXRJbmRpY2VzWzFdKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFja2V0U2l6ZS0xOyArK2kpIHsKKyAgICAgICAgdmFsdWVzW2ldID0gY29lZmYoaW5kZXgraSk7CisgICAgICB9CisgICAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICAgIHJldHVybiByc2x0OworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArIFRlbnNvck9wQ29zdCgwLCAwLCBOdW1EaW1zKTsKKyAgfQorCisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIqIGRhdGEoKSBjb25zdCB7CisgICAgU2NhbGFyKiByZXN1bHQgPSBtX2ltcGwuZGF0YSgpOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgIEluZGV4IG9mZnNldCA9IDA7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgICAgaWYgKG1fZGltZW5zaW9uc1tpXSAhPSBtX2ltcGwuZGltZW5zaW9ucygpW2ldKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gbV9vZmZzZXRzW2ldICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgICAgICBmb3IgKGludCBqID0gaSsxOyBqIDwgTnVtRGltczsgKytqKSB7CisgICAgICAgICAgICAgIGlmIChtX2RpbWVuc2lvbnNbal0gPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgb2Zmc2V0ICs9IG1fb2Zmc2V0c1tqXSAqIG1faW5wdXRTdHJpZGVzW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgaWYgKG1fZGltZW5zaW9uc1tpXSAhPSBtX2ltcGwuZGltZW5zaW9ucygpW2ldKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gbV9vZmZzZXRzW2ldICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgICAgICBmb3IgKGludCBqID0gaS0xOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgICBpZiAobV9kaW1lbnNpb25zW2pdID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG9mZnNldCArPSBtX29mZnNldHNbal0gKiBtX2lucHV0U3RyaWRlc1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdCArIG9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworIHByb3RlY3RlZDoKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBzcmNDb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEluZGV4IGlucHV0SW5kZXggPSAwOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fZmFzdE91dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kZXggKz0gKGlkeCArIG1fb2Zmc2V0c1tpXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgaW5wdXRJbmRleCArPSAoaW5kZXggKyBtX29mZnNldHNbMF0pOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGV4ICs9IChpZHggKyBtX29mZnNldHNbaV0pICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kZXggKz0gKGluZGV4ICsgbV9vZmZzZXRzW051bURpbXMtMV0pOworICAgIH0KKyAgICByZXR1cm4gaW5wdXRJbmRleDsKKyAgfQorCisgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX291dHB1dFN0cmlkZXM7CisgIGFycmF5PGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiwgTnVtRGltcz4gbV9mYXN0T3V0cHV0U3RyaWRlczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGVzOworICBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBtX2ltcGw7CisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7CisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBjb25zdCBTdGFydEluZGljZXMgbV9vZmZzZXRzOworfTsKKworCisvLyBFdmFsIGFzIGx2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgU3RhcnRJbmRpY2VzLCB0eXBlbmFtZSBTaXplcywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgQXJnVHlwZT4sIERldmljZT4KKyAgOiBwdWJsaWMgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNsaWNpbmdPcDxTdGFydEluZGljZXMsIFNpemVzLCBBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgQXJnVHlwZT4sIERldmljZT4gQmFzZTsKKyAgdHlwZWRlZiBUZW5zb3JTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTaXplcywgQXJnVHlwZT4gWHByVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8U2l6ZXM+Ojp2YWx1ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQqL2ZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgIDogQmFzZShvcCwgZGV2aWNlKQorICAgIHsgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHR5cGVkZWYgU2l6ZXMgRGltZW5zaW9uczsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICByZXR1cm4gdGhpcy0+bV9pbXBsLmNvZWZmUmVmKHRoaXMtPnNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IFN0b3JlTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRSZXR1cm5UeXBlJiB4KQorICB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIEluZGV4IGlucHV0SW5kaWNlc1tdID0gezAsIDB9OworICAgIEluZGV4IGluZGljZXNbXSA9IHtpbmRleCwgaW5kZXggKyBwYWNrZXRTaXplIC0gMX07CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDAgPSBpbmRpY2VzWzBdIC8gdGhpcy0+bV9mYXN0T3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MSA9IGluZGljZXNbMV0gLyB0aGlzLT5tX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMF0gKz0gKGlkeDAgKyB0aGlzLT5tX29mZnNldHNbaV0pICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1sxXSArPSAoaWR4MSArIHRoaXMtPm1fb2Zmc2V0c1tpXSkgKiB0aGlzLT5tX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kaWNlc1swXSAtPSBpZHgwICogdGhpcy0+bV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzFdIC09IGlkeDEgKiB0aGlzLT5tX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpbnB1dEluZGljZXNbMF0gKz0gKGluZGljZXNbMF0gKyB0aGlzLT5tX29mZnNldHNbMF0pOworICAgICAgaW5wdXRJbmRpY2VzWzFdICs9IChpbmRpY2VzWzFdICsgdGhpcy0+bV9vZmZzZXRzWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zIC0gMTsgKytpKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDAgPSBpbmRpY2VzWzBdIC8gdGhpcy0+bV9mYXN0T3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MSA9IGluZGljZXNbMV0gLyB0aGlzLT5tX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMF0gKz0gKGlkeDAgKyB0aGlzLT5tX29mZnNldHNbaV0pICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1sxXSArPSAoaWR4MSArIHRoaXMtPm1fb2Zmc2V0c1tpXSkgKiB0aGlzLT5tX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kaWNlc1swXSAtPSBpZHgwICogdGhpcy0+bV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzFdIC09IGlkeDEgKiB0aGlzLT5tX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpbnB1dEluZGljZXNbMF0gKz0gKGluZGljZXNbMF0gKyB0aGlzLT5tX29mZnNldHNbTnVtRGltcy0xXSk7CisgICAgICBpbnB1dEluZGljZXNbMV0gKz0gKGluZGljZXNbMV0gKyB0aGlzLT5tX29mZnNldHNbTnVtRGltcy0xXSk7CisgICAgfQorICAgIGlmIChpbnB1dEluZGljZXNbMV0gLSBpbnB1dEluZGljZXNbMF0gPT0gcGFja2V0U2l6ZSAtIDEpIHsKKyAgICAgIHRoaXMtPm1faW1wbC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGlucHV0SW5kaWNlc1swXSwgeCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgRUlHRU5fQUxJR05fTUFYIENvZWZmUmV0dXJuVHlwZSB2YWx1ZXNbcGFja2V0U2l6ZV07CisgICAgICBpbnRlcm5hbDo6cHN0b3JlPENvZWZmUmV0dXJuVHlwZSwgUGFja2V0UmV0dXJuVHlwZT4odmFsdWVzLCB4KTsKKyAgICAgIHRoaXMtPm1faW1wbC5jb2VmZlJlZihpbnB1dEluZGljZXNbMF0pID0gdmFsdWVzWzBdOworICAgICAgdGhpcy0+bV9pbXBsLmNvZWZmUmVmKGlucHV0SW5kaWNlc1sxXSkgPSB2YWx1ZXNbcGFja2V0U2l6ZS0xXTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFja2V0U2l6ZS0xOyArK2kpIHsKKyAgICAgICAgdGhpcy0+Y29lZmZSZWYoaW5kZXgraSkgPSB2YWx1ZXNbaV07CisgICAgICB9CisgICAgfQorICB9Cit9OworCisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU3RvcEluZGljZXMsIHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBhcnJheV9zaXplPFN0YXJ0SW5kaWNlcz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3RhcnRJbmRpY2VzLCB0eXBlbmFtZSBTdG9wSW5kaWNlcywgdHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTdG9wSW5kaWNlcywgU3RyaWRlcywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFN0b3BJbmRpY2VzLCB0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcDxTdGFydEluZGljZXMsIFN0b3BJbmRpY2VzLCBTdHJpZGVzLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcDxTdGFydEluZGljZXMsIFN0b3BJbmRpY2VzLCBTdHJpZGVzLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKwordGVtcGxhdGU8dHlwZW5hbWUgU3RhcnRJbmRpY2VzLCB0eXBlbmFtZSBTdG9wSW5kaWNlcywgdHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgWHByVHlwZT4KK2NsYXNzIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yU3RyaWRpbmdTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTdG9wSW5kaWNlcywgU3RyaWRlcywgWHByVHlwZT4gPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VGVuc29yU3RyaWRpbmdTbGljaW5nT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wKAorICAgIGNvbnN0IFhwclR5cGUmIGV4cHIsIGNvbnN0IFN0YXJ0SW5kaWNlcyYgc3RhcnRJbmRpY2VzLAorICAgIGNvbnN0IFN0b3BJbmRpY2VzJiBzdG9wSW5kaWNlcywgY29uc3QgU3RyaWRlcyYgc3RyaWRlcykKKyAgICAgIDogbV94cHIoZXhwciksIG1fc3RhcnRJbmRpY2VzKHN0YXJ0SW5kaWNlcyksIG1fc3RvcEluZGljZXMoc3RvcEluZGljZXMpLAorICAgICAgICBtX3N0cmlkZXMoc3RyaWRlcykge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU3RhcnRJbmRpY2VzJiBzdGFydEluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0SW5kaWNlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU3RhcnRJbmRpY2VzJiBzdG9wSW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIG1fc3RvcEluZGljZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFN0YXJ0SW5kaWNlcyYgc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaWRlczsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclN0cmlkaW5nU2xpY2luZ09wJiBvcGVyYXRvciA9IChjb25zdCBUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcCwgY29uc3QgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oCisgICAgICAgICAgYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU3RyaWRpbmdTbGljaW5nT3AmIG9wZXJhdG9yID0gKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JTdHJpZGluZ1NsaWNpbmdPcCwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKAorICAgICAgICAgIGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBTdGFydEluZGljZXMgbV9zdGFydEluZGljZXM7CisgICAgY29uc3QgU3RvcEluZGljZXMgbV9zdG9wSW5kaWNlczsKKyAgICBjb25zdCBTdHJpZGVzIG1fc3RyaWRlczsKK307CisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdGFydEluZGljZXMsIHR5cGVuYW1lIFN0b3BJbmRpY2VzLCB0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTdG9wSW5kaWNlcywgU3RyaWRlcywgQXJnVHlwZT4gWHByVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8U3RyaWRlcz46OnZhbHVlOworCisgIGVudW0geworICAgIC8vIEFsaWdubWVudCBjYW4ndCBiZSBndWFyYW50ZWVkIGF0IGNvbXBpbGUgdGltZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZQorICAgIC8vIHNsaWNlIG9mZnNldHMgYW5kIHNpemVzLgorICAgIElzQWxpZ25lZCA9IGZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlLAorICAgIEJsb2NrQWNjZXNzID0gZmFsc2UsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKSwgbV9kZXZpY2UoZGV2aWNlKSwgbV9zdHJpZGVzKG9wLnN0cmlkZXMoKSkKKyAgeworICAgIC8vIEhhbmRsZSBkZWdlbmVyYXRlIGludGVydmFscyBieSBncmFjZWZ1bGx5IGNsYW1waW5nIGFuZCBhbGxvd2luZyBtX2RpbWVuc2lvbnMgdG8gYmUgemVybworICAgIERTaXplczxJbmRleCxOdW1EaW1zPiBzdGFydEluZGljZXNDbGFtcGVkLCBzdG9wSW5kaWNlc0NsYW1wZWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxEaW1lbnNpb25zPjo6dmFsdWU7ICsraSkgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fc3RyaWRlc1tpXSAhPSAwICYmICIwIHN0cmlkZSBpcyBpbnZhbGlkIik7CisgICAgICBpZihtX3N0cmlkZXNbaV0+MCl7CisgICAgICAgIHN0YXJ0SW5kaWNlc0NsYW1wZWRbaV0gPSBjbGFtcChvcC5zdGFydEluZGljZXMoKVtpXSwgMCwgbV9pbXBsLmRpbWVuc2lvbnMoKVtpXSk7CisgICAgICAgIHN0b3BJbmRpY2VzQ2xhbXBlZFtpXSA9IGNsYW1wKG9wLnN0b3BJbmRpY2VzKClbaV0sIDAsIG1faW1wbC5kaW1lbnNpb25zKClbaV0pOworICAgICAgfWVsc2V7CisgICAgICAgIC8qIGltcGxpZXMgbV9zdHJpZGVzW2ldPDAgYnkgYXNzZXJ0ICovCisgICAgICAgIHN0YXJ0SW5kaWNlc0NsYW1wZWRbaV0gPSBjbGFtcChvcC5zdGFydEluZGljZXMoKVtpXSwgLTEsIG1faW1wbC5kaW1lbnNpb25zKClbaV0gLSAxKTsKKyAgICAgICAgc3RvcEluZGljZXNDbGFtcGVkW2ldID0gY2xhbXAob3Auc3RvcEluZGljZXMoKVtpXSwgLTEsIG1faW1wbC5kaW1lbnNpb25zKClbaV0gLSAxKTsKKyAgICAgIH0KKyAgICAgIG1fc3RhcnRJbmRpY2VzW2ldID0gc3RhcnRJbmRpY2VzQ2xhbXBlZFtpXTsKKyAgICB9CisKKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisKKyAgICAvLyBjaGVjayBmb3IgZGVnZW5lcmF0ZSBpbnRlcnZhbHMgYW5kIGNvbXB1dGUgb3V0cHV0IHRlbnNvciBzaGFwZQorICAgIGJvb2wgZGVnZW5lcmF0ZSA9IGZhbHNlOzsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgaSsrKXsKKyAgICAgIEluZGV4IGludGVydmFsID0gc3RvcEluZGljZXNDbGFtcGVkW2ldIC0gc3RhcnRJbmRpY2VzQ2xhbXBlZFtpXTsKKyAgICAgIGlmKGludGVydmFsID09IDAgfHwgKChpbnRlcnZhbDwwKSAhPSAobV9zdHJpZGVzW2ldPDApKSl7CisgICAgICAgIG1fZGltZW5zaW9uc1tpXSA9IDA7CisgICAgICAgIGRlZ2VuZXJhdGUgPSB0cnVlOworICAgICAgfWVsc2V7CisgICAgICAgIG1fZGltZW5zaW9uc1tpXSA9IGludGVydmFsIC8gbV9zdHJpZGVzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGludGVydmFsICUgbV9zdHJpZGVzW2ldICE9IDAgPyAxIDogMCk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2RpbWVuc2lvbnNbaV0gPj0gMCk7CisgICAgICB9CisgICAgfQorICAgIFN0cmlkZXMgb3V0cHV0X2RpbXMgPSBtX2RpbWVuc2lvbnM7CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX2lucHV0U3RyaWRlc1swXSA9IG1fc3RyaWRlc1swXTsKKyAgICAgIG1fb2Zmc2V0c1swXSA9IHN0YXJ0SW5kaWNlc0NsYW1wZWRbMF07CisgICAgICBJbmRleCBwcmV2aW91c0RpbVByb2R1Y3QgPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgcHJldmlvdXNEaW1Qcm9kdWN0ICo9IGlucHV0X2RpbXNbaS0xXTsKKyAgICAgICAgbV9pbnB1dFN0cmlkZXNbaV0gPSBwcmV2aW91c0RpbVByb2R1Y3QgKiBtX3N0cmlkZXNbaV07CisgICAgICAgIG1fb2Zmc2V0c1tpXSA9IHN0YXJ0SW5kaWNlc0NsYW1wZWRbaV0gKiBwcmV2aW91c0RpbVByb2R1Y3Q7CisgICAgICB9CisKKyAgICAgIC8vIERvbid0IGluaXRpYWxpemUgbV9mYXN0T3V0cHV0U3RyaWRlc1swXSBzaW5jZSBpdCB3b24ndCBldmVyIGJlIGFjY2Vzc2VkLgorICAgICAgbV9vdXRwdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpLTFdICogb3V0cHV0X2RpbXNbaS0xXTsKKyAgICAgICAgLy8gTk9URTogaWYgdGVuc29yIGlzIGRlZ2VuZXJhdGUsIHdlIHNlbmQgMSB0byBwcmV2ZW50IFRlbnNvckludERpdmlzb3IgY29uc3RydWN0b3IgY3Jhc2gKKyAgICAgICAgbV9mYXN0T3V0cHV0U3RyaWRlc1tpXSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihkZWdlbmVyYXRlID8gMSA6IG1fb3V0cHV0U3RyaWRlc1tpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMtMV0gPSBtX3N0cmlkZXNbTnVtRGltcy0xXTsKKyAgICAgIG1fb2Zmc2V0c1tOdW1EaW1zLTFdID0gc3RhcnRJbmRpY2VzQ2xhbXBlZFtOdW1EaW1zLTFdOworICAgICAgSW5kZXggcHJldmlvdXNEaW1Qcm9kdWN0ID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgcHJldmlvdXNEaW1Qcm9kdWN0ICo9IGlucHV0X2RpbXNbaSsxXTsKKyAgICAgICAgbV9pbnB1dFN0cmlkZXNbaV0gPSBwcmV2aW91c0RpbVByb2R1Y3QgKiBtX3N0cmlkZXNbaV07CisgICAgICAgIG1fb2Zmc2V0c1tpXSA9IHN0YXJ0SW5kaWNlc0NsYW1wZWRbaV0gKiBwcmV2aW91c0RpbVByb2R1Y3Q7CisgICAgICB9CisKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2krMV0gKiBvdXRwdXRfZGltc1tpKzFdOworICAgICAgICAvLyBOT1RFOiBpZiB0ZW5zb3IgaXMgZGVnZW5lcmF0ZSwgd2Ugc2VuZCAxIHRvIHByZXZlbnQgVGVuc29ySW50RGl2aXNvciBjb25zdHJ1Y3RvciBjcmFzaAorICAgICAgICBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KGRlZ2VuZXJhdGUgPyAxIDogbV9vdXRwdXRTdHJpZGVzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9ibG9ja190b3RhbF9zaXplX21heCA9IG51bWV4dDo6bWF4aShzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UubGFzdExldmVsQ2FjaGVTaXplKCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNjYWxhcikpOworICB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8U2NhbGFyPjo6dHlwZSBTY2FsYXJOb25Db25zdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHR5cGVkZWYgU3RyaWRlcyBEaW1lbnNpb25zOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKENvZWZmUmV0dXJuVHlwZSopIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKHNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgcmV0dXJuIG1faW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKyBUZW5zb3JPcENvc3QoMCwgMCwgTnVtRGltcyk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHNyY0NvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fZmFzdE91dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kZXggKz0gaWR4ICogbV9pbnB1dFN0cmlkZXNbaV0gKyBtX29mZnNldHNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX2Zhc3RPdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2ldICsgbV9vZmZzZXRzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dEluZGV4OworICB9CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY2xhbXAoSW5kZXggdmFsdWUsIEluZGV4IG1pbiwgSW5kZXggbWF4KSB7CisgICAgcmV0dXJuIG51bWV4dDo6bWF4aShtaW4sIG51bWV4dDo6bWluaShtYXgsdmFsdWUpKTsKKyAgfQorCisgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX291dHB1dFN0cmlkZXM7CisgIGFycmF5PGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiwgTnVtRGltcz4gbV9mYXN0T3V0cHV0U3RyaWRlczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGVzOworICBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBtX2ltcGw7CisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7CisgIERTaXplczxJbmRleCwgTnVtRGltcz4gbV9zdGFydEluZGljZXM7IC8vIGNsYW1wZWQgc3RhcnRJbmRpY2VzCisgIERTaXplczxJbmRleCwgTnVtRGltcz4gbV9kaW1lbnNpb25zOworICBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IG1fb2Zmc2V0czsgLy8gb2Zmc2V0IGluIGEgZmxhdHRlbmVkIHNoYXBlCisgIGNvbnN0IFN0cmlkZXMgbV9zdHJpZGVzOworICBzdGQ6OnNpemVfdCBtX2Jsb2NrX3RvdGFsX3NpemVfbWF4OworfTsKKworLy8gRXZhbCBhcyBsdmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0SW5kaWNlcywgdHlwZW5hbWUgU3RvcEluZGljZXMsIHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8VGVuc29yU3RyaWRpbmdTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTdG9wSW5kaWNlcywgU3RyaWRlcywgQXJnVHlwZT4sIERldmljZT4KKyAgOiBwdWJsaWMgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclN0cmlkaW5nU2xpY2luZ09wPFN0YXJ0SW5kaWNlcywgU3RvcEluZGljZXMsIFN0cmlkZXMsIEFyZ1R5cGU+LCBEZXZpY2U+IEJhc2U7CisgIHR5cGVkZWYgVGVuc29yU3RyaWRpbmdTbGljaW5nT3A8U3RhcnRJbmRpY2VzLCBTdG9wSW5kaWNlcywgU3RyaWRlcywgQXJnVHlwZT4gWHByVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8U3RyaWRlcz46OnZhbHVlOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IGZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlLAorICAgIEJsb2NrQWNjZXNzID0gZmFsc2UsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpDb29yZEFjY2VzcywKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICA6IEJhc2Uob3AsIGRldmljZSkKKyAgICB7IH0KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxTY2FsYXI+Ojp0eXBlIFNjYWxhck5vbkNvbnN0OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiBTdHJpZGVzIERpbWVuc2lvbnM7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUmIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICB7CisgICAgcmV0dXJuIHRoaXMtPm1faW1wbC5jb2VmZlJlZih0aGlzLT5zcmNDb2VmZihpbmRleCkpOworICB9Cit9OworCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9NT1JQSElOR19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclBhZGRpbmcuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUGFkZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2JjZjEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclBhZGRpbmcuaApAQCAtMCwwICsxLDM5NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1BBRERJTkdfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1BBRERJTkdfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvclBhZGRpbmcKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHBhZGRpbmcgY2xhc3MuCisgICogQXQgdGhlIG1vbWVudCBvbmx5IHBhZGRpbmcgd2l0aCBhIGNvbnN0YW50IHZhbHVlIGlzIHN1cHBvcnRlZC4KKyAgKgorICAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFBhZGRpbmdEaW1lbnNpb25zLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JQYWRkaW5nT3A8UGFkZGluZ0RpbWVuc2lvbnMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWRkaW5nRGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvclBhZGRpbmdPcDxQYWRkaW5nRGltZW5zaW9ucywgWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JQYWRkaW5nT3A8UGFkZGluZ0RpbWVuc2lvbnMsIFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGFkZGluZ0RpbWVuc2lvbnMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvclBhZGRpbmdPcDxQYWRkaW5nRGltZW5zaW9ucywgWHByVHlwZT4sIDEsIHR5cGVuYW1lIGV2YWw8VGVuc29yUGFkZGluZ09wPFBhZGRpbmdEaW1lbnNpb25zLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclBhZGRpbmdPcDxQYWRkaW5nRGltZW5zaW9ucywgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFBhZGRpbmdEaW1lbnNpb25zLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yUGFkZGluZ09wIDogcHVibGljIFRlbnNvckJhc2U8VGVuc29yUGFkZGluZ09wPFBhZGRpbmdEaW1lbnNpb25zLCBYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JQYWRkaW5nT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yUGFkZGluZ09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUGFkZGluZ09wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUGFkZGluZ09wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JQYWRkaW5nT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgUGFkZGluZ0RpbWVuc2lvbnMmIHBhZGRpbmdfZGltcywgY29uc3QgU2NhbGFyIHBhZGRpbmdfdmFsdWUpCisgICAgICA6IG1feHByKGV4cHIpLCBtX3BhZGRpbmdfZGltcyhwYWRkaW5nX2RpbXMpLCBtX3BhZGRpbmdfdmFsdWUocGFkZGluZ192YWx1ZSkge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUGFkZGluZ0RpbWVuc2lvbnMmIHBhZGRpbmcoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfZGltczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2NhbGFyIHBhZGRpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdmFsdWU7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFBhZGRpbmdEaW1lbnNpb25zIG1fcGFkZGluZ19kaW1zOworICAgIGNvbnN0IFNjYWxhciBtX3BhZGRpbmdfdmFsdWU7Cit9OworCisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWRkaW5nRGltZW5zaW9ucywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JQYWRkaW5nT3A8UGFkZGluZ0RpbWVuc2lvbnMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yUGFkZGluZ09wPFBhZGRpbmdEaW1lbnNpb25zLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxQYWRkaW5nRGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSB0cnVlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IHRydWUsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSksIG1fcGFkZGluZyhvcC5wYWRkaW5nKCkpLCBtX3BhZGRpbmdWYWx1ZShvcC5wYWRkaW5nX3ZhbHVlKCkpCisgIHsKKyAgICAvLyBUaGUgcGFkZGluZyBvcCBkb2Vzbid0IGNoYW5nZSB0aGUgcmFuayBvZiB0aGUgdGVuc29yLiBEaXJlY3RseSBwYWRkaW5nIGEgc2NhbGFyIHdvdWxkIGxlYWQKKyAgICAvLyB0byBhIHZlY3Rvciwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlLiBJbnN0ZWFkIG9uZSBzaG91bGQgcmVzaGFwZSB0aGUgc2NhbGFyIGludG8gYSB2ZWN0b3IKKyAgICAvLyBvZiAxIGVsZW1lbnQgZmlyc3QgYW5kIHRoZW4gcGFkLgorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE51bURpbXMgPiAwKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIC8vIENvbXB1dGUgZGltZW5zaW9ucworICAgIG1fZGltZW5zaW9ucyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgIG1fZGltZW5zaW9uc1tpXSArPSBtX3BhZGRpbmdbaV0uZmlyc3QgKyBtX3BhZGRpbmdbaV0uc2Vjb25kOworICAgIH0KKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9pbnB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgbV9vdXRwdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICAgIG1faW5wdXRTdHJpZGVzW2ldID0gbV9pbnB1dFN0cmlkZXNbaS0xXSAqIGlucHV0X2RpbXNbaS0xXTsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2ktMV0gKiBtX2RpbWVuc2lvbnNbaS0xXTsKKyAgICAgIH0KKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zXSA9IG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdICogbV9kaW1lbnNpb25zW051bURpbXMtMV07CisgICAgfSBlbHNlIHsKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMgLSAxXSA9IDE7CisgICAgICBtX291dHB1dFN0cmlkZXNbTnVtRGltc10gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpKzFdID0gbV9vdXRwdXRTdHJpZGVzW2krMl0gKiBtX2RpbWVuc2lvbnNbaSsxXTsKKyAgICAgIH0KKyAgICAgIG1fb3V0cHV0U3RyaWRlc1swXSA9IG1fb3V0cHV0U3RyaWRlc1sxXSAqIG1fZGltZW5zaW9uc1swXTsKKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKikgeworICAgIG1faW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQoaW5kZXggPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworICAgIEluZGV4IGlucHV0SW5kZXggPSAwOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaWYgKGlzUGFkZGluZ0F0SW5kZXhGb3JEaW0oaWR4LCBpKSkgeworICAgICAgICAgIHJldHVybiBtX3BhZGRpbmdWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEluZGV4ICs9IChpZHggLSBtX3BhZGRpbmdbaV0uZmlyc3QpICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlmIChpc1BhZGRpbmdBdEluZGV4Rm9yRGltKGluZGV4LCAwKSkgeworICAgICAgICByZXR1cm4gbV9wYWRkaW5nVmFsdWU7CisgICAgICB9CisgICAgICBpbnB1dEluZGV4ICs9IChpbmRleCAtIG1fcGFkZGluZ1swXS5maXJzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltcyAtIDE7ICsraSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpKzFdOworICAgICAgICBpZiAoaXNQYWRkaW5nQXRJbmRleEZvckRpbShpZHgsIGkpKSB7CisgICAgICAgICAgcmV0dXJuIG1fcGFkZGluZ1ZhbHVlOworICAgICAgICB9CisgICAgICAgIGlucHV0SW5kZXggKz0gKGlkeCAtIG1fcGFkZGluZ1tpXS5maXJzdCkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2krMV07CisgICAgICB9CisgICAgICBpZiAoaXNQYWRkaW5nQXRJbmRleEZvckRpbShpbmRleCwgTnVtRGltcy0xKSkgeworICAgICAgICByZXR1cm4gbV9wYWRkaW5nVmFsdWU7CisgICAgICB9CisgICAgICBpbnB1dEluZGV4ICs9IChpbmRleCAtIG1fcGFkZGluZ1tOdW1EaW1zLTFdLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIHJldHVybiBwYWNrZXRDb2xNYWpvcihpbmRleCk7CisgICAgfQorICAgIHJldHVybiBwYWNrZXRSb3dNYWpvcihpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgVGVuc29yT3BDb3N0IGNvc3QgPSBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKQorICAgICAgICB1cGRhdGVDb3N0UGVyRGltZW5zaW9uKGNvc3QsIGksIGkgPT0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgICAgIHVwZGF0ZUNvc3RQZXJEaW1lbnNpb24oY29zdCwgaSwgaSA9PSBOdW1EaW1zIC0gMSk7CisgICAgfQorICAgIHJldHVybiBjb3N0OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgcHJpdmF0ZToKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIGlzUGFkZGluZ0F0SW5kZXhGb3JEaW0oCisgICAgICBJbmRleCBpbmRleCwgaW50IGRpbV9pbmRleCkgY29uc3QgeworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0lOREVYX0xJU1QpCisgICAgcmV0dXJuICghaW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxQYWRkaW5nRGltZW5zaW9ucz4oZGltX2luZGV4LCAwKSAmJgorICAgICAgICAgICAgaW5kZXggPCBtX3BhZGRpbmdbZGltX2luZGV4XS5maXJzdCkgfHwKKyAgICAgICAgKCFpbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxQYWRkaW5nRGltZW5zaW9ucz4oZGltX2luZGV4LCAwKSAmJgorICAgICAgICAgaW5kZXggPj0gbV9kaW1lbnNpb25zW2RpbV9pbmRleF0gLSBtX3BhZGRpbmdbZGltX2luZGV4XS5zZWNvbmQpOworI2Vsc2UKKyAgICByZXR1cm4gKGluZGV4IDwgbV9wYWRkaW5nW2RpbV9pbmRleF0uZmlyc3QpIHx8CisgICAgICAgICAgIChpbmRleCA+PSBtX2RpbWVuc2lvbnNbZGltX2luZGV4XSAtIG1fcGFkZGluZ1tkaW1faW5kZXhdLnNlY29uZCk7CisjZW5kaWYKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgYm9vbCBpc0xlZnRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKAorICAgICAgaW50IGRpbV9pbmRleCkgY29uc3QgeworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0lOREVYX0xJU1QpCisgICAgcmV0dXJuIGludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8UGFkZGluZ0RpbWVuc2lvbnM+KGRpbV9pbmRleCwgMCk7CisjZWxzZQorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShkaW1faW5kZXgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBib29sIGlzUmlnaHRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKAorICAgICAgaW50IGRpbV9pbmRleCkgY29uc3QgeworI2lmIGRlZmluZWQoRUlHRU5fSEFTX0lOREVYX0xJU1QpCisgICAgcmV0dXJuIGludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPFBhZGRpbmdEaW1lbnNpb25zPihkaW1faW5kZXgsIDApOworI2Vsc2UKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZGltX2luZGV4KTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgfQorCisKKyAgdm9pZCB1cGRhdGVDb3N0UGVyRGltZW5zaW9uKFRlbnNvck9wQ29zdCYgY29zdCwgaW50IGksIGJvb2wgZmlyc3QpIGNvbnN0IHsKKyAgICBjb25zdCBkb3VibGUgaW4gPSBzdGF0aWNfY2FzdDxkb3VibGU+KG1faW1wbC5kaW1lbnNpb25zKClbaV0pOworICAgIGNvbnN0IGRvdWJsZSBvdXQgPSBpbiArIG1fcGFkZGluZ1tpXS5maXJzdCArIG1fcGFkZGluZ1tpXS5zZWNvbmQ7CisgICAgaWYgKG91dCA9PSAwKQorICAgICAgcmV0dXJuOworICAgIGNvbnN0IGRvdWJsZSByZWR1Y3Rpb24gPSBpbiAvIG91dDsKKyAgICBjb3N0ICo9IHJlZHVjdGlvbjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGNvc3QgKz0gVGVuc29yT3BDb3N0KDAsIDAsIDIgKiBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gKiAoMSAqIFRlbnNvck9wQ29zdDo6QWRkQ29zdDxJbmRleD4oKSkpOworICAgIH0gZWxzZSB7CisgICAgICBjb3N0ICs9IFRlbnNvck9wQ29zdCgwLCAwLCAyICogVGVuc29yT3BDb3N0OjpBZGRDb3N0PEluZGV4PigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBUZW5zb3JPcENvc3Q6Ok11bENvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gKiAoMiAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICogVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpKSk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldENvbE1ham9yKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBjb25zdCBJbmRleCBpbml0aWFsSW5kZXggPSBpbmRleDsKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgIGNvbnN0IEluZGV4IGZpcnN0ID0gaW5kZXg7CisgICAgICBjb25zdCBJbmRleCBsYXN0ID0gaW5kZXggKyBQYWNrZXRTaXplIC0gMTsKKyAgICAgIGNvbnN0IEluZGV4IGxhc3RQYWRkZWRMZWZ0ID0gbV9wYWRkaW5nW2ldLmZpcnN0ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgY29uc3QgSW5kZXggZmlyc3RQYWRkZWRSaWdodCA9IChtX2RpbWVuc2lvbnNbaV0gLSBtX3BhZGRpbmdbaV0uc2Vjb25kKSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIGNvbnN0IEluZGV4IGxhc3RQYWRkZWRSaWdodCA9IG1fb3V0cHV0U3RyaWRlc1tpKzFdOworCisgICAgICBpZiAoIWlzTGVmdFBhZGRpbmdDb21waWxlVGltZVplcm8oaSkgJiYgbGFzdCA8IGxhc3RQYWRkZWRMZWZ0KSB7CisgICAgICAgIC8vIGFsbCB0aGUgY29lZmZpY2llbnQgYXJlIGluIHRoZSBwYWRkaW5nIHpvbmUuCisgICAgICAgIHJldHVybiBpbnRlcm5hbDo6cHNldDE8UGFja2V0UmV0dXJuVHlwZT4obV9wYWRkaW5nVmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIWlzUmlnaHRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKGkpICYmIGZpcnN0ID49IGZpcnN0UGFkZGVkUmlnaHQgJiYgbGFzdCA8IGxhc3RQYWRkZWRSaWdodCkgeworICAgICAgICAvLyBhbGwgdGhlIGNvZWZmaWNpZW50IGFyZSBpbiB0aGUgcGFkZGluZyB6b25lLgorICAgICAgICByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KG1fcGFkZGluZ1ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChpc0xlZnRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKGkpICYmIGlzUmlnaHRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKGkpKSB8fCAoZmlyc3QgPj0gbGFzdFBhZGRlZExlZnQgJiYgbGFzdCA8IGZpcnN0UGFkZGVkUmlnaHQpKSB7CisgICAgICAgIC8vIGFsbCB0aGUgY29lZmZpY2llbnQgYXJlIGJldHdlZW4gdGhlIDIgcGFkZGluZyB6b25lcy4KKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kZXggKz0gKGlkeCAtIG1fcGFkZGluZ1tpXS5maXJzdCkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIGNhc2UKKyAgICAgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5pdGlhbEluZGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBJbmRleCBsYXN0ID0gaW5kZXggKyBQYWNrZXRTaXplIC0gMTsKKyAgICBjb25zdCBJbmRleCBmaXJzdCA9IGluZGV4OworICAgIGNvbnN0IEluZGV4IGxhc3RQYWRkZWRMZWZ0ID0gbV9wYWRkaW5nWzBdLmZpcnN0OworICAgIGNvbnN0IEluZGV4IGZpcnN0UGFkZGVkUmlnaHQgPSAobV9kaW1lbnNpb25zWzBdIC0gbV9wYWRkaW5nWzBdLnNlY29uZCk7CisgICAgY29uc3QgSW5kZXggbGFzdFBhZGRlZFJpZ2h0ID0gbV9vdXRwdXRTdHJpZGVzWzFdOworCisgICAgaWYgKCFpc0xlZnRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKDApICYmIGxhc3QgPCBsYXN0UGFkZGVkTGVmdCkgeworICAgICAgLy8gYWxsIHRoZSBjb2VmZmljaWVudCBhcmUgaW4gdGhlIHBhZGRpbmcgem9uZS4KKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cHNldDE8UGFja2V0UmV0dXJuVHlwZT4obV9wYWRkaW5nVmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmICghaXNSaWdodFBhZGRpbmdDb21waWxlVGltZVplcm8oMCkgJiYgZmlyc3QgPj0gZmlyc3RQYWRkZWRSaWdodCAmJiBsYXN0IDwgbGFzdFBhZGRlZFJpZ2h0KSB7CisgICAgICAvLyBhbGwgdGhlIGNvZWZmaWNpZW50IGFyZSBpbiB0aGUgcGFkZGluZyB6b25lLgorICAgICAgcmV0dXJuIGludGVybmFsOjpwc2V0MTxQYWNrZXRSZXR1cm5UeXBlPihtX3BhZGRpbmdWYWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpc0xlZnRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKDApICYmIGlzUmlnaHRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKDApKSB8fCAoZmlyc3QgPj0gbGFzdFBhZGRlZExlZnQgJiYgbGFzdCA8IGZpcnN0UGFkZGVkUmlnaHQpKSB7CisgICAgICAvLyBhbGwgdGhlIGNvZWZmaWNpZW50IGFyZSBiZXR3ZWVuIHRoZSAyIHBhZGRpbmcgem9uZXMuCisgICAgICBpbnB1dEluZGV4ICs9IChpbmRleCAtIG1fcGFkZGluZ1swXS5maXJzdCk7CisgICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kZXgpOworICAgIH0KKyAgICAvLyBFdmVyeSBvdGhlciBjYXNlCisgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5pdGlhbEluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRSb3dNYWpvcihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCtQYWNrZXRTaXplLTEgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworCisgICAgY29uc3QgSW5kZXggaW5pdGlhbEluZGV4ID0gaW5kZXg7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgIGNvbnN0IEluZGV4IGZpcnN0ID0gaW5kZXg7CisgICAgICBjb25zdCBJbmRleCBsYXN0ID0gaW5kZXggKyBQYWNrZXRTaXplIC0gMTsKKyAgICAgIGNvbnN0IEluZGV4IGxhc3RQYWRkZWRMZWZ0ID0gbV9wYWRkaW5nW2ldLmZpcnN0ICogbV9vdXRwdXRTdHJpZGVzW2krMV07CisgICAgICBjb25zdCBJbmRleCBmaXJzdFBhZGRlZFJpZ2h0ID0gKG1fZGltZW5zaW9uc1tpXSAtIG1fcGFkZGluZ1tpXS5zZWNvbmQpICogbV9vdXRwdXRTdHJpZGVzW2krMV07CisgICAgICBjb25zdCBJbmRleCBsYXN0UGFkZGVkUmlnaHQgPSBtX291dHB1dFN0cmlkZXNbaV07CisKKyAgICAgIGlmICghaXNMZWZ0UGFkZGluZ0NvbXBpbGVUaW1lWmVybyhpKSAmJiBsYXN0IDwgbGFzdFBhZGRlZExlZnQpIHsKKyAgICAgICAgLy8gYWxsIHRoZSBjb2VmZmljaWVudCBhcmUgaW4gdGhlIHBhZGRpbmcgem9uZS4KKyAgICAgICAgcmV0dXJuIGludGVybmFsOjpwc2V0MTxQYWNrZXRSZXR1cm5UeXBlPihtX3BhZGRpbmdWYWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICghaXNSaWdodFBhZGRpbmdDb21waWxlVGltZVplcm8oaSkgJiYgZmlyc3QgPj0gZmlyc3RQYWRkZWRSaWdodCAmJiBsYXN0IDwgbGFzdFBhZGRlZFJpZ2h0KSB7CisgICAgICAgIC8vIGFsbCB0aGUgY29lZmZpY2llbnQgYXJlIGluIHRoZSBwYWRkaW5nIHpvbmUuCisgICAgICAgIHJldHVybiBpbnRlcm5hbDo6cHNldDE8UGFja2V0UmV0dXJuVHlwZT4obV9wYWRkaW5nVmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKGlzTGVmdFBhZGRpbmdDb21waWxlVGltZVplcm8oaSkgJiYgaXNSaWdodFBhZGRpbmdDb21waWxlVGltZVplcm8oaSkpIHx8IChmaXJzdCA+PSBsYXN0UGFkZGVkTGVmdCAmJiBsYXN0IDwgZmlyc3RQYWRkZWRSaWdodCkpIHsKKyAgICAgICAgLy8gYWxsIHRoZSBjb2VmZmljaWVudCBhcmUgYmV0d2VlbiB0aGUgMiBwYWRkaW5nIHpvbmVzLgorICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpKzFdOworICAgICAgICBpbnB1dEluZGV4ICs9IChpZHggLSBtX3BhZGRpbmdbaV0uZmlyc3QpICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fb3V0cHV0U3RyaWRlc1tpKzFdOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIGNhc2UKKyAgICAgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5pdGlhbEluZGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBJbmRleCBsYXN0ID0gaW5kZXggKyBQYWNrZXRTaXplIC0gMTsKKyAgICBjb25zdCBJbmRleCBmaXJzdCA9IGluZGV4OworICAgIGNvbnN0IEluZGV4IGxhc3RQYWRkZWRMZWZ0ID0gbV9wYWRkaW5nW051bURpbXMtMV0uZmlyc3Q7CisgICAgY29uc3QgSW5kZXggZmlyc3RQYWRkZWRSaWdodCA9IChtX2RpbWVuc2lvbnNbTnVtRGltcy0xXSAtIG1fcGFkZGluZ1tOdW1EaW1zLTFdLnNlY29uZCk7CisgICAgY29uc3QgSW5kZXggbGFzdFBhZGRlZFJpZ2h0ID0gbV9vdXRwdXRTdHJpZGVzW051bURpbXMtMV07CisKKyAgICBpZiAoIWlzTGVmdFBhZGRpbmdDb21waWxlVGltZVplcm8oTnVtRGltcy0xKSAmJiBsYXN0IDwgbGFzdFBhZGRlZExlZnQpIHsKKyAgICAgIC8vIGFsbCB0aGUgY29lZmZpY2llbnQgYXJlIGluIHRoZSBwYWRkaW5nIHpvbmUuCisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KG1fcGFkZGluZ1ZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWlzUmlnaHRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKE51bURpbXMtMSkgJiYgZmlyc3QgPj0gZmlyc3RQYWRkZWRSaWdodCAmJiBsYXN0IDwgbGFzdFBhZGRlZFJpZ2h0KSB7CisgICAgICAvLyBhbGwgdGhlIGNvZWZmaWNpZW50IGFyZSBpbiB0aGUgcGFkZGluZyB6b25lLgorICAgICAgcmV0dXJuIGludGVybmFsOjpwc2V0MTxQYWNrZXRSZXR1cm5UeXBlPihtX3BhZGRpbmdWYWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpc0xlZnRQYWRkaW5nQ29tcGlsZVRpbWVaZXJvKE51bURpbXMtMSkgJiYgaXNSaWdodFBhZGRpbmdDb21waWxlVGltZVplcm8oTnVtRGltcy0xKSkgfHwgKGZpcnN0ID49IGxhc3RQYWRkZWRMZWZ0ICYmIGxhc3QgPCBmaXJzdFBhZGRlZFJpZ2h0KSkgeworICAgICAgLy8gYWxsIHRoZSBjb2VmZmljaWVudCBhcmUgYmV0d2VlbiB0aGUgMiBwYWRkaW5nIHpvbmVzLgorICAgICAgaW5wdXRJbmRleCArPSAoaW5kZXggLSBtX3BhZGRpbmdbTnVtRGltcy0xXS5maXJzdCk7CisgICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kZXgpOworICAgIH0KKyAgICAvLyBFdmVyeSBvdGhlciBjYXNlCisgICAgcmV0dXJuIHBhY2tldFdpdGhQb3NzaWJsZVplcm8oaW5pdGlhbEluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRXaXRoUG9zc2libGVaZXJvKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fQUxJR05fTUFYIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSB2YWx1ZXNbUGFja2V0U2l6ZV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIHZhbHVlc1tpXSA9IGNvZWZmKGluZGV4K2kpOworICAgIH0KKyAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICByZXR1cm4gcnNsdDsKKyAgfQorCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBhcnJheTxJbmRleCwgTnVtRGltcysxPiBtX291dHB1dFN0cmlkZXM7CisgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX2lucHV0U3RyaWRlczsKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBQYWRkaW5nRGltZW5zaW9ucyBtX3BhZGRpbmc7CisKKyAgU2NhbGFyIG1fcGFkZGluZ1ZhbHVlOworfTsKKworCisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1BBRERJTkdfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JQYXRjaC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JQYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmEyNTQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclBhdGNoLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9QQVRDSF9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUEFUQ0hfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvclBhdGNoCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciBwYXRjaCBjbGFzcy4KKyAgKgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgUGF0Y2hEaW0sIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnMgKyAxOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGF0Y2hEaW0sIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JQYXRjaE9wPFBhdGNoRGltLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIFhwclR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGF0Y2hEaW0sIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIFhwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yUGF0Y2hPcDxQYXRjaERpbSwgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFBhdGNoRGltLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yUGF0Y2hPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIFhwclR5cGU+LCBSZWFkT25seUFjY2Vzc29ycz4KK3sKKyAgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclBhdGNoT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yUGF0Y2hPcD46OnR5cGUgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclBhdGNoT3A+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JQYXRjaE9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JQYXRjaE9wKGNvbnN0IFhwclR5cGUmIGV4cHIsIGNvbnN0IFBhdGNoRGltJiBwYXRjaF9kaW1zKQorICAgICAgOiBtX3hwcihleHByKSwgbV9wYXRjaF9kaW1zKHBhdGNoX2RpbXMpIHt9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IFBhdGNoRGltJiBwYXRjaF9kaW1zKCkgY29uc3QgeyByZXR1cm4gbV9wYXRjaF9kaW1zOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBQYXRjaERpbSBtX3BhdGNoX2RpbXM7Cit9OworCisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYXRjaERpbSwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JQYXRjaE9wPFBhdGNoRGltLCBBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvclBhdGNoT3A8UGF0Y2hEaW0sIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWUgKyAxOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IGZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSkKKyAgeworICAgIEluZGV4IG51bV9wYXRjaGVzID0gMTsKKyAgICBjb25zdCB0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucyYgaW5wdXRfZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgY29uc3QgUGF0Y2hEaW0mIHBhdGNoX2RpbXMgPSBvcC5wYXRjaF9kaW1zKCk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zLTE7ICsraSkgeworICAgICAgICBtX2RpbWVuc2lvbnNbaV0gPSBwYXRjaF9kaW1zW2ldOworICAgICAgICBudW1fcGF0Y2hlcyAqPSAoaW5wdXRfZGltc1tpXSAtIHBhdGNoX2RpbXNbaV0gKyAxKTsKKyAgICAgIH0KKyAgICAgIG1fZGltZW5zaW9uc1tOdW1EaW1zLTFdID0gbnVtX3BhdGNoZXM7CisKKyAgICAgIG1faW5wdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIG1fcGF0Y2hTdHJpZGVzWzBdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtRGltcy0xOyArK2kpIHsKKyAgICAgICAgbV9pbnB1dFN0cmlkZXNbaV0gPSBtX2lucHV0U3RyaWRlc1tpLTFdICogaW5wdXRfZGltc1tpLTFdOworICAgICAgICBtX3BhdGNoU3RyaWRlc1tpXSA9IG1fcGF0Y2hTdHJpZGVzW2ktMV0gKiAoaW5wdXRfZGltc1tpLTFdIC0gcGF0Y2hfZGltc1tpLTFdICsgMSk7CisgICAgICB9CisgICAgICBtX291dHB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2ktMV0gKiBtX2RpbWVuc2lvbnNbaS0xXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zLTE7ICsraSkgeworICAgICAgICBtX2RpbWVuc2lvbnNbaSsxXSA9IHBhdGNoX2RpbXNbaV07CisgICAgICAgIG51bV9wYXRjaGVzICo9IChpbnB1dF9kaW1zW2ldIC0gcGF0Y2hfZGltc1tpXSArIDEpOworICAgICAgfQorICAgICAgbV9kaW1lbnNpb25zWzBdID0gbnVtX3BhdGNoZXM7CisKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMtMl0gPSAxOworICAgICAgbV9wYXRjaFN0cmlkZXNbTnVtRGltcy0yXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcy0zOyBpID49IDA7IC0taSkgeworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICAgIG1fcGF0Y2hTdHJpZGVzW2ldID0gbV9wYXRjaFN0cmlkZXNbaSsxXSAqIChpbnB1dF9kaW1zW2krMV0gLSBwYXRjaF9kaW1zW2krMV0gKyAxKTsKKyAgICAgIH0KKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdID0gMTsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zLTI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpKzFdICogbV9kaW1lbnNpb25zW2krMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBJbmRleCBvdXRwdXRfc3RyaWRlX2luZGV4ID0gKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgPyBOdW1EaW1zIC0gMSA6IDA7CisgICAgLy8gRmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHBhdGNoLgorICAgIEluZGV4IHBhdGNoSW5kZXggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tvdXRwdXRfc3RyaWRlX2luZGV4XTsKKyAgICAvLyBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgd3J0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICBJbmRleCBwYXRjaE9mZnNldCA9IGluZGV4IC0gcGF0Y2hJbmRleCAqIG1fb3V0cHV0U3RyaWRlc1tvdXRwdXRfc3RyaWRlX2luZGV4XTsKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDI7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgY29uc3QgSW5kZXggcGF0Y2hJZHggPSBwYXRjaEluZGV4IC8gbV9wYXRjaFN0cmlkZXNbaV07CisgICAgICAgIHBhdGNoSW5kZXggLT0gcGF0Y2hJZHggKiBtX3BhdGNoU3RyaWRlc1tpXTsKKyAgICAgICAgY29uc3QgSW5kZXggb2Zmc2V0SWR4ID0gcGF0Y2hPZmZzZXQgLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIHBhdGNoT2Zmc2V0IC09IG9mZnNldElkeCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRleCArPSAocGF0Y2hJZHggKyBvZmZzZXRJZHgpICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltcyAtIDI7ICsraSkgeworICAgICAgICBjb25zdCBJbmRleCBwYXRjaElkeCA9IHBhdGNoSW5kZXggLyBtX3BhdGNoU3RyaWRlc1tpXTsKKyAgICAgICAgcGF0Y2hJbmRleCAtPSBwYXRjaElkeCAqIG1fcGF0Y2hTdHJpZGVzW2ldOworICAgICAgICBjb25zdCBJbmRleCBvZmZzZXRJZHggPSBwYXRjaE9mZnNldCAvIG1fb3V0cHV0U3RyaWRlc1tpKzFdOworICAgICAgICBwYXRjaE9mZnNldCAtPSBvZmZzZXRJZHggKiBtX291dHB1dFN0cmlkZXNbaSsxXTsKKyAgICAgICAgaW5wdXRJbmRleCArPSAocGF0Y2hJZHggKyBvZmZzZXRJZHgpICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgfQorICAgIGlucHV0SW5kZXggKz0gKHBhdGNoSW5kZXggKyBwYXRjaE9mZnNldCk7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbnB1dEluZGV4KTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCtQYWNrZXRTaXplLTEgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworCisgICAgSW5kZXggb3V0cHV0X3N0cmlkZV9pbmRleCA9IChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpID8gTnVtRGltcyAtIDEgOiAwOworICAgIEluZGV4IGluZGljZXNbMl0gPSB7aW5kZXgsIGluZGV4ICsgUGFja2V0U2l6ZSAtIDF9OworICAgIEluZGV4IHBhdGNoSW5kaWNlc1syXSA9IHtpbmRpY2VzWzBdIC8gbV9vdXRwdXRTdHJpZGVzW291dHB1dF9zdHJpZGVfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzFdIC8gbV9vdXRwdXRTdHJpZGVzW291dHB1dF9zdHJpZGVfaW5kZXhdfTsKKyAgICBJbmRleCBwYXRjaE9mZnNldHNbMl0gPSB7aW5kaWNlc1swXSAtIHBhdGNoSW5kaWNlc1swXSAqIG1fb3V0cHV0U3RyaWRlc1tvdXRwdXRfc3RyaWRlX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1sxXSAtIHBhdGNoSW5kaWNlc1sxXSAqIG1fb3V0cHV0U3RyaWRlc1tvdXRwdXRfc3RyaWRlX2luZGV4XX07CisKKyAgICBJbmRleCBpbnB1dEluZGljZXNbMl0gPSB7MCwgMH07CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IHBhdGNoSWR4WzJdID0ge3BhdGNoSW5kaWNlc1swXSAvIG1fcGF0Y2hTdHJpZGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEluZGljZXNbMV0gLyBtX3BhdGNoU3RyaWRlc1tpXX07CisgICAgICAgIHBhdGNoSW5kaWNlc1swXSAtPSBwYXRjaElkeFswXSAqIG1fcGF0Y2hTdHJpZGVzW2ldOworICAgICAgICBwYXRjaEluZGljZXNbMV0gLT0gcGF0Y2hJZHhbMV0gKiBtX3BhdGNoU3RyaWRlc1tpXTsKKworICAgICAgICBjb25zdCBJbmRleCBvZmZzZXRJZHhbMl0gPSB7cGF0Y2hPZmZzZXRzWzBdIC8gbV9vdXRwdXRTdHJpZGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hPZmZzZXRzWzFdIC8gbV9vdXRwdXRTdHJpZGVzW2ldfTsKKyAgICAgICAgcGF0Y2hPZmZzZXRzWzBdIC09IG9mZnNldElkeFswXSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgcGF0Y2hPZmZzZXRzWzFdIC09IG9mZnNldElkeFsxXSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKworICAgICAgICBpbnB1dEluZGljZXNbMF0gKz0gKHBhdGNoSWR4WzBdICsgb2Zmc2V0SWR4WzBdKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMV0gKz0gKHBhdGNoSWR4WzFdICsgb2Zmc2V0SWR4WzFdKSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAyOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggcGF0Y2hJZHhbMl0gPSB7cGF0Y2hJbmRpY2VzWzBdIC8gbV9wYXRjaFN0cmlkZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoSW5kaWNlc1sxXSAvIG1fcGF0Y2hTdHJpZGVzW2ldfTsKKyAgICAgICAgcGF0Y2hJbmRpY2VzWzBdIC09IHBhdGNoSWR4WzBdICogbV9wYXRjaFN0cmlkZXNbaV07CisgICAgICAgIHBhdGNoSW5kaWNlc1sxXSAtPSBwYXRjaElkeFsxXSAqIG1fcGF0Y2hTdHJpZGVzW2ldOworCisgICAgICAgIGNvbnN0IEluZGV4IG9mZnNldElkeFsyXSA9IHtwYXRjaE9mZnNldHNbMF0gLyBtX291dHB1dFN0cmlkZXNbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoT2Zmc2V0c1sxXSAvIG1fb3V0cHV0U3RyaWRlc1tpKzFdfTsKKyAgICAgICAgcGF0Y2hPZmZzZXRzWzBdIC09IG9mZnNldElkeFswXSAqIG1fb3V0cHV0U3RyaWRlc1tpKzFdOworICAgICAgICBwYXRjaE9mZnNldHNbMV0gLT0gb2Zmc2V0SWR4WzFdICogbV9vdXRwdXRTdHJpZGVzW2krMV07CisKKyAgICAgICAgaW5wdXRJbmRpY2VzWzBdICs9IChwYXRjaElkeFswXSArIG9mZnNldElkeFswXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRpY2VzWzFdICs9IChwYXRjaElkeFsxXSArIG9mZnNldElkeFsxXSkgKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRJbmRpY2VzWzBdICs9IChwYXRjaEluZGljZXNbMF0gKyBwYXRjaE9mZnNldHNbMF0pOworICAgIGlucHV0SW5kaWNlc1sxXSArPSAocGF0Y2hJbmRpY2VzWzFdICsgcGF0Y2hPZmZzZXRzWzFdKTsKKworICAgIGlmIChpbnB1dEluZGljZXNbMV0gLSBpbnB1dEluZGljZXNbMF0gPT0gUGFja2V0U2l6ZSAtIDEpIHsKKyAgICAgIFBhY2tldFJldHVyblR5cGUgcnNsdCA9IG1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkPihpbnB1dEluZGljZXNbMF0pOworICAgICAgcmV0dXJuIHJzbHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgRUlHRU5fQUxJR05fTUFYIENvZWZmUmV0dXJuVHlwZSB2YWx1ZXNbUGFja2V0U2l6ZV07CisgICAgICB2YWx1ZXNbMF0gPSBtX2ltcGwuY29lZmYoaW5wdXRJbmRpY2VzWzBdKTsKKyAgICAgIHZhbHVlc1tQYWNrZXRTaXplLTFdID0gbV9pbXBsLmNvZWZmKGlucHV0SW5kaWNlc1sxXSk7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IFBhY2tldFNpemUtMTsgKytpKSB7CisgICAgICAgIHZhbHVlc1tpXSA9IGNvZWZmKGluZGV4K2kpOworICAgICAgfQorICAgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgICByZXR1cm4gcnNsdDsKKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IE51bURpbXMgKiAoVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW5zb3JPcENvc3Q6Ok11bENvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCkpOworICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICsKKyAgICAgICAgICAgVGVuc29yT3BDb3N0KDAsIDAsIGNvbXB1dGVfY29zdCwgdmVjdG9yaXplZCwgUGFja2V0U2l6ZSk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyBwcm90ZWN0ZWQ6CisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9vdXRwdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcy0xPiBtX2lucHV0U3RyaWRlczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXMtMT4gbV9wYXRjaFN0cmlkZXM7CisKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1BBVENIX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmFuZG9tLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclJhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTVhODEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclJhbmRvbS5oCkBAIC0wLDAgKzEsMjc2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkFORE9NX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9SQU5ET01fSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworbmFtZXNwYWNlIHsKKworRUlHRU5fREVWSUNFX0ZVTkMgdWludDY0X3QgZ2V0X3JhbmRvbV9zZWVkKCkgeworI2lmZGVmIF9fQ1VEQV9BUkNIX18KKyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCAzZCBrZXJuZWxzIHNpbmNlIHdlIGN1cnJlbnRseSBvbmx5IHVzZSAxIGFuZAorICAvLyAyZCBrZXJuZWxzLgorICBhc3NlcnQodGhyZWFkSWR4LnogPT0gMCk7CisgIHJldHVybiBjbG9jazY0KCkgKworICAgICAgYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueCArCisgICAgICBncmlkRGltLnggKiBibG9ja0RpbS54ICogKGJsb2NrSWR4LnkgKiBibG9ja0RpbS55ICsgdGhyZWFkSWR4LnkpOworCisjZWxpZiBkZWZpbmVkIF9XSU4zMgorICAvLyBVc2UgdGhlIGN1cnJlbnQgdGltZSBhcyBhIGJhc2VsaW5lLgorICBTWVNURU1USU1FIHN0OworICBHZXRTeXN0ZW1UaW1lKCZzdCk7CisgIGludCB0aW1lID0gc3Qud1NlY29uZCArIDEwMDAgKiBzdC53TWlsbGlzZWNvbmRzOworICAvLyBNaXggaW4gYSByYW5kb20gbnVtYmVyIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGdldCBkaWZmZXJlbnQgc2VlZHMgaWYKKyAgLy8gd2UgdHJ5IHRvIGdlbmVyYXRlIHNlZWRzIGZhc3RlciB0aGFuIHRoZSBjbG9jayByZXNvbHV0aW9uLgorICAvLyBXZSBuZWVkIDIgcmFuZG9tIHZhbHVlcyBzaW5jZSB0aGUgZ2VuZXJhdG9yIG9ubHkgZ2VuZXJhdGUgMTYgYml0cyBhdAorICAvLyBhIHRpbWUgKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvMzk4YXg2OXkuYXNweCkKKyAgaW50IHJuZDEgPSA6OnJhbmQoKTsKKyAgaW50IHJuZDIgPSA6OnJhbmQoKTsKKyAgdWludDY0X3Qgcm5kID0gKHJuZDEgfCBybmQyIDw8IDE2KSBeIHRpbWU7CisgIHJldHVybiBybmQ7CisKKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisgIC8vIFNhbWUgYXBwcm9hY2ggYXMgZm9yIHdpbjMyLCBleGNlcHQgdGhhdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgLy8gaXMgYmV0dGVyICgvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGVnYWN5L2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9EYXJ3aW4vUmVmZXJlbmNlL01hblBhZ2VzL21hbjMvcmFuZG9tLjMuaHRtbCMvL2FwcGxlX3JlZi9kb2MvbWFuLzMvcmFuZG9tKS4KKyAgdWludDY0X3Qgcm5kID0gOjpyYW5kb20oKSBeIG1hY2hfYWJzb2x1dGVfdGltZSgpOworICByZXR1cm4gcm5kOworCisjZWxzZQorICAvLyBBdWdtZW50IHRoZSBjdXJyZW50IHRpbWUgd2l0aCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCisgIC8vIHRvIGVuc3VyZSB0aGF0IHdlIGdldCBkaWZmZXJlbnQgc2VlZHMgaWYgd2UgdHJ5IHRvIGdlbmVyYXRlIHNlZWRzCisgIC8vIGZhc3RlciB0aGFuIHRoZSBjbG9jayByZXNvbHV0aW9uLgorICB0aW1lc3BlYyB0czsKKyAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgdWludDY0X3Qgcm5kID0gOjpyYW5kb20oKSBeIHRzLnR2X25zZWM7CisgIHJldHVybiBybmQ7CisjZW5kaWYKK30KKworc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdW5zaWduZWQgUENHX1hTSF9SU19nZW5lcmF0b3IodWludDY0X3QqIHN0YXRlKSB7CisgIC8vIFRPRE86IFVuaWZ5IHdpdGggdGhlIGltcGxlbWVudGF0aW9uIGluIHRoZSBub24gYmxvY2tpbmcgdGhyZWFkIHBvb2wuCisgIHVpbnQ2NF90IGN1cnJlbnQgPSAqc3RhdGU7CisgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgKnN0YXRlID0gY3VycmVudCAqIDYzNjQxMzYyMjM4NDY3OTMwMDVVTEwgKyAweGRhM2UzOWNiOTRiOTViZGJVTEw7CisgIC8vIEdlbmVyYXRlIHRoZSByYW5kb20gb3V0cHV0ICh1c2luZyB0aGUgUENHLVhTSC1SUyBzY2hlbWUpCisgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKGN1cnJlbnQgXiAoY3VycmVudCA+PiAyMikpID4+ICgyMiArIChjdXJyZW50ID4+IDYxKSkpOworfQorCitzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB1aW50NjRfdCBQQ0dfWFNIX1JTX3N0YXRlKHVpbnQ2NF90IHNlZWQpIHsKKyAgc2VlZCA9IHNlZWQgPyBzZWVkIDogZ2V0X3JhbmRvbV9zZWVkKCk7CisgIHJldHVybiBzZWVkICogNjM2NDEzNjIyMzg0Njc5MzAwNVVMTCArIDB4ZGEzZTM5Y2I5NGI5NWJkYlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK1QgUmFuZG9tVG9UeXBlVW5pZm9ybSh1aW50NjRfdCogc3RhdGUpIHsKKyAgdW5zaWduZWQgcm5kID0gUENHX1hTSF9SU19nZW5lcmF0b3Ioc3RhdGUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4ocm5kKTsKK30KKworCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitFaWdlbjo6aGFsZiBSYW5kb21Ub1R5cGVVbmlmb3JtPEVpZ2VuOjpoYWxmPih1aW50NjRfdCogc3RhdGUpIHsKKyAgRWlnZW46OmhhbGYgcmVzdWx0OworICAvLyBHZW5lcmF0ZSAxMCByYW5kb20gYml0cyBmb3IgdGhlIG1hbnRpc3NhCisgIHVuc2lnbmVkIHJuZCA9IFBDR19YU0hfUlNfZ2VuZXJhdG9yKHN0YXRlKTsKKyAgcmVzdWx0LnggPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4ocm5kICYgMHgzZmZ1KTsKKyAgLy8gU2V0IHRoZSBleHBvbmVudAorICByZXN1bHQueCB8PSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KDE1KSA8PCAxMCk7CisgIC8vIFJldHVybiB0aGUgZmluYWwgcmVzdWx0CisgIHJldHVybiByZXN1bHQgLSBFaWdlbjo6aGFsZigxLjBmKTsKK30KKworCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdCBSYW5kb21Ub1R5cGVVbmlmb3JtPGZsb2F0Pih1aW50NjRfdCogc3RhdGUpIHsKKyAgdHlwZWRlZiB1bmlvbiB7CisgICAgdWludDMyX3QgcmF3OworICAgIGZsb2F0IGZwOworICB9IGludGVybmFsOworICBpbnRlcm5hbCByZXN1bHQ7CisgIC8vIEdlbmVyYXRlIDIzIHJhbmRvbSBiaXRzIGZvciB0aGUgbWFudGlzc2EgbWFudGlzc2EKKyAgY29uc3QgdW5zaWduZWQgcm5kID0gUENHX1hTSF9SU19nZW5lcmF0b3Ioc3RhdGUpOworICByZXN1bHQucmF3ID0gcm5kICYgMHg3ZmZmZmZ1OworICAvLyBTZXQgdGhlIGV4cG9uZW50CisgIHJlc3VsdC5yYXcgfD0gKHN0YXRpY19jYXN0PHVpbnQzMl90PigxMjcpIDw8IDIzKTsKKyAgLy8gUmV0dXJuIHRoZSBmaW5hbCByZXN1bHQKKyAgcmV0dXJuIHJlc3VsdC5mcCAtIDEuMGY7Cit9CisKK3RlbXBsYXRlIDw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2RvdWJsZSBSYW5kb21Ub1R5cGVVbmlmb3JtPGRvdWJsZT4odWludDY0X3QqIHN0YXRlKSB7CisgIHR5cGVkZWYgdW5pb24geworICAgIHVpbnQ2NF90IHJhdzsKKyAgICBkb3VibGUgZHA7CisgIH0gaW50ZXJuYWw7CisgIGludGVybmFsIHJlc3VsdDsKKyAgcmVzdWx0LnJhdyA9IDA7CisgIC8vIEdlbmVyYXRlIDUyIHJhbmRvbSBiaXRzIGZvciB0aGUgbWFudGlzc2EKKyAgLy8gRmlyc3QgZ2VuZXJhdGUgdGhlIHVwcGVyIDIwIGJpdHMKKyAgdW5zaWduZWQgcm5kMSA9IFBDR19YU0hfUlNfZ2VuZXJhdG9yKHN0YXRlKSAmIDB4ZmZmZmZ1OworICAvLyBUaGUgZ2VuZXJhdGUgdGhlIGxvd2VyIDMyIGJpdHMKKyAgdW5zaWduZWQgcm5kMiA9IFBDR19YU0hfUlNfZ2VuZXJhdG9yKHN0YXRlKTsKKyAgcmVzdWx0LnJhdyA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocm5kMSkgPDwgMzIpIHwgcm5kMjsKKyAgLy8gU2V0IHRoZSBleHBvbmVudAorICByZXN1bHQucmF3IHw9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oMTAyMykgPDwgNTIpOworICAvLyBSZXR1cm4gdGhlIGZpbmFsIHJlc3VsdAorICByZXR1cm4gcmVzdWx0LmRwIC0gMS4wOworfQorCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitzdGQ6OmNvbXBsZXg8ZmxvYXQ+IFJhbmRvbVRvVHlwZVVuaWZvcm08c3RkOjpjb21wbGV4PGZsb2F0PiA+KHVpbnQ2NF90KiBzdGF0ZSkgeworICByZXR1cm4gc3RkOjpjb21wbGV4PGZsb2F0PihSYW5kb21Ub1R5cGVVbmlmb3JtPGZsb2F0PihzdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbVRvVHlwZVVuaWZvcm08ZmxvYXQ+KHN0YXRlKSk7Cit9Cit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitzdGQ6OmNvbXBsZXg8ZG91YmxlPiBSYW5kb21Ub1R5cGVVbmlmb3JtPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4odWludDY0X3QqIHN0YXRlKSB7CisgIHJldHVybiBzdGQ6OmNvbXBsZXg8ZG91YmxlPihSYW5kb21Ub1R5cGVVbmlmb3JtPGRvdWJsZT4oc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZG9tVG9UeXBlVW5pZm9ybTxkb3VibGU+KHN0YXRlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBVbmlmb3JtUmFuZG9tR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIFBhY2tldEFjY2VzcyA9IHRydWU7CisKKyAgLy8gVXNlcyB0aGUgZ2l2ZW4gInNlZWQiIGlmIG5vbi16ZXJvLCBvdGhlcndpc2UgdXNlcyBhIHJhbmRvbSBzZWVkLgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFVuaWZvcm1SYW5kb21HZW5lcmF0b3IoCisgICAgICB1aW50NjRfdCBzZWVkID0gMCkgeworICAgIG1fc3RhdGUgPSBQQ0dfWFNIX1JTX3N0YXRlKHNlZWQpOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVW5pZm9ybVJhbmRvbUdlbmVyYXRvcigKKyAgICAgIGNvbnN0IFVuaWZvcm1SYW5kb21HZW5lcmF0b3ImIG90aGVyKSB7CisgICAgbV9zdGF0ZSA9IG90aGVyLm1fc3RhdGU7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBUIG9wZXJhdG9yKCkoSW5kZXggaSkgY29uc3QgeworICAgIHVpbnQ2NF90IGxvY2FsX3N0YXRlID0gbV9zdGF0ZSArIGk7CisgICAgVCByZXN1bHQgPSBSYW5kb21Ub1R5cGVVbmlmb3JtPFQ+KCZsb2NhbF9zdGF0ZSk7CisgICAgbV9zdGF0ZSA9IGxvY2FsX3N0YXRlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQsIHR5cGVuYW1lIEluZGV4PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldCBwYWNrZXRPcChJbmRleCBpKSBjb25zdCB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemU7CisgICAgRUlHRU5fQUxJR05fTUFYIFQgdmFsdWVzW3BhY2tldFNpemVdOworICAgIHVpbnQ2NF90IGxvY2FsX3N0YXRlID0gbV9zdGF0ZSArIGk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWNrZXRTaXplOyArK2opIHsKKyAgICAgIHZhbHVlc1tqXSA9IFJhbmRvbVRvVHlwZVVuaWZvcm08VD4oJmxvY2FsX3N0YXRlKTsKKyAgICB9CisgICAgbV9zdGF0ZSA9IGxvY2FsX3N0YXRlOworICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0Pih2YWx1ZXMpOworICB9CisKKyBwcml2YXRlOgorICBtdXRhYmxlIHVpbnQ2NF90IG1fc3RhdGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPFVuaWZvcm1SYW5kb21HZW5lcmF0b3I8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgLy8gUm91Z2ggZXN0aW1hdGUgZm9yIGZsb2F0aW5nIHBvaW50LCBtdWx0aXBsaWVkIGJ5IGNlaWwoc2l6ZW9mKFQpIC8gc2l6ZW9mKGZsb2F0KSkuCisgICAgQ29zdCA9IDEyICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgKgorICAgICAgICAgICAoKHNpemVvZihTY2FsYXIpICsgc2l6ZW9mKGZsb2F0KSAtIDEpIC8gc2l6ZW9mKGZsb2F0KSksCisgICAgUGFja2V0QWNjZXNzID0gVW5pZm9ybVJhbmRvbUdlbmVyYXRvcjxTY2FsYXI+OjpQYWNrZXRBY2Nlc3MKKyAgfTsKK307CisKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorVCBSYW5kb21Ub1R5cGVOb3JtYWwodWludDY0X3QqIHN0YXRlKSB7CisgIC8vIFVzZSB0aGUgcmF0aW8gb2YgdW5pZm9ybSBtZXRob2QgdG8gZ2VuZXJhdGUgbnVtYmVycyBmb2xsb3dpbmcgYSBub3JtYWwKKyAgLy8gZGlzdHJpYnV0aW9uLiBTZWUgZm9yIGV4YW1wbGUgTnVtZXJpY2FsIFJlY2lwZXMgY2hhcHRlciA3LjMuOSBmb3IgdGhlCisgIC8vIGRldGFpbHMuCisgIFQgdSwgdiwgcTsKKyAgZG8geworICAgIHUgPSBSYW5kb21Ub1R5cGVVbmlmb3JtPFQ+KHN0YXRlKTsKKyAgICB2ID0gVCgxLjcxNTYpICogKFJhbmRvbVRvVHlwZVVuaWZvcm08VD4oc3RhdGUpIC0gVCgwLjUpKTsKKyAgICBjb25zdCBUIHggPSB1IC0gVCgwLjQ0OTg3MSk7CisgICAgY29uc3QgVCB5ID0gbnVtZXh0OjphYnModikgKyBUKDAuMzg2NTk1KTsKKyAgICBxID0geCp4ICsgeSAqIChUKDAuMTk2KSp5IC0gVCgwLjI1NDcyKSp4KTsKKyAgfSB3aGlsZSAocSA+IFQoMC4yNzU5NykgJiYKKyAgICAgICAgICAgKHEgPiBUKDAuMjc4NDYpIHx8IHYqdiA+IFQoLTQpICogbnVtZXh0Ojpsb2codSkgKiB1KnUpKTsKKworICByZXR1cm4gdi91OworfQorCit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitzdGQ6OmNvbXBsZXg8ZmxvYXQ+IFJhbmRvbVRvVHlwZU5vcm1hbDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4odWludDY0X3QqIHN0YXRlKSB7CisgIHJldHVybiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KFJhbmRvbVRvVHlwZU5vcm1hbDxmbG9hdD4oc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kb21Ub1R5cGVOb3JtYWw8ZmxvYXQ+KHN0YXRlKSk7Cit9Cit0ZW1wbGF0ZSA8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitzdGQ6OmNvbXBsZXg8ZG91YmxlPiBSYW5kb21Ub1R5cGVOb3JtYWw8c3RkOjpjb21wbGV4PGRvdWJsZT4gPih1aW50NjRfdCogc3RhdGUpIHsKKyAgcmV0dXJuIHN0ZDo6Y29tcGxleDxkb3VibGU+KFJhbmRvbVRvVHlwZU5vcm1hbDxkb3VibGU+KHN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbVRvVHlwZU5vcm1hbDxkb3VibGU+KHN0YXRlKSk7Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE5vcm1hbFJhbmRvbUdlbmVyYXRvciB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCBQYWNrZXRBY2Nlc3MgPSB0cnVlOworCisgIC8vIFVzZXMgdGhlIGdpdmVuICJzZWVkIiBpZiBub24temVybywgb3RoZXJ3aXNlIHVzZXMgYSByYW5kb20gc2VlZC4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBOb3JtYWxSYW5kb21HZW5lcmF0b3IodWludDY0X3Qgc2VlZCA9IDApIHsKKyAgICBtX3N0YXRlID0gUENHX1hTSF9SU19zdGF0ZShzZWVkKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIE5vcm1hbFJhbmRvbUdlbmVyYXRvcigKKyAgICAgIGNvbnN0IE5vcm1hbFJhbmRvbUdlbmVyYXRvciYgb3RoZXIpIHsKKyAgICBtX3N0YXRlID0gb3RoZXIubV9zdGF0ZTsKKyAgfQorCisgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVCBvcGVyYXRvcigpKEluZGV4IGkpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBsb2NhbF9zdGF0ZSA9IG1fc3RhdGUgKyBpOworICAgIFQgcmVzdWx0ID0gUmFuZG9tVG9UeXBlTm9ybWFsPFQ+KCZsb2NhbF9zdGF0ZSk7CisgICAgbV9zdGF0ZSA9IGxvY2FsX3N0YXRlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQsIHR5cGVuYW1lIEluZGV4PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIFBhY2tldCBwYWNrZXRPcChJbmRleCBpKSBjb25zdCB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemU7CisgICAgRUlHRU5fQUxJR05fTUFYIFQgdmFsdWVzW3BhY2tldFNpemVdOworICAgIHVpbnQ2NF90IGxvY2FsX3N0YXRlID0gbV9zdGF0ZSArIGk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWNrZXRTaXplOyArK2opIHsKKyAgICAgIHZhbHVlc1tqXSA9IFJhbmRvbVRvVHlwZU5vcm1hbDxUPigmbG9jYWxfc3RhdGUpOworICAgIH0KKyAgICBtX3N0YXRlID0gbG9jYWxfc3RhdGU7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KHZhbHVlcyk7CisgIH0KKworIHByaXZhdGU6CisgIG11dGFibGUgdWludDY0X3QgbV9zdGF0ZTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxOb3JtYWxSYW5kb21HZW5lcmF0b3I8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgLy8gT24gYXZlcmFnZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhYm91dCAzIHJhbmRvbSBudW1iZXJzCisgICAgLy8gMTUgbXVsLCA4IGFkZCwgMS41IGxvZ3MKKyAgICBDb3N0ID0gMyAqIGZ1bmN0b3JfdHJhaXRzPFVuaWZvcm1SYW5kb21HZW5lcmF0b3I8U2NhbGFyPiA+OjpDb3N0ICsKKyAgICAgICAgICAgMTUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCArIDggKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCArCisgICAgICAgICAgIDMgKiBmdW5jdG9yX3RyYWl0czxzY2FsYXJfbG9nX29wPFNjYWxhcj4gPjo6Q29zdCAvIDIsCisgICAgUGFja2V0QWNjZXNzID0gTm9ybWFsUmFuZG9tR2VuZXJhdG9yPFNjYWxhcj46OlBhY2tldEFjY2VzcworICB9OworfTsKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9SQU5ET01fSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JSZWR1Y3Rpb24uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmVkdWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkMGQwMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmVkdWN0aW9uLmgKQEAgLTAsMCArMSw3ODEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNiBNZWhkaSBHb2xpLCBDb2RlcGxheSBTb2Z0d2FyZSBMdGQgPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9SRURVQ1RJT05fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1JFRFVDVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yUmVkdWN0aW9uCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFRlbnNvciByZWR1Y3Rpb24gY2xhc3MuCisgICoKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIERpbXMsIHR5cGVuYW1lIFhwclR5cGUsdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8gPgorICBzdHJ1Y3QgdHJhaXRzPFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBYcHJUeXBlLCBNYWtlUG9pbnRlcl8+ID4KKyA6IHRyYWl0czxYcHJUeXBlPgoreworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnMgLSBhcnJheV9zaXplPERpbXM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IE1ha2VQb2ludGVyIHsKKyAgICAvLyBJbnRlcm1lZGlhdGUgdHlwZWRlZiB0byB3b3JrYXJvdW5kIE1TVkMgaXNzdWUuCisgICAgdHlwZWRlZiBNYWtlUG9pbnRlcl88VD4gTWFrZVBvaW50ZXJUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWFrZVBvaW50ZXJUOjpUeXBlIFR5cGU7CisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgZXZhbDxUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgWHByVHlwZSwgTWFrZVBvaW50ZXJfPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBYcHJUeXBlLCBNYWtlUG9pbnRlcl8+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIERpbXMsIHR5cGVuYW1lIFhwclR5cGUsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorc3RydWN0IG5lc3RlZDxUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgWHByVHlwZSwgTWFrZVBvaW50ZXJfPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgWHByVHlwZSwgTWFrZVBvaW50ZXJfPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBYcHJUeXBlLCBNYWtlUG9pbnRlcl8+IHR5cGU7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXREaW1zPiBzdHJ1Y3QgRGltSW5pdGlhbGl6ZXIgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXREaW1zLCB0eXBlbmFtZSBSZWR1Y2VkRGltcz4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IElucHV0RGltcyYgaW5wdXRfZGltcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5PGJvb2wsIGludGVybmFsOjphcnJheV9zaXplPElucHV0RGltcz46OnZhbHVlPiYgcmVkdWNlZCwKKyAgICAgICAgICAgICAgICAgIE91dHB1dERpbXMqIG91dHB1dF9kaW1zLCBSZWR1Y2VkRGltcyogcmVkdWNlZF9kaW1zKSB7CisgICAgY29uc3QgaW50IE51bUlucHV0RGltcyA9IGludGVybmFsOjphcnJheV9zaXplPElucHV0RGltcz46OnZhbHVlOworICAgIGludCBvdXRwdXRJbmRleCA9IDA7CisgICAgaW50IHJlZHVjZUluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bUlucHV0RGltczsgKytpKSB7CisgICAgICBpZiAocmVkdWNlZFtpXSkgeworICAgICAgICAoKnJlZHVjZWRfZGltcylbcmVkdWNlSW5kZXhdID0gaW5wdXRfZGltc1tpXTsKKyAgICAgICAgKytyZWR1Y2VJbmRleDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgqb3V0cHV0X2RpbXMpW291dHB1dEluZGV4XSA9IGlucHV0X2RpbXNbaV07CisgICAgICAgICsrb3V0cHV0SW5kZXg7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGltSW5pdGlhbGl6ZXI8U2l6ZXM8PiA+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0RGltcywgdHlwZW5hbWUgSW5kZXgsIHNpemVfdCBSYW5rPiBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgSW5wdXREaW1zJiBpbnB1dF9kaW1zLCBjb25zdCBhcnJheTxib29sLCBSYW5rPiYsCisgICAgICAgICAgICAgICAgICBTaXplczw+KiwgYXJyYXk8SW5kZXgsIFJhbms+KiByZWR1Y2VkX2RpbXMpIHsKKyAgICBjb25zdCBpbnQgTnVtSW5wdXREaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8SW5wdXREaW1zPjo6dmFsdWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1JbnB1dERpbXM7ICsraSkgeworICAgICAgKCpyZWR1Y2VkX2RpbXMpW2ldID0gaW5wdXRfZGltc1tpXTsKKyAgICB9CisgIH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlZHVjZWREaW1zLCBpbnQgTnVtVGVuc29yRGltcywgaW50IExheW91dD4KK3N0cnVjdCBhcmVfaW5uZXJfbW9zdF9kaW1zIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVkdWNlZERpbXMsIGludCBOdW1UZW5zb3JEaW1zLCBpbnQgTGF5b3V0Pgorc3RydWN0IHByZXNlcnZlX2lubmVyX21vc3RfZGltcyB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCisjaWYgRUlHRU5fSEFTX0NPTlNURVhQUiAmJiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVkdWNlZERpbXMsIGludCBOdW1UZW5zb3JEaW1zPgorc3RydWN0IGFyZV9pbm5lcl9tb3N0X2RpbXM8UmVkdWNlZERpbXMsIE51bVRlbnNvckRpbXMsIENvbE1ham9yPnsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdG1wMSA9IGluZGljZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZTxSZWR1Y2VkRGltcz4oKTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdG1wMiA9IGluZGV4X3N0YXRpY2FsbHlfZXE8UmVkdWNlZERpbXM+KDAsIDApOworICBzdGF0aWMgY29uc3QgYm9vbCB0bXAzID0gaW5kZXhfc3RhdGljYWxseV9lcTxSZWR1Y2VkRGltcz4oYXJyYXlfc2l6ZTxSZWR1Y2VkRGltcz46OnZhbHVlLTEsIGFycmF5X3NpemU8UmVkdWNlZERpbXM+Ojp2YWx1ZS0xKTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0bXAxICYgdG1wMiAmIHRtcDM7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFJlZHVjZWREaW1zLCBpbnQgTnVtVGVuc29yRGltcz4KK3N0cnVjdCBhcmVfaW5uZXJfbW9zdF9kaW1zPFJlZHVjZWREaW1zLCBOdW1UZW5zb3JEaW1zLCBSb3dNYWpvcj57CisgIHN0YXRpYyBjb25zdCBib29sIHRtcDEgPSBpbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8UmVkdWNlZERpbXM+KCk7CisgIHN0YXRpYyBjb25zdCBib29sIHRtcDIgPSBpbmRleF9zdGF0aWNhbGx5X2VxPFJlZHVjZWREaW1zPigwLCBOdW1UZW5zb3JEaW1zIC0gYXJyYXlfc2l6ZTxSZWR1Y2VkRGltcz46OnZhbHVlKTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdG1wMyA9IGluZGV4X3N0YXRpY2FsbHlfZXE8UmVkdWNlZERpbXM+KGFycmF5X3NpemU8UmVkdWNlZERpbXM+Ojp2YWx1ZSAtIDEsIE51bVRlbnNvckRpbXMgLSAxKTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0bXAxICYgdG1wMiAmIHRtcDM7CisKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVkdWNlZERpbXMsIGludCBOdW1UZW5zb3JEaW1zPgorc3RydWN0IHByZXNlcnZlX2lubmVyX21vc3RfZGltczxSZWR1Y2VkRGltcywgTnVtVGVuc29yRGltcywgQ29sTWFqb3I+eworICBzdGF0aWMgY29uc3QgYm9vbCB0bXAxID0gaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlPFJlZHVjZWREaW1zPigpOworICBzdGF0aWMgY29uc3QgYm9vbCB0bXAyID0gaW5kZXhfc3RhdGljYWxseV9ndDxSZWR1Y2VkRGltcz4oMCwgMCk7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdG1wMSAmIHRtcDI7CisKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVkdWNlZERpbXMsIGludCBOdW1UZW5zb3JEaW1zPgorc3RydWN0IHByZXNlcnZlX2lubmVyX21vc3RfZGltczxSZWR1Y2VkRGltcywgTnVtVGVuc29yRGltcywgUm93TWFqb3I+eworICBzdGF0aWMgY29uc3QgYm9vbCB0bXAxID0gaW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlPFJlZHVjZWREaW1zPigpOworICBzdGF0aWMgY29uc3QgYm9vbCB0bXAyID0gaW5kZXhfc3RhdGljYWxseV9sdDxSZWR1Y2VkRGltcz4oYXJyYXlfc2l6ZTxSZWR1Y2VkRGltcz46OnZhbHVlIC0gMSwgTnVtVGVuc29yRGltcyAtIDEpOworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRtcDEgJiB0bXAyOworfTsKKyNlbmRpZgorCisKK3RlbXBsYXRlIDxpbnQgRGltSW5kZXgsIHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wPgorc3RydWN0IEdlbmVyaWNEaW1SZWR1Y2VyIHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgU2VsZiYgc2VsZiwgdHlwZW5hbWUgU2VsZjo6SW5kZXggZmlyc3RJbmRleCwgT3AmIHJlZHVjZXIsIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSogYWNjdW0pIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChEaW1JbmRleCA+IDApLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2VsZi5tX3JlZHVjZWREaW1zW0RpbUluZGV4XTsgKytqKSB7CisgICAgICBjb25zdCB0eXBlbmFtZSBTZWxmOjpJbmRleCBpbnB1dCA9IGZpcnN0SW5kZXggKyBqICogc2VsZi5tX3JlZHVjZWRTdHJpZGVzW0RpbUluZGV4XTsKKyAgICAgIEdlbmVyaWNEaW1SZWR1Y2VyPERpbUluZGV4LTEsIFNlbGYsIE9wPjo6cmVkdWNlKHNlbGYsIGlucHV0LCByZWR1Y2VyLCBhY2N1bSk7CisgICAgfQorICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wPgorc3RydWN0IEdlbmVyaWNEaW1SZWR1Y2VyPDAsIFNlbGYsIE9wPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFNlbGYmIHNlbGYsIHR5cGVuYW1lIFNlbGY6OkluZGV4IGZpcnN0SW5kZXgsIE9wJiByZWR1Y2VyLCB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqIGFjY3VtKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZWxmLm1fcmVkdWNlZERpbXNbMF07ICsraikgeworICAgICAgY29uc3QgdHlwZW5hbWUgU2VsZjo6SW5kZXggaW5wdXQgPSBmaXJzdEluZGV4ICsgaiAqIHNlbGYubV9yZWR1Y2VkU3RyaWRlc1swXTsKKyAgICAgIHJlZHVjZXIucmVkdWNlKHNlbGYubV9pbXBsLmNvZWZmKGlucHV0KSwgYWNjdW0pOworICAgIH0KKyAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBHZW5lcmljRGltUmVkdWNlcjwtMSwgU2VsZiwgT3A+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgU2VsZiYgc2VsZiwgdHlwZW5hbWUgU2VsZjo6SW5kZXggaW5kZXgsIE9wJiByZWR1Y2VyLCB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqIGFjY3VtKSB7CisgICAgcmVkdWNlci5yZWR1Y2Uoc2VsZi5tX2ltcGwuY29lZmYoaW5kZXgpLCBhY2N1bSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcCwgYm9vbCBWZWN0b3JpemFibGUgPSAoU2VsZjo6SW5wdXRQYWNrZXRBY2Nlc3MgJiBPcDo6UGFja2V0QWNjZXNzKT4KK3N0cnVjdCBJbm5lck1vc3REaW1SZWR1Y2VyIHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIHJlZHVjZShjb25zdCBTZWxmJiBzZWxmLCB0eXBlbmFtZSBTZWxmOjpJbmRleCBmaXJzdEluZGV4LCB0eXBlbmFtZSBTZWxmOjpJbmRleCBudW1WYWx1ZXNUb1JlZHVjZSwgT3AmIHJlZHVjZXIpIHsKKyAgICB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUgYWNjdW0gPSByZWR1Y2VyLmluaXRpYWxpemUoKTsKKyAgICBmb3IgKHR5cGVuYW1lIFNlbGY6OkluZGV4IGogPSAwOyBqIDwgbnVtVmFsdWVzVG9SZWR1Y2U7ICsraikgeworICAgICAgcmVkdWNlci5yZWR1Y2Uoc2VsZi5tX2ltcGwuY29lZmYoZmlyc3RJbmRleCArIGopLCAmYWNjdW0pOworICAgIH0KKyAgICByZXR1cm4gcmVkdWNlci5maW5hbGl6ZShhY2N1bSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBJbm5lck1vc3REaW1SZWR1Y2VyPFNlbGYsIE9wLCB0cnVlPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSByZWR1Y2UoY29uc3QgU2VsZiYgc2VsZiwgdHlwZW5hbWUgU2VsZjo6SW5kZXggZmlyc3RJbmRleCwgdHlwZW5hbWUgU2VsZjo6SW5kZXggbnVtVmFsdWVzVG9SZWR1Y2UsIE9wJiByZWR1Y2VyKSB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIFNlbGY6OlBhY2tldFJldHVyblR5cGU+OjpzaXplOworICAgIGNvbnN0IHR5cGVuYW1lIFNlbGY6OkluZGV4IFZlY3Rvcml6ZWRTaXplID0gKG51bVZhbHVlc1RvUmVkdWNlIC8gcGFja2V0U2l6ZSkgKiBwYWNrZXRTaXplOworICAgIHR5cGVuYW1lIFNlbGY6OlBhY2tldFJldHVyblR5cGUgcCA9IHJlZHVjZXIudGVtcGxhdGUgaW5pdGlhbGl6ZVBhY2tldDx0eXBlbmFtZSBTZWxmOjpQYWNrZXRSZXR1cm5UeXBlPigpOworICAgIGZvciAodHlwZW5hbWUgU2VsZjo6SW5kZXggaiA9IDA7IGogPCBWZWN0b3JpemVkU2l6ZTsgaiArPSBwYWNrZXRTaXplKSB7CisgICAgICByZWR1Y2VyLnJlZHVjZVBhY2tldChzZWxmLm1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkPihmaXJzdEluZGV4ICsgaiksICZwKTsKKyAgICB9CisgICAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIGFjY3VtID0gcmVkdWNlci5pbml0aWFsaXplKCk7CisgICAgZm9yICh0eXBlbmFtZSBTZWxmOjpJbmRleCBqID0gVmVjdG9yaXplZFNpemU7IGogPCBudW1WYWx1ZXNUb1JlZHVjZTsgKytqKSB7CisgICAgICByZWR1Y2VyLnJlZHVjZShzZWxmLm1faW1wbC5jb2VmZihmaXJzdEluZGV4ICsgaiksICZhY2N1bSk7CisgICAgfQorICAgIHJldHVybiByZWR1Y2VyLmZpbmFsaXplQm90aChhY2N1bSwgcCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxpbnQgRGltSW5kZXgsIHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wLCBib29sIHZlY3Rvcml6YWJsZSA9IChTZWxmOjpJbnB1dFBhY2tldEFjY2VzcyAmIE9wOjpQYWNrZXRBY2Nlc3MpPgorc3RydWN0IElubmVyTW9zdERpbVByZXNlcnZlciB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFNlbGYmLCB0eXBlbmFtZSBTZWxmOjpJbmRleCwgT3AmLCB0eXBlbmFtZSBTZWxmOjpQYWNrZXRSZXR1cm5UeXBlKikgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IERpbUluZGV4LCB0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBJbm5lck1vc3REaW1QcmVzZXJ2ZXI8RGltSW5kZXgsIFNlbGYsIE9wLCB0cnVlPiB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcmVkdWNlKGNvbnN0IFNlbGYmIHNlbGYsIHR5cGVuYW1lIFNlbGY6OkluZGV4IGZpcnN0SW5kZXgsIE9wJiByZWR1Y2VyLCB0eXBlbmFtZSBTZWxmOjpQYWNrZXRSZXR1cm5UeXBlKiBhY2N1bSkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKERpbUluZGV4ID4gMCksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgZm9yICh0eXBlbmFtZSBTZWxmOjpJbmRleCBqID0gMDsgaiA8IHNlbGYubV9yZWR1Y2VkRGltc1tEaW1JbmRleF07ICsraikgeworICAgICAgY29uc3QgdHlwZW5hbWUgU2VsZjo6SW5kZXggaW5wdXQgPSBmaXJzdEluZGV4ICsgaiAqIHNlbGYubV9yZWR1Y2VkU3RyaWRlc1tEaW1JbmRleF07CisgICAgICBJbm5lck1vc3REaW1QcmVzZXJ2ZXI8RGltSW5kZXgtMSwgU2VsZiwgT3A+OjpyZWR1Y2Uoc2VsZiwgaW5wdXQsIHJlZHVjZXIsIGFjY3VtKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBJbm5lck1vc3REaW1QcmVzZXJ2ZXI8MCwgU2VsZiwgT3AsIHRydWU+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgU2VsZiYgc2VsZiwgdHlwZW5hbWUgU2VsZjo6SW5kZXggZmlyc3RJbmRleCwgT3AmIHJlZHVjZXIsIHR5cGVuYW1lIFNlbGY6OlBhY2tldFJldHVyblR5cGUqIGFjY3VtKSB7CisgICAgZm9yICh0eXBlbmFtZSBTZWxmOjpJbmRleCBqID0gMDsgaiA8IHNlbGYubV9yZWR1Y2VkRGltc1swXTsgKytqKSB7CisgICAgICBjb25zdCB0eXBlbmFtZSBTZWxmOjpJbmRleCBpbnB1dCA9IGZpcnN0SW5kZXggKyBqICogc2VsZi5tX3JlZHVjZWRTdHJpZGVzWzBdOworICAgICAgcmVkdWNlci5yZWR1Y2VQYWNrZXQoc2VsZi5tX2ltcGwudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oaW5wdXQpLCBhY2N1bSk7CisgICAgfQorICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wPgorc3RydWN0IElubmVyTW9zdERpbVByZXNlcnZlcjwtMSwgU2VsZiwgT3AsIHRydWU+IHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgU2VsZiYsIHR5cGVuYW1lIFNlbGY6OkluZGV4LCBPcCYsIHR5cGVuYW1lIFNlbGY6OlBhY2tldFJldHVyblR5cGUqKSB7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7CisgIH0KK307CisKKy8vIERlZmF1bHQgZnVsbCByZWR1Y2VyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3AsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUgPSAoU2VsZjo6SW5wdXRQYWNrZXRBY2Nlc3MgJiBPcDo6UGFja2V0QWNjZXNzKT4KK3N0cnVjdCBGdWxsUmVkdWNlciB7CisgIHN0YXRpYyBjb25zdCBib29sIEhhc09wdGltaXplZEltcGxlbWVudGF0aW9uID0gZmFsc2U7CisKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgcnVuKGNvbnN0IFNlbGYmIHNlbGYsIE9wJiByZWR1Y2VyLCBjb25zdCBEZXZpY2UmLCB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqIG91dHB1dCkgeworICAgIGNvbnN0IHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9jb2VmZnMgPSBhcnJheV9wcm9kKHNlbGYubV9pbXBsLmRpbWVuc2lvbnMoKSk7CisgICAgKm91dHB1dCA9IElubmVyTW9zdERpbVJlZHVjZXI8U2VsZiwgT3AsIFZlY3Rvcml6YWJsZT46OnJlZHVjZShzZWxmLCAwLCBudW1fY29lZmZzLCByZWR1Y2VyKTsKKyAgfQorfTsKKworCisjaWZkZWYgRUlHRU5fVVNFX1RIUkVBRFMKKy8vIE11bHRpdGhyZWFkZWQgZnVsbCByZWR1Y2VycwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wLAorICAgICAgICAgIGJvb2wgVmVjdG9yaXphYmxlID0gKFNlbGY6OklucHV0UGFja2V0QWNjZXNzICYgT3A6OlBhY2tldEFjY2Vzcyk+CitzdHJ1Y3QgRnVsbFJlZHVjZXJTaGFyZCB7CisgIHN0YXRpYyBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFNlbGYmIHNlbGYsIHR5cGVuYW1lIFNlbGY6OkluZGV4IGZpcnN0SW5kZXgsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBTZWxmOjpJbmRleCBudW1WYWx1ZXNUb1JlZHVjZSwgT3AmIHJlZHVjZXIsCisgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqIG91dHB1dCkgeworICAgICpvdXRwdXQgPSBJbm5lck1vc3REaW1SZWR1Y2VyPFNlbGYsIE9wLCBWZWN0b3JpemFibGU+OjpyZWR1Y2UoCisgICAgICAgIHNlbGYsIGZpcnN0SW5kZXgsIG51bVZhbHVlc1RvUmVkdWNlLCByZWR1Y2VyKTsKKyAgfQorfTsKKworLy8gTXVsdGl0aHJlYWRlZCBmdWxsIHJlZHVjZXIKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcCwgYm9vbCBWZWN0b3JpemFibGU+CitzdHJ1Y3QgRnVsbFJlZHVjZXI8U2VsZiwgT3AsIFRocmVhZFBvb2xEZXZpY2UsIFZlY3Rvcml6YWJsZT4geworICBzdGF0aWMgY29uc3QgYm9vbCBIYXNPcHRpbWl6ZWRJbXBsZW1lbnRhdGlvbiA9ICFPcDo6SXNTdGF0ZWZ1bDsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0KKyAgICAgIHVucGFja2V0X3RyYWl0czx0eXBlbmFtZSBTZWxmOjpQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICAvLyBsYXVuY2ggb25lIHJlZHVjZXIgcGVyIHRocmVhZCBhbmQgYWNjdW11bGF0ZSB0aGUgcmVzdWx0LgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgU2VsZiYgc2VsZiwgT3AmIHJlZHVjZXIsIGNvbnN0IFRocmVhZFBvb2xEZXZpY2UmIGRldmljZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSogb3V0cHV0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxmOjpJbmRleCBJbmRleDsKKyAgICBjb25zdCBJbmRleCBudW1fY29lZmZzID0gYXJyYXlfcHJvZChzZWxmLm1faW1wbC5kaW1lbnNpb25zKCkpOworICAgIGlmIChudW1fY29lZmZzID09IDApIHsKKyAgICAgICpvdXRwdXQgPSByZWR1Y2VyLmZpbmFsaXplKHJlZHVjZXIuaW5pdGlhbGl6ZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgVGVuc29yT3BDb3N0IGNvc3QgPQorICAgICAgICBzZWxmLm1faW1wbC5jb3N0UGVyQ29lZmYoVmVjdG9yaXphYmxlKSArCisgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBpbnRlcm5hbDo6ZnVuY3Rvcl90cmFpdHM8T3A+OjpDb3N0LCBWZWN0b3JpemFibGUsCisgICAgICAgICAgICAgICAgICAgICBQYWNrZXRTaXplKTsKKyAgICBjb25zdCBpbnQgbnVtX3RocmVhZHMgPSBUZW5zb3JDb3N0TW9kZWw8VGhyZWFkUG9vbERldmljZT46Om51bVRocmVhZHMoCisgICAgICAgIG51bV9jb2VmZnMsIGNvc3QsIGRldmljZS5udW1UaHJlYWRzKCkpOworICAgIGlmIChudW1fdGhyZWFkcyA9PSAxKSB7CisgICAgICAqb3V0cHV0ID0KKyAgICAgICAgICBJbm5lck1vc3REaW1SZWR1Y2VyPFNlbGYsIE9wLCBWZWN0b3JpemFibGU+OjpyZWR1Y2Uoc2VsZiwgMCwgbnVtX2NvZWZmcywgcmVkdWNlcik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IEluZGV4IGJsb2Nrc2l6ZSA9CisgICAgICAgIHN0ZDo6Zmxvb3I8SW5kZXg+KHN0YXRpY19jYXN0PGZsb2F0PihudW1fY29lZmZzKSAvIG51bV90aHJlYWRzKTsKKyAgICBjb25zdCBJbmRleCBudW1ibG9ja3MgPSBibG9ja3NpemUgPiAwID8gbnVtX2NvZWZmcyAvIGJsb2Nrc2l6ZSA6IDA7CisgICAgZWlnZW5fYXNzZXJ0KG51bV9jb2VmZnMgPj0gbnVtYmxvY2tzICogYmxvY2tzaXplKTsKKworICAgIEJhcnJpZXIgYmFycmllcihpbnRlcm5hbDo6Y29udmVydF9pbmRleDx1bnNpZ25lZCBpbnQ+KG51bWJsb2NrcykpOworICAgIE1heFNpemVWZWN0b3I8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlPiBzaGFyZHMobnVtYmxvY2tzLCByZWR1Y2VyLmluaXRpYWxpemUoKSk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG51bWJsb2NrczsgKytpKSB7CisgICAgICBkZXZpY2UuZW5xdWV1ZV93aXRoX2JhcnJpZXIoJmJhcnJpZXIsICZGdWxsUmVkdWNlclNoYXJkPFNlbGYsIE9wLCBWZWN0b3JpemFibGU+OjpydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgaSAqIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCByZWR1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZHNbaV0pOworICAgIH0KKyAgICB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUgZmluYWxTaGFyZDsKKyAgICBpZiAobnVtYmxvY2tzICogYmxvY2tzaXplIDwgbnVtX2NvZWZmcykgeworICAgICAgZmluYWxTaGFyZCA9IElubmVyTW9zdERpbVJlZHVjZXI8U2VsZiwgT3AsIFZlY3Rvcml6YWJsZT46OnJlZHVjZSgKKyAgICAgICAgICBzZWxmLCBudW1ibG9ja3MgKiBibG9ja3NpemUsIG51bV9jb2VmZnMgLSBudW1ibG9ja3MgKiBibG9ja3NpemUsCisgICAgICAgICAgcmVkdWNlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpbmFsU2hhcmQgPSByZWR1Y2VyLmluaXRpYWxpemUoKTsKKyAgICB9CisgICAgYmFycmllci5XYWl0KCk7CisKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbnVtYmxvY2tzOyArK2kpIHsKKyAgICAgIHJlZHVjZXIucmVkdWNlKHNoYXJkc1tpXSwgJmZpbmFsU2hhcmQpOworICAgIH0KKyAgICAqb3V0cHV0ID0gcmVkdWNlci5maW5hbGl6ZShmaW5hbFNoYXJkKTsKKyAgfQorfTsKKworI2VuZGlmCisKKworLy8gRGVmYXVsdCBpbm5lciByZWR1Y2VyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3AsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBJbm5lclJlZHVjZXIgeworICBzdGF0aWMgY29uc3QgYm9vbCBIYXNPcHRpbWl6ZWRJbXBsZW1lbnRhdGlvbiA9IGZhbHNlOworCisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiwgT3AmLCBjb25zdCBEZXZpY2UmLCB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqLCB0eXBlbmFtZSBTZWxmOjpJbmRleCwgdHlwZW5hbWUgU2VsZjo6SW5kZXgpIHsKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCisvLyBEZWZhdWx0IG91dGVyIHJlZHVjZXIKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IE91dGVyUmVkdWNlciB7CisgIHN0YXRpYyBjb25zdCBib29sIEhhc09wdGltaXplZEltcGxlbWVudGF0aW9uID0gZmFsc2U7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIGJvb2wgcnVuKGNvbnN0IFNlbGYmLCBPcCYsIGNvbnN0IERldmljZSYsIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSosIHR5cGVuYW1lIFNlbGY6OkluZGV4LCB0eXBlbmFtZSBTZWxmOjpJbmRleCkgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiTm90IGltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKworI2lmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkgJiYgZGVmaW5lZChfX0NVREFDQ19fKQordGVtcGxhdGUgPGludCBCLCBpbnQgTiwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4KK19fZ2xvYmFsX18gdm9pZCBGdWxsUmVkdWN0aW9uS2VybmVsKFIsIGNvbnN0IFMsIEksIHR5cGVuYW1lIFM6OkNvZWZmUmV0dXJuVHlwZSosIHVuc2lnbmVkIGludCopOworCisKKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4KK19fZ2xvYmFsX18gdm9pZCBSZWR1Y3Rpb25Jbml0RnVsbFJlZHV4S2VybmVsSGFsZkZsb2F0KFIsIGNvbnN0IFMsIEksIGhhbGYyKik7Cit0ZW1wbGF0ZSA8aW50IEIsIGludCBOLCB0eXBlbmFtZSBTLCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBJPgorX19nbG9iYWxfXyB2b2lkIEZ1bGxSZWR1Y3Rpb25LZXJuZWxIYWxmRmxvYXQoUiwgY29uc3QgUywgSSwgaGFsZiosIGhhbGYyKik7Cit0ZW1wbGF0ZSA8aW50IE5QVCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4KK19fZ2xvYmFsX18gdm9pZCBJbm5lclJlZHVjdGlvbktlcm5lbEhhbGZGbG9hdChSLCBjb25zdCBTLCBJLCBJLCBoYWxmKik7CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8aW50IE5QVCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4KK19fZ2xvYmFsX18gdm9pZCBJbm5lclJlZHVjdGlvbktlcm5lbChSLCBjb25zdCBTLCBJLCBJLCB0eXBlbmFtZSBTOjpDb2VmZlJldHVyblR5cGUqKTsKKwordGVtcGxhdGUgPGludCBOUFQsIHR5cGVuYW1lIFMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIEk+CitfX2dsb2JhbF9fIHZvaWQgT3V0ZXJSZWR1Y3Rpb25LZXJuZWwoUiwgY29uc3QgUywgSSwgSSwgdHlwZW5hbWUgUzo6Q29lZmZSZXR1cm5UeXBlKik7CisjZW5kaWYKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgWHByVHlwZSwgIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorY2xhc3MgVGVuc29yUmVkdWN0aW9uT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgWHByVHlwZSwgTWFrZVBvaW50ZXJfPiwgUmVhZE9ubHlBY2Nlc3NvcnM+IHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUmVkdWN0aW9uT3A+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZT46OnR5cGUgQ29lZmZSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yUmVkdWN0aW9uT3A+Ojp0eXBlIE5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclJlZHVjdGlvbk9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JSZWR1Y3Rpb25PcD46OkluZGV4IEluZGV4OworCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIFRlbnNvclJlZHVjdGlvbk9wKGNvbnN0IFhwclR5cGUmIGV4cHIsIGNvbnN0IERpbXMmIGRpbXMpIDogbV9leHByKGV4cHIpLCBtX2RpbXMoZGltcykKKyAgICB7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgVGVuc29yUmVkdWN0aW9uT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgRGltcyYgZGltcywgY29uc3QgT3AmIHJlZHVjZXIpIDogbV9leHByKGV4cHIpLCBtX2RpbXMoZGltcyksIG1fcmVkdWNlcihyZWR1Y2VyKQorICAgIHsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICAgIGNvbnN0IFhwclR5cGUmIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2V4cHI7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgY29uc3QgRGltcyYgZGltcygpIGNvbnN0IHsgcmV0dXJuIG1fZGltczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBjb25zdCBPcCYgcmVkdWNlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmVkdWNlcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV9leHByOworICAgIGNvbnN0IERpbXMgbV9kaW1zOworICAgIGNvbnN0IE9wIG1fcmVkdWNlcjsKK307CisKKworLy8gRXZhbCBhcyBydmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBEaW1zLCB0eXBlbmFtZSBBcmdUeXBlLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXywgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgQXJnVHlwZSwgTWFrZVBvaW50ZXJfPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBBcmdUeXBlLCBNYWtlUG9pbnRlcl8+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgQXJnVHlwZSBDaGlsZFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMgSW5wdXREaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IE51bUlucHV0RGltcyA9IGludGVybmFsOjphcnJheV9zaXplPElucHV0RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bVJlZHVjZWREaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8RGltcz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IE51bU91dHB1dERpbXMgPSBOdW1JbnB1dERpbXMgLSBOdW1SZWR1Y2VkRGltczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtT3V0cHV0RGltcz09MCwgU2l6ZXM8PiwgRFNpemVzPEluZGV4LCBOdW1PdXRwdXREaW1zPiA+Ojp0eXBlIERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVkdWN0aW9uT3A8T3AsIERpbXMsIEFyZ1R5cGUsIE1ha2VQb2ludGVyXz4sIERldmljZT4gU2VsZjsKKyAgc3RhdGljIGNvbnN0IGJvb2wgSW5wdXRQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBTZWxmOjpJbnB1dFBhY2tldEFjY2VzcyAmJiBPcDo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBzdGF0aWMgY29uc3QgYm9vbCBSZWR1Y2luZ0lubmVyTW9zdERpbXMgPSBpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zLCBOdW1JbnB1dERpbXMsIExheW91dD46OnZhbHVlOworICBzdGF0aWMgY29uc3QgYm9vbCBQcmVzZXJ2aW5nSW5uZXJNb3N0RGltcyA9IGludGVybmFsOjpwcmVzZXJ2ZV9pbm5lcl9tb3N0X2RpbXM8RGltcywgTnVtSW5wdXREaW1zLCBMYXlvdXQ+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgUnVubmluZ0Z1bGxSZWR1Y3Rpb24gPSAoTnVtT3V0cHV0RGltcz09MCk7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLCBtX3JlZHVjZXIob3AucmVkdWNlcigpKSwgbV9yZXN1bHQoTlVMTCksIG1fZGV2aWNlKGRldmljZSksIG1feHByX2RpbXMob3AuZGltcygpKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtSW5wdXREaW1zID49IE51bVJlZHVjZWREaW1zKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCghUmVkdWNpbmdJbm5lck1vc3REaW1zIHwgIVByZXNlcnZpbmdJbm5lck1vc3REaW1zIHwgKE51bVJlZHVjZWREaW1zID09IE51bUlucHV0RGltcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIC8vIEJ1aWxkIHRoZSBiaXRtYXAgaW5kaWNhdGluZyBpZiBhbiBpbnB1dCBkaW1lbnNpb24gaXMgcmVkdWNlZCBvciBub3QuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1JbnB1dERpbXM7ICsraSkgeworICAgICAgbV9yZWR1Y2VkW2ldID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtUmVkdWNlZERpbXM7ICsraSkgeworICAgICAgZWlnZW5fYXNzZXJ0KG9wLmRpbXMoKVtpXSA+PSAwKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChvcC5kaW1zKClbaV0gPCBOdW1JbnB1dERpbXMpOworICAgICAgbV9yZWR1Y2VkW29wLmRpbXMoKVtpXV0gPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zJiBpbnB1dF9kaW1zID0gbV9pbXBsLmRpbWVuc2lvbnMoKTsKKyAgICBpbnRlcm5hbDo6RGltSW5pdGlhbGl6ZXI8RGltZW5zaW9ucz46OnJ1bihpbnB1dF9kaW1zLCBtX3JlZHVjZWQsICZtX2RpbWVuc2lvbnMsICZtX3JlZHVjZWREaW1zKTsKKworICAgIC8vIFByZWNvbXB1dGUgb3V0cHV0IHN0cmlkZXMuCisgICAgaWYgKE51bU91dHB1dERpbXMgPiAwKSB7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1swXSA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTnVtT3V0cHV0RGltczsgKytpKSB7CisgICAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2kgLSAxXSAqIG1fZGltZW5zaW9uc1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fb3V0cHV0U3RyaWRlcy5iYWNrKCkgPSAxOworICAgICAgICBmb3IgKGludCBpID0gTnVtT3V0cHV0RGltcyAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2kgKyAxXSAqIG1fZGltZW5zaW9uc1tpICsgMV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcmVjb21wdXRlIGlucHV0IHN0cmlkZXMuCisgICAgaWYgKE51bUlucHV0RGltcyA+IDApIHsKKyAgICAgIGFycmF5PEluZGV4LCBOdW1JbnB1dERpbXM+IGlucHV0X3N0cmlkZXM7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgIGlucHV0X3N0cmlkZXNbMF0gPSAxOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bUlucHV0RGltczsgKytpKSB7CisgICAgICAgICAgaW5wdXRfc3RyaWRlc1tpXSA9IGlucHV0X3N0cmlkZXNbaS0xXSAqIGlucHV0X2RpbXNbaS0xXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRfc3RyaWRlcy5iYWNrKCkgPSAxOworICAgICAgICBmb3IgKGludCBpID0gTnVtSW5wdXREaW1zIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICBpbnB1dF9zdHJpZGVzW2ldID0gaW5wdXRfc3RyaWRlc1tpICsgMV0gKiBpbnB1dF9kaW1zW2kgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbnQgb3V0cHV0SW5kZXggPSAwOworICAgICAgaW50IHJlZHVjZUluZGV4ID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtSW5wdXREaW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1fcmVkdWNlZFtpXSkgeworICAgICAgICAgIG1fcmVkdWNlZFN0cmlkZXNbcmVkdWNlSW5kZXhdID0gaW5wdXRfc3RyaWRlc1tpXTsKKyAgICAgICAgICArK3JlZHVjZUluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fcHJlc2VydmVkU3RyaWRlc1tvdXRwdXRJbmRleF0gPSBpbnB1dF9zdHJpZGVzW2ldOworICAgICAgICAgICsrb3V0cHV0SW5kZXg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZ1bGwgcmVkdWN0aW9ucworICAgIGlmIChOdW1PdXRwdXREaW1zID09IDApIHsKKyAgICAgIG1fcHJlc2VydmVkU3RyaWRlc1swXSA9IGludGVybmFsOjphcnJheV9wcm9kKGlucHV0X2RpbXMpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZCh0eXBlbmFtZSBNYWtlUG9pbnRlcl88Q29lZmZSZXR1cm5UeXBlPjo6VHlwZSBkYXRhKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworCisgICAgLy8gVXNlIHRoZSBGdWxsUmVkdWNlciBpZiBwb3NzaWJsZS4KKyAgICBpZiAoKFJ1bm5pbmdGdWxsUmVkdWN0aW9uICYmIFJ1bm5pbmdPblN5Y2wpIHx8KFJ1bm5pbmdGdWxsUmVkdWN0aW9uICYmCisgICAgICAgIGludGVybmFsOjpGdWxsUmVkdWNlcjxTZWxmLCBPcCwgRGV2aWNlPjo6SGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gJiYKKyAgICAgICAgKChSdW5uaW5nT25HUFUgJiYgKG1fZGV2aWNlLm1ham9yRGV2aWNlVmVyc2lvbigpID49IDMpKSB8fAorICAgICAgICAgIVJ1bm5pbmdPbkdQVSkpKSB7CisgICAgICBib29sIG5lZWRfYXNzaWduID0gZmFsc2U7CisgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgbV9yZXN1bHQgPSBzdGF0aWNfY2FzdDxDb2VmZlJldHVyblR5cGUqPihtX2RldmljZS5hbGxvY2F0ZShzaXplb2YoQ29lZmZSZXR1cm5UeXBlKSkpOworICAgICAgICBkYXRhID0gbV9yZXN1bHQ7CisgICAgICAgIG5lZWRfYXNzaWduID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIE9wIHJlZHVjZXIobV9yZWR1Y2VyKTsKKyAgICAgIGludGVybmFsOjpGdWxsUmVkdWNlcjxTZWxmLCBPcCwgRGV2aWNlPjo6cnVuKCp0aGlzLCByZWR1Y2VyLCBtX2RldmljZSwgZGF0YSk7CisgICAgICByZXR1cm4gbmVlZF9hc3NpZ247CisgICAgfQorICAgIGVsc2UgaWYoUnVubmluZ09uU3ljbCl7CisgICAgICBjb25zdCBJbmRleCBudW1fdmFsdWVzX3RvX3JlZHVjZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fcmVkdWNlZERpbXMpOworICAgICAgY29uc3QgSW5kZXggbnVtX2NvZWZmc190b19wcmVzZXJ2ZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fZGltZW5zaW9ucyk7CisgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgZGF0YSA9IHN0YXRpY19jYXN0PENvZWZmUmV0dXJuVHlwZSo+KG1fZGV2aWNlLmFsbG9jYXRlKHNpemVvZihDb2VmZlJldHVyblR5cGUpICogbnVtX2NvZWZmc190b19wcmVzZXJ2ZSkpOworICAgICAgICBtX3Jlc3VsdCA9IGRhdGE7CisgICAgICB9CisgICAgICBPcCByZWR1Y2VyKG1fcmVkdWNlcik7CisgICAgICBpbnRlcm5hbDo6SW5uZXJSZWR1Y2VyPFNlbGYsIE9wLCBEZXZpY2U+OjpydW4oKnRoaXMsIHJlZHVjZXIsIG1fZGV2aWNlLCBkYXRhLCBudW1fdmFsdWVzX3RvX3JlZHVjZSwgbnVtX2NvZWZmc190b19wcmVzZXJ2ZSk7CisgICAgICByZXR1cm4gKG1fcmVzdWx0ICE9IE5VTEwpOworICAgIH0KKworICAgIC8vIEF0dGVtcHQgdG8gdXNlIGFuIG9wdGltaXplZCByZWR1Y3Rpb24uCisgICAgZWxzZSBpZiAoUnVubmluZ09uR1BVICYmIChtX2RldmljZS5tYWpvckRldmljZVZlcnNpb24oKSA+PSAzKSkgeworICAgICAgYm9vbCByZWR1Y2luZ19pbm5lcl9kaW1zID0gdHJ1ZTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtUmVkdWNlZERpbXM7ICsraSkgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICAgICAgcmVkdWNpbmdfaW5uZXJfZGltcyAmPSBtX3JlZHVjZWRbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVkdWNpbmdfaW5uZXJfZGltcyAmPSBtX3JlZHVjZWRbTnVtSW5wdXREaW1zIC0gMSAtIGldOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaW50ZXJuYWw6OklubmVyUmVkdWNlcjxTZWxmLCBPcCwgRGV2aWNlPjo6SGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gJiYKKyAgICAgICAgICAocmVkdWNpbmdfaW5uZXJfZGltcyB8fCBSZWR1Y2luZ0lubmVyTW9zdERpbXMpKSB7CisgICAgICAgIGNvbnN0IEluZGV4IG51bV92YWx1ZXNfdG9fcmVkdWNlID0gaW50ZXJuYWw6OmFycmF5X3Byb2QobV9yZWR1Y2VkRGltcyk7CisgICAgICAgIGNvbnN0IEluZGV4IG51bV9jb2VmZnNfdG9fcHJlc2VydmUgPSBpbnRlcm5hbDo6YXJyYXlfcHJvZChtX2RpbWVuc2lvbnMpOworICAgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgICBpZiAobnVtX2NvZWZmc190b19wcmVzZXJ2ZSA8IDEwMjQgJiYgbnVtX3ZhbHVlc190b19yZWR1Y2UgPiBudW1fY29lZmZzX3RvX3ByZXNlcnZlICYmIG51bV92YWx1ZXNfdG9fcmVkdWNlID4gMTI4KSB7CisgICAgICAgICAgICBkYXRhID0gc3RhdGljX2Nhc3Q8Q29lZmZSZXR1cm5UeXBlKj4obV9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKENvZWZmUmV0dXJuVHlwZSkgKiBudW1fY29lZmZzX3RvX3ByZXNlcnZlKSk7CisgICAgICAgICAgICBtX3Jlc3VsdCA9IGRhdGE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9wIHJlZHVjZXIobV9yZWR1Y2VyKTsKKyAgICAgICAgaWYgKGludGVybmFsOjpJbm5lclJlZHVjZXI8U2VsZiwgT3AsIERldmljZT46OnJ1bigqdGhpcywgcmVkdWNlciwgbV9kZXZpY2UsIGRhdGEsIG51bV92YWx1ZXNfdG9fcmVkdWNlLCBudW1fY29lZmZzX3RvX3ByZXNlcnZlKSkgeworICAgICAgICAgIGlmIChtX3Jlc3VsdCkgeworICAgICAgICAgICAgbV9kZXZpY2UuZGVhbGxvY2F0ZShtX3Jlc3VsdCk7CisgICAgICAgICAgICBtX3Jlc3VsdCA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAobV9yZXN1bHQgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYm9vbCBwcmVzZXJ2aW5nX2lubmVyX2RpbXMgPSB0cnVlOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1SZWR1Y2VkRGltczsgKytpKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgICAgICBwcmVzZXJ2aW5nX2lubmVyX2RpbXMgJj0gbV9yZWR1Y2VkW051bUlucHV0RGltcyAtIDEgLSBpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmVzZXJ2aW5nX2lubmVyX2RpbXMgJj0gbV9yZWR1Y2VkW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaW50ZXJuYWw6Ok91dGVyUmVkdWNlcjxTZWxmLCBPcCwgRGV2aWNlPjo6SGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gJiYKKyAgICAgICAgICBwcmVzZXJ2aW5nX2lubmVyX2RpbXMpIHsKKyAgICAgICAgY29uc3QgSW5kZXggbnVtX3ZhbHVlc190b19yZWR1Y2UgPSBpbnRlcm5hbDo6YXJyYXlfcHJvZChtX3JlZHVjZWREaW1zKTsKKyAgICAgICAgY29uc3QgSW5kZXggbnVtX2NvZWZmc190b19wcmVzZXJ2ZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fZGltZW5zaW9ucyk7CisgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgIGlmIChudW1fY29lZmZzX3RvX3ByZXNlcnZlIDwgMTAyNCAmJiBudW1fdmFsdWVzX3RvX3JlZHVjZSA+IG51bV9jb2VmZnNfdG9fcHJlc2VydmUgJiYgbnVtX3ZhbHVlc190b19yZWR1Y2UgPiAzMikgeworICAgICAgICAgICAgZGF0YSA9IHN0YXRpY19jYXN0PENvZWZmUmV0dXJuVHlwZSo+KG1fZGV2aWNlLmFsbG9jYXRlKHNpemVvZihDb2VmZlJldHVyblR5cGUpICogbnVtX2NvZWZmc190b19wcmVzZXJ2ZSkpOworICAgICAgICAgICAgbV9yZXN1bHQgPSBkYXRhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBPcCByZWR1Y2VyKG1fcmVkdWNlcik7CisgICAgICAgIGlmIChpbnRlcm5hbDo6T3V0ZXJSZWR1Y2VyPFNlbGYsIE9wLCBEZXZpY2U+OjpydW4oKnRoaXMsIHJlZHVjZXIsIG1fZGV2aWNlLCBkYXRhLCBudW1fdmFsdWVzX3RvX3JlZHVjZSwgbnVtX2NvZWZmc190b19wcmVzZXJ2ZSkpIHsKKyAgICAgICAgICBpZiAobV9yZXN1bHQpIHsKKyAgICAgICAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9yZXN1bHQpOworICAgICAgICAgICAgbV9yZXN1bHQgPSBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gKG1fcmVzdWx0ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgICBpZiAobV9yZXN1bHQpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9yZXN1bHQpOworICAgICAgbV9yZXN1bHQgPSBOVUxMOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgaWYgKChSdW5uaW5nT25TeWNsIHx8IFJ1bm5pbmdGdWxsUmVkdWN0aW9uIHx8IFJ1bm5pbmdPbkdQVSkgJiYgbV9yZXN1bHQpIHsKKyAgICAgIHJldHVybiAqKG1fcmVzdWx0ICsgaW5kZXgpOworICAgIH0KKyAgICBPcCByZWR1Y2VyKG1fcmVkdWNlcik7CisgICAgaWYgKFJlZHVjaW5nSW5uZXJNb3N0RGltcyB8fCBSdW5uaW5nRnVsbFJlZHVjdGlvbikgeworICAgICAgY29uc3QgSW5kZXggbnVtX3ZhbHVlc190b19yZWR1Y2UgPQorICAgICAgICAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSA/IG1fcHJlc2VydmVkU3RyaWRlc1swXSA6IG1fcHJlc2VydmVkU3RyaWRlc1tOdW1QcmVzZXJ2ZWRTdHJpZGVzIC0gMV07CisgICAgICByZXR1cm4gaW50ZXJuYWw6OklubmVyTW9zdERpbVJlZHVjZXI8U2VsZiwgT3A+OjpyZWR1Y2UoKnRoaXMsIGZpcnN0SW5wdXQoaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWx1ZXNfdG9fcmVkdWNlLCByZWR1Y2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIGFjY3VtID0gcmVkdWNlci5pbml0aWFsaXplKCk7CisgICAgICBpbnRlcm5hbDo6R2VuZXJpY0RpbVJlZHVjZXI8TnVtUmVkdWNlZERpbXMtMSwgU2VsZiwgT3A+OjpyZWR1Y2UoKnRoaXMsIGZpcnN0SW5wdXQoaW5kZXgpLCByZWR1Y2VyLCAmYWNjdW0pOworICAgICAgcmV0dXJuIHJlZHVjZXIuZmluYWxpemUoYWNjdW0pOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8oYnN0ZWluZXIpOiBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24uCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCArIFBhY2tldFNpemUgLSAxIDwgSW5kZXgoaW50ZXJuYWw6OmFycmF5X3Byb2QoZGltZW5zaW9ucygpKSkpOworCisgICAgaWYgKFJ1bm5pbmdPbkdQVSAmJiBtX3Jlc3VsdCkgeworICAgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZDxQYWNrZXRSZXR1cm5UeXBlPihtX3Jlc3VsdCArIGluZGV4KTsKKyAgICB9CisKKyAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICBpZiAoUmVkdWNpbmdJbm5lck1vc3REaW1zKSB7CisgICAgICBjb25zdCBJbmRleCBudW1fdmFsdWVzX3RvX3JlZHVjZSA9CisgICAgICAgIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpID8gbV9wcmVzZXJ2ZWRTdHJpZGVzWzBdIDogbV9wcmVzZXJ2ZWRTdHJpZGVzW051bVByZXNlcnZlZFN0cmlkZXMgLSAxXTsKKyAgICAgIGNvbnN0IEluZGV4IGZpcnN0SW5kZXggPSBmaXJzdElucHV0KGluZGV4KTsKKyAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgICAgT3AgcmVkdWNlcihtX3JlZHVjZXIpOworICAgICAgICB2YWx1ZXNbaV0gPSBpbnRlcm5hbDo6SW5uZXJNb3N0RGltUmVkdWNlcjxTZWxmLCBPcD46OnJlZHVjZSgqdGhpcywgZmlyc3RJbmRleCArIGkgKiBudW1fdmFsdWVzX3RvX3JlZHVjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbHVlc190b19yZWR1Y2UsIHJlZHVjZXIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHJlc2VydmluZ0lubmVyTW9zdERpbXMpIHsKKyAgICAgIGNvbnN0IEluZGV4IGZpcnN0SW5kZXggPSBmaXJzdElucHV0KGluZGV4KTsKKyAgICAgIGNvbnN0IGludCBpbm5lcm1vc3RfZGltID0gKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgPyAwIDogTnVtT3V0cHV0RGltcyAtIDE7CisgICAgICAvLyBUQkQ6IGV4dGVuZCB0aGlzIHRoZSB0aGUgbiBpbm5lcm1vc3QgZGltZW5zaW9ucyB0aGF0IHdlIHByZXNlcnZlLgorICAgICAgaWYgKCgoZmlyc3RJbmRleCAlIG1fZGltZW5zaW9uc1tpbm5lcm1vc3RfZGltXSkgKyBQYWNrZXRTaXplIC0gMSkgPCBtX2RpbWVuc2lvbnNbaW5uZXJtb3N0X2RpbV0pIHsKKyAgICAgICAgT3AgcmVkdWNlcihtX3JlZHVjZXIpOworICAgICAgICB0eXBlbmFtZSBTZWxmOjpQYWNrZXRSZXR1cm5UeXBlIGFjY3VtID0gcmVkdWNlci50ZW1wbGF0ZSBpbml0aWFsaXplUGFja2V0PHR5cGVuYW1lIFNlbGY6OlBhY2tldFJldHVyblR5cGU+KCk7CisgICAgICAgIGludGVybmFsOjpJbm5lck1vc3REaW1QcmVzZXJ2ZXI8TnVtUmVkdWNlZERpbXMtMSwgU2VsZiwgT3A+OjpyZWR1Y2UoKnRoaXMsIGZpcnN0SW5kZXgsIHJlZHVjZXIsICZhY2N1bSk7CisgICAgICAgIHJldHVybiByZWR1Y2VyLmZpbmFsaXplUGFja2V0KGFjY3VtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICAgICAgdmFsdWVzW2ldID0gY29lZmYoaW5kZXggKyBpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgeworICAgICAgICB2YWx1ZXNbaV0gPSBjb2VmZihpbmRleCArIGkpOworICAgICAgfQorICAgIH0KKyAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICByZXR1cm4gcnNsdDsKKyAgfQorCisgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIGV2YWxTdWJFeHByc0lmTmVlZGVkKCkuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICBpZiAoUnVubmluZ0Z1bGxSZWR1Y3Rpb24gJiYgbV9yZXN1bHQpIHsKKyAgICAgIHJldHVybiBUZW5zb3JPcENvc3Qoc2l6ZW9mKENvZWZmUmV0dXJuVHlwZSksIDAsIDAsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBJbmRleCBudW1fdmFsdWVzX3RvX3JlZHVjZSA9IGludGVybmFsOjphcnJheV9wcm9kKG1fcmVkdWNlZERpbXMpOworICAgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IG51bV92YWx1ZXNfdG9fcmVkdWNlICogaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPE9wPjo6Q29zdDsKKyAgICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQpICogbnVtX3ZhbHVlc190b19yZWR1Y2UgKworICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHR5cGVuYW1lIE1ha2VQb2ludGVyXzxTY2FsYXI+OjpUeXBlIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX3Jlc3VsdDsgfQorICAvLy8gcmVxdWlyZWQgYnkgc3ljbCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBhY2Nlc3NvcgorICBjb25zdCBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiYgaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQorICAvLy8gYWRkZWQgZm9yIHN5Y2wgaW4gb3JkZXIgdG8gY29uc3RydWN0IHRoZSBidWZmZXIgZnJvbSB0aGUgc3ljbCBkZXZpY2UKKyAgY29uc3QgRGV2aWNlJiBkZXZpY2UoKSBjb25zdHtyZXR1cm4gbV9kZXZpY2U7fQorICAvLy8gYWRkZWQgZm9yIHN5Y2wgaW4gb3JkZXIgdG8gcmUtY29uc3RydWN0IHRoZSByZWR1Y3Rpb24gZXZhbCBvbiB0aGUgZGV2aWNlIGZvciB0aGUgc3ViLWtlcm5lbAorICBjb25zdCBEaW1zJiB4cHJEaW1zKCkgY29uc3Qge3JldHVybiBtX3hwcl9kaW1zO30KKworCisgIHByaXZhdGU6CisgIHRlbXBsYXRlIDxpbnQsIHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6R2VuZXJpY0RpbVJlZHVjZXI7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIGJvb2w+IGZyaWVuZCBzdHJ1Y3QgaW50ZXJuYWw6OklubmVyTW9zdERpbVJlZHVjZXI7CisgIHRlbXBsYXRlIDxpbnQsIHR5cGVuYW1lLCB0eXBlbmFtZSwgYm9vbD4gZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6SW5uZXJNb3N0RGltUHJlc2VydmVyOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgTywgdHlwZW5hbWUgRCwgYm9vbCBWPiBmcmllbmQgc3RydWN0IGludGVybmFsOjpGdWxsUmVkdWNlcjsKKyNpZmRlZiBFSUdFTl9VU0VfVEhSRUFEUworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgTywgYm9vbCBWPiBmcmllbmQgc3RydWN0IGludGVybmFsOjpGdWxsUmVkdWNlclNoYXJkOworI2VuZGlmCisjaWYgZGVmaW5lZChFSUdFTl9VU0VfR1BVKSAmJiBkZWZpbmVkKF9fQ1VEQUNDX18pCisgIHRlbXBsYXRlIDxpbnQgQiwgaW50IE4sIHR5cGVuYW1lIFMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIEk+IGZyaWVuZCB2b2lkIGludGVybmFsOjpGdWxsUmVkdWN0aW9uS2VybmVsKFIsIGNvbnN0IFMsIEksIHR5cGVuYW1lIFM6OkNvZWZmUmV0dXJuVHlwZSosIHVuc2lnbmVkIGludCopOworI2lmZGVmIEVJR0VOX0hBU19DVURBX0ZQMTYKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIEk+IGZyaWVuZCB2b2lkIGludGVybmFsOjpSZWR1Y3Rpb25Jbml0RnVsbFJlZHV4S2VybmVsSGFsZkZsb2F0KFIsIGNvbnN0IFMsIEksIGhhbGYyKik7CisgIHRlbXBsYXRlIDxpbnQgQiwgaW50IE4sIHR5cGVuYW1lIFMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIEk+IGZyaWVuZCB2b2lkIGludGVybmFsOjpGdWxsUmVkdWN0aW9uS2VybmVsSGFsZkZsb2F0KFIsIGNvbnN0IFMsIEksIGhhbGYqLCBoYWxmMiopOworICB0ZW1wbGF0ZSA8aW50IE5QVCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4gZnJpZW5kIHZvaWQgaW50ZXJuYWw6OklubmVyUmVkdWN0aW9uS2VybmVsSGFsZkZsb2F0KFIsIGNvbnN0IFMsIEksIEksIGhhbGYqKTsKKyNlbmRpZgorICB0ZW1wbGF0ZSA8aW50IE5QVCwgdHlwZW5hbWUgUywgdHlwZW5hbWUgUiwgdHlwZW5hbWUgST4gZnJpZW5kIHZvaWQgaW50ZXJuYWw6OklubmVyUmVkdWN0aW9uS2VybmVsKFIsIGNvbnN0IFMsIEksIEksIHR5cGVuYW1lIFM6OkNvZWZmUmV0dXJuVHlwZSopOworCisgIHRlbXBsYXRlIDxpbnQgTlBULCB0eXBlbmFtZSBTLCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBJPiBmcmllbmQgdm9pZCBpbnRlcm5hbDo6T3V0ZXJSZWR1Y3Rpb25LZXJuZWwoUiwgY29uc3QgUywgSSwgSSwgdHlwZW5hbWUgUzo6Q29lZmZSZXR1cm5UeXBlKik7CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgTywgdHlwZW5hbWUgRD4gZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6SW5uZXJSZWR1Y2VyOworCisgIC8vIFJldHVybnMgdGhlIEluZGV4IGluIHRoZSBpbnB1dCB0ZW5zb3Igb2YgdGhlIGZpcnN0IHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUKKyAgLy8gdXNlZCB0byBjb21wdXRlIHRoZSByZWR1Y3Rpb24gYXQgb3V0cHV0IGluZGV4ICJpbmRleCIuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggZmlyc3RJbnB1dChJbmRleCBpbmRleCkgY29uc3QgeworICAgIGlmIChSZWR1Y2luZ0lubmVyTW9zdERpbXMpIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4ICogbV9wcmVzZXJ2ZWRTdHJpZGVzWzBdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGluZGV4ICogbV9wcmVzZXJ2ZWRTdHJpZGVzW051bVByZXNlcnZlZFN0cmlkZXMgLSAxXTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gVEJEOiBvcHRpbWl6ZSB0aGUgY2FzZSB3aGVyZSB3ZSBwcmVzZXJ2ZSB0aGUgaW5uZXJtb3N0IGRpbWVuc2lvbnMuCisgICAgSW5kZXggc3RhcnRJbnB1dCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bU91dHB1dERpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIC8vIFRoaXMgaXMgaW5kZXhfaSBpbiB0aGUgb3V0cHV0IHRlbnNvci4KKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIHN0YXJ0SW5wdXQgKz0gaWR4ICogbV9wcmVzZXJ2ZWRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpZiAoUHJlc2VydmluZ0lubmVyTW9zdERpbXMpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG1fcHJlc2VydmVkU3RyaWRlc1swXSA9PSAxKTsKKyAgICAgICAgc3RhcnRJbnB1dCArPSBpbmRleDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0SW5wdXQgKz0gaW5kZXggKiBtX3ByZXNlcnZlZFN0cmlkZXNbMF07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtT3V0cHV0RGltcyAtIDE7ICsraSkgeworICAgICAgICAvLyBUaGlzIGlzIGluZGV4X2kgaW4gdGhlIG91dHB1dCB0ZW5zb3IuCisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBzdGFydElucHV0ICs9IGlkeCAqIG1fcHJlc2VydmVkU3RyaWRlc1tpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgaWYgKFByZXNlcnZpbmdJbm5lck1vc3REaW1zKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX3ByZXNlcnZlZFN0cmlkZXNbTnVtUHJlc2VydmVkU3RyaWRlcyAtIDFdID09IDEpOworICAgICAgICBzdGFydElucHV0ICs9IGluZGV4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnRJbnB1dCArPSBpbmRleCAqIG1fcHJlc2VydmVkU3RyaWRlc1tOdW1QcmVzZXJ2ZWRTdHJpZGVzIC0gMV07CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGFydElucHV0OworICB9CisKKyAgLy8gQml0bWFwIGluZGljYXRpbmcgaWYgYW4gaW5wdXQgZGltZW5zaW9uIGlzIHJlZHVjZWQgb3Igbm90LgorICBhcnJheTxib29sLCBOdW1JbnB1dERpbXM+IG1fcmVkdWNlZDsKKyAgLy8gRGltZW5zaW9ucyBvZiB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICAvLyBQcmVjb21wdXRlZCBzdHJpZGVzIGZvciB0aGUgb3V0cHV0IHRlbnNvci4KKyAgYXJyYXk8SW5kZXgsIE51bU91dHB1dERpbXM+IG1fb3V0cHV0U3RyaWRlczsKKyAgLy8gU3Vic2V0IG9mIHN0cmlkZXMgb2YgdGhlIGlucHV0IHRlbnNvciBmb3IgdGhlIG5vbi1yZWR1Y2VkIGRpbWVuc2lvbnMuCisgIC8vIEluZGV4ZWQgYnkgb3V0cHV0IGRpbWVuc2lvbnMuCisgIHN0YXRpYyBjb25zdCBpbnQgTnVtUHJlc2VydmVkU3RyaWRlcyA9IG1heF9uXzE8TnVtT3V0cHV0RGltcz46OnNpemU7CisgIGFycmF5PEluZGV4LCBOdW1QcmVzZXJ2ZWRTdHJpZGVzPiBtX3ByZXNlcnZlZFN0cmlkZXM7CisKKyAgLy8gU3Vic2V0IG9mIHN0cmlkZXMgb2YgdGhlIGlucHV0IHRlbnNvciBmb3IgdGhlIHJlZHVjZWQgZGltZW5zaW9ucy4KKyAgLy8gSW5kZXhlZCBieSByZWR1Y2VkIGRpbWVuc2lvbnMuCisgIGFycmF5PEluZGV4LCBOdW1SZWR1Y2VkRGltcz4gbV9yZWR1Y2VkU3RyaWRlczsKKyAgLy8gU2l6ZSBvZiB0aGUgaW5wdXQgZGltZW5zaW9ucyB0aGF0IGFyZSByZWR1Y2VkLgorICAvLyBJbmRleGVkIGJ5IHJlZHVjZWQgZGltZW5zaW9ucy4KKyAgYXJyYXk8SW5kZXgsIE51bVJlZHVjZWREaW1zPiBtX3JlZHVjZWREaW1zOworCisgIC8vIEV2YWx1YXRvciBmb3IgdGhlIGlucHV0IGV4cHJlc3Npb24uCisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKKworICAvLyBPcGVyYXRpb24gdG8gYXBwbHkgZm9yIGNvbXB1dGluZyB0aGUgcmVkdWN0aW9uLgorICBPcCBtX3JlZHVjZXI7CisKKyAgLy8gRm9yIGZ1bGwgcmVkdWN0aW9ucworI2lmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkgJiYgZGVmaW5lZChfX0NVREFDQ19fKQorICBzdGF0aWMgY29uc3QgYm9vbCBSdW5uaW5nT25HUFUgPSBpbnRlcm5hbDo6aXNfc2FtZTxEZXZpY2UsIEVpZ2VuOjpHcHVEZXZpY2U+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgUnVubmluZ09uU3ljbCA9IGZhbHNlOworI2VsaWYgZGVmaW5lZChFSUdFTl9VU0VfU1lDTCkKK3N0YXRpYyBjb25zdCBib29sIFJ1bm5pbmdPblN5Y2wgPSBpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXZpY2U+Ojp0eXBlLCBFaWdlbjo6U3ljbERldmljZT46OnZhbHVlOworc3RhdGljIGNvbnN0IGJvb2wgUnVubmluZ09uR1BVID0gZmFsc2U7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCBSdW5uaW5nT25HUFUgPSBmYWxzZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgUnVubmluZ09uU3ljbCA9IGZhbHNlOworI2VuZGlmCisgIHR5cGVuYW1lIE1ha2VQb2ludGVyXzxDb2VmZlJldHVyblR5cGU+OjpUeXBlIG1fcmVzdWx0OworCisgIGNvbnN0IERldmljZSYgbV9kZXZpY2U7CisgIGNvbnN0IERpbXMmIG1feHByX2RpbXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVEVUNUSU9OX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmVkdWN0aW9uQ3VkYS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JSZWR1Y3Rpb25DdWRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2MzhiNgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmVkdWN0aW9uQ3VkYS5oCkBAIC0wLDAgKzEsNzUwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVEVUNUSU9OX0NVREFfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1JFRFVDVElPTl9DVURBX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKworI2lmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkgJiYgZGVmaW5lZChfX0NVREFDQ19fKQorLy8gRnVsbCByZWR1Y2VycyBmb3IgR1BVLCBkb24ndCB2ZWN0b3JpemUgZm9yIG5vdworCisvLyBSZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyBtdWx0aXBsZSBjdWRhIHRocmVhZCB0byBzYWZlbHkgYWNjdW11bGF0ZSBhdCB0aGUgc2FtZQorLy8gb3V0cHV0IGFkZHJlc3MuIEl0IGJhc2ljYWxseSByZWFkcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3V0cHV0IHZhcmlhYmxlLCBhbmQKKy8vIGF0dGVtcHRzIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcgdmFsdWUuIElmIGluIHRoZSBtZWFudGltZSBhbm90aGVyIGN1ZGEgdGhyZWFkCisvLyB1cGRhdGVkIHRoZSBjb250ZW50IG9mIHRoZSBvdXRwdXQgYWRkcmVzcyBpdCB3aWxsIHRyeSBhZ2Fpbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSPgorX19kZXZpY2VfXyBFSUdFTl9BTFdBWVNfSU5MSU5FIHZvaWQgYXRvbWljUmVkdWNlKFQqIG91dHB1dCwgVCBhY2N1bSwgUiYgcmVkdWNlcikgeworI2lmIF9fQ1VEQV9BUkNIX18gPj0gMzAwCisgIGlmIChzaXplb2YoVCkgPT0gNCkKKyAgeworICAgIHVuc2lnbmVkIGludCBvbGR2YWwgPSAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQqPihvdXRwdXQpOworICAgIHVuc2lnbmVkIGludCBuZXd2YWwgPSBvbGR2YWw7CisgICAgcmVkdWNlci5yZWR1Y2UoYWNjdW0sIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCZuZXd2YWwpKTsKKyAgICBpZiAobmV3dmFsID09IG9sZHZhbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgcmVhZGJhY2s7CisgICAgd2hpbGUgKChyZWFkYmFjayA9IGF0b21pY0NBUygodW5zaWduZWQgaW50KilvdXRwdXQsIG9sZHZhbCwgbmV3dmFsKSkgIT0gb2xkdmFsKSB7CisgICAgICBvbGR2YWwgPSByZWFkYmFjazsKKyAgICAgIG5ld3ZhbCA9IG9sZHZhbDsKKyAgICAgIHJlZHVjZXIucmVkdWNlKGFjY3VtLCByZWludGVycHJldF9jYXN0PFQqPigmbmV3dmFsKSk7CisgICAgICBpZiAobmV3dmFsID09IG9sZHZhbCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNpemVvZihUKSA9PSA4KSB7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG9sZHZhbCA9ICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZyo+KG91dHB1dCk7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG5ld3ZhbCA9IG9sZHZhbDsKKyAgICByZWR1Y2VyLnJlZHVjZShhY2N1bSwgcmVpbnRlcnByZXRfY2FzdDxUKj4oJm5ld3ZhbCkpOworICAgIGlmIChuZXd2YWwgPT0gb2xkdmFsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWFkYmFjazsKKyAgICB3aGlsZSAoKHJlYWRiYWNrID0gYXRvbWljQ0FTKCh1bnNpZ25lZCBsb25nIGxvbmcqKW91dHB1dCwgb2xkdmFsLCBuZXd2YWwpKSAhPSBvbGR2YWwpIHsKKyAgICAgIG9sZHZhbCA9IHJlYWRiYWNrOworICAgICAgbmV3dmFsID0gb2xkdmFsOworICAgICAgcmVkdWNlci5yZWR1Y2UoYWNjdW0sIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCZuZXd2YWwpKTsKKyAgICAgIGlmIChuZXd2YWwgPT0gb2xkdmFsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgYXNzZXJ0KDAgJiYgIldvcmRzaXplIG5vdCBzdXBwb3J0ZWQiKTsKKyAgfQorI2Vsc2UKKyAgYXNzZXJ0KDAgJiYgIlNob3VsZG4ndCBiZSBjYWxsZWQgb24gdW5zdXBwb3J0ZWQgZGV2aWNlIik7CisjZW5kaWYKK30KKworLy8gV2UgZXh0ZW5kIGF0b21pY0V4Y2ggdG8gc3VwcG9ydCBleHRyYSBkYXRhIHR5cGVzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK19fZGV2aWNlX18gaW5saW5lIFR5cGUgYXRvbWljRXhjaEN1c3RvbShUeXBlKiBhZGRyZXNzLCBUeXBlIHZhbCkgeworICByZXR1cm4gYXRvbWljRXhjaChhZGRyZXNzLCB2YWwpOworfQorCit0ZW1wbGF0ZSA8PgorX19kZXZpY2VfXyBpbmxpbmUgZG91YmxlIGF0b21pY0V4Y2hDdXN0b20oZG91YmxlKiBhZGRyZXNzLCBkb3VibGUgdmFsKSB7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQqIGFkZHJlc3NfYXNfdWxsID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmcgaW50Kj4oYWRkcmVzcyk7CisgIHJldHVybiBfX2xvbmdsb25nX2FzX2RvdWJsZShhdG9taWNFeGNoKGFkZHJlc3NfYXNfdWxsLCBfX2RvdWJsZV9hc19sb25nbG9uZyh2YWwpKSk7Cit9CisKKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2Cit0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFI+CitfX2RldmljZV9fIGlubGluZSB2b2lkIGF0b21pY1JlZHVjZShoYWxmMiogb3V0cHV0LCBoYWxmMiBhY2N1bSwgUjxoYWxmPiYgcmVkdWNlcikgeworICB1bnNpZ25lZCBpbnQgb2xkdmFsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgaW50Kj4ob3V0cHV0KTsKKyAgdW5zaWduZWQgaW50IG5ld3ZhbCA9IG9sZHZhbDsKKyAgcmVkdWNlci5yZWR1Y2VQYWNrZXQoYWNjdW0sIHJlaW50ZXJwcmV0X2Nhc3Q8aGFsZjIqPigmbmV3dmFsKSk7CisgIGlmIChuZXd2YWwgPT0gb2xkdmFsKSB7CisgICAgcmV0dXJuOworICB9CisgIHVuc2lnbmVkIGludCByZWFkYmFjazsKKyAgd2hpbGUgKChyZWFkYmFjayA9IGF0b21pY0NBUygodW5zaWduZWQgaW50KilvdXRwdXQsIG9sZHZhbCwgbmV3dmFsKSkgIT0gb2xkdmFsKSB7CisgICAgb2xkdmFsID0gcmVhZGJhY2s7CisgICAgbmV3dmFsID0gb2xkdmFsOworICAgIHJlZHVjZXIucmVkdWNlUGFja2V0KGFjY3VtLCByZWludGVycHJldF9jYXN0PGhhbGYyKj4oJm5ld3ZhbCkpOworICAgIGlmIChuZXd2YWwgPT0gb2xkdmFsKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPD4KK19fZGV2aWNlX18gaW5saW5lIHZvaWQgYXRvbWljUmVkdWNlKGZsb2F0KiBvdXRwdXQsIGZsb2F0IGFjY3VtLCBTdW1SZWR1Y2VyPGZsb2F0PiYpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDMwMAorICBhdG9taWNBZGQob3V0cHV0LCBhY2N1bSk7CisjZWxzZQorICBhc3NlcnQoMCAmJiAiU2hvdWxkbid0IGJlIGNhbGxlZCBvbiB1bnN1cHBvcnRlZCBkZXZpY2UiKTsKKyNlbmRpZgorfQorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb2VmZlR5cGUsIHR5cGVuYW1lIEluZGV4PgorX19nbG9iYWxfXyB2b2lkIFJlZHVjdGlvbkluaXRLZXJuZWwoY29uc3QgQ29lZmZUeXBlIHZhbCwgSW5kZXggbnVtX3ByZXNlcnZlZF9jb2VmZnMsIENvZWZmVHlwZSogb3V0cHV0KSB7CisgIGNvbnN0IEluZGV4IHRocmVhZF9pZCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgIGNvbnN0IEluZGV4IG51bV90aHJlYWRzID0gYmxvY2tEaW0ueCAqIGdyaWREaW0ueDsKKyAgZm9yIChJbmRleCBpID0gdGhyZWFkX2lkOyBpIDwgbnVtX3ByZXNlcnZlZF9jb2VmZnM7IGkgKz0gbnVtX3RocmVhZHMpIHsKKyAgICBvdXRwdXRbaV0gPSB2YWw7CisgIH0KK30KKworCit0ZW1wbGF0ZSA8aW50IEJsb2NrU2l6ZSwgaW50IE51bVBlclRocmVhZCwgdHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBGdWxsUmVkdWN0aW9uS2VybmVsKFJlZHVjZXIgcmVkdWNlciwgY29uc3QgU2VsZiBpbnB1dCwgSW5kZXggbnVtX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSogb3V0cHV0LCB1bnNpZ25lZCBpbnQqIHNlbWFwaG9yZSkgeworI2lmIF9fQ1VEQV9BUkNIX18gPj0gMzAwCisgIC8vIEluaXRpYWxpemUgdGhlIG91dHB1dCB2YWx1ZQorICBjb25zdCBJbmRleCBmaXJzdF9pbmRleCA9IGJsb2NrSWR4LnggKiBCbG9ja1NpemUgKiBOdW1QZXJUaHJlYWQgKyB0aHJlYWRJZHgueDsKKyAgaWYgKGdyaWREaW0ueCA9PSAxKSB7CisgICAgaWYgKGZpcnN0X2luZGV4ID09IDApIHsKKyAgICAgICpvdXRwdXQgPSByZWR1Y2VyLmluaXRpYWxpemUoKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHRocmVhZElkeC54ID09IDApIHsKKyAgICAgIHVuc2lnbmVkIGludCBibG9jayA9IGF0b21pY0NBUyhzZW1hcGhvcmUsIDB1LCAxdSk7CisgICAgICBpZiAoYmxvY2sgPT0gMCkgeworICAgICAgICAvLyBXZSdyZSB0aGUgZmlyc3QgYmxvY2sgdG8gcnVuLCBpbml0aWFsaXplIHRoZSBvdXRwdXQgdmFsdWUKKyAgICAgICAgYXRvbWljRXhjaEN1c3RvbShvdXRwdXQsIHJlZHVjZXIuaW5pdGlhbGl6ZSgpKTsKKyAgICAgICAgX190aHJlYWRmZW5jZSgpOworICAgICAgICBhdG9taWNFeGNoKHNlbWFwaG9yZSwgMnUpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCBibG9jayB0byBpbml0aWFsaXplIHRoZSBvdXRwdXQgdmFsdWUuCisgICAgICAgIC8vIFVzZSBhdG9taWNDQVMgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgcmVhZHMgYXJlbid0IGNhY2hlZAorICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgICBkbyB7CisgICAgICAgICAgdmFsID0gYXRvbWljQ0FTKHNlbWFwaG9yZSwgMnUsIDJ1KTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodmFsIDwgMnUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9fc3luY3RocmVhZHMoKTsKKworICBlaWdlbl9hc3NlcnQoZ3JpZERpbS54ID09IDEgfHwgKnNlbWFwaG9yZSA+PSAydSk7CisKKyAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIGFjY3VtID0gcmVkdWNlci5pbml0aWFsaXplKCk7CisgIEluZGV4IG1heF9pdGVyID0gbnVtZXh0OjptaW5pPEluZGV4PihudW1fY29lZmZzIC0gZmlyc3RfaW5kZXgsIE51bVBlclRocmVhZCpCbG9ja1NpemUpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbWF4X2l0ZXI7IGkrPUJsb2NrU2l6ZSkgeworICAgIGNvbnN0IEluZGV4IGluZGV4ID0gZmlyc3RfaW5kZXggKyBpOworICAgIGVpZ2VuX2Fzc2VydChpbmRleCA8IG51bV9jb2VmZnMpOworICAgIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSB2YWwgPSBpbnB1dC5tX2ltcGwuY29lZmYoaW5kZXgpOworICAgIHJlZHVjZXIucmVkdWNlKHZhbCwgJmFjY3VtKTsKKyAgfQorCisjcHJhZ21hIHVucm9sbAorICBmb3IgKGludCBvZmZzZXQgPSB3YXJwU2l6ZS8yOyBvZmZzZXQgPiAwOyBvZmZzZXQgLz0gMikgeworICAgIHJlZHVjZXIucmVkdWNlKF9fc2hmbF9kb3duKGFjY3VtLCBvZmZzZXQsIHdhcnBTaXplKSwgJmFjY3VtKTsKKyAgfQorCisgIGlmICgodGhyZWFkSWR4LnggJiAod2FycFNpemUgLSAxKSkgPT0gMCkgeworICAgIGF0b21pY1JlZHVjZShvdXRwdXQsIGFjY3VtLCByZWR1Y2VyKTsKKyAgfQorCisgIGlmIChncmlkRGltLnggPiAxICYmIHRocmVhZElkeC54ID09IDApIHsKKyAgICAvLyBMZXQgdGhlIGxhc3QgYmxvY2sgcmVzZXQgdGhlIHNlbWFwaG9yZQorICAgIGF0b21pY0luYyhzZW1hcGhvcmUsIGdyaWREaW0ueCArIDEpOworICB9CisjZWxzZQorICBhc3NlcnQoMCAmJiAiU2hvdWxkbid0IGJlIGNhbGxlZCBvbiB1bnN1cHBvcnRlZCBkZXZpY2UiKTsKKyNlbmRpZgorfQorCisKKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBSZWR1Y3Rpb25Jbml0RnVsbFJlZHV4S2VybmVsSGFsZkZsb2F0KFJlZHVjZXIgcmVkdWNlciwgY29uc3QgU2VsZiBpbnB1dCwgSW5kZXggbnVtX2NvZWZmcywgaGFsZjIqIHNjcmF0Y2gpIHsKKyAgZWlnZW5fYXNzZXJ0KGJsb2NrRGltLnggPT0gMSk7CisgIGVpZ2VuX2Fzc2VydChncmlkRGltLnggPT0gMSk7CisgIGlmIChudW1fY29lZmZzICUgMiAhPSAwKSB7CisgICAgaGFsZiBsYXN0ID0gaW5wdXQubV9pbXBsLmNvZWZmKG51bV9jb2VmZnMtMSk7CisgICAgKnNjcmF0Y2ggPSBfX2hhbHZlczJoYWxmMihsYXN0LCByZWR1Y2VyLmluaXRpYWxpemUoKSk7CisgIH0gZWxzZSB7CisgICAgKnNjcmF0Y2ggPSByZWR1Y2VyLnRlbXBsYXRlIGluaXRpYWxpemVQYWNrZXQ8aGFsZjI+KCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsCisgICAgICAgICAgdHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgSW5kZXg+CitfX2dsb2JhbF9fIHZvaWQgUmVkdWN0aW9uSW5pdEtlcm5lbEhhbGZGbG9hdChSZWR1Y2VyIHJlZHVjZXIsIGNvbnN0IFNlbGYgaW5wdXQsIEluZGV4IG51bV9jb2VmZnMsIGhhbGYqIG91dHB1dCkgeworICBjb25zdCBJbmRleCB0aHJlYWRfaWQgPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OworICBjb25zdCBJbmRleCBudW1fdGhyZWFkcyA9IGJsb2NrRGltLnggKiBncmlkRGltLng7CisgIGNvbnN0IEluZGV4IG51bV9wYWNrZXRzID0gbnVtX2NvZWZmcyAvIDI7CisgIGZvciAoSW5kZXggaSA9IHRocmVhZF9pZDsgaSA8IG51bV9wYWNrZXRzOyBpICs9IG51bV90aHJlYWRzKSB7CisgICAgKChoYWxmMiopb3V0cHV0KVtpXSA9IHJlZHVjZXIudGVtcGxhdGUgaW5pdGlhbGl6ZVBhY2tldDxoYWxmMj4oKTsKKyAgfQorCisgIGlmICh0aHJlYWRfaWQgPT0gMCAmJiBudW1fY29lZmZzICUgMiAhPSAwKSB7CisgICAgb3V0cHV0W251bV9jb2VmZnMtMV0gPSByZWR1Y2VyLmluaXRpYWxpemUoKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IEJsb2NrU2l6ZSwgaW50IE51bVBlclRocmVhZCwgdHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBGdWxsUmVkdWN0aW9uS2VybmVsSGFsZkZsb2F0KFJlZHVjZXIgcmVkdWNlciwgY29uc3QgU2VsZiBpbnB1dCwgSW5kZXggbnVtX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGYqIG91dHB1dCwgaGFsZjIqIHNjcmF0Y2gpIHsKKyAgZWlnZW5fYXNzZXJ0KE51bVBlclRocmVhZCAlIDIgPT0gMCk7CisKKyAgY29uc3QgSW5kZXggZmlyc3RfaW5kZXggPSBibG9ja0lkeC54ICogQmxvY2tTaXplICogTnVtUGVyVGhyZWFkICsgMip0aHJlYWRJZHgueDsKKworICAvLyBJbml0aWFsaXplIHRoZSBvdXRwdXQgdmFsdWUgaWYgaXQgd2Fzbid0IGluaXRpYWxpemVkIGJ5IHRoZSBSZWR1Y3Rpb25Jbml0S2VybmVsCisgIGlmIChncmlkRGltLnggPT0gMSAmJiBmaXJzdF9pbmRleCA9PSAwKSB7CisgICAgaWYgKG51bV9jb2VmZnMgJSAyICE9IDApIHsKKyAgICAgIGhhbGYgbGFzdCA9IGlucHV0Lm1faW1wbC5jb2VmZihudW1fY29lZmZzLTEpOworICAgICAgKnNjcmF0Y2ggPSBfX2hhbHZlczJoYWxmMihsYXN0LCByZWR1Y2VyLmluaXRpYWxpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpzY3JhdGNoID0gcmVkdWNlci50ZW1wbGF0ZSBpbml0aWFsaXplUGFja2V0PGhhbGYyPigpOworICAgIH0KKyAgICBfX3N5bmN0aHJlYWRzKCk7CisgIH0KKworICBoYWxmMiBhY2N1bSA9IHJlZHVjZXIudGVtcGxhdGUgaW5pdGlhbGl6ZVBhY2tldDxoYWxmMj4oKTsKKyAgY29uc3QgSW5kZXggbWF4X2l0ZXIgPSBudW1leHQ6Om1pbmk8SW5kZXg+KChudW1fY29lZmZzIC0gZmlyc3RfaW5kZXgpIC8gMiwgTnVtUGVyVGhyZWFkKkJsb2NrU2l6ZSAvIDIpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbWF4X2l0ZXI7IGkgKz0gQmxvY2tTaXplKSB7CisgICAgY29uc3QgSW5kZXggaW5kZXggPSBmaXJzdF9pbmRleCArIDIqaTsKKyAgICBlaWdlbl9hc3NlcnQoaW5kZXggKyAxIDwgbnVtX2NvZWZmcyk7CisgICAgaGFsZjIgdmFsID0gaW5wdXQubV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGluZGV4KTsKKyAgICByZWR1Y2VyLnJlZHVjZVBhY2tldCh2YWwsICZhY2N1bSk7CisgIH0KKworI3ByYWdtYSB1bnJvbGwKKyAgZm9yIChpbnQgb2Zmc2V0ID0gd2FycFNpemUvMjsgb2Zmc2V0ID4gMDsgb2Zmc2V0IC89IDIpIHsKKyAgICByZWR1Y2VyLnJlZHVjZVBhY2tldChfX3NoZmxfZG93bihhY2N1bSwgb2Zmc2V0LCB3YXJwU2l6ZSksICZhY2N1bSk7CisgIH0KKworICBpZiAoKHRocmVhZElkeC54ICYgKHdhcnBTaXplIC0gMSkpID09IDApIHsKKyAgICBhdG9taWNSZWR1Y2Uoc2NyYXRjaCwgYWNjdW0sIHJlZHVjZXIpOworICB9CisKKyAgX19zeW5jdGhyZWFkcygpOworCisgIGlmIChncmlkRGltLnggPT0gMSAmJiBmaXJzdF9pbmRleCA9PSAwKSB7CisgICAgaGFsZiB0bXAgPSBfX2xvdzJoYWxmKCpzY3JhdGNoKTsKKyAgICByZWR1Y2VyLnJlZHVjZShfX2hpZ2gyaGFsZigqc2NyYXRjaCksICZ0bXApOworICAgICpvdXRwdXQgPSB0bXA7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wPgorX19nbG9iYWxfXyB2b2lkIFJlZHVjdGlvbkNsZWFudXBLZXJuZWxIYWxmRmxvYXQoT3AmIHJlZHVjZXIsIGhhbGYqIG91dHB1dCwgaGFsZjIqIHNjcmF0Y2gpIHsKKyAgZWlnZW5fYXNzZXJ0KHRocmVhZElkeC54ID09IDEpOworICBoYWxmIHRtcCA9IF9fbG93MmhhbGYoKnNjcmF0Y2gpOworICByZWR1Y2VyLnJlZHVjZShfX2hpZ2gyaGFsZigqc2NyYXRjaCksICZ0bXApOworICAqb3V0cHV0ID0gdG1wOworfQorCisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBPdXRwdXRUeXBlLCBib29sIFBhY2tldEFjY2VzcywgdHlwZW5hbWUgRW5hYmxlZCA9IHZvaWQ+CitzdHJ1Y3QgRnVsbFJlZHVjdGlvbkxhdW5jaGVyIHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFNlbGYmLCBPcCYsIGNvbnN0IEdwdURldmljZSYsIE91dHB1dFR5cGUqLCB0eXBlbmFtZSBTZWxmOjpJbmRleCkgeworICAgIGFzc2VydChmYWxzZSAmJiAiU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGRvdWJsZXMsIGZsb2F0cyBhbmQgaGFsZiBmbG9hdHMiKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0IGFuZCBkb3VibGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgT3V0cHV0VHlwZSwgYm9vbCBQYWNrZXRBY2Nlc3M+CitzdHJ1Y3QgRnVsbFJlZHVjdGlvbkxhdW5jaGVyPAorICAgIFNlbGYsIE9wLCBPdXRwdXRUeXBlLCBQYWNrZXRBY2Nlc3MsCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwKKyAgICAgIGludGVybmFsOjppc19zYW1lPGZsb2F0LCBPdXRwdXRUeXBlPjo6dmFsdWUgfHwKKyAgICAgIGludGVybmFsOjppc19zYW1lPGRvdWJsZSwgT3V0cHV0VHlwZT46OnZhbHVlLAorICAgIHZvaWQ+Ojp0eXBlPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgR3B1RGV2aWNlJiBkZXZpY2UsIE91dHB1dFR5cGUqIG91dHB1dCwgdHlwZW5hbWUgU2VsZjo6SW5kZXggbnVtX2NvZWZmcykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUgU2NhbGFyOworICAgIGNvbnN0IGludCBibG9ja19zaXplID0gMjU2OworICAgIGNvbnN0IGludCBudW1fcGVyX3RocmVhZCA9IDEyODsKKyAgICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9IGRpdnVwPGludD4obnVtX2NvZWZmcywgYmxvY2tfc2l6ZSAqIG51bV9wZXJfdGhyZWFkKTsKKworICAgIHVuc2lnbmVkIGludCogc2VtYXBob3JlID0gTlVMTDsKKyAgICBpZiAobnVtX2Jsb2NrcyA+IDEpIHsKKyAgICAgIHNlbWFwaG9yZSA9IGRldmljZS5zZW1hcGhvcmUoKTsKKyAgICB9CisKKyAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEZ1bGxSZWR1Y3Rpb25LZXJuZWw8YmxvY2tfc2l6ZSwgbnVtX3Blcl90aHJlYWQsIFNlbGYsIE9wLCBJbmRleD4pLAorICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzLCBibG9ja19zaXplLCAwLCBkZXZpY2UsIHJlZHVjZXIsIHNlbGYsIG51bV9jb2VmZnMsIG91dHB1dCwgc2VtYXBob3JlKTsKKyAgfQorfTsKKworI2lmZGVmIEVJR0VOX0hBU19DVURBX0ZQMTYKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBGdWxsUmVkdWN0aW9uTGF1bmNoZXI8U2VsZiwgT3AsIEVpZ2VuOjpoYWxmLCBmYWxzZT4geworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgU2VsZiYsIE9wJiwgY29uc3QgR3B1RGV2aWNlJiwgaGFsZiosIHR5cGVuYW1lIFNlbGY6OkluZGV4KSB7CisgICAgYXNzZXJ0KGZhbHNlICYmICJTaG91bGQgbm90IGJlIGNhbGxlZCBzaW5jZSB0aGVyZSBpcyBubyBwYWNrZXQgYWNjZXNzb3IiKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wPgorc3RydWN0IEZ1bGxSZWR1Y3Rpb25MYXVuY2hlcjxTZWxmLCBPcCwgRWlnZW46OmhhbGYsIHRydWU+IHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFNlbGYmIHNlbGYsIE9wJiByZWR1Y2VyLCBjb25zdCBHcHVEZXZpY2UmIGRldmljZSwgaGFsZiogb3V0cHV0LCB0eXBlbmFtZSBTZWxmOjpJbmRleCBudW1fY29lZmZzKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxmOjpJbmRleCBJbmRleDsKKworICAgIGNvbnN0IGludCBibG9ja19zaXplID0gMjU2OworICAgIGNvbnN0IGludCBudW1fcGVyX3RocmVhZCA9IDEyODsKKyAgICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9IGRpdnVwPGludD4obnVtX2NvZWZmcywgYmxvY2tfc2l6ZSAqIG51bV9wZXJfdGhyZWFkKTsKKyAgICBoYWxmMiogc2NyYXRjaCA9IHN0YXRpY19jYXN0PGhhbGYyKj4oZGV2aWNlLnNjcmF0Y2hwYWQoKSk7CisKKyAgICBpZiAobnVtX2Jsb2NrcyA+IDEpIHsKKyAgICAgIC8vIFdlIGluaXRpYWxpemUgdGhlIG91dHB1dCBhbmQgdGhlIHNjcmF0aHBhZCBvdXRzaWRlIHRoZSByZWR1Y3Rpb24ga2VybmVsIHdoZW4gd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZXJlCisgICAgICAvLyB3b24ndCBiZSBhIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZCBibG9ja3MuCisgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKFJlZHVjdGlvbkluaXRGdWxsUmVkdXhLZXJuZWxIYWxmRmxvYXQ8U2VsZiwgT3AsIEluZGV4PiksCisgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMCwgZGV2aWNlLCByZWR1Y2VyLCBzZWxmLCBudW1fY29lZmZzLCBzY3JhdGNoKTsKKyAgICB9CisKKyAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKEZ1bGxSZWR1Y3Rpb25LZXJuZWxIYWxmRmxvYXQ8YmxvY2tfc2l6ZSwgbnVtX3Blcl90aHJlYWQsIFNlbGYsIE9wLCBJbmRleD4pLAorICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzLCBibG9ja19zaXplLCAwLCBkZXZpY2UsIHJlZHVjZXIsIHNlbGYsIG51bV9jb2VmZnMsIG91dHB1dCwgc2NyYXRjaCk7CisKKyAgICBpZiAobnVtX2Jsb2NrcyA+IDEpIHsKKyAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoUmVkdWN0aW9uQ2xlYW51cEtlcm5lbEhhbGZGbG9hdDxPcD4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDAsIGRldmljZSwgcmVkdWNlciwgb3V0cHV0LCBzY3JhdGNoKTsKKyAgICB9CisgIH0KK307CisjZW5kaWYKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3AsIGJvb2wgVmVjdG9yaXphYmxlPgorc3RydWN0IEZ1bGxSZWR1Y2VyPFNlbGYsIE9wLCBHcHVEZXZpY2UsIFZlY3Rvcml6YWJsZT4geworICAvLyBVbmZvcnR1bmF0ZWx5IG52aWRpYSBkb2Vzbid0IHN1cHBvcnQgd2VsbCBleG90aWMgdHlwZXMgc3VjaCBhcyBjb21wbGV4LAorICAvLyBzbyByZWR1Y2UgdGhlIHNjb3BlIG9mIHRoZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgY29kZSB0byB0aGUgc2ltcGxlIGNhc2VzCisgIC8vIG9mIGRvdWJsZXMsIGZsb2F0cyBhbmQgaGFsZiBmbG9hdHMKKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2CisgIHN0YXRpYyBjb25zdCBib29sIEhhc09wdGltaXplZEltcGxlbWVudGF0aW9uID0gIU9wOjpJc1N0YXRlZnVsICYmCisgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBmbG9hdD46OnZhbHVlIHx8CisgICAgICAgaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBkb3VibGU+Ojp2YWx1ZSB8fAorICAgICAgIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUsIEVpZ2VuOjpoYWxmPjo6dmFsdWUgJiYgcmVkdWNlcl90cmFpdHM8T3AsIEdwdURldmljZT46OlBhY2tldEFjY2VzcykpOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgSGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gPSAhT3A6OklzU3RhdGVmdWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUsIGZsb2F0Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUsIGRvdWJsZT46OnZhbHVlKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRUeXBlPgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgU2VsZiYgc2VsZiwgT3AmIHJlZHVjZXIsIGNvbnN0IEdwdURldmljZSYgZGV2aWNlLCBPdXRwdXRUeXBlKiBvdXRwdXQpIHsKKyAgICBhc3NlcnQoSGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gJiYgIlNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBkb3VibGVzLCBmbG9hdHMgb3IgaGFsZiBmbG9hdHMiKTsKKyAgICBjb25zdCBJbmRleCBudW1fY29lZmZzID0gYXJyYXlfcHJvZChzZWxmLm1faW1wbC5kaW1lbnNpb25zKCkpOworICAgIC8vIERvbid0IGNyYXNoIHdoZW4gd2UncmUgY2FsbGVkIHdpdGggYW4gaW5wdXQgdGVuc29yIG9mIHNpemUgMC4KKyAgICBpZiAobnVtX2NvZWZmcyA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRnVsbFJlZHVjdGlvbkxhdW5jaGVyPFNlbGYsIE9wLCBPdXRwdXRUeXBlLCByZWR1Y2VyX3RyYWl0czxPcCwgR3B1RGV2aWNlPjo6UGFja2V0QWNjZXNzPjo6cnVuKHNlbGYsIHJlZHVjZXIsIGRldmljZSwgb3V0cHV0LCBudW1fY29lZmZzKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8aW50IE51bVBlclRocmVhZCwgdHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBJbm5lclJlZHVjdGlvbktlcm5lbChSZWR1Y2VyIHJlZHVjZXIsIGNvbnN0IFNlbGYgaW5wdXQsIEluZGV4IG51bV9jb2VmZnNfdG9fcmVkdWNlLCBJbmRleCBudW1fcHJlc2VydmVkX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlKiBvdXRwdXQpIHsKKyNpZiBfX0NVREFfQVJDSF9fID49IDMwMAorICB0eXBlZGVmIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSBUeXBlOworICBlaWdlbl9hc3NlcnQoYmxvY2tEaW0ueSA9PSAxKTsKKyAgZWlnZW5fYXNzZXJ0KGJsb2NrRGltLnogPT0gMSk7CisgIGVpZ2VuX2Fzc2VydChncmlkRGltLnkgPT0gMSk7CisgIGVpZ2VuX2Fzc2VydChncmlkRGltLnogPT0gMSk7CisKKyAgY29uc3QgaW50IHVucm9sbF90aW1lcyA9IDE2OworICBlaWdlbl9hc3NlcnQoTnVtUGVyVGhyZWFkICUgdW5yb2xsX3RpbWVzID09IDApOworCisgIGNvbnN0IEluZGV4IGlucHV0X2NvbF9ibG9ja3MgPSBkaXZ1cDxJbmRleD4obnVtX2NvZWZmc190b19yZWR1Y2UsIGJsb2NrRGltLnggKiBOdW1QZXJUaHJlYWQpOworICBjb25zdCBJbmRleCBudW1faW5wdXRfYmxvY2tzID0gaW5wdXRfY29sX2Jsb2NrcyAqIG51bV9wcmVzZXJ2ZWRfY29lZmZzOworCisgIGNvbnN0IEluZGV4IG51bV90aHJlYWRzID0gYmxvY2tEaW0ueCAqIGdyaWREaW0ueDsKKyAgY29uc3QgSW5kZXggdGhyZWFkX2lkID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKKworICAvLyBJbml0aWFsaXplIHRoZSBvdXRwdXQgdmFsdWVzIGlmIHRoZXkgd2VyZW4ndCBpbml0aWFsaXplZCBieSB0aGUgUmVkdWN0aW9uSW5pdEtlcm5lbAorICBpZiAoZ3JpZERpbS54ID09IDEpIHsKKyAgICBmb3IgKEluZGV4IGkgPSB0aHJlYWRfaWQ7IGkgPCBudW1fcHJlc2VydmVkX2NvZWZmczsgaSArPSBudW1fdGhyZWFkcykgeworICAgICAgb3V0cHV0W2ldID0gcmVkdWNlci5pbml0aWFsaXplKCk7CisgICAgfQorICAgIF9fc3luY3RocmVhZHMoKTsKKyAgfQorCisgIGZvciAoSW5kZXggaSA9IGJsb2NrSWR4Lng7IGkgPCBudW1faW5wdXRfYmxvY2tzOyBpICs9IGdyaWREaW0ueCkgeworICAgIGNvbnN0IEluZGV4IHJvdyA9IGkgLyBpbnB1dF9jb2xfYmxvY2tzOworCisgICAgaWYgKHJvdyA8IG51bV9wcmVzZXJ2ZWRfY29lZmZzKSB7CisgICAgICBjb25zdCBJbmRleCBjb2xfYmxvY2sgPSBpICUgaW5wdXRfY29sX2Jsb2NrczsKKyAgICAgIGNvbnN0IEluZGV4IGNvbF9iZWdpbiA9IGNvbF9ibG9jayAqIGJsb2NrRGltLnggKiBOdW1QZXJUaHJlYWQgKyB0aHJlYWRJZHgueDsKKworICAgICAgVHlwZSByZWR1Y2VkX3ZhbCA9IHJlZHVjZXIuaW5pdGlhbGl6ZSgpOworCisgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgTnVtUGVyVGhyZWFkOyBqICs9IHVucm9sbF90aW1lcykgeworICAgICAgICBjb25zdCBJbmRleCBsYXN0X2NvbCA9IGNvbF9iZWdpbiArIGJsb2NrRGltLnggKiAoaiArIHVucm9sbF90aW1lcyAtIDEpOworICAgICAgICBpZiAobGFzdF9jb2wgPj0gbnVtX2NvZWZmc190b19yZWR1Y2UpIHsKKyAgICAgICAgICBmb3IgKEluZGV4IGNvbCA9IGNvbF9iZWdpbiArIGJsb2NrRGltLnggKiBqOyBjb2wgPCBudW1fY29lZmZzX3RvX3JlZHVjZTsgY29sICs9IGJsb2NrRGltLngpIHsKKyAgICAgICAgICAgIGNvbnN0IFR5cGUgdmFsID0gaW5wdXQubV9pbXBsLmNvZWZmKHJvdyAqIG51bV9jb2VmZnNfdG9fcmVkdWNlICsgY29sKTsKKyAgICAgICAgICAgIHJlZHVjZXIucmVkdWNlKHZhbCwgJnJlZHVjZWRfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRmFzdGVyIHZlcnNpb24gb2YgdGhlIGxvb3Agd2l0aCBubyBicmFuY2hlcyBhZnRlciB1bnJvbGxpbmcuCisjcHJhZ21hIHVucm9sbAorICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdW5yb2xsX3RpbWVzOyArK2spIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IGNvbCA9IGNvbF9iZWdpbiArIGJsb2NrRGltLnggKiAoaiArIGspOworICAgICAgICAgICAgcmVkdWNlci5yZWR1Y2UoaW5wdXQubV9pbXBsLmNvZWZmKHJvdyAqIG51bV9jb2VmZnNfdG9fcmVkdWNlICsgY29sKSwgJnJlZHVjZWRfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworI3ByYWdtYSB1bnJvbGwKKyAgICAgIGZvciAoaW50IG9mZnNldCA9IHdhcnBTaXplLzI7IG9mZnNldCA+IDA7IG9mZnNldCAvPSAyKSB7CisgICAgICAgIHJlZHVjZXIucmVkdWNlKF9fc2hmbF9kb3duKHJlZHVjZWRfdmFsLCBvZmZzZXQpLCAmcmVkdWNlZF92YWwpOworICAgICAgfQorCisgICAgICBpZiAoKHRocmVhZElkeC54ICYgKHdhcnBTaXplIC0gMSkpID09IDApIHsKKyAgICAgICAgYXRvbWljUmVkdWNlKCYob3V0cHV0W3Jvd10pLCByZWR1Y2VkX3ZhbCwgcmVkdWNlcik7CisgICAgICB9CisgICAgfQorICB9CisjZWxzZQorICBhc3NlcnQoMCAmJiAiU2hvdWxkbid0IGJlIGNhbGxlZCBvbiB1bnN1cHBvcnRlZCBkZXZpY2UiKTsKKyNlbmRpZgorfQorCisjaWZkZWYgRUlHRU5fSEFTX0NVREFfRlAxNgorCit0ZW1wbGF0ZSA8aW50IE51bVBlclRocmVhZCwgdHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBJbm5lclJlZHVjdGlvbktlcm5lbEhhbGZGbG9hdChSZWR1Y2VyIHJlZHVjZXIsIGNvbnN0IFNlbGYgaW5wdXQsIEluZGV4IG51bV9jb2VmZnNfdG9fcmVkdWNlLCBJbmRleCBudW1fcHJlc2VydmVkX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmKiBvdXRwdXQpIHsKKyAgZWlnZW5fYXNzZXJ0KGJsb2NrRGltLnkgPT0gMSk7CisgIGVpZ2VuX2Fzc2VydChibG9ja0RpbS56ID09IDEpOworICBlaWdlbl9hc3NlcnQoZ3JpZERpbS55ID09IDEpOworICBlaWdlbl9hc3NlcnQoZ3JpZERpbS56ID09IDEpOworCisgIGNvbnN0IGludCB1bnJvbGxfdGltZXMgPSAxNjsKKyAgZWlnZW5fYXNzZXJ0KE51bVBlclRocmVhZCAlIHVucm9sbF90aW1lcyA9PSAwKTsKKyAgZWlnZW5fYXNzZXJ0KHVucm9sbF90aW1lcyAlIDIgPT0gMCk7CisKKyAgY29uc3QgSW5kZXggaW5wdXRfY29sX2Jsb2NrcyA9IGRpdnVwPEluZGV4PihudW1fY29lZmZzX3RvX3JlZHVjZSwgYmxvY2tEaW0ueCAqIE51bVBlclRocmVhZCAqIDIpOworICBjb25zdCBJbmRleCBudW1faW5wdXRfYmxvY2tzID0gZGl2dXA8SW5kZXg+KGlucHV0X2NvbF9ibG9ja3MgKiBudW1fcHJlc2VydmVkX2NvZWZmcywgMik7CisKKyAgY29uc3QgSW5kZXggbnVtX3RocmVhZHMgPSBibG9ja0RpbS54ICogZ3JpZERpbS54OworICBjb25zdCBJbmRleCB0aHJlYWRfaWQgPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OworCisgIC8vIEluaXRpYWxpemUgdGhlIG91dHB1dCB2YWx1ZXMgaWYgdGhleSB3ZXJlbid0IGluaXRpYWxpemVkIGJ5IHRoZSBSZWR1Y3Rpb25Jbml0S2VybmVsCisgIGlmIChncmlkRGltLnggPT0gMSkgeworICAgIEluZGV4IGkgPSAyKnRocmVhZF9pZDsKKyAgICBmb3IgKDsgaSArIDEgPCBudW1fcHJlc2VydmVkX2NvZWZmczsgaSArPSAyKm51bV90aHJlYWRzKSB7CisgICAgICBoYWxmKiBsb2MgPSBvdXRwdXQgKyBpOworICAgICAgKigoaGFsZjIqKWxvYykgPSByZWR1Y2VyLnRlbXBsYXRlIGluaXRpYWxpemVQYWNrZXQ8aGFsZjI+KCk7CisgICAgfQorICAgIGlmIChpIDwgbnVtX3ByZXNlcnZlZF9jb2VmZnMpIHsKKyAgICAgIG91dHB1dFtpXSA9IHJlZHVjZXIuaW5pdGlhbGl6ZSgpOworICAgIH0KKyAgICBfX3N5bmN0aHJlYWRzKCk7CisgIH0KKworICBmb3IgKEluZGV4IGkgPSBibG9ja0lkeC54OyBpIDwgbnVtX2lucHV0X2Jsb2NrczsgaSArPSBncmlkRGltLngpIHsKKyAgICBjb25zdCBJbmRleCByb3cgPSAyICogKGkgLyBpbnB1dF9jb2xfYmxvY2tzKTsKKworICAgIGlmIChyb3cgKyAxIDwgbnVtX3ByZXNlcnZlZF9jb2VmZnMpIHsKKyAgICAgIGNvbnN0IEluZGV4IGNvbF9ibG9jayA9IGkgJSBpbnB1dF9jb2xfYmxvY2tzOworICAgICAgY29uc3QgSW5kZXggY29sX2JlZ2luID0gMiAqIChjb2xfYmxvY2sgKiBibG9ja0RpbS54ICogTnVtUGVyVGhyZWFkICsgdGhyZWFkSWR4LngpOworCisgICAgICBoYWxmMiByZWR1Y2VkX3ZhbDEgPSByZWR1Y2VyLnRlbXBsYXRlIGluaXRpYWxpemVQYWNrZXQ8aGFsZjI+KCk7CisgICAgICBoYWxmMiByZWR1Y2VkX3ZhbDIgPSByZWR1Y2VyLnRlbXBsYXRlIGluaXRpYWxpemVQYWNrZXQ8aGFsZjI+KCk7CisKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBOdW1QZXJUaHJlYWQ7IGogKz0gdW5yb2xsX3RpbWVzKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGxhc3RfY29sID0gY29sX2JlZ2luICsgYmxvY2tEaW0ueCAqIChqICsgdW5yb2xsX3RpbWVzIC0gMSkgKiAyOworICAgICAgICBpZiAobGFzdF9jb2wgPj0gbnVtX2NvZWZmc190b19yZWR1Y2UpIHsKKyAgICAgICAgICBJbmRleCBjb2wgPSBjb2xfYmVnaW4gKyBibG9ja0RpbS54ICogajsKKyAgICAgICAgICBmb3IgKDsgY29sICsgMSA8IG51bV9jb2VmZnNfdG9fcmVkdWNlOyBjb2wgKz0gYmxvY2tEaW0ueCkgeworICAgICAgICAgICAgY29uc3QgaGFsZjIgdmFsMSA9IGlucHV0Lm1faW1wbC50ZW1wbGF0ZSBwYWNrZXQ8VW5hbGlnbmVkPihyb3cgKiBudW1fY29lZmZzX3RvX3JlZHVjZSArIGNvbCk7CisgICAgICAgICAgICByZWR1Y2VyLnJlZHVjZVBhY2tldCh2YWwxLCAmcmVkdWNlZF92YWwxKTsKKyAgICAgICAgICAgIGNvbnN0IGhhbGYyIHZhbDIgPSBpbnB1dC5tX2ltcGwudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oKHJvdysxKSAqIG51bV9jb2VmZnNfdG9fcmVkdWNlICsgY29sKTsKKyAgICAgICAgICAgIHJlZHVjZXIucmVkdWNlUGFja2V0KHZhbDIsICZyZWR1Y2VkX3ZhbDIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY29sIDwgbnVtX2NvZWZmc190b19yZWR1Y2UpIHsKKyAgICAgICAgICAgIC8vIFBlZWw7CisgICAgICAgICAgICBjb25zdCBoYWxmIGxhc3QxID0gaW5wdXQubV9pbXBsLmNvZWZmKHJvdyAqIG51bV9jb2VmZnNfdG9fcmVkdWNlICsgY29sKTsKKyAgICAgICAgICAgIGNvbnN0IGhhbGYyIHZhbDEgPSBfX2hhbHZlczJoYWxmMihsYXN0MSwgcmVkdWNlci5pbml0aWFsaXplKCkpOworICAgICAgICAgICAgcmVkdWNlci5yZWR1Y2VQYWNrZXQodmFsMSwgJnJlZHVjZWRfdmFsMSk7CisgICAgICAgICAgICBjb25zdCBoYWxmIGxhc3QyID0gaW5wdXQubV9pbXBsLmNvZWZmKChyb3crMSkgKiBudW1fY29lZmZzX3RvX3JlZHVjZSArIGNvbCk7CisgICAgICAgICAgICBjb25zdCBoYWxmMiB2YWwyID0gX19oYWx2ZXMyaGFsZjIobGFzdDIsIHJlZHVjZXIuaW5pdGlhbGl6ZSgpKTsKKyAgICAgICAgICAgIHJlZHVjZXIucmVkdWNlUGFja2V0KHZhbDIsICZyZWR1Y2VkX3ZhbDIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGYXN0ZXIgdmVyc2lvbiBvZiB0aGUgbG9vcCB3aXRoIG5vIGJyYW5jaGVzIGFmdGVyIHVucm9sbGluZy4KKyNwcmFnbWEgdW5yb2xsCisgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB1bnJvbGxfdGltZXM7ICsraykgeworICAgICAgICAgICAgY29uc3QgSW5kZXggY29sID0gY29sX2JlZ2luICsgYmxvY2tEaW0ueCAqIChqICsgaykgKiAyOworICAgICAgICAgICAgcmVkdWNlci5yZWR1Y2VQYWNrZXQoaW5wdXQubV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KHJvdyAqIG51bV9jb2VmZnNfdG9fcmVkdWNlICsgY29sKSwgJnJlZHVjZWRfdmFsMSk7CisgICAgICAgICAgICByZWR1Y2VyLnJlZHVjZVBhY2tldChpbnB1dC5tX2ltcGwudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oKHJvdyArIDEpKiBudW1fY29lZmZzX3RvX3JlZHVjZSArIGNvbCksICZyZWR1Y2VkX3ZhbDIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisjcHJhZ21hIHVucm9sbAorICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gd2FycFNpemUvMjsgb2Zmc2V0ID4gMDsgb2Zmc2V0IC89IDIpIHsKKyAgICAgICAgcmVkdWNlci5yZWR1Y2VQYWNrZXQoX19zaGZsX2Rvd24ocmVkdWNlZF92YWwxLCBvZmZzZXQsIHdhcnBTaXplKSwgJnJlZHVjZWRfdmFsMSk7CisgICAgICAgIHJlZHVjZXIucmVkdWNlUGFja2V0KF9fc2hmbF9kb3duKHJlZHVjZWRfdmFsMiwgb2Zmc2V0LCB3YXJwU2l6ZSksICZyZWR1Y2VkX3ZhbDIpOworICAgICAgfQorCisgICAgICBoYWxmIHZhbDEgPSAgX19sb3cyaGFsZihyZWR1Y2VkX3ZhbDEpOworICAgICAgcmVkdWNlci5yZWR1Y2UoX19oaWdoMmhhbGYocmVkdWNlZF92YWwxKSwgJnZhbDEpOworICAgICAgaGFsZiB2YWwyID0gIF9fbG93MmhhbGYocmVkdWNlZF92YWwyKTsKKyAgICAgIHJlZHVjZXIucmVkdWNlKF9faGlnaDJoYWxmKHJlZHVjZWRfdmFsMiksICZ2YWwyKTsKKyAgICAgIGhhbGYyIHZhbCA9IF9faGFsdmVzMmhhbGYyKHZhbDEsIHZhbDIpOworCisgICAgICBpZiAoKHRocmVhZElkeC54ICYgKHdhcnBTaXplIC0gMSkpID09IDApIHsKKyAgICAgICAgaGFsZiogbG9jID0gb3V0cHV0ICsgcm93OworICAgICAgICBhdG9taWNSZWR1Y2UoKGhhbGYyKilsb2MsIHZhbCwgcmVkdWNlcik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3AsIHR5cGVuYW1lIE91dHB1dFR5cGUsIGJvb2wgUGFja2V0QWNjZXNzLCB0eXBlbmFtZSBFbmFibGVkID0gdm9pZD4KK3N0cnVjdCBJbm5lclJlZHVjdGlvbkxhdW5jaGVyIHsKKyAgc3RhdGljIEVJR0VOX0RFVklDRV9GVU5DIGJvb2wgcnVuKGNvbnN0IFNlbGYmLCBPcCYsIGNvbnN0IEdwdURldmljZSYsIE91dHB1dFR5cGUqLCB0eXBlbmFtZSBTZWxmOjpJbmRleCwgdHlwZW5hbWUgU2VsZjo6SW5kZXgpIHsKKyAgICBhc3NlcnQoZmFsc2UgJiYgIlNob3VsZCBvbmx5IGJlIGNhbGxlZCB0byByZWR1Y2UgZG91YmxlcywgZmxvYXRzIGFuZCBoYWxmIGZsb2F0cyBvbiBhIGdwdSBkZXZpY2UiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0IGFuZCBkb3VibGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgT3V0cHV0VHlwZSwgYm9vbCBQYWNrZXRBY2Nlc3M+CitzdHJ1Y3QgSW5uZXJSZWR1Y3Rpb25MYXVuY2hlcjwKKyAgU2VsZiwgT3AsIE91dHB1dFR5cGUsIFBhY2tldEFjY2VzcywKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwKKyAgICBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgT3V0cHV0VHlwZT46OnZhbHVlIHx8CisgICAgaW50ZXJuYWw6OmlzX3NhbWU8ZG91YmxlLCBPdXRwdXRUeXBlPjo6dmFsdWUsCisgIHZvaWQ+Ojp0eXBlPiB7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgR3B1RGV2aWNlJiBkZXZpY2UsIE91dHB1dFR5cGUqIG91dHB1dCwgdHlwZW5hbWUgU2VsZjo6SW5kZXggbnVtX2NvZWZmc190b19yZWR1Y2UsIHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9wcmVzZXJ2ZWRfdmFscykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZjo6SW5kZXggSW5kZXg7CisKKyAgICBjb25zdCBJbmRleCBudW1fY29lZmZzID0gbnVtX2NvZWZmc190b19yZWR1Y2UgKiBudW1fcHJlc2VydmVkX3ZhbHM7CisgICAgY29uc3QgaW50IGJsb2NrX3NpemUgPSAyNTY7CisgICAgY29uc3QgaW50IG51bV9wZXJfdGhyZWFkID0gMTI4OworICAgIGNvbnN0IGludCBkeW5fYmxvY2tzID0gZGl2dXA8aW50PihudW1fY29lZmZzLCBibG9ja19zaXplICogbnVtX3Blcl90aHJlYWQpOworICAgIGNvbnN0IGludCBtYXhfYmxvY2tzID0gZGV2aWNlLmdldE51bUN1ZGFNdWx0aVByb2Nlc3NvcnMoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UubWF4Q3VkYVRocmVhZHNQZXJNdWx0aVByb2Nlc3NvcigpIC8gYmxvY2tfc2l6ZTsKKyAgICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9IG51bWV4dDo6bWluaTxpbnQ+KG1heF9ibG9ja3MsIGR5bl9ibG9ja3MpOworCisgICAgaWYgKG51bV9ibG9ja3MgPiAxKSB7CisgICAgICAvLyBXZSBpbml0aWFsaXplIHRoZSBvdXRwdXRzIG91dHNpZGUgdGhlIHJlZHVjdGlvbiBrZXJuZWwgd2hlbiB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlcmUKKyAgICAgIC8vIHdvbid0IGJlIGEgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gbXVsdGlwbGUgdGhyZWFkIGJsb2Nrcy4KKyAgICAgIGNvbnN0IGludCBkeW5fYmxvY2tzID0gZGl2dXA8aW50PihudW1fcHJlc2VydmVkX3ZhbHMsIDEwMjQpOworICAgICAgY29uc3QgaW50IG1heF9ibG9ja3MgPSBkZXZpY2UuZ2V0TnVtQ3VkYU11bHRpUHJvY2Vzc29ycygpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5tYXhDdWRhVGhyZWFkc1Blck11bHRpUHJvY2Vzc29yKCkgLyAxMDI0OworICAgICAgY29uc3QgaW50IG51bV9ibG9ja3MgPSBudW1leHQ6Om1pbmk8aW50PihtYXhfYmxvY2tzLCBkeW5fYmxvY2tzKTsKKyAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoUmVkdWN0aW9uSW5pdEtlcm5lbDxPdXRwdXRUeXBlLCBJbmRleD4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ibG9ja3MsIDEwMjQsIDAsIGRldmljZSwgcmVkdWNlci5pbml0aWFsaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ByZXNlcnZlZF92YWxzLCBvdXRwdXQpOworICAgIH0KKworICAgIExBVU5DSF9DVURBX0tFUk5FTCgoSW5uZXJSZWR1Y3Rpb25LZXJuZWw8bnVtX3Blcl90aHJlYWQsIFNlbGYsIE9wLCBJbmRleD4pLAorICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzLCBibG9ja19zaXplLCAwLCBkZXZpY2UsIHJlZHVjZXIsIHNlbGYsIG51bV9jb2VmZnNfdG9fcmVkdWNlLCBudW1fcHJlc2VydmVkX3ZhbHMsIG91dHB1dCk7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3A+CitzdHJ1Y3QgSW5uZXJSZWR1Y3Rpb25MYXVuY2hlcjxTZWxmLCBPcCwgRWlnZW46OmhhbGYsIGZhbHNlPiB7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiwgT3AmLCBjb25zdCBHcHVEZXZpY2UmLCBoYWxmKiwgdHlwZW5hbWUgU2VsZjo6SW5kZXgsIHR5cGVuYW1lIFNlbGY6OkluZGV4KSB7CisgICAgYXNzZXJ0KGZhbHNlICYmICJTaG91bGQgbm90IGJlIGNhbGxlZCBzaW5jZSB0aGVyZSBpcyBubyBwYWNrZXQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIE9wPgorc3RydWN0IElubmVyUmVkdWN0aW9uTGF1bmNoZXI8U2VsZiwgT3AsIEVpZ2VuOjpoYWxmLCB0cnVlPiB7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgR3B1RGV2aWNlJiBkZXZpY2UsIGhhbGYqIG91dHB1dCwgdHlwZW5hbWUgU2VsZjo6SW5kZXggbnVtX2NvZWZmc190b19yZWR1Y2UsIHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9wcmVzZXJ2ZWRfdmFscykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZjo6SW5kZXggSW5kZXg7CisKKyAgICBpZiAobnVtX3ByZXNlcnZlZF92YWxzICUgMiAhPSAwKSB7CisgICAgICAvLyBOb3Qgc3VwcG9ydGVkIHlldCwgcmV2ZXJ0IHRvIHRoZSBzbG93ZXIgY29kZSBwYXRoCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBJbmRleCBudW1fY29lZmZzID0gbnVtX2NvZWZmc190b19yZWR1Y2UgKiBudW1fcHJlc2VydmVkX3ZhbHM7CisgICAgY29uc3QgaW50IGJsb2NrX3NpemUgPSAvKjI1NiovMTI4OworICAgIGNvbnN0IGludCBudW1fcGVyX3RocmVhZCA9IC8qMTI4Ki82NDsKKyAgICBjb25zdCBpbnQgZHluX2Jsb2NrcyA9IGRpdnVwPGludD4obnVtX2NvZWZmcywgYmxvY2tfc2l6ZSAqIG51bV9wZXJfdGhyZWFkKTsKKyAgICBjb25zdCBpbnQgbWF4X2Jsb2NrcyA9IGRldmljZS5nZXROdW1DdWRhTXVsdGlQcm9jZXNzb3JzKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLm1heEN1ZGFUaHJlYWRzUGVyTXVsdGlQcm9jZXNzb3IoKSAvIGJsb2NrX3NpemU7CisgICAgY29uc3QgaW50IG51bV9ibG9ja3MgPSBudW1leHQ6Om1pbmk8aW50PihtYXhfYmxvY2tzLCBkeW5fYmxvY2tzKTsKKworICAgIGlmIChudW1fYmxvY2tzID4gMSkgeworICAgICAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgb3V0cHV0cyBvdXRzaWRlIHRoZSByZWR1Y3Rpb24ga2VybmVsIHdoZW4gd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZXJlCisgICAgICAvLyB3b24ndCBiZSBhIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZCBibG9ja3MuCisgICAgICBjb25zdCBpbnQgZHluX2Jsb2NrcyA9IGRpdnVwPGludD4obnVtX3ByZXNlcnZlZF92YWxzLCAxMDI0KTsKKyAgICAgIGNvbnN0IGludCBtYXhfYmxvY2tzID0gZGV2aWNlLmdldE51bUN1ZGFNdWx0aVByb2Nlc3NvcnMoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UubWF4Q3VkYVRocmVhZHNQZXJNdWx0aVByb2Nlc3NvcigpIC8gMTAyNDsKKyAgICAgIGNvbnN0IGludCBudW1fYmxvY2tzID0gbnVtZXh0OjptaW5pPGludD4obWF4X2Jsb2NrcywgZHluX2Jsb2Nrcyk7CisgICAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKFJlZHVjdGlvbkluaXRLZXJuZWxIYWxmRmxvYXQ8U2VsZiwgT3AsIEluZGV4PiksCisgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMCwgZGV2aWNlLCByZWR1Y2VyLCBzZWxmLCBudW1fcHJlc2VydmVkX3ZhbHMsIG91dHB1dCk7CisgICAgfQorCisgICAgTEFVTkNIX0NVREFfS0VSTkVMKChJbm5lclJlZHVjdGlvbktlcm5lbEhhbGZGbG9hdDxudW1fcGVyX3RocmVhZCwgU2VsZiwgT3AsIEluZGV4PiksCisgICAgICAgICAgICAgICAgICAgICAgIG51bV9ibG9ja3MsIGJsb2NrX3NpemUsIDAsIGRldmljZSwgcmVkdWNlciwgc2VsZiwgbnVtX2NvZWZmc190b19yZWR1Y2UsIG51bV9wcmVzZXJ2ZWRfdmFscywgb3V0cHV0KTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKyNlbmRpZgorCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBPcD4KK3N0cnVjdCBJbm5lclJlZHVjZXI8U2VsZiwgT3AsIEdwdURldmljZT4geworICAvLyBVbmZvcnR1bmF0ZWx5IG52aWRpYSBkb2Vzbid0IHN1cHBvcnQgd2VsbCBleG90aWMgdHlwZXMgc3VjaCBhcyBjb21wbGV4LAorICAvLyBzbyByZWR1Y2UgdGhlIHNjb3BlIG9mIHRoZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgY29kZSB0byB0aGUgc2ltcGxlIGNhc2UKKyAgLy8gb2YgZmxvYXRzIGFuZCBoYWxmIGZsb2F0cy4KKyNpZmRlZiBFSUdFTl9IQVNfQ1VEQV9GUDE2CisgIHN0YXRpYyBjb25zdCBib29sIEhhc09wdGltaXplZEltcGxlbWVudGF0aW9uID0gIU9wOjpJc1N0YXRlZnVsICYmCisgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBmbG9hdD46OnZhbHVlIHx8CisgICAgICAgaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBkb3VibGU+Ojp2YWx1ZSB8fAorICAgICAgIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUsIEVpZ2VuOjpoYWxmPjo6dmFsdWUgJiYgcmVkdWNlcl90cmFpdHM8T3AsIEdwdURldmljZT46OlBhY2tldEFjY2VzcykpOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgSGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gPSAhT3A6OklzU3RhdGVmdWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBmbG9hdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSwgZG91YmxlPjo6dmFsdWUpOworI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dFR5cGU+CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgR3B1RGV2aWNlJiBkZXZpY2UsIE91dHB1dFR5cGUqIG91dHB1dCwgdHlwZW5hbWUgU2VsZjo6SW5kZXggbnVtX2NvZWZmc190b19yZWR1Y2UsIHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9wcmVzZXJ2ZWRfdmFscykgeworICAgIGFzc2VydChIYXNPcHRpbWl6ZWRJbXBsZW1lbnRhdGlvbiAmJiAiU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGRvdWJsZXMsIGZsb2F0cyBvciBoYWxmIGZsb2F0cyIpOworICAgIGNvbnN0IEluZGV4IG51bV9jb2VmZnMgPSBhcnJheV9wcm9kKHNlbGYubV9pbXBsLmRpbWVuc2lvbnMoKSk7CisgICAgLy8gRG9uJ3QgY3Jhc2ggd2hlbiB3ZSdyZSBjYWxsZWQgd2l0aCBhbiBpbnB1dCB0ZW5zb3Igb2Ygc2l6ZSAwLgorICAgIGlmIChudW1fY29lZmZzID09IDApIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBJdCdzIGZhc3RlciB0byB1c2UgdGhlIHVzdWFsIGNvZGUuCisgICAgaWYgKG51bV9jb2VmZnNfdG9fcmVkdWNlIDw9IDEyOCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIElubmVyUmVkdWN0aW9uTGF1bmNoZXI8U2VsZiwgT3AsIE91dHB1dFR5cGUsIHJlZHVjZXJfdHJhaXRzPE9wLCBHcHVEZXZpY2U+OjpQYWNrZXRBY2Nlc3M+OjpydW4oc2VsZiwgcmVkdWNlciwgZGV2aWNlLCBvdXRwdXQsIG51bV9jb2VmZnNfdG9fcmVkdWNlLCBudW1fcHJlc2VydmVkX3ZhbHMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IE51bVBlclRocmVhZCwgdHlwZW5hbWUgU2VsZiwKKyAgICAgICAgICB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBJbmRleD4KK19fZ2xvYmFsX18gdm9pZCBPdXRlclJlZHVjdGlvbktlcm5lbChSZWR1Y2VyIHJlZHVjZXIsIGNvbnN0IFNlbGYgaW5wdXQsIEluZGV4IG51bV9jb2VmZnNfdG9fcmVkdWNlLCBJbmRleCBudW1fcHJlc2VydmVkX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUqIG91dHB1dCkgeworICBjb25zdCBJbmRleCBudW1fdGhyZWFkcyA9IGJsb2NrRGltLnggKiBncmlkRGltLng7CisgIGNvbnN0IEluZGV4IHRocmVhZF9pZCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgIC8vIEluaXRpYWxpemUgdGhlIG91dHB1dCB2YWx1ZXMgaWYgdGhleSB3ZXJlbid0IGluaXRpYWxpemVkIGJ5IHRoZSBSZWR1Y3Rpb25Jbml0S2VybmVsCisgIGlmIChncmlkRGltLnggPT0gMSkgeworICAgIGZvciAoSW5kZXggaSA9IHRocmVhZF9pZDsgaSA8IG51bV9wcmVzZXJ2ZWRfY29lZmZzOyBpICs9IG51bV90aHJlYWRzKSB7CisgICAgICBvdXRwdXRbaV0gPSByZWR1Y2VyLmluaXRpYWxpemUoKTsKKyAgICB9CisgICAgX19zeW5jdGhyZWFkcygpOworICB9CisKKyAgLy8gRG8gdGhlIHJlZHVjdGlvbi4KKyAgY29uc3QgSW5kZXggbWF4X2l0ZXIgPSBudW1fcHJlc2VydmVkX2NvZWZmcyAqIGRpdnVwPEluZGV4PihudW1fY29lZmZzX3RvX3JlZHVjZSwgTnVtUGVyVGhyZWFkKTsKKyAgZm9yIChJbmRleCBpID0gdGhyZWFkX2lkOyBpIDwgbWF4X2l0ZXI7IGkgKz0gbnVtX3RocmVhZHMpIHsKKyAgICBjb25zdCBJbmRleCBpbnB1dF9jb2wgPSBpICUgbnVtX3ByZXNlcnZlZF9jb2VmZnM7CisgICAgY29uc3QgSW5kZXggaW5wdXRfcm93ID0gKGkgLyBudW1fcHJlc2VydmVkX2NvZWZmcykgKiBOdW1QZXJUaHJlYWQ7CisgICAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIHJlZHVjZWRfdmFsID0gcmVkdWNlci5pbml0aWFsaXplKCk7CisgICAgY29uc3QgSW5kZXggbWF4X3JvdyA9IG51bWV4dDo6bWluaShpbnB1dF9yb3cgKyBOdW1QZXJUaHJlYWQsIG51bV9jb2VmZnNfdG9fcmVkdWNlKTsKKyAgICBmb3IgKEluZGV4IGogPSBpbnB1dF9yb3c7IGogPCBtYXhfcm93OyBqKyspIHsKKyAgICAgIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSB2YWwgPSBpbnB1dC5tX2ltcGwuY29lZmYoaiAqIG51bV9wcmVzZXJ2ZWRfY29lZmZzICsgaW5wdXRfY29sKTsKKyAgICAgIHJlZHVjZXIucmVkdWNlKHZhbCwgJnJlZHVjZWRfdmFsKTsKKyAgICB9CisgICAgYXRvbWljUmVkdWNlKCYob3V0cHV0W2lucHV0X2NvbF0pLCByZWR1Y2VkX3ZhbCwgcmVkdWNlcik7CisgIH0KK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3A+CitzdHJ1Y3QgT3V0ZXJSZWR1Y2VyPFNlbGYsIE9wLCBHcHVEZXZpY2U+IHsKKyAgLy8gVW5mb3J0dW5hdGVseSBudmlkaWEgZG9lc24ndCBzdXBwb3J0IHdlbGwgZXhvdGljIHR5cGVzIHN1Y2ggYXMgY29tcGxleCwKKyAgLy8gc28gcmVkdWNlIHRoZSBzY29wZSBvZiB0aGUgb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGNvZGUgdG8gdGhlIHNpbXBsZSBjYXNlCisgIC8vIG9mIGZsb2F0cy4KKyAgc3RhdGljIGNvbnN0IGJvb2wgSGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gPSAhT3A6OklzU3RhdGVmdWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlLCBmbG9hdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSwgZG91YmxlPjo6dmFsdWUpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBPdXRwdXRUeXBlPgorICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgYm9vbCBydW4oY29uc3QgU2VsZiYsIE9wJiwgY29uc3QgRGV2aWNlJiwgT3V0cHV0VHlwZSosIHR5cGVuYW1lIFNlbGY6OkluZGV4LCB0eXBlbmFtZSBTZWxmOjpJbmRleCkgeworICAgIGFzc2VydChmYWxzZSAmJiAiU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHRvIHJlZHVjZSBkb3VibGVzIG9yIGZsb2F0cyBvbiBhIGdwdSBkZXZpY2UiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgR3B1RGV2aWNlJiBkZXZpY2UsIGZsb2F0KiBvdXRwdXQsIHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9jb2VmZnNfdG9fcmVkdWNlLCB0eXBlbmFtZSBTZWxmOjpJbmRleCBudW1fcHJlc2VydmVkX3ZhbHMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNlbGY6OkluZGV4IEluZGV4OworCisgICAgLy8gSXQncyBmYXN0ZXIgdG8gdXNlIHRoZSB1c3VhbCBjb2RlLgorICAgIGlmIChudW1fY29lZmZzX3RvX3JlZHVjZSA8PSAzMikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgSW5kZXggbnVtX2NvZWZmcyA9IG51bV9jb2VmZnNfdG9fcmVkdWNlICogbnVtX3ByZXNlcnZlZF92YWxzOworICAgIGNvbnN0IGludCBibG9ja19zaXplID0gMjU2OworICAgIGNvbnN0IGludCBudW1fcGVyX3RocmVhZCA9IDE2OworICAgIGNvbnN0IGludCBkeW5fYmxvY2tzID0gZGl2dXA8aW50PihudW1fY29lZmZzLCBibG9ja19zaXplICogbnVtX3Blcl90aHJlYWQpOworICAgIGNvbnN0IGludCBtYXhfYmxvY2tzID0gZGV2aWNlLmdldE51bUN1ZGFNdWx0aVByb2Nlc3NvcnMoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UubWF4Q3VkYVRocmVhZHNQZXJNdWx0aVByb2Nlc3NvcigpIC8gYmxvY2tfc2l6ZTsKKyAgICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9IG51bWV4dDo6bWluaTxpbnQ+KG1heF9ibG9ja3MsIGR5bl9ibG9ja3MpOworCisgICAgaWYgKG51bV9ibG9ja3MgPiAxKSB7CisgICAgICAvLyBXZSBpbml0aWFsaXplIHRoZSBvdXRwdXRzIGluIHRoZSByZWR1Y3Rpb24ga2VybmVsIGl0c2VsZiB3aGVuIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKKyAgICAgIC8vIGFib3V0IHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZCBibG9ja3MuCisgICAgICBjb25zdCBpbnQgZHluX2Jsb2NrcyA9IGRpdnVwPGludD4obnVtX3ByZXNlcnZlZF92YWxzLCAxMDI0KTsKKyAgICAgIGNvbnN0IGludCBtYXhfYmxvY2tzID0gZGV2aWNlLmdldE51bUN1ZGFNdWx0aVByb2Nlc3NvcnMoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5tYXhDdWRhVGhyZWFkc1Blck11bHRpUHJvY2Vzc29yKCkgLyAxMDI0OworICAgICAgY29uc3QgaW50IG51bV9ibG9ja3MgPSBudW1leHQ6Om1pbmk8aW50PihtYXhfYmxvY2tzLCBkeW5fYmxvY2tzKTsKKyAgICAgIExBVU5DSF9DVURBX0tFUk5FTCgoUmVkdWN0aW9uSW5pdEtlcm5lbDxmbG9hdCwgSW5kZXg+KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzLCAxMDI0LCAwLCBkZXZpY2UsIHJlZHVjZXIuaW5pdGlhbGl6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcmVzZXJ2ZWRfdmFscywgb3V0cHV0KTsKKyAgICB9CisKKyAgICBMQVVOQ0hfQ1VEQV9LRVJORUwoKE91dGVyUmVkdWN0aW9uS2VybmVsPG51bV9wZXJfdGhyZWFkLCBTZWxmLCBPcCwgSW5kZXg+KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgMCwgZGV2aWNlLCByZWR1Y2VyLCBzZWxmLCBudW1fY29lZmZzX3RvX3JlZHVjZSwgbnVtX3ByZXNlcnZlZF92YWxzLCBvdXRwdXQpOworCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisjZW5kaWYKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9SRURVQ1RJT05fQ1VEQV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclJlZHVjdGlvblN5Y2wuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmVkdWN0aW9uU3ljbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWVjYjAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclJlZHVjdGlvblN5Y2wuaApAQCAtMCwwICsxLDI0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZW5zb3JTeWNsUGxhY2VIb2xkZXJFeHByLmgKKyAqCisgKiBcYnJpZWY6CisgKiAgVGhpcyBpcyB0aGUgc3BlY2lhbGlzYXRpb24gb2YgdGhlIHBsYWNlaG9sZGVyIGV4cHJlc3Npb24gYmFzZWQgb24gdGhlCisgKiBvcGVyYXRpb24gdHlwZQorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SX1JFRFVDVElPTl9TWUNMX0hQUAorI2RlZmluZSBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUl9SRURVQ1RJT05fU1lDTF9IUFAKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIENvZWZmUmV0dXJuVHlwZSwgdHlwZW5hbWUgS2VybmVsTmFtZT4gc3RydWN0IHN5Y2xHZW5lcmljQnVmZmVyUmVkdWNlcnsKK3RlbXBsYXRlPHR5cGVuYW1lIEJ1ZmZlclRPdXQsIHR5cGVuYW1lIEJ1ZmZlclRJbj4KK3N0YXRpYyB2b2lkIHJ1bihCdWZmZXJUT3V0KiBidWZPdXQsIEJ1ZmZlclRJbiYgYnVmSSwgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIGRldiwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IGxvY2FsKXsKKyAgZG8geworICAgICAgICAgIGF1dG8gZiA9IFtsZW5ndGgsIGxvY2FsLCBidWZPdXQsICZidWZJXShjbDo6c3ljbDo6aGFuZGxlciYgaCkgbXV0YWJsZSB7CisgICAgICAgICAgICBjbDo6c3ljbDo6bmRfcmFuZ2U8MT4gcntjbDo6c3ljbDo6cmFuZ2U8MT57c3RkOjptYXgobGVuZ3RoLCBsb2NhbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OnN5Y2w6OnJhbmdlPDE+e3N0ZDo6bWluKGxlbmd0aCwgbG9jYWwpfX07CisgICAgICAgICAgICAvKiBUd28gYWNjZXNzb3JzIGFyZSB1c2VkOiBvbmUgdG8gdGhlIGJ1ZmZlciB0aGF0IGlzIGJlaW5nIHJlZHVjZWQsCisgICAgICAgICAgICAgKiBhbmQgYSBzZWNvbmQgdG8gbG9jYWwgbWVtb3J5LCB1c2VkIHRvIHN0b3JlIGludGVybWVkaWF0ZSBkYXRhLiAqLworICAgICAgICAgICAgYXV0byBhSSA9CisgICAgICAgICAgICAgICAgYnVmSS50ZW1wbGF0ZSBnZXRfYWNjZXNzPGNsOjpzeWNsOjphY2Nlc3M6Om1vZGU6OnJlYWRfd3JpdGU+KGgpOworICAgICAgICAgICAgYXV0byBhT3V0ID0KKyAgICAgICAgICAgICAgICBidWZPdXQtPnRlbXBsYXRlIGdldF9hY2Nlc3M8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6ZGlzY2FyZF93cml0ZT4oaCk7CisgICAgICAgICAgICBjbDo6c3ljbDo6YWNjZXNzb3I8Q29lZmZSZXR1cm5UeXBlLCAxLCBjbDo6c3ljbDo6YWNjZXNzOjptb2RlOjpyZWFkX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpzeWNsOjphY2Nlc3M6OnRhcmdldDo6bG9jYWw+CisgICAgICAgICAgICAgICAgc2NyYXRjaChjbDo6c3ljbDo6cmFuZ2U8MT4obG9jYWwpLCBoKTsKKworICAgICAgICAgICAgLyogVGhlIHBhcmFsbGVsX2ZvciBpbnZvY2F0aW9uIGNob3NlbiBpcyB0aGUgdmFyaWFudCB3aXRoIGFuIG5kX2l0ZW0KKyAgICAgICAgICAgICAqIHBhcmFtZXRlciwgc2luY2UgdGhlIGNvZGUgcmVxdWlyZXMgYmFycmllcnMgZm9yIGNvcnJlY3RuZXNzLiAqLworICAgICAgICAgICAgaC5wYXJhbGxlbF9mb3I8S2VybmVsTmFtZT4oCisgICAgICAgICAgICAgICAgciwgW2FPdXQsIGFJLCBzY3JhdGNoLCBsb2NhbCwgbGVuZ3RoXShjbDo6c3ljbDo6bmRfaXRlbTwxPiBpZCkgeworICAgICAgICAgICAgICAgICAgc2l6ZV90IGdsb2JhbGlkID0gaWQuZ2V0X2dsb2JhbCgwKTsKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBsb2NhbGlkID0gaWQuZ2V0X2xvY2FsKDApOworICAgICAgICAgICAgICAgICAgLyogQWxsIHRocmVhZHMgY29sbGVjdGl2ZWx5IHJlYWQgZnJvbSBnbG9iYWwgbWVtb3J5IGludG8gbG9jYWwuCisgICAgICAgICAgICAgICAgICAgKiBUaGUgYmFycmllciBlbnN1cmVzIGFsbCB0aHJlYWRzJyBJTyBpcyByZXNvbHZlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAqIGV4ZWN1dGlvbiBjb250aW51ZXMgKHN0cmljdGx5IHNwZWFraW5nLCBhbGwgdGhyZWFkcyB3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAqIGEgc2luZ2xlIHdvcmstZ3JvdXAgLSB0aGVyZSBpcyBubyBjby1vcmRpbmF0aW9uIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAqIHdvcmstZ3JvdXBzLCBvbmx5IHdvcmstaXRlbXMpLiAqLworICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbGlkIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hbbG9jYWxpZF0gPSBhSVtnbG9iYWxpZF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZC5iYXJyaWVyKGNsOjpzeWNsOjphY2Nlc3M6OmZlbmNlX3NwYWNlOjpsb2NhbF9zcGFjZSk7CisKKyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IHRoZSByZWR1Y3Rpb24gb3BlcmF0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAqIGlkIGFuZCB0aGUgb25lIG9uIHRoZSBvdGhlciBoYWxmIG9mIHRoZSB2ZWN0b3IuICovCisgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsaWQgPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pbiA9IChsZW5ndGggPCBsb2NhbCkgPyBsZW5ndGggOiBsb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3Qgb2Zmc2V0ID0gbWluIC8gMjsgb2Zmc2V0ID4gMDsgb2Zmc2V0IC89IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxpZCA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaFtsb2NhbGlkXSArPSBzY3JhdGNoW2xvY2FsaWQgKyBvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBpZC5iYXJyaWVyKGNsOjpzeWNsOjphY2Nlc3M6OmZlbmNlX3NwYWNlOjpsb2NhbF9zcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpbmFsIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbiBsb2NhbCBpZCAwLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxpZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgYUlbaWQuZ2V0X2dyb3VwKDApXSA9IHNjcmF0Y2hbbG9jYWxpZF07CisgICAgICAgICAgICAgICAgICAgICAgaWYoKGxlbmd0aDw9bG9jYWwpICYmIGdsb2JhbGlkID09MCl7CisgICAgICAgICAgICAgICAgICAgICAgICBhT3V0W2dsb2JhbGlkXT1zY3JhdGNoW2xvY2FsaWRdOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH07CisgICAgICAgICAgICBkZXYubV9xdWV1ZS5zdWJtaXQoZik7CisgICAgICAgICAgICBkZXYubV9xdWV1ZS50aHJvd19hc3luY2hyb25vdXMoKTsKKworICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHlvdSBjb3VsZCBxdWV1ZTo6d2FpdF9hbmRfdGhyb3coKSB0byBlbnN1cmUgdGhhdAorICAgICAgICAgICAqIGVycm9ycyBhcmUgY2F1Z2h0IHF1aWNrbHkuIEhvd2V2ZXIsIHRoaXMgd291bGQgbGlrZWx5IGltcGFjdAorICAgICAgICAgICAqIHBlcmZvcm1hbmNlIG5lZ2F0aXZlbHkuICovCisgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIC8gbG9jYWw7CisKKyAgICAgICAgfSB3aGlsZSAobGVuZ3RoID4gMSk7CisKKworCit9CisKK307CisKKy8vLyBGb3Igbm93IGxldCdzIHN0YXJ0IHdpdGggYSBmdWxsIHJlZHVjZXIKKy8vLyBTZWxmIGlzIHVzZWxlc3MgaGVyZSBiZWNhdXNlIGluIGV4cHJlc3Npb24gY29uc3RydWN0aW9uIHdlIGFyZSBnb2luZyB0byB0cmVhdCByZWR1Y3Rpb24gYXMgYSBsZWFmbm9kZS4KKy8vLyB3ZSB3YW50IHRvIHRha2UgcmVkdWN0aW9uIGNoaWxkIGFuZCB0aGVuIGJ1aWxkIGEgY29uc3RydWN0aW9uIGFuZCBhcHBseSB0aGUgZnVsbCByZWR1Y2VyIGZ1bmN0aW9uIG9uIGl0LiBGdWxscmVkdWNyZSBhcHBsaWVzIHRoZQorLy8vIHJlZHVjdGlvbiBvcGVyYXRpb24gb24gdGhlIGNoaWxkIG9mIHRoZSByZWR1Y3Rpb24uIG9uY2UgaXQgaXMgZG9uZSB0aGUgcmVkdWN0aW9uIGlzIGFuIGVtcHR5IHNoZWxsIGFuZCBjYW4gYmUgdGhyb3duIGF3YXkgYW5kIHRyZWF0ZWQgYXMKKy8vIGEgbGVhZk5vZGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3AsIGJvb2wgVmVjdG9yaXphYmxlPgorc3RydWN0IEZ1bGxSZWR1Y2VyPFNlbGYsIE9wLCBjb25zdCBFaWdlbjo6U3ljbERldmljZSwgVmVjdG9yaXphYmxlPiB7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBTZWxmOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgYm9vbCBIYXNPcHRpbWl6ZWRJbXBsZW1lbnRhdGlvbiA9IGZhbHNlOworCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTZWxmJiBzZWxmLCBPcCYgcmVkdWNlciwgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIGRldiwgQ29lZmZSZXR1cm5UeXBlKiBvdXRwdXQpIHsKKyAgICB0eXBlZGVmIGNvbnN0IHR5cGVuYW1lIFNlbGY6OkNoaWxkVHlwZSBIb3N0RXhwcjsgLy8vIHRoaXMgaXMgdGhlIGNoaWxkIG9mIHJlZHVjdGlvbgorICAgIHR5cGVkZWYgIHR5cGVuYW1lIFRlbnNvclN5Y2w6OmludGVybmFsOjpjcmVhdGVQbGFjZUhvbGRlckV4cHJlc3Npb248SG9zdEV4cHI+OjpUeXBlIFBsYWNlSG9sZGVyRXhwcjsKKyAgICBhdXRvIGZ1bmN0b3JzID0gVGVuc29yU3ljbDo6aW50ZXJuYWw6OmV4dHJhY3RGdW5jdG9ycyhzZWxmLmltcGwoKSk7CisgICAgaW50IHJlZF9mYWN0b3IgPTI1NjsgLy8vIGluaXRpYWwgcmVkdWN0aW9uLiBJZiB0aGUgc2l6ZSBpcyBsZXNzIHRoYW4gcmVkX2ZhY3RvciB3ZSBvbmx5IGNyZWF0ZXMgb25lIHRocmVhZC4KKyAgICBzaXplX3QgaW5wdXRTaXplID1zZWxmLmltcGwoKS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCk7CisgICAgc2l6ZV90IHJuZyA9IGlucHV0U2l6ZS9yZWRfZmFjdG9yOyAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZCBpbml0aWFsbHkgaXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQKKyAgICBzaXplX3QgcmVtYWluaW5nID0gaW5wdXRTaXplJSByZWRfZmFjdG9yOworICAgIGlmKHJuZyA9PTApIHsKKyAgICAgIHJlZF9mYWN0b3I9MTsKKyAgICB9OworICAgIHNpemVfdCB0aWxlU2l6ZSA9ZGV2Lm1fcXVldWUuZ2V0X2RldmljZSgpLiB0ZW1wbGF0ZSBnZXRfaW5mbzxjbDo6c3ljbDo6aW5mbzo6ZGV2aWNlOjptYXhfd29ya19ncm91cF9zaXplPigpLzI7CisgICAgc2l6ZV90IEdSYW5nZT1zdGQ6Om1heCgoc2l6ZV90ICkxLCBybmcpOworCisgICAgLy8gY29udmVydCBnbG9iYWwgcmFuZ2UgdG8gcG93ZXIgb2YgMiBmb3IgcmVkZWN1dGlvbgorICAgIEdSYW5nZS0tOworICAgIEdSYW5nZSB8PSBHUmFuZ2UgPj4gMTsKKyAgICBHUmFuZ2UgfD0gR1JhbmdlID4+IDI7CisgICAgR1JhbmdlIHw9IEdSYW5nZSA+PiA0OworICAgIEdSYW5nZSB8PSBHUmFuZ2UgPj4gODsKKyAgICBHUmFuZ2UgfD0gR1JhbmdlID4+IDE2OworI2lmIF9feDg2XzY0X18gfHwgX19wcGM2NF9fIHx8IF9XSU42NAorICAgIEdSYW5nZSB8PSBHUmFuZ2UgPj4gMzI7CisjZW5kaWYKKyAgICBHUmFuZ2UrKzsKKyAgICBzaXplX3QgIG91dFRpbGVTaXplID0gdGlsZVNpemU7CisgICAgLy8vIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGlzIGxlc3MgdGhhbiB0aGUgR1JhbmdlLCB3ZSBzZXQgc2hhcmVkX21lbSBzaXplIHRvIHRoZSBUb3RhbFNpemUgYW5kIGluIHRoaXMgY2FzZSBvbmUga2VybmVsIHdvdWxkIGJlIGNyZWF0ZWQgZm9yIHJlY3Vyc2lvbiB0byByZWR1Y2UgYWxsIHRvIG9uZS4KKyAgICBpZiAoR1JhbmdlIDwgb3V0VGlsZVNpemUpIG91dFRpbGVTaXplPUdSYW5nZTsKKyAgICAvLyBnZXR0aW5nIGZpbmFsIG91dCBidWZmZXIgYXQgdGhlIG1vbWVudCB0aGUgY3JlYXRlZCBidWZmZXIgaXMgdHJ1ZSBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFzc2lnbgorICAgIGF1dG8gb3V0X2J1ZmZlciA9ZGV2LnRlbXBsYXRlIGdldF9zeWNsX2J1ZmZlcjx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8Q29lZmZSZXR1cm5UeXBlPjo6dHlwZT4oc2VsZi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIG91dHB1dCk7CisgICAgLy8vIGNyZWF0aW5nIHRoZSBzaGFyZWQgbWVtb3J5IGZvciBjYWxjdWxhdGluZyByZWR1Y3Rpb24uCisgICAgLy8vIFRoaXMgb25lIGlzIHVzZWQgdG8gY29sbGVjdCBhbGwgdGhlIHJlZHVjZWQgdmFsdWUgb2Ygc2hhcmVkIG1lbW9yeSBhcyB3ZSBkb250IGhhdmUgZ2xvYmFsIGJhcnJpZXIgb24gR1BVLiBPbmNlIGl0IGlzIHNhdmVkIHdlIGNhbgorICAgIC8vLyByZWN1cnNpdmVseSBhcHBseSByZWR1Y3Rpb24gb24gaXQgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB3aG9sZS4KKyAgICBhdXRvIHRlbXBfZ2xvYmFsX2J1ZmZlciA9Y2w6OnN5Y2w6OmJ1ZmZlcjxDb2VmZlJldHVyblR5cGUsIDE+KGNsOjpzeWNsOjpyYW5nZTwxPihHUmFuZ2UpKTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxkZWNsdHlwZShzZWxmLnhwckRpbXMoKSk+Ojp0eXBlIERpbXM7CisgICAgRGltcyBkaW1zPSBzZWxmLnhwckRpbXMoKTsKKyAgICBPcCBmdW5jdG9yID0gcmVkdWNlcjsKKyAgICBkZXYubV9xdWV1ZS5zdWJtaXQoWyZdKGNsOjpzeWNsOjpoYW5kbGVyICZjZ2gpIHsKKyAgICAgIC8vIGNyZWF0ZSBhIHR1cGxlIG9mIGFjY2Vzc29ycyBmcm9tIEV2YWx1YXRvcgorICAgICAgYXV0byB0dXBsZV9vZl9hY2Nlc3NvcnMgPSAgVGVuc29yU3ljbDo6aW50ZXJuYWw6OmNyZWF0ZVR1cGxlT2ZBY2Nlc3NvcnMoY2doLCBzZWxmLmltcGwoKSk7CisgICAgICBhdXRvIHRtcF9nbG9iYWxfYWNjZXNzb3IgPSB0ZW1wX2dsb2JhbF9idWZmZXIuIHRlbXBsYXRlIGdldF9hY2Nlc3M8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6cmVhZF93cml0ZSwgY2w6OnN5Y2w6OmFjY2Vzczo6dGFyZ2V0OjpnbG9iYWxfYnVmZmVyPihjZ2gpOworCisgICAgICBjZ2gucGFyYWxsZWxfZm9yPFBsYWNlSG9sZGVyRXhwcj4oIGNsOjpzeWNsOjpuZF9yYW5nZTwxPihjbDo6c3ljbDo6cmFuZ2U8MT4oR1JhbmdlKSwgY2w6OnN5Y2w6OnJhbmdlPDE+KG91dFRpbGVTaXplKSksIFs9XShjbDo6c3ljbDo6bmRfaXRlbTwxPiBpdGVtSUQpIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JTeWNsOjppbnRlcm5hbDo6Q29udmVydFRvRGV2aWNlRXhwcmVzc2lvbjxjb25zdCBIb3N0RXhwcj46OlR5cGUgRGV2RXhwcjsKKyAgICAgICAgYXV0byBkZXZpY2VfZXhwciA9IFRlbnNvclN5Y2w6OmludGVybmFsOjpjcmVhdGVEZXZpY2VFeHByZXNzaW9uPERldkV4cHIsIFBsYWNlSG9sZGVyRXhwcj4oZnVuY3RvcnMsIHR1cGxlX29mX2FjY2Vzc29ycyk7CisgICAgICAgIC8vLyByZWR1Y3Rpb24gY2Fubm90IGJlIGNhcHR1cmVkIGF1dG9tYXRpY2FsbHkgdGhyb3VnaCBvdXIgZGV2aWNlIGNvbnZlcnNpb24gcmVjdXJzaW9uLiBUaGUgcmVhc29uIGlzIHRoYXQgcmVkdWN0aW9uIGhhcyB0d28gYmVoYXZpb3VyCisgICAgICAgIC8vLyB0aGUgZmlyc3QgYmVoYXZpb3VyIGlzIHdoZW4gaXQgaXMgdXNlZCBhcyBhIHJvb3QgdG8gbGF1Y2ggdGhlIHN1Yi1rZXJuZWwuIFRoZSBzZWNvbmQgb25lIGlzIHdoZW4gaXQgaXMgdHJlYXRlZCBhcyBhIGxlYWZub2RlIHRvIHBhc3MgdGhlCisgICAgICAgIC8vLyBjYWxjdWxhdGVkIHJlc3VsdCB0byBpdHMgcGFyZW50IGtlcm5lbC4gV2hpbGUgdGhlIGxhdHRlciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRocm91Z2ggb3VyIGRldmljZSBleHByZXNzaW9uIGdlbmVyYXRvci4gVGhlIGZvcm1lciBpcyBjcmVhdGVkIGhlcmUuCisgICAgICAgIGNvbnN0IGF1dG8gZGV2aWNlX3NlbGZfZXhwcj0gVGVuc29yUmVkdWN0aW9uT3A8T3AsIERpbXMsIGRlY2x0eXBlKGRldmljZV9leHByLmV4cHIpICxNYWtlR2xvYmFsUG9pbnRlcj4oZGV2aWNlX2V4cHIuZXhwciwgZGltcywgZnVuY3Rvcik7CisgICAgICAgIC8vLyBUaGlzIGlzIHRoZSBldmFsdWF0b3IgZm9yIGRldmljZV9zZWxmX2V4cHIuIFRoaXMgaXMgZXhhY3RseSBzaW1pbGFyIHRvIHRoZSBzZWxmIHdoaWNoIGhhcyBiZWVuIHBhc3NlZCB0byBydW4gZnVuY3Rpb24uIFRoZSBkaWZmZXJlbmNlIGlzCisgICAgICAgIC8vLyB0aGUgZGV2aWNlX2V2YWx1YXRvciBpcyBkZXRlY3RhYmxlIGFuZCByZWNvZ25pc2FibGUgb24gdGhlIGRldmljZS4KKyAgICAgICAgYXV0byBkZXZpY2Vfc2VsZl9ldmFsdWF0b3IgPSBFaWdlbjo6VGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKGRldmljZV9zZWxmX2V4cHIpLCBFaWdlbjo6RGVmYXVsdERldmljZT4oZGV2aWNlX3NlbGZfZXhwciwgRWlnZW46OkRlZmF1bHREZXZpY2UoKSk7CisgICAgICAgIC8vLyBjb25zdCBjYXN0IGFkZGVkIGFzIGEgbmFpdmUgc29sdXRpb24gdG8gc29sdmUgdGhlIHF1YWxpZmllciBkcm9wIGVycm9yCisgICAgICAgIGF1dG8gZ2xvYmFsaWQ9aXRlbUlELmdldF9nbG9iYWxfbGluZWFyX2lkKCk7CisKKyAgICAgICAgaWYoZ2xvYmFsaWQ8cm5nKQorICAgICAgICAgIHRtcF9nbG9iYWxfYWNjZXNzb3IuZ2V0X3BvaW50ZXIoKVtnbG9iYWxpZF09SW5uZXJNb3N0RGltUmVkdWNlcjxkZWNsdHlwZShkZXZpY2Vfc2VsZl9ldmFsdWF0b3IpLCBPcCwgZmFsc2U+OjpyZWR1Y2UoZGV2aWNlX3NlbGZfZXZhbHVhdG9yLCByZWRfZmFjdG9yKmdsb2JhbGlkLCByZWRfZmFjdG9yLCBjb25zdF9jYXN0PE9wJj4oZnVuY3RvcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgdG1wX2dsb2JhbF9hY2Nlc3Nvci5nZXRfcG9pbnRlcigpW2dsb2JhbGlkXT1zdGF0aWNfY2FzdDxDb2VmZlJldHVyblR5cGU+KDApOworCisgICAgICAgIGlmKHJlbWFpbmluZyE9MCAmJiBnbG9iYWxpZD09MCApCisgICAgICAgICAgLy8gdGhpcyB3aWxsIGFkZCB0aGUgcmVzdCBvZiBpbnB1dCBidWZmZXIgd2hlbiB0aGUgaW5wdXQgc2l6ZSBpcyBub3QgZGV2aWRhYmxlIHRvIHJlZF9mYWN0b3IuCisgICAgICAgICAgdG1wX2dsb2JhbF9hY2Nlc3Nvci5nZXRfcG9pbnRlcigpW2dsb2JhbGlkXSs9SW5uZXJNb3N0RGltUmVkdWNlcjxkZWNsdHlwZShkZXZpY2Vfc2VsZl9ldmFsdWF0b3IpLCBPcCwgZmFsc2U+OjpyZWR1Y2UoZGV2aWNlX3NlbGZfZXZhbHVhdG9yLCByZWRfZmFjdG9yKihybmcpLCByZW1haW5pbmcsIGNvbnN0X2Nhc3Q8T3AmPihmdW5jdG9yKSk7CisgICAgICB9KTsKKyAgICB9KTsKKyAgZGV2Lm1fcXVldWUudGhyb3dfYXN5bmNocm9ub3VzKCk7CisKKy8vLyBUaGlzIGlzIHVzZWQgdG8gcmVjdXJzaXZlbHkgcmVkdWNlIHRoZSB0bXAgdmFsdWUgdG8gYW4gZWxlbWVudCBvZiAxOworICBzeWNsR2VuZXJpY0J1ZmZlclJlZHVjZXI8Q29lZmZSZXR1cm5UeXBlLEhvc3RFeHByPjo6cnVuKG91dF9idWZmZXIsIHRlbXBfZ2xvYmFsX2J1ZmZlcixkZXYsIEdSYW5nZSwgIG91dFRpbGVTaXplKTsKKyAgfQorCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VsZiwgdHlwZW5hbWUgT3A+CitzdHJ1Y3QgSW5uZXJSZWR1Y2VyPFNlbGYsIE9wLCBjb25zdCBFaWdlbjo6U3ljbERldmljZT4geworCisgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGJvb2wgSGFzT3B0aW1pemVkSW1wbGVtZW50YXRpb24gPSBmYWxzZTsKKworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgU2VsZiYgc2VsZiwgT3AmIHJlZHVjZXIsIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBkZXYsIENvZWZmUmV0dXJuVHlwZSogb3V0cHV0LCB0eXBlbmFtZSBTZWxmOjpJbmRleCAsIHR5cGVuYW1lIFNlbGY6OkluZGV4IG51bV9jb2VmZnNfdG9fcHJlc2VydmUpIHsKKyAgICB0eXBlZGVmIGNvbnN0IHR5cGVuYW1lIFNlbGY6OkNoaWxkVHlwZSBIb3N0RXhwcjsgLy8vIHRoaXMgaXMgdGhlIGNoaWxkIG9mIHJlZHVjdGlvbgorICAgIHR5cGVkZWYgIHR5cGVuYW1lIFRlbnNvclN5Y2w6OmludGVybmFsOjpjcmVhdGVQbGFjZUhvbGRlckV4cHJlc3Npb248SG9zdEV4cHI+OjpUeXBlIFBsYWNlSG9sZGVyRXhwcjsKKyAgICBhdXRvIGZ1bmN0b3JzID0gVGVuc29yU3ljbDo6aW50ZXJuYWw6OmV4dHJhY3RGdW5jdG9ycyhzZWxmLmltcGwoKSk7CisKKyAgICBzaXplX3QgdGlsZVNpemUgPWRldi5tX3F1ZXVlLmdldF9kZXZpY2UoKS4gdGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bWF4X3dvcmtfZ3JvdXBfc2l6ZT4oKS8yOworCisgICAgc2l6ZV90IEdSYW5nZT1udW1fY29lZmZzX3RvX3ByZXNlcnZlOworICAgIGlmICh0aWxlU2l6ZT5HUmFuZ2UpIHRpbGVTaXplPUdSYW5nZTsKKyAgICBlbHNlIGlmKEdSYW5nZT50aWxlU2l6ZSl7CisgICAgICBzaXplX3QgeE1vZGUgPSBHUmFuZ2UgJSB0aWxlU2l6ZTsKKyAgICAgIGlmICh4TW9kZSAhPSAwKSBHUmFuZ2UgKz0gKHRpbGVTaXplIC0geE1vZGUpOworICAgIH0KKyAgICAvLyBnZXR0aW5nIGZpbmFsIG91dCBidWZmZXIgYXQgdGhlIG1vbWVudCB0aGUgY3JlYXRlZCBidWZmZXIgaXMgdHJ1ZSBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFzc2lnbgorICAgIC8vLyBjcmVhdGluZyB0aGUgc2hhcmVkIG1lbW9yeSBmb3IgY2FsY3VsYXRpbmcgcmVkdWN0aW9uLgorICAgIC8vLyBUaGlzIG9uZSBpcyB1c2VkIHRvIGNvbGxlY3QgYWxsIHRoZSByZWR1Y2VkIHZhbHVlIG9mIHNoYXJlZCBtZW1vcnkgYXMgd2UgZG9udCBoYXZlIGdsb2JhbCBiYXJyaWVyIG9uIEdQVS4gT25jZSBpdCBpcyBzYXZlZCB3ZSBjYW4KKyAgICAvLy8gcmVjdXJzaXZlbHkgYXBwbHkgcmVkdWN0aW9uIG9uIGl0IGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgd2hvbGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8ZGVjbHR5cGUoc2VsZi54cHJEaW1zKCkpPjo6dHlwZSBEaW1zOworICAgIERpbXMgZGltcz0gc2VsZi54cHJEaW1zKCk7CisgICAgT3AgZnVuY3RvciA9IHJlZHVjZXI7CisKKyAgICBkZXYubV9xdWV1ZS5zdWJtaXQoWyZdKGNsOjpzeWNsOjpoYW5kbGVyICZjZ2gpIHsKKyAgICAgIC8vIGNyZWF0ZSBhIHR1cGxlIG9mIGFjY2Vzc29ycyBmcm9tIEV2YWx1YXRvcgorICAgICAgYXV0byB0dXBsZV9vZl9hY2Nlc3NvcnMgPSAgVGVuc29yU3ljbDo6aW50ZXJuYWw6OmNyZWF0ZVR1cGxlT2ZBY2Nlc3NvcnMoY2doLCBzZWxmLmltcGwoKSk7CisgICAgICBhdXRvIG91dHB1dF9hY2Nlc3NvciA9IGRldi50ZW1wbGF0ZSBnZXRfc3ljbF9hY2Nlc3NvcjxjbDo6c3ljbDo6YWNjZXNzOjptb2RlOjpkaXNjYXJkX3dyaXRlPihudW1fY29lZmZzX3RvX3ByZXNlcnZlLGNnaCwgb3V0cHV0KTsKKworICAgICAgY2doLnBhcmFsbGVsX2ZvcjxTZWxmPiggY2w6OnN5Y2w6Om5kX3JhbmdlPDE+KGNsOjpzeWNsOjpyYW5nZTwxPihHUmFuZ2UpLCBjbDo6c3ljbDo6cmFuZ2U8MT4odGlsZVNpemUpKSwgWz1dKGNsOjpzeWNsOjpuZF9pdGVtPDE+IGl0ZW1JRCkgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvclN5Y2w6OmludGVybmFsOjpDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPGNvbnN0IEhvc3RFeHByPjo6VHlwZSBEZXZFeHByOworICAgICAgICBhdXRvIGRldmljZV9leHByID0gVGVuc29yU3ljbDo6aW50ZXJuYWw6OmNyZWF0ZURldmljZUV4cHJlc3Npb248RGV2RXhwciwgUGxhY2VIb2xkZXJFeHByPihmdW5jdG9ycywgdHVwbGVfb2ZfYWNjZXNzb3JzKTsKKyAgICAgICAgLy8vIHJlZHVjdGlvbiBjYW5ub3QgYmUgY2FwdHVyZWQgYXV0b21hdGljYWxseSB0aHJvdWdoIG91ciBkZXZpY2UgY29udmVyc2lvbiByZWN1cnNpb24uIFRoZSByZWFzb24gaXMgdGhhdCByZWR1Y3Rpb24gaGFzIHR3byBiZWhhdmlvdXIKKyAgICAgICAgLy8vIHRoZSBmaXJzdCBiZWhhdmlvdXIgaXMgd2hlbiBpdCBpcyB1c2VkIGFzIGEgcm9vdCB0byBsYXVjaCB0aGUgc3ViLWtlcm5lbC4gVGhlIHNlY29uZCBvbmUgaXMgd2hlbiBpdCBpcyB0cmVhdGVkIGFzIGEgbGVhZm5vZGUgdG8gcGFzcyB0aGUKKyAgICAgICAgLy8vIGNhbGN1bGF0ZWQgcmVzdWx0IHRvIGl0cyBwYXJlbnQga2VybmVsLiBXaGlsZSB0aGUgbGF0dGVyIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGhyb3VnaCBvdXIgZGV2aWNlIGV4cHJlc3Npb24gZ2VuZXJhdG9yLiBUaGUgZm9ybWVyIGlzIGNyZWF0ZWQgaGVyZS4KKyAgICAgICAgY29uc3QgYXV0byBkZXZpY2Vfc2VsZl9leHByPSBUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgZGVjbHR5cGUoZGV2aWNlX2V4cHIuZXhwcikgLE1ha2VHbG9iYWxQb2ludGVyPihkZXZpY2VfZXhwci5leHByLCBkaW1zLCBmdW5jdG9yKTsKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGV2YWx1YXRvciBmb3IgZGV2aWNlX3NlbGZfZXhwci4gVGhpcyBpcyBleGFjdGx5IHNpbWlsYXIgdG8gdGhlIHNlbGYgd2hpY2ggaGFzIGJlZW4gcGFzc2VkIHRvIHJ1biBmdW5jdGlvbi4gVGhlIGRpZmZlcmVuY2UgaXMKKyAgICAgICAgLy8vIHRoZSBkZXZpY2VfZXZhbHVhdG9yIGlzIGRldGVjdGFibGUgYW5kIHJlY29nbmlzYWJsZSBvbiB0aGUgZGV2aWNlLgorICAgICAgICB0eXBlZGVmIEVpZ2VuOjpUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUoZGV2aWNlX3NlbGZfZXhwciksIEVpZ2VuOjpEZWZhdWx0RGV2aWNlPiBEZWljZVNlbGY7CisgICAgICAgIGF1dG8gZGV2aWNlX3NlbGZfZXZhbHVhdG9yID0gRWlnZW46OlRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShkZXZpY2Vfc2VsZl9leHByKSwgRWlnZW46OkRlZmF1bHREZXZpY2U+KGRldmljZV9zZWxmX2V4cHIsIEVpZ2VuOjpEZWZhdWx0RGV2aWNlKCkpOworICAgICAgICAvLy8gY29uc3QgY2FzdCBhZGRlZCBhcyBhIG5haXZlIHNvbHV0aW9uIHRvIHNvbHZlIHRoZSBxdWFsaWZpZXIgZHJvcCBlcnJvcgorICAgICAgICBhdXRvIGdsb2JhbGlkPWl0ZW1JRC5nZXRfZ2xvYmFsX2xpbmVhcl9pZCgpOworICAgICAgICBpZiAoZ2xvYmFsaWQ8IHN0YXRpY19jYXN0PHNpemVfdD4obnVtX2NvZWZmc190b19wcmVzZXJ2ZSkpIHsKKyAgICAgICAgICB0eXBlbmFtZSBEZWljZVNlbGY6OkNvZWZmUmV0dXJuVHlwZSBhY2N1bSA9IGZ1bmN0b3IuaW5pdGlhbGl6ZSgpOworICAgICAgICAgIEdlbmVyaWNEaW1SZWR1Y2VyPERlaWNlU2VsZjo6TnVtUmVkdWNlZERpbXMtMSwgRGVpY2VTZWxmLCBPcD46OnJlZHVjZShkZXZpY2Vfc2VsZl9ldmFsdWF0b3IsIGRldmljZV9zZWxmX2V2YWx1YXRvci5maXJzdElucHV0KGdsb2JhbGlkKSxjb25zdF9jYXN0PE9wJj4oZnVuY3RvciksICZhY2N1bSk7CisgICAgICAgICAgZnVuY3Rvci5maW5hbGl6ZShhY2N1bSk7CisgICAgICAgICAgb3V0cHV0X2FjY2Vzc29yLmdldF9wb2ludGVyKClbZ2xvYmFsaWRdPSBhY2N1bTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSk7CisgIGRldi5tX3F1ZXVlLnRocm93X2FzeW5jaHJvbm91cygpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JfUkVEVUNUSU9OX1NZQ0xfSFBQCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclJlZi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTI0NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JSZWYuaApAQCAtMCwwICsxLDQyOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1JFRl9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVGX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERpbWVuc2lvbnMsIHR5cGVuYW1lIFNjYWxhcj4KK2NsYXNzIFRlbnNvckxhenlCYXNlRXZhbHVhdG9yIHsKKyBwdWJsaWM6CisgIFRlbnNvckxhenlCYXNlRXZhbHVhdG9yKCkgOiBtX3JlZmNvdW50KDApIHsgfQorICB2aXJ0dWFsIH5UZW5zb3JMYXp5QmFzZUV2YWx1YXRvcigpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIHZpcnR1YWwgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0ID0gMDsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdmlydHVhbCBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCA9IDA7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdmlydHVhbCBjb25zdCBTY2FsYXIgY29lZmYoRGVuc2VJbmRleCBpbmRleCkgY29uc3QgPSAwOworICBFSUdFTl9ERVZJQ0VfRlVOQyB2aXJ0dWFsIFNjYWxhciYgY29lZmZSZWYoRGVuc2VJbmRleCBpbmRleCkgPSAwOworCisgIHZvaWQgaW5jclJlZkNvdW50KCkgeyArK21fcmVmY291bnQ7IH0KKyAgdm9pZCBkZWNyUmVmQ291bnQoKSB7IC0tbV9yZWZjb3VudDsgfQorICBpbnQgcmVmQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JlZmNvdW50OyB9CisKKyBwcml2YXRlOgorICAvLyBObyBjb3B5LCBubyBhc3NpZ21lbnQ7CisgIFRlbnNvckxhenlCYXNlRXZhbHVhdG9yKGNvbnN0IFRlbnNvckxhenlCYXNlRXZhbHVhdG9yJiBvdGhlcik7CisgIFRlbnNvckxhenlCYXNlRXZhbHVhdG9yJiBvcGVyYXRvciA9IChjb25zdCBUZW5zb3JMYXp5QmFzZUV2YWx1YXRvciYgb3RoZXIpOworCisgIGludCBtX3JlZmNvdW50OworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2aWNlPgorY2xhc3MgVGVuc29yTGF6eUV2YWx1YXRvclJlYWRPbmx5IDogcHVibGljIFRlbnNvckxhenlCYXNlRXZhbHVhdG9yPERpbWVuc2lvbnMsIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxFeHByLCBEZXZpY2U+OjpTY2FsYXI+IHsKKyBwdWJsaWM6CisgIC8vICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxFeHByLCBEZXZpY2U+OjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEV4cHIsIERldmljZT46OlNjYWxhciBTY2FsYXI7CisKKyAgVGVuc29yTGF6eUV2YWx1YXRvclJlYWRPbmx5KGNvbnN0IEV4cHImIGV4cHIsIGNvbnN0IERldmljZSYgZGV2aWNlKSA6IG1faW1wbChleHByLCBkZXZpY2UpLCBtX2R1bW15KFNjYWxhcigwKSkgeworICAgIG1fZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICB9CisgIHZpcnR1YWwgflRlbnNvckxhenlFdmFsdWF0b3JSZWFkT25seSgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdmlydHVhbCBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtX2RpbXM7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgdmlydHVhbCBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1faW1wbC5kYXRhKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyB2aXJ0dWFsIGNvbnN0IFNjYWxhciBjb2VmZihEZW5zZUluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihpbmRleCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgdmlydHVhbCBTY2FsYXImIGNvZWZmUmVmKERlbnNlSW5kZXggLyppbmRleCovKSB7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJjYW4ndCByZWZlcmVuY2UgdGhlIGNvZWZmaWNpZW50IG9mIGEgcnZhbHVlIik7CisgICAgcmV0dXJuIG1fZHVtbXk7CisgIH07CisKKyBwcm90ZWN0ZWQ6CisgIFRlbnNvckV2YWx1YXRvcjxFeHByLCBEZXZpY2U+IG1faW1wbDsKKyAgRGltZW5zaW9ucyBtX2RpbXM7CisgIFNjYWxhciBtX2R1bW15OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERpbWVuc2lvbnMsIHR5cGVuYW1lIEV4cHIsIHR5cGVuYW1lIERldmljZT4KK2NsYXNzIFRlbnNvckxhenlFdmFsdWF0b3JXcml0YWJsZSA6IHB1YmxpYyBUZW5zb3JMYXp5RXZhbHVhdG9yUmVhZE9ubHk8RGltZW5zaW9ucywgRXhwciwgRGV2aWNlPiB7CisgcHVibGljOgorICB0eXBlZGVmIFRlbnNvckxhenlFdmFsdWF0b3JSZWFkT25seTxEaW1lbnNpb25zLCBFeHByLCBEZXZpY2U+IEJhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKworICBUZW5zb3JMYXp5RXZhbHVhdG9yV3JpdGFibGUoY29uc3QgRXhwciYgZXhwciwgY29uc3QgRGV2aWNlJiBkZXZpY2UpIDogQmFzZShleHByLCBkZXZpY2UpIHsKKyAgfQorICB2aXJ0dWFsIH5UZW5zb3JMYXp5RXZhbHVhdG9yV3JpdGFibGUoKSB7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyB2aXJ0dWFsIFNjYWxhciYgY29lZmZSZWYoRGVuc2VJbmRleCBpbmRleCkgeworICAgIHJldHVybiB0aGlzLT5tX2ltcGwuY29lZmZSZWYoaW5kZXgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGltZW5zaW9ucywgdHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2aWNlPgorY2xhc3MgVGVuc29yTGF6eUV2YWx1YXRvciA6IHB1YmxpYyBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8Ym9vbChpbnRlcm5hbDo6aXNfbHZhbHVlPEV4cHI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yTGF6eUV2YWx1YXRvcldyaXRhYmxlPERpbWVuc2lvbnMsIEV4cHIsIERldmljZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yTGF6eUV2YWx1YXRvclJlYWRPbmx5PERpbWVuc2lvbnMsIGNvbnN0IEV4cHIsIERldmljZT4gPjo6dHlwZSB7CisgcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxib29sKGludGVybmFsOjppc19sdmFsdWU8RXhwcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yTGF6eUV2YWx1YXRvcldyaXRhYmxlPERpbWVuc2lvbnMsIEV4cHIsIERldmljZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvckxhenlFdmFsdWF0b3JSZWFkT25seTxEaW1lbnNpb25zLCBjb25zdCBFeHByLCBEZXZpY2U+ID46OnR5cGUgQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworCisgIFRlbnNvckxhenlFdmFsdWF0b3IoY29uc3QgRXhwciYgZXhwciwgY29uc3QgRGV2aWNlJiBkZXZpY2UpIDogQmFzZShleHByLCBkZXZpY2UpIHsKKyAgfQorICB2aXJ0dWFsIH5UZW5zb3JMYXp5RXZhbHVhdG9yKCkgeworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvKiogXGNsYXNzIFRlbnNvclJlZgorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBBIHJlZmVyZW5jZSB0byBhIHRlbnNvciBleHByZXNzaW9uCisgICogVGhlIGV4cHJlc3Npb24gd2lsbCBiZSBldmFsdWF0ZWQgbGF6aWx5IChhcyBtdWNoIGFzIHBvc3NpYmxlKS4KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPiBjbGFzcyBUZW5zb3JSZWYgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JSZWY8UGxhaW5PYmplY3RUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFRlbnNvclJlZjxQbGFpbk9iamVjdFR5cGU+IFNlbGY7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OkJhc2UgQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFNlbGY+Ojp0eXBlIE5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UGxhaW5PYmplY3RUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFBsYWluT2JqZWN0VHlwZT46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxQbGFpbk9iamVjdFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgICAgdHlwZWRlZiBTY2FsYXIqIFBvaW50ZXJUeXBlOworICAgIHR5cGVkZWYgUG9pbnRlclR5cGUgUG9pbnRlckFyZ1R5cGU7CisKKyAgICBzdGF0aWMgY29uc3QgSW5kZXggTnVtSW5kaWNlcyA9IFBsYWluT2JqZWN0VHlwZTo6TnVtSW5kaWNlczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZTo6RGltZW5zaW9ucyBEaW1lbnNpb25zOworCisgICAgZW51bSB7CisgICAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICAgIFBhY2tldEFjY2VzcyA9IGZhbHNlLAorICAgICAgTGF5b3V0ID0gUGxhaW5PYmplY3RUeXBlOjpMYXlvdXQsCisgICAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgICAgfTsKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yUmVmKCkgOiBtX2V2YWx1YXRvcihOVUxMKSB7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4cHJlc3Npb24+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JSZWYoY29uc3QgRXhwcmVzc2lvbiYgZXhwcikgOiBtX2V2YWx1YXRvcihuZXcgaW50ZXJuYWw6OlRlbnNvckxhenlFdmFsdWF0b3I8RGltZW5zaW9ucywgRXhwcmVzc2lvbiwgRGVmYXVsdERldmljZT4oZXhwciwgRGVmYXVsdERldmljZSgpKSkgeworICAgICAgbV9ldmFsdWF0b3ItPmluY3JSZWZDb3VudCgpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHByZXNzaW9uPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yUmVmJiBvcGVyYXRvciA9IChjb25zdCBFeHByZXNzaW9uJiBleHByKSB7CisgICAgICB1bnJlZkV2YWx1YXRvcigpOworICAgICAgbV9ldmFsdWF0b3IgPSBuZXcgaW50ZXJuYWw6OlRlbnNvckxhenlFdmFsdWF0b3I8RGltZW5zaW9ucywgRXhwcmVzc2lvbiwgRGVmYXVsdERldmljZT4oZXhwciwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIG1fZXZhbHVhdG9yLT5pbmNyUmVmQ291bnQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+VGVuc29yUmVmKCkgeworICAgICAgdW5yZWZFdmFsdWF0b3IoKTsKKyAgICB9CisKKyAgICBUZW5zb3JSZWYoY29uc3QgVGVuc29yUmVmJiBvdGhlcikgOiBtX2V2YWx1YXRvcihvdGhlci5tX2V2YWx1YXRvcikgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fZXZhbHVhdG9yLT5yZWZDb3VudCgpID4gMCk7CisgICAgICBtX2V2YWx1YXRvci0+aW5jclJlZkNvdW50KCk7CisgICAgfQorCisgICAgVGVuc29yUmVmJiBvcGVyYXRvciA9IChjb25zdCBUZW5zb3JSZWYmIG90aGVyKSB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpIHsKKyAgICAgICAgdW5yZWZFdmFsdWF0b3IoKTsKKyAgICAgICAgbV9ldmFsdWF0b3IgPSBvdGhlci5tX2V2YWx1YXRvcjsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG1fZXZhbHVhdG9yLT5yZWZDb3VudCgpID4gMCk7CisgICAgICAgIG1fZXZhbHVhdG9yLT5pbmNyUmVmQ291bnQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcmFuaygpIGNvbnN0IHsgcmV0dXJuIG1fZXZhbHVhdG9yLT5kaW1lbnNpb25zKCkuc2l6ZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGRpbWVuc2lvbihJbmRleCBuKSBjb25zdCB7IHJldHVybiBtX2V2YWx1YXRvci0+ZGltZW5zaW9ucygpW25dOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2V2YWx1YXRvci0+ZGltZW5zaW9ucygpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2V2YWx1YXRvci0+ZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZXZhbHVhdG9yLT5kYXRhKCk7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmFsdWF0b3ItPmNvZWZmKGluZGV4KTsKKyAgICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGZpcnN0SW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG51bV9pbmRpY2VzID0gKHNpemVvZi4uLihvdGhlckluZGljZXMpICsgMSk7CisgICAgICBjb25zdCBhcnJheTxJbmRleCwgbnVtX2luZGljZXM+IGluZGljZXN7e2ZpcnN0SW5kZXgsIG90aGVySW5kaWNlcy4uLn19OworICAgICAgcmV0dXJuIGNvZWZmKGluZGljZXMpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbmRleFR5cGVzPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBmaXJzdEluZGV4LCBJbmRleFR5cGVzLi4uIG90aGVySW5kaWNlcykKKyAgICB7CisgICAgICBjb25zdCBzdGQ6OnNpemVfdCBudW1faW5kaWNlcyA9IChzaXplb2YuLi4ob3RoZXJJbmRpY2VzKSArIDEpOworICAgICAgY29uc3QgYXJyYXk8SW5kZXgsIG51bV9pbmRpY2VzPiBpbmRpY2Vze3tmaXJzdEluZGV4LCBvdGhlckluZGljZXMuLi59fTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihpbmRpY2VzKTsKKyAgICB9CisjZWxzZQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSkgY29uc3QKKyAgICB7CisgICAgICBhcnJheTxJbmRleCwgMj4gaW5kaWNlczsKKyAgICAgIGluZGljZXNbMF0gPSBpMDsKKyAgICAgIGluZGljZXNbMV0gPSBpMTsKKyAgICAgIHJldHVybiBjb2VmZihpbmRpY2VzKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIpIGNvbnN0CisgICAgeworICAgICAgYXJyYXk8SW5kZXgsIDM+IGluZGljZXM7CisgICAgICBpbmRpY2VzWzBdID0gaTA7CisgICAgICBpbmRpY2VzWzFdID0gaTE7CisgICAgICBpbmRpY2VzWzJdID0gaTI7CisgICAgICByZXR1cm4gY29lZmYoaW5kaWNlcyk7CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyLCBJbmRleCBpMykgY29uc3QKKyAgICB7CisgICAgICBhcnJheTxJbmRleCwgND4gaW5kaWNlczsKKyAgICAgIGluZGljZXNbMF0gPSBpMDsKKyAgICAgIGluZGljZXNbMV0gPSBpMTsKKyAgICAgIGluZGljZXNbMl0gPSBpMjsKKyAgICAgIGluZGljZXNbM10gPSBpMzsKKyAgICAgIHJldHVybiBjb2VmZihpbmRpY2VzKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzLCBJbmRleCBpNCkgY29uc3QKKyAgICB7CisgICAgICBhcnJheTxJbmRleCwgNT4gaW5kaWNlczsKKyAgICAgIGluZGljZXNbMF0gPSBpMDsKKyAgICAgIGluZGljZXNbMV0gPSBpMTsKKyAgICAgIGluZGljZXNbMl0gPSBpMjsKKyAgICAgIGluZGljZXNbM10gPSBpMzsKKyAgICAgIGluZGljZXNbNF0gPSBpNDsKKyAgICAgIHJldHVybiBjb2VmZihpbmRpY2VzKTsKKyAgICB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaTAsIEluZGV4IGkxKQorICAgIHsKKyAgICAgIGFycmF5PEluZGV4LCAyPiBpbmRpY2VzOworICAgICAgaW5kaWNlc1swXSA9IGkwOworICAgICAgaW5kaWNlc1sxXSA9IGkxOworICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGljZXMpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyKQorICAgIHsKKyAgICAgIGFycmF5PEluZGV4LCAzPiBpbmRpY2VzOworICAgICAgaW5kaWNlc1swXSA9IGkwOworICAgICAgaW5kaWNlc1sxXSA9IGkxOworICAgICAgaW5kaWNlc1syXSA9IGkyOworICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGljZXMpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGkwLCBJbmRleCBpMSwgSW5kZXggaTIsIEluZGV4IGkzKQorICAgIHsKKyAgICAgIGFycmF5PEluZGV4LCA0PiBpbmRpY2VzOworICAgICAgaW5kaWNlc1swXSA9IGkwOworICAgICAgaW5kaWNlc1sxXSA9IGkxOworICAgICAgaW5kaWNlc1syXSA9IGkyOworICAgICAgaW5kaWNlc1szXSA9IGkzOworICAgICAgcmV0dXJuIGNvZWZmUmVmKGluZGljZXMpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpMCwgSW5kZXggaTEsIEluZGV4IGkyLCBJbmRleCBpMywgSW5kZXggaTQpCisgICAgeworICAgICAgYXJyYXk8SW5kZXgsIDU+IGluZGljZXM7CisgICAgICBpbmRpY2VzWzBdID0gaTA7CisgICAgICBpbmRpY2VzWzFdID0gaTE7CisgICAgICBpbmRpY2VzWzJdID0gaTI7CisgICAgICBpbmRpY2VzWzNdID0gaTM7CisgICAgICBpbmRpY2VzWzRdID0gaTQ7CisgICAgICByZXR1cm4gY29lZmZSZWYoaW5kaWNlcyk7CisgICAgfQorI2VuZGlmCisKKyAgICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTnVtSW5kaWNlcz4gRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgRGltZW5zaW9ucyYgZGltcyA9IHRoaXMtPmRpbWVuc2lvbnMoKTsKKyAgICAgIEluZGV4IGluZGV4ID0gMDsKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMgJiBSb3dNYWpvcikgeworICAgICAgICBpbmRleCArPSBpbmRpY2VzWzBdOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IE51bUluZGljZXM7ICsraSkgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiBkaW1zW2ldICsgaW5kaWNlc1tpXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggKz0gaW5kaWNlc1tOdW1JbmRpY2VzLTFdOworICAgICAgICBmb3IgKGludCBpID0gTnVtSW5kaWNlcy0yOyBpID49IDA7IC0taSkgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiBkaW1zW2ldICsgaW5kaWNlc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG1fZXZhbHVhdG9yLT5jb2VmZihpbmRleCk7CisgICAgfQorICAgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOdW1JbmRpY2VzPiBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihjb25zdCBhcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIGluZGljZXMpCisgICAgeworICAgICAgY29uc3QgRGltZW5zaW9ucyYgZGltcyA9IHRoaXMtPmRpbWVuc2lvbnMoKTsKKyAgICAgIEluZGV4IGluZGV4ID0gMDsKKyAgICAgIGlmIChQbGFpbk9iamVjdFR5cGU6Ok9wdGlvbnMgJiBSb3dNYWpvcikgeworICAgICAgICBpbmRleCArPSBpbmRpY2VzWzBdOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IE51bUluZGljZXM7ICsraSkgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiBkaW1zW2ldICsgaW5kaWNlc1tpXTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggKz0gaW5kaWNlc1tOdW1JbmRpY2VzLTFdOworICAgICAgICBmb3IgKGludCBpID0gTnVtSW5kaWNlcy0yOyBpID49IDA7IC0taSkgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiBkaW1zW2ldICsgaW5kaWNlc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG1fZXZhbHVhdG9yLT5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmFsdWF0b3ItPmNvZWZmKGluZGV4KTsKKyAgICB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9ldmFsdWF0b3ItPmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgdW5yZWZFdmFsdWF0b3IoKSB7CisgICAgICBpZiAobV9ldmFsdWF0b3IpIHsKKyAgICAgICAgbV9ldmFsdWF0b3ItPmRlY3JSZWZDb3VudCgpOworICAgICAgICBpZiAobV9ldmFsdWF0b3ItPnJlZkNvdW50KCkgPT0gMCkgeworICAgICAgICAgIGRlbGV0ZSBtX2V2YWx1YXRvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICBpbnRlcm5hbDo6VGVuc29yTGF6eUJhc2VFdmFsdWF0b3I8RGltZW5zaW9ucywgU2NhbGFyPiogbV9ldmFsdWF0b3I7Cit9OworCisKKy8vIGV2YWx1YXRvciBmb3IgcnZhbHVlcwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWY8RGVyaXZlZD4sIERldmljZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UsCisgICAgTGF5b3V0ID0gVGVuc29yUmVmPERlcml2ZWQ+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBUZW5zb3JSZWY8RGVyaXZlZD4mIG0sIGNvbnN0IERldmljZSYpCisgICAgICA6IG1fcmVmKG0pCisgIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmLmRpbWVuc2lvbnMoKTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcmVmLmNvZWZmKGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgeworICAgIHJldHVybiBtX3JlZi5jb2VmZlJlZihpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX3JlZi5kYXRhKCk7IH0KKworIHByb3RlY3RlZDoKKyAgVGVuc29yUmVmPERlcml2ZWQ+IG1fcmVmOworfTsKKworCisvLyBldmFsdWF0b3IgZm9yIGx2YWx1ZXMKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8VGVuc29yUmVmPERlcml2ZWQ+LCBEZXZpY2U+IDogcHVibGljIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWY8RGVyaXZlZD4sIERldmljZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpEaW1lbnNpb25zIERpbWVuc2lvbnM7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVmPERlcml2ZWQ+LCBEZXZpY2U+IEJhc2U7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UsCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihUZW5zb3JSZWY8RGVyaXZlZD4mIG0sIGNvbnN0IERldmljZSYgZCkgOiBCYXNlKG0sIGQpCisgIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgeworICAgIHJldHVybiB0aGlzLT5tX3JlZi5jb2VmZlJlZihpbmRleCk7CisgIH0KK307CisKKworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVGX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmV2ZXJzZS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JSZXZlcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMzkyZQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yUmV2ZXJzZS5oCkBAIC0wLDAgKzEsMjg4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBOYXZkZWVwIEphaXRseSA8bmRqYWl0bHlAZ29vZ2xlLmNvbT4KKy8vICAgICAgICAgICAgICAgICAgICBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVWRVJTRV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVWRVJTRV9ICituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvclJldmVyc2UKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHJldmVyc2UgZWxlbWVudHMgY2xhc3MuCisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSZXZlcnNlRGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCB0cmFpdHM8VGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHByVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9uczsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBYcHJUcmFpdHM6OkxheW91dDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJldmVyc2VEaW1lbnNpb25zLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJldmVyc2VPcDxSZXZlcnNlRGltZW5zaW9ucywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZXZlcnNlRGltZW5zaW9ucywgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLCBYcHJUeXBlPiwgMSwKKyAgICAgICAgICAgIHR5cGVuYW1lIGV2YWw8VGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclJldmVyc2VPcDxSZXZlcnNlRGltZW5zaW9ucywgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgUmV2ZXJzZURpbWVuc2lvbnMsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBUZW5zb3JSZXZlcnNlT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JSZXZlcnNlT3A8UmV2ZXJzZURpbWVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHJUeXBlPiwgV3JpdGVBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JSZXZlcnNlT3A+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8VGVuc29yUmV2ZXJzZU9wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUmV2ZXJzZU9wPjo6U3RvcmFnZUtpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yUmV2ZXJzZU9wPjo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JSZXZlcnNlT3AoCisgICAgICBjb25zdCBYcHJUeXBlJiBleHByLCBjb25zdCBSZXZlcnNlRGltZW5zaW9ucyYgcmV2ZXJzZV9kaW1zKQorICAgICAgOiBtX3hwcihleHByKSwgbV9yZXZlcnNlX2RpbXMocmV2ZXJzZV9kaW1zKSB7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgUmV2ZXJzZURpbWVuc2lvbnMmIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtX3JldmVyc2VfZGltczsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX3hwcjsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclJldmVyc2VPcCYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yUmV2ZXJzZU9wJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvclJldmVyc2VPcCwgY29uc3QgVGVuc29yUmV2ZXJzZU9wPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclJldmVyc2VPcCYgb3BlcmF0b3IgPSAoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvclJldmVyc2VPcCwgY29uc3QgT3RoZXJEZXJpdmVkPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBtX3hwcjsKKyAgICBjb25zdCBSZXZlcnNlRGltZW5zaW9ucyBtX3JldmVyc2VfZGltczsKK307CisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZXZlcnNlRGltZW5zaW9ucywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZXZlcnNlT3A8UmV2ZXJzZURpbWVuc2lvbnMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTxSZXZlcnNlRGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IG1faW1wbChvcC5leHByZXNzaW9uKCksIGRldmljZSksIG1fcmV2ZXJzZShvcC5yZXZlcnNlKCkpCisgIHsKKyAgICAvLyBSZXZlcnNpbmcgYSBzY2FsYXIgaXNuJ3Qgc3VwcG9ydGVkIHlldC4gSXQgd291bGQgYmUgYSBuby1vcCBhbnl3YXkuCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtRGltcyA+IDApLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgICAgLy8gQ29tcHV0ZSBzdHJpZGVzCisgICAgbV9kaW1lbnNpb25zID0gbV9pbXBsLmRpbWVuc2lvbnMoKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX3N0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9zdHJpZGVzW2ldID0gbV9zdHJpZGVzW2ktMV0gKiBtX2RpbWVuc2lvbnNbaS0xXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9zdHJpZGVzW051bURpbXMtMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX3N0cmlkZXNbaV0gPSBtX3N0cmlkZXNbaSsxXSAqIG1fZGltZW5zaW9uc1tpKzFdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjbGVhbnVwKCkgeworICAgIG1faW1wbC5jbGVhbnVwKCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJldmVyc2VJbmRleCgKKyAgICAgIEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgZWlnZW5fYXNzZXJ0KGluZGV4IDwgZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKTsKKyAgICBJbmRleCBpbnB1dEluZGV4ID0gMDsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBmb3IgKGludCBpID0gTnVtRGltcyAtIDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgSW5kZXggaWR4ID0gaW5kZXggLyBtX3N0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fc3RyaWRlc1tpXTsKKyAgICAgICAgaWYgKG1fcmV2ZXJzZVtpXSkgeworICAgICAgICAgIGlkeCA9IG1fZGltZW5zaW9uc1tpXSAtIGlkeCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXRJbmRleCArPSBpZHggKiBtX3N0cmlkZXNbaV0gOworICAgICAgfQorICAgICAgaWYgKG1fcmV2ZXJzZVswXSkgeworICAgICAgICBpbnB1dEluZGV4ICs9IChtX2RpbWVuc2lvbnNbMF0gLSBpbmRleCAtIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRJbmRleCArPSBpbmRleDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zIC0gMTsgKytpKSB7CisgICAgICAgIEluZGV4IGlkeCA9IGluZGV4IC8gbV9zdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX3N0cmlkZXNbaV07CisgICAgICAgIGlmIChtX3JldmVyc2VbaV0pIHsKKyAgICAgICAgICBpZHggPSBtX2RpbWVuc2lvbnNbaV0gLSBpZHggLSAxOworICAgICAgICB9CisgICAgICAgIGlucHV0SW5kZXggKz0gaWR4ICogbV9zdHJpZGVzW2ldIDsKKyAgICAgIH0KKyAgICAgIGlmIChtX3JldmVyc2VbTnVtRGltcy0xXSkgeworICAgICAgICBpbnB1dEluZGV4ICs9IChtX2RpbWVuc2lvbnNbTnVtRGltcy0xXSAtIGluZGV4IC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dEluZGV4ICs9IGluZGV4OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXRJbmRleDsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKAorICAgICAgSW5kZXggaW5kZXgpIGNvbnN0ICB7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihyZXZlcnNlSW5kZXgoaW5kZXgpKTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKFBhY2tldFNpemUgPiAxKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIGVpZ2VuX2Fzc2VydChpbmRleCtQYWNrZXRTaXplLTEgPCBkaW1lbnNpb25zKCkuVG90YWxTaXplKCkpOworCisgICAgLy8gVE9ETyhuZGphaXRseSk6IHdyaXRlIGEgYmV0dGVyIHBhY2tpbmcgcm91dGluZSB0aGF0IHVzZXMKKyAgICAvLyBsb2NhbCBzdHJ1Y3R1cmUuCisgICAgRUlHRU5fQUxJR05fTUFYIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8Q29lZmZSZXR1cm5UeXBlPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW1BhY2tldFNpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICB2YWx1ZXNbaV0gPSBjb2VmZihpbmRleCtpKTsKKyAgICB9CisgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgcmV0dXJuIHJzbHQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgZG91YmxlIGNvbXB1dGVfY29zdCA9IE51bURpbXMgKiAoMiAqIFRlbnNvck9wQ29zdDo6QWRkQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgaWYgKG1fcmV2ZXJzZVtpXSkgeworICAgICAgICBjb21wdXRlX2Nvc3QgKz0gMiAqIFRlbnNvck9wQ29zdDo6QWRkQ29zdDxJbmRleD4oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1faW1wbC5jb3N0UGVyQ29lZmYodmVjdG9yaXplZCkgKworICAgICAgICAgICBUZW5zb3JPcENvc3QoMCwgMCwgY29tcHV0ZV9jb3N0LCBmYWxzZSAvKiB2ZWN0b3JpemVkICovLCBQYWNrZXRTaXplKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworIHByb3RlY3RlZDoKKyAgRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7CisgIGFycmF5PEluZGV4LCBOdW1EaW1zPiBtX3N0cmlkZXM7CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKKyAgUmV2ZXJzZURpbWVuc2lvbnMgbV9yZXZlcnNlOworfTsKKworLy8gRXZhbCBhcyBsdmFsdWUKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJldmVyc2VEaW1lbnNpb25zLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPFRlbnNvclJldmVyc2VPcDxSZXZlcnNlRGltZW5zaW9ucywgQXJnVHlwZT4sIERldmljZT4KKyAgICA6IHB1YmxpYyBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmV2ZXJzZU9wPFJldmVyc2VEaW1lbnNpb25zLCBBcmdUeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlPiB7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclJldmVyc2VPcDxSZXZlcnNlRGltZW5zaW9ucywgQXJnVHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZT4gQmFzZTsKKyAgdHlwZWRlZiBUZW5zb3JSZXZlcnNlT3A8UmV2ZXJzZURpbWVuc2lvbnMsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPFJldmVyc2VEaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IGZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IEJhc2Uob3AsIGRldmljZSkge30KKworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPm1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgeworICAgIHJldHVybiB0aGlzLT5tX2ltcGwuY29lZmZSZWYodGhpcy0+cmV2ZXJzZUluZGV4KGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IFN0b3JlTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRSZXR1cm5UeXBlJiB4KSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICAvLyBUaGlzIGNvZGUgaXMgcGlsZmVyZWQgZnJvbSBUZW5zb3JNb3JwaGluZy5oCisgICAgRUlHRU5fQUxJR05fTUFYIENvZWZmUmV0dXJuVHlwZSB2YWx1ZXNbUGFja2V0U2l6ZV07CisgICAgaW50ZXJuYWw6OnBzdG9yZTxDb2VmZlJldHVyblR5cGUsIFBhY2tldFJldHVyblR5cGU+KHZhbHVlcywgeCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIHRoaXMtPmNvZWZmUmVmKGluZGV4K2kpID0gdmFsdWVzW2ldOworICAgIH0KKyAgfQorCit9OworCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfUkVWRVJTRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclNjYW4uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDE0NjYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclNjYW4uaApAQCAtMCwwICsxLDI4NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgSWdvciBCYWJ1c2Noa2luIDxpZ29yQGJhYnVzY2hrLmluPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1NDQU5fSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1NDQU5fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvclNjYW5PcDxPcCwgWHByVHlwZT4gPgorICAgIDogcHVibGljIHRyYWl0czxYcHJUeXBlPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE5lc3RlZD46OnR5cGUgX05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gWHByVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JTY2FuT3A8T3AsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yU2Nhbk9wPE9wLCBYcHJUeXBlPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JTY2FuT3A8T3AsIFhwclR5cGU+LCAxLAorICAgICAgICAgICAgdHlwZW5hbWUgZXZhbDxUZW5zb3JTY2FuT3A8T3AsIFhwclR5cGU+ID46OnR5cGU+Cit7CisgIHR5cGVkZWYgVGVuc29yU2Nhbk9wPE9wLCBYcHJUeXBlPiB0eXBlOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGNsYXNzIFRlbnNvclNjYW4KKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHNjYW4gY2xhc3MuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBUZW5zb3JTY2FuT3AKKyAgICA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvclNjYW5PcDxPcCwgWHByVHlwZT4sIFJlYWRPbmx5QWNjZXNzb3JzPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yU2Nhbk9wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvclNjYW5PcD46OnR5cGUgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclNjYW5PcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclNjYW5PcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU2Nhbk9wKAorICAgICAgY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgSW5kZXgmIGF4aXMsIGJvb2wgZXhjbHVzaXZlID0gZmFsc2UsIGNvbnN0IE9wJiBvcCA9IE9wKCkpCisgICAgICA6IG1fZXhwcihleHByKSwgbV9heGlzKGF4aXMpLCBtX2FjY3VtdWxhdG9yKG9wKSwgbV9leGNsdXNpdmUoZXhjbHVzaXZlKSB7fQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgSW5kZXggYXhpcygpIGNvbnN0IHsgcmV0dXJuIG1fYXhpczsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGNvbnN0IFhwclR5cGUmIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2V4cHI7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBjb25zdCBPcCBhY2N1bXVsYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1fYWNjdW11bGF0b3I7IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBib29sIGV4Y2x1c2l2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhjbHVzaXZlOyB9CisKK3Byb3RlY3RlZDoKKyAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1fZXhwcjsKKyAgY29uc3QgSW5kZXggbV9heGlzOworICBjb25zdCBPcCBtX2FjY3VtdWxhdG9yOworICBjb25zdCBib29sIG1fZXhjbHVzaXZlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBTY2FuTGF1bmNoZXI7CisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yU2Nhbk9wPE9wLCBBcmdUeXBlPiwgRGV2aWNlPiB7CisKKyAgdHlwZWRlZiBUZW5zb3JTY2FuT3A8T3AsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTY2FuT3A8T3AsIEFyZ1R5cGU+LCBEZXZpY2U+IFNlbGY7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gKGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemUgPiAxKSwKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwKKyAgICBSYXdBY2Nlc3MgPSB0cnVlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBtX2ltcGwob3AuZXhwcmVzc2lvbigpLCBkZXZpY2UpLAorICAgICAgICBtX2RldmljZShkZXZpY2UpLAorICAgICAgICBtX2V4Y2x1c2l2ZShvcC5leGNsdXNpdmUoKSksCisgICAgICAgIG1fYWNjdW11bGF0b3Iob3AuYWNjdW11bGF0b3IoKSksCisgICAgICAgIG1fc2l6ZShtX2ltcGwuZGltZW5zaW9ucygpW29wLmF4aXMoKV0pLAorICAgICAgICBtX3N0cmlkZSgxKSwKKyAgICAgICAgbV9vdXRwdXQoTlVMTCkgeworCisgICAgLy8gQWNjdW11bGF0aW5nIGEgc2NhbGFyIGlzbid0IHN1cHBvcnRlZC4KKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChOdW1EaW1zID4gMCksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgZWlnZW5fYXNzZXJ0KG9wLmF4aXMoKSA+PSAwICYmIG9wLmF4aXMoKSA8IE51bURpbXMpOworCisgICAgLy8gQ29tcHV0ZSBzdHJpZGUgb2Ygc2NhbiBheGlzCisgICAgY29uc3QgRGltZW5zaW9ucyYgZGltcyA9IG1faW1wbC5kaW1lbnNpb25zKCk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcC5heGlzKCk7ICsraSkgeworICAgICAgICBtX3N0cmlkZSA9IG1fc3RyaWRlICogZGltc1tpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gb3AuYXhpcygpOyAtLWkpIHsKKyAgICAgICAgbV9zdHJpZGUgPSBtX3N0cmlkZSAqIGRpbXNbaV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtX2ltcGwuZGltZW5zaW9ucygpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBJbmRleCYgc3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiBtX3N0cmlkZTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgSW5kZXgmIHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fc2l6ZTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgT3AmIGFjY3VtdWxhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtX2FjY3VtdWxhdG9yOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV4Y2x1c2l2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9leGNsdXNpdmU7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+JiBpbm5lcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9pbXBsOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEZXZpY2UmIGRldmljZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9kZXZpY2U7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiBkYXRhKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIFNjYW5MYXVuY2hlcjxTZWxmLCBPcCwgRGV2aWNlPiBsYXVuY2hlcjsKKyAgICBpZiAoZGF0YSkgeworICAgICAgbGF1bmNoZXIoKnRoaXMsIGRhdGEpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEluZGV4IHRvdGFsX3NpemUgPSBpbnRlcm5hbDo6YXJyYXlfcHJvZChkaW1lbnNpb25zKCkpOworICAgIG1fb3V0cHV0ID0gc3RhdGljX2Nhc3Q8Q29lZmZSZXR1cm5UeXBlKj4obV9kZXZpY2UuYWxsb2NhdGUodG90YWxfc2l6ZSAqIHNpemVvZihTY2FsYXIpKSk7CisgICAgbGF1bmNoZXIoKnRoaXMsIG1fb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRSZXR1cm5UeXBlLCBMb2FkTW9kZT4obV9vdXRwdXQgKyBpbmRleCk7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSogZGF0YSgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9vdXRwdXQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX291dHB1dFtpbmRleF07CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCkgY29uc3QgeworICAgIHJldHVybiBUZW5zb3JPcENvc3Qoc2l6ZW9mKENvZWZmUmV0dXJuVHlwZSksIDAsIDApOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgaWYgKG1fb3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgIG1fZGV2aWNlLmRlYWxsb2NhdGUobV9vdXRwdXQpOworICAgICAgbV9vdXRwdXQgPSBOVUxMOworICAgIH0KKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT4gbV9pbXBsOworICBjb25zdCBEZXZpY2UmIG1fZGV2aWNlOworICBjb25zdCBib29sIG1fZXhjbHVzaXZlOworICBPcCBtX2FjY3VtdWxhdG9yOworICBjb25zdCBJbmRleCBtX3NpemU7CisgIEluZGV4IG1fc3RyaWRlOworICBDb2VmZlJldHVyblR5cGUqIG1fb3V0cHV0OworfTsKKworLy8gQ1BVIGltcGxlbWVudGF0aW9uIG9mIHNjYW4KKy8vIFRPRE8oaWJhYikgVGhpcyBzaW5nbGUtdGhyZWFkZWQgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHBhcmFsbGVsaXplZCwKKy8vIGF0IGxlYXN0IGJ5IHJ1bm5pbmcgbXVsdGlwbGUgc2NhbnMgYXQgdGhlIHNhbWUgdGltZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWxmLCB0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgU2NhbkxhdW5jaGVyIHsKKyAgdm9pZCBvcGVyYXRvcigpKFNlbGYmIHNlbGYsIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSAqZGF0YSkgeworICAgIEluZGV4IHRvdGFsX3NpemUgPSBpbnRlcm5hbDo6YXJyYXlfcHJvZChzZWxmLmRpbWVuc2lvbnMoKSk7CisKKyAgICAvLyBXZSBmaXggdGhlIGluZGV4IGFsb25nIHRoZSBzY2FuIGF4aXMgdG8gMCBhbmQgcGVyZm9ybSBhCisgICAgLy8gc2NhbiBwZXIgcmVtYWluaW5nIGVudHJ5LiBUaGUgaXRlcmF0aW9uIGlzIHNwbGl0IGludG8gdHdvIG5lc3RlZAorICAgIC8vIGxvb3BzIHRvIGF2b2lkIGFuIGludGVnZXIgZGl2aXNpb24gYnkga2VlcGluZyB0cmFjayBvZiBlYWNoIGlkeDEgYW5kIGlkeDIuCisgICAgZm9yIChJbmRleCBpZHgxID0gMDsgaWR4MSA8IHRvdGFsX3NpemU7IGlkeDEgKz0gc2VsZi5zdHJpZGUoKSAqIHNlbGYuc2l6ZSgpKSB7CisgICAgICBmb3IgKEluZGV4IGlkeDIgPSAwOyBpZHgyIDwgc2VsZi5zdHJpZGUoKTsgaWR4MisrKSB7CisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGUgc2NhbgorICAgICAgICBJbmRleCBvZmZzZXQgPSBpZHgxICsgaWR4MjsKKworICAgICAgICAvLyBDb21wdXRlIHRoZSBzY2FuIGFsb25nIHRoZSBheGlzLCBzdGFydGluZyBhdCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQKKyAgICAgICAgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlIGFjY3VtID0gc2VsZi5hY2N1bXVsYXRvcigpLmluaXRpYWxpemUoKTsKKyAgICAgICAgZm9yIChJbmRleCBpZHgzID0gMDsgaWR4MyA8IHNlbGYuc2l6ZSgpOyBpZHgzKyspIHsKKyAgICAgICAgICBJbmRleCBjdXJyID0gb2Zmc2V0ICsgaWR4MyAqIHNlbGYuc3RyaWRlKCk7CisKKyAgICAgICAgICBpZiAoc2VsZi5leGNsdXNpdmUoKSkgeworICAgICAgICAgICAgZGF0YVtjdXJyXSA9IHNlbGYuYWNjdW11bGF0b3IoKS5maW5hbGl6ZShhY2N1bSk7CisgICAgICAgICAgICBzZWxmLmFjY3VtdWxhdG9yKCkucmVkdWNlKHNlbGYuaW5uZXIoKS5jb2VmZihjdXJyKSwgJmFjY3VtKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRvcigpLnJlZHVjZShzZWxmLmlubmVyKCkuY29lZmYoY3VyciksICZhY2N1bSk7CisgICAgICAgICAgICBkYXRhW2N1cnJdID0gc2VsZi5hY2N1bXVsYXRvcigpLmZpbmFsaXplKGFjY3VtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKyNpZiBkZWZpbmVkKEVJR0VOX1VTRV9HUFUpICYmIGRlZmluZWQoX19DVURBQ0NfXykKKworLy8gR1BVIGltcGxlbWVudGF0aW9uIG9mIHNjYW4KKy8vIFRPRE8oaWJhYikgVGhpcyBwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBtdWx0aXBsZSBzY2FucyBpbgorLy8gcGFyYWxsZWwsIGJ1dCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIGEgcGFyYWxsZWwgc2NhbiBhbGdvcml0aG0gYW5kCisvLyBvcHRpbWl6ZSBtZW1vcnkgYWNjZXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIFJlZHVjZXI+CitfX2dsb2JhbF9fIHZvaWQgU2Nhbktlcm5lbChTZWxmIHNlbGYsIEluZGV4IHRvdGFsX3NpemUsIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSogZGF0YSkgeworICAvLyBDb21wdXRlIG9mZnNldCBhcyBpbiB0aGUgQ1BVIHZlcnNpb24KKyAgSW5kZXggdmFsID0gdGhyZWFkSWR4LnggKyBibG9ja0lkeC54ICogYmxvY2tEaW0ueDsKKyAgSW5kZXggb2Zmc2V0ID0gKHZhbCAvIHNlbGYuc3RyaWRlKCkpICogc2VsZi5zdHJpZGUoKSAqIHNlbGYuc2l6ZSgpICsgdmFsICUgc2VsZi5zdHJpZGUoKTsKKworICBpZiAob2Zmc2V0ICsgKHNlbGYuc2l6ZSgpIC0gMSkgKiBzZWxmLnN0cmlkZSgpIDwgdG90YWxfc2l6ZSkgeworICAgIC8vIENvbXB1dGUgdGhlIHNjYW4gYWxvbmcgdGhlIGF4aXMsIHN0YXJ0aW5nIGF0IHRoZSBjYWxjdWxhdGVkIG9mZnNldAorICAgIHR5cGVuYW1lIFNlbGY6OkNvZWZmUmV0dXJuVHlwZSBhY2N1bSA9IHNlbGYuYWNjdW11bGF0b3IoKS5pbml0aWFsaXplKCk7CisgICAgZm9yIChJbmRleCBpZHggPSAwOyBpZHggPCBzZWxmLnNpemUoKTsgaWR4KyspIHsKKyAgICAgIEluZGV4IGN1cnIgPSBvZmZzZXQgKyBpZHggKiBzZWxmLnN0cmlkZSgpOworICAgICAgaWYgKHNlbGYuZXhjbHVzaXZlKCkpIHsKKyAgICAgICAgZGF0YVtjdXJyXSA9IHNlbGYuYWNjdW11bGF0b3IoKS5maW5hbGl6ZShhY2N1bSk7CisgICAgICAgIHNlbGYuYWNjdW11bGF0b3IoKS5yZWR1Y2Uoc2VsZi5pbm5lcigpLmNvZWZmKGN1cnIpLCAmYWNjdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi5hY2N1bXVsYXRvcigpLnJlZHVjZShzZWxmLmlubmVyKCkuY29lZmYoY3VyciksICZhY2N1bSk7CisgICAgICAgIGRhdGFbY3Vycl0gPSBzZWxmLmFjY3VtdWxhdG9yKCkuZmluYWxpemUoYWNjdW0pOworICAgICAgfQorICAgIH0KKyAgfQorICBfX3N5bmN0aHJlYWRzKCk7CisKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlbGYsIHR5cGVuYW1lIFJlZHVjZXI+CitzdHJ1Y3QgU2NhbkxhdW5jaGVyPFNlbGYsIFJlZHVjZXIsIEdwdURldmljZT4geworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgU2VsZiYgc2VsZiwgdHlwZW5hbWUgU2VsZjo6Q29lZmZSZXR1cm5UeXBlKiBkYXRhKSB7CisgICAgIEluZGV4IHRvdGFsX3NpemUgPSBpbnRlcm5hbDo6YXJyYXlfcHJvZChzZWxmLmRpbWVuc2lvbnMoKSk7CisgICAgIEluZGV4IG51bV9ibG9ja3MgPSAodG90YWxfc2l6ZSAvIHNlbGYuc2l6ZSgpICsgNjMpIC8gNjQ7CisgICAgIEluZGV4IGJsb2NrX3NpemUgPSA2NDsKKyAgICAgTEFVTkNIX0NVREFfS0VSTkVMKChTY2FuS2VybmVsPFNlbGYsIFJlZHVjZXI+KSwgbnVtX2Jsb2NrcywgYmxvY2tfc2l6ZSwgMCwgc2VsZi5kZXZpY2UoKSwgc2VsZiwgdG90YWxfc2l6ZSwgZGF0YSk7CisgIH0KK307CisjZW5kaWYgIC8vIEVJR0VOX1VTRV9HUFUgJiYgX19DVURBQ0NfXworCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9TQ0FOX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU2h1ZmZsaW5nLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclNodWZmbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2MwNjAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclNodWZmbGluZy5oCkBAIC0wLDAgKzEsMjY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfU0hVRkZMSU5HX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9TSFVGRkxJTkdfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvclNodWZmbGluZworICAqIFxpbmdyb3VwIENYWDExX1RlbnNvcl9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUZW5zb3Igc2h1ZmZsaW5nIGNsYXNzLgorICAqCisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTaHVmZmxlLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBYcHJUeXBlPiA+IDogcHVibGljIHRyYWl0czxYcHJUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHJhaXRzPFhwclR5cGU+IFhwclRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE5lc3RlZD46OnR5cGUgX05lc3RlZDsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1lbnNpb25zID0gWHByVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IFhwclRyYWl0czo6TGF5b3V0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2h1ZmZsZSwgdHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBldmFsPFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIFhwclR5cGU+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yU2h1ZmZsaW5nT3A8U2h1ZmZsZSwgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTaHVmZmxlLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBYcHJUeXBlPiA+Ojp0eXBlPgoreworICB0eXBlZGVmIFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTaHVmZmxlLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yU2h1ZmZsaW5nT3AgOiBwdWJsaWMgVGVuc29yQmFzZTxUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBYcHJUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JTaHVmZmxpbmdPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JTaHVmZmxpbmdPcD46OnR5cGUgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclNodWZmbGluZ09wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yU2h1ZmZsaW5nT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclNodWZmbGluZ09wKGNvbnN0IFhwclR5cGUmIGV4cHIsIGNvbnN0IFNodWZmbGUmIHNodWZmbGUpCisgICAgICA6IG1feHByKGV4cHIpLCBtX3NodWZmbGUoc2h1ZmZsZSkge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgU2h1ZmZsZSYgc2h1ZmZsZVBlcm11dGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9zaHVmZmxlOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU2h1ZmZsaW5nT3AmIG9wZXJhdG9yID0gKGNvbnN0IFRlbnNvclNodWZmbGluZ09wJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvclNodWZmbGluZ09wLCBjb25zdCBUZW5zb3JTaHVmZmxpbmdPcD4gQXNzaWduOworICAgICAgQXNzaWduIGFzc2lnbigqdGhpcywgb3RoZXIpOworICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZT46OnJ1bihhc3NpZ24sIERlZmF1bHREZXZpY2UoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JTaHVmZmxpbmdPcCYgb3BlcmF0b3IgPSAoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFRlbnNvckFzc2lnbk9wPFRlbnNvclNodWZmbGluZ09wLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFNodWZmbGUgbV9zaHVmZmxlOworfTsKKworCisvLyBFdmFsIGFzIHJ2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgU2h1ZmZsZSwgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBBcmdUeXBlPiwgRGV2aWNlPgoreworICB0eXBlZGVmIFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltcyA9IGludGVybmFsOjphcnJheV9zaXplPHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zPjo6dmFsdWU7CisgIHR5cGVkZWYgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBEaW1lbnNpb25zOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQYWNrZXRUeXBlPENvZWZmUmV0dXJuVHlwZSwgRGV2aWNlPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworICBzdGF0aWMgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFJldHVyblR5cGU+OjpzaXplOworCisgIGVudW0geworICAgIElzQWxpZ25lZCA9IGZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplID4gMSksCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2ltcGwuZGltZW5zaW9ucygpOworICAgIGNvbnN0IFNodWZmbGUmIHNodWZmbGUgPSBvcC5zaHVmZmxlUGVybXV0YXRpb24oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgbV9kaW1lbnNpb25zW2ldID0gaW5wdXRfZGltc1tzaHVmZmxlW2ldXTsKKyAgICB9CisKKyAgICBhcnJheTxJbmRleCwgTnVtRGltcz4gaW5wdXRTdHJpZGVzOworCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgaW5wdXRTdHJpZGVzWzBdID0gMTsKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1swXSA9IDE7CisgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgICBpbnB1dFN0cmlkZXNbaV0gPSBpbnB1dFN0cmlkZXNbaSAtIDFdICogaW5wdXRfZGltc1tpIC0gMV07CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpIC0gMV0gKiBtX2RpbWVuc2lvbnNbaSAtIDFdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnB1dFN0cmlkZXNbTnVtRGltcyAtIDFdID0gMTsKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zIC0gMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBpbnB1dFN0cmlkZXNbaV0gPSBpbnB1dFN0cmlkZXNbaSArIDFdICogaW5wdXRfZGltc1tpICsgMV07CisgICAgICAgIG1fb3V0cHV0U3RyaWRlc1tpXSA9IG1fb3V0cHV0U3RyaWRlc1tpICsgMV0gKiBtX2RpbWVuc2lvbnNbaSArIDFdOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CisgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IGlucHV0U3RyaWRlc1tzaHVmZmxlW2ldXTsKKyAgICB9CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgZXZhbFN1YkV4cHJzSWZOZWVkZWQoU2NhbGFyKiAvKmRhdGEqLykgeworICAgIG1faW1wbC5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY2xlYW51cCgpIHsKKyAgICBtX2ltcGwuY2xlYW51cCgpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKHNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChQYWNrZXRTaXplID4gMSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICBlaWdlbl9hc3NlcnQoaW5kZXgrUGFja2V0U2l6ZS0xIDwgZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKTsKKworICAgIEVJR0VOX0FMSUdOX01BWCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PENvZWZmUmV0dXJuVHlwZT46OnR5cGUgdmFsdWVzW1BhY2tldFNpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICB2YWx1ZXNbaV0gPSBjb2VmZihpbmRleCtpKTsKKyAgICB9CisgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gaW50ZXJuYWw6OnBsb2FkPFBhY2tldFJldHVyblR5cGU+KHZhbHVlcyk7CisgICAgcmV0dXJuIHJzbHQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvck9wQ29zdCBjb3N0UGVyQ29lZmYoYm9vbCB2ZWN0b3JpemVkKSBjb25zdCB7CisgICAgY29uc3QgZG91YmxlIGNvbXB1dGVfY29zdCA9IE51bURpbXMgKiAoMiAqIFRlbnNvck9wQ29zdDo6QWRkQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpKTsKKyAgICByZXR1cm4gbV9pbXBsLmNvc3RQZXJDb2VmZih2ZWN0b3JpemVkKSArCisgICAgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIGZhbHNlIC8qIHZlY3Rvcml6ZWQgKi8sIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgcHJvdGVjdGVkOgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHNyY0NvZWZmKEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICByZXR1cm4gaW5wdXRJbmRleCArIGluZGV4ICogbV9pbnB1dFN0cmlkZXNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltcyAtIDE7ICsraSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHggPSBpbmRleCAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5wdXRJbmRleCArPSBpZHggKiBtX2lucHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kZXggLT0gaWR4ICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgcmV0dXJuIGlucHV0SW5kZXggKyBpbmRleCAqIG1faW5wdXRTdHJpZGVzW051bURpbXMgLSAxXTsKKyAgICB9CisgIH0KKworICBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1fb3V0cHV0U3RyaWRlczsKKyAgYXJyYXk8SW5kZXgsIE51bURpbXM+IG1faW5wdXRTdHJpZGVzOworICBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPiBtX2ltcGw7Cit9OworCisKKy8vIEV2YWwgYXMgbHZhbHVlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTaHVmZmxlLCB0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBEZXZpY2U+CitzdHJ1Y3QgVGVuc29yRXZhbHVhdG9yPFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIEFyZ1R5cGU+LCBEZXZpY2U+CisgICAgOiBwdWJsaWMgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNodWZmbGluZ09wPFNodWZmbGUsIEFyZ1R5cGU+LCBEZXZpY2U+IEJhc2U7CisKKyAgdHlwZWRlZiBUZW5zb3JTaHVmZmxpbmdPcDxTaHVmZmxlLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSBmYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSA+IDEpLAorICAgIFJhd0FjY2VzcyA9IGZhbHNlCisgIH07CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBUZW5zb3JFdmFsdWF0b3IoY29uc3QgWHByVHlwZSYgb3AsIGNvbnN0IERldmljZSYgZGV2aWNlKQorICAgICAgOiBCYXNlKG9wLCBkZXZpY2UpCisgIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgeworICAgIHJldHVybiB0aGlzLT5tX2ltcGwuY29lZmZSZWYodGhpcy0+c3JjQ29lZmYoaW5kZXgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDxpbnQgU3RvcmVNb2RlPiBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IFBhY2tldFJldHVyblR5cGUmIHgpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChQYWNrZXRTaXplID4gMSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKworICAgIEVJR0VOX0FMSUdOX01BWCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PENvZWZmUmV0dXJuVHlwZT46OnR5cGUgdmFsdWVzW1BhY2tldFNpemVdOworICAgIGludGVybmFsOjpwc3RvcmU8Q29lZmZSZXR1cm5UeXBlLCBQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMsIHgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICB0aGlzLT5jb2VmZlJlZihpbmRleCtpKSA9IHZhbHVlc1tpXTsKKyAgICB9CisgIH0KK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1NIVUZGTElOR19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN0b3JhZ2UuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmQ0YWYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN0b3JhZ2UuaApAQCAtMCwwICsxLDE0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8gQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SU1RPUkFHRV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JTVE9SQUdFX0gKKworI2lmZGVmIEVJR0VOX1RFTlNPUl9TVE9SQUdFX0NUT1JfUExVR0lOCisgICNkZWZpbmUgRUlHRU5fSU5URVJOQUxfVEVOU09SX1NUT1JBR0VfQ1RPUl9QTFVHSU4gRUlHRU5fVEVOU09SX1NUT1JBR0VfQ1RPUl9QTFVHSU47CisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0lOVEVSTkFMX1RFTlNPUl9TVE9SQUdFX0NUT1JfUExVR0lOCisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIFRlbnNvclN0b3JhZ2UKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3RvcmVzIHRoZSBkYXRhIG9mIGEgdGVuc29yCisgICoKKyAgKiBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgZGF0YSBvZiBmaXhlZC1zaXplLCBkeW5hbWljLXNpemUgb3IgbWl4ZWQgdGVuc29ycworICAqIGluIGEgd2F5IGFzIGNvbXBhY3QgYXMgcG9zc2libGUuCisgICoKKyAgKiBcc2EgVGVuc29yCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBEaW1lbnNpb25zLCBpbnQgT3B0aW9uc18+IGNsYXNzIFRlbnNvclN0b3JhZ2U7CisKKworLy8gUHVyZSBmaXhlZC1zaXplIHN0b3JhZ2UKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEZpeGVkRGltZW5zaW9ucywgaW50IE9wdGlvbnNfPgorY2xhc3MgVGVuc29yU3RvcmFnZQoreworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBTaXplID0gRml4ZWREaW1lbnNpb25zOjp0b3RhbF9zaXplOworCisgIC8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIHNpemUgYXQgbGVhc3Qgb25lIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MuCisgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBNaW5TaXplID0gbWF4X25fMTxTaXplPjo6c2l6ZTsKKyAgRUlHRU5fQUxJR05fTUFYIFQgbV9kYXRhW01pblNpemVdOworCisgIEZpeGVkRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7CisKKyBwdWJsaWM6CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU3RvcmFnZSgpIHsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEZpeGVkRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVuc2VJbmRleCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zLlRvdGFsU2l6ZSgpOyB9Cit9OworCisKKy8vIHB1cmUgZHluYW1pYwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5kZXhUeXBlLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zXz4KK2NsYXNzIFRlbnNvclN0b3JhZ2U8VCwgRFNpemVzPEluZGV4VHlwZSwgTnVtSW5kaWNlc18+LCBPcHRpb25zXz4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgSW5kZXhUeXBlIEluZGV4OworICAgIHR5cGVkZWYgRFNpemVzPEluZGV4VHlwZSwgTnVtSW5kaWNlc18+IERpbWVuc2lvbnM7CisgICAgdHlwZWRlZiBUZW5zb3JTdG9yYWdlPFQsIERTaXplczxJbmRleFR5cGUsIE51bUluZGljZXNfPiwgT3B0aW9uc18+IFNlbGY7CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBUZW5zb3JTdG9yYWdlKCkgOiBtX2RhdGEoMCksIG1fZGltZW5zaW9ucygpIHsKKyAgICAgIGlmIChOdW1JbmRpY2VzXyA9PSAwKSB7CisJbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoT3B0aW9uc18mRG9udEFsaWduKT09MD4oMSk7CisgICAgICB9CisgICAgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvclN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKDApLCBtX2RpbWVuc2lvbnMoaW50ZXJuYWw6OnRlbXBsYXRlIHJlcGVhdDxOdW1JbmRpY2VzXywgSW5kZXg+KDApKSB7fQorICAgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvclN0b3JhZ2UoSW5kZXggc2l6ZSwgY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXNfPiYgZGltZW5zaW9ucykKKyAgICAgICAgOiBtX2RhdGEoaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoT3B0aW9uc18mRG9udEFsaWduKT09MD4oc2l6ZSkpLCBtX2RpbWVuc2lvbnMoZGltZW5zaW9ucykKKyAgICAgIHsgRUlHRU5fSU5URVJOQUxfVEVOU09SX1NUT1JBR0VfQ1RPUl9QTFVHSU4gfQorCisjaWYgRUlHRU5fSEFTX1ZBUklBRElDX1RFTVBMQVRFUworICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBEZW5zZUluZGV4PgorICAgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvclN0b3JhZ2UoRGVuc2VJbmRleC4uLiBpbmRpY2VzKSA6IG1fZGltZW5zaW9ucyhpbmRpY2VzLi4uKSB7CisgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChPcHRpb25zXyZEb250QWxpZ24pPT0wPihpbnRlcm5hbDo6YXJyYXlfcHJvZChtX2RpbWVuc2lvbnMpKTsKKyAgICB9CisjZW5kaWYKKworICAgIEVJR0VOX0RFVklDRV9GVU5DIFRlbnNvclN0b3JhZ2UoY29uc3QgU2VsZiYgb3RoZXIpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChPcHRpb25zXyZEb250QWxpZ24pPT0wPihpbnRlcm5hbDo6YXJyYXlfcHJvZChvdGhlci5tX2RpbWVuc2lvbnMpKSkKKyAgICAgICwgbV9kaW1lbnNpb25zKG90aGVyLm1fZGltZW5zaW9ucykKKyAgICB7CisgICAgICBpbnRlcm5hbDo6c21hcnRfY29weShvdGhlci5tX2RhdGEsIG90aGVyLm1fZGF0YStpbnRlcm5hbDo6YXJyYXlfcHJvZChvdGhlci5tX2RpbWVuc2lvbnMpLCBtX2RhdGEpOworICAgIH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBTZWxmJiBvcGVyYXRvcj0oY29uc3QgU2VsZiYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKSB7CisgICAgICAgIFNlbGYgdG1wKG90aGVyKTsKKyAgICAgICAgdGhpcy0+c3dhcCh0bXApOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DICB+VGVuc29yU3RvcmFnZSgpIHsgaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlX2F1dG88VCwoT3B0aW9uc18mRG9udEFsaWduKT09MD4obV9kYXRhLCBpbnRlcm5hbDo6YXJyYXlfcHJvZChtX2RpbWVuc2lvbnMpKTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DICB2b2lkIHN3YXAoU2VsZiYgb3RoZXIpCisgICAgeyBudW1leHQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IG51bWV4dDo6c3dhcChtX2RpbWVuc2lvbnMsb3RoZXIubV9kaW1lbnNpb25zKTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3Qge3JldHVybiBtX2RpbWVuc2lvbnM7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXNpemUoSW5kZXggc2l6ZSwgY29uc3QgYXJyYXk8SW5kZXgsIE51bUluZGljZXNfPiYgbmJEaW1lbnNpb25zKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IGN1cnJlbnRTeiA9IGludGVybmFsOjphcnJheV9wcm9kKG1fZGltZW5zaW9ucyk7CisgICAgICBpZihzaXplICE9IGN1cnJlbnRTeikKKyAgICAgIHsKKyAgICAgICAgaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlX2F1dG88VCwoT3B0aW9uc18mRG9udEFsaWduKT09MD4obV9kYXRhLCBjdXJyZW50U3opOworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChPcHRpb25zXyZEb250QWxpZ24pPT0wPihzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoTnVtSW5kaWNlc18gPT0gMCkgeworCSAgbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoT3B0aW9uc18mRG9udEFsaWduKT09MD4oMSk7CisJfQorCWVsc2UKKyAgICAgICAgICBtX2RhdGEgPSAwOworICAgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOKHt9KQorICAgICAgfQorICAgICAgbV9kaW1lbnNpb25zID0gbmJEaW1lbnNpb25zOworICAgIH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zLlRvdGFsU2l6ZSgpOyB9CisKKyBwcml2YXRlOgorICBUICptX2RhdGE7CisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SU1RPUkFHRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN0cmlkaW5nLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN0cmlkaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzNWJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3RyaWRpbmcuaApAQCAtMCwwICsxLDMzOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1NUUklESU5HX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9TVFJJRElOR19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgVGVuc29yU3RyaWRpbmcKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgVGVuc29yIHN0cmlkaW5nIGNsYXNzLgorICAqCisgICoKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JTdHJpZGluZ09wPFN0cmlkZXMsIFhwclR5cGU+ID4gOiBwdWJsaWMgdHJhaXRzPFhwclR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0cmFpdHM8WHByVHlwZT4gWHByVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclRyYWl0czo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TmVzdGVkPjo6dHlwZSBfTmVzdGVkOworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBYcHJUcmFpdHM6Ok51bURpbWVuc2lvbnM7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IGV2YWw8VGVuc29yU3RyaWRpbmdPcDxTdHJpZGVzLCBYcHJUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclN0cmlkaW5nT3A8U3RyaWRlcywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IG5lc3RlZDxUZW5zb3JTdHJpZGluZ09wPFN0cmlkZXMsIFhwclR5cGU+LCAxLCB0eXBlbmFtZSBldmFsPFRlbnNvclN0cmlkaW5nT3A8U3RyaWRlcywgWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JTdHJpZGluZ09wPFN0cmlkZXMsIFhwclR5cGU+IHR5cGU7Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVzLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yU3RyaWRpbmdPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvclN0cmlkaW5nT3A8U3RyaWRlcywgWHByVHlwZT4gPgoreworICBwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yU3RyaWRpbmdPcD46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6Om5lc3RlZDxUZW5zb3JTdHJpZGluZ09wPjo6dHlwZSBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yU3RyaWRpbmdPcD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPFRlbnNvclN0cmlkaW5nT3A+OjpJbmRleCBJbmRleDsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclN0cmlkaW5nT3AoY29uc3QgWHByVHlwZSYgZXhwciwgY29uc3QgU3RyaWRlcyYgZGltcykKKyAgICAgIDogbV94cHIoZXhwciksIG1fZGltcyhkaW1zKSB7fQorCisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBjb25zdCBTdHJpZGVzJiBzdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gbV9kaW1zOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1feHByOyB9CisKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yU3RyaWRpbmdPcCYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yU3RyaWRpbmdPcCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JTdHJpZGluZ09wLCBjb25zdCBUZW5zb3JTdHJpZGluZ09wPiBBc3NpZ247CisgICAgICBBc3NpZ24gYXNzaWduKCp0aGlzLCBvdGhlcik7CisgICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZWZhdWx0RGV2aWNlPjo6cnVuKGFzc2lnbiwgRGVmYXVsdERldmljZSgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclN0cmlkaW5nT3AmIG9wZXJhdG9yID0gKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiBUZW5zb3JBc3NpZ25PcDxUZW5zb3JTdHJpZGluZ09wLCBjb25zdCBPdGhlckRlcml2ZWQ+IEFzc2lnbjsKKyAgICAgIEFzc2lnbiBhc3NpZ24oKnRoaXMsIG90aGVyKTsKKyAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2U+OjpydW4oYXNzaWduLCBEZWZhdWx0RGV2aWNlKCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IFN0cmlkZXMgbV9kaW1zOworfTsKKworCisvLyBFdmFsIGFzIHJ2YWx1ZQordGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlcywgdHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTdHJpZGluZ09wPFN0cmlkZXMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yU3RyaWRpbmdPcDxTdHJpZGVzLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICB0eXBlZGVmIERTaXplczxJbmRleCwgTnVtRGltcz4gRGltZW5zaW9uczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBlbnVtIHsKKyAgICBJc0FsaWduZWQgPSAvKlRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpJc0FsaWduZWQqL2ZhbHNlLAorICAgIFBhY2tldEFjY2VzcyA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpQYWNrZXRBY2Nlc3MsCisgICAgTGF5b3V0ID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkxheW91dCwKKyAgICBDb29yZEFjY2VzcyA9IGZhbHNlLCAgLy8gdG8gYmUgaW1wbGVtZW50ZWQKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgbV9kaW1lbnNpb25zID0gbV9pbXBsLmRpbWVuc2lvbnMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgeworICAgICAgbV9kaW1lbnNpb25zW2ldID0gY2VpbGYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fZGltZW5zaW9uc1tpXSkgLyBvcC5zdHJpZGVzKClbaV0pOworICAgIH0KKworICAgIGNvbnN0IHR5cGVuYW1lIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpEaW1lbnNpb25zJiBpbnB1dF9kaW1zID0gbV9pbXBsLmRpbWVuc2lvbnMoKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX291dHB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgbV9pbnB1dFN0cmlkZXNbMF0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9vdXRwdXRTdHJpZGVzW2ldID0gbV9vdXRwdXRTdHJpZGVzW2ktMV0gKiBtX2RpbWVuc2lvbnNbaS0xXTsKKyAgICAgICAgbV9pbnB1dFN0cmlkZXNbaV0gPSBtX2lucHV0U3RyaWRlc1tpLTFdICogaW5wdXRfZGltc1tpLTFdOworICAgICAgICBtX2lucHV0U3RyaWRlc1tpLTFdICo9IG9wLnN0cmlkZXMoKVtpLTFdOworICAgICAgfQorICAgICAgbV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXSAqPSBvcC5zdHJpZGVzKClbTnVtRGltcy0xXTsKKyAgICB9IGVsc2UgeyAgLy8gUm93TWFqb3IKKyAgICAgIG1fb3V0cHV0U3RyaWRlc1tOdW1EaW1zLTFdID0gMTsKKyAgICAgIG1faW5wdXRTdHJpZGVzW051bURpbXMtMV0gPSAxOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAyOyBpID49IDA7IC0taSkgeworICAgICAgICBtX291dHB1dFN0cmlkZXNbaV0gPSBtX291dHB1dFN0cmlkZXNbaSsxXSAqIG1fZGltZW5zaW9uc1tpKzFdOworICAgICAgICBtX2lucHV0U3RyaWRlc1tpXSA9IG1faW5wdXRTdHJpZGVzW2krMV0gKiBpbnB1dF9kaW1zW2krMV07CisgICAgICAgIG1faW5wdXRTdHJpZGVzW2krMV0gKj0gb3Auc3RyaWRlcygpW2krMV07CisgICAgICB9CisgICAgICBtX2lucHV0U3RyaWRlc1swXSAqPSBvcC5zdHJpZGVzKClbMF07CisgICAgfQorICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBEaW1lbnNpb25zJiBkaW1lbnNpb25zKCkgY29uc3QgeyByZXR1cm4gbV9kaW1lbnNpb25zOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBib29sIGV2YWxTdWJFeHByc0lmTmVlZGVkKFNjYWxhciogLypkYXRhKi8pIHsKKyAgICBtX2ltcGwuZXZhbFN1YkV4cHJzSWZOZWVkZWQoTlVMTCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgcmV0dXJuIG1faW1wbC5jb2VmZihzcmNDb2VmZihpbmRleCkpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBJbmRleCBpbnB1dEluZGljZXNbXSA9IHswLCAwfTsKKyAgICBJbmRleCBpbmRpY2VzW10gPSB7aW5kZXgsIGluZGV4ICsgUGFja2V0U2l6ZSAtIDF9OworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHgwID0gaW5kaWNlc1swXSAvIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MSA9IGluZGljZXNbMV0gLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1swXSArPSBpZHgwICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpZHgxICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMF0gLT0gaWR4MCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kaWNlc1sxXSAtPSBpZHgxICogbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgaW5wdXRJbmRpY2VzWzBdICs9IGluZGljZXNbMF0gKiBtX2lucHV0U3RyaWRlc1swXTsKKyAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpbmRpY2VzWzFdICogbV9pbnB1dFN0cmlkZXNbMF07CisgICAgfSBlbHNlIHsgIC8vIFJvd01ham9yCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGluZGljZXNbMF0gLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDEgPSBpbmRpY2VzWzFdIC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMF0gKz0gaWR4MCAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMV0gKz0gaWR4MSAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzBdIC09IGlkeDAgKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMV0gLT0gaWR4MSAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kaWNlc1swXSArPSBpbmRpY2VzWzBdICogbV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXTsKKyAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpbmRpY2VzWzFdICogbV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXTsKKyAgICB9CisgICAgaWYgKGlucHV0SW5kaWNlc1sxXSAtIGlucHV0SW5kaWNlc1swXSA9PSBQYWNrZXRTaXplIC0gMSkgeworICAgICAgUGFja2V0UmV0dXJuVHlwZSByc2x0ID0gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kaWNlc1swXSk7CisgICAgICByZXR1cm4gcnNsdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBFSUdFTl9BTElHTl9NQVggdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxDb2VmZlJldHVyblR5cGU+Ojp0eXBlIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgIHZhbHVlc1swXSA9IG1faW1wbC5jb2VmZihpbnB1dEluZGljZXNbMF0pOworICAgICAgdmFsdWVzW1BhY2tldFNpemUtMV0gPSBtX2ltcGwuY29lZmYoaW5wdXRJbmRpY2VzWzFdKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgUGFja2V0U2l6ZS0xOyArK2kpIHsKKyAgICAgICAgdmFsdWVzW2ldID0gY29lZmYoaW5kZXgraSk7CisgICAgICB9CisgICAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICAgIHJldHVybiByc2x0OworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0IGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICBkb3VibGUgY29tcHV0ZV9jb3N0ID0gKE51bURpbXMgLSAxKSAqIChUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yT3BDb3N0OjpEaXZDb3N0PEluZGV4PigpKSArCisgICAgICAgIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKTsKKyAgICBpZiAodmVjdG9yaXplZCkgeworICAgICAgY29tcHV0ZV9jb3N0ICo9IDI7ICAvLyBwYWNrZXQoKSBjb21wdXRlcyB0d28gaW5kaWNlcworICAgIH0KKyAgICBjb25zdCBpbnQgaW5uZXJEaW0gPSAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSA/IDAgOiAoTnVtRGltcyAtIDEpOworICAgIHJldHVybiBtX2ltcGwuY29zdFBlckNvZWZmKHZlY3Rvcml6ZWQgJiYgbV9pbnB1dFN0cmlkZXNbaW5uZXJEaW1dID09IDEpICsKKyAgICAgICAgLy8gQ29tcHV0YXRpb24gaXMgbm90IHZlY3Rvcml6ZWQgcGVyIHNlLCBidXQgaXQgaXMgZG9uZSBvbmNlIHBlciBwYWNrZXQuCisgICAgICAgIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgcHJvdGVjdGVkOgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHNyY0NvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgSW5kZXggaW5wdXRJbmRleCA9IDA7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMgLSAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IGluZGV4IC8gbV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGV4ICs9IGlkeCAqIG1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRleCAtPSBpZHggKiBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICB9CisgICAgICBpbnB1dEluZGV4ICs9IGluZGV4ICogbV9pbnB1dFN0cmlkZXNbMF07CisgICAgfSBlbHNlIHsgIC8vIFJvd01ham9yCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4ID0gaW5kZXggLyBtX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kZXggKz0gaWR4ICogbV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGV4IC09IGlkeCAqIG1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kZXggKz0gaW5kZXggKiBtX2lucHV0U3RyaWRlc1tOdW1EaW1zLTFdOworICAgIH0KKyAgICByZXR1cm4gaW5wdXRJbmRleDsKKyAgfQorCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9vdXRwdXRTdHJpZGVzOworICBhcnJheTxJbmRleCwgTnVtRGltcz4gbV9pbnB1dFN0cmlkZXM7CisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKK307CisKKworLy8gRXZhbCBhcyBsdmFsdWUKK3RlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZXMsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8VGVuc29yU3RyaWRpbmdPcDxTdHJpZGVzLCBBcmdUeXBlPiwgRGV2aWNlPgorICAgIDogcHVibGljIFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTdHJpZGluZ09wPFN0cmlkZXMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yU3RyaWRpbmdPcDxTdHJpZGVzLCBBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxjb25zdCBYcHJUeXBlLCBEZXZpY2U+IEJhc2U7CisgIC8vICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbXMgPSBpbnRlcm5hbDo6YXJyYXlfc2l6ZTx0eXBlbmFtZSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6RGltZW5zaW9ucz46OnZhbHVlOworICAvLyAgdHlwZWRlZiBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IERpbWVuc2lvbnM7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gLypUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6SXNBbGlnbmVkKi9mYWxzZSwKKyAgICBQYWNrZXRBY2Nlc3MgPSBUZW5zb3JFdmFsdWF0b3I8QXJnVHlwZSwgRGV2aWNlPjo6UGFja2V0QWNjZXNzLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwgIC8vIHRvIGJlIGltcGxlbWVudGVkCisgICAgUmF3QWNjZXNzID0gZmFsc2UKKyAgfTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvckV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiBvcCwgY29uc3QgRGV2aWNlJiBkZXZpY2UpCisgICAgICA6IEJhc2Uob3AsIGRldmljZSkgeyB9CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGFja2V0VHlwZTxDb2VmZlJldHVyblR5cGUsIERldmljZT46OnR5cGUgUGFja2V0UmV0dXJuVHlwZTsKKyAgc3RhdGljIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRSZXR1cm5UeXBlPjo6c2l6ZTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgIHsKKyAgICByZXR1cm4gdGhpcy0+bV9pbXBsLmNvZWZmUmVmKHRoaXMtPnNyY0NvZWZmKGluZGV4KSk7CisgIH0KKworICB0ZW1wbGF0ZSA8aW50IFN0b3JlTW9kZT4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRSZXR1cm5UeXBlJiB4KQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IHRoaXMtPmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBJbmRleCBpbnB1dEluZGljZXNbXSA9IHswLCAwfTsKKyAgICBJbmRleCBpbmRpY2VzW10gPSB7aW5kZXgsIGluZGV4ICsgUGFja2V0U2l6ZSAtIDF9OworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBjb25zdCBJbmRleCBpZHgwID0gaW5kaWNlc1swXSAvIHRoaXMtPm1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MSA9IGluZGljZXNbMV0gLyB0aGlzLT5tX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1swXSArPSBpZHgwICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpZHgxICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMF0gLT0gaWR4MCAqIHRoaXMtPm1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgICAgaW5kaWNlc1sxXSAtPSBpZHgxICogdGhpcy0+bV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgfQorICAgICAgaW5wdXRJbmRpY2VzWzBdICs9IGluZGljZXNbMF0gKiB0aGlzLT5tX2lucHV0U3RyaWRlc1swXTsKKyAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpbmRpY2VzWzFdICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbMF07CisgICAgfSBlbHNlIHsgIC8vIFJvd01ham9yCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKKyAgICAgICAgY29uc3QgSW5kZXggaWR4MCA9IGluZGljZXNbMF0gLyB0aGlzLT5tX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGNvbnN0IEluZGV4IGlkeDEgPSBpbmRpY2VzWzFdIC8gdGhpcy0+bV9vdXRwdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMF0gKz0gaWR4MCAqIHRoaXMtPm1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbnB1dEluZGljZXNbMV0gKz0gaWR4MSAqIHRoaXMtPm1faW5wdXRTdHJpZGVzW2ldOworICAgICAgICBpbmRpY2VzWzBdIC09IGlkeDAgKiB0aGlzLT5tX291dHB1dFN0cmlkZXNbaV07CisgICAgICAgIGluZGljZXNbMV0gLT0gaWR4MSAqIHRoaXMtPm1fb3V0cHV0U3RyaWRlc1tpXTsKKyAgICAgIH0KKyAgICAgIGlucHV0SW5kaWNlc1swXSArPSBpbmRpY2VzWzBdICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXTsKKyAgICAgIGlucHV0SW5kaWNlc1sxXSArPSBpbmRpY2VzWzFdICogdGhpcy0+bV9pbnB1dFN0cmlkZXNbTnVtRGltcy0xXTsKKyAgICB9CisgICAgaWYgKGlucHV0SW5kaWNlc1sxXSAtIGlucHV0SW5kaWNlc1swXSA9PSBQYWNrZXRTaXplIC0gMSkgeworICAgICAgdGhpcy0+bV9pbXBsLnRlbXBsYXRlIHdyaXRlUGFja2V0PFVuYWxpZ25lZD4oaW5wdXRJbmRpY2VzWzBdLCB4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIHZhbHVlc1tQYWNrZXRTaXplXTsKKyAgICAgIGludGVybmFsOjpwc3RvcmU8U2NhbGFyLCBQYWNrZXRSZXR1cm5UeXBlPih2YWx1ZXMsIHgpOworICAgICAgdGhpcy0+bV9pbXBsLmNvZWZmUmVmKGlucHV0SW5kaWNlc1swXSkgPSB2YWx1ZXNbMF07CisgICAgICB0aGlzLT5tX2ltcGwuY29lZmZSZWYoaW5wdXRJbmRpY2VzWzFdKSA9IHZhbHVlc1tQYWNrZXRTaXplLTFdOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBQYWNrZXRTaXplLTE7ICsraSkgeworICAgICAgICB0aGlzLT5jb2VmZlJlZihpbmRleCtpKSA9IHZhbHVlc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1NUUklESU5HX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ODAwZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogZWlnZW5AY29kZXBsYXkuY29tCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBHZW5lcmFsIGluY2x1ZGUgaGVhZGVyIG9mIFNZQ0wgdGFyZ2V0IGZvciBUZW5zb3IgTW9kdWxlCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9ICisjZGVmaW5lIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9ICisKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTAorCisvLyBnbG9iYWwgcG9pbnRlciB0byBzZXQgZGlmZmVyZW50IGF0dHJpYnV0ZSBzdGF0ZSBmb3IgYSBjbGFzcwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgTWFrZUdsb2JhbFBvaW50ZXIgeworICB0eXBlZGVmIHR5cGVuYW1lIGNsOjpzeWNsOjpnbG9iYWxfcHRyPFQ+Ojpwb2ludGVyX3QgVHlwZTsKK307CisKKy8vIGdsb2JhbCBwb2ludGVyIHRvIHNldCBkaWZmZXJlbnQgYXR0cmlidXRlIHN0YXRlIGZvciBhIGNsYXNzCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBNYWtlTG9jYWxQb2ludGVyIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjbDo6c3ljbDo6bG9jYWxfcHRyPFQ+Ojpwb2ludGVyX3QgVHlwZTsKK307CisKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBUZW5zb3JTeWNsIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vLyBUaGlzIHN0cnVjdCBpcyB1c2VkIGZvciBzcGVjaWFsIGV4cHJlc3Npb24gbm9kZXMgd2l0aCBubyBvcGVyYXRpb25zIChmb3IgZXhhbXBsZSBhc3NpZ24gYW5kIHNlbGVjdE9QKS4KKyAgc3RydWN0IE5vT1A7CisKK3RlbXBsYXRlPGJvb2wgSXNDb25zdCwgdHlwZW5hbWUgVD4gc3RydWN0IEdldFR5cGV7CisgIHR5cGVkZWYgY29uc3QgVCBUeXBlOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBHZXRUeXBlPGZhbHNlLCBUPnsKKyAgdHlwZWRlZiBUIFR5cGU7Cit9OworCit9Cit9Cit9CisKKy8vIHR1cGxlIGNvbnN0cnVjdGlvbgorI2luY2x1ZGUgIlRlbnNvclN5Y2xUdXBsZS5oIgorCisvLyBjb3VudGluZyBudW1iZXIgb2YgbGVhZiBhdCBjb21waWxlIHRpbWUKKyNpbmNsdWRlICJUZW5zb3JTeWNsTGVhZkNvdW50LmgiCisKKy8vIFRoZSBpbmRleCBQbGFjZUhvbGRlciB0YWtlcyB0aGUgYWN0dWFsIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VzIHRoZSBhY3R1YWwKKy8vIGRhdGEgb24gaXQgd2l0aCB0aGUgcGxhY2UgaG9sZGVyLiBJdCB1c2VzIHRoZSBzYW1lIHByZS1vcmRlciBleHByZXNzaW9uIHRyZWUKKy8vIHRyYXZlcnNlIGFzIHRoZSBsZWFmIGNvdW50IGluIG9yZGVyIHRvIGdpdmUgdGhlIHJpZ2h0IGFjY2VzcyBudW1iZXIgdG8gZWFjaAorLy8gbm9kZSBpbiB0aGUgZXhwcmVzc2lvbgorI2luY2x1ZGUgIlRlbnNvclN5Y2xQbGFjZUhvbGRlckV4cHIuaCIKKworLy8gY3JlYXRpb24gb2YgYW4gYWNjZXNzb3IgdHVwbGUgZnJvbSBhIHR1cGxlIG9mIFNZQ0wgYnVmZmVycworI2luY2x1ZGUgIlRlbnNvclN5Y2xFeHRyYWN0QWNjZXNzb3IuaCIKKworLy8gdGhpcyBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYWRkcmVzcyBzcGFjZSB0eXBlIGluIHRlbnNvciBtYXAgZm9yIEdQVQorI2luY2x1ZGUgIlRlbnNvclN5Y2xDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uLmgiCisKKy8vIHRoaXMgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBmdW5jdG9ycworI2luY2x1ZGUgIlRlbnNvclN5Y2xFeHRyYWN0RnVuY3RvcnMuaCIKKworLy8gdGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSB0ZW5zb3JtYXAgb24gdGhlIGRldmljZQorLy8gdGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgZXhwcmVzc2lvbiBvbiB0aGUgZGV2aWNlCisjaW5jbHVkZSAiVGVuc29yU3ljbEV4cHJDb25zdHJ1Y3Rvci5oIgorCisvLy8gdGhpcyBpcyB1c2VkIGZvciBleHRyYWN0aW5nIHRlbnNvciByZWR1Y3Rpb24KKyNpbmNsdWRlICJUZW5zb3JSZWR1Y3Rpb25TeWNsLmgiCisKKy8vIGtlcm5lbCBleGVjdXRpb24gdXNpbmcgZnVzaW9uCisjaW5jbHVkZSAiVGVuc29yU3ljbFJ1bi5oIgorCisjZW5kaWYgIC8vIGVuZCBvZiBFSUdFTl9VU0VfU1lDTAorI2VuZGlmICAvLyBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjljODYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVuc29yU3ljbENvbnZlcnRUb0RldmljZUV4cHJlc3Npb24uaAorICoKKyAqIFxicmllZjoKKyAqICBDb252ZXJzaW9uIGZyb20gaG9zdCBwb2ludGVyIHRvIGRldmljZSBwb2ludGVyCisgKiAgaW5zaWRlIGxlYWYgbm9kZXMgb2YgdGhlIGV4cHJlc3Npb24uCisgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0NPTlZFUlRfVE9fREVWSUNFX0VYUFJFU1NJT05fSFBQCisjZGVmaW5lIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9DT05WRVJUX1RPX0RFVklDRV9FWFBSRVNTSU9OX0hQUAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIFRlbnNvclN5Y2wgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8vIFxzdHJ1Y3QgQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbgorLy8vIFxicmllZiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIE1ha2VQb2ludGVyIGluIHRoZSBob3N0IGV4cHJlc3Npb24KKy8vLyB0byB0aGUgTWFrZUdsb2JhbFBvaW50ZXIgZm9yIHRoZSBkZXZpY2UgZXhwcmVzc2lvbi4gRm9yIHRoZSBsZWFmTm9kZXMKKy8vLyBjb250YWluaW5nIHRoZSBwb2ludGVyLiBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBhZGRyZXNzIHNwYWNlIG9mCisvLy8gdGhlIHBvaW50ZXIgVCogaXMgZGlmZmVyZW50IG9uIHRoZSBob3N0IGFuZCB0aGUgZGV2aWNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHI+CitzdHJ1Y3QgQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbjsKKwordGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIE5vbk9wQ2F0ZWdvcnksIGJvb2wgSXNDb25zdCwgdHlwZW5hbWUuLi4gQXJncz4KK3N0cnVjdCBOb25PcENvbnZlcnNpb257CisgIHR5cGVkZWYgdHlwZW5hbWUgR2V0VHlwZTxJc0NvbnN0LCBOb25PcENhdGVnb3J5PHR5cGVuYW1lIENvbnZlcnRUb0RldmljZUV4cHJlc3Npb248QXJncz46OlR5cGUuLi4+ID46OlR5cGUgVHlwZTsKK307CisKKwordGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgPiBjbGFzcyBOb25PcENhdGVnb3J5LCBib29sIElzQ29uc3QsIHR5cGVuYW1lIEFyZ3M+CitzdHJ1Y3QgRGV2aWNlQ29udmVydG9yeworICB0eXBlZGVmIHR5cGVuYW1lIEdldFR5cGU8SXNDb25zdCwgTm9uT3BDYXRlZ29yeTx0eXBlbmFtZSBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPEFyZ3M+OjpUeXBlLCBNYWtlR2xvYmFsUG9pbnRlcj4gPjo6VHlwZSBUeXBlOworfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIENvbnZlcnRUb0RldmljZUV4cHJlc3Npb24gc3RydWN0IHdoZW4gdGhlIG5vZGUKKy8vLyB0eXBlIGlzIFRlbnNvck1hcAorI2RlZmluZSBURU5TT1JNQVBDT05WRVJUKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyXywgaW50IE9wdGlvbnNfLCBpbnQgT3B0aW9uczJfLCBpbnQgTnVtSW5kaWNlc18sIHR5cGVuYW1lIEluZGV4VHlwZV8sIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPlwKK3N0cnVjdCBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPENWUXVhbCBUZW5zb3JNYXA8VGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4sIE9wdGlvbnMyXywgTWFrZVBvaW50ZXJfPiA+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvck1hcDxUZW5zb3I8U2NhbGFyXywgTnVtSW5kaWNlc18sIE9wdGlvbnNfLCBJbmRleFR5cGVfPiwgT3B0aW9uczJfLCBNYWtlR2xvYmFsUG9pbnRlcj4gVHlwZTtcCit9OworCitURU5TT1JNQVBDT05WRVJUKGNvbnN0KQorVEVOU09STUFQQ09OVkVSVCgpCisjdW5kZWYgVEVOU09STUFQQ09OVkVSVAorCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbiBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZQorLy8vIHR5cGUgaXMgVGVuc29yQ3dpc2VOdWxsYXJ5T3AsIFRlbnNvckN3aXNlVW5hcnlPcCwgVGVuc29yQ3dpc2VCaW5hcnlPcCwgVGVuc29yQ3dpc2VUZXJuYXJ5T3AsIFRlbnNvckJyb2FkY2FzdGluZ09wCisjZGVmaW5lIENBVEVHT1JZQ09OVkVSVChDVlF1YWwpXAordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLCBjbGFzcy4uLj4gY2xhc3MgQ2F0ZWdvcnksIHR5cGVuYW1lIE9QLCB0eXBlbmFtZS4uLiBzdWJFeHBycz5cCitzdHJ1Y3QgQ29udmVydFRvRGV2aWNlRXhwcmVzc2lvbjxDVlF1YWwgQ2F0ZWdvcnk8T1AsIHN1YkV4cHJzLi4uPiA+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIENhdGVnb3J5PE9QLCB0eXBlbmFtZSBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPHN1YkV4cHJzPjo6VHlwZS4uLiA+IFR5cGU7XAorfTsKK0NBVEVHT1JZQ09OVkVSVChjb25zdCkKK0NBVEVHT1JZQ09OVkVSVCgpCisjdW5kZWYgQ0FURUdPUllDT05WRVJUCisKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIENvbnZlcnRUb0RldmljZUV4cHJlc3Npb24gc3RydWN0IHdoZW4gdGhlIG5vZGUKKy8vLyB0eXBlIGlzICBUZW5zb3JDd2lzZVNlbGVjdE9wCisjZGVmaW5lIFNFTEVDVE9QQ09OVkVSVChDVlF1YWwsIFJlcylcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSWZFeHByLCB0eXBlbmFtZSBUaGVuRXhwciwgdHlwZW5hbWUgRWxzZUV4cHI+XAorc3RydWN0IENvbnZlcnRUb0RldmljZUV4cHJlc3Npb248Q1ZRdWFsIFRlbnNvclNlbGVjdE9wPElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiA+XAorOiBOb25PcENvbnZlcnNpb248VGVuc29yU2VsZWN0T3AsIFJlcywgSWZFeHByLCBUaGVuRXhwciwgRWxzZUV4cHI+IHt9OworU0VMRUNUT1BDT05WRVJUKGNvbnN0LCB0cnVlKQorU0VMRUNUT1BDT05WRVJUKCwgZmFsc2UpCisjdW5kZWYgU0VMRUNUT1BDT05WRVJUCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uIHN0cnVjdCB3aGVuIHRoZSBub2RlCisvLy8gdHlwZSBpcyBjb25zdCBBc3NpbmdPUAorI2RlZmluZSBBU1NJR05DT05WRVJUKENWUXVhbCwgUmVzKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByPlwKK3N0cnVjdCBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPENWUXVhbCBUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiA+XAorOiBOb25PcENvbnZlcnNpb248VGVuc29yQXNzaWduT3AsIFJlcywgTEhTRXhwciwgUkhTRXhwcj57fTsKKworQVNTSUdOQ09OVkVSVChjb25zdCwgdHJ1ZSkKK0FTU0lHTkNPTlZFUlQoLCBmYWxzZSkKKyN1bmRlZiBBU1NJR05DT05WRVJUCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uIHN0cnVjdCB3aGVuIHRoZSBub2RlCisvLy8gdHlwZSBpcyBlaXRoZXIgVGVuc29yRm9yY2VkRXZhbE9wIG9yIFRlbnNvckV2YWxUb09wCisjZGVmaW5lIEtFUk5FTEJST0tFUkNPTlZFUlQoQ1ZRdWFsLCBSZXMsIEV4cHJOb2RlKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByPlwKK3N0cnVjdCBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPENWUXVhbCBFeHByTm9kZTxFeHByPiA+IFwKKzogRGV2aWNlQ29udmVydG9yPEV4cHJOb2RlLCBSZXMsIEV4cHI+e307CisKK0tFUk5FTEJST0tFUkNPTlZFUlQoY29uc3QsIHRydWUsIFRlbnNvckZvcmNlZEV2YWxPcCkKK0tFUk5FTEJST0tFUkNPTlZFUlQoLCBmYWxzZSwgVGVuc29yRm9yY2VkRXZhbE9wKQorS0VSTkVMQlJPS0VSQ09OVkVSVChjb25zdCwgdHJ1ZSwgVGVuc29yRXZhbFRvT3ApCitLRVJORUxCUk9LRVJDT05WRVJUKCwgZmFsc2UsIFRlbnNvckV2YWxUb09wKQorI3VuZGVmIEtFUk5FTEJST0tFUkNPTlZFUlQKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIENvbnZlcnRUb0RldmljZUV4cHJlc3Npb24gc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JSZWR1Y3Rpb25PcAorI2RlZmluZSBLRVJORUxCUk9LRVJDT05WRVJUUkVEVUNUSU9OKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1AsIHR5cGVuYW1lIERpbSwgdHlwZW5hbWUgc3ViRXhwciwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+XAorc3RydWN0IENvbnZlcnRUb0RldmljZUV4cHJlc3Npb248Q1ZRdWFsIFRlbnNvclJlZHVjdGlvbk9wPE9QLCBEaW0sIHN1YkV4cHIsIE1ha2VQb2ludGVyXz4gPiB7XAorICB0eXBlZGVmIENWUXVhbCBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltLCB0eXBlbmFtZSBDb252ZXJ0VG9EZXZpY2VFeHByZXNzaW9uPHN1YkV4cHI+OjpUeXBlLCBNYWtlR2xvYmFsUG9pbnRlcj4gVHlwZTtcCit9OworCitLRVJORUxCUk9LRVJDT05WRVJUUkVEVUNUSU9OKGNvbnN0KQorS0VSTkVMQlJPS0VSQ09OVkVSVFJFRFVDVElPTigpCisjdW5kZWYgS0VSTkVMQlJPS0VSQ09OVkVSVFJFRFVDVElPTgorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBUZW5zb3JTeWNsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xFeHByQ29uc3RydWN0b3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbEV4cHJDb25zdHJ1Y3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDNhM2EKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xFeHByQ29uc3RydWN0b3IuaApAQCAtMCwwICsxLDIzOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZW5zb3JTeWNsRXhwckNvbnN0cnVjdG9yLmgKKyAqCisgKiBcYnJpZWY6CisgKiAgVGhpcyBmaWxlIHJlLWNyZWF0ZSBhbiBleHByZXNzaW9uIG9uIHRoZSBTWUNMIGRldmljZSBpbiBvcmRlcgorICogIHRvIHVzZSB0aGUgb3JpZ2luYWwgdGVuc29yIGV2YWx1YXRvci4KKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfRVhQUl9DT05TVFJVQ1RPUl9IUFAKKyNkZWZpbmUgVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0VYUFJfQ09OU1RSVUNUT1JfSFBQCisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgVGVuc29yU3ljbCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8vIHRoaXMgY2xhc3MgaXMgdXNlZCBieSBFdmFsVG9PcCBpbiBvcmRlciB0byBjcmVhdGUgYW4gbGhzIGV4cHJlc3Npb24gd2hpY2ggaXMKKy8vLyBhIHBvaW50ZXIgZnJvbSBhbiBhY2Nlc3NvciBvbiBkZXZpY2Utb25seSBidWZmZXIKK3RlbXBsYXRlIDx0eXBlbmFtZSBQdHJUeXBlLCBzaXplX3QgTiwgdHlwZW5hbWUuLi4gUGFyYW1zPgorc3RydWN0IEV2YWxUb0xIU0NvbnN0cnVjdG9yIHsKKyAgUHRyVHlwZSBleHByOworICBFdmFsVG9MSFNDb25zdHJ1Y3Rvcihjb25zdCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8UGFyYW1zLi4uPiAmdCk6IGV4cHIoKCYoKih1dGlsaXR5Ojp0dXBsZTo6Z2V0PE4+KHQpLmdldF9wb2ludGVyKCkpKSkpIHt9Cit9OworCisvLy8gXHN0cnVjdCBFeHByQ29uc3RydWN0b3IgaXMgdXNlZCB0byByZWNvbnN0cnVjdCB0aGUgZXhwcmVzc2lvbiBvbiB0aGUgZGV2aWNlIGFuZAorLy8vIHJlY3JlYXRlIHRoZSBleHByZXNzaW9uIHdpdGggTWFrZUdsb2JhbFBvaW50ZXIgY29udGFpbmluZyB0aGUgZGV2aWNlIGFkZHJlc3MKKy8vLyBzcGFjZSBmb3IgdGhlIFRlbnNvck1hcCBwb2ludGVycyB1c2VkIGluIGV2YWwgZnVuY3Rpb24uCisvLy8gSXQgcmVjZWl2ZXMgdGhlIG9yaWdpbmFsIGV4cHJlc3Npb24gdHlwZSwgdGhlIGZ1bmN0b3Igb2YgdGhlIG5vZGUsIHRoZSB0dXBsZQorLy8vIG9mIGFjY2Vzc29ycywgYW5kIHRoZSBkZXZpY2UgZXhwcmVzc2lvbiB0eXBlIHRvIHJlLWluc3RhbnRpYXRlIHRoZQorLy8vIGV4cHJlc3Npb24gdHJlZSBmb3IgdGhlIGRldmljZQordGVtcGxhdGUgPHR5cGVuYW1lIE9yaWdFeHByLCB0eXBlbmFtZSBJbmRleEV4cHIsIHR5cGVuYW1lLi4uIFBhcmFtcz4KK3N0cnVjdCBFeHByQ29uc3RydWN0b3I7CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHByQ29uc3RydWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIFRlbnNvck1hcAorI2RlZmluZSBURU5TT1JNQVAoQ1ZRdWFsKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgT3B0aW9uc18sIGludCBPcHRpb25zMl8sIGludCBPcHRpb25zM18sIGludCBOdW1JbmRpY2VzXywgdHlwZW5hbWUgSW5kZXhUeXBlXyxcCit0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXywgc2l6ZV90IE4sIHR5cGVuYW1lLi4uIFBhcmFtcz5cCitzdHJ1Y3QgRXhwckNvbnN0cnVjdG9yPCBDVlF1YWwgVGVuc29yTWFwPFRlbnNvcjxTY2FsYXJfLCBOdW1JbmRpY2VzXywgT3B0aW9uc18sIEluZGV4VHlwZV8+LCBPcHRpb25zMl8sIE1ha2VHbG9iYWxQb2ludGVyPixcCitDVlF1YWwgUGxhY2VIb2xkZXI8Q1ZRdWFsIFRlbnNvck1hcDxUZW5zb3I8U2NhbGFyXywgTnVtSW5kaWNlc18sIE9wdGlvbnNfLCBJbmRleFR5cGVfPiwgT3B0aW9uczNfLCBNYWtlUG9pbnRlcl8+LCBOPiwgUGFyYW1zLi4uPntcCisgIHR5cGVkZWYgIENWUXVhbCBUZW5zb3JNYXA8VGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4sIE9wdGlvbnMyXywgTWFrZUdsb2JhbFBvaW50ZXI+ICBUeXBlO1wKKyAgVHlwZSBleHByO1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmNEZXRlY3Rvcj5cCisgIEV4cHJDb25zdHJ1Y3RvcihGdW5jRGV0ZWN0b3IgJmZkLCBjb25zdCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8UGFyYW1zLi4uPiAmdClcCisgIDogZXhwcihUeXBlKCgmKCoodXRpbGl0eTo6dHVwbGU6OmdldDxOPih0KS5nZXRfcG9pbnRlcigpKSkpLCBmZC5kaW1lbnNpb25zKCkpKSB7fVwKK307CisKK1RFTlNPUk1BUChjb25zdCkKK1RFTlNPUk1BUCgpCisjdW5kZWYgVEVOU09STUFQCisKKyNkZWZpbmUgVU5BUllDQVRFR09SWShDVlF1YWwpXAordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgVW5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIE9yaWdSSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZS4uLiBQYXJhbXM+XAorc3RydWN0IEV4cHJDb25zdHJ1Y3RvcjxDVlF1YWwgVW5hcnlDYXRlZ29yeTxPUCwgT3JpZ1JIU0V4cHI+LCBDVlF1YWwgVW5hcnlDYXRlZ29yeTxPUCwgUkhTRXhwcj4sIFBhcmFtcy4uLj4ge1wKKyAgdHlwZWRlZiAgRXhwckNvbnN0cnVjdG9yPE9yaWdSSFNFeHByLCBSSFNFeHByLCBQYXJhbXMuLi4+IG15X3R5cGU7XAorICBteV90eXBlIHJoc0V4cHI7XAorICB0eXBlZGVmIENWUXVhbCBVbmFyeUNhdGVnb3J5PE9QLCB0eXBlbmFtZSBteV90eXBlOjpUeXBlPiBUeXBlO1wKKyAgVHlwZSBleHByO1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmNEZXRlY3Rvcj5cCisgIEV4cHJDb25zdHJ1Y3RvcihGdW5jRGV0ZWN0b3IgJmZ1bmNELCBjb25zdCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8UGFyYW1zLi4uPiAmdClcCisgIDogcmhzRXhwcihmdW5jRC5yaHNFeHByLCB0KSwgZXhwcihyaHNFeHByLmV4cHIsIGZ1bmNELmZ1bmMpIHt9XAorfTsKKworVU5BUllDQVRFR09SWShjb25zdCkKK1VOQVJZQ0FURUdPUlkoKQorI3VuZGVmIFVOQVJZQ0FURUdPUlkKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4cHJDb25zdHJ1Y3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gVGVuc29yQmluYXJ5T3AKKyNkZWZpbmUgQklOQVJZQ0FURUdPUlkoQ1ZRdWFsKVwKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBCaW5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIE9yaWdMSFNFeHByLCB0eXBlbmFtZSBPcmlnUkhTRXhwciwgdHlwZW5hbWUgTEhTRXhwcixcCit0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZS4uLiBQYXJhbXM+XAorc3RydWN0IEV4cHJDb25zdHJ1Y3RvcjxDVlF1YWwgQmluYXJ5Q2F0ZWdvcnk8T1AsIE9yaWdMSFNFeHByLCBPcmlnUkhTRXhwcj4sICBDVlF1YWwgQmluYXJ5Q2F0ZWdvcnk8T1AsIExIU0V4cHIsIFJIU0V4cHI+LCBQYXJhbXMuLi4+IHtcCisgIHR5cGVkZWYgIEV4cHJDb25zdHJ1Y3RvcjxPcmlnTEhTRXhwciwgTEhTRXhwciwgUGFyYW1zLi4uPiBteV9sZWZ0X3R5cGU7XAorICB0eXBlZGVmICBFeHByQ29uc3RydWN0b3I8T3JpZ1JIU0V4cHIsIFJIU0V4cHIsIFBhcmFtcy4uLj4gbXlfcmlnaHRfdHlwZTtcCisgIHR5cGVkZWYgIENWUXVhbCBCaW5hcnlDYXRlZ29yeTxPUCwgdHlwZW5hbWUgbXlfbGVmdF90eXBlOjpUeXBlLCB0eXBlbmFtZSBteV9yaWdodF90eXBlOjpUeXBlPiBUeXBlO1wKKyAgbXlfbGVmdF90eXBlIGxoc0V4cHI7XAorICBteV9yaWdodF90eXBlIHJoc0V4cHI7XAorICBUeXBlIGV4cHI7XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY0RldGVjdG9yPlwKKyAgRXhwckNvbnN0cnVjdG9yKEZ1bmNEZXRlY3RvciAmZnVuY0QsIGNvbnN0IHV0aWxpdHk6OnR1cGxlOjpUdXBsZTxQYXJhbXMuLi4+ICZ0KVwKKyAgOiBsaHNFeHByKGZ1bmNELmxoc0V4cHIsIHQpLHJoc0V4cHIoZnVuY0QucmhzRXhwciwgdCksIGV4cHIobGhzRXhwci5leHByLCByaHNFeHByLmV4cHIsIGZ1bmNELmZ1bmMpIHt9XAorfTsKKworQklOQVJZQ0FURUdPUlkoY29uc3QpCitCSU5BUllDQVRFR09SWSgpCisjdW5kZWYgQklOQVJZQ0FURUdPUlkKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4cHJDb25zdHJ1Y3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gVGVuc29yQ3dpc2VUZXJuYXJ5T3AKKyNkZWZpbmUgVEVSTkFSWUNBVEVHT1JZKENWUXVhbClcCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBUZXJuYXJ5Q2F0ZWdvcnksIHR5cGVuYW1lIE9QLCB0eXBlbmFtZSBPcmlnQXJnMUV4cHIsIHR5cGVuYW1lIE9yaWdBcmcyRXhwcix0eXBlbmFtZSBPcmlnQXJnM0V4cHIsXAordHlwZW5hbWUgQXJnMUV4cHIsIHR5cGVuYW1lIEFyZzJFeHByLCB0eXBlbmFtZSBBcmczRXhwciwgdHlwZW5hbWUuLi4gUGFyYW1zPlwKK3N0cnVjdCBFeHByQ29uc3RydWN0b3I8Q1ZRdWFsIFRlcm5hcnlDYXRlZ29yeTxPUCwgT3JpZ0FyZzFFeHByLCBPcmlnQXJnMkV4cHIsIE9yaWdBcmczRXhwcj4sIENWUXVhbCBUZXJuYXJ5Q2F0ZWdvcnk8T1AsIEFyZzFFeHByLCBBcmcyRXhwciwgQXJnM0V4cHI+LCBQYXJhbXMuLi4+IHtcCisgIHR5cGVkZWYgRXhwckNvbnN0cnVjdG9yPE9yaWdBcmcxRXhwciwgQXJnMUV4cHIsIFBhcmFtcy4uLj4gbXlfYXJnMV90eXBlO1wKKyAgdHlwZWRlZiBFeHByQ29uc3RydWN0b3I8T3JpZ0FyZzJFeHByLCBBcmcyRXhwciwgUGFyYW1zLi4uPiBteV9hcmcyX3R5cGU7XAorICB0eXBlZGVmIEV4cHJDb25zdHJ1Y3RvcjxPcmlnQXJnM0V4cHIsIEFyZzNFeHByLCBQYXJhbXMuLi4+IG15X2FyZzNfdHlwZTtcCisgIHR5cGVkZWYgIENWUXVhbCBUZXJuYXJ5Q2F0ZWdvcnk8T1AsIHR5cGVuYW1lIG15X2FyZzFfdHlwZTo6VHlwZSwgdHlwZW5hbWUgbXlfYXJnMl90eXBlOjpUeXBlLCB0eXBlbmFtZSBteV9hcmczX3R5cGU6OlR5cGU+IFR5cGU7XAorICBteV9hcmcxX3R5cGUgYXJnMUV4cHI7XAorICBteV9hcmcyX3R5cGUgYXJnMkV4cHI7XAorICBteV9hcmczX3R5cGUgYXJnM0V4cHI7XAorICBUeXBlIGV4cHI7XAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY0RldGVjdG9yPlwKKyAgRXhwckNvbnN0cnVjdG9yKEZ1bmNEZXRlY3RvciAmZnVuY0QsY29uc3QgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPFBhcmFtcy4uLj4gJnQpXAorICA6IGFyZzFFeHByKGZ1bmNELmFyZzFFeHByLCB0KSwgYXJnMkV4cHIoZnVuY0QuYXJnMkV4cHIsIHQpLCBhcmczRXhwcihmdW5jRC5hcmczRXhwciwgdCksIGV4cHIoYXJnMUV4cHIuZXhwciwgYXJnMkV4cHIuZXhwciwgYXJnM0V4cHIuZXhwciwgZnVuY0QuZnVuYykge31cCit9OworCitURVJOQVJZQ0FURUdPUlkoY29uc3QpCitURVJOQVJZQ0FURUdPUlkoKQorI3VuZGVmIFRFUk5BUllDQVRFR09SWQorCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXhwckNvbnN0cnVjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBUZW5zb3JDd2lzZVNlbGVjdE9wCisjZGVmaW5lIFNFTEVDVE9QKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3JpZ0lmRXhwciwgdHlwZW5hbWUgT3JpZ1RoZW5FeHByLCB0eXBlbmFtZSBPcmlnRWxzZUV4cHIsIHR5cGVuYW1lIElmRXhwciwgdHlwZW5hbWUgVGhlbkV4cHIsIHR5cGVuYW1lIEVsc2VFeHByLCB0eXBlbmFtZS4uLiBQYXJhbXM+XAorc3RydWN0IEV4cHJDb25zdHJ1Y3RvcjwgQ1ZRdWFsIFRlbnNvclNlbGVjdE9wPE9yaWdJZkV4cHIsIE9yaWdUaGVuRXhwciwgT3JpZ0Vsc2VFeHByPiwgQ1ZRdWFsIFRlbnNvclNlbGVjdE9wPElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiwgUGFyYW1zLi4uPiB7XAorICB0eXBlZGVmICBFeHByQ29uc3RydWN0b3I8T3JpZ0lmRXhwciwgSWZFeHByLCBQYXJhbXMuLi4+IG15X2lmX3R5cGU7XAorICB0eXBlZGVmICBFeHByQ29uc3RydWN0b3I8T3JpZ1RoZW5FeHByLCBUaGVuRXhwciwgUGFyYW1zLi4uPiBteV90aGVuX3R5cGU7XAorICB0eXBlZGVmICBFeHByQ29uc3RydWN0b3I8T3JpZ0Vsc2VFeHByLCBFbHNlRXhwciwgUGFyYW1zLi4uPiBteV9lbHNlX3R5cGU7XAorICB0eXBlZGVmIENWUXVhbCBUZW5zb3JTZWxlY3RPcDx0eXBlbmFtZSBteV9pZl90eXBlOjpUeXBlLCB0eXBlbmFtZSBteV90aGVuX3R5cGU6OlR5cGUsIHR5cGVuYW1lIG15X2Vsc2VfdHlwZTo6VHlwZT4gVHlwZTtcCisgIG15X2lmX3R5cGUgaWZFeHByO1wKKyAgbXlfdGhlbl90eXBlIHRoZW5FeHByO1wKKyAgbXlfZWxzZV90eXBlIGVsc2VFeHByO1wKKyAgVHlwZSBleHByO1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmNEZXRlY3Rvcj5cCisgIEV4cHJDb25zdHJ1Y3RvcihGdW5jRGV0ZWN0b3IgJmZ1bmNELCBjb25zdCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8UGFyYW1zLi4uPiAmdClcCisgIDogaWZFeHByKGZ1bmNELmlmRXhwciwgdCksIHRoZW5FeHByKGZ1bmNELnRoZW5FeHByLCB0KSwgZWxzZUV4cHIoZnVuY0QuZWxzZUV4cHIsIHQpLCBleHByKGlmRXhwci5leHByLCB0aGVuRXhwci5leHByLCBlbHNlRXhwci5leHByKSB7fVwKK307CisKK1NFTEVDVE9QKGNvbnN0KQorU0VMRUNUT1AoKQorI3VuZGVmIFNFTEVDVE9QCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHByQ29uc3RydWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIGNvbnN0IFRlbnNvckFzc2lnbk9wCisjZGVmaW5lIEFTU0lHTihDVlF1YWwpXAordGVtcGxhdGUgPHR5cGVuYW1lIE9yaWdMSFNFeHByLCB0eXBlbmFtZSBPcmlnUkhTRXhwciwgdHlwZW5hbWUgTEhTRXhwciwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUuLi4gUGFyYW1zPlwKK3N0cnVjdCBFeHByQ29uc3RydWN0b3I8Q1ZRdWFsIFRlbnNvckFzc2lnbk9wPE9yaWdMSFNFeHByLCBPcmlnUkhTRXhwcj4sICBDVlF1YWwgVGVuc29yQXNzaWduT3A8TEhTRXhwciwgUkhTRXhwcj4sIFBhcmFtcy4uLj4ge1wKKyAgdHlwZWRlZiBFeHByQ29uc3RydWN0b3I8T3JpZ0xIU0V4cHIsIExIU0V4cHIsIFBhcmFtcy4uLj4gbXlfbGVmdF90eXBlO1wKKyAgdHlwZWRlZiBFeHByQ29uc3RydWN0b3I8T3JpZ1JIU0V4cHIsIFJIU0V4cHIsIFBhcmFtcy4uLj4gbXlfcmlnaHRfdHlwZTtcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvckFzc2lnbk9wPHR5cGVuYW1lIG15X2xlZnRfdHlwZTo6VHlwZSwgdHlwZW5hbWUgbXlfcmlnaHRfdHlwZTo6VHlwZT4gIFR5cGU7XAorICBteV9sZWZ0X3R5cGUgbGhzRXhwcjtcCisgIG15X3JpZ2h0X3R5cGUgcmhzRXhwcjtcCisgIFR5cGUgZXhwcjtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jRGV0ZWN0b3I+XAorICBFeHByQ29uc3RydWN0b3IoRnVuY0RldGVjdG9yICZmdW5jRCwgY29uc3QgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPFBhcmFtcy4uLj4gJnQpXAorICA6IGxoc0V4cHIoZnVuY0QubGhzRXhwciwgdCksIHJoc0V4cHIoZnVuY0QucmhzRXhwciwgdCksIGV4cHIobGhzRXhwci5leHByLCByaHNFeHByLmV4cHIpIHt9XAorIH07CisKKyBBU1NJR04oY29uc3QpCisgQVNTSUdOKCkKKyAjdW5kZWYgQVNTSUdOCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXhwckNvbnN0cnVjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyAgVGVuc29yRXZhbFRvT3AKKyNkZWZpbmUgRVZBTFRPKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3JpZ0V4cHIsIHR5cGVuYW1lIEV4cHIsIHR5cGVuYW1lLi4uIFBhcmFtcz5cCitzdHJ1Y3QgRXhwckNvbnN0cnVjdG9yPENWUXVhbCBUZW5zb3JFdmFsVG9PcDxPcmlnRXhwciwgTWFrZUdsb2JhbFBvaW50ZXI+LCBDVlF1YWwgVGVuc29yRXZhbFRvT3A8RXhwcj4sIFBhcmFtcy4uLj4ge1wKKyAgdHlwZWRlZiBFeHByQ29uc3RydWN0b3I8T3JpZ0V4cHIsIEV4cHIsIFBhcmFtcy4uLj4gbXlfZXhwcl90eXBlO1wKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JFdmFsVG9PcDxPcmlnRXhwciwgTWFrZUdsb2JhbFBvaW50ZXI+OjpQb2ludGVyVHlwZSBteV9idWZmZXJfdHlwZTtcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvckV2YWxUb09wPHR5cGVuYW1lIG15X2V4cHJfdHlwZTo6VHlwZSwgTWFrZUdsb2JhbFBvaW50ZXI+IFR5cGU7XAorICBteV9leHByX3R5cGUgbmVzdGVkRXhwcmVzc2lvbjtcCisgIEV2YWxUb0xIU0NvbnN0cnVjdG9yPG15X2J1ZmZlcl90eXBlLCAwLCBQYXJhbXMuLi4+IGJ1ZmZlcjtcCisgIFR5cGUgZXhwcjtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jRGV0ZWN0b3I+XAorICBFeHByQ29uc3RydWN0b3IoRnVuY0RldGVjdG9yICZmdW5jRCwgY29uc3QgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPFBhcmFtcy4uLj4gJnQpXAorICA6IG5lc3RlZEV4cHJlc3Npb24oZnVuY0QucmhzRXhwciwgdCksIGJ1ZmZlcih0KSwgZXhwcihidWZmZXIuZXhwciwgbmVzdGVkRXhwcmVzc2lvbi5leHByKSB7fVwKK307CisKK0VWQUxUTyhjb25zdCkKK0VWQUxUTygpCisjdW5kZWYgRVZBTFRPCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHByQ29uc3RydWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIFRlbnNvckZvcmNlZEV2YWxPcAorI2RlZmluZSBGT1JDRURFVkFMKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3JpZ0V4cHIsIHR5cGVuYW1lIERldkV4cHIsIHNpemVfdCBOLCB0eXBlbmFtZS4uLiBQYXJhbXM+XAorc3RydWN0IEV4cHJDb25zdHJ1Y3RvcjxDVlF1YWwgVGVuc29yRm9yY2VkRXZhbE9wPE9yaWdFeHByLCBNYWtlR2xvYmFsUG9pbnRlcj4sXAorQ1ZRdWFsIFBsYWNlSG9sZGVyPENWUXVhbCBUZW5zb3JGb3JjZWRFdmFsT3A8RGV2RXhwcj4sIE4+LCBQYXJhbXMuLi4+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvck1hcDxUZW5zb3I8dHlwZW5hbWUgVGVuc29yRm9yY2VkRXZhbE9wPERldkV4cHIsIE1ha2VHbG9iYWxQb2ludGVyPjo6U2NhbGFyLFwKKyAgVGVuc29yRm9yY2VkRXZhbE9wPERldkV4cHIsIE1ha2VHbG9iYWxQb2ludGVyPjo6TnVtRGltZW5zaW9ucywgMCwgdHlwZW5hbWUgVGVuc29yRm9yY2VkRXZhbE9wPERldkV4cHI+OjpJbmRleD4sIDAsIE1ha2VHbG9iYWxQb2ludGVyPiBUeXBlO1wKKyAgVHlwZSBleHByO1wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmNEZXRlY3Rvcj5cCisgIEV4cHJDb25zdHJ1Y3RvcihGdW5jRGV0ZWN0b3IgJmZkLCBjb25zdCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8UGFyYW1zLi4uPiAmdClcCisgIDogZXhwcihUeXBlKCgmKCoodXRpbGl0eTo6dHVwbGU6OmdldDxOPih0KS5nZXRfcG9pbnRlcigpKSkpLCBmZC5kaW1lbnNpb25zKCkpKSB7fVwKK307CisKK0ZPUkNFREVWQUwoY29uc3QpCitGT1JDRURFVkFMKCkKKyN1bmRlZiBGT1JDRURFVkFMCisKK3RlbXBsYXRlIDxib29sIENvbmRzLCAgc2l6ZV90IFggLCBzaXplX3QgWSA+IHN0cnVjdCBWYWx1ZUNvbmRpdGlvbiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgUmVzID1YOworfTsKK3RlbXBsYXRlPHNpemVfdCBYLCBzaXplX3QgWT4gc3RydWN0IFZhbHVlQ29uZGl0aW9uPGZhbHNlLCBYICwgWT4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IFJlcyA9WTsKK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHByQ29uc3RydWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JSZWR1Y3Rpb25PcAorI2RlZmluZSBTWUNMUkVEVUNUSU9ORVhQUihDVlF1YWwpXAordGVtcGxhdGUgPHR5cGVuYW1lIE9QLCB0eXBlbmFtZSBEaW0sIHR5cGVuYW1lIE9yaWdFeHByLCB0eXBlbmFtZSBEZXZFeHByLCBzaXplX3QgTiwgdHlwZW5hbWUuLi4gUGFyYW1zPlwKK3N0cnVjdCBFeHByQ29uc3RydWN0b3I8Q1ZRdWFsIFRlbnNvclJlZHVjdGlvbk9wPE9QLCBEaW0sIE9yaWdFeHByLCBNYWtlR2xvYmFsUG9pbnRlcj4sXAorQ1ZRdWFsIFBsYWNlSG9sZGVyPENWUXVhbCBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltLCBEZXZFeHByPiwgTj4sIFBhcmFtcy4uLj4ge1wKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBOdW1JbmRpY2VzPSBWYWx1ZUNvbmRpdGlvbjwgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRGV2RXhwciwgTWFrZUdsb2JhbFBvaW50ZXI+OjpOdW1EaW1lbnNpb25zPT0wLCAgMSwgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRGV2RXhwciwgTWFrZUdsb2JhbFBvaW50ZXI+OjpOdW1EaW1lbnNpb25zID46OlJlcztcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvck1hcDxUZW5zb3I8dHlwZW5hbWUgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRGV2RXhwciwgTWFrZUdsb2JhbFBvaW50ZXI+OjpTY2FsYXIsXAorICBOdW1JbmRpY2VzLCAwLCB0eXBlbmFtZSBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltLCBEZXZFeHByPjo6SW5kZXg+LCAwLCBNYWtlR2xvYmFsUG9pbnRlcj4gVHlwZTtcCisgIFR5cGUgZXhwcjtcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jRGV0ZWN0b3I+XAorICBFeHByQ29uc3RydWN0b3IoRnVuY0RldGVjdG9yICZmZCwgY29uc3QgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPFBhcmFtcy4uLj4gJnQpXAorICA6IGV4cHIoVHlwZSgoJigqKHV0aWxpdHk6OnR1cGxlOjpnZXQ8Tj4odCkuZ2V0X3BvaW50ZXIoKSkpKSwgZmQuZGltZW5zaW9ucygpKSkge31cCit9OworCitTWUNMUkVEVUNUSU9ORVhQUihjb25zdCkKK1NZQ0xSRURVQ1RJT05FWFBSKCkKKyN1bmRlZiBTWUNMUkVEVUNUSU9ORVhQUgorCisvLy8gdGVtcGxhdGUgZGVkdWN0aW9uIGZvciBccmVmIEV4cHJDb25zdHJ1Y3RvciBzdHJ1Y3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcmlnRXhwciwgdHlwZW5hbWUgSW5kZXhFeHByLCB0eXBlbmFtZSBGdW5jRCwgdHlwZW5hbWUuLi4gUGFyYW1zPgorYXV0byBjcmVhdGVEZXZpY2VFeHByZXNzaW9uKEZ1bmNEICZmdW5jRCwgY29uc3QgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPFBhcmFtcy4uLj4gJnQpCisgICAgLT4gZGVjbHR5cGUoRXhwckNvbnN0cnVjdG9yPE9yaWdFeHByLCBJbmRleEV4cHIsIFBhcmFtcy4uLj4oZnVuY0QsIHQpKSB7CisgIHJldHVybiBFeHByQ29uc3RydWN0b3I8T3JpZ0V4cHIsIEluZGV4RXhwciwgUGFyYW1zLi4uPihmdW5jRCwgdCk7Cit9CisKK30gLy8vIG5hbWVzcGFjZSBUZW5zb3JTeWNsCit9IC8vLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gLy8vIG5hbWVzcGFjZSBFaWdlbgorCisKKyNlbmRpZiAgLy8gVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0VYUFJfQ09OU1RSVUNUT1JfSFBQCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xFeHRyYWN0QWNjZXNzb3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbEV4dHJhY3RBY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGE2ODUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xFeHRyYWN0QWNjZXNzb3IuaApAQCAtMCwwICsxLDIwNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZW5zb3JTeWNsRXh0cmFjdEFjY2Vzc29yLmgKKyAqCisgKiBcYnJpZWY6CisgKiBFeHRyYWN0QWNjZXNzb3IgdGFrZXMgRXhwcmVzc2lvbiBwbGFjZUhvbGRlciBleHByZXNzaW9uIGFuZCB0aGUgdHVwbGUgb2Ygc3ljbAorICogYnVmZmVycyBhcyBhbiBpbnB1dC4gVXNpbmcgcHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsLCBFeHRyYWN0QWNjZXNzb3IKKyAqIHJlY3Vyc2l2ZWx5IGNhbGxzIGl0c2VsZiBmb3IgaXRzIGNoaWxkcmVuIGluIHRoZSBleHByZXNzaW9uIHRyZWUuIFRoZQorICogbGVhZiBub2RlIGluIHRoZSBQbGFjZUhvbGRlciBleHByZXNzaW9uIGlzIG5vdGhpbmcgYnV0IGEgY29udGFpbmVyIHByZXNlcnZpbmcKKyAqIHRoZSBvcmRlciBvZiB0aGUgYWN0dWFsIGRhdGEgaW4gdGhlIHR1cGxlIG9mIHN5Y2wgYnVmZmVyLiBCeSBpbnZva2luZyB0aGUKKyAqIGV4dHJhY3QgYWNjZXNzb3IgZm9yIHRoZSBQbGFjZUhvbGRlcjxOPiwgYW4gYWNjZXNzb3IgaXMgY3JlYXRlZCBmb3IgdGhlIE50aAorICogYnVmZmVyIGluIHRoZSB0dXBsZSBvZiBidWZmZXJzLiBUaGlzIGFjY2Vzc29yIGlzIHRoZW4gYWRkZWQgYXMgYW4gTnRoCisgKiBlbGVtZW50IGluIHRoZSB0dXBsZSBvZiBhY2Nlc3NvcnMuIEluIHRoaXMgY2FzZSB3ZSBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgZGF0YQorICogaW4gdGhlIGV4cHJlc3Npb24gdHJlZS4KKyAqCisgKiBUaGlzIGlzIHRoZSBzcGVjaWFsaXNhdGlvbiBvZiBleHRyYWN0IGFjY2Vzc29yIG1ldGhvZCBmb3IgZGlmZmVyZW50IG9wZXJhdGlvbgorICogdHlwZSBpbiB0aGUgUGxhY2VIb2xkZXIgZXhwcmVzc2lvbi4KKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfRVhUUkFDVF9BQ0NFU1NPUl9IUFAKKyNkZWZpbmUgVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0VYVFJBQ1RfQUNDRVNTT1JfSFBQCisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgVGVuc29yU3ljbCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8vIFxzdHJ1Y3QgRXh0cmFjdEFjY2Vzc29yOiBFeHRyYWN0IEFjY2Vzc29yIENsYXNzIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUKKy8vLyBhY2Nlc3NvciBmcm9tIGEgYnVmZmVyLgorLy8vIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgbGVhZiBub2RlIHdlIGNhbiBnZXQgYSByZWFkIGFjY2Vzc29yIG9yIGEKKy8vLyByZWFkX3dyaXRlIGFjY2Vzc29yCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXZhbHVhdG9yPgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjsKKworc3RydWN0IEFjY2Vzc29yQ29uc3RydWN0b3J7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZz4gc3RhdGljIGlubGluZSBhdXRvIGdldFR1cGxlKGNsOjpzeWNsOjpoYW5kbGVyJiBjZ2gsIEFyZyBldmFsKQorICAtPiBkZWNsdHlwZShFeHRyYWN0QWNjZXNzb3I8QXJnPjo6Z2V0VHVwbGUoY2doLCBldmFsKSkgeworICByZXR1cm4gRXh0cmFjdEFjY2Vzc29yPEFyZz46OmdldFR1cGxlKGNnaCwgZXZhbCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPiBzdGF0aWMgaW5saW5lIGF1dG8gZ2V0VHVwbGUoY2w6OnN5Y2w6OmhhbmRsZXImIGNnaCwgQXJnMSBldmFsMSwgQXJnMiBldmFsMikKKyAgLT4gZGVjbHR5cGUodXRpbGl0eTo6dHVwbGU6OmFwcGVuZChFeHRyYWN0QWNjZXNzb3I8QXJnMT46OmdldFR1cGxlKGNnaCwgZXZhbDEpLCBFeHRyYWN0QWNjZXNzb3I8QXJnMj46OmdldFR1cGxlKGNnaCwgZXZhbDIpKSkgeworICAgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6YXBwZW5kKEV4dHJhY3RBY2Nlc3NvcjxBcmcxPjo6Z2V0VHVwbGUoY2doLCBldmFsMSksIEV4dHJhY3RBY2Nlc3NvcjxBcmcyPjo6Z2V0VHVwbGUoY2doLCBldmFsMikpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+CXN0YXRpYyBpbmxpbmUgYXV0byBnZXRUdXBsZShjbDo6c3ljbDo6aGFuZGxlciYgY2doLCBBcmcxIGV2YWwxICwgQXJnMiBldmFsMiAsIEFyZzMgZXZhbDMpCisgIC0+IGRlY2x0eXBlKHV0aWxpdHk6OnR1cGxlOjphcHBlbmQoRXh0cmFjdEFjY2Vzc29yPEFyZzE+OjpnZXRUdXBsZShjZ2gsIGV2YWwxKSx1dGlsaXR5Ojp0dXBsZTo6YXBwZW5kKEV4dHJhY3RBY2Nlc3NvcjxBcmcyPjo6Z2V0VHVwbGUoY2doLCBldmFsMiksIEV4dHJhY3RBY2Nlc3NvcjxBcmczPjo6Z2V0VHVwbGUoY2doLCBldmFsMykpKSkgeworICAgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6YXBwZW5kKEV4dHJhY3RBY2Nlc3NvcjxBcmcxPjo6Z2V0VHVwbGUoY2doLCBldmFsMSksdXRpbGl0eTo6dHVwbGU6OmFwcGVuZChFeHRyYWN0QWNjZXNzb3I8QXJnMj46OmdldFR1cGxlKGNnaCwgZXZhbDIpLCBFeHRyYWN0QWNjZXNzb3I8QXJnMz46OmdldFR1cGxlKGNnaCwgZXZhbDMpKSk7CisgIH0KKyAgdGVtcGxhdGU8IGNsOjpzeWNsOjphY2Nlc3M6Om1vZGUgQWNNLCB0eXBlbmFtZSBBcmc+IHN0YXRpYyBpbmxpbmUgYXV0byBnZXRBY2Nlc3NvcihjbDo6c3ljbDo6aGFuZGxlciYgY2doLCBBcmcgZXZhbCkKKyAgLT4gZGVjbHR5cGUodXRpbGl0eTo6dHVwbGU6Om1ha2VfdHVwbGUoIGV2YWwuZGV2aWNlKCkudGVtcGxhdGUgZ2V0X3N5Y2xfYWNjZXNzb3I8QWNNLAorICB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgQXJnOjpDb2VmZlJldHVyblR5cGU+Ojp0eXBlPihldmFsLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgY2doLGV2YWwuZGF0YSgpKSkpeworICAgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6bWFrZV90dXBsZShldmFsLmRldmljZSgpLnRlbXBsYXRlIGdldF9zeWNsX2FjY2Vzc29yPEFjTSwgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIEFyZzo6Q29lZmZSZXR1cm5UeXBlPjo6dHlwZT4oZXZhbC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIGNnaCxldmFsLmRhdGEoKSkpOworICB9Cit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXh0cmFjdEFjY2Vzc29yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBjb25zdCBUZW5zb3JDd2lzZU51bGxhcnlPcCwgY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wIGFuZCBjb25zdCBUZW5zb3JCcm9hZGNhc3RpbmdPcAordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgVW5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIFJIU0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFVuYXJ5Q2F0ZWdvcnk8T1AsIFJIU0V4cHI+LCBEZXY+ID4geworICBzdGF0aWMgaW5saW5lIGF1dG8gZ2V0VHVwbGUoY2w6OnN5Y2w6OmhhbmRsZXImIGNnaCwgY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFVuYXJ5Q2F0ZWdvcnk8T1AsIFJIU0V4cHI+LCBEZXY+IGV2YWwpCisgIC0+IGRlY2x0eXBlKEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5pbXBsKCkpKXsKKyAgICByZXR1cm4gQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6Z2V0VHVwbGUoY2doLCBldmFsLmltcGwoKSk7CisgIH0KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JDd2lzZU51bGxhcnlPcCwgIFRlbnNvckN3aXNlVW5hcnlPcCBhbmQgIFRlbnNvckJyb2FkY2FzdGluZ09wCit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBVbmFyeUNhdGVnb3J5LCB0eXBlbmFtZSBPUCwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8VW5hcnlDYXRlZ29yeTxPUCwgUkhTRXhwcj4sIERldj4gPgorOiBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFVuYXJ5Q2F0ZWdvcnk8T1AsIFJIU0V4cHI+LCBEZXY+ID4ge307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JDd2lzZUJpbmFyeU9wCit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gY2xhc3MgQmluYXJ5Q2F0ZWdvcnksIHR5cGVuYW1lIE9QLCAgdHlwZW5hbWUgTEhTRXhwciwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgQmluYXJ5Q2F0ZWdvcnk8T1AsIExIU0V4cHIsIFJIU0V4cHI+LCBEZXY+ID4geworICBzdGF0aWMgaW5saW5lIGF1dG8gZ2V0VHVwbGUoY2w6OnN5Y2w6OmhhbmRsZXImIGNnaCwgY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IEJpbmFyeUNhdGVnb3J5PE9QLCBMSFNFeHByLCBSSFNFeHByPiwgRGV2PiBldmFsKQorICAtPiBkZWNsdHlwZShBY2Nlc3NvckNvbnN0cnVjdG9yOjpnZXRUdXBsZShjZ2gsIGV2YWwubGVmdF9pbXBsKCksIGV2YWwucmlnaHRfaW1wbCgpKSl7CisgICAgcmV0dXJuIEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5sZWZ0X2ltcGwoKSwgZXZhbC5yaWdodF9pbXBsKCkpOworICB9Cit9OworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4dHJhY3RBY2Nlc3NvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvckN3aXNlQmluYXJ5T3AKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcywgY2xhc3MsIGNsYXNzPiBjbGFzcyBCaW5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsICB0eXBlbmFtZSBMSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxCaW5hcnlDYXRlZ29yeTxPUCwgTEhTRXhwciwgUkhTRXhwcj4sIERldj4gPgorOiBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IEJpbmFyeUNhdGVnb3J5PE9QLCBMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+e307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIGNvbnN0IFRlbnNvckN3aXNlVGVybmFyeU9wCit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIFRlcm5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIEFyZzFFeHByLCB0eXBlbmFtZSBBcmcyRXhwciwgdHlwZW5hbWUgQXJnM0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlcm5hcnlDYXRlZ29yeTxPUCwgQXJnMUV4cHIsIEFyZzJFeHByLCBBcmczRXhwcj4sIERldj4gPiB7CisgIHN0YXRpYyBpbmxpbmUgYXV0byBnZXRUdXBsZShjbDo6c3ljbDo6aGFuZGxlciYgY2doLCBjb25zdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVybmFyeUNhdGVnb3J5PE9QLCBBcmcxRXhwciwgQXJnMkV4cHIsIEFyZzNFeHByPiwgRGV2PiBldmFsKQorICAtPiBkZWNsdHlwZShBY2Nlc3NvckNvbnN0cnVjdG9yOjpnZXRUdXBsZShjZ2gsIGV2YWwuYXJnMUltcGwoKSwgZXZhbC5hcmcySW1wbCgpLCBldmFsLmFyZzNJbXBsKCkpKXsKKyAgICByZXR1cm4gQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6Z2V0VHVwbGUoY2doLCBldmFsLmFyZzFJbXBsKCksIGV2YWwuYXJnMkltcGwoKSwgZXZhbC5hcmczSW1wbCgpKTsKKyAgfQorfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4dHJhY3RBY2Nlc3NvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvckN3aXNlVGVybmFyeU9wCit0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIFRlcm5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIEFyZzFFeHByLCB0eXBlbmFtZSBBcmcyRXhwciwgdHlwZW5hbWUgQXJnM0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPFRlcm5hcnlDYXRlZ29yeTxPUCwgQXJnMUV4cHIsIEFyZzJFeHByLCBBcmczRXhwcj4sIERldj4gPgorOiBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlcm5hcnlDYXRlZ29yeTxPUCwgQXJnMUV4cHIsIEFyZzJFeHByLCBBcmczRXhwcj4sIERldj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXh0cmFjdEFjY2Vzc29yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBjb25zdCBUZW5zb3JDd2lzZVNlbGVjdE9wLiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIE9QCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSWZFeHByLCB0eXBlbmFtZSBUaGVuRXhwciwgdHlwZW5hbWUgRWxzZUV4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNlbGVjdE9wPElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiwgRGV2PiA+IHsKKyAgc3RhdGljIGlubGluZSBhdXRvIGdldFR1cGxlKGNsOjpzeWNsOjpoYW5kbGVyJiBjZ2gsIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTZWxlY3RPcDxJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj4sIERldj4gZXZhbCkKKyAgLT4gZGVjbHR5cGUoQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6Z2V0VHVwbGUoY2doLCBldmFsLmNvbmRfaW1wbCgpLCBldmFsLnRoZW5faW1wbCgpLCBldmFsLmVsc2VfaW1wbCgpKSl7CisgICAgcmV0dXJuIEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5jb25kX2ltcGwoKSwgZXZhbC50aGVuX2ltcGwoKSwgZXZhbC5lbHNlX2ltcGwoKSk7CisgIH0KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIFRlbnNvckN3aXNlU2VsZWN0T3AuIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gT1AKK3RlbXBsYXRlIDx0eXBlbmFtZSBJZkV4cHIsIHR5cGVuYW1lIFRoZW5FeHByLCB0eXBlbmFtZSBFbHNlRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8VGVuc29yU2VsZWN0T3A8SWZFeHByLCBUaGVuRXhwciwgRWxzZUV4cHI+LCBEZXY+ID4KKzogRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTZWxlY3RPcDxJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj4sIERldj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXh0cmFjdEFjY2Vzc29yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgY29uc3QgVGVuc29yQXNzaWduT3AKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+IHsKKyAgc3RhdGljIGlubGluZSBhdXRvIGdldFR1cGxlKGNsOjpzeWNsOjpoYW5kbGVyJiBjZ2gsIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiwgRGV2PiBldmFsKQorICAtPiBkZWNsdHlwZShBY2Nlc3NvckNvbnN0cnVjdG9yOjpnZXRUdXBsZShjZ2gsIGV2YWwubGVmdF9pbXBsKCksIGV2YWwucmlnaHRfaW1wbCgpKSl7CisgICAgcmV0dXJuIEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5sZWZ0X2ltcGwoKSwgZXZhbC5yaWdodF9pbXBsKCkpOworIH0KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JBc3NpZ25PcAordGVtcGxhdGUgPHR5cGVuYW1lIExIU0V4cHIsIHR5cGVuYW1lIFJIU0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPFRlbnNvckFzc2lnbk9wPExIU0V4cHIsIFJIU0V4cHI+LCBEZXY+ID4KKzogRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+e307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JNYXAKKyNkZWZpbmUgVEVOU09STUFQRVhQUihDVlF1YWwsIEFDQ1R5cGUpXAordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnNfLCB0eXBlbmFtZSBEZXY+XAorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8Q1ZRdWFsIFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnNfPiwgRGV2PiA+IHtcCisgIHN0YXRpYyBpbmxpbmUgYXV0byBnZXRUdXBsZShjbDo6c3ljbDo6aGFuZGxlciYgY2doLGNvbnN0IFRlbnNvckV2YWx1YXRvcjxDVlF1YWwgVGVuc29yTWFwPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9uc18+LCBEZXY+IGV2YWwpXAorICAtPiBkZWNsdHlwZShBY2Nlc3NvckNvbnN0cnVjdG9yOjp0ZW1wbGF0ZSBnZXRBY2Nlc3NvcjxBQ0NUeXBlPihjZ2gsIGV2YWwpKXtcCisgICAgcmV0dXJuIEFjY2Vzc29yQ29uc3RydWN0b3I6OnRlbXBsYXRlIGdldEFjY2Vzc29yPEFDQ1R5cGU+KGNnaCwgZXZhbCk7XAorICB9XAorfTsKK1RFTlNPUk1BUEVYUFIoY29uc3QsIGNsOjpzeWNsOjphY2Nlc3M6Om1vZGU6OnJlYWQpCitURU5TT1JNQVBFWFBSKCwgY2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6cmVhZF93cml0ZSkKKyN1bmRlZiBURU5TT1JNQVBFWFBSCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JGb3JjZWRFdmFsT3AKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JGb3JjZWRFdmFsT3A8RXhwcj4sIERldj4gPiB7CisgIHN0YXRpYyBpbmxpbmUgYXV0byBnZXRUdXBsZShjbDo6c3ljbDo6aGFuZGxlciYgY2doLCBjb25zdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yRm9yY2VkRXZhbE9wPEV4cHI+LCBEZXY+IGV2YWwpCisgIC0+IGRlY2x0eXBlKEFjY2Vzc29yQ29uc3RydWN0b3I6OnRlbXBsYXRlIGdldEFjY2Vzc29yPGNsOjpzeWNsOjphY2Nlc3M6Om1vZGU6OnJlYWQ+KGNnaCwgZXZhbCkpeworICAgIHJldHVybiBBY2Nlc3NvckNvbnN0cnVjdG9yOjp0ZW1wbGF0ZSBnZXRBY2Nlc3NvcjxjbDo6c3ljbDo6YWNjZXNzOjptb2RlOjpyZWFkPihjZ2gsIGV2YWwpOworICB9Cit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXh0cmFjdEFjY2Vzc29yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgVGVuc29yRm9yY2VkRXZhbE9wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8VGVuc29yRm9yY2VkRXZhbE9wPEV4cHI+LCBEZXY+ID4KKzogRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JGb3JjZWRFdmFsT3A8RXhwcj4sIERldj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRXh0cmFjdEFjY2Vzc29yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgY29uc3QgVGVuc29yRXZhbFRvT3AKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JFdmFsVG9PcDxFeHByPiwgRGV2PiA+IHsKKyAgc3RhdGljIGlubGluZSBhdXRvIGdldFR1cGxlKGNsOjpzeWNsOjpoYW5kbGVyJiBjZ2gsY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckV2YWxUb09wPEV4cHI+LCBEZXY+IGV2YWwpCisgIC0+IGRlY2x0eXBlKHV0aWxpdHk6OnR1cGxlOjphcHBlbmQoQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6dGVtcGxhdGUgZ2V0QWNjZXNzb3I8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6d3JpdGU+KGNnaCwgZXZhbCksIEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5pbXBsKCkpKSl7CisgICAgcmV0dXJuIHV0aWxpdHk6OnR1cGxlOjphcHBlbmQoQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6dGVtcGxhdGUgZ2V0QWNjZXNzb3I8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6d3JpdGU+KGNnaCwgZXZhbCksIEFjY2Vzc29yQ29uc3RydWN0b3I6OmdldFR1cGxlKGNnaCwgZXZhbC5pbXBsKCkpKTsKKyAgfQorfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4dHJhY3RBY2Nlc3NvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvckV2YWxUb09wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8VGVuc29yRXZhbFRvT3A8RXhwcj4sIERldj4gPgorOiBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckV2YWxUb09wPEV4cHI+LCBEZXY+ID57fTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEV4dHJhY3RBY2Nlc3NvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1AsIHR5cGVuYW1lIERpbSwgdHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEV4dHJhY3RBY2Nlc3NvcjxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRXhwcj4sIERldj4gPiB7CisgIHN0YXRpYyBpbmxpbmUgYXV0byBnZXRUdXBsZShjbDo6c3ljbDo6aGFuZGxlciYgY2doLCBjb25zdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRXhwcj4sIERldj4gZXZhbCkKKyAgLT4gZGVjbHR5cGUoQWNjZXNzb3JDb25zdHJ1Y3Rvcjo6dGVtcGxhdGUgZ2V0QWNjZXNzb3I8Y2w6OnN5Y2w6OmFjY2Vzczo6bW9kZTo6cmVhZD4oY2doLCBldmFsKSl7CisgICAgcmV0dXJuIEFjY2Vzc29yQ29uc3RydWN0b3I6OnRlbXBsYXRlIGdldEFjY2Vzc29yPGNsOjpzeWNsOjphY2Nlc3M6Om1vZGU6OnJlYWQ+KGNnaCwgZXZhbCk7CisgIH0KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFeHRyYWN0QWNjZXNzb3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JSZWR1Y3Rpb25PcAordGVtcGxhdGUgPHR5cGVuYW1lIE9QLCB0eXBlbmFtZSBEaW0sIHR5cGVuYW1lIEV4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBFeHRyYWN0QWNjZXNzb3I8VGVuc29yRXZhbHVhdG9yPFRlbnNvclJlZHVjdGlvbk9wPE9QLCBEaW0sIEV4cHI+LCBEZXY+ID4KKzogRXh0cmFjdEFjY2Vzc29yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltLCBFeHByPiwgRGV2PiA+e307CisKKy8vLyB0ZW1wbGF0ZSBkZWR1Y3Rpb24gZm9yIFxyZWYgRXh0cmFjdEFjY2Vzc29yCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXZhbHVhdG9yPgorYXV0byBjcmVhdGVUdXBsZU9mQWNjZXNzb3JzKGNsOjpzeWNsOjpoYW5kbGVyJiBjZ2gsIGNvbnN0IEV2YWx1YXRvciYgZXhwcikKKy0+IGRlY2x0eXBlKEV4dHJhY3RBY2Nlc3NvcjxFdmFsdWF0b3I+OjpnZXRUdXBsZShjZ2gsIGV4cHIpKSB7CisgIHJldHVybiBFeHRyYWN0QWNjZXNzb3I8RXZhbHVhdG9yPjo6Z2V0VHVwbGUoY2doLCBleHByKTsKK30KKworfSAvLy8gbmFtZXNwYWNlIFRlbnNvclN5Y2wKK30gLy8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLy8gbmFtZXNwYWNlIEVpZ2VuCisjZW5kaWYgIC8vIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9FWFRSQUNUX0FDQ0VTU09SX0hQUApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsRXh0cmFjdEZ1bmN0b3JzLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xFeHRyYWN0RnVuY3RvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjcxMjUzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsRXh0cmFjdEZ1bmN0b3JzLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVuc29yU3ljbGV4dHJhY3RGdW5jdG9ycy5oCisgKgorICogXGJyaWVmOgorICogIFVzZWQgdG8gZXh0cmFjdCBhbGwgdGhlIGZ1bmN0b3JzIGFsbG9jYXRlZCB0byBlYWNoIG5vZGUgb2YgdGhlIGV4cHJlc3Npb24KKyp0cmVlLgorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9FWFRSQUNUX0ZVTkNUT1JTX0hQUAorI2RlZmluZSBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfRVhUUkFDVF9GVU5DVE9SU19IUFAKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBUZW5zb3JTeWNsIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLy8gXHN0cnVjdCBGdW5jdG9yRXh0cmFjdG9yOiAgVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBmdW5jdG9ycworLy8vIGNvbnN0cnVjdGVkIG9uCisvLy8gdGhlIGhvc3Qtc2lkZSwgdG8gcGFjayB0aGVtIGFuZCByZXVzZSB0aGVtIGluIHJlY29uc3RydWN0aW9uIG9mIHRoZQorLy8vIGV4cHJlc3Npb24gb24gdGhlIGRldmljZS4KKy8vLyBXZSBoYXZlIHRvIGRvIHRoYXQgYXMgaW4gRWlnZW4gdGhlIGZ1bmN0b3JzIGFyZSBub3Qgc3RhdGVsZXNzIHNvIHdlIGNhbm5vdAorLy8vIHJlLWluc3RhbnRpYXRlIHRoZW0gb24gdGhlIGRldmljZS4KKy8vLyBXZSBoYXZlIHRvIHBhc3MgaW5zdGFudGlhdGVkIGZ1bmN0b3JzIHRvIHRoZSBkZXZpY2UuCisvLyBUaGlzIHN0cnVjdCBpcyB1c2VkIGZvciBsZWFmTm9kZSAoVGVuc29yTWFwKSBhbmQgbm9kZXMgYmVoYXZpbmcgbGlrZSBsZWFmTm9kZSAoVGVuc29yRm9yY2VkRXZhbCkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXZhbHVhdG9yPiBzdHJ1Y3QgRnVuY3RvckV4dHJhY3RvcnsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFdmFsdWF0b3I6OkRpbWVuc2lvbnMgRGltZW5zaW9uczsKKyAgY29uc3QgRGltZW5zaW9ucyBtX2RpbWVuc2lvbnM7CisgIGNvbnN0IERpbWVuc2lvbnMmIGRpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBtX2RpbWVuc2lvbnM7IH0KKyAgRnVuY3RvckV4dHJhY3Rvcihjb25zdCBFdmFsdWF0b3ImIGV4cHIpCisgIDogbV9kaW1lbnNpb25zKGV4cHIuZGltZW5zaW9ucygpKSB7fQorCit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRnVuY3RvckV4dHJhY3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gY29uc3QgVGVuc29yQ3dpc2VOdWxsYXJ5T3AsIGNvbnN0IFRlbnNvckN3aXNlVW5hcnlPcCwgYW5kIGNvbnN0IFRlbnNvckJyb2FkY2FzdGluZ09wCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgVW5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIFJIU0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBVbmFyeUNhdGVnb3J5PE9QLCBSSFNFeHByPiwgRGV2PiA+IHsKKyAgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8UkhTRXhwciwgRGV2PiA+IHJoc0V4cHI7CisgIE9QIGZ1bmM7CisgIEZ1bmN0b3JFeHRyYWN0b3IoY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFVuYXJ5Q2F0ZWdvcnk8T1AsIFJIU0V4cHI+LCBEZXY+JiBleHByKQorICA6IHJoc0V4cHIoZXhwci5pbXBsKCkpLCBmdW5jKGV4cHIuZnVuY3RvcigpKSB7fQorfTsKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBUZW5zb3JDd2lzZU51bGxhcnlPcCwgVGVuc29yQ3dpc2VVbmFyeU9wLCBhbmQgVGVuc29yQnJvYWRjYXN0aW5nT3AKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzPiBjbGFzcyBVbmFyeUNhdGVnb3J5LCB0eXBlbmFtZSBPUCwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPFVuYXJ5Q2F0ZWdvcnk8T1AsIFJIU0V4cHI+LCBEZXY+ID4KKzogRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVW5hcnlDYXRlZ29yeTxPUCwgUkhTRXhwcj4sIERldj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRnVuY3RvckV4dHJhY3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcAordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIEJpbmFyeUNhdGVnb3J5LCB0eXBlbmFtZSBPUCwgdHlwZW5hbWUgTEhTRXhwciwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IEJpbmFyeUNhdGVnb3J5PE9QLCBMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+IHsKKyAgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8TEhTRXhwciwgRGV2PiA+IGxoc0V4cHI7CisgIEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPFJIU0V4cHIsIERldj4gPiByaHNFeHByOworICBPUCBmdW5jOworICBGdW5jdG9yRXh0cmFjdG9yKGNvbnN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBCaW5hcnlDYXRlZ29yeTxPUCwgTEhTRXhwciwgUkhTRXhwcj4sIERldj4mIGV4cHIpCisgIDogbGhzRXhwcihleHByLmxlZnRfaW1wbCgpKSxyaHNFeHByKGV4cHIucmlnaHRfaW1wbCgpKSxmdW5jKGV4cHIuZnVuY3RvcigpKSB7fQorfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEZ1bmN0b3JFeHRyYWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIGNvbnN0IFRlbnNvckN3aXNlQmluYXJ5T3AKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcz4gY2xhc3MgQmluYXJ5Q2F0ZWdvcnksIHR5cGVuYW1lIE9QLCB0eXBlbmFtZSBMSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8QmluYXJ5Q2F0ZWdvcnk8T1AsICBMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+Cis6IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IEJpbmFyeUNhdGVnb3J5PE9QLCAgTEhTRXhwciwgUkhTRXhwcj4sIERldj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRnVuY3RvckV4dHJhY3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gY29uc3QgVGVuc29yQ3dpc2VUZXJuYXJ5T3AKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLCBjbGFzcywgY2xhc3M+IGNsYXNzIFRlcm5hcnlDYXRlZ29yeSwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIEFyZzFFeHByLCB0eXBlbmFtZSBBcmcyRXhwciwgdHlwZW5hbWUgQXJnM0V4cHIsdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlcm5hcnlDYXRlZ29yeTxPUCwgQXJnMUV4cHIsIEFyZzJFeHByLCBBcmczRXhwcj4sIERldj4gPiB7CisgIEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPEFyZzFFeHByLCBEZXY+ID4gYXJnMUV4cHI7CisgIEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPEFyZzJFeHByLCBEZXY+ID4gYXJnMkV4cHI7CisgIEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPEFyZzNFeHByLCBEZXY+ID4gYXJnM0V4cHI7CisgIE9QIGZ1bmM7CisgIEZ1bmN0b3JFeHRyYWN0b3IoY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlcm5hcnlDYXRlZ29yeTxPUCwgQXJnMUV4cHIsIEFyZzJFeHByLCBBcmczRXhwcj4sIERldj4mIGV4cHIpCisgIDogYXJnMUV4cHIoZXhwci5hcmcxSW1wbCgpKSwgYXJnMkV4cHIoZXhwci5hcmcySW1wbCgpKSwgYXJnM0V4cHIoZXhwci5hcmczSW1wbCgpKSwgZnVuYyhleHByLmZ1bmN0b3IoKSkge30KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBUZW5zb3JDd2lzZVRlcm5hcnlPcAordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MsIGNsYXNzLCBjbGFzcz4gY2xhc3MgVGVybmFyeUNhdGVnb3J5LCB0eXBlbmFtZSBPUCwgdHlwZW5hbWUgQXJnMUV4cHIsIHR5cGVuYW1lIEFyZzJFeHByLCB0eXBlbmFtZSBBcmczRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPCBUZXJuYXJ5Q2F0ZWdvcnk8T1AsIEFyZzFFeHByLCBBcmcyRXhwciwgQXJnM0V4cHI+LCBEZXY+ID4KKzpGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZXJuYXJ5Q2F0ZWdvcnk8T1AsIEFyZzFFeHByLCBBcmcyRXhwciwgQXJnM0V4cHI+LCBEZXY+ID57fTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIEZ1bmN0b3JFeHRyYWN0b3Igc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcworLy8vIGNvbnN0IFRlbnNvckN3aXNlU2VsZWN0T3AuIFRoaXMgaXMgYW4gc3BlY2lhbGlzYXRpb24gd2l0aG91dCBPUCBzbyBpdCBoYXMgdG8gYmUgc2VwYXJhdGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIElmRXhwciwgdHlwZW5hbWUgVGhlbkV4cHIsIHR5cGVuYW1lIEVsc2VFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRnVuY3RvckV4dHJhY3RvcjwgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclNlbGVjdE9wPElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiwgRGV2PiA+IHsKKyAgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8SWZFeHByLCBEZXY+ID4gaWZFeHByOworICBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxUaGVuRXhwciwgRGV2PiA+IHRoZW5FeHByOworICBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxFbHNlRXhwciwgRGV2PiA+IGVsc2VFeHByOworICBGdW5jdG9yRXh0cmFjdG9yKGNvbnN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JTZWxlY3RPcDxJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj4sIERldj4mIGV4cHIpCisgIDogaWZFeHByKGV4cHIuY29uZF9pbXBsKCkpLCB0aGVuRXhwcihleHByLnRoZW5faW1wbCgpKSwgZWxzZUV4cHIoZXhwci5lbHNlX2ltcGwoKSkge30KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBUZW5zb3JDd2lzZVNlbGVjdE9wLiBUaGlzIGlzIGFuIHNwZWNpYWxpc2F0aW9uIHdpdGhvdXQgT1Agc28gaXQgaGFzIHRvIGJlIHNlcGFyYXRlZAordGVtcGxhdGUgPHR5cGVuYW1lIElmRXhwciwgdHlwZW5hbWUgVGhlbkV4cHIsIHR5cGVuYW1lIEVsc2VFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8VGVuc29yU2VsZWN0T3A8SWZFeHByLCBUaGVuRXhwciwgRWxzZUV4cHI+LCBEZXY+ID4KKzpGdW5jdG9yRXh0cmFjdG9yPCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yU2VsZWN0T3A8SWZFeHByLCBUaGVuRXhwciwgRWxzZUV4cHI+LCBEZXY+ID4ge307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBjb25zdCBUZW5zb3JBc3NpZ25PcC4gVGhpcyBpcyBhbiBzcGVjaWFsaXNhdGlvbiB3aXRob3V0IE9QIHNvIGl0IGhhcyB0byBiZSBzZXBhcmF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTRXhwciwgdHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckFzc2lnbk9wPExIU0V4cHIsIFJIU0V4cHI+LCBEZXY+ID4geworICBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxMSFNFeHByLCBEZXY+ID4gbGhzRXhwcjsKKyAgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8UkhTRXhwciwgRGV2PiA+IHJoc0V4cHI7CisgIEZ1bmN0b3JFeHRyYWN0b3IoY29uc3QgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckFzc2lnbk9wPExIU0V4cHIsIFJIU0V4cHI+LCBEZXY+JiBleHByKQorICA6IGxoc0V4cHIoZXhwci5sZWZ0X2ltcGwoKSksIHJoc0V4cHIoZXhwci5yaWdodF9pbXBsKCkpIHt9Cit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgRnVuY3RvckV4dHJhY3RvciBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gVGVuc29yQXNzaWduT3AuIFRoaXMgaXMgYW4gc3BlY2lhbGlzYXRpb24gd2l0aG91dCBPUCBzbyBpdCBoYXMgdG8gYmUgc2VwYXJhdGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIExIU0V4cHIsIHR5cGVuYW1lIFJIU0V4cHIsIHR5cGVuYW1lIERldj4KK3N0cnVjdCBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiwgRGV2PiA+Cis6RnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yQXNzaWduT3A8TEhTRXhwciwgUkhTRXhwcj4sIERldj4gPnt9OworCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBjb25zdCBUZW5zb3JFdmFsVG9PcCwgVGhpcyBpcyBhbiBzcGVjaWFsaXNhdGlvbiB3aXRob3V0IE9QIHNvIGl0IGhhcyB0byBiZSBzZXBhcmF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUkhTRXhwciwgdHlwZW5hbWUgRGV2Pgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvckV2YWxUb09wPFJIU0V4cHI+LCBEZXY+ID4geworICBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxSSFNFeHByLCBEZXY+ID4gcmhzRXhwcjsKKyAgRnVuY3RvckV4dHJhY3Rvcihjb25zdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yRXZhbFRvT3A8UkhTRXhwcj4sIERldj4mIGV4cHIpCisgIDogcmhzRXhwcihleHByLmltcGwoKSkge30KK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBGdW5jdG9yRXh0cmFjdG9yIHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMKKy8vLyBUZW5zb3JFdmFsVG9PcC4gVGhpcyBpcyBhIHNwZWNpYWxpc2F0aW9uIHdpdGhvdXQgT1Agc28gaXQgaGFzIHRvIGJlIHNlcGFyYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSSFNFeHByLCB0eXBlbmFtZSBEZXY+CitzdHJ1Y3QgRnVuY3RvckV4dHJhY3RvcjxUZW5zb3JFdmFsdWF0b3I8VGVuc29yRXZhbFRvT3A8UkhTRXhwcj4sIERldj4gPgorOiBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JFdmFsVG9PcDxSSFNFeHByPiwgRGV2PiA+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEaW0sIHNpemVfdCBOdW1PdXRwdXREaW0+IHN0cnVjdCBEaW1Db25zdHIgewordGVtcGxhdGU8dHlwZW5hbWUgSW5EaW0+CisgIHN0YXRpYyBpbmxpbmUgRGltIGdldERpbShJbkRpbSBkaW1zICkge3JldHVybiBkaW1zO30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERpbT4gc3RydWN0IERpbUNvbnN0cjxEaW0sIDA+IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5EaW0+CisgICAgc3RhdGljIGlubGluZSBEaW0gZ2V0RGltKEluRGltIGRpbXMgKSB7cmV0dXJuIERpbShkaW1zLlRvdGFsU2l6ZSgpKTt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgQXJnVHlwZSwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8sIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgQXJnVHlwZSwgTWFrZVBvaW50ZXJfPiwgRGV2aWNlPj57CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBBcmdUeXBlLCBNYWtlUG9pbnRlcl8+LCBEZXZpY2U+IEV2YWx1YXRvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsPEV2YWx1YXRvcjo6TnVtT3V0cHV0RGltcz09MCwgRFNpemVzPHR5cGVuYW1lIEV2YWx1YXRvcjo6SW5kZXgsIDE+LCB0eXBlbmFtZSBFdmFsdWF0b3I6OkRpbWVuc2lvbnMgPjo6dHlwZSBEaW1lbnNpb25zOworICBjb25zdCBEaW1lbnNpb25zIG1fZGltZW5zaW9uczsKKyAgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorICBGdW5jdG9yRXh0cmFjdG9yKGNvbnN0IFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgQXJnVHlwZSwgTWFrZVBvaW50ZXJfPiwgRGV2aWNlPiYgZXhwcikKKyAgOiBtX2RpbWVuc2lvbnMoRGltQ29uc3RyPERpbWVuc2lvbnMsIEV2YWx1YXRvcjo6TnVtT3V0cHV0RGltcz46OmdldERpbShleHByLmRpbWVuc2lvbnMoKSkpIHt9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBEaW1zLCB0eXBlbmFtZSBBcmdUeXBlLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXywgdHlwZW5hbWUgRGV2aWNlPgorc3RydWN0IEZ1bmN0b3JFeHRyYWN0b3I8VGVuc29yRXZhbHVhdG9yPFRlbnNvclJlZHVjdGlvbk9wPE9wLCBEaW1zLCBBcmdUeXBlLCBNYWtlUG9pbnRlcl8+LCBEZXZpY2U+PgorOiBGdW5jdG9yRXh0cmFjdG9yPFRlbnNvckV2YWx1YXRvcjxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPcCwgRGltcywgQXJnVHlwZSwgTWFrZVBvaW50ZXJfPiwgRGV2aWNlPj57fTsKKy8vLyB0ZW1wbGF0ZSBkZWR1Y3Rpb24gZnVuY3Rpb24gZm9yIEZ1bmN0b3JFeHRyYWN0b3IKK3RlbXBsYXRlIDx0eXBlbmFtZSBFdmFsdWF0b3I+CithdXRvIGlubGluZSBleHRyYWN0RnVuY3RvcnMoY29uc3QgRXZhbHVhdG9yJiBldmFsdWF0b3IpLT4gRnVuY3RvckV4dHJhY3RvcjxFdmFsdWF0b3I+IHsKKyAgcmV0dXJuIEZ1bmN0b3JFeHRyYWN0b3I8RXZhbHVhdG9yPihldmFsdWF0b3IpOworfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgVGVuc29yU3ljbAorfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0VYVFJBQ1RfRlVOQ1RPUlNfSFBQCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xMZWFmQ291bnQuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbExlYWZDb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDFmYWMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xMZWFmQ291bnQuaApAQCAtMCwwICsxLDExNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZW5zb3JTeWNsTGVhZkNvdW50LmgKKyAqCisgKiBcYnJpZWY6CisgKiAgVGhlIGxlYWYgY291bnQgdXNlZCB0aGUgcHJlLW9yZGVyIGV4cHJlc3Npb24gdHJlZSB0cmF2ZXJzZSBpbiBvcmRlciB0byBuYW1lCisgKiAgY291bnQgdGhlIG51bWJlciBvZiBsZWFmIG5vZGVzIGluIHRoZSBleHByZXNzaW9uCisgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0xFQUZfQ09VTlRfSFBQCisjZGVmaW5lIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9MRUFGX0NPVU5UX0hQUAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIFRlbnNvclN5Y2wgeworbmFtZXNwYWNlIGludGVybmFsIHsKKy8vLyBcYnJpZWYgTGVhZkNvdW50IHVzZWQgdG8gY291bnRpbmcgdGVybWluYWwgbm9kZXMuIFRoZSB0b3RhbCBudW1iZXIgb2YKKy8vLyBsZWFmIG5vZGVzIGlzIHVzZWQgYnkgTWFrZVBsYWNlSG9sZGVyRXhwckhlbHBlciB0byBmaW5kIHRoZSBvcmRlcgorLy8vIG9mIHRoZSBsZWFmIG5vZGUgaW4gYSBleHByZXNzaW9uIHRyZWUgYXQgY29tcGlsZSB0aW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIEV4cHI+CitzdHJ1Y3QgTGVhZkNvdW50OworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPiBzdHJ1Y3QgQ2F0ZWdvcnlDb3VudDsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQ2F0ZWdvcnlDb3VudDw+Cit7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ291bnQgPTA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmcsIHR5cGVuYW1lLi4uIEFyZ3M+CitzdHJ1Y3QgQ2F0ZWdvcnlDb3VudDxBcmcsQXJncy4uLj57CisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ291bnQgPSBMZWFmQ291bnQ8QXJnPjo6Q291bnQgKyBDYXRlZ29yeUNvdW50PEFyZ3MuLi4+OjpDb3VudDsKK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBMZWFmQ291bnQgc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JNYXAKK3RlbXBsYXRlIDx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsIGludCBPcHRpb25zXywgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcl8+CitzdHJ1Y3QgTGVhZkNvdW50PGNvbnN0IFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnNfLCBNYWtlUG9pbnRlcl8+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IENvdW50ID0xOworfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIExlYWZDb3VudCBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvck1hcAordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnNfLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIE1ha2VQb2ludGVyXz4KK3N0cnVjdCBMZWFmQ291bnQ8VGVuc29yTWFwPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9uc18sIE1ha2VQb2ludGVyXz4gPiA6TGVhZkNvdW50PGNvbnN0IFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnNfLCBNYWtlUG9pbnRlcl8+ID57fTsKKworLy8gY29uc3QgVGVuc29yQ3dpc2VVbmFyeU9wLCBjb25zdCBUZW5zb3JDd2lzZU51bGxhcnlPcCwgY29uc3QgVGVuc29yQ3dpc2VCaW5hcnlPcCwgY29uc3QgVGVuc29yQ3dpc2VUZXJuYXJ5T3AsIGFuZCBDb25zdCBUZW5zb3JCcm9hZGNhc3RpbmdPcAordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcywgY2xhc3MuLi4+IGNsYXNzIENhdGVnb3J5RXhwciwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lLi4uIFJIU0V4cHI+CitzdHJ1Y3QgTGVhZkNvdW50PGNvbnN0IENhdGVnb3J5RXhwcjxPUCwgUkhTRXhwci4uLj4gPjogQ2F0ZWdvcnlDb3VudDxSSFNFeHByLi4uPiB7fTsKKy8vIFRlbnNvckN3aXNlVW5hcnlPcCwgIFRlbnNvckN3aXNlTnVsbGFyeU9wLCAgVGVuc29yQ3dpc2VCaW5hcnlPcCwgIFRlbnNvckN3aXNlVGVybmFyeU9wLCBhbmQgIFRlbnNvckJyb2FkY2FzdGluZ09wCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcy4uLj4gY2xhc3MgQ2F0ZWdvcnlFeHByLCB0eXBlbmFtZSBPUCwgdHlwZW5hbWUuLi4gUkhTRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8Q2F0ZWdvcnlFeHByPE9QLCBSSFNFeHByLi4uPiA+IDpMZWFmQ291bnQ8Y29uc3QgQ2F0ZWdvcnlFeHByPE9QLCBSSFNFeHByLi4uPiA+e307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBMZWFmQ291bnQgc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JTZWxlY3RPcCBpcyBhbiBleGNlcHRpb24KK3RlbXBsYXRlIDx0eXBlbmFtZSBJZkV4cHIsIHR5cGVuYW1lIFRoZW5FeHByLCB0eXBlbmFtZSBFbHNlRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8Y29uc3QgVGVuc29yU2VsZWN0T3A8SWZFeHByLCBUaGVuRXhwciwgRWxzZUV4cHI+ID4gOiBDYXRlZ29yeUNvdW50PElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiB7fTsKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBMZWFmQ291bnQgc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBUZW5zb3JTZWxlY3RPcAordGVtcGxhdGUgPHR5cGVuYW1lIElmRXhwciwgdHlwZW5hbWUgVGhlbkV4cHIsIHR5cGVuYW1lIEVsc2VFeHByPgorc3RydWN0IExlYWZDb3VudDxUZW5zb3JTZWxlY3RPcDxJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj4gPjogTGVhZkNvdW50PGNvbnN0IFRlbnNvclNlbGVjdE9wPElmRXhwciwgVGhlbkV4cHIsIEVsc2VFeHByPiA+IHt9OworCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBMZWFmQ291bnQgc3RydWN0IHdoZW4gdGhlIG5vZGUgdHlwZSBpcyBjb25zdCBUZW5zb3JBc3NpZ25PcAordGVtcGxhdGUgPHR5cGVuYW1lIExIU0V4cHIsIHR5cGVuYW1lIFJIU0V4cHI+CitzdHJ1Y3QgTGVhZkNvdW50PGNvbnN0IFRlbnNvckFzc2lnbk9wPExIU0V4cHIsIFJIU0V4cHI+ID46IENhdGVnb3J5Q291bnQ8TEhTRXhwcixSSFNFeHByPiB7fTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIExlYWZDb3VudCBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzCisvLy8gVGVuc29yQXNzaWduT3AgaXMgYW4gZXhjZXB0aW9uLiBJdCBpcyBub3QgdGhlIHNhbWUgYXMgVW5hcnkKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNFeHByLCB0eXBlbmFtZSBSSFNFeHByPgorc3RydWN0IExlYWZDb3VudDxUZW5zb3JBc3NpZ25PcDxMSFNFeHByLCBSSFNFeHByPiA+IDpMZWFmQ291bnQ8Y29uc3QgVGVuc29yQXNzaWduT3A8TEhTRXhwciwgUkhTRXhwcj4gPnt9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgTGVhZkNvdW50IHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgY29uc3QgVGVuc29yRm9yY2VkRXZhbE9wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8Y29uc3QgVGVuc29yRm9yY2VkRXZhbE9wPEV4cHI+ID4geworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgQ291bnQgPTE7Cit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgTGVhZkNvdW50IHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgVGVuc29yRm9yY2VkRXZhbE9wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8VGVuc29yRm9yY2VkRXZhbE9wPEV4cHI+ID46IExlYWZDb3VudDxjb25zdCBUZW5zb3JGb3JjZWRFdmFsT3A8RXhwcj4gPiB7fTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIExlYWZDb3VudCBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIGNvbnN0IFRlbnNvckV2YWxUb09wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8Y29uc3QgVGVuc29yRXZhbFRvT3A8RXhwcj4gPiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ291bnQgPSAxICsgQ2F0ZWdvcnlDb3VudDxFeHByPjo6Q291bnQ7Cit9OworCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgTGVhZkNvdW50IHN0cnVjdCB3aGVuIHRoZSBub2RlIHR5cGUgaXMgY29uc3QgVGVuc29yUmVkdWN0aW9uT3AKK3RlbXBsYXRlIDx0eXBlbmFtZSBPUCwgdHlwZW5hbWUgRGltLCB0eXBlbmFtZSBFeHByPgorc3RydWN0IExlYWZDb3VudDxjb25zdCBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltLCBFeHByPiA+IHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IENvdW50ID0xOworfTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIExlYWZDb3VudCBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvclJlZHVjdGlvbk9wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1AsIHR5cGVuYW1lIERpbSwgdHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8VGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbSwgRXhwcj4gPjogTGVhZkNvdW50PGNvbnN0IFRlbnNvclJlZHVjdGlvbk9wPE9QLCBEaW0sIEV4cHI+ID57fTsKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIExlYWZDb3VudCBzdHJ1Y3Qgd2hlbiB0aGUgbm9kZSB0eXBlIGlzIFRlbnNvckV2YWxUb09wCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBMZWFmQ291bnQ8VGVuc29yRXZhbFRvT3A8RXhwcj4gPjogTGVhZkNvdW50PGNvbnN0IFRlbnNvckV2YWxUb09wPEV4cHI+ID57fTsKKworfSAvLy8gbmFtZXNwYWNlIFRlbnNvclN5Y2wKK30gLy8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX0xFQUZfQ09VTlRfSFBQCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xQbGFjZUhvbGRlckV4cHIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbFBsYWNlSG9sZGVyRXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzI1MGMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xQbGFjZUhvbGRlckV4cHIuaApAQCAtMCwwICsxLDE4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZW5zb3JTeWNsUGxhY2VIb2xkZXJFeHByLmgKKyAqCisgKiBcYnJpZWY6CisgKiAgVGhpcyBpcyB0aGUgc3BlY2lhbGlzYXRpb24gb2YgdGhlIHBsYWNlaG9sZGVyIGV4cHJlc3Npb24gYmFzZWQgb24gdGhlCisgKiBvcGVyYXRpb24gdHlwZQorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9QTEFDRUhPTERFUl9FWFBSX0hQUAorI2RlZmluZSBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfUExBQ0VIT0xERVJfRVhQUl9IUFAKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBUZW5zb3JTeWNsIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vLyBcc3RydWN0IFBsYWNlSG9sZGVyCisvLy8gXGJyaWVmIFBsYWNlSG9sZGVyIGlzIHVzZWQgdG8gcmVwbGFjZSB0aGUgXHJlZiBUZW5zb3JNYXAgaW4gdGhlIGV4cHJlc3Npb24KKy8vLyB0cmVlLgorLy8vIFBsYWNlSG9sZGVyIGNvbnRhaW5zIHRoZSBvcmRlciBvZiB0aGUgbGVhZiBub2RlIGluIHRoZSBleHByZXNzaW9uIHRyZWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBzaXplX3QgTj4KK3N0cnVjdCBQbGFjZUhvbGRlciB7CisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEkgPSBOOworICB0eXBlZGVmIFNjYWxhciBUeXBlOworfTsKKworLy8vIFxzdHRydWN0IFBsYWNlSG9sZGVyRXhwcmVzc2lvbgorLy8vIFxicmllZiBpdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgUGxhY2VIb2xkZXIgZXhwcmVzc2lvbi4gVGhlIFBsYWNlSG9sZGVyCisvLy8gZXhwcmVzc2lvbiBpcyBhIGNvcHkgb2YgZXhwcmVzc2lvbiB0eXBlIGluIHdoaWNoIHRoZSBUZW5zb3JNYXAgb2YgdGhlIGhhcworLy8vIGJlZW4gcmVwbGFjZWQgd2l0aCBQbGFjZUhvbGRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByLCBzaXplX3QgTj4KK3N0cnVjdCBQbGFjZUhvbGRlckV4cHJlc3Npb247CisKK3RlbXBsYXRlPHNpemVfdCBOLCB0eXBlbmFtZS4uLiBBcmdzPgorc3RydWN0IENhbGN1bGF0ZUluZGV4OworCit0ZW1wbGF0ZTxzaXplX3QgTiwgdHlwZW5hbWUgQXJnPgorc3RydWN0IENhbGN1bGF0ZUluZGV4PE4sIEFyZz57CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhY2VIb2xkZXJFeHByZXNzaW9uPEFyZywgTj46OlR5cGUgQXJnVHlwZTsKKyAgdHlwZWRlZiB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8QXJnVHlwZT4gQXJnc1R1cGxlOworfTsKKwordGVtcGxhdGU8c2l6ZV90IE4sIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitzdHJ1Y3QgQ2FsY3VsYXRlSW5kZXg8TiwgQXJnMSwgQXJnMj57CisgIHN0YXRpYyBjb25zdCBzaXplX3QgQXJnMkxlYWZDb3VudCA9IExlYWZDb3VudDxBcmcyPjo6Q291bnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhY2VIb2xkZXJFeHByZXNzaW9uPEFyZzEsIE4gLSBBcmcyTGVhZkNvdW50Pjo6VHlwZSBBcmcxVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQbGFjZUhvbGRlckV4cHJlc3Npb248QXJnMiwgTj46OlR5cGUgQXJnMlR5cGU7CisgIHR5cGVkZWYgdXRpbGl0eTo6dHVwbGU6OlR1cGxlPEFyZzFUeXBlLCBBcmcyVHlwZT4gQXJnc1R1cGxlOworfTsKKwordGVtcGxhdGU8c2l6ZV90IE4sIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+CitzdHJ1Y3QgQ2FsY3VsYXRlSW5kZXg8TiwgQXJnMSwgQXJnMiwgQXJnMz4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEFyZzNMZWFmQ291bnQgPSBMZWFmQ291bnQ8QXJnMz46OkNvdW50OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IEFyZzJMZWFmQ291bnQgPSBMZWFmQ291bnQ8QXJnMj46OkNvdW50OworICB0eXBlZGVmIHR5cGVuYW1lIFBsYWNlSG9sZGVyRXhwcmVzc2lvbjxBcmcxLCBOIC0gQXJnM0xlYWZDb3VudCAtIEFyZzJMZWFmQ291bnQ+OjpUeXBlIEFyZzFUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBsYWNlSG9sZGVyRXhwcmVzc2lvbjxBcmcyLCBOIC0gQXJnM0xlYWZDb3VudD46OlR5cGUgQXJnMlR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhY2VIb2xkZXJFeHByZXNzaW9uPEFyZzMsIE4+OjpUeXBlIEFyZzNUeXBlOworICB0eXBlZGVmIHV0aWxpdHk6OnR1cGxlOjpUdXBsZTxBcmcxVHlwZSwgQXJnMlR5cGUsIEFyZzNUeXBlPiBBcmdzVHVwbGU7Cit9OworCit0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgQ2F0ZWdvcnkgLCBjbGFzcyBPUCwgY2xhc3MgVFBMPgorc3RydWN0IENhdGVnb3J5SGVscGVyOworCit0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcy4uLj4gY2xhc3MgQ2F0ZWdvcnkgLCBjbGFzcyBPUCwgY2xhc3MgLi4uVCA+CitzdHJ1Y3QgQ2F0ZWdvcnlIZWxwZXI8Q2F0ZWdvcnksIE9QLCB1dGlsaXR5Ojp0dXBsZTo6VHVwbGU8VC4uLj4gPiB7CisgIHR5cGVkZWYgQ2F0ZWdvcnk8T1AsIFQuLi4gPiBUeXBlOworfTsKKwordGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIENhdGVnb3J5ICwgY2xhc3MgLi4uVCA+CitzdHJ1Y3QgQ2F0ZWdvcnlIZWxwZXI8Q2F0ZWdvcnksIE5vT1AsIHV0aWxpdHk6OnR1cGxlOjpUdXBsZTxULi4uPiA+IHsKKyAgdHlwZWRlZiBDYXRlZ29yeTxULi4uID4gVHlwZTsKK307CisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBQbGFjZUhvbGRlckV4cHJlc3Npb24gd2hlbiB0aGUgbm9kZSBpcworLy8vIFRlbnNvckN3aXNlTnVsbGFyeU9wLCBUZW5zb3JDd2lzZVVuYXJ5T3AsIFRlbnNvckJyb2FkY2FzdGluZ09wLCBUZW5zb3JDd2lzZUJpbmFyeU9wLCAgVGVuc29yQ3dpc2VUZXJuYXJ5T3AKKyNkZWZpbmUgT1BFWFBSQ0FURUdPUlkoQ1ZRdWFsKVwKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzLi4uID4gY2xhc3MgQ2F0ZWdvcnksIHR5cGVuYW1lIE9QLCB0eXBlbmFtZS4uLiBTdWJFeHByLCBzaXplX3QgTj5cCitzdHJ1Y3QgUGxhY2VIb2xkZXJFeHByZXNzaW9uPENWUXVhbCBDYXRlZ29yeTxPUCwgU3ViRXhwci4uLj4sIE4+e1wKKyAgdHlwZWRlZiBDVlF1YWwgdHlwZW5hbWUgQ2F0ZWdvcnlIZWxwZXI8Q2F0ZWdvcnksIE9QLCB0eXBlbmFtZSBDYWxjdWxhdGVJbmRleDxOLCBTdWJFeHByLi4uPjo6QXJnc1R1cGxlPjo6VHlwZSBUeXBlO1wKK307CisKK09QRVhQUkNBVEVHT1JZKGNvbnN0KQorT1BFWFBSQ0FURUdPUlkoKQorI3VuZGVmIE9QRVhQUkNBVEVHT1JZCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBQbGFjZUhvbGRlckV4cHJlc3Npb24gd2hlbiB0aGUgbm9kZSBpcworLy8vIFRlbnNvckN3aXNlU2VsZWN0T3AKKyNkZWZpbmUgU0VMRUNURVhQUihDVlF1YWwpXAordGVtcGxhdGUgPHR5cGVuYW1lIElmRXhwciwgdHlwZW5hbWUgVGhlbkV4cHIsIHR5cGVuYW1lIEVsc2VFeHByLCBzaXplX3QgTj5cCitzdHJ1Y3QgUGxhY2VIb2xkZXJFeHByZXNzaW9uPENWUXVhbCBUZW5zb3JTZWxlY3RPcDxJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj4sIE4+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIHR5cGVuYW1lIENhdGVnb3J5SGVscGVyPFRlbnNvclNlbGVjdE9wLCBOb09QLCB0eXBlbmFtZSBDYWxjdWxhdGVJbmRleDxOLCBJZkV4cHIsIFRoZW5FeHByLCBFbHNlRXhwcj46OkFyZ3NUdXBsZT46OlR5cGUgVHlwZTtcCit9OworCitTRUxFQ1RFWFBSKGNvbnN0KQorU0VMRUNURVhQUigpCisjdW5kZWYgU0VMRUNURVhQUgorCisvLy8gc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgUGxhY2VIb2xkZXJFeHByZXNzaW9uIHdoZW4gdGhlIG5vZGUgaXMKKy8vLyBUZW5zb3JBc3NpZ25PcAorI2RlZmluZSBBU1NJR05FWFBSKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTRXhwciwgdHlwZW5hbWUgUkhTRXhwciwgc2l6ZV90IE4+XAorc3RydWN0IFBsYWNlSG9sZGVyRXhwcmVzc2lvbjxDVlF1YWwgVGVuc29yQXNzaWduT3A8TEhTRXhwciwgUkhTRXhwcj4sIE4+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIHR5cGVuYW1lIENhdGVnb3J5SGVscGVyPFRlbnNvckFzc2lnbk9wLCBOb09QLCB0eXBlbmFtZSBDYWxjdWxhdGVJbmRleDxOLCBMSFNFeHByLCBSSFNFeHByPjo6QXJnc1R1cGxlPjo6VHlwZSBUeXBlO1wKK307CisKK0FTU0lHTkVYUFIoY29uc3QpCitBU1NJR05FWFBSKCkKKyN1bmRlZiBBU1NJR05FWFBSCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBQbGFjZUhvbGRlckV4cHJlc3Npb24gd2hlbiB0aGUgbm9kZSBpcworLy8vIFRlbnNvck1hcAorI2RlZmluZSBURU5TT1JNQVBFWFBSKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyXywgaW50IE9wdGlvbnNfLCBpbnQgT3B0aW9uczJfLCBpbnQgTnVtSW5kaWNlc18sIHR5cGVuYW1lIEluZGV4VHlwZV8sIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfLCBzaXplX3QgTj5cCitzdHJ1Y3QgUGxhY2VIb2xkZXJFeHByZXNzaW9uPCBDVlF1YWwgVGVuc29yTWFwPCBUZW5zb3I8U2NhbGFyXywgTnVtSW5kaWNlc18sIE9wdGlvbnNfLCBJbmRleFR5cGVfPiwgT3B0aW9uczJfLCBNYWtlUG9pbnRlcl8+LCBOPiB7XAorICB0eXBlZGVmIENWUXVhbCBQbGFjZUhvbGRlcjxDVlF1YWwgVGVuc29yTWFwPFRlbnNvcjxTY2FsYXJfLCBOdW1JbmRpY2VzXywgT3B0aW9uc18sIEluZGV4VHlwZV8+LCBPcHRpb25zMl8sIE1ha2VQb2ludGVyXz4sIE4+IFR5cGU7XAorfTsKKworVEVOU09STUFQRVhQUihjb25zdCkKK1RFTlNPUk1BUEVYUFIoKQorI3VuZGVmIFRFTlNPUk1BUEVYUFIKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIFBsYWNlSG9sZGVyRXhwcmVzc2lvbiB3aGVuIHRoZSBub2RlIGlzCisvLy8gVGVuc29yRm9yY2VkRXZhbE9wCisjZGVmaW5lIEZPUkNFREVWQUwoQ1ZRdWFsKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHByLCBzaXplX3QgTj5cCitzdHJ1Y3QgUGxhY2VIb2xkZXJFeHByZXNzaW9uPENWUXVhbCBUZW5zb3JGb3JjZWRFdmFsT3A8RXhwcj4sIE4+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIFBsYWNlSG9sZGVyPENWUXVhbCBUZW5zb3JGb3JjZWRFdmFsT3A8RXhwcj4sIE4+IFR5cGU7XAorfTsKKworRk9SQ0VERVZBTChjb25zdCkKK0ZPUkNFREVWQUwoKQorI3VuZGVmIEZPUkNFREVWQUwKKworLy8vIHNwZWNpYWxpc2F0aW9uIG9mIHRoZSBccmVmIFBsYWNlSG9sZGVyRXhwcmVzc2lvbiB3aGVuIHRoZSBub2RlIGlzCisvLy8gVGVuc29yRXZhbFRvT3AKKyNkZWZpbmUgRVZBTFRPKENWUXVhbClcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwciwgc2l6ZV90IE4+XAorc3RydWN0IFBsYWNlSG9sZGVyRXhwcmVzc2lvbjxDVlF1YWwgVGVuc29yRXZhbFRvT3A8RXhwcj4sIE4+IHtcCisgIHR5cGVkZWYgQ1ZRdWFsIFRlbnNvckV2YWxUb09wPHR5cGVuYW1lIENhbGN1bGF0ZUluZGV4IDxOLCBFeHByPjo6QXJnVHlwZT4gVHlwZTtcCit9OworCitFVkFMVE8oY29uc3QpCitFVkFMVE8oKQorI3VuZGVmIEVWQUxUTworCisKKy8vLyBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBQbGFjZUhvbGRlckV4cHJlc3Npb24gd2hlbiB0aGUgbm9kZSBpcworLy8vIFRlbnNvclJlZHVjdGlvbk9wCisjZGVmaW5lIFNZQ0xSRURVQ1RJT04oQ1ZRdWFsKVwKK3RlbXBsYXRlIDx0eXBlbmFtZSBPUCwgdHlwZW5hbWUgRGltcywgdHlwZW5hbWUgRXhwciwgc2l6ZV90IE4+XAorc3RydWN0IFBsYWNlSG9sZGVyRXhwcmVzc2lvbjxDVlF1YWwgVGVuc29yUmVkdWN0aW9uT3A8T1AsIERpbXMsIEV4cHI+LCBOPntcCisgIHR5cGVkZWYgQ1ZRdWFsIFBsYWNlSG9sZGVyPENWUXVhbCBUZW5zb3JSZWR1Y3Rpb25PcDxPUCwgRGltcyxFeHByPiwgTj4gVHlwZTtcCit9OworU1lDTFJFRFVDVElPTihjb25zdCkKK1NZQ0xSRURVQ1RJT04oKQorI3VuZGVmIFNZQ0xSRURVQ1RJT04KKworLy8vIHRlbXBsYXRlIGRlZHVjdGlvbiBmb3IgXHJlZiBQbGFjZUhvbGRlckV4cHJlc3Npb24gc3RydWN0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwcj4KK3N0cnVjdCBjcmVhdGVQbGFjZUhvbGRlckV4cHJlc3Npb24geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IFRvdGFsTGVhdmVzID0gTGVhZkNvdW50PEV4cHI+OjpDb3VudDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQbGFjZUhvbGRlckV4cHJlc3Npb248RXhwciwgVG90YWxMZWF2ZXMgLSAxPjo6VHlwZSBUeXBlOworfTsKKworfSAgLy8gaW50ZXJuYWwKK30gIC8vIFRlbnNvclN5Y2wKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9QTEFDRUhPTERFUl9FWFBSX0hQUApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsUnVuLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xSdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0YjZmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JTeWNsUnVuLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDdW1taW5zIENocmlzIFBoRCBzdHVkZW50IGF0IFRoZSBVbml2ZXJzaXR5IG9mIEVkaW5idXJnaC4KKy8vIENvbnRhY3Q6IDxlaWdlbkBjb2RlcGxheS5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlbnNvclN5Y2xSdW4uaAorICoKKyAqIFxicmllZjoKKyAqIFNjaGVkdWxlX2tlcm5lbCBpbnZva2UgYW4gc3BlY2lhbGlzZWQgdmVyc2lvbiBvZiBrZXJuZWwgc3RydWN0LiBUaGUKKyAqIHNwZWNpYWxpc2F0aW9uIGlzIGJhc2VkIG9uIHRoZSBkYXRhIGRpbWVuc2lvbiBpbiBzeWNsIGJ1ZmZlcgorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9TWUNMUlVOX0hQUAorI2RlZmluZSBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfU1lDTFJVTl9IUFAKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBUZW5zb3JTeWNsIHsKKy8vLyBUaGUgcnVuIGZ1bmN0aW9uIGluIHRlbnNvciBzeWNsIGNvbnZlcnQgdGhlIGV4cHJlc3Npb24gdHJlZSB0byBhIGJ1ZmZlcgorLy8vIGJhc2VkIGV4cHJlc3Npb24gdHJlZTsKKy8vLyBjcmVhdGVzIHRoZSBleHByZXNzaW9uIHRyZWUgZm9yIHRoZSBkZXZpY2Ugd2l0aCBhY2Nlc3NvciB0byBidWZmZXJzOworLy8vIGNvbnN0cnVjdCB0aGUga2VybmVsIGFuZCBzdWJtaXQgaXQgdG8gdGhlIHN5Y2wgcXVldWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhwciwgdHlwZW5hbWUgRGV2Pgordm9pZCBydW4oRXhwciAmZXhwciwgRGV2ICZkZXYpIHsKKyAgRWlnZW46OlRlbnNvckV2YWx1YXRvcjxFeHByLCBEZXY+IGV2YWx1YXRvcihleHByLCBkZXYpOworICBjb25zdCBib29sIG5lZWRzX2Fzc2lnbiA9IGV2YWx1YXRvci5ldmFsU3ViRXhwcnNJZk5lZWRlZChOVUxMKTsKKyAgaWYgKG5lZWRzX2Fzc2lnbikgeworICAgIHR5cGVkZWYgIHR5cGVuYW1lIGludGVybmFsOjpjcmVhdGVQbGFjZUhvbGRlckV4cHJlc3Npb248RXhwcj46OlR5cGUgUGxhY2VIb2xkZXJFeHByOworICAgIGF1dG8gZnVuY3RvcnMgPSBpbnRlcm5hbDo6ZXh0cmFjdEZ1bmN0b3JzKGV2YWx1YXRvcik7CisKKyAgICBzaXplX3QgdGlsZVNpemUgPWRldi5tX3F1ZXVlLmdldF9kZXZpY2UoKS4gdGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bWF4X3dvcmtfZ3JvdXBfc2l6ZT4oKS8yOworICAgIGRldi5tX3F1ZXVlLnN1Ym1pdChbJl0oY2w6OnN5Y2w6OmhhbmRsZXIgJmNnaCkgeworCisgICAgICAvLyBjcmVhdGUgYSB0dXBsZSBvZiBhY2Nlc3NvcnMgZnJvbSBFdmFsdWF0b3IKKyAgICAgIGF1dG8gdHVwbGVfb2ZfYWNjZXNzb3JzID0gaW50ZXJuYWw6OmNyZWF0ZVR1cGxlT2ZBY2Nlc3NvcnM8ZGVjbHR5cGUoZXZhbHVhdG9yKT4oY2doLCBldmFsdWF0b3IpOworICAgICAgY29uc3QgYXV0byByYW5nZSA9IHV0aWxpdHk6OnR1cGxlOjpnZXQ8MD4odHVwbGVfb2ZfYWNjZXNzb3JzKS5nZXRfcmFuZ2UoKVswXTsKKyAgICAgIHNpemVfdCBHUmFuZ2U9cmFuZ2U7CisgICAgICBpZiAodGlsZVNpemU+R1JhbmdlKSB0aWxlU2l6ZT1HUmFuZ2U7CisgICAgICBlbHNlIGlmKEdSYW5nZT50aWxlU2l6ZSl7CisgICAgICAgIHNpemVfdCB4TW9kZSA9IEdSYW5nZSAlIHRpbGVTaXplOworICAgICAgICBpZiAoeE1vZGUgIT0gMCkgR1JhbmdlICs9ICh0aWxlU2l6ZSAtIHhNb2RlKTsKKyAgICAgIH0KKyAgICAgIC8vIHJ1biB0aGUga2VybmVsCisgICAgICBjZ2gucGFyYWxsZWxfZm9yPFBsYWNlSG9sZGVyRXhwcj4oIGNsOjpzeWNsOjpuZF9yYW5nZTwxPihjbDo6c3ljbDo6cmFuZ2U8MT4oR1JhbmdlKSwgY2w6OnN5Y2w6OnJhbmdlPDE+KHRpbGVTaXplKSksIFs9XShjbDo6c3ljbDo6bmRfaXRlbTwxPiBpdGVtSUQpIHsKKyAgICAgICAgdHlwZWRlZiAgdHlwZW5hbWUgaW50ZXJuYWw6OkNvbnZlcnRUb0RldmljZUV4cHJlc3Npb248RXhwcj46OlR5cGUgRGV2RXhwcjsKKyAgICAgICAgYXV0byBkZXZpY2VfZXhwciA9aW50ZXJuYWw6OmNyZWF0ZURldmljZUV4cHJlc3Npb248RGV2RXhwciwgUGxhY2VIb2xkZXJFeHByPihmdW5jdG9ycywgdHVwbGVfb2ZfYWNjZXNzb3JzKTsKKyAgICAgICAgYXV0byBkZXZpY2VfZXZhbHVhdG9yID0gRWlnZW46OlRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShkZXZpY2VfZXhwci5leHByKSwgRWlnZW46OkRlZmF1bHREZXZpY2U+KGRldmljZV9leHByLmV4cHIsIEVpZ2VuOjpEZWZhdWx0RGV2aWNlKCkpOworICAgICAgICBpZiAoaXRlbUlELmdldF9nbG9iYWxfbGluZWFyX2lkKCkgPCByYW5nZSkgeworICAgICAgICAgIGRldmljZV9ldmFsdWF0b3IuZXZhbFNjYWxhcihzdGF0aWNfY2FzdDxpbnQ+KGl0ZW1JRC5nZXRfZ2xvYmFsX2xpbmVhcl9pZCgpKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0pOworICAgIGRldi5tX3F1ZXVlLnRocm93X2FzeW5jaHJvbm91cygpOworICB9CisKKyAgZXZhbHVhdG9yLmNsZWFudXAoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBUZW5zb3JTeWNsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfU1lDTFJVTl9IUFAKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yU3ljbFR1cGxlLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xUdXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2IwMjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclN5Y2xUdXBsZS5oCkBAIC0wLDAgKzEsMjM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIE1laGRpIEdvbGkgICAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gUmFscGggUG90dGVyICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBMdWtlIEl3YW5za2kgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIENvbnRhY3Q6IDxlaWdlbkBjb2RlcGxheS5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlbnNyb1N5Y2xUdXBsZS5oCisgKgorICogXGJyaWVmOgorICogIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjp0dXBsZSB0aGF0IGNhbiBiZSB1c2VkIGluc2lkZSBhIFNZQ0wga2VybmVsLgorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOU1VQUE9SVEVEX0VJR0VOX0NYWDExX1NSQ19URU5TT1JfVEVOU09SU1lDTF9UVVBMRV9IUFAKKyNkZWZpbmUgVU5TVVBQT1JURURfRUlHRU5fQ1hYMTFfU1JDX1RFTlNPUl9URU5TT1JTWUNMX1RVUExFX0hQUAorbmFtZXNwYWNlIHV0aWxpdHkgeworbmFtZXNwYWNlIHR1cGxlIHsKKy8vLyBcc3RydWN0IFN0YXRpY0lmCisvLy8gXGJyaWVmIFRoZSBTdGF0aWNJZiBzdHJ1Y3QgaXMgdXNlZCB0byBzdGF0aWNhbGx5IGNob29zZSB0aGUgdHlwZSBiYXNlZCBvbiB0aGUKKy8vLyBjb25kaXRpb24uCit0ZW1wbGF0ZSA8Ym9vbCwgdHlwZW5hbWUgVCA9IHZvaWQ+IHN0cnVjdCBTdGF0aWNJZjsKKy8vLyBcYnJpZWYgc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgU3RhdGljSWYgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFN0YXRpY0lmPHRydWUsIFQ+IHsKKyAgdHlwZWRlZiBUIHR5cGU7Cit9OworCisvLy8gXHN0cnVjdCBUdXBsZQorLy8vIFxicmllZiBpcyBhIGZpeGVkLXNpemUgY29sbGVjdGlvbiBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcworLy8vIFx6dHBhcmFtIFRzLi4uCS0JdGhlIHR5cGVzIG9mIHRoZSBlbGVtZW50cyB0aGF0IHRoZSB0dXBsZSBzdG9yZXMuCisvLy8gRW1wdHkgbGlzdCBpcyBzdXBwb3J0ZWQuCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+CitzdHJ1Y3QgVHVwbGUge307CisKKy8vLyBcYnJpZWYgc3BlY2lhbGlzYXRpb24gb2YgdGhlIFxyZWYgVHVwbGUgY2xhc3Mgd2hlbiB0aGUgdHVwbGUgaGFzIGF0IGxlYXN0CisvLy8gb25lIGVsZW1lbnQuCisvLy8gXHRwYXJhbSBUIDogdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHR1cGxlLgorLy8vIFx0cGFyYW0gVHMuLi4gdGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0dXBsZS4gVHMuLi4gY2FuIGJlIGVtcHR5LgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIFRzPgorc3RydWN0IFR1cGxlPFQsIFRzLi4uPiB7CisgIFR1cGxlKFQgdCwgVHMuLi4gdHMpIDogaGVhZCh0KSwgdGFpbCh0cy4uLikge30KKyAgVCBoZWFkOworICBUdXBsZTxUcy4uLj4gdGFpbDsKK307CisKKy8vL1wgc3RydWN0IEVsZW1UeXBlSG9sZGVyCisvLy8gXGJyaWVmIEVsZW1UeXBlSG9sZGVyIGNsYXNzIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlCisvLy8gZWxlbWVudHMgaW5zaWRlIHRoZSB0dXBsZQorLy8vIFx0cGFyYW0gc2l6ZV90IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zaWRlIHRoZSB0dXBsZQorLy8vIFx0cGFyYW0gY2xhc3MgdGhlIHR1cGxlIGNsYXNzCit0ZW1wbGF0ZSA8c2l6ZV90LCBjbGFzcz4KK3N0cnVjdCBFbGVtVHlwZUhvbGRlcjsKKworLy8vIFxicmllZiBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFbGVtVHlwZUhvbGRlciBjbGFzcyB3aGVuIHRoZSBudW1iZXIgb2YKKy8vLyBlbGVtZW50cyBpbnNpZGUgdGhlIHR1cGxlIGlzIDEKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBUcz4KK3N0cnVjdCBFbGVtVHlwZUhvbGRlcjwwLCBUdXBsZTxULCBUcy4uLj4gPiB7CisgIHR5cGVkZWYgVCB0eXBlOworfTsKKworLy8vIFxicmllZiBzcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBFbGVtVHlwZUhvbGRlciBjbGFzcyB3aGVuIHRoZSBudW1iZXIgb2YKKy8vLyBlbGVtZW50cyBpbnNpZGUgdGhlIHR1cGxlIGlzIGJpZ2dlciB0aGFuIDEuIEl0IHJlY3Vyc2l2ZWx5IGNhbGxzIGl0c2VsZiB0bworLy8vIGRldGVjdCB0aGUgdHlwZSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHR1cGxlCisvLy8gXHRwYXJhbSBUIDogdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHR1cGxlLgorLy8vIFx0cGFyYW0gVHMuLi4gdGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0dXBsZS4gVHMuLi4gY2FuIGJlIGVtcHR5LgorLy8vIFx0cGFyYW0gSyBpcyB0aGUgS3RoIGVsZW1lbnQgaW4gdGhlIHR1cGxlCit0ZW1wbGF0ZSA8c2l6ZV90IGssIGNsYXNzIFQsIGNsYXNzLi4uIFRzPgorc3RydWN0IEVsZW1UeXBlSG9sZGVyPGssIFR1cGxlPFQsIFRzLi4uPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFbGVtVHlwZUhvbGRlcjxrIC0gMSwgVHVwbGU8VHMuLi4+ID46OnR5cGUgdHlwZTsKK307CisKKy8vLyBnZXQKKy8vLyBcYnJpZWYgRXh0cmFjdHMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgdHVwbGUuCisvLy8gSz0wIHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHR1cGxlLiBUaGUgdHVwbGUgY2Fubm90IGJlIGVtcHR5LgorLy8vIFx0cGFyYW0gVHMuLi4gYXJlIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdHVwbGUuCisvLy8gXHBhcmFtIHQgaXMgdGhlIHR1cGxlIHdob3NlIGNvbnRlbnRzIHRvIGV4dHJhY3QKKy8vLyBccmV0dXJuICB0eXBlbmFtZSBFbGVtVHlwZUhvbGRlcjwwLCBUdXBsZTxUcy4uLj4gPjo6dHlwZSAmPjo6dHlwZQorCisjZGVmaW5lIFRFUk1JTkFURV9DT05EU19UVVBMRV9HRVQoQ1ZRdWFsKSBcCit0ZW1wbGF0ZSA8c2l6ZV90IGssIGNsYXNzLi4uIFRzPiBcCit0eXBlbmFtZSBTdGF0aWNJZjxrID09IDAsIENWUXVhbCB0eXBlbmFtZSBFbGVtVHlwZUhvbGRlcjwwLCBUdXBsZTxUcy4uLj4gPjo6dHlwZSAmPjo6dHlwZSBcCitnZXQoQ1ZRdWFsIFR1cGxlPFRzLi4uPiAmdCkgeyBcCisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKFRzKSE9MCwgIlRoZSByZXF1c2V0ZWQgdmFsdWUgaXMgYmlnZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIHR1cGxlIik7IFwKKyAgcmV0dXJuIHQuaGVhZDsgXAorfQorCitURVJNSU5BVEVfQ09ORFNfVFVQTEVfR0VUKGNvbnN0KQorVEVSTUlOQVRFX0NPTkRTX1RVUExFX0dFVCgpCisjdW5kZWYgVEVSTUlOQVRFX0NPTkRTX1RVUExFX0dFVAorLy8vIGdldAorLy8vIFxicmllZiBFeHRyYWN0cyB0aGUgS3RoIGVsZW1lbnQgZnJvbSB0aGUgdHVwbGUuCisvLy9cdHBhcmFtIEsgaXMgYW4gaW50ZWdlciB2YWx1ZSBpbiBbMCxzaXplb2YuLi4oVHlwZXMpKS4KKy8vLyBcdHBhcmFtIFQgaXMgdGhlIChzaXplb2YuLi4oVHlwZXMpIC0oSysxKSkgZWxlbWVudCBpbiB0aGUgdHVwbGUKKy8vLyBcdHBhcmFtIFRzLi4uIGFyZSB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgIGluIHRoZSB0dXBsZS4KKy8vLyBccGFyYW0gdCBpcyB0aGUgdHVwbGUgd2hvc2UgY29udGVudHMgdG8gZXh0cmFjdAorLy8vIFxyZXR1cm4gIHR5cGVuYW1lIEVsZW1UeXBlSG9sZGVyPEssIFR1cGxlPFRzLi4uPiA+Ojp0eXBlICY+Ojp0eXBlCisjZGVmaW5lIFJFQ1VSU0lWRV9UVVBMRV9HRVQoQ1ZRdWFsKSBcCit0ZW1wbGF0ZSA8c2l6ZV90IGssIGNsYXNzIFQsIGNsYXNzLi4uIFRzPiBcCit0eXBlbmFtZSBTdGF0aWNJZjxrICE9IDAsIENWUXVhbCB0eXBlbmFtZSBFbGVtVHlwZUhvbGRlcjxrLCBUdXBsZTxULCBUcy4uLj4gPjo6dHlwZSAmPjo6dHlwZSBcCitnZXQoQ1ZRdWFsIFR1cGxlPFQsIFRzLi4uPiAmdCkgeyBcCisgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6Z2V0PGsgLSAxPih0LnRhaWwpOyBcCit9CitSRUNVUlNJVkVfVFVQTEVfR0VUKGNvbnN0KQorUkVDVVJTSVZFX1RVUExFX0dFVCgpCisjdW5kZWYgUkVDVVJTSVZFX1RVUExFX0dFVAorCisvLy8gbWFrZV90dXBsZQorLy8vIFxicmllZiBDcmVhdGVzIGEgdHVwbGUgb2JqZWN0LCBkZWR1Y2luZyB0aGUgdGFyZ2V0IHR5cGUgZnJvbSB0aGUgdHlwZXMgb2YKKy8vLyBhcmd1bWVudHMuCisvLy8gXHRwYXJhbSBBcmdzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudHMgdG8gY29uc3RydWN0IHRoZSB0dXBsZSBmcm9tCisvLy8gXHBhcmFtIGFyZ3MgemVybyBvciBtb3JlIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3QgdGhlIHR1cGxlIGZyb20KKy8vLyBccmV0dXJuIFR1cGxlPEFyZ3MuLi4+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KK1R1cGxlPEFyZ3MuLi4+IG1ha2VfdHVwbGUoQXJncy4uLiBhcmdzKSB7CisgIHJldHVybiBUdXBsZTxBcmdzLi4uPihhcmdzLi4uKTsKK30KKworLy8vIHNpemUKKy8vLyBcYnJpZWYgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB0dXBsZSBhcyBhCisvLy8gY29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb24uCisvLy8gXHRwYXJhbSBBcmdzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudHMgdG8gY29uc3RydWN0IHRoZSB0dXBsZSBmcm9tCisvLy8gXHJldHVybiBzaXplX3QKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgorc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZShUdXBsZTxBcmdzLi4uPiAmKSB7CisgIHJldHVybiBzaXplb2YuLi4oQXJncyk7Cit9CisKKy8vLyBcc3RydWN0IEluZGV4TGlzdAorLy8vIFxicmllZiBDcmVhdGVzIGEgbGlzdCBvZiBpbmRleCBmcm9tIHRoZSBlbGVtZW50cyBpbiB0aGUgdHVwbGUKKy8vLyBcdHBhcmFtIElzLi4uIGEgbGlzdCBvZiBpbmRleCBmcm9tIFswIHRvIHNpemVvZi4uLih0dXBsZSBlbGVtZW50cykpCit0ZW1wbGF0ZSA8c2l6ZV90Li4uIElzPgorc3RydWN0IEluZGV4TGlzdCB7fTsKKworLy8vIFxzdHJ1Y3QgUmFuZ2VCdWlsZGVyCisvLy8gXGJyaWVmIENvbGxlY3RzIGludGVybmFsIGRldGFpbHMgZm9yIGdlbmVyYXRpbmcgaW5kZXggcmFuZ2VzIFtNSU4sIE1BWCkKKy8vLyBEZWNsYXJlIHByaW1hcnkgdGVtcGxhdGUgZm9yIGluZGV4IHJhbmdlIGJ1aWxkZXIKKy8vLyBcdHBhcmFtIE1JTiBpcyB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHR1cGxlCisvLy8gXHRwYXJhbSBOIHJlcHJlc2VudHMgc2l6ZW9mLi4oZWxlbWVucyktIHNpemVvZi4uLihJcykKKy8vLyBcdHBhcmFtIElzLi4uIGFyZSB0aGUgbGlzdCBvZiBnZW5lcmF0ZWQgaW5kZXggc28gZmFyCit0ZW1wbGF0ZSA8c2l6ZV90IE1JTiwgc2l6ZV90IE4sIHNpemVfdC4uLiBJcz4KK3N0cnVjdCBSYW5nZUJ1aWxkZXI7CisKKy8vLyBcYnJpZWYgYmFzZSBTdGVwOiBTcGVjaWFsaXNhdGlvbiBvZiB0aGUgXHJlZiBSYW5nZUJ1aWxkZXIgd2hlbiB0aGUKKy8vLyBNSU49PU1BWC4gSW4gdGhpcyBjYXNlIHRoZSBJcy4uLiBpcyBbMCB0byBzaXplb2YuLi4odHVwbGUgZWxlbWVudHMpKQorLy8vIFx0cGFyYW0gTUlOIGlzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgdHVwbGUKKy8vLyBcdHBhcmFtIElzIGlzIFswIHRvIHNpemVvZi4uLih0dXBsZSBlbGVtZW50cykpCit0ZW1wbGF0ZSA8c2l6ZV90IE1JTiwgc2l6ZV90Li4uIElzPgorc3RydWN0IFJhbmdlQnVpbGRlcjxNSU4sIE1JTiwgSXMuLi4+IHsKKyAgdHlwZWRlZiBJbmRleExpc3Q8SXMuLi4+IHR5cGU7Cit9OworCisvLy8gSW5kdWN0aW9uIHN0ZXA6IFNwZWNpYWxpc2F0aW9uIG9mIHRoZSBSYW5nZUJ1aWxkZXIgY2xhc3Mgd2hlbiBOIT1NSU4KKy8vLyBpbiB0aGlzIGNhc2Ugd2UgYXJlIHJlY3Vyc2l2ZWx5IHN1YnRyYWN0aW5nIE4gYnkgb25lIGFuZCBhZGRpbmcgb25lCisvLy8gaW5kZXggdG8gSXMuLi4gbGlzdCB1bnRpbCBNSU49PU4KKy8vLyBcdHBhcmFtIE1JTiBpcyB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHR1cGxlCisvLy8gXHRwYXJhbSBOIHJlcHJlc2VudHMgc2l6ZW9mLi4oZWxlbWVucyktIHNpemVvZi4uLihJcykKKy8vLyBcdHBhcmFtIElzLi4uIGFyZSB0aGUgbGlzdCBvZiBnZW5lcmF0ZWQgaW5kZXggc28gZmFyCit0ZW1wbGF0ZSA8c2l6ZV90IE1JTiwgc2l6ZV90IE4sIHNpemVfdC4uLiBJcz4KK3N0cnVjdCBSYW5nZUJ1aWxkZXIgOiBwdWJsaWMgUmFuZ2VCdWlsZGVyPE1JTiwgTiAtIDEsIE4gLSAxLCBJcy4uLj4ge307CisKKy8vLyBcYnJpZWYgSW5kZXhSYW5nZSB0aGF0IHJldHVybnMgYSBbTUlOLCBNQVgpIGluZGV4IHJhbmdlCisvLy8gXHRwYXJhbSBNSU4gaXMgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0dXBsZQorLy8vIFx0cGFyYW0gTUFYIGlzIHRoZSBzaXplIG9mIHRoZSB0dXBsZQordGVtcGxhdGUgPHNpemVfdCBNSU4sIHNpemVfdCBNQVg+CitzdHJ1Y3QgSW5kZXhSYW5nZTogUmFuZ2VCdWlsZGVyPE1JTiwgTUFYPjo6dHlwZSB7fTsKKworLy8vIGFwcGVuZF9iYXNlCisvLy8gXGJyaWVmIHVucGFja2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGlucHV0IHR1cGxlIHQgYW5kIGNyZWF0aW5nIGEgbmV3IHR1cGxlCisvLy8gYnkgYWRkaW5nIGVsZW1lbnQgYSBhdCB0aGUgZW5kIG9mIGl0LgorLy8vXHRwYXJhbSBBcmdzLi4uIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIHR1cGxlIHQKKy8vLyBcdHBhcmFtIFQgdGhlIHR5cGUgb2YgdGhlIG5ldyBlbGVtZW50IGdvaW5nIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdHVwbGUKKy8vLyBcdHBhcmFtIEkuLi4gaXMgdGhlIGxpc3Qgb2YgaW5kZXggZnJvbSBbMCB0byBzaXplb2YuLi4odCkpCisvLy8gXHBhcmFtIHQgdGhlIHR1cGxlIG9uIHdoaWNoIHdlIHdhbnQgdG8gYXBwZW5kIGEuCisvLy8gXHBhcmFtIGEgdGhlIG5ldyBlbGVtZW50cyBnb2luZyB0byBiZSBhZGRlZCB0byB0aGUgdHVwbGUKKy8vLyBccmV0dXJuIFR1cGxlPEFyZ3MuLi4sIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncywgdHlwZW5hbWUgVCwgc2l6ZV90Li4uIEk+CitUdXBsZTxBcmdzLi4uLCBUPiBhcHBlbmRfYmFzZShUdXBsZTxBcmdzLi4uPiB0LCBUIGEsSW5kZXhMaXN0PEkuLi4+KSB7CisgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6bWFrZV90dXBsZShnZXQ8ST4odCkuLi4sIGEpOworfQorCisvLy8gYXBwZW5kCisvLy8gXGJyaWVmIHRoZSBkZWR1Y3Rpb24gZnVuY3Rpb24gZm9yIFxyZWYgYXBwZW5kX2Jhc2UgdGhhdCBhdXRvbWF0aWNhbGx5CisvLy8gZ2VuZXJhdGUgdGhlIFxyZWYgSW5kZXhSYW5nZQorLy8vXHRwYXJhbSBBcmdzLi4uIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIHR1cGxlIHQKKy8vLyBcdHBhcmFtIFQgdGhlIHR5cGUgb2YgdGhlIG5ldyBlbGVtZW50IGdvaW5nIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdHVwbGUKKy8vLyBccGFyYW0gdCB0aGUgdHVwbGUgb24gd2hpY2ggd2Ugd2FudCB0byBhcHBlbmQgYS4KKy8vLyBccGFyYW0gYSB0aGUgbmV3IGVsZW1lbnRzIGdvaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSB0dXBsZQorLy8vIFxyZXR1cm4gVHVwbGU8QXJncy4uLiwgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzLCB0eXBlbmFtZSBUPgorVHVwbGU8QXJncy4uLiwgVD4gYXBwZW5kKFR1cGxlPEFyZ3MuLi4+IHQsIFQgYSkgeworICByZXR1cm4gdXRpbGl0eTo6dHVwbGU6OmFwcGVuZF9iYXNlKHQsIGEsICBJbmRleFJhbmdlPDAsIHNpemVvZi4uLihBcmdzKT4oKSk7Cit9CisKKy8vLyBhcHBlbmRfYmFzZQorLy8vIFxicmllZiBUaGlzIGlzIGEgc3BlY2lhbGlzYXRpb24gb2YgXHJlZiBhcHBlbmRfYmFzZSB3aGVuIHdlIHdhbnQgdG8KKy8vLyBjb25jYXRlbmF0ZQorLy8vIHR1cGxlIHQyIGF0IHRoZSBlbmQgb2YgdGhlIHR1cGxlIHQxLiBIZXJlIHdlIHVucGFjayBib3RoIHR1cGxlcywgZ2VuZXJhdGUgdGhlCisvLy8gSW5kZXhSYW5nZSBmb3IgZWFjaCBvZiB0aGVtIGFuZCBjcmVhdGUgYW4gb3V0cHV0IHR1cGxlIFQgdGhhdCBjb250YWlucyBib3RoCisvLy8gZWxlbWVudHMgb2YgdDEgYW5kIHQyLgorLy8vXHRwYXJhbSBBcmdzMS4uLiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSB0dXBsZSB0MQorLy8vXHRwYXJhbSBBcmdzMi4uLiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSB0dXBsZSB0MgorLy8vIFx0cGFyYW0gSTEuLi4gaXMgdGhlIGxpc3Qgb2YgaW5kZXggZnJvbSBbMCB0byBzaXplb2YuLi4odDEpKQorLy8vIFx0cGFyYW0gSTIuLi4gaXMgdGhlIGxpc3Qgb2YgaW5kZXggZnJvbSBbMCB0byBzaXplb2YuLi4odDIpKQorLy8vIFxwYXJhbSB0MSBpcyB0aGUgdHVwbGUgb24gd2hpY2ggd2Ugd2FudCB0byBhcHBlbmQgdDIuCisvLy8gXHBhcmFtIHQyIGlzIHRoZSB0dXBsZSB0aGF0IGlzIGdvaW5nIHRvIGJlIGFkZGVkIG9uIHQxLgorLy8vIFxyZXR1cm4gVHVwbGU8QXJnczEuLi4sIEFyZ3MyLi4uPgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3MxLCB0eXBlbmFtZS4uLiBBcmdzMiwgc2l6ZV90Li4uIEkxLCBzaXplX3QuLi4gSTI+CitUdXBsZTxBcmdzMS4uLiwgQXJnczIuLi4+IGFwcGVuZF9iYXNlKFR1cGxlPEFyZ3MxLi4uPiB0MSwgVHVwbGU8QXJnczIuLi4+IHQyLCBJbmRleExpc3Q8STEuLi4+LCBJbmRleExpc3Q8STIuLi4+KSB7CisgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6bWFrZV90dXBsZShnZXQ8STE+KHQxKS4uLixnZXQ8STI+KHQyKS4uLik7Cit9CisKKy8vLyBhcHBlbmQKKy8vLyBcYnJpZWYgZGVkdWN0aW9uIGZ1bmN0aW9uIGZvciBccmVmIGFwcGVuZF9iYXNlIHdoZW4gd2UgYXJlIGFwcGVuZGluZyB0dXBsZQorLy8vIHQxIGJ5IHR1cGxlIHQyLiBJbiB0aGlzIGNhc2UgdGhlIFxyZWYgSW5kZXhSYW5nZSBmb3IgYm90aCB0dXBsZSBhcmUKKy8vLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4KKy8vL1x0cGFyYW0gQXJnczEuLi4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgdHVwbGUgdDEKKy8vL1x0cGFyYW0gQXJnczIuLi4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgdHVwbGUgdDIKKy8vLyBccGFyYW0gdDEgaXMgdGhlIHR1cGxlIG9uIHdoaWNoIHdlIHdhbnQgdG8gYXBwZW5kIHQyLgorLy8vIFxwYXJhbSB0MiBpcyB0aGUgdHVwbGUgdGhhdCBpcyBnb2luZyB0byBiZSBhZGRlZCBvbiB0MS4KKy8vLyBccmV0dXJuIFR1cGxlPEFyZ3MxLi4uLCBBcmdzMi4uLj4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzMSwgdHlwZW5hbWUuLi4gQXJnczI+CitUdXBsZTxBcmdzMS4uLiwgQXJnczIuLi4+IGFwcGVuZChUdXBsZTxBcmdzMS4uLj4gdDEsVHVwbGU8QXJnczIuLi4+IHQyKSB7CisgIHJldHVybiB1dGlsaXR5Ojp0dXBsZTo6YXBwZW5kX2Jhc2UodDEsIHQyLCBJbmRleFJhbmdlPDAsIHNpemVvZi4uLihBcmdzMSk+KCksIEluZGV4UmFuZ2U8MCwgc2l6ZW9mLi4uKEFyZ3MyKT4oKSk7Cit9Cit9ICAvLyB0dXBsZQorfSAgLy8gdXRpbGl0eQorI2VuZGlmICAvLyBVTlNVUFBPUlRFRF9FSUdFTl9DWFgxMV9TUkNfVEVOU09SX1RFTlNPUlNZQ0xfVFVQTEVfSFBQCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclRyYWl0cy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNmOGIwCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JUcmFpdHMuaApAQCAtMCwwICsxLDI3MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1RSQUlUU19ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfVFJBSVRTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4KK2NsYXNzIGNvbXB1dGVfdGVuc29yX2ZsYWdzCit7CisgIGVudW0geworICAgIGlzX2R5bmFtaWNfc2l6ZV9zdG9yYWdlID0gMSwKKworICAgIGlzX2FsaWduZWQgPQorICAgICgKKyAgICAgICAgKChPcHRpb25zJkRvbnRBbGlnbik9PTApICYmICgKKyNpZiBFSUdFTl9NQVhfU1RBVElDX0FMSUdOX0JZVEVTPjAKKyAgICAgICAgICAgICghaXNfZHluYW1pY19zaXplX3N0b3JhZ2UpCisjZWxzZQorICAgICAgICAgICAgMAorI2VuZGlmCisgICAgICAgICAgICB8CisjaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPjAKKyAgICAgICAgICAgIGlzX2R5bmFtaWNfc2l6ZV9zdG9yYWdlCisjZWxzZQorICAgICAgICAgICAgMAorI2VuZGlmCisgICAgICApCisgICAgICksCisgICAgcGFja2V0X2FjY2Vzc19iaXQgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBpc19hbGlnbmVkID8gUGFja2V0QWNjZXNzQml0IDogMAorICB9OworCisgIHB1YmxpYzoKKyAgICBlbnVtIHsgcmV0ID0gcGFja2V0X2FjY2Vzc19iaXQgfTsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXywgaW50IE51bUluZGljZXNfLCBpbnQgT3B0aW9uc18sIHR5cGVuYW1lIEluZGV4VHlwZV8+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvcjxTY2FsYXJfLCBOdW1JbmRpY2VzXywgT3B0aW9uc18sIEluZGV4VHlwZV8+ID4KK3sKKyAgdHlwZWRlZiBTY2FsYXJfIFNjYWxhcjsKKyAgdHlwZWRlZiBEZW5zZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBJbmRleFR5cGVfIEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBOdW1JbmRpY2VzXzsKKyAgc3RhdGljIGNvbnN0IGludCBMYXlvdXQgPSBPcHRpb25zXyAmIFJvd01ham9yID8gUm93TWFqb3IgOiBDb2xNYWpvcjsKKyAgZW51bSB7CisgICAgT3B0aW9ucyA9IE9wdGlvbnNfLAorICAgIEZsYWdzID0gY29tcHV0ZV90ZW5zb3JfZmxhZ3M8U2NhbGFyXywgT3B0aW9uc18+OjpyZXQgfCAoaXNfY29uc3Q8U2NhbGFyXz46OnZhbHVlID8gMCA6IEx2YWx1ZUJpdCkKKyAgfTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBNYWtlUG9pbnRlciB7CisgICAgdHlwZWRlZiBUKiBUeXBlOworICB9OworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCB0eXBlbmFtZSBEaW1lbnNpb25zLCBpbnQgT3B0aW9uc18sIHR5cGVuYW1lIEluZGV4VHlwZV8+CitzdHJ1Y3QgdHJhaXRzPFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zLCBPcHRpb25zXywgSW5kZXhUeXBlXz4gPgoreworICB0eXBlZGVmIFNjYWxhcl8gU2NhbGFyOworICB0eXBlZGVmIERlbnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIEluZGV4VHlwZV8gSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IGFycmF5X3NpemU8RGltZW5zaW9ucz46OnZhbHVlOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IE9wdGlvbnNfICYgUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yOworICBlbnVtIHsKKyAgICBPcHRpb25zID0gT3B0aW9uc18sCisgICAgRmxhZ3MgPSBjb21wdXRlX3RlbnNvcl9mbGFnczxTY2FsYXJfLCBPcHRpb25zXz46OnJldCB8IChpc19jb25zdDxTY2FsYXJfPjo6dmFsdWUgPyAwOiBMdmFsdWVCaXQpCisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgTWFrZVBvaW50ZXIgeworICAgIHR5cGVkZWYgVCogVHlwZTsKKyAgfTsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgT3B0aW9uc18sIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXJfPgorc3RydWN0IHRyYWl0czxUZW5zb3JNYXA8UGxhaW5PYmplY3RUeXBlLCBPcHRpb25zXywgTWFrZVBvaW50ZXJfPiA+CisgIDogcHVibGljIHRyYWl0czxQbGFpbk9iamVjdFR5cGU+Cit7CisgIHR5cGVkZWYgdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4gQmFzZVRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2VUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2VUcmFpdHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBCYXNlVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IEJhc2VUcmFpdHM6OkxheW91dDsKKyAgZW51bSB7CisgICAgT3B0aW9ucyA9IE9wdGlvbnNfLAorICAgIEZsYWdzID0gQmFzZVRyYWl0czo6RmxhZ3MKKyAgfTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBNYWtlUG9pbnRlciB7CisgICAgLy8gSW50ZXJtZWRpYXRlIHR5cGVkZWYgdG8gd29ya2Fyb3VuZCBNU1ZDIGlzc3VlLgorICAgIHR5cGVkZWYgTWFrZVBvaW50ZXJfPFQ+IE1ha2VQb2ludGVyVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1ha2VQb2ludGVyVDo6VHlwZSBUeXBlOworICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JSZWY8UGxhaW5PYmplY3RUeXBlPiA+CisgIDogcHVibGljIHRyYWl0czxQbGFpbk9iamVjdFR5cGU+Cit7CisgIHR5cGVkZWYgdHJhaXRzPFBsYWluT2JqZWN0VHlwZT4gQmFzZVRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2VUcmFpdHM6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2VUcmFpdHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgY29uc3QgaW50IE51bURpbWVuc2lvbnMgPSBCYXNlVHJhaXRzOjpOdW1EaW1lbnNpb25zOworICBzdGF0aWMgY29uc3QgaW50IExheW91dCA9IEJhc2VUcmFpdHM6OkxheW91dDsKKyAgZW51bSB7CisgICAgT3B0aW9ucyA9IEJhc2VUcmFpdHM6Ok9wdGlvbnMsCisgICAgRmxhZ3MgPSBCYXNlVHJhaXRzOjpGbGFncworICB9OworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleFR5cGVfPgorc3RydWN0IGV2YWw8VGVuc29yPF9TY2FsYXIsIE51bUluZGljZXNfLCBPcHRpb25zLCBJbmRleFR5cGVfPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvcjxfU2NhbGFyLCBOdW1JbmRpY2VzXywgT3B0aW9ucywgSW5kZXhUeXBlXz4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleFR5cGVfPgorc3RydWN0IGV2YWw8Y29uc3QgVGVuc29yPF9TY2FsYXIsIE51bUluZGljZXNfLCBPcHRpb25zLCBJbmRleFR5cGVfPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvcjxfU2NhbGFyLCBOdW1JbmRpY2VzXywgT3B0aW9ucywgSW5kZXhUeXBlXz4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCB0eXBlbmFtZSBEaW1lbnNpb25zLCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgSW5kZXhUeXBlXz4KK3N0cnVjdCBldmFsPFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zLCBPcHRpb25zLCBJbmRleFR5cGVfPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zLCBPcHRpb25zLCBJbmRleFR5cGVfPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcl8sIHR5cGVuYW1lIERpbWVuc2lvbnMsIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleFR5cGVfPgorc3RydWN0IGV2YWw8Y29uc3QgVGVuc29yRml4ZWRTaXplPFNjYWxhcl8sIERpbWVuc2lvbnMsIE9wdGlvbnMsIEluZGV4VHlwZV8+LCBFaWdlbjo6RGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yRml4ZWRTaXplPFNjYWxhcl8sIERpbWVuc2lvbnMsIE9wdGlvbnMsIEluZGV4VHlwZV8+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgT3B0aW9ucywgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBNYWtlUG9pbnRlcj4KK3N0cnVjdCBldmFsPFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnMsIE1ha2VQb2ludGVyPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnMsIE1ha2VQb2ludGVyPiYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnMsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXI+CitzdHJ1Y3QgZXZhbDxjb25zdCBUZW5zb3JNYXA8UGxhaW5PYmplY3RUeXBlLCBPcHRpb25zLCBNYWtlUG9pbnRlcj4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JNYXA8UGxhaW5PYmplY3RUeXBlLCBPcHRpb25zLCBNYWtlUG9pbnRlcj4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JSZWY8UGxhaW5PYmplY3RUeXBlPiwgRWlnZW46OkRlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJlZjxQbGFpbk9iamVjdFR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorc3RydWN0IGV2YWw8Y29uc3QgVGVuc29yUmVmPFBsYWluT2JqZWN0VHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JSZWY8UGxhaW5PYmplY3RUeXBlPiYgdHlwZTsKK307CisKKy8vIFRPRE8gbmVzdGVkPD4gZG9lcyBub3QgZXhpc3QgYW55bW9yZSBpbiBFaWdlbi9Db3JlLCBhbmQgaXQgdGh1cyBoYXMgdG8gYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiByZWZfc2VsZWN0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgbj0xLCB0eXBlbmFtZSBQbGFpbk9iamVjdCA9IHZvaWQ+IHN0cnVjdCBuZXN0ZWQKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZWZfc2VsZWN0b3I8VD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgTnVtSW5kaWNlc18sIGludCBPcHRpb25zXywgdHlwZW5hbWUgSW5kZXhUeXBlXz4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4gPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvcjxTY2FsYXJfLCBOdW1JbmRpY2VzXywgT3B0aW9uc18sIEluZGV4VHlwZV8+JiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIGludCBOdW1JbmRpY2VzXywgaW50IE9wdGlvbnNfLCB0eXBlbmFtZSBJbmRleFR5cGVfPgorc3RydWN0IG5lc3RlZDxjb25zdCBUZW5zb3I8U2NhbGFyXywgTnVtSW5kaWNlc18sIE9wdGlvbnNfLCBJbmRleFR5cGVfPiA+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yPFNjYWxhcl8sIE51bUluZGljZXNfLCBPcHRpb25zXywgSW5kZXhUeXBlXz4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyXywgdHlwZW5hbWUgRGltZW5zaW9ucywgaW50IE9wdGlvbnMsIHR5cGVuYW1lIEluZGV4VHlwZV8+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zLCBPcHRpb25zLCBJbmRleFR5cGVfPiA+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yRml4ZWRTaXplPFNjYWxhcl8sIERpbWVuc2lvbnMsIE9wdGlvbnMsIEluZGV4VHlwZV8+JiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIHR5cGVuYW1lIERpbWVuc2lvbnMsIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleFR5cGVfPgorc3RydWN0IG5lc3RlZDxjb25zdCBUZW5zb3JGaXhlZFNpemU8U2NhbGFyXywgRGltZW5zaW9ucywgT3B0aW9ucywgSW5kZXhUeXBlXz4gPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvckZpeGVkU2l6ZTxTY2FsYXJfLCBEaW1lbnNpb25zLCBPcHRpb25zLCBJbmRleFR5cGVfPiYgdHlwZTsKK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnMsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXI+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnMsIE1ha2VQb2ludGVyPiA+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yTWFwPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9ucywgTWFrZVBvaW50ZXI+JiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgaW50IE9wdGlvbnMsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgTWFrZVBvaW50ZXI+CitzdHJ1Y3QgbmVzdGVkPGNvbnN0IFRlbnNvck1hcDxQbGFpbk9iamVjdFR5cGUsIE9wdGlvbnMsIE1ha2VQb2ludGVyPiA+Cit7CisgIHR5cGVkZWYgY29uc3QgVGVuc29yTWFwPFBsYWluT2JqZWN0VHlwZSwgT3B0aW9ucywgTWFrZVBvaW50ZXI+JiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBuZXN0ZWQ8VGVuc29yUmVmPFBsYWluT2JqZWN0VHlwZT4gPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJlZjxQbGFpbk9iamVjdFR5cGU+JiB0eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBuZXN0ZWQ8Y29uc3QgVGVuc29yUmVmPFBsYWluT2JqZWN0VHlwZT4gPgoreworICB0eXBlZGVmIGNvbnN0IFRlbnNvclJlZjxQbGFpbk9iamVjdFR5cGU+JiB0eXBlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBDb252b2x1dGlvbmFsIGxheWVycyB0YWtlIGluIGFuIGlucHV0IHRlbnNvciBvZiBzaGFwZSAoRCwgUiwgQywgQiksIG9yIChELCBDLAorLy8gUiwgQiksIGFuZCBjb252b2x2ZSBpdCB3aXRoIGEgc2V0IG9mIGZpbHRlcnMsIHdoaWNoIGNhbiBhbHNvIGJlIHByZXNlbnRlZCBhcworLy8gYSB0ZW5zb3IgKEQsIEssIEssIE0pLCB3aGVyZSBNIGlzIHRoZSBudW1iZXIgb2YgZmlsdGVycywgSyBpcyB0aGUgZmlsdGVyCisvLyBzaXplLCBhbmQgZWFjaCAzLWRpbWVuc2lvbmFsIHRlbnNvciBvZiBzaXplIChELCBLLCBLKSBpcyBhIGZpbHRlci4gRm9yCisvLyBzaW1wbGljaXR5IHdlIGFzc3VtZSB0aGF0IHdlIGFsd2F5cyB1c2Ugc3F1YXJlIGZpbHRlcnMgKHdoaWNoIGlzIHVzdWFsbHkgdGhlCisvLyBjYXNlIGluIGltYWdlcyksIGhlbmNlIHRoZSB0d28gS3MgaW4gdGhlIHRlbnNvciBkaW1lbnNpb24uICBJdCBhbHNvIHRha2VzIGluCisvLyBhIGZldyBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6CisvLyBTdHJpZGUgKFMpOiBUaGUgY29udm9sdXRpb24gc3RyaWRlIGlzIHRoZSBvZmZzZXQgYmV0d2VlbiBsb2NhdGlvbnMgd2hlcmUgd2UKKy8vICAgICAgICAgICAgIGFwcGx5IHRoZSBmaWx0ZXJzLiAgQSBsYXJnZXIgc3RyaWRlIG1lYW5zIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlCisvLyAgICAgICAgICAgICBzcGF0aWFsbHkgc21hbGxlci4KKy8vIFBhZGRpbmcgKFApOiBUaGUgcGFkZGluZyB3ZSBhcHBseSB0byB0aGUgaW5wdXQgdGVuc29yIGFsb25nIHRoZSBSIGFuZCBDCisvLyAgICAgICAgICAgICAgZGltZW5zaW9ucy4gIFRoaXMgaXMgdXN1YWxseSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzcGF0aWFsCisvLyAgICAgICAgICAgICAgZGltZW5zaW9ucyBvZiB0aGUgb3V0cHV0IG1hdGNoZXMgb3VyIGludGVudGlvbi4KKy8vCisvLyBUd28gdHlwZXMgb2YgcGFkZGluZyBhcmUgb2Z0ZW4gdXNlZDoKKy8vICAgU0FNRTogVGhlIHBhZCB2YWx1ZSBpcyBjb21wdXRlZCBzbyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBoYXZlIHNpemUKKy8vICAgICAgICAgUi9TIGFuZCBDL1MuCisvLyAgIFZBTElEOiBubyBwYWRkaW5nIGlzIGNhcnJpZWQgb3V0LgorLy8gV2hlbiB3ZSBkbyBwYWRkaW5nLCB0aGUgcGFkZGVkIHZhbHVlcyBhdCB0aGUgcGFkZGVkIGxvY2F0aW9ucyBhcmUgdXN1YWxseQorLy8gemVyby4KKy8vCisvLyBUaGUgb3V0cHV0IGRpbWVuc2lvbnMgZm9yIGNvbnZvbHV0aW9uLCB3aGVuIGdpdmVuIGFsbCB0aGUgcGFyYW1ldGVycyBhYm92ZSwKKy8vIGFyZSBhcyBmb2xsb3dzOgorLy8gV2hlbiBQYWRkaW5nID0gU0FNRTogdGhlIG91dHB1dCBzaXplIGlzIChCLCBSJywgQycsIE0pLCB3aGVyZQorLy8gICBSJyA9IGNlaWwoZmxvYXQoUikgLyBmbG9hdChTKSkKKy8vICAgQycgPSBjZWlsKGZsb2F0KEMpIC8gZmxvYXQoUykpCisvLyB3aGVyZSBjZWlsIGlzIHRoZSBjZWlsaW5nIGZ1bmN0aW9uLiAgVGhlIGlucHV0IHRlbnNvciBpcyBwYWRkZWQgd2l0aCAwIGFzCisvLyBuZWVkZWQuICBUaGUgbnVtYmVyIG9mIHBhZGRlZCByb3dzIGFuZCBjb2x1bW5zIGFyZSBjb21wdXRlZCBhczoKKy8vICAgUHIgPSAoKFInIC0gMSkgKiBTICsgSyAtIFIpIC8gMgorLy8gICBQYyA9ICgoQycgLSAxKSAqIFMgKyBLIC0gQykgLyAyCisvLyB3aGVuIHRoZSBzdHJpZGUgaXMgMSwgd2UgaGF2ZSB0aGUgc2ltcGxpZmllZCBjYXNlIFInPVIsIEMnPUMsIFByPVBjPShLLTEpLzIuCisvLyBUaGlzIGlzIHdoZXJlIFNBTUUgY29tZXMgZnJvbSAtIHRoZSBvdXRwdXQgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGlucHV0IGhhcy4KKy8vIFdoZW4gUGFkZGluZyA9IFZBTElEOiB0aGUgb3V0cHV0IHNpemUgaXMgY29tcHV0ZWQgYXMKKy8vICAgUicgPSBjZWlsKGZsb2F0KFIgLSBLICsgMSkgLyBmbG9hdChTKSkKKy8vICAgQycgPSBjZWlsKGZsb2F0KEMgLSBLICsgMSkgLyBmbG9hdChTKSkKKy8vIGFuZCB0aGUgbnVtYmVyIG9mIHBhZGRlZCByb3dzIGFuZCBjb2x1bW5zIGFyZSBjb21wdXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4KKy8vIHRoZSBTQU1FIGNhc2UuCisvLyBXaGVuIHRoZSBzdHJpZGUgaXMgMSwgd2UgaGF2ZSB0aGUgc2ltcGxpZmllZCBjYXNlIFInPVItSysxLCBDJz1DLUsrMSwgUHI9MCwKKy8vIFBjPTAuCit0eXBlZGVmIGVudW0geworICBQQURESU5HX1ZBTElEID0gMSwKKyAgUEFERElOR19TQU1FID0gMgorfSBQYWRkaW5nVHlwZTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9UUkFJVFNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JVSW50MTI4LmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yL1RlbnNvclVJbnQxMjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIzZTdjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JVSW50MTI4LmgKQEAgLTAsMCArMSwyNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9VSU5UMTI4X0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9VSU5UMTI4X0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKwordGVtcGxhdGUgPHVpbnQ2NF90IG4+CitzdHJ1Y3Qgc3RhdGljX3ZhbCB7CisgIHN0YXRpYyBjb25zdCB1aW50NjRfdCB2YWx1ZSA9IG47CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgb3BlcmF0b3IgdWludDY0X3QoKSBjb25zdCB7IHJldHVybiBuOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBzdGF0aWNfdmFsKCkgeyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgc3RhdGljX3ZhbChjb25zdCBUJiB2KSB7CisgICAgZWlnZW5fYXNzZXJ0KHYgPT0gbik7CisgIH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIEhJR0ggPSB1aW50NjRfdCwgdHlwZW5hbWUgTE9XID0gdWludDY0X3Q+CitzdHJ1Y3QgVGVuc29yVUludDEyOAoreworICBISUdIIGhpZ2g7CisgIExPVyBsb3c7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT1RIRVJfSElHSCwgdHlwZW5hbWUgT1RIRVJfTE9XPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCisgIFRlbnNvclVJbnQxMjgoY29uc3QgVGVuc29yVUludDEyODxPVEhFUl9ISUdILCBPVEhFUl9MT1c+JiBvdGhlcikgOiBoaWdoKG90aGVyLmhpZ2gpLCBsb3cob3RoZXIubG93KSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChzaXplb2YoT1RIRVJfSElHSCkgPD0gc2l6ZW9mKEhJR0gpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKE9USEVSX0xPVykgPD0gc2l6ZW9mKExPVyksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPVEhFUl9ISUdILCB0eXBlbmFtZSBPVEhFUl9MT1c+CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKKyAgVGVuc29yVUludDEyOCYgb3BlcmF0b3IgPSAoY29uc3QgVGVuc29yVUludDEyODxPVEhFUl9ISUdILCBPVEhFUl9MT1c+JiBvdGhlcikgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKE9USEVSX0hJR0gpIDw9IHNpemVvZihISUdIKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKHNpemVvZihPVEhFUl9MT1cpIDw9IHNpemVvZihMT1cpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGhpZ2ggPSBvdGhlci5oaWdoOworICAgIGxvdyA9IG90aGVyLmxvdzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCisgIGV4cGxpY2l0IFRlbnNvclVJbnQxMjgoY29uc3QgVCYgeCkgOiBoaWdoKDApLCBsb3coeCkgeworICAgIGVpZ2VuX2Fzc2VydCgoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgY29uZGl0aW9uYWw8c2l6ZW9mKFQpID09IDgsIHVpbnQ2NF90LCB1aW50MzJfdD46OnR5cGU+KHgpIDw9IE51bVRyYWl0czx1aW50NjRfdD46OmhpZ2hlc3QoKSkpOworICAgIGVpZ2VuX2Fzc2VydCh4ID49IDApOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorICBUZW5zb3JVSW50MTI4KEhJR0ggeSwgTE9XIHgpIDogaGlnaCh5KSwgbG93KHgpIHsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUgb3BlcmF0b3IgTE9XKCkgY29uc3QgeworICAgIHJldHVybiBsb3c7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBMT1cgbG93ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGxvdzsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIEhJR0ggdXBwZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhpZ2g7CisgIH0KK307CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIEhMLCB0eXBlbmFtZSBMTCwgdHlwZW5hbWUgSFIsIHR5cGVuYW1lIExSPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgVGVuc29yVUludDEyODxITCwgTEw+JiBsaHMsIGNvbnN0IFRlbnNvclVJbnQxMjg8SFIsIExSPiYgcmhzKQoreworICByZXR1cm4gKGxocy5oaWdoID09IHJocy5oaWdoKSAmIChsaHMubG93ID09IHJocy5sb3cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSEwsIHR5cGVuYW1lIExMLCB0eXBlbmFtZSBIUiwgdHlwZW5hbWUgTFI+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCitib29sIG9wZXJhdG9yICE9IChjb25zdCBUZW5zb3JVSW50MTI4PEhMLCBMTD4mIGxocywgY29uc3QgVGVuc29yVUludDEyODxIUiwgTFI+JiByaHMpCit7CisgIHJldHVybiAobGhzLmhpZ2ggIT0gcmhzLmhpZ2gpIHwgKGxocy5sb3cgIT0gcmhzLmxvdyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBITCwgdHlwZW5hbWUgTEwsIHR5cGVuYW1lIEhSLCB0eXBlbmFtZSBMUj4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX0FMV0FZU19JTkxJTkUKK2Jvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IFRlbnNvclVJbnQxMjg8SEwsIExMPiYgbGhzLCBjb25zdCBUZW5zb3JVSW50MTI4PEhSLCBMUj4mIHJocykKK3sKKyAgaWYgKGxocy5oaWdoICE9IHJocy5oaWdoKSB7CisgICAgcmV0dXJuIGxocy5oaWdoID4gcmhzLmhpZ2g7CisgIH0KKyAgcmV0dXJuIGxocy5sb3cgPj0gcmhzLmxvdzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEhMLCB0eXBlbmFtZSBMTCwgdHlwZW5hbWUgSFIsIHR5cGVuYW1lIExSPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorYm9vbCBvcGVyYXRvciA8IChjb25zdCBUZW5zb3JVSW50MTI4PEhMLCBMTD4mIGxocywgY29uc3QgVGVuc29yVUludDEyODxIUiwgTFI+JiByaHMpCit7CisgIGlmIChsaHMuaGlnaCAhPSByaHMuaGlnaCkgeworICAgIHJldHVybiBsaHMuaGlnaCA8IHJocy5oaWdoOworICB9CisgIHJldHVybiBsaHMubG93IDwgcmhzLmxvdzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEhMLCB0eXBlbmFtZSBMTCwgdHlwZW5hbWUgSFIsIHR5cGVuYW1lIExSPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IG9wZXJhdG9yICsgKGNvbnN0IFRlbnNvclVJbnQxMjg8SEwsIExMPiYgbGhzLCBjb25zdCBUZW5zb3JVSW50MTI4PEhSLCBMUj4mIHJocykKK3sKKyAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHJlc3VsdChsaHMuaGlnaCArIHJocy5oaWdoLCBsaHMubG93ICsgcmhzLmxvdyk7CisgIGlmIChyZXN1bHQubG93IDwgcmhzLmxvdykgeworICAgIHJlc3VsdC5oaWdoICs9IDE7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEhMLCB0eXBlbmFtZSBMTCwgdHlwZW5hbWUgSFIsIHR5cGVuYW1lIExSPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IG9wZXJhdG9yIC0gKGNvbnN0IFRlbnNvclVJbnQxMjg8SEwsIExMPiYgbGhzLCBjb25zdCBUZW5zb3JVSW50MTI4PEhSLCBMUj4mIHJocykKK3sKKyAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHJlc3VsdChsaHMuaGlnaCAtIHJocy5oaWdoLCBsaHMubG93IC0gcmhzLmxvdyk7CisgIGlmIChyZXN1bHQubG93ID4gbGhzLmxvdykgeworICAgIHJlc3VsdC5oaWdoIC09IDE7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSEwsIHR5cGVuYW1lIExMLCB0eXBlbmFtZSBIUiwgdHlwZW5hbWUgTFI+CitzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IG9wZXJhdG9yICogKGNvbnN0IFRlbnNvclVJbnQxMjg8SEwsIExMPiYgbGhzLCBjb25zdCBUZW5zb3JVSW50MTI4PEhSLCBMUj4mIHJocykKK3sKKyAgLy8gU3BsaXQgZWFjaCAxMjgtYml0IGludGVnZXIgaW50byA0IDMyLWJpdCBpbnRlZ2VycywgYW5kIHRoZW4gZG8gdGhlCisgIC8vIG11bHRpcGxpY2F0aW9ucyBieSBoYW5kIGFzIGZvbGxvdzoKKyAgLy8gICBsaHMgICAgICBhICBiICBjICBkCisgIC8vICAgcmhzICAgICAgZSAgZiAgZyAgaAorICAvLyAgICAgICAgICAgLS0tLS0tLS0tLS0KKyAgLy8gICAgICAgICAgIGFoIGJoIGNoIGRoCisgIC8vICAgICAgICAgICBiZyBjZyBkZworICAvLyAgICAgICAgICAgY2YgZGYKKyAgLy8gICAgICAgICAgIGRlCisgIC8vIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDIgNjRiaXQgaW50ZWdlcnMsIGhpZ2ggYW5kIGxvdy4KKworICBjb25zdCB1aW50NjRfdCBMT1cgPSAweDAwMDAwMDAwRkZGRkZGRkZMTDsKKyAgY29uc3QgdWludDY0X3QgSElHSCA9IDB4RkZGRkZGRkYwMDAwMDAwMExMOworCisgIHVpbnQ2NF90IGQgPSBsaHMubG93ICYgTE9XOworICB1aW50NjRfdCBjID0gKGxocy5sb3cgJiBISUdIKSA+PiAzMkxMOworICB1aW50NjRfdCBiID0gbGhzLmhpZ2ggJiBMT1c7CisgIHVpbnQ2NF90IGEgPSAobGhzLmhpZ2ggJiBISUdIKSA+PiAzMkxMOworCisgIHVpbnQ2NF90IGggPSByaHMubG93ICYgTE9XOworICB1aW50NjRfdCBnID0gKHJocy5sb3cgJiBISUdIKSA+PiAzMkxMOworICB1aW50NjRfdCBmID0gcmhzLmhpZ2ggJiBMT1c7CisgIHVpbnQ2NF90IGUgPSAocmhzLmhpZ2ggJiBISUdIKSA+PiAzMkxMOworCisgIC8vIENvbXB1dGUgdGhlIGxvdyAzMiBiaXRzIG9mIGxvdworICB1aW50NjRfdCBhY2MgPSBkICogaDsKKyAgdWludDY0X3QgbG93ID0gYWNjICYgTE9XOworICAvLyAgQ29tcHV0ZSB0aGUgaGlnaCAzMiBiaXRzIG9mIGxvdy4gQWRkIGEgY2FycnkgZXZlcnkgdGltZSB3ZSB3cmFwIGFyb3VuZAorICBhY2MgPj49IDMyTEw7CisgIHVpbnQ2NF90IGNhcnJ5ID0gMDsKKyAgdWludDY0X3QgYWNjMiA9IGFjYyArIGMgKiBoOworICBpZiAoYWNjMiA8IGFjYykgeworICAgIGNhcnJ5Kys7CisgIH0KKyAgYWNjID0gYWNjMiArIGQgKiBnOworICBpZiAoYWNjIDwgYWNjMikgeworICAgIGNhcnJ5Kys7CisgIH0KKyAgbG93IHw9IChhY2MgPDwgMzJMTCk7CisKKyAgLy8gQ2FycnkgZm9yd2FyZCB0aGUgaGlnaCBiaXRzIG9mIGFjYyB0byBpbml0aWF0ZSB0aGUgY29tcHV0YXRpb24gb2YgdGhlCisgIC8vIGxvdyAzMiBiaXRzIG9mIGhpZ2gKKyAgYWNjMiA9IChhY2MgPj4gMzJMTCkgfCAoY2FycnkgPDwgMzJMTCk7CisgIGNhcnJ5ID0gMDsKKworICBhY2MgPSBhY2MyICsgYiAqIGg7CisgIGlmIChhY2MgPCBhY2MyKSB7CisgICAgY2FycnkrKzsKKyAgfQorICBhY2MyID0gYWNjICsgYyAqIGc7CisgIGlmIChhY2MyIDwgYWNjKSB7CisgICAgY2FycnkrKzsKKyAgfQorICBhY2MgPSBhY2MyICsgZCAqIGY7CisgIGlmIChhY2MgPCBhY2MyKSB7CisgICAgY2FycnkrKzsKKyAgfQorICB1aW50NjRfdCBoaWdoID0gYWNjICYgTE9XOworCisgIC8vIFN0YXJ0IHRvIGNvbXB1dGUgdGhlIGhpZ2ggMzIgYml0cyBvZiBoaWdoLgorICBhY2MyID0gKGFjYyA+PiAzMkxMKSB8IChjYXJyeSA8PCAzMkxMKTsKKworICBhY2MgPSBhY2MyICsgYSAqIGg7CisgIGFjYzIgPSBhY2MgKyBiICogZzsKKyAgYWNjID0gYWNjMiArIGMgKiBmOworICBhY2MyID0gYWNjICsgZCAqIGU7CisgIGhpZ2ggfD0gKGFjYzIgPDwgMzJMTCk7CisKKyAgcmV0dXJuIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PihoaWdoLCBsb3cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSEwsIHR5cGVuYW1lIExMLCB0eXBlbmFtZSBIUiwgdHlwZW5hbWUgTFI+CitzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IG9wZXJhdG9yIC8gKGNvbnN0IFRlbnNvclVJbnQxMjg8SEwsIExMPiYgbGhzLCBjb25zdCBUZW5zb3JVSW50MTI4PEhSLCBMUj4mIHJocykKK3sKKyAgaWYgKHJocyA9PSBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MD4sIHN0YXRpY192YWw8MT4gPigxKSkgeworICAgIHJldHVybiBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4obGhzLmhpZ2gsIGxocy5sb3cpOworICB9IGVsc2UgaWYgKGxocyA8IHJocykgeworICAgIHJldHVybiBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4oMCk7CisgIH0gZWxzZSB7CisgICAgLy8gY2FsY3VsYXRlIHRoZSBiaWdnZXN0IHBvd2VyIG9mIDIgdGltZXMgcmhzIHRoYXQncyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbGhzCisgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHBvd2VyMigxKTsKKyAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gZChyaHMpOworICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiB0bXAobGhzIC0gZCk7CisgICAgd2hpbGUgKGxocyA+PSBkKSB7CisgICAgICB0bXAgPSB0bXAgLSBkOworICAgICAgZCA9IGQgKyBkOworICAgICAgcG93ZXIyID0gcG93ZXIyICsgcG93ZXIyOworICAgIH0KKworICAgIHRtcCA9IFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PihsaHMuaGlnaCwgbGhzLmxvdyk7CisgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHJlc3VsdCgwKTsKKyAgICB3aGlsZSAocG93ZXIyICE9IFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwwPiwgc3RhdGljX3ZhbDwwPiA+KDApKSB7CisgICAgICBpZiAodG1wID49IGQpIHsKKyAgICAgICAgdG1wID0gdG1wIC0gZDsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcG93ZXIyOworICAgICAgfQorICAgICAgLy8gU2hpZnQgcmlnaHQKKyAgICAgIHBvd2VyMiA9IFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90Pihwb3dlcjIuaGlnaCA+PiAxLCAocG93ZXIyLmxvdyA+PiAxKSB8IChwb3dlcjIuaGlnaCA8PCA2MykpOworICAgICAgZCA9IFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PihkLmhpZ2ggPj4gMSwgKGQubG93ID4+IDEpIHwgKGQuaGlnaCA8PCA2MykpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9VSU5UMTI4X0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yVm9sdW1lUGF0Y2guaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3IvVGVuc29yVm9sdW1lUGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JWb2x1bWVQYXRjaC5oCkBAIC0wLDAgKzEsNjA4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUl9URU5TT1JfVk9MVU1FX1BBVENIX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SX1RFTlNPUl9WT0xVTUVfUEFUQ0hfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIFRlbnNvclZvbHVtZVBhdGNoCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yX01vZHVsZQorICAqCisgICogXGJyaWVmIFBhdGNoIGV4dHJhY3Rpb24gc3BlY2lhbGl6ZWQgZm9yIHByb2Nlc3Npbmcgb2Ygdm9sdW1ldHJpYyBkYXRhLgorICAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbnB1dCBoYXMgYSBsZWFzdCA0IGRpbWVuc2lvbnMgb3JkZXJlZCBhcyBmb2xsb3dzOgorICAqICAtIGNoYW5uZWxzCisgICogIC0gcGxhbmVzCisgICogIC0gcm93cworICAqICAtIGNvbHVtbnMKKyAgKiAgLSAob3B0aW9uYWwpIGFkZGl0aW9uYWwgZGltZW5zaW9ucyBzdWNoIGFzIHRpbWUgb3IgYmF0Y2ggc2l6ZS4KKyAgKiBDYWxsaW5nIHRoZSB2b2x1bWUgcGF0Y2ggY29kZSB3aXRoIHBhdGNoX3BsYW5lcywgcGF0Y2hfcm93cywgYW5kIHBhdGNoX2NvbHMKKyAgKiBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIHJlZ3VsYXIgcGF0Y2ggZXh0cmFjdGlvbiBjb2RlIHdpdGggcGFyYW1ldGVycworICAqIGQsIHBhdGNoX3BsYW5lcywgcGF0Y2hfcm93cywgcGF0Y2hfY29scywgYW5kIDEgZm9yIGFsbCB0aGUgYWRkaXRpb25hbAorICAqIGRpbWVuc2lvbnMuCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8RGVuc2VJbmRleCBQbGFuZXMsIERlbnNlSW5kZXggUm93cywgRGVuc2VJbmRleCBDb2xzLCB0eXBlbmFtZSBYcHJUeXBlPgorc3RydWN0IHRyYWl0czxUZW5zb3JWb2x1bWVQYXRjaE9wPFBsYW5lcywgUm93cywgQ29scywgWHByVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcj46OnR5cGUgU2NhbGFyOworICB0eXBlZGVmIHRyYWl0czxYcHJUeXBlPiBYcHJUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHJhaXRzOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUcmFpdHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6Ok5lc3RlZCBOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtRGltZW5zaW9ucyA9IFhwclRyYWl0czo6TnVtRGltZW5zaW9ucyArIDE7CisgIHN0YXRpYyBjb25zdCBpbnQgTGF5b3V0ID0gWHByVHJhaXRzOjpMYXlvdXQ7Cit9OworCit0ZW1wbGF0ZTxEZW5zZUluZGV4IFBsYW5lcywgRGVuc2VJbmRleCBSb3dzLCBEZW5zZUluZGV4IENvbHMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgZXZhbDxUZW5zb3JWb2x1bWVQYXRjaE9wPFBsYW5lcywgUm93cywgQ29scywgWHByVHlwZT4sIEVpZ2VuOjpEZW5zZT4KK3sKKyAgdHlwZWRlZiBjb25zdCBUZW5zb3JWb2x1bWVQYXRjaE9wPFBsYW5lcywgUm93cywgQ29scywgWHByVHlwZT4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTxEZW5zZUluZGV4IFBsYW5lcywgRGVuc2VJbmRleCBSb3dzLCBEZW5zZUluZGV4IENvbHMsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgbmVzdGVkPFRlbnNvclZvbHVtZVBhdGNoT3A8UGxhbmVzLCBSb3dzLCBDb2xzLCBYcHJUeXBlPiwgMSwgdHlwZW5hbWUgZXZhbDxUZW5zb3JWb2x1bWVQYXRjaE9wPFBsYW5lcywgUm93cywgQ29scywgWHByVHlwZT4gPjo6dHlwZT4KK3sKKyAgdHlwZWRlZiBUZW5zb3JWb2x1bWVQYXRjaE9wPFBsYW5lcywgUm93cywgQ29scywgWHByVHlwZT4gdHlwZTsKK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8RGVuc2VJbmRleCBQbGFuZXMsIERlbnNlSW5kZXggUm93cywgRGVuc2VJbmRleCBDb2xzLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgVGVuc29yVm9sdW1lUGF0Y2hPcCA6IHB1YmxpYyBUZW5zb3JCYXNlPFRlbnNvclZvbHVtZVBhdGNoT3A8UGxhbmVzLCBSb3dzLCBDb2xzLCBYcHJUeXBlPiwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JWb2x1bWVQYXRjaE9wPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPFRlbnNvclZvbHVtZVBhdGNoT3A+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxUZW5zb3JWb2x1bWVQYXRjaE9wPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8VGVuc29yVm9sdW1lUGF0Y2hPcD46OkluZGV4IEluZGV4OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yVm9sdW1lUGF0Y2hPcChjb25zdCBYcHJUeXBlJiBleHByLCBEZW5zZUluZGV4IHBhdGNoX3BsYW5lcywgRGVuc2VJbmRleCBwYXRjaF9yb3dzLCBEZW5zZUluZGV4IHBhdGNoX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4IHBsYW5lX3N0cmlkZXMsIERlbnNlSW5kZXggcm93X3N0cmlkZXMsIERlbnNlSW5kZXggY29sX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4IGluX3BsYW5lX3N0cmlkZXMsIERlbnNlSW5kZXggaW5fcm93X3N0cmlkZXMsIERlbnNlSW5kZXggaW5fY29sX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4IHBsYW5lX2luZmxhdGVfc3RyaWRlcywgRGVuc2VJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGVzLCBEZW5zZUluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWRkaW5nVHlwZSBwYWRkaW5nX3R5cGUsIFNjYWxhciBwYWRkaW5nX3ZhbHVlKQorICAgICAgOiBtX3hwcihleHByKSwgbV9wYXRjaF9wbGFuZXMocGF0Y2hfcGxhbmVzKSwgbV9wYXRjaF9yb3dzKHBhdGNoX3Jvd3MpLCBtX3BhdGNoX2NvbHMocGF0Y2hfY29scyksCisgICAgICAgIG1fcGxhbmVfc3RyaWRlcyhwbGFuZV9zdHJpZGVzKSwgbV9yb3dfc3RyaWRlcyhyb3dfc3RyaWRlcyksIG1fY29sX3N0cmlkZXMoY29sX3N0cmlkZXMpLAorICAgICAgICBtX2luX3BsYW5lX3N0cmlkZXMoaW5fcGxhbmVfc3RyaWRlcyksIG1faW5fcm93X3N0cmlkZXMoaW5fcm93X3N0cmlkZXMpLCBtX2luX2NvbF9zdHJpZGVzKGluX2NvbF9zdHJpZGVzKSwKKyAgICAgICAgbV9wbGFuZV9pbmZsYXRlX3N0cmlkZXMocGxhbmVfaW5mbGF0ZV9zdHJpZGVzKSwgbV9yb3dfaW5mbGF0ZV9zdHJpZGVzKHJvd19pbmZsYXRlX3N0cmlkZXMpLCBtX2NvbF9pbmZsYXRlX3N0cmlkZXMoY29sX2luZmxhdGVfc3RyaWRlcyksCisgICAgICAgIG1fcGFkZGluZ19leHBsaWNpdChmYWxzZSksIG1fcGFkZGluZ190b3BfeigwKSwgbV9wYWRkaW5nX2JvdHRvbV96KDApLCBtX3BhZGRpbmdfdG9wKDApLCBtX3BhZGRpbmdfYm90dG9tKDApLCBtX3BhZGRpbmdfbGVmdCgwKSwgbV9wYWRkaW5nX3JpZ2h0KDApLAorICAgICAgICBtX3BhZGRpbmdfdHlwZShwYWRkaW5nX3R5cGUpLCBtX3BhZGRpbmdfdmFsdWUocGFkZGluZ192YWx1ZSkge30KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFRlbnNvclZvbHVtZVBhdGNoT3AoY29uc3QgWHByVHlwZSYgZXhwciwgRGVuc2VJbmRleCBwYXRjaF9wbGFuZXMsIERlbnNlSW5kZXggcGF0Y2hfcm93cywgRGVuc2VJbmRleCBwYXRjaF9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4IHBsYW5lX3N0cmlkZXMsIERlbnNlSW5kZXggcm93X3N0cmlkZXMsIERlbnNlSW5kZXggY29sX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlSW5kZXggaW5fcGxhbmVfc3RyaWRlcywgRGVuc2VJbmRleCBpbl9yb3dfc3RyaWRlcywgRGVuc2VJbmRleCBpbl9jb2xfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCBwbGFuZV9pbmZsYXRlX3N0cmlkZXMsIERlbnNlSW5kZXggcm93X2luZmxhdGVfc3RyaWRlcywgRGVuc2VJbmRleCBjb2xfaW5mbGF0ZV9zdHJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4IHBhZGRpbmdfdG9wX3osIERlbnNlSW5kZXggcGFkZGluZ19ib3R0b21feiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCBwYWRkaW5nX3RvcCwgRGVuc2VJbmRleCBwYWRkaW5nX2JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCBwYWRkaW5nX2xlZnQsIERlbnNlSW5kZXggcGFkZGluZ19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyIHBhZGRpbmdfdmFsdWUpCisgICAgICA6IG1feHByKGV4cHIpLCBtX3BhdGNoX3BsYW5lcyhwYXRjaF9wbGFuZXMpLCBtX3BhdGNoX3Jvd3MocGF0Y2hfcm93cyksIG1fcGF0Y2hfY29scyhwYXRjaF9jb2xzKSwKKyAgICAgICAgbV9wbGFuZV9zdHJpZGVzKHBsYW5lX3N0cmlkZXMpLCBtX3Jvd19zdHJpZGVzKHJvd19zdHJpZGVzKSwgbV9jb2xfc3RyaWRlcyhjb2xfc3RyaWRlcyksCisgICAgICAgIG1faW5fcGxhbmVfc3RyaWRlcyhpbl9wbGFuZV9zdHJpZGVzKSwgbV9pbl9yb3dfc3RyaWRlcyhpbl9yb3dfc3RyaWRlcyksIG1faW5fY29sX3N0cmlkZXMoaW5fY29sX3N0cmlkZXMpLAorICAgICAgICBtX3BsYW5lX2luZmxhdGVfc3RyaWRlcyhwbGFuZV9pbmZsYXRlX3N0cmlkZXMpLCBtX3Jvd19pbmZsYXRlX3N0cmlkZXMocm93X2luZmxhdGVfc3RyaWRlcyksIG1fY29sX2luZmxhdGVfc3RyaWRlcyhjb2xfaW5mbGF0ZV9zdHJpZGVzKSwKKyAgICAgICAgbV9wYWRkaW5nX2V4cGxpY2l0KHRydWUpLCBtX3BhZGRpbmdfdG9wX3oocGFkZGluZ190b3BfeiksIG1fcGFkZGluZ19ib3R0b21feihwYWRkaW5nX2JvdHRvbV96KSwgbV9wYWRkaW5nX3RvcChwYWRkaW5nX3RvcCksIG1fcGFkZGluZ19ib3R0b20ocGFkZGluZ19ib3R0b20pLAorICAgICAgICBtX3BhZGRpbmdfbGVmdChwYWRkaW5nX2xlZnQpLCBtX3BhZGRpbmdfcmlnaHQocGFkZGluZ19yaWdodCksCisgICAgICAgIG1fcGFkZGluZ190eXBlKFBBRERJTkdfVkFMSUQpLCBtX3BhZGRpbmdfdmFsdWUocGFkZGluZ192YWx1ZSkge30KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYXRjaF9wbGFuZXMoKSBjb25zdCB7IHJldHVybiBtX3BhdGNoX3BsYW5lczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYXRjaF9yb3dzKCkgY29uc3QgeyByZXR1cm4gbV9wYXRjaF9yb3dzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IHBhdGNoX2NvbHMoKSBjb25zdCB7IHJldHVybiBtX3BhdGNoX2NvbHM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggcGxhbmVfc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcGxhbmVfc3RyaWRlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCByb3dfc3RyaWRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcm93X3N0cmlkZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggY29sX3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX2NvbF9zdHJpZGVzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IGluX3BsYW5lX3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX2luX3BsYW5lX3N0cmlkZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggaW5fcm93X3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX2luX3Jvd19zdHJpZGVzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IGluX2NvbF9zdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gbV9pbl9jb2xfc3RyaWRlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwbGFuZV9pbmZsYXRlX3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX3BsYW5lX2luZmxhdGVfc3RyaWRlczsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCByb3dfaW5mbGF0ZV9zdHJpZGVzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dfaW5mbGF0ZV9zdHJpZGVzOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IGNvbF9pbmZsYXRlX3N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBtX2NvbF9pbmZsYXRlX3N0cmlkZXM7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIGJvb2wgcGFkZGluZ19leHBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIG1fcGFkZGluZ19leHBsaWNpdDsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYWRkaW5nX3RvcF96KCkgY29uc3QgeyByZXR1cm4gbV9wYWRkaW5nX3RvcF96OyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IHBhZGRpbmdfYm90dG9tX3ooKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfYm90dG9tX3o7IH0KKyAgICBFSUdFTl9ERVZJQ0VfRlVOQworICAgIERlbnNlSW5kZXggcGFkZGluZ190b3AoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdG9wOyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBEZW5zZUluZGV4IHBhZGRpbmdfYm90dG9tKCkgY29uc3QgeyByZXR1cm4gbV9wYWRkaW5nX2JvdHRvbTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYWRkaW5nX2xlZnQoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfbGVmdDsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgRGVuc2VJbmRleCBwYWRkaW5nX3JpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9wYWRkaW5nX3JpZ2h0OyB9CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBQYWRkaW5nVHlwZSBwYWRkaW5nX3R5cGUoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdHlwZTsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgU2NhbGFyIHBhZGRpbmdfdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3BhZGRpbmdfdmFsdWU7IH0KKworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBleHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkIG1feHByOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYXRjaF9wbGFuZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhdGNoX3Jvd3M7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhdGNoX2NvbHM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BsYW5lX3N0cmlkZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3Jvd19zdHJpZGVzOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9jb2xfc3RyaWRlczsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1faW5fcGxhbmVfc3RyaWRlczsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1faW5fcm93X3N0cmlkZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX2luX2NvbF9zdHJpZGVzOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wbGFuZV9pbmZsYXRlX3N0cmlkZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3Jvd19pbmZsYXRlX3N0cmlkZXM7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX2NvbF9pbmZsYXRlX3N0cmlkZXM7CisgICAgY29uc3QgYm9vbCBtX3BhZGRpbmdfZXhwbGljaXQ7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhZGRpbmdfdG9wX3o7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhZGRpbmdfYm90dG9tX3o7CisgICAgY29uc3QgRGVuc2VJbmRleCBtX3BhZGRpbmdfdG9wOworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYWRkaW5nX2JvdHRvbTsKKyAgICBjb25zdCBEZW5zZUluZGV4IG1fcGFkZGluZ19sZWZ0OworICAgIGNvbnN0IERlbnNlSW5kZXggbV9wYWRkaW5nX3JpZ2h0OworICAgIGNvbnN0IFBhZGRpbmdUeXBlIG1fcGFkZGluZ190eXBlOworICAgIGNvbnN0IFNjYWxhciBtX3BhZGRpbmdfdmFsdWU7Cit9OworCisKKy8vIEV2YWwgYXMgcnZhbHVlCit0ZW1wbGF0ZTxEZW5zZUluZGV4IFBsYW5lcywgRGVuc2VJbmRleCBSb3dzLCBEZW5zZUluZGV4IENvbHMsIHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIERldmljZT4KK3N0cnVjdCBUZW5zb3JFdmFsdWF0b3I8Y29uc3QgVGVuc29yVm9sdW1lUGF0Y2hPcDxQbGFuZXMsIFJvd3MsIENvbHMsIEFyZ1R5cGU+LCBEZXZpY2U+Cit7CisgIHR5cGVkZWYgVGVuc29yVm9sdW1lUGF0Y2hPcDxQbGFuZXMsIFJvd3MsIENvbHMsIEFyZ1R5cGU+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgTnVtSW5wdXREaW1zID0gaW50ZXJuYWw6OmFycmF5X3NpemU8dHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnM+Ojp2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGludCBOdW1EaW1zID0gTnVtSW5wdXREaW1zICsgMTsKKyAgdHlwZWRlZiBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IERpbWVuc2lvbnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXI+Ojp0eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFBhY2tldFR5cGU8Q29lZmZSZXR1cm5UeXBlLCBEZXZpY2U+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisgIHN0YXRpYyBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0UmV0dXJuVHlwZT46OnNpemU7CisKKyAgZW51bSB7CisgICAgSXNBbGlnbmVkID0gZmFsc2UsCisgICAgUGFja2V0QWNjZXNzID0gVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OlBhY2tldEFjY2VzcywKKyAgICBCbG9ja0FjY2VzcyA9IGZhbHNlLAorICAgIExheW91dCA9IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+OjpMYXlvdXQsCisgICAgQ29vcmRBY2Nlc3MgPSBmYWxzZSwKKyAgICBSYXdBY2Nlc3MgPSBmYWxzZQorICB9OworCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yRXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIG9wLCBjb25zdCBEZXZpY2UmIGRldmljZSkKKyAgICAgIDogbV9pbXBsKG9wLmV4cHJlc3Npb24oKSwgZGV2aWNlKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtRGltcyA+PSA1KSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIG1fcGFkZGluZ1ZhbHVlID0gb3AucGFkZGluZ192YWx1ZSgpOworCisgICAgY29uc3QgdHlwZW5hbWUgVGVuc29yRXZhbHVhdG9yPEFyZ1R5cGUsIERldmljZT46OkRpbWVuc2lvbnMmIGlucHV0X2RpbXMgPSBtX2ltcGwuZGltZW5zaW9ucygpOworCisgICAgLy8gQ2FjaGUgYSBmZXcgdmFyaWFibGVzLgorICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIG1faW5wdXREZXB0aCA9IGlucHV0X2RpbXNbMF07CisgICAgICBtX2lucHV0UGxhbmVzID0gaW5wdXRfZGltc1sxXTsKKyAgICAgIG1faW5wdXRSb3dzID0gaW5wdXRfZGltc1syXTsKKyAgICAgIG1faW5wdXRDb2xzID0gaW5wdXRfZGltc1szXTsKKyAgICB9IGVsc2UgeworICAgICAgbV9pbnB1dERlcHRoID0gaW5wdXRfZGltc1tOdW1JbnB1dERpbXMtMV07CisgICAgICBtX2lucHV0UGxhbmVzID0gaW5wdXRfZGltc1tOdW1JbnB1dERpbXMtMl07CisgICAgICBtX2lucHV0Um93cyA9IGlucHV0X2RpbXNbTnVtSW5wdXREaW1zLTNdOworICAgICAgbV9pbnB1dENvbHMgPSBpbnB1dF9kaW1zW051bUlucHV0RGltcy00XTsKKyAgICB9CisKKyAgICBtX3BsYW5lX3N0cmlkZXMgPSBvcC5wbGFuZV9zdHJpZGVzKCk7CisgICAgbV9yb3dfc3RyaWRlcyA9IG9wLnJvd19zdHJpZGVzKCk7CisgICAgbV9jb2xfc3RyaWRlcyA9IG9wLmNvbF9zdHJpZGVzKCk7CisKKyAgICAvLyBJbnB1dCBzdHJpZGVzIGFuZCBlZmZlY3RpdmUgaW5wdXQvcGF0Y2ggc2l6ZQorICAgIG1faW5fcGxhbmVfc3RyaWRlcyA9IG9wLmluX3BsYW5lX3N0cmlkZXMoKTsKKyAgICBtX2luX3Jvd19zdHJpZGVzID0gb3AuaW5fcm93X3N0cmlkZXMoKTsKKyAgICBtX2luX2NvbF9zdHJpZGVzID0gb3AuaW5fY29sX3N0cmlkZXMoKTsKKyAgICBtX3BsYW5lX2luZmxhdGVfc3RyaWRlcyA9IG9wLnBsYW5lX2luZmxhdGVfc3RyaWRlcygpOworICAgIG1fcm93X2luZmxhdGVfc3RyaWRlcyA9IG9wLnJvd19pbmZsYXRlX3N0cmlkZXMoKTsKKyAgICBtX2NvbF9pbmZsYXRlX3N0cmlkZXMgPSBvcC5jb2xfaW5mbGF0ZV9zdHJpZGVzKCk7CisKKyAgICAvLyBUaGUgImVmZmVjdGl2ZSIgc3BhdGlhbCBzaXplIGFmdGVyIGluZmxhdGluZyBkYXRhIHdpdGggemVyb3MuCisgICAgbV9pbnB1dF9wbGFuZXNfZWZmID0gKG1faW5wdXRQbGFuZXMgLSAxKSAqIG1fcGxhbmVfaW5mbGF0ZV9zdHJpZGVzICsgMTsKKyAgICBtX2lucHV0X3Jvd3NfZWZmID0gKG1faW5wdXRSb3dzIC0gMSkgKiBtX3Jvd19pbmZsYXRlX3N0cmlkZXMgKyAxOworICAgIG1faW5wdXRfY29sc19lZmYgPSAobV9pbnB1dENvbHMgLSAxKSAqIG1fY29sX2luZmxhdGVfc3RyaWRlcyArIDE7CisgICAgbV9wYXRjaF9wbGFuZXNfZWZmID0gb3AucGF0Y2hfcGxhbmVzKCkgKyAob3AucGF0Y2hfcGxhbmVzKCkgLSAxKSAqIChtX2luX3BsYW5lX3N0cmlkZXMgLSAxKTsKKyAgICBtX3BhdGNoX3Jvd3NfZWZmID0gb3AucGF0Y2hfcm93cygpICsgKG9wLnBhdGNoX3Jvd3MoKSAtIDEpICogKG1faW5fcm93X3N0cmlkZXMgLSAxKTsKKyAgICBtX3BhdGNoX2NvbHNfZWZmID0gb3AucGF0Y2hfY29scygpICsgKG9wLnBhdGNoX2NvbHMoKSAtIDEpICogKG1faW5fY29sX3N0cmlkZXMgLSAxKTsKKworICAgIGlmIChvcC5wYWRkaW5nX2V4cGxpY2l0KCkpIHsKKyAgICAgIG1fb3V0cHV0UGxhbmVzID0gbnVtZXh0OjpjZWlsKChtX2lucHV0X3BsYW5lc19lZmYgKyBvcC5wYWRkaW5nX3RvcF96KCkgKyBvcC5wYWRkaW5nX2JvdHRvbV96KCkgLSBtX3BhdGNoX3BsYW5lc19lZmYgKyAxLmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fcGxhbmVfc3RyaWRlcykpOworICAgICAgbV9vdXRwdXRSb3dzID0gbnVtZXh0OjpjZWlsKChtX2lucHV0X3Jvd3NfZWZmICsgb3AucGFkZGluZ190b3AoKSArIG9wLnBhZGRpbmdfYm90dG9tKCkgLSBtX3BhdGNoX3Jvd3NfZWZmICsgMS5mKSAvIHN0YXRpY19jYXN0PGZsb2F0PihtX3Jvd19zdHJpZGVzKSk7CisgICAgICBtX291dHB1dENvbHMgPSBudW1leHQ6OmNlaWwoKG1faW5wdXRfY29sc19lZmYgKyBvcC5wYWRkaW5nX2xlZnQoKSArIG9wLnBhZGRpbmdfcmlnaHQoKSAtIG1fcGF0Y2hfY29sc19lZmYgKyAxLmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29sX3N0cmlkZXMpKTsKKyAgICAgIG1fcGxhbmVQYWRkaW5nVG9wID0gb3AucGFkZGluZ190b3BfeigpOworICAgICAgbV9yb3dQYWRkaW5nVG9wID0gb3AucGFkZGluZ190b3AoKTsKKyAgICAgIG1fY29sUGFkZGluZ0xlZnQgPSBvcC5wYWRkaW5nX2xlZnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ29tcHV0aW5nIHBhZGRpbmcgZnJvbSB0aGUgdHlwZQorICAgICAgc3dpdGNoIChvcC5wYWRkaW5nX3R5cGUoKSkgeworICAgICAgICBjYXNlIFBBRERJTkdfVkFMSUQ6CisgICAgICAgICAgbV9vdXRwdXRQbGFuZXMgPSBudW1leHQ6OmNlaWwoKG1faW5wdXRfcGxhbmVzX2VmZiAtIG1fcGF0Y2hfcGxhbmVzX2VmZiArIDEuZikgLyBzdGF0aWNfY2FzdDxmbG9hdD4obV9wbGFuZV9zdHJpZGVzKSk7CisgICAgICAgICAgbV9vdXRwdXRSb3dzID0gbnVtZXh0OjpjZWlsKChtX2lucHV0X3Jvd3NfZWZmIC0gbV9wYXRjaF9yb3dzX2VmZiArIDEuZikgLyBzdGF0aWNfY2FzdDxmbG9hdD4obV9yb3dfc3RyaWRlcykpOworICAgICAgICAgIG1fb3V0cHV0Q29scyA9IG51bWV4dDo6Y2VpbCgobV9pbnB1dF9jb2xzX2VmZiAtIG1fcGF0Y2hfY29sc19lZmYgKyAxLmYpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29sX3N0cmlkZXMpKTsKKyAgICAgICAgICBtX3BsYW5lUGFkZGluZ1RvcCA9IDA7CisgICAgICAgICAgbV9yb3dQYWRkaW5nVG9wID0gMDsKKyAgICAgICAgICBtX2NvbFBhZGRpbmdMZWZ0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQURESU5HX1NBTUU6IHsKKyAgICAgICAgICBtX291dHB1dFBsYW5lcyA9IG51bWV4dDo6Y2VpbChtX2lucHV0X3BsYW5lc19lZmYgLyBzdGF0aWNfY2FzdDxmbG9hdD4obV9wbGFuZV9zdHJpZGVzKSk7CisgICAgICAgICAgbV9vdXRwdXRSb3dzID0gbnVtZXh0OjpjZWlsKG1faW5wdXRfcm93c19lZmYgLyBzdGF0aWNfY2FzdDxmbG9hdD4obV9yb3dfc3RyaWRlcykpOworICAgICAgICAgIG1fb3V0cHV0Q29scyA9IG51bWV4dDo6Y2VpbChtX2lucHV0X2NvbHNfZWZmIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29sX3N0cmlkZXMpKTsKKyAgICAgICAgICBjb25zdCBJbmRleCBkeiA9IG1fb3V0cHV0UGxhbmVzICogbV9wbGFuZV9zdHJpZGVzICsgbV9wYXRjaF9wbGFuZXNfZWZmIC0gMSAtIG1faW5wdXRfcGxhbmVzX2VmZjsKKyAgICAgICAgICBjb25zdCBJbmRleCBkeSA9IG1fb3V0cHV0Um93cyAqIG1fcm93X3N0cmlkZXMgKyBtX3BhdGNoX3Jvd3NfZWZmIC0gMSAtIG1faW5wdXRfcm93c19lZmY7CisgICAgICAgICAgY29uc3QgSW5kZXggZHggPSBtX291dHB1dENvbHMgKiBtX2NvbF9zdHJpZGVzICsgbV9wYXRjaF9jb2xzX2VmZiAtIDEgLSBtX2lucHV0X2NvbHNfZWZmOworICAgICAgICAgIG1fcGxhbmVQYWRkaW5nVG9wID0gZHogLSBkeiAvIDI7CisgICAgICAgICAgbV9yb3dQYWRkaW5nVG9wID0gZHkgLSBkeSAvIDI7CisgICAgICAgICAgbV9jb2xQYWRkaW5nTGVmdCA9IGR4IC0gZHggLyAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJ1bmV4cGVjdGVkIHBhZGRpbmciKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWlnZW5fYXNzZXJ0KG1fb3V0cHV0Um93cyA+IDApOworICAgIGVpZ2VuX2Fzc2VydChtX291dHB1dENvbHMgPiAwKTsKKyAgICBlaWdlbl9hc3NlcnQobV9vdXRwdXRQbGFuZXMgPiAwKTsKKworICAgIC8vIERpbWVuc2lvbnMgZm9yIHJlc3VsdCBvZiBleHRyYWN0aW9uLgorICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKKyAgICAgIC8vIENvbE1ham9yCisgICAgICAvLyAwOiBkZXB0aAorICAgICAgLy8gMTogcGF0Y2hfcGxhbmVzCisgICAgICAvLyAyOiBwYXRjaF9yb3dzCisgICAgICAvLyAzOiBwYXRjaF9jb2xzCisgICAgICAvLyA0OiBudW1iZXIgb2YgcGF0Y2hlcworICAgICAgLy8gNSBhbmQgYmV5b25kOiBhbnl0aGluZyBlbHNlIChzdWNoIGFzIGJhdGNoKS4KKyAgICAgIG1fZGltZW5zaW9uc1swXSA9IGlucHV0X2RpbXNbMF07CisgICAgICBtX2RpbWVuc2lvbnNbMV0gPSBvcC5wYXRjaF9wbGFuZXMoKTsKKyAgICAgIG1fZGltZW5zaW9uc1syXSA9IG9wLnBhdGNoX3Jvd3MoKTsKKyAgICAgIG1fZGltZW5zaW9uc1szXSA9IG9wLnBhdGNoX2NvbHMoKTsKKyAgICAgIG1fZGltZW5zaW9uc1s0XSA9IG1fb3V0cHV0UGxhbmVzICogbV9vdXRwdXRSb3dzICogbV9vdXRwdXRDb2xzOworICAgICAgZm9yIChpbnQgaSA9IDU7IGkgPCBOdW1EaW1zOyArK2kpIHsKKyAgICAgICAgbV9kaW1lbnNpb25zW2ldID0gaW5wdXRfZGltc1tpLTFdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBSb3dNYWpvcgorICAgICAgLy8gTnVtRGltcy0xOiBkZXB0aAorICAgICAgLy8gTnVtRGltcy0yOiBwYXRjaF9wbGFuZXMKKyAgICAgIC8vIE51bURpbXMtMzogcGF0Y2hfcm93cworICAgICAgLy8gTnVtRGltcy00OiBwYXRjaF9jb2xzCisgICAgICAvLyBOdW1EaW1zLTU6IG51bWJlciBvZiBwYXRjaGVzCisgICAgICAvLyBOdW1EaW1zLTYgYW5kIGJleW9uZDogYW55dGhpbmcgZWxzZSAoc3VjaCBhcyBiYXRjaCkuCisgICAgICBtX2RpbWVuc2lvbnNbTnVtRGltcy0xXSA9IGlucHV0X2RpbXNbTnVtSW5wdXREaW1zLTFdOworICAgICAgbV9kaW1lbnNpb25zW051bURpbXMtMl0gPSBvcC5wYXRjaF9wbGFuZXMoKTsKKyAgICAgIG1fZGltZW5zaW9uc1tOdW1EaW1zLTNdID0gb3AucGF0Y2hfcm93cygpOworICAgICAgbV9kaW1lbnNpb25zW051bURpbXMtNF0gPSBvcC5wYXRjaF9jb2xzKCk7CisgICAgICBtX2RpbWVuc2lvbnNbTnVtRGltcy01XSA9IG1fb3V0cHV0UGxhbmVzICogbV9vdXRwdXRSb3dzICogbV9vdXRwdXRDb2xzOworICAgICAgZm9yIChpbnQgaSA9IE51bURpbXMtNjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgbV9kaW1lbnNpb25zW2ldID0gaW5wdXRfZGltc1tpXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdHJpZGVzIGZvciB0aGUgb3V0cHV0IHRlbnNvci4KKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpKSB7CisgICAgICBtX3Jvd1N0cmlkZSA9IG1fZGltZW5zaW9uc1sxXTsKKyAgICAgIG1fY29sU3RyaWRlID0gbV9kaW1lbnNpb25zWzJdICogbV9yb3dTdHJpZGU7CisgICAgICBtX3BhdGNoU3RyaWRlID0gbV9jb2xTdHJpZGUgKiBtX2RpbWVuc2lvbnNbM10gKiBtX2RpbWVuc2lvbnNbMF07CisgICAgICBtX290aGVyU3RyaWRlID0gbV9wYXRjaFN0cmlkZSAqIG1fZGltZW5zaW9uc1s0XTsKKyAgICB9IGVsc2UgeworICAgICAgbV9yb3dTdHJpZGUgPSBtX2RpbWVuc2lvbnNbTnVtRGltcy0yXTsKKyAgICAgIG1fY29sU3RyaWRlID0gbV9kaW1lbnNpb25zW051bURpbXMtM10gKiBtX3Jvd1N0cmlkZTsKKyAgICAgIG1fcGF0Y2hTdHJpZGUgPSBtX2NvbFN0cmlkZSAqIG1fZGltZW5zaW9uc1tOdW1EaW1zLTRdICogbV9kaW1lbnNpb25zW051bURpbXMtMV07CisgICAgICBtX290aGVyU3RyaWRlID0gbV9wYXRjaFN0cmlkZSAqIG1fZGltZW5zaW9uc1tOdW1EaW1zLTVdOworICAgIH0KKworICAgIC8vIFN0cmlkZXMgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgaW5wdXQgdGVuc29yLgorICAgIG1fcGxhbmVJbnB1dFN0cmlkZSA9IG1faW5wdXREZXB0aDsKKyAgICBtX3Jvd0lucHV0U3RyaWRlID0gbV9pbnB1dERlcHRoICogbV9pbnB1dFBsYW5lczsKKyAgICBtX2NvbElucHV0U3RyaWRlID0gbV9pbnB1dERlcHRoICogbV9pbnB1dFJvd3MgKiBtX2lucHV0UGxhbmVzOworICAgIG1fb3RoZXJJbnB1dFN0cmlkZSA9IG1faW5wdXREZXB0aCAqIG1faW5wdXRSb3dzICogbV9pbnB1dENvbHMgKiBtX2lucHV0UGxhbmVzOworCisgICAgbV9vdXRwdXRQbGFuZXNSb3dzID0gbV9vdXRwdXRQbGFuZXMgKiBtX291dHB1dFJvd3M7CisKKyAgICAvLyBGYXN0IHJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgdmFyaWFibGVzLgorICAgIG1fZmFzdE90aGVyU3RyaWRlID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fb3RoZXJTdHJpZGUpOworICAgIG1fZmFzdFBhdGNoU3RyaWRlID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fcGF0Y2hTdHJpZGUpOworICAgIG1fZmFzdENvbFN0cmlkZSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX2NvbFN0cmlkZSk7CisgICAgbV9mYXN0Um93U3RyaWRlID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fcm93U3RyaWRlKTsKKyAgICBtX2Zhc3RJbnB1dFJvd1N0cmlkZSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX3Jvd19pbmZsYXRlX3N0cmlkZXMpOworICAgIG1fZmFzdElucHV0Q29sU3RyaWRlID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1fY29sX2luZmxhdGVfc3RyaWRlcyk7CisgICAgbV9mYXN0SW5wdXRQbGFuZVN0cmlkZSA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX3BsYW5lX2luZmxhdGVfc3RyaWRlcyk7CisgICAgbV9mYXN0SW5wdXRDb2xzRWZmID0gaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+KG1faW5wdXRfY29sc19lZmYpOworICAgIG1fZmFzdE91dHB1dFBsYW5lcyA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX291dHB1dFBsYW5lcyk7CisgICAgbV9mYXN0T3V0cHV0UGxhbmVzUm93cyA9IGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PihtX291dHB1dFBsYW5lc1Jvd3MpOworCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgeworICAgICAgbV9mYXN0T3V0cHV0RGVwdGggPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9kaW1lbnNpb25zWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9mYXN0T3V0cHV0RGVwdGggPSBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4obV9kaW1lbnNpb25zW051bURpbXMtMV0pOworICAgIH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRGltZW5zaW9ucyYgZGltZW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fZGltZW5zaW9uczsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBldmFsU3ViRXhwcnNJZk5lZWRlZChTY2FsYXIqIC8qZGF0YSovKSB7CisgICAgbV9pbXBsLmV2YWxTdWJFeHByc0lmTmVlZGVkKE5VTEwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNsZWFudXAoKSB7CisgICAgbV9pbXBsLmNsZWFudXAoKTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgLy8gUGF0Y2ggaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgIGNvbnN0IEluZGV4IHBhdGNoSW5kZXggPSBpbmRleCAvIG1fZmFzdFBhdGNoU3RyaWRlOworCisgICAgLy8gU3BhdGlhbCBvZmZzZXQgd2l0aGluIHRoZSBwYXRjaC4gVGhpcyBoYXMgdG8gYmUgdHJhbnNsYXRlZCBpbnRvIDNECisgICAgLy8gY29vcmRpbmF0ZXMgd2l0aGluIHRoZSBwYXRjaC4KKyAgICBjb25zdCBJbmRleCBwYXRjaE9mZnNldCA9IChpbmRleCAtIHBhdGNoSW5kZXggKiBtX3BhdGNoU3RyaWRlKSAvIG1fZmFzdE91dHB1dERlcHRoOworCisgICAgLy8gQmF0Y2gsIGV0Yy4KKyAgICBjb25zdCBJbmRleCBvdGhlckluZGV4ID0gKE51bURpbXMgPT0gNSkgPyAwIDogaW5kZXggLyBtX2Zhc3RPdGhlclN0cmlkZTsKKyAgICBjb25zdCBJbmRleCBwYXRjaDNESW5kZXggPSAoTnVtRGltcyA9PSA1KSA/IHBhdGNoSW5kZXggOiAoaW5kZXggLSBvdGhlckluZGV4ICogbV9vdGhlclN0cmlkZSkgLyBtX2Zhc3RQYXRjaFN0cmlkZTsKKworICAgIC8vIENhbGN1bGF0ZSBjb2x1bW4gaW5kZXggaW4gdGhlIGlucHV0IG9yaWdpbmFsIHRlbnNvci4KKyAgICBjb25zdCBJbmRleCBjb2xJbmRleCA9IHBhdGNoM0RJbmRleCAvIG1fZmFzdE91dHB1dFBsYW5lc1Jvd3M7CisgICAgY29uc3QgSW5kZXggY29sT2Zmc2V0ID0gcGF0Y2hPZmZzZXQgLyBtX2Zhc3RDb2xTdHJpZGU7CisgICAgY29uc3QgSW5kZXggaW5wdXRDb2wgPSBjb2xJbmRleCAqIG1fY29sX3N0cmlkZXMgKyBjb2xPZmZzZXQgKiBtX2luX2NvbF9zdHJpZGVzIC0gbV9jb2xQYWRkaW5nTGVmdDsKKyAgICBjb25zdCBJbmRleCBvcmlnSW5wdXRDb2wgPSAobV9jb2xfaW5mbGF0ZV9zdHJpZGVzID09IDEpID8gaW5wdXRDb2wgOiAoKGlucHV0Q29sID49IDApID8gKGlucHV0Q29sIC8gbV9mYXN0SW5wdXRDb2xTdHJpZGUpIDogMCk7CisgICAgaWYgKGlucHV0Q29sIDwgMCB8fCBpbnB1dENvbCA+PSBtX2lucHV0X2NvbHNfZWZmIHx8CisgICAgICAgICgobV9jb2xfaW5mbGF0ZV9zdHJpZGVzICE9IDEpICYmIChpbnB1dENvbCAhPSBvcmlnSW5wdXRDb2wgKiBtX2NvbF9pbmZsYXRlX3N0cmlkZXMpKSkgeworICAgICAgcmV0dXJuIFNjYWxhcihtX3BhZGRpbmdWYWx1ZSk7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHJvdyBpbmRleCBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgdGVuc29yLgorICAgIGNvbnN0IEluZGV4IHJvd0luZGV4ID0gKHBhdGNoM0RJbmRleCAtIGNvbEluZGV4ICogbV9vdXRwdXRQbGFuZXNSb3dzKSAvIG1fZmFzdE91dHB1dFBsYW5lczsKKyAgICBjb25zdCBJbmRleCByb3dPZmZzZXQgPSAocGF0Y2hPZmZzZXQgLSBjb2xPZmZzZXQgKiBtX2NvbFN0cmlkZSkgLyBtX2Zhc3RSb3dTdHJpZGU7CisgICAgY29uc3QgSW5kZXggaW5wdXRSb3cgPSByb3dJbmRleCAqIG1fcm93X3N0cmlkZXMgKyByb3dPZmZzZXQgKiBtX2luX3Jvd19zdHJpZGVzIC0gbV9yb3dQYWRkaW5nVG9wOworICAgIGNvbnN0IEluZGV4IG9yaWdJbnB1dFJvdyA9IChtX3Jvd19pbmZsYXRlX3N0cmlkZXMgPT0gMSkgPyBpbnB1dFJvdyA6ICgoaW5wdXRSb3cgPj0gMCkgPyAoaW5wdXRSb3cgLyBtX2Zhc3RJbnB1dFJvd1N0cmlkZSkgOiAwKTsKKyAgICBpZiAoaW5wdXRSb3cgPCAwIHx8IGlucHV0Um93ID49IG1faW5wdXRfcm93c19lZmYgfHwKKyAgICAgICAgKChtX3Jvd19pbmZsYXRlX3N0cmlkZXMgIT0gMSkgJiYgKGlucHV0Um93ICE9IG9yaWdJbnB1dFJvdyAqIG1fcm93X2luZmxhdGVfc3RyaWRlcykpKSB7CisgICAgICByZXR1cm4gU2NhbGFyKG1fcGFkZGluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgcGxhbmUgaW5kZXggaW4gdGhlIG9yaWdpbmFsIGlucHV0IHRlbnNvci4KKyAgICBjb25zdCBJbmRleCBwbGFuZUluZGV4ID0gKHBhdGNoM0RJbmRleCAtIG1fb3V0cHV0UGxhbmVzICogKGNvbEluZGV4ICogbV9vdXRwdXRSb3dzICsgcm93SW5kZXgpKTsKKyAgICBjb25zdCBJbmRleCBwbGFuZU9mZnNldCA9IHBhdGNoT2Zmc2V0IC0gY29sT2Zmc2V0ICogbV9jb2xTdHJpZGUgLSByb3dPZmZzZXQgKiBtX3Jvd1N0cmlkZTsKKyAgICBjb25zdCBJbmRleCBpbnB1dFBsYW5lID0gcGxhbmVJbmRleCAqIG1fcGxhbmVfc3RyaWRlcyArIHBsYW5lT2Zmc2V0ICogbV9pbl9wbGFuZV9zdHJpZGVzIC0gbV9wbGFuZVBhZGRpbmdUb3A7CisgICAgY29uc3QgSW5kZXggb3JpZ0lucHV0UGxhbmUgPSAobV9wbGFuZV9pbmZsYXRlX3N0cmlkZXMgPT0gMSkgPyBpbnB1dFBsYW5lIDogKChpbnB1dFBsYW5lID49IDApID8gKGlucHV0UGxhbmUgLyBtX2Zhc3RJbnB1dFBsYW5lU3RyaWRlKSA6IDApOworICAgIGlmIChpbnB1dFBsYW5lIDwgMCB8fCBpbnB1dFBsYW5lID49IG1faW5wdXRfcGxhbmVzX2VmZiB8fAorICAgICAgICAoKG1fcGxhbmVfaW5mbGF0ZV9zdHJpZGVzICE9IDEpICYmIChpbnB1dFBsYW5lICE9IG9yaWdJbnB1dFBsYW5lICogbV9wbGFuZV9pbmZsYXRlX3N0cmlkZXMpKSkgeworICAgICAgcmV0dXJuIFNjYWxhcihtX3BhZGRpbmdWYWx1ZSk7CisgICAgfQorCisgICAgY29uc3QgaW50IGRlcHRoX2luZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihMYXlvdXQpID09IHN0YXRpY19jYXN0PGludD4oQ29sTWFqb3IpID8gMCA6IE51bURpbXMgLSAxOworICAgIGNvbnN0IEluZGV4IGRlcHRoID0gaW5kZXggLSAoaW5kZXggLyBtX2Zhc3RPdXRwdXREZXB0aCkgKiBtX2RpbWVuc2lvbnNbZGVwdGhfaW5kZXhdOworCisgICAgY29uc3QgSW5kZXggaW5wdXRJbmRleCA9IGRlcHRoICsKKyAgICAgICAgb3JpZ0lucHV0Um93ICogbV9yb3dJbnB1dFN0cmlkZSArCisgICAgICAgIG9yaWdJbnB1dENvbCAqIG1fY29sSW5wdXRTdHJpZGUgKworICAgICAgICBvcmlnSW5wdXRQbGFuZSAqIG1fcGxhbmVJbnB1dFN0cmlkZSArCisgICAgICAgIG90aGVySW5kZXggKiBtX290aGVySW5wdXRTdHJpZGU7CisKKyAgICByZXR1cm4gbV9pbXBsLmNvZWZmKGlucHV0SW5kZXgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoUGFja2V0U2l6ZSA+IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgZWlnZW5fYXNzZXJ0KGluZGV4K1BhY2tldFNpemUtMSA8IGRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSk7CisKKyAgICBpZiAobV9pbl9yb3dfc3RyaWRlcyAhPSAxIHx8IG1faW5fY29sX3N0cmlkZXMgIT0gMSB8fCBtX3Jvd19pbmZsYXRlX3N0cmlkZXMgIT0gMSB8fCBtX2NvbF9pbmZsYXRlX3N0cmlkZXMgIT0gMSB8fAorICAgICAgICBtX2luX3BsYW5lX3N0cmlkZXMgIT0gMSB8fCBtX3BsYW5lX2luZmxhdGVfc3RyaWRlcyAhPSAxKSB7CisgICAgICByZXR1cm4gcGFja2V0V2l0aFBvc3NpYmxlWmVybyhpbmRleCk7CisgICAgfQorCisgICAgY29uc3QgSW5kZXggaW5kaWNlc1syXSA9IHtpbmRleCwgaW5kZXggKyBQYWNrZXRTaXplIC0gMX07CisgICAgY29uc3QgSW5kZXggcGF0Y2hJbmRleCA9IGluZGljZXNbMF0gLyBtX2Zhc3RQYXRjaFN0cmlkZTsKKyAgICBpZiAocGF0Y2hJbmRleCAhPSBpbmRpY2VzWzFdIC8gbV9mYXN0UGF0Y2hTdHJpZGUpIHsKKyAgICAgIHJldHVybiBwYWNrZXRXaXRoUG9zc2libGVaZXJvKGluZGV4KTsKKyAgICB9CisgICAgY29uc3QgSW5kZXggb3RoZXJJbmRleCA9IChOdW1EaW1zID09IDUpID8gMCA6IGluZGljZXNbMF0gLyBtX2Zhc3RPdGhlclN0cmlkZTsKKyAgICBlaWdlbl9hc3NlcnQob3RoZXJJbmRleCA9PSBpbmRpY2VzWzFdIC8gbV9mYXN0T3RoZXJTdHJpZGUpOworCisgICAgLy8gRmluZCB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IHdydCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGVsZW1lbnQuCisgICAgY29uc3QgSW5kZXggcGF0Y2hPZmZzZXRzWzJdID0geyhpbmRpY2VzWzBdIC0gcGF0Y2hJbmRleCAqIG1fcGF0Y2hTdHJpZGUpIC8gbV9mYXN0T3V0cHV0RGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRpY2VzWzFdIC0gcGF0Y2hJbmRleCAqIG1fcGF0Y2hTdHJpZGUpIC8gbV9mYXN0T3V0cHV0RGVwdGh9OworCisgICAgY29uc3QgSW5kZXggcGF0Y2gzREluZGV4ID0gKE51bURpbXMgPT0gNSkgPyBwYXRjaEluZGV4IDogKGluZGljZXNbMF0gLSBvdGhlckluZGV4ICogbV9vdGhlclN0cmlkZSkgLyBtX2Zhc3RQYXRjaFN0cmlkZTsKKyAgICBlaWdlbl9hc3NlcnQocGF0Y2gzREluZGV4ID09IChpbmRpY2VzWzFdIC0gb3RoZXJJbmRleCAqIG1fb3RoZXJTdHJpZGUpIC8gbV9mYXN0UGF0Y2hTdHJpZGUpOworCisgICAgY29uc3QgSW5kZXggY29sSW5kZXggPSBwYXRjaDNESW5kZXggLyBtX2Zhc3RPdXRwdXRQbGFuZXNSb3dzOworICAgIGNvbnN0IEluZGV4IGNvbE9mZnNldHNbMl0gPSB7CisgICAgICBwYXRjaE9mZnNldHNbMF0gLyBtX2Zhc3RDb2xTdHJpZGUsCisgICAgICBwYXRjaE9mZnNldHNbMV0gLyBtX2Zhc3RDb2xTdHJpZGV9OworCisgICAgLy8gQ2FsY3VsYXRlIGNvbCBpbmRpY2VzIGluIHRoZSBvcmlnaW5hbCBpbnB1dCB0ZW5zb3IuCisgICAgY29uc3QgSW5kZXggaW5wdXRDb2xzWzJdID0geworICAgICAgY29sSW5kZXggKiBtX2NvbF9zdHJpZGVzICsgY29sT2Zmc2V0c1swXSAtIG1fY29sUGFkZGluZ0xlZnQsCisgICAgICBjb2xJbmRleCAqIG1fY29sX3N0cmlkZXMgKyBjb2xPZmZzZXRzWzFdIC0gbV9jb2xQYWRkaW5nTGVmdH07CisgICAgaWYgKGlucHV0Q29sc1sxXSA8IDAgfHwgaW5wdXRDb2xzWzBdID49IG1faW5wdXRDb2xzKSB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldFJldHVyblR5cGU+KFNjYWxhcihtX3BhZGRpbmdWYWx1ZSkpOworICAgIH0KKworICAgIGlmIChpbnB1dENvbHNbMF0gIT0gaW5wdXRDb2xzWzFdKSB7CisgICAgICByZXR1cm4gcGFja2V0V2l0aFBvc3NpYmxlWmVybyhpbmRleCk7CisgICAgfQorCisgICAgY29uc3QgSW5kZXggcm93SW5kZXggPSAocGF0Y2gzREluZGV4IC0gY29sSW5kZXggKiBtX291dHB1dFBsYW5lc1Jvd3MpIC8gbV9mYXN0T3V0cHV0UGxhbmVzOworICAgIGNvbnN0IEluZGV4IHJvd09mZnNldHNbMl0gPSB7CisgICAgICAocGF0Y2hPZmZzZXRzWzBdIC0gY29sT2Zmc2V0c1swXSAqIG1fY29sU3RyaWRlKSAvIG1fZmFzdFJvd1N0cmlkZSwKKyAgICAgIChwYXRjaE9mZnNldHNbMV0gLSBjb2xPZmZzZXRzWzFdICogbV9jb2xTdHJpZGUpIC8gbV9mYXN0Um93U3RyaWRlfTsKKyAgICBlaWdlbl9hc3NlcnQocm93T2Zmc2V0c1swXSA8PSByb3dPZmZzZXRzWzFdKTsKKyAgICAvLyBDYWxjdWxhdGUgY29sIGluZGljZXMgaW4gdGhlIG9yaWdpbmFsIGlucHV0IHRlbnNvci4KKyAgICBjb25zdCBJbmRleCBpbnB1dFJvd3NbMl0gPSB7CisgICAgICByb3dJbmRleCAqIG1fcm93X3N0cmlkZXMgKyByb3dPZmZzZXRzWzBdIC0gbV9yb3dQYWRkaW5nVG9wLAorICAgICAgcm93SW5kZXggKiBtX3Jvd19zdHJpZGVzICsgcm93T2Zmc2V0c1sxXSAtIG1fcm93UGFkZGluZ1RvcH07CisKKyAgICBpZiAoaW5wdXRSb3dzWzFdIDwgMCB8fCBpbnB1dFJvd3NbMF0gPj0gbV9pbnB1dFJvd3MpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cHNldDE8UGFja2V0UmV0dXJuVHlwZT4oU2NhbGFyKG1fcGFkZGluZ1ZhbHVlKSk7CisgICAgfQorCisgICAgaWYgKGlucHV0Um93c1swXSAhPSBpbnB1dFJvd3NbMV0pIHsKKyAgICAgIHJldHVybiBwYWNrZXRXaXRoUG9zc2libGVaZXJvKGluZGV4KTsKKyAgICB9CisKKyAgICBjb25zdCBJbmRleCBwbGFuZUluZGV4ID0gKHBhdGNoM0RJbmRleCAtIG1fb3V0cHV0UGxhbmVzICogKGNvbEluZGV4ICogbV9vdXRwdXRSb3dzICsgcm93SW5kZXgpKTsKKyAgICBjb25zdCBJbmRleCBwbGFuZU9mZnNldHNbMl0gPSB7CisgICAgICBwYXRjaE9mZnNldHNbMF0gLSBjb2xPZmZzZXRzWzBdICogbV9jb2xTdHJpZGUgLSByb3dPZmZzZXRzWzBdICogbV9yb3dTdHJpZGUsCisgICAgICBwYXRjaE9mZnNldHNbMV0gLSBjb2xPZmZzZXRzWzFdICogbV9jb2xTdHJpZGUgLSByb3dPZmZzZXRzWzFdICogbV9yb3dTdHJpZGV9OworICAgIGVpZ2VuX2Fzc2VydChwbGFuZU9mZnNldHNbMF0gPD0gcGxhbmVPZmZzZXRzWzFdKTsKKyAgICBjb25zdCBJbmRleCBpbnB1dFBsYW5lc1syXSA9IHsKKyAgICAgIHBsYW5lSW5kZXggKiBtX3BsYW5lX3N0cmlkZXMgKyBwbGFuZU9mZnNldHNbMF0gLSBtX3BsYW5lUGFkZGluZ1RvcCwKKyAgICAgIHBsYW5lSW5kZXggKiBtX3BsYW5lX3N0cmlkZXMgKyBwbGFuZU9mZnNldHNbMV0gLSBtX3BsYW5lUGFkZGluZ1RvcH07CisKKyAgICBpZiAoaW5wdXRQbGFuZXNbMV0gPCAwIHx8IGlucHV0UGxhbmVzWzBdID49IG1faW5wdXRQbGFuZXMpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cHNldDE8UGFja2V0UmV0dXJuVHlwZT4oU2NhbGFyKG1fcGFkZGluZ1ZhbHVlKSk7CisgICAgfQorCisgICAgaWYgKGlucHV0UGxhbmVzWzBdID49IDAgJiYgaW5wdXRQbGFuZXNbMV0gPCBtX2lucHV0UGxhbmVzKSB7CisgICAgICAvLyBubyBwYWRkaW5nCisgICAgICBjb25zdCBpbnQgZGVwdGhfaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KExheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikgPyAwIDogTnVtRGltcyAtIDE7CisgICAgICBjb25zdCBJbmRleCBkZXB0aCA9IGluZGV4IC0gKGluZGV4IC8gbV9mYXN0T3V0cHV0RGVwdGgpICogbV9kaW1lbnNpb25zW2RlcHRoX2luZGV4XTsKKyAgICAgIGNvbnN0IEluZGV4IGlucHV0SW5kZXggPSBkZXB0aCArCisgICAgICAgICAgaW5wdXRSb3dzWzBdICogbV9yb3dJbnB1dFN0cmlkZSArCisgICAgICAgICAgaW5wdXRDb2xzWzBdICogbV9jb2xJbnB1dFN0cmlkZSArCisgICAgICAgICAgbV9wbGFuZUlucHV0U3RyaWRlICogaW5wdXRQbGFuZXNbMF0gKworICAgICAgICAgIG90aGVySW5kZXggKiBtX290aGVySW5wdXRTdHJpZGU7CisgICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+KGlucHV0SW5kZXgpOworICAgIH0KKworICAgIHJldHVybiBwYWNrZXRXaXRoUG9zc2libGVaZXJvKGluZGV4KTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgVGVuc29yT3BDb3N0CisgIGNvc3RQZXJDb2VmZihib29sIHZlY3Rvcml6ZWQpIGNvbnN0IHsKKyAgICBjb25zdCBkb3VibGUgY29tcHV0ZV9jb3N0ID0KKyAgICAgICAgMTAgKiBUZW5zb3JPcENvc3Q6OkRpdkNvc3Q8SW5kZXg+KCkgKyAyMSAqIFRlbnNvck9wQ29zdDo6TXVsQ29zdDxJbmRleD4oKSArCisgICAgICAgIDggKiBUZW5zb3JPcENvc3Q6OkFkZENvc3Q8SW5kZXg+KCk7CisgICAgcmV0dXJuIFRlbnNvck9wQ29zdCgwLCAwLCBjb21wdXRlX2Nvc3QsIHZlY3Rvcml6ZWQsIFBhY2tldFNpemUpOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgIGNvbnN0IFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+JiBpbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisKKyAgSW5kZXggcGxhbmVQYWRkaW5nVG9wKCkgY29uc3QgeyByZXR1cm4gbV9wbGFuZVBhZGRpbmdUb3A7IH0KKyAgSW5kZXggcm93UGFkZGluZ1RvcCgpIGNvbnN0IHsgcmV0dXJuIG1fcm93UGFkZGluZ1RvcDsgfQorICBJbmRleCBjb2xQYWRkaW5nTGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1fY29sUGFkZGluZ0xlZnQ7IH0KKyAgSW5kZXggb3V0cHV0UGxhbmVzKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRQbGFuZXM7IH0KKyAgSW5kZXggb3V0cHV0Um93cygpIGNvbnN0IHsgcmV0dXJuIG1fb3V0cHV0Um93czsgfQorICBJbmRleCBvdXRwdXRDb2xzKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRDb2xzOyB9CisgIEluZGV4IHVzZXJQbGFuZVN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGxhbmVfc3RyaWRlczsgfQorICBJbmRleCB1c2VyUm93U3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9yb3dfc3RyaWRlczsgfQorICBJbmRleCB1c2VyQ29sU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9jb2xfc3RyaWRlczsgfQorICBJbmRleCB1c2VySW5QbGFuZVN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5fcGxhbmVfc3RyaWRlczsgfQorICBJbmRleCB1c2VySW5Sb3dTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2luX3Jvd19zdHJpZGVzOyB9CisgIEluZGV4IHVzZXJJbkNvbFN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5fY29sX3N0cmlkZXM7IH0KKyAgSW5kZXggcGxhbmVJbmZsYXRlU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9wbGFuZV9pbmZsYXRlX3N0cmlkZXM7IH0KKyAgSW5kZXggcm93SW5mbGF0ZVN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm93X2luZmxhdGVfc3RyaWRlczsgfQorICBJbmRleCBjb2xJbmZsYXRlU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9jb2xfaW5mbGF0ZV9zdHJpZGVzOyB9CisKKyBwcm90ZWN0ZWQ6CisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRXaXRoUG9zc2libGVaZXJvKEluZGV4IGluZGV4KSBjb25zdAorICB7CisgICAgRUlHRU5fQUxJR05fTUFYIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfY29uc3Q8Q29lZmZSZXR1cm5UeXBlPjo6dHlwZSB2YWx1ZXNbUGFja2V0U2l6ZV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKKyAgICAgIHZhbHVlc1tpXSA9IGNvZWZmKGluZGV4K2kpOworICAgIH0KKyAgICBQYWNrZXRSZXR1cm5UeXBlIHJzbHQgPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0UmV0dXJuVHlwZT4odmFsdWVzKTsKKyAgICByZXR1cm4gcnNsdDsKKyAgfQorCisgIERpbWVuc2lvbnMgbV9kaW1lbnNpb25zOworCisgIC8vIFBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBjb3N0cnVjdG9yLgorICBJbmRleCBtX3BsYW5lX3N0cmlkZXM7CisgIEluZGV4IG1fcm93X3N0cmlkZXM7CisgIEluZGV4IG1fY29sX3N0cmlkZXM7CisKKyAgSW5kZXggbV9vdXRwdXRQbGFuZXM7CisgIEluZGV4IG1fb3V0cHV0Um93czsKKyAgSW5kZXggbV9vdXRwdXRDb2xzOworCisgIEluZGV4IG1fcGxhbmVQYWRkaW5nVG9wOworICBJbmRleCBtX3Jvd1BhZGRpbmdUb3A7CisgIEluZGV4IG1fY29sUGFkZGluZ0xlZnQ7CisKKyAgSW5kZXggbV9pbl9wbGFuZV9zdHJpZGVzOworICBJbmRleCBtX2luX3Jvd19zdHJpZGVzOworICBJbmRleCBtX2luX2NvbF9zdHJpZGVzOworCisgIEluZGV4IG1fcGxhbmVfaW5mbGF0ZV9zdHJpZGVzOworICBJbmRleCBtX3Jvd19pbmZsYXRlX3N0cmlkZXM7CisgIEluZGV4IG1fY29sX2luZmxhdGVfc3RyaWRlczsKKworICAvLyBDYWNoZWQgaW5wdXQgc2l6ZS4KKyAgSW5kZXggbV9pbnB1dERlcHRoOworICBJbmRleCBtX2lucHV0UGxhbmVzOworICBJbmRleCBtX2lucHV0Um93czsKKyAgSW5kZXggbV9pbnB1dENvbHM7CisKKyAgLy8gT3RoZXIgY2FjaGVkIHZhcmlhYmxlcy4KKyAgSW5kZXggbV9vdXRwdXRQbGFuZXNSb3dzOworCisgIC8vIEVmZmVjdGl2ZSBpbnB1dC9wYXRjaCBwb3N0LWluZmxhdGlvbiBzaXplLgorICBJbmRleCBtX2lucHV0X3BsYW5lc19lZmY7CisgIEluZGV4IG1faW5wdXRfcm93c19lZmY7CisgIEluZGV4IG1faW5wdXRfY29sc19lZmY7CisgIEluZGV4IG1fcGF0Y2hfcGxhbmVzX2VmZjsKKyAgSW5kZXggbV9wYXRjaF9yb3dzX2VmZjsKKyAgSW5kZXggbV9wYXRjaF9jb2xzX2VmZjsKKworICAvLyBTdHJpZGVzIGZvciB0aGUgb3V0cHV0IHRlbnNvci4KKyAgSW5kZXggbV9vdGhlclN0cmlkZTsKKyAgSW5kZXggbV9wYXRjaFN0cmlkZTsKKyAgSW5kZXggbV9yb3dTdHJpZGU7CisgIEluZGV4IG1fY29sU3RyaWRlOworCisgIC8vIFN0cmlkZXMgZm9yIHRoZSBpbnB1dCB0ZW5zb3IuCisgIEluZGV4IG1fcGxhbmVJbnB1dFN0cmlkZTsKKyAgSW5kZXggbV9yb3dJbnB1dFN0cmlkZTsKKyAgSW5kZXggbV9jb2xJbnB1dFN0cmlkZTsKKyAgSW5kZXggbV9vdGhlcklucHV0U3RyaWRlOworCisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RPdGhlclN0cmlkZTsKKyAgaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+IG1fZmFzdFBhdGNoU3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0Q29sU3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0Um93U3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0SW5wdXRQbGFuZVN0cmlkZTsKKyAgaW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8SW5kZXg+IG1fZmFzdElucHV0Um93U3RyaWRlOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0SW5wdXRDb2xTdHJpZGU7CisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RJbnB1dENvbHNFZmY7CisgIGludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPEluZGV4PiBtX2Zhc3RPdXRwdXRQbGFuZXNSb3dzOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0T3V0cHV0UGxhbmVzOworICBpbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxJbmRleD4gbV9mYXN0T3V0cHV0RGVwdGg7CisKKyAgU2NhbGFyIG1fcGFkZGluZ1ZhbHVlOworCisgIFRlbnNvckV2YWx1YXRvcjxBcmdUeXBlLCBEZXZpY2U+IG1faW1wbDsKK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMV9URU5TT1JfVEVOU09SX1ZPTFVNRV9QQVRDSF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvRHluYW1pY1N5bW1ldHJ5LmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvRHluYW1pY1N5bW1ldHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0ZjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3JTeW1tZXRyeS9EeW5hbWljU3ltbWV0cnkuaApAQCAtMCwwICsxLDI5MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JTWU1NRVRSWV9EWU5BTUlDU1lNTUVUUllfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9URU5TT1JTWU1NRVRSWV9EWU5BTUlDU1lNTUVUUllfSAorCituYW1lc3BhY2UgRWlnZW4geworCitjbGFzcyBEeW5hbWljU0dyb3VwCit7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgZXhwbGljaXQgRHluYW1pY1NHcm91cCgpIDogbV9udW1JbmRpY2VzKDEpLCBtX2VsZW1lbnRzKCksIG1fZ2VuZXJhdG9ycygpLCBtX2dsb2JhbEZsYWdzKDApIHsgbV9lbGVtZW50cy5wdXNoX2JhY2soZ2UoR2VuZXJhdG9yKDAsIDAsIDApKSk7IH0KKyAgICBpbmxpbmUgRHluYW1pY1NHcm91cChjb25zdCBEeW5hbWljU0dyb3VwJiBvKSA6IG1fbnVtSW5kaWNlcyhvLm1fbnVtSW5kaWNlcyksIG1fZWxlbWVudHMoby5tX2VsZW1lbnRzKSwgbV9nZW5lcmF0b3JzKG8ubV9nZW5lcmF0b3JzKSwgbV9nbG9iYWxGbGFncyhvLm1fZ2xvYmFsRmxhZ3MpIHsgfQorICAgIGlubGluZSBEeW5hbWljU0dyb3VwKER5bmFtaWNTR3JvdXAmJiBvKSA6IG1fbnVtSW5kaWNlcyhvLm1fbnVtSW5kaWNlcyksIG1fZWxlbWVudHMoKSwgbV9nZW5lcmF0b3JzKG8ubV9nZW5lcmF0b3JzKSwgbV9nbG9iYWxGbGFncyhvLm1fZ2xvYmFsRmxhZ3MpIHsgc3RkOjpzd2FwKG1fZWxlbWVudHMsIG8ubV9lbGVtZW50cyk7IH0KKyAgICBpbmxpbmUgRHluYW1pY1NHcm91cCYgb3BlcmF0b3I9KGNvbnN0IER5bmFtaWNTR3JvdXAmIG8pIHsgbV9udW1JbmRpY2VzID0gby5tX251bUluZGljZXM7IG1fZWxlbWVudHMgPSBvLm1fZWxlbWVudHM7IG1fZ2VuZXJhdG9ycyA9IG8ubV9nZW5lcmF0b3JzOyBtX2dsb2JhbEZsYWdzID0gby5tX2dsb2JhbEZsYWdzOyByZXR1cm4gKnRoaXM7IH0KKyAgICBpbmxpbmUgRHluYW1pY1NHcm91cCYgb3BlcmF0b3I9KER5bmFtaWNTR3JvdXAmJiBvKSB7IG1fbnVtSW5kaWNlcyA9IG8ubV9udW1JbmRpY2VzOyBzdGQ6OnN3YXAobV9lbGVtZW50cywgby5tX2VsZW1lbnRzKTsgbV9nZW5lcmF0b3JzID0gby5tX2dlbmVyYXRvcnM7IG1fZ2xvYmFsRmxhZ3MgPSBvLm1fZ2xvYmFsRmxhZ3M7IHJldHVybiAqdGhpczsgfQorCisgICAgdm9pZCBhZGQoaW50IG9uZSwgaW50IHR3bywgaW50IGZsYWdzID0gMCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBHZW5fPgorICAgIGlubGluZSB2b2lkIGFkZChHZW5fKSB7IGFkZChHZW5fOjpPbmUsIEdlbl86OlR3bywgR2VuXzo6RmxhZ3MpOyB9CisgICAgaW5saW5lIHZvaWQgYWRkU3ltbWV0cnkoaW50IG9uZSwgaW50IHR3bykgeyBhZGQob25lLCB0d28sIDApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkQW50aVN5bW1ldHJ5KGludCBvbmUsIGludCB0d28pIHsgYWRkKG9uZSwgdHdvLCBOZWdhdGlvbkZsYWcpOyB9CisgICAgaW5saW5lIHZvaWQgYWRkSGVybWl0aWNpdHkoaW50IG9uZSwgaW50IHR3bykgeyBhZGQob25lLCB0d28sIENvbmp1Z2F0aW9uRmxhZyk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRBbnRpSGVybWl0aWNpdHkoaW50IG9uZSwgaW50IHR3bykgeyBhZGQob25lLCB0d28sIE5lZ2F0aW9uRmxhZyB8IENvbmp1Z2F0aW9uRmxhZyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBSViwgdHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IE4sIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgaW5saW5lIFJWIGFwcGx5KGNvbnN0IHN0ZDo6YXJyYXk8SW5kZXgsIE4+JiBpZHgsIFJWIGluaXRpYWwsIEFyZ3MmJi4uLiBhcmdzKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChOID49IG1fbnVtSW5kaWNlcyAmJiAiQ2FuIG9ubHkgYXBwbHkgc3ltbWV0cnkgZ3JvdXAgdG8gb2JqZWN0cyB0aGF0IGhhdmUgYXQgbGVhc3QgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiBpbmRpY2VzLiIpOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQorICAgICAgICBpbml0aWFsID0gT3A6OnJ1bihoX3Blcm11dGUoaSwgaWR4LCB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdDxpbnQsIE4+Ojp0eXBlKCkpLCBtX2VsZW1lbnRzW2ldLmZsYWdzLCBpbml0aWFsLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgcmV0dXJuIGluaXRpYWw7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFJWLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgICBpbmxpbmUgUlYgYXBwbHkoY29uc3Qgc3RkOjp2ZWN0b3I8SW5kZXg+JiBpZHgsIFJWIGluaXRpYWwsIEFyZ3MmJi4uLiBhcmdzKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpZHguc2l6ZSgpID49IG1fbnVtSW5kaWNlcyAmJiAiQ2FuIG9ubHkgYXBwbHkgc3ltbWV0cnkgZ3JvdXAgdG8gb2JqZWN0cyB0aGF0IGhhdmUgYXQgbGVhc3QgdGhlIHJlcXVpcmVkIGFtb3VudCBvZiBpbmRpY2VzLiIpOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQorICAgICAgICBpbml0aWFsID0gT3A6OnJ1bihoX3Blcm11dGUoaSwgaWR4KSwgbV9lbGVtZW50c1tpXS5mbGFncywgaW5pdGlhbCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgIHJldHVybiBpbml0aWFsOworICAgIH0KKworICAgIGlubGluZSBpbnQgZ2xvYmFsRmxhZ3MoKSBjb25zdCB7IHJldHVybiBtX2dsb2JhbEZsYWdzOyB9CisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzLnNpemUoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXywgdHlwZW5hbWUuLi4gSW5kZXhUeXBlcz4KKyAgICBpbmxpbmUgaW50ZXJuYWw6OnRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXI8VGVuc29yXywgRHluYW1pY1NHcm91cD4gb3BlcmF0b3IoKShUZW5zb3JfJiB0ZW5zb3IsIHR5cGVuYW1lIFRlbnNvcl86OkluZGV4IGZpcnN0SW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKG90aGVySW5kaWNlcykgKyAxID09IFRlbnNvcl86Ok51bUluZGljZXMsICJOdW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuIik7CisgICAgICByZXR1cm4gb3BlcmF0b3IoKSh0ZW5zb3IsIHN0ZDo6YXJyYXk8dHlwZW5hbWUgVGVuc29yXzo6SW5kZXgsIFRlbnNvcl86Ok51bUluZGljZXM+e3tmaXJzdEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXz4KKyAgICBpbmxpbmUgaW50ZXJuYWw6OnRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXI8VGVuc29yXywgRHluYW1pY1NHcm91cD4gb3BlcmF0b3IoKShUZW5zb3JfJiB0ZW5zb3IsIHN0ZDo6YXJyYXk8dHlwZW5hbWUgVGVuc29yXzo6SW5kZXgsIFRlbnNvcl86Ok51bUluZGljZXM+IGNvbnN0JiBpbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6dGVuc29yX3N5bW1ldHJ5X3ZhbHVlX3NldHRlcjxUZW5zb3JfLCBEeW5hbWljU0dyb3VwPih0ZW5zb3IsICp0aGlzLCBpbmRpY2VzKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgc3RydWN0IEdyb3VwRWxlbWVudCB7CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHJlcHJlc2VudGF0aW9uOworICAgICAgaW50IGZsYWdzOworICAgICAgYm9vbCBpc0lkKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHJlcHJlc2VudGF0aW9uLnNpemUoKTsgaSsrKQorICAgICAgICAgIGlmIChpICE9IChzaXplX3QpcmVwcmVzZW50YXRpb25baV0pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisgICAgc3RydWN0IEdlbmVyYXRvciB7CisgICAgICBpbnQgb25lOworICAgICAgaW50IHR3bzsKKyAgICAgIGludCBmbGFnczsKKyAgICAgIGNvbnN0ZXhwciBpbmxpbmUgR2VuZXJhdG9yKGludCBvbmVfLCBpbnQgdHdvXywgaW50IGZsYWdzXykgOiBvbmUob25lXyksIHR3byh0d29fKSwgZmxhZ3MoZmxhZ3NfKSB7fQorICAgIH07CisKKyAgICBzdGQ6OnNpemVfdCBtX251bUluZGljZXM7CisgICAgc3RkOjp2ZWN0b3I8R3JvdXBFbGVtZW50PiBtX2VsZW1lbnRzOworICAgIHN0ZDo6dmVjdG9yPEdlbmVyYXRvcj4gbV9nZW5lcmF0b3JzOworICAgIGludCBtX2dsb2JhbEZsYWdzOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IE4sIGludC4uLiBuPgorICAgIGlubGluZSBzdGQ6OmFycmF5PEluZGV4LCBOPiBoX3Blcm11dGUoc3RkOjpzaXplX3Qgd2hpY2gsIGNvbnN0IHN0ZDo6YXJyYXk8SW5kZXgsIE4+JiBpZHgsIGludGVybmFsOjpudW1lcmljX2xpc3Q8aW50LCBuLi4uPikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjphcnJheTxJbmRleCwgTj57eyBpZHhbbiA+PSBtX251bUluZGljZXMgPyBuIDogbV9lbGVtZW50c1t3aGljaF0ucmVwcmVzZW50YXRpb25bbl1dLi4uIH19OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorICAgIGlubGluZSBzdGQ6OnZlY3RvcjxJbmRleD4gaF9wZXJtdXRlKHN0ZDo6c2l6ZV90IHdoaWNoLCBzdGQ6OnZlY3RvcjxJbmRleD4gaWR4KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEluZGV4PiByZXN1bHQ7CisgICAgICByZXN1bHQucmVzZXJ2ZShpZHguc2l6ZSgpKTsKKyAgICAgIGZvciAoYXV0byBrIDogbV9lbGVtZW50c1t3aGljaF0ucmVwcmVzZW50YXRpb24pCisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soaWR4W2tdKTsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IG1fbnVtSW5kaWNlczsgaSA8IGlkeC5zaXplKCk7IGkrKykKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhpZHhbaV0pOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpbmxpbmUgR3JvdXBFbGVtZW50IGdlKEdlbmVyYXRvciBjb25zdCYgZykgY29uc3QKKyAgICB7CisgICAgICBHcm91cEVsZW1lbnQgcmVzdWx0OworICAgICAgcmVzdWx0LnJlcHJlc2VudGF0aW9uLnJlc2VydmUobV9udW1JbmRpY2VzKTsKKyAgICAgIHJlc3VsdC5mbGFncyA9IGcuZmxhZ3M7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGsgPSAwOyBrIDwgbV9udW1JbmRpY2VzOyBrKyspIHsKKyAgICAgICAgaWYgKGsgPT0gKHN0ZDo6c2l6ZV90KWcub25lKQorICAgICAgICAgIHJlc3VsdC5yZXByZXNlbnRhdGlvbi5wdXNoX2JhY2soZy50d28pOworICAgICAgICBlbHNlIGlmIChrID09IChzdGQ6OnNpemVfdClnLnR3bykKKyAgICAgICAgICByZXN1bHQucmVwcmVzZW50YXRpb24ucHVzaF9iYWNrKGcub25lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlc3VsdC5yZXByZXNlbnRhdGlvbi5wdXNoX2JhY2soaW50KGspKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgR3JvdXBFbGVtZW50IG11bChHcm91cEVsZW1lbnQsIEdyb3VwRWxlbWVudCkgY29uc3Q7CisgICAgaW5saW5lIEdyb3VwRWxlbWVudCBtdWwoR2VuZXJhdG9yIGcxLCBHcm91cEVsZW1lbnQgZzIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG11bChnZShnMSksIGcyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgR3JvdXBFbGVtZW50IG11bChHcm91cEVsZW1lbnQgZzEsIEdlbmVyYXRvciBnMikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbXVsKGcxLCBnZShnMikpOworICAgIH0KKworICAgIGlubGluZSBHcm91cEVsZW1lbnQgbXVsKEdlbmVyYXRvciBnMSwgR2VuZXJhdG9yIGcyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtdWwoZ2UoZzEpLCBnZShnMikpOworICAgIH0KKworICAgIGlubGluZSBpbnQgZmluZEVsZW1lbnQoR3JvdXBFbGVtZW50IGUpIGNvbnN0CisgICAgeworICAgICAgZm9yIChhdXRvIGVlIDogbV9lbGVtZW50cykgeworICAgICAgICBpZiAoZWUucmVwcmVzZW50YXRpb24gPT0gZS5yZXByZXNlbnRhdGlvbikKKyAgICAgICAgICByZXR1cm4gZWUuZmxhZ3MgXiBlLmZsYWdzOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlR2xvYmFsRmxhZ3MoaW50IGZsYWdEaWZmT2ZTYW1lR2VuZXJhdG9yKTsKK307CisKKy8vIGR5bmFtaWMgc3ltbWV0cnkgZ3JvdXAgdGhhdCBhdXRvLWFkZHMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgaW4gdGhlIGNvbnN0cnVjdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBHZW4+CitjbGFzcyBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJncyA6IHB1YmxpYyBEeW5hbWljU0dyb3VwCit7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3MoKSA6IER5bmFtaWNTR3JvdXAoKQorICAgIHsKKyAgICAgIGFkZF9hbGwoaW50ZXJuYWw6OnR5cGVfbGlzdDxHZW4uLi4+KCkpOworICAgIH0KKyAgICBpbmxpbmUgRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3MoRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3MgY29uc3QmIG90aGVyKSA6IER5bmFtaWNTR3JvdXAob3RoZXIpIHsgfQorICAgIGlubGluZSBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJncyhEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJncyYmIG90aGVyKSA6IER5bmFtaWNTR3JvdXAob3RoZXIpIHsgfQorICAgIGlubGluZSBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJnczxHZW4uLi4+JiBvcGVyYXRvcj0oY29uc3QgRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3M8R2VuLi4uPiYgbykgeyBEeW5hbWljU0dyb3VwOjpvcGVyYXRvcj0obyk7IHJldHVybiAqdGhpczsgfQorICAgIGlubGluZSBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJnczxHZW4uLi4+JiBvcGVyYXRvcj0oRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3M8R2VuLi4uPiYmIG8pIHsgRHluYW1pY1NHcm91cDo6b3BlcmF0b3I9KG8pOyByZXR1cm4gKnRoaXM7IH0KKyAgCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgR2VuMSwgdHlwZW5hbWUuLi4gR2VuTmV4dD4KKyAgICBpbmxpbmUgdm9pZCBhZGRfYWxsKGludGVybmFsOjp0eXBlX2xpc3Q8R2VuMSwgR2VuTmV4dC4uLj4pCisgICAgeworICAgICAgYWRkKEdlbjEoKSk7CisgICAgICBhZGRfYWxsKGludGVybmFsOjp0eXBlX2xpc3Q8R2VuTmV4dC4uLj4oKSk7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgYWRkX2FsbChpbnRlcm5hbDo6dHlwZV9saXN0PD4pCisgICAgeworICAgIH0KK307CisKK2lubGluZSBEeW5hbWljU0dyb3VwOjpHcm91cEVsZW1lbnQgRHluYW1pY1NHcm91cDo6bXVsKEdyb3VwRWxlbWVudCBnMSwgR3JvdXBFbGVtZW50IGcyKSBjb25zdAoreworICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoZzEucmVwcmVzZW50YXRpb24uc2l6ZSgpID09IG1fbnVtSW5kaWNlcyk7CisgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChnMi5yZXByZXNlbnRhdGlvbi5zaXplKCkgPT0gbV9udW1JbmRpY2VzKTsKKworICBHcm91cEVsZW1lbnQgcmVzdWx0OworICByZXN1bHQucmVwcmVzZW50YXRpb24ucmVzZXJ2ZShtX251bUluZGljZXMpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9udW1JbmRpY2VzOyBpKyspIHsKKyAgICBpbnQgdiA9IGcyLnJlcHJlc2VudGF0aW9uW2cxLnJlcHJlc2VudGF0aW9uW2ldXTsKKyAgICBlaWdlbl9hc3NlcnQodiA+PSAwKTsKKyAgICByZXN1bHQucmVwcmVzZW50YXRpb24ucHVzaF9iYWNrKHYpOworICB9CisgIHJlc3VsdC5mbGFncyA9IGcxLmZsYWdzIF4gZzIuZmxhZ3M7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2lubGluZSB2b2lkIER5bmFtaWNTR3JvdXA6OmFkZChpbnQgb25lLCBpbnQgdHdvLCBpbnQgZmxhZ3MpCit7CisgIGVpZ2VuX2Fzc2VydChvbmUgPj0gMCk7CisgIGVpZ2VuX2Fzc2VydCh0d28gPj0gMCk7CisgIGVpZ2VuX2Fzc2VydChvbmUgIT0gdHdvKTsKKworICBpZiAoKHN0ZDo6c2l6ZV90KW9uZSA+PSBtX251bUluZGljZXMgfHwgKHN0ZDo6c2l6ZV90KXR3byA+PSBtX251bUluZGljZXMpIHsKKyAgICBzdGQ6OnNpemVfdCBuZXdOdW1JbmRpY2VzID0gKG9uZSA+IHR3bykgPyBvbmUgOiB0d28gKyAxOworICAgIGZvciAoYXV0byYgZ2VsZW0gOiBtX2VsZW1lbnRzKSB7CisgICAgICBnZWxlbS5yZXByZXNlbnRhdGlvbi5yZXNlcnZlKG5ld051bUluZGljZXMpOworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gbV9udW1JbmRpY2VzOyBpIDwgbmV3TnVtSW5kaWNlczsgaSsrKQorICAgICAgICBnZWxlbS5yZXByZXNlbnRhdGlvbi5wdXNoX2JhY2soaSk7CisgICAgfQorICAgIG1fbnVtSW5kaWNlcyA9IG5ld051bUluZGljZXM7CisgIH0KKworICBHZW5lcmF0b3IgZ3tvbmUsIHR3bywgZmxhZ3N9OworICBHcm91cEVsZW1lbnQgZSA9IGdlKGcpOworCisgIC8qIHNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgZ2VuZXJhdG9yICovCisgIGlmIChtX2VsZW1lbnRzLnNpemUoKSA9PSAxKSB7CisgICAgd2hpbGUgKCFlLmlzSWQoKSkgeworICAgICAgbV9lbGVtZW50cy5wdXNoX2JhY2soZSk7CisgICAgICBlID0gbXVsKGUsIGcpOworICAgIH0KKworICAgIGlmIChlLmZsYWdzID4gMCkKKyAgICAgIHVwZGF0ZUdsb2JhbEZsYWdzKGUuZmxhZ3MpOworCisgICAgLy8gb25seSBhZGQgaW4gY2FzZSB3ZSBkaWRuJ3QgaGF2ZSBpZGVudGl0eQorICAgIGlmIChtX2VsZW1lbnRzLnNpemUoKSA+IDEpCisgICAgICBtX2dlbmVyYXRvcnMucHVzaF9iYWNrKGcpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCBwID0gZmluZEVsZW1lbnQoZSk7CisgIGlmIChwID49IDApIHsKKyAgICB1cGRhdGVHbG9iYWxGbGFncyhwKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnNpemVfdCBjb3NldF9vcmRlciA9IG1fZWxlbWVudHMuc2l6ZSgpOworICBtX2VsZW1lbnRzLnB1c2hfYmFjayhlKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGNvc2V0X29yZGVyOyBpKyspCisgICAgbV9lbGVtZW50cy5wdXNoX2JhY2sobXVsKG1fZWxlbWVudHNbaV0sIGUpKTsKKyAgbV9nZW5lcmF0b3JzLnB1c2hfYmFjayhnKTsKKworICBzdGQ6OnNpemVfdCBjb3NldF9yZXAgPSBjb3NldF9vcmRlcjsKKyAgZG8geworICAgIGZvciAoYXV0byBnIDogbV9nZW5lcmF0b3JzKSB7CisgICAgICBlID0gbXVsKG1fZWxlbWVudHNbY29zZXRfcmVwXSwgZyk7CisgICAgICBwID0gZmluZEVsZW1lbnQoZSk7CisgICAgICBpZiAocCA8IDApIHsKKyAgICAgICAgLy8gZWxlbWVudCBub3QgeWV0IGluIGdyb3VwCisgICAgICAgIG1fZWxlbWVudHMucHVzaF9iYWNrKGUpOworICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgY29zZXRfb3JkZXI7IGkrKykKKyAgICAgICAgICBtX2VsZW1lbnRzLnB1c2hfYmFjayhtdWwobV9lbGVtZW50c1tpXSwgZSkpOworICAgICAgfSBlbHNlIGlmIChwID4gMCkgeworICAgICAgICB1cGRhdGVHbG9iYWxGbGFncyhwKTsKKyAgICAgIH0KKyAgICB9CisgICAgY29zZXRfcmVwICs9IGNvc2V0X29yZGVyOworICB9IHdoaWxlIChjb3NldF9yZXAgPCBtX2VsZW1lbnRzLnNpemUoKSk7Cit9CisKK2lubGluZSB2b2lkIER5bmFtaWNTR3JvdXA6OnVwZGF0ZUdsb2JhbEZsYWdzKGludCBmbGFnRGlmZk9mU2FtZUdlbmVyYXRvcikKK3sKKyAgICBzd2l0Y2ggKGZsYWdEaWZmT2ZTYW1lR2VuZXJhdG9yKSB7CisgICAgICBjYXNlIDA6CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBub3RoaW5nIGhhcHBlbmVkCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOZWdhdGlvbkZsYWc6CisgICAgICAgIC8vIGV2ZXJ5IGVsZW1lbnQgaXMgaXQncyBvd24gbmVnYXRpdmUgPT4gd2hvbGUgdGVuc29yIGlzIHplcm8KKyAgICAgICAgbV9nbG9iYWxGbGFncyB8PSBHbG9iYWxaZXJvRmxhZzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENvbmp1Z2F0aW9uRmxhZzoKKyAgICAgICAgLy8gZXZlcnkgZWxlbWVudCBpcyBpdCdzIG93biBjb25qdWdhdGUgPT4gd2hvbGUgdGVuc29yIGlzIHJlYWwKKyAgICAgICAgbV9nbG9iYWxGbGFncyB8PSBHbG9iYWxSZWFsRmxhZzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIChOZWdhdGlvbkZsYWcgfCBDb25qdWdhdGlvbkZsYWcpOgorICAgICAgICAvLyBldmVyeSBlbGVtZW50IGlzIGl0J3Mgb3duIG5lZ2F0aXZlIGNvbmp1Z2F0ZSA9PiB3aG9sZSB0ZW5zb3IgaXMgaW1hZ2luYXJ5CisgICAgICAgIG1fZ2xvYmFsRmxhZ3MgfD0gR2xvYmFsSW1hZ0ZsYWc7CisgICAgICAgIGJyZWFrOworICAgICAgLyogTk9URToKKyAgICAgICAqICAgc2luY2UgR2xvYmFsWmVyb0ZsYWcgPT0gR2xvYmFsUmVhbEZsYWcgfCBHbG9iYWxJbWFnRmxhZywgaWYgb25lIGdlbmVyYXRvcgorICAgICAgICogICBjYXVzZXMgdGhlIHRlbnNvciB0byBiZSByZWFsIGFuZCB0aGUgbmV4dCBvbmUgdG8gYmUgaW1hZ2luYXJ5LCB0aGlzIHdpbGwKKyAgICAgICAqICAgdHJpdmlhbGx5IGdpdmUgdGhlIGNvcnJlY3QgcmVzdWx0CisgICAgICAgKi8KKyAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfRFlOQU1JQ1NZTU1FVFJZX0gKKworLyoKKyAqIGthdGU6IHNwYWNlLWluZGVudCBvbjsgaW5kZW50LXdpZHRoIDI7IG1peGVkaW5kZW50IG9mZjsgaW5kZW50LW1vZGUgY3N0eWxlOworICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvU3RhdGljU3ltbWV0cnkuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3JTeW1tZXRyeS9TdGF0aWNTeW1tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjI5M2IKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvU3RhdGljU3ltbWV0cnkuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JTWU1NRVRSWV9TVEFUSUNTWU1NRVRSWV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RFTlNPUlNZTU1FVFJZX1NUQVRJQ1NZTU1FVFJZX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgbGlzdD4gc3RydWN0IHRlbnNvcl9zdGF0aWNfc3ltZ3JvdXBfcGVybXV0YXRlOworCit0ZW1wbGF0ZTxpbnQuLi4gbm4+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9wZXJtdXRhdGU8bnVtZXJpY19saXN0PGludCwgbm4uLi4+PgoreworICBjb25zdGV4cHIgc3RhdGljIHN0ZDo6c2l6ZV90IE4gPSBzaXplb2YuLi4obm4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIHN0ZDo6YXJyYXk8VCwgTj4gcnVuKGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4mIGluZGljZXMpCisgIHsKKyAgICByZXR1cm4ge3tpbmRpY2VzW25uXS4uLn19OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBpbmRpY2VzXywgaW50IGZsYWdzXz4KK3N0cnVjdCB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2VsZW1lbnQKK3sKKyAgdHlwZWRlZiBpbmRpY2VzXyBpbmRpY2VzOworICBjb25zdGV4cHIgc3RhdGljIGludCBmbGFncyA9IGZsYWdzXzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEdlbiwgaW50IE4+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9lbGVtZW50X2N0b3IKK3sKKyAgdHlwZWRlZiB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2VsZW1lbnQ8CisgICAgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCBOLCBHZW46Ok9uZSwgR2VuOjpUd28+Ojp0eXBlLAorICAgIEdlbjo6RmxhZ3MKKyAgPiB0eXBlOworfTsKKwordGVtcGxhdGU8aW50IE4+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9pZGVudGl0eV9jdG9yCit7CisgIHR5cGVkZWYgdGVuc29yX3N0YXRpY19zeW1ncm91cF9lbGVtZW50PAorICAgIHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCBOPjo6dHlwZSwKKyAgICAwCisgID4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIGlpYj4KK3N0cnVjdCB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX211bHRpcGx5X2hlbHBlcgoreworICB0ZW1wbGF0ZTxpbnQuLi4gaWlhPgorICBjb25zdGV4cHIgc3RhdGljIGlubGluZSBudW1lcmljX2xpc3Q8aW50LCBnZXQ8aWlhLCBpaWI+Ojp2YWx1ZS4uLj4gaGVscGVyKG51bWVyaWNfbGlzdDxpbnQsIGlpYS4uLj4pIHsKKyAgICByZXR1cm4gbnVtZXJpY19saXN0PGludCwgZ2V0PGlpYSwgaWliPjo6dmFsdWUuLi4+KCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9tdWx0aXBseQoreworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgQTo6aW5kaWNlcyBpaWE7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCOjppbmRpY2VzIGlpYjsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBmZmEgPSBBOjpmbGFnczsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBmZmIgPSBCOjpmbGFnczsKKyAgCisgIHB1YmxpYzoKKyAgICBzdGF0aWNfYXNzZXJ0KGlpYTo6Y291bnQgPT0gaWliOjpjb3VudCwgIkNhbm5vdCBtdWx0aXBseSBzeW1tZXRyeSBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgaW5kaWNlcy4iKTsKKworICAgIHR5cGVkZWYgdGVuc29yX3N0YXRpY19zeW1ncm91cF9lbGVtZW50PAorICAgICAgZGVjbHR5cGUodGVuc29yX3N0YXRpY19zeW1ncm91cF9tdWx0aXBseV9oZWxwZXI8aWliPjo6aGVscGVyKGlpYSgpKSksCisgICAgICBmZmEgXiBmZmIKKyAgICA+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IHRlbnNvcl9zdGF0aWNfc3ltZ3JvdXBfZXF1YWxpdHkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEE6OmluZGljZXMgaWlhOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQjo6aW5kaWNlcyBpaWI7CisgICAgY29uc3RleHByIHN0YXRpYyBpbnQgZmZhID0gQTo6ZmxhZ3M7CisgICAgY29uc3RleHByIHN0YXRpYyBpbnQgZmZiID0gQjo6ZmxhZ3M7CisgICAgc3RhdGljX2Fzc2VydChpaWE6OmNvdW50ID09IGlpYjo6Y291bnQsICJDYW5ub3QgY29tcGFyZSBzeW1tZXRyeSBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgaW5kaWNlcy4iKTsKKworICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IGlzX3NhbWU8aWlhLCBpaWI+Ojp2YWx1ZTsKKworICBwcml2YXRlOgorICAgIC8qIHRoaXMgc2hvdWxkIGJlIHplcm8gaWYgdGhleSBhcmUgaWRlbnRpY2FsLCBvciBlbHNlIHRoZSB0ZW5zb3IKKyAgICAgKiB3aWxsIGJlIGZvcmNlZCB0byBiZSBwdXJlIHJlYWwsIHB1cmUgaW1hZ2luYXJ5IG9yIGV2ZW4gcHVyZSB6ZXJvCisgICAgICovCisgICAgY29uc3RleHByIHN0YXRpYyBpbnQgZmxhZ3NfY21wXyA9IGZmYSBeIGZmYjsKKworICAgIC8qIGVpdGhlciB0aGV5IGFyZSBub3QgZXF1YWwsIHRoZW4gd2UgZG9uJ3QgY2FyZSB3aGV0aGVyIHRoZSBmbGFncworICAgICAqIG1hdGNoLCBvciB0aGV5IGFyZSBlcXVhbCwgYW5kIHRoZW4gd2UgaGF2ZSB0byBjaGVjaworICAgICAqLworICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCBpc196ZXJvICAgICAgPSB2YWx1ZSAmJiBmbGFnc19jbXBfID09IE5lZ2F0aW9uRmxhZzsKKyAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgaXNfcmVhbCAgICAgID0gdmFsdWUgJiYgZmxhZ3NfY21wXyA9PSBDb25qdWdhdGlvbkZsYWc7CisgICAgY29uc3RleHByIHN0YXRpYyBib29sIGlzX2ltYWcgICAgICA9IHZhbHVlICYmIGZsYWdzX2NtcF8gPT0gKE5lZ2F0aW9uRmxhZyB8IENvbmp1Z2F0aW9uRmxhZyk7CisKKyAgcHVibGljOgorICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IAorICAgICAgKGlzX3JlYWwgPyBHbG9iYWxSZWFsRmxhZyA6IDApIHwKKyAgICAgIChpc19pbWFnID8gR2xvYmFsSW1hZ0ZsYWcgOiAwKSB8CisgICAgICAoaXNfemVybyA/IEdsb2JhbFplcm9GbGFnIDogMCk7Cit9OworCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCB0eXBlbmFtZS4uLiBHZW4+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cAoreworICB0eXBlZGVmIFN0YXRpY1NHcm91cDxHZW4uLi4+IHR5cGU7CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3Qgc2l6ZSA9IHR5cGU6OnN0YXRpY19zaXplOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHN0ZDo6c2l6ZV90IE4sIGludC4uLiBpaSwgaW50Li4uIGpqPgorY29uc3RleHByIHN0YXRpYyBpbmxpbmUgc3RkOjphcnJheTxJbmRleCwgTj4gdGVuc29yX3N0YXRpY19zeW1ncm91cF9pbmRleF9wZXJtdXRlKHN0ZDo6YXJyYXk8SW5kZXgsIE4+IGlkeCwgaW50ZXJuYWw6Om51bWVyaWNfbGlzdDxpbnQsIGlpLi4uPiwgaW50ZXJuYWw6Om51bWVyaWNfbGlzdDxpbnQsIGpqLi4uPikKK3sKKyAgcmV0dXJuIHt7IGlkeFtpaV0uLi4sIGlkeFtqal0uLi4gfX07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQuLi4gaWk+CitzdGF0aWMgaW5saW5lIHN0ZDo6dmVjdG9yPEluZGV4PiB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2luZGV4X3Blcm11dGUoc3RkOjp2ZWN0b3I8SW5kZXg+IGlkeCwgaW50ZXJuYWw6Om51bWVyaWNfbGlzdDxpbnQsIGlpLi4uPikKK3sKKyAgc3RkOjp2ZWN0b3I8SW5kZXg+IHJlc3VsdHt7IGlkeFtpaV0uLi4gfX07CisgIHN0ZDo6c2l6ZV90IHRhcmdldF9zaXplID0gaWR4LnNpemUoKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gcmVzdWx0LnNpemUoKTsgaSA8IHRhcmdldF9zaXplOyBpKyspCisgICAgcmVzdWx0LnB1c2hfYmFjayhpZHhbaV0pOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTsKKwordGVtcGxhdGU8dHlwZW5hbWUgZmlyc3QsIHR5cGVuYW1lLi4uIG5leHQ+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTxpbnRlcm5hbDo6dHlwZV9saXN0PGZpcnN0LCBuZXh0Li4uPj4KK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFJWLCBzdGQ6OnNpemVfdCBTR051bUluZGljZXMsIHR5cGVuYW1lIEluZGV4LCBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCB0eXBlbmFtZS4uLiBBcmdzPgorICBzdGF0aWMgaW5saW5lIFJWIHJ1bihjb25zdCBzdGQ6OmFycmF5PEluZGV4LCBOdW1JbmRpY2VzPiYgaWR4LCBSViBpbml0aWFsLCBBcmdzJiYuLi4gYXJncykKKyAgeworICAgIHN0YXRpY19hc3NlcnQoTnVtSW5kaWNlcyA+PSBTR051bUluZGljZXMsICJDYW4gb25seSBhcHBseSBzeW1tZXRyeSBncm91cCB0byBvYmplY3RzIHRoYXQgaGF2ZSBhdCBsZWFzdCB0aGUgcmVxdWlyZWQgYW1vdW50IG9mIGluZGljZXMuIik7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdDxpbnQsIE51bUluZGljZXMgLSBTR051bUluZGljZXMsIFNHTnVtSW5kaWNlcz46OnR5cGUgcmVtYWluaW5nX2luZGljZXM7CisgICAgaW5pdGlhbCA9IE9wOjpydW4odGVuc29yX3N0YXRpY19zeW1ncm91cF9pbmRleF9wZXJtdXRlKGlkeCwgdHlwZW5hbWUgZmlyc3Q6OmluZGljZXMoKSwgcmVtYWluaW5nX2luZGljZXMoKSksIGZpcnN0OjpmbGFncywgaW5pdGlhbCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICByZXR1cm4gdGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTxpbnRlcm5hbDo6dHlwZV9saXN0PG5leHQuLi4+Pjo6dGVtcGxhdGUgcnVuPE9wLCBSViwgU0dOdW1JbmRpY2VzPihpZHgsIGluaXRpYWwsIGFyZ3MuLi4pOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFJWLCBzdGQ6OnNpemVfdCBTR051bUluZGljZXMsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZS4uLiBBcmdzPgorICBzdGF0aWMgaW5saW5lIFJWIHJ1bihjb25zdCBzdGQ6OnZlY3RvcjxJbmRleD4mIGlkeCwgUlYgaW5pdGlhbCwgQXJncyYmLi4uIGFyZ3MpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoaWR4LnNpemUoKSA+PSBTR051bUluZGljZXMgJiYgIkNhbiBvbmx5IGFwcGx5IHN5bW1ldHJ5IGdyb3VwIHRvIG9iamVjdHMgdGhhdCBoYXZlIGF0IGxlYXN0IHRoZSByZXF1aXJlZCBhbW91bnQgb2YgaW5kaWNlcy4iKTsKKyAgICBpbml0aWFsID0gT3A6OnJ1bih0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2luZGV4X3Blcm11dGUoaWR4LCB0eXBlbmFtZSBmaXJzdDo6aW5kaWNlcygpKSwgZmlyc3Q6OmZsYWdzLCBpbml0aWFsLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIHJldHVybiB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2RvX2FwcGx5PGludGVybmFsOjp0eXBlX2xpc3Q8bmV4dC4uLj4+Ojp0ZW1wbGF0ZSBydW48T3AsIFJWLCBTR051bUluZGljZXM+KGlkeCwgaW5pdGlhbCwgYXJncy4uLik7CisgIH0KK307CisKK3RlbXBsYXRlPEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfREVGKHR5cGVuYW1lLCBlbXB0eSk+CitzdHJ1Y3QgdGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTxpbnRlcm5hbDo6dHlwZV9saXN0PEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfVVNFKGVtcHR5KT4+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBSViwgc3RkOjpzaXplX3QgU0dOdW1JbmRpY2VzLCB0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgTnVtSW5kaWNlcywgdHlwZW5hbWUuLi4gQXJncz4KKyAgc3RhdGljIGlubGluZSBSViBydW4oY29uc3Qgc3RkOjphcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mLCBSViBpbml0aWFsLCBBcmdzJiYuLi4pCisgIHsKKyAgICAvLyBkbyBub3RoaW5nCisgICAgcmV0dXJuIGluaXRpYWw7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgUlYsIHN0ZDo6c2l6ZV90IFNHTnVtSW5kaWNlcywgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIHN0YXRpYyBpbmxpbmUgUlYgcnVuKGNvbnN0IHN0ZDo6dmVjdG9yPEluZGV4PiYsIFJWIGluaXRpYWwsIEFyZ3MmJi4uLikKKyAgeworICAgIC8vIGRvIG5vdGhpbmcKKyAgICByZXR1cm4gaW5pdGlhbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEdlbj4KK2NsYXNzIFN0YXRpY1NHcm91cAoreworICAgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgTnVtSW5kaWNlcyA9IGludGVybmFsOjp0ZW5zb3Jfc3ltbWV0cnlfbnVtX2luZGljZXM8R2VuLi4uPjo6dmFsdWU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Z3JvdXBfdGhlb3J5OjplbnVtZXJhdGVfZ3JvdXBfZWxlbWVudHM8CisgICAgICBpbnRlcm5hbDo6dGVuc29yX3N0YXRpY19zeW1ncm91cF9tdWx0aXBseSwKKyAgICAgIGludGVybmFsOjp0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2VxdWFsaXR5LAorICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRlbnNvcl9zdGF0aWNfc3ltZ3JvdXBfaWRlbnRpdHlfY3RvcjxOdW1JbmRpY2VzPjo6dHlwZSwKKyAgICAgIGludGVybmFsOjp0eXBlX2xpc3Q8dHlwZW5hbWUgaW50ZXJuYWw6OnRlbnNvcl9zdGF0aWNfc3ltZ3JvdXBfZWxlbWVudF9jdG9yPEdlbiwgTnVtSW5kaWNlcz46OnR5cGUuLi4+CisgICAgPiBncm91cF9lbGVtZW50czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGdyb3VwX2VsZW1lbnRzOjp0eXBlIGdlOworICBwdWJsaWM6CisgICAgY29uc3RleHByIGlubGluZSBTdGF0aWNTR3JvdXAoKSB7fQorICAgIGNvbnN0ZXhwciBpbmxpbmUgU3RhdGljU0dyb3VwKGNvbnN0IFN0YXRpY1NHcm91cDxHZW4uLi4+Jikge30KKyAgICBjb25zdGV4cHIgaW5saW5lIFN0YXRpY1NHcm91cChTdGF0aWNTR3JvdXA8R2VuLi4uPiYmKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFJWLCB0eXBlbmFtZSBJbmRleCwgc3RkOjpzaXplX3QgTiwgdHlwZW5hbWUuLi4gQXJncz4KKyAgICBzdGF0aWMgaW5saW5lIFJWIGFwcGx5KGNvbnN0IHN0ZDo6YXJyYXk8SW5kZXgsIE4+JiBpZHgsIFJWIGluaXRpYWwsIEFyZ3MmJi4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6dGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTxnZT46OnRlbXBsYXRlIHJ1bjxPcCwgUlYsIE51bUluZGljZXM+KGlkeCwgaW5pdGlhbCwgYXJncy4uLik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIFJWLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgICBzdGF0aWMgaW5saW5lIFJWIGFwcGx5KGNvbnN0IHN0ZDo6dmVjdG9yPEluZGV4PiYgaWR4LCBSViBpbml0aWFsLCBBcmdzJiYuLi4gYXJncykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaWR4LnNpemUoKSA9PSBOdW1JbmRpY2VzKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6dGVuc29yX3N0YXRpY19zeW1ncm91cF9kb19hcHBseTxnZT46OnRlbXBsYXRlIHJ1bjxPcCwgUlYsIE51bUluZGljZXM+KGlkeCwgaW5pdGlhbCwgYXJncy4uLik7CisgICAgfQorCisgICAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBzdGF0aWNfc2l6ZSA9IGdlOjpjb3VudDsKKworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIHN0ZDo6c2l6ZV90IHNpemUoKSB7CisgICAgICByZXR1cm4gZ2U6OmNvdW50OworICAgIH0KKyAgICBjb25zdGV4cHIgc3RhdGljIGlubGluZSBpbnQgZ2xvYmFsRmxhZ3MoKSB7IHJldHVybiBncm91cF9lbGVtZW50czo6Z2xvYmFsX2ZsYWdzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUZW5zb3JfLCB0eXBlbmFtZS4uLiBJbmRleFR5cGVzPgorICAgIGlubGluZSBpbnRlcm5hbDo6dGVuc29yX3N5bW1ldHJ5X3ZhbHVlX3NldHRlcjxUZW5zb3JfLCBTdGF0aWNTR3JvdXA8R2VuLi4uPj4gb3BlcmF0b3IoKShUZW5zb3JfJiB0ZW5zb3IsIHR5cGVuYW1lIFRlbnNvcl86OkluZGV4IGZpcnN0SW5kZXgsIEluZGV4VHlwZXMuLi4gb3RoZXJJbmRpY2VzKSBjb25zdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKG90aGVySW5kaWNlcykgKyAxID09IFRlbnNvcl86Ok51bUluZGljZXMsICJOdW1iZXIgb2YgaW5kaWNlcyB1c2VkIHRvIGFjY2VzcyBhIHRlbnNvciBjb2VmZmljaWVudCBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IuIik7CisgICAgICByZXR1cm4gb3BlcmF0b3IoKSh0ZW5zb3IsIHN0ZDo6YXJyYXk8dHlwZW5hbWUgVGVuc29yXzo6SW5kZXgsIFRlbnNvcl86Ok51bUluZGljZXM+e3tmaXJzdEluZGV4LCBvdGhlckluZGljZXMuLi59fSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXz4KKyAgICBpbmxpbmUgaW50ZXJuYWw6OnRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXI8VGVuc29yXywgU3RhdGljU0dyb3VwPEdlbi4uLj4+IG9wZXJhdG9yKCkoVGVuc29yXyYgdGVuc29yLCBzdGQ6OmFycmF5PHR5cGVuYW1lIFRlbnNvcl86OkluZGV4LCBUZW5zb3JfOjpOdW1JbmRpY2VzPiBjb25zdCYgaW5kaWNlcykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXI8VGVuc29yXywgU3RhdGljU0dyb3VwPEdlbi4uLj4+KHRlbnNvciwgKnRoaXMsIGluZGljZXMpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfU1RBVElDU1lNTUVUUllfSAorCisvKgorICoga2F0ZTogc3BhY2UtaW5kZW50IG9uOyBpbmRlbnQtd2lkdGggMjsgbWl4ZWRpbmRlbnQgb2ZmOyBpbmRlbnQtbW9kZSBjc3R5bGU7CisgKi8KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3JTeW1tZXRyeS9TeW1tZXRyeS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvclN5bW1ldHJ5L1N5bW1ldHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5ZDZjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3JTeW1tZXRyeS9TeW1tZXRyeS5oCkBAIC0wLDAgKzEsMzM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBDaHJpc3RpYW4gU2VpbGVyIDxjaHJpc3RpYW5AaXdha2QuZGU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RFTlNPUlNZTU1FVFJZX1NZTU1FVFJZX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfU1lNTUVUUllfSAorCituYW1lc3BhY2UgRWlnZW4geworCitlbnVtIHsKKyAgTmVnYXRpb25GbGFnICAgICAgICAgICA9IDB4MDEsCisgIENvbmp1Z2F0aW9uRmxhZyAgICAgICAgPSAweDAyCit9OworCitlbnVtIHsKKyAgR2xvYmFsUmVhbEZsYWcgICAgICAgICA9IDB4MDEsCisgIEdsb2JhbEltYWdGbGFnICAgICAgICAgPSAweDAyLAorICBHbG9iYWxaZXJvRmxhZyAgICAgICAgID0gMHgwMworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgTnVtSW5kaWNlcywgdHlwZW5hbWUuLi4gU3ltPiAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVuc29yX3N5bW1ldHJ5X3ByZV9hbmFseXNpczsKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IE51bUluZGljZXMsIHR5cGVuYW1lLi4uIFN5bT4gICAgICAgICAgICAgICAgICAgc3RydWN0IHRlbnNvcl9zdGF0aWNfc3ltZ3JvdXA7Cit0ZW1wbGF0ZTxib29sIGluc3RhbnRpYXRlLCBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzLCB0eXBlbmFtZS4uLiBTeW0+IHN0cnVjdCB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2lmOwordGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXz4gc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9jYWxjdWxhdGVfZmxhZ3M7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUZW5zb3JfPiBzdHJ1Y3QgdGVuc29yX3N5bW1ldHJ5X2Fzc2lnbl92YWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFN5bT4gc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9udW1faW5kaWNlczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPGludCBPbmVfLCBpbnQgVHdvXz4KK3N0cnVjdCBTeW1tZXRyeQoreworICBzdGF0aWNfYXNzZXJ0KE9uZV8gIT0gVHdvXywgIlN5bW1ldHJpZXMgbXVzdCBjb3ZlciBkaXN0aW5jdCBpbmRpY2VzLiIpOworICBjb25zdGV4cHIgc3RhdGljIGludCBPbmUgPSBPbmVfOworICBjb25zdGV4cHIgc3RhdGljIGludCBUd28gPSBUd29fOworICBjb25zdGV4cHIgc3RhdGljIGludCBGbGFncyA9IDA7Cit9OworCit0ZW1wbGF0ZTxpbnQgT25lXywgaW50IFR3b18+CitzdHJ1Y3QgQW50aVN5bW1ldHJ5Cit7CisgIHN0YXRpY19hc3NlcnQoT25lXyAhPSBUd29fLCAiU3ltbWV0cmllcyBtdXN0IGNvdmVyIGRpc3RpbmN0IGluZGljZXMuIik7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IE9uZSA9IE9uZV87CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IFR3byA9IFR3b187CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IEZsYWdzID0gTmVnYXRpb25GbGFnOworfTsKKwordGVtcGxhdGU8aW50IE9uZV8sIGludCBUd29fPgorc3RydWN0IEhlcm1pdGljaXR5Cit7CisgIHN0YXRpY19hc3NlcnQoT25lXyAhPSBUd29fLCAiU3ltbWV0cmllcyBtdXN0IGNvdmVyIGRpc3RpbmN0IGluZGljZXMuIik7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IE9uZSA9IE9uZV87CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IFR3byA9IFR3b187CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IEZsYWdzID0gQ29uanVnYXRpb25GbGFnOworfTsKKwordGVtcGxhdGU8aW50IE9uZV8sIGludCBUd29fPgorc3RydWN0IEFudGlIZXJtaXRpY2l0eQoreworICBzdGF0aWNfYXNzZXJ0KE9uZV8gIT0gVHdvXywgIlN5bW1ldHJpZXMgbXVzdCBjb3ZlciBkaXN0aW5jdCBpbmRpY2VzLiIpOworICBjb25zdGV4cHIgc3RhdGljIGludCBPbmUgPSBPbmVfOworICBjb25zdGV4cHIgc3RhdGljIGludCBUd28gPSBUd29fOworICBjb25zdGV4cHIgc3RhdGljIGludCBGbGFncyA9IENvbmp1Z2F0aW9uRmxhZyB8IE5lZ2F0aW9uRmxhZzsKK307CisKKy8qKiBcY2xhc3MgRHluYW1pY1NHcm91cAorICAqIFxpbmdyb3VwIFRlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIER5bmFtaWMgc3ltbWV0cnkgZ3JvdXAKKyAgKgorICAqIFRoZSAlRHluYW1pY1NHcm91cCBjbGFzcyByZXByZXNlbnRzIGEgc3ltbWV0cnkgZ3JvdXAgdGhhdCBuZWVkIG5vdCBiZSBrbm93biBhdAorICAqIGNvbXBpbGUgdGltZS4gSXQgaXMgdXNlZnVsIGlmIG9uZSB3YW50cyB0byBzdXBwb3J0IGFyYml0cmFyeSBydW4tdGltZSBkZWZpbmVhYmxlCisgICogc3ltbWV0cmllcyBmb3IgdGVuc29ycywgYnV0IGl0IGlzIGFsc28gaW5zdGFudGlhdGVkIGlmIGEgc3ltbWV0cnkgZ3JvdXAgaXMgZGVmaW5lZAorICAqIGF0IGNvbXBpbGUgdGltZSB0aGF0IHdvdWxkIGJlIGVpdGhlciB0b28gbGFyZ2UgZm9yIHRoZSBjb21waWxlciB0byByZWFzb25hYmx5CisgICogZ2VuZXJhdGUgKHVzaW5nIHRlbXBsYXRlcyB0byBjYWxjdWxhdGUgdGhpcyBhdCBjb21waWxlIHRpbWUgaXMgdmVyeSBpbmVmZmljaWVudCkKKyAgKiBvciB0aGF0IHRoZSBjb21waWxlciBjb3VsZCBnZW5lcmF0ZSB0aGUgZ3JvdXAgYnV0IHRoYXQgaXQgd291bGRuJ3QgbWFrZSBzZW5zZSB0bworICAqIHVucm9sbCB0aGUgbG9vcCBmb3Igc2V0dGluZyBjb2VmZmljaWVudHMgYW55bW9yZS4KKyAgKi8KK2NsYXNzIER5bmFtaWNTR3JvdXA7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJncworICAqIFxpbmdyb3VwIFRlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIER5bmFtaWMgc3ltbWV0cnkgZ3JvdXAsIGluaXRpYWxpemVkIGZyb20gdGVtcGxhdGUgYXJndW1lbnRzCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIGEgY2hpbGQgY2xhc3Mgb2YgRHluYW1pY1NHcm91cC4gSXQgdXNlcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzCisgICogc3BlY2lmaWVkIHRvIGluaXRpYWxpemUgaXRzZWxmLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUuLi4gR2VuPgorY2xhc3MgRHluYW1pY1NHcm91cEZyb21UZW1wbGF0ZUFyZ3M7CisKKy8qKiBcY2xhc3MgU3RhdGljU0dyb3VwCisgICogXGluZ3JvdXAgVGVuc29yU3ltbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3RhdGljIHN5bW1ldHJ5IGdyb3VwCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzeW1tZXRyeSBncm91cCB0aGF0IGlzIGtub3duIGFuZCByZXNvbHZlZCBjb21wbGV0ZWx5CisgICogYXQgY29tcGlsZSB0aW1lLiBJZGVhbGx5LCBubyBydW4tdGltZSBwZW5hbHR5IGlzIGluY3VycmVkIGNvbXBhcmVkIHRvIHRoZQorICAqIG1hbnVhbCB1bnJvbGxpbmcgb2YgdGhlIHN5bW1ldHJ5LgorICAqCisgICogPGI+PGk+Q0FVVElPTjo8L2k+PC9iPgorICAqCisgICogRG8gbm90IHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5IGZvciBsYXJnZSBzeW1tZXRyeSBncm91cHMuIFRoZSBjb21waWxlcgorICAqIG1heSBydW4gaW50byBhIGxpbWl0LCBvciBzZWdmYXVsdCBvciBpbiB0aGUgdmVyeSBsZWFzdCB3aWxsIHRha2UgYSB2ZXJ5LAorICAqIHZlcnksIHZlcnkgbG9uZyB0aW1lIHRvIGNvbXBpbGUgdGhlIGNvZGUuIFVzZSB0aGUgU0dyb3VwIGNsYXNzIGluc3RlYWQKKyAgKiBpZiB5b3Ugd2FudCBhIHN0YXRpYyBncm91cC4gVGhhdCBjbGFzcyBjb250YWlucyBsb2dpYyB0aGF0IHdpbGwKKyAgKiBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgRHluYW1pY1NHcm91cCBjbGFzcyBpbnN0ZWFkIGlmIHRoZSBzeW1tZXRyeQorICAqIGdyb3VwIGJlY29tZXMgdG9vIGxhcmdlLiAoSW4gdGhhdCBjYXNlLCB1bnJvbGxpbmcgbWF5IG5vdCBldmVuIGJlCisgICogYmVuZWZpY2lhbC4pCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBHZW4+CitjbGFzcyBTdGF0aWNTR3JvdXA7CisKKy8qKiBcY2xhc3MgU0dyb3VwCisgICogXGluZ3JvdXAgVGVuc29yU3ltbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgU3ltbWV0cnkgZ3JvdXAsIGluaXRpYWxpemVkIGZyb20gdGVtcGxhdGUgYXJndW1lbnRzCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzeW1tZXRyeSBncm91cCB3aG9zZSBnZW5lcmF0b3JzIGFyZSBhbHJlYWR5CisgICoga25vd24gYXQgY29tcGlsZSB0aW1lLiBJdCBtYXkgb3IgbWF5IG5vdCBiZSByZXNvbHZlZCBhdCBjb21waWxlIHRpbWUsCisgICogZGVwZW5kaW5nIG9uIHRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgZ3JvdXAuCisgICoKKyAgKiBcc2EgU3RhdGljU0dyb3VwCisgICogXHNhIER5bmFtaWNTR3JvdXAKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEdlbj4KK2NsYXNzIFNHcm91cCA6IHB1YmxpYyBpbnRlcm5hbDo6dGVuc29yX3N5bW1ldHJ5X3ByZV9hbmFseXNpczxpbnRlcm5hbDo6dGVuc29yX3N5bW1ldHJ5X251bV9pbmRpY2VzPEdlbi4uLj46OnZhbHVlLCBHZW4uLi4+Ojpyb290X3R5cGUKK3sKKyAgcHVibGljOgorICAgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgTnVtSW5kaWNlcyA9IGludGVybmFsOjp0ZW5zb3Jfc3ltbWV0cnlfbnVtX2luZGljZXM8R2VuLi4uPjo6dmFsdWU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dGVuc29yX3N5bW1ldHJ5X3ByZV9hbmFseXNpczxOdW1JbmRpY2VzLCBHZW4uLi4+Ojpyb290X3R5cGUgQmFzZTsKKworICAgIC8vIG1ha2Ugc3RhbmRhcmQgY29uc3RydWN0b3JzICsgYXNzaWdubWVudCBvcGVyYXRvcnMgcHVibGljCisgICAgaW5saW5lIFNHcm91cCgpIDogQmFzZSgpIHsgfQorICAgIGlubGluZSBTR3JvdXAoY29uc3QgU0dyb3VwPEdlbi4uLj4mIG90aGVyKSA6IEJhc2Uob3RoZXIpIHsgfQorICAgIGlubGluZSBTR3JvdXAoU0dyb3VwPEdlbi4uLj4mJiBvdGhlcikgOiBCYXNlKG90aGVyKSB7IH0KKyAgICBpbmxpbmUgU0dyb3VwPEdlbi4uLj4mIG9wZXJhdG9yPShjb25zdCBTR3JvdXA8R2VuLi4uPiYgb3RoZXIpIHsgQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsgcmV0dXJuICp0aGlzOyB9CisgICAgaW5saW5lIFNHcm91cDxHZW4uLi4+JiBvcGVyYXRvcj0oU0dyb3VwPEdlbi4uLj4mJiBvdGhlcikgeyBCYXNlOjpvcGVyYXRvcj0ob3RoZXIpOyByZXR1cm4gKnRoaXM7IH0KKworICAgIC8vIGFsbCBlbHNlIGlzIGRlZmluZWQgaW4gdGhlIGJhc2UgY2xhc3MKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFN5bT4gc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9udW1faW5kaWNlcworeworICBjb25zdGV4cHIgc3RhdGljIHN0ZDo6c2l6ZV90IHZhbHVlID0gMTsKK307CisKK3RlbXBsYXRlPGludCBPbmVfLCBpbnQgVHdvXywgdHlwZW5hbWUuLi4gU3ltPiBzdHJ1Y3QgdGVuc29yX3N5bW1ldHJ5X251bV9pbmRpY2VzPFN5bW1ldHJ5PE9uZV8sIFR3b18+LCBTeW0uLi4+Cit7Citwcml2YXRlOgorICBjb25zdGV4cHIgc3RhdGljIHN0ZDo6c2l6ZV90IE9uZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihPbmVfKTsKKyAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBUd28gPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oVHdvXyk7CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgVGhyZWUgPSB0ZW5zb3Jfc3ltbWV0cnlfbnVtX2luZGljZXM8U3ltLi4uPjo6dmFsdWU7CisKKyAgLy8gZG9uJ3QgdXNlIHN0ZDo6bWF4LCBzaW5jZSBpdCdzIG5vdCBjb25zdGV4cHIgdW50aWwgQysrMTQuLi4KKyAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBtYXhPbmVUd29QbHVzT25lID0gKChPbmUgPiBUd28pID8gT25lIDogVHdvKSArIDE7CitwdWJsaWM6CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgdmFsdWUgPSAobWF4T25lVHdvUGx1c09uZSA+IFRocmVlKSA/IG1heE9uZVR3b1BsdXNPbmUgOiBUaHJlZTsKK307CisKK3RlbXBsYXRlPGludCBPbmVfLCBpbnQgVHdvXywgdHlwZW5hbWUuLi4gU3ltPiBzdHJ1Y3QgdGVuc29yX3N5bW1ldHJ5X251bV9pbmRpY2VzPEFudGlTeW1tZXRyeTxPbmVfLCBUd29fPiwgU3ltLi4uPgorICA6IHB1YmxpYyB0ZW5zb3Jfc3ltbWV0cnlfbnVtX2luZGljZXM8U3ltbWV0cnk8T25lXywgVHdvXz4sIFN5bS4uLj4ge307Cit0ZW1wbGF0ZTxpbnQgT25lXywgaW50IFR3b18sIHR5cGVuYW1lLi4uIFN5bT4gc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9udW1faW5kaWNlczxIZXJtaXRpY2l0eTxPbmVfLCBUd29fPiwgU3ltLi4uPgorICA6IHB1YmxpYyB0ZW5zb3Jfc3ltbWV0cnlfbnVtX2luZGljZXM8U3ltbWV0cnk8T25lXywgVHdvXz4sIFN5bS4uLj4ge307Cit0ZW1wbGF0ZTxpbnQgT25lXywgaW50IFR3b18sIHR5cGVuYW1lLi4uIFN5bT4gc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9udW1faW5kaWNlczxBbnRpSGVybWl0aWNpdHk8T25lXywgVHdvXz4sIFN5bS4uLj4KKyAgOiBwdWJsaWMgdGVuc29yX3N5bW1ldHJ5X251bV9pbmRpY2VzPFN5bW1ldHJ5PE9uZV8sIFR3b18+LCBTeW0uLi4+IHt9OworCisvKiogXGludGVybmFsCisgICoKKyAgKiBcY2xhc3MgdGVuc29yX3N5bW1ldHJ5X3ByZV9hbmFseXNpcworICAqIFxpbmdyb3VwIFRlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIFByZS1zZWxlY3Qgd2hldGhlciB0byB1c2UgYSBzdGF0aWMgb3IgZHluYW1pYyBzeW1tZXRyeSBncm91cAorICAqCisgICogV2hlbiBhIHN5bW1ldHJ5IGdyb3VwIGNvdWxkIGluIHByaW5jaXBsZSBiZSBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwKKyAgKiB0aGlzIHRlbXBsYXRlIGltcGxlbWVudHMgdGhlIGxvZ2ljIHdoZXRoZXIgdG8gYWN0dWFsbHkgZG8gdGhhdCBvciB3aGV0aGVyCisgICogdG8gcmF0aGVyIGRlZmVyIHRoYXQgdG8gcnVudGltZS4KKyAgKgorICAqIFRoZSBsb2dpYyBpcyBhcyBmb2xsb3dzOgorICAqIDxkbD4KKyAgKiA8ZHQ+PGI+Tm8gZ2VuZXJhdG9ycyAodHJpdmlhbCBzeW1tZXRyeSk6PC9iPjwvZHQ+CisgICogPGRkPlVzZSBhIHRyaXZpYWwgc3RhdGljIGdyb3VwLiBJZGVhbGx5LCB0aGlzIGhhcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QKKyAgKiAgICAgY29tcGFyZWQgdG8gbm90IHVzaW5nIHN5bW1ldHJ5IGF0IGFsbC4gSW4gcHJhY3RpY2UsIHRoaXMgbWlnaHQgbm90CisgICogICAgIGJlIHRoZSBjYXNlLjwvZGQ+CisgICogPGR0PjxiPk1vcmUgdGhhbiA0IGdlbmVyYXRvcnM6PC9iPjwvZHQ+CisgICogPGRkPkNhbGN1bGF0ZSB0aGUgZ3JvdXAgYXQgcnVuIHRpbWUsIGl0IGlzIGxpa2VseSBmYXIgdG9vIGxhcmdlIGZvciB0aGUKKyAgKiAgICAgY29tcGlsZXIgdG8gYmUgYWJsZSB0byBwcm9wZXJseSBnZW5lcmF0ZSBpdCBpbiBhIHJlYWxpc3RpYyB0aW1lLjwvZGQ+CisgICogPGR0PjxiPlVwIHRvIGFuZCBpbmNsdWRpbmcgNCBnZW5lcmF0b3JzOjwvYj48L2R0PgorICAqIDxkZD5BY3R1YWxseSBlbnVtZXJhdGUgYWxsIGdyb3VwIGVsZW1lbnRzLCBidXQgdGhlbiBjaGVjayBob3cgbWFueSB0aGVyZQorICAqICAgICBhcmUuIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTYsIGl0IGlzIHVubGlrZWx5IHRoYXQgdW5yb2xsaW5nIHRoZQorICAqICAgICBsb29wIChhcyBpcyBkb25lIGluIHRoZSBzdGF0aWMgY29tcGlsZS10aW1lIGNhc2UpIGlzIHNlbnNpYmxlLCBzbworICAqICAgICB1c2UgYSBkeW5hbWljIGdyb3VwIGluc3RlYWQuIElmIHRoZXJlIGFyZSBhdCBtb3N0IDE2IGVsZW1lbnRzLCBhY3R1YWxseQorICAqICAgICB1c2UgdGhhdCBzdGF0aWMgZ3JvdXAuIE5vdGUgdGhhdCB0aGUgbGFyZ2VzdCBncm91cCB3aXRoIDQgZ2VuZXJhdG9ycworICAqICAgICBzdGlsbCBjb21waWxlcyB3aXRoIHJlYXNvbmFibGUgcmVzb3VyY2VzLjwvZGQ+CisgICogPC9kbD4KKyAgKgorICAqIE5vdGU6IEV4YW1wbGUgY29tcGlsZSB0aW1lIHBlcmZvcm1hbmNlIHdpdGggZysrLTQuNiBvbiBhbiBJbnRlbmwgQ29yZSBpNS0zNDcwCisgICogICAgICAgd2l0aCAxNiBHaUIgUkFNIChhbGwgZ2VuZXJhdG9ycyBub24tcmVkdW5kYW50IGFuZCB0aGUgc3ViZ3JvdXBzIGRvbid0CisgICogICAgICAgZmFjdG9yaXplKToKKyAgKgorICAqICAgICAgICAgICMgR2VuZXJhdG9ycyAgICAgICAgICAtTzAgLWdnZGIgICAgICAgICAgICAgICAtTzIKKyAgKiAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogICAgICAgICAgMSAgICAgICAgICAgICAgICAgMC41IHMgIC8gICAyNTAgTWlCICAgICAwLjQ1cyAvICAgMjMwIE1pQgorICAqICAgICAgICAgIDIgICAgICAgICAgICAgICAgIDAuNSBzICAvICAgMjYwIE1pQiAgICAgMC41IHMgLyAgIDI1MCBNaUIKKyAgKiAgICAgICAgICAzICAgICAgICAgICAgICAgICAwLjY1cyAgLyAgIDMxMCBNaUIgICAgIDAuNjJzIC8gICAzMTAgTWlCCisgICogICAgICAgICAgNCAgICAgICAgICAgICAgICAgMi4yIHMgIC8gICA4NjAgTWlCICAgICAxLjcgcyAvICAgNzcwIE1pQgorICAqICAgICAgICAgIDUgICAgICAgICAgICAgICAxMzAgICBzICAvIDEzMDAwIE1pQiAgIDEyMCAgIHMgLyAxMTAwMCBNaUIKKyAgKgorICAqIEl0IGlzIGNsZWFyIHRoYXQgZXZlcnl0aGluZyBpcyBzdGlsbCB2ZXJ5IGVmZmljaWVudCB1cCB0byA0IGdlbmVyYXRvcnMsIHRoZW4KKyAgKiB0aGUgbWVtb3J5IGFuZCBDUFUgcmVxdWlyZW1lbnRzIGJlY29tZSB1bnJlYXNvbmFibGUuIFRodXMgd2Ugb25seSBpbnN0YW50aWF0ZQorICAqIHRoZSB0ZW1wbGF0ZSBncm91cCB0aGVvcnkgbG9naWMgaWYgdGhlIG51bWJlciBvZiBnZW5lcmF0b3JzIHN1cHBsaWVkIGlzIDQgb3IKKyAgKiBsb3dlciwgb3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBmb3JjZWQgdG8gYmUgZG9uZSBkdXJpbmcgcnVudGltZSwgd2hlcmUgdGhlCisgICogYWxnb3JpdGhtIGlzIHJlYXNvbmFibHkgZmFzdC4KKyAgKi8KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IE51bUluZGljZXM+CitzdHJ1Y3QgdGVuc29yX3N5bW1ldHJ5X3ByZV9hbmFseXNpczxOdW1JbmRpY2VzPgoreworICB0eXBlZGVmIFN0YXRpY1NHcm91cDw+IHJvb3RfdHlwZTsKK307CisKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IE51bUluZGljZXMsIHR5cGVuYW1lIEdlbl8sIHR5cGVuYW1lLi4uIEdlbnNfPgorc3RydWN0IHRlbnNvcl9zeW1tZXRyeV9wcmVfYW5hbHlzaXM8TnVtSW5kaWNlcywgR2VuXywgR2Vuc18uLi4+Cit7CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgbWF4X3N0YXRpY19nZW5lcmF0b3JzID0gNDsKKyAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBtYXhfc3RhdGljX2VsZW1lbnRzID0gMTY7CisgIHR5cGVkZWYgdGVuc29yX3N0YXRpY19zeW1ncm91cF9pZjwoc2l6ZW9mLi4uKEdlbnNfKSArIDEgPD0gbWF4X3N0YXRpY19nZW5lcmF0b3JzKSwgTnVtSW5kaWNlcywgR2VuXywgR2Vuc18uLi4+IGhlbHBlcjsKKyAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBwb3NzaWJsZV9zaXplID0gaGVscGVyOjpzaXplOworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgcG9zc2libGVfc2l6ZSA9PSAwIHx8IHBvc3NpYmxlX3NpemUgPj0gbWF4X3N0YXRpY19lbGVtZW50cywKKyAgICBEeW5hbWljU0dyb3VwRnJvbVRlbXBsYXRlQXJnczxHZW5fLCBHZW5zXy4uLj4sCisgICAgdHlwZW5hbWUgaGVscGVyOjp0eXBlCisgID46OnR5cGUgcm9vdF90eXBlOworfTsKKwordGVtcGxhdGU8Ym9vbCBpbnN0YW50aWF0ZSwgc3RkOjpzaXplX3QgTnVtSW5kaWNlcywgdHlwZW5hbWUuLi4gR2Vucz4KK3N0cnVjdCB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2lmCit7CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3Qgc2l6ZSA9IDA7CisgIHR5cGVkZWYgdm9pZCB0eXBlOworfTsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgTnVtSW5kaWNlcywgdHlwZW5hbWUuLi4gR2Vucz4KK3N0cnVjdCB0ZW5zb3Jfc3RhdGljX3N5bWdyb3VwX2lmPHRydWUsIE51bUluZGljZXMsIEdlbnMuLi4+IDogdGVuc29yX3N0YXRpY19zeW1ncm91cDxOdW1JbmRpY2VzLCBHZW5zLi4uPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXz4KK3N0cnVjdCB0ZW5zb3Jfc3ltbWV0cnlfYXNzaWduX3ZhbHVlCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yXzo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yXzo6U2NhbGFyIFNjYWxhcjsKKyAgY29uc3RleHByIHN0YXRpYyBzdGQ6OnNpemVfdCBOdW1JbmRpY2VzID0gVGVuc29yXzo6TnVtSW5kaWNlczsKKworICBzdGF0aWMgaW5saW5lIGludCBydW4oY29uc3Qgc3RkOjphcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIHRyYW5zZm9ybWVkX2luZGljZXMsIGludCB0cmFuc2Zvcm1hdGlvbl9mbGFncywgaW50IGR1bW15LCBUZW5zb3JfJiB0ZW5zb3IsIGNvbnN0IFNjYWxhciYgdmFsdWVfKQorICB7CisgICAgU2NhbGFyIHZhbHVlKHZhbHVlXyk7CisgICAgaWYgKHRyYW5zZm9ybWF0aW9uX2ZsYWdzICYgQ29uanVnYXRpb25GbGFnKQorICAgICAgdmFsdWUgPSBudW1leHQ6OmNvbmoodmFsdWUpOworICAgIGlmICh0cmFuc2Zvcm1hdGlvbl9mbGFncyAmIE5lZ2F0aW9uRmxhZykKKyAgICAgIHZhbHVlID0gLXZhbHVlOworICAgIHRlbnNvci5jb2VmZlJlZih0cmFuc2Zvcm1lZF9pbmRpY2VzKSA9IHZhbHVlOworICAgIHJldHVybiBkdW1teTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVGVuc29yXz4KK3N0cnVjdCB0ZW5zb3Jfc3ltbWV0cnlfY2FsY3VsYXRlX2ZsYWdzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yXzo6SW5kZXggSW5kZXg7CisgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgTnVtSW5kaWNlcyA9IFRlbnNvcl86Ok51bUluZGljZXM7CisKKyAgc3RhdGljIGlubGluZSBpbnQgcnVuKGNvbnN0IHN0ZDo6YXJyYXk8SW5kZXgsIE51bUluZGljZXM+JiB0cmFuc2Zvcm1lZF9pbmRpY2VzLCBpbnQgdHJhbnNmb3JtX2ZsYWdzLCBpbnQgY3VycmVudF9mbGFncywgY29uc3Qgc3RkOjphcnJheTxJbmRleCwgTnVtSW5kaWNlcz4mIG9yaWdfaW5kaWNlcykKKyAgeworICAgIGlmICh0cmFuc2Zvcm1lZF9pbmRpY2VzID09IG9yaWdfaW5kaWNlcykgeworICAgICAgaWYgKHRyYW5zZm9ybV9mbGFncyAmIChDb25qdWdhdGlvbkZsYWcgfCBOZWdhdGlvbkZsYWcpKQorICAgICAgICByZXR1cm4gY3VycmVudF9mbGFncyB8IEdsb2JhbEltYWdGbGFnOyAvLyBhbnRpLWhlcm1pdGlhbiBkaWFnb25hbAorICAgICAgZWxzZSBpZiAodHJhbnNmb3JtX2ZsYWdzICYgQ29uanVnYXRpb25GbGFnKQorICAgICAgICByZXR1cm4gY3VycmVudF9mbGFncyB8IEdsb2JhbFJlYWxGbGFnOyAvLyBoZXJtaXRpYW4gZGlhZ29uYWwKKyAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybV9mbGFncyAmIE5lZ2F0aW9uRmxhZykKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRfZmxhZ3MgfCBHbG9iYWxaZXJvRmxhZzsgLy8gYW50aS1zeW1tZXRyaWMgZGlhZ29uYWwKKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnRfZmxhZ3M7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRlbnNvcl8sIHR5cGVuYW1lIFN5bW1ldHJ5XywgaW50IEZsYWdzID0gMD4KK2NsYXNzIHRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXIKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yXzo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JfOjpTY2FsYXIgU2NhbGFyOworICAgIGNvbnN0ZXhwciBzdGF0aWMgc3RkOjpzaXplX3QgTnVtSW5kaWNlcyA9IFRlbnNvcl86Ok51bUluZGljZXM7CisKKyAgICBpbmxpbmUgdGVuc29yX3N5bW1ldHJ5X3ZhbHVlX3NldHRlcihUZW5zb3JfJiB0ZW5zb3IsIFN5bW1ldHJ5XyBjb25zdCYgc3ltbWV0cnksIHN0ZDo6YXJyYXk8SW5kZXgsIE51bUluZGljZXM+IGNvbnN0JiBpbmRpY2VzKQorICAgICAgOiBtX3RlbnNvcih0ZW5zb3IpLCBtX3N5bW1ldHJ5KHN5bW1ldHJ5KSwgbV9pbmRpY2VzKGluZGljZXMpIHsgfQorCisgICAgaW5saW5lIHRlbnNvcl9zeW1tZXRyeV92YWx1ZV9zZXR0ZXI8VGVuc29yXywgU3ltbWV0cnlfLCBGbGFncz4mIG9wZXJhdG9yPShTY2FsYXIgY29uc3QmIHZhbHVlKQorICAgIHsKKyAgICAgIGRvQXNzaWduKHZhbHVlKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIHByaXZhdGU6CisgICAgVGVuc29yXyYgbV90ZW5zb3I7CisgICAgU3ltbWV0cnlfIG1fc3ltbWV0cnk7CisgICAgc3RkOjphcnJheTxJbmRleCwgTnVtSW5kaWNlcz4gbV9pbmRpY2VzOworCisgICAgaW5saW5lIHZvaWQgZG9Bc3NpZ24oU2NhbGFyIGNvbnN0JiB2YWx1ZSkKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fVEVOU09SX1NZTU1FVFJZX0NIRUNLX1ZBTFVFUworICAgICAgICBpbnQgdmFsdWVfZmxhZ3MgPSBtX3N5bW1ldHJ5LnRlbXBsYXRlIGFwcGx5PGludGVybmFsOjp0ZW5zb3Jfc3ltbWV0cnlfY2FsY3VsYXRlX2ZsYWdzPFRlbnNvcl8+LCBpbnQ+KG1faW5kaWNlcywgbV9zeW1tZXRyeS5nbG9iYWxGbGFncygpLCBtX2luZGljZXMpOworICAgICAgICBpZiAodmFsdWVfZmxhZ3MgJiBHbG9iYWxSZWFsRmxhZykKKyAgICAgICAgICBlaWdlbl9hc3NlcnQobnVtZXh0OjppbWFnKHZhbHVlKSA9PSAwKTsKKyAgICAgICAgaWYgKHZhbHVlX2ZsYWdzICYgR2xvYmFsSW1hZ0ZsYWcpCisgICAgICAgICAgZWlnZW5fYXNzZXJ0KG51bWV4dDo6cmVhbCh2YWx1ZSkgPT0gMCk7CisgICAgICAjZW5kaWYKKyAgICAgIG1fc3ltbWV0cnkudGVtcGxhdGUgYXBwbHk8aW50ZXJuYWw6OnRlbnNvcl9zeW1tZXRyeV9hc3NpZ25fdmFsdWU8VGVuc29yXz4sIGludD4obV9pbmRpY2VzLCAwLCBtX3RlbnNvciwgdmFsdWUpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NYWDExX1RFTlNPUlNZTU1FVFJZX1NZTU1FVFJZX0gKKworLyoKKyAqIGthdGU6IHNwYWNlLWluZGVudCBvbjsgaW5kZW50LXdpZHRoIDI7IG1peGVkaW5kZW50IG9mZjsgaW5kZW50LW1vZGUgY3N0eWxlOworICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvdXRpbC9UZW1wbGF0ZUdyb3VwVGhlb3J5LmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGVuc29yU3ltbWV0cnkvdXRpbC9UZW1wbGF0ZUdyb3VwVGhlb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlMGI3YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UZW5zb3JTeW1tZXRyeS91dGlsL1RlbXBsYXRlR3JvdXBUaGVvcnkuaApAQCAtMCwwICsxLDY2NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9URU5TT1JTWU1NRVRSWV9URU1QTEFURUdST1VQVEhFT1JZX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfVEVNUExBVEVHUk9VUFRIRU9SWV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK25hbWVzcGFjZSBncm91cF90aGVvcnkgeworCisvKiogXGludGVybmFsCisgICogXGZpbGUgQ1hYMTEvVGVuc29yL3V0aWwvVGVtcGxhdGVHcm91cFRoZW9yeS5oCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIEMrKyB0ZW1wbGF0ZXMgdGhhdCBpbXBsZW1lbnQgZ3JvdXAgdGhlb3J5IGFsZ29yaXRobXMuCisgICoKKyAgKiBUaGUgYWxnb3JpdGhtcyBhbGxvdyBmb3IgYSBjb21waWxlLXRpbWUgYW5hbHlzaXMgb2YgZmluaXRlIGdyb3Vwcy4KKyAgKgorICAqIEN1cnJlbnRseSBvbmx5IERpbWlubydzIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCwgd2hpY2ggcmV0dXJucyBhIGxpc3QKKyAgKiBvZiBhbGwgZWxlbWVudHMgaW4gYSBncm91cCBnaXZlbiBhIHNldCBvZiAocG9zc2libHkgcmVkdW5kYW50KSBnZW5lcmF0b3JzLgorICAqIChPbmUgY291bGQgYWxzbyBkbyB0aGF0IHdpdGggdGhlIHNvLWNhbGxlZCBvcmJpdGFsIGFsZ29yaXRobSwgYnV0IHRoYXQKKyAgKiBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIGFuZCB1c3VhbGx5IGhhcyBubyBhZHZhbnRhZ2VzLikKKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICJPayBraWQsIGhlcmUgaXMgd2hlcmUgaXQgZ2V0cyBjb21wbGljYXRlZC4iCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtIEFtZWxpYSBQb25kIGluIHRoZSAiRG9jdG9yIFdobyIgZXBpc29kZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEJpZyBCYW5nIgorICoKKyAqIERpbWlubydzIGFsZ29yaXRobQorICogPT09PT09PT09PT09PT09PT09CisgKgorICogVGhlIGZvbGxvd2luZyBpcyBEaW1pbm8ncyBhbGdvcml0aG0gaW4gc2VxdWVudGlhbCBmb3JtOgorICoKKyAqIElucHV0OiBpZGVudGl0eSBlbGVtZW50LCBsaXN0IG9mIGdlbmVyYXRvcnMsIGVxdWFsaXR5IGNoZWNrLAorICogICAgICAgIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbgorICogT3V0cHV0OiBsaXN0IG9mIGdyb3VwIGVsZW1lbnRzCisgKgorICogMS4gYWRkIGlkZW50aXR5IGVsZW1lbnQKKyAqIDIuIHJlbW92ZSBpZGVudGl0aWVzIGZyb20gbGlzdCBvZiBnZW5lcmF0b3JzCisgKiAzLiBhZGQgYWxsIHBvd2VycyBvZiBmaXJzdCBnZW5lcmF0b3IgdGhhdCBhcmVuJ3QgdGhlCisgKiAgICBpZGVudGl0eSBlbGVtZW50CisgKiA0LiBnbyB0aHJvdWdoIGFsbCByZW1haW5pbmcgZ2VuZXJhdG9yczoKKyAqICAgICAgICBhLiBpZiBnZW5lcmF0b3IgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBvZiBlbGVtZW50cworICogICAgICAgICAgICAgICAgLT4gZG8gbm90aGluZworICogICAgICAgIGIuIG90aGVyd2lzZQorICogICAgICAgICAgICAgICAgaS4gICByZW1lbWJlciBjdXJyZW50ICMgb2YgZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc3ViZ3JvdXApCisgKiAgICAgICAgICAgICAgICBpaS4gIGFkZCBhbGwgY3VycmVudCBlbGVtZW50cyAod2hpY2ggaW5jbHVkZXMKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIGlkZW50aXR5KSBlYWNoIG11bHRpcGxpZWQgZnJvbSByaWdodAorICogICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IGdlbmVyYXRvciB0byB0aGUgZ3JvdXAKKyAqICAgICAgICAgICAgICAgIGlpaS4gYWRkIGFsbCByZW1haW5pbmcgY29zZXRzIHRoYXQgYXJlIGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgICAgICBieSBwcm9kdWN0cyBvZiB0aGUgbmV3IGdlbmVyYXRvciB3aXRoIGl0c2VsZgorICogICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIG90aGVyIGdlbmVyYXRvcnMgc2VlbiBzbyBmYXIKKyAqCisgKiBJbiBmdW5jdGlvbmFsIGZvcm0sIHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBsb25nIHNldCBvZiByZWN1cnNpdmUKKyAqIHRlbXBsYXRlcyB0aGF0IGhhdmUgYSBjb21wbGljYXRlZCByZWxhdGlvbnNoaXAuCisgKgorICogVGhlIG1haW4gaW50ZXJmYWNlIGZvciBEaW1pbm8ncyBhbGdvcml0aG0gaXMgdGhlIHRlbXBsYXRlCisgKiBlbnVtZXJhdGVfZ3JvdXBfZWxlbWVudHMuIEFsbCBsaXN0cyBhcmUgaW1wbGVtZW50ZWQgYXMgdmFyaWFkaWMKKyAqIHR5cGVfbGlzdDx0eXBlbmFtZS4uLj4gYW5kIG51bWVyaWNfbGlzdDx0eXBlbmFtZSA9IGludCwgaW50Li4uPgorICogdGVtcGxhdGVzLgorICoKKyAqICdDYWxsaW5nJyB0ZW1wbGF0ZXMgaXMgdXN1YWxseSBkb25lIHZpYSB0eXBlZGVmcy4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSBpcyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBiYXNpYyB2ZXJzaW9uLiBUaGUKKyAqIGV4dGVuc2lvbiBjb25zaXN0cyBpbiB0aGUgZmFjdCB0aGF0IGVhY2ggZ3JvdXAgZWxlbWVudCBoYXMgYSBzZXQKKyAqIG9mIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBpdC4gTXVsdGlwbGljYXRpb24gb2YgdHdvIGdyb3VwIGVsZW1lbnRzCisgKiB3aXRoIGVhY2ggb3RoZXIgcmVzdWx0cyBpbiBhIGdyb3VwIGVsZW1lbnQgd2hvc2UgZmxhZ3MgYXJlIHRoZQorICogWE9SIG9mIHRoZSBmbGFncyBvZiB0aGUgcHJldmlvdXMgZWxlbWVudHMuIEVhY2ggdGltZSB0aGUgYWxnb3JpdGhtCisgKiBub3RpY2VzIHRoYXQgYSBncm91cCBlbGVtZW50IGl0IGp1c3QgY2FsY3VsYXRlZCBpcyBhbHJlYWR5IGluIHRoZQorICogbGlzdCBvZiBjdXJyZW50IGVsZW1lbnRzLCB0aGUgZmxhZ3Mgb2YgYm90aCB3aWxsIGJlIGNvbXBhcmVkIGFuZAorICogYWRkZWQgdG8gdGhlIHNvLWNhbGxlZCAnZ2xvYmFsIGZsYWdzJyBvZiB0aGUgZ3JvdXAuCisgKgorICogVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBleHRlbnNpb24gaXMgdGhhdCB0aGlzIGFsbG93cyBub3Qgb25seQorICogZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBzeW1tZXRyaWVzIGJldHdlZW4gdGVuc29yIGluZGljZXMsIGJ1dAorICogYWxzbyBhbGxvd3MgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBoZXJtaXRpY2l0eSwgYW50aXN5bW1ldHJ5IGFuZAorICogYW50aWhlcm1pdGljaXR5LiBOZWdhdGlvbiBhbmQgY29uanVnYXRpb24gZWFjaCBhcmUgc3BlY2lmaWMgYml0CisgKiBpbiB0aGUgZmxhZ3MgdmFsdWUgYW5kIGlmIHR3byBkaWZmZXJlbnQgd2F5cyB0byByZWFjaCBhIGdyb3VwCisgKiBlbGVtZW50IGxlYWQgdG8gdHdvIGRpZmZlcmVudCBmbGFncywgdGhpcyBwb3NlcyBhIGNvbnN0cmFpbnQgb24KKyAqIHRoZSBhbGxvd2VkIHZhbHVlcyBvZiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRm9yIGV4YW1wbGUsIGlmIGEKKyAqIGdyb3VwIGVsZW1lbnQgaXMgcmVhY2ggYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBjb25qdWdhdGlvbgorICogZmxhZ3MsIGl0IGlzIGNsZWFyIHRoYXQgdGhlIHJlc3VsdGluZyB0ZW5zb3IgaGFzIHRvIGJlIHJlYWwuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZmxhZyBtZWNoYW5pc20gaXMgcXVpdGUgZ2VuZXJpYyBhbmQgbWF5IGhhdmUgb3RoZXIKKyAqIHVzZXMgYmV5b25kIHRlbnNvciBwcm9wZXJ0aWVzLgorICoKKyAqIElNUE9SVEFOVDogCisgKiAgICAgVGhpcyBhbGdvcml0aG0gYXNzdW1lcyB0aGUgZ3JvdXAgdG8gYmUgZmluaXRlLiBJZiB5b3UgdHJ5IHRvCisgKiAgICAgcnVuIGl0IHdpdGggYSBncm91cCB0aGF0J3MgaW5maW5pdGUsIHRoZSBhbGdvcml0aG0gd2lsbCBvbmx5CisgKiAgICAgdGVybWluYXRlIG9uY2UgeW91IGhpdCBhIGNvbXBpbGVyIGxpbWl0IChtYXggdGVtcGxhdGUgZGVwdGgpLgorICogICAgIEFsc28gbm90ZSB0aGF0IHRyeWluZyB0byB1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgYQorICogICAgIHZlcnkgbGFyZ2UgZ3JvdXAgd2lsbCBwcm9iYWJseSBlaXRoZXIgbWFrZSB5b3UgaGl0IHRoZSBzYW1lCisgKiAgICAgbGltaXQsIGNhdXNlIHRoZSBjb21waWxlciB0byBzZWdmYXVsdCBvciBhdCB0aGUgdmVyeSBsZWFzdAorICogICAgIHRha2UgYSAqcmVhbGx5KiBsb25nIHRpbWUgKGhvdXJzLCBkYXlzLCB3ZWVrcyAtIHNpYyEpIHRvCisgKiAgICAgY29tcGlsZS4gSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHBsdWcgaW4gbW9yZSB0aGFuIDQKKyAqICAgICBnZW5lcmF0b3JzLCB1bmxlc3MgdGhleSBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4KKyAqLworCisvKiogXGludGVybmFsCisgICoKKyAgKiBcY2xhc3Mgc3RyaXBfaWRlbnRpdGllcworICAqIFxpbmdyb3VwIENYWDExX1RlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIENsZWFuc2UgYSBsaXN0IG9mIGdyb3VwIGVsZW1lbnRzIG9mIHRoZSBpZGVudGl0eSBlbGVtZW50CisgICoKKyAgKiBUaGlzIHRlbXBsYXRlIGlzIHVzZWQgdG8gbWFrZSBhIGZpcnN0IHBhc3MgdGhyb3VnaCBhbGwgaW5pdGlhbAorICAqIGdlbmVyYXRvcnMgb2YgRGltaW5vJ3MgYWxnb3JpdGhtIGFuZCByZW1vdmUgdGhlIGlkZW50aXR5CisgICogZWxlbWVudHMuCisgICoKKyAgKiBcc2EgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzCisgICovCit0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LCB0eXBlbmFtZSBpZCwgdHlwZW5hbWUgTD4gc3RydWN0IHN0cmlwX2lkZW50aXRpZXM7CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgdCwKKyAgdHlwZW5hbWUuLi4gdHMKKz4KK3N0cnVjdCBzdHJpcF9pZGVudGl0aWVzPEVxdWFsaXR5LCBpZCwgdHlwZV9saXN0PHQsIHRzLi4uPj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICBFcXVhbGl0eTxpZCwgdD46OnZhbHVlLAorICAgIHR5cGVuYW1lIHN0cmlwX2lkZW50aXRpZXM8RXF1YWxpdHksIGlkLCB0eXBlX2xpc3Q8dHMuLi4+Pjo6dHlwZSwKKyAgICB0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PHQ+LCB0eXBlbmFtZSBzdHJpcF9pZGVudGl0aWVzPEVxdWFsaXR5LCBpZCwgdHlwZV9saXN0PHRzLi4uPj46OnR5cGU+Ojp0eXBlCisgID46OnR5cGUgdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gRXF1YWxpdHk8aWQsIHQ+OjpnbG9iYWxfZmxhZ3MgfCBzdHJpcF9pZGVudGl0aWVzPEVxdWFsaXR5LCBpZCwgdHlwZV9saXN0PHRzLi4uPj46Omdsb2JhbF9mbGFnczsKK307CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZAorICBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX0RFRkModHlwZW5hbWUsIHRzKQorPgorc3RydWN0IHN0cmlwX2lkZW50aXRpZXM8RXF1YWxpdHksIGlkLCB0eXBlX2xpc3Q8RUlHRU5fVFBMX1BQX1NQRUNfSEFDS19VU0UodHMpPj4KK3sKKyAgdHlwZWRlZiB0eXBlX2xpc3Q8PiB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19maXJzdF9zdGVwX2VsZW1lbnRzX2hlbHBlciAKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JTeW1tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBSZWN1cnNpdmUgdGVtcGxhdGUgdGhhdCBhZGRzIHBvd2VycyBvZiB0aGUgZmlyc3QgZ2VuZXJhdG9yIHRvIHRoZSBsaXN0IG9mIGdyb3VwIGVsZW1lbnRzCisgICoKKyAgKiBUaGlzIHRlbXBsYXRlIGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB0byBhZGQgcG93ZXJzIG9mIHRoZSBmaXJzdAorICAqIGdlbmVyYXRvciB0byB0aGUgbGlzdCBvZiBncm91cCBlbGVtZW50cy4gSXQgc3RvcHMgaWYgaXQgcmVhY2hlcworICAqIHRoZSBpZGVudGl0eSBlbGVtZW50IGFnYWluLgorICAqCisgICogXHNhIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50cywgZGltaW5vX2ZpcnN0X3N0ZXBfZWxlbWVudHMKKyAgKi8KK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgZywKKyAgdHlwZW5hbWUgY3VycmVudF9lbGVtZW50LAorICB0eXBlbmFtZSBlbGVtZW50cywKKyAgYm9vbCBkb250X2FkZF9jdXJyZW50X2VsZW1lbnQgICAvLyA9IGZhbHNlCis+CitzdHJ1Y3QgZGltaW5vX2ZpcnN0X3N0ZXBfZWxlbWVudHNfaGVscGVyIDoKKyAgcHVibGljIGRpbWlub19maXJzdF9zdGVwX2VsZW1lbnRzX2hlbHBlcjwKKyAgICBNdWx0aXBseSwKKyAgICBFcXVhbGl0eSwKKyAgICBpZCwKKyAgICBnLAorICAgIHR5cGVuYW1lIE11bHRpcGx5PGN1cnJlbnRfZWxlbWVudCwgZz46OnR5cGUsCisgICAgdHlwZW5hbWUgY29uY2F0PGVsZW1lbnRzLCB0eXBlX2xpc3Q8Y3VycmVudF9lbGVtZW50Pj46OnR5cGUsCisgICAgRXF1YWxpdHk8dHlwZW5hbWUgTXVsdGlwbHk8Y3VycmVudF9lbGVtZW50LCBnPjo6dHlwZSwgaWQ+Ojp2YWx1ZQorICA+IHt9OworCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBNdWx0aXBseSwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBFcXVhbGl0eSwKKyAgdHlwZW5hbWUgaWQsCisgIHR5cGVuYW1lIGcsCisgIHR5cGVuYW1lIGN1cnJlbnRfZWxlbWVudCwKKyAgdHlwZW5hbWUgZWxlbWVudHMKKz4KK3N0cnVjdCBkaW1pbm9fZmlyc3Rfc3RlcF9lbGVtZW50c19oZWxwZXI8TXVsdGlwbHksIEVxdWFsaXR5LCBpZCwgZywgY3VycmVudF9lbGVtZW50LCBlbGVtZW50cywgdHJ1ZT4KK3sKKyAgdHlwZWRlZiBlbGVtZW50cyB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSBFcXVhbGl0eTxjdXJyZW50X2VsZW1lbnQsIGlkPjo6Z2xvYmFsX2ZsYWdzOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19maXJzdF9zdGVwX2VsZW1lbnRzCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yU3ltbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQWRkIGFsbCBwb3dlcnMgb2YgdGhlIGZpcnN0IGdlbmVyYXRvciB0byB0aGUgbGlzdCBvZiBncm91cCBlbGVtZW50cworICAqCisgICogVGhpcyB0ZW1wbGF0ZSB0YWtlcyB0aGUgZmlyc3Qgbm9uLWlkZW50aXR5IGdlbmVyYXRvciBhbmQgZ2VuZXJhdGVzIHRoZSBpbml0aWFsCisgICogbGlzdCBvZiBlbGVtZW50cyB3aGljaCBjb25zaXN0cyBvZiBhbGwgcG93ZXJzIG9mIHRoYXQgZ2VuZXJhdG9yLiBGb3IgYSBncm91cAorICAqIHdpdGgganVzdCBvbmUgZ2VuZXJhdGVkLCBpdCB3b3VsZCBiZSBlbnVtZXJhdGVkIGFmdGVyIHRoaXMuCisgICoKKyAgKiBcc2EgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzCisgICovCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBNdWx0aXBseSwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBFcXVhbGl0eSwKKyAgdHlwZW5hbWUgaWQsCisgIHR5cGVuYW1lIGdlbmVyYXRvcnMKKz4KK3N0cnVjdCBkaW1pbm9fZmlyc3Rfc3RlcF9lbGVtZW50cworeworICB0eXBlZGVmIHR5cGVuYW1lIGdldDwwLCBnZW5lcmF0b3JzPjo6dHlwZSBmaXJzdF9nZW5lcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2tpcDwxLCBnZW5lcmF0b3JzPjo6dHlwZSBuZXh0X2dlbmVyYXRvcnM7CisgIHR5cGVkZWYgdHlwZV9saXN0PGZpcnN0X2dlbmVyYXRvcj4gZ2VuZXJhdG9yc19kb25lOworCisgIHR5cGVkZWYgZGltaW5vX2ZpcnN0X3N0ZXBfZWxlbWVudHNfaGVscGVyPAorICAgIE11bHRpcGx5LAorICAgIEVxdWFsaXR5LAorICAgIGlkLAorICAgIGZpcnN0X2dlbmVyYXRvciwKKyAgICBmaXJzdF9nZW5lcmF0b3IsCisgICAgdHlwZV9saXN0PGlkPiwKKyAgICBmYWxzZQorICA+IGhlbHBlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBoZWxwZXI6OnR5cGUgdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gaGVscGVyOjpnbG9iYWxfZmxhZ3M7Cit9OworCisvKiogXGludGVybmFsCisgICoKKyAgKiBcY2xhc3MgZGltaW5vX2dldF9jb3NldF9lbGVtZW50cworICAqIFxpbmdyb3VwIENYWDExX1RlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyYXRlIGFsbCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIGNvc2V0CisgICoKKyAgKiBUaGlzIHRlbXBsYXRlIGdlbmVyYXRlcyBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgY29zZXQgYnkKKyAgKiBtdWx0aXBseWluZyBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHN1Ymdyb3VwIHdpdGggdGhlIG5ldworICAqIGNvc2V0IHJlcHJlc2VudGF0aXZlLiBOb3RlIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlCisgICogc3ViZ3JvdXAgaXMgYWx3YXlzIHRoZSBpZGVudGl0eSBlbGVtZW50LCBzbyB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAqIHRoZXIgcmVzdWx0IG9mIHRoaXMgdGVtcGxhdGUgaXMgZ29pbmcgdG8gYmUgdGhlIGNvc2V0CisgICogcmVwcmVzZW50YXRpdmUgaXRzZWxmLgorICAqCisgICogTm90ZSB0aGF0IHRoaXMgdGVtcGxhdGUgYWNjZXB0cyBhbiBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyCisgICogdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgY29zZXQgKHRydWUpIG9yCisgICoganVzdCByZXR1cm4gYW4gZW1wdHkgbGlzdCAoZmFsc2UpLgorICAqCisgICogXHNhIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50cywgZGltaW5vX2FkZF9jb3NldHNfZm9yX3JlcAorICAqLwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgTXVsdGlwbHksCisgIHR5cGVuYW1lIHN1Yl9ncm91cF9lbGVtZW50cywKKyAgdHlwZW5hbWUgbmV3X2Nvc2V0X3JlcCwKKyAgYm9vbCBnZW5lcmF0ZV9jb3NldCAgICAgIC8vID0gdHJ1ZQorPgorc3RydWN0IGRpbWlub19nZXRfY29zZXRfZWxlbWVudHMKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBhcHBseV9vcF9mcm9tX3JpZ2h0PE11bHRpcGx5LCBuZXdfY29zZXRfcmVwLCBzdWJfZ3JvdXBfZWxlbWVudHM+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBNdWx0aXBseSwKKyAgdHlwZW5hbWUgc3ViX2dyb3VwX2VsZW1lbnRzLAorICB0eXBlbmFtZSBuZXdfY29zZXRfcmVwCis+CitzdHJ1Y3QgZGltaW5vX2dldF9jb3NldF9lbGVtZW50czxNdWx0aXBseSwgc3ViX2dyb3VwX2VsZW1lbnRzLCBuZXdfY29zZXRfcmVwLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlX2xpc3Q8PiB0eXBlOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19hZGRfY29zZXRzX2Zvcl9yZXAKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JTeW1tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBSZWN1cnNpdmUgdGVtcGxhdGUgZm9yIGFkZGluZyBjb3NldCBzcGFjZXMKKyAgKgorICAqIFRoaXMgdGVtcGxhdGUgbXVsdGlwbGllcyB0aGUgY29zZXQgcmVwcmVzZW50YXRpdmUgd2l0aCBhIGdlbmVyYXRvcgorICAqIGZyb20gdGhlIGxpc3Qgb2YgcHJldmlvdXMgZ2VuZXJhdG9ycy4gSWYgdGhlIG5ldyBlbGVtZW50IGlzIG5vdCBpbgorICAqIHRoZSBncm91cCBhbHJlYWR5LCBpdCBhZGRzIHRoZSBjb3JyZXNwb25kaW5nIGNvc2V0LiBGaW5hbGx5IGl0CisgICogcHJvY2VlZHMgdG8gY2FsbCBpdHNlbGYgd2l0aCB0aGUgbmV4dCBnZW5lcmF0b3IgZnJvbSB0aGUgbGlzdC4KKyAgKgorICAqIFxzYSBlbnVtZXJhdGVfZ3JvdXBfZWxlbWVudHMsIGRpbWlub19hZGRfYWxsX2Nvc2V0X3NwYWNlcworICAqLwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgTXVsdGlwbHksCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgRXF1YWxpdHksCisgIHR5cGVuYW1lIGlkLAorICB0eXBlbmFtZSBzdWJfZ3JvdXBfZWxlbWVudHMsCisgIHR5cGVuYW1lIGVsZW1lbnRzLAorICB0eXBlbmFtZSBnZW5lcmF0b3JzLAorICB0eXBlbmFtZSByZXBfZWxlbWVudCwKKyAgaW50IHN1Yl9ncm91cF9zaXplCis+CitzdHJ1Y3QgZGltaW5vX2FkZF9jb3NldHNfZm9yX3JlcDsKKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgTXVsdGlwbHksCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgRXF1YWxpdHksCisgIHR5cGVuYW1lIGlkLAorICB0eXBlbmFtZSBzdWJfZ3JvdXBfZWxlbWVudHMsCisgIHR5cGVuYW1lIGVsZW1lbnRzLAorICB0eXBlbmFtZSBnLAorICB0eXBlbmFtZS4uLiBncywKKyAgdHlwZW5hbWUgcmVwX2VsZW1lbnQsCisgIGludCBzdWJfZ3JvdXBfc2l6ZQorPgorc3RydWN0IGRpbWlub19hZGRfY29zZXRzX2Zvcl9yZXA8TXVsdGlwbHksIEVxdWFsaXR5LCBpZCwgc3ViX2dyb3VwX2VsZW1lbnRzLCBlbGVtZW50cywgdHlwZV9saXN0PGcsIGdzLi4uPiwgcmVwX2VsZW1lbnQsIHN1Yl9ncm91cF9zaXplPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE11bHRpcGx5PHJlcF9lbGVtZW50LCBnPjo6dHlwZSBuZXdfY29zZXRfcmVwOworICB0eXBlZGVmIGNvbnRhaW5lZF9pbl9saXN0X2dmPEVxdWFsaXR5LCBuZXdfY29zZXRfcmVwLCBlbGVtZW50cz4gX2NpbDsKKyAgY29uc3RleHByIHN0YXRpYyBib29sIGFkZF9jb3NldCA9ICFfY2lsOjp2YWx1ZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGRpbWlub19nZXRfY29zZXRfZWxlbWVudHM8CisgICAgTXVsdGlwbHksCisgICAgc3ViX2dyb3VwX2VsZW1lbnRzLAorICAgIG5ld19jb3NldF9yZXAsCisgICAgYWRkX2Nvc2V0CisgID46OnR5cGUgY29zZXRfZWxlbWVudHM7CisKKyAgdHlwZWRlZiBkaW1pbm9fYWRkX2Nvc2V0c19mb3JfcmVwPAorICAgIE11bHRpcGx5LAorICAgIEVxdWFsaXR5LAorICAgIGlkLAorICAgIHN1Yl9ncm91cF9lbGVtZW50cywKKyAgICB0eXBlbmFtZSBjb25jYXQ8ZWxlbWVudHMsIGNvc2V0X2VsZW1lbnRzPjo6dHlwZSwKKyAgICB0eXBlX2xpc3Q8Z3MuLi4+LAorICAgIHJlcF9lbGVtZW50LAorICAgIHN1Yl9ncm91cF9zaXplCisgID4gX2hlbHBlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9oZWxwZXI6OnR5cGUgdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gX2NpbDo6Z2xvYmFsX2ZsYWdzIHwgX2hlbHBlcjo6Z2xvYmFsX2ZsYWdzOworCisgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSBnbG9iYWwgZmxhZ3MgaGVyZSwgc2luY2UKKyAgICogd2Ugd2lsbCBvbmx5IGFkZCB0aGVzZSBlbGVtZW50cyBpZiB0aGV5IGFyZSBub3QgcGFydCBvZgorICAgKiB0aGUgZ3JvdXAgYWxyZWFkeS4gQnV0IHRoYXQgb25seSBoYXBwZW5zIGlmIHRoZSBjb3NldCByZXAKKyAgICogaXMgbm90IGFscmVhZHkgaW4gdGhlIGdyb3VwLCBzbyB0aGUgY2hlY2sgZm9yIHRoZSBjb3NldCByZXAKKyAgICogd2lsbCBjYXRjaCB0aGlzLgorICAgKi8KK307CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgc3ViX2dyb3VwX2VsZW1lbnRzLAorICB0eXBlbmFtZSBlbGVtZW50cworICBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX0RFRkModHlwZW5hbWUsIGVtcHR5KSwKKyAgdHlwZW5hbWUgcmVwX2VsZW1lbnQsCisgIGludCBzdWJfZ3JvdXBfc2l6ZQorPgorc3RydWN0IGRpbWlub19hZGRfY29zZXRzX2Zvcl9yZXA8TXVsdGlwbHksIEVxdWFsaXR5LCBpZCwgc3ViX2dyb3VwX2VsZW1lbnRzLCBlbGVtZW50cywgdHlwZV9saXN0PEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfVVNFKGVtcHR5KT4sIHJlcF9lbGVtZW50LCBzdWJfZ3JvdXBfc2l6ZT4KK3sKKyAgdHlwZWRlZiBlbGVtZW50cyB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19hZGRfYWxsX2Nvc2V0X3NwYWNlcworICAqIFxpbmdyb3VwIENYWDExX1RlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIFJlY3Vyc2l2ZSB0ZW1wbGF0ZSBmb3IgYWRkaW5nIGFsbCBjb3NldCBzcGFjZXMgZm9yIGEgbmV3IGdlbmVyYXRvcgorICAqCisgICogVGhpcyB0ZW1wbGF0ZSB0cmllcyB0byBnbyB0aHJvdWdoIHRoZSBsaXN0IG9mIGdlbmVyYXRvcnMgKHdpdGgKKyAgKiB0aGUgaGVscCBvZiB0aGUgZGltaW5vX2FkZF9jb3NldHNfZm9yX3JlcCB0ZW1wbGF0ZSkgYXMgbG9uZyBhcworICAqIGl0IHN0aWxsIGZpbmRzIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBncm91cCBhbmQgYWRkCisgICogdGhlIGNvcnJlc3BvbmRpbmcgY29zZXRzLgorICAqCisgICogXHNhIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50cywgZGltaW5vX2FkZF9jb3NldHNfZm9yX3JlcAorICAqLwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgTXVsdGlwbHksCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgRXF1YWxpdHksCisgIHR5cGVuYW1lIGlkLAorICB0eXBlbmFtZSBzdWJfZ3JvdXBfZWxlbWVudHMsCisgIHR5cGVuYW1lIGVsZW1lbnRzLAorICB0eXBlbmFtZSBnZW5lcmF0b3JzLAorICBpbnQgc3ViX2dyb3VwX3NpemUsCisgIGludCByZXBfcG9zLAorICBib29sIHN0b3BfY29uZGl0aW9uICAgICAgICAvLyA9IGZhbHNlCis+CitzdHJ1Y3QgZGltaW5vX2FkZF9hbGxfY29zZXRfc3BhY2VzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ2V0PHJlcF9wb3MsIGVsZW1lbnRzPjo6dHlwZSByZXBfZWxlbWVudDsKKyAgdHlwZWRlZiBkaW1pbm9fYWRkX2Nvc2V0c19mb3JfcmVwPAorICAgIE11bHRpcGx5LAorICAgIEVxdWFsaXR5LAorICAgIGlkLAorICAgIHN1Yl9ncm91cF9lbGVtZW50cywKKyAgICBlbGVtZW50cywKKyAgICBnZW5lcmF0b3JzLAorICAgIHJlcF9lbGVtZW50LAorICAgIHN1Yl9ncm91cF9lbGVtZW50czo6Y291bnQKKyAgPiBfYWM0cjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfYWM0cjo6dHlwZSBuZXdfZWxlbWVudHM7CisgIAorICBjb25zdGV4cHIgc3RhdGljIGludCBuZXdfcmVwX3BvcyA9IHJlcF9wb3MgKyBzdWJfZ3JvdXBfZWxlbWVudHM6OmNvdW50OworICBjb25zdGV4cHIgc3RhdGljIGJvb2wgbmV3X3N0b3BfY29uZGl0aW9uID0gbmV3X3JlcF9wb3MgPj0gbmV3X2VsZW1lbnRzOjpjb3VudDsKKworICB0eXBlZGVmIGRpbWlub19hZGRfYWxsX2Nvc2V0X3NwYWNlczwKKyAgICBNdWx0aXBseSwKKyAgICBFcXVhbGl0eSwKKyAgICBpZCwKKyAgICBzdWJfZ3JvdXBfZWxlbWVudHMsCisgICAgbmV3X2VsZW1lbnRzLAorICAgIGdlbmVyYXRvcnMsCisgICAgc3ViX2dyb3VwX3NpemUsCisgICAgbmV3X3JlcF9wb3MsCisgICAgbmV3X3N0b3BfY29uZGl0aW9uCisgID4gX2hlbHBlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9oZWxwZXI6OnR5cGUgdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gX2hlbHBlcjo6Z2xvYmFsX2ZsYWdzIHwgX2FjNHI6Omdsb2JhbF9mbGFnczsKK307CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgc3ViX2dyb3VwX2VsZW1lbnRzLAorICB0eXBlbmFtZSBlbGVtZW50cywKKyAgdHlwZW5hbWUgZ2VuZXJhdG9ycywKKyAgaW50IHN1Yl9ncm91cF9zaXplLAorICBpbnQgcmVwX3BvcworPgorc3RydWN0IGRpbWlub19hZGRfYWxsX2Nvc2V0X3NwYWNlczxNdWx0aXBseSwgRXF1YWxpdHksIGlkLCBzdWJfZ3JvdXBfZWxlbWVudHMsIGVsZW1lbnRzLCBnZW5lcmF0b3JzLCBzdWJfZ3JvdXBfc2l6ZSwgcmVwX3BvcywgdHJ1ZT4KK3sKKyAgdHlwZWRlZiBlbGVtZW50cyB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19hZGRfZ2VuZXJhdG9yCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yU3ltbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRW5sYXJnZSB0aGUgZ3JvdXAgYnkgYWRkaW5nIGEgbmV3IGdlbmVyYXRvci4KKyAgKgorICAqIEl0IGFjY2VwdHMgYSBib29sZWFuIHBhcmFtZXRlciB0aGF0IGRldGVybWluZXMgaWYgdGhlIGdlbmVyYXRvciBpcyByZWR1bmRhbnQsCisgICogaS5lLiB3YXMgYWxyZWFkeSBzZWVuIGluIHRoZSBncm91cC4gSW4gdGhhdCBjYXNlLCBpdCByZWR1Y2VzIHRvIGEgbm8tb3AuCisgICoKKyAgKiBcc2EgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzLCBkaW1pbm9fYWRkX2FsbF9jb3NldF9zcGFjZXMKKyAgKi8KK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgZWxlbWVudHMsCisgIHR5cGVuYW1lIGdlbmVyYXRvcnNfZG9uZSwKKyAgdHlwZW5hbWUgY3VycmVudF9nZW5lcmF0b3IsCisgIGJvb2wgcmVkdW5kYW50ICAgICAgICAgIC8vID0gZmFsc2UKKz4KK3N0cnVjdCBkaW1pbm9fYWRkX2dlbmVyYXRvcgoreworICAvKiB0aGlzIHRlbXBsYXRlIGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBnZW5lcmF0b3IgaXMgbm90IHJlZHVuZGFudAorICAgKiA9PiBhbGwgZWxlbWVudHMgb2YgdGhlIGdyb3VwIG11bHRpcGxpZWQgd2l0aCB0aGUgbmV3IGdlbmVyYXRvcgorICAgKiAgICBhcmUgZ29pbmcgdG8gYmUgbmV3IGVsZW1lbnRzIG9mIHRoZSBtb3N0IHRyaXZpYWwgY29zZXQgc3BhY2UKKyAgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgYXBwbHlfb3BfZnJvbV9yaWdodDxNdWx0aXBseSwgY3VycmVudF9nZW5lcmF0b3IsIGVsZW1lbnRzPjo6dHlwZSBtdWx0aXBsaWVkX2VsZW1lbnRzOworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmNhdDxlbGVtZW50cywgbXVsdGlwbGllZF9lbGVtZW50cz46OnR5cGUgbmV3X2VsZW1lbnRzOworCisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IHJlcF9wb3MgPSBlbGVtZW50czo6Y291bnQ7CisKKyAgdHlwZWRlZiBkaW1pbm9fYWRkX2FsbF9jb3NldF9zcGFjZXM8CisgICAgTXVsdGlwbHksCisgICAgRXF1YWxpdHksCisgICAgaWQsCisgICAgZWxlbWVudHMsIC8vIGVsZW1lbnRzIG9mIHByZXZpb3VzIHN1Ymdyb3VwCisgICAgbmV3X2VsZW1lbnRzLAorICAgIHR5cGVuYW1lIGNvbmNhdDxnZW5lcmF0b3JzX2RvbmUsIHR5cGVfbGlzdDxjdXJyZW50X2dlbmVyYXRvcj4+Ojp0eXBlLAorICAgIGVsZW1lbnRzOjpjb3VudCwgLy8gc2l6ZSBvZiBwcmV2aW91cyBzdWJncm91cAorICAgIHJlcF9wb3MsCisgICAgZmFsc2UgLy8gZG9uJ3Qgc3RvcCAoYmVjYXVzZSByZXBfcG9zID49IG5ld19lbGVtZW50czo6Y291bnQgaXMgYWx3YXlzIGZhbHNlIGF0IHRoaXMgcG9pbnQpCisgID4gX2hlbHBlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfaGVscGVyOjp0eXBlIHR5cGU7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IF9oZWxwZXI6Omdsb2JhbF9mbGFnczsKK307CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgZWxlbWVudHMsCisgIHR5cGVuYW1lIGdlbmVyYXRvcnNfZG9uZSwKKyAgdHlwZW5hbWUgY3VycmVudF9nZW5lcmF0b3IKKz4KK3N0cnVjdCBkaW1pbm9fYWRkX2dlbmVyYXRvcjxNdWx0aXBseSwgRXF1YWxpdHksIGlkLCBlbGVtZW50cywgZ2VuZXJhdG9yc19kb25lLCBjdXJyZW50X2dlbmVyYXRvciwgdHJ1ZT4KK3sKKyAgLy8gcmVkdW5kYW50IGNhc2UKKyAgdHlwZWRlZiBlbGVtZW50cyB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOworfTsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogXGNsYXNzIGRpbWlub19hZGRfcmVtYWluaW5nX2dlbmVyYXRvcnMKKyAgKiBcaW5ncm91cCBDWFgxMV9UZW5zb3JTeW1tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBSZWN1cnNpdmUgdGVtcGxhdGUgdGhhdCBhZGRzIGFsbCByZW1haW5pbmcgZ2VuZXJhdG9ycyB0byBhIGdyb3VwCisgICoKKyAgKiBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgZ2VuZXJhdG9ycyB0aGF0IHJlbWFpbiBhbmQgc3VjY2Vzc2l2ZWx5CisgICogYWRkIHRoZW0gdG8gdGhlIGdyb3VwLgorICAqCisgICogXHNhIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50cywgZGltaW5vX2FkZF9nZW5lcmF0b3IKKyAgKi8KK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgZ2VuZXJhdG9yc19kb25lLAorICB0eXBlbmFtZSByZW1haW5pbmdfZ2VuZXJhdG9ycywKKyAgdHlwZW5hbWUgZWxlbWVudHMKKz4KK3N0cnVjdCBkaW1pbm9fYWRkX3JlbWFpbmluZ19nZW5lcmF0b3JzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgZ2V0PDAsIHJlbWFpbmluZ19nZW5lcmF0b3JzPjo6dHlwZSBmaXJzdF9nZW5lcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2tpcDwxLCByZW1haW5pbmdfZ2VuZXJhdG9ycz46OnR5cGUgbmV4dF9nZW5lcmF0b3JzOworCisgIHR5cGVkZWYgY29udGFpbmVkX2luX2xpc3RfZ2Y8RXF1YWxpdHksIGZpcnN0X2dlbmVyYXRvciwgZWxlbWVudHM+IF9jaWw7CisKKyAgdHlwZWRlZiBkaW1pbm9fYWRkX2dlbmVyYXRvcjwKKyAgICBNdWx0aXBseSwKKyAgICBFcXVhbGl0eSwKKyAgICBpZCwKKyAgICBlbGVtZW50cywKKyAgICBnZW5lcmF0b3JzX2RvbmUsCisgICAgZmlyc3RfZ2VuZXJhdG9yLAorICAgIF9jaWw6OnZhbHVlCisgID4gX2hlbHBlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIF9oZWxwZXI6OnR5cGUgbmV3X2VsZW1lbnRzOworCisgIHR5cGVkZWYgZGltaW5vX2FkZF9yZW1haW5pbmdfZ2VuZXJhdG9yczwKKyAgICBNdWx0aXBseSwKKyAgICBFcXVhbGl0eSwKKyAgICBpZCwKKyAgICB0eXBlbmFtZSBjb25jYXQ8Z2VuZXJhdG9yc19kb25lLCB0eXBlX2xpc3Q8Zmlyc3RfZ2VuZXJhdG9yPj46OnR5cGUsCisgICAgbmV4dF9nZW5lcmF0b3JzLAorICAgIG5ld19lbGVtZW50cworICA+IF9uZXh0X2l0ZXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBfbmV4dF9pdGVyOjp0eXBlIHR5cGU7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9CisgICAgX2NpbDo6Z2xvYmFsX2ZsYWdzIHwKKyAgICBfaGVscGVyOjpnbG9iYWxfZmxhZ3MgfAorICAgIF9uZXh0X2l0ZXI6Omdsb2JhbF9mbGFnczsKK307CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgdHlwZW5hbWUgZ2VuZXJhdG9yc19kb25lLAorICB0eXBlbmFtZSBlbGVtZW50cworPgorc3RydWN0IGRpbWlub19hZGRfcmVtYWluaW5nX2dlbmVyYXRvcnM8TXVsdGlwbHksIEVxdWFsaXR5LCBpZCwgZ2VuZXJhdG9yc19kb25lLCB0eXBlX2xpc3Q8PiwgZWxlbWVudHM+Cit7CisgIHR5cGVkZWYgZWxlbWVudHMgdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gMDsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBlbnVtZXJhdGVfZ3JvdXBfZWxlbWVudHNfbm9pZAorICAqIFxpbmdyb3VwIENYWDExX1RlbnNvclN5bW1ldHJ5X01vZHVsZQorICAqCisgICogXGJyaWVmIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGltcGxlbWVudHMgZ3JvdXAgZWxlbWVudCBlbnVtZXJhdGlvbgorICAqCisgICogVGhpcyBpcyBhIGhlbHBlciB0ZW1wbGF0ZSB0aGF0IGltcGxlbWVudHMgdGhlIGFjdHVhbCBlbnVtZXJhdGlvbgorICAqIG9mIGdyb3VwIGVsZW1lbnRzLiBUaGlzIGhhcyBiZWVuIHNwbGl0IHNvIHRoYXQgdGhlIGxpc3Qgb2YKKyAgKiBnZW5lcmF0b3JzIGNhbiBiZSBjbGVhbnNlZCBvZiB0aGUgaWRlbnRpdHkgZWxlbWVudCBiZWZvcmUKKyAgKiBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgb3BlcmF0aW9uLgorICAqCisgICogXHNhIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50cworICAqLwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgTXVsdGlwbHksCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgRXF1YWxpdHksCisgIHR5cGVuYW1lIGlkLAorICB0eXBlbmFtZSBnZW5lcmF0b3JzLAorICBpbnQgaW5pdGlhbF9nbG9iYWxfZmxhZ3MgPSAwCis+CitzdHJ1Y3QgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzX25vaWQKK3sKKyAgdHlwZWRlZiBkaW1pbm9fZmlyc3Rfc3RlcF9lbGVtZW50czxNdWx0aXBseSwgRXF1YWxpdHksIGlkLCBnZW5lcmF0b3JzPiBmaXJzdF9zdGVwOworICB0eXBlZGVmIHR5cGVuYW1lIGZpcnN0X3N0ZXA6OnR5cGUgZmlyc3Rfc3RlcF9lbGVtZW50czsKKworICB0eXBlZGVmIGRpbWlub19hZGRfcmVtYWluaW5nX2dlbmVyYXRvcnM8CisgICAgTXVsdGlwbHksCisgICAgRXF1YWxpdHksCisgICAgaWQsCisgICAgdHlwZW5hbWUgZmlyc3Rfc3RlcDo6Z2VuZXJhdG9yc19kb25lLAorICAgIHR5cGVuYW1lIGZpcnN0X3N0ZXA6Om5leHRfZ2VuZXJhdG9ycywgLy8gcmVtYWluaW5nX2dlbmVyYXRvcnMKKyAgICB0eXBlbmFtZSBmaXJzdF9zdGVwOjp0eXBlIC8vIGZpcnN0X3N0ZXAgZWxlbWVudHMKKyAgPiBfaGVscGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgX2hlbHBlcjo6dHlwZSB0eXBlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPQorICAgIGluaXRpYWxfZ2xvYmFsX2ZsYWdzIHwKKyAgICBmaXJzdF9zdGVwOjpnbG9iYWxfZmxhZ3MgfAorICAgIF9oZWxwZXI6Omdsb2JhbF9mbGFnczsKK307CisKKy8vIGluIGNhc2Ugd2hlbiBubyBnZW5lcmF0b3JzIGFyZSBzcGVjaWZpZWQKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIE11bHRpcGx5LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEVxdWFsaXR5LAorICB0eXBlbmFtZSBpZCwKKyAgaW50IGluaXRpYWxfZ2xvYmFsX2ZsYWdzCis+CitzdHJ1Y3QgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzX25vaWQ8TXVsdGlwbHksIEVxdWFsaXR5LCBpZCwgdHlwZV9saXN0PD4sIGluaXRpYWxfZ2xvYmFsX2ZsYWdzPgoreworICB0eXBlZGVmIHR5cGVfbGlzdDxpZD4gdHlwZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gaW5pdGlhbF9nbG9iYWxfZmxhZ3M7Cit9OworCisvKiogXGludGVybmFsCisgICoKKyAgKiBcY2xhc3MgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzCisgICogXGluZ3JvdXAgQ1hYMTFfVGVuc29yU3ltbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRW51bWVyYXRlIGFsbCBlbGVtZW50cyBpbiBhIGZpbml0ZSBncm91cAorICAqCisgICogVGhpcyB0ZW1wbGF0ZSBlbnVtZXJhdGVzIGFsbCBlbGVtZW50cyBpbiBhIGZpbml0ZSBncm91cC4gSXQgYWNjZXB0cworICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgcGFyYW1ldGVyczoKKyAgKgorICAqIFx0cGFyYW0gTXVsdGlwbHkgICAgICBUaGUgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9uIHRoYXQgbXVsdGlwbGllcyB0d28gZ3JvdXAgZWxlbWVudHMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIG90aGVyLgorICAqIFx0cGFyYW0gRXF1YWxpdHkgICAgICBUaGUgZXF1YWxpdHkgY2hlY2sgb3BlcmF0aW9uIHRoYXQgY2hlY2tzIGlmIHR3byBncm91cCBlbGVtZW50cworICAqICAgICAgICAgICAgICAgICAgICAgICBhcmUgZXF1YWwgdG8gYW5vdGhlci4KKyAgKiBcdHBhcmFtIGlkICAgICAgICAgICAgVGhlIGlkZW50aXR5IGVsZW1lbnQKKyAgKiBcdHBhcmFtIF9nZW5lcmF0b3JzICAgQSBsaXN0IG9mIChwb3NzaWJseSByZWR1bmRhbnQpIGdlbmVyYXRvcnMgb2YgdGhlIGdyb3VwCisgICovCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBNdWx0aXBseSwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBFcXVhbGl0eSwKKyAgdHlwZW5hbWUgaWQsCisgIHR5cGVuYW1lIF9nZW5lcmF0b3JzCis+CitzdHJ1Y3QgZW51bWVyYXRlX2dyb3VwX2VsZW1lbnRzCisgIDogcHVibGljIGVudW1lcmF0ZV9ncm91cF9lbGVtZW50c19ub2lkPAorICAgICAgTXVsdGlwbHksCisgICAgICBFcXVhbGl0eSwKKyAgICAgIGlkLAorICAgICAgdHlwZW5hbWUgc3RyaXBfaWRlbnRpdGllczxFcXVhbGl0eSwgaWQsIF9nZW5lcmF0b3JzPjo6dHlwZSwKKyAgICAgIHN0cmlwX2lkZW50aXRpZXM8RXF1YWxpdHksIGlkLCBfZ2VuZXJhdG9ycz46Omdsb2JhbF9mbGFncworICAgID4KK3sKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBncm91cF90aGVvcnkKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFfVEVOU09SU1lNTUVUUllfVEVNUExBVEVHUk9VUFRIRU9SWV9ICisKKy8qCisgKiBrYXRlOiBzcGFjZS1pbmRlbnQgb247IGluZGVudC13aWR0aCAyOyBtaXhlZGluZGVudCBvZmY7IGluZGVudC1tb2RlIGNzdHlsZTsKKyAqLwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvRXZlbnRDb3VudC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvRXZlbnRDb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDU1NTUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9FdmVudENvdW50LmgKQEAgLTAsMCArMSwyMzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IERtaXRyeSBWeXVrb3YgPGR2eXVrb3ZAZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9FVkVOVENPVU5UX0hfCisjZGVmaW5lIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfRVZFTlRDT1VOVF9IXworCituYW1lc3BhY2UgRWlnZW4geworCisvLyBFdmVudENvdW50IGFsbG93cyB0byB3YWl0IGZvciBhcmJpdHJhcnkgcHJlZGljYXRlcyBpbiBub24tYmxvY2tpbmcKKy8vIGFsZ29yaXRobXMuIFRoaW5rIG9mIGNvbmRpdGlvbiB2YXJpYWJsZSwgYnV0IHdhaXQgcHJlZGljYXRlIGRvZXMgbm90IG5lZWQgdG8KKy8vIGJlIHByb3RlY3RlZCBieSBhIG11dGV4LiBVc2FnZToKKy8vIFdhaXRpbmcgdGhyZWFkIGRvZXM6CisvLworLy8gICBpZiAocHJlZGljYXRlKQorLy8gICAgIHJldHVybiBhY3QoKTsKKy8vICAgRXZlbnRDb3VudDo6V2FpdGVyJiB3ID0gd2FpdGVyc1tteV9pbmRleF07CisvLyAgIGVjLlByZXdhaXQoJncpOworLy8gICBpZiAocHJlZGljYXRlKSB7CisvLyAgICAgZWMuQ2FuY2VsV2FpdCgmdyk7CisvLyAgICAgcmV0dXJuIGFjdCgpOworLy8gICB9CisvLyAgIGVjLkNvbW1pdFdhaXQoJncpOworLy8KKy8vIE5vdGlmeWluZyB0aHJlYWQgZG9lczoKKy8vCisvLyAgIHByZWRpY2F0ZSA9IHRydWU7CisvLyAgIGVjLk5vdGlmeSh0cnVlKTsKKy8vCisvLyBOb3RpZnkgaXMgY2hlYXAgaWYgdGhlcmUgYXJlIG5vIHdhaXRpbmcgdGhyZWFkcy4gUHJld2FpdC9Db21taXRXYWl0IGFyZSBub3QKKy8vIGNoZWFwLCBidXQgdGhleSBhcmUgZXhlY3V0ZWQgb25seSBpZiB0aGUgcHJlY2VlZGluZyBwcmVkaWNhdGUgY2hlY2sgaGFzCisvLyBmYWlsZWQuCisvLworLy8gQWxnb3JpaHRtIG91dGxpbmU6CisvLyBUaGVyZSBhcmUgdHdvIG1haW4gdmFyaWFibGVzOiBwcmVkaWNhdGUgKG1hbmFnZWQgYnkgdXNlcikgYW5kIHN0YXRlXy4KKy8vIE9wZXJhdGlvbiBjbG9zZWx5IHJlc2VtYmxlcyBEZWtrZXIgbXV0dWFsIGFsZ29yaXRobToKKy8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Rla2tlciUyN3NfYWxnb3JpdGhtCisvLyBXYWl0aW5nIHRocmVhZCBzZXRzIHN0YXRlXyB0aGVuIGNoZWNrcyBwcmVkaWNhdGUsIE5vdGlmeWluZyB0aHJlYWQgc2V0cworLy8gcHJlZGljYXRlIHRoZW4gY2hlY2tzIHN0YXRlXy4gRHVlIHRvIHNlcV9jc3QgZmVuY2VzIGluIGJldHdlZW4gdGhlc2UKKy8vIG9wZXJhdGlvbnMgaXQgaXMgZ3VhcmFudGVlZCB0aGFuIGVpdGhlciB3YWl0ZXIgd2lsbCBzZWUgcHJlZGljYXRlIGNoYW5nZQorLy8gYW5kIHdvbid0IGJsb2NrLCBvciBub3RpZnlpbmcgdGhyZWFkIHdpbGwgc2VlIHN0YXRlXyBjaGFuZ2UgYW5kIHdpbGwgdW5ibG9jaworLy8gdGhlIHdhaXRlciwgb3IgYm90aC4gQnV0IGl0IGNhbid0IGhhcHBlbiB0aGF0IGJvdGggdGhyZWFkcyBkb24ndCBzZWUgZWFjaAorLy8gb3RoZXIgY2hhbmdlcywgd2hpY2ggd291bGQgbGVhZCB0byBkZWFkbG9jay4KK2NsYXNzIEV2ZW50Q291bnQgeworIHB1YmxpYzoKKyAgY2xhc3MgV2FpdGVyOworCisgIEV2ZW50Q291bnQoTWF4U2l6ZVZlY3RvcjxXYWl0ZXI+JiB3YWl0ZXJzKSA6IHdhaXRlcnNfKHdhaXRlcnMpIHsKKyAgICBlaWdlbl9hc3NlcnQod2FpdGVycy5zaXplKCkgPCAoMSA8PCBrV2FpdGVyQml0cykgLSAxKTsKKyAgICAvLyBJbml0aWFsaXplIGVwb2NoIHRvIHNvbWV0aGluZyBjbG9zZSB0byBvdmVyZmxvdyB0byB0ZXN0IG92ZXJmbG93LgorICAgIHN0YXRlXyA9IGtTdGFja01hc2sgfCAoa0Vwb2NoTWFzayAtIGtFcG9jaEluYyAqIHdhaXRlcnMuc2l6ZSgpICogMik7CisgIH0KKworICB+RXZlbnRDb3VudCgpIHsKKyAgICAvLyBFbnN1cmUgdGhlcmUgYXJlIG5vIHdhaXRlcnMuCisgICAgZWlnZW5fYXNzZXJ0KChzdGF0ZV8ubG9hZCgpICYgKGtTdGFja01hc2sgfCBrV2FpdGVyTWFzaykpID09IGtTdGFja01hc2spOworICB9CisKKyAgLy8gUHJld2FpdCBwcmVwYXJlcyBmb3Igd2FpdGluZy4KKyAgLy8gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSB0aHJlYWQgbXVzdCByZS1jaGVjayB0aGUgd2FpdCBwcmVkaWNhdGUKKyAgLy8gYW5kIGNhbGwgZWl0aGVyIENhbmNlbFdhaXQgb3IgQ29tbWl0V2FpdCBwYXNzaW5nIHRoZSBzYW1lIFdhaXRlciBvYmplY3QuCisgIHZvaWQgUHJld2FpdChXYWl0ZXIqIHcpIHsKKyAgICB3LT5lcG9jaCA9IHN0YXRlXy5mZXRjaF9hZGQoa1dhaXRlckluYywgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICB9CisKKyAgLy8gQ29tbWl0V2FpdCBjb21taXRzIHdhaXRpbmcuCisgIHZvaWQgQ29tbWl0V2FpdChXYWl0ZXIqIHcpIHsKKyAgICB3LT5zdGF0ZSA9IFdhaXRlcjo6a05vdFNpZ25hbGVkOworICAgIC8vIE1vZGlmaWNhdGlvbiBlcG9jaCBvZiB0aGlzIHdhaXRlci4KKyAgICB1aW50NjRfdCBlcG9jaCA9CisgICAgICAgICh3LT5lcG9jaCAmIGtFcG9jaE1hc2spICsKKyAgICAgICAgKCgody0+ZXBvY2ggJiBrV2FpdGVyTWFzaykgPj4ga1dhaXRlclNoaWZ0KSA8PCBrRXBvY2hTaGlmdCk7CisgICAgdWludDY0X3Qgc3RhdGUgPSBzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoaW50NjRfdCgoc3RhdGUgJiBrRXBvY2hNYXNrKSAtIGVwb2NoKSA8IDApIHsKKyAgICAgICAgLy8gVGhlIHByZWNlZWRpbmcgd2FpdGVyIGhhcyBub3QgZGVjaWRlZCBvbiBpdHMgZmF0ZS4gV2FpdCB1bnRpbCBpdAorICAgICAgICAvLyBjYWxscyBlaXRoZXIgQ2FuY2VsV2FpdCBvciBDb21taXRXYWl0LCBvciBpcyBub3RpZmllZC4KKyAgICAgICAgRUlHRU5fVEhSRUFEX1lJRUxEKCk7CisgICAgICAgIHN0YXRlID0gc3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gV2UndmUgYWxyZWFkeSBiZWVuIG5vdGlmaWVkLgorICAgICAgaWYgKGludDY0X3QoKHN0YXRlICYga0Vwb2NoTWFzaykgLSBlcG9jaCkgPiAwKSByZXR1cm47CisgICAgICAvLyBSZW1vdmUgdGhpcyB0aHJlYWQgZnJvbSBwcmV3YWl0IGNvdW50ZXIgYW5kIGFkZCBpdCB0byB0aGUgd2FpdGVyIGxpc3QuCisgICAgICBlaWdlbl9hc3NlcnQoKHN0YXRlICYga1dhaXRlck1hc2spICE9IDApOworICAgICAgdWludDY0X3QgbmV3c3RhdGUgPSBzdGF0ZSAtIGtXYWl0ZXJJbmMgKyBrRXBvY2hJbmM7CisgICAgICBuZXdzdGF0ZSA9IChuZXdzdGF0ZSAmIH5rU3RhY2tNYXNrKSB8ICh3IC0gJndhaXRlcnNfWzBdKTsKKyAgICAgIGlmICgoc3RhdGUgJiBrU3RhY2tNYXNrKSA9PSBrU3RhY2tNYXNrKQorICAgICAgICB3LT5uZXh0LnN0b3JlKG51bGxwdHIsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgZWxzZQorICAgICAgICB3LT5uZXh0LnN0b3JlKCZ3YWl0ZXJzX1tzdGF0ZSAmIGtTdGFja01hc2tdLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIGlmIChzdGF0ZV8uY29tcGFyZV9leGNoYW5nZV93ZWFrKHN0YXRlLCBuZXdzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgUGFyayh3KTsKKyAgfQorCisgIC8vIENhbmNlbFdhaXQgY2FuY2VscyBlZmZlY3RzIG9mIHRoZSBwcmV2aW91cyBQcmV3YWl0IGNhbGwuCisgIHZvaWQgQ2FuY2VsV2FpdChXYWl0ZXIqIHcpIHsKKyAgICB1aW50NjRfdCBlcG9jaCA9CisgICAgICAgICh3LT5lcG9jaCAmIGtFcG9jaE1hc2spICsKKyAgICAgICAgKCgody0+ZXBvY2ggJiBrV2FpdGVyTWFzaykgPj4ga1dhaXRlclNoaWZ0KSA8PCBrRXBvY2hTaGlmdCk7CisgICAgdWludDY0X3Qgc3RhdGUgPSBzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoaW50NjRfdCgoc3RhdGUgJiBrRXBvY2hNYXNrKSAtIGVwb2NoKSA8IDApIHsKKyAgICAgICAgLy8gVGhlIHByZWNlZWRpbmcgd2FpdGVyIGhhcyBub3QgZGVjaWRlZCBvbiBpdHMgZmF0ZS4gV2FpdCB1bnRpbCBpdAorICAgICAgICAvLyBjYWxscyBlaXRoZXIgQ2FuY2VsV2FpdCBvciBDb21taXRXYWl0LCBvciBpcyBub3RpZmllZC4KKyAgICAgICAgRUlHRU5fVEhSRUFEX1lJRUxEKCk7CisgICAgICAgIHN0YXRlID0gc3RhdGVfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gV2UndmUgYWxyZWFkeSBiZWVuIG5vdGlmaWVkLgorICAgICAgaWYgKGludDY0X3QoKHN0YXRlICYga0Vwb2NoTWFzaykgLSBlcG9jaCkgPiAwKSByZXR1cm47CisgICAgICAvLyBSZW1vdmUgdGhpcyB0aHJlYWQgZnJvbSBwcmV3YWl0IGNvdW50ZXIuCisgICAgICBlaWdlbl9hc3NlcnQoKHN0YXRlICYga1dhaXRlck1hc2spICE9IDApOworICAgICAgaWYgKHN0YXRlXy5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoc3RhdGUsIHN0YXRlIC0ga1dhaXRlckluYyArIGtFcG9jaEluYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gTm90aWZ5IHdha2VzIG9uZSBvciBhbGwgd2FpdGluZyB0aHJlYWRzLgorICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGFuZ2luZyB0aGUgYXNzb2NpYXRlZCB3YWl0IHByZWRpY2F0ZS4KKyAgdm9pZCBOb3RpZnkoYm9vbCBhbGwpIHsKKyAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgdWludDY0X3Qgc3RhdGUgPSBzdGF0ZV8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBFYXN5IGNhc2U6IG5vIHdhaXRlcnMuCisgICAgICBpZiAoKHN0YXRlICYga1N0YWNrTWFzaykgPT0ga1N0YWNrTWFzayAmJiAoc3RhdGUgJiBrV2FpdGVyTWFzaykgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgICAgdWludDY0X3Qgd2FpdGVycyA9IChzdGF0ZSAmIGtXYWl0ZXJNYXNrKSA+PiBrV2FpdGVyU2hpZnQ7CisgICAgICB1aW50NjRfdCBuZXdzdGF0ZTsKKyAgICAgIGlmIChhbGwpIHsKKyAgICAgICAgLy8gUmVzZXQgcHJld2FpdCBjb3VudGVyIGFuZCBlbXB0eSB3YWl0IGxpc3QuCisgICAgICAgIG5ld3N0YXRlID0gKHN0YXRlICYga0Vwb2NoTWFzaykgKyAoa0Vwb2NoSW5jICogd2FpdGVycykgKyBrU3RhY2tNYXNrOworICAgICAgfSBlbHNlIGlmICh3YWl0ZXJzKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIGEgdGhyZWFkIGluIHByZS13YWl0IHN0YXRlLCB1bmJsb2NrIGl0LgorICAgICAgICBuZXdzdGF0ZSA9IHN0YXRlICsga0Vwb2NoSW5jIC0ga1dhaXRlckluYzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBvcCBhIHdhaXRlciBmcm9tIGxpc3QgYW5kIHVucGFyayBpdC4KKyAgICAgICAgV2FpdGVyKiB3ID0gJndhaXRlcnNfW3N0YXRlICYga1N0YWNrTWFza107CisgICAgICAgIFdhaXRlciogd25leHQgPSB3LT5uZXh0LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHVpbnQ2NF90IG5leHQgPSBrU3RhY2tNYXNrOworICAgICAgICBpZiAod25leHQgIT0gbnVsbHB0cikgbmV4dCA9IHduZXh0IC0gJndhaXRlcnNfWzBdOworICAgICAgICAvLyBOb3RlOiB3ZSBkb24ndCBhZGQga0Vwb2NoSW5jIGhlcmUuIEFCQSBwcm9ibGVtIG9uIHRoZSBsb2NrLWZyZWUgc3RhY2sKKyAgICAgICAgLy8gY2FuJ3QgaGFwcGVuIGJlY2F1c2UgYSB3YWl0ZXIgaXMgcmUtcHVzaGVkIG9udG8gdGhlIHN0YWNrIG9ubHkgYWZ0ZXIKKyAgICAgICAgLy8gaXQgd2FzIGluIHRoZSBwcmUtd2FpdCBzdGF0ZSB3aGljaCBpbmV2aXRhYmx5IGxlYWRzIHRvIGVwb2NoCisgICAgICAgIC8vIGluY3JlbWVudC4KKyAgICAgICAgbmV3c3RhdGUgPSAoc3RhdGUgJiBrRXBvY2hNYXNrKSArIG5leHQ7CisgICAgICB9CisgICAgICBpZiAoc3RhdGVfLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhzdGF0ZSwgbmV3c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkgeworICAgICAgICBpZiAoIWFsbCAmJiB3YWl0ZXJzKSByZXR1cm47ICAvLyB1bmJsb2NrZWQgcHJlLXdhaXQgdGhyZWFkCisgICAgICAgIGlmICgoc3RhdGUgJiBrU3RhY2tNYXNrKSA9PSBrU3RhY2tNYXNrKSByZXR1cm47CisgICAgICAgIFdhaXRlciogdyA9ICZ3YWl0ZXJzX1tzdGF0ZSAmIGtTdGFja01hc2tdOworICAgICAgICBpZiAoIWFsbCkgdy0+bmV4dC5zdG9yZShudWxscHRyLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgVW5wYXJrKHcpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2xhc3MgV2FpdGVyIHsKKyAgICBmcmllbmQgY2xhc3MgRXZlbnRDb3VudDsKKyAgICAvLyBBbGlnbiB0byAxMjggYnl0ZSBib3VuZGFyeSB0byBwcmV2ZW50IGZhbHNlIHNoYXJpbmcgd2l0aCBvdGhlciBXYWl0ZXIgb2JqZWN0cyBpbiB0aGUgc2FtZSB2ZWN0b3IuCisgICAgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoMTI4KSBzdGQ6OmF0b21pYzxXYWl0ZXIqPiBuZXh0OworICAgIHN0ZDo6bXV0ZXggbXU7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3Y7CisgICAgdWludDY0X3QgZXBvY2g7CisgICAgdW5zaWduZWQgc3RhdGU7CisgICAgZW51bSB7CisgICAgICBrTm90U2lnbmFsZWQsCisgICAgICBrV2FpdGluZywKKyAgICAgIGtTaWduYWxlZCwKKyAgICB9OworICB9OworCisgcHJpdmF0ZToKKyAgLy8gU3RhdGVfIGxheW91dDoKKyAgLy8gLSBsb3cga1N0YWNrQml0cyBpcyBhIHN0YWNrIG9mIHdhaXRlcnMgY29tbWl0dGVkIHdhaXQuCisgIC8vIC0gbmV4dCBrV2FpdGVyQml0cyBpcyBjb3VudCBvZiB3YWl0ZXJzIGluIHByZXdhaXQgc3RhdGUuCisgIC8vIC0gbmV4dCBrRXBvY2hCaXRzIGlzIG1vZGlmaWNhdGlvbiBjb3VudGVyLgorICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1N0YWNrQml0cyA9IDE2OworICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1N0YWNrTWFzayA9ICgxdWxsIDw8IGtTdGFja0JpdHMpIC0gMTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtXYWl0ZXJCaXRzID0gMTY7CisgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrV2FpdGVyU2hpZnQgPSAxNjsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtXYWl0ZXJNYXNrID0gKCgxdWxsIDw8IGtXYWl0ZXJCaXRzKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGtXYWl0ZXJTaGlmdDsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtXYWl0ZXJJbmMgPSAxdWxsIDw8IGtXYWl0ZXJCaXRzOworICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0Vwb2NoQml0cyA9IDMyOworICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0Vwb2NoU2hpZnQgPSAzMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtFcG9jaE1hc2sgPSAoKDF1bGwgPDwga0Vwb2NoQml0cykgLSAxKSA8PCBrRXBvY2hTaGlmdDsKKyAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtFcG9jaEluYyA9IDF1bGwgPDwga0Vwb2NoU2hpZnQ7CisgIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBzdGF0ZV87CisgIE1heFNpemVWZWN0b3I8V2FpdGVyPiYgd2FpdGVyc187CisKKyAgdm9pZCBQYXJrKFdhaXRlciogdykgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayh3LT5tdSk7CisgICAgd2hpbGUgKHctPnN0YXRlICE9IFdhaXRlcjo6a1NpZ25hbGVkKSB7CisgICAgICB3LT5zdGF0ZSA9IFdhaXRlcjo6a1dhaXRpbmc7CisgICAgICB3LT5jdi53YWl0KGxvY2spOworICAgIH0KKyAgfQorCisgIHZvaWQgVW5wYXJrKFdhaXRlciogd2FpdGVycykgeworICAgIFdhaXRlciogbmV4dCA9IG51bGxwdHI7CisgICAgZm9yIChXYWl0ZXIqIHcgPSB3YWl0ZXJzOyB3OyB3ID0gbmV4dCkgeworICAgICAgbmV4dCA9IHctPm5leHQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIHVuc2lnbmVkIHN0YXRlOworICAgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sody0+bXUpOworICAgICAgICBzdGF0ZSA9IHctPnN0YXRlOworICAgICAgICB3LT5zdGF0ZSA9IFdhaXRlcjo6a1NpZ25hbGVkOworICAgICAgfQorICAgICAgLy8gQXZvaWQgbm90aWZ5aW5nIGlmIGl0IHdhc24ndCB3YWl0aW5nLgorICAgICAgaWYgKHN0YXRlID09IFdhaXRlcjo6a1dhaXRpbmcpIHctPmN2Lm5vdGlmeV9vbmUoKTsKKyAgICB9CisgIH0KKworICBFdmVudENvdW50KGNvbnN0IEV2ZW50Q291bnQmKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXZlbnRDb3VudCYpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9FVkVOVENPVU5UX0hfCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9Ob25CbG9ja2luZ1RocmVhZFBvb2wuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UaHJlYWRQb29sL05vbkJsb2NraW5nVGhyZWFkUG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGJjZTUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9Ob25CbG9ja2luZ1RocmVhZFBvb2wuaApAQCAtMCwwICsxLDI3NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgRG1pdHJ5IFZ5dWtvdiA8ZHZ5dWtvdkBnb29nbGUuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9USFJFQURQT09MX05PTkJMT0NLSU5HX1RIUkVBRF9QT09MX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9OT05CTE9DS0lOR19USFJFQURfUE9PTF9ICisKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVudmlyb25tZW50PgorY2xhc3MgTm9uQmxvY2tpbmdUaHJlYWRQb29sVGVtcGwgOiBwdWJsaWMgRWlnZW46OlRocmVhZFBvb2xJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBFbnZpcm9ubWVudDo6VGFzayBUYXNrOworICB0eXBlZGVmIFJ1blF1ZXVlPFRhc2ssIDEwMjQ+IFF1ZXVlOworCisgIE5vbkJsb2NraW5nVGhyZWFkUG9vbFRlbXBsKGludCBudW1fdGhyZWFkcywgRW52aXJvbm1lbnQgZW52ID0gRW52aXJvbm1lbnQoKSkKKyAgICAgIDogZW52XyhlbnYpLAorICAgICAgICB0aHJlYWRzXyhudW1fdGhyZWFkcyksCisgICAgICAgIHF1ZXVlc18obnVtX3RocmVhZHMpLAorICAgICAgICBjb3ByaW1lc18obnVtX3RocmVhZHMpLAorICAgICAgICB3YWl0ZXJzXyhudW1fdGhyZWFkcyksCisgICAgICAgIGJsb2NrZWRfKDApLAorICAgICAgICBzcGlubmluZ18oMCksCisgICAgICAgIGRvbmVfKGZhbHNlKSwKKyAgICAgICAgZWNfKHdhaXRlcnNfKSB7CisgICAgd2FpdGVyc18ucmVzaXplKG51bV90aHJlYWRzKTsKKworICAgIC8vIENhbGN1bGF0ZSBjb3ByaW1lcyBvZiBudW1fdGhyZWFkcy4KKyAgICAvLyBDb3ByaW1lcyBhcmUgdXNlZCBmb3IgYSByYW5kb20gd2FsayBvdmVyIGFsbCB0aHJlYWRzIGluIFN0ZWFsCisgICAgLy8gYW5kIE5vbkVtcHR5UXVldWVJbmRleC4gSXRlcmF0aW9uIGlzIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgaWYgd2UgdGFrZQorICAgIC8vIGEgd2FsayBzdGFydGluZyB0aHJlYWQgaW5kZXggdCBhbmQgY2FsY3VsYXRlIG51bV90aHJlYWRzIC0gMSBzdWJzZXF1ZW50CisgICAgLy8gaW5kaWNlcyBhcyAodCArIGNvcHJpbWUpICUgbnVtX3RocmVhZHMsIHdlIHdpbGwgY292ZXIgYWxsIHRocmVhZHMgd2l0aG91dAorICAgIC8vIHJlcGV0aXRpb25zIChlZmZlY3RpdmVseSBnZXR0aW5nIGEgcHJlc3Vkby1yYW5kb20gcGVybXV0YXRpb24gb2YgdGhyZWFkCisgICAgLy8gaW5kaWNlcykuCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtX3RocmVhZHM7IGkrKykgeworICAgICAgdW5zaWduZWQgYSA9IGk7CisgICAgICB1bnNpZ25lZCBiID0gbnVtX3RocmVhZHM7CisgICAgICAvLyBJZiBHQ0QoYSwgYikgPT0gMSwgdGhlbiBhIGFuZCBiIGFyZSBjb3ByaW1lcy4KKyAgICAgIHdoaWxlIChiICE9IDApIHsKKyAgICAgICAgdW5zaWduZWQgdG1wID0gYTsKKyAgICAgICAgYSA9IGI7CisgICAgICAgIGIgPSB0bXAgJSBiOworICAgICAgfQorICAgICAgaWYgKGEgPT0gMSkgeworICAgICAgICBjb3ByaW1lc18ucHVzaF9iYWNrKGkpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKKyAgICAgIHF1ZXVlc18ucHVzaF9iYWNrKG5ldyBRdWV1ZSgpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CisgICAgICB0aHJlYWRzXy5wdXNoX2JhY2soZW52Xy5DcmVhdGVUaHJlYWQoW3RoaXMsIGldKCkgeyBXb3JrZXJMb29wKGkpOyB9KSk7CisgICAgfQorICB9CisKKyAgfk5vbkJsb2NraW5nVGhyZWFkUG9vbFRlbXBsKCkgeworICAgIGRvbmVfID0gdHJ1ZTsKKyAgICAvLyBOb3cgaWYgYWxsIHRocmVhZHMgYmxvY2sgd2l0aG91dCB3b3JrLCB0aGV5IHdpbGwgc3RhcnQgZXhpdGluZy4KKyAgICAvLyBCdXQgbm90ZSB0aGF0IHRocmVhZHMgY2FuIGNvbnRpbnVlIHRvIHdvcmsgYXJiaXRyYXJ5IGxvbmcsCisgICAgLy8gYmxvY2ssIHN1Ym1pdCBuZXcgd29yaywgdW5ibG9jayBhbmQgb3RoZXJ3aXNlIGxpdmUgZnVsbCBsaWZlLgorICAgIGVjXy5Ob3RpZnkodHJ1ZSk7CisKKyAgICAvLyBKb2luIHRocmVhZHMgZXhwbGljaXRseSB0byBhdm9pZCBkZXN0cnVjdGlvbiBvcmRlciBpc3N1ZXMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aHJlYWRzXy5zaXplKCk7IGkrKykgZGVsZXRlIHRocmVhZHNfW2ldOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhyZWFkc18uc2l6ZSgpOyBpKyspIGRlbGV0ZSBxdWV1ZXNfW2ldOworICB9CisKKyAgdm9pZCBTY2hlZHVsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZm4pIHsKKyAgICBUYXNrIHQgPSBlbnZfLkNyZWF0ZVRhc2soc3RkOjptb3ZlKGZuKSk7CisgICAgUGVyVGhyZWFkKiBwdCA9IEdldFBlclRocmVhZCgpOworICAgIGlmIChwdC0+cG9vbCA9PSB0aGlzKSB7CisgICAgICAvLyBXb3JrZXIgdGhyZWFkIG9mIHRoaXMgcG9vbCwgcHVzaCBvbnRvIHRoZSB0aHJlYWQncyBxdWV1ZS4KKyAgICAgIFF1ZXVlKiBxID0gcXVldWVzX1twdC0+dGhyZWFkX2lkXTsKKyAgICAgIHQgPSBxLT5QdXNoRnJvbnQoc3RkOjptb3ZlKHQpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQSBmcmVlLXN0YW5kaW5nIHRocmVhZCAob3Igd29ya2VyIG9mIGFub3RoZXIgcG9vbCksIHB1c2ggb250byBhIHJhbmRvbQorICAgICAgLy8gcXVldWUuCisgICAgICBRdWV1ZSogcSA9IHF1ZXVlc19bUmFuZCgmcHQtPnJhbmQpICUgcXVldWVzXy5zaXplKCldOworICAgICAgdCA9IHEtPlB1c2hCYWNrKHN0ZDo6bW92ZSh0KSk7CisgICAgfQorICAgIC8vIE5vdGU6IGJlbG93IHdlIHRvdWNoIHRoaXMgYWZ0ZXIgbWFraW5nIHcgYXZhaWxhYmxlIHRvIHdvcmtlciB0aHJlYWRzLgorICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCB0aGlzIGNhbiBsZWFkIHRvIGEgcmFjeS11c2UtYWZ0ZXItZnJlZS4gQ29uc2lkZXIgdGhhdAorICAgIC8vIFNjaGVkdWxlIGlzIGNhbGxlZCBmcm9tIGEgdGhyZWFkIHRoYXQgaXMgbmVpdGhlciBtYWluIHRocmVhZCBub3IgYSB3b3JrZXIKKyAgICAvLyB0aHJlYWQgb2YgdGhpcyBwb29sLiBUaGVuLCBleGVjdXRpb24gb2YgdyBkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICAgLy8gY29tcGxldGVzIG92ZXJhbGwgY29tcHV0YXRpb25zLCB3aGljaCBpbiB0dXJuIGxlYWRzIHRvIGRlc3RydWN0aW9uIG9mCisgICAgLy8gdGhpcy4gV2UgZXhwZWN0IHRoYXQgc3VjaCBzY2VuYXJpbyBpcyBwcmV2ZW50ZWQgYnkgcHJvZ3JhbSwgdGhhdCBpcywKKyAgICAvLyB0aGlzIGlzIGtlcHQgYWxpdmUgd2hpbGUgYW55IHRocmVhZHMgY2FuIHBvdGVudGlhbGx5IGJlIGluIFNjaGVkdWxlLgorICAgIGlmICghdC5mKQorICAgICAgZWNfLk5vdGlmeShmYWxzZSk7CisgICAgZWxzZQorICAgICAgZW52Xy5FeGVjdXRlVGFzayh0KTsgIC8vIFB1c2ggZmFpbGVkLCBleGVjdXRlIGRpcmVjdGx5LgorICB9CisKKyAgaW50IE51bVRocmVhZHMoKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhyZWFkc18uc2l6ZSgpKTsKKyAgfQorCisgIGludCBDdXJyZW50VGhyZWFkSWQoKSBjb25zdCBmaW5hbCB7CisgICAgY29uc3QgUGVyVGhyZWFkKiBwdCA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Tm9uQmxvY2tpbmdUaHJlYWRQb29sVGVtcGwqPih0aGlzKS0+R2V0UGVyVGhyZWFkKCk7CisgICAgaWYgKHB0LT5wb29sID09IHRoaXMpIHsKKyAgICAgIHJldHVybiBwdC0+dGhyZWFkX2lkOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHR5cGVuYW1lIEVudmlyb25tZW50OjpFbnZUaHJlYWQgVGhyZWFkOworCisgIHN0cnVjdCBQZXJUaHJlYWQgeworICAgIGNvbnN0ZXhwciBQZXJUaHJlYWQoKSA6IHBvb2woTlVMTCksIHJhbmQoMCksIHRocmVhZF9pZCgtMSkgeyB9CisgICAgTm9uQmxvY2tpbmdUaHJlYWRQb29sVGVtcGwqIHBvb2w7ICAvLyBQYXJlbnQgcG9vbCwgb3IgbnVsbCBmb3Igbm9ybWFsIHRocmVhZHMuCisgICAgdWludDY0X3QgcmFuZDsgIC8vIFJhbmRvbSBnZW5lcmF0b3Igc3RhdGUuCisgICAgaW50IHRocmVhZF9pZDsgIC8vIFdvcmtlciB0aHJlYWQgaW5kZXggaW4gcG9vbC4KKyAgfTsKKworICBFbnZpcm9ubWVudCBlbnZfOworICBNYXhTaXplVmVjdG9yPFRocmVhZCo+IHRocmVhZHNfOworICBNYXhTaXplVmVjdG9yPFF1ZXVlKj4gcXVldWVzXzsKKyAgTWF4U2l6ZVZlY3Rvcjx1bnNpZ25lZD4gY29wcmltZXNfOworICBNYXhTaXplVmVjdG9yPEV2ZW50Q291bnQ6OldhaXRlcj4gd2FpdGVyc187CisgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBibG9ja2VkXzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gc3Bpbm5pbmdfOworICBzdGQ6OmF0b21pYzxib29sPiBkb25lXzsKKyAgRXZlbnRDb3VudCBlY187CisKKyAgLy8gTWFpbiB3b3JrZXIgdGhyZWFkIGxvb3AuCisgIHZvaWQgV29ya2VyTG9vcChpbnQgdGhyZWFkX2lkKSB7CisgICAgUGVyVGhyZWFkKiBwdCA9IEdldFBlclRocmVhZCgpOworICAgIHB0LT5wb29sID0gdGhpczsKKyAgICBwdC0+cmFuZCA9IHN0ZDo6aGFzaDxzdGQ6OnRocmVhZDo6aWQ+KCkoc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkpOworICAgIHB0LT50aHJlYWRfaWQgPSB0aHJlYWRfaWQ7CisgICAgUXVldWUqIHEgPSBxdWV1ZXNfW3RocmVhZF9pZF07CisgICAgRXZlbnRDb3VudDo6V2FpdGVyKiB3YWl0ZXIgPSAmd2FpdGVyc19bdGhyZWFkX2lkXTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBUYXNrIHQgPSBxLT5Qb3BGcm9udCgpOworICAgICAgaWYgKCF0LmYpIHsKKyAgICAgICAgdCA9IFN0ZWFsKCk7CisgICAgICAgIGlmICghdC5mKSB7CisgICAgICAgICAgLy8gTGVhdmUgb25lIHRocmVhZCBzcGlubmluZy4gVGhpcyByZWR1Y2VzIGxhdGVuY3kuCisgICAgICAgICAgLy8gVE9ETyhkdnl1a292KTogMTAwMCBpdGVyYXRpb25zIGlzIGJhc2VkIG9uIGZhaXIgZGljZSByb2xsLCB0dW5lIGl0LgorICAgICAgICAgIC8vIEFsc28sIHRoZSB0aW1lIGl0IHRha2VzIHRvIGF0dGVtcHQgdG8gc3RlYWwgd29yayAxMDAwIHRpbWVzIGRlcGVuZHMKKyAgICAgICAgICAvLyBvbiB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wuIEhvd2V2ZXIgdGhlIHNwZWVkIGF0IHdoaWNoIHRoZSB1c2VyCisgICAgICAgICAgLy8gb2YgdGhlIHRocmVhZCBwb29sIHN1Ym1pdCB0YXNrcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgICAvLyBwb29sLiBDb25zaWRlciBhIHRpbWUgYmFzZWQgbGltaXQgaW5zdGVhZC4KKyAgICAgICAgICBpZiAoIXNwaW5uaW5nXyAmJiAhc3Bpbm5pbmdfLmV4Y2hhbmdlKHRydWUpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAgJiYgIXQuZjsgaSsrKSB7CisgICAgICAgICAgICAgIHQgPSBTdGVhbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Bpbm5pbmdfID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghdC5mKSB7CisgICAgICAgICAgICBpZiAoIVdhaXRGb3JXb3JrKHdhaXRlciwgJnQpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0LmYpIHsKKyAgICAgICAgZW52Xy5FeGVjdXRlVGFzayh0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTdGVhbCB0cmllcyB0byBzdGVhbCB3b3JrIGZyb20gb3RoZXIgd29ya2VyIHRocmVhZHMgaW4gYmVzdC1lZmZvcnQgbWFubmVyLgorICBUYXNrIFN0ZWFsKCkgeworICAgIFBlclRocmVhZCogcHQgPSBHZXRQZXJUaHJlYWQoKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHF1ZXVlc18uc2l6ZSgpOworICAgIHVuc2lnbmVkIHIgPSBSYW5kKCZwdC0+cmFuZCk7CisgICAgdW5zaWduZWQgaW5jID0gY29wcmltZXNfW3IgJSBjb3ByaW1lc18uc2l6ZSgpXTsKKyAgICB1bnNpZ25lZCB2aWN0aW0gPSByICUgc2l6ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBUYXNrIHQgPSBxdWV1ZXNfW3ZpY3RpbV0tPlBvcEJhY2soKTsKKyAgICAgIGlmICh0LmYpIHsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgICB9CisgICAgICB2aWN0aW0gKz0gaW5jOworICAgICAgaWYgKHZpY3RpbSA+PSBzaXplKSB7CisgICAgICAgIHZpY3RpbSAtPSBzaXplOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVGFzaygpOworICB9CisKKyAgLy8gV2FpdEZvcldvcmsgYmxvY2tzIHVudGlsIG5ldyB3b3JrIGlzIGF2YWlsYWJsZSAocmV0dXJucyB0cnVlKSwgb3IgaWYgaXQgaXMKKyAgLy8gdGltZSB0byBleGl0IChyZXR1cm5zIGZhbHNlKS4gQ2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgdGFzayB0byBleGVjdXRlIGluIHQKKyAgLy8gKGluIHN1Y2ggY2FzZSB0LmYgIT0gbnVsbHB0ciBvbiByZXR1cm4pLgorICBib29sIFdhaXRGb3JXb3JrKEV2ZW50Q291bnQ6OldhaXRlciogd2FpdGVyLCBUYXNrKiB0KSB7CisgICAgZWlnZW5fYXNzZXJ0KCF0LT5mKTsKKyAgICAvLyBXZSBhbHJlYWR5IGRpZCBiZXN0LWVmZm9ydCBlbXB0aW5lc3MgY2hlY2sgaW4gU3RlYWwsIHNvIHByZXBhcmUgZm9yCisgICAgLy8gYmxvY2tpbmcuCisgICAgZWNfLlByZXdhaXQod2FpdGVyKTsKKyAgICAvLyBOb3cgZG8gYSByZWxpYWJsZSBlbXB0aW5lc3MgY2hlY2suCisgICAgaW50IHZpY3RpbSA9IE5vbkVtcHR5UXVldWVJbmRleCgpOworICAgIGlmICh2aWN0aW0gIT0gLTEpIHsKKyAgICAgIGVjXy5DYW5jZWxXYWl0KHdhaXRlcik7CisgICAgICAqdCA9IHF1ZXVlc19bdmljdGltXS0+UG9wQmFjaygpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIE51bWJlciBvZiBibG9ja2VkIHRocmVhZHMgaXMgdXNlZCBhcyB0ZXJtaW5hdGlvbiBjb25kaXRpb24uCisgICAgLy8gSWYgd2UgYXJlIHNodXR0aW5nIGRvd24gYW5kIGFsbCB3b3JrZXIgdGhyZWFkcyBibG9ja2VkIHdpdGhvdXQgd29yaywKKyAgICAvLyB0aGF0J3Mgd2UgYXJlIGRvbmUuCisgICAgYmxvY2tlZF8rKzsKKyAgICBpZiAoZG9uZV8gJiYgYmxvY2tlZF8gPT0gdGhyZWFkc18uc2l6ZSgpKSB7CisgICAgICBlY18uQ2FuY2VsV2FpdCh3YWl0ZXIpOworICAgICAgLy8gQWxtb3N0IGRvbmUsIGJ1dCBuZWVkIHRvIHJlLWNoZWNrIHF1ZXVlcy4KKyAgICAgIC8vIENvbnNpZGVyIHRoYXQgYWxsIHF1ZXVlcyBhcmUgZW1wdHkgYW5kIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUgcHJlZW1wdGVkCisgICAgICAvLyByaWdodCBhZnRlciBpbmNyZW1lbnRpbmcgYmxvY2tlZF8gYWJvdmUuIE5vdyBhIGZyZWUtc3RhbmRpbmcgdGhyZWFkCisgICAgICAvLyBzdWJtaXRzIHdvcmsgYW5kIGNhbGxzIGRlc3RydWN0b3IgKHdoaWNoIHNldHMgZG9uZV8pLiBJZiB3ZSBkb24ndAorICAgICAgLy8gcmUtY2hlY2sgcXVldWVzLCB3ZSB3aWxsIGV4aXQgbGVhdmluZyB0aGUgd29yayB1bmV4ZWN1dGVkLgorICAgICAgaWYgKE5vbkVtcHR5UXVldWVJbmRleCgpICE9IC0xKSB7CisgICAgICAgIC8vIE5vdGU6IHdlIG11c3Qgbm90IHBvcCBmcm9tIHF1ZXVlcyBiZWZvcmUgd2UgZGVjcmVtZW50IGJsb2NrZWRfLAorICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBzY2VuYXJpbyBpcyBwb3NzaWJsZS4gQ29uc2lkZXIgdGhhdCBpbnN0ZWFkCisgICAgICAgIC8vIG9mIGNoZWNraW5nIGZvciBlbXB0aW5lc3Mgd2UgcG9wcGVkIHRoZSBvbmx5IGVsZW1lbnQgZnJvbSBxdWV1ZXMuCisgICAgICAgIC8vIE5vdyBvdGhlciB3b3JrZXIgdGhyZWFkcyBjYW4gc3RhcnQgZXhpdGluZywgd2hpY2ggaXMgYmFkIGlmIHRoZQorICAgICAgICAvLyB3b3JrIGl0ZW0gc3VibWl0cyBvdGhlciB3b3JrLiBTbyB3ZSBqdXN0IGNoZWNrIGVtcHRpbmVzcyBoZXJlLAorICAgICAgICAvLyB3aGljaCBlbnN1cmVzIHRoYXQgYWxsIHdvcmtlciB0aHJlYWRzIGV4aXQgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgYmxvY2tlZF8tLTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICAvLyBSZWFjaGVkIHN0YWJsZSB0ZXJtaW5hdGlvbiBzdGF0ZS4KKyAgICAgIGVjXy5Ob3RpZnkodHJ1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVjXy5Db21taXRXYWl0KHdhaXRlcik7CisgICAgYmxvY2tlZF8tLTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludCBOb25FbXB0eVF1ZXVlSW5kZXgoKSB7CisgICAgUGVyVGhyZWFkKiBwdCA9IEdldFBlclRocmVhZCgpOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gcXVldWVzXy5zaXplKCk7CisgICAgdW5zaWduZWQgciA9IFJhbmQoJnB0LT5yYW5kKTsKKyAgICB1bnNpZ25lZCBpbmMgPSBjb3ByaW1lc19bciAlIGNvcHJpbWVzXy5zaXplKCldOworICAgIHVuc2lnbmVkIHZpY3RpbSA9IHIgJSBzaXplOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGlmICghcXVldWVzX1t2aWN0aW1dLT5FbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB2aWN0aW07CisgICAgICB9CisgICAgICB2aWN0aW0gKz0gaW5jOworICAgICAgaWYgKHZpY3RpbSA+PSBzaXplKSB7CisgICAgICAgIHZpY3RpbSAtPSBzaXplOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBQZXJUaHJlYWQqIEdldFBlclRocmVhZCgpIHsKKyAgICBFSUdFTl9USFJFQURfTE9DQUwgUGVyVGhyZWFkIHBlcl90aHJlYWRfOworICAgIFBlclRocmVhZCogcHQgPSAmcGVyX3RocmVhZF87CisgICAgcmV0dXJuIHB0OworICB9CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdW5zaWduZWQgUmFuZCh1aW50NjRfdCogc3RhdGUpIHsKKyAgICB1aW50NjRfdCBjdXJyZW50ID0gKnN0YXRlOworICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgICAqc3RhdGUgPSBjdXJyZW50ICogNjM2NDEzNjIyMzg0Njc5MzAwNVVMTCArIDB4ZGEzZTM5Y2I5NGI5NWJkYlVMTDsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgcmFuZG9tIG91dHB1dCAodXNpbmcgdGhlIFBDRy1YU0gtUlMgc2NoZW1lKQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKGN1cnJlbnQgXiAoY3VycmVudCA+PiAyMikpID4+ICgyMiArIChjdXJyZW50ID4+IDYxKSkpOworICB9Cit9OworCit0eXBlZGVmIE5vbkJsb2NraW5nVGhyZWFkUG9vbFRlbXBsPFN0bFRocmVhZEVudmlyb25tZW50PiBOb25CbG9ja2luZ1RocmVhZFBvb2w7CisKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfTk9OQkxPQ0tJTkdfVEhSRUFEX1BPT0xfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvUnVuUXVldWUuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UaHJlYWRQb29sL1J1blF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlZDc2YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UaHJlYWRQb29sL1J1blF1ZXVlLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IERtaXRyeSBWeXVrb3YgPGR2eXVrb3ZAZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9SVU5RVUVVRV9IXworI2RlZmluZSBFSUdFTl9DWFgxMV9USFJFQURQT09MX1JVTlFVRVVFX0hfCisKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLy8gUnVuUXVldWUgaXMgYSBmaXhlZC1zaXplLCBwYXJ0aWFsbHkgbm9uLWJsb2NraW5nIGRlcXVlIG9yIFdvcmsgaXRlbXMuCisvLyBPcGVyYXRpb25zIG9uIGZyb250IG9mIHRoZSBxdWV1ZSBtdXN0IGJlIGRvbmUgYnkgYSBzaW5nbGUgdGhyZWFkIChvd25lciksCisvLyBvcGVyYXRpb25zIG9uIGJhY2sgb2YgdGhlIHF1ZXVlIGNhbiBiZSBkb25lIGJ5IG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LgorLy8KKy8vIEFsZ29yaXRobSBvdXRsaW5lOgorLy8gQWxsIHJlbW90ZSB0aHJlYWRzIG9wZXJhdGluZyBvbiB0aGUgcXVldWUgYmFjayBhcmUgc2VyaWFsaXplZCBieSBhIG11dGV4LgorLy8gVGhpcyBlbnN1cmVzIHRoYXQgYXQgbW9zdCB0d28gdGhyZWFkcyBhY2Nlc3Mgc3RhdGU6IG93bmVyIGFuZCBvbmUgcmVtb3RlCisvLyB0aHJlYWQgKFNpemUgYXNpZGUpLiBUaGUgYWxnb3JpdGhtIGVuc3VyZXMgdGhhdCB0aGUgb2NjdXBpZWQgcmVnaW9uIG9mIHRoZQorLy8gdW5kZXJseWluZyBhcnJheSBpcyBsb2dpY2FsbHkgY29udGludW91cyAoY2FuIHdyYXBhcm91bmQsIGJ1dCBubyBzdHJheQorLy8gb2NjdXBpZWQgZWxlbWVudHMpLiBPd25lciBvcGVyYXRlcyBvbiBvbmUgZW5kIG9mIHRoaXMgcmVnaW9uLCByZW1vdGUgdGhyZWFkCisvLyBvcGVyYXRlcyBvbiB0aGUgb3RoZXIgZW5kLiBTeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGVzZSB0aHJlYWRzCisvLyAocG90ZW50aWFsIGNvbnN1bXB0aW9uIG9mIHRoZSBsYXN0IGVsZW1lbnQgYW5kIHRha2UgdXAgb2YgdGhlIGxhc3QgZW1wdHkKKy8vIGVsZW1lbnQpIGhhcHBlbnMgYnkgbWVhbnMgb2Ygc3RhdGUgdmFyaWFibGUgaW4gZWFjaCBlbGVtZW50LiBTdGF0ZXMgYXJlOgorLy8gZW1wdHksIGJ1c3kgKGluIHByb2Nlc3Mgb2YgaW5zZXJ0aW9uIG9mIHJlbW92YWwpIGFuZCByZWFkeS4gVGhyZWFkcyBjbGFpbQorLy8gZWxlbWVudHMgKGVtcHR5LT5idXN5IGFuZCByZWFkeS0+YnVzeSB0cmFuc2l0aW9ucykgYnkgbWVhbnMgb2YgYSBDQVMKKy8vIG9wZXJhdGlvbi4gVGhlIGZpbmlzaGluZyB0cmFuc2l0aW9uIChidXN5LT5lbXB0eSBhbmQgYnVzeS0+cmVhZHkpIGFyZSBkb25lCisvLyB3aXRoIHBsYWluIHN0b3JlIGFzIHRoZSBlbGVtZW50IGlzIGV4Y2x1c2l2ZWx5IG93bmVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZC4KKy8vCisvLyBOb3RlOiB3ZSBjb3VsZCBwZXJtaXQgb25seSBwb2ludGVycyBhcyBlbGVtZW50cywgdGhlbiB3ZSB3b3VsZCBub3QgbmVlZAorLy8gc2VwYXJhdGUgc3RhdGUgdmFyaWFibGUgYXMgbnVsbC9ub24tbnVsbCBwb2ludGVyIHZhbHVlIHdvdWxkIHNlcnZlIGFzIHN0YXRlLAorLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYWxsb2MvZnJlZSBwZXIgb3BlcmF0aW9uIGZvciBsYXJnZSwgY29tcGxleCB2YWx1ZXMKKy8vIChhbmQgdGhpcyBpcyBkZXNpZ25lZCB0byBzdG9yZSBzdGQ6OmZ1bmN0aW9uPCgpPikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgV29yaywgdW5zaWduZWQga1NpemU+CitjbGFzcyBSdW5RdWV1ZSB7CisgcHVibGljOgorICBSdW5RdWV1ZSgpIDogZnJvbnRfKDApLCBiYWNrXygwKSB7CisgICAgLy8gcmVxdWlyZSBwb3dlci1vZi10d28gZm9yIGZhc3QgbWFza2luZworICAgIGVpZ2VuX2Fzc2VydCgoa1NpemUgJiAoa1NpemUgLSAxKSkgPT0gMCk7CisgICAgZWlnZW5fYXNzZXJ0KGtTaXplID4gMik7ICAgICAgICAgICAgLy8gd2h5IHdvdWxkIHlvdSBkbyB0aGlzPworICAgIGVpZ2VuX2Fzc2VydChrU2l6ZSA8PSAoNjQgPDwgMTApKTsgIC8vIGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgY291bnRlcgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrU2l6ZTsgaSsrKQorICAgICAgYXJyYXlfW2ldLnN0YXRlLnN0b3JlKGtFbXB0eSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KKworICB+UnVuUXVldWUoKSB7IGVpZ2VuX2Fzc2VydChTaXplKCkgPT0gMCk7IH0KKworICAvLyBQdXNoRnJvbnQgaW5zZXJ0cyB3IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLgorICAvLyBJZiBxdWV1ZSBpcyBmdWxsIHJldHVybnMgdywgb3RoZXJ3aXNlIHJldHVybnMgZGVmYXVsdC1jb25zdHJ1Y3RlZCBXb3JrLgorICBXb3JrIFB1c2hGcm9udChXb3JrIHcpIHsKKyAgICB1bnNpZ25lZCBmcm9udCA9IGZyb250Xy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIEVsZW0qIGUgPSAmYXJyYXlfW2Zyb250ICYga01hc2tdOworICAgIHVpbnQ4X3QgcyA9IGUtPnN0YXRlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaWYgKHMgIT0ga0VtcHR5IHx8CisgICAgICAgICFlLT5zdGF0ZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhzLCBrQnVzeSwgc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSkpCisgICAgICByZXR1cm4gdzsKKyAgICBmcm9udF8uc3RvcmUoZnJvbnQgKyAxICsgKGtTaXplIDw8IDEpLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBlLT53ID0gc3RkOjptb3ZlKHcpOworICAgIGUtPnN0YXRlLnN0b3JlKGtSZWFkeSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgcmV0dXJuIFdvcmsoKTsKKyAgfQorCisgIC8vIFBvcEZyb250IHJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLgorICAvLyBJZiB0aGUgcXVldWUgd2FzIGVtcHR5IHJldHVybnMgZGVmYXVsdC1jb25zdHJ1Y3RlZCBXb3JrLgorICBXb3JrIFBvcEZyb250KCkgeworICAgIHVuc2lnbmVkIGZyb250ID0gZnJvbnRfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgRWxlbSogZSA9ICZhcnJheV9bKGZyb250IC0gMSkgJiBrTWFza107CisgICAgdWludDhfdCBzID0gZS0+c3RhdGUubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAocyAhPSBrUmVhZHkgfHwKKyAgICAgICAgIWUtPnN0YXRlLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKHMsIGtCdXN5LCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkKKyAgICAgIHJldHVybiBXb3JrKCk7CisgICAgV29yayB3ID0gc3RkOjptb3ZlKGUtPncpOworICAgIGUtPnN0YXRlLnN0b3JlKGtFbXB0eSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgZnJvbnQgPSAoKGZyb250IC0gMSkgJiBrTWFzazIpIHwgKGZyb250ICYgfmtNYXNrMik7CisgICAgZnJvbnRfLnN0b3JlKGZyb250LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICByZXR1cm4gdzsKKyAgfQorCisgIC8vIFB1c2hCYWNrIGFkZHMgdyBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZS4KKyAgLy8gSWYgcXVldWUgaXMgZnVsbCByZXR1cm5zIHcsIG90aGVyd2lzZSByZXR1cm5zIGRlZmF1bHQtY29uc3RydWN0ZWQgV29yay4KKyAgV29yayBQdXNoQmFjayhXb3JrIHcpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfKTsKKyAgICB1bnNpZ25lZCBiYWNrID0gYmFja18ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBFbGVtKiBlID0gJmFycmF5X1soYmFjayAtIDEpICYga01hc2tdOworICAgIHVpbnQ4X3QgcyA9IGUtPnN0YXRlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaWYgKHMgIT0ga0VtcHR5IHx8CisgICAgICAgICFlLT5zdGF0ZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhzLCBrQnVzeSwgc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSkpCisgICAgICByZXR1cm4gdzsKKyAgICBiYWNrID0gKChiYWNrIC0gMSkgJiBrTWFzazIpIHwgKGJhY2sgJiB+a01hc2syKTsKKyAgICBiYWNrXy5zdG9yZShiYWNrLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBlLT53ID0gc3RkOjptb3ZlKHcpOworICAgIGUtPnN0YXRlLnN0b3JlKGtSZWFkeSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgcmV0dXJuIFdvcmsoKTsKKyAgfQorCisgIC8vIFBvcEJhY2sgcmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBlbGVtZW50cyBpbiB0aGUgcXVldWUuCisgIC8vIENhbiBmYWlsIHNwdXJpb3VzbHkuCisgIFdvcmsgUG9wQmFjaygpIHsKKyAgICBpZiAoRW1wdHkoKSkgcmV0dXJuIFdvcmsoKTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXhfLCBzdGQ6OnRyeV90b19sb2NrKTsKKyAgICBpZiAoIWxvY2spIHJldHVybiBXb3JrKCk7CisgICAgdW5zaWduZWQgYmFjayA9IGJhY2tfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgRWxlbSogZSA9ICZhcnJheV9bYmFjayAmIGtNYXNrXTsKKyAgICB1aW50OF90IHMgPSBlLT5zdGF0ZS5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChzICE9IGtSZWFkeSB8fAorICAgICAgICAhZS0+c3RhdGUuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcocywga0J1c3ksIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKQorICAgICAgcmV0dXJuIFdvcmsoKTsKKyAgICBXb3JrIHcgPSBzdGQ6Om1vdmUoZS0+dyk7CisgICAgZS0+c3RhdGUuc3RvcmUoa0VtcHR5LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICBiYWNrXy5zdG9yZShiYWNrICsgMSArIChrU2l6ZSA8PCAxKSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIHc7CisgIH0KKworICAvLyBQb3BCYWNrSGFsZiByZW1vdmVzIGFuZCByZXR1cm5zIGhhbGYgbGFzdCBlbGVtZW50cyBpbiB0aGUgcXVldWUuCisgIC8vIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlbW92ZWQuIEJ1dCBjYW4gYWxzbyBmYWlsIHNwdXJpb3VzbHkuCisgIHVuc2lnbmVkIFBvcEJhY2tIYWxmKHN0ZDo6dmVjdG9yPFdvcms+KiByZXN1bHQpIHsKKyAgICBpZiAoRW1wdHkoKSkgcmV0dXJuIDA7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4Xywgc3RkOjp0cnlfdG9fbG9jayk7CisgICAgaWYgKCFsb2NrKSByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBiYWNrID0gYmFja18ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICB1bnNpZ25lZCBzaXplID0gU2l6ZSgpOworICAgIHVuc2lnbmVkIG1pZCA9IGJhY2s7CisgICAgaWYgKHNpemUgPiAxKSBtaWQgPSBiYWNrICsgKHNpemUgLSAxKSAvIDI7CisgICAgdW5zaWduZWQgbiA9IDA7CisgICAgdW5zaWduZWQgc3RhcnQgPSAwOworICAgIGZvciAoOyBzdGF0aWNfY2FzdDxpbnQ+KG1pZCAtIGJhY2spID49IDA7IG1pZC0tKSB7CisgICAgICBFbGVtKiBlID0gJmFycmF5X1ttaWQgJiBrTWFza107CisgICAgICB1aW50OF90IHMgPSBlLT5zdGF0ZS5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBpZiAocyAhPSBrUmVhZHkgfHwKKyAgICAgICAgICAgICFlLT5zdGF0ZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhzLCBrQnVzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc3RhcnQgPSBtaWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3RlOiBubyBuZWVkIHRvIHN0b3JlIHRlbXBvcmFsIGtCdXN5LCB3ZSBleGNsdXNpdmVseSBvd24gdGhlc2UKKyAgICAgICAgLy8gZWxlbWVudHMuCisgICAgICAgIGVpZ2VuX2Fzc2VydChzID09IGtSZWFkeSk7CisgICAgICB9CisgICAgICByZXN1bHQtPnB1c2hfYmFjayhzdGQ6Om1vdmUoZS0+dykpOworICAgICAgZS0+c3RhdGUuc3RvcmUoa0VtcHR5LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICAgIG4rKzsKKyAgICB9CisgICAgaWYgKG4gIT0gMCkKKyAgICAgIGJhY2tfLnN0b3JlKHN0YXJ0ICsgMSArIChrU2l6ZSA8PCAxKSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIG47CisgIH0KKworICAvLyBTaXplIHJldHVybnMgY3VycmVudCBxdWV1ZSBzaXplLgorICAvLyBDYW4gYmUgY2FsbGVkIGJ5IGFueSB0aHJlYWQgYXQgYW55IHRpbWUuCisgIHVuc2lnbmVkIFNpemUoKSBjb25zdCB7CisgICAgLy8gRW1wdGluZXNzIHBsYXlzIGNyaXRpY2FsIHJvbGUgaW4gdGhyZWFkIHBvb2wgYmxvY2tpbmcuIFNvIHdlIGdvIHRvIGdyZWF0CisgICAgLy8gZWZmb3J0IHRvIG5vdCBwcm9kdWNlIGZhbHNlIHBvc2l0aXZlcyAoY2xhaW0gbm9uLWVtcHR5IHF1ZXVlIGFzIGVtcHR5KS4KKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBDYXB0dXJlIGEgY29uc2lzdGVudCBzbmFwc2hvdCBvZiBmcm9udC90YWlsLgorICAgICAgdW5zaWduZWQgZnJvbnQgPSBmcm9udF8ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgIHVuc2lnbmVkIGJhY2sgPSBiYWNrXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgICAgdW5zaWduZWQgZnJvbnQxID0gZnJvbnRfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICBpZiAoZnJvbnQgIT0gZnJvbnQxKSBjb250aW51ZTsKKyAgICAgIGludCBzaXplID0gKGZyb250ICYga01hc2syKSAtIChiYWNrICYga01hc2syKTsKKyAgICAgIC8vIEZpeCBvdmVyZmxvdy4KKyAgICAgIGlmIChzaXplIDwgMCkgc2l6ZSArPSAyICoga1NpemU7CisgICAgICAvLyBPcmRlciBvZiBtb2RpZmljYXRpb24gaW4gcHVzaC9wb3AgaXMgY3JhZnRlZCB0byBtYWtlIHRoZSBxdWV1ZSBsb29rCisgICAgICAvLyBsYXJnZXIgdGhhbiBpdCBpcyBkdXJpbmcgY29uY3VycmVudCBtb2RpZmljYXRpb25zLiBFLmcuIHBvcCBjYW4KKyAgICAgIC8vIGRlY3JlbWVudCBzaXplIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBwdXNoIGhhcyBpbmNyZW1lbnRlZCBpdC4KKyAgICAgIC8vIFNvIHRoZSBjb21wdXRlZCBzaXplIGNhbiBiZSB1cCB0byBrU2l6ZSArIDEsIGZpeCBpdC4KKyAgICAgIGlmIChzaXplID4gc3RhdGljX2Nhc3Q8aW50PihrU2l6ZSkpIHNpemUgPSBrU2l6ZTsKKyAgICAgIHJldHVybiBzaXplOworICAgIH0KKyAgfQorCisgIC8vIEVtcHR5IHRlc3RzIHdoZXRoZXIgY29udGFpbmVyIGlzIGVtcHR5LgorICAvLyBDYW4gYmUgY2FsbGVkIGJ5IGFueSB0aHJlYWQgYXQgYW55IHRpbWUuCisgIGJvb2wgRW1wdHkoKSBjb25zdCB7IHJldHVybiBTaXplKCkgPT0gMDsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtNYXNrID0ga1NpemUgLSAxOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQga01hc2syID0gKGtTaXplIDw8IDEpIC0gMTsKKyAgc3RydWN0IEVsZW0geworICAgIHN0ZDo6YXRvbWljPHVpbnQ4X3Q+IHN0YXRlOworICAgIFdvcmsgdzsKKyAgfTsKKyAgZW51bSB7CisgICAga0VtcHR5LAorICAgIGtCdXN5LAorICAgIGtSZWFkeSwKKyAgfTsKKyAgc3RkOjptdXRleCBtdXRleF87CisgIC8vIExvdyBsb2coa1NpemUpICsgMSBiaXRzIGluIGZyb250XyBhbmQgYmFja18gY29udGFpbiByb2xsaW5nIGluZGV4IG9mCisgIC8vIGZyb250L2JhY2ssIHJlcHNlY3RpdmVseS4gVGhlIHJlbWFpbmluZyBiaXRzIGNvbnRhaW4gbW9kaWZpY2F0aW9uIGNvdW50ZXJzCisgIC8vIHRoYXQgYXJlIGluY3JlbWVudGVkIG9uIFB1c2ggb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3MgdXMgdG8gKDEpIGRpc3Rpbmd1aXNoCisgIC8vIGJldHdlZW4gZW1wdHkgYW5kIGZ1bGwgY29uZGl0aW9ucyAoaWYgd2Ugd291bGQgdXNlIGxvZyhrU2l6ZSkgYml0cyBmb3IKKyAgLy8gcG9zaXRpb24sIHRoZXNlIGNvbmRpdGlvbnMgd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUpOyAoMikgb2J0YWluCisgIC8vIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgZnJvbnRfL2JhY2tfIGZvciBTaXplIG9wZXJhdGlvbiB1c2luZyB0aGUKKyAgLy8gbW9kaWZpY2F0aW9uIGNvdW50ZXJzLgorICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gZnJvbnRfOworICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gYmFja187CisgIEVsZW0gYXJyYXlfW2tTaXplXTsKKworICBSdW5RdWV1ZShjb25zdCBSdW5RdWV1ZSYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSdW5RdWV1ZSYpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9SVU5RVUVVRV9IXwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvU2ltcGxlVGhyZWFkUG9vbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvU2ltcGxlVGhyZWFkUG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWQwZjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9TaW1wbGVUaHJlYWRQb29sLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9TSU1QTEVfVEhSRUFEX1BPT0xfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9USFJFQURQT09MX1NJTVBMRV9USFJFQURfUE9PTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyZWFkUG9vbCB0eXBlIGVuc3VyZXMgdGhhdCB0aGUgU2NoZWR1bGUgbWV0aG9kCisvLyBydW5zIHRoZSBmdW5jdGlvbnMgaXQgaXMgcHJvdmlkZWQgaW4gRklGTyBvcmRlciB3aGVuIHRoZSBzY2hlZHVsaW5nIGlzIGRvbmUKKy8vIGJ5IGEgc2luZ2xlIHRocmVhZC4KKy8vIEVudmlyb25tZW50IHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSB0aHJlYWRzIGFuZCBhbHNvIGFsbG93cyB0byBpbnRlcmNlcHQKKy8vIHRhc2sgc3VibWlzc2lvbiBhbmQgZXhlY3V0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEVudmlyb25tZW50PgorY2xhc3MgU2ltcGxlVGhyZWFkUG9vbFRlbXBsIDogcHVibGljIFRocmVhZFBvb2xJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0IGEgcG9vbCB0aGF0IGNvbnRhaW5zICJudW1fdGhyZWFkcyIgdGhyZWFkcy4KKyAgZXhwbGljaXQgU2ltcGxlVGhyZWFkUG9vbFRlbXBsKGludCBudW1fdGhyZWFkcywgRW52aXJvbm1lbnQgZW52ID0gRW52aXJvbm1lbnQoKSkKKyAgICAgIDogZW52XyhlbnYpLCB0aHJlYWRzXyhudW1fdGhyZWFkcyksIHdhaXRlcnNfKG51bV90aHJlYWRzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CisgICAgICB0aHJlYWRzXy5wdXNoX2JhY2soZW52LkNyZWF0ZVRocmVhZChbdGhpcywgaV0oKSB7IFdvcmtlckxvb3AoaSk7IH0pKTsKKyAgICB9CisgIH0KKworICAvLyBXYWl0IHVudGlsIGFsbCBzY2hlZHVsZWQgd29yayBoYXMgZmluaXNoZWQgYW5kIHRoZW4gZGVzdHJveSB0aGUKKyAgLy8gc2V0IG9mIHRocmVhZHMuCisgIH5TaW1wbGVUaHJlYWRQb29sVGVtcGwoKSB7CisgICAgeworICAgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmsgdG8gZ2V0IGRvbmUuCisgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGwobXVfKTsKKyAgICAgIHdoaWxlICghcGVuZGluZ18uZW1wdHkoKSkgeworICAgICAgICBlbXB0eV8ud2FpdChsKTsKKyAgICAgIH0KKyAgICAgIGV4aXRpbmdfID0gdHJ1ZTsKKworICAgICAgLy8gV2FrZXVwIGFsbCB3YWl0ZXJzLgorICAgICAgZm9yIChhdXRvIHcgOiB3YWl0ZXJzXykgeworICAgICAgICB3LT5yZWFkeSA9IHRydWU7CisgICAgICAgIHctPnRhc2suZiA9IG51bGxwdHI7CisgICAgICAgIHctPmN2Lm5vdGlmeV9vbmUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciB0aHJlYWRzIHRvIGZpbmlzaC4KKyAgICBmb3IgKGF1dG8gdCA6IHRocmVhZHNfKSB7CisgICAgICBkZWxldGUgdDsKKyAgICB9CisgIH0KKworICAvLyBTY2hlZHVsZSBmbigpIGZvciBleGVjdXRpb24gaW4gdGhlIHBvb2wgb2YgdGhyZWFkcy4gVGhlIGZ1bmN0aW9ucyBhcmUKKyAgLy8gZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHNjaGVkdWxlZC4KKyAgdm9pZCBTY2hlZHVsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZm4pIGZpbmFsIHsKKyAgICBUYXNrIHQgPSBlbnZfLkNyZWF0ZVRhc2soc3RkOjptb3ZlKGZuKSk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsKG11Xyk7CisgICAgaWYgKHdhaXRlcnNfLmVtcHR5KCkpIHsKKyAgICAgIHBlbmRpbmdfLnB1c2hfYmFjayhzdGQ6Om1vdmUodCkpOworICAgIH0gZWxzZSB7CisgICAgICBXYWl0ZXIqIHcgPSB3YWl0ZXJzXy5iYWNrKCk7CisgICAgICB3YWl0ZXJzXy5wb3BfYmFjaygpOworICAgICAgdy0+cmVhZHkgPSB0cnVlOworICAgICAgdy0+dGFzayA9IHN0ZDo6bW92ZSh0KTsKKyAgICAgIHctPmN2Lm5vdGlmeV9vbmUoKTsKKyAgICB9CisgIH0KKworICBpbnQgTnVtVGhyZWFkcygpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aHJlYWRzXy5zaXplKCkpOworICB9CisKKyAgaW50IEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IGZpbmFsIHsKKyAgICBjb25zdCBQZXJUaHJlYWQqIHB0ID0gdGhpcy0+R2V0UGVyVGhyZWFkKCk7CisgICAgaWYgKHB0LT5wb29sID09IHRoaXMpIHsKKyAgICAgIHJldHVybiBwdC0+dGhyZWFkX2lkOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgV29ya2VyTG9vcChpbnQgdGhyZWFkX2lkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsKG11Xyk7CisgICAgUGVyVGhyZWFkKiBwdCA9IEdldFBlclRocmVhZCgpOworICAgIHB0LT5wb29sID0gdGhpczsKKyAgICBwdC0+dGhyZWFkX2lkID0gdGhyZWFkX2lkOworICAgIFdhaXRlciB3OworICAgIFRhc2sgdDsKKyAgICB3aGlsZSAoIWV4aXRpbmdfKSB7CisgICAgICBpZiAocGVuZGluZ18uZW1wdHkoKSkgeworICAgICAgICAvLyBXYWl0IGZvciB3b3JrIHRvIGJlIGFzc2lnbmVkIHRvIG1lCisgICAgICAgIHcucmVhZHkgPSBmYWxzZTsKKyAgICAgICAgd2FpdGVyc18ucHVzaF9iYWNrKCZ3KTsKKyAgICAgICAgd2hpbGUgKCF3LnJlYWR5KSB7CisgICAgICAgICAgdy5jdi53YWl0KGwpOworICAgICAgICB9CisgICAgICAgIHQgPSB3LnRhc2s7CisgICAgICAgIHcudGFzay5mID0gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBpY2sgdXAgcGVuZGluZyB3b3JrCisgICAgICAgIHQgPSBzdGQ6Om1vdmUocGVuZGluZ18uZnJvbnQoKSk7CisgICAgICAgIHBlbmRpbmdfLnBvcF9mcm9udCgpOworICAgICAgICBpZiAocGVuZGluZ18uZW1wdHkoKSkgeworICAgICAgICAgIGVtcHR5Xy5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0LmYpIHsKKyAgICAgICAgbXVfLnVubG9jaygpOworICAgICAgICBlbnZfLkV4ZWN1dGVUYXNrKHQpOworICAgICAgICB0LmYgPSBudWxscHRyOworICAgICAgICBtdV8ubG9jaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgdHlwZWRlZiB0eXBlbmFtZSBFbnZpcm9ubWVudDo6VGFzayBUYXNrOworICB0eXBlZGVmIHR5cGVuYW1lIEVudmlyb25tZW50OjpFbnZUaHJlYWQgVGhyZWFkOworCisgIHN0cnVjdCBXYWl0ZXIgeworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2OworICAgIFRhc2sgdGFzazsKKyAgICBib29sIHJlYWR5OworICB9OworCisgIHN0cnVjdCBQZXJUaHJlYWQgeworICAgIGNvbnN0ZXhwciBQZXJUaHJlYWQoKSA6IHBvb2woTlVMTCksIHRocmVhZF9pZCgtMSkgeyB9CisgICAgU2ltcGxlVGhyZWFkUG9vbFRlbXBsKiBwb29sOyAgLy8gUGFyZW50IHBvb2wsIG9yIG51bGwgZm9yIG5vcm1hbCB0aHJlYWRzLgorICAgIGludCB0aHJlYWRfaWQ7ICAgICAgICAgICAgICAgIC8vIFdvcmtlciB0aHJlYWQgaW5kZXggaW4gcG9vbC4KKyAgfTsKKworICBFbnZpcm9ubWVudCBlbnZfOworICBzdGQ6Om11dGV4IG11XzsKKyAgTWF4U2l6ZVZlY3RvcjxUaHJlYWQqPiB0aHJlYWRzXzsgIC8vIEFsbCB0aHJlYWRzCisgIE1heFNpemVWZWN0b3I8V2FpdGVyKj4gd2FpdGVyc187ICAvLyBTdGFjayBvZiB3YWl0aW5nIHRocmVhZHMuCisgIHN0ZDo6ZGVxdWU8VGFzaz4gcGVuZGluZ187ICAgICAgICAvLyBRdWV1ZSBvZiBwZW5kaW5nIHdvcmsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgZW1wdHlfOyAgIC8vIFNpZ25hbGVkIG9uIHBlbmRpbmdfLmVtcHR5KCkKKyAgYm9vbCBleGl0aW5nXyA9IGZhbHNlOworCisgIFBlclRocmVhZCogR2V0UGVyVGhyZWFkKCkgY29uc3QgeworICAgIEVJR0VOX1RIUkVBRF9MT0NBTCBQZXJUaHJlYWQgcGVyX3RocmVhZDsKKyAgICByZXR1cm4gJnBlcl90aHJlYWQ7CisgIH0KK307CisKK3R5cGVkZWYgU2ltcGxlVGhyZWFkUG9vbFRlbXBsPFN0bFRocmVhZEVudmlyb25tZW50PiBTaW1wbGVUaHJlYWRQb29sOworCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBFSUdFTl9DWFgxMV9USFJFQURQT09MX1NJTVBMRV9USFJFQURfUE9PTF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9UaHJlYWRFbnZpcm9ubWVudC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkRW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlmOTVjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkRW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfVEhSRUFEX0VOVklST05NRU5UX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9USFJFQURfRU5WSVJPTk1FTlRfSAorCituYW1lc3BhY2UgRWlnZW4geworCitzdHJ1Y3QgU3RsVGhyZWFkRW52aXJvbm1lbnQgeworICBzdHJ1Y3QgVGFzayB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGY7CisgIH07CisKKyAgLy8gRW52VGhyZWFkIGNvbnN0cnVjdG9yIG11c3Qgc3RhcnQgdGhlIHRocmVhZCwKKyAgLy8gZGVzdHJ1Y3RvciBtdXN0IGpvaW4gdGhlIHRocmVhZC4KKyAgY2xhc3MgRW52VGhyZWFkIHsKKyAgIHB1YmxpYzoKKyAgICBFbnZUaHJlYWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGYpIDogdGhyXyhzdGQ6Om1vdmUoZikpIHt9CisgICAgfkVudlRocmVhZCgpIHsgdGhyXy5qb2luKCk7IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnRocmVhZCB0aHJfOworICB9OworCisgIEVudlRocmVhZCogQ3JlYXRlVGhyZWFkKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmKSB7IHJldHVybiBuZXcgRW52VGhyZWFkKHN0ZDo6bW92ZShmKSk7IH0KKyAgVGFzayBDcmVhdGVUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmKSB7IHJldHVybiBUYXNre3N0ZDo6bW92ZShmKX07IH0KKyAgdm9pZCBFeGVjdXRlVGFzayhjb25zdCBUYXNrJiB0KSB7IHQuZigpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmICAvLyBFSUdFTl9DWFgxMV9USFJFQURQT09MX1RIUkVBRF9FTlZJUk9OTUVOVF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9UaHJlYWRMb2NhbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmEyMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkTG9jYWwuaApAQCAtMCwwICsxLDIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfVEhSRUFEX0xPQ0FMX0gKKyNkZWZpbmUgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9USFJFQURfTE9DQUxfSAorCisvLyBUcnkgdG8gY29tZSB1cCB3aXRoIGEgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkIGxvY2FsIHZhcmlhYmxlcworI2lmIEVJR0VOX0NPTVBfR05VQyAmJiBFSUdFTl9HTlVDX0FUX01PU1QoNCwgNykKKyNkZWZpbmUgRUlHRU5fVEhSRUFEX0xPQ0FMIHN0YXRpYyBfX3RocmVhZAorI2VsaWYgRUlHRU5fQ09NUF9DTEFORworI2RlZmluZSBFSUdFTl9USFJFQURfTE9DQUwgc3RhdGljIF9fdGhyZWFkCisjZWxzZQorI2RlZmluZSBFSUdFTl9USFJFQURfTE9DQUwgc3RhdGljIHRocmVhZF9sb2NhbAorI2VuZGlmCisKKyNlbmRpZiAgLy8gRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9USFJFQURfTE9DQUxfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkUG9vbEludGVyZmFjZS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RocmVhZFBvb2wvVGhyZWFkUG9vbEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWVlOTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9UaHJlYWRQb29sSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DWFgxMV9USFJFQURQT09MX1RIUkVBRF9QT09MX0lOVEVSRkFDRV9ICisjZGVmaW5lIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfVEhSRUFEX1BPT0xfSU5URVJGQUNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLy8gVGhpcyBkZWZpbmVzIGFuIGludGVyZmFjZSB0aGF0IFRocmVhZFBvb2xEZXZpY2UgY2FuIHRha2UgdG8gdXNlCisvLyBjdXN0b20gdGhyZWFkIHBvb2xzIHVuZGVybmVhdGguCitjbGFzcyBUaHJlYWRQb29sSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTY2hlZHVsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZm4pID0gMDsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgcG9vbC4KKyAgdmlydHVhbCBpbnQgTnVtVGhyZWFkcygpIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm5zIGEgbG9naWNhbCB0aHJlYWQgaW5kZXggYmV0d2VlbiAwIGFuZCBOdW1UaHJlYWRzKCkgLSAxIGlmIGNhbGxlZAorICAvLyBmcm9tIG9uZSBvZiB0aGUgdGhyZWFkcyBpbiB0aGUgcG9vbC4gUmV0dXJucyAtMSBvdGhlcndpc2UuCisgIHZpcnR1YWwgaW50IEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIH5UaHJlYWRQb29sSW50ZXJmYWNlKCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfVEhSRUFEX1BPT0xfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy9UaHJlYWRQb29sL1RocmVhZFlpZWxkLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9UaHJlYWRZaWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTljN2IKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvVGhyZWFkUG9vbC9UaHJlYWRZaWVsZC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFfVEhSRUFEUE9PTF9USFJFQURfWUlFTERfSAorI2RlZmluZSBFSUdFTl9DWFgxMV9USFJFQURQT09MX1RIUkVBRF9ZSUVMRF9ICisKKy8vIFRyeSB0byBjb21lIHVwIHdpdGggYSBwb3J0YWJsZSB3YXkgdG8geWllbGQKKyNpZiBFSUdFTl9DT01QX0dOVUMgJiYgRUlHRU5fR05VQ19BVF9NT1NUKDQsIDcpCisjZGVmaW5lIEVJR0VOX1RIUkVBRF9ZSUVMRCgpIHNjaGVkX3lpZWxkKCkKKyNlbHNlCisjZGVmaW5lIEVJR0VOX1RIUkVBRF9ZSUVMRCgpIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCkKKyNlbmRpZgorCisjZW5kaWYgIC8vIEVJR0VOX0NYWDExX1RIUkVBRFBPT0xfVEhSRUFEX1lJRUxEX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL0NYWDExTWV0YS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL3V0aWwvQ1hYMTFNZXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyN2VkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL0NYWDExTWV0YS5oCkBAIC0wLDAgKzEsNTQyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBDaHJpc3RpYW4gU2VpbGVyIDxjaHJpc3RpYW5AaXdha2QuZGU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NYWDExTUVUQV9ICisjZGVmaW5lIEVJR0VOX0NYWDExTUVUQV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiRW11bGF0ZUFycmF5LmgiCisKKy8vIEVtdWxhdGUgdGhlIGN4eDExIGZ1bmN0aW9uYWxpdHkgdGhhdCB3ZSBuZWVkIGlmIHRoZSBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgaXQuCisvLyBWaXN1YWwgc3R1ZGlvIDIwMTUgZG9lc24ndCBhZHZlcnRpc2UgaXRzZWxmIGFzIGN4eDExIGNvbXBsaWFudCwgYWx0aG91Z2ggaXQKKy8vIHN1cHBvcnRzIGVub3VnaCBvZiB0aGUgc3RhbmRhcmQgZm9yIG91ciBuZWVkcworI2lmIF9fY3BsdXNwbHVzID4gMTk5NzExTCB8fCBFSUdFTl9DT01QX01TVkMgPj0gMTkwMAorCisjaW5jbHVkZSAiQ1hYMTFXb3JrYXJvdW5kcy5oIgorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogXGZpbGUgQ1hYMTEvdXRpbC9DWFgxMU1ldGEuaAorICAqIFRoaXMgZmlsZSBjb250YWlucyBnZW5lcmljIG1ldGFwcm9ncmFtbWluZyBjbGFzc2VzIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gRWlnZW4uCisgICogVGhpcyBmaWxlIGV4cGFuZHMgdXBvbiBDb3JlL3V0aWwvTWV0YS5oIGFuZCBhZGRzIHN1cHBvcnQgZm9yIEMrKzExIHNwZWNpZmljIGZlYXR1cmVzLgorICAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiB0dD4KK3N0cnVjdCB0eXBlX2xpc3QgeyBjb25zdGV4cHIgc3RhdGljIGludCBjb3VudCA9IHNpemVvZi4uLih0dCk7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIHQsIHR5cGVuYW1lLi4uIHR0Pgorc3RydWN0IHR5cGVfbGlzdDx0LCB0dC4uLj4geyBjb25zdGV4cHIgc3RhdGljIGludCBjb3VudCA9IHNpemVvZi4uLih0dCkgKyAxOyB0eXBlZGVmIHQgZmlyc3RfdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVC4uLiBubj4KK3N0cnVjdCBudW1lcmljX2xpc3QgeyBjb25zdGV4cHIgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50ID0gc2l6ZW9mLi4uKG5uKTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBuLCBULi4uIG5uPgorc3RydWN0IG51bWVyaWNfbGlzdDxULCBuLCBubi4uLj4geyBjb25zdGV4cHIgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50ID0gc2l6ZW9mLi4uKG5uKSArIDE7IGNvbnN0ZXhwciBzdGF0aWMgVCBmaXJzdF92YWx1ZSA9IG47IH07CisKKy8qIG51bWVyaWMgbGlzdCBjb25zdHJ1Y3RvcnMKKyAqCisgKiBlcXVpdmFsZW5jaWVzOgorICogICAgIGNvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdAorICogICAgIHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCA1Pjo6dHlwZSAgICAgICAgICAgICAgICAgIG51bWVyaWNfbGlzdDxpbnQsIDAsMSwyLDMsND4KKyAqICAgICB0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgNT46OnR5cGUgICAgICAgICBudW1lcmljX2xpc3Q8aW50LCA0LDMsMiwxLDA+CisgKiAgICAgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCA1LDEsMj46OnR5cGUgbnVtZXJpY19saXN0PGludCwgMCwyLDEsMyw0PgorICogICAgIHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8aW50LCAwLCA1Pjo6dHlwZSAgICAgIG51bWVyaWNfbGlzdDxpbnQsIDAsMCwwLDAsMD4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBuLCBUIHN0YXJ0ID0gMCwgVC4uLiBpaT4gc3RydWN0IGdlbl9udW1lcmljX2xpc3QgICAgICAgICAgICAgICAgICAgICA6IGdlbl9udW1lcmljX2xpc3Q8VCwgbi0xLCBzdGFydCwgc3RhcnQgKyBuLTEsIGlpLi4uPiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIFQgc3RhcnQsIFQuLi4gaWk+ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2VuX251bWVyaWNfbGlzdDxULCAwLCBzdGFydCwgaWkuLi4+IHsgdHlwZWRlZiBudW1lcmljX2xpc3Q8VCwgaWkuLi4+IHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IG4sIFQgc3RhcnQgPSAwLCBULi4uIGlpPiBzdHJ1Y3QgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZCAgICAgICAgICAgICAgICAgICAgIDogZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxULCBuLTEsIHN0YXJ0LCBpaS4uLiwgc3RhcnQgKyBuLTE+IHt9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBzdGFydCwgVC4uLiBpaT4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPFQsIDAsIHN0YXJ0LCBpaS4uLj4geyB0eXBlZGVmIG51bWVyaWNfbGlzdDxULCBpaS4uLj4gdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgbiwgVCBhLCBUIGIsIFQgc3RhcnQgPSAwLCBULi4uIGlpPiBzdHJ1Y3QgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXIgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPFQsIG4tMSwgYSwgYiwgc3RhcnQsIChzdGFydCArIG4tMSkgPT0gYSA/IGIgOiAoKHN0YXJ0ICsgbi0xKSA9PSBiID8gYSA6IChzdGFydCArIG4tMSkpLCBpaS4uLj4ge307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIGEsIFQgYiwgVCBzdGFydCwgVC4uLiBpaT4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxULCAwLCBhLCBiLCBzdGFydCwgaWkuLi4+IHsgdHlwZWRlZiBudW1lcmljX2xpc3Q8VCwgaWkuLi4+IHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IG4sIFQgViwgVC4uLiBubj4gc3RydWN0IGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQgICAgICAgICAgICAgICAgIDogZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxULCBuLTEsIFYsIFYsIG5uLi4uPiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIFQgViwgVC4uLiBubj4gICAgICAgICAgICAgICAgc3RydWN0IGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8VCwgMCwgViwgbm4uLi4+IHsgdHlwZWRlZiBudW1lcmljX2xpc3Q8VCwgbm4uLi4+IHR5cGU7IH07CisKKy8qIGxpc3QgbWFuaXB1bGF0aW9uOiBjb25jYXRlbmF0ZSAqLworCit0ZW1wbGF0ZTxjbGFzcyBhLCBjbGFzcyBiPiBzdHJ1Y3QgY29uY2F0OworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBhcywgdHlwZW5hbWUuLi4gYnM+IHN0cnVjdCBjb25jYXQ8dHlwZV9saXN0PGFzLi4uPiwgICAgICAgdHlwZV9saXN0PGJzLi4uPj4gICAgICAgIHsgdHlwZWRlZiB0eXBlX2xpc3Q8YXMuLi4sIGJzLi4uPiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVC4uLiBhcywgVC4uLiBicz4gICBzdHJ1Y3QgY29uY2F0PG51bWVyaWNfbGlzdDxULCBhcy4uLj4sIG51bWVyaWNfbGlzdDxULCBicy4uLj4gPiB7IHR5cGVkZWYgbnVtZXJpY19saXN0PFQsIGFzLi4uLCBicy4uLj4gdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gcD4gc3RydWN0IG1jb25jYXQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1jb25jYXQ8YT4gICAgICAgICAgIHsgdHlwZWRlZiBhIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBhLCB0eXBlbmFtZSBiPiAgICAgICAgICAgICAgICAgc3RydWN0IG1jb25jYXQ8YSwgYj4gICAgICAgIDogY29uY2F0PGEsIGI+IHt9OwordGVtcGxhdGU8dHlwZW5hbWUgYSwgdHlwZW5hbWUgYiwgdHlwZW5hbWUuLi4gY3M+IHN0cnVjdCBtY29uY2F0PGEsIGIsIGNzLi4uPiA6IGNvbmNhdDxhLCB0eXBlbmFtZSBtY29uY2F0PGIsIGNzLi4uPjo6dHlwZT4ge307CisKKy8qIGxpc3QgbWFuaXB1bGF0aW9uOiBleHRyYWN0IHNsaWNlcyAqLworCit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgeD4gc3RydWN0IHRha2U7Cit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgYSwgdHlwZW5hbWUuLi4gYXM+IHN0cnVjdCB0YWtlPG4sIHR5cGVfbGlzdDxhLCBhcy4uLj4+IDogY29uY2F0PHR5cGVfbGlzdDxhPiwgdHlwZW5hbWUgdGFrZTxuLTEsIHR5cGVfbGlzdDxhcy4uLj4+Ojp0eXBlPiB7fTsKK3RlbXBsYXRlPGludCBuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRha2U8biwgdHlwZV9saXN0PD4+ICAgICAgICAgeyB0eXBlZGVmIHR5cGVfbGlzdDw+IHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBhLCB0eXBlbmFtZS4uLiBhcz4gICAgICAgIHN0cnVjdCB0YWtlPDAsIHR5cGVfbGlzdDxhLCBhcy4uLj4+IHsgdHlwZWRlZiB0eXBlX2xpc3Q8PiB0eXBlOyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFrZTwwLCB0eXBlX2xpc3Q8Pj4gICAgICAgICB7IHR5cGVkZWYgdHlwZV9saXN0PD4gdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4sIFQgYSwgVC4uLiBhcz4gc3RydWN0IHRha2U8biwgbnVtZXJpY19saXN0PFQsIGEsIGFzLi4uPj4gOiBjb25jYXQ8bnVtZXJpY19saXN0PFQsIGE+LCB0eXBlbmFtZSB0YWtlPG4tMSwgbnVtZXJpY19saXN0PFQsIGFzLi4uPj46OnR5cGU+IHt9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4+ICAgICAgICAgICAgICAgc3RydWN0IHRha2U8biwgbnVtZXJpY19saXN0PFQ+PiAgICAgICAgICAgeyB0eXBlZGVmIG51bWVyaWNfbGlzdDxUPiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBhLCBULi4uIGFzPiAgICAgICAgc3RydWN0IHRha2U8MCwgbnVtZXJpY19saXN0PFQsIGEsIGFzLi4uPj4geyB0eXBlZGVmIG51bWVyaWNfbGlzdDxUPiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRha2U8MCwgbnVtZXJpY19saXN0PFQ+PiAgICAgICAgICAgeyB0eXBlZGVmIG51bWVyaWNfbGlzdDxUPiB0eXBlOyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgbiwgVC4uLiBpaT4gICAgICBzdHJ1Y3QgaF9za2lwX2hlbHBlcl9udW1lcmljOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4sIFQgaSwgVC4uLiBpaT4gc3RydWN0IGhfc2tpcF9oZWxwZXJfbnVtZXJpYzxULCBuLCBpLCBpaS4uLj4gOiBoX3NraXBfaGVscGVyX251bWVyaWM8VCwgbi0xLCBpaS4uLj4ge307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIGksIFQuLi4gaWk+ICAgICAgICBzdHJ1Y3QgaF9za2lwX2hlbHBlcl9udW1lcmljPFQsIDAsIGksIGlpLi4uPiB7IHR5cGVkZWYgbnVtZXJpY19saXN0PFQsIGksIGlpLi4uPiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4+ICAgICAgICAgICAgICAgc3RydWN0IGhfc2tpcF9oZWxwZXJfbnVtZXJpYzxULCBuPiAgICAgICAgICAgeyB0eXBlZGVmIG51bWVyaWNfbGlzdDxUPiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhfc2tpcF9oZWxwZXJfbnVtZXJpYzxULCAwPiAgICAgICAgICAgeyB0eXBlZGVmIG51bWVyaWNfbGlzdDxUPiB0eXBlOyB9OworCit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUuLi4gdHQ+ICAgICAgICAgICAgIHN0cnVjdCBoX3NraXBfaGVscGVyX3R5cGU7Cit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgdCwgdHlwZW5hbWUuLi4gdHQ+IHN0cnVjdCBoX3NraXBfaGVscGVyX3R5cGU8biwgdCwgdHQuLi4+IDogaF9za2lwX2hlbHBlcl90eXBlPG4tMSwgdHQuLi4+IHt9OwordGVtcGxhdGU8dHlwZW5hbWUgdCwgdHlwZW5hbWUuLi4gdHQ+ICAgICAgICBzdHJ1Y3QgaF9za2lwX2hlbHBlcl90eXBlPDAsIHQsIHR0Li4uPiB7IHR5cGVkZWYgdHlwZV9saXN0PHQsIHR0Li4uPiB0eXBlOyB9OwordGVtcGxhdGU8aW50IG4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaF9za2lwX2hlbHBlcl90eXBlPG4+ICAgICAgICAgICB7IHR5cGVkZWYgdHlwZV9saXN0PD4gdHlwZTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhfc2tpcF9oZWxwZXJfdHlwZTwwPiAgICAgICAgICAgeyB0eXBlZGVmIHR5cGVfbGlzdDw+IHR5cGU7IH07CisKK3RlbXBsYXRlPGludCBuPgorc3RydWN0IGhfc2tpcCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIFQuLi4gaWk+CisgIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIGhfc2tpcF9oZWxwZXJfbnVtZXJpYzxULCBuLCBpaS4uLj46OnR5cGUgaGVscGVyKG51bWVyaWNfbGlzdDxULCBpaS4uLj4pIHsgcmV0dXJuIHR5cGVuYW1lIGhfc2tpcF9oZWxwZXJfbnVtZXJpYzxULCBuLCBpaS4uLj46OnR5cGUoKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiB0dD4KKyAgY29uc3RleHByIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgaF9za2lwX2hlbHBlcl90eXBlPG4sIHR0Li4uPjo6dHlwZSBoZWxwZXIodHlwZV9saXN0PHR0Li4uPikgeyByZXR1cm4gdHlwZW5hbWUgaF9za2lwX2hlbHBlcl90eXBlPG4sIHR0Li4uPjo6dHlwZSgpOyB9Cit9OworCit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgYT4gc3RydWN0IHNraXAgeyB0eXBlZGVmIGRlY2x0eXBlKGhfc2tpcDxuPjo6aGVscGVyKGEoKSkpIHR5cGU7IH07CisKK3RlbXBsYXRlPGludCBzdGFydCwgaW50IGNvdW50LCB0eXBlbmFtZSBhPiBzdHJ1Y3Qgc2xpY2UgOiB0YWtlPGNvdW50LCB0eXBlbmFtZSBza2lwPHN0YXJ0LCBhPjo6dHlwZT4ge307CisKKy8qIGxpc3QgbWFuaXB1bGF0aW9uOiByZXRyaWV2ZSBzaW5nbGUgZWxlbWVudCBmcm9tIGxpc3QgKi8KKwordGVtcGxhdGU8aW50IG4sIHR5cGVuYW1lIHg+IHN0cnVjdCBnZXQ7CisKK3RlbXBsYXRlPGludCBuLCB0eXBlbmFtZSBhLCB0eXBlbmFtZS4uLiBhcz4gICAgICAgICAgICAgICBzdHJ1Y3QgZ2V0PG4sIHR5cGVfbGlzdDxhLCBhcy4uLj4+ICAgOiBnZXQ8bi0xLCB0eXBlX2xpc3Q8YXMuLi4+PiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIGEsIHR5cGVuYW1lLi4uIGFzPiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2V0PDAsIHR5cGVfbGlzdDxhLCBhcy4uLj4+ICAgeyB0eXBlZGVmIGEgdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IG4sIFQgYSwgVC4uLiBhcz4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2V0PG4sIG51bWVyaWNfbGlzdDxULCBhLCBhcy4uLj4+ICAgOiBnZXQ8bi0xLCBudW1lcmljX2xpc3Q8VCwgYXMuLi4+PiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIFQgYSwgVC4uLiBhcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdldDwwLCBudW1lcmljX2xpc3Q8VCwgYSwgYXMuLi4+PiAgIHsgY29uc3RleHByIHN0YXRpYyBUIHZhbHVlID0gYTsgfTsKKworLyogYWx3YXlzIGdldCB0eXBlLCByZWdhcmRsZXNzIG9mIGR1bW15OyBnb29kIGZvciBwYXJhbWV0ZXIgcGFjayBleHBhbnNpb24gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBkdW1teSwgdHlwZW5hbWUgdD4gc3RydWN0IGlkX251bWVyaWMgIHsgdHlwZWRlZiB0IHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBkdW1teSwgdHlwZW5hbWUgdD4gICAgICBzdHJ1Y3QgaWRfdHlwZSAgICAgeyB0eXBlZGVmIHQgdHlwZTsgfTsKKworLyogZXF1YWxpdHkgY2hlY2tpbmcsIGZsYWdnZWQgdmVyc2lvbiAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBhLCB0eXBlbmFtZSBiPiBzdHJ1Y3QgaXNfc2FtZV9nZiA6IGlzX3NhbWU8YSwgYj4geyBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOyB9OworCisvKiBhcHBseV9vcCB0byBsaXN0ICovCisKK3RlbXBsYXRlPAorICBib29sIGZyb21fbGVmdCwgLy8gZmFsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBvcCwKKyAgdHlwZW5hbWUgYWRkaXRpb25hbF9wYXJhbSwKKyAgdHlwZW5hbWUuLi4gdmFsdWVzCis+CitzdHJ1Y3QgaF9hcHBseV9vcF9oZWxwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlZGVmIHR5cGVfbGlzdDx0eXBlbmFtZSBvcDx2YWx1ZXMsIGFkZGl0aW9uYWxfcGFyYW0+Ojp0eXBlLi4uPiB0eXBlOyB9OwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3Mgb3AsCisgIHR5cGVuYW1lIGFkZGl0aW9uYWxfcGFyYW0sCisgIHR5cGVuYW1lLi4uIHZhbHVlcworPgorc3RydWN0IGhfYXBwbHlfb3BfaGVscGVyPHRydWUsIG9wLCBhZGRpdGlvbmFsX3BhcmFtLCB2YWx1ZXMuLi4+IHsgdHlwZWRlZiB0eXBlX2xpc3Q8dHlwZW5hbWUgb3A8YWRkaXRpb25hbF9wYXJhbSwgdmFsdWVzPjo6dHlwZS4uLj4gdHlwZTsgfTsKKwordGVtcGxhdGU8CisgIGJvb2wgZnJvbV9sZWZ0LAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIG9wLAorICB0eXBlbmFtZSBhZGRpdGlvbmFsX3BhcmFtCis+CitzdHJ1Y3QgaF9hcHBseV9vcAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiB2YWx1ZXM+CisgIGNvbnN0ZXhwciBzdGF0aWMgdHlwZW5hbWUgaF9hcHBseV9vcF9oZWxwZXI8ZnJvbV9sZWZ0LCBvcCwgYWRkaXRpb25hbF9wYXJhbSwgdmFsdWVzLi4uPjo6dHlwZSBoZWxwZXIodHlwZV9saXN0PHZhbHVlcy4uLj4pCisgIHsgcmV0dXJuIHR5cGVuYW1lIGhfYXBwbHlfb3BfaGVscGVyPGZyb21fbGVmdCwgb3AsIGFkZGl0aW9uYWxfcGFyYW0sIHZhbHVlcy4uLj46OnR5cGUoKTsgfQorfTsKKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3Mgb3AsCisgIHR5cGVuYW1lIGFkZGl0aW9uYWxfcGFyYW0sCisgIHR5cGVuYW1lIGEKKz4KK3N0cnVjdCBhcHBseV9vcF9mcm9tX2xlZnQgeyB0eXBlZGVmIGRlY2x0eXBlKGhfYXBwbHlfb3A8dHJ1ZSwgb3AsIGFkZGl0aW9uYWxfcGFyYW0+OjpoZWxwZXIoYSgpKSkgdHlwZTsgfTsKKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3Mgb3AsCisgIHR5cGVuYW1lIGFkZGl0aW9uYWxfcGFyYW0sCisgIHR5cGVuYW1lIGEKKz4KK3N0cnVjdCBhcHBseV9vcF9mcm9tX3JpZ2h0IHsgdHlwZWRlZiBkZWNsdHlwZShoX2FwcGx5X29wPGZhbHNlLCBvcCwgYWRkaXRpb25hbF9wYXJhbT46OmhlbHBlcihhKCkpKSB0eXBlOyB9OworCisvKiBzZWUgaWYgYW4gZWxlbWVudCBpcyBpbiBhIGxpc3QgKi8KKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgdGVzdCwKKyAgdHlwZW5hbWUgY2hlY2tfYWdhaW5zdCwKKyAgdHlwZW5hbWUgaF9saXN0LAorICBib29sIGxhc3RfY2hlY2tfcG9zaXRpdmUgPSBmYWxzZQorPgorc3RydWN0IGNvbnRhaW5lZF9pbl9saXN0OworCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyB0ZXN0LAorICB0eXBlbmFtZSBjaGVja19hZ2FpbnN0LAorICB0eXBlbmFtZSBoX2xpc3QKKz4KK3N0cnVjdCBjb250YWluZWRfaW5fbGlzdDx0ZXN0LCBjaGVja19hZ2FpbnN0LCBoX2xpc3QsIHRydWU+Cit7CisgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyB0ZXN0LAorICB0eXBlbmFtZSBjaGVja19hZ2FpbnN0LAorICB0eXBlbmFtZSBhLAorICB0eXBlbmFtZS4uLiBhcworPgorc3RydWN0IGNvbnRhaW5lZF9pbl9saXN0PHRlc3QsIGNoZWNrX2FnYWluc3QsIHR5cGVfbGlzdDxhLCBhcy4uLj4sIGZhbHNlPiA6IGNvbnRhaW5lZF9pbl9saXN0PHRlc3QsIGNoZWNrX2FnYWluc3QsIHR5cGVfbGlzdDxhcy4uLj4sIHRlc3Q8Y2hlY2tfYWdhaW5zdCwgYT46OnZhbHVlPiB7fTsKKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgdGVzdCwKKyAgdHlwZW5hbWUgY2hlY2tfYWdhaW5zdAorICBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX0RFRkModHlwZW5hbWUsIGVtcHR5KQorPgorc3RydWN0IGNvbnRhaW5lZF9pbl9saXN0PHRlc3QsIGNoZWNrX2FnYWluc3QsIHR5cGVfbGlzdDxFSUdFTl9UUExfUFBfU1BFQ19IQUNLX1VTRShlbXB0eSk+LCBmYWxzZT4geyBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKworLyogc2VlIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBsaXN0IGFuZCBjaGVjayBmb3IgZ2xvYmFsIGZsYWdzICovCisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIHRlc3QsCisgIHR5cGVuYW1lIGNoZWNrX2FnYWluc3QsCisgIHR5cGVuYW1lIGhfbGlzdCwKKyAgaW50IGRlZmF1bHRfZmxhZ3MgPSAwLAorICBib29sIGxhc3RfY2hlY2tfcG9zaXRpdmUgPSBmYWxzZSwKKyAgaW50IGxhc3RfY2hlY2tfZmxhZ3MgPSBkZWZhdWx0X2ZsYWdzCis+CitzdHJ1Y3QgY29udGFpbmVkX2luX2xpc3RfZ2Y7CisKK3RlbXBsYXRlPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIHRlc3QsCisgIHR5cGVuYW1lIGNoZWNrX2FnYWluc3QsCisgIHR5cGVuYW1lIGhfbGlzdCwKKyAgaW50IGRlZmF1bHRfZmxhZ3MsCisgIGludCBsYXN0X2NoZWNrX2ZsYWdzCis+CitzdHJ1Y3QgY29udGFpbmVkX2luX2xpc3RfZ2Y8dGVzdCwgY2hlY2tfYWdhaW5zdCwgaF9saXN0LCBkZWZhdWx0X2ZsYWdzLCB0cnVlLCBsYXN0X2NoZWNrX2ZsYWdzPgoreworICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSBsYXN0X2NoZWNrX2ZsYWdzOworfTsKKwordGVtcGxhdGU8CisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgdGVzdCwKKyAgdHlwZW5hbWUgY2hlY2tfYWdhaW5zdCwKKyAgdHlwZW5hbWUgYSwKKyAgdHlwZW5hbWUuLi4gYXMsCisgIGludCBkZWZhdWx0X2ZsYWdzLAorICBpbnQgbGFzdF9jaGVja19mbGFncworPgorc3RydWN0IGNvbnRhaW5lZF9pbl9saXN0X2dmPHRlc3QsIGNoZWNrX2FnYWluc3QsIHR5cGVfbGlzdDxhLCBhcy4uLj4sIGRlZmF1bHRfZmxhZ3MsIGZhbHNlLCBsYXN0X2NoZWNrX2ZsYWdzPiA6IGNvbnRhaW5lZF9pbl9saXN0X2dmPHRlc3QsIGNoZWNrX2FnYWluc3QsIHR5cGVfbGlzdDxhcy4uLj4sIGRlZmF1bHRfZmxhZ3MsIHRlc3Q8Y2hlY2tfYWdhaW5zdCwgYT46OnZhbHVlLCB0ZXN0PGNoZWNrX2FnYWluc3QsIGE+OjpnbG9iYWxfZmxhZ3M+IHt9OworCit0ZW1wbGF0ZTwKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyB0ZXN0LAorICB0eXBlbmFtZSBjaGVja19hZ2FpbnN0CisgIEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfREVGQyh0eXBlbmFtZSwgZW1wdHkpLAorICBpbnQgZGVmYXVsdF9mbGFncywKKyAgaW50IGxhc3RfY2hlY2tfZmxhZ3MKKz4KK3N0cnVjdCBjb250YWluZWRfaW5fbGlzdF9nZjx0ZXN0LCBjaGVja19hZ2FpbnN0LCB0eXBlX2xpc3Q8RUlHRU5fVFBMX1BQX1NQRUNfSEFDS19VU0UoZW1wdHkpPiwgZGVmYXVsdF9mbGFncywgZmFsc2UsIGxhc3RfY2hlY2tfZmxhZ3M+IHsgY29uc3RleHByIHN0YXRpYyBib29sIHZhbHVlID0gZmFsc2U7IGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IGRlZmF1bHRfZmxhZ3M7IH07CisKKy8qIGdlbmVyaWMgcmVkdWN0aW9ucyAqLworCit0ZW1wbGF0ZTwKKyAgdHlwZW5hbWUgUmVkdWNlciwKKyAgdHlwZW5hbWUuLi4gVHMKKz4gc3RydWN0IHJlZHVjZTsKKwordGVtcGxhdGU8CisgIHR5cGVuYW1lIFJlZHVjZXIKKz4gc3RydWN0IHJlZHVjZTxSZWR1Y2VyPgoreworICBjb25zdGV4cHIgc3RhdGljIGlubGluZSBpbnQgcnVuKCkgeyByZXR1cm4gUmVkdWNlcjo6SWRlbnRpdHk7IH0KK307CisKK3RlbXBsYXRlPAorICB0eXBlbmFtZSBSZWR1Y2VyLAorICB0eXBlbmFtZSBBCis+IHN0cnVjdCByZWR1Y2U8UmVkdWNlciwgQT4KK3sKKyAgY29uc3RleHByIHN0YXRpYyBpbmxpbmUgQSBydW4oQSBhKSB7IHJldHVybiBhOyB9Cit9OworCit0ZW1wbGF0ZTwKKyAgdHlwZW5hbWUgUmVkdWNlciwKKyAgdHlwZW5hbWUgQSwKKyAgdHlwZW5hbWUuLi4gVHMKKz4gc3RydWN0IHJlZHVjZTxSZWR1Y2VyLCBBLCBUcy4uLj4KK3sKKyAgY29uc3RleHByIHN0YXRpYyBpbmxpbmUgYXV0byBydW4oQSBhLCBUcy4uLiB0cykgLT4gZGVjbHR5cGUoUmVkdWNlcjo6cnVuKGEsIHJlZHVjZTxSZWR1Y2VyLCBUcy4uLj46OnJ1bih0cy4uLikpKSB7CisgICAgcmV0dXJuIFJlZHVjZXI6OnJ1bihhLCByZWR1Y2U8UmVkdWNlciwgVHMuLi4+OjpydW4odHMuLi4pKTsKKyAgfQorfTsKKworLyogZ2VuZXJpYyBiaW5hcnkgb3BlcmF0aW9ucyAqLworCitzdHJ1Y3Qgc3VtX29wICAgICAgICAgICB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIGF1dG8gcnVuKEEgYSwgQiBiKSAtPiBkZWNsdHlwZShhICsgYikgICB7IHJldHVybiBhICsgYjsgICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IElkZW50aXR5ID0gMDsKK307CitzdHJ1Y3QgcHJvZHVjdF9vcCAgICAgICB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIGF1dG8gcnVuKEEgYSwgQiBiKSAtPiBkZWNsdHlwZShhICogYikgICB7IHJldHVybiBhICogYjsgICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IElkZW50aXR5ID0gMTsKK307CisKK3N0cnVjdCBsb2dpY2FsX2FuZF9vcCAgIHsgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gY29uc3RleHByIHN0YXRpYyBpbmxpbmUgYXV0byBydW4oQSBhLCBCIGIpIC0+IGRlY2x0eXBlKGEgJiYgYikgIHsgcmV0dXJuIGEgJiYgYjsgIH0gfTsKK3N0cnVjdCBsb2dpY2FsX29yX29wICAgIHsgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gY29uc3RleHByIHN0YXRpYyBpbmxpbmUgYXV0byBydW4oQSBhLCBCIGIpIC0+IGRlY2x0eXBlKGEgfHwgYikgIHsgcmV0dXJuIGEgfHwgYjsgIH0gfTsKKworc3RydWN0IGVxdWFsX29wICAgICAgICAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSA9PSBiKSAgeyByZXR1cm4gYSA9PSBiOyAgfSB9Oworc3RydWN0IG5vdF9lcXVhbF9vcCAgICAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSAhPSBiKSAgeyByZXR1cm4gYSAhPSBiOyAgfSB9Oworc3RydWN0IGxlc3Nlcl9vcCAgICAgICAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSA8IGIpICAgeyByZXR1cm4gYSA8IGI7ICAgfSB9Oworc3RydWN0IGxlc3Nlcl9lcXVhbF9vcCAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSA8PSBiKSAgeyByZXR1cm4gYSA8PSBiOyAgfSB9Oworc3RydWN0IGdyZWF0ZXJfb3AgICAgICAgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSA+IGIpICAgeyByZXR1cm4gYSA+IGI7ICAgfSB9Oworc3RydWN0IGdyZWF0ZXJfZXF1YWxfb3AgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhdXRvIHJ1bihBIGEsIEIgYikgLT4gZGVjbHR5cGUoYSA+PSBiKSAgeyByZXR1cm4gYSA+PSBiOyAgfSB9OworCisvKiBnZW5lcmljIHVuYXJ5IG9wZXJhdGlvbnMgKi8KKworc3RydWN0IG5vdF9vcCAgICAgICAgICAgICAgICB7IHRlbXBsYXRlPHR5cGVuYW1lIEE+IGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIGF1dG8gcnVuKEEgYSkgLT4gZGVjbHR5cGUoIWEpICAgICAgeyByZXR1cm4gIWE7ICAgICAgfSB9Oworc3RydWN0IG5lZ2F0aW9uX29wICAgICAgICAgICB7IHRlbXBsYXRlPHR5cGVuYW1lIEE+IGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIGF1dG8gcnVuKEEgYSkgLT4gZGVjbHR5cGUoLWEpICAgICAgeyByZXR1cm4gLWE7ICAgICAgfSB9Oworc3RydWN0IGdyZWF0ZXJfZXF1YWxfemVyb19vcCB7IHRlbXBsYXRlPHR5cGVuYW1lIEE+IGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIGF1dG8gcnVuKEEgYSkgLT4gZGVjbHR5cGUoYSA+PSAwKSAgeyByZXR1cm4gYSA+PSAwOyAgfSB9OworCisKKy8qIHJlZHVjdGlvbnMgZm9yIGxpc3RzICovCisKKy8vIHVzaW5nIGF1dG8gLT4gcmV0dXJuIHZhbHVlIHNwZWMgbWFrZXMgSUNDIDEzLjAgYW5kIDEzLjEgY3Jhc2ggaGVyZSwgc28gd2UgaGF2ZSB0byBoYWNrIGl0CisvLyB0b2dldGhlciBpbiBmcm9udC4uLiAoMTMuMCBkb2Vzbid0IHdvcmsgd2l0aCBhcnJheV9wcm9kL2FycmF5X3JlZHVjZS8uLi4gYW55d2F5LCBidXQgMTMuMQorLy8gZG9lcy4uLgordGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+Citjb25zdGV4cHIgaW5saW5lIGRlY2x0eXBlKHJlZHVjZTxwcm9kdWN0X29wLCBUcy4uLj46OnJ1bigoKigoVHMqKTApKS4uLikpIGFyZ19wcm9kKFRzLi4uIHRzKQoreworICByZXR1cm4gcmVkdWNlPHByb2R1Y3Rfb3AsIFRzLi4uPjo6cnVuKHRzLi4uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+Citjb25zdGV4cHIgaW5saW5lIGRlY2x0eXBlKHJlZHVjZTxzdW1fb3AsIFRzLi4uPjo6cnVuKCgqKChUcyopMCkpLi4uKSkgYXJnX3N1bShUcy4uLiB0cykKK3sKKyAgcmV0dXJuIHJlZHVjZTxzdW1fb3AsIFRzLi4uPjo6cnVuKHRzLi4uKTsKK30KKworLyogcmV2ZXJzZSBhcnJheXMgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXksIGludC4uLiBuPgorY29uc3RleHByIGlubGluZSBBcnJheSBoX2FycmF5X3JldmVyc2UoQXJyYXkgYXJyLCBudW1lcmljX2xpc3Q8aW50LCBuLi4uPikKK3sKKyAgcmV0dXJuIHt7YXJyYXlfZ2V0PHNpemVvZi4uLihuKSAtIG4gLSAxPihhcnIpLi4ufX07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+Citjb25zdGV4cHIgaW5saW5lIGFycmF5PFQsIE4+IGFycmF5X3JldmVyc2UoYXJyYXk8VCwgTj4gYXJyKQoreworICByZXR1cm4gaF9hcnJheV9yZXZlcnNlKGFyciwgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIE4+Ojp0eXBlKCkpOworfQorCisKKy8qIGdlbmVyaWMgYXJyYXkgcmVkdWN0aW9ucyAqLworCisvLyBjYW4ndCByZXVzZSBzdGFuZGFyZCByZWR1Y2UoKSBpbnRlcmZhY2UgYWJvdmUgYmVjYXVzZSBJbnRlbCdzIENvbXBpbGVyCisvLyAqcmVhbGx5KiBkb2Vzbid0IGxpa2UgaXQsIHNvIHdlIGp1c3QgcmVpbXBsZW1lbnQgdGhlIHN0dWZmCisvLyAoc3RhcnQgZnJvbSBOIC0gMSBhbmQgd29yayBkb3duIHRvIDAgYmVjYXVzZSBzcGVjaWFsaXphdGlvbiBmb3IKKy8vIG4gPT0gTiAtIDEgYWxzbyBkb2Vzbid0IHdvcmsgaW4gSW50ZWwncyBjb21waWxlciwgc28gaXQgZ29lcyBpbnRvCisvLyBhbiBpbmZpbml0ZSBsb29wKQordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiwgc3RkOjpzaXplX3QgbiA9IE4gLSAxPgorc3RydWN0IGhfYXJyYXlfcmVkdWNlIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgY29uc3RleHByIHN0YXRpYyBpbmxpbmUgYXV0byBydW4oYXJyYXk8VCwgTj4gYXJyLCBUIGlkZW50aXR5KSAtPiBkZWNsdHlwZShSZWR1Y2VyOjpydW4oaF9hcnJheV9yZWR1Y2U8UmVkdWNlciwgVCwgTiwgbiAtIDE+OjpydW4oYXJyLCBpZGVudGl0eSksIGFycmF5X2dldDxuPihhcnIpKSkKKyAgeworICAgIHJldHVybiBSZWR1Y2VyOjpydW4oaF9hcnJheV9yZWR1Y2U8UmVkdWNlciwgVCwgTiwgbiAtIDE+OjpydW4oYXJyLCBpZGVudGl0eSksIGFycmF5X2dldDxuPihhcnIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK3N0cnVjdCBoX2FycmF5X3JlZHVjZTxSZWR1Y2VyLCBULCBOLCAwPgoreworICBFSUdFTl9ERVZJQ0VfRlVOQyBjb25zdGV4cHIgc3RhdGljIGlubGluZSBUIHJ1bihjb25zdCBhcnJheTxULCBOPiYgYXJyLCBUKQorICB7CisgICAgcmV0dXJuIGFycmF5X2dldDwwPihhcnIpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBUPgorc3RydWN0IGhfYXJyYXlfcmVkdWNlPFJlZHVjZXIsIFQsIDA+Cit7CisgIEVJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBzdGF0aWMgaW5saW5lIFQgcnVuKGNvbnN0IGFycmF5PFQsIDA+JiwgVCBpZGVudGl0eSkKKyAgeworICAgIHJldHVybiBpZGVudGl0eTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK0VJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBpbmxpbmUgYXV0byBhcnJheV9yZWR1Y2UoY29uc3QgYXJyYXk8VCwgTj4mIGFyciwgVCBpZGVudGl0eSkgLT4gZGVjbHR5cGUoaF9hcnJheV9yZWR1Y2U8UmVkdWNlciwgVCwgTj46OnJ1bihhcnIsIGlkZW50aXR5KSkKK3sKKyAgcmV0dXJuIGhfYXJyYXlfcmVkdWNlPFJlZHVjZXIsIFQsIE4+OjpydW4oYXJyLCBpZGVudGl0eSk7Cit9CisKKy8qIHN0YW5kYXJkIGFycmF5IHJlZHVjdGlvbnMgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK0VJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBpbmxpbmUgYXV0byBhcnJheV9zdW0oY29uc3QgYXJyYXk8VCwgTj4mIGFycikgLT4gZGVjbHR5cGUoYXJyYXlfcmVkdWNlPHN1bV9vcCwgVCwgTj4oYXJyLCBzdGF0aWNfY2FzdDxUPigwKSkpCit7CisgIHJldHVybiBhcnJheV9yZWR1Y2U8c3VtX29wLCBULCBOPihhcnIsIHN0YXRpY19jYXN0PFQ+KDApKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK0VJR0VOX0RFVklDRV9GVU5DIGNvbnN0ZXhwciBpbmxpbmUgYXV0byBhcnJheV9wcm9kKGNvbnN0IGFycmF5PFQsIE4+JiBhcnIpIC0+IGRlY2x0eXBlKGFycmF5X3JlZHVjZTxwcm9kdWN0X29wLCBULCBOPihhcnIsIHN0YXRpY19jYXN0PFQ+KDEpKSkKK3sKKyAgcmV0dXJuIGFycmF5X3JlZHVjZTxwcm9kdWN0X29wLCBULCBOPihhcnIsIHN0YXRpY19jYXN0PFQ+KDEpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgdD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdCBhcnJheV9wcm9kKGNvbnN0IHN0ZDo6dmVjdG9yPHQ+JiBhKSB7CisgIGVpZ2VuX2Fzc2VydChhLnNpemUoKSA+IDApOworICB0IHByb2QgPSAxOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGEuc2l6ZSgpOyArK2kpIHsgcHJvZCAqPSBhW2ldOyB9CisgIHJldHVybiBwcm9kOworfQorCisvKiB6aXAgYW4gYXJyYXkgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHN0ZDo6c2l6ZV90IE4sIGludC4uLiBuPgorY29uc3RleHByIGlubGluZSBhcnJheTxkZWNsdHlwZShPcDo6cnVuKEEoKSwgQigpKSksTj4gaF9hcnJheV96aXAoYXJyYXk8QSwgTj4gYSwgYXJyYXk8QiwgTj4gYiwgbnVtZXJpY19saXN0PGludCwgbi4uLj4pCit7CisgIHJldHVybiBhcnJheTxkZWNsdHlwZShPcDo6cnVuKEEoKSwgQigpKSksTj57eyBPcDo6cnVuKGFycmF5X2dldDxuPihhKSwgYXJyYXlfZ2V0PG4+KGIpKS4uLiB9fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHN0ZDo6c2l6ZV90IE4+Citjb25zdGV4cHIgaW5saW5lIGFycmF5PGRlY2x0eXBlKE9wOjpydW4oQSgpLCBCKCkpKSxOPiBhcnJheV96aXAoYXJyYXk8QSwgTj4gYSwgYXJyYXk8QiwgTj4gYikKK3sKKyAgcmV0dXJuIGhfYXJyYXlfemlwPE9wPihhLCBiLCB0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgTj46OnR5cGUoKSk7Cit9CisKKy8qIHppcCBhbiBhcnJheSBhbmQgcmVkdWNlIHRoZSByZXN1bHQgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgT3AsIHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHN0ZDo6c2l6ZV90IE4sIGludC4uLiBuPgorY29uc3RleHByIGlubGluZSBhdXRvIGhfYXJyYXlfemlwX2FuZF9yZWR1Y2UoYXJyYXk8QSwgTj4gYSwgYXJyYXk8QiwgTj4gYiwgbnVtZXJpY19saXN0PGludCwgbi4uLj4pIC0+IGRlY2x0eXBlKHJlZHVjZTxSZWR1Y2VyLCB0eXBlbmFtZSBpZF9udW1lcmljPGludCxuLGRlY2x0eXBlKE9wOjpydW4oQSgpLCBCKCkpKT46OnR5cGUuLi4+OjpydW4oT3A6OnJ1bihhcnJheV9nZXQ8bj4oYSksIGFycmF5X2dldDxuPihiKSkuLi4pKQoreworICByZXR1cm4gcmVkdWNlPFJlZHVjZXIsIHR5cGVuYW1lIGlkX251bWVyaWM8aW50LG4sZGVjbHR5cGUoT3A6OnJ1bihBKCksIEIoKSkpPjo6dHlwZS4uLj46OnJ1bihPcDo6cnVuKGFycmF5X2dldDxuPihhKSwgYXJyYXlfZ2V0PG4+KGIpKS4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCBzdGQ6OnNpemVfdCBOPgorY29uc3RleHByIGlubGluZSBhdXRvIGFycmF5X3ppcF9hbmRfcmVkdWNlKGFycmF5PEEsIE4+IGEsIGFycmF5PEIsIE4+IGIpIC0+IGRlY2x0eXBlKGhfYXJyYXlfemlwX2FuZF9yZWR1Y2U8UmVkdWNlciwgT3AsIEEsIEIsIE4+KGEsIGIsIHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCBOPjo6dHlwZSgpKSkKK3sKKyAgcmV0dXJuIGhfYXJyYXlfemlwX2FuZF9yZWR1Y2U8UmVkdWNlciwgT3AsIEEsIEIsIE4+KGEsIGIsIHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCBOPjo6dHlwZSgpKTsKK30KKworLyogYXBwbHkgc3R1ZmYgdG8gYW4gYXJyYXkgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgT3AsIHR5cGVuYW1lIEEsIHN0ZDo6c2l6ZV90IE4sIGludC4uLiBuPgorY29uc3RleHByIGlubGluZSBhcnJheTxkZWNsdHlwZShPcDo6cnVuKEEoKSkpLE4+IGhfYXJyYXlfYXBwbHkoYXJyYXk8QSwgTj4gYSwgbnVtZXJpY19saXN0PGludCwgbi4uLj4pCit7CisgIHJldHVybiBhcnJheTxkZWNsdHlwZShPcDo6cnVuKEEoKSkpLE4+e3sgT3A6OnJ1bihhcnJheV9nZXQ8bj4oYSkpLi4uIH19OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgQSwgc3RkOjpzaXplX3QgTj4KK2NvbnN0ZXhwciBpbmxpbmUgYXJyYXk8ZGVjbHR5cGUoT3A6OnJ1bihBKCkpKSxOPiBhcnJheV9hcHBseShhcnJheTxBLCBOPiBhKQoreworICByZXR1cm4gaF9hcnJheV9hcHBseTxPcD4oYSwgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIE4+Ojp0eXBlKCkpOworfQorCisvKiBhcHBseSBzdHVmZiB0byBhbiBhcnJheSBhbmQgcmVkdWNlICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBBLCBzdGQ6OnNpemVfdCBOLCBpbnQuLi4gbj4KK2NvbnN0ZXhwciBpbmxpbmUgYXV0byBoX2FycmF5X2FwcGx5X2FuZF9yZWR1Y2UoYXJyYXk8QSwgTj4gYXJyLCBudW1lcmljX2xpc3Q8aW50LCBuLi4uPikgLT4gZGVjbHR5cGUocmVkdWNlPFJlZHVjZXIsIHR5cGVuYW1lIGlkX251bWVyaWM8aW50LG4sZGVjbHR5cGUoT3A6OnJ1bihBKCkpKT46OnR5cGUuLi4+OjpydW4oT3A6OnJ1bihhcnJheV9nZXQ8bj4oYXJyKSkuLi4pKQoreworICByZXR1cm4gcmVkdWNlPFJlZHVjZXIsIHR5cGVuYW1lIGlkX251bWVyaWM8aW50LG4sZGVjbHR5cGUoT3A6OnJ1bihBKCkpKT46OnR5cGUuLi4+OjpydW4oT3A6OnJ1bihhcnJheV9nZXQ8bj4oYXJyKSkuLi4pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgQSwgc3RkOjpzaXplX3QgTj4KK2NvbnN0ZXhwciBpbmxpbmUgYXV0byBhcnJheV9hcHBseV9hbmRfcmVkdWNlKGFycmF5PEEsIE4+IGEpIC0+IGRlY2x0eXBlKGhfYXJyYXlfYXBwbHlfYW5kX3JlZHVjZTxSZWR1Y2VyLCBPcCwgQSwgTj4oYSwgdHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIE4+Ojp0eXBlKCkpKQoreworICByZXR1cm4gaF9hcnJheV9hcHBseV9hbmRfcmVkdWNlPFJlZHVjZXIsIE9wLCBBLCBOPihhLCB0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgTj46OnR5cGUoKSk7Cit9CisKKy8qIHJlcGVhdCBhIHZhbHVlIG4gdGltZXMgKGFuZCBtYWtlIGFuIGFycmF5IG91dCBvZiBpdAorICogdXNhZ2U6CisgKiAgIGFycmF5PGludCwgMTY+ID0gcmVwZWF0PDE2Pig0Mik7CisgKi8KKwordGVtcGxhdGU8aW50IG4+CitzdHJ1Y3QgaF9yZXBlYXQKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgdCwgaW50Li4uIGlpPgorICBjb25zdGV4cHIgc3RhdGljIGlubGluZSBhcnJheTx0LCBuPiBydW4odCB2LCBudW1lcmljX2xpc3Q8aW50LCBpaS4uLj4pCisgIHsKKyAgICByZXR1cm4ge3sgdHlwZW5hbWUgaWRfbnVtZXJpYzxpbnQsIGlpLCB0Pjo6dHlwZSh2KS4uLiB9fTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IG4sIHR5cGVuYW1lIHQ+Citjb25zdGV4cHIgYXJyYXk8dCwgbj4gcmVwZWF0KHQgdikgeyByZXR1cm4gaF9yZXBlYXQ8bj46OnJ1bih2LCB0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgbj46OnR5cGUoKSk7IH0KKworLyogaW5zdGFudGlhdGUgYSBjbGFzcyBieSBhIEMtc3R5bGUgYXJyYXkgKi8KK3RlbXBsYXRlPGNsYXNzIEluc3RUeXBlLCB0eXBlbmFtZSBBcnJUeXBlLCBzdGQ6OnNpemVfdCBOLCBib29sIFJldmVyc2UsIHR5cGVuYW1lLi4uIFBzPgorc3RydWN0IGhfaW5zdGFudGlhdGVfYnlfY19hcnJheTsKKwordGVtcGxhdGU8Y2xhc3MgSW5zdFR5cGUsIHR5cGVuYW1lIEFyclR5cGUsIHN0ZDo6c2l6ZV90IE4sIHR5cGVuYW1lLi4uIFBzPgorc3RydWN0IGhfaW5zdGFudGlhdGVfYnlfY19hcnJheTxJbnN0VHlwZSwgQXJyVHlwZSwgTiwgZmFsc2UsIFBzLi4uPgoreworICBzdGF0aWMgSW5zdFR5cGUgcnVuKEFyclR5cGUqIGFyciwgUHMuLi4gYXJncykKKyAgeworICAgIHJldHVybiBoX2luc3RhbnRpYXRlX2J5X2NfYXJyYXk8SW5zdFR5cGUsIEFyclR5cGUsIE4gLSAxLCBmYWxzZSwgUHMuLi4sIEFyclR5cGU+OjpydW4oYXJyICsgMSwgYXJncy4uLiwgYXJyWzBdKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgSW5zdFR5cGUsIHR5cGVuYW1lIEFyclR5cGUsIHN0ZDo6c2l6ZV90IE4sIHR5cGVuYW1lLi4uIFBzPgorc3RydWN0IGhfaW5zdGFudGlhdGVfYnlfY19hcnJheTxJbnN0VHlwZSwgQXJyVHlwZSwgTiwgdHJ1ZSwgUHMuLi4+Cit7CisgIHN0YXRpYyBJbnN0VHlwZSBydW4oQXJyVHlwZSogYXJyLCBQcy4uLiBhcmdzKQorICB7CisgICAgcmV0dXJuIGhfaW5zdGFudGlhdGVfYnlfY19hcnJheTxJbnN0VHlwZSwgQXJyVHlwZSwgTiAtIDEsIGZhbHNlLCBBcnJUeXBlLCBQcy4uLj46OnJ1bihhcnIgKyAxLCBhcnJbMF0sIGFyZ3MuLi4pOworICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBJbnN0VHlwZSwgdHlwZW5hbWUgQXJyVHlwZSwgdHlwZW5hbWUuLi4gUHM+CitzdHJ1Y3QgaF9pbnN0YW50aWF0ZV9ieV9jX2FycmF5PEluc3RUeXBlLCBBcnJUeXBlLCAwLCBmYWxzZSwgUHMuLi4+Cit7CisgIHN0YXRpYyBJbnN0VHlwZSBydW4oQXJyVHlwZSogYXJyLCBQcy4uLiBhcmdzKQorICB7CisgICAgKHZvaWQpYXJyOworICAgIHJldHVybiBJbnN0VHlwZShhcmdzLi4uKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgSW5zdFR5cGUsIHR5cGVuYW1lIEFyclR5cGUsIHR5cGVuYW1lLi4uIFBzPgorc3RydWN0IGhfaW5zdGFudGlhdGVfYnlfY19hcnJheTxJbnN0VHlwZSwgQXJyVHlwZSwgMCwgdHJ1ZSwgUHMuLi4+Cit7CisgIHN0YXRpYyBJbnN0VHlwZSBydW4oQXJyVHlwZSogYXJyLCBQcy4uLiBhcmdzKQorICB7CisgICAgKHZvaWQpYXJyOworICAgIHJldHVybiBJbnN0VHlwZShhcmdzLi4uKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgSW5zdFR5cGUsIHR5cGVuYW1lIEFyclR5cGUsIHN0ZDo6c2l6ZV90IE4sIGJvb2wgUmV2ZXJzZSA9IGZhbHNlPgorSW5zdFR5cGUgaW5zdGFudGlhdGVfYnlfY19hcnJheShBcnJUeXBlKiBhcnIpCit7CisgIHJldHVybiBoX2luc3RhbnRpYXRlX2J5X2NfYXJyYXk8SW5zdFR5cGUsIEFyclR5cGUsIE4sIFJldmVyc2U+OjpydW4oYXJyKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZWxzZSAvLyBOb24gQysrMTEsIGZhbGxiYWNrIHRvIGVtdWxhdGlvbiBtb2RlCisKKyNpbmNsdWRlICJFbXVsYXRlQ1hYMTFNZXRhLmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fQ1hYMTFNRVRBX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL0NYWDExV29ya2Fyb3VuZHMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL0NYWDExV29ya2Fyb3VuZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRkMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL3V0aWwvQ1hYMTFXb3JrYXJvdW5kcy5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBTZWlsZXIgPGNocmlzdGlhbkBpd2FrZC5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1hYMTFXT1JLQVJPVU5EU19ICisjZGVmaW5lIEVJR0VOX0NYWDExV09SS0FST1VORFNfSAorCisvKiBDT01QQVRJQklMSVRZIENIRUNLUworICogKHNvIHVzZXJzIG9mIGNvbXBpbGVycyB0aGF0IGFyZSB0b28gb2xkIGdldCBzb21lIHJlYWxpc3RpYyBlcnJvciBtZXNzYWdlcykKKyAqLworI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fSU5URUxfQ09NUElMRVIgPCAxMzEwKQorI2Vycm9yIEludGVsIENvbXBpbGVyIG9ubHkgc3VwcG9ydHMgcmVxdWlyZWQgQysrIGZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMTMuMS4KKy8vIG5vdGUgdGhhdCBtb3N0IHN0dWZmIGluIHByaW5jaXBsZSB3b3JrcyB3aXRoIDEzLjAgYnV0IHdoZW4gY29tYmluaW5nCisvLyBzb21lIGZlYXR1cmVzLCBhdCBzb21lIHBvaW50IDEzLjAgd2lsbCBqdXN0IGZhaWwgd2l0aCBhbiBpbnRlcm5hbCBhc3NlcnRpb24KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgKF9fR05VQ19fIDwgNCB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDYpKQorLy8gRysrIDwgNC42IGJ5IGRlZmF1bHQgd2lsbCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBzb3VyY2UgZmlsZXMgLSBldmVuIGlmIHdlIHVzZSAjZXJyb3IgdG8gbWFrZQorLy8gaXQgZXJyb3Igb3V0LiBGb3IgdGhpcyByZWFzb24sIHdlIHVzZSB0aGUgcHJhZ21hIHRvIG1ha2Ugc3VyZSBHKysgYWJvcnRzIGF0IHRoZSBmaXJzdCBlcnJvcgorLy8gaXQgc2Vlcy4gVW5mb3J0dW5hdGVseSwgdGhhdCBpcyBzdGlsbCBub3Qgb3VyICNlcnJvciBkaXJlY3RpdmUsIGJ1dCBhdCBsZWFzdCB0aGUgb3V0cHV0IGlzCisvLyBzaG9ydCBlbm91Z2ggdGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIHNlZSB0aGF0IHRoZSBjb21waWxlciB2ZXJzaW9uIGlzIG5vdCBzdWZmaWNpZW50IGZvcgorLy8gdGhlIGZ1bmt5IHRlbXBsYXRlIG1vam8gd2UgdXNlLgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBlcnJvciAiLVdmYXRhbC1lcnJvcnMiCisjZXJyb3IgR05VIEMrKyBDb21waWxlciAoZysrKSBvbmx5IHN1cHBvcnRzIHJlcXVpcmVkIEMrKyBmZWF0dXJlcyBzaW5jZSB2ZXJzaW9uIDQuNi4KKyNlbmRpZgorCisvKiBDaGVjayB0aGF0IHRoZSBjb21waWxlciBhdCBsZWFzdCBjbGFpbXMgdG8gc3VwcG9ydCBDKysxMS4gSXQgbWlnaHQgbm90IGJlIHN1ZmZpY2llbnQKKyAqIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgaW1wbGVtZW50IGl0IGNvcnJlY3RseSwgYnV0IGF0IGxlYXN0IHdlJ2xsIGtub3cuCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdmlzdWFsIHN0dWRpbyBzdGlsbCBkb2Vzbid0IGNsYWltIHRvIHN1cHBvcnQgQysrMTEgYWx0aG91Z2ggaXQncworICogY29tcGxpYW50IGVudWdoIGZvciBvdXIgcHVycG9zZS4KKyAqLworI2lmIChfX2NwbHVzcGx1cyA8PSAxOTk3MTFMKSAmJiAoRUlHRU5fQ09NUF9NU1ZDIDwgMTkwMCkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGVycm9yICItV2ZhdGFsLWVycm9ycyIKKyNlbmRpZgorI2Vycm9yIFRoaXMgbGlicmFyeSBuZWVkcyBhdCBsZWFzdCBhIEMrKzExIGNvbXBsaWFudCBjb21waWxlci4gSWYgeW91IHVzZSBnKysvY2xhbmcsIHBsZWFzZSBlbmFibGUgdGhlIC1zdGQ9YysrMTEgY29tcGlsZXIgZmxhZy4gKC1zdGQ9YysrMHggb24gb2xkZXIgdmVyc2lvbnMuKQorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qIHN0ZDo6Z2V0IGlzIG9ubHkgY29uc3RleHByIGluIEMrKzE0LCBub3QgeWV0IGluIEMrKzExCisgKi8KKworCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBJLCBjbGFzcyBUPiBjb25zdGV4cHIgaW5saW5lIFQmICAgICAgIGFycmF5X2dldChzdGQ6OnZlY3RvcjxUPiYgICAgICAgYSkgeyByZXR1cm4gYVtJXTsgfQordGVtcGxhdGU8c3RkOjpzaXplX3QgSSwgY2xhc3MgVD4gY29uc3RleHByIGlubGluZSBUJiYgICAgICBhcnJheV9nZXQoc3RkOjp2ZWN0b3I8VD4mJiAgICAgIGEpIHsgcmV0dXJuIGFbSV07IH0KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIFQ+IGNvbnN0ZXhwciBpbmxpbmUgVCBjb25zdCYgYXJyYXlfZ2V0KHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBhKSB7IHJldHVybiBhW0ldOyB9CisKKy8qIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBvZiB0aGUgZm9ybQorICogdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFg7CisgKiBBbmQgeW91IHdhbnQgdG8gc3BlY2lhbGl6ZSBpdCBpbiBzdWNoIGEgd2F5OgorICogICAgdGVtcGxhdGU8dHlwZW5hbWUgUzEsIHR5cGVuYW1lLi4uIFNOPiBzdHJ1Y3QgWDxGb288UzEsIFNOLi4uPj4geyA6OjogfTsKKyAqICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFg8Rm9vPD4+ICAgICAgICAgIHsgOjo6IH07CisgKiBUaGlzIHdpbGwgd29yayBpbiBJbnRlbCdzIGNvbXBpbGVyIDEzLjAsIGJ1dCBvbmx5IHRvIHNvbWUgZXh0ZW50IGluIGcrKyA0LjYsIHNpbmNlCisgKiBnKysgY2FuIG9ubHkgbWF0Y2ggdGVtcGxhdGVzIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBwYWNrcyBpZiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCisgKiBhcmd1bWVudHMgaXMgbm90IGEgZml4ZWQgc2l6ZSAoc28gaW5zaWRlIHRoZSBmaXJzdCBzcGVjaWFsaXphdGlvbiwgcmVmZXJlbmNpbmcKKyAqIFg8Rm9vPFNuLi4uPj4gd2lsbCBmYWlsIGluIGcrKykuIE9uIHRoZSBvdGhlciBoYW5kLCBnKysgd2lsbCBhY2NlcHQgdGhlIGZvbGxvd2luZzoKKyAqICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMuLi4+IHN0cnVjdCBYPEZvbzxTLi4uPj4geyA6OjogfToKKyAqIGFzIGFuIGFkZGl0aW9uYWwgKCEpIHNwZWNpYWxpemF0aW9uLCB3aGljaCB3aWxsIHRoZW4gb25seSBtYXRjaCB0aGUgZW1wdHkgY2FzZS4KKyAqIEJ1dCBJbnRlbCdzIGNvbXBpbGVyIDEzLjAgd29uJ3QgYWNjZXB0IHRoYXQsIGl0IHdpbGwgb25seSBhY2NlcHQgdGhlIGVtcHR5IHN5bnRheCwKKyAqIHNvIHdlIGhhdmUgdG8gY3JlYXRlIGEgd29ya2Fyb3VuZCBmb3IgdGhpcy4KKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjZGVmaW5lIEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfREVGKG10LCBuKSAgICBtdC4uLiBuCisjZGVmaW5lIEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfREVGQyhtdCwgbikgICAsIEVJR0VOX1RQTF9QUF9TUEVDX0hBQ0tfREVGKG10LCBuKQorI2RlZmluZSBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX1VTRShuKSAgICAgICAgbi4uLgorI2RlZmluZSBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX1VTRUMobikgICAgICAgLCBuLi4uCisjZWxzZQorI2RlZmluZSBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX0RFRihtdCwgbikKKyNkZWZpbmUgRUlHRU5fVFBMX1BQX1NQRUNfSEFDS19ERUZDKG10LCBuKQorI2RlZmluZSBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX1VTRShuKQorI2RlZmluZSBFSUdFTl9UUExfUFBfU1BFQ19IQUNLX1VTRUMobikKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DWFgxMVdPUktBUk9VTkRTX0gKKworLyoKKyAqIGthdGU6IHNwYWNlLWluZGVudCBvbjsgaW5kZW50LXdpZHRoIDI7IG1peGVkaW5kZW50IG9mZjsgaW5kZW50LW1vZGUgY3N0eWxlOworICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvdXRpbC9FbXVsYXRlQXJyYXkuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL0VtdWxhdGVBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDNlYmMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvdXRpbC9FbXVsYXRlQXJyYXkuaApAQCAtMCwwICsxLDI2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FTVVMQVRFX0FSUkFZX0gKKyNkZWZpbmUgRUlHRU5fRU1VTEFURV9BUlJBWV9ICisKKworCisvLyBUaGUgYXJyYXkgY2xhc3MgaXMgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgd2l0aCBjeHgxMS4gRW11bGF0ZSBvdXIgb3duIGhlcmUKKy8vIGlmIG5lZWRlZC4gQmV3YXJlLCBtc3ZjIHN0aWxsIGRvZXNuJ3QgYWR2ZXJ0aXNlIGl0c2VsZiBhcyBhIGMrKzExIGNvbXBpbGVyIQorLy8gTW9yZW92ZXIsIENVREEgZG9lc24ndCBzdXBwb3J0IHRoZSBTVEwgY29udGFpbmVycywgc28gd2UgdXNlIG91ciBvd24gaW5zdGVhZC4KKyNpZiAoX19jcGx1c3BsdXMgPD0gMTk5NzExTCAmJiBFSUdFTl9DT01QX01TVkMgPCAxOTAwKSB8fCBkZWZpbmVkKF9fQ1VEQUNDX18pIHx8IGRlZmluZWQoRUlHRU5fQVZPSURfU1RMX0FSUkFZKQorCituYW1lc3BhY2UgRWlnZW4gewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBuPiBjbGFzcyBhcnJheSB7CisgcHVibGljOgorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFQmIG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCkgeyByZXR1cm4gdmFsdWVzW2luZGV4XTsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFQmIG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gdmFsdWVzW2luZGV4XTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVCYgZnJvbnQoKSB7IHJldHVybiB2YWx1ZXNbMF07IH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUJiBmcm9udCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlc1swXTsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVCYgYmFjaygpIHsgcmV0dXJuIHZhbHVlc1tuLTFdOyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVCYgYmFjaygpIGNvbnN0IHsgcmV0dXJuIHZhbHVlc1tuLTFdOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQorICBzdGF0aWMgc3RkOjpzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIG47IH0KKworICBUIHZhbHVlc1tuXTsKKworICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KCkgeyB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgYXJyYXkoY29uc3QgVCYgdikgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQobj09MSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIHZhbHVlc1swXSA9IHY7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBhcnJheShjb25zdCBUJiB2MSwgY29uc3QgVCYgdjIpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKG49PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB2YWx1ZXNbMF0gPSB2MTsKKyAgICB2YWx1ZXNbMV0gPSB2MjsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KGNvbnN0IFQmIHYxLCBjb25zdCBUJiB2MiwgY29uc3QgVCYgdjMpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKG49PTMsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB2YWx1ZXNbMF0gPSB2MTsKKyAgICB2YWx1ZXNbMV0gPSB2MjsKKyAgICB2YWx1ZXNbMl0gPSB2MzsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KGNvbnN0IFQmIHYxLCBjb25zdCBUJiB2MiwgY29uc3QgVCYgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdjQpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKG49PTQsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB2YWx1ZXNbMF0gPSB2MTsKKyAgICB2YWx1ZXNbMV0gPSB2MjsKKyAgICB2YWx1ZXNbMl0gPSB2MzsKKyAgICB2YWx1ZXNbM10gPSB2NDsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KGNvbnN0IFQmIHYxLCBjb25zdCBUJiB2MiwgY29uc3QgVCYgdjMsIGNvbnN0IFQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHY1KSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChuPT01LCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgICAgdmFsdWVzWzBdID0gdjE7CisgICAgdmFsdWVzWzFdID0gdjI7CisgICAgdmFsdWVzWzJdID0gdjM7CisgICAgdmFsdWVzWzNdID0gdjQ7CisgICAgdmFsdWVzWzRdID0gdjU7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBhcnJheShjb25zdCBUJiB2MSwgY29uc3QgVCYgdjIsIGNvbnN0IFQmIHYzLCBjb25zdCBUJiB2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2NSwgY29uc3QgVCYgdjYpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKG49PTYsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB2YWx1ZXNbMF0gPSB2MTsKKyAgICB2YWx1ZXNbMV0gPSB2MjsKKyAgICB2YWx1ZXNbMl0gPSB2MzsKKyAgICB2YWx1ZXNbM10gPSB2NDsKKyAgICB2YWx1ZXNbNF0gPSB2NTsKKyAgICB2YWx1ZXNbNV0gPSB2NjsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KGNvbnN0IFQmIHYxLCBjb25zdCBUJiB2MiwgY29uc3QgVCYgdjMsIGNvbnN0IFQmIHY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHY1LCBjb25zdCBUJiB2NiwgY29uc3QgVCYgdjcpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKG49PTcsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgICB2YWx1ZXNbMF0gPSB2MTsKKyAgICB2YWx1ZXNbMV0gPSB2MjsKKyAgICB2YWx1ZXNbMl0gPSB2MzsKKyAgICB2YWx1ZXNbM10gPSB2NDsKKyAgICB2YWx1ZXNbNF0gPSB2NTsKKyAgICB2YWx1ZXNbNV0gPSB2NjsKKyAgICB2YWx1ZXNbNl0gPSB2NzsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGFycmF5KAorICAgICAgY29uc3QgVCYgdjEsIGNvbnN0IFQmIHYyLCBjb25zdCBUJiB2MywgY29uc3QgVCYgdjQsCisgICAgICBjb25zdCBUJiB2NSwgY29uc3QgVCYgdjYsIGNvbnN0IFQmIHY3LCBjb25zdCBUJiB2OCkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQobj09OCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICAgIHZhbHVlc1swXSA9IHYxOworICAgIHZhbHVlc1sxXSA9IHYyOworICAgIHZhbHVlc1syXSA9IHYzOworICAgIHZhbHVlc1szXSA9IHY0OworICAgIHZhbHVlc1s0XSA9IHY1OworICAgIHZhbHVlc1s1XSA9IHY2OworICAgIHZhbHVlc1s2XSA9IHY3OworICAgIHZhbHVlc1s3XSA9IHY4OworICB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgYXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGwpIHsKKyAgICBlaWdlbl9hc3NlcnQobC5zaXplKCkgPT0gbik7CisgICAgaW50ZXJuYWw6OnNtYXJ0X2NvcHkobC5iZWdpbigpLCBsLmVuZCgpLCB2YWx1ZXMpOworICB9CisjZW5kaWYKK307CisKKworLy8gU3BlY2lhbGl6ZSBhcnJheSBmb3IgemVybyBzaXplCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgYXJyYXk8VCwgMD4geworIHB1YmxpYzoKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBUJiBvcGVyYXRvcltdIChzaXplX3QpIHsKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIkNhbid0IGluZGV4IGEgemVybyBzaXplIGFycmF5Iik7CisgICAgcmV0dXJuIGR1bW15OworICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVCYgb3BlcmF0b3JbXSAoc2l6ZV90KSBjb25zdCB7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJDYW4ndCBpbmRleCBhIHplcm8gc2l6ZSBhcnJheSIpOworICAgIHJldHVybiBkdW1teTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgVCYgZnJvbnQoKSB7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJDYW4ndCBpbmRleCBhIHplcm8gc2l6ZSBhcnJheSIpOworICAgIHJldHVybiBkdW1teTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFQmIGZyb250KCkgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiQ2FuJ3QgaW5kZXggYSB6ZXJvIHNpemUgYXJyYXkiKTsKKyAgICByZXR1cm4gZHVtbXk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBUJiBiYWNrKCkgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiQ2FuJ3QgaW5kZXggYSB6ZXJvIHNpemUgYXJyYXkiKTsKKyAgICByZXR1cm4gZHVtbXk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBUJiBiYWNrKCkgY29uc3QgeworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiQ2FuJ3QgaW5kZXggYSB6ZXJvIHNpemUgYXJyYXkiKTsKKyAgICByZXR1cm4gZHVtbXk7CisgIH0KKworICBzdGF0aWMgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORSBzdGQ6OnNpemVfdCBzaXplKCkgeyByZXR1cm4gMDsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgYXJyYXkoKSA6IGR1bW15KCkgeyB9CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgIEVJR0VOX0RFVklDRV9GVU5DIGFycmF5KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBsKSA6IGR1bW15KCkgeworICAgIGVpZ2VuX2Fzc2VydChsLnNpemUoKSA9PSAwKTsKKyAgfQorI2VuZGlmCisKKyBwcml2YXRlOgorICBUIGR1bW15OworfTsKKworLy8gQ29tcGFyaXNvbiBvcGVyYXRvcgorLy8gVG9kbzogaW1wbGVtZW50ICE9LCA8LCA8PSwgPiwgIGFuZCA+PQordGVtcGxhdGU8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4KK0VJR0VOX0RFVklDRV9GVU5DIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhcnJheTxULE4+JiBsaHMsIGNvbnN0IGFycmF5PFQsTj4mIHJocykgeworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgaWYgKGxoc1tpXSAhPSByaHNbaV0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQmIGFycmF5X2dldChhcnJheTxULE4+JiBhKSB7CisgIHJldHVybiBhW0ldOworfQordGVtcGxhdGU8c3RkOjpzaXplX3QgSSwgY2xhc3MgVCwgc3RkOjpzaXplX3QgTj4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgVCYgYXJyYXlfZ2V0KGNvbnN0IGFycmF5PFQsTj4mIGEpIHsKKyAgcmV0dXJuIGFbSV07Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgYXJyYXlfc2l6ZTsKK3RlbXBsYXRlPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+IHN0cnVjdCBhcnJheV9zaXplPGFycmF5PFQsTj4gPiB7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgdmFsdWUgPSBOOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgYXJyYXlfc2l6ZTsKK3RlbXBsYXRlPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+IHN0cnVjdCBhcnJheV9zaXplPGFycmF5PFQsTj4mID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gTjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGFycmF5X3NpemU7Cit0ZW1wbGF0ZTxjbGFzcyBULCBzdGQ6OnNpemVfdCBOPiBzdHJ1Y3QgYXJyYXlfc2l6ZTxjb25zdCBhcnJheTxULE4+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gTjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGFycmF5X3NpemU7Cit0ZW1wbGF0ZTxjbGFzcyBULCBzdGQ6OnNpemVfdCBOPiBzdHJ1Y3QgYXJyYXlfc2l6ZTxjb25zdCBhcnJheTxULE4+JiA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IE47Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbHNlCisKKy8vIFRoZSBjb21waWxlciBzdXBwb3J0cyBjKysxMSwgYW5kIHdlJ3JlIG5vdCB0YXJnZXR0aW5nIGN1ZGE6IHVzZSBzdGQ6OmFycmF5IGFzIEVpZ2VuOjphcnJheQorI2luY2x1ZGUgPGFycmF5PgorbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+IHVzaW5nIGFycmF5ID0gc3RkOjphcnJheTxULCBOPjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKy8qIHN0ZDo6Z2V0IGlzIG9ubHkgY29uc3RleHByIGluIEMrKzE0LCBub3QgeWV0IGluIEMrKzExCisgKiAgICAgLSBsaWJzdGRjKysgZnJvbSB2ZXJzaW9uIDQuNyBvbndhcmRzIGhhcyBpdCBuZXZlcnRoZWxlc3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHVzZSB0aGF0CisgKiAgICAgLSBsaWJzdGRjKysgb2xkZXIgdmVyc2lvbnM6IHVzZSBfTV9pbnN0YW5jZSBkaXJlY3RseQorICogICAgIC0gbGliYysrIGFsbCB2ZXJzaW9ucyBzbyBmYXI6IHVzZSBfX2VsZW1zXyBkaXJlY3RseQorICogICAgIC0gYWxsIG90aGVyIGxpYnM6IHVzZSBzdGQ6OmdldCB0byBiZSBwb3J0YWJsZSwgYnV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXkgbm90IGJlIGNvbnN0ZXhwcgorICovCisjaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgJiYgX19HTElCQ1hYX18gPCAyMDEyMDMyMgorI2RlZmluZSBTVERfR0VUX0FSUl9IQUNLICAgICAgICAgICAgIGEuX01faW5zdGFuY2VbSV0KKyNlbGlmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKQorI2RlZmluZSBTVERfR0VUX0FSUl9IQUNLICAgICAgICAgICAgIGEuX19lbGVtc19bSV0KKyNlbHNlCisjZGVmaW5lIFNURF9HRVRfQVJSX0hBQ0sgICAgICAgICAgICAgc3RkOjp0ZW1wbGF0ZSBnZXQ8SSwgVCwgTj4oYSkKKyNlbmRpZgorCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBJLCBjbGFzcyBULCBzdGQ6OnNpemVfdCBOPiBjb25zdGV4cHIgaW5saW5lIFQmICAgICAgIGFycmF5X2dldChzdGQ6OmFycmF5PFQsTj4mICAgICAgIGEpIHsgcmV0dXJuIChUJikgICAgICAgU1REX0dFVF9BUlJfSEFDSzsgfQordGVtcGxhdGU8c3RkOjpzaXplX3QgSSwgY2xhc3MgVCwgc3RkOjpzaXplX3QgTj4gY29uc3RleHByIGlubGluZSBUJiYgICAgICBhcnJheV9nZXQoc3RkOjphcnJheTxULE4+JiYgICAgICBhKSB7IHJldHVybiAoVCYmKSAgICAgIFNURF9HRVRfQVJSX0hBQ0s7IH0KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+IGNvbnN0ZXhwciBpbmxpbmUgVCBjb25zdCYgYXJyYXlfZ2V0KHN0ZDo6YXJyYXk8VCxOPiBjb25zdCYgYSkgeyByZXR1cm4gKFQgY29uc3QmKSBTVERfR0VUX0FSUl9IQUNLOyB9CisKKyN1bmRlZiBTVERfR0VUX0FSUl9IQUNLCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgYXJyYXlfc2l6ZTsKK3RlbXBsYXRlPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+IHN0cnVjdCBhcnJheV9zaXplPGNvbnN0IHN0ZDo6YXJyYXk8VCxOPiA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCB2YWx1ZSA9IE47Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBhcnJheV9zaXplOwordGVtcGxhdGU8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4gc3RydWN0IGFycmF5X3NpemU8c3RkOjphcnJheTxULE4+ID4geworICBzdGF0aWMgY29uc3Qgc2l6ZV90IHZhbHVlID0gTjsKK307Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZgorCisjZW5kaWYgIC8vIEVJR0VOX0VNVUxBVEVfQVJSQVlfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL3V0aWwvRW11bGF0ZUNYWDExTWV0YS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL3V0aWwvRW11bGF0ZUNYWDExTWV0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWExYjEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvdXRpbC9FbXVsYXRlQ1hYMTFNZXRhLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRU1VTEFURV9DWFgxMV9NRVRBX0gKKyNkZWZpbmUgRUlHRU5fRU1VTEFURV9DWFgxMV9NRVRBX0gKKworCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcZmlsZSBDWFgxMS91dGlsL0VtdWxhdGVDWFgxMU1ldGEuaAorICAqIFRoaXMgZmlsZSBlbXVsYXRlcyBhIHN1YnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBDWFhNZXRhLmggZm9yCisgICogY29tcGlsZXJzIHRoYXQgZG9uJ3QgeWV0IHN1cHBvcnQgY3h4MTEgc3VjaCBhcyBudmNjLgorICAqLworCitzdHJ1Y3QgZW1wdHlfbGlzdCB7IHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBjb3VudCA9IDA7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRhaWw9ZW1wdHlfbGlzdD4gc3RydWN0IHR5cGVfbGlzdCB7CisgIHR5cGVkZWYgVCBIZWFkVHlwZTsKKyAgdHlwZWRlZiBUYWlsIFRhaWxUeXBlOworICBzdGF0aWMgY29uc3QgVCBoZWFkOworICBzdGF0aWMgY29uc3QgVGFpbCB0YWlsOworICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgY291bnQgPSAxICsgVGFpbDo6Y291bnQ7Cit9OworCitzdHJ1Y3QgbnVsbF90eXBlIHsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVDEgPSBudWxsX3R5cGUsIHR5cGVuYW1lIFQyID0gbnVsbF90eXBlLCB0eXBlbmFtZSBUMyA9IG51bGxfdHlwZSwKKyAgICAgICAgIHR5cGVuYW1lIFQ0ID0gbnVsbF90eXBlLCB0eXBlbmFtZSBUNSA9IG51bGxfdHlwZSwgdHlwZW5hbWUgVDYgPSBudWxsX3R5cGUsCisgICAgICAgICB0eXBlbmFtZSBUNyA9IG51bGxfdHlwZSwgdHlwZW5hbWUgVDggPSBudWxsX3R5cGU+CitzdHJ1Y3QgbWFrZV90eXBlX2xpc3QgeworICB0eXBlZGVmIHR5cGVuYW1lIG1ha2VfdHlwZV9saXN0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4Pjo6dHlwZSB0YWlscmVzdWx0OworCisgIHR5cGVkZWYgdHlwZV9saXN0PFQxLCB0YWlscmVzdWx0PiB0eXBlOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgbWFrZV90eXBlX2xpc3Q8PiB7CisgIHR5cGVkZWYgZW1wdHlfbGlzdCB0eXBlOworfTsKKworCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgaW5kZXgsIGNsYXNzIFRMaXN0PiBzdHJ1Y3QgZ2V0X3R5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBIZWFkLCBjbGFzcyBUYWlsPgorc3RydWN0IGdldF90eXBlPDAsIHR5cGVfbGlzdDxIZWFkLCBUYWlsPiA+Cit7CisgIHR5cGVkZWYgSGVhZCB0eXBlOworfTsKKwordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IGksIGNsYXNzIEhlYWQsIGNsYXNzIFRhaWw+CitzdHJ1Y3QgZ2V0X3R5cGU8aSwgdHlwZV9saXN0PEhlYWQsIFRhaWw+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBnZXRfdHlwZTxpLTEsIFRhaWw+Ojp0eXBlIHR5cGU7Cit9OworCisKKy8qIG51bWVyaWMgbGlzdCAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIFQgbj4KK3N0cnVjdCB0eXBlMnZhbCB7CisgIHR5cGVkZWYgVCB0eXBlOworICBzdGF0aWMgY29uc3QgVCB2YWx1ZSA9IG47Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBuLCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPFQsIDEsIFY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3R5cGVfbGlzdDx0eXBlMnZhbDxULCBWPiA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPFQsIDIsIFY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3R5cGVfbGlzdDx0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4gPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBWPiBzdHJ1Y3QgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxULCAzLCBWPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbWFrZV90eXBlX2xpc3Q8dHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPFQsIDQsIFY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3R5cGVfbGlzdDx0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPFQsIDUsIFY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3R5cGVfbGlzdDx0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4gPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBWPiBzdHJ1Y3QgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxULCA2LCBWPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgbWFrZV90eXBlX2xpc3Q8dHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+ID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIFQgVj4gc3RydWN0IGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8VCwgNywgVj4geworICB0eXBlZGVmIHR5cGVuYW1lIG1ha2VfdHlwZV9saXN0PHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlMnZhbDxULCBWPiA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIFY+IHN0cnVjdCBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPFQsIDgsIFY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBtYWtlX3R5cGVfbGlzdDx0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUydmFsPFQsIFY+LCB0eXBlMnZhbDxULCBWPiwgdHlwZTJ2YWw8VCwgVj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTJ2YWw8VCwgVj4sIHR5cGUydmFsPFQsIFY+ID46OnR5cGUgdHlwZTsKK307CisKKwordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IGluZGV4LCBjbGFzcyBOTGlzdD4gc3RydWN0IGdldDsKKwordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IGk+CitzdHJ1Y3QgZ2V0PGksIGVtcHR5X2xpc3Q+Cit7CisgIGdldCgpIHsgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJpbmRleCBvdmVyZmxvdyIpOyB9CisgIHR5cGVkZWYgdm9pZCB0eXBlOworICBzdGF0aWMgY29uc3QgY2hhciB2YWx1ZSA9ICdcMCc7Cit9OworCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgaSwgY2xhc3MgSGVhZD4KK3N0cnVjdCBnZXQ8aSwgdHlwZV9saXN0PEhlYWQsIGVtcHR5X2xpc3Q+ID4KK3sKKyAgZ2V0KCkgeyBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgImluZGV4IG92ZXJmbG93Iik7IH0KKyAgdHlwZWRlZiB2b2lkIHR5cGU7CisgIHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlID0gJ1wwJzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBIZWFkPgorc3RydWN0IGdldDwwLCB0eXBlX2xpc3Q8SGVhZCwgZW1wdHlfbGlzdD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIEhlYWQ6OnR5cGUgdHlwZTsKKyAgc3RhdGljIGNvbnN0IHR5cGUgdmFsdWUgPSBIZWFkOjp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBIZWFkLCBjbGFzcyBUYWlsPgorc3RydWN0IGdldDwwLCB0eXBlX2xpc3Q8SGVhZCwgVGFpbD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIEhlYWQ6OnR5cGUgdHlwZTsKKyAgc3RhdGljIGNvbnN0IHR5cGUgdmFsdWUgPSBIZWFkOjp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDxzdGQ6OnNpemVfdCBpLCBjbGFzcyBIZWFkLCBjbGFzcyBUYWlsPgorc3RydWN0IGdldDxpLCB0eXBlX2xpc3Q8SGVhZCwgVGFpbD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFRhaWw6OkhlYWRUeXBlOjp0eXBlIHR5cGU7CisgIHN0YXRpYyBjb25zdCB0eXBlIHZhbHVlID0gZ2V0PGktMSwgVGFpbD46OnZhbHVlOworfTsKKworCit0ZW1wbGF0ZSA8Y2xhc3MgTkxpc3Q+IHN0cnVjdCBhcmdfcHJvZCB7CisgIHN0YXRpYyBjb25zdCB0eXBlbmFtZSBOTGlzdDo6SGVhZFR5cGU6OnR5cGUgdmFsdWUgPSBnZXQ8MCwgTkxpc3Q+Ojp2YWx1ZSAqIGFyZ19wcm9kPHR5cGVuYW1lIE5MaXN0OjpUYWlsVHlwZT46OnZhbHVlOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcmdfcHJvZDxlbXB0eV9saXN0PiB7CisgIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxOworfTsKKworCit0ZW1wbGF0ZTxpbnQgbiwgdHlwZW5hbWUgdD4KK2FycmF5PHQsIG4+IHJlcGVhdCh0IHYpIHsKKyAgYXJyYXk8dCwgbj4gYXJyYXk7CisgIGFycmF5LmZpbGwodik7CisgIHJldHVybiBhcnJheTsKK30KKwordGVtcGxhdGU8c3RkOjpzaXplX3QgSSwgY2xhc3MgSGVhZCwgY2xhc3MgVGFpbD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgSGVhZDo6dHlwZSBhcnJheV9nZXQodHlwZV9saXN0PEhlYWQsIFRhaWw+JikgeworICByZXR1cm4gZ2V0PEksIHR5cGVfbGlzdDxIZWFkLCBUYWlsPiA+Ojp2YWx1ZTsKK30KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIEhlYWQsIGNsYXNzIFRhaWw+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIEhlYWQ6OnR5cGUgYXJyYXlfZ2V0KGNvbnN0IHR5cGVfbGlzdDxIZWFkLCBUYWlsPiYpIHsKKyAgcmV0dXJuIGdldDxJLCB0eXBlX2xpc3Q8SGVhZCwgVGFpbD4gPjo6dmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBOTGlzdD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgTkxpc3Q6OkhlYWRUeXBlOjp0eXBlIGFycmF5X3Byb2QoY29uc3QgTkxpc3QmKSB7CisgIHJldHVybiBhcmdfcHJvZDxOTGlzdD46OnZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSB0LCBzdGQ6OnNpemVfdCBuPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB0IGFycmF5X3Byb2QoY29uc3QgYXJyYXk8dCwgbj4mIGEpIHsKKyAgdCBwcm9kID0gMTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsgcHJvZCAqPSBhW2ldOyB9CisgIHJldHVybiBwcm9kOworfQordGVtcGxhdGU8dHlwZW5hbWUgdD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdCBhcnJheV9wcm9kKGNvbnN0IGFycmF5PHQsIDA+JiAvKmEqLykgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgdD4KK0VJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdCBhcnJheV9wcm9kKGNvbnN0IHN0ZDo6dmVjdG9yPHQ+JiBhKSB7CisgIGVpZ2VuX2Fzc2VydChhLnNpemUoKSA+IDApOworICB0IHByb2QgPSAxOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGEuc2l6ZSgpOyArK2kpIHsgcHJvZCAqPSBhW2ldOyB9CisgIHJldHVybiBwcm9kOworfQorCisKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIFQmIGFycmF5X2dldChzdGQ6OnZlY3RvcjxUPiYgYSkgeworICByZXR1cm4gYVtJXTsKK30KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEksIGNsYXNzIFQ+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFQmIGFycmF5X2dldChjb25zdCBzdGQ6OnZlY3RvcjxUPiYgYSkgeworICByZXR1cm4gYVtJXTsKK30KKworc3RydWN0IHN1bV9vcCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oQSBhLCBCIGIpIHsgcmV0dXJuIGEgKyBiOyB9Cit9Oworc3RydWN0IHByb2R1Y3Rfb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSwgQiBiKSB7IHJldHVybiBhICogYjsgfQorfTsKKworc3RydWN0IGxvZ2ljYWxfYW5kX29wIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gc3RhdGljIGlubGluZSBib29sIHJ1bihBIGEsIEIgYikgeyByZXR1cm4gYSAmJiBiOyB9Cit9Oworc3RydWN0IGxvZ2ljYWxfb3Jfb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSwgQiBiKSB7IHJldHVybiBhIHx8IGI7IH0KK307CisKK3N0cnVjdCBlcXVhbF9vcCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oQSBhLCBCIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorfTsKK3N0cnVjdCBub3RfZXF1YWxfb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSwgQiBiKSB7IHJldHVybiBhICE9IGI7IH0KK307CitzdHJ1Y3QgbGVzc2VyX29wIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gc3RhdGljIGlubGluZSBib29sIHJ1bihBIGEsIEIgYikgeyByZXR1cm4gYSA8IGI7IH0KK307CitzdHJ1Y3QgbGVzc2VyX2VxdWFsX29wIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gc3RhdGljIGlubGluZSBib29sIHJ1bihBIGEsIEIgYikgeyByZXR1cm4gYSA8PSBiOyB9Cit9OworCitzdHJ1Y3QgZ3JlYXRlcl9vcCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oQSBhLCBCIGIpIHsgcmV0dXJuIGEgPiBiOyB9Cit9Oworc3RydWN0IGdyZWF0ZXJfZXF1YWxfb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSwgQiBiKSB7IHJldHVybiBhID49IGI7IH0KK307CisKK3N0cnVjdCBub3Rfb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSkgeyByZXR1cm4gIWE7IH0KK307CitzdHJ1Y3QgbmVnYXRpb25fb3AgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBPiBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKEEgYSkgeyByZXR1cm4gLWE7IH0KK307CitzdHJ1Y3QgZ3JlYXRlcl9lcXVhbF96ZXJvX29wIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQT4gc3RhdGljIGlubGluZSBib29sIHJ1bihBIGEpIHsgcmV0dXJuIGEgPj0gMDsgfQorfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgQSwgc3RkOjpzaXplX3QgTj4KK3N0cnVjdCBBcnJheUFwcGx5QW5kUmVkdWNlIHsKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBhcnJheTxBLCBOPiYgYSkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTiA+PSAyLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICAgIGJvb2wgcmVzdWx0ID0gUmVkdWNlcjo6cnVuKE9wOjpydW4oYVswXSksIE9wOjpydW4oYVsxXSkpOworICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgTjsgKytpKSB7CisgICAgICByZXN1bHQgPSBSZWR1Y2VyOjpydW4ocmVzdWx0LCBPcDo6cnVuKGFbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVkdWNlciwgdHlwZW5hbWUgT3AsIHR5cGVuYW1lIEE+CitzdHJ1Y3QgQXJyYXlBcHBseUFuZFJlZHVjZTxSZWR1Y2VyLCBPcCwgQSwgMT4gIHsKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBhcnJheTxBLCAxPiYgYSkgeworICAgIHJldHVybiBPcDo6cnVuKGFbMF0pOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWR1Y2VyLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgQSwgc3RkOjpzaXplX3QgTj4KK2lubGluZSBib29sIGFycmF5X2FwcGx5X2FuZF9yZWR1Y2UoY29uc3QgYXJyYXk8QSwgTj4mIGEpIHsKKyAgcmV0dXJuIEFycmF5QXBwbHlBbmRSZWR1Y2U8UmVkdWNlciwgT3AsIEEsIE4+OjpydW4oYSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCBzdGQ6OnNpemVfdCBOPgorc3RydWN0IEFycmF5WmlwQW5kUmVkdWNlIHsKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBhcnJheTxBLCBOPiYgYSwgY29uc3QgYXJyYXk8QiwgTj4mIGIpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE4gPj0gMiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgICBib29sIHJlc3VsdCA9IFJlZHVjZXI6OnJ1bihPcDo6cnVuKGFbMF0sIGJbMF0pLCBPcDo6cnVuKGFbMV0sIGJbMV0pKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IE47ICsraSkgeworICAgICAgcmVzdWx0ID0gUmVkdWNlcjo6cnVuKHJlc3VsdCwgT3A6OnJ1bihhW2ldLCBiW2ldKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IEFycmF5WmlwQW5kUmVkdWNlPFJlZHVjZXIsIE9wLCBBLCBCLCAxPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oY29uc3QgYXJyYXk8QSwgMT4mIGEsIGNvbnN0IGFycmF5PEIsIDE+JiBiKSB7CisgICAgcmV0dXJuIE9wOjpydW4oYVswXSwgYlswXSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlZHVjZXIsIHR5cGVuYW1lIE9wLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCBzdGQ6OnNpemVfdCBOPgoraW5saW5lIGJvb2wgYXJyYXlfemlwX2FuZF9yZWR1Y2UoY29uc3QgYXJyYXk8QSwgTj4mIGEsIGNvbnN0IGFycmF5PEIsIE4+JiBiKSB7CisgIHJldHVybiBBcnJheVppcEFuZFJlZHVjZTxSZWR1Y2VyLCBPcCwgQSwgQiwgTj46OnJ1bihhLCBiKTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKworCisjZW5kaWYgIC8vIEVJR0VOX0VNVUxBVEVfQ1hYMTFfTUVUQV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvdXRpbC9NYXhTaXplVmVjdG9yLmggYi91bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9zcmMvdXRpbC9NYXhTaXplVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjM2RkMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL3NyYy91dGlsL01heFNpemVWZWN0b3IuaApAQCAtMCwwICsxLDE0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GSVhFRFNJWkVWRUNUT1JfSAorI2RlZmluZSBFSUdFTl9GSVhFRFNJWkVWRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIE1heFNpemVWZWN0b3IKKyAgKiBcaW5ncm91cCBDb3JlCisgICoKKyAgKiBcYnJpZWYgVGhlIE1heFNpemVWZWN0b3IgY2xhc3MuCisgICoKKyAgKiBUaGUgJU1heFNpemVWZWN0b3IgcHJvdmlkZXMgYSBzdWJzZXQgb2Ygc3RkOjp2ZWN0b3IgZnVuY3Rpb25hbGl0eS4KKyAgKgorICAqIFRoZSBnb2FsIGlzIHRvIHByb3ZpZGUgYmFzaWMgc3RkOjp2ZWN0b3Igb3BlcmF0aW9ucyB3aGVuIHVzaW5nCisgICogc3RkOjp2ZWN0b3IgaXMgbm90IGFuIG9wdGlvbiAoZS5nLiBvbiBHUFUgb3Igd2hlbiBjb21waWxpbmcgdXNpbmcKKyAgKiBGTUEvQVZYLCBhcyB0aGlzIGNhbiBjYXVzZSBlaXRoZXIgY29tcGlsYXRpb24gZmFpbHVyZXMgb3IgaWxsZWdhbAorICAqIGluc3RydWN0aW9uIGZhaWx1cmVzKS4KKyAgKgorICAqIEJld2FyZTogVGhlIGNvbnN0cnVjdG9ycyBhcmUgbm90IEFQSSBjb21wYXRpYmxlIHdpdGggdGhlc2Ugb2YKKyAgKiBzdGQ6OnZlY3Rvci4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgTWF4U2l6ZVZlY3RvciB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3QgYSBuZXcgTWF4U2l6ZVZlY3RvciwgcmVzZXJ2ZSBuIGVsZW1lbnRzLgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGV4cGxpY2l0IE1heFNpemVWZWN0b3Ioc2l6ZV90IG4pCisgICAgICA6IHJlc2VydmVfKG4pLCBzaXplXygwKSwKKyAgICAgICAgZGF0YV8oc3RhdGljX2Nhc3Q8VCo+KGludGVybmFsOjphbGlnbmVkX21hbGxvYyhuICogc2l6ZW9mKFQpKSkpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeyBuZXcgKCZkYXRhX1tpXSkgVDsgfQorICB9CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IE1heFNpemVWZWN0b3IsIHJlc2VydmUgYW5kIHJlc2l6ZSB0byBuLgorICAvLyBDb3B5IHRoZSBpbml0IHZhbHVlIHRvIGFsbCBlbGVtZW50cy4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBNYXhTaXplVmVjdG9yKHNpemVfdCBuLCBjb25zdCBUJiBpbml0KQorICAgICAgOiByZXNlcnZlXyhuKSwgc2l6ZV8obiksCisgICAgICAgIGRhdGFfKHN0YXRpY19jYXN0PFQqPihpbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2MobiAqIHNpemVvZihUKSkpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsgbmV3ICgmZGF0YV9baV0pIFQoaW5pdCk7IH0KKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgfk1heFNpemVWZWN0b3IoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplXzsgKytpKSB7CisgICAgICBkYXRhX1tpXS5+VCgpOworICAgIH0KKyAgICBpbnRlcm5hbDo6YWxpZ25lZF9mcmVlKGRhdGFfKTsKKyAgfQorCisgIHZvaWQgcmVzaXplKHNpemVfdCBuKSB7CisgICAgZWlnZW5fYXNzZXJ0KG4gPD0gcmVzZXJ2ZV8pOworICAgIGZvciAoc2l6ZV90IGkgPSBzaXplXzsgaSA8IG47ICsraSkgeworICAgICAgbmV3ICgmZGF0YV9baV0pIFQ7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSBuOyBpIDwgc2l6ZV87ICsraSkgeworICAgICAgZGF0YV9baV0uflQoKTsKKyAgICB9CisgICAgc2l6ZV8gPSBuOworICB9CisKKyAgLy8gQXBwZW5kIG5ldyBlbGVtZW50cyAodXAgdG8gcmVzZXJ2ZWQgc2l6ZSkuCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgdCkgeworICAgIGVpZ2VuX2Fzc2VydChzaXplXyA8IHJlc2VydmVfKTsKKyAgICBkYXRhX1tzaXplXysrXSA9IHQ7CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGNvbnN0IFQmIG9wZXJhdG9yW10gKHNpemVfdCBpKSBjb25zdCB7CisgICAgZWlnZW5fYXNzZXJ0KGkgPCBzaXplXyk7CisgICAgcmV0dXJuIGRhdGFfW2ldOworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBUJiBvcGVyYXRvcltdIChzaXplX3QgaSkgeworICAgIGVpZ2VuX2Fzc2VydChpIDwgc2l6ZV8pOworICAgIHJldHVybiBkYXRhX1tpXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVCYgYmFjaygpIHsKKyAgICBlaWdlbl9hc3NlcnQoc2l6ZV8gPiAwKTsKKyAgICByZXR1cm4gZGF0YV9bc2l6ZV8gLSAxXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgVCYgYmFjaygpIGNvbnN0IHsKKyAgICBlaWdlbl9hc3NlcnQoc2l6ZV8gPiAwKTsKKyAgICByZXR1cm4gZGF0YV9bc2l6ZV8gLSAxXTsKKyAgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgdm9pZCBwb3BfYmFjaygpIHsKKyAgICAvLyBOT1RFOiBUaGlzIGRvZXMgbm90IGRlc3Ryb3kgdGhlIHZhbHVlIGF0IHRoZSBlbmQgdGhlIHdheQorICAgIC8vIHN0ZDo6dmVjdG9yJ3MgdmVyc2lvbiBvZiBwb3BfYmFjaygpIGRvZXMuICBUaGF0IGhhcHBlbnMgd2hlbgorICAgIC8vIHRoZSBWZWN0b3IgaXMgZGVzdHJveWVkLgorICAgIGVpZ2VuX2Fzc2VydChzaXplXyA+IDApOworICAgIHNpemVfLS07CisgIH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplXyA9PSAwOyB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorICBUKiBkYXRhKCkgeyByZXR1cm4gZGF0YV87IH0KKworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCisgIGNvbnN0IFQqIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVCogYmVnaW4oKSB7IHJldHVybiBkYXRhXzsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgVCogZW5kKCkgeyByZXR1cm4gZGF0YV8gKyBzaXplXzsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgVCogYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQorCisgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgY29uc3QgVCogZW5kKCkgY29uc3QgeyByZXR1cm4gZGF0YV8gKyBzaXplXzsgfQorCisgcHJpdmF0ZToKKyAgc2l6ZV90IHJlc2VydmVfOworICBzaXplX3Qgc2l6ZV87CisgIFQqIGRhdGFfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fRklYRURTSVpFVkVDVE9SX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0V1bGVyQW5nbGVzIGIvdW5zdXBwb3J0ZWQvRWlnZW4vRXVsZXJBbmdsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZmEzZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0V1bGVyQW5nbGVzCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRhbCBIYWRhZCA8dGFsX2hkQGhvdG1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FVUxFUkFOR0xFU19NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9FVUxFUkFOR0xFU19NT0RVTEVfSAorCisKKyNpbmNsdWRlICJFaWdlbi9Db3JlIgorI2luY2x1ZGUgIkVpZ2VuL0dlb21ldHJ5IgorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqCisgICogXGRlZmdyb3VwIEV1bGVyQW5nbGVzX01vZHVsZSBFdWxlckFuZ2xlcyBtb2R1bGUKKyAgKiBcYnJpZWYgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBldWxlciBhbmdsZXMgcm90YXRpb24uCisgICoKKyAgKiBFdWxlciBhbmdsZXMgYXJlIGEgd2F5IHRvIHJlcHJlc2VudCAzRCByb3RhdGlvbi4KKyAgKgorICAqIEluIG9yZGVyIHRvIHVzZSB0aGlzIG1vZHVsZSBpbiB5b3VyIGNvZGUsIGluY2x1ZGUgdGhpcyBoZWFkZXI6CisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vRXVsZXJBbmdsZXM+CisgICogXGVuZGNvZGUKKyAgKgorICAqIFNlZSBccmVmIEV1bGVyQW5nbGVzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAqCisgICovCisKK30KKworI2luY2x1ZGUgInNyYy9FdWxlckFuZ2xlcy9FdWxlclN5c3RlbS5oIgorI2luY2x1ZGUgInNyYy9FdWxlckFuZ2xlcy9FdWxlckFuZ2xlcy5oIgorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9FVUxFUkFOR0xFU19NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vRkZUIGIvdW5zdXBwb3J0ZWQvRWlnZW4vRkZUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDViMzkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9GRlQKQEAgLTAsMCArMSw0MTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBNYXJrIEJvcmdlcmRpbmcgbWFyayBhIGJvcmdlcmRpbmcgbmV0CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0ZGVF9ICisjZGVmaW5lIEVJR0VOX0ZGVF9ICisKKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworCisvKioKKyAgKiBcZGVmZ3JvdXAgRkZUX01vZHVsZSBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIG1vZHVsZQorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vRkZUPgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBGYXN0IEZvdXJpZXIgdHJhbnNmb3JtYXRpb24sIHdpdGggYSBjb25maWd1cmFibGUgYmFja2VuZAorICAqIGltcGxlbWVudGF0aW9uLgorICAqCisgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24ga2lzc2ZmdC4gSXQgaXMgYSBzbWFsbCwgZnJlZSwgYW5kCisgICogcmVhc29uYWJseSBlZmZpY2llbnQgZGVmYXVsdC4KKyAgKgorICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGltcGxlbWVudGF0aW9uIGJhY2tlbmQ6CisgICoKKyAgKiAtIGZmdHcgKGh0dHA6Ly93d3cuZmZ0dy5vcmcpIDogZmFzdGVyLCBHUEwgLS0gaW5jb21wYXRpYmxlIHdpdGggRWlnZW4gaW4gTEdQTCBmb3JtLCBiaWdnZXIgY29kZSBzaXplLgorICAqIC0gTUtMIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hdGhfS2VybmVsX0xpYnJhcnkpIDogZmFzdGVzdCwgY29tbWVyY2lhbCAtLSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggRWlnZW4gaW4gR1BMIGZvcm0uCisgICoKKyAgKiBcc2VjdGlvbiBGRlREZXNpZ24gRGVzaWduCisgICoKKyAgKiBUaGUgZm9sbG93aW5nIGRlc2lnbiBkZWNpc2lvbnMgd2VyZSBtYWRlIGNvbmNlcm5pbmcgc2NhbGluZyBhbmQKKyAgKiBoYWxmLXNwZWN0cnVtIGZvciByZWFsIEZGVC4KKyAgKgorICAqIFRoZSBpbnRlbnQgaXMgdG8gZmFjaWxpdGF0ZSBnZW5lcmljIHByb2dyYW1taW5nIGFuZCBlYXNlIG1pZ3JhdGluZyBjb2RlCisgICogZnJvbSAgTWF0bGFiL29jdGF2ZS4KKyAgKiBXZSB0aGluayB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBFaWdlbi9GRlQgc2hvdWxkIGZhdm9yIGNvcnJlY3RuZXNzIGFuZAorICAqIGdlbmVyYWxpdHkgb3ZlciBzcGVlZC4gT2YgY291cnNlLCB0aGUgY2FsbGVyIHNob3VsZCBiZSBhYmxlIHRvICJvcHQtb3V0IiBmcm9tIHRoaXMKKyAgKiBiZWhhdmlvciBhbmQgZ2V0IHRoZSBzcGVlZCBpbmNyZWFzZSBpZiB0aGV5IHdhbnQgaXQuCisgICoKKyAgKiAxKSAlU2NhbGluZzoKKyAgKiBPdGhlciBsaWJyYXJpZXMgKEZGVFcsSU1LTCxLSVNTRkZUKSAgZG8gbm90IHBlcmZvcm0gc2NhbGluZywgc28gdGhlcmUKKyAgKiBpcyBhIGNvbnN0YW50IGdhaW4gaW5jdXJyZWQgYWZ0ZXIgdGhlIGZvcndhcmQmaW52ZXJzZSB0cmFuc2Zvcm1zICwgc28gCisgICogSUZGVChGRlQoeCkpID0gS3g7ICB0aGlzIGlzIGRvbmUgdG8gYXZvaWQgYSB2ZWN0b3ItYnktdmFsdWUgbXVsdGlwbHkuICAKKyAgKiBUaGUgZG93bnNpZGUgaXMgdGhhdCBhbGdvcml0aG1zIHRoYXQgd29ya2VkIGNvcnJlY3RseSBpbiBNYXRsYWIvb2N0YXZlIAorICAqIGRvbid0IGJlaGF2ZSB0aGUgc2FtZSB3YXkgb25jZSBpbXBsZW1lbnRlZCBpbiBDKysuCisgICoKKyAgKiBIb3cgRWlnZW4vRkZUIGRpZmZlcnM6IGludmVydGlibGUgc2NhbGluZyBpcyBwZXJmb3JtZWQgc28gSUZGVCggRkZUKHgpICkgPSB4LiAKKyAgKgorICAqIDIpIFJlYWwgRkZUIGhhbGYtc3BlY3RydW0KKyAgKiBPdGhlciBsaWJyYXJpZXMgdXNlIG9ubHkgaGFsZiB0aGUgZnJlcXVlbmN5IHNwZWN0cnVtIChwbHVzIG9uZSBleHRyYSAKKyAgKiBzYW1wbGUgZm9yIHRoZSBOeXF1aXN0IGJpbikgZm9yIGEgcmVhbCBGRlQsIHRoZSBvdGhlciBoYWxmIGlzIHRoZSAKKyAgKiBjb25qdWdhdGUtc3ltbWV0cmljIG9mIHRoZSBmaXJzdCBoYWxmLiAgVGhpcyBzYXZlcyB0aGVtIGEgY29weSBhbmQgc29tZSAKKyAgKiBtZW1vcnkuICBUaGUgZG93bnNpZGUgaXMgdGhlIGNhbGxlciBuZWVkcyB0byBoYXZlIHNwZWNpYWwgbG9naWMgZm9yIHRoZSAKKyAgKiBudW1iZXIgb2YgYmlucyBpbiBjb21wbGV4IHZzIHJlYWwuCisgICoKKyAgKiBIb3cgRWlnZW4vRkZUIGRpZmZlcnM6IFRoZSBmdWxsIHNwZWN0cnVtIGlzIHJldHVybmVkIGZyb20gdGhlIGZvcndhcmQgCisgICogdHJhbnNmb3JtLiAgVGhpcyBmYWNpbGl0YXRlcyBnZW5lcmljIHRlbXBsYXRlIHByb2dyYW1taW5nIGJ5IG9idmlhdGluZyAKKyAgKiBzZXBhcmF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIHJlYWwgdnMgY29tcGxleC4gIE9uIHRoZSBpbnZlcnNlCisgICogdHJhbnNmb3JtLCBvbmx5IGhhbGYgdGhlIHNwZWN0cnVtIGlzIGFjdHVhbGx5IHVzZWQgaWYgdGhlIG91dHB1dCB0eXBlIGlzIHJlYWwuCisgICovCisgCisKKyNpZmRlZiBFSUdFTl9GRlRXX0RFRkFVTFQKKy8vIEZGVFc6IGZhc3RlciwgR1BMIC0tIGluY29tcGF0aWJsZSB3aXRoIEVpZ2VuIGluIExHUEwgZm9ybSwgYmlnZ2VyIGNvZGUgc2l6ZQorIyAgaW5jbHVkZSA8ZmZ0dzMuaD4KKyMgIGluY2x1ZGUgInNyYy9GRlQvZWlfZmZ0d19pbXBsLmgiCisgICBuYW1lc3BhY2UgRWlnZW4geworICAgICAvL3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB0eXBlZGVmIHN0cnVjdCBpbnRlcm5hbDo6ZmZ0d19pbXBsICBkZWZhdWx0X2ZmdF9pbXBsOyB0aGlzIGRvZXMgbm90IHdvcmsKKyAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBkZWZhdWx0X2ZmdF9pbXBsIDogcHVibGljIGludGVybmFsOjpmZnR3X2ltcGw8VD4ge307CisgICB9CisjZWxpZiBkZWZpbmVkIEVJR0VOX01LTF9ERUZBVUxUCisvLyBUT0RPIAorLy8gaW50ZWwgTWF0aCBLZXJuZWwgTGlicmFyeTogZmFzdGVzdCwgY29tbWVyY2lhbCAtLSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggRWlnZW4gaW4gR1BMIGZvcm0KKyMgIGluY2x1ZGUgInNyYy9GRlQvZWlfaW1rbGZmdF9pbXBsLmgiCisgICBuYW1lc3BhY2UgRWlnZW4geworICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGRlZmF1bHRfZmZ0X2ltcGwgOiBwdWJsaWMgaW50ZXJuYWw6Omlta2xmZnRfaW1wbCB7fTsKKyAgIH0KKyNlbHNlCisvLyBpbnRlcm5hbDo6a2lzc2ZmdF9pbXBsOiAgc21hbGwsIGZyZWUsIHJlYXNvbmFibHkgZWZmaWNpZW50IGRlZmF1bHQsIGRlcml2ZWQgZnJvbSBraXNzZmZ0CisvLworIyBpbmNsdWRlICJzcmMvRkZUL2VpX2tpc3NmZnRfaW1wbC5oIgorICBuYW1lc3BhY2UgRWlnZW4geworICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCisgICAgICAgc3RydWN0IGRlZmF1bHRfZmZ0X2ltcGwgOiBwdWJsaWMgaW50ZXJuYWw6Omtpc3NmZnRfaW1wbDxUPiB7fTsKKyAgfQorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKyAKKy8vIAordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IHN0cnVjdCBmZnRfZndkX3Byb3h5OwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IHN0cnVjdCBmZnRfaW52X3Byb3h5OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+CitzdHJ1Y3QgdHJhaXRzPCBmZnRfZndkX3Byb3h5PFRfU3JjTWF0LFRfRmZ0SWZjPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVF9TcmNNYXQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+CitzdHJ1Y3QgdHJhaXRzPCBmZnRfaW52X3Byb3h5PFRfU3JjTWF0LFRfRmZ0SWZjPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVF9TcmNNYXQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUX1NyY01hdCx0eXBlbmFtZSBUX0ZmdElmYz4gCitzdHJ1Y3QgZmZ0X2Z3ZF9wcm94eQorIDogcHVibGljIFJldHVybkJ5VmFsdWU8ZmZ0X2Z3ZF9wcm94eTxUX1NyY01hdCxUX0ZmdElmYz4gPgoreworICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgZmZ0X2Z3ZF9wcm94eShjb25zdCBUX1NyY01hdCYgc3JjLFRfRmZ0SWZjICYgZmZ0LCBJbmRleCBuZmZ0KSA6IG1fc3JjKHNyYyksbV9pZmMoZmZ0KSwgbV9uZmZ0KG5mZnQpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVF9EZXN0TWF0PiB2b2lkIGV2YWxUbyhUX0Rlc3RNYXQmIGRzdCkgY29uc3Q7CisKKyAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLnJvd3MoKTsgfQorICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zcmMuY29scygpOyB9Citwcm90ZWN0ZWQ6CisgIGNvbnN0IFRfU3JjTWF0ICYgbV9zcmM7CisgIFRfRmZ0SWZjICYgbV9pZmM7CisgIEluZGV4IG1fbmZmdDsKK3ByaXZhdGU6CisgIGZmdF9md2RfcHJveHkmIG9wZXJhdG9yPShjb25zdCBmZnRfZndkX3Byb3h5Jik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUX1NyY01hdCx0eXBlbmFtZSBUX0ZmdElmYz4gCitzdHJ1Y3QgZmZ0X2ludl9wcm94eQorIDogcHVibGljIFJldHVybkJ5VmFsdWU8ZmZ0X2ludl9wcm94eTxUX1NyY01hdCxUX0ZmdElmYz4gPgoreworICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgZmZ0X2ludl9wcm94eShjb25zdCBUX1NyY01hdCYgc3JjLFRfRmZ0SWZjICYgZmZ0LCBJbmRleCBuZmZ0KSA6IG1fc3JjKHNyYyksbV9pZmMoZmZ0KSwgbV9uZmZ0KG5mZnQpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVF9EZXN0TWF0PiB2b2lkIGV2YWxUbyhUX0Rlc3RNYXQmIGRzdCkgY29uc3Q7CisKKyAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLnJvd3MoKTsgfQorICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zcmMuY29scygpOyB9Citwcm90ZWN0ZWQ6CisgIGNvbnN0IFRfU3JjTWF0ICYgbV9zcmM7CisgIFRfRmZ0SWZjICYgbV9pZmM7CisgIEluZGV4IG1fbmZmdDsKK3ByaXZhdGU6CisgIGZmdF9pbnZfcHJveHkmIG9wZXJhdG9yPShjb25zdCBmZnRfaW52X3Byb3h5Jik7Cit9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUX1NjYWxhciwKKyAgICAgICAgIHR5cGVuYW1lIFRfSW1wbD1kZWZhdWx0X2ZmdF9pbXBsPFRfU2NhbGFyPiA+CitjbGFzcyBGRlQKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgVF9JbXBsIGltcGxfdHlwZTsKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbXBsX3R5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbXBsX3R5cGU6OkNvbXBsZXggQ29tcGxleDsKKworICAgIGVudW0gRmxhZyB7CisgICAgICBEZWZhdWx0PTAsIC8vIGdvb2YgcHJvb2YKKyAgICAgIFVuc2NhbGVkPTEsCisgICAgICBIYWxmU3BlY3RydW09MiwKKyAgICAgIC8vIFNvbWVPdGhlclNwZWVkT3B0aW1pemF0aW9uPTQKKyAgICAgIFNwZWVkeT0zMjc2NworICAgIH07CisKKyAgICBGRlQoIGNvbnN0IGltcGxfdHlwZSAmIGltcGw9aW1wbF90eXBlKCkgLCBGbGFnIGZsYWdzPURlZmF1bHQgKSA6bV9pbXBsKGltcGwpLG1fZmxhZyhmbGFncykgeyB9CisKKyAgICBpbmxpbmUKKyAgICBib29sIEhhc0ZsYWcoRmxhZyBmKSBjb25zdCB7IHJldHVybiAobV9mbGFnICYgKGludClmKSA9PSBmO30KKworICAgIGlubGluZQorICAgIHZvaWQgU2V0RmxhZyhGbGFnIGYpIHsgbV9mbGFnIHw9IChpbnQpZjt9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIENsZWFyRmxhZyhGbGFnIGYpIHsgbV9mbGFnICY9ICh+KGludClmKTt9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCwgY29uc3QgU2NhbGFyICogc3JjLCBJbmRleCBuZmZ0KQorICAgIHsKKyAgICAgICAgbV9pbXBsLmZ3ZChkc3Qsc3JjLHN0YXRpY19jYXN0PGludD4obmZmdCkpOworICAgICAgICBpZiAoIEhhc0ZsYWcoSGFsZlNwZWN0cnVtKSA9PSBmYWxzZSkKKyAgICAgICAgICBSZWZsZWN0U3BlY3RydW0oZHN0LG5mZnQpOworICAgIH0KKworICAgIGlubGluZQorICAgIHZvaWQgZndkKCBDb21wbGV4ICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBJbmRleCBuZmZ0KQorICAgIHsKKyAgICAgICAgbV9pbXBsLmZ3ZChkc3Qsc3JjLHN0YXRpY19jYXN0PGludD4obmZmdCkpOworICAgIH0KKworICAgIC8qCisgICAgaW5saW5lIAorICAgIHZvaWQgZndkMihDb21wbGV4ICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBpbnQgbjAsaW50IG4xKQorICAgIHsKKyAgICAgIG1faW1wbC5md2QyKGRzdCxzcmMsbjAsbjEpOworICAgIH0KKyAgICAqLworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dD4KKyAgICBpbmxpbmUKKyAgICB2b2lkIGZ3ZCggc3RkOjp2ZWN0b3I8Q29tcGxleD4gJiBkc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPF9JbnB1dD4gJiBzcmMpIAorICAgIHsKKyAgICAgIGlmICggTnVtVHJhaXRzPF9JbnB1dD46OklzQ29tcGxleCA9PSAwICYmIEhhc0ZsYWcoSGFsZlNwZWN0cnVtKSApCisgICAgICAgIGRzdC5yZXNpemUoIChzcmMuc2l6ZSgpPj4xKSsxKTsgLy8gaGFsZiB0aGUgYmlucyArIE55cXVpc3QgYmluCisgICAgICBlbHNlCisgICAgICAgIGRzdC5yZXNpemUoc3JjLnNpemUoKSk7CisgICAgICBmd2QoJmRzdFswXSwmc3JjWzBdLHNyYy5zaXplKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0RGVyaXZlZCwgdHlwZW5hbWUgQ29tcGxleERlcml2ZWQ+CisgICAgaW5saW5lCisgICAgdm9pZCBmd2QoIE1hdHJpeEJhc2U8Q29tcGxleERlcml2ZWQ+ICYgZHN0LCBjb25zdCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4gJiBzcmMsIEluZGV4IG5mZnQ9LTEpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4RGVyaXZlZDo6U2NhbGFyIGRzdF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBJbnB1dERlcml2ZWQ6OlNjYWxhciBzcmNfdHlwZTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoSW5wdXREZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShDb21wbGV4RGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9WRUNUT1JfU0laRShDb21wbGV4RGVyaXZlZCxJbnB1dERlcml2ZWQpIC8vIHNpemUgYXQgY29tcGlsZS10aW1lCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxkc3RfdHlwZSwgQ29tcGxleD46OnZhbHVlKSwKKyAgICAgICAgICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnQoSW5wdXREZXJpdmVkOjpGbGFncykmaW50KENvbXBsZXhEZXJpdmVkOjpGbGFncykmRGlyZWN0QWNjZXNzQml0LAorICAgICAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfRVhQUkVTU0lPTlNfV0lUSF9ESVJFQ1RfTUVNT1JZX0FDQ0VTU19TVUNIX0FTX01BUF9PUl9QTEFJTl9NQVRSSUNFUykKKworICAgICAgaWYgKG5mZnQ8MSkKKyAgICAgICAgbmZmdCA9IHNyYy5zaXplKCk7CisKKyAgICAgIGlmICggTnVtVHJhaXRzPCBzcmNfdHlwZSA+OjpJc0NvbXBsZXggPT0gMCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKQorICAgICAgICBkc3QuZGVyaXZlZCgpLnJlc2l6ZSggKG5mZnQ+PjEpKzEpOworICAgICAgZWxzZQorICAgICAgICBkc3QuZGVyaXZlZCgpLnJlc2l6ZShuZmZ0KTsKKworICAgICAgaWYgKCBzcmMuaW5uZXJTdHJpZGUoKSAhPSAxIHx8IHNyYy5zaXplKCkgPCBuZmZ0ICkgeworICAgICAgICBNYXRyaXg8c3JjX3R5cGUsMSxEeW5hbWljPiB0bXA7CisgICAgICAgIGlmIChzcmMuc2l6ZSgpPG5mZnQpIHsKKyAgICAgICAgICB0bXAuc2V0WmVybyhuZmZ0KTsKKyAgICAgICAgICB0bXAuYmxvY2soMCwwLHNyYy5zaXplKCksMSApID0gc3JjOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICB0bXAgPSBzcmM7CisgICAgICAgIH0KKyAgICAgICAgZndkKCAmZHN0WzBdLCZ0bXBbMF0sbmZmdCApOworICAgICAgfWVsc2V7CisgICAgICAgIGZ3ZCggJmRzdFswXSwmc3JjWzBdLG5mZnQgKTsKKyAgICAgIH0KKyAgICB9CisgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXREZXJpdmVkPgorICAgIGlubGluZQorICAgIGZmdF9md2RfcHJveHk8IE1hdHJpeEJhc2U8SW5wdXREZXJpdmVkPiwgRkZUPFRfU2NhbGFyLFRfSW1wbD4gPgorICAgIGZ3ZCggY29uc3QgTWF0cml4QmFzZTxJbnB1dERlcml2ZWQ+ICYgc3JjLCBJbmRleCBuZmZ0PS0xKQorICAgIHsKKyAgICAgIHJldHVybiBmZnRfZndkX3Byb3h5PCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4gLEZGVDxUX1NjYWxhcixUX0ltcGw+ID4oIHNyYywgKnRoaXMsbmZmdCApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0RGVyaXZlZD4KKyAgICBpbmxpbmUKKyAgICBmZnRfaW52X3Byb3h5PCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4sIEZGVDxUX1NjYWxhcixUX0ltcGw+ID4KKyAgICBpbnYoIGNvbnN0IE1hdHJpeEJhc2U8SW5wdXREZXJpdmVkPiAmIHNyYywgSW5kZXggbmZmdD0tMSkKKyAgICB7CisgICAgICByZXR1cm4gIGZmdF9pbnZfcHJveHk8IE1hdHJpeEJhc2U8SW5wdXREZXJpdmVkPiAsRkZUPFRfU2NhbGFyLFRfSW1wbD4gPiggc3JjLCAqdGhpcyxuZmZ0ICk7CisgICAgfQorCisgICAgaW5saW5lCisgICAgdm9pZCBpbnYoIENvbXBsZXggKiBkc3QsIGNvbnN0IENvbXBsZXggKiBzcmMsIEluZGV4IG5mZnQpCisgICAgeworICAgICAgbV9pbXBsLmludiggZHN0LHNyYyxzdGF0aWNfY2FzdDxpbnQ+KG5mZnQpICk7CisgICAgICBpZiAoIEhhc0ZsYWcoIFVuc2NhbGVkICkgPT0gZmFsc2UpCisgICAgICAgIHNjYWxlKGRzdCxTY2FsYXIoMS4vbmZmdCksbmZmdCk7IC8vIHNjYWxlIHRoZSB0aW1lIHNlcmllcworICAgIH0KKworICAgIGlubGluZQorICAgIHZvaWQgaW52KCBTY2FsYXIgKiBkc3QsIGNvbnN0IENvbXBsZXggKiBzcmMsIEluZGV4IG5mZnQpCisgICAgeworICAgICAgbV9pbXBsLmludiggZHN0LHNyYyxzdGF0aWNfY2FzdDxpbnQ+KG5mZnQpICk7CisgICAgICBpZiAoIEhhc0ZsYWcoIFVuc2NhbGVkICkgPT0gZmFsc2UpCisgICAgICAgIHNjYWxlKGRzdCxTY2FsYXIoMS4vbmZmdCksbmZmdCk7IC8vIHNjYWxlIHRoZSB0aW1lIHNlcmllcworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dERlcml2ZWQsIHR5cGVuYW1lIENvbXBsZXhEZXJpdmVkPgorICAgIGlubGluZQorICAgIHZvaWQgaW52KCBNYXRyaXhCYXNlPE91dHB1dERlcml2ZWQ+ICYgZHN0LCBjb25zdCBNYXRyaXhCYXNlPENvbXBsZXhEZXJpdmVkPiAmIHNyYywgSW5kZXggbmZmdD0tMSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIENvbXBsZXhEZXJpdmVkOjpTY2FsYXIgc3JjX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE91dHB1dERlcml2ZWQ6OlNjYWxhciBkc3RfdHlwZTsKKyAgICAgIGNvbnN0IGJvb2wgcmVhbGZmdD0gKE51bVRyYWl0czxkc3RfdHlwZT46OklzQ29tcGxleCA9PSAwKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3V0cHV0RGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoQ29tcGxleERlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfVkVDVE9SX1NJWkUoQ29tcGxleERlcml2ZWQsT3V0cHV0RGVyaXZlZCkgLy8gc2l6ZSBhdCBjb21waWxlLXRpbWUKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHNyY190eXBlLCBDb21wbGV4Pjo6dmFsdWUpLAorICAgICAgICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludChPdXRwdXREZXJpdmVkOjpGbGFncykmaW50KENvbXBsZXhEZXJpdmVkOjpGbGFncykmRGlyZWN0QWNjZXNzQml0LAorICAgICAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfRVhQUkVTU0lPTlNfV0lUSF9ESVJFQ1RfTUVNT1JZX0FDQ0VTU19TVUNIX0FTX01BUF9PUl9QTEFJTl9NQVRSSUNFUykKKworICAgICAgaWYgKG5mZnQ8MSkgeyAvL2F1dG9tYXRpYyBGRlQgc2l6ZSBkZXRlcm1pbmF0aW9uCisgICAgICAgIGlmICggcmVhbGZmdCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKSAKKyAgICAgICAgICBuZmZ0ID0gMiooc3JjLnNpemUoKS0xKTsgLy9hc3N1bWUgZXZlbiBmZnQgc2l6ZQorICAgICAgICBlbHNlCisgICAgICAgICAgbmZmdCA9IHNyYy5zaXplKCk7CisgICAgICB9CisgICAgICBkc3QuZGVyaXZlZCgpLnJlc2l6ZSggbmZmdCApOworCisgICAgICAvLyBjaGVjayBmb3IgbmZmdCB0aGF0IGRvZXMgbm90IGZpdCB0aGUgaW5wdXQgZGF0YSBzaXplCisgICAgICBJbmRleCByZXNpemVfaW5wdXQ9ICggcmVhbGZmdCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKQorICAgICAgICA/ICggKG5mZnQvMisxKSAtIHNyYy5zaXplKCkgKQorICAgICAgICA6ICggbmZmdCAtIHNyYy5zaXplKCkgKTsKKworICAgICAgaWYgKCBzcmMuaW5uZXJTdHJpZGUoKSAhPSAxIHx8IHJlc2l6ZV9pbnB1dCApIHsKKyAgICAgICAgLy8gaWYgdGhlIHZlY3RvciBpcyBzdHJpZGVkLCB0aGVuIHdlIG5lZWQgdG8gY29weSBpdCB0byBhIHBhY2tlZCB0ZW1wb3JhcnkKKyAgICAgICAgTWF0cml4PHNyY190eXBlLDEsRHluYW1pYz4gdG1wOworICAgICAgICBpZiAoIHJlc2l6ZV9pbnB1dCApIHsKKyAgICAgICAgICBzaXplX3QgbmNvcHkgPSAoc3RkOjptaW4pKHNyYy5zaXplKCksc3JjLnNpemUoKSArIHJlc2l6ZV9pbnB1dCk7CisgICAgICAgICAgdG1wLnNldFplcm8oc3JjLnNpemUoKSArIHJlc2l6ZV9pbnB1dCk7CisgICAgICAgICAgaWYgKCByZWFsZmZ0ICYmIEhhc0ZsYWcoSGFsZlNwZWN0cnVtKSApIHsKKyAgICAgICAgICAgIC8vIHBhZCBhdCB0aGUgTnlxdWlzdCBiaW4KKyAgICAgICAgICAgIHRtcC5oZWFkKG5jb3B5KSA9IHNyYy5oZWFkKG5jb3B5KTsKKyAgICAgICAgICAgIHRtcChuY29weS0xKSA9IHJlYWwodG1wKG5jb3B5LTEpKTsgLy8gZW5mb3JjZSByZWFsLW9ubHkgTnlxdWlzdCBiaW4KKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHNpemVfdCBuaGVhZCxudGFpbDsKKyAgICAgICAgICAgIG5oZWFkID0gMStuY29weS8yLTE7IC8vIHJhbmdlICBbMDpwaSkKKyAgICAgICAgICAgIG50YWlsID0gbmNvcHkvMi0xOyAgIC8vIHJhbmdlICgtcGk6MCkKKyAgICAgICAgICAgIHRtcC5oZWFkKG5oZWFkKSA9IHNyYy5oZWFkKG5oZWFkKTsKKyAgICAgICAgICAgIHRtcC50YWlsKG50YWlsKSA9IHNyYy50YWlsKG50YWlsKTsKKyAgICAgICAgICAgIGlmIChyZXNpemVfaW5wdXQ8MCkgeyAvL3Nocmlua2luZyAtLSBjcmVhdGUgdGhlIE55cXVpc3QgYmluIGFzIHRoZSBhdmVyYWdlIG9mIHRoZSB0d28gYmlucyB0aGF0IGZvbGQgaW50byBpdAorICAgICAgICAgICAgICB0bXAobmhlYWQpID0gKCBzcmMobmZmdC8yKSArIHNyYyggc3JjLnNpemUoKSAtIG5mZnQvMiApICkqc3JjX3R5cGUoLjUpOworICAgICAgICAgICAgfWVsc2V7IC8vIGV4cGFuZGluZyAtLSBzcGxpdCB0aGUgb2xkIE55cXVpc3QgYmluIGludG8gdHdvIGhhbHZlcworICAgICAgICAgICAgICB0bXAobmhlYWQpID0gc3JjKG5oZWFkKSAqIHNyY190eXBlKC41KTsKKyAgICAgICAgICAgICAgdG1wKHRtcC5zaXplKCktbmhlYWQpID0gdG1wKG5oZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgIHRtcCA9IHNyYzsKKyAgICAgICAgfQorICAgICAgICBpbnYoICZkc3RbMF0sJnRtcFswXSwgbmZmdCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW52KCAmZHN0WzBdLCZzcmNbMF0sIG5mZnQpOworICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfT3V0cHV0PgorICAgIGlubGluZQorICAgIHZvaWQgaW52KCBzdGQ6OnZlY3RvcjxfT3V0cHV0PiAmIGRzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8Q29tcGxleD4gJiBzcmMsSW5kZXggbmZmdD0tMSkKKyAgICB7CisgICAgICBpZiAobmZmdDwxKQorICAgICAgICBuZmZ0ID0gKCBOdW1UcmFpdHM8X091dHB1dD46OklzQ29tcGxleCA9PSAwICYmIEhhc0ZsYWcoSGFsZlNwZWN0cnVtKSApID8gMiooc3JjLnNpemUoKS0xKSA6IHNyYy5zaXplKCk7CisgICAgICBkc3QucmVzaXplKCBuZmZ0ICk7CisgICAgICBpbnYoICZkc3RbMF0sJnNyY1swXSxuZmZ0KTsKKyAgICB9CisKKworICAgIC8qCisgICAgLy8gVE9ETzogbXVsdGktZGltZW5zaW9uYWwgRkZUcworICAgIGlubGluZSAKKyAgICB2b2lkIGludjIoQ29tcGxleCAqIGRzdCwgY29uc3QgQ29tcGxleCAqIHNyYywgaW50IG4wLGludCBuMSkKKyAgICB7CisgICAgICBtX2ltcGwuaW52Mihkc3Qsc3JjLG4wLG4xKTsKKyAgICAgIGlmICggSGFzRmxhZyggVW5zY2FsZWQgKSA9PSBmYWxzZSkKKyAgICAgICAgICBzY2FsZShkc3QsMS4vKG4wKm4xKSxuMCpuMSk7CisgICAgfQorICAqLworCisgICAgaW5saW5lCisgICAgaW1wbF90eXBlICYgaW1wbCgpIHtyZXR1cm4gbV9pbXBsO30KKyAgcHJpdmF0ZToKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUX0RhdGE+CisgICAgaW5saW5lCisgICAgdm9pZCBzY2FsZShUX0RhdGEgKiB4LFNjYWxhciBzLEluZGV4IG54KQorICAgIHsKKyNpZiAxCisgICAgICBmb3IgKGludCBrPTA7azxueDsrK2spCisgICAgICAgICp4KysgKj0gczsKKyNlbHNlCisgICAgICBpZiAoICgocHRyZGlmZl90KXgpICYgMTUgKQorICAgICAgICBNYXRyaXg8VF9EYXRhLCBEeW5hbWljLCAxPjo6TWFwKHgsbngpICo9IHM7CisgICAgICBlbHNlCisgICAgICAgIE1hdHJpeDxUX0RhdGEsIER5bmFtaWMsIDE+OjpNYXBBbGlnbmVkKHgsbngpICo9IHM7CisgICAgICAgICAvL01hdHJpeDxUX0RhdGEsIER5bmFtaWMsIER5bmFtaWM+OjpNYXAoeCxueCkgKiBzOworI2VuZGlmICAKKyAgICB9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIFJlZmxlY3RTcGVjdHJ1bShDb21wbGV4ICogZnJlcSwgSW5kZXggbmZmdCkKKyAgICB7CisgICAgICAvLyBjcmVhdGUgdGhlIGltcGxpY2l0IHJpZ2h0LWhhbGYgc3BlY3RydW0gKGNvbmp1Z2F0ZS1taXJyb3Igb2YgdGhlIGxlZnQtaGFsZikKKyAgICAgIEluZGV4IG5oYmlucz0obmZmdD4+MSkrMTsKKyAgICAgIGZvciAoSW5kZXggaz1uaGJpbnM7ayA8IG5mZnQ7ICsrayApCisgICAgICAgIGZyZXFba10gPSBjb25qKGZyZXFbbmZmdC1rXSk7CisgICAgfQorCisgICAgaW1wbF90eXBlIG1faW1wbDsKKyAgICBpbnQgbV9mbGFnOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IAordGVtcGxhdGU8dHlwZW5hbWUgVF9EZXN0TWF0PiBpbmxpbmUgCit2b2lkIGZmdF9md2RfcHJveHk8VF9TcmNNYXQsVF9GZnRJZmM+OjpldmFsVG8oVF9EZXN0TWF0JiBkc3QpIGNvbnN0Cit7CisgICAgbV9pZmMuZndkKCBkc3QsIG1fc3JjLCBtX25mZnQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUX1NyY01hdCx0eXBlbmFtZSBUX0ZmdElmYz4gCit0ZW1wbGF0ZTx0eXBlbmFtZSBUX0Rlc3RNYXQ+IGlubGluZSAKK3ZvaWQgZmZ0X2ludl9wcm94eTxUX1NyY01hdCxUX0ZmdElmYz46OmV2YWxUbyhUX0Rlc3RNYXQmIGRzdCkgY29uc3QKK3sKKyAgICBtX2lmYy5pbnYoIGRzdCwgbV9zcmMsIG1fbmZmdCk7Cit9CisKK30KKyNlbmRpZgorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnMgYi91bnN1cHBvcnRlZC9FaWdlbi9JdGVyYXRpdmVTb2x2ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTg4MGIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9JdGVyYXRpdmVTb2x2ZXJzCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSVRFUkFUSVZFX1NPTFZFUlNfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fSVRFUkFUSVZFX1NPTFZFUlNfTU9EVUxFX0gKKworI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKworLyoqCisgICogXGRlZmdyb3VwIEl0ZXJhdGl2ZVNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZSBzb2x2ZXJzIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIGFpbXMgdG8gcHJvdmlkZSB2YXJpb3VzIGl0ZXJhdGl2ZSBsaW5lYXIgYW5kIG5vbiBsaW5lYXIgc29sdmVyIGFsZ29yaXRobXMuCisgICogSXQgY3VycmVudGx5IHByb3ZpZGVzOgorICAqICAtIGEgY29uc3RyYWluZWQgY29uanVnYXRlIGdyYWRpZW50CisgICogIC0gYSBIb3VzZWhvbGRlciBHTVJFUyBpbXBsZW1lbnRhdGlvbgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CisgICogXGVuZGNvZGUKKyAgKi8KKy8vQHsKKworI2lmbmRlZiBFSUdFTl9NUEwyX09OTFkKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlU29sdmVycy9JdGVyYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZVNvbHZlcnMvQ29uc3RyYWluZWRDb25qR3JhZC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlU29sdmVycy9JbmNvbXBsZXRlTFUuaCIKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9KYWNvYmkiCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vSG91c2Vob2xkZXIiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZVNvbHZlcnMvR01SRVMuaCIKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlU29sdmVycy9ER01SRVMuaCIKKy8vI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVTb2x2ZXJzL1NTT1JQcmVjb25kaXRpb25lci5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVTb2x2ZXJzL01JTlJFUy5oIgorCisvL0B9CisKKyNlbmRpZiAvLyBFSUdFTl9JVEVSQVRJVkVfU09MVkVSU19NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vS3JvbmVja2VyUHJvZHVjdCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0tyb25lY2tlclByb2R1Y3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1YWZiOAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0tyb25lY2tlclByb2R1Y3QKQEAgLTAsMCArMSwzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0tST05FQ0tFUl9QUk9EVUNUX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0tST05FQ0tFUl9QUk9EVUNUX01PRFVMRV9ICisKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9Db3JlIgorCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVV0aWwuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqCisgICogXGRlZmdyb3VwIEtyb25lY2tlclByb2R1Y3RfTW9kdWxlIEtyb25lY2tlclByb2R1Y3QgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbiBleHBlcmltZW50YWwgS3JvbmVja2VyIHByb2R1Y3QgaW1wbGVtZW50YXRpb24uCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9Lcm9uZWNrZXJQcm9kdWN0PgorICAqIFxlbmRjb2RlCisgICovCisKK30gLy8gbmFtZXNwYWNlIEVpZ2VuCisKKyNpbmNsdWRlICJzcmMvS3JvbmVja2VyUHJvZHVjdC9Lcm9uZWNrZXJUZW5zb3JQcm9kdWN0LmgiCisKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9zcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0tST05FQ0tFUl9QUk9EVUNUX01PRFVMRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9MZXZlbmJlcmdNYXJxdWFyZHQgYi91bnN1cHBvcnRlZC9FaWdlbi9MZXZlbmJlcmdNYXJxdWFyZHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlMjY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0xldmVuYmVyZ01hcnF1YXJkdApAQCAtMCwwICsxLDQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MRVZFTkJFUkdNQVJRVUFSRFRfTU9EVUxFCisjZGVmaW5lIEVJR0VOX0xFVkVOQkVSR01BUlFVQVJEVF9NT0RVTEUKKworLy8gI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vSmFjb2JpPgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmY+IAorCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlUVI+CisKKy8qKgorICAqIFxkZWZncm91cCBMZXZlbmJlcmdNYXJxdWFyZHRfTW9kdWxlIExldmVuYmVyZy1NYXJxdWFyZHQgbW9kdWxlCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDwvRWlnZW4vTGV2ZW5iZXJnTWFycXVhcmR0PgorICAqIFxlbmRjb2RlCisgICoKKyAgKiAKKyAgKi8KKworI2luY2x1ZGUgIkVpZ2VuL1NwYXJzZUNvcmUiCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNpbmNsdWRlICJzcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0xNcXJzb2x2LmgiCisjaW5jbHVkZSAic3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTWNvdmFyLmgiCisjaW5jbHVkZSAic3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTXBhci5oIgorCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTGV2ZW5iZXJnTWFycXVhcmR0LmgiCisjaW5jbHVkZSAic3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTW9uZXN0ZXAuaCIKKworCisjZW5kaWYgLy8gRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX01PRFVMRQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTVBSZWFsU3VwcG9ydCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01QUmVhbFN1cHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYjcwYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01QUmVhbFN1cHBvcnQKQEAgLTAsMCArMSwyMDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGEgam9pbnQgZWZmb3J0IGJldHdlZW4gRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYSwgYW5kIE1QRlIgQysrLCBhIEMrKyBpbnRlcmZhY2UgdG8gTVBGUiBsaWJyYXJ5IChodHRwOi8vd3d3LmhvbG9ib3JvZGtvLmNvbS9wYXZlbC8pCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgUGF2ZWwgSG9sb2Jvcm9ka28gPHBhdmVsQGhvbG9ib3JvZGtvLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBLb25zdGFudGluIEhvbG9ib3JvZGtvIDxrb25zdGFudGluQGhvbG9ib3JvZGtvLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTVBSRUFMU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9NUFJFQUxTVVBQT1JUX01PRFVMRV9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPG1wcmVhbC5oPgorCituYW1lc3BhY2UgRWlnZW4geworICAKKy8qKgorICAqIFxkZWZncm91cCBNUFJlYWxTdXBwb3J0X01vZHVsZSBNUEZSQysrIFN1cHBvcnQgbW9kdWxlCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vTVBSZWFsU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbXVsdGkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKKyAgKiB2aWEgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaG9sb2Jvcm9ka28uY29tL3BhdmVsL21wZnIiPk1QRlIgQysrPC9hPgorICAqIGxpYnJhcnkgd2hpY2ggaXRzZWxmIGlzIGJ1aWx0IHVwb24gPGEgaHJlZj0iaHR0cDovL3d3dy5tcGZyLm9yZy8iPk1QRlI8L2E+LzxhIGhyZWY9Imh0dHA6Ly9nbXBsaWIub3JnLyI+R01QPC9hPi4KKyAgKgorICAqIFx3YXJuaW5nIE1QRlIgQysrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisgICoKKyAgKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIE1QRlIgQysrIHRoYXQgaXMga25vd24gdG8gYmUgY29tcGF0aWJsZSBpbiB0aGUgdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWwgZm9sZGVyLgorICAqCisgICogSGVyZSBpcyBhbiBleGFtcGxlOgorICAqCitcY29kZQorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL01QUmVhbFN1cHBvcnQ+CisjaW5jbHVkZSA8RWlnZW4vTFU+Cit1c2luZyBuYW1lc3BhY2UgbXBmcjsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK2ludCBtYWluKCkKK3sKKyAgLy8gc2V0IHByZWNpc2lvbiB0byAyNTYgYml0cyAoZG91YmxlIGhhcyBvbmx5IDUzIGJpdHMpCisgIG1wcmVhbDo6c2V0X2RlZmF1bHRfcHJlYygyNTYpOworICAvLyBEZWNsYXJlIG1hdHJpeCBhbmQgdmVjdG9yIHR5cGVzIHdpdGggbXVsdGktcHJlY2lzaW9uIHNjYWxhciB0eXBlCisgIHR5cGVkZWYgTWF0cml4PG1wcmVhbCxEeW5hbWljLER5bmFtaWM+ICBNYXRyaXhYbXA7CisgIHR5cGVkZWYgTWF0cml4PG1wcmVhbCxEeW5hbWljLDE+ICAgICAgICBWZWN0b3JYbXA7CisKKyAgTWF0cml4WG1wIEEgPSBNYXRyaXhYbXA6OlJhbmRvbSgxMDAsMTAwKTsKKyAgVmVjdG9yWG1wIGIgPSBWZWN0b3JYbXA6OlJhbmRvbSgxMDApOworCisgIC8vIFNvbHZlIEF4PWIgdXNpbmcgTFUKKyAgVmVjdG9yWG1wIHggPSBBLmx1KCkuc29sdmUoYik7CisgIHN0ZDo6Y291dCA8PCAicmVsYXRpdmUgZXJyb3I6ICIgPDwgKEEqeCAtIGIpLm5vcm0oKSAvIGIubm9ybSgpIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7Cit9CitcZW5kY29kZQorICAqCisgICovCisJCisgIHRlbXBsYXRlPD4gc3RydWN0IE51bVRyYWl0czxtcGZyOjptcHJlYWw+CisgICAgOiBHZW5lcmljTnVtVHJhaXRzPG1wZnI6Om1wcmVhbD4KKyAgeworICAgIGVudW0geworICAgICAgSXNJbnRlZ2VyID0gMCwKKyAgICAgIElzU2lnbmVkID0gMSwKKyAgICAgIElzQ29tcGxleCA9IDAsCisgICAgICBSZXF1aXJlSW5pdGlhbGl6YXRpb24gPSAxLAorICAgICAgUmVhZENvc3QgPSBIdWdlQ29zdCwKKyAgICAgIEFkZENvc3QgID0gSHVnZUNvc3QsCisgICAgICBNdWxDb3N0ICA9IEh1Z2VDb3N0CisgICAgfTsKKworICAgIHR5cGVkZWYgbXBmcjo6bXByZWFsIFJlYWw7CisgICAgdHlwZWRlZiBtcGZyOjptcHJlYWwgTm9uSW50ZWdlcjsKKyAgICAKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgaGlnaGVzdCAgKGxvbmcgUHJlY2lzaW9uID0gbXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpIHsgcmV0dXJuICBtcGZyOjptYXh2YWwoUHJlY2lzaW9uKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgUmVhbCBsb3dlc3QgICAobG9uZyBQcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgeyByZXR1cm4gLW1wZnI6Om1heHZhbChQcmVjaXNpb24pOyB9CisKKyAgICAvLyBDb25zdGFudHMKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgUGkgICAgICAobG9uZyBQcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgIHsgcmV0dXJuIG1wZnI6OmNvbnN0X3BpKFByZWNpc2lvbik7ICAgICAgICB9CisgICAgc3RhdGljIGlubGluZSBSZWFsIEV1bGVyICAgKGxvbmcgUHJlY2lzaW9uID0gbXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpICB7IHJldHVybiBtcGZyOjpjb25zdF9ldWxlcihQcmVjaXNpb24pOyAgICAgfQorICAgIHN0YXRpYyBpbmxpbmUgUmVhbCBMb2cyICAgIChsb25nIFByZWNpc2lvbiA9IG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKSAgeyByZXR1cm4gbXBmcjo6Y29uc3RfbG9nMihQcmVjaXNpb24pOyAgICAgIH0KKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgQ2F0YWxhbiAobG9uZyBQcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgIHsgcmV0dXJuIG1wZnI6OmNvbnN0X2NhdGFsYW4oUHJlY2lzaW9uKTsgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgZXBzaWxvbiAobG9uZyBQcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgIHsgcmV0dXJuIG1wZnI6Om1hY2hpbmVfZXBzaWxvbihQcmVjaXNpb24pOyB9CisgICAgc3RhdGljIGlubGluZSBSZWFsIGVwc2lsb24gKGNvbnN0IFJlYWwmIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtcGZyOjptYWNoaW5lX2Vwc2lsb24oeCk7IH0KKworI2lmZGVmIE1QUkVBTF9IQVZFX0RZTkFNSUNfU1REX05VTUVSSUNfTElNSVRTCisgICAgc3RhdGljIGlubGluZSBpbnQgZGlnaXRzMTAgKGxvbmcgUHJlY2lzaW9uID0gbXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWw+OjpkaWdpdHMxMChQcmVjaXNpb24pOyB9CisgICAgc3RhdGljIGlubGluZSBpbnQgZGlnaXRzMTAgKGNvbnN0IFJlYWwmIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWw+OjpkaWdpdHMxMCh4KTsgfQorI2VuZGlmCisKKyAgICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkKKyAgICB7CisgICAgICBtcGZyX3ByZWNfdCB3ZWFrX3ByZWMgPSAoKG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpLTEpICogOTApIC8gMTAwOworICAgICAgcmV0dXJuIG1wZnI6Om1hY2hpbmVfZXBzaWxvbih3ZWFrX3ByZWMpOworICAgIH0KKyAgfTsKKworICBuYW1lc3BhY2UgaW50ZXJuYWwgeworCisgIHRlbXBsYXRlPD4gaW5saW5lIG1wZnI6Om1wcmVhbCByYW5kb208bXBmcjo6bXByZWFsPigpCisgIHsKKyAgICByZXR1cm4gbXBmcjo6cmFuZG9tKCk7CisgIH0KKworICB0ZW1wbGF0ZTw+IGlubGluZSBtcGZyOjptcHJlYWwgcmFuZG9tPG1wZnI6Om1wcmVhbD4oY29uc3QgbXBmcjo6bXByZWFsJiBhLCBjb25zdCBtcGZyOjptcHJlYWwmIGIpCisgIHsKKyAgICByZXR1cm4gYSArIChiLWEpICogcmFuZG9tPG1wZnI6Om1wcmVhbD4oKTsKKyAgfQorCisgIGlubGluZSBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IG1wZnI6Om1wcmVhbCYgYSwgY29uc3QgbXBmcjo6bXByZWFsJiBiLCBjb25zdCBtcGZyOjptcHJlYWwmIGVwcykKKyAgeworICAgIHJldHVybiBtcGZyOjphYnMoYSkgPD0gbXBmcjo6YWJzKGIpICogZXBzOworICB9CisKKyAgaW5saW5lIGJvb2wgaXNBcHByb3goY29uc3QgbXBmcjo6bXByZWFsJiBhLCBjb25zdCBtcGZyOjptcHJlYWwmIGIsIGNvbnN0IG1wZnI6Om1wcmVhbCYgZXBzKQorICB7CisgICAgcmV0dXJuIG1wZnI6OmlzRXF1YWxGdXp6eShhLGIsZXBzKTsKKyAgfQorCisgIGlubGluZSBib29sIGlzQXBwcm94T3JMZXNzVGhhbihjb25zdCBtcGZyOjptcHJlYWwmIGEsIGNvbnN0IG1wZnI6Om1wcmVhbCYgYiwgY29uc3QgbXBmcjo6bXByZWFsJiBlcHMpCisgIHsKKyAgICByZXR1cm4gYSA8PSBiIHx8IG1wZnI6OmlzRXF1YWxGdXp6eShhLGIsZXBzKTsKKyAgfQorCisgIHRlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIGNhc3Q8bXBmcjo6bXByZWFsLGxvbmcgZG91YmxlPihjb25zdCBtcGZyOjptcHJlYWwmIHgpCisgIHsgcmV0dXJuIHgudG9MRG91YmxlKCk7IH0KKworICB0ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgY2FzdDxtcGZyOjptcHJlYWwsZG91YmxlPihjb25zdCBtcGZyOjptcHJlYWwmIHgpCisgIHsgcmV0dXJuIHgudG9Eb3VibGUoKTsgfQorCisgIHRlbXBsYXRlPD4gaW5saW5lIGxvbmcgY2FzdDxtcGZyOjptcHJlYWwsbG9uZz4oY29uc3QgbXBmcjo6bXByZWFsJiB4KQorICB7IHJldHVybiB4LnRvTG9uZygpOyB9CisKKyAgdGVtcGxhdGU8PiBpbmxpbmUgaW50IGNhc3Q8bXBmcjo6bXByZWFsLGludD4oY29uc3QgbXBmcjo6bXByZWFsJiB4KQorICB7IHJldHVybiBpbnQoeC50b0xvbmcoKSk7IH0KKworICAvLyBTcGVjaWFsaXplIEdFQlAga2VybmVsIGFuZCB0cmFpdHMgZm9yIG1wcmVhbCAobm8gbmVlZCBmb3IgcGVlbGluZywgbm9yIGNvbXBsaWNhdGVkIHN0dWZmKQorICAvLyBUaGlzIGFsc28gcGVybWl0cyB0byBkaXJlY3RseSBjYWxsIG1wZnIncyByb3V0aW5lcyBhbmQgYXZvaWQgbWFueSB0ZW1wb3JhcmllcyBwcm9kdWNlZCBieSBtcHJlYWwKKyAgICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgZ2VicF90cmFpdHM8bXBmcjo6bXByZWFsLCBtcGZyOjptcHJlYWwsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBtcGZyOjptcHJlYWwgUmVzU2NhbGFyOworICAgICAgZW51bSB7CisgICAgICAgIFZlY3Rvcml6YWJsZSA9IGZhbHNlLAorICAgICAgICBMaHNQYWNrZXRTaXplID0gMSwKKyAgICAgICAgUmhzUGFja2V0U2l6ZSA9IDEsCisgICAgICAgIFJlc1BhY2tldFNpemUgPSAxLAorICAgICAgICBOdW1iZXJPZlJlZ2lzdGVycyA9IDEsCisgICAgICAgIG5yID0gMSwKKyAgICAgICAgbXIgPSAxLAorICAgICAgICBMaHNQcm9ncmVzcyA9IDEsCisgICAgICAgIFJoc1Byb2dyZXNzID0gMQorICAgICAgfTsKKyAgICAgIHR5cGVkZWYgUmVzU2NhbGFyIExoc1BhY2tldDsKKyAgICAgIHR5cGVkZWYgUmVzU2NhbGFyIFJoc1BhY2tldDsKKyAgICAgIHR5cGVkZWYgUmVzU2NhbGFyIFJlc1BhY2tldDsKKyAgICAgIAorICAgIH07CisKKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIERhdGFNYXBwZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4KKyAgICBzdHJ1Y3QgZ2VicF9rZXJuZWw8bXBmcjo6bXByZWFsLG1wZnI6Om1wcmVhbCxJbmRleCxEYXRhTWFwcGVyLDEsMSxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPgorICAgIHsKKyAgICAgIHR5cGVkZWYgbXBmcjo6bXByZWFsIG1wcmVhbDsKKworICAgICAgRUlHRU5fRE9OVF9JTkxJTkUKKyAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBEYXRhTWFwcGVyJiByZXMsIGNvbnN0IG1wcmVhbCogYmxvY2tBLCBjb25zdCBtcHJlYWwqIGJsb2NrQiwgCisgICAgICAgICAgICAgICAgICAgICAgSW5kZXggcm93cywgSW5kZXggZGVwdGgsIEluZGV4IGNvbHMsIGNvbnN0IG1wcmVhbCYgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgSW5kZXggc3RyaWRlQT0tMSwgSW5kZXggc3RyaWRlQj0tMSwgSW5kZXggb2Zmc2V0QT0wLCBJbmRleCBvZmZzZXRCPTApCisgICAgICB7CisgICAgICAgIGlmKHJvd3M9PTAgfHwgY29scz09MCB8fCBkZXB0aD09MCkKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbXByZWFsICBhY2MxKDAsbXBmcl9nZXRfcHJlYyhibG9ja0FbMF0ubXBmcl9zcmNwdHIoKSkpLAorICAgICAgICAgICAgICAgIHRtcCAoMCxtcGZyX2dldF9wcmVjKGJsb2NrQVswXS5tcGZyX3NyY3B0cigpKSk7CisKKyAgICAgICAgaWYoc3RyaWRlQT09LTEpIHN0cmlkZUEgPSBkZXB0aDsKKyAgICAgICAgaWYoc3RyaWRlQj09LTEpIHN0cmlkZUIgPSBkZXB0aDsKKworICAgICAgICBmb3IoSW5kZXggaT0wOyBpPHJvd3M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGZvcihJbmRleCBqPTA7IGo8Y29sczsgKytqKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IG1wcmVhbCAqQSA9IGJsb2NrQSArIGkqc3RyaWRlQSArIG9mZnNldEE7CisgICAgICAgICAgICBjb25zdCBtcHJlYWwgKkIgPSBibG9ja0IgKyBqKnN0cmlkZUIgKyBvZmZzZXRCOworICAgICAgICAgICAgCisgICAgICAgICAgICBhY2MxID0gMDsKKyAgICAgICAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBmcl9tdWwodG1wLm1wZnJfcHRyKCksIEFba10ubXBmcl9zcmNwdHIoKSwgQltrXS5tcGZyX3NyY3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsKKyAgICAgICAgICAgICAgbXBmcl9hZGQoYWNjMS5tcGZyX3B0cigpLCBhY2MxLm1wZnJfcHRyKCksIHRtcC5tcGZyX3B0cigpLCAgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1wZnJfbXVsKGFjYzEubXBmcl9wdHIoKSwgYWNjMS5tcGZyX3NyY3B0cigpLCBhbHBoYS5tcGZyX3NyY3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsKKyAgICAgICAgICAgIG1wZnJfYWRkKHJlcyhpLGopLm1wZnJfcHRyKCksIHJlcyhpLGopLm1wZnJfc3JjcHRyKCksIGFjYzEubXBmcl9zcmNwdHIoKSwgIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIH0gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfQorCisjZW5kaWYgLy8gRUlHRU5fTVBSRUFMU1VQUE9SVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zIGIvdW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjA2MDYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnMKQEAgLTAsMCArMSw1MDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhfRlVOQ1RJT05TCisjZGVmaW5lIEVJR0VOX01BVFJJWF9GVU5DVElPTlMKKworI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKworLyoqCisgICogXGRlZmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUgTWF0cml4IGZ1bmN0aW9ucyBtb2R1bGUKKyAgKiBcYnJpZWYgVGhpcyBtb2R1bGUgYWltcyB0byBwcm92aWRlIHZhcmlvdXMgbWV0aG9kcyBmb3IgdGhlIGNvbXB1dGF0aW9uIG9mCisgICogbWF0cml4IGZ1bmN0aW9ucy4gCisgICoKKyAgKiBUbyB1c2UgdGhpcyBtb2R1bGUsIGFkZCAKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisgICogXGVuZGNvZGUKKyAgKiBhdCB0aGUgc3RhcnQgb2YgeW91ciBzb3VyY2UgZmlsZS4KKyAgKgorICAqIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBNYXRyaXhCYXNlIG1ldGhvZHMuCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX2NvcyAiTWF0cml4QmFzZTo6Y29zKCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggY29zaW5lCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX2Nvc2ggIk1hdHJpeEJhc2U6OmNvc2goKSIsIGZvciBjb21wdXRpbmcgdGhlIG1hdHJpeCBoeXBlcmJvbGljIGNvc2luZQorICAqICAtIFxyZWYgbWF0cml4YmFzZV9leHAgIk1hdHJpeEJhc2U6OmV4cCgpIiwgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGV4cG9uZW50aWFsCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX2xvZyAiTWF0cml4QmFzZTo6bG9nKCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggbG9nYXJpdGhtCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX3BvdyAiTWF0cml4QmFzZTo6cG93KCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggcG93ZXIKKyAgKiAgLSBccmVmIG1hdHJpeGJhc2VfbWF0cml4ZnVuY3Rpb24gIk1hdHJpeEJhc2U6Om1hdHJpeEZ1bmN0aW9uKCkiLCBmb3IgY29tcHV0aW5nIGdlbmVyYWwgbWF0cml4IGZ1bmN0aW9ucworICAqICAtIFxyZWYgbWF0cml4YmFzZV9zaW4gIk1hdHJpeEJhc2U6OnNpbigpIiwgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IHNpbmUKKyAgKiAgLSBccmVmIG1hdHJpeGJhc2Vfc2luaCAiTWF0cml4QmFzZTo6c2luaCgpIiwgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGh5cGVyYm9saWMgc2luZQorICAqICAtIFxyZWYgbWF0cml4YmFzZV9zcXJ0ICJNYXRyaXhCYXNlOjpzcXJ0KCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QKKyAgKgorICAqIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBtYWluIGVudHJ5IHBvaW50cyB0byB0aGlzIG1vZHVsZS4gCisgICoKKyAgKiAlTWF0cml4IGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzLiAgU3VwcG9zZSB0aGF0IFxmJCBmIFxmJAorICAqIGlzIGFuIGVudGlyZSBmdW5jdGlvbiAodGhhdCBpcywgYSBmdW5jdGlvbiBvbiB0aGUgY29tcGxleCBwbGFuZQorICAqIHRoYXQgaXMgZXZlcnl3aGVyZSBjb21wbGV4IGRpZmZlcmVudGlhYmxlKS4gIFRoZW4gaXRzIFRheWxvcgorICAqIHNlcmllcworICAqIFxmWyBmKDApICsgZicoMCkgeCArIFxmcmFje2YnJygwKX17Mn0geF4yICsgXGZyYWN7ZicnJygwKX17MyF9IHheMyArIFxjZG90cyBcZl0KKyAgKiBjb252ZXJnZXMgdG8gXGYkIGYoeCkgXGYkLiBJbiB0aGlzIGNhc2UsIHdlIGNhbiBkZWZpbmUgdGhlIG1hdHJpeAorICAqIGZ1bmN0aW9uIGJ5IHRoZSBzYW1lIHNlcmllczoKKyAgKiBcZlsgZihNKSA9IGYoMCkgKyBmJygwKSBNICsgXGZyYWN7ZicnKDApfXsyfSBNXjIgKyBcZnJhY3tmJycnKDApfXszIX0gTV4zICsgXGNkb3RzIFxmXQorICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEV4cG9uZW50aWFsLmgiCisjaW5jbHVkZSAic3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhGdW5jdGlvbi5oIgorI2luY2x1ZGUgInNyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4U3F1YXJlUm9vdC5oIgorI2luY2x1ZGUgInNyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4TG9nYXJpdGhtLmgiCisjaW5jbHVkZSAic3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhQb3dlci5oIgorCisKKy8qKiAKK1xwYWdlIG1hdHJpeGJhc2VleHRyYV9wYWdlCitcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisKK1xzZWN0aW9uIG1hdHJpeGJhc2VleHRyYSBNYXRyaXhCYXNlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgTWF0cml4RnVuY3Rpb25zIG1vZHVsZQorCitUaGUgcmVtYWluZGVyIG9mIHRoZSBwYWdlIGRvY3VtZW50cyB0aGUgZm9sbG93aW5nIE1hdHJpeEJhc2UgbWV0aG9kcword2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIE1hdHJpeEZ1bmN0aW9ucyBtb2R1bGUuCisKKworCitcc3Vic2VjdGlvbiBtYXRyaXhiYXNlX2NvcyBNYXRyaXhCYXNlOjpjb3MoKQorCitDb21wdXRlIHRoZSBtYXRyaXggY29zaW5lLgorCitcY29kZQorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb3MoKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgYSBzcXVhcmUgbWF0cml4LgorXHJldHVybnMgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIFxmJCBcY29zKE0pIFxmJC4KKworVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgbWF0cml4IGNvc2luZS4gVXNlIEFycmF5QmFzZTo6Y29zKCkgZm9yIGNvbXB1dGluZyB0aGUgZW50cnktd2lzZSBjb3NpbmUuCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBjYWxscyBccmVmIG1hdHJpeGJhc2VfbWF0cml4ZnVuY3Rpb24gIm1hdHJpeEZ1bmN0aW9uKCkiIHdpdGggU3RkU3RlbUZ1bmN0aW9uczo6Y29zKCkuCisKK1xzYSBccmVmIG1hdHJpeGJhc2Vfc2luICJzaW4oKSIgZm9yIGFuIGV4YW1wbGUuCisKKworCitcc3Vic2VjdGlvbiBtYXRyaXhiYXNlX2Nvc2ggTWF0cml4QmFzZTo6Y29zaCgpCisKK0NvbXB1dGUgdGhlIG1hdHJpeCBoeWJlcmJvbGljIGNvc2luZS4KKworXGNvZGUKK2NvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6Y29zaCgpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBhIHNxdWFyZSBtYXRyaXguCitccmV0dXJucyAgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgXGYkIFxjb3NoKE0pIFxmJAorCitUaGlzIGZ1bmN0aW9uIGNhbGxzIFxyZWYgbWF0cml4YmFzZV9tYXRyaXhmdW5jdGlvbiAibWF0cml4RnVuY3Rpb24oKSIgd2l0aCBTdGRTdGVtRnVuY3Rpb25zOjpjb3NoKCkuCisKK1xzYSBccmVmIG1hdHJpeGJhc2Vfc2luaCAic2luaCgpIiBmb3IgYW4gZXhhbXBsZS4KKworCisKK1xzdWJzZWN0aW9uIG1hdHJpeGJhc2VfZXhwIE1hdHJpeEJhc2U6OmV4cCgpCisKK0NvbXB1dGUgdGhlIG1hdHJpeCBleHBvbmVudGlhbC4KKworXGNvZGUKK2NvbnN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6ZXhwKCkgY29uc3QKK1xlbmRjb2RlCisKK1xwYXJhbVtpbl0gIE0gIG1hdHJpeCB3aG9zZSBleHBvbmVudGlhbCBpcyB0byBiZSBjb21wdXRlZC4KK1xyZXR1cm5zICAgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggZXhwb25lbnRpYWwgb2YgXHAgTS4KKworVGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBcZiQgTSBcZiQgaXMgZGVmaW5lZCBieQorXGZbIFxleHAoTSkgPSBcc3VtX3trPTB9XlxpbmZ0eSBcZnJhY3tNXmt9e2shfS4gXGZdCitUaGUgbWF0cml4IGV4cG9uZW50aWFsIGNhbiBiZSB1c2VkIHRvIHNvbHZlIGxpbmVhciBvcmRpbmFyeQorZGlmZmVyZW50aWFsIGVxdWF0aW9uczogdGhlIHNvbHV0aW9uIG9mIFxmJCB5JyA9IE15IFxmJCB3aXRoIHRoZQoraW5pdGlhbCBjb25kaXRpb24gXGYkIHkoMCkgPSB5XzAgXGYkIGlzIGdpdmVuIGJ5CitcZiQgeSh0KSA9IFxleHAoTSkgeV8wIFxmJC4KKworVGhlIG1hdHJpeCBleHBvbmVudGlhbCBpcyBkaWZmZXJlbnQgZnJvbSBhcHBseWluZyB0aGUgZXhwIGZ1bmN0aW9uIHRvIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgbWF0cml4LgorVXNlIEFycmF5QmFzZTo6ZXhwKCkgaWYgeW91IHdhbnQgdG8gZG8gdGhlIGxhdHRlci4KKworVGhlIGNvc3Qgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGFwcHJveGltYXRlbHkgXGYkIDIwIG5eMyBcZiQgZm9yCittYXRyaWNlcyBvZiBzaXplIFxmJCBuIFxmJC4gVGhlIG51bWJlciAyMCBkZXBlbmRzIHdlYWtseSBvbiB0aGUKK25vcm0gb2YgdGhlIG1hdHJpeC4KKworVGhlIG1hdHJpeCBleHBvbmVudGlhbCBpcyBjb21wdXRlZCB1c2luZyB0aGUgc2NhbGluZy1hbmQtc3F1YXJpbmcKK21ldGhvZCBjb21iaW5lZCB3aXRoIFBhZCZlYWN1dGU7IGFwcHJveGltYXRpb24uIFRoZSBtYXRyaXggaXMgZmlyc3QKK3Jlc2NhbGVkLCB0aGVuIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgcmVkdWNlZCBtYXRyaXggaXMgY29tcHV0ZWQKK2FwcHJveGltYW50LCBhbmQgdGhlbiB0aGUgcmVzY2FsaW5nIGlzIHVuZG9uZSBieSByZXBlYXRlZAorc3F1YXJpbmcuIFRoZSBkZWdyZWUgb2YgdGhlIFBhZCZlYWN1dGU7IGFwcHJveGltYW50IGlzIGNob3NlbiBzdWNoCit0aGF0IHRoZSBhcHByb3hpbWF0aW9uIGVycm9yIGlzIGxlc3MgdGhhbiB0aGUgcm91bmQtb2ZmCitlcnJvci4gSG93ZXZlciwgZXJyb3JzIG1heSBhY2N1bXVsYXRlIGR1cmluZyB0aGUgc3F1YXJpbmcgcGhhc2UuCisKK0RldGFpbHMgb2YgdGhlIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW46IE5pY2hvbGFzIEouIEhpZ2hhbSwgIlRoZQorc2NhbGluZyBhbmQgc3F1YXJpbmcgbWV0aG9kIGZvciB0aGUgbWF0cml4IGV4cG9uZW50aWFsIHJldmlzaXRlZCwiCis8ZW0+U0lBTSBKLiAlTWF0cml4IEFuYWwuIEFwcGxpYy48L2VtPiwgPGI+MjY8L2I+OjExNzkmbmRhc2g7MTE5MywKKzIwMDUuCisKK0V4YW1wbGU6IFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjaGVja3MgdGhhdAorXGZbIFxleHAgXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfQorICAgICAgMCAmIFxmcmFjMTRccGkgJiAwIFxcCisgICAgICAtXGZyYWMxNFxwaSAmIDAgJiAwIFxcCisgICAgICAwICYgMCAmIDAKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdID0gXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfQorICAgICAgXGZyYWMxMlxzcXJ0MiAmIC1cZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgXGZyYWMxMlxzcXJ0MiAmIFxmcmFjMTJcc3FydDIgJiAwIFxcCisgICAgICAwICYgMCAmIDEKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdLiBcZl0KK1RoaXMgY29ycmVzcG9uZHMgdG8gYSByb3RhdGlvbiBvZiBcZiQgXGZyYWMxNFxwaSBcZiQgcmFkaWFucyBhcm91bmQKK3RoZSB6LWF4aXMuCisKK1xpbmNsdWRlIE1hdHJpeEV4cG9uZW50aWFsLmNwcAorT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4RXhwb25lbnRpYWwub3V0CisKK1xub3RlIFxwIE0gaGFzIHRvIGJlIGEgbWF0cml4IG9mIFxjIGZsb2F0LCBcYyBkb3VibGUsIFxjIGxvbmcgZG91YmxlCitcYyBjb21wbGV4PGZsb2F0PiwgXGMgY29tcGxleDxkb3VibGU+LCBvciBcYyBjb21wbGV4PGxvbmcgZG91YmxlPiAuCisKKworXHN1YnNlY3Rpb24gbWF0cml4YmFzZV9sb2cgTWF0cml4QmFzZTo6bG9nKCkKKworQ29tcHV0ZSB0aGUgbWF0cml4IGxvZ2FyaXRobS4KKworXGNvZGUKK2NvbnN0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmxvZygpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBpbnZlcnRpYmxlIG1hdHJpeCB3aG9zZSBsb2dhcml0aG0gaXMgdG8gYmUgY29tcHV0ZWQuCitccmV0dXJucyAgICBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbWF0cml4IGxvZ2FyaXRobSByb290IG9mIFxwIE0uCisKK1RoZSBtYXRyaXggbG9nYXJpdGhtIG9mIFxmJCBNIFxmJCBpcyBhIG1hdHJpeCBcZiQgWCBcZiQgc3VjaCB0aGF0IAorXGYkIFxleHAoWCkgPSBNIFxmJCB3aGVyZSBleHAgZGVub3RlcyB0aGUgbWF0cml4IGV4cG9uZW50aWFsLiBBcyBmb3IKK3RoZSBzY2FsYXIgbG9nYXJpdGhtLCB0aGUgZXF1YXRpb24gXGYkIFxleHAoWCkgPSBNIFxmJCBtYXkgaGF2ZQorbXVsdGlwbGUgc29sdXRpb25zOyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtYXRyaXggd2hvc2UgZWlnZW52YWx1ZXMKK2hhdmUgaW1hZ2luYXJ5IHBhcnQgaW4gdGhlIGludGVydmFsIFxmJCAoLVxwaSxccGldIFxmJC4KKworVGhlIG1hdHJpeCBsb2dhcml0aG0gaXMgZGlmZmVyZW50IGZyb20gYXBwbHlpbmcgdGhlIGxvZyBmdW5jdGlvbiB0byBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIG1hdHJpeC4KK1VzZSBBcnJheUJhc2U6OmxvZygpIGlmIHlvdSB3YW50IHRvIGRvIHRoZSBsYXR0ZXIuCisKK0luIHRoZSByZWFsIGNhc2UsIHRoZSBtYXRyaXggXGYkIE0gXGYkIHNob3VsZCBiZSBpbnZlcnRpYmxlIGFuZAoraXQgc2hvdWxkIGhhdmUgbm8gZWlnZW52YWx1ZXMgd2hpY2ggYXJlIHJlYWwgYW5kIG5lZ2F0aXZlIChwYWlycyBvZgorY29tcGxleCBjb25qdWdhdGUgZWlnZW52YWx1ZXMgYXJlIGFsbG93ZWQpLiBJbiB0aGUgY29tcGxleCBjYXNlLCBpdAorb25seSBuZWVkcyB0byBiZSBpbnZlcnRpYmxlLgorCitUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBtYXRyaXggbG9nYXJpdGhtIHVzaW5nIHRoZSBTY2h1ci1QYXJsZXR0CithbGdvcml0aG0gYXMgaW1wbGVtZW50ZWQgYnkgTWF0cml4QmFzZTo6bWF0cml4RnVuY3Rpb24oKS4gVGhlCitsb2dhcml0aG0gb2YgYW4gYXRvbWljIGJsb2NrIGlzIGNvbXB1dGVkIGJ5IE1hdHJpeExvZ2FyaXRobUF0b21pYywKK3doaWNoIHVzZXMgZGlyZWN0IGNvbXB1dGF0aW9uIGZvciAxLWJ5LTEgYW5kIDItYnktMiBibG9ja3MgYW5kIGFuCitpbnZlcnNlIHNjYWxpbmctYW5kLXNxdWFyaW5nIGFsZ29yaXRobSBmb3IgYmlnZ2VyIGJsb2Nrcywgd2l0aCB0aGUKK3NxdWFyZSByb290cyBjb21wdXRlZCBieSBNYXRyaXhCYXNlOjpzcXJ0KCkuCisKK0RldGFpbHMgb2YgdGhlIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW4gU2VjdGlvbiAxMS42LjIgb2Y6CitOaWNob2xhcyBKLiBIaWdoYW0sCis8ZW0+RnVuY3Rpb25zIG9mIE1hdHJpY2VzOiBUaGVvcnkgYW5kIENvbXB1dGF0aW9uPC9lbT4sCitTSUFNIDIwMDguIElTQk4gOTc4LTAtODk4NzE2LTQ2LTcuCisKK0V4YW1wbGU6IFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjaGVja3MgdGhhdAorXGZbIFxsb2cgXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfSAKKyAgICAgIFxmcmFjMTJcc3FydDIgJiAtXGZyYWMxMlxzcXJ0MiAmIDAgXFwKKyAgICAgIFxmcmFjMTJcc3FydDIgJiBcZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgMCAmIDAgJiAxCisgICAgXGVuZHthcnJheX0gXHJpZ2h0XSA9IFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjY30KKyAgICAgIDAgJiBcZnJhYzE0XHBpICYgMCBcXCAKKyAgICAgIC1cZnJhYzE0XHBpICYgMCAmIDAgXFwKKyAgICAgIDAgJiAwICYgMCAKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdLiBcZl0KK1RoaXMgY29ycmVzcG9uZHMgdG8gYSByb3RhdGlvbiBvZiBcZiQgXGZyYWMxNFxwaSBcZiQgcmFkaWFucyBhcm91bmQKK3RoZSB6LWF4aXMuIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGV4YW1wbGUgdXNlZCBpbiB0aGUKK2RvY3VtZW50YXRpb24gb2YgXHJlZiBtYXRyaXhiYXNlX2V4cCAiZXhwKCkiLgorCitcaW5jbHVkZSBNYXRyaXhMb2dhcml0aG0uY3BwCitPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhMb2dhcml0aG0ub3V0CisKK1xub3RlIFxwIE0gaGFzIHRvIGJlIGEgbWF0cml4IG9mIFxjIGZsb2F0LCBcYyBkb3VibGUsIDx0dD5sb25nCitkb3VibGU8L3R0PiwgXGMgY29tcGxleDxmbG9hdD4sIFxjIGNvbXBsZXg8ZG91YmxlPiwgb3IgXGMgY29tcGxleDxsb25nCitkb3VibGU+IC4KKworXHNhIE1hdHJpeEJhc2U6OmV4cCgpLCBNYXRyaXhCYXNlOjptYXRyaXhGdW5jdGlvbigpLCAKKyAgICBjbGFzcyBNYXRyaXhMb2dhcml0aG1BdG9taWMsIE1hdHJpeEJhc2U6OnNxcnQoKS4KKworCitcc3Vic2VjdGlvbiBtYXRyaXhiYXNlX3BvdyBNYXRyaXhCYXNlOjpwb3coKQorCitDb21wdXRlIHRoZSBtYXRyaXggcmFpc2VkIHRvIGFyYml0cmFyeSByZWFsIHBvd2VyLgorCitcY29kZQorY29uc3QgTWF0cml4UG93ZXJSZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpwb3coUmVhbFNjYWxhciBwKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgYmFzZSBvZiB0aGUgbWF0cml4IHBvd2VyLCBzaG91bGQgYmUgYSBzcXVhcmUgbWF0cml4LgorXHBhcmFtW2luXSAgcCAgZXhwb25lbnQgb2YgdGhlIG1hdHJpeCBwb3dlci4KKworVGhlIG1hdHJpeCBwb3dlciBcZiQgTV5wIFxmJCBpcyBkZWZpbmVkIGFzIFxmJCBcZXhwKHAgXGxvZyhNKSkgXGYkLAord2hlcmUgZXhwIGRlbm90ZXMgdGhlIG1hdHJpeCBleHBvbmVudGlhbCwgYW5kIGxvZyBkZW5vdGVzIHRoZSBtYXRyaXgKK2xvZ2FyaXRobS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSByYWlzaW5nIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgbWF0cml4Cit0byB0aGUgcC10aCBwb3dlci4gVXNlIEFycmF5QmFzZTo6cG93KCkgaWYgeW91IHdhbnQgdG8gZG8gdGhlIGxhdHRlci4KKworSWYgXHAgcCBpcyBjb21wbGV4LCB0aGUgc2NhbGFyIHR5cGUgb2YgXHAgTSBzaG91bGQgYmUgdGhlIHR5cGUgb2YgXHAKK3AgLiBcZiQgTV5wIFxmJCBzaW1wbHkgZXZhbHVhdGVzIGludG8gXGYkIFxleHAocCBcbG9nKE0pKSBcZiQuCitUaGVyZWZvcmUsIHRoZSBtYXRyaXggXGYkIE0gXGYkIHNob3VsZCBtZWV0IHRoZSBjb25kaXRpb25zIHRvIGJlIGFuCithcmd1bWVudCBvZiBtYXRyaXggbG9nYXJpdGhtLgorCitJZiBccCBwIGlzIHJlYWwsIGl0IGlzIGNhc3RlZCBpbnRvIHRoZSByZWFsIHNjYWxhciB0eXBlIG9mIFxwIE0uIFRoZW4KK3RoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIG1hdHJpeCBwb3dlciB1c2luZyB0aGUgU2NodXItUGFkJmVhY3V0ZTsKK2FsZ29yaXRobSBhcyBpbXBsZW1lbnRlZCBieSBjbGFzcyBNYXRyaXhQb3dlci4gVGhlIGV4cG9uZW50IGlzIHNwbGl0CitpbnRvIGludGVncmFsIHBhcnQgYW5kIGZyYWN0aW9uYWwgcGFydCwgd2hlcmUgdGhlIGZyYWN0aW9uYWwgcGFydCBpcworaW4gdGhlIGludGVydmFsIFxmJCAoLTEsIDEpIFxmJC4gVGhlIG1haW4gZGlhZ29uYWwgYW5kIHRoZSBmaXJzdAorc3VwZXItZGlhZ29uYWwgaXMgZGlyZWN0bHkgY29tcHV0ZWQuCisKK0lmIFxwIE0gaXMgc2luZ3VsYXIgd2l0aCBhIHNlbWlzaW1wbGUgemVybyBlaWdlbnZhbHVlIGFuZCBccCBwIGlzCitwb3NpdGl2ZSwgdGhlIFNjaHVyIGZhY3RvciBcZiQgVCBcZiQgaXMgcmVvcmRlcmVkIHdpdGggR2l2ZW5zCityb3RhdGlvbnMsIGkuZS4KKworXGZbIFQgPSBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY30KKyAgICAgIFRfMSAmIFRfMiBcXAorICAgICAgMCAgICYgMAorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0gXGZdCisKK3doZXJlIFxmJCBUXzEgXGYkIGlzIGludmVydGlibGUuIFRoZW4gXGYkIFRecCBcZiQgaXMgZ2l2ZW4gYnkKKworXGZbIFRecCA9IFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjfQorICAgICAgVF8xXnAgJiBUXzFeey0xfSBUXzFecCBUXzIgXFwKKyAgICAgIDAgICAgICYgMAorICAgIFxlbmR7YXJyYXl9LiBccmlnaHRdIFxmXQorCitcd2FybmluZyBGcmFjdGlvbmFsIHBvd2VyIG9mIGEgbWF0cml4IHdpdGggYSBub24tc2VtaXNpbXBsZSB6ZXJvCitlaWdlbnZhbHVlIGlzIG5vdCB3ZWxsLWRlZmluZWQuIFdlIGludHJvZHVjZSBhbiBhc3NlcnRpb24gZmFpbHVyZQorYWdhaW5zdCBpbmFjY3VyYXRlIHJlc3VsdCwgZS5nLiBcY29kZQorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4NGQgQTsKKyAgQSA8PCAwLCAwLCAyLCAzLAorICAgICAgIDAsIDAsIDQsIDUsCisgICAgICAgMCwgMCwgNiwgNywKKyAgICAgICAwLCAwLCA4LCA5OworICBzdGQ6OmNvdXQgPDwgQS5wb3coMC4zNykgPDwgc3RkOjplbmRsOworICAKKyAgLy8gVGhlIDEgbWFrZXMgZWlnZW52YWx1ZSAwIG5vbi1zZW1pc2ltcGxlLgorICBBLmNvZWZmUmVmKDAsIDEpID0gMTsKKworICAvLyBUaGlzIGZhaWxzIGlmIEVJR0VOX05PX0RFQlVHIGlzIHVuZGVmaW5lZC4KKyAgc3RkOjpjb3V0IDw8IEEucG93KDAuMzcpIDw8IHN0ZDo6ZW5kbDsKKworICByZXR1cm4gMDsKK30KK1xlbmRjb2RlCisKK0RldGFpbHMgb2YgdGhlIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW46IE5pY2hvbGFzIEouIEhpZ2hhbSBhbmQKK0xpamluZyBMaW4sICJBIFNjaHVyLVBhZCZlYWN1dGU7IGFsZ29yaXRobSBmb3IgZnJhY3Rpb25hbCBwb3dlcnMgb2YgYQorbWF0cml4LCIgPGVtPlNJQU0gSi4gJU1hdHJpeCBBbmFsLiBBcHBsaWMuPC9lbT4sCis8Yj4zMigzKTwvYj46MTA1NiZuZGFzaDsxMDc4LCAyMDExLgorCitFeGFtcGxlOiBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2hlY2tzIHRoYXQKK1xmWyBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY2N9CisgICAgICBcY29zMSAmIC1cc2luMSAmIDAgXFwKKyAgICAgIFxzaW4xICYgXGNvczEgJiAwIFxcCisgICAgICAwICYgMCAmIDEKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdXntcZnJhYzE0XHBpfSA9IFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjY30KKyAgICAgIFxmcmFjMTJcc3FydDIgJiAtXGZyYWMxMlxzcXJ0MiAmIDAgXFwKKyAgICAgIFxmcmFjMTJcc3FydDIgJiBcZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgMCAmIDAgJiAxCisgICAgXGVuZHthcnJheX0gXHJpZ2h0XS4gXGZdCitUaGlzIGNvcnJlc3BvbmRzIHRvIFxmJCBcZnJhYzE0XHBpIFxmJCByb3RhdGlvbnMgb2YgMSByYWRpYW4gYXJvdW5kCit0aGUgei1heGlzLgorCitcaW5jbHVkZSBNYXRyaXhQb3dlci5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeFBvd2VyLm91dAorCitNYXRyaXhCYXNlOjpwb3coKSBpcyB1c2VyLWZyaWVuZGx5LiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZQorY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB5b3Ugc2hvdWxkIHVzZSBjbGFzcyBNYXRyaXhQb3dlciBkaXJlY3RseS4KK01hdHJpeFBvd2VyIGNhbiBzYXZlIHRoZSByZXN1bHQgb2YgU2NodXIgZGVjb21wb3NpdGlvbiwgc28gaXQncworYmV0dGVyIGZvciBjb21wdXRpbmcgdmFyaW91cyBwb3dlcnMgZm9yIHRoZSBzYW1lIG1hdHJpeC4KKworRXhhbXBsZToKK1xpbmNsdWRlIE1hdHJpeFBvd2VyX29wdGltYWwuY3BwCitPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhQb3dlcl9vcHRpbWFsLm91dAorCitcbm90ZSBccCBNIGhhcyB0byBiZSBhIG1hdHJpeCBvZiBcYyBmbG9hdCwgXGMgZG91YmxlLCA8dHQ+bG9uZworZG91YmxlPC90dD4sIFxjIGNvbXBsZXg8ZmxvYXQ+LCBcYyBjb21wbGV4PGRvdWJsZT4sIG9yIFxjIGNvbXBsZXg8bG9uZworZG91YmxlPiAuCisKK1xzYSBNYXRyaXhCYXNlOjpleHAoKSwgTWF0cml4QmFzZTo6bG9nKCksIGNsYXNzIE1hdHJpeFBvd2VyLgorCisKK1xzdWJzZWN0aW9uIG1hdHJpeGJhc2VfbWF0cml4ZnVuY3Rpb24gTWF0cml4QmFzZTo6bWF0cml4RnVuY3Rpb24oKQorCitDb21wdXRlIGEgbWF0cml4IGZ1bmN0aW9uLgorCitcY29kZQorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjptYXRyaXhGdW5jdGlvbih0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+Ojp0eXBlIGYpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBhcmd1bWVudCBvZiBtYXRyaXggZnVuY3Rpb24sIHNob3VsZCBiZSBhIHNxdWFyZSBtYXRyaXguCitccGFyYW1baW5dICBmICBhbiBlbnRpcmUgZnVuY3Rpb247IFxjIGYoeCxuKSBzaG91bGQgY29tcHV0ZSB0aGUgbi10aAorZGVyaXZhdGl2ZSBvZiBmIGF0IHguCitccmV0dXJucyAgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgXHAgZiBhcHBsaWVkIHRvIFxwIE0uCisKK1N1cHBvc2UgdGhhdCBccCBNIGlzIGEgbWF0cml4IHdob3NlIGVudHJpZXMgaGF2ZSB0eXBlIFxjIFNjYWxhci4gCitUaGVuLCB0aGUgc2Vjb25kIGFyZ3VtZW50LCBccCBmLCBzaG91bGQgYmUgYSBmdW5jdGlvbiB3aXRoIHByb3RvdHlwZQorXGNvZGUgCitDb21wbGV4U2NhbGFyIGYoQ29tcGxleFNjYWxhciwgaW50KSAKK1xlbmRjb2RlCit3aGVyZSBcYyBDb21wbGV4U2NhbGFyID0gXGMgc3RkOjpjb21wbGV4PFNjYWxhcj4gaWYgXGMgU2NhbGFyIGlzCityZWFsIChlLmcuLCBcYyBmbG9hdCBvciBcYyBkb3VibGUpIGFuZCBcYyBDb21wbGV4U2NhbGFyID0KK1xjIFNjYWxhciBpZiBcYyBTY2FsYXIgaXMgY29tcGxleC4gVGhlIHJldHVybiB2YWx1ZSBvZiBcYyBmKHgsbikKK3Nob3VsZCBiZSBcZiQgZl57KG4pfSh4KSBcZiQsIHRoZSBuLXRoIGRlcml2YXRpdmUgb2YgZiBhdCB4LgorCitUaGlzIHJvdXRpbmUgdXNlcyB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbjoKK1BoaWxpcCBEYXZpZXMgYW5kIE5pY2hvbGFzIEouIEhpZ2hhbSwgCisiQSBTY2h1ci1QYXJsZXR0IGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIG1hdHJpeCBmdW5jdGlvbnMiLCAKKzxlbT5TSUFNIEouICVNYXRyaXggQW5hbC4gQXBwbGljLjwvZW0+LCA8Yj4yNTwvYj46NDY0Jm5kYXNoOzQ4NSwgMjAwMy4KKworVGhlIGFjdHVhbCB3b3JrIGlzIGRvbmUgYnkgdGhlIE1hdHJpeEZ1bmN0aW9uIGNsYXNzLgorCitFeGFtcGxlOiBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2hlY2tzIHRoYXQKK1xmWyBcZXhwIFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjY30gCisgICAgICAwICYgXGZyYWMxNFxwaSAmIDAgXFwgCisgICAgICAtXGZyYWMxNFxwaSAmIDAgJiAwIFxcCisgICAgICAwICYgMCAmIDAgCisgICAgXGVuZHthcnJheX0gXHJpZ2h0XSA9IFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjY30KKyAgICAgIFxmcmFjMTJcc3FydDIgJiAtXGZyYWMxMlxzcXJ0MiAmIDAgXFwKKyAgICAgIFxmcmFjMTJcc3FydDIgJiBcZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgMCAmIDAgJiAxCisgICAgXGVuZHthcnJheX0gXHJpZ2h0XS4gXGZdCitUaGlzIGNvcnJlc3BvbmRzIHRvIGEgcm90YXRpb24gb2YgXGYkIFxmcmFjMTRccGkgXGYkIHJhZGlhbnMgYXJvdW5kCit0aGUgei1heGlzLiBUaGlzIGlzIHRoZSBzYW1lIGV4YW1wbGUgYXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbgorb2YgXHJlZiBtYXRyaXhiYXNlX2V4cCAiZXhwKCkiLgorCitcaW5jbHVkZSBNYXRyaXhGdW5jdGlvbi5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEZ1bmN0aW9uLm91dAorCitOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIFxjIGV4cGZuIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyAKK1xjIHgsIGV2ZW4gdGhvdWdoIHRoZSBtYXRyaXggXGMgQSBpcyBvdmVyIHRoZSByZWFscy4gSW5zdGVhZCBvZgorXGMgZXhwZm4sIHdlIGNvdWxkIGFsc28gaGF2ZSB1c2VkIFN0ZFN0ZW1GdW5jdGlvbnM6OmV4cDoKK1xjb2RlCitBLm1hdHJpeEZ1bmN0aW9uKFN0ZFN0ZW1GdW5jdGlvbnM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6ZXhwLCAmQik7CitcZW5kY29kZQorCisKKworXHN1YnNlY3Rpb24gbWF0cml4YmFzZV9zaW4gTWF0cml4QmFzZTo6c2luKCkKKworQ29tcHV0ZSB0aGUgbWF0cml4IHNpbmUuCisKK1xjb2RlCitjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNpbigpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBhIHNxdWFyZSBtYXRyaXguCitccmV0dXJucyAgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgXGYkIFxzaW4oTSkgXGYkLgorCitUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBtYXRyaXggc2luZS4gVXNlIEFycmF5QmFzZTo6c2luKCkgZm9yIGNvbXB1dGluZyB0aGUgZW50cnktd2lzZSBzaW5lLgorCitUaGUgaW1wbGVtZW50YXRpb24gY2FsbHMgXHJlZiBtYXRyaXhiYXNlX21hdHJpeGZ1bmN0aW9uICJtYXRyaXhGdW5jdGlvbigpIiB3aXRoIFN0ZFN0ZW1GdW5jdGlvbnM6OnNpbigpLgorCitFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhTaW5lLmNwcAorT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4U2luZS5vdXQKKworCisKK1xzdWJzZWN0aW9uIG1hdHJpeGJhc2Vfc2luaCBNYXRyaXhCYXNlOjpzaW5oKCkKKworQ29tcHV0ZSB0aGUgbWF0cml4IGh5cGVyYm9saWMgc2luZS4KKworXGNvZGUKK01hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6c2luaCgpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBhIHNxdWFyZSBtYXRyaXguCitccmV0dXJucyAgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgXGYkIFxzaW5oKE0pIFxmJAorCitUaGlzIGZ1bmN0aW9uIGNhbGxzIFxyZWYgbWF0cml4YmFzZV9tYXRyaXhmdW5jdGlvbiAibWF0cml4RnVuY3Rpb24oKSIgd2l0aCBTdGRTdGVtRnVuY3Rpb25zOjpzaW5oKCkuCisKK0V4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeFNpbmguY3BwCitPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhTaW5oLm91dAorCisKK1xzdWJzZWN0aW9uIG1hdHJpeGJhc2Vfc3FydCBNYXRyaXhCYXNlOjpzcXJ0KCkKKworQ29tcHV0ZSB0aGUgbWF0cml4IHNxdWFyZSByb290LgorCitcY29kZQorY29uc3QgTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNxcnQoKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgaW52ZXJ0aWJsZSBtYXRyaXggd2hvc2Ugc3F1YXJlIHJvb3QgaXMgdG8gYmUgY29tcHV0ZWQuCitccmV0dXJucyAgICBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbWF0cml4IHNxdWFyZSByb290IG9mIFxwIE0uCisKK1RoZSBtYXRyaXggc3F1YXJlIHJvb3Qgb2YgXGYkIE0gXGYkIGlzIHRoZSBtYXRyaXggXGYkIE1eezEvMn0gXGYkCit3aG9zZSBzcXVhcmUgaXMgdGhlIG9yaWdpbmFsIG1hdHJpeDsgc28gaWYgXGYkIFMgPSBNXnsxLzJ9IFxmJCB0aGVuCitcZiQgU14yID0gTSBcZiQuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGFraW5nIHRoZSBzcXVhcmUgcm9vdCBvZiBhbGwKK3RoZSBlbnRyaWVzIGluIHRoZSBtYXRyaXg7IHVzZSBBcnJheUJhc2U6OnNxcnQoKSBpZiB5b3Ugd2FudCB0byBkbyB0aGUKK2xhdHRlci4KKworSW4gdGhlIDxiPnJlYWwgY2FzZTwvYj4sIHRoZSBtYXRyaXggXGYkIE0gXGYkIHNob3VsZCBiZSBpbnZlcnRpYmxlIGFuZAoraXQgc2hvdWxkIGhhdmUgbm8gZWlnZW52YWx1ZXMgd2hpY2ggYXJlIHJlYWwgYW5kIG5lZ2F0aXZlIChwYWlycyBvZgorY29tcGxleCBjb25qdWdhdGUgZWlnZW52YWx1ZXMgYXJlIGFsbG93ZWQpLiBJbiB0aGF0IGNhc2UsIHRoZSBtYXRyaXgKK2hhcyBhIHNxdWFyZSByb290IHdoaWNoIGlzIGFsc28gcmVhbCwgYW5kIHRoaXMgaXMgdGhlIHNxdWFyZSByb290Citjb21wdXRlZCBieSB0aGlzIGZ1bmN0aW9uLiAKKworVGhlIG1hdHJpeCBzcXVhcmUgcm9vdCBpcyBjb21wdXRlZCBieSBmaXJzdCByZWR1Y2luZyB0aGUgbWF0cml4IHRvCitxdWFzaS10cmlhbmd1bGFyIGZvcm0gd2l0aCB0aGUgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uLiBUaGUgc3F1YXJlCityb290IG9mIHRoZSBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCBjYW4gdGhlbiBiZSBjb21wdXRlZCBkaXJlY3RseS4gVGhlCitjb3N0IGlzIGFwcHJveGltYXRlbHkgXGYkIDI1IG5eMyBcZiQgcmVhbCBmbG9wcyBmb3IgdGhlIHJlYWwgU2NodXIKK2RlY29tcG9zaXRpb24gYW5kIFxmJCAzXGZyYWMxMyBuXjMgXGYkIHJlYWwgZmxvcHMgZm9yIHRoZSByZW1haW5kZXIKKyh0aG91Z2ggdGhlIGNvbXB1dGF0aW9uIHRpbWUgaW4gcHJhY3RpY2UgaXMgbGlrZWx5IG1vcmUgdGhhbiB0aGlzCitpbmRpY2F0ZXMpLgorCitEZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0gY2FuIGJlIGZvdW5kIGluOiBOaWNob2xhcyBKLiBIaWdoYW4sCisiQ29tcHV0aW5nIHJlYWwgc3F1YXJlIHJvb3RzIG9mIGEgcmVhbCBtYXRyaXgiLCA8ZW0+TGluZWFyIEFsZ2VicmEKK0FwcGwuPC9lbT4sIDg4Lzg5OjQwNSZuZGFzaDs0MzAsIDE5ODcuCisKK0lmIHRoZSBtYXRyaXggaXMgPGI+cG9zaXRpdmUtZGVmaW5pdGUgc3ltbWV0cmljPC9iPiwgdGhlbiB0aGUgc3F1YXJlCityb290IGlzIGFsc28gcG9zaXRpdmUtZGVmaW5pdGUgc3ltbWV0cmljLiBJbiB0aGlzIGNhc2UsIGl0IGlzIGJlc3QgdG8KK3VzZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyOjpvcGVyYXRvclNxcnQoKSB0byBjb21wdXRlIGl0LgorCitJbiB0aGUgPGI+Y29tcGxleCBjYXNlPC9iPiwgdGhlIG1hdHJpeCBcZiQgTSBcZiQgc2hvdWxkIGJlIGludmVydGlibGU7Cit0aGlzIGlzIGEgcmVzdHJpY3Rpb24gb2YgdGhlIGFsZ29yaXRobS4gVGhlIHNxdWFyZSByb290IGNvbXB1dGVkIGJ5Cit0aGlzIGFsZ29yaXRobSBpcyB0aGUgb25lIHdob3NlIGVpZ2VudmFsdWVzIGhhdmUgYW4gYXJndW1lbnQgaW4gdGhlCitpbnRlcnZhbCBcZiQgKC1cZnJhYzEyXHBpLCBcZnJhYzEyXHBpXSBcZiQuIFRoaXMgaXMgdGhlIHVzdWFsIGJyYW5jaAorY3V0LgorCitUaGUgY29tcHV0YXRpb24gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHJlYWwgY2FzZSwgZXhjZXB0IHRoYXQgdGhlCitjb21wbGV4IFNjaHVyIGRlY29tcG9zaXRpb24gaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1hdHJpeCB0byBhCit0cmlhbmd1bGFyIG1hdHJpeC4gVGhlIHRoZW9yZXRpY2FsIGNvc3QgaXMgdGhlIHNhbWUuIERldGFpbHMgYXJlIGluOgorJkFyaW5nO2tlIEJqJm91bWw7cmNrIGFuZCBTdmVuIEhhbW1hcmxpbmcsICJBIFNjaHVyIG1ldGhvZCBmb3IgdGhlCitzcXVhcmUgcm9vdCBvZiBhIG1hdHJpeCIsIDxlbT5MaW5lYXIgQWxnZWJyYSBBcHBsLjwvZW0+LAorNTIvNTM6MTI3Jm5kYXNoOzE0MCwgMTk4My4KKworRXhhbXBsZTogVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNoZWNrcyB0aGF0IHRoZSBzcXVhcmUgcm9vdCBvZgorXGZbIFxsZWZ0WyBcYmVnaW57YXJyYXl9e2NjfSAKKyAgICAgICAgICAgICAgXGNvcyhcZnJhYzEzXHBpKSAmIC1cc2luKFxmcmFjMTNccGkpIFxcCisgICAgICAgICAgICAgIFxzaW4oXGZyYWMxM1xwaSkgJiBcY29zKFxmcmFjMTNccGkpCisgICAgXGVuZHthcnJheX0gXHJpZ2h0XSwgXGZdCitjb3JyZXNwb25kaW5nIHRvIGEgcm90YXRpb24gb3ZlciA2MCBkZWdyZWVzLCBpcyBhIHJvdGF0aW9uIG92ZXIgMzAgZGVncmVlczoKK1xmWyBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY30gCisgICAgICAgICAgICAgIFxjb3MoXGZyYWMxNlxwaSkgJiAtXHNpbihcZnJhYzE2XHBpKSBcXAorICAgICAgICAgICAgICBcc2luKFxmcmFjMTZccGkpICYgXGNvcyhcZnJhYzE2XHBpKQorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0uIFxmXQorCitcaW5jbHVkZSBNYXRyaXhTcXVhcmVSb290LmNwcAorT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4U3F1YXJlUm9vdC5vdXQKKworXHNhIGNsYXNzIFJlYWxTY2h1ciwgY2xhc3MgQ29tcGxleFNjaHVyLCBjbGFzcyBNYXRyaXhTcXVhcmVSb290LAorICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI6Om9wZXJhdG9yU3FydCgpLgorCisqLworCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0ZVTkNUSU9OUworCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9Nb3JlVmVjdG9yaXphdGlvbiBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01vcmVWZWN0b3JpemF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGU3MjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9Nb3JlVmVjdG9yaXphdGlvbgpAQCAtMCwwICsxLDI0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTU9EVUxFX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorICAqIFxkZWZncm91cCBNb3JlVmVjdG9yaXphdGlvbiBNb3JlIHZlY3Rvcml6YXRpb24gbW9kdWxlCisgICovCisKK30KKworI2luY2x1ZGUgInNyYy9Nb3JlVmVjdG9yaXphdGlvbi9NYXRoRnVuY3Rpb25zLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9NT1JFVkVDVE9SSVpBVElPTl9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTm9uTGluZWFyT3B0aW1pemF0aW9uIGIvdW5zdXBwb3J0ZWQvRWlnZW4vTm9uTGluZWFyT3B0aW1pemF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGFiNGMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9Ob25MaW5lYXJPcHRpbWl6YXRpb24KQEAgLTAsMCArMSwxMzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBDYXByaWNlbGxpIDxvcnplbEBmcmVlaGFja2Vycy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05PTkxJTkVBUk9QVElNSVpBVElPTl9NT0RVTEUKKyNkZWZpbmUgRUlHRU5fTk9OTElORUFST1BUSU1JWkFUSU9OX01PRFVMRQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9KYWNvYmk+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTnVtZXJpY2FsRGlmZj4KKworLyoqCisgICogXGRlZmdyb3VwIE5vbkxpbmVhck9wdGltaXphdGlvbl9Nb2R1bGUgTm9uIGxpbmVhciBvcHRpbWl6YXRpb24gbW9kdWxlCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Ob25MaW5lYXJPcHRpbWl6YXRpb24+CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIHR3byBpbXBvcnRhbnQgYWxnb3JpdGhtcyBpbiBub24gbGluZWFyCisgICogb3B0aW1pemF0aW9uLiBJbiBib3RoIGNhc2VzLCB3ZSBjb25zaWRlciBhIHN5c3RlbSBvZiBub24gbGluZWFyIGZ1bmN0aW9ucy4gT2YKKyAgKiBjb3Vyc2UsIHRoaXMgc2hvdWxkIHdvcmssIGFuZCBldmVuIHdvcmsgdmVyeSB3ZWxsIGlmIHRob3NlIGZ1bmN0aW9ucyBhcmUKKyAgKiBhY3R1YWxseSBsaW5lYXIuIEJ1dCBpZiB0aGlzIGlzIHNvLCB5b3Ugc2hvdWxkIHByb2JhYmx5IGJldHRlciB1c2Ugb3RoZXIKKyAgKiBtZXRob2RzIG1vcmUgZml0dGVkIHRvIHRoaXMgc3BlY2lhbCBjYXNlLgorICAqCisgICogT25lIGFsZ29yaXRobSBhbGxvd3MgdG8gZmluZCBhbiBleHRyZW11bSBvZiBzdWNoIGEgc3lzdGVtIChMZXZlbmJlcmcKKyAgKiBNYXJxdWFyZHQgYWxnb3JpdGhtKSBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdXNlZCB0byBmaW5kIAorICAqIGEgemVybyBmb3IgdGhlIHN5c3RlbSAoUG93ZWxsIGh5YnJpZCAiZG9nbGVnIiBtZXRob2QpLgorICAqCisgICogVGhpcyBjb2RlIGlzIGEgcG9ydCBvZiBtaW5wYWNrIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JTlBBQ0spLgorICAqIE1pbnBhY2sgaXMgYSB2ZXJ5IGZhbW91cywgb2xkLCByb2J1c3QgYW5kIHdlbGwtcmVrbm93biBwYWNrYWdlLCB3cml0dGVuIGluIAorICAqIGZvcnRyYW4uIFRob3NlIGltcGxlbWVudGF0aW9ucyBoYXZlIGJlZW4gY2FyZWZ1bGx5IHR1bmVkLCB0ZXN0ZWQsIGFuZCB1c2VkCisgICogZm9yIHNldmVyYWwgZGVjYWRlcy4KKyAgKgorICAqIFRoZSBvcmlnaW5hbCBmb3J0cmFuIGNvZGUgd2FzIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCB1c2luZyBmMmMgKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRjJjKSBpbiBDLAorICAqIHRoZW4gYysrLCBhbmQgdGhlbiBjbGVhbmVkIGJ5IHNldmVyYWwgZGlmZmVyZW50IGF1dGhvcnMuCisgICogVGhlIGxhc3Qgb25lIG9mIHRob3NlIGNsZWFuaW5ncyBiZWluZyBvdXIgc3RhcnRpbmcgcG9pbnQgOiAKKyAgKiBodHRwOi8vZGV2ZXJuYXkuZnJlZS5mci9oYWNrcy9jbWlucGFjay5odG1sCisgICogCisgICogRmluYWxseSwgd2UgcG9ydGVkIHRoaXMgY29kZSB0byBFaWdlbiwgY3JlYXRpbmcgY2xhc3NlcyBhbmQgQVBJCisgICogY29oZXJlbnQgd2l0aCBFaWdlbi4gV2hlbiBwb3NzaWJsZSwgd2Ugc3dpdGNoZWQgdG8gRWlnZW4KKyAgKiBpbXBsZW1lbnRhdGlvbiwgc3VjaCBhcyBtb3N0IGxpbmVhciBhbGdlYnJhICh2ZWN0b3JzLCBtYXRyaWNlcywgc3RhYmxlIG5vcm1zKS4KKyAgKgorICAqIERvaW5nIHNvLCB3ZSB3ZXJlIHZlcnkgY2FyZWZ1bCB0byBjaGVjayB0aGUgdGVzdHMgd2Ugc2V0dXAgYXQgdGhlIHZlcnkKKyAgKiBiZWdpbm5pbmcsIHdoaWNoIGVuc3VyZSB0aGF0IHRoZSBzYW1lIHJlc3VsdHMgYXJlIGZvdW5kLgorICAqCisgICogXHNlY3Rpb24gVGVzdHMgVGVzdHMKKyAgKiAKKyAgKiBUaGUgdGVzdHMgYXJlIHBsYWNlZCBpbiB0aGUgZmlsZSB1bnN1cHBvcnRlZC90ZXN0L05vbkxpbmVhci5jcHAuCisgICogCisgICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiB0ZXN0cyA6IHRob3NlIHRoYXQgY29tZSBmcm9tIGV4YW1wbGVzIGJ1bmRsZWQgd2l0aCBjbWlucGFjay4KKyAgKiBUaGV5IGd1YXJhbnR5IHdlIGdldCB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSBvcmlnaW5hbCBhbGdvcml0aG1zICh2YWx1ZSBmb3IgJ3gnLAorICAqIGZvciB0aGUgbnVtYmVyIG9mIGV2YWx1YXRpb25zIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGZvciB0aGUgbnVtYmVyIG9mIGV2YWx1YXRpb25zCisgICogb2YgdGhlIGphY29iaWFuIGlmIGV2ZXIpLgorICAqIAorICAqIE90aGVyIHRlc3RzIHdlcmUgYWRkZWQgYnkgbXlzZWxmIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgCisgICogcHJvY2VzcyBhbmQgY2hlY2sgdGhlIHJlc3VsdHMgZm9yIGxldmVuYmVyZy1tYXJxdWFyZHQgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRhIAorICAqIG9uIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9ubHNfbWFpbi5zaHRtbC4gU2luY2UgdGhlbiBpJ3ZlIAorICAqIGNhcmVmdWxseSBjaGVja2VkIHRoYXQgdGhlIHNhbWUgcmVzdWx0cyB3ZXJlIG9idGFpbmVkIHdoZW4gbW9kaWZpeWluZyB0aGUgCisgICogY29kZS4gUGxlYXNlIG5vdGUgdGhhdCB3ZSBkbyBub3QgYWx3YXlzIGdldCB0aGUgZXhhY3Qgc2FtZSBkZWNpbWFscyBhcyB0aGV5IGRvLAorICAqIGJ1dCB0aGlzIGlzIG9rIDogdGhleSB1c2UgMTI4Yml0cyBmbG9hdCwgYW5kIHdlIGRvIHRoZSB0ZXN0cyB1c2luZyB0aGUgQyB0eXBlICdkb3VibGUnLAorICAqIHdoaWNoIGlzIDY0IGJpdHMgb24gbW9zdCBwbGF0Zm9ybXMgKHg4NiBhbmQgYW1kNjQsIGF0IGxlYXN0KS4KKyAgKiBJJ3ZlIHBlcmZvcm1lZCB0aG9zZSB0ZXN0cyBvbiBzZXZlcmFsIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiBsZXZlbmJlcmctbWFycXVhcmR0LCBhbmQKKyAgKiAoYyltaW5wYWNrIHBlcmZvcm1zIFZFUlkgd2VsbCBjb21wYXJlZCB0byB0aG9zZSwgYm90aCBpbiBhY2N1cmFjeSBhbmQgc3BlZWQuCisgICogCisgICogVGhlIGRvY3VtZW50YXRpb24gZm9yIHJ1bm5pbmcgdGhlIHRlc3RzIGlzIG9uIHRoZSB3aWtpCisgICogaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPVRlc3RzCisgICogCisgICogXHNlY3Rpb24gQVBJIEFQSSA6IG92ZXJ2aWV3IG9mIG1ldGhvZHMKKyAgKiAKKyAgKiBCb3RoIGFsZ29yaXRobXMgY2FuIHVzZSBlaXRoZXIgdGhlIGphY29iaWFuIChwcm92aWRlZCBieSB0aGUgdXNlcikgb3IgY29tcHV0ZSAKKyAgKiBhbiBhcHByb3hpbWF0aW9uIGJ5IHRoZW1zZWx2ZXMgKGFjdHVhbGx5IHVzaW5nIEVpZ2VuIFxyZWYgTnVtZXJpY2FsRGlmZl9Nb2R1bGUpLgorICAqIFRoZSBwYXJ0IG9mIEFQSSByZWZlcnJpbmcgdG8gdGhlIGxhdHRlciB1c2UgJ051bWVyaWNhbERpZmYnIGluIHRoZSBtZXRob2QgbmFtZXMKKyAgKiAoZXhlbXBsZTogTGV2ZW5iZXJnTWFycXVhcmR0Lm1pbmltaXplTnVtZXJpY2FsRGlmZigpICkgCisgICogCisgICogVGhlIG1ldGhvZHMgTGV2ZW5iZXJnTWFycXVhcmR0LmxtZGVyMSgpL2xtZGlmMSgpL2xtc3RyMSgpIGFuZCAKKyAgKiBIeWJyaWROb25MaW5lYXJTb2x2ZXIuaHlicmoxKCkvaHlicmQxKCkgYXJlIHNwZWNpZmljIG1ldGhvZHMgZnJvbSB0aGUgb3JpZ2luYWwgCisgICogbWlucGFjayBwYWNrYWdlIHRoYXQgeW91IHByb2JhYmx5IHNob3VsZCBOT1QgdXNlIHVudGlsIHlvdSBhcmUgcG9ydGluZyBhIGNvZGUgdGhhdAorICAqICB3YXMgcHJldmlvdXNseSB1c2luZyBtaW5wYWNrLiBUaGV5IGp1c3QgZGVmaW5lIGEgJ3NpbXBsZScgQVBJIHdpdGggZGVmYXVsdCB2YWx1ZXMgCisgICogZm9yIHNvbWUgcGFyYW1ldGVycy4KKyAgKiAKKyAgKiBBbGwgYWxnb3JpdGhtcyBhcmUgcHJvdmlkZWQgdXNpbmcgVHdvIEFQSXMgOgorICAqICAgICAtIG9uZSB3aGVyZSB0aGUgdXNlciBpbml0cyB0aGUgYWxnb3JpdGhtLCBhbmQgdXNlcyAnKk9uZVN0ZXAoKScgYXMgbXVjaCBhcyBoZSB3YW50cyA6IAorICAqIHRoaXMgd2F5IHRoZSBjYWxsZXIgaGF2ZSBjb250cm9sIG92ZXIgdGhlIHN0ZXBzCisgICogICAgIC0gb25lIHdoZXJlIHRoZSB1c2VyIGp1c3QgY2FsbHMgYSBtZXRob2QgKG9wdGltaXplKCkgb3Igc29sdmUoKSkgd2hpY2ggd2lsbCAKKyAgKiBoYW5kbGUgdGhlIGxvb3A6IGluaXQgKyBsb29wIHVudGlsIGEgc3RvcCBjb25kaXRpb24gaXMgbWV0LiBUaG9zZSBhcmUgcHJvdmlkZWQgZm9yCisgICogIGNvbnZlbmllbmNlLgorICAqIAorICAqIEFzIGFuIGV4YW1wbGUsIHRoZSBtZXRob2QgTGV2ZW5iZXJnTWFycXVhcmR0OjptaW5pbWl6ZSgpIGlzIAorICAqIGltcGxlbWVudGVkIGFzIGZvbGxvdyA6IAorICAqIFxjb2RlCisgICogU3RhdHVzIExldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZSxTY2FsYXI+OjptaW5pbWl6ZShGVmVjdG9yVHlwZSAgJngsIGNvbnN0IGludCBtb2RlKQorICAqIHsKKyAgKiAgICAgU3RhdHVzIHN0YXR1cyA9IG1pbmltaXplSW5pdCh4LCBtb2RlKTsKKyAgKiAgICAgZG8geworICAqICAgICAgICAgc3RhdHVzID0gbWluaW1pemVPbmVTdGVwKHgsIG1vZGUpOworICAqICAgICB9IHdoaWxlIChzdGF0dXM9PVJ1bm5pbmcpOworICAqICAgICByZXR1cm4gc3RhdHVzOworICAqIH0KKyAgKiBcZW5kY29kZQorICAqIAorICAqIFxzZWN0aW9uIGV4YW1wbGVzIEV4YW1wbGVzCisgICogCisgICogVGhlIGVhc2llc3Qgd2F5IHRvIHVuZGVyc3RhbmQgaG93IHRvIHVzZSB0aGlzIG1vZHVsZSBpcyBieSBsb29raW5nIGF0IHRoZSBtYW55IGV4YW1wbGVzIGluIHRoZSBmaWxlCisgICogdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwLgorICAqLworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3Fyc29sdi5oIgorI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjF1cGR0LmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yMW1weXEuaCIKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3J3dXBkdC5oIgorI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vZmRqYWMxLmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9sbXBhci5oIgorI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vZG9nbGVnLmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9jb3Zhci5oIgorCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9jaGtkZXIuaCIKKworI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL0h5YnJpZE5vbkxpbmVhclNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vTGV2ZW5iZXJnTWFycXVhcmR0LmgiCisKKworI2VuZGlmIC8vIEVJR0VOX05PTkxJTkVBUk9QVElNSVpBVElPTl9NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmYgYi91bnN1cHBvcnRlZC9FaWdlbi9OdW1lcmljYWxEaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzMzNGMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9OdW1lcmljYWxEaWZmCkBAIC0wLDAgKzEsNTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBDYXByaWNlbGxpIDxvcnplbEBmcmVlaGFja2Vycy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05VTUVSSUNBTERJRkZfTU9EVUxFCisjZGVmaW5lIEVJR0VOX05VTUVSSUNBTERJRkZfTU9EVUxFCisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCituYW1lc3BhY2UgRWlnZW4geworCisvKioKKyAgKiBcZGVmZ3JvdXAgTnVtZXJpY2FsRGlmZl9Nb2R1bGUgTnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbiBtb2R1bGUKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmY+CisgICogXGVuZGNvZGUKKyAgKgorICAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL051bWVyaWNhbF9kaWZmZXJlbnRpYXRpb24KKyAgKgorICAqIFdhcm5pbmcgOiB0aGlzIHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCBhdXRvbWF0aWMgZGlmZmVyZW50aWF0aW9uLCB3aGljaAorICAqIGlzIGEgZGlmZmVyZW50IG1ldGhvZCBhbmQgaGFzIGl0cyBvd24gbW9kdWxlIGluIEVpZ2VuIDogXHJlZgorICAqIEF1dG9EaWZmX01vZHVsZS4KKyAgKgorICAqIEN1cnJlbnRseSBvbmx5ICJGb3J3YXJkIiBhbmQgIkNlbnRyYWwiIHNjaGVtZXMgYXJlIGltcGxlbWVudGVkLiBUaG9zZQorICAqIGFyZSBiYXNpYyBtZXRob2RzLCBhbmQgdGhlcmUgZXhpc3Qgc29tZSBtb3JlIGVsYWJvcmF0ZWQgd2F5IG9mCisgICogY29tcHV0aW5nIHN1Y2ggYXBwcm94aW1hdGVzLiBUaGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBib3RoCisgICogcHJvcHJpZXRhcnkgYW5kIGZyZWUgc29mdHdhcmUsIGFuZCB1c3VhbGx5IHJlcXVpcmVzIGxpbmtpbmcgdG8gYW4KKyAgKiBleHRlcm5hbCBsaWJyYXJ5LiBJdCBpcyB2ZXJ5IGVhc3kgZm9yIHlvdSB0byB3cml0ZSBhIGZ1bmN0b3IKKyAgKiB1c2luZyBzdWNoIHNvZnR3YXJlLCBhbmQgdGhlIHB1cnBvc2UgaXMgcXVpdGUgb3J0aG9nb25hbCB0byB3aGF0IHdlCisgICogd2FudCB0byBhY2hpZXZlIHdpdGggRWlnZW4uCisgICoKKyAgKiBUaGlzIGlzIHdoeSB3ZSB3aWxsIG5vdCBwcm92aWRlIHdyYXBwZXJzIGZvciBldmVyeSBncmVhdCBudW1lcmljYWwKKyAgKiBkaWZmZXJlbnRpYXRpb24gc29mdHdhcmUgdGhhdCBleGlzdCwgYnV0IHNob3VsZCByYXRoZXIgc3RpY2sgd2l0aCB0aG9zZQorICAqIGJhc2ljIG9uZXMsIHRoYXQgc3RpbGwgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZy4KKyAgKgorICAqIEFsc28sIHRoZSBccmVmIE5vbkxpbmVhck9wdGltaXphdGlvbl9Nb2R1bGUgbmVlZHMgdGhpcyBpbiBvcmRlciB0bworICAqIHByb3ZpZGUgZnVsbCBmZWF0dXJlcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9yaWdpbmFsIChjKW1pbnBhY2sKKyAgKiBwYWNrYWdlLgorICAqCisgICovCit9CisKKy8vQHsKKworI2luY2x1ZGUgInNyYy9OdW1lcmljYWxEaWZmL051bWVyaWNhbERpZmYuaCIKKworLy9AfQorCisKKyNlbmRpZiAvLyBFSUdFTl9OVU1FUklDQUxESUZGX01PRFVMRQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vT3BlbkdMU3VwcG9ydCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL09wZW5HTFN1cHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL09wZW5HTFN1cHBvcnQKQEAgLTAsMCArMSwzMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9PUEVOR0xfTU9EVUxFCisjZGVmaW5lIEVJR0VOX09QRU5HTF9NT0RVTEUKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCisjaWYgZGVmaW5lZChfX0FQUExFX0NDX18pCisgICNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbHNlCisgICNpbmNsdWRlIDxHTC9nbC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorICAqIFxkZWZncm91cCBPcGVuR0xTVXBwb3J0X01vZHVsZSBPcGVuR0wgU3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhIGNvdXBsZSBvZiBPcGVuR0wgZnVuY3Rpb25zCisgICogd2hpY2ggc2ltcGxpZnkgdGhlIHdheSB0byBwYXNzIEVpZ2VuJ3Mgb2JqZWN0IHRvIG9wZW5HTC4KKyAgKiBIZXJlIGlzIGFuIGV4bWFwbGU6CisgICogCisgICogXGNvZGUKKyAgKiAvLyBZb3UgbmVlZCB0byBhZGQgcGF0aF90b19laWdlbi91bnN1cHBvcnRlZCB0byB5b3VyIGluY2x1ZGUgcGF0aC4KKyAgKiAjaW5jbHVkZSA8RWlnZW4vT3BlbkdMU3VwcG9ydD4KKyAgKiAvLyAuLi4KKyAgKiBWZWN0b3IzZiB4LCB5OworICAqIE1hdHJpeDNmIHJvdDsKKyAgKiAKKyAgKiBnbFZlcnRleCh5ICsgeCAqIHJvdCk7CisgICogCisgICogUXVhdGVybmlvbiBxOworICAqIGdsUm90YXRlKHEpOworICAqIAorICAqIC8vIC4uLgorICAqIFxlbmRjb2RlCisgICoKKyAgKi8KKy8vQHsKKworI2RlZmluZSBFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgUm93cyA9IFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBDb2xzID0gWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBJc0dMQ29tcGF0aWJsZSA9IGJvb2woaW50ZXJuYWw6OmV2YWx1YXRvcjxYcHJUeXBlPjo6RmxhZ3MmTGluZWFyQWNjZXNzQml0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBib29sKFhwclR5cGU6OkZsYWdzJkRpcmVjdEFjY2Vzc0JpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChYcHJUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgfHwgKFhwclR5cGU6OkZsYWdzJlJvd01ham9yQml0KT09MCk+ICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpPFhwclR5cGUsU2NhbGFyLFJvd3MsQ29scyxmYWxzZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBYcHJUeXBlJiBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTx0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8WHByVHlwZT46OnR5cGU+OjpydW4ocCk7IH0gICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gaW5saW5lIHZvaWQgRlVOQyhjb25zdCBFaWdlbjo6RGVuc2VCYXNlPERlcml2ZWQ+JiBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChFSUdFTl9DQVQoaW50ZXJuYWw6OmdsXyxGVU5DKSxfaW1wbCk8RGVyaXZlZD46OnJ1bihwLmRlcml2ZWQoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIEVJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKEZVTkMsU0NBTEFSLFJPV1MsQ09MUyxTVUZGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTxYcHJUeXBlLCBTQ0FMQVIsIFJPV1MsIENPTFMsIHRydWU+IHsgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBYcHJUeXBlJiBwKSB7IEZVTkMjI1NVRkZJWChwLmRhdGEoKSk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisgIAorI2RlZmluZSBFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhGVU5DLFNDQUxBUixTSVpFLFNVRkZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCBTSVpFLCAxLCB0cnVlPiB7ICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oY29uc3QgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgocC5kYXRhKCkpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCAxLCBTSVpFLCB0cnVlPiB7ICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oY29uc3QgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgocC5kYXRhKCkpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworICAKK0VJR0VOX0dMX0ZVTkNfREVDTEFSQVRJT04gICAgICAgKGdsVmVydGV4KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsaW50LCAgICAyLDJpdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LHNob3J0LCAgMiwyc3YpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsZG91YmxlLCAyLDJkdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGludCwgICAgMywzaXYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGRvdWJsZSwgMywzZHYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsc2hvcnQsICA0LDRzdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGZsb2F0LCAgNCw0ZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbFRleENvb3JkKQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDIsMml2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDIsMnN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDMsM2l2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDMsM2Z2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDMsM2R2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDQsNHN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDQsNGZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbENvbG9yKQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDIsMml2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDIsMnN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDMsM2l2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDMsM2Z2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDMsM2R2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDQsNHN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDQsNGZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbE5vcm1hbCkKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsTm9ybWFsLGludCwgICAgMywzaXYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbE5vcm1hbCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xOb3JtYWwsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsTm9ybWFsLGRvdWJsZSwgMywzZHYpCisKK2lubGluZSB2b2lkIGdsU2NhbGUyZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsU2NhbGVmKHZbMF0sIHZbMV0sIDEuZik7ICB9CitpbmxpbmUgdm9pZCBnbFNjYWxlMmR2KGNvbnN0IGRvdWJsZSogdikgeyBnbFNjYWxlZCh2WzBdLCB2WzFdLCAxLjApOyAgfQoraW5saW5lIHZvaWQgZ2xTY2FsZTNmdihjb25zdCBmbG9hdCogIHYpIHsgZ2xTY2FsZWYodlswXSwgdlsxXSwgdlsyXSk7IH0KK2lubGluZSB2b2lkIGdsU2NhbGUzZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsU2NhbGVkKHZbMF0sIHZbMV0sIHZbMl0pOyB9CisKK0VJR0VOX0dMX0ZVTkNfREVDTEFSQVRJT04gICAgICAgKGdsU2NhbGUpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGZsb2F0LCAgMiwyZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGRvdWJsZSwgMiwyZHYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGZsb2F0LCAgMywzZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGRvdWJsZSwgMywzZHYpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbFNjYWxlKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpICB7IGdsU2NhbGUoTWF0cml4PFNjYWxhciwzLDE+OjpDb25zdGFudChzLmZhY3RvcigpKSk7IH0KKworaW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUyZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsVHJhbnNsYXRlZih2WzBdLCB2WzFdLCAwLmYpOyAgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUyZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsVHJhbnNsYXRlZCh2WzBdLCB2WzFdLCAwLjApOyAgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUzZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsVHJhbnNsYXRlZih2WzBdLCB2WzFdLCB2WzJdKTsgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUzZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsVHJhbnNsYXRlZCh2WzBdLCB2WzFdLCB2WzJdKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbFRyYW5zbGF0ZSkKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVHJhbnNsYXRlLGZsb2F0LCAgMiwyZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFRyYW5zbGF0ZSxkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUcmFuc2xhdGUsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVHJhbnNsYXRlLGRvdWJsZSwgMywzZHYpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbFRyYW5zbGF0ZShjb25zdCBUcmFuc2xhdGlvbjxTY2FsYXIsMj4mIHQpICB7IGdsVHJhbnNsYXRlKHQudmVjdG9yKCkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xUcmFuc2xhdGUoY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLDM+JiB0KSAgeyBnbFRyYW5zbGF0ZSh0LnZlY3RvcigpKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbE11bHRNYXRyaXgpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX01BVChnbE11bHRNYXRyaXgsZmxvYXQsICA0LDQsZikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKGdsTXVsdE1hdHJpeCxkb3VibGUsIDQsNCxkKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xNdWx0TWF0cml4KGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+JiB0KSAgICAgICAgeyBnbE11bHRNYXRyaXgodC5tYXRyaXgoKSk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbE11bHRNYXRyaXgoY29uc3QgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+JiB0KSAgICB7IGdsTXVsdE1hdHJpeCh0Lm1hdHJpeCgpKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGdsTXVsdE1hdHJpeChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lQ29tcGFjdD4mIHQpIHsgZ2xNdWx0TWF0cml4KFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+KHQpLm1hdHJpeCgpKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbExvYWRNYXRyaXgpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX01BVChnbExvYWRNYXRyaXgsZmxvYXQsICA0LDQsZikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKGdsTG9hZE1hdHJpeCxkb3VibGUsIDQsNCxkKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xMb2FkTWF0cml4KGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+JiB0KSAgICAgICAgeyBnbExvYWRNYXRyaXgodC5tYXRyaXgoKSk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbExvYWRNYXRyaXgoY29uc3QgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+JiB0KSAgICB7IGdsTG9hZE1hdHJpeCh0Lm1hdHJpeCgpKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGdsTG9hZE1hdHJpeChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lQ29tcGFjdD4mIHQpIHsgZ2xMb2FkTWF0cml4KFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+KHQpLm1hdHJpeCgpKTsgfQorCitpbmxpbmUgdm9pZCBnbFJvdGF0ZShjb25zdCBSb3RhdGlvbjJEPGZsb2F0PiYgcm90KQoreworICBnbFJvdGF0ZWYocm90LmFuZ2xlKCkqMTgwLmYvZmxvYXQoRUlHRU5fUEkpLCAwLmYsIDAuZiwgMS5mKTsKK30KK2lubGluZSB2b2lkIGdsUm90YXRlKGNvbnN0IFJvdGF0aW9uMkQ8ZG91YmxlPiYgcm90KQoreworICBnbFJvdGF0ZWQocm90LmFuZ2xlKCkqMTgwLjAvRUlHRU5fUEksIDAuMCwgMC4wLCAxLjApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiB2b2lkIGdsUm90YXRlKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLDM+JiByb3QpCit7ICAKKyAgVHJhbnNmb3JtPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciwzLFByb2plY3RpdmU+IHRyKHJvdCk7CisgIGdsTXVsdE1hdHJpeCh0ci5tYXRyaXgoKSk7Cit9CisKKyNkZWZpbmUgRUlHRU5fR0xfTUFLRV9DT05TVF9jb25zdCBjb25zdAorI2RlZmluZSBFSUdFTl9HTF9NQUtFX0NPTlNUX18gCisjZGVmaW5lIEVJR0VOX0dMX0VWQUwoWCkgWAorCisjZGVmaW5lIEVJR0VOX0dMX0ZVTkMxX0RFQ0xBUkFUSU9OKEZVTkMsQVJHMSxDT05TVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0eXBlbmFtZSBTY2FsYXIgPSB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBSb3dzID0gWHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IENvbHMgPSBYcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIElzR0xDb21wYXRpYmxlID0gYm9vbChpbnRlcm5hbDo6ZXZhbHVhdG9yPFhwclR5cGU+OjpGbGFncyZMaW5lYXJBY2Nlc3NCaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJvb2woWHByVHlwZTo6RmxhZ3MmRGlyZWN0QWNjZXNzQml0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFhwclR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSB8fCAoWHByVHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKT4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSxTY2FsYXIsUm93cyxDb2xzLGZhbHNlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgcnVuKEFSRzEgYSxFSUdFTl9HTF9FVkFMKEVJR0VOX0dMX01BS0VfQ09OU1RfIyNDT05TVCkgWHByVHlwZSYgcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpPHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxYcHJUeXBlPjo6dHlwZT46OnJ1bihhLHApOyB9ICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBpbmxpbmUgdm9pZCBGVU5DKEFSRzEgYSxFSUdFTl9HTF9FVkFMKEVJR0VOX0dMX01BS0VfQ09OU1RfIyNDT05TVCkgRWlnZW46OkRlbnNlQmFzZTxEZXJpdmVkPiYgcCkgeyAgIFwKKyAgRUlHRU5fQ0FUKEVJR0VOX0NBVChpbnRlcm5hbDo6Z2xfLEZVTkMpLF9pbXBsKTxEZXJpdmVkPjo6cnVuKGEscC5kZXJpdmVkKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKEZVTkMsQVJHMSxDT05TVCxTQ0FMQVIsUk9XUyxDT0xTLFNVRkZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZXNwYWNlIGludGVybmFsIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPCB0eXBlbmFtZSBYcHJUeXBlPiBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpPFhwclR5cGUsIFNDQUxBUiwgUk9XUywgQ09MUywgdHJ1ZT4geyAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgcnVuKEFSRzEgYSwgRUlHRU5fR0xfRVZBTChFSUdFTl9HTF9NQUtFX0NPTlNUXyMjQ09OU1QpIFhwclR5cGUmIHApIHsgRlVOQyMjU1VGRklYKGEscC5kYXRhKCkpOyB9ICAgICAgICAgXAorICB9OyBcCit9CisKKyAgCisjZGVmaW5lIEVJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhGVU5DLEFSRzEsQ09OU1QsU0NBTEFSLFNJWkUsU1VGRklYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTxYcHJUeXBlLCBTQ0FMQVIsIFNJWkUsIDEsIHRydWU+IHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihBUkcxIGEsIEVJR0VOX0dMX0VWQUwoRUlHRU5fR0xfTUFLRV9DT05TVF8jI0NPTlNUKSBYcHJUeXBlJiBwKSB7IEZVTkMjI1NVRkZJWChhLHAuZGF0YSgpKTsgfSAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTxYcHJUeXBlLCBTQ0FMQVIsIDEsIFNJWkUsIHRydWU+IHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihBUkcxIGEsIEVJR0VOX0dMX0VWQUwoRUlHRU5fR0xfTUFLRV9DT05TVF8jI0NPTlNUKSBYcHJUeXBlJiBwKSB7IEZVTkMjI1NVRkZJWChhLHAuZGF0YSgpKTsgfSAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitFSUdFTl9HTF9GVU5DMV9ERUNMQVJBVElPTiAgICAgICAoZ2xHZXQsR0xlbnVtLF8pCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xHZXQsR0xlbnVtLF8sZmxvYXQsICA0LDQsRmxvYXR2KQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsR2V0LEdMZW51bSxfLGRvdWJsZSwgNCw0LERvdWJsZXYpCisKKy8vIGdsVW5pZm9ybSBBUEkKKworI2lmZGVmIEdMX1ZFUlNJT05fMl8wCisKK2lubGluZSB2b2lkIGdsVW5pZm9ybTJmdl9laSAgKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm0yZnYobG9jLDEsdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybTJpdl9laSAgKEdMaW50IGxvYywgY29uc3QgaW50KiB2KSAgICAgICAgICAgeyBnbFVuaWZvcm0yaXYobG9jLDEsdik7IH0KKworaW5saW5lIHZvaWQgZ2xVbmlmb3JtM2Z2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybTNmdihsb2MsMSx2KTsgfQoraW5saW5lIHZvaWQgZ2xVbmlmb3JtM2l2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBpbnQqIHYpICAgICAgICAgICB7IGdsVW5pZm9ybTNpdihsb2MsMSx2KTsgfQorCitpbmxpbmUgdm9pZCBnbFVuaWZvcm00ZnZfZWkgIChHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtNGZ2KGxvYywxLHYpOyB9CitpbmxpbmUgdm9pZCBnbFVuaWZvcm00aXZfZWkgIChHTGludCBsb2MsIGNvbnN0IGludCogdikgICAgICAgICAgIHsgZ2xVbmlmb3JtNGl2KGxvYywxLHYpOyB9CisKK2lubGluZSB2b2lkIGdsVW5pZm9ybU1hdHJpeDJmdl9laSAgKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXgyZnYobG9jLDEsZmFsc2Usdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybU1hdHJpeDNmdl9laSAgKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXgzZnYobG9jLDEsZmFsc2Usdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybU1hdHJpeDRmdl9laSAgKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXg0ZnYobG9jLDEsZmFsc2Usdik7IH0KKworCitFSUdFTl9HTF9GVU5DMV9ERUNMQVJBVElPTiAgICAgICAoZ2xVbmlmb3JtLEdMaW50LGNvbnN0KQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDIsMmZ2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxpbnQsICAgICAgICAgIDIsMml2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDMsM2Z2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxpbnQsICAgICAgICAgIDMsM2l2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDQsNGZ2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxpbnQsICAgICAgICAgIDQsNGl2X2VpKQorCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgMiwyLE1hdHJpeDJmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAzLDMsTWF0cml4M2Z2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDQsNCxNYXRyaXg0ZnZfZWkpCisKKyNlbmRpZgorCisjaWZkZWYgR0xfVkVSU0lPTl8yXzEKKworaW5saW5lIHZvaWQgZ2xVbmlmb3JtTWF0cml4MngzZnZfZWkoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybU1hdHJpeDJ4M2Z2KGxvYywxLGZhbHNlLHYpOyB9CitpbmxpbmUgdm9pZCBnbFVuaWZvcm1NYXRyaXgzeDJmdl9laShHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4M3gyZnYobG9jLDEsZmFsc2Usdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybU1hdHJpeDJ4NGZ2X2VpKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXgyeDRmdihsb2MsMSxmYWxzZSx2KTsgfQoraW5saW5lIHZvaWQgZ2xVbmlmb3JtTWF0cml4NHgyZnZfZWkoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybU1hdHJpeDR4MmZ2KGxvYywxLGZhbHNlLHYpOyB9CitpbmxpbmUgdm9pZCBnbFVuaWZvcm1NYXRyaXgzeDRmdl9laShHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4M3g0ZnYobG9jLDEsZmFsc2Usdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybU1hdHJpeDR4M2Z2X2VpKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXg0eDNmdihsb2MsMSxmYWxzZSx2KTsgfQorCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgMiwzLE1hdHJpeDJ4M2Z2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDMsMixNYXRyaXgzeDJmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAyLDQsTWF0cml4Mng0ZnZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgNCwyLE1hdHJpeDR4MmZ2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDMsNCxNYXRyaXgzeDRmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICA0LDMsTWF0cml4NHgzZnZfZWkpCisKKyNlbmRpZgorCisjaWZkZWYgR0xfVkVSU0lPTl8zXzAKKworaW5saW5lIHZvaWQgZ2xVbmlmb3JtMnVpdl9laSAoR0xpbnQgbG9jLCBjb25zdCB1bnNpZ25lZCBpbnQqIHYpICB7IGdsVW5pZm9ybTJ1aXYobG9jLDEsdik7IH0KK2lubGluZSB2b2lkIGdsVW5pZm9ybTN1aXZfZWkgKEdMaW50IGxvYywgY29uc3QgdW5zaWduZWQgaW50KiB2KSAgeyBnbFVuaWZvcm0zdWl2KGxvYywxLHYpOyB9CitpbmxpbmUgdm9pZCBnbFVuaWZvcm00dWl2X2VpIChHTGludCBsb2MsIGNvbnN0IHVuc2lnbmVkIGludCogdikgIHsgZ2xVbmlmb3JtNHVpdihsb2MsMSx2KTsgfQorCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LHVuc2lnbmVkIGludCwgMiwydWl2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCx1bnNpZ25lZCBpbnQsIDMsM3Vpdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsdW5zaWduZWQgaW50LCA0LDR1aXZfZWkpCisKKyNlbmRpZgorCisjaWZkZWYgR0xfQVJCX2dwdV9zaGFkZXJfZnA2NAoraW5saW5lIHZvaWQgZ2xVbmlmb3JtMmR2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBkb3VibGUqIHYpICAgICAgICB7IGdsVW5pZm9ybTJkdihsb2MsMSx2KTsgfQoraW5saW5lIHZvaWQgZ2xVbmlmb3JtM2R2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBkb3VibGUqIHYpICAgICAgICB7IGdsVW5pZm9ybTNkdihsb2MsMSx2KTsgfQoraW5saW5lIHZvaWQgZ2xVbmlmb3JtNGR2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBkb3VibGUqIHYpICAgICAgICB7IGdsVW5pZm9ybTRkdihsb2MsMSx2KTsgfQorCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGRvdWJsZSwgICAgICAgMiwyZHZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGRvdWJsZSwgICAgICAgMywzZHZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGRvdWJsZSwgICAgICAgNCw0ZHZfZWkpCisjZW5kaWYKKworCisvL0B9CisKK30KKworI2VuZGlmIC8vIEVJR0VOX09QRU5HTF9NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzIGIvdW5zdXBwb3J0ZWQvRWlnZW4vUG9seW5vbWlhbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjZTU2MwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzCkBAIC0wLDAgKzEsMTM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUE9MWU5PTUlBTFNfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fUE9MWU5PTUlBTFNfTU9EVUxFX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oPgorCisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisKKy8vIE5vdGUgdGhhdCBFSUdFTl9ISURFX0hFQVZZX0NPREUgaGFzIHRvIGJlIGRlZmluZWQgcGVyIG1vZHVsZQorI2lmIChkZWZpbmVkIEVJR0VOX0VYVEVSTl9JTlNUQU5USUFUSU9OUykgJiYgKEVJR0VOX0VYVEVSTl9JTlNUQU5USUFUSU9OUz49MikKKyAgI2lmbmRlZiBFSUdFTl9ISURFX0hFQVZZX0NPREUKKyAgI2RlZmluZSBFSUdFTl9ISURFX0hFQVZZX0NPREUKKyAgI2VuZGlmCisjZWxpZiBkZWZpbmVkIEVJR0VOX0hJREVfSEVBVllfQ09ERQorICAjdW5kZWYgRUlHRU5fSElERV9IRUFWWV9DT0RFCisjZW5kaWYKKworLyoqCisgICogXGRlZmdyb3VwIFBvbHlub21pYWxzX01vZHVsZSBQb2x5bm9taWFscyBtb2R1bGUKKyAgKiBcYnJpZWYgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBRUiBiYXNlZCBwb2x5bm9taWFsIHNvbHZlci4KKwkqCisgICogVG8gdXNlIHRoaXMgbW9kdWxlLCBhZGQKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscz4KKyAgKiBcZW5kY29kZQorCSogYXQgdGhlIHN0YXJ0IG9mIHlvdXIgc291cmNlIGZpbGUuCisgICovCisKKyNpbmNsdWRlICJzcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFV0aWxzLmgiCisjaW5jbHVkZSAic3JjL1BvbHlub21pYWxzL0NvbXBhbmlvbi5oIgorI2luY2x1ZGUgInNyYy9Qb2x5bm9taWFscy9Qb2x5bm9taWFsU29sdmVyLmgiCisKKy8qKgorCVxwYWdlIHBvbHlub21pYWxzIFBvbHlub21pYWxzIGRlZmluZXMgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggcG9seW5vbWlhbHMKKwlhbmQgYSBRUiBiYXNlZCBwb2x5bm9taWFsIHNvbHZlci4KKwlcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKworCVRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2UgZG9jdW1lbnRzIGZpcnN0IHRoZSBmdW5jdGlvbnMgZm9yIGV2YWx1YXRpbmcsIGNvbXB1dGluZworCXBvbHlub21pYWxzLCBjb21wdXRpbmcgZXN0aW1hdGVzIGFib3V0IHBvbHlub21pYWxzIGFuZCBuZXh0IHRoZSBRUiBiYXNlZCBwb2x5bm9taWFsCisJc29sdmVyLgorCisJXHNlY3Rpb24gcG9seW5vbWlhbFV0aWxzIGNvbnZlbmllbnQgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBwb2x5bm9taWFscworCVxzdWJzZWN0aW9uIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbAorCVRoZSBmdW5jdGlvbgorCVxjb2RlCisJdm9pZCByb290c190b19tb25pY1BvbHlub21pYWwoIGNvbnN0IFJvb3RWZWN0b3ImIHJ2LCBQb2x5bm9taWFsJiBwb2x5ICkKKwlcZW5kY29kZQorCWNvbXB1dGVzIHRoZSBjb2VmZmljaWVudHMgXGYkIGFfaSBcZiQgb2YKKworCVxmJCBwKHgpID0gYV8wICsgYV97MX14ICsgLi4uICsgYV97bi0xfXhee24tMX0gKyB4Xm4gXGYkCisKKwl3aGVyZSBcZiQgcCBcZiQgaXMga25vd24gdGhyb3VnaCBpdHMgcm9vdHMgaS5lLiBcZiQgcCh4KSA9ICh4LXJfMSkoeC1yXzIpLi4uKHgtcl9uKSBcZiQuCisKKwlcc3Vic2VjdGlvbiBwb2x5X2V2YWwKKwlUaGUgZnVuY3Rpb24KKwlcY29kZQorCVQgcG9seV9ldmFsKCBjb25zdCBQb2x5bm9taWFscyYgcG9seSwgY29uc3QgVCYgeCApCisJXGVuZGNvZGUKKwlldmFsdWF0ZXMgYSBwb2x5bm9taWFsIGF0IGEgZ2l2ZW4gcG9pbnQgdXNpbmcgc3RhYmlsaXplZCBIJm91bWw7cm5lciBtZXRob2QuCisKKwlUaGUgZm9sbG93aW5nIGNvZGU6IGZpcnN0IGNvbXB1dGVzIHRoZSBjb2VmZmljaWVudHMgaW4gdGhlIG1vbm9taWFsIGJhc2lzIG9mIHRoZSBtb25pYyBwb2x5bm9taWFsIHRoYXQgaGFzIHRoZSBwcm92aWRlZCByb290czsKKwl0aGVuLCBpdCBldmFsdWF0ZXMgdGhlIGNvbXB1dGVkIHBvbHlub21pYWwsIHVzaW5nIGEgc3RhYmlsaXplZCBIJm91bWw7cm5lciBtZXRob2QuCisKKwlcaW5jbHVkZSBQb2x5bm9taWFsVXRpbHMxLmNwcAorICBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQb2x5bm9taWFsVXRpbHMxLm91dAorCisJXHN1YnNlY3Rpb24gQ2F1Y2h5IGJvdW5kcworCVRoZSBmdW5jdGlvbgorCVxjb2RlCisJUmVhbCBjYXVjaHlfbWF4X2JvdW5kKCBjb25zdCBQb2x5bm9taWFsJiBwb2x5ICkKKwlcZW5kY29kZQorCXByb3ZpZGVzIGEgbWF4aW11bSBib3VuZCAodGhlIENhdWNoeSBvbmU6IFxmJEMocClcZiQpIGZvciB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSByb290IG9mIHRoZSBnaXZlbiBwb2x5bm9taWFsIGkuZS4KKwlcZiQgXGZvcmFsbCByX2kgXGYkIHJvb3Qgb2YgXGYkIHAoeCkgPSBcc3VtX3trPTB9XmQgYV9rIHheayBcZiQsCisJXGYkIHxyX2l8IFxsZSBDKHApID0gXHN1bV97az0wfV57ZH0gXGxlZnQgfCBcZnJhY3thX2t9e2FfZH0gXHJpZ2h0IHwgXGYkCisJVGhlIGxlYWRpbmcgY29lZmZpY2llbnQgXGYkIHAgXGYkOiBzaG91bGQgYmUgbm9uIHplcm8gXGYkYV9kIFxuZXEgMFxmJC4KKworCisJVGhlIGZ1bmN0aW9uCisJXGNvZGUKKwlSZWFsIGNhdWNoeV9taW5fYm91bmQoIGNvbnN0IFBvbHlub21pYWwmIHBvbHkgKQorCVxlbmRjb2RlCisJcHJvdmlkZXMgYSBtaW5pbXVtIGJvdW5kICh0aGUgQ2F1Y2h5IG9uZTogXGYkYyhwKVxmJCkgZm9yIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIG5vbiB6ZXJvIHJvb3Qgb2YgdGhlIGdpdmVuIHBvbHlub21pYWwgaS5lLgorCVxmJCBcZm9yYWxsIHJfaSBcbmVxIDAgXGYkIHJvb3Qgb2YgXGYkIHAoeCkgPSBcc3VtX3trPTB9XmQgYV9rIHheayBcZiQsCisJXGYkIHxyX2l8IFxnZSBjKHApID0gXGxlZnQoIFxzdW1fe2s9MH1ee2R9IFxsZWZ0IHwgXGZyYWN7YV9rfXthXzB9IFxyaWdodCB8IFxyaWdodCleey0xfSBcZiQKKworCisKKworCVxzZWN0aW9uIFFSIHBvbHlub21pYWwgc29sdmVyIGNsYXNzCisJQ29tcHV0ZXMgdGhlIGNvbXBsZXggcm9vdHMgb2YgYSBwb2x5bm9taWFsIGJ5IGNvbXB1dGluZyB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlIGFzc29jaWF0ZWQgY29tcGFuaW9uIG1hdHJpeCB3aXRoIHRoZSBRUiBhbGdvcml0aG0uCisJCisJVGhlIHJvb3RzIG9mIFxmJCBwKHgpID0gYV8wICsgYV8xIHggKyBhXzIgeF4yICsgYV97M30geF4zICsgeF40IFxmJCBhcmUgdGhlIGVpZ2VudmFsdWVzIG9mCisJXGYkCisJXGxlZnQgWworCVxiZWdpbnthcnJheX17Y2NjY30KKwkwICYgMCAmICAwICYgYV8wIFxcCisJMSAmIDAgJiAgMCAmIGFfMSBcXAorCTAgJiAxICYgIDAgJiBhXzIgXFwKKwkwICYgMCAmICAxICYgYV8zCisJXGVuZHthcnJheX0gXHJpZ2h0IF0KKwlcZiQKKworCUhvd2V2ZXIsIHRoZSBRUiBhbGdvcml0aG0gaXMgbm90IGd1YXJhbnRlZWQgdG8gY29udmVyZ2Ugd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCBlaWdlbnZhbHVlcyB3aXRoIHNhbWUgbW9kdWx1cy4KKworCVRoZXJlZm9yZSB0aGUgY3VycmVudCBwb2x5bm9taWFsIHNvbHZlciBpcyBndWFyYW50ZWVkIHRvIHByb3ZpZGUgYSBjb3JyZWN0IHJlc3VsdCBvbmx5IHdoZW4gdGhlIGNvbXBsZXggcm9vdHMgXGYkcl8xLHJfMiwuLi4scl9kXGYkIGhhdmUgZGlzdGluY3QgbW9kdWxpIGkuZS4KKwkKKwlcZiQgXGZvcmFsbCBpLGogXGluIFsxO2RdLH4gXHwgcl9pIFx8IFxuZXEgXHwgcl9qIFx8IFxmJC4KKworCVdpdGggMzJiaXQgKGZsb2F0KSBmbG9hdGluZyB0eXBlcyB0aGlzIHByb2JsZW0gc2hvd3MgdXAgZnJlcXVlbnRseS4KKyAgSG93ZXZlciwgYWxtb3N0IGFsd2F5cywgY29ycmVjdCBhY2N1cmFjeSBpcyByZWFjaGVkIGV2ZW4gaW4gdGhlc2UgY2FzZXMgZm9yIDY0Yml0CisgIChkb3VibGUpIGZsb2F0aW5nIHR5cGVzIGFuZCBzbWFsbCBwb2x5bm9taWFsIGRlZ3JlZSAoPDIwKS4KKworCVxpbmNsdWRlIFBvbHlub21pYWxTb2x2ZXIxLmNwcAorCQorCUluIHRoZSBhYm92ZSBleGFtcGxlOgorCQorCS0jIGEgc2ltcGxlIHVzZSBvZiB0aGUgcG9seW5vbWlhbCBzb2x2ZXIgaXMgc2hvd247CisJLSMgdGhlIGFjY3VyYWN5IHByb2JsZW0gd2l0aCB0aGUgUVIgYWxnb3JpdGhtIGlzIHByZXNlbnRlZDogYSBwb2x5bm9taWFsIHdpdGggYWxtb3N0IGNvbmp1Z2F0ZSByb290cyBpcyBwcm92aWRlZCB0byB0aGUgc29sdmVyLgorCVRob3NlIHJvb3RzIGhhdmUgYWxtb3N0IHNhbWUgbW9kdWxlIHRoZXJlZm9yZSB0aGUgUVIgYWxnb3JpdGhtIGZhaWxlZCB0byBjb252ZXJnZTogdGhlIGFjY3VyYWN5CisJb2YgdGhlIGxhc3Qgcm9vdCBpcyBiYWQ7CisJLSMgYSBzaW1wbGUgd2F5IHRvIGNpcmN1bXZlbnQgdGhlIHByb2JsZW0gaXMgc2hvd246IHVzZSBkb3VibGVzIGluc3RlYWQgb2YgZmxvYXRzLgorCisgIE91dHB1dDogXHZlcmJpbmNsdWRlIFBvbHlub21pYWxTb2x2ZXIxLm91dAorKi8KKworI2luY2x1ZGUgPEVpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oPgorCisjZW5kaWYgLy8gRUlHRU5fUE9MWU5PTUlBTFNfTU9EVUxFX0gKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9Ta3lsaW5lIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU2t5bGluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE2OGNiCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU2t5bGluZQpAQCAtMCwwICsxLDM5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0tZTElORV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TS1lMSU5FX01PRFVMRV9ICisKKworI2luY2x1ZGUgIkVpZ2VuL0NvcmUiCisKKyNpbmNsdWRlICJFaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKgorICogIFxkZWZncm91cCBTa3lsaW5lX01vZHVsZSBTa3lsaW5lIG1vZHVsZQorICoKKyAqCisgKgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL1NreWxpbmUvU2t5bGluZVV0aWwuaCIKKyNpbmNsdWRlICJzcmMvU2t5bGluZS9Ta3lsaW5lTWF0cml4QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Ta3lsaW5lL1NreWxpbmVTdG9yYWdlLmgiCisjaW5jbHVkZSAic3JjL1NreWxpbmUvU2t5bGluZU1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Ta3lsaW5lL1NreWxpbmVJbnBsYWNlTFUuaCIKKyNpbmNsdWRlICJzcmMvU2t5bGluZS9Ta3lsaW5lUHJvZHVjdC5oIgorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TS1lMSU5FX01PRFVMRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYSBiL3Vuc3VwcG9ydGVkL0VpZ2VuL1NwYXJzZUV4dHJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWNmZmEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYQpAQCAtMCwwICsxLDUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9FWFRSQV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfRVhUUkFfTU9EVUxFX0gKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL1NwYXJzZSIKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaWZkZWYgRUlHRU5fR09PR0xFSEFTSF9TVVBQT1JUCisgICNpbmNsdWRlIDxnb29nbGUvZGVuc2VfaGFzaF9tYXA+CisjZW5kaWYKKworLyoqCisgICogXGRlZmdyb3VwIFNwYXJzZUV4dHJhX01vZHVsZSBTcGFyc2VFeHRyYSBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHNvbWUgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGV4dGVuZGluZyB0aGUgc3BhcnNlIG1vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUV4dHJhPgorICAqIFxlbmRjb2RlCisgICovCisKKworI2luY2x1ZGUgInNyYy9TcGFyc2VFeHRyYS9EeW5hbWljU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL1JhbmRvbVNldHRlci5oIgorCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL01hcmtldElPLmgiCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL01hdHJpeE1hcmtldEl0ZXJhdG9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFX0VYVFJBX01PRFVMRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9TcGVjaWFsRnVuY3Rpb25zIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmFkNDkyCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucwpAQCAtMCwwICsxLDYzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX01PRFVMRQorI2RlZmluZSBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX01PRFVMRQorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vQ29yZSIKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKgorICAqIFxkZWZncm91cCBTcGVjaWFsRnVuY3Rpb25zX01vZHVsZSBTcGVjaWFsIG1hdGggZnVuY3Rpb25zIG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgZmVhdHVyZXMgYWRkaXRpb25hbCBjb2VmZmljaWVudC13aXNlIG1hdGggZnVuY3Rpb25zIGF2YWlsYWJsZQorICAqIHdpdGhpbiB0aGUgbnVtZXh0OjogbmFtZXNwYWNlIGZvciB0aGUgc2NhbGFyIHZlcnNpb24sIGFuZCBhcyBtZXRob2QgYW5kL29yIGZyZWUKKyAgKiBmdW5jdGlvbnMgb2YgQXJyYXkuIFRob3NlIGluY2x1ZGU6CisgICoKKyAgKiAtIGVyZgorICAqIC0gZXJmYworICAqIC0gbGdhbW1hCisgICogLSBpZ2FtbWEKKyAgKiAtIGlnYW1tYWMKKyAgKiAtIGRpZ2FtbWEKKyAgKiAtIHBvbHlnYW1tYQorICAqIC0gemV0YQorICAqIC0gYmV0YWluYworICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4KKyAgKiBcZW5kY29kZQorICAqLworLy9AeworCit9CisKKyNpbmNsdWRlICJzcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zSW1wbC5oIgorI2luY2x1ZGUgInNyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNQYWNrZXRNYXRoLmgiCisjaW5jbHVkZSAic3JjL1NwZWNpYWxGdW5jdGlvbnMvU3BlY2lhbEZ1bmN0aW9uc0hhbGYuaCIKKyNpbmNsdWRlICJzcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zRnVuY3RvcnMuaCIKKyNpbmNsdWRlICJzcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zQXJyYXlBUEkuaCIKKworI2lmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX0NVREEKKyAgI2luY2x1ZGUgInNyYy9TcGVjaWFsRnVuY3Rpb25zL2FyY2gvQ1VEQS9DdWRhU3BlY2lhbEZ1bmN0aW9ucy5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisvL0B9Cit9CisKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BFQ0lBTEZVTkNUSU9OU19NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL1NwbGluZXMgYi91bnN1cHBvcnRlZC9FaWdlbi9TcGxpbmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmU2YjkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9TcGxpbmVzCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAxMC0yMDExIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BMSU5FU19NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TUExJTkVTX01PRFVMRV9ICisKK25hbWVzcGFjZSBFaWdlbiAKK3sKKy8qKgorICAqIFxkZWZncm91cCBTcGxpbmVzX01vZHVsZSBTcGxpbmUgYW5kIHNwbGluZSBmaXR0aW5nIG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzaW1wbGUgbXVsdGktZGltZW5zaW9uYWwgc3BsaW5lIGNsYXNzIHdoaWxlCisgICogb2ZmZXJpbmcgbW9zdCBiYXNpYyBmdW5jdGlvbmFsaXR5IHRvIGZpdCBhIHNwbGluZSB0byBwb2ludCBzZXRzLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcz4KKyAgKiBcZW5kY29kZQorICAqLworfQorCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lRndkLmgiCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lLmgiCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lRml0dGluZy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BMSU5FU19NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0F1dG9EaWZmSmFjb2JpYW4uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZkphY29iaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNmMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZkphY29iaWFuLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BVVRPRElGRl9KQUNPQklBTl9ICisjZGVmaW5lIEVJR0VOX0FVVE9ESUZGX0pBQ09CSUFOX0gKKworbmFtZXNwYWNlIEVpZ2VuCit7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+IGNsYXNzIEF1dG9EaWZmSmFjb2JpYW4gOiBwdWJsaWMgRnVuY3RvcgoreworcHVibGljOgorICBBdXRvRGlmZkphY29iaWFuKCkgOiBGdW5jdG9yKCkge30KKyAgQXV0b0RpZmZKYWNvYmlhbihjb25zdCBGdW5jdG9yJiBmKSA6IEZ1bmN0b3IoZikge30KKworICAvLyBmb3J3YXJkIGNvbnN0cnVjdG9ycworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVD4KKyAgQXV0b0RpZmZKYWNvYmlhbihjb25zdCBUJiAuLi5WYWx1ZXMpIDogRnVuY3RvcihWYWx1ZXMuLi4pIHt9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMD4KKyAgQXV0b0RpZmZKYWNvYmlhbihjb25zdCBUMCYgYTApIDogRnVuY3RvcihhMCkge30KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgorICBBdXRvRGlmZkphY29iaWFuKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExKSA6IEZ1bmN0b3IoYTAsIGExKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBBdXRvRGlmZkphY29iaWFuKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExLCBjb25zdCBUMiYgYTIpIDogRnVuY3RvcihhMCwgYTEsIGEyKSB7fQorI2VuZGlmCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpJbnB1dFR5cGUgSW5wdXRUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGVudW0geworICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBJbnB1dFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBWYWx1ZVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBWYWx1ZXNBdENvbXBpbGVUaW1lLCBJbnB1dHNBdENvbXBpbGVUaW1lPiBKYWNvYmlhblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgSmFjb2JpYW5UeXBlOjpJbmRleCBJbmRleDsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIElucHV0c0F0Q29tcGlsZVRpbWUsIDE+IERlcml2YXRpdmVUeXBlOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlcml2YXRpdmVUeXBlPiBBY3RpdmVTY2FsYXI7CisKKyAgdHlwZWRlZiBNYXRyaXg8QWN0aXZlU2NhbGFyLCBJbnB1dHNBdENvbXBpbGVUaW1lLCAxPiBBY3RpdmVJbnB1dDsKKyAgdHlwZWRlZiBNYXRyaXg8QWN0aXZlU2NhbGFyLCBWYWx1ZXNBdENvbXBpbGVUaW1lLCAxPiBBY3RpdmVWYWx1ZTsKKworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgLy8gU29tZSBjb21waWxlcnMgZG9uJ3QgYWNjZXB0IHZhcmlhZGljIHBhcmFtZXRlcnMgYWZ0ZXIgYSBkZWZhdWx0IHBhcmFtZXRlciwKKyAgLy8gaS5lLiwgd2UgY2FuJ3QganVzdCB3cml0ZSBfamFjPTAgYnV0IHdlIG5lZWQgdG8gb3ZlcmxvYWQgb3BlcmF0b3IoKToKKyAgRUlHRU5fU1RST05HX0lOTElORQorICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2KSBjb25zdAorICB7CisgICAgICB0aGlzLT5vcGVyYXRvcigpKHgsIHYsIDApOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtc1R5cGU+CisgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgSW5wdXRUeXBlJiB4LCBWYWx1ZVR5cGUqIHYsIEphY29iaWFuVHlwZSogX2phYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbXNUeXBlJi4uLiBQYXJhbXMpIGNvbnN0CisjZWxzZQorICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qYWM9MCkgY29uc3QKKyNlbmRpZgorICB7CisgICAgZWlnZW5fYXNzZXJ0KHYhPTApOworCisgICAgaWYgKCFfamFjKQorICAgIHsKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgICBGdW5jdG9yOjpvcGVyYXRvcigpKHgsIHYsIFBhcmFtcy4uLik7CisjZWxzZQorICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2KTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEphY29iaWFuVHlwZSYgamFjID0gKl9qYWM7CisKKyAgICBBY3RpdmVJbnB1dCBheCA9IHgudGVtcGxhdGUgY2FzdDxBY3RpdmVTY2FsYXI+KCk7CisgICAgQWN0aXZlVmFsdWUgYXYoamFjLnJvd3MoKSk7CisKKyAgICBpZihJbnB1dHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgICAgZm9yIChJbmRleCBqPTA7IGo8amFjLnJvd3MoKTsgaisrKQorICAgICAgICBhdltqXS5kZXJpdmF0aXZlcygpLnJlc2l6ZSh4LnJvd3MoKSk7CisKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxqYWMuY29scygpOyBpKyspCisgICAgICBheFtpXS5kZXJpdmF0aXZlcygpID0gRGVyaXZhdGl2ZVR5cGU6OlVuaXQoeC5yb3dzKCksaSk7CisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKShheCwgJmF2LCBQYXJhbXMuLi4pOworI2Vsc2UKKyAgICBGdW5jdG9yOjpvcGVyYXRvcigpKGF4LCAmYXYpOworI2VuZGlmCisKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxqYWMucm93cygpOyBpKyspCisgICAgeworICAgICAgKCp2KVtpXSA9IGF2W2ldLnZhbHVlKCk7CisgICAgICBqYWMucm93KGkpID0gYXZbaV0uZGVyaXZhdGl2ZXMoKTsKKyAgICB9CisgIH0KK307CisKK30KKworI2VuZGlmIC8vIEVJR0VOX0FVVE9ESUZGX0pBQ09CSUFOX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlNjYWxhci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0F1dG9EaWZmU2NhbGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc5ZmU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlNjYWxhci5oCkBAIC0wLDAgKzEsNjkzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVVUT0RJRkZfU0NBTEFSX0gKKyNkZWZpbmUgRUlHRU5fQVVUT0RJRkZfU0NBTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBtYWtlX2NvaGVyZW50X2ltcGwgeworICBzdGF0aWMgdm9pZCBydW4oQSYsIEImKSB7fQorfTsKKworLy8gcmVzaXplIGEgdG8gbWF0Y2ggYiBpcyBhLnNpemUoKT09MCwgYW5kIGNvbnZlcnNlbHkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgordm9pZCBtYWtlX2NvaGVyZW50KGNvbnN0IEEmIGEsIGNvbnN0IEImYikKK3sKKyAgbWFrZV9jb2hlcmVudF9pbXBsPEEsQj46OnJ1bihhLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBiLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGUsIGJvb2wgRW5hYmxlPiBzdHJ1Y3QgYXV0b19kaWZmX3NwZWNpYWxfb3A7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVyVHlwZT4gY2xhc3MgQXV0b0RpZmZTY2FsYXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE5ld0RlclR5cGU+CitpbmxpbmUgQXV0b0RpZmZTY2FsYXI8TmV3RGVyVHlwZT4gTWFrZUF1dG9EaWZmU2NhbGFyKGNvbnN0IHR5cGVuYW1lIE5ld0RlclR5cGU6OlNjYWxhciYgdmFsdWUsIGNvbnN0IE5ld0RlclR5cGUgJmRlcikgeworICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8TmV3RGVyVHlwZT4odmFsdWUsZGVyKTsKK30KKworLyoqIFxjbGFzcyBBdXRvRGlmZlNjYWxhcgorICAqIFxicmllZiBBIHNjYWxhciB0eXBlIHJlcGxhY2VtZW50IHdpdGggYXV0b21hdGljIGRpZmZlcmVudGF0aW9uIGNhcGFiaWxpdHkKKyAgKgorICAqIFxwYXJhbSBfRGVyVHlwZSB0aGUgdmVjdG9yIHR5cGUgdXNlZCB0byBzdG9yZS9yZXByZXNlbnQgdGhlIGRlcml2YXRpdmVzLiBUaGUgYmFzZSBzY2FsYXIgdHlwZQorICAqICAgICAgICAgICAgICAgICBhcyB3ZWxsIGFzIHRoZSBudW1iZXIgb2YgZGVyaXZhdGl2ZXMgdG8gY29tcHV0ZSBhcmUgZGV0ZXJtaW5lZCBmcm9tIHRoaXMgdHlwZS4KKyAgKiAgICAgICAgICAgICAgICAgVHlwaWNhbCBjaG9pY2VzIGluY2x1ZGUsIGUuZy4sIFxjIFZlY3RvcjRmIGZvciA0IGRlcml2YXRpdmVzLCBvciBcYyBWZWN0b3JYZgorICAqICAgICAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIG9mIGRlcml2YXRpdmVzIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUsIGFuZC9vciwgdGhlIG51bWJlcgorICAqICAgICAgICAgICAgICAgICBvZiBkZXJpdmF0aXZlcyBpcyBsYXJnZS4KKyAgKiAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IF9EZXJUeXBlIGNhbiBhbHNvIGJlIGEgcmVmZXJlbmNlIChlLmcuLCBcYyBWZWN0b3JYZiYpIHRvIHdyYXAgYQorICAqICAgICAgICAgICAgICAgICBleGlzdGluZyB2ZWN0b3IgaW50byBhbiBBdXRvRGlmZlNjYWxhci4KKyAgKiAgICAgICAgICAgICAgICAgRmluYWxseSwgX0RlclR5cGUgY2FuIGFsc28gYmUgYW55IEVpZ2VuIGNvbXBhdGlibGUgZXhwcmVzc2lvbi4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNjYWxhciB2YWx1ZSB3aGlsZSB0cmFja2luZyBpdHMgcmVzcGVjdGl2ZSBkZXJpdmF0aXZlcyB1c2luZyBFaWdlbidzIGV4cHJlc3Npb24KKyAgKiB0ZW1wbGF0ZSBtZWNoYW5pc20uCisgICoKKyAgKiBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgZ2xvYmFsIG1hdGggZnVuY3Rpb246CisgICogIC0gc3RkOjphYnMsIHN0ZDo6c3FydCwgc3RkOjpwb3csIHN0ZDo6ZXhwLCBzdGQ6OmxvZywgc3RkOjpzaW4sIHN0ZDo6Y29zLAorICAqICAtIGludGVybmFsOjphYnMsIGludGVybmFsOjpzcXJ0LCBudW1leHQ6OnBvdywgaW50ZXJuYWw6OmV4cCwgaW50ZXJuYWw6OmxvZywgaW50ZXJuYWw6OnNpbiwgaW50ZXJuYWw6OmNvcywKKyAgKiAgLSBpbnRlcm5hbDo6Y29uaiwgaW50ZXJuYWw6OnJlYWwsIGludGVybmFsOjppbWFnLCBudW1leHQ6OmFiczIuCisgICoKKyAgKiBBdXRvRGlmZlNjYWxhciBjYW4gYmUgdXNlZCBhcyB0aGUgc2NhbGFyIHR5cGUgb2YgYW4gRWlnZW46Ok1hdHJpeCBvYmplY3QuIEhvd2V2ZXIsCisgICogaW4gdGhhdCBjYXNlLCB0aGUgZXhwcmVzc2lvbiB0ZW1wbGF0ZSBtZWNoYW5pc20gb25seSBvY2N1cnMgYXQgdGhlIHRvcCBNYXRyaXggbGV2ZWwsCisgICogd2hpbGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkIHJpZ2h0IGF3YXkuCisgICoKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGU+CitjbGFzcyBBdXRvRGlmZlNjYWxhcgorICA6IHB1YmxpYyBpbnRlcm5hbDo6YXV0b19kaWZmX3NwZWNpYWxfb3AKKyAgICAgICAgICAgIDxfRGVyVHlwZSwgIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlPjo6U2NhbGFyPjo6UmVhbD46OnZhbHVlPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6YXV0b19kaWZmX3NwZWNpYWxfb3AKKyAgICAgICAgICAgIDxfRGVyVHlwZSwgIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxfRGVyVHlwZT46OnR5cGU+OjpTY2FsYXI+OjpSZWFsPjo6dmFsdWU+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxfRGVyVHlwZT46OnR5cGUgRGVyVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyVHlwZT46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsOworCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uLiAqLworICAgIEF1dG9EaWZmU2NhbGFyKCkge30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGFuIGFjdGl2ZSBzY2FsYXIgZnJvbSBpdHMgXGEgdmFsdWUsCisgICAgICAgIGFuZCBpbml0aWFsaXplcyB0aGUgXGEgbmJEZXIgZGVyaXZhdGl2ZXMgc3VjaCB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBcYSBkZXJOdW1iZXIgLXRoIHZhcmlhYmxlICovCisgICAgQXV0b0RpZmZTY2FsYXIoY29uc3QgU2NhbGFyJiB2YWx1ZSwgaW50IG5iRGVyLCBpbnQgZGVyTnVtYmVyKQorICAgICAgOiBtX3ZhbHVlKHZhbHVlKSwgbV9kZXJpdmF0aXZlcyhEZXJUeXBlOjpaZXJvKG5iRGVyKSkKKyAgICB7CisgICAgICBtX2Rlcml2YXRpdmVzLmNvZWZmUmVmKGRlck51bWJlcikgPSBTY2FsYXIoMSk7CisgICAgfQorCisgICAgLyoqIENvbnZlcnNpb24gZnJvbSBhIHNjYWxhciBjb25zdGFudCB0byBhbiBhY3RpdmUgc2NhbGFyLgorICAgICAgKiBUaGUgZGVyaXZhdGl2ZXMgYXJlIHNldCB0byB6ZXJvLiAqLworICAgIC8qZXhwbGljaXQqLyBBdXRvRGlmZlNjYWxhcihjb25zdCBSZWFsJiB2YWx1ZSkKKyAgICAgIDogbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgICBpZihtX2Rlcml2YXRpdmVzLnNpemUoKT4wKQorICAgICAgICBtX2Rlcml2YXRpdmVzLnNldFplcm8oKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhbiBhY3RpdmUgc2NhbGFyIGZyb20gaXRzIFxhIHZhbHVlIGFuZCBkZXJpdmF0aXZlcyBcYSBkZXIgKi8KKyAgICBBdXRvRGlmZlNjYWxhcihjb25zdCBTY2FsYXImIHZhbHVlLCBjb25zdCBEZXJUeXBlJiBkZXIpCisgICAgICA6IG1fdmFsdWUodmFsdWUpLCBtX2Rlcml2YXRpdmVzKGRlcikKKyAgICB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPgorICAgIEF1dG9EaWZmU2NhbGFyKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLCB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGU+OjpTY2FsYXI+Ojp2YWx1ZQorICAgICAgICAmJiAgaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE90aGVyRGVyVHlwZSxEZXJUeXBlPjo6dmFsdWUgLCB2b2lkKj46OnR5cGUgPSAwCisjZW5kaWYKKyAgICApCisgICAgICA6IG1fdmFsdWUob3RoZXIudmFsdWUoKSksIG1fZGVyaXZhdGl2ZXMob3RoZXIuZGVyaXZhdGl2ZXMoKSkKKyAgICB7fQorCisgICAgZnJpZW5kICBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgQXV0b0RpZmZTY2FsYXImIGEpCisgICAgeworICAgICAgcmV0dXJuIHMgPDwgYS52YWx1ZSgpOworICAgIH0KKworICAgIEF1dG9EaWZmU2NhbGFyKGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBvdGhlcikKKyAgICAgIDogbV92YWx1ZShvdGhlci52YWx1ZSgpKSwgbV9kZXJpdmF0aXZlcyhvdGhlci5kZXJpdmF0aXZlcygpKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvcj0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgbV92YWx1ZSA9IG90aGVyLnZhbHVlKCk7CisgICAgICBtX2Rlcml2YXRpdmVzID0gb3RoZXIuZGVyaXZhdGl2ZXMoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yPShjb25zdCBBdXRvRGlmZlNjYWxhciYgb3RoZXIpCisgICAgeworICAgICAgbV92YWx1ZSA9IG90aGVyLnZhbHVlKCk7CisgICAgICBtX2Rlcml2YXRpdmVzID0gb3RoZXIuZGVyaXZhdGl2ZXMoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yPShjb25zdCBTY2FsYXImIG90aGVyKQorICAgIHsKKyAgICAgIG1fdmFsdWUgPSBvdGhlcjsKKyAgICAgIGlmKG1fZGVyaXZhdGl2ZXMuc2l6ZSgpPjApCisgICAgICAgIG1fZGVyaXZhdGl2ZXMuc2V0WmVybygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworLy8gICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBTY2FsYXImICgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKy8vICAgICBpbmxpbmUgb3BlcmF0b3IgU2NhbGFyJiAoKSB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIGlubGluZSBjb25zdCBEZXJUeXBlJiBkZXJpdmF0aXZlcygpIGNvbnN0IHsgcmV0dXJuIG1fZGVyaXZhdGl2ZXM7IH0KKyAgICBpbmxpbmUgRGVyVHlwZSYgZGVyaXZhdGl2ZXMoKSB7IHJldHVybiBtX2Rlcml2YXRpdmVzOyB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFNjYWxhciYgb3RoZXIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlIDwgIG90aGVyOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA8PSBvdGhlcjsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgPiAgb3RoZXI7IH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNjYWxhciYgb3RoZXIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlID49IG90aGVyOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA9PSBvdGhlcjsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgIT0gb3RoZXI7IH0KKworICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpIHsgcmV0dXJuIGEgPCAgYi52YWx1ZSgpOyB9CisgICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikgeyByZXR1cm4gYSA8PSBiLnZhbHVlKCk7IH0KKyAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I+IChjb25zdCBTY2FsYXImIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBiKSB7IHJldHVybiBhID4gIGIudmFsdWUoKTsgfQorICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpIHsgcmV0dXJuIGEgPj0gYi52YWx1ZSgpOyB9CisgICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikgeyByZXR1cm4gYSA9PSBiLnZhbHVlKCk7IH0KKyAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTY2FsYXImIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBiKSB7IHJldHVybiBhICE9IGIudmFsdWUoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPiBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIGIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlIDwgIGIudmFsdWUoKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4gaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBiKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA8PSBiLnZhbHVlKCk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+IGlubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgYikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgPiAgYi52YWx1ZSgpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPiBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIGIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlID49IGIudmFsdWUoKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4gaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBiKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA9PSBiLnZhbHVlKCk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+IGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgYikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgIT0gYi52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlJj4obV92YWx1ZSArIG90aGVyLCBtX2Rlcml2YXRpdmVzKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPiBvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGEgKyBiLnZhbHVlKCksIGIuZGVyaXZhdGl2ZXMoKSk7CisgICAgfQorCisvLyAgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPiBvcGVyYXRvcisoY29uc3QgUmVhbCYgb3RoZXIpIGNvbnN0CisvLyAgICAgeworLy8gICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPihtX3ZhbHVlICsgb3RoZXIsIG1fZGVyaXZhdGl2ZXMpOworLy8gICAgIH0KKworLy8gICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBSZWFsJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGEgKyBiLnZhbHVlKCksIGIuZGVyaXZhdGl2ZXMoKSk7CisvLyAgICAgfQorCisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvcis9KGNvbnN0IFNjYWxhciYgb3RoZXIpCisgICAgeworICAgICAgdmFsdWUoKSArPSBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPixjb25zdCBEZXJUeXBlLGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGU+ID4KKyAgICBvcGVyYXRvcisoY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgaW50ZXJuYWw6Om1ha2VfY29oZXJlbnQobV9kZXJpdmF0aXZlcywgb3RoZXIuZGVyaXZhdGl2ZXMoKSk7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LGNvbnN0IERlclR5cGUsY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8T3RoZXJEZXJUeXBlPjo6dHlwZT4gPigKKyAgICAgICAgbV92YWx1ZSArIG90aGVyLnZhbHVlKCksCisgICAgICAgIG1fZGVyaXZhdGl2ZXMgKyBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJgorICAgIG9wZXJhdG9yKz0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKCp0aGlzKSA9ICgqdGhpcykgKyBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yLShjb25zdCBTY2FsYXImIGIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPihtX3ZhbHVlIC0gYiwgbV9kZXJpdmF0aXZlcyk7CisgICAgfQorCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+CisgICAgb3BlcmF0b3ItKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpCisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+ID4KKyAgICAgICAgICAgIChhIC0gYi52YWx1ZSgpLCAtYi5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yLT0oY29uc3QgU2NhbGFyJiBvdGhlcikKKyAgICB7CisgICAgICB2YWx1ZSgpIC09IG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4KKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZSxjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxPdGhlckRlclR5cGU+Ojp0eXBlPiA+CisgICAgb3BlcmF0b3ItKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjptYWtlX2NvaGVyZW50KG1fZGVyaXZhdGl2ZXMsIG90aGVyLmRlcml2YXRpdmVzKCkpOworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGUsY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8T3RoZXJEZXJUeXBlPjo6dHlwZT4gPigKKyAgICAgICAgbV92YWx1ZSAtIG90aGVyLnZhbHVlKCksCisgICAgICAgIG1fZGVyaXZhdGl2ZXMgLSBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJgorICAgIG9wZXJhdG9yLT0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAtIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+CisgICAgb3BlcmF0b3ItKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8Q3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZT4gPigKKyAgICAgICAgLW1fdmFsdWUsCisgICAgICAgIC1tX2Rlcml2YXRpdmVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyVHlwZSxTY2FsYXIscHJvZHVjdCkgPgorICAgIG9wZXJhdG9yKihjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBNYWtlQXV0b0RpZmZTY2FsYXIobV92YWx1ZSAqIG90aGVyLCBtX2Rlcml2YXRpdmVzICogb3RoZXIpOworICAgIH0KKworICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyVHlwZSxTY2FsYXIscHJvZHVjdCkgPgorICAgIG9wZXJhdG9yKihjb25zdCBTY2FsYXImIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKyAgICB7CisgICAgICByZXR1cm4gTWFrZUF1dG9EaWZmU2NhbGFyKGEudmFsdWUoKSAqIG90aGVyLCBhLmRlcml2YXRpdmVzKCkgKiBvdGhlcik7CisgICAgfQorCisvLyAgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyKSBjb25zdAorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxSZWFsPiwgRGVyVHlwZT46OlR5cGUgPigKKy8vICAgICAgICAgbV92YWx1ZSAqIG90aGVyLAorLy8gICAgICAgICAobV9kZXJpdmF0aXZlcyAqIG90aGVyKSk7CisvLyAgICAgfQorLy8KKy8vICAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8UmVhbD4sIERlclR5cGU+OjpUeXBlID4oCisvLyAgICAgICAgIGEudmFsdWUoKSAqIG90aGVyLAorLy8gICAgICAgICBhLmRlcml2YXRpdmVzKCkgKiBvdGhlcik7CisvLyAgICAgfQorCisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEVJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKERlclR5cGUsU2NhbGFyLHByb2R1Y3QpID4KKyAgICBvcGVyYXRvci8oY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gTWFrZUF1dG9EaWZmU2NhbGFyKG1fdmFsdWUgLyBvdGhlciwgKG1fZGVyaXZhdGl2ZXMgKiAoU2NhbGFyKDEpL290aGVyKSkpOworICAgIH0KKworICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyVHlwZSxTY2FsYXIscHJvZHVjdCkgPgorICAgIG9wZXJhdG9yLyhjb25zdCBTY2FsYXImIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKyAgICB7CisgICAgICByZXR1cm4gTWFrZUF1dG9EaWZmU2NhbGFyKG90aGVyIC8gYS52YWx1ZSgpLCBhLmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKC1vdGhlcikgLyAoYS52YWx1ZSgpKmEudmFsdWUoKSkpKTsKKyAgICB9CisKKy8vICAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8UmVhbD4sIERlclR5cGU+OjpUeXBlID4KKy8vICAgICBvcGVyYXRvci8oY29uc3QgUmVhbCYgb3RoZXIpIGNvbnN0CisvLyAgICAgeworLy8gICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+KAorLy8gICAgICAgICBtX3ZhbHVlIC8gb3RoZXIsCisvLyAgICAgICAgIChtX2Rlcml2YXRpdmVzICogKFJlYWwoMSkvb3RoZXIpKSk7CisvLyAgICAgfQorLy8KKy8vICAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IvKGNvbnN0IFJlYWwmIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8UmVhbD4sIERlclR5cGU+OjpUeXBlID4oCisvLyAgICAgICAgIG90aGVyIC8gYS52YWx1ZSgpLAorLy8gICAgICAgICBhLmRlcml2YXRpdmVzKCkgKiAoLVJlYWwoMSkvb3RoZXIpKTsKKy8vICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEVJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKAorICAgICAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+IEVJR0VOX0NPTU1BCisgICAgICAgICAgY29uc3QgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyVHlwZSxTY2FsYXIscHJvZHVjdCkgRUlHRU5fQ09NTUEKKyAgICAgICAgICBjb25zdCBFSUdFTl9FWFBSX0JJTkFSWU9QX1NDQUxBUl9SRVRVUk5fVFlQRSh0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxPdGhlckRlclR5cGU+Ojp0eXBlLFNjYWxhcixwcm9kdWN0KSA+LFNjYWxhcixwcm9kdWN0KSA+CisgICAgb3BlcmF0b3IvKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjptYWtlX2NvaGVyZW50KG1fZGVyaXZhdGl2ZXMsIG90aGVyLmRlcml2YXRpdmVzKCkpOworICAgICAgcmV0dXJuIE1ha2VBdXRvRGlmZlNjYWxhcigKKyAgICAgICAgbV92YWx1ZSAvIG90aGVyLnZhbHVlKCksCisgICAgICAgICAgKChtX2Rlcml2YXRpdmVzICogb3RoZXIudmFsdWUoKSkgLSAob3RoZXIuZGVyaXZhdGl2ZXMoKSAqIG1fdmFsdWUpKQorICAgICAgICAqIChTY2FsYXIoMSkvKG90aGVyLnZhbHVlKCkqb3RoZXIudmFsdWUoKSkpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwKKyAgICAgICAgY29uc3QgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUoRGVyVHlwZSxTY2FsYXIscHJvZHVjdCksCisgICAgICAgIGNvbnN0IEVJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGUsU2NhbGFyLHByb2R1Y3QpID4gPgorICAgIG9wZXJhdG9yKihjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6bWFrZV9jb2hlcmVudChtX2Rlcml2YXRpdmVzLCBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICAgIHJldHVybiBNYWtlQXV0b0RpZmZTY2FsYXIoCisgICAgICAgIG1fdmFsdWUgKiBvdGhlci52YWx1ZSgpLAorICAgICAgICAobV9kZXJpdmF0aXZlcyAqIG90aGVyLnZhbHVlKCkpICsgKG90aGVyLmRlcml2YXRpdmVzKCkgKiBtX3ZhbHVlKSk7CisgICAgfQorCisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvcio9KGNvbnN0IFNjYWxhciYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4KKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yKj0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBBdXRvRGlmZlNjYWxhciYgb3BlcmF0b3IvPShjb25zdCBTY2FsYXImIG90aGVyKQorICAgIHsKKyAgICAgICp0aGlzID0gKnRoaXMgLyBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvci89KGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyKQorICAgIHsKKyAgICAgICp0aGlzID0gKnRoaXMgLyBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIFNjYWxhciBtX3ZhbHVlOworICAgIERlclR5cGUgbV9kZXJpdmF0aXZlczsKKworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGU+CitzdHJ1Y3QgYXV0b19kaWZmX3NwZWNpYWxfb3A8X0RlclR5cGUsIHRydWU+CisvLyAgIDogYXV0b19kaWZmX3NjYWxhcl9vcDxfRGVyVHlwZSwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zYW1lPFNjYWxhcix0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbD46OnZhbHVlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlIERlclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPERlclR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWw7CisKKy8vICAgdHlwZWRlZiBhdXRvX2RpZmZfc2NhbGFyX29wPF9EZXJUeXBlLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8U2NhbGFyLHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsPjo6dmFsdWU+IEJhc2U7CisKKy8vICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrOworLy8gICB1c2luZyBCYXNlOjpvcGVyYXRvcis9OworLy8gICB1c2luZyBCYXNlOjpvcGVyYXRvci07CisvLyAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yLT07CisvLyAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKy8vICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqPTsKKworICBjb25zdCBBdXRvRGlmZlNjYWxhcjxfRGVyVHlwZT4mIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgQXV0b0RpZmZTY2FsYXI8X0RlclR5cGU+Kj4odGhpcyk7IH0KKyAgQXV0b0RpZmZTY2FsYXI8X0RlclR5cGU+JiBkZXJpdmVkKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPio+KHRoaXMpOyB9CisKKworICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBSZWFsJiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlJj4oZGVyaXZlZCgpLnZhbHVlKCkgKyBvdGhlciwgZGVyaXZlZCgpLmRlcml2YXRpdmVzKCkpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlJj4gb3BlcmF0b3IrKGNvbnN0IFJlYWwmIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPiYgYikKKyAgeworICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlJj4oYSArIGIudmFsdWUoKSwgYi5kZXJpdmF0aXZlcygpKTsKKyAgfQorCisgIGlubGluZSBBdXRvRGlmZlNjYWxhcjxfRGVyVHlwZT4mIG9wZXJhdG9yKz0oY29uc3QgUmVhbCYgb3RoZXIpCisgIHsKKyAgICBkZXJpdmVkKCkudmFsdWUoKSArPSBvdGhlcjsKKyAgICByZXR1cm4gZGVyaXZlZCgpOworICB9CisKKworICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPGJpbmQybmRfb3A8c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyLFJlYWw+ID4sIERlclR5cGU+OjpUeXBlID4KKyAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyKSBjb25zdAorICB7CisgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxiaW5kMm5kX29wPHNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcixSZWFsPiA+LCBEZXJUeXBlPjo6VHlwZSA+KAorICAgICAgZGVyaXZlZCgpLnZhbHVlKCkgKiBvdGhlciwKKyAgICAgIGRlcml2ZWQoKS5kZXJpdmF0aXZlcygpICogb3RoZXIpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8YmluZDFzdF9vcDxzY2FsYXJfcHJvZHVjdF9vcDxSZWFsLFNjYWxhcj4gPiwgRGVyVHlwZT46OlR5cGUgPgorICBvcGVyYXRvciooY29uc3QgUmVhbCYgb3RoZXIsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPiYgYSkKKyAgeworICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8YmluZDFzdF9vcDxzY2FsYXJfcHJvZHVjdF9vcDxSZWFsLFNjYWxhcj4gPiwgRGVyVHlwZT46OlR5cGUgPigKKyAgICAgIGEudmFsdWUoKSAqIG90aGVyLAorICAgICAgYS5kZXJpdmF0aXZlcygpICogb3RoZXIpOworICB9CisKKyAgaW5saW5lIEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPiYgb3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKQorICB7CisgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9EZXJUeXBlPgorc3RydWN0IGF1dG9fZGlmZl9zcGVjaWFsX29wPF9EZXJUeXBlLCBmYWxzZT4KK3sKKyAgdm9pZCBvcGVyYXRvciooKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvci0oKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcisoKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFfU2NhbGFyLCBpbnQgQV9Sb3dzLCBpbnQgQV9Db2xzLCBpbnQgQV9PcHRpb25zLCBpbnQgQV9NYXhSb3dzLCBpbnQgQV9NYXhDb2xzLCB0eXBlbmFtZSBCPgorc3RydWN0IG1ha2VfY29oZXJlbnRfaW1wbDxNYXRyaXg8QV9TY2FsYXIsIEFfUm93cywgQV9Db2xzLCBBX09wdGlvbnMsIEFfTWF4Um93cywgQV9NYXhDb2xzPiwgQj4geworICB0eXBlZGVmIE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+IEE7CisgIHN0YXRpYyB2b2lkIHJ1bihBJiBhLCBCJiBiKSB7CisgICAgaWYoKEFfUm93cz09RHluYW1pYyB8fCBBX0NvbHM9PUR5bmFtaWMpICYmIChhLnNpemUoKT09MCkpCisgICAgeworICAgICAgYS5yZXNpemUoYi5zaXplKCkpOworICAgICAgYS5zZXRaZXJvKCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCX1NjYWxhciwgaW50IEJfUm93cywgaW50IEJfQ29scywgaW50IEJfT3B0aW9ucywgaW50IEJfTWF4Um93cywgaW50IEJfTWF4Q29scz4KK3N0cnVjdCBtYWtlX2NvaGVyZW50X2ltcGw8QSwgTWF0cml4PEJfU2NhbGFyLCBCX1Jvd3MsIEJfQ29scywgQl9PcHRpb25zLCBCX01heFJvd3MsIEJfTWF4Q29scz4gPiB7CisgIHR5cGVkZWYgTWF0cml4PEJfU2NhbGFyLCBCX1Jvd3MsIEJfQ29scywgQl9PcHRpb25zLCBCX01heFJvd3MsIEJfTWF4Q29scz4gQjsKKyAgc3RhdGljIHZvaWQgcnVuKEEmIGEsIEImIGIpIHsKKyAgICBpZigoQl9Sb3dzPT1EeW5hbWljIHx8IEJfQ29scz09RHluYW1pYykgJiYgKGIuc2l6ZSgpPT0wKSkKKyAgICB7CisgICAgICBiLnJlc2l6ZShhLnNpemUoKSk7CisgICAgICBiLnNldFplcm8oKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFfU2NhbGFyLCBpbnQgQV9Sb3dzLCBpbnQgQV9Db2xzLCBpbnQgQV9PcHRpb25zLCBpbnQgQV9NYXhSb3dzLCBpbnQgQV9NYXhDb2xzLAorICAgICAgICAgdHlwZW5hbWUgQl9TY2FsYXIsIGludCBCX1Jvd3MsIGludCBCX0NvbHMsIGludCBCX09wdGlvbnMsIGludCBCX01heFJvd3MsIGludCBCX01heENvbHM+CitzdHJ1Y3QgbWFrZV9jb2hlcmVudF9pbXBsPE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXg8Ql9TY2FsYXIsIEJfUm93cywgQl9Db2xzLCBCX09wdGlvbnMsIEJfTWF4Um93cywgQl9NYXhDb2xzPiA+IHsKKyAgdHlwZWRlZiBNYXRyaXg8QV9TY2FsYXIsIEFfUm93cywgQV9Db2xzLCBBX09wdGlvbnMsIEFfTWF4Um93cywgQV9NYXhDb2xzPiBBOworICB0eXBlZGVmIE1hdHJpeDxCX1NjYWxhciwgQl9Sb3dzLCBCX0NvbHMsIEJfT3B0aW9ucywgQl9NYXhSb3dzLCBCX01heENvbHM+IEI7CisgIHN0YXRpYyB2b2lkIHJ1bihBJiBhLCBCJiBiKSB7CisgICAgaWYoKEFfUm93cz09RHluYW1pYyB8fCBBX0NvbHM9PUR5bmFtaWMpICYmIChhLnNpemUoKT09MCkpCisgICAgeworICAgICAgYS5yZXNpemUoYi5zaXplKCkpOworICAgICAgYS5zZXRaZXJvKCk7CisgICAgfQorICAgIGVsc2UgaWYoKEJfUm93cz09RHluYW1pYyB8fCBCX0NvbHM9PUR5bmFtaWMpICYmIChiLnNpemUoKT09MCkpCisgICAgeworICAgICAgYi5yZXNpemUoYS5zaXplKCkpOworICAgICAgYi5zZXRaZXJvKCk7CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZSwgdHlwZW5hbWUgQmluT3A+CitzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8QXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4sdHlwZW5hbWUgRGVyVHlwZTo6U2NhbGFyLEJpbk9wPgoreworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBCaW5PcD4KK3N0cnVjdCBTY2FsYXJCaW5hcnlPcFRyYWl0czx0eXBlbmFtZSBEZXJUeXBlOjpTY2FsYXIsQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4sIEJpbk9wPgoreworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IFJldHVyblR5cGU7Cit9OworCisKKy8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXR0ZW1wdCB0byBsZXQgRWlnZW4ncyBrbm93biBhYm91dCBleHByZXNzaW9uIHRlbXBsYXRlLCBidXQgdGhhdCdzIG1vcmUgdHJpY2t5IQorCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBCaW5PcD4KKy8vIHN0cnVjdCBTY2FsYXJCaW5hcnlPcFRyYWl0czxBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPixBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiwgQmluT3A+CisvLyB7CisvLyAgIGVudW0geyBEZWZpbmVkID0gMSB9OworLy8gICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIERlclR5cGU6OlBsYWluT2JqZWN0PiBSZXR1cm5UeXBlOworLy8gfTsKKy8vCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlMSx0eXBlbmFtZSBEZXJUeXBlMiwgdHlwZW5hbWUgQmluT3A+CisvLyBzdHJ1Y3QgU2NhbGFyQmluYXJ5T3BUcmFpdHM8QXV0b0RpZmZTY2FsYXI8RGVyVHlwZTE+LEF1dG9EaWZmU2NhbGFyPERlclR5cGUyPiwgQmluT3A+CisvLyB7CisvLyAgIGVudW0geyBEZWZpbmVkID0gMSB9Oy8vaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgRGVyVHlwZTE6OlNjYWxhcix0eXBlbmFtZSBEZXJUeXBlMjo6U2NhbGFyPjo6dmFsdWUgfTsKKy8vICAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBEZXJUeXBlMTo6UGxhaW5PYmplY3Q+IFJldHVyblR5cGU7CisvLyB9OworCisjZGVmaW5lIEVJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKEZVTkMsQ09ERSkgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPiBcCisgIGlubGluZSBjb25zdCBFaWdlbjo6QXV0b0RpZmZTY2FsYXI8IFwKKyAgRUlHRU5fRVhQUl9CSU5BUllPUF9TQ0FMQVJfUkVUVVJOX1RZUEUodHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlLCB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU+OjpTY2FsYXIsIHByb2R1Y3QpID4gXAorICBGVU5DKGNvbnN0IEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeCkgeyBcCisgICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOyBcCisgICAgRUlHRU5fVU5VU0VEIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlPjo6U2NhbGFyIFNjYWxhcjsgXAorICAgIENPREU7IFwKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPgoraW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiBjb25qKGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB4KSAgeyByZXR1cm4geDsgfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZT4KK2lubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgcmVhbChjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeCkgIHsgcmV0dXJuIHg7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIERlclR5cGU+CitpbmxpbmUgdHlwZW5hbWUgRGVyVHlwZTo6U2NhbGFyIGltYWcoY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mKSAgICB7IHJldHVybiAwLjsgfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZSwgdHlwZW5hbWUgVD4KK2lubGluZSBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU6OlBsYWluT2JqZWN0PiAobWluKShjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeCwgY29uc3QgVCYgeSkgeworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZTo6UGxhaW5PYmplY3Q+IEFEUzsKKyAgcmV0dXJuICh4IDw9IHkgPyBBRFMoeCkgOiBBRFMoeSkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZSwgdHlwZW5hbWUgVD4KK2lubGluZSBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU6OlBsYWluT2JqZWN0PiAobWF4KShjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeCwgY29uc3QgVCYgeSkgeworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZTo6UGxhaW5PYmplY3Q+IEFEUzsKKyAgcmV0dXJuICh4ID49IHkgPyBBRFMoeCkgOiBBRFMoeSkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZSwgdHlwZW5hbWUgVD4KK2lubGluZSBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU6OlBsYWluT2JqZWN0PiAobWluKShjb25zdCBUJiB4LCBjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeSkgeworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZTo6UGxhaW5PYmplY3Q+IEFEUzsKKyAgcmV0dXJuICh4IDwgeSA/IEFEUyh4KSA6IEFEUyh5KSk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZTo6UGxhaW5PYmplY3Q+IChtYXgpKGNvbnN0IFQmIHgsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB5KSB7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlOjpQbGFpbk9iamVjdD4gQURTOworICByZXR1cm4gKHggPiB5ID8gQURTKHgpIDogQURTKHkpKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIERlclR5cGU+CitpbmxpbmUgQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlOjpQbGFpbk9iamVjdD4gKG1pbikoY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIHgsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB5KSB7CisgIHJldHVybiAoeC52YWx1ZSgpIDwgeS52YWx1ZSgpID8geCA6IHkpOworfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZT4KK2lubGluZSBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU6OlBsYWluT2JqZWN0PiAobWF4KShjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYgeCwgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIHkpIHsKKyAgcmV0dXJuICh4LnZhbHVlKCkgPj0geS52YWx1ZSgpID8geCA6IHkpOworfQorCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGFicywKKyAgdXNpbmcgc3RkOjphYnM7CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGFicyh4LnZhbHVlKCkpLCB4LmRlcml2YXRpdmVzKCkgKiAoeC52YWx1ZSgpPDAgPyAtMSA6IDEpICk7KQorCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWShhYnMyLAorICB1c2luZyBudW1leHQ6OmFiczI7CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGFiczIoeC52YWx1ZSgpKSwgeC5kZXJpdmF0aXZlcygpICogKFNjYWxhcigyKSp4LnZhbHVlKCkpKTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKHNxcnQsCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgU2NhbGFyIHNxcnR4ID0gc3FydCh4LnZhbHVlKCkpOworICByZXR1cm4gRWlnZW46Ok1ha2VBdXRvRGlmZlNjYWxhcihzcXJ0eCx4LmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKDAuNSkgLyBzcXJ0eCkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoY29zLAorICB1c2luZyBzdGQ6OmNvczsKKyAgdXNpbmcgc3RkOjpzaW47CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGNvcyh4LnZhbHVlKCkpLCB4LmRlcml2YXRpdmVzKCkgKiAoLXNpbih4LnZhbHVlKCkpKSk7KQorCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWShzaW4sCisgIHVzaW5nIHN0ZDo6c2luOworICB1c2luZyBzdGQ6OmNvczsKKyAgcmV0dXJuIEVpZ2VuOjpNYWtlQXV0b0RpZmZTY2FsYXIoc2luKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogY29zKHgudmFsdWUoKSkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoZXhwLAorICB1c2luZyBzdGQ6OmV4cDsKKyAgU2NhbGFyIGV4cHggPSBleHAoeC52YWx1ZSgpKTsKKyAgcmV0dXJuIEVpZ2VuOjpNYWtlQXV0b0RpZmZTY2FsYXIoZXhweCx4LmRlcml2YXRpdmVzKCkgKiBleHB4KTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGxvZywKKyAgdXNpbmcgc3RkOjpsb2c7CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGxvZyh4LnZhbHVlKCkpLHguZGVyaXZhdGl2ZXMoKSAqIChTY2FsYXIoMSkveC52YWx1ZSgpKSk7KQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPgoraW5saW5lIGNvbnN0IEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjwKK0VJR0VOX0VYUFJfQklOQVJZT1BfU0NBTEFSX1JFVFVSTl9UWVBFKHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGU+OjpTY2FsYXIscHJvZHVjdCkgPgorcG93KGNvbnN0IEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiAmeCwgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZT46OlNjYWxhciAmeSkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICB1c2luZyBzdGQ6OnBvdzsKKyAgcmV0dXJuIEVpZ2VuOjpNYWtlQXV0b0RpZmZTY2FsYXIocG93KHgudmFsdWUoKSx5KSwgeC5kZXJpdmF0aXZlcygpICogKHkgKiBwb3coeC52YWx1ZSgpLHktMSkpKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlQSx0eXBlbmFtZSBEZXJUeXBlQj4KK2lubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxNYXRyaXg8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlQT46OnR5cGU+OjpTY2FsYXIsRHluYW1pYywxPiA+CithdGFuMihjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlQT4mIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGVCPiYgYikKK3sKKyAgdXNpbmcgc3RkOjphdGFuMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGVBPjo6dHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4gUGxhaW5BRFM7CisgIFBsYWluQURTIHJldDsKKyAgcmV0LnZhbHVlKCkgPSBhdGFuMihhLnZhbHVlKCksIGIudmFsdWUoKSk7CisgIAorICBTY2FsYXIgc3F1YXJlZF9oeXBvdCA9IGEudmFsdWUoKSAqIGEudmFsdWUoKSArIGIudmFsdWUoKSAqIGIudmFsdWUoKTsKKyAgCisgIC8vIGlmIChzcXVhcmVkX2h5cG90PT0wKSB0aGUgZGVyaXZhdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBpbiBhIE5hTjoKKyAgcmV0LmRlcml2YXRpdmVzKCkgPSAoYS5kZXJpdmF0aXZlcygpICogYi52YWx1ZSgpIC0gYS52YWx1ZSgpICogYi5kZXJpdmF0aXZlcygpKSAvIHNxdWFyZWRfaHlwb3Q7CisKKyAgcmV0dXJuIHJldDsKK30KKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkodGFuLAorICB1c2luZyBzdGQ6OnRhbjsKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKHRhbih4LnZhbHVlKCkpLHguZGVyaXZhdGl2ZXMoKSAqIChTY2FsYXIoMSkvbnVtZXh0OjphYnMyKGNvcyh4LnZhbHVlKCkpKSkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoYXNpbiwKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFzaW47CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGFzaW4oeC52YWx1ZSgpKSx4LmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKDEpL3NxcnQoMS1udW1leHQ6OmFiczIoeC52YWx1ZSgpKSkpKTspCisgIAorRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoYWNvcywKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFjb3M7CisgIHJldHVybiBFaWdlbjo6TWFrZUF1dG9EaWZmU2NhbGFyKGFjb3MoeC52YWx1ZSgpKSx4LmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKC0xKS9zcXJ0KDEtbnVtZXh0OjphYnMyKHgudmFsdWUoKSkpKSk7KQorCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWSh0YW5oLAorICB1c2luZyBzdGQ6OmNvc2g7CisgIHVzaW5nIHN0ZDo6dGFuaDsKKyAgcmV0dXJuIEVpZ2VuOjpNYWtlQXV0b0RpZmZTY2FsYXIodGFuaCh4LnZhbHVlKCkpLHguZGVyaXZhdGl2ZXMoKSAqIChTY2FsYXIoMSkvbnVtZXh0OjphYnMyKGNvc2goeC52YWx1ZSgpKSkpKTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKHNpbmgsCisgIHVzaW5nIHN0ZDo6c2luaDsKKyAgdXNpbmcgc3RkOjpjb3NoOworICByZXR1cm4gRWlnZW46Ok1ha2VBdXRvRGlmZlNjYWxhcihzaW5oKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogY29zaCh4LnZhbHVlKCkpKTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGNvc2gsCisgIHVzaW5nIHN0ZDo6c2luaDsKKyAgdXNpbmcgc3RkOjpjb3NoOworICByZXR1cm4gRWlnZW46Ok1ha2VBdXRvRGlmZlNjYWxhcihjb3NoKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogc2luaCh4LnZhbHVlKCkpKTspCisKKyN1bmRlZiBFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPiBzdHJ1Y3QgTnVtVHJhaXRzPEF1dG9EaWZmU2NhbGFyPERlclR5cGU+ID4KKyAgOiBOdW1UcmFpdHM8IHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZTo6U2NhbGFyPjo6UmVhbCA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVyVHlwZT46OnR5cGUgRGVyVHlwZUNsZWFuZWQ7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8TWF0cml4PHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBEZXJUeXBlQ2xlYW5lZDo6U2NhbGFyPjo6UmVhbCxEZXJUeXBlQ2xlYW5lZDo6Um93c0F0Q29tcGlsZVRpbWUsRGVyVHlwZUNsZWFuZWQ6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEZXJUeXBlQ2xlYW5lZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIERlclR5cGVDbGVhbmVkOjpNYXhDb2xzQXRDb21waWxlVGltZT4gPiBSZWFsOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IE5vbkludGVnZXI7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4gTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBEZXJUeXBlQ2xlYW5lZDo6U2NhbGFyPjo6TGl0ZXJhbCBMaXRlcmFsOworICBlbnVteworICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IDEKKyAgfTsKK307CisKK30KKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIG51bWVyaWNfbGltaXRzPEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxUPiA+CisgIDogcHVibGljIG51bWVyaWNfbGltaXRzPHR5cGVuYW1lIFQ6OlNjYWxhcj4ge307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIEVJR0VOX0FVVE9ESUZGX1NDQUxBUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQXV0b0RpZmYvQXV0b0RpZmZWZWN0b3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQXV0b0RpZmYvQXV0b0RpZmZWZWN0b3IuaApAQCAtMCwwICsxLDIyMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FVVE9ESUZGX1ZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX0FVVE9ESUZGX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qIFxjbGFzcyBBdXRvRGlmZlNjYWxhcgorICAqIFxicmllZiBBIHNjYWxhciB0eXBlIHJlcGxhY2VtZW50IHdpdGggYXV0b21hdGljIGRpZmZlcmVudGF0aW9uIGNhcGFiaWxpdHkKKyAgKgorICAqIFxwYXJhbSBEZXJUeXBlIHRoZSB2ZWN0b3IgdHlwZSB1c2VkIHRvIHN0b3JlL3JlcHJlc2VudCB0aGUgZGVyaXZhdGl2ZXMgKGUuZy4gVmVjdG9yM2YpCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzY2FsYXIgdmFsdWUgd2hpbGUgdHJhY2tpbmcgaXRzIHJlc3BlY3RpdmUgZGVyaXZhdGl2ZXMuCisgICoKKyAgKiBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgZ2xvYmFsIG1hdGggZnVuY3Rpb246CisgICogIC0gc3RkOjphYnMsIHN0ZDo6c3FydCwgc3RkOjpwb3csIHN0ZDo6ZXhwLCBzdGQ6OmxvZywgc3RkOjpzaW4sIHN0ZDo6Y29zLAorICAqICAtIGludGVybmFsOjphYnMsIGludGVybmFsOjpzcXJ0LCBudW1leHQ6OnBvdywgaW50ZXJuYWw6OmV4cCwgaW50ZXJuYWw6OmxvZywgaW50ZXJuYWw6OnNpbiwgaW50ZXJuYWw6OmNvcywKKyAgKiAgLSBpbnRlcm5hbDo6Y29uaiwgaW50ZXJuYWw6OnJlYWwsIGludGVybmFsOjppbWFnLCBudW1leHQ6OmFiczIuCisgICoKKyAgKiBBdXRvRGlmZlNjYWxhciBjYW4gYmUgdXNlZCBhcyB0aGUgc2NhbGFyIHR5cGUgb2YgYW4gRWlnZW46Ok1hdHJpeCBvYmplY3QuIEhvd2V2ZXIsCisgICogaW4gdGhhdCBjYXNlLCB0aGUgZXhwcmVzc2lvbiB0ZW1wbGF0ZSBtZWNoYW5pc20gb25seSBvY2N1cnMgYXQgdGhlIHRvcCBNYXRyaXggbGV2ZWwsCisgICogd2hpbGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkIHJpZ2h0IGF3YXkuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgSmFjb2JpYW5UeXBlPgorY2xhc3MgQXV0b0RpZmZWZWN0b3IKK3sKKyAgcHVibGljOgorICAgIC8vdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFZhbHVlVHlwZT46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFZhbHVlVHlwZT46OlNjYWxhciBCYXNlU2NhbGFyOworICAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8TWF0cml4PEJhc2VTY2FsYXIsSmFjb2JpYW5UeXBlOjpSb3dzQXRDb21waWxlVGltZSwxPiA+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+CisgICAgaW5saW5lIEF1dG9EaWZmVmVjdG9yJiBvcGVyYXRvcio9KGNvbnN0IEF1dG9EaWZmVmVjdG9yPE90aGVyVmFsdWVUeXBlLE90aGVySmFjb2JpYW5UeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgVmFsdWVUeXBlIG1fdmFsdWVzOworICAgIEphY29iaWFuVHlwZSBtX2phY29iaWFuOworCit9OworCit9CisKKyNlbmRpZiAvLyBFSUdFTl9BVVRPRElGRl9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9CVkFsZ29yaXRobXMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvQlZBbGdvcml0aG1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0YzhhZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvQlZBbGdvcml0aG1zLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IElseWEgQmFyYW4gPGliYXJhbkBtaXQuZWR1PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CVkFMR09SSVRITVNfSAorI2RlZmluZSBFSUdFTl9CVkFMR09SSVRITVNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgQlZILCB0eXBlbmFtZSBJbnRlcnNlY3Rvcj4KK2Jvb2wgaW50ZXJzZWN0X2hlbHBlcihjb25zdCBCVkggJnRyZWUsIEludGVyc2VjdG9yICZpbnRlcnNlY3RvciwgdHlwZW5hbWUgQlZIOjpJbmRleCByb290KQoreworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIOjpWb2x1bWVJdGVyYXRvciBWb2xJdGVyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDo6T2JqZWN0SXRlcmF0b3IgT2JqSXRlcjsKKworICBWb2xJdGVyIHZCZWdpbiA9IFZvbEl0ZXIoKSwgdkVuZCA9IFZvbEl0ZXIoKTsKKyAgT2JqSXRlciBvQmVnaW4gPSBPYmpJdGVyKCksIG9FbmQgPSBPYmpJdGVyKCk7CisKKyAgc3RkOjp2ZWN0b3I8SW5kZXg+IHRvZG8oMSwgcm9vdCk7CisKKyAgd2hpbGUoIXRvZG8uZW1wdHkoKSkgeworICAgIHRyZWUuZ2V0Q2hpbGRyZW4odG9kby5iYWNrKCksIHZCZWdpbiwgdkVuZCwgb0JlZ2luLCBvRW5kKTsKKyAgICB0b2RvLnBvcF9iYWNrKCk7CisKKyAgICBmb3IoOyB2QmVnaW4gIT0gdkVuZDsgKyt2QmVnaW4pIC8vZ28gdGhyb3VnaCBjaGlsZCB2b2x1bWVzCisgICAgICBpZihpbnRlcnNlY3Rvci5pbnRlcnNlY3RWb2x1bWUodHJlZS5nZXRWb2x1bWUoKnZCZWdpbikpKQorICAgICAgICB0b2RvLnB1c2hfYmFjaygqdkJlZ2luKTsKKworICAgIGZvcig7IG9CZWdpbiAhPSBvRW5kOyArK29CZWdpbikgLy9nbyB0aHJvdWdoIGNoaWxkIG9iamVjdHMKKyAgICAgIGlmKGludGVyc2VjdG9yLmludGVyc2VjdE9iamVjdCgqb0JlZ2luKSkKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vaW50ZXJzZWN0b3Igc2FpZCB0byBzdG9wIHF1ZXJ5CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmIC8vbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKK3RlbXBsYXRlPHR5cGVuYW1lIFZvbHVtZTEsIHR5cGVuYW1lIE9iamVjdDEsIHR5cGVuYW1lIE9iamVjdDIsIHR5cGVuYW1lIEludGVyc2VjdG9yPgorc3RydWN0IGludGVyc2VjdG9yX2hlbHBlcjEKK3sKKyAgaW50ZXJzZWN0b3JfaGVscGVyMShjb25zdCBPYmplY3QyICZpblN0b3JlZCwgSW50ZXJzZWN0b3IgJmluKSA6IHN0b3JlZChpblN0b3JlZCksIGludGVyc2VjdG9yKGluKSB7fQorICBib29sIGludGVyc2VjdFZvbHVtZShjb25zdCBWb2x1bWUxICZ2b2wpIHsgcmV0dXJuIGludGVyc2VjdG9yLmludGVyc2VjdFZvbHVtZU9iamVjdCh2b2wsIHN0b3JlZCk7IH0KKyAgYm9vbCBpbnRlcnNlY3RPYmplY3QoY29uc3QgT2JqZWN0MSAmb2JqKSB7IHJldHVybiBpbnRlcnNlY3Rvci5pbnRlcnNlY3RPYmplY3RPYmplY3Qob2JqLCBzdG9yZWQpOyB9CisgIE9iamVjdDIgc3RvcmVkOworICBJbnRlcnNlY3RvciAmaW50ZXJzZWN0b3I7Citwcml2YXRlOgorICBpbnRlcnNlY3Rvcl9oZWxwZXIxJiBvcGVyYXRvcj0oY29uc3QgaW50ZXJzZWN0b3JfaGVscGVyMSYpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVm9sdW1lMiwgdHlwZW5hbWUgT2JqZWN0MiwgdHlwZW5hbWUgT2JqZWN0MSwgdHlwZW5hbWUgSW50ZXJzZWN0b3I+CitzdHJ1Y3QgaW50ZXJzZWN0b3JfaGVscGVyMgoreworICBpbnRlcnNlY3Rvcl9oZWxwZXIyKGNvbnN0IE9iamVjdDEgJmluU3RvcmVkLCBJbnRlcnNlY3RvciAmaW4pIDogc3RvcmVkKGluU3RvcmVkKSwgaW50ZXJzZWN0b3IoaW4pIHt9CisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IFZvbHVtZTIgJnZvbCkgeyByZXR1cm4gaW50ZXJzZWN0b3IuaW50ZXJzZWN0T2JqZWN0Vm9sdW1lKHN0b3JlZCwgdm9sKTsgfQorICBib29sIGludGVyc2VjdE9iamVjdChjb25zdCBPYmplY3QyICZvYmopIHsgcmV0dXJuIGludGVyc2VjdG9yLmludGVyc2VjdE9iamVjdE9iamVjdChzdG9yZWQsIG9iaik7IH0KKyAgT2JqZWN0MSBzdG9yZWQ7CisgIEludGVyc2VjdG9yICZpbnRlcnNlY3RvcjsKK3ByaXZhdGU6CisgIGludGVyc2VjdG9yX2hlbHBlcjImIG9wZXJhdG9yPShjb25zdCBpbnRlcnNlY3Rvcl9oZWxwZXIyJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqICBHaXZlbiBhIEJWSCwgcnVucyB0aGUgcXVlcnkgZW5jYXBzdWxhdGVkIGJ5IFxhIGludGVyc2VjdG9yLgorICAqICBUaGUgSW50ZXJzZWN0b3IgdHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOiBcY29kZQorICAgICBib29sIGludGVyc2VjdFZvbHVtZShjb25zdCBCVkg6OlZvbHVtZSAmdm9sdW1lKSAvL3JldHVybnMgdHJ1ZSBpZiB2b2x1bWUgaW50ZXJzZWN0cyB0aGUgcXVlcnkKKyAgICAgYm9vbCBpbnRlcnNlY3RPYmplY3QoY29uc3QgQlZIOjpPYmplY3QgJm9iamVjdCkgLy9yZXR1cm5zIHRydWUgaWYgdGhlIHNlYXJjaCBzaG91bGQgdGVybWluYXRlIGltbWVkaWF0ZWx5CisgIFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgsIHR5cGVuYW1lIEludGVyc2VjdG9yPgordm9pZCBCVkludGVyc2VjdChjb25zdCBCVkggJnRyZWUsIEludGVyc2VjdG9yICZpbnRlcnNlY3RvcikKK3sKKyAgaW50ZXJuYWw6OmludGVyc2VjdF9oZWxwZXIodHJlZSwgaW50ZXJzZWN0b3IsIHRyZWUuZ2V0Um9vdEluZGV4KCkpOworfQorCisvKiogIEdpdmVuIHR3byBCVkgncywgcnVucyB0aGUgcXVlcnkgb24gdGhlaXIgQ2FydGVzaWFuIHByb2R1Y3QgZW5jYXBzdWxhdGVkIGJ5IFxhIGludGVyc2VjdG9yLgorICAqICBUaGUgSW50ZXJzZWN0b3IgdHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOiBcY29kZQorICAgICBib29sIGludGVyc2VjdFZvbHVtZVZvbHVtZShjb25zdCBCVkgxOjpWb2x1bWUgJnYxLCBjb25zdCBCVkgyOjpWb2x1bWUgJnYyKSAvL3JldHVybnMgdHJ1ZSBpZiBwcm9kdWN0IG9mIHZvbHVtZXMgaW50ZXJzZWN0cyB0aGUgcXVlcnkKKyAgICAgYm9vbCBpbnRlcnNlY3RWb2x1bWVPYmplY3QoY29uc3QgQlZIMTo6Vm9sdW1lICZ2MSwgY29uc3QgQlZIMjo6T2JqZWN0ICZvMikgLy9yZXR1cm5zIHRydWUgaWYgdGhlIHZvbHVtZS1vYmplY3QgcHJvZHVjdCBpbnRlcnNlY3RzIHRoZSBxdWVyeQorICAgICBib29sIGludGVyc2VjdE9iamVjdFZvbHVtZShjb25zdCBCVkgxOjpPYmplY3QgJm8xLCBjb25zdCBCVkgyOjpWb2x1bWUgJnYyKSAvL3JldHVybnMgdHJ1ZSBpZiB0aGUgdm9sdW1lLW9iamVjdCBwcm9kdWN0IGludGVyc2VjdHMgdGhlIHF1ZXJ5CisgICAgIGJvb2wgaW50ZXJzZWN0T2JqZWN0T2JqZWN0KGNvbnN0IEJWSDE6Ok9iamVjdCAmbzEsIGNvbnN0IEJWSDI6Ok9iamVjdCAmbzIpIC8vcmV0dXJucyB0cnVlIGlmIHRoZSBzZWFyY2ggc2hvdWxkIHRlcm1pbmF0ZSBpbW1lZGlhdGVseQorICBcZW5kY29kZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgQlZIMSwgdHlwZW5hbWUgQlZIMiwgdHlwZW5hbWUgSW50ZXJzZWN0b3I+Cit2b2lkIEJWSW50ZXJzZWN0KGNvbnN0IEJWSDEgJnRyZWUxLCBjb25zdCBCVkgyICZ0cmVlMiwgSW50ZXJzZWN0b3IgJmludGVyc2VjdG9yKSAvL1RPRE86IHRhbmRlbSBkZXNjZW50IHdoZW4gaXQgbWFrZXMgc2Vuc2UKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgxOjpJbmRleCBJbmRleDE7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMjo6SW5kZXggSW5kZXgyOworICB0eXBlZGVmIGludGVybmFsOjppbnRlcnNlY3Rvcl9oZWxwZXIxPHR5cGVuYW1lIEJWSDE6OlZvbHVtZSwgdHlwZW5hbWUgQlZIMTo6T2JqZWN0LCB0eXBlbmFtZSBCVkgyOjpPYmplY3QsIEludGVyc2VjdG9yPiBIZWxwZXIxOworICB0eXBlZGVmIGludGVybmFsOjppbnRlcnNlY3Rvcl9oZWxwZXIyPHR5cGVuYW1lIEJWSDI6OlZvbHVtZSwgdHlwZW5hbWUgQlZIMjo6T2JqZWN0LCB0eXBlbmFtZSBCVkgxOjpPYmplY3QsIEludGVyc2VjdG9yPiBIZWxwZXIyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6OlZvbHVtZUl0ZXJhdG9yIFZvbEl0ZXIxOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6Ok9iamVjdEl0ZXJhdG9yIE9iakl0ZXIxOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDI6OlZvbHVtZUl0ZXJhdG9yIFZvbEl0ZXIyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDI6Ok9iamVjdEl0ZXJhdG9yIE9iakl0ZXIyOworCisgIFZvbEl0ZXIxIHZCZWdpbjEgPSBWb2xJdGVyMSgpLCB2RW5kMSA9IFZvbEl0ZXIxKCk7CisgIE9iakl0ZXIxIG9CZWdpbjEgPSBPYmpJdGVyMSgpLCBvRW5kMSA9IE9iakl0ZXIxKCk7CisgIFZvbEl0ZXIyIHZCZWdpbjIgPSBWb2xJdGVyMigpLCB2RW5kMiA9IFZvbEl0ZXIyKCksIHZDdXIyID0gVm9sSXRlcjIoKTsKKyAgT2JqSXRlcjIgb0JlZ2luMiA9IE9iakl0ZXIyKCksIG9FbmQyID0gT2JqSXRlcjIoKSwgb0N1cjIgPSBPYmpJdGVyMigpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbmRleDEsIEluZGV4Mj4gPiB0b2RvKDEsIHN0ZDo6bWFrZV9wYWlyKHRyZWUxLmdldFJvb3RJbmRleCgpLCB0cmVlMi5nZXRSb290SW5kZXgoKSkpOworCisgIHdoaWxlKCF0b2RvLmVtcHR5KCkpIHsKKyAgICB0cmVlMS5nZXRDaGlsZHJlbih0b2RvLmJhY2soKS5maXJzdCwgdkJlZ2luMSwgdkVuZDEsIG9CZWdpbjEsIG9FbmQxKTsKKyAgICB0cmVlMi5nZXRDaGlsZHJlbih0b2RvLmJhY2soKS5zZWNvbmQsIHZCZWdpbjIsIHZFbmQyLCBvQmVnaW4yLCBvRW5kMik7CisgICAgdG9kby5wb3BfYmFjaygpOworCisgICAgZm9yKDsgdkJlZ2luMSAhPSB2RW5kMTsgKyt2QmVnaW4xKSB7IC8vZ28gdGhyb3VnaCBjaGlsZCB2b2x1bWVzIG9mIGZpcnN0IHRyZWUKKyAgICAgIGNvbnN0IHR5cGVuYW1lIEJWSDE6OlZvbHVtZSAmdm9sMSA9IHRyZWUxLmdldFZvbHVtZSgqdkJlZ2luMSk7CisgICAgICBmb3IodkN1cjIgPSB2QmVnaW4yOyB2Q3VyMiAhPSB2RW5kMjsgKyt2Q3VyMikgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBpZihpbnRlcnNlY3Rvci5pbnRlcnNlY3RWb2x1bWVWb2x1bWUodm9sMSwgdHJlZTIuZ2V0Vm9sdW1lKCp2Q3VyMikpKQorICAgICAgICAgIHRvZG8ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCp2QmVnaW4xLCAqdkN1cjIpKTsKKyAgICAgIH0KKworICAgICAgZm9yKG9DdXIyID0gb0JlZ2luMjsgb0N1cjIgIT0gb0VuZDI7ICsrb0N1cjIpIHsvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBIZWxwZXIxIGhlbHBlcigqb0N1cjIsIGludGVyc2VjdG9yKTsKKyAgICAgICAgaWYoaW50ZXJuYWw6OmludGVyc2VjdF9oZWxwZXIodHJlZTEsIGhlbHBlciwgKnZCZWdpbjEpKQorICAgICAgICAgIHJldHVybjsgLy9pbnRlcnNlY3RvciBzYWlkIHRvIHN0b3AgcXVlcnkKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoOyBvQmVnaW4xICE9IG9FbmQxOyArK29CZWdpbjEpIHsgLy9nbyB0aHJvdWdoIGNoaWxkIG9iamVjdHMgb2YgZmlyc3QgdHJlZQorICAgICAgZm9yKHZDdXIyID0gdkJlZ2luMjsgdkN1cjIgIT0gdkVuZDI7ICsrdkN1cjIpIHsgLy9nbyB0aHJvdWdoIGNoaWxkIHZvbHVtZXMgb2Ygc2Vjb25kIHRyZWUKKyAgICAgICAgSGVscGVyMiBoZWxwZXIoKm9CZWdpbjEsIGludGVyc2VjdG9yKTsKKyAgICAgICAgaWYoaW50ZXJuYWw6OmludGVyc2VjdF9oZWxwZXIodHJlZTIsIGhlbHBlciwgKnZDdXIyKSkKKyAgICAgICAgICByZXR1cm47IC8vaW50ZXJzZWN0b3Igc2FpZCB0byBzdG9wIHF1ZXJ5CisgICAgICB9CisKKyAgICAgIGZvcihvQ3VyMiA9IG9CZWdpbjI7IG9DdXIyICE9IG9FbmQyOyArK29DdXIyKSB7Ly9nbyB0aHJvdWdoIGNoaWxkIG9iamVjdHMgb2Ygc2Vjb25kIHRyZWUKKyAgICAgICAgaWYoaW50ZXJzZWN0b3IuaW50ZXJzZWN0T2JqZWN0T2JqZWN0KCpvQmVnaW4xLCAqb0N1cjIpKQorICAgICAgICAgIHJldHVybjsgLy9pbnRlcnNlY3RvciBzYWlkIHRvIHN0b3AgcXVlcnkKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgQlZILCB0eXBlbmFtZSBNaW5pbWl6ZXI+Cit0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBtaW5pbWl6ZV9oZWxwZXIoY29uc3QgQlZIICZ0cmVlLCBNaW5pbWl6ZXIgJm1pbmltaXplciwgdHlwZW5hbWUgQlZIOjpJbmRleCByb290LCB0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBtaW5pbXVtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkg6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHN0ZDo6cGFpcjxTY2FsYXIsIEluZGV4PiBRdWV1ZUVsZW1lbnQ7IC8vZmlyc3QgZWxlbWVudCBpcyBwcmlvcml0eQorICB0eXBlZGVmIHR5cGVuYW1lIEJWSDo6Vm9sdW1lSXRlcmF0b3IgVm9sSXRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkg6Ok9iamVjdEl0ZXJhdG9yIE9iakl0ZXI7CisKKyAgVm9sSXRlciB2QmVnaW4gPSBWb2xJdGVyKCksIHZFbmQgPSBWb2xJdGVyKCk7CisgIE9iakl0ZXIgb0JlZ2luID0gT2JqSXRlcigpLCBvRW5kID0gT2JqSXRlcigpOworICBzdGQ6OnByaW9yaXR5X3F1ZXVlPFF1ZXVlRWxlbWVudCwgc3RkOjp2ZWN0b3I8UXVldWVFbGVtZW50Piwgc3RkOjpncmVhdGVyPFF1ZXVlRWxlbWVudD4gPiB0b2RvOyAvL3NtYWxsZXN0IGlzIGF0IHRoZSB0b3AKKworICB0b2RvLnB1c2goc3RkOjptYWtlX3BhaXIoU2NhbGFyKCksIHJvb3QpKTsKKworICB3aGlsZSghdG9kby5lbXB0eSgpKSB7CisgICAgdHJlZS5nZXRDaGlsZHJlbih0b2RvLnRvcCgpLnNlY29uZCwgdkJlZ2luLCB2RW5kLCBvQmVnaW4sIG9FbmQpOworICAgIHRvZG8ucG9wKCk7CisKKyAgICBmb3IoOyBvQmVnaW4gIT0gb0VuZDsgKytvQmVnaW4pIC8vZ28gdGhyb3VnaCBjaGlsZCBvYmplY3RzCisgICAgICBtaW5pbXVtID0gKHN0ZDo6bWluKShtaW5pbXVtLCBtaW5pbWl6ZXIubWluaW11bU9uT2JqZWN0KCpvQmVnaW4pKTsKKworICAgIGZvcig7IHZCZWdpbiAhPSB2RW5kOyArK3ZCZWdpbikgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcworICAgICAgU2NhbGFyIHZhbCA9IG1pbmltaXplci5taW5pbXVtT25Wb2x1bWUodHJlZS5nZXRWb2x1bWUoKnZCZWdpbikpOworICAgICAgaWYodmFsIDwgbWluaW11bSkKKyAgICAgICAgdG9kby5wdXNoKHN0ZDo6bWFrZV9wYWlyKHZhbCwgKnZCZWdpbikpOworICAgIH0KKyAgfQorCisgIHJldHVybiBtaW5pbXVtOworfQorI2VuZGlmIC8vbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKwordGVtcGxhdGU8dHlwZW5hbWUgVm9sdW1lMSwgdHlwZW5hbWUgT2JqZWN0MSwgdHlwZW5hbWUgT2JqZWN0MiwgdHlwZW5hbWUgTWluaW1pemVyPgorc3RydWN0IG1pbmltaXplcl9oZWxwZXIxCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWluaW1pemVyOjpTY2FsYXIgU2NhbGFyOworICBtaW5pbWl6ZXJfaGVscGVyMShjb25zdCBPYmplY3QyICZpblN0b3JlZCwgTWluaW1pemVyICZtKSA6IHN0b3JlZChpblN0b3JlZCksIG1pbmltaXplcihtKSB7fQorICBTY2FsYXIgbWluaW11bU9uVm9sdW1lKGNvbnN0IFZvbHVtZTEgJnZvbCkgeyByZXR1cm4gbWluaW1pemVyLm1pbmltdW1PblZvbHVtZU9iamVjdCh2b2wsIHN0b3JlZCk7IH0KKyAgU2NhbGFyIG1pbmltdW1Pbk9iamVjdChjb25zdCBPYmplY3QxICZvYmopIHsgcmV0dXJuIG1pbmltaXplci5taW5pbXVtT25PYmplY3RPYmplY3Qob2JqLCBzdG9yZWQpOyB9CisgIE9iamVjdDIgc3RvcmVkOworICBNaW5pbWl6ZXIgJm1pbmltaXplcjsKK3ByaXZhdGU6CisgIG1pbmltaXplcl9oZWxwZXIxJiBvcGVyYXRvcj0oY29uc3QgbWluaW1pemVyX2hlbHBlcjEmKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZvbHVtZTIsIHR5cGVuYW1lIE9iamVjdDIsIHR5cGVuYW1lIE9iamVjdDEsIHR5cGVuYW1lIE1pbmltaXplcj4KK3N0cnVjdCBtaW5pbWl6ZXJfaGVscGVyMgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIFNjYWxhcjsKKyAgbWluaW1pemVyX2hlbHBlcjIoY29uc3QgT2JqZWN0MSAmaW5TdG9yZWQsIE1pbmltaXplciAmbSkgOiBzdG9yZWQoaW5TdG9yZWQpLCBtaW5pbWl6ZXIobSkge30KKyAgU2NhbGFyIG1pbmltdW1PblZvbHVtZShjb25zdCBWb2x1bWUyICZ2b2wpIHsgcmV0dXJuIG1pbmltaXplci5taW5pbXVtT25PYmplY3RWb2x1bWUoc3RvcmVkLCB2b2wpOyB9CisgIFNjYWxhciBtaW5pbXVtT25PYmplY3QoY29uc3QgT2JqZWN0MiAmb2JqKSB7IHJldHVybiBtaW5pbWl6ZXIubWluaW11bU9uT2JqZWN0T2JqZWN0KHN0b3JlZCwgb2JqKTsgfQorICBPYmplY3QxIHN0b3JlZDsKKyAgTWluaW1pemVyICZtaW5pbWl6ZXI7Citwcml2YXRlOgorICBtaW5pbWl6ZXJfaGVscGVyMiYgb3BlcmF0b3I9KGNvbnN0IG1pbmltaXplcl9oZWxwZXIyJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqICBHaXZlbiBhIEJWSCwgcnVucyB0aGUgcXVlcnkgZW5jYXBzdWxhdGVkIGJ5IFxhIG1pbmltaXplci4KKyAgKiAgXHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuCisgICogIFRoZSBNaW5pbWl6ZXIgdHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOiBcY29kZQorICAgICB0eXBlZGVmIFNjYWxhciAvL3RoZSBudW1lcmljIHR5cGUgb2Ygd2hhdCBpcyBiZWluZyBtaW5pbWl6ZWQtLW5vdCBuZWNlc3NhcmlseSB0aGUgU2NhbGFyIHR5cGUgb2YgdGhlIEJWSCAoaWYgaXQgaGFzIG9uZSkKKyAgICAgU2NhbGFyIG1pbmltdW1PblZvbHVtZShjb25zdCBCVkg6OlZvbHVtZSAmdm9sdW1lKQorICAgICBTY2FsYXIgbWluaW11bU9uT2JqZWN0KGNvbnN0IEJWSDo6T2JqZWN0ICZvYmplY3QpCisgIFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgsIHR5cGVuYW1lIE1pbmltaXplcj4KK3R5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIEJWTWluaW1pemUoY29uc3QgQlZIICZ0cmVlLCBNaW5pbWl6ZXIgJm1pbmltaXplcikKK3sKKyAgcmV0dXJuIGludGVybmFsOjptaW5pbWl6ZV9oZWxwZXIodHJlZSwgbWluaW1pemVyLCB0cmVlLmdldFJvb3RJbmRleCgpLCAoc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhcj46Om1heCkoKSk7Cit9CisKKy8qKiAgR2l2ZW4gdHdvIEJWSCdzLCBydW5zIHRoZSBxdWVyeSBvbiB0aGVpciBjYXJ0ZXNpYW4gcHJvZHVjdCBlbmNhcHN1bGF0ZWQgYnkgXGEgbWluaW1pemVyLgorICAqICBccmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS4KKyAgKiAgVGhlIE1pbmltaXplciB0eXBlIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1lbWJlcnM6IFxjb2RlCisgICAgIHR5cGVkZWYgU2NhbGFyIC8vdGhlIG51bWVyaWMgdHlwZSBvZiB3aGF0IGlzIGJlaW5nIG1pbmltaXplZC0tbm90IG5lY2Vzc2FyaWx5IHRoZSBTY2FsYXIgdHlwZSBvZiB0aGUgQlZIIChpZiBpdCBoYXMgb25lKQorICAgICBTY2FsYXIgbWluaW11bU9uVm9sdW1lVm9sdW1lKGNvbnN0IEJWSDE6OlZvbHVtZSAmdjEsIGNvbnN0IEJWSDI6OlZvbHVtZSAmdjIpCisgICAgIFNjYWxhciBtaW5pbXVtT25Wb2x1bWVPYmplY3QoY29uc3QgQlZIMTo6Vm9sdW1lICZ2MSwgY29uc3QgQlZIMjo6T2JqZWN0ICZvMikKKyAgICAgU2NhbGFyIG1pbmltdW1Pbk9iamVjdFZvbHVtZShjb25zdCBCVkgxOjpPYmplY3QgJm8xLCBjb25zdCBCVkgyOjpWb2x1bWUgJnYyKQorICAgICBTY2FsYXIgbWluaW11bU9uT2JqZWN0T2JqZWN0KGNvbnN0IEJWSDE6Ok9iamVjdCAmbzEsIGNvbnN0IEJWSDI6Ok9iamVjdCAmbzIpCisgIFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgxLCB0eXBlbmFtZSBCVkgyLCB0eXBlbmFtZSBNaW5pbWl6ZXI+Cit0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBCVk1pbmltaXplKGNvbnN0IEJWSDEgJnRyZWUxLCBjb25zdCBCVkgyICZ0cmVlMiwgTWluaW1pemVyICZtaW5pbWl6ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWluaW1pemVyOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6OkluZGV4IEluZGV4MTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgyOjpJbmRleCBJbmRleDI7CisgIHR5cGVkZWYgaW50ZXJuYWw6Om1pbmltaXplcl9oZWxwZXIxPHR5cGVuYW1lIEJWSDE6OlZvbHVtZSwgdHlwZW5hbWUgQlZIMTo6T2JqZWN0LCB0eXBlbmFtZSBCVkgyOjpPYmplY3QsIE1pbmltaXplcj4gSGVscGVyMTsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6bWluaW1pemVyX2hlbHBlcjI8dHlwZW5hbWUgQlZIMjo6Vm9sdW1lLCB0eXBlbmFtZSBCVkgyOjpPYmplY3QsIHR5cGVuYW1lIEJWSDE6Ok9iamVjdCwgTWluaW1pemVyPiBIZWxwZXIyOworICB0eXBlZGVmIHN0ZDo6cGFpcjxTY2FsYXIsIHN0ZDo6cGFpcjxJbmRleDEsIEluZGV4Mj4gPiBRdWV1ZUVsZW1lbnQ7IC8vZmlyc3QgZWxlbWVudCBpcyBwcmlvcml0eQorICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6OlZvbHVtZUl0ZXJhdG9yIFZvbEl0ZXIxOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6Ok9iamVjdEl0ZXJhdG9yIE9iakl0ZXIxOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDI6OlZvbHVtZUl0ZXJhdG9yIFZvbEl0ZXIyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDI6Ok9iamVjdEl0ZXJhdG9yIE9iakl0ZXIyOworCisgIFZvbEl0ZXIxIHZCZWdpbjEgPSBWb2xJdGVyMSgpLCB2RW5kMSA9IFZvbEl0ZXIxKCk7CisgIE9iakl0ZXIxIG9CZWdpbjEgPSBPYmpJdGVyMSgpLCBvRW5kMSA9IE9iakl0ZXIxKCk7CisgIFZvbEl0ZXIyIHZCZWdpbjIgPSBWb2xJdGVyMigpLCB2RW5kMiA9IFZvbEl0ZXIyKCksIHZDdXIyID0gVm9sSXRlcjIoKTsKKyAgT2JqSXRlcjIgb0JlZ2luMiA9IE9iakl0ZXIyKCksIG9FbmQyID0gT2JqSXRlcjIoKSwgb0N1cjIgPSBPYmpJdGVyMigpOworICBzdGQ6OnByaW9yaXR5X3F1ZXVlPFF1ZXVlRWxlbWVudCwgc3RkOjp2ZWN0b3I8UXVldWVFbGVtZW50Piwgc3RkOjpncmVhdGVyPFF1ZXVlRWxlbWVudD4gPiB0b2RvOyAvL3NtYWxsZXN0IGlzIGF0IHRoZSB0b3AKKworICBTY2FsYXIgbWluaW11bSA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1heCkoKTsKKyAgdG9kby5wdXNoKHN0ZDo6bWFrZV9wYWlyKFNjYWxhcigpLCBzdGQ6Om1ha2VfcGFpcih0cmVlMS5nZXRSb290SW5kZXgoKSwgdHJlZTIuZ2V0Um9vdEluZGV4KCkpKSk7CisKKyAgd2hpbGUoIXRvZG8uZW1wdHkoKSkgeworICAgIHRyZWUxLmdldENoaWxkcmVuKHRvZG8udG9wKCkuc2Vjb25kLmZpcnN0LCB2QmVnaW4xLCB2RW5kMSwgb0JlZ2luMSwgb0VuZDEpOworICAgIHRyZWUyLmdldENoaWxkcmVuKHRvZG8udG9wKCkuc2Vjb25kLnNlY29uZCwgdkJlZ2luMiwgdkVuZDIsIG9CZWdpbjIsIG9FbmQyKTsKKyAgICB0b2RvLnBvcCgpOworCisgICAgZm9yKDsgb0JlZ2luMSAhPSBvRW5kMTsgKytvQmVnaW4xKSB7IC8vZ28gdGhyb3VnaCBjaGlsZCBvYmplY3RzIG9mIGZpcnN0IHRyZWUKKyAgICAgIGZvcihvQ3VyMiA9IG9CZWdpbjI7IG9DdXIyICE9IG9FbmQyOyArK29DdXIyKSB7Ly9nbyB0aHJvdWdoIGNoaWxkIG9iamVjdHMgb2Ygc2Vjb25kIHRyZWUKKyAgICAgICAgbWluaW11bSA9IChzdGQ6Om1pbikobWluaW11bSwgbWluaW1pemVyLm1pbmltdW1Pbk9iamVjdE9iamVjdCgqb0JlZ2luMSwgKm9DdXIyKSk7CisgICAgICB9CisKKyAgICAgIGZvcih2Q3VyMiA9IHZCZWdpbjI7IHZDdXIyICE9IHZFbmQyOyArK3ZDdXIyKSB7IC8vZ28gdGhyb3VnaCBjaGlsZCB2b2x1bWVzIG9mIHNlY29uZCB0cmVlCisgICAgICAgIEhlbHBlcjIgaGVscGVyKCpvQmVnaW4xLCBtaW5pbWl6ZXIpOworICAgICAgICBtaW5pbXVtID0gKHN0ZDo6bWluKShtaW5pbXVtLCBpbnRlcm5hbDo6bWluaW1pemVfaGVscGVyKHRyZWUyLCBoZWxwZXIsICp2Q3VyMiwgbWluaW11bSkpOworICAgICAgfQorICAgIH0KKworICAgIGZvcig7IHZCZWdpbjEgIT0gdkVuZDE7ICsrdkJlZ2luMSkgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcyBvZiBmaXJzdCB0cmVlCisgICAgICBjb25zdCB0eXBlbmFtZSBCVkgxOjpWb2x1bWUgJnZvbDEgPSB0cmVlMS5nZXRWb2x1bWUoKnZCZWdpbjEpOworCisgICAgICBmb3Iob0N1cjIgPSBvQmVnaW4yOyBvQ3VyMiAhPSBvRW5kMjsgKytvQ3VyMikgey8vZ28gdGhyb3VnaCBjaGlsZCBvYmplY3RzIG9mIHNlY29uZCB0cmVlCisgICAgICAgIEhlbHBlcjEgaGVscGVyKCpvQ3VyMiwgbWluaW1pemVyKTsKKyAgICAgICAgbWluaW11bSA9IChzdGQ6Om1pbikobWluaW11bSwgaW50ZXJuYWw6Om1pbmltaXplX2hlbHBlcih0cmVlMSwgaGVscGVyLCAqdkJlZ2luMSwgbWluaW11bSkpOworICAgICAgfQorCisgICAgICBmb3IodkN1cjIgPSB2QmVnaW4yOyB2Q3VyMiAhPSB2RW5kMjsgKyt2Q3VyMikgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBTY2FsYXIgdmFsID0gbWluaW1pemVyLm1pbmltdW1PblZvbHVtZVZvbHVtZSh2b2wxLCB0cmVlMi5nZXRWb2x1bWUoKnZDdXIyKSk7CisgICAgICAgIGlmKHZhbCA8IG1pbmltdW0pCisgICAgICAgICAgdG9kby5wdXNoKHN0ZDo6bWFrZV9wYWlyKHZhbCwgc3RkOjptYWtlX3BhaXIoKnZCZWdpbjEsICp2Q3VyMikpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1pbmltdW07Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQlZBTEdPUklUSE1TX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvS2RCVkguaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvS2RCVkguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9LZEJWSC5oCkBAIC0wLDAgKzEsMjIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBJbHlhIEJhcmFuIDxpYmFyYW5AbWl0LmVkdT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgS0RCVkhfSF9JTkNMVURFRAorI2RlZmluZSBLREJWSF9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvL2ludGVybmFsIHBhaXIgY2xhc3MgZm9yIHRoZSBCVkgtLXVzZWQgaW5zdGVhZCBvZiBzdGQ6OnBhaXIgYmVjYXVzZSBvZiBhbGlnbm1lbnQKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3N0cnVjdCB2ZWN0b3JfaW50X3BhaXIKK3sKK0VJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoU2NhbGFyLCBEaW0pCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltLCAxPiBWZWN0b3JUeXBlOworCisgIHZlY3Rvcl9pbnRfcGFpcihjb25zdCBWZWN0b3JUeXBlICZ2LCBpbnQgaSkgOiBmaXJzdCh2KSwgc2Vjb25kKGkpIHt9CisKKyAgVmVjdG9yVHlwZSBmaXJzdDsKKyAgaW50IHNlY29uZDsKK307CisKKy8vdGhlc2UgdGVtcGxhdGVzIGhlbHAgdGhlIHRyZWUgaW5pdGlhbGl6ZXIgZ2V0IHRoZSBib3VuZGluZyBib3hlcyBlaXRoZXIgZnJvbSBhIHByb3ZpZGVkCisvL2l0ZXJhdG9yIHJhbmdlIG9yIHVzaW5nIGJvdW5kaW5nX2JveCBpbiBhIHVuaWZpZWQgd2F5Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RMaXN0LCB0eXBlbmFtZSBWb2x1bWVMaXN0LCB0eXBlbmFtZSBCb3hJdGVyPgorc3RydWN0IGdldF9ib3hlc19oZWxwZXIgeworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgT2JqZWN0TGlzdCAmb2JqZWN0cywgQm94SXRlciBib3hCZWdpbiwgQm94SXRlciBib3hFbmQsIFZvbHVtZUxpc3QgJm91dEJveGVzKQorICB7CisgICAgb3V0Qm94ZXMuaW5zZXJ0KG91dEJveGVzLmVuZCgpLCBib3hCZWdpbiwgYm94RW5kKTsKKyAgICBlaWdlbl9hc3NlcnQob3V0Qm94ZXMuc2l6ZSgpID09IG9iamVjdHMuc2l6ZSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0TGlzdCwgdHlwZW5hbWUgVm9sdW1lTGlzdD4KK3N0cnVjdCBnZXRfYm94ZXNfaGVscGVyPE9iamVjdExpc3QsIFZvbHVtZUxpc3QsIGludD4geworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgT2JqZWN0TGlzdCAmb2JqZWN0cywgaW50LCBpbnQsIFZvbHVtZUxpc3QgJm91dEJveGVzKQorICB7CisgICAgb3V0Qm94ZXMucmVzZXJ2ZShvYmplY3RzLnNpemUoKSk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IChpbnQpb2JqZWN0cy5zaXplKCk7ICsraSkKKyAgICAgIG91dEJveGVzLnB1c2hfYmFjayhib3VuZGluZ19ib3gob2JqZWN0c1tpXSkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvKiogXGNsYXNzIEtkQlZICisgKiAgXGJyaWVmIEEgc2ltcGxlIGJvdW5kaW5nIHZvbHVtZSBoaWVyYXJjaHkgYmFzZWQgb24gQWxpZ25lZEJveAorICoKKyAqICBccGFyYW0gX1NjYWxhciBUaGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiB0aGUgYm91bmRpbmcgYm94ZXMKKyAqICBccGFyYW0gX0RpbSBUaGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSBpbiB3aGljaCB0aGUgaGllcmFyY2h5IGxpdmVzCisgKiAgXHBhcmFtIF9PYmplY3QgVGhlIG9iamVjdCB0eXBlIHRoYXQgbGl2ZXMgaW4gdGhlIGhpZXJhcmNoeS4gIEl0IG11c3QgaGF2ZSB2YWx1ZSBzZW1hbnRpY3MuICBFaXRoZXIgYm91bmRpbmdfYm94KF9PYmplY3QpIG11c3QKKyAqICAgICAgICAgICAgICAgICBiZSBkZWZpbmVkIGFuZCByZXR1cm4gYW4gQWxpZ25lZEJveDxfU2NhbGFyLCBfRGltPiBvciBib3VuZGluZyBib3hlcyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZSB0cmVlIGluaXRpYWxpemVyLgorICoKKyAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIChhcyBvcHBvc2VkIHRvIG9wdGltaXplZCkgaW1wbGVtZW50YXRpb24gb2YgYSBib3VuZGluZyB2b2x1bWUgaGllcmFyY2h5IGFuYWxvZ291cyB0byBhIEtkLXRyZWUuCisgKiAgR2l2ZW4gYSBzZXF1ZW5jZSBvZiBvYmplY3RzLCBpdCBjb21wdXRlcyB0aGVpciBib3VuZGluZyBib3hlcywgY29uc3RydWN0cyBhIEtkLXRyZWUgb2YgdGhlaXIgY2VudGVycworICogIGFuZCBidWlsZHMgYSBCVkggd2l0aCB0aGUgc3RydWN0dXJlIG9mIHRoYXQgS2QtdHJlZS4gIFdoZW4gdGhlIGVsZW1lbnRzIG9mIHRoZSB0cmVlIGFyZSB0b28gZXhwZW5zaXZlIHRvIGJlIGNvcGllZCBhcm91bmQsCisgKiAgaXQgaXMgdXNlZnVsIGZvciBfT2JqZWN0IHRvIGJlIGEgcG9pbnRlci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIHR5cGVuYW1lIF9PYmplY3Q+IGNsYXNzIEtkQlZICit7CitwdWJsaWM6CisgIGVudW0geyBEaW0gPSBfRGltIH07CisgIHR5cGVkZWYgX09iamVjdCBPYmplY3Q7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8T2JqZWN0LCBhbGlnbmVkX2FsbG9jYXRvcjxPYmplY3Q+ID4gT2JqZWN0TGlzdDsKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBBbGlnbmVkQm94PFNjYWxhciwgRGltPiBWb2x1bWU7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Vm9sdW1lLCBhbGlnbmVkX2FsbG9jYXRvcjxWb2x1bWU+ID4gVm9sdW1lTGlzdDsKKyAgdHlwZWRlZiBpbnQgSW5kZXg7CisgIHR5cGVkZWYgY29uc3QgaW50ICpWb2x1bWVJdGVyYXRvcjsgLy90aGUgaXRlcmF0b3JzIGFyZSBqdXN0IHBvaW50ZXJzIGludG8gdGhlIHRyZWUncyB2ZWN0b3JzCisgIHR5cGVkZWYgY29uc3QgT2JqZWN0ICpPYmplY3RJdGVyYXRvcjsKKworICBLZEJWSCgpIHt9CisKKyAgLyoqIEdpdmVuIGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgXGEgT2JqZWN0IHJlZmVyZW5jZXMsIGNvbnN0cnVjdHMgdGhlIEJWSC4gIFJlcXVpcmVzIHRoYXQgYm91bmRpbmdfYm94KE9iamVjdCkgcmV0dXJuIGEgVm9sdW1lLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyPiBLZEJWSChJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeyBpbml0KGJlZ2luLCBlbmQsIDAsIDApOyB9IC8vaW50IGlzIHJlY29nbml6ZWQgYnkgaW5pdCBhcyBub3QgYmVpbmcgYW4gaXRlcmF0b3IgdHlwZQorCisgIC8qKiBHaXZlbiBhbiBpdGVyYXRvciByYW5nZSBvdmVyIFxhIE9iamVjdCByZWZlcmVuY2VzIGFuZCBhbiBpdGVyYXRvciByYW5nZSBvdmVyIHRoZWlyIGJvdW5kaW5nIGJveGVzLCBjb25zdHJ1Y3RzIHRoZSBCVkggKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT0l0ZXIsIHR5cGVuYW1lIEJJdGVyPiBLZEJWSChPSXRlciBiZWdpbiwgT0l0ZXIgZW5kLCBCSXRlciBib3hCZWdpbiwgQkl0ZXIgYm94RW5kKSB7IGluaXQoYmVnaW4sIGVuZCwgYm94QmVnaW4sIGJveEVuZCk7IH0KKworICAvKiogR2l2ZW4gYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciBcYSBPYmplY3QgcmVmZXJlbmNlcywgY29uc3RydWN0cyB0aGUgQlZILCBvdmVyd3JpdGluZyB3aGF0ZXZlciBpcyBpbiB0aGVyZSBjdXJyZW50bHkuCisgICAgKiBSZXF1aXJlcyB0aGF0IGJvdW5kaW5nX2JveChPYmplY3QpIHJldHVybiBhIFZvbHVtZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRlcj4gdm9pZCBpbml0KEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKSB7IGluaXQoYmVnaW4sIGVuZCwgMCwgMCk7IH0KKworICAvKiogR2l2ZW4gYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciBcYSBPYmplY3QgcmVmZXJlbmNlcyBhbmQgYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciB0aGVpciBib3VuZGluZyBib3hlcywKKyAgICAqIGNvbnN0cnVjdHMgdGhlIEJWSCwgb3ZlcndyaXRpbmcgd2hhdGV2ZXIgaXMgaW4gdGhlcmUgY3VycmVudGx5LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPSXRlciwgdHlwZW5hbWUgQkl0ZXI+IHZvaWQgaW5pdChPSXRlciBiZWdpbiwgT0l0ZXIgZW5kLCBCSXRlciBib3hCZWdpbiwgQkl0ZXIgYm94RW5kKQorICB7CisgICAgb2JqZWN0cy5jbGVhcigpOworICAgIGJveGVzLmNsZWFyKCk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKKworICAgIG9iamVjdHMuaW5zZXJ0KG9iamVjdHMuZW5kKCksIGJlZ2luLCBlbmQpOworICAgIGludCBuID0gc3RhdGljX2Nhc3Q8aW50PihvYmplY3RzLnNpemUoKSk7CisKKyAgICBpZihuIDwgMikKKyAgICAgIHJldHVybjsgLy9pZiB3ZSBoYXZlIGF0IG1vc3Qgb25lIG9iamVjdCwgd2UgZG9uJ3QgbmVlZCBhbnkgaW50ZXJuYWwgbm9kZXMKKworICAgIFZvbHVtZUxpc3Qgb2JqQm94ZXM7CisgICAgVklQYWlyTGlzdCBvYmpDZW50ZXJzOworCisgICAgLy9jb21wdXRlIHRoZSBib3VuZGluZyBib3hlcyBkZXBlbmRpbmcgb24gQkl0ZXIgdHlwZQorICAgIGludGVybmFsOjpnZXRfYm94ZXNfaGVscGVyPE9iamVjdExpc3QsIFZvbHVtZUxpc3QsIEJJdGVyPigpKG9iamVjdHMsIGJveEJlZ2luLCBib3hFbmQsIG9iakJveGVzKTsKKworICAgIG9iakNlbnRlcnMucmVzZXJ2ZShuKTsKKyAgICBib3hlcy5yZXNlcnZlKG4gLSAxKTsKKyAgICBjaGlsZHJlbi5yZXNlcnZlKDIgKiBuIC0gMik7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgb2JqQ2VudGVycy5wdXNoX2JhY2soVklQYWlyKG9iakJveGVzW2ldLmNlbnRlcigpLCBpKSk7CisKKyAgICBidWlsZChvYmpDZW50ZXJzLCAwLCBuLCBvYmpCb3hlcywgMCk7IC8vdGhlIHJlY3Vyc2l2ZSBwYXJ0IG9mIHRoZSBhbGdvcml0aG0KKworICAgIE9iamVjdExpc3QgdG1wKG4pOworICAgIHRtcC5zd2FwKG9iamVjdHMpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICBvYmplY3RzW2ldID0gdG1wW29iakNlbnRlcnNbaV0uc2Vjb25kXTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSAqLworICBpbmxpbmUgSW5kZXggZ2V0Um9vdEluZGV4KCkgY29uc3QgeyByZXR1cm4gKGludClib3hlcy5zaXplKCkgLSAxOyB9CisKKyAgLyoqIEdpdmVuIGFuIFxhIGluZGV4IG9mIGEgbm9kZSwgb24gZXhpdCwgXGEgb3V0VkJlZ2luIGFuZCBcYSBvdXRWRW5kIHJhbmdlIG92ZXIgdGhlIGluZGljZXMgb2YgdGhlIHZvbHVtZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorICAgICogYW5kIFxhIG91dE9CZWdpbiBhbmQgXGEgb3V0T0VuZCByYW5nZSBvdmVyIHRoZSBvYmplY3QgY2hpbGRyZW4gb2YgdGhlIG5vZGUgKi8KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGdldENoaWxkcmVuKEluZGV4IGluZGV4LCBWb2x1bWVJdGVyYXRvciAmb3V0VkJlZ2luLCBWb2x1bWVJdGVyYXRvciAmb3V0VkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEl0ZXJhdG9yICZvdXRPQmVnaW4sIE9iamVjdEl0ZXJhdG9yICZvdXRPRW5kKSBjb25zdAorICB7IC8vaW5saW5pbmcgdGhpcyBmdW5jdGlvbiBzaG91bGQgb3BlbiBsb3RzIG9mIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzIHRvIHRoZSBjb21waWxlcgorICAgIGlmKGluZGV4IDwgMCkgeworICAgICAgb3V0VkJlZ2luID0gb3V0VkVuZDsKKyAgICAgIGlmKCFvYmplY3RzLmVtcHR5KCkpCisgICAgICAgIG91dE9CZWdpbiA9ICYob2JqZWN0c1swXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgb2JqZWN0cy5zaXplKCk7IC8vb3V0cHV0IGFsbCBvYmplY3RzLS1uZWNlc3Nhcnkgd2hlbiB0aGUgdHJlZSBoYXMgb25seSBvbmUgb2JqZWN0CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUJveGVzID0gc3RhdGljX2Nhc3Q8aW50Pihib3hlcy5zaXplKCkpOworCisgICAgaW50IGlkeCA9IGluZGV4ICogMjsKKyAgICBpZihjaGlsZHJlbltpZHggKyAxXSA8IG51bUJveGVzKSB7IC8vc2Vjb25kIGluZGV4IGlzIGFsd2F5cyBiaWdnZXIKKyAgICAgIG91dFZCZWdpbiA9ICYoY2hpbGRyZW5baWR4XSk7CisgICAgICBvdXRWRW5kID0gb3V0VkJlZ2luICsgMjsKKyAgICAgIG91dE9CZWdpbiA9IG91dE9FbmQ7CisgICAgfQorICAgIGVsc2UgaWYoY2hpbGRyZW5baWR4XSA+PSBudW1Cb3hlcykgeyAvL2lmIGJvdGggY2hpbGRyZW4gYXJlIG9iamVjdHMKKyAgICAgIG91dFZCZWdpbiA9IG91dFZFbmQ7CisgICAgICBvdXRPQmVnaW4gPSAmKG9iamVjdHNbY2hpbGRyZW5baWR4XSAtIG51bUJveGVzXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgMjsKKyAgICB9IGVsc2UgeyAvL2lmIHRoZSBmaXJzdCBjaGlsZCBpcyBhIHZvbHVtZSBhbmQgdGhlIHNlY29uZCBpcyBhbiBvYmplY3QKKyAgICAgIG91dFZCZWdpbiA9ICYoY2hpbGRyZW5baWR4XSk7CisgICAgICBvdXRWRW5kID0gb3V0VkJlZ2luICsgMTsKKyAgICAgIG91dE9CZWdpbiA9ICYob2JqZWN0c1tjaGlsZHJlbltpZHggKyAxXSAtIG51bUJveGVzXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgMTsKKyAgICB9CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgbm9kZSBhdCBcYSBpbmRleCAqLworICBpbmxpbmUgY29uc3QgVm9sdW1lICZnZXRWb2x1bWUoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gYm94ZXNbaW5kZXhdOworICB9CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgaW50ZXJuYWw6OnZlY3Rvcl9pbnRfcGFpcjxTY2FsYXIsIERpbT4gVklQYWlyOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZJUGFpciwgYWxpZ25lZF9hbGxvY2F0b3I8VklQYWlyPiA+IFZJUGFpckxpc3Q7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltLCAxPiBWZWN0b3JUeXBlOworICBzdHJ1Y3QgVmVjdG9yQ29tcGFyYXRvciAvL2NvbXBhcmVzIHZlY3RvcnMsIG9yLCBtb3JlIHNwZWNpZmljYWxsLCBWSVBhaXJzIGFsb25nIGEgcGFydGljdWxhciBkaW1lbnNpb24KKyAgeworICAgIFZlY3RvckNvbXBhcmF0b3IoaW50IGluRGltKSA6IGRpbShpbkRpbSkge30KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFZJUGFpciAmdjEsIGNvbnN0IFZJUGFpciAmdjIpIGNvbnN0IHsgcmV0dXJuIHYxLmZpcnN0W2RpbV0gPCB2Mi5maXJzdFtkaW1dOyB9CisgICAgaW50IGRpbTsKKyAgfTsKKworICAvL0J1aWxkIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIGJldHdlZW4gb2JqZWN0c1tmcm9tXSBhbmQgb2JqZWN0c1t0b10gKG5vdCBpbmNsdWRpbmcgb2JqZWN0c1t0b10pLgorICAvL1RoaXMgcm91dGluZSBwYXJ0aXRpb25zIHRoZSBvYmpDZW50ZXJzIGluIFtmcm9tLCB0bykgYWxvbmcgdGhlIGRpbWVuc2lvbiBkaW0sIHJlY3Vyc2l2ZWx5IGNvbnN0cnVjdHMKKyAgLy90aGUgdHdvIGhhbHZlcywgYW5kIGFkZHMgdGhlaXIgcGFyZW50IG5vZGUuICBUT0RPOiBhIGNhY2hlLWZyaWVuZGxpZXIgbGF5b3V0CisgIHZvaWQgYnVpbGQoVklQYWlyTGlzdCAmb2JqQ2VudGVycywgaW50IGZyb20sIGludCB0bywgY29uc3QgVm9sdW1lTGlzdCAmb2JqQm94ZXMsIGludCBkaW0pCisgIHsKKyAgICBlaWdlbl9hc3NlcnQodG8gLSBmcm9tID4gMSk7CisgICAgaWYodG8gLSBmcm9tID09IDIpIHsKKyAgICAgIGJveGVzLnB1c2hfYmFjayhvYmpCb3hlc1tvYmpDZW50ZXJzW2Zyb21dLnNlY29uZF0ubWVyZ2VkKG9iakJveGVzW29iakNlbnRlcnNbZnJvbSArIDFdLnNlY29uZF0pKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhmcm9tICsgKGludClvYmplY3RzLnNpemUoKSAtIDEpOyAvL3RoZXJlIGFyZSBvYmplY3RzLnNpemUoKSAtIDEgdHJlZSBub2RlcworICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGZyb20gKyAoaW50KW9iamVjdHMuc2l6ZSgpKTsKKyAgICB9CisgICAgZWxzZSBpZih0byAtIGZyb20gPT0gMykgeworICAgICAgaW50IG1pZCA9IGZyb20gKyAyOworICAgICAgc3RkOjpudGhfZWxlbWVudChvYmpDZW50ZXJzLmJlZ2luKCkgKyBmcm9tLCBvYmpDZW50ZXJzLmJlZ2luKCkgKyBtaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmpDZW50ZXJzLmJlZ2luKCkgKyB0bywgVmVjdG9yQ29tcGFyYXRvcihkaW0pKTsgLy9wYXJ0aXRpb24KKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIGZyb20sIG1pZCwgb2JqQm94ZXMsIChkaW0gKyAxKSAlIERpbSk7CisgICAgICBpbnQgaWR4MSA9IChpbnQpYm94ZXMuc2l6ZSgpIC0gMTsKKyAgICAgIGJveGVzLnB1c2hfYmFjayhib3hlc1tpZHgxXS5tZXJnZWQob2JqQm94ZXNbb2JqQ2VudGVyc1ttaWRdLnNlY29uZF0pKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhpZHgxKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhtaWQgKyAoaW50KW9iamVjdHMuc2l6ZSgpIC0gMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IG1pZCA9IGZyb20gKyAodG8gLSBmcm9tKSAvIDI7CisgICAgICBudGhfZWxlbWVudChvYmpDZW50ZXJzLmJlZ2luKCkgKyBmcm9tLCBvYmpDZW50ZXJzLmJlZ2luKCkgKyBtaWQsCisgICAgICAgICAgICAgICAgICBvYmpDZW50ZXJzLmJlZ2luKCkgKyB0bywgVmVjdG9yQ29tcGFyYXRvcihkaW0pKTsgLy9wYXJ0aXRpb24KKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIGZyb20sIG1pZCwgb2JqQm94ZXMsIChkaW0gKyAxKSAlIERpbSk7CisgICAgICBpbnQgaWR4MSA9IChpbnQpYm94ZXMuc2l6ZSgpIC0gMTsKKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIG1pZCwgdG8sIG9iakJveGVzLCAoZGltICsgMSkgJSBEaW0pOworICAgICAgaW50IGlkeDIgPSAoaW50KWJveGVzLnNpemUoKSAtIDE7CisgICAgICBib3hlcy5wdXNoX2JhY2soYm94ZXNbaWR4MV0ubWVyZ2VkKGJveGVzW2lkeDJdKSk7CisgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soaWR4MSk7CisgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soaWR4Mik7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8aW50PiBjaGlsZHJlbjsgLy9jaGlsZHJlbiBvZiB4IGFyZSBjaGlsZHJlblsyeF0gYW5kIGNoaWxkcmVuWzJ4KzFdLCBpbmRpY2VzIGJpZ2dlciB0aGFuIGJveGVzLnNpemUoKSBpbmRleCBpbnRvIG9iamVjdHMuCisgIFZvbHVtZUxpc3QgYm94ZXM7CisgIE9iamVjdExpc3Qgb2JqZWN0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy9LREJWSF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQXJwYWNrU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0FycGFja1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZhOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0FycGFja1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApAQCAtMCwwICsxLDgwNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRGF2aWQgSGFybW9uIDxkaGFybW9uQGdtYWlsLmNvbT4KKy8vCisvLyBFaWdlbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorLy8gdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKy8vIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisvLyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBFaWdlbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKy8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgYW5kIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorLy8gRWlnZW4uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworI2lmbmRlZiBFSUdFTl9BUlBBQ0tHRU5FUkFMSVpFRFNFTEZBREpPSU5URUlHRU5TT0xWRVJfSAorI2RlZmluZSBFSUdFTl9BUlBBQ0tHRU5FUkFMSVpFRFNFTEZBREpPSU5URUlHRU5TT0xWRVJfSAorCisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFJlYWxTY2FsYXI+IHN0cnVjdCBhcnBhY2tfd3JhcHBlcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4U29sdmVyLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTY2FsYXIsIGJvb2wgQmlzU1BEPiBzdHJ1Y3QgT1A7Cit9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBNYXRyaXhTb2x2ZXI9U2ltcGxpY2lhbExMVDxNYXRyaXhUeXBlPiwgYm9vbCBCaXNTUEQ9ZmFsc2U+CitjbGFzcyBBcnBhY2tHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKK3sKK3B1YmxpYzoKKyAgLy90eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFNvbHZlcjo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgIC8qKiBcYnJpZWYgU2NhbGFyIHR5cGUgZm9yIG1hdHJpY2VzIG9mIHR5cGUgXHAgTWF0cml4VHlwZS4gKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIC8qKiBcYnJpZWYgUmVhbCBzY2FsYXIgdHlwZSBmb3IgXHAgTWF0cml4VHlwZS4KKyAgICoKKyAgICogVGhpcyBpcyBqdXN0IFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzIHJlYWwgKGUuZy4sIFxjIGZsb2F0IG9yCisgICAqIFxjIFNjYWxhciksIGFuZCB0aGUgdHlwZSBvZiB0aGUgcmVhbCBwYXJ0IG9mIFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzCisgICAqIGNvbXBsZXguCisgICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgLyoqIFxicmllZiBUeXBlIGZvciB2ZWN0b3Igb2YgZWlnZW52YWx1ZXMgYXMgcmV0dXJuZWQgYnkgZWlnZW52YWx1ZXMoKS4KKyAgICoKKyAgICogVGhpcyBpcyBhIGNvbHVtbiB2ZWN0b3Igd2l0aCBlbnRyaWVzIG9mIHR5cGUgI1JlYWxTY2FsYXIuCisgICAqIFRoZSBsZW5ndGggb2YgdGhlIHZlY3RvciBpcyB0aGUgc2l6ZSBvZiBccCBuYnJFaWdlbnZhbHVlcy4KKyAgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXI+Ojp0eXBlIFJlYWxWZWN0b3JUeXBlOworCisgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgZm9yIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLgorICAgKgorICAgKi8KKyAgQXJwYWNrR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKCkKKyAgIDogbV9laXZlYygpLAorICAgICBtX2VpdmFsdWVzKCksCisgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgIG1fZWlnZW52ZWN0b3JzT2soZmFsc2UpLAorICAgICBtX25ickNvbnZlcmdlZCgwKSwKKyAgICAgbV9uYnJJdGVyYXRpb25zKDApCisgIHsgfQorCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3I7IGNvbXB1dGVzIGdlbmVyYWxpemVkIGVpZ2VudmFsdWVzIG9mIGdpdmVuIG1hdHJpeCB3aXRoIHJlc3BlY3QgdG8gYW5vdGhlciBtYXRyaXguCisgICAqCisgICAqIFxwYXJhbVtpbl0gQSBTZWxmLWFkam9pbnQgbWF0cml4IHdob3NlIGVpZ2VudmFsdWVzIC8gZWlnZW52ZWN0b3JzIHdpbGwKKyAgICogICAgY29tcHV0ZWQuIEJ5IGRlZmF1bHQsIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgaXMgdXNlZCwgYnV0IGNhbiBiZSBjaGFuZ2VkCisgICAqICAgIHRocm91Z2ggdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICogXHBhcmFtW2luXSBCIFNlbGYtYWRqb2ludCBtYXRyaXggZm9yIHRoZSBnZW5lcmFsaXplZCBlaWdlbnZhbHVlIHByb2JsZW0uCisgICAqIFxwYXJhbVtpbl0gbmJyRWlnZW52YWx1ZXMgVGhlIG51bWJlciBvZiBlaWdlbnZhbHVlcyAvIGVpZ2VudmVjdG9ycyB0byBjb21wdXRlLgorICAgKiAgICBNdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgbWF0cml4LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICogXHBhcmFtW2luXSBlaWdzX3NpZ21hIFN0cmluZyBjb250YWluaW5nIGVpdGhlciAiTE0iLCAiU00iLCAiTEEiLCBvciAiU0EiLCB3aXRoCisgICAqICAgIHJlc3BlY3RpdmUgbWVhbmluZ3MgdG8gZmluZCB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUgLCBzbWFsbGVzdCBtYWduaXR1ZGUsCisgICAqICAgIGxhcmdlc3QgYWxnZWJyYWljLCBvciBzbWFsbGVzdCBhbGdlYnJhaWMgZWlnZW52YWx1ZXMuIEFsdGVybmF0aXZlbHksIHRoaXMKKyAgICogICAgdmFsdWUgY2FuIGNvbnRhaW4gZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gc3RyaW5nIGZvcm0sIGluIHdoaWNoIGNhc2UgdGhlCisgICAqICAgIGVpZ2VudmFsdWVzIGNsb3Nlc3QgdG8gdGhpcyB2YWx1ZSB3aWxsIGJlIGZvdW5kLgorICAgKiBccGFyYW1baW5dICBvcHRpb25zIENhbiBiZSAjQ29tcHV0ZUVpZ2VudmVjdG9ycyAoZGVmYXVsdCkgb3IgI0VpZ2VudmFsdWVzT25seS4KKyAgICogXHBhcmFtW2luXSB0b2wgV2hhdCB0b2xlcmFuY2UgdG8gZmluZCB0aGUgZWlnZW52YWx1ZXMgdG8uIERlZmF1bHQgaXMgMCwgd2hpY2gKKyAgICogICAgbWVhbnMgbWFjaGluZSBwcmVjaXNpb24uCisgICAqCisgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgY29uc3QgTWF0cml4VHlwZSYsIEluZGV4LCBzdHJpbmcsIGludCwgUmVhbFNjYWxhcikKKyAgICogdG8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlIG1hdHJpeCBccCBBIHdpdGggcmVzcGVjdCB0byBccCBCLiBUaGUgZWlnZW52ZWN0b3JzIGFyZSBjb21wdXRlZCBpZgorICAgKiBccCBvcHRpb25zIGVxdWFscyAjQ29tcHV0ZUVpZ2VudmVjdG9ycy4KKyAgICoKKyAgICovCisgIEFycGFja0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXhUeXBlJiBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggbmJyRWlnZW52YWx1ZXMsIHN0ZDo6c3RyaW5nIGVpZ3Nfc2lnbWE9IkxNIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucz1Db21wdXRlRWlnZW52ZWN0b3JzLCBSZWFsU2NhbGFyIHRvbD0wLjApCisgICAgOiBtX2VpdmVjKCksCisgICAgICBtX2VpdmFsdWVzKCksCisgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgbV9laWdlbnZlY3RvcnNPayhmYWxzZSksCisgICAgICBtX25ickNvbnZlcmdlZCgwKSwKKyAgICAgIG1fbmJySXRlcmF0aW9ucygwKQorICB7CisgICAgY29tcHV0ZShBLCBCLCBuYnJFaWdlbnZhbHVlcywgZWlnc19zaWdtYSwgb3B0aW9ucywgdG9sKTsKKyAgfQorCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3I7IGNvbXB1dGVzIGVpZ2VudmFsdWVzIG9mIGdpdmVuIG1hdHJpeC4KKyAgICoKKyAgICogXHBhcmFtW2luXSBBIFNlbGYtYWRqb2ludCBtYXRyaXggd2hvc2UgZWlnZW52YWx1ZXMgLyBlaWdlbnZlY3RvcnMgd2lsbAorICAgKiAgICBjb21wdXRlZC4gQnkgZGVmYXVsdCwgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBpcyB1c2VkLCBidXQgY2FuIGJlIGNoYW5nZWQKKyAgICogICAgdGhyb3VnaCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgKiBccGFyYW1baW5dIG5ickVpZ2VudmFsdWVzIFRoZSBudW1iZXIgb2YgZWlnZW52YWx1ZXMgLyBlaWdlbnZlY3RvcnMgdG8gY29tcHV0ZS4KKyAgICogICAgTXVzdCBiZSBsZXNzIHRoYW4gdGhlIHNpemUgb2YgdGhlIGlucHV0IG1hdHJpeCwgb3IgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAqIFxwYXJhbVtpbl0gZWlnc19zaWdtYSBTdHJpbmcgY29udGFpbmluZyBlaXRoZXIgIkxNIiwgIlNNIiwgIkxBIiwgb3IgIlNBIiwgd2l0aAorICAgKiAgICByZXNwZWN0aXZlIG1lYW5pbmdzIHRvIGZpbmQgdGhlIGxhcmdlc3QgbWFnbml0dWRlICwgc21hbGxlc3QgbWFnbml0dWRlLAorICAgKiAgICBsYXJnZXN0IGFsZ2VicmFpYywgb3Igc21hbGxlc3QgYWxnZWJyYWljIGVpZ2VudmFsdWVzLiBBbHRlcm5hdGl2ZWx5LCB0aGlzCisgICAqICAgIHZhbHVlIGNhbiBjb250YWluIGZsb2F0aW5nIHBvaW50IHZhbHVlIGluIHN0cmluZyBmb3JtLCBpbiB3aGljaCBjYXNlIHRoZQorICAgKiAgICBlaWdlbnZhbHVlcyBjbG9zZXN0IHRvIHRoaXMgdmFsdWUgd2lsbCBiZSBmb3VuZC4KKyAgICogXHBhcmFtW2luXSAgb3B0aW9ucyBDYW4gYmUgI0NvbXB1dGVFaWdlbnZlY3RvcnMgKGRlZmF1bHQpIG9yICNFaWdlbnZhbHVlc09ubHkuCisgICAqIFxwYXJhbVtpbl0gdG9sIFdoYXQgdG9sZXJhbmNlIHRvIGZpbmQgdGhlIGVpZ2VudmFsdWVzIHRvLiBEZWZhdWx0IGlzIDAsIHdoaWNoCisgICAqICAgIG1lYW5zIG1hY2hpbmUgcHJlY2lzaW9uLgorICAgKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIEluZGV4LCBzdHJpbmcsIGludCwgUmVhbFNjYWxhcikKKyAgICogdG8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlIG1hdHJpeCBccCBBLiBUaGUgZWlnZW52ZWN0b3JzIGFyZSBjb21wdXRlZCBpZgorICAgKiBccCBvcHRpb25zIGVxdWFscyAjQ29tcHV0ZUVpZ2VudmVjdG9ycy4KKyAgICoKKyAgICovCisKKyAgQXJwYWNrR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBuYnJFaWdlbnZhbHVlcywgc3RkOjpzdHJpbmcgZWlnc19zaWdtYT0iTE0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25zPUNvbXB1dGVFaWdlbnZlY3RvcnMsIFJlYWxTY2FsYXIgdG9sPTAuMCkKKyAgICA6IG1fZWl2ZWMoKSwKKyAgICAgIG1fZWl2YWx1ZXMoKSwKKyAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICBtX2VpZ2VudmVjdG9yc09rKGZhbHNlKSwKKyAgICAgIG1fbmJyQ29udmVyZ2VkKDApLAorICAgICAgbV9uYnJJdGVyYXRpb25zKDApCisgIHsKKyAgICBjb21wdXRlKEEsIG5ickVpZ2VudmFsdWVzLCBlaWdzX3NpZ21hLCBvcHRpb25zLCB0b2wpOworICB9CisKKworICAvKiogXGJyaWVmIENvbXB1dGVzIGdlbmVyYWxpemVkIGVpZ2VudmFsdWVzIC8gZWlnZW52ZWN0b3JzIG9mIGdpdmVuIG1hdHJpeCB1c2luZyB0aGUgZXh0ZXJuYWwgQVJQQUNLIGxpYnJhcnkuCisgICAqCisgICAqIFxwYXJhbVtpbl0gIEEgIFNlbGZhZGpvaW50IG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAqIFxwYXJhbVtpbl0gIEIgIFNlbGZhZGpvaW50IG1hdHJpeCBmb3IgZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZXMuCisgICAqIFxwYXJhbVtpbl0gbmJyRWlnZW52YWx1ZXMgVGhlIG51bWJlciBvZiBlaWdlbnZhbHVlcyAvIGVpZ2VudmVjdG9ycyB0byBjb21wdXRlLgorICAgKiAgICBNdXN0IGJlIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgbWF0cml4LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICogXHBhcmFtW2luXSBlaWdzX3NpZ21hIFN0cmluZyBjb250YWluaW5nIGVpdGhlciAiTE0iLCAiU00iLCAiTEEiLCBvciAiU0EiLCB3aXRoCisgICAqICAgIHJlc3BlY3RpdmUgbWVhbmluZ3MgdG8gZmluZCB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUgLCBzbWFsbGVzdCBtYWduaXR1ZGUsCisgICAqICAgIGxhcmdlc3QgYWxnZWJyYWljLCBvciBzbWFsbGVzdCBhbGdlYnJhaWMgZWlnZW52YWx1ZXMuIEFsdGVybmF0aXZlbHksIHRoaXMKKyAgICogICAgdmFsdWUgY2FuIGNvbnRhaW4gZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gc3RyaW5nIGZvcm0sIGluIHdoaWNoIGNhc2UgdGhlCisgICAqICAgIGVpZ2VudmFsdWVzIGNsb3Nlc3QgdG8gdGhpcyB2YWx1ZSB3aWxsIGJlIGZvdW5kLgorICAgKiBccGFyYW1baW5dICBvcHRpb25zIENhbiBiZSAjQ29tcHV0ZUVpZ2VudmVjdG9ycyAoZGVmYXVsdCkgb3IgI0VpZ2VudmFsdWVzT25seS4KKyAgICogXHBhcmFtW2luXSB0b2wgV2hhdCB0b2xlcmFuY2UgdG8gZmluZCB0aGUgZWlnZW52YWx1ZXMgdG8uIERlZmF1bHQgaXMgMCwgd2hpY2gKKyAgICogICAgbWVhbnMgbWFjaGluZSBwcmVjaXNpb24uCisgICAqCisgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBnZW5lcmFsaXplZCBlaWdlbnZhbHVlcyBvZiBccCBBIHdpdGggcmVzcGVjdCB0byBccCBCIHVzaW5nIEFSUEFDSy4gIFRoZSBlaWdlbnZhbHVlcygpCisgICAqIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZW0uICBJZiBccCBvcHRpb25zIGVxdWFscyAjQ29tcHV0ZUVpZ2VudmVjdG9ycywKKyAgICogdGhlbiB0aGUgZWlnZW52ZWN0b3JzIGFyZSBhbHNvIGNvbXB1dGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5CisgICAqIGNhbGxpbmcgZWlnZW52ZWN0b3JzKCkuCisgICAqCisgICAqLworICBBcnBhY2tHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXImIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4VHlwZSYgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IG5ickVpZ2VudmFsdWVzLCBzdGQ6OnN0cmluZyBlaWdzX3NpZ21hPSJMTSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnM9Q29tcHV0ZUVpZ2VudmVjdG9ycywgUmVhbFNjYWxhciB0b2w9MC4wKTsKKyAgCisgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgZWlnZW52YWx1ZXMgLyBlaWdlbnZlY3RvcnMgb2YgZ2l2ZW4gbWF0cml4IHVzaW5nIHRoZSBleHRlcm5hbCBBUlBBQ0sgbGlicmFyeS4KKyAgICoKKyAgICogXHBhcmFtW2luXSAgQSAgU2VsZmFkam9pbnQgbWF0cml4IHdob3NlIGVpZ2VuZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICogXHBhcmFtW2luXSBuYnJFaWdlbnZhbHVlcyBUaGUgbnVtYmVyIG9mIGVpZ2VudmFsdWVzIC8gZWlnZW52ZWN0b3JzIHRvIGNvbXB1dGUuCisgICAqICAgIE11c3QgYmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBtYXRyaXgsIG9yIGFuIGVycm9yIGlzIHJldHVybmVkLgorICAgKiBccGFyYW1baW5dIGVpZ3Nfc2lnbWEgU3RyaW5nIGNvbnRhaW5pbmcgZWl0aGVyICJMTSIsICJTTSIsICJMQSIsIG9yICJTQSIsIHdpdGgKKyAgICogICAgcmVzcGVjdGl2ZSBtZWFuaW5ncyB0byBmaW5kIHRoZSBsYXJnZXN0IG1hZ25pdHVkZSAsIHNtYWxsZXN0IG1hZ25pdHVkZSwKKyAgICogICAgbGFyZ2VzdCBhbGdlYnJhaWMsIG9yIHNtYWxsZXN0IGFsZ2VicmFpYyBlaWdlbnZhbHVlcy4gQWx0ZXJuYXRpdmVseSwgdGhpcworICAgKiAgICB2YWx1ZSBjYW4gY29udGFpbiBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbiBzdHJpbmcgZm9ybSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICogICAgZWlnZW52YWx1ZXMgY2xvc2VzdCB0byB0aGlzIHZhbHVlIHdpbGwgYmUgZm91bmQuCisgICAqIFxwYXJhbVtpbl0gIG9wdGlvbnMgQ2FuIGJlICNDb21wdXRlRWlnZW52ZWN0b3JzIChkZWZhdWx0KSBvciAjRWlnZW52YWx1ZXNPbmx5LgorICAgKiBccGFyYW1baW5dIHRvbCBXaGF0IHRvbGVyYW5jZSB0byBmaW5kIHRoZSBlaWdlbnZhbHVlcyB0by4gRGVmYXVsdCBpcyAwLCB3aGljaAorICAgKiAgICBtZWFucyBtYWNoaW5lIHByZWNpc2lvbi4KKyAgICoKKyAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIFxwIEEgdXNpbmcgQVJQQUNLLiAgVGhlIGVpZ2VudmFsdWVzKCkKKyAgICogZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlbS4gIElmIFxwIG9wdGlvbnMgZXF1YWxzICNDb21wdXRlRWlnZW52ZWN0b3JzLAorICAgKiB0aGVuIHRoZSBlaWdlbnZlY3RvcnMgYXJlIGFsc28gY29tcHV0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgYnkKKyAgICogY2FsbGluZyBlaWdlbnZlY3RvcnMoKS4KKyAgICoKKyAgICovCisgIEFycGFja0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggbmJyRWlnZW52YWx1ZXMsIHN0ZDo6c3RyaW5nIGVpZ3Nfc2lnbWE9IkxNIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucz1Db21wdXRlRWlnZW52ZWN0b3JzLCBSZWFsU2NhbGFyIHRvbD0wLjApOworCisKKyAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBlaWdlbnZlY3RvcnMgb2YgZ2l2ZW4gbWF0cml4LgorICAgKgorICAgKiBccmV0dXJucyAgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSB0aGUgZWlnZW52ZWN0b3JzLgorICAgKgorICAgKiBccHJlIFRoZSBlaWdlbnZlY3RvcnMgaGF2ZSBiZWVuIGNvbXB1dGVkIGJlZm9yZS4KKyAgICoKKyAgICogQ29sdW1uIFxmJCBrIFxmJCBvZiB0aGUgcmV0dXJuZWQgbWF0cml4IGlzIGFuIGVpZ2VudmVjdG9yIGNvcnJlc3BvbmRpbmcKKyAgICogdG8gZWlnZW52YWx1ZSBudW1iZXIgXGYkIGsgXGYkIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuICBUaGUKKyAgICogZWlnZW52ZWN0b3JzIGFyZSBub3JtYWxpemVkIHRvIGhhdmUgKEV1Y2xpZGVhbikgbm9ybSBlcXVhbCB0byBvbmUuIElmCisgICAqIHRoaXMgb2JqZWN0IHdhcyB1c2VkIHRvIHNvbHZlIHRoZSBlaWdlbnByb2JsZW0gZm9yIHRoZSBzZWxmYWRqb2ludAorICAgKiBtYXRyaXggXGYkIEEgXGYkLCB0aGVuIHRoZSBtYXRyaXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyB0aGUKKyAgICogbWF0cml4IFxmJCBWIFxmJCBpbiB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBIFYgPSBEIFYgXGYkLgorICAgKiBGb3IgdGhlIGdlbmVyYWxpemVkIGVpZ2VucHJvYmxlbSwgdGhlIG1hdHJpeCByZXR1cm5lZCBpcyB0aGUgc29sdXRpb24gXGYkIEEgViA9IEQgQiBWIFxmJAorICAgKgorICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKKyAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMub3V0CisgICAqCisgICAqIFxzYSBlaWdlbnZhbHVlcygpCisgICAqLworICBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiYgZWlnZW52ZWN0b3JzKCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkFycGFja0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgZWlnZW5fYXNzZXJ0KG1fZWlnZW52ZWN0b3JzT2sgJiYgIlRoZSBlaWdlbnZlY3RvcnMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB0b2dldGhlciB3aXRoIHRoZSBlaWdlbnZhbHVlcy4iKTsKKyAgICByZXR1cm4gbV9laXZlYzsKKyAgfQorCisgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgZWlnZW52YWx1ZXMgb2YgZ2l2ZW4gbWF0cml4LgorICAgKgorICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgY29sdW1uIHZlY3RvciBjb250YWluaW5nIHRoZSBlaWdlbnZhbHVlcy4KKyAgICoKKyAgICogXHByZSBUaGUgZWlnZW52YWx1ZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIGJlZm9yZS4KKyAgICoKKyAgICogVGhlIGVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgYWxnZWJyYWljIG11bHRpcGxpY2l0eSwKKyAgICogc28gdGhlcmUgYXJlIGFzIG1hbnkgZWlnZW52YWx1ZXMgYXMgcm93cyBpbiB0aGUgbWF0cml4LiBUaGUgZWlnZW52YWx1ZXMKKyAgICogYXJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyLgorICAgKgorICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcAorICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLm91dAorICAgKgorICAgKiBcc2EgZWlnZW52ZWN0b3JzKCksIE1hdHJpeEJhc2U6OmVpZ2VudmFsdWVzKCkKKyAgICovCisgIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBlaWdlbnZhbHVlcygpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJBcnBhY2tHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIHJldHVybiBtX2VpdmFsdWVzOworICB9CisKKyAgLyoqIFxicmllZiBDb21wdXRlcyB0aGUgcG9zaXRpdmUtZGVmaW5pdGUgc3F1YXJlIHJvb3Qgb2YgdGhlIG1hdHJpeC4KKyAgICoKKyAgICogXHJldHVybnMgdGhlIHBvc2l0aXZlLWRlZmluaXRlIHNxdWFyZSByb290IG9mIHRoZSBtYXRyaXgKKyAgICoKKyAgICogXHByZSBUaGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeAorICAgKiBoYXZlIGJlZW4gY29tcHV0ZWQgYmVmb3JlLgorICAgKgorICAgKiBUaGUgc3F1YXJlIHJvb3Qgb2YgYSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXggXGYkIEEgXGYkIGlzIHRoZQorICAgKiBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXggd2hvc2Ugc3F1YXJlIGVxdWFscyBcZiQgQSBcZiQuIFRoaXMgZnVuY3Rpb24KKyAgICogdXNlcyB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBID0gViBEIFZeey0xfSBcZiQgdG8gY29tcHV0ZSB0aGUKKyAgICogc3F1YXJlIHJvb3QgYXMgXGYkIEFeezEvMn0gPSBWIEReezEvMn0gVl57LTF9IFxmJC4KKyAgICoKKyAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwCisgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JTcXJ0Lm91dAorICAgKgorICAgKiBcc2Egb3BlcmF0b3JJbnZlcnNlU3FydCgpLAorICAgKiAgICAgXHJlZiBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlICJNYXRyaXhGdW5jdGlvbnMgTW9kdWxlIgorICAgKi8KKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gb3BlcmF0b3JTcXJ0KCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgICAgcmV0dXJuIG1fZWl2ZWMgKiBtX2VpdmFsdWVzLmN3aXNlU3FydCgpLmFzRGlhZ29uYWwoKSAqIG1fZWl2ZWMuYWRqb2ludCgpOworICB9CisKKyAgLyoqIFxicmllZiBDb21wdXRlcyB0aGUgaW52ZXJzZSBzcXVhcmUgcm9vdCBvZiB0aGUgbWF0cml4LgorICAgKgorICAgKiBccmV0dXJucyB0aGUgaW52ZXJzZSBwb3NpdGl2ZS1kZWZpbml0ZSBzcXVhcmUgcm9vdCBvZiB0aGUgbWF0cml4CisgICAqCisgICAqIFxwcmUgVGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXgKKyAgICogaGF2ZSBiZWVuIGNvbXB1dGVkIGJlZm9yZS4KKyAgICoKKyAgICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJCB0bworICAgKiBjb21wdXRlIHRoZSBpbnZlcnNlIHNxdWFyZSByb290IGFzIFxmJCBWIEReey0xLzJ9IFZeey0xfSBcZiQuIFRoaXMgaXMKKyAgICogY2hlYXBlciB0aGFuIGZpcnN0IGNvbXB1dGluZyB0aGUgc3F1YXJlIHJvb3Qgd2l0aCBvcGVyYXRvclNxcnQoKSBhbmQKKyAgICogdGhlbiBpdHMgaW52ZXJzZSB3aXRoIE1hdHJpeEJhc2U6OmludmVyc2UoKS4KKyAgICoKKyAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0LmNwcAorICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQub3V0CisgICAqCisgICAqIFxzYSBvcGVyYXRvclNxcnQoKSwgTWF0cml4QmFzZTo6aW52ZXJzZSgpLAorICAgKiAgICAgXHJlZiBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlICJNYXRyaXhGdW5jdGlvbnMgTW9kdWxlIgorICAgKi8KKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gb3BlcmF0b3JJbnZlcnNlU3FydCgpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgIHJldHVybiBtX2VpdmVjICogbV9laXZhbHVlcy5jd2lzZUludmVyc2UoKS5jd2lzZVNxcnQoKS5hc0RpYWdvbmFsKCkgKiBtX2VpdmVjLmFkam9pbnQoKTsKKyAgfQorCisgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgKgorICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsIFxjIE5vQ29udmVyZ2VuY2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQXJwYWNrR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICByZXR1cm4gbV9pbmZvOworICB9CisKKyAgc2l6ZV90IGdldE5ickNvbnZlcmdlZEVpZ2VuVmFsdWVzKCkgY29uc3QKKyAgeyByZXR1cm4gbV9uYnJDb252ZXJnZWQ7IH0KKworICBzaXplX3QgZ2V0TmJySXRlcmF0aW9ucygpIGNvbnN0CisgIHsgcmV0dXJuIG1fbmJySXRlcmF0aW9uczsgfQorCitwcm90ZWN0ZWQ6CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG1fZWl2ZWM7CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IG1fZWl2YWx1ZXM7CisgIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICBib29sIG1fZWlnZW52ZWN0b3JzT2s7CisKKyAgc2l6ZV90IG1fbmJyQ29udmVyZ2VkOworICBzaXplX3QgbV9uYnJJdGVyYXRpb25zOworfTsKKworCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBNYXRyaXhTb2x2ZXIsIGJvb2wgQmlzU1BEPgorQXJwYWNrR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGUsIE1hdHJpeFNvbHZlciwgQmlzU1BEPiYKKyAgICBBcnBhY2tHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZSwgTWF0cml4U29sdmVyLCBCaXNTUEQ+Cis6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSwgSW5kZXggbmJyRWlnZW52YWx1ZXMsCisgICAgICAgICAgc3RkOjpzdHJpbmcgZWlnc19zaWdtYSwgaW50IG9wdGlvbnMsIFJlYWxTY2FsYXIgdG9sKQoreworICAgIE1hdHJpeFR5cGUgQigwLDApOworICAgIGNvbXB1dGUoQSwgQiwgbmJyRWlnZW52YWx1ZXMsIGVpZ3Nfc2lnbWEsIG9wdGlvbnMsIHRvbCk7CisgICAgCisgICAgcmV0dXJuICp0aGlzOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIE1hdHJpeFNvbHZlciwgYm9vbCBCaXNTUEQ+CitBcnBhY2tHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZSwgTWF0cml4U29sdmVyLCBCaXNTUEQ+JgorICAgIEFycGFja0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlLCBNYXRyaXhTb2x2ZXIsIEJpc1NQRD4KKzo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXhUeXBlJiBCLCBJbmRleCBuYnJFaWdlbnZhbHVlcywKKyAgICAgICAgICBzdGQ6OnN0cmluZyBlaWdzX3NpZ21hLCBpbnQgb3B0aW9ucywgUmVhbFNjYWxhciB0b2wpCit7CisgIGVpZ2VuX2Fzc2VydChBLmNvbHMoKSA9PSBBLnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydChCLmNvbHMoKSA9PSBCLnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydChCLnJvd3MoKSA9PSAwIHx8IEEuY29scygpID09IEIucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KChvcHRpb25zICZ+IChFaWdWZWNNYXNrIHwgR2VuRWlnTWFzaykpID09IDAKKyAgICAgICAgICAgICYmIChvcHRpb25zICYgRWlnVmVjTWFzaykgIT0gRWlnVmVjTWFzaworICAgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOworCisgIGJvb2wgaXNCZW1wdHkgPSAoQi5yb3dzKCkgPT0gMCkgfHwgKEIuY29scygpID09IDApOworCisgIC8vIEZvciBjbGFyaXR5LCBhbGwgcGFyYW1ldGVycyBtYXRjaCB0aGVpciBBUlBBQ0sgbmFtZQorICAvLworICAvLyBBbHdheXMgMCBvbiB0aGUgZmlyc3QgY2FsbAorICAvLworICBpbnQgaWRvID0gMDsKKworICBpbnQgbiA9IChpbnQpQS5jb2xzKCk7CisKKyAgLy8gVXNlciBvcHRpb25zOiAiTEEiLCAiU0EiLCAiU00iLCAiTE0iLCAiQkUiCisgIC8vCisgIGNoYXIgd2hjaFszXSA9ICJMTSI7CisgICAgCisgIC8vIFNwZWNpZmllcyB0aGUgc2hpZnQgaWYgaXBhcmFtWzZdID0geyAzLCA0LCA1IH0sIG5vdCB1c2VkIGlmIGlwYXJhbVs2XSA9IHsgMSwgMiB9CisgIC8vCisgIFJlYWxTY2FsYXIgc2lnbWEgPSAwLjA7CisKKyAgaWYgKGVpZ3Nfc2lnbWEubGVuZ3RoKCkgPj0gMiAmJiBpc2FscGhhKGVpZ3Nfc2lnbWFbMF0pICYmIGlzYWxwaGEoZWlnc19zaWdtYVsxXSkpCisgIHsKKyAgICAgIGVpZ3Nfc2lnbWFbMF0gPSB0b3VwcGVyKGVpZ3Nfc2lnbWFbMF0pOworICAgICAgZWlnc19zaWdtYVsxXSA9IHRvdXBwZXIoZWlnc19zaWdtYVsxXSk7CisKKyAgICAgIC8vIEluIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBjYXNlIHdlJ3JlIGdvaW5nIHRvIGludmVydCB0aGUgcHJvYmxlbSwgc2luY2Ugc29sdmluZworICAgICAgLy8gZm9yIGxhcmdlciBtYWduaXR1ZGUgaXMgbXVjaCBtdWNoIGZhc3RlcgorICAgICAgLy8gaS5lLiwgaWYgJ1NNJyBpcyBzcGVjaWZpZWQsIHdlJ3JlIGdvaW5nIHRvIHJlYWxseSB1c2UgJ0xNJywgdGhlIGRlZmF1bHQKKyAgICAgIC8vCisgICAgICBpZiAoZWlnc19zaWdtYS5zdWJzdHIoMCwyKSAhPSAiU00iKQorICAgICAgeworICAgICAgICAgIHdoY2hbMF0gPSBlaWdzX3NpZ21hWzBdOworICAgICAgICAgIHdoY2hbMV0gPSBlaWdzX3NpZ21hWzFdOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJTcGVjaWZ5aW5nIGNsdXN0ZXJlZCBlaWdlbnZhbHVlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCEiKTsKKworICAgICAgLy8gSWYgaXQncyBub3Qgc2NhbGFyIHZhbHVlcywgdGhlbiB0aGUgdXNlciBtYXkgYmUgZXhwbGljaXRseQorICAgICAgLy8gc3BlY2lmeWluZyB0aGUgc2lnbWEgdmFsdWUgdG8gY2x1c3RlciB0aGUgZXZzIGFyb3VuZAorICAgICAgLy8KKyAgICAgIHNpZ21hID0gYXRvZihlaWdzX3NpZ21hLmNfc3RyKCkpOworCisgICAgICAvLyBJZiBhdG9mIGZhaWxzLCBpdCByZXR1cm5zIDAuMCwgd2hpY2ggaXMgYSBmaW5lIGRlZmF1bHQKKyAgICAgIC8vCisgIH0KKworICAvLyAiSSIgbWVhbnMgbm9ybWFsIGVpZ2VudmFsdWUgcHJvYmxlbSwgIkciIG1lYW5zIGdlbmVyYWxpemVkCisgIC8vCisgIGNoYXIgYm1hdFsyXSA9ICJJIjsKKyAgaWYgKGVpZ3Nfc2lnbWEuc3Vic3RyKDAsMikgPT0gIlNNIiB8fCAhKGlzYWxwaGEoZWlnc19zaWdtYVswXSkgJiYgaXNhbHBoYShlaWdzX3NpZ21hWzFdKSkgfHwgKCFpc0JlbXB0eSAmJiAhQmlzU1BEKSkKKyAgICAgIGJtYXRbMF0gPSAnRyc7CisKKyAgLy8gTm93IHdlIGRldGVybWluZSB0aGUgbW9kZSB0byB1c2UKKyAgLy8KKyAgaW50IG1vZGUgPSAoYm1hdFswXSA9PSAnRycpICsgMTsKKyAgaWYgKGVpZ3Nfc2lnbWEuc3Vic3RyKDAsMikgPT0gIlNNIiB8fCAhKGlzYWxwaGEoZWlnc19zaWdtYVswXSkgJiYgaXNhbHBoYShlaWdzX3NpZ21hWzFdKSkpCisgIHsKKyAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHVzZSBzaGlmdC1hbmQtaW52ZXJ0IG1vZGUsIGFuZCBiYXNpY2FsbHkgZmluZAorICAgICAgLy8gdGhlIGxhcmdlc3QgZWlnZW52YWx1ZXMgb2YgdGhlIGludmVyc2Ugb3BlcmF0b3IKKyAgICAgIC8vCisgICAgICBtb2RlID0gMzsKKyAgfQorCisgIC8vIFRoZSB1c2VyLXNwZWNpZmllZCBudW1iZXIgb2YgZWlnZW52YWx1ZXMvdmVjdG9ycyB0byBjb21wdXRlCisgIC8vCisgIGludCBuZXYgPSAoaW50KW5ickVpZ2VudmFsdWVzOworCisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBBUlBBQ0sgdG8gc3RvcmUgdGhlIHJlc2lkdWFsCisgIC8vCisgIFNjYWxhciAqcmVzaWQgPSBuZXcgU2NhbGFyW25dOworCisgIC8vIE51bWJlciBvZiBMYW5jem9zIHZlY3RvcnMsIG11c3Qgc2F0aXNmeSBuZXYgPCBuY3YgPD0gbgorICAvLyBOb3RlIHRoYXQgdGhpcyBpbmRpY2F0ZXMgdGhhdCBuZXYgIT0gbiwgYW5kIHdlIGNhbm5vdCBjb21wdXRlCisgIC8vIGFsbCBlaWdlbnZhbHVlcyBvZiBhIG10cml4CisgIC8vCisgIGludCBuY3YgPSBzdGQ6Om1pbihzdGQ6Om1heCgyKm5ldiwgMjApLCBuKTsKKworICAvLyBUaGUgd29ya2luZyBuIHggbmN2IG1hdHJpeCwgYWxzbyBzdG9yZSB0aGUgZmluYWwgZWlnZW52ZWN0b3JzIChpZiBjb21wdXRlZCkKKyAgLy8KKyAgU2NhbGFyICp2ID0gbmV3IFNjYWxhcltuKm5jdl07CisgIGludCBsZHYgPSBuOworCisgIC8vIFdvcmtpbmcgc3BhY2UKKyAgLy8KKyAgU2NhbGFyICp3b3JrZCA9IG5ldyBTY2FsYXJbMypuXTsKKyAgaW50IGx3b3JrbCA9IG5jdipuY3YrOCpuY3Y7IC8vIE11c3QgYmUgYXQgbGVhc3QgdGhpcyBsZW5ndGgKKyAgU2NhbGFyICp3b3JrbCA9IG5ldyBTY2FsYXJbbHdvcmtsXTsKKworICBpbnQgKmlwYXJhbT0gbmV3IGludFsxMV07CisgIGlwYXJhbVswXSA9IDE7IC8vIDEgbWVhbnMgd2UgbGV0IEFSUEFDSyBwZXJmb3JtIHRoZSBzaGlmdHMsIDAgbWVhbnMgd2UnZCBoYXZlIHRvIGRvIGl0CisgIGlwYXJhbVsyXSA9IHN0ZDo6bWF4KDMwMCwgKGludClzdGQ6OmNlaWwoMipuL3N0ZDo6bWF4KG5jdiwxKSkpOworICBpcGFyYW1bNl0gPSBtb2RlOyAvLyBUaGUgbW9kZSwgMSBpcyBzdGFuZGFyZCBldiBwcm9ibGVtLCAyIGZvciBnZW5lcmFsaXplZCBldiwgMyBmb3Igc2hpZnQtYW5kLWludmVydAorCisgIC8vIFVzZWQgZHVyaW5nIHJldmVyc2UgY29tbXVuaWNhdGUgdG8gbm90aWZ5IHdoZXJlIGFycmF5cyBzdGFydAorICAvLworICBpbnQgKmlwbnRyID0gbmV3IGludFsxMV07IAorCisgIC8vIEVycm9yIGNvZGVzIGFyZSByZXR1cm5lZCBpbiBoZXJlLCBpbml0aWFsIHZhbHVlIG9mIDAgaW5kaWNhdGVzIGEgcmFuZG9tIGluaXRpYWwKKyAgLy8gcmVzaWR1YWwgdmVjdG9yIGlzIHVzZWQsIGFueSBvdGhlciB2YWx1ZXMgbWVhbnMgcmVzaWQgY29udGFpbnMgdGhlIGluaXRpYWwgcmVzaWR1YWwKKyAgLy8gdmVjdG9yLCBwb3NzaWJseSBmcm9tIGEgcHJldmlvdXMgcnVuCisgIC8vCisgIGludCBpbmZvID0gMDsKKworICBTY2FsYXIgc2NhbGUgPSAxLjA7CisgIC8vaWYgKCFpc0JlbXB0eSkKKyAgLy97CisgIC8vU2NhbGFyIHNjYWxlID0gQi5ub3JtKCkgLyBzdGQ6OnNxcnQobik7CisgIC8vc2NhbGUgPSBzdGQ6OnBvdygyLCBzdGQ6OmZsb29yKHN0ZDo6bG9nKHNjYWxlKzEpKSk7CisgIC8vLy9NIC89IHNjYWxlOworICAvL2ZvciAoc2l6ZV90IGk9MDsgaTwoc2l6ZV90KUIub3V0ZXJTaXplKCk7IGkrKykKKyAgLy8gICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KEIsIGkpOyBpdDsgKytpdCkKKyAgLy8gICAgICAgIGl0LnZhbHVlUmVmKCkgLz0gc2NhbGU7CisgIC8vfQorCisgIE1hdHJpeFNvbHZlciBPUDsKKyAgaWYgKG1vZGUgPT0gMSB8fCBtb2RlID09IDIpCisgIHsKKyAgICAgIGlmICghaXNCZW1wdHkpCisgICAgICAgICAgT1AuY29tcHV0ZShCKTsKKyAgfQorICBlbHNlIGlmIChtb2RlID09IDMpCisgIHsKKyAgICAgIGlmIChzaWdtYSA9PSAwLjApCisgICAgICB7CisgICAgICAgICAgT1AuY29tcHV0ZShBKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgICAvLyBOb3RlOiBXZSB3aWxsIG5ldmVyIGVudGVyIGhlcmUgYmVjYXVzZSBzaWdtYSBtdXN0IGJlIDAuMAorICAgICAgICAgIC8vCisgICAgICAgICAgaWYgKGlzQmVtcHR5KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIE1hdHJpeFR5cGUgQW1pbnVzU2lnbWFCKEEpOworICAgICAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8QS5yb3dzKCk7ICsraSkKKyAgICAgICAgICAgICAgICBBbWludXNTaWdtYUIuY29lZmZSZWYoaSxpKSAtPSBzaWdtYTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT1AuY29tcHV0ZShBbWludXNTaWdtYUIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgICBNYXRyaXhUeXBlIEFtaW51c1NpZ21hQiA9IEEgLSBzaWdtYSAqIEI7CisgICAgICAgICAgICAgIE9QLmNvbXB1dGUoQW1pbnVzU2lnbWFCKTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyAKKyAgaWYgKCEobW9kZSA9PSAxICYmIGlzQmVtcHR5KSAmJiAhKG1vZGUgPT0gMiAmJiBpc0JlbXB0eSkgJiYgT1AuaW5mbygpICE9IFN1Y2Nlc3MpCisgICAgICBzdGQ6OmNvdXQgPDwgIkVycm9yIGZhY3RvcmluZyBtYXRyaXgiIDw8IHN0ZDo6ZW5kbDsKKworICBkbworICB7CisgICAgaW50ZXJuYWw6OmFycGFja193cmFwcGVyPFNjYWxhciwgUmVhbFNjYWxhcj46OnNhdXBkKCZpZG8sIGJtYXQsICZuLCB3aGNoLCAmbmV2LCAmdG9sLCByZXNpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuY3YsIHYsICZsZHYsIGlwYXJhbSwgaXBudHIsIHdvcmtkLCB3b3JrbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx3b3JrbCwgJmluZm8pOworCisgICAgaWYgKGlkbyA9PSAtMSB8fCBpZG8gPT0gMSkKKyAgICB7CisgICAgICBTY2FsYXIgKmluICA9IHdvcmtkICsgaXBudHJbMF0gLSAxOworICAgICAgU2NhbGFyICpvdXQgPSB3b3JrZCArIGlwbnRyWzFdIC0gMTsKKworICAgICAgaWYgKGlkbyA9PSAxICYmIG1vZGUgIT0gMikKKyAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgKm91dDIgPSB3b3JrZCArIGlwbnRyWzJdIC0gMTsKKyAgICAgICAgICBpZiAoaXNCZW1wdHkgfHwgbW9kZSA9PSAxKQorICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChvdXQyLCBuKSA9IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAoaW4sIG4pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0MiwgbikgPSBCICogTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChpbiwgbik7CisgICAgICAgICAgCisgICAgICAgICAgaW4gPSB3b3JrZCArIGlwbnRyWzJdIC0gMTsKKyAgICAgIH0KKworICAgICAgaWYgKG1vZGUgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGlzQmVtcHR5KQorICAgICAgICB7CisgICAgICAgICAgLy8gT1AgPSBBCisgICAgICAgICAgLy8KKyAgICAgICAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbikgPSBBICogTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChpbiwgbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gT1AgPSBMXnstMX1BTF57LVR9CisgICAgICAgICAgLy8KKyAgICAgICAgICBpbnRlcm5hbDo6T1A8TWF0cml4U29sdmVyLCBNYXRyaXhUeXBlLCBTY2FsYXIsIEJpc1NQRD46OmFwcGx5T1AoT1AsIEEsIG4sIGluLCBvdXQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChtb2RlID09IDIpCisgICAgICB7CisgICAgICAgIGlmIChpZG8gPT0gMSkKKyAgICAgICAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKGluLCBuKSAgPSBBICogTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChpbiwgbik7CisgICAgICAgIAorICAgICAgICAvLyBPUCA9IEJeey0xfSBBCisgICAgICAgIC8vCisgICAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0LCBuKSA9IE9QLnNvbHZlKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAoaW4sIG4pKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMykKKyAgICAgIHsKKyAgICAgICAgLy8gT1AgPSAoQS1cc2lnbWFCKUIgKFxzaWdtYSBjb3VsZCBiZSAwLCBhbmQgQiBjb3VsZCBiZSBJKQorICAgICAgICAvLyBUaGUgQiAqIGluIGlzIGFscmVhZHkgY29tcHV0ZWQgYW5kIHN0b3JlZCBhdCBpbiBpZiBpZG8gPT0gMQorICAgICAgICAvLworICAgICAgICBpZiAoaWRvID09IDEgfHwgaXNCZW1wdHkpCisgICAgICAgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChvdXQsIG4pID0gT1Auc29sdmUoTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChpbiwgbikpOworICAgICAgICBlbHNlCisgICAgICAgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChvdXQsIG4pID0gT1Auc29sdmUoQiAqIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAoaW4sIG4pKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoaWRvID09IDIpCisgICAgeworICAgICAgU2NhbGFyICppbiAgPSB3b3JrZCArIGlwbnRyWzBdIC0gMTsKKyAgICAgIFNjYWxhciAqb3V0ID0gd29ya2QgKyBpcG50clsxXSAtIDE7CisKKyAgICAgIGlmIChpc0JlbXB0eSB8fCBtb2RlID09IDEpCisgICAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0LCBuKSA9IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAoaW4sIG4pOworICAgICAgZWxzZQorICAgICAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbikgPSBCICogTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChpbiwgbik7CisgICAgfQorICB9IHdoaWxlIChpZG8gIT0gOTkpOworCisgIGlmIChpbmZvID09IDEpCisgICAgbV9pbmZvID0gTm9Db252ZXJnZW5jZTsKKyAgZWxzZSBpZiAoaW5mbyA9PSAzKQorICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICBlbHNlIGlmIChpbmZvIDwgMCkKKyAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgIGVsc2UgaWYgKGluZm8gIT0gMCkKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIlVua25vd24gQVJQQUNLIHJldHVybiB2YWx1ZSEiKTsKKyAgZWxzZQorICB7CisgICAgLy8gRG8gd2UgY29tcHV0ZSBlaWdlbnZlY3RvcnMgb3Igbm90PworICAgIC8vCisgICAgaW50IHJ2ZWMgPSAob3B0aW9ucyAmIENvbXB1dGVFaWdlbnZlY3RvcnMpID09IENvbXB1dGVFaWdlbnZlY3RvcnM7CisKKyAgICAvLyAiQSIgbWVhbnMgIkFsbCIsIHVzZSAiUyIgdG8gY2hvb3NlIHNwZWNpZmljIGVpZ2VudmFsdWVzIChub3QgeWV0IHN1cHBvcnRlZCBpbiBBUlBBQ0spKQorICAgIC8vCisgICAgY2hhciBob3dtbnlbMl0gPSAiQSI7IAorCisgICAgLy8gaWYgaG93bW55ID09ICJTIiwgc3BlY2lmaWVzIHRoZSBlaWdlbnZhbHVlcyB0byBjb21wdXRlIChub3QgaW1wbGVtZW50ZWQgaW4gQVJQQUNLKQorICAgIC8vCisgICAgaW50ICpzZWxlY3QgPSBuZXcgaW50W25jdl07CisKKyAgICAvLyBGaW5hbCBlaWdlbnZhbHVlcworICAgIC8vCisgICAgbV9laXZhbHVlcy5yZXNpemUobmV2LCAxKTsKKworICAgIGludGVybmFsOjphcnBhY2tfd3JhcHBlcjxTY2FsYXIsIFJlYWxTY2FsYXI+OjpzZXVwZCgmcnZlYywgaG93bW55LCBzZWxlY3QsIG1fZWl2YWx1ZXMuZGF0YSgpLCB2LCAmbGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbWEsIGJtYXQsICZuLCB3aGNoLCAmbmV2LCAmdG9sLCByZXNpZCwgJm5jdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgJmxkdiwgaXBhcmFtLCBpcG50ciwgd29ya2QsIHdvcmtsLCAmbHdvcmtsLCAmaW5mbyk7CisKKyAgICBpZiAoaW5mbyA9PSAtMTQpCisgICAgICBtX2luZm8gPSBOb0NvbnZlcmdlbmNlOworICAgIGVsc2UgaWYgKGluZm8gIT0gMCkKKyAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHJ2ZWMpCisgICAgICB7CisgICAgICAgIG1fZWl2ZWMucmVzaXplKEEucm93cygpLCBuZXYpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bmV2OyBpKyspCisgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPG47IGorKykKKyAgICAgICAgICAgIG1fZWl2ZWMoaixpKSA9IHZbaSpuK2pdIC8gc2NhbGU7CisgICAgICAKKyAgICAgICAgaWYgKG1vZGUgPT0gMSAmJiAhaXNCZW1wdHkgJiYgQmlzU1BEKQorICAgICAgICAgIGludGVybmFsOjpPUDxNYXRyaXhTb2x2ZXIsIE1hdHJpeFR5cGUsIFNjYWxhciwgQmlzU1BEPjo6cHJvamVjdChPUCwgbiwgbmV2LCBtX2VpdmVjLmRhdGEoKSk7CisKKyAgICAgICAgbV9laWdlbnZlY3RvcnNPayA9IHRydWU7CisgICAgICB9CisKKyAgICAgIG1fbmJySXRlcmF0aW9ucyA9IGlwYXJhbVsyXTsKKyAgICAgIG1fbmJyQ29udmVyZ2VkICA9IGlwYXJhbVs0XTsKKworICAgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICB9CisKKyAgICBkZWxldGVbXSBzZWxlY3Q7CisgIH0KKworICBkZWxldGVbXSB2OworICBkZWxldGVbXSBpcGFyYW07CisgIGRlbGV0ZVtdIGlwbnRyOworICBkZWxldGVbXSB3b3JrZDsKKyAgZGVsZXRlW10gd29ya2w7CisgIGRlbGV0ZVtdIHJlc2lkOworCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisKKy8vIFNpbmdsZSBwcmVjaXNpb24KKy8vCitleHRlcm4gIkMiIHZvaWQgc3NhdXBkXyhpbnQgKmlkbywgY2hhciAqYm1hdCwgaW50ICpuLCBjaGFyICp3aGljaCwKKyAgICBpbnQgKm5ldiwgZmxvYXQgKnRvbCwgZmxvYXQgKnJlc2lkLCBpbnQgKm5jdiwKKyAgICBmbG9hdCAqdiwgaW50ICpsZHYsIGludCAqaXBhcmFtLCBpbnQgKmlwbnRyLAorICAgIGZsb2F0ICp3b3JrZCwgZmxvYXQgKndvcmtsLCBpbnQgKmx3b3JrbCwKKyAgICBpbnQgKmluZm8pOworCitleHRlcm4gIkMiIHZvaWQgc3NldXBkXyhpbnQgKnJ2ZWMsIGNoYXIgKkFsbCwgaW50ICpzZWxlY3QsIGZsb2F0ICpkLAorICAgIGZsb2F0ICp6LCBpbnQgKmxkeiwgZmxvYXQgKnNpZ21hLCAKKyAgICBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLCBpbnQgKm5ldiwKKyAgICBmbG9hdCAqdG9sLCBmbG9hdCAqcmVzaWQsIGludCAqbmN2LCBmbG9hdCAqdiwKKyAgICBpbnQgKmxkdiwgaW50ICppcGFyYW0sIGludCAqaXBudHIsIGZsb2F0ICp3b3JrZCwKKyAgICBmbG9hdCAqd29ya2wsIGludCAqbHdvcmtsLCBpbnQgKmllcnIpOworCisvLyBEb3VibGUgcHJlY2lzaW9uCisvLworZXh0ZXJuICJDIiB2b2lkIGRzYXVwZF8oaW50ICppZG8sIGNoYXIgKmJtYXQsIGludCAqbiwgY2hhciAqd2hpY2gsCisgICAgaW50ICpuZXYsIGRvdWJsZSAqdG9sLCBkb3VibGUgKnJlc2lkLCBpbnQgKm5jdiwKKyAgICBkb3VibGUgKnYsIGludCAqbGR2LCBpbnQgKmlwYXJhbSwgaW50ICppcG50ciwKKyAgICBkb3VibGUgKndvcmtkLCBkb3VibGUgKndvcmtsLCBpbnQgKmx3b3JrbCwKKyAgICBpbnQgKmluZm8pOworCitleHRlcm4gIkMiIHZvaWQgZHNldXBkXyhpbnQgKnJ2ZWMsIGNoYXIgKkFsbCwgaW50ICpzZWxlY3QsIGRvdWJsZSAqZCwKKyAgICBkb3VibGUgKnosIGludCAqbGR6LCBkb3VibGUgKnNpZ21hLCAKKyAgICBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLCBpbnQgKm5ldiwKKyAgICBkb3VibGUgKnRvbCwgZG91YmxlICpyZXNpZCwgaW50ICpuY3YsIGRvdWJsZSAqdiwKKyAgICBpbnQgKmxkdiwgaW50ICppcGFyYW0sIGludCAqaXBudHIsIGRvdWJsZSAqd29ya2QsCisgICAgZG91YmxlICp3b3JrbCwgaW50ICpsd29ya2wsIGludCAqaWVycik7CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBSZWFsU2NhbGFyPiBzdHJ1Y3QgYXJwYWNrX3dyYXBwZXIKK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHNhdXBkKGludCAqaWRvLCBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLAorICAgICAgaW50ICpuZXYsIFJlYWxTY2FsYXIgKnRvbCwgU2NhbGFyICpyZXNpZCwgaW50ICpuY3YsCisgICAgICBTY2FsYXIgKnYsIGludCAqbGR2LCBpbnQgKmlwYXJhbSwgaW50ICppcG50ciwKKyAgICAgIFNjYWxhciAqd29ya2QsIFNjYWxhciAqd29ya2wsIGludCAqbHdvcmtsLCBpbnQgKmluZm8pCisgIHsgCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCkKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXVwZChpbnQgKnJ2ZWMsIGNoYXIgKkFsbCwgaW50ICpzZWxlY3QsIFNjYWxhciAqZCwKKyAgICAgIFNjYWxhciAqeiwgaW50ICpsZHosIFJlYWxTY2FsYXIgKnNpZ21hLAorICAgICAgY2hhciAqYm1hdCwgaW50ICpuLCBjaGFyICp3aGljaCwgaW50ICpuZXYsCisgICAgICBSZWFsU2NhbGFyICp0b2wsIFNjYWxhciAqcmVzaWQsIGludCAqbmN2LCBTY2FsYXIgKnYsCisgICAgICBpbnQgKmxkdiwgaW50ICppcGFyYW0sIGludCAqaXBudHIsIFNjYWxhciAqd29ya2QsCisgICAgICBTY2FsYXIgKndvcmtsLCBpbnQgKmx3b3JrbCwgaW50ICppZXJyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCkKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGFycGFja193cmFwcGVyPGZsb2F0LCBmbG9hdD4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHNhdXBkKGludCAqaWRvLCBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLAorICAgICAgaW50ICpuZXYsIGZsb2F0ICp0b2wsIGZsb2F0ICpyZXNpZCwgaW50ICpuY3YsCisgICAgICBmbG9hdCAqdiwgaW50ICpsZHYsIGludCAqaXBhcmFtLCBpbnQgKmlwbnRyLAorICAgICAgZmxvYXQgKndvcmtkLCBmbG9hdCAqd29ya2wsIGludCAqbHdvcmtsLCBpbnQgKmluZm8pCisgIHsKKyAgICBzc2F1cGRfKGlkbywgYm1hdCwgbiwgd2hpY2gsIG5ldiwgdG9sLCByZXNpZCwgbmN2LCB2LCBsZHYsIGlwYXJhbSwgaXBudHIsIHdvcmtkLCB3b3JrbCwgbHdvcmtsLCBpbmZvKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXVwZChpbnQgKnJ2ZWMsIGNoYXIgKkFsbCwgaW50ICpzZWxlY3QsIGZsb2F0ICpkLAorICAgICAgZmxvYXQgKnosIGludCAqbGR6LCBmbG9hdCAqc2lnbWEsCisgICAgICBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLCBpbnQgKm5ldiwKKyAgICAgIGZsb2F0ICp0b2wsIGZsb2F0ICpyZXNpZCwgaW50ICpuY3YsIGZsb2F0ICp2LAorICAgICAgaW50ICpsZHYsIGludCAqaXBhcmFtLCBpbnQgKmlwbnRyLCBmbG9hdCAqd29ya2QsCisgICAgICBmbG9hdCAqd29ya2wsIGludCAqbHdvcmtsLCBpbnQgKmllcnIpCisgIHsKKyAgICBzc2V1cGRfKHJ2ZWMsIEFsbCwgc2VsZWN0LCBkLCB6LCBsZHosIHNpZ21hLCBibWF0LCBuLCB3aGljaCwgbmV2LCB0b2wsIHJlc2lkLCBuY3YsIHYsIGxkdiwgaXBhcmFtLCBpcG50ciwKKyAgICAgICAgd29ya2QsIHdvcmtsLCBsd29ya2wsIGllcnIpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYXJwYWNrX3dyYXBwZXI8ZG91YmxlLCBkb3VibGU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXVwZChpbnQgKmlkbywgY2hhciAqYm1hdCwgaW50ICpuLCBjaGFyICp3aGljaCwKKyAgICAgIGludCAqbmV2LCBkb3VibGUgKnRvbCwgZG91YmxlICpyZXNpZCwgaW50ICpuY3YsCisgICAgICBkb3VibGUgKnYsIGludCAqbGR2LCBpbnQgKmlwYXJhbSwgaW50ICppcG50ciwKKyAgICAgIGRvdWJsZSAqd29ya2QsIGRvdWJsZSAqd29ya2wsIGludCAqbHdvcmtsLCBpbnQgKmluZm8pCisgIHsKKyAgICBkc2F1cGRfKGlkbywgYm1hdCwgbiwgd2hpY2gsIG5ldiwgdG9sLCByZXNpZCwgbmN2LCB2LCBsZHYsIGlwYXJhbSwgaXBudHIsIHdvcmtkLCB3b3JrbCwgbHdvcmtsLCBpbmZvKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXVwZChpbnQgKnJ2ZWMsIGNoYXIgKkFsbCwgaW50ICpzZWxlY3QsIGRvdWJsZSAqZCwKKyAgICAgIGRvdWJsZSAqeiwgaW50ICpsZHosIGRvdWJsZSAqc2lnbWEsCisgICAgICBjaGFyICpibWF0LCBpbnQgKm4sIGNoYXIgKndoaWNoLCBpbnQgKm5ldiwKKyAgICAgIGRvdWJsZSAqdG9sLCBkb3VibGUgKnJlc2lkLCBpbnQgKm5jdiwgZG91YmxlICp2LAorICAgICAgaW50ICpsZHYsIGludCAqaXBhcmFtLCBpbnQgKmlwbnRyLCBkb3VibGUgKndvcmtkLAorICAgICAgZG91YmxlICp3b3JrbCwgaW50ICpsd29ya2wsIGludCAqaWVycikKKyAgeworICAgIGRzZXVwZF8ocnZlYywgQWxsLCBzZWxlY3QsIGQsIHYsIGxkdiwgc2lnbWEsIGJtYXQsIG4sIHdoaWNoLCBuZXYsIHRvbCwgcmVzaWQsIG5jdiwgdiwgbGR2LCBpcGFyYW0sIGlwbnRyLAorICAgICAgICB3b3JrZCwgd29ya2wsIGx3b3JrbCwgaWVycik7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4U29sdmVyLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTY2FsYXIsIGJvb2wgQmlzU1BEPgorc3RydWN0IE9QCit7CisgICAgc3RhdGljIGlubGluZSB2b2lkIGFwcGx5T1AoTWF0cml4U29sdmVyICZPUCwgY29uc3QgTWF0cml4VHlwZSAmQSwgaW50IG4sIFNjYWxhciAqaW4sIFNjYWxhciAqb3V0KTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgcHJvamVjdChNYXRyaXhTb2x2ZXIgJk9QLCBpbnQgbiwgaW50IGssIFNjYWxhciAqdmVjcyk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhTb2x2ZXIsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBPUDxNYXRyaXhTb2x2ZXIsIE1hdHJpeFR5cGUsIFNjYWxhciwgdHJ1ZT4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIGFwcGx5T1AoTWF0cml4U29sdmVyICZPUCwgY29uc3QgTWF0cml4VHlwZSAmQSwgaW50IG4sIFNjYWxhciAqaW4sIFNjYWxhciAqb3V0KQoreworICAgIC8vIE9QID0gTF57LTF9IEEgTF57LVR9ICAoQiA9IExMXlQpCisgICAgLy8KKyAgICAvLyBGaXJzdCBzb2x2ZSBMXlQgb3V0ID0gaW4KKyAgICAvLworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0LCBuKSA9IE9QLm1hdHJpeFUoKS5zb2x2ZShNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKGluLCBuKSk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChvdXQsIG4pID0gT1AucGVybXV0YXRpb25QaW52KCkgKiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbik7CisKKyAgICAvLyBUaGVuIGNvbXB1dGUgb3V0ID0gQSBvdXQKKyAgICAvLworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0LCBuKSA9IEEgKiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbik7CisKKyAgICAvLyBUaGVuIHNvbHZlIEwgb3V0ID0gb3V0CisgICAgLy8KKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbikgPSBPUC5wZXJtdXRhdGlvblAoKSAqIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+OjpNYXAob3V0LCBuKTsKKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKG91dCwgbikgPSBPUC5tYXRyaXhMKCkuc29sdmUoTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT46Ok1hcChvdXQsIG4pKTsKK30KKworICBzdGF0aWMgaW5saW5lIHZvaWQgcHJvamVjdChNYXRyaXhTb2x2ZXIgJk9QLCBpbnQgbiwgaW50IGssIFNjYWxhciAqdmVjcykKK3sKKyAgICAvLyBTb2x2ZSBMXlQgb3V0ID0gaW4KKyAgICAvLworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+OjpNYXAodmVjcywgbiwgaykgPSBPUC5tYXRyaXhVKCkuc29sdmUoTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz46Ok1hcCh2ZWNzLCBuLCBrKSk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz46Ok1hcCh2ZWNzLCBuLCBrKSA9IE9QLnBlcm11dGF0aW9uUGludigpICogTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz46Ok1hcCh2ZWNzLCBuLCBrKTsKK30KKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4U29sdmVyLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgT1A8TWF0cml4U29sdmVyLCBNYXRyaXhUeXBlLCBTY2FsYXIsIGZhbHNlPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgYXBwbHlPUChNYXRyaXhTb2x2ZXIgJk9QLCBjb25zdCBNYXRyaXhUeXBlICZBLCBpbnQgbiwgU2NhbGFyICppbiwgU2NhbGFyICpvdXQpCit7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJTaG91bGQgbmV2ZXIgYmUgaW4gaGVyZS4uLiIpOworfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwcm9qZWN0KE1hdHJpeFNvbHZlciAmT1AsIGludCBuLCBpbnQgaywgU2NhbGFyICp2ZWNzKQoreworICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiU2hvdWxkIG5ldmVyIGJlIGluIGhlcmUuLi4iKTsKK30KKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQVJQQUNLU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9FdWxlckFuZ2xlcy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9FdWxlckFuZ2xlcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFmNTUwCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0V1bGVyQW5nbGVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0V1bGVyQW5nbGVzX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9FdWxlckFuZ2xlc19TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9FdWxlckFuZ2xlcyBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0V1bGVyQW5nbGVzL0V1bGVyQW5nbGVzLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRXVsZXJBbmdsZXMvRXVsZXJBbmdsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EwZGExCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0V1bGVyQW5nbGVzL0V1bGVyQW5nbGVzLmgKQEAgLTAsMCArMSwzODYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRhbCBIYWRhZCA8dGFsX2hkQGhvdG1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FVUxFUkFOR0xFU0NMQVNTX0gvLyBUT0RPOiBGaXggcHJldmlvdXMgIkVJR0VOX0VVTEVSQU5HTEVTX0giIGRlZmluaXRpb24/CisjZGVmaW5lIEVJR0VOX0VVTEVSQU5HTEVTQ0xBU1NfSAorCituYW1lc3BhY2UgRWlnZW4KK3sKKyAgLyp0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwKKyAgICAgICAgIGludCBPdGhlclJvd3M9T3RoZXI6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgaW50IE90aGVyQ29scz1PdGhlcjo6Q29sc0F0Q29tcGlsZVRpbWU+CisgIHN0cnVjdCBlaV9ldWxlcmFuZ2xlc19hc3NpZ25faW1wbDsqLworCisgIC8qKiBcY2xhc3MgRXVsZXJBbmdsZXMKKyAgICAqCisgICAgKiBcaW5ncm91cCBFdWxlckFuZ2xlc19Nb2R1bGUKKyAgICAqCisgICAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHJvdGF0aW9uIGluIGEgMyBkaW1lbnNpb25hbCBzcGFjZSBhcyB0aHJlZSBFdWxlciBhbmdsZXMuCisgICAgKgorICAgICogRXVsZXIgcm90YXRpb24gaXMgYSBzZXQgb2YgdGhyZWUgcm90YXRpb24gb2YgdGhyZWUgYW5nbGVzIG92ZXIgdGhyZWUgZml4ZWQgYXhlcywgZGVmaW5lZCBieSB0aGUgRXVsZXJTeXN0ZW0gZ2l2ZW4gYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgKiAKKyAgICAqIEhlcmUgaXMgaG93IGludHJpbnNpYyBFdWxlciBhbmdsZXMgd29ya3M6CisgICAgKiAgLSBmaXJzdCwgcm90YXRlIHRoZSBheGVzIHN5c3RlbSBvdmVyIHRoZSBhbHBoYSBheGlzIGluIGFuZ2xlIGFscGhhCisgICAgKiAgLSB0aGVuLCByb3RhdGUgdGhlIGF4ZXMgc3lzdGVtIG92ZXIgdGhlIGJldGEgYXhpcyh3aGljaCB3YXMgcm90YXRlZCBpbiB0aGUgZmlyc3Qgc3RhZ2UpIGluIGFuZ2xlIGJldGEKKyAgICAqICAtIHRoZW4sIHJvdGF0ZSB0aGUgYXhlcyBzeXN0ZW0gb3ZlciB0aGUgZ2FtbWEgYXhpcyh3aGljaCB3YXMgcm90YXRlZCBpbiB0aGUgdHdvIHN0YWdlcyBhYm92ZSkgaW4gYW5nbGUgZ2FtbWEKKyAgICAqCisgICAgKiBcbm90ZSBUaGlzIGNsYXNzIHN1cHBvcnQgb25seSBpbnRyaW5zaWMgRXVsZXIgYW5nbGVzIGZvciBzaW1wbGljaXR5LAorICAgICogIHNlZSBFdWxlclN5c3RlbSBob3cgdG8gZWFzaWx5IG92ZXJjb21lIHRoaXMgZm9yIGV4dHJpbnNpYyBzeXN0ZW1zLgorICAgICoKKyAgICAqICMjIyBSb3RhdGlvbiByZXByZXNlbnRhdGlvbiBhbmQgY29udmVyc2lvbnMgIyMjCisgICAgKgorICAgICogSXQgaGFzIGJlZW4gcHJvdmVkKHNlZSBXaWtpcGVkaWEgbGluayBiZWxvdykgdGhhdCBldmVyeSByb3RhdGlvbiBjYW4gYmUgcmVwcmVzZW50ZWQKKyAgICAqICBieSBFdWxlciBhbmdsZXMsIGJ1dCB0aGVyZSBpcyBubyBzaW5ndWxhciByZXByZXNlbnRhdGlvbiAoZS5nLiB1bmxpa2Ugcm90YXRpb24gbWF0cmljZXMpLgorICAgICogVGhlcmVmb3JlLCB5b3UgY2FuIGNvbnZlcnQgZnJvbSBFaWdlbiByb3RhdGlvbiBhbmQgdG8gdGhlbQorICAgICogIChpbmNsdWRpbmcgcm90YXRpb24gbWF0cmljZXMsIHdoaWNoIGlzIG5vdCBjYWxsZWQgInJvdGF0aW9ucyIgYnkgRWlnZW4gZGVzaWduKS4KKyAgICAqCisgICAgKiBFdWxlciBhbmdsZXMgdXN1YWxseSB1c2VkIGZvcjoKKyAgICAqICAtIGNvbnZlbmllbnQgaHVtYW4gcmVwcmVzZW50YXRpb24gb2Ygcm90YXRpb24sIGVzcGVjaWFsbHkgaW4gaW50ZXJhY3RpdmUgR1VJLgorICAgICogIC0gZ2ltYmFsIHN5c3RlbXMgYW5kIHJvYm90aWNzCisgICAgKiAgLSBlZmZpY2llbnQgZW5jb2RpbmcoaS5lLiAzIGZsb2F0cyBvbmx5KSBvZiByb3RhdGlvbiBmb3IgbmV0d29yayBwcm90b2NvbHMuCisgICAgKgorICAgICogSG93ZXZlciwgRXVsZXIgYW5nbGVzIGFyZSBzbG93IGNvbXBhcmluZyB0byBxdWF0ZXJuaW9uIG9yIG1hdHJpY2VzLAorICAgICogIGJlY2F1c2UgdGhlaXIgdW5uYXR1cmFsIG1hdGggZGVmaW5pdGlvbiwgYWx0aG91Z2ggaXQncyBzaW1wbGUgZm9yIGh1bWFuLgorICAgICogVG8gb3ZlcmNvbWUgdGhpcywgdGhpcyBjbGFzcyBwcm92aWRlIGVhc3kgbW92ZW1lbnQgZnJvbSB0aGUgbWF0aCBmcmllbmRseSByZXByZXNlbnRhdGlvbgorICAgICogIHRvIHRoZSBodW1hbiBmcmllbmRseSByZXByZXNlbnRhdGlvbiwgYW5kIHZpc2UtdmVyc2EuCisgICAgKgorICAgICogQWxsIHRoZSB1c2VyIG5lZWQgdG8gZG8gaXMgYSBzYWZlIHNpbXBsZSBDKysgdHlwZSBjb252ZXJzaW9uLAorICAgICogIGFuZCB0aGlzIGNsYXNzIHRha2UgY2FyZSBmb3IgdGhlIG1hdGguCisgICAgKiBBZGRpdGlvbmFsbHksIHNvbWUgYXhlcyByZWxhdGVkIGNvbXB1dGF0aW9uIGlzIGRvbmUgaW4gY29tcGlsZSB0aW1lLgorICAgICoKKyAgICAqICMjIyMgRXVsZXIgYW5nbGVzIHJhbmdlcyBpbiBjb252ZXJzaW9ucyAjIyMjCisgICAgKgorICAgICogV2hlbiBjb252ZXJ0aW5nIHNvbWUgcm90YXRpb24gdG8gRXVsZXIgYW5nbGVzLCB0aGVyZSBhcmUgc29tZSB3YXlzIHlvdSBjYW4gZ3VhcmFudGVlCisgICAgKiAgdGhlIEV1bGVyIGFuZ2xlcyByYW5nZXMuCisgICAgKgorICAgICogIyMjIyBpbXBsaWNpdCByYW5nZXMgIyMjIworICAgICogV2hlbiB1c2luZyBpbXBsaWNpdCByYW5nZXMsIGFsbCBhbmdsZXMgYXJlIGd1YXJhbnRlZSB0byBiZSBpbiB0aGUgcmFuZ2UgWy1QSSwgK1BJXSwKKyAgICAqICB1bmxlc3MgeW91IGNvbnZlcnQgZnJvbSBzb21lIG90aGVyIEV1bGVyIGFuZ2xlcy4KKyAgICAqIEluIHRoaXMgY2FzZSwgdGhlIHJhbmdlIGlzIF9fdW5kZWZpbmVkX18gKG1pZ2h0IGJlIGV2ZW4gbGVzcyB0aGFuIC1QSSBvciBncmVhdGVyIHRoYW4gKzIqUEkpLgorICAgICogXHNhIEV1bGVyQW5nbGVzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mKQorICAgICogXHNhIEV1bGVyQW5nbGVzKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLCAzPiYpCisgICAgKgorICAgICogIyMjIyBleHBsaWNpdCByYW5nZXMgIyMjIworICAgICogV2hlbiB1c2luZyBleHBsaWNpdCByYW5nZXMsIGFsbCBhbmdsZXMgYXJlIGd1YXJhbnRlZSB0byBiZSBpbiB0aGUgcmFuZ2UgeW91IGNob29zZS4KKyAgICAqIEluIHRoZSByYW5nZSBCb29sZWFuIHBhcmFtZXRlciwgeW91J3JlIGJlZW4gYXNrIHdoZXRoZXIgeW91IHByZWZlciB0aGUgcG9zaXRpdmUgcmFuZ2Ugb3Igbm90OgorICAgICogLSBfdHJ1ZV8gLSBmb3JjZSB0aGUgcmFuZ2UgYmV0d2VlbiBbMCwgKzIqUEldCisgICAgKiAtIF9mYWxzZV8gLSBmb3JjZSB0aGUgcmFuZ2UgYmV0d2VlbiBbLVBJLCArUEldCisgICAgKgorICAgICogIyMjIyMgY29tcGlsZSB0aW1lIHJhbmdlcyAjIyMjIworICAgICogVGhpcyBpcyB3aGVuIHlvdSBoYXZlIGNvbXBpbGUgdGltZSByYW5nZXMgYW5kIHlvdSBwcmVmZXIgdG8KKyAgICAqICB1c2UgdGVtcGxhdGUgcGFyYW1ldGVyLiAoZS5nLiBmb3IgcGVyZm9ybWFuY2UpCisgICAgKiBcc2EgRnJvbVJvdGF0aW9uKCkKKyAgICAqCisgICAgKiAjIyMjIyBydW4tdGltZSB0aW1lIHJhbmdlcyAjIyMjIworICAgICogUnVuLXRpbWUgcmFuZ2VzIGFyZSBhbHNvIHN1cHBvcnRlZC4KKyAgICAqIFxzYSBFdWxlckFuZ2xlcyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiwgYm9vbCwgYm9vbCwgYm9vbCkKKyAgICAqIFxzYSBFdWxlckFuZ2xlcyhjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCwgMz4mLCBib29sLCBib29sLCBib29sKQorICAgICoKKyAgICAqICMjIyBDb252ZW5pZW50IHVzZXIgdHlwZWRlZnMgIyMjCisgICAgKgorICAgICogQ29udmVuaWVudCB0eXBlZGVmcyBmb3IgRXVsZXJBbmdsZXMgZXhpc3QgZm9yIGZsb2F0IGFuZCBkb3VibGUgc2NhbGFyLAorICAgICogIGluIGEgZm9ybSBvZiBFdWxlckFuZ2xlc3tBfXtCfXtDfXtzY2FsYXJ9LAorICAgICogIGUuZy4gXHJlZiBFdWxlckFuZ2xlc1hZWmQsIFxyZWYgRXVsZXJBbmdsZXNaWVpmLgorICAgICoKKyAgICAqIE9ubHkgZm9yIHBvc2l0aXZlIGF4ZXN7K3gsK3ksK3p9IEV1bGVyIHN5c3RlbXMgYXJlIGhhdmUgY29udmVuaWVudCB0eXBlZGVmLgorICAgICogSWYgeW91IG5lZWQgbmVnYXRpdmUgYXhlc3steCwteSwten0sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSB5b3Ugb3duIHR5cGVkZWYgd2l0aAorICAgICogIGEgd29yZCB0aGF0IHJlcHJlc2VudCB3aGF0IHlvdSBuZWVkLgorICAgICoKKyAgICAqICMjIyBFeGFtcGxlICMjIworICAgICoKKyAgICAqIFxpbmNsdWRlIEV1bGVyQW5nbGVzLmNwcAorICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRXVsZXJBbmdsZXMub3V0CisgICAgKgorICAgICogIyMjIEFkZGl0aW9uYWwgcmVhZGluZyAjIyMKKyAgICAqCisgICAgKiBJZiB5b3UncmUgd2FudCB0byBnZXQgbW9yZSBpZGVhIGFib3V0IGhvdyBFdWxlciBzeXN0ZW0gd29yayBpbiBFaWdlbiBzZWUgRXVsZXJTeXN0ZW0uCisgICAgKgorICAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBFdWxlciBhbmdsZXM6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V1bGVyX2FuZ2xlcworICAgICoKKyAgICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBhbmdsZXMuCisgICAgKgorICAgICogXHRwYXJhbSBfU3lzdGVtIHRoZSBFdWxlclN5c3RlbSB0byB1c2UsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGF4ZXMgb2Ygcm90YXRpb24uCisgICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGNsYXNzIF9TeXN0ZW0+CisgIGNsYXNzIEV1bGVyQW5nbGVzIDogcHVibGljIFJvdGF0aW9uQmFzZTxFdWxlckFuZ2xlczxfU2NhbGFyLCBfU3lzdGVtPiwgMz4KKyAgeworICAgIHB1YmxpYzoKKyAgICAgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGFuZ2xlcyAqLworICAgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICAgIAorICAgICAgLyoqIHRoZSBFdWxlclN5c3RlbSB0byB1c2UsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGF4ZXMgb2Ygcm90YXRpb24uICovCisgICAgICB0eXBlZGVmIF9TeXN0ZW0gU3lzdGVtOworICAgIAorICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsgLyohPCB0aGUgZXF1aXZhbGVudCByb3RhdGlvbiBtYXRyaXggdHlwZSAqLworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsgLyohPCB0aGUgZXF1aXZhbGVudCAzIGRpbWVuc2lvbiB2ZWN0b3IgdHlwZSAqLworICAgICAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvblR5cGU7IC8qITwgdGhlIGVxdWl2YWxlbnQgcXVhdGVybmlvbiB0eXBlICovCisgICAgICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc1R5cGU7IC8qITwgdGhlIGVxdWl2YWxlbnQgYW5nbGUtYXhpcyB0eXBlICovCisgICAgICAKKyAgICAgIC8qKiBccmV0dXJucyB0aGUgYXhpcyB2ZWN0b3Igb2YgdGhlIGZpcnN0IChhbHBoYSkgcm90YXRpb24gKi8KKyAgICAgIHN0YXRpYyBWZWN0b3IzIEFscGhhQXhpc1ZlY3RvcigpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yMyYgdSA9IFZlY3RvcjM6OlVuaXQoU3lzdGVtOjpBbHBoYUF4aXNBYnMgLSAxKTsKKyAgICAgICAgcmV0dXJuIFN5c3RlbTo6SXNBbHBoYU9wcG9zaXRlID8gLXUgOiB1OworICAgICAgfQorICAgICAgCisgICAgICAvKiogXHJldHVybnMgdGhlIGF4aXMgdmVjdG9yIG9mIHRoZSBzZWNvbmQgKGJldGEpIHJvdGF0aW9uICovCisgICAgICBzdGF0aWMgVmVjdG9yMyBCZXRhQXhpc1ZlY3RvcigpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yMyYgdSA9IFZlY3RvcjM6OlVuaXQoU3lzdGVtOjpCZXRhQXhpc0FicyAtIDEpOworICAgICAgICByZXR1cm4gU3lzdGVtOjpJc0JldGFPcHBvc2l0ZSA/IC11IDogdTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqIFxyZXR1cm5zIHRoZSBheGlzIHZlY3RvciBvZiB0aGUgdGhpcmQgKGdhbW1hKSByb3RhdGlvbiAqLworICAgICAgc3RhdGljIFZlY3RvcjMgR2FtbWFBeGlzVmVjdG9yKCkgeworICAgICAgICBjb25zdCBWZWN0b3IzJiB1ID0gVmVjdG9yMzo6VW5pdChTeXN0ZW06OkdhbW1hQXhpc0FicyAtIDEpOworICAgICAgICByZXR1cm4gU3lzdGVtOjpJc0dhbW1hT3Bwb3NpdGUgPyAtdSA6IHU7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgVmVjdG9yMyBtX2FuZ2xlczsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgICAgICBFdWxlckFuZ2xlcygpIHt9CisgICAgICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBFdWxlciBhbmdsZXMoXHAgYWxwaGEsIFxwIGJldGEsIFxwIGdhbW1hKS4gKi8KKyAgICAgIEV1bGVyQW5nbGVzKGNvbnN0IFNjYWxhciYgYWxwaGEsIGNvbnN0IFNjYWxhciYgYmV0YSwgY29uc3QgU2NhbGFyJiBnYW1tYSkgOgorICAgICAgICBtX2FuZ2xlcyhhbHBoYSwgYmV0YSwgZ2FtbWEpIHt9CisgICAgICAKKyAgICAgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIEV1bGVyIGFuZ2xlcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCBccCBtLgorICAgICAgICAqCisgICAgICAgICogXG5vdGUgQWxsIGFuZ2xlcyB3aWxsIGJlIGluIHRoZSByYW5nZSBbLVBJLCBQSV0uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICAgIEV1bGVyQW5nbGVzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pIHsgKnRoaXMgPSBtOyB9CisgICAgICAKKyAgICAgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIEV1bGVyIGFuZ2xlcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCBccCBtLAorICAgICAgICAqICB3aXRoIG9wdGlvbnMgdG8gY2hvb3NlIGZvciBlYWNoIGFuZ2xlIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuCisgICAgICAgICoKKyAgICAgICAgKiBJZiBwb3NpdGl2ZSByYW5nZSBpcyB0cnVlLCB0aGVuIHRoZSBzcGVjaWZpZWQgYW5nbGUgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsICsyKlBJXS4KKyAgICAgICAgKiBPdGhlcndpc2UsIHRoZSBzcGVjaWZpZWQgYW5nbGUgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWy1QSSwgK1BJXS4KKyAgICAgICAgKgorICAgICAgICAqIFxwYXJhbSBtIFRoZSAzeDMgcm90YXRpb24gbWF0cml4IHRvIGNvbnZlcnQKKyAgICAgICAgKiBccGFyYW0gcG9zaXRpdmVSYW5nZUFscGhhIElmIHRydWUsIGFscGhhIHdpbGwgYmUgaW4gWzAsIDIqUEldLiBPdGhlcndpc2UsIGluIFstUEksICtQSV0uCisgICAgICAgICogXHBhcmFtIHBvc2l0aXZlUmFuZ2VCZXRhIElmIHRydWUsIGJldGEgd2lsbCBiZSBpbiBbMCwgMipQSV0uIE90aGVyd2lzZSwgaW4gWy1QSSwgK1BJXS4KKyAgICAgICAgKiBccGFyYW0gcG9zaXRpdmVSYW5nZUdhbW1hIElmIHRydWUsIGdhbW1hIHdpbGwgYmUgaW4gWzAsIDIqUEldLiBPdGhlcndpc2UsIGluIFstUEksICtQSV0uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICAgIEV1bGVyQW5nbGVzKAorICAgICAgICBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLAorICAgICAgICBib29sIHBvc2l0aXZlUmFuZ2VBbHBoYSwKKyAgICAgICAgYm9vbCBwb3NpdGl2ZVJhbmdlQmV0YSwKKyAgICAgICAgYm9vbCBwb3NpdGl2ZVJhbmdlR2FtbWEpIHsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbTo6Q2FsY0V1bGVyQW5nbGVzKCp0aGlzLCBtLCBwb3NpdGl2ZVJhbmdlQWxwaGEsIHBvc2l0aXZlUmFuZ2VCZXRhLCBwb3NpdGl2ZVJhbmdlR2FtbWEpOworICAgICAgfQorICAgICAgCisgICAgICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBFdWxlciBhbmdsZXMgZnJvbSBhIHJvdGF0aW9uIFxwIHJvdC4KKyAgICAgICAgKgorICAgICAgICAqIFxub3RlIEFsbCBhbmdsZXMgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWy1QSSwgUEldLCB1bmxlc3MgXHAgcm90IGlzIGFuIEV1bGVyQW5nbGVzLgorICAgICAgICAqICBJZiByb3QgaXMgYW4gRXVsZXJBbmdsZXMsIGV4cGVjdGVkIEV1bGVyQW5nbGVzIHJhbmdlIGlzIF9fdW5kZWZpbmVkX18uCisgICAgICAgICogIChVc2Ugb3RoZXIgZnVuY3Rpb25zIGhlcmUgZm9yIGVuZm9yY2luZyByYW5nZSBpZiB0aGlzIGVmZmVjdCBpcyBkZXNpcmVkKQorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgICBFdWxlckFuZ2xlcyhjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCwgMz4mIHJvdCkgeyAqdGhpcyA9IHJvdDsgfQorICAgICAgCisgICAgICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBFdWxlciBhbmdsZXMgZnJvbSBhIHJvdGF0aW9uIFxwIHJvdCwKKyAgICAgICAgKiAgd2l0aCBvcHRpb25zIHRvIGNob29zZSBmb3IgZWFjaCBhbmdsZSB0aGUgcmVxdWVzdGVkIHJhbmdlLgorICAgICAgICAqCisgICAgICAgICogSWYgcG9zaXRpdmUgcmFuZ2UgaXMgdHJ1ZSwgdGhlbiB0aGUgc3BlY2lmaWVkIGFuZ2xlIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswLCArMipQSV0uCisgICAgICAgICogT3RoZXJ3aXNlLCB0aGUgc3BlY2lmaWVkIGFuZ2xlIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFstUEksICtQSV0uCisgICAgICAgICoKKyAgICAgICAgKiBccGFyYW0gcm90IFRoZSAzeDMgcm90YXRpb24gbWF0cml4IHRvIGNvbnZlcnQKKyAgICAgICAgKiBccGFyYW0gcG9zaXRpdmVSYW5nZUFscGhhIElmIHRydWUsIGFscGhhIHdpbGwgYmUgaW4gWzAsIDIqUEldLiBPdGhlcndpc2UsIGluIFstUEksICtQSV0uCisgICAgICAgICogXHBhcmFtIHBvc2l0aXZlUmFuZ2VCZXRhIElmIHRydWUsIGJldGEgd2lsbCBiZSBpbiBbMCwgMipQSV0uIE90aGVyd2lzZSwgaW4gWy1QSSwgK1BJXS4KKyAgICAgICAgKiBccGFyYW0gcG9zaXRpdmVSYW5nZUdhbW1hIElmIHRydWUsIGdhbW1hIHdpbGwgYmUgaW4gWzAsIDIqUEldLiBPdGhlcndpc2UsIGluIFstUEksICtQSV0uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICAgIEV1bGVyQW5nbGVzKAorICAgICAgICBjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCwgMz4mIHJvdCwKKyAgICAgICAgYm9vbCBwb3NpdGl2ZVJhbmdlQWxwaGEsCisgICAgICAgIGJvb2wgcG9zaXRpdmVSYW5nZUJldGEsCisgICAgICAgIGJvb2wgcG9zaXRpdmVSYW5nZUdhbW1hKSB7CisgICAgICAgIAorICAgICAgICBTeXN0ZW06OkNhbGNFdWxlckFuZ2xlcygqdGhpcywgcm90LnRvUm90YXRpb25NYXRyaXgoKSwgcG9zaXRpdmVSYW5nZUFscGhhLCBwb3NpdGl2ZVJhbmdlQmV0YSwgcG9zaXRpdmVSYW5nZUdhbW1hKTsKKyAgICAgIH0KKworICAgICAgLyoqIFxyZXR1cm5zIFRoZSBhbmdsZSB2YWx1ZXMgc3RvcmVkIGluIGEgdmVjdG9yIChhbHBoYSwgYmV0YSwgZ2FtbWEpLiAqLworICAgICAgY29uc3QgVmVjdG9yMyYgYW5nbGVzKCkgY29uc3QgeyByZXR1cm4gbV9hbmdsZXM7IH0KKyAgICAgIC8qKiBccmV0dXJucyBBIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBhbmdsZSB2YWx1ZXMgc3RvcmVkIGluIGEgdmVjdG9yIChhbHBoYSwgYmV0YSwgZ2FtbWEpLiAqLworICAgICAgVmVjdG9yMyYgYW5nbGVzKCkgeyByZXR1cm4gbV9hbmdsZXM7IH0KKworICAgICAgLyoqIFxyZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYW5nbGUuICovCisgICAgICBTY2FsYXIgYWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlc1swXTsgfQorICAgICAgLyoqIFxyZXR1cm5zIEEgcmVhZC13cml0ZSByZWZlcmVuY2UgdG8gdGhlIGFuZ2xlIG9mIHRoZSBmaXJzdCBhbmdsZS4gKi8KKyAgICAgIFNjYWxhciYgYWxwaGEoKSB7IHJldHVybiBtX2FuZ2xlc1swXTsgfQorCisgICAgICAvKiogXHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgYW5nbGUuICovCisgICAgICBTY2FsYXIgYmV0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5nbGVzWzFdOyB9CisgICAgICAvKiogXHJldHVybnMgQSByZWFkLXdyaXRlIHJlZmVyZW5jZSB0byB0aGUgYW5nbGUgb2YgdGhlIHNlY29uZCBhbmdsZS4gKi8KKyAgICAgIFNjYWxhciYgYmV0YSgpIHsgcmV0dXJuIG1fYW5nbGVzWzFdOyB9CisKKyAgICAgIC8qKiBccmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRoaXJkIGFuZ2xlLiAqLworICAgICAgU2NhbGFyIGdhbW1hKCkgY29uc3QgeyByZXR1cm4gbV9hbmdsZXNbMl07IH0KKyAgICAgIC8qKiBccmV0dXJucyBBIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBhbmdsZSBvZiB0aGUgdGhpcmQgYW5nbGUuICovCisgICAgICBTY2FsYXImIGdhbW1hKCkgeyByZXR1cm4gbV9hbmdsZXNbMl07IH0KKworICAgICAgLyoqIFxyZXR1cm5zIFRoZSBFdWxlciBhbmdsZXMgcm90YXRpb24gaW52ZXJzZSAod2hpY2ggaXMgYXMgc2FtZSBhcyB0aGUgbmVnYXRpdmUpLAorICAgICAgICAqICAoLWFscGhhLCAtYmV0YSwgLWdhbW1hKS4KKyAgICAgICovCisgICAgICBFdWxlckFuZ2xlcyBpbnZlcnNlKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgRXVsZXJBbmdsZXMgcmVzOworICAgICAgICByZXMubV9hbmdsZXMgPSAtbV9hbmdsZXM7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisKKyAgICAgIC8qKiBccmV0dXJucyBUaGUgRXVsZXIgYW5nbGVzIHJvdGF0aW9uIG5lZ2F0aXZlICh3aGljaCBpcyBhcyBzYW1lIGFzIHRoZSBpbnZlcnNlKSwKKyAgICAgICAgKiAgKC1hbHBoYSwgLWJldGEsIC1nYW1tYSkuCisgICAgICAqLworICAgICAgRXVsZXJBbmdsZXMgb3BlcmF0b3IgLSgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBpbnZlcnNlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIEV1bGVyIGFuZ2xlcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCBccCBtLAorICAgICAgICAqICB3aXRoIG9wdGlvbnMgdG8gY2hvb3NlIGZvciBlYWNoIGFuZ2xlIHRoZSByZXF1ZXN0ZWQgcmFuZ2UgKF9fb25seSBpbiBjb21waWxlIHRpbWVfXykuCisgICAgICAgICoKKyAgICAgICAgKiBJZiBwb3NpdGl2ZSByYW5nZSBpcyB0cnVlLCB0aGVuIHRoZSBzcGVjaWZpZWQgYW5nbGUgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAsICsyKlBJXS4KKyAgICAgICAgKiBPdGhlcndpc2UsIHRoZSBzcGVjaWZpZWQgYW5nbGUgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWy1QSSwgK1BJXS4KKyAgICAgICAgKgorICAgICAgICAqIFxwYXJhbSBtIFRoZSAzeDMgcm90YXRpb24gbWF0cml4IHRvIGNvbnZlcnQKKyAgICAgICAgKiBcdHBhcmFtIHBvc2l0aXZlUmFuZ2VBbHBoYSBJZiB0cnVlLCBhbHBoYSB3aWxsIGJlIGluIFswLCAyKlBJXS4gT3RoZXJ3aXNlLCBpbiBbLVBJLCArUEldLgorICAgICAgICAqIFx0cGFyYW0gcG9zaXRpdmVSYW5nZUJldGEgSWYgdHJ1ZSwgYmV0YSB3aWxsIGJlIGluIFswLCAyKlBJXS4gT3RoZXJ3aXNlLCBpbiBbLVBJLCArUEldLgorICAgICAgICAqIFx0cGFyYW0gcG9zaXRpdmVSYW5nZUdhbW1hIElmIHRydWUsIGdhbW1hIHdpbGwgYmUgaW4gWzAsIDIqUEldLiBPdGhlcndpc2UsIGluIFstUEksICtQSV0uCisgICAgICAgICovCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgYm9vbCBQb3NpdGl2ZVJhbmdlQWxwaGEsCisgICAgICAgIGJvb2wgUG9zaXRpdmVSYW5nZUJldGEsCisgICAgICAgIGJvb2wgUG9zaXRpdmVSYW5nZUdhbW1hLAorICAgICAgICB0eXBlbmFtZSBEZXJpdmVkPgorICAgICAgc3RhdGljIEV1bGVyQW5nbGVzIEZyb21Sb3RhdGlvbihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICAgICAgeworICAgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX01BVFJJWF9TUEVDSUZJQ19TSVpFKERlcml2ZWQsIDMsIDMpCisgICAgICAgIAorICAgICAgICBFdWxlckFuZ2xlcyBlOworICAgICAgICBTeXN0ZW06OnRlbXBsYXRlIENhbGNFdWxlckFuZ2xlczwKKyAgICAgICAgICBQb3NpdGl2ZVJhbmdlQWxwaGEsIFBvc2l0aXZlUmFuZ2VCZXRhLCBQb3NpdGl2ZVJhbmdlR2FtbWEsIF9TY2FsYXI+KGUsIG0pOworICAgICAgICByZXR1cm4gZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgRXVsZXIgYW5nbGVzIGZyb20gYSByb3RhdGlvbiBccCByb3QsCisgICAgICAgICogIHdpdGggb3B0aW9ucyB0byBjaG9vc2UgZm9yIGVhY2ggYW5nbGUgdGhlIHJlcXVlc3RlZCByYW5nZSAoX19vbmx5IGluIGNvbXBpbGUgdGltZV9fKS4KKyAgICAgICAgKgorICAgICAgICAqIElmIHBvc2l0aXZlIHJhbmdlIGlzIHRydWUsIHRoZW4gdGhlIHNwZWNpZmllZCBhbmdsZSB3aWxsIGJlIGluIHRoZSByYW5nZSBbMCwgKzIqUEldLgorICAgICAgICAqIE90aGVyd2lzZSwgdGhlIHNwZWNpZmllZCBhbmdsZSB3aWxsIGJlIGluIHRoZSByYW5nZSBbLVBJLCArUEldLgorICAgICAgICAqCisgICAgICAgICogXHBhcmFtIHJvdCBUaGUgM3gzIHJvdGF0aW9uIG1hdHJpeCB0byBjb252ZXJ0CisgICAgICAgICogXHRwYXJhbSBwb3NpdGl2ZVJhbmdlQWxwaGEgSWYgdHJ1ZSwgYWxwaGEgd2lsbCBiZSBpbiBbMCwgMipQSV0uIE90aGVyd2lzZSwgaW4gWy1QSSwgK1BJXS4KKyAgICAgICAgKiBcdHBhcmFtIHBvc2l0aXZlUmFuZ2VCZXRhIElmIHRydWUsIGJldGEgd2lsbCBiZSBpbiBbMCwgMipQSV0uIE90aGVyd2lzZSwgaW4gWy1QSSwgK1BJXS4KKyAgICAgICAgKiBcdHBhcmFtIHBvc2l0aXZlUmFuZ2VHYW1tYSBJZiB0cnVlLCBnYW1tYSB3aWxsIGJlIGluIFswLCAyKlBJXS4gT3RoZXJ3aXNlLCBpbiBbLVBJLCArUEldLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPAorICAgICAgICBib29sIFBvc2l0aXZlUmFuZ2VBbHBoYSwKKyAgICAgICAgYm9vbCBQb3NpdGl2ZVJhbmdlQmV0YSwKKyAgICAgICAgYm9vbCBQb3NpdGl2ZVJhbmdlR2FtbWEsCisgICAgICAgIHR5cGVuYW1lIERlcml2ZWQ+CisgICAgICBzdGF0aWMgRXVsZXJBbmdsZXMgRnJvbVJvdGF0aW9uKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLCAzPiYgcm90KQorICAgICAgeworICAgICAgICByZXR1cm4gRnJvbVJvdGF0aW9uPFBvc2l0aXZlUmFuZ2VBbHBoYSwgUG9zaXRpdmVSYW5nZUJldGEsIFBvc2l0aXZlUmFuZ2VHYW1tYT4ocm90LnRvUm90YXRpb25NYXRyaXgoKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qRXVsZXJBbmdsZXMmIGZyb21RdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJiBxKQorICAgICAgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgaXQgaW4gYSBmYXN0ZXIgd2F5IGZvciBxdWF0ZXJuaW9ucworICAgICAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0V1bGVyLworICAgICAgICAvLyAgd2UgY2FuIGNvbXB1dGUgb25seSB0aGUgbmVlZGVkIG1hdHJpeCBjZWxscyBhbmQgdGhlbiBjb252ZXJ0IHRvIGV1bGVyIGFuZ2xlcy4gKHNlZSBaWVggZXhhbXBsZSBiZWxvdykKKyAgICAgICAgLy8gQ3VycmVudGx5IHdlIGNvbXB1dGUgYWxsIG1hdHJpeCBjZWxscyBmcm9tIHF1YXRlcm5pb24uCisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIG9ubHkgZm9yIFpZWAorICAgICAgICAvL1NjYWxhciB5MiA9IHEueSgpICogcS55KCk7CisgICAgICAgIC8vbV9hbmdsZXNbMF0gPSBzdGQ6OmF0YW4yKDIqKHEudygpKnEueigpICsgcS54KCkqcS55KCkpLCAoMSAtIDIqKHkyICsgcS56KCkqcS56KCkpKSk7CisgICAgICAgIC8vbV9hbmdsZXNbMV0gPSBzdGQ6OmFzaW4oIDIqKHEudygpKnEueSgpIC0gcS56KCkqcS54KCkpKTsKKyAgICAgICAgLy9tX2FuZ2xlc1syXSA9IHN0ZDo6YXRhbjIoMioocS53KCkqcS54KCkgKyBxLnkoKSpxLnooKSksICgxIC0gMioocS54KCkqcS54KCkgKyB5MikpKTsKKyAgICAgIH0qLworICAgICAgCisgICAgICAvKiogU2V0IFxjICp0aGlzIGZyb20gYSByb3RhdGlvbiBtYXRyaXgoaS5lLiBwdXJlIG9ydGhvZ29uYWwgbWF0cml4IHdpdGggZGV0ZXJtaW5hbnQgb2YgKzEpLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICAgIEV1bGVyQW5nbGVzJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgeworICAgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX01BVFJJWF9TUEVDSUZJQ19TSVpFKERlcml2ZWQsIDMsIDMpCisgICAgICAgIAorICAgICAgICBTeXN0ZW06OkNhbGNFdWxlckFuZ2xlcygqdGhpcywgbSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogQXNzaWduIGFuZCBjb25zdHJ1Y3QgZnJvbSBhbm90aGVyIEV1bGVyQW5nbGVzICh3aXRoIGRpZmZlcmVudCBzeXN0ZW0pCisgICAgICAKKyAgICAgIC8qKiBTZXQgXGMgKnRoaXMgZnJvbSBhIHJvdGF0aW9uLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICAgIEV1bGVyQW5nbGVzJiBvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsIDM+JiByb3QpIHsKKyAgICAgICAgU3lzdGVtOjpDYWxjRXVsZXJBbmdsZXMoKnRoaXMsIHJvdC50b1JvdGF0aW9uTWF0cml4KCkpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFRPRE86IFN1cHBvcnQgaXNBcHByb3ggZnVuY3Rpb24KKworICAgICAgLyoqIFxyZXR1cm5zIGFuIGVxdWl2YWxlbnQgM3gzIHJvdGF0aW9uIG1hdHJpeC4gKi8KKyAgICAgIE1hdHJpeDMgdG9Sb3RhdGlvbk1hdHJpeCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxRdWF0ZXJuaW9uVHlwZT4oKnRoaXMpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgICAgIH0KKworICAgICAgLyoqIENvbnZlcnQgdGhlIEV1bGVyIGFuZ2xlcyB0byBxdWF0ZXJuaW9uLiAqLworICAgICAgb3BlcmF0b3IgUXVhdGVybmlvblR5cGUoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICBBbmdsZUF4aXNUeXBlKGFscGhhKCksIEFscGhhQXhpc1ZlY3RvcigpKSAqCisgICAgICAgICAgQW5nbGVBeGlzVHlwZShiZXRhKCksIEJldGFBeGlzVmVjdG9yKCkpICAgKgorICAgICAgICAgIEFuZ2xlQXhpc1R5cGUoZ2FtbWEoKSwgR2FtbWFBeGlzVmVjdG9yKCkpOworICAgICAgfQorICAgICAgCisgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgcywgY29uc3QgRXVsZXJBbmdsZXM8U2NhbGFyLCBTeXN0ZW0+JiBldWxlckFuZ2xlcykKKyAgICAgIHsKKyAgICAgICAgcyA8PCBldWxlckFuZ2xlcy5hbmdsZXMoKS50cmFuc3Bvc2UoKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgICB9CisgIH07CisKKyNkZWZpbmUgRUlHRU5fRVVMRVJfQU5HTEVTX1NJTkdMRV9UWVBFREVGKEFYRVMsIFNDQUxBUl9UWVBFLCBTQ0FMQVJfUE9TVEZJWCkgXAorICAvKiogXGluZ3JvdXAgRXVsZXJBbmdsZXNfTW9kdWxlICovIFwKKyAgdHlwZWRlZiBFdWxlckFuZ2xlczxTQ0FMQVJfVFlQRSwgRXVsZXJTeXN0ZW0jI0FYRVM+IEV1bGVyQW5nbGVzIyNBWEVTIyNTQ0FMQVJfUE9TVEZJWDsKKworI2RlZmluZSBFSUdFTl9FVUxFUl9BTkdMRVNfVFlQRURFRlMoU0NBTEFSX1RZUEUsIFNDQUxBUl9QT1NURklYKSBcCisgIEVJR0VOX0VVTEVSX0FOR0xFU19TSU5HTEVfVFlQRURFRihYWVosIFNDQUxBUl9UWVBFLCBTQ0FMQVJfUE9TVEZJWCkgXAorICBFSUdFTl9FVUxFUl9BTkdMRVNfU0lOR0xFX1RZUEVERUYoWFlYLCBTQ0FMQVJfVFlQRSwgU0NBTEFSX1BPU1RGSVgpIFwKKyAgRUlHRU5fRVVMRVJfQU5HTEVTX1NJTkdMRV9UWVBFREVGKFhaWSwgU0NBTEFSX1RZUEUsIFNDQUxBUl9QT1NURklYKSBcCisgIEVJR0VOX0VVTEVSX0FOR0xFU19TSU5HTEVfVFlQRURFRihYWlgsIFNDQUxBUl9UWVBFLCBTQ0FMQVJfUE9TVEZJWCkgXAorIFwKKyAgRUlHRU5fRVVMRVJfQU5HTEVTX1NJTkdMRV9UWVBFREVGKFlaWCwgU0NBTEFSX1RZUEUsIFNDQUxBUl9QT1NURklYKSBcCisgIEVJR0VOX0VVTEVSX0FOR0xFU19TSU5HTEVfVFlQRURFRihZWlksIFNDQUxBUl9UWVBFLCBTQ0FMQVJfUE9TVEZJWCkgXAorICBFSUdFTl9FVUxFUl9BTkdMRVNfU0lOR0xFX1RZUEVERUYoWVhaLCBTQ0FMQVJfVFlQRSwgU0NBTEFSX1BPU1RGSVgpIFwKKyAgRUlHRU5fRVVMRVJfQU5HTEVTX1NJTkdMRV9UWVBFREVGKFlYWSwgU0NBTEFSX1RZUEUsIFNDQUxBUl9QT1NURklYKSBcCisgXAorICBFSUdFTl9FVUxFUl9BTkdMRVNfU0lOR0xFX1RZUEVERUYoWlhZLCBTQ0FMQVJfVFlQRSwgU0NBTEFSX1BPU1RGSVgpIFwKKyAgRUlHRU5fRVVMRVJfQU5HTEVTX1NJTkdMRV9UWVBFREVGKFpYWiwgU0NBTEFSX1RZUEUsIFNDQUxBUl9QT1NURklYKSBcCisgIEVJR0VOX0VVTEVSX0FOR0xFU19TSU5HTEVfVFlQRURFRihaWVgsIFNDQUxBUl9UWVBFLCBTQ0FMQVJfUE9TVEZJWCkgXAorICBFSUdFTl9FVUxFUl9BTkdMRVNfU0lOR0xFX1RZUEVERUYoWllaLCBTQ0FMQVJfVFlQRSwgU0NBTEFSX1BPU1RGSVgpCisKK0VJR0VOX0VVTEVSX0FOR0xFU19UWVBFREVGUyhmbG9hdCwgZikKK0VJR0VOX0VVTEVSX0FOR0xFU19UWVBFREVGUyhkb3VibGUsIGQpCisKKyAgbmFtZXNwYWNlIGludGVybmFsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBjbGFzcyBfU3lzdGVtPgorICAgIHN0cnVjdCB0cmFpdHM8RXVsZXJBbmdsZXM8X1NjYWxhciwgX1N5c3RlbT4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgfTsKKyAgfQorICAKK30KKworI2VuZGlmIC8vIEVJR0VOX0VVTEVSQU5HTEVTQ0xBU1NfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0V1bGVyQW5nbGVzL0V1bGVyU3lzdGVtLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRXVsZXJBbmdsZXMvRXVsZXJTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY5ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0V1bGVyQW5nbGVzL0V1bGVyU3lzdGVtLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRhbCBIYWRhZCA8dGFsX2hkQGhvdG1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FVUxFUlNZU1RFTV9ICisjZGVmaW5lIEVJR0VOX0VVTEVSU1lTVEVNX0gKKworbmFtZXNwYWNlIEVpZ2VuCit7CisgIC8vIEZvcndhcmQgZGVjbGVyYXRpb25zCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBjbGFzcyBfU3lzdGVtPgorICBjbGFzcyBFdWxlckFuZ2xlczsKKyAgCisgIG5hbWVzcGFjZSBpbnRlcm5hbAorICB7CisgICAgLy8gVE9ETzogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdHMgb24gdGhlIHJlc3QgQVBJCisgICAgdGVtcGxhdGUgPGludCBOdW0sIGJvb2wgSXNQb3NpdGl2ZSA9IChOdW0gPiAwKT4KKyAgICBzdHJ1Y3QgQWJzCisgICAgeworICAgICAgZW51bSB7IHZhbHVlID0gTnVtIH07CisgICAgfTsKKyAgCisgICAgdGVtcGxhdGUgPGludCBOdW0+CisgICAgc3RydWN0IEFiczxOdW0sIGZhbHNlPgorICAgIHsKKyAgICAgIGVudW0geyB2YWx1ZSA9IC1OdW0gfTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPGludCBBeGlzPgorICAgIHN0cnVjdCBJc1ZhbGlkQXhpcworICAgIHsKKyAgICAgIGVudW0geyB2YWx1ZSA9IEF4aXMgIT0gMCAmJiBBYnM8QXhpcz46OnZhbHVlIDw9IDMgfTsKKyAgICB9OworICB9CisgIAorICAjZGVmaW5lIEVJR0VOX0VVTEVSX0FOR0xFU19DTEFTU19TVEFUSUNfQVNTRVJUKENPTkQsTVNHKSB0eXBlZGVmIGNoYXIgc3RhdGljX2Fzc2VydGlvbl8jI01TR1soQ09ORCk/MTotMV0KKyAgCisgIC8qKiBcYnJpZWYgUmVwcmVzZW50YXRpb24gb2YgYSBmaXhlZCBzaWduZWQgcm90YXRpb24gYXhpcyBmb3IgRXVsZXJTeXN0ZW0uCisgICAgKgorICAgICogXGluZ3JvdXAgRXVsZXJBbmdsZXNfTW9kdWxlCisgICAgKgorICAgICogVmFsdWVzIGhlcmUgcmVwcmVzZW50OgorICAgICogIC0gVGhlIGF4aXMgb2YgdGhlIHJvdGF0aW9uOiBYLCBZIG9yIFouCisgICAgKiAgLSBUaGUgc2lnbiAoaS5lLiBkaXJlY3Rpb24gb2YgdGhlIHJvdGF0aW9uIGFsb25nIHRoZSBheGlzKTogcG9zaXRpdmUoKykgb3IgbmVnYXRpdmUoLSkKKyAgICAqCisgICAgKiBUaGVyZWZvcmUsIHRoaXMgY291bGQgZXhwcmVzcyBhbGwgdGhlIGF4ZXMgeytYLCtZLCtaLC1YLC1ZLC1afQorICAgICoKKyAgICAqIEZvciBwb3NpdGl2ZSBheGlzLCB1c2UgK0VVTEVSX3theGlzfSwgYW5kIGZvciBuZWdhdGl2ZSBheGlzIHVzZSAtRVVMRVJfe2F4aXN9LgorICAgICovCisgIGVudW0gRXVsZXJBeGlzCisgIHsKKyAgICBFVUxFUl9YID0gMSwgLyohPCB0aGUgWCBheGlzICovCisgICAgRVVMRVJfWSA9IDIsIC8qITwgdGhlIFkgYXhpcyAqLworICAgIEVVTEVSX1ogPSAzICAvKiE8IHRoZSBaIGF4aXMgKi8KKyAgfTsKKyAgCisgIC8qKiBcY2xhc3MgRXVsZXJTeXN0ZW0KKyAgICAqCisgICAgKiBcaW5ncm91cCBFdWxlckFuZ2xlc19Nb2R1bGUKKyAgICAqCisgICAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIGZpeGVkIEV1bGVyIHJvdGF0aW9uIHN5c3RlbS4KKyAgICAqCisgICAgKiBUaGlzIG1ldGEtY2xhc3MgZ29hbCBpcyB0byByZXByZXNlbnQgdGhlIEV1bGVyIHN5c3RlbSBpbiBjb21waWxhdGlvbiB0aW1lLCBmb3IgRXVsZXJBbmdsZXMuCisgICAgKgorICAgICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB0byBnZXQgdHdvIHRoaW5nczoKKyAgICAqICAtIEJ1aWxkIGFuIEV1bGVyIHN5c3RlbSwgYW5kIHRoZW4gcGFzcyBpdCBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciB0byBFdWxlckFuZ2xlcy4KKyAgICAqICAtIFF1ZXJ5IHNvbWUgY29tcGlsZSB0aW1lIGRhdGEgYWJvdXQgYW4gRXVsZXIgc3lzdGVtLiAoZS5nLiBXaGV0aGVyIGl0J3MgdGFpdCBicnlhbikKKyAgICAqCisgICAgKiBFdWxlciByb3RhdGlvbiBpcyBhIHNldCBvZiB0aHJlZSByb3RhdGlvbiBvbiBmaXhlZCBheGVzLiAoc2VlIFxyZWYgRXVsZXJBbmdsZXMpCisgICAgKiBUaGlzIG1ldGEtY2xhc3Mgc3RvcmUgY29uc3RhbnRseSB0aG9zZSBzaWduZWQgYXhlcy4gKHNlZSBccmVmIEV1bGVyQXhpcykKKyAgICAqCisgICAgKiAjIyMgVHlwZXMgb2YgRXVsZXIgc3lzdGVtcyAjIyMKKyAgICAqCisgICAgKiBBbGwgYW5kIG9ubHkgdmFsaWQgMyBkaW1lbnNpb24gRXVsZXIgcm90YXRpb24gb3ZlciBzdGFuZGFyZAorICAgICogIHNpZ25lZCBheGVzeytYLCtZLCtaLC1YLC1ZLC1afSBhcmUgc3VwcG9ydGVkOgorICAgICogIC0gYWxsIGF4ZXMgWCwgWSwgWiBpbiBlYWNoIHZhbGlkIG9yZGVyIChzZWUgYmVsb3cgd2hhdCBvcmRlciBpcyB2YWxpZCkKKyAgICAqICAtIHJvdGF0aW9uIG92ZXIgdGhlIGF4aXMgaXMgc3VwcG9ydGVkIGJvdGggb3ZlciB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGRpcmVjdGlvbnMuCisgICAgKiAgLSBib3RoIHRhaXQgYnJ5YW4gYW5kIHByb3Blci9jbGFzc2ljIEV1bGVyIGFuZ2xlcyAoaS5lLiB0aGUgb3Bwb3NpdGUpLgorICAgICoKKyAgICAqIFNpbmNlIEV1bGVyU3lzdGVtIHN1cHBvcnQgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZGlyZWN0aW9ucywKKyAgICAqICB5b3UgbWF5IGNhbGwgdGhpcyByb3RhdGlvbiBkaXN0aW5jdGlvbiBpbiBvdGhlciBuYW1lczoKKyAgICAqICAtIF9yaWdodCBoYW5kZWRfIG9yIF9sZWZ0IGhhbmRlZF8KKyAgICAqICAtIF9jb3VudGVyY2xvY2t3aXNlXyBvciBfY2xvY2t3aXNlXworICAgICoKKyAgICAqIE5vdGljZSBhbGwgYXhlZCBjb21iaW5hdGlvbiBhcmUgdmFsaWQsIGFuZCB3b3VsZCB0cmlnZ2VyIGEgc3RhdGljIGFzc2VydGlvbi4KKyAgICAqIFNhbWUgdW5zaWduZWQgYXhlcyBjYW4ndCBiZSBuZWlnaGJvcnMsIGUuZy4ge1gsWCxZfSBpcyBpbnZhbGlkLgorICAgICogVGhpcyB5aWVsZCB0d28gYW5kIG9ubHkgdHdvIGNsYXNzZXM6CisgICAgKiAgLSBfdGFpdCBicnlhbl8gLSBhbGwgdW5zaWduZWQgYXhlcyBhcmUgZGlzdGluY3QsIGUuZy4ge1gsWSxafQorICAgICogIC0gX3Byb3Blci9jbGFzc2ljIEV1bGVyIGFuZ2xlc18gLSBUaGUgZmlyc3QgYW5kIHRoZSB0aGlyZCB1bnNpZ25lZCBheGVzIGlzIGVxdWFsLAorICAgICogICAgIGFuZCB0aGUgc2Vjb25kIGlzIGRpZmZlcmVudCwgZS5nLiB7WCxZLFh9CisgICAgKgorICAgICogIyMjIEludHJpbnNpYyB2cyBleHRyaW5zaWMgRXVsZXIgc3lzdGVtcyAjIyMKKyAgICAqCisgICAgKiBPbmx5IGludHJpbnNpYyBFdWxlciBzeXN0ZW1zIGFyZSBzdXBwb3J0ZWQgZm9yIHNpbXBsaWNpdHkuCisgICAgKiAgSWYgeW91IHdhbnQgdG8gdXNlIGV4dHJpbnNpYyBFdWxlciBzeXN0ZW1zLAorICAgICogICBqdXN0IHVzZSB0aGUgZXF1YWwgaW50cmluc2ljIG9wcG9zaXRlIG9yZGVyIGZvciBheGVzIGFuZCBhbmdsZXMuCisgICAgKiAgSS5lIGF4ZXMgKEEsQixDKSBiZWNvbWVzIChDLEIsQSksIGFuZCBhbmdsZXMgKGEsYixjKSBiZWNvbWVzIChjLGIsYSkuCisgICAgKgorICAgICogIyMjIENvbnZlbmllbnQgdXNlciB0eXBlZGVmcyAjIyMKKyAgICAqCisgICAgKiBDb252ZW5pZW50IHR5cGVkZWZzIGZvciBFdWxlclN5c3RlbSBleGlzdCAob25seSBmb3IgcG9zaXRpdmUgYXhlcyBFdWxlciBzeXN0ZW1zKSwKKyAgICAqICBpbiBhIGZvcm0gb2YgRXVsZXJTeXN0ZW17QX17Qn17Q30sIGUuZy4gXHJlZiBFdWxlclN5c3RlbVhZWi4KKyAgICAqCisgICAgKiAjIyMgQWRkaXRpb25hbCByZWFkaW5nICMjIworICAgICoKKyAgICAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgRXVsZXIgYW5nbGVzOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXMKKyAgICAqCisgICAgKiBcdHBhcmFtIF9BbHBoYUF4aXMgdGhlIGZpcnN0IGZpeGVkIEV1bGVyQXhpcworICAgICoKKyAgICAqIFx0cGFyYW0gX0FscGhhQXhpcyB0aGUgc2Vjb25kIGZpeGVkIEV1bGVyQXhpcworICAgICoKKyAgICAqIFx0cGFyYW0gX0FscGhhQXhpcyB0aGUgdGhpcmQgZml4ZWQgRXVsZXJBeGlzCisgICAgKi8KKyAgdGVtcGxhdGUgPGludCBfQWxwaGFBeGlzLCBpbnQgX0JldGFBeGlzLCBpbnQgX0dhbW1hQXhpcz4KKyAgY2xhc3MgRXVsZXJTeXN0ZW0KKyAgeworICAgIHB1YmxpYzoKKyAgICAvLyBJdCdzIGRlZmluZWQgdGhpcyB3YXkgYW5kIG5vdCBhcyBlbnVtLCBiZWNhdXNlIEkgdGhpbmsKKyAgICAvLyAgdGhhdCBlbnVtIGlzIG5vdCBndWVyYW50ZWUgdG8gc3VwcG9ydCBuZWdhdGl2ZSBudW1iZXJzCisgICAgCisgICAgLyoqIFRoZSBmaXJzdCByb3RhdGlvbiBheGlzICovCisgICAgc3RhdGljIGNvbnN0IGludCBBbHBoYUF4aXMgPSBfQWxwaGFBeGlzOworICAgIAorICAgIC8qKiBUaGUgc2Vjb25kIHJvdGF0aW9uIGF4aXMgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IEJldGFBeGlzID0gX0JldGFBeGlzOworICAgIAorICAgIC8qKiBUaGUgdGhpcmQgcm90YXRpb24gYXhpcyAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgR2FtbWFBeGlzID0gX0dhbW1hQXhpczsKKworICAgIGVudW0KKyAgICB7CisgICAgICBBbHBoYUF4aXNBYnMgPSBpbnRlcm5hbDo6QWJzPEFscGhhQXhpcz46OnZhbHVlLCAvKiE8IHRoZSBmaXJzdCByb3RhdGlvbiBheGlzIHVuc2lnbmVkICovCisgICAgICBCZXRhQXhpc0FicyA9IGludGVybmFsOjpBYnM8QmV0YUF4aXM+Ojp2YWx1ZSwgLyohPCB0aGUgc2Vjb25kIHJvdGF0aW9uIGF4aXMgdW5zaWduZWQgKi8KKyAgICAgIEdhbW1hQXhpc0FicyA9IGludGVybmFsOjpBYnM8R2FtbWFBeGlzPjo6dmFsdWUsIC8qITwgdGhlIHRoaXJkIHJvdGF0aW9uIGF4aXMgdW5zaWduZWQgKi8KKyAgICAgIAorICAgICAgSXNBbHBoYU9wcG9zaXRlID0gKEFscGhhQXhpcyA8IDApID8gMSA6IDAsIC8qITwgd2VhdGhlciBhbHBoYSBheGlzIGlzIG5lZ2F0aXZlICovCisgICAgICBJc0JldGFPcHBvc2l0ZSA9IChCZXRhQXhpcyA8IDApID8gMSA6IDAsIC8qITwgd2VhdGhlciBiZXRhIGF4aXMgaXMgbmVnYXRpdmUgKi8KKyAgICAgIElzR2FtbWFPcHBvc2l0ZSA9IChHYW1tYUF4aXMgPCAwKSA/IDEgOiAwLCAvKiE8IHdlYXRoZXIgZ2FtbWEgYXhpcyBpcyBuZWdhdGl2ZSAqLworICAgICAgCisgICAgICBJc09kZCA9ICgoQWxwaGFBeGlzQWJzKSUzID09IChCZXRhQXhpc0FicyAtIDEpJTMpID8gMCA6IDEsIC8qITwgd2VhdGhlciB0aGUgRXVsZXIgc3lzdGVtIGlzIG9kZCAqLworICAgICAgSXNFdmVuID0gSXNPZGQgPyAwIDogMSwgLyohPCB3ZWF0aGVyIHRoZSBFdWxlciBzeXN0ZW0gaXMgZXZlbiAqLworCisgICAgICBJc1RhaXRCcnlhbiA9ICgodW5zaWduZWQpQWxwaGFBeGlzQWJzICE9ICh1bnNpZ25lZClHYW1tYUF4aXNBYnMpID8gMSA6IDAgLyohPCB3ZWF0aGVyIHRoZSBFdWxlciBzeXN0ZW0gaXMgdGFpdCBicnlhbiAqLworICAgIH07CisgICAgCisgICAgcHJpdmF0ZToKKyAgICAKKyAgICBFSUdFTl9FVUxFUl9BTkdMRVNfQ0xBU1NfU1RBVElDX0FTU0VSVChpbnRlcm5hbDo6SXNWYWxpZEF4aXM8QWxwaGFBeGlzPjo6dmFsdWUsCisgICAgICBBTFBIQV9BWElTX0lTX0lOVkFMSUQpOworICAgICAgCisgICAgRUlHRU5fRVVMRVJfQU5HTEVTX0NMQVNTX1NUQVRJQ19BU1NFUlQoaW50ZXJuYWw6OklzVmFsaWRBeGlzPEJldGFBeGlzPjo6dmFsdWUsCisgICAgICBCRVRBX0FYSVNfSVNfSU5WQUxJRCk7CisgICAgICAKKyAgICBFSUdFTl9FVUxFUl9BTkdMRVNfQ0xBU1NfU1RBVElDX0FTU0VSVChpbnRlcm5hbDo6SXNWYWxpZEF4aXM8R2FtbWFBeGlzPjo6dmFsdWUsCisgICAgICBHQU1NQV9BWElTX0lTX0lOVkFMSUQpOworICAgICAgCisgICAgRUlHRU5fRVVMRVJfQU5HTEVTX0NMQVNTX1NUQVRJQ19BU1NFUlQoKHVuc2lnbmVkKUFscGhhQXhpc0FicyAhPSAodW5zaWduZWQpQmV0YUF4aXNBYnMsCisgICAgICBBTFBIQV9BWElTX0NBTlRfQkVfRVFVQUxfVE9fQkVUQV9BWElTKTsKKyAgICAgIAorICAgIEVJR0VOX0VVTEVSX0FOR0xFU19DTEFTU19TVEFUSUNfQVNTRVJUKCh1bnNpZ25lZClCZXRhQXhpc0FicyAhPSAodW5zaWduZWQpR2FtbWFBeGlzQWJzLAorICAgICAgQkVUQV9BWElTX0NBTlRfQkVfRVFVQUxfVE9fR0FNTUFfQVhJUyk7CisKKyAgICBlbnVtCisgICAgeworICAgICAgLy8gSSwgSiwgSyBhcmUgdGhlIHBpdm90IGluZGV4ZXMgcGVybXV0YXRpb24gZm9yIHRoZSByb3RhdGlvbiBtYXRyaXgsIHRoYXQgbWF0Y2ggdGhpcyBFdWxlciBzeXN0ZW0uIAorICAgICAgLy8gVGhleSBhcmUgdXNlZCBpbiB0aGlzIGNsYXNzIGNvbnZlcnRlcnMuCisgICAgICAvLyBUaGV5IGFyZSBhbHdheXMgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlciwgYW5kIHRoZWlyIHBvc3NpYmxlIHZhbHVlcyBhcmU6IDAsIDEsIG9yIDIuCisgICAgICBJID0gQWxwaGFBeGlzQWJzIC0gMSwKKyAgICAgIEogPSAoQWxwaGFBeGlzQWJzIC0gMSArIDEgKyBJc09kZCklMywKKyAgICAgIEsgPSAoQWxwaGFBeGlzQWJzIC0gMSArIDIgLSBJc09kZCklMworICAgIH07CisgICAgCisgICAgLy8gVE9ETzogR2V0IEBtYXQgcGFyYW1ldGVyIGluIGZvcm0gdGhhdCBhdm9pZHMgZG91YmxlIGV2YWx1YXRpb24uCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgc3RhdGljIHZvaWQgQ2FsY0V1bGVyQW5nbGVzX2ltcChNYXRyaXg8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6U2NhbGFyLCAzLCAxPiYgcmVzLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQsIGludGVybmFsOjp0cnVlX3R5cGUgLyppc1RhaXRCcnlhbiovKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YXRhbjI7CisgICAgICB1c2luZyBzdGQ6OnNpbjsKKyAgICAgIHVzaW5nIHN0ZDo6Y29zOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3IyOworICAgICAgCisgICAgICByZXNbMF0gPSBhdGFuMihtYXQoSixLKSwgbWF0KEssSykpOworICAgICAgU2NhbGFyIGMyID0gVmVjdG9yMihtYXQoSSxJKSwgbWF0KEksSikpLm5vcm0oKTsKKyAgICAgIGlmKChJc09kZCAmJiByZXNbMF08U2NhbGFyKDApKSB8fCAoKCFJc09kZCkgJiYgcmVzWzBdPlNjYWxhcigwKSkpIHsKKyAgICAgICAgaWYocmVzWzBdID4gU2NhbGFyKDApKSB7CisgICAgICAgICAgcmVzWzBdIC09IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcmVzWzBdICs9IFNjYWxhcihFSUdFTl9QSSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzWzFdID0gYXRhbjIoLW1hdChJLEspLCAtYzIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXNbMV0gPSBhdGFuMigtbWF0KEksSyksIGMyKTsKKyAgICAgIFNjYWxhciBzMSA9IHNpbihyZXNbMF0pOworICAgICAgU2NhbGFyIGMxID0gY29zKHJlc1swXSk7CisgICAgICByZXNbMl0gPSBhdGFuMihzMSptYXQoSyxJKS1jMSptYXQoSixJKSwgYzEqbWF0KEosSikgLSBzMSAqIG1hdChLLEopKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBzdGF0aWMgdm9pZCBDYWxjRXVsZXJBbmdsZXNfaW1wKE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpTY2FsYXIsMywxPiYgcmVzLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQsIGludGVybmFsOjpmYWxzZV90eXBlIC8qaXNUYWl0QnJ5YW4qLykKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmF0YW4yOworICAgICAgdXNpbmcgc3RkOjpzaW47CisgICAgICB1c2luZyBzdGQ6OmNvczsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgICAgIAorICAgICAgcmVzWzBdID0gYXRhbjIobWF0KEosSSksIG1hdChLLEkpKTsKKyAgICAgIGlmKChJc09kZCAmJiByZXNbMF08U2NhbGFyKDApKSB8fCAoKCFJc09kZCkgJiYgcmVzWzBdPlNjYWxhcigwKSkpCisgICAgICB7CisgICAgICAgIGlmKHJlc1swXSA+IFNjYWxhcigwKSkgeworICAgICAgICAgIHJlc1swXSAtPSBTY2FsYXIoRUlHRU5fUEkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHJlc1swXSArPSBTY2FsYXIoRUlHRU5fUEkpOworICAgICAgICB9CisgICAgICAgIFNjYWxhciBzMiA9IFZlY3RvcjIobWF0KEosSSksIG1hdChLLEkpKS5ub3JtKCk7CisgICAgICAgIHJlc1sxXSA9IC1hdGFuMihzMiwgbWF0KEksSSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTY2FsYXIgczIgPSBWZWN0b3IyKG1hdChKLEkpLCBtYXQoSyxJKSkubm9ybSgpOworICAgICAgICByZXNbMV0gPSBhdGFuMihzMiwgbWF0KEksSSkpOworICAgICAgfQorCisgICAgICAvLyBXaXRoIGE9KDAsMSwwKSwgd2UgaGF2ZSBpPTA7IGo9MTsgaz0yLCBhbmQgYWZ0ZXIgY29tcHV0aW5nIHRoZSBmaXJzdCB0d28gYW5nbGVzLAorICAgICAgLy8gd2UgY2FuIGNvbXB1dGUgdGhlaXIgcmVzcGVjdGl2ZSByb3RhdGlvbiwgYW5kIGFwcGx5IGl0cyBpbnZlcnNlIHRvIE0uIFNpbmNlIHRoZSByZXN1bHQgbXVzdAorICAgICAgLy8gYmUgYSByb3RhdGlvbiBhcm91bmQgeCwgd2UgaGF2ZToKKyAgICAgIC8vCisgICAgICAvLyAgYzIgIHMxLnMyIGMxLnMyICAgICAgICAgICAgICAgICAgIDEgIDAgICAwIAorICAgICAgLy8gIDAgICBjMSAgICAtczEgICAgICAgKiAgICBNICAgID0gICAwICBjMyAgczMKKyAgICAgIC8vICAtczIgczEuYzIgYzEuYzIgICAgICAgICAgICAgICAgICAgMCAtczMgIGMzCisgICAgICAvLworICAgICAgLy8gIFRodXM6ICBtMTEuYzEgLSBtMjEuczEgPSBjMyAgJiAgIG0xMi5jMSAtIG0yMi5zMSA9IHMzCisKKyAgICAgIFNjYWxhciBzMSA9IHNpbihyZXNbMF0pOworICAgICAgU2NhbGFyIGMxID0gY29zKHJlc1swXSk7CisgICAgICByZXNbMl0gPSBhdGFuMihjMSptYXQoSixLKS1zMSptYXQoSyxLKSwgYzEqbWF0KEosSikgLSBzMSAqIG1hdChLLEopKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICAgIHN0YXRpYyB2b2lkIENhbGNFdWxlckFuZ2xlcygKKyAgICAgIEV1bGVyQW5nbGVzPFNjYWxhciwgRXVsZXJTeXN0ZW0+JiByZXMsCisgICAgICBjb25zdCB0eXBlbmFtZSBFdWxlckFuZ2xlczxTY2FsYXIsIEV1bGVyU3lzdGVtPjo6TWF0cml4MyYgbWF0KQorICAgIHsKKyAgICAgIENhbGNFdWxlckFuZ2xlcyhyZXMsIG1hdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPAorICAgICAgYm9vbCBQb3NpdGl2ZVJhbmdlQWxwaGEsCisgICAgICBib29sIFBvc2l0aXZlUmFuZ2VCZXRhLAorICAgICAgYm9vbCBQb3NpdGl2ZVJhbmdlR2FtbWEsCisgICAgICB0eXBlbmFtZSBTY2FsYXI+CisgICAgc3RhdGljIHZvaWQgQ2FsY0V1bGVyQW5nbGVzKAorICAgICAgRXVsZXJBbmdsZXM8U2NhbGFyLCBFdWxlclN5c3RlbT4mIHJlcywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIEV1bGVyQW5nbGVzPFNjYWxhciwgRXVsZXJTeXN0ZW0+OjpNYXRyaXgzJiBtYXQpCisgICAgeworICAgICAgQ2FsY0V1bGVyQW5nbGVzKHJlcywgbWF0LCBQb3NpdGl2ZVJhbmdlQWxwaGEsIFBvc2l0aXZlUmFuZ2VCZXRhLCBQb3NpdGl2ZVJhbmdlR2FtbWEpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgICAgc3RhdGljIHZvaWQgQ2FsY0V1bGVyQW5nbGVzKAorICAgICAgRXVsZXJBbmdsZXM8U2NhbGFyLCBFdWxlclN5c3RlbT4mIHJlcywKKyAgICAgIGNvbnN0IHR5cGVuYW1lIEV1bGVyQW5nbGVzPFNjYWxhciwgRXVsZXJTeXN0ZW0+OjpNYXRyaXgzJiBtYXQsCisgICAgICBib29sIFBvc2l0aXZlUmFuZ2VBbHBoYSwKKyAgICAgIGJvb2wgUG9zaXRpdmVSYW5nZUJldGEsCisgICAgICBib29sIFBvc2l0aXZlUmFuZ2VHYW1tYSkKKyAgICB7CisgICAgICBDYWxjRXVsZXJBbmdsZXNfaW1wKAorICAgICAgICByZXMuYW5nbGVzKCksIG1hdCwKKyAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPElzVGFpdEJyeWFuLCBpbnRlcm5hbDo6dHJ1ZV90eXBlLCBpbnRlcm5hbDo6ZmFsc2VfdHlwZT46OnR5cGUoKSk7CisKKyAgICAgIGlmIChJc0FscGhhT3Bwb3NpdGUgPT0gSXNPZGQpCisgICAgICAgIHJlcy5hbHBoYSgpID0gLXJlcy5hbHBoYSgpOworICAgICAgICAKKyAgICAgIGlmIChJc0JldGFPcHBvc2l0ZSA9PSBJc09kZCkKKyAgICAgICAgcmVzLmJldGEoKSA9IC1yZXMuYmV0YSgpOworICAgICAgICAKKyAgICAgIGlmIChJc0dhbW1hT3Bwb3NpdGUgPT0gSXNPZGQpCisgICAgICAgIHJlcy5nYW1tYSgpID0gLXJlcy5nYW1tYSgpOworICAgICAgCisgICAgICAvLyBTYXR1cmF0ZSByZXN1bHRzIHRvIHRoZSByZXF1ZXN0ZWQgcmFuZ2UKKyAgICAgIGlmIChQb3NpdGl2ZVJhbmdlQWxwaGEgJiYgKHJlcy5hbHBoYSgpIDwgMCkpCisgICAgICAgIHJlcy5hbHBoYSgpICs9IFNjYWxhcigyICogRUlHRU5fUEkpOworICAgICAgCisgICAgICBpZiAoUG9zaXRpdmVSYW5nZUJldGEgJiYgKHJlcy5iZXRhKCkgPCAwKSkKKyAgICAgICAgcmVzLmJldGEoKSArPSBTY2FsYXIoMiAqIEVJR0VOX1BJKTsKKyAgICAgIAorICAgICAgaWYgKFBvc2l0aXZlUmFuZ2VHYW1tYSAmJiAocmVzLmdhbW1hKCkgPCAwKSkKKyAgICAgICAgcmVzLmdhbW1hKCkgKz0gU2NhbGFyKDIgKiBFSUdFTl9QSSk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBjbGFzcyBfU3lzdGVtPgorICAgIGZyaWVuZCBjbGFzcyBFaWdlbjo6RXVsZXJBbmdsZXM7CisgIH07CisKKyNkZWZpbmUgRUlHRU5fRVVMRVJfU1lTVEVNX1RZUEVERUYoQSwgQiwgQykgXAorICAvKiogXGluZ3JvdXAgRXVsZXJBbmdsZXNfTW9kdWxlICovIFwKKyAgdHlwZWRlZiBFdWxlclN5c3RlbTxFVUxFUl8jI0EsIEVVTEVSXyMjQiwgRVVMRVJfIyNDPiBFdWxlclN5c3RlbSMjQSMjQiMjQzsKKyAgCisgIEVJR0VOX0VVTEVSX1NZU1RFTV9UWVBFREVGKFgsWSxaKQorICBFSUdFTl9FVUxFUl9TWVNURU1fVFlQRURFRihYLFksWCkKKyAgRUlHRU5fRVVMRVJfU1lTVEVNX1RZUEVERUYoWCxaLFkpCisgIEVJR0VOX0VVTEVSX1NZU1RFTV9UWVBFREVGKFgsWixYKQorICAKKyAgRUlHRU5fRVVMRVJfU1lTVEVNX1RZUEVERUYoWSxaLFgpCisgIEVJR0VOX0VVTEVSX1NZU1RFTV9UWVBFREVGKFksWixZKQorICBFSUdFTl9FVUxFUl9TWVNURU1fVFlQRURFRihZLFgsWikKKyAgRUlHRU5fRVVMRVJfU1lTVEVNX1RZUEVERUYoWSxYLFkpCisgIAorICBFSUdFTl9FVUxFUl9TWVNURU1fVFlQRURFRihaLFgsWSkKKyAgRUlHRU5fRVVMRVJfU1lTVEVNX1RZUEVERUYoWixYLFopCisgIEVJR0VOX0VVTEVSX1NZU1RFTV9UWVBFREVGKFosWSxYKQorICBFSUdFTl9FVUxFUl9TWVNURU1fVFlQRURFRihaLFksWikKK30KKworI2VuZGlmIC8vIEVJR0VOX0VVTEVSU1lTVEVNX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9GRlQvZWlfZmZ0d19pbXBsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2ZmdHdfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2ZmdHdfaW1wbC5oCkBAIC0wLDAgKzEsMjYxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBCb3JnZXJkaW5nIG1hcmsgYSBib3JnZXJkaW5nIG5ldAorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLy8gRkZUVyB1c2VzIG5vbi1jb25zdCBhcmd1bWVudHMKKyAgLy8gc28gd2UgbXVzdCB1c2UgdWdseSBjb25zdF9jYXN0IGNhbGxzIGZvciBhbGwgdGhlIGFyZ3MgaXQgdXNlcworICAvLworICAvLyBUaGlzIHNob3VsZCBiZSBzYWZlIGFzIGxvbmcgYXMgCisgIC8vIDEuIHdlIHVzZSBGRlRXX0VTVElNQVRFIGZvciBhbGwgb3VyIHBsYW5uaW5nCisgIC8vICAgICAgIHNlZSB0aGUgRkZUVyBkb2NzIHNlY3Rpb24gNC4zLjIgIlBsYW5uZXIgRmxhZ3MiCisgIC8vIDIuIGZmdHdfY29tcGxleCBpcyBjb21wYXRpYmxlIHdpdGggc3RkOjpjb21wbGV4CisgIC8vICAgIFRoaXMgYXNzdW1lcyBzdGQ6OmNvbXBsZXg8VD4gbGF5b3V0IGlzIGFycmF5IG9mIHNpemUgMiB3aXRoIHJlYWwsaW1hZworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCisgIGlubGluZSAKKyAgVCAqIGZmdHdfY2FzdChjb25zdCBUKiBwKQorICB7IAorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KCBwKTsgCisgIH0KKworICBpbmxpbmUgCisgIGZmdHdfY29tcGxleCAqIGZmdHdfY2FzdCggY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gKiBwKQorICB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxmZnR3X2NvbXBsZXgqPiggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmZnR3X2NvbXBsZXgqPihwKSApOyAKKyAgfQorCisgIGlubGluZSAKKyAgZmZ0d2ZfY29tcGxleCAqIGZmdHdfY2FzdCggY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiAqIHApCisgIHsgCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxmZnR3Zl9jb21wbGV4Kj4oIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmZ0d2ZfY29tcGxleCo+KHApICk7IAorICB9CisKKyAgaW5saW5lIAorICBmZnR3bF9jb21wbGV4ICogZmZ0d19jYXN0KCBjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ICogcCkKKyAgeyAKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PGZmdHdsX2NvbXBsZXgqPiggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmZnR3bF9jb21wbGV4Kj4ocCkgKTsgCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCisgIHN0cnVjdCBmZnR3X3BsYW4ge307CisKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48ZmxvYXQ+CisgIHsKKyAgICAgIHR5cGVkZWYgZmxvYXQgc2NhbGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGZmdHdmX2NvbXBsZXggY29tcGxleF90eXBlOworICAgICAgZmZ0d2ZfcGxhbiBtX3BsYW47CisgICAgICBmZnR3X3BsYW4oKSA6bV9wbGFuKE5VTEwpIHt9CisgICAgICB+ZmZ0d19wbGFuKCkge2lmIChtX3BsYW4pIGZmdHdmX2Rlc3Ryb3lfcGxhbihtX3BsYW4pO30KKworICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3QsY29tcGxleF90eXBlICogc3JjLGludCBuZmZ0KSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3Zl9wbGFuX2RmdF8xZChuZmZ0LHNyYyxkc3QsIEZGVFdfQkFDS1dBUkQgLCBGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdmX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3Zl9wbGFuX2RmdF9yMmNfMWQobmZmdCxzcmMsZHN0LEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnRfcjJjKCBtX3BsYW4sc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KHNjYWxhcl90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpCisgICAgICAgICAgICAgIG1fcGxhbiA9IGZmdHdmX3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3Zl9leGVjdXRlX2RmdF9jMnIoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgZndkMiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0ZPUldBUkQsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3Zl9leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgaW52MiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0JBQ0tXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisKKyAgfTsKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48ZG91YmxlPgorICB7CisgICAgICB0eXBlZGVmIGRvdWJsZSBzY2FsYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgZmZ0d19jb21wbGV4IGNvbXBsZXhfdHlwZTsKKyAgICAgIDo6ZmZ0d19wbGFuIG1fcGxhbjsKKyAgICAgIGZmdHdfcGxhbigpIDptX3BsYW4oTlVMTCkge30KKyAgICAgIH5mZnR3X3BsYW4oKSB7aWYgKG1fcGxhbikgZmZ0d19kZXN0cm95X3BsYW4obV9wbGFuKTt9CisKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBmd2QoY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d19leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0JBQ0tXQVJEICwgRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3X3BsYW5fZGZ0X3IyY18xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0X3IyYyggbV9wbGFuLHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGludihzY2FsYXJfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKQorICAgICAgICAgICAgICBtX3BsYW4gPSBmZnR3X3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0X2MyciggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgZndkMiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d19wbGFuX2RmdF8yZChuMCxuMSxzcmMsZHN0LEZGVFdfRk9SV0FSRCxGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGludjIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0JBQ0tXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d19leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48bG9uZyBkb3VibGU+CisgIHsKKyAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgc2NhbGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGZmdHdsX2NvbXBsZXggY29tcGxleF90eXBlOworICAgICAgZmZ0d2xfcGxhbiBtX3BsYW47CisgICAgICBmZnR3X3BsYW4oKSA6bV9wbGFuKE5VTEwpIHt9CisgICAgICB+ZmZ0d19wbGFuKCkge2lmIChtX3BsYW4pIGZmdHdsX2Rlc3Ryb3lfcGxhbihtX3BsYW4pO30KKworICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3QsY29tcGxleF90eXBlICogc3JjLGludCBuZmZ0KSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2xfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3bF9wbGFuX2RmdF8xZChuZmZ0LHNyYyxkc3QsIEZGVFdfQkFDS1dBUkQgLCBGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdsX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3bF9wbGFuX2RmdF9yMmNfMWQobmZmdCxzcmMsZHN0LEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnRfcjJjKCBtX3BsYW4sc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KHNjYWxhcl90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpCisgICAgICAgICAgICAgIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3bF9leGVjdXRlX2RmdF9jMnIoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGZ3ZDIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0XzJkKG4wLG4xLHNyYyxkc3QsRkZUV19GT1JXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGludjIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0XzJkKG4wLG4xLHNyYyxkc3QsRkZUV19CQUNLV0FSRCxGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdsX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyPgorICBzdHJ1Y3QgZmZ0d19pbXBsCisgIHsKKyAgICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXg7CisKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBjbGVhcigpIAorICAgICAgeworICAgICAgICBtX3BsYW5zLmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIC8vIGNvbXBsZXgtdG8tY29tcGxleCBmb3J3YXJkIEZGVAorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICpzcmMsaW50IG5mZnQpCisgICAgICB7CisgICAgICAgIGdldF9wbGFuKG5mZnQsZmFsc2UsZHN0LHNyYykuZndkKGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSxuZmZ0ICk7CisgICAgICB9CisKKyAgICAgIC8vIHJlYWwtdG8tY29tcGxleCBmb3J3YXJkIEZGVAorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCxjb25zdCBTY2FsYXIgKiBzcmMsaW50IG5mZnQpIAorICAgICAgeworICAgICAgICAgIGdldF9wbGFuKG5mZnQsZmFsc2UsZHN0LHNyYykuZndkKGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSAsbmZmdCk7CisgICAgICB9CisKKyAgICAgIC8vIDItZCBjb21wbGV4LXRvLWNvbXBsZXgKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBmd2QyKENvbXBsZXggKiBkc3QsIGNvbnN0IENvbXBsZXggKiBzcmMsIGludCBuMCxpbnQgbjEpCisgICAgICB7CisgICAgICAgICAgZ2V0X3BsYW4objAsbjEsZmFsc2UsZHN0LHNyYykuZndkMihmZnR3X2Nhc3QoZHN0KSwgZmZ0d19jYXN0KHNyYykgLG4wLG4xKTsKKyAgICAgIH0KKworICAgICAgLy8gaW52ZXJzZSBjb21wbGV4LXRvLWNvbXBsZXgKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICAqc3JjLGludCBuZmZ0KQorICAgICAgeworICAgICAgICBnZXRfcGxhbihuZmZ0LHRydWUsZHN0LHNyYykuaW52KGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSxuZmZ0ICk7CisgICAgICB9CisKKyAgICAgIC8vIGhhbGYtY29tcGxleCB0byBzY2FsYXIKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoIFNjYWxhciAqIGRzdCxjb25zdCBDb21wbGV4ICogc3JjLGludCBuZmZ0KSAKKyAgICAgIHsKKyAgICAgICAgZ2V0X3BsYW4obmZmdCx0cnVlLGRzdCxzcmMpLmludihmZnR3X2Nhc3QoZHN0KSwgZmZ0d19jYXN0KHNyYyksbmZmdCApOworICAgICAgfQorCisgICAgICAvLyAyLWQgY29tcGxleC10by1jb21wbGV4CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52MihDb21wbGV4ICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBpbnQgbjAsaW50IG4xKQorICAgICAgeworICAgICAgICBnZXRfcGxhbihuMCxuMSx0cnVlLGRzdCxzcmMpLmludjIoZmZ0d19jYXN0KGRzdCksIGZmdHdfY2FzdChzcmMpICxuMCxuMSk7CisgICAgICB9CisKKworICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIGZmdHdfcGxhbjxTY2FsYXI+IFBsYW5EYXRhOworCisgICAgICB0eXBlZGVmIHN0ZDo6bWFwPGludDY0X3QsUGxhbkRhdGE+IFBsYW5NYXA7CisKKyAgICAgIFBsYW5NYXAgbV9wbGFuczsKKworICAgICAgaW5saW5lCisgICAgICBQbGFuRGF0YSAmIGdldF9wbGFuKGludCBuZmZ0LGJvb2wgaW52ZXJzZSx2b2lkICogZHN0LGNvbnN0IHZvaWQgKiBzcmMpCisgICAgICB7CisgICAgICAgICAgYm9vbCBpbnBsYWNlID0gKGRzdD09c3JjKTsKKyAgICAgICAgICBib29sIGFsaWduZWQgPSAoIChyZWludGVycHJldF9jYXN0PHNpemVfdD4oc3JjKSYxNSkgfCAocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGRzdCkmMTUpICkgPT0gMDsKKyAgICAgICAgICBpbnQ2NF90IGtleSA9ICggKG5mZnQ8PDMgKSB8IChpbnZlcnNlPDwyKSB8IChpbnBsYWNlPDwxKSB8IGFsaWduZWQgKSA8PCAxOworICAgICAgICAgIHJldHVybiBtX3BsYW5zW2tleV07CisgICAgICB9CisKKyAgICAgIGlubGluZQorICAgICAgUGxhbkRhdGEgJiBnZXRfcGxhbihpbnQgbjAsaW50IG4xLGJvb2wgaW52ZXJzZSx2b2lkICogZHN0LGNvbnN0IHZvaWQgKiBzcmMpCisgICAgICB7CisgICAgICAgICAgYm9vbCBpbnBsYWNlID0gKGRzdD09c3JjKTsKKyAgICAgICAgICBib29sIGFsaWduZWQgPSAoIChyZWludGVycHJldF9jYXN0PHNpemVfdD4oc3JjKSYxNSkgfCAocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGRzdCkmMTUpICkgPT0gMDsKKyAgICAgICAgICBpbnQ2NF90IGtleSA9ICggKCAoKChpbnQ2NF90KW4wKSA8PCAzMCl8KG4xPDwzICkgfCAoaW52ZXJzZTw8MikgfCAoaW5wbGFjZTw8MSkgfCBhbGlnbmVkICkgPDwgMSApICsgMTsKKyAgICAgICAgICByZXR1cm4gbV9wbGFuc1trZXldOworICAgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2tpc3NmZnRfaW1wbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9laV9raXNzZmZ0X2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUxYjRlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9laV9raXNzZmZ0X2ltcGwuaApAQCAtMCwwICsxLDQyMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBCb3JnZXJkaW5nIG1hcmsgYSBib3JnZXJkaW5nIG5ldAorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLy8gVGhpcyBGRlQgaW1wbGVtZW50YXRpb24gd2FzIGRlcml2ZWQgZnJvbSBraXNzZmZ0IGh0dHA6c291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2tpc3NmZnQKKyAgLy8gQ29weXJpZ2h0IDIwMDMtMjAwOSBNYXJrIEJvcmdlcmRpbmcKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitzdHJ1Y3Qga2lzc19jcHhfZmZ0Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFNjYWxhcj4gQ29tcGxleDsKKyAgc3RkOjp2ZWN0b3I8Q29tcGxleD4gbV90d2lkZGxlczsKKyAgc3RkOjp2ZWN0b3I8aW50PiBtX3N0YWdlUmFkaXg7CisgIHN0ZDo6dmVjdG9yPGludD4gbV9zdGFnZVJlbWFpbmRlcjsKKyAgc3RkOjp2ZWN0b3I8Q29tcGxleD4gbV9zY3JhdGNoQnVmOworICBib29sIG1faW52ZXJzZTsKKworICBpbmxpbmUKKyAgICB2b2lkIG1ha2VfdHdpZGRsZXMoaW50IG5mZnQsYm9vbCBpbnZlcnNlKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YWNvczsKKyAgICAgIG1faW52ZXJzZSA9IGludmVyc2U7CisgICAgICBtX3R3aWRkbGVzLnJlc2l6ZShuZmZ0KTsKKyAgICAgIFNjYWxhciBwaGluYyA9ICAoaW52ZXJzZT8yOi0yKSogYWNvcyggKFNjYWxhcikgLTEpICAvIG5mZnQ7CisgICAgICBmb3IgKGludCBpPTA7aTxuZmZ0OysraSkKKyAgICAgICAgbV90d2lkZGxlc1tpXSA9IGV4cCggQ29tcGxleCgwLGkqcGhpbmMpICk7CisgICAgfQorCisgIHZvaWQgZmFjdG9yaXplKGludCBuZmZ0KQorICB7CisgICAgLy9zdGFydCBmYWN0b3Jpbmcgb3V0IDQncywgdGhlbiAyJ3MsIHRoZW4gMyw1LDcsOSwuLi4KKyAgICBpbnQgbj0gbmZmdDsKKyAgICBpbnQgcD00OworICAgIGRvIHsKKyAgICAgIHdoaWxlIChuICUgcCkgeworICAgICAgICBzd2l0Y2ggKHApIHsKKyAgICAgICAgICBjYXNlIDQ6IHAgPSAyOyBicmVhazsKKyAgICAgICAgICBjYXNlIDI6IHAgPSAzOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBwICs9IDI7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwKnA+bikKKyAgICAgICAgICBwPW47Ly8gaW1wb3NzaWJsZSB0byBoYXZlIGEgZmFjdG9yID4gc3FydChuKQorICAgICAgfQorICAgICAgbiAvPSBwOworICAgICAgbV9zdGFnZVJhZGl4LnB1c2hfYmFjayhwKTsKKyAgICAgIG1fc3RhZ2VSZW1haW5kZXIucHVzaF9iYWNrKG4pOworICAgICAgaWYgKCBwID4gNSApCisgICAgICAgIG1fc2NyYXRjaEJ1Zi5yZXNpemUocCk7IC8vIHNjcmF0Y2hidWYgd2lsbCBiZSBuZWVkZWQgaW4gYmZseV9nZW5lcmljCisgICAgfXdoaWxlKG4+MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NyYz4KKyAgICBpbmxpbmUKKyAgICB2b2lkIHdvcmsoIGludCBzdGFnZSxDb21wbGV4ICogeG91dCwgY29uc3QgX1NyYyAqIHhpbiwgc2l6ZV90IGZzdHJpZGUsc2l6ZV90IGluX3N0cmlkZSkKKyAgICB7CisgICAgICBpbnQgcCA9IG1fc3RhZ2VSYWRpeFtzdGFnZV07CisgICAgICBpbnQgbSA9IG1fc3RhZ2VSZW1haW5kZXJbc3RhZ2VdOworICAgICAgQ29tcGxleCAqIEZvdXRfYmVnID0geG91dDsKKyAgICAgIENvbXBsZXggKiBGb3V0X2VuZCA9IHhvdXQgKyBwKm07CisKKyAgICAgIGlmIChtPjEpIHsKKyAgICAgICAgZG97CisgICAgICAgICAgLy8gcmVjdXJzaXZlIGNhbGw6CisgICAgICAgICAgLy8gREZUIG9mIHNpemUgbSpwIHBlcmZvcm1lZCBieSBkb2luZworICAgICAgICAgIC8vIHAgaW5zdGFuY2VzIG9mIHNtYWxsZXIgREZUcyBvZiBzaXplIG0sIAorICAgICAgICAgIC8vIGVhY2ggb25lIHRha2VzIGEgZGVjaW1hdGVkIHZlcnNpb24gb2YgdGhlIGlucHV0CisgICAgICAgICAgd29yayhzdGFnZSsxLCB4b3V0ICwgeGluLCBmc3RyaWRlKnAsaW5fc3RyaWRlKTsKKyAgICAgICAgICB4aW4gKz0gZnN0cmlkZSppbl9zdHJpZGU7CisgICAgICAgIH13aGlsZSggKHhvdXQgKz0gbSkgIT0gRm91dF9lbmQgKTsKKyAgICAgIH1lbHNleworICAgICAgICBkb3sKKyAgICAgICAgICAqeG91dCA9ICp4aW47CisgICAgICAgICAgeGluICs9IGZzdHJpZGUqaW5fc3RyaWRlOworICAgICAgICB9d2hpbGUoKyt4b3V0ICE9IEZvdXRfZW5kICk7CisgICAgICB9CisgICAgICB4b3V0PUZvdXRfYmVnOworCisgICAgICAvLyByZWNvbWJpbmUgdGhlIHAgc21hbGxlciBERlRzIAorICAgICAgc3dpdGNoIChwKSB7CisgICAgICAgIGNhc2UgMjogYmZseTIoeG91dCxmc3RyaWRlLG0pOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBiZmx5Myh4b3V0LGZzdHJpZGUsbSk7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGJmbHk0KHhvdXQsZnN0cmlkZSxtKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogYmZseTUoeG91dCxmc3RyaWRlLG0pOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYmZseV9nZW5lcmljKHhvdXQsZnN0cmlkZSxtLHApOyBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgaW5saW5lCisgICAgdm9pZCBiZmx5MiggQ29tcGxleCAqIEZvdXQsIGNvbnN0IHNpemVfdCBmc3RyaWRlLCBpbnQgbSkKKyAgICB7CisgICAgICBmb3IgKGludCBrPTA7azxtOysraykgeworICAgICAgICBDb21wbGV4IHQgPSBGb3V0W20ra10gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZV07CisgICAgICAgIEZvdXRbbStrXSA9IEZvdXRba10gLSB0OworICAgICAgICBGb3V0W2tdICs9IHQ7CisgICAgICB9CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgYmZseTQoIENvbXBsZXggKiBGb3V0LCBjb25zdCBzaXplX3QgZnN0cmlkZSwgY29uc3Qgc2l6ZV90IG0pCisgICAgeworICAgICAgQ29tcGxleCBzY3JhdGNoWzZdOworICAgICAgaW50IG5lZ2F0aXZlX2lmX2ludmVyc2UgPSBtX2ludmVyc2UgKiAtMiArMTsKKyAgICAgIGZvciAoc2l6ZV90IGs9MDtrPG07KytrKSB7CisgICAgICAgIHNjcmF0Y2hbMF0gPSBGb3V0W2srbV0gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZV07CisgICAgICAgIHNjcmF0Y2hbMV0gPSBGb3V0W2srMiptXSAqIG1fdHdpZGRsZXNbaypmc3RyaWRlKjJdOworICAgICAgICBzY3JhdGNoWzJdID0gRm91dFtrKzMqbV0gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZSozXTsKKyAgICAgICAgc2NyYXRjaFs1XSA9IEZvdXRba10gLSBzY3JhdGNoWzFdOworCisgICAgICAgIEZvdXRba10gKz0gc2NyYXRjaFsxXTsKKyAgICAgICAgc2NyYXRjaFszXSA9IHNjcmF0Y2hbMF0gKyBzY3JhdGNoWzJdOworICAgICAgICBzY3JhdGNoWzRdID0gc2NyYXRjaFswXSAtIHNjcmF0Y2hbMl07CisgICAgICAgIHNjcmF0Y2hbNF0gPSBDb21wbGV4KCBzY3JhdGNoWzRdLmltYWcoKSpuZWdhdGl2ZV9pZl9pbnZlcnNlICwgLXNjcmF0Y2hbNF0ucmVhbCgpKiBuZWdhdGl2ZV9pZl9pbnZlcnNlICk7CisKKyAgICAgICAgRm91dFtrKzIqbV0gID0gRm91dFtrXSAtIHNjcmF0Y2hbM107CisgICAgICAgIEZvdXRba10gKz0gc2NyYXRjaFszXTsKKyAgICAgICAgRm91dFtrK21dID0gc2NyYXRjaFs1XSArIHNjcmF0Y2hbNF07CisgICAgICAgIEZvdXRbayszKm1dID0gc2NyYXRjaFs1XSAtIHNjcmF0Y2hbNF07CisgICAgICB9CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgYmZseTMoIENvbXBsZXggKiBGb3V0LCBjb25zdCBzaXplX3QgZnN0cmlkZSwgY29uc3Qgc2l6ZV90IG0pCisgICAgeworICAgICAgc2l6ZV90IGs9bTsKKyAgICAgIGNvbnN0IHNpemVfdCBtMiA9IDIqbTsKKyAgICAgIENvbXBsZXggKnR3MSwqdHcyOworICAgICAgQ29tcGxleCBzY3JhdGNoWzVdOworICAgICAgQ29tcGxleCBlcGkzOworICAgICAgZXBpMyA9IG1fdHdpZGRsZXNbZnN0cmlkZSptXTsKKworICAgICAgdHcxPXR3Mj0mbV90d2lkZGxlc1swXTsKKworICAgICAgZG97CisgICAgICAgIHNjcmF0Y2hbMV09Rm91dFttXSAqICp0dzE7CisgICAgICAgIHNjcmF0Y2hbMl09Rm91dFttMl0gKiAqdHcyOworCisgICAgICAgIHNjcmF0Y2hbM109c2NyYXRjaFsxXStzY3JhdGNoWzJdOworICAgICAgICBzY3JhdGNoWzBdPXNjcmF0Y2hbMV0tc2NyYXRjaFsyXTsKKyAgICAgICAgdHcxICs9IGZzdHJpZGU7CisgICAgICAgIHR3MiArPSBmc3RyaWRlKjI7CisgICAgICAgIEZvdXRbbV0gPSBDb21wbGV4KCBGb3V0LT5yZWFsKCkgLSBTY2FsYXIoLjUpKnNjcmF0Y2hbM10ucmVhbCgpICwgRm91dC0+aW1hZygpIC0gU2NhbGFyKC41KSpzY3JhdGNoWzNdLmltYWcoKSApOworICAgICAgICBzY3JhdGNoWzBdICo9IGVwaTMuaW1hZygpOworICAgICAgICAqRm91dCArPSBzY3JhdGNoWzNdOworICAgICAgICBGb3V0W20yXSA9IENvbXBsZXgoICBGb3V0W21dLnJlYWwoKSArIHNjcmF0Y2hbMF0uaW1hZygpICwgRm91dFttXS5pbWFnKCkgLSBzY3JhdGNoWzBdLnJlYWwoKSApOworICAgICAgICBGb3V0W21dICs9IENvbXBsZXgoIC1zY3JhdGNoWzBdLmltYWcoKSxzY3JhdGNoWzBdLnJlYWwoKSApOworICAgICAgICArK0ZvdXQ7CisgICAgICB9d2hpbGUoLS1rKTsKKyAgICB9CisKKyAgaW5saW5lCisgICAgdm9pZCBiZmx5NSggQ29tcGxleCAqIEZvdXQsIGNvbnN0IHNpemVfdCBmc3RyaWRlLCBjb25zdCBzaXplX3QgbSkKKyAgICB7CisgICAgICBDb21wbGV4ICpGb3V0MCwqRm91dDEsKkZvdXQyLCpGb3V0MywqRm91dDQ7CisgICAgICBzaXplX3QgdTsKKyAgICAgIENvbXBsZXggc2NyYXRjaFsxM107CisgICAgICBDb21wbGV4ICogdHdpZGRsZXMgPSAmbV90d2lkZGxlc1swXTsKKyAgICAgIENvbXBsZXggKnR3OworICAgICAgQ29tcGxleCB5YSx5YjsKKyAgICAgIHlhID0gdHdpZGRsZXNbZnN0cmlkZSptXTsKKyAgICAgIHliID0gdHdpZGRsZXNbZnN0cmlkZSoyKm1dOworCisgICAgICBGb3V0MD1Gb3V0OworICAgICAgRm91dDE9Rm91dDArbTsKKyAgICAgIEZvdXQyPUZvdXQwKzIqbTsKKyAgICAgIEZvdXQzPUZvdXQwKzMqbTsKKyAgICAgIEZvdXQ0PUZvdXQwKzQqbTsKKworICAgICAgdHc9dHdpZGRsZXM7CisgICAgICBmb3IgKCB1PTA7IHU8bTsgKyt1ICkgeworICAgICAgICBzY3JhdGNoWzBdID0gKkZvdXQwOworCisgICAgICAgIHNjcmF0Y2hbMV0gID0gKkZvdXQxICogdHdbdSpmc3RyaWRlXTsKKyAgICAgICAgc2NyYXRjaFsyXSAgPSAqRm91dDIgKiB0d1syKnUqZnN0cmlkZV07CisgICAgICAgIHNjcmF0Y2hbM10gID0gKkZvdXQzICogdHdbMyp1KmZzdHJpZGVdOworICAgICAgICBzY3JhdGNoWzRdICA9ICpGb3V0NCAqIHR3WzQqdSpmc3RyaWRlXTsKKworICAgICAgICBzY3JhdGNoWzddID0gc2NyYXRjaFsxXSArIHNjcmF0Y2hbNF07CisgICAgICAgIHNjcmF0Y2hbMTBdID0gc2NyYXRjaFsxXSAtIHNjcmF0Y2hbNF07CisgICAgICAgIHNjcmF0Y2hbOF0gPSBzY3JhdGNoWzJdICsgc2NyYXRjaFszXTsKKyAgICAgICAgc2NyYXRjaFs5XSA9IHNjcmF0Y2hbMl0gLSBzY3JhdGNoWzNdOworCisgICAgICAgICpGb3V0MCArPSAgc2NyYXRjaFs3XTsKKyAgICAgICAgKkZvdXQwICs9ICBzY3JhdGNoWzhdOworCisgICAgICAgIHNjcmF0Y2hbNV0gPSBzY3JhdGNoWzBdICsgQ29tcGxleCgKKyAgICAgICAgICAgIChzY3JhdGNoWzddLnJlYWwoKSp5YS5yZWFsKCkgKSArIChzY3JhdGNoWzhdLnJlYWwoKSAqeWIucmVhbCgpICksCisgICAgICAgICAgICAoc2NyYXRjaFs3XS5pbWFnKCkqeWEucmVhbCgpKSArIChzY3JhdGNoWzhdLmltYWcoKSp5Yi5yZWFsKCkpCisgICAgICAgICAgICApOworCisgICAgICAgIHNjcmF0Y2hbNl0gPSBDb21wbGV4KAorICAgICAgICAgICAgKHNjcmF0Y2hbMTBdLmltYWcoKSp5YS5pbWFnKCkpICsgKHNjcmF0Y2hbOV0uaW1hZygpKnliLmltYWcoKSksCisgICAgICAgICAgICAtKHNjcmF0Y2hbMTBdLnJlYWwoKSp5YS5pbWFnKCkpIC0gKHNjcmF0Y2hbOV0ucmVhbCgpKnliLmltYWcoKSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgKkZvdXQxID0gc2NyYXRjaFs1XSAtIHNjcmF0Y2hbNl07CisgICAgICAgICpGb3V0NCA9IHNjcmF0Y2hbNV0gKyBzY3JhdGNoWzZdOworCisgICAgICAgIHNjcmF0Y2hbMTFdID0gc2NyYXRjaFswXSArCisgICAgICAgICAgQ29tcGxleCgKKyAgICAgICAgICAgICAgKHNjcmF0Y2hbN10ucmVhbCgpKnliLnJlYWwoKSkgKyAoc2NyYXRjaFs4XS5yZWFsKCkqeWEucmVhbCgpKSwKKyAgICAgICAgICAgICAgKHNjcmF0Y2hbN10uaW1hZygpKnliLnJlYWwoKSkgKyAoc2NyYXRjaFs4XS5pbWFnKCkqeWEucmVhbCgpKQorICAgICAgICAgICAgICApOworCisgICAgICAgIHNjcmF0Y2hbMTJdID0gQ29tcGxleCgKKyAgICAgICAgICAgIC0oc2NyYXRjaFsxMF0uaW1hZygpKnliLmltYWcoKSkgKyAoc2NyYXRjaFs5XS5pbWFnKCkqeWEuaW1hZygpKSwKKyAgICAgICAgICAgIChzY3JhdGNoWzEwXS5yZWFsKCkqeWIuaW1hZygpKSAtIChzY3JhdGNoWzldLnJlYWwoKSp5YS5pbWFnKCkpCisgICAgICAgICAgICApOworCisgICAgICAgICpGb3V0Mj1zY3JhdGNoWzExXStzY3JhdGNoWzEyXTsKKyAgICAgICAgKkZvdXQzPXNjcmF0Y2hbMTFdLXNjcmF0Y2hbMTJdOworCisgICAgICAgICsrRm91dDA7KytGb3V0MTsrK0ZvdXQyOysrRm91dDM7KytGb3V0NDsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogcGVyZm9ybSB0aGUgYnV0dGVyZmx5IGZvciBvbmUgc3RhZ2Ugb2YgYSBtaXhlZCByYWRpeCBGRlQgKi8KKyAgaW5saW5lCisgICAgdm9pZCBiZmx5X2dlbmVyaWMoCisgICAgICAgIENvbXBsZXggKiBGb3V0LAorICAgICAgICBjb25zdCBzaXplX3QgZnN0cmlkZSwKKyAgICAgICAgaW50IG0sCisgICAgICAgIGludCBwCisgICAgICAgICkKKyAgICB7CisgICAgICBpbnQgdSxrLHExLHE7CisgICAgICBDb21wbGV4ICogdHdpZGRsZXMgPSAmbV90d2lkZGxlc1swXTsKKyAgICAgIENvbXBsZXggdDsKKyAgICAgIGludCBOb3JpZyA9IHN0YXRpY19jYXN0PGludD4obV90d2lkZGxlcy5zaXplKCkpOworICAgICAgQ29tcGxleCAqIHNjcmF0Y2hidWYgPSAmbV9zY3JhdGNoQnVmWzBdOworCisgICAgICBmb3IgKCB1PTA7IHU8bTsgKyt1ICkgeworICAgICAgICBrPXU7CisgICAgICAgIGZvciAoIHExPTAgOyBxMTxwIDsgKytxMSApIHsKKyAgICAgICAgICBzY3JhdGNoYnVmW3ExXSA9IEZvdXRbIGsgIF07CisgICAgICAgICAgayArPSBtOworICAgICAgICB9CisKKyAgICAgICAgaz11OworICAgICAgICBmb3IgKCBxMT0wIDsgcTE8cCA7ICsrcTEgKSB7CisgICAgICAgICAgaW50IHR3aWR4PTA7CisgICAgICAgICAgRm91dFsgayBdID0gc2NyYXRjaGJ1ZlswXTsKKyAgICAgICAgICBmb3IgKHE9MTtxPHA7KytxICkgeworICAgICAgICAgICAgdHdpZHggKz0gc3RhdGljX2Nhc3Q8aW50Pihmc3RyaWRlKSAqIGs7CisgICAgICAgICAgICBpZiAodHdpZHg+PU5vcmlnKSB0d2lkeC09Tm9yaWc7CisgICAgICAgICAgICB0PXNjcmF0Y2hidWZbcV0gKiB0d2lkZGxlc1t0d2lkeF07CisgICAgICAgICAgICBGb3V0WyBrIF0gKz0gdDsKKyAgICAgICAgICB9CisgICAgICAgICAgayArPSBtOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitzdHJ1Y3Qga2lzc2ZmdF9pbXBsCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFNjYWxhcj4gQ29tcGxleDsKKworICB2b2lkIGNsZWFyKCkgCisgIHsKKyAgICBtX3BsYW5zLmNsZWFyKCk7CisgICAgbV9yZWFsVHdpZGRsZXMuY2xlYXIoKTsKKyAgfQorCisgIGlubGluZQorICAgIHZvaWQgZndkKCBDb21wbGV4ICogZHN0LGNvbnN0IENvbXBsZXggKnNyYyxpbnQgbmZmdCkKKyAgICB7CisgICAgICBnZXRfcGxhbihuZmZ0LGZhbHNlKS53b3JrKDAsIGRzdCwgc3JjLCAxLDEpOworICAgIH0KKworICBpbmxpbmUKKyAgICB2b2lkIGZ3ZDIoIENvbXBsZXggKiBkc3QsY29uc3QgQ29tcGxleCAqc3JjLGludCBuMCxpbnQgbjEpCisgICAgeworICAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZHN0KTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHNyYyk7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShuMCk7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShuMSk7CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgaW52MiggQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICpzcmMsaW50IG4wLGludCBuMSkKKyAgICB7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShkc3QpOworICAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc3JjKTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG4wKTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG4xKTsKKyAgICB9CisKKyAgLy8gcmVhbC10by1jb21wbGV4IGZvcndhcmQgRkZUCisgIC8vIHBlcmZvcm0gdHdvIEZGVHMgb2Ygc3JjIGV2ZW4gYW5kIHNyYyBvZGQKKyAgLy8gdGhlbiB0d2lkZGxlIHRvIHJlY29tYmluZSB0aGVtIGludG8gdGhlIGhhbGYtc3BlY3RydW0gZm9ybWF0CisgIC8vIHRoZW4gZmlsbCBpbiB0aGUgY29uanVnYXRlIHN5bW1ldHJpYyBoYWxmCisgIGlubGluZQorICAgIHZvaWQgZndkKCBDb21wbGV4ICogZHN0LGNvbnN0IFNjYWxhciAqIHNyYyxpbnQgbmZmdCkgCisgICAgeworICAgICAgaWYgKCBuZmZ0JjMgICkgeworICAgICAgICAvLyB1c2UgZ2VuZXJpYyBtb2RlIGZvciBvZGQKKyAgICAgICAgbV90bXBCdWYxLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgZ2V0X3BsYW4obmZmdCxmYWxzZSkud29yaygwLCAmbV90bXBCdWYxWzBdLCBzcmMsIDEsMSk7CisgICAgICAgIHN0ZDo6Y29weShtX3RtcEJ1ZjEuYmVnaW4oKSxtX3RtcEJ1ZjEuYmVnaW4oKSsobmZmdD4+MSkrMSxkc3QgKTsKKyAgICAgIH1lbHNleworICAgICAgICBpbnQgbmNmZnQgPSBuZmZ0Pj4xOworICAgICAgICBpbnQgbmNmZnQyID0gbmZmdD4+MjsKKyAgICAgICAgQ29tcGxleCAqIHJ0dyA9IHJlYWxfdHdpZGRsZXMobmNmZnQyKTsKKworICAgICAgICAvLyB1c2Ugb3B0aW1pemVkIG1vZGUgZm9yIGV2ZW4gcmVhbAorICAgICAgICBmd2QoIGRzdCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21wbGV4Kj4gKHNyYyksIG5jZmZ0KTsKKyAgICAgICAgQ29tcGxleCBkYyA9IGRzdFswXS5yZWFsKCkgKyAgZHN0WzBdLmltYWcoKTsKKyAgICAgICAgQ29tcGxleCBueXF1aXN0ID0gZHN0WzBdLnJlYWwoKSAtICBkc3RbMF0uaW1hZygpOworICAgICAgICBpbnQgazsKKyAgICAgICAgZm9yICggaz0xO2sgPD0gbmNmZnQyIDsgKytrICkgeworICAgICAgICAgIENvbXBsZXggZnBrID0gZHN0W2tdOworICAgICAgICAgIENvbXBsZXggZnBuayA9IGNvbmooZHN0W25jZmZ0LWtdKTsKKyAgICAgICAgICBDb21wbGV4IGYxayA9IGZwayArIGZwbms7CisgICAgICAgICAgQ29tcGxleCBmMmsgPSBmcGsgLSBmcG5rOworICAgICAgICAgIENvbXBsZXggdHc9IGYyayAqIHJ0d1trLTFdOworICAgICAgICAgIGRzdFtrXSA9ICAoZjFrICsgdHcpICogU2NhbGFyKC41KTsKKyAgICAgICAgICBkc3RbbmNmZnQta10gPSAgY29uaihmMWsgLXR3KSpTY2FsYXIoLjUpOworICAgICAgICB9CisgICAgICAgIGRzdFswXSA9IGRjOworICAgICAgICBkc3RbbmNmZnRdID0gbnlxdWlzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgLy8gaW52ZXJzZSBjb21wbGV4LXRvLWNvbXBsZXgKKyAgaW5saW5lCisgICAgdm9pZCBpbnYoQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICAqc3JjLGludCBuZmZ0KQorICAgIHsKKyAgICAgIGdldF9wbGFuKG5mZnQsdHJ1ZSkud29yaygwLCBkc3QsIHNyYywgMSwxKTsKKyAgICB9CisKKyAgLy8gaGFsZi1jb21wbGV4IHRvIHNjYWxhcgorICBpbmxpbmUKKyAgICB2b2lkIGludiggU2NhbGFyICogZHN0LGNvbnN0IENvbXBsZXggKiBzcmMsaW50IG5mZnQpIAorICAgIHsKKyAgICAgIGlmIChuZmZ0JjMpIHsKKyAgICAgICAgbV90bXBCdWYxLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgbV90bXBCdWYyLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgc3RkOjpjb3B5KHNyYyxzcmMrKG5mZnQ+PjEpKzEsbV90bXBCdWYxLmJlZ2luKCkgKTsKKyAgICAgICAgZm9yIChpbnQgaz0xO2s8KG5mZnQ+PjEpKzE7KytrKQorICAgICAgICAgIG1fdG1wQnVmMVtuZmZ0LWtdID0gY29uaihtX3RtcEJ1ZjFba10pOworICAgICAgICBpbnYoJm1fdG1wQnVmMlswXSwmbV90bXBCdWYxWzBdLG5mZnQpOworICAgICAgICBmb3IgKGludCBrPTA7azxuZmZ0OysraykKKyAgICAgICAgICBkc3Rba10gPSBtX3RtcEJ1ZjJba10ucmVhbCgpOworICAgICAgfWVsc2V7CisgICAgICAgIC8vIG9wdGltaXplZCB2ZXJzaW9uIGZvciBtdWx0aXBsZSBvZiA0CisgICAgICAgIGludCBuY2ZmdCA9IG5mZnQ+PjE7CisgICAgICAgIGludCBuY2ZmdDIgPSBuZmZ0Pj4yOworICAgICAgICBDb21wbGV4ICogcnR3ID0gcmVhbF90d2lkZGxlcyhuY2ZmdDIpOworICAgICAgICBtX3RtcEJ1ZjEucmVzaXplKG5jZmZ0KTsKKyAgICAgICAgbV90bXBCdWYxWzBdID0gQ29tcGxleCggc3JjWzBdLnJlYWwoKSArIHNyY1tuY2ZmdF0ucmVhbCgpLCBzcmNbMF0ucmVhbCgpIC0gc3JjW25jZmZ0XS5yZWFsKCkgKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPD0gbmNmZnQgLyAyOyArK2spIHsKKyAgICAgICAgICBDb21wbGV4IGZrID0gc3JjW2tdOworICAgICAgICAgIENvbXBsZXggZm5rYyA9IGNvbmooc3JjW25jZmZ0LWtdKTsKKyAgICAgICAgICBDb21wbGV4IGZlayA9IGZrICsgZm5rYzsKKyAgICAgICAgICBDb21wbGV4IHRtcCA9IGZrIC0gZm5rYzsKKyAgICAgICAgICBDb21wbGV4IGZvayA9IHRtcCAqIGNvbmoocnR3W2stMV0pOworICAgICAgICAgIG1fdG1wQnVmMVtrXSA9IGZlayArIGZvazsKKyAgICAgICAgICBtX3RtcEJ1ZjFbbmNmZnQta10gPSBjb25qKGZlayAtIGZvayk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0X3BsYW4obmNmZnQsdHJ1ZSkud29yaygwLCByZWludGVycHJldF9jYXN0PENvbXBsZXgqPihkc3QpLCAmbV90bXBCdWYxWzBdLCAxLDEpOworICAgICAgfQorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYga2lzc19jcHhfZmZ0PFNjYWxhcj4gUGxhbkRhdGE7CisgIHR5cGVkZWYgc3RkOjptYXA8aW50LFBsYW5EYXRhPiBQbGFuTWFwOworCisgIFBsYW5NYXAgbV9wbGFuczsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3RvcjxDb21wbGV4PiA+IG1fcmVhbFR3aWRkbGVzOworICBzdGQ6OnZlY3RvcjxDb21wbGV4PiBtX3RtcEJ1ZjE7CisgIHN0ZDo6dmVjdG9yPENvbXBsZXg+IG1fdG1wQnVmMjsKKworICBpbmxpbmUKKyAgICBpbnQgUGxhbktleShpbnQgbmZmdCwgYm9vbCBpc2ludmVyc2UpIGNvbnN0IHsgcmV0dXJuIChuZmZ0PDwxKSB8IGludChpc2ludmVyc2UpOyB9CisKKyAgaW5saW5lCisgICAgUGxhbkRhdGEgJiBnZXRfcGxhbihpbnQgbmZmdCwgYm9vbCBpbnZlcnNlKQorICAgIHsKKyAgICAgIC8vIFRPRE8gbG9vayBmb3IgUGxhbktleShuZmZ0LCAhIGludmVyc2UpIGFuZCBjb25qdWdhdGUgdGhlIHR3aWRkbGVzCisgICAgICBQbGFuRGF0YSAmIHBkID0gbV9wbGFuc1sgUGxhbktleShuZmZ0LGludmVyc2UpIF07CisgICAgICBpZiAoIHBkLm1fdHdpZGRsZXMuc2l6ZSgpID09IDAgKSB7CisgICAgICAgIHBkLm1ha2VfdHdpZGRsZXMobmZmdCxpbnZlcnNlKTsKKyAgICAgICAgcGQuZmFjdG9yaXplKG5mZnQpOworICAgICAgfQorICAgICAgcmV0dXJuIHBkOworICAgIH0KKworICBpbmxpbmUKKyAgICBDb21wbGV4ICogcmVhbF90d2lkZGxlcyhpbnQgbmNmZnQyKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6YWNvczsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbXBsZXg+ICYgdHdpZHJlZiA9IG1fcmVhbFR3aWRkbGVzW25jZmZ0Ml07Ly8gY3JlYXRlcyBuZXcgaWYgbm90IHRoZXJlCisgICAgICBpZiAoIChpbnQpdHdpZHJlZi5zaXplKCkgIT0gbmNmZnQyICkgeworICAgICAgICB0d2lkcmVmLnJlc2l6ZShuY2ZmdDIpOworICAgICAgICBpbnQgbmNmZnQ9IG5jZmZ0Mjw8MTsKKyAgICAgICAgU2NhbGFyIHBpID0gIGFjb3MoIFNjYWxhcigtMSkgKTsKKyAgICAgICAgZm9yIChpbnQgaz0xO2s8PW5jZmZ0MjsrK2spIAorICAgICAgICAgIHR3aWRyZWZbay0xXSA9IGV4cCggQ29tcGxleCgwLC1waSAqIChTY2FsYXIoaykgLyBuY2ZmdCArIFNjYWxhciguNSkpICkgKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAmdHdpZHJlZlswXTsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9Db25zdHJhaW5lZENvbmpHcmFkLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9Db25zdHJhaW5lZENvbmpHcmFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwMDkzZQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0NvbnN0cmFpbmVkQ29uakdyYWQuaApAQCAtMCwwICsxLDE4OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisKKy8qIE5PVEUgVGhlIGZ1bmN0aW9ucyBvZiB0aGlzIGZpbGUgaGF2ZSBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgR01NKysgbGlicmFyeSAqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IFl2ZXMgUmVuYXJkCisvLworLy8gVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBHRVRGRU0rKworLy8KKy8vIEdldGZlbSsrIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisvLyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsCisvLyBVU0EuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oIgorCisjaWZuZGVmIEVJR0VOX0NPTlNUUkFJTkVEQ0dfSAorI2RlZmluZSBFSUdFTl9DT05TVFJBSU5FRENHX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlU29sdmVyc19Nb2R1bGUKKyAgKiBDb21wdXRlIHRoZSBwc2V1ZG8gaW52ZXJzZSBvZiB0aGUgbm9uLXNxdWFyZSBtYXRyaXggQyBzdWNoIHRoYXQKKyAgKiBcZiQgQ0lOViA9IChDICogQ15UKV57LTF9ICogQyBcZiQgYmFzZWQgb24gYSBjb25qdWdhdGUgZ3JhZGllbnQgbWV0aG9kLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbGx5IHVzZWQgYnkgY29uc3RyYWluZWRfY2cuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ01hdHJpeCwgdHlwZW5hbWUgQ0lOVk1hdHJpeD4KK3ZvaWQgcHNldWRvX2ludmVyc2UoY29uc3QgQ01hdHJpeCAmQywgQ0lOVk1hdHJpeCAmQ0lOVikKK3sKKyAgLy8gb3B0aW1pc2FibGUgOiBjb3BpZSBkZSBsYSBsaWduZSwgcHJlY2FsY3VsIGRlIEMgKiB0cmFucyhDKS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBDTWF0cml4OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIENNYXRyaXg6OkluZGV4IEluZGV4OworICAvLyBGSVhNRSB1c2Ugc3BhcnNlIHZlY3RvcnMgPworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBUbXBWZWM7CisKKyAgSW5kZXggcm93cyA9IEMucm93cygpLCBjb2xzID0gQy5jb2xzKCk7CisKKyAgVG1wVmVjIGQocm93cyksIGUocm93cyksIGwoY29scyksIHAocm93cyksIHEocm93cyksIHIocm93cyk7CisgIFNjYWxhciByaG8sIHJob18xLCBhbHBoYTsKKyAgZC5zZXRaZXJvKCk7CisKKyAgdHlwZWRlZiBUcmlwbGV0PGRvdWJsZT4gVDsKKyAgc3RkOjp2ZWN0b3I8VD4gdHJpcGxldExpc3Q7CisgICAgCisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzOyArK2kpCisgIHsKKyAgICBkW2ldID0gMS4wOworICAgIHJobyA9IDEuMDsKKyAgICBlLnNldFplcm8oKTsKKyAgICByID0gZDsKKyAgICBwID0gZDsKKworICAgIHdoaWxlIChyaG8gPj0gMWUtMzgpCisgICAgeyAvKiBjb25qdWdhdGUgZ3JhZGllbnQgdG8gY29tcHV0ZSBlICAgICAgICAgICAgICovCisgICAgICAvKiB3aGljaCBpcyB0aGUgaS10aCByb3cgb2YgaW52KEMgKiB0cmFucyhDKSkgICovCisgICAgICBsID0gQy50cmFuc3Bvc2UoKSAqIHA7CisgICAgICBxID0gQyAqIGw7CisgICAgICBhbHBoYSA9IHJobyAvIHAuZG90KHEpOworICAgICAgZSArPSAgYWxwaGEgKiBwOworICAgICAgciArPSAtYWxwaGEgKiBxOworICAgICAgcmhvXzEgPSByaG87CisgICAgICByaG8gPSByLmRvdChyKTsKKyAgICAgIHAgPSAocmhvL3Job18xKSAqIHAgKyByOworICAgIH0KKworICAgIGwgPSBDLnRyYW5zcG9zZSgpICogZTsgLy8gbCBpcyB0aGUgaS10aCByb3cgb2YgQ0lOVgorICAgIC8vIEZJWE1FIGFkZCBhIGdlbmVyaWMgInBydW5lL2ZpbHRlciIgZXhwcmVzc2lvbiBmb3IgYm90aCBkZW5zZSBhbmQgc3BhcnNlIG9iamVjdCB0byBzcGFyc2UKKyAgICBmb3IgKEluZGV4IGo9MDsgajxsLnNpemUoKTsgKytqKQorICAgICAgaWYgKGxbal08MWUtMTUpCisJdHJpcGxldExpc3QucHVzaF9iYWNrKFQoaSxqLGwoaikpKTsKKworCQorICAgIGRbaV0gPSAwLjA7CisgIH0KKyAgQ0lOVi5zZXRGcm9tVHJpcGxldHModHJpcGxldExpc3QuYmVnaW4oKSwgdHJpcGxldExpc3QuZW5kKCkpOworfQorCisKKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZVNvbHZlcnNfTW9kdWxlCisgICogQ29uc3RyYWluZWQgY29uanVnYXRlIGdyYWRpZW50CisgICoKKyAgKiBDb21wdXRlcyB0aGUgbWluaW11bSBvZiBcZiQgMS8yKChBeCkueCkgLSBieCBcZiQgdW5kZXIgdGhlIGNvbnRyYWludCBcZiQgQ3ggXGxlIGYgXGYkCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUTWF0cml4LCB0eXBlbmFtZSBDTWF0cml4LAorICAgICAgICAgdHlwZW5hbWUgVmVjdG9yWCwgdHlwZW5hbWUgVmVjdG9yQiwgdHlwZW5hbWUgVmVjdG9yRj4KK3ZvaWQgY29uc3RyYWluZWRfY2coY29uc3QgVE1hdHJpeCYgQSwgY29uc3QgQ01hdHJpeCYgQywgVmVjdG9yWCYgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yQiYgYiwgY29uc3QgVmVjdG9yRiYgZiwgSXRlcmF0aW9uQ29udHJvbGxlciAmaXRlcikKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB0eXBlZGVmIHR5cGVuYW1lIFRNYXRyaXg6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgVE1hdHJpeDo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICBUbXBWZWM7CisKKyAgU2NhbGFyIHJobyA9IDEuMCwgcmhvXzEsIGxhbWJkYSwgZ2FtbWE7CisgIEluZGV4IHhTaXplID0geC5zaXplKCk7CisgIFRtcFZlYyAgcCh4U2l6ZSksIHEoeFNpemUpLCBxMih4U2l6ZSksCisgICAgICAgICAgcih4U2l6ZSksIG9sZF96KHhTaXplKSwgeih4U2l6ZSksCisgICAgICAgICAgbWVtb3goeFNpemUpOworICBzdGQ6OnZlY3Rvcjxib29sPiBzYXR1cmVkKEMucm93cygpKTsKKyAgcC5zZXRaZXJvKCk7CisgIGl0ZXIuc2V0UmhzTm9ybShzcXJ0KGIuZG90KGIpKSk7IC8vIGdhZWwgdmVjdF9zcChQUywgYiwgYikKKyAgaWYgKGl0ZXIucmhzTm9ybSgpID09IDAuMCkgaXRlci5zZXRSaHNOb3JtKDEuMCk7CisKKyAgU3BhcnNlTWF0cml4PFNjYWxhcixSb3dNYWpvcj4gQ0lOVihDLnJvd3MoKSwgQy5jb2xzKCkpOworICBwc2V1ZG9faW52ZXJzZShDLCBDSU5WKTsKKworICB3aGlsZSh0cnVlKQorICB7CisgICAgLy8gY29tcHV0YXRpb24gb2YgcmVzaWR1YWwKKyAgICBvbGRfeiA9IHo7CisgICAgbWVtb3ggPSB4OworICAgIHIgPSBiOworICAgIHIgKz0gQSAqIC14OworICAgIHogPSByOworICAgIGJvb2wgdHJhbnNpdGlvbiA9IGZhbHNlOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBDLnJvd3MoKTsgKytpKQorICAgIHsKKyAgICAgIFNjYWxhciBhbCA9IEMucm93KGkpLmRvdCh4KSAtIGYuY29lZmYoaSk7CisgICAgICBpZiAoYWwgPj0gLTEuMEUtMTUpCisgICAgICB7CisgICAgICAgIGlmICghc2F0dXJlZFtpXSkKKyAgICAgICAgeworICAgICAgICAgIHNhdHVyZWRbaV0gPSB0cnVlOworICAgICAgICAgIHRyYW5zaXRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIFNjYWxhciBiYiA9IENJTlYucm93KGkpLmRvdCh6KTsKKyAgICAgICAgaWYgKGJiID4gMC4wKQorICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgYWxsb3cgdGhhdDogeiArPSAtYmIgKiBDLnJvdyhpKTsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIENNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoQyxpKTsgaXQ7ICsraXQpCisgICAgICAgICAgICB6LmNvZWZmUmVmKGl0LmluZGV4KCkpIC09IGJiKml0LnZhbHVlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNhdHVyZWRbaV0gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBkZXNjZW50IGRpcmVjdGlvbgorICAgIHJob18xID0gcmhvOworICAgIHJobyA9IHIuZG90KHopOworCisgICAgaWYgKGl0ZXIuZmluaXNoZWQocmhvKSkgYnJlYWs7CisKKyAgICBpZiAoaXRlci5ub2lzZUxldmVsKCkgPiAwICYmIHRyYW5zaXRpb24pIHN0ZDo6Y2VyciA8PCAiQ0NHOiB0cmFuc2l0aW9uXG4iOworICAgIGlmICh0cmFuc2l0aW9uIHx8IGl0ZXIuZmlyc3QoKSkgZ2FtbWEgPSAwLjA7CisgICAgZWxzZSBnYW1tYSA9IChzdGQ6Om1heCkoMC4wLCAocmhvIC0gb2xkX3ouZG90KHopKSAvIHJob18xKTsKKyAgICBwID0geiArIGdhbW1hKnA7CisKKyAgICArK2l0ZXI7CisgICAgLy8gb25lIGRpbWVuc2lvbm5hbCBvcHRpbWl6YXRpb24KKyAgICBxID0gQSAqIHA7CisgICAgbGFtYmRhID0gcmhvIC8gcS5kb3QocCk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IEMucm93cygpOyArK2kpCisgICAgeworICAgICAgaWYgKCFzYXR1cmVkW2ldKQorICAgICAgeworICAgICAgICBTY2FsYXIgYmIgPSBDLnJvdyhpKS5kb3QocCkgLSBmW2ldOworICAgICAgICBpZiAoYmIgPiAwLjApCisgICAgICAgICAgbGFtYmRhID0gKHN0ZDo6bWluKShsYW1iZGEsIChmLmNvZWZmKGkpLUMucm93KGkpLmRvdCh4KSkgLyBiYik7CisgICAgICB9CisgICAgfQorICAgIHggKz0gbGFtYmRhICogcDsKKyAgICBtZW1veCAtPSB4OworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTlNUUkFJTkVEQ0dfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvREdNUkVTLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9ER01SRVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUwNGZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvREdNUkVTLmgKQEAgLTAsMCArMSw1MTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ER01SRVNfSAorI2RlZmluZSBFSUdFTl9ER01SRVNfSAorCisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisKK25hbWVzcGFjZSBFaWdlbiB7IAorICAKK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXIgPSBEaWFnb25hbFByZWNvbmRpdGlvbmVyPHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXI+ID4KK2NsYXNzIERHTVJFUzsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitzdHJ1Y3QgdHJhaXRzPERHTVJFUzxfTWF0cml4VHlwZSxfUHJlY29uZGl0aW9uZXI+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIF9QcmVjb25kaXRpb25lciBQcmVjb25kaXRpb25lcjsKK307CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgYSBwZXJtdXRhdGlvbiB2ZWN0b3IgdG8gaGF2ZSBhIHNvcnRlZCBzZXF1ZW5jZQorICAqIFxwYXJhbSB2ZWMgVGhlIHZlY3RvciB0byByZW9yZGVyLgorICAqIFxwYXJhbSBwZXJtIGdpdmVzIHRoZSBzb3J0ZWQgc2VxdWVuY2Ugb24gb3V0cHV0LiBNdXN0IGJlIGluaXRpYWxpemVkIHdpdGggMC4ubi0xCisgICogXHBhcmFtIG5jdXQgUHV0ICB0aGUgbmN1dCBzbWFsbGVzdCBlbGVtZW50cyBhdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IKKyAgKiBXQVJOSU5HIFRoaXMgaXMgYW4gZXhwZW5zaXZlIHNvcnQsIHNvIHNob3VsZCBiZSB1c2VkIG9ubHkgCisgICogZm9yIHNtYWxsIHNpemUgdmVjdG9ycworICAqIFRPRE8gVXNlIG1vZGlmaWVkIFF1aWNrU3BsaXQgb3Igc3RkOjpudGhfZWxlbWVudCB0byBnZXQgdGhlIHNtYWxsZXN0IHZhbHVlcyAKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGU+Cit2b2lkIHNvcnRXaXRoUGVybXV0YXRpb24gKFZlY3RvclR5cGUmIHZlYywgSW5kZXhUeXBlJiBwZXJtLCB0eXBlbmFtZSBJbmRleFR5cGU6OlNjYWxhciYgbmN1dCkKK3sKKyAgZWlnZW5fYXNzZXJ0KHZlYy5zaXplKCkgPT0gcGVybS5zaXplKCkpOworICB0eXBlZGVmIHR5cGVuYW1lIEluZGV4VHlwZTo6U2NhbGFyIEluZGV4OyAKKyAgYm9vbCBmbGFnOyAKKyAgZm9yIChJbmRleCBrICA9IDA7IGsgPCBuY3V0OyBrKyspCisgIHsKKyAgICBmbGFnID0gZmFsc2U7CisgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHZlYy5zaXplKCktMTsgaisrKQorICAgIHsKKyAgICAgIGlmICggdmVjKHBlcm0oaikpIDwgdmVjKHBlcm0oaisxKSkgKQorICAgICAgeworICAgICAgICBzdGQ6OnN3YXAocGVybShqKSxwZXJtKGorMSkpOyAKKyAgICAgICAgZmxhZyA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoIWZsYWcpIGJyZWFrOyAvLyBUaGUgdmVjdG9yIGlzIGluIHNvcnRlZCBvcmRlcgorICAgIH0KKyAgfQorfQorCit9CisvKioKKyAqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxJbmVhclNvbHZlcnNfTW9kdWxlCisgKiBcYnJpZWYgQSBSZXN0YXJ0ZWQgR01SRVMgd2l0aCBkZWZsYXRpb24uCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBtb2RpZmljYXRpb24gb2YgdGhlIEdNUkVTIHNvbHZlciBmb3IKKyAqIHNwYXJzZSBsaW5lYXIgc3lzdGVtcy4gVGhlIGJhc2lzIGlzIGJ1aWx0IHdpdGggbW9kaWZpZWQgCisgKiBHcmFtLVNjaG1pZHQuIEF0IGVhY2ggcmVzdGFydCwgYSBmZXcgYXBwcm94aW1hdGVkIGVpZ2VudmVjdG9ycworICogY29ycmVzcG9uZGluZyB0byB0aGUgc21hbGxlc3QgZWlnZW52YWx1ZXMgYXJlIHVzZWQgdG8gYnVpbGQgYQorICogcHJlY29uZGl0aW9uZXIgZm9yIHRoZSBuZXh0IGN5Y2xlLiBUaGlzIHByZWNvbmRpdGlvbmVyIAorICogZm9yIGRlZmxhdGlvbiBjYW4gYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgcHJlY29uZGl0aW9uZXIsIAorICogdGhlIEluY29tcGxldGVMVVQgZm9yIGluc3RhbmNlLiBUaGUgcHJlY29uZGl0aW9uZXIgaXMgYXBwbGllZCAKKyAqIGF0IHJpZ2h0IG9mIHRoZSBtYXRyaXggYW5kIHRoZSBjb21iaW5hdGlvbiBpcyBtdWx0aXBsaWNhdGl2ZS4KKyAqIAorICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBjYW4gYmUgYSBkZW5zZSBvciBhIHNwYXJzZSBtYXRyaXguCisgKiBcdHBhcmFtIF9QcmVjb25kaXRpb25lciB0aGUgdHlwZSBvZiB0aGUgcHJlY29uZGl0aW9uZXIuIERlZmF1bHQgaXMgRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICogVHlwaWNhbCB1c2FnZSA6CisgKiBcY29kZQorICogU3BhcnNlTWF0cml4PGRvdWJsZT4gQTsKKyAqIFZlY3RvclhkIHgsIGI7IAorICogLy9GaWxsIEEgYW5kIGIgLi4uCisgKiBER01SRVM8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBzb2x2ZXI7CisgKiBzb2x2ZXIuc2V0X3Jlc3RhcnQoMzApOyAvLyBTZXQgcmVzdGFydGluZyB2YWx1ZQorICogc29sdmVyLnNldEVpZ2VudigxKTsgLy8gU2V0IHRoZSBudW1iZXIgb2YgZWlnZW52YWx1ZXMgdG8gZGVmbGF0ZQorICogc29sdmVyLmNvbXB1dGUoQSk7CisgKiB4ID0gc29sdmVyLnNvbHZlKGIpOworICogXGVuZGNvZGUKKyAqIAorICogREdNUkVTIGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBtYXRyaXgtZnJlZSBjb250ZXh0LCBzZWUgdGhlIGZvbGxvd2luZyBcbGluayBNYXRyaXhmcmVlU29sdmVyRXhhbXBsZSBleGFtcGxlIFxlbmRsaW5rLgorICoKKyAqIFJlZmVyZW5jZXMgOgorICogWzFdIEQuIE5VRU5UU0EgV0FLQU0gYW5kIEYuIFBBQ1VMTCwgTWVtb3J5IEVmZmljaWVudCBIeWJyaWQKKyAqICBBbGdlYnJhaWMgU29sdmVycyBmb3IgTGluZWFyIFN5c3RlbXMgQXJpc2luZyBmcm9tIENvbXByZXNzaWJsZQorICogIEZsb3dzLCBDb21wdXRlcnMgYW5kIEZsdWlkcywgSW4gUHJlc3MsCisgKiAgaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAxNi9qLmNvbXBmbHVpZC4yMDEyLjAzLjAyMyAgIAorICogWzJdIEsuIEJ1cnJhZ2UgYW5kIEouIEVyaGVsLCBPbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdmFyaW91cyAKKyAqIGFkYXB0aXZlIHByZWNvbmRpdGlvbmVkIEdNUkVTIHN0cmF0ZWdpZXMsIDUoMTk5OCksIDEwMS0xMjEuCisgKiBbM10gSi4gRXJoZWwsIEsuIEJ1cnJhZ2UgYW5kIEIuIFBvaGwsIFJlc3RhcnRlZCBHTVJFUyAKKyAqICBwcmVjb25kaXRpb25lZCBieSBkZWZsYXRpb24sSi4gQ29tcHV0YXRpb25hbCBhbmQgQXBwbGllZAorICogIE1hdGhlbWF0aWNzLCA2OSgxOTk2KSwgMzAzLTMxOC4gCisKKyAqIAorICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK2NsYXNzIERHTVJFUyA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPERHTVJFUzxfTWF0cml4VHlwZSxfUHJlY29uZGl0aW9uZXI+ID4KK3sKKyAgICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8REdNUkVTPiBCYXNlOworICAgIHVzaW5nIEJhc2U6Om1hdHJpeDsKKyAgICB1c2luZyBCYXNlOjptX2Vycm9yOworICAgIHVzaW5nIEJhc2U6Om1faXRlcmF0aW9uczsKKyAgICB1c2luZyBCYXNlOjptX2luZm87CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIHVzaW5nIEJhc2U6Om1fdG9sZXJhbmNlOyAKKyAgcHVibGljOgorICAgIHVzaW5nIEJhc2U6Ol9zb2x2ZV9pbXBsOworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7IAorICAgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZVJlYWxNYXRyaXg7IAorICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVJlYWxWZWN0b3I7IAorICAgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgRHluYW1pYywgMT4gQ29tcGxleFZlY3RvcjsKKyAKKyAgICAKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgIERHTVJFUygpIDogQmFzZSgpLG1fcmVzdGFydCgzMCksbV9uZWlnKDApLG1fcigwKSxtX21heE5laWcoNSksbV9pc0RlZmxBbGxvY2F0ZWQoZmFsc2UpLG1faXNEZWZsSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgLyoqIEluaXRpYWxpemUgdGhlIHNvbHZlciB3aXRoIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIFxjIEF4PWIgc29sdmluZy4KKyAgICAqIAorICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb2xsb3dlZAorICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAqIAorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgZXhwbGljaXQgREdNUkVTKGNvbnN0IEVpZ2VuQmFzZTxNYXRyaXhEZXJpdmVkPiYgQSkgOiBCYXNlKEEuZGVyaXZlZCgpKSwgbV9yZXN0YXJ0KDMwKSxtX25laWcoMCksbV9yKDApLG1fbWF4TmVpZyg1KSxtX2lzRGVmbEFsbG9jYXRlZChmYWxzZSksbV9pc0RlZmxJbml0aWFsaXplZChmYWxzZSkge30KKworICB+REdNUkVTKCkge30KKyAgCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlX3dpdGhfZ3Vlc3NfaW1wbChjb25zdCBSaHMmIGIsIERlc3QmIHgpIGNvbnN0CisgIHsgICAgCisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmb3IoaW50IGo9MDsgajxiLmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKyAgICAgIAorICAgICAgdHlwZW5hbWUgRGVzdDo6Q29sWHByIHhqKHgsaik7CisgICAgICBkZ21yZXMobWF0cml4KCksIGIuY29sKGopLCB4aiwgQmFzZTo6bV9wcmVjb25kaXRpb25lcik7CisgICAgfQorICAgIG1faW5mbyA9IGZhaWxlZCA/IE51bWVyaWNhbElzc3VlCisgICAgICAgICAgIDogbV9lcnJvciA8PSBCYXNlOjptX3RvbGVyYW5jZSA/IFN1Y2Nlc3MKKyAgICAgICAgICAgOiBOb0NvbnZlcmdlbmNlOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIH0KKworICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFJocyYgYiwgTWF0cml4QmFzZTxEZXN0PiYgeCkgY29uc3QKKyAgeworICAgIHggPSBiOworICAgIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoYix4LmRlcml2ZWQoKSk7CisgIH0KKyAgLyoqIAorICAgKiBHZXQgdGhlIHJlc3RhcnQgdmFsdWUKKyAgICAqLworICBpbnQgcmVzdGFydCgpIHsgcmV0dXJuIG1fcmVzdGFydDsgfQorICAKKyAgLyoqIAorICAgKiBTZXQgdGhlIHJlc3RhcnQgdmFsdWUgKGRlZmF1bHQgaXMgMzApICAKKyAgICovCisgIHZvaWQgc2V0X3Jlc3RhcnQoY29uc3QgaW50IHJlc3RhcnQpIHsgbV9yZXN0YXJ0PXJlc3RhcnQ7IH0KKyAgCisgIC8qKiAKKyAgICogU2V0IHRoZSBudW1iZXIgb2YgZWlnZW52YWx1ZXMgdG8gZGVmbGF0ZSBhdCBlYWNoIHJlc3RhcnQgCisgICAqLworICB2b2lkIHNldEVpZ2Vudihjb25zdCBpbnQgbmVpZykgCisgIHsKKyAgICBtX25laWcgPSBuZWlnOworICAgIGlmIChuZWlnKzEgPiBtX21heE5laWcpIG1fbWF4TmVpZyA9IG5laWcrMTsgLy8gVG8gYWxsb3cgZm9yIGNvbXBsZXggY29uanVnYXRlcworICB9CisgIAorICAvKiogCisgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZGVmbGF0aW9uIHN1YnNwYWNlIHNpemUKKyAgICovIAorICBpbnQgZGVmbFNpemUoKSB7cmV0dXJuIG1fcjsgfQorICAKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBkZWZsYXRpb24gc3Vic3BhY2UKKyAgICovCisgIHZvaWQgc2V0TWF4RWlnZW52KGNvbnN0IGludCBtYXhOZWlnKSB7IG1fbWF4TmVpZyA9IG1heE5laWc7IH0KKyAgCisgIHByb3RlY3RlZDoKKyAgICAvLyBER01SRVMgYWxnb3JpdGhtIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgICB2b2lkIGRnbXJlcyhjb25zdCBNYXRyaXhUeXBlJiBtYXQsY29uc3QgUmhzJiByaHMsIERlc3QmIHgsIGNvbnN0IFByZWNvbmRpdGlvbmVyJiBwcmVjb25kKSBjb25zdDsKKyAgICAvLyBQZXJmb3JtIG9uZSBjeWNsZSBvZiBHTVJFUworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgaW50IGRnbXJlc0N5Y2xlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIERlc3QmIHgsIERlbnNlVmVjdG9yJiByMCwgUmVhbFNjYWxhciYgYmV0YSwgY29uc3QgUmVhbFNjYWxhciYgbm9ybVJocywgaW50JiBuYkl0cykgY29uc3Q7IAorICAgIC8vIENvbXB1dGUgZGF0YSB0byB1c2UgZm9yIGRlZmxhdGlvbiAKKyAgICBpbnQgZGdtcmVzQ29tcHV0ZURlZmxhdGlvbkRhdGEoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBQcmVjb25kaXRpb25lciYgcHJlY29uZCwgY29uc3QgSW5kZXgmIGl0LCBTdG9yYWdlSW5kZXgmIG5laWcpIGNvbnN0OworICAgIC8vIEFwcGx5IGRlZmxhdGlvbiB0byBhIHZlY3RvcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIERlc3RUeXBlPgorICAgIGludCBkZ21yZXNBcHBseURlZmxhdGlvbihjb25zdCBSaHNUeXBlJiBJbiwgRGVzdFR5cGUmIE91dCkgY29uc3Q7IAorICAgIENvbXBsZXhWZWN0b3Igc2NodXJWYWx1ZXMoY29uc3QgQ29tcGxleFNjaHVyPERlbnNlTWF0cml4PiYgc2NodXJvZkgpIGNvbnN0OworICAgIENvbXBsZXhWZWN0b3Igc2NodXJWYWx1ZXMoY29uc3QgUmVhbFNjaHVyPERlbnNlTWF0cml4PiYgc2NodXJvZkgpIGNvbnN0OworICAgIC8vIEluaXQgZGF0YSBmb3IgZGVmbGF0aW9uCisgICAgdm9pZCBkZ21yZXNJbml0RGVmbGF0aW9uKEluZGV4JiByb3dzKSBjb25zdDsgCisgICAgbXV0YWJsZSBEZW5zZU1hdHJpeCBtX1Y7IC8vIEtyeWxvdiBiYXNpcyB2ZWN0b3JzCisgICAgbXV0YWJsZSBEZW5zZU1hdHJpeCBtX0g7IC8vIEhlc3NlbmJlcmcgbWF0cml4IAorICAgIG11dGFibGUgRGVuc2VNYXRyaXggbV9IZXM7IC8vIEluaXRpYWwgaGVzc2VuYmVyZyBtYXRyaXggd2lob3V0IEdpdmVucyByb3RhdGlvbnMgYXBwbGllZAorICAgIG11dGFibGUgSW5kZXggbV9yZXN0YXJ0OyAvLyBNYXhpbXVtIHNpemUgb2YgdGhlIEtyeWxvdiBzdWJzcGFjZQorICAgIG11dGFibGUgRGVuc2VNYXRyaXggbV9VOyAvLyBWZWN0b3JzIHRoYXQgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIGludmFyaWFudCBzdWJzcGFjZSAKKyAgICBtdXRhYmxlIERlbnNlTWF0cml4IG1fTVU7IC8vIG1hdHJpeCBvcGVyYXRvciBhcHBsaWVkIHRvIG1fVSAoZm9yIG5leHQgY3ljbGVzKQorICAgIG11dGFibGUgRGVuc2VNYXRyaXggbV9UOyAvKiBUPVVeVCpNXnstMX0qQSpVICovCisgICAgbXV0YWJsZSBQYXJ0aWFsUGl2TFU8RGVuc2VNYXRyaXg+IG1fbHVUOyAvLyBMVSBmYWN0b3JpemF0aW9uIG9mIG1fVAorICAgIG11dGFibGUgU3RvcmFnZUluZGV4IG1fbmVpZzsgLy9OdW1iZXIgb2YgZWlnZW52YWx1ZXMgdG8gZXh0cmFjdCBhdCBlYWNoIHJlc3RhcnQKKyAgICBtdXRhYmxlIGludCBtX3I7IC8vIEN1cnJlbnQgbnVtYmVyIG9mIGRlZmxhdGVkIGVpZ2VudmFsdWVzLCBzaXplIG9mIG1fVQorICAgIG11dGFibGUgaW50IG1fbWF4TmVpZzsgLy8gTWF4aW11bSBudW1iZXIgb2YgZWlnZW52YWx1ZXMgdG8gZGVmbGF0ZQorICAgIG11dGFibGUgUmVhbFNjYWxhciBtX2xhbWJkYU47IC8vTW9kdWx1cyBvZiB0aGUgbGFyZ2VzdCBlaWdlbnZhbHVlIG9mIEEKKyAgICBtdXRhYmxlIGJvb2wgbV9pc0RlZmxBbGxvY2F0ZWQ7CisgICAgbXV0YWJsZSBib29sIG1faXNEZWZsSW5pdGlhbGl6ZWQ7CisgICAgCisgICAgLy9BZGFwdGl2ZSBzdHJhdGVneSAKKyAgICBtdXRhYmxlIFJlYWxTY2FsYXIgbV9zbXY7IC8vIFNtYWxsZXIgbXVsdGlwbGUgb2YgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc3RlcHMgYWxsb3dlZAorICAgIG11dGFibGUgYm9vbCBtX2ZvcmNlOyAvLyBGb3JjZSB0aGUgdXNlIG9mIGRlZmxhdGlvbiBhdCBlYWNoIHJlc3RhcnQKKyAgICAKK307IAorLyoqIAorICogXGJyaWVmIFBlcmZvcm0gc2V2ZXJhbCBjeWNsZXMgb2YgcmVzdGFydGVkIEdNUkVTIHdpdGggbW9kaWZpZWQgR3JhbSBTY2htaWR0LCAKKyAqIAorICogQSByaWdodCBwcmVjb25kaXRpb25lciBpcyB1c2VkIGNvbWJpbmVkIHdpdGggZGVmbGF0aW9uLgorICogCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyPgordGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0Pgordm9pZCBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OmRnbXJlcyhjb25zdCBNYXRyaXhUeXBlJiBtYXQsY29uc3QgUmhzJiByaHMsIERlc3QmIHgsCisgICAgICAgICAgICAgIGNvbnN0IFByZWNvbmRpdGlvbmVyJiBwcmVjb25kKSBjb25zdAoreworICAvL0luaXRpYWxpemF0aW9uCisgIGludCBuID0gbWF0LnJvd3MoKTsgCisgIERlbnNlVmVjdG9yIHIwKG4pOyAKKyAgaW50IG5iSXRzID0gMDsgCisgIG1fSC5yZXNpemUobV9yZXN0YXJ0KzEsIG1fcmVzdGFydCk7CisgIG1fSGVzLnJlc2l6ZShtX3Jlc3RhcnQsIG1fcmVzdGFydCk7CisgIG1fVi5yZXNpemUobixtX3Jlc3RhcnQrMSk7CisgIC8vSW5pdGlhbCByZXNpZHVhbCB2ZWN0b3IgYW5kIGludGlhbCBub3JtCisgIHggPSBwcmVjb25kLnNvbHZlKHgpOworICByMCA9IHJocyAtIG1hdCAqIHg7IAorICBSZWFsU2NhbGFyIGJldGEgPSByMC5ub3JtKCk7IAorICBSZWFsU2NhbGFyIG5vcm1SaHMgPSByaHMubm9ybSgpOworICBtX2Vycm9yID0gYmV0YS9ub3JtUmhzOyAKKyAgaWYobV9lcnJvciA8IG1fdG9sZXJhbmNlKQorICAgIG1faW5mbyA9IFN1Y2Nlc3M7IAorICBlbHNlCisgICAgbV9pbmZvID0gTm9Db252ZXJnZW5jZTsKKyAgCisgIC8vIEl0ZXJhdGl2ZSBwcm9jZXNzCisgIHdoaWxlIChuYkl0cyA8IG1faXRlcmF0aW9ucyAmJiBtX2luZm8gPT0gTm9Db252ZXJnZW5jZSkKKyAgeworICAgIGRnbXJlc0N5Y2xlKG1hdCwgcHJlY29uZCwgeCwgcjAsIGJldGEsIG5vcm1SaHMsIG5iSXRzKTsgCisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IHJlc2lkdWFsIHZlY3RvciBmb3IgdGhlIHJlc3RhcnQgCisgICAgaWYgKG5iSXRzIDwgbV9pdGVyYXRpb25zICYmIG1faW5mbyA9PSBOb0NvbnZlcmdlbmNlKQorICAgICAgcjAgPSByaHMgLSBtYXQgKiB4OyAKKyAgfQorfSAKKworLyoqCisgKiBcYnJpZWYgUGVyZm9ybSBvbmUgcmVzdGFydCBjeWNsZSBvZiBER01SRVMKKyAqIFxwYXJhbSBtYXQgVGhlIGNvZWZmaWNpZW50IG1hdHJpeAorICogXHBhcmFtIHByZWNvbmQgVGhlIHByZWNvbmRpdGlvbmVyCisgKiBccGFyYW0geCB0aGUgbmV3IGFwcHJveGltYXRlZCBzb2x1dGlvbgorICogXHBhcmFtIHIwIFRoZSBpbml0aWFsIHJlc2lkdWFsIHZlY3RvcgorICogXHBhcmFtIGJldGEgVGhlIG5vcm0gb2YgdGhlIHJlc2lkdWFsIGNvbXB1dGVkIHNvIGZhcgorICogXHBhcmFtIG5vcm1SaHMgVGhlIG5vcm0gb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSB2ZWN0b3IKKyAqIFxwYXJhbSBuYkl0cyBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKyAqLwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgoraW50IERHTVJFUzxfTWF0cml4VHlwZSwgX1ByZWNvbmRpdGlvbmVyPjo6ZGdtcmVzQ3ljbGUoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBQcmVjb25kaXRpb25lciYgcHJlY29uZCwgRGVzdCYgeCwgRGVuc2VWZWN0b3ImIHIwLCBSZWFsU2NhbGFyJiBiZXRhLCBjb25zdCBSZWFsU2NhbGFyJiBub3JtUmhzLCBpbnQmIG5iSXRzKSBjb25zdAoreworICAvL0luaXRpYWxpemF0aW9uIAorICBEZW5zZVZlY3RvciBnKG1fcmVzdGFydCsxKTsgLy8gUmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBsZWFzdCBzcXVhcmUgcHJvYmxlbQorICBnLnNldFplcm8oKTsgIAorICBnKDApID0gU2NhbGFyKGJldGEpOyAKKyAgbV9WLmNvbCgwKSA9IHIwL2JldGE7IAorICBtX2luZm8gPSBOb0NvbnZlcmdlbmNlOyAKKyAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+Z3IobV9yZXN0YXJ0KTsgLy8gR2l2ZW5zIHJvdGF0aW9ucworICBpbnQgaXQgPSAwOyAvLyBOdW1iZXIgb2YgaW5uZXIgaXRlcmF0aW9ucyAKKyAgaW50IG4gPSBtYXQucm93cygpOworICBEZW5zZVZlY3RvciB0djEobiksIHR2MihuKTsgIC8vVGVtcG9yYXJ5IHZlY3RvcnMKKyAgd2hpbGUgKG1faW5mbyA9PSBOb0NvbnZlcmdlbmNlICYmIGl0IDwgbV9yZXN0YXJ0ICYmIG5iSXRzIDwgbV9pdGVyYXRpb25zKQorICB7ICAgIAorICAgIC8vIEFwcGx5IHByZWNvbmRpdGlvbmVyKHMpIGF0IHJpZ2h0CisgICAgaWYgKG1faXNEZWZsSW5pdGlhbGl6ZWQgKQorICAgIHsKKyAgICAgIGRnbXJlc0FwcGx5RGVmbGF0aW9uKG1fVi5jb2woaXQpLCB0djEpOyAvLyBEZWZsYXRpb24KKyAgICAgIHR2MiA9IHByZWNvbmQuc29sdmUodHYxKTsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0djIgPSBwcmVjb25kLnNvbHZlKG1fVi5jb2woaXQpKTsgLy8gVXNlcidzIHNlbGVjdGVkIHByZWNvbmRpdGlvbmVyCisgICAgfQorICAgIHR2MSA9IG1hdCAqIHR2MjsgCisgICAKKyAgICAvLyBPcnRob2dvbmFsaXplIGl0IHdpdGggdGhlIHByZXZpb3VzIGJhc2lzIGluIHRoZSBiYXNpcyB1c2luZyBtb2RpZmllZCBHcmFtLVNjaG1pZHQKKyAgICBTY2FsYXIgY29lZjsgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gaXQ7ICsraSkKKyAgICB7IAorICAgICAgY29lZiA9IHR2MS5kb3QobV9WLmNvbChpKSk7CisgICAgICB0djEgPSB0djEgLSBjb2VmICogbV9WLmNvbChpKTsgCisgICAgICBtX0goaSxpdCkgPSBjb2VmOyAKKyAgICAgIG1fSGVzKGksaXQpID0gY29lZjsgCisgICAgfQorICAgIC8vIE5vcm1hbGl6ZSB0aGUgdmVjdG9yIAorICAgIGNvZWYgPSB0djEubm9ybSgpOyAKKyAgICBtX1YuY29sKGl0KzEpID0gdHYxL2NvZWY7CisgICAgbV9IKGl0KzEsIGl0KSA9IGNvZWY7CisvLyAgICAgbV9IZXMoaXQrMSxpdCkgPSBjb2VmOyAKKyAgICAKKyAgICAvLyBGSVhNRSBDaGVjayBmb3IgaGFwcHkgYnJlYWtkb3duIAorICAgIAorICAgIC8vIFVwZGF0ZSBIZXNzZW5iZXJnIG1hdHJpeCB3aXRoIEdpdmVucyByb3RhdGlvbnMKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSBpdDsgKytpKSAKKyAgICB7CisgICAgICBtX0guY29sKGl0KS5hcHBseU9uVGhlTGVmdChpLTEsaSxncltpLTFdLmFkam9pbnQoKSk7CisgICAgfQorICAgIC8vIENvbXB1dGUgdGhlIG5ldyBwbGFuZSByb3RhdGlvbiAKKyAgICBncltpdF0ubWFrZUdpdmVucyhtX0goaXQsIGl0KSwgbV9IKGl0KzEsaXQpKTsgCisgICAgLy8gQXBwbHkgdGhlIG5ldyByb3RhdGlvbgorICAgIG1fSC5jb2woaXQpLmFwcGx5T25UaGVMZWZ0KGl0LGl0KzEsZ3JbaXRdLmFkam9pbnQoKSk7CisgICAgZy5hcHBseU9uVGhlTGVmdChpdCxpdCsxLCBncltpdF0uYWRqb2ludCgpKTsgCisgICAgCisgICAgYmV0YSA9IHN0ZDo6YWJzKGcoaXQrMSkpOworICAgIG1fZXJyb3IgPSBiZXRhL25vcm1SaHM7IAorICAgIC8vIHN0ZDo6Y2VyciA8PCBuYkl0cyA8PCAiIFJlbGF0aXZlIFJlc2lkdWFsIE5vcm0gIiA8PCBtX2Vycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICBpdCsrOyBuYkl0cysrOyAKKyAgICAKKyAgICBpZiAobV9lcnJvciA8IG1fdG9sZXJhbmNlKQorICAgIHsKKyAgICAgIC8vIFRoZSBtZXRob2QgaGFzIGNvbnZlcmdlZAorICAgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAKKyAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNvZWZmaWNpZW50cyBieSBzb2x2aW5nIHRoZSBsZWFzdCBzcXVhcmUgcHJvYmxlbQorLy8gICBpdCsrOworICAvL0ZJWE1FICBDaGVjayBmaXJzdCBpZiB0aGUgbWF0cml4IGlzIHNpbmd1bGFyIC4uLiB6ZXJvIGRpYWdvbmFsCisgIERlbnNlVmVjdG9yIG5ycyhtX3Jlc3RhcnQpOyAKKyAgbnJzID0gbV9ILnRvcExlZnRDb3JuZXIoaXQsaXQpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKGcuaGVhZChpdCkpOyAKKyAgCisgIC8vIEZvcm0gdGhlIG5ldyBzb2x1dGlvbgorICBpZiAobV9pc0RlZmxJbml0aWFsaXplZCkKKyAgeworICAgIHR2MSA9IG1fVi5sZWZ0Q29scyhpdCkgKiBucnM7IAorICAgIGRnbXJlc0FwcGx5RGVmbGF0aW9uKHR2MSwgdHYyKTsgCisgICAgeCA9IHggKyBwcmVjb25kLnNvbHZlKHR2Mik7CisgIH0KKyAgZWxzZQorICAgIHggPSB4ICsgcHJlY29uZC5zb2x2ZShtX1YubGVmdENvbHMoaXQpICogbnJzKTsgCisgIAorICAvLyBHbyBmb3IgYSBuZXcgY3ljbGUgYW5kIGNvbXB1dGUgZGF0YSBmb3IgZGVmbGF0aW9uCisgIGlmKG5iSXRzIDwgbV9pdGVyYXRpb25zICYmIG1faW5mbyA9PSBOb0NvbnZlcmdlbmNlICYmIG1fbmVpZyA+IDAgJiYgKG1fcittX25laWcpIDwgbV9tYXhOZWlnKQorICAgIGRnbXJlc0NvbXB1dGVEZWZsYXRpb25EYXRhKG1hdCwgcHJlY29uZCwgaXQsIG1fbmVpZyk7IAorICByZXR1cm4gMDsgCisgIAorfQorCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyPgordm9pZCBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OmRnbXJlc0luaXREZWZsYXRpb24oSW5kZXgmIHJvd3MpIGNvbnN0Cit7CisgIG1fVS5yZXNpemUocm93cywgbV9tYXhOZWlnKTsKKyAgbV9NVS5yZXNpemUocm93cywgbV9tYXhOZWlnKTsgCisgIG1fVC5yZXNpemUobV9tYXhOZWlnLCBtX21heE5laWcpOworICBtX2xhbWJkYU4gPSAwLjA7IAorICBtX2lzRGVmbEFsbG9jYXRlZCA9IHRydWU7IAorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK2lubGluZSB0eXBlbmFtZSBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OkNvbXBsZXhWZWN0b3IgREdNUkVTPF9NYXRyaXhUeXBlLCBfUHJlY29uZGl0aW9uZXI+OjpzY2h1clZhbHVlcyhjb25zdCBDb21wbGV4U2NodXI8RGVuc2VNYXRyaXg+JiBzY2h1cm9mSCkgY29uc3QKK3sKKyAgcmV0dXJuIHNjaHVyb2ZILm1hdHJpeFQoKS5kaWFnb25hbCgpOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK2lubGluZSB0eXBlbmFtZSBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OkNvbXBsZXhWZWN0b3IgREdNUkVTPF9NYXRyaXhUeXBlLCBfUHJlY29uZGl0aW9uZXI+OjpzY2h1clZhbHVlcyhjb25zdCBSZWFsU2NodXI8RGVuc2VNYXRyaXg+JiBzY2h1cm9mSCkgY29uc3QKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgY29uc3QgRGVuc2VNYXRyaXgmIFQgPSBzY2h1cm9mSC5tYXRyaXhUKCk7CisgIEluZGV4IGl0ID0gVC5yb3dzKCk7CisgIENvbXBsZXhWZWN0b3IgZWlnKGl0KTsKKyAgSW5kZXggaiA9IDA7CisgIHdoaWxlIChqIDwgaXQtMSkKKyAgeworICAgIGlmIChUKGorMSxqKSA9PVNjYWxhcigwKSkKKyAgICB7CisgICAgICBlaWcoaikgPSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4oVChqLGopLFJlYWxTY2FsYXIoMCkpOyAKKyAgICAgIGorKzsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlaWcoaikgPSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4oVChqLGopLFQoaisxLGopKTsgCisgICAgICBlaWcoaisxKSA9IHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPihUKGosaisxKSxUKGorMSxqKzEpKTsKKyAgICAgIGorKzsKKyAgICB9CisgIH0KKyAgaWYgKGogPCBpdC0xKSBlaWcoaikgPSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4oVChqLGopLFJlYWxTY2FsYXIoMCkpOworICByZXR1cm4gZWlnOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK2ludCBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OmRnbXJlc0NvbXB1dGVEZWZsYXRpb25EYXRhKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIGNvbnN0IEluZGV4JiBpdCwgU3RvcmFnZUluZGV4JiBuZWlnKSBjb25zdAoreworICAvLyBGaXJzdCwgZmluZCB0aGUgU2NodXIgZm9ybSBvZiB0aGUgSGVzc2VuYmVyZyBtYXRyaXggSAorICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgQ29tcGxleFNjaHVyPERlbnNlTWF0cml4PiwgUmVhbFNjaHVyPERlbnNlTWF0cml4PiA+Ojp0eXBlIHNjaHVyb2ZIOyAKKyAgYm9vbCBjb21wdXRlVSA9IHRydWU7CisgIERlbnNlTWF0cml4IG1hdHJpeFEoaXQsaXQpOyAKKyAgbWF0cml4US5zZXRJZGVudGl0eSgpOworICBzY2h1cm9mSC5jb21wdXRlRnJvbUhlc3NlbmJlcmcobV9IZXMudG9wTGVmdENvcm5lcihpdCxpdCksIG1hdHJpeFEsIGNvbXB1dGVVKTsgCisgIAorICBDb21wbGV4VmVjdG9yIGVpZyhpdCk7CisgIE1hdHJpeDxTdG9yYWdlSW5kZXgsRHluYW1pYywxPnBlcm0oaXQpOworICBlaWcgPSB0aGlzLT5zY2h1clZhbHVlcyhzY2h1cm9mSCk7CisgIAorICAvLyBSZW9yZGVyIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgU2NodXIgdmFsdWVzCisgIERlbnNlUmVhbFZlY3RvciBtb2R1bEVpZyhpdCk7IAorICBmb3IgKGludCBqPTA7IGo8aXQ7ICsraikgbW9kdWxFaWcoaikgPSBzdGQ6OmFicyhlaWcoaikpOyAKKyAgcGVybS5zZXRMaW5TcGFjZWQoaXQsMCxpdC0xKTsKKyAgaW50ZXJuYWw6OnNvcnRXaXRoUGVybXV0YXRpb24obW9kdWxFaWcsIHBlcm0sIG5laWcpOworICAKKyAgaWYgKCFtX2xhbWJkYU4pCisgIHsKKyAgICBtX2xhbWJkYU4gPSAoc3RkOjptYXgpKG1vZHVsRWlnLm1heENvZWZmKCksIG1fbGFtYmRhTik7CisgIH0KKyAgLy9Db3VudCB0aGUgcmVhbCBudW1iZXIgb2YgZXh0cmFjdGVkIGVpZ2VudmFsdWVzICh3aXRoIGNvbXBsZXggY29uanVnYXRlcykKKyAgaW50IG5ickVpZyA9IDA7IAorICB3aGlsZSAobmJyRWlnIDwgbmVpZykKKyAgeworICAgIGlmKGVpZyhwZXJtKGl0LW5ickVpZy0xKSkuaW1hZygpID09IFJlYWxTY2FsYXIoMCkpIG5ickVpZysrOyAKKyAgICBlbHNlIG5ickVpZyArPSAyOyAKKyAgfQorICAvLyBFeHRyYWN0IHRoZSAgU2NodXIgdmVjdG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbWFsbGVzdCBSaXR6IHZhbHVlcworICBEZW5zZU1hdHJpeCBTcihpdCwgbmJyRWlnKTsgCisgIFNyLnNldFplcm8oKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuYnJFaWc7IGorKykKKyAgeworICAgIFNyLmNvbChqKSA9IHNjaHVyb2ZILm1hdHJpeFUoKS5jb2wocGVybShpdC1qLTEpKTsKKyAgfQorICAKKyAgLy8gRm9ybSB0aGUgU2NodXIgdmVjdG9ycyBvZiB0aGUgaW5pdGlhbCBtYXRyaXggdXNpbmcgdGhlIEtyeWxvdiBiYXNpcworICBEZW5zZU1hdHJpeCBYOyAKKyAgWCA9IG1fVi5sZWZ0Q29scyhpdCkgKiBTcjsKKyAgaWYgKG1fcikKKyAgeworICAgLy8gT3J0aG9nb25hbGl6ZSBYIGFnYWluc3QgbV9VIHVzaW5nIG1vZGlmaWVkIEdyYW0tU2NobWlkdAorICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYnJFaWc7IGorKykKKyAgICAgZm9yIChpbnQgayA9MDsgayA8IG1fcjsgaysrKQorICAgICAgWC5jb2woaikgPSBYLmNvbChqKSAtIChtX1UuY29sKGspLmRvdChYLmNvbChqKSkpKm1fVS5jb2woayk7IAorICB9CisgIAorICAvLyBDb21wdXRlIG1fTVggPSBBICogTV4tMSAqIFgKKyAgSW5kZXggbSA9IG1fVi5yb3dzKCk7CisgIGlmICghbV9pc0RlZmxBbGxvY2F0ZWQpIAorICAgIGRnbXJlc0luaXREZWZsYXRpb24obSk7IAorICBEZW5zZU1hdHJpeCBNWChtLCBuYnJFaWcpOworICBEZW5zZVZlY3RvciB0djEobSk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgbmJyRWlnOyBqKyspCisgIHsKKyAgICB0djEgPSBtYXQgKiBYLmNvbChqKTsKKyAgICBNWC5jb2woaikgPSBwcmVjb25kLnNvbHZlKHR2MSk7CisgIH0KKyAgCisgIC8vVXBkYXRlIG1fVCA9IFtVJ01VIFUnTVg7IFgnTVUgWCdNWF0KKyAgbV9ULmJsb2NrKG1fciwgbV9yLCBuYnJFaWcsIG5ickVpZykgPSBYLnRyYW5zcG9zZSgpICogTVg7IAorICBpZihtX3IpCisgIHsKKyAgICBtX1QuYmxvY2soMCwgbV9yLCBtX3IsIG5ickVpZykgPSBtX1UubGVmdENvbHMobV9yKS50cmFuc3Bvc2UoKSAqIE1YOyAKKyAgICBtX1QuYmxvY2sobV9yLCAwLCBuYnJFaWcsIG1fcikgPSBYLnRyYW5zcG9zZSgpICogbV9NVS5sZWZ0Q29scyhtX3IpOworICB9CisgIAorICAvLyBTYXZlIFggaW50byBtX1UgYW5kIG1fTVggaW4gbV9NVQorICBmb3IgKGludCBqID0gMDsgaiA8IG5ickVpZzsgaisrKSBtX1UuY29sKG1fcitqKSA9IFguY29sKGopOworICBmb3IgKGludCBqID0gMDsgaiA8IG5ickVpZzsgaisrKSBtX01VLmNvbChtX3IraikgPSBNWC5jb2woaik7CisgIC8vIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBpbnZhcmlhbnQgc3Vic3BhY2UKKyAgbV9yICs9IG5ickVpZzsgCisgIAorICAvLyBGYWN0b3JpemUgbV9UIGludG8gbV9sdVQKKyAgbV9sdVQuY29tcHV0ZShtX1QudG9wTGVmdENvcm5lcihtX3IsIG1fcikpOworICAKKyAgLy9GSVhNRSBDSGVjayBpZiB0aGUgZmFjdG9yaXphdGlvbiB3YXMgY29ycmVjdGx5IGRvbmUgKG5vbnNpbmd1bGFyIG1hdHJpeCkKKyAgbV9pc0RlZmxJbml0aWFsaXplZCA9IHRydWU7CisgIHJldHVybiAwOyAKK30KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUeXBlLCB0eXBlbmFtZSBEZXN0VHlwZT4KK2ludCBER01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj46OmRnbXJlc0FwcGx5RGVmbGF0aW9uKGNvbnN0IFJoc1R5cGUgJngsIERlc3RUeXBlICZ5KSBjb25zdAoreworICBEZW5zZVZlY3RvciB4MSA9IG1fVS5sZWZ0Q29scyhtX3IpLnRyYW5zcG9zZSgpICogeDsgCisgIHkgPSB4ICsgbV9VLmxlZnRDb2xzKG1fcikgKiAoIG1fbGFtYmRhTiAqIG1fbHVULnNvbHZlKHgxKSAtIHgxKTsKKyAgcmV0dXJuIDA7IAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0dNUkVTLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9HTVJFUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODJiMGQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9HTVJFUy5oCkBAIC0wLDAgKzEsMzQzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiwgMjAxNCBLb2xqYSBCcml4IDxicml4QGlncG0ucnd0aC1hYWFjaGVuLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HTVJFU19ICisjZGVmaW5lIEVJR0VOX0dNUkVTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqCisqIEdlbmVyYWxpemVkIE1pbmltYWwgUmVzaWR1YWwgQWxnb3JpdGhtIGJhc2VkIG9uIHRoZQorKiBBcm5vbGRpIGFsZ29yaXRobSBpbXBsZW1lbnRlZCB3aXRoIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zLgorKgorKiBQYXJhbWV0ZXJzOgorKiAgXHBhcmFtIG1hdCAgICAgICBtYXRyaXggb2YgbGluZWFyIHN5c3RlbSBvZiBlcXVhdGlvbnMKKyogIFxwYXJhbSBSaHMgICAgICAgcmlnaHQgaGFuZCBzaWRlIHZlY3RvciBvZiBsaW5lYXIgc3lzdGVtIG9mIGVxdWF0aW9ucworKiAgXHBhcmFtIHggICAgICAgICBvbiBpbnB1dDogaW5pdGlhbCBndWVzcywgb24gb3V0cHV0OiBzb2x1dGlvbgorKiAgXHBhcmFtIHByZWNvbmQgICBwcmVjb25kaXRpb25lciB1c2VkCisqICBccGFyYW0gaXRlcnMgICAgIG9uIGlucHV0OiBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm0KKyogICAgICAgICAgICAgICAgICAgb24gb3V0cHV0OiBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQKKyogIFxwYXJhbSByZXN0YXJ0ICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGEgcmVzdGFydAorKiAgXHBhcmFtIHRvbF9lcnJvciBvbiBpbnB1dDogcmVsYXRpdmUgcmVzaWR1YWwgdG9sZXJhbmNlCisqICAgICAgICAgICAgICAgICAgIG9uIG91dHB1dDogcmVzaWR1dW0gYWNoaWV2ZWQKKyoKKyogXHNhIEl0ZXJhdGl2ZU1ldGhvZHM6OmJpY2dzdGFiKCkKKyoKKyoKKyogRm9yIHJlZmVyZW5jZXMsIHBsZWFzZSBzZWU6CisqCisqIFNhYWQsIFkuIGFuZCBTY2h1bHR6LCBNLiBILgorKiBHTVJFUzogQSBHZW5lcmFsaXplZCBNaW5pbWFsIFJlc2lkdWFsIEFsZ29yaXRobSBmb3IgU29sdmluZyBOb25zeW1tZXRyaWMgTGluZWFyIFN5c3RlbXMuCisqIFNJQU0gSi5TY2kuU3RhdC5Db21wLiA3LCAxOTg2LCBwcC4gODU2IC0gODY5LgorKgorKiBTYWFkLCBZLgorKiBJdGVyYXRpdmUgTWV0aG9kcyBmb3IgU3BhcnNlIExpbmVhciBTeXN0ZW1zLgorKiBTb2NpZXR5IGZvciBJbmR1c3RyaWFsIGFuZCBBcHBsaWVkIE1hdGhlbWF0aWNzLCBQaGlsYWRlbHBoaWEsIDIwMDMuCisqCisqIFdhbGtlciwgSC4gRi4KKyogSW1wbGVtZW50YXRpb25zIG9mIHRoZSBHTVJFUyBtZXRob2QuCisqIENvbXB1dC5QaHlzLkNvbW0uIDUzLCAxOTg5LCBwcC4gMzExIC0gMzIwLgorKgorKiBXYWxrZXIsIEguIEYuCisqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBHTVJFUyBNZXRob2QgdXNpbmcgSG91c2Vob2xkZXIgVHJhbnNmb3JtYXRpb25zLgorKiBTSUFNIEouU2NpLlN0YXQuQ29tcC4gOSwgMTk4OCwgcHAuIDE1MiAtIDE2My4KKyoKKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFByZWNvbmRpdGlvbmVyPgorYm9vbCBnbXJlcyhjb25zdCBNYXRyaXhUeXBlICYgbWF0LCBjb25zdCBSaHMgJiByaHMsIERlc3QgJiB4LCBjb25zdCBQcmVjb25kaXRpb25lciAmIHByZWNvbmQsCisgICAgSW5kZXggJml0ZXJzLCBjb25zdCBJbmRleCAmcmVzdGFydCwgdHlwZW5hbWUgRGVzdDo6UmVhbFNjYWxhciAmIHRvbF9lcnJvcikgeworCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphYnM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXggPCBTY2FsYXIsIER5bmFtaWMsIDEgPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeCA8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+IEZNYXRyaXhUeXBlOworCisgIFJlYWxTY2FsYXIgdG9sID0gdG9sX2Vycm9yOworICBjb25zdCBJbmRleCBtYXhJdGVycyA9IGl0ZXJzOworICBpdGVycyA9IDA7CisKKyAgY29uc3QgSW5kZXggbSA9IG1hdC5yb3dzKCk7CisKKyAgLy8gcmVzaWR1YWwgYW5kIHByZWNvbmRpdGlvbmVkIHJlc2lkdWFsCisgIFZlY3RvclR5cGUgcDAgPSByaHMgLSBtYXQqeDsKKyAgVmVjdG9yVHlwZSByMCA9IHByZWNvbmQuc29sdmUocDApOworCisgIGNvbnN0IFJlYWxTY2FsYXIgcjBOb3JtID0gcjAubm9ybSgpOworCisgIC8vIGlzIGluaXRpYWwgZ3Vlc3MgYWxyZWFkeSBnb29kIGVub3VnaD8KKyAgaWYocjBOb3JtID09IDApCisgIHsKKyAgICB0b2xfZXJyb3IgPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gc3RvcmFnZSBmb3IgSGVzc2VuYmVyZyBtYXRyaXggYW5kIEhvdXNlaG9sZGVyIGRhdGEKKyAgRk1hdHJpeFR5cGUgSCAgID0gRk1hdHJpeFR5cGU6Olplcm8obSwgcmVzdGFydCArIDEpOworICBWZWN0b3JUeXBlIHcgICAgPSBWZWN0b3JUeXBlOjpaZXJvKHJlc3RhcnQgKyAxKTsKKyAgVmVjdG9yVHlwZSB0YXUgID0gVmVjdG9yVHlwZTo6WmVybyhyZXN0YXJ0ICsgMSk7CisKKyAgLy8gc3RvcmFnZSBmb3IgSmFjb2JpIHJvdGF0aW9ucworICBzdGQ6OnZlY3RvciA8IEphY29iaVJvdGF0aW9uIDwgU2NhbGFyID4gPiBHKHJlc3RhcnQpOworICAKKyAgLy8gc3RvcmFnZSBmb3IgdGVtcG9yYXJpZXMKKyAgVmVjdG9yVHlwZSB0KG0pLCB2KG0pLCB3b3Jrc3BhY2UobSksIHhfbmV3KG0pOworCisgIC8vIGdlbmVyYXRlIGZpcnN0IEhvdXNlaG9sZGVyIHZlY3RvcgorICBSZWY8VmVjdG9yVHlwZT4gSDBfdGFpbCA9IEguY29sKDApLnRhaWwobSAtIDEpOworICBSZWFsU2NhbGFyIGJldGE7CisgIHIwLm1ha2VIb3VzZWhvbGRlcihIMF90YWlsLCB0YXUuY29lZmZSZWYoMCksIGJldGEpOworICB3KDApID0gU2NhbGFyKGJldGEpOworICAKKyAgZm9yIChJbmRleCBrID0gMTsgayA8PSByZXN0YXJ0OyArK2spCisgIHsKKyAgICArK2l0ZXJzOworCisgICAgdiA9IFZlY3RvclR5cGU6OlVuaXQobSwgayAtIDEpOworCisgICAgLy8gYXBwbHkgSG91c2Vob2xkZXIgcmVmbGVjdGlvbnMgSF97MX0gLi4uIEhfe2stMX0gdG8gdgorICAgIC8vIFRPRE86IHVzZSBhIEhvdXNlaG9sZGVyU2VxdWVuY2UKKyAgICBmb3IgKEluZGV4IGkgPSBrIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgIHYudGFpbChtIC0gaSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChILmNvbChpKS50YWlsKG0gLSBpIC0gMSksIHRhdS5jb2VmZlJlZihpKSwgd29ya3NwYWNlLmRhdGEoKSk7CisgICAgfQorCisgICAgLy8gYXBwbHkgbWF0cml4IE0gdG8gdjogIHYgPSBtYXQgKiB2OworICAgIHQubm9hbGlhcygpID0gbWF0ICogdjsKKyAgICB2ID0gcHJlY29uZC5zb2x2ZSh0KTsKKworICAgIC8vIGFwcGx5IEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zIEhfe2stMX0gLi4uIEhfezF9IHRvIHYKKyAgICAvLyBUT0RPOiB1c2UgYSBIb3VzZWhvbGRlclNlcXVlbmNlCisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGs7ICsraSkgeworICAgICAgdi50YWlsKG0gLSBpKS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KEguY29sKGkpLnRhaWwobSAtIGkgLSAxKSwgdGF1LmNvZWZmUmVmKGkpLCB3b3Jrc3BhY2UuZGF0YSgpKTsKKyAgICB9CisKKyAgICBpZiAodi50YWlsKG0gLSBrKS5ub3JtKCkgIT0gMC4wKQorICAgIHsKKyAgICAgIGlmIChrIDw9IHJlc3RhcnQpCisgICAgICB7CisgICAgICAgIC8vIGdlbmVyYXRlIG5ldyBIb3VzZWhvbGRlciB2ZWN0b3IKKyAgICAgICAgUmVmPFZlY3RvclR5cGU+IEhrX3RhaWwgPSBILmNvbChrKS50YWlsKG0gLSBrIC0gMSk7CisgICAgICAgIHYudGFpbChtIC0gaykubWFrZUhvdXNlaG9sZGVyKEhrX3RhaWwsIHRhdS5jb2VmZlJlZihrKSwgYmV0YSk7CisKKyAgICAgICAgLy8gYXBwbHkgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBIX3trfSB0byB2CisgICAgICAgIHYudGFpbChtIC0gaykuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChIa190YWlsLCB0YXUuY29lZmZSZWYoayksIHdvcmtzcGFjZS5kYXRhKCkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChrID4gMSkKKyAgICB7CisgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgayAtIDE7ICsraSkKKyAgICAgIHsKKyAgICAgICAgLy8gYXBwbHkgb2xkIEdpdmVucyByb3RhdGlvbnMgdG8gdgorICAgICAgICB2LmFwcGx5T25UaGVMZWZ0KGksIGkgKyAxLCBHW2ldLmFkam9pbnQoKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGs8bSAmJiB2KGspICE9IChTY2FsYXIpIDApCisgICAgeworICAgICAgLy8gZGV0ZXJtaW5lIG5leHQgR2l2ZW5zIHJvdGF0aW9uCisgICAgICBHW2sgLSAxXS5tYWtlR2l2ZW5zKHYoayAtIDEpLCB2KGspKTsKKworICAgICAgLy8gYXBwbHkgR2l2ZW5zIHJvdGF0aW9uIHRvIHYgYW5kIHcKKyAgICAgIHYuYXBwbHlPblRoZUxlZnQoayAtIDEsIGssIEdbayAtIDFdLmFkam9pbnQoKSk7CisgICAgICB3LmFwcGx5T25UaGVMZWZ0KGsgLSAxLCBrLCBHW2sgLSAxXS5hZGpvaW50KCkpOworICAgIH0KKworICAgIC8vIGluc2VydCBjb2VmZmljaWVudHMgaW50byB1cHBlciBtYXRyaXggdHJpYW5nbGUKKyAgICBILmNvbChrLTEpLmhlYWQoaykgPSB2LmhlYWQoayk7CisKKyAgICB0b2xfZXJyb3IgPSBhYnModyhrKSkgLyByME5vcm07CisgICAgYm9vbCBzdG9wID0gKGs9PW0gfHwgdG9sX2Vycm9yIDwgdG9sIHx8IGl0ZXJzID09IG1heEl0ZXJzKTsKKworICAgIGlmIChzdG9wIHx8IGsgPT0gcmVzdGFydCkKKyAgICB7CisgICAgICAvLyBzb2x2ZSB1cHBlciB0cmlhbmd1bGFyIHN5c3RlbQorICAgICAgUmVmPFZlY3RvclR5cGU+IHkgPSB3LmhlYWQoayk7CisgICAgICBILnRvcExlZnRDb3JuZXIoaywgaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXcgPFVwcGVyPigpLnNvbHZlSW5QbGFjZSh5KTsKKworICAgICAgLy8gdXNlIEhvcm5lci1saWtlIHNjaGVtZSB0byBjYWxjdWxhdGUgc29sdXRpb24gdmVjdG9yCisgICAgICB4X25ldy5zZXRaZXJvKCk7CisgICAgICBmb3IgKEluZGV4IGkgPSBrIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgICB7CisgICAgICAgIHhfbmV3KGkpICs9IHkoaSk7CisgICAgICAgIC8vIGFwcGx5IEhvdXNlaG9sZGVyIHJlZmxlY3Rpb24gSF97aX0gdG8geF9uZXcKKyAgICAgICAgeF9uZXcudGFpbChtIC0gaSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChILmNvbChpKS50YWlsKG0gLSBpIC0gMSksIHRhdS5jb2VmZlJlZihpKSwgd29ya3NwYWNlLmRhdGEoKSk7CisgICAgICB9CisKKyAgICAgIHggKz0geF9uZXc7CisKKyAgICAgIGlmKHN0b3ApCisgICAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBrPTA7CisKKyAgICAgICAgLy8gcmVzZXQgZGF0YSBmb3IgcmVzdGFydAorICAgICAgICBwMC5ub2FsaWFzKCkgPSByaHMgLSBtYXQqeDsKKyAgICAgICAgcjAgPSBwcmVjb25kLnNvbHZlKHAwKTsKKworICAgICAgICAvLyBjbGVhciBIZXNzZW5iZXJnIG1hdHJpeCBhbmQgSG91c2Vob2xkZXIgZGF0YQorICAgICAgICBILnNldFplcm8oKTsKKyAgICAgICAgdy5zZXRaZXJvKCk7CisgICAgICAgIHRhdS5zZXRaZXJvKCk7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgZmlyc3QgSG91c2Vob2xkZXIgdmVjdG9yCisgICAgICAgIHIwLm1ha2VIb3VzZWhvbGRlcihIMF90YWlsLCB0YXUuY29lZmZSZWYoMCksIGJldGEpOworICAgICAgICB3KDApID0gU2NhbGFyKGJldGEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKKworfQorCit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXIgPSBEaWFnb25hbFByZWNvbmRpdGlvbmVyPHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXI+ID4KK2NsYXNzIEdNUkVTOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK3N0cnVjdCB0cmFpdHM8R01SRVM8X01hdHJpeFR5cGUsX1ByZWNvbmRpdGlvbmVyPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7Cit9OworCit9CisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZQorICAqIFxicmllZiBBIEdNUkVTIHNvbHZlciBmb3Igc3BhcnNlIHNxdWFyZSBwcm9ibGVtcworICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gc29sdmUgZm9yIEEueCA9IGIgc3BhcnNlIGxpbmVhciBwcm9ibGVtcyB1c2luZyBhIGdlbmVyYWxpemVkIG1pbmltYWwKKyAgKiByZXNpZHVhbCBtZXRob2QuIFRoZSB2ZWN0b3JzIHggYW5kIGIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGNhbiBiZSBhIGRlbnNlIG9yIGEgc3BhcnNlIG1hdHJpeC4KKyAgKiBcdHBhcmFtIF9QcmVjb25kaXRpb25lciB0aGUgdHlwZSBvZiB0aGUgcHJlY29uZGl0aW9uZXIuIERlZmF1bHQgaXMgRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICAqCisgICogVGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRvbGVyYW5jZSB2YWx1ZSBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIHNldE1heEl0ZXJhdGlvbnMoKQorICAqIGFuZCBzZXRUb2xlcmFuY2UoKSBtZXRob2RzLiBUaGUgZGVmYXVsdHMgYXJlIHRoZSBzaXplIG9mIHRoZSBwcm9ibGVtIGZvciB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucworICAqIGFuZCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpIGZvciB0aGUgdG9sZXJhbmNlLgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyB0aGUgZGlyZWN0IHNvbHZlciBjbGFzc2VzLiBIZXJlIGlzIGEgdHlwaWNhbCB1c2FnZSBleGFtcGxlOgorICAqIFxjb2RlCisgICogaW50IG4gPSAxMDAwMDsKKyAgKiBWZWN0b3JYZCB4KG4pLCBiKG4pOworICAqIFNwYXJzZU1hdHJpeDxkb3VibGU+IEEobixuKTsKKyAgKiAvLyBmaWxsIEEgYW5kIGIKKyAgKiBHTVJFUzxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcihBKTsKKyAgKiB4ID0gc29sdmVyLnNvbHZlKGIpOworICAqIHN0ZDo6Y291dCA8PCAiI2l0ZXJhdGlvbnM6ICAgICAiIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgc3RkOjplbmRsOworICAqIHN0ZDo6Y291dCA8PCAiZXN0aW1hdGVkIGVycm9yOiAiIDw8IHNvbHZlci5lcnJvcigpICAgICAgPDwgc3RkOjplbmRsOworICAqIC8vIHVwZGF0ZSBiLCBhbmQgc29sdmUgYWdhaW4KKyAgKiB4ID0gc29sdmVyLnNvbHZlKGIpOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBCeSBkZWZhdWx0IHRoZSBpdGVyYXRpb25zIHN0YXJ0IHdpdGggeD0wIGFzIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIHNvbHV0aW9uLgorICAqIE9uZSBjYW4gY29udHJvbCB0aGUgc3RhcnQgdXNpbmcgdGhlIHNvbHZlV2l0aEd1ZXNzKCkgbWV0aG9kLgorICAqIAorICAqIEdNUkVTIGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBtYXRyaXgtZnJlZSBjb250ZXh0LCBzZWUgdGhlIGZvbGxvd2luZyBcbGluayBNYXRyaXhmcmVlU29sdmVyRXhhbXBsZSBleGFtcGxlIFxlbmRsaW5rLgorICAqCisgICogXHNhIGNsYXNzIFNpbXBsaWNpYWxDaG9sZXNreSwgRGlhZ29uYWxQcmVjb25kaXRpb25lciwgSWRlbnRpdHlQcmVjb25kaXRpb25lcgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitjbGFzcyBHTVJFUyA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPEdNUkVTPF9NYXRyaXhUeXBlLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8R01SRVM+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1hdHJpeDsKKyAgdXNpbmcgQmFzZTo6bV9lcnJvcjsKKyAgdXNpbmcgQmFzZTo6bV9pdGVyYXRpb25zOworICB1c2luZyBCYXNlOjptX2luZm87CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKworcHJpdmF0ZToKKyAgSW5kZXggbV9yZXN0YXJ0OworCitwdWJsaWM6CisgIHVzaW5nIEJhc2U6Ol9zb2x2ZV9pbXBsOworICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgX1ByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgIEdNUkVTKCkgOiBCYXNlKCksIG1fcmVzdGFydCgzMCkge30KKworICAvKiogSW5pdGlhbGl6ZSB0aGUgc29sdmVyIHdpdGggbWF0cml4IFxhIEEgZm9yIGZ1cnRoZXIgXGMgQXg9YiBzb2x2aW5nLgorICAgICoKKyAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9sbG93ZWQKKyAgICAqIGJ5IGEgY2FsbCB0byBjb21wdXRlKCkuCisgICAgKgorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4RGVyaXZlZD4KKyAgZXhwbGljaXQgR01SRVMoY29uc3QgRWlnZW5CYXNlPE1hdHJpeERlcml2ZWQ+JiBBKSA6IEJhc2UoQS5kZXJpdmVkKCkpLCBtX3Jlc3RhcnQoMzApIHt9CisKKyAgfkdNUkVTKCkge30KKworICAvKiogR2V0IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhZnRlciB0aGF0IGEgcmVzdGFydCBpcyBwZXJmb3JtZWQuCisgICAgKi8KKyAgSW5kZXggZ2V0X3Jlc3RhcnQoKSB7IHJldHVybiBtX3Jlc3RhcnQ7IH0KKworICAvKiogU2V0IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhZnRlciB0aGF0IGEgcmVzdGFydCBpcyBwZXJmb3JtZWQuCisgICAgKiAgXHBhcmFtIHJlc3RhcnQgICBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgYSByZXN0YXJ0aSwgZGVmYXVsdCBpcyAzMC4KKyAgICAqLworICB2b2lkIHNldF9yZXN0YXJ0KGNvbnN0IEluZGV4IHJlc3RhcnQpIHsgbV9yZXN0YXJ0PXJlc3RhcnQ7IH0KKworICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmb3IoSW5kZXggaj0wOyBqPGIuY29scygpOyArK2opCisgICAgeworICAgICAgbV9pdGVyYXRpb25zID0gQmFzZTo6bWF4SXRlcmF0aW9ucygpOworICAgICAgbV9lcnJvciA9IEJhc2U6Om1fdG9sZXJhbmNlOworCisgICAgICB0eXBlbmFtZSBEZXN0OjpDb2xYcHIgeGooeCxqKTsKKyAgICAgIGlmKCFpbnRlcm5hbDo6Z21yZXMobWF0cml4KCksIGIuY29sKGopLCB4aiwgQmFzZTo6bV9wcmVjb25kaXRpb25lciwgbV9pdGVyYXRpb25zLCBtX3Jlc3RhcnQsIG1fZXJyb3IpKQorICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKyAgICBtX2luZm8gPSBmYWlsZWQgPyBOdW1lcmljYWxJc3N1ZQorICAgICAgICAgIDogbV9lcnJvciA8PSBCYXNlOjptX3RvbGVyYW5jZSA/IFN1Y2Nlc3MKKyAgICAgICAgICA6IE5vQ29udmVyZ2VuY2U7CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlX2ltcGwoY29uc3QgUmhzJiBiLCBNYXRyaXhCYXNlPERlc3Q+ICZ4KSBjb25zdAorICB7CisgICAgeCA9IGI7CisgICAgaWYoeC5zcXVhcmVkTm9ybSgpID09IDApIHJldHVybjsgLy8gQ2hlY2sgWmVybyByaWdodCBoYW5kIHNpZGUKKyAgICBfc29sdmVfd2l0aF9ndWVzc19pbXBsKGIseC5kZXJpdmVkKCkpOworICB9CisKK3Byb3RlY3RlZDoKKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9HTVJFU19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JbmNvbXBsZXRlTFUuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0luY29tcGxldGVMVS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDhjMzUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JbmNvbXBsZXRlTFUuaApAQCAtMCwwICsxLDkwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSU5DT01QTEVURV9MVV9ICisjZGVmaW5lIEVJR0VOX0lOQ09NUExFVEVfTFVfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBJbmNvbXBsZXRlTFUgOiBwdWJsaWMgU3BhcnNlU29sdmVyQmFzZTxJbmNvbXBsZXRlTFU8X1NjYWxhcj4gPgoreworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBTcGFyc2VTb2x2ZXJCYXNlPEluY29tcGxldGVMVTxfU2NhbGFyPiA+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIAorICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3I+IEZhY3RvclR5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7CisKKyAgICBJbmNvbXBsZXRlTFUoKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBJbmNvbXBsZXRlTFUoY29uc3QgTWF0cml4VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0KTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9sdS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9sdS5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSW5jb21wbGV0ZUxVJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCkKKyAgICB7CisgICAgICBtX2x1ID0gbWF0OworICAgICAgaW50IHNpemUgPSBtYXQuY29scygpOworICAgICAgVmVjdG9yIGRpYWcoc2l6ZSk7CisgICAgICBmb3IoaW50IGk9MDsgaTxzaXplOyArK2kpCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIEZhY3RvclR5cGU6OklubmVySXRlcmF0b3Iga19pdChtX2x1LGkpOworICAgICAgICBmb3IoOyBrX2l0ICYmIGtfaXQuaW5kZXgoKTxpOyArK2tfaXQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgayA9IGtfaXQuaW5kZXgoKTsKKyAgICAgICAgICBrX2l0LnZhbHVlUmVmKCkgLz0gZGlhZyhrKTsKKworICAgICAgICAgIHR5cGVuYW1lIEZhY3RvclR5cGU6OklubmVySXRlcmF0b3Igal9pdChrX2l0KTsKKyAgICAgICAgICB0eXBlbmFtZSBGYWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGtqX2l0KG1fbHUsIGspOworICAgICAgICAgIHdoaWxlKGtqX2l0ICYmIGtqX2l0LmluZGV4KCk8PWspICsra2pfaXQ7CisgICAgICAgICAgZm9yKCsral9pdDsgal9pdDsgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGtqX2l0LmluZGV4KCk9PWpfaXQuaW5kZXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgal9pdC52YWx1ZVJlZigpIC09IGtfaXQudmFsdWUoKSAqIGtqX2l0LnZhbHVlKCk7CisgICAgICAgICAgICAgICsral9pdDsKKyAgICAgICAgICAgICAgKytral9pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoa2pfaXQuaW5kZXgoKTxqX2l0LmluZGV4KCkpICsra2pfaXQ7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2pfaXQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGtfaXQgJiYga19pdC5pbmRleCgpPT1pKSBkaWFnKGkpID0ga19pdC52YWx1ZSgpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgZGlhZyhpKSA9IDE7CisgICAgICB9CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgICB2b2lkIF9zb2x2ZV9pbXBsKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgICB7CisgICAgICB4ID0gbV9sdS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkuc29sdmUoYik7CisgICAgICB4ID0gbV9sdS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh4KTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIEZhY3RvclR5cGUgbV9sdTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSU5DT01QTEVURV9MVV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JdGVyYXRpb25Db250cm9sbGVyLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JdGVyYXRpb25Db250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljMWE0YgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0l0ZXJhdGlvbkNvbnRyb2xsZXIuaApAQCAtMCwwICsxLDE1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKworLyogTk9URSBUaGUgY2xhc3MgSXRlcmF0aW9uQ29udHJvbGxlciBoYXMgYmVlbiBhZGFwdGVkIGZyb20gdGhlIGl0ZXJhdGlvbgorICogICAgICBjbGFzcyBvZiB0aGUgR01NKysgYW5kIElUTCBsaWJyYXJpZXMuCisgKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEKKy8vIEF1dGhvcnM6IEFuZHJldyBMdW1zZGFpbmUgPGx1bXNAb3NsLml1LmVkdT4gCisvLyAgICAgICAgICBMaWUtUXVhbiBMZWUgICAgIDxsbGVlQG9zbC5pdS5lZHU+CisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEl0ZXJhdGl2ZSBUZW1wbGF0ZSBMaWJyYXJ5CisvLworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgTGljZW5zZSBBZ3JlZW1lbnQgZm9yIHRoZQorLy8gSXRlcmF0aXZlIFRlbXBsYXRlIExpYnJhcnkgYWxvbmcgd2l0aCB0aGUgc29mdHdhcmU7ICBzZWUgdGhlCisvLyBmaWxlIExJQ0VOU0UuICAKKy8vCisvLyBQZXJtaXNzaW9uIHRvIG1vZGlmeSB0aGUgY29kZSBhbmQgdG8gZGlzdHJpYnV0ZSBtb2RpZmllZCBjb2RlIGlzCisvLyBncmFudGVkLCBwcm92aWRlZCB0aGUgdGV4dCBvZiB0aGlzIE5PVElDRSBpcyByZXRhaW5lZCwgYSBub3RpY2UgdGhhdAorLy8gdGhlIGNvZGUgd2FzIG1vZGlmaWVkIGlzIGluY2x1ZGVkIHdpdGggdGhlIGFib3ZlIENPUFlSSUdIVCBOT1RJQ0UgYW5kCisvLyB3aXRoIHRoZSBDT1BZUklHSFQgTk9USUNFIGluIHRoZSBMSUNFTlNFIGZpbGUsIGFuZCB0aGF0IHRoZSBMSUNFTlNFCisvLyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIG1vZGlmaWVkIGNvZGUuCisvLworLy8gTElDRU5TT1IgTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRC4KKy8vIEJ5IHdheSBvZiBleGFtcGxlLCBidXQgbm90IGxpbWl0YXRpb24sIExpY2Vuc29yIE1BS0VTIE5PCisvLyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZCisvLyBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBMSUNFTlNFRCBTT0ZUV0FSRSBDT01QT05FTlRTCisvLyBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTCisvLyBPUiBPVEhFUiBSSUdIVFMuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDcgWXZlcyBSZW5hcmQKKy8vCisvLyBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIEdFVEZFTSsrCisvLworLy8gR2V0ZmVtKysgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKy8vIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZS4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwKKy8vIFVTQS4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vRWlnZW4vc3JjL0NvcmUvdXRpbC9Ob25NUEwyLmgiCisKKyNpZm5kZWYgRUlHRU5fSVRFUkFUSU9OX0NPTlRST0xMRVJfSAorI2RlZmluZSBFSUdFTl9JVEVSQVRJT05fQ09OVFJPTExFUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlU29sdmVyc19Nb2R1bGUKKyAgKiBcY2xhc3MgSXRlcmF0aW9uQ29udHJvbGxlcgorICAqCisgICogXGJyaWVmIENvbnRyb2xzIHRoZSBpdGVyYXRpb25zIG9mIHRoZSBpdGVyYXRpdmUgc29sdmVycworICAqCisgICogVGhpcyBjbGFzcyBoYXMgYmVlbiBhZGFwdGVkIGZyb20gdGhlIGl0ZXJhdGlvbiBjbGFzcyBvZiBHTU0rKyBhbmQgSVRMIGxpYnJhcmllcy4KKyAgKgorICAqLworY2xhc3MgSXRlcmF0aW9uQ29udHJvbGxlcgoreworICBwcm90ZWN0ZWQgOgorICAgIGRvdWJsZSBtX3Joc247ICAgICAgICAvLy88IFJpZ2h0IGhhbmQgc2lkZSBub3JtCisgICAgc2l6ZV90IG1fbWF4aXRlcjsgICAgIC8vLzwgTWF4LiBudW1iZXIgb2YgaXRlcmF0aW9ucworICAgIGludCBtX25vaXNlOyAgICAgICAgICAvLy88IGlmIG5vaXNlID4gMCBpdGVyYXRpb25zIGFyZSBwcmludGVkCisgICAgZG91YmxlIG1fcmVzbWF4OyAgICAgIC8vLzwgbWF4aW11bSByZXNpZHVhbAorICAgIGRvdWJsZSBtX3Jlc21pbnJlYWNoLCBtX3Jlc2FkZDsKKyAgICBzaXplX3QgbV9uaXQ7ICAgICAgICAgLy8vPCBpdGVyYXRpb24gbnVtYmVyCisgICAgZG91YmxlIG1fcmVzOyAgICAgICAgIC8vLzwgbGFzdCBjb21wdXRlZCByZXNpZHVhbAorICAgIGJvb2wgbV93cml0dGVuOworICAgIHZvaWQgKCptX2NhbGxiYWNrKShjb25zdCBJdGVyYXRpb25Db250cm9sbGVyJik7CisgIHB1YmxpYyA6CisKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIG1fbml0ID0gMDsgbV9yZXMgPSAwLjA7IG1fd3JpdHRlbiA9IGZhbHNlOworICAgICAgbV9yZXNtaW5yZWFjaCA9IDFFNTA7IG1fcmVzYWRkID0gMC4wOworICAgICAgbV9jYWxsYmFjayA9IDA7CisgICAgfQorCisgICAgSXRlcmF0aW9uQ29udHJvbGxlcihkb3VibGUgciA9IDEuMEUtOCwgaW50IG5vaSA9IDAsIHNpemVfdCBtaXQgPSBzaXplX3QoLTEpKQorICAgICAgOiBtX3Joc24oMS4wKSwgbV9tYXhpdGVyKG1pdCksIG1fbm9pc2Uobm9pKSwgbV9yZXNtYXgocikgeyBpbml0KCk7IH0KKworICAgIHZvaWQgb3BlcmF0b3IgKysoaW50KSB7IG1fbml0Kys7IG1fd3JpdHRlbiA9IGZhbHNlOyBtX3Jlc2FkZCArPSBtX3JlczsgfQorICAgIHZvaWQgb3BlcmF0b3IgKysoKSB7ICgqdGhpcykrKzsgfQorCisgICAgYm9vbCBmaXJzdCgpIHsgcmV0dXJuIG1fbml0ID09IDA7IH0KKworICAgIC8qIGdldC9zZXQgdGhlICJub2lzeW5lc3MiICh2ZXJib3NpdHkpIG9mIHRoZSBzb2x2ZXJzICovCisgICAgaW50IG5vaXNlTGV2ZWwoKSBjb25zdCB7IHJldHVybiBtX25vaXNlOyB9CisgICAgdm9pZCBzZXROb2lzZUxldmVsKGludCBuKSB7IG1fbm9pc2UgPSBuOyB9CisgICAgdm9pZCByZWR1Y2VOb2lzZUxldmVsKCkgeyBpZiAobV9ub2lzZSA+IDApIG1fbm9pc2UtLTsgfQorCisgICAgZG91YmxlIG1heFJlc2lkdWFsKCkgY29uc3QgeyByZXR1cm4gbV9yZXNtYXg7IH0KKyAgICB2b2lkIHNldE1heFJlc2lkdWFsKGRvdWJsZSByKSB7IG1fcmVzbWF4ID0gcjsgfQorCisgICAgZG91YmxlIHJlc2lkdWFsKCkgY29uc3QgeyByZXR1cm4gbV9yZXM7IH0KKworICAgIC8qIGNoYW5nZSB0aGUgdXNlci1kZWZpbmFibGUgY2FsbGJhY2ssIGNhbGxlZCBhZnRlciBlYWNoIGl0ZXJhdGlvbiAqLworICAgIHZvaWQgc2V0Q2FsbGJhY2sodm9pZCAoKnQpKGNvbnN0IEl0ZXJhdGlvbkNvbnRyb2xsZXImKSkKKyAgICB7CisgICAgICBtX2NhbGxiYWNrID0gdDsKKyAgICB9CisKKyAgICBzaXplX3QgaXRlcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9uaXQ7IH0KKyAgICB2b2lkIHNldEl0ZXJhdGlvbihzaXplX3QgaSkgeyBtX25pdCA9IGk7IH0KKworICAgIHNpemVfdCBtYXhJdGVyYXJpb25zKCkgY29uc3QgeyByZXR1cm4gbV9tYXhpdGVyOyB9CisgICAgdm9pZCBzZXRNYXhJdGVyYXRpb25zKHNpemVfdCBpKSB7IG1fbWF4aXRlciA9IGk7IH0KKworICAgIGRvdWJsZSByaHNOb3JtKCkgY29uc3QgeyByZXR1cm4gbV9yaHNuOyB9CisgICAgdm9pZCBzZXRSaHNOb3JtKGRvdWJsZSByKSB7IG1fcmhzbiA9IHI7IH0KKworICAgIGJvb2wgY29udmVyZ2VkKCkgY29uc3QgeyByZXR1cm4gbV9yZXMgPD0gbV9yaHNuICogbV9yZXNtYXg7IH0KKyAgICBib29sIGNvbnZlcmdlZChkb3VibGUgbnIpCisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBtX3JlcyA9IGFicyhucik7IAorICAgICAgbV9yZXNtaW5yZWFjaCA9IChzdGQ6Om1pbikobV9yZXNtaW5yZWFjaCwgbV9yZXMpOworICAgICAgcmV0dXJuIGNvbnZlcmdlZCgpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiBib29sIGNvbnZlcmdlZChjb25zdCBWZWN0b3JUeXBlICZ2KQorICAgIHsgcmV0dXJuIGNvbnZlcmdlZCh2LnNxdWFyZWROb3JtKCkpOyB9CisKKyAgICBib29sIGZpbmlzaGVkKGRvdWJsZSBucikKKyAgICB7CisgICAgICBpZiAobV9jYWxsYmFjaykgbV9jYWxsYmFjaygqdGhpcyk7CisgICAgICBpZiAobV9ub2lzZSA+IDAgJiYgIW1fd3JpdHRlbikKKyAgICAgIHsKKyAgICAgICAgY29udmVyZ2VkKG5yKTsKKyAgICAgICAgbV93cml0dGVuID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAobV9uaXQgPj0gbV9tYXhpdGVyIHx8IGNvbnZlcmdlZChucikpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgICBib29sIGZpbmlzaGVkKGNvbnN0IE1hdHJpeEJhc2U8VmVjdG9yVHlwZT4gJnYpCisgICAgeyByZXR1cm4gZmluaXNoZWQoZG91YmxlKHYuc3F1YXJlZE5vcm0oKSkpOyB9CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSVRFUkFUSU9OX0NPTlRST0xMRVJfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvTUlOUkVTLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9NSU5SRVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTY5OTBjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvTUlOUkVTLmgKQEAgLTAsMCArMSwyODkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdpYWNvbW8gUG8gPGdwb0B1Y2xhLmVkdT4KKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjaWZuZGVmIEVJR0VOX01JTlJFU19IXworI2RlZmluZSBFSUdFTl9NSU5SRVNfSF8KKworCituYW1lc3BhY2UgRWlnZW4geworICAgIAorICAgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgICAgIAorICAgICAgICAvKiogXGludGVybmFsIExvdy1sZXZlbCBNSU5SRVMgYWxnb3JpdGhtCisgICAgICAgICAqIFxwYXJhbSBtYXQgVGhlIG1hdHJpeCBBCisgICAgICAgICAqIFxwYXJhbSByaHMgVGhlIHJpZ2h0IGhhbmQgc2lkZSB2ZWN0b3IgYgorICAgICAgICAgKiBccGFyYW0geCBPbiBpbnB1dCBhbmQgaW5pdGlhbCBzb2x1dGlvbiwgb24gb3V0cHV0IHRoZSBjb21wdXRlZCBzb2x1dGlvbi4KKyAgICAgICAgICogXHBhcmFtIHByZWNvbmQgQSByaWdodCBwcmVjb25kaXRpb25lciBiZWluZyBhYmxlIHRvIGVmZmljaWVudGx5IHNvbHZlIGZvciBhbgorICAgICAgICAgKiAgICAgICAgICAgICAgICBhcHByb3hpbWF0aW9uIG9mIEF4PWIgKHJlZ2FyZGxlc3Mgb2YgYikKKyAgICAgICAgICogXHBhcmFtIGl0ZXJzIE9uIGlucHV0IHRoZSBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbiwgb24gb3V0cHV0IHRoZSBudW1iZXIgb2YgcGVyZm9ybWVkIGl0ZXJhdGlvbnMuCisgICAgICAgICAqIFxwYXJhbSB0b2xfZXJyb3IgT24gaW5wdXQgdGhlIHRvbGVyYW5jZSBlcnJvciwgb24gb3V0cHV0IGFuIGVzdGltYXRpb24gb2YgdGhlIHJlbGF0aXZlIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBQcmVjb25kaXRpb25lcj4KKyAgICAgICAgRUlHRU5fRE9OVF9JTkxJTkUKKyAgICAgICAgdm9pZCBtaW5yZXMoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBSaHMmIHJocywgRGVzdCYgeCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIEluZGV4JiBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgRGVzdDo6UmVhbFNjYWxhciYgdG9sX2Vycm9yKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFNjYWxhcjsKKyAgICAgICAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB6ZXJvIHJocworICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciByaHNOb3JtMihyaHMuc3F1YXJlZE5vcm0oKSk7CisgICAgICAgICAgICBpZihyaHNOb3JtMiA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHguc2V0WmVybygpOworICAgICAgICAgICAgICAgIGl0ZXJzID0gMDsKKyAgICAgICAgICAgICAgICB0b2xfZXJyb3IgPSAwOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZQorICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4SXRlcnMoaXRlcnMpOyAgLy8gaW5pdGlhbGl6ZSBtYXhJdGVycyB0byBpdGVycworICAgICAgICAgICAgY29uc3QgSW5kZXggTihtYXQuY29scygpKTsgICAgLy8gdGhlIHNpemUgb2YgdGhlIG1hdHJpeAorICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciB0aHJlc2hvbGQyKHRvbF9lcnJvcip0b2xfZXJyb3IqcmhzTm9ybTIpOyAvLyBjb252ZXJnZW5jZSB0aHJlc2hvbGQgKGNvbXBhcmVkIHRvIHJlc2lkdWFsTm9ybTIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcHJlY29uZGl0aW9uZWQgTGFuY3pvcworICAgICAgICAgICAgVmVjdG9yVHlwZSB2X29sZChOKTsgLy8gd2lsbCBiZSBpbml0aWFsaXplZCBpbnNpZGUgbG9vcAorICAgICAgICAgICAgVmVjdG9yVHlwZSB2KCBWZWN0b3JUeXBlOjpaZXJvKE4pICk7IC8vaW5pdGlhbGl6ZSB2CisgICAgICAgICAgICBWZWN0b3JUeXBlIHZfbmV3KHJocy1tYXQqeCk7IC8vaW5pdGlhbGl6ZSB2X25ldworICAgICAgICAgICAgUmVhbFNjYWxhciByZXNpZHVhbE5vcm0yKHZfbmV3LnNxdWFyZWROb3JtKCkpOworICAgICAgICAgICAgVmVjdG9yVHlwZSB3KE4pOyAvLyB3aWxsIGJlIGluaXRpYWxpemVkIGluc2lkZSBsb29wCisgICAgICAgICAgICBWZWN0b3JUeXBlIHdfbmV3KHByZWNvbmQuc29sdmUodl9uZXcpKTsgLy8gaW5pdGlhbGl6ZSB3X25ldworLy8gICAgICAgICAgICBSZWFsU2NhbGFyIGJldGE7IC8vIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW5zaWRlIGxvb3AKKyAgICAgICAgICAgIFJlYWxTY2FsYXIgYmV0YV9uZXcyKHZfbmV3LmRvdCh3X25ldykpOworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGJldGFfbmV3MiA+PSAwLjAgJiYgIlBSRUNPTkRJVElPTkVSIElTIE5PVCBQT1NJVElWRSBERUZJTklURSIpOworICAgICAgICAgICAgUmVhbFNjYWxhciBiZXRhX25ldyhzcXJ0KGJldGFfbmV3MikpOworICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciBiZXRhX29uZShiZXRhX25ldyk7CisgICAgICAgICAgICB2X25ldyAvPSBiZXRhX25ldzsKKyAgICAgICAgICAgIHdfbmV3IC89IGJldGFfbmV3OworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBvdGhlciB2YXJpYWJsZXMKKyAgICAgICAgICAgIFJlYWxTY2FsYXIgYygxLjApOyAvLyB0aGUgY29zaW5lIG9mIHRoZSBHaXZlbnMgcm90YXRpb24KKyAgICAgICAgICAgIFJlYWxTY2FsYXIgY19vbGQoMS4wKTsKKyAgICAgICAgICAgIFJlYWxTY2FsYXIgcygwLjApOyAvLyB0aGUgc2luZSBvZiB0aGUgR2l2ZW5zIHJvdGF0aW9uCisgICAgICAgICAgICBSZWFsU2NhbGFyIHNfb2xkKDAuMCk7IC8vIHRoZSBzaW5lIG9mIHRoZSBHaXZlbnMgcm90YXRpb24KKyAgICAgICAgICAgIFZlY3RvclR5cGUgcF9vb2xkKE4pOyAvLyB3aWxsIGJlIGluaXRpYWxpemVkIGluIGxvb3AKKyAgICAgICAgICAgIFZlY3RvclR5cGUgcF9vbGQoVmVjdG9yVHlwZTo6WmVybyhOKSk7IC8vIGluaXRpYWxpemUgcF9vbGQ9MAorICAgICAgICAgICAgVmVjdG9yVHlwZSBwKHBfb2xkKTsgLy8gaW5pdGlhbGl6ZSBwPTAKKyAgICAgICAgICAgIFJlYWxTY2FsYXIgZXRhKDEuMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGl0ZXJzID0gMDsgLy8gcmVzZXQgaXRlcnMKKyAgICAgICAgICAgIHdoaWxlICggaXRlcnMgPCBtYXhJdGVycyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uZWQgTGFuY3pvcworICAgICAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGVyZSBhcmUgNCB2YXJpYW50cyBvbiB0aGUgTGFuY3pvcyBhbGdvcml0aG0uIFRoZXNlIGFyZQorICAgICAgICAgICAgICAgICAqIGRlc2NyaWJlZCBpbiBQYWlnZSwgQy4gQy4gKDE5NzIpLiBDb21wdXRhdGlvbmFsIHZhcmlhbnRzIG9mCisgICAgICAgICAgICAgICAgICogdGhlIExhbmN6b3MgbWV0aG9kIGZvciB0aGUgZWlnZW5wcm9ibGVtLiBJTUEgSm91cm5hbCBvZiBBcHBsaWVkCisgICAgICAgICAgICAgICAgICogTWF0aGVtYXRpY3MsIDEwKDMpLCAzNzPigJMzODEuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNvcnJlc3BvbmRzIAorICAgICAgICAgICAgICAgICAqIHRvIHRoZSBjYXNlIEEoMiw3KSBpbiB0aGUgcGFwZXIuIEl0IGFsc28gY29ycmVzcG9uZHMgdG8gCisgICAgICAgICAgICAgICAgICogYWxnb3JpdGhtIDYuMTQgaW4gWS4gU2FhZCwgSXRlcmF0aXZlIE1ldGhvZHMg77+877+877+8Zm9yIFNwYXJzZSBMaW5lYXIKKyAgICAgICAgICAgICAgICAgKiBTeXN0ZW1zLCAyMDAzIHAuMTczLiBGb3IgdGhlIHByZWNvbmRpdGlvbmVkIHZlcnNpb24gc2VlIAorICAgICAgICAgICAgICAgICAqIEEuIEdyZWVuYmF1bSwgSXRlcmF0aXZlIE1ldGhvZHMgZm9yIFNvbHZpbmcgTGluZWFyIFN5c3RlbXMsIFNJQU0gKDE5ODcpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgYmV0YShiZXRhX25ldyk7CisgICAgICAgICAgICAgICAgdl9vbGQgPSB2OyAvLyB1cGRhdGU6IGF0IGZpcnN0IHRpbWUgc3RlcCwgdGhpcyBtYWtlcyB2X29sZCA9IDAgc28gdmFsdWUgb2YgYmV0YSBkb2Vzbid0IG1hdHRlcgorLy8gICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yVHlwZSB2X29sZCh2KTsgLy8gTk9UIFNVUkUgSUYgQ1JFQVRJTkcgdl9vbGQgRVZFUlkgSVRFUkFUSU9OIElTIEVGRklDSUVOVAorICAgICAgICAgICAgICAgIHYgPSB2X25ldzsgLy8gdXBkYXRlCisgICAgICAgICAgICAgICAgdyA9IHdfbmV3OyAvLyB1cGRhdGUKKy8vICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvclR5cGUgdyh3X25ldyk7IC8vIE5PVCBTVVJFIElGIENSRUFUSU5HIHcgRVZFUlkgSVRFUkFUSU9OIElTIEVGRklDSUVOVAorICAgICAgICAgICAgICAgIHZfbmV3Lm5vYWxpYXMoKSA9IG1hdCp3IC0gYmV0YSp2X29sZDsgLy8gY29tcHV0ZSB2X25ldworICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgYWxwaGEgPSB2X25ldy5kb3Qodyk7CisgICAgICAgICAgICAgICAgdl9uZXcgLT0gYWxwaGEqdjsgLy8gb3ZlcndyaXRlIHZfbmV3CisgICAgICAgICAgICAgICAgd19uZXcgPSBwcmVjb25kLnNvbHZlKHZfbmV3KTsgLy8gb3ZlcndyaXRlIHdfbmV3CisgICAgICAgICAgICAgICAgYmV0YV9uZXcyID0gdl9uZXcuZG90KHdfbmV3KTsgLy8gY29tcHV0ZSBiZXRhX25ldworICAgICAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChiZXRhX25ldzIgPj0gMC4wICYmICJQUkVDT05ESVRJT05FUiBJUyBOT1QgUE9TSVRJVkUgREVGSU5JVEUiKTsKKyAgICAgICAgICAgICAgICBiZXRhX25ldyA9IHNxcnQoYmV0YV9uZXcyKTsgLy8gY29tcHV0ZSBiZXRhX25ldworICAgICAgICAgICAgICAgIHZfbmV3IC89IGJldGFfbmV3OyAvLyBvdmVyd3JpdGUgdl9uZXcgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgd19uZXcgLz0gYmV0YV9uZXc7IC8vIG92ZXJ3cml0ZSB3X25ldyBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBHaXZlbnMgcm90YXRpb24KKyAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyIHIyID1zKmFscGhhK2MqY19vbGQqYmV0YTsgLy8gcywgc19vbGQsIGMgYW5kIGNfb2xkIGFyZSBzdGlsbCBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgcjMgPXNfb2xkKmJldGE7IC8vIHMsIHNfb2xkLCBjIGFuZCBjX29sZCBhcmUgc3RpbGwgZnJvbSBwcmV2aW91cyBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyIHIxX2hhdD1jKmFscGhhLWNfb2xkKnMqYmV0YTsKKyAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyIHIxID1zcXJ0KCBzdGQ6OnBvdyhyMV9oYXQsMikgKyBzdGQ6OnBvdyhiZXRhX25ldywyKSApOworICAgICAgICAgICAgICAgIGNfb2xkID0gYzsgLy8gc3RvcmUgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgc19vbGQgPSBzOyAvLyBzdG9yZSBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICBjPXIxX2hhdC9yMTsgLy8gbmV3IGNvc2luZQorICAgICAgICAgICAgICAgIHM9YmV0YV9uZXcvcjE7IC8vIG5ldyBzaW5lCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHNvbHV0aW9uCisgICAgICAgICAgICAgICAgcF9vb2xkID0gcF9vbGQ7CisvLyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3JUeXBlIHBfb29sZChwX29sZCk7IC8vIE5PVCBTVVJFIElGIENSRUFUSU5HIHBfb29sZCBFVkVSWSBJVEVSQVRJT04gSVMgRUZGSUNJRU5UCisgICAgICAgICAgICAgICAgcF9vbGQgPSBwOworICAgICAgICAgICAgICAgIHAubm9hbGlhcygpPSh3LXIyKnBfb2xkLXIzKnBfb29sZCkgL3IxOyAvLyBJUyBOT0FMSUFTIFJFUVVJUkVEPworICAgICAgICAgICAgICAgIHggKz0gYmV0YV9vbmUqYypldGEqcDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHNxdWFyZWQgcmVzaWR1YWwuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBlc3RpbWF0ZWQgcmVzaWR1YWwuCisgICAgICAgICAgICAgICAgVGhlIHJlYWwgcmVzaWR1YWwgfEF4LWJ8XjIgbWF5IGJlIHNsaWdodGx5IGxhcmdlciAqLworICAgICAgICAgICAgICAgIHJlc2lkdWFsTm9ybTIgKj0gcypzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggcmVzaWR1YWxOb3JtMiA8IHRocmVzaG9sZDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZXRhPS1zKmV0YTsgLy8gdXBkYXRlIGV0YQorICAgICAgICAgICAgICAgIGl0ZXJzKys7IC8vIGluY3JlbWVudCBpdGVyYXRpb24gbnVtYmVyIChmb3Igb3V0cHV0IHB1cnBvc2VzKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDb21wdXRlIGVycm9yLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZXN0aW1hdGVkIGVycm9yLiBUaGUgcmVhbCAKKyAgICAgICAgICAgICBlcnJvciB8QXgtYnwvfGJ8IG1heSBiZSBzbGlnaHRseSBsYXJnZXIgKi8KKyAgICAgICAgICAgIHRvbF9lcnJvciA9IHN0ZDo6c3FydChyZXNpZHVhbE5vcm0yIC8gcmhzTm9ybTIpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbz1Mb3dlciwKKyAgICB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXIgPSBJZGVudGl0eVByZWNvbmRpdGlvbmVyPgorICAgIGNsYXNzIE1JTlJFUzsKKyAgICAKKyAgICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgICAgICAKKyAgICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KKyAgICAgICAgc3RydWN0IHRyYWl0czxNSU5SRVM8X01hdHJpeFR5cGUsX1VwTG8sX1ByZWNvbmRpdGlvbmVyPiA+CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICAgICAgICAgIHR5cGVkZWYgX1ByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworICAgICAgICB9OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICAgICogXGJyaWVmIEEgbWluaW1hbCByZXNpZHVhbCBzb2x2ZXIgZm9yIHNwYXJzZSBzeW1tZXRyaWMgcHJvYmxlbXMKKyAgICAgKgorICAgICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLnggPSBiIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdXNpbmcgdGhlIE1JTlJFUyBhbGdvcml0aG0KKyAgICAgKiBvZiBQYWlnZSBhbmQgU2F1bmRlcnMgKDE5NzUpLiBUaGUgc3BhcnNlIG1hdHJpeCBBIG11c3QgYmUgc3ltbWV0cmljIChwb3NzaWJseSBpbmRlZmluaXRlKS4KKyAgICAgKiBUaGUgdmVjdG9ycyB4IGFuZCBiIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAgICAqCisgICAgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBjYW4gYmUgYSBkZW5zZSBvciBhIHNwYXJzZSBtYXRyaXguCisgICAgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIsCisgICAgICogICAgICAgICAgICAgICBVcHBlciwgb3IgTG93ZXJ8VXBwZXIgaW4gd2hpY2ggdGhlIGZ1bGwgbWF0cml4IGVudHJpZXMgd2lsbCBiZSBjb25zaWRlcmVkLiBEZWZhdWx0IGlzIExvd2VyLgorICAgICAqIFx0cGFyYW0gX1ByZWNvbmRpdGlvbmVyIHRoZSB0eXBlIG9mIHRoZSBwcmVjb25kaXRpb25lci4gRGVmYXVsdCBpcyBEaWFnb25hbFByZWNvbmRpdGlvbmVyCisgICAgICoKKyAgICAgKiBUaGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbmQgdG9sZXJhbmNlIHZhbHVlIGNhbiBiZSBjb250cm9sbGVkIHZpYSB0aGUgc2V0TWF4SXRlcmF0aW9ucygpCisgICAgICogYW5kIHNldFRvbGVyYW5jZSgpIG1ldGhvZHMuIFRoZSBkZWZhdWx0cyBhcmUgdGhlIHNpemUgb2YgdGhlIHByb2JsZW0gZm9yIHRoZSBtYXhpbWFsIG51bWJlciBvZiBpdGVyYXRpb25zCisgICAgICogYW5kIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgZm9yIHRoZSB0b2xlcmFuY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIHRoZSBkaXJlY3Qgc29sdmVyIGNsYXNzZXMuIEhlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CisgICAgICogXGNvZGUKKyAgICAgKiBpbnQgbiA9IDEwMDAwOworICAgICAqIFZlY3RvclhkIHgobiksIGIobik7CisgICAgICogU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLG4pOworICAgICAqIC8vIGZpbGwgQSBhbmQgYgorICAgICAqIE1JTlJFUzxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IG1yOworICAgICAqIG1yLmNvbXB1dGUoQSk7CisgICAgICogeCA9IG1yLnNvbHZlKGIpOworICAgICAqIHN0ZDo6Y291dCA8PCAiI2l0ZXJhdGlvbnM6ICAgICAiIDw8IG1yLml0ZXJhdGlvbnMoKSA8PCBzdGQ6OmVuZGw7CisgICAgICogc3RkOjpjb3V0IDw8ICJlc3RpbWF0ZWQgZXJyb3I6ICIgPDwgbXIuZXJyb3IoKSAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgKiAvLyB1cGRhdGUgYiwgYW5kIHNvbHZlIGFnYWluCisgICAgICogeCA9IG1yLnNvbHZlKGIpOworICAgICAqIFxlbmRjb2RlCisgICAgICoKKyAgICAgKiBCeSBkZWZhdWx0IHRoZSBpdGVyYXRpb25zIHN0YXJ0IHdpdGggeD0wIGFzIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIHNvbHV0aW9uLgorICAgICAqIE9uZSBjYW4gY29udHJvbCB0aGUgc3RhcnQgdXNpbmcgdGhlIHNvbHZlV2l0aEd1ZXNzKCkgbWV0aG9kLgorICAgICAqCisgICAgICogTUlOUkVTIGNhbiBhbHNvIGJlIHVzZWQgaW4gYSBtYXRyaXgtZnJlZSBjb250ZXh0LCBzZWUgdGhlIGZvbGxvd2luZyBcbGluayBNYXRyaXhmcmVlU29sdmVyRXhhbXBsZSBleGFtcGxlIFxlbmRsaW5rLgorICAgICAqCisgICAgICogXHNhIGNsYXNzIENvbmp1Z2F0ZUdyYWRpZW50LCBCaUNHU1RBQiwgU2ltcGxpY2lhbENob2xlc2t5LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyCisgICAgICovCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KKyAgICBjbGFzcyBNSU5SRVMgOiBwdWJsaWMgSXRlcmF0aXZlU29sdmVyQmFzZTxNSU5SRVM8X01hdHJpeFR5cGUsX1VwTG8sX1ByZWNvbmRpdGlvbmVyPiA+CisgICAgeworICAgICAgICAKKyAgICAgICAgdHlwZWRlZiBJdGVyYXRpdmVTb2x2ZXJCYXNlPE1JTlJFUz4gQmFzZTsKKyAgICAgICAgdXNpbmcgQmFzZTo6bWF0cml4OworICAgICAgICB1c2luZyBCYXNlOjptX2Vycm9yOworICAgICAgICB1c2luZyBCYXNlOjptX2l0ZXJhdGlvbnM7CisgICAgICAgIHVzaW5nIEJhc2U6Om1faW5mbzsKKyAgICAgICAgdXNpbmcgQmFzZTo6bV9pc0luaXRpYWxpemVkOworICAgIHB1YmxpYzoKKyAgICAgICAgdXNpbmcgQmFzZTo6X3NvbHZlX2ltcGw7CisgICAgICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICAgICAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7CisgICAgICAgIAorICAgICAgICBlbnVtIHtVcExvID0gX1VwTG99OworICAgICAgICAKKyAgICBwdWJsaWM6CisgICAgICAgIAorICAgICAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgICAgICAgTUlOUkVTKCkgOiBCYXNlKCkge30KKyAgICAgICAgCisgICAgICAgIC8qKiBJbml0aWFsaXplIHRoZSBzb2x2ZXIgd2l0aCBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBcYyBBeD1iIHNvbHZpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9sbG93ZWQKKyAgICAgICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAgICAgICoKKyAgICAgICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICAgICAgKiBwcmVjb21wdXRlZCB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gaXQuIFRoZXJlZm9yZSwgaWYgXGEgQSBpcyBjaGFuZ2VkCisgICAgICAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgICAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhEZXJpdmVkPgorICAgICAgICBleHBsaWNpdCBNSU5SRVMoY29uc3QgRWlnZW5CYXNlPE1hdHJpeERlcml2ZWQ+JiBBKSA6IEJhc2UoQS5kZXJpdmVkKCkpIHt9CisgICAgICAgIAorICAgICAgICAvKiogRGVzdHJ1Y3Rvci4gKi8KKyAgICAgICAgfk1JTlJFUygpe30KKworICAgICAgICAvKiogXGludGVybmFsICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgICAgICB2b2lkIF9zb2x2ZV93aXRoX2d1ZXNzX2ltcGwoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6Ok1hdHJpeFdyYXBwZXIgTWF0cml4V3JhcHBlcjsKKyAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6QWN0dWFsTWF0cml4VHlwZSBBY3R1YWxNYXRyaXhUeXBlOworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgIFRyYW5zcG9zZUlucHV0ICA9ICAgKCFNYXRyaXhXcmFwcGVyOjpNYXRyaXhGcmVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIChVcExvPT0oTG93ZXJ8VXBwZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgICghTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8VHJhbnNwb3NlSW5wdXQsVHJhbnNwb3NlPGNvbnN0IEFjdHVhbE1hdHJpeFR5cGU+LCBBY3R1YWxNYXRyaXhUeXBlIGNvbnN0Jj46OnR5cGUgUm93TWFqb3JXcmFwcGVyOworICAgICAgICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFSUdFTl9JTVBMSUVTKE1hdHJpeFdyYXBwZXI6Ok1hdHJpeEZyZWUsVXBMbz09KExvd2VyfFVwcGVyKSksTUFUUklYX0ZSRUVfQ09OSlVHQVRFX0dSQURJRU5UX0lTX0NPTVBBVElCTEVfV0lUSF9VUFBFUl9VTklPTl9MT1dFUl9NT0RFX09OTFkpOworICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8VXBMbz09KExvd2VyfFVwcGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93TWFqb3JXcmFwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhXcmFwcGVyOjp0ZW1wbGF0ZSBDb25zdFNlbGZBZGpvaW50Vmlld1JldHVyblR5cGU8VXBMbz46OlR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTZWxmQWRqb2ludFdyYXBwZXI7CisKKyAgICAgICAgICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICAgICAgICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKyAgICAgICAgICAgIFJvd01ham9yV3JhcHBlciByb3dfbWF0KG1hdHJpeCgpKTsKKyAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqPGIuY29scygpOyArK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRpb25zID0gQmFzZTo6bWF4SXRlcmF0aW9ucygpOworICAgICAgICAgICAgICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBEZXN0OjpDb2xYcHIgeGooeCxqKTsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbDo6bWlucmVzKFNlbGZBZGpvaW50V3JhcHBlcihyb3dfbWF0KSwgYi5jb2woaiksIHhqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTo6bV9wcmVjb25kaXRpb25lciwgbV9pdGVyYXRpb25zLCBtX2Vycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1faW5mbyA9IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzIDogTm9Db252ZXJnZW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqIFxpbnRlcm5hbCAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgICAgICAgdm9pZCBfc29sdmVfaW1wbChjb25zdCBSaHMmIGIsIE1hdHJpeEJhc2U8RGVzdD4gJngpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHguc2V0WmVybygpOworICAgICAgICAgICAgX3NvbHZlX3dpdGhfZ3Vlc3NfaW1wbChiLHguZGVyaXZlZCgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIAorICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUlOUkVTX0gKKwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvU2NhbGluZy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvU2NhbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTNlNmUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9TY2FsaW5nLmgKQEAgLTAsMCArMSwxODcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIERlc2lyZSBOVUVOVFNBIFdBS0FNIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JVEVSU0NBTElOR19ICisjZGVmaW5lIEVJR0VOX0lURVJTQ0FMSU5HX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqCisgICogXGluZ3JvdXAgSXRlcmF0aXZlU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgaXRlcmF0aXZlIHNjYWxpbmcgYWxnb3JpdGhtIHRvIGVxdWlsaWJyYXRlIHJvd3MgYW5kIGNvbHVtbiBub3JtcyBpbiBtYXRyaWNlcworICAqIAorICAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgYSBwcmVwcm9jZXNzaW5nIHRvb2wgdG8gYWNjZWxlcmF0ZSB0aGUgY29udmVyZ2VuY2Ugb2YgaXRlcmF0aXZlIG1ldGhvZHMgCisgICogCisgICogVGhpcyBmZWF0dXJlIGlzICB1c2VmdWwgdG8gbGltaXQgdGhlIHBpdm90aW5nIGFtb3VudCBkdXJpbmcgTFUvSUxVIGZhY3Rvcml6YXRpb24KKyAgKiBUaGUgIHNjYWxpbmcgc3RyYXRlZ3kgYXMgcHJlc2VudGVkIGhlcmUgcHJlc2VydmVzIHRoZSBzeW1tZXRyeSBvZiB0aGUgcHJvYmxlbQorICAqIE5PVEUgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtYXRyaXggZG9lcyBub3QgaGF2ZSBlbXB0eSByb3cgb3IgY29sdW1uLCAKKyAgKiAKKyAgKiBFeGFtcGxlIHdpdGgga2V5IHN0ZXBzIAorICAqIFxjb2RlCisgICogVmVjdG9yWGQgeChuKSwgYihuKTsKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBOworICAqIC8vIGZpbGwgQSBhbmQgYjsKKyAgKiBJdGVyU2NhbGluZzxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNjYWw7IAorICAqIC8vIENvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IHNjYWxpbmcgdmVjdG9ycy4gVGhlIG1hdHJpeCBpcyBlcXVpbGlicmF0ZWQgYXQgb3V0cHV0CisgICogc2NhbC5jb21wdXRlUmVmKEEpOyAKKyAgKiAvLyBTY2FsZSB0aGUgcmlnaHQgaGFuZCBzaWRlCisgICogYiA9IHNjYWwuTGVmdFNjYWxpbmcoKS5jd2lzZVByb2R1Y3QoYik7IAorICAqIC8vIE5vdywgc29sdmUgdGhlIGVxdWlsaWJyYXRlZCBsaW5lYXIgc3lzdGVtIHdpdGggYW55IGF2YWlsYWJsZSBzb2x2ZXIKKyAgKiAKKyAgKiAvLyBTY2FsZSBiYWNrIHRoZSBjb21wdXRlZCBzb2x1dGlvbgorICAqIHggPSBzY2FsLlJpZ2h0U2NhbGluZygpLmN3aXNlUHJvZHVjdCh4KTsgCisgICogXGVuZGNvZGUKKyAgKiAKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXguIEl0IHNob3VsZCBiZSBhIHJlYWwgc3F1YXJlIHNwYXJzZW1hdHJpeAorICAqIAorICAqIFJlZmVyZW5jZXMgOiBELiBSdWl6IGFuZCBCLiBVY2FyLCBBIFN5bW1ldHJ5IFByZXNlcnZpbmcgQWxnb3JpdGhtIGZvciBNYXRyaXggU2NhbGluZywgSU5SSUEgUmVzZWFyY2ggcmVwb3J0IFJSLTc1NTIKKyAgKiAKKyAgKiBcc2EgXHJlZiBJbmNvbXBsZXRlTFVUIAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBJdGVyU2NhbGluZworeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOyAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICAKKyAgcHVibGljOgorICAgIEl0ZXJTY2FsaW5nKCkgeyBpbml0KCk7IH0KKyAgICAKKyAgICBJdGVyU2NhbGluZyhjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgaW5pdCgpOworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICB+SXRlclNjYWxpbmcoKSB7IH0KKyAgICAKKyAgICAvKiogCisgICAgICogQ29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgZGlhZ29uYWwgbWF0cmljZXMgdG8gc2NhbGUgdGhlIGlucHV0IG1hdHJpeCBAcCBtYXQKKyAgICAgKiAKKyAgICAgKiBGSVhNRSBUaGlzIGFsZ29yaXRobSB3aWxsIGJlIG1vZGlmaWVkIHN1Y2ggdGhhdCB0aGUgZGlhZ29uYWwgZWxlbWVudHMgYXJlIHBlcm11dGVkIG9uIHRoZSBkaWFnb25hbC4gCisgICAgICogCisgICAgICogXHNhIExlZnRTY2FsaW5nKCkgUmlnaHRTY2FsaW5nKCkKKyAgICAgKi8KKyAgICB2b2lkIGNvbXB1dGUgKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCkKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgIGludCBtID0gbWF0LnJvd3MoKTsgCisgICAgICBpbnQgbiA9IG1hdC5jb2xzKCk7CisgICAgICBlaWdlbl9hc3NlcnQoKG0+MCAmJiBtID09IG4pICYmICJQbGVhc2UgZ2l2ZSBhIG5vbiAtIGVtcHR5IG1hdHJpeCIpOworICAgICAgbV9sZWZ0LnJlc2l6ZShtKTsgCisgICAgICBtX3JpZ2h0LnJlc2l6ZShuKTsKKyAgICAgIG1fbGVmdC5zZXRPbmVzKCk7CisgICAgICBtX3JpZ2h0LnNldE9uZXMoKTsKKyAgICAgIG1fbWF0cml4ID0gbWF0OworICAgICAgVmVjdG9yWGQgRHIsIERjLCBEclJlcywgRGNSZXM7IC8vIFRlbXBvcmFyeSBMZWZ0IGFuZCByaWdodCBzY2FsaW5nIHZlY3RvcnMKKyAgICAgIERyLnJlc2l6ZShtKTsgRGMucmVzaXplKG4pOworICAgICAgRHJSZXMucmVzaXplKG0pOyBEY1Jlcy5yZXNpemUobik7CisgICAgICBkb3VibGUgRXBzUm93ID0gMS4wLCBFcHNDb2wgPSAxLjA7CisgICAgICBpbnQgaXRzID0gMDsgCisgICAgICBkbworICAgICAgeyAvLyBJdGVyYXRlIHVudGlsIHRoZSBpbmZpbml0ZSBub3JtIG9mIGVhY2ggcm93IGFuZCBjb2x1bW4gaXMgYXBwcm94aW1hdGVseSAxCisgICAgICAgIC8vIEdldCB0aGUgbWF4aW11bSB2YWx1ZSBpbiBlYWNoIHJvdyBhbmQgY29sdW1uCisgICAgICAgIERyLnNldFplcm8oKTsgRGMuc2V0WmVybygpOworICAgICAgICBmb3IgKGludCBrPTA7IGs8bV9tYXRyaXgub3V0ZXJTaXplKCk7ICsraykKKyAgICAgICAgeworICAgICAgICAgIGZvciAodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtX21hdHJpeCwgayk7IGl0OyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggRHIoaXQucm93KCkpIDwgYWJzKGl0LnZhbHVlKCkpICkKKyAgICAgICAgICAgICAgRHIoaXQucm93KCkpID0gYWJzKGl0LnZhbHVlKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIERjKGl0LmNvbCgpKSA8IGFicyhpdC52YWx1ZSgpKSApCisgICAgICAgICAgICAgIERjKGl0LmNvbCgpKSA9IGFicyhpdC52YWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIAorICAgICAgICB7CisgICAgICAgICAgRHIoaSkgPSBzdGQ6OnNxcnQoRHIoaSkpOworICAgICAgICAgIERjKGkpID0gc3RkOjpzcXJ0KERjKGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTYXZlIHRoZSBzY2FsaW5nIGZhY3RvcnMgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSAKKyAgICAgICAgeworICAgICAgICAgIG1fbGVmdChpKSAvPSBEcihpKTsKKyAgICAgICAgICBtX3JpZ2h0KGkpIC89IERjKGkpOworICAgICAgICB9CisgICAgICAgIC8vIFNjYWxlIHRoZSByb3dzIGFuZCB0aGUgY29sdW1ucyBvZiB0aGUgbWF0cml4CisgICAgICAgIERyUmVzLnNldFplcm8oKTsgRGNSZXMuc2V0WmVybygpOyAKKyAgICAgICAgZm9yIChpbnQgaz0wOyBrPG1fbWF0cml4Lm91dGVyU2l6ZSgpOyArK2spCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobV9tYXRyaXgsIGspOyBpdDsgKytpdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpdC52YWx1ZVJlZigpID0gaXQudmFsdWUoKS8oIERyKGl0LnJvdygpKSAqIERjKGl0LmNvbCgpKSApOworICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbm9ybXMgb2YgdGhlIHJvdyBhbmQgY29sdW1uIHZlY3RvcnMgICAKKyAgICAgICAgICAgIGlmICggRHJSZXMoaXQucm93KCkpIDwgYWJzKGl0LnZhbHVlKCkpICkKKyAgICAgICAgICAgICAgRHJSZXMoaXQucm93KCkpID0gYWJzKGl0LnZhbHVlKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIERjUmVzKGl0LmNvbCgpKSA8IGFicyhpdC52YWx1ZSgpKSApCisgICAgICAgICAgICAgIERjUmVzKGl0LmNvbCgpKSA9IGFicyhpdC52YWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gIAorICAgICAgICBEclJlcy5hcnJheSgpID0gKDEtRHJSZXMuYXJyYXkoKSkuYWJzKCk7CisgICAgICAgIEVwc1JvdyA9IERyUmVzLm1heENvZWZmKCk7CisgICAgICAgIERjUmVzLmFycmF5KCkgPSAoMS1EY1Jlcy5hcnJheSgpKS5hYnMoKTsKKyAgICAgICAgRXBzQ29sID0gRGNSZXMubWF4Q29lZmYoKTsKKyAgICAgICAgaXRzKys7CisgICAgICB9d2hpbGUgKCAoRXBzUm93ID5tX3RvbCB8fCBFcHNDb2wgPiBtX3RvbCkgJiYgKGl0cyA8IG1fbWF4aXRzKSApOworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisgICAgLyoqIENvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IHZlY3RvcnMgdG8gc2NhbGUgdGhlIHZlY3RvcnMKKyAgICAgKiB0aGUgaW5wdXQgbWF0cml4IGlzIHNjYWxlZCB3aXRoIHRoZSBjb21wdXRlZCB2ZWN0b3JzIGF0IG91dHB1dAorICAgICAqIAorICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgKi8KKyAgICB2b2lkIGNvbXB1dGVSZWYgKE1hdHJpeFR5cGUmIG1hdCkKKyAgICB7CisgICAgICBjb21wdXRlIChtYXQpOworICAgICAgbWF0ID0gbV9tYXRyaXg7CisgICAgfQorICAgIC8qKiBHZXQgdGhlIHZlY3RvciB0byBzY2FsZSB0aGUgcm93cyBvZiB0aGUgbWF0cml4IAorICAgICAqLworICAgIFZlY3RvclhkJiBMZWZ0U2NhbGluZygpCisgICAgeworICAgICAgcmV0dXJuIG1fbGVmdDsKKyAgICB9CisgICAgCisgICAgLyoqIEdldCB0aGUgdmVjdG9yIHRvIHNjYWxlIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXggCisgICAgICovCisgICAgVmVjdG9yWGQmIFJpZ2h0U2NhbGluZygpCisgICAgeworICAgICAgcmV0dXJuIG1fcmlnaHQ7CisgICAgfQorICAgIAorICAgIC8qKiBTZXQgdGhlIHRvbGVyYW5jZSBmb3IgdGhlIGNvbnZlcmdlbmNlIG9mIHRoZSBpdGVyYXRpdmUgc2NhbGluZyBhbGdvcml0aG0KKyAgICAgKi8KKyAgICB2b2lkIHNldFRvbGVyYW5jZShkb3VibGUgdG9sKQorICAgIHsKKyAgICAgIG1fdG9sID0gdG9sOyAKKyAgICB9CisgICAgICAKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV90b2wgPSAxZS0xMDsKKyAgICAgIG1fbWF4aXRzID0gNTsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBNYXRyaXhUeXBlIG1fbWF0cml4OworICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsgCisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7IAorICAgIFZlY3RvclhkIG1fbGVmdDsgLy8gTGVmdCBzY2FsaW5nIHZlY3RvcgorICAgIFZlY3RvclhkIG1fcmlnaHQ7IC8vIG1fcmlnaHQgc2NhbGluZyB2ZWN0b3IKKyAgICBkb3VibGUgbV90b2w7IAorICAgIGludCBtX21heGl0czsgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbGxvd2VkCit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvS3JvbmVja2VyUHJvZHVjdC9Lcm9uZWNrZXJUZW5zb3JQcm9kdWN0LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvS3JvbmVja2VyUHJvZHVjdC9Lcm9uZWNrZXJUZW5zb3JQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyZmE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Lcm9uZWNrZXJQcm9kdWN0L0tyb25lY2tlclRlbnNvclByb2R1Y3QuaApAQCAtMCwwICsxLDMwNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgS29samEgQnJpeCA8YnJpeEBpZ3BtLnJ3dGgtYWFjaGVuLmRlPgorLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgUGxhdGVuIDxhbmRpcGxhdGVuQGdteC5kZT4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBDaGVuLVBhbmcgSGUgPGpkaDhAbXM2My5oaW5ldC5uZXQ+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEtST05FQ0tFUl9URU5TT1JfUFJPRFVDVF9ICisjZGVmaW5lIEtST05FQ0tFUl9URU5TT1JfUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qIQorICogXGluZ3JvdXAgS3JvbmVja2VyUHJvZHVjdF9Nb2R1bGUKKyAqCisgKiBcYnJpZWYgVGhlIGJhc2UgY2xhc3Mgb2YgZGVuc2UgYW5kIHNwYXJzZSBLcm9uZWNrZXIgcHJvZHVjdC4KKyAqCisgKiBcdHBhcmFtIERlcml2ZWQgaXMgdGhlIGRlcml2ZWQgdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIEtyb25lY2tlclByb2R1Y3RCYXNlIDogcHVibGljIFJldHVybkJ5VmFsdWU8RGVyaXZlZD4KK3sKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD4gVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworCisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6TGhzIExoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6UmhzIFJoczsKKworICBwdWJsaWM6CisgICAgLyohIFxicmllZiBDb25zdHJ1Y3Rvci4gKi8KKyAgICBLcm9uZWNrZXJQcm9kdWN0QmFzZShjb25zdCBMaHMmIEEsIGNvbnN0IFJocyYgQikKKyAgICAgIDogbV9BKEEpLCBtX0IoQikKKyAgICB7fQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX0Eucm93cygpICogbV9CLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9BLmNvbHMoKSAqIG1fQi5jb2xzKCk7IH0KKworICAgIC8qIQorICAgICAqIFRoaXMgb3ZlcnJpZGVzIFJldHVybkJ5VmFsdWU6OmNvZWZmIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcworICAgICAqIGVmZmljaWVudCBlbm91Z2guCisgICAgICovCisgICAgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX0EuY29lZmYocm93IC8gbV9CLnJvd3MoKSwgY29sIC8gbV9CLmNvbHMoKSkgKgorICAgICAgICAgICAgIG1fQi5jb2VmZihyb3cgJSBtX0Iucm93cygpLCBjb2wgJSBtX0IuY29scygpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICAgKiBUaGlzIG92ZXJyaWRlcyBSZXR1cm5CeVZhbHVlOjpjb2VmZiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMKKyAgICAgKiBlZmZpY2llbnQgZW5vdWdoLgorICAgICAqLworICAgIFNjYWxhciBjb2VmZihJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCk7CisgICAgICByZXR1cm4gbV9BLmNvZWZmKGkgLyBtX0Euc2l6ZSgpKSAqIG1fQi5jb2VmZihpICUgbV9BLnNpemUoKSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBMaHM6Ok5lc3RlZCBtX0E7CisgICAgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgbV9COworfTsKKworLyohCisgKiBcaW5ncm91cCBLcm9uZWNrZXJQcm9kdWN0X01vZHVsZQorICoKKyAqIFxicmllZiBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3QgaGVscGVyIGNsYXNzIGZvciBkZW5zZSBtYXRyaWNlcworICoKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiBrcm9uZWNrZXJQcm9kdWN0KE1hdHJpeEJhc2UsCisgKiBNYXRyaXhCYXNlKS4gVXNlIHRoZSBmdW5jdGlvbiByYXRoZXIgdGhhbiBjb25zdHJ1Y3QgdGhpcyBjbGFzcworICogZGlyZWN0bHkgdG8gYXZvaWQgc3BlY2lmeWluZyB0ZW1wbGF0ZSBwcmFyYW1ldGVycy4KKyAqCisgKiBcdHBhcmFtIExocyAgVHlwZSBvZiB0aGUgbGVmdC1oYW5kIHNpZGUsIGEgbWF0cml4IGV4cHJlc3Npb24uCisgKiBcdHBhcmFtIFJocyAgVHlwZSBvZiB0aGUgcmlnbnQtaGFuZCBzaWRlLCBhIG1hdHJpeCBleHByZXNzaW9uLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2NsYXNzIEtyb25lY2tlclByb2R1Y3QgOiBwdWJsaWMgS3JvbmVja2VyUHJvZHVjdEJhc2U8S3JvbmVja2VyUHJvZHVjdDxMaHMsUmhzPiA+Cit7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBLcm9uZWNrZXJQcm9kdWN0QmFzZTxLcm9uZWNrZXJQcm9kdWN0PiBCYXNlOworICAgIHVzaW5nIEJhc2U6Om1fQTsKKyAgICB1c2luZyBCYXNlOjptX0I7CisKKyAgcHVibGljOgorICAgIC8qISBcYnJpZWYgQ29uc3RydWN0b3IuICovCisgICAgS3JvbmVja2VyUHJvZHVjdChjb25zdCBMaHMmIEEsIGNvbnN0IFJocyYgQikKKyAgICAgIDogQmFzZShBLCBCKQorICAgIHt9CisKKyAgICAvKiEgXGJyaWVmIEV2YWx1YXRlIHRoZSBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3QuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdDsKK307CisKKy8qIQorICogXGluZ3JvdXAgS3JvbmVja2VyUHJvZHVjdF9Nb2R1bGUKKyAqCisgKiBcYnJpZWYgS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0IGhlbHBlciBjbGFzcyBmb3Igc3BhcnNlIG1hdHJpY2VzCisgKgorICogSWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhIHNwYXJzZSBtYXRyaXggZXhwcmVzc2lvbiwKKyAqIHRoZW4gdGhpcyBjbGFzcyBpcyByZXR1cm5lZCBhbmQgZXZhbHVhdGVzIGludG8gYSBzcGFyc2UgbWF0cml4LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiBrcm9uZWNrZXJQcm9kdWN0KEVpZ2VuQmFzZSwKKyAqIEVpZ2VuQmFzZSkuIFVzZSB0aGUgZnVuY3Rpb24gcmF0aGVyIHRoYW4gY29uc3RydWN0IHRoaXMgY2xhc3MKKyAqIGRpcmVjdGx5IHRvIGF2b2lkIHNwZWNpZnlpbmcgdGVtcGxhdGUgcHJhcmFtZXRlcnMuCisgKgorICogXHRwYXJhbSBMaHMgIFR5cGUgb2YgdGhlIGxlZnQtaGFuZCBzaWRlLCBhIG1hdHJpeCBleHByZXNzaW9uLgorICogXHRwYXJhbSBSaHMgIFR5cGUgb2YgdGhlIHJpZ250LWhhbmQgc2lkZSwgYSBtYXRyaXggZXhwcmVzc2lvbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBLcm9uZWNrZXJQcm9kdWN0U3BhcnNlIDogcHVibGljIEtyb25lY2tlclByb2R1Y3RCYXNlPEtyb25lY2tlclByb2R1Y3RTcGFyc2U8TGhzLFJocz4gPgoreworICBwcml2YXRlOgorICAgIHR5cGVkZWYgS3JvbmVja2VyUHJvZHVjdEJhc2U8S3JvbmVja2VyUHJvZHVjdFNwYXJzZT4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX0E7CisgICAgdXNpbmcgQmFzZTo6bV9COworCisgIHB1YmxpYzoKKyAgICAvKiEgXGJyaWVmIENvbnN0cnVjdG9yLiAqLworICAgIEtyb25lY2tlclByb2R1Y3RTcGFyc2UoY29uc3QgTGhzJiBBLCBjb25zdCBSaHMmIEIpCisgICAgICA6IEJhc2UoQSwgQikKKyAgICB7fQorCisgICAgLyohIFxicmllZiBFdmFsdWF0ZSB0aGUgS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0LiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlc3Q+Cit2b2lkIEtyb25lY2tlclByb2R1Y3Q8TGhzLFJocz46OmV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0Cit7CisgIGNvbnN0IGludCBCbG9ja1Jvd3MgPSBSaHM6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgQmxvY2tDb2xzID0gUmhzOjpDb2xzQXRDb21waWxlVGltZTsKKyAgY29uc3QgSW5kZXggQnIgPSBtX0Iucm93cygpLAorICAgICAgICAgICAgICBCYyA9IG1fQi5jb2xzKCk7CisgIGZvciAoSW5kZXggaT0wOyBpIDwgbV9BLnJvd3MoKTsgKytpKQorICAgIGZvciAoSW5kZXggaj0wOyBqIDwgbV9BLmNvbHMoKTsgKytqKQorICAgICAgQmxvY2s8RGVzdCxCbG9ja1Jvd3MsQmxvY2tDb2xzPihkc3QsaSpCcixqKkJjLEJyLEJjKSA9IG1fQS5jb2VmZihpLGopICogbV9COworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlc3Q+Cit2b2lkIEtyb25lY2tlclByb2R1Y3RTcGFyc2U8TGhzLFJocz46OmV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0Cit7CisgIEluZGV4IEJyID0gbV9CLnJvd3MoKSwgQmMgPSBtX0IuY29scygpOworICBkc3QucmVzaXplKHRoaXMtPnJvd3MoKSwgdGhpcy0+Y29scygpKTsKKyAgZHN0LnJlc2l6ZU5vblplcm9zKDApOworICAKKyAgLy8gMSAtIGV2YWx1YXRlIHRoZSBvcGVyYW5kcyBpZiBuZWVkZWQ6CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPExocyxEeW5hbWljPjo6dHlwZSBMaHMxOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoczE+Ojp0eXBlIExoczFDbGVhbmVkOworICBjb25zdCBMaHMxIGxoczEobV9BKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8UmhzLER5bmFtaWM+Ojp0eXBlIFJoczE7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmhzMT46OnR5cGUgUmhzMUNsZWFuZWQ7CisgIGNvbnN0IFJoczEgcmhzMShtX0IpOworICAgIAorICAvLyAyIC0gY29uc3RydWN0IHJlc3BlY3RpdmUgaXRlcmF0b3JzCisgIHR5cGVkZWYgRWlnZW46OklubmVySXRlcmF0b3I8TGhzMUNsZWFuZWQ+IExoc0lubmVySXRlcmF0b3I7CisgIHR5cGVkZWYgRWlnZW46OklubmVySXRlcmF0b3I8UmhzMUNsZWFuZWQ+IFJoc0lubmVySXRlcmF0b3I7CisgIAorICAvLyBjb21wdXRlIG51bWJlciBvZiBub24temVyb3MgcGVyIGlubmVydmVjdG9ycyBvZiBkc3QKKyAgeworICAgIC8vIFRPRE8gVmVjdG9yWGkgaXMgbm90IG5lY2Vzc2FyaWx5IGJpZyBlbm91Z2ghCisgICAgVmVjdG9yWGkgbm56QSA9IFZlY3RvclhpOjpaZXJvKERlc3Q6OklzUm93TWFqb3IgPyBtX0Eucm93cygpIDogbV9BLmNvbHMoKSk7CisgICAgZm9yIChJbmRleCBrQT0wOyBrQSA8IG1fQS5vdXRlclNpemUoKTsgKytrQSkKKyAgICAgIGZvciAoTGhzSW5uZXJJdGVyYXRvciBpdEEobGhzMSxrQSk7IGl0QTsgKytpdEEpCisgICAgICAgIG5uekEoRGVzdDo6SXNSb3dNYWpvciA/IGl0QS5yb3coKSA6IGl0QS5jb2woKSkrKzsKKyAgICAgIAorICAgIFZlY3RvclhpIG5uekIgPSBWZWN0b3JYaTo6WmVybyhEZXN0OjpJc1Jvd01ham9yID8gbV9CLnJvd3MoKSA6IG1fQi5jb2xzKCkpOworICAgIGZvciAoSW5kZXgga0I9MDsga0IgPCBtX0Iub3V0ZXJTaXplKCk7ICsra0IpCisgICAgICBmb3IgKFJoc0lubmVySXRlcmF0b3IgaXRCKHJoczEsa0IpOyBpdEI7ICsraXRCKQorICAgICAgICBubnpCKERlc3Q6OklzUm93TWFqb3IgPyBpdEIucm93KCkgOiBpdEIuY29sKCkpKys7CisgICAgCisgICAgTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IG5uekFCID0gbm56QiAqIG5uekEudHJhbnNwb3NlKCk7CisgICAgZHN0LnJlc2VydmUoVmVjdG9yWGk6Ok1hcChubnpBQi5kYXRhKCksIG5uekFCLnNpemUoKSkpOworICB9CisKKyAgZm9yIChJbmRleCBrQT0wOyBrQSA8IG1fQS5vdXRlclNpemUoKTsgKytrQSkKKyAgeworICAgIGZvciAoSW5kZXgga0I9MDsga0IgPCBtX0Iub3V0ZXJTaXplKCk7ICsra0IpCisgICAgeworICAgICAgZm9yIChMaHNJbm5lckl0ZXJhdG9yIGl0QShsaHMxLGtBKTsgaXRBOyArK2l0QSkKKyAgICAgIHsKKyAgICAgICAgZm9yIChSaHNJbm5lckl0ZXJhdG9yIGl0QihyaHMxLGtCKTsgaXRCOyArK2l0QikKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGkgPSBpdEEucm93KCkgKiBCciArIGl0Qi5yb3coKSwKKyAgICAgICAgICAgICAgICBqID0gaXRBLmNvbCgpICogQmMgKyBpdEIuY29sKCk7CisgICAgICAgICAgZHN0Lmluc2VydChpLGopID0gaXRBLnZhbHVlKCkgKiBpdEIudmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzLCB0eXBlbmFtZSBfUmhzPgorc3RydWN0IHRyYWl0czxLcm9uZWNrZXJQcm9kdWN0PF9MaHMsX1Jocz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8X0xocz46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8X1Jocz46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPHR5cGVuYW1lIExoczo6U2NhbGFyLCB0eXBlbmFtZSBSaHM6OlNjYWxhcj46OlJldHVyblR5cGUgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTx0eXBlbmFtZSBMaHM6OlN0b3JhZ2VJbmRleCwgdHlwZW5hbWUgUmhzOjpTdG9yYWdlSW5kZXg+Ojp0eXBlIFN0b3JhZ2VJbmRleDsKKworICBlbnVtIHsKKyAgICBSb3dzID0gc2l6ZV9hdF9jb21waWxlX3RpbWU8dHJhaXRzPExocz46OlJvd3NBdENvbXBpbGVUaW1lLCB0cmFpdHM8UmhzPjo6Um93c0F0Q29tcGlsZVRpbWU+OjpyZXQsCisgICAgQ29scyA9IHNpemVfYXRfY29tcGlsZV90aW1lPHRyYWl0czxMaHM+OjpDb2xzQXRDb21waWxlVGltZSwgdHJhaXRzPFJocz46OkNvbHNBdENvbXBpbGVUaW1lPjo6cmV0LAorICAgIE1heFJvd3MgPSBzaXplX2F0X2NvbXBpbGVfdGltZTx0cmFpdHM8TGhzPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIHRyYWl0czxSaHM+OjpNYXhSb3dzQXRDb21waWxlVGltZT46OnJldCwKKyAgICBNYXhDb2xzID0gc2l6ZV9hdF9jb21waWxlX3RpbWU8dHJhaXRzPExocz46Ok1heENvbHNBdENvbXBpbGVUaW1lLCB0cmFpdHM8UmhzPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0xocywgdHlwZW5hbWUgX1Jocz4KK3N0cnVjdCB0cmFpdHM8S3JvbmVja2VyUHJvZHVjdFNwYXJzZTxfTGhzLF9SaHM+ID4KK3sKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPF9MaHM+Ojp0eXBlIExoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPF9SaHM+Ojp0eXBlIFJoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJCaW5hcnlPcFRyYWl0czx0eXBlbmFtZSBMaHM6OlNjYWxhciwgdHlwZW5hbWUgUmhzOjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjd2lzZV9wcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpTdG9yYWdlS2luZCwgc2NhbGFyX3Byb2R1Y3Rfb3A8dHlwZW5hbWUgTGhzOjpTY2FsYXIsIHR5cGVuYW1lIFJoczo6U2NhbGFyPiA+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIExoczo6U3RvcmFnZUluZGV4LCB0eXBlbmFtZSBSaHM6OlN0b3JhZ2VJbmRleD46OnR5cGUgU3RvcmFnZUluZGV4OworCisgIGVudW0geworICAgIExoc0ZsYWdzID0gTGhzOjpGbGFncywKKyAgICBSaHNGbGFncyA9IFJoczo6RmxhZ3MsCisKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IHNpemVfYXRfY29tcGlsZV90aW1lPHRyYWl0czxMaHM+OjpSb3dzQXRDb21waWxlVGltZSwgdHJhaXRzPFJocz46OlJvd3NBdENvbXBpbGVUaW1lPjo6cmV0LAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gc2l6ZV9hdF9jb21waWxlX3RpbWU8dHJhaXRzPExocz46OkNvbHNBdENvbXBpbGVUaW1lLCB0cmFpdHM8UmhzPjo6Q29sc0F0Q29tcGlsZVRpbWU+OjpyZXQsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBzaXplX2F0X2NvbXBpbGVfdGltZTx0cmFpdHM8TGhzPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIHRyYWl0czxSaHM+OjpNYXhSb3dzQXRDb21waWxlVGltZT46OnJldCwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IHNpemVfYXRfY29tcGlsZV90aW1lPHRyYWl0czxMaHM+OjpNYXhDb2xzQXRDb21waWxlVGltZSwgdHJhaXRzPFJocz46Ok1heENvbHNBdENvbXBpbGVUaW1lPjo6cmV0LAorCisgICAgRXZhbFRvUm93TWFqb3IgPSAoTGhzRmxhZ3MgJiBSaHNGbGFncyAmIFJvd01ham9yQml0KSwKKyAgICBSZW1vdmVkQml0cyA9IH4oRXZhbFRvUm93TWFqb3IgPyAwIDogUm93TWFqb3JCaXQpLAorCisgICAgRmxhZ3MgPSAoKExoc0ZsYWdzIHwgUmhzRmxhZ3MpICYgSGVyZWRpdGFyeUJpdHMgJiBSZW1vdmVkQml0cykKKyAgICAgICAgICB8IEV2YWxCZWZvcmVOZXN0aW5nQml0LAorICAgIENvZWZmUmVhZENvc3QgPSBIdWdlQ29zdAorICB9OworCisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgMCwgU3RvcmFnZUluZGV4PiBSZXR1cm5UeXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qIQorICogXGluZ3JvdXAgS3JvbmVja2VyUHJvZHVjdF9Nb2R1bGUKKyAqCisgKiBDb21wdXRlcyBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgdHdvIGRlbnNlIG1hdHJpY2VzCisgKgorICogXHdhcm5pbmcgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhIG1hdHJpeCBieSBpdHMgS3JvbmVja2VyIHByb2R1Y3QKKyAqICAgICAgICAgIHdpdGggc29tZSBtYXRyaXgsIGRvIFxiIE5PVCBkbyB0aGlzOgorICogXGNvZGUKKyAqIEEgPSBrcm9uZWNrZXJQcm9kdWN0KEEsQik7IC8vIGJ1ZyEhISBjYXVzZWQgYnkgYWxpYXNpbmcgZWZmZWN0CisgKiBcZW5kY29kZQorICogaW5zdGVhZCwgdXNlIGV2YWwoKSB0byB3b3JrIGFyb3VuZCB0aGlzOgorICogXGNvZGUKKyAqIEEgPSBrcm9uZWNrZXJQcm9kdWN0KEEsQikuZXZhbCgpOworICogXGVuZGNvZGUKKyAqCisgKiBccGFyYW0gYSAgRGVuc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBEZW5zZSBtYXRyaXggYgorICogXHJldHVybiAgIEtyb25lY2tlciB0ZW5zb3IgcHJvZHVjdCBvZiBhIGFuZCBiCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CitLcm9uZWNrZXJQcm9kdWN0PEEsQj4ga3JvbmVja2VyUHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPEE+JiBhLCBjb25zdCBNYXRyaXhCYXNlPEI+JiBiKQoreworICByZXR1cm4gS3JvbmVja2VyUHJvZHVjdDxBLCBCPihhLmRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworfQorCisvKiEKKyAqIFxpbmdyb3VwIEtyb25lY2tlclByb2R1Y3RfTW9kdWxlCisgKgorICogQ29tcHV0ZXMgS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0IG9mIHR3byBtYXRyaWNlcywgYXQgbGVhc3Qgb25lIG9mCisgKiB3aGljaCBpcyBzcGFyc2UKKyAqCisgKiBcd2FybmluZyBJZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgbWF0cml4IGJ5IGl0cyBLcm9uZWNrZXIgcHJvZHVjdAorICogICAgICAgICAgd2l0aCBzb21lIG1hdHJpeCwgZG8gXGIgTk9UIGRvIHRoaXM6CisgKiBcY29kZQorICogQSA9IGtyb25lY2tlclByb2R1Y3QoQSxCKTsgLy8gYnVnISEhIGNhdXNlZCBieSBhbGlhc2luZyBlZmZlY3QKKyAqIFxlbmRjb2RlCisgKiBpbnN0ZWFkLCB1c2UgZXZhbCgpIHRvIHdvcmsgYXJvdW5kIHRoaXM6CisgKiBcY29kZQorICogQSA9IGtyb25lY2tlclByb2R1Y3QoQSxCKS5ldmFsKCk7CisgKiBcZW5kY29kZQorICoKKyAqIFxwYXJhbSBhICBEZW5zZS9zcGFyc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBEZW5zZS9zcGFyc2UgbWF0cml4IGIKKyAqIFxyZXR1cm4gICBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgYSBhbmQgYiwgc3RvcmVkIGluIGEgc3BhcnNlCisgKiAgICAgICAgICAgbWF0cml4CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CitLcm9uZWNrZXJQcm9kdWN0U3BhcnNlPEEsQj4ga3JvbmVja2VyUHJvZHVjdChjb25zdCBFaWdlbkJhc2U8QT4mIGEsIGNvbnN0IEVpZ2VuQmFzZTxCPiYgYikKK3sKKyAgcmV0dXJuIEtyb25lY2tlclByb2R1Y3RTcGFyc2U8QSxCPihhLmRlcml2ZWQoKSwgYi5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEtST05FQ0tFUl9URU5TT1JfUFJPRFVDVF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0NvcHlyaWdodE1JTlBBQ0sudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9Db3B5cmlnaHRNSU5QQUNLLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTc5ODRkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9Db3B5cmlnaHRNSU5QQUNLLnR4dApAQCAtMCwwICsxLDUyIEBACitNaW5wYWNrIENvcHlyaWdodCBOb3RpY2UgKDE5OTkpIFVuaXZlcnNpdHkgb2YgQ2hpY2Fnby4gIEFsbCByaWdodHMgcmVzZXJ2ZWQKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgord2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKK2ZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCitkaXNjbGFpbWVyLgorCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKzMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlCityZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZworYWNrbm93bGVkZ21lbnQ6CisKKyAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICAgVW5pdmVyc2l0eSBvZiBDaGljYWdvLCBhcyBPcGVyYXRvciBvZiBBcmdvbm5lIE5hdGlvbmFsCisgICBMYWJvcmF0b3J5LgorCitBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZQoraXRzZWxmLCBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMKK25vcm1hbGx5IGFwcGVhci4KKworNC4gV0FSUkFOVFkgRElTQ0xBSU1FUi4gVEhFIFNPRlRXQVJFIElTIFNVUFBMSUVEICJBUyBJUyIKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIFRIRSBDT1BZUklHSFQgSE9MREVSLCBUSEUKK1VOSVRFRCBTVEFURVMsIFRIRSBVTklURUQgU1RBVEVTIERFUEFSVE1FTlQgT0YgRU5FUkdZLCBBTkQKK1RIRUlSIEVNUExPWUVFUzogKDEpIERJU0NMQUlNIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFCitPUiBOT04tSU5GUklOR0VNRU5ULCAoMikgRE8gTk9UIEFTU1VNRSBBTlkgTEVHQUwgTElBQklMSVRZCitPUiBSRVNQT05TSUJJTElUWSBGT1IgVEhFIEFDQ1VSQUNZLCBDT01QTEVURU5FU1MsIE9SCitVU0VGVUxORVNTIE9GIFRIRSBTT0ZUV0FSRSwgKDMpIERPIE5PVCBSRVBSRVNFTlQgVEhBVCBVU0UgT0YKK1RIRSBTT0ZUV0FSRSBXT1VMRCBOT1QgSU5GUklOR0UgUFJJVkFURUxZIE9XTkVEIFJJR0hUUywgKDQpCitETyBOT1QgV0FSUkFOVCBUSEFUIFRIRSBTT0ZUV0FSRSBXSUxMIEZVTkNUSU9OCitVTklOVEVSUlVQVEVELCBUSEFUIElUIElTIEVSUk9SLUZSRUUgT1IgVEhBVCBBTlkgRVJST1JTIFdJTEwKK0JFIENPUlJFQ1RFRC4KKworNS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuIElOIE5PIEVWRU5UIFdJTEwgVEhFIENPUFlSSUdIVAorSE9MREVSLCBUSEUgVU5JVEVEIFNUQVRFUywgVEhFIFVOSVRFRCBTVEFURVMgREVQQVJUTUVOVCBPRgorRU5FUkdZLCBPUiBUSEVJUiBFTVBMT1lFRVM6IEJFIExJQUJMRSBGT1IgQU5ZIElORElSRUNULAorSU5DSURFTlRBTCwgQ09OU0VRVUVOVElBTCwgU1BFQ0lBTCBPUiBQVU5JVElWRSBEQU1BR0VTIE9GCitBTlkgS0lORCBPUiBOQVRVUkUsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorUFJPRklUUyBPUiBMT1NTIE9GIERBVEEsIEZPUiBBTlkgUkVBU09OIFdIQVRTT0VWRVIsIFdIRVRIRVIKK1NVQ0ggTElBQklMSVRZIElTIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIFNUUklDVCBMSUFCSUxJVFkpLCBPUiBPVEhFUldJU0UsCitFVkVOIElGIEFOWSBPRiBTQUlEIFBBUlRJRVMgSEFTIEJFRU4gV0FSTkVEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBMT1NTIE9SIERBTUFHRVMuCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTE1jb3Zhci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTWNvdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1YmVhMgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTE1jb3Zhci5oCkBAIC0wLDAgKzEsODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gVGhpcyBjb2RlIGluaXRpYWxseSBjb21lcyBmcm9tIE1JTlBBQ0sgd2hvc2Ugb3JpZ2luYWwgYXV0aG9ycyBhcmU6CisvLyBDb3B5cmlnaHQgSm9yZ2UgTW9yZSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8gQ29weXJpZ2h0IEJ1cnQgR2FyYm93IC0gQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5CisvLyBDb3B5cmlnaHQgS2VuIEhpbGxzdHJvbSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTWlucGFjayBsaWNlbnNlCisvLyAoYSBCU0QtbGlrZSBsaWNlbnNlKSBkZXNjcmliZWQgaW4gdGhlIGNhbXBhaWduZWQgQ29weXJpZ2h0TUlOUEFDSy50eHQgZmlsZS4KKworI2lmbmRlZiBFSUdFTl9MTUNPVkFSX0gKKyNkZWZpbmUgRUlHRU5fTE1DT1ZBUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjb3ZhcigKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiAmciwKKyAgICAgICAgY29uc3QgVmVjdG9yWGkmIGlwdnQsCisgICAgICAgIFNjYWxhciB0b2wgPSBzdGQ6OnNxcnQoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkgKQoreworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGosIGssIGwsIGlpLCBqajsKKyAgICBib29sIHNpbmc7CisgICAgU2NhbGFyIHRlbXA7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgY29uc3QgSW5kZXggbiA9IHIuY29scygpOworICAgIGNvbnN0IFNjYWxhciB0b2xyID0gdG9sICogYWJzKHIoMCwwKSk7CisgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiB3YShuKTsKKyAgICBlaWdlbl9hc3NlcnQoaXB2dC5zaXplKCk9PW4pOworCisgICAgLyogZm9ybSB0aGUgaW52ZXJzZSBvZiByIGluIHRoZSBmdWxsIHVwcGVyIHRyaWFuZ2xlIG9mIHIuICovCisgICAgbCA9IC0xOworICAgIGZvciAoayA9IDA7IGsgPCBuOyArK2spCisgICAgICAgIGlmIChhYnMocihrLGspKSA+IHRvbHIpIHsKKyAgICAgICAgICAgIHIoayxrKSA9IDEuIC8gcihrLGspOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBrLTE7ICsraikgeworICAgICAgICAgICAgICAgIHRlbXAgPSByKGssaykgKiByKGosayk7CisgICAgICAgICAgICAgICAgcihqLGspID0gMC47CisgICAgICAgICAgICAgICAgci5jb2woaykuaGVhZChqKzEpIC09IHIuY29sKGopLmhlYWQoaisxKSAqIHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsID0gazsKKyAgICAgICAgfQorCisgICAgLyogZm9ybSB0aGUgZnVsbCB1cHBlciB0cmlhbmdsZSBvZiB0aGUgaW52ZXJzZSBvZiAociB0cmFuc3Bvc2UpKnIgKi8KKyAgICAvKiBpbiB0aGUgZnVsbCB1cHBlciB0cmlhbmdsZSBvZiByLiAqLworICAgIGZvciAoayA9IDA7IGsgPD0gbDsgKytrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gay0xOyArK2opCisgICAgICAgICAgICByLmNvbChqKS5oZWFkKGorMSkgKz0gci5jb2woaykuaGVhZChqKzEpICogcihqLGspOworICAgICAgICByLmNvbChrKS5oZWFkKGsrMSkgKj0gcihrLGspOworICAgIH0KKworICAgIC8qIGZvcm0gdGhlIGZ1bGwgbG93ZXIgdHJpYW5nbGUgb2YgdGhlIGNvdmFyaWFuY2UgbWF0cml4ICovCisgICAgLyogaW4gdGhlIHN0cmljdCBsb3dlciB0cmlhbmdsZSBvZiByIGFuZCBpbiB3YS4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGpqID0gaXB2dFtqXTsKKyAgICAgICAgc2luZyA9IGogPiBsOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7ICsraSkgeworICAgICAgICAgICAgaWYgKHNpbmcpCisgICAgICAgICAgICAgICAgcihpLGopID0gMC47CisgICAgICAgICAgICBpaSA9IGlwdnRbaV07CisgICAgICAgICAgICBpZiAoaWkgPiBqaikKKyAgICAgICAgICAgICAgICByKGlpLGpqKSA9IHIoaSxqKTsKKyAgICAgICAgICAgIGlmIChpaSA8IGpqKQorICAgICAgICAgICAgICAgIHIoamosaWkpID0gcihpLGopOworICAgICAgICB9CisgICAgICAgIHdhW2pqXSA9IHIoaixqKTsKKyAgICB9CisKKyAgICAvKiBzeW1tZXRyaXplIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBpbiByLiAqLworICAgIHIudG9wTGVmdENvcm5lcihuLG4pLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkgPSByLnRvcExlZnRDb3JuZXIobixuKS50cmFuc3Bvc2UoKTsKKyAgICByLmRpYWdvbmFsKCkgPSB3YTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTE1DT1ZBUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0xNb25lc3RlcC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTW9uZXN0ZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWIzMmVjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTW9uZXN0ZXAuaApAQCAtMCwwICsxLDIwMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKy8vCisvLyBUaGlzIGNvZGUgaW5pdGlhbGx5IGNvbWVzIGZyb20gTUlOUEFDSyB3aG9zZSBvcmlnaW5hbCBhdXRob3JzIGFyZToKKy8vIENvcHlyaWdodCBKb3JnZSBNb3JlIC0gQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5CisvLyBDb3B5cmlnaHQgQnVydCBHYXJib3cgLSBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkKKy8vIENvcHlyaWdodCBLZW4gSGlsbHN0cm9tIC0gQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNaW5wYWNrIGxpY2Vuc2UKKy8vIChhIEJTRC1saWtlIGxpY2Vuc2UpIGRlc2NyaWJlZCBpbiB0aGUgY2FtcGFpZ25lZCBDb3B5cmlnaHRNSU5QQUNLLnR4dCBmaWxlLgorCisjaWZuZGVmIEVJR0VOX0xNT05FU1RFUF9ICisjZGVmaW5lIEVJR0VOX0xNT05FU1RFUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlPjo6bWluaW1pemVPbmVTdGVwKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgUmVhbFNjYWxhciB0ZW1wLCB0ZW1wMSx0ZW1wMjsgCisgIFJlYWxTY2FsYXIgcmF0aW87IAorICBSZWFsU2NhbGFyIHBub3JtLCB4bm9ybSwgZm5vcm0xLCBhY3RyZWQsIGRpcmRlciwgcHJlcmVkOworICBlaWdlbl9hc3NlcnQoeC5zaXplKCk9PW4pOyAvLyBjaGVjayB0aGUgY2FsbGVyIGlzIG5vdCBjaGVhdGluZyB1cworCisgIHRlbXAgPSAwLjA7IHhub3JtID0gMC4wOworICAvKiBjYWxjdWxhdGUgdGhlIGphY29iaWFuIG1hdHJpeC4gKi8KKyAgSW5kZXggZGZfcmV0ID0gbV9mdW5jdG9yLmRmKHgsIG1fZmphYyk7CisgIGlmIChkZl9yZXQ8MCkKKyAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VXNlckFza2VkOworICBpZiAoZGZfcmV0PjApCisgICAgICAvLyBudW1lcmljYWwgZGlmZiwgd2UgZXZhbHVhdGVkIHRoZSBmdW5jdGlvbiBkZl9yZXQgdGltZXMKKyAgICAgIG1fbmZldiArPSBkZl9yZXQ7CisgIGVsc2UgbV9uamV2Kys7CisKKyAgLyogY29tcHV0ZSB0aGUgcXIgZmFjdG9yaXphdGlvbiBvZiB0aGUgamFjb2JpYW4uICovCisgIGZvciAoaW50IGogPSAwOyBqIDwgeC5zaXplKCk7ICsraikKKyAgICBtX3dhMihqKSA9IG1fZmphYy5jb2woaikuYmx1ZU5vcm0oKTsKKyAgUVJTb2x2ZXIgcXJmYWMobV9mamFjKTsKKyAgaWYocXJmYWMuaW5mbygpICE9IFN1Y2Nlc3MpIHsKKyAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworICB9CisgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBmaXJzdCBmYWN0b3Igd2l0aCB0aGUgYXNzb2NpYXRlZCBwZXJtdXRhdGlvbgorICBtX3JmYWN0b3IgPSBxcmZhYy5tYXRyaXhSKCk7CisgIG1fcGVybXV0YXRpb24gPSAocXJmYWMuY29sc1Blcm11dGF0aW9uKCkpOworCisgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIGlmIGV4dGVybmFsIHNjYWxpbmcgaXMgbm90IHVzZWQsIHNjYWxlIGFjY29yZGluZyAqLworICAvKiB0byB0aGUgbm9ybXMgb2YgdGhlIGNvbHVtbnMgb2YgdGhlIGluaXRpYWwgamFjb2JpYW4uICovCisgIGlmIChtX2l0ZXIgPT0gMSkgeworICAgICAgaWYgKCFtX3VzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgICBtX2RpYWdbal0gPSAobV93YTJbal09PTAuKT8gMS4gOiBtX3dhMltqXTsKKworICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgeCAqLworICAgICAgLyogYW5kIGluaXRpYWxpemUgdGhlIHN0ZXAgYm91bmQgbV9kZWx0YS4gKi8KKyAgICAgIHhub3JtID0gbV9kaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgICBtX2RlbHRhID0gbV9mYWN0b3IgKiB4bm9ybTsKKyAgICAgIGlmIChtX2RlbHRhID09IDAuKQorICAgICAgICAgIG1fZGVsdGEgPSBtX2ZhY3RvcjsKKyAgfQorCisgIC8qIGZvcm0gKHEgdHJhbnNwb3NlKSptX2Z2ZWMgYW5kIHN0b3JlIHRoZSBmaXJzdCBuIGNvbXBvbmVudHMgaW4gKi8KKyAgLyogbV9xdGYuICovCisgIG1fd2E0ID0gbV9mdmVjOworICBtX3dhNCA9IHFyZmFjLm1hdHJpeFEoKS5hZGpvaW50KCkgKiBtX2Z2ZWM7IAorICBtX3F0ZiA9IG1fd2E0LmhlYWQobik7CisKKyAgLyogY29tcHV0ZSB0aGUgbm9ybSBvZiB0aGUgc2NhbGVkIGdyYWRpZW50LiAqLworICBtX2dub3JtID0gMC47CisgIGlmIChtX2Zub3JtICE9IDAuKQorICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICBpZiAobV93YTJbbV9wZXJtdXRhdGlvbi5pbmRpY2VzKClbal1dICE9IDAuKQorICAgICAgICAgICAgICBtX2dub3JtID0gKHN0ZDo6bWF4KShtX2dub3JtLCBhYnMoIG1fcmZhY3Rvci5jb2woaikuaGVhZChqKzEpLmRvdChtX3F0Zi5oZWFkKGorMSkvbV9mbm9ybSkgLyBtX3dhMlttX3Blcm11dGF0aW9uLmluZGljZXMoKVtqXV0pKTsKKworICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZSBvZiB0aGUgZ3JhZGllbnQgbm9ybS4gKi8KKyAgaWYgKG1fZ25vcm0gPD0gbV9ndG9sKSB7CisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkNvc2ludXNUb29TbWFsbDsKKyAgfQorCisgIC8qIHJlc2NhbGUgaWYgbmVjZXNzYXJ5LiAqLworICBpZiAoIW1fdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgbV9kaWFnID0gbV9kaWFnLmN3aXNlTWF4KG1fd2EyKTsKKworICBkbyB7CisgICAgLyogZGV0ZXJtaW5lIHRoZSBsZXZlbmJlcmctbWFycXVhcmR0IHBhcmFtZXRlci4gKi8KKyAgICBpbnRlcm5hbDo6bG1wYXIyKHFyZmFjLCBtX2RpYWcsIG1fcXRmLCBtX2RlbHRhLCBtX3BhciwgbV93YTEpOworCisgICAgLyogc3RvcmUgdGhlIGRpcmVjdGlvbiBwIGFuZCB4ICsgcC4gY2FsY3VsYXRlIHRoZSBub3JtIG9mIHAuICovCisgICAgbV93YTEgPSAtbV93YTE7CisgICAgbV93YTIgPSB4ICsgbV93YTE7CisgICAgcG5vcm0gPSBtX2RpYWcuY3dpc2VQcm9kdWN0KG1fd2ExKS5zdGFibGVOb3JtKCk7CisKKyAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhZGp1c3QgdGhlIGluaXRpYWwgc3RlcCBib3VuZC4gKi8KKyAgICBpZiAobV9pdGVyID09IDEpCisgICAgICAgIG1fZGVsdGEgPSAoc3RkOjptaW4pKG1fZGVsdGEscG5vcm0pOworCisgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHggKyBwIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgaWYgKCBtX2Z1bmN0b3IobV93YTIsIG1fd2E0KSA8IDApCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VXNlckFza2VkOworICAgICsrbV9uZmV2OworICAgIGZub3JtMSA9IG1fd2E0LnN0YWJsZU5vcm0oKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBhY3R1YWwgcmVkdWN0aW9uLiAqLworICAgIGFjdHJlZCA9IC0xLjsKKyAgICBpZiAoU2NhbGFyKC4xKSAqIGZub3JtMSA8IG1fZm5vcm0pCisgICAgICAgIGFjdHJlZCA9IDEuIC0gbnVtZXh0OjphYnMyKGZub3JtMSAvIG1fZm5vcm0pOworCisgICAgLyogY29tcHV0ZSB0aGUgc2NhbGVkIHByZWRpY3RlZCByZWR1Y3Rpb24gYW5kICovCisgICAgLyogdGhlIHNjYWxlZCBkaXJlY3Rpb25hbCBkZXJpdmF0aXZlLiAqLworICAgIG1fd2EzID0gbV9yZmFjdG9yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogKG1fcGVybXV0YXRpb24uaW52ZXJzZSgpICptX3dhMSk7CisgICAgdGVtcDEgPSBudW1leHQ6OmFiczIobV93YTMuc3RhYmxlTm9ybSgpIC8gbV9mbm9ybSk7CisgICAgdGVtcDIgPSBudW1leHQ6OmFiczIoc3FydChtX3BhcikgKiBwbm9ybSAvIG1fZm5vcm0pOworICAgIHByZXJlZCA9IHRlbXAxICsgdGVtcDIgLyBTY2FsYXIoLjUpOworICAgIGRpcmRlciA9IC0odGVtcDEgKyB0ZW1wMik7CisKKyAgICAvKiBjb21wdXRlIHRoZSByYXRpbyBvZiB0aGUgYWN0dWFsIHRvIHRoZSBwcmVkaWN0ZWQgKi8KKyAgICAvKiByZWR1Y3Rpb24uICovCisgICAgcmF0aW8gPSAwLjsKKyAgICBpZiAocHJlcmVkICE9IDAuKQorICAgICAgICByYXRpbyA9IGFjdHJlZCAvIHByZXJlZDsKKworICAgIC8qIHVwZGF0ZSB0aGUgc3RlcCBib3VuZC4gKi8KKyAgICBpZiAocmF0aW8gPD0gU2NhbGFyKC4yNSkpIHsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSAwLikKKyAgICAgICAgICAgIHRlbXAgPSBSZWFsU2NhbGFyKC41KTsKKyAgICAgICAgaWYgKGFjdHJlZCA8IDAuKQorICAgICAgICAgICAgdGVtcCA9IFJlYWxTY2FsYXIoLjUpICogZGlyZGVyIC8gKGRpcmRlciArIFJlYWxTY2FsYXIoLjUpICogYWN0cmVkKTsKKyAgICAgICAgaWYgKFJlYWxTY2FsYXIoLjEpICogZm5vcm0xID49IG1fZm5vcm0gfHwgdGVtcCA8IFJlYWxTY2FsYXIoLjEpKQorICAgICAgICAgICAgdGVtcCA9IFNjYWxhciguMSk7CisgICAgICAgIC8qIENvbXB1dGluZyBNSU4gKi8KKyAgICAgICAgbV9kZWx0YSA9IHRlbXAgKiAoc3RkOjptaW4pKG1fZGVsdGEsIHBub3JtIC8gUmVhbFNjYWxhciguMSkpOworICAgICAgICBtX3BhciAvPSB0ZW1wOworICAgIH0gZWxzZSBpZiAoIShtX3BhciAhPSAwLiAmJiByYXRpbyA8IFJlYWxTY2FsYXIoLjc1KSkpIHsKKyAgICAgICAgbV9kZWx0YSA9IHBub3JtIC8gUmVhbFNjYWxhciguNSk7CisgICAgICAgIG1fcGFyID0gUmVhbFNjYWxhciguNSkgKiBtX3BhcjsKKyAgICB9CisKKyAgICAvKiB0ZXN0IGZvciBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gKi8KKyAgICBpZiAocmF0aW8gPj0gUmVhbFNjYWxhcigxZS00KSkgeworICAgICAgICAvKiBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gdXBkYXRlIHgsIG1fZnZlYywgYW5kIHRoZWlyIG5vcm1zLiAqLworICAgICAgICB4ID0gbV93YTI7CisgICAgICAgIG1fd2EyID0gbV9kaWFnLmN3aXNlUHJvZHVjdCh4KTsKKyAgICAgICAgbV9mdmVjID0gbV93YTQ7CisgICAgICAgIHhub3JtID0gbV93YTIuc3RhYmxlTm9ybSgpOworICAgICAgICBtX2Zub3JtID0gZm5vcm0xOworICAgICAgICArK21faXRlcjsKKyAgICB9CisKKyAgICAvKiB0ZXN0cyBmb3IgY29udmVyZ2VuY2UuICovCisgICAgaWYgKGFicyhhY3RyZWQpIDw9IG1fZnRvbCAmJiBwcmVyZWQgPD0gbV9mdG9sICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLiAmJiBtX2RlbHRhIDw9IG1feHRvbCAqIHhub3JtKQorICAgIHsKKyAgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yQW5kUmVkdWN0aW9uVG9vU21hbGw7CisgICAgfQorICAgIGlmIChhYnMoYWN0cmVkKSA8PSBtX2Z0b2wgJiYgcHJlcmVkIDw9IG1fZnRvbCAmJiBTY2FsYXIoLjUpICogcmF0aW8gPD0gMS4pIAorICAgIHsKKyAgICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGw7CisgICAgfQorICAgIGlmIChtX2RlbHRhIDw9IG1feHRvbCAqIHhub3JtKQorICAgIHsKKyAgICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlRXJyb3JUb29TbWFsbDsKKyAgICB9CisKKyAgICAvKiB0ZXN0cyBmb3IgdGVybWluYXRpb24gYW5kIHN0cmluZ2VudCB0b2xlcmFuY2VzLiAqLworICAgIGlmIChtX25mZXYgPj0gbV9tYXhmZXYpIAorICAgIHsKKyAgICAgIG1faW5mbyA9IE5vQ29udmVyZ2VuY2U7CisgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb247CisgICAgfQorICAgIGlmIChhYnMoYWN0cmVkKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIHByZXJlZCA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLikKKyAgICB7CisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpGdG9sVG9vU21hbGw7CisgICAgfQorICAgIGlmIChtX2RlbHRhIDw9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiB4bm9ybSkgCisgICAgeworICAgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6WHRvbFRvb1NtYWxsOworICAgIH0KKyAgICBpZiAobV9nbm9ybSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgIHsKKyAgICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6Okd0b2xUb29TbWFsbDsKKyAgICB9CisKKyAgfSB3aGlsZSAocmF0aW8gPCBTY2FsYXIoMWUtNCkpOworCisgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6UnVubmluZzsKK30KKworICAKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTE1PTkVTVEVQX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTE1wYXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTE1wYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ4MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MTXBhci5oCkBAIC0wLDAgKzEsMTYwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIFRoaXMgY29kZSBpbml0aWFsbHkgY29tZXMgZnJvbSBNSU5QQUNLIHdob3NlIG9yaWdpbmFsIGF1dGhvcnMgYXJlOgorLy8gQ29weXJpZ2h0IEpvcmdlIE1vcmUgLSBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkKKy8vIENvcHlyaWdodCBCdXJ0IEdhcmJvdyAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8gQ29weXJpZ2h0IEtlbiBIaWxsc3Ryb20gLSBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1pbnBhY2sgbGljZW5zZQorLy8gKGEgQlNELWxpa2UgbGljZW5zZSkgZGVzY3JpYmVkIGluIHRoZSBjYW1wYWlnbmVkIENvcHlyaWdodE1JTlBBQ0sudHh0IGZpbGUuCisKKyNpZm5kZWYgRUlHRU5fTE1QQVJfSAorI2RlZmluZSBFSUdFTl9MTVBBUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUVJTb2x2ZXIsIHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgdm9pZCBsbXBhcjIoCisgICAgY29uc3QgUVJTb2x2ZXIgJnFyLAorICAgIGNvbnN0IFZlY3RvclR5cGUgICZkaWFnLAorICAgIGNvbnN0IFZlY3RvclR5cGUgICZxdGIsCisgICAgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIG1fZGVsdGEsCisgICAgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyICZwYXIsCisgICAgVmVjdG9yVHlwZSAgJngpCisKKyAgeworICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFFSU29sdmVyOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBRUlNvbHZlcjo6U2NhbGFyIFNjYWxhcjsKKy8vICAgIHR5cGVkZWYgdHlwZW5hbWUgUVJTb2x2ZXI6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBJbmRleCBqOworICAgIFNjYWxhciBmcDsKKyAgICBTY2FsYXIgcGFyYywgcGFybDsKKyAgICBJbmRleCBpdGVyOworICAgIFNjYWxhciB0ZW1wLCBwYXJ1OworICAgIFNjYWxhciBnbm9ybTsKKyAgICBTY2FsYXIgZHhub3JtOworICAgIAorICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSB0cmlhbmd1bGFyIGZhY3Rvci4gCisgICAgLy8gVGhpcyBjb3B5IGlzIG1vZGlmaWVkIGR1cmluZyBjYWxsIHRoZSBxcnNvbHYKKyAgICBNYXRyaXhUeXBlIHM7CisgICAgcyA9IHFyLm1hdHJpeFIoKTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjb25zdCBTY2FsYXIgZHdhcmYgPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CisgICAgY29uc3QgSW5kZXggbiA9IHFyLm1hdHJpeFIoKS5jb2xzKCk7CisgICAgZWlnZW5fYXNzZXJ0KG49PWRpYWcuc2l6ZSgpKTsKKyAgICBlaWdlbl9hc3NlcnQobj09cXRiLnNpemUoKSk7CisKKyAgICBWZWN0b3JUeXBlICB3YTEsIHdhMjsKKworICAgIC8qIGNvbXB1dGUgYW5kIHN0b3JlIGluIHggdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24uIGlmIHRoZSAqLworICAgIC8qIGphY29iaWFuIGlzIHJhbmstZGVmaWNpZW50LCBvYnRhaW4gYSBsZWFzdCBzcXVhcmVzIHNvbHV0aW9uLiAqLworCisgICAgLy8gICAgY29uc3QgSW5kZXggcmFuayA9IHFyLm5vbnplcm9QaXZvdHMoKTsgLy8gZXhhY3RseSBkb3VibGUoMC4pCisgICAgY29uc3QgSW5kZXggcmFuayA9IHFyLnJhbmsoKTsgLy8gdXNlIGEgdGhyZXNob2xkCisgICAgd2ExID0gcXRiOworICAgIHdhMS50YWlsKG4tcmFuaykuc2V0WmVybygpOworICAgIC8vRklYTUUgVGhlcmUgaXMgbm8gc29sdmUgaW4gcGxhY2UgZm9yIHNwYXJzZSB0cmlhbmd1bGFyVmlldworICAgIHdhMS5oZWFkKHJhbmspID0gcy50b3BMZWZ0Q29ybmVyKHJhbmsscmFuaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUocXRiLmhlYWQocmFuaykpOworCisgICAgeCA9IHFyLmNvbHNQZXJtdXRhdGlvbigpKndhMTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLiAqLworICAgIC8qIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBhdCB0aGUgb3JpZ2luLCBhbmQgdGVzdCAqLworICAgIC8qIGZvciBhY2NlcHRhbmNlIG9mIHRoZSBnYXVzcy1uZXd0b24gZGlyZWN0aW9uLiAqLworICAgIGl0ZXIgPSAwOworICAgIHdhMiA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpOworICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgIGZwID0gZHhub3JtIC0gbV9kZWx0YTsKKyAgICBpZiAoZnAgPD0gU2NhbGFyKDAuMSkgKiBtX2RlbHRhKSB7CisgICAgICBwYXIgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGlmIHRoZSBqYWNvYmlhbiBpcyBub3QgcmFuayBkZWZpY2llbnQsIHRoZSBuZXd0b24gKi8KKyAgICAvKiBzdGVwIHByb3ZpZGVzIGEgbG93ZXIgYm91bmQsIHBhcmwsIGZvciB0aGUgemVybyBvZiAqLworICAgIC8qIHRoZSBmdW5jdGlvbi4gb3RoZXJ3aXNlIHNldCB0aGlzIGJvdW5kIHRvIHplcm8uICovCisgICAgcGFybCA9IDAuOworICAgIGlmIChyYW5rPT1uKSB7CisgICAgICB3YTEgPSBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKiAgZGlhZy5jd2lzZVByb2R1Y3Qod2EyKS9keG5vcm07CisgICAgICBzLnRvcExlZnRDb3JuZXIobixuKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2Uod2ExKTsKKyAgICAgIHRlbXAgPSB3YTEuYmx1ZU5vcm0oKTsKKyAgICAgIHBhcmwgPSBmcCAvIG1fZGVsdGEgLyB0ZW1wIC8gdGVtcDsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgYW4gdXBwZXIgYm91bmQsIHBhcnUsIGZvciB0aGUgemVybyBvZiB0aGUgZnVuY3Rpb24uICovCisgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgIHdhMVtqXSA9IHMuY29sKGopLmhlYWQoaisxKS5kb3QocXRiLmhlYWQoaisxKSkgLyBkaWFnW3FyLmNvbHNQZXJtdXRhdGlvbigpLmluZGljZXMoKShqKV07CisKKyAgICBnbm9ybSA9IHdhMS5zdGFibGVOb3JtKCk7CisgICAgcGFydSA9IGdub3JtIC8gbV9kZWx0YTsKKyAgICBpZiAocGFydSA9PSAwLikKKyAgICAgIHBhcnUgPSBkd2FyZiAvIChzdGQ6Om1pbikobV9kZWx0YSxTY2FsYXIoMC4xKSk7CisKKyAgICAvKiBpZiB0aGUgaW5wdXQgcGFyIGxpZXMgb3V0c2lkZSBvZiB0aGUgaW50ZXJ2YWwgKHBhcmwscGFydSksICovCisgICAgLyogc2V0IHBhciB0byB0aGUgY2xvc2VyIGVuZHBvaW50LiAqLworICAgIHBhciA9IChzdGQ6Om1heCkocGFyLHBhcmwpOworICAgIHBhciA9IChzdGQ6Om1pbikocGFyLHBhcnUpOworICAgIGlmIChwYXIgPT0gMC4pCisgICAgICBwYXIgPSBnbm9ybSAvIGR4bm9ybTsKKworICAgIC8qIGJlZ2lubmluZyBvZiBhbiBpdGVyYXRpb24uICovCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICsraXRlcjsKKworICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHBhci4gKi8KKyAgICAgIGlmIChwYXIgPT0gMC4pCisgICAgICAgIHBhciA9IChzdGQ6Om1heCkoZHdhcmYsU2NhbGFyKC4wMDEpICogcGFydSk7IC8qIENvbXB1dGluZyBNQVggKi8KKyAgICAgIHdhMSA9IHNxcnQocGFyKSogZGlhZzsKKworICAgICAgVmVjdG9yVHlwZSBzZGlhZyhuKTsKKyAgICAgIGxtcXJzb2x2KHMsIHFyLmNvbHNQZXJtdXRhdGlvbigpLCB3YTEsIHF0YiwgeCwgc2RpYWcpOworCisgICAgICB3YTIgPSBkaWFnLmN3aXNlUHJvZHVjdCh4KTsKKyAgICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgICAgdGVtcCA9IGZwOworICAgICAgZnAgPSBkeG5vcm0gLSBtX2RlbHRhOworCisgICAgICAvKiBpZiB0aGUgZnVuY3Rpb24gaXMgc21hbGwgZW5vdWdoLCBhY2NlcHQgdGhlIGN1cnJlbnQgdmFsdWUgKi8KKyAgICAgIC8qIG9mIHBhci4gYWxzbyB0ZXN0IGZvciB0aGUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgcGFybCAqLworICAgICAgLyogaXMgemVybyBvciB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaGFzIHJlYWNoZWQgMTAuICovCisgICAgICBpZiAoYWJzKGZwKSA8PSBTY2FsYXIoMC4xKSAqIG1fZGVsdGEgfHwgKHBhcmwgPT0gMC4gJiYgZnAgPD0gdGVtcCAmJiB0ZW1wIDwgMC4pIHx8IGl0ZXIgPT0gMTApCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBjb21wdXRlIHRoZSBuZXd0b24gY29ycmVjdGlvbi4gKi8KKyAgICAgIHdhMSA9IHFyLmNvbHNQZXJtdXRhdGlvbigpLmludmVyc2UoKSAqIGRpYWcuY3dpc2VQcm9kdWN0KHdhMi9keG5vcm0pOworICAgICAgLy8gd2UgY291bGQgYWxtb3N0IHVzZSB0aGlzIGhlcmUsIGJ1dCB0aGUgZGlhZ29uYWwgaXMgb3V0c2lkZSBxciwgaW4gc2RpYWdbXQorICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICB3YTFbal0gLz0gc2RpYWdbal07CisgICAgICAgIHRlbXAgPSB3YTFbal07CisgICAgICAgIGZvciAoSW5kZXggaSA9IGorMTsgaSA8IG47ICsraSkKKyAgICAgICAgICB3YTFbaV0gLT0gcy5jb2VmZihpLGopICogdGVtcDsKKyAgICAgIH0KKyAgICAgIHRlbXAgPSB3YTEuYmx1ZU5vcm0oKTsKKyAgICAgIHBhcmMgPSBmcCAvIG1fZGVsdGEgLyB0ZW1wIC8gdGVtcDsKKworICAgICAgLyogZGVwZW5kaW5nIG9uIHRoZSBzaWduIG9mIHRoZSBmdW5jdGlvbiwgdXBkYXRlIHBhcmwgb3IgcGFydS4gKi8KKyAgICAgIGlmIChmcCA+IDAuKQorICAgICAgICBwYXJsID0gKHN0ZDo6bWF4KShwYXJsLHBhcik7CisgICAgICBpZiAoZnAgPCAwLikKKyAgICAgICAgcGFydSA9IChzdGQ6Om1pbikocGFydSxwYXIpOworCisgICAgICAvKiBjb21wdXRlIGFuIGltcHJvdmVkIGVzdGltYXRlIGZvciBwYXIuICovCisgICAgICBwYXIgPSAoc3RkOjptYXgpKHBhcmwscGFyK3BhcmMpOworICAgIH0KKyAgICBpZiAoaXRlciA9PSAwKQorICAgICAgcGFyID0gMC47CisgICAgcmV0dXJuOworICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9MTVBBUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0xNcXJzb2x2LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0xNcXJzb2x2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ZDc5MwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9MZXZlbmJlcmdNYXJxdWFyZHQvTE1xcnNvbHYuaApAQCAtMCwwICsxLDE4OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTnVlbnRzYSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBjb2RlIGluaXRpYWxseSBjb21lcyBmcm9tIE1JTlBBQ0sgd2hvc2Ugb3JpZ2luYWwgYXV0aG9ycyBhcmU6CisvLyBDb3B5cmlnaHQgSm9yZ2UgTW9yZSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8gQ29weXJpZ2h0IEJ1cnQgR2FyYm93IC0gQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5CisvLyBDb3B5cmlnaHQgS2VuIEhpbGxzdHJvbSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTWlucGFjayBsaWNlbnNlCisvLyAoYSBCU0QtbGlrZSBsaWNlbnNlKSBkZXNjcmliZWQgaW4gdGhlIGNhbXBhaWduZWQgQ29weXJpZ2h0TUlOUEFDSy50eHQgZmlsZS4KKworI2lmbmRlZiBFSUdFTl9MTVFSU09MVl9ICisjZGVmaW5lIEVJR0VOX0xNUVJTT0xWX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsaW50IFJvd3MsIGludCBDb2xzLCB0eXBlbmFtZSBQZXJtSW5kZXg+Cit2b2lkIGxtcXJzb2x2KAorICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gJnMsCisgIGNvbnN0IFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxQZXJtSW5kZXg+ICZpUGVybSwKKyAgY29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICZkaWFnLAorICBjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gJnF0YiwKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICZ4LAorICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gJnNkaWFnKQoreworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGosIGs7CisgICAgU2NhbGFyIHRlbXA7CisgICAgSW5kZXggbiA9IHMuY29scygpOworICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiAgd2Eobik7CisgICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiBnaXZlbnM7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgLy8gdGhlIGZvbGxvd2luZyB3aWxsIG9ubHkgY2hhbmdlIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgcywgaW5jbHVkaW5nCisgICAgLy8gdGhlIGRpYWdvbmFsLCB0aG91Z2ggdGhlIGRpYWdvbmFsIGlzIHJlc3RvcmVkIGFmdGVyd2FyZAorCisgICAgLyogICAgIGNvcHkgciBhbmQgKHEgdHJhbnNwb3NlKSpiIHRvIHByZXNlcnZlIGlucHV0IGFuZCBpbml0aWFsaXplIHMuICovCisgICAgLyogICAgIGluIHBhcnRpY3VsYXIsIHNhdmUgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG9mIHIgaW4geC4gKi8KKyAgICB4ID0gcy5kaWFnb25hbCgpOworICAgIHdhID0gcXRiOworICAgIAorICAgCisgICAgcy50b3BMZWZ0Q29ybmVyKG4sbikudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKSA9IHMudG9wTGVmdENvcm5lcihuLG4pLnRyYW5zcG9zZSgpOworICAgIC8qICAgICBlbGltaW5hdGUgdGhlIGRpYWdvbmFsIG1hdHJpeCBkIHVzaW5nIGEgZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKworICAgICAgICAvKiAgICAgICAgcHJlcGFyZSB0aGUgcm93IG9mIGQgdG8gYmUgZWxpbWluYXRlZCwgbG9jYXRpbmcgdGhlICovCisgICAgICAgIC8qICAgICAgICBkaWFnb25hbCBlbGVtZW50IHVzaW5nIHAgZnJvbSB0aGUgcXIgZmFjdG9yaXphdGlvbi4gKi8KKyAgICAgICAgY29uc3QgUGVybUluZGV4IGwgPSBpUGVybS5pbmRpY2VzKCkoaik7CisgICAgICAgIGlmIChkaWFnW2xdID09IDAuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNkaWFnLnRhaWwobi1qKS5zZXRaZXJvKCk7CisgICAgICAgIHNkaWFnW2pdID0gZGlhZ1tsXTsKKworICAgICAgICAvKiAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyB0byBlbGltaW5hdGUgdGhlIHJvdyBvZiBkICovCisgICAgICAgIC8qICAgICAgICBtb2RpZnkgb25seSBhIHNpbmdsZSBlbGVtZW50IG9mIChxIHRyYW5zcG9zZSkqYiAqLworICAgICAgICAvKiAgICAgICAgYmV5b25kIHRoZSBmaXJzdCBuLCB3aGljaCBpcyBpbml0aWFsbHkgemVyby4gKi8KKyAgICAgICAgU2NhbGFyIHF0YnBqID0gMC47CisgICAgICAgIGZvciAoayA9IGo7IGsgPCBuOyArK2spIHsKKyAgICAgICAgICAgIC8qICAgICAgICAgICBkZXRlcm1pbmUgYSBnaXZlbnMgcm90YXRpb24gd2hpY2ggZWxpbWluYXRlcyB0aGUgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICBhcHByb3ByaWF0ZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IHJvdyBvZiBkLiAqLworICAgICAgICAgICAgZ2l2ZW5zLm1ha2VHaXZlbnMoLXMoayxrKSwgc2RpYWdba10pOworCisgICAgICAgICAgICAvKiAgICAgICAgICAgY29tcHV0ZSB0aGUgbW9kaWZpZWQgZGlhZ29uYWwgZWxlbWVudCBvZiByIGFuZCAqLworICAgICAgICAgICAgLyogICAgICAgICAgIHRoZSBtb2RpZmllZCBlbGVtZW50IG9mICgocSB0cmFuc3Bvc2UpKmIsMCkuICovCisgICAgICAgICAgICBzKGssaykgPSBnaXZlbnMuYygpICogcyhrLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2tdOworICAgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiB3YVtrXSArIGdpdmVucy5zKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHF0YnBqID0gLWdpdmVucy5zKCkgKiB3YVtrXSArIGdpdmVucy5jKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHdhW2tdID0gdGVtcDsKKworICAgICAgICAgICAgLyogICAgICAgICAgIGFjY3VtdWxhdGUgdGhlIHRyYW5mb3JtYXRpb24gaW4gdGhlIHJvdyBvZiBzLiAqLworICAgICAgICAgICAgZm9yIChpID0gaysxOyBpPG47ICsraSkgeworICAgICAgICAgICAgICAgIHRlbXAgPSBnaXZlbnMuYygpICogcyhpLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2ldOworICAgICAgICAgICAgICAgIHNkaWFnW2ldID0gLWdpdmVucy5zKCkgKiBzKGksaykgKyBnaXZlbnMuYygpICogc2RpYWdbaV07CisgICAgICAgICAgICAgICAgcyhpLGspID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgCisgICAgLyogICAgIHNvbHZlIHRoZSB0cmlhbmd1bGFyIHN5c3RlbSBmb3Igei4gaWYgdGhlIHN5c3RlbSBpcyAqLworICAgIC8qICAgICBzaW5ndWxhciwgdGhlbiBvYnRhaW4gYSBsZWFzdCBzcXVhcmVzIHNvbHV0aW9uLiAqLworICAgIEluZGV4IG5zaW5nOworICAgIGZvcihuc2luZz0wOyBuc2luZzxuICYmIHNkaWFnW25zaW5nXSE9MDsgbnNpbmcrKykge30KKworICAgIHdhLnRhaWwobi1uc2luZykuc2V0WmVybygpOworICAgIHMudG9wTGVmdENvcm5lcihuc2luZywgbnNpbmcpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlSW5QbGFjZSh3YS5oZWFkKG5zaW5nKSk7CisgIAorICAgIC8vIHJlc3RvcmUKKyAgICBzZGlhZyA9IHMuZGlhZ29uYWwoKTsKKyAgICBzLmRpYWdvbmFsKCkgPSB4OworCisgICAgLyogcGVybXV0ZSB0aGUgY29tcG9uZW50cyBvZiB6IGJhY2sgdG8gY29tcG9uZW50cyBvZiB4LiAqLworICAgIHggPSBpUGVybSAqIHdhOyAKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBJbmRleD4KK3ZvaWQgbG1xcnNvbHYoCisgIFNwYXJzZU1hdHJpeDxTY2FsYXIsX09wdGlvbnMsSW5kZXg+ICZzLAorICBjb25zdCBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWM+ICZpUGVybSwKKyAgY29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICZkaWFnLAorICBjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gJnF0YiwKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICZ4LAorICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gJnNkaWFnKQoreworICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLFJvd01ham9yLEluZGV4PiBGYWN0b3JUeXBlOworICAgIEluZGV4IGksIGosIGssIGw7CisgICAgU2NhbGFyIHRlbXA7CisgICAgSW5kZXggbiA9IHMuY29scygpOworICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiAgd2Eobik7CisgICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiBnaXZlbnM7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgLy8gdGhlIGZvbGxvd2luZyB3aWxsIG9ubHkgY2hhbmdlIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgcywgaW5jbHVkaW5nCisgICAgLy8gdGhlIGRpYWdvbmFsLCB0aG91Z2ggdGhlIGRpYWdvbmFsIGlzIHJlc3RvcmVkIGFmdGVyd2FyZAorCisgICAgLyogICAgIGNvcHkgciBhbmQgKHEgdHJhbnNwb3NlKSpiIHRvIHByZXNlcnZlIGlucHV0IGFuZCBpbml0aWFsaXplIFIuICovCisgICAgd2EgPSBxdGI7CisgICAgRmFjdG9yVHlwZSBSKHMpOworICAgIC8vIEVsaW1pbmF0ZSB0aGUgZGlhZ29uYWwgbWF0cml4IGQgdXNpbmcgYSBnaXZlbnMgcm90YXRpb24KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgIHsKKyAgICAgIC8vIFByZXBhcmUgdGhlIHJvdyBvZiBkIHRvIGJlIGVsaW1pbmF0ZWQsIGxvY2F0aW5nIHRoZSAKKyAgICAgIC8vIGRpYWdvbmFsIGVsZW1lbnQgdXNpbmcgcCBmcm9tIHRoZSBxciBmYWN0b3JpemF0aW9uCisgICAgICBsID0gaVBlcm0uaW5kaWNlcygpKGopOworICAgICAgaWYgKGRpYWcobCkgPT0gU2NhbGFyKDApKSAKKyAgICAgICAgYnJlYWs7IAorICAgICAgc2RpYWcudGFpbChuLWopLnNldFplcm8oKTsKKyAgICAgIHNkaWFnW2pdID0gZGlhZ1tsXTsKKyAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdG8gZWxpbWluYXRlIHRoZSByb3cgb2YgZAorICAgICAgLy8gbW9kaWZ5IG9ubHkgYSBzaW5nbGUgZWxlbWVudCBvZiAocSB0cmFuc3Bvc2UpKmIKKyAgICAgIC8vIGJleW9uZCB0aGUgZmlyc3Qgbiwgd2hpY2ggaXMgaW5pdGlhbGx5IHplcm8uIAorICAgICAgCisgICAgICBTY2FsYXIgcXRicGogPSAwOyAKKyAgICAgIC8vIEJyb3dzZSB0aGUgbm9uemVybyBlbGVtZW50cyBvZiByb3cgaiBvZiB0aGUgdXBwZXIgdHJpYW5ndWxhciBzCisgICAgICBmb3IgKGsgPSBqOyBrIDwgbjsgKytrKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBGYWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGl0ayhSLGspOworICAgICAgICBmb3IgKDsgaXRrOyArK2l0ayl7CisgICAgICAgICAgaWYgKGl0ay5pbmRleCgpIDwgaykgY29udGludWU7CisgICAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvL0F0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdGhlIGRpYWdvbmFsIGVsZW1lbnQgUihrLGspCisgICAgICAgIC8vIERldGVybWluZSBhIGdpdmVucyByb3RhdGlvbiB3aGljaCBlbGltaW5hdGVzIAorICAgICAgICAvLyB0aGUgYXBwcm9wcmlhdGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCByb3cgb2YgZAorICAgICAgICBnaXZlbnMubWFrZUdpdmVucygtaXRrLnZhbHVlKCksIHNkaWFnKGspKTsKKyAgICAgICAgCisgICAgICAgIC8vIENvbXB1dGUgdGhlIG1vZGlmaWVkIGRpYWdvbmFsIGVsZW1lbnQgb2YgciBhbmQgCisgICAgICAgIC8vIHRoZSBtb2RpZmllZCBlbGVtZW50IG9mICgocSB0cmFuc3Bvc2UpKmIsMCkuCisgICAgICAgIGl0ay52YWx1ZVJlZigpID0gZ2l2ZW5zLmMoKSAqIGl0ay52YWx1ZSgpICsgZ2l2ZW5zLnMoKSAqIHNkaWFnKGspOworICAgICAgICB0ZW1wID0gZ2l2ZW5zLmMoKSAqIHdhKGspICsgZ2l2ZW5zLnMoKSAqIHF0YnBqOyAKKyAgICAgICAgcXRicGogPSAtZ2l2ZW5zLnMoKSAqIHdhKGspICsgZ2l2ZW5zLmMoKSAqIHF0YnBqOworICAgICAgICB3YShrKSA9IHRlbXA7CisgICAgICAgIAorICAgICAgICAvLyBBY2N1bXVsYXRlIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgcmVtYWluaW5nIGsgcm93L2NvbHVtbiBvZiBSCisgICAgICAgIGZvciAoKytpdGs7IGl0azsgKytpdGspCisgICAgICAgIHsKKyAgICAgICAgICBpID0gaXRrLmluZGV4KCk7CisgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiAgaXRrLnZhbHVlKCkgKyBnaXZlbnMucygpICogc2RpYWcoaSk7CisgICAgICAgICAgc2RpYWcoaSkgPSAtZ2l2ZW5zLnMoKSAqIGl0ay52YWx1ZSgpICsgZ2l2ZW5zLmMoKSAqIHNkaWFnKGkpOworICAgICAgICAgIGl0ay52YWx1ZVJlZigpID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBTb2x2ZSB0aGUgdHJpYW5ndWxhciBzeXN0ZW0gZm9yIHouIElmIHRoZSBzeXN0ZW0gaXMgCisgICAgLy8gc2luZ3VsYXIsIHRoZW4gb2J0YWluIGEgbGVhc3Qgc3F1YXJlcyBzb2x1dGlvbgorICAgIEluZGV4IG5zaW5nOworICAgIGZvcihuc2luZyA9IDA7IG5zaW5nPG4gJiYgc2RpYWcobnNpbmcpICE9MDsgbnNpbmcrKykge30KKyAgICAKKyAgICB3YS50YWlsKG4tbnNpbmcpLnNldFplcm8oKTsKKy8vICAgICB4ID0gd2E7IAorICAgIHdhLmhlYWQobnNpbmcpID0gUi50b3BMZWZ0Q29ybmVyKG5zaW5nLG5zaW5nKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZS8qSW5QbGFjZSovKHdhLmhlYWQobnNpbmcpKTsKKyAgICAKKyAgICBzZGlhZyA9IFIuZGlhZ29uYWwoKTsKKyAgICAvLyBQZXJtdXRlIHRoZSBjb21wb25lbnRzIG9mIHogYmFjayB0byBjb21wb25lbnRzIG9mIHgKKyAgICB4ID0gaVBlcm0gKiB3YTsgCit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9MTVFSU09MVl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTGV2ZW5iZXJnTWFycXVhcmR0L0xldmVuYmVyZ01hcnF1YXJkdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MZXZlbmJlcmdNYXJxdWFyZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU0Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0xldmVuYmVyZ01hcnF1YXJkdC9MZXZlbmJlcmdNYXJxdWFyZHQuaApAQCAtMCwwICsxLDM5NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTnVlbnRzYSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhlIGFsZ29yaXRobSBvZiB0aGlzIGNsYXNzIGluaXRpYWxseSBjb21lcyBmcm9tIE1JTlBBQ0sgd2hvc2Ugb3JpZ2luYWwgYXV0aG9ycyBhcmU6CisvLyBDb3B5cmlnaHQgSm9yZ2UgTW9yZSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8gQ29weXJpZ2h0IEJ1cnQgR2FyYm93IC0gQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5CisvLyBDb3B5cmlnaHQgS2VuIEhpbGxzdHJvbSAtIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTWlucGFjayBsaWNlbnNlCisvLyAoYSBCU0QtbGlrZSBsaWNlbnNlKSBkZXNjcmliZWQgaW4gdGhlIGNhbXBhaWduZWQgQ29weXJpZ2h0TUlOUEFDSy50eHQgZmlsZS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX0gKKyNkZWZpbmUgRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX0gKKworCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlIHsKKyAgICBlbnVtIFN0YXR1cyB7CisgICAgICAgIE5vdFN0YXJ0ZWQgPSAtMiwKKyAgICAgICAgUnVubmluZyA9IC0xLAorICAgICAgICBJbXByb3BlcklucHV0UGFyYW1ldGVycyA9IDAsCisgICAgICAgIFJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGwgPSAxLAorICAgICAgICBSZWxhdGl2ZUVycm9yVG9vU21hbGwgPSAyLAorICAgICAgICBSZWxhdGl2ZUVycm9yQW5kUmVkdWN0aW9uVG9vU21hbGwgPSAzLAorICAgICAgICBDb3NpbnVzVG9vU21hbGwgPSA0LAorICAgICAgICBUb29NYW55RnVuY3Rpb25FdmFsdWF0aW9uID0gNSwKKyAgICAgICAgRnRvbFRvb1NtYWxsID0gNiwKKyAgICAgICAgWHRvbFRvb1NtYWxsID0gNywKKyAgICAgICAgR3RvbFRvb1NtYWxsID0gOCwKKyAgICAgICAgVXNlckFza2VkID0gOQorICAgIH07Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+CitzdHJ1Y3QgRGVuc2VGdW5jdG9yCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKKyAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKKyAgdHlwZWRlZiBDb2xQaXZIb3VzZWhvbGRlclFSPEphY29iaWFuVHlwZT4gUVJTb2x2ZXI7CisgIGNvbnN0IGludCBtX2lucHV0cywgbV92YWx1ZXM7CisKKyAgRGVuc2VGdW5jdG9yKCkgOiBtX2lucHV0cyhJbnB1dHNBdENvbXBpbGVUaW1lKSwgbV92YWx1ZXMoVmFsdWVzQXRDb21waWxlVGltZSkge30KKyAgRGVuc2VGdW5jdG9yKGludCBpbnB1dHMsIGludCB2YWx1ZXMpIDogbV9pbnB1dHMoaW5wdXRzKSwgbV92YWx1ZXModmFsdWVzKSB7fQorCisgIGludCBpbnB1dHMoKSBjb25zdCB7IHJldHVybiBtX2lucHV0czsgfQorICBpbnQgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAvL2ludCBvcGVyYXRvcigpKGNvbnN0IElucHV0VHlwZSAmeCwgVmFsdWVUeXBlJiBmdmVjKSB7IH0KKyAgLy8gc2hvdWxkIGJlIGRlZmluZWQgaW4gZGVyaXZlZCBjbGFzc2VzCisgIAorICAvL2ludCBkZihjb25zdCBJbnB1dFR5cGUgJngsIEphY29iaWFuVHlwZSYgZmphYykgeyB9CisgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIGRlcml2ZWQgY2xhc3NlcworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIHR5cGVuYW1lIF9JbmRleD4KK3N0cnVjdCBTcGFyc2VGdW5jdG9yCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgX0luZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZhbHVlVHlwZTsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvciwgSW5kZXg+IEphY29iaWFuVHlwZTsKKyAgdHlwZWRlZiBTcGFyc2VRUjxKYWNvYmlhblR5cGUsIENPTEFNRE9yZGVyaW5nPGludD4gPiBRUlNvbHZlcjsKKyAgZW51bSB7CisgICAgSW5wdXRzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgVmFsdWVzQXRDb21waWxlVGltZSA9IER5bmFtaWMKKyAgfTsKKyAgCisgIFNwYXJzZUZ1bmN0b3IoaW50IGlucHV0cywgaW50IHZhbHVlcykgOiBtX2lucHV0cyhpbnB1dHMpLCBtX3ZhbHVlcyh2YWx1ZXMpIHt9CisKKyAgaW50IGlucHV0cygpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRzOyB9CisgIGludCB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorICAKKyAgY29uc3QgaW50IG1faW5wdXRzLCBtX3ZhbHVlczsKKyAgLy9pbnQgb3BlcmF0b3IoKShjb25zdCBJbnB1dFR5cGUgJngsIFZhbHVlVHlwZSYgZnZlYykgeyB9CisgIC8vIHRvIGJlIGRlZmluZWQgaW4gdGhlIGZ1bmN0b3IKKyAgCisgIC8vaW50IGRmKGNvbnN0IElucHV0VHlwZSAmeCwgSmFjb2JpYW5UeXBlJiBmamFjKSB7IH0KKyAgLy8gdG8gYmUgZGVmaW5lZCBpbiB0aGUgZnVuY3RvciBpZiBubyBhdXRvbWF0aWMgZGlmZmVyZW50aWF0aW9uCisgIAorfTsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUVJTb2x2ZXIsIHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIGxtcGFyMihjb25zdCBRUlNvbHZlciAmcXIsIGNvbnN0IFZlY3RvclR5cGUgICZkaWFnLCBjb25zdCBWZWN0b3JUeXBlICAmcXRiLAorCSAgICB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgbV9kZWx0YSwgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyICZwYXIsCisJICAgIFZlY3RvclR5cGUgICZ4KTsKKyAgICB9CisvKioKKyAgKiBcaW5ncm91cCBOb25MaW5lYXJPcHRpbWl6YXRpb25fTW9kdWxlCisgICogXGJyaWVmIFBlcmZvcm1zIG5vbiBsaW5lYXIgb3B0aW1pemF0aW9uIG92ZXIgYSBub24tbGluZWFyIGZ1bmN0aW9uLAorICAqIHVzaW5nIGEgdmFyaWFudCBvZiB0aGUgTGV2ZW5iZXJnIE1hcnF1YXJkdCBhbGdvcml0aG0uCisgICoKKyAgKiBDaGVjayB3aWtpcGVkaWEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbmJlcmclRTIlODAlOTNNYXJxdWFyZHRfYWxnb3JpdGhtCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvclR5cGU+CitjbGFzcyBMZXZlbmJlcmdNYXJxdWFyZHQgOiBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvcgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfRnVuY3RvclR5cGUgRnVuY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yVHlwZTo6UVJTb2x2ZXIgUVJTb2x2ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yVHlwZTo6SmFjb2JpYW5UeXBlIEphY29iaWFuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEphY29iaWFuVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEphY29iaWFuVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFFSU29sdmVyOjpTdG9yYWdlSW5kZXggUGVybUluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IEZWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljPiBQZXJtdXRhdGlvblR5cGU7CisgIHB1YmxpYzoKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHQoRnVuY3RvclR5cGUmIGZ1bmN0b3IpIAorICAgIDogbV9mdW5jdG9yKGZ1bmN0b3IpLG1fbmZldigwKSxtX25qZXYoMCksbV9mbm9ybSgwLjApLG1fZ25vcm0oMCksCisgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLG1faW5mbyhJbnZhbGlkSW5wdXQpCisgICAgeworICAgICAgcmVzZXRQYXJhbWV0ZXJzKCk7CisgICAgICBtX3VzZUV4dGVybmFsU2NhbGluZz1mYWxzZTsgCisgICAgfQorICAgIAorICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemUoRlZlY3RvclR5cGUgJngpOworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemVJbml0KEZWZWN0b3JUeXBlICZ4KTsKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIG1pbmltaXplT25lU3RlcChGVmVjdG9yVHlwZSAmeCk7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBsbWRlcjEoCisgICAgICBGVmVjdG9yVHlwZSAgJngsIAorICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IHN0ZDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICk7CisgICAgc3RhdGljIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbG1kaWYxKAorICAgICAgICAgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3IsCisgICAgICAgICAgICBGVmVjdG9yVHlwZSAgJngsCisgICAgICAgICAgICBJbmRleCAqbmZldiwKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0b2wgPSBzdGQ6OnNxcnQoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICAgICAgICAgICk7CisgICAgCisgICAgLyoqIFNldHMgdGhlIGRlZmF1bHQgcGFyYW1ldGVycyAqLworICAgIHZvaWQgcmVzZXRQYXJhbWV0ZXJzKCkgCisgICAgeworICAgICAgdXNpbmcgc3RkOjpzcXJ0OyAgICAgICAgCisKKyAgICAgIG1fZmFjdG9yID0gMTAwLjsgCisgICAgICBtX21heGZldiA9IDQwMDsgCisgICAgICBtX2Z0b2wgPSBzcXJ0KE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpKTsKKyAgICAgIG1feHRvbCA9IHNxcnQoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpOworICAgICAgbV9ndG9sID0gMC4gOyAKKyAgICAgIG1fZXBzZmNuID0gMC4gOworICAgIH0KKyAgICAKKyAgICAvKiogU2V0cyB0aGUgdG9sZXJhbmNlIGZvciB0aGUgbm9ybSBvZiB0aGUgc29sdXRpb24gdmVjdG9yKi8KKyAgICB2b2lkIHNldFh0b2woUmVhbFNjYWxhciB4dG9sKSB7IG1feHRvbCA9IHh0b2w7IH0KKyAgICAKKyAgICAvKiogU2V0cyB0aGUgdG9sZXJhbmNlIGZvciB0aGUgbm9ybSBvZiB0aGUgdmVjdG9yIGZ1bmN0aW9uKi8KKyAgICB2b2lkIHNldEZ0b2woUmVhbFNjYWxhciBmdG9sKSB7IG1fZnRvbCA9IGZ0b2w7IH0KKyAgICAKKyAgICAvKiogU2V0cyB0aGUgdG9sZXJhbmNlIGZvciB0aGUgbm9ybSBvZiB0aGUgZ3JhZGllbnQgb2YgdGhlIGVycm9yIHZlY3RvciovCisgICAgdm9pZCBzZXRHdG9sKFJlYWxTY2FsYXIgZ3RvbCkgeyBtX2d0b2wgPSBndG9sOyB9CisgICAgCisgICAgLyoqIFNldHMgdGhlIHN0ZXAgYm91bmQgZm9yIHRoZSBkaWFnb25hbCBzaGlmdCAqLworICAgIHZvaWQgc2V0RmFjdG9yKFJlYWxTY2FsYXIgZmFjdG9yKSB7IG1fZmFjdG9yID0gZmFjdG9yOyB9ICAgIAorICAgIAorICAgIC8qKiBTZXRzIHRoZSBlcnJvciBwcmVjaXNpb24gICovCisgICAgdm9pZCBzZXRFcHNpbG9uIChSZWFsU2NhbGFyIGVwc2ZjbikgeyBtX2Vwc2ZjbiA9IGVwc2ZjbjsgfQorICAgIAorICAgIC8qKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbiBldmFsdWF0aW9uICovCisgICAgdm9pZCBzZXRNYXhmZXYoSW5kZXggbWF4ZmV2KSB7bV9tYXhmZXYgPSBtYXhmZXY7IH0KKyAgICAKKyAgICAvKiogVXNlIGFuIGV4dGVybmFsIFNjYWxpbmcuIElmIHNldCB0byB0cnVlLCBwYXNzIGEgbm9uemVybyBkaWFnb25hbCB0byBkaWFnKCkgKi8KKyAgICB2b2lkIHNldEV4dGVybmFsU2NhbGluZyhib29sIHZhbHVlKSB7bV91c2VFeHRlcm5hbFNjYWxpbmcgID0gdmFsdWU7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHRvbGVyYW5jZSBmb3IgdGhlIG5vcm0gb2YgdGhlIHNvbHV0aW9uIHZlY3RvciAqLworICAgIFJlYWxTY2FsYXIgeHRvbCgpIGNvbnN0IHtyZXR1cm4gbV94dG9sOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSB0b2xlcmFuY2UgZm9yIHRoZSBub3JtIG9mIHRoZSB2ZWN0b3IgZnVuY3Rpb24gKi8KKyAgICBSZWFsU2NhbGFyIGZ0b2woKSBjb25zdCB7cmV0dXJuIG1fZnRvbDsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyB0aGUgdG9sZXJhbmNlIGZvciB0aGUgbm9ybSBvZiB0aGUgZ3JhZGllbnQgb2YgdGhlIGVycm9yIHZlY3RvciAqLworICAgIFJlYWxTY2FsYXIgZ3RvbCgpIGNvbnN0IHtyZXR1cm4gbV9ndG9sOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzdGVwIGJvdW5kIGZvciB0aGUgZGlhZ29uYWwgc2hpZnQgKi8KKyAgICBSZWFsU2NhbGFyIGZhY3RvcigpIGNvbnN0IHtyZXR1cm4gbV9mYWN0b3I7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIGVycm9yIHByZWNpc2lvbiAqLworICAgIFJlYWxTY2FsYXIgZXBzaWxvbigpIGNvbnN0IHtyZXR1cm4gbV9lcHNmY247IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGV2YWx1YXRpb24gKi8KKyAgICBJbmRleCBtYXhmZXYoKSBjb25zdCB7cmV0dXJuIG1fbWF4ZmV2OyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBkaWFnb25hbCBvZiB0aGUgamFjb2JpYW4gKi8KKyAgICBGVmVjdG9yVHlwZSYgZGlhZygpIHtyZXR1cm4gbV9kaWFnOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQgKi8KKyAgICBJbmRleCBpdGVyYXRpb25zKCkgeyByZXR1cm4gbV9pdGVyOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIGV2YWx1YXRpb24gKi8KKyAgICBJbmRleCBuZmV2KCkgeyByZXR1cm4gbV9uZmV2OyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgamFjb2JpYW4gZXZhbHVhdGlvbiAqLworICAgIEluZGV4IG5qZXYoKSB7IHJldHVybiBtX25qZXY7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIG5vcm0gb2YgY3VycmVudCB2ZWN0b3IgZnVuY3Rpb24gKi8KKyAgICBSZWFsU2NhbGFyIGZub3JtKCkge3JldHVybiBtX2Zub3JtOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBub3JtIG9mIHRoZSBncmFkaWVudCBvZiB0aGUgZXJyb3IgKi8KKyAgICBSZWFsU2NhbGFyIGdub3JtKCkge3JldHVybiBtX2dub3JtOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBMZXZlbmJlcmdNYXJxdWFyZHQgcGFyYW1ldGVyICovCisgICAgUmVhbFNjYWxhciBsbV9wYXJhbSh2b2lkKSB7IHJldHVybiBtX3BhcjsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgIGN1cnJlbnQgdmVjdG9yIGZ1bmN0aW9uIAorICAgICAqLworICAgIEZWZWN0b3JUeXBlJiBmdmVjKCkge3JldHVybiBtX2Z2ZWM7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCB3aGVyZSB0aGUgY3VycmVudCBKYWNvYmlhbiBtYXRyaXggaXMgc3RvcmVkCisgICAgICovCisgICAgSmFjb2JpYW5UeXBlJiBqYWNvYmlhbigpIHtyZXR1cm4gbV9mamFjOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0cmlhbmd1bGFyIG1hdHJpeCBSIGZyb20gdGhlIFFSIG9mIHRoZSBqYWNvYmlhbiBtYXRyaXguCisgICAgICogXHNhIGphY29iaWFuKCkKKyAgICAgKi8KKyAgICBKYWNvYmlhblR5cGUmIG1hdHJpeFIoKSB7cmV0dXJuIG1fcmZhY3RvcjsgfQorICAgIAorICAgIC8qKiB0aGUgcGVybXV0YXRpb24gdXNlZCBpbiB0aGUgUVIgZmFjdG9yaXphdGlvbgorICAgICAqLworICAgIFBlcm11dGF0aW9uVHlwZSBwZXJtdXRhdGlvbigpIHtyZXR1cm4gbV9wZXJtdXRhdGlvbjsgfQorICAgIAorICAgIC8qKiAKKyAgICAgKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHRoZSBtaW5pbWl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIHRoZSBtaW5pbWl6YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgKiAgICAgICAgIFxjIE51bWVyaWNhbElzc3VlIGlmIGEgbnVtZXJpY2FsIHByb2JsZW0gYXJpc2VzIGR1cmluZyB0aGUgCisgICAgICogICAgICAgICAgbWluaW1pemF0aW9uIHByb2Nlc3MsIGZvciBleGVtcGxlIGR1cmluZyB0aGUgUVIgZmFjdG9yaXphdGlvbgorICAgICAqICAgICAgICAgXGMgTm9Db252ZXJnZW5jZSBpZiB0aGUgbWluaW1pemF0aW9uIGRpZCBub3QgY29udmVyZ2UgYWZ0ZXIgCisgICAgICogICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGV2YWx1YXRpb24gYWxsb3dlZAorICAgICAqICAgICAgICAgIFxjIEludmFsaWRJbnB1dCBpZiB0aGUgaW5wdXQgbWF0cml4IGlzIGludmFsaWQKKyAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgCisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBKYWNvYmlhblR5cGUgbV9mamFjOyAKKyAgICBKYWNvYmlhblR5cGUgbV9yZmFjdG9yOyAvLyBUaGUgdHJpYW5ndWxhciBtYXRyaXggUiBmcm9tIHRoZSBRUiBvZiB0aGUgamFjb2JpYW4gbWF0cml4IG1fZmphYworICAgIEZ1bmN0b3JUeXBlICZtX2Z1bmN0b3I7CisgICAgRlZlY3RvclR5cGUgbV9mdmVjLCBtX3F0ZiwgbV9kaWFnOyAKKyAgICBJbmRleCBuOworICAgIEluZGV4IG07IAorICAgIEluZGV4IG1fbmZldjsKKyAgICBJbmRleCBtX25qZXY7IAorICAgIFJlYWxTY2FsYXIgbV9mbm9ybTsgLy8gTm9ybSBvZiB0aGUgY3VycmVudCB2ZWN0b3IgZnVuY3Rpb24KKyAgICBSZWFsU2NhbGFyIG1fZ25vcm07IC8vTm9ybSBvZiB0aGUgZ3JhZGllbnQgb2YgdGhlIGVycm9yIAorICAgIFJlYWxTY2FsYXIgbV9mYWN0b3I7IC8vCisgICAgSW5kZXggbV9tYXhmZXY7IC8vIE1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGV2YWx1YXRpb24KKyAgICBSZWFsU2NhbGFyIG1fZnRvbDsgLy9Ub2xlcmFuY2UgaW4gdGhlIG5vcm0gb2YgdGhlIHZlY3RvciBmdW5jdGlvbgorICAgIFJlYWxTY2FsYXIgbV94dG9sOyAvLyAKKyAgICBSZWFsU2NhbGFyIG1fZ3RvbDsgLy90b2xlcmFuY2Ugb2YgdGhlIG5vcm0gb2YgdGhlIGVycm9yIGdyYWRpZW50CisgICAgUmVhbFNjYWxhciBtX2Vwc2ZjbjsgLy8KKyAgICBJbmRleCBtX2l0ZXI7IC8vIE51bWJlciBvZiBpdGVyYXRpb25zIHBlcmZvcm1lZAorICAgIFJlYWxTY2FsYXIgbV9kZWx0YTsKKyAgICBib29sIG1fdXNlRXh0ZXJuYWxTY2FsaW5nOworICAgIFBlcm11dGF0aW9uVHlwZSBtX3Blcm11dGF0aW9uOworICAgIEZWZWN0b3JUeXBlIG1fd2ExLCBtX3dhMiwgbV93YTMsIG1fd2E0OyAvL1RlbXBvcmFyeSB2ZWN0b3JzCisgICAgUmVhbFNjYWxhciBtX3BhcjsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsgLy8gQ2hlY2sgd2hldGhlciB0aGUgbWluaW1pemF0aW9uIHN0ZXAgaGFzIGJlZW4gY2FsbGVkCisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsgCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZT4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZT46Om1pbmltaXplKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIHN0YXR1cyA9IG1pbmltaXplSW5pdCh4KTsKKyAgICBpZiAoc3RhdHVzPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpIHsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBkbyB7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiB1diAiIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgICAgICAgc3RhdHVzID0gbWluaW1pemVPbmVTdGVwKHgpOworICAgIH0gd2hpbGUgKHN0YXR1cz09TGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJ1bm5pbmcpOworICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZT4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZT46Om1pbmltaXplSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworICAgIG0gPSBtX2Z1bmN0b3IudmFsdWVzKCk7CisKKyAgICBtX3dhMS5yZXNpemUobik7IG1fd2EyLnJlc2l6ZShuKTsgbV93YTMucmVzaXplKG4pOworICAgIG1fd2E0LnJlc2l6ZShtKTsKKyAgICBtX2Z2ZWMucmVzaXplKG0pOworICAgIC8vRklYTUUgU3BhcnNlIENhc2UgOiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGphY29iaWFuCisgICAgbV9mamFjLnJlc2l6ZShtLCBuKTsKKy8vICAgICBtX2ZqYWMucmVzZXJ2ZShWZWN0b3JYaTo6Q29uc3RhbnQobiw1KSk7IC8vIEZJWE1FIEZpbmQgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUKKyAgICBpZiAoIW1fdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBtX2RpYWcucmVzaXplKG4pOworICAgIGVpZ2VuX2Fzc2VydCggKCFtX3VzZUV4dGVybmFsU2NhbGluZyB8fCBtX2RpYWcuc2l6ZSgpPT1uKSAmJiAiV2hlbiBtX3VzZUV4dGVybmFsU2NhbGluZyBpcyBzZXQsIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgdmFsaWQgJ21fZGlhZyciKTsKKyAgICBtX3F0Zi5yZXNpemUobik7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgbV9uZmV2ID0gMDsKKyAgICBtX25qZXYgPSAwOworCisgICAgLyogICAgIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCBtX2Z0b2wgPCAwLiB8fCBtX3h0b2wgPCAwLiB8fCBtX2d0b2wgPCAwLiB8fCBtX21heGZldiA8PSAwIHx8IG1fZmFjdG9yIDw9IDAuKXsKKyAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisgICAgfQorCisgICAgaWYgKG1fdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKG1fZGlhZ1tqXSA8PSAwLikgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKyAgICAgICAgICAgIH0KKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbV9uZmV2ID0gMTsKKyAgICBpZiAoIG1fZnVuY3Rvcih4LCBtX2Z2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgbV9mbm9ybSA9IG1fZnZlYy5zdGFibGVOb3JtKCk7CisKKyAgICAvKiAgICAgaW5pdGlhbGl6ZSBsZXZlbmJlcmctbWFycXVhcmR0IHBhcmFtZXRlciBhbmQgaXRlcmF0aW9uIGNvdW50ZXIuICovCisgICAgbV9wYXIgPSAwLjsKKyAgICBtX2l0ZXIgPSAxOworCisgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpOb3RTdGFydGVkOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZT4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZT46OmxtZGVyMSgKKyAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBuID0geC5zaXplKCk7CisgICAgbSA9IG1fZnVuY3Rvci52YWx1ZXMoKTsKKworICAgIC8qIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCB0b2wgPCAwLikKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIHJlc2V0UGFyYW1ldGVycygpOworICAgIG1fZnRvbCA9IHRvbDsKKyAgICBtX3h0b2wgPSB0b2w7CisgICAgbV9tYXhmZXYgPSAxMDAqKG4rMSk7CisKKyAgICByZXR1cm4gbWluaW1pemUoeCk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGU+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGU+OjpsbWRpZjEoCisgICAgICAgIEZ1bmN0b3JUeXBlICZmdW5jdG9yLAorICAgICAgICBGVmVjdG9yVHlwZSAgJngsCisgICAgICAgIEluZGV4ICpuZmV2LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBJbmRleCBuID0geC5zaXplKCk7CisgICAgSW5kZXggbSA9IGZ1bmN0b3IudmFsdWVzKCk7CisKKyAgICAvKiBjaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgZXJyb3JzLiAqLworICAgIGlmIChuIDw9IDAgfHwgbSA8IG4gfHwgdG9sIDwgMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICBOdW1lcmljYWxEaWZmPEZ1bmN0b3JUeXBlPiBudW1EaWZmKGZ1bmN0b3IpOworICAgIC8vIGVtYmVkZGVkIExldmVuYmVyZ01hcnF1YXJkdAorICAgIExldmVuYmVyZ01hcnF1YXJkdDxOdW1lcmljYWxEaWZmPEZ1bmN0b3JUeXBlPiA+IGxtKG51bURpZmYpOworICAgIGxtLnNldEZ0b2wodG9sKTsKKyAgICBsbS5zZXRYdG9sKHRvbCk7CisgICAgbG0uc2V0TWF4ZmV2KDIwMCoobisxKSk7CisKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGluZm8gPSBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzKGxtLm1pbmltaXplKHgpKTsKKyAgICBpZiAobmZldikKKyAgICAgICAgKiBuZmV2ID0gbG0ubmZldigpOworICAgIHJldHVybiBpbmZvOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xFVkVOQkVSR01BUlFVQVJEVF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEV4cG9uZW50aWFsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEV4cG9uZW50aWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2ZDllMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4RXhwb25lbnRpYWwuaApAQCAtMCwwICsxLDQzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTMgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMyBDaGVuLVBhbmcgSGUgPGpkaDhAbXM2My5oaW5ldC5uZXQ+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWF9FWFBPTkVOVElBTAorI2RlZmluZSBFSUdFTl9NQVRSSVhfRVhQT05FTlRJQUwKKworI2luY2x1ZGUgIlN0ZW1GdW5jdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxicmllZiBTY2FsaW5nIG9wZXJhdG9yLgorICoKKyAqIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgQ3dpc2VVbmFyeU9wIHRvIHNjYWxlIGEgbWF0cml4IGJ5IFxmJCAyXnstc30gXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVhbFNjYWxhcj4KK3N0cnVjdCBNYXRyaXhFeHBvbmVudGlhbFNjYWxpbmdPcAoreworICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBccGFyYW1baW5dIHNxdWFyaW5ncyAgVGhlIGludGVnZXIgXGYkIHMgXGYkIGluIHRoaXMgZG9jdW1lbnQuCisgICAqLworICBNYXRyaXhFeHBvbmVudGlhbFNjYWxpbmdPcChpbnQgc3F1YXJpbmdzKSA6IG1fc3F1YXJpbmdzKHNxdWFyaW5ncykgeyB9CisKKworICAvKiogXGJyaWVmIFNjYWxlIGEgbWF0cml4IGNvZWZmaWNpZW50LgorICAgKgorICAgKiBccGFyYW1baW4sb3V0XSB4ICBUaGUgc2NhbGFyIHRvIGJlIHNjYWxlZCwgYmVjb21pbmcgXGYkIDJeey1zfSB4IFxmJC4KKyAgICovCisgIGlubGluZSBjb25zdCBSZWFsU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFJlYWxTY2FsYXImIHgpIGNvbnN0CisgIHsKKyAgICB1c2luZyBzdGQ6OmxkZXhwOworICAgIHJldHVybiBsZGV4cCh4LCAtbV9zcXVhcmluZ3MpOworICB9CisKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKworICAvKiogXGJyaWVmIFNjYWxlIGEgbWF0cml4IGNvZWZmaWNpZW50LgorICAgKgorICAgKiBccGFyYW1baW4sb3V0XSB4ICBUaGUgc2NhbGFyIHRvIGJlIHNjYWxlZCwgYmVjb21pbmcgXGYkIDJeey1zfSB4IFxmJC4KKyAgICovCisgIGlubGluZSBjb25zdCBDb21wbGV4U2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IENvbXBsZXhTY2FsYXImIHgpIGNvbnN0CisgIHsKKyAgICB1c2luZyBzdGQ6OmxkZXhwOworICAgIHJldHVybiBDb21wbGV4U2NhbGFyKGxkZXhwKHgucmVhbCgpLCAtbV9zcXVhcmluZ3MpLCBsZGV4cCh4LmltYWcoKSwgLW1fc3F1YXJpbmdzKSk7CisgIH0KKworICBwcml2YXRlOgorICAgIGludCBtX3NxdWFyaW5nczsKK307CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDMsMyktUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICoKKyAqICBBZnRlciBleGl0LCBcZiQgKFYrVSkoVi1VKV57LTF9IFxmJCBpcyB0aGUgUGFkJmVhY3V0ZTsKKyAqICBhcHByb3hpbWFudCBvZiBcZiQgXGV4cChBKSBcZiQgYXJvdW5kIFxmJCBBID0gMCBcZiQuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRBLCB0eXBlbmFtZSBNYXRVLCB0eXBlbmFtZSBNYXRWPgordm9pZCBtYXRyaXhfZXhwX3BhZGUzKGNvbnN0IE1hdEEmIEEsIE1hdFUmIFUsIE1hdFYmIFYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0QTo6UGxhaW5PYmplY3QgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPE1hdEE+OjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGNvbnN0IFJlYWxTY2FsYXIgYltdID0gezEyMC5MLCA2MC5MLCAxMi5MLCAxLkx9OworICBjb25zdCBNYXRyaXhUeXBlIEEyID0gQSAqIEE7CisgIGNvbnN0IE1hdHJpeFR5cGUgdG1wID0gYlszXSAqIEEyICsgYlsxXSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KEEucm93cygpLCBBLmNvbHMoKSk7CisgIFUubm9hbGlhcygpID0gQSAqIHRtcDsKKyAgViA9IGJbMl0gKiBBMiArIGJbMF0gKiBNYXRyaXhUeXBlOjpJZGVudGl0eShBLnJvd3MoKSwgQS5jb2xzKCkpOworfQorCisvKiogXGJyaWVmIENvbXB1dGUgdGhlICg1LDUpLVBhZCZlYWN1dGU7IGFwcHJveGltYW50IHRvIHRoZSBleHBvbmVudGlhbC4KKyAqCisgKiAgQWZ0ZXIgZXhpdCwgXGYkIChWK1UpKFYtVSleey0xfSBcZiQgaXMgdGhlIFBhZCZlYWN1dGU7CisgKiAgYXBwcm94aW1hbnQgb2YgXGYkIFxleHAoQSkgXGYkIGFyb3VuZCBcZiQgQSA9IDAgXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgTWF0VSwgdHlwZW5hbWUgTWF0Vj4KK3ZvaWQgbWF0cml4X2V4cF9wYWRlNShjb25zdCBNYXRBJiBBLCBNYXRVJiBVLCBNYXRWJiBWKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdEE6OlBsYWluT2JqZWN0IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBjb25zdCBSZWFsU2NhbGFyIGJbXSA9IHszMDI0MC5MLCAxNTEyMC5MLCAzMzYwLkwsIDQyMC5MLCAzMC5MLCAxLkx9OworICBjb25zdCBNYXRyaXhUeXBlIEEyID0gQSAqIEE7CisgIGNvbnN0IE1hdHJpeFR5cGUgQTQgPSBBMiAqIEEyOworICBjb25zdCBNYXRyaXhUeXBlIHRtcCA9IGJbNV0gKiBBNCArIGJbM10gKiBBMiArIGJbMV0gKiBNYXRyaXhUeXBlOjpJZGVudGl0eShBLnJvd3MoKSwgQS5jb2xzKCkpOworICBVLm5vYWxpYXMoKSA9IEEgKiB0bXA7CisgIFYgPSBiWzRdICogQTQgKyBiWzJdICogQTIgKyBiWzBdICogTWF0cml4VHlwZTo6SWRlbnRpdHkoQS5yb3dzKCksIEEuY29scygpKTsKK30KKworLyoqIFxicmllZiBDb21wdXRlIHRoZSAoNyw3KS1QYWQmZWFjdXRlOyBhcHByb3hpbWFudCB0byB0aGUgZXhwb25lbnRpYWwuCisgKgorICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICogIGFwcHJveGltYW50IG9mIFxmJCBcZXhwKEEpIFxmJCBhcm91bmQgXGYkIEEgPSAwIFxmJC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdEEsIHR5cGVuYW1lIE1hdFUsIHR5cGVuYW1lIE1hdFY+Cit2b2lkIG1hdHJpeF9leHBfcGFkZTcoY29uc3QgTWF0QSYgQSwgTWF0VSYgVSwgTWF0ViYgVikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRBOjpQbGFpbk9iamVjdCBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7MTcyOTcyODAuTCwgODY0ODY0MC5MLCAxOTk1ODQwLkwsIDI3NzIwMC5MLCAyNTIwMC5MLCAxNTEyLkwsIDU2LkwsIDEuTH07CisgIGNvbnN0IE1hdHJpeFR5cGUgQTIgPSBBICogQTsKKyAgY29uc3QgTWF0cml4VHlwZSBBNCA9IEEyICogQTI7CisgIGNvbnN0IE1hdHJpeFR5cGUgQTYgPSBBNCAqIEEyOworICBjb25zdCBNYXRyaXhUeXBlIHRtcCA9IGJbN10gKiBBNiArIGJbNV0gKiBBNCArIGJbM10gKiBBMiAKKyAgICArIGJbMV0gKiBNYXRyaXhUeXBlOjpJZGVudGl0eShBLnJvd3MoKSwgQS5jb2xzKCkpOworICBVLm5vYWxpYXMoKSA9IEEgKiB0bXA7CisgIFYgPSBiWzZdICogQTYgKyBiWzRdICogQTQgKyBiWzJdICogQTIgKyBiWzBdICogTWF0cml4VHlwZTo6SWRlbnRpdHkoQS5yb3dzKCksIEEuY29scygpKTsKKworfQorCisvKiogXGJyaWVmIENvbXB1dGUgdGhlICg5LDkpLVBhZCZlYWN1dGU7IGFwcHJveGltYW50IHRvIHRoZSBleHBvbmVudGlhbC4KKyAqCisgKiAgQWZ0ZXIgZXhpdCwgXGYkIChWK1UpKFYtVSleey0xfSBcZiQgaXMgdGhlIFBhZCZlYWN1dGU7CisgKiAgYXBwcm94aW1hbnQgb2YgXGYkIFxleHAoQSkgXGYkIGFyb3VuZCBcZiQgQSA9IDAgXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgTWF0VSwgdHlwZW5hbWUgTWF0Vj4KK3ZvaWQgbWF0cml4X2V4cF9wYWRlOShjb25zdCBNYXRBJiBBLCBNYXRVJiBVLCBNYXRWJiBWKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdEE6OlBsYWluT2JqZWN0IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBjb25zdCBSZWFsU2NhbGFyIGJbXSA9IHsxNzY0MzIyNTYwMC5MLCA4ODIxNjEyODAwLkwsIDIwNzU2NzM2MDAuTCwgMzAyNzAyNDAwLkwsIDMwMjcwMjQwLkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNjIxNjAuTCwgMTEwODgwLkwsIDM5NjAuTCwgOTAuTCwgMS5MfTsKKyAgY29uc3QgTWF0cml4VHlwZSBBMiA9IEEgKiBBOworICBjb25zdCBNYXRyaXhUeXBlIEE0ID0gQTIgKiBBMjsKKyAgY29uc3QgTWF0cml4VHlwZSBBNiA9IEE0ICogQTI7CisgIGNvbnN0IE1hdHJpeFR5cGUgQTggPSBBNiAqIEEyOworICBjb25zdCBNYXRyaXhUeXBlIHRtcCA9IGJbOV0gKiBBOCArIGJbN10gKiBBNiArIGJbNV0gKiBBNCArIGJbM10gKiBBMiAKKyAgICArIGJbMV0gKiBNYXRyaXhUeXBlOjpJZGVudGl0eShBLnJvd3MoKSwgQS5jb2xzKCkpOworICBVLm5vYWxpYXMoKSA9IEEgKiB0bXA7CisgIFYgPSBiWzhdICogQTggKyBiWzZdICogQTYgKyBiWzRdICogQTQgKyBiWzJdICogQTIgKyBiWzBdICogTWF0cml4VHlwZTo6SWRlbnRpdHkoQS5yb3dzKCksIEEuY29scygpKTsKK30KKworLyoqIFxicmllZiBDb21wdXRlIHRoZSAoMTMsMTMpLVBhZCZlYWN1dGU7IGFwcHJveGltYW50IHRvIHRoZSBleHBvbmVudGlhbC4KKyAqCisgKiAgQWZ0ZXIgZXhpdCwgXGYkIChWK1UpKFYtVSleey0xfSBcZiQgaXMgdGhlIFBhZCZlYWN1dGU7CisgKiAgYXBwcm94aW1hbnQgb2YgXGYkIFxleHAoQSkgXGYkIGFyb3VuZCBcZiQgQSA9IDAgXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgTWF0VSwgdHlwZW5hbWUgTWF0Vj4KK3ZvaWQgbWF0cml4X2V4cF9wYWRlMTMoY29uc3QgTWF0QSYgQSwgTWF0VSYgVSwgTWF0ViYgVikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRBOjpQbGFpbk9iamVjdCBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7NjQ3NjQ3NTI1MzI0ODAwMDAuTCwgMzIzODIzNzYyNjYyNDAwMDAuTCwgNzc3MTc3MDMwMzg5NzYwMC5MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxMTg3MzUzNzk2NDI4ODAwLkwsIDEyOTA2MDE5NTI2NDAwMC5MLCAxMDU1OTQ3MDUyMTYwMC5MLCA2NzA0NDI1NzI4MDAuTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzM1MjIxMjg2NDAuTCwgMTMyMzI0MTkyMC5MLCA0MDg0MDgwMC5MLCA5NjA5NjAuTCwgMTYzODAuTCwgMTgyLkwsIDEuTH07CisgIGNvbnN0IE1hdHJpeFR5cGUgQTIgPSBBICogQTsKKyAgY29uc3QgTWF0cml4VHlwZSBBNCA9IEEyICogQTI7CisgIGNvbnN0IE1hdHJpeFR5cGUgQTYgPSBBNCAqIEEyOworICBWID0gYlsxM10gKiBBNiArIGJbMTFdICogQTQgKyBiWzldICogQTI7IC8vIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgIE1hdHJpeFR5cGUgdG1wID0gQTYgKiBWOworICB0bXAgKz0gYls3XSAqIEE2ICsgYls1XSAqIEE0ICsgYlszXSAqIEEyICsgYlsxXSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KEEucm93cygpLCBBLmNvbHMoKSk7CisgIFUubm9hbGlhcygpID0gQSAqIHRtcDsKKyAgdG1wID0gYlsxMl0gKiBBNiArIGJbMTBdICogQTQgKyBiWzhdICogQTI7CisgIFYubm9hbGlhcygpID0gQTYgKiB0bXA7CisgIFYgKz0gYls2XSAqIEE2ICsgYls0XSAqIEE0ICsgYlsyXSAqIEEyICsgYlswXSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KEEucm93cygpLCBBLmNvbHMoKSk7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDE3LDE3KS1QYWQmZWFjdXRlOyBhcHByb3hpbWFudCB0byB0aGUgZXhwb25lbnRpYWwuCisgKgorICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICogIGFwcHJveGltYW50IG9mIFxmJCBcZXhwKEEpIFxmJCBhcm91bmQgXGYkIEEgPSAwIFxmJC4KKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBhY3RpdmF0ZXMgb25seSBpZiB5b3VyIGxvbmcgZG91YmxlIGlzIGRvdWJsZS1kb3VibGUgb3IgcXVhZHJ1cGxlLgorICovCisjaWYgTERCTF9NQU5UX0RJRyA+IDY0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgTWF0VSwgdHlwZW5hbWUgTWF0Vj4KK3ZvaWQgbWF0cml4X2V4cF9wYWRlMTcoY29uc3QgTWF0QSYgQSwgTWF0VSYgVSwgTWF0ViYgVikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRBOjpQbGFpbk9iamVjdCBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7ODMwMDM0Mzk0NTgwNjI4MzU3MTIwMDAwLkwsIDQxNTAxNzE5NzI5MDMxNDE3ODU2MDAwMC5MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2MTAyMjk2NDYxMzY3NzA1NjAwMDAuTCwgMTU3MjAzNDgzODIyMDg4NzA0MDAwMDAuTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTc3NDg3ODA0MzE1MjYxNDQwMDAwMC5MLCAxNTM4MjI3NjM3Mzk4OTMyNDgwMDAuTCwgMTA2MDg0NjY0NjQ4MjAyMjQwMDAuTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNTk1MzczMTE3OTIzNTg0MDAwLkwsIDI3NTYzNTcwMjc0MjQwMDAwLkwsIDEwNjAxMzczMTgyNDAwMDAuTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzM5MjQzOTQxODM2ODAuTCwgODk5NTEwNDUxODQwLkwsIDE5NTU0NTc1MDQwLkwsIDM0MTg2MzIwMC5MLCA0NjUxMjAwLkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2NTEyLkwsIDMwNi5MLCAxLkx9OworICBjb25zdCBNYXRyaXhUeXBlIEEyID0gQSAqIEE7CisgIGNvbnN0IE1hdHJpeFR5cGUgQTQgPSBBMiAqIEEyOworICBjb25zdCBNYXRyaXhUeXBlIEE2ID0gQTQgKiBBMjsKKyAgY29uc3QgTWF0cml4VHlwZSBBOCA9IEE0ICogQTQ7CisgIFYgPSBiWzE3XSAqIEE4ICsgYlsxNV0gKiBBNiArIGJbMTNdICogQTQgKyBiWzExXSAqIEEyOyAvLyB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQorICBNYXRyaXhUeXBlIHRtcCA9IEE4ICogVjsKKyAgdG1wICs9IGJbOV0gKiBBOCArIGJbN10gKiBBNiArIGJbNV0gKiBBNCArIGJbM10gKiBBMiAKKyAgICArIGJbMV0gKiBNYXRyaXhUeXBlOjpJZGVudGl0eShBLnJvd3MoKSwgQS5jb2xzKCkpOworICBVLm5vYWxpYXMoKSA9IEEgKiB0bXA7CisgIHRtcCA9IGJbMTZdICogQTggKyBiWzE0XSAqIEE2ICsgYlsxMl0gKiBBNCArIGJbMTBdICogQTI7CisgIFYubm9hbGlhcygpID0gdG1wICogQTg7CisgIFYgKz0gYls4XSAqIEE4ICsgYls2XSAqIEE2ICsgYls0XSAqIEE0ICsgYlsyXSAqIEEyIAorICAgICsgYlswXSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KEEucm93cygpLCBBLmNvbHMoKSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXIgPSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpSZWFsPgorc3RydWN0IG1hdHJpeF9leHBfY29tcHV0ZVVWCit7CisgIC8qKiBcYnJpZWYgQ29tcHV0ZSBQYWQmZWFjdXRlOyBhcHByb3hpbWFudCB0byB0aGUgZXhwb25lbnRpYWwuCisgICAgKgorICAgICogQ29tcHV0ZXMgXGMgVSwgXGMgViBhbmQgXGMgc3F1YXJpbmdzIHN1Y2ggdGhhdCBcZiQgKFYrVSkoVi1VKV57LTF9IFxmJCBpcyBhIFBhZCZlYWN1dGU7CisgICAgKiBhcHByb3hpbWFudCBvZiBcZiQgXGV4cCgyXnstXG1ib3h7c3F1YXJpbmdzfX1NKSBcZiQgYXJvdW5kIFxmJCBNID0gMCBcZiQsIHdoZXJlIFxmJCBNIFxmJAorICAgICogZGVub3RlcyB0aGUgbWF0cml4IFxjIGFyZy4gVGhlIGRlZ3JlZSBvZiB0aGUgUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgYW5kIHRoZSB2YWx1ZSBvZiBzcXVhcmluZ3MKKyAgICAqIGFyZSBjaG9zZW4gc3VjaCB0aGF0IHRoZSBhcHByb3hpbWF0aW9uIGVycm9yIGlzIG5vIG1vcmUgdGhhbiB0aGUgcm91bmQtb2ZmIGVycm9yLgorICAgICovCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBhcmcsIE1hdHJpeFR5cGUmIFUsIE1hdHJpeFR5cGUmIFYsIGludCYgc3F1YXJpbmdzKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IG1hdHJpeF9leHBfY29tcHV0ZVVWPE1hdHJpeFR5cGUsIGZsb2F0PgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IEFyZ1R5cGUmIGFyZywgTWF0cml4VHlwZSYgVSwgTWF0cml4VHlwZSYgViwgaW50JiBzcXVhcmluZ3MpCisgIHsKKyAgICB1c2luZyBzdGQ6OmZyZXhwOworICAgIHVzaW5nIHN0ZDo6cG93OworICAgIGNvbnN0IGZsb2F0IGwxbm9ybSA9IGFyZy5jd2lzZUFicygpLmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICAgIHNxdWFyaW5ncyA9IDA7CisgICAgaWYgKGwxbm9ybSA8IDQuMjU4NzMwMDE2OTIyODMxZS0wMDFmKSB7CisgICAgICBtYXRyaXhfZXhwX3BhZGUzKGFyZywgVSwgVik7CisgICAgfSBlbHNlIGlmIChsMW5vcm0gPCAxLjg4MDE1MjY3NzgwNDc2MmUrMDAwZikgeworICAgICAgbWF0cml4X2V4cF9wYWRlNShhcmcsIFUsIFYpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBmbG9hdCBtYXhub3JtID0gMy45MjU3MjQ3ODMxMzg2NjBmOworICAgICAgZnJleHAobDFub3JtIC8gbWF4bm9ybSwgJnNxdWFyaW5ncyk7CisgICAgICBpZiAoc3F1YXJpbmdzIDwgMCkgc3F1YXJpbmdzID0gMDsKKyAgICAgIE1hdHJpeFR5cGUgQSA9IGFyZy51bmFyeUV4cHIoTWF0cml4RXhwb25lbnRpYWxTY2FsaW5nT3A8ZmxvYXQ+KHNxdWFyaW5ncykpOworICAgICAgbWF0cml4X2V4cF9wYWRlNyhBLCBVLCBWKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IG1hdHJpeF9leHBfY29tcHV0ZVVWPE1hdHJpeFR5cGUsIGRvdWJsZT4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBBcmdUeXBlJiBhcmcsIE1hdHJpeFR5cGUmIFUsIE1hdHJpeFR5cGUmIFYsIGludCYgc3F1YXJpbmdzKQorICB7CisgICAgdXNpbmcgc3RkOjpmcmV4cDsKKyAgICB1c2luZyBzdGQ6OnBvdzsKKyAgICBjb25zdCBkb3VibGUgbDFub3JtID0gYXJnLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CisgICAgc3F1YXJpbmdzID0gMDsKKyAgICBpZiAobDFub3JtIDwgMS40OTU1ODUyMTc5NTgyOTJlLTAwMikgeworICAgICAgbWF0cml4X2V4cF9wYWRlMyhhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgMi41MzkzOTgzMzAwNjMyMzBlLTAwMSkgeworICAgICAgbWF0cml4X2V4cF9wYWRlNShhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgOS41MDQxNzg5OTYxNjI5MzJlLTAwMSkgeworICAgICAgbWF0cml4X2V4cF9wYWRlNyhhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgMi4wOTc4NDc5NjEyNTcwNjhlKzAwMCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlOShhcmcsIFUsIFYpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBkb3VibGUgbWF4bm9ybSA9IDUuMzcxOTIwMzUxMTQ4MTUyOworICAgICAgZnJleHAobDFub3JtIC8gbWF4bm9ybSwgJnNxdWFyaW5ncyk7CisgICAgICBpZiAoc3F1YXJpbmdzIDwgMCkgc3F1YXJpbmdzID0gMDsKKyAgICAgIE1hdHJpeFR5cGUgQSA9IGFyZy51bmFyeUV4cHIoTWF0cml4RXhwb25lbnRpYWxTY2FsaW5nT3A8ZG91YmxlPihzcXVhcmluZ3MpKTsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTEzKEEsIFUsIFYpOworICAgIH0KKyAgfQorfTsKKyAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBtYXRyaXhfZXhwX2NvbXB1dGVVVjxNYXRyaXhUeXBlLCBsb25nIGRvdWJsZT4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBBcmdUeXBlJiBhcmcsIE1hdHJpeFR5cGUmIFUsIE1hdHJpeFR5cGUmIFYsIGludCYgc3F1YXJpbmdzKQorICB7CisjaWYgICBMREJMX01BTlRfRElHID09IDUzICAgLy8gZG91YmxlIHByZWNpc2lvbgorICAgIG1hdHJpeF9leHBfY29tcHV0ZVVWPE1hdHJpeFR5cGUsIGRvdWJsZT46OnJ1bihhcmcsIFUsIFYsIHNxdWFyaW5ncyk7CisgIAorI2Vsc2UKKyAgCisgICAgdXNpbmcgc3RkOjpmcmV4cDsKKyAgICB1c2luZyBzdGQ6OnBvdzsKKyAgICBjb25zdCBsb25nIGRvdWJsZSBsMW5vcm0gPSBhcmcuY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCkubWF4Q29lZmYoKTsKKyAgICBzcXVhcmluZ3MgPSAwOworICAKKyNpZiBMREJMX01BTlRfRElHIDw9IDY0ICAgLy8gZXh0ZW5kZWQgcHJlY2lzaW9uCisgIAorICAgIGlmIChsMW5vcm0gPCA0LjE5Njg0OTcyMzIyNjY5ODk2NzFlLTAwM0wpIHsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTMoYXJnLCBVLCBWKTsKKyAgICB9IGVsc2UgaWYgKGwxbm9ybSA8IDEuMTg0ODExNjczNDY5MzgyMzA5MWUtMDAxTCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlNShhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgNS41MTcwMzg4NDgwNjg2NzAwMjc0ZS0wMDFMKSB7CisgICAgICBtYXRyaXhfZXhwX3BhZGU3KGFyZywgVSwgVik7CisgICAgfSBlbHNlIGlmIChsMW5vcm0gPCAxLjM3NTk4Njg4NzU1ODc4NDUzODNlKzAwMEwpIHsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTkoYXJnLCBVLCBWKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgbG9uZyBkb3VibGUgbWF4bm9ybSA9IDQuMDI0NjA5ODkwNjY5NzM1MzA2M0w7CisgICAgICBmcmV4cChsMW5vcm0gLyBtYXhub3JtLCAmc3F1YXJpbmdzKTsKKyAgICAgIGlmIChzcXVhcmluZ3MgPCAwKSBzcXVhcmluZ3MgPSAwOworICAgICAgTWF0cml4VHlwZSBBID0gYXJnLnVuYXJ5RXhwcihNYXRyaXhFeHBvbmVudGlhbFNjYWxpbmdPcDxsb25nIGRvdWJsZT4oc3F1YXJpbmdzKSk7CisgICAgICBtYXRyaXhfZXhwX3BhZGUxMyhBLCBVLCBWKTsKKyAgICB9CisgIAorI2VsaWYgTERCTF9NQU5UX0RJRyA8PSAxMDYgIC8vIGRvdWJsZS1kb3VibGUKKyAgCisgICAgaWYgKGwxbm9ybSA8IDMuMjc4Nzg5MjIwNTYwNzAyNjk5Mjk0NzQ4ODEwODIxM2UtMDA1TCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlMyhhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgNi40NDY3MDI1MDYwMDcyNzYwMDg0MTMwOTA2MDc2MzMyZS0wMDNMKSB7CisgICAgICBtYXRyaXhfZXhwX3BhZGU1KGFyZywgVSwgVik7CisgICAgfSBlbHNlIGlmIChsMW5vcm0gPCA2Ljg5ODgwMjg0OTY1OTUzNzQ3NTEzNzQxMjI4ODExNDNlLTAwMkwpIHsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTcoYXJnLCBVLCBWKTsKKyAgICB9IGVsc2UgaWYgKGwxbm9ybSA8IDIuNzMzOTczNzUxODUwMjIzMTc0MTQ5NTg1NzIwMTY3MGUtMDAxTCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlOShhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgMS4zMjAzMzgyMDk2NTE0NDc0OTA1NjY2NDQ4ODUwMjc4ZSswMDBMKSB7CisgICAgICBtYXRyaXhfZXhwX3BhZGUxMyhhcmcsIFUsIFYpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBsb25nIGRvdWJsZSBtYXhub3JtID0gMy4yNTc5NDQwODk1NDA1NDAwODU2NTk5NjYzNzIzNTE3TDsKKyAgICAgIGZyZXhwKGwxbm9ybSAvIG1heG5vcm0sICZzcXVhcmluZ3MpOworICAgICAgaWYgKHNxdWFyaW5ncyA8IDApIHNxdWFyaW5ncyA9IDA7CisgICAgICBNYXRyaXhUeXBlIEEgPSBhcmcudW5hcnlFeHByKE1hdHJpeEV4cG9uZW50aWFsU2NhbGluZ09wPGxvbmcgZG91YmxlPihzcXVhcmluZ3MpKTsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTE3KEEsIFUsIFYpOworICAgIH0KKyAgCisjZWxpZiBMREJMX01BTlRfRElHIDw9IDExMiAgLy8gcXVhZHJ1cGxlIHByZWNpc29uCisgIAorICAgIGlmIChsMW5vcm0gPCAxLjYzOTM5NDYxMDI4ODkxODY5MDU0NzQ2Nzk1NDQ2Njk3MGUtMDA1TCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlMyhhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgNC4yNTMyMzc3MTIxNjUyNzU1NjYwMjU4ODQzNDQ0MzMwMDllLTAwM0wpIHsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTUoYXJnLCBVLCBWKTsKKyAgICB9IGVsc2UgaWYgKGwxbm9ybSA8IDUuMTI1ODA0MDYzMTY1NzY0NDA5ODg1MTIyMDMyOTMzMTQyZS0wMDJMKSB7CisgICAgICBtYXRyaXhfZXhwX3BhZGU3KGFyZywgVSwgVik7CisgICAgfSBlbHNlIGlmIChsMW5vcm0gPCAyLjE3MDAwMDc2NTE2MTE1NTE5NTQ1MzIwNTY1MTg4OTg1M2UtMDAxTCkgeworICAgICAgbWF0cml4X2V4cF9wYWRlOShhcmcsIFUsIFYpOworICAgIH0gZWxzZSBpZiAobDFub3JtIDwgMS4xMjUzNTgzODM0NTMxNDMwNjUwODEzOTc4ODI4OTE4NzhlKzAwMEwpIHsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTEzKGFyZywgVSwgVik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZyZXhwKGwxbm9ybSAvIG1heG5vcm0sICZzcXVhcmluZ3MpOworICAgICAgaWYgKHNxdWFyaW5ncyA8IDApIHNxdWFyaW5ncyA9IDA7CisgICAgICBNYXRyaXhUeXBlIEEgPSBhcmcudW5hcnlFeHByKE1hdHJpeEV4cG9uZW50aWFsU2NhbGluZ09wPGxvbmcgZG91YmxlPihzcXVhcmluZ3MpKTsKKyAgICAgIG1hdHJpeF9leHBfcGFkZTE3KEEsIFUsIFYpOworICAgIH0KKyAgCisjZWxzZQorICAKKyAgICAvLyB0aGlzIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQgaW4gY29tcHV0ZSgpCisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJCdWcgaW4gTWF0cml4RXhwb25lbnRpYWwiKTsgCisgIAorI2VuZGlmCisjZW5kaWYgIC8vIExEQkxfTUFOVF9ESUcKKyAgfQorfTsKKworCisvKiBDb21wdXRlcyB0aGUgbWF0cml4IGV4cG9uZW50aWFsCisgKgorICogXHBhcmFtIGFyZyAgICBhcmd1bWVudCBvZiBtYXRyaXggZXhwb25lbnRpYWwgKHNob3VsZCBiZSBwbGFpbiBvYmplY3QpCisgKiBccGFyYW0gcmVzdWx0IHZhcmlhYmxlIGluIHdoaWNoIHJlc3VsdCB3aWxsIGJlIHN0b3JlZAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgbWF0cml4X2V4cF9jb21wdXRlKGNvbnN0IEFyZ1R5cGUmIGFyZywgUmVzdWx0VHlwZSAmcmVzdWx0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIEFyZ1R5cGU6OlBsYWluT2JqZWN0IE1hdHJpeFR5cGU7CisjaWYgTERCTF9NQU5UX0RJRyA+IDExMiAvLyByYXJlbHkgaGFwcGVucworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworICBpZiAoc2l6ZW9mKFJlYWxTY2FsYXIpID4gMTQpIHsKKyAgICByZXN1bHQgPSBhcmcubWF0cml4RnVuY3Rpb24oaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb25fZXhwPENvbXBsZXhTY2FsYXI+KTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorICBNYXRyaXhUeXBlIFUsIFY7CisgIGludCBzcXVhcmluZ3M7IAorICBtYXRyaXhfZXhwX2NvbXB1dGVVVjxNYXRyaXhUeXBlPjo6cnVuKGFyZywgVSwgViwgc3F1YXJpbmdzKTsgLy8gUGFkZSBhcHByb3hpbWFudCBpcyAoVStWKSAvICgtVStWKQorICBNYXRyaXhUeXBlIG51bWVyID0gVSArIFY7CisgIE1hdHJpeFR5cGUgZGVub20gPSAtVSArIFY7CisgIHJlc3VsdCA9IGRlbm9tLnBhcnRpYWxQaXZMdSgpLnNvbHZlKG51bWVyKTsKKyAgZm9yIChpbnQgaT0wOyBpPHNxdWFyaW5nczsgaSsrKQorICAgIHJlc3VsdCAqPSByZXN1bHQ7ICAgLy8gdW5kbyBzY2FsaW5nIGJ5IHJlcGVhdGVkIHNxdWFyaW5nCit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbjo6aW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgIFR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggZXhwb25lbnRpYWwuCisgICoKKyAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IGV4cG9uZW50aWFsIHVudGlsIGl0IGlzIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3IKKyAgKiBzb21lIG90aGVyIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50IHNob3VsZCBub3QgYmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUKKyAgKiBvZiBNYXRyaXhCYXNlOjpleHAoKSBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWUKKzogcHVibGljIFJldHVybkJ5VmFsdWU8TWF0cml4RXhwb25lbnRpYWxSZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgcHVibGljOgorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBzcmMgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlIG1hdHJpeCBleHBvbmVudGlhbC4KKyAgICAgICovCisgICAgTWF0cml4RXhwb25lbnRpYWxSZXR1cm5WYWx1ZShjb25zdCBEZXJpdmVkJiBzcmMpIDogbV9zcmMoc3JjKSB7IH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgbWF0cml4IGV4cG9uZW50aWFsLgorICAgICAgKgorICAgICAgKiBccGFyYW0gcmVzdWx0IHRoZSBtYXRyaXggZXhwb25lbnRpYWwgb2YgXHAgc3JjIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwgMTA+Ojp0eXBlIHRtcChtX3NyYyk7CisgICAgICBpbnRlcm5hbDo6bWF0cml4X2V4cF9jb21wdXRlKHRtcCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9zcmMucm93cygpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLmNvbHMoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPERlcml2ZWQ+Ojp0eXBlIG1fc3JjOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdHJhaXRzPE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6ZXhwKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICByZXR1cm4gTWF0cml4RXhwb25lbnRpYWxSZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BVFJJWF9FWFBPTkVOVElBTApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhGdW5jdGlvbi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhGdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmN2Q3NzcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEZ1bmN0aW9uLmgKQEAgLTAsMCArMSw1ODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEsIDIwMTMgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX0ZVTkNUSU9OCisjZGVmaW5lIEVJR0VOX01BVFJJWF9GVU5DVElPTgorCisjaW5jbHVkZSAiU3RlbUZ1bmN0aW9uLmgiCisKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcYnJpZWYgTWF4aW11bSBkaXN0YW5jZSBhbGxvd2VkIGJldHdlZW4gZWlnZW52YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCAiY2xvc2UiLiAqLworc3RhdGljIGNvbnN0IGZsb2F0IG1hdHJpeF9mdW5jdGlvbl9zZXBhcmF0aW9uID0gMC4xZjsKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKiBcY2xhc3MgTWF0cml4RnVuY3Rpb25BdG9taWMKKyAgKiBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9ucyBvZiBhdG9taWMgbWF0cmljZXMuCisgICoKKyAgKiBIZXJlLCBhbiBhdG9taWMgbWF0cml4IGlzIGEgdHJpYW5ndWxhciBtYXRyaXggd2hvc2UgZGlhZ29uYWwgZW50cmllcyBhcmUgY2xvc2UgdG8gZWFjaCBvdGhlci4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgTWF0cml4RnVuY3Rpb25BdG9taWMgCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6dHlwZSBTdGVtRnVuY3Rpb247CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yCisgICAgICAqIFxwYXJhbVtpbl0gIGYgIG1hdHJpeCBmdW5jdGlvbiB0byBjb21wdXRlLgorICAgICAgKi8KKyAgICBNYXRyaXhGdW5jdGlvbkF0b21pYyhTdGVtRnVuY3Rpb24gZikgOiBtX2YoZikgeyB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBtYXRyaXgKKyAgICAgICogXHBhcmFtW2luXSAgQSAgYXJndW1lbnQgb2YgbWF0cml4IGZ1bmN0aW9uLCBzaG91bGQgYmUgdXBwZXIgdHJpYW5ndWxhciBhbmQgYXRvbWljCisgICAgICAqIFxyZXR1cm5zICBmKEEpLCB0aGUgbWF0cml4IGZ1bmN0aW9uIGV2YWx1YXRlZCBhdCB0aGUgZ2l2ZW4gbWF0cml4CisgICAgICAqLworICAgIE1hdHJpeFR5cGUgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBBKTsKKworICBwcml2YXRlOgorICAgIFN0ZW1GdW5jdGlvbiogbV9mOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZV9tdShjb25zdCBNYXRyaXhUeXBlJiBBKQoreworICB0eXBlZGVmIHR5cGVuYW1lIHBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIFZlY3RvclR5cGU7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJvd3MgPSBBLnJvd3MoKTsKKyAgY29uc3QgTWF0cml4VHlwZSBOID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cykgLSBBOworICBWZWN0b3JUeXBlIGUgPSBWZWN0b3JUeXBlOjpPbmVzKHJvd3MpOworICBOLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlSW5QbGFjZShlKTsKKyAgcmV0dXJuIGUuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgTWF0cml4RnVuY3Rpb25BdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgLy8gVE9ETzogVXNlIHRoYXQgQSBpcyB1cHBlciB0cmlhbmd1bGFyCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IEEucm93cygpOworICBTY2FsYXIgYXZnRWl2YWwgPSBBLnRyYWNlKCkgLyBTY2FsYXIoUmVhbFNjYWxhcihyb3dzKSk7CisgIE1hdHJpeFR5cGUgQXNoaWZ0ZWQgPSBBIC0gYXZnRWl2YWwgKiBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKTsKKyAgUmVhbFNjYWxhciBtdSA9IG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlX211KEFzaGlmdGVkKTsKKyAgTWF0cml4VHlwZSBGID0gbV9mKGF2Z0VpdmFsLCAwKSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpOworICBNYXRyaXhUeXBlIFAgPSBBc2hpZnRlZDsKKyAgTWF0cml4VHlwZSBGaW5jcjsKKyAgZm9yIChJbmRleCBzID0gMTsgcyA8IDEuMSAqIHJvd3MgKyAxMDsgcysrKSB7IC8vIHVwcGVyIGxpbWl0IGlzIGZhaXJseSBhcmJpdHJhcnkKKyAgICBGaW5jciA9IG1fZihhdmdFaXZhbCwgc3RhdGljX2Nhc3Q8aW50PihzKSkgKiBQOworICAgIEYgKz0gRmluY3I7CisgICAgUCA9IFNjYWxhcihSZWFsU2NhbGFyKDEuMC8ocyArIDEpKSkgKiBQICogQXNoaWZ0ZWQ7CisKKyAgICAvLyB0ZXN0IHdoZXRoZXIgVGF5bG9yIHNlcmllcyBjb252ZXJnZWQKKyAgICBjb25zdCBSZWFsU2NhbGFyIEZfbm9ybSA9IEYuY3dpc2VBYnMoKS5yb3d3aXNlKCkuc3VtKCkubWF4Q29lZmYoKTsKKyAgICBjb25zdCBSZWFsU2NhbGFyIEZpbmNyX25vcm0gPSBGaW5jci5jd2lzZUFicygpLnJvd3dpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICAgIGlmIChGaW5jcl9ub3JtIDwgTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIEZfbm9ybSkgeworICAgICAgUmVhbFNjYWxhciBkZWx0YSA9IDA7CisgICAgICBSZWFsU2NhbGFyIHJmYWN0b3JpYWwgPSAxOworICAgICAgZm9yIChJbmRleCByID0gMDsgciA8IHJvd3M7IHIrKykgeworICAgICAgICBSZWFsU2NhbGFyIG14ID0gMDsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgICAgICAgICBteCA9IChzdGQ6Om1heCkobXgsIHN0ZDo6YWJzKG1fZihBc2hpZnRlZChpLCBpKSArIGF2Z0VpdmFsLCBzdGF0aWNfY2FzdDxpbnQ+KHMrcikpKSk7CisgICAgICAgIGlmIChyICE9IDApCisgICAgICAgICAgcmZhY3RvcmlhbCAqPSBSZWFsU2NhbGFyKHIpOworICAgICAgICBkZWx0YSA9IChzdGQ6Om1heCkoZGVsdGEsIG14IC8gcmZhY3RvcmlhbCk7CisgICAgICB9CisgICAgICBjb25zdCBSZWFsU2NhbGFyIFBfbm9ybSA9IFAuY3dpc2VBYnMoKS5yb3d3aXNlKCkuc3VtKCkubWF4Q29lZmYoKTsKKyAgICAgIGlmIChtdSAqIGRlbHRhICogUF9ub3JtIDwgTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIEZfbm9ybSkgLy8gc2VyaWVzIGNvbnZlcmdlZAorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEY7Cit9CisKKy8qKiBcYnJpZWYgRmluZCBjbHVzdGVyIGluIFxwIGNsdXN0ZXJzIGNvbnRhaW5pbmcgc29tZSB2YWx1ZSAKKyAgKiBccGFyYW1baW5dIGtleSBWYWx1ZSB0byBmaW5kCisgICogXHJldHVybnMgSXRlcmF0b3IgdG8gY2x1c3RlciBjb250YWluaW5nIFxwIGtleSwgb3IgXGMgY2x1c3RlcnMuZW5kKCkgaWYgbm8gY2x1c3RlciBpbiBccCBtX2NsdXN0ZXJzCisgICogY29udGFpbnMgXHAga2V5LgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaXN0T2ZDbHVzdGVycz4KK3R5cGVuYW1lIExpc3RPZkNsdXN0ZXJzOjppdGVyYXRvciBtYXRyaXhfZnVuY3Rpb25fZmluZF9jbHVzdGVyKEluZGV4IGtleSwgTGlzdE9mQ2x1c3RlcnMmIGNsdXN0ZXJzKQoreworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8SW5kZXg+OjppdGVyYXRvciBqOworICBmb3IgKHR5cGVuYW1lIExpc3RPZkNsdXN0ZXJzOjppdGVyYXRvciBpID0gY2x1c3RlcnMuYmVnaW4oKTsgaSAhPSBjbHVzdGVycy5lbmQoKTsgKytpKSB7CisgICAgaiA9IHN0ZDo6ZmluZChpLT5iZWdpbigpLCBpLT5lbmQoKSwga2V5KTsKKyAgICBpZiAoaiAhPSBpLT5lbmQoKSkKKyAgICAgIHJldHVybiBpOworICB9CisgIHJldHVybiBjbHVzdGVycy5lbmQoKTsKK30KKworLyoqIFxicmllZiBQYXJ0aXRpb24gZWlnZW52YWx1ZXMgaW4gY2x1c3RlcnMgb2YgZWkndmFscyBjbG9zZSB0byBlYWNoIG90aGVyCisgICogCisgICogXHBhcmFtW2luXSAgZWl2YWxzICAgIEVpZ2VudmFsdWVzCisgICogXHBhcmFtW291dF0gY2x1c3RlcnMgIFJlc3VsdGluZyBwYXJ0aXRpb24gb2YgZWlnZW52YWx1ZXMKKyAgKgorICAqIFRoZSBwYXJ0aXRpb24gc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgdHdvIHByb3BlcnRpZXM6CisgICogIyBBbnkgZWlnZW52YWx1ZSBpbiBhIGNlcnRhaW4gY2x1c3RlciBpcyBhdCBtb3N0IG1hdHJpeF9mdW5jdGlvbl9zZXBhcmF0aW9uKCkgYXdheSBmcm9tIGFub3RoZXIgZWlnZW52YWx1ZQorICAqICAgaW4gdGhlIHNhbWUgY2x1c3Rlci4KKyAgKiAjIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBlaWdlbnZhbHVlcyBpbiBkaWZmZXJlbnQgY2x1c3RlcnMgaXMgbW9yZSB0aGFuIG1hdHJpeF9mdW5jdGlvbl9zZXBhcmF0aW9uKCkuICAKKyAgKiBUaGUgaW1wbGVtZW50YXRpb24gZm9sbG93cyBBbGdvcml0aG0gNC4xIGluIHRoZSBwYXBlciBvZiBEYXZpZXMgYW5kIEhpZ2hhbS4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBFaXZhbHNUeXBlLCB0eXBlbmFtZSBDbHVzdGVyPgordm9pZCBtYXRyaXhfZnVuY3Rpb25fcGFydGl0aW9uX2VpZ2VudmFsdWVzKGNvbnN0IEVpdmFsc1R5cGUmIGVpdmFscywgc3RkOjpsaXN0PENsdXN0ZXI+JiBjbHVzdGVycykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaXZhbHNUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaXZhbHNUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIGZvciAoSW5kZXggaT0wOyBpPGVpdmFscy5yb3dzKCk7ICsraSkgeworICAgIC8vIEZpbmQgY2x1c3RlciBjb250YWluaW5nIGktdGggZWkndmFsLCBhZGRpbmcgYSBuZXcgY2x1c3RlciBpZiBuZWNlc3NhcnkKKyAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8Q2x1c3Rlcj46Oml0ZXJhdG9yIHFpID0gbWF0cml4X2Z1bmN0aW9uX2ZpbmRfY2x1c3RlcihpLCBjbHVzdGVycyk7CisgICAgaWYgKHFpID09IGNsdXN0ZXJzLmVuZCgpKSB7CisgICAgICBDbHVzdGVyIGw7CisgICAgICBsLnB1c2hfYmFjayhpKTsKKyAgICAgIGNsdXN0ZXJzLnB1c2hfYmFjayhsKTsKKyAgICAgIHFpID0gY2x1c3RlcnMuZW5kKCk7CisgICAgICAtLXFpOworICAgIH0KKworICAgIC8vIExvb2sgZm9yIG90aGVyIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBzZXQKKyAgICBmb3IgKEluZGV4IGo9aSsxOyBqPGVpdmFscy5yb3dzKCk7ICsraikgeworICAgICAgaWYgKGFicyhlaXZhbHMoaikgLSBlaXZhbHMoaSkpIDw9IFJlYWxTY2FsYXIobWF0cml4X2Z1bmN0aW9uX3NlcGFyYXRpb24pCisgICAgICAgICAgJiYgc3RkOjpmaW5kKHFpLT5iZWdpbigpLCBxaS0+ZW5kKCksIGopID09IHFpLT5lbmQoKSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6Omxpc3Q8Q2x1c3Rlcj46Oml0ZXJhdG9yIHFqID0gbWF0cml4X2Z1bmN0aW9uX2ZpbmRfY2x1c3RlcihqLCBjbHVzdGVycyk7CisgICAgICAgIGlmIChxaiA9PSBjbHVzdGVycy5lbmQoKSkgeworICAgICAgICAgIHFpLT5wdXNoX2JhY2soaik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcWktPmluc2VydChxaS0+ZW5kKCksIHFqLT5iZWdpbigpLCBxai0+ZW5kKCkpOworICAgICAgICAgIGNsdXN0ZXJzLmVyYXNlKHFqKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiogXGJyaWVmIENvbXB1dGUgc2l6ZSBvZiBlYWNoIGNsdXN0ZXIgZ2l2ZW4gYSBwYXJ0aXRpb25pbmcgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBMaXN0T2ZDbHVzdGVycywgdHlwZW5hbWUgSW5kZXg+Cit2b2lkIG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlX2NsdXN0ZXJfc2l6ZShjb25zdCBMaXN0T2ZDbHVzdGVycyYgY2x1c3RlcnMsIE1hdHJpeDxJbmRleCwgRHluYW1pYywgMT4mIGNsdXN0ZXJTaXplKQoreworICBjb25zdCBJbmRleCBudW1DbHVzdGVycyA9IHN0YXRpY19jYXN0PEluZGV4PihjbHVzdGVycy5zaXplKCkpOworICBjbHVzdGVyU2l6ZS5zZXRaZXJvKG51bUNsdXN0ZXJzKTsKKyAgSW5kZXggY2x1c3RlckluZGV4ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBMaXN0T2ZDbHVzdGVyczo6Y29uc3RfaXRlcmF0b3IgY2x1c3RlciA9IGNsdXN0ZXJzLmJlZ2luKCk7IGNsdXN0ZXIgIT0gY2x1c3RlcnMuZW5kKCk7ICsrY2x1c3RlcikgeworICAgIGNsdXN0ZXJTaXplW2NsdXN0ZXJJbmRleF0gPSBjbHVzdGVyLT5zaXplKCk7CisgICAgKytjbHVzdGVySW5kZXg7CisgIH0KK30KKworLyoqIFxicmllZiBDb21wdXRlIHN0YXJ0IG9mIGVhY2ggYmxvY2sgdXNpbmcgY2x1c3RlclNpemUgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZV9ibG9ja19zdGFydChjb25zdCBWZWN0b3JUeXBlJiBjbHVzdGVyU2l6ZSwgVmVjdG9yVHlwZSYgYmxvY2tTdGFydCkKK3sKKyAgYmxvY2tTdGFydC5yZXNpemUoY2x1c3RlclNpemUucm93cygpKTsKKyAgYmxvY2tTdGFydCgwKSA9IDA7CisgIGZvciAodHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggaSA9IDE7IGkgPCBjbHVzdGVyU2l6ZS5yb3dzKCk7IGkrKykgeworICAgIGJsb2NrU3RhcnQoaSkgPSBibG9ja1N0YXJ0KGktMSkgKyBjbHVzdGVyU2l6ZShpLTEpOworICB9Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBtYXBwaW5nIG9mIGVpZ2VudmFsdWUgaW5kaWNlcyB0byBjbHVzdGVyIGluZGljZXMgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBFaXZhbHNUeXBlLCB0eXBlbmFtZSBMaXN0T2ZDbHVzdGVycywgdHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGVfbWFwKGNvbnN0IEVpdmFsc1R5cGUmIGVpdmFscywgY29uc3QgTGlzdE9mQ2x1c3RlcnMmIGNsdXN0ZXJzLCBWZWN0b3JUeXBlJiBlaXZhbFRvQ2x1c3RlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaXZhbHNUeXBlOjpJbmRleCBJbmRleDsKKyAgZWl2YWxUb0NsdXN0ZXIucmVzaXplKGVpdmFscy5yb3dzKCkpOworICBJbmRleCBjbHVzdGVySW5kZXggPSAwOworICBmb3IgKHR5cGVuYW1lIExpc3RPZkNsdXN0ZXJzOjpjb25zdF9pdGVyYXRvciBjbHVzdGVyID0gY2x1c3RlcnMuYmVnaW4oKTsgY2x1c3RlciAhPSBjbHVzdGVycy5lbmQoKTsgKytjbHVzdGVyKSB7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGVpdmFscy5yb3dzKCk7ICsraSkgeworICAgICAgaWYgKHN0ZDo6ZmluZChjbHVzdGVyLT5iZWdpbigpLCBjbHVzdGVyLT5lbmQoKSwgaSkgIT0gY2x1c3Rlci0+ZW5kKCkpIHsKKyAgICAgICAgZWl2YWxUb0NsdXN0ZXJbaV0gPSBjbHVzdGVySW5kZXg7CisgICAgICB9CisgICAgfQorICAgICsrY2x1c3RlckluZGV4OworICB9Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBwZXJtdXRhdGlvbiB3aGljaCBncm91cHMgZWkndmFscyBpbiBzYW1lIGNsdXN0ZXIgdG9nZXRoZXIgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEeW5WZWN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZV9wZXJtdXRhdGlvbihjb25zdCBEeW5WZWN0b3JUeXBlJiBibG9ja1N0YXJ0LCBjb25zdCBEeW5WZWN0b3JUeXBlJiBlaXZhbFRvQ2x1c3RlciwgVmVjdG9yVHlwZSYgcGVybXV0YXRpb24pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIER5blZlY3RvclR5cGUgaW5kZXhOZXh0RW50cnkgPSBibG9ja1N0YXJ0OworICBwZXJtdXRhdGlvbi5yZXNpemUoZWl2YWxUb0NsdXN0ZXIucm93cygpKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IGVpdmFsVG9DbHVzdGVyLnJvd3MoKTsgaSsrKSB7CisgICAgSW5kZXggY2x1c3RlciA9IGVpdmFsVG9DbHVzdGVyW2ldOworICAgIHBlcm11dGF0aW9uW2ldID0gaW5kZXhOZXh0RW50cnlbY2x1c3Rlcl07CisgICAgKytpbmRleE5leHRFbnRyeVtjbHVzdGVyXTsKKyAgfQorfSAgCisKKy8qKiBcYnJpZWYgUGVybXV0ZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGluIFUgYW5kIFQgYWNjb3JkaW5nIHRvIHBlcm11dGF0aW9uICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgbWF0cml4X2Z1bmN0aW9uX3Blcm11dGVfc2NodXIoVmVjdG9yVHlwZSYgcGVybXV0YXRpb24sIE1hdHJpeFR5cGUmIFUsIE1hdHJpeFR5cGUmIFQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBwZXJtdXRhdGlvbi5yb3dzKCkgLSAxOyBpKyspIHsKKyAgICBJbmRleCBqOworICAgIGZvciAoaiA9IGk7IGogPCBwZXJtdXRhdGlvbi5yb3dzKCk7IGorKykgeworICAgICAgaWYgKHBlcm11dGF0aW9uKGopID09IGkpIGJyZWFrOworICAgIH0KKyAgICBlaWdlbl9hc3NlcnQocGVybXV0YXRpb24oaikgPT0gaSk7CisgICAgZm9yIChJbmRleCBrID0gai0xOyBrID49IGk7IGstLSkgeworICAgICAgSmFjb2JpUm90YXRpb248dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPiByb3RhdGlvbjsKKyAgICAgIHJvdGF0aW9uLm1ha2VHaXZlbnMoVChrLCBrKzEpLCBUKGsrMSwgaysxKSAtIFQoaywgaykpOworICAgICAgVC5hcHBseU9uVGhlTGVmdChrLCBrKzEsIHJvdGF0aW9uLmFkam9pbnQoKSk7CisgICAgICBULmFwcGx5T25UaGVSaWdodChrLCBrKzEsIHJvdGF0aW9uKTsKKyAgICAgIFUuYXBwbHlPblRoZVJpZ2h0KGssIGsrMSwgcm90YXRpb24pOworICAgICAgc3RkOjpzd2FwKHBlcm11dGF0aW9uLmNvZWZmUmVmKGspLCBwZXJtdXRhdGlvbi5jb2VmZlJlZihrKzEpKTsKKyAgICB9CisgIH0KK30KKworLyoqIFxicmllZiBDb21wdXRlIGJsb2NrIGRpYWdvbmFsIHBhcnQgb2YgbWF0cml4IGZ1bmN0aW9uLgorICAqCisgICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSBtYXRyaXggZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmxvY2sgZGlhZ29uYWwgcGFydCBvZiBccCBUICh3aGljaCBzaG91bGQgYmUKKyAgKiB1cHBlciB0cmlhbmd1bGFyKSwgd2l0aCB0aGUgYmxvY2tpbmcgZ2l2ZW4gYnkgXHAgYmxvY2tTdGFydCBhbmQgXHAgY2x1c3RlclNpemUuIFRoZSBtYXRyaXggZnVuY3Rpb24gb2YKKyAgKiBlYWNoIGRpYWdvbmFsIGJsb2NrIGlzIGNvbXB1dGVkIGJ5IFxwIGF0b21pYy4gVGhlIG9mZi1kaWFnb25hbCBwYXJ0cyBvZiBccCBmVCBhcmUgc2V0IHRvIHplcm8uCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQXRvbWljVHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGVfYmxvY2tfYXRvbWljKGNvbnN0IE1hdHJpeFR5cGUmIFQsIEF0b21pY1R5cGUmIGF0b21pYywgY29uc3QgVmVjdG9yVHlwZSYgYmxvY2tTdGFydCwgY29uc3QgVmVjdG9yVHlwZSYgY2x1c3RlclNpemUsIE1hdHJpeFR5cGUmIGZUKQoreyAKKyAgZlQuc2V0WmVybyhULnJvd3MoKSwgVC5jb2xzKCkpOworICBmb3IgKHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IGkgPSAwOyBpIDwgY2x1c3RlclNpemUucm93cygpOyArK2kpIHsKKyAgICBmVC5ibG9jayhibG9ja1N0YXJ0KGkpLCBibG9ja1N0YXJ0KGkpLCBjbHVzdGVyU2l6ZShpKSwgY2x1c3RlclNpemUoaSkpCisgICAgICA9IGF0b21pYy5jb21wdXRlKFQuYmxvY2soYmxvY2tTdGFydChpKSwgYmxvY2tTdGFydChpKSwgY2x1c3RlclNpemUoaSksIGNsdXN0ZXJTaXplKGkpKSk7CisgIH0KK30KKworLyoqIFxicmllZiBTb2x2ZSBhIHRyaWFuZ3VsYXIgU3lsdmVzdGVyIGVxdWF0aW9uIEFYICsgWEIgPSBDIAorICAqCisgICogXHBhcmFtW2luXSAgQSAgdGhlIG1hdHJpeCBBOyBzaG91bGQgYmUgc3F1YXJlIGFuZCB1cHBlciB0cmlhbmd1bGFyCisgICogXHBhcmFtW2luXSAgQiAgdGhlIG1hdHJpeCBCOyBzaG91bGQgYmUgc3F1YXJlIGFuZCB1cHBlciB0cmlhbmd1bGFyCisgICogXHBhcmFtW2luXSAgQyAgdGhlIG1hdHJpeCBDOyBzaG91bGQgaGF2ZSBjb3JyZWN0IHNpemUuCisgICoKKyAgKiBccmV0dXJucyB0aGUgc29sdXRpb24gWC4KKyAgKgorICAqIElmIEEgaXMgbS1ieS1tIGFuZCBCIGlzIG4tYnktbiwgdGhlbiBib3RoIEMgYW5kIFggYXJlIG0tYnktbi4gIFRoZSAoaSxqKS10aCBjb21wb25lbnQgb2YgdGhlIFN5bHZlc3RlcgorICAqIGVxdWF0aW9uIGlzCisgICogXGZbIAorICAqICAgICBcc3VtX3trPWl9Xm0gQV97aWt9IFhfe2tqfSArIFxzdW1fe2s9MX1eaiBYX3tpa30gQl97a2p9ID0gQ197aWp9LiAKKyAgKiBcZl0KKyAgKiBUaGlzIGNhbiBiZSByZS1hcnJhbmdlZCB0byB5aWVsZDoKKyAgKiBcZlsgCisgICogICAgIFhfe2lqfSA9IFxmcmFjezF9e0Ffe2lpfSArIEJfe2pqfX0gXEJpZ2woIENfe2lqfQorICAqICAgICAtIFxzdW1fe2s9aSsxfV5tIEFfe2lrfSBYX3tran0gLSBcc3VtX3trPTF9XntqLTF9IFhfe2lrfSBCX3tran0gXEJpZ3IpLgorICAqIFxmXQorICAqIEl0IGlzIGFzc3VtZWQgdGhhdCBBIGFuZCBCIGFyZSBzdWNoIHRoYXQgdGhlIG51bWVyYXRvciBpcyBuZXZlciB6ZXJvIChvdGhlcndpc2UgdGhlIFN5bHZlc3RlciBlcXVhdGlvbgorICAqIGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgc29sdXRpb24pLiBJbiB0aGF0IGNhc2UsIHRoZXNlIGVxdWF0aW9ucyBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciAKKyAgKiBcZiQgaT1tLFxsZG90cywxIFxmJCBhbmQgXGYkIGo9MSxcbGRvdHMsbiBcZiQuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgbWF0cml4X2Z1bmN0aW9uX3NvbHZlX3RyaWFuZ3VsYXJfc3lsdmVzdGVyKGNvbnN0IE1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeFR5cGUmIEIsIGNvbnN0IE1hdHJpeFR5cGUmIEMpCit7CisgIGVpZ2VuX2Fzc2VydChBLnJvd3MoKSA9PSBBLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChBLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICBlaWdlbl9hc3NlcnQoQi5yb3dzKCkgPT0gQi5jb2xzKCkpOworICBlaWdlbl9hc3NlcnQoQi5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgZWlnZW5fYXNzZXJ0KEMucm93cygpID09IEEucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KEMuY29scygpID09IEIucm93cygpKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggbSA9IEEucm93cygpOworICBJbmRleCBuID0gQi5yb3dzKCk7CisgIE1hdHJpeFR5cGUgWChtLCBuKTsKKworICBmb3IgKEluZGV4IGkgPSBtIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKSB7CisKKyAgICAgIC8vIENvbXB1dGUgQVggPSBcc3VtX3trPWkrMX1ebSBBX3tpa30gWF97a2p9CisgICAgICBTY2FsYXIgQVg7CisgICAgICBpZiAoaSA9PSBtIC0gMSkgeworCUFYID0gMDsgCisgICAgICB9IGVsc2UgeworCU1hdHJpeDxTY2FsYXIsMSwxPiBBWG1hdHJpeCA9IEEucm93KGkpLnRhaWwobS0xLWkpICogWC5jb2woaikudGFpbChtLTEtaSk7CisJQVggPSBBWG1hdHJpeCgwLDApOworICAgICAgfQorCisgICAgICAvLyBDb21wdXRlIFhCID0gXHN1bV97az0xfV57ai0xfSBYX3tpa30gQl97a2p9CisgICAgICBTY2FsYXIgWEI7CisgICAgICBpZiAoaiA9PSAwKSB7CisJWEIgPSAwOyAKKyAgICAgIH0gZWxzZSB7CisJTWF0cml4PFNjYWxhciwxLDE+IFhCbWF0cml4ID0gWC5yb3coaSkuaGVhZChqKSAqIEIuY29sKGopLmhlYWQoaik7CisJWEIgPSBYQm1hdHJpeCgwLDApOworICAgICAgfQorCisgICAgICBYKGksaikgPSAoQyhpLGopIC0gQVggLSBYQikgLyAoQShpLGkpICsgQihqLGopKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFg7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBwYXJ0IG9mIG1hdHJpeCBmdW5jdGlvbiBhYm92ZSBibG9jayBkaWFnb25hbC4KKyAgKgorICAqIFRoaXMgcm91dGluZSBjb21wbGV0ZXMgdGhlIGNvbXB1dGF0aW9uIG9mIFxwIGZULCBkZW5vdGluZyBhIG1hdHJpeCBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSB0cmlhbmd1bGFyCisgICogbWF0cml4IFxwIFQuIEl0IGFzc3VtZXMgdGhhdCB0aGUgYmxvY2sgZGlhZ29uYWwgcGFydCBvZiBccCBmVCBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLiBUaGUgcGFydCBiZWxvdworICAqIHRoZSBkaWFnb25hbCBpcyB6ZXJvLCBiZWNhdXNlIFxwIFQgaXMgdXBwZXIgdHJpYW5ndWxhci4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZV9hYm92ZV9kaWFnb25hbChjb25zdCBNYXRyaXhUeXBlJiBULCBjb25zdCBWZWN0b3JUeXBlJiBibG9ja1N0YXJ0LCBjb25zdCBWZWN0b3JUeXBlJiBjbHVzdGVyU2l6ZSwgTWF0cml4VHlwZSYgZlQpCit7IAorICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT4gVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBjb25zdCBpbnQgUm93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lOworICBzdGF0aWMgY29uc3QgaW50IENvbHNBdENvbXBpbGVUaW1lID0gVHJhaXRzOjpDb2xzQXRDb21waWxlVGltZTsKKyAgc3RhdGljIGNvbnN0IGludCBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9uczsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBPcHRpb25zLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWU+IER5bk1hdHJpeFR5cGU7CisKKyAgZm9yIChJbmRleCBrID0gMTsgayA8IGNsdXN0ZXJTaXplLnJvd3MoKTsgaysrKSB7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGNsdXN0ZXJTaXplLnJvd3MoKSAtIGs7IGkrKykgeworICAgICAgLy8gY29tcHV0ZSAoaSwgaStrKSBibG9jaworICAgICAgRHluTWF0cml4VHlwZSBBID0gVC5ibG9jayhibG9ja1N0YXJ0KGkpLCBibG9ja1N0YXJ0KGkpLCBjbHVzdGVyU2l6ZShpKSwgY2x1c3RlclNpemUoaSkpOworICAgICAgRHluTWF0cml4VHlwZSBCID0gLVQuYmxvY2soYmxvY2tTdGFydChpK2spLCBibG9ja1N0YXJ0KGkrayksIGNsdXN0ZXJTaXplKGkrayksIGNsdXN0ZXJTaXplKGkraykpOworICAgICAgRHluTWF0cml4VHlwZSBDID0gZlQuYmxvY2soYmxvY2tTdGFydChpKSwgYmxvY2tTdGFydChpKSwgY2x1c3RlclNpemUoaSksIGNsdXN0ZXJTaXplKGkpKQorICAgICAgICAqIFQuYmxvY2soYmxvY2tTdGFydChpKSwgYmxvY2tTdGFydChpK2spLCBjbHVzdGVyU2l6ZShpKSwgY2x1c3RlclNpemUoaStrKSk7CisgICAgICBDIC09IFQuYmxvY2soYmxvY2tTdGFydChpKSwgYmxvY2tTdGFydChpK2spLCBjbHVzdGVyU2l6ZShpKSwgY2x1c3RlclNpemUoaStrKSkKKyAgICAgICAgKiBmVC5ibG9jayhibG9ja1N0YXJ0KGkrayksIGJsb2NrU3RhcnQoaStrKSwgY2x1c3RlclNpemUoaStrKSwgY2x1c3RlclNpemUoaStrKSk7CisgICAgICBmb3IgKEluZGV4IG0gPSBpICsgMTsgbSA8IGkgKyBrOyBtKyspIHsKKyAgICAgICAgQyArPSBmVC5ibG9jayhibG9ja1N0YXJ0KGkpLCBibG9ja1N0YXJ0KG0pLCBjbHVzdGVyU2l6ZShpKSwgY2x1c3RlclNpemUobSkpCisgICAgICAgICAgKiBULmJsb2NrKGJsb2NrU3RhcnQobSksIGJsb2NrU3RhcnQoaStrKSwgY2x1c3RlclNpemUobSksIGNsdXN0ZXJTaXplKGkraykpOworICAgICAgICBDIC09IFQuYmxvY2soYmxvY2tTdGFydChpKSwgYmxvY2tTdGFydChtKSwgY2x1c3RlclNpemUoaSksIGNsdXN0ZXJTaXplKG0pKQorICAgICAgICAgICogZlQuYmxvY2soYmxvY2tTdGFydChtKSwgYmxvY2tTdGFydChpK2spLCBjbHVzdGVyU2l6ZShtKSwgY2x1c3RlclNpemUoaStrKSk7CisgICAgICB9CisgICAgICBmVC5ibG9jayhibG9ja1N0YXJ0KGkpLCBibG9ja1N0YXJ0KGkrayksIGNsdXN0ZXJTaXplKGkpLCBjbHVzdGVyU2l6ZShpK2spKQorICAgICAgICA9IG1hdHJpeF9mdW5jdGlvbl9zb2x2ZV90cmlhbmd1bGFyX3N5bHZlc3RlcihBLCBCLCBDKTsKKyAgICB9CisgIH0KK30KKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKiBcYnJpZWYgQ2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggZnVuY3Rpb25zLgorICAqIFx0cGFyYW0gIE1hdHJpeFR5cGUgIHR5cGUgb2YgdGhlIGFyZ3VtZW50IG9mIHRoZSBtYXRyaXggZnVuY3Rpb24sCisgICogICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqIFx0cGFyYW0gIEF0b21pY1R5cGUgIHR5cGUgZm9yIGNvbXB1dGluZyBtYXRyaXggZnVuY3Rpb24gb2YgYXRvbWljIGJsb2Nrcy4KKyAgKiBcdHBhcmFtICBJc0NvbXBsZXggICB1c2VkIGludGVybmFsbHkgdG8gc2VsZWN0IGNvcnJlY3Qgc3BlY2lhbGl6YXRpb24uCisgICoKKyAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNjaHVyLVBhcmxldHQgYWxnb3JpdGhtIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9ucy4gVGhlIHNwZWN0cnVtIG9mIHRoZQorICAqIG1hdHJpeCBpcyBkaXZpZGVkIGluIGNsdXN0ZXJlZCBvZiBlaWdlbnZhbHVlcyB0aGF0IGxpZXMgY2xvc2UgdG9nZXRoZXIuIFRoaXMgY2xhc3MgZGVsZWdhdGVzIHRoZQorICAqIGNvbXB1dGF0aW9uIG9mIHRoZSBtYXRyaXggZnVuY3Rpb24gb24gZXZlcnkgYmxvY2sgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjbHVzdGVycyB0byBhbiBvYmplY3Qgb2YgdHlwZQorICAqIFxwIEF0b21pY1R5cGUgYW5kIHVzZXMgdGhlc2UgcmVzdWx0cyB0byBjb21wdXRlIHRoZSBtYXRyaXggZnVuY3Rpb24gb2YgdGhlIHdob2xlIG1hdHJpeC4gVGhlIGNsYXNzCisgICogXHAgQXRvbWljVHlwZSBzaG91bGQgaGF2ZSBhIFxwIGNvbXB1dGUoKSBtZW1iZXIgZnVuY3Rpb24gZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGZ1bmN0aW9uIG9mIGEgYmxvY2suCisgICoKKyAgKiBcc2EgY2xhc3MgTWF0cml4RnVuY3Rpb25BdG9taWMsIGNsYXNzIE1hdHJpeExvZ2FyaXRobUF0b21pYworICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4Pgorc3RydWN0IG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlCit7ICAKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgQSAgICAgICBhcmd1bWVudCBvZiBtYXRyaXggZnVuY3Rpb24sIHNob3VsZCBiZSBhIHNxdWFyZSBtYXRyaXguCisgICAgICAqIFxwYXJhbVtpbl0gIGF0b21pYyAgY2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggZnVuY3Rpb24gb2YgYXRvbWljIGJsb2Nrcy4KKyAgICAgICogXHBhcmFtW291dF0gcmVzdWx0ICB0aGUgZnVuY3Rpb24gXHAgZiBhcHBsaWVkIHRvIFxwIEEsIGFzCisgICAgICAqIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFNlZSBNYXRyaXhCYXNlOjptYXRyaXhGdW5jdGlvbigpIGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIGNvbXB1dGF0aW9uCisgICAgICAqIGlzIGltcGxlbWVudGVkLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXRvbWljVHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4gCisgICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IE1hdHJpeFR5cGUmIEEsIEF0b21pY1R5cGUmIGF0b21pYywgUmVzdWx0VHlwZSAmcmVzdWx0KTsgICAgCit9OworCisvKiogXGludGVybmFsIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUgCisgICogXGJyaWVmIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgTWF0cml4RnVuY3Rpb24gZm9yIHJlYWwgbWF0cmljZXMKKyAgKgorICAqIFRoaXMgY29udmVydHMgdGhlIHJlYWwgbWF0cml4IHRvIGEgY29tcGxleCBtYXRyaXgsIGNvbXB1dGUgdGhlIG1hdHJpeCBmdW5jdGlvbiBvZiB0aGF0IG1hdHJpeCwgYW5kIHRoZW4KKyAgKiBjb252ZXJ0cyB0aGUgcmVzdWx0IGJhY2sgdG8gYSByZWFsIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlPE1hdHJpeFR5cGUsIDA+Cit7ICAKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdEEsIHR5cGVuYW1lIEF0b21pY1R5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRBJiBBLCBBdG9taWNUeXBlJiBhdG9taWMsIFJlc3VsdFR5cGUgJnJlc3VsdCkKKyAgeworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPiBUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlNjYWxhciBTY2FsYXI7CisgICAgc3RhdGljIGNvbnN0IGludCBSb3dzID0gVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IFRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgc3RhdGljIGNvbnN0IGludCBNYXhSb3dzID0gVHJhaXRzOjpNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Q29scyA9IFRyYWl0czo6TWF4Q29sc0F0Q29tcGlsZVRpbWU7CisKKyAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgUm93cywgQ29scywgMCwgTWF4Um93cywgTWF4Q29scz4gQ29tcGxleE1hdHJpeDsKKworICAgIENvbXBsZXhNYXRyaXggQ0EgPSBBLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICBDb21wbGV4TWF0cml4IENyZXN1bHQ7CisgICAgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGU8Q29tcGxleE1hdHJpeD46OnJ1bihDQSwgYXRvbWljLCBDcmVzdWx0KTsKKyAgICByZXN1bHQgPSBDcmVzdWx0LnJlYWwoKTsKKyAgfQorfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlIAorICAqIFxicmllZiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIE1hdHJpeEZ1bmN0aW9uIGZvciBjb21wbGV4IG1hdHJpY2VzCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZTxNYXRyaXhUeXBlLCAxPgoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0QSwgdHlwZW5hbWUgQXRvbWljVHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IE1hdEEmIEEsIEF0b21pY1R5cGUmIGF0b21pYywgUmVzdWx0VHlwZSAmcmVzdWx0KQorICB7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+IFRyYWl0czsKKyAgICAKKyAgICAvLyBjb21wdXRlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgQQorICAgIGNvbnN0IENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShBKTsgIAorICAgIE1hdHJpeFR5cGUgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgICBNYXRyaXhUeXBlIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisKKyAgICAvLyBwYXJ0aXRpb24gZWlnZW52YWx1ZXMgaW50byBjbHVzdGVycyBvZiBlaSd2YWxzICJjbG9zZSIgdG8gZWFjaCBvdGhlcgorICAgIHN0ZDo6bGlzdDxzdGQ6Omxpc3Q8SW5kZXg+ID4gY2x1c3RlcnM7IAorICAgIG1hdHJpeF9mdW5jdGlvbl9wYXJ0aXRpb25fZWlnZW52YWx1ZXMoVC5kaWFnb25hbCgpLCBjbHVzdGVycyk7CisKKyAgICAvLyBjb21wdXRlIHNpemUgb2YgZWFjaCBjbHVzdGVyCisgICAgTWF0cml4PEluZGV4LCBEeW5hbWljLCAxPiBjbHVzdGVyU2l6ZTsKKyAgICBtYXRyaXhfZnVuY3Rpb25fY29tcHV0ZV9jbHVzdGVyX3NpemUoY2x1c3RlcnMsIGNsdXN0ZXJTaXplKTsKKworICAgIC8vIGJsb2NrU3RhcnRbaV0gaXMgcm93IGluZGV4IGF0IHdoaWNoIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gaS10aCBjbHVzdGVyIHN0YXJ0cyAKKyAgICBNYXRyaXg8SW5kZXgsIER5bmFtaWMsIDE+IGJsb2NrU3RhcnQ7IAorICAgIG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlX2Jsb2NrX3N0YXJ0KGNsdXN0ZXJTaXplLCBibG9ja1N0YXJ0KTsKKworICAgIC8vIGNvbXB1dGUgbWFwIHNvIHRoYXQgZWl2YWxUb0NsdXN0ZXJbaV0gPSBqIG1lYW5zIHRoYXQgaS10aCBlaSd2YWwgaXMgaW4gai10aCBjbHVzdGVyIAorICAgIE1hdHJpeDxJbmRleCwgRHluYW1pYywgMT4gZWl2YWxUb0NsdXN0ZXI7CisgICAgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGVfbWFwKFQuZGlhZ29uYWwoKSwgY2x1c3RlcnMsIGVpdmFsVG9DbHVzdGVyKTsKKworICAgIC8vIGNvbXB1dGUgcGVybXV0YXRpb24gd2hpY2ggZ3JvdXBzIGVpJ3ZhbHMgaW4gc2FtZSBjbHVzdGVyIHRvZ2V0aGVyIAorICAgIE1hdHJpeDxJbmRleCwgVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZSwgMT4gcGVybXV0YXRpb247CisgICAgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGVfcGVybXV0YXRpb24oYmxvY2tTdGFydCwgZWl2YWxUb0NsdXN0ZXIsIHBlcm11dGF0aW9uKTsKKworICAgIC8vIHBlcm11dGUgU2NodXIgZGVjb21wb3NpdGlvbgorICAgIG1hdHJpeF9mdW5jdGlvbl9wZXJtdXRlX3NjaHVyKHBlcm11dGF0aW9uLCBVLCBUKTsKKworICAgIC8vIGNvbXB1dGUgcmVzdWx0CisgICAgTWF0cml4VHlwZSBmVDsgLy8gbWF0cml4IGZ1bmN0aW9uIGFwcGxpZWQgdG8gVAorICAgIG1hdHJpeF9mdW5jdGlvbl9jb21wdXRlX2Jsb2NrX2F0b21pYyhULCBhdG9taWMsIGJsb2NrU3RhcnQsIGNsdXN0ZXJTaXplLCBmVCk7CisgICAgbWF0cml4X2Z1bmN0aW9uX2NvbXB1dGVfYWJvdmVfZGlhZ29uYWwoVCwgYmxvY2tTdGFydCwgY2x1c3RlclNpemUsIGZUKTsKKyAgICByZXN1bHQgPSBVICogKGZULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogVS5hZGpvaW50KCkpOworICB9Cit9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBmdW5jdGlvbiBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgIFR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggZnVuY3Rpb24uCisgICoKKyAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IGZ1bmN0aW9uIHVudGlsIGl0IGlzIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3Igc29tZSBvdGhlcgorICAqIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50IHNob3VsZCBub3QgYmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgKiBtYXRyaXhCYXNlOjptYXRyaXhGdW5jdGlvbigpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZQorOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6dHlwZSBTdGVtRnVuY3Rpb247CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxEZXJpdmVkPjo6dHlwZSBEZXJpdmVkTmVzdGVkOworCisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gQSAgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlIG1hdHJpeCBmdW5jdGlvbi4KKyAgICAgICogXHBhcmFtW2luXSBmICBTdGVtIGZ1bmN0aW9uIGZvciBtYXRyaXggZnVuY3Rpb24gdW5kZXIgY29uc2lkZXJhdGlvbi4KKyAgICAgICovCisgICAgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZShjb25zdCBEZXJpdmVkJiBBLCBTdGVtRnVuY3Rpb24gZikgOiBtX0EoQSksIG1fZihmKSB7IH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgbWF0cml4IGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBccGFyYW1bb3V0XSByZXN1bHQgXHAgZiBhcHBsaWVkIHRvIFxwIEEsIHdoZXJlIFxwIGYgYW5kIFxwIEEgYXJlIGFzIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLCAxMD46OnR5cGUgTmVzdGVkRXZhbFR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE5lc3RlZEV2YWxUeXBlPjo6dHlwZSBOZXN0ZWRFdmFsVHlwZUNsZWFuOworICAgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE5lc3RlZEV2YWxUeXBlQ2xlYW4+IFRyYWl0czsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgUm93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lOworICAgICAgc3RhdGljIGNvbnN0IGludCBDb2xzQXRDb21waWxlVGltZSA9IFRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbD4gQ29tcGxleFNjYWxhcjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIDAsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gRHluTWF0cml4VHlwZTsKKworICAgICAgdHlwZWRlZiBpbnRlcm5hbDo6TWF0cml4RnVuY3Rpb25BdG9taWM8RHluTWF0cml4VHlwZT4gQXRvbWljVHlwZTsKKyAgICAgIEF0b21pY1R5cGUgYXRvbWljKG1fZik7CisKKyAgICAgIGludGVybmFsOjptYXRyaXhfZnVuY3Rpb25fY29tcHV0ZTx0eXBlbmFtZSBOZXN0ZWRFdmFsVHlwZUNsZWFuOjpQbGFpbk9iamVjdD46OnJ1bihtX0EsIGF0b21pYywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9BLnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX0EuY29scygpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBEZXJpdmVkTmVzdGVkIG1fQTsKKyAgICBTdGVtRnVuY3Rpb24gKm1fZjsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOworfTsKK30KKworCisvKioqKioqKioqKiBNYXRyaXhCYXNlIG1ldGhvZHMgKioqKioqKioqKi8KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6bWF0cml4RnVuY3Rpb24odHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6dHlwZSBmKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHJldHVybiBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSwgZik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzaW4oKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6Q29tcGxleFNjYWxhciBDb21wbGV4U2NhbGFyOworICByZXR1cm4gTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uX3NpbjxDb21wbGV4U2NhbGFyPik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb3MoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6Q29tcGxleFNjYWxhciBDb21wbGV4U2NhbGFyOworICByZXR1cm4gTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uX2NvczxDb21wbGV4U2NhbGFyPik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzaW5oKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uPFNjYWxhcj46OkNvbXBsZXhTY2FsYXIgQ29tcGxleFNjYWxhcjsKKyAgcmV0dXJuIE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpLCBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbl9zaW5oPENvbXBsZXhTY2FsYXI+KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmNvc2goKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6Q29tcGxleFNjYWxhciBDb21wbGV4U2NhbGFyOworICByZXR1cm4gTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uX2Nvc2g8Q29tcGxleFNjYWxhcj4pOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BVFJJWF9GVU5DVElPTgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhMb2dhcml0aG0uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4TG9nYXJpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4ZjZlNwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4TG9nYXJpdGhtLmgKQEAgLTAsMCArMSwzNzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhfTE9HQVJJVEhNCisjZGVmaW5lIEVJR0VOX01BVFJJWF9MT0dBUklUSE0KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7IAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IG1hdHJpeF9sb2dfbWluX3BhZGVfZGVncmVlIAoreworICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgbWF0cml4X2xvZ19tYXhfcGFkZV9kZWdyZWUgCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czw9IDI0PyAgNTogIC8vIHNpbmdsZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czw9IDUzPyAgNzogIC8vIGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czw9IDY0PyAgODogIC8vIGV4dGVuZGVkIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6ZGlnaXRzPD0xMDY/IDEwOiAgLy8gZG91YmxlLWRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOyAgLy8gcXVhZHJ1cGxlIHByZWNpc2lvbgorfTsKKworLyoqIFxicmllZiBDb21wdXRlIGxvZ2FyaXRobSBvZiAyeDIgdHJpYW5ndWxhciBtYXRyaXguICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgbWF0cml4X2xvZ19jb21wdXRlXzJ4Mihjb25zdCBNYXRyaXhUeXBlJiBBLCBNYXRyaXhUeXBlJiByZXN1bHQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OmNlaWw7CisgIHVzaW5nIHN0ZDo6aW1hZzsKKyAgdXNpbmcgc3RkOjpsb2c7CisKKyAgU2NhbGFyIGxvZ0EwMCA9IGxvZyhBKDAsMCkpOworICBTY2FsYXIgbG9nQTExID0gbG9nKEEoMSwxKSk7CisKKyAgcmVzdWx0KDAsMCkgPSBsb2dBMDA7CisgIHJlc3VsdCgxLDApID0gU2NhbGFyKDApOworICByZXN1bHQoMSwxKSA9IGxvZ0ExMTsKKworICBTY2FsYXIgeSA9IEEoMSwxKSAtIEEoMCwwKTsKKyAgaWYgKHk9PVNjYWxhcigwKSkKKyAgeworICAgIHJlc3VsdCgwLDEpID0gQSgwLDEpIC8gQSgwLDApOworICB9CisgIGVsc2UgaWYgKChhYnMoQSgwLDApKSA8IFJlYWxTY2FsYXIoMC41KSphYnMoQSgxLDEpKSkgfHwgKGFicyhBKDAsMCkpID4gMiphYnMoQSgxLDEpKSkpCisgIHsKKyAgICByZXN1bHQoMCwxKSA9IEEoMCwxKSAqIChsb2dBMTEgLSBsb2dBMDApIC8geTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBjb21wdXRhdGlvbiBpbiBwcmV2aW91cyBicmFuY2ggaXMgaW5hY2N1cmF0ZSBpZiBBKDEsMSkgXGFwcHJveCBBKDAsMCkKKyAgICBpbnQgdW53aW5kaW5nTnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKChpbWFnKGxvZ0ExMSAtIGxvZ0EwMCkgLSBSZWFsU2NhbGFyKEVJR0VOX1BJKSkgLyBSZWFsU2NhbGFyKDIqRUlHRU5fUEkpKSk7CisgICAgcmVzdWx0KDAsMSkgPSBBKDAsMSkgKiAobnVtZXh0Ojpsb2cxcCh5L0EoMCwwKSkgKyBTY2FsYXIoMCwyKkVJR0VOX1BJKnVud2luZGluZ051bWJlcikpIC8geTsKKyAgfQorfQorCisvKiBcYnJpZWYgR2V0IHN1aXRhYmxlIGRlZ3JlZSBmb3IgUGFkZSBhcHByb3hpbWF0aW9uLiAoc3BlY2lhbGl6ZWQgZm9yIFJlYWxTY2FsYXIgPSBmbG9hdCkgKi8KK2lubGluZSBpbnQgbWF0cml4X2xvZ19nZXRfcGFkZV9kZWdyZWUoZmxvYXQgbm9ybVRtaW51c0kpCit7CisgIGNvbnN0IGZsb2F0IG1heE5vcm1Gb3JQYWRlW10gPSB7IDIuNTExMTU3MzkzNDU1NTA1NGUtMSAvKiBkZWdyZWUgPSAzICovICwgNC4wNTM1ODM3NDExODgwNDkzZS0xLAorICAgICAgICAgICAgNS4zMTQ5NzI5OTY3MTE3MzEwZS0xIH07CisgIGNvbnN0IGludCBtaW5QYWRlRGVncmVlID0gbWF0cml4X2xvZ19taW5fcGFkZV9kZWdyZWU8ZmxvYXQ+Ojp2YWx1ZTsKKyAgY29uc3QgaW50IG1heFBhZGVEZWdyZWUgPSBtYXRyaXhfbG9nX21heF9wYWRlX2RlZ3JlZTxmbG9hdD46OnZhbHVlOworICBpbnQgZGVncmVlID0gbWluUGFkZURlZ3JlZTsKKyAgZm9yICg7IGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlOyArK2RlZ3JlZSkgCisgICAgaWYgKG5vcm1UbWludXNJIDw9IG1heE5vcm1Gb3JQYWRlW2RlZ3JlZSAtIG1pblBhZGVEZWdyZWVdKQorICAgICAgYnJlYWs7CisgIHJldHVybiBkZWdyZWU7Cit9CisKKy8qIFxicmllZiBHZXQgc3VpdGFibGUgZGVncmVlIGZvciBQYWRlIGFwcHJveGltYXRpb24uIChzcGVjaWFsaXplZCBmb3IgUmVhbFNjYWxhciA9IGRvdWJsZSkgKi8KK2lubGluZSBpbnQgbWF0cml4X2xvZ19nZXRfcGFkZV9kZWdyZWUoZG91YmxlIG5vcm1UbWludXNJKQoreworICBjb25zdCBkb3VibGUgbWF4Tm9ybUZvclBhZGVbXSA9IHsgMS42MjA2Mjg0Nzk1MDE1NjI0ZS0yIC8qIGRlZ3JlZSA9IDMgKi8gLCA1LjM4NzM1MzI2MzEzODExNzFlLTIsCisgICAgICAgICAgICAxLjEzNTI4MDIyNjc2Mjg2ODFlLTEsIDEuODY2Mjg2MDYxMzU0MTI4OGUtMSwgMi42NDI5NjA4MzExMTE0MzVlLTEgfTsKKyAgY29uc3QgaW50IG1pblBhZGVEZWdyZWUgPSBtYXRyaXhfbG9nX21pbl9wYWRlX2RlZ3JlZTxkb3VibGU+Ojp2YWx1ZTsKKyAgY29uc3QgaW50IG1heFBhZGVEZWdyZWUgPSBtYXRyaXhfbG9nX21heF9wYWRlX2RlZ3JlZTxkb3VibGU+Ojp2YWx1ZTsKKyAgaW50IGRlZ3JlZSA9IG1pblBhZGVEZWdyZWU7CisgIGZvciAoOyBkZWdyZWUgPD0gbWF4UGFkZURlZ3JlZTsgKytkZWdyZWUpCisgICAgaWYgKG5vcm1UbWludXNJIDw9IG1heE5vcm1Gb3JQYWRlW2RlZ3JlZSAtIG1pblBhZGVEZWdyZWVdKQorICAgICAgYnJlYWs7CisgIHJldHVybiBkZWdyZWU7Cit9CisKKy8qIFxicmllZiBHZXQgc3VpdGFibGUgZGVncmVlIGZvciBQYWRlIGFwcHJveGltYXRpb24uIChzcGVjaWFsaXplZCBmb3IgUmVhbFNjYWxhciA9IGxvbmcgZG91YmxlKSAqLworaW5saW5lIGludCBtYXRyaXhfbG9nX2dldF9wYWRlX2RlZ3JlZShsb25nIGRvdWJsZSBub3JtVG1pbnVzSSkKK3sKKyNpZiAgIExEQkxfTUFOVF9ESUcgPT0gNTMgICAgICAgICAvLyBkb3VibGUgcHJlY2lzaW9uCisgIGNvbnN0IGxvbmcgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDEuNjIwNjI4NDc5NTAxNTYyNGUtMkwgLyogZGVncmVlID0gMyAqLyAsIDUuMzg3MzUzMjYzMTM4MTE3MWUtMkwsCisgICAgICAgICAgICAxLjEzNTI4MDIyNjc2Mjg2ODFlLTFMLCAxLjg2NjI4NjA2MTM1NDEyODhlLTFMLCAyLjY0Mjk2MDgzMTExMTQzNWUtMUwgfTsKKyNlbGlmIExEQkxfTUFOVF9ESUcgPD0gNjQgICAgICAgICAvLyBleHRlbmRlZCBwcmVjaXNpb24KKyAgY29uc3QgbG9uZyBkb3VibGUgbWF4Tm9ybUZvclBhZGVbXSA9IHsgNS40ODI1NjY5MDM1Nzc4Mjg2MzEwM2UtM0wgLyogZGVncmVlID0gMyAqLywgMi4zNDU1OTE2MjM4Nzk3MTE2NzMyMWUtMkwsCisgICAgICAgICAgICA1Ljg0NjAzOTIzODk3MzQ3NDQ5ODU3ZS0yTCwgMS4wODQ4NjQyMzc1NjcyNTE3MDIyM2UtMUwsIDEuNjgzODU3Njc4ODEyOTQ0NDY2NDllLTFMLAorICAgICAgICAgICAgMi4zMjc3Nzc3NjUyMzcwMzg5MjA5NGUtMUwgfTsKKyNlbGlmIExEQkxfTUFOVF9ESUcgPD0gMTA2ICAgICAgICAvLyBkb3VibGUtZG91YmxlCisgIGNvbnN0IGxvbmcgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDguNTg5NzA1NTAzNDI5Mzk1NjIyMDI1Mjk2NjQzMTg4OTBlLTVMIC8qIGRlZ3JlZSA9IDMgKi8sCisgICAgICAgICAgICA5LjM0MDc0MzI4NDQ2MzU5NjU0MDM5NDQ2NTUyNjc3NzU5ZS00TCwgNC4yNjExNzE5NDY0NzY3MjE3NTc3MzA2NDExNDU4Mjg2MGUtM0wsCisgICAgICAgICAgICAxLjIxNTQ2MjI0NzQwMjgxODQ4NzQzMTQ5NjY2NTYwNDY0ZS0yTCwgMi42MTEwMDU0NDk5ODMzOTQzNjcxMzA4ODI0ODU1NzQ0NGUtMkwsCisgICAgICAgICAgICA0LjY2MTcwMDc0NjI3MDUyNzQ5MjQzMDE4NTY2MzkwNTY3ZS0yTCwgNy4zMjU4NTE0NDQ0NDEzNTAyNzU2NTg3MjAxNDkzMjM4N2UtMkwsCisgICAgICAgICAgICAxLjA1MDI2NTAzNDcxMzUxMDgwNDgxMDkzNjUyNjUxMTA1ZS0xTCB9OworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1YWRydXBsZSBwcmVjaXNpb24KKyAgY29uc3QgbG9uZyBkb3VibGUgbWF4Tm9ybUZvclBhZGVbXSA9IHsgNC43NDE5OTMxMTg3MTkzMDA1MDQ4NTAxNTY4MTY3ODU4MTAzZS01TCAvKiBkZWdyZWUgPSAzICovLAorICAgICAgICAgICAgNS44ODUzMTY4NDczNTQ0NTYwNDcwMzg3NzY5NDgwMTkyNjY2ZS00TCwgMi45MjE2MTIwMzY2NjAxMzE1MzkxNzg5NDkzNjI4MTEzNTIwZS0zTCwKKyAgICAgICAgICAgIDguODQxNTc1ODEyNDMxOTQzNDM0NzExNjczNDcwNTE3NDMwOGUtM0wsIDEuOTg1MDgzNjAyOTQ0OTQ0NjY2ODUxODA0OTU2MjU2NTI5MWUtMkwsCisgICAgICAgICAgICAzLjY2ODgwMTk3Mjk2NTM0NDY5MjY1ODUyNDIxOTI0NDc0NDdlLTJMLCA1LjkyOTA5NjIyOTQwMjAxODY5OTg5NTQwNTUyNjQ1MjgzOTNlLTJMLAorICAgICAgICAgICAgOC42OTk4NDM2MDgxNjM0MzQzOTAzMjUwNTgwOTkyMTI3Njc3ZS0yTCwgMS4xODgwOTYwMjIwMjE2NzU5MjQ1NDY3OTUxNTkyODgzNjQyZS0xTCB9OworI2VuZGlmCisgIGNvbnN0IGludCBtaW5QYWRlRGVncmVlID0gbWF0cml4X2xvZ19taW5fcGFkZV9kZWdyZWU8bG9uZyBkb3VibGU+Ojp2YWx1ZTsKKyAgY29uc3QgaW50IG1heFBhZGVEZWdyZWUgPSBtYXRyaXhfbG9nX21heF9wYWRlX2RlZ3JlZTxsb25nIGRvdWJsZT46OnZhbHVlOworICBpbnQgZGVncmVlID0gbWluUGFkZURlZ3JlZTsKKyAgZm9yICg7IGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlOyArK2RlZ3JlZSkKKyAgICBpZiAobm9ybVRtaW51c0kgPD0gbWF4Tm9ybUZvclBhZGVbZGVncmVlIC0gbWluUGFkZURlZ3JlZV0pCisgICAgICBicmVhazsKKyAgcmV0dXJuIGRlZ3JlZTsKK30KKworLyogXGJyaWVmIENvbXB1dGUgUGFkZSBhcHByb3hpbWF0aW9uIHRvIG1hdHJpeCBsb2dhcml0aG0gKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBtYXRyaXhfbG9nX2NvbXB1dGVfcGFkZShNYXRyaXhUeXBlJiByZXN1bHQsIGNvbnN0IE1hdHJpeFR5cGUmIFQsIGludCBkZWdyZWUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgY29uc3QgaW50IG1pblBhZGVEZWdyZWUgPSAzOworICBjb25zdCBpbnQgbWF4UGFkZURlZ3JlZSA9IDExOworICBhc3NlcnQoZGVncmVlID49IG1pblBhZGVEZWdyZWUgJiYgZGVncmVlIDw9IG1heFBhZGVEZWdyZWUpOworCisgIGNvbnN0IFJlYWxTY2FsYXIgbm9kZXNbXVttYXhQYWRlRGVncmVlXSA9IHsgCisgICAgeyAwLjExMjcwMTY2NTM3OTI1ODMxMTQ4MjA3MzQ2MDAyMTc2MDBMLCAwLjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBMLCAgLy8gZGVncmVlIDMKKyAgICAgIDAuODg3Mjk4MzM0NjIwNzQxNjg4NTE3OTI2NTM5OTc4MjQwMEwgfSwgCisgICAgeyAwLjA2OTQzMTg0NDIwMjk3MzcxMjM4ODAyNjc1NTU1MzU5NTNMLCAwLjMzMDAwOTQ3ODIwNzU3MTg2NzU5ODY2NzEyMDQ0ODM3NzdMLCAgLy8gZGVncmVlIDQKKyAgICAgIDAuNjY5OTkwNTIxNzkyNDI4MTMyNDAxMzMyODc5NTUxNjIyM0wsIDAuOTMwNTY4MTU1Nzk3MDI2Mjg3NjExOTczMjQ0NDQ2NDA0OEwgfSwKKyAgICB7IDAuMDQ2OTEwMDc3MDMwNjY4MDAzNjAxMTg2NTYwODUwMzAzNUwsIDAuMjMwNzY1MzQ0OTQ3MTU4NDU0NDgxODQyNzg5NjQ5ODk1NkwsICAvLyBkZWdyZWUgNQorICAgICAgMC41MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTCwgMC43NjkyMzQ2NTUwNTI4NDE1NDU1MTgxNTcyMTAzNTAxMDQ0TCwKKyAgICAgIDAuOTUzMDg5OTIyOTY5MzMxOTk2Mzk4ODEzNDM5MTQ5Njk2NUwgfSwKKyAgICB7IDAuMDMzNzY1MjQyODk4NDIzOTg2MDkzODQ5MjIyNzUzMDAyN0wsIDAuMTY5Mzk1MzA2NzY2ODY3NzQzMTY5MzAwMjAyNDkwMDQ3M0wsICAvLyBkZWdyZWUgNgorICAgICAgMC4zODA2OTA0MDY5NTg0MDE1NDU2ODQ3NDkxMzkxNTk2NDQwTCwgMC42MTkzMDk1OTMwNDE1OTg0NTQzMTUyNTA4NjA4NDAzNTYwTCwKKyAgICAgIDAuODMwNjA0NjkzMjMzMTMyMjU2ODMwNjk5Nzk3NTA5OTUyN0wsIDAuOTY2MjM0NzU3MTAxNTc2MDEzOTA2MTUwNzc3MjQ2OTk3M0wgfSwKKyAgICB7IDAuMDI1NDQ2MDQzODI4NjIwNzM3NzM2OTA1MTU3OTc2MDc0NEwsIDAuMTI5MjM0NDA3MjAwMzAyNzgwMDY4MDY3NjEzMzU5NjA1OEwsICAvLyBkZWdyZWUgNworICAgICAgMC4yOTcwNzc0MjQzMTEzMDE0MTY1NDY2OTY3OTM5NjE1MTkzTCwgMC41MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTCwKKyAgICAgIDAuNzAyOTIyNTc1Njg4Njk4NTgzNDUzMzAzMjA2MDM4NDgwN0wsIDAuODcwNzY1NTkyNzk5Njk3MjE5OTMxOTMyMzg2NjQwMzk0MkwsCisgICAgICAwLjk3NDU1Mzk1NjE3MTM3OTI2MjI2MzA5NDg0MjAyMzkyNTZMIH0sCisgICAgeyAwLjAxOTg1NTA3MTc1MTIzMTg4NDE1ODIxOTU2NTcxNTI2MzVMLCAwLjEwMTY2Njc2MTI5MzE4NjYzMDIwNDIyMzAzMTc2MjA4NDhMLCAgLy8gZGVncmVlIDgKKyAgICAgIDAuMjM3MjMzNzk1MDQxODM1NTA3MDkxMTMwNDc1NDA1Mzc2OEwsIDAuNDA4MjgyNjc4NzUyMTc1MDk3NTMwMjYxOTI4ODE5OTA4MEwsCisgICAgICAwLjU5MTcxNzMyMTI0NzgyNDkwMjQ2OTczODA3MTE4MDA5MjBMLCAwLjc2Mjc2NjIwNDk1ODE2NDQ5MjkwODg2OTUyNDU5NDYyMzJMLAorICAgICAgMC44OTgzMzMyMzg3MDY4MTMzNjk3OTU3NzY5NjgyMzc5MTUyTCwgMC45ODAxNDQ5MjgyNDg3NjgxMTU4NDE3ODA0MzQyODQ3MzY1TCB9LAorICAgIHsgMC4wMTU5MTk4ODAyNDYxODY5NTUwODIyMTE4OTg1NDgxNjM2TCwgMC4wODE5ODQ0NDYzMzY2ODIxMDI4NTAyODUxMDU5NjUxMzI2TCwgIC8vIGRlZ3JlZSA5CisgICAgICAwLjE5MzMxNDI4MzY0OTcwNDgwMTM0NTY0ODk4MDMyOTI2MjlMLCAwLjMzNzg3MzI4ODI5ODA5NTUzNTQ4MDczMDk5MjY3ODMzMTdMLAorICAgICAgMC41MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTCwgMC42NjIxMjY3MTE3MDE5MDQ0NjQ1MTkyNjkwMDczMjE2NjgzTCwKKyAgICAgIDAuODA2Njg1NzE2MzUwMjk1MTk4NjU0MzUxMDE5NjcwNzM3MUwsIDAuOTE4MDE1NTUzNjYzMzE3ODk3MTQ5NzE0ODk0MDM0ODY3NEwsCisgICAgICAwLjk4NDA4MDExOTc1MzgxMzA0NDkxNzc4ODEwMTQ1MTgzNjRMIH0sCisgICAgeyAwLjAxMzA0NjczNTc0MTQxNDEzOTk2MTAxNzk5Mzk1Nzc3NDBMLCAwLjA2NzQ2ODMxNjY1NTUwNzc0NDYzMzk1MTY1NTc4ODI1MzVMLCAgLy8gZGVncmVlIDEwCisgICAgICAwLjE2MDI5NTIxNTg1MDQ4Nzc5Njg4MjgzNjMxNzQ0MjU2MzJMLCAwLjI4MzMwMjMwMjkzNTM3NjQwNDYwMDM2NzAyODQxNzEwNzlMLAorICAgICAgMC40MjU1NjI4MzA1MDkxODQzOTQ1NTc1ODY5OTk0MzUxNDAwTCwgMC41NzQ0MzcxNjk0OTA4MTU2MDU0NDI0MTMwMDA1NjQ4NjAwTCwKKyAgICAgIDAuNzE2Njk3Njk3MDY0NjIzNTk1Mzk5NjMyOTcxNTgyODkyMUwsIDAuODM5NzA0Nzg0MTQ5NTEyMjAzMTE3MTYzNjgyNTU3NDM2OEwsCisgICAgICAwLjkzMjUzMTY4MzM0NDQ5MjI1NTM2NjA0ODM0NDIxMTc0NjVMLCAwLjk4Njk1MzI2NDI1ODU4NTg2MDAzODk4MjAwNjA0MjIyNjBMIH0sCisgICAgeyAwLjAxMDg4NTY3MDkyNjk3MTUwMzU5ODAzMDk5OTQzODU3MTNMLCAwLjA1NjQ2ODcwMDExNTk1MjM1MDQ2MjQyMTExNTM0ODAzNjRMLCAgLy8gZGVncmVlIDExCisgICAgICAwLjEzNDkyMzk5NzIxMjk3NTMzNzk1MzI5MTg3Mzk4NDQyMzNMLCAwLjI0MDQ1MTkzNTM5NjU5NDA5MjAzNzEzNzE2NTI3MDY5NTJMLAorICAgICAgMC4zNjUyMjg0MjIwMjM4Mjc1MTM4MzQyMzQwMDcyOTk1NjkyTCwgMC41MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTCwKKyAgICAgIDAuNjM0NzcxNTc3OTc2MTcyNDg2MTY1NzY1OTkyNzAwNDMwOEwsIDAuNzU5NTQ4MDY0NjAzNDA1OTA3OTYyODYyODM0NzI5MzA0OEwsCisgICAgICAwLjg2NTA3NjAwMjc4NzAyNDY2MjA0NjcwODEyNjAxNTU3NjdMLCAwLjk0MzUzMTI5OTg4NDA0NzY0OTUzNzU3ODg4NDY1MTk2MzZMLAorICAgICAgMC45ODkxMTQzMjkwNzMwMjg0OTY0MDE5NjkwMDA1NjE0Mjg3TCB9IH07CisKKyAgY29uc3QgUmVhbFNjYWxhciB3ZWlnaHRzW11bbWF4UGFkZURlZ3JlZV0gPSB7IAorICAgIHsgMC4yNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc4TCwgMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0TCwgIC8vIGRlZ3JlZSAzCisgICAgICAwLjI3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzhMIH0sCisgICAgeyAwLjE3MzkyNzQyMjU2ODcyNjkyODY4NjUzMTk3NDYxMDk5OTdMLCAwLjMyNjA3MjU3NzQzMTI3MzA3MTMxMzQ2ODAyNTM4OTAwMDNMLCAgLy8gZGVncmVlIDQKKyAgICAgIDAuMzI2MDcyNTc3NDMxMjczMDcxMzEzNDY4MDI1Mzg5MDAwM0wsIDAuMTczOTI3NDIyNTY4NzI2OTI4Njg2NTMxOTc0NjEwOTk5N0wgfSwKKyAgICB7IDAuMTE4NDYzNDQyNTI4MDk0NTQzNzU3MTMyMDIwMzU5OTU4N0wsIDAuMjM5MzE0MzM1MjQ5NjgzMjM0MDIwNjQ1NzU3NDE3ODE5MUwsICAvLyBkZWdyZWUgNQorICAgICAgMC4yODQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0TCwgMC4yMzkzMTQzMzUyNDk2ODMyMzQwMjA2NDU3NTc0MTc4MTkxTCwKKyAgICAgIDAuMTE4NDYzNDQyNTI4MDk0NTQzNzU3MTMyMDIwMzU5OTU4N0wgfSwKKyAgICB7IDAuMDg1NjYyMjQ2MTg5NTg1MTcyNTIwMTQ4MDcxMDg2MzY2NUwsIDAuMTgwMzgwNzg2NTI0MDY5MzAzNzg0OTE2NzU2OTE4ODU4MUwsICAvLyBkZWdyZWUgNgorICAgICAgMC4yMzM5NTY5NjcyODYzNDU1MjM2OTQ5MzUxNzE5OTQ3NzU1TCwgMC4yMzM5NTY5NjcyODYzNDU1MjM2OTQ5MzUxNzE5OTQ3NzU1TCwKKyAgICAgIDAuMTgwMzgwNzg2NTI0MDY5MzAzNzg0OTE2NzU2OTE4ODU4MUwsIDAuMDg1NjYyMjQ2MTg5NTg1MTcyNTIwMTQ4MDcxMDg2MzY2NUwgfSwKKyAgICB7IDAuMDY0NzQyNDgzMDg0NDM0ODQ2NjM1MzA1NzE2MzM5NTQxMEwsIDAuMTM5ODUyNjk1NzQ0NjM4MzMzOTUwNzMzODg1NzExODg5OEwsICAvLyBkZWdyZWUgNworICAgICAgMC4xOTA5MTUwMjUyNTI1NTk0NzI0NzUxODQ4ODc3NDQ0ODc2TCwgMC4yMDg5Nzk1OTE4MzY3MzQ2OTM4Nzc1NTEwMjA0MDgxNjMzTCwKKyAgICAgIDAuMTkwOTE1MDI1MjUyNTU5NDcyNDc1MTg0ODg3NzQ0NDg3NkwsIDAuMTM5ODUyNjk1NzQ0NjM4MzMzOTUwNzMzODg1NzExODg5OEwsCisgICAgICAwLjA2NDc0MjQ4MzA4NDQzNDg0NjYzNTMwNTcxNjMzOTU0MTBMIH0sCisgICAgeyAwLjA1MDYxNDI2ODE0NTE4ODEyOTU3NjI2NTY3NzE1NDk4MTFMLCAwLjExMTE5MDUxNzIyNjY4NzIzNTI3MjE3Nzk5NzIxMzEyMDRMLCAgLy8gZGVncmVlIDgKKyAgICAgIDAuMTU2ODUzMzIyOTM4OTQzNjQzNjY4OTgxMTAwOTkzMzAwN0wsIDAuMTgxMzQxODkxNjg5MTgwOTkxNDgyNTc1MjI0NjM4NTk3OEwsCisgICAgICAwLjE4MTM0MTg5MTY4OTE4MDk5MTQ4MjU3NTIyNDYzODU5NzhMLCAwLjE1Njg1MzMyMjkzODk0MzY0MzY2ODk4MTEwMDk5MzMwMDdMLAorICAgICAgMC4xMTExOTA1MTcyMjY2ODcyMzUyNzIxNzc5OTcyMTMxMjA0TCwgMC4wNTA2MTQyNjgxNDUxODgxMjk1NzYyNjU2NzcxNTQ5ODExTCB9LAorICAgIHsgMC4wNDA2MzcxOTQxODA3ODcyMDU5ODU5NDYwNzkwNTUyNjE4TCwgMC4wOTAzMjQwODAzNDc0Mjg3MDIwMjkyMzYwMTU2MjE0NTY0TCwgIC8vIGRlZ3JlZSA5CisgICAgICAwLjEzMDMwNTM0ODIwMTQ2NzczMTE1OTM3MTQzNDcwOTMxNjRMLCAwLjE1NjE3MzUzODUyMDAwMTQyMDAzNDMxNTIwMzI5MjIyMThMLAorICAgICAgMC4xNjUxMTk2Nzc1MDA2Mjk4ODE1ODIyNjI1MzQ2NDM0ODcwTCwgMC4xNTYxNzM1Mzg1MjAwMDE0MjAwMzQzMTUyMDMyOTIyMjE4TCwKKyAgICAgIDAuMTMwMzA1MzQ4MjAxNDY3NzMxMTU5MzcxNDM0NzA5MzE2NEwsIDAuMDkwMzI0MDgwMzQ3NDI4NzAyMDI5MjM2MDE1NjIxNDU2NEwsCisgICAgICAwLjA0MDYzNzE5NDE4MDc4NzIwNTk4NTk0NjA3OTA1NTI2MThMIH0sCisgICAgeyAwLjAzMzMzNTY3MjE1NDM0NDA2ODc5Njc4NDQwNDk0NjY2NTlMLCAwLjA3NDcyNTY3NDU3NTI5MDI5NjU3Mjg4ODE2OTgyODg0ODdMLCAgLy8gZGVncmVlIDEwCisgICAgICAwLjEwOTU0MzE4MTI1Nzk5MTAyMTk5Nzc2NzQ2NzExNDA4MTZMLCAwLjEzNDYzMzM1OTY1NDk5ODE3NzU0NTYxMzQ2MDc4NDczNDdMLAorICAgICAgMC4xNDc3NjIxMTIzNTczNzY0MzUwODY5NDY0OTczMjU2NjkyTCwgMC4xNDc3NjIxMTIzNTczNzY0MzUwODY5NDY0OTczMjU2NjkyTCwKKyAgICAgIDAuMTM0NjMzMzU5NjU0OTk4MTc3NTQ1NjEzNDYwNzg0NzM0N0wsIDAuMTA5NTQzMTgxMjU3OTkxMDIxOTk3NzY3NDY3MTE0MDgxNkwsCisgICAgICAwLjA3NDcyNTY3NDU3NTI5MDI5NjU3Mjg4ODE2OTgyODg0ODdMLCAwLjAzMzMzNTY3MjE1NDM0NDA2ODc5Njc4NDQwNDk0NjY2NTlMIH0sCisgICAgeyAwLjAyNzgzNDI4MzU1ODA4NjgzMzI0MTM3Njg2MDIyMTI3NDNMLCAwLjA2Mjc5MDE4NDczMjQ1MjMxMjMxNzM0NzE0OTYxMTk3MDFMLCAgLy8gZGVncmVlIDExCisgICAgICAwLjA5MzE0NTEwNTQ2Mzg2NzEyNTcxMzA0ODgyMDcxNTgyODBMLCAwLjExNjU5Njg4MjI5NTk5NTIzOTk1OTI2MTg1MjQyMTU4NzZMLAorICAgICAgMC4xMzE0MDIyNzIyNTUxMjMzMzEwOTAzNDQ0MzQ5NDUyNTQ2TCwgMC4xMzY0NjI1NDMzODg5NTAzMTUzNTcyNDE3NjQxNjgxNzExTCwKKyAgICAgIDAuMTMxNDAyMjcyMjU1MTIzMzMxMDkwMzQ0NDM0OTQ1MjU0NkwsIDAuMTE2NTk2ODgyMjk1OTk1MjM5OTU5MjYxODUyNDIxNTg3NkwsCisgICAgICAwLjA5MzE0NTEwNTQ2Mzg2NzEyNTcxMzA0ODgyMDcxNTgyODBMLCAwLjA2Mjc5MDE4NDczMjQ1MjMxMjMxNzM0NzE0OTYxMTk3MDFMLAorICAgICAgMC4wMjc4MzQyODM1NTgwODY4MzMyNDEzNzY4NjAyMjEyNzQzTCB9IH07CisKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spIHsKKyAgICBSZWFsU2NhbGFyIHdlaWdodCA9IHdlaWdodHNbZGVncmVlLW1pblBhZGVEZWdyZWVdW2tdOworICAgIFJlYWxTY2FsYXIgbm9kZSA9IG5vZGVzW2RlZ3JlZS1taW5QYWRlRGVncmVlXVtrXTsKKyAgICByZXN1bHQgKz0gd2VpZ2h0ICogKE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSkgKyBub2RlICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKFRtaW51c0kpOworICB9Cit9IAorCisvKiogXGJyaWVmIENvbXB1dGUgbG9nYXJpdGhtIG9mIHRyaWFuZ3VsYXIgbWF0cmljZXMgd2l0aCBzaXplID4gMi4gCisgICogXGRldGFpbHMgVGhpcyB1c2VzIGEgaW52ZXJzZSBzY2FsZS1hbmQtc3F1YXJlIGFsZ29yaXRobS4gKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBtYXRyaXhfbG9nX2NvbXB1dGVfYmlnKGNvbnN0IE1hdHJpeFR5cGUmIEEsIE1hdHJpeFR5cGUmIHJlc3VsdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHVzaW5nIHN0ZDo6cG93OworCisgIGludCBudW1iZXJPZlNxdWFyZVJvb3RzID0gMDsKKyAgaW50IG51bWJlck9mRXh0cmFTcXVhcmVSb290cyA9IDA7CisgIGludCBkZWdyZWU7CisgIE1hdHJpeFR5cGUgVCA9IEEsIHNxcnRUOworCisgIGludCBtYXhQYWRlRGVncmVlID0gbWF0cml4X2xvZ19tYXhfcGFkZV9kZWdyZWU8U2NhbGFyPjo6dmFsdWU7CisgIGNvbnN0IFJlYWxTY2FsYXIgbWF4Tm9ybUZvclBhZGUgPSBtYXhQYWRlRGVncmVlPD0gNT8gNS4zMTQ5NzI5OTY3MTE3MzEwZS0xTDogICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhZGVEZWdyZWU8PSA3PyAyLjY0Mjk2MDgzMTExMTQzNTBlLTFMOiAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGFkZURlZ3JlZTw9IDg/IDIuMzI3Nzc3NzY1MjM3MDM4OTIwOTRlLTFMOiAgICAgICAgICAgICAgICAvLyBleHRlbmRlZCBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhZGVEZWdyZWU8PTEwPyAxLjA1MDI2NTAzNDcxMzUxMDgwNDgxMDkzNjUyNjUxMTA1ZS0xTDogICAgLy8gZG91YmxlLWRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg4MDk2MDIyMDIxNjc1OTI0NTQ2Nzk1MTU5Mjg4MzY0MmUtMUw7ICAvLyBxdWFkcnVwbGUgcHJlY2lzaW9uCisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBSZWFsU2NhbGFyIG5vcm1UbWludXNJID0gKFQgLSBNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpKS5jd2lzZUFicygpLmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICAgIGlmIChub3JtVG1pbnVzSSA8IG1heE5vcm1Gb3JQYWRlKSB7CisgICAgICBkZWdyZWUgPSBtYXRyaXhfbG9nX2dldF9wYWRlX2RlZ3JlZShub3JtVG1pbnVzSSk7CisgICAgICBpbnQgZGVncmVlMiA9IG1hdHJpeF9sb2dfZ2V0X3BhZGVfZGVncmVlKG5vcm1UbWludXNJIC8gUmVhbFNjYWxhcigyKSk7CisgICAgICBpZiAoKGRlZ3JlZSAtIGRlZ3JlZTIgPD0gMSkgfHwgKG51bWJlck9mRXh0cmFTcXVhcmVSb290cyA9PSAxKSkgCisgICAgICAgIGJyZWFrOworICAgICAgKytudW1iZXJPZkV4dHJhU3F1YXJlUm9vdHM7CisgICAgfQorICAgIG1hdHJpeF9zcXJ0X3RyaWFuZ3VsYXIoVCwgc3FydFQpOworICAgIFQgPSBzcXJ0VC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICArK251bWJlck9mU3F1YXJlUm9vdHM7CisgIH0KKworICBtYXRyaXhfbG9nX2NvbXB1dGVfcGFkZShyZXN1bHQsIFQsIGRlZ3JlZSk7CisgIHJlc3VsdCAqPSBwb3coUmVhbFNjYWxhcigyKSwgbnVtYmVyT2ZTcXVhcmVSb290cyk7Cit9CisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICogXGNsYXNzIE1hdHJpeExvZ2FyaXRobUF0b21pYworICAqIFxicmllZiBIZWxwZXIgY2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggbG9nYXJpdGhtIG9mIGF0b21pYyBtYXRyaWNlcy4KKyAgKgorICAqIEhlcmUsIGFuIGF0b21pYyBtYXRyaXggaXMgYSB0cmlhbmd1bGFyIG1hdHJpeCB3aG9zZSBkaWFnb25hbCBlbnRyaWVzIGFyZSBjbG9zZSB0byBlYWNoIG90aGVyLgorICAqCisgICogXHNhIGNsYXNzIE1hdHJpeEZ1bmN0aW9uQXRvbWljLCBNYXRyaXhCYXNlOjpsb2coKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhMb2dhcml0aG1BdG9taWMKK3sKK3B1YmxpYzoKKyAgLyoqIFxicmllZiBDb21wdXRlIG1hdHJpeCBsb2dhcml0aG0gb2YgYXRvbWljIG1hdHJpeAorICAgICogXHBhcmFtW2luXSAgQSAgYXJndW1lbnQgb2YgbWF0cml4IGxvZ2FyaXRobSwgc2hvdWxkIGJlIHVwcGVyIHRyaWFuZ3VsYXIgYW5kIGF0b21pYworICAgICogXHJldHVybnMgIFRoZSBsb2dhcml0aG0gb2YgXHAgQS4KKyAgICAqLworICBNYXRyaXhUeXBlIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIHVzaW5nIHN0ZDo6bG9nOworICBNYXRyaXhUeXBlIHJlc3VsdChBLnJvd3MoKSwgQS5yb3dzKCkpOworICBpZiAoQS5yb3dzKCkgPT0gMSkKKyAgICByZXN1bHQoMCwwKSA9IGxvZyhBKDAsMCkpOworICBlbHNlIGlmIChBLnJvd3MoKSA9PSAyKQorICAgIG1hdHJpeF9sb2dfY29tcHV0ZV8yeDIoQSwgcmVzdWx0KTsKKyAgZWxzZQorICAgIG1hdHJpeF9sb2dfY29tcHV0ZV9iaWcoQSwgcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUHJveHkgZm9yIHRoZSBtYXRyaXggbG9nYXJpdGhtIG9mIHNvbWUgbWF0cml4IChleHByZXNzaW9uKS4KKyAgKgorICAqIFx0cGFyYW0gRGVyaXZlZCAgVHlwZSBvZiB0aGUgYXJndW1lbnQgdG8gdGhlIG1hdHJpeCBmdW5jdGlvbi4KKyAgKgorICAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggZnVuY3Rpb24gdW50aWwgaXQgaXMKKyAgKiBhc3NpZ25lZCBvciBldmFsdWF0ZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uIChzbyB0aGUgYXJndW1lbnQKKyAgKiBzaG91bGQgbm90IGJlIGNoYW5nZWQgaW4gdGhlIG1lYW50aW1lKS4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mCisgICogTWF0cml4QmFzZTo6bG9nKCkgYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQKKyAgKiBpcyB1c2VkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWUKKzogcHVibGljIFJldHVybkJ5VmFsdWU8TWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWU8RGVyaXZlZD4gPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPERlcml2ZWQ+Ojp0eXBlIERlcml2ZWROZXN0ZWQ7CisKK3B1YmxpYzoKKworICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgICoKKyAgICAqIFxwYXJhbVtpbl0gIEEgICVNYXRyaXggKGV4cHJlc3Npb24pIGZvcm1pbmcgdGhlIGFyZ3VtZW50IG9mIHRoZSBtYXRyaXggbG9nYXJpdGhtLgorICAgICovCisgIGV4cGxpY2l0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlKGNvbnN0IERlcml2ZWQmIEEpIDogbV9BKEEpIHsgfQorICAKKyAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggbG9nYXJpdGhtLgorICAgICoKKyAgICAqIFxwYXJhbVtvdXRdICByZXN1bHQgIExvZ2FyaXRobSBvZiBccCBBLCB3aGVyZSBcQSBpcyBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICBpbmxpbmUgdm9pZCBldmFsVG8oUmVzdWx0VHlwZSYgcmVzdWx0KSBjb25zdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8RGVyaXZlZCwgMTA+Ojp0eXBlIERlcml2ZWRFdmFsVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlcml2ZWRFdmFsVHlwZT46OnR5cGUgRGVyaXZlZEV2YWxUeXBlQ2xlYW47CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWRFdmFsVHlwZUNsZWFuPiBUcmFpdHM7CisgICAgc3RhdGljIGNvbnN0IGludCBSb3dzQXRDb21waWxlVGltZSA9IFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWU7CisgICAgc3RhdGljIGNvbnN0IGludCBDb2xzQXRDb21waWxlVGltZSA9IFRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWw+IENvbXBsZXhTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgMCwgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lPiBEeW5NYXRyaXhUeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6Ok1hdHJpeExvZ2FyaXRobUF0b21pYzxEeW5NYXRyaXhUeXBlPiBBdG9taWNUeXBlOworICAgIEF0b21pY1R5cGUgYXRvbWljOworICAgIAorICAgIGludGVybmFsOjptYXRyaXhfZnVuY3Rpb25fY29tcHV0ZTx0eXBlbmFtZSBEZXJpdmVkRXZhbFR5cGVDbGVhbjo6UGxhaW5PYmplY3Q+OjpydW4obV9BLCBhdG9taWMsIHJlc3VsdCk7CisgIH0KKworICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9BLnJvd3MoKTsgfQorICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9BLmNvbHMoKTsgfQorICAKK3ByaXZhdGU6CisgIGNvbnN0IERlcml2ZWROZXN0ZWQgbV9BOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgc3RydWN0IHRyYWl0czxNYXRyaXhMb2dhcml0aG1SZXR1cm5WYWx1ZTxEZXJpdmVkPiA+CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7CisgIH07Cit9CisKKworLyoqKioqKioqKiogTWF0cml4QmFzZSBtZXRob2QgKioqKioqKioqKi8KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmxvZygpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgcmV0dXJuIE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0xPR0FSSVRITQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhQb3dlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhQb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeFBvd2VyLmgKQEAgLTAsMCArMSw3MDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzIENoZW4tUGFuZyBIZSA8amRoOEBtczYzLmhpbmV0Lm5ldD4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX1BPV0VSCisjZGVmaW5lIEVJR0VOX01BVFJJWF9QT1dFUgorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBNYXRyaXhQb3dlcjsKKworLyoqCisgKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgKgorICogXGJyaWVmIFByb3h5IGZvciB0aGUgbWF0cml4IHBvd2VyIG9mIHNvbWUgbWF0cml4LgorICoKKyAqIFx0cGFyYW0gTWF0cml4VHlwZSAgdHlwZSBvZiB0aGUgYmFzZSwgYSBtYXRyaXguCisgKgorICogVGhpcyBjbGFzcyBob2xkcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBtYXRyaXggcG93ZXIgdW50aWwgaXQgaXMKKyAqIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3Igc29tZSBvdGhlciByZWFzb24gKHNvIHRoZSBhcmd1bWVudAorICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZgorICogTWF0cml4UG93ZXI6Om9wZXJhdG9yKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBtb3N0IG9mIHRoZQorICogdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICovCisvKiBUT0RPIFRoaXMgY2xhc3MgaXMgb25seSB1c2VkIGJ5IE1hdHJpeFBvd2VyLCBzbyBpdCBzaG91bGQgYmUgbmVzdGVkCisgKiBpbnRvIE1hdHJpeFBvd2VyLCBsaWtlIE1hdHJpeFBvd2VyOjpSZXR1cm5WYWx1ZS4gSG93ZXZlciwgbXkKKyAqIGNvbXBpbGVyIGNvbXBsYWluZWQgYWJvdXQgdW51c2VkIHRlbXBsYXRlIHBhcmFtZXRlciBpbiB0aGUKKyAqIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpbiBuYW1lc3BhY2UgaW50ZXJuYWwuCisgKgorICogdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAqIHN0cnVjdCB0cmFpdHM8TWF0cml4UG93ZXI8TWF0cml4VHlwZT46OlJldHVyblZhbHVlPjsKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIE1hdHJpeFBvd2VyUGFyZW50aGVzZXNSZXR1cm5WYWx1ZSA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPCBNYXRyaXhQb3dlclBhcmVudGhlc2VzUmV0dXJuVmFsdWU8TWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIC8qKgorICAgICAqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gcG93ICAlTWF0cml4UG93ZXIgc3RvcmluZyB0aGUgYmFzZS4KKyAgICAgKiBccGFyYW1baW5dIHAgICAgc2NhbGFyLCB0aGUgZXhwb25lbnQgb2YgdGhlIG1hdHJpeCBwb3dlci4KKyAgICAgKi8KKyAgICBNYXRyaXhQb3dlclBhcmVudGhlc2VzUmV0dXJuVmFsdWUoTWF0cml4UG93ZXI8TWF0cml4VHlwZT4mIHBvdywgUmVhbFNjYWxhciBwKSA6IG1fcG93KHBvdyksIG1fcChwKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBwb3dlci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlcykgY29uc3QKKyAgICB7IG1fcG93LmNvbXB1dGUocmVzLCBtX3ApOyB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9wb3cucm93cygpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcG93LmNvbHMoKTsgfQorCisgIHByaXZhdGU6CisgICAgTWF0cml4UG93ZXI8TWF0cml4VHlwZT4mIG1fcG93OworICAgIGNvbnN0IFJlYWxTY2FsYXIgbV9wOworfTsKKworLyoqCisgKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgKgorICogXGJyaWVmIENsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IHBvd2Vycy4KKyAqCisgKiBcdHBhcmFtIE1hdHJpeFR5cGUgIHR5cGUgb2YgdGhlIGJhc2UsIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24KKyAqIG9mIHRoZSBNYXRyaXggY2xhc3MgdGVtcGxhdGUuCisgKgorICogVGhpcyBjbGFzcyBpcyBjYXBhYmxlIG9mIGNvbXB1dGluZyB0cmlhbmd1bGFyIHJlYWwvY29tcGxleCBtYXRyaWNlcworICogcmFpc2VkIHRvIGEgcG93ZXIgaW4gdGhlIGludGVydmFsIFxmJCAoLTEsIDEpIFxmJC4KKyAqCisgKiBcbm90ZSBDdXJyZW50bHkgdGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgYnkgTWF0cml4UG93ZXIuIE9uZSBtYXkKKyAqIGluc2lzdCB0aGF0IHRoaXMgYmUgbmVzdGVkIGludG8gTWF0cml4UG93ZXIuIFRoaXMgY2xhc3MgaXMgaGVyZSB0bworICogZmFjaWxpYXRlIGZ1dHVyZSBkZXZlbG9wbWVudCBvZiB0cmlhbmd1bGFyIG1hdHJpeCBmdW5jdGlvbnMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhQb3dlckF0b21pYyA6IGludGVybmFsOjpub25jb3B5YWJsZQoreworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gUmVzdWx0VHlwZTsKKworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1fQTsKKyAgICBSZWFsU2NhbGFyIG1fcDsKKworICAgIHZvaWQgY29tcHV0ZVBhZGUoaW50IGRlZ3JlZSwgY29uc3QgTWF0cml4VHlwZSYgSW1pbnVzVCwgUmVzdWx0VHlwZSYgcmVzKSBjb25zdDsKKyAgICB2b2lkIGNvbXB1dGUyeDIoUmVzdWx0VHlwZSYgcmVzLCBSZWFsU2NhbGFyIHApIGNvbnN0OworICAgIHZvaWQgY29tcHV0ZUJpZyhSZXN1bHRUeXBlJiByZXMpIGNvbnN0OworICAgIHN0YXRpYyBpbnQgZ2V0UGFkZURlZ3JlZShmbG9hdCBub3JtSW1pbnVzVCk7CisgICAgc3RhdGljIGludCBnZXRQYWRlRGVncmVlKGRvdWJsZSBub3JtSW1pbnVzVCk7CisgICAgc3RhdGljIGludCBnZXRQYWRlRGVncmVlKGxvbmcgZG91YmxlIG5vcm1JbWludXNUKTsKKyAgICBzdGF0aWMgQ29tcGxleFNjYWxhciBjb21wdXRlU3VwZXJEaWFnKGNvbnN0IENvbXBsZXhTY2FsYXImLCBjb25zdCBDb21wbGV4U2NhbGFyJiwgUmVhbFNjYWxhciBwKTsKKyAgICBzdGF0aWMgUmVhbFNjYWxhciBjb21wdXRlU3VwZXJEaWFnKFJlYWxTY2FsYXIsIFJlYWxTY2FsYXIsIFJlYWxTY2FsYXIgcCk7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gVCAgdGhlIGJhc2Ugb2YgdGhlIG1hdHJpeCBwb3dlci4KKyAgICAgKiBccGFyYW1baW5dIHAgIHRoZSBleHBvbmVudCBvZiB0aGUgbWF0cml4IHBvd2VyLCBzaG91bGQgYmUgaW4KKyAgICAgKiBcZiQgKC0xLCAxKSBcZiQuCisgICAgICoKKyAgICAgKiBUaGUgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIFQsIHNvIGl0IHNob3VsZCBub3QgYmUgY2hhbmdlZAorICAgICAqIChvciBkZXN0cm95ZWQpIGJlZm9yZSBldmFsdWF0aW9uLiBPbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyCisgICAgICogcGFydCBvZiBUIGlzIHJlYWQuCisgICAgICovCisgICAgTWF0cml4UG93ZXJBdG9taWMoY29uc3QgTWF0cml4VHlwZSYgVCwgUmVhbFNjYWxhciBwKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZSB0aGUgbWF0cml4IHBvd2VyLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcmVzICBcZiQgQV5wIFxmJCB3aGVyZSBBIGFuZCBwIGFyZSBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uc3RydWN0b3IuCisgICAgICovCisgICAgdm9pZCBjb21wdXRlKFJlc3VsdFR5cGUmIHJlcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46Ok1hdHJpeFBvd2VyQXRvbWljKGNvbnN0IE1hdHJpeFR5cGUmIFQsIFJlYWxTY2FsYXIgcCkgOgorICBtX0EoVCksIG1fcChwKQoreworICBlaWdlbl9hc3NlcnQoVC5yb3dzKCkgPT0gVC5jb2xzKCkpOworICBlaWdlbl9hc3NlcnQocCA+IC0xICYmIHAgPCAxKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGUoUmVzdWx0VHlwZSYgcmVzKSBjb25zdAoreworICB1c2luZyBzdGQ6OnBvdzsKKyAgc3dpdGNoIChtX0Eucm93cygpKSB7CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcmVzKDAsMCkgPSBwb3cobV9BKDAsMCksIG1fcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBjb21wdXRlMngyKHJlcywgbV9wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjb21wdXRlQmlnKHJlcyk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGVQYWRlKGludCBkZWdyZWUsIGNvbnN0IE1hdHJpeFR5cGUmIEltaW51c1QsIFJlc3VsdFR5cGUmIHJlcykgY29uc3QKK3sKKyAgaW50IGkgPSAyKmRlZ3JlZTsKKyAgcmVzID0gKG1fcC1kZWdyZWUpIC8gKDIqaS0yKSAqIEltaW51c1Q7CisKKyAgZm9yICgtLWk7IGk7IC0taSkgeworICAgIHJlcyA9IChNYXRyaXhUeXBlOjpJZGVudGl0eShJbWludXNULnJvd3MoKSwgSW1pbnVzVC5jb2xzKCkpICsgcmVzKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorCS5zb2x2ZSgoaT09MSA/IC1tX3AgOiBpJjEgPyAoLW1fcC1pLzIpLygyKmkpIDogKG1fcC1pLzIpLygyKmktMikpICogSW1pbnVzVCkuZXZhbCgpOworICB9CisgIHJlcyArPSBNYXRyaXhUeXBlOjpJZGVudGl0eShJbWludXNULnJvd3MoKSwgSW1pbnVzVC5jb2xzKCkpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCByZXMgaGFzIHRoZSBjb3JyZWN0IHNpemUgKHNlZSBidWcgNjE0KQordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGUyeDIoUmVzdWx0VHlwZSYgcmVzLCBSZWFsU2NhbGFyIHApIGNvbnN0Cit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OnBvdzsKKyAgcmVzLmNvZWZmUmVmKDAsMCkgPSBwb3cobV9BLmNvZWZmKDAsMCksIHApOworCisgIGZvciAoSW5kZXggaT0xOyBpIDwgbV9BLmNvbHMoKTsgKytpKSB7CisgICAgcmVzLmNvZWZmUmVmKGksaSkgPSBwb3cobV9BLmNvZWZmKGksaSksIHApOworICAgIGlmIChtX0EuY29lZmYoaS0xLGktMSkgPT0gbV9BLmNvZWZmKGksaSkpCisgICAgICByZXMuY29lZmZSZWYoaS0xLGkpID0gcCAqIHBvdyhtX0EuY29lZmYoaSxpKSwgcC0xKTsKKyAgICBlbHNlIGlmICgyKmFicyhtX0EuY29lZmYoaS0xLGktMSkpIDwgYWJzKG1fQS5jb2VmZihpLGkpKSB8fCAyKmFicyhtX0EuY29lZmYoaSxpKSkgPCBhYnMobV9BLmNvZWZmKGktMSxpLTEpKSkKKyAgICAgIHJlcy5jb2VmZlJlZihpLTEsaSkgPSAocmVzLmNvZWZmKGksaSktcmVzLmNvZWZmKGktMSxpLTEpKSAvIChtX0EuY29lZmYoaSxpKS1tX0EuY29lZmYoaS0xLGktMSkpOworICAgIGVsc2UKKyAgICAgIHJlcy5jb2VmZlJlZihpLTEsaSkgPSBjb21wdXRlU3VwZXJEaWFnKG1fQS5jb2VmZihpLGkpLCBtX0EuY29lZmYoaS0xLGktMSksIHApOworICAgIHJlcy5jb2VmZlJlZihpLTEsaSkgKj0gbV9BLmNvZWZmKGktMSxpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhQb3dlckF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZUJpZyhSZXN1bHRUeXBlJiByZXMpIGNvbnN0Cit7CisgIHVzaW5nIHN0ZDo6bGRleHA7CisgIGNvbnN0IGludCBkaWdpdHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM7CisgIGNvbnN0IFJlYWxTY2FsYXIgbWF4Tm9ybUZvclBhZGUgPSBkaWdpdHMgPD0gIDI0PyA0LjMzODY1MjhlLTFMICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpZ2l0cyA8PSAgNTM/IDIuNzg5MzU4OTk1MjE5NzMwZS0xTCAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlnaXRzIDw9ICA2ND8gMi40NDcxOTQ0NDE2NjA3OTk1NDcyZS0xTCAgICAgICAgICAgICAgICAvLyBleHRlbmRlZCBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpZ2l0cyA8PSAxMDY/IDEuMTAxNjg0MzgxMjg1MTE0MzM5MTI3NTg2NzI1ODUxMmUtMUwgICAgLy8gZG91YmxlLWRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgOS4xMzQ2MDM3MzI5MTQ1NDg1NTI1MzcxNTA3NTMzODUzNzVlLTJMOyAvLyBxdWFkcnVwbGUgcHJlY2lzaW9uCisgIE1hdHJpeFR5cGUgSW1pbnVzVCwgc3FydFQsIFQgPSBtX0EudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFJlYWxTY2FsYXIgbm9ybUltaW51c1Q7CisgIGludCBkZWdyZWUsIGRlZ3JlZTIsIG51bWJlck9mU3F1YXJlUm9vdHMgPSAwOworICBib29sIGhhc0V4dHJhU3F1YXJlUm9vdCA9IGZhbHNlOworCisgIGZvciAoSW5kZXggaT0wOyBpIDwgbV9BLmNvbHMoKTsgKytpKQorICAgIGVpZ2VuX2Fzc2VydChtX0EoaSxpKSAhPSBSZWFsU2NhbGFyKDApKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIEltaW51c1QgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShtX0Eucm93cygpLCBtX0EuY29scygpKSAtIFQ7CisgICAgbm9ybUltaW51c1QgPSBJbWludXNULmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CisgICAgaWYgKG5vcm1JbWludXNUIDwgbWF4Tm9ybUZvclBhZGUpIHsKKyAgICAgIGRlZ3JlZSA9IGdldFBhZGVEZWdyZWUobm9ybUltaW51c1QpOworICAgICAgZGVncmVlMiA9IGdldFBhZGVEZWdyZWUobm9ybUltaW51c1QvMik7CisgICAgICBpZiAoZGVncmVlIC0gZGVncmVlMiA8PSAxIHx8IGhhc0V4dHJhU3F1YXJlUm9vdCkKKwlicmVhazsKKyAgICAgIGhhc0V4dHJhU3F1YXJlUm9vdCA9IHRydWU7CisgICAgfQorICAgIG1hdHJpeF9zcXJ0X3RyaWFuZ3VsYXIoVCwgc3FydFQpOworICAgIFQgPSBzcXJ0VC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICArK251bWJlck9mU3F1YXJlUm9vdHM7CisgIH0KKyAgY29tcHV0ZVBhZGUoZGVncmVlLCBJbWludXNULCByZXMpOworCisgIGZvciAoOyBudW1iZXJPZlNxdWFyZVJvb3RzOyAtLW51bWJlck9mU3F1YXJlUm9vdHMpIHsKKyAgICBjb21wdXRlMngyKHJlcywgbGRleHAobV9wLCAtbnVtYmVyT2ZTcXVhcmVSb290cykpOworICAgIHJlcyA9IHJlcy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIHJlczsKKyAgfQorICBjb21wdXRlMngyKHJlcywgbV9wKTsKK30KKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIGludCBNYXRyaXhQb3dlckF0b21pYzxNYXRyaXhUeXBlPjo6Z2V0UGFkZURlZ3JlZShmbG9hdCBub3JtSW1pbnVzVCkKK3sKKyAgY29uc3QgZmxvYXQgbWF4Tm9ybUZvclBhZGVbXSA9IHsgMi44MDY0MDA0ZS0xZiAvKiBkZWdyZWUgPSAzICovICwgNC4zMzg2NTI4ZS0xZiB9OworICBpbnQgZGVncmVlID0gMzsKKyAgZm9yICg7IGRlZ3JlZSA8PSA0OyArK2RlZ3JlZSkKKyAgICBpZiAobm9ybUltaW51c1QgPD0gbWF4Tm9ybUZvclBhZGVbZGVncmVlIC0gM10pCisgICAgICBicmVhazsKKyAgcmV0dXJuIGRlZ3JlZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSBpbnQgTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46OmdldFBhZGVEZWdyZWUoZG91YmxlIG5vcm1JbWludXNUKQoreworICBjb25zdCBkb3VibGUgbWF4Tm9ybUZvclBhZGVbXSA9IHsgMS44ODQxNjA1OTI2NTgyMThlLTIgLyogZGVncmVlID0gMyAqLyAsIDYuMDM4ODgxOTA0MDU5NTczZS0yLCAxLjIzOTkxNzUxNjMwODE3MmUtMSwKKyAgICAgIDEuOTk5MDQ1NTY3MTgxNzQ0ZS0xLCAyLjc4OTM1ODk5NTIxOTczMGUtMSB9OworICBpbnQgZGVncmVlID0gMzsKKyAgZm9yICg7IGRlZ3JlZSA8PSA3OyArK2RlZ3JlZSkKKyAgICBpZiAobm9ybUltaW51c1QgPD0gbWF4Tm9ybUZvclBhZGVbZGVncmVlIC0gM10pCisgICAgICBicmVhazsKKyAgcmV0dXJuIGRlZ3JlZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSBpbnQgTWF0cml4UG93ZXJBdG9taWM8TWF0cml4VHlwZT46OmdldFBhZGVEZWdyZWUobG9uZyBkb3VibGUgbm9ybUltaW51c1QpCit7CisjaWYgICBMREJMX01BTlRfRElHID09IDUzCisgIGNvbnN0IGludCBtYXhQYWRlRGVncmVlID0gNzsKKyAgY29uc3QgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDEuODg0MTYwNTkyNjU4MjE4ZS0yTCAvKiBkZWdyZWUgPSAzICovICwgNi4wMzg4ODE5MDQwNTk1NzNlLTJMLCAxLjIzOTkxNzUxNjMwODE3MmUtMUwsCisgICAgICAxLjk5OTA0NTU2NzE4MTc0NGUtMUwsIDIuNzg5MzU4OTk1MjE5NzMwZS0xTCB9OworI2VsaWYgTERCTF9NQU5UX0RJRyA8PSA2NAorICBjb25zdCBpbnQgbWF4UGFkZURlZ3JlZSA9IDg7CisgIGNvbnN0IGxvbmcgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDYuMzg1NDY5MzExNzQ5MTc5OTQ2MGUtM0wgLyogZGVncmVlID0gMyAqLyAsIDIuNjM5NDg5MzQzNTQ1Njk3MzY3NmUtMkwsCisgICAgICA2LjQyMTYwNDMwMzA0MDQwNjM3MjllLTJMLCAxLjE3MDExNjU1MDI5MjY2OTQzMDdlLTFMLCAxLjc5MDQyODQyMzEyNjg2NzAyODRlLTFMLCAyLjQ0NzE5NDQ0MTY2MDc5OTU0NzJlLTFMIH07CisjZWxpZiBMREJMX01BTlRfRElHIDw9IDEwNgorICBjb25zdCBpbnQgbWF4UGFkZURlZ3JlZSA9IDEwOworICBjb25zdCBkb3VibGUgbWF4Tm9ybUZvclBhZGVbXSA9IHsgMS4wMDA3MTYxNjAxNzg3NDkzMjM2NzQxNDA5Njg3MTg2ZS00TCAvKiBkZWdyZWUgPSAzICovICwKKyAgICAgIDEuMDAwNzE2MTYwMTc4NzQ5MzIzNjc0MTQwOTY4NzE4NmUtM0wsIDQuNzA2OTc2OTM2MDg4NzU3MjkzOTg4MjU3NDc0NjI2NGUtM0wsIDEuMzIyMDM4NjYyNDE2OTE1OTY4OTQwNjY1MzEwMTY5NWUtMkwsCisgICAgICAyLjgwNjM0ODIzODE2MzE3Mzc5MjA2MTI5NDQwNTQ5MDZlLTJMLCA0Ljk2MjU5OTM5NTE5NTM0NzMwNTIzODUzNjEwODUwNThlLTJMLCA3LjczNjcwNDA3MDYwMjc4ODYyMjQ1NTc1MzgzMjgxNzFlLTJMLAorICAgICAgMS4xMDE2ODQzODEyODUxMTQzMzkxMjc1ODY3MjU4NTEyZS0xTCB9OworI2Vsc2UKKyAgY29uc3QgaW50IG1heFBhZGVEZWdyZWUgPSAxMDsKKyAgY29uc3QgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDUuNTI0NTA2MTQ3MDM2NjI0Mzc3Mzc4NzEzNTU1MTE2Mzc4ZS01TCAvKiBkZWdyZWUgPSAzICovICwKKyAgICAgIDYuNjQwNjAwNTY4MTU3NDc5Njc5ODIzNjAyMTkzMzQ1OTk1ZS00TCwgMy4yMjc3MTY1MjAxMDY4OTQyNzkyNDk3MDk3MjgwODQ2MjZlLTNMLAorICAgICAgOS42MTk1OTM5NDQ2ODM0MzI5NjA1NDY5Nzg3MzQ2NDYyODRlLTNMLCAyLjEzNDU5NTM4MjQzMzc0MjQwMzkxMTEyNDQ1ODE2MTE0N2UtMkwsCisgICAgICAzLjkwODE2NjUxMzkwMDQ4OTQyODQ0Mjk5Mzc5NDc2MTE4NWUtMkwsIDYuMjY2NzgwODE0NjM5NDQyODY1ODMyNTM1NDYwNTUwMTM4ZS0yTCwKKyAgICAgIDkuMTM0NjAzNzMyOTE0NTQ4NTUyNTM3MTUwNzUzMzg1Mzc1ZS0yTCB9OworI2VuZGlmCisgIGludCBkZWdyZWUgPSAzOworICBmb3IgKDsgZGVncmVlIDw9IG1heFBhZGVEZWdyZWU7ICsrZGVncmVlKQorICAgIGlmIChub3JtSW1pbnVzVCA8PSBtYXhOb3JtRm9yUGFkZVtkZWdyZWUgLSAzXSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gZGVncmVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeFBvd2VyQXRvbWljPE1hdHJpeFR5cGU+OjpDb21wbGV4U2NhbGFyCitNYXRyaXhQb3dlckF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVN1cGVyRGlhZyhjb25zdCBDb21wbGV4U2NhbGFyJiBjdXJyLCBjb25zdCBDb21wbGV4U2NhbGFyJiBwcmV2LCBSZWFsU2NhbGFyIHApCit7CisgIHVzaW5nIHN0ZDo6Y2VpbDsKKyAgdXNpbmcgc3RkOjpleHA7CisgIHVzaW5nIHN0ZDo6bG9nOworICB1c2luZyBzdGQ6OnNpbmg7CisKKyAgQ29tcGxleFNjYWxhciBsb2dDdXJyID0gbG9nKGN1cnIpOworICBDb21wbGV4U2NhbGFyIGxvZ1ByZXYgPSBsb2cocHJldik7CisgIGludCB1bndpbmRpbmdOdW1iZXIgPSBjZWlsKChudW1leHQ6OmltYWcobG9nQ3VyciAtIGxvZ1ByZXYpIC0gUmVhbFNjYWxhcihFSUdFTl9QSSkpIC8gUmVhbFNjYWxhcigyKkVJR0VOX1BJKSk7CisgIENvbXBsZXhTY2FsYXIgdyA9IG51bWV4dDo6bG9nMXAoKGN1cnItcHJldikvcHJldikvUmVhbFNjYWxhcigyKSArIENvbXBsZXhTY2FsYXIoMCwgRUlHRU5fUEkqdW53aW5kaW5nTnVtYmVyKTsKKyAgcmV0dXJuIFJlYWxTY2FsYXIoMikgKiBleHAoUmVhbFNjYWxhcigwLjUpICogcCAqIChsb2dDdXJyICsgbG9nUHJldikpICogc2luaChwICogdykgLyAoY3VyciAtIHByZXYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeFBvd2VyQXRvbWljPE1hdHJpeFR5cGU+OjpSZWFsU2NhbGFyCitNYXRyaXhQb3dlckF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVN1cGVyRGlhZyhSZWFsU2NhbGFyIGN1cnIsIFJlYWxTY2FsYXIgcHJldiwgUmVhbFNjYWxhciBwKQoreworICB1c2luZyBzdGQ6OmV4cDsKKyAgdXNpbmcgc3RkOjpsb2c7CisgIHVzaW5nIHN0ZDo6c2luaDsKKworICBSZWFsU2NhbGFyIHcgPSBudW1leHQ6OmxvZzFwKChjdXJyLXByZXYpL3ByZXYpL1JlYWxTY2FsYXIoMik7CisgIHJldHVybiAyICogZXhwKHAgKiAobG9nKGN1cnIpICsgbG9nKHByZXYpKSAvIDIpICogc2luaChwICogdykgLyAoY3VyciAtIHByZXYpOworfQorCisvKioKKyAqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAqCisgKiBcYnJpZWYgQ2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggcG93ZXJzLgorICoKKyAqIFx0cGFyYW0gTWF0cml4VHlwZSAgdHlwZSBvZiB0aGUgYmFzZSwgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbgorICogb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNhcGFibGUgb2YgY29tcHV0aW5nIHJlYWwvY29tcGxleCBtYXRyaWNlcyByYWlzZWQgdG8KKyAqIGFuIGFyYml0cmFyeSByZWFsIHBvd2VyLiBNZWFud2hpbGUsIGl0IHNhdmVzIHRoZSByZXN1bHQgb2YgU2NodXIKKyAqIGRlY29tcG9zaXRpb24gaWYgYW4gbm9uLWludGVncmFsIHBvd2VyIGhhcyBldmVuIGJlZW4gY2FsY3VsYXRlZC4KKyAqIFRoZXJlZm9yZSwgaWYgeW91IHdhbnQgdG8gY29tcHV0ZSBtdWx0aXBsZSAoPj0gMikgbWF0cml4IHBvd2VycworICogZm9yIHRoZSBzYW1lIG1hdHJpeCwgdXNpbmcgdGhlIGNsYXNzIGRpcmVjdGx5IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAqIGNhbGxpbmcgTWF0cml4QmFzZTo6cG93KCkuCisgKgorICogRXhhbXBsZToKKyAqIFxpbmNsdWRlIE1hdHJpeFBvd2VyX29wdGltYWwuY3BwCisgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhQb3dlcl9vcHRpbWFsLm91dAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgTWF0cml4UG93ZXIgOiBpbnRlcm5hbDo6bm9uY29weWFibGUKK3sKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBBICB0aGUgYmFzZSBvZiB0aGUgbWF0cml4IHBvd2VyLgorICAgICAqCisgICAgICogVGhlIGNsYXNzIHN0b3JlcyBhIHJlZmVyZW5jZSB0byBBLCBzbyBpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQKKyAgICAgKiAob3IgZGVzdHJveWVkKSBiZWZvcmUgZXZhbHVhdGlvbi4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBNYXRyaXhQb3dlcihjb25zdCBNYXRyaXhUeXBlJiBBKSA6CisgICAgICBtX0EoQSksCisgICAgICBtX2NvbmRpdGlvbk51bWJlcigwKSwKKyAgICAgIG1fcmFuayhBLmNvbHMoKSksCisgICAgICBtX251bGxzKDApCisgICAgeyBlaWdlbl9hc3NlcnQoQS5yb3dzKCkgPT0gQS5jb2xzKCkpOyB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgbWF0cml4IHBvd2VyLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBwICBleHBvbmVudCwgYSByZWFsIHNjYWxhci4KKyAgICAgKiBccmV0dXJuIFRoZSBleHByZXNzaW9uIFxmJCBBXnAgXGYkLCB3aGVyZSBBIGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhQb3dlclBhcmVudGhlc2VzUmV0dXJuVmFsdWU8TWF0cml4VHlwZT4gb3BlcmF0b3IoKShSZWFsU2NhbGFyIHApCisgICAgeyByZXR1cm4gTWF0cml4UG93ZXJQYXJlbnRoZXNlc1JldHVyblZhbHVlPE1hdHJpeFR5cGU+KCp0aGlzLCBwKTsgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBwb3dlci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHAgICAgZXhwb25lbnQsIGEgcmVhbCBzY2FsYXIuCisgICAgICogXHBhcmFtW291dF0gcmVzICBcZiQgQV5wIFxmJCB3aGVyZSBBIGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIHZvaWQgY29tcHV0ZShSZXN1bHRUeXBlJiByZXMsIFJlYWxTY2FsYXIgcCk7CisgICAgCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fQS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9BLmNvbHMoKTsgfQorCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxDb21wbGV4U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCAwLAorICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IENvbXBsZXhNYXRyaXg7CisKKyAgICAvKiogXGJyaWVmIFJlZmVyZW5jZSB0byB0aGUgYmFzZSBvZiBtYXRyaXggcG93ZXIuICovCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fQTsKKworICAgIC8qKiBcYnJpZWYgVGVtcG9yYXJ5IHN0b3JhZ2UuICovCisgICAgTWF0cml4VHlwZSBtX3RtcDsKKworICAgIC8qKiBcYnJpZWYgU3RvcmUgdGhlIHJlc3VsdCBvZiBTY2h1ciBkZWNvbXBvc2l0aW9uLiAqLworICAgIENvbXBsZXhNYXRyaXggbV9ULCBtX1U7CisgICAgCisgICAgLyoqIFxicmllZiBTdG9yZSBmcmFjdGlvbmFsIHBvd2VyIG9mIG1fVC4gKi8KKyAgICBDb21wbGV4TWF0cml4IG1fZlQ7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29uZGl0aW9uIG51bWJlciBvZiBtX0EuCisgICAgICoKKyAgICAgKiBJdCBpcyBpbml0aWFsaXplZCBhcyAwIHRvIGF2b2lkIHBlcmZvcm1pbmcgdW5uZWNlc3NhcnkgU2NodXIKKyAgICAgKiBkZWNvbXBvc2l0aW9uLCB3aGljaCBpcyB0aGUgYm90dGxlbmVjay4KKyAgICAgKi8KKyAgICBSZWFsU2NhbGFyIG1fY29uZGl0aW9uTnVtYmVyOworCisgICAgLyoqIFxicmllZiBSYW5rIG9mIG1fQS4gKi8KKyAgICBJbmRleCBtX3Jhbms7CisgICAgCisgICAgLyoqIFxicmllZiBSYW5rIGRlZmljaWVuY3kgb2YgbV9BLiAqLworICAgIEluZGV4IG1fbnVsbHM7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU3BsaXQgcCBpbnRvIGludGVncmFsIHBhcnQgYW5kIGZyYWN0aW9uYWwgcGFydC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHAgICAgICAgIFRoZSBleHBvbmVudC4KKyAgICAgKiBccGFyYW1bb3V0XSBwICAgICAgICBUaGUgZnJhY3Rpb25hbCBwYXJ0IHJhbmdpbmcgaW4gXGYkICgtMSwgMSkgXGYkLgorICAgICAqIFxwYXJhbVtvdXRdIGludHBhcnQgIFRoZSBpbnRlZ3JhbCBwYXJ0LgorICAgICAqCisgICAgICogT25seSBpZiB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG5vbnplcm8sIGl0IGNhbGxzIGluaXRpYWxpemUoKS4KKyAgICAgKi8KKyAgICB2b2lkIHNwbGl0KFJlYWxTY2FsYXImIHAsIFJlYWxTY2FsYXImIGludHBhcnQpOworCisgICAgLyoqIFxicmllZiBQZXJmb3JtIFNjaHVyIGRlY29tcG9zaXRpb24gZm9yIGZyYWN0aW9uYWwgcG93ZXIuICovCisgICAgdm9pZCBpbml0aWFsaXplKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIHZvaWQgY29tcHV0ZUludFBvd2VyKFJlc3VsdFR5cGUmIHJlcywgUmVhbFNjYWxhciBwKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgdm9pZCBjb21wdXRlRnJhY1Bvd2VyKFJlc3VsdFR5cGUmIHJlcywgUmVhbFNjYWxhciBwKTsKKworICAgIHRlbXBsYXRlPGludCBSb3dzLCBpbnQgQ29scywgaW50IE9wdGlvbnMsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scz4KKyAgICBzdGF0aWMgdm9pZCByZXZlcnRTY2h1cigKKyAgICAgICAgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+JiByZXMsCisgICAgICAgIGNvbnN0IENvbXBsZXhNYXRyaXgmIFQsCisgICAgICAgIGNvbnN0IENvbXBsZXhNYXRyaXgmIFUpOworCisgICAgdGVtcGxhdGU8aW50IFJvd3MsIGludCBDb2xzLCBpbnQgT3B0aW9ucywgaW50IE1heFJvd3MsIGludCBNYXhDb2xzPgorICAgIHN0YXRpYyB2b2lkIHJldmVydFNjaHVyKAorICAgICAgICBNYXRyaXg8UmVhbFNjYWxhciwgUm93cywgQ29scywgT3B0aW9ucywgTWF4Um93cywgTWF4Q29scz4mIHJlcywKKyAgICAgICAgY29uc3QgQ29tcGxleE1hdHJpeCYgVCwKKyAgICAgICAgY29uc3QgQ29tcGxleE1hdHJpeCYgVSk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgTWF0cml4UG93ZXI8TWF0cml4VHlwZT46OmNvbXB1dGUoUmVzdWx0VHlwZSYgcmVzLCBSZWFsU2NhbGFyIHApCit7CisgIHVzaW5nIHN0ZDo6cG93OworICBzd2l0Y2ggKGNvbHMoKSkgeworICAgIGNhc2UgMDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHJlcygwLDApID0gcG93KG1fQS5jb2VmZigwLDApLCBwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBSZWFsU2NhbGFyIGludHBhcnQ7CisgICAgICBzcGxpdChwLCBpbnRwYXJ0KTsKKworICAgICAgcmVzID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cygpLCBjb2xzKCkpOworICAgICAgY29tcHV0ZUludFBvd2VyKHJlcywgaW50cGFydCk7CisgICAgICBpZiAocCkgY29tcHV0ZUZyYWNQb3dlcihyZXMsIHApOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeFBvd2VyPE1hdHJpeFR5cGU+OjpzcGxpdChSZWFsU2NhbGFyJiBwLCBSZWFsU2NhbGFyJiBpbnRwYXJ0KQoreworICB1c2luZyBzdGQ6OmZsb29yOworICB1c2luZyBzdGQ6OnBvdzsKKworICBpbnRwYXJ0ID0gZmxvb3IocCk7CisgIHAgLT0gaW50cGFydDsKKworICAvLyBQZXJmb3JtIFNjaHVyIGRlY29tcG9zaXRpb24gaWYgaXQgaXMgbm90IHlldCBwZXJmb3JtZWQgYW5kIHRoZSBwb3dlciBpcworICAvLyBub3QgYW4gaW50ZWdlci4KKyAgaWYgKCFtX2NvbmRpdGlvbk51bWJlciAmJiBwKQorICAgIGluaXRpYWxpemUoKTsKKworICAvLyBDaG9vc2UgdGhlIG1vcmUgc3RhYmxlIG9mIGludHBhcnQgPSBmbG9vcihwKSBhbmQgaW50cGFydCA9IGNlaWwocCkuCisgIGlmIChwID4gUmVhbFNjYWxhcigwLjUpICYmIHAgPiAoMS1wKSAqIHBvdyhtX2NvbmRpdGlvbk51bWJlciwgcCkpIHsKKyAgICAtLXA7CisgICAgKytpbnRwYXJ0OworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeFBvd2VyPE1hdHJpeFR5cGU+Ojppbml0aWFsaXplKCkKK3sKKyAgY29uc3QgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IHNjaHVyT2ZBKG1fQSk7CisgIEphY29iaVJvdGF0aW9uPENvbXBsZXhTY2FsYXI+IHJvdDsKKyAgQ29tcGxleFNjYWxhciBlaWdlbnZhbHVlOworCisgIG1fZlQucmVzaXplTGlrZShtX0EpOworICBtX1QgPSBzY2h1ck9mQS5tYXRyaXhUKCk7CisgIG1fVSA9IHNjaHVyT2ZBLm1hdHJpeFUoKTsKKyAgbV9jb25kaXRpb25OdW1iZXIgPSBtX1QuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLm1heENvZWZmKCkgLyBtX1QuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLm1pbkNvZWZmKCk7CisKKyAgLy8gTW92ZSB6ZXJvIGVpZ2VudmFsdWVzIHRvIHRoZSBib3R0b20gcmlnaHQgY29ybmVyLgorICBmb3IgKEluZGV4IGkgPSBjb2xzKCktMTsgaT49MDsgLS1pKSB7CisgICAgaWYgKG1fcmFuayA8PSAyKQorICAgICAgcmV0dXJuOworICAgIGlmIChtX1QuY29lZmYoaSxpKSA9PSBSZWFsU2NhbGFyKDApKSB7CisgICAgICBmb3IgKEluZGV4IGo9aSsxOyBqIDwgbV9yYW5rOyArK2opIHsKKyAgICAgICAgZWlnZW52YWx1ZSA9IG1fVC5jb2VmZihqLGopOworICAgICAgICByb3QubWFrZUdpdmVucyhtX1QuY29lZmYoai0xLGopLCBlaWdlbnZhbHVlKTsKKyAgICAgICAgbV9ULmFwcGx5T25UaGVSaWdodChqLTEsIGosIHJvdCk7CisgICAgICAgIG1fVC5hcHBseU9uVGhlTGVmdChqLTEsIGosIHJvdC5hZGpvaW50KCkpOworICAgICAgICBtX1QuY29lZmZSZWYoai0xLGotMSkgPSBlaWdlbnZhbHVlOworICAgICAgICBtX1QuY29lZmZSZWYoaixqKSA9IFJlYWxTY2FsYXIoMCk7CisgICAgICAgIG1fVS5hcHBseU9uVGhlUmlnaHQoai0xLCBqLCByb3QpOworICAgICAgfQorICAgICAgLS1tX3Jhbms7CisgICAgfQorICB9CisKKyAgbV9udWxscyA9IHJvd3MoKSAtIG1fcmFuazsKKyAgaWYgKG1fbnVsbHMpIHsKKyAgICBlaWdlbl9hc3NlcnQobV9ULmJvdHRvbVJpZ2h0Q29ybmVyKG1fbnVsbHMsIG1fbnVsbHMpLmlzWmVybygpCisgICAgICAgICYmICJCYXNlIG9mIG1hdHJpeCBwb3dlciBzaG91bGQgYmUgaW52ZXJ0aWJsZSBvciB3aXRoIGEgc2VtaXNpbXBsZSB6ZXJvIGVpZ2VudmFsdWUuIik7CisgICAgbV9mVC5ib3R0b21Sb3dzKG1fbnVsbHMpLmZpbGwoUmVhbFNjYWxhcigwKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+Cit2b2lkIE1hdHJpeFBvd2VyPE1hdHJpeFR5cGU+Ojpjb21wdXRlSW50UG93ZXIoUmVzdWx0VHlwZSYgcmVzLCBSZWFsU2NhbGFyIHApCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OmZtb2Q7CisgIFJlYWxTY2FsYXIgcHAgPSBhYnMocCk7CisKKyAgaWYgKHA8MCkgCisgICAgbV90bXAgPSBtX0EuaW52ZXJzZSgpOworICBlbHNlICAgICAKKyAgICBtX3RtcCA9IG1fQTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChmbW9kKHBwLCAyKSA+PSAxKQorICAgICAgcmVzID0gbV90bXAgKiByZXM7CisgICAgcHAgLz0gMjsKKyAgICBpZiAocHAgPCAxKQorICAgICAgYnJlYWs7CisgICAgbV90bXAgKj0gbV90bXA7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+Cit2b2lkIE1hdHJpeFBvd2VyPE1hdHJpeFR5cGU+Ojpjb21wdXRlRnJhY1Bvd2VyKFJlc3VsdFR5cGUmIHJlcywgUmVhbFNjYWxhciBwKQoreworICBCbG9jazxDb21wbGV4TWF0cml4LER5bmFtaWMsRHluYW1pYz4gYmxvY2tUcChtX2ZULCAwLCAwLCBtX3JhbmssIG1fcmFuayk7CisgIGVpZ2VuX2Fzc2VydChtX2NvbmRpdGlvbk51bWJlcik7CisgIGVpZ2VuX2Fzc2VydChtX3JhbmsgKyBtX251bGxzID09IHJvd3MoKSk7CisKKyAgTWF0cml4UG93ZXJBdG9taWM8Q29tcGxleE1hdHJpeD4obV9ULnRvcExlZnRDb3JuZXIobV9yYW5rLCBtX3JhbmspLCBwKS5jb21wdXRlKGJsb2NrVHApOworICBpZiAobV9udWxscykgeworICAgIG1fZlQudG9wUmlnaHRDb3JuZXIobV9yYW5rLCBtX251bGxzKSA9IG1fVC50b3BMZWZ0Q29ybmVyKG1fcmFuaywgbV9yYW5rKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgICAuc29sdmUoYmxvY2tUcCAqIG1fVC50b3BSaWdodENvcm5lcihtX3JhbmssIG1fbnVsbHMpKTsKKyAgfQorICByZXZlcnRTY2h1cihtX3RtcCwgbV9mVCwgbV9VKTsKKyAgcmVzID0gbV90bXAgKiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTxpbnQgUm93cywgaW50IENvbHMsIGludCBPcHRpb25zLCBpbnQgTWF4Um93cywgaW50IE1heENvbHM+CitpbmxpbmUgdm9pZCBNYXRyaXhQb3dlcjxNYXRyaXhUeXBlPjo6cmV2ZXJ0U2NodXIoCisgICAgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+JiByZXMsCisgICAgY29uc3QgQ29tcGxleE1hdHJpeCYgVCwKKyAgICBjb25zdCBDb21wbGV4TWF0cml4JiBVKQoreyByZXMubm9hbGlhcygpID0gVSAqIChULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogVS5hZGpvaW50KCkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTxpbnQgUm93cywgaW50IENvbHMsIGludCBPcHRpb25zLCBpbnQgTWF4Um93cywgaW50IE1heENvbHM+CitpbmxpbmUgdm9pZCBNYXRyaXhQb3dlcjxNYXRyaXhUeXBlPjo6cmV2ZXJ0U2NodXIoCisgICAgTWF0cml4PFJlYWxTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+JiByZXMsCisgICAgY29uc3QgQ29tcGxleE1hdHJpeCYgVCwKKyAgICBjb25zdCBDb21wbGV4TWF0cml4JiBVKQoreyByZXMubm9hbGlhcygpID0gKFUgKiAoVC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIFUuYWRqb2ludCgpKSkucmVhbCgpOyB9CisKKy8qKgorICogXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorICoKKyAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBwb3dlciBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgKgorICogXHRwYXJhbSBEZXJpdmVkICB0eXBlIG9mIHRoZSBiYXNlLCBhIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgKgorICogVGhpcyBjbGFzcyBob2xkcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBtYXRyaXggcG93ZXIgdW50aWwgaXQgaXMKKyAqIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3Igc29tZSBvdGhlciByZWFzb24gKHNvIHRoZSBhcmd1bWVudAorICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZgorICogTWF0cml4QmFzZTo6cG93KCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBtb3N0IG9mIHRoZQorICogdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgTWF0cml4UG93ZXJSZXR1cm5WYWx1ZSA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPCBNYXRyaXhQb3dlclJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKworICAgIC8qKgorICAgICAqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gQSAgJU1hdHJpeCAoZXhwcmVzc2lvbiksIHRoZSBiYXNlIG9mIHRoZSBtYXRyaXggcG93ZXIuCisgICAgICogXHBhcmFtW2luXSBwICByZWFsIHNjYWxhciwgdGhlIGV4cG9uZW50IG9mIHRoZSBtYXRyaXggcG93ZXIuCisgICAgICovCisgICAgTWF0cml4UG93ZXJSZXR1cm5WYWx1ZShjb25zdCBEZXJpdmVkJiBBLCBSZWFsU2NhbGFyIHApIDogbV9BKEEpLCBtX3AocCkKKyAgICB7IH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggcG93ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSByZXN1bHQgIFxmJCBBXnAgXGYkIHdoZXJlIFxwIEEgYW5kIFxwIHAgYXJlIGFzIGluIHRoZQorICAgICAqIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlcykgY29uc3QKKyAgICB7IE1hdHJpeFBvd2VyPFBsYWluT2JqZWN0PihtX0EuZXZhbCgpKS5jb21wdXRlKHJlcywgbV9wKTsgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fQS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9BLmNvbHMoKTsgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgRGVyaXZlZCYgbV9BOworICAgIGNvbnN0IFJlYWxTY2FsYXIgbV9wOworfTsKKworLyoqCisgKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgKgorICogXGJyaWVmIFByb3h5IGZvciB0aGUgbWF0cml4IHBvd2VyIG9mIHNvbWUgbWF0cml4IChleHByZXNzaW9uKS4KKyAqCisgKiBcdHBhcmFtIERlcml2ZWQgIHR5cGUgb2YgdGhlIGJhc2UsIGEgbWF0cml4IChleHByZXNzaW9uKS4KKyAqCisgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudHMgdG8gdGhlIG1hdHJpeCBwb3dlciB1bnRpbCBpdCBpcworICogYXNzaWduZWQgb3IgZXZhbHVhdGVkIGZvciBzb21lIG90aGVyIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50CisgKiBzaG91bGQgbm90IGJlIGNoYW5nZWQgaW4gdGhlIG1lYW50aW1lKS4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mCisgKiBNYXRyaXhCYXNlOjpwb3coKSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgYW5kIG1vc3Qgb2YgdGhlCisgKiB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBNYXRyaXhDb21wbGV4UG93ZXJSZXR1cm5WYWx1ZSA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPCBNYXRyaXhDb21wbGV4UG93ZXJSZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKworICAgIC8qKgorICAgICAqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gQSAgJU1hdHJpeCAoZXhwcmVzc2lvbiksIHRoZSBiYXNlIG9mIHRoZSBtYXRyaXggcG93ZXIuCisgICAgICogXHBhcmFtW2luXSBwICBjb21wbGV4IHNjYWxhciwgdGhlIGV4cG9uZW50IG9mIHRoZSBtYXRyaXggcG93ZXIuCisgICAgICovCisgICAgTWF0cml4Q29tcGxleFBvd2VyUmV0dXJuVmFsdWUoY29uc3QgRGVyaXZlZCYgQSwgY29uc3QgQ29tcGxleFNjYWxhciYgcCkgOiBtX0EoQSksIG1fcChwKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBwb3dlci4KKyAgICAgKgorICAgICAqIEJlY2F1c2UgXHAgcCBpcyBjb21wbGV4LCBcZiQgQV5wIFxmJCBpcyBzaW1wbHkgZXZhbHVhdGVkIGFzIFxmJAorICAgICAqIFxleHAocCBcbG9nKEEpKSBcZiQuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSByZXN1bHQgIFxmJCBBXnAgXGYkIHdoZXJlIFxwIEEgYW5kIFxwIHAgYXJlIGFzIGluIHRoZQorICAgICAqIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlcykgY29uc3QKKyAgICB7IHJlcyA9IChtX3AgKiBtX0EubG9nKCkpLmV4cCgpOyB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9BLnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX0EuY29scygpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBEZXJpdmVkJiBtX0E7CisgICAgY29uc3QgQ29tcGxleFNjYWxhciBtX3A7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhQb3dlclR5cGU+CitzdHJ1Y3QgdHJhaXRzPCBNYXRyaXhQb3dlclBhcmVudGhlc2VzUmV0dXJuVmFsdWU8TWF0cml4UG93ZXJUeXBlPiA+Cit7IHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4UG93ZXJUeXBlOjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czwgTWF0cml4UG93ZXJSZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7IHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCB0cmFpdHM8IE1hdHJpeENvbXBsZXhQb3dlclJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOyB9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhQb3dlclJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnBvdyhjb25zdCBSZWFsU2NhbGFyJiBwKSBjb25zdAoreyByZXR1cm4gTWF0cml4UG93ZXJSZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCksIHApOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhDb21wbGV4UG93ZXJSZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpwb3coY29uc3Qgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+JiBwKSBjb25zdAoreyByZXR1cm4gTWF0cml4Q29tcGxleFBvd2VyUmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpLCBwKTsgfQorCit9IC8vIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX1BPV0VSCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeFNxdWFyZVJvb3QuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4U3F1YXJlUm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDg4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeFNxdWFyZVJvb3QuaApAQCAtMCwwICsxLDM3MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX1NRVUFSRV9ST09UCisjZGVmaW5lIEVJR0VOX01BVFJJWF9TUVVBUkVfUk9PVAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gcHJlOiAgVC5ibG9jayhpLGksMiwyKSBoYXMgY29tcGxleCBjb25qdWdhdGUgZWlnZW52YWx1ZXMKKy8vIHBvc3Q6IHNxcnRULmJsb2NrKGksaSwyLDIpIGlzIHNxdWFyZSByb290IG9mIFQuYmxvY2soaSxpLDIsMikKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgordm9pZCBtYXRyaXhfc3FydF9xdWFzaV90cmlhbmd1bGFyXzJ4Ml9kaWFnb25hbF9ibG9jayhjb25zdCBNYXRyaXhUeXBlJiBULCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCBSZXN1bHRUeXBlJiBzcXJ0VCkKK3sKKyAgLy8gVE9ETzogVGhpcyBjYXNlICgyLWJ5LTIgYmxvY2tzIHdpdGggY29tcGxleCBjb25qdWdhdGUgZWlnZW52YWx1ZXMpIGlzIHByb2JhYmx5IGhpZGRlbiBzb21ld2hlcmUKKyAgLy8gICAgICAgaW4gRWlnZW5Tb2x2ZXIuIElmIHdlIGV4cG9zZSBpdCwgd2UgY291bGQgY2FsbCBpdCBkaXJlY3RseSBmcm9tIGhlcmUuCisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICBNYXRyaXg8U2NhbGFyLDIsMj4gYmxvY2sgPSBULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxpKTsKKyAgRWlnZW5Tb2x2ZXI8TWF0cml4PFNjYWxhciwyLDI+ID4gZXMoYmxvY2spOworICBzcXJ0VC50ZW1wbGF0ZSBibG9jazwyLDI+KGksaSkKKyAgICA9IChlcy5laWdlbnZlY3RvcnMoKSAqIGVzLmVpZ2VudmFsdWVzKCkuY3dpc2VTcXJ0KCkuYXNEaWFnb25hbCgpICogZXMuZWlnZW52ZWN0b3JzKCkuaW52ZXJzZSgpKS5yZWFsKCk7Cit9CisKKy8vIHByZTogIGJsb2NrIHN0cnVjdHVyZSBvZiBUIGlzIHN1Y2ggdGhhdCAoaSxqKSBpcyBhIDF4MSBibG9jaywKKy8vICAgICAgIGFsbCBibG9ja3Mgb2Ygc3FydFQgdG8gbGVmdCBvZiBhbmQgYmVsb3cgKGksaikgYXJlIGNvcnJlY3QKKy8vIHBvc3Q6IHNxcnRUKGksaikgaGFzIHRoZSBjb3JyZWN0IHZhbHVlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcl8xeDFfb2ZmX2RpYWdvbmFsX2Jsb2NrKGNvbnN0IE1hdHJpeFR5cGUmIFQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGksIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGosIFJlc3VsdFR5cGUmIHNxcnRUKQoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgU2NhbGFyIHRtcCA9IChzcXJ0VC5yb3coaSkuc2VnbWVudChpKzEsai1pLTEpICogc3FydFQuY29sKGopLnNlZ21lbnQoaSsxLGotaS0xKSkudmFsdWUoKTsKKyAgc3FydFQuY29lZmZSZWYoaSxqKSA9IChULmNvZWZmKGksaikgLSB0bXApIC8gKHNxcnRULmNvZWZmKGksaSkgKyBzcXJ0VC5jb2VmZihqLGopKTsKK30KKworLy8gc2ltaWxhciB0byBjb21wdXRlMXgxb2ZmRGlhZ29uYWxCbG9jaygpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcl8xeDJfb2ZmX2RpYWdvbmFsX2Jsb2NrKGNvbnN0IE1hdHJpeFR5cGUmIFQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGksIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGosIFJlc3VsdFR5cGUmIHNxcnRUKQoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgTWF0cml4PFNjYWxhciwxLDI+IHJocyA9IFQudGVtcGxhdGUgYmxvY2s8MSwyPihpLGopOworICBpZiAoai1pID4gMSkKKyAgICByaHMgLT0gc3FydFQuYmxvY2soaSwgaSsxLCAxLCBqLWktMSkgKiBzcXJ0VC5ibG9jayhpKzEsIGosIGotaS0xLCAyKTsKKyAgTWF0cml4PFNjYWxhciwyLDI+IEEgPSBzcXJ0VC5jb2VmZihpLGkpICogTWF0cml4PFNjYWxhciwyLDI+OjpJZGVudGl0eSgpOworICBBICs9IHNxcnRULnRlbXBsYXRlIGJsb2NrPDIsMj4oaixqKS50cmFuc3Bvc2UoKTsKKyAgc3FydFQudGVtcGxhdGUgYmxvY2s8MSwyPihpLGopLnRyYW5zcG9zZSgpID0gQS5mdWxsUGl2THUoKS5zb2x2ZShyaHMudHJhbnNwb3NlKCkpOworfQorCisvLyBzaW1pbGFyIHRvIGNvbXB1dGUxeDFvZmZEaWFnb25hbEJsb2NrKCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgordm9pZCBtYXRyaXhfc3FydF9xdWFzaV90cmlhbmd1bGFyXzJ4MV9vZmZfZGlhZ29uYWxfYmxvY2soY29uc3QgTWF0cml4VHlwZSYgVCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaSwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaiwgUmVzdWx0VHlwZSYgc3FydFQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICBNYXRyaXg8U2NhbGFyLDIsMT4gcmhzID0gVC50ZW1wbGF0ZSBibG9jazwyLDE+KGksaik7CisgIGlmIChqLWkgPiAyKQorICAgIHJocyAtPSBzcXJ0VC5ibG9jayhpLCBpKzIsIDIsIGotaS0yKSAqIHNxcnRULmJsb2NrKGkrMiwgaiwgai1pLTIsIDEpOworICBNYXRyaXg8U2NhbGFyLDIsMj4gQSA9IHNxcnRULmNvZWZmKGosaikgKiBNYXRyaXg8U2NhbGFyLDIsMj46OklkZW50aXR5KCk7CisgIEEgKz0gc3FydFQudGVtcGxhdGUgYmxvY2s8MiwyPihpLGkpOworICBzcXJ0VC50ZW1wbGF0ZSBibG9jazwyLDE+KGksaikgPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKHJocyk7Cit9CisKKy8vIHNvbHZlcyB0aGUgZXF1YXRpb24gQSBYICsgWCBCID0gQyB3aGVyZSBhbGwgbWF0cmljZXMgYXJlIDItYnktMgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfc29sdmVfYXV4aWxpYXJ5X2VxdWF0aW9uKE1hdHJpeFR5cGUmIFgsIGNvbnN0IE1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeFR5cGUmIEIsIGNvbnN0IE1hdHJpeFR5cGUmIEMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICBNYXRyaXg8U2NhbGFyLDQsND4gY29lZmZNYXRyaXggPSBNYXRyaXg8U2NhbGFyLDQsND46Olplcm8oKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMCwwKSA9IEEuY29lZmYoMCwwKSArIEIuY29lZmYoMCwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMSwxKSA9IEEuY29lZmYoMCwwKSArIEIuY29lZmYoMSwxKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMiwyKSA9IEEuY29lZmYoMSwxKSArIEIuY29lZmYoMCwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMywzKSA9IEEuY29lZmYoMSwxKSArIEIuY29lZmYoMSwxKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMCwxKSA9IEIuY29lZmYoMSwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMCwyKSA9IEEuY29lZmYoMCwxKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMSwwKSA9IEIuY29lZmYoMCwxKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMSwzKSA9IEEuY29lZmYoMCwxKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMiwwKSA9IEEuY29lZmYoMSwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMiwzKSA9IEIuY29lZmYoMSwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMywxKSA9IEEuY29lZmYoMSwwKTsKKyAgY29lZmZNYXRyaXguY29lZmZSZWYoMywyKSA9IEIuY29lZmYoMCwxKTsKKworICBNYXRyaXg8U2NhbGFyLDQsMT4gcmhzOworICByaHMuY29lZmZSZWYoMCkgPSBDLmNvZWZmKDAsMCk7CisgIHJocy5jb2VmZlJlZigxKSA9IEMuY29lZmYoMCwxKTsKKyAgcmhzLmNvZWZmUmVmKDIpID0gQy5jb2VmZigxLDApOworICByaHMuY29lZmZSZWYoMykgPSBDLmNvZWZmKDEsMSk7CisKKyAgTWF0cml4PFNjYWxhciw0LDE+IHJlc3VsdDsKKyAgcmVzdWx0ID0gY29lZmZNYXRyaXguZnVsbFBpdkx1KCkuc29sdmUocmhzKTsKKworICBYLmNvZWZmUmVmKDAsMCkgPSByZXN1bHQuY29lZmYoMCk7CisgIFguY29lZmZSZWYoMCwxKSA9IHJlc3VsdC5jb2VmZigxKTsKKyAgWC5jb2VmZlJlZigxLDApID0gcmVzdWx0LmNvZWZmKDIpOworICBYLmNvZWZmUmVmKDEsMSkgPSByZXN1bHQuY29lZmYoMyk7Cit9CisKKy8vIHNpbWlsYXIgdG8gY29tcHV0ZTF4MW9mZkRpYWdvbmFsQmxvY2soKQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+Cit2b2lkIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfMngyX29mZl9kaWFnb25hbF9ibG9jayhjb25zdCBNYXRyaXhUeXBlJiBULCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBqLCBSZXN1bHRUeXBlJiBzcXJ0VCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CisgIE1hdHJpeDxTY2FsYXIsMiwyPiBBID0gc3FydFQudGVtcGxhdGUgYmxvY2s8MiwyPihpLGkpOworICBNYXRyaXg8U2NhbGFyLDIsMj4gQiA9IHNxcnRULnRlbXBsYXRlIGJsb2NrPDIsMj4oaixqKTsKKyAgTWF0cml4PFNjYWxhciwyLDI+IEMgPSBULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxqKTsKKyAgaWYgKGotaSA+IDIpCisgICAgQyAtPSBzcXJ0VC5ibG9jayhpLCBpKzIsIDIsIGotaS0yKSAqIHNxcnRULmJsb2NrKGkrMiwgaiwgai1pLTIsIDIpOworICBNYXRyaXg8U2NhbGFyLDIsMj4gWDsKKyAgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcl9zb2x2ZV9hdXhpbGlhcnlfZXF1YXRpb24oWCwgQSwgQiwgQyk7CisgIHNxcnRULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxqKSA9IFg7Cit9CisKKy8vIHByZTogIFQgaXMgcXVhc2ktdXBwZXItdHJpYW5ndWxhciBhbmQgc3FydFQgaXMgYSB6ZXJvIG1hdHJpeCBvZiB0aGUgc2FtZSBzaXplCisvLyBwb3N0OiB0aGUgZGlhZ29uYWwgYmxvY2tzIG9mIHNxcnRUIGFyZSB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBkaWFnb25hbCBibG9ja3Mgb2YgVAordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+Cit2b2lkIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfZGlhZ29uYWwoY29uc3QgTWF0cml4VHlwZSYgVCwgUmVzdWx0VHlwZSYgc3FydFQpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IFQucm93cygpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKGkgPT0gc2l6ZSAtIDEgfHwgVC5jb2VmZihpKzEsIGkpID09IDApIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChUKGksaSkgPj0gMCk7CisgICAgICBzcXJ0VC5jb2VmZlJlZihpLGkpID0gc3FydChULmNvZWZmKGksaSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfMngyX2RpYWdvbmFsX2Jsb2NrKFQsIGksIHNxcnRUKTsKKyAgICAgICsraTsKKyAgICB9CisgIH0KK30KKworLy8gcHJlOiAgVCBpcyBxdWFzaS11cHBlci10cmlhbmd1bGFyIGFuZCBkaWFnb25hbCBibG9ja3Mgb2Ygc3FydFQgYXJlIHNxdWFyZSByb290IG9mIGRpYWdvbmFsIGJsb2NrcyBvZiBULgorLy8gcG9zdDogc3FydFQgaXMgdGhlIHNxdWFyZSByb290IG9mIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcl9vZmZfZGlhZ29uYWwoY29uc3QgTWF0cml4VHlwZSYgVCwgUmVzdWx0VHlwZSYgc3FydFQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIGNvbnN0IEluZGV4IHNpemUgPSBULnJvd3MoKTsKKyAgZm9yIChJbmRleCBqID0gMTsgaiA8IHNpemU7IGorKykgeworICAgICAgaWYgKFQuY29lZmYoaiwgai0xKSAhPSAwKSAgLy8gaWYgVChqLTE6aiwgai0xOmopIGlzIGEgMi1ieS0yIGJsb2NrCisJY29udGludWU7CisgICAgZm9yIChJbmRleCBpID0gai0xOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKGkgPiAwICYmIFQuY29lZmYoaSwgaS0xKSAhPSAwKSAgLy8gaWYgVChpLTE6aSwgaS0xOmkpIGlzIGEgMi1ieS0yIGJsb2NrCisJY29udGludWU7CisgICAgICBib29sIGlCbG9ja0lzMngyID0gKGkgPCBzaXplIC0gMSkgJiYgKFQuY29lZmYoaSsxLCBpKSAhPSAwKTsKKyAgICAgIGJvb2wgakJsb2NrSXMyeDIgPSAoaiA8IHNpemUgLSAxKSAmJiAoVC5jb2VmZihqKzEsIGopICE9IDApOworICAgICAgaWYgKGlCbG9ja0lzMngyICYmIGpCbG9ja0lzMngyKSAKKyAgICAgICAgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcl8yeDJfb2ZmX2RpYWdvbmFsX2Jsb2NrKFQsIGksIGosIHNxcnRUKTsKKyAgICAgIGVsc2UgaWYgKGlCbG9ja0lzMngyICYmICFqQmxvY2tJczJ4MikgCisgICAgICAgIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfMngxX29mZl9kaWFnb25hbF9ibG9jayhULCBpLCBqLCBzcXJ0VCk7CisgICAgICBlbHNlIGlmICghaUJsb2NrSXMyeDIgJiYgakJsb2NrSXMyeDIpIAorICAgICAgICBtYXRyaXhfc3FydF9xdWFzaV90cmlhbmd1bGFyXzF4Ml9vZmZfZGlhZ29uYWxfYmxvY2soVCwgaSwgaiwgc3FydFQpOworICAgICAgZWxzZSBpZiAoIWlCbG9ja0lzMngyICYmICFqQmxvY2tJczJ4MikgCisgICAgICAgIG1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfMXgxX29mZl9kaWFnb25hbF9ibG9jayhULCBpLCBqLCBzcXJ0VCk7CisgICAgfQorICB9Cit9CisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorICAqIFxicmllZiBDb21wdXRlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeC4KKyAgKgorICAqIFx0cGFyYW0gIE1hdHJpeFR5cGUgIHR5cGUgb2YgXHAgYXJnLCB0aGUgYXJndW1lbnQgb2YgbWF0cml4IHNxdWFyZSByb290LAorICAqICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKiBcdHBhcmFtICBSZXN1bHRUeXBlICB0eXBlIG9mIFxwIHJlc3VsdCwgd2hlcmUgcmVzdWx0IGlzIHRvIGJlIHN0b3JlZC4KKyAgKiBccGFyYW1baW5dICBhcmcgICAgICBhcmd1bWVudCBvZiBtYXRyaXggc3F1YXJlIHJvb3QuCisgICogXHBhcmFtW291dF0gcmVzdWx0ICAgbWF0cml4IHNxdWFyZSByb290IG9mIHVwcGVyIEhlc3NlbmJlcmcgcGFydCBvZiBccCBhcmcuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdXBwZXIgcXVhc2ktdHJpYW5ndWxhciBtYXRyaXggc3RvcmVkIGluIHRoZSB1cHBlcgorICAqIEhlc3NlbmJlcmcgcGFydCBvZiBccCBhcmcuICBPbmx5IHRoZSB1cHBlciBIZXNzZW5iZXJnIHBhcnQgb2YgXHAgcmVzdWx0IGlzIHVwZGF0ZWQsIHRoZSByZXN0IGlzCisgICogbm90IHRvdWNoZWQuICBTZWUgTWF0cml4QmFzZTo6c3FydCgpIGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIGNvbXB1dGF0aW9uIGlzIGltcGxlbWVudGVkLgorICAqCisgICogXHNhIE1hdHJpeFNxdWFyZVJvb3QsIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXIKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPiAKK3ZvaWQgbWF0cml4X3NxcnRfcXVhc2lfdHJpYW5ndWxhcihjb25zdCBNYXRyaXhUeXBlICZhcmcsIFJlc3VsdFR5cGUgJnJlc3VsdCkKK3sKKyAgZWlnZW5fYXNzZXJ0KGFyZy5yb3dzKCkgPT0gYXJnLmNvbHMoKSk7CisgIHJlc3VsdC5yZXNpemUoYXJnLnJvd3MoKSwgYXJnLmNvbHMoKSk7CisgIGludGVybmFsOjptYXRyaXhfc3FydF9xdWFzaV90cmlhbmd1bGFyX2RpYWdvbmFsKGFyZywgcmVzdWx0KTsKKyAgaW50ZXJuYWw6Om1hdHJpeF9zcXJ0X3F1YXNpX3RyaWFuZ3VsYXJfb2ZmX2RpYWdvbmFsKGFyZywgcmVzdWx0KTsKK30KKworCisvKiogXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorICAqIFxicmllZiBDb21wdXRlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiB0cmlhbmd1bGFyIG1hdHJpeC4KKyAgKgorICAqIFx0cGFyYW0gIE1hdHJpeFR5cGUgIHR5cGUgb2YgXHAgYXJnLCB0aGUgYXJndW1lbnQgb2YgbWF0cml4IHNxdWFyZSByb290LAorICAqICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKiBcdHBhcmFtICBSZXN1bHRUeXBlICB0eXBlIG9mIFxwIHJlc3VsdCwgd2hlcmUgcmVzdWx0IGlzIHRvIGJlIHN0b3JlZC4KKyAgKiBccGFyYW1baW5dICBhcmcgICAgICBhcmd1bWVudCBvZiBtYXRyaXggc3F1YXJlIHJvb3QuCisgICogXHBhcmFtW291dF0gcmVzdWx0ICAgbWF0cml4IHNxdWFyZSByb290IG9mIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBccCBhcmcuCisgICoKKyAgKiBPbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgKGluY2x1ZGluZyB0aGUgZGlhZ29uYWwpIG9mIFxwIHJlc3VsdCBpcyB1cGRhdGVkLCB0aGUgcmVzdCBpcyBub3QKKyAgKiB0b3VjaGVkLiAgU2VlIE1hdHJpeEJhc2U6OnNxcnQoKSBmb3IgZGV0YWlscyBvbiBob3cgdGhpcyBjb21wdXRhdGlvbiBpcyBpbXBsZW1lbnRlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhTcXVhcmVSb290LCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4gCit2b2lkIG1hdHJpeF9zcXJ0X3RyaWFuZ3VsYXIoY29uc3QgTWF0cml4VHlwZSAmYXJnLCBSZXN1bHRUeXBlICZyZXN1bHQpCit7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBlaWdlbl9hc3NlcnQoYXJnLnJvd3MoKSA9PSBhcmcuY29scygpKTsKKworICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIGFyZyBhbmQgc3RvcmUgaXQgaW4gdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHJlc3VsdAorICAvLyBUaGlzIHVzZXMgdGhhdCB0aGUgc3F1YXJlIHJvb3Qgb2YgdHJpYW5ndWxhciBtYXRyaWNlcyBjYW4gYmUgY29tcHV0ZWQgZGlyZWN0bHkuCisgIHJlc3VsdC5yZXNpemUoYXJnLnJvd3MoKSwgYXJnLmNvbHMoKSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBhcmcucm93cygpOyBpKyspIHsKKyAgICByZXN1bHQuY29lZmZSZWYoaSxpKSA9IHNxcnQoYXJnLmNvZWZmKGksaSkpOworICB9CisgIGZvciAoSW5kZXggaiA9IDE7IGogPCBhcmcuY29scygpOyBqKyspIHsKKyAgICBmb3IgKEluZGV4IGkgPSBqLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAvLyBpZiBpID0gai0xLCB0aGVuIHNlZ21lbnQgaGFzIGxlbmd0aCAwIHNvIHRtcCA9IDAKKyAgICAgIFNjYWxhciB0bXAgPSAocmVzdWx0LnJvdyhpKS5zZWdtZW50KGkrMSxqLWktMSkgKiByZXN1bHQuY29sKGopLnNlZ21lbnQoaSsxLGotaS0xKSkudmFsdWUoKTsKKyAgICAgIC8vIGRlbm9taW5hdG9yIG1heSBiZSB6ZXJvIGlmIG9yaWdpbmFsIG1hdHJpeCBpcyBzaW5ndWxhcgorICAgICAgcmVzdWx0LmNvZWZmUmVmKGksaikgPSAoYXJnLmNvZWZmKGksaikgLSB0bXApIC8gKHJlc3VsdC5jb2VmZihpLGkpICsgcmVzdWx0LmNvZWZmKGosaikpOworICAgIH0KKyAgfQorfQorCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICogXGJyaWVmIEhlbHBlciBzdHJ1Y3QgZm9yIGNvbXB1dGluZyBtYXRyaXggc3F1YXJlIHJvb3RzIG9mIGdlbmVyYWwgbWF0cmljZXMuCisgICogXHRwYXJhbSAgTWF0cml4VHlwZSAgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIG1hdHJpeCBzcXVhcmUgcm9vdCwKKyAgKiAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZSBNYXRyaXggY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBcc2EgTWF0cml4U3F1YXJlUm9vdFRyaWFuZ3VsYXIsIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXIsIE1hdHJpeEJhc2U6OnNxcnQoKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4Pgorc3RydWN0IG1hdHJpeF9zcXJ0X2NvbXB1dGUKK3sKKyAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QKKyAgICAqCisgICAgKiBccGFyYW1baW5dICBhcmcgICAgIG1hdHJpeCB3aG9zZSBzcXVhcmUgcm9vdCBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgc3F1YXJlIHJvb3Qgb2YgXHAgYXJnLgorICAgICoKKyAgICAqIFNlZSBNYXRyaXhCYXNlOjpzcXJ0KCkgZm9yIGRldGFpbHMgb24gaG93IHRoaXMgY29tcHV0YXRpb24gaXMgaW1wbGVtZW50ZWQuCisgICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlICZhcmcsIFJlc3VsdFR5cGUgJnJlc3VsdCk7ICAgIAorfTsKKworCisvLyAqKioqKioqKioqIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHJlYWwgbWF0cmljZXMgKioqKioqKioqKgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBtYXRyaXhfc3FydF9jb21wdXRlPE1hdHJpeFR5cGUsIDA+Cit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSAmYXJnLCBSZXN1bHRUeXBlICZyZXN1bHQpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoYXJnLnJvd3MoKSA9PSBhcmcuY29scygpKTsKKworICAgIC8vIENvbXB1dGUgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhcmcKKyAgICBjb25zdCBSZWFsU2NodXI8TWF0cml4VHlwZT4gc2NodXJPZkEoYXJnKTsgIAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIFQgPSBzY2h1ck9mQS5tYXRyaXhUKCk7CisgICAgY29uc3QgTWF0cml4VHlwZSYgVSA9IHNjaHVyT2ZBLm1hdHJpeFUoKTsKKyAgICAKKyAgICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIFQKKyAgICBNYXRyaXhUeXBlIHNxcnRUID0gTWF0cml4VHlwZTo6WmVybyhhcmcucm93cygpLCBhcmcuY29scygpKTsKKyAgICBtYXRyaXhfc3FydF9xdWFzaV90cmlhbmd1bGFyKFQsIHNxcnRUKTsKKyAgICAKKyAgICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIGFyZworICAgIHJlc3VsdCA9IFUgKiBzcXJ0VCAqIFUuYWRqb2ludCgpOworICB9Cit9OworCisKKy8vICoqKioqKioqKiogUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgY29tcGxleCBtYXRyaWNlcyAqKioqKioqKioqCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IG1hdHJpeF9zcXJ0X2NvbXB1dGU8TWF0cml4VHlwZSwgMT4KK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlICZhcmcsIFJlc3VsdFR5cGUgJnJlc3VsdCkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChhcmcucm93cygpID09IGFyZy5jb2xzKCkpOworCisgICAgLy8gQ29tcHV0ZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGFyZworICAgIGNvbnN0IENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShhcmcpOyAgCisgICAgY29uc3QgTWF0cml4VHlwZSYgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBVID0gc2NodXJPZkEubWF0cml4VSgpOworICAgIAorICAgIC8vIENvbXB1dGUgc3F1YXJlIHJvb3Qgb2YgVAorICAgIE1hdHJpeFR5cGUgc3FydFQ7CisgICAgbWF0cml4X3NxcnRfdHJpYW5ndWxhcihULCBzcXJ0VCk7CisgICAgCisgICAgLy8gQ29tcHV0ZSBzcXVhcmUgcm9vdCBvZiBhcmcKKyAgICByZXN1bHQgPSBVICogKHNxcnRULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogVS5hZGpvaW50KCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgIFR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QuCisgICoKKyAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IHNxdWFyZSByb290IHVudGlsIGl0CisgICogaXMgYXNzaWduZWQgb3IgZXZhbHVhdGVkIGZvciBzb21lIG90aGVyIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50CisgICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZgorICAqIE1hdHJpeEJhc2U6OnNxcnQoKSBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcworICAqIHVzZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBNYXRyaXhTcXVhcmVSb290UmV0dXJuVmFsdWUKKzogcHVibGljIFJldHVybkJ5VmFsdWU8TWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPERlcml2ZWQ+Ojp0eXBlIERlcml2ZWROZXN0ZWQ7CisKKyAgcHVibGljOgorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIHNyYyAgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlCisgICAgICAqIG1hdHJpeCBzcXVhcmUgcm9vdC4KKyAgICAgICovCisgICAgZXhwbGljaXQgTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlKGNvbnN0IERlcml2ZWQmIHNyYykgOiBtX3NyYyhzcmMpIHsgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdICByZXN1bHQgIHRoZSBtYXRyaXggc3F1YXJlIHJvb3Qgb2YgXHAgc3JjIGluIHRoZQorICAgICAgKiBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxEZXJpdmVkLCAxMD46OnR5cGUgRGVyaXZlZEV2YWxUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJpdmVkRXZhbFR5cGU+Ojp0eXBlIERlcml2ZWRFdmFsVHlwZUNsZWFuOworICAgICAgRGVyaXZlZEV2YWxUeXBlIHRtcChtX3NyYyk7CisgICAgICBpbnRlcm5hbDo6bWF0cml4X3NxcnRfY29tcHV0ZTxEZXJpdmVkRXZhbFR5cGVDbGVhbj46OnJ1bih0bXAsIHJlc3VsdCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3NyYy5jb2xzKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgRGVyaXZlZE5lc3RlZCBtX3NyYzsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxNYXRyaXhTcXVhcmVSb290UmV0dXJuVmFsdWU8RGVyaXZlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzcXJ0KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICByZXR1cm4gTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0ZVTkNUSU9OCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL1N0ZW1GdW5jdGlvbi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9TdGVtRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA0ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9TdGVtRnVuY3Rpb24uaApAQCAtMCwwICsxLDExNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTMgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RFTV9GVU5DVElPTgorI2RlZmluZSBFSUdFTl9TVEVNX0ZVTkNUSU9OCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGJyaWVmIFRoZSBleHBvbmVudGlhbCBmdW5jdGlvbiAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIHN0ZW1fZnVuY3Rpb25fZXhwKFNjYWxhciB4LCBpbnQpCit7CisgIHVzaW5nIHN0ZDo6ZXhwOworICByZXR1cm4gZXhwKHgpOworfQorCisvKiogXGJyaWVmIENvc2luZSAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIHN0ZW1fZnVuY3Rpb25fY29zKFNjYWxhciB4LCBpbnQgbikKK3sKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHVzaW5nIHN0ZDo6c2luOworICBTY2FsYXIgcmVzOworCisgIHN3aXRjaCAobiAlIDQpIHsKKyAgY2FzZSAwOiAKKyAgICByZXMgPSBzdGQ6OmNvcyh4KTsKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIHJlcyA9IC1zdGQ6OnNpbih4KTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHJlcyA9IC1zdGQ6OmNvcyh4KTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIHJlcyA9IHN0ZDo6c2luKHgpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qKiBcYnJpZWYgU2luZSAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIHN0ZW1fZnVuY3Rpb25fc2luKFNjYWxhciB4LCBpbnQgbikKK3sKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHVzaW5nIHN0ZDo6c2luOworICBTY2FsYXIgcmVzOworCisgIHN3aXRjaCAobiAlIDQpIHsKKyAgY2FzZSAwOgorICAgIHJlcyA9IHN0ZDo6c2luKHgpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgcmVzID0gc3RkOjpjb3MoeCk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICByZXMgPSAtc3RkOjpzaW4oeCk7CisgICAgYnJlYWs7CisgIGNhc2UgMzoKKyAgICByZXMgPSAtc3RkOjpjb3MoeCk7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyoqIFxicmllZiBIeXBlcmJvbGljIGNvc2luZSAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIHN0ZW1fZnVuY3Rpb25fY29zaChTY2FsYXIgeCwgaW50IG4pCit7CisgIHVzaW5nIHN0ZDo6Y29zaDsKKyAgdXNpbmcgc3RkOjpzaW5oOworICBTY2FsYXIgcmVzOworICAKKyAgc3dpdGNoIChuICUgMikgeworICBjYXNlIDA6CisgICAgcmVzID0gc3RkOjpjb3NoKHgpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgcmVzID0gc3RkOjpzaW5oKHgpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisJCisvKiogXGJyaWVmIEh5cGVyYm9saWMgc2luZSAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIHN0ZW1fZnVuY3Rpb25fc2luaChTY2FsYXIgeCwgaW50IG4pCit7CisgIHVzaW5nIHN0ZDo6Y29zaDsKKyAgdXNpbmcgc3RkOjpzaW5oOworICBTY2FsYXIgcmVzOworICAKKyAgc3dpdGNoIChuICUgMikgeworICBjYXNlIDA6CisgICAgcmVzID0gc3RkOjpzaW5oKHgpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgcmVzID0gc3RkOjpjb3NoKHgpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NURU1fRlVOQ1RJT04KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb3JlVmVjdG9yaXphdGlvbi9NYXRoRnVuY3Rpb25zLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9yZVZlY3Rvcml6YXRpb24vTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2IyOGQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9yZVZlY3Rvcml6YXRpb24vTWF0aEZ1bmN0aW9ucy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IFJvaGl0IEdhcmcgPHJwZy4zMTRAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NT1JFVkVDVE9SSVpBVElPTl9NQVRIRlVOQ1RJT05TX0gKKyNkZWZpbmUgRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTUFUSEZVTkNUSU9OU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBhcmNzaW4gb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIHN0YXRpYyBQYWNrZXQgcGFzaW4oUGFja2V0IGEpIHsgcmV0dXJuIHN0ZDo6YXNpbihhKTsgfQorCisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RPTlRfSU5MSU5FIFBhY2tldDRmIHBhc2luKFBhY2tldDRmIHgpCit7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGhhbGYsIDAuNSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG1pbnVzX2hhbGYsIC0wLjUpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZigzaGFsZiwgMS41KTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChzaWduX21hc2ssIDB4ODAwMDAwMDApOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHBpLCAzLjE0MTU5MjY1NCk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHBpX292ZXJfMiwgMy4xNDE1OTI2NTQqMC41KTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihhc2luMSwgNC4yMTYzMTk5MDQ4RS0yKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoYXNpbjIsIDIuNDE4MTMxMTA0OUUtMik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGFzaW4zLCA0LjU0NzAwMjU5OThFLTIpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihhc2luNCwgNy40OTUzMDAyNjg2RS0yKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoYXNpbjUsIDEuNjY2Njc1MjQyMkUtMSk7CisKKyAgUGFja2V0NGYgYSA9IHBhYnMoeCk7Ly9nb3QgdGhlIGFic29sdXRlIHZhbHVlCisKKyAgUGFja2V0NGYgc2lnbl9iaXQ9IF9tbV9hbmRfcHMoeCwgcDRmX3NpZ25fbWFzayk7Ly9leHRyYWN0ZWQgdGhlIHNpZ24gYml0CisKKyAgUGFja2V0NGYgejEsejI7Ly93aWxsIG5lZWQgdGhlbSBkdXJpbmcgY29tcHV0YXRpb24gICAgCisKKworLy93aWxsIGNvbXB1dGUgdGhlIHR3byBicmFuY2hlcyBmb3IgYXNpbgorLy9zbyBmaXJzdCBjb21wYXJlIHdpdGggaGFsZgorCisgIFBhY2tldDRmIGJyYW5jaF9tYXNrPSBfbW1fY21wZ3RfcHMoYSwgcDRmX2hhbGYpOy8vdGhpcyBpcyB0byBzZWxlY3Qgd2hpY2ggYnJhbmNoIHRvIHRha2UKKy8vYm90aCB3aWxsIGJlIHRha2VuLCBhbmQgZmluYWxseSByZXN1bHRzIHdpbGwgYmUgbWVyZ2VkCisvL3RoZSBicmFuY2ggZm9yIHZhbHVlcyA+MC41CisKKyAgICB7CisvL3RoZSBjb3JlIHNlcmllcyBleHBhbnNpb24gCisgICAgejE9cG1hZGQocDRmX21pbnVzX2hhbGYsYSxwNGZfaGFsZik7CisgICAgUGFja2V0NGYgeDE9cHNxcnQoejEpOworICAgIFBhY2tldDRmIHMxPXBtYWRkKHA0Zl9hc2luMSwgejEsIHA0Zl9hc2luMik7CisgICAgUGFja2V0NGYgczI9cG1hZGQoczEsIHoxLCBwNGZfYXNpbjMpOworICAgIFBhY2tldDRmIHMzPXBtYWRkKHMyLHoxLCBwNGZfYXNpbjQpOworICAgIFBhY2tldDRmIHM0PXBtYWRkKHMzLHoxLCBwNGZfYXNpbjUpOworICAgIFBhY2tldDRmIHRlbXA9cG11bChzNCx6MSk7Ly9ub3QgcmVhbGx5IGEgbWFkZCBidXQgYSBtdWwgYnkgeiBzbyB0aGF0IHRoZSBuZXh0IHRlcm0gY2FuIGJlIGEgbWFkZAorICAgIHoxPXBtYWRkKHRlbXAseDEseDEpOworICAgIHoxPXBhZGQoejEsejEpOworICAgIHoxPXBzdWIocDRmX3BpX292ZXJfMix6MSk7CisgICAgfQorCisgICAgeworLy90aGUgY29yZSBzZXJpZXMgZXhwYW5zaW9uIAorICAgIFBhY2tldDRmIHgyPWE7CisgICAgejI9cG11bCh4Mix4Mik7CisgICAgUGFja2V0NGYgczE9cG1hZGQocDRmX2FzaW4xLCB6MiwgcDRmX2FzaW4yKTsKKyAgICBQYWNrZXQ0ZiBzMj1wbWFkZChzMSwgejIsIHA0Zl9hc2luMyk7CisgICAgUGFja2V0NGYgczM9cG1hZGQoczIsejIsIHA0Zl9hc2luNCk7CisgICAgUGFja2V0NGYgczQ9cG1hZGQoczMsejIsIHA0Zl9hc2luNSk7CisgICAgUGFja2V0NGYgdGVtcD1wbXVsKHM0LHoyKTsvL25vdCByZWFsbHkgYSBtYWRkIGJ1dCBhIG11bCBieSB6IHNvIHRoYXQgdGhlIG5leHQgdGVybSBjYW4gYmUgYSBtYWRkCisgICAgejI9cG1hZGQodGVtcCx4Mix4Mik7CisgICAgfQorCisvKiBzZWxlY3QgdGhlIGNvcnJlY3QgcmVzdWx0IGZyb20gdGhlIHR3byBicmFuY2ggZXZhbHVhdGlvbnMgKi8KKyAgejEgID0gX21tX2FuZF9wcyhicmFuY2hfbWFzaywgejEpOworICB6MiAgPSBfbW1fYW5kbm90X3BzKGJyYW5jaF9tYXNrLCB6Mik7CisgIFBhY2tldDRmIHogID0gX21tX29yX3BzKHoxLHoyKTsKKworLyogdXBkYXRlIHRoZSBzaWduICovCisgIHJldHVybiBfbW1feG9yX3BzKHosIHNpZ25fYml0KTsKK30KKworI2VuZGlmIC8vIEVJR0VOX1ZFQ1RPUklaRV9TU0UKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTUFUSEZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL0h5YnJpZE5vbkxpbmVhclNvbHZlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9IeWJyaWROb25MaW5lYXJTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUzZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9IeWJyaWROb25MaW5lYXJTb2x2ZXIuaApAQCAtMCwwICsxLDYwMSBAQAorLy8gLSotIGNvZGluZzogdXRmLTgKKy8vIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorI2RlZmluZSBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlIHsgCisgICAgZW51bSBTdGF0dXMgeworICAgICAgICBSdW5uaW5nID0gLTEsCisgICAgICAgIEltcHJvcGVySW5wdXRQYXJhbWV0ZXJzID0gMCwKKyAgICAgICAgUmVsYXRpdmVFcnJvclRvb1NtYWxsID0gMSwKKyAgICAgICAgVG9vTWFueUZ1bmN0aW9uRXZhbHVhdGlvbiA9IDIsCisgICAgICAgIFRvbFRvb1NtYWxsID0gMywKKyAgICAgICAgTm90TWFraW5nUHJvZ3Jlc3NKYWNvYmlhbiA9IDQsCisgICAgICAgIE5vdE1ha2luZ1Byb2dyZXNzSXRlcmF0aW9ucyA9IDUsCisgICAgICAgIFVzZXJBc2tlZCA9IDYKKyAgICB9OworfQorCisvKioKKyAgKiBcaW5ncm91cCBOb25MaW5lYXJPcHRpbWl6YXRpb25fTW9kdWxlCisgICogXGJyaWVmIEZpbmRzIGEgemVybyBvZiBhIHN5c3RlbSBvZiBuCisgICogbm9ubGluZWFyIGZ1bmN0aW9ucyBpbiBuIHZhcmlhYmxlcyBieSBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgUG93ZWxsCisgICogaHlicmlkIG1ldGhvZCAoImRvZ2xlZyIpLgorICAqCisgICogVGhlIHVzZXIgbXVzdCBwcm92aWRlIGEgc3Vicm91dGluZSB3aGljaCBjYWxjdWxhdGVzIHRoZQorICAqIGZ1bmN0aW9ucy4gVGhlIEphY29iaWFuIGlzIGVpdGhlciBwcm92aWRlZCBieSB0aGUgdXNlciwgb3IgYXBwcm94aW1hdGVkCisgICogdXNpbmcgYSBmb3J3YXJkLWRpZmZlcmVuY2UgbWV0aG9kLgorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPWRvdWJsZT4KK2NsYXNzIEh5YnJpZE5vbkxpbmVhclNvbHZlcgoreworcHVibGljOgorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlcihGdW5jdG9yVHlwZSAmX2Z1bmN0b3IpCisgICAgICAgIDogZnVuY3RvcihfZnVuY3RvcikgeyBuZmV2PW5qZXY9aXRlciA9IDA7ICBmbm9ybT0gMC47IHVzZUV4dGVybmFsU2NhbGluZz1mYWxzZTt9CisKKyAgICBzdHJ1Y3QgUGFyYW1ldGVycyB7CisgICAgICAgIFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgOiBmYWN0b3IoU2NhbGFyKDEwMC4pKQorICAgICAgICAgICAgLCBtYXhmZXYoMTAwMCkKKyAgICAgICAgICAgICwgeHRvbChzdGQ6OnNxcnQoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkpCisgICAgICAgICAgICAsIG5iX29mX3N1YmRpYWdvbmFscygtMSkKKyAgICAgICAgICAgICwgbmJfb2Zfc3VwZXJkaWFnb25hbHMoLTEpCisgICAgICAgICAgICAsIGVwc2ZjbihTY2FsYXIoMC4pKSB7fQorICAgICAgICBTY2FsYXIgZmFjdG9yOworICAgICAgICBJbmRleCBtYXhmZXY7ICAgLy8gbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gZXZhbHVhdGlvbgorICAgICAgICBTY2FsYXIgeHRvbDsKKyAgICAgICAgSW5kZXggbmJfb2Zfc3ViZGlhZ29uYWxzOworICAgICAgICBJbmRleCBuYl9vZl9zdXBlcmRpYWdvbmFsczsKKyAgICAgICAgU2NhbGFyIGVwc2ZjbjsKKyAgICB9OworICAgIHR5cGVkZWYgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiBGVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gSmFjb2JpYW5UeXBlOworICAgIC8qIFRPRE86IGlmIGVpZ2VuIHByb3ZpZGVzIGEgdHJpYW5ndWxhciBzdG9yYWdlLCB1c2UgaXQgaGVyZSAqLworICAgIHR5cGVkZWYgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiBVcHBlclRyaWFuZ3VsYXJUeXBlOworCisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cyBoeWJyajEoCisgICAgICAgICAgICBGVmVjdG9yVHlwZSAgJngsCisgICAgICAgICAgICBjb25zdCBTY2FsYXIgdG9sID0gc3RkOjpzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpCisgICAgICAgICAgICApOworCisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cyBzb2x2ZUluaXQoRlZlY3RvclR5cGUgICZ4KTsKKyAgICBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzIHNvbHZlT25lU3RlcChGVmVjdG9yVHlwZSAgJngpOworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmUoRlZlY3RvclR5cGUgICZ4KTsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgaHlicmQxKAorICAgICAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IHN0ZDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgKTsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmSW5pdChGVmVjdG9yVHlwZSAgJngpOworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmT25lU3RlcChGVmVjdG9yVHlwZSAgJngpOworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmKEZWZWN0b3JUeXBlICAmeCk7CisKKyAgICB2b2lkIHJlc2V0UGFyYW1ldGVycyh2b2lkKSB7IHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzKCk7IH0KKyAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgRlZlY3RvclR5cGUgIGZ2ZWMsIHF0ZiwgZGlhZzsKKyAgICBKYWNvYmlhblR5cGUgZmphYzsKKyAgICBVcHBlclRyaWFuZ3VsYXJUeXBlIFI7CisgICAgSW5kZXggbmZldjsKKyAgICBJbmRleCBuamV2OworICAgIEluZGV4IGl0ZXI7CisgICAgU2NhbGFyIGZub3JtOworICAgIGJvb2wgdXNlRXh0ZXJuYWxTY2FsaW5nOyAKK3ByaXZhdGU6CisgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3I7CisgICAgSW5kZXggbjsKKyAgICBTY2FsYXIgc3VtOworICAgIGJvb2wgc2luZzsKKyAgICBTY2FsYXIgdGVtcDsKKyAgICBTY2FsYXIgZGVsdGE7CisgICAgYm9vbCBqZXZhbDsKKyAgICBJbmRleCBuY3N1YzsKKyAgICBTY2FsYXIgcmF0aW87CisgICAgU2NhbGFyIHBub3JtLCB4bm9ybSwgZm5vcm0xOworICAgIEluZGV4IG5zbG93MSwgbnNsb3cyOworICAgIEluZGV4IG5jZmFpbDsKKyAgICBTY2FsYXIgYWN0cmVkLCBwcmVyZWQ7CisgICAgRlZlY3RvclR5cGUgd2ExLCB3YTIsIHdhMywgd2E0OworCisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyJiBvcGVyYXRvcj0oY29uc3QgSHlicmlkTm9uTGluZWFyU29sdmVyJik7Cit9OworCisKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+OjpoeWJyajEoCisgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgY29uc3QgU2NhbGFyIHRvbAorICAgICAgICApCit7CisgICAgbiA9IHguc2l6ZSgpOworCisgICAgLyogY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IHRvbCA8IDAuKQorICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworCisgICAgcmVzZXRQYXJhbWV0ZXJzKCk7CisgICAgcGFyYW1ldGVycy5tYXhmZXYgPSAxMDAqKG4rMSk7CisgICAgcGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIGRpYWcuc2V0Q29uc3RhbnQobiwgMS4pOworICAgIHVzZUV4dGVybmFsU2NhbGluZyA9IHRydWU7CisgICAgcmV0dXJuIHNvbHZlKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cworSHlicmlkTm9uTGluZWFyU29sdmVyPEZ1bmN0b3JUeXBlLFNjYWxhcj46OnNvbHZlSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsgd2E0LnJlc2l6ZShuKTsKKyAgICBmdmVjLnJlc2l6ZShuKTsKKyAgICBxdGYucmVzaXplKG4pOworICAgIGZqYWMucmVzaXplKG4sIG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBlaWdlbl9hc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSAmJiAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIG5mZXYgPSAwOworICAgIG5qZXYgPSAwOworCisgICAgLyogICAgIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBwYXJhbWV0ZXJzLnh0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLm1heGZldiA8PSAwIHx8IHBhcmFtZXRlcnMuZmFjdG9yIDw9IDAuICkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKyAgICBpZiAodXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKGRpYWdbal0gPD0gMC4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbmZldiA9IDE7CisgICAgaWYgKCBmdW5jdG9yKHgsIGZ2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgZm5vcm0gPSBmdmVjLnN0YWJsZU5vcm0oKTsKKworICAgIC8qICAgICBpbml0aWFsaXplIGl0ZXJhdGlvbiBjb3VudGVyIGFuZCBtb25pdG9ycy4gKi8KKyAgICBpdGVyID0gMTsKKyAgICBuY3N1YyA9IDA7CisgICAgbmNmYWlsID0gMDsKKyAgICBuc2xvdzEgPSAwOworICAgIG5zbG93MiA9IDA7CisKKyAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzCitIeWJyaWROb25MaW5lYXJTb2x2ZXI8RnVuY3RvclR5cGUsU2NhbGFyPjo6c29sdmVPbmVTdGVwKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAKKyAgICBlaWdlbl9hc3NlcnQoeC5zaXplKCk9PW4pOyAvLyBjaGVjayB0aGUgY2FsbGVyIGlzIG5vdCBjaGVhdGluZyB1cworCisgICAgSW5kZXggajsKKyAgICBzdGQ6OnZlY3RvcjxKYWNvYmlSb3RhdGlvbjxTY2FsYXI+ID4gdl9naXZlbnMobiksIHdfZ2l2ZW5zKG4pOworCisgICAgamV2YWwgPSB0cnVlOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBqYWNvYmlhbiBtYXRyaXguICovCisgICAgaWYgKCBmdW5jdG9yLmRmKHgsIGZqYWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgKytuamV2OworCisgICAgd2EyID0gZmphYy5jb2x3aXNlKCkuYmx1ZU5vcm0oKTsKKworICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIGlmIGV4dGVybmFsIHNjYWxpbmcgaXMgbm90IHVzZWQsIHNjYWxlIGFjY29yZGluZyAqLworICAgIC8qIHRvIHRoZSBub3JtcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgaW5pdGlhbCBqYWNvYmlhbi4gKi8KKyAgICBpZiAoaXRlciA9PSAxKSB7CisgICAgICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgICAgICBkaWFnW2pdID0gKHdhMltqXT09MC4pID8gMS4gOiB3YTJbal07CisKKyAgICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgeCAqLworICAgICAgICAvKiBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RlcCBib3VuZCBkZWx0YS4gKi8KKyAgICAgICAgeG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3IgKiB4bm9ybTsKKyAgICAgICAgaWYgKGRlbHRhID09IDAuKQorICAgICAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvcjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbi4gKi8KKyAgICBIb3VzZWhvbGRlclFSPEphY29iaWFuVHlwZT4gcXJmYWMoZmphYyk7IC8vIG5vIHBpdm90aW5nOgorCisgICAgLyogY29weSB0aGUgdHJpYW5ndWxhciBmYWN0b3Igb2YgdGhlIHFyIGZhY3Rvcml6YXRpb24gaW50byByLiAqLworICAgIFIgPSBxcmZhYy5tYXRyaXhRUigpOworCisgICAgLyogYWNjdW11bGF0ZSB0aGUgb3J0aG9nb25hbCBmYWN0b3IgaW4gZmphYy4gKi8KKyAgICBmamFjID0gcXJmYWMuaG91c2Vob2xkZXJRKCk7CisKKyAgICAvKiBmb3JtIChxIHRyYW5zcG9zZSkqZnZlYyBhbmQgc3RvcmUgaW4gcXRmLiAqLworICAgIHF0ZiA9IGZqYWMudHJhbnNwb3NlKCkgKiBmdmVjOworCisgICAgLyogcmVzY2FsZSBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGRpYWcgPSBkaWFnLmN3aXNlTWF4KHdhMik7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBwLiAqLworICAgICAgICBpbnRlcm5hbDo6ZG9nbGVnPFNjYWxhcj4oUiwgZGlhZywgcXRmLCBkZWx0YSwgd2ExKTsKKworICAgICAgICAvKiBzdG9yZSB0aGUgZGlyZWN0aW9uIHAgYW5kIHggKyBwLiBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgcC4gKi8KKyAgICAgICAgd2ExID0gLXdhMTsKKyAgICAgICAgd2EyID0geCArIHdhMTsKKyAgICAgICAgcG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh3YTEpLnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhZGp1c3QgdGhlIGluaXRpYWwgc3RlcCBib3VuZC4gKi8KKyAgICAgICAgaWYgKGl0ZXIgPT0gMSkKKyAgICAgICAgICAgIGRlbHRhID0gKHN0ZDo6bWluKShkZWx0YSxwbm9ybSk7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHggKyBwIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgICAgIGlmICggZnVuY3Rvcih3YTIsIHdhNCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgICAgICsrbmZldjsKKyAgICAgICAgZm5vcm0xID0gd2E0LnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBzY2FsZWQgYWN0dWFsIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgYWN0cmVkID0gLTEuOworICAgICAgICBpZiAoZm5vcm0xIDwgZm5vcm0pIC8qIENvbXB1dGluZyAybmQgcG93ZXIgKi8KKyAgICAgICAgICAgIGFjdHJlZCA9IDEuIC0gbnVtZXh0OjphYnMyKGZub3JtMSAvIGZub3JtKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBzY2FsZWQgcHJlZGljdGVkIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgd2EzID0gUi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSp3YTEgKyBxdGY7CisgICAgICAgIHRlbXAgPSB3YTMuc3RhYmxlTm9ybSgpOworICAgICAgICBwcmVyZWQgPSAwLjsKKyAgICAgICAgaWYgKHRlbXAgPCBmbm9ybSkgLyogQ29tcHV0aW5nIDJuZCBwb3dlciAqLworICAgICAgICAgICAgcHJlcmVkID0gMS4gLSBudW1leHQ6OmFiczIodGVtcCAvIGZub3JtKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSByYXRpbyBvZiB0aGUgYWN0dWFsIHRvIHRoZSBwcmVkaWN0ZWQgcmVkdWN0aW9uLiAqLworICAgICAgICByYXRpbyA9IDAuOworICAgICAgICBpZiAocHJlcmVkID4gMC4pCisgICAgICAgICAgICByYXRpbyA9IGFjdHJlZCAvIHByZXJlZDsKKworICAgICAgICAvKiB1cGRhdGUgdGhlIHN0ZXAgYm91bmQuICovCisgICAgICAgIGlmIChyYXRpbyA8IFNjYWxhciguMSkpIHsKKyAgICAgICAgICAgIG5jc3VjID0gMDsKKyAgICAgICAgICAgICsrbmNmYWlsOworICAgICAgICAgICAgZGVsdGEgPSBTY2FsYXIoLjUpICogZGVsdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuY2ZhaWwgPSAwOworICAgICAgICAgICAgKytuY3N1YzsKKyAgICAgICAgICAgIGlmIChyYXRpbyA+PSBTY2FsYXIoLjUpIHx8IG5jc3VjID4gMSkKKyAgICAgICAgICAgICAgICBkZWx0YSA9IChzdGQ6Om1heCkoZGVsdGEsIHBub3JtIC8gU2NhbGFyKC41KSk7CisgICAgICAgICAgICBpZiAoYWJzKHJhdGlvIC0gMS4pIDw9IFNjYWxhciguMSkpIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHBub3JtIC8gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHRlc3QgZm9yIHN1Y2Nlc3NmdWwgaXRlcmF0aW9uLiAqLworICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKDFlLTQpKSB7CisgICAgICAgICAgICAvKiBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gdXBkYXRlIHgsIGZ2ZWMsIGFuZCB0aGVpciBub3Jtcy4gKi8KKyAgICAgICAgICAgIHggPSB3YTI7CisgICAgICAgICAgICB3YTIgPSBkaWFnLmN3aXNlUHJvZHVjdCh4KTsKKyAgICAgICAgICAgIGZ2ZWMgPSB3YTQ7CisgICAgICAgICAgICB4bm9ybSA9IHdhMi5zdGFibGVOb3JtKCk7CisgICAgICAgICAgICBmbm9ybSA9IGZub3JtMTsKKyAgICAgICAgICAgICsraXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGl0ZXJhdGlvbi4gKi8KKyAgICAgICAgKytuc2xvdzE7CisgICAgICAgIGlmIChhY3RyZWQgPj0gU2NhbGFyKC4wMDEpKQorICAgICAgICAgICAgbnNsb3cxID0gMDsKKyAgICAgICAgaWYgKGpldmFsKQorICAgICAgICAgICAgKytuc2xvdzI7CisgICAgICAgIGlmIChhY3RyZWQgPj0gU2NhbGFyKC4xKSkKKyAgICAgICAgICAgIG5zbG93MiA9IDA7CisKKyAgICAgICAgLyogdGVzdCBmb3IgY29udmVyZ2VuY2UuICovCisgICAgICAgIGlmIChkZWx0YSA8PSBwYXJhbWV0ZXJzLnh0b2wgKiB4bm9ybSB8fCBmbm9ybSA9PSAwLikKKyAgICAgICAgICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UmVsYXRpdmVFcnJvclRvb1NtYWxsOworCisgICAgICAgIC8qIHRlc3RzIGZvciB0ZXJtaW5hdGlvbiBhbmQgc3RyaW5nZW50IHRvbGVyYW5jZXMuICovCisgICAgICAgIGlmIChuZmV2ID49IHBhcmFtZXRlcnMubWF4ZmV2KQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpUb29NYW55RnVuY3Rpb25FdmFsdWF0aW9uOworICAgICAgICBpZiAoU2NhbGFyKC4xKSAqIChzdGQ6Om1heCkoU2NhbGFyKC4xKSAqIGRlbHRhLCBwbm9ybSkgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpUb2xUb29TbWFsbDsKKyAgICAgICAgaWYgKG5zbG93MiA9PSA1KQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpOb3RNYWtpbmdQcm9ncmVzc0phY29iaWFuOworICAgICAgICBpZiAobnNsb3cxID09IDEwKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpOb3RNYWtpbmdQcm9ncmVzc0l0ZXJhdGlvbnM7CisKKyAgICAgICAgLyogY3JpdGVyaW9uIGZvciByZWNhbGN1bGF0aW5nIGphY29iaWFuLiAqLworICAgICAgICBpZiAobmNmYWlsID09IDIpCisgICAgICAgICAgICBicmVhazsgLy8gbGVhdmUgaW5uZXIgbG9vcCBhbmQgZ28gZm9yIHRoZSBuZXh0IG91dGVyIGxvb3AgaXRlcmF0aW9uCisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByYW5rIG9uZSBtb2RpZmljYXRpb24gdG8gdGhlIGphY29iaWFuICovCisgICAgICAgIC8qIGFuZCB1cGRhdGUgcXRmIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICAgICAgd2ExID0gZGlhZy5jd2lzZVByb2R1Y3QoIGRpYWcuY3dpc2VQcm9kdWN0KHdhMSkvcG5vcm0gKTsKKyAgICAgICAgd2EyID0gZmphYy50cmFuc3Bvc2UoKSAqIHdhNDsKKyAgICAgICAgaWYgKHJhdGlvID49IFNjYWxhcigxZS00KSkKKyAgICAgICAgICAgIHF0ZiA9IHdhMjsKKyAgICAgICAgd2EyID0gKHdhMi13YTMpL3Bub3JtOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHFyIGZhY3Rvcml6YXRpb24gb2YgdGhlIHVwZGF0ZWQgamFjb2JpYW4uICovCisgICAgICAgIGludGVybmFsOjpyMXVwZHQ8U2NhbGFyPihSLCB3YTEsIHZfZ2l2ZW5zLCB3X2dpdmVucywgd2EyLCB3YTMsICZzaW5nKTsKKyAgICAgICAgaW50ZXJuYWw6OnIxbXB5cTxTY2FsYXI+KG4sIG4sIGZqYWMuZGF0YSgpLCB2X2dpdmVucywgd19naXZlbnMpOworICAgICAgICBpbnRlcm5hbDo6cjFtcHlxPFNjYWxhcj4oMSwgbiwgcXRmLmRhdGEoKSwgdl9naXZlbnMsIHdfZ2l2ZW5zKTsKKworICAgICAgICBqZXZhbCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzCitIeWJyaWROb25MaW5lYXJTb2x2ZXI8RnVuY3RvclR5cGUsU2NhbGFyPjo6c29sdmUoRlZlY3RvclR5cGUgICZ4KQoreworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc3RhdHVzID0gc29sdmVJbml0KHgpOworICAgIGlmIChzdGF0dXM9PUh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVycykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB3aGlsZSAoc3RhdHVzPT1IeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UnVubmluZykKKyAgICAgICAgc3RhdHVzID0gc29sdmVPbmVTdGVwKHgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cworSHlicmlkTm9uTGluZWFyU29sdmVyPEZ1bmN0b3JUeXBlLFNjYWxhcj46Omh5YnJkMSgKKyAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBuID0geC5zaXplKCk7CisKKyAgICAvKiBjaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgZXJyb3JzLiAqLworICAgIGlmIChuIDw9IDAgfHwgdG9sIDwgMC4pCisgICAgICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICByZXNldFBhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLm1heGZldiA9IDIwMCoobisxKTsKKyAgICBwYXJhbWV0ZXJzLnh0b2wgPSB0b2w7CisKKyAgICBkaWFnLnNldENvbnN0YW50KG4sIDEuKTsKKyAgICB1c2VFeHRlcm5hbFNjYWxpbmcgPSB0cnVlOworICAgIHJldHVybiBzb2x2ZU51bWVyaWNhbERpZmYoeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzCitIeWJyaWROb25MaW5lYXJTb2x2ZXI8RnVuY3RvclR5cGUsU2NhbGFyPjo6c29sdmVOdW1lcmljYWxEaWZmSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworCisgICAgaWYgKHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzPDApIHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzPSBuLTE7CisgICAgaWYgKHBhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHM8MCkgcGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFscz0gbi0xOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsgd2E0LnJlc2l6ZShuKTsKKyAgICBxdGYucmVzaXplKG4pOworICAgIGZqYWMucmVzaXplKG4sIG4pOworICAgIGZ2ZWMucmVzaXplKG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBlaWdlbl9hc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSAmJiAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIG5mZXYgPSAwOworICAgIG5qZXYgPSAwOworCisgICAgLyogICAgIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBwYXJhbWV0ZXJzLnh0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLm1heGZldiA8PSAwIHx8IHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzPCAwIHx8IHBhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHM8IDAgfHwgcGFyYW1ldGVycy5mYWN0b3IgPD0gMC4gKQorICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworICAgIGlmICh1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyArK2opCisgICAgICAgICAgICBpZiAoZGlhZ1tqXSA8PSAwLikKKyAgICAgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworCisgICAgLyogICAgIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgKi8KKyAgICAvKiAgICAgYW5kIGNhbGN1bGF0ZSBpdHMgbm9ybS4gKi8KKyAgICBuZmV2ID0gMTsKKyAgICBpZiAoIGZ1bmN0b3IoeCwgZnZlYykgPCAwKQorICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlVzZXJBc2tlZDsKKyAgICBmbm9ybSA9IGZ2ZWMuc3RhYmxlTm9ybSgpOworCisgICAgLyogICAgIGluaXRpYWxpemUgaXRlcmF0aW9uIGNvdW50ZXIgYW5kIG1vbml0b3JzLiAqLworICAgIGl0ZXIgPSAxOworICAgIG5jc3VjID0gMDsKKyAgICBuY2ZhaWwgPSAwOworICAgIG5zbG93MSA9IDA7CisgICAgbnNsb3cyID0gMDsKKworICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UnVubmluZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+Ojpzb2x2ZU51bWVyaWNhbERpZmZPbmVTdGVwKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgCisgICAgYXNzZXJ0KHguc2l6ZSgpPT1uKTsgLy8gY2hlY2sgdGhlIGNhbGxlciBpcyBub3QgY2hlYXRpbmcgdXMKKworICAgIEluZGV4IGo7CisgICAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+IHZfZ2l2ZW5zKG4pLCB3X2dpdmVucyhuKTsKKworICAgIGpldmFsID0gdHJ1ZTsKKyAgICBpZiAocGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHM8MCkgcGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHM9IG4tMTsKKyAgICBpZiAocGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFsczwwKSBwYXJhbWV0ZXJzLm5iX29mX3N1cGVyZGlhZ29uYWxzPSBuLTE7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGphY29iaWFuIG1hdHJpeC4gKi8KKyAgICBpZiAoaW50ZXJuYWw6OmZkamFjMShmdW5jdG9yLCB4LCBmdmVjLCBmamFjLCBwYXJhbWV0ZXJzLm5iX29mX3N1YmRpYWdvbmFscywgcGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFscywgcGFyYW1ldGVycy5lcHNmY24pIDwwKQorICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlVzZXJBc2tlZDsKKyAgICBuZmV2ICs9IChzdGQ6Om1pbikocGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHMrcGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFscysgMSwgbik7CisKKyAgICB3YTIgPSBmamFjLmNvbHdpc2UoKS5ibHVlTm9ybSgpOworCisgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiBhbmQgaWYgZXh0ZXJuYWwgc2NhbGluZyBpcyBub3QgdXNlZCwgc2NhbGUgYWNjb3JkaW5nICovCisgICAgLyogdG8gdGhlIG5vcm1zIG9mIHRoZSBjb2x1bW5zIG9mIHRoZSBpbml0aWFsIGphY29iaWFuLiAqLworICAgIGlmIChpdGVyID09IDEpIHsKKyAgICAgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgICAgIGRpYWdbal0gPSAod2EyW2pdPT0wLikgPyAxLiA6IHdhMltqXTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCB4ICovCisgICAgICAgIC8qIGFuZCBpbml0aWFsaXplIHRoZSBzdGVwIGJvdW5kIGRlbHRhLiAqLworICAgICAgICB4bm9ybSA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvciAqIHhub3JtOworICAgICAgICBpZiAoZGVsdGEgPT0gMC4pCisgICAgICAgICAgICBkZWx0YSA9IHBhcmFtZXRlcnMuZmFjdG9yOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdGhlIHFyIGZhY3Rvcml6YXRpb24gb2YgdGhlIGphY29iaWFuLiAqLworICAgIEhvdXNlaG9sZGVyUVI8SmFjb2JpYW5UeXBlPiBxcmZhYyhmamFjKTsgLy8gbm8gcGl2b3Rpbmc6CisKKyAgICAvKiBjb3B5IHRoZSB0cmlhbmd1bGFyIGZhY3RvciBvZiB0aGUgcXIgZmFjdG9yaXphdGlvbiBpbnRvIHIuICovCisgICAgUiA9IHFyZmFjLm1hdHJpeFFSKCk7CisKKyAgICAvKiBhY2N1bXVsYXRlIHRoZSBvcnRob2dvbmFsIGZhY3RvciBpbiBmamFjLiAqLworICAgIGZqYWMgPSBxcmZhYy5ob3VzZWhvbGRlclEoKTsKKworICAgIC8qIGZvcm0gKHEgdHJhbnNwb3NlKSpmdmVjIGFuZCBzdG9yZSBpbiBxdGYuICovCisgICAgcXRmID0gZmphYy50cmFuc3Bvc2UoKSAqIGZ2ZWM7CisKKyAgICAvKiByZXNjYWxlIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICBpZiAoIXVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgZGlhZyA9IGRpYWcuY3dpc2VNYXgod2EyKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIC8qIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHAuICovCisgICAgICAgIGludGVybmFsOjpkb2dsZWc8U2NhbGFyPihSLCBkaWFnLCBxdGYsIGRlbHRhLCB3YTEpOworCisgICAgICAgIC8qIHN0b3JlIHRoZSBkaXJlY3Rpb24gcCBhbmQgeCArIHAuIGNhbGN1bGF0ZSB0aGUgbm9ybSBvZiBwLiAqLworICAgICAgICB3YTEgPSAtd2ExOworICAgICAgICB3YTIgPSB4ICsgd2ExOworICAgICAgICBwbm9ybSA9IGRpYWcuY3dpc2VQcm9kdWN0KHdhMSkuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFkanVzdCB0aGUgaW5pdGlhbCBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAoaXRlciA9PSAxKQorICAgICAgICAgICAgZGVsdGEgPSAoc3RkOjptaW4pKGRlbHRhLHBub3JtKTsKKworICAgICAgICAvKiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgeCArIHAgYW5kIGNhbGN1bGF0ZSBpdHMgbm9ybS4gKi8KKyAgICAgICAgaWYgKCBmdW5jdG9yKHdhMiwgd2E0KSA8IDApCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlVzZXJBc2tlZDsKKyAgICAgICAgKytuZmV2OworICAgICAgICBmbm9ybTEgPSB3YTQuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBhY3R1YWwgcmVkdWN0aW9uLiAqLworICAgICAgICBhY3RyZWQgPSAtMS47CisgICAgICAgIGlmIChmbm9ybTEgPCBmbm9ybSkgLyogQ29tcHV0aW5nIDJuZCBwb3dlciAqLworICAgICAgICAgICAgYWN0cmVkID0gMS4gLSBudW1leHQ6OmFiczIoZm5vcm0xIC8gZm5vcm0pOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBwcmVkaWN0ZWQgcmVkdWN0aW9uLiAqLworICAgICAgICB3YTMgPSBSLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKndhMSArIHF0ZjsKKyAgICAgICAgdGVtcCA9IHdhMy5zdGFibGVOb3JtKCk7CisgICAgICAgIHByZXJlZCA9IDAuOworICAgICAgICBpZiAodGVtcCA8IGZub3JtKSAvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgICAgICAgICBwcmVyZWQgPSAxLiAtIG51bWV4dDo6YWJzMih0ZW1wIC8gZm5vcm0pOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHJhdGlvIG9mIHRoZSBhY3R1YWwgdG8gdGhlIHByZWRpY3RlZCByZWR1Y3Rpb24uICovCisgICAgICAgIHJhdGlvID0gMC47CisgICAgICAgIGlmIChwcmVyZWQgPiAwLikKKyAgICAgICAgICAgIHJhdGlvID0gYWN0cmVkIC8gcHJlcmVkOworCisgICAgICAgIC8qIHVwZGF0ZSB0aGUgc3RlcCBib3VuZC4gKi8KKyAgICAgICAgaWYgKHJhdGlvIDwgU2NhbGFyKC4xKSkgeworICAgICAgICAgICAgbmNzdWMgPSAwOworICAgICAgICAgICAgKytuY2ZhaWw7CisgICAgICAgICAgICBkZWx0YSA9IFNjYWxhciguNSkgKiBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5jZmFpbCA9IDA7CisgICAgICAgICAgICArK25jc3VjOworICAgICAgICAgICAgaWYgKHJhdGlvID49IFNjYWxhciguNSkgfHwgbmNzdWMgPiAxKQorICAgICAgICAgICAgICAgIGRlbHRhID0gKHN0ZDo6bWF4KShkZWx0YSwgcG5vcm0gLyBTY2FsYXIoLjUpKTsKKyAgICAgICAgICAgIGlmIChhYnMocmF0aW8gLSAxLikgPD0gU2NhbGFyKC4xKSkgeworICAgICAgICAgICAgICAgIGRlbHRhID0gcG5vcm0gLyBTY2FsYXIoLjUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdCBmb3Igc3VjY2Vzc2Z1bCBpdGVyYXRpb24uICovCisgICAgICAgIGlmIChyYXRpbyA+PSBTY2FsYXIoMWUtNCkpIHsKKyAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWwgaXRlcmF0aW9uLiB1cGRhdGUgeCwgZnZlYywgYW5kIHRoZWlyIG5vcm1zLiAqLworICAgICAgICAgICAgeCA9IHdhMjsKKyAgICAgICAgICAgIHdhMiA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpOworICAgICAgICAgICAgZnZlYyA9IHdhNDsKKyAgICAgICAgICAgIHhub3JtID0gd2EyLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgICAgIGZub3JtID0gZm5vcm0xOworICAgICAgICAgICAgKytpdGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBwcm9ncmVzcyBvZiB0aGUgaXRlcmF0aW9uLiAqLworICAgICAgICArK25zbG93MTsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjAwMSkpCisgICAgICAgICAgICBuc2xvdzEgPSAwOworICAgICAgICBpZiAoamV2YWwpCisgICAgICAgICAgICArK25zbG93MjsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjEpKQorICAgICAgICAgICAgbnNsb3cyID0gMDsKKworICAgICAgICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZS4gKi8KKyAgICAgICAgaWYgKGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtIHx8IGZub3JtID09IDAuKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpSZWxhdGl2ZUVycm9yVG9vU21hbGw7CisKKyAgICAgICAgLyogdGVzdHMgZm9yIHRlcm1pbmF0aW9uIGFuZCBzdHJpbmdlbnQgdG9sZXJhbmNlcy4gKi8KKyAgICAgICAgaWYgKG5mZXYgPj0gcGFyYW1ldGVycy5tYXhmZXYpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb247CisgICAgICAgIGlmIChTY2FsYXIoLjEpICogKHN0ZDo6bWF4KShTY2FsYXIoLjEpICogZGVsdGEsIHBub3JtKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvbFRvb1NtYWxsOworICAgICAgICBpZiAobnNsb3cyID09IDUpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSmFjb2JpYW47CisgICAgICAgIGlmIChuc2xvdzEgPT0gMTApCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSXRlcmF0aW9uczsKKworICAgICAgICAvKiBjcml0ZXJpb24gZm9yIHJlY2FsY3VsYXRpbmcgamFjb2JpYW4uICovCisgICAgICAgIGlmIChuY2ZhaWwgPT0gMikKKyAgICAgICAgICAgIGJyZWFrOyAvLyBsZWF2ZSBpbm5lciBsb29wIGFuZCBnbyBmb3IgdGhlIG5leHQgb3V0ZXIgbG9vcCBpdGVyYXRpb24KKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJhbmsgb25lIG1vZGlmaWNhdGlvbiB0byB0aGUgamFjb2JpYW4gKi8KKyAgICAgICAgLyogYW5kIHVwZGF0ZSBxdGYgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgICB3YTEgPSBkaWFnLmN3aXNlUHJvZHVjdCggZGlhZy5jd2lzZVByb2R1Y3Qod2ExKS9wbm9ybSApOworICAgICAgICB3YTIgPSBmamFjLnRyYW5zcG9zZSgpICogd2E0OworICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKDFlLTQpKQorICAgICAgICAgICAgcXRmID0gd2EyOworICAgICAgICB3YTIgPSAod2EyLXdhMykvcG5vcm07CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgcXIgZmFjdG9yaXphdGlvbiBvZiB0aGUgdXBkYXRlZCBqYWNvYmlhbi4gKi8KKyAgICAgICAgaW50ZXJuYWw6OnIxdXBkdDxTY2FsYXI+KFIsIHdhMSwgdl9naXZlbnMsIHdfZ2l2ZW5zLCB3YTIsIHdhMywgJnNpbmcpOworICAgICAgICBpbnRlcm5hbDo6cjFtcHlxPFNjYWxhcj4obiwgbiwgZmphYy5kYXRhKCksIHZfZ2l2ZW5zLCB3X2dpdmVucyk7CisgICAgICAgIGludGVybmFsOjpyMW1weXE8U2NhbGFyPigxLCBuLCBxdGYuZGF0YSgpLCB2X2dpdmVucywgd19naXZlbnMpOworCisgICAgICAgIGpldmFsID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UnVubmluZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+Ojpzb2x2ZU51bWVyaWNhbERpZmYoRlZlY3RvclR5cGUgICZ4KQoreworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc3RhdHVzID0gc29sdmVOdW1lcmljYWxEaWZmSW5pdCh4KTsKKyAgICBpZiAoc3RhdHVzPT1IeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgd2hpbGUgKHN0YXR1cz09SHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlJ1bm5pbmcpCisgICAgICAgIHN0YXR1cyA9IHNvbHZlTnVtZXJpY2FsRGlmZk9uZVN0ZXAoeCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorCisvL3ZpbTogYWkgdHM9NCBzdHM9NCBldCBzdz00CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL0xldmVuYmVyZ01hcnF1YXJkdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9MZXZlbmJlcmdNYXJxdWFyZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNiNzljCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9MZXZlbmJlcmdNYXJxdWFyZHQuaApAQCAtMCwwICsxLDY1NyBAQAorLy8gLSotIGNvZGluZzogdXRmLTgKKy8vIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MRVZFTkJFUkdNQVJRVUFSRFRfX0gKKyNkZWZpbmUgRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2UgeworICAgIGVudW0gU3RhdHVzIHsKKyAgICAgICAgTm90U3RhcnRlZCA9IC0yLAorICAgICAgICBSdW5uaW5nID0gLTEsCisgICAgICAgIEltcHJvcGVySW5wdXRQYXJhbWV0ZXJzID0gMCwKKyAgICAgICAgUmVsYXRpdmVSZWR1Y3Rpb25Ub29TbWFsbCA9IDEsCisgICAgICAgIFJlbGF0aXZlRXJyb3JUb29TbWFsbCA9IDIsCisgICAgICAgIFJlbGF0aXZlRXJyb3JBbmRSZWR1Y3Rpb25Ub29TbWFsbCA9IDMsCisgICAgICAgIENvc2ludXNUb29TbWFsbCA9IDQsCisgICAgICAgIFRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb24gPSA1LAorICAgICAgICBGdG9sVG9vU21hbGwgPSA2LAorICAgICAgICBYdG9sVG9vU21hbGwgPSA3LAorICAgICAgICBHdG9sVG9vU21hbGwgPSA4LAorICAgICAgICBVc2VyQXNrZWQgPSA5CisgICAgfTsKK30KKworCisKKy8qKgorICAqIFxpbmdyb3VwIE5vbkxpbmVhck9wdGltaXphdGlvbl9Nb2R1bGUKKyAgKiBcYnJpZWYgUGVyZm9ybXMgbm9uIGxpbmVhciBvcHRpbWl6YXRpb24gb3ZlciBhIG5vbi1saW5lYXIgZnVuY3Rpb24sCisgICogdXNpbmcgYSB2YXJpYW50IG9mIHRoZSBMZXZlbmJlcmcgTWFycXVhcmR0IGFsZ29yaXRobS4KKyAgKgorICAqIENoZWNrIHdpa2lwZWRpYSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldmVuYmVyZyVFMiU4MCU5M01hcnF1YXJkdF9hbGdvcml0aG0KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI9ZG91YmxlPgorY2xhc3MgTGV2ZW5iZXJnTWFycXVhcmR0Cit7CisgICAgc3RhdGljIFNjYWxhciBzcXJ0X2Vwc2lsb24oKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICAgIHJldHVybiBzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworICAgIH0KKyAgICAKK3B1YmxpYzoKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHQoRnVuY3RvclR5cGUgJl9mdW5jdG9yKQorICAgICAgICA6IGZ1bmN0b3IoX2Z1bmN0b3IpIHsgbmZldiA9IG5qZXYgPSBpdGVyID0gMDsgIGZub3JtID0gZ25vcm0gPSAwLjsgdXNlRXh0ZXJuYWxTY2FsaW5nPWZhbHNlOyB9CisKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisgICAgCisgICAgc3RydWN0IFBhcmFtZXRlcnMgeworICAgICAgICBQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgIDogZmFjdG9yKFNjYWxhcigxMDAuKSkKKyAgICAgICAgICAgICwgbWF4ZmV2KDQwMCkKKyAgICAgICAgICAgICwgZnRvbChzcXJ0X2Vwc2lsb24oKSkKKyAgICAgICAgICAgICwgeHRvbChzcXJ0X2Vwc2lsb24oKSkKKyAgICAgICAgICAgICwgZ3RvbChTY2FsYXIoMC4pKQorICAgICAgICAgICAgLCBlcHNmY24oU2NhbGFyKDAuKSkge30KKyAgICAgICAgU2NhbGFyIGZhY3RvcjsKKyAgICAgICAgSW5kZXggbWF4ZmV2OyAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGV2YWx1YXRpb24KKyAgICAgICAgU2NhbGFyIGZ0b2w7CisgICAgICAgIFNjYWxhciB4dG9sOworICAgICAgICBTY2FsYXIgZ3RvbDsKKyAgICAgICAgU2NhbGFyIGVwc2ZjbjsKKyAgICB9OworCisgICAgdHlwZWRlZiBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+IEZWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiBKYWNvYmlhblR5cGU7CisKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGxtZGVyMSgKKyAgICAgICAgICAgIEZWZWN0b3JUeXBlICZ4LAorICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IHNxcnRfZXBzaWxvbigpCisgICAgICAgICAgICApOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZShGVmVjdG9yVHlwZSAmeCk7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZUluaXQoRlZlY3RvclR5cGUgJngpOworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemVPbmVTdGVwKEZWZWN0b3JUeXBlICZ4KTsKKworICAgIHN0YXRpYyBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGxtZGlmMSgKKyAgICAgICAgICAgIEZ1bmN0b3JUeXBlICZmdW5jdG9yLAorICAgICAgICAgICAgRlZlY3RvclR5cGUgJngsCisgICAgICAgICAgICBJbmRleCAqbmZldiwKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0b2wgPSBzcXJ0X2Vwc2lsb24oKQorICAgICAgICAgICAgKTsKKworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbG1zdHIxKAorICAgICAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IHNxcnRfZXBzaWxvbigpCisgICAgICAgICAgICApOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlKEZWZWN0b3JUeXBlICAmeCk7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlSW5pdChGVmVjdG9yVHlwZSAgJngpOworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemVPcHRpbXVtU3RvcmFnZU9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KTsKKworICAgIHZvaWQgcmVzZXRQYXJhbWV0ZXJzKHZvaWQpIHsgcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMoKTsgfQorCisgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgIEZWZWN0b3JUeXBlICBmdmVjLCBxdGYsIGRpYWc7CisgICAgSmFjb2JpYW5UeXBlIGZqYWM7CisgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljPiBwZXJtdXRhdGlvbjsKKyAgICBJbmRleCBuZmV2OworICAgIEluZGV4IG5qZXY7CisgICAgSW5kZXggaXRlcjsKKyAgICBTY2FsYXIgZm5vcm0sIGdub3JtOworICAgIGJvb2wgdXNlRXh0ZXJuYWxTY2FsaW5nOyAKKworICAgIFNjYWxhciBsbV9wYXJhbSh2b2lkKSB7IHJldHVybiBwYXI7IH0KK3ByaXZhdGU6CisgICAgCisgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3I7CisgICAgSW5kZXggbjsKKyAgICBJbmRleCBtOworICAgIEZWZWN0b3JUeXBlIHdhMSwgd2EyLCB3YTMsIHdhNDsKKworICAgIFNjYWxhciBwYXIsIHN1bTsKKyAgICBTY2FsYXIgdGVtcCwgdGVtcDEsIHRlbXAyOworICAgIFNjYWxhciBkZWx0YTsKKyAgICBTY2FsYXIgcmF0aW87CisgICAgU2NhbGFyIHBub3JtLCB4bm9ybSwgZm5vcm0xLCBhY3RyZWQsIGRpcmRlciwgcHJlcmVkOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0JiBvcGVyYXRvcj0oY29uc3QgTGV2ZW5iZXJnTWFycXVhcmR0Jik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46OmxtZGVyMSgKKyAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBuID0geC5zaXplKCk7CisgICAgbSA9IGZ1bmN0b3IudmFsdWVzKCk7CisKKyAgICAvKiBjaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgZXJyb3JzLiAqLworICAgIGlmIChuIDw9IDAgfHwgbSA8IG4gfHwgdG9sIDwgMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICByZXNldFBhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLmZ0b2wgPSB0b2w7CisgICAgcGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIHBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwKihuKzEpOworCisgICAgcmV0dXJuIG1pbmltaXplKHgpOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bWluaW1pemUoRlZlY3RvclR5cGUgICZ4KQoreworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgc3RhdHVzID0gbWluaW1pemVJbml0KHgpOworICAgIGlmIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVycykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IG1pbmltaXplT25lU3RlcCh4KTsKKyAgICB9IHdoaWxlIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46Om1pbmltaXplSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworICAgIG0gPSBmdW5jdG9yLnZhbHVlcygpOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsKKyAgICB3YTQucmVzaXplKG0pOworICAgIGZ2ZWMucmVzaXplKG0pOworICAgIGZqYWMucmVzaXplKG0sIG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBlaWdlbl9hc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSAmJiAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworICAgIHF0Zi5yZXNpemUobik7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgbmZldiA9IDA7CisgICAgbmpldiA9IDA7CisKKyAgICAvKiAgICAgY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IG0gPCBuIHx8IHBhcmFtZXRlcnMuZnRvbCA8IDAuIHx8IHBhcmFtZXRlcnMueHRvbCA8IDAuIHx8IHBhcmFtZXRlcnMuZ3RvbCA8IDAuIHx8IHBhcmFtZXRlcnMubWF4ZmV2IDw9IDAgfHwgcGFyYW1ldGVycy5mYWN0b3IgPD0gMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICBpZiAodXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKGRpYWdbal0gPD0gMC4pCisgICAgICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbmZldiA9IDE7CisgICAgaWYgKCBmdW5jdG9yKHgsIGZ2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgZm5vcm0gPSBmdmVjLnN0YWJsZU5vcm0oKTsKKworICAgIC8qICAgICBpbml0aWFsaXplIGxldmVuYmVyZy1tYXJxdWFyZHQgcGFyYW1ldGVyIGFuZCBpdGVyYXRpb24gY291bnRlci4gKi8KKyAgICBwYXIgPSAwLjsKKyAgICBpdGVyID0gMTsKKworICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6Tm90U3RhcnRlZDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZSxTY2FsYXI+OjptaW5pbWl6ZU9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KQoreworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIHVzaW5nIHN0ZDo6c3FydDsKKworICAgIGVpZ2VuX2Fzc2VydCh4LnNpemUoKT09bik7IC8vIGNoZWNrIHRoZSBjYWxsZXIgaXMgbm90IGNoZWF0aW5nIHVzCisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGphY29iaWFuIG1hdHJpeC4gKi8KKyAgICBJbmRleCBkZl9yZXQgPSBmdW5jdG9yLmRmKHgsIGZqYWMpOworICAgIGlmIChkZl9yZXQ8MCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgaWYgKGRmX3JldD4wKQorICAgICAgICAvLyBudW1lcmljYWwgZGlmZiwgd2UgZXZhbHVhdGVkIHRoZSBmdW5jdGlvbiBkZl9yZXQgdGltZXMKKyAgICAgICAgbmZldiArPSBkZl9yZXQ7CisgICAgZWxzZSBuamV2Kys7CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbi4gKi8KKyAgICB3YTIgPSBmamFjLmNvbHdpc2UoKS5ibHVlTm9ybSgpOworICAgIENvbFBpdkhvdXNlaG9sZGVyUVI8SmFjb2JpYW5UeXBlPiBxcmZhYyhmamFjKTsKKyAgICBmamFjID0gcXJmYWMubWF0cml4UVIoKTsKKyAgICBwZXJtdXRhdGlvbiA9IHFyZmFjLmNvbHNQZXJtdXRhdGlvbigpOworCisgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiBhbmQgaWYgZXh0ZXJuYWwgc2NhbGluZyBpcyBub3QgdXNlZCwgc2NhbGUgYWNjb3JkaW5nICovCisgICAgLyogdG8gdGhlIG5vcm1zIG9mIHRoZSBjb2x1bW5zIG9mIHRoZSBpbml0aWFsIGphY29iaWFuLiAqLworICAgIGlmIChpdGVyID09IDEpIHsKKyAgICAgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgICAgIGRpYWdbal0gPSAod2EyW2pdPT0wLik/IDEuIDogd2EyW2pdOworCisgICAgICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGNhbGN1bGF0ZSB0aGUgbm9ybSBvZiB0aGUgc2NhbGVkIHggKi8KKyAgICAgICAgLyogYW5kIGluaXRpYWxpemUgdGhlIHN0ZXAgYm91bmQgZGVsdGEuICovCisgICAgICAgIHhub3JtID0gZGlhZy5jd2lzZVByb2R1Y3QoeCkuc3RhYmxlTm9ybSgpOworICAgICAgICBkZWx0YSA9IHBhcmFtZXRlcnMuZmFjdG9yICogeG5vcm07CisgICAgICAgIGlmIChkZWx0YSA9PSAwLikKKyAgICAgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3I7CisgICAgfQorCisgICAgLyogZm9ybSAocSB0cmFuc3Bvc2UpKmZ2ZWMgYW5kIHN0b3JlIHRoZSBmaXJzdCBuIGNvbXBvbmVudHMgaW4gKi8KKyAgICAvKiBxdGYuICovCisgICAgd2E0ID0gZnZlYzsKKyAgICB3YTQuYXBwbHlPblRoZUxlZnQocXJmYWMuaG91c2Vob2xkZXJRKCkuYWRqb2ludCgpKTsKKyAgICBxdGYgPSB3YTQuaGVhZChuKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCBncmFkaWVudC4gKi8KKyAgICBnbm9ybSA9IDAuOworICAgIGlmIChmbm9ybSAhPSAwLikKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgIGlmICh3YTJbcGVybXV0YXRpb24uaW5kaWNlcygpW2pdXSAhPSAwLikKKyAgICAgICAgICAgICAgICBnbm9ybSA9IChzdGQ6Om1heCkoZ25vcm0sIGFicyggZmphYy5jb2woaikuaGVhZChqKzEpLmRvdChxdGYuaGVhZChqKzEpL2Zub3JtKSAvIHdhMltwZXJtdXRhdGlvbi5pbmRpY2VzKClbal1dKSk7CisKKyAgICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZSBvZiB0aGUgZ3JhZGllbnQgbm9ybS4gKi8KKyAgICBpZiAoZ25vcm0gPD0gcGFyYW1ldGVycy5ndG9sKQorICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkNvc2ludXNUb29TbWFsbDsKKworICAgIC8qIHJlc2NhbGUgaWYgbmVjZXNzYXJ5LiAqLworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnID0gZGlhZy5jd2lzZU1heCh3YTIpOworCisgICAgZG8geworCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgbGV2ZW5iZXJnLW1hcnF1YXJkdCBwYXJhbWV0ZXIuICovCisgICAgICAgIGludGVybmFsOjpsbXBhcjI8U2NhbGFyPihxcmZhYywgZGlhZywgcXRmLCBkZWx0YSwgcGFyLCB3YTEpOworCisgICAgICAgIC8qIHN0b3JlIHRoZSBkaXJlY3Rpb24gcCBhbmQgeCArIHAuIGNhbGN1bGF0ZSB0aGUgbm9ybSBvZiBwLiAqLworICAgICAgICB3YTEgPSAtd2ExOworICAgICAgICB3YTIgPSB4ICsgd2ExOworICAgICAgICBwbm9ybSA9IGRpYWcuY3dpc2VQcm9kdWN0KHdhMSkuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFkanVzdCB0aGUgaW5pdGlhbCBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAoaXRlciA9PSAxKQorICAgICAgICAgICAgZGVsdGEgPSAoc3RkOjptaW4pKGRlbHRhLHBub3JtKTsKKworICAgICAgICAvKiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgeCArIHAgYW5kIGNhbGN1bGF0ZSBpdHMgbm9ybS4gKi8KKyAgICAgICAgaWYgKCBmdW5jdG9yKHdhMiwgd2E0KSA8IDApCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlVzZXJBc2tlZDsKKyAgICAgICAgKytuZmV2OworICAgICAgICBmbm9ybTEgPSB3YTQuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBhY3R1YWwgcmVkdWN0aW9uLiAqLworICAgICAgICBhY3RyZWQgPSAtMS47CisgICAgICAgIGlmIChTY2FsYXIoLjEpICogZm5vcm0xIDwgZm5vcm0pCisgICAgICAgICAgICBhY3RyZWQgPSAxLiAtIG51bWV4dDo6YWJzMihmbm9ybTEgLyBmbm9ybSk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGVkIHByZWRpY3RlZCByZWR1Y3Rpb24gYW5kICovCisgICAgICAgIC8qIHRoZSBzY2FsZWQgZGlyZWN0aW9uYWwgZGVyaXZhdGl2ZS4gKi8KKyAgICAgICAgd2EzID0gZmphYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIChxcmZhYy5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKndhMSk7CisgICAgICAgIHRlbXAxID0gbnVtZXh0OjphYnMyKHdhMy5zdGFibGVOb3JtKCkgLyBmbm9ybSk7CisgICAgICAgIHRlbXAyID0gbnVtZXh0OjphYnMyKHNxcnQocGFyKSAqIHBub3JtIC8gZm5vcm0pOworICAgICAgICBwcmVyZWQgPSB0ZW1wMSArIHRlbXAyIC8gU2NhbGFyKC41KTsKKyAgICAgICAgZGlyZGVyID0gLSh0ZW1wMSArIHRlbXAyKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSByYXRpbyBvZiB0aGUgYWN0dWFsIHRvIHRoZSBwcmVkaWN0ZWQgKi8KKyAgICAgICAgLyogcmVkdWN0aW9uLiAqLworICAgICAgICByYXRpbyA9IDAuOworICAgICAgICBpZiAocHJlcmVkICE9IDAuKQorICAgICAgICAgICAgcmF0aW8gPSBhY3RyZWQgLyBwcmVyZWQ7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAocmF0aW8gPD0gU2NhbGFyKC4yNSkpIHsKKyAgICAgICAgICAgIGlmIChhY3RyZWQgPj0gMC4pCisgICAgICAgICAgICAgICAgdGVtcCA9IFNjYWxhciguNSk7CisgICAgICAgICAgICBpZiAoYWN0cmVkIDwgMC4pCisgICAgICAgICAgICAgICAgdGVtcCA9IFNjYWxhciguNSkgKiBkaXJkZXIgLyAoZGlyZGVyICsgU2NhbGFyKC41KSAqIGFjdHJlZCk7CisgICAgICAgICAgICBpZiAoU2NhbGFyKC4xKSAqIGZub3JtMSA+PSBmbm9ybSB8fCB0ZW1wIDwgU2NhbGFyKC4xKSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC4xKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGluZyBNSU4gKi8KKyAgICAgICAgICAgIGRlbHRhID0gdGVtcCAqIChzdGQ6Om1pbikoZGVsdGEsIHBub3JtIC8gU2NhbGFyKC4xKSk7CisgICAgICAgICAgICBwYXIgLz0gdGVtcDsKKyAgICAgICAgfSBlbHNlIGlmICghKHBhciAhPSAwLiAmJiByYXRpbyA8IFNjYWxhciguNzUpKSkgeworICAgICAgICAgICAgZGVsdGEgPSBwbm9ybSAvIFNjYWxhciguNSk7CisgICAgICAgICAgICBwYXIgPSBTY2FsYXIoLjUpICogcGFyOworICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdCBmb3Igc3VjY2Vzc2Z1bCBpdGVyYXRpb24uICovCisgICAgICAgIGlmIChyYXRpbyA+PSBTY2FsYXIoMWUtNCkpIHsKKyAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWwgaXRlcmF0aW9uLiB1cGRhdGUgeCwgZnZlYywgYW5kIHRoZWlyIG5vcm1zLiAqLworICAgICAgICAgICAgeCA9IHdhMjsKKyAgICAgICAgICAgIHdhMiA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpOworICAgICAgICAgICAgZnZlYyA9IHdhNDsKKyAgICAgICAgICAgIHhub3JtID0gd2EyLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgICAgIGZub3JtID0gZm5vcm0xOworICAgICAgICAgICAgKytpdGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdHMgZm9yIGNvbnZlcmdlbmNlLiAqLworICAgICAgICBpZiAoYWJzKGFjdHJlZCkgPD0gcGFyYW1ldGVycy5mdG9sICYmIHByZXJlZCA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgU2NhbGFyKC41KSAqIHJhdGlvIDw9IDEuICYmIGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yQW5kUmVkdWN0aW9uVG9vU21hbGw7CisgICAgICAgIGlmIChhYnMoYWN0cmVkKSA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgcHJlcmVkIDw9IHBhcmFtZXRlcnMuZnRvbCAmJiBTY2FsYXIoLjUpICogcmF0aW8gPD0gMS4pCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGw7CisgICAgICAgIGlmIChkZWx0YSA8PSBwYXJhbWV0ZXJzLnh0b2wgKiB4bm9ybSkKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6UmVsYXRpdmVFcnJvclRvb1NtYWxsOworCisgICAgICAgIC8qIHRlc3RzIGZvciB0ZXJtaW5hdGlvbiBhbmQgc3RyaW5nZW50IHRvbGVyYW5jZXMuICovCisgICAgICAgIGlmIChuZmV2ID49IHBhcmFtZXRlcnMubWF4ZmV2KQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpUb29NYW55RnVuY3Rpb25FdmFsdWF0aW9uOworICAgICAgICBpZiAoYWJzKGFjdHJlZCkgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAmJiBwcmVyZWQgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAmJiBTY2FsYXIoLjUpICogcmF0aW8gPD0gMS4pCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkZ0b2xUb29TbWFsbDsKKyAgICAgICAgaWYgKGRlbHRhIDw9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiB4bm9ybSkKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6WHRvbFRvb1NtYWxsOworICAgICAgICBpZiAoZ25vcm0gPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6R3RvbFRvb1NtYWxsOworCisgICAgfSB3aGlsZSAocmF0aW8gPCBTY2FsYXIoMWUtNCkpOworCisgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46Omxtc3RyMSgKKyAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBuID0geC5zaXplKCk7CisgICAgbSA9IGZ1bmN0b3IudmFsdWVzKCk7CisKKyAgICAvKiBjaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgZXJyb3JzLiAqLworICAgIGlmIChuIDw9IDAgfHwgbSA8IG4gfHwgdG9sIDwgMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICByZXNldFBhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLmZ0b2wgPSB0b2w7CisgICAgcGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIHBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwKihuKzEpOworCisgICAgcmV0dXJuIG1pbmltaXplT3B0aW11bVN0b3JhZ2UoeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bWluaW1pemVPcHRpbXVtU3RvcmFnZUluaXQoRlZlY3RvclR5cGUgICZ4KQoreworICAgIG4gPSB4LnNpemUoKTsKKyAgICBtID0gZnVuY3Rvci52YWx1ZXMoKTsKKworICAgIHdhMS5yZXNpemUobik7IHdhMi5yZXNpemUobik7IHdhMy5yZXNpemUobik7CisgICAgd2E0LnJlc2l6ZShtKTsKKyAgICBmdmVjLnJlc2l6ZShtKTsKKyAgICAvLyBPbmx5IFIgaXMgc3RvcmVkIGluIGZqYWMuIFEgaXMgb25seSB1c2VkIHRvIGNvbXB1dGUgJ3F0ZicsIHdoaWNoIGlzCisgICAgLy8gUS50cmFuc3Bvc2UoKSpyaHMuIHF0ZiB3aWxsIGJlIHVwZGF0ZWQgdXNpbmcgZ2l2ZW5zIHJvdGF0aW9uLAorICAgIC8vIGluc3RlYWQgb2Ygc3RvcmluZyB0aGVtIGluIFEuCisgICAgLy8gVGhlIHB1cnBvc2UgaXQgdG8gb25seSB1c2UgYSBueG4gbWF0cml4LCBpbnN0ZWFkIG9mIG14biBoZXJlLCBzbworICAgIC8vIHRoYXQgd2UgY2FuIGhhbmRsZSBjYXNlcyB3aGVyZSBtPj5uIDoKKyAgICBmamFjLnJlc2l6ZShuLCBuKTsKKyAgICBpZiAoIXVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgZGlhZy5yZXNpemUobik7CisgICAgZWlnZW5fYXNzZXJ0KCAoIXVzZUV4dGVybmFsU2NhbGluZyB8fCBkaWFnLnNpemUoKT09bikgJiYgIldoZW4gdXNlRXh0ZXJuYWxTY2FsaW5nIGlzIHNldCwgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSB2YWxpZCAnZGlhZyciKTsKKyAgICBxdGYucmVzaXplKG4pOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIG5mZXYgPSAwOworICAgIG5qZXYgPSAwOworCisgICAgLyogICAgIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCBwYXJhbWV0ZXJzLmZ0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLnh0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLmd0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLm1heGZldiA8PSAwIHx8IHBhcmFtZXRlcnMuZmFjdG9yIDw9IDAuKQorICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworCisgICAgaWYgKHVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgIGlmIChkaWFnW2pdIDw9IDAuKQorICAgICAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICAvKiAgICAgZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBzdGFydGluZyBwb2ludCAqLworICAgIC8qICAgICBhbmQgY2FsY3VsYXRlIGl0cyBub3JtLiAqLworICAgIG5mZXYgPSAxOworICAgIGlmICggZnVuY3Rvcih4LCBmdmVjKSA8IDApCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VXNlckFza2VkOworICAgIGZub3JtID0gZnZlYy5zdGFibGVOb3JtKCk7CisKKyAgICAvKiAgICAgaW5pdGlhbGl6ZSBsZXZlbmJlcmctbWFycXVhcmR0IHBhcmFtZXRlciBhbmQgaXRlcmF0aW9uIGNvdW50ZXIuICovCisgICAgcGFyID0gMC47CisgICAgaXRlciA9IDE7CisKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6Ok5vdFN0YXJ0ZWQ7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZSxTY2FsYXI+OjptaW5pbWl6ZU9wdGltdW1TdG9yYWdlT25lU3RlcChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgIAorICAgIGVpZ2VuX2Fzc2VydCh4LnNpemUoKT09bik7IC8vIGNoZWNrIHRoZSBjYWxsZXIgaXMgbm90IGNoZWF0aW5nIHVzCisKKyAgICBJbmRleCBpLCBqOworICAgIGJvb2wgc2luZzsKKworICAgIC8qIGNvbXB1dGUgdGhlIHFyIGZhY3Rvcml6YXRpb24gb2YgdGhlIGphY29iaWFuIG1hdHJpeCAqLworICAgIC8qIGNhbGN1bGF0ZWQgb25lIHJvdyBhdCBhIHRpbWUsIHdoaWxlIHNpbXVsdGFuZW91c2x5ICovCisgICAgLyogZm9ybWluZyAocSB0cmFuc3Bvc2UpKmZ2ZWMgYW5kIHN0b3JpbmcgdGhlIGZpcnN0ICovCisgICAgLyogbiBjb21wb25lbnRzIGluIHF0Zi4gKi8KKyAgICBxdGYuZmlsbCgwLik7CisgICAgZmphYy5maWxsKDAuKTsKKyAgICBJbmRleCByb3duYiA9IDI7CisgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgeworICAgICAgICBpZiAoZnVuY3Rvci5kZih4LCB3YTMsIHJvd25iKSA8IDApIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VXNlckFza2VkOworICAgICAgICBpbnRlcm5hbDo6cnd1cGR0PFNjYWxhcj4oZmphYywgd2EzLCBxdGYsIGZ2ZWNbaV0pOworICAgICAgICArK3Jvd25iOworICAgIH0KKyAgICArK25qZXY7CisKKyAgICAvKiBpZiB0aGUgamFjb2JpYW4gaXMgcmFuayBkZWZpY2llbnQsIGNhbGwgcXJmYWMgdG8gKi8KKyAgICAvKiByZW9yZGVyIGl0cyBjb2x1bW5zIGFuZCB1cGRhdGUgdGhlIGNvbXBvbmVudHMgb2YgcXRmLiAqLworICAgIHNpbmcgPSBmYWxzZTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGlmIChmamFjKGosaikgPT0gMC4pCisgICAgICAgICAgICBzaW5nID0gdHJ1ZTsKKyAgICAgICAgd2EyW2pdID0gZmphYy5jb2woaikuaGVhZChqKS5zdGFibGVOb3JtKCk7CisgICAgfQorICAgIHBlcm11dGF0aW9uLnNldElkZW50aXR5KG4pOworICAgIGlmIChzaW5nKSB7CisgICAgICAgIHdhMiA9IGZqYWMuY29sd2lzZSgpLmJsdWVOb3JtKCk7CisgICAgICAgIC8vIFRPRE8gV2UgaGF2ZSBubyB1bml0IHRlc3QgY292ZXJpbmcgdGhpcyBjb2RlIHBhdGgsIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgLy8gdW50aWwgaXQgaXMgY2FyZWZ1bGx5IHRlc3RlZAorICAgICAgICBDb2xQaXZIb3VzZWhvbGRlclFSPEphY29iaWFuVHlwZT4gcXJmYWMoZmphYyk7CisgICAgICAgIGZqYWMgPSBxcmZhYy5tYXRyaXhRUigpOworICAgICAgICB3YTEgPSBmamFjLmRpYWdvbmFsKCk7CisgICAgICAgIGZqYWMuZGlhZ29uYWwoKSA9IHFyZmFjLmhDb2VmZnMoKTsKKyAgICAgICAgcGVybXV0YXRpb24gPSBxcmZhYy5jb2xzUGVybXV0YXRpb24oKTsKKyAgICAgICAgLy8gVE9ETyA6IGF2b2lkIHRoaXM6CisgICAgICAgIGZvcihJbmRleCBpaT0wOyBpaTwgZmphYy5jb2xzKCk7IGlpKyspIGZqYWMuY29sKGlpKS5zZWdtZW50KGlpKzEsIGZqYWMucm93cygpLWlpLTEpICo9IGZqYWMoaWksaWkpOyAvLyByZXNjYWxlIHZlY3RvcnMKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBpZiAoZmphYyhqLGopICE9IDAuKSB7CisgICAgICAgICAgICAgICAgc3VtID0gMC47CisgICAgICAgICAgICAgICAgZm9yIChpID0gajsgaSA8IG47ICsraSkKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGZqYWMoaSxqKSAqIHF0ZltpXTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gLXN1bSAvIGZqYWMoaixqKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBqOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgICAgICAgICBxdGZbaV0gKz0gZmphYyhpLGopICogdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZqYWMoaixqKSA9IHdhMVtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIGlmIGV4dGVybmFsIHNjYWxpbmcgaXMgbm90IHVzZWQsIHNjYWxlIGFjY29yZGluZyAqLworICAgIC8qIHRvIHRoZSBub3JtcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgaW5pdGlhbCBqYWNvYmlhbi4gKi8KKyAgICBpZiAoaXRlciA9PSAxKSB7CisgICAgICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgICAgICBkaWFnW2pdID0gKHdhMltqXT09MC4pPyAxLiA6IHdhMltqXTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCB4ICovCisgICAgICAgIC8qIGFuZCBpbml0aWFsaXplIHRoZSBzdGVwIGJvdW5kIGRlbHRhLiAqLworICAgICAgICB4bm9ybSA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvciAqIHhub3JtOworICAgICAgICBpZiAoZGVsdGEgPT0gMC4pCisgICAgICAgICAgICBkZWx0YSA9IHBhcmFtZXRlcnMuZmFjdG9yOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCBncmFkaWVudC4gKi8KKyAgICBnbm9ybSA9IDAuOworICAgIGlmIChmbm9ybSAhPSAwLikKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgIGlmICh3YTJbcGVybXV0YXRpb24uaW5kaWNlcygpW2pdXSAhPSAwLikKKyAgICAgICAgICAgICAgICBnbm9ybSA9IChzdGQ6Om1heCkoZ25vcm0sIGFicyggZmphYy5jb2woaikuaGVhZChqKzEpLmRvdChxdGYuaGVhZChqKzEpL2Zub3JtKSAvIHdhMltwZXJtdXRhdGlvbi5pbmRpY2VzKClbal1dKSk7CisKKyAgICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZSBvZiB0aGUgZ3JhZGllbnQgbm9ybS4gKi8KKyAgICBpZiAoZ25vcm0gPD0gcGFyYW1ldGVycy5ndG9sKQorICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkNvc2ludXNUb29TbWFsbDsKKworICAgIC8qIHJlc2NhbGUgaWYgbmVjZXNzYXJ5LiAqLworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnID0gZGlhZy5jd2lzZU1heCh3YTIpOworCisgICAgZG8geworCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgbGV2ZW5iZXJnLW1hcnF1YXJkdCBwYXJhbWV0ZXIuICovCisgICAgICAgIGludGVybmFsOjpsbXBhcjxTY2FsYXI+KGZqYWMsIHBlcm11dGF0aW9uLmluZGljZXMoKSwgZGlhZywgcXRmLCBkZWx0YSwgcGFyLCB3YTEpOworCisgICAgICAgIC8qIHN0b3JlIHRoZSBkaXJlY3Rpb24gcCBhbmQgeCArIHAuIGNhbGN1bGF0ZSB0aGUgbm9ybSBvZiBwLiAqLworICAgICAgICB3YTEgPSAtd2ExOworICAgICAgICB3YTIgPSB4ICsgd2ExOworICAgICAgICBwbm9ybSA9IGRpYWcuY3dpc2VQcm9kdWN0KHdhMSkuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFkanVzdCB0aGUgaW5pdGlhbCBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAoaXRlciA9PSAxKQorICAgICAgICAgICAgZGVsdGEgPSAoc3RkOjptaW4pKGRlbHRhLHBub3JtKTsKKworICAgICAgICAvKiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgeCArIHAgYW5kIGNhbGN1bGF0ZSBpdHMgbm9ybS4gKi8KKyAgICAgICAgaWYgKCBmdW5jdG9yKHdhMiwgd2E0KSA8IDApCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlVzZXJBc2tlZDsKKyAgICAgICAgKytuZmV2OworICAgICAgICBmbm9ybTEgPSB3YTQuc3RhYmxlTm9ybSgpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBhY3R1YWwgcmVkdWN0aW9uLiAqLworICAgICAgICBhY3RyZWQgPSAtMS47CisgICAgICAgIGlmIChTY2FsYXIoLjEpICogZm5vcm0xIDwgZm5vcm0pCisgICAgICAgICAgICBhY3RyZWQgPSAxLiAtIG51bWV4dDo6YWJzMihmbm9ybTEgLyBmbm9ybSk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGVkIHByZWRpY3RlZCByZWR1Y3Rpb24gYW5kICovCisgICAgICAgIC8qIHRoZSBzY2FsZWQgZGlyZWN0aW9uYWwgZGVyaXZhdGl2ZS4gKi8KKyAgICAgICAgd2EzID0gZmphYy50b3BMZWZ0Q29ybmVyKG4sbikudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiAocGVybXV0YXRpb24uaW52ZXJzZSgpICogd2ExKTsKKyAgICAgICAgdGVtcDEgPSBudW1leHQ6OmFiczIod2EzLnN0YWJsZU5vcm0oKSAvIGZub3JtKTsKKyAgICAgICAgdGVtcDIgPSBudW1leHQ6OmFiczIoc3FydChwYXIpICogcG5vcm0gLyBmbm9ybSk7CisgICAgICAgIHByZXJlZCA9IHRlbXAxICsgdGVtcDIgLyBTY2FsYXIoLjUpOworICAgICAgICBkaXJkZXIgPSAtKHRlbXAxICsgdGVtcDIpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHJhdGlvIG9mIHRoZSBhY3R1YWwgdG8gdGhlIHByZWRpY3RlZCAqLworICAgICAgICAvKiByZWR1Y3Rpb24uICovCisgICAgICAgIHJhdGlvID0gMC47CisgICAgICAgIGlmIChwcmVyZWQgIT0gMC4pCisgICAgICAgICAgICByYXRpbyA9IGFjdHJlZCAvIHByZXJlZDsKKworICAgICAgICAvKiB1cGRhdGUgdGhlIHN0ZXAgYm91bmQuICovCisgICAgICAgIGlmIChyYXRpbyA8PSBTY2FsYXIoLjI1KSkgeworICAgICAgICAgICAgaWYgKGFjdHJlZCA+PSAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIGlmIChhY3RyZWQgPCAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KSAqIGRpcmRlciAvIChkaXJkZXIgKyBTY2FsYXIoLjUpICogYWN0cmVkKTsKKyAgICAgICAgICAgIGlmIChTY2FsYXIoLjEpICogZm5vcm0xID49IGZub3JtIHx8IHRlbXAgPCBTY2FsYXIoLjEpKQorICAgICAgICAgICAgICAgIHRlbXAgPSBTY2FsYXIoLjEpOworICAgICAgICAgICAgLyogQ29tcHV0aW5nIE1JTiAqLworICAgICAgICAgICAgZGVsdGEgPSB0ZW1wICogKHN0ZDo6bWluKShkZWx0YSwgcG5vcm0gLyBTY2FsYXIoLjEpKTsKKyAgICAgICAgICAgIHBhciAvPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgKCEocGFyICE9IDAuICYmIHJhdGlvIDwgU2NhbGFyKC43NSkpKSB7CisgICAgICAgICAgICBkZWx0YSA9IHBub3JtIC8gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIHBhciA9IFNjYWxhciguNSkgKiBwYXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0IGZvciBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKHJhdGlvID49IFNjYWxhcigxZS00KSkgeworICAgICAgICAgICAgLyogc3VjY2Vzc2Z1bCBpdGVyYXRpb24uIHVwZGF0ZSB4LCBmdmVjLCBhbmQgdGhlaXIgbm9ybXMuICovCisgICAgICAgICAgICB4ID0gd2EyOworICAgICAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgICAgICBmdmVjID0gd2E0OworICAgICAgICAgICAgeG5vcm0gPSB3YTIuc3RhYmxlTm9ybSgpOworICAgICAgICAgICAgZm5vcm0gPSBmbm9ybTE7CisgICAgICAgICAgICArK2l0ZXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0cyBmb3IgY29udmVyZ2VuY2UuICovCisgICAgICAgIGlmIChhYnMoYWN0cmVkKSA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgcHJlcmVkIDw9IHBhcmFtZXRlcnMuZnRvbCAmJiBTY2FsYXIoLjUpICogcmF0aW8gPD0gMS4gJiYgZGVsdGEgPD0gcGFyYW1ldGVycy54dG9sICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlRXJyb3JBbmRSZWR1Y3Rpb25Ub29TbWFsbDsKKyAgICAgICAgaWYgKGFicyhhY3RyZWQpIDw9IHBhcmFtZXRlcnMuZnRvbCAmJiBwcmVyZWQgPD0gcGFyYW1ldGVycy5mdG9sICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6UmVsYXRpdmVSZWR1Y3Rpb25Ub29TbWFsbDsKKyAgICAgICAgaWYgKGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yVG9vU21hbGw7CisKKyAgICAgICAgLyogdGVzdHMgZm9yIHRlcm1pbmF0aW9uIGFuZCBzdHJpbmdlbnQgdG9sZXJhbmNlcy4gKi8KKyAgICAgICAgaWYgKG5mZXYgPj0gcGFyYW1ldGVycy5tYXhmZXYpCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb247CisgICAgICAgIGlmIChhYnMoYWN0cmVkKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIHByZXJlZCA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6RnRvbFRvb1NtYWxsOworICAgICAgICBpZiAoZGVsdGEgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpYdG9sVG9vU21hbGw7CisgICAgICAgIGlmIChnbm9ybSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpHdG9sVG9vU21hbGw7CisKKyAgICB9IHdoaWxlIChyYXRpbyA8IFNjYWxhcigxZS00KSk7CisKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bWluaW1pemVPcHRpbXVtU3RvcmFnZShGVmVjdG9yVHlwZSAgJngpCit7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBzdGF0dXMgPSBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlSW5pdCh4KTsKKyAgICBpZiAoc3RhdHVzPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlT25lU3RlcCh4KTsKKyAgICB9IHdoaWxlIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46OmxtZGlmMSgKKyAgICAgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3IsCisgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgSW5kZXggKm5mZXYsCisgICAgICAgIGNvbnN0IFNjYWxhciB0b2wKKyAgICAgICAgKQoreworICAgIEluZGV4IG4gPSB4LnNpemUoKTsKKyAgICBJbmRleCBtID0gZnVuY3Rvci52YWx1ZXMoKTsKKworICAgIC8qIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCB0b2wgPCAwLikKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIE51bWVyaWNhbERpZmY8RnVuY3RvclR5cGU+IG51bURpZmYoZnVuY3Rvcik7CisgICAgLy8gZW1iZWRkZWQgTGV2ZW5iZXJnTWFycXVhcmR0CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0PE51bWVyaWNhbERpZmY8RnVuY3RvclR5cGU+LCBTY2FsYXIgPiBsbShudW1EaWZmKTsKKyAgICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSB0b2w7CisgICAgbG0ucGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIGxtLnBhcmFtZXRlcnMubWF4ZmV2ID0gMjAwKihuKzEpOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBpbmZvID0gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyhsbS5taW5pbWl6ZSh4KSk7CisgICAgaWYgKG5mZXYpCisgICAgICAgICogbmZldiA9IGxtLm5mZXY7CisgICAgcmV0dXJuIGluZm87Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX19ICisKKy8vdmltOiBhaSB0cz00IHN0cz00IGV0IHN3PTQKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vY2hrZGVyLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2Noa2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGZmN2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2Noa2Rlci5oCkBAIC0wLDAgKzEsNjYgQEAKKyNkZWZpbmUgY2hrZGVyX2xvZzEwZSAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1CisjZGVmaW5lIGNoa2Rlcl9mYWN0b3IgMTAwLgorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjaGtkZXIoCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZ4LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZnZlYywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiAmZmphYywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnhwLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZnZlY3AsCisgICAgICAgIGludCBtb2RlLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZXJyCisgICAgICAgICkKK3sKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgdXNpbmcgc3RkOjpsb2c7CisgICAgCisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgICAgY29uc3QgU2NhbGFyIGVwcyA9IHNxcnQoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSk7CisgICAgY29uc3QgU2NhbGFyIGVwc2YgPSBjaGtkZXJfZmFjdG9yICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKyAgICBjb25zdCBTY2FsYXIgZXBzbG9nID0gY2hrZGVyX2xvZzEwZSAqIGxvZyhlcHMpOworICAgIFNjYWxhciB0ZW1wOworCisgICAgY29uc3QgSW5kZXggbSA9IGZ2ZWMuc2l6ZSgpLCBuID0geC5zaXplKCk7CisKKyAgICBpZiAobW9kZSAhPSAyKSB7CisgICAgICAgIC8qIG1vZGUgPSAxLiAqLworICAgICAgICB4cC5yZXNpemUobik7CisgICAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgICAgIHRlbXAgPSBlcHMgKiBhYnMoeFtqXSk7CisgICAgICAgICAgICBpZiAodGVtcCA9PSAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gZXBzOworICAgICAgICAgICAgeHBbal0gPSB4W2pdICsgdGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogbW9kZSA9IDIuICovCisgICAgICAgIGVyci5zZXRaZXJvKG0pOyAKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgdGVtcCA9IGFicyh4W2pdKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDAuKQorICAgICAgICAgICAgICAgIHRlbXAgPSAxLjsKKyAgICAgICAgICAgIGVyciArPSB0ZW1wICogZmphYy5jb2woaik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG07ICsraSkgeworICAgICAgICAgICAgdGVtcCA9IDEuOworICAgICAgICAgICAgaWYgKGZ2ZWNbaV0gIT0gMC4gJiYgZnZlY3BbaV0gIT0gMC4gJiYgYWJzKGZ2ZWNwW2ldIC0gZnZlY1tpXSkgPj0gZXBzZiAqIGFicyhmdmVjW2ldKSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gZXBzICogYWJzKChmdmVjcFtpXSAtIGZ2ZWNbaV0pIC8gZXBzIC0gZXJyW2ldKSAvIChhYnMoZnZlY1tpXSkgKyBhYnMoZnZlY3BbaV0pKTsKKyAgICAgICAgICAgIGVycltpXSA9IDEuOworICAgICAgICAgICAgaWYgKHRlbXAgPiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIHRlbXAgPCBlcHMpCisgICAgICAgICAgICAgICAgZXJyW2ldID0gKGNoa2Rlcl9sb2cxMGUgKiBsb2codGVtcCkgLSBlcHNsb2cpIC8gZXBzbG9nOworICAgICAgICAgICAgaWYgKHRlbXAgPj0gZXBzKQorICAgICAgICAgICAgICAgIGVycltpXSA9IDAuOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2NvdmFyLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2NvdmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNjBkMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vY292YXIuaApAQCAtMCwwICsxLDcwIEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY292YXIoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnIsCisgICAgICAgIGNvbnN0IFZlY3RvclhpICZpcHZ0LAorICAgICAgICBTY2FsYXIgdG9sID0gc3RkOjpzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpICkKK3sKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBJbmRleCBpLCBqLCBrLCBsLCBpaSwgamo7CisgICAgYm9vbCBzaW5nOworICAgIFNjYWxhciB0ZW1wOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGNvbnN0IEluZGV4IG4gPSByLmNvbHMoKTsKKyAgICBjb25zdCBTY2FsYXIgdG9sciA9IHRvbCAqIGFicyhyKDAsMCkpOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gd2Eobik7CisgICAgZWlnZW5fYXNzZXJ0KGlwdnQuc2l6ZSgpPT1uKTsKKworICAgIC8qIGZvcm0gdGhlIGludmVyc2Ugb2YgciBpbiB0aGUgZnVsbCB1cHBlciB0cmlhbmdsZSBvZiByLiAqLworICAgIGwgPSAtMTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKQorICAgICAgICBpZiAoYWJzKHIoayxrKSkgPiB0b2xyKSB7CisgICAgICAgICAgICByKGssaykgPSAxLiAvIHIoayxrKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gay0xOyArK2opIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gcihrLGspICogcihqLGspOworICAgICAgICAgICAgICAgIHIoaixrKSA9IDAuOworICAgICAgICAgICAgICAgIHIuY29sKGspLmhlYWQoaisxKSAtPSByLmNvbChqKS5oZWFkKGorMSkgKiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbCA9IGs7CisgICAgICAgIH0KKworICAgIC8qIGZvcm0gdGhlIGZ1bGwgdXBwZXIgdHJpYW5nbGUgb2YgdGhlIGludmVyc2Ugb2YgKHIgdHJhbnNwb3NlKSpyICovCisgICAgLyogaW4gdGhlIGZ1bGwgdXBwZXIgdHJpYW5nbGUgb2Ygci4gKi8KKyAgICBmb3IgKGsgPSAwOyBrIDw9IGw7ICsraykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGstMTsgKytqKQorICAgICAgICAgICAgci5jb2woaikuaGVhZChqKzEpICs9IHIuY29sKGspLmhlYWQoaisxKSAqIHIoaixrKTsKKyAgICAgICAgci5jb2woaykuaGVhZChrKzEpICo9IHIoayxrKTsKKyAgICB9CisKKyAgICAvKiBmb3JtIHRoZSBmdWxsIGxvd2VyIHRyaWFuZ2xlIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCAqLworICAgIC8qIGluIHRoZSBzdHJpY3QgbG93ZXIgdHJpYW5nbGUgb2YgciBhbmQgaW4gd2EuICovCisgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBqaiA9IGlwdnRbal07CisgICAgICAgIHNpbmcgPSBqID4gbDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBqOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzaW5nKQorICAgICAgICAgICAgICAgIHIoaSxqKSA9IDAuOworICAgICAgICAgICAgaWkgPSBpcHZ0W2ldOworICAgICAgICAgICAgaWYgKGlpID4gamopCisgICAgICAgICAgICAgICAgcihpaSxqaikgPSByKGksaik7CisgICAgICAgICAgICBpZiAoaWkgPCBqaikKKyAgICAgICAgICAgICAgICByKGpqLGlpKSA9IHIoaSxqKTsKKyAgICAgICAgfQorICAgICAgICB3YVtqal0gPSByKGosaik7CisgICAgfQorCisgICAgLyogc3ltbWV0cml6ZSB0aGUgY292YXJpYW5jZSBtYXRyaXggaW4gci4gKi8KKyAgICByLnRvcExlZnRDb3JuZXIobixuKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpID0gci50b3BMZWZ0Q29ybmVyKG4sbikudHJhbnNwb3NlKCk7CisgICAgci5kaWFnb25hbCgpID0gd2E7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vZG9nbGVnLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2RvZ2xlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzVkMjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2RvZ2xlZy5oCkBAIC0wLDAgKzEsMTA3IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgZG9nbGVnKAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+ICAmcXJmYWMsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZkaWFnLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmcXRiLAorICAgICAgICBTY2FsYXIgZGVsdGEsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZ4KQoreworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICAKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBJbmRleCBpLCBqOworICAgIFNjYWxhciBzdW0sIHRlbXAsIGFscGhhLCBibm9ybTsKKyAgICBTY2FsYXIgZ25vcm0sIHFub3JtOworICAgIFNjYWxhciBzZ25vcm07CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgY29uc3QgU2NhbGFyIGVwc21jaCA9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgICAgY29uc3QgSW5kZXggbiA9IHFyZmFjLmNvbHMoKTsKKyAgICBlaWdlbl9hc3NlcnQobj09cXRiLnNpemUoKSk7CisgICAgZWlnZW5fYXNzZXJ0KG49PXguc2l6ZSgpKTsKKyAgICBlaWdlbl9hc3NlcnQobj09ZGlhZy5zaXplKCkpOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhMShuKSwgd2EyKG4pOworCisgICAgLyogZmlyc3QsIGNhbGN1bGF0ZSB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbi4gKi8KKyAgICBmb3IgKGogPSBuLTE7IGogPj0wOyAtLWopIHsKKyAgICAgICAgdGVtcCA9IHFyZmFjKGosaik7CisgICAgICAgIGlmICh0ZW1wID09IDAuKSB7CisgICAgICAgICAgICB0ZW1wID0gZXBzbWNoICogcXJmYWMuY29sKGopLmhlYWQoaisxKS5tYXhDb2VmZigpOworICAgICAgICAgICAgaWYgKHRlbXAgPT0gMC4pCisgICAgICAgICAgICAgICAgdGVtcCA9IGVwc21jaDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaj09bi0xKQorICAgICAgICAgICAgeFtqXSA9IHF0YltqXSAvIHRlbXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHhbal0gPSAocXRiW2pdIC0gcXJmYWMucm93KGopLnRhaWwobi1qLTEpLmRvdCh4LnRhaWwobi1qLTEpKSkgLyB0ZW1wOworICAgIH0KKworICAgIC8qIHRlc3Qgd2hldGhlciB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbiBpcyBhY2NlcHRhYmxlLiAqLworICAgIHFub3JtID0gZGlhZy5jd2lzZVByb2R1Y3QoeCkuc3RhYmxlTm9ybSgpOworICAgIGlmIChxbm9ybSA8PSBkZWx0YSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETyA6IHRoaXMgcGF0aCBpcyBub3QgdGVzdGVkIGJ5IEVpZ2VuIHVuaXQgdGVzdHMKKworICAgIC8qIHRoZSBnYXVzcy1uZXd0b24gZGlyZWN0aW9uIGlzIG5vdCBhY2NlcHRhYmxlLiAqLworICAgIC8qIG5leHQsIGNhbGN1bGF0ZSB0aGUgc2NhbGVkIGdyYWRpZW50IGRpcmVjdGlvbi4gKi8KKworICAgIHdhMS5maWxsKDAuKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIHdhMS50YWlsKG4taikgKz0gcXJmYWMucm93KGopLnRhaWwobi1qKSAqIHF0YltqXTsKKyAgICAgICAgd2ExW2pdIC89IGRpYWdbal07CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgZ3JhZGllbnQgYW5kIHRlc3QgZm9yICovCisgICAgLyogdGhlIHNwZWNpYWwgY2FzZSBpbiB3aGljaCB0aGUgc2NhbGVkIGdyYWRpZW50IGlzIHplcm8uICovCisgICAgZ25vcm0gPSB3YTEuc3RhYmxlTm9ybSgpOworICAgIHNnbm9ybSA9IDAuOworICAgIGFscGhhID0gZGVsdGEgLyBxbm9ybTsKKyAgICBpZiAoZ25vcm0gPT0gMC4pCisgICAgICAgIGdvdG8gYWxnb19lbmQ7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIHBvaW50IGFsb25nIHRoZSBzY2FsZWQgZ3JhZGllbnQgKi8KKyAgICAvKiBhdCB3aGljaCB0aGUgcXVhZHJhdGljIGlzIG1pbmltaXplZC4gKi8KKyAgICB3YTEuYXJyYXkoKSAvPSAoZGlhZypnbm9ybSkuYXJyYXkoKTsKKyAgICAvLyBUT0RPIDogb25jZSB1bml0IHRlc3RzIGNvdmVyIHRoaXMgcGFydCw6CisgICAgLy8gd2EyID0gcXJmYWMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiB3YTE7CisgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBzdW0gPSAwLjsKKyAgICAgICAgZm9yIChpID0gajsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgc3VtICs9IHFyZmFjKGosaSkgKiB3YTFbaV07CisgICAgICAgIH0KKyAgICAgICAgd2EyW2pdID0gc3VtOworICAgIH0KKyAgICB0ZW1wID0gd2EyLnN0YWJsZU5vcm0oKTsKKyAgICBzZ25vcm0gPSBnbm9ybSAvIHRlbXAgLyB0ZW1wOworCisgICAgLyogdGVzdCB3aGV0aGVyIHRoZSBzY2FsZWQgZ3JhZGllbnQgZGlyZWN0aW9uIGlzIGFjY2VwdGFibGUuICovCisgICAgYWxwaGEgPSAwLjsKKyAgICBpZiAoc2dub3JtID49IGRlbHRhKQorICAgICAgICBnb3RvIGFsZ29fZW5kOworCisgICAgLyogdGhlIHNjYWxlZCBncmFkaWVudCBkaXJlY3Rpb24gaXMgbm90IGFjY2VwdGFibGUuICovCisgICAgLyogZmluYWxseSwgY2FsY3VsYXRlIHRoZSBwb2ludCBhbG9uZyB0aGUgZG9nbGVnICovCisgICAgLyogYXQgd2hpY2ggdGhlIHF1YWRyYXRpYyBpcyBtaW5pbWl6ZWQuICovCisgICAgYm5vcm0gPSBxdGIuc3RhYmxlTm9ybSgpOworICAgIHRlbXAgPSBibm9ybSAvIGdub3JtICogKGJub3JtIC8gcW5vcm0pICogKHNnbm9ybSAvIGRlbHRhKTsKKyAgICB0ZW1wID0gdGVtcCAtIGRlbHRhIC8gcW5vcm0gKiBudW1leHQ6OmFiczIoc2dub3JtIC8gZGVsdGEpICsgc3FydChudW1leHQ6OmFiczIodGVtcCAtIGRlbHRhIC8gcW5vcm0pICsgKDEuLW51bWV4dDo6YWJzMihkZWx0YSAvIHFub3JtKSkgKiAoMS4tbnVtZXh0OjphYnMyKHNnbm9ybSAvIGRlbHRhKSkpOworICAgIGFscGhhID0gZGVsdGEgLyBxbm9ybSAqICgxLiAtIG51bWV4dDo6YWJzMihzZ25vcm0gLyBkZWx0YSkpIC8gdGVtcDsKK2FsZ29fZW5kOgorCisgICAgLyogZm9ybSBhcHByb3ByaWF0ZSBjb252ZXggY29tYmluYXRpb24gb2YgdGhlIGdhdXNzLW5ld3RvbiAqLworICAgIC8qIGRpcmVjdGlvbiBhbmQgdGhlIHNjYWxlZCBncmFkaWVudCBkaXJlY3Rpb24uICovCisgICAgdGVtcCA9ICgxLi1hbHBoYSkgKiAoc3RkOjptaW4pKHNnbm9ybSxkZWx0YSk7CisgICAgeCA9IHRlbXAgKiB3YTEgKyBhbHBoYSAqIHg7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vZmRqYWMxLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2ZkamFjMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2NmMjYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2ZkamFjMS5oCkBAIC0wLDAgKzEsNzkgQEAKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorRGVuc2VJbmRleCBmZGphYzEoCisgICAgICAgIGNvbnN0IEZ1bmN0b3JUeXBlICZGdW5jdG9yLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmeCwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJmZ2ZWMsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJmZqYWMsCisgICAgICAgIERlbnNlSW5kZXggbWwsIERlbnNlSW5kZXggbXUsCisgICAgICAgIFNjYWxhciBlcHNmY24pCit7CisgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIAorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIFNjYWxhciBoOworICAgIEluZGV4IGosIGs7CisgICAgU2NhbGFyIGVwcywgdGVtcDsKKyAgICBJbmRleCBtc3VtOworICAgIGludCBpZmxhZzsKKyAgICBJbmRleCBzdGFydCwgbGVuZ3RoOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGNvbnN0IFNjYWxhciBlcHNtY2ggPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICAgIGNvbnN0IEluZGV4IG4gPSB4LnNpemUoKTsKKyAgICBlaWdlbl9hc3NlcnQoZnZlYy5zaXplKCk9PW4pOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhMShuKTsKKyAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICB3YTIobik7CisKKyAgICBlcHMgPSBzcXJ0KChzdGQ6Om1heCkoZXBzZmNuLGVwc21jaCkpOworICAgIG1zdW0gPSBtbCArIG11ICsgMTsKKyAgICBpZiAobXN1bSA+PSBuKSB7CisgICAgICAgIC8qIGNvbXB1dGF0aW9uIG9mIGRlbnNlIGFwcHJveGltYXRlIGphY29iaWFuLiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0geFtqXTsKKyAgICAgICAgICAgIGggPSBlcHMgKiBhYnModGVtcCk7CisgICAgICAgICAgICBpZiAoaCA9PSAwLikKKyAgICAgICAgICAgICAgICBoID0gZXBzOworICAgICAgICAgICAgeFtqXSA9IHRlbXAgKyBoOworICAgICAgICAgICAgaWZsYWcgPSBGdW5jdG9yKHgsIHdhMSk7CisgICAgICAgICAgICBpZiAoaWZsYWcgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBpZmxhZzsKKyAgICAgICAgICAgIHhbal0gPSB0ZW1wOworICAgICAgICAgICAgZmphYy5jb2woaikgPSAod2ExLWZ2ZWMpL2g7CisgICAgICAgIH0KKworICAgIH1lbHNlIHsKKyAgICAgICAgLyogY29tcHV0YXRpb24gb2YgYmFuZGVkIGFwcHJveGltYXRlIGphY29iaWFuLiAqLworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbXN1bTsgKytrKSB7CisgICAgICAgICAgICBmb3IgKGogPSBrOyAobXN1bTwwKSA/IChqPm4pOiAoajxuKTsgaiArPSBtc3VtKSB7CisgICAgICAgICAgICAgICAgd2EyW2pdID0geFtqXTsKKyAgICAgICAgICAgICAgICBoID0gZXBzICogYWJzKHdhMltqXSk7CisgICAgICAgICAgICAgICAgaWYgKGggPT0gMC4pIGggPSBlcHM7CisgICAgICAgICAgICAgICAgeFtqXSA9IHdhMltqXSArIGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZmxhZyA9IEZ1bmN0b3IoeCwgd2ExKTsKKyAgICAgICAgICAgIGlmIChpZmxhZyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGlmbGFnOworICAgICAgICAgICAgZm9yIChqID0gazsgKG1zdW08MCkgPyAoaj5uKTogKGo8bik7IGogKz0gbXN1bSkgeworICAgICAgICAgICAgICAgIHhbal0gPSB3YTJbal07CisgICAgICAgICAgICAgICAgaCA9IGVwcyAqIGFicyh3YTJbal0pOworICAgICAgICAgICAgICAgIGlmIChoID09IDAuKSBoID0gZXBzOworICAgICAgICAgICAgICAgIGZqYWMuY29sKGopLnNldFplcm8oKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHN0ZDo6bWF4PEluZGV4PigwLGotbXUpOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IChzdGQ6Om1pbikobi0xLCBqK21sKSAtIHN0YXJ0ICsgMTsKKyAgICAgICAgICAgICAgICBmamFjLmNvbChqKS5zZWdtZW50KHN0YXJ0LCBsZW5ndGgpID0gKCB3YTEuc2VnbWVudChzdGFydCwgbGVuZ3RoKS1mdmVjLnNlZ21lbnQoc3RhcnQsIGxlbmd0aCkpL2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vbG1wYXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vbG1wYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE3ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9sbXBhci5oCkBAIC0wLDAgKzEsMjk4IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgbG1wYXIoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnIsCisgICAgICAgIGNvbnN0IFZlY3RvclhpICZpcHZ0LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZGlhZywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnF0YiwKKyAgICAgICAgU2NhbGFyIGRlbHRhLAorICAgICAgICBTY2FsYXIgJnBhciwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJngpCit7CisgICAgdXNpbmcgc3RkOjphYnM7CisgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGosIGw7CisgICAgU2NhbGFyIGZwOworICAgIFNjYWxhciBwYXJjLCBwYXJsOworICAgIEluZGV4IGl0ZXI7CisgICAgU2NhbGFyIHRlbXAsIHBhcnU7CisgICAgU2NhbGFyIGdub3JtOworICAgIFNjYWxhciBkeG5vcm07CisKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjb25zdCBTY2FsYXIgZHdhcmYgPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CisgICAgY29uc3QgSW5kZXggbiA9IHIuY29scygpOworICAgIGVpZ2VuX2Fzc2VydChuPT1kaWFnLnNpemUoKSk7CisgICAgZWlnZW5fYXNzZXJ0KG49PXF0Yi5zaXplKCkpOworICAgIGVpZ2VuX2Fzc2VydChuPT14LnNpemUoKSk7CisKKyAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICB3YTEsIHdhMjsKKworICAgIC8qIGNvbXB1dGUgYW5kIHN0b3JlIGluIHggdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24uIGlmIHRoZSAqLworICAgIC8qIGphY29iaWFuIGlzIHJhbmstZGVmaWNpZW50LCBvYnRhaW4gYSBsZWFzdCBzcXVhcmVzIHNvbHV0aW9uLiAqLworICAgIEluZGV4IG5zaW5nID0gbi0xOworICAgIHdhMSA9IHF0YjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGlmIChyKGosaikgPT0gMC4gJiYgbnNpbmcgPT0gbi0xKQorICAgICAgICAgICAgbnNpbmcgPSBqIC0gMTsKKyAgICAgICAgaWYgKG5zaW5nIDwgbi0xKQorICAgICAgICAgICAgd2ExW2pdID0gMC47CisgICAgfQorICAgIGZvciAoaiA9IG5zaW5nOyBqPj0wOyAtLWopIHsKKyAgICAgICAgd2ExW2pdIC89IHIoaixqKTsKKyAgICAgICAgdGVtcCA9IHdhMVtqXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGogOyArK2kpCisgICAgICAgICAgICB3YTFbaV0gLT0gcihpLGopICogdGVtcDsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB4W2lwdnRbal1dID0gd2ExW2pdOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuICovCisgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBvcmlnaW4sIGFuZCB0ZXN0ICovCisgICAgLyogZm9yIGFjY2VwdGFuY2Ugb2YgdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24uICovCisgICAgaXRlciA9IDA7CisgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgZHhub3JtID0gd2EyLmJsdWVOb3JtKCk7CisgICAgZnAgPSBkeG5vcm0gLSBkZWx0YTsKKyAgICBpZiAoZnAgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSkgeworICAgICAgICBwYXIgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogaWYgdGhlIGphY29iaWFuIGlzIG5vdCByYW5rIGRlZmljaWVudCwgdGhlIG5ld3RvbiAqLworICAgIC8qIHN0ZXAgcHJvdmlkZXMgYSBsb3dlciBib3VuZCwgcGFybCwgZm9yIHRoZSB6ZXJvIG9mICovCisgICAgLyogdGhlIGZ1bmN0aW9uLiBvdGhlcndpc2Ugc2V0IHRoaXMgYm91bmQgdG8gemVyby4gKi8KKyAgICBwYXJsID0gMC47CisgICAgaWYgKG5zaW5nID49IG4tMSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBsID0gaXB2dFtqXTsKKyAgICAgICAgICAgIHdhMVtqXSA9IGRpYWdbbF0gKiAod2EyW2xdIC8gZHhub3JtKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IGEgdHJpYW5ndWxhclZpZXcuc29sdmVJbnBsYWNlKCksIHRob3VnaCBpbiBhIHdlaXJkCisgICAgICAgIC8vIHdheToKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgU2NhbGFyIHN1bSA9IDAuOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkKKyAgICAgICAgICAgICAgICBzdW0gKz0gcihpLGopICogd2ExW2ldOworICAgICAgICAgICAgd2ExW2pdID0gKHdhMVtqXSAtIHN1bSkgLyByKGosaik7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJsID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBhbiB1cHBlciBib3VuZCwgcGFydSwgZm9yIHRoZSB6ZXJvIG9mIHRoZSBmdW5jdGlvbi4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB3YTFbal0gPSByLmNvbChqKS5oZWFkKGorMSkuZG90KHF0Yi5oZWFkKGorMSkpIC8gZGlhZ1tpcHZ0W2pdXTsKKworICAgIGdub3JtID0gd2ExLnN0YWJsZU5vcm0oKTsKKyAgICBwYXJ1ID0gZ25vcm0gLyBkZWx0YTsKKyAgICBpZiAocGFydSA9PSAwLikKKyAgICAgICAgcGFydSA9IGR3YXJmIC8gKHN0ZDo6bWluKShkZWx0YSxTY2FsYXIoMC4xKSk7CisKKyAgICAvKiBpZiB0aGUgaW5wdXQgcGFyIGxpZXMgb3V0c2lkZSBvZiB0aGUgaW50ZXJ2YWwgKHBhcmwscGFydSksICovCisgICAgLyogc2V0IHBhciB0byB0aGUgY2xvc2VyIGVuZHBvaW50LiAqLworICAgIHBhciA9IChzdGQ6Om1heCkocGFyLHBhcmwpOworICAgIHBhciA9IChzdGQ6Om1pbikocGFyLHBhcnUpOworICAgIGlmIChwYXIgPT0gMC4pCisgICAgICAgIHBhciA9IGdub3JtIC8gZHhub3JtOworCisgICAgLyogYmVnaW5uaW5nIG9mIGFuIGl0ZXJhdGlvbi4gKi8KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICArK2l0ZXI7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHBhci4gKi8KKyAgICAgICAgaWYgKHBhciA9PSAwLikKKyAgICAgICAgICAgIHBhciA9IChzdGQ6Om1heCkoZHdhcmYsU2NhbGFyKC4wMDEpICogcGFydSk7IC8qIENvbXB1dGluZyBNQVggKi8KKyAgICAgICAgd2ExID0gc3FydChwYXIpKiBkaWFnOworCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gc2RpYWcobik7CisgICAgICAgIHFyc29sdjxTY2FsYXI+KHIsIGlwdnQsIHdhMSwgcXRiLCB4LCBzZGlhZyk7CisKKyAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgICAgICB0ZW1wID0gZnA7CisgICAgICAgIGZwID0gZHhub3JtIC0gZGVsdGE7CisKKyAgICAgICAgLyogaWYgdGhlIGZ1bmN0aW9uIGlzIHNtYWxsIGVub3VnaCwgYWNjZXB0IHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgICAgIC8qIG9mIHBhci4gYWxzbyB0ZXN0IGZvciB0aGUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgcGFybCAqLworICAgICAgICAvKiBpcyB6ZXJvIG9yIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBoYXMgcmVhY2hlZCAxMC4gKi8KKyAgICAgICAgaWYgKGFicyhmcCkgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSB8fCAocGFybCA9PSAwLiAmJiBmcCA8PSB0ZW1wICYmIHRlbXAgPCAwLikgfHwgaXRlciA9PSAxMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ld3RvbiBjb3JyZWN0aW9uLiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBsID0gaXB2dFtqXTsKKyAgICAgICAgICAgIHdhMVtqXSA9IGRpYWdbbF0gKiAod2EyW2xdIC8gZHhub3JtKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICB3YTFbal0gLz0gc2RpYWdbal07CisgICAgICAgICAgICB0ZW1wID0gd2ExW2pdOworICAgICAgICAgICAgZm9yIChpID0gaisxOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgICAgIHdhMVtpXSAtPSByKGksaikgKiB0ZW1wOworICAgICAgICB9CisgICAgICAgIHRlbXAgPSB3YTEuYmx1ZU5vcm0oKTsKKyAgICAgICAgcGFyYyA9IGZwIC8gZGVsdGEgLyB0ZW1wIC8gdGVtcDsKKworICAgICAgICAvKiBkZXBlbmRpbmcgb24gdGhlIHNpZ24gb2YgdGhlIGZ1bmN0aW9uLCB1cGRhdGUgcGFybCBvciBwYXJ1LiAqLworICAgICAgICBpZiAoZnAgPiAwLikKKyAgICAgICAgICAgIHBhcmwgPSAoc3RkOjptYXgpKHBhcmwscGFyKTsKKyAgICAgICAgaWYgKGZwIDwgMC4pCisgICAgICAgICAgICBwYXJ1ID0gKHN0ZDo6bWluKShwYXJ1LHBhcik7CisKKyAgICAgICAgLyogY29tcHV0ZSBhbiBpbXByb3ZlZCBlc3RpbWF0ZSBmb3IgcGFyLiAqLworICAgICAgICAvKiBDb21wdXRpbmcgTUFYICovCisgICAgICAgIHBhciA9IChzdGQ6Om1heCkocGFybCxwYXIrcGFyYyk7CisKKyAgICAgICAgLyogZW5kIG9mIGFuIGl0ZXJhdGlvbi4gKi8KKyAgICB9CisKKyAgICAvKiB0ZXJtaW5hdGlvbi4gKi8KKyAgICBpZiAoaXRlciA9PSAwKQorICAgICAgICBwYXIgPSAwLjsKKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGxtcGFyMigKKyAgICAgICAgY29uc3QgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gPiAmcXIsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZkaWFnLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmcXRiLAorICAgICAgICBTY2FsYXIgZGVsdGEsCisgICAgICAgIFNjYWxhciAmcGFyLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmeCkKKworeworICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICB1c2luZyBzdGQ6OmFiczsKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBJbmRleCBqOworICAgIFNjYWxhciBmcDsKKyAgICBTY2FsYXIgcGFyYywgcGFybDsKKyAgICBJbmRleCBpdGVyOworICAgIFNjYWxhciB0ZW1wLCBwYXJ1OworICAgIFNjYWxhciBnbm9ybTsKKyAgICBTY2FsYXIgZHhub3JtOworCisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgY29uc3QgU2NhbGFyIGR3YXJmID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKSgpOworICAgIGNvbnN0IEluZGV4IG4gPSBxci5tYXRyaXhRUigpLmNvbHMoKTsKKyAgICBlaWdlbl9hc3NlcnQobj09ZGlhZy5zaXplKCkpOworICAgIGVpZ2VuX2Fzc2VydChuPT1xdGIuc2l6ZSgpKTsKKworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhMSwgd2EyOworCisgICAgLyogY29tcHV0ZSBhbmQgc3RvcmUgaW4geCB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbi4gaWYgdGhlICovCisgICAgLyogamFjb2JpYW4gaXMgcmFuay1kZWZpY2llbnQsIG9idGFpbiBhIGxlYXN0IHNxdWFyZXMgc29sdXRpb24uICovCisKKy8vICAgIGNvbnN0IEluZGV4IHJhbmsgPSBxci5ub256ZXJvUGl2b3RzKCk7IC8vIGV4YWN0bHkgZG91YmxlKDAuKQorICAgIGNvbnN0IEluZGV4IHJhbmsgPSBxci5yYW5rKCk7IC8vIHVzZSBhIHRocmVzaG9sZAorICAgIHdhMSA9IHF0YjsKKyAgICB3YTEudGFpbChuLXJhbmspLnNldFplcm8oKTsKKyAgICBxci5tYXRyaXhRUigpLnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKHdhMS5oZWFkKHJhbmspKTsKKworICAgIHggPSBxci5jb2xzUGVybXV0YXRpb24oKSp3YTE7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBpdGVyYXRpb24gY291bnRlci4gKi8KKyAgICAvKiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIG9yaWdpbiwgYW5kIHRlc3QgKi8KKyAgICAvKiBmb3IgYWNjZXB0YW5jZSBvZiB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbi4gKi8KKyAgICBpdGVyID0gMDsKKyAgICB3YTIgPSBkaWFnLmN3aXNlUHJvZHVjdCh4KTsKKyAgICBkeG5vcm0gPSB3YTIuYmx1ZU5vcm0oKTsKKyAgICBmcCA9IGR4bm9ybSAtIGRlbHRhOworICAgIGlmIChmcCA8PSBTY2FsYXIoMC4xKSAqIGRlbHRhKSB7CisgICAgICAgIHBhciA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgamFjb2JpYW4gaXMgbm90IHJhbmsgZGVmaWNpZW50LCB0aGUgbmV3dG9uICovCisgICAgLyogc3RlcCBwcm92aWRlcyBhIGxvd2VyIGJvdW5kLCBwYXJsLCBmb3IgdGhlIHplcm8gb2YgKi8KKyAgICAvKiB0aGUgZnVuY3Rpb24uIG90aGVyd2lzZSBzZXQgdGhpcyBib3VuZCB0byB6ZXJvLiAqLworICAgIHBhcmwgPSAwLjsKKyAgICBpZiAocmFuaz09bikgeworICAgICAgICB3YTEgPSBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKiAgZGlhZy5jd2lzZVByb2R1Y3Qod2EyKS9keG5vcm07CisgICAgICAgIHFyLm1hdHJpeFFSKCkudG9wTGVmdENvcm5lcihuLCBuKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2Uod2ExKTsKKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJsID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBhbiB1cHBlciBib3VuZCwgcGFydSwgZm9yIHRoZSB6ZXJvIG9mIHRoZSBmdW5jdGlvbi4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB3YTFbal0gPSBxci5tYXRyaXhRUigpLmNvbChqKS5oZWFkKGorMSkuZG90KHF0Yi5oZWFkKGorMSkpIC8gZGlhZ1txci5jb2xzUGVybXV0YXRpb24oKS5pbmRpY2VzKCkoaildOworCisgICAgZ25vcm0gPSB3YTEuc3RhYmxlTm9ybSgpOworICAgIHBhcnUgPSBnbm9ybSAvIGRlbHRhOworICAgIGlmIChwYXJ1ID09IDAuKQorICAgICAgICBwYXJ1ID0gZHdhcmYgLyAoc3RkOjptaW4pKGRlbHRhLFNjYWxhcigwLjEpKTsKKworICAgIC8qIGlmIHRoZSBpbnB1dCBwYXIgbGllcyBvdXRzaWRlIG9mIHRoZSBpbnRlcnZhbCAocGFybCxwYXJ1KSwgKi8KKyAgICAvKiBzZXQgcGFyIHRvIHRoZSBjbG9zZXIgZW5kcG9pbnQuICovCisgICAgcGFyID0gKHN0ZDo6bWF4KShwYXIscGFybCk7CisgICAgcGFyID0gKHN0ZDo6bWluKShwYXIscGFydSk7CisgICAgaWYgKHBhciA9PSAwLikKKyAgICAgICAgcGFyID0gZ25vcm0gLyBkeG5vcm07CisKKyAgICAvKiBiZWdpbm5pbmcgb2YgYW4gaXRlcmF0aW9uLiAqLworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gcyA9IHFyLm1hdHJpeFFSKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgKytpdGVyOworCisgICAgICAgIC8qIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBwYXIuICovCisgICAgICAgIGlmIChwYXIgPT0gMC4pCisgICAgICAgICAgICBwYXIgPSAoc3RkOjptYXgpKGR3YXJmLFNjYWxhciguMDAxKSAqIHBhcnUpOyAvKiBDb21wdXRpbmcgTUFYICovCisgICAgICAgIHdhMSA9IHNxcnQocGFyKSogZGlhZzsKKworICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+IHNkaWFnKG4pOworICAgICAgICBxcnNvbHY8U2NhbGFyPihzLCBxci5jb2xzUGVybXV0YXRpb24oKS5pbmRpY2VzKCksIHdhMSwgcXRiLCB4LCBzZGlhZyk7CisKKyAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgICAgICB0ZW1wID0gZnA7CisgICAgICAgIGZwID0gZHhub3JtIC0gZGVsdGE7CisKKyAgICAgICAgLyogaWYgdGhlIGZ1bmN0aW9uIGlzIHNtYWxsIGVub3VnaCwgYWNjZXB0IHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgICAgIC8qIG9mIHBhci4gYWxzbyB0ZXN0IGZvciB0aGUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgcGFybCAqLworICAgICAgICAvKiBpcyB6ZXJvIG9yIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBoYXMgcmVhY2hlZCAxMC4gKi8KKyAgICAgICAgaWYgKGFicyhmcCkgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSB8fCAocGFybCA9PSAwLiAmJiBmcCA8PSB0ZW1wICYmIHRlbXAgPCAwLikgfHwgaXRlciA9PSAxMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ld3RvbiBjb3JyZWN0aW9uLiAqLworICAgICAgICB3YTEgPSBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKiBkaWFnLmN3aXNlUHJvZHVjdCh3YTIvZHhub3JtKTsKKyAgICAgICAgLy8gd2UgY291bGQgYWxtb3N0IHVzZSB0aGlzIGhlcmUsIGJ1dCB0aGUgZGlhZ29uYWwgaXMgb3V0c2lkZSBxciwgaW4gc2RpYWdbXQorICAgICAgICAvLyBxci5tYXRyaXhRUigpLnRvcExlZnRDb3JuZXIobiwgbikudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmVJblBsYWNlKHdhMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgICAgIHdhMVtqXSAvPSBzZGlhZ1tqXTsKKyAgICAgICAgICAgIHRlbXAgPSB3YTFbal07CisgICAgICAgICAgICBmb3IgKEluZGV4IGkgPSBqKzE7IGkgPCBuOyArK2kpCisgICAgICAgICAgICAgICAgd2ExW2ldIC09IHMoaSxqKSAqIHRlbXA7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJjID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworCisgICAgICAgIC8qIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiB0aGUgZnVuY3Rpb24sIHVwZGF0ZSBwYXJsIG9yIHBhcnUuICovCisgICAgICAgIGlmIChmcCA+IDAuKQorICAgICAgICAgICAgcGFybCA9IChzdGQ6Om1heCkocGFybCxwYXIpOworICAgICAgICBpZiAoZnAgPCAwLikKKyAgICAgICAgICAgIHBhcnUgPSAoc3RkOjptaW4pKHBhcnUscGFyKTsKKworICAgICAgICAvKiBjb21wdXRlIGFuIGltcHJvdmVkIGVzdGltYXRlIGZvciBwYXIuICovCisgICAgICAgIHBhciA9IChzdGQ6Om1heCkocGFybCxwYXIrcGFyYyk7CisgICAgfQorICAgIGlmIChpdGVyID09IDApCisgICAgICAgIHBhciA9IDAuOworICAgIHJldHVybjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9xcnNvbHYuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcXJzb2x2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhZmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcXJzb2x2LmgKQEAgLTAsMCArMSw5MSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE8gOiBvbmNlIHFyc29sdjIgaXMgcmVtb3ZlZCwgdXNlIENvbFBpdkhvdXNlaG9sZGVyUVIgb3IgUGVybXV0YXRpb25NYXRyaXggaW5zdGVhZCBvZiBpcHZ0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBxcnNvbHYoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnMsCisgICAgICAgIC8vIFRPRE8gOiB1c2UgYSBQZXJtdXRhdGlvbk1hdHJpeCBvbmNlIGxtcGFyIGlzIG5vIG1vcmU6CisgICAgICAgIGNvbnN0IFZlY3RvclhpICZpcHZ0LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZGlhZywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnF0YiwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJngsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZzZGlhZykKKworeworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGosIGssIGw7CisgICAgU2NhbGFyIHRlbXA7CisgICAgSW5kZXggbiA9IHMuY29scygpOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhKG4pOworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gZ2l2ZW5zOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIC8vIHRoZSBmb2xsb3dpbmcgd2lsbCBvbmx5IGNoYW5nZSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHMsIGluY2x1ZGluZworICAgIC8vIHRoZSBkaWFnb25hbCwgdGhvdWdoIHRoZSBkaWFnb25hbCBpcyByZXN0b3JlZCBhZnRlcndhcmQKKworICAgIC8qICAgICBjb3B5IHIgYW5kIChxIHRyYW5zcG9zZSkqYiB0byBwcmVzZXJ2ZSBpbnB1dCBhbmQgaW5pdGlhbGl6ZSBzLiAqLworICAgIC8qICAgICBpbiBwYXJ0aWN1bGFyLCBzYXZlIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiByIGluIHguICovCisgICAgeCA9IHMuZGlhZ29uYWwoKTsKKyAgICB3YSA9IHF0YjsKKworICAgIHMudG9wTGVmdENvcm5lcihuLG4pLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgPSBzLnRvcExlZnRDb3JuZXIobixuKS50cmFuc3Bvc2UoKTsKKworICAgIC8qICAgICBlbGltaW5hdGUgdGhlIGRpYWdvbmFsIG1hdHJpeCBkIHVzaW5nIGEgZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKworICAgICAgICAvKiAgICAgICAgcHJlcGFyZSB0aGUgcm93IG9mIGQgdG8gYmUgZWxpbWluYXRlZCwgbG9jYXRpbmcgdGhlICovCisgICAgICAgIC8qICAgICAgICBkaWFnb25hbCBlbGVtZW50IHVzaW5nIHAgZnJvbSB0aGUgcXIgZmFjdG9yaXphdGlvbi4gKi8KKyAgICAgICAgbCA9IGlwdnRbal07CisgICAgICAgIGlmIChkaWFnW2xdID09IDAuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNkaWFnLnRhaWwobi1qKS5zZXRaZXJvKCk7CisgICAgICAgIHNkaWFnW2pdID0gZGlhZ1tsXTsKKworICAgICAgICAvKiAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyB0byBlbGltaW5hdGUgdGhlIHJvdyBvZiBkICovCisgICAgICAgIC8qICAgICAgICBtb2RpZnkgb25seSBhIHNpbmdsZSBlbGVtZW50IG9mIChxIHRyYW5zcG9zZSkqYiAqLworICAgICAgICAvKiAgICAgICAgYmV5b25kIHRoZSBmaXJzdCBuLCB3aGljaCBpcyBpbml0aWFsbHkgemVyby4gKi8KKyAgICAgICAgU2NhbGFyIHF0YnBqID0gMC47CisgICAgICAgIGZvciAoayA9IGo7IGsgPCBuOyArK2spIHsKKyAgICAgICAgICAgIC8qICAgICAgICAgICBkZXRlcm1pbmUgYSBnaXZlbnMgcm90YXRpb24gd2hpY2ggZWxpbWluYXRlcyB0aGUgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICBhcHByb3ByaWF0ZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IHJvdyBvZiBkLiAqLworICAgICAgICAgICAgZ2l2ZW5zLm1ha2VHaXZlbnMoLXMoayxrKSwgc2RpYWdba10pOworCisgICAgICAgICAgICAvKiAgICAgICAgICAgY29tcHV0ZSB0aGUgbW9kaWZpZWQgZGlhZ29uYWwgZWxlbWVudCBvZiByIGFuZCAqLworICAgICAgICAgICAgLyogICAgICAgICAgIHRoZSBtb2RpZmllZCBlbGVtZW50IG9mICgocSB0cmFuc3Bvc2UpKmIsMCkuICovCisgICAgICAgICAgICBzKGssaykgPSBnaXZlbnMuYygpICogcyhrLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2tdOworICAgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiB3YVtrXSArIGdpdmVucy5zKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHF0YnBqID0gLWdpdmVucy5zKCkgKiB3YVtrXSArIGdpdmVucy5jKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHdhW2tdID0gdGVtcDsKKworICAgICAgICAgICAgLyogICAgICAgICAgIGFjY3VtdWxhdGUgdGhlIHRyYW5mb3JtYXRpb24gaW4gdGhlIHJvdyBvZiBzLiAqLworICAgICAgICAgICAgZm9yIChpID0gaysxOyBpPG47ICsraSkgeworICAgICAgICAgICAgICAgIHRlbXAgPSBnaXZlbnMuYygpICogcyhpLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2ldOworICAgICAgICAgICAgICAgIHNkaWFnW2ldID0gLWdpdmVucy5zKCkgKiBzKGksaykgKyBnaXZlbnMuYygpICogc2RpYWdbaV07CisgICAgICAgICAgICAgICAgcyhpLGspID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICAgICBzb2x2ZSB0aGUgdHJpYW5ndWxhciBzeXN0ZW0gZm9yIHouIGlmIHRoZSBzeXN0ZW0gaXMgKi8KKyAgICAvKiAgICAgc2luZ3VsYXIsIHRoZW4gb2J0YWluIGEgbGVhc3Qgc3F1YXJlcyBzb2x1dGlvbi4gKi8KKyAgICBJbmRleCBuc2luZzsKKyAgICBmb3IobnNpbmc9MDsgbnNpbmc8biAmJiBzZGlhZ1tuc2luZ10hPTA7IG5zaW5nKyspIHt9CisKKyAgICB3YS50YWlsKG4tbnNpbmcpLnNldFplcm8oKTsKKyAgICBzLnRvcExlZnRDb3JuZXIobnNpbmcsIG5zaW5nKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2Uod2EuaGVhZChuc2luZykpOworCisgICAgLy8gcmVzdG9yZQorICAgIHNkaWFnID0gcy5kaWFnb25hbCgpOworICAgIHMuZGlhZ29uYWwoKSA9IHg7CisKKyAgICAvKiAgICAgcGVybXV0ZSB0aGUgY29tcG9uZW50cyBvZiB6IGJhY2sgdG8gY29tcG9uZW50cyBvZiB4LiAqLworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHhbaXB2dFtqXV0gPSB3YVtqXTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yMW1weXEuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjFtcHlxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmZjcwMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjFtcHlxLmgKQEAgLTAsMCArMSwzMCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE8gOiBtb3ZlIHRoaXMgdG8gR2l2ZW5zUVIgb25jZSB0aGVyZSdzIHN1Y2ggYSB0aGluZyBpbiBFaWdlbgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCByMW1weXEoRGVuc2VJbmRleCBtLCBEZW5zZUluZGV4IG4sIFNjYWxhciAqYSwgY29uc3Qgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ2X2dpdmVucywgY29uc3Qgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ3X2dpdmVucykKK3sKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiAgICAgYXBwbHkgdGhlIGZpcnN0IHNldCBvZiBnaXZlbnMgcm90YXRpb25zIHRvIGEuICovCisgICAgZm9yIChJbmRleCBqID0gbi0yOyBqPj0wOyAtLWopCisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGk8bTsgKytpKSB7CisgICAgICAgICAgICBTY2FsYXIgdGVtcCA9IHZfZ2l2ZW5zW2pdLmMoKSAqIGFbaSttKmpdIC0gdl9naXZlbnNbal0ucygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qKG4tMSldID0gdl9naXZlbnNbal0ucygpICogYVtpK20qal0gKyB2X2dpdmVuc1tqXS5jKCkgKiBhW2krbSoobi0xKV07CisgICAgICAgICAgICBhW2krbSpqXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICAvKiAgICAgYXBwbHkgdGhlIHNlY29uZCBzZXQgb2YgZ2l2ZW5zIHJvdGF0aW9ucyB0byBhLiAqLworICAgIGZvciAoSW5kZXggaiA9IDA7IGo8bi0xOyArK2opCisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGk8bTsgKytpKSB7CisgICAgICAgICAgICBTY2FsYXIgdGVtcCA9IHdfZ2l2ZW5zW2pdLmMoKSAqIGFbaSttKmpdICsgd19naXZlbnNbal0ucygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qKG4tMSldID0gLXdfZ2l2ZW5zW2pdLnMoKSAqIGFbaSttKmpdICsgd19naXZlbnNbal0uYygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qal0gPSB0ZW1wOworICAgICAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjF1cGR0LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3IxdXBkdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODc2NjAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3IxdXBkdC5oCkBAIC0wLDAgKzEsOTkgQEAKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCByMXVwZHQoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnMsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxPiAmdSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ2X2dpdmVucywKKyAgICAgICAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ3X2dpdmVucywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICZ2LAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMT4gJncsCisgICAgICAgIGJvb2wgKnNpbmcpCit7CisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworICAgIGNvbnN0IEphY29iaVJvdGF0aW9uPFNjYWxhcj4gSWRlbnRpdHlSb3RhdGlvbiA9IEphY29iaVJvdGF0aW9uPFNjYWxhcj4oMSwwKTsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGNvbnN0IEluZGV4IG0gPSBzLnJvd3MoKTsKKyAgICBjb25zdCBJbmRleCBuID0gcy5jb2xzKCk7CisgICAgSW5kZXggaSwgaj0xOworICAgIFNjYWxhciB0ZW1wOworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gZ2l2ZW5zOworCisgICAgLy8gcjF1cGR0IGhhZCBhIGJyb2FkZXIgdXNlY2FzZSwgYnV0IHdlIGRvbnQgdXNlIGl0IGhlcmUuIEFuZCwgbW9yZQorICAgIC8vIGltcG9ydGFudGx5LCB3ZSBjYW4gbm90IHRlc3QgaXQuCisgICAgZWlnZW5fYXNzZXJ0KG09PW4pOworICAgIGVpZ2VuX2Fzc2VydCh1LnNpemUoKT09bSk7CisgICAgZWlnZW5fYXNzZXJ0KHYuc2l6ZSgpPT1uKTsKKyAgICBlaWdlbl9hc3NlcnQody5zaXplKCk9PW4pOworCisgICAgLyogbW92ZSB0aGUgbm9udHJpdmlhbCBwYXJ0IG9mIHRoZSBsYXN0IGNvbHVtbiBvZiBzIGludG8gdy4gKi8KKyAgICB3W24tMV0gPSBzKG4tMSxuLTEpOworCisgICAgLyogcm90YXRlIHRoZSB2ZWN0b3IgdiBpbnRvIGEgbXVsdGlwbGUgb2YgdGhlIG4tdGggdW5pdCB2ZWN0b3IgKi8KKyAgICAvKiBpbiBzdWNoIGEgd2F5IHRoYXQgYSBzcGlrZSBpcyBpbnRyb2R1Y2VkIGludG8gdy4gKi8KKyAgICBmb3IgKGo9bi0yOyBqPj0wOyAtLWopIHsKKyAgICAgICAgd1tqXSA9IDAuOworICAgICAgICBpZiAodltqXSAhPSAwLikgeworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGEgZ2l2ZW5zIHJvdGF0aW9uIHdoaWNoIGVsaW1pbmF0ZXMgdGhlICovCisgICAgICAgICAgICAvKiBqLXRoIGVsZW1lbnQgb2Ygdi4gKi8KKyAgICAgICAgICAgIGdpdmVucy5tYWtlR2l2ZW5zKC12W24tMV0sIHZbal0pOworCisgICAgICAgICAgICAvKiBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gdiBhbmQgc3RvcmUgdGhlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvKiBuZWNlc3NhcnkgdG8gcmVjb3ZlciB0aGUgZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgICAgICAgICAgdltuLTFdID0gZ2l2ZW5zLnMoKSAqIHZbal0gKyBnaXZlbnMuYygpICogdltuLTFdOworICAgICAgICAgICAgdl9naXZlbnNbal0gPSBnaXZlbnM7CisKKyAgICAgICAgICAgIC8qIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBzIGFuZCBleHRlbmQgdGhlIHNwaWtlIGluIHcuICovCisgICAgICAgICAgICBmb3IgKGkgPSBqOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiBzKGosaSkgLSBnaXZlbnMucygpICogd1tpXTsKKyAgICAgICAgICAgICAgICB3W2ldID0gZ2l2ZW5zLnMoKSAqIHMoaixpKSArIGdpdmVucy5jKCkgKiB3W2ldOworICAgICAgICAgICAgICAgIHMoaixpKSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdl9naXZlbnNbal0gPSBJZGVudGl0eVJvdGF0aW9uOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgc3Bpa2UgZnJvbSB0aGUgcmFuayAxIHVwZGF0ZSB0byB3LiAqLworICAgIHcgKz0gdltuLTFdICogdTsKKworICAgIC8qIGVsaW1pbmF0ZSB0aGUgc3Bpa2UuICovCisgICAgKnNpbmcgPSBmYWxzZTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbi0xOyArK2opIHsKKyAgICAgICAgaWYgKHdbal0gIT0gMC4pIHsKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBhIGdpdmVucyByb3RhdGlvbiB3aGljaCBlbGltaW5hdGVzIHRoZSAqLworICAgICAgICAgICAgLyogai10aCBlbGVtZW50IG9mIHRoZSBzcGlrZS4gKi8KKyAgICAgICAgICAgIGdpdmVucy5tYWtlR2l2ZW5zKC1zKGosaiksIHdbal0pOworCisgICAgICAgICAgICAvKiBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gcyBhbmQgcmVkdWNlIHRoZSBzcGlrZSBpbiB3LiAqLworICAgICAgICAgICAgZm9yIChpID0gajsgaSA8IG07ICsraSkgeworICAgICAgICAgICAgICAgIHRlbXAgPSBnaXZlbnMuYygpICogcyhqLGkpICsgZ2l2ZW5zLnMoKSAqIHdbaV07CisgICAgICAgICAgICAgICAgd1tpXSA9IC1naXZlbnMucygpICogcyhqLGkpICsgZ2l2ZW5zLmMoKSAqIHdbaV07CisgICAgICAgICAgICAgICAgcyhqLGkpID0gdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RvcmUgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byByZWNvdmVyIHRoZSAqLworICAgICAgICAgICAgLyogZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgICAgICAgICAgd19naXZlbnNbal0gPSBnaXZlbnM7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdl9naXZlbnNbal0gPSBJZGVudGl0eVJvdGF0aW9uOworCisgICAgICAgIC8qIHRlc3QgZm9yIHplcm8gZGlhZ29uYWwgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBzLiAqLworICAgICAgICBpZiAocyhqLGopID09IDAuKSB7CisgICAgICAgICAgICAqc2luZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbW92ZSB3IGJhY2sgaW50byB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIG91dHB1dCBzLiAqLworICAgIHMobi0xLG4tMSkgPSB3W24tMV07CisKKyAgICBpZiAocyhqLGopID09IDAuKSB7CisgICAgICAgICpzaW5nID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3J3dXBkdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yd3VwZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJmODU2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yd3VwZHQuaApAQCAtMCwwICsxLDQ5IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcnd1cGR0KAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+ICAmciwKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICAmdywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICAmYiwKKyAgICAgICAgU2NhbGFyIGFscGhhKQoreworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIGNvbnN0IEluZGV4IG4gPSByLmNvbHMoKTsKKyAgICBlaWdlbl9hc3NlcnQoci5yb3dzKCk+PW4pOworICAgIHN0ZDo6dmVjdG9yPEphY29iaVJvdGF0aW9uPFNjYWxhcj4gPiBnaXZlbnMobik7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBTY2FsYXIgdGVtcCwgcm93ajsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIHJvd2ogPSB3W2pdOworCisgICAgICAgIC8qIGFwcGx5IHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbnMgdG8gKi8KKyAgICAgICAgLyogcihpLGopLCBpPTAsMSwuLi4sai0xLCBhbmQgdG8gdyhqKS4gKi8KKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGo7ICsraSkgeworICAgICAgICAgICAgdGVtcCA9IGdpdmVuc1tpXS5jKCkgKiByKGksaikgKyBnaXZlbnNbaV0ucygpICogcm93ajsKKyAgICAgICAgICAgIHJvd2ogPSAtZ2l2ZW5zW2ldLnMoKSAqIHIoaSxqKSArIGdpdmVuc1tpXS5jKCkgKiByb3dqOworICAgICAgICAgICAgcihpLGopID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVybWluZSBhIGdpdmVucyByb3RhdGlvbiB3aGljaCBlbGltaW5hdGVzIHcoaikuICovCisgICAgICAgIGdpdmVuc1tqXS5tYWtlR2l2ZW5zKC1yKGosaiksIHJvd2opOworCisgICAgICAgIGlmIChyb3dqID09IDAuKQorICAgICAgICAgICAgY29udGludWU7IC8vIGdpdmVuc1tqXSBpcyBpZGVudGl0eQorCisgICAgICAgIC8qIGFwcGx5IHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIHRvIHIoaixqKSwgYihqKSwgYW5kIGFscGhhLiAqLworICAgICAgICByKGosaikgPSBnaXZlbnNbal0uYygpICogcihqLGopICsgZ2l2ZW5zW2pdLnMoKSAqIHJvd2o7CisgICAgICAgIHRlbXAgPSBnaXZlbnNbal0uYygpICogYltqXSArIGdpdmVuc1tqXS5zKCkgKiBhbHBoYTsKKyAgICAgICAgYWxwaGEgPSAtZ2l2ZW5zW2pdLnMoKSAqIGJbal0gKyBnaXZlbnNbal0uYygpICogYWxwaGE7CisgICAgICAgIGJbal0gPSB0ZW1wOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL051bWVyaWNhbERpZmYvTnVtZXJpY2FsRGlmZi5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL051bWVyaWNhbERpZmYvTnVtZXJpY2FsRGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWQ4YmMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTnVtZXJpY2FsRGlmZi9OdW1lcmljYWxEaWZmLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIC0qLSBjb2Rpbmc6IHV0Zi04CisvLyB2aW06IHNldCBmaWxlZW5jb2Rpbmc9dXRmLTgKKworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTlVNRVJJQ0FMX0RJRkZfSAorI2RlZmluZSBFSUdFTl9OVU1FUklDQUxfRElGRl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCitlbnVtIE51bWVyaWNhbERpZmZNb2RlIHsKKyAgICBGb3J3YXJkLAorICAgIENlbnRyYWwKK307CisKKworLyoqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgeW91IHRvIGFkZCBhIG1ldGhvZCBkZigpIHRvIHlvdXIgZnVuY3Rvciwgd2hpY2ggd2lsbCAKKyAgKiB1c2UgbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbiB0byBjb21wdXRlIGFuIGFwcHJveGltYXRlIG9mIHRoZQorICAqIGRlcml2YXRpdmUgZm9yIHRoZSBmdW5jdG9yLiBPZiBjb3Vyc2UsIGlmIHlvdSBoYXZlIGFuIGFuYWx5dGljYWwgZm9ybQorICAqIGZvciB0aGUgZGVyaXZhdGl2ZSwgeW91IHNob3VsZCByYXRoZXIgaW1wbGVtZW50IGRmKCkgYnkgeW91cnNlbGYuCisgICoKKyAgKiBNb3JlIGluZm9ybWF0aW9uIG9uCisgICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OdW1lcmljYWxfZGlmZmVyZW50aWF0aW9uCisgICoKKyAgKiBDdXJyZW50bHkgb25seSAiRm9yd2FyZCIgYW5kICJDZW50cmFsIiBzY2hlbWUgYXJlIGltcGxlbWVudGVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIE51bWVyaWNhbERpZmZNb2RlIG1vZGU9Rm9yd2FyZD4KK2NsYXNzIE51bWVyaWNhbERpZmYgOiBwdWJsaWMgX0Z1bmN0b3IKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9GdW5jdG9yIEZ1bmN0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6SW5wdXRUeXBlIElucHV0VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpKYWNvYmlhblR5cGUgSmFjb2JpYW5UeXBlOworCisgICAgTnVtZXJpY2FsRGlmZihTY2FsYXIgX2Vwc2Zjbj0wLikgOiBGdW5jdG9yKCksIGVwc2ZjbihfZXBzZmNuKSB7fQorICAgIE51bWVyaWNhbERpZmYoY29uc3QgRnVuY3RvciYgZiwgU2NhbGFyIF9lcHNmY249MC4pIDogRnVuY3RvcihmKSwgZXBzZmNuKF9lcHNmY24pIHt9CisKKyAgICAvLyBmb3J3YXJkIGNvbnN0cnVjdG9ycworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwPgorICAgICAgICBOdW1lcmljYWxEaWZmKGNvbnN0IFQwJiBhMCkgOiBGdW5jdG9yKGEwKSwgZXBzZmNuKDApIHt9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgorICAgICAgICBOdW1lcmljYWxEaWZmKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExKSA6IEZ1bmN0b3IoYTAsIGExKSwgZXBzZmNuKDApIHt9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICAgICAgTnVtZXJpY2FsRGlmZihjb25zdCBUMCYgYTAsIGNvbnN0IFQxJiBhMSwgY29uc3QgVDImIGEyKSA6IEZ1bmN0b3IoYTAsIGExLCBhMiksIGVwc2ZjbigwKSB7fQorCisgICAgZW51bSB7CisgICAgICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBGdW5jdG9yOjpJbnB1dHNBdENvbXBpbGVUaW1lLAorICAgICAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gRnVuY3Rvcjo6VmFsdWVzQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICAvKioKKyAgICAgICogcmV0dXJuIHRoZSBudW1iZXIgb2YgZXZhbHVhdGlvbiBvZiBmdW5jdG9yCisgICAgICovCisgICAgaW50IGRmKGNvbnN0IElucHV0VHlwZSYgX3gsIEphY29iaWFuVHlwZSAmamFjKSBjb25zdAorICAgIHsKKyAgICAgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgICAgIFNjYWxhciBoOworICAgICAgICBpbnQgbmZldj0wOworICAgICAgICBjb25zdCB0eXBlbmFtZSBJbnB1dFR5cGU6OkluZGV4IG4gPSBfeC5zaXplKCk7CisgICAgICAgIGNvbnN0IFNjYWxhciBlcHMgPSBzcXJ0KCgoc3RkOjptYXgpKGVwc2ZjbixOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICkpKTsKKyAgICAgICAgVmFsdWVUeXBlIHZhbDEsIHZhbDI7CisgICAgICAgIElucHV0VHlwZSB4ID0gX3g7CisgICAgICAgIC8vIFRPRE8gOiB3ZSBzaG91bGQgZG8gdGhpcyBvbmx5IGlmIHRoZSBzaXplIGlzIG5vdCBhbHJlYWR5IGtub3duCisgICAgICAgIHZhbDEucmVzaXplKEZ1bmN0b3I6OnZhbHVlcygpKTsKKyAgICAgICAgdmFsMi5yZXNpemUoRnVuY3Rvcjo6dmFsdWVzKCkpOworCisgICAgICAgIC8vIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN3aXRjaChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZvcndhcmQ6CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBmKHgpCisgICAgICAgICAgICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2YWwxKTsgbmZldisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZW50cmFsOgorICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBGdW5jdGlvbiBCb2R5CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBoID0gZXBzICogYWJzKHhbal0pOworICAgICAgICAgICAgaWYgKGggPT0gMC4pIHsKKyAgICAgICAgICAgICAgICBoID0gZXBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZvcndhcmQ6CisgICAgICAgICAgICAgICAgICAgIHhbal0gKz0gaDsKKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2YWwyKTsKKyAgICAgICAgICAgICAgICAgICAgbmZldisrOworICAgICAgICAgICAgICAgICAgICB4W2pdID0gX3hbal07CisgICAgICAgICAgICAgICAgICAgIGphYy5jb2woaikgPSAodmFsMi12YWwxKS9oOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENlbnRyYWw6CisgICAgICAgICAgICAgICAgICAgIHhbal0gKz0gaDsKKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2YWwyKTsgbmZldisrOworICAgICAgICAgICAgICAgICAgICB4W2pdIC09IDIqaDsKKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2YWwxKTsgbmZldisrOworICAgICAgICAgICAgICAgICAgICB4W2pdID0gX3hbal07CisgICAgICAgICAgICAgICAgICAgIGphYy5jb2woaikgPSAodmFsMi12YWwxKS8oMipoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5mZXY7CisgICAgfQorcHJpdmF0ZToKKyAgICBTY2FsYXIgZXBzZmNuOworCisgICAgTnVtZXJpY2FsRGlmZiYgb3BlcmF0b3I9KGNvbnN0IE51bWVyaWNhbERpZmYmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisvL3ZpbTogYWkgdHM9NCBzdHM9NCBldCBzdz00CisjZW5kaWYgLy8gRUlHRU5fTlVNRVJJQ0FMX0RJRkZfSAorCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvQ29tcGFuaW9uLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvQ29tcGFuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxNWMyOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Db21wYW5pb24uaApAQCAtMCwwICsxLDI3NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01QQU5JT05fSAorI2RlZmluZSBFSUdFTl9DT01QQU5JT05fSAorCisvLyBUaGlzIGZpbGUgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaW5jbHVkZQorLy8gKiBFaWdlbi9Db3JlCisvLyAqIEVpZ2VuL3NyYy9Qb2x5bm9taWFsU29sdmVyLmgKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIHJhZGl4KCl7IHJldHVybiAyOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCByYWRpeDIoKXsgcmV0dXJuIHJhZGl4PFQ+KCkqcmFkaXg8VD4oKTsgfQorCit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK3N0cnVjdCBkZWNyZW1lbnRfaWZfZml4ZWRfc2l6ZQoreworICBlbnVtIHsKKyAgICByZXQgPSAoU2l6ZSA9PSBEeW5hbWljKSA/IER5bmFtaWMgOiBTaXplLTEgfTsKK307CisKKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWcgPgorY2xhc3MgY29tcGFuaW9uCit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RlZz09RHluYW1pYyA/IER5bmFtaWMgOiBfRGVnKQorCisgICAgZW51bSB7CisgICAgICBEZWcgPSBfRGVnLAorICAgICAgRGVnXzE9ZGVjcmVtZW50X2lmX2ZpeGVkX3NpemU8RGVnPjo6cmV0CisgICAgfTsKKworICAgIHR5cGVkZWYgX1NjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgICAgICAgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERlZywgMT4gICAgICAgICAgICAgICAgIFJpZ2h0Q29sdW1uOworICAgIC8vdHlwZWRlZiBEaWFnb25hbE1hdHJpeDwgU2NhbGFyLCBEZWdfMSwgRGVnXzEgPiBCb3R0b21MZWZ0RGlhZ29uYWw7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEZWdfMSwgMT4gICAgICAgICAgICAgICBCb3R0b21MZWZ0RGlhZ29uYWw7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERlZywgRGVnPiAgICAgICAgICAgICAgIERlbnNlQ29tcGFuaW9uTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCBfRGVnLCBEZWdfMSA+ICAgICAgICAgIExlZnRCbG9jazsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCBEZWdfMSwgRGVnXzEgPiAgICAgICAgIEJvdHRvbUxlZnRCbG9jazsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCAxLCBEZWdfMSA+ICAgICAgICAgICAgIExlZnRCbG9ja0ZpcnN0Um93OworCisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgIHB1YmxpYzoKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IF9TY2FsYXIgb3BlcmF0b3IoKShJbmRleCByb3csIEluZGV4IGNvbCApIGNvbnN0CisgICAgeworICAgICAgaWYoIG1fYmxfZGlhZy5yb3dzKCkgPiBjb2wgKQorICAgICAgeworICAgICAgICBpZiggMCA8IHJvdyApeyByZXR1cm4gbV9ibF9kaWFnW2NvbF07IH0KKyAgICAgICAgZWxzZXsgcmV0dXJuIDA7IH0KKyAgICAgIH0KKyAgICAgIGVsc2V7IHJldHVybiBtX21vbmljW3Jvd107IH0KKyAgICB9CisKKyAgcHVibGljOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgdm9pZCBzZXRQb2x5bm9taWFsKCBjb25zdCBWZWN0b3JUeXBlJiBwb2x5ICkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBkZWcgPSBwb2x5LnNpemUoKS0xOworICAgICAgbV9tb25pYyA9IC0xL3BvbHlbZGVnXSAqIHBvbHkuaGVhZChkZWcpOworICAgICAgLy9tX2JsX2RpYWcuc2V0SWRlbnRpdHkoIGRlZy0xICk7CisgICAgICBtX2JsX2RpYWcuc2V0T25lcyhkZWctMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgICBjb21wYW5pb24oIGNvbnN0IFZlY3RvclR5cGUmIHBvbHkgKXsKKyAgICAgIHNldFBvbHlub21pYWwoIHBvbHkgKTsgfQorCisgIHB1YmxpYzoKKyAgICBEZW5zZUNvbXBhbmlvbk1hdHJpeFR5cGUgZGVuc2VNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IGRlZyAgID0gbV9tb25pYy5zaXplKCk7CisgICAgICBjb25zdCBJbmRleCBkZWdfMSA9IGRlZy0xOworICAgICAgRGVuc2VDb21wYW5pb25NYXRyaXhUeXBlIGNvbXBhbmlvbihkZWcsZGVnKTsKKyAgICAgIGNvbXBhbmlvbiA8PAorICAgICAgICAoIExlZnRCbG9jayhkZWcsZGVnXzEpCisgICAgICAgICAgPDwgTGVmdEJsb2NrRmlyc3RSb3c6Olplcm8oMSxkZWdfMSksCisgICAgICAgICAgQm90dG9tTGVmdEJsb2NrOjpJZGVudGl0eShkZWctMSxkZWctMSkqbV9ibF9kaWFnLmFzRGlhZ29uYWwoKSApLmZpbmlzaGVkKCkKKyAgICAgICAgLCBtX21vbmljOworICAgICAgcmV0dXJuIGNvbXBhbmlvbjsKKyAgICB9CisKKworCisgIHByb3RlY3RlZDoKKyAgICAvKiogSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgYmFsYW5jaW5nIGFsZ29yaXRobS4KKyAgICAgKiBccmV0dXJucyB0cnVlIGlmIHRoZSByb3cgYW5kIHRoZSBjb2x1bW4sIGhhdmluZyBjb2xOb3JtIGFuZCByb3dOb3JtCisgICAgICogYXMgbm9ybXMsIGFyZSBiYWxhbmNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIGNvbEIgYW5kIHJvd0IgYXJlIHJlcGVjdGl2ZWx5IHRoZSBtdWx0aXBsaWVycyBmb3IKKyAgICAgKiB0aGUgY29sdW1uIGFuZCB0aGUgcm93IGluIG9yZGVyIHRvIGJhbGFuY2UgdGhlbS4KKyAgICAgKiAqLworICAgIGJvb2wgYmFsYW5jZWQoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICAgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKTsKKworICAgIC8qKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBiYWxhbmNpbmcgYWxnb3JpdGhtLgorICAgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJvdyBhbmQgdGhlIGNvbHVtbiwgaGF2aW5nIGNvbE5vcm0gYW5kIHJvd05vcm0KKyAgICAgKiBhcyBub3JtcywgYXJlIGJhbGFuY2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogY29sQiBhbmQgcm93QiBhcmUgcmVwZWN0aXZlbHkgdGhlIG11bHRpcGxpZXJzIGZvcgorICAgICAqIHRoZSBjb2x1bW4gYW5kIHRoZSByb3cgaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGVtLgorICAgICAqICovCisgICAgYm9vbCBiYWxhbmNlZFIoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICAgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQmFsYW5jaW5nIGFsZ29yaXRobSBmcm9tIEIuIE4uIFBBUkxFVFQgYW5kIEMuIFJFSU5TQ0ggKDE5NjkpCisgICAgICogIkJhbGFuY2luZyBhIG1hdHJpeCBmb3IgY2FsY3VsYXRpb24gb2YgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyIKKyAgICAgKiBhZGFwdGVkIHRvIHRoZSBjYXNlIG9mIGNvbXBhbmlvbiBtYXRyaWNlcy4KKyAgICAgKiBBIG1hdHJpeCB3aXRoIG5vbiB6ZXJvIHJvdyBhbmQgbm9uIHplcm8gY29sdW1uIGlzIGJhbGFuY2VkCisgICAgICogZm9yIGEgY2VydGFpbiBub3JtIGlmIHRoZSBpLXRoIHJvdyBhbmQgdGhlIGktdGggY29sdW1uCisgICAgICogaGF2ZSBzYW1lIG5vcm0gZm9yIGFsbCBpLgorICAgICAqLworICAgIHZvaWQgYmFsYW5jZSgpOworCisgIHByb3RlY3RlZDoKKyAgICAgIFJpZ2h0Q29sdW1uICAgICAgICAgICAgICAgIG1fbW9uaWM7CisgICAgICBCb3R0b21MZWZ0RGlhZ29uYWwgICAgICAgICBtX2JsX2RpYWc7Cit9OworCisKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnID4KK2lubGluZQorYm9vbCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZWQoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICBib29sJiBpc0JhbGFuY2VkLCBTY2FsYXImIGNvbEIsIFNjYWxhciYgcm93QiApCit7CisgIGlmKCBTY2FsYXIoMCkgPT0gY29sTm9ybSB8fCBTY2FsYXIoMCkgPT0gcm93Tm9ybSApeyByZXR1cm4gdHJ1ZTsgfQorICBlbHNlCisgIHsKKyAgICAvL1RvIGZpbmQgdGhlIGJhbGFuY2luZyBjb2VmZmljaWVudHMsIGlmIHRoZSByYWRpeCBpcyAyLAorICAgIC8vb25lIGZpbmRzIFxmJCBcc2lnbWEgXGYkIHN1Y2ggdGhhdAorICAgIC8vIFxmJCAyXnsyXHNpZ21hLTF9IDwgcm93Tm9ybSAvIGNvbE5vcm0gXGxlIDJeezJcc2lnbWErMX0gXGYkCisgICAgLy8gdGhlbiB0aGUgYmFsYW5jaW5nIGNvZWZmaWNpZW50IGZvciB0aGUgcm93IGlzIFxmJCAxLzJee1xzaWdtYX0gXGYkCisgICAgLy8gYW5kIHRoZSBiYWxhbmNpbmcgY29lZmZpY2llbnQgZm9yIHRoZSBjb2x1bW4gaXMgXGYkIDJee1xzaWdtYX0gXGYkCisgICAgcm93QiA9IHJvd05vcm0gLyByYWRpeDxTY2FsYXI+KCk7CisgICAgY29sQiA9IFNjYWxhcigxKTsKKyAgICBjb25zdCBTY2FsYXIgcyA9IGNvbE5vcm0gKyByb3dOb3JtOworCisgICAgd2hpbGUgKGNvbE5vcm0gPCByb3dCKQorICAgIHsKKyAgICAgIGNvbEIgKj0gcmFkaXg8U2NhbGFyPigpOworICAgICAgY29sTm9ybSAqPSByYWRpeDI8U2NhbGFyPigpOworICAgIH0KKworICAgIHJvd0IgPSByb3dOb3JtICogcmFkaXg8U2NhbGFyPigpOworCisgICAgd2hpbGUgKGNvbE5vcm0gPj0gcm93QikKKyAgICB7CisgICAgICBjb2xCIC89IHJhZGl4PFNjYWxhcj4oKTsKKyAgICAgIGNvbE5vcm0gLz0gcmFkaXgyPFNjYWxhcj4oKTsKKyAgICB9CisKKyAgICAvL1RoaXMgbGluZSBpcyB1c2VkIHRvIGF2b2lkIGluc3Vic3RhbnRpYWwgYmFsYW5jaW5nCisgICAgaWYgKChyb3dOb3JtICsgY29sTm9ybSkgPCBTY2FsYXIoMC45NSkgKiBzICogY29sQikKKyAgICB7CisgICAgICBpc0JhbGFuY2VkID0gZmFsc2U7CisgICAgICByb3dCID0gU2NhbGFyKDEpIC8gY29sQjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHJldHVybiB0cnVlOyB9CisgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnID4KK2lubGluZQorYm9vbCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZWRSKCBTY2FsYXIgY29sTm9ybSwgU2NhbGFyIHJvd05vcm0sCisgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKQoreworICBpZiggU2NhbGFyKDApID09IGNvbE5vcm0gfHwgU2NhbGFyKDApID09IHJvd05vcm0gKXsgcmV0dXJuIHRydWU7IH0KKyAgZWxzZQorICB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBub3JtIG9mIHRoZSBjb2x1bW4gYW5kIHRoZSByb3cgdG8gdGhlIGdlb21ldHJpYyBtZWFuCisgICAgICogb2YgdGhlIHJvdyBhbmQgY29sdW1uIG5vcm0KKyAgICAgKi8KKyAgICBjb25zdCBfU2NhbGFyIHEgPSBjb2xOb3JtL3Jvd05vcm07CisgICAgaWYoICFpc0FwcHJveCggcSwgX1NjYWxhcigxKSApICkKKyAgICB7CisgICAgICByb3dCID0gc3FydCggY29sTm9ybS9yb3dOb3JtICk7CisgICAgICBjb2xCID0gU2NhbGFyKDEpL3Jvd0I7CisKKyAgICAgIGlzQmFsYW5jZWQgPSBmYWxzZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHJldHVybiB0cnVlOyB9CisgIH0KK30KKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWcgPgordm9pZCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZSgpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKCBEZWcgPT0gRHluYW1pYyB8fCAxIDwgRGVnLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UgKTsKKyAgY29uc3QgSW5kZXggZGVnICAgPSBtX21vbmljLnNpemUoKTsKKyAgY29uc3QgSW5kZXggZGVnXzEgPSBkZWctMTsKKworICBib29sIGhhc0NvbnZlcmdlZD1mYWxzZTsKKyAgd2hpbGUoICFoYXNDb252ZXJnZWQgKQorICB7CisgICAgaGFzQ29udmVyZ2VkID0gdHJ1ZTsKKyAgICBTY2FsYXIgY29sTm9ybSxyb3dOb3JtOworICAgIFNjYWxhciBjb2xCLHJvd0I7CisKKyAgICAvL0ZpcnN0IHJvdywgZmlyc3QgY29sdW1uIGV4Y2x1ZGluZyB0aGUgZGlhZ29uYWwKKyAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBjb2xOb3JtID0gYWJzKG1fYmxfZGlhZ1swXSk7CisgICAgcm93Tm9ybSA9IGFicyhtX21vbmljWzBdKTsKKworICAgIC8vQ29tcHV0ZSBiYWxhbmNpbmcgb2YgdGhlIHJvdyBhbmQgdGhlIGNvbHVtbgorICAgIGlmKCAhYmFsYW5jZWQoIGNvbE5vcm0sIHJvd05vcm0sIGhhc0NvbnZlcmdlZCwgY29sQiwgcm93QiApICkKKyAgICB7CisgICAgICBtX2JsX2RpYWdbMF0gKj0gY29sQjsKKyAgICAgIG1fbW9uaWNbMF0gKj0gcm93QjsKKyAgICB9CisKKyAgICAvL01pZGRsZSByb3dzIGFuZCBjb2x1bW5zIGV4Y2x1ZGluZyB0aGUgZGlhZ29uYWwKKyAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBmb3IoIEluZGV4IGk9MTsgaTxkZWdfMTsgKytpICkKKyAgICB7CisgICAgICAvLyBjb2x1bW4gbm9ybSwgZXhjbHVkaW5nIHRoZSBkaWFnb25hbAorICAgICAgY29sTm9ybSA9IGFicyhtX2JsX2RpYWdbaV0pOworCisgICAgICAvLyByb3cgbm9ybSwgZXhjbHVkaW5nIHRoZSBkaWFnb25hbAorICAgICAgcm93Tm9ybSA9IGFicyhtX2JsX2RpYWdbaS0xXSkgKyBhYnMobV9tb25pY1tpXSk7CisKKyAgICAgIC8vQ29tcHV0ZSBiYWxhbmNpbmcgb2YgdGhlIHJvdyBhbmQgdGhlIGNvbHVtbgorICAgICAgaWYoICFiYWxhbmNlZCggY29sTm9ybSwgcm93Tm9ybSwgaGFzQ29udmVyZ2VkLCBjb2xCLCByb3dCICkgKQorICAgICAgeworICAgICAgICBtX2JsX2RpYWdbaV0gICAqPSBjb2xCOworICAgICAgICBtX2JsX2RpYWdbaS0xXSAqPSByb3dCOworICAgICAgICBtX21vbmljW2ldICAgICAqPSByb3dCOworICAgICAgfQorICAgIH0KKworICAgIC8vTGFzdCByb3csIGxhc3QgY29sdW1uIGV4Y2x1ZGluZyB0aGUgZGlhZ29uYWwKKyAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgY29uc3QgSW5kZXggZWJsID0gbV9ibF9kaWFnLnNpemUoKS0xOworICAgIFZlY3RvckJsb2NrPFJpZ2h0Q29sdW1uLERlZ18xPiBoZWFkTW9uaWMoIG1fbW9uaWMsIDAsIGRlZ18xICk7CisgICAgY29sTm9ybSA9IGhlYWRNb25pYy5hcnJheSgpLmFicygpLnN1bSgpOworICAgIHJvd05vcm0gPSBhYnMoIG1fYmxfZGlhZ1tlYmxdICk7CisKKyAgICAvL0NvbXB1dGUgYmFsYW5jaW5nIG9mIHRoZSByb3cgYW5kIHRoZSBjb2x1bW4KKyAgICBpZiggIWJhbGFuY2VkKCBjb2xOb3JtLCByb3dOb3JtLCBoYXNDb252ZXJnZWQsIGNvbEIsIHJvd0IgKSApCisgICAgeworICAgICAgaGVhZE1vbmljICAgICAgKj0gY29sQjsKKyAgICAgIG1fYmxfZGlhZ1tlYmxdICo9IHJvd0I7CisgICAgfQorICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBBTklPTl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFNvbHZlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzL1BvbHlub21pYWxTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE5OGVjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzL1BvbHlub21pYWxTb2x2ZXIuaApAQCAtMCwwICsxLDQwNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QT0xZTk9NSUFMX1NPTFZFUl9ICisjZGVmaW5lIEVJR0VOX1BPTFlOT01JQUxfU09MVkVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKyAqICBcY2xhc3MgUG9seW5vbWlhbFNvbHZlckJhc2UuCisgKgorICogXGJyaWVmIERlZmluZWQgdG8gYmUgaW5oZXJpdGVkIGJ5IHBvbHlub21pYWwgc29sdmVyczogaXQgcHJvdmlkZXMKKyAqIGNvbnZlbmllbnQgbWV0aG9kcyBzdWNoIGFzCisgKiAgLSByZWFsIHJvb3RzLAorICogIC0gZ3JlYXRlc3QsIHNtYWxsZXN0IGNvbXBsZXggcm9vdHMsCisgKiAgLSByZWFsIHJvb3RzIHdpdGggZ3JlYXRlc3QsIHNtYWxsZXN0IGFic29sdXRlIHJlYWwgdmFsdWUsCisgKiAgLSBncmVhdGVzdCwgc21hbGxlc3QgcmVhbCByb290cy4KKyAqCisgKiBJdCBzdG9yZXMgdGhlIHNldCBvZiByb290cyBhcyBhIHZlY3RvciBvZiBjb21wbGV4ZXMuCisgKgorICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWcgPgorY2xhc3MgUG9seW5vbWlhbFNvbHZlckJhc2UKK3sKKyAgcHVibGljOgorICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfRGVnPT1EeW5hbWljID8gRHluYW1pYyA6IF9EZWcpCisKKyAgICB0eXBlZGVmIF9TY2FsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsICAgIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gICAgICAgICAgICBSb290VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxSb290VHlwZSxfRGVnLDE+ICAgICAgICAgICAgIFJvb3RzVHlwZTsKKworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIE90aGVyUG9seW5vbWlhbCA+CisgICAgaW5saW5lIHZvaWQgc2V0UG9seW5vbWlhbCggY29uc3QgT3RoZXJQb2x5bm9taWFsJiBwb2x5ICl7CisgICAgICBtX3Jvb3RzLnJlc2l6ZShwb2x5LnNpemUoKS0xKTsgfQorCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICBpbmxpbmUgUG9seW5vbWlhbFNvbHZlckJhc2UoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApeworICAgICAgc2V0UG9seW5vbWlhbCggcG9seSgpICk7IH0KKworICAgIGlubGluZSBQb2x5bm9taWFsU29sdmVyQmFzZSgpe30KKworICBwdWJsaWM6CisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb21wbGV4IHJvb3RzIG9mIHRoZSBwb2x5bm9taWFsICovCisgICAgaW5saW5lIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RzOyB9CisKKyAgcHVibGljOgorICAgIC8qKiBDbGVhciBhbmQgZmlsbHMgdGhlIGJhY2sgaW5zZXJ0aW9uIHNlcXVlbmNlIHdpdGggdGhlIHJlYWwgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwKKyAgICAgKiBpLmUuIHRoZSByZWFsIHBhcnQgb2YgdGhlIGNvbXBsZXggcm9vdHMgdGhhdCBoYXZlIGFuIGltYWdpbmFyeSBwYXJ0IHdoaWNoCisgICAgICogYWJzb2x1dGUgdmFsdWUgaXMgc21hbGxlciB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBiaV9zZXEgOiB0aGUgYmFjayBpbnNlcnRpb24gc2VxdWVuY2UgKHN0bCBjb25jZXB0KQorICAgICAqIFxwYXJhbVtpbl0gIGFic0ltYWdpbmFyeVRocmVzaG9sZCA6IHRoZSBtYXhpbXVtIGJvdW5kIG9mIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXgKKyAgICAgKiAgbnVtYmVyIHRoYXQgaXMgY29uc2lkZXJlZCBhcyByZWFsLgorICAgICAqICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RsX2JhY2tfaW5zZXJ0aW9uX3NlcXVlbmNlPgorICAgIGlubGluZSB2b2lkIHJlYWxSb290cyggU3RsX2JhY2tfaW5zZXJ0aW9uX3NlcXVlbmNlJiBiaV9zZXEsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBiaV9zZXEuY2xlYXIoKTsKKyAgICAgIGZvcihJbmRleCBpPTA7IGk8bV9yb290cy5zaXplKCk7ICsraSApCisgICAgICB7CisgICAgICAgIGlmKCBhYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgKXsKKyAgICAgICAgICBiaV9zZXEucHVzaF9iYWNrKCBtX3Jvb3RzW2ldLnJlYWwoKSApOyB9CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBzcXVhcmVkTm9ybUJpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgY29uc3QgUm9vdFR5cGUmIHNlbGVjdENvbXBsZXhSb290X3dpdGhSZXNwZWN0VG9Ob3JtKCBzcXVhcmVkTm9ybUJpbmFyeVByZWRpY2F0ZSYgcHJlZCApIGNvbnN0CisgICAgeworICAgICAgSW5kZXggcmVzPTA7CisgICAgICBSZWFsU2NhbGFyIG5vcm0yID0gbnVtZXh0OjphYnMyKCBtX3Jvb3RzWzBdICk7CisgICAgICBmb3IoIEluZGV4IGk9MTsgaTxtX3Jvb3RzLnNpemUoKTsgKytpICkKKyAgICAgIHsKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciBjdXJyTm9ybTIgPSBudW1leHQ6OmFiczIoIG1fcm9vdHNbaV0gKTsKKyAgICAgICAgaWYoIHByZWQoIGN1cnJOb3JtMiwgbm9ybTIgKSApeworICAgICAgICAgIHJlcz1pOyBub3JtMj1jdXJyTm9ybTI7IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3Jvb3RzW3Jlc107CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJucyB0aGUgY29tcGxleCByb290IHdpdGggZ3JlYXRlc3Qgbm9ybS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUm9vdFR5cGUmIGdyZWF0ZXN0Um9vdCgpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpncmVhdGVyPFNjYWxhcj4gZ3JlYXRlcjsKKyAgICAgIHJldHVybiBzZWxlY3RDb21wbGV4Um9vdF93aXRoUmVzcGVjdFRvTm9ybSggZ3JlYXRlciApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxyZXR1cm5zIHRoZSBjb21wbGV4IHJvb3Qgd2l0aCBzbWFsbGVzdCBub3JtLgorICAgICAqLworICAgIGlubGluZSBjb25zdCBSb290VHlwZSYgc21hbGxlc3RSb290KCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6Omxlc3M8U2NhbGFyPiBsZXNzOworICAgICAgcmV0dXJuIHNlbGVjdENvbXBsZXhSb290X3dpdGhSZXNwZWN0VG9Ob3JtKCBsZXNzICk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBzcXVhcmVkUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9BYnNSZWFsUGFydCgKKyAgICAgICAgc3F1YXJlZFJlYWxQYXJ0QmluYXJ5UHJlZGljYXRlJiBwcmVkLAorICAgICAgICBib29sJiBoYXNBcmVhbFJvb3QsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjphYnM7CisgICAgICBoYXNBcmVhbFJvb3QgPSBmYWxzZTsKKyAgICAgIEluZGV4IHJlcz0wOworICAgICAgUmVhbFNjYWxhciBhYnMyKDApOworCisgICAgICBmb3IoIEluZGV4IGk9MDsgaTxtX3Jvb3RzLnNpemUoKTsgKytpICkKKyAgICAgIHsKKyAgICAgICAgaWYoIGFicyggbV9yb290c1tpXS5pbWFnKCkgKSA8IGFic0ltYWdpbmFyeVRocmVzaG9sZCApCisgICAgICAgIHsKKyAgICAgICAgICBpZiggIWhhc0FyZWFsUm9vdCApCisgICAgICAgICAgeworICAgICAgICAgICAgaGFzQXJlYWxSb290ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlcyA9IGk7CisgICAgICAgICAgICBhYnMyID0gbV9yb290c1tpXS5yZWFsKCkgKiBtX3Jvb3RzW2ldLnJlYWwoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgY3VyckFiczIgPSBtX3Jvb3RzW2ldLnJlYWwoKSAqIG1fcm9vdHNbaV0ucmVhbCgpOworICAgICAgICAgICAgaWYoIHByZWQoIGN1cnJBYnMyLCBhYnMyICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhYnMyID0gY3VyckFiczI7CisgICAgICAgICAgICAgIHJlcyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmKCBhYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBhYnMoIG1fcm9vdHNbcmVzXS5pbWFnKCkgKSApeworICAgICAgICAgICAgcmVzID0gaTsgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVtZXh0OjpyZWFsX3JlZihtX3Jvb3RzW3Jlc10pOworICAgIH0KKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9SZWFsUGFydCgKKyAgICAgICAgUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGUmIHByZWQsCisgICAgICAgIGJvb2wmIGhhc0FyZWFsUm9vdCwKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzSW1hZ2luYXJ5VGhyZXNob2xkID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpICkgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmFiczsKKyAgICAgIGhhc0FyZWFsUm9vdCA9IGZhbHNlOworICAgICAgSW5kZXggcmVzPTA7CisgICAgICBSZWFsU2NhbGFyIHZhbCgwKTsKKworICAgICAgZm9yKCBJbmRleCBpPTA7IGk8bV9yb290cy5zaXplKCk7ICsraSApCisgICAgICB7CisgICAgICAgIGlmKCBhYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgKQorICAgICAgICB7CisgICAgICAgICAgaWYoICFoYXNBcmVhbFJvb3QgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhhc0FyZWFsUm9vdCA9IHRydWU7CisgICAgICAgICAgICByZXMgPSBpOworICAgICAgICAgICAgdmFsID0gbV9yb290c1tpXS5yZWFsKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyIGN1cnIgPSBtX3Jvb3RzW2ldLnJlYWwoKTsKKyAgICAgICAgICAgIGlmKCBwcmVkKCBjdXJyLCB2YWwgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHZhbCA9IGN1cnI7CisgICAgICAgICAgICAgIHJlcyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmKCBhYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBhYnMoIG1fcm9vdHNbcmVzXS5pbWFnKCkgKSApeworICAgICAgICAgICAgcmVzID0gaTsgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVtZXh0OjpyZWFsX3JlZihtX3Jvb3RzW3Jlc10pOworICAgIH0KKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogXHJldHVybnMgYSByZWFsIHJvb3Qgd2l0aCBncmVhdGVzdCBhYnNvbHV0ZSBtYWduaXR1ZGUuCisgICAgICogQSByZWFsIHJvb3QgaXMgZGVmaW5lZCBhcyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCByb290IHdpdGggYWJzb2x1dGUgaW1hZ2luYXJ5CisgICAgICogcGFydCBzbWFsbGVzdCB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICogSWYgbm8gcmVhbCByb290IGlzIGZvdW5kIHRoZSBib29sZWFuIGhhc0FyZWFsUm9vdCBpcyBzZXQgdG8gZmFsc2UgYW5kIHRoZSByZWFsIHBhcnQgb2YKKyAgICAgKiB0aGUgcm9vdCB3aXRoIHNtYWxsZXN0IGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IGlzIHJldHVybmVkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBoYXNBcmVhbFJvb3QgOiBib29sZWFuIHRydWUgaWYgYSByZWFsIHJvb3QgaXMgZm91bmQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqICBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgY3JpdGVyaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogXHBhcmFtW2luXSBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgOiB0aHJlc2hvbGQgb24gdGhlIGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IHRvIGRlY2lkZQorICAgICAqICB3aGV0aGVyIG9yIG5vdCBhIHJvb3QgaXMgcmVhbC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUmVhbFNjYWxhciYgYWJzR3JlYXRlc3RSZWFsUm9vdCgKKyAgICAgICAgYm9vbCYgaGFzQXJlYWxSb290LAorICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkgKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6Z3JlYXRlcjxTY2FsYXI+IGdyZWF0ZXI7CisgICAgICByZXR1cm4gc2VsZWN0UmVhbFJvb3Rfd2l0aFJlc3BlY3RUb0Fic1JlYWxQYXJ0KCBncmVhdGVyLCBoYXNBcmVhbFJvb3QsIGFic0ltYWdpbmFyeVRocmVzaG9sZCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogXHJldHVybnMgYSByZWFsIHJvb3Qgd2l0aCBzbWFsbGVzdCBhYnNvbHV0ZSBtYWduaXR1ZGUuCisgICAgICogQSByZWFsIHJvb3QgaXMgZGVmaW5lZCBhcyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCByb290IHdpdGggYWJzb2x1dGUgaW1hZ2luYXJ5CisgICAgICogcGFydCBzbWFsbGVzdCB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICogSWYgbm8gcmVhbCByb290IGlzIGZvdW5kIHRoZSBib29sZWFuIGhhc0FyZWFsUm9vdCBpcyBzZXQgdG8gZmFsc2UgYW5kIHRoZSByZWFsIHBhcnQgb2YKKyAgICAgKiB0aGUgcm9vdCB3aXRoIHNtYWxsZXN0IGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IGlzIHJldHVybmVkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBoYXNBcmVhbFJvb3QgOiBib29sZWFuIHRydWUgaWYgYSByZWFsIHJvb3QgaXMgZm91bmQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqICBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgY3JpdGVyaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogXHBhcmFtW2luXSBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgOiB0aHJlc2hvbGQgb24gdGhlIGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IHRvIGRlY2lkZQorICAgICAqICB3aGV0aGVyIG9yIG5vdCBhIHJvb3QgaXMgcmVhbC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUmVhbFNjYWxhciYgYWJzU21hbGxlc3RSZWFsUm9vdCgKKyAgICAgICAgYm9vbCYgaGFzQXJlYWxSb290LAorICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkgKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6bGVzczxTY2FsYXI+IGxlc3M7CisgICAgICByZXR1cm4gc2VsZWN0UmVhbFJvb3Rfd2l0aFJlc3BlY3RUb0Fic1JlYWxQYXJ0KCBsZXNzLCBoYXNBcmVhbFJvb3QsIGFic0ltYWdpbmFyeVRocmVzaG9sZCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogXHJldHVybnMgdGhlIHJlYWwgcm9vdCB3aXRoIGdyZWF0ZXN0IHZhbHVlLgorICAgICAqIEEgcmVhbCByb290IGlzIGRlZmluZWQgYXMgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggcm9vdCB3aXRoIGFic29sdXRlIGltYWdpbmFyeQorICAgICAqIHBhcnQgc21hbGxlc3QgdGhhbiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQuCisgICAgICogYWJzSW1hZ2luYXJ5VGhyZXNob2xkIHRha2VzIHRoZSBkdW1teV9wcmVjaXNpb24gYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIF9TY2FsYXIgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHRoZSBQb2x5bm9taWFsU29sdmVyIGNsYXNzIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAqIElmIG5vIHJlYWwgcm9vdCBpcyBmb3VuZCB0aGUgYm9vbGVhbiBoYXNBcmVhbFJvb3QgaXMgc2V0IHRvIGZhbHNlIGFuZCB0aGUgcmVhbCBwYXJ0IG9mCisgICAgICogdGhlIHJvb3Qgd2l0aCBzbWFsbGVzdCBhYnNvbHV0ZSBpbWFnaW5hcnkgcGFydCBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gaGFzQXJlYWxSb290IDogYm9vbGVhbiB0cnVlIGlmIGEgcmVhbCByb290IGlzIGZvdW5kIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiAgYWJzSW1hZ2luYXJ5VGhyZXNob2xkIGNyaXRlcmlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIFxwYXJhbVtpbl0gYWJzSW1hZ2luYXJ5VGhyZXNob2xkIDogdGhyZXNob2xkIG9uIHRoZSBhYnNvbHV0ZSBpbWFnaW5hcnkgcGFydCB0byBkZWNpZGUKKyAgICAgKiAgd2hldGhlciBvciBub3QgYSByb290IGlzIHJlYWwuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIGdyZWF0ZXN0UmVhbFJvb3QoCisgICAgICAgIGJvb2wmIGhhc0FyZWFsUm9vdCwKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzSW1hZ2luYXJ5VGhyZXNob2xkID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpICkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmdyZWF0ZXI8U2NhbGFyPiBncmVhdGVyOworICAgICAgcmV0dXJuIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9SZWFsUGFydCggZ3JlYXRlciwgaGFzQXJlYWxSb290LCBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFxyZXR1cm5zIHRoZSByZWFsIHJvb3Qgd2l0aCBzbWFsbGVzdCB2YWx1ZS4KKyAgICAgKiBBIHJlYWwgcm9vdCBpcyBkZWZpbmVkIGFzIHRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IHJvb3Qgd2l0aCBhYnNvbHV0ZSBpbWFnaW5hcnkKKyAgICAgKiBwYXJ0IHNtYWxsZXN0IHRoYW4gYWJzSW1hZ2luYXJ5VGhyZXNob2xkLgorICAgICAqIGFic0ltYWdpbmFyeVRocmVzaG9sZCB0YWtlcyB0aGUgZHVtbXlfcHJlY2lzaW9uIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSBfU2NhbGFyIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aGUgUG9seW5vbWlhbFNvbHZlciBjbGFzcyBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBJZiBubyByZWFsIHJvb3QgaXMgZm91bmQgdGhlIGJvb2xlYW4gaGFzQXJlYWxSb290IGlzIHNldCB0byBmYWxzZSBhbmQgdGhlIHJlYWwgcGFydCBvZgorICAgICAqIHRoZSByb290IHdpdGggc21hbGxlc3QgYWJzb2x1dGUgaW1hZ2luYXJ5IHBhcnQgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIGhhc0FyZWFsUm9vdCA6IGJvb2xlYW4gdHJ1ZSBpZiBhIHJlYWwgcm9vdCBpcyBmb3VuZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogIGFic0ltYWdpbmFyeVRocmVzaG9sZCBjcml0ZXJpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBccGFyYW1baW5dIGFic0ltYWdpbmFyeVRocmVzaG9sZCA6IHRocmVzaG9sZCBvbiB0aGUgYWJzb2x1dGUgaW1hZ2luYXJ5IHBhcnQgdG8gZGVjaWRlCisgICAgICogIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBpcyByZWFsLgorICAgICAqLworICAgIGlubGluZSBjb25zdCBSZWFsU2NhbGFyJiBzbWFsbGVzdFJlYWxSb290KAorICAgICAgICBib29sJiBoYXNBcmVhbFJvb3QsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgc3RkOjpsZXNzPFNjYWxhcj4gbGVzczsKKyAgICAgIHJldHVybiBzZWxlY3RSZWFsUm9vdF93aXRoUmVzcGVjdFRvUmVhbFBhcnQoIGxlc3MsIGhhc0FyZWFsUm9vdCwgYWJzSW1hZ2luYXJ5VGhyZXNob2xkICk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBSb290c1R5cGUgICAgICAgICAgICAgICBtX3Jvb3RzOworfTsKKworI2RlZmluZSBFSUdFTl9QT0xZTk9NSUFMX1NPTFZFUl9CQVNFX0lOSEVSSVRFRF9UWVBFUyggQkFTRSApICBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQkFTRTo6U2NhbGFyICAgICAgICAgICAgICAgICBTY2FsYXI7ICAgICAgIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBCQVNFOjpSZWFsU2NhbGFyICAgICAgICAgICAgIFJlYWxTY2FsYXI7ICAgXAorICB0eXBlZGVmIHR5cGVuYW1lIEJBU0U6OlJvb3RUeXBlICAgICAgICAgICAgICAgUm9vdFR5cGU7ICAgICBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQkFTRTo6Um9vdHNUeXBlICAgICAgICAgICAgICBSb290c1R5cGU7CisKKworCisvKiogXGluZ3JvdXAgUG9seW5vbWlhbHNfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUG9seW5vbWlhbFNvbHZlcgorICAqCisgICogXGJyaWVmIEEgcG9seW5vbWlhbCBzb2x2ZXIKKyAgKgorICAqIENvbXB1dGVzIHRoZSBjb21wbGV4IHJvb3RzIG9mIGEgcmVhbCBwb2x5bm9taWFsLgorICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX0RlZyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYy4KKyAgKiAgICAgICAgICAgICBOb3RpY2UgdGhhdCB0aGUgbnVtYmVyIG9mIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGlzIF9EZWcrMS4KKyAgKgorICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHBvbHlub21pYWwgc29sdmVyIGFuZCBwcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgc3VjaCBhcworICAqIC0gcmVhbCByb290cywKKyAgKiAtIGdyZWF0ZXN0LCBzbWFsbGVzdCBjb21wbGV4IHJvb3RzLAorICAqIC0gcmVhbCByb290cyB3aXRoIGdyZWF0ZXN0LCBzbWFsbGVzdCBhYnNvbHV0ZSByZWFsIHZhbHVlLgorICAqIC0gZ3JlYXRlc3QsIHNtYWxsZXN0IHJlYWwgcm9vdHMuCisgICoKKyAgKiBXQVJOSU5HOiB0aGlzIHBvbHlub21pYWwgc29sdmVyIGlzIGV4cGVyaW1lbnRhbCwgcGFydCBvZiB0aGUgdW5zdXBwb3J0ZWQgRWlnZW4gbW9kdWxlcy4KKyAgKgorICAqCisgICogQ3VycmVudGx5IGEgUVIgYWxnb3JpdGhtIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlIGNvbXBhbmlvbiBtYXRyaXggb2YKKyAgKiB0aGUgcG9seW5vbWlhbCB0byBjb21wdXRlIGl0cyByb290cy4KKyAgKiBUaGlzIHN1cHBvc2VzIHRoYXQgdGhlIGNvbXBsZXggbW9kdWxpIG9mIHRoZSByb290cyBhcmUgYWxsIGRpc3RpbmN0OiBlLmcuIHRoZXJlIHNob3VsZAorICAqIGJlIG5vIG11bHRpcGxlIHJvb3RzIG9yIGNvbmp1Z2F0ZSByb290cyBmb3IgaW5zdGFuY2UuCisgICogV2l0aCAzMmJpdCAoZmxvYXQpIGZsb2F0aW5nIHR5cGVzIHRoaXMgcHJvYmxlbSBzaG93cyB1cCBmcmVxdWVudGx5LgorICAqIEhvd2V2ZXIsIGFsbW9zdCBhbHdheXMsIGNvcnJlY3QgYWNjdXJhY3kgaXMgcmVhY2hlZCBldmVuIGluIHRoZXNlIGNhc2VzIGZvciA2NGJpdAorICAqIChkb3VibGUpIGZsb2F0aW5nIHR5cGVzIGFuZCBzbWFsbCBwb2x5bm9taWFsIGRlZ3JlZSAoPDIwKS4KKyAgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RlZyA+CitjbGFzcyBQb2x5bm9taWFsU29sdmVyIDogcHVibGljIFBvbHlub21pYWxTb2x2ZXJCYXNlPF9TY2FsYXIsX0RlZz4KK3sKKyAgcHVibGljOgorICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfRGVnPT1EeW5hbWljID8gRHluYW1pYyA6IF9EZWcpCisKKyAgICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXJCYXNlPF9TY2FsYXIsX0RlZz4gICAgUFNfQmFzZTsKKyAgICBFSUdFTl9QT0xZTk9NSUFMX1NPTFZFUl9CQVNFX0lOSEVSSVRFRF9UWVBFUyggUFNfQmFzZSApCisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsX0RlZyxfRGVnPiAgICAgICAgICAgICAgICAgQ29tcGFuaW9uTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIEVpZ2VuU29sdmVyPENvbXBhbmlvbk1hdHJpeFR5cGU+ICAgICAgICAgRWlnZW5Tb2x2ZXJUeXBlOworCisgIHB1YmxpYzoKKyAgICAvKiogQ29tcHV0ZXMgdGhlIGNvbXBsZXggcm9vdHMgb2YgYSBuZXcgcG9seW5vbWlhbC4gKi8KKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICB2b2lkIGNvbXB1dGUoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCBTY2FsYXIoMCkgIT0gcG9seVtwb2x5LnNpemUoKS0xXSApOworICAgICAgZWlnZW5fYXNzZXJ0KCBwb2x5LnNpemUoKSA+IDEgKTsKKyAgICAgIGlmKHBvbHkuc2l6ZSgpID4gIDIgKQorICAgICAgeworICAgICAgICBpbnRlcm5hbDo6Y29tcGFuaW9uPFNjYWxhcixfRGVnPiBjb21wYW5pb24oIHBvbHkgKTsKKyAgICAgICAgY29tcGFuaW9uLmJhbGFuY2UoKTsKKyAgICAgICAgbV9laWdlblNvbHZlci5jb21wdXRlKCBjb21wYW5pb24uZGVuc2VNYXRyaXgoKSApOworICAgICAgICBtX3Jvb3RzID0gbV9laWdlblNvbHZlci5laWdlbnZhbHVlcygpOworICAgICAgfQorICAgICAgZWxzZSBpZihwb2x5LnNpemUgKCkgPT0gMikKKyAgICAgIHsKKyAgICAgICAgbV9yb290cy5yZXNpemUoMSk7CisgICAgICAgIG1fcm9vdHNbMF0gPSAtcG9seVswXS9wb2x5WzFdOworICAgICAgfQorICAgIH0KKworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIE90aGVyUG9seW5vbWlhbCA+CisgICAgaW5saW5lIFBvbHlub21pYWxTb2x2ZXIoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApeworICAgICAgY29tcHV0ZSggcG9seSApOyB9CisKKyAgICBpbmxpbmUgUG9seW5vbWlhbFNvbHZlcigpe30KKworICBwcm90ZWN0ZWQ6CisgICAgdXNpbmcgICAgICAgICAgICAgICAgICAgUFNfQmFzZTo6bV9yb290czsKKyAgICBFaWdlblNvbHZlclR5cGUgICAgICAgICBtX2VpZ2VuU29sdmVyOworfTsKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciA+CitjbGFzcyBQb2x5bm9taWFsU29sdmVyPF9TY2FsYXIsMT4gOiBwdWJsaWMgUG9seW5vbWlhbFNvbHZlckJhc2U8X1NjYWxhciwxPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBQb2x5bm9taWFsU29sdmVyQmFzZTxfU2NhbGFyLDE+ICAgIFBTX0Jhc2U7CisgICAgRUlHRU5fUE9MWU5PTUlBTF9TT0xWRVJfQkFTRV9JTkhFUklURURfVFlQRVMoIFBTX0Jhc2UgKQorCisgIHB1YmxpYzoKKyAgICAvKiogQ29tcHV0ZXMgdGhlIGNvbXBsZXggcm9vdHMgb2YgYSBuZXcgcG9seW5vbWlhbC4gKi8KKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICB2b2lkIGNvbXB1dGUoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCBwb2x5LnNpemUoKSA9PSAyICk7CisgICAgICBlaWdlbl9hc3NlcnQoIFNjYWxhcigwKSAhPSBwb2x5WzFdICk7CisgICAgICBtX3Jvb3RzWzBdID0gLXBvbHlbMF0vcG9seVsxXTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBPdGhlclBvbHlub21pYWwgPgorICAgIGlubGluZSBQb2x5bm9taWFsU29sdmVyKCBjb25zdCBPdGhlclBvbHlub21pYWwmIHBvbHkgKXsKKyAgICAgIGNvbXB1dGUoIHBvbHkgKTsgfQorCisgICAgaW5saW5lIFBvbHlub21pYWxTb2x2ZXIoKXt9CisKKyAgcHJvdGVjdGVkOgorICAgIHVzaW5nICAgICAgICAgICAgICAgICAgIFBTX0Jhc2U6Om1fcm9vdHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BPTFlOT01JQUxfU09MVkVSX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Qb2x5bm9taWFsVXRpbHMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Qb2x5bm9taWFsVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGJhNjViCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzL1BvbHlub21pYWxVdGlscy5oCkBAIC0wLDAgKzEsMTQzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBNYW51ZWwgWWd1ZWwgPG1hbnVlbC55Z3VlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BPTFlOT01JQUxfVVRJTFNfSAorI2RlZmluZSBFSUdFTl9QT0xZTk9NSUFMX1VUSUxTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKyAqIFxyZXR1cm5zIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBwb2x5bm9taWFsIGF0IHggdXNpbmcgSG9ybmVyIGFsZ29yaXRobS4KKyAqCisgKiBccGFyYW1baW5dIHBvbHkgOiB0aGUgdmVjdG9yIG9mIGNvZWZmaWNpZW50cyBvZiB0aGUgcG9seW5vbWlhbCBvcmRlcmVkCisgKiAgYnkgZGVncmVlcyBpLmUuIHBvbHlbaV0gaXMgdGhlIGNvZWZmaWNpZW50IG9mIGRlZ3JlZSBpIG9mIHRoZSBwb2x5bm9taWFsCisgKiAgZS5nLiBcZiQgMSArIDN4XjIgXGYkIGlzIHN0b3JlZCBhcyBhIHZlY3RvciBcZiQgWyAxLCAwLCAzIF0gXGYkLgorICogXHBhcmFtW2luXSB4IDogdGhlIHZhbHVlIHRvIGV2YWx1YXRlIHRoZSBwb2x5bm9taWFsIGF0LgorICoKKyAqIDxpPjxiPk5vdGUgZm9yIHN0YWJpbGl0eTo8L2I+PC9pPgorICogIDxkZD4gXGYkIHx4fCBcbGUgMSBcZiQgPC9kZD4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFBvbHlub21pYWxzLCB0eXBlbmFtZSBUPgoraW5saW5lCitUIHBvbHlfZXZhbF9ob3JuZXIoIGNvbnN0IFBvbHlub21pYWxzJiBwb2x5LCBjb25zdCBUJiB4ICkKK3sKKyAgVCB2YWw9cG9seVtwb2x5LnNpemUoKS0xXTsKKyAgZm9yKERlbnNlSW5kZXggaT1wb2x5LnNpemUoKS0yOyBpPj0wOyAtLWkgKXsKKyAgICB2YWwgPSB2YWwqeCArIHBvbHlbaV07IH0KKyAgcmV0dXJuIHZhbDsKK30KKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogXHJldHVybnMgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHBvbHlub21pYWwgYXQgeCB1c2luZyBzdGFiaWxpemVkIEhvcm5lciBhbGdvcml0aG0uCisgKgorICogXHBhcmFtW2luXSBwb2x5IDogdGhlIHZlY3RvciBvZiBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgb3JkZXJlZAorICogIGJ5IGRlZ3JlZXMgaS5lLiBwb2x5W2ldIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZWdyZWUgaSBvZiB0aGUgcG9seW5vbWlhbAorICogIGUuZy4gXGYkIDEgKyAzeF4yIFxmJCBpcyBzdG9yZWQgYXMgYSB2ZWN0b3IgXGYkIFsgMSwgMCwgMyBdIFxmJC4KKyAqIFxwYXJhbVtpbl0geCA6IHRoZSB2YWx1ZSB0byBldmFsdWF0ZSB0aGUgcG9seW5vbWlhbCBhdC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFBvbHlub21pYWxzLCB0eXBlbmFtZSBUPgoraW5saW5lCitUIHBvbHlfZXZhbCggY29uc3QgUG9seW5vbWlhbHMmIHBvbHksIGNvbnN0IFQmIHggKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBSZWFsOworCisgIGlmKCBudW1leHQ6OmFiczIoIHggKSA8PSBSZWFsKDEpICl7CisgICAgcmV0dXJuIHBvbHlfZXZhbF9ob3JuZXIoIHBvbHksIHggKTsgfQorICBlbHNlCisgIHsKKyAgICBUIHZhbD1wb2x5WzBdOworICAgIFQgaW52X3ggPSBUKDEpL3g7CisgICAgZm9yKCBEZW5zZUluZGV4IGk9MTsgaTxwb2x5LnNpemUoKTsgKytpICl7CisgICAgICB2YWwgPSB2YWwqaW52X3ggKyBwb2x5W2ldOyB9CisKKyAgICByZXR1cm4gbnVtZXh0Ojpwb3coeCwoVCkocG9seS5zaXplKCktMSkpICogdmFsOworICB9Cit9CisKKy8qKiBcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKyAqIFxyZXR1cm5zIGEgbWF4aW11bSBib3VuZCBmb3IgdGhlIGFic29sdXRlIHZhbHVlIG9mIGFueSByb290IG9mIHRoZSBwb2x5bm9taWFsLgorICoKKyAqIFxwYXJhbVtpbl0gcG9seSA6IHRoZSB2ZWN0b3Igb2YgY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIG9yZGVyZWQKKyAqICBieSBkZWdyZWVzIGkuZS4gcG9seVtpXSBpcyB0aGUgY29lZmZpY2llbnQgb2YgZGVncmVlIGkgb2YgdGhlIHBvbHlub21pYWwKKyAqICBlLmcuIFxmJCAxICsgM3heMiBcZiQgaXMgc3RvcmVkIGFzIGEgdmVjdG9yIFxmJCBbIDEsIDAsIDMgXSBcZiQuCisgKgorICogIDxpPjxiPlByZWNvbmRpdGlvbjo8L2I+PC9pPgorICogIDxkZD4gdGhlIGxlYWRpbmcgY29lZmZpY2llbnQgb2YgdGhlIGlucHV0IHBvbHlub21pYWwgcG9seSBtdXN0IGJlIG5vbiB6ZXJvIDwvZGQ+CisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2x5bm9taWFsPgoraW5saW5lCit0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgUG9seW5vbWlhbDo6U2NhbGFyPjo6UmVhbCBjYXVjaHlfbWF4X2JvdW5kKCBjb25zdCBQb2x5bm9taWFsJiBwb2x5ICkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHR5cGVkZWYgdHlwZW5hbWUgUG9seW5vbWlhbDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsOworCisgIGVpZ2VuX2Fzc2VydCggU2NhbGFyKDApICE9IHBvbHlbcG9seS5zaXplKCktMV0gKTsKKyAgY29uc3QgU2NhbGFyIGludl9sZWFkaW5nX2NvZWZmID0gU2NhbGFyKDEpL3BvbHlbcG9seS5zaXplKCktMV07CisgIFJlYWwgY2IoMCk7CisKKyAgZm9yKCBEZW5zZUluZGV4IGk9MDsgaTxwb2x5LnNpemUoKS0xOyArK2kgKXsKKyAgICBjYiArPSBhYnMocG9seVtpXSppbnZfbGVhZGluZ19jb2VmZik7IH0KKyAgcmV0dXJuIGNiICsgUmVhbCgxKTsKK30KKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogXHJldHVybnMgYSBtaW5pbXVtIGJvdW5kIGZvciB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYW55IG5vbiB6ZXJvIHJvb3Qgb2YgdGhlIHBvbHlub21pYWwuCisgKiBccGFyYW1baW5dIHBvbHkgOiB0aGUgdmVjdG9yIG9mIGNvZWZmaWNpZW50cyBvZiB0aGUgcG9seW5vbWlhbCBvcmRlcmVkCisgKiAgYnkgZGVncmVlcyBpLmUuIHBvbHlbaV0gaXMgdGhlIGNvZWZmaWNpZW50IG9mIGRlZ3JlZSBpIG9mIHRoZSBwb2x5bm9taWFsCisgKiAgZS5nLiBcZiQgMSArIDN4XjIgXGYkIGlzIHN0b3JlZCBhcyBhIHZlY3RvciBcZiQgWyAxLCAwLCAzIF0gXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9seW5vbWlhbD4KK2lubGluZQordHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIFBvbHlub21pYWw6OlNjYWxhcj46OlJlYWwgY2F1Y2h5X21pbl9ib3VuZCggY29uc3QgUG9seW5vbWlhbCYgcG9seSApCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB0eXBlZGVmIHR5cGVuYW1lIFBvbHlub21pYWw6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbDsKKworICBEZW5zZUluZGV4IGk9MDsKKyAgd2hpbGUoIGk8cG9seS5zaXplKCktMSAmJiBTY2FsYXIoMCkgPT0gcG9seShpKSApeyArK2k7IH0KKyAgaWYoIHBvbHkuc2l6ZSgpLTEgPT0gaSApeworICAgIHJldHVybiBSZWFsKDEpOyB9CisKKyAgY29uc3QgU2NhbGFyIGludl9taW5fY29lZmYgPSBTY2FsYXIoMSkvcG9seVtpXTsKKyAgUmVhbCBjYigxKTsKKyAgZm9yKCBEZW5zZUluZGV4IGo9aSsxOyBqPHBvbHkuc2l6ZSgpOyArK2ogKXsKKyAgICBjYiArPSBhYnMocG9seVtqXSppbnZfbWluX2NvZWZmKTsgfQorICByZXR1cm4gUmVhbCgxKS9jYjsKK30KKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogR2l2ZW4gdGhlIHJvb3RzIG9mIGEgcG9seW5vbWlhbCBjb21wdXRlIHRoZSBjb2VmZmljaWVudHMgaW4gdGhlCisgKiBtb25vbWlhbCBiYXNpcyBvZiB0aGUgbW9uaWMgcG9seW5vbWlhbCB3aXRoIHNhbWUgcm9vdHMgYW5kIG1pbmltYWwgZGVncmVlLgorICogSWYgUm9vdFZlY3RvciBpcyBhIHZlY3RvciBvZiBjb21wbGV4ZXMsIFBvbHlub21pYWwgc2hvdWxkIGFsc28gYmUgYSB2ZWN0b3IKKyAqIG9mIGNvbXBsZXhlcy4KKyAqIFxwYXJhbVtpbl0gcnYgOiBhIHZlY3RvciBjb250YWluaW5nIHRoZSByb290cyBvZiBhIHBvbHlub21pYWwuCisgKiBccGFyYW1bb3V0XSBwb2x5IDogdGhlIHZlY3RvciBvZiBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgb3JkZXJlZAorICogIGJ5IGRlZ3JlZXMgaS5lLiBwb2x5W2ldIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZWdyZWUgaSBvZiB0aGUgcG9seW5vbWlhbAorICogIGUuZy4gXGYkIDMgKyB4XjIgXGYkIGlzIHN0b3JlZCBhcyBhIHZlY3RvciBcZiQgWyAzLCAwLCAxIF0gXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUm9vdFZlY3RvciwgdHlwZW5hbWUgUG9seW5vbWlhbD4KK3ZvaWQgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCBjb25zdCBSb290VmVjdG9yJiBydiwgUG9seW5vbWlhbCYgcG9seSApCit7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBQb2x5bm9taWFsOjpTY2FsYXIgU2NhbGFyOworCisgIHBvbHkuc2V0WmVybyggcnYuc2l6ZSgpKzEgKTsKKyAgcG9seVswXSA9IC1ydlswXTsgcG9seVsxXSA9IFNjYWxhcigxKTsKKyAgZm9yKCBEZW5zZUluZGV4IGk9MTsgaTwgcnYuc2l6ZSgpOyArK2kgKQorICB7CisgICAgZm9yKCBEZW5zZUluZGV4IGo9aSsxOyBqPjA7IC0taiApeyBwb2x5W2pdID0gcG9seVtqLTFdIC0gcnZbaV0qcG9seVtqXTsgfQorICAgIHBvbHlbMF0gPSAtcnZbaV0qcG9seVswXTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BPTFlOT01JQUxfVVRJTFNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZUlucGxhY2VMVS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZUlucGxhY2VMVS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjU0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lSW5wbGFjZUxVLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEd1aWxsYXVtZSBTYXVwaW4gPGd1aWxsYXVtZS5zYXVwaW5AY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TS1lMSU5FSU5QTEFDRUxVX0gKKyNkZWZpbmUgRUlHRU5fU0tZTElORUlOUExBQ0VMVV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgU2t5bGluZV9Nb2R1bGUKKyAqCisgKiBcY2xhc3MgU2t5bGluZUlucGxhY2VMVQorICoKKyAqIFxicmllZiBJbnBsYWNlIExVIGRlY29tcG9zaXRpb24gb2YgYSBza3lsaW5lIG1hdHJpeCBhbmQgYXNzb2NpYXRlZCBmZWF0dXJlcworICoKKyAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgTFUgZmFjdG9yaXphdGlvbgorICoKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIFNreWxpbmVJbnBsYWNlTFUgeworcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworcHVibGljOgorCisgICAgLyoqIENyZWF0ZXMgYSBMVSBvYmplY3QgYW5kIGNvbXB1dGUgdGhlIHJlc3BlY3RpdmUgZmFjdG9yaXphdGlvbiBvZiBcYSBtYXRyaXggdXNpbmcKKyAgICAgKiBmbGFncyBcYSBmbGFncy4gKi8KKyAgICBTa3lsaW5lSW5wbGFjZUxVKE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IGZsYWdzID0gMCkKKyAgICA6IC8qbV9tYXRyaXgobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksKi8gbV9mbGFncyhmbGFncyksIG1fc3RhdHVzKDApLCBtX2x1KG1hdHJpeCkgeworICAgICAgICBtX3ByZWNpc2lvbiA9IFJlYWxTY2FsYXIoMC4xKSAqIEVpZ2VuOjpkdW1teV9wcmVjaXNpb248UmVhbFNjYWxhciA+ICgpOworICAgICAgICBtX2x1LklzUm93TWFqb3IgPyBjb21wdXRlUm93TWFqb3IoKSA6IGNvbXB1dGUoKTsKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgcmVsYXRpdmUgdGhyZXNob2xkIHZhbHVlIHVzZWQgdG8gcHJ1bmUgemVybyBjb2VmZmljaWVudHMgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLgorICAgICAqCisgICAgICogU2V0dGluZyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIHNwZWVkcyB1cCBjb21wdXRhdGlvbiwgYW5kIHlpZWxkcyB0byBhbiBpbWNvbXBsZXRlCisgICAgICogZmFjdG9yaXphdGlvbiB3aXRoIGZld2VyIG5vbiB6ZXJvIGNvZWZmaWNpZW50cy4gU3VjaCBhcHByb3hpbWF0ZSBmYWN0b3JzIGFyZSBlc3BlY2lhbGx5CisgICAgICogdXNlZnVsIHRvIGluaXRpYWxpemUgYW4gaXRlcmF0aXZlIHNvbHZlci4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgZXhhY3QgbWVhbmluZyBvZiB0aGlzIHBhcmFtZXRlciBtaWdodCBkZXBlbmRzIG9uIHRoZSBhY3R1YWwKKyAgICAgKiBiYWNrZW5kLiBNb3Jlb3Zlciwgbm90IGFsbCBiYWNrZW5kcyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKyAgICAgKgorICAgICAqIFxzYSBwcmVjaXNpb24oKSAqLworICAgIHZvaWQgc2V0UHJlY2lzaW9uKFJlYWxTY2FsYXIgdikgeworICAgICAgICBtX3ByZWNpc2lvbiA9IHY7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHByZWNpc2lvbi4KKyAgICAgKgorICAgICAqIFxzYSBzZXRQcmVjaXNpb24oKSAqLworICAgIFJlYWxTY2FsYXIgcHJlY2lzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9wcmVjaXNpb247CisgICAgfQorCisgICAgLyoqIFNldHMgdGhlIGZsYWdzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqICAtIENvbXBsZXRlRmFjdG9yaXphdGlvbgorICAgICAqICAtIEluY29tcGxldGVGYWN0b3JpemF0aW9uCisgICAgICogIC0gTWVtb3J5RWZmaWNpZW50CisgICAgICogIC0gb25lIG9mIHRoZSBvcmRlcmluZyBtZXRob2RzCisgICAgICogIC0gZXRjLi4uCisgICAgICoKKyAgICAgKiBcc2EgZmxhZ3MoKSAqLworICAgIHZvaWQgc2V0RmxhZ3MoaW50IGYpIHsKKyAgICAgICAgbV9mbGFncyA9IGY7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjdXJyZW50IGZsYWdzICovCisgICAgaW50IGZsYWdzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9mbGFnczsKKyAgICB9CisKKyAgICB2b2lkIHNldE9yZGVyaW5nTWV0aG9kKGludCBtKSB7CisgICAgICAgIG1fZmxhZ3MgPSBtOworICAgIH0KKworICAgIGludCBvcmRlcmluZ01ldGhvZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZmxhZ3M7CisgICAgfQorCisgICAgLyoqIENvbXB1dGVzL3JlLWNvbXB1dGVzIHRoZSBMVSBmYWN0b3JpemF0aW9uICovCisgICAgdm9pZCBjb21wdXRlKCk7CisgICAgdm9pZCBjb21wdXRlUm93TWFqb3IoKTsKKworICAgIC8qKiBccmV0dXJucyB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggTCAqLworICAgIC8vaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeEwoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeEw7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggVSAqLworICAgIC8vaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeFU7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJEZXJpdmVkLCB0eXBlbmFtZSBYRGVyaXZlZD4KKyAgICBib29sIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiogeCwKKyAgICAgICAgICAgIGNvbnN0IGludCB0cmFuc3Bvc2VkID0gMCkgY29uc3Q7CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgZmFjdG9yaXphdGlvbiBzdWNjZWVkZWQgKi8KKyAgICBpbmxpbmUgYm9vbCBzdWNjZWVkZWQodm9pZCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9zdWNjZWVkZWQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgUmVhbFNjYWxhciBtX3ByZWNpc2lvbjsKKyAgICBpbnQgbV9mbGFnczsKKyAgICBtdXRhYmxlIGludCBtX3N0YXR1czsKKyAgICBib29sIG1fc3VjY2VlZGVkOworICAgIE1hdHJpeFR5cGUmIG1fbHU7Cit9OworCisvKiogQ29tcHV0ZXMgLyByZWNvbXB1dGVzIHRoZSBpbiBwbGFjZSBMVSBkZWNvbXBvc2l0aW9uIG9mIHRoZSBTa3lsaW5lSW5wbGFjZUxVLgorICogdXNpbmcgdGhlIGRlZmF1bHQgYWxnb3JpdGhtLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorLy90ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPgordm9pZCBTa3lsaW5lSW5wbGFjZUxVPE1hdHJpeFR5cGU+Ojpjb21wdXRlKCkgeworICAgIGNvbnN0IHNpemVfdCByb3dzID0gbV9sdS5yb3dzKCk7CisgICAgY29uc3Qgc2l6ZV90IGNvbHMgPSBtX2x1LmNvbHMoKTsKKworICAgIGVpZ2VuX2Fzc2VydChyb3dzID09IGNvbHMgJiYgIldlIGRvIG5vdCAoeWV0KSBzdXBwb3J0IHJlY3Rhbmd1bGFyIExVLiIpOworICAgIGVpZ2VuX2Fzc2VydCghbV9sdS5Jc1Jvd01ham9yICYmICJMVSBkZWNvbXBvc2l0aW9uIGRvZXMgbm90IHdvcmsgd2l0aCByb3dNYWpvciBTdG9yYWdlIik7CisKKyAgICBmb3IgKEluZGV4IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBwaXZvdCA9IG1fbHUuY29lZmZEaWFnKHJvdyk7CisKKyAgICAgICAgLy9Mb3dlciBtYXRyaXggQ29sdW1ucyB1cGRhdGUKKyAgICAgICAgY29uc3QgSW5kZXgmIGNvbCA9IHJvdzsKKyAgICAgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0KG1fbHUsIGNvbCk7IGxJdDsgKytsSXQpIHsKKyAgICAgICAgICAgIGxJdC52YWx1ZVJlZigpIC89IHBpdm90OworICAgICAgICB9CisKKyAgICAgICAgLy9VcHBlciBtYXRyaXggdXBkYXRlIC0+IGNvbnRpZ3VvdXMgbWVtb3J5IGFjY2VzcworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0KG1fbHUsIGNvbCk7CisgICAgICAgIGZvciAoSW5kZXggcnJvdyA9IHJvdyArIDE7IHJyb3cgPCBtX2x1LnJvd3MoKTsgcnJvdysrKSB7CisgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lclVwcGVySXRlcmF0b3IgdUl0UGl2b3QobV9sdSwgcm93KTsKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgcnJvdyk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgY29lZiA9IGxJdC52YWx1ZSgpOworCisgICAgICAgICAgICB1SXRQaXZvdCArPSAocnJvdyAtIHJvdyAtIDEpOworCisgICAgICAgICAgICAvL3VwZGF0ZSB1cHBlciBwYXJ0ICAtPiBjb250aWd1b3VzIG1lbW9yeSBhY2Nlc3MKKyAgICAgICAgICAgIGZvciAoKyt1SXRQaXZvdDsgdUl0ICYmIHVJdFBpdm90OykgeworICAgICAgICAgICAgICAgIHVJdC52YWx1ZVJlZigpIC09IHVJdFBpdm90LnZhbHVlKCkgKiBjb2VmOworCisgICAgICAgICAgICAgICAgKyt1SXQ7CisgICAgICAgICAgICAgICAgKyt1SXRQaXZvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbEl0OworICAgICAgICB9CisKKyAgICAgICAgLy9VcHBlciBtYXRyaXggdXBkYXRlIC0+IG5vbiBjb250aWd1b3VzIG1lbW9yeSBhY2Nlc3MKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJMb3dlckl0ZXJhdG9yIGxJdDMobV9sdSwgY29sKTsKKyAgICAgICAgZm9yIChJbmRleCBycm93ID0gcm93ICsgMTsgcnJvdyA8IG1fbHUucm93cygpOyBycm93KyspIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXRQaXZvdChtX2x1LCByb3cpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIGNvZWYgPSBsSXQzLnZhbHVlKCk7CisKKyAgICAgICAgICAgIC8vdXBkYXRlIGxvd2VyIHBhcnQgLT4gIG5vbiBjb250aWd1b3VzIG1lbW9yeSBhY2Nlc3MKKyAgICAgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBycm93IC0gcm93IC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbV9sdS5jb2VmZlJlZkxvd2VyKHJyb3csIHJvdyArIGkgKyAxKSAtPSB1SXRQaXZvdC52YWx1ZSgpICogY29lZjsKKyAgICAgICAgICAgICAgICArK3VJdFBpdm90OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsSXQzOworICAgICAgICB9CisgICAgICAgIC8vdXBkYXRlIGRpYWcgLT4gY29udGlndW91cworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0MihtX2x1LCBjb2wpOworICAgICAgICBmb3IgKEluZGV4IHJyb3cgPSByb3cgKyAxOyBycm93IDwgbV9sdS5yb3dzKCk7IHJyb3crKykgeworCisgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lclVwcGVySXRlcmF0b3IgdUl0UGl2b3QobV9sdSwgcm93KTsKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgcnJvdyk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgY29lZiA9IGxJdDIudmFsdWUoKTsKKworICAgICAgICAgICAgdUl0UGl2b3QgKz0gKHJyb3cgLSByb3cgLSAxKTsKKyAgICAgICAgICAgIG1fbHUuY29lZmZSZWZEaWFnKHJyb3cpIC09IHVJdFBpdm90LnZhbHVlKCkgKiBjb2VmOworICAgICAgICAgICAgKytsSXQyOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBTa3lsaW5lSW5wbGFjZUxVPE1hdHJpeFR5cGU+Ojpjb21wdXRlUm93TWFqb3IoKSB7CisgICAgY29uc3Qgc2l6ZV90IHJvd3MgPSBtX2x1LnJvd3MoKTsKKyAgICBjb25zdCBzaXplX3QgY29scyA9IG1fbHUuY29scygpOworCisgICAgZWlnZW5fYXNzZXJ0KHJvd3MgPT0gY29scyAmJiAiV2UgZG8gbm90ICh5ZXQpIHN1cHBvcnQgcmVjdGFuZ3VsYXIgTFUuIik7CisgICAgZWlnZW5fYXNzZXJ0KG1fbHUuSXNSb3dNYWpvciAmJiAiWW91J3JlIHRyeWluZyB0byBhcHBseSByb3dNYWpvciBkZWNvbXBvc2l0aW9uIG9uIGEgQ29sTWFqb3IgbWF0cml4ICEiKTsKKworICAgIGZvciAoSW5kZXggcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHsKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJMb3dlckl0ZXJhdG9yIGxsSXQobV9sdSwgcm93KTsKKworCisgICAgICAgIGZvciAoSW5kZXggY29sID0gbGxJdC5jb2woKTsgY29sIDwgcm93OyBjb2wrKykgeworICAgICAgICAgICAgaWYgKG1fbHUuY29lZmZFeGlzdExvd2VyKHJvdywgY29sKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBkaWFnID0gbV9sdS5jb2VmZkRpYWcoY29sKTsKKworICAgICAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgcm93KTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lclVwcGVySXRlcmF0b3IgdUl0KG1fbHUsIGNvbCk7CisKKworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG9mZnNldCA9IGxJdC5jb2woKSAtIHVJdC5yb3coKTsKKworCisgICAgICAgICAgICAgICAgSW5kZXggc3RvcCA9IG9mZnNldCA+IDAgPyBjb2wgLSBsSXQuY29sKCkgOiBjb2wgLSB1SXQucm93KCk7CisKKyAgICAgICAgICAgICAgICAvLyNkZWZpbmUgVkVDVE9SSVpFCisjaWZkZWYgVkVDVE9SSVpFCisgICAgICAgICAgICAgICAgTWFwPFZlY3RvclhkID4gcm93VmFsKGxJdC52YWx1ZVB0cigpICsgKG9mZnNldCA+IDAgPyAwIDogLW9mZnNldCksIHN0b3ApOworICAgICAgICAgICAgICAgIE1hcDxWZWN0b3JYZCA+IGNvbFZhbCh1SXQudmFsdWVQdHIoKSArIChvZmZzZXQgPiAwID8gb2Zmc2V0IDogMCksIHN0b3ApOworCisKKyAgICAgICAgICAgICAgICBTY2FsYXIgbmV3Q29lZmYgPSBtX2x1LmNvZWZmTG93ZXIocm93LCBjb2wpIC0gcm93VmFsLmRvdChjb2xWYWwpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgLy9Ta2lwIHplcm8gdmFsdWUgb2YgbEl0CisgICAgICAgICAgICAgICAgICAgIHVJdCArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgZWxzZSAvL1NraXAgemVybyB2YWx1ZXMgb2YgdUl0CisgICAgICAgICAgICAgICAgICAgIGxJdCArPSAtb2Zmc2V0OworICAgICAgICAgICAgICAgIFNjYWxhciBuZXdDb2VmZiA9IG1fbHUuY29lZmZMb3dlcihyb3csIGNvbCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgc3RvcDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0bXAgPSBuZXdDb2VmZjsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29lZmYgPSB0bXAgLSBsSXQudmFsdWUoKSAqIHVJdC52YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICArK2xJdDsKKyAgICAgICAgICAgICAgICAgICAgKyt1SXQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBtX2x1LmNvZWZmUmVmTG93ZXIocm93LCBjb2wpID0gbmV3Q29lZmYgLyBkaWFnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9VcHBlciBtYXRyaXggdXBkYXRlCisgICAgICAgIGNvbnN0IEluZGV4IGNvbCA9IHJvdzsKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHV1SXQobV9sdSwgY29sKTsKKyAgICAgICAgZm9yIChJbmRleCBycm93ID0gdXVJdC5yb3coKTsgcnJvdyA8IGNvbDsgcnJvdysrKSB7CisKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgcnJvdyk7CisgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lclVwcGVySXRlcmF0b3IgdUl0KG1fbHUsIGNvbCk7CisgICAgICAgICAgICBjb25zdCBJbmRleCBvZmZzZXQgPSBsSXQuY29sKCkgLSB1SXQucm93KCk7CisKKyAgICAgICAgICAgIEluZGV4IHN0b3AgPSBvZmZzZXQgPiAwID8gcnJvdyAtIGxJdC5jb2woKSA6IHJyb3cgLSB1SXQucm93KCk7CisKKyNpZmRlZiBWRUNUT1JJWkUKKyAgICAgICAgICAgIE1hcDxWZWN0b3JYZCA+IHJvd1ZhbChsSXQudmFsdWVQdHIoKSArIChvZmZzZXQgPiAwID8gMCA6IC1vZmZzZXQpLCBzdG9wKTsKKyAgICAgICAgICAgIE1hcDxWZWN0b3JYZCA+IGNvbFZhbCh1SXQudmFsdWVQdHIoKSArIChvZmZzZXQgPiAwID8gb2Zmc2V0IDogMCksIHN0b3ApOworCisgICAgICAgICAgICBTY2FsYXIgbmV3Q29lZmYgPSBtX2x1LmNvZWZmVXBwZXIocnJvdywgY29sKSAtIHJvd1ZhbC5kb3QoY29sVmFsKTsKKyNlbHNlCisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgLy9Ta2lwIHplcm8gdmFsdWUgb2YgbEl0CisgICAgICAgICAgICAgICAgdUl0ICs9IG9mZnNldDsKKyAgICAgICAgICAgIGVsc2UgLy9Ta2lwIHplcm8gdmFsdWVzIG9mIHVJdAorICAgICAgICAgICAgICAgIGxJdCArPSAtb2Zmc2V0OworICAgICAgICAgICAgU2NhbGFyIG5ld0NvZWZmID0gbV9sdS5jb2VmZlVwcGVyKHJyb3csIGNvbCk7CisgICAgICAgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgc3RvcDsgKytrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRtcCA9IG5ld0NvZWZmOworICAgICAgICAgICAgICAgIG5ld0NvZWZmID0gdG1wIC0gbEl0LnZhbHVlKCkgKiB1SXQudmFsdWUoKTsKKworICAgICAgICAgICAgICAgICsrbEl0OworICAgICAgICAgICAgICAgICsrdUl0OworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBtX2x1LmNvZWZmUmVmVXBwZXIocnJvdywgY29sKSA9IG5ld0NvZWZmOworICAgICAgICB9CisKKworICAgICAgICAvL0RpYWcgbWF0cml4IHVwZGF0ZQorICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0KG1fbHUsIHJvdyk7CisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgcm93KTsKKworICAgICAgICBjb25zdCBJbmRleCBvZmZzZXQgPSBsSXQuY29sKCkgLSB1SXQucm93KCk7CisKKworICAgICAgICBJbmRleCBzdG9wID0gb2Zmc2V0ID4gMCA/IGxJdC5zaXplKCkgOiB1SXQuc2l6ZSgpOworI2lmZGVmIFZFQ1RPUklaRQorICAgICAgICBNYXA8VmVjdG9yWGQgPiByb3dWYWwobEl0LnZhbHVlUHRyKCkgKyAob2Zmc2V0ID4gMCA/IDAgOiAtb2Zmc2V0KSwgc3RvcCk7CisgICAgICAgIE1hcDxWZWN0b3JYZCA+IGNvbFZhbCh1SXQudmFsdWVQdHIoKSArIChvZmZzZXQgPiAwID8gb2Zmc2V0IDogMCksIHN0b3ApOworICAgICAgICBTY2FsYXIgbmV3Q29lZmYgPSBtX2x1LmNvZWZmRGlhZyhyb3cpIC0gcm93VmFsLmRvdChjb2xWYWwpOworI2Vsc2UKKyAgICAgICAgaWYgKG9mZnNldCA+IDApIC8vU2tpcCB6ZXJvIHZhbHVlIG9mIGxJdAorICAgICAgICAgICAgdUl0ICs9IG9mZnNldDsKKyAgICAgICAgZWxzZSAvL1NraXAgemVybyB2YWx1ZXMgb2YgdUl0CisgICAgICAgICAgICBsSXQgKz0gLW9mZnNldDsKKyAgICAgICAgU2NhbGFyIG5ld0NvZWZmID0gbV9sdS5jb2VmZkRpYWcocm93KTsKKyAgICAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IHN0b3A7ICsraykgeworICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRtcCA9IG5ld0NvZWZmOworICAgICAgICAgICAgbmV3Q29lZmYgPSB0bXAgLSBsSXQudmFsdWUoKSAqIHVJdC52YWx1ZSgpOworICAgICAgICAgICAgKytsSXQ7CisgICAgICAgICAgICArK3VJdDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG1fbHUuY29lZmZSZWZEaWFnKHJvdykgPSBuZXdDb2VmZjsKKyAgICB9Cit9CisKKy8qKiBDb21wdXRlcyAqeCA9IFVeLTEgTF4tMSBiCisgKgorICogSWYgXGEgdHJhbnNwb3NlIGlzIHNldCB0byBTdlRyYW5zcG9zZSBvciBTdkFkam9pbnQsIHRoZSBzb2x1dGlvbgorICogb2YgdGhlIHRyYW5zcG9zZWQvYWRqb2ludCBzeXN0ZW0gaXMgY29tcHV0ZWQgaW5zdGVhZC4KKyAqCisgKiBOb3QgYWxsIGJhY2tlbmRzIGltcGxlbWVudCB0aGUgc29sdXRpb24gb2YgdGhlIHRyYW5zcG9zZWQgb3IKKyAqIGFkam9pbnQgc3lzdGVtLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgQkRlcml2ZWQsIHR5cGVuYW1lIFhEZXJpdmVkPgorYm9vbCBTa3lsaW5lSW5wbGFjZUxVPE1hdHJpeFR5cGU+Ojpzb2x2ZShjb25zdCBNYXRyaXhCYXNlPEJEZXJpdmVkPiAmYiwgTWF0cml4QmFzZTxYRGVyaXZlZD4qIHgsIGNvbnN0IGludCB0cmFuc3Bvc2VkKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IHJvd3MgPSBtX2x1LnJvd3MoKTsKKyAgICBjb25zdCBzaXplX3QgY29scyA9IG1fbHUuY29scygpOworCisKKyAgICBmb3IgKEluZGV4IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7CisgICAgICAgIHgtPmNvZWZmUmVmKHJvdykgPSBiLmNvZWZmKHJvdyk7CisgICAgICAgIFNjYWxhciBuZXdWYWwgPSB4LT5jb2VmZihyb3cpOworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0KG1fbHUsIHJvdyk7CisKKyAgICAgICAgSW5kZXggY29sID0gbEl0LmNvbCgpOworICAgICAgICB3aGlsZSAobEl0LmNvbCgpIDwgcm93KSB7CisKKyAgICAgICAgICAgIG5ld1ZhbCAtPSB4LT5jb2VmZihjb2wrKykgKiBsSXQudmFsdWUoKTsKKyAgICAgICAgICAgICsrbEl0OworICAgICAgICB9CisKKyAgICAgICAgeC0+Y29lZmZSZWYocm93KSA9IG5ld1ZhbDsKKyAgICB9CisKKworICAgIGZvciAoSW5kZXggY29sID0gcm93cyAtIDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAgIHgtPmNvZWZmUmVmKGNvbCkgPSB4LT5jb2VmZihjb2wpIC8gbV9sdS5jb2VmZkRpYWcoY29sKTsKKworICAgICAgICBjb25zdCBTY2FsYXIgeF9jb2wgPSB4LT5jb2VmZihjb2wpOworCisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgY29sKTsKKyAgICAgICAgdUl0ICs9IHVJdC5zaXplKCktMTsKKworCisgICAgICAgIHdoaWxlICh1SXQpIHsKKyAgICAgICAgICAgIHgtPmNvZWZmUmVmKHVJdC5yb3coKSkgLT0geF9jb2wgKiB1SXQudmFsdWUoKTsKKyAgICAgICAgICAgIC8vVE9ETyA6IGludHJvZHVjZSAtLW9wZXJhdG9yCisgICAgICAgICAgICB1SXQgKz0gLTE7CisgICAgICAgIH0KKworCisgICAgfQorICAgIHgtPmNvZWZmUmVmKDApID0geC0+Y29lZmYoMCkgLyBtX2x1LmNvZWZmRGlhZygwKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NLWUxJTkVMVV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lTWF0cml4LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhODkzMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXguaApAQCAtMCwwICsxLDg2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHdWlsbGF1bWUgU2F1cGluIDxndWlsbGF1bWUuc2F1cGluQGNlYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0tZTElORU1BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1NLWUxJTkVNQVRSSVhfSAorCisjaW5jbHVkZSAiU2t5bGluZVN0b3JhZ2UuaCIKKyNpbmNsdWRlICJTa3lsaW5lTWF0cml4QmFzZS5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFNreWxpbmVfTW9kdWxlCisgKgorICogXGNsYXNzIFNreWxpbmVNYXRyaXgKKyAqCisgKiBcYnJpZWYgVGhlIG1haW4gc2t5bGluZSBtYXRyaXggY2xhc3MKKyAqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBza3lsaW5lIG1hdHJpeCB1c2luZyB0aGUgdmVyeSB1bmNvbW1vbiBzdG9yYWdlCisgKiBzY2hlbWUuCisgKgorICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMKKyAqIFxwYXJhbSBfT3B0aW9ucyBVbmlvbiBvZiBiaXQgZmxhZ3MgY29udHJvbGxpbmcgdGhlIHN0b3JhZ2Ugc2NoZW1lLiBDdXJyZW50bHkgdGhlIG9ubHkgcG9zc2liaWxpdHkKKyAqICAgICAgICAgICAgICAgICBpcyBSb3dNYWpvci4gVGhlIGRlZmF1bHQgaXMgMCB3aGljaCBtZWFucyBjb2x1bW4tbWFqb3IuCisgKgorICoKKyAqLworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK3N0cnVjdCB0cmFpdHM8U2t5bGluZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucz4gPiB7CisgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsKKworICAgIGVudW0geworICAgICAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICAgIEZsYWdzID0gU2t5bGluZUJpdCB8IF9PcHRpb25zLAorICAgICAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIH07Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnM+CitjbGFzcyBTa3lsaW5lTWF0cml4Cis6IHB1YmxpYyBTa3lsaW5lTWF0cml4QmFzZTxTa3lsaW5lTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zPiA+IHsKK3B1YmxpYzoKKyAgICBFSUdFTl9TS1lMSU5FX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShTa3lsaW5lTWF0cml4KQorICAgIEVJR0VOX1NLWUxJTkVfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKFNreWxpbmVNYXRyaXgsICs9KQorICAgIEVJR0VOX1NLWUxJTkVfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKFNreWxpbmVNYXRyaXgsIC09KQorCisgICAgdXNpbmcgQmFzZTo6SXNSb3dNYWpvcjsKKworcHJvdGVjdGVkOgorCisgICAgdHlwZWRlZiBTa3lsaW5lTWF0cml4PFNjYWxhciwgKEZsYWdzJn5Sb3dNYWpvckJpdCkgfCAoSXNSb3dNYWpvciA/IFJvd01ham9yQml0IDogMCkgPiBUcmFuc3Bvc2VkU2t5bGluZU1hdHJpeDsKKworICAgIEluZGV4IG1fb3V0ZXJTaXplOworICAgIEluZGV4IG1faW5uZXJTaXplOworCitwdWJsaWM6CisgICAgSW5kZXgqIG1fY29sU3RhcnRJbmRleDsKKyAgICBJbmRleCogbV9yb3dTdGFydEluZGV4OworICAgIFNreWxpbmVTdG9yYWdlPFNjYWxhcj4gbV9kYXRhOworCitwdWJsaWM6CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyU2l6ZSA6IG1faW5uZXJTaXplOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXNSb3dNYWpvciA/IG1faW5uZXJTaXplIDogbV9vdXRlclNpemU7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5uZXJTaXplOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBvdXRlclNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX291dGVyU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggdXBwZXJOb25aZXJvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZGF0YS51cHBlclNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggbG93ZXJOb25aZXJvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZGF0YS5sb3dlclNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggdXBwZXJOb25aZXJvcyhJbmRleCBqKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2NvbFN0YXJ0SW5kZXhbaiArIDFdIC0gbV9jb2xTdGFydEluZGV4W2pdOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBsb3dlck5vblplcm9zKEluZGV4IGopIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcm93U3RhcnRJbmRleFtqICsgMV0gLSBtX3Jvd1N0YXJ0SW5kZXhbal07CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogX2RpYWdQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLmRpYWcoMCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciogX2RpYWdQdHIoKSB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLmRpYWcoMCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogX3VwcGVyUHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1fZGF0YS51cHBlcigwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyKiBfdXBwZXJQdHIoKSB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLnVwcGVyKDApOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXIqIF9sb3dlclB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEubG93ZXIoMCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciogX2xvd2VyUHRyKCkgeworICAgICAgICByZXR1cm4gJm1fZGF0YS5sb3dlcigwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgqIF91cHBlclByb2ZpbGVQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLnVwcGVyUHJvZmlsZSgwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXgqIF91cHBlclByb2ZpbGVQdHIoKSB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLnVwcGVyUHJvZmlsZSgwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgqIF9sb3dlclByb2ZpbGVQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLmxvd2VyUHJvZmlsZSgwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXgqIF9sb3dlclByb2ZpbGVQdHIoKSB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLmxvd2VyUHJvZmlsZSgwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdCB7CisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkpOworCisgICAgICAgIGlmIChvdXRlciA9PSBpbm5lcikKKyAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEuZGlhZyhvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGlmIChpbm5lciA+IG91dGVyKSAvL3VwcGVyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbk91dGVySW5kZXggPSBpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgICAgIGlmIChvdXRlciA+PSBtaW5PdXRlckluZGV4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyBvdXRlciAtIChpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlubmVyIDwgb3V0ZXIpIC8vbG93ZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWluSW5uZXJJbmRleCA9IG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICAgICAgaWYgKGlubmVyID49IG1pbklubmVySW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEubG93ZXIobV9yb3dTdGFydEluZGV4W291dGVyXSArIGlubmVyIC0gKG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcikpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyBvdXRlciAtIGlubmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvdXRlciA+IGlubmVyKSAvL3VwcGVyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heE91dGVySW5kZXggPSBpbm5lciArIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgICAgIGlmIChvdXRlciA8PSBtYXhPdXRlckluZGV4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyAob3V0ZXIgLSBpbm5lcikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRlciA8IGlubmVyKSAvL2xvd2VyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heElubmVySW5kZXggPSBvdXRlciArIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGlubmVyIDw9IG1heElubmVySW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEubG93ZXIobV9yb3dTdGFydEluZGV4W291dGVyXSArIChpbm5lciAtIG91dGVyKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpIHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisKKyAgICAgICAgaWYgKG91dGVyID09IGlubmVyKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5kaWFnKG91dGVyKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgaWYgKGNvbCA+IHJvdykgLy91cHBlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5PdXRlckluZGV4ID0gaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPj0gbWluT3V0ZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdICsgb3V0ZXIgLSAoaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbCA8IHJvdykgLy9sb3dlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5Jbm5lckluZGV4ID0gb3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPj0gbWluSW5uZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgaW5uZXIgLSAob3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG91dGVyID4gaW5uZXIpIC8vdXBwZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4T3V0ZXJJbmRleCA9IGlubmVyICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDw9IG1heE91dGVySW5kZXggJiYgInlvdSB0cnkgdG8gYWNjZXMgYSBjb2VmZiB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgc3RvcmFnZSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIChvdXRlciAtIGlubmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0ZXIgPCBpbm5lcikgLy9sb3dlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhJbm5lckluZGV4ID0gb3V0ZXIgKyBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPD0gbWF4SW5uZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgKGlubmVyIC0gb3V0ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmZEaWFnKEluZGV4IGlkeCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQoaWR4IDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaWR4IDwgaW5uZXJTaXplKCkpOworICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmRpYWcoaWR4KTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmTG93ZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbklubmVySW5kZXggPSBvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgaWYgKGlubmVyID49IG1pbklubmVySW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgaW5uZXIgLSAob3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heElubmVySW5kZXggPSBvdXRlciArIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgaWYgKGlubmVyIDw9IG1heElubmVySW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgKGlubmVyIC0gb3V0ZXIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciBjb2VmZlVwcGVyKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdCB7CisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgIT0gb3V0ZXIpOworCisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5PdXRlckluZGV4ID0gaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgIGlmIChvdXRlciA+PSBtaW5PdXRlckluZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIG91dGVyIC0gKGlubmVyIC0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcikpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4T3V0ZXJJbmRleCA9IGlubmVyICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICBpZiAob3V0ZXIgPD0gbWF4T3V0ZXJJbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyAob3V0ZXIgLSBpbm5lcikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZkRpYWcoSW5kZXggaWR4KSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBpbm5lclNpemUoKSk7CisgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEuZGlhZyhpZHgpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmTG93ZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbklubmVySW5kZXggPSBvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyID49IG1pbklubmVySW5kZXggJiYgInlvdSB0cnkgdG8gYWNjZXMgYSBjb2VmZiB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgc3RvcmFnZSIpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgaW5uZXIgLSAob3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4SW5uZXJJbmRleCA9IG91dGVyICsgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPD0gbWF4SW5uZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyAoaW5uZXIgLSBvdXRlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgY29lZmZFeGlzdExvd2VyKEluZGV4IHJvdywgSW5kZXggY29sKSB7CisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgIT0gb3V0ZXIpOworCisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5Jbm5lckluZGV4ID0gb3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgIHJldHVybiBpbm5lciA+PSBtaW5Jbm5lckluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4SW5uZXJJbmRleCA9IG91dGVyICsgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICByZXR1cm4gaW5uZXIgPD0gbWF4SW5uZXJJbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmVXBwZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbk91dGVySW5kZXggPSBpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyID49IG1pbk91dGVySW5kZXggJiYgInlvdSB0cnkgdG8gYWNjZXMgYSBjb2VmZiB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgc3RvcmFnZSIpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdICsgb3V0ZXIgLSAoaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4T3V0ZXJJbmRleCA9IGlubmVyICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPD0gbWF4T3V0ZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyAob3V0ZXIgLSBpbm5lcikpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgY29lZmZFeGlzdFVwcGVyKEluZGV4IHJvdywgSW5kZXggY29sKSB7CisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgIT0gb3V0ZXIpOworCisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5PdXRlckluZGV4ID0gaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRlciA+PSBtaW5PdXRlckluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4T3V0ZXJJbmRleCA9IGlubmVyICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICByZXR1cm4gb3V0ZXIgPD0gbWF4T3V0ZXJJbmRleDsKKyAgICAgICAgfQorICAgIH0KKworCitwcm90ZWN0ZWQ6CisKK3B1YmxpYzoKKyAgICBjbGFzcyBJbm5lclVwcGVySXRlcmF0b3I7CisgICAgY2xhc3MgSW5uZXJMb3dlckl0ZXJhdG9yOworCisgICAgY2xhc3MgT3V0ZXJVcHBlckl0ZXJhdG9yOworICAgIGNsYXNzIE91dGVyTG93ZXJJdGVyYXRvcjsKKworICAgIC8qKiBSZW1vdmVzIGFsbCBub24gemVyb3MgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRaZXJvKCkgeworICAgICAgICBtX2RhdGEuY2xlYXIoKTsKKyAgICAgICAgbWVtc2V0KG1fY29sU3RhcnRJbmRleCwgMCwgKG1fb3V0ZXJTaXplICsgMSkgKiBzaXplb2YgKEluZGV4KSk7CisgICAgICAgIG1lbXNldChtX3Jvd1N0YXJ0SW5kZXgsIDAsIChtX291dGVyU2l6ZSArIDEpICogc2l6ZW9mIChJbmRleCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZGF0YS5kaWFnU2l6ZSgpICsgbV9kYXRhLnVwcGVyU2l6ZSgpICsgbV9kYXRhLmxvd2VyU2l6ZSgpOworICAgIH0KKworICAgIC8qKiBQcmVhbGxvY2F0ZXMgXGEgcmVzZXJ2ZVNpemUgbm9uIHplcm9zICovCisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShJbmRleCByZXNlcnZlU2l6ZSwgSW5kZXggcmVzZXJ2ZVVwcGVyU2l6ZSwgSW5kZXggcmVzZXJ2ZUxvd2VyU2l6ZSkgeworICAgICAgICBtX2RhdGEucmVzZXJ2ZShyZXNlcnZlU2l6ZSwgcmVzZXJ2ZVVwcGVyU2l6ZSwgcmVzZXJ2ZUxvd2VyU2l6ZSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgbm92ZWwgbm9uIHplcm8gY29lZmZpY2llbnQgd2l0aCBjb29yZGluYXRlcyBcYSByb3cgeCBcYSBjb2wuCisKKyAgICAgKgorICAgICAqIFx3YXJuaW5nIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGV4dHJlbWVseSBzbG93IGlmIHRoZSBub24gemVybyBjb2VmZmljaWVudHMKKyAgICAgKiBhcmUgbm90IGluc2VydGVkIGluIGEgY29oZXJlbnQgb3JkZXIuCisgICAgICoKKyAgICAgKiBBZnRlciBhbiBpbnNlcnRpb24gc2Vzc2lvbiwgeW91IHNob3VsZCBjYWxsIHRoZSBmaW5hbGl6ZSgpIGZ1bmN0aW9uLgorICAgICAqLworICAgIEVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciAmIGluc2VydChJbmRleCByb3csIEluZGV4IGNvbCkgeworICAgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8IGlubmVyU2l6ZSgpKTsKKworICAgICAgICBpZiAob3V0ZXIgPT0gaW5uZXIpCisgICAgICAgICAgICByZXR1cm4gbV9kYXRhLmRpYWcoY29sKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgaWYgKG91dGVyIDwgaW5uZXIpIC8vdXBwZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZXggbWluT3V0ZXJJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgbWluT3V0ZXJJbmRleCA9IGlubmVyIC0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisKKyAgICAgICAgICAgICAgICBpZiAob3V0ZXIgPCBtaW5PdXRlckluZGV4KSAvL1RoZSB2YWx1ZSBkb2VzIG5vdCB5ZXQgZXhpc3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHByZXZpb3VzUHJvZmlsZSA9IG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworCisgICAgICAgICAgICAgICAgICAgIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpID0gaW5uZXIgLSBvdXRlcjsKKworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IGJhbmRJbmNyZW1lbnQgPSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSAtIHByZXZpb3VzUHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgLy9zaGlmdCBkYXRhIHN0b3JlZCBhZnRlciB0aGlzIG5ldyBvbmUKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggc3RvcCA9IG1fY29sU3RhcnRJbmRleFtjb2xzKCldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdGFydCA9IG1fY29sU3RhcnRJbmRleFtpbm5lcl07CisKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gc3RvcDsgaW5uZXJJZHggPj0gc3RhcnQ7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS51cHBlcihpbm5lcklkeCArIGJhbmRJbmNyZW1lbnQpID0gbV9kYXRhLnVwcGVyKGlubmVySWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSBjb2xzKCk7IGlubmVySWR4ID4gaW5uZXI7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY29sU3RhcnRJbmRleFtpbm5lcklkeF0gKz0gYmFuZEluY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vemVyb3MgbmV3IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRoaXMtPl91cHBlclB0cigpICsgc3RhcnQsIDAsIChiYW5kSW5jcmVtZW50IC0gMSkgKiBzaXplb2YgKFNjYWxhcikpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdICsgb3V0ZXIgLSAoaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGVyID4gaW5uZXIpIC8vbG93ZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWluSW5uZXJJbmRleCA9IG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICAgICAgaWYgKGlubmVyIDwgbWluSW5uZXJJbmRleCkgLy9UaGUgdmFsdWUgZG9lcyBub3QgeWV0IGV4aXN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBwcmV2aW91c1Byb2ZpbGUgPSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcikgPSBvdXRlciAtIGlubmVyOworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IGJhbmRJbmNyZW1lbnQgPSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSAtIHByZXZpb3VzUHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgLy9zaGlmdCBkYXRhIHN0b3JlZCBhZnRlciB0aGlzIG5ldyBvbmUKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggc3RvcCA9IG1fcm93U3RhcnRJbmRleFtyb3dzKCldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdGFydCA9IG1fcm93U3RhcnRJbmRleFtvdXRlcl07CisKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gc3RvcDsgaW5uZXJJZHggPj0gc3RhcnQ7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5sb3dlcihpbm5lcklkeCArIGJhbmRJbmNyZW1lbnQpID0gbV9kYXRhLmxvd2VyKGlubmVySWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSByb3dzKCk7IGlubmVySWR4ID4gb3V0ZXI7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcm93U3RhcnRJbmRleFtpbm5lcklkeF0gKz0gYmFuZEluY3JlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vemVyb3MgbmV3IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRoaXMtPl9sb3dlclB0cigpICsgc3RhcnQsIDAsIChiYW5kSW5jcmVtZW50IC0gMSkgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEubG93ZXIobV9yb3dTdGFydEluZGV4W291dGVyXSArIGlubmVyIC0gKG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3V0ZXIgPiBpbm5lcikgLy91cHBlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhPdXRlckluZGV4ID0gaW5uZXIgKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0ZXIgPiBtYXhPdXRlckluZGV4KSAvL1RoZSB2YWx1ZSBkb2VzIG5vdCB5ZXQgZXhpc3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHByZXZpb3VzUHJvZmlsZSA9IG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgICAgICAgICBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSA9IG91dGVyIC0gaW5uZXI7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggYmFuZEluY3JlbWVudCA9IG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpIC0gcHJldmlvdXNQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGRhdGEgc3RvcmVkIGFmdGVyIHRoaXMgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdG9wID0gbV9yb3dTdGFydEluZGV4W3Jvd3MoKV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0YXJ0ID0gbV9yb3dTdGFydEluZGV4W2lubmVyICsgMV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpbm5lcklkeCA9IHN0b3A7IGlubmVySWR4ID49IHN0YXJ0OyBpbm5lcklkeC0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEudXBwZXIoaW5uZXJJZHggKyBiYW5kSW5jcmVtZW50KSA9IG1fZGF0YS51cHBlcihpbm5lcklkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gaW5uZXIgKyAxOyBpbm5lcklkeCA8IG91dGVyU2l6ZSgpICsgMTsgaW5uZXJJZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9yb3dTdGFydEluZGV4W2lubmVySWR4XSArPSBiYW5kSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0aGlzLT5fdXBwZXJQdHIoKSArIG1fcm93U3RhcnRJbmRleFtpbm5lcl0gKyBwcmV2aW91c1Byb2ZpbGUgKyAxLCAwLCAoYmFuZEluY3JlbWVudCAtIDEpICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS51cHBlcihtX3Jvd1N0YXJ0SW5kZXhbaW5uZXJdICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEudXBwZXIobV9yb3dTdGFydEluZGV4W2lubmVyXSArIChvdXRlciAtIGlubmVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0ZXIgPCBpbm5lcikgLy9sb3dlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhJbm5lckluZGV4ID0gb3V0ZXIgKyBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgPiBtYXhJbm5lckluZGV4KSAvL1RoZSB2YWx1ZSBkb2VzIG5vdCB5ZXQgZXhpc3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHByZXZpb3VzUHJvZmlsZSA9IG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgICAgICAgICBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSA9IGlubmVyIC0gb3V0ZXI7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggYmFuZEluY3JlbWVudCA9IG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpIC0gcHJldmlvdXNQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGRhdGEgc3RvcmVkIGFmdGVyIHRoaXMgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdG9wID0gbV9jb2xTdGFydEluZGV4W2NvbHMoKV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0YXJ0ID0gbV9jb2xTdGFydEluZGV4W291dGVyICsgMV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpbm5lcklkeCA9IHN0b3A7IGlubmVySWR4ID49IHN0YXJ0OyBpbm5lcklkeC0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2RhdGEubG93ZXIoaW5uZXJJZHggKyBiYW5kSW5jcmVtZW50KSA9IG1fZGF0YS5sb3dlcihpbm5lcklkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gb3V0ZXIgKyAxOyBpbm5lcklkeCA8IG91dGVyU2l6ZSgpICsgMTsgaW5uZXJJZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xTdGFydEluZGV4W2lubmVySWR4XSArPSBiYW5kSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0aGlzLT5fbG93ZXJQdHIoKSArIG1fY29sU3RhcnRJbmRleFtvdXRlcl0gKyBwcmV2aW91c1Byb2ZpbGUgKyAxLCAwLCAoYmFuZEluY3JlbWVudCAtIDEpICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5sb3dlcihtX2NvbFN0YXJ0SW5kZXhbb3V0ZXJdICsgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEubG93ZXIobV9jb2xTdGFydEluZGV4W291dGVyXSArIChpbm5lciAtIG91dGVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGluc2VydGluZyBhIHNldCBvZiBub24gemVybyBlbnRyaWVzLgorICAgICAqLworICAgIGlubGluZSB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgaWYgKHJvd3MoKSA+IGNvbHMoKSkKKyAgICAgICAgICAgICAgICBtX2RhdGEucmVzaXplKGNvbHMoKSwgY29scygpLCByb3dzKCksIG1fY29sU3RhcnRJbmRleFtjb2xzKCldICsgMSwgbV9yb3dTdGFydEluZGV4W3Jvd3MoKV0gKyAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2RhdGEucmVzaXplKHJvd3MoKSwgY29scygpLCByb3dzKCksIG1fY29sU3RhcnRJbmRleFtjb2xzKCldICsgMSwgbV9yb3dTdGFydEluZGV4W3Jvd3MoKV0gKyAxKTsKKworICAgICAgICAgICAgLy8gICAgICAgICAgICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSAmJiAibWVtb3J5IHJlb3JnYW5pc2F0cmlvbiBvbmx5IHdvcmtzIHdpdGggc3VhcmUgbWF0cml4Iik7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgICAgICAgICBTY2FsYXIqIG5ld0FycmF5ID0gbmV3IFNjYWxhclttX2NvbFN0YXJ0SW5kZXhbY29scygpXSArIDEgKyBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpXSArIDFdOworICAgICAgICAgICAgLy8gICAgICAgICAgICBJbmRleCBkYXRhSWR4ID0gMDsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZm9yIChJbmRleCByb3cgPSAwOyByb3cgPCByb3dzKCk7IHJvdysrKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbmJMb3dlckVsdHMgPSBtX3Jvd1N0YXJ0SW5kZXhbcm93ICsgMV0gLSBtX3Jvd1N0YXJ0SW5kZXhbcm93XTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAibmJMb3dlckVsdHMiIDw8IG5iTG93ZXJFbHRzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIG1lbWNweShuZXdBcnJheSArIGRhdGFJZHgsIG1fZGF0YS5tX2xvd2VyICsgbV9yb3dTdGFydEluZGV4W3Jvd10sIG5iTG93ZXJFbHRzICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIG1fcm93U3RhcnRJbmRleFtyb3ddID0gZGF0YUlkeDsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGRhdGFJZHggKz0gbmJMb3dlckVsdHM7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbmJVcHBlckVsdHMgPSBtX2NvbFN0YXJ0SW5kZXhbcm93ICsgMV0gLSBtX2NvbFN0YXJ0SW5kZXhbcm93XTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIG1lbWNweShuZXdBcnJheSArIGRhdGFJZHgsIG1fZGF0YS5tX3VwcGVyICsgbV9jb2xTdGFydEluZGV4W3Jvd10sIG5iVXBwZXJFbHRzICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIG1fY29sU3RhcnRJbmRleFtyb3ddID0gZGF0YUlkeDsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGRhdGFJZHggKz0gbmJVcHBlckVsdHM7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgICAgICAgICAvL3RvZG8gOiBkb24ndCBhY2Nlc3MgbV9kYXRhIHByb2ZpbGUgZGlyZWN0bHkgOiBhZGQgYW4gYWNjZXNzb3IgZnJvbSBTa3lsaW5lTWF0cml4CisgICAgICAgICAgICAvLyAgICAgICAgICAgIG1fcm93U3RhcnRJbmRleFtyb3dzKCldID0gbV9yb3dTdGFydEluZGV4W3Jvd3MoKS0xXSArIG1fZGF0YS5sb3dlclByb2ZpbGUocm93cygpLTEpOworICAgICAgICAgICAgLy8gICAgICAgICAgICBtX2NvbFN0YXJ0SW5kZXhbY29scygpXSA9IG1fY29sU3RhcnRJbmRleFtjb2xzKCktMV0gKyBtX2RhdGEudXBwZXJQcm9maWxlKGNvbHMoKS0xKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGRlbGV0ZVtdIG1fZGF0YS5tX2xvd2VyOworICAgICAgICAgICAgLy8gICAgICAgICAgICBkZWxldGVbXSBtX2RhdGEubV91cHBlcjsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgICAgICAgIG1fZGF0YS5tX2xvd2VyID0gbmV3QXJyYXk7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIG1fZGF0YS5tX3VwcGVyID0gbmV3QXJyYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocm93cygpID4gY29scygpKQorICAgICAgICAgICAgICAgIG1fZGF0YS5yZXNpemUoY29scygpLCByb3dzKCksIGNvbHMoKSwgbV9yb3dTdGFydEluZGV4W2NvbHMoKV0gKyAxLCBtX2NvbFN0YXJ0SW5kZXhbY29scygpXSArIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fZGF0YS5yZXNpemUocm93cygpLCByb3dzKCksIGNvbHMoKSwgbV9yb3dTdGFydEluZGV4W3Jvd3MoKV0gKyAxLCBtX2NvbFN0YXJ0SW5kZXhbcm93cygpXSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc3F1ZWV6ZSgpIHsKKyAgICAgICAgZmluYWxpemUoKTsKKyAgICAgICAgbV9kYXRhLnNxdWVlemUoKTsKKyAgICB9CisKKyAgICB2b2lkIHBydW5lKFNjYWxhciByZWZlcmVuY2UsIFJlYWxTY2FsYXIgZXBzaWxvbiA9IGR1bW15X3ByZWNpc2lvbjxSZWFsU2NhbGFyID4gKCkpIHsKKyAgICAgICAgLy9UT0RPCisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBhIFxhIHJvd3MgeCBcYSBjb2xzIG1hdHJpeCBhbmQgaW5pdGlhbGl6ZXMgaXQgdG8gemVybworICAgICAqIFxzYSByZXNpemVOb25aZXJvcyhJbmRleCksIHJlc2VydmUoKSwgc2V0WmVybygpCisgICAgICovCisgICAgdm9pZCByZXNpemUoc2l6ZV90IHJvd3MsIHNpemVfdCBjb2xzKSB7CisgICAgICAgIGNvbnN0IEluZGV4IGRpYWdTaXplID0gcm93cyA+IGNvbHMgPyBjb2xzIDogcm93czsKKyAgICAgICAgbV9pbm5lclNpemUgPSBJc1Jvd01ham9yID8gY29scyA6IHJvd3M7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MgPT0gY29scyAmJiAiU2t5bGluZSBtYXRyaXggbXVzdCBiZSBzcXVhcmUgbWF0cml4Iik7CisKKyAgICAgICAgaWYgKGRpYWdTaXplICUgMikgeyAvLyBkaWFnU2l6ZSBpcyBvZGQKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IGsgPSAoZGlhZ1NpemUgLSAxKSAvIDI7CisKKyAgICAgICAgICAgIG1fZGF0YS5yZXNpemUoZGlhZ1NpemUsIElzUm93TWFqb3IgPyBjb2xzIDogcm93cywgSXNSb3dNYWpvciA/IHJvd3MgOiBjb2xzLAorICAgICAgICAgICAgICAgICAgICAyICogayAqIGsgKyBrICsgMSwKKyAgICAgICAgICAgICAgICAgICAgMiAqIGsgKiBrICsgayArIDEpOworCisgICAgICAgIH0gZWxzZSAvLyBkaWFnU2l6ZSBpcyBldmVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IGsgPSBkaWFnU2l6ZSAvIDI7CisgICAgICAgICAgICBtX2RhdGEucmVzaXplKGRpYWdTaXplLCBJc1Jvd01ham9yID8gY29scyA6IHJvd3MsIElzUm93TWFqb3IgPyByb3dzIDogY29scywKKyAgICAgICAgICAgICAgICAgICAgMiAqIGsgKiBrIC0gayArIDEsCisgICAgICAgICAgICAgICAgICAgIDIgKiBrICogayAtIGsgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2NvbFN0YXJ0SW5kZXggJiYgbV9yb3dTdGFydEluZGV4KSB7CisgICAgICAgICAgICBkZWxldGVbXSBtX2NvbFN0YXJ0SW5kZXg7CisgICAgICAgICAgICBkZWxldGVbXSBtX3Jvd1N0YXJ0SW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgbV9jb2xTdGFydEluZGV4ID0gbmV3IEluZGV4IFtjb2xzICsgMV07CisgICAgICAgIG1fcm93U3RhcnRJbmRleCA9IG5ldyBJbmRleCBbcm93cyArIDFdOworICAgICAgICBtX291dGVyU2l6ZSA9IGRpYWdTaXplOworCisgICAgICAgIG1fZGF0YS5yZXNldCgpOworICAgICAgICBtX2RhdGEuY2xlYXIoKTsKKworICAgICAgICBtX291dGVyU2l6ZSA9IGRpYWdTaXplOworICAgICAgICBtZW1zZXQobV9jb2xTdGFydEluZGV4LCAwLCAoY29scyArIDEpICogc2l6ZW9mIChJbmRleCkpOworICAgICAgICBtZW1zZXQobV9yb3dTdGFydEluZGV4LCAwLCAocm93cyArIDEpICogc2l6ZW9mIChJbmRleCkpOworICAgIH0KKworICAgIHZvaWQgcmVzaXplTm9uWmVyb3MoSW5kZXggc2l6ZSkgeworICAgICAgICBtX2RhdGEucmVzaXplKHNpemUpOworICAgIH0KKworICAgIGlubGluZSBTa3lsaW5lTWF0cml4KCkKKyAgICA6IG1fb3V0ZXJTaXplKC0xKSwgbV9pbm5lclNpemUoMCksIG1fY29sU3RhcnRJbmRleCgwKSwgbV9yb3dTdGFydEluZGV4KDApIHsKKyAgICAgICAgcmVzaXplKDAsIDApOworICAgIH0KKworICAgIGlubGluZSBTa3lsaW5lTWF0cml4KHNpemVfdCByb3dzLCBzaXplX3QgY29scykKKyAgICA6IG1fb3V0ZXJTaXplKDApLCBtX2lubmVyU2l6ZSgwKSwgbV9jb2xTdGFydEluZGV4KDApLCBtX3Jvd1N0YXJ0SW5kZXgoMCkgeworICAgICAgICByZXNpemUocm93cywgY29scyk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBTa3lsaW5lTWF0cml4KGNvbnN0IFNreWxpbmVNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIDogbV9vdXRlclNpemUoMCksIG1faW5uZXJTaXplKDApLCBtX2NvbFN0YXJ0SW5kZXgoMCksIG1fcm93U3RhcnRJbmRleCgwKSB7CisgICAgICAgICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpOworICAgIH0KKworICAgIGlubGluZSBTa3lsaW5lTWF0cml4KGNvbnN0IFNreWxpbmVNYXRyaXggJiBvdGhlcikKKyAgICA6IEJhc2UoKSwgbV9vdXRlclNpemUoMCksIG1faW5uZXJTaXplKDApLCBtX2NvbFN0YXJ0SW5kZXgoMCksIG1fcm93U3RhcnRJbmRleCgwKSB7CisgICAgICAgICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHN3YXAoU2t5bGluZU1hdHJpeCAmIG90aGVyKSB7CisgICAgICAgIC8vRUlHRU5fREJHX1NLWUxJTkUoc3RkOjpjb3V0IDw8ICJTa3lsaW5lTWF0cml4Ojogc3dhcFxuIik7CisgICAgICAgIHN0ZDo6c3dhcChtX2NvbFN0YXJ0SW5kZXgsIG90aGVyLm1fY29sU3RhcnRJbmRleCk7CisgICAgICAgIHN0ZDo6c3dhcChtX3Jvd1N0YXJ0SW5kZXgsIG90aGVyLm1fcm93U3RhcnRJbmRleCk7CisgICAgICAgIHN0ZDo6c3dhcChtX2lubmVyU2l6ZSwgb3RoZXIubV9pbm5lclNpemUpOworICAgICAgICBzdGQ6OnN3YXAobV9vdXRlclNpemUsIG90aGVyLm1fb3V0ZXJTaXplKTsKKyAgICAgICAgbV9kYXRhLnN3YXAob3RoZXIubV9kYXRhKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2t5bGluZU1hdHJpeCAmIG9wZXJhdG9yPShjb25zdCBTa3lsaW5lTWF0cml4ICYgb3RoZXIpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJTa3lsaW5lTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgU2t5bGluZU1hdHJpeCYgb3RoZXIpXG4iOworICAgICAgICBpZiAob3RoZXIuaXNSVmFsdWUoKSkgeworICAgICAgICAgICAgc3dhcChvdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNpemUob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgICAgICAgICAgbWVtY3B5KG1fY29sU3RhcnRJbmRleCwgb3RoZXIubV9jb2xTdGFydEluZGV4LCAobV9vdXRlclNpemUgKyAxKSAqIHNpemVvZiAoSW5kZXgpKTsKKyAgICAgICAgICAgIG1lbWNweShtX3Jvd1N0YXJ0SW5kZXgsIG90aGVyLm1fcm93U3RhcnRJbmRleCwgKG1fb3V0ZXJTaXplICsgMSkgKiBzaXplb2YgKEluZGV4KSk7CisgICAgICAgICAgICBtX2RhdGEgPSBvdGhlci5tX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICAgICAgICAgIGlubGluZSBTa3lsaW5lTWF0cml4ICYgb3BlcmF0b3I9KGNvbnN0IFNreWxpbmVNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7CisgICAgICAgIGNvbnN0IGJvb2wgbmVlZFRvVHJhbnNwb3NlID0gKEZsYWdzICYgUm93TWFqb3JCaXQpICE9IChPdGhlckRlcml2ZWQ6OkZsYWdzICYgUm93TWFqb3JCaXQpOworICAgICAgICBpZiAobmVlZFRvVHJhbnNwb3NlKSB7CisgICAgICAgICAgICAvLyAgICAgICAgIFRPRE8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gc3BlY2lhbCBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgIHJldHVybiBTa3lsaW5lTWF0cml4QmFzZTxTa3lsaW5lTWF0cml4Pjo6b3BlcmF0b3I9KG90aGVyLmRlcml2ZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgU2t5bGluZU1hdHJpeCAmIG0pIHsKKworICAgICAgICBFSUdFTl9EQkdfU0tZTElORSgKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJ1cHBlciBlbGVtZW50cyA6ICIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5tX2RhdGEudXBwZXJTaXplKCk7IGkrKykKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBtLm1fZGF0YS51cHBlcihpKSA8PCAiXHQiOworICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgInVwcGVyIHByb2ZpbGUgOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ubV9kYXRhLnVwcGVyUHJvZmlsZVNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IG0ubV9kYXRhLnVwcGVyUHJvZmlsZShpKSA8PCAiXHQiOworICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgImxvd2VyIHN0YXJ0SWR4IDogIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtLm1fZGF0YS51cHBlclByb2ZpbGVTaXplKCk7IGkrKykKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAoSXNSb3dNYWpvciA/IG0ubV9jb2xTdGFydEluZGV4W2ldIDogbS5tX3Jvd1N0YXJ0SW5kZXhbaV0pIDw8ICJcdCI7CisgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisKKworICAgICAgICBzdGQ6OmNvdXQgPDwgImxvd2VyIGVsZW1lbnRzIDogIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtLm1fZGF0YS5sb3dlclNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IG0ubV9kYXRhLmxvd2VyKGkpIDw8ICJcdCI7CisgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAibG93ZXIgcHJvZmlsZSA6ICIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5tX2RhdGEubG93ZXJQcm9maWxlU2l6ZSgpOyBpKyspCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgbS5tX2RhdGEubG93ZXJQcm9maWxlKGkpIDw8ICJcdCI7CisgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAibG93ZXIgc3RhcnRJZHggOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ubV9kYXRhLmxvd2VyUHJvZmlsZVNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IChJc1Jvd01ham9yID8gbS5tX3Jvd1N0YXJ0SW5kZXhbaV0gOiBtLm1fY29sU3RhcnRJbmRleFtpXSkgPDwgIlx0IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgKTsKKyAgICAgICAgZm9yIChJbmRleCByb3dJZHggPSAwOyByb3dJZHggPCBtLnJvd3MoKTsgcm93SWR4KyspIHsKKyAgICAgICAgICAgIGZvciAoSW5kZXggY29sSWR4ID0gMDsgY29sSWR4IDwgbS5jb2xzKCk7IGNvbElkeCsrKSB7CisgICAgICAgICAgICAgICAgcyA8PCBtLmNvZWZmKHJvd0lkeCwgY29sSWR4KSA8PCAiXHQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqIERlc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgflNreWxpbmVNYXRyaXgoKSB7CisgICAgICAgIGRlbGV0ZVtdIG1fY29sU3RhcnRJbmRleDsKKyAgICAgICAgZGVsZXRlW10gbV9yb3dTdGFydEluZGV4OworICAgIH0KKworICAgIC8qKiBPdmVybG9hZGVkIGZvciBwZXJmb3JtYW5jZSAqLworICAgIFNjYWxhciBzdW0oKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zPgorY2xhc3MgU2t5bGluZU1hdHJpeDxTY2FsYXIsIF9PcHRpb25zPjo6SW5uZXJVcHBlckl0ZXJhdG9yIHsKK3B1YmxpYzoKKworICAgIElubmVyVXBwZXJJdGVyYXRvcihjb25zdCBTa3lsaW5lTWF0cml4JiBtYXQsIEluZGV4IG91dGVyKQorICAgIDogbV9tYXRyaXgobWF0KSwgbV9vdXRlcihvdXRlciksCisgICAgbV9pZChfT3B0aW9ucyA9PSBSb3dNYWpvciA/IG1hdC5tX2NvbFN0YXJ0SW5kZXhbb3V0ZXJdIDogbWF0Lm1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyAxKSwKKyAgICBtX3N0YXJ0KG1faWQpLAorICAgIG1fZW5kKF9PcHRpb25zID09IFJvd01ham9yID8gbWF0Lm1fY29sU3RhcnRJbmRleFtvdXRlciArIDFdIDogbWF0Lm1fcm93U3RhcnRJbmRleFtvdXRlciArIDFdICsgMSkgeworICAgIH0KKworICAgIGlubGluZSBJbm5lclVwcGVySXRlcmF0b3IgJiBvcGVyYXRvcisrKCkgeworICAgICAgICBtX2lkKys7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5uZXJVcHBlckl0ZXJhdG9yICYgb3BlcmF0b3IrPShJbmRleCBzaGlmdCkgeworICAgICAgICBtX2lkICs9IHNoaWZ0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fbWF0cml4Lm1fZGF0YS51cHBlcihtX2lkKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyKj4gKCYobV9tYXRyaXgubV9kYXRhLnVwcGVyKG1faWQpKSk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgdmFsdWVSZWYoKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFNjYWxhciY+IChtX21hdHJpeC5tX2RhdGEudXBwZXIobV9pZCkpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIC0gbV9tYXRyaXgubV9kYXRhLnVwcGVyUHJvZmlsZShtX291dGVyKSArIChtX2lkIC0gbV9zdGFydCkgOgorICAgICAgICAgICAgICAgIG1fb3V0ZXIgKyAobV9pZCAtIG1fc3RhcnQpICsgMTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9tYXRyaXgubV9kYXRhLnVwcGVyUHJvZmlsZShtX291dGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtX2lkIDwgbV9lbmQpICYmIChtX2lkID49IG1fc3RhcnQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IFNreWxpbmVNYXRyaXgmIG1fbWF0cml4OworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgSW5kZXggbV9pZDsKKyAgICBjb25zdCBJbmRleCBtX3N0YXJ0OworICAgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnM+CitjbGFzcyBTa3lsaW5lTWF0cml4PFNjYWxhciwgX09wdGlvbnM+OjpJbm5lckxvd2VySXRlcmF0b3IgeworcHVibGljOgorCisgICAgSW5uZXJMb3dlckl0ZXJhdG9yKGNvbnN0IFNreWxpbmVNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgOiBtX21hdHJpeChtYXQpLAorICAgIG1fb3V0ZXIob3V0ZXIpLAorICAgIG1faWQoX09wdGlvbnMgPT0gUm93TWFqb3IgPyBtYXQubV9yb3dTdGFydEluZGV4W291dGVyXSA6IG1hdC5tX2NvbFN0YXJ0SW5kZXhbb3V0ZXJdICsgMSksCisgICAgbV9zdGFydChtX2lkKSwKKyAgICBtX2VuZChfT3B0aW9ucyA9PSBSb3dNYWpvciA/IG1hdC5tX3Jvd1N0YXJ0SW5kZXhbb3V0ZXIgKyAxXSA6IG1hdC5tX2NvbFN0YXJ0SW5kZXhbb3V0ZXIgKyAxXSArIDEpIHsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5uZXJMb3dlckl0ZXJhdG9yICYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgbV9pZCsrOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaW5saW5lIElubmVyTG93ZXJJdGVyYXRvciAmIG9wZXJhdG9yKz0oSW5kZXggc2hpZnQpIHsKKyAgICAgICAgbV9pZCArPSBzaGlmdDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX21hdHJpeC5tX2RhdGEubG93ZXIobV9pZCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciogdmFsdWVQdHIoKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFNjYWxhcio+ICgmKG1fbWF0cml4Lm1fZGF0YS5sb3dlcihtX2lkKSkpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIHZhbHVlUmVmKCkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXImPiAobV9tYXRyaXgubV9kYXRhLmxvd2VyKG1faWQpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggaW5kZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciAtIG1fbWF0cml4Lm1fZGF0YS5sb3dlclByb2ZpbGUobV9vdXRlcikgKyAobV9pZCAtIG1fc3RhcnQpIDoKKyAgICAgICAgICAgICAgICBtX291dGVyICsgKG1faWQgLSBtX3N0YXJ0KSArIDE7CisgICAgICAgIDsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiBpbmRleCgpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fb3V0ZXI7CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9tYXRyaXgubV9kYXRhLmxvd2VyUHJvZmlsZShtX291dGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtX2lkIDwgbV9lbmQpICYmIChtX2lkID49IG1fc3RhcnQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IFNreWxpbmVNYXRyaXgmIG1fbWF0cml4OworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgSW5kZXggbV9pZDsKKyAgICBjb25zdCBJbmRleCBtX3N0YXJ0OworICAgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9Ta3lsaW5lTWF0cml4X0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXhCYXNlLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lTWF0cml4QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTIzNzIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lTWF0cml4QmFzZS5oCkBAIC0wLDAgKzEsMjEyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEd1aWxsYXVtZSBTYXVwaW4gPGd1aWxsYXVtZS5zYXVwaW5AY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TS1lMSU5FTUFUUklYQkFTRV9ICisjZGVmaW5lIEVJR0VOX1NLWUxJTkVNQVRSSVhCQVNFX0gKKworI2luY2x1ZGUgIlNreWxpbmVVdGlsLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgU2t5bGluZV9Nb2R1bGUKKyAqCisgKiBcY2xhc3MgU2t5bGluZU1hdHJpeEJhc2UKKyAqCisgKiBcYnJpZWYgQmFzZSBjbGFzcyBvZiBhbnkgc2t5bGluZSBtYXRyaWNlcyBvciBza3lsaW5lIGV4cHJlc3Npb25zCisgKgorICogXHBhcmFtIERlcml2ZWQKKyAqCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNreWxpbmVNYXRyaXhCYXNlIDogcHVibGljIEVpZ2VuQmFzZTxEZXJpdmVkPiB7CitwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjppbmRleDxTdG9yYWdlS2luZD46OnR5cGUgSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJvd3MgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgKiBieSB0aGUgXGEgRGVyaXZlZCB0eXBlLiBJZiBhIHZhbHVlIGlzIG5vdCBrbm93biBhdCBjb21waWxlLXRpbWUsCisgICAgICAgICAqIGl0IGlzIHNldCB0byB0aGUgXGEgRHluYW1pYyBjb25zdGFudC4KKyAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBDb2xzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworICAgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgY29sdW1ucyBhdCBjb21waWxlLXRpbWUuIFRoaXMgaXMganVzdCBhIGNvcHkgb2YgdGhlIHZhbHVlIHByb3ZpZGVkCisgICAgICAgICAqIGJ5IHRoZSBcYSBEZXJpdmVkIHR5cGUuIElmIGEgdmFsdWUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwKKyAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgKiBcc2EgTWF0cml4QmFzZTo6cm93cygpLCBNYXRyaXhCYXNlOjpjb2xzKCksIFJvd3NBdENvbXBpbGVUaW1lLCBTaXplQXRDb21waWxlVGltZSAqLworCisKKyAgICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSAoaW50ZXJuYWw6OnNpemVfYXRfY29tcGlsZV90aW1lPGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT46OnJldCksCisgICAgICAgIC8qKjwgVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgaS5lLiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAqIHJvd3MgdGltZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zLCBvciB0byBcYSBEeW5hbWljIGlmIHRoaXMgaXMgbm90CisgICAgICAgICAqIGtub3duIGF0IGNvbXBpbGUtdGltZS4gXHNhIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSAqLworCisgICAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQ29sc0F0Q29tcGlsZVRpbWUsCisKKyAgICAgICAgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSAoaW50ZXJuYWw6OnNpemVfYXRfY29tcGlsZV90aW1lPE1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZT46OnJldCksCisKKyAgICAgICAgSXNWZWN0b3JBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBDb2xzQXRDb21waWxlVGltZSA9PSAxLAorICAgICAgICAvKio8IFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgZWl0aGVyIHRoZSBudW1iZXIgb2Ygcm93cyBvciB0aGUgbnVtYmVyIG9mCisgICAgICAgICAqIGNvbHVtbnMgaXMga25vd24gYXQgY29tcGlsZS10aW1lIHRvIGJlIGVxdWFsIHRvIDEuIEluZGVlZCwgaW4gdGhhdCBjYXNlLAorICAgICAgICAgKiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sdW1uLXZlY3RvciAoaWYgdGhlcmUgaXMgb25seSBvbmUgY29sdW1uKSBvciB3aXRoCisgICAgICAgICAqIGEgcm93LXZlY3RvciAoaWYgdGhlcmUgaXMgb25seSBvbmUgcm93KS4gKi8KKworICAgICAgICBGbGFncyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzLAorICAgICAgICAvKio8IFRoaXMgc3RvcmVzIGV4cHJlc3Npb24gXHJlZiBmbGFncyBmbGFncyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBpbmhlcml0ZWQgYnkgbmV3IGV4cHJlc3Npb25zCisgICAgICAgICAqIGNvbnN0cnVjdGVkIGZyb20gdGhpcyBvbmUuIFNlZSB0aGUgXHJlZiBmbGFncyAibGlzdCBvZiBmbGFncyIuCisgICAgICAgICAqLworCisgICAgICAgIENvZWZmUmVhZENvc3QgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0LAorICAgICAgICAvKio8IFRoaXMgaXMgYSByb3VnaCBtZWFzdXJlIG9mIGhvdyBleHBlbnNpdmUgaXQgaXMgdG8gcmVhZCBvbmUgY29lZmZpY2llbnQgZnJvbQorICAgICAgICAgKiB0aGlzIGV4cHJlc3Npb24uCisgICAgICAgICAqLworCisgICAgICAgIElzUm93TWFqb3IgPSBGbGFncyAmIFJvd01ham9yQml0ID8gMSA6IDAKKyAgICB9OworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgdGhlICJyZWFsIHNjYWxhciIgdHlwZTsgaWYgdGhlIFxhIFNjYWxhciB0eXBlIGlzIGFscmVhZHkgcmVhbCBudW1iZXJzCisgICAgICogKGUuZy4gaW50LCBmbG9hdCBvciBkb3VibGUpIHRoZW4gXGEgUmVhbFNjYWxhciBpcyBqdXN0IHRoZSBzYW1lIGFzIFxhIFNjYWxhci4gSWYKKyAgICAgKiBcYSBTY2FsYXIgaXMgXGEgc3RkOjpjb21wbGV4PFQ+IHRoZW4gUmVhbFNjYWxhciBpcyBcYSBULgorICAgICAqCisgICAgICogXHNhIGNsYXNzIE51bVRyYWl0cworICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIC8qKiB0eXBlIG9mIHRoZSBlcXVpdmFsZW50IHNxdWFyZSBtYXRyaXggKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9TSVpFX01BWChSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUpID4gU3F1YXJlTWF0cml4VHlwZTsKKworICAgIGlubGluZSBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPiAodGhpcyk7CisgICAgfQorCisgICAgaW5saW5lIERlcml2ZWQmIGRlcml2ZWQoKSB7CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+ICh0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRGVyaXZlZCYgY29uc3RfY2FzdF9kZXJpdmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPiAoY29uc3RfY2FzdDxTa3lsaW5lTWF0cml4QmFzZSo+ICh0aGlzKSk7CisgICAgfQorI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cy4gXHNhIGNvbHMoKSwgUm93c0F0Q29tcGlsZVRpbWUgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWQoKS5yb3dzKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gXHNhIHJvd3MoKSwgQ29sc0F0Q29tcGlsZVRpbWUqLworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZGVyaXZlZCgpLmNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMsIHdoaWNoIGlzIFxhIHJvd3MoKSpjb2xzKCkuCisgICAgICogXHNhIHJvd3MoKSwgY29scygpLCBTaXplQXRDb21waWxlVGltZS4gKi8KKyAgICBpbmxpbmUgSW5kZXggc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJvd3MoKSAqIGNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyB3aGljaCBpcyBpbiBwcmFjdGljZSB0aGUgbnVtYmVyCisgICAgICogb2Ygc3RvcmVkIGNvZWZmaWNpZW50cy4gKi8KKyAgICBpbmxpbmUgSW5kZXggbm9uWmVyb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkZXJpdmVkKCkubm9uWmVyb3MoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0b3JhZ2UgbWFqb3IgZGltZW5zaW9uLAorICAgICAqIGkuZS4sIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYSBjb2x1bW5zIG1ham9yIG1hdHJpeCwgYW5kIHRoZSBudW1iZXIgb2Ygcm93cyBvdGhlcndpc2UgKi8KKyAgICBJbmRleCBvdXRlclNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoaW50KEZsYWdzKSAmIFJvd01ham9yQml0KSA/IHRoaXMtPnJvd3MoKSA6IHRoaXMtPmNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGlubmVyIGRpbWVuc2lvbiBhY2NvcmRpbmcgdG8gdGhlIHN0b3JhZ2Ugb3JkZXIsCisgICAgICogaS5lLiwgdGhlIG51bWJlciBvZiByb3dzIGZvciBhIGNvbHVtbnMgbWFqb3IgbWF0cml4LCBhbmQgdGhlIG51bWJlciBvZiBjb2xzIG90aGVyd2lzZSAqLworICAgIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChpbnQoRmxhZ3MpICYgUm93TWFqb3JCaXQpID8gdGhpcy0+Y29scygpIDogdGhpcy0+cm93cygpOworICAgIH0KKworICAgIGJvb2wgaXNSVmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2lzUlZhbHVlOworICAgIH0KKworICAgIERlcml2ZWQmIG1hcmtBc1JWYWx1ZSgpIHsKKyAgICAgICAgbV9pc1JWYWx1ZSA9IHRydWU7CisgICAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgU2t5bGluZU1hdHJpeEJhc2UoKSA6IG1faXNSVmFsdWUoZmFsc2UpIHsKKyAgICAgICAgLyogVE9ETyBjaGVjayBmbGFncyAqLworICAgIH0KKworICAgIGlubGluZSBEZXJpdmVkICYgb3BlcmF0b3I9KGNvbnN0IERlcml2ZWQmIG90aGVyKSB7CisgICAgICAgIHRoaXMtPm9wZXJhdG9yPTxEZXJpdmVkID4gKG90aGVyKTsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIHZvaWQgYXNzaWduR2VuZXJpYyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7CisgICAgICAgIGRlcml2ZWQoKS5yZXNpemUob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgICAgICBmb3IgKEluZGV4IHJvdyA9IDA7IHJvdyA8IHJvd3MoKTsgcm93KyspCisgICAgICAgICAgICBmb3IgKEluZGV4IGNvbCA9IDA7IGNvbCA8IGNvbHMoKTsgY29sKyspIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXIuY29lZmYocm93LCBjb2wpICE9IFNjYWxhcigwKSkKKyAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCgpLmluc2VydChyb3csIGNvbCkgPSBvdGhlci5jb2VmZihyb3csIGNvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIGRlcml2ZWQoKS5maW5hbGl6ZSgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICAgICAgICAgIGlubGluZSBEZXJpdmVkICYgb3BlcmF0b3I9KGNvbnN0IFNreWxpbmVNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7CisgICAgICAgIC8vVE9ETworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgICAgICAgICAgaW5saW5lIERlcml2ZWQgJiBvcGVyYXRvcj0oY29uc3QgU2t5bGluZVByb2R1Y3Q8TGhzLCBSaHMsIFNreWxpbmVUaW1lU2t5bGluZVByb2R1Y3Q+JiBwcm9kdWN0KTsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBTa3lsaW5lTWF0cml4QmFzZSYgbSkgeworICAgICAgICBzIDw8IG0uZGVyaXZlZCgpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgdHlwZW5hbWUgU2t5bGluZVByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICAvKiogXGludGVybmFsIHVzZSBvcGVyYXRvcj0gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+CisgICAgdm9pZCBldmFsVG8oTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+JiBkc3QpIGNvbnN0IHsKKyAgICAgICAgZHN0LnNldFplcm8oKTsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3MoKTsgaSsrKQorICAgICAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IHJvd3MoKTsgaisrKQorICAgICAgICAgICAgICAgIGRzdChpLCBqKSA9IGRlcml2ZWQoKS5jb2VmZihpLCBqKTsKKyAgICB9CisKKyAgICBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWU+IHRvRGVuc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggb3IgdmVjdG9yIG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhpcyBleHByZXNzaW9uLgorICAgICAqCisgICAgICogTm90aWNlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYSBwbGFpbiBtYXRyaXggb3IgdmVjdG9yIChub3QgYW4gZXhwcmVzc2lvbikgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMKKyAgICAgKiBhIGNvbnN0IHJlZmVyZW5jZSwgaW4gb3JkZXIgdG8gYXZvaWQgYSB1c2VsZXNzIGNvcHkuCisgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbDxEZXJpdmVkLCBJc1NreWxpbmU+Ojp0eXBlIGV2YWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbDxEZXJpdmVkPjo6dHlwZShkZXJpdmVkKCkpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGJvb2wgbV9pc1JWYWx1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU2t5bGluZU1hdHJpeEJhc2VfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZVByb2R1Y3QuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllYjgxNAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVQcm9kdWN0LmgKQEAgLTAsMCArMSwyOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR3VpbGxhdW1lIFNhdXBpbiA8Z3VpbGxhdW1lLnNhdXBpbkBjZWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NLWUxJTkVQUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU0tZTElORVBST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBQcm9kdWN0TW9kZT4KK3N0cnVjdCBTa3lsaW5lUHJvZHVjdFJldHVyblR5cGUgeworICAgIHR5cGVkZWYgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPExocywgUmhzOjpSb3dzQXRDb21waWxlVGltZT46OnR5cGUgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFJocywgTGhzOjpSb3dzQXRDb21waWxlVGltZT46OnR5cGUgUmhzTmVzdGVkOworCisgICAgdHlwZWRlZiBTa3lsaW5lUHJvZHVjdDxMaHNOZXN0ZWQsIFJoc05lc3RlZCwgUHJvZHVjdE1vZGU+IFR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNOZXN0ZWQsIHR5cGVuYW1lIFJoc05lc3RlZCwgaW50IFByb2R1Y3RNb2RlPgorc3RydWN0IGludGVybmFsOjp0cmFpdHM8U2t5bGluZVByb2R1Y3Q8TGhzTmVzdGVkLCBSaHNOZXN0ZWQsIFByb2R1Y3RNb2RlPiA+IHsKKyAgICAvLyBjbGVhbiB0aGUgbmVzdGVkIHR5cGVzOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZSBfTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmhzTmVzdGVkPjo6dHlwZSBfUmhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xoc05lc3RlZDo6U2NhbGFyIFNjYWxhcjsKKworICAgIGVudW0geworICAgICAgICBMaHNDb2VmZlJlYWRDb3N0ID0gX0xoc05lc3RlZDo6Q29lZmZSZWFkQ29zdCwKKyAgICAgICAgUmhzQ29lZmZSZWFkQ29zdCA9IF9SaHNOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgICAgIExoc0ZsYWdzID0gX0xoc05lc3RlZDo6RmxhZ3MsCisgICAgICAgIFJoc0ZsYWdzID0gX1Joc05lc3RlZDo6RmxhZ3MsCisKKyAgICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBfTGhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBfUmhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgSW5uZXJTaXplID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKF9MaHNOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lLCBfUmhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZSksCisKKyAgICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBfTGhzTmVzdGVkOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfUmhzTmVzdGVkOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKworICAgICAgICBFdmFsVG9Sb3dNYWpvciA9IChSaHNGbGFncyAmIExoc0ZsYWdzICYgUm93TWFqb3JCaXQpLAorICAgICAgICBSZXN1bHRJc1NreWxpbmUgPSBQcm9kdWN0TW9kZSA9PSBTa3lsaW5lVGltZVNreWxpbmVQcm9kdWN0LAorCisgICAgICAgIFJlbW92ZWRCaXRzID0gfigoRXZhbFRvUm93TWFqb3IgPyAwIDogUm93TWFqb3JCaXQpIHwgKFJlc3VsdElzU2t5bGluZSA/IDAgOiBTa3lsaW5lQml0KSksCisKKyAgICAgICAgRmxhZ3MgPSAoaW50KExoc0ZsYWdzIHwgUmhzRmxhZ3MpICYgSGVyZWRpdGFyeUJpdHMgJiBSZW1vdmVkQml0cykKKyAgICAgICAgfCBFdmFsQmVmb3JlQXNzaWduaW5nQml0CisgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQsCisKKyAgICAgICAgQ29lZmZSZWFkQ29zdCA9IEh1Z2VDb3N0CisgICAgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPFJlc3VsdElzU2t5bGluZSwKKyAgICAgICAgICAgIFNreWxpbmVNYXRyaXhCYXNlPFNreWxpbmVQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCBQcm9kdWN0TW9kZT4gPiwKKyAgICAgICAgICAgIE1hdHJpeEJhc2U8U2t5bGluZVByb2R1Y3Q8TGhzTmVzdGVkLCBSaHNOZXN0ZWQsIFByb2R1Y3RNb2RlPiA+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+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhciBfU2NhbGFyOworICAgIGVudW0geworICAgICAgICAgIF9GbGFncyA9IHRyYWl0czxUPjo6RmxhZ3MKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNreWxpbmVNYXRyaXg8X1NjYWxhciwgX0ZsYWdzPiB0eXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0tZTElORVVUSUxfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvQmxvY2tPZkR5bmFtaWNTcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVjNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9CTE9DS0ZPUkRZTkFNSUNNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfQkxPQ0tGT1JEWU5BTUlDTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZiAwCisKKy8vIE5PVEUgSGF2ZSB0byBiZSByZWltcGxlbWVudGVkIGFzIGEgc3BlY2lhbGl6YXRpb24gb2YgQmxvY2tJbXBsPCBEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+LCAuLi4gPgorLy8gU2VlIFNwYXJzZUJsb2NrLmggZm9yIGFuIGV4YW1wbGUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNwZWNpYWxpc2F0aW9uIGZvciBEeW5hbWljU3BhcnNlTWF0cml4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4LCBpbnQgU2l6ZT4KK2NsYXNzIFNwYXJzZUlubmVyVmVjdG9yU2V0PER5bmFtaWNTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9JbmRleD4sIFNpemU+CisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlSW5uZXJWZWN0b3JTZXQ8RHluYW1pY1NwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiwgU2l6ZT4gPgoreworICAgIHR5cGVkZWYgRHluYW1pY1NwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiBNYXRyaXhUeXBlOworICBwdWJsaWM6CisKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlSW5uZXJWZWN0b3JTZXQ+OjpJc1Jvd01ham9yIH07CisKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VJbm5lclZlY3RvclNldCkKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOiBwdWJsaWMgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvcgorICAgIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgaW5saW5lIElubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIHhwciwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yKHhwci5tX21hdHJpeCwgeHByLm1fb3V0ZXJTdGFydCArIG91dGVyKSwgbV9vdXRlcihvdXRlcikKKyAgICAgICAge30KKyAgICAgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogdGhpcy0+aW5kZXgoKTsgfQorICAgICAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IHRoaXMtPmluZGV4KCkgOiBtX291dGVyOyB9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEluZGV4IG1fb3V0ZXI7CisgICAgfTsKKworICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9vdXRlclN0YXJ0KG91dGVyU3RhcnQpLCBtX291dGVyU2l6ZShvdXRlclNpemUpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCAob3V0ZXJTdGFydD49MCkgJiYgKChvdXRlclN0YXJ0K291dGVyU2l6ZSk8PW1hdHJpeC5vdXRlclNpemUoKSkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBJbmRleCBvdXRlcikKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9vdXRlclN0YXJ0KG91dGVyKSwgbV9vdXRlclNpemUoU2l6ZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoU2l6ZSE9RHluYW1pYyk7CisgICAgICBlaWdlbl9hc3NlcnQoIChvdXRlcj49MCkgJiYgKG91dGVyPG1hdHJpeC5vdXRlclNpemUoKSkgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZUlubmVyVmVjdG9yU2V0JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBpZiAoSXNSb3dNYWpvciAhPSAoKE90aGVyRGVyaXZlZDo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkpCisgICAgICB7CisgICAgICAgIC8vIG5lZWQgdG8gdHJhbnNwb3NlID0+IHBlcmZvcm0gYSBibG9jayBldmFsdWF0aW9uIGZvbGxvd2VkIGJ5IGEgYmlnIHN3YXAKKyAgICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXIsSXNSb3dNYWpvcj9Sb3dNYWpvckJpdDowPiBhdXgob3RoZXIpOworICAgICAgICAqdGhpcyA9IGF1eC5tYXJrQXNSVmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gZXZhbHVhdGUvY29weSB2ZWN0b3IgcGVyIHZlY3RvcgorICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxtX291dGVyU2l6ZS52YWx1ZSgpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBTcGFyc2VWZWN0b3I8U2NhbGFyLElzUm93TWFqb3IgPyBSb3dNYWpvckJpdCA6IDA+IGF1eChvdGhlci5pbm5lclZlY3RvcihqKSk7CisgICAgICAgICAgbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuX2RhdGEoKVttX291dGVyU3RhcnQral0uc3dhcChhdXguX2RhdGEoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldCYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIG9wZXJhdG9yPTxTcGFyc2VJbm5lclZlY3RvclNldD4ob3RoZXIpOworICAgIH0KKworICAgIEluZGV4IG5vblplcm9zKCkgY29uc3QKKyAgICB7CisgICAgICBJbmRleCBjb3VudCA9IDA7CisgICAgICBmb3IgKEluZGV4IGo9MDsgajxtX291dGVyU2l6ZS52YWx1ZSgpOyArK2opCisgICAgICAgIGNvdW50ICs9IG1fbWF0cml4Ll9kYXRhKClbbV9vdXRlclN0YXJ0K2pdLnNpemUoKTsKKyAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBjb25zdCBTY2FsYXImIGxhc3RDb2VmZigpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShTcGFyc2VJbm5lclZlY3RvclNldCk7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXguZGF0YSgpW21fb3V0ZXJTdGFydF0uc2l6ZSgpPjApOworICAgICAgcmV0dXJuIG1fbWF0cml4LmRhdGEoKVttX291dGVyU3RhcnRdLnZhbGUobV9tYXRyaXguZGF0YSgpW21fb3V0ZXJTdGFydF0uc2l6ZSgpLTEpOworICAgIH0KKworLy8gICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZT4KKy8vICAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiAqdGhpczsKKy8vICAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUudmFsdWUoKSA6IG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX21hdHJpeC5jb2xzKCkgOiBtX291dGVyU2l6ZS52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworICAgIEluZGV4IG1fb3V0ZXJTdGFydDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU2l6ZT4gbV9vdXRlclNpemU7CisKK307CisKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9CTE9DS0ZPUkRZTkFNSUNNQVRSSVhfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrU3BhcnNlTWF0cml4LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvQmxvY2tTcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTgzNTBhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwxMDc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBEZXNpcmUgTnVlbnRzYSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRUJMT0NLTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFQkxPQ0tNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKy8qKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGNsYXNzIEJsb2NrU3BhcnNlTWF0cml4CisgICoKKyAgKiBcYnJpZWYgQSB2ZXJzYXRpbGUgc3BhcnNlIG1hdHJpeCByZXByZXNlbnRhdGlvbiB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBibG9jaworICAqCisgICogVGhpcyBjbGFzcyBwcm92aWRlcyByb3V0aW5lcyB0byBtYW5pcHVsYXRlIGJsb2NrIHNwYXJzZSBtYXRyaWNlcyBzdG9yZWQgaW4gYQorICAqIEJTUi1saWtlIHJlcHJlc2VudGF0aW9uLiBUaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgOgorICAqCisgICogMS4gQWxsIGJsb2NrcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zLCBjYWxsZWQgYmxvY2sgc2l6ZQorICAqIGluIHRoZSBmb2xsb3dpbmcuIEluIHRoaXMgY2FzZSwgaWYgdGhpcyBibG9jayBzaXplIGlzIGtub3duIGF0IGNvbXBpbGUgdGltZSwKKyAgKiBpdCBjYW4gYmUgZ2l2ZW4gYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlrZQorICAqIFxjb2RlCisgICogQmxvY2tTcGFyc2VNYXRyaXg8U2NhbGFyLCAzLCBDb2xNYWpvcj4gYm1hdChiX3Jvd3MsIGJfY29scyk7CisgICogXGVuZGNvZGUKKyAgKiBIZXJlLCBibWF0IGlzIGEgYl9yb3dzIHggYl9jb2xzIGJsb2NrIHNwYXJzZSBtYXRyaXgKKyAgKiB3aGVyZSBlYWNoIGNvZWZmaWNpZW50IGlzIGEgM3gzIGRlbnNlIG1hdHJpeC4KKyAgKiBJZiB0aGUgYmxvY2sgc2l6ZSBpcyBmaXhlZCBidXQgd2lsbCBiZSBnaXZlbiBhdCBydW50aW1lLAorICAqIFxjb2RlCisgICogQmxvY2tTcGFyc2VNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBDb2xNYWpvcj4gYm1hdChiX3Jvd3MsIGJfY29scyk7CisgICogYm1hdC5zZXRCbG9ja1NpemUoYmxvY2tfc2l6ZSk7CisgICogXGVuZGNvZGUKKyAgKgorICAqIDIuIFRoZSBzZWNvbmQgY2FzZSBpcyBmb3IgdmFyaWFibGUtYmxvY2sgc3BhcnNlIG1hdHJpY2VzLgorICAqIEhlcmUgZWFjaCBibG9jayBoYXMgaXRzIG93biBkaW1lbnNpb25zLiBUaGUgb25seSByZXN0cmljdGlvbiBpcyB0aGF0IGFsbCB0aGUgYmxvY2tzCisgICogaW4gYSByb3cgKHJlc3AuIGEgY29sdW1uKSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyAocmVzcC4gb2YgY29sdW1ucykuCisgICogSXQgaXMgdGh1cyByZXF1aXJlZCBpbiB0aGlzIGNhc2UgdG8gZGVzY3JpYmUgdGhlIGxheW91dCBvZiB0aGUgbWF0cml4IGJ5IGNhbGxpbmcKKyAgKiBzZXRCbG9ja0xheW91dChyb3dCbG9ja3MsIGNvbEJsb2NrcykuCisgICoKKyAgKiBJbiBhbnkgb2YgdGhlIHByZXZpb3VzIGNhc2UsIHRoZSBtYXRyaXggY2FuIGJlIGZpbGxlZCBieSBjYWxsaW5nIHNldEZyb21UcmlwbGV0cygpLgorICAqIEEgcmVndWxhciBzcGFyc2UgbWF0cml4IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBibG9jayBzcGFyc2UgbWF0cml4IGFuZCB2aWNlIHZlcnNhLgorICAqIEl0IGlzIG9idmlvdXNseSByZXF1aXJlZCB0byBkZXNjcmliZSB0aGUgYmxvY2sgbGF5b3V0IGJlZm9yZWhhbmQgYnkgY2FsbGluZyBlaXRoZXIKKyAgKiBzZXRCbG9ja1NpemUoKSBmb3IgZml4ZWQtc2l6ZSBibG9ja3Mgb3Igc2V0QmxvY2tMYXlvdXQgZm9yIHZhcmlhYmxlLXNpemUgYmxvY2tzLgorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIFRoZSBTY2FsYXIgdHlwZQorICAqIFx0cGFyYW0gX0Jsb2NrQXRDb21waWxlVGltZSBUaGUgYmxvY2sgbGF5b3V0IG9wdGlvbi4gSXQgdGFrZXMgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiBEeW5hbWljIDogYmxvY2sgc2l6ZSBrbm93biBhdCBydW50aW1lCisgICogYSBudW1lcmljIG51bWJlciA6IGZpeGVkLXNpemUgYmxvY2sga25vd24gYXQgY29tcGlsZSB0aW1lCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0Jsb2NrQXRDb21waWxlVGltZT1EeW5hbWljLCBpbnQgX09wdGlvbnM9Q29sTWFqb3IsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg9aW50PiBjbGFzcyBCbG9ja1NwYXJzZU1hdHJpeDsKKwordGVtcGxhdGU8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUPiBjbGFzcyBCbG9ja1NwYXJzZU1hdHJpeFZpZXc7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0Jsb2NrQXRDb21waWxlVGltZSwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPEJsb2NrU3BhcnNlTWF0cml4PF9TY2FsYXIsX0Jsb2NrQXRDb21waWxlVGltZSxfT3B0aW9ucywgX0luZGV4PiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgX0luZGV4IEluZGV4OworICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsgLy8gRklYTUUgV2hlcmUgaXMgaXQgdXNlZCA/PworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQmxvY2tTaXplID0gX0Jsb2NrQXRDb21waWxlVGltZSwKKyAgICBGbGFncyA9IF9PcHRpb25zIHwgTmVzdEJ5UmVmQml0IHwgTHZhbHVlQml0LAorICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhZENvc3QsCisgICAgU3VwcG9ydGVkQWNjZXNzUGF0dGVybnMgPSBJbm5lclJhbmRvbUFjY2Vzc1BhdHRlcm4KKyAgfTsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCbG9ja1NwYXJzZU1hdHJpeFQ+CitzdHJ1Y3QgdHJhaXRzPEJsb2NrU3BhcnNlTWF0cml4VmlldzxCbG9ja1NwYXJzZU1hdHJpeFQ+ID4KK3sKKyAgdHlwZWRlZiBSZWY8TWF0cml4PHR5cGVuYW1lIEJsb2NrU3BhcnNlTWF0cml4VDo6U2NhbGFyLCBCbG9ja1NwYXJzZU1hdHJpeFQ6OkJsb2NrU2l6ZSwgQmxvY2tTcGFyc2VNYXRyaXhUOjpCbG9ja1NpemU+ID4gU2NhbGFyOworICB0eXBlZGVmIFJlZjxNYXRyaXg8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUOjpSZWFsU2NhbGFyLCBCbG9ja1NwYXJzZU1hdHJpeFQ6OkJsb2NrU2l6ZSwgQmxvY2tTcGFyc2VNYXRyaXhUOjpCbG9ja1NpemU+ID4gUmVhbFNjYWxhcjsKKworfTsKKworLy8gRnVuY3Rpb24gb2JqZWN0IHRvIHNvcnQgYSB0cmlwbGV0IGxpc3QKK3RlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yLCBib29sIElzQ29sTWFqb3I+CitzdHJ1Y3QgVHJpcGxldENvbXAKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZSBUcmlwbGV0OworICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHJpcGxldCYgYSwgY29uc3QgVHJpcGxldCYgYikKKyAgeyBpZihJc0NvbE1ham9yKQorICAgICAgcmV0dXJuICgoYS5jb2woKSA9PSBiLmNvbCgpICYmIGEucm93KCkgPCBiLnJvdygpKSB8fCAoYS5jb2woKSA8IGIuY29sKCkpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKChhLnJvdygpID09IGIucm93KCkgJiYgYS5jb2woKSA8IGIuY29sKCkpIHx8IChhLnJvdygpIDwgYi5yb3coKSkpOworICB9Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworLyogUHJveHkgdG8gdmlldyB0aGUgYmxvY2sgc3BhcnNlIG1hdHJpeCBhcyBhIHJlZ3VsYXIgc3BhcnNlIG1hdHJpeCAqLwordGVtcGxhdGU8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUPgorY2xhc3MgQmxvY2tTcGFyc2VNYXRyaXhWaWV3IDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8QmxvY2tTcGFyc2VNYXRyaXhUPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBSZWY8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUOjpCbG9ja1NjYWxhcj4gU2NhbGFyOworICAgIHR5cGVkZWYgUmVmPHR5cGVuYW1lIEJsb2NrU3BhcnNlTWF0cml4VDo6QmxvY2tSZWFsU2NhbGFyPiBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmICBCbG9ja1NwYXJzZU1hdHJpeFQgTmVzdGVkOworICAgIGVudW0geworICAgICAgRmxhZ3MgPSBCbG9ja1NwYXJzZU1hdHJpeFQ6Ok9wdGlvbnMsCisgICAgICBPcHRpb25zID0gQmxvY2tTcGFyc2VNYXRyaXhUOjpPcHRpb25zLAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBCbG9ja1NwYXJzZU1hdHJpeFQ6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBCbG9ja1NwYXJzZU1hdHJpeFQ6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBCbG9ja1NwYXJzZU1hdHJpeFQ6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBCbG9ja1NwYXJzZU1hdHJpeFQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgcHVibGljOgorICAgIEJsb2NrU3BhcnNlTWF0cml4Vmlldyhjb25zdCBCbG9ja1NwYXJzZU1hdHJpeFQmIHNwYmxvY2ttYXQpCisgICAgIDogbV9zcGJsb2NrbWF0KHNwYmxvY2ttYXQpCisgICAge30KKworICAgIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIChGbGFncyZSb3dNYWpvckJpdCkgPT0gMSA/IHRoaXMtPnJvd3MoKSA6IHRoaXMtPmNvbHMoKTsKKyAgICB9CisgICAgSW5kZXggY29scygpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fc3BibG9ja21hdC5ibG9ja0NvbHMoKTsKKyAgICB9CisgICAgSW5kZXggcm93cygpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fc3BibG9ja21hdC5ibG9ja1Jvd3MoKTsKKyAgICB9CisgICAgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIHJldHVybiBtX3NwYmxvY2ttYXQuY29lZmYocm93LCBjb2wpOworICAgIH0KKyAgICBTY2FsYXIgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fc3BibG9ja21hdC5jb2VmZlJlZihyb3csIGNvbCk7CisgICAgfQorICAgIC8vIFdyYXBwZXIgdG8gaXRlcmF0ZSBvdmVyIGFsbCBibG9ja3MKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yIDogcHVibGljIEJsb2NrU3BhcnNlTWF0cml4VDo6QmxvY2tJbm5lckl0ZXJhdG9yCisgICAgeworICAgICAgcHVibGljOgorICAgICAgSW5uZXJJdGVyYXRvcihjb25zdCBCbG9ja1NwYXJzZU1hdHJpeFZpZXcmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBCbG9ja1NwYXJzZU1hdHJpeFQ6OkJsb2NrSW5uZXJJdGVyYXRvcihtYXQubV9zcGJsb2NrbWF0LCBvdXRlcikKKyAgICAgIHt9CisKKyAgICB9OworCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBCbG9ja1NwYXJzZU1hdHJpeFQmIG1fc3BibG9ja21hdDsKK307CisKKy8vIFByb3h5IHRvIHZpZXcgYSByZWd1bGFyIHZlY3RvciBhcyBhIGJsb2NrIHZlY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhULCB0eXBlbmFtZSBWZWN0b3JUeXBlPgorY2xhc3MgQmxvY2tWZWN0b3JWaWV3Cit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIEJsb2NrU2l6ZSA9IEJsb2NrU3BhcnNlTWF0cml4VDo6QmxvY2tTaXplLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBWZWN0b3JUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gVmVjdG9yVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBGbGFncyA9IFZlY3RvclR5cGU6OkZsYWdzCisgICAgfTsKKyAgICB0eXBlZGVmIFJlZjxjb25zdCBNYXRyaXg8dHlwZW5hbWUgQmxvY2tTcGFyc2VNYXRyaXhUOjpTY2FsYXIsIChSb3dzQXRDb21waWxlVGltZT09MSk/IDEgOiBCbG9ja1NpemUsIChDb2xzQXRDb21waWxlVGltZT09MSk/IDEgOiBCbG9ja1NpemU+ID5TY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCbG9ja1NwYXJzZU1hdHJpeFQ6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgQmxvY2tWZWN0b3JWaWV3KGNvbnN0IEJsb2NrU3BhcnNlTWF0cml4VCYgc3BibG9ja21hdCwgY29uc3QgVmVjdG9yVHlwZSYgdmVjKQorICAgIDogbV9zcGJsb2NrbWF0KHNwYmxvY2ttYXQpLG1fdmVjKHZlYykKKyAgICB7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fdmVjLmNvbHMoKTsKKyAgICB9CisgICAgaW5saW5lIEluZGV4IHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3NwYmxvY2ttYXQuYmxvY2tSb3dzKCk7CisgICAgfQorICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggYmkpIGNvbnN0CisgICAgeworICAgICAgSW5kZXggc3RhcnRSb3cgPSBtX3NwYmxvY2ttYXQuYmxvY2tSb3dzSW5kZXgoYmkpOworICAgICAgSW5kZXggcm93U2l6ZSA9IG1fc3BibG9ja21hdC5ibG9ja1Jvd3NJbmRleChiaSsxKSAtIHN0YXJ0Um93OworICAgICAgcmV0dXJuIG1fdmVjLm1pZGRsZVJvd3Moc3RhcnRSb3csIHJvd1NpemUpOworICAgIH0KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IGJpLCBJbmRleCBqKSBjb25zdAorICAgIHsKKyAgICAgIEluZGV4IHN0YXJ0Um93ID0gbV9zcGJsb2NrbWF0LmJsb2NrUm93c0luZGV4KGJpKTsKKyAgICAgIEluZGV4IHJvd1NpemUgPSBtX3NwYmxvY2ttYXQuYmxvY2tSb3dzSW5kZXgoYmkrMSkgLSBzdGFydFJvdzsKKyAgICAgIHJldHVybiBtX3ZlYy5ibG9jayhzdGFydFJvdywgaiwgcm93U2l6ZSwgMSk7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgQmxvY2tTcGFyc2VNYXRyaXhUJiBtX3NwYmxvY2ttYXQ7CisgICAgY29uc3QgVmVjdG9yVHlwZSYgbV92ZWM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBJbmRleD4gY2xhc3MgQmxvY2tWZWN0b3JSZXR1cm47CisKKworLy8gUHJveHkgdG8gdmlldyBhIHJlZ3VsYXIgdmVjdG9yIGFzIGEgYmxvY2sgdmVjdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBCbG9ja1NwYXJzZU1hdHJpeFQsIHR5cGVuYW1lIFZlY3RvclR5cGU+CitjbGFzcyBCbG9ja1ZlY3RvclJldHVybgoreworICBwdWJsaWM6CisgICAgZW51bSB7CisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IFZlY3RvclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBWZWN0b3JUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIEZsYWdzID0gVmVjdG9yVHlwZTo6RmxhZ3MKKyAgICB9OworICAgIHR5cGVkZWYgUmVmPE1hdHJpeDx0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gPiBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCbG9ja1NwYXJzZU1hdHJpeFQ6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgQmxvY2tWZWN0b3JSZXR1cm4oY29uc3QgQmxvY2tTcGFyc2VNYXRyaXhUJiBzcGJsb2NrbWF0LCBWZWN0b3JUeXBlJiB2ZWMpCisgICAgOiBtX3NwYmxvY2ttYXQoc3BibG9ja21hdCksbV92ZWModmVjKQorICAgIHsgfQorICAgIGlubGluZSBJbmRleCBzaXplKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9zcGJsb2NrbWF0LmJsb2NrUm93cygpOworICAgIH0KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmUmVmKEluZGV4IGJpKQorICAgIHsKKyAgICAgIEluZGV4IHN0YXJ0Um93ID0gbV9zcGJsb2NrbWF0LmJsb2NrUm93c0luZGV4KGJpKTsKKyAgICAgIEluZGV4IHJvd1NpemUgPSBtX3NwYmxvY2ttYXQuYmxvY2tSb3dzSW5kZXgoYmkrMSkgLSBzdGFydFJvdzsKKyAgICAgIHJldHVybiBtX3ZlYy5taWRkbGVSb3dzKHN0YXJ0Um93LCByb3dTaXplKTsKKyAgICB9CisgICAgaW5saW5lIFNjYWxhciBjb2VmZlJlZihJbmRleCBiaSwgSW5kZXggaikKKyAgICB7CisgICAgICBJbmRleCBzdGFydFJvdyA9IG1fc3BibG9ja21hdC5ibG9ja1Jvd3NJbmRleChiaSk7CisgICAgICBJbmRleCByb3dTaXplID0gbV9zcGJsb2NrbWF0LmJsb2NrUm93c0luZGV4KGJpKzEpIC0gc3RhcnRSb3c7CisgICAgICByZXR1cm4gbV92ZWMuYmxvY2soc3RhcnRSb3csIGosIHJvd1NpemUsIDEpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgQmxvY2tTcGFyc2VNYXRyaXhUJiBtX3NwYmxvY2ttYXQ7CisgICAgVmVjdG9yVHlwZSYgbV92ZWM7Cit9OworCisvLyBCbG9jayB2ZXJzaW9uIG9mIHRoZSBzcGFyc2UgZGVuc2UgcHJvZHVjdAordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBCbG9ja1NwYXJzZVRpbWVEZW5zZVByb2R1Y3Q7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJsb2NrU3BhcnNlTWF0cml4VCwgdHlwZW5hbWUgVmVjVHlwZT4KK3N0cnVjdCB0cmFpdHM8QmxvY2tTcGFyc2VUaW1lRGVuc2VQcm9kdWN0PEJsb2NrU3BhcnNlTWF0cml4VCwgVmVjVHlwZT4gPgoreworICB0eXBlZGVmIERlbnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIEJsb2NrU3BhcnNlTWF0cml4VDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCbG9ja1NwYXJzZU1hdHJpeFQ6OkluZGV4IEluZGV4OworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgRmxhZ3MgPSAwLAorICAgIENvZWZmUmVhZENvc3QgPSBpbnRlcm5hbDo6dHJhaXRzPEJsb2NrU3BhcnNlTWF0cml4VD46OkNvZWZmUmVhZENvc3QKKyAgfTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBCbG9ja1NwYXJzZVRpbWVEZW5zZVByb2R1Y3QKKyAgOiBwdWJsaWMgUHJvZHVjdEJhc2U8QmxvY2tTcGFyc2VUaW1lRGVuc2VQcm9kdWN0PExocyxSaHM+LCBMaHMsIFJocz4KK3sKKyAgcHVibGljOgorICAgIEVJR0VOX1BST0RVQ1RfUFVCTElDX0lOVEVSRkFDRShCbG9ja1NwYXJzZVRpbWVEZW5zZVByb2R1Y3QpCisKKyAgICBCbG9ja1NwYXJzZVRpbWVEZW5zZVByb2R1Y3QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKSA6IEJhc2UobGhzLHJocykKKyAgICB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRlc3QsIGNvbnN0IHR5cGVuYW1lIFJoczo6U2NhbGFyJiBhbHBoYSkgY29uc3QKKyAgICB7CisgICAgICBCbG9ja1ZlY3RvclJldHVybjxMaHMsRGVzdD4gdG1wRGVzdChtX2xocywgZGVzdCk7CisgICAgICBpbnRlcm5hbDo6c3BhcnNlX3RpbWVfZGVuc2VfcHJvZHVjdCggQmxvY2tTcGFyc2VNYXRyaXhWaWV3PExocz4obV9saHMpLCAgQmxvY2tWZWN0b3JWaWV3PExocywgUmhzPihtX2xocywgbV9yaHMpLCB0bXBEZXN0LCBhbHBoYSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgQmxvY2tTcGFyc2VUaW1lRGVuc2VQcm9kdWN0JiBvcGVyYXRvcj0oY29uc3QgQmxvY2tTcGFyc2VUaW1lRGVuc2VQcm9kdWN0Jik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0Jsb2NrQXRDb21waWxlVGltZSwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorY2xhc3MgQmxvY2tTcGFyc2VNYXRyaXggOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxCbG9ja1NwYXJzZU1hdHJpeDxfU2NhbGFyLF9CbG9ja0F0Q29tcGlsZVRpbWUsIF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVmX3NlbGVjdG9yPEJsb2NrU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9CbG9ja0F0Q29tcGlsZVRpbWUsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Ojp0eXBlIE5lc3RlZDsKKworICAgIGVudW0geworICAgICAgT3B0aW9ucyA9IF9PcHRpb25zLAorICAgICAgRmxhZ3MgPSBPcHRpb25zLAorICAgICAgQmxvY2tTaXplPV9CbG9ja0F0Q29tcGlsZVRpbWUsCisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSAwLAorICAgICAgSXNDb2xNYWpvciA9IEZsYWdzJlJvd01ham9yQml0ID8gMCA6IDEKKyAgICB9OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgX0Jsb2NrQXRDb21waWxlVGltZSwgX0Jsb2NrQXRDb21waWxlVGltZSxJc0NvbE1ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvcj4gQmxvY2tTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgX0Jsb2NrQXRDb21waWxlVGltZSwgX0Jsb2NrQXRDb21waWxlVGltZSxJc0NvbE1ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvcj4gQmxvY2tSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPF9CbG9ja0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMsIFNjYWxhciwgQmxvY2tTY2FsYXI+Ojp0eXBlIEJsb2NrU2NhbGFyUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIEJsb2NrU3BhcnNlTWF0cml4PFNjYWxhciwgQmxvY2tTaXplLCBJc0NvbE1ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgU3RvcmFnZUluZGV4PiBQbGFpbk9iamVjdDsKKyAgcHVibGljOgorICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBCbG9ja1NwYXJzZU1hdHJpeCgpCisgICAgOiBtX2lubmVyQlNpemUoMCksbV9vdXRlckJTaXplKDApLG1faW5uZXJPZmZzZXQoMCksbV9vdXRlck9mZnNldCgwKSwKKyAgICAgIG1fbm9uemVyb3NibG9ja3MoMCksbV92YWx1ZXMoMCksbV9ibG9ja1B0cigwKSxtX2luZGljZXMoMCksCisgICAgICBtX291dGVySW5kZXgoMCksbV9ibG9ja1NpemUoQmxvY2tTaXplKQorICAgIHsgfQorCisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29uc3RydWN0IGFuZCByZXNpemUKKyAgICAgKgorICAgICAqLworICAgIEJsb2NrU3BhcnNlTWF0cml4KEluZGV4IGJyb3csIEluZGV4IGJjb2wpCisgICAgICA6IG1faW5uZXJCU2l6ZShJc0NvbE1ham9yID8gYnJvdyA6IGJjb2wpLAorICAgICAgICBtX291dGVyQlNpemUoSXNDb2xNYWpvciA/IGJjb2wgOiBicm93KSwKKyAgICAgICAgbV9pbm5lck9mZnNldCgwKSxtX291dGVyT2Zmc2V0KDApLG1fbm9uemVyb3NibG9ja3MoMCksCisgICAgICAgIG1fdmFsdWVzKDApLG1fYmxvY2tQdHIoMCksbV9pbmRpY2VzKDApLAorICAgICAgICBtX291dGVySW5kZXgoMCksbV9ibG9ja1NpemUoQmxvY2tTaXplKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIENvcHktY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBCbG9ja1NwYXJzZU1hdHJpeChjb25zdCBCbG9ja1NwYXJzZU1hdHJpeCYgb3RoZXIpCisgICAgICA6IG1faW5uZXJCU2l6ZShvdGhlci5tX2lubmVyQlNpemUpLG1fb3V0ZXJCU2l6ZShvdGhlci5tX291dGVyQlNpemUpLAorICAgICAgICBtX25vbnplcm9zYmxvY2tzKG90aGVyLm1fbm9uemVyb3NibG9ja3MpLG1fbm9uemVyb3Mob3RoZXIubV9ub256ZXJvcyksCisgICAgICAgIG1fYmxvY2tQdHIoMCksbV9ibG9ja1NpemUob3RoZXIubV9ibG9ja1NpemUpCisgICAgeworICAgICAgLy8gc2hvdWxkIHdlIGFsbG93IGNvcHlpbmcgYmV0d2VlbiB2YXJpYWJsZS1zaXplIGJsb2NrcyBhbmQgZml4ZWQtc2l6ZSBibG9ja3MgPz8KKyAgICAgIGVpZ2VuX2Fzc2VydChtX2Jsb2NrU2l6ZSA9PSBCbG9ja1NpemUgJiYgIiBDQU4gTk9UIENPUFkgQkVUV0VFTiBGSVhFRC1TSVpFIEFORCBWQVJJQUJMRS1TSVpFIEJMT0NLUyIpOworCisgICAgICBzdGQ6OmNvcHkob3RoZXIubV9pbm5lck9mZnNldCwgb3RoZXIubV9pbm5lck9mZnNldCttX2lubmVyQlNpemUrMSwgbV9pbm5lck9mZnNldCk7CisgICAgICBzdGQ6OmNvcHkob3RoZXIubV9vdXRlck9mZnNldCwgb3RoZXIubV9vdXRlck9mZnNldCttX291dGVyQlNpemUrMSwgbV9vdXRlck9mZnNldCk7CisgICAgICBzdGQ6OmNvcHkob3RoZXIubV92YWx1ZXMsIG90aGVyLm1fdmFsdWVzK21fbm9uemVyb3MsIG1fdmFsdWVzKTsKKworICAgICAgaWYobV9ibG9ja1NpemUgIT0gRHluYW1pYykKKyAgICAgICAgc3RkOjpjb3B5KG90aGVyLm1fYmxvY2tQdHIsIG90aGVyLm1fYmxvY2tQdHIrbV9ub256ZXJvc2Jsb2NrcywgbV9ibG9ja1B0cik7CisKKyAgICAgIHN0ZDo6Y29weShvdGhlci5tX2luZGljZXMsIG90aGVyLm1faW5kaWNlcyttX25vbnplcm9zYmxvY2tzLCBtX2luZGljZXMpOworICAgICAgc3RkOjpjb3B5KG90aGVyLm1fb3V0ZXJJbmRleCwgb3RoZXIubV9vdXRlckluZGV4K21fb3V0ZXJCU2l6ZSwgbV9vdXRlckluZGV4KTsKKyAgICB9CisKKyAgICBmcmllbmQgdm9pZCBzd2FwKEJsb2NrU3BhcnNlTWF0cml4JiBmaXJzdCwgQmxvY2tTcGFyc2VNYXRyaXgmIHNlY29uZCkKKyAgICB7CisgICAgICBzdGQ6OnN3YXAoZmlyc3QubV9pbm5lckJTaXplLCBzZWNvbmQubV9pbm5lckJTaXplKTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5tX291dGVyQlNpemUsIHNlY29uZC5tX291dGVyQlNpemUpOworICAgICAgc3RkOjpzd2FwKGZpcnN0Lm1faW5uZXJPZmZzZXQsIHNlY29uZC5tX2lubmVyT2Zmc2V0KTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5tX291dGVyT2Zmc2V0LCBzZWNvbmQubV9vdXRlck9mZnNldCk7CisgICAgICBzdGQ6OnN3YXAoZmlyc3QubV9ub256ZXJvc2Jsb2Nrcywgc2Vjb25kLm1fbm9uemVyb3NibG9ja3MpOworICAgICAgc3RkOjpzd2FwKGZpcnN0Lm1fbm9uemVyb3MsIHNlY29uZC5tX25vbnplcm9zKTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5tX3ZhbHVlcywgc2Vjb25kLm1fdmFsdWVzKTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5tX2Jsb2NrUHRyLCBzZWNvbmQubV9ibG9ja1B0cik7CisgICAgICBzdGQ6OnN3YXAoZmlyc3QubV9pbmRpY2VzLCBzZWNvbmQubV9pbmRpY2VzKTsKKyAgICAgIHN0ZDo6c3dhcChmaXJzdC5tX291dGVySW5kZXgsIHNlY29uZC5tX291dGVySW5kZXgpOworICAgICAgc3RkOjpzd2FwKGZpcnN0Lm1fQmxvY2tTaXplLCBzZWNvbmQubV9ibG9ja1NpemUpOworICAgIH0KKworICAgIEJsb2NrU3BhcnNlTWF0cml4JiBvcGVyYXRvcj0oQmxvY2tTcGFyc2VNYXRyaXggb3RoZXIpCisgICAgeworICAgICAgLy9Db3B5LWFuZC1zd2FwIHBhcmFkaWdtIC4uLiBhdm9pZCBsZWFrZWQgZGF0YSBpZiB0aHJvd24KKyAgICAgIHN3YXAoKnRoaXMsIG90aGVyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBEZXN0cnVjdG9yCisgICAgfkJsb2NrU3BhcnNlTWF0cml4KCkKKyAgICB7CisgICAgICBkZWxldGVbXSBtX291dGVySW5kZXg7CisgICAgICBkZWxldGVbXSBtX2lubmVyT2Zmc2V0OworICAgICAgZGVsZXRlW10gbV9vdXRlck9mZnNldDsKKyAgICAgIGRlbGV0ZVtdIG1faW5kaWNlczsKKyAgICAgIGRlbGV0ZVtdIG1fYmxvY2tQdHI7CisgICAgICBkZWxldGVbXSBtX3ZhbHVlczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgQ29uc3RydWN0b3IgZnJvbSBhIHNwYXJzZSBtYXRyaXgKKyAgICAgICoKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBpbmxpbmUgQmxvY2tTcGFyc2VNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgc3BtYXQpIDogbV9ibG9ja1NpemUoQmxvY2tTaXplKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKG1fYmxvY2tTaXplICE9IER5bmFtaWMpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9GSVhFRF9TSVpFKTsKKworICAgICAgKnRoaXMgPSBzcG1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICogXGJyaWVmIEFzc2lnbm1lbnQgZnJvbSBhIHNwYXJzZSBtYXRyaXggd2l0aCB0aGUgc2FtZSBzdG9yYWdlIG9yZGVyCisgICAgICAqCisgICAgICAqIENvbnZlcnQgZnJvbSBhIHNwYXJzZSBtYXRyaXggdG8gYmxvY2sgc3BhcnNlIG1hdHJpeC4KKyAgICAgICogXHdhcm5pbmcgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdHQgaXMgbmVjZXNzYXJ5IHRvIGNhbGwKKyAgICAgICogZWl0aGVyIHNldEJsb2NrTGF5b3V0KCkgKG1hdHJpY2VzIHdpdGggdmFyaWFibGUtc2l6ZSBibG9ja3MpCisgICAgICAqIG9yIHNldEJsb2NrU2l6ZSgpIChmb3IgZml4ZWQtc2l6ZSBibG9ja3MpLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIGlubGluZSBCbG9ja1NwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeFR5cGUmIHNwbWF0KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgobV9pbm5lckJTaXplICE9IDAgJiYgbV9vdXRlckJTaXplICE9IDApCisgICAgICAgICAgICAgICAgICAgJiYgIlRyeWluZyB0byBhc3NpZ24gdG8gYSB6ZXJvLXNpemUgbWF0cml4LCBjYWxsIHJlc2l6ZSgpIGZpcnN0Iik7CisgICAgICBlaWdlbl9hc3NlcnQoKChNYXRyaXhUeXBlOjpPcHRpb25zJlJvd01ham9yQml0KSAhPSBJc0NvbE1ham9yKSAmJiAiV3Jvbmcgc3RvcmFnZSBvcmRlciIpOworICAgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8Ym9vbCxNYXRyaXhUeXBlOjpPcHRpb25zLHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4PiBNYXRyaXhQYXR0ZXJuVHlwZTsKKyAgICAgIE1hdHJpeFBhdHRlcm5UeXBlICBibG9ja1BhdHRlcm4oYmxvY2tSb3dzKCksIGJsb2NrQ29scygpKTsKKyAgICAgIG1fbm9uemVyb3MgPSAwOworCisgICAgICAvLyBGaXJzdCwgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIG5vbnplcm8gYmxvY2tzIGFuZCB0aGVpciBsb2NhdGlvbnMKKyAgICAgIGZvcihTdG9yYWdlSW5kZXggYmogPSAwOyBiaiA8IG1fb3V0ZXJCU2l6ZTsgKytiaikKKyAgICAgIHsKKyAgICAgICAgLy8gQnJvd3NlIGVhY2ggb3V0ZXIgYmxvY2sgYW5kIGNvbXB1dGUgdGhlIHN0cnVjdHVyZQorICAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBuemJsb2Nrc0ZsYWcobV9pbm5lckJTaXplLGZhbHNlKTsgIC8vIFJlY29yZCB0aGUgZXhpc3RpbmcgYmxvY2tzCisgICAgICAgIGJsb2NrUGF0dGVybi5zdGFydFZlYyhiaik7CisgICAgICAgIGZvcihTdG9yYWdlSW5kZXggaiA9IGJsb2NrT3V0ZXJJbmRleChiaik7IGogPCBibG9ja091dGVySW5kZXgoYmorMSk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXRfc3BtYXQoc3BtYXQsIGopOworICAgICAgICAgIGZvcig7IGl0X3NwbWF0OyArK2l0X3NwbWF0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFN0b3JhZ2VJbmRleCBiaSA9IGlubmVyVG9CbG9jayhpdF9zcG1hdC5pbmRleCgpKTsgLy8gSW5kZXggb2YgdGhlIGN1cnJlbnQgbm9uemVybyBibG9jaworICAgICAgICAgICAgaWYoIW56YmxvY2tzRmxhZ1tiaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGluZGV4IG9mIHRoaXMgbm9uemVybyBibG9jaworICAgICAgICAgICAgICBuemJsb2Nrc0ZsYWdbYmldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYmxvY2tQYXR0ZXJuLmluc2VydEJhY2tCeU91dGVySW5uZXJVbm9yZGVyZWQoYmosIGJpKSA9IHRydWU7CisgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHRvdGFsIG51bWJlciBvZiBub256ZXJvcyAoaW5jbHVkaW5nIGV4cGxpY2l0IHplcm9zIGluIGJsb2NrcykKKyAgICAgICAgICAgICAgbV9ub256ZXJvcyArPSBibG9ja091dGVyU2l6ZShiaikgKiBibG9ja0lubmVyU2l6ZShiaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IC8vIGVuZCBjdXJyZW50IG91dGVyIGJsb2NrCisgICAgICB9CisgICAgICBibG9ja1BhdHRlcm4uZmluYWxpemUoKTsKKworICAgICAgLy8gQWxsb2NhdGUgdGhlIGludGVybmFsIGFycmF5cworICAgICAgc2V0QmxvY2tTdHJ1Y3R1cmUoYmxvY2tQYXR0ZXJuKTsKKworICAgICAgZm9yKFN0b3JhZ2VJbmRleCBueiA9IDA7IG56IDwgbV9ub256ZXJvczsgKytueikgbV92YWx1ZXNbbnpdID0gU2NhbGFyKDApOworICAgICAgZm9yKFN0b3JhZ2VJbmRleCBiaiA9IDA7IGJqIDwgbV9vdXRlckJTaXplOyArK2JqKQorICAgICAgeworICAgICAgICAvLyBOb3cgY29weSB0aGUgdmFsdWVzCisgICAgICAgIGZvcihTdG9yYWdlSW5kZXggaiA9IGJsb2NrT3V0ZXJJbmRleChiaik7IGogPCBibG9ja091dGVySW5kZXgoYmorMSk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIC8vIEJyb3dzZSB0aGUgb3V0ZXIgYmxvY2sgY29sdW1uIGJ5IGNvbHVtbiAoZm9yIGNvbHVtbi1tYWpvciBtYXRyaWNlcykKKyAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0X3NwbWF0KHNwbWF0LCBqKTsKKyAgICAgICAgICBmb3IoOyBpdF9zcG1hdDsgKytpdF9zcG1hdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTdG9yYWdlSW5kZXggaWR4ID0gMDsgLy8gUG9zaXRpb24gb2YgdGhpcyBibG9jayBpbiB0aGUgY29sdW1uIGJsb2NrCisgICAgICAgICAgICBTdG9yYWdlSW5kZXggYmkgPSBpbm5lclRvQmxvY2soaXRfc3BtYXQuaW5kZXgoKSk7IC8vIEluZGV4IG9mIHRoZSBjdXJyZW50IG5vbnplcm8gYmxvY2sKKyAgICAgICAgICAgIC8vIEdvIHRvIHRoZSBpbm5lciBibG9jayB3aGVyZSB0aGlzIGVsZW1lbnQgYmVsb25ncyB0bworICAgICAgICAgICAgd2hpbGUoYmkgPiBtX2luZGljZXNbbV9vdXRlckluZGV4W2JqXStpZHhdKSArK2lkeDsgLy8gTm90IGV4cGVuc2l2ZSBmb3Igb3JkZXJlZCBibG9ja3MKKyAgICAgICAgICAgIFN0b3JhZ2VJbmRleCBpZHhWYWw7Ly8gR2V0IHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkgb2YgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgIGlmKG1fYmxvY2tTaXplID09IER5bmFtaWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIE9mZnNldCBmcm9tIGFsbCBibG9ja3MgYmVmb3JlIC4uLgorICAgICAgICAgICAgICBpZHhWYWwgPSAgbV9ibG9ja1B0clttX291dGVySW5kZXhbYmpdK2lkeF07CisgICAgICAgICAgICAgIC8vIC4uLiBhbmQgb2Zmc2V0IGluc2lkZSB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgaWR4VmFsICs9IChqIC0gYmxvY2tPdXRlckluZGV4KGJqKSkgKiBibG9ja091dGVyU2l6ZShiaikgKyBpdF9zcG1hdC5pbmRleCgpIC0gbV9pbm5lck9mZnNldFtiaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIEFsbCBibG9ja3MgYmVmb3JlCisgICAgICAgICAgICAgIGlkeFZhbCA9IChtX291dGVySW5kZXhbYmpdICsgaWR4KSAqIG1fYmxvY2tTaXplICogbV9ibG9ja1NpemU7CisgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgaWR4VmFsICs9IChqIC0gYmxvY2tPdXRlckluZGV4KGJqKSkgKiBtX2Jsb2NrU2l6ZSArIChpdF9zcG1hdC5pbmRleCgpJW1fYmxvY2tTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgdmFsdWUKKyAgICAgICAgICAgIG1fdmFsdWVzW2lkeFZhbF0gPSBpdF9zcG1hdC52YWx1ZSgpOworICAgICAgICAgIH0gLy8gZW5kIG9mIHRoaXMgY29sdW1uCisgICAgICAgIH0gLy8gZW5kIG9mIHRoaXMgYmxvY2sKKyAgICAgIH0gLy8gZW5kIG9mIHRoaXMgb3V0ZXIgYmxvY2sKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgU2V0IHRoZSBub256ZXJvIGJsb2NrIHBhdHRlcm4gb2YgdGhlIG1hdHJpeAorICAgICAgKgorICAgICAgKiBHaXZlbiBhIHNwYXJzZSBtYXRyaXggZGVzY3JpYmluZyB0aGUgbm9uemVybyBibG9jayBwYXR0ZXJuLAorICAgICAgKiB0aGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBpbnRlcm5hbCBwb2ludGVycyBmb3IgdmFsdWVzLgorICAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGFueSAqbm9uemVybyogYmxvY2sgKGJpLCBiaikgY2FuIGJlIHNldAorICAgICAgKiB3aXRoIGEgc2ltcGxlIGNhbGwgdG8gY29lZmZSZWYoYmksYmopLgorICAgICAgKgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0dCBpcyBuZWNlc3NhcnkgdG8gY2FsbAorICAgICAgKiBlaXRoZXIgc2V0QmxvY2tMYXlvdXQoKSAobWF0cmljZXMgd2l0aCB2YXJpYWJsZS1zaXplIGJsb2NrcykKKyAgICAgICogb3Igc2V0QmxvY2tTaXplKCkgKGZvciBmaXhlZC1zaXplIGJsb2NrcykuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBibG9ja1BhdHRlcm4gU3BhcnNlIG1hdHJpeCBvZiBib29sZWFuIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIGJsb2NrIHN0cnVjdHVyZQorICAgICAgKgorICAgICAgKiBcc2Egc2V0QmxvY2tMYXlvdXQoKSBcc2Egc2V0QmxvY2tTaXplKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIHNldEJsb2NrU3RydWN0dXJlKGNvbnN0IE1hdHJpeFR5cGUmIGJsb2NrUGF0dGVybikKKyAgICB7CisgICAgICByZXNpemUoYmxvY2tQYXR0ZXJuLnJvd3MoKSwgYmxvY2tQYXR0ZXJuLmNvbHMoKSk7CisgICAgICByZXNlcnZlKGJsb2NrUGF0dGVybi5ub25aZXJvcygpKTsKKworICAgICAgLy8gQnJvd3NlIHRoZSBibG9jayBwYXR0ZXJuIGFuZCBzZXQgdXAgdGhlIHZhcmlvdXMgcG9pbnRlcnMKKyAgICAgIG1fb3V0ZXJJbmRleFswXSA9IDA7CisgICAgICBpZihtX2Jsb2NrU2l6ZSA9PSBEeW5hbWljKSBtX2Jsb2NrUHRyWzBdID0gMDsKKyAgICAgIGZvcihTdG9yYWdlSW5kZXggbnogPSAwOyBueiA8IG1fbm9uemVyb3M7ICsrbnopIG1fdmFsdWVzW256XSA9IFNjYWxhcigwKTsKKyAgICAgIGZvcihTdG9yYWdlSW5kZXggYmogPSAwOyBiaiA8IG1fb3V0ZXJCU2l6ZTsgKytiaikKKyAgICAgIHsKKyAgICAgICAgLy9Ccm93c2UgZWFjaCBvdXRlciBibG9jaworCisgICAgICAgIC8vRmlyc3QsIGNvcHkgYW5kIHNhdmUgdGhlIGluZGljZXMgb2Ygbm9uemVybyBibG9ja3MKKyAgICAgICAgLy9GSVhNRSA6IGZpbmQgYSB3YXkgdG8gYXZvaWQgdGhpcyAuLi4KKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBuekJsb2NrSWR4OworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KGJsb2NrUGF0dGVybiwgYmopOworICAgICAgICBmb3IoOyBpdDsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIG56QmxvY2tJZHgucHVzaF9iYWNrKGl0LmluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c29ydChuekJsb2NrSWR4LmJlZ2luKCksIG56QmxvY2tJZHguZW5kKCkpOworCisgICAgICAgIC8vIE5vdywgZmlsbCBibG9jayBpbmRpY2VzIGFuZCAoZXZlbnR1YWxseSkgcG9pbnRlcnMgdG8gYmxvY2tzCisgICAgICAgIGZvcihTdG9yYWdlSW5kZXggaWR4ID0gMDsgaWR4IDwgbnpCbG9ja0lkeC5zaXplKCk7ICsraWR4KQorICAgICAgICB7CisgICAgICAgICAgU3RvcmFnZUluZGV4IG9mZnNldCA9IG1fb3V0ZXJJbmRleFtial0raWR4OyAvLyBvZmZzZXQgaW4gbV9pbmRpY2VzCisgICAgICAgICAgbV9pbmRpY2VzW29mZnNldF0gPSBuekJsb2NrSWR4W2lkeF07CisgICAgICAgICAgaWYobV9ibG9ja1NpemUgPT0gRHluYW1pYykKKyAgICAgICAgICAgIG1fYmxvY2tQdHJbb2Zmc2V0XSA9IG1fYmxvY2tQdHJbb2Zmc2V0LTFdICsgYmxvY2tJbm5lclNpemUobnpCbG9ja0lkeFtpZHhdKSAqIGJsb2NrT3V0ZXJTaXplKGJqKTsKKyAgICAgICAgICAvLyBUaGVyZSBpcyBubyBibG9ja1B0ciBmb3IgZml4ZWQtc2l6ZSBibG9ja3MuLi4gbm90IG5lZWRlZCAhPz8/CisgICAgICAgIH0KKyAgICAgICAgLy8gU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBvdXRlciBibG9jaworICAgICAgICBtX291dGVySW5kZXhbYmorMV0gPSBtX291dGVySW5kZXhbYmpdICsgbnpCbG9ja0lkeC5zaXplKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxicmllZiBTZXQgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGJsb2NrcworICAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCByZXNpemUoSW5kZXggYnJvdywgSW5kZXggYmNvbCkKKyAgICB7CisgICAgICBtX2lubmVyQlNpemUgPSBJc0NvbE1ham9yID8gYnJvdyA6IGJjb2w7CisgICAgICBtX291dGVyQlNpemUgPSBJc0NvbE1ham9yID8gYmNvbCA6IGJyb3c7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxicmllZiBzZXQgdGhlIGJsb2NrIHNpemUgYXQgcnVudGltZSBmb3IgZml4ZWQtc2l6ZSBibG9jayBsYXlvdXQKKyAgICAgICoKKyAgICAgICogQ2FsbCB0aGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgYmxvY2tzCisgICAgICAqLworICAgIGlubGluZSB2b2lkIHNldEJsb2NrU2l6ZShJbmRleCBibG9ja1NpemUpCisgICAgeworICAgICAgbV9ibG9ja1NpemUgPSBibG9ja1NpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxicmllZiBTZXQgdGhlIHJvdyBhbmQgY29sdW1uIGJsb2NrIGxheW91dHMsCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBzaXplIG9mIGVhY2ggcm93IGFuZCBjb2x1bW4gYmxvY2suCisgICAgICAqIFNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgYmxvY2tzIHdpdGggdmFyaWFibGUgc2l6ZS4KKyAgICAgICogXHBhcmFtIHJvd0Jsb2NrcyA6IE51bWJlciBvZiByb3dzIHBlciByb3cgYmxvY2sKKyAgICAgICogXHBhcmFtIGNvbEJsb2NrcyA6IE51bWJlciBvZiBjb2x1bW5zIHBlciBjb2x1bW4gYmxvY2sKKyAgICAgICogXHNhIHJlc2l6ZSgpLCBzZXRCbG9ja1NpemUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRCbG9ja0xheW91dChjb25zdCBWZWN0b3JYaSYgcm93QmxvY2tzLCBjb25zdCBWZWN0b3JYaSYgY29sQmxvY2tzKQorICAgIHsKKyAgICAgIGNvbnN0IFZlY3RvclhpJiBpbm5lckJsb2NrcyA9IElzQ29sTWFqb3IgPyByb3dCbG9ja3MgOiBjb2xCbG9ja3M7CisgICAgICBjb25zdCBWZWN0b3JYaSYgb3V0ZXJCbG9ja3MgPSBJc0NvbE1ham9yID8gY29sQmxvY2tzIDogcm93QmxvY2tzOworICAgICAgZWlnZW5fYXNzZXJ0KG1faW5uZXJCU2l6ZSA9PSBpbm5lckJsb2Nrcy5zaXplKCkgJiYgIkNIRUNLIFRIRSBOVU1CRVIgT0YgUk9XIE9SIENPTFVNTiBCTE9DS1MiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX291dGVyQlNpemUgPT0gb3V0ZXJCbG9ja3Muc2l6ZSgpICYmICJDSEVDSyBUSEUgTlVNQkVSIE9GIFJPVyBPUiBDT0xVTU4gQkxPQ0tTIik7CisgICAgICBtX291dGVyQlNpemUgPSBvdXRlckJsb2Nrcy5zaXplKCk7CisgICAgICAvLyAgc3RhcnRpbmcgaW5kZXggb2YgYmxvY2tzLi4uIGN1bXVsYXRpdmUgc3VtcworICAgICAgbV9pbm5lck9mZnNldCA9IG5ldyBTdG9yYWdlSW5kZXhbbV9pbm5lckJTaXplKzFdOworICAgICAgbV9vdXRlck9mZnNldCA9IG5ldyBTdG9yYWdlSW5kZXhbbV9vdXRlckJTaXplKzFdOworICAgICAgbV9pbm5lck9mZnNldFswXSA9IDA7CisgICAgICBtX291dGVyT2Zmc2V0WzBdID0gMDsKKyAgICAgIHN0ZDo6cGFydGlhbF9zdW0oJmlubmVyQmxvY2tzWzBdLCAmaW5uZXJCbG9ja3NbbV9pbm5lckJTaXplLTFdKzEsICZtX2lubmVyT2Zmc2V0WzFdKTsKKyAgICAgIHN0ZDo6cGFydGlhbF9zdW0oJm91dGVyQmxvY2tzWzBdLCAmb3V0ZXJCbG9ja3NbbV9vdXRlckJTaXplLTFdKzEsICZtX291dGVyT2Zmc2V0WzFdKTsKKworICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnplcm9zCisgICAgICBtX25vbnplcm9zID0gMDsKKyAgICAgIGZvcihTdG9yYWdlSW5kZXggYmogPSAwOyBiaiA8IG1fb3V0ZXJCU2l6ZTsgKytiaikKKyAgICAgICAgZm9yKFN0b3JhZ2VJbmRleCBiaSA9IDA7IGJpIDwgbV9pbm5lckJTaXplOyArK2JpKQorICAgICAgICAgIG1fbm9uemVyb3MgKz0gb3V0ZXJCbG9ja3NbYmpdICogaW5uZXJCbG9ja3NbYmldOworCisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxicmllZiBBbGxvY2F0ZSB0aGUgaW50ZXJuYWwgYXJyYXkgb2YgcG9pbnRlcnMgdG8gYmxvY2tzIGFuZCB0aGVpciBpbm5lciBpbmRpY2VzCisgICAgICAqCisgICAgICAqIFxub3RlIEZvciBmaXhlZC1zaXplIGJsb2NrcywgY2FsbCBzZXRCbG9ja1NpemUoKSB0byBzZXQgdGhlIGJsb2NrLgorICAgICAgKiBBbmQgRm9yIHZhcmlhYmxlLXNpemUgYmxvY2tzLCBjYWxsIHNldEJsb2NrTGF5b3V0KCkgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG5vbnplcm9zYmxvY2tzIE51bWJlciBvZiBub256ZXJvIGJsb2Nrcy4gVGhlIHRvdGFsIG51bWJlciBvZiBub256ZXJvcyBpcworICAgICAgKiBpcyBjb21wdXRlZCBpbiBzZXRCbG9ja0xheW91dCgpIGZvciB2YXJpYWJsZS1zaXplIGJsb2NrcworICAgICAgKiBcc2Egc2V0QmxvY2tTaXplKCkKKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShjb25zdCBJbmRleCBub256ZXJvc2Jsb2NrcykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoKG1faW5uZXJCU2l6ZSAhPSAwICYmIG1fb3V0ZXJCU2l6ZSAhPSAwKSAmJgorICAgICAgICAgICJUUllJTkcgVE8gUkVTRVJWRSBaRVJPLVNJWkUgTUFUUklDRVMsIENBTEwgcmVzaXplKCkgZmlyc3QiKTsKKworICAgICAgLy9GSVhNRSBTaG91bGQgZnJlZSBpZiBhbHJlYWR5IGFsbG9jYXRlZAorICAgICAgbV9vdXRlckluZGV4ID0gbmV3IFN0b3JhZ2VJbmRleFttX291dGVyQlNpemUrMV07CisKKyAgICAgIG1fbm9uemVyb3NibG9ja3MgPSBub256ZXJvc2Jsb2NrczsKKyAgICAgIGlmKG1fYmxvY2tTaXplICE9IER5bmFtaWMpCisgICAgICB7CisgICAgICAgIG1fbm9uemVyb3MgPSBub256ZXJvc2Jsb2NrcyAqIChtX2Jsb2NrU2l6ZSAqIG1fYmxvY2tTaXplKTsKKyAgICAgICAgbV9ibG9ja1B0ciA9IDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIG1fbm9uemVyb3MgIGlzIGFscmVhZHkgY29tcHV0ZWQgaW4gc2V0QmxvY2tMYXlvdXQoKQorICAgICAgICBtX2Jsb2NrUHRyID0gbmV3IFN0b3JhZ2VJbmRleFttX25vbnplcm9zYmxvY2tzKzFdOworICAgICAgfQorICAgICAgbV9pbmRpY2VzID0gbmV3IFN0b3JhZ2VJbmRleFttX25vbnplcm9zYmxvY2tzKzFdOworICAgICAgbV92YWx1ZXMgPSBuZXcgU2NhbGFyW21fbm9uemVyb3NdOworICAgIH0KKworCisgICAgLyoqCisgICAgICAqIFxicmllZiBGaWxsIHZhbHVlcyBpbiBhIG1hdHJpeCAgZnJvbSBhIHRyaXBsZXQgbGlzdC4KKyAgICAgICoKKyAgICAgICogRWFjaCB0cmlwbGV0IGl0ZW0gaGFzIGEgYmxvY2sgc3RvcmVkIGluIGFuIEVpZ2VuIGRlbnNlIG1hdHJpeC4KKyAgICAgICogVGhlIElucHV0SXRlcmF0b3IgY2xhc3Mgc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bmN0aW9ucyByb3coKSwgY29sKCkgYW5kIHZhbHVlKCkKKyAgICAgICoKKyAgICAgICogXG5vdGUgRm9yIGZpeGVkLXNpemUgYmxvY2tzLCBjYWxsIHNldEJsb2NrU2l6ZSgpIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBGSVhNRSBEbyBub3QgYWNjZXB0IGR1cGxpY2F0ZXMKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkIHNldEZyb21UcmlwbGV0cyhjb25zdCBJbnB1dEl0ZXJhdG9yJiBiZWdpbiwgY29uc3QgSW5wdXRJdGVyYXRvciYgZW5kKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgobV9pbm5lckJTaXplIT0wICYmIG1fb3V0ZXJCU2l6ZSAhPTApICYmICJaRVJPIEJMT0NLUywgUExFQVNFIENBTEwgcmVzaXplKCkgYmVmb3JlIik7CisKKyAgICAgIC8qIEZpcnN0LCBzb3J0IHRoZSB0cmlwbGV0IGxpc3QKKyAgICAgICAgKiBGSVhNRSBUaGlzIGNhbiBiZSB1bm5lY2Vzc2FyaWx5IGV4cGVuc2l2ZSBzaW5jZSBvbmx5IHRoZSBpbm5lciBpbmRpY2VzIGhhdmUgdG8gYmUgc29ydGVkCisgICAgICAgICogVGhlIGJlc3QgYXBwcm9hY2ggaXMgbGlrZSBpbiBTcGFyc2VNYXRyaXg6OnNldEZyb21UcmlwbGV0cygpCisgICAgICAgICovCisgICAgICBpbnRlcm5hbDo6VHJpcGxldENvbXA8SW5wdXRJdGVyYXRvciwgSXNDb2xNYWpvcj4gdHJpcGxldGNvbXA7CisgICAgICBzdGQ6OnNvcnQoYmVnaW4sIGVuZCwgdHJpcGxldGNvbXApOworCisgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbiBibG9ja3MsCisgICAgICAgKiBhbmQgdGhlIG51bWJlciBvZiBub256ZXJvIGJsb2NrcyBwZXIgb3V0ZXIgZGltZW5zaW9uCisgICAgICAgKi8KKyAgICAgIFZlY3RvclhpIHJvd0Jsb2NrcyhtX2lubmVyQlNpemUpOyAvLyBTaXplIG9mIGVhY2ggYmxvY2sgcm93CisgICAgICBWZWN0b3JYaSBjb2xCbG9ja3MobV9vdXRlckJTaXplKTsgLy8gU2l6ZSBvZiBlYWNoIGJsb2NrIGNvbHVtbgorICAgICAgcm93QmxvY2tzLnNldFplcm8oKTsgY29sQmxvY2tzLnNldFplcm8oKTsKKyAgICAgIFZlY3RvclhpIG56YmxvY2tfb3V0ZXIobV9vdXRlckJTaXplKTsgLy8gTnVtYmVyIG9mIG56IGJsb2NrcyBwZXIgb3V0ZXIgdmVjdG9yCisgICAgICBWZWN0b3JYaSBuel9vdXRlcihtX291dGVyQlNpemUpOyAvLyBOdW1iZXIgb2YgbnogcGVyIG91dGVyIHZlY3Rvci4uLmZvciB2YXJpYWJsZS1zaXplIGJsb2NrcworICAgICAgbnpibG9ja19vdXRlci5zZXRaZXJvKCk7CisgICAgICBuel9vdXRlci5zZXRaZXJvKCk7CisgICAgICBmb3IoSW5wdXRJdGVyYXRvciBpdChiZWdpbik7IGl0ICE9ZW5kOyArK2l0KQorICAgICAgeworICAgICAgICBlaWdlbl9hc3NlcnQoaXQtPnJvdygpID49IDAgJiYgaXQtPnJvdygpIDwgdGhpcy0+YmxvY2tSb3dzKCkgJiYgaXQtPmNvbCgpID49IDAgJiYgaXQtPmNvbCgpIDwgdGhpcy0+YmxvY2tDb2xzKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoKGl0LT52YWx1ZSgpLnJvd3MoKSA9PSBpdC0+dmFsdWUoKS5jb2xzKCkgJiYgKGl0LT52YWx1ZSgpLnJvd3MoKSA9PSBtX2Jsb2NrU2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICB8fCAobV9ibG9ja1NpemUgPT0gRHluYW1pYykpOworCisgICAgICAgIGlmKG1fYmxvY2tTaXplID09IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICBlaWdlbl9hc3NlcnQoKHJvd0Jsb2Nrc1tpdC0+cm93KCldID09IDAgfHwgcm93QmxvY2tzW2l0LT5yb3coKV0gPT0gaXQtPnZhbHVlKCkucm93cygpKSAmJgorICAgICAgICAgICAgICAiTk9OIENPUlJFU1BPTkRJTkcgU0laRVMgRk9SIFJPVyBCTE9DS1MiKTsKKyAgICAgICAgICBlaWdlbl9hc3NlcnQoKGNvbEJsb2Nrc1tpdC0+Y29sKCldID09IDAgfHwgY29sQmxvY2tzW2l0LT5jb2woKV0gPT0gaXQtPnZhbHVlKCkuY29scygpKSAmJgorICAgICAgICAgICAgICAiTk9OIENPUlJFU1BPTkRJTkcgU0laRVMgRk9SIENPTFVNTiBCTE9DS1MiKTsKKyAgICAgICAgICByb3dCbG9ja3NbaXQtPnJvdygpXSA9aXQtPnZhbHVlKCkucm93cygpOworICAgICAgICAgIGNvbEJsb2Nrc1tpdC0+Y29sKCldID0gaXQtPnZhbHVlKCkuY29scygpOworICAgICAgICB9CisgICAgICAgIG56X291dGVyKElzQ29sTWFqb3IgPyBpdC0+Y29sKCkgOiBpdC0+cm93KCkpICs9IGl0LT52YWx1ZSgpLnJvd3MoKSAqIGl0LT52YWx1ZSgpLmNvbHMoKTsKKyAgICAgICAgbnpibG9ja19vdXRlcihJc0NvbE1ham9yID8gaXQtPmNvbCgpIDogaXQtPnJvdygpKSsrOworICAgICAgfQorICAgICAgLy8gQWxsb2NhdGUgbWVtYmVyIGFycmF5cworICAgICAgaWYobV9ibG9ja1NpemUgPT0gRHluYW1pYykgc2V0QmxvY2tMYXlvdXQocm93QmxvY2tzLCBjb2xCbG9ja3MpOworICAgICAgU3RvcmFnZUluZGV4IG56YmxvY2tzID0gbnpibG9ja19vdXRlci5zdW0oKTsKKyAgICAgIHJlc2VydmUobnpibG9ja3MpOworCisgICAgICAgLy8gVGVtcG9yYXJ5IG1hcmtlcnMKKyAgICAgIFZlY3RvclhpIGJsb2NrX2lkKG1fb3V0ZXJCU2l6ZSk7IC8vIFRvIGJlIHVzZWQgYXMgYSBibG9jayBtYXJrZXIgZHVyaW5nIGluc2VydGlvbgorCisgICAgICAvLyBTZXR1cCBvdXRlciBpbmRleCBwb2ludGVycyBhbmQgbWFya2VycworICAgICAgbV9vdXRlckluZGV4WzBdID0gMDsKKyAgICAgIGlmIChtX2Jsb2NrU2l6ZSA9PSBEeW5hbWljKSAgbV9ibG9ja1B0clswXSA9ICAwOworICAgICAgZm9yKFN0b3JhZ2VJbmRleCBiaiA9IDA7IGJqIDwgbV9vdXRlckJTaXplOyArK2JqKQorICAgICAgeworICAgICAgICBtX291dGVySW5kZXhbYmorMV0gPSBtX291dGVySW5kZXhbYmpdICsgbnpibG9ja19vdXRlcihiaik7CisgICAgICAgIGJsb2NrX2lkKGJqKSA9IG1fb3V0ZXJJbmRleFtial07CisgICAgICAgIGlmKG1fYmxvY2tTaXplPT1EeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgbV9ibG9ja1B0clttX291dGVySW5kZXhbYmorMV1dID0gbV9ibG9ja1B0clttX291dGVySW5kZXhbYmpdXSArIG56X291dGVyKGJqKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBGaWxsIHRoZSBtYXRyaXgKKyAgICAgIGZvcihJbnB1dEl0ZXJhdG9yIGl0KGJlZ2luKTsgaXQhPWVuZDsgKytpdCkKKyAgICAgIHsKKyAgICAgICAgU3RvcmFnZUluZGV4IG91dGVyID0gSXNDb2xNYWpvciA/IGl0LT5jb2woKSA6IGl0LT5yb3coKTsKKyAgICAgICAgU3RvcmFnZUluZGV4IGlubmVyID0gSXNDb2xNYWpvciA/IGl0LT5yb3coKSA6IGl0LT5jb2woKTsKKyAgICAgICAgbV9pbmRpY2VzW2Jsb2NrX2lkKG91dGVyKV0gPSBpbm5lcjsKKyAgICAgICAgU3RvcmFnZUluZGV4IGJsb2NrX3NpemUgPSBpdC0+dmFsdWUoKS5yb3dzKCkqaXQtPnZhbHVlKCkuY29scygpOworICAgICAgICBTdG9yYWdlSW5kZXggbnpfbWFya2VyID0gYmxvY2tQdHIoYmxvY2tfaWRbb3V0ZXJdKTsKKyAgICAgICAgbWVtY3B5KCYobV92YWx1ZXNbbnpfbWFya2VyXSksIGl0LT52YWx1ZSgpLmRhdGEoKSwgYmxvY2tfc2l6ZSAqIHNpemVvZihTY2FsYXIpKTsKKyAgICAgICAgaWYobV9ibG9ja1NpemUgPT0gRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgIG1fYmxvY2tQdHJbYmxvY2tfaWQob3V0ZXIpKzFdID0gbV9ibG9ja1B0cltibG9ja19pZChvdXRlcildICsgYmxvY2tfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBibG9ja19pZChvdXRlcikrKzsKKyAgICAgIH0KKworICAgICAgLy8gQW4gYWx0ZXJuYXRpdmUgd2hlbiB0aGUgb3V0ZXIgaW5kaWNlcyBhcmUgc29ydGVkLi4ubm8gbmVlZCB0byB1c2UgYW4gYXJyYXkgb2YgbWFya2VycworLy8gICAgICBmb3IoSW5kZXggYmNvbCA9IDA7IGJjb2wgPCBtX291dGVyQlNpemU7ICsrYmNvbCkKKy8vICAgICAgeworLy8gICAgICBJbmRleCBpZCA9IDAsIGlkX256ID0gMCwgaWRfbnpibG9jayA9IDA7CisvLyAgICAgIGZvcihJbnB1dEl0ZXJhdG9yIGl0KGJlZ2luKTsgaXQhPWVuZDsgKytpdCkKKy8vICAgICAgeworLy8gICAgICAgIHdoaWxlIChpZDxiY29sKSAvLyBvbmUgcGFzcyBzaG91bGQgZG8gdGhlIGpvYiB1bmxlc3MgdGhlcmUgYXJlIGVtcHR5IGNvbHVtbnMKKy8vICAgICAgICB7CisvLyAgICAgICAgICBpZCsrOworLy8gICAgICAgICAgbV9vdXRlckluZGV4W2lkKzFdPW1fb3V0ZXJJbmRleFtpZF07CisvLyAgICAgICAgfQorLy8gICAgICAgIG1fb3V0ZXJJbmRleFtpZCsxXSArPSAxOworLy8gICAgICAgIG1faW5kaWNlc1tpZF9uemJsb2NrXT1icm93OworLy8gICAgICAgIEluZGV4IGJsb2NrX3NpemUgPSBpdC0+dmFsdWUoKS5yb3dzKCkqaXQtPnZhbHVlKCkuY29scygpOworLy8gICAgICAgIG1fYmxvY2tQdHJbaWRfbnpibG9jaysxXSA9IG1fYmxvY2tQdHJbaWRfbnpibG9ja10gKyBibG9ja19zaXplOworLy8gICAgICAgIGlkX256YmxvY2srKzsKKy8vICAgICAgICBtZW1jcHkoJihtX3ZhbHVlc1tpZF9uel0pLGl0LT52YWx1ZSgpLmRhdGEoKSwgYmxvY2tfc2l6ZSpzaXplb2YoU2NhbGFyKSk7CisvLyAgICAgICAgaWRfbnogKz0gYmxvY2tfc2l6ZTsKKy8vICAgICAgfQorLy8gICAgICB3aGlsZShpZCA8IG1fb3V0ZXJCU2l6ZS0xKSAvLyBFbXB0eSBjb2x1bW5zIGF0IHRoZSBlbmQKKy8vICAgICAgeworLy8gICAgICAgIGlkKys7CisvLyAgICAgICAgbV9vdXRlckluZGV4W2lkKzFdPW1fb3V0ZXJJbmRleFtpZF07CisvLyAgICAgIH0KKy8vICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cworICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0CisgICAgeworLy8gICAgICByZXR1cm4gYmxvY2tSb3dzKCk7CisgICAgICByZXR1cm4gKElzQ29sTWFqb3IgPyBpbm5lclNpemUoKSA6IG91dGVyU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2xzCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QKKyAgICB7CisvLyAgICAgIHJldHVybiBibG9ja0NvbHMoKTsKKyAgICAgIHJldHVybiAoSXNDb2xNYWpvciA/IG91dGVyU2l6ZSgpIDogaW5uZXJTaXplKCkpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBpbm5lclNpemUoKSBjb25zdAorICAgIHsKKyAgICAgIGlmKG1fYmxvY2tTaXplID09IER5bmFtaWMpIHJldHVybiBtX2lubmVyT2Zmc2V0W21faW5uZXJCU2l6ZV07CisgICAgICBlbHNlIHJldHVybiAgKG1faW5uZXJCU2l6ZSAqIG1fYmxvY2tTaXplKSA7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgaWYobV9ibG9ja1NpemUgPT0gRHluYW1pYykgcmV0dXJuIG1fb3V0ZXJPZmZzZXRbbV9vdXRlckJTaXplXTsKKyAgICAgIGVsc2UgcmV0dXJuICAobV9vdXRlckJTaXplICogbV9ibG9ja1NpemUpIDsKKyAgICB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBncm91cGVkIGJ5IGJsb2NrcyAqLworICAgIGlubGluZSBJbmRleCBibG9ja1Jvd3MoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAoSXNDb2xNYWpvciA/IG1faW5uZXJCU2l6ZSA6IG1fb3V0ZXJCU2l6ZSk7CisgICAgfQorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZ3JvdXBlZCBieSBibG9ja3MgKi8KKyAgICBpbmxpbmUgSW5kZXggYmxvY2tDb2xzKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKElzQ29sTWFqb3IgPyBtX291dGVyQlNpemUgOiBtX2lubmVyQlNpemUpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBvdXRlckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXJCU2l6ZTsgfQorICAgIGlubGluZSBJbmRleCBpbm5lckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJCU2l6ZTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBibG9jayBpbmRleCB3aGVyZSBvdXRlciBiZWxvbmdzIHRvICovCisgICAgaW5saW5lIEluZGV4IG91dGVyVG9CbG9jayhJbmRleCBvdXRlcikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSAmJiAiT1VURVIgSU5ERVggT1VUIE9GIEJPVU5EUyIpOworCisgICAgICBpZihtX2Jsb2NrU2l6ZSAhPSBEeW5hbWljKQorICAgICAgICByZXR1cm4gKG91dGVyIC8gbV9ibG9ja1NpemUpOyAvLyBJbnRlZ2VyIGRpdmlzaW9uCisKKyAgICAgIFN0b3JhZ2VJbmRleCBiX291dGVyID0gMDsKKyAgICAgIHdoaWxlKG1fb3V0ZXJPZmZzZXRbYl9vdXRlcl0gPD0gb3V0ZXIpICsrYl9vdXRlcjsKKyAgICAgIHJldHVybiBiX291dGVyIC0gMTsKKyAgICB9CisgICAgLyoqIFxyZXR1cm5zICB0aGUgYmxvY2sgaW5kZXggd2hlcmUgaW5uZXIgYmVsb25ncyB0byAqLworICAgIGlubGluZSBJbmRleCBpbm5lclRvQmxvY2soSW5kZXggaW5uZXIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkgJiYgIk9VVEVSIElOREVYIE9VVCBPRiBCT1VORFMiKTsKKworICAgICAgaWYobV9ibG9ja1NpemUgIT0gRHluYW1pYykKKyAgICAgICAgcmV0dXJuIChpbm5lciAvIG1fYmxvY2tTaXplKTsgLy8gSW50ZWdlciBkaXZpc2lvbgorCisgICAgICBTdG9yYWdlSW5kZXggYl9pbm5lciA9IDA7CisgICAgICB3aGlsZShtX2lubmVyT2Zmc2V0W2JfaW5uZXJdIDw9IGlubmVyKSArK2JfaW5uZXI7CisgICAgICByZXR1cm4gYl9pbm5lciAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICAqXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIChpLGopIGJsb2NrIGFzIGFuIEVpZ2VuIERlbnNlIE1hdHJpeAorICAgICAgKi8KKyAgICBSZWY8QmxvY2tTY2FsYXI+IGNvZWZmUmVmKEluZGV4IGJyb3csIEluZGV4IGJjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGJyb3cgPCBibG9ja1Jvd3MoKSAmJiAiQkxPQ0sgUk9XIElOREVYIE9VVCBPRiBCT1VORFMiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChiY29sIDwgYmxvY2tDb2xzKCkgJiYgIkJMT0NLIG56YmxvY2tzRmxhZ0NPTFVNTiBPVVQgT0YgQk9VTkRTIik7CisKKyAgICAgIFN0b3JhZ2VJbmRleCByc2l6ZSA9IElzQ29sTWFqb3IgPyBibG9ja0lubmVyU2l6ZShicm93KTogYmxvY2tPdXRlclNpemUoYmNvbCk7CisgICAgICBTdG9yYWdlSW5kZXggY3NpemUgPSBJc0NvbE1ham9yID8gYmxvY2tPdXRlclNpemUoYmNvbCkgOiBibG9ja0lubmVyU2l6ZShicm93KTsKKyAgICAgIFN0b3JhZ2VJbmRleCBpbm5lciA9IElzQ29sTWFqb3IgPyBicm93IDogYmNvbDsKKyAgICAgIFN0b3JhZ2VJbmRleCBvdXRlciA9IElzQ29sTWFqb3IgPyBiY29sIDogYnJvdzsKKyAgICAgIFN0b3JhZ2VJbmRleCBvZmZzZXQgPSBtX291dGVySW5kZXhbb3V0ZXJdOworICAgICAgd2hpbGUob2Zmc2V0IDwgbV9vdXRlckluZGV4W291dGVyKzFdICYmIG1faW5kaWNlc1tvZmZzZXRdICE9IGlubmVyKQorICAgICAgICBvZmZzZXQrKzsKKyAgICAgIGlmKG1faW5kaWNlc1tvZmZzZXRdID09IGlubmVyKQorICAgICAgeworICAgICAgICByZXR1cm4gTWFwPEJsb2NrU2NhbGFyPigmKG1fdmFsdWVzW2Jsb2NrUHRyKG9mZnNldCldKSwgcnNpemUsIGNzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy9GSVhNRSB0aGUgYmxvY2sgZG9lcyBub3QgZXhpc3QsIEluc2VydCBpdCAhISEhISEhISEKKyAgICAgICAgZWlnZW5fYXNzZXJ0KCJEWU5BTUlDIElOU0VSVElPTiBJUyBOT1QgWUVUIFNVUFBPUlRFRCIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAgKiBccmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIChpLGopIGJsb2NrIGFzIGFuIEVpZ2VuIERlbnNlIE1hdHJpeAorICAgICAgKi8KKyAgICBNYXA8Y29uc3QgQmxvY2tTY2FsYXI+IGNvZWZmKEluZGV4IGJyb3csIEluZGV4IGJjb2wpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGJyb3cgPCBibG9ja1Jvd3MoKSAmJiAiQkxPQ0sgUk9XIElOREVYIE9VVCBPRiBCT1VORFMiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChiY29sIDwgYmxvY2tDb2xzKCkgJiYgIkJMT0NLIENPTFVNTiBPVVQgT0YgQk9VTkRTIik7CisKKyAgICAgIFN0b3JhZ2VJbmRleCByc2l6ZSA9IElzQ29sTWFqb3IgPyBibG9ja0lubmVyU2l6ZShicm93KTogYmxvY2tPdXRlclNpemUoYmNvbCk7CisgICAgICBTdG9yYWdlSW5kZXggY3NpemUgPSBJc0NvbE1ham9yID8gYmxvY2tPdXRlclNpemUoYmNvbCkgOiBibG9ja0lubmVyU2l6ZShicm93KTsKKyAgICAgIFN0b3JhZ2VJbmRleCBpbm5lciA9IElzQ29sTWFqb3IgPyBicm93IDogYmNvbDsKKyAgICAgIFN0b3JhZ2VJbmRleCBvdXRlciA9IElzQ29sTWFqb3IgPyBiY29sIDogYnJvdzsKKyAgICAgIFN0b3JhZ2VJbmRleCBvZmZzZXQgPSBtX291dGVySW5kZXhbb3V0ZXJdOworICAgICAgd2hpbGUob2Zmc2V0IDwgbV9vdXRlckluZGV4W291dGVyKzFdICYmIG1faW5kaWNlc1tvZmZzZXRdICE9IGlubmVyKSBvZmZzZXQrKzsKKyAgICAgIGlmKG1faW5kaWNlc1tvZmZzZXRdID09IGlubmVyKQorICAgICAgeworICAgICAgICByZXR1cm4gTWFwPGNvbnN0IEJsb2NrU2NhbGFyPiAoJihtX3ZhbHVlc1tibG9ja1B0cihvZmZzZXQpXSksIHJzaXplLCBjc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisvLyAgICAgICAgcmV0dXJuIEJsb2NrU2NhbGFyOjpaZXJvKHJzaXplLCBjc2l6ZSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydCgiTk9UIFlFVCBTVVBQT1JURUQiKTsKKyAgICB9CisKKyAgICAvLyBCbG9jayBNYXRyaXggdGltZXMgdmVjdG9yIHByb2R1Y3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWZWNUeXBlPgorICAgIEJsb2NrU3BhcnNlVGltZURlbnNlUHJvZHVjdDxCbG9ja1NwYXJzZU1hdHJpeCwgVmVjVHlwZT4gb3BlcmF0b3IqKGNvbnN0IFZlY1R5cGUmIGxocykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQmxvY2tTcGFyc2VUaW1lRGVuc2VQcm9kdWN0PEJsb2NrU3BhcnNlTWF0cml4LCBWZWNUeXBlPigqdGhpcywgbGhzKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBub256ZXJvIGJsb2NrcyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvc0Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1fbm9uemVyb3NibG9ja3M7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBub256ZXJvIGVsZW1lbnRzLCBpbmNsdWRpbmcgZXZlbnR1YWwgZXhwbGljaXQgemVyb3MgaW4gYmxvY2tzICovCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QgeyByZXR1cm4gbV9ub256ZXJvczsgfQorCisgICAgaW5saW5lIEJsb2NrU2NhbGFyUmV0dXJuVHlwZSAqdmFsdWVQdHIoKSB7cmV0dXJuIHN0YXRpY19jYXN0PEJsb2NrU2NhbGFyUmV0dXJuVHlwZSAqPihtX3ZhbHVlcyk7fQorLy8gICAgaW5saW5lIFNjYWxhciAqdmFsdWVQdHIoKXsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCAqaW5uZXJJbmRleFB0cigpIHtyZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCAqaW5uZXJJbmRleFB0cigpIGNvbnN0IHtyZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgaW5saW5lIFN0b3JhZ2VJbmRleCAqb3V0ZXJJbmRleFB0cigpIHtyZXR1cm4gbV9vdXRlckluZGV4OyB9CisgICAgaW5saW5lIGNvbnN0IFN0b3JhZ2VJbmRleCogb3V0ZXJJbmRleFB0cigpIGNvbnN0IHtyZXR1cm4gbV9vdXRlckluZGV4OyB9CisKKyAgICAvKiogXGJyaWVmIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIHdpdGggdGhlIFNwYXJzZU1hdHJpeCBjbGFzcyAqLworICAgIGlubGluZSBib29sIGlzQ29tcHJlc3NlZCgpIGNvbnN0IHtyZXR1cm4gdHJ1ZTt9CisgICAgLyoqCisgICAgICAqIFxyZXR1cm5zIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgYmkgcm93IGJsb2NrCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBibG9ja1Jvd3NJbmRleChJbmRleCBiaSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSXNDb2xNYWpvciA/IGJsb2NrSW5uZXJJbmRleChiaSkgOiBibG9ja091dGVySW5kZXgoYmkpOworICAgIH0KKworICAgIC8qKgorICAgICAgKiBccmV0dXJucyB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGJqIGNvbCBibG9jaworICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggYmxvY2tDb2xzSW5kZXgoSW5kZXggYmopIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIElzQ29sTWFqb3IgPyBibG9ja091dGVySW5kZXgoYmopIDogYmxvY2tJbm5lckluZGV4KGJqKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggYmxvY2tPdXRlckluZGV4KEluZGV4IGJqKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAobV9ibG9ja1NpemUgPT0gRHluYW1pYykgPyBtX291dGVyT2Zmc2V0W2JqXSA6IChiaiAqIG1fYmxvY2tTaXplKTsKKyAgICB9CisgICAgaW5saW5lIEluZGV4IGJsb2NrSW5uZXJJbmRleChJbmRleCBiaSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKG1fYmxvY2tTaXplID09IER5bmFtaWMpID8gbV9pbm5lck9mZnNldFtiaV0gOiAoYmkgKiBtX2Jsb2NrU2l6ZSk7CisgICAgfQorCisgICAgLy8gTm90IG5lZWRlZCA/Pz8KKyAgICBpbmxpbmUgSW5kZXggYmxvY2tJbm5lclNpemUoSW5kZXggYmkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIChtX2Jsb2NrU2l6ZSA9PSBEeW5hbWljKSA/IChtX2lubmVyT2Zmc2V0W2JpKzFdIC0gbV9pbm5lck9mZnNldFtiaV0pIDogbV9ibG9ja1NpemU7CisgICAgfQorICAgIGlubGluZSBJbmRleCBibG9ja091dGVyU2l6ZShJbmRleCBiaikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKG1fYmxvY2tTaXplID09IER5bmFtaWMpID8gKG1fb3V0ZXJPZmZzZXRbYmorMV0tIG1fb3V0ZXJPZmZzZXRbYmpdKSA6IG1fYmxvY2tTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgQnJvd3NlIHRoZSBtYXRyaXggYnkgb3V0ZXIgaW5kZXgKKyAgICAgICovCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsgLy8gQnJvd3NlIGNvbHVtbiBieSBjb2x1bW4KKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgQnJvd3NlIHRoZSBtYXRyaXggYnkgYmxvY2sgb3V0ZXIgaW5kZXgKKyAgICAgICovCisgICAgY2xhc3MgQmxvY2tJbm5lckl0ZXJhdG9yOyAvLyBCcm93c2UgYmxvY2sgYnkgYmxvY2sKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgQmxvY2tTcGFyc2VNYXRyaXgmIG0pCisgICAgeworICAgICAgZm9yIChTdG9yYWdlSW5kZXggaiA9IDA7IGogPCBtLm91dGVyQmxvY2tzKCk7ICsraikKKyAgICAgIHsKKyAgICAgICAgQmxvY2tJbm5lckl0ZXJhdG9yIGl0YihtLCBqKTsKKyAgICAgICAgZm9yKDsgaXRiOyArK2l0YikKKyAgICAgICAgeworICAgICAgICAgIHMgPDwgIigiPDxpdGIucm93KCkgPDwgIiwgIiA8PCBpdGIuY29sKCkgPDwgIilcbiI7CisgICAgICAgICAgcyA8PCBpdGIudmFsdWUoKSA8PCJcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHMgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFxyZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgPGlkPiBpbiB0aGUgYXJyYXkgb2YgdmFsdWVzCisgICAgICAqLworICAgIEluZGV4IGJsb2NrUHRyKEluZGV4IGlkKSBjb25zdAorICAgIHsKKyAgICAgIGlmKG1fYmxvY2tTaXplID09IER5bmFtaWMpIHJldHVybiBtX2Jsb2NrUHRyW2lkXTsKKyAgICAgIGVsc2UgcmV0dXJuIGlkICogbV9ibG9ja1NpemUgKiBtX2Jsb2NrU2l6ZTsKKyAgICAgIC8vcmV0dXJuIGJsb2NrRHluSWR4KGlkLCB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8KEJsb2NrU2l6ZT09RHluYW1pYyksIGludGVybmFsOjp0cnVlX3R5cGUsIGludGVybmFsOjpmYWxzZV90eXBlPjo6dHlwZSgpKTsKKyAgICB9CisKKworICBwcm90ZWN0ZWQ6CisvLyAgICBpbmxpbmUgSW5kZXggYmxvY2tEeW5JZHgoSW5kZXggaWQsIGludGVybmFsOjp0cnVlX3R5cGUpIGNvbnN0CisvLyAgICB7CisvLyAgICAgIHJldHVybiBtX2Jsb2NrUHRyW2lkXTsKKy8vICAgIH0KKy8vICAgIGlubGluZSBJbmRleCBibG9ja0R5bklkeChJbmRleCBpZCwgaW50ZXJuYWw6OmZhbHNlX3R5cGUpIGNvbnN0CisvLyAgICB7CisvLyAgICAgIHJldHVybiBpZCAqIEJsb2NrU2l6ZSAqIEJsb2NrU2l6ZTsKKy8vICAgIH0KKworICAgIC8vIFRvIGJlIGltcGxlbWVudGVkCisgICAgLy8gSW5zZXJ0IGEgYmxvY2sgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLi4uIG5lZWQgdG8gbWFrZSBhIHJvb20gZm9yIHRoYXQKKyAgICBNYXA8QmxvY2tTY2FsYXI+IGluc2VydChJbmRleCBicm93LCBJbmRleCBiY29sKTsKKworICAgIEluZGV4IG1faW5uZXJCU2l6ZTsgLy8gTnVtYmVyIG9mIGJsb2NrIHJvd3MKKyAgICBJbmRleCBtX291dGVyQlNpemU7IC8vIE51bWJlciBvZiBibG9jayBjb2x1bW5zCisgICAgU3RvcmFnZUluZGV4ICptX2lubmVyT2Zmc2V0OyAvLyBTdGFydGluZyBpbmRleCBvZiBlYWNoIGlubmVyIGJsb2NrIChzaXplIG1faW5uZXJCU2l6ZSsxKQorICAgIFN0b3JhZ2VJbmRleCAqbV9vdXRlck9mZnNldDsgLy8gU3RhcnRpbmcgaW5kZXggb2YgZWFjaCBvdXRlciBibG9jayAoc2l6ZSBtX291dGVyQlNpemUrMSkKKyAgICBJbmRleCBtX25vbnplcm9zYmxvY2tzOyAvLyBUb3RhbCBub256ZXJvcyBibG9ja3MgKGxvd2VyIHRoYW4gIG1faW5uZXJCU2l6ZSB4IG1fb3V0ZXJCU2l6ZSkKKyAgICBJbmRleCBtX25vbnplcm9zOyAvLyBUb3RhbCBub256ZXJvcyBlbGVtZW50cworICAgIFNjYWxhciAqbV92YWx1ZXM7IC8vVmFsdWVzIHN0b3JlZCBibG9jayBjb2x1bW4gYWZ0ZXIgYmxvY2sgY29sdW1uIChzaXplIG1fbm9uemVyb3MpCisgICAgU3RvcmFnZUluZGV4ICptX2Jsb2NrUHRyOyAvLyBQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBibG9jayBpbiBtX3ZhbHVlcywgc2l6ZSBtX25vbnplcm9ibG9ja3MgLi4uIG51bGwgZm9yIGZpeGVkLXNpemUgYmxvY2tzCisgICAgU3RvcmFnZUluZGV4ICptX2luZGljZXM7IC8vSW5uZXIgYmxvY2sgaW5kaWNlcywgc2l6ZSBtX25vbnplcm9zYmxvY2tzIC4uLiBPSworICAgIFN0b3JhZ2VJbmRleCAqbV9vdXRlckluZGV4OyAvLyBTdGFydGluZyBwb2ludGVyIG9mIGVhY2ggYmxvY2sgY29sdW1uIGluIG1faW5kaWNlcyAoc2l6ZSBtX291dGVyQlNpemUpLi4uIE9LCisgICAgSW5kZXggbV9ibG9ja1NpemU7IC8vIFNpemUgb2YgYSBibG9jayBmb3IgZml4ZWQtc2l6ZSBibG9ja3MsIG90aGVyd2lzZSAtMQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9CbG9ja0F0Q29tcGlsZVRpbWUsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK2NsYXNzIEJsb2NrU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9CbG9ja0F0Q29tcGlsZVRpbWUsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4Pjo6QmxvY2tJbm5lckl0ZXJhdG9yCit7CisgIHB1YmxpYzoKKworICAgIGVudW17CisgICAgICBGbGFncyA9IF9PcHRpb25zCisgICAgfTsKKworICAgIEJsb2NrSW5uZXJJdGVyYXRvcihjb25zdCBCbG9ja1NwYXJzZU1hdHJpeCYgbWF0LCBjb25zdCBJbmRleCBvdXRlcikKKyAgICA6IG1fbWF0KG1hdCksbV9vdXRlcihvdXRlciksCisgICAgICBtX2lkKG1hdC5tX291dGVySW5kZXhbb3V0ZXJdKSwKKyAgICAgIG1fZW5kKG1hdC5tX291dGVySW5kZXhbb3V0ZXIrMV0pCisgICAgeworICAgIH0KKworICAgIGlubGluZSBCbG9ja0lubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7bV9pZCsrOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBjb25zdCBNYXA8Y29uc3QgQmxvY2tTY2FsYXI+IHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gTWFwPGNvbnN0IEJsb2NrU2NhbGFyPigmKG1fbWF0Lm1fdmFsdWVzW21fbWF0LmJsb2NrUHRyKG1faWQpXSksCisgICAgICAgICAgcm93cygpLGNvbHMoKSk7CisgICAgfQorICAgIGlubGluZSBNYXA8QmxvY2tTY2FsYXI+IHZhbHVlUmVmKCkKKyAgICB7CisgICAgICByZXR1cm4gTWFwPEJsb2NrU2NhbGFyPigmKG1fbWF0Lm1fdmFsdWVzW21fbWF0LmJsb2NrUHRyKG1faWQpXSksCisgICAgICAgICAgcm93cygpLGNvbHMoKSk7CisgICAgfQorICAgIC8vIEJsb2NrIGlubmVyIGluZGV4CisgICAgaW5saW5lIEluZGV4IGluZGV4KCkgY29uc3Qge3JldHVybiBtX21hdC5tX2luZGljZXNbbV9pZF07IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXIoKSBjb25zdCB7IHJldHVybiBtX291dGVyOyB9CisgICAgLy8gYmxvY2sgcm93IGluZGV4CisgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0ICB7cmV0dXJuIGluZGV4KCk7IH0KKyAgICAvLyBibG9jayBjb2x1bW4gaW5kZXgKKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3Qge3JldHVybiBvdXRlcigpOyB9CisgICAgLy8gRklYTUUgTnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIChtX21hdC5tX2Jsb2NrU2l6ZT09RHluYW1pYykgPyAobV9tYXQubV9pbm5lck9mZnNldFtpbmRleCgpKzFdIC0gbV9tYXQubV9pbm5lck9mZnNldFtpbmRleCgpXSkgOiBtX21hdC5tX2Jsb2NrU2l6ZTsgfQorICAgIC8vIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjdXJyZW50IGJsb2NrIC4uLgorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gKG1fbWF0Lm1fYmxvY2tTaXplPT1EeW5hbWljKSA/IChtX21hdC5tX291dGVyT2Zmc2V0W21fb3V0ZXIrMV0tbV9tYXQubV9vdXRlck9mZnNldFttX291dGVyXSkgOiBtX21hdC5tX2Jsb2NrU2l6ZTt9CisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobV9pZCA8IG1fZW5kKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBCbG9ja1NwYXJzZU1hdHJpeDxfU2NhbGFyLCBfQmxvY2tBdENvbXBpbGVUaW1lLCBfT3B0aW9ucywgU3RvcmFnZUluZGV4PiYgbV9tYXQ7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKKyAgICBJbmRleCBtX2lkOworICAgIEluZGV4IG1fZW5kOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9CbG9ja0F0Q29tcGlsZVRpbWUsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX1N0b3JhZ2VJbmRleD4KK2NsYXNzIEJsb2NrU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9CbG9ja0F0Q29tcGlsZVRpbWUsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4Pjo6SW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBCbG9ja1NwYXJzZU1hdHJpeCYgbWF0LCBJbmRleCBvdXRlcikKKyAgICA6IG1fbWF0KG1hdCksbV9vdXRlckIobWF0Lm91dGVyVG9CbG9jayhvdXRlcikpLG1fb3V0ZXIob3V0ZXIpLAorICAgICAgaXRiKG1hdCwgbWF0Lm91dGVyVG9CbG9jayhvdXRlcikpLAorICAgICAgbV9vZmZzZXQob3V0ZXIgLSBtYXQuYmxvY2tPdXRlckluZGV4KG1fb3V0ZXJCKSkKKyAgICAgeworICAgICAgICBpZiAoaXRiKQorICAgICAgICB7CisgICAgICAgICAgbV9pZCA9IG1fbWF0LmJsb2NrSW5uZXJJbmRleChpdGIuaW5kZXgoKSk7CisgICAgICAgICAgbV9zdGFydCA9IG1faWQ7CisgICAgICAgICAgbV9lbmQgPSBtX21hdC5ibG9ja0lubmVySW5kZXgoaXRiLmluZGV4KCkrMSk7CisgICAgICAgIH0KKyAgICAgfQorICAgIGlubGluZSBJbm5lckl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBtX2lkKys7CisgICAgICBpZiAobV9pZCA+PSBtX2VuZCkKKyAgICAgIHsKKyAgICAgICAgKytpdGI7CisgICAgICAgIGlmIChpdGIpCisgICAgICAgIHsKKyAgICAgICAgICBtX2lkID0gbV9tYXQuYmxvY2tJbm5lckluZGV4KGl0Yi5pbmRleCgpKTsKKyAgICAgICAgICBtX3N0YXJ0ID0gbV9pZDsKKyAgICAgICAgICBtX2VuZCA9IG1fbWF0LmJsb2NrSW5uZXJJbmRleChpdGIuaW5kZXgoKSsxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGl0Yi52YWx1ZSgpLmNvZWZmKG1faWQgLSBtX3N0YXJ0LCBtX29mZnNldCk7CisgICAgfQorICAgIGlubGluZSBTY2FsYXImIHZhbHVlUmVmKCkKKyAgICB7CisgICAgICByZXR1cm4gaXRiLnZhbHVlUmVmKCkuY29lZmYobV9pZCAtIG1fc3RhcnQsIG1fb2Zmc2V0KTsKKyAgICB9CisgICAgaW5saW5lIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQorICAgIGlubGluZSBJbmRleCBvdXRlcigpIGNvbnN0IHtyZXR1cm4gbV9vdXRlcjsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7cmV0dXJuIG91dGVyKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gaW5kZXgoKTt9CisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpdGI7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgQmxvY2tTcGFyc2VNYXRyaXgmIG1fbWF0OworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgY29uc3QgSW5kZXggbV9vdXRlckI7CisgICAgQmxvY2tJbm5lckl0ZXJhdG9yIGl0YjsgLy8gSXRlcmF0b3IgdGhyb3VnaCB0aGUgYmxvY2tzCisgICAgY29uc3QgSW5kZXggbV9vZmZzZXQ7IC8vIFBvc2l0aW9uIG9mIHRoaXMgY29sdW1uIGluIHRoZSBibG9jaworICAgIEluZGV4IG1fc3RhcnQ7IC8vIHN0YXJ0aW5nIGlubmVyIGluZGV4IG9mIHRoaXMgYmxvY2sKKyAgICBJbmRleCBtX2lkOyAvLyBjdXJyZW50IGlubmVyIGluZGV4IGluIHRoZSBibG9jaworICAgIEluZGV4IG1fZW5kOyAvLyBzdGFydGluZyBpbm5lciBpbmRleCBvZiB0aGUgbmV4dCBibG9jaworCit9OworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VCTE9DS01BVFJJWF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvRHluYW1pY1NwYXJzZU1hdHJpeC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0R5bmFtaWNTcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdhMTNmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0R5bmFtaWNTcGFyc2VNYXRyaXguaApAQCAtMCwwICsxLDM5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRFlOQU1JQ19TUEFSU0VNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9EWU5BTUlDX1NQQVJTRU1BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGRlcHJlY2F0ZWQgdXNlIGEgU3BhcnNlTWF0cml4IGluIGFuIHVuY29tcHJlc3NlZCBtb2RlCisgICoKKyAgKiBcY2xhc3MgRHluYW1pY1NwYXJzZU1hdHJpeAorICAqCisgICogXGJyaWVmIEEgc3BhcnNlIG1hdHJpeCBjbGFzcyBkZXNpZ25lZCBmb3IgbWF0cml4IGFzc2VtYmx5IHB1cnBvc2UKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzCisgICoKKyAgKiBVbmxpa2UgU3BhcnNlTWF0cml4LCB0aGlzIGNsYXNzIHByb3ZpZGVzIGEgbXVjaCBoaWdoZXIgZGVncmVlIG9mIGZsZXhpYmlsaXR5LiBJbiBwYXJ0aWN1bGFyLCBpdCBhbGxvd3MKKyAgKiByYW5kb20gcmVhZC93cml0ZSBhY2Nlc3NlcyBpbiBsb2cocmhvKm91dGVyX3NpemUpIHdoZXJlIFxjIHJobyBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIGNvZWZmaWNpZW50IGlzCisgICogbm9uemVybyBhbmQgb3V0ZXJfc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaWYgdGhlIG1hdHJpeCBpcyBjb2x1bW4tbWFqb3IgYW5kIHRoZSBudW1iZXIgb2Ygcm93cworICAqIG90aGVyd2lzZS4KKyAgKgorICAqIEludGVybmFsbHksIHRoZSBkYXRhIGFyZSBzdG9yZWQgYXMgYSBzdGQ6OnZlY3RvciBvZiBjb21wcmVzc2VkIHZlY3Rvci4gVGhlIHBlcmZvcm1hbmNlcyBvZiByYW5kb20gd3JpdGVzIG1pZ2h0CisgICogZGVjcmVhc2UgYXMgdGhlIG51bWJlciBvZiBub256ZXJvcyBwZXIgaW5uZXItdmVjdG9yIGluY3JlYXNlLiBJbiBwcmFjdGljZSwgd2Ugb2JzZXJ2ZWQgdmVyeSBnb29kIHBlcmZvcm1hbmNlCisgICogdGlsbCBhYm91dCAxMDAgbm9uemVyb3MvdmVjdG9yLCBhbmQgdGhlIHBlcmZvcm1hbmNlIHJlbWFpbnMgcmVsYXRpdmVseSBnb29kIHRpbGwgNTAwIG5vbnplcm9zL3ZlY3RvcnMuCisgICoKKyAgKiBcc2VlIFNwYXJzZU1hdHJpeAorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4Pgorc3RydWN0IHRyYWl0czxEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgX1N0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgRmxhZ3MgPSBfT3B0aW9ucyB8IE5lc3RCeVJlZkJpdCB8IEx2YWx1ZUJpdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIFN1cHBvcnRlZEFjY2Vzc1BhdHRlcm5zID0gT3V0ZXJSYW5kb21BY2Nlc3NQYXR0ZXJuCisgIH07Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CisgY2xhc3MgIER5bmFtaWNTcGFyc2VNYXRyaXgKKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfU3RvcmFnZUluZGV4PiA+Cit7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXhCYXNlPER5bmFtaWNTcGFyc2VNYXRyaXg+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29udmVydF9pbmRleDsKKyAgcHVibGljOgorICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKER5bmFtaWNTcGFyc2VNYXRyaXgpCisgICAgLy8gRklYTUU6IHdoeSBhcmUgdGhlc2Ugb3BlcmF0b3IgYWxyZWFkeSBhbHZhaWxhYmxlID8/PworICAgIC8vIEVJR0VOX1NQQVJTRV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoRHluYW1pY1NwYXJzZU1hdHJpeCwgKz0pCisgICAgLy8gRUlHRU5fU1BBUlNFX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihEeW5hbWljU3BhcnNlTWF0cml4LCAtPSkKKyAgICB0eXBlZGVmIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3M+IE1hcDsKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yPTsKKyAgICBlbnVtIHsKKyAgICAgIE9wdGlvbnMgPSBfT3B0aW9ucworICAgIH07CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZWRlZiBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhciwoRmxhZ3MmflJvd01ham9yQml0KXwoSXNSb3dNYWpvcj9Sb3dNYWpvckJpdDowKSwgU3RvcmFnZUluZGV4PiBUcmFuc3Bvc2VkU3BhcnNlTWF0cml4OworCisgICAgSW5kZXggbV9pbm5lclNpemU7CisgICAgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixTdG9yYWdlSW5kZXg+ID4gbV9kYXRhOworCisgIHB1YmxpYzoKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG91dGVyU2l6ZSgpIDogbV9pbm5lclNpemU7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX2lubmVyU2l6ZSA6IG91dGVyU2l6ZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJTaXplOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnZlcnRfaW5kZXgobV9kYXRhLnNpemUoKSk7IH0KKyAgICBpbmxpbmUgSW5kZXggaW5uZXJOb25aZXJvcyhJbmRleCBqKSBjb25zdCB7IHJldHVybiBtX2RhdGFbal0uc2l6ZSgpOyB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6Q29tcHJlc3NlZFN0b3JhZ2U8U2NhbGFyLFN0b3JhZ2VJbmRleD4gPiYgX2RhdGEoKSB7IHJldHVybiBtX2RhdGE7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6Q29tcHJlc3NlZFN0b3JhZ2U8U2NhbGFyLFN0b3JhZ2VJbmRleD4gPiYgX2RhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGE7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgY29lZmZpY2llbnQgdmFsdWUgYXQgZ2l2ZW4gcG9zaXRpb24gXGEgcm93LCBcYSBjb2wKKyAgICAgICogVGhpcyBvcGVyYXRpb24gaW52b2xlcyBhIGxvZyhyaG8qb3V0ZXJfc2l6ZSkgYmluYXJ5IHNlYXJjaC4KKyAgICAgICovCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisgICAgICByZXR1cm4gbV9kYXRhW291dGVyXS5hdChpbm5lcik7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb2VmZmljaWVudCB2YWx1ZSBhdCBnaXZlbiBwb3NpdGlvbiBcYSByb3csIFxhIGNvbAorICAgICAgKiBUaGlzIG9wZXJhdGlvbiBpbnZvbGVzIGEgbG9nKHJobypvdXRlcl9zaXplKSBiaW5hcnkgc2VhcmNoLiBJZiB0aGUgY29lZmZpY2llbnQgZG9lcyBub3QKKyAgICAgICogZXhpc3QgeWV0LCB0aGVuIGEgc29ydGVkIGluc2VydGlvbiBpbnRvIGEgc2VxdWVudGlhbCBidWZmZXIgaXMgcGVyZm9ybWVkLgorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisgICAgICByZXR1cm4gbV9kYXRhW291dGVyXS5hdFdpdGhJbnNlcnRpb24oaW5uZXIpOworICAgIH0KKworICAgIGNsYXNzIElubmVySXRlcmF0b3I7CisgICAgY2xhc3MgUmV2ZXJzZUlubmVySXRlcmF0b3I7CisKKyAgICB2b2lkIHNldFplcm8oKQorICAgIHsKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPG91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIG1fZGF0YVtqXS5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworICAgIEluZGV4IG5vblplcm9zKCkgY29uc3QKKyAgICB7CisgICAgICBJbmRleCByZXMgPSAwOworICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgcmVzICs9IG1fZGF0YVtqXS5zaXplKCk7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworCisKKyAgICB2b2lkIHJlc2VydmUoSW5kZXggcmVzZXJ2ZVNpemUgPSAxMDAwKQorICAgIHsKKyAgICAgIGlmIChvdXRlclNpemUoKT4wKQorICAgICAgeworICAgICAgICBJbmRleCByZXNlcnZlU2l6ZVBlclZlY3RvciA9IChzdGQ6Om1heCkocmVzZXJ2ZVNpemUvb3V0ZXJTaXplKCksSW5kZXgoNCkpOworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgbV9kYXRhW2pdLnJlc2VydmUocmVzZXJ2ZVNpemVQZXJWZWN0b3IpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqIERvZXMgbm90aGluZzogcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTcGFyc2VNYXRyaXggKi8KKyAgICBpbmxpbmUgdm9pZCBzdGFydFZlYyhJbmRleCAvKm91dGVyKi8pIHt9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG5vbiB6ZXJvIGNvZWZmaWNpZW50IGF0IHBvc2l0aW9uIFxhIHJvdywgXGEgY29sIGFzc3VtaW5nIHRoYXQ6CisgICAgICAqIC0gdGhlIG5vbnplcm8gZG9lcyBub3QgYWxyZWFkeSBleGlzdAorICAgICAgKiAtIHRoZSBuZXcgY29lZmZpY2llbnQgaXMgdGhlIGxhc3Qgb25lIG9mIHRoZSBnaXZlbiBpbm5lciB2ZWN0b3IuCisgICAgICAqCisgICAgICAqIFxzYSBpbnNlcnQsIGluc2VydEJhY2tCeU91dGVySW5uZXIgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnRCYWNrKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIHJldHVybiBpbnNlcnRCYWNrQnlPdXRlcklubmVyKElzUm93TWFqb3I/cm93OmNvbCwgSXNSb3dNYWpvcj9jb2w6cm93KTsKKyAgICB9CisKKyAgICAvKiogXHNhIGluc2VydEJhY2sgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnRCYWNrQnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXI8SW5kZXgobV9kYXRhLnNpemUoKSkgJiYgaW5uZXI8bV9pbm5lclNpemUgJiYgIm91dCBvZiByYW5nZSIpOworICAgICAgZWlnZW5fYXNzZXJ0KCgobV9kYXRhW291dGVyXS5zaXplKCk9PTApIHx8IChtX2RhdGFbb3V0ZXJdLmluZGV4KG1fZGF0YVtvdXRlcl0uc2l6ZSgpLTEpPGlubmVyKSkKKyAgICAgICAgICAgICAgICAmJiAid3Jvbmcgc29ydGVkIGluc2VydGlvbiIpOworICAgICAgbV9kYXRhW291dGVyXS5hcHBlbmQoMCwgaW5uZXIpOworICAgICAgcmV0dXJuIG1fZGF0YVtvdXRlcl0udmFsdWUobV9kYXRhW291dGVyXS5zaXplKCktMSk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0KEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgSW5kZXggc3RhcnRJZCA9IDA7CisgICAgICBJbmRleCBpZCA9IHN0YXRpY19jYXN0PEluZGV4PihtX2RhdGFbb3V0ZXJdLnNpemUoKSkgLSAxOworICAgICAgbV9kYXRhW291dGVyXS5yZXNpemUoaWQrMiwxKTsKKworICAgICAgd2hpbGUgKCAoaWQgPj0gc3RhcnRJZCkgJiYgKG1fZGF0YVtvdXRlcl0uaW5kZXgoaWQpID4gaW5uZXIpICkKKyAgICAgIHsKKyAgICAgICAgbV9kYXRhW291dGVyXS5pbmRleChpZCsxKSA9IG1fZGF0YVtvdXRlcl0uaW5kZXgoaWQpOworICAgICAgICBtX2RhdGFbb3V0ZXJdLnZhbHVlKGlkKzEpID0gbV9kYXRhW291dGVyXS52YWx1ZShpZCk7CisgICAgICAgIC0taWQ7CisgICAgICB9CisgICAgICBtX2RhdGFbb3V0ZXJdLmluZGV4KGlkKzEpID0gaW5uZXI7CisgICAgICBtX2RhdGFbb3V0ZXJdLnZhbHVlKGlkKzEpID0gMDsKKyAgICAgIHJldHVybiBtX2RhdGFbb3V0ZXJdLnZhbHVlKGlkKzEpOworICAgIH0KKworICAgIC8qKiBEb2VzIG5vdGhpbmc6IHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3BhcnNlTWF0cml4ICovCisgICAgaW5saW5lIHZvaWQgZmluYWxpemUoKSB7fQorCisgICAgLyoqIFN1cHByZXNzIGFsbCBub256ZXJvcyB3aGljaCBhcmUgc21hbGxlciB0aGFuIFxhIHJlZmVyZW5jZSB1bmRlciB0aGUgdG9sZXJlbmNlIFxhIGVwc2lsb24gKi8KKyAgICB2b2lkIHBydW5lKFNjYWxhciByZWZlcmVuY2UsIFJlYWxTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCisgICAgeworICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgbV9kYXRhW2pdLnBydW5lKHJlZmVyZW5jZSxlcHNpbG9uKTsKKyAgICB9CisKKyAgICAvKiogUmVzaXplIHRoZSBtYXRyaXggd2l0aG91dCBwcmVzZXJ2aW5nIHRoZSBkYXRhICh0aGUgbWF0cml4IGlzIHNldCB0byB6ZXJvKQorICAgICAgKi8KKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IElzUm93TWFqb3IgPyByb3dzIDogY29sczsKKyAgICAgIG1faW5uZXJTaXplID0gY29udmVydF9pbmRleChJc1Jvd01ham9yID8gY29scyA6IHJvd3MpOworICAgICAgc2V0WmVybygpOworICAgICAgaWYgKEluZGV4KG1fZGF0YS5zaXplKCkpICE9IG91dGVyU2l6ZSkKKyAgICAgIHsKKyAgICAgICAgbV9kYXRhLnJlc2l6ZShvdXRlclNpemUpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVzaXplQW5kS2VlcERhdGEoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBJc1Jvd01ham9yID8gcm93cyA6IGNvbHM7CisgICAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBJc1Jvd01ham9yID8gY29scyA6IHJvd3M7CisgICAgICBpZiAobV9pbm5lclNpemU+aW5uZXJTaXplKQorICAgICAgeworICAgICAgICAvLyByZW1vdmUgYWxsIGNvZWZmaWNpZW50cyB3aXRoIGlubmVyQ29vcmQ+PWlubmVyU2l6ZQorICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vc3RkOjpjZXJyIDw8ICJub3QgaW1wbGVtZW50ZWQgeWV0XG4iOworICAgICAgICBleGl0KDIpOworICAgICAgfQorICAgICAgaWYgKG1fZGF0YS5zaXplKCkgIT0gb3V0ZXJTaXplKQorICAgICAgeworICAgICAgICBtX2RhdGEucmVzaXplKG91dGVyU2l6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqIFRoZSBjbGFzcyBEeW5hbWljU3BhcnNlTWF0cml4IGlzIGRlcHJlY3RhZWQgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIGlubGluZSBEeW5hbWljU3BhcnNlTWF0cml4KCkKKyAgICAgIDogbV9pbm5lclNpemUoMCksIG1fZGF0YSgwKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbm5lclNpemUoKT09MCAmJiBvdXRlclNpemUoKT09MCk7CisgICAgfQorCisgICAgLyoqIFRoZSBjbGFzcyBEeW5hbWljU3BhcnNlTWF0cml4IGlzIGRlcHJlY3RhZWQgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIGlubGluZSBEeW5hbWljU3BhcnNlTWF0cml4KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgICA6IG1faW5uZXJTaXplKDApCisgICAgeworICAgICAgcmVzaXplKHJvd3MsIGNvbHMpOworICAgIH0KKworICAgIC8qKiBUaGUgY2xhc3MgRHluYW1pY1NwYXJzZU1hdHJpeCBpcyBkZXByZWN0YWVkICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RFUFJFQ0FURUQgZXhwbGljaXQgaW5saW5lIER5bmFtaWNTcGFyc2VNYXRyaXgoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICAgIDogbV9pbm5lclNpemUoMCkKKyAgICB7CisgICAgQmFzZTo6b3BlcmF0b3I9KG90aGVyLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgaW5saW5lIER5bmFtaWNTcGFyc2VNYXRyaXgoY29uc3QgRHluYW1pY1NwYXJzZU1hdHJpeCYgb3RoZXIpCisgICAgICA6IEJhc2UoKSwgbV9pbm5lclNpemUoMCkKKyAgICB7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzd2FwKER5bmFtaWNTcGFyc2VNYXRyaXgmIG90aGVyKQorICAgIHsKKyAgICAgIC8vRUlHRU5fREJHX1NQQVJTRShzdGQ6OmNvdXQgPDwgIlNwYXJzZU1hdHJpeDo6IHN3YXBcbiIpOworICAgICAgc3RkOjpzd2FwKG1faW5uZXJTaXplLCBvdGhlci5tX2lubmVyU2l6ZSk7CisgICAgICAvL3N0ZDo6c3dhcChtX291dGVyU2l6ZSwgb3RoZXIubV9vdXRlclNpemUpOworICAgICAgbV9kYXRhLnN3YXAob3RoZXIubV9kYXRhKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRHluYW1pY1NwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IER5bmFtaWNTcGFyc2VNYXRyaXgmIG90aGVyKQorICAgIHsKKyAgICAgIGlmIChvdGhlci5pc1JWYWx1ZSgpKQorICAgICAgeworICAgICAgICBzd2FwKG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICAgICAgbV9kYXRhID0gb3RoZXIubV9kYXRhOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBEZXN0cnVjdG9yICovCisgICAgaW5saW5lIH5EeW5hbWljU3BhcnNlTWF0cml4KCkge30KKworICBwdWJsaWM6CisKKyAgICAvKiogXGRlcHJlY2F0ZWQKKyAgICAgICogU2V0IHRoZSBtYXRyaXggdG8gemVybyBhbmQgcmVzZXJ2ZSB0aGUgbWVtb3J5IGZvciBcYSByZXNlcnZlU2l6ZSBub256ZXJvIGNvZWZmaWNpZW50cy4gKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIHZvaWQgc3RhcnRGaWxsKEluZGV4IHJlc2VydmVTaXplID0gMTAwMCkKKyAgICB7CisgICAgICBzZXRaZXJvKCk7CisgICAgICByZXNlcnZlKHJlc2VydmVTaXplKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgdXNlIGluc2VydCgpCisgICAgICAqIGluc2VydHMgYSBub256ZXJvIGNvZWZmaWNpZW50IGF0IGdpdmVuIGNvb3JkaW5hdGVzIFxhIHJvdywgXGEgY29sIGFuZCByZXR1cm5zIGl0cyByZWZlcmVuY2UgYXNzdW1pbmcgdGhhdDoKKyAgICAgICogIDEgLSB0aGUgY29lZmZpY2llbnQgZG9lcyBub3QgZXhpc3QgeWV0CisgICAgICAqICAyIC0gdGhpcyB0aGUgY29lZmZpY2llbnQgd2l0aCBncmVhdGVyIGlubmVyIGNvb3JkaW5hdGUgZm9yIHRoZSBnaXZlbiBvdXRlciBjb29yZGluYXRlLgorICAgICAgKiBJbiBvdGhlciB3b3JkcywgYXNzdW1pbmcgXGMgKnRoaXMgaXMgY29sdW1uLW1ham9yLCB0aGVuIHRoZXJlIG11c3Qgbm90IGV4aXN0cyBhbnkgbm9uemVybyBjb2VmZmljaWVudCBvZiBjb29yZGluYXRlcworICAgICAgKiBcYyBpIFxjIHggXGEgY29sIHN1Y2ggdGhhdCBcYyBpID49IFxhIHJvdy4gT3RoZXJ3aXNlIHRoZSBtYXRyaXggaXMgaW52YWxpZC4KKyAgICAgICoKKyAgICAgICogXHNlZSBmaWxscmFuZCgpLCBjb2VmZlJlZigpCisgICAgICAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgU2NhbGFyJiBmaWxsKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKyAgICAgIHJldHVybiBpbnNlcnRCYWNrKG91dGVyLGlubmVyKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgdXNlIGluc2VydCgpCisgICAgICAqIExpa2UgZmlsbCgpIGJ1dCB3aXRoIHJhbmRvbSBpbm5lciBjb29yZGluYXRlcy4KKyAgICAgICogQ29tcGFyZWQgdG8gdGhlIGdlbmVyaWMgY29lZmZSZWYoKSwgdGhlIHVuaXF1ZSBsaW1pdGF0aW9uIGlzIHRoYXQgd2UgYXNzdW1lCisgICAgICAqIHRoZSBjb2VmZmljaWVudCBkb2VzIG5vdCBleGlzdCB5ZXQuCisgICAgICAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgU2NhbGFyJiBmaWxscmFuZChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gaW5zZXJ0KHJvdyxjb2wpOworICAgIH0KKworICAgIC8qKiBcZGVwcmVjYXRlZCB1c2UgZmluYWxpemUoKQorICAgICAgKiBEb2VzIG5vdGhpbmcuIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3BhcnNlTWF0cml4LiAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgdm9pZCBlbmRGaWxsKCkge30KKyAgICAKKyMgICBpZmRlZiBFSUdFTl9EWU5BTUlDU1BBUlNFTUFUUklYX1BMVUdJTgorIyAgICAgaW5jbHVkZSBFSUdFTl9EWU5BTUlDU1BBUlNFTUFUUklYX1BMVUdJTgorIyAgIGVuZGlmCisgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9TdG9yYWdlSW5kZXg+CitjbGFzcyBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4Pjo6SW5uZXJJdGVyYXRvciA6IHB1YmxpYyBTcGFyc2VWZWN0b3I8U2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+OjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VWZWN0b3I8U2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+OjpJbm5lckl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKyAgICBJbm5lckl0ZXJhdG9yKGNvbnN0IER5bmFtaWNTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UobWF0Lm1fZGF0YVtvdXRlcl0pLCBtX291dGVyKG91dGVyKQorICAgIHt9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiBCYXNlOjppbmRleCgpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBCYXNlOjppbmRleCgpIDogbV9vdXRlcjsgfQorICAgIGlubGluZSBJbmRleCBvdXRlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4PgorY2xhc3MgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46OlJldmVyc2VJbm5lckl0ZXJhdG9yIDogcHVibGljIFNwYXJzZVZlY3RvcjxTY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD46OlJldmVyc2VJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VWZWN0b3I8U2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+OjpSZXZlcnNlSW5uZXJJdGVyYXRvciBCYXNlOworICBwdWJsaWM6CisgICAgUmV2ZXJzZUlubmVySXRlcmF0b3IoY29uc3QgRHluYW1pY1NwYXJzZU1hdHJpeCYgbWF0LCBJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZShtYXQubV9kYXRhW291dGVyXSksIG1fb3V0ZXIob3V0ZXIpCisgICAge30KKworICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IEJhc2U6OmluZGV4KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IEJhc2U6OmluZGV4KCkgOiBtX291dGVyOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfU3RvcmFnZUluZGV4Pgorc3RydWN0IGV2YWx1YXRvcjxEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX1N0b3JhZ2VJbmRleD4gPgorICA6IGV2YWx1YXRvcl9iYXNlPER5bmFtaWNTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfU3RvcmFnZUluZGV4PiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRHluYW1pY1NwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9TdG9yYWdlSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBJbm5lckl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlJldmVyc2VJbm5lckl0ZXJhdG9yIFJldmVyc2VJbm5lckl0ZXJhdG9yOworICAKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IE51bVRyYWl0czxfU2NhbGFyPjo6UmVhZENvc3QsCisgICAgRmxhZ3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpGbGFncworICB9OworICAKKyAgZXZhbHVhdG9yKCkgOiBtX21hdHJpeCgwKSB7fQorICBldmFsdWF0b3IoY29uc3QgU3BhcnNlTWF0cml4VHlwZSAmbWF0KSA6IG1fbWF0cml4KCZtYXQpIHt9CisgIAorICBvcGVyYXRvciBTcGFyc2VNYXRyaXhUeXBlJigpIHsgcmV0dXJuIG1fbWF0cml4LT5jb25zdF9jYXN0X2Rlcml2ZWQoKTsgfQorICBvcGVyYXRvciBjb25zdCBTcGFyc2VNYXRyaXhUeXBlJigpIGNvbnN0IHsgcmV0dXJuICptX21hdHJpeDsgfQorICAKKyAgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC0+Y29lZmYocm93LGNvbCk7IH0KKyAgCisgIEluZGV4IG5vblplcm9zRXN0aW1hdGUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC0+bm9uWmVyb3MoKTsgfQorCisgIGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUgKm1fbWF0cml4OworfTsKKworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0RZTkFNSUNfU1BBUlNFTUFUUklYX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9NYXJrZXRJTy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL01hcmtldElPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMTRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9NYXJrZXRJTy5oCkBAIC0wLDAgKzEsMjc0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTlVFTlRTQSBXQUtBTSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9NQVJLRVRfSU9fSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfTUFSS0VUX0lPX0gKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIAoreworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorICBpbmxpbmUgYm9vbCBHZXRNYXJrZXRMaW5lIChzdGQ6OnN0cmluZ3N0cmVhbSYgbGluZSwgSW5kZXgmIE0sIEluZGV4JiBOLCBJbmRleCYgaSwgSW5kZXgmIGosIFNjYWxhciYgdmFsdWUpCisgIHsKKyAgICBsaW5lID4+IGkgPj4gaiA+PiB2YWx1ZTsKKyAgICBpLS07CisgICAgai0tOworICAgIGlmKGk+PTAgJiYgaj49MCAmJiBpPE0gJiYgajxOKQorICAgIHsKKyAgICAgIHJldHVybiB0cnVlOyAKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSBib29sIEdldE1hcmtldExpbmUgKHN0ZDo6c3RyaW5nc3RyZWFtJiBsaW5lLCBJbmRleCYgTSwgSW5kZXgmIE4sIEluZGV4JiBpLCBJbmRleCYgaiwgc3RkOjpjb21wbGV4PFNjYWxhcj4mIHZhbHVlKQorICB7CisgICAgU2NhbGFyIHZhbFIsIHZhbEk7CisgICAgbGluZSA+PiBpID4+IGogPj4gdmFsUiA+PiB2YWxJOworICAgIGktLTsKKyAgICBqLS07CisgICAgaWYoaT49MCAmJiBqPj0wICYmIGk8TSAmJiBqPE4pCisgICAgeworICAgICAgdmFsdWUgPSBzdGQ6OmNvbXBsZXg8U2NhbGFyPih2YWxSLCB2YWxJKTsKKyAgICAgIHJldHVybiB0cnVlOyAKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWxTY2FsYXI+CisgIGlubGluZSB2b2lkICBHZXRWZWN0b3JFbHQgKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBSZWFsU2NhbGFyJiB2YWwpCisgIHsKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gbmV3bGluZShsaW5lKTsKKyAgICBuZXdsaW5lID4+IHZhbDsgIAorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWxTY2FsYXI+CisgIGlubGluZSB2b2lkIEdldFZlY3RvckVsdCAoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiYgdmFsKQorICB7CisgICAgUmVhbFNjYWxhciB2YWxSLCB2YWxJOyAKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gbmV3bGluZShsaW5lKTsKKyAgICBuZXdsaW5lID4+IHZhbFIgPj4gdmFsSTsgCisgICAgdmFsID0gc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+KHZhbFIsIHZhbEkpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dE1hcmtldEhlYWRlcihzdGQ6OnN0cmluZyYgaGVhZGVyLGludCBzeW0pCisgIHsKKyAgICBoZWFkZXI9ICIlJU1hdHJpeE1hcmtldCBtYXRyaXggY29vcmRpbmF0ZSAiOworICAgIGlmKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlKQorICAgIHsKKyAgICAgIGhlYWRlciArPSAiIGNvbXBsZXgiOyAKKyAgICAgIGlmKHN5bSA9PSBTeW1tZXRyaWMpIGhlYWRlciArPSAiIHN5bW1ldHJpYyI7CisgICAgICBlbHNlIGlmIChzeW0gPT0gU2VsZkFkam9pbnQpIGhlYWRlciArPSAiIEhlcm1pdGlhbiI7CisgICAgICBlbHNlIGhlYWRlciArPSAiIGdlbmVyYWwiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGVhZGVyICs9ICIgcmVhbCI7IAorICAgICAgaWYoc3ltID09IFN5bW1ldHJpYykgaGVhZGVyICs9ICIgc3ltbWV0cmljIjsKKyAgICAgIGVsc2UgaGVhZGVyICs9ICIgZ2VuZXJhbCI7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICBpbmxpbmUgdm9pZCBQdXRNYXRyaXhFbHQoU2NhbGFyIHZhbHVlLCBpbnQgcm93LCBpbnQgY29sLCBzdGQ6Om9mc3RyZWFtJiBvdXQpCisgIHsKKyAgICBvdXQgPDwgcm93IDw8ICIgIjw8IGNvbCA8PCAiICIgPDwgdmFsdWUgPDwgIlxuIjsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIFB1dE1hdHJpeEVsdChzdGQ6OmNvbXBsZXg8U2NhbGFyPiB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCwgc3RkOjpvZnN0cmVhbSYgb3V0KQorICB7CisgICAgb3V0IDw8IHJvdyA8PCAiICIgPDwgY29sIDw8ICIgIiA8PCB2YWx1ZS5yZWFsKCkgPDwgIiAiIDw8IHZhbHVlLmltYWcoKSA8PCAiXG4iOworICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dFZlY3RvckVsdChTY2FsYXIgdmFsdWUsIHN0ZDo6b2ZzdHJlYW0mIG91dCkKKyAgeworICAgIG91dCA8PCB2YWx1ZSA8PCAiXG4iOyAKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dFZlY3RvckVsdChzdGQ6OmNvbXBsZXg8U2NhbGFyPiB2YWx1ZSwgc3RkOjpvZnN0cmVhbSYgb3V0KQorICB7CisgICAgb3V0IDw8IHZhbHVlLnJlYWwgPDwgIiAiIDw8IHZhbHVlLmltYWcoKTw8ICJcbiI7IAorICB9CisKK30gLy8gZW5kIG5hbWVwc2FjZSBpbnRlcm5hbAorCitpbmxpbmUgYm9vbCBnZXRNYXJrZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBpbnQmIHN5bSwgYm9vbCYgaXNjb21wbGV4LCBib29sJiBpc3ZlY3RvcikKK3sKKyAgc3ltID0gMDsgCisgIGlzdmVjdG9yID0gZmFsc2U7CisgIHN0ZDo6aWZzdHJlYW0gaW4oZmlsZW5hbWUuY19zdHIoKSxzdGQ6Omlvczo6aW4pOworICBpZighaW4pCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgc3RkOjpzdHJpbmcgbGluZTsgCisgIC8vIFRoZSBtYXRyaXggaGVhZGVyIGlzIGFsd2F5cyB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZSAKKyAgc3RkOjpnZXRsaW5lKGluLCBsaW5lKTsgZWlnZW5fYXNzZXJ0KGluLmdvb2QoKSk7CisgIAorICBzdGQ6OnN0cmluZ3N0cmVhbSBmbXRsaW5lKGxpbmUpOyAKKyAgc3RkOjpzdHJpbmcgc3Vic3RyWzVdOworICBmbXRsaW5lPj4gc3Vic3RyWzBdID4+IHN1YnN0clsxXSA+PiBzdWJzdHJbMl0gPj4gc3Vic3RyWzNdID4+IHN1YnN0cls0XTsKKyAgaWYoc3Vic3RyWzJdLmNvbXBhcmUoImFycmF5IikgPT0gMCkgaXN2ZWN0b3IgPSB0cnVlOworICBpZihzdWJzdHJbM10uY29tcGFyZSgiY29tcGxleCIpID09IDApIGlzY29tcGxleCA9IHRydWU7CisgIGlmKHN1YnN0cls0XS5jb21wYXJlKCJzeW1tZXRyaWMiKSA9PSAwKSBzeW0gPSBTeW1tZXRyaWM7CisgIGVsc2UgaWYgKHN1YnN0cls0XS5jb21wYXJlKCJIZXJtaXRpYW4iKSA9PSAwKSBzeW0gPSBTZWxmQWRqb2ludDsKKyAgCisgIHJldHVybiB0cnVlOworfQorICAKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Citib29sIGxvYWRNYXJrZXQoU3BhcnNlTWF0cml4VHlwZSYgbWF0LCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgc3RkOjppZnN0cmVhbSBpbnB1dChmaWxlbmFtZS5jX3N0cigpLHN0ZDo6aW9zOjppbik7CisgIGlmKCFpbnB1dCkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBjb25zdCBpbnQgbWF4QnVmZmVyc2l6ZSA9IDIwNDg7CisgIGNoYXIgYnVmZmVyW21heEJ1ZmZlcnNpemVdOworICAKKyAgYm9vbCByZWFkc2l6ZXMgPSBmYWxzZTsKKworICB0eXBlZGVmIFRyaXBsZXQ8U2NhbGFyLEluZGV4PiBUOworICBzdGQ6OnZlY3RvcjxUPiBlbGVtZW50czsKKyAgCisgIEluZGV4IE0oLTEpLCBOKC0xKSwgTk5aKC0xKTsKKyAgSW5kZXggY291bnQgPSAwOworICB3aGlsZShpbnB1dC5nZXRsaW5lKGJ1ZmZlciwgbWF4QnVmZmVyc2l6ZSkpCisgIHsKKyAgICAvLyBza2lwIGNvbW1lbnRzICAgCisgICAgLy9OT1RFIEFuIGFwcHJvcHJpYXRlIHRlc3Qgc2hvdWxkIGJlIGRvbmUgb24gdGhlIGhlYWRlciB0byBnZXQgdGhlICBzeW1tZXRyeQorICAgIGlmKGJ1ZmZlclswXT09JyUnKQorICAgICAgY29udGludWU7CisgICAgCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbGluZShidWZmZXIpOworICAgIAorICAgIGlmKCFyZWFkc2l6ZXMpCisgICAgeworICAgICAgbGluZSA+PiBNID4+IE4gPj4gTk5aOworICAgICAgaWYoTSA+IDAgJiYgTiA+IDAgJiYgTk5aID4gMCkgCisgICAgICB7CisgICAgICAgIHJlYWRzaXplcyA9IHRydWU7CisgICAgICAgIC8vc3RkOjpjb3V0IDw8ICJzaXplczogIiA8PCBNIDw8ICIsIiA8PCBOIDw8ICIsIiA8PCBOTlogPDwgIlxuIjsKKyAgICAgICAgbWF0LnJlc2l6ZShNLE4pOworICAgICAgICBtYXQucmVzZXJ2ZShOTlopOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAKKyAgICAgIEluZGV4IGkoLTEpLCBqKC0xKTsKKyAgICAgIFNjYWxhciB2YWx1ZTsgCisgICAgICBpZiggaW50ZXJuYWw6OkdldE1hcmtldExpbmUobGluZSwgTSwgTiwgaSwgaiwgdmFsdWUpICkgCisgICAgICB7CisgICAgICAgICsrIGNvdW50OworICAgICAgICBlbGVtZW50cy5wdXNoX2JhY2soVChpLGosdmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgCisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCByZWFkOiAiIDw8IGkgPDwgIiwiIDw8IGogPDwgIlxuIjsgICAgICAgIAorICAgIH0KKyAgfQorICBtYXQuc2V0RnJvbVRyaXBsZXRzKGVsZW1lbnRzLmJlZ2luKCksIGVsZW1lbnRzLmVuZCgpKTsKKyAgaWYoY291bnQhPU5OWikKKyAgICBzdGQ6OmNlcnIgPDwgY291bnQgPDwgIiE9IiA8PCBOTlogPDwgIlxuIjsKKyAgCisgIGlucHV0LmNsb3NlKCk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgorYm9vbCBsb2FkTWFya2V0VmVjdG9yKFZlY3RvclR5cGUmIHZlYywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICBzdGQ6Omlmc3RyZWFtIGluKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisgIGlmKCFpbikKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBzdGQ6OnN0cmluZyBsaW5lOyAKKyAgaW50IG4oMCksIGNvbCgwKTsgCisgIGRvIAorICB7IC8vIFNraXAgY29tbWVudHMKKyAgICBzdGQ6OmdldGxpbmUoaW4sIGxpbmUpOyBlaWdlbl9hc3NlcnQoaW4uZ29vZCgpKTsKKyAgfSB3aGlsZSAobGluZVswXSA9PSAnJScpOworICBzdGQ6OmlzdHJpbmdzdHJlYW0gbmV3bGluZShsaW5lKTsKKyAgbmV3bGluZSAgPj4gbiA+PiBjb2w7IAorICBlaWdlbl9hc3NlcnQobj4wICYmIGNvbD4wKTsKKyAgdmVjLnJlc2l6ZShuKTsKKyAgaW50IGkgPSAwOyAKKyAgU2NhbGFyIHZhbHVlOyAKKyAgd2hpbGUgKCBzdGQ6OmdldGxpbmUoaW4sIGxpbmUpICYmIChpIDwgbikgKXsKKyAgICBpbnRlcm5hbDo6R2V0VmVjdG9yRWx0KGxpbmUsIHZhbHVlKTsgCisgICAgdmVjKGkrKykgPSB2YWx1ZTsgCisgIH0KKyAgaW4uY2xvc2UoKTsKKyAgaWYgKGkhPW4peworICAgIHN0ZDo6Y2Vycjw8ICJVbmFibGUgdG8gcmVhZCBhbGwgZWxlbWVudHMgZnJvbSBmaWxlICIgPDwgZmlsZW5hbWUgPDwgIlxuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Citib29sIHNhdmVNYXJrZXQoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgbWF0LCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCBzeW0gPSAwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHN0ZDo6b2ZzdHJlYW0gb3V0KGZpbGVuYW1lLmNfc3RyKCksc3RkOjppb3M6Om91dCk7CisgIGlmKCFvdXQpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgb3V0LmZsYWdzKHN0ZDo6aW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICBvdXQucHJlY2lzaW9uKDY0KTsKKyAgc3RkOjpzdHJpbmcgaGVhZGVyOyAKKyAgaW50ZXJuYWw6OnB1dE1hcmtldEhlYWRlcjxTY2FsYXI+KGhlYWRlciwgc3ltKTsgCisgIG91dCA8PCBoZWFkZXIgPDwgc3RkOjplbmRsOyAKKyAgb3V0IDw8IG1hdC5yb3dzKCkgPDwgIiAiIDw8IG1hdC5jb2xzKCkgPDwgIiAiIDw8IG1hdC5ub25aZXJvcygpIDw8ICJcbiI7CisgIGludCBjb3VudCA9IDA7CisgIGZvcihpbnQgaj0wOyBqPG1hdC5vdXRlclNpemUoKTsgKytqKQorICAgIGZvcih0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1hdCxqKTsgaXQ7ICsraXQpCisgICAgeworICAgICAgKysgY291bnQ7CisgICAgICBpbnRlcm5hbDo6UHV0TWF0cml4RWx0KGl0LnZhbHVlKCksIGl0LnJvdygpKzEsIGl0LmNvbCgpKzEsIG91dCk7CisgICAgICAvLyBvdXQgPDwgaXQucm93KCkrMSA8PCAiICIgPDwgaXQuY29sKCkrMSA8PCAiICIgPDwgaXQudmFsdWUoKSA8PCAiXG4iOworICAgIH0KKyAgb3V0LmNsb3NlKCk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgorYm9vbCBzYXZlTWFya2V0VmVjdG9yIChjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7IAorIHN0ZDo6b2ZzdHJlYW0gb3V0KGZpbGVuYW1lLmNfc3RyKCksc3RkOjppb3M6Om91dCk7CisgIGlmKCFvdXQpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgb3V0LmZsYWdzKHN0ZDo6aW9zX2Jhc2U6OnNjaWVudGlmaWMpOworICBvdXQucHJlY2lzaW9uKDY0KTsKKyAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnZhbHVlIHx8IGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6dmFsdWUpCisgICAgICBvdXQgPDwgIiUlTWF0cml4TWFya2V0IG1hdHJpeCBhcnJheSBjb21wbGV4IGdlbmVyYWxcbiI7IAorICBlbHNlCisgICAgb3V0IDw8ICIlJU1hdHJpeE1hcmtldCBtYXRyaXggYXJyYXkgcmVhbCBnZW5lcmFsXG4iOyAKKyAgb3V0IDw8IHZlYy5zaXplKCkgPDwgIiAiPDwgMSA8PCAiXG4iOworICBmb3IgKGludCBpPTA7IGkgPCB2ZWMuc2l6ZSgpOyBpKyspeworICAgIGludGVybmFsOjpwdXRWZWN0b3JFbHQodmVjKGkpLCBvdXQpOyAKKyAgfQorICBvdXQuY2xvc2UoKTsKKyAgcmV0dXJuIHRydWU7IAorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9NQVJLRVRfSU9fSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL01hdHJpeE1hcmtldEl0ZXJhdG9yLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvTWF0cml4TWFya2V0SXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkxNmVhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL01hdHJpeE1hcmtldEl0ZXJhdG9yLmgKQEAgLTAsMCArMSwyNDcgQEAKKworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRGVzaXJlIE5VRU5UU0EgV0FLQU0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CUk9XU0VfTUFUUklDRVNfSAorI2RlZmluZSBFSUdFTl9CUk9XU0VfTUFUUklDRVNfSAorCituYW1lc3BhY2UgRWlnZW4geworCitlbnVtIHsKKyAgU1BEID0gMHgxMDAsCisgIE5vblN5bW1ldHJpYyA9IDB4MAorfTsgCisKKy8qKiAKKyAqIEBicmllZiBJdGVyYXRvciB0byBicm93c2UgbWF0cmljZXMgZnJvbSBhIHNwZWNpZmllZCBmb2xkZXIKKyAqIAorICogVGhpcyBpcyB1c2VkIHRvIGxvYWQgYWxsIHRoZSBtYXRyaWNlcyBmcm9tIGEgZm9sZGVyLiAKKyAqIFRoZSBtYXRyaWNlcyBzaG91bGQgYmUgaW4gTWF0cml4IE1hcmtldCBmb3JtYXQKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbWF0cmljZXMgYXJlIG5hbWVkIGFzIG1hdG5hbWUubXR4CisgKiBhbmQgbWF0bmFtZV9TUEQubXR4IGlmIHRoZSBtYXRyaXggaXMgU3ltbWV0cmljIGFuZCBwb3NpdGl2ZSBkZWZpbml0ZSAob3IgSGVybWl0aWFuKQorICogVGhlIHJpZ2h0IGhhbmQgc2lkZSB2ZWN0b3JzIGFyZSBsb2FkZWQgYXMgd2VsbCwgaWYgdGhleSBleGlzdC4KKyAqIFRoZXkgc2hvdWxkIGJlIG5hbWVkIGFzIG1hdG5hbWVfYi5tdHguIAorICogTm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZm9yIGEgU1BEIG1hdHJpeCBpcyBuYW1lZCBhcyBtYXRuYW1lX1NQRF9iLm10eAorICogCisgKiBTb21ldGltZXMgYSByZWZlcmVuY2Ugc29sdXRpb24gaXMgYXZhaWxhYmxlLiBJbiB0aGlzIGNhc2UsIGl0IHNob3VsZCBiZSBuYW1lZCBhcyBtYXRuYW1lX3gubXR4CisgKiAKKyAqIFNhbXBsZSBjb2RlCisgKiBcY29kZQorICogCisgKiBcZW5kY29kZQorICogCisgKiBcdHBhcmFtIFNjYWxhciBUaGUgc2NhbGFyIHR5cGUgCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitjbGFzcyBNYXRyaXhNYXJrZXRJdGVyYXRvciAKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JUeXBlOyAKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3I+IE1hdHJpeFR5cGU7IAorICAKKyAgcHVibGljOgorICAgIE1hdHJpeE1hcmtldEl0ZXJhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nICZmb2xkZXIpCisgICAgICA6IG1fc3ltKDApLCBtX2lzdmFsaWQoZmFsc2UpLCBtX21hdElzTG9hZGVkKGZhbHNlKSwgbV9oYXNSaHMoZmFsc2UpLCBtX2hhc3JlZlgoZmFsc2UpLCBtX2ZvbGRlcihmb2xkZXIpCisgICAgeworICAgICAgbV9mb2xkZXJfaWQgPSBvcGVuZGlyKGZvbGRlci5jX3N0cigpKTsKKyAgICAgIGlmKG1fZm9sZGVyX2lkKQorICAgICAgICBHZXRuZXh0dmFsaWRtYXRyaXgoKTsKKyAgICB9CisgICAgCisgICAgfk1hdHJpeE1hcmtldEl0ZXJhdG9yKCkKKyAgICB7CisgICAgICBpZiAobV9mb2xkZXJfaWQpIGNsb3NlZGlyKG1fZm9sZGVyX2lkKTsgCisgICAgfQorICAgIAorICAgIGlubGluZSBNYXRyaXhNYXJrZXRJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgbV9tYXRJc0xvYWRlZCA9IGZhbHNlOworICAgICAgbV9oYXNyZWZYID0gZmFsc2U7CisgICAgICBtX2hhc1JocyA9IGZhbHNlOworICAgICAgR2V0bmV4dHZhbGlkbWF0cml4KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9pc3ZhbGlkO30KKyAgICAKKyAgICAvKiogUmV0dXJuIHRoZSBzcGFyc2UgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSAqLworICAgIGlubGluZSBNYXRyaXhUeXBlJiBtYXRyaXgoKSAKKyAgICB7IAorICAgICAgLy8gUmVhZCB0aGUgbWF0cml4CisgICAgICBpZiAobV9tYXRJc0xvYWRlZCkgcmV0dXJuIG1fbWF0OworICAgICAgCisgICAgICBzdGQ6OnN0cmluZyBtYXRyaXhfZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9tYXRuYW1lICsgIi5tdHgiOworICAgICAgaWYgKCAhbG9hZE1hcmtldChtX21hdCwgbWF0cml4X2ZpbGUpKSAKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nIGxvYWRNYXJrZXQgZmFpbGVkIHdoZW4gbG9hZGluZyBcIiIgPDwgbWF0cml4X2ZpbGUgPDwgIlwiIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIG1fbWF0SXNMb2FkZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG1fbWF0OworICAgICAgfQorICAgICAgbV9tYXRJc0xvYWRlZCA9IHRydWU7IAorCisgICAgICBpZiAobV9zeW0gIT0gTm9uU3ltbWV0cmljKSAKKyAgICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHJlc3RvcmUgYSBmdWxsIG1hdHJpeDoKKyAgICAgICAgUmVhbFNjYWxhciBkaWFnX25vcm0gID0gbV9tYXQuZGlhZ29uYWwoKS5ub3JtKCk7CisgICAgICAgIFJlYWxTY2FsYXIgbG93ZXJfbm9ybSA9IG1fbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLm5vcm0oKTsKKyAgICAgICAgUmVhbFNjYWxhciB1cHBlcl9ub3JtID0gbV9tYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkubm9ybSgpOworICAgICAgICBpZihsb3dlcl9ub3JtPmRpYWdfbm9ybSAmJiB1cHBlcl9ub3JtPT1kaWFnX25vcm0pCisgICAgICAgIHsKKyAgICAgICAgICAvLyBvbmx5IHRoZSBsb3dlciBwYXJ0IGlzIHN0b3JlZAorICAgICAgICAgIE1hdHJpeFR5cGUgdG1wKG1fbWF0KTsKKyAgICAgICAgICBtX21hdCA9IHRtcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZih1cHBlcl9ub3JtPmRpYWdfbm9ybSAmJiBsb3dlcl9ub3JtPT1kaWFnX25vcm0pCisgICAgICAgIHsKKyAgICAgICAgICAvLyBvbmx5IHRoZSB1cHBlciBwYXJ0IGlzIHN0b3JlZAorICAgICAgICAgIE1hdHJpeFR5cGUgdG1wKG1fbWF0KTsKKyAgICAgICAgICBtX21hdCA9IHRtcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBtX21hdDsgCisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IG1hdHJpeC4gCisgICAgICogSWYgdGhlIHJocyBmaWxlIGlzIG5vdCBwcm92aWRlZCwgYSByYW5kb20gcmhzIGlzIGdlbmVyYXRlZAorICAgICAqLworICAgIGlubGluZSBWZWN0b3JUeXBlJiByaHMoKSAKKyAgICB7IAorICAgICAgIC8vIEdldCB0aGUgcmlnaHQgaGFuZCBzaWRlCisgICAgICBpZiAobV9oYXNSaHMpIHJldHVybiBtX3JoczsKKyAgICAgIAorICAgICAgc3RkOjpzdHJpbmcgcmhzX2ZpbGU7CisgICAgICByaHNfZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9tYXRuYW1lICsgIl9iLm10eCI7IC8vIFRoZSBwYXR0ZXJuIGlzIG1hdG5hbWVfYi5tdHgKKyAgICAgIG1faGFzUmhzID0gRmlsZWV4aXN0cyhyaHNfZmlsZSk7CisgICAgICBpZiAobV9oYXNSaHMpCisgICAgICB7CisgICAgICAgIG1fcmhzLnJlc2l6ZShtX21hdC5jb2xzKCkpOworICAgICAgICBtX2hhc1JocyA9IGxvYWRNYXJrZXRWZWN0b3IobV9yaHMsIHJoc19maWxlKTsKKyAgICAgIH0KKyAgICAgIGlmICghbV9oYXNSaHMpCisgICAgICB7CisgICAgICAgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIHJpZ2h0IGhhbmQgc2lkZQorICAgICAgICBpZiAoIW1fbWF0SXNMb2FkZWQpIHRoaXMtPm1hdHJpeCgpOyAKKyAgICAgICAgbV9yZWZYLnJlc2l6ZShtX21hdC5jb2xzKCkpOworICAgICAgICBtX3JlZlguc2V0UmFuZG9tKCk7CisgICAgICAgIG1fcmhzID0gbV9tYXQgKiBtX3JlZlg7CisgICAgICAgIG1faGFzcmVmWCA9IHRydWU7CisgICAgICAgIG1faGFzUmhzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3JoczsgCisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm4gYSByZWZlcmVuY2Ugc29sdXRpb24KKyAgICAgKiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgYW5kIGlmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIHRoZW4gcmVmWCBpcyByYW5kb21seSBnZW5lcmF0ZWQgc3VjaCB0aGF0IEEqcmVmWCA9IGIgCisgICAgICogd2hlcmUgQSBhbmQgYiBhcmUgdGhlIG1hdHJpeCBhbmQgdGhlIHJocy4gCisgICAgICogTm90ZSB0aGF0IHdoZW4gYSByaHMgaXMgcHJvdmlkZWQsIHJlZlggaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgKi8KKyAgICBpbmxpbmUgVmVjdG9yVHlwZSYgcmVmWCgpIAorICAgIHsgCisgICAgICAvLyBDaGVjayBpZiBhIHJlZmVyZW5jZSBzb2x1dGlvbiBpcyBwcm92aWRlZAorICAgICAgaWYgKG1faGFzcmVmWCkgcmV0dXJuIG1fcmVmWDsKKyAgICAgIAorICAgICAgc3RkOjpzdHJpbmcgbGhzX2ZpbGU7CisgICAgICBsaHNfZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9tYXRuYW1lICsgIl94Lm10eCI7IAorICAgICAgbV9oYXNyZWZYID0gRmlsZWV4aXN0cyhsaHNfZmlsZSk7CisgICAgICBpZiAobV9oYXNyZWZYKQorICAgICAgeworICAgICAgICBtX3JlZlgucmVzaXplKG1fbWF0LmNvbHMoKSk7CisgICAgICAgIG1faGFzcmVmWCA9IGxvYWRNYXJrZXRWZWN0b3IobV9yZWZYLCBsaHNfZmlsZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG1fcmVmWC5yZXNpemUoMCk7CisgICAgICByZXR1cm4gbV9yZWZYOyAKKyAgICB9CisgICAgCisgICAgaW5saW5lIHN0ZDo6c3RyaW5nJiBtYXRuYW1lKCkgeyByZXR1cm4gbV9tYXRuYW1lOyB9CisgICAgCisgICAgaW5saW5lIGludCBzeW0oKSB7IHJldHVybiBtX3N5bTsgfQorICAgIAorICAgIGJvb2wgaGFzUmhzKCkge3JldHVybiBtX2hhc1JoczsgfQorICAgIGJvb2wgaGFzcmVmWCgpIHtyZXR1cm4gbV9oYXNyZWZYOyB9CisgICAgYm9vbCBpc0ZvbGRlclZhbGlkKCkgeyByZXR1cm4gYm9vbChtX2ZvbGRlcl9pZCk7IH0KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIGlubGluZSBib29sIEZpbGVleGlzdHMoc3RkOjpzdHJpbmcgZmlsZSkKKyAgICB7CisgICAgICBzdGQ6Omlmc3RyZWFtIGZpbGVfaWQoZmlsZS5jX3N0cigpKTsKKyAgICAgIGlmICghZmlsZV9pZC5nb29kKCkgKSAKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZWxzZSAKKyAgICAgIHsKKyAgICAgICAgZmlsZV9pZC5jbG9zZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBHZXRuZXh0dmFsaWRtYXRyaXgoICkKKyAgICB7CisgICAgICBtX2lzdmFsaWQgPSBmYWxzZTsKKyAgICAgIC8vIEhlcmUsIHdlIHJldHVybiB3aXRoIHRoZSBuZXh0IHZhbGlkIG1hdHJpeCBpbiB0aGUgZm9sZGVyCisgICAgICB3aGlsZSAoIChtX2N1cnNfaWQgPSByZWFkZGlyKG1fZm9sZGVyX2lkKSkgIT0gTlVMTCkgeworICAgICAgICBtX2lzdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY3VyZmlsZTsKKyAgICAgICAgY3VyZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9jdXJzX2lkLT5kX25hbWU7CisgICAgICAgIC8vIERpc2NhcmQgaWYgaXQgaXMgYSBmb2xkZXIKKyAgICAgICAgaWYgKG1fY3Vyc19pZC0+ZF90eXBlID09IERUX0RJUikgY29udGludWU7IC8vRklYTUUgVGhpcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBub24gQlNEIHN5c3RlbXMKKy8vICAgICAgICAgc3RydWN0IHN0YXQgc3RfYnVmOyAKKy8vICAgICAgICAgc3RhdCAoY3VyZmlsZS5jX3N0cigpLCAmc3RfYnVmKTsKKy8vICAgICAgICAgaWYgKFNfSVNESVIoc3RfYnVmLnN0X21vZGUpKSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIERldGVybWluZSBmcm9tIHRoZSBoZWFkZXIgaWYgaXQgaXMgYSBtYXRyaXggb3IgYSByaWdodCBoYW5kIHNpZGUgCisgICAgICAgIGJvb2wgaXN2ZWN0b3IsaXNjb21wbGV4PWZhbHNlOworICAgICAgICBpZighZ2V0TWFya2V0SGVhZGVyKGN1cmZpbGUsbV9zeW0saXNjb21wbGV4LGlzdmVjdG9yKSkgY29udGludWU7CisgICAgICAgIGlmKGlzdmVjdG9yKSBjb250aW51ZTsKKyAgICAgICAgaWYgKCFpc2NvbXBsZXgpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6dmFsdWUgfHwgaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+Ojp2YWx1ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNjb21wbGV4KQorICAgICAgICB7CisgICAgICAgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBmbG9hdD46OnZhbHVlIHx8IGludGVybmFsOjppc19zYW1lPFNjYWxhciwgZG91YmxlPjo6dmFsdWUpCisgICAgICAgICAgICBjb250aW51ZTsgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBHZXQgdGhlIG1hdHJpeCBuYW1lCisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gbV9jdXJzX2lkLT5kX25hbWU7CisgICAgICAgIG1fbWF0bmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBmaWxlbmFtZS5sZW5ndGgoKS00KTsgCisgICAgICAgIAorICAgICAgICAvLyBGaW5kIGlmIHRoZSBtYXRyaXggaXMgU1BEIAorICAgICAgICBzaXplX3QgZm91bmQgPSBtX21hdG5hbWUuZmluZCgiU1BEIik7CisgICAgICAgIGlmKCAoZm91bmQhPXN0ZDo6c3RyaW5nOjpucG9zKSAmJiAobV9zeW0gIT0gTm9uU3ltbWV0cmljKSApCisgICAgICAgICAgbV9zeW0gPSBTUEQ7CisgICAgICAgCisgICAgICAgIG1faXN2YWxpZCA9IHRydWU7CisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgICAgaW50IG1fc3ltOyAvLyBTeW1tZXRyeSBvZiB0aGUgbWF0cml4CisgICAgTWF0cml4VHlwZSBtX21hdDsgLy8gQ3VycmVudCBtYXRyaXggIAorICAgIFZlY3RvclR5cGUgbV9yaHM7ICAvLyBDdXJyZW50IHZlY3RvcgorICAgIFZlY3RvclR5cGUgbV9yZWZYOyAvLyBUaGUgcmVmZXJlbmNlIHNvbHV0aW9uLCBpZiBleGlzdHMKKyAgICBzdGQ6OnN0cmluZyBtX21hdG5hbWU7IC8vIE1hdHJpeCBOYW1lCisgICAgYm9vbCBtX2lzdmFsaWQ7IAorICAgIGJvb2wgbV9tYXRJc0xvYWRlZDsgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtYXRyaXggaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgZnJvbSB0aGUgZmlsZQorICAgIGJvb2wgbV9oYXNSaHM7IC8vIFRoZSByaWdodCBoYW5kIHNpZGUgZXhpc3RzCisgICAgYm9vbCBtX2hhc3JlZlg7IC8vIEEgcmVmZXJlbmNlIHNvbHV0aW9uIGlzIHByb3ZpZGVkCisgICAgc3RkOjpzdHJpbmcgbV9mb2xkZXI7CisgICAgRElSICogbV9mb2xkZXJfaWQ7CisgICAgc3RydWN0IGRpcmVudCAqbV9jdXJzX2lkOyAKKyAgICAKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9SYW5kb21TZXR0ZXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9SYW5kb21TZXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk3Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL1JhbmRvbVNldHRlci5oCkBAIC0wLDAgKzEsMzI3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUkFORE9NU0VUVEVSX0gKKyNkZWZpbmUgRUlHRU5fUkFORE9NU0VUVEVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBSZXByZXNlbnRzIGEgc3RkOjptYXAKKyAgKgorICAqIFxzZWUgUmFuZG9tU2V0dGVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBTdGRNYXBUcmFpdHMKK3sKKyAgdHlwZWRlZiBpbnQgS2V5VHlwZTsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxLZXlUeXBlLFNjYWxhcj4gVHlwZTsKKyAgZW51bSB7CisgICAgSXNTb3J0ZWQgPSAxCisgIH07CisKKyAgc3RhdGljIHZvaWQgc2V0SW52YWxpZEtleShUeXBlJiwgY29uc3QgS2V5VHlwZSYpIHt9Cit9OworCisjaWZkZWYgRUlHRU5fVU5PUkRFUkVEX01BUF9TVVBQT1JUCisvKiogUmVwcmVzZW50cyBhIHN0ZDo6dW5vcmRlcmVkX21hcAorICAqCisgICogVG8gdXNlIGl0IHlvdSBuZWVkIHRvIGJvdGggZGVmaW5lIEVJR0VOX1VOT1JERVJFRF9NQVBfU1VQUE9SVCBhbmQgaW5jbHVkZSB0aGUgdW5vcmRlcmVkX21hcCBoZWFkZXIgZmlsZQorICAqIHlvdXJzZWxmIG1ha2luZyBzdXJlIHRoYXQgdW5vcmRlcmVkX21hcCBpcyBkZWZpbmVkIGluIHRoZSBzdGQgbmFtZXNwYWNlLgorICAqCisgICogRm9yIGluc3RhbmNlLCB3aXRoIGN1cnJlbnQgdmVyc2lvbiBvZiBnY2MgeW91IGNhbiBlaXRoZXIgZW5hYmxlIEMrKzB4IHN0YW5kYXJkICgtc3RkPWMrKzB4KSBvciBkbzoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX21hcD4KKyAgKiAjZGVmaW5lIEVJR0VOX1VOT1JERVJFRF9NQVBfU1VQUE9SVAorICAqIG5hbWVzcGFjZSBzdGQgeworICAqICAgdXNpbmcgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXA7CisgICogfQorICAqIFxlbmRjb2RlCisgICoKKyAgKiBcc2VlIFJhbmRvbVNldHRlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgU3RkVW5vcmRlcmVkTWFwVHJhaXRzCit7CisgIHR5cGVkZWYgaW50IEtleVR5cGU7CisgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPEtleVR5cGUsU2NhbGFyPiBUeXBlOworICBlbnVtIHsKKyAgICBJc1NvcnRlZCA9IDAKKyAgfTsKKworICBzdGF0aWMgdm9pZCBzZXRJbnZhbGlkS2V5KFR5cGUmLCBjb25zdCBLZXlUeXBlJikge30KK307CisjZW5kaWYgLy8gRUlHRU5fVU5PUkRFUkVEX01BUF9TVVBQT1JUCisKKyNpZmRlZiBfREVOU0VfSEFTSF9NQVBfSF8KKy8qKiBSZXByZXNlbnRzIGEgZ29vZ2xlOjpkZW5zZV9oYXNoX21hcAorICAqCisgICogXHNlZSBSYW5kb21TZXR0ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IEdvb2dsZURlbnNlSGFzaE1hcFRyYWl0cworeworICB0eXBlZGVmIGludCBLZXlUeXBlOworICB0eXBlZGVmIGdvb2dsZTo6ZGVuc2VfaGFzaF9tYXA8S2V5VHlwZSxTY2FsYXI+IFR5cGU7CisgIGVudW0geworICAgIElzU29ydGVkID0gMAorICB9OworCisgIHN0YXRpYyB2b2lkIHNldEludmFsaWRLZXkoVHlwZSYgbWFwLCBjb25zdCBLZXlUeXBlJiBrKQorICB7IG1hcC5zZXRfZW1wdHlfa2V5KGspOyB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBfU1BBUlNFX0hBU0hfTUFQX0hfCisvKiogUmVwcmVzZW50cyBhIGdvb2dsZTo6c3BhcnNlX2hhc2hfbWFwCisgICoKKyAgKiBcc2VlIFJhbmRvbVNldHRlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cworeworICB0eXBlZGVmIGludCBLZXlUeXBlOworICB0eXBlZGVmIGdvb2dsZTo6c3BhcnNlX2hhc2hfbWFwPEtleVR5cGUsU2NhbGFyPiBUeXBlOworICBlbnVtIHsKKyAgICBJc1NvcnRlZCA9IDAKKyAgfTsKKworICBzdGF0aWMgdm9pZCBzZXRJbnZhbGlkS2V5KFR5cGUmLCBjb25zdCBLZXlUeXBlJikge30KK307CisjZW5kaWYKKworLyoqIFxjbGFzcyBSYW5kb21TZXR0ZXIKKyAgKgorICAqIFxicmllZiBUaGUgUmFuZG9tU2V0dGVyIGlzIGEgd3JhcHBlciBvYmplY3QgYWxsb3dpbmcgdG8gc2V0L3VwZGF0ZSBhIHNwYXJzZSBtYXRyaXggd2l0aCByYW5kb20gYWNjZXNzCisgICoKKyAgKiBcdHBhcmFtIFNwYXJzZU1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggd2UgYXJlIHVwZGF0aW5nCisgICogXHRwYXJhbSBNYXBUcmFpdHMgYSB0cmFpdHMgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBtYXAgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGhlIHRlbXBvcmFyeSBzcGFyc2Ugc3RvcmFnZS4KKyAgKiAgICAgICAgICAgICAgICAgIEl0cyBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gdGhlIHN5c3RlbS4KKyAgKiBcdHBhcmFtIE91dGVyUGFja2V0Qml0cyBkZWZpbmVzIHRoZSBudW1iZXIgb2Ygcm93cyAob3IgY29sdW1ucykgbWFuYWdlIGJ5IGEgc2luZ2xlIG1hcCBvYmplY3QKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgcG93ZXIgb2YgdHdvIGV4cG9uZW50LgorICAqCisgICogVGhpcyBjbGFzcyB0ZW1wb3JhcmlseSByZXByZXNlbnRzIGEgc3BhcnNlIG1hdHJpeCBvYmplY3QgdXNpbmcgYSBnZW5lcmljIG1hcCBpbXBsZW1lbnRhdGlvbiBhbGxvd2luZyBmb3IKKyAgKiBlZmZpY2llbnQgcmFuZG9tIGFjY2Vzcy4gVGhlIGNvbnZlcnNpb24gZnJvbSB0aGUgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiB0byBhIGhhc2hfbWFwIG9iamVjdCBpcyBwZXJmb3JtZWQKKyAgKiBpbiB0aGUgUmFuZG9tU2V0dGVyIGNvbnN0cnVjdG9yLCB3aGlsZSB0aGUgc3BhcnNlIG1hdHJpeCBpcyB1cGRhdGVkIGJhY2sgYXQgZGVzdHJ1Y3Rpb24gdGltZS4gVGhpcyBzdHJhdGVneQorICAqIHN1Z2dlc3QgdGhlIHVzZSBvZiBuZXN0ZWQgYmxvY2tzIGFzIGluIHRoaXMgZXhhbXBsZToKKyAgKgorICAqIFxjb2RlCisgICogU3BhcnNlTWF0cml4PGRvdWJsZT4gbShyb3dzLGNvbHMpOworICAqIHsKKyAgKiAgIFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHcobSk7CisgICogICAvLyBkb24ndCB1c2UgbSBidXQgdyBpbnN0ZWFkIHdpdGggcmVhZC93cml0ZSByYW5kb20gYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudHM6CisgICogICBmb3IoOzspCisgICogICAgIHcocmFuZCgpLHJhbmQoKSkgPSByYW5kOworICAqIH0KKyAgKiAvLyB3aGVuIHcgaXMgZGVsZXRlZCwgdGhlIGRhdGEgYXJlIGNvcGllZCBiYWNrIHRvIG0KKyAgKiAvLyBhbmQgbSBpcyByZWFkeSB0byB1c2UuCisgICogXGVuZGNvZGUKKyAgKgorICAqIFNpbmNlIGhhc2hfbWFwIG9iamVjdHMgYXJlIG5vdCBmdWxseSBzb3J0ZWQsIHJlcHJlc2VudGluZyBhIGZ1bGwgbWF0cml4IGFzIGEgc2luZ2xlIGhhc2hfbWFwIHdvdWxkCisgICogaW52b2x2ZSBhIGJpZyBhbmQgY29zdGx5IHNvcnQgdG8gdXBkYXRlIHRoZSBjb21wcmVzc2VkIG1hdHJpeCBiYWNrLiBUbyBvdmVyY29tZSB0aGlzIGlzc3VlLCBhIFJhbmRvbVNldHRlcgorICAqIHVzZSBtdWx0aXBsZSBoYXNoX21hcCwgZWFjaCByZXByZXNlbnRpbmcgMl5PdXRlclBhY2tldEJpdHMgY29sdW1ucyBvciByb3dzIGFjY29yZGluZyB0byB0aGUgc3RvcmFnZSBvcmRlci4KKyAgKiBUbyByZWFjaCBvcHRpbWFsIHBlcmZvcm1hbmNlLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG5vbnplcm9zCisgICogcGVyIHJvd3MvY29sdW1ucy4KKyAgKgorICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgTWFwVHJhaXRzIGFyZToKKyAgKiAgLSBcYiBTdGRNYXBUcmFpdHM6IGNvcnJlc3BvbmRzIHRvIHN0ZDo6bWFwLiAoZG9lcyBub3QgcGVyZm9ybSB2ZXJ5IHdlbGwpCisgICogIC0gXGIgR251SGFzaE1hcFRyYWl0czogY29ycmVzcG9uZHMgdG8gX19nbnVfY3h4OjpoYXNoX21hcCAoYXZhaWxhYmxlIG9ubHkgd2l0aCBHQ0MpCisgICogIC0gXGIgR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzOiBjb3JyZXNwb25kcyB0byBnb29nbGU6OmRlbnNlX2hhc2hfbWFwIChiZXN0IGVmZmljaWVuY3ksIHJlYXNvbmFibGUgbWVtb3J5IGNvbnN1bXB0aW9uKQorICAqICAtIFxiIEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHM6IGNvcnJlc3BvbmRzIHRvIGdvb2dsZTo6c3BhcnNlX2hhc2hfbWFwIChiZXN0IG1lbW9yeSBjb25zdW1wdGlvbiwgcmVsYXRpdmVseSBnb29kIHBlcmZvcm1hbmNlKQorICAqCisgICogVGhlIGRlZmF1bHQgbWFwIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gdGhlIGF2YWlsYWJpbGl0eSwgYW5kIHRoZSBwcmVmZXJyZWQgb3JkZXIgaXM6CisgICogR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cywgR251SGFzaE1hcFRyYWl0cywgYW5kIGZpbmFsbHkgU3RkTWFwVHJhaXRzLgorICAqCisgICogRm9yIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgY29uc3VtcHRpb24gcmVhc29ucyBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gdXNlIG9uZSBvZgorICAqIHRoZSBHb29nbGUncyBoYXNoX21hcCBpbXBsZW1lbnRhdGlvbi4gVG8gZW5hYmxlIHRoZSBzdXBwb3J0IGZvciB0aGVtLCB5b3UgaGF2ZSB0d28gb3B0aW9uczoKKyAgKiAgLSBcI2luY2x1ZGUgPGdvb2dsZS9kZW5zZV9oYXNoX21hcD4geW91cnNlbGYgXGIgYmVmb3JlIEVpZ2VuL1NwYXJzZSBoZWFkZXIKKyAgKiAgLSBkZWZpbmUgRUlHRU5fR09PR0xFSEFTSF9TVVBQT1JUCisgICogSW4gdGhlIGxhdGVyIGNhc2UgdGhlIGluY2x1c2lvbiBvZiA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPiBpcyBtYWRlIGZvciB5b3UuCisgICoKKyAgKiBcc2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtc3BhcnNlaGFzaC8KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsCisgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTWFwVHJhaXRzID0KKyNpZiBkZWZpbmVkIF9ERU5TRV9IQVNIX01BUF9IXworICAgICAgICAgIEdvb2dsZURlbnNlSGFzaE1hcFRyYWl0cworI2VsaWYgZGVmaW5lZCBfSEFTSF9NQVAKKyAgICAgICAgICBHbnVIYXNoTWFwVHJhaXRzCisjZWxzZQorICAgICAgICAgIFN0ZE1hcFRyYWl0cworI2VuZGlmCisgICAgICAgICAsaW50IE91dGVyUGFja2V0Qml0cyA9IDY+CitjbGFzcyBSYW5kb21TZXR0ZXIKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworCisgICAgc3RydWN0IFNjYWxhcldyYXBwZXIKKyAgICB7CisgICAgICBTY2FsYXJXcmFwcGVyKCkgOiB2YWx1ZSgwKSB7fQorICAgICAgU2NhbGFyIHZhbHVlOworICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXBUcmFpdHM8U2NhbGFyV3JhcHBlcj46OktleVR5cGUgS2V5VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFRyYWl0czxTY2FsYXJXcmFwcGVyPjo6VHlwZSBIYXNoTWFwVHlwZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IE91dGVyUGFja2V0TWFzayA9ICgxIDw8IE91dGVyUGFja2V0Qml0cykgLSAxOworICAgIGVudW0geworICAgICAgU3dhcFN0b3JhZ2UgPSAxIC0gTWFwVHJhaXRzPFNjYWxhcldyYXBwZXI+OjpJc1NvcnRlZCwKKyAgICAgIFRhcmdldFJvd01ham9yID0gKFNwYXJzZU1hdHJpeFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gMSA6IDAsCisgICAgICBTZXR0ZXJSb3dNYWpvciA9IFN3YXBTdG9yYWdlID8gMS1UYXJnZXRSb3dNYWpvciA6IFRhcmdldFJvd01ham9yCisgICAgfTsKKworICBwdWJsaWM6CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHJhbmRvbSBzZXR0ZXIgb2JqZWN0IGZyb20gdGhlIHNwYXJzZSBtYXRyaXggXGEgdGFyZ2V0CisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBcYSB0YXJnZXQgYXJlIGltcG9ydGVkLiBJZiB5b3Ugd2FudCB0byByZS1zZXQKKyAgICAgICogYSBzcGFyc2UgbWF0cml4IGZyb20gc2NyYXRjaCwgdGhlbiB5b3UgbXVzdCBzZXQgaXQgdG8gemVybyBmaXJzdCB1c2luZyB0aGUKKyAgICAgICogc2V0WmVybygpIGZ1bmN0aW9uLgorICAgICAgKi8KKyAgICBpbmxpbmUgUmFuZG9tU2V0dGVyKFNwYXJzZU1hdHJpeFR5cGUmIHRhcmdldCkKKyAgICAgIDogbXBfdGFyZ2V0KCZ0YXJnZXQpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gU3dhcFN0b3JhZ2UgPyB0YXJnZXQuaW5uZXJTaXplKCkgOiB0YXJnZXQub3V0ZXJTaXplKCk7CisgICAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBTd2FwU3RvcmFnZSA/IHRhcmdldC5vdXRlclNpemUoKSA6IHRhcmdldC5pbm5lclNpemUoKTsKKyAgICAgIG1fb3V0ZXJQYWNrZXRzID0gb3V0ZXJTaXplID4+IE91dGVyUGFja2V0Qml0czsKKyAgICAgIGlmIChvdXRlclNpemUmT3V0ZXJQYWNrZXRNYXNrKQorICAgICAgICBtX291dGVyUGFja2V0cyArPSAxOworICAgICAgbV9oYXNobWFwcyA9IG5ldyBIYXNoTWFwVHlwZVttX291dGVyUGFja2V0c107CisgICAgICAvLyBjb21wdXRlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBzdG9yZSBpbm5lciBpbmRpY2VzCisgICAgICBJbmRleCBhdXggPSBpbm5lclNpemUgLSAxOworICAgICAgbV9rZXlCaXRzT2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChhdXgpCisgICAgICB7CisgICAgICAgICsrbV9rZXlCaXRzT2Zmc2V0OworICAgICAgICBhdXggPSBhdXggPj4gMTsKKyAgICAgIH0KKyAgICAgIEtleVR5cGUgaWsgPSAoMTw8KE91dGVyUGFja2V0Qml0cyttX2tleUJpdHNPZmZzZXQpKTsKKyAgICAgIGZvciAoSW5kZXggaz0wOyBrPG1fb3V0ZXJQYWNrZXRzOyArK2spCisgICAgICAgIE1hcFRyYWl0czxTY2FsYXJXcmFwcGVyPjo6c2V0SW52YWxpZEtleShtX2hhc2htYXBzW2tdLGlrKTsKKworICAgICAgLy8gaW5zZXJ0IGN1cnJlbnQgY29lZmZzCisgICAgICBmb3IgKEluZGV4IGo9MDsgajxtcF90YXJnZXQtPm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIGZvciAodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdCgqbXBfdGFyZ2V0LGopOyBpdDsgKytpdCkKKyAgICAgICAgICAoKnRoaXMpKFRhcmdldFJvd01ham9yP2o6aXQuaW5kZXgoKSwgVGFyZ2V0Um93TWFqb3I/aXQuaW5kZXgoKTpqKSA9IGl0LnZhbHVlKCk7CisgICAgfQorCisgICAgLyoqIERlc3RydWN0b3IgdXBkYXRpbmcgYmFjayB0aGUgc3BhcnNlIG1hdHJpeCB0YXJnZXQgKi8KKyAgICB+UmFuZG9tU2V0dGVyKCkKKyAgICB7CisgICAgICBLZXlUeXBlIGtleUJpdHNNYXNrID0gKDE8PG1fa2V5Qml0c09mZnNldCktMTsKKyAgICAgIGlmICghU3dhcFN0b3JhZ2UpIC8vIGFsc28gbWVhbnMgdGhlIG1hcCBpcyBzb3J0ZWQKKyAgICAgIHsKKyAgICAgICAgbXBfdGFyZ2V0LT5zZXRaZXJvKCk7CisgICAgICAgIG1wX3RhcmdldC0+bWFrZUNvbXByZXNzZWQoKTsKKyAgICAgICAgbXBfdGFyZ2V0LT5yZXNlcnZlKG5vblplcm9zKCkpOworICAgICAgICBJbmRleCBwcmV2T3V0ZXIgPSAtMTsKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGs8bV9vdXRlclBhY2tldHM7ICsraykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyT2Zmc2V0ID0gKDE8PE91dGVyUGFja2V0Qml0cykgKiBrOworICAgICAgICAgIHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBlbmQgPSBtX2hhc2htYXBzW2tdLmVuZCgpOworICAgICAgICAgIGZvciAodHlwZW5hbWUgSGFzaE1hcFR5cGU6Oml0ZXJhdG9yIGl0ID0gbV9oYXNobWFwc1trXS5iZWdpbigpOyBpdCE9ZW5kOyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gKGl0LT5maXJzdCA+PiBtX2tleUJpdHNPZmZzZXQpICsgb3V0ZXJPZmZzZXQ7CisgICAgICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IGl0LT5maXJzdCAmIGtleUJpdHNNYXNrOworICAgICAgICAgICAgaWYgKHByZXZPdXRlciE9b3V0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoSW5kZXggaj1wcmV2T3V0ZXIrMTtqPD1vdXRlcjsrK2opCisgICAgICAgICAgICAgICAgbXBfdGFyZ2V0LT5zdGFydFZlYyhqKTsKKyAgICAgICAgICAgICAgcHJldk91dGVyID0gb3V0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcF90YXJnZXQtPmluc2VydEJhY2tCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSA9IGl0LT5zZWNvbmQudmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wX3RhcmdldC0+ZmluYWxpemUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVmVjdG9yWGkgcG9zaXRpb25zKG1wX3RhcmdldC0+b3V0ZXJTaXplKCkpOworICAgICAgICBwb3NpdGlvbnMuc2V0WmVybygpOworICAgICAgICAvLyBwYXNzIDEKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGs8bV9vdXRlclBhY2tldHM7ICsraykKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBlbmQgPSBtX2hhc2htYXBzW2tdLmVuZCgpOworICAgICAgICAgIGZvciAodHlwZW5hbWUgSGFzaE1hcFR5cGU6Oml0ZXJhdG9yIGl0ID0gbV9oYXNobWFwc1trXS5iZWdpbigpOyBpdCE9ZW5kOyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gaXQtPmZpcnN0ICYga2V5Qml0c01hc2s7CisgICAgICAgICAgICArK3Bvc2l0aW9uc1tvdXRlcl07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHByZWZpeCBzdW0KKyAgICAgICAgSW5kZXggY291bnQgPSAwOworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxtcF90YXJnZXQtPm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCB0bXAgPSBwb3NpdGlvbnNbal07CisgICAgICAgICAgbXBfdGFyZ2V0LT5vdXRlckluZGV4UHRyKClbal0gPSBjb3VudDsKKyAgICAgICAgICBwb3NpdGlvbnNbal0gPSBjb3VudDsKKyAgICAgICAgICBjb3VudCArPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgbXBfdGFyZ2V0LT5tYWtlQ29tcHJlc3NlZCgpOworICAgICAgICBtcF90YXJnZXQtPm91dGVySW5kZXhQdHIoKVttcF90YXJnZXQtPm91dGVyU2l6ZSgpXSA9IGNvdW50OworICAgICAgICBtcF90YXJnZXQtPnJlc2l6ZU5vblplcm9zKGNvdW50KTsKKyAgICAgICAgLy8gcGFzcyAyCisgICAgICAgIGZvciAoSW5kZXggaz0wOyBrPG1fb3V0ZXJQYWNrZXRzOyArK2spCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBJbmRleCBvdXRlck9mZnNldCA9ICgxPDxPdXRlclBhY2tldEJpdHMpICogazsKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoTWFwVHlwZTo6aXRlcmF0b3IgZW5kID0gbV9oYXNobWFwc1trXS5lbmQoKTsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBpdCA9IG1faGFzaG1hcHNba10uYmVnaW4oKTsgaXQhPWVuZDsgKytpdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IChpdC0+Zmlyc3QgPj4gbV9rZXlCaXRzT2Zmc2V0KSArIG91dGVyT2Zmc2V0OworICAgICAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBpdC0+Zmlyc3QgJiBrZXlCaXRzTWFzazsKKyAgICAgICAgICAgIC8vIHNvcnRlZCBpbnNlcnRpb24KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhdCBtb3N0IDJeT3V0ZXJQYWNrZXRCaXRzIHVuc29ydGVkIGNvZWZmaWNpZW50cywKKyAgICAgICAgICAgIC8vIG1vcmVvdmVyIHRob3NlIDJeT3V0ZXJQYWNrZXRCaXRzIGNvZWZmcyBhcmUgbGlrZWx5IHRvIGJlIHNwYXJzZSwgYW4gc28gb25seSBhCisgICAgICAgICAgICAvLyBzbWFsbCBmcmFjdGlvbiBvZiB0aGVtIGhhdmUgdG8gYmUgc29ydGVkLCB3aGVuY2UgdGhlIGZvbGxvd2luZyBzaW1wbGUgcHJvY2VkdXJlOgorICAgICAgICAgICAgSW5kZXggcG9zU3RhcnQgPSBtcF90YXJnZXQtPm91dGVySW5kZXhQdHIoKVtvdXRlcl07CisgICAgICAgICAgICBJbmRleCBpID0gKHBvc2l0aW9uc1tvdXRlcl0rKykgLSAxOworICAgICAgICAgICAgd2hpbGUgKCAoaSA+PSBwb3NTdGFydCkgJiYgKG1wX3RhcmdldC0+aW5uZXJJbmRleFB0cigpW2ldID4gaW5uZXIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBfdGFyZ2V0LT52YWx1ZVB0cigpW2krMV0gPSBtcF90YXJnZXQtPnZhbHVlUHRyKClbaV07CisgICAgICAgICAgICAgIG1wX3RhcmdldC0+aW5uZXJJbmRleFB0cigpW2krMV0gPSBtcF90YXJnZXQtPmlubmVySW5kZXhQdHIoKVtpXTsKKyAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXBfdGFyZ2V0LT5pbm5lckluZGV4UHRyKClbaSsxXSA9IGlubmVyOworICAgICAgICAgICAgbXBfdGFyZ2V0LT52YWx1ZVB0cigpW2krMV0gPSBpdC0+c2Vjb25kLnZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVsZXRlW10gbV9oYXNobWFwczsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGNvb3JkaW5hdGVzIFxhIHJvdywgXGEgY29sICovCisgICAgU2NhbGFyJiBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IFNldHRlclJvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBTZXR0ZXJSb3dNYWpvciA/IGNvbCA6IHJvdzsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyTWFqb3IgPSBvdXRlciA+PiBPdXRlclBhY2tldEJpdHM7IC8vIGluZGV4IG9mIHRoZSBwYWNrZXQvbWFwCisgICAgICBjb25zdCBJbmRleCBvdXRlck1pbm9yID0gb3V0ZXIgJiBPdXRlclBhY2tldE1hc2s7ICAvLyBpbmRleCBvZiB0aGUgaW5uZXIgdmVjdG9yIGluIHRoZSBwYWNrZXQKKyAgICAgIGNvbnN0IEtleVR5cGUga2V5ID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8S2V5VHlwZT4oKG91dGVyTWlub3I8PG1fa2V5Qml0c09mZnNldCkgfCBpbm5lcik7CisgICAgICByZXR1cm4gbV9oYXNobWFwc1tvdXRlck1ham9yXVtrZXldLnZhbHVlOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cworICAgICAgKgorICAgICAgKiBcbm90ZSBBY2NvcmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgbWFwL2hhc2hfbWFwIGltcGxlbWVudGF0aW9uLAorICAgICAgKiB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHF1aXRlIGV4cGVuc2l2ZS4KKyAgICAgICovCisgICAgSW5kZXggbm9uWmVyb3MoKSBjb25zdAorICAgIHsKKyAgICAgIEluZGV4IG56ID0gMDsKKyAgICAgIGZvciAoSW5kZXggaz0wOyBrPG1fb3V0ZXJQYWNrZXRzOyArK2spCisgICAgICAgIG56ICs9IHN0YXRpY19jYXN0PEluZGV4PihtX2hhc2htYXBzW2tdLnNpemUoKSk7CisgICAgICByZXR1cm4gbno7CisgICAgfQorCisKKyAgcHJvdGVjdGVkOgorCisgICAgSGFzaE1hcFR5cGUqIG1faGFzaG1hcHM7CisgICAgU3BhcnNlTWF0cml4VHlwZSogbXBfdGFyZ2V0OworICAgIEluZGV4IG1fb3V0ZXJQYWNrZXRzOworICAgIHVuc2lnbmVkIGNoYXIgbV9rZXlCaXRzT2Zmc2V0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9SQU5ET01TRVRURVJfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwZWNpYWxGdW5jdGlvbnMvU3BlY2lhbEZ1bmN0aW9uc0FycmF5QVBJLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zQXJyYXlBUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQxNWRiCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwZWNpYWxGdW5jdGlvbnMvU3BlY2lhbEZ1bmN0aW9uc0FycmF5QVBJLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjaWZuZGVmIEVJR0VOX1NQRUNJQUxGVU5DVElPTlNfQVJSQVlBUElfSAorI2RlZmluZSBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX0FSUkFZQVBJX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjcHAxMSBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGlnYW1tYShcYSBhLCBcYSB4KSB0byB0aGUgZ2l2ZW4gYXJyYXlzLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29lZmZpY2llbnQtd2lzZSBpbmNvbXBsZXRlIGdhbW1hIGZ1bmN0aW9uLgorICAqCisgICogXG5vdGUgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBvbmx5IGZsb2F0IGFuZCBkb3VibGUgc2NhbGFyIHR5cGVzIGluIGMrKzExIG1vZGUuIFRvIHN1cHBvcnQgb3RoZXIgc2NhbGFyIHR5cGVzLAorICAqIG9yIGZsb2F0L2RvdWJsZSBpbiBub24gYysrMTEgbW9kZSwgdGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIGlnYW1tYWMoVCxUKSBmb3IgYW55IHNjYWxhcgorICAqIHR5cGUgVCB0byBiZSBzdXBwb3J0ZWQuCisgICoKKyAgKiBcc2EgRWlnZW46OmlnYW1tYWMoKSwgRWlnZW46OmxnYW1tYSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIEV4cG9uZW50RGVyaXZlZD4KK2lubGluZSBjb25zdCBFaWdlbjo6Q3dpc2VCaW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZ2FtbWFfb3A8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgRXhwb25lbnREZXJpdmVkPgoraWdhbW1hKGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIGEsIGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RXhwb25lbnREZXJpdmVkPiYgeCkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpDd2lzZUJpbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lnYW1tYV9vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBFeHBvbmVudERlcml2ZWQ+KAorICAgIGEuZGVyaXZlZCgpLAorICAgIHguZGVyaXZlZCgpCisgICk7Cit9CisKKy8qKiBcY3BwMTEgXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBpZ2FtbWFjKFxhIGEsIFxhIHgpIHRvIHRoZSBnaXZlbiBhcnJheXMuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBjb2VmZmljaWVudC13aXNlIGNvbXBsZW1lbnRhcnkgaW5jb21wbGV0ZSBnYW1tYSBmdW5jdGlvbi4KKyAgKgorICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBmbG9hdCBhbmQgZG91YmxlIHNjYWxhciB0eXBlcyBpbiBjKysxMSBtb2RlLiBUbyBzdXBwb3J0IG90aGVyIHNjYWxhciB0eXBlcywKKyAgKiBvciBmbG9hdC9kb3VibGUgaW4gbm9uIGMrKzExIG1vZGUsIHRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBpZ2FtbWFjKFQsVCkgZm9yIGFueSBzY2FsYXIKKyAgKiB0eXBlIFQgdG8gYmUgc3VwcG9ydGVkLgorICAqCisgICogXHNhIEVpZ2VuOjppZ2FtbWEoKSwgRWlnZW46OmxnYW1tYSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIEV4cG9uZW50RGVyaXZlZD4KK2lubGluZSBjb25zdCBFaWdlbjo6Q3dpc2VCaW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZ2FtbWFjX29wPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IEV4cG9uZW50RGVyaXZlZD4KK2lnYW1tYWMoY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgYSwgY29uc3QgRWlnZW46OkFycmF5QmFzZTxFeHBvbmVudERlcml2ZWQ+JiB4KQoreworICByZXR1cm4gRWlnZW46OkN3aXNlQmluYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfaWdhbW1hY19vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBFeHBvbmVudERlcml2ZWQ+KAorICAgIGEuZGVyaXZlZCgpLAorICAgIHguZGVyaXZlZCgpCisgICk7Cit9CisKKy8qKiBcY3BwMTEgXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBwb2x5Z2FtbWEoXGEgbiwgXGEgeCkgdG8gdGhlIGdpdmVuIGFycmF5cy4KKyAgKgorICAqIEl0IHJldHVybnMgdGhlIFxhIG4gLXRoIGRlcml2YXRpdmUgb2YgdGhlIGRpZ2FtbWEocHNpKSBldmFsdWF0ZWQgYXQgXGMgeC4KKyAgKgorICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBmbG9hdCBhbmQgZG91YmxlIHNjYWxhciB0eXBlcyBpbiBjKysxMSBtb2RlLiBUbyBzdXBwb3J0IG90aGVyIHNjYWxhciB0eXBlcywKKyAgKiBvciBmbG9hdC9kb3VibGUgaW4gbm9uIGMrKzExIG1vZGUsIHRoZSB1c2VyIGhhcyB0byBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiBwb2x5Z2FtbWEoVCxUKSBmb3IgYW55IHNjYWxhcgorICAqIHR5cGUgVCB0byBiZSBzdXBwb3J0ZWQuCisgICoKKyAgKiBcc2EgRWlnZW46OmRpZ2FtbWEoKQorICAqLworLy8gKiBcd2FybmluZyBCZSBjYXJlZnVsIHdpdGggdGhlIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzOiB4LnBvbHlnYW1tYShuKSBpcyBlcXVpdmFsZW50IHRvIHBvbHlnYW1tYShuLHgpCisvLyAqIFxzYSBBcnJheUJhc2U6OnBvbHlnYW1tYSgpCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkTix0eXBlbmFtZSBEZXJpdmVkWD4KK2lubGluZSBjb25zdCBFaWdlbjo6Q3dpc2VCaW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9wb2x5Z2FtbWFfb3A8dHlwZW5hbWUgRGVyaXZlZFg6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWROLCBjb25zdCBEZXJpdmVkWD4KK3BvbHlnYW1tYShjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWROPiYgbiwgY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkWD4mIHgpCit7CisgIHJldHVybiBFaWdlbjo6Q3dpc2VCaW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9wb2x5Z2FtbWFfb3A8dHlwZW5hbWUgRGVyaXZlZFg6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWROLCBjb25zdCBEZXJpdmVkWD4oCisgICAgbi5kZXJpdmVkKCksCisgICAgeC5kZXJpdmVkKCkKKyAgKTsKK30KKworLyoqIFxjcHAxMSBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGJldGFpbmMoXGEgeCwgXGEgYSwgXGEgYikgdG8gdGhlIGdpdmVuIGFycmF5cy4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHJlZ3VsYXJpemVkIGluY29tcGxldGUgYmV0YSBmdW5jdGlvbiAoaW50ZWdyYWwpLgorICAqCisgICogXG5vdGUgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBvbmx5IGZsb2F0IGFuZCBkb3VibGUgc2NhbGFyIHR5cGVzIGluIGMrKzExIG1vZGUuIFRvIHN1cHBvcnQgb3RoZXIgc2NhbGFyIHR5cGVzLAorICAqIG9yIGZsb2F0L2RvdWJsZSBpbiBub24gYysrMTEgbW9kZSwgdGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIGJldGFpbmMoVCxULFQpIGZvciBhbnkgc2NhbGFyCisgICogdHlwZSBUIHRvIGJlIHN1cHBvcnRlZC4KKyAgKgorICAqIFxzYSBFaWdlbjo6YmV0YWluYygpLCBFaWdlbjo6bGdhbW1hKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ0FEZXJpdmVkLCB0eXBlbmFtZSBBcmdCRGVyaXZlZCwgdHlwZW5hbWUgQXJnWERlcml2ZWQ+CitpbmxpbmUgY29uc3QgRWlnZW46OkN3aXNlVGVybmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2JldGFpbmNfb3A8dHlwZW5hbWUgQXJnWERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IEFyZ0FEZXJpdmVkLCBjb25zdCBBcmdCRGVyaXZlZCwgY29uc3QgQXJnWERlcml2ZWQ+CitiZXRhaW5jKGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8QXJnQURlcml2ZWQ+JiBhLCBjb25zdCBFaWdlbjo6QXJyYXlCYXNlPEFyZ0JEZXJpdmVkPiYgYiwgY29uc3QgRWlnZW46OkFycmF5QmFzZTxBcmdYRGVyaXZlZD4mIHgpCit7CisgIHJldHVybiBFaWdlbjo6Q3dpc2VUZXJuYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfYmV0YWluY19vcDx0eXBlbmFtZSBBcmdYRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgQXJnQURlcml2ZWQsIGNvbnN0IEFyZ0JEZXJpdmVkLCBjb25zdCBBcmdYRGVyaXZlZD4oCisgICAgYS5kZXJpdmVkKCksCisgICAgYi5kZXJpdmVkKCksCisgICAgeC5kZXJpdmVkKCkKKyAgKTsKK30KKworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSB6ZXRhKFxhIHgsIFxhIHEpIHRvIHRoZSBnaXZlbiBhcnJheXMuCisgICoKKyAgKiBJdCByZXR1cm5zIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cyBcYSB4IGFuZCBcYSBxOgorICAqCisgICogXHBhcmFtIHggaXMgdGhlIGV4cG9zZW50LCBpdCBtdXN0IGJlID4gMQorICAqIFxwYXJhbSBxIGlzIHRoZSBzaGlmdCwgaXQgbXVzdCBiZSA+IDAKKyAgKgorICAqIFxub3RlIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBmbG9hdCBhbmQgZG91YmxlIHNjYWxhciB0eXBlcy4gVG8gc3VwcG9ydCBvdGhlciBzY2FsYXIgdHlwZXMsIHRoZSB1c2VyIGhhcworICAqIHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIHpldGEoVCxUKSBmb3IgYW55IHNjYWxhciB0eXBlIFQgdG8gYmUgc3VwcG9ydGVkLgorICAqCisgICogXHNhIEFycmF5QmFzZTo6emV0YSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkWCx0eXBlbmFtZSBEZXJpdmVkUT4KK2lubGluZSBjb25zdCBFaWdlbjo6Q3dpc2VCaW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl96ZXRhX29wPHR5cGVuYW1lIERlcml2ZWRYOjpTY2FsYXI+LCBjb25zdCBEZXJpdmVkWCwgY29uc3QgRGVyaXZlZFE+Cit6ZXRhKGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZFg+JiB4LCBjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWRRPiYgcSkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpDd2lzZUJpbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX3pldGFfb3A8dHlwZW5hbWUgRGVyaXZlZFg6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWRYLCBjb25zdCBEZXJpdmVkUT4oCisgICAgeC5kZXJpdmVkKCksCisgICAgcS5kZXJpdmVkKCkKKyAgKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX0FSUkFZQVBJX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNGdW5jdG9ycy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwZWNpYWxGdW5jdGlvbnMvU3BlY2lhbEZ1bmN0aW9uc0Z1bmN0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmMjM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNGdW5jdG9ycy5oCkBAIC0wLDAgKzEsMjM2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBFdWdlbmUgQnJldmRvIDxlYnJldmRvQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BFQ0lBTEZVTkNUSU9OU19GVU5DVE9SU19ICisjZGVmaW5lIEVJR0VOX1NQRUNJQUxGVU5DVElPTlNfRlVOQ1RPUlNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBpbmNvbXBsZXRlIGdhbW1hIGZ1bmN0aW9uIGlnYW1tYShhLCB4KQorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIEN3aXNlOjppZ2FtbWEKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9pZ2FtbWFfb3AgOiBiaW5hcnlfb3BfYmFzZTxTY2FsYXIsU2NhbGFyPgoreworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfaWdhbW1hX29wKQorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgeCkgY29uc3QgeworICAgIHVzaW5nIG51bWV4dDo6aWdhbW1hOyByZXR1cm4gaWdhbW1hKGEsIHgpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBpZ2FtbWEoYSwgeCk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2lnYW1tYV9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICAvLyBHdWVzc3RpbWF0ZQorICAgIENvc3QgPSAyMCAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0lHYW1tYQorICB9OworfTsKKworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgY29tcGxlbWVudGFyeSBpbmNvbXBsZXRlIGdhbW1hIGZ1bmN0aW9uIGlnYW1tYWMoYSwgeCkKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBDd2lzZTo6aWdhbW1hYworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2lnYW1tYWNfb3AgOiBiaW5hcnlfb3BfYmFzZTxTY2FsYXIsU2NhbGFyPgoreworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfaWdhbW1hY19vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIHgpIGNvbnN0IHsKKyAgICB1c2luZyBudW1leHQ6OmlnYW1tYWM7IHJldHVybiBpZ2FtbWFjKGEsIHgpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIHgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBpZ2FtbWFjKGEsIHgpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9pZ2FtbWFjX29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIC8vIEd1ZXNzdGltYXRlCisgICAgQ29zdCA9IDIwICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKyAxMCAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzSUdhbW1hYworICB9OworfTsKKworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgaW5jb21wbGV0ZSBiZXRhIGludGVncmFsIGJldGFpbmMoYSwgYiwgeCkKKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2JldGFpbmNfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYmV0YWluY19vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgY29uc3QgeworICAgIHVzaW5nIG51bWV4dDo6YmV0YWluYzsgcmV0dXJuIGJldGFpbmMoeCwgYSwgYik7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIHgsIGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwYmV0YWluYyh4LCBhLCBiKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfYmV0YWluY19vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICAvLyBHdWVzc3RpbWF0ZQorICAgIENvc3QgPSA0MDAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDQwMCAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQmV0YUluYworICB9OworfTsKKworCisvKiogXGludGVybmFsCisgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBuYXR1cmFsIGxvZyBvZiB0aGUgYWJzb2x1dGUKKyAqIHZhbHVlIG9mIEdhbW1hIG9mIGEgc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBDd2lzZTo6bGdhbW1hKCkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2xnYW1tYV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9sZ2FtbWFfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgdXNpbmcgbnVtZXh0OjpsZ2FtbWE7IHJldHVybiBsZ2FtbWEoYSk7CisgIH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBsZ2FtbWEoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2xnYW1tYV9vcDxTY2FsYXI+ID4KK3sKKyAgZW51bSB7CisgICAgLy8gR3Vlc3N0aW1hdGUKKyAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0xHYW1tYQorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSBwc2ksIHRoZSBkZXJpdmF0aXZlIG9mIGxnYW1tYSBvZiBhIHNjYWxhci4KKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpkaWdhbW1hKCkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2RpZ2FtbWFfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfZGlnYW1tYV9vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICB1c2luZyBudW1leHQ6OmRpZ2FtbWE7IHJldHVybiBkaWdhbW1hKGEpOworICB9CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwZGlnYW1tYShhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfZGlnYW1tYV9vcDxTY2FsYXI+ID4KK3sKKyAgZW51bSB7CisgICAgLy8gR3Vlc3N0aW1hdGUKKyAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0RpR2FtbWEKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIFJpZW1hbm4gWmV0YSBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzLgorICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OnpldGEoKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfemV0YV9vcCB7CisgICAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3pldGFfb3ApCisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgcSkgY29uc3QgeworICAgICAgICB1c2luZyBudW1leHQ6OnpldGE7IHJldHVybiB6ZXRhKHgsIHEpOworICAgIH0KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIHgsIGNvbnN0IFBhY2tldCYgcSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnB6ZXRhKHgsIHEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl96ZXRhX29wPFNjYWxhcj4gPgoreworICAgIGVudW0geworICAgICAgICAvLyBHdWVzc3RpbWF0ZQorICAgICAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICAgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNaZXRhCisgICAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHBvbHlnYW1tYSBmdW5jdGlvbi4KKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpwb2x5Z2FtbWEoKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfcG9seWdhbW1hX29wIHsKKyAgICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfcG9seWdhbW1hX29wKQorICAgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBuLCBjb25zdCBTY2FsYXImIHgpIGNvbnN0IHsKKyAgICAgICAgdXNpbmcgbnVtZXh0Ojpwb2x5Z2FtbWE7IHJldHVybiBwb2x5Z2FtbWEobiwgeCk7CisgICAgfQorICAgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgbiwgY29uc3QgUGFja2V0JiB4KSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cHBvbHlnYW1tYShuLCB4KTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcG9seWdhbW1hX29wPFNjYWxhcj4gPgoreworICAgIGVudW0geworICAgICAgICAvLyBHdWVzc3RpbWF0ZQorICAgICAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICAgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNQb2x5Z2FtbWEKKyAgICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgR2F1c3MgZXJyb3IgZnVuY3Rpb24gb2YgYQorICogc2NhbGFyCisgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBDd2lzZTo6ZXJmKCkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2VyZl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9lcmZfb3ApCisgIEVJR0VOX0RFVklDRV9GVU5DIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7CisgICAgdXNpbmcgbnVtZXh0OjplcmY7IHJldHVybiBlcmYoYSk7CisgIH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBlcmYoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2VyZl9vcDxTY2FsYXI+ID4KK3sKKyAgZW51bSB7CisgICAgLy8gR3Vlc3N0aW1hdGUKKyAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZgorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgQ29tcGxlbWVudGFyeSBFcnJvciBGdW5jdGlvbgorICogb2YgYSBzY2FsYXIKKyAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjplcmZjKCkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2VyZmNfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfZXJmY19vcCkKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsKKyAgICB1c2luZyBudW1leHQ6OmVyZmM7IHJldHVybiBlcmZjKGEpOworICB9CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwZXJmYyhhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfZXJmY19vcDxTY2FsYXI+ID4KK3sKKyAgZW51bSB7CisgICAgLy8gR3Vlc3N0aW1hdGUKKyAgICBDb3N0ID0gMTAgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZmMKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQRUNJQUxGVU5DVElPTlNfRlVOQ1RPUlNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwZWNpYWxGdW5jdGlvbnMvU3BlY2lhbEZ1bmN0aW9uc0hhbGYuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNIYWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzYmNkYQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNIYWxmLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BFQ0lBTEZVTkNUSU9OU19IQUxGX0gKKyNkZWZpbmUgRUlHRU5fU1BFQ0lBTEZVTkNUSU9OU19IQUxGX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBudW1leHQgeworCisjaWYgRUlHRU5fSEFTX0M5OV9NQVRICit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgRWlnZW46OmhhbGYgbGdhbW1hKGNvbnN0IEVpZ2VuOjpoYWxmJiBhKSB7CisgIHJldHVybiBFaWdlbjo6aGFsZihFaWdlbjo6bnVtZXh0OjpsZ2FtbWEoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgRWlnZW46OmhhbGYgZGlnYW1tYShjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworICByZXR1cm4gRWlnZW46OmhhbGYoRWlnZW46Om51bWV4dDo6ZGlnYW1tYShzdGF0aWNfY2FzdDxmbG9hdD4oYSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiB6ZXRhKGNvbnN0IEVpZ2VuOjpoYWxmJiB4LCBjb25zdCBFaWdlbjo6aGFsZiYgcSkgeworICByZXR1cm4gRWlnZW46OmhhbGYoRWlnZW46Om51bWV4dDo6emV0YShzdGF0aWNfY2FzdDxmbG9hdD4oeCksIHN0YXRpY19jYXN0PGZsb2F0PihxKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEVpZ2VuOjpoYWxmIHBvbHlnYW1tYShjb25zdCBFaWdlbjo6aGFsZiYgbiwgY29uc3QgRWlnZW46OmhhbGYmIHgpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKEVpZ2VuOjpudW1leHQ6OnBvbHlnYW1tYShzdGF0aWNfY2FzdDxmbG9hdD4obiksIHN0YXRpY19jYXN0PGZsb2F0Pih4KSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEVpZ2VuOjpoYWxmIGVyZihjb25zdCBFaWdlbjo6aGFsZiYgYSkgeworICByZXR1cm4gRWlnZW46OmhhbGYoRWlnZW46Om51bWV4dDo6ZXJmKHN0YXRpY19jYXN0PGZsb2F0PihhKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIEVpZ2VuOjpoYWxmIGVyZmMoY29uc3QgRWlnZW46OmhhbGYmIGEpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKEVpZ2VuOjpudW1leHQ6OmVyZmMoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgRWlnZW46OmhhbGYgaWdhbW1hKGNvbnN0IEVpZ2VuOjpoYWxmJiBhLCBjb25zdCBFaWdlbjo6aGFsZiYgeCkgeworICByZXR1cm4gRWlnZW46OmhhbGYoRWlnZW46Om51bWV4dDo6aWdhbW1hKHN0YXRpY19jYXN0PGZsb2F0PihhKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgRWlnZW46OmhhbGYgaWdhbW1hYyhjb25zdCBFaWdlbjo6aGFsZiYgYSwgY29uc3QgRWlnZW46OmhhbGYmIHgpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKEVpZ2VuOjpudW1leHQ6OmlnYW1tYWMoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpLCBzdGF0aWNfY2FzdDxmbG9hdD4oeCkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBFaWdlbjo6aGFsZiBiZXRhaW5jKGNvbnN0IEVpZ2VuOjpoYWxmJiBhLCBjb25zdCBFaWdlbjo6aGFsZiYgYiwgY29uc3QgRWlnZW46OmhhbGYmIHgpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKEVpZ2VuOjpudW1leHQ6OmJldGFpbmMoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0Pih4KSkpOworfQorI2VuZGlmCisKK30gIC8vIGVuZCBuYW1lc3BhY2UgbnVtZXh0Cit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAgLy8gRUlHRU5fU1BFQ0lBTEZVTkNUSU9OU19IQUxGX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNJbXBsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjRkNzEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zSW1wbC5oCkBAIC0wLDAgKzEsMTU2NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgRXVnZW5lIEJyZXZkbyA8ZWJyZXZkb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQRUNJQUxfRlVOQ1RJT05TX0gKKyNkZWZpbmUgRUlHRU5fU1BFQ0lBTF9GVU5DVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gIFBhcnRzIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gdGhlIENlcGhlcyBNYXRoIExpYnJhcnkuCisvLworLy8gIENlcGhlcyBNYXRoIExpYnJhcnkgUmVsZWFzZSAyLjg6ICBKdW5lLCAyMDAwCisvLyAgQ29weXJpZ2h0IDE5ODQsIDE5ODcsIDE5OTIsIDIwMDAgYnkgU3RlcGhlbiBMLiBNb3NoaWVyCisvLworLy8gIFBlcm1pc3Npb24gaGFzIGJlZW4ga2luZGx5IHByb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBhdXRob3IKKy8vICB0byBpbmNvcnBvcmF0ZSB0aGUgQ2VwaGVzIHNvZnR3YXJlIGludG8gdGhlIEVpZ2VuIGNvZGViYXNlOgorLy8KKy8vICAgIEZyb206IFN0ZXBoZW4gTW9zaGllcgorLy8gICAgVG86IEV1Z2VuZSBCcmV2ZG8KKy8vICAgIFN1YmplY3Q6IFJlOiBQZXJtaXNzaW9uIHRvIHdyYXAgc2V2ZXJhbCBjZXBoZXMgZnVuY3Rpb25zIGluIEVpZ2VuCisvLworLy8gICAgSGVsbG8gRXVnZW5lLAorLy8KKy8vICAgIFRoYW5rIHlvdSBmb3Igd3JpdGluZy4KKy8vCisvLyAgICBJZiB5b3VyIGxpY2Vuc2luZyBpcyBzaW1pbGFyIHRvIEJTRCwgdGhlIGZvcm1hbCB3YXkgdGhhdCBoYXMgYmVlbgorLy8gICAgaGFuZGxlZCBpcyBzaW1wbHkgdG8gYWRkIGEgc3RhdGVtZW50IHRvIHRoZSBlZmZlY3QgdGhhdCB5b3UgYXJlIGluY29ycG9yYXRpbmcKKy8vICAgIHRoZSBDZXBoZXMgc29mdHdhcmUgYnkgcGVybWlzc2lvbiBvZiB0aGUgYXV0aG9yLgorLy8KKy8vICAgIEdvb2QgbHVjayB3aXRoIHlvdXIgcHJvamVjdCwKKy8vICAgIFN0ZXZlCisKK25hbWVzcGFjZSBjZXBoZXMgeworCisvKiBwb2xldmwgKG1vZGlmaWVkIGZvciBFaWdlbikKKyAqCisgKiAgICAgIEV2YWx1YXRlIHBvbHlub21pYWwKKyAqCisgKgorICoKKyAqIFNZTk9QU0lTOgorICoKKyAqIGludCBOOworICogU2NhbGFyIHgsIHksIGNvZWZbTisxXTsKKyAqCisgKiB5ID0gcG9sZXZsPGRlY2x0eXBlKHgpLCBOPiggeCwgY29lZik7CisgKgorICoKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCisgKiBFdmFsdWF0ZXMgcG9seW5vbWlhbCBvZiBkZWdyZWUgTjoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgTgorICogeSAgPSAgQyAgKyBDIHggKyBDIHggICsuLi4rIEMgeAorICogICAgICAgIDAgICAgMSAgICAgMiAgICAgICAgICBOCisgKgorICogQ29lZmZpY2llbnRzIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSBvcmRlcjoKKyAqCisgKiBjb2VmWzBdID0gQyAgLCAuLi4sIGNvZWZbTl0gPSBDICAuCisgKiAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgMAorICoKKyAqICBUaGUgZnVuY3Rpb24gcDFldmwoKSBhc3N1bWVzIHRoYXQgY29lZltOXSA9IDEuMCBhbmQgaXMKKyAqIG9taXR0ZWQgZnJvbSB0aGUgYXJyYXkuICBJdHMgY2FsbGluZyBhcmd1bWVudHMgYXJlCisgKiBvdGhlcndpc2UgdGhlIHNhbWUgYXMgcG9sZXZsKCkuCisgKgorICoKKyAqIFRoZSBFaWdlbiBpbXBsZW1lbnRhdGlvbiBpcyB0ZW1wbGF0aXplZC4gIEZvciBiZXN0IHNwZWVkLCBzdG9yZQorICogY29lZiBhcyBhIGNvbnN0IGFycmF5IChjb25zdGV4cHIpLCBlLmcuCisgKgorICogY29uc3QgZG91YmxlIGNvZWZbXSA9IHsxLjAsIDIuMCwgMy4wLCAuLi59OworICoKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IE4+CitzdHJ1Y3QgcG9sZXZsIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXIgeCwgY29uc3QgU2NhbGFyIGNvZWZbXSkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKE4gPiAwKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICAgIHJldHVybiBwb2xldmw8U2NhbGFyLCBOIC0gMT46OnJ1bih4LCBjb2VmKSAqIHggKyBjb2VmW05dOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHBvbGV2bDxTY2FsYXIsIDA+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXIsIGNvbnN0IFNjYWxhciBjb2VmW10pIHsKKyAgICByZXR1cm4gY29lZlswXTsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBjZXBoZXMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGxnYW1tYSwgcmVxdWlyZXMgQysrMTEvQzk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBsZ2FtbWFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oY29uc3QgU2NhbGFyKSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBTY2FsYXI+Ojp2YWx1ZSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBsZ2FtbWFfcmV0dmFsIHsKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKKyNpZiBFSUdFTl9IQVNfQzk5X01BVEgKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgbGdhbW1hX2ltcGw8ZmxvYXQ+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcnVuKGZsb2F0IHgpIHsKKyNpZiAhZGVmaW5lZChfX0NVREFfQVJDSF9fKSAmJiAoZGVmaW5lZChfQlNEX1NPVVJDRSkgfHwgZGVmaW5lZChfU1ZJRF9TT1VSQ0UpKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisgICAgaW50IHNpZ25nYW07CisgICAgcmV0dXJuIDo6bGdhbW1hZl9yKHgsICZzaWduZ2FtKTsKKyNlbHNlCisgICAgcmV0dXJuIDo6bGdhbW1hZih4KTsKKyNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGxnYW1tYV9pbXBsPGRvdWJsZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcnVuKGRvdWJsZSB4KSB7CisjaWYgIWRlZmluZWQoX19DVURBX0FSQ0hfXykgJiYgKGRlZmluZWQoX0JTRF9TT1VSQ0UpIHx8IGRlZmluZWQoX1NWSURfU09VUkNFKSkgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorICAgIGludCBzaWduZ2FtOworICAgIHJldHVybiA6OmxnYW1tYV9yKHgsICZzaWduZ2FtKTsKKyNlbHNlCisgICAgcmV0dXJuIDo6bGdhbW1hKHgpOworI2VuZGlmCisgIH0KK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGRpZ2FtbWEgKHBzaSksIGJhc2VkIG9uIENlcGhlcyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBkaWdhbW1hX3JldHZhbCB7CisgIHR5cGVkZWYgU2NhbGFyIHR5cGU7Cit9OworCisvKgorICoKKyAqIFBvbHlub21pYWwgZXZhbHVhdGlvbiBoZWxwZXIgZm9yIHRoZSBQc2kgKGRpZ2FtbWEpIGZ1bmN0aW9uLgorICoKKyAqIGRpZ2FtbWFfaW1wbF9tYXliZV9wb2x5OjpydW4ocykgZXZhbHVhdGVzIHRoZSBhc3ltcHRvdGljIFBzaSBleHBhbnNpb24gZm9yCisgKiBpbnB1dCBTY2FsYXIgcywgYXNzdW1pbmcgcyBpcyBhYm92ZSAxMC4wLgorICoKKyAqIElmIHMgaXMgYWJvdmUgYSBjZXJ0YWluIHRocmVzaG9sZCBmb3IgdGhlIGdpdmVuIFNjYWxhciB0eXBlLCB6ZXJvCisgKiBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSB0aGUgcG9seW5vbWlhbCBpcyBldmFsdWF0ZWQgd2l0aCBlbm91Z2gKKyAqIGNvZWZmaWNpZW50cyBmb3IgcmVzdWx0cyBtYXRjaGluZyBTY2FsYXIgbWFjaGluZSBwcmVjaXNpb24uCisgKgorICoKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBkaWdhbW1hX2ltcGxfbWF5YmVfcG9seSB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oY29uc3QgU2NhbGFyKSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBTY2FsYXI+Ojp2YWx1ZSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRpZ2FtbWFfaW1wbF9tYXliZV9wb2x5PGZsb2F0PiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHJ1bihjb25zdCBmbG9hdCBzKSB7CisgICAgY29uc3QgZmxvYXQgQVtdID0geworICAgICAgLTQuMTY2NjY2NjY2NjY2NjY2NjY2NjdFLTNmLAorICAgICAgMy45NjgyNTM5NjgyNTM5NjgyNTM5N0UtM2YsCisgICAgICAtOC4zMzMzMzMzMzMzMzMzMzMzMzMzM0UtM2YsCisgICAgICA4LjMzMzMzMzMzMzMzMzMzMzMzMzMzRS0yZgorICAgIH07CisKKyAgICBmbG9hdCB6OworICAgIGlmIChzIDwgMS4wZThmKSB7CisgICAgICB6ID0gMS4wZiAvIChzICogcyk7CisgICAgICByZXR1cm4geiAqIGNlcGhlczo6cG9sZXZsPGZsb2F0LCAzPjo6cnVuKHosIEEpOworICAgIH0gZWxzZSByZXR1cm4gMC4wZjsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBkaWdhbW1hX2ltcGxfbWF5YmVfcG9seTxkb3VibGU+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHJ1bihjb25zdCBkb3VibGUgcykgeworICAgIGNvbnN0IGRvdWJsZSBBW10gPSB7CisgICAgICA4LjMzMzMzMzMzMzMzMzMzMzMzMzMzRS0yLAorICAgICAgLTIuMTA5Mjc5NjA5Mjc5NjA5Mjc5NjFFLTIsCisgICAgICA3LjU3NTc1NzU3NTc1NzU3NTc1NzU4RS0zLAorICAgICAgLTQuMTY2NjY2NjY2NjY2NjY2NjY2NjdFLTMsCisgICAgICAzLjk2ODI1Mzk2ODI1Mzk2ODI1Mzk3RS0zLAorICAgICAgLTguMzMzMzMzMzMzMzMzMzMzMzMzMzNFLTMsCisgICAgICA4LjMzMzMzMzMzMzMzMzMzMzMzMzMzRS0yCisgICAgfTsKKworICAgIGRvdWJsZSB6OworICAgIGlmIChzIDwgMS4wZTE3KSB7CisgICAgICB6ID0gMS4wIC8gKHMgKiBzKTsKKyAgICAgIHJldHVybiB6ICogY2VwaGVzOjpwb2xldmw8ZG91YmxlLCA2Pjo6cnVuKHosIEEpOworICAgIH0KKyAgICBlbHNlIHJldHVybiAwLjA7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZGlnYW1tYV9pbXBsIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIFNjYWxhciBydW4oU2NhbGFyIHgpIHsKKyAgICAvKgorICAgICAqCisgICAgICogICAgIFBzaSAoZGlnYW1tYSkgZnVuY3Rpb24gKG1vZGlmaWVkIGZvciBFaWdlbikKKyAgICAgKgorICAgICAqCisgICAgICogU1lOT1BTSVM6CisgICAgICoKKyAgICAgKiBkb3VibGUgeCwgeSwgcHNpKCk7CisgICAgICoKKyAgICAgKiB5ID0gcHNpKCB4ICk7CisgICAgICoKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOgorICAgICAqCisgICAgICogICAgICAgICAgICAgIGQgICAgICAtCisgICAgICogICBwc2koeCkgID0gIC0tIGxuIHwgKHgpCisgICAgICogICAgICAgICAgICAgIGR4CisgICAgICoKKyAgICAgKiBpcyB0aGUgbG9nYXJpdGhtaWMgZGVyaXZhdGl2ZSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICogRm9yIGludGVnZXIgeCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICBuLTEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgLQorICAgICAqIHBzaShuKSA9IC1FVUwgICsgICA+ICAxL2suCisgICAgICogICAgICAgICAgICAgICAgICAgIC0KKyAgICAgKiAgICAgICAgICAgICAgICAgICBrPTEKKyAgICAgKgorICAgICAqIElmIHggaXMgbmVnYXRpdmUsIGl0IGlzIHRyYW5zZm9ybWVkIHRvIGEgcG9zaXRpdmUgYXJndW1lbnQgYnkgdGhlCisgICAgICogcmVmbGVjdGlvbiBmb3JtdWxhICBwc2koMS14KSA9IHBzaSh4KSArIHBpIGNvdChwaSB4KS4KKyAgICAgKiBGb3IgZ2VuZXJhbCBwb3NpdGl2ZSB4LCB0aGUgYXJndW1lbnQgaXMgbWFkZSBncmVhdGVyIHRoYW4gMTAKKyAgICAgKiB1c2luZyB0aGUgcmVjdXJyZW5jZSAgcHNpKHgrMSkgPSBwc2koeCkgKyAxL3guCisgICAgICogVGhlbiB0aGUgZm9sbG93aW5nIGFzeW1wdG90aWMgZXhwYW5zaW9uIGlzIGFwcGxpZWQ6CisgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZi4gICBCCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgIDJrCisgICAgICogcHNpKHgpID0gbG9nKHgpIC0gMS8yeCAtICAgPiAgIC0tLS0tLS0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAyaworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaz0xICAgMmsgeAorICAgICAqCisgICAgICogd2hlcmUgdGhlIEIyayBhcmUgQmVybm91bGxpIG51bWJlcnMuCisgICAgICoKKyAgICAgKiBBQ0NVUkFDWSAoZmxvYXQpOgorICAgICAqICAgIFJlbGF0aXZlIGVycm9yIChleGNlcHQgYWJzb2x1dGUgd2hlbiB8cHNpfCA8IDEpOgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqICAgIElFRUUgICAgICAwLDMwICAgICAgICAzMDAwMCAgICAgICAxLjNlLTE1ICAgICAxLjRlLTE2CisgICAgICogICAgSUVFRSAgICAgIC0zMCwwICAgICAgIDQwMDAwICAgICAgIDEuNWUtMTUgICAgIDIuMmUtMTYKKyAgICAgKgorICAgICAqIEFDQ1VSQUNZIChkb3VibGUpOgorICAgICAqICAgIEFic29sdXRlIGVycm9yLCAgcmVsYXRpdmUgd2hlbiB8cHNpfCA+IDEgOgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqICAgIElFRUUgICAgICAtMzMsMCAgICAgICAgMzAwMDAgICAgICA4LjJlLTcgICAgICAxLjJlLTcKKyAgICAgKiAgICBJRUVFICAgICAgMCwzMyAgICAgICAgMTAwMDAwICAgICAgNy4zZS03ICAgICAgNy43ZS04CisgICAgICoKKyAgICAgKiBFUlJPUiBNRVNTQUdFUzoKKyAgICAgKiAgICAgbWVzc2FnZSAgICAgICAgIGNvbmRpdGlvbiAgICAgIHZhbHVlIHJldHVybmVkCisgICAgICogcHNpIHNpbmd1bGFyaXR5ICAgIHggaW50ZWdlciA8PTAgICAgICBJTkZJTklUWQorICAgICAqLworCisgICAgU2NhbGFyIHAsIHEsIG56LCBzLCB3LCB5OworICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKKworICAgIGNvbnN0IFNjYWxhciBtYXhudW0gPSBOdW1UcmFpdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgICBjb25zdCBTY2FsYXIgbV9waSA9IFNjYWxhcihFSUdFTl9QSSk7CisKKyAgICBjb25zdCBTY2FsYXIgemVybyA9IFNjYWxhcigwKTsKKyAgICBjb25zdCBTY2FsYXIgb25lID0gU2NhbGFyKDEpOworICAgIGNvbnN0IFNjYWxhciBoYWxmID0gU2NhbGFyKDAuNSk7CisgICAgbnogPSB6ZXJvOworCisgICAgaWYgKHggPD0gemVybykgeworICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgcSA9IHg7CisgICAgICBwID0gbnVtZXh0OjpmbG9vcihxKTsKKyAgICAgIGlmIChwID09IHEpIHsKKyAgICAgICAgcmV0dXJuIG1heG51bTsKKyAgICAgIH0KKyAgICAgIC8qIFJlbW92ZSB0aGUgemVyb3Mgb2YgdGFuKG1fcGkgeCkKKyAgICAgICAqIGJ5IHN1YnRyYWN0aW5nIHRoZSBuZWFyZXN0IGludGVnZXIgZnJvbSB4CisgICAgICAgKi8KKyAgICAgIG56ID0gcSAtIHA7CisgICAgICBpZiAobnogIT0gaGFsZikgeworICAgICAgICBpZiAobnogPiBoYWxmKSB7CisgICAgICAgICAgcCArPSBvbmU7CisgICAgICAgICAgbnogPSBxIC0gcDsKKyAgICAgICAgfQorICAgICAgICBueiA9IG1fcGkgLyBudW1leHQ6OnRhbihtX3BpICogbnopOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIG56ID0gemVybzsKKyAgICAgIH0KKyAgICAgIHggPSBvbmUgLSB4OworICAgIH0KKworICAgIC8qIHVzZSB0aGUgcmVjdXJyZW5jZSBwc2koeCsxKSA9IHBzaSh4KSArIDEveC4gKi8KKyAgICBzID0geDsKKyAgICB3ID0gemVybzsKKyAgICB3aGlsZSAocyA8IFNjYWxhcigxMCkpIHsKKyAgICAgIHcgKz0gb25lIC8gczsKKyAgICAgIHMgKz0gb25lOworICAgIH0KKworICAgIHkgPSBkaWdhbW1hX2ltcGxfbWF5YmVfcG9seTxTY2FsYXI+OjpydW4ocyk7CisKKyAgICB5ID0gbnVtZXh0Ojpsb2cocykgLSAoaGFsZiAvIHMpIC0geSAtIHc7CisKKyAgICByZXR1cm4gKG5lZ2F0aXZlKSA/IHkgLSBueiA6IHk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBlcmYsIHJlcXVpcmVzIEMrKzExL0M5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZXJmX2ltcGwgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhcikgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgU2NhbGFyPjo6dmFsdWUgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19UWVBFX0lTX05PVF9TVVBQT1JURUQpOworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZXJmX3JldHZhbCB7CisgIHR5cGVkZWYgU2NhbGFyIHR5cGU7Cit9OworCisjaWYgRUlHRU5fSEFTX0M5OV9NQVRICit0ZW1wbGF0ZSA8Pgorc3RydWN0IGVyZl9pbXBsPGZsb2F0PiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHJ1bihmbG9hdCB4KSB7IHJldHVybiA6OmVyZmYoeCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZXJmX2ltcGw8ZG91YmxlPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBydW4oZG91YmxlIHgpIHsgcmV0dXJuIDo6ZXJmKHgpOyB9Cit9OworI2VuZGlmICAvLyBFSUdFTl9IQVNfQzk5X01BVEgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBlcmZjLCByZXF1aXJlcyBDKysxMS9DOTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBlcmZjX2ltcGwgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhcikgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgU2NhbGFyPjo6dmFsdWUgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19UWVBFX0lTX05PVF9TVVBQT1JURUQpOworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZXJmY19yZXR2YWwgeworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKworI2lmIEVJR0VOX0hBU19DOTlfTUFUSAordGVtcGxhdGUgPD4KK3N0cnVjdCBlcmZjX2ltcGw8ZmxvYXQ+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcnVuKGNvbnN0IGZsb2F0IHgpIHsgcmV0dXJuIDo6ZXJmY2YoeCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZXJmY19pbXBsPGRvdWJsZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcnVuKGNvbnN0IGRvdWJsZSB4KSB7IHJldHVybiA6OmVyZmMoeCk7IH0KK307CisjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGlnYW1tYWMgKGNvbXBsZW1lbnRlZCBpbmNvbXBsZXRlIGdhbW1hIGludGVncmFsKSwgYmFzZWQgb24gQ2VwaGVzIGJ1dCByZXF1aXJlcyBDKysxMS9DOTkgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGlnYW1tYWNfcmV0dmFsIHsKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKKy8vIE5PVEU6IGNlcGhlc19oZWxwZXIgaXMgYWxzbyB1c2VkIHRvIGltcGxlbWVudCB6ZXRhCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGNlcGhlc19oZWxwZXIgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgbWFjaGVwKCkgeyBhc3NlcnQoZmFsc2UgJiYgIm1hY2hlcCBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHR5cGUiKTsgcmV0dXJuIDAuMDsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgYmlnKCkgeyBhc3NlcnQoZmFsc2UgJiYgImJpZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHR5cGUiKTsgcmV0dXJuIDAuMDsgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgYmlnaW52KCkgeyBhc3NlcnQoZmFsc2UgJiYgImJpZ2ludiBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHR5cGUiKTsgcmV0dXJuIDAuMDsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjZXBoZXNfaGVscGVyPGZsb2F0PiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IG1hY2hlcCgpIHsKKyAgICByZXR1cm4gTnVtVHJhaXRzPGZsb2F0Pjo6ZXBzaWxvbigpIC8gMjsgIC8vIDEuMCAtIG1hY2hlcCA9PSAxLjAKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBiaWcoKSB7CisgICAgLy8gdXNlIGVwc25lZyAoMS4wIC0gZXBzbmVnID09IDEuMCkKKyAgICByZXR1cm4gMS4wZiAvIChOdW1UcmFpdHM8ZmxvYXQ+OjplcHNpbG9uKCkgLyAyKTsKKyAgfQorICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBiaWdpbnYoKSB7CisgICAgLy8gZXBzbmVnCisgICAgcmV0dXJuIG1hY2hlcCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGNlcGhlc19oZWxwZXI8ZG91YmxlPiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBtYWNoZXAoKSB7CisgICAgcmV0dXJuIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkgLyAyOyAgLy8gMS4wIC0gbWFjaGVwID09IDEuMAorICB9CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBiaWcoKSB7CisgICAgcmV0dXJuIDEuMCAvIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIGJpZ2ludigpIHsKKyAgICAvLyBpbnZlcnNlIG9mIGVwcworICAgIHJldHVybiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICB9Cit9OworCisjaWYgIUVJR0VOX0hBU19DOTlfTUFUSAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGlnYW1tYWNfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBTY2FsYXIgcnVuKFNjYWxhciBhLCBTY2FsYXIgeCkgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgU2NhbGFyPjo6dmFsdWUgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19UWVBFX0lTX05PVF9TVVBQT1JURUQpOworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKKyNlbHNlCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBpZ2FtbWFfaW1wbDsgIC8vIHByZWRlY2xhcmUgaWdhbW1hX2ltcGwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpZ2FtbWFjX2ltcGwgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgU2NhbGFyIHJ1bihTY2FsYXIgYSwgU2NhbGFyIHgpIHsKKyAgICAvKiAgaWdhbWMoKQorICAgICAqCisgICAgICoJSW5jb21wbGV0ZSBnYW1tYSBpbnRlZ3JhbCAobW9kaWZpZWQgZm9yIEVpZ2VuKQorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIFNZTk9QU0lTOgorICAgICAqCisgICAgICogZG91YmxlIGEsIHgsIHksIGlnYW1jKCk7CisgICAgICoKKyAgICAgKiB5ID0gaWdhbWMoIGEsIHggKTsKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOgorICAgICAqCisgICAgICogVGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKgorICAgICAqCisgICAgICogIGlnYW1jKGEseCkgICA9ICAgMSAtIGlnYW0oYSx4KQorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgICAqICAgICAgICAgICAgICAgICAgICAgMSAgICAgICB8IHwgIC10ICBhLTEKKyAgICAgKiAgICAgICAgICAgICAgID0gICAtLS0tLSAgICAgfCAgIGUgICB0ICAgZHQuCisgICAgICogICAgICAgICAgICAgICAgICAgIC0gICAgICB8IHwKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8IChhKSAgICAtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAgICAgKgorICAgICAqCisgICAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBib3RoIGFyZ3VtZW50cyBtdXN0IGJlIHBvc2l0aXZlLgorICAgICAqIFRoZSBpbnRlZ3JhbCBpcyBldmFsdWF0ZWQgYnkgZWl0aGVyIGEgcG93ZXIgc2VyaWVzIG9yCisgICAgICogY29udGludWVkIGZyYWN0aW9uIGV4cGFuc2lvbiwgZGVwZW5kaW5nIG9uIHRoZSByZWxhdGl2ZQorICAgICAqIHZhbHVlcyBvZiBhIGFuZCB4LgorICAgICAqCisgICAgICogQUNDVVJBQ1kgKGZsb2F0KToKKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aXZlIGVycm9yOgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqICAgIElFRUUgICAgICAwLDMwICAgICAgICAzMDAwMCAgICAgICA3LjhlLTYgICAgICA1LjllLTcKKyAgICAgKgorICAgICAqCisgICAgICogQUNDVVJBQ1kgKGRvdWJsZSk6CisgICAgICoKKyAgICAgKiBUZXN0ZWQgYXQgcmFuZG9tIGEsIHguCisgICAgICogICAgICAgICAgICAgICAgYSAgICAgICAgIHggICAgICAgICAgICAgICAgICAgICAgUmVsYXRpdmUgZXJyb3I6CisgICAgICogYXJpdGhtZXRpYyAgIGRvbWFpbiAgIGRvbWFpbiAgICAgIyB0cmlhbHMgICAgICBwZWFrICAgICAgICAgcm1zCisgICAgICogICAgSUVFRSAgICAgMC41LDEwMCAgIDAsMTAwICAgICAgMjAwMDAwICAgICAgIDEuOWUtMTQgICAgIDEuN2UtMTUKKyAgICAgKiAgICBJRUVFICAgICAwLjAxLDAuNSAgMCwxMDAgICAgICAyMDAwMDAgICAgICAgMS40ZS0xMyAgICAgMS42ZS0xNQorICAgICAqCisgICAgICovCisgICAgLyoKKyAgICAgIENlcGhlcyBNYXRoIExpYnJhcnkgUmVsZWFzZSAyLjI6IEp1bmUsIDE5OTIKKyAgICAgIENvcHlyaWdodCAxOTg1LCAxOTg3LCAxOTkyIGJ5IFN0ZXBoZW4gTC4gTW9zaGllcgorICAgICAgRGlyZWN0IGlucXVpcmllcyB0byAzMCBGcm9zdCBTdHJlZXQsIENhbWJyaWRnZSwgTUEgMDIxNDAKKyAgICAqLworICAgIGNvbnN0IFNjYWxhciB6ZXJvID0gMDsKKyAgICBjb25zdCBTY2FsYXIgb25lID0gMTsKKyAgICBjb25zdCBTY2FsYXIgbmFuID0gTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworCisgICAgaWYgKCh4IDwgemVybykgfHwgKGEgPD0gemVybykpIHsKKyAgICAgIC8vIGRvbWFpbiBlcnJvcgorICAgICAgcmV0dXJuIG5hbjsKKyAgICB9CisKKyAgICBpZiAoKHggPCBvbmUpIHx8ICh4IDwgYSkpIHsKKyAgICAgIC8qIFRoZSBjaGVja3MgYWJvdmUgZW5zdXJlIHRoYXQgd2UgbWVldCB0aGUgcHJlY29uZGl0aW9ucyBmb3IKKyAgICAgICAqIGlnYW1tYV9pbXBsOjpJbXBsKCksIHNvIGNhbGwgaXQsIHJhdGhlciB0aGFuIGlnYW1tYV9pbXBsOjpSdW4oKS4KKyAgICAgICAqIENhbGxpbmcgUnVuKCkgd291bGQgYWxzbyB3b3JrLCBidXQgaW4gdGhhdCBjYXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlCisgICAgICAgKiBhYmxlIHRvIHByb3ZlIHRoYXQgaWdhbW1hY19pbXBsOjpSdW4gYW5kIGlnYW1tYV9pbXBsOjpSdW4gYXJlIG5vdAorICAgICAgICogbXV0dWFsbHkgcmVjdXJzaXZlLiAgVGhpcyBsZWFkcyB0byB3b3JzZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24KKyAgICAgICAqIHBsYXRmb3JtcyBsaWtlIG52cHR4LCB3aGVyZSByZWN1cnNpb24gaXMgYWxsb3dlZCBvbmx5IGJlZ3J1ZGdpbmdseS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIChvbmUgLSBpZ2FtbWFfaW1wbDxTY2FsYXI+OjpJbXBsKGEsIHgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gSW1wbChhLCB4KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLyogaWdhbW1hX2ltcGwgY2FsbHMgaWdhbW1hY19pbXBsOjpJbXBsLiAqLworICBmcmllbmQgc3RydWN0IGlnYW1tYV9pbXBsPFNjYWxhcj47CisKKyAgLyogQWN0dWFsbHkgY29tcHV0ZXMgaWdhbWMoYSwgeCkuCisgICAqCisgICAqIFByZWNvbmRpdGlvbnM6CisgICAqICAgYSA+IDAKKyAgICogICB4ID49IDEKKyAgICogICB4ID49IGEKKyAgICovCisgIEVJR0VOX0RFVklDRV9GVU5DIHN0YXRpYyBTY2FsYXIgSW1wbChTY2FsYXIgYSwgU2NhbGFyIHgpIHsKKyAgICBjb25zdCBTY2FsYXIgemVybyA9IDA7CisgICAgY29uc3QgU2NhbGFyIG9uZSA9IDE7CisgICAgY29uc3QgU2NhbGFyIHR3byA9IDI7CisgICAgY29uc3QgU2NhbGFyIG1hY2hlcCA9IGNlcGhlc19oZWxwZXI8U2NhbGFyPjo6bWFjaGVwKCk7CisgICAgY29uc3QgU2NhbGFyIG1heGxvZyA9IG51bWV4dDo6bG9nKE51bVRyYWl0czxTY2FsYXI+OjpoaWdoZXN0KCkpOworICAgIGNvbnN0IFNjYWxhciBiaWcgPSBjZXBoZXNfaGVscGVyPFNjYWxhcj46OmJpZygpOworICAgIGNvbnN0IFNjYWxhciBiaWdpbnYgPSBjZXBoZXNfaGVscGVyPFNjYWxhcj46OmJpZ2ludigpOworICAgIGNvbnN0IFNjYWxhciBpbmYgPSBOdW1UcmFpdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKKworICAgIFNjYWxhciBhbnMsIGF4LCBjLCB5YywgciwgdCwgeSwgejsKKyAgICBTY2FsYXIgcGssIHBrbTEsIHBrbTIsIHFrLCBxa20xLCBxa20yOworCisgICAgaWYgKHggPT0gaW5mKSByZXR1cm4gemVybzsgIC8vIHN0ZDo6aXNpbmYgY3Jhc2hlcyBvbiBDVURBCisKKyAgICAvKiBDb21wdXRlICB4KiphICogZXhwKC14KSAvIGdhbW1hKGEpICAqLworICAgIGF4ID0gYSAqIG51bWV4dDo6bG9nKHgpIC0geCAtIGxnYW1tYV9pbXBsPFNjYWxhcj46OnJ1bihhKTsKKyAgICBpZiAoYXggPCAtbWF4bG9nKSB7ICAvLyB1bmRlcmZsb3cKKyAgICAgIHJldHVybiB6ZXJvOworICAgIH0KKyAgICBheCA9IG51bWV4dDo6ZXhwKGF4KTsKKworICAgIC8vIGNvbnRpbnVlZCBmcmFjdGlvbgorICAgIHkgPSBvbmUgLSBhOworICAgIHogPSB4ICsgeSArIG9uZTsKKyAgICBjID0gemVybzsKKyAgICBwa20yID0gb25lOworICAgIHFrbTIgPSB4OworICAgIHBrbTEgPSB4ICsgb25lOworICAgIHFrbTEgPSB6ICogeDsKKyAgICBhbnMgPSBwa20xIC8gcWttMTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBjICs9IG9uZTsKKyAgICAgIHkgKz0gb25lOworICAgICAgeiArPSB0d287CisgICAgICB5YyA9IHkgKiBjOworICAgICAgcGsgPSBwa20xICogeiAtIHBrbTIgKiB5YzsKKyAgICAgIHFrID0gcWttMSAqIHogLSBxa20yICogeWM7CisgICAgICBpZiAocWsgIT0gemVybykgeworICAgICAgICByID0gcGsgLyBxazsKKyAgICAgICAgdCA9IG51bWV4dDo6YWJzKChhbnMgLSByKSAvIHIpOworICAgICAgICBhbnMgPSByOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdCA9IG9uZTsKKyAgICAgIH0KKyAgICAgIHBrbTIgPSBwa20xOworICAgICAgcGttMSA9IHBrOworICAgICAgcWttMiA9IHFrbTE7CisgICAgICBxa20xID0gcWs7CisgICAgICBpZiAobnVtZXh0OjphYnMocGspID4gYmlnKSB7CisgICAgICAgIHBrbTIgKj0gYmlnaW52OworICAgICAgICBwa20xICo9IGJpZ2ludjsKKyAgICAgICAgcWttMiAqPSBiaWdpbnY7CisgICAgICAgIHFrbTEgKj0gYmlnaW52OworICAgICAgfQorICAgICAgaWYgKHQgPD0gbWFjaGVwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoYW5zICogYXgpOworICB9Cit9OworCisjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBpZ2FtbWEgKGluY29tcGxldGUgZ2FtbWEgaW50ZWdyYWwpLCBiYXNlZCBvbiBDZXBoZXMgYnV0IHJlcXVpcmVzIEMrKzExL0M5OSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGlnYW1tYV9yZXR2YWwgeworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKworI2lmICFFSUdFTl9IQVNfQzk5X01BVEgKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpZ2FtbWFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oU2NhbGFyIGEsIFNjYWxhciB4KSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBTY2FsYXI+Ojp2YWx1ZSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKworI2Vsc2UKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpZ2FtbWFfaW1wbCB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBTY2FsYXIgcnVuKFNjYWxhciBhLCBTY2FsYXIgeCkgeworICAgIC8qCWlnYW0oKQorICAgICAqCUluY29tcGxldGUgZ2FtbWEgaW50ZWdyYWwKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBTWU5PUFNJUzoKKyAgICAgKgorICAgICAqIGRvdWJsZSBhLCB4LCB5LCBpZ2FtKCk7CisgICAgICoKKyAgICAgKiB5ID0gaWdhbSggYSwgeCApOworICAgICAqCisgICAgICogREVTQ1JJUFRJT046CisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB4CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgICAqICAgICAgICAgICAgICAgICAgIDEgICAgICAgfCB8ICAtdCAgYS0xCisgICAgICogIGlnYW0oYSx4KSAgPSAgIC0tLS0tICAgICB8ICAgZSAgIHQgICBkdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIC0gICAgICB8IHwKKyAgICAgKiAgICAgICAgICAgICAgICAgfCAoYSkgICAgLQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAqCisgICAgICoKKyAgICAgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIGJvdGggYXJndW1lbnRzIG11c3QgYmUgcG9zaXRpdmUuCisgICAgICogVGhlIGludGVncmFsIGlzIGV2YWx1YXRlZCBieSBlaXRoZXIgYSBwb3dlciBzZXJpZXMgb3IKKyAgICAgKiBjb250aW51ZWQgZnJhY3Rpb24gZXhwYW5zaW9uLCBkZXBlbmRpbmcgb24gdGhlIHJlbGF0aXZlCisgICAgICogdmFsdWVzIG9mIGEgYW5kIHguCisgICAgICoKKyAgICAgKiBBQ0NVUkFDWSAoZG91YmxlKToKKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aXZlIGVycm9yOgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqICAgIElFRUUgICAgICAwLDMwICAgICAgIDIwMDAwMCAgICAgICAzLjZlLTE0ICAgICAyLjllLTE1CisgICAgICogICAgSUVFRSAgICAgIDAsMTAwICAgICAgMzAwMDAwICAgICAgIDkuOWUtMTQgICAgIDEuNWUtMTQKKyAgICAgKgorICAgICAqCisgICAgICogQUNDVVJBQ1kgKGZsb2F0KToKKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aXZlIGVycm9yOgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqICAgIElFRUUgICAgICAwLDMwICAgICAgICAyMDAwMCAgICAgICA3LjhlLTYgICAgICA1LjllLTcKKyAgICAgKgorICAgICAqLworICAgIC8qCisgICAgICBDZXBoZXMgTWF0aCBMaWJyYXJ5IFJlbGVhc2UgMi4yOiBKdW5lLCAxOTkyCisgICAgICBDb3B5cmlnaHQgMTk4NSwgMTk4NywgMTk5MiBieSBTdGVwaGVuIEwuIE1vc2hpZXIKKyAgICAgIERpcmVjdCBpbnF1aXJpZXMgdG8gMzAgRnJvc3QgU3RyZWV0LCBDYW1icmlkZ2UsIE1BIDAyMTQwCisgICAgKi8KKworCisgICAgLyogbGVmdCB0YWlsIG9mIGluY29tcGxldGUgZ2FtbWEgZnVuY3Rpb246CisgICAgICoKKyAgICAgKiAgICAgICAgICBpbmYuICAgICAgaworICAgICAqICAgYSAgLXggICAtICAgICAgIHgKKyAgICAgKiAgeCAgZSAgICAgPiAgIC0tLS0tLS0tLS0KKyAgICAgKiAgICAgICAgICAgLSAgICAgLQorICAgICAqICAgICAgICAgIGs9MCAgIHwgKGEraysxKQorICAgICAqCisgICAgICovCisgICAgY29uc3QgU2NhbGFyIHplcm8gPSAwOworICAgIGNvbnN0IFNjYWxhciBvbmUgPSAxOworICAgIGNvbnN0IFNjYWxhciBuYW4gPSBOdW1UcmFpdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CisKKyAgICBpZiAoeCA9PSB6ZXJvKSByZXR1cm4gemVybzsKKworICAgIGlmICgoeCA8IHplcm8pIHx8IChhIDw9IHplcm8pKSB7ICAvLyBkb21haW4gZXJyb3IKKyAgICAgIHJldHVybiBuYW47CisgICAgfQorCisgICAgaWYgKCh4ID4gb25lKSAmJiAoeCA+IGEpKSB7CisgICAgICAvKiBUaGUgY2hlY2tzIGFib3ZlIGVuc3VyZSB0aGF0IHdlIG1lZXQgdGhlIHByZWNvbmRpdGlvbnMgZm9yCisgICAgICAgKiBpZ2FtbWFjX2ltcGw6OkltcGwoKSwgc28gY2FsbCBpdCwgcmF0aGVyIHRoYW4gaWdhbW1hY19pbXBsOjpSdW4oKS4KKyAgICAgICAqIENhbGxpbmcgUnVuKCkgd291bGQgYWxzbyB3b3JrLCBidXQgaW4gdGhhdCBjYXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlCisgICAgICAgKiBhYmxlIHRvIHByb3ZlIHRoYXQgaWdhbW1hY19pbXBsOjpSdW4gYW5kIGlnYW1tYV9pbXBsOjpSdW4gYXJlIG5vdAorICAgICAgICogbXV0dWFsbHkgcmVjdXJzaXZlLiAgVGhpcyBsZWFkcyB0byB3b3JzZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24KKyAgICAgICAqIHBsYXRmb3JtcyBsaWtlIG52cHR4LCB3aGVyZSByZWN1cnNpb24gaXMgYWxsb3dlZCBvbmx5IGJlZ3J1ZGdpbmdseS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIChvbmUgLSBpZ2FtbWFjX2ltcGw8U2NhbGFyPjo6SW1wbChhLCB4KSk7CisgICAgfQorCisgICAgcmV0dXJuIEltcGwoYSwgeCk7CisgIH0KKworIHByaXZhdGU6CisgIC8qIGlnYW1tYWNfaW1wbCBjYWxscyBpZ2FtbWFfaW1wbDo6SW1wbC4gKi8KKyAgZnJpZW5kIHN0cnVjdCBpZ2FtbWFjX2ltcGw8U2NhbGFyPjsKKworICAvKiBBY3R1YWxseSBjb21wdXRlcyBpZ2FtKGEsIHgpLgorICAgKgorICAgKiBQcmVjb25kaXRpb25zOgorICAgKiAgIHggPiAwCisgICAqICAgYSA+IDAKKyAgICogICAhKHggPiAxICYmIHggPiBhKQorICAgKi8KKyAgRUlHRU5fREVWSUNFX0ZVTkMgc3RhdGljIFNjYWxhciBJbXBsKFNjYWxhciBhLCBTY2FsYXIgeCkgeworICAgIGNvbnN0IFNjYWxhciB6ZXJvID0gMDsKKyAgICBjb25zdCBTY2FsYXIgb25lID0gMTsKKyAgICBjb25zdCBTY2FsYXIgbWFjaGVwID0gY2VwaGVzX2hlbHBlcjxTY2FsYXI+OjptYWNoZXAoKTsKKyAgICBjb25zdCBTY2FsYXIgbWF4bG9nID0gbnVtZXh0Ojpsb2coTnVtVHJhaXRzPFNjYWxhcj46OmhpZ2hlc3QoKSk7CisKKyAgICBTY2FsYXIgYW5zLCBheCwgYywgcjsKKworICAgIC8qIENvbXB1dGUgIHgqKmEgKiBleHAoLXgpIC8gZ2FtbWEoYSkgICovCisgICAgYXggPSBhICogbnVtZXh0Ojpsb2coeCkgLSB4IC0gbGdhbW1hX2ltcGw8U2NhbGFyPjo6cnVuKGEpOworICAgIGlmIChheCA8IC1tYXhsb2cpIHsKKyAgICAgIC8vIHVuZGVyZmxvdworICAgICAgcmV0dXJuIHplcm87CisgICAgfQorICAgIGF4ID0gbnVtZXh0OjpleHAoYXgpOworCisgICAgLyogcG93ZXIgc2VyaWVzICovCisgICAgciA9IGE7CisgICAgYyA9IG9uZTsKKyAgICBhbnMgPSBvbmU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgciArPSBvbmU7CisgICAgICBjICo9IHgvcjsKKyAgICAgIGFucyArPSBjOworICAgICAgaWYgKGMvYW5zIDw9IG1hY2hlcCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGFucyAqIGF4IC8gYSk7CisgIH0KK307CisKKyNlbmRpZiAgLy8gRUlHRU5fSEFTX0M5OV9NQVRICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1wbGVtZW50YXRpb24gb2YgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMsIGJhc2VkIG9uIENlcGhlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgemV0YV9yZXR2YWwgeworICAgIHR5cGVkZWYgU2NhbGFyIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHpldGFfaW1wbF9zZXJpZXMgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhcikgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgU2NhbGFyPjo6dmFsdWUgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhJU19UWVBFX0lTX05PVF9TVVBQT1JURUQpOworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgemV0YV9pbXBsX3NlcmllczxmbG9hdD4geworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBib29sIHJ1bihmbG9hdCYgYSwgZmxvYXQmIGIsIGZsb2F0JiBzLCBjb25zdCBmbG9hdCB4LCBjb25zdCBmbG9hdCBtYWNoZXApIHsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUoaSA8IDkpCisgICAgeworICAgICAgICBpICs9IDE7CisgICAgICAgIGEgKz0gMS4wZjsKKyAgICAgICAgYiA9IG51bWV4dDo6cG93KCBhLCAteCApOworICAgICAgICBzICs9IGI7CisgICAgICAgIGlmKCBudW1leHQ6OmFicyhiL3MpIDwgbWFjaGVwICkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vUmV0dXJuIHdoZXRoZXIgd2UgYXJlIGRvbmUKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgemV0YV9pbXBsX3Nlcmllczxkb3VibGU+IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgYm9vbCBydW4oZG91YmxlJiBhLCBkb3VibGUmIGIsIGRvdWJsZSYgcywgY29uc3QgZG91YmxlIHgsIGNvbnN0IGRvdWJsZSBtYWNoZXApIHsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUoIChpIDwgOSkgfHwgKGEgPD0gOS4wKSApCisgICAgeworICAgICAgICBpICs9IDE7CisgICAgICAgIGEgKz0gMS4wOworICAgICAgICBiID0gbnVtZXh0Ojpwb3coIGEsIC14ICk7CisgICAgICAgIHMgKz0gYjsKKyAgICAgICAgaWYoIG51bWV4dDo6YWJzKGIvcykgPCBtYWNoZXAgKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy9SZXR1cm4gd2hldGhlciB3ZSBhcmUgZG9uZQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCB6ZXRhX2ltcGwgeworICAgIEVJR0VOX0RFVklDRV9GVU5DCisgICAgc3RhdGljIFNjYWxhciBydW4oU2NhbGFyIHgsIFNjYWxhciBxKSB7CisgICAgICAgIC8qCQkJCQkJCXpldGEuYworICAgICAgICAgKgorICAgICAgICAgKglSaWVtYW5uIHpldGEgZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cworICAgICAgICAgKgorICAgICAgICAgKgorICAgICAgICAgKgorICAgICAgICAgKiBTWU5PUFNJUzoKKyAgICAgICAgICoKKyAgICAgICAgICogZG91YmxlIHgsIHEsIHksIHpldGEoKTsKKyAgICAgICAgICoKKyAgICAgICAgICogeSA9IHpldGEoIHgsIHEgKTsKKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogREVTQ1JJUFRJT046CisgICAgICAgICAqCisgICAgICAgICAqCisgICAgICAgICAqCisgICAgICAgICAqICAgICAgICAgICAgICAgICBpbmYuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgLSAgICAgICAgLXgKKyAgICAgICAgICogICB6ZXRhKHgscSkgID0gICA+ICAgKGsrcSkKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAtCisgICAgICAgICAqICAgICAgICAgICAgICAgICBrPTAKKyAgICAgICAgICoKKyAgICAgICAgICogd2hlcmUgeCA+IDEgYW5kIHEgaXMgbm90IGEgbmVnYXRpdmUgaW50ZWdlciBvciB6ZXJvLgorICAgICAgICAgKiBUaGUgRXVsZXItTWFjbGF1cmluIHN1bW1hdGlvbiBmb3JtdWxhIGlzIHVzZWQgdG8gb2J0YWluCisgICAgICAgICAqIHRoZSBleHBhbnNpb24KKyAgICAgICAgICoKKyAgICAgICAgICogICAgICAgICAgICAgICAgbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAtICAgICAgIC14CisgICAgICAgICAqIHpldGEoeCxxKSAgPSAgID4gIChrK3EpCisgICAgICAgICAqICAgICAgICAgICAgICAgIC0KKyAgICAgICAgICogICAgICAgICAgICAgICBrPTEKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICAgICAgIDEteCAgICAgICAgICAgICAgICAgaW5mLiAgQiAgIHgoeCsxKS4uLih4KzJqKQorICAgICAgICAgKiAgICAgIChuK3EpICAgICAgICAgICAxICAgICAgICAgLSAgICAgMmoKKyAgICAgICAgICogICsgIC0tLS0tLS0tLSAgLSAgLS0tLS0tLSAgKyAgID4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogICAgICAgIHgtMSAgICAgICAgICAgICAgeCAgICAgIC0gICAgICAgICAgICAgICAgICAgeCsyaisxCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgIDIobitxKSAgICAgIGo9MSAgICAgICAoMmopISAobitxKQorICAgICAgICAgKgorICAgICAgICAgKiB3aGVyZSB0aGUgQjJqIGFyZSBCZXJub3VsbGkgbnVtYmVycy4gIE5vdGUgdGhhdCAoc2VlIHpldGFjLmMpCisgICAgICAgICAqIHpldGEoeCwxKSA9IHpldGFjKHgpICsgMS4KKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogQUNDVVJBQ1k6CisgICAgICAgICAqCisgICAgICAgICAqIFJlbGF0aXZlIGVycm9yIGZvciBzaW5nbGUgcHJlY2lzaW9uOgorICAgICAgICAgKiBhcml0aG1ldGljICAgZG9tYWluICAgICAjIHRyaWFscyAgICAgIHBlYWsgICAgICAgICBybXMKKyAgICAgICAgICogICAgSUVFRSAgICAgIDAsMjUgICAgICAgIDEwMDAwICAgICAgIDYuOWUtNyAgICAgIDEuMGUtNworICAgICAgICAgKgorICAgICAgICAgKiBMYXJnZSBhcmd1bWVudHMgbWF5IHByb2R1Y2UgdW5kZXJmbG93IGluIHBvd2YoKSwgaW4gd2hpY2gKKyAgICAgICAgICogY2FzZSB0aGUgcmVzdWx0cyBhcmUgaW5hY2N1cmF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUkVGRVJFTkNFOgorICAgICAgICAgKgorICAgICAgICAgKiBHcmFkc2h0ZXluLCBJLiBTLiwgYW5kIEkuIE0uIFJ5emhpaywgVGFibGVzIG9mIEludGVncmFscywKKyAgICAgICAgICogU2VyaWVzLCBhbmQgUHJvZHVjdHMsIHAuIDEwNzM7IEFjYWRlbWljIFByZXNzLCAxOTgwLgorICAgICAgICAgKgorICAgICAgICAgKi8KKworICAgICAgICBpbnQgaTsKKyAgICAgICAgU2NhbGFyIHAsIHIsIGEsIGIsIGssIHMsIHQsIHc7CisKKyAgICAgICAgY29uc3QgU2NhbGFyIEFbXSA9IHsKKyAgICAgICAgICAgIFNjYWxhcigxMi4wKSwKKyAgICAgICAgICAgIFNjYWxhcigtNzIwLjApLAorICAgICAgICAgICAgU2NhbGFyKDMwMjQwLjApLAorICAgICAgICAgICAgU2NhbGFyKC0xMjA5NjAwLjApLAorICAgICAgICAgICAgU2NhbGFyKDQ3OTAwMTYwLjApLAorICAgICAgICAgICAgU2NhbGFyKC0xLjg5MjQzNzU4MDMxODM3OTE2MDZlOSksIC8qMS4zMDc2NzQzNjhlMTIvNjkxKi8KKyAgICAgICAgICAgIFNjYWxhcig3LjQ3MjQyNDk2ZTEwKSwKKyAgICAgICAgICAgIFNjYWxhcigtMi45NTAxMzA3Mjc5MTgxNjQyMjRlMTIpLCAvKjEuMDY3MDYyMjg0Mjg4ZTE2LzM2MTcqLworICAgICAgICAgICAgU2NhbGFyKDEuMTY0Njc4MjgxNDM1MDA2NzI0OWUxNCksIC8qNS4xMDkwOTQyMTcxNzA5NDRlMTgvNDM4NjcqLworICAgICAgICAgICAgU2NhbGFyKC00LjU5Nzk3ODcyMjQwNzQ3MjYxMDVlMTUpLCAvKjguMDI4NTc2NjI2OTgyOTEyZTIwLzE3NDYxMSovCisgICAgICAgICAgICBTY2FsYXIoMS44MTUyMTA1NDAxOTQzNTQ2NzczZTE3KSwgLyoxLjU1MTEyMTAwNDMzMzA5ODU5ODRlMjMvODU0NTEzKi8KKyAgICAgICAgICAgIFNjYWxhcigtNy4xNjYxNjUyNTYxNzU2NjcwMTEzZTE4KSAvKjEuNjkzODI0MTM2NzMxNzQzNjY5NDUyOGUyNy8yMzYzNjQwOTEqLworICAgICAgICAgICAgfTsKKworICAgICAgICBjb25zdCBTY2FsYXIgbWF4bnVtID0gTnVtVHJhaXRzPFNjYWxhcj46OmluZmluaXR5KCk7CisgICAgICAgIGNvbnN0IFNjYWxhciB6ZXJvID0gMC4wLCBoYWxmID0gMC41LCBvbmUgPSAxLjA7CisgICAgICAgIGNvbnN0IFNjYWxhciBtYWNoZXAgPSBjZXBoZXNfaGVscGVyPFNjYWxhcj46Om1hY2hlcCgpOworICAgICAgICBjb25zdCBTY2FsYXIgbmFuID0gTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworCisgICAgICAgIGlmKCB4ID09IG9uZSApCisgICAgICAgICAgICByZXR1cm4gbWF4bnVtOworCisgICAgICAgIGlmKCB4IDwgb25lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBxIDw9IHplcm8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZihxID09IG51bWV4dDo6Zmxvb3IocSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1heG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSB4OworICAgICAgICAgICAgciA9IG51bWV4dDo6Zmxvb3IocCk7CisgICAgICAgICAgICBpZiAocCAhPSByKQorICAgICAgICAgICAgICAgIHJldHVybiBuYW47CisgICAgICAgIH0KKworICAgICAgICAvKiBQZXJtaXQgbmVnYXRpdmUgcSBidXQgY29udGludWUgc3VtIHVudGlsIG4rcSA+ICs5IC4KKyAgICAgICAgICogVGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGEgcmVmbGVjdGlvbiBmb3JtdWxhLgorICAgICAgICAgKiBJZiBxPDAgYW5kIHggaXMgYW4gaW50ZWdlciwgdGhlcmUgaXMgYSByZWxhdGlvbiB0bworICAgICAgICAgKiB0aGUgcG9seWdhbW1hIGZ1bmN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcyA9IG51bWV4dDo6cG93KCBxLCAteCApOworICAgICAgICBhID0gcTsKKyAgICAgICAgYiA9IHplcm87CisgICAgICAgIC8vIFJ1biB0aGUgc3VtbWF0aW9uIGluIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGZsb2F0aW5nIHByZWNpc2lvbgorICAgICAgICBpZiAoemV0YV9pbXBsX3NlcmllczxTY2FsYXI+OjpydW4oYSwgYiwgcywgeCwgbWFjaGVwKSkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICB3ID0gYTsKKyAgICAgICAgcyArPSBiKncvKHgtb25lKTsKKyAgICAgICAgcyAtPSBoYWxmICogYjsKKyAgICAgICAgYSA9IG9uZTsKKyAgICAgICAgayA9IHplcm87CisgICAgICAgIGZvciggaT0wOyBpPDEyOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBhICo9IHggKyBrOworICAgICAgICAgICAgYiAvPSB3OworICAgICAgICAgICAgdCA9IGEqYi9BW2ldOworICAgICAgICAgICAgcyA9IHMgKyB0OworICAgICAgICAgICAgdCA9IG51bWV4dDo6YWJzKHQvcyk7CisgICAgICAgICAgICBpZiggdCA8IG1hY2hlcCApIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrICs9IG9uZTsKKyAgICAgICAgICAgIGEgKj0geCArIGs7CisgICAgICAgICAgICBiIC89IHc7CisgICAgICAgICAgICBrICs9IG9uZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHBvbHlnYW1tYSBmdW5jdGlvbiwgcmVxdWlyZXMgQysrMTEvQzk5ICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBwb2x5Z2FtbWFfcmV0dmFsIHsKKyAgICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKworI2lmICFFSUdFTl9IQVNfQzk5X01BVEgKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBwb2x5Z2FtbWFfaW1wbCB7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKFNjYWxhciBuLCBTY2FsYXIgeCkgeworICAgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIFNjYWxhcj46OnZhbHVlID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgfQorfTsKKworI2Vsc2UKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBwb2x5Z2FtbWFfaW1wbCB7CisgICAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgICBzdGF0aWMgU2NhbGFyIHJ1bihTY2FsYXIgbiwgU2NhbGFyIHgpIHsKKyAgICAgICAgU2NhbGFyIHplcm8gPSAwLjAsIG9uZSA9IDEuMDsKKyAgICAgICAgU2NhbGFyIG5wbHVzID0gbiArIG9uZTsKKyAgICAgICAgY29uc3QgU2NhbGFyIG5hbiA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKworICAgICAgICAvLyBDaGVjayB0aGF0IG4gaXMgYW4gaW50ZWdlcgorICAgICAgICBpZiAobnVtZXh0OjpmbG9vcihuKSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gbmFuOworICAgICAgICB9CisgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBkaWdhbW1hIGZ1bmN0aW9uIGZvciBuID0gMQorICAgICAgICBlbHNlIGlmIChuID09IHplcm8pIHsKKyAgICAgICAgICAgIHJldHVybiBkaWdhbW1hX2ltcGw8U2NhbGFyPjo6cnVuKHgpOworICAgICAgICB9CisgICAgICAgIC8vIFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyBzY2lweQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFNjYWxhciBmYWN0b3JpYWwgPSBudW1leHQ6OmV4cChsZ2FtbWFfaW1wbDxTY2FsYXI+OjpydW4obnBsdXMpKTsKKyAgICAgICAgICAgIHJldHVybiBudW1leHQ6OnBvdygtb25lLCBucGx1cykgKiBmYWN0b3JpYWwgKiB6ZXRhX2ltcGw8U2NhbGFyPjo6cnVuKG5wbHVzLCB4KTsKKyAgICAgICAgfQorICB9Cit9OworCisjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBiZXRhaW5jIChpbmNvbXBsZXRlIGJldGEgaW50ZWdyYWwpLCBiYXNlZCBvbiBDZXBoZXMgYnV0IHJlcXVpcmVzIEMrKzExL0M5OSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGJldGFpbmNfcmV0dmFsIHsKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKKyNpZiAhRUlHRU5fSEFTX0M5OV9NQVRICisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgYmV0YWluY19pbXBsIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihTY2FsYXIgYSwgU2NhbGFyIGIsIFNjYWxhciB4KSB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBTY2FsYXI+Ojp2YWx1ZSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKworI2Vsc2UKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBiZXRhaW5jX2ltcGwgeworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKFNjYWxhciwgU2NhbGFyLCBTY2FsYXIpIHsKKyAgICAvKgliZXRhaW5jZi5jCisgICAgICoKKyAgICAgKglJbmNvbXBsZXRlIGJldGEgaW50ZWdyYWwKKyAgICAgKgorICAgICAqCisgICAgICogU1lOT1BTSVM6CisgICAgICoKKyAgICAgKiBmbG9hdCBhLCBiLCB4LCB5LCBiZXRhaW5jZigpOworICAgICAqCisgICAgICogeSA9IGJldGFpbmNmKCBhLCBiLCB4ICk7CisgICAgICoKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOgorICAgICAqCisgICAgICogUmV0dXJucyBpbmNvbXBsZXRlIGJldGEgaW50ZWdyYWwgb2YgdGhlIGFyZ3VtZW50cywgZXZhbHVhdGVkCisgICAgICogZnJvbSB6ZXJvIHRvIHguICBUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBhcworICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICB4CisgICAgICogICAgIC0gICAgICAgICAgICAtCisgICAgICogICAgfCAoYStiKSAgICAgIHwgfCAgYS0xICAgICBiLTEKKyAgICAgKiAgLS0tLS0tLS0tLS0gICAgfCAgIHQgICAoMS10KSAgIGR0LgorICAgICAqICAgLSAgICAgLSAgICAgfCB8CisgICAgICogIHwgKGEpIHwgKGIpICAgLQorICAgICAqICAgICAgICAgICAgICAgICAwCisgICAgICoKKyAgICAgKiBUaGUgZG9tYWluIG9mIGRlZmluaXRpb24gaXMgMCA8PSB4IDw9IDEuICBJbiB0aGlzCisgICAgICogaW1wbGVtZW50YXRpb24gYSBhbmQgYiBhcmUgcmVzdHJpY3RlZCB0byBwb3NpdGl2ZSB2YWx1ZXMuCisgICAgICogVGhlIGludGVncmFsIGZyb20geCB0byAxIG1heSBiZSBvYnRhaW5lZCBieSB0aGUgc3ltbWV0cnkKKyAgICAgKiByZWxhdGlvbgorICAgICAqCisgICAgICogICAgMSAtIGJldGFpbmMoIGEsIGIsIHggKSAgPSAgYmV0YWluYyggYiwgYSwgMS14ICkuCisgICAgICoKKyAgICAgKiBUaGUgaW50ZWdyYWwgaXMgZXZhbHVhdGVkIGJ5IGEgY29udGludWVkIGZyYWN0aW9uIGV4cGFuc2lvbi4KKyAgICAgKiBJZiBhIDwgMSwgdGhlIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSBhZnRlciBhCisgICAgICogdHJhbnNmb3JtYXRpb24gdG8gaW5jcmVhc2UgYSB0byBhKzEuCisgICAgICoKKyAgICAgKiBBQ0NVUkFDWSAoZmxvYXQpOgorICAgICAqCisgICAgICogVGVzdGVkIGF0IHJhbmRvbSBwb2ludHMgKGEsYix4KSB3aXRoIGEgYW5kIGIgaW4gdGhlIGluZGljYXRlZAorICAgICAqIGludGVydmFsIGFuZCB4IGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKgorICAgICAqIGFyaXRobWV0aWMgICBkb21haW4gICAgICMgdHJpYWxzICAgICAgcGVhayAgICAgICAgIHJtcworICAgICAqIFJlbGF0aXZlIGVycm9yOgorICAgICAqICAgIElFRUUgICAgICAgMCwzMCAgICAgICAxMDAwMCAgICAgICAzLjdlLTUgICAgICA1LjFlLTYKKyAgICAgKiAgICBJRUVFICAgICAgIDAsMTAwICAgICAgMTAwMDAgICAgICAgMS43ZS00ICAgICAgMi41ZS01CisgICAgICogVGhlIHVzZWZ1bCBkb21haW4gZm9yIHJlbGF0aXZlIGVycm9yIGlzIGxpbWl0ZWQgYnkgdW5kZXJmbG93CisgICAgICogb2YgdGhlIHNpbmdsZSBwcmVjaXNpb24gZXhwb25lbnRpYWwgZnVuY3Rpb24uCisgICAgICogQWJzb2x1dGUgZXJyb3I6CisgICAgICogICAgSUVFRSAgICAgICAwLDMwICAgICAgMTAwMDAwICAgICAgIDIuMmUtNSAgICAgIDkuNmUtNworICAgICAqICAgIElFRUUgICAgICAgMCwxMDAgICAgICAxMDAwMCAgICAgICA2LjVlLTUgICAgICAzLjdlLTYKKyAgICAgKgorICAgICAqIExhcmdlciBlcnJvcnMgbWF5IG9jY3VyIGZvciBleHRyZW1lIHJhdGlvcyBvZiBhIGFuZCBiLgorICAgICAqCisgICAgICogQUNDVVJBQ1kgKGRvdWJsZSk6CisgICAgICogYXJpdGhtZXRpYyAgIGRvbWFpbiAgICAgIyB0cmlhbHMgICAgICBwZWFrICAgICAgICAgcm1zCisgICAgICogICAgSUVFRSAgICAgIDAsNSAgICAgICAgIDEwMDAwICAgICAgIDYuOWUtMTUgICAgIDQuNWUtMTYKKyAgICAgKiAgICBJRUVFICAgICAgMCw4NSAgICAgICAyNTAwMDAgICAgICAgMi4yZS0xMyAgICAgMS43ZS0xNAorICAgICAqICAgIElFRUUgICAgICAwLDEwMDAgICAgICAzMDAwMCAgICAgICA1LjNlLTEyICAgICA2LjNlLTEzCisgICAgICogICAgSUVFRSAgICAgIDAsMTAwMDAgICAgMjUwMDAwICAgICAgIDkuM2UtMTEgICAgIDcuMWUtMTIKKyAgICAgKiAgICBJRUVFICAgICAgMCwxMDAwMDAgICAgMTAwMDAgICAgICAgOC43ZS0xMCAgICAgNC44ZS0xMQorICAgICAqIE91dHB1dHMgc21hbGxlciB0aGFuIHRoZSBJRUVFIGdyYWR1YWwgdW5kZXJmbG93IHRocmVzaG9sZAorICAgICAqIHdlcmUgZXhjbHVkZWQgZnJvbSB0aGVzZSBzdGF0aXN0aWNzLgorICAgICAqCisgICAgICogRVJST1IgTUVTU0FHRVM6CisgICAgICogICBtZXNzYWdlICAgICAgICAgY29uZGl0aW9uICAgICAgdmFsdWUgcmV0dXJuZWQKKyAgICAgKiBpbmNiZXQgZG9tYWluICAgICAgeDwwLCB4PjEgICAgICAgICAgbmFuCisgICAgICogaW5jYmV0IHVuZGVyZmxvdyAgICAgICAgICAgICAgICAgICAgIG5hbgorICAgICAqLworCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBTY2FsYXI+Ojp2YWx1ZSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBUSElTX1RZUEVfSVNfTk9UX1NVUFBPUlRFRCk7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKworLyogQ29udGludWVkIGZyYWN0aW9uIGV4cGFuc2lvbiAjMSBmb3IgaW5jb21wbGV0ZSBiZXRhIGludGVncmFsIChzbWFsbF9icmFuY2ggPSBUcnVlKQorICogQ29udGludWVkIGZyYWN0aW9uIGV4cGFuc2lvbiAjMiBmb3IgaW5jb21wbGV0ZSBiZXRhIGludGVncmFsIChzbWFsbF9icmFuY2ggPSBGYWxzZSkKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbmNiZXRhX2NmZSB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBydW4oU2NhbGFyIGEsIFNjYWxhciBiLCBTY2FsYXIgeCwgYm9vbCBzbWFsbF9icmFuY2gpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGZsb2F0Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGRvdWJsZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfVFlQRV9JU19OT1RfU1VQUE9SVEVEKTsKKyAgICBjb25zdCBTY2FsYXIgYmlnID0gY2VwaGVzX2hlbHBlcjxTY2FsYXI+OjpiaWcoKTsKKyAgICBjb25zdCBTY2FsYXIgbWFjaGVwID0gY2VwaGVzX2hlbHBlcjxTY2FsYXI+OjptYWNoZXAoKTsKKyAgICBjb25zdCBTY2FsYXIgYmlnaW52ID0gY2VwaGVzX2hlbHBlcjxTY2FsYXI+OjpiaWdpbnYoKTsKKworICAgIGNvbnN0IFNjYWxhciB6ZXJvID0gMDsKKyAgICBjb25zdCBTY2FsYXIgb25lID0gMTsKKyAgICBjb25zdCBTY2FsYXIgdHdvID0gMjsKKworICAgIFNjYWxhciB4aywgcGssIHBrbTEsIHBrbTIsIHFrLCBxa20xLCBxa20yOworICAgIFNjYWxhciBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGsyNnVwZGF0ZTsKKyAgICBTY2FsYXIgYW5zOworICAgIGludCBuOworCisgICAgY29uc3QgaW50IG51bV9pdGVycyA9IChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGZsb2F0Pjo6dmFsdWUpID8gMTAwIDogMzAwOworICAgIGNvbnN0IFNjYWxhciB0aHJlc2ggPQorICAgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBmbG9hdD46OnZhbHVlKSA/IG1hY2hlcCA6IFNjYWxhcigzKSAqIG1hY2hlcDsKKyAgICBTY2FsYXIgciA9IChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGZsb2F0Pjo6dmFsdWUpID8gemVybyA6IG9uZTsKKworICAgIGlmIChzbWFsbF9icmFuY2gpIHsKKyAgICAgIGsxID0gYTsKKyAgICAgIGsyID0gYSArIGI7CisgICAgICBrMyA9IGE7CisgICAgICBrNCA9IGEgKyBvbmU7CisgICAgICBrNSA9IG9uZTsKKyAgICAgIGs2ID0gYiAtIG9uZTsKKyAgICAgIGs3ID0gazQ7CisgICAgICBrOCA9IGEgKyB0d287CisgICAgICBrMjZ1cGRhdGUgPSBvbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGsxID0gYTsKKyAgICAgIGsyID0gYiAtIG9uZTsKKyAgICAgIGszID0gYTsKKyAgICAgIGs0ID0gYSArIG9uZTsKKyAgICAgIGs1ID0gb25lOworICAgICAgazYgPSBhICsgYjsKKyAgICAgIGs3ID0gYSArIG9uZTsKKyAgICAgIGs4ID0gYSArIHR3bzsKKyAgICAgIGsyNnVwZGF0ZSA9IC1vbmU7CisgICAgICB4ID0geCAvIChvbmUgLSB4KTsKKyAgICB9CisKKyAgICBwa20yID0gemVybzsKKyAgICBxa20yID0gb25lOworICAgIHBrbTEgPSBvbmU7CisgICAgcWttMSA9IG9uZTsKKyAgICBhbnMgPSBvbmU7CisgICAgbiA9IDA7CisKKyAgICBkbyB7CisgICAgICB4ayA9IC0oeCAqIGsxICogazIpIC8gKGszICogazQpOworICAgICAgcGsgPSBwa20xICsgcGttMiAqIHhrOworICAgICAgcWsgPSBxa20xICsgcWttMiAqIHhrOworICAgICAgcGttMiA9IHBrbTE7CisgICAgICBwa20xID0gcGs7CisgICAgICBxa20yID0gcWttMTsKKyAgICAgIHFrbTEgPSBxazsKKworICAgICAgeGsgPSAoeCAqIGs1ICogazYpIC8gKGs3ICogazgpOworICAgICAgcGsgPSBwa20xICsgcGttMiAqIHhrOworICAgICAgcWsgPSBxa20xICsgcWttMiAqIHhrOworICAgICAgcGttMiA9IHBrbTE7CisgICAgICBwa20xID0gcGs7CisgICAgICBxa20yID0gcWttMTsKKyAgICAgIHFrbTEgPSBxazsKKworICAgICAgaWYgKHFrICE9IHplcm8pIHsKKyAgICAgICAgciA9IHBrIC8gcWs7CisgICAgICAgIGlmIChudW1leHQ6OmFicyhhbnMgLSByKSA8IG51bWV4dDo6YWJzKHIpICogdGhyZXNoKSB7CisgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICAgICAgYW5zID0gcjsKKyAgICAgIH0KKworICAgICAgazEgKz0gb25lOworICAgICAgazIgKz0gazI2dXBkYXRlOworICAgICAgazMgKz0gdHdvOworICAgICAgazQgKz0gdHdvOworICAgICAgazUgKz0gb25lOworICAgICAgazYgLT0gazI2dXBkYXRlOworICAgICAgazcgKz0gdHdvOworICAgICAgazggKz0gdHdvOworCisgICAgICBpZiAoKG51bWV4dDo6YWJzKHFrKSArIG51bWV4dDo6YWJzKHBrKSkgPiBiaWcpIHsKKyAgICAgICAgcGttMiAqPSBiaWdpbnY7CisgICAgICAgIHBrbTEgKj0gYmlnaW52OworICAgICAgICBxa20yICo9IGJpZ2ludjsKKyAgICAgICAgcWttMSAqPSBiaWdpbnY7CisgICAgICB9CisgICAgICBpZiAoKG51bWV4dDo6YWJzKHFrKSA8IGJpZ2ludikgfHwgKG51bWV4dDo6YWJzKHBrKSA8IGJpZ2ludikpIHsKKyAgICAgICAgcGttMiAqPSBiaWc7CisgICAgICAgIHBrbTEgKj0gYmlnOworICAgICAgICBxa20yICo9IGJpZzsKKyAgICAgICAgcWttMSAqPSBiaWc7CisgICAgICB9CisgICAgfSB3aGlsZSAoKytuIDwgbnVtX2l0ZXJzKTsKKworICAgIHJldHVybiBhbnM7CisgIH0KK307CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBTY2FsYXIgdHlwZSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBiZXRhaW5jX2hlbHBlciB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBiZXRhaW5jX2hlbHBlcjxmbG9hdD4geworICAvKiBDb3JlIGltcGxlbWVudGF0aW9uLCBhc3N1bWVzIGEgbGFyZ2UgKD4gMS4wKSAqLworICBFSUdFTl9ERVZJQ0VfRlVOQyBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBpbmNic2EoZmxvYXQgYWEsIGZsb2F0IGJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeHgpIHsKKyAgICBmbG9hdCBhbnMsIGEsIGIsIHQsIHgsIG9uZW14OworICAgIGJvb2wgcmV2ZXJzZWRfYV9iID0gZmFsc2U7CisKKyAgICBvbmVteCA9IDEuMGYgLSB4eDsKKworICAgIC8qIHNlZSBpZiB4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWVhbiAqLworICAgIGlmICh4eCA+IChhYSAvIChhYSArIGJiKSkpIHsKKyAgICAgIHJldmVyc2VkX2FfYiA9IHRydWU7CisgICAgICBhID0gYmI7CisgICAgICBiID0gYWE7CisgICAgICB0ID0geHg7CisgICAgICB4ID0gb25lbXg7CisgICAgfSBlbHNlIHsKKyAgICAgIGEgPSBhYTsKKyAgICAgIGIgPSBiYjsKKyAgICAgIHQgPSBvbmVteDsKKyAgICAgIHggPSB4eDsKKyAgICB9CisKKyAgICAvKiBDaG9vc2UgZXhwYW5zaW9uIGZvciBvcHRpbWFsIGNvbnZlcmdlbmNlICovCisgICAgaWYgKGIgPiAxMC4wZikgeworICAgICAgaWYgKG51bWV4dDo6YWJzKGIgKiB4IC8gYSkgPCAwLjNmKSB7CisgICAgICAgIHQgPSBiZXRhaW5jX2hlbHBlcjxmbG9hdD46OmluY2JwcyhhLCBiLCB4KTsKKyAgICAgICAgaWYgKHJldmVyc2VkX2FfYikgdCA9IDEuMGYgLSB0OworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhbnMgPSB4ICogKGEgKyBiIC0gMi4wZikgLyAoYSAtIDEuMGYpOworICAgIGlmIChhbnMgPCAxLjBmKSB7CisgICAgICBhbnMgPSBpbmNiZXRhX2NmZTxmbG9hdD46OnJ1bihhLCBiLCB4LCB0cnVlIC8qIHNtYWxsX2JyYW5jaCAqLyk7CisgICAgICB0ID0gYiAqIG51bWV4dDo6bG9nKHQpOworICAgIH0gZWxzZSB7CisgICAgICBhbnMgPSBpbmNiZXRhX2NmZTxmbG9hdD46OnJ1bihhLCBiLCB4LCBmYWxzZSAvKiBzbWFsbF9icmFuY2ggKi8pOworICAgICAgdCA9IChiIC0gMS4wZikgKiBudW1leHQ6OmxvZyh0KTsKKyAgICB9CisKKyAgICB0ICs9IGEgKiBudW1leHQ6OmxvZyh4KSArIGxnYW1tYV9pbXBsPGZsb2F0Pjo6cnVuKGEgKyBiKSAtCisgICAgICAgICBsZ2FtbWFfaW1wbDxmbG9hdD46OnJ1bihhKSAtIGxnYW1tYV9pbXBsPGZsb2F0Pjo6cnVuKGIpOworICAgIHQgKz0gbnVtZXh0Ojpsb2coYW5zIC8gYSk7CisgICAgdCA9IG51bWV4dDo6ZXhwKHQpOworCisgICAgaWYgKHJldmVyc2VkX2FfYikgdCA9IDEuMGYgLSB0OworICAgIHJldHVybiB0OworICB9CisKKyAgRUlHRU5fREVWSUNFX0ZVTkMKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgaW5jYnBzKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IHgpIHsKKyAgICBmbG9hdCB0LCB1LCB5LCBzOworICAgIGNvbnN0IGZsb2F0IG1hY2hlcCA9IGNlcGhlc19oZWxwZXI8ZmxvYXQ+OjptYWNoZXAoKTsKKworICAgIHkgPSBhICogbnVtZXh0Ojpsb2coeCkgKyAoYiAtIDEuMGYpICogbnVtZXh0Ojpsb2cxcCgteCkgLSBudW1leHQ6OmxvZyhhKTsKKyAgICB5IC09IGxnYW1tYV9pbXBsPGZsb2F0Pjo6cnVuKGEpICsgbGdhbW1hX2ltcGw8ZmxvYXQ+OjpydW4oYik7CisgICAgeSArPSBsZ2FtbWFfaW1wbDxmbG9hdD46OnJ1bihhICsgYik7CisKKyAgICB0ID0geCAvICgxLjBmIC0geCk7CisgICAgcyA9IDAuMGY7CisgICAgdSA9IDEuMGY7CisgICAgZG8geworICAgICAgYiAtPSAxLjBmOworICAgICAgaWYgKGIgPT0gMC4wZikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGEgKz0gMS4wZjsKKyAgICAgIHUgKj0gdCAqIGIgLyBhOworICAgICAgcyArPSB1OworICAgIH0gd2hpbGUgKG51bWV4dDo6YWJzKHUpID4gbWFjaGVwKTsKKworICAgIHJldHVybiBudW1leHQ6OmV4cCh5KSAqICgxLjBmICsgcyk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgYmV0YWluY19pbXBsPGZsb2F0PiB7CisgIEVJR0VOX0RFVklDRV9GVU5DCisgIHN0YXRpYyBmbG9hdCBydW4oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgeCkgeworICAgIGNvbnN0IGZsb2F0IG5hbiA9IE51bVRyYWl0czxmbG9hdD46OnF1aWV0X05hTigpOworICAgIGZsb2F0IGFucywgdDsKKworICAgIGlmIChhIDw9IDAuMGYpIHJldHVybiBuYW47CisgICAgaWYgKGIgPD0gMC4wZikgcmV0dXJuIG5hbjsKKyAgICBpZiAoKHggPD0gMC4wZikgfHwgKHggPj0gMS4wZikpIHsKKyAgICAgIGlmICh4ID09IDAuMGYpIHJldHVybiAwLjBmOworICAgICAgaWYgKHggPT0gMS4wZikgcmV0dXJuIDEuMGY7CisgICAgICAvLyBtdGhlcnIoImJldGFpbmNmIiwgRE9NQUlOKTsKKyAgICAgIHJldHVybiBuYW47CisgICAgfQorCisgICAgLyogdHJhbnNmb3JtYXRpb24gZm9yIHNtYWxsIGFhICovCisgICAgaWYgKGEgPD0gMS4wZikgeworICAgICAgYW5zID0gYmV0YWluY19oZWxwZXI8ZmxvYXQ+OjppbmNic2EoYSArIDEuMGYsIGIsIHgpOworICAgICAgdCA9IGEgKiBudW1leHQ6OmxvZyh4KSArIGIgKiBudW1leHQ6OmxvZzFwKC14KSArCisgICAgICAgICAgbGdhbW1hX2ltcGw8ZmxvYXQ+OjpydW4oYSArIGIpIC0gbGdhbW1hX2ltcGw8ZmxvYXQ+OjpydW4oYSArIDEuMGYpIC0KKyAgICAgICAgICBsZ2FtbWFfaW1wbDxmbG9hdD46OnJ1bihiKTsKKyAgICAgIHJldHVybiAoYW5zICsgbnVtZXh0OjpleHAodCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYmV0YWluY19oZWxwZXI8ZmxvYXQ+OjppbmNic2EoYSwgYiwgeCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGJldGFpbmNfaGVscGVyPGRvdWJsZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgaW5jYnBzKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIHgpIHsKKyAgICBjb25zdCBkb3VibGUgbWFjaGVwID0gY2VwaGVzX2hlbHBlcjxkb3VibGU+OjptYWNoZXAoKTsKKworICAgIGRvdWJsZSBzLCB0LCB1LCB2LCBuLCB0MSwgeiwgYWk7CisKKyAgICBhaSA9IDEuMCAvIGE7CisgICAgdSA9ICgxLjAgLSBiKSAqIHg7CisgICAgdiA9IHUgLyAoYSArIDEuMCk7CisgICAgdDEgPSB2OworICAgIHQgPSB1OworICAgIG4gPSAyLjA7CisgICAgcyA9IDAuMDsKKyAgICB6ID0gbWFjaGVwICogYWk7CisgICAgd2hpbGUgKG51bWV4dDo6YWJzKHYpID4geikgeworICAgICAgdSA9IChuIC0gYikgKiB4IC8gbjsKKyAgICAgIHQgKj0gdTsKKyAgICAgIHYgPSB0IC8gKGEgKyBuKTsKKyAgICAgIHMgKz0gdjsKKyAgICAgIG4gKz0gMS4wOworICAgIH0KKyAgICBzICs9IHQxOworICAgIHMgKz0gYWk7CisKKyAgICB1ID0gYSAqIG51bWV4dDo6bG9nKHgpOworICAgIC8vIFRPRE86IGdhbW1hKCkgaXMgbm90IGRpcmVjdGx5IGltcGxlbWVudGVkIGluIEVpZ2VuLgorICAgIC8qCisgICAgaWYgKChhICsgYikgPCBtYXhnYW0gJiYgbnVtZXh0OjphYnModSkgPCBtYXhsb2cpIHsKKyAgICAgIHQgPSBnYW1tYShhICsgYikgLyAoZ2FtbWEoYSkgKiBnYW1tYShiKSk7CisgICAgICBzID0gcyAqIHQgKiBwb3coeCwgYSk7CisgICAgfSBlbHNlIHsKKyAgICAqLworICAgIHQgPSBsZ2FtbWFfaW1wbDxkb3VibGU+OjpydW4oYSArIGIpIC0gbGdhbW1hX2ltcGw8ZG91YmxlPjo6cnVuKGEpIC0KKyAgICAgICAgbGdhbW1hX2ltcGw8ZG91YmxlPjo6cnVuKGIpICsgdSArIG51bWV4dDo6bG9nKHMpOworICAgIHJldHVybiBzID0gbnVtZXh0OjpleHAodCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgYmV0YWluY19pbXBsPGRvdWJsZT4geworICBFSUdFTl9ERVZJQ0VfRlVOQworICBzdGF0aWMgZG91YmxlIHJ1bihkb3VibGUgYWEsIGRvdWJsZSBiYiwgZG91YmxlIHh4KSB7CisgICAgY29uc3QgZG91YmxlIG5hbiA9IE51bVRyYWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICBjb25zdCBkb3VibGUgbWFjaGVwID0gY2VwaGVzX2hlbHBlcjxkb3VibGU+OjptYWNoZXAoKTsKKyAgICAvLyBjb25zdCBkb3VibGUgbWF4Z2FtID0gMTcxLjYyNDM3Njk1NjMwMjcyNTsKKworICAgIGRvdWJsZSBhLCBiLCB0LCB4LCB4YywgdywgeTsKKyAgICBib29sIHJldmVyc2VkX2FfYiA9IGZhbHNlOworCisgICAgaWYgKGFhIDw9IDAuMCB8fCBiYiA8PSAwLjApIHsKKyAgICAgIHJldHVybiBuYW47ICAvLyBnb3RvIGRvbWVycjsKKyAgICB9CisKKyAgICBpZiAoKHh4IDw9IDAuMCkgfHwgKHh4ID49IDEuMCkpIHsKKyAgICAgIGlmICh4eCA9PSAwLjApIHJldHVybiAoMC4wKTsKKyAgICAgIGlmICh4eCA9PSAxLjApIHJldHVybiAoMS4wKTsKKyAgICAgIC8vIG10aGVycigiaW5jYmV0IiwgRE9NQUlOKTsKKyAgICAgIHJldHVybiBuYW47CisgICAgfQorCisgICAgaWYgKChiYiAqIHh4KSA8PSAxLjAgJiYgeHggPD0gMC45NSkgeworICAgICAgcmV0dXJuIGJldGFpbmNfaGVscGVyPGRvdWJsZT46OmluY2JwcyhhYSwgYmIsIHh4KTsKKyAgICB9CisKKyAgICB3ID0gMS4wIC0geHg7CisKKyAgICAvKiBSZXZlcnNlIGEgYW5kIGIgaWYgeCBpcyBncmVhdGVyIHRoYW4gdGhlIG1lYW4uICovCisgICAgaWYgKHh4ID4gKGFhIC8gKGFhICsgYmIpKSkgeworICAgICAgcmV2ZXJzZWRfYV9iID0gdHJ1ZTsKKyAgICAgIGEgPSBiYjsKKyAgICAgIGIgPSBhYTsKKyAgICAgIHhjID0geHg7CisgICAgICB4ID0gdzsKKyAgICB9IGVsc2UgeworICAgICAgYSA9IGFhOworICAgICAgYiA9IGJiOworICAgICAgeGMgPSB3OworICAgICAgeCA9IHh4OworICAgIH0KKworICAgIGlmIChyZXZlcnNlZF9hX2IgJiYgKGIgKiB4KSA8PSAxLjAgJiYgeCA8PSAwLjk1KSB7CisgICAgICB0ID0gYmV0YWluY19oZWxwZXI8ZG91YmxlPjo6aW5jYnBzKGEsIGIsIHgpOworICAgICAgaWYgKHQgPD0gbWFjaGVwKSB7CisgICAgICAgIHQgPSAxLjAgLSBtYWNoZXA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ID0gMS4wIC0gdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIC8qIENob29zZSBleHBhbnNpb24gZm9yIGJldHRlciBjb252ZXJnZW5jZS4gKi8KKyAgICB5ID0geCAqIChhICsgYiAtIDIuMCkgLSAoYSAtIDEuMCk7CisgICAgaWYgKHkgPCAwLjApIHsKKyAgICAgIHcgPSBpbmNiZXRhX2NmZTxkb3VibGU+OjpydW4oYSwgYiwgeCwgdHJ1ZSAvKiBzbWFsbF9icmFuY2ggKi8pOworICAgIH0gZWxzZSB7CisgICAgICB3ID0gaW5jYmV0YV9jZmU8ZG91YmxlPjo6cnVuKGEsIGIsIHgsIGZhbHNlIC8qIHNtYWxsX2JyYW5jaCAqLykgLyB4YzsKKyAgICB9CisKKyAgICAvKiBNdWx0aXBseSB3IGJ5IHRoZSBmYWN0b3IKKyAgICAgICAgIGEgICAgICBiICAgXyAgICAgICAgICAgICBfICAgICBfCisgICAgICAgIHggICgxLXgpICAgfCAoYStiKSAvICggYSB8IChhKSB8IChiKSApIC4gICAqLworCisgICAgeSA9IGEgKiBudW1leHQ6OmxvZyh4KTsKKyAgICB0ID0gYiAqIG51bWV4dDo6bG9nKHhjKTsKKyAgICAvLyBUT0RPOiBnYW1tYSBpcyBub3QgZGlyZWN0bHkgaW1wbGVtZW50ZWQgaW4gRWlnZW4uCisgICAgLyoKKyAgICBpZiAoKGEgKyBiKSA8IG1heGdhbSAmJiBudW1leHQ6OmFicyh5KSA8IG1heGxvZyAmJiBudW1leHQ6OmFicyh0KSA8IG1heGxvZykKKyAgICB7CisgICAgICB0ID0gcG93KHhjLCBiKTsKKyAgICAgIHQgKj0gcG93KHgsIGEpOworICAgICAgdCAvPSBhOworICAgICAgdCAqPSB3OworICAgICAgdCAqPSBnYW1tYShhICsgYikgLyAoZ2FtbWEoYSkgKiBnYW1tYShiKSk7CisgICAgfSBlbHNlIHsKKyAgICAqLworICAgIC8qIFJlc29ydCB0byBsb2dhcml0aG1zLiAgKi8KKyAgICB5ICs9IHQgKyBsZ2FtbWFfaW1wbDxkb3VibGU+OjpydW4oYSArIGIpIC0gbGdhbW1hX2ltcGw8ZG91YmxlPjo6cnVuKGEpIC0KKyAgICAgICAgIGxnYW1tYV9pbXBsPGRvdWJsZT46OnJ1bihiKTsKKyAgICB5ICs9IG51bWV4dDo6bG9nKHcgLyBhKTsKKyAgICB0ID0gbnVtZXh0OjpleHAoeSk7CisKKyAgICAvKiB9ICovCisgICAgLy8gZG9uZToKKworICAgIGlmIChyZXZlcnNlZF9hX2IpIHsKKyAgICAgIGlmICh0IDw9IG1hY2hlcCkgeworICAgICAgICB0ID0gMS4wIC0gbWFjaGVwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdCA9IDEuMCAtIHQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0OworICB9Cit9OworCisjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBudW1leHQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChsZ2FtbWEsIFNjYWxhcikKKyAgICBsZ2FtbWEoY29uc3QgU2NhbGFyJiB4KSB7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGxnYW1tYSwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChkaWdhbW1hLCBTY2FsYXIpCisgICAgZGlnYW1tYShjb25zdCBTY2FsYXImIHgpIHsKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoZGlnYW1tYSwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTCh6ZXRhLCBTY2FsYXIpCit6ZXRhKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiBxKSB7CisgICAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoemV0YSwgU2NhbGFyKTo6cnVuKHgsIHEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChwb2x5Z2FtbWEsIFNjYWxhcikKK3BvbHlnYW1tYShjb25zdCBTY2FsYXImIG4sIGNvbnN0IFNjYWxhciYgeCkgeworICAgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKHBvbHlnYW1tYSwgU2NhbGFyKTo6cnVuKG4sIHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChlcmYsIFNjYWxhcikKKyAgICBlcmYoY29uc3QgU2NhbGFyJiB4KSB7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGVyZiwgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChlcmZjLCBTY2FsYXIpCisgICAgZXJmYyhjb25zdCBTY2FsYXImIHgpIHsKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoZXJmYywgU2NhbGFyKTo6cnVuKHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fREVWSUNFX0ZVTkMgaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChpZ2FtbWEsIFNjYWxhcikKKyAgICBpZ2FtbWEoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIHgpIHsKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoaWdhbW1hLCBTY2FsYXIpOjpydW4oYSwgeCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ERVZJQ0VfRlVOQyBpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGlnYW1tYWMsIFNjYWxhcikKKyAgICBpZ2FtbWFjKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiB4KSB7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGlnYW1tYWMsIFNjYWxhcik6OnJ1bihhLCB4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RFVklDRV9GVU5DIGlubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoYmV0YWluYywgU2NhbGFyKQorICAgIGJldGFpbmMoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIsIGNvbnN0IFNjYWxhciYgeCkgeworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChiZXRhaW5jLCBTY2FsYXIpOjpydW4oYSwgYiwgeCk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgbnVtZXh0CisKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgIC8vIEVJR0VOX1NQRUNJQUxfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL1NwZWNpYWxGdW5jdGlvbnNQYWNrZXRNYXRoLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9TcGVjaWFsRnVuY3Rpb25zUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX1BBQ0tFVE1BVEhfSAorI2RlZmluZSBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX1BBQ0tFVE1BVEhfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBsbih8Z2FtbWEoXGEgYSl8KSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBsZ2FtbWEoY29uc3QgUGFja2V0JiBhKSB7IHVzaW5nIG51bWV4dDo6bGdhbW1hOyByZXR1cm4gbGdhbW1hKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGRlcml2YXRpdmUgb2YgbGdhbW1hLCBwc2koXGEgYSkgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwZGlnYW1tYShjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgbnVtZXh0OjpkaWdhbW1hOyByZXR1cm4gZGlnYW1tYShhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSB6ZXRhIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwemV0YShjb25zdCBQYWNrZXQmIHgsIGNvbnN0IFBhY2tldCYgcSkgeyB1c2luZyBudW1leHQ6OnpldGE7IHJldHVybiB6ZXRhKHgsIHEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIHBvbHlnYW1tYSBmdW5jdGlvbiAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBwb2x5Z2FtbWEoY29uc3QgUGFja2V0JiBuLCBjb25zdCBQYWNrZXQmIHgpIHsgdXNpbmcgbnVtZXh0Ojpwb2x5Z2FtbWE7IHJldHVybiBwb2x5Z2FtbWEobiwgeCk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgZXJmKFxhIGEpIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGVyZihjb25zdCBQYWNrZXQmIGEpIHsgdXNpbmcgbnVtZXh0OjplcmY7IHJldHVybiBlcmYoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgZXJmYyhcYSBhKSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBlcmZjKGNvbnN0IFBhY2tldCYgYSkgeyB1c2luZyBudW1leHQ6OmVyZmM7IHJldHVybiBlcmZjKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGluY29tcGxldGUgZ2FtbWEgZnVuY3Rpb24gaWdhbW1hKFxhIGEsIFxhIHgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK1BhY2tldCBwaWdhbW1hKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiB4KSB7IHVzaW5nIG51bWV4dDo6aWdhbW1hOyByZXR1cm4gaWdhbW1hKGEsIHgpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGNvbXBsZW1lbnRhcnkgaW5jb21wbGV0ZSBnYW1tYSBmdW5jdGlvbiBpZ2FtbWFjKFxhIGEsIFxhIHgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK1BhY2tldCBwaWdhbW1hYyhjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgeCkgeyB1c2luZyBudW1leHQ6OmlnYW1tYWM7IHJldHVybiBpZ2FtbWFjKGEsIHgpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGNvbXBsZW1lbnRhcnkgaW5jb21wbGV0ZSBnYW1tYSBmdW5jdGlvbiBiZXRhaW5jKFxhIGEsIFxhIGIsIFxhIHgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK1BhY2tldCBwYmV0YWluYyhjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYixjb25zdCBQYWNrZXQmIHgpIHsgdXNpbmcgbnVtZXh0OjpiZXRhaW5jOyByZXR1cm4gYmV0YWluYyhhLCBiLCB4KTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEVDSUFMRlVOQ1RJT05TX1BBQ0tFVE1BVEhfSAorCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9hcmNoL0NVREEvQ3VkYVNwZWNpYWxGdW5jdGlvbnMuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGVjaWFsRnVuY3Rpb25zL2FyY2gvQ1VEQS9DdWRhU3BlY2lhbEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGZhODQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BlY2lhbEZ1bmN0aW9ucy9hcmNoL0NVREEvQ3VkYVNwZWNpYWxGdW5jdGlvbnMuaApAQCAtMCwwICsxLDE2NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DVURBX1NQRUNJQUxGVU5DVElPTlNfSAorI2RlZmluZSBFSUdFTl9DVURBX1NQRUNJQUxGVU5DVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBNYWtlIHN1cmUgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBhIEdQVTogd2UgZG9uJ3Qgd2FudCB0bworLy8gaW50cm9kdWNlIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZXNlIHBhY2tldF90cmFpdHMgZGVmaW5pdGlvbnMgYW5kIHRoZSBvbmVzCisvLyB3ZSdsbCB1c2Ugb24gdGhlIGhvc3Qgc2lkZSAoU1NFLCBBVlgsIC4uLikKKyNpZiBkZWZpbmVkKF9fQ1VEQUNDX18pICYmIGRlZmluZWQoRUlHRU5fVVNFX0dQVSkKKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcGxnYW1tYTxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgYSkKK3sKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGxnYW1tYWYoYS54KSwgbGdhbW1hZihhLnkpLCBsZ2FtbWFmKGEueiksIGxnYW1tYWYoYS53KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZG91YmxlMiBwbGdhbW1hPGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIGEpCit7CisgIHVzaW5nIG51bWV4dDo6bGdhbW1hOworICByZXR1cm4gbWFrZV9kb3VibGUyKGxnYW1tYShhLngpLCBsZ2FtbWEoYS55KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZmxvYXQ0IHBkaWdhbW1hPGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKQoreworICB1c2luZyBudW1leHQ6OmRpZ2FtbWE7CisgIHJldHVybiBtYWtlX2Zsb2F0NChkaWdhbW1hKGEueCksIGRpZ2FtbWEoYS55KSwgZGlnYW1tYShhLnopLCBkaWdhbW1hKGEudykpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2RvdWJsZTIgcGRpZ2FtbWE8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSkKK3sKKyAgdXNpbmcgbnVtZXh0OjpkaWdhbW1hOworICByZXR1cm4gbWFrZV9kb3VibGUyKGRpZ2FtbWEoYS54KSwgZGlnYW1tYShhLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcHpldGE8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIHgsIGNvbnN0IGZsb2F0NCYgcSkKK3sKKyAgICB1c2luZyBudW1leHQ6OnpldGE7CisgICAgcmV0dXJuIG1ha2VfZmxvYXQ0KHpldGEoeC54LCBxLngpLCB6ZXRhKHgueSwgcS55KSwgemV0YSh4LnosIHEueiksIHpldGEoeC53LCBxLncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHB6ZXRhPGRvdWJsZTI+KGNvbnN0IGRvdWJsZTImIHgsIGNvbnN0IGRvdWJsZTImIHEpCit7CisgICAgdXNpbmcgbnVtZXh0Ojp6ZXRhOworICAgIHJldHVybiBtYWtlX2RvdWJsZTIoemV0YSh4LngsIHEueCksIHpldGEoeC55LCBxLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcHBvbHlnYW1tYTxmbG9hdDQ+KGNvbnN0IGZsb2F0NCYgbiwgY29uc3QgZmxvYXQ0JiB4KQoreworICAgIHVzaW5nIG51bWV4dDo6cG9seWdhbW1hOworICAgIHJldHVybiBtYWtlX2Zsb2F0NChwb2x5Z2FtbWEobi54LCB4LngpLCBwb2x5Z2FtbWEobi55LCB4LnkpLCBwb2x5Z2FtbWEobi56LCB4LnopLCBwb2x5Z2FtbWEobi53LCB4LncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBwb2x5Z2FtbWE8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgbiwgY29uc3QgZG91YmxlMiYgeCkKK3sKKyAgICB1c2luZyBudW1leHQ6OnBvbHlnYW1tYTsKKyAgICByZXR1cm4gbWFrZV9kb3VibGUyKHBvbHlnYW1tYShuLngsIHgueCksIHBvbHlnYW1tYShuLnksIHgueSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2Zsb2F0NCBwZXJmPGZsb2F0ND4oY29uc3QgZmxvYXQ0JiBhKQoreworICByZXR1cm4gbWFrZV9mbG9hdDQoZXJmZihhLngpLCBlcmZmKGEueSksIGVyZmYoYS56KSwgZXJmZihhLncpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitkb3VibGUyIHBlcmY8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSkKK3sKKyAgdXNpbmcgbnVtZXh0OjplcmY7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZXJmKGEueCksIGVyZihhLnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcGVyZmM8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEpCit7CisgIHVzaW5nIG51bWV4dDo6ZXJmYzsKKyAgcmV0dXJuIG1ha2VfZmxvYXQ0KGVyZmMoYS54KSwgZXJmYyhhLnkpLCBlcmZjKGEueiksIGVyZmMoYS53KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZG91YmxlMiBwZXJmYzxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhKQoreworICB1c2luZyBudW1leHQ6OmVyZmM7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoZXJmYyhhLngpLCBlcmZjKGEueSkpOworfQorCisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZmxvYXQ0IHBpZ2FtbWE8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEsIGNvbnN0IGZsb2F0NCYgeCkKK3sKKyAgdXNpbmcgbnVtZXh0OjppZ2FtbWE7CisgIHJldHVybiBtYWtlX2Zsb2F0NCgKKyAgICAgIGlnYW1tYShhLngsIHgueCksCisgICAgICBpZ2FtbWEoYS55LCB4LnkpLAorICAgICAgaWdhbW1hKGEueiwgeC56KSwKKyAgICAgIGlnYW1tYShhLncsIHgudykpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2RvdWJsZTIgcGlnYW1tYTxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhLCBjb25zdCBkb3VibGUyJiB4KQoreworICB1c2luZyBudW1leHQ6OmlnYW1tYTsKKyAgcmV0dXJuIG1ha2VfZG91YmxlMihpZ2FtbWEoYS54LCB4LngpLCBpZ2FtbWEoYS55LCB4LnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcGlnYW1tYWM8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEsIGNvbnN0IGZsb2F0NCYgeCkKK3sKKyAgdXNpbmcgbnVtZXh0OjppZ2FtbWFjOworICByZXR1cm4gbWFrZV9mbG9hdDQoCisgICAgICBpZ2FtbWFjKGEueCwgeC54KSwKKyAgICAgIGlnYW1tYWMoYS55LCB4LnkpLAorICAgICAgaWdhbW1hYyhhLnosIHgueiksCisgICAgICBpZ2FtbWFjKGEudywgeC53KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQorZG91YmxlMiBwaWdhbW1hYzxkb3VibGUyPihjb25zdCBkb3VibGUyJiBhLCBjb25zdCBkb3VibGUyJiB4KQoreworICB1c2luZyBudW1leHQ6OmlnYW1tYWM7CisgIHJldHVybiBtYWtlX2RvdWJsZTIoaWdhbW1hYyhhLngsIHgueCksIGlnYW1tYWMoYS55LCB4LnkpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9TVFJPTkdfSU5MSU5FCitmbG9hdDQgcGJldGFpbmM8ZmxvYXQ0Pihjb25zdCBmbG9hdDQmIGEsIGNvbnN0IGZsb2F0NCYgYiwgY29uc3QgZmxvYXQ0JiB4KQoreworICB1c2luZyBudW1leHQ6OmJldGFpbmM7CisgIHJldHVybiBtYWtlX2Zsb2F0NCgKKyAgICAgIGJldGFpbmMoYS54LCBiLngsIHgueCksCisgICAgICBiZXRhaW5jKGEueSwgYi55LCB4LnkpLAorICAgICAgYmV0YWluYyhhLnosIGIueiwgeC56KSwKKyAgICAgIGJldGFpbmMoYS53LCBiLncsIHgudykpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUKK2RvdWJsZTIgcGJldGFpbmM8ZG91YmxlMj4oY29uc3QgZG91YmxlMiYgYSwgY29uc3QgZG91YmxlMiYgYiwgY29uc3QgZG91YmxlMiYgeCkKK3sKKyAgdXNpbmcgbnVtZXh0OjpiZXRhaW5jOworICByZXR1cm4gbWFrZV9kb3VibGUyKGJldGFpbmMoYS54LCBiLngsIHgueCksIGJldGFpbmMoYS55LCBiLnksIHgueSkpOworfQorCisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1VEQV9TUEVDSUFMRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ZjZlNAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZS5oCkBAIC0wLDAgKzEsNTEyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMTAtMjAxMSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQTElORV9ICisjZGVmaW5lIEVJR0VOX1NQTElORV9ICisKKyNpbmNsdWRlICJTcGxpbmVGd2QuaCIKKworbmFtZXNwYWNlIEVpZ2VuCit7CisgICAgLyoqCisgICAgICogXGluZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICAgKiBcY2xhc3MgU3BsaW5lCisgICAgICogXGJyaWVmIEEgY2xhc3MgcmVwcmVzZW50aW5nIG11bHRpLWRpbWVuc2lvbmFsIHNwbGluZSBjdXJ2ZXMuCisgICAgICoKKyAgICAgKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBCLXNwbGluZXMgd2l0aCBub24tdW5pZm9ybSBrbm90IHZlY3RvcnMuIEVhY2ggY29udHJvbAorICAgICAqIHBvaW50IG9mIHRoZSBCLXNwbGluZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBiYXNpcyBmdW5jdGlvbgorICAgICAqIFxme2FsaWduKn0KKyAgICAgKiAgIEModSkgJiA9IFxzdW1fe2k9MH1ee259Tl97aSxwfSh1KVBfaQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHRwYXJhbSBfU2NhbGFyIFRoZSB1bmRlcmx5aW5nIGRhdGEgdHlwZSAodHlwaWNhbGx5IGZsb2F0IG9yIGRvdWJsZSkKKyAgICAgKiBcdHBhcmFtIF9EaW0gVGhlIGN1cnZlIGRpbWVuc2lvbiAoZS5nLiAyIG9yIDMpCisgICAgICogXHRwYXJhbSBfRGVncmVlIFBlciBkZWZhdWx0IHNldCB0byBEeW5hbWljOyBjb3VsZCBiZSBzZXQgdG8gdGhlIGFjdHVhbCBkZXNpcmVkCisgICAgICogICAgICAgICAgICAgICAgZGVncmVlIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMgKHdvdWxkIHJlc3VsdCBpbiBzdGFjayBhbGxvY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgb2Ygc2V2ZXJhbCB0ZW1wb3JhcnkgdmFyaWFibGVzKS4KKyAgICAgKiovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIGNsYXNzIFNwbGluZQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOyAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBzY2FsYXIgdHlwZS4gKi8KKyAgICBlbnVtIHsgRGltZW5zaW9uID0gX0RpbSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBkaW1lbnNpb24uICovIH07CisgICAgZW51bSB7IERlZ3JlZSA9IF9EZWdyZWUgLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3MgZGVncmVlLiAqLyB9OworCisgICAgLyoqIFxicmllZiBUaGUgcG9pbnQgdHlwZSB0aGUgc3BsaW5lIGlzIHJlcHJlc2VudGluZy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpQb2ludFR5cGUgUG9pbnRUeXBlOworICAgIAorICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIGtub3QgdmVjdG9ycy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpLbm90VmVjdG9yVHlwZSBLbm90VmVjdG9yVHlwZTsKKworICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIHBhcmFtZXRlciB2ZWN0b3JzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZT46OlBhcmFtZXRlclZlY3RvclR5cGUgUGFyYW1ldGVyVmVjdG9yVHlwZTsKKyAgICAKKyAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSBub24temVybyBiYXNpcyBmdW5jdGlvbnMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6QmFzaXNWZWN0b3JUeXBlIEJhc2lzVmVjdG9yVHlwZTsKKworICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZXMgb2YgdGhlIGJhc2lzIGZ1bmN0aW9uIGRlcml2YXRpdmVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZT46OkJhc2lzRGVyaXZhdGl2ZVR5cGUgQmFzaXNEZXJpdmF0aXZlVHlwZTsKKyAgICAKKyAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBzcGxpbmUncyBjb250cm9sIHBvaW50cy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisgICAgCisgICAgLyoqCisgICAgKiBcYnJpZWYgQ3JlYXRlcyBhIChjb25zdGFudCkgemVybyBzcGxpbmUuCisgICAgKiBGb3IgU3BsaW5lcyB3aXRoIGR5bmFtaWMgZGVncmVlLCB0aGUgcmVzdWx0aW5nIGRlZ3JlZSB3aWxsIGJlIDAuCisgICAgKiovCisgICAgU3BsaW5lKCkgCisgICAgOiBtX2tub3RzKDEsIChEZWdyZWU9PUR5bmFtaWMgPyAyIDogMipEZWdyZWUrMikpCisgICAgLCBtX2N0cmxzKENvbnRyb2xQb2ludFZlY3RvclR5cGU6Olplcm8oRGltZW5zaW9uLChEZWdyZWU9PUR5bmFtaWMgPyAxIDogRGVncmVlKzEpKSkgCisgICAgeworICAgICAgLy8gaW4gdGhlb3J5IHRoaXMgY29kZSBjYW4gZ28gdG8gdGhlIGluaXRpYWxpemVyIGxpc3QgYnV0IGl0IHdpbGwgZ2V0IHByZXR0eQorICAgICAgLy8gbXVjaCB1bnJlYWRhYmxlIC4uLgorICAgICAgZW51bSB7IE1pbkRlZ3JlZSA9IChEZWdyZWU9PUR5bmFtaWMgPyAwIDogRGVncmVlKSB9OworICAgICAgbV9rbm90cy50ZW1wbGF0ZSBzZWdtZW50PE1pbkRlZ3JlZSsxPigwKSA9IEFycmF5PFNjYWxhciwxLE1pbkRlZ3JlZSsxPjo6WmVybygpOworICAgICAgbV9rbm90cy50ZW1wbGF0ZSBzZWdtZW50PE1pbkRlZ3JlZSsxPihNaW5EZWdyZWUrMSkgPSBBcnJheTxTY2FsYXIsMSxNaW5EZWdyZWUrMT46Ok9uZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFxicmllZiBDcmVhdGVzIGEgc3BsaW5lIGZyb20gYSBrbm90IHZlY3RvciBhbmQgY29udHJvbCBwb2ludHMuCisgICAgKiBccGFyYW0ga25vdHMgVGhlIHNwbGluZSdzIGtub3QgdmVjdG9yLgorICAgICogXHBhcmFtIGN0cmxzIFRoZSBzcGxpbmUncyBjb250cm9sIHBvaW50IHZlY3Rvci4KKyAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJWZWN0b3JUeXBlLCB0eXBlbmFtZSBPdGhlckFycmF5VHlwZT4KKyAgICBTcGxpbmUoY29uc3QgT3RoZXJWZWN0b3JUeXBlJiBrbm90cywgY29uc3QgT3RoZXJBcnJheVR5cGUmIGN0cmxzKSA6IG1fa25vdHMoa25vdHMpLCBtX2N0cmxzKGN0cmxzKSB7fQorCisgICAgLyoqCisgICAgKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciBmb3Igc3BsaW5lcy4KKyAgICAqIFxwYXJhbSBzcGxpbmUgVGhlIGlucHV0IHNwbGluZS4KKyAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8aW50IE90aGVyRGVncmVlPgorICAgIFNwbGluZShjb25zdCBTcGxpbmU8U2NhbGFyLCBEaW1lbnNpb24sIE90aGVyRGVncmVlPiYgc3BsaW5lKSA6IAorICAgIG1fa25vdHMoc3BsaW5lLmtub3RzKCkpLCBtX2N0cmxzKHNwbGluZS5jdHJscygpKSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIGtub3RzIG9mIHRoZSB1bmRlcmx5aW5nIHNwbGluZS4KKyAgICAgKiovCisgICAgY29uc3QgS25vdFZlY3RvclR5cGUmIGtub3RzKCkgY29uc3QgeyByZXR1cm4gbV9rbm90czsgfQorICAgIAorICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBjdHJscyBvZiB0aGUgdW5kZXJseWluZyBzcGxpbmUuCisgICAgICoqLyAgICAKKyAgICBjb25zdCBDb250cm9sUG9pbnRWZWN0b3JUeXBlJiBjdHJscygpIGNvbnN0IHsgcmV0dXJuIG1fY3RybHM7IH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBzcGxpbmUgdmFsdWUgYXQgYSBnaXZlbiBzaXRlIFxmJHVcZiQuCisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucworICAgICAqIFxme2FsaWduKn0KKyAgICAgKiAgIEModSkgJiA9IFxzdW1fe2k9MH1ee259Tl97aSxwfVBfaQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBzcGxpbmUgaXMgZXZhbHVhdGVkLgorICAgICAqIFxyZXR1cm4gVGhlIHNwbGluZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gXGYkdVxmJC4KKyAgICAgKiovCisgICAgUG9pbnRUeXBlIG9wZXJhdG9yKCkoU2NhbGFyIHUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGJyaWVmIEV2YWx1YXRpb24gb2Ygc3BsaW5lIGRlcml2YXRpdmVzIG9mIHVwLXRvIGdpdmVuIG9yZGVyLgorICAgICAqCisgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9CisgICAgICogICBcZnJhY3tkXml9e2R1Xml9Qyh1KSAmID0gXHN1bV97aT0wfV57bn0gXGZyYWN7ZF5pfXtkdV5pfSBOX3tpLHB9KHUpUF9pCisgICAgICogXGZ9CisgICAgICogZm9yIGkgcmFuZ2luZyBiZXR3ZWVuIDAgYW5kIG9yZGVyLgorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBzcGxpbmUgZGVyaXZhdGl2ZSBpcyBldmFsdWF0ZWQuCisgICAgICogXHBhcmFtIG9yZGVyIFRoZSBvcmRlciB1cCB0byB3aGljaCB0aGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkLgorICAgICAqKi8KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6RGVyaXZhdGl2ZVR5cGUKKyAgICAgIGRlcml2YXRpdmVzKFNjYWxhciB1LCBEZW5zZUluZGV4IG9yZGVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxjb3B5ZG9jIFNwbGluZTo6ZGVyaXZhdGl2ZXMKKyAgICAgKiBVc2luZyB0aGUgdGVtcGxhdGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgZWZmaWNpZWVudCBzaW5jZQorICAgICAqIHRlbXBvcmFyeSBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIHdoZW5ldmVyIHRoaXMgaXMgcG9zc2libGUuCisgICAgICoqLyAgICAKKyAgICB0ZW1wbGF0ZSA8aW50IERlcml2YXRpdmVPcmRlcj4KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lLERlcml2YXRpdmVPcmRlcj46OkRlcml2YXRpdmVUeXBlCisgICAgICBkZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlciA9IERlcml2YXRpdmVPcmRlcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIG5vbi16ZXJvIGJhc2lzIGZ1bmN0aW9ucyBhdCB0aGUgZ2l2ZW4gc2l0ZS4KKyAgICAgKgorICAgICAqIFNwbGluZXMgaGF2ZSBsb2NhbCBzdXBwb3J0IGFuZCBhIHBvaW50IGZyb20gdGhlaXIgaW1hZ2UgaXMgZGVmaW5lZAorICAgICAqIGJ5IGV4YWN0bHkgXGYkcCsxXGYkIGNvbnRyb2wgcG9pbnRzIFxmJFBfaVxmJCB3aGVyZSBcZiRwXGYkIGlzIHRoZQorICAgICAqIHNwbGluZSBkZWdyZWUuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBcZiRwKzFcZiQgbm9uLXplcm8gYmFzaXMgZnVuY3Rpb24gdmFsdWVzCisgICAgICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlIFxmJHVcZiQuIEl0IHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9eworICAgICAqICAgTl97aSxwfSh1KSwgXGhkb3RzLCBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBub24temVybyBiYXNpcyBmdW5jdGlvbnMgCisgICAgICogICAgICAgICAgYXJlIGNvbXB1dGVkLgorICAgICAqKi8KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6QmFzaXNWZWN0b3JUeXBlCisgICAgICBiYXNpc0Z1bmN0aW9ucyhTY2FsYXIgdSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIG5vbi16ZXJvIHNwbGluZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcyB1cCB0byBnaXZlbiBvcmRlci4KKyAgICAgKgorICAgICAqIFRoZSBmdW5jdGlvbiBjb21wdXRlcworICAgICAqIFxme2FsaWduKn17CisgICAgICogICBcZnJhY3tkXml9e2R1Xml9IE5fe2kscH0odSksIFxoZG90cywgXGZyYWN7ZF5pfXtkdV5pfSBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqIHdpdGggaSByYW5naW5nIGZyb20gMCB1cCB0byB0aGUgc3BlY2lmaWVkIG9yZGVyLgorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBub24temVybyBiYXNpcyBmdW5jdGlvbgorICAgICAqICAgICAgICAgIGRlcml2YXRpdmVzIGFyZSBjb21wdXRlZC4KKyAgICAgKiBccGFyYW0gb3JkZXIgVGhlIG9yZGVyIHVwIHRvIHdoaWNoIHRoZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcyBhcmUgY29tcHV0ZXMuCisgICAgICoqLworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpCYXNpc0Rlcml2YXRpdmVUeXBlCisgICAgICBiYXNpc0Z1bmN0aW9uRGVyaXZhdGl2ZXMoU2NhbGFyIHUsIERlbnNlSW5kZXggb3JkZXIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGNvcHlkb2MgU3BsaW5lOjpiYXNpc0Z1bmN0aW9uRGVyaXZhdGl2ZXMKKyAgICAgKiBVc2luZyB0aGUgdGVtcGxhdGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgZWZmaWNpZWVudCBzaW5jZQorICAgICAqIHRlbXBvcmFyeSBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIHdoZW5ldmVyIHRoaXMgaXMgcG9zc2libGUuCisgICAgICoqLyAgICAKKyAgICB0ZW1wbGF0ZSA8aW50IERlcml2YXRpdmVPcmRlcj4KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lLERlcml2YXRpdmVPcmRlcj46OkJhc2lzRGVyaXZhdGl2ZVR5cGUKKyAgICAgIGJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlciA9IERlcml2YXRpdmVPcmRlcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgc3BsaW5lIGRlZ3JlZS4KKyAgICAgKiovIAorICAgIERlbnNlSW5kZXggZGVncmVlKCkgY29uc3Q7CisKKyAgICAvKiogCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIHNwYW4gd2l0aGluIHRoZSBrbm90IHZlY3RvciBpbiB3aGljaCB1IGlzIGZhbGxpbmcuCisgICAgICogXHBhcmFtIHUgVGhlIHNpdGUgZm9yIHdoaWNoIHRoZSBzcGFuIGlzIGRldGVybWluZWQuCisgICAgICoqLworICAgIERlbnNlSW5kZXggc3BhbihTY2FsYXIgdSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIHNwYW5nIHdpdGhpbiB0aGUgcHJvdmlkZWQga25vdCB2ZWN0b3IgaW4gd2hpY2ggdSBpcyBmYWxsaW5nLgorICAgICAqKi8KKyAgICBzdGF0aWMgRGVuc2VJbmRleCBTcGFuKHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpTY2FsYXIgdSwgRGVuc2VJbmRleCBkZWdyZWUsIGNvbnN0IHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpLbm90VmVjdG9yVHlwZSYga25vdHMpOworICAgIAorICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBzcGxpbmUncyBub24temVybyBiYXNpcyBmdW5jdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gY29tcHV0ZXMgYW5kIHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9eworICAgICAqICAgTl97aSxwfSh1KSwgXGhkb3RzLCBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgVGhlIHNpdGUgYXQgd2hpY2ggdGhlIGJhc2lzIGZ1bmN0aW9ucyBhcmUgY29tcHV0ZWQuCisgICAgICogXHBhcmFtIGRlZ3JlZSBUaGUgZGVncmVlIG9mIHRoZSB1bmRlcmx5aW5nIHNwbGluZS4KKyAgICAgKiBccGFyYW0ga25vdHMgVGhlIHVuZGVybHlpbmcgc3BsaW5lJ3Mga25vdCB2ZWN0b3IuCisgICAgICoqLworICAgIHN0YXRpYyBCYXNpc1ZlY3RvclR5cGUgQmFzaXNGdW5jdGlvbnMoU2NhbGFyIHUsIERlbnNlSW5kZXggZGVncmVlLCBjb25zdCBLbm90VmVjdG9yVHlwZSYga25vdHMpOworCisgICAgLyoqCisgICAgICogXGNvcHlkb2MgU3BsaW5lOjpiYXNpc0Z1bmN0aW9uRGVyaXZhdGl2ZXMKKyAgICAgKiBccGFyYW0gZGVncmVlIFRoZSBkZWdyZWUgb2YgdGhlIHVuZGVybHlpbmcgc3BsaW5lCisgICAgICogXHBhcmFtIGtub3RzIFRoZSB1bmRlcmx5aW5nIHNwbGluZSdzIGtub3QgdmVjdG9yLgorICAgICAqKi8gICAgCisgICAgc3RhdGljIEJhc2lzRGVyaXZhdGl2ZVR5cGUgQmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzKAorICAgICAgY29uc3QgU2NhbGFyIHUsIGNvbnN0IERlbnNlSW5kZXggb3JkZXIsIGNvbnN0IERlbnNlSW5kZXggZGVncmVlLCBjb25zdCBLbm90VmVjdG9yVHlwZSYga25vdHMpOworCisgIHByaXZhdGU6CisgICAgS25vdFZlY3RvclR5cGUgbV9rbm90czsgLyohPCBLbm90IHZlY3Rvci4gKi8KKyAgICBDb250cm9sUG9pbnRWZWN0b3JUeXBlICBtX2N0cmxzOyAvKiE8IENvbnRyb2wgcG9pbnRzLiAqLworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2YXRpdmVUeXBlPgorICAgIHN0YXRpYyB2b2lkIEJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlc0ltcGwoCisgICAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlNjYWxhciB1LAorICAgICAgY29uc3QgRGVuc2VJbmRleCBvcmRlciwKKyAgICAgIGNvbnN0IERlbnNlSW5kZXggcCwgCisgICAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46Oktub3RWZWN0b3JUeXBlJiBVLAorICAgICAgRGVyaXZhdGl2ZVR5cGUmIE5fKTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICBEZW5zZUluZGV4IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6U3BhbigKKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiA+OjpTY2FsYXIgdSwKKyAgICBEZW5zZUluZGV4IGRlZ3JlZSwKKyAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiA+OjpLbm90VmVjdG9yVHlwZSYga25vdHMpCisgIHsKKyAgICAvLyBQaWVnbCAmIFRpbGxlciwgIlRoZSBOVVJCUyBCb29rIiwgQTIuMSAocC4gNjgpCisgICAgaWYgKHUgPD0ga25vdHMoMCkpIHJldHVybiBkZWdyZWU7CisgICAgY29uc3QgU2NhbGFyKiBwb3MgPSBzdGQ6OnVwcGVyX2JvdW5kKGtub3RzLmRhdGEoKStkZWdyZWUtMSwga25vdHMuZGF0YSgpK2tub3RzLnNpemUoKS1kZWdyZWUtMSwgdSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlbnNlSW5kZXg+KCBzdGQ6OmRpc3RhbmNlKGtub3RzLmRhdGEoKSwgcG9zKSAtIDEgKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6QmFzaXNWZWN0b3JUeXBlCisgICAgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpCYXNpc0Z1bmN0aW9ucygKKyAgICB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlNjYWxhciB1LAorICAgIERlbnNlSW5kZXggZGVncmVlLAorICAgIGNvbnN0IHR5cGVuYW1lIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6S25vdFZlY3RvclR5cGUmIGtub3RzKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OkJhc2lzVmVjdG9yVHlwZSBCYXNpc1ZlY3RvclR5cGU7CisKKyAgICBjb25zdCBEZW5zZUluZGV4IHAgPSBkZWdyZWU7CisgICAgY29uc3QgRGVuc2VJbmRleCBpID0gU3BsaW5lOjpTcGFuKHUsIGRlZ3JlZSwga25vdHMpOworCisgICAgY29uc3QgS25vdFZlY3RvclR5cGUmIFUgPSBrbm90czsKKworICAgIEJhc2lzVmVjdG9yVHlwZSBsZWZ0KHArMSk7IGxlZnQoMCkgPSBTY2FsYXIoMCk7CisgICAgQmFzaXNWZWN0b3JUeXBlIHJpZ2h0KHArMSk7IHJpZ2h0KDApID0gU2NhbGFyKDApOyAgICAgICAgCisKKyAgICBWZWN0b3JCbG9jazxCYXNpc1ZlY3RvclR5cGUsRGVncmVlPihsZWZ0LDEscCkgPSB1IC0gVmVjdG9yQmxvY2s8Y29uc3QgS25vdFZlY3RvclR5cGUsRGVncmVlPihVLGkrMS1wLHApLnJldmVyc2UoKTsKKyAgICBWZWN0b3JCbG9jazxCYXNpc1ZlY3RvclR5cGUsRGVncmVlPihyaWdodCwxLHApID0gVmVjdG9yQmxvY2s8Y29uc3QgS25vdFZlY3RvclR5cGUsRGVncmVlPihVLGkrMSxwKSAtIHU7CisKKyAgICBCYXNpc1ZlY3RvclR5cGUgTigxLHArMSk7CisgICAgTigwKSA9IFNjYWxhcigxKTsKKyAgICBmb3IgKERlbnNlSW5kZXggaj0xOyBqPD1wOyArK2opCisgICAgeworICAgICAgU2NhbGFyIHNhdmVkID0gU2NhbGFyKDApOworICAgICAgZm9yIChEZW5zZUluZGV4IHI9MDsgcjxqOyByKyspCisgICAgICB7CisgICAgICAgIGNvbnN0IFNjYWxhciB0bXAgPSBOKHIpLyhyaWdodChyKzEpK2xlZnQoai1yKSk7CisgICAgICAgIE5bcl0gPSBzYXZlZCArIHJpZ2h0KHIrMSkqdG1wOworICAgICAgICBzYXZlZCA9IGxlZnQoai1yKSp0bXA7CisgICAgICB9CisgICAgICBOKGopID0gc2F2ZWQ7CisgICAgfQorICAgIHJldHVybiBOOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgRGVuc2VJbmRleCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmRlZ3JlZSgpIGNvbnN0CisgIHsKKyAgICBpZiAoX0RlZ3JlZSA9PSBEeW5hbWljKQorICAgICAgcmV0dXJuIG1fa25vdHMuc2l6ZSgpIC0gbV9jdHJscy5jb2xzKCkgLSAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiBfRGVncmVlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgRGVuc2VJbmRleCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OnNwYW4oU2NhbGFyIHUpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gU3BsaW5lOjpTcGFuKHUsIGRlZ3JlZSgpLCBrbm90cygpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6UG9pbnRUeXBlIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6b3BlcmF0b3IoKShTY2FsYXIgdSkgY29uc3QKKyAgeworICAgIGVudW0geyBPcmRlciA9IFNwbGluZVRyYWl0czxTcGxpbmU+OjpPcmRlckF0Q29tcGlsZVRpbWUgfTsKKworICAgIGNvbnN0IERlbnNlSW5kZXggc3BhbiA9IHRoaXMtPnNwYW4odSk7CisgICAgY29uc3QgRGVuc2VJbmRleCBwID0gZGVncmVlKCk7CisgICAgY29uc3QgQmFzaXNWZWN0b3JUeXBlIGJhc2lzX2Z1bmNzID0gYmFzaXNGdW5jdGlvbnModSk7CisKKyAgICBjb25zdCBSZXBsaWNhdGU8QmFzaXNWZWN0b3JUeXBlLERpbWVuc2lvbiwxPiBjdHJsX3dlaWdodHMoYmFzaXNfZnVuY3MpOworICAgIGNvbnN0IEJsb2NrPGNvbnN0IENvbnRyb2xQb2ludFZlY3RvclR5cGUsRGltZW5zaW9uLE9yZGVyPiBjdHJsX3B0cyhjdHJscygpLDAsc3Bhbi1wLERpbWVuc2lvbixwKzEpOworICAgIHJldHVybiAoY3RybF93ZWlnaHRzICogY3RybF9wdHMpLnJvd3dpc2UoKS5zdW0oKTsKKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGxpbmVUeXBlLCB0eXBlbmFtZSBEZXJpdmF0aXZlVHlwZT4KKyAgdm9pZCBkZXJpdmF0aXZlc0ltcGwoY29uc3QgU3BsaW5lVHlwZSYgc3BsaW5lLCB0eXBlbmFtZSBTcGxpbmVUeXBlOjpTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlciwgRGVyaXZhdGl2ZVR5cGUmIGRlcikKKyAgeyAgICAKKyAgICBlbnVtIHsgRGltZW5zaW9uID0gU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpEaW1lbnNpb24gfTsKKyAgICBlbnVtIHsgT3JkZXIgPSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZT46Ok9yZGVyQXRDb21waWxlVGltZSB9OworICAgIGVudW0geyBEZXJpdmF0aXZlT3JkZXIgPSBEZXJpdmF0aXZlVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZSxEZXJpdmF0aXZlT3JkZXI+OjpCYXNpc0Rlcml2YXRpdmVUeXBlIEJhc2lzRGVyaXZhdGl2ZVR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNpc0Rlcml2YXRpdmVUeXBlOjpDb25zdFJvd1hwciBCYXNpc0Rlcml2YXRpdmVSb3dYcHI7ICAgIAorCisgICAgY29uc3QgRGVuc2VJbmRleCBwID0gc3BsaW5lLmRlZ3JlZSgpOworICAgIGNvbnN0IERlbnNlSW5kZXggc3BhbiA9IHNwbGluZS5zcGFuKHUpOworCisgICAgY29uc3QgRGVuc2VJbmRleCBuID0gKHN0ZDo6bWluKShwLCBvcmRlcik7CisKKyAgICBkZXIucmVzaXplKERpbWVuc2lvbixuKzEpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGJhc2lzIGZ1bmN0aW9uIGRlcml2YXRpdmVzIHVwIHRvIHRoZSBkZXNpcmVkIG9yZGVyLi4uICAgIAorICAgIGNvbnN0IEJhc2lzRGVyaXZhdGl2ZVR5cGUgYmFzaXNfZnVuY19kZXJzID0gc3BsaW5lLnRlbXBsYXRlIGJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlczxEZXJpdmF0aXZlT3JkZXI+KHUsIG4rMSk7CisKKyAgICAvLyAuLi4gYW5kIHBlcmZvcm0gdGhlIGxpbmVhciBjb21iaW5hdGlvbnMgb2YgdGhlIGNvbnRyb2wgcG9pbnRzLgorICAgIGZvciAoRGVuc2VJbmRleCBkZXJfb3JkZXI9MDsgZGVyX29yZGVyPG4rMTsgKytkZXJfb3JkZXIpCisgICAgeworICAgICAgY29uc3QgUmVwbGljYXRlPEJhc2lzRGVyaXZhdGl2ZVJvd1hwcixEaW1lbnNpb24sMT4gY3RybF93ZWlnaHRzKCBiYXNpc19mdW5jX2RlcnMucm93KGRlcl9vcmRlcikgKTsKKyAgICAgIGNvbnN0IEJsb2NrPGNvbnN0IENvbnRyb2xQb2ludFZlY3RvclR5cGUsRGltZW5zaW9uLE9yZGVyPiBjdHJsX3B0cyhzcGxpbmUuY3RybHMoKSwwLHNwYW4tcCxEaW1lbnNpb24scCsxKTsKKyAgICAgIGRlci5jb2woZGVyX29yZGVyKSA9IChjdHJsX3dlaWdodHMgKiBjdHJsX3B0cykucm93d2lzZSgpLnN1bSgpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+ID46OkRlcml2YXRpdmVUeXBlCisgICAgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpkZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlcikgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lID46OkRlcml2YXRpdmVUeXBlIHJlczsKKyAgICBkZXJpdmF0aXZlc0ltcGwoKnRoaXMsIHUsIG9yZGVyLCByZXMpOworICAgIHJldHVybiByZXM7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICB0ZW1wbGF0ZSA8aW50IERlcml2YXRpdmVPcmRlcj4KKyAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4sIERlcml2YXRpdmVPcmRlciA+OjpEZXJpdmF0aXZlVHlwZQorICAgIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6ZGVyaXZhdGl2ZXMoU2NhbGFyIHUsIERlbnNlSW5kZXggb3JkZXIpIGNvbnN0CisgIHsKKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZSwgRGVyaXZhdGl2ZU9yZGVyID46OkRlcml2YXRpdmVUeXBlIHJlczsKKyAgICBkZXJpdmF0aXZlc0ltcGwoKnRoaXMsIHUsIG9yZGVyLCByZXMpOworICAgIHJldHVybiByZXM7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiA+OjpCYXNpc1ZlY3RvclR5cGUKKyAgICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmJhc2lzRnVuY3Rpb25zKFNjYWxhciB1KSBjb25zdAorICB7CisgICAgcmV0dXJuIFNwbGluZTo6QmFzaXNGdW5jdGlvbnModSwgZGVncmVlKCksIGtub3RzKCkpOworICB9CisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIAorICAKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2YXRpdmVUeXBlPgorICB2b2lkIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6QmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCgKKyAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlNjYWxhciB1LAorICAgIGNvbnN0IERlbnNlSW5kZXggb3JkZXIsCisgICAgY29uc3QgRGVuc2VJbmRleCBwLCAKKyAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46Oktub3RWZWN0b3JUeXBlJiBVLAorICAgIERlcml2YXRpdmVUeXBlJiBOXykKKyAgeworICAgIHR5cGVkZWYgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+IFNwbGluZVR5cGU7CisgICAgZW51bSB7IE9yZGVyID0gU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpPcmRlckF0Q29tcGlsZVRpbWUgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpCYXNpc1ZlY3RvclR5cGUgQmFzaXNWZWN0b3JUeXBlOworICAKKyAgICBjb25zdCBEZW5zZUluZGV4IHNwYW4gPSBTcGxpbmVUeXBlOjpTcGFuKHUsIHAsIFUpOworCisgICAgY29uc3QgRGVuc2VJbmRleCBuID0gKHN0ZDo6bWluKShwLCBvcmRlcik7CisKKyAgICBOXy5yZXNpemUobisxLCBwKzEpOworCisgICAgQmFzaXNWZWN0b3JUeXBlIGxlZnQgPSBCYXNpc1ZlY3RvclR5cGU6Olplcm8ocCsxKTsKKyAgICBCYXNpc1ZlY3RvclR5cGUgcmlnaHQgPSBCYXNpc1ZlY3RvclR5cGU6Olplcm8ocCsxKTsKKworICAgIE1hdHJpeDxTY2FsYXIsT3JkZXIsT3JkZXI+IG5kdShwKzEscCsxKTsKKworICAgIFNjYWxhciBzYXZlZCwgdGVtcDsgLy8gRklYTUUgVGhlc2Ugd2VyZSBkb3VibGUgaW5zdGVhZCBvZiBTY2FsYXIuIFdhcyB0aGVyZSBhIHJlYXNvbiBmb3IgdGhhdD8KKworICAgIG5kdSgwLDApID0gMS4wOworCisgICAgRGVuc2VJbmRleCBqOworICAgIGZvciAoaj0xOyBqPD1wOyArK2opCisgICAgeworICAgICAgbGVmdFtqXSA9IHUtVVtzcGFuKzEtal07CisgICAgICByaWdodFtqXSA9IFVbc3BhbitqXS11OworICAgICAgc2F2ZWQgPSAwLjA7CisKKyAgICAgIGZvciAoRGVuc2VJbmRleCByPTA7IHI8ajsgKytyKQorICAgICAgeworICAgICAgICAvKiBMb3dlciB0cmlhbmdsZSAqLworICAgICAgICBuZHUoaixyKSA9IHJpZ2h0W3IrMV0rbGVmdFtqLXJdOworICAgICAgICB0ZW1wID0gbmR1KHIsai0xKS9uZHUoaixyKTsKKyAgICAgICAgLyogVXBwZXIgdHJpYW5nbGUgKi8KKyAgICAgICAgbmR1KHIsaikgPSBzdGF0aWNfY2FzdDxTY2FsYXI+KHNhdmVkK3JpZ2h0W3IrMV0gKiB0ZW1wKTsKKyAgICAgICAgc2F2ZWQgPSBsZWZ0W2otcl0gKiB0ZW1wOworICAgICAgfQorCisgICAgICBuZHUoaixqKSA9IHN0YXRpY19jYXN0PFNjYWxhcj4oc2F2ZWQpOworICAgIH0KKworICAgIGZvciAoaiA9IHA7IGo+PTA7IC0taikgCisgICAgICBOXygwLGopID0gbmR1KGoscCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBkZXJpdmF0aXZlcworICAgIERlcml2YXRpdmVUeXBlIGEobisxLHArMSk7CisgICAgRGVuc2VJbmRleCByPTA7CisgICAgZm9yICg7IHI8PXA7ICsrcikKKyAgICB7CisgICAgICBEZW5zZUluZGV4IHMxLHMyOworICAgICAgczEgPSAwOyBzMiA9IDE7IC8vIGFsdGVybmF0ZSByb3dzIGluIGFycmF5IGEKKyAgICAgIGEoMCwwKSA9IDEuMDsKKworICAgICAgLy8gQ29tcHV0ZSB0aGUgay10aCBkZXJpdmF0aXZlCisgICAgICBmb3IgKERlbnNlSW5kZXggaz0xOyBrPD1zdGF0aWNfY2FzdDxEZW5zZUluZGV4PihuKTsgKytrKQorICAgICAgeworICAgICAgICBTY2FsYXIgZCA9IDAuMDsKKyAgICAgICAgRGVuc2VJbmRleCByayxwayxqMSxqMjsKKyAgICAgICAgcmsgPSByLWs7IHBrID0gcC1rOworCisgICAgICAgIGlmIChyPj1rKQorICAgICAgICB7CisgICAgICAgICAgYShzMiwwKSA9IGEoczEsMCkvbmR1KHBrKzEscmspOworICAgICAgICAgIGQgPSBhKHMyLDApKm5kdShyayxwayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocms+PS0xKSBqMSA9IDE7CisgICAgICAgIGVsc2UgICAgICAgIGoxID0gLXJrOworCisgICAgICAgIGlmIChyLTEgPD0gcGspIGoyID0gay0xOworICAgICAgICBlbHNlICAgICAgICAgICBqMiA9IHAtcjsKKworICAgICAgICBmb3IgKGo9ajE7IGo8PWoyOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBhKHMyLGopID0gKGEoczEsaiktYShzMSxqLTEpKS9uZHUocGsrMSxyaytqKTsKKyAgICAgICAgICBkICs9IGEoczIsaikqbmR1KHJrK2oscGspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHI8PXBrKQorICAgICAgICB7CisgICAgICAgICAgYShzMixrKSA9IC1hKHMxLGstMSkvbmR1KHBrKzEscik7CisgICAgICAgICAgZCArPSBhKHMyLGspKm5kdShyLHBrKTsKKyAgICAgICAgfQorCisgICAgICAgIE5fKGsscikgPSBzdGF0aWNfY2FzdDxTY2FsYXI+KGQpOworICAgICAgICBqID0gczE7IHMxID0gczI7IHMyID0gajsgLy8gU3dpdGNoIHJvd3MKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNdWx0aXBseSB0aHJvdWdoIGJ5IHRoZSBjb3JyZWN0IGZhY3RvcnMgKi8KKyAgICAvKiAoRXEuIFsyLjldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICByID0gcDsKKyAgICBmb3IgKERlbnNlSW5kZXggaz0xOyBrPD1zdGF0aWNfY2FzdDxEZW5zZUluZGV4PihuKTsgKytrKQorICAgIHsKKyAgICAgIGZvciAoaj1wOyBqPj0wOyAtLWopIE5fKGssaikgKj0gcjsKKyAgICAgIHIgKj0gcC1rOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+ID46OkJhc2lzRGVyaXZhdGl2ZVR5cGUKKyAgICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlcikgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6QmFzaXNEZXJpdmF0aXZlVHlwZSBkZXI7CisgICAgQmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCh1LCBvcmRlciwgZGVncmVlKCksIGtub3RzKCksIGRlcik7CisgICAgcmV0dXJuIGRlcjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHRlbXBsYXRlIDxpbnQgRGVyaXZhdGl2ZU9yZGVyPgorICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiwgRGVyaXZhdGl2ZU9yZGVyID46OkJhc2lzRGVyaXZhdGl2ZVR5cGUKKyAgICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlcikgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+LCBEZXJpdmF0aXZlT3JkZXIgPjo6QmFzaXNEZXJpdmF0aXZlVHlwZSBkZXI7CisgICAgQmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCh1LCBvcmRlciwgZGVncmVlKCksIGtub3RzKCksIGRlcik7CisgICAgcmV0dXJuIGRlcjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6QmFzaXNEZXJpdmF0aXZlVHlwZQorICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OkJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcygKKyAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlNjYWxhciB1LAorICAgIGNvbnN0IERlbnNlSW5kZXggb3JkZXIsCisgICAgY29uc3QgRGVuc2VJbmRleCBkZWdyZWUsCisgICAgY29uc3QgdHlwZW5hbWUgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpLbm90VmVjdG9yVHlwZSYga25vdHMpCisgIHsKKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6QmFzaXNEZXJpdmF0aXZlVHlwZSBkZXI7CisgICAgQmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCh1LCBvcmRlciwgZGVncmVlLCBrbm90cywgZGVyKTsKKyAgICByZXR1cm4gZGVyOworICB9Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9TUExJTkVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRml0dGluZy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRml0dGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NjFhOWIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BsaW5lcy9TcGxpbmVGaXR0aW5nLmgKQEAgLTAsMCArMSw0MzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAxMC0yMDExIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BMSU5FX0ZJVFRJTkdfSAorI2RlZmluZSBFSUdFTl9TUExJTkVfRklUVElOR19ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIlNwbGluZUZ3ZC5oIgorCisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK25hbWVzcGFjZSBFaWdlbgoreworICAvKioKKyAgICogXGJyaWVmIENvbXB1dGVzIGtub3QgYXZlcmFnZXMuCisgICAqIFxpbmdyb3VwIFNwbGluZXNfTW9kdWxlCisgICAqCisgICAqIFRoZSBrbm90cyBhcmUgY29tcHV0ZWQgYXMKKyAgICogXGZ7YWxpZ24qfQorICAgKiAgdV8wICYgPSBcaGRvdHMgPSB1X3AgPSAwIFxcCisgICAqICB1X3ttLXB9ICYgPSBcaGRvdHMgPSB1X3ttfSA9IDEgXFwKKyAgICogIHVfe2orcH0gJiA9IFxmcmFjezF9e3B9XHN1bV97aT1qfV57aitwLTF9XGJhcnt1fV9pIFxxdWFkXHF1YWQgaj0xLFxoZG90cyxuLXAKKyAgICogXGZ9CisgICAqIHdoZXJlIFxmJHBcZiQgaXMgdGhlIGRlZ3JlZSBhbmQgXGYkbSsxXGYkIHRoZSBudW1iZXIga25vdHMKKyAgICogb2YgdGhlIGRlc2lyZWQgaW50ZXJwb2xhdGluZyBzcGxpbmUuCisgICAqCisgICAqIFxwYXJhbVtpbl0gcGFyYW1ldGVycyBUaGUgaW5wdXQgcGFyYW1ldGVycy4gRHVyaW5nIGludGVycG9sYXRpb24gb25lIGZvciBlYWNoIGRhdGEgcG9pbnQuCisgICAqIFxwYXJhbVtpbl0gZGVncmVlIFRoZSBzcGxpbmUgZGVncmVlIHdoaWNoIGlzIHVzZWQgZHVyaW5nIHRoZSBpbnRlcnBvbGF0aW9uLgorICAgKiBccGFyYW1bb3V0XSBrbm90cyBUaGUgb3V0cHV0IGtub3QgdmVjdG9yLgorICAgKgorICAgKiBcc2EgTGVzIFBpZWdsIGFuZCBXYXluZSBUaWxsZXIsIFRoZSBOVVJCUyBib29rICgybmQgZWQuKSwgMTk5NywgOS4yLjEgR2xvYmFsIEN1cnZlIEludGVycG9sYXRpb24gdG8gUG9pbnQgRGF0YQorICAgKiovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLbm90VmVjdG9yVHlwZT4KKyAgdm9pZCBLbm90QXZlcmFnaW5nKGNvbnN0IEtub3RWZWN0b3JUeXBlJiBwYXJhbWV0ZXJzLCBEZW5zZUluZGV4IGRlZ3JlZSwgS25vdFZlY3RvclR5cGUmIGtub3RzKQorICB7CisgICAga25vdHMucmVzaXplKHBhcmFtZXRlcnMuc2l6ZSgpK2RlZ3JlZSsxKTsgICAgICAKKworICAgIGZvciAoRGVuc2VJbmRleCBqPTE7IGo8cGFyYW1ldGVycy5zaXplKCktZGVncmVlOyArK2opCisgICAgICBrbm90cyhqK2RlZ3JlZSkgPSBwYXJhbWV0ZXJzLnNlZ21lbnQoaixkZWdyZWUpLm1lYW4oKTsKKworICAgIGtub3RzLnNlZ21lbnQoMCxkZWdyZWUrMSkgPSBLbm90VmVjdG9yVHlwZTo6WmVybyhkZWdyZWUrMSk7CisgICAga25vdHMuc2VnbWVudChrbm90cy5zaXplKCktZGVncmVlLTEsZGVncmVlKzEpID0gS25vdFZlY3RvclR5cGU6Ok9uZXMoZGVncmVlKzEpOworICB9CisKKyAgLyoqCisgICAqIFxicmllZiBDb21wdXRlcyBrbm90IGF2ZXJhZ2VzIHdoZW4gZGVyaXZhdGl2ZSBjb25zdHJhaW50cyBhcmUgcHJlc2VudC4KKyAgICogTm90ZSB0aGF0IHRoaXMgaXMgYSB0ZWNobmljYWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgYXJ0aWNsZQorICAgKiBzaW5jZSB0aGUgYWxnb3JpdGhtIGNvbnRhaW5lZCB0aGVyZWluIGlzIGluY29ycmVjdCBhcyB3cml0dGVuLgorICAgKiBcaW5ncm91cCBTcGxpbmVzX01vZHVsZQorICAgKgorICAgKiBccGFyYW1baW5dIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMgYXQgd2hpY2ggdGhlIGludGVycG9sYXRpb24gQi1TcGxpbmUKKyAgICogICAgICAgICAgICB3aWxsIGludGVyc2VjdCB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBwb2ludHMuIFRoZSBwYXJhbWV0ZXJzCisgICAqICAgICAgICAgICAgYXJlIGFzc3VtZWQgdG8gYmUgYSBub24tZGVjcmVhc2luZyBzZXF1ZW5jZS4KKyAgICogXHBhcmFtW2luXSBkZWdyZWUgVGhlIGRlZ3JlZSBvZiB0aGUgaW50ZXJwb2xhdGluZyBCLVNwbGluZS4gVGhpcyBtdXN0IGJlCisgICAqICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHplcm8uCisgICAqIFxwYXJhbVtpbl0gZGVyaXZhdGl2ZUluZGljZXMgVGhlIGluZGljZXMgY29ycmVzcG9uZGluZyB0byBwYXJhbWV0ZXJzIGF0CisgICAqICAgICAgICAgICAgd2hpY2ggdGhlcmUgYXJlIGRlcml2YXRpdmUgY29uc3RyYWludHMuIFRoZSBpbmRpY2VzIGFyZSBhc3N1bWVkCisgICAqICAgICAgICAgICAgdG8gYmUgYSBub24tZGVjcmVhc2luZyBzZXF1ZW5jZS4KKyAgICogXHBhcmFtW291dF0ga25vdHMgVGhlIGNhbGN1bGF0ZWQga25vdCB2ZWN0b3IuIFRoZXNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYQorICAgKiAgICAgICAgICAgICBub24tZGVjcmVhc2luZyBzZXF1ZW5jZQorICAgKgorICAgKiBcc2EgTGVzIEEuIFBpZWdsLCBLaGFpcmFuIFJhamFiLCBWb2xoYSBTbWFyb2R6aW5hbmEuIDIwMDguCisgICAqIEN1cnZlIGludGVycG9sYXRpb24gd2l0aCBkaXJlY3Rpb25hbCBjb25zdHJhaW50cyBmb3IgZW5naW5lZXJpbmcgZGVzaWduLiAKKyAgICogRW5naW5lZXJpbmcgd2l0aCBDb21wdXRlcnMKKyAgICoqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS25vdFZlY3RvclR5cGUsIHR5cGVuYW1lIFBhcmFtZXRlclZlY3RvclR5cGUsIHR5cGVuYW1lIEluZGV4QXJyYXk+CisgIHZvaWQgS25vdEF2ZXJhZ2luZ1dpdGhEZXJpdmF0aXZlcyhjb25zdCBQYXJhbWV0ZXJWZWN0b3JUeXBlJiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGRlZ3JlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4QXJyYXkmIGRlcml2YXRpdmVJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vdFZlY3RvclR5cGUmIGtub3RzKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQYXJhbWV0ZXJWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgICAgRGVuc2VJbmRleCBudW1QYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5zaXplKCk7CisgICAgRGVuc2VJbmRleCBudW1EZXJpdmF0aXZlcyA9IGRlcml2YXRpdmVJbmRpY2VzLnNpemUoKTsKKworICAgIGlmIChudW1EZXJpdmF0aXZlcyA8IDEpCisgICAgeworICAgICAgS25vdEF2ZXJhZ2luZyhwYXJhbWV0ZXJzLCBkZWdyZWUsIGtub3RzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZW5zZUluZGV4IHN0YXJ0SW5kZXg7CisgICAgRGVuc2VJbmRleCBlbmRJbmRleDsKKyAgCisgICAgRGVuc2VJbmRleCBudW1JbnRlcm5hbERlcml2YXRpdmVzID0gbnVtRGVyaXZhdGl2ZXM7CisgICAgCisgICAgaWYgKGRlcml2YXRpdmVJbmRpY2VzWzBdID09IDApCisgICAgeworICAgICAgc3RhcnRJbmRleCA9IDA7CisgICAgICAtLW51bUludGVybmFsRGVyaXZhdGl2ZXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGFydEluZGV4ID0gMTsKKyAgICB9CisgICAgaWYgKGRlcml2YXRpdmVJbmRpY2VzW251bURlcml2YXRpdmVzIC0gMV0gPT0gbnVtUGFyYW1ldGVycyAtIDEpCisgICAgeworICAgICAgZW5kSW5kZXggPSBudW1QYXJhbWV0ZXJzIC0gZGVncmVlOworICAgICAgLS1udW1JbnRlcm5hbERlcml2YXRpdmVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZW5kSW5kZXggPSBudW1QYXJhbWV0ZXJzIC0gZGVncmVlIC0gMTsKKyAgICB9CisKKyAgICAvLyBUaGVyZSBhcmUgKGVuZEluZGV4IC0gc3RhcnRJbmRleCArIDEpIGtub3RzIG9idGFpbmVkIGZyb20gdGhlIGF2ZXJhZ2luZworICAgIC8vIGFuZCAyIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgcGFyYW1ldGVycy4KKyAgICBEZW5zZUluZGV4IG51bUF2ZXJhZ2VLbm90cyA9IGVuZEluZGV4IC0gc3RhcnRJbmRleCArIDM7CisgICAgS25vdFZlY3RvclR5cGUgYXZlcmFnZUtub3RzKG51bUF2ZXJhZ2VLbm90cyk7CisgICAgYXZlcmFnZUtub3RzWzBdID0gcGFyYW1ldGVyc1swXTsKKworICAgIGludCBuZXdLbm90SW5kZXggPSAwOworICAgIGZvciAoRGVuc2VJbmRleCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKQorICAgICAgYXZlcmFnZUtub3RzWysrbmV3S25vdEluZGV4XSA9IHBhcmFtZXRlcnMuc2VnbWVudChpLCBkZWdyZWUpLm1lYW4oKTsKKyAgICBhdmVyYWdlS25vdHNbKytuZXdLbm90SW5kZXhdID0gcGFyYW1ldGVyc1tudW1QYXJhbWV0ZXJzIC0gMV07CisKKyAgICBuZXdLbm90SW5kZXggPSAtMTsKKyAgCisgICAgUGFyYW1ldGVyVmVjdG9yVHlwZSB0ZW1wb3JhcnlQYXJhbWV0ZXJzKG51bVBhcmFtZXRlcnMgKyAxKTsKKyAgICBLbm90VmVjdG9yVHlwZSBkZXJpdmF0aXZlS25vdHMobnVtSW50ZXJuYWxEZXJpdmF0aXZlcyk7CisgICAgZm9yIChEZW5zZUluZGV4IGkgPSAwOyBpIDwgbnVtQXZlcmFnZUtub3RzIC0gMTsgKytpKQorICAgIHsKKyAgICAgIHRlbXBvcmFyeVBhcmFtZXRlcnNbMF0gPSBhdmVyYWdlS25vdHNbaV07CisgICAgICBQYXJhbWV0ZXJWZWN0b3JUeXBlIHBhcmFtZXRlckluZGljZXMobnVtUGFyYW1ldGVycyk7CisgICAgICBpbnQgdGVtcG9yYXJ5UGFyYW1ldGVySW5kZXggPSAxOworICAgICAgZm9yIChEZW5zZUluZGV4IGogPSAwOyBqIDwgbnVtUGFyYW1ldGVyczsgKytqKQorICAgICAgeworICAgICAgICBTY2FsYXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tqXTsKKyAgICAgICAgaWYgKHBhcmFtZXRlciA+PSBhdmVyYWdlS25vdHNbaV0gJiYgcGFyYW1ldGVyIDwgYXZlcmFnZUtub3RzW2kgKyAxXSkKKyAgICAgICAgeworICAgICAgICAgIHBhcmFtZXRlckluZGljZXNbdGVtcG9yYXJ5UGFyYW1ldGVySW5kZXhdID0gajsKKyAgICAgICAgICB0ZW1wb3JhcnlQYXJhbWV0ZXJzW3RlbXBvcmFyeVBhcmFtZXRlckluZGV4KytdID0gcGFyYW1ldGVyOworICAgICAgICB9CisgICAgICB9CisgICAgICB0ZW1wb3JhcnlQYXJhbWV0ZXJzW3RlbXBvcmFyeVBhcmFtZXRlckluZGV4XSA9IGF2ZXJhZ2VLbm90c1tpICsgMV07CisKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IHRlbXBvcmFyeVBhcmFtZXRlckluZGV4IC0gMjsgKytqKQorICAgICAgeworICAgICAgICBmb3IgKERlbnNlSW5kZXggayA9IDA7IGsgPCBkZXJpdmF0aXZlSW5kaWNlcy5zaXplKCk7ICsraykKKyAgICAgICAgeworICAgICAgICAgIGlmIChwYXJhbWV0ZXJJbmRpY2VzW2ogKyAxXSA9PSBkZXJpdmF0aXZlSW5kaWNlc1trXQorICAgICAgICAgICAgICAmJiBwYXJhbWV0ZXJJbmRpY2VzW2ogKyAxXSAhPSAwCisgICAgICAgICAgICAgICYmIHBhcmFtZXRlckluZGljZXNbaiArIDFdICE9IG51bVBhcmFtZXRlcnMgLSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlcml2YXRpdmVLbm90c1srK25ld0tub3RJbmRleF0gPSB0ZW1wb3JhcnlQYXJhbWV0ZXJzLnNlZ21lbnQoaiwgMykubWVhbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIEtub3RWZWN0b3JUeXBlIHRlbXBvcmFyeUtub3RzKGF2ZXJhZ2VLbm90cy5zaXplKCkgKyBkZXJpdmF0aXZlS25vdHMuc2l6ZSgpKTsKKworICAgIHN0ZDo6bWVyZ2UoYXZlcmFnZUtub3RzLmRhdGEoKSwgYXZlcmFnZUtub3RzLmRhdGEoKSArIGF2ZXJhZ2VLbm90cy5zaXplKCksCisgICAgICAgICAgICAgICBkZXJpdmF0aXZlS25vdHMuZGF0YSgpLCBkZXJpdmF0aXZlS25vdHMuZGF0YSgpICsgZGVyaXZhdGl2ZUtub3RzLnNpemUoKSwKKyAgICAgICAgICAgICAgIHRlbXBvcmFyeUtub3RzLmRhdGEoKSk7CisKKyAgICAvLyBOdW1iZXIgb2Yga25vdHMgKG9uZSBmb3IgZWFjaCBwb2ludCBhbmQgZGVyaXZhdGl2ZSkgcGx1cyBzcGxpbmUgb3JkZXIuCisgICAgRGVuc2VJbmRleCBudW1Lbm90cyA9IG51bVBhcmFtZXRlcnMgKyBudW1EZXJpdmF0aXZlcyArIGRlZ3JlZSArIDE7CisgICAga25vdHMucmVzaXplKG51bUtub3RzKTsKKworICAgIGtub3RzLmhlYWQoZGVncmVlKS5maWxsKHRlbXBvcmFyeUtub3RzWzBdKTsKKyAgICBrbm90cy50YWlsKGRlZ3JlZSkuZmlsbCh0ZW1wb3JhcnlLbm90cy50ZW1wbGF0ZSB0YWlsPDE+KClbMF0pOworICAgIGtub3RzLnNlZ21lbnQoZGVncmVlLCB0ZW1wb3JhcnlLbm90cy5zaXplKCkpID0gdGVtcG9yYXJ5S25vdHM7CisgIH0KKworICAvKioKKyAgICogXGJyaWVmIENvbXB1dGVzIGNob3JkIGxlbmd0aCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSByZXF1aXJlZCBmb3Igc3BsaW5lIGludGVycG9sYXRpb24uCisgICAqIFxpbmdyb3VwIFNwbGluZXNfTW9kdWxlCisgICAqCisgICAqIFxwYXJhbVtpbl0gcHRzIFRoZSBkYXRhIHBvaW50cyB0byB3aGljaCBhIHNwbGluZSBzaG91bGQgYmUgZml0LgorICAgKiBccGFyYW1bb3V0XSBjaG9yZF9sZW5ndGhzIFRoZSByZXN1bHRpbmcgY2hvcmQgbGVuZ2d0aCB2ZWN0b3IuCisgICAqCisgICAqIFxzYSBMZXMgUGllZ2wgYW5kIFdheW5lIFRpbGxlciwgVGhlIE5VUkJTIGJvb2sgKDJuZCBlZC4pLCAxOTk3LCA5LjIuMSBHbG9iYWwgQ3VydmUgSW50ZXJwb2xhdGlvbiB0byBQb2ludCBEYXRhCisgICAqKi8gICAKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50QXJyYXlUeXBlLCB0eXBlbmFtZSBLbm90VmVjdG9yVHlwZT4KKyAgdm9pZCBDaG9yZExlbmd0aHMoY29uc3QgUG9pbnRBcnJheVR5cGUmIHB0cywgS25vdFZlY3RvclR5cGUmIGNob3JkX2xlbmd0aHMpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEtub3RWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgICAgY29uc3QgRGVuc2VJbmRleCBuID0gcHRzLmNvbHMoKTsKKworICAgIC8vIDEuIGNvbXB1dGUgdGhlIGNvbHVtbi13aXNlIG5vcm1zCisgICAgY2hvcmRfbGVuZ3Rocy5yZXNpemUocHRzLmNvbHMoKSk7CisgICAgY2hvcmRfbGVuZ3Roc1swXSA9IDA7CisgICAgY2hvcmRfbGVuZ3Rocy5yaWdodENvbHMobi0xKSA9IChwdHMuYXJyYXkoKS5sZWZ0Q29scyhuLTEpIC0gcHRzLmFycmF5KCkucmlnaHRDb2xzKG4tMSkpLm1hdHJpeCgpLmNvbHdpc2UoKS5ub3JtKCk7CisKKyAgICAvLyAyLiBjb21wdXRlIHRoZSBwYXJ0aWFsIHN1bXMKKyAgICBzdGQ6OnBhcnRpYWxfc3VtKGNob3JkX2xlbmd0aHMuZGF0YSgpLCBjaG9yZF9sZW5ndGhzLmRhdGEoKStuLCBjaG9yZF9sZW5ndGhzLmRhdGEoKSk7CisKKyAgICAvLyAzLiBub3JtYWxpemUgdGhlIGRhdGEKKyAgICBjaG9yZF9sZW5ndGhzIC89IGNob3JkX2xlbmd0aHMobi0xKTsKKyAgICBjaG9yZF9sZW5ndGhzKG4tMSkgPSBTY2FsYXIoMSk7CisgIH0KKworICAvKioKKyAgICogXGJyaWVmIFNwbGluZSBmaXR0aW5nIG1ldGhvZHMuCisgICAqIFxpbmdyb3VwIFNwbGluZXNfTW9kdWxlCisgICAqKi8gICAgIAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BsaW5lVHlwZT4KKyAgc3RydWN0IFNwbGluZUZpdHRpbmcKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHlwZTo6S25vdFZlY3RvclR5cGUgS25vdFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUeXBlOjpQYXJhbWV0ZXJWZWN0b3JUeXBlIFBhcmFtZXRlclZlY3RvclR5cGU7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgRml0cyBhbiBpbnRlcnBvbGF0aW5nIFNwbGluZSB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludHMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcHRzIFRoZSBwb2ludHMgZm9yIHdoaWNoIGFuIGludGVycG9sYXRpbmcgc3BsaW5lIHdpbGwgYmUgY29tcHV0ZWQuCisgICAgICogXHBhcmFtIGRlZ3JlZSBUaGUgZGVncmVlIG9mIHRoZSBpbnRlcnBvbGF0aW5nIHNwbGluZS4KKyAgICAgKgorICAgICAqIFxyZXR1cm5zIEEgc3BsaW5lIGludGVycG9sYXRpbmcgdGhlIGluaXRpYWxseSBwcm92aWRlZCBwb2ludHMuCisgICAgICoqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludEFycmF5VHlwZT4KKyAgICBzdGF0aWMgU3BsaW5lVHlwZSBJbnRlcnBvbGF0ZShjb25zdCBQb2ludEFycmF5VHlwZSYgcHRzLCBEZW5zZUluZGV4IGRlZ3JlZSk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgRml0cyBhbiBpbnRlcnBvbGF0aW5nIFNwbGluZSB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludHMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcHRzIFRoZSBwb2ludHMgZm9yIHdoaWNoIGFuIGludGVycG9sYXRpbmcgc3BsaW5lIHdpbGwgYmUgY29tcHV0ZWQuCisgICAgICogXHBhcmFtIGRlZ3JlZSBUaGUgZGVncmVlIG9mIHRoZSBpbnRlcnBvbGF0aW5nIHNwbGluZS4KKyAgICAgKiBccGFyYW0ga25vdF9wYXJhbWV0ZXJzIFRoZSBrbm90IHBhcmFtZXRlcnMgZm9yIHRoZSBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogXHJldHVybnMgQSBzcGxpbmUgaW50ZXJwb2xhdGluZyB0aGUgaW5pdGlhbGx5IHByb3ZpZGVkIHBvaW50cy4KKyAgICAgKiovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50QXJyYXlUeXBlPgorICAgIHN0YXRpYyBTcGxpbmVUeXBlIEludGVycG9sYXRlKGNvbnN0IFBvaW50QXJyYXlUeXBlJiBwdHMsIERlbnNlSW5kZXggZGVncmVlLCBjb25zdCBLbm90VmVjdG9yVHlwZSYga25vdF9wYXJhbWV0ZXJzKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBGaXRzIGFuIGludGVycG9sYXRpbmcgc3BsaW5lIHRvIHRoZSBnaXZlbiBkYXRhIHBvaW50cyBhbmQKKyAgICAgKiBkZXJpdmF0aXZlcy4KKyAgICAgKiAKKyAgICAgKiBccGFyYW0gcG9pbnRzIFRoZSBwb2ludHMgZm9yIHdoaWNoIGFuIGludGVycG9sYXRpbmcgc3BsaW5lIHdpbGwgYmUgY29tcHV0ZWQuCisgICAgICogXHBhcmFtIGRlcml2YXRpdmVzIFRoZSBkZXNpcmVkIGRlcml2YXRpdmVzIG9mIHRoZSBpbnRlcnBvbGF0aW5nIHNwbGluZSBhdCBpbnRlcnBvbGF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIHBvaW50cy4KKyAgICAgKiBccGFyYW0gZGVyaXZhdGl2ZUluZGljZXMgQW4gYXJyYXkgaW5kaWNhdGluZyB3aGljaCBwb2ludCBlYWNoIGRlcml2YXRpdmUgYmVsb25ncyB0by4gVGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHNpemUgYXMgQGEgZGVyaXZhdGl2ZXMuCisgICAgICogXHBhcmFtIGRlZ3JlZSBUaGUgZGVncmVlIG9mIHRoZSBpbnRlcnBvbGF0aW5nIHNwbGluZS4KKyAgICAgKgorICAgICAqIFxyZXR1cm5zIEEgc3BsaW5lIGludGVycG9sYXRpbmcgQGEgcG9pbnRzIHdpdGggQGEgZGVyaXZhdGl2ZXMgYXQgdGhvc2UgcG9pbnRzLgorICAgICAqCisgICAgICogXHNhIExlcyBBLiBQaWVnbCwgS2hhaXJhbiBSYWphYiwgVm9saGEgU21hcm9kemluYW5hLiAyMDA4LgorICAgICAqIEN1cnZlIGludGVycG9sYXRpb24gd2l0aCBkaXJlY3Rpb25hbCBjb25zdHJhaW50cyBmb3IgZW5naW5lZXJpbmcgZGVzaWduLiAKKyAgICAgKiBFbmdpbmVlcmluZyB3aXRoIENvbXB1dGVycworICAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGUsIHR5cGVuYW1lIEluZGV4QXJyYXk+CisgICAgc3RhdGljIFNwbGluZVR5cGUgSW50ZXJwb2xhdGVXaXRoRGVyaXZhdGl2ZXMoY29uc3QgUG9pbnRBcnJheVR5cGUmIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludEFycmF5VHlwZSYgZGVyaXZhdGl2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXhBcnJheSYgZGVyaXZhdGl2ZUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGRlZ3JlZSk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgRml0cyBhbiBpbnRlcnBvbGF0aW5nIHNwbGluZSB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludHMgYW5kIGRlcml2YXRpdmVzLgorICAgICAqIAorICAgICAqIFxwYXJhbSBwb2ludHMgVGhlIHBvaW50cyBmb3Igd2hpY2ggYW4gaW50ZXJwb2xhdGluZyBzcGxpbmUgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgKiBccGFyYW0gZGVyaXZhdGl2ZXMgVGhlIGRlc2lyZWQgZGVyaXZhdGl2ZXMgb2YgdGhlIGludGVycG9sYXRpbmcgc3BsaW5lIGF0IGludGVycG9sYXRpb24gcG9pbnRzLgorICAgICAqIFxwYXJhbSBkZXJpdmF0aXZlSW5kaWNlcyBBbiBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIHBvaW50IGVhY2ggZGVyaXZhdGl2ZSBiZWxvbmdzIHRvLiBUaGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyBAYSBkZXJpdmF0aXZlcy4KKyAgICAgKiBccGFyYW0gZGVncmVlIFRoZSBkZWdyZWUgb2YgdGhlIGludGVycG9sYXRpbmcgc3BsaW5lLgorICAgICAqIFxwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVycG9sYXRpb24gcG9pbnRzLgorICAgICAqCisgICAgICogXHJldHVybnMgQSBzcGxpbmUgaW50ZXJwb2xhdGluZyBAYSBwb2ludHMgd2l0aCBAYSBkZXJpdmF0aXZlcyBhdCB0aG9zZSBwb2ludHMuCisgICAgICoKKyAgICAgKiBcc2EgTGVzIEEuIFBpZWdsLCBLaGFpcmFuIFJhamFiLCBWb2xoYSBTbWFyb2R6aW5hbmEuIDIwMDguCisgICAgICogQ3VydmUgaW50ZXJwb2xhdGlvbiB3aXRoIGRpcmVjdGlvbmFsIGNvbnN0cmFpbnRzIGZvciBlbmdpbmVlcmluZyBkZXNpZ24uIAorICAgICAqIEVuZ2luZWVyaW5nIHdpdGggQ29tcHV0ZXJzCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50QXJyYXlUeXBlLCB0eXBlbmFtZSBJbmRleEFycmF5PgorICAgIHN0YXRpYyBTcGxpbmVUeXBlIEludGVycG9sYXRlV2l0aERlcml2YXRpdmVzKGNvbnN0IFBvaW50QXJyYXlUeXBlJiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRBcnJheVR5cGUmIGRlcml2YXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4QXJyYXkmIGRlcml2YXRpdmVJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBkZWdyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyVmVjdG9yVHlwZSYgcGFyYW1ldGVycyk7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNwbGluZVR5cGU+CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludEFycmF5VHlwZT4KKyAgU3BsaW5lVHlwZSBTcGxpbmVGaXR0aW5nPFNwbGluZVR5cGU+OjpJbnRlcnBvbGF0ZShjb25zdCBQb2ludEFycmF5VHlwZSYgcHRzLCBEZW5zZUluZGV4IGRlZ3JlZSwgY29uc3QgS25vdFZlY3RvclR5cGUmIGtub3RfcGFyYW1ldGVycykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHlwZTo6S25vdFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7ICAgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUeXBlOjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7ICAgICAgCisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhUeXBlOworCisgICAgS25vdFZlY3RvclR5cGUga25vdHM7CisgICAgS25vdEF2ZXJhZ2luZyhrbm90X3BhcmFtZXRlcnMsIGRlZ3JlZSwga25vdHMpOworCisgICAgRGVuc2VJbmRleCBuID0gcHRzLmNvbHMoKTsKKyAgICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpaZXJvKG4sbik7CisgICAgZm9yIChEZW5zZUluZGV4IGk9MTsgaTxuLTE7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBEZW5zZUluZGV4IHNwYW4gPSBTcGxpbmVUeXBlOjpTcGFuKGtub3RfcGFyYW1ldGVyc1tpXSwgZGVncmVlLCBrbm90cyk7CisKKyAgICAgIC8vIFRoZSBzZWdtZW50IGNhbGwgc2hvdWxkIHNvbWVob3cgYmUgdG9sZCB0aGUgc3BsaW5lIG9yZGVyIGF0IGNvbXBpbGUgdGltZS4KKyAgICAgIEEucm93KGkpLnNlZ21lbnQoc3Bhbi1kZWdyZWUsIGRlZ3JlZSsxKSA9IFNwbGluZVR5cGU6OkJhc2lzRnVuY3Rpb25zKGtub3RfcGFyYW1ldGVyc1tpXSwgZGVncmVlLCBrbm90cyk7CisgICAgfQorICAgIEEoMCwwKSA9IDEuMDsKKyAgICBBKG4tMSxuLTEpID0gMS4wOworCisgICAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihBKTsKKworICAgIC8vIEhlcmUsIHdlIGFyZSBjcmVhdGluZyBhIHRlbXBvcmFyeSBkdWUgdG8gYW4gRWlnZW4gaXNzdWUuCisgICAgQ29udHJvbFBvaW50VmVjdG9yVHlwZSBjdHJscyA9IHFyLnNvbHZlKE1hdHJpeFR5cGUocHRzLnRyYW5zcG9zZSgpKSkudHJhbnNwb3NlKCk7CisKKyAgICByZXR1cm4gU3BsaW5lVHlwZShrbm90cywgY3RybHMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNwbGluZVR5cGU+CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludEFycmF5VHlwZT4KKyAgU3BsaW5lVHlwZSBTcGxpbmVGaXR0aW5nPFNwbGluZVR5cGU+OjpJbnRlcnBvbGF0ZShjb25zdCBQb2ludEFycmF5VHlwZSYgcHRzLCBEZW5zZUluZGV4IGRlZ3JlZSkKKyAgeworICAgIEtub3RWZWN0b3JUeXBlIGNob3JkX2xlbmd0aHM7IC8vIGtub3QgcGFyYW1ldGVycworICAgIENob3JkTGVuZ3RocyhwdHMsIGNob3JkX2xlbmd0aHMpOworICAgIHJldHVybiBJbnRlcnBvbGF0ZShwdHMsIGRlZ3JlZSwgY2hvcmRfbGVuZ3Rocyk7CisgIH0KKyAgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGxpbmVUeXBlPgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGUsIHR5cGVuYW1lIEluZGV4QXJyYXk+CisgIFNwbGluZVR5cGUgCisgIFNwbGluZUZpdHRpbmc8U3BsaW5lVHlwZT46OkludGVycG9sYXRlV2l0aERlcml2YXRpdmVzKGNvbnN0IFBvaW50QXJyYXlUeXBlJiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50QXJyYXlUeXBlJiBkZXJpdmF0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXhBcnJheSYgZGVyaXZhdGl2ZUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBkZWdyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlclZlY3RvclR5cGUmIHBhcmFtZXRlcnMpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVR5cGU6Oktub3RWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOyAgICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHlwZTo6Q29udHJvbFBvaW50VmVjdG9yVHlwZSBDb250cm9sUG9pbnRWZWN0b3JUeXBlOworCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhUeXBlOworCisgICAgY29uc3QgRGVuc2VJbmRleCBuID0gcG9pbnRzLmNvbHMoKSArIGRlcml2YXRpdmVzLmNvbHMoKTsKKyAgICAKKyAgICBLbm90VmVjdG9yVHlwZSBrbm90czsKKworICAgIEtub3RBdmVyYWdpbmdXaXRoRGVyaXZhdGl2ZXMocGFyYW1ldGVycywgZGVncmVlLCBkZXJpdmF0aXZlSW5kaWNlcywga25vdHMpOworICAgIAorICAgIC8vIGZpbGwgbWF0cml4CisgICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6WmVybyhuLCBuKTsKKworICAgIC8vIFVzZSB0aGVzZSBkaW1lbnNpb25zIGZvciBxdWlja2VyIHBvcHVsYXRpbmcsIHRoZW4gdHJhbnNwb3NlIGZvciBzb2x2aW5nLgorICAgIE1hdHJpeFR5cGUgYihwb2ludHMucm93cygpLCBuKTsKKworICAgIERlbnNlSW5kZXggc3RhcnRSb3c7CisgICAgRGVuc2VJbmRleCBkZXJpdmF0aXZlU3RhcnQ7CisKKyAgICAvLyBFbmQgZGVyaXZhdGl2ZXMuCisgICAgaWYgKGRlcml2YXRpdmVJbmRpY2VzWzBdID09IDApCisgICAgeworICAgICAgQS50ZW1wbGF0ZSBibG9jazwxLCAyPigxLCAwKSA8PCAtMSwgMTsKKyAgICAgIAorICAgICAgU2NhbGFyIHkgPSAoa25vdHMoZGVncmVlICsgMSkgLSBrbm90cygwKSkgLyBkZWdyZWU7CisgICAgICBiLmNvbCgxKSA9IHkqZGVyaXZhdGl2ZXMuY29sKDApOworICAgICAgCisgICAgICBzdGFydFJvdyA9IDI7CisgICAgICBkZXJpdmF0aXZlU3RhcnQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhcnRSb3cgPSAxOworICAgICAgZGVyaXZhdGl2ZVN0YXJ0ID0gMDsKKyAgICB9CisgICAgaWYgKGRlcml2YXRpdmVJbmRpY2VzW2Rlcml2YXRpdmVzLmNvbHMoKSAtIDFdID09IHBvaW50cy5jb2xzKCkgLSAxKQorICAgIHsKKyAgICAgIEEudGVtcGxhdGUgYmxvY2s8MSwgMj4obiAtIDIsIG4gLSAyKSA8PCAtMSwgMTsKKworICAgICAgU2NhbGFyIHkgPSAoa25vdHMoa25vdHMuc2l6ZSgpIC0gMSkgLSBrbm90cyhrbm90cy5zaXplKCkgLSAoZGVncmVlICsgMikpKSAvIGRlZ3JlZTsKKyAgICAgIGIuY29sKGIuY29scygpIC0gMikgPSB5KmRlcml2YXRpdmVzLmNvbChkZXJpdmF0aXZlcy5jb2xzKCkgLSAxKTsKKyAgICB9CisgICAgCisgICAgRGVuc2VJbmRleCByb3cgPSBzdGFydFJvdzsKKyAgICBEZW5zZUluZGV4IGRlcml2YXRpdmVJbmRleCA9IGRlcml2YXRpdmVTdGFydDsKKyAgICBmb3IgKERlbnNlSW5kZXggaSA9IDE7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKSAtIDE7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBEZW5zZUluZGV4IHNwYW4gPSBTcGxpbmVUeXBlOjpTcGFuKHBhcmFtZXRlcnNbaV0sIGRlZ3JlZSwga25vdHMpOworCisgICAgICBpZiAoZGVyaXZhdGl2ZUluZGljZXNbZGVyaXZhdGl2ZUluZGV4XSA9PSBpKQorICAgICAgeworICAgICAgICBBLmJsb2NrKHJvdywgc3BhbiAtIGRlZ3JlZSwgMiwgZGVncmVlICsgMSkKKyAgICAgICAgICA9IFNwbGluZVR5cGU6OkJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhwYXJhbWV0ZXJzW2ldLCAxLCBkZWdyZWUsIGtub3RzKTsKKworICAgICAgICBiLmNvbChyb3crKykgPSBwb2ludHMuY29sKGkpOworICAgICAgICBiLmNvbChyb3crKykgPSBkZXJpdmF0aXZlcy5jb2woZGVyaXZhdGl2ZUluZGV4KyspOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBBLnJvdyhyb3crKykuc2VnbWVudChzcGFuIC0gZGVncmVlLCBkZWdyZWUgKyAxKQorICAgICAgICAgID0gU3BsaW5lVHlwZTo6QmFzaXNGdW5jdGlvbnMocGFyYW1ldGVyc1tpXSwgZGVncmVlLCBrbm90cyk7CisgICAgICB9CisgICAgfQorICAgIGIuY29sKDApID0gcG9pbnRzLmNvbCgwKTsKKyAgICBiLmNvbChiLmNvbHMoKSAtIDEpID0gcG9pbnRzLmNvbChwb2ludHMuY29scygpIC0gMSk7CisgICAgQSgwLDApID0gMTsKKyAgICBBKG4gLSAxLCBuIC0gMSkgPSAxOworICAgIAorICAgIC8vIFNvbHZlCisgICAgRnVsbFBpdkxVPE1hdHJpeFR5cGU+IGx1KEEpOworICAgIENvbnRyb2xQb2ludFZlY3RvclR5cGUgY29udHJvbFBvaW50cyA9IGx1LnNvbHZlKE1hdHJpeFR5cGUoYi50cmFuc3Bvc2UoKSkpLnRyYW5zcG9zZSgpOworCisgICAgU3BsaW5lVHlwZSBzcGxpbmUoa25vdHMsIGNvbnRyb2xQb2ludHMpOworICAgIAorICAgIHJldHVybiBzcGxpbmU7CisgIH0KKyAgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGxpbmVUeXBlPgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGUsIHR5cGVuYW1lIEluZGV4QXJyYXk+CisgIFNwbGluZVR5cGUKKyAgU3BsaW5lRml0dGluZzxTcGxpbmVUeXBlPjo6SW50ZXJwb2xhdGVXaXRoRGVyaXZhdGl2ZXMoY29uc3QgUG9pbnRBcnJheVR5cGUmIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9pbnRBcnJheVR5cGUmIGRlcml2YXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleEFycmF5JiBkZXJpdmF0aXZlSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGRlZ3JlZSkKKyAgeworICAgIFBhcmFtZXRlclZlY3RvclR5cGUgcGFyYW1ldGVyczsKKyAgICBDaG9yZExlbmd0aHMocG9pbnRzLCBwYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gSW50ZXJwb2xhdGVXaXRoRGVyaXZhdGl2ZXMocG9pbnRzLCBkZXJpdmF0aXZlcywgZGVyaXZhdGl2ZUluZGljZXMsIGRlZ3JlZSwgcGFyYW1ldGVycyk7CisgIH0KK30KKworI2VuZGlmIC8vIEVJR0VOX1NQTElORV9GSVRUSU5HX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZUZ3ZC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5NWZiZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZUZ3ZC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAxMC0yMDExIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BMSU5FU19GV0RfSAorI2RlZmluZSBFSUdFTl9TUExJTkVTX0ZXRF9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCituYW1lc3BhY2UgRWlnZW4KK3sKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgRGVncmVlID0gRHluYW1pYz4gY2xhc3MgU3BsaW5lOworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBTcGxpbmVUeXBlLCBpbnQgRGVyaXZhdGl2ZU9yZGVyID0gRHluYW1pYyA+IHN0cnVjdCBTcGxpbmVUcmFpdHMge307CisKKyAgICAvKioKKyAgICAgKiBcaW5ncm91cCBTcGxpbmVzX01vZHVsZQorICAgICAqIFxicmllZiBDb21waWxlLXRpbWUgYXR0cmlidXRlcyBvZiB0aGUgU3BsaW5lIGNsYXNzIGZvciBEeW5hbWljIGRlZ3JlZS4KKyAgICAgKiovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgICBzdHJ1Y3QgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4sIER5bmFtaWMgPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7IC8qITwgVGhlIHNwbGluZSBjdXJ2ZSdzIHNjYWxhciB0eXBlLiAqLworICAgICAgZW51bSB7IERpbWVuc2lvbiA9IF9EaW0gLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3MgZGltZW5zaW9uLiAqLyB9OworICAgICAgZW51bSB7IERlZ3JlZSA9IF9EZWdyZWUgLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3MgZGVncmVlLiAqLyB9OworCisgICAgICBlbnVtIHsgT3JkZXJBdENvbXBpbGVUaW1lID0gX0RlZ3JlZT09RHluYW1pYyA/IER5bmFtaWMgOiBfRGVncmVlKzEgLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3Mgb3JkZXIgYXQgY29tcGlsZS10aW1lLiAqLyB9OworICAgICAgZW51bSB7IE51bU9mRGVyaXZhdGl2ZXNBdENvbXBpbGVUaW1lID0gT3JkZXJBdENvbXBpbGVUaW1lIC8qITwgVGhlIG51bWJlciBvZiBkZXJpdmF0aXZlcyBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBzcGxpbmUuICovIH07CisgICAgICAKKyAgICAgIGVudW0geyBEZXJpdmF0aXZlTWVtb3J5TGF5b3V0ID0gRGltZW5zaW9uPT0xID8gUm93TWFqb3IgOiBDb2xNYWpvciAvKiE8IFRoZSBkZXJpdmF0aXZlIHR5cGUncyBtZW1vcnkgbGF5b3V0LiAqLyB9OworCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSBub24temVybyBiYXNpcyBmdW5jdGlvbnMuICovCisgICAgICB0eXBlZGVmIEFycmF5PFNjYWxhciwxLE9yZGVyQXRDb21waWxlVGltZT4gQmFzaXNWZWN0b3JUeXBlOworCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWVzIG9mIHRoZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcixOdW1PZkRlcml2YXRpdmVzQXRDb21waWxlVGltZSxPcmRlckF0Q29tcGlsZVRpbWU+IEJhc2lzRGVyaXZhdGl2ZVR5cGU7CisgICAgICAKKyAgICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIHRoZSBzcGxpbmUncyBkZXJpdmF0aXZlIHZhbHVlcy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLERpbWVuc2lvbixEeW5hbWljLERlcml2YXRpdmVNZW1vcnlMYXlvdXQsRGltZW5zaW9uLE51bU9mRGVyaXZhdGl2ZXNBdENvbXBpbGVUaW1lPiBEZXJpdmF0aXZlVHlwZTsKKworICAgICAgLyoqIFxicmllZiBUaGUgcG9pbnQgdHlwZSB0aGUgc3BsaW5lIGlzIHJlcHJlc2VudGluZy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLERpbWVuc2lvbiwxPiBQb2ludFR5cGU7CisgICAgICAKKyAgICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIGtub3QgdmVjdG9ycy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLDEsRHluYW1pYz4gS25vdFZlY3RvclR5cGU7CisKKyAgICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIHBhcmFtZXRlciB2ZWN0b3JzLiAqLworICAgICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsMSxEeW5hbWljPiBQYXJhbWV0ZXJWZWN0b3JUeXBlOworICAgICAgCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBzcGxpbmUncyBjb250cm9sIHBvaW50cy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLERpbWVuc2lvbixEeW5hbWljPiBDb250cm9sUG9pbnRWZWN0b3JUeXBlOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBcaW5ncm91cCBTcGxpbmVzX01vZHVsZQorICAgICAqIFxicmllZiBDb21waWxlLXRpbWUgYXR0cmlidXRlcyBvZiB0aGUgU3BsaW5lIGNsYXNzIGZvciBmaXhlZCBkZWdyZWUuCisgICAgICoKKyAgICAgKiBUaGUgdHJhaXRzIGNsYXNzIGluaGVyaXRzIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIFNwbGluZVRyYWl0cyBvZiBEeW5hbWljIGRlZ3JlZS4KKyAgICAgKiovCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWUsIGludCBfRGVyaXZhdGl2ZU9yZGVyID4KKyAgICBzdHJ1Y3QgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4sIF9EZXJpdmF0aXZlT3JkZXIgPiA6IHB1YmxpYyBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiA+CisgICAgeworICAgICAgZW51bSB7IE9yZGVyQXRDb21waWxlVGltZSA9IF9EZWdyZWU9PUR5bmFtaWMgPyBEeW5hbWljIDogX0RlZ3JlZSsxIC8qITwgVGhlIHNwbGluZSBjdXJ2ZSdzIG9yZGVyIGF0IGNvbXBpbGUtdGltZS4gKi8gfTsKKyAgICAgIGVudW0geyBOdW1PZkRlcml2YXRpdmVzQXRDb21waWxlVGltZSA9IF9EZXJpdmF0aXZlT3JkZXI9PUR5bmFtaWMgPyBEeW5hbWljIDogX0Rlcml2YXRpdmVPcmRlcisxIC8qITwgVGhlIG51bWJlciBvZiBkZXJpdmF0aXZlcyBkZWZpbmVkIGZvciB0aGUgY3VycmVudCBzcGxpbmUuICovIH07CisgICAgICAKKyAgICAgIGVudW0geyBEZXJpdmF0aXZlTWVtb3J5TGF5b3V0ID0gX0RpbT09MSA/IFJvd01ham9yIDogQ29sTWFqb3IgLyohPCBUaGUgZGVyaXZhdGl2ZSB0eXBlJ3MgbWVtb3J5IGxheW91dC4gKi8gfTsKKworICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIHZhbHVlcyBvZiB0aGUgYmFzaXMgZnVuY3Rpb24gZGVyaXZhdGl2ZXMuICovCisgICAgICB0eXBlZGVmIEFycmF5PF9TY2FsYXIsRHluYW1pYyxEeW5hbWljLFJvd01ham9yLE51bU9mRGVyaXZhdGl2ZXNBdENvbXBpbGVUaW1lLE9yZGVyQXRDb21waWxlVGltZT4gQmFzaXNEZXJpdmF0aXZlVHlwZTsKKyAgICAgIAorICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIHNwbGluZSdzIGRlcml2YXRpdmUgdmFsdWVzLiAqLyAgICAgIAorICAgICAgdHlwZWRlZiBBcnJheTxfU2NhbGFyLF9EaW0sRHluYW1pYyxEZXJpdmF0aXZlTWVtb3J5TGF5b3V0LF9EaW0sTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWU+IERlcml2YXRpdmVUeXBlOworICAgIH07CisKKyAgICAvKiogXGJyaWVmIDJEIGZsb2F0IEItc3BsaW5lIHdpdGggZHluYW1pYyBkZWdyZWUuICovCisgICAgdHlwZWRlZiBTcGxpbmU8ZmxvYXQsMj4gU3BsaW5lMmY7CisgICAgCisgICAgLyoqIFxicmllZiAzRCBmbG9hdCBCLXNwbGluZSB3aXRoIGR5bmFtaWMgZGVncmVlLiAqLworICAgIHR5cGVkZWYgU3BsaW5lPGZsb2F0LDM+IFNwbGluZTNmOworCisgICAgLyoqIFxicmllZiAyRCBkb3VibGUgQi1zcGxpbmUgd2l0aCBkeW5hbWljIGRlZ3JlZS4gKi8KKyAgICB0eXBlZGVmIFNwbGluZTxkb3VibGUsMj4gU3BsaW5lMmQ7CisgICAgCisgICAgLyoqIFxicmllZiAzRCBkb3VibGUgQi1zcGxpbmUgd2l0aCBkeW5hbWljIGRlZ3JlZS4gKi8KKyAgICB0eXBlZGVmIFNwbGluZTxkb3VibGUsMz4gU3BsaW5lM2Q7Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9TUExJTkVTX0ZXRF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9SRUFETUUudHh0IGIvdW5zdXBwb3J0ZWQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3OWZmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDUwIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb250cmlidXRpb25zIGZyb20gdmFyaW91cyB1c2Vycy4KK1RoZXkgYXJlIHByb3ZpZGVkICJhcyBpcyIsIHdpdGhvdXQgYW55IHN1cHBvcnQuIE5ldmVydGhlbGVzcywKK21vc3Qgb2YgdGhlbSBhcmUgc3ViamVjdCB0byBiZSBpbmNsdWRlZCBpbiBFaWdlbiBpbiB0aGUgZnV0dXJlLgorCitJbiBvcmRlciB0byB1c2UgYW4gdW5zdXBwb3J0ZWQgbW9kdWxlIHlvdSBoYXZlIHRvIGRvIGVpdGhlcjoKKworIC0gYWRkIHRoZSBwYXRoX3RvX2VpZ2VuL3Vuc3VwcG9ydGVkIGRpcmVjdG9yeSB0byB5b3VyIGluY2x1ZGUgcGF0aCBhbmQgZG86CisgICAjaW5jbHVkZSA8RWlnZW4vTW9kdWxlSGVhZGVyPgorCisgLSBvciBkaXJlY3RseSBkbzoKKyAgICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Nb2R1bGVIZWFkZXI+CisKKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBvbmUgb2YgdGhlbSwgb3IgaGF2ZSBvdGhlciBzdHVmZgoreW91IHdvdWxkIGxpa2UgdG8gc2hhcmUsIGZlZWwgZnJlZSB0byBjb250YWN0IHVzOgoraHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSNNYWlsaW5nX2xpc3QKKworQW55IGtpbmQgb2YgY29udHJpYnV0aW9ucyBhcmUgbXVjaCBhcHByZWNpYXRlZCwgZXZlbiB2ZXJ5IHByZWxpbWluYXJ5IG9uZXMuCitIb3dldmVyLCBpdDoKKyAtIG11c3QgcmVseSBvbiBFaWdlbiwKKyAtIG11c3QgYmUgaGlnaGx5IHJlbGF0ZWQgdG8gbWF0aCwKKyAtIHNob3VsZCBoYXZlIHNvbWUgZ2VuZXJhbCBwdXJwb3NlIGluIHRoZSBzZW5zZSB0aGF0IGl0IGNvdWxkCisgICBwb3RlbnRpYWxseSBiZWNvbWUgYW4gb2ZmaWNhbCBFaWdlbiBtb2R1bGUgKG9yIGJlIG1lcmdlZCBpbnRvIGFub3RoZXIgb25lKS4KKworSW4gZG91YnQgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMuIEZvciBpbnN0YW5jZSwgaWYgeW91ciBhZGRvbnMgaXMgdmVyeSB0b28gc3BlY2lmaWMKK2J1dCBpdCBzaG93cyBhbiBpbnRlcmVzdGluZyB3YXkgb2YgdXNpbmcgRWlnZW4sIHRoZW4gaXQgY291bGQgYmUgYSBuaWNlIGRlbW8uCisKKworVGhpcyBkaXJlY3RvcnkgaXMgb3JnYW5pemVkIGFzIGZvbGxvdzoKKwordW5zdXBwb3J0ZWQvRWlnZW4vTW9kdWxlSGVhZGVyMQordW5zdXBwb3J0ZWQvRWlnZW4vTW9kdWxlSGVhZGVyMgordW5zdXBwb3J0ZWQvRWlnZW4vLi4uCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS9Tb3VyY2VGaWxlMS5oCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS9Tb3VyY2VGaWxlMi5oCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS8uLi4KK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyL1NvdXJjZUZpbGUxLmgKK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyL1NvdXJjZUZpbGUyLmgKK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyLy4uLgordW5zdXBwb3J0ZWQvRWlnZW4vc3JjLy4uLgordW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzLy5jcHAgICA8LSBjb2RlIHNuaXBwZXRzIGZvciB0aGUgZG9jCit1bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvLmNwcCAgIDwtIGV4YW1wbGVzIGZvciB0aGUgZG9jCit1bnN1cHBvcnRlZC9kb2MvVHV0b3JpYWxNb2R1bGUxLmRveAordW5zdXBwb3J0ZWQvZG9jL1R1dG9yaWFsTW9kdWxlMi5kb3gKK3Vuc3VwcG9ydGVkL2RvYy8uLi4KK3Vuc3VwcG9ydGVkL3Rlc3QvLmNwcCAgICAgICAgICAgPC0gdW5pdCB0ZXN0IGZpbGVzCisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRoYW4gdGhlIG1haW4gRWlnZW4gZG9jdW1lbnRhdGlvbi4KK1RoZSAuaHRtbCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluOiBidWlsZF9kaXIvZG9jL2h0bWwvdW5zdXBwb3J0ZWQvCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2JlbmNoL2JlbmNoX3N2ZC5jcHAgYi91bnN1cHBvcnRlZC9iZW5jaC9iZW5jaF9zdmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDgyMzEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9iZW5jaC9iZW5jaF9zdmQuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMyBHYXV0aGllciBCcnVuIDxicnVuLmdhdXRoaWVyQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBOaWNvbGFzIENhcnJlIDxuaWNvbGFzLmNhcnJlQGVuc2ltYWcuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgSmVhbiBDZWNjYXRvIDxqZWFuLmNlY2NhdG9AZW5zaW1hZy5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMyBQaWVycmUgWm9wcGl0ZWxsaSA8cGllcnJlLnpvcHBpdGVsbGlAZW5zaW1hZy5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8KKworLy8gQmVuY2ggdG8gY29tcGFyZSB0aGUgZWZmaWNpZW5jeSBvZiBTVkQgYWxnb3JpdGhtcworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NWRD4KKworCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvLyBudW1iZXIgb2YgY29tcHV0YXRpb25zIG9mIGVhY2ggYWxnb3JpdGhtIGJlZm9yZSB0aGUgcHJpbnQgb2YgdGhlIHRpbWUKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxMAorI2VuZGlmCisKKy8vIG51bWJlciBvZiB0ZXN0cyBvZiB0aGUgc2FtZSB0eXBlCisjaWZuZGVmIE5VTUJFUl9TQU1QTEUKKyNkZWZpbmUgTlVNQkVSX1NBTVBMRSAyCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgYmVuY2hfc3ZkKGNvbnN0IE1hdHJpeFR5cGUmIGEgPSBNYXRyaXhUeXBlKCkpCit7CisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShhLnJvd3MoKSwgYS5jb2xzKCkpOworICBCZW5jaFRpbWVyIHRpbWVySmFjb2JpOworICBCZW5jaFRpbWVyIHRpbWVyQkRDOworICB0aW1lckphY29iaS5yZXNldCgpOworICB0aW1lckJEQy5yZXNldCgpOworCisgIGNvdXQgPDwgIiBPbmx5IGNvbXB1dGUgU2luZ3VsYXIgVmFsdWVzIiA8PGVuZGw7CisgIGZvciAoaW50IGs9MTsgazw9TlVNQkVSX1NBTVBMRTsgKytrKQorICB7CisgICAgdGltZXJCREMuc3RhcnQoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8UkVQRUFUOyArK2kpIAorICAgIHsKKyAgICAgIEJEQ1NWRDxNYXRyaXhUeXBlPiBiZGNfbWF0cml4KG0pOworICAgIH0KKyAgICB0aW1lckJEQy5zdG9wKCk7CisgICAgCisgICAgdGltZXJKYWNvYmkuc3RhcnQoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8UkVQRUFUOyArK2kpIAorICAgIHsKKyAgICAgIEphY29iaVNWRDxNYXRyaXhUeXBlPiBqYWNvYmlfbWF0cml4KG0pOworICAgIH0KKyAgICB0aW1lckphY29iaS5zdG9wKCk7CisKKworICAgIGNvdXQgPDwgIlNhbXBsZSAiIDw8IGsgPDwgIiA6ICIgPDwgUkVQRUFUIDw8ICIgY29tcHV0YXRpb25zIDogIEphY29iaSA6ICIgPDwgZml4ZWQgPDwgdGltZXJKYWNvYmkudmFsdWUoKSA8PCAicyAiOworICAgIGNvdXQgPDwgIiB8fCAiIDw8ICIgQkRDIDogIiA8PCB0aW1lckJEQy52YWx1ZSgpIDw8ICJzICIgPDxlbmRsIDw8ZW5kbDsKKyAgICAgIAorICAgIGlmICh0aW1lckJEQy52YWx1ZSgpID49IHRpbWVySmFjb2JpLnZhbHVlKCkpICAKKyAgICAgIGNvdXQgPDwgIktPIDogQkRDIGlzICIgPDwgIHRpbWVySmFjb2JpLnZhbHVlKCkgLyB0aW1lckJEQy52YWx1ZSgpIDw8ICIgIHRpbWVzIGZhc3RlciB0aGFuIEphY29iaSIgPDxlbmRsOworICAgIGVsc2UgCisgICAgICBjb3V0IDw8ICJPSyA6IEJEQyBpcyAiIDw8IHRpbWVySmFjb2JpLnZhbHVlKCkgLyB0aW1lckJEQy52YWx1ZSgpIDw8ICIgIHRpbWVzIGZhc3RlciB0aGFuIEphY29iaSIgIDw8ZW5kbDsKKyAgICAgIAorICB9CisgIGNvdXQgPDwgIiAgICAgICA9PT09PT09PT09PT09PT09PSIgPDxlbmRsOworICBzdGQ6OmNvdXQ8PCBzdGQ6OmVuZGw7CisgIHRpbWVySmFjb2JpLnJlc2V0KCk7CisgIHRpbWVyQkRDLnJlc2V0KCk7CisgIGNvdXQgPDwgIiBDb21wdXRlcyByb3RhaW9uIG1hdHJpeCIgPDxlbmRsOworICBmb3IgKGludCBrPTE7IGs8PU5VTUJFUl9TQU1QTEU7ICsraykKKyAgeworICAgIHRpbWVyQkRDLnN0YXJ0KCk7CisgICAgZm9yIChpbnQgaT0wOyBpPFJFUEVBVDsgKytpKSAKKyAgICB7CisgICAgICBCRENTVkQ8TWF0cml4VHlwZT4gYmRjX21hdHJpeChtLCBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgICB9CisgICAgdGltZXJCREMuc3RvcCgpOworICAgIAorICAgIHRpbWVySmFjb2JpLnN0YXJ0KCk7CisgICAgZm9yIChpbnQgaT0wOyBpPFJFUEVBVDsgKytpKSAKKyAgICB7CisgICAgICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gamFjb2JpX21hdHJpeChtLCBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgICB9CisgICAgdGltZXJKYWNvYmkuc3RvcCgpOworCisKKyAgICBjb3V0IDw8ICJTYW1wbGUgIiA8PCBrIDw8ICIgOiAiIDw8IFJFUEVBVCA8PCAiIGNvbXB1dGF0aW9ucyA6ICBKYWNvYmkgOiAiIDw8IGZpeGVkIDw8IHRpbWVySmFjb2JpLnZhbHVlKCkgPDwgInMgIjsKKyAgICBjb3V0IDw8ICIgfHwgIiA8PCAiIEJEQyA6ICIgPDwgdGltZXJCREMudmFsdWUoKSA8PCAicyAiIDw8ZW5kbCA8PGVuZGw7CisgICAgICAKKyAgICBpZiAodGltZXJCREMudmFsdWUoKSA+PSB0aW1lckphY29iaS52YWx1ZSgpKSAgCisgICAgICBjb3V0IDw8ICJLTyA6IEJEQyBpcyAiIDw8ICB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiIDw8ZW5kbDsKKyAgICBlbHNlIAorICAgICAgY291dCA8PCAiT0sgOiBCREMgaXMgIiA8PCB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiICA8PGVuZGw7CisgICAgICAKKyAgfQorICBzdGQ6OmNvdXQ8PCBzdGQ6OmVuZGw7Cit9CisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICBzdGQ6OmNvdXQ8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDYsIDYpIE1hdHJpeCIgPDxzdGQ6OmVuZGw7CisgIGJlbmNoX3N2ZDxNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4gPihNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4oNiwgNikpOworICAKKyAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDMyLCAzMikgTWF0cml4IiA8PHN0ZDo6ZW5kbDsKKyAgYmVuY2hfc3ZkPE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPiA+KE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPigzMiwgMzIpKTsKKworICAvL3N0ZDo6Y291dDw8Ik9uIGEgKER5bmFtaWMsIER5bmFtaWMpICgxMjgsIDEyOCkgTWF0cml4IiA8PHN0ZDo6ZW5kbDsKKyAgLy9iZW5jaF9zdmQ8TWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+ID4oTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KDEyOCwgMTI4KSk7CisKKyAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDE2MCwgMTYwKSBNYXRyaXgiIDw8c3RkOjplbmRsOworICBiZW5jaF9zdmQ8TWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+ID4oTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KDE2MCwgMTYwKSk7CisgIAorICBzdGQ6OmNvdXQ8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iPDwgc3RkOjplbmRsOworICAgICAgICAgICAKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL2RvYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTlhYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNCBAQAorc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgRVhDTFVERV9GUk9NX0FMTCBUUlVFKQorCithZGRfc3ViZGlyZWN0b3J5KGV4YW1wbGVzKQorYWRkX3N1YmRpcmVjdG9yeShzbmlwcGV0cykKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9PdmVydmlldy5kb3ggYi91bnN1cHBvcnRlZC9kb2MvT3ZlcnZpZXcuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDY0YTUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvT3ZlcnZpZXcuZG94CkBAIC0wLDAgKzEsMjggQEAKKy8vLyBcYnJpZWYgTmFtZXNwYWNlIGNvbnRhaW5pbmcgYWxsIHN5bWJvbHMgZnJvbSB0aGUgJUVpZ2VuIGxpYnJhcnkuCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXG1haW5wYWdlICVFaWdlbidzIHVuc3VwcG9ydGVkIG1vZHVsZXMKKworVGhpcyBpcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yICVFaWdlbidzIHVuc3VwcG9ydGVkIG1vZHVsZXMuCisKK1RoZXNlIG1vZHVsZXMgYXJlIGNvbnRyaWJ1dGlvbnMgZnJvbSB2YXJpb3VzIHVzZXJzLiBUaGV5IGFyZSBwcm92aWRlZCAiYXMgaXMiLCB3aXRob3V0IGFueSBzdXBwb3J0LgorCitDbGljayBvbiB0aGUgXGUgTW9kdWxlcyB0YWIgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgdW5zdXBwb3J0ZWQgbW9kdWxlcy4KKworRG9uJ3QgbWlzcyB0aGUgPGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+b2ZmaWNpYWwgRWlnZW4gZG9jdW1lbnRhdGlvbjwvYT4uCisKKyovCisKKy8qCisKK1xkZWZncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzIFVuc3VwcG9ydGVkIG1vZHVsZXMKKworVGhlIHVuc3VwcG9ydGVkIG1vZHVsZXMgYXJlIGNvbnRyaWJ1dGlvbnMgZnJvbSB2YXJpb3VzIHVzZXJzLiBUaGV5IGFyZQorcHJvdmlkZWQgImFzIGlzIiwgd2l0aG91dCBhbnkgc3VwcG9ydC4gTmV2ZXJ0aGVsZXNzLCBzb21lIG9mIHRoZW0gYXJlCitzdWJqZWN0IHRvIGJlIGluY2x1ZGVkIGluICVFaWdlbiBpbiB0aGUgZnV0dXJlLgorCisqLworCisvLy8gXGludGVybmFsIFxicmllZiBOYW1lc3BhY2UgY29udGFpbmluZyBsb3ctbGV2ZWwgcm91dGluZXMgZnJvbSB0aGUgJUVpZ2VuIGxpYnJhcnkuCituYW1lc3BhY2UgaW50ZXJuYWwge30KK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9laWdlbmRveHlfbGF5b3V0LnhtbC5pbiBiL3Vuc3VwcG9ydGVkL2RvYy9laWdlbmRveHlfbGF5b3V0LnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM2MjFlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2VpZ2VuZG94eV9sYXlvdXQueG1sLmluCkBAIC0wLDAgKzEsMTc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxkb3h5Z2VubGF5b3V0IHZlcnNpb249IjEuMCI+CisgIDwhLS0gTmF2aWdhdGlvbiBpbmRleCB0YWJzIGZvciBIVE1MIG91dHB1dCAtLT4KKyAgPG5hdmluZGV4PgorICAgIDx0YWIgdHlwZT0idXNlciIgdXJsPSJpbmRleC5odG1sIiB0aXRsZT0iT3ZlcnZpZXciIC8+CisgICAgPHRhYiB0eXBlPSJtb2R1bGVzIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSJVbnN1cHBvcnRlZCBNb2R1bGVzIiBpbnRybz0iIi8+Cis8IS0tICAgICA8dGFiIHR5cGU9Im1haW5wYWdlIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4gLS0+CisgICAgPHRhYiB0eXBlPSJjbGFzc2xpc3QiIHZpc2libGU9InllcyIgdGl0bGU9IiIgaW50cm89IiIvPgorPCEtLSAgICAgPHRhYiB0eXBlPSJjbGFzc21lbWJlcnMiIHZpc2libGU9InllcyIgdGl0bGU9IiIgaW50cm89IiIvPiAtLT4KKyAgPC9uYXZpbmRleD4KKworICA8IS0tIExheW91dCBkZWZpbml0aW9uIGZvciBhIGNsYXNzIHBhZ2UgLS0+CisgIDxjbGFzcz4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJubyIvPgorICAgIDxpbmNsdWRlcyB2aXNpYmxlPSIkU0hPV19JTkNMVURFX0ZJTEVTIi8+CisgICAgPGRldGFpbGVkZGVzY3JpcHRpb24gdGl0bGU9IiIvPgorICAgIDxpbmhlcml0YW5jZWdyYXBoIHZpc2libGU9IiRDTEFTU19HUkFQSCIvPgorICAgIDxjb2xsYWJvcmF0aW9uZ3JhcGggdmlzaWJsZT0iJENPTExBQk9SQVRJT05fR1JBUEgiLz4KKyAgICA8YWxsbWVtYmVyc2xpbmsgdmlzaWJsZT0ieWVzIi8+CisgICAgPG1lbWJlcmRlY2w+CisgICAgICA8bmVzdGVkY2xhc3NlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWN0eXBlcyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHNpZ25hbHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY21ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3N0YXRpY21ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY2F0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3N0YXRpY2F0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHR5cGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkc3RhdGljbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkc3RhdGljYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cGFja2FnZXR5cGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwYWNrYWdlbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cGFja2FnZXN0YXRpY21ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHBhY2thZ2VhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwYWNrYWdlc3RhdGljYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cHJvcGVydGllcyB0aXRsZT0iIi8+CisgICAgICA8ZXZlbnRzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRldHlwZXMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZW1ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVzdGF0aWNtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXN0YXRpY2F0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPGZyaWVuZHMgdGl0bGU9IiIvPgorICAgICAgPHJlbGF0ZWQgdGl0bGU9IiIgc3VidGl0bGU9IiIvPgorICAgICAgPG1lbWJlcmdyb3VwcyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8L21lbWJlcmRlY2w+CisgICAgCisgICAgPG1lbWJlcmRlZj4KKyAgICAgIDxpbmxpbmVjbGFzc2VzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGNvbnN0cnVjdG9ycyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDxyZWxhdGVkIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgICAgPHByb3BlcnRpZXMgdGl0bGU9IiIvPgorICAgICAgPGV2ZW50cyB0aXRsZT0iIi8+CisgICAgPC9tZW1iZXJkZWY+CisgICAgPHVzZWRmaWxlcyB2aXNpYmxlPSIkU0hPV19VU0VEX0ZJTEVTIi8+CisgICAgPGF1dGhvcnNlY3Rpb24gdmlzaWJsZT0ieWVzIi8+CisgIDwvY2xhc3M+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBuYW1lc3BhY2UgcGFnZSAtLT4KKyAgPG5hbWVzcGFjZT4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8bWVtYmVyZGVjbD4KKyAgICAgIDxuZXN0ZWRuYW1lc3BhY2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGNsYXNzZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8bWVtYmVyZ3JvdXBzIHZpc2libGU9InllcyIvPgorICAgIDwvbWVtYmVyZGVjbD4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPG1lbWJlcmRlZj4KKyAgICAgIDxpbmxpbmVjbGFzc2VzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICA8L21lbWJlcmRlZj4KKyAgICA8YXV0aG9yc2VjdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgPC9uYW1lc3BhY2U+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBmaWxlIHBhZ2UgLS0+CisgIDxmaWxlPgorICAgIDxicmllZmRlc2NyaXB0aW9uIHZpc2libGU9InllcyIvPgorICAgIDxpbmNsdWRlcyB2aXNpYmxlPSIkU0hPV19JTkNMVURFX0ZJTEVTIi8+CisgICAgPGluY2x1ZGVncmFwaCB2aXNpYmxlPSIkSU5DTFVERV9HUkFQSCIvPgorICAgIDxpbmNsdWRlZGJ5Z3JhcGggdmlzaWJsZT0iJElOQ0xVREVEX0JZX0dSQVBIIi8+CisgICAgPHNvdXJjZWxpbmsgdmlzaWJsZT0ieWVzIi8+CisgICAgPG1lbWJlcmRlY2w+CisgICAgICA8Y2xhc3NlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxuYW1lc3BhY2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGRlZmluZXMgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgICAgPG1lbWJlcmdyb3VwcyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8L21lbWJlcmRlY2w+CisgICAgPGRldGFpbGVkZGVzY3JpcHRpb24gdGl0bGU9IiIvPgorICAgIDxtZW1iZXJkZWY+CisgICAgICA8aW5saW5lY2xhc3NlcyB0aXRsZT0iIi8+CisgICAgICA8ZGVmaW5lcyB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgPC9tZW1iZXJkZWY+CisgICAgPGF1dGhvcnNlY3Rpb24vPgorICA8L2ZpbGU+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBncm91cCBwYWdlIC0tPgorICA8Z3JvdXA+CisgICAgPGJyaWVmZGVzY3JpcHRpb24gdmlzaWJsZT0ibm8iLz4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPGdyb3VwZ3JhcGggdmlzaWJsZT0iJEdST1VQX0dSQVBIUyIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPG5lc3RlZGdyb3VwcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxkaXJzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGZpbGVzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPG5hbWVzcGFjZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8Y2xhc3NlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxkZWZpbmVzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGVudW12YWx1ZXMgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICAgIDxzaWduYWxzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVzbG90cyB0aXRsZT0iIi8+CisgICAgICA8ZXZlbnRzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm9wZXJ0aWVzIHRpdGxlPSIiLz4KKyAgICAgIDxmcmllbmRzIHRpdGxlPSIiLz4KKyAgICAgIDxtZW1iZXJncm91cHMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICAgIAorICAgIDxtZW1iZXJkZWY+CisgICAgICA8cGFnZWRvY3MvPgorICAgICAgPGlubGluZWNsYXNzZXMgdGl0bGU9IiIvPgorICAgICAgPGRlZmluZXMgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXZhbHVlcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgICAgPHNpZ25hbHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3Nsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxldmVudHMgdGl0bGU9IiIvPgorICAgICAgPHByb3BlcnRpZXMgdGl0bGU9IiIvPgorICAgICAgPGZyaWVuZHMgdGl0bGU9IiIvPgorICAgIDwvbWVtYmVyZGVmPgorICAgIDxhdXRob3JzZWN0aW9uIHZpc2libGU9InllcyIvPgorICA8L2dyb3VwPgorCisgIDwhLS0gTGF5b3V0IGRlZmluaXRpb24gZm9yIGEgZGlyZWN0b3J5IHBhZ2UgLS0+CisgIDxkaXJlY3Rvcnk+CisgICAgPGJyaWVmZGVzY3JpcHRpb24gdmlzaWJsZT0ieWVzIi8+CisgICAgPGRpcmVjdG9yeWdyYXBoIHZpc2libGU9InllcyIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPGRpcnMgdmlzaWJsZT0ieWVzIi8+CisgICAgICA8ZmlsZXMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICAgIDxkZXRhaWxlZGRlc2NyaXB0aW9uIHRpdGxlPSIiLz4KKyAgPC9kaXJlY3Rvcnk+Cis8L2RveHlnZW5sYXlvdXQ+CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvQlZIX0V4YW1wbGUuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0JWSF9FeGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIwYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0JWSF9FeGFtcGxlLmNwcApAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8RWlnZW4vU3RkVmVjdG9yPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0JWSD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordHlwZWRlZiBBbGlnbmVkQm94PGRvdWJsZSwgMj4gQm94MmQ7CisKK25hbWVzcGFjZSBFaWdlbiB7CisgIEJveDJkIGJvdW5kaW5nX2JveChjb25zdCBWZWN0b3IyZCAmdikgeyByZXR1cm4gQm94MmQodiwgdik7IH0gLy9jb21wdXRlIHRoZSBib3VuZGluZyBib3ggb2YgYSBzaW5nbGUgcG9pbnQKK30KKworc3RydWN0IFBvaW50UG9pbnRNaW5pbWl6ZXIgLy9ob3cgdG8gY29tcHV0ZSBzcXVhcmVkIGRpc3RhbmNlcyBiZXR3ZWVuIHBvaW50cyBhbmQgcmVjdGFuZ2xlcworeworICBQb2ludFBvaW50TWluaW1pemVyKCkgOiBjYWxscygwKSB7fQorICB0eXBlZGVmIGRvdWJsZSBTY2FsYXI7CisKKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZVZvbHVtZShjb25zdCBCb3gyZCAmcjEsIGNvbnN0IEJveDJkICZyMikgeyArK2NhbGxzOyByZXR1cm4gcjEuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocjIpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWVPYmplY3QoY29uc3QgQm94MmQgJnIsIGNvbnN0IFZlY3RvcjJkICZ2KSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RWb2x1bWUoY29uc3QgVmVjdG9yMmQgJnYsIGNvbnN0IEJveDJkICZyKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgVmVjdG9yMmQgJnYxLCBjb25zdCBWZWN0b3IyZCAmdjIpIHsgKytjYWxsczsgcmV0dXJuICh2MSAtIHYyKS5zcXVhcmVkTm9ybSgpOyB9CisKKyAgaW50IGNhbGxzOworfTsKKworaW50IG1haW4oKQoreworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZlY3RvcjJkLCBhbGlnbmVkX2FsbG9jYXRvcjxWZWN0b3IyZD4gPiBTdGRWZWN0b3JPZlZlY3RvcjJkOworICBTdGRWZWN0b3JPZlZlY3RvcjJkIHJlZFBvaW50cywgYmx1ZVBvaW50czsKKyAgZm9yKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7IC8vaW5pdGlhbGl6ZSByYW5kb20gc2V0IG9mIHJlZCBwb2ludHMgYW5kIGJsdWUgcG9pbnRzCisgICAgcmVkUG9pbnRzLnB1c2hfYmFjayhWZWN0b3IyZDo6UmFuZG9tKCkpOworICAgIGJsdWVQb2ludHMucHVzaF9iYWNrKFZlY3RvcjJkOjpSYW5kb20oKSk7CisgIH0KKworICBQb2ludFBvaW50TWluaW1pemVyIG1pbmltaXplcjsKKyAgZG91YmxlIG1pbkRpc3RTcSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisKKyAgLy9icnV0ZSBmb3JjZSB0byBmaW5kIGNsb3Nlc3QgcmVkLWJsdWUgcGFpcgorICBmb3IoaW50IGkgPSAwOyBpIDwgKGludClyZWRQb2ludHMuc2l6ZSgpOyArK2kpCisgICAgZm9yKGludCBqID0gMDsgaiA8IChpbnQpYmx1ZVBvaW50cy5zaXplKCk7ICsraikKKyAgICAgIG1pbkRpc3RTcSA9IHN0ZDo6bWluKG1pbkRpc3RTcSwgbWluaW1pemVyLm1pbmltdW1Pbk9iamVjdE9iamVjdChyZWRQb2ludHNbaV0sIGJsdWVQb2ludHNbal0pKTsKKyAgc3RkOjpjb3V0IDw8ICJCcnV0ZSBmb3JjZSBkaXN0YW5jZSA9ICIgPDwgc3FydChtaW5EaXN0U3EpIDw8ICIsIGNhbGxzID0gIiA8PCBtaW5pbWl6ZXIuY2FsbHMgPDwgc3RkOjplbmRsOworCisgIC8vdXNpbmcgQlZIIHRvIGZpbmQgY2xvc2VzdCByZWQtYmx1ZSBwYWlyCisgIG1pbmltaXplci5jYWxscyA9IDA7CisgIEtkQlZIPGRvdWJsZSwgMiwgVmVjdG9yMmQ+IHJlZFRyZWUocmVkUG9pbnRzLmJlZ2luKCksIHJlZFBvaW50cy5lbmQoKSksIGJsdWVUcmVlKGJsdWVQb2ludHMuYmVnaW4oKSwgYmx1ZVBvaW50cy5lbmQoKSk7IC8vY29uc3RydWN0IHRoZSB0cmVlcworICBtaW5EaXN0U3EgPSBCVk1pbmltaXplKHJlZFRyZWUsIGJsdWVUcmVlLCBtaW5pbWl6ZXIpOyAvL2FjdHVhbCBCVkggbWluaW1pemF0aW9uIGNhbGwKKyAgc3RkOjpjb3V0IDw8ICJCVkggZGlzdGFuY2UgICAgICAgICA9ICIgPDwgc3FydChtaW5EaXN0U3EpIDw8ICIsIGNhbGxzID0gIiA8PCBtaW5pbWl6ZXIuY2FsbHMgPDwgc3RkOjplbmRsOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzY0NmQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMCBAQAorRklMRShHTE9CIGV4YW1wbGVzX1NSQ1MgIiouY3BwIikKKworQUREX0NVU1RPTV9UQVJHRVQodW5zdXBwb3J0ZWRfZXhhbXBsZXMpCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoLi4vLi4vLi4vdW5zdXBwb3J0ZWQgLi4vLi4vLi4vdW5zdXBwb3J0ZWQvdGVzdCkKKworRk9SRUFDSChleGFtcGxlX3NyYyAke2V4YW1wbGVzX1NSQ1N9KQorICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKGV4YW1wbGUgJHtleGFtcGxlX3NyY30gTkFNRV9XRSkKKyAgQUREX0VYRUNVVEFCTEUoZXhhbXBsZV8ke2V4YW1wbGV9ICR7ZXhhbXBsZV9zcmN9KQorICBpZihFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZXhhbXBsZV8ke2V4YW1wbGV9ICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBlbmRpZigpCisgIEFERF9DVVNUT01fQ09NTUFORCgKKyAgICBUQVJHRVQgZXhhbXBsZV8ke2V4YW1wbGV9CisgICAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgZXhhbXBsZV8ke2V4YW1wbGV9CisgICAgQVJHUyA+JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7ZXhhbXBsZX0ub3V0CisgICkKKyAgQUREX0RFUEVOREVOQ0lFUyh1bnN1cHBvcnRlZF9leGFtcGxlcyBleGFtcGxlXyR7ZXhhbXBsZX0pCitFTkRGT1JFQUNIKGV4YW1wbGVfc3JjKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0V1bGVyQW5nbGVzLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9FdWxlckFuZ2xlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmNmFlZQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9FdWxlckFuZ2xlcy5jcHAKQEAgLTAsMCArMSw0NiBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0V1bGVyQW5nbGVzPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgLy8gQSBjb21tb24gRXVsZXIgc3lzdGVtIGJ5IG1hbnkgYXJtaWVzIGFyb3VuZCB0aGUgd29ybGQsCisgIC8vICB3aGVyZSB0aGUgZmlyc3Qgb25lIGlzIHRoZSBhemltdXRoKHRoZSBhbmdsZSBmcm9tIHRoZSBub3J0aCAtCisgIC8vICAgdGhlIHNhbWUgYW5nbGUgdGhhdCBpcyBzaG93IGluIGNvbXBhc3MpCisgIC8vICBhbmQgdGhlIHNlY29uZCBvbmUgaXMgZWxldmF0aW9uKHRoZSBhbmdsZSBmcm9tIHRoZSBob3Jpem9uKQorICAvLyAgYW5kIHRoZSB0aGlyZCBvbmUgaXMgcm9sbCh0aGUgYW5nbGUgYmV0d2VlbiB0aGUgaG9yaXpvbnRhbCBib2R5CisgIC8vICAgZGlyZWN0aW9uIGFuZCB0aGUgcGxhbmUgZ3JvdW5kIHN1cmZhY2UpCisgIC8vIEtlZXAgcmVtZW1iZXJpbmcgd2UncmUgdXNpbmcgcmFkaWFuIGFuZ2xlcyBoZXJlIQorICB0eXBlZGVmIEV1bGVyU3lzdGVtPC1FVUxFUl9aLCBFVUxFUl9ZLCBFVUxFUl9YPiBNeUFybXlTeXN0ZW07CisgIHR5cGVkZWYgRXVsZXJBbmdsZXM8ZG91YmxlLCBNeUFybXlTeXN0ZW0+IE15QXJteUFuZ2xlczsKKyAgCisgIE15QXJteUFuZ2xlcyB2ZWhpY2xlQW5nbGVzKAorICAgIDMuMTQvKlBJKi8gLyAyLCAvKiBoZWFkaW5nIHRvIGVhc3QsIG5vdGljZSB0aGF0IHRoaXMgYW5nbGUgaXMgY291bnRlci1jbG9ja3dpc2UgKi8KKyAgICAtMC4zLCAvKiBnb2luZyBkb3duIGZyb20gYSBtb3VudGFpbiAqLworICAgIDAuMSk7IC8qIHNsaWdodGx5IHJvbGxlZCB0byB0aGUgcmlnaHQgKi8KKyAgCisgIC8vIFNvbWUgRXVsZXIgYW5nbGVzIHJlcHJlc2VudGF0aW9uIHRoYXQgb3VyIHBsYW5lIHVzZS4KKyAgRXVsZXJBbmdsZXNaWVpkIHBsYW5lQW5nbGVzKDAuNzg0NzQsIDAuNTI3MSwgLTAuNTEzNzk0KTsKKyAgCisgIE15QXJteUFuZ2xlcyBwbGFuZUFuZ2xlc0luTXlBcm15QW5nbGVzID0gTXlBcm15QW5nbGVzOjpGcm9tUm90YXRpb248dHJ1ZSwgZmFsc2UsIGZhbHNlPihwbGFuZUFuZ2xlcyk7CisgIAorICBzdGQ6OmNvdXQgPDwgInZlaGljbGUgYW5nbGVzKE15QXJteSk6ICAgICAiIDw8IHZlaGljbGVBbmdsZXMgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgInBsYW5lIGFuZ2xlcyhaWVopOiAgICAgICAgIiA8PCBwbGFuZUFuZ2xlcyA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAicGxhbmUgYW5nbGVzKE15QXJteSk6ICAgICAiIDw8IHBsYW5lQW5nbGVzSW5NeUFybXlBbmdsZXMgPDwgc3RkOjplbmRsOworICAKKyAgLy8gTm93IGxldHMgcm90YXRlIHRoZSBwbGFuZSBhIGxpdHRsZSBiaXQKKyAgc3RkOjpjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICBzdGQ6OmNvdXQgPDwgInJvdGF0aW5nIHBsYW5lIG5vdyFcbiI7CisgIHN0ZDo6Y291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgCisgIFF1YXRlcm5pb25kIHBsYW5lUm90YXRlZCA9IEFuZ2xlQXhpc2QoLTAuMzQyLCBWZWN0b3IzZDo6VW5pdFkoKSkgKiBwbGFuZUFuZ2xlczsKKyAgCisgIHBsYW5lQW5nbGVzID0gcGxhbmVSb3RhdGVkOworICBwbGFuZUFuZ2xlc0luTXlBcm15QW5nbGVzID0gTXlBcm15QW5nbGVzOjpGcm9tUm90YXRpb248dHJ1ZSwgZmFsc2UsIGZhbHNlPihwbGFuZVJvdGF0ZWQpOworICAKKyAgc3RkOjpjb3V0IDw8ICJuZXcgcGxhbmUgYW5nbGVzKFpZWik6ICAgICAiIDw8IHBsYW5lQW5nbGVzIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJuZXcgcGxhbmUgYW5nbGVzKE15QXJteSk6ICIgPDwgcGxhbmVBbmdsZXNJbk15QXJteUFuZ2xlcyA8PCBzdGQ6OmVuZGw7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9GRlQuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0ZGVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZjgxMgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9GRlQuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvLyAgVG8gdXNlIHRoZSBzaW1wbGUgRkZUIGltcGxlbWVudGF0aW9uCisvLyAgZysrIC1vIGRlbW9mZnQgLUkuLiAtV2FsbCAtTzMgRkZULmNwcCAKKworLy8gIFRvIHVzZSB0aGUgRkZUVyBpbXBsZW1lbnRhdGlvbgorLy8gIGcrKyAtbyBkZW1vZmZ0IC1JLi4gLURVU0VfRkZUVyAtV2FsbCAtTzMgRkZULmNwcCAtbGZmdHczIC1sZmZ0dzNmIC1sZmZ0dzNsCisKKyNpZmRlZiBVU0VfRkZUVworI2luY2x1ZGUgPGZmdHczLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0ZGVD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG1hZzIoVCBhKQoreworICAgIHJldHVybiBhKmE7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbWFnMihzdGQ6OmNvbXBsZXg8VD4gYSkKK3sKKyAgICByZXR1cm4gbm9ybShhKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG1hZzIoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJiB2ZWMpCit7CisgICAgVCBvdXQ9MDsKKyAgICBmb3IgKHNpemVfdCBrPTA7azx2ZWMuc2l6ZSgpOysraykKKyAgICAgICAgb3V0ICs9IG1hZzIodmVjW2tdKTsKKyAgICByZXR1cm4gb3V0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbWFnMihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmNvbXBsZXg8VD4gPiAmIHZlYykKK3sKKyAgICBUIG91dD0wOworICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQorICAgICAgICBvdXQgKz0gbWFnMih2ZWNba10pOworICAgIHJldHVybiBvdXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordmVjdG9yPFQ+IG9wZXJhdG9yLShjb25zdCB2ZWN0b3I8VD4gJiBhLGNvbnN0IHZlY3RvcjxUPiAmIGIgKQoreworICAgIHZlY3RvcjxUPiBjKGEpOworICAgIGZvciAoc2l6ZV90IGs9MDtrPGIuc2l6ZSgpOysraykgCisgICAgICAgIGNba10gLT0gYltrXTsKKyAgICByZXR1cm4gYzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFJhbmRvbUZpbGwoc3RkOjp2ZWN0b3I8VD4gJiB2ZWMpCit7CisgICAgZm9yIChzaXplX3Qgaz0wO2s8dmVjLnNpemUoKTsrK2spCisgICAgICAgIHZlY1trXSA9IFQoIHJhbmQoKSApL1QoUkFORF9NQVgpIC0gLjU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBSYW5kb21GaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6Y29tcGxleDxUPiA+ICYgdmVjKQoreworICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQorICAgICAgICB2ZWNba10gPSBzdGQ6OmNvbXBsZXg8VD4gKCBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIC41LCBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIC41KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRfdGltZSx0eXBlbmFtZSBUX2ZyZXE+Cit2b2lkIGZ3ZF9pbnYoc2l6ZV90IG5mZnQpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8VF9mcmVxPjo6UmVhbCBTY2FsYXI7CisgICAgdmVjdG9yPFRfdGltZT4gdGltZWJ1ZihuZmZ0KTsKKyAgICBSYW5kb21GaWxsKHRpbWVidWYpOworCisgICAgdmVjdG9yPFRfZnJlcT4gZnJlcWJ1ZjsKKyAgICBzdGF0aWMgRkZUPFNjYWxhcj4gZmZ0OworICAgIGZmdC5md2QoZnJlcWJ1Zix0aW1lYnVmKTsKKworICAgIHZlY3RvcjxUX3RpbWU+IHRpbWVidWYyOworICAgIGZmdC5pbnYodGltZWJ1ZjIsZnJlcWJ1Zik7CisKKyAgICBsb25nIGRvdWJsZSBybXNlID0gbWFnMih0aW1lYnVmIC0gdGltZWJ1ZjIpIC8gbWFnMih0aW1lYnVmKTsKKyAgICBjb3V0IDw8ICJyb3VuZHRyaXAgcm1zZTogIiA8PCBybXNlIDw8IGVuZGw7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUX3NjYWxhcj4KK3ZvaWQgdHdvX2RlbW9zKGludCBuZmZ0KQoreworICAgIGNvdXQgPDwgIiAgICAgc2NhbGFyICI7CisgICAgZndkX2ludjxUX3NjYWxhcixzdGQ6OmNvbXBsZXg8VF9zY2FsYXI+ID4obmZmdCk7CisgICAgY291dCA8PCAiICAgIGNvbXBsZXggIjsKKyAgICBmd2RfaW52PHN0ZDo6Y29tcGxleDxUX3NjYWxhcj4sc3RkOjpjb21wbGV4PFRfc2NhbGFyPiA+KG5mZnQpOworfQorCit2b2lkIGRlbW9fYWxsX3R5cGVzKGludCBuZmZ0KQoreworICAgIGNvdXQgPDwgIm5mZnQ9IiA8PCBuZmZ0IDw8IGVuZGw7CisgICAgY291dCA8PCAiICAgZmxvYXQiIDw8IGVuZGw7CisgICAgdHdvX2RlbW9zPGZsb2F0PihuZmZ0KTsKKyAgICBjb3V0IDw8ICIgICBkb3VibGUiIDw8IGVuZGw7CisgICAgdHdvX2RlbW9zPGRvdWJsZT4obmZmdCk7CisgICAgY291dCA8PCAiICAgbG9uZyBkb3VibGUiIDw8IGVuZGw7CisgICAgdHdvX2RlbW9zPGxvbmcgZG91YmxlPihuZmZ0KTsKK30KKworaW50IG1haW4oKQoreworICAgIGRlbW9fYWxsX3R5cGVzKCAyKjMqNCo1KjcgKTsKKyAgICBkZW1vX2FsbF90eXBlcyggMio5KjE2KjI1ICk7CisgICAgZGVtb19hbGxfdHlwZXMoIDEwMjQgKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhFeHBvbmVudGlhbC5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RXhwb25lbnRpYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDNiOTYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RXhwb25lbnRpYWwuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBjb25zdCBkb3VibGUgcGkgPSBzdGQ6OmFjb3MoLTEuMCk7CisKKyAgTWF0cml4WGQgQSgzLDMpOworICBBIDw8IDAsICAgIC1waS80LCAwLAorICAgICAgIHBpLzQsIDAsICAgICAwLAorICAgICAgIDAsICAgIDAsICAgICAwOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggQSBpczpcbiIgPDwgQSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBBIGlzOlxuIiA8PCBBLmV4cCgpIDw8ICJcblxuIjsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhGdW5jdGlvbi5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RnVuY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTcyZTQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RnVuY3Rpb24uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworc3RkOjpjb21wbGV4PGRvdWJsZT4gZXhwZm4oc3RkOjpjb21wbGV4PGRvdWJsZT4geCwgaW50KQoreworICByZXR1cm4gc3RkOjpleHAoeCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xLjApOworCisgIE1hdHJpeFhkIEEoMywzKTsKKyAgQSA8PCAwLCAgICAtcGkvNCwgMCwKKyAgICAgICBwaS80LCAwLCAgICAgMCwKKyAgICAgICAwLCAgICAwLCAgICAgMDsKKworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggQSBpczpcbiIgPDwgQSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBBIGlzOlxuIiAKKyAgICAgICAgICAgIDw8IEEubWF0cml4RnVuY3Rpb24oZXhwZm4pIDw8ICJcblxuIjsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhMb2dhcml0aG0uY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeExvZ2FyaXRobS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1ZDk3MAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhMb2dhcml0aG0uY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIE1hdHJpeFhkIEEoMywzKTsKKyAgQSA8PCAwLjUqc3FydCgyKSwgLTAuNSpzcXJ0KDIpLCAwLAorICAgICAgIDAuNSpzcXJ0KDIpLCAgMC41KnNxcnQoMiksIDAsCisgICAgICAgMCwgICAgICAgICAgICAwLCAgICAgICAgICAgMTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXM6XG4iIDw8IEEgPDwgIlxuXG4iOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggbG9nYXJpdGhtIG9mIEEgaXM6XG4iIDw8IEEubG9nKCkgPDwgIlxuIjsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhQb3dlci5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjQ1MjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXIuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBjb25zdCBkb3VibGUgcGkgPSBzdGQ6OmFjb3MoLTEuMCk7CisgIE1hdHJpeDNkIEE7CisgIEEgPDwgY29zKDEpLCAtc2luKDEpLCAwLAorICAgICAgIHNpbigxKSwgIGNvcygxKSwgMCwKKwkgICAwICwgICAgICAwICwgMTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXM6XG4iIDw8IEEgPDwgIlxuXG4iCisJICAgICAgICJUaGUgbWF0cml4IHBvd2VyIEFeKHBpLzQpIGlzOlxuIiA8PCBBLnBvdyhwaS80KSA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFBvd2VyX29wdGltYWwuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFBvd2VyX29wdGltYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXJfb3B0aW1hbC5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeDRjZCBBID0gTWF0cml4NGNkOjpSYW5kb20oKTsKKyAgTWF0cml4UG93ZXI8TWF0cml4NGNkPiBBcG93KEEpOworCisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIgorCSAgICAgICAiQV4zLjEgaXM6XG4iIDw8IEFwb3coMy4xKSA8PCAiXG5cbiIKKwkgICAgICAgIkFeMy4zIGlzOlxuIiA8PCBBcG93KDMuMykgPDwgIlxuXG4iCisJICAgICAgICJBXjMuNyBpczpcbiIgPDwgQXBvdygzLjcpIDw8ICJcblxuIgorCSAgICAgICAiQV4zLjkgaXM6XG4iIDw8IEFwb3coMy45KSA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmUuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWE5YTAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luZS5jcHAKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDMsMyk7CisgIHN0ZDo6Y291dCA8PCAiQSA9IFxuIiA8PCBBIDw8ICJcblxuIjsKKworICBNYXRyaXhYZCBzaW5BID0gQS5zaW4oKTsKKyAgc3RkOjpjb3V0IDw8ICJzaW4oQSkgPSBcbiIgPDwgc2luQSA8PCAiXG5cbiI7CisKKyAgTWF0cml4WGQgY29zQSA9IEEuY29zKCk7CisgIHN0ZDo6Y291dCA8PCAiY29zKEEpID0gXG4iIDw8IGNvc0EgPDwgIlxuXG4iOworICAKKyAgLy8gVGhlIG1hdHJpeCBmdW5jdGlvbnMgc2F0aXNmeSBzaW5eMihBKSArIGNvc14yKEEpID0gSSwgCisgIC8vIGxpa2UgdGhlIHNjYWxhciBmdW5jdGlvbnMuCisgIHN0ZDo6Y291dCA8PCAic2luXjIoQSkgKyBjb3NeMihBKSA9IFxuIiA8PCBzaW5BKnNpbkEgKyBjb3NBKmNvc0EgPDwgIlxuXG4iOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmguY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzE4NjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luaC5jcHAKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsMyk7CisgIHN0ZDo6Y291dCA8PCAiQSA9IFxuIiA8PCBBIDw8ICJcblxuIjsKKworICBNYXRyaXhYZiBzaW5oQSA9IEEuc2luaCgpOworICBzdGQ6OmNvdXQgPDwgInNpbmgoQSkgPSBcbiIgPDwgc2luaEEgPDwgIlxuXG4iOworCisgIE1hdHJpeFhmIGNvc2hBID0gQS5jb3NoKCk7CisgIHN0ZDo6Y291dCA8PCAiY29zaChBKSA9IFxuIiA8PCBjb3NoQSA8PCAiXG5cbiI7CisgIAorICAvLyBUaGUgbWF0cml4IGZ1bmN0aW9ucyBzYXRpc2Z5IGNvc2heMihBKSAtIHNpbmheMihBKSA9IEksIAorICAvLyBsaWtlIHRoZSBzY2FsYXIgZnVuY3Rpb25zLgorICBzdGQ6OmNvdXQgPDwgImNvc2heMihBKSAtIHNpbmheMihBKSA9IFxuIiA8PCBjb3NoQSpjb3NoQSAtIHNpbmhBKnNpbmhBIDw8ICJcblxuIjsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTcXVhcmVSb290LmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTcXVhcmVSb290LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGU3NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNxdWFyZVJvb3QuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBjb25zdCBkb3VibGUgcGkgPSBzdGQ6OmFjb3MoLTEuMCk7CisKKyAgTWF0cml4WGQgQSgyLDIpOworICBBIDw8IGNvcyhwaS8zKSwgLXNpbihwaS8zKSwgCisgICAgICAgc2luKHBpLzMpLCAgY29zKHBpLzMpOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggQSBpczpcbiIgPDwgQSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiBBIGlzOlxuIiA8PCBBLnNxcnQoKSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiVGhlIHNxdWFyZSBvZiB0aGUgbGFzdCBtYXRyaXggaXM6XG4iIDw8IEEuc3FydCgpICogQS5zcXJ0KCkgPDwgIlxuIjsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsU29sdmVyMS5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFNvbHZlcjEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzc3YTQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFNvbHZlcjEuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLDUsMT4gVmVjdG9yNWQ7CisKKyAgVmVjdG9yNWQgcm9vdHMgPSBWZWN0b3I1ZDo6UmFuZG9tKCk7CisgIGNvdXQgPDwgIlJvb3RzOiAiIDw8IHJvb3RzLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLDYsMT4gcG9seW5vbWlhbDsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByb290cywgcG9seW5vbWlhbCApOworCisgIFBvbHlub21pYWxTb2x2ZXI8ZG91YmxlLDU+IHBzb2x2ZSggcG9seW5vbWlhbCApOworICBjb3V0IDw8ICJDb21wbGV4IHJvb3RzOiAiIDw8IHBzb2x2ZS5yb290cygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZWFsUm9vdHM7CisgIHBzb2x2ZS5yZWFsUm9vdHMoIHJlYWxSb290cyApOworICBNYXA8VmVjdG9yNWQ+IG1hcFJSKCAmcmVhbFJvb3RzWzBdICk7CisgIGNvdXQgPDwgIlJlYWwgcm9vdHM6ICIgPDwgbWFwUlIudHJhbnNwb3NlKCkgPDwgZW5kbDsKKworICBjb3V0IDw8IGVuZGw7CisgIGNvdXQgPDwgIklsbHVzdHJhdGlvbiBvZiB0aGUgY29udmVyZ2VuY2UgcHJvYmxlbSB3aXRoIHRoZSBRUiBhbGdvcml0aG06ICIgPDwgZW5kbDsKKyAgY291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA8PCBlbmRsOworICBFaWdlbjo6TWF0cml4PGZsb2F0LDcsMT4gaGFyZENhc2VfcG9seW5vbWlhbDsKKyAgaGFyZENhc2VfcG9seW5vbWlhbCA8PAorICAtMC45NTcsIDAuOTIxOSwgMC4zNTE2LCAwLjk0NTMsIC0wLjQwMjMsIC0wLjU1MDgsIC0wLjAzMTI1OworICBjb3V0IDw8ICJIYXJkIGNhc2UgcG9seW5vbWlhbCBkZWZpbmVkIGJ5IGZsb2F0czogIiA8PCBoYXJkQ2FzZV9wb2x5bm9taWFsLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgIFBvbHlub21pYWxTb2x2ZXI8ZmxvYXQsNj4gcHNvbHZlZiggaGFyZENhc2VfcG9seW5vbWlhbCApOworICBjb3V0IDw8ICJDb21wbGV4IHJvb3RzOiAiIDw8IHBzb2x2ZWYucm9vdHMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworICBFaWdlbjo6TWF0cml4PGZsb2F0LDYsMT4gZXZhbHM7CisgIGZvciggaW50IGk9MDsgaTw2OyArK2kgKXsgZXZhbHNbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBoYXJkQ2FzZV9wb2x5bm9taWFsLCBwc29sdmVmLnJvb3RzKClbaV0gKSApOyB9CisgIGNvdXQgPDwgIk5vcm1zIG9mIHRoZSBldmFsdWF0aW9ucyBvZiB0aGUgcG9seW5vbWlhbCBhdCB0aGUgcm9vdHM6ICIgPDwgZXZhbHMudHJhbnNwb3NlKCkgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvdXQgPDwgIlVzaW5nIGRvdWJsZSdzIGFsbW9zdCBhbHdheXMgc29sdmVzIHRoZSBwcm9ibGVtIGZvciBzbWFsbCBkZWdyZWVzOiAiIDw8IGVuZGw7CisgIGNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CisgIFBvbHlub21pYWxTb2x2ZXI8ZG91YmxlLDY+IHBzb2x2ZTZkKCBoYXJkQ2FzZV9wb2x5bm9taWFsLmNhc3Q8ZG91YmxlPigpICk7CisgIGNvdXQgPDwgIkNvbXBsZXggcm9vdHM6ICIgPDwgcHNvbHZlNmQucm9vdHMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworICBmb3IoIGludCBpPTA7IGk8NjsgKytpICkKKyAgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gY2FzdGVkUm9vdCggcHNvbHZlNmQucm9vdHMoKVtpXS5yZWFsKCksIHBzb2x2ZTZkLnJvb3RzKClbaV0uaW1hZygpICk7CisgICAgZXZhbHNbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBoYXJkQ2FzZV9wb2x5bm9taWFsLCBjYXN0ZWRSb290ICkgKTsKKyAgfQorICBjb3V0IDw8ICJOb3JtcyBvZiB0aGUgZXZhbHVhdGlvbnMgb2YgdGhlIHBvbHlub21pYWwgYXQgdGhlIHJvb3RzOiAiIDw8IGV2YWxzLnRyYW5zcG9zZSgpIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb3V0LnByZWNpc2lvbigxMCk7CisgIGNvdXQgPDwgIlRoZSBsYXN0IHJvb3QgaW4gZmxvYXQgdGhlbiBpbiBkb3VibGU6ICIgPDwgcHNvbHZlZi5yb290cygpWzVdIDw8ICJcdCIgPDwgcHNvbHZlNmQucm9vdHMoKVs1XSA8PCBlbmRsOworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGNhc3RlZFJvb3QoIHBzb2x2ZTZkLnJvb3RzKClbNV0ucmVhbCgpLCBwc29sdmU2ZC5yb290cygpWzVdLmltYWcoKSApOworICBjb3V0IDw8ICJOb3JtIG9mIHRoZSBkaWZmZXJlbmNlOiAiIDw8IHN0ZDo6YWJzKCBwc29sdmVmLnJvb3RzKClbNV0gLSBjYXN0ZWRSb290ICkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsVXRpbHMxLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsVXRpbHMxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmZlNTIwCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL1BvbHlub21pYWxVdGlsczEuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBWZWN0b3I0ZCByb290cyA9IFZlY3RvcjRkOjpSYW5kb20oKTsKKyAgY291dCA8PCAiUm9vdHM6ICIgPDwgcm9vdHMudHJhbnNwb3NlKCkgPDwgZW5kbDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsNSwxPiBwb2x5bm9taWFsOworICByb290c190b19tb25pY1BvbHlub21pYWwoIHJvb3RzLCBwb2x5bm9taWFsICk7CisgIGNvdXQgPDwgIlBvbHlub21pYWw6ICI7CisgIGZvciggaW50IGk9MDsgaTw0OyArK2kgKXsgY291dCA8PCBwb2x5bm9taWFsW2ldIDw8ICIueF4iIDw8IGkgPDwgIisgIjsgfQorICBjb3V0IDw8IHBvbHlub21pYWxbNF0gPDwgIi54XjQiIDw8IGVuZGw7CisgIFZlY3RvcjRkIGV2YWx1YXRpb247CisgIGZvciggaW50IGk9MDsgaTw0OyArK2kgKXsKKyAgICBldmFsdWF0aW9uW2ldID0gcG9seV9ldmFsKCBwb2x5bm9taWFsLCByb290c1tpXSApOyB9CisgIGNvdXQgPDwgIkV2YWx1YXRpb24gb2YgdGhlIHBvbHlub21pYWwgYXQgdGhlIHJvb3RzOiAiIDw8IGV2YWx1YXRpb24udHJhbnNwb3NlKCk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2Mvc25pcHBldHMvQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9kb2Mvc25pcHBldHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9zbmlwcGV0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI2IEBACitGSUxFKEdMT0Igc25pcHBldHNfU1JDUyAiKi5jcHAiKQorCitBRERfQ1VTVE9NX1RBUkdFVCh1bnN1cHBvcnRlZF9zbmlwcGV0cykKKworRk9SRUFDSChzbmlwcGV0X3NyYyAke3NuaXBwZXRzX1NSQ1N9KQorICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKHNuaXBwZXQgJHtzbmlwcGV0X3NyY30gTkFNRV9XRSkKKyAgU0VUKGNvbXBpbGVfc25pcHBldF90YXJnZXQgY29tcGlsZV8ke3NuaXBwZXR9KQorICBTRVQoY29tcGlsZV9zbmlwcGV0X3NyYyAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9LmNwcCkKKyAgRklMRShSRUFEICR7c25pcHBldF9zcmN9IHNuaXBwZXRfc291cmNlX2NvZGUpCisgIENPTkZJR1VSRV9GSUxFKCR7UFJPSkVDVF9TT1VSQ0VfRElSfS9kb2Mvc25pcHBldHMvY29tcGlsZV9zbmlwcGV0LmNwcC5pbgorICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtjb21waWxlX3NuaXBwZXRfc3JjfSkKKyAgQUREX0VYRUNVVEFCTEUoJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fQorICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtjb21waWxlX3NuaXBwZXRfc3JjfSkKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0gJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIGVuZGlmKCkKKyAgQUREX0NVU1RPTV9DT01NQU5EKAorICAgIFRBUkdFVCAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9CisgICAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fQorICAgIEFSR1MgPiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke3NuaXBwZXR9Lm91dAorICApCisgIEFERF9ERVBFTkRFTkNJRVModW5zdXBwb3J0ZWRfc25pcHBldHMgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fSkKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke2NvbXBpbGVfc25pcHBldF9zcmN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTIE9CSkVDVF9ERVBFTkRTICR7c25pcHBldF9zcmN9KQorRU5ERk9SRUFDSChzbmlwcGV0X3NyYykKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvQlZILmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvQlZILmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjViMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9CVkguY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBJbHlhIEJhcmFuIDxpYmFyYW5AbWl0LmVkdT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU3RkVmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0JWSD4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPiBBbGlnbmVkQm94PFNjYWxhciwgRGltPiBib3VuZGluZ19ib3goY29uc3QgTWF0cml4PFNjYWxhciwgRGltLCAxPiAmdikgeyByZXR1cm4gQWxpZ25lZEJveDxTY2FsYXIsIERpbT4odik7IH0KKworfQorCisKK3RlbXBsYXRlPGludCBEaW0+CitzdHJ1Y3QgQmFsbAoreworRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShkb3VibGUsIERpbSkKKworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIERpbSwgMT4gVmVjdG9yVHlwZTsKKworICBCYWxsKCkge30KKyAgQmFsbChjb25zdCBWZWN0b3JUeXBlICZjLCBkb3VibGUgcikgOiBjZW50ZXIoYyksIHJhZGl1cyhyKSB7fQorCisgIFZlY3RvclR5cGUgY2VudGVyOworICBkb3VibGUgcmFkaXVzOworfTsKK3RlbXBsYXRlPGludCBEaW0+IEFsaWduZWRCb3g8ZG91YmxlLCBEaW0+IGJvdW5kaW5nX2JveChjb25zdCBCYWxsPERpbT4gJmIpCit7IHJldHVybiBBbGlnbmVkQm94PGRvdWJsZSwgRGltPihiLmNlbnRlci5hcnJheSgpIC0gYi5yYWRpdXMsIGIuY2VudGVyLmFycmF5KCkgKyBiLnJhZGl1cyk7IH0KKworaW5saW5lIGRvdWJsZSBTUVIoZG91YmxlIHgpIHsgcmV0dXJuIHggKiB4OyB9CisKK3RlbXBsYXRlPGludCBEaW0+CitzdHJ1Y3QgQmFsbFBvaW50U3R1ZmYgLy90aGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBiZSBib3RoIGFuIGludGVyc2VjdG9yIGFuZCBhIG1pbmltaXplciwgYm90aCBmb3IgYSBiYWxsIGFuZCBhIHBvaW50IGFuZCBmb3IgdHdvIHRyZWVzCit7CisgIHR5cGVkZWYgZG91YmxlIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBEaW0sIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQmFsbDxEaW0+IEJhbGxUeXBlOworICB0eXBlZGVmIEFsaWduZWRCb3g8ZG91YmxlLCBEaW0+IEJveFR5cGU7CisKKyAgQmFsbFBvaW50U3R1ZmYoKSA6IGNhbGxzKDApLCBjb3VudCgwKSB7fQorICBCYWxsUG9pbnRTdHVmZihjb25zdCBWZWN0b3JUeXBlICZpblApIDogcChpblApLCBjYWxscygwKSwgY291bnQoMCkge30KKworCisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IEJveFR5cGUgJnIpIHsgKytjYWxsczsgcmV0dXJuIHIuY29udGFpbnMocCk7IH0KKyAgYm9vbCBpbnRlcnNlY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIpIHsKKyAgICArK2NhbGxzOworICAgIGlmKChiLmNlbnRlciAtIHApLnNxdWFyZWROb3JtKCkgPCBTUVIoYi5yYWRpdXMpKQorICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gZmFsc2U7IC8vY29udGludWUKKyAgfQorCisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgeyArK2NhbGxzOyByZXR1cm4gIShyMS5pbnRlcnNlY3Rpb24ocjIpKS5pc051bGwoKTsgfQorICBib29sIGludGVyc2VjdFZvbHVtZU9iamVjdChjb25zdCBCb3hUeXBlICZyLCBjb25zdCBCYWxsVHlwZSAmYikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShiLmNlbnRlcikgPCBTUVIoYi5yYWRpdXMpOyB9CisgIGJvb2wgaW50ZXJzZWN0T2JqZWN0Vm9sdW1lKGNvbnN0IEJhbGxUeXBlICZiLCBjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSA8IFNRUihiLnJhZGl1cyk7IH0KKyAgYm9vbCBpbnRlcnNlY3RPYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIxLCBjb25zdCBCYWxsVHlwZSAmYjIpeworICAgICsrY2FsbHM7CisgICAgaWYoKGIxLmNlbnRlciAtIGIyLmNlbnRlcikubm9ybSgpIDwgYjEucmFkaXVzICsgYjIucmFkaXVzKQorICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBpbnRlcnNlY3RWb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgVmVjdG9yVHlwZSAmdikgeyArK2NhbGxzOyByZXR1cm4gci5jb250YWlucyh2KTsgfQorICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgVmVjdG9yVHlwZSAmdil7CisgICAgKytjYWxsczsKKyAgICBpZigoYi5jZW50ZXIgLSB2KS5zcXVhcmVkTm9ybSgpIDwgU1FSKGIucmFkaXVzKSkKKyAgICAgICsrY291bnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZShjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHApOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3QoY29uc3QgQmFsbFR5cGUgJmIpIHsgKytjYWxsczsgcmV0dXJuIChzdGQ6Om1heCkoMC4sIChiLmNlbnRlciAtIHApLnNxdWFyZWROb3JtKCkgLSBTUVIoYi5yYWRpdXMpKTsgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgeyArK2NhbGxzOyByZXR1cm4gcjEuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocjIpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgQmFsbFR5cGUgJmIpIHsgKytjYWxsczsgcmV0dXJuIFNRUigoc3RkOjptYXgpKDAuLCByLmV4dGVyaW9yRGlzdGFuY2UoYi5jZW50ZXIpIC0gYi5yYWRpdXMpKTsgfQorICBkb3VibGUgbWluaW11bU9uT2JqZWN0Vm9sdW1lKGNvbnN0IEJhbGxUeXBlICZiLCBjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgci5leHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSAtIGIucmFkaXVzKSk7IH0KKyAgZG91YmxlIG1pbmltdW1Pbk9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYjEsIGNvbnN0IEJhbGxUeXBlICZiMil7ICsrY2FsbHM7IHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgKGIxLmNlbnRlciAtIGIyLmNlbnRlcikubm9ybSgpIC0gYjEucmFkaXVzIC0gYjIucmFkaXVzKSk7IH0KKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZU9iamVjdChjb25zdCBCb3hUeXBlICZyLCBjb25zdCBWZWN0b3JUeXBlICZ2KSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIsIGNvbnN0IFZlY3RvclR5cGUgJnYpeyArK2NhbGxzOyByZXR1cm4gU1FSKChzdGQ6Om1heCkoMC4sIChiLmNlbnRlciAtIHYpLm5vcm0oKSAtIGIucmFkaXVzKSk7IH0KKworICBWZWN0b3JUeXBlIHA7CisgIGludCBjYWxsczsKKyAgaW50IGNvdW50OworfTsKKworCit0ZW1wbGF0ZTxpbnQgRGltPgorc3RydWN0IFRyZWVUZXN0Cit7CisgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgRGltLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZlY3RvclR5cGUsIGFsaWduZWRfYWxsb2NhdG9yPFZlY3RvclR5cGU+ID4gVmVjdG9yVHlwZUxpc3Q7CisgIHR5cGVkZWYgQmFsbDxEaW0+IEJhbGxUeXBlOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEJhbGxUeXBlLCBhbGlnbmVkX2FsbG9jYXRvcjxCYWxsVHlwZT4gPiBCYWxsVHlwZUxpc3Q7CisgIHR5cGVkZWYgQWxpZ25lZEJveDxkb3VibGUsIERpbT4gQm94VHlwZTsKKworICB2b2lkIHRlc3RJbnRlcnNlY3QxKCkKKyAgeworICAgIEJhbGxUeXBlTGlzdCBiOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgICAgICBiLnB1c2hfYmFjayhCYWxsVHlwZShWZWN0b3JUeXBlOjpSYW5kb20oKSwgMC41ICogaW50ZXJuYWw6OnJhbmRvbSgwLiwgMS4pKSk7CisgICAgfQorICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworCisgICAgVmVjdG9yVHlwZSBwdCA9IFZlY3RvclR5cGU6OlJhbmRvbSgpOworICAgIEJhbGxQb2ludFN0dWZmPERpbT4gaTEocHQpLCBpMihwdCk7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgaTEuaW50ZXJzZWN0T2JqZWN0KGJbaV0pOworCisgICAgQlZJbnRlcnNlY3QodHJlZSwgaTIpOworCisgICAgVkVSSUZZKGkxLmNvdW50ID09IGkyLmNvdW50KTsKKyAgfQorCisgIHZvaWQgdGVzdE1pbmltaXplMSgpCisgIHsKKyAgICBCYWxsVHlwZUxpc3QgYjsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKKyAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuMDEgKiBpbnRlcm5hbDo6cmFuZG9tKDAuLCAxLikpKTsKKyAgICB9CisgICAgS2RCVkg8ZG91YmxlLCBEaW0sIEJhbGxUeXBlPiB0cmVlKGIuYmVnaW4oKSwgYi5lbmQoKSk7CisKKyAgICBWZWN0b3JUeXBlIHB0ID0gVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMShwdCksIGkyKHB0KTsKKworICAgIGRvdWJsZSBtMSA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCkoKSwgbTIgPSBtMTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCisgICAgICBtMSA9IChzdGQ6Om1pbikobTEsIGkxLm1pbmltdW1Pbk9iamVjdChiW2ldKSk7CisKKyAgICBtMiA9IEJWTWluaW1pemUodHJlZSwgaTIpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTIpOworICB9CisKKyAgdm9pZCB0ZXN0SW50ZXJzZWN0MigpCisgIHsKKyAgICBCYWxsVHlwZUxpc3QgYjsKKyAgICBWZWN0b3JUeXBlTGlzdCB2OworCisgICAgZm9yKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuNSAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOworICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgMzsgKytqKQorICAgICAgICAgICAgdi5wdXNoX2JhY2soVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIH0KKworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBWZWN0b3JUeXBlPiB2VHJlZSh2LmJlZ2luKCksIHYuZW5kKCkpOworCisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMSwgaTI7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgKGludCl2LnNpemUoKTsgKytqKQorICAgICAgICAgICAgaTEuaW50ZXJzZWN0T2JqZWN0T2JqZWN0KGJbaV0sIHZbal0pOworCisgICAgQlZJbnRlcnNlY3QodHJlZSwgdlRyZWUsIGkyKTsKKworICAgIFZFUklGWShpMS5jb3VudCA9PSBpMi5jb3VudCk7CisgIH0KKworICB2b2lkIHRlc3RNaW5pbWl6ZTIoKQorICB7CisgICAgQmFsbFR5cGVMaXN0IGI7CisgICAgVmVjdG9yVHlwZUxpc3QgdjsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgICAgIGIucHVzaF9iYWNrKEJhbGxUeXBlKFZlY3RvclR5cGU6OlJhbmRvbSgpLCAxZS03ICsgMWUtNiAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOworICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgMzsgKytqKQorICAgICAgICAgICAgdi5wdXNoX2JhY2soVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIH0KKworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBWZWN0b3JUeXBlPiB2VHJlZSh2LmJlZ2luKCksIHYuZW5kKCkpOworCisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMSwgaTI7CisKKyAgICBkb3VibGUgbTEgPSAoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgpKCksIG0yID0gbTE7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgKGludCl2LnNpemUoKTsgKytqKQorICAgICAgICAgICAgbTEgPSAoc3RkOjptaW4pKG0xLCBpMS5taW5pbXVtT25PYmplY3RPYmplY3QoYltpXSwgdltqXSkpOworCisgICAgbTIgPSBCVk1pbmltaXplKHRyZWUsIHZUcmVlLCBpMik7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMik7CisgIH0KK307CisKKwordm9pZCB0ZXN0X0JWSCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzEKKyAgICBUcmVlVGVzdDwyPiB0ZXN0MjsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDIudGVzdEludGVyc2VjdDEoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QyLnRlc3RNaW5pbWl6ZTEoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QyLnRlc3RJbnRlcnNlY3QyKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0Mi50ZXN0TWluaW1pemUyKCkpOworI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMgorICAgIFRyZWVUZXN0PDM+IHRlc3QzOworICAgIENBTExfU1VCVEVTVCh0ZXN0My50ZXN0SW50ZXJzZWN0MSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDMudGVzdE1pbmltaXplMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDMudGVzdEludGVyc2VjdDIoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QzLnRlc3RNaW5pbWl6ZTIoKSk7CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8zCisgICAgVHJlZVRlc3Q8ND4gdGVzdDQ7CisgICAgQ0FMTF9TVUJURVNUKHRlc3Q0LnRlc3RJbnRlcnNlY3QxKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0NC50ZXN0TWluaW1pemUxKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0NC50ZXN0SW50ZXJzZWN0MigpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDQudGVzdE1pbmltaXplMigpKTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZhMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI1NyBAQAorIyBnZW5lcmF0ZSBzcGxpdCB0ZXN0IGhlYWRlciBmaWxlIG9ubHkgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0CisjIGluIG9yZGVyIHRvIHByZXZlbnQgYSByZWJ1aWxkIGV2ZXJ5dGltZSBjbWFrZSBpcyBjb25maWd1cmVkCitpZihOT1QgRVhJU1RTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcGxpdF90ZXN0X2hlbHBlci5oKQorICBmaWxlKFdSSVRFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcGxpdF90ZXN0X2hlbHBlci5oICIiKQorICBmb3JlYWNoKGkgUkFOR0UgMSA5OTkpCisgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NwbGl0X3Rlc3RfaGVscGVyLmgKKyAgICAgICIjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXyR7aX1cbiIKKyAgICAgICIjZGVmaW5lIENBTExfU1VCVEVTVF8ke2l9KEZVTkMpIENBTExfU1VCVEVTVChGVU5DKVxuIgorICAgICAgIiNlbHNlXG4iCisgICAgICAiI2RlZmluZSBDQUxMX1NVQlRFU1RfJHtpfShGVU5DKVxuIgorICAgICAgIiNlbmRpZlxuXG4iCisgICAgKQorICBlbmRmb3JlYWNoKCkKK2VuZGlmKCkKKworc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9DVVJSRU5UX1NVQlBST0pFQ1QgIlVuc3VwcG9ydGVkIikKK2FkZF9jdXN0b21fdGFyZ2V0KEJ1aWxkVW5zdXBwb3J0ZWQpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vdGVzdCAuLi8uLi91bnN1cHBvcnRlZCAuLi8uLi9FaWdlbgorICAgICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4vLi4vdGVzdCkKKworZmluZF9wYWNrYWdlIChUaHJlYWRzKQorCitmaW5kX3BhY2thZ2UoR29vZ2xlSGFzaCkKK2lmKEdPT0dMRUhBU0hfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9HT09HTEVIQVNIX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7R09PR0xFSEFTSF9JTkNMVURFU30pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgICJHb29nbGVIYXNoLCAiKQorZWxzZShHT09HTEVIQVNIX0ZPVU5EKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAgIkdvb2dsZUhhc2gsICIpCitlbmRpZihHT09HTEVIQVNIX0ZPVU5EKQorCitmaW5kX3BhY2thZ2UoQWRvbGMpCitpZihBRE9MQ19GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0FET0xDX0lOQ0xVREVTfSkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAiQWRvbGMsICIpCisgIGVpX2FkZF90ZXN0KGZvcndhcmRfYWRvbGMgIiIgJHtBRE9MQ19MSUJSQVJJRVN9KQorZWxzZShBRE9MQ19GT1VORCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIkFkb2xjLCAiKQorZW5kaWYoQURPTENfRk9VTkQpCisKKyMgdGhpcyB0ZXN0IHNlZW1zIHRvIG5ldmVyIGhhdmUgYmVlbiBzdWNjZXNzZnVsIG9uIHg4Nywgc28gaXMgY29uc2lkZXJlZCB0byBjb250YWluIGEgRlAtcmVsYXRlZCBidWcuCisjIHNlZSB0aHJlYWQ6ICJub24tbGluZWFyIG9wdGltaXphdGlvbiB0ZXN0IHN1bW1hcnkiCitlaV9hZGRfdGVzdChOb25MaW5lYXJPcHRpbWl6YXRpb24pCisKK2VpX2FkZF90ZXN0KE51bWVyaWNhbERpZmYpCitlaV9hZGRfdGVzdChhdXRvZGlmZl9zY2FsYXIpCitlaV9hZGRfdGVzdChhdXRvZGlmZikKKworaWYgKE5PVCBDTUFLRV9DWFhfQ09NUElMRVIgTUFUQ0hFUyAiY2xhbmdcXCtcXCskIikKK2VpX2FkZF90ZXN0KEJWSCkKK2VuZGlmKCkKKworZWlfYWRkX3Rlc3QobWF0cml4X2V4cG9uZW50aWFsKQorZWlfYWRkX3Rlc3QobWF0cml4X2Z1bmN0aW9uKQorZWlfYWRkX3Rlc3QobWF0cml4X3Bvd2VyKQorZWlfYWRkX3Rlc3QobWF0cml4X3NxdWFyZV9yb290KQorZWlfYWRkX3Rlc3QoYWxpZ25lZHZlY3RvcjMpCisKK2VpX2FkZF90ZXN0KEZGVCkKKworZWlfYWRkX3Rlc3QoRXVsZXJBbmdsZXMpCisKK2ZpbmRfcGFja2FnZShNUEZSIDIuMy4wKQorZmluZF9wYWNrYWdlKEdNUCkKK2lmKE1QRlJfRk9VTkQgQU5EIEVJR0VOX0NPTVBJTEVSX1NVUFBPUlRfQ1hYMTEpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNUEZSX0lOQ0xVREVTfSAuL21wcmVhbCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAiTVBGUiBDKyssICIpCisgIHNldChFSUdFTl9NUEZSX1RFU1RfTElCUkFSSUVTICR7TVBGUl9MSUJSQVJJRVN9ICR7R01QX0xJQlJBUklFU30pCisgZWlfYWRkX3Rlc3QobXByZWFsX3N1cHBvcnQgIi1zdGQ9YysrMTEiICIke0VJR0VOX01QRlJfVEVTVF9MSUJSQVJJRVN9IiApCitlbHNlKCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIk1QRlIgQysrLCAiKQorZW5kaWYoKQorCitlaV9hZGRfdGVzdChzcGFyc2VfZXh0cmEgICAiIiAiIikKKworZmluZF9wYWNrYWdlKEZGVFcpCitpZihGRlRXX0ZPVU5EKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJmZnR3LCAiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0ZGVFdfSU5DTFVERVN9ICkKKyAgaWYoRkZUV0xfTElCKQorICAgIGVpX2FkZF90ZXN0KEZGVFcgICItREVJR0VOX0ZGVFdfREVGQVVMVCAtREVJR0VOX0hBU19GRlRXTCIgIiR7RkZUV19MSUJSQVJJRVN9IiApCisgIGVsc2UoKQorICAgIGVpX2FkZF90ZXN0KEZGVFcgICItREVJR0VOX0ZGVFdfREVGQVVMVCIgIiR7RkZUV19MSUJSQVJJRVN9IiApCisgIGVuZGlmKCkKK2Vsc2UoKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiZmZ0dywgIikKK2VuZGlmKCkKKworb3B0aW9uKEVJR0VOX1RFU1RfTk9fT1BFTkdMICJEaXNhYmxlIE9wZW5HTCBzdXBwb3J0IGluIHVuaXQgdGVzdHMiIE9GRikKK2lmKE5PVCBFSUdFTl9URVNUX05PX09QRU5HTCkKKyAgZmluZF9wYWNrYWdlKE9wZW5HTCkKKyAgZmluZF9wYWNrYWdlKEdMVVQpCisgIGZpbmRfcGFja2FnZShHTEVXKQorICBpZihPUEVOR0xfRk9VTkQgQU5EIEdMVVRfRk9VTkQgQU5EIEdMRVdfRk9VTkQpCisgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke09QRU5HTF9JTkNMVURFX0RJUn0gJHtHTFVUX0lOQ0xVREVfRElSfSAke0dMRVdfSU5DTFVERV9ESVJTfSkKKyAgICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJPcGVuR0wsICIpCisgICAgc2V0KEVJR0VOX0dMX0xJQiAke0dMVVRfTElCUkFSSUVTfSAke0dMRVdfTElCUkFSSUVTfSAke09QRU5HTF9MSUJSQVJJRVN9KQorICAgIGVpX2FkZF90ZXN0KG9wZW5nbHN1cHBvcnQgICIiICIke0VJR0VOX0dMX0xJQn0iICkKKyAgZWxzZSgpCisgICAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIk9wZW5HTCwgIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIk9wZW5HTCwgIikKK2VuZGlmKCkKKworZWlfYWRkX3Rlc3QocG9seW5vbWlhbHNvbHZlcikKK2VpX2FkZF90ZXN0KHBvbHlub21pYWx1dGlscykKK2VpX2FkZF90ZXN0KHNwbGluZXMpCitlaV9hZGRfdGVzdChnbXJlcykKK2VpX2FkZF90ZXN0KG1pbnJlcykKK2VpX2FkZF90ZXN0KGxldmVuYmVyZ19tYXJxdWFyZHQpCitlaV9hZGRfdGVzdChrcm9uZWNrZXJfcHJvZHVjdCkKK2VpX2FkZF90ZXN0KHNwZWNpYWxfZnVuY3Rpb25zKQorCisjIFRPRE86IFRoZSBmb2xsb3dpbmcgdGVzdCBuYW1lcyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgY3h4MTEgc3RyaW5nLCBzaW5jZSBoaXN0b3JpY2FsbHkKKyMgdGhlIHRlc3RzIGRlcGVuZGVkIG9uIGMrKzExLiBUaGlzIGlzbid0IHRoZSBjYXNlIGFueW1vcmUgc28gd2Ugb3VnaHQgdG8gcmVuYW1lIHRoZW0uCisjIEZJWE1FOiBPbGQgdmVyc2lvbnMgb2YgTVNWQyBmYWlsIHRvIGNvbXBpbGUgdGhpcyBjb2RlLCBzbyB3ZSBqdXN0IGRpc2FibGUgdGhlc2UgdGVzdHMKKyMgd2hlbiB1c2luZyB2aXN1YWwgc3R1ZGlvLiBXZSBzaG91bGQgbWFrZSB0aGUgY2hlY2sgbW9yZSBzdHJpY3QgdG8gZW5hYmxlIHRoZSB0ZXN0cyBmb3IKKyMgbmV3ZXIgdmVyc2lvbnMgb2YgTVNWQy4KK2lmIChOT1QgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJNU1ZDIikKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9kaW1lbnNpb24pCitlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfbWFwKQorZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2Fzc2lnbikKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jb21wYXJpc29ucykKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9mb3JjZWRfZXZhbCkKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9tYXRoKQorZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2NvbnN0KQorZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2ludGRpdikKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jYXN0cykKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9lbXB0eSkKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9zdWdhcikKK2VpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9yb3VuZGluZ3MpCitlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXApCitlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfaW8pCitpZigiJHtDTUFLRV9TSVpFT0ZfVk9JRF9QfSIgRVFVQUwgIjgiKQorICAjIFRoaXMgdGVzdCByZXF1aXJlcyBfX3VpbnQxMjhfdCB3aGljaCBpcyBvbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBzeXN0ZW1zCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl91aW50MTI4KQorZW5kaWYoKQorZW5kaWYoKQorCitpZihFSUdFTl9URVNUX0NYWDExKQorICBpZihFSUdFTl9URVNUX1NZQ0wpCisgICAgZWlfYWRkX3Rlc3Rfc3ljbChjeHgxMV90ZW5zb3Jfc3ljbCAiLXN0ZD1jKysxMSIpCisgICAgZWlfYWRkX3Rlc3Rfc3ljbChjeHgxMV90ZW5zb3JfZm9yY2VkX2V2YWxfc3ljbCAiLXN0ZD1jKysxMSIpCisgICAgZWlfYWRkX3Rlc3Rfc3ljbChjeHgxMV90ZW5zb3JfYnJvYWRjYXN0X3N5Y2wgIi1zdGQ9YysrMTEiKQorICAgIGVpX2FkZF90ZXN0X3N5Y2woY3h4MTFfdGVuc29yX2RldmljZV9zeWNsICItc3RkPWMrKzExIikKKyAgICBlaV9hZGRfdGVzdF9zeWNsKGN4eDExX3RlbnNvcl9yZWR1Y3Rpb25fc3ljbCAiLXN0ZD1jKysxMSIpCisgIGVuZGlmKEVJR0VOX1RFU1RfU1lDTCkKKyAgIyBJdCBzaG91bGQgYmUgc2FmZSB0byBhbHdheXMgcnVuIHRoZXNlIHRlc3RzIGFzIHRoZXJlIGlzIHNvbWUgZmFsbGJhY2sgY29kZSBmb3IKKyAgIyBvbGRlciBjb21waWxlciB0aGF0IGRvbid0IHN1cHBvcnQgY3h4MTEuCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpCisKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfZXZlbnRjb3VudCAiLXB0aHJlYWQiICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfcnVucXVldWUgIi1wdGhyZWFkIiAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGVpX2FkZF90ZXN0KGN4eDExX25vbl9ibG9ja2luZ190aHJlYWRfcG9vbCAiLXB0aHJlYWQiICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKworICBlaV9hZGRfdGVzdChjeHgxMV9tZXRhKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3Jfc2ltcGxlKQorIyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3N5bW1ldHJ5KQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfaW5kZXhfbGlzdCkKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jb250cmFjdGlvbikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfZXhwcikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2ZpeGVkX3NpemUpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9vZl9jb25zdF92YWx1ZXMpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9vZl9jb21wbGV4KQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3Jfb2Zfc3RyaW5ncykKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2x2YWx1ZSkKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2Jyb2FkY2FzdGluZykKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2NoaXBwaW5nKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfY29uY2F0ZW5hdGlvbikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX2luZmxhdGlvbikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX21vcnBoaW5nKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfcGFkZGluZykKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3BhdGNoKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfaW1hZ2VfcGF0Y2gpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2gpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9yZWR1Y3Rpb24pCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9hcmdtYXgpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9zaHVmZmxpbmcpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9zdHJpZGluZykKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX25vdGlmaWNhdGlvbiAiLXB0aHJlYWQiICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3RocmVhZF9wb29sICItcHRocmVhZCIgIiR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0iKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfcmVmKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfcmFuZG9tKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfZ2VuZXJhdG9yKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfY3VzdG9tX29wKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfY3VzdG9tX2luZGV4KQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfZmZ0KQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfaWZmdCkKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3NjYW4pCisKK2VuZGlmKCkKKworIyBUaGVzZSB0ZXN0cyBuZWVkcyBudmNjCitmaW5kX3BhY2thZ2UoQ1VEQSA3LjApCitpZihDVURBX0ZPVU5EIEFORCBFSUdFTl9URVNUX0NVREEpCisgICMgTWFrZSBzdXJlIHRvIGNvbXBpbGUgd2l0aG91dCB0aGUgLXBlZGFudGljLCAtV3VuZGVmLCAtV25vbi12aXJ0dWFsLWR0b3IKKyAgIyBhbmQgLWZuby1jaGVjay1uZXcgZmxhZ3Mgc2luY2UgdGhleSB0cmlnZ2VyIHRob3VzYW5kcyBvZiBjb21waWxhdGlvbiB3YXJuaW5ncworICAjIGluIHRoZSBDVURBIHJ1bnRpbWUKKyAgIyBBbHNvIHJlbW92ZSAtYW5zaSB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHN0ZD1jKysxMS4KKyAgc3RyaW5nKFJFUExBQ0UgIi1wZWRhbnRpYyIgIiIgQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorICBzdHJpbmcoUkVQTEFDRSAiLVd1bmRlZiIgIiIgQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorICBzdHJpbmcoUkVQTEFDRSAiLVdub24tdmlydHVhbC1kdG9yIiAiIiBDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIpCisgIHN0cmluZyhSRVBMQUNFICItZm5vLWNoZWNrLW5ldyIgIiIgQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorICBzdHJpbmcoUkVQTEFDRSAiLWFuc2kiICIiIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IikKKworICBtZXNzYWdlKFNUQVRVUyAiRmxhZ3MgdXNlZCB0byBjb21waWxlIGN1ZGEgY29kZTogIiAke0NNQUtFX0NYWF9GTEFHU30pCisKKyAgaWYoIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkNsYW5nIikKKyAgICBzZXQoQ1VEQV9OVkNDX0ZMQUdTICItY2NiaW4gJHtDTUFLRV9DX0NPTVBJTEVSfSIgQ0FDSEUgU1RSSU5HICJudmNjIGZsYWdzIiBGT1JDRSkKKyAgZW5kaWYoKQorICBpZihFSUdFTl9URVNUX0NVREFfQ0xBTkcpCisgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSAtLWN1ZGEtZ3B1LWFyY2g9c21fJHtFSUdFTl9DVURBX0NPTVBVVEVfQVJDSH0iKQorICBlbmRpZigpCisKKyAgc2V0KEVJR0VOX0NVREFfUkVMQVhFRF9DT05TVEVYUFIgIi0tZXhwdC1yZWxheGVkLWNvbnN0ZXhwciIpCisgIGlmICgke0NVREFfVkVSU0lPTn0gU1RSRVFVQUwgIjcuMCIpCisgICAgc2V0KEVJR0VOX0NVREFfUkVMQVhFRF9DT05TVEVYUFIgIi0tcmVsYXhlZC1jb25zdGV4cHIiKQorICBlbmRpZigpCisKKyAgaWYoIChOT1QgRUlHRU5fVEVTVF9DWFgxMSkgT1IgKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMykpCisgICAgc2V0KEVJR0VOX0NVREFfQ1hYMTFfRkxBRyAiLXN0ZD1jKysxMSIpCisgIGVsc2UoKQorICAgICMgb3RoZXJ3aXNlIHRoZSBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgYmVjYXVzZSBvZiB0aGUgYWJvdmUgc2V0KENNQUtFX0NYWF9TVEFOREFSRCAxMSkKKyAgICBzZXQoRUlHRU5fQ1VEQV9DWFgxMV9GTEFHICIiKQorICBlbmRpZigpCisKKyAgc2V0KENVREFfTlZDQ19GTEFHUyAgIiR7RUlHRU5fQ1VEQV9DWFgxMV9GTEFHfSAke0VJR0VOX0NVREFfUkVMQVhFRF9DT05TVEVYUFJ9IC1hcmNoIGNvbXB1dGVfJHtFSUdFTl9DVURBX0NPTVBVVEVfQVJDSH0gLVhjdWRhZmUgXCItLWRpc3BsYXlfZXJyb3JfbnVtYmVyXCIgJHtDVURBX05WQ0NfRkxBR1N9IikKKyAgY3VkYV9pbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iICIke0NVREFfVE9PTEtJVF9ST09UX0RJUn0vaW5jbHVkZSIpCisgIHNldChFSUdFTl9BRERfVEVTVF9GSUxFTkFNRV9FWFRFTlNJT04gImN1IikKKworICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfY29tcGxleF9jdWRhKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfY29tcGxleF9jd2lzZV9vcHNfY3VkYSkKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9jdWRhKQorICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfYXJnbWF4X2N1ZGEpCisgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jYXN0X2Zsb2F0MTZfY3VkYSkKKyAgZWlfYWRkX3Rlc3QoY3h4MTFfdGVuc29yX3NjYW5fY3VkYSkKKworICAjIENvbnRyYWN0aW9ucyByZXF1aXJlIGFyY2ggMy4wIG9yIGhpZ2hlcgorICBpZiAoJHtFSUdFTl9DVURBX0NPTVBVVEVfQVJDSH0gR1JFQVRFUiAyOSkKKyAgICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfZGV2aWNlKQorICAgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jdWRhKQorICAgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9jb250cmFjdF9jdWRhKQorICAgIGVpX2FkZF90ZXN0KGN4eDExX3RlbnNvcl9vZl9mbG9hdDE2X2N1ZGEpCisgIGVuZGlmKCkKKworICAjIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gY29kZSByZXF1aXJlcyBhcmNoIDMuNSBvciBncmVhdGVyLgorICBpZiAoJHtFSUdFTl9DVURBX0NPTVBVVEVfQVJDSH0gR1JFQVRFUiAzNCkKKyAgICBlaV9hZGRfdGVzdChjeHgxMV90ZW5zb3JfcmFuZG9tX2N1ZGEpCisgIGVuZGlmKCkKKworCisgIHVuc2V0KEVJR0VOX0FERF9URVNUX0ZJTEVOQU1FX0VYVEVOU0lPTikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRXVsZXJBbmdsZXMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9FdWxlckFuZ2xlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYjUyOAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvRXVsZXJBbmdsZXMuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBUYWwgSGFkYWQgPHRhbF9oZEBob3RtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9FdWxlckFuZ2xlcz4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFdWxlclN5c3RlbSwgdHlwZW5hbWUgU2NhbGFyPgordm9pZCB2ZXJpZnlfZXVsZXJfcmFuZ2VkKGNvbnN0IE1hdHJpeDxTY2FsYXIsMywxPiYgZWEsCisgIGJvb2wgcG9zaXRpdmVSYW5nZUFscGhhLCBib29sIHBvc2l0aXZlUmFuZ2VCZXRhLCBib29sIHBvc2l0aXZlUmFuZ2VHYW1tYSkKK3sKKyAgdHlwZWRlZiBFdWxlckFuZ2xlczxTY2FsYXIsIEV1bGVyU3lzdGVtPiBFdWxlckFuZ2xlc1R5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb25UeXBlOworICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc1R5cGU7CisgIHVzaW5nIHN0ZDo6YWJzOworICAKKyAgU2NhbGFyIGFscGhhUmFuZ2VTdGFydCwgYWxwaGFSYW5nZUVuZDsKKyAgU2NhbGFyIGJldGFSYW5nZVN0YXJ0LCBiZXRhUmFuZ2VFbmQ7CisgIFNjYWxhciBnYW1tYVJhbmdlU3RhcnQsIGdhbW1hUmFuZ2VFbmQ7CisgIAorICBpZiAocG9zaXRpdmVSYW5nZUFscGhhKQorICB7CisgICAgYWxwaGFSYW5nZVN0YXJ0ID0gU2NhbGFyKDApOworICAgIGFscGhhUmFuZ2VFbmQgPSBTY2FsYXIoMiAqIEVJR0VOX1BJKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhbHBoYVJhbmdlU3RhcnQgPSAtU2NhbGFyKEVJR0VOX1BJKTsKKyAgICBhbHBoYVJhbmdlRW5kID0gU2NhbGFyKEVJR0VOX1BJKTsKKyAgfQorICAKKyAgaWYgKHBvc2l0aXZlUmFuZ2VCZXRhKQorICB7CisgICAgYmV0YVJhbmdlU3RhcnQgPSBTY2FsYXIoMCk7CisgICAgYmV0YVJhbmdlRW5kID0gU2NhbGFyKDIgKiBFSUdFTl9QSSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYmV0YVJhbmdlU3RhcnQgPSAtU2NhbGFyKEVJR0VOX1BJKTsKKyAgICBiZXRhUmFuZ2VFbmQgPSBTY2FsYXIoRUlHRU5fUEkpOworICB9CisgIAorICBpZiAocG9zaXRpdmVSYW5nZUdhbW1hKQorICB7CisgICAgZ2FtbWFSYW5nZVN0YXJ0ID0gU2NhbGFyKDApOworICAgIGdhbW1hUmFuZ2VFbmQgPSBTY2FsYXIoMiAqIEVJR0VOX1BJKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBnYW1tYVJhbmdlU3RhcnQgPSAtU2NhbGFyKEVJR0VOX1BJKTsKKyAgICBnYW1tYVJhbmdlRW5kID0gU2NhbGFyKEVJR0VOX1BJKTsKKyAgfQorICAKKyAgY29uc3QgaW50IGkgPSBFdWxlclN5c3RlbTo6QWxwaGFBeGlzQWJzIC0gMTsKKyAgY29uc3QgaW50IGogPSBFdWxlclN5c3RlbTo6QmV0YUF4aXNBYnMgLSAxOworICBjb25zdCBpbnQgayA9IEV1bGVyU3lzdGVtOjpHYW1tYUF4aXNBYnMgLSAxOworICAKKyAgY29uc3QgaW50IGlGYWN0b3IgPSBFdWxlclN5c3RlbTo6SXNBbHBoYU9wcG9zaXRlID8gLTEgOiAxOworICBjb25zdCBpbnQgakZhY3RvciA9IEV1bGVyU3lzdGVtOjpJc0JldGFPcHBvc2l0ZSA/IC0xIDogMTsKKyAgY29uc3QgaW50IGtGYWN0b3IgPSBFdWxlclN5c3RlbTo6SXNHYW1tYU9wcG9zaXRlID8gLTEgOiAxOworICAKKyAgY29uc3QgVmVjdG9yMyBJID0gRXVsZXJBbmdsZXNUeXBlOjpBbHBoYUF4aXNWZWN0b3IoKTsKKyAgY29uc3QgVmVjdG9yMyBKID0gRXVsZXJBbmdsZXNUeXBlOjpCZXRhQXhpc1ZlY3RvcigpOworICBjb25zdCBWZWN0b3IzIEsgPSBFdWxlckFuZ2xlc1R5cGU6OkdhbW1hQXhpc1ZlY3RvcigpOworICAKKyAgRXVsZXJBbmdsZXNUeXBlIGUoZWFbMF0sIGVhWzFdLCBlYVsyXSk7CisgIAorICBNYXRyaXgzIG0oZSk7CisgIFZlY3RvcjMgZWFiaXMgPSBFdWxlckFuZ2xlc1R5cGUobSwgcG9zaXRpdmVSYW5nZUFscGhhLCBwb3NpdGl2ZVJhbmdlQmV0YSwgcG9zaXRpdmVSYW5nZUdhbW1hKS5hbmdsZXMoKTsKKyAgCisgIC8vIENoZWNrIHRoYXQgZWFiaXMgaW4gcmFuZ2UKKyAgVkVSSUZZKGFscGhhUmFuZ2VTdGFydCA8PSBlYWJpc1swXSAmJiBlYWJpc1swXSA8PSBhbHBoYVJhbmdlRW5kKTsKKyAgVkVSSUZZKGJldGFSYW5nZVN0YXJ0IDw9IGVhYmlzWzFdICYmIGVhYmlzWzFdIDw9IGJldGFSYW5nZUVuZCk7CisgIFZFUklGWShnYW1tYVJhbmdlU3RhcnQgPD0gZWFiaXNbMl0gJiYgZWFiaXNbMl0gPD0gZ2FtbWFSYW5nZUVuZCk7CisgIAorICBWZWN0b3IzIGVhYmlzMiA9IG0uZXVsZXJBbmdsZXMoaSwgaiwgayk7CisgIAorICAvLyBJbnZlcnQgdGhlIHJlbGV2YW50IGF4ZXMKKyAgZWFiaXMyWzBdICo9IGlGYWN0b3I7CisgIGVhYmlzMlsxXSAqPSBqRmFjdG9yOworICBlYWJpczJbMl0gKj0ga0ZhY3RvcjsKKyAgCisgIC8vIFNhdHVyYXRlIHRoZSBhbmdsZXMgdG8gdGhlIGNvcnJlY3QgcmFuZ2UKKyAgaWYgKHBvc2l0aXZlUmFuZ2VBbHBoYSAmJiAoZWFiaXMyWzBdIDwgMCkpCisgICAgZWFiaXMyWzBdICs9IFNjYWxhcigyICogRUlHRU5fUEkpOworICBpZiAocG9zaXRpdmVSYW5nZUJldGEgJiYgKGVhYmlzMlsxXSA8IDApKQorICAgIGVhYmlzMlsxXSArPSBTY2FsYXIoMiAqIEVJR0VOX1BJKTsKKyAgaWYgKHBvc2l0aXZlUmFuZ2VHYW1tYSAmJiAoZWFiaXMyWzJdIDwgMCkpCisgICAgZWFiaXMyWzJdICs9IFNjYWxhcigyICogRUlHRU5fUEkpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChlYWJpcywgZWFiaXMyKTsvLyBWZXJpZnkgdGhhdCBvdXIgZXN0aW1hdGlvbiBpcyB0aGUgc2FtZSBhcyBtLmV1bGVyQW5nbGVzKCkgaXMKKyAgCisgIE1hdHJpeDMgbWJpcyhBbmdsZUF4aXNUeXBlKGVhYmlzWzBdLCBJKSAqIEFuZ2xlQXhpc1R5cGUoZWFiaXNbMV0sIEopICogQW5nbGVBeGlzVHlwZShlYWJpc1syXSwgSykpOworICBWRVJJRllfSVNfQVBQUk9YKG0sICBtYmlzKTsKKyAgCisgIC8vIFRlc3RzIHRoYXQgYXJlIG9ubHkgcmVsZXZhbnQgZm9yIG5vIHBvc3NpdGl2ZSByYW5nZQorICBpZiAoIShwb3NpdGl2ZVJhbmdlQWxwaGEgfHwgcG9zaXRpdmVSYW5nZUJldGEgfHwgcG9zaXRpdmVSYW5nZUdhbW1hKSkKKyAgeworICAgIC8qIElmIEk9PUssIGFuZCBlYVsxXT09MCwgdGhlbiB0aGVyZSBubyB1bmlxdWUgc29sdXRpb24uICovIAorICAgIC8qIFRoZSByZW1hcmsgYXBwbHkgaW4gdGhlIGNhc2Ugd2hlcmUgSSE9SywgYW5kIHxlYVsxXXwgaXMgY2xvc2UgdG8gcGkvMi4gKi8gCisgICAgaWYoIChpIT1rIHx8IGVhWzFdIT0wKSAmJiAoaT09ayB8fCAhaW50ZXJuYWw6OmlzQXBwcm94KGFicyhlYVsxXSksU2NhbGFyKEVJR0VOX1BJLzIpLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpICkgCisgICAgICBWRVJJRlkoKGVhLWVhYmlzKS5ub3JtKCkgPD0gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKTsKKyAgICAKKyAgICAvLyBhcHByb3hfb3JfbGVzc190aGFuIGRvZXMgbm90IHdvcmsgZm9yIDAKKyAgICBWRVJJRlkoMCA8IGVhYmlzWzBdIHx8IHRlc3RfaXNNdWNoU21hbGxlclRoYW4oZWFiaXNbMF0sIFNjYWxhcigxKSkpOworICB9CisgIAorICAvLyBRdWF0ZXJuaW9ucworICBRdWF0ZXJuaW9uVHlwZSBxKGUpOworICBlYWJpcyA9IEV1bGVyQW5nbGVzVHlwZShxLCBwb3NpdGl2ZVJhbmdlQWxwaGEsIHBvc2l0aXZlUmFuZ2VCZXRhLCBwb3NpdGl2ZVJhbmdlR2FtbWEpLmFuZ2xlcygpOworICBWRVJJRllfSVNfQVBQUk9YKGVhYmlzLCBlYWJpczIpOy8vIFZlcmlmeSB0aGF0IHRoZSBldWxlciBhbmdsZXMgYXJlIHN0aWxsIHRoZSBzYW1lCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV1bGVyU3lzdGVtLCB0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHZlcmlmeV9ldWxlcihjb25zdCBNYXRyaXg8U2NhbGFyLDMsMT4mIGVhKQoreworICB2ZXJpZnlfZXVsZXJfcmFuZ2VkPEV1bGVyU3lzdGVtPihlYSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV9ldWxlcl9yYW5nZWQ8RXVsZXJTeXN0ZW0+KGVhLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICB2ZXJpZnlfZXVsZXJfcmFuZ2VkPEV1bGVyU3lzdGVtPihlYSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgdmVyaWZ5X2V1bGVyX3JhbmdlZDxFdWxlclN5c3RlbT4oZWEsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgdmVyaWZ5X2V1bGVyX3JhbmdlZDxFdWxlclN5c3RlbT4oZWEsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV9ldWxlcl9yYW5nZWQ8RXVsZXJTeXN0ZW0+KGVhLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgIHZlcmlmeV9ldWxlcl9yYW5nZWQ8RXVsZXJTeXN0ZW0+KGVhLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgIHZlcmlmeV9ldWxlcl9yYW5nZWQ8RXVsZXJTeXN0ZW0+KGVhLCB0cnVlLCB0cnVlLCB0cnVlKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGNoZWNrX2FsbF92YXIoY29uc3QgTWF0cml4PFNjYWxhciwzLDE+JiBlYSkKK3sKKyAgdmVyaWZ5X2V1bGVyPEV1bGVyU3lzdGVtWFlaPihlYSk7CisgIHZlcmlmeV9ldWxlcjxFdWxlclN5c3RlbVhZWD4oZWEpOworICB2ZXJpZnlfZXVsZXI8RXVsZXJTeXN0ZW1YWlk+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyPEV1bGVyU3lzdGVtWFpYPihlYSk7CisgIAorICB2ZXJpZnlfZXVsZXI8RXVsZXJTeXN0ZW1ZWlg+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyPEV1bGVyU3lzdGVtWVpZPihlYSk7CisgIHZlcmlmeV9ldWxlcjxFdWxlclN5c3RlbVlYWj4oZWEpOworICB2ZXJpZnlfZXVsZXI8RXVsZXJTeXN0ZW1ZWFk+KGVhKTsKKyAgCisgIHZlcmlmeV9ldWxlcjxFdWxlclN5c3RlbVpYWT4oZWEpOworICB2ZXJpZnlfZXVsZXI8RXVsZXJTeXN0ZW1aWFo+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyPEV1bGVyU3lzdGVtWllYPihlYSk7CisgIHZlcmlmeV9ldWxlcjxFdWxlclN5c3RlbVpZWj4oZWEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZXVsZXJhbmdsZXMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwzLDE+IEFycmF5MzsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzVHlwZTsKKworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CisgIFF1YXRlcm5pb254IHExOworICBxMSA9IEFuZ2xlQXhpc1R5cGUoYSwgVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpKTsKKyAgTWF0cml4MyBtOworICBtID0gcTE7CisgIAorICBWZWN0b3IzIGVhID0gbS5ldWxlckFuZ2xlcygwLDEsMik7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICBlYSA9IG0uZXVsZXJBbmdsZXMoMCwxLDApOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgCisgIC8vIENoZWNrIHdpdGggcHVyZWx5IHJhbmRvbSBRdWF0ZXJuaW9uOgorICBxMS5jb2VmZnMoKSA9IFF1YXRlcm5pb254OjpDb2VmZmljaWVudHM6OlJhbmRvbSgpLm5vcm1hbGl6ZWQoKTsKKyAgbSA9IHExOworICBlYSA9IG0uZXVsZXJBbmdsZXMoMCwxLDIpOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgZWEgPSBtLmV1bGVyQW5nbGVzKDAsMSwwKTsKKyAgY2hlY2tfYWxsX3ZhcihlYSk7CisgIAorICAvLyBDaGVjayB3aXRoIHJhbmRvbSBhbmdsZXMgaW4gcmFuZ2UgWzA6cGldeFstcGk6cGldeFstcGk6cGldLgorICBlYSA9IChBcnJheTM6OlJhbmRvbSgpICsgQXJyYXkzKDEsMCwwKSkqU2NhbGFyKEVJR0VOX1BJKSpBcnJheTMoMC41LDEsMSk7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWFbMl0gPSBlYVswXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLFNjYWxhcihFSUdFTl9QSSkpOworICBjaGVja19hbGxfdmFyKGVhKTsKKyAgCisgIGVhWzBdID0gZWFbMV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCxTY2FsYXIoRUlHRU5fUEkpKTsKKyAgY2hlY2tfYWxsX3ZhcihlYSk7CisgIAorICBlYVsxXSA9IDA7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWEuaGVhZCgyKS5zZXRaZXJvKCk7CisgIGNoZWNrX2FsbF92YXIoZWEpOworICAKKyAgZWEuc2V0WmVybygpOworICBjaGVja19hbGxfdmFyKGVhKTsKK30KKwordm9pZCB0ZXN0X0V1bGVyQW5nbGVzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggZXVsZXJhbmdsZXM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZXVsZXJhbmdsZXM8ZG91YmxlPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZULmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvRkZULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM4N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9GRlQuY3BwCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSB0ZXN0X0ZGVFcgdGVzdF9GRlQKKyNpbmNsdWRlICJGRlRXLmNwcCIKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZUVy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L0ZGVFcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzUyOGYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L0ZGVFcuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBNYXJrIEJvcmdlcmRpbmcgbWFyayBhIGJvcmdlcmRpbmcgbmV0CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0ZGVD4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IAorc3RkOjpjb21wbGV4PFQ+IFJhbmRvbUNweCgpIHsgcmV0dXJuIHN0ZDo6Y29tcGxleDxUPiggKFQpKHJhbmQoKS8oVClSQU5EX01BWCAtIC41KSwgKFQpKHJhbmQoKS8oVClSQU5EX01BWCAtIC41KSApOyB9CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKwordGVtcGxhdGUgPCB0eXBlbmFtZSBUPgorY29tcGxleDxsb25nIGRvdWJsZT4gIHByb21vdGUoY29tcGxleDxUPiB4KSB7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPigobG9uZyBkb3VibGUpeC5yZWFsKCksKGxvbmcgZG91YmxlKXguaW1hZygpKTsgfQorCitjb21wbGV4PGxvbmcgZG91YmxlPiAgcHJvbW90ZShmbG9hdCB4KSB7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPigobG9uZyBkb3VibGUpeCk7IH0KK2NvbXBsZXg8bG9uZyBkb3VibGU+ICBwcm9tb3RlKGRvdWJsZSB4KSB7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPigobG9uZyBkb3VibGUpeCk7IH0KK2NvbXBsZXg8bG9uZyBkb3VibGU+ICBwcm9tb3RlKGxvbmcgZG91YmxlIHgpIHsgcmV0dXJuIGNvbXBsZXg8bG9uZyBkb3VibGU+KChsb25nIGRvdWJsZSl4KTsgfQorICAgIAorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZUMSx0eXBlbmFtZSBWVDI+CisgICAgbG9uZyBkb3VibGUgZmZ0X3Jtc2UoIGNvbnN0IFZUMSAmIGZmdGJ1Zixjb25zdCBWVDIgJiB0aW1lYnVmKQorICAgIHsKKyAgICAgICAgbG9uZyBkb3VibGUgdG90YWxwb3dlcj0wOworICAgICAgICBsb25nIGRvdWJsZSBkaWZwb3dlcj0wOworICAgICAgICBsb25nIGRvdWJsZSBwaSA9IGFjb3MoKGxvbmcgZG91YmxlKS0xICk7CisgICAgICAgIGZvciAoc2l6ZV90IGswPTA7azA8KHNpemVfdClmZnRidWYuc2l6ZSgpOysrazApIHsKKyAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IGFjYyA9IDA7CisgICAgICAgICAgICBsb25nIGRvdWJsZSBwaGluYyA9IChsb25nIGRvdWJsZSkoLTIuKSprMCogcGkgLyB0aW1lYnVmLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsxPTA7azE8KHNpemVfdCl0aW1lYnVmLnNpemUoKTsrK2sxKSB7CisgICAgICAgICAgICAgICAgYWNjICs9ICBwcm9tb3RlKCB0aW1lYnVmW2sxXSApICogZXhwKCBjb21wbGV4PGxvbmcgZG91YmxlPigwLGsxKnBoaW5jKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxwb3dlciArPSBudW1leHQ6OmFiczIoYWNjKTsKKyAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IHggPSBwcm9tb3RlKGZmdGJ1ZltrMF0pOyAKKyAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IGRpZiA9IGFjYyAtIHg7CisgICAgICAgICAgICBkaWZwb3dlciArPSBudW1leHQ6OmFiczIoZGlmKTsKKyAgICAgICAgICAgIC8vY2VyciA8PCBrMCA8PCAiXHQiIDw8IGFjYyA8PCAiXHQiIDw8ICB4IDw8ICJcdCIgPDwgc3FydChudW1leHQ6OmFiczIoZGlmKSkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBjZXJyIDw8ICJybXNlOiIgPDwgc3FydChkaWZwb3dlci90b3RhbHBvd2VyKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gc3FydChkaWZwb3dlci90b3RhbHBvd2VyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVlQxLHR5cGVuYW1lIFZUMj4KKyAgICBsb25nIGRvdWJsZSBkaWZfcm1zZSggY29uc3QgVlQxIGJ1ZjEsY29uc3QgVlQyIGJ1ZjIpCisgICAgeworICAgICAgICBsb25nIGRvdWJsZSB0b3RhbHBvd2VyPTA7CisgICAgICAgIGxvbmcgZG91YmxlIGRpZnBvd2VyPTA7CisgICAgICAgIHNpemVfdCBuID0gKG1pbikoIGJ1ZjEuc2l6ZSgpLGJ1ZjIuc2l6ZSgpICk7CisgICAgICAgIGZvciAoc2l6ZV90IGs9MDtrPG47KytrKSB7CisgICAgICAgICAgICB0b3RhbHBvd2VyICs9IChsb25nIGRvdWJsZSkoKG51bWV4dDo6YWJzMiggYnVmMVtrXSApICsgbnVtZXh0OjphYnMyKGJ1ZjJba10pICkvMik7CisgICAgICAgICAgICBkaWZwb3dlciArPSAobG9uZyBkb3VibGUpKG51bWV4dDo6YWJzMihidWYxW2tdIC0gYnVmMltrXSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcXJ0KGRpZnBvd2VyL3RvdGFscG93ZXIpOworICAgIH0KKworZW51bSB7IFN0ZFZlY3RvckNvbnRhaW5lciwgRWlnZW5WZWN0b3JDb250YWluZXIgfTsKKwordGVtcGxhdGU8aW50IENvbnRhaW5lciwgdHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgVmVjdG9yVHlwZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgVmVjdG9yVHlwZTxTdGRWZWN0b3JDb250YWluZXIsU2NhbGFyPgoreworICB0eXBlZGVmIHZlY3RvcjxTY2FsYXI+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBWZWN0b3JUeXBlPEVpZ2VuVmVjdG9yQ29udGFpbmVyLFNjYWxhcj4KK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gdHlwZTsKK307CisKK3RlbXBsYXRlIDxpbnQgQ29udGFpbmVyLCB0eXBlbmFtZSBUPgordm9pZCB0ZXN0X3NjYWxhcl9nZW5lcmljKGludCBuZmZ0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgRkZUPFQ+OjpDb21wbGV4IENvbXBsZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGRlQ8VD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlPENvbnRhaW5lcixTY2FsYXI+Ojp0eXBlIFNjYWxhclZlY3RvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU8Q29udGFpbmVyLENvbXBsZXg+Ojp0eXBlIENvbXBsZXhWZWN0b3I7CisKKyAgICBGRlQ8VD4gZmZ0OworICAgIFNjYWxhclZlY3RvciB0YnVmKG5mZnQpOworICAgIENvbXBsZXhWZWN0b3IgZnJlcUJ1ZjsKKyAgICBmb3IgKGludCBrPTA7azxuZmZ0OysraykKKyAgICAgICAgdGJ1ZltrXT0gKFQpKCByYW5kKCkvKGRvdWJsZSlSQU5EX01BWCAtIC41KTsKKworICAgIC8vIG1ha2Ugc3VyZSBpdCBET0VTTidUIGdpdmUgdGhlIHJpZ2h0IGZ1bGwgc3BlY3RydW0gYW5zd2VyCisgICAgLy8gaWYgd2UndmUgYXNrZWQgZm9yIGhhbGYtc3BlY3RydW0KKyAgICBmZnQuU2V0RmxhZyhmZnQuSGFsZlNwZWN0cnVtICk7CisgICAgZmZ0LmZ3ZCggZnJlcUJ1Zix0YnVmKTsKKyAgICBWRVJJRlkoKHNpemVfdClmcmVxQnVmLnNpemUoKSA9PSAoc2l6ZV90KSggKG5mZnQ+PjEpKzEpICk7CisgICAgVkVSSUZZKCBUKGZmdF9ybXNlKGZyZXFCdWYsdGJ1ZikpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworCisgICAgZmZ0LkNsZWFyRmxhZyhmZnQuSGFsZlNwZWN0cnVtICk7CisgICAgZmZ0LmZ3ZCggZnJlcUJ1Zix0YnVmKTsKKyAgICBWRVJJRlkoIChzaXplX3QpZnJlcUJ1Zi5zaXplKCkgPT0gKHNpemVfdCluZmZ0KTsKKyAgICBWRVJJRlkoIFQoZmZ0X3Jtc2UoZnJlcUJ1Zix0YnVmKSkgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICApOy8vIGdyb3NzIGNoZWNrCisKKyAgICBpZiAobmZmdCYxKQorICAgICAgICByZXR1cm47IC8vIG9kZCBGRlRzIGdldCB0aGUgd3Jvbmcgc2l6ZSBpbnZlcnNlIEZGVAorCisgICAgU2NhbGFyVmVjdG9yIHRidWYyOworICAgIGZmdC5pbnYoIHRidWYyICwgZnJlcUJ1Zik7CisgICAgVkVSSUZZKCBUKGRpZl9ybXNlKHRidWYsdGJ1ZjIpKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgICk7Ly8gZ3Jvc3MgY2hlY2sKKworCisgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIFVuc2NhbGVkIGZsYWcgdGFrZXMgZWZmZWN0CisgICAgU2NhbGFyVmVjdG9yIHRidWYzOworICAgIGZmdC5TZXRGbGFnKGZmdC5VbnNjYWxlZCk7CisKKyAgICBmZnQuaW52KCB0YnVmMyAsIGZyZXFCdWYpOworCisgICAgZm9yIChpbnQgaz0wO2s8bmZmdDsrK2spCisgICAgICAgIHRidWYzW2tdICo9IFQoMS4vbmZmdCk7CisKKworICAgIC8vZm9yIChzaXplX3QgaT0wO2k8KHNpemVfdCkgdGJ1Zi5zaXplKCk7KytpKQorICAgIC8vICAgIGNvdXQgPDwgImZyZXFCdWY9IiA8PCBmcmVxQnVmW2ldIDw8ICIgaW4yPSIgPDwgdGJ1ZjNbaV0gPDwgIiAtICBpbj0iIDw8IHRidWZbaV0gPDwgIiA9PiAiIDw8ICh0YnVmM1tpXSAtIHRidWZbaV0gKSA8PCAgZW5kbDsKKworICAgIFZFUklGWSggVChkaWZfcm1zZSh0YnVmLHRidWYzKSkgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICApOy8vIGdyb3NzIGNoZWNrCisKKyAgICAvLyB2ZXJpZnkgdGhhdCBDbGVhckZsYWcgd29ya3MKKyAgICBmZnQuQ2xlYXJGbGFnKGZmdC5VbnNjYWxlZCk7CisgICAgZmZ0LmludiggdGJ1ZjIgLCBmcmVxQnVmKTsKKyAgICBWRVJJRlkoIFQoZGlmX3Jtc2UodGJ1Zix0YnVmMikpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9zY2FsYXIoaW50IG5mZnQpCit7CisgIHRlc3Rfc2NhbGFyX2dlbmVyaWM8U3RkVmVjdG9yQ29udGFpbmVyLFQ+KG5mZnQpOworICAvL3Rlc3Rfc2NhbGFyX2dlbmVyaWM8RWlnZW5WZWN0b3JDb250YWluZXIsVD4obmZmdCk7Cit9CisKKwordGVtcGxhdGUgPGludCBDb250YWluZXIsIHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfY29tcGxleF9nZW5lcmljKGludCBuZmZ0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgRkZUPFQ+OjpDb21wbGV4IENvbXBsZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlPENvbnRhaW5lcixDb21wbGV4Pjo6dHlwZSBDb21wbGV4VmVjdG9yOworCisgICAgRkZUPFQ+IGZmdDsKKworICAgIENvbXBsZXhWZWN0b3IgaW5idWYobmZmdCk7CisgICAgQ29tcGxleFZlY3RvciBvdXRidWY7CisgICAgQ29tcGxleFZlY3RvciBidWYzOworICAgIGZvciAoaW50IGs9MDtrPG5mZnQ7KytrKQorICAgICAgICBpbmJ1ZltrXT0gQ29tcGxleCggKFQpKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYIC0gLjUpLCAoVCkocmFuZCgpLyhkb3VibGUpUkFORF9NQVggLSAuNSkgKTsKKyAgICBmZnQuZndkKCBvdXRidWYgLCBpbmJ1Zik7CisKKyAgICBWRVJJRlkoIFQoZmZ0X3Jtc2Uob3V0YnVmLGluYnVmKSkgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICApOy8vIGdyb3NzIGNoZWNrCisgICAgZmZ0LmludiggYnVmMyAsIG91dGJ1Zik7CisKKyAgICBWRVJJRlkoIFQoZGlmX3Jtc2UoaW5idWYsYnVmMykpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworCisgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIFVuc2NhbGVkIGZsYWcgdGFrZXMgZWZmZWN0CisgICAgQ29tcGxleFZlY3RvciBidWY0OworICAgIGZmdC5TZXRGbGFnKGZmdC5VbnNjYWxlZCk7CisgICAgZmZ0LmludiggYnVmNCAsIG91dGJ1Zik7CisgICAgZm9yIChpbnQgaz0wO2s8bmZmdDsrK2spCisgICAgICAgIGJ1ZjRba10gKj0gVCgxLi9uZmZ0KTsKKyAgICBWRVJJRlkoIFQoZGlmX3Jtc2UoaW5idWYsYnVmNCkpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworCisgICAgLy8gdmVyaWZ5IHRoYXQgQ2xlYXJGbGFnIHdvcmtzCisgICAgZmZ0LkNsZWFyRmxhZyhmZnQuVW5zY2FsZWQpOworICAgIGZmdC5pbnYoIGJ1ZjMgLCBvdXRidWYpOworICAgIFZFUklGWSggVChkaWZfcm1zZShpbmJ1ZixidWYzKSkgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICApOy8vIGdyb3NzIGNoZWNrCit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2NvbXBsZXgoaW50IG5mZnQpCit7CisgIHRlc3RfY29tcGxleF9nZW5lcmljPFN0ZFZlY3RvckNvbnRhaW5lcixUPihuZmZ0KTsKKyAgdGVzdF9jb21wbGV4X2dlbmVyaWM8RWlnZW5WZWN0b3JDb250YWluZXIsVD4obmZmdCk7Cit9CisvKgordGVtcGxhdGUgPHR5cGVuYW1lIFQsaW50IG5yb3dzLGludCBuY29scz4KK3ZvaWQgdGVzdF9jb21wbGV4MmQoKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OkZGVDxUPjo6Q29tcGxleCBDb21wbGV4OworICAgIEZGVDxUPiBmZnQ7CisgICAgRWlnZW46Ok1hdHJpeDxDb21wbGV4LG5yb3dzLG5jb2xzPiBzcmMsc3JjMixkc3QsZHN0MjsKKworICAgIHNyYyA9IEVpZ2VuOjpNYXRyaXg8Q29tcGxleCxucm93cyxuY29scz46OlJhbmRvbSgpOworICAgIC8vc3JjID0gIEVpZ2VuOjpNYXRyaXg8Q29tcGxleCxucm93cyxuY29scz46OklkZW50aXR5KCk7CisKKyAgICBmb3IgKGludCBrPTA7azxuY29scztrKyspIHsKKyAgICAgICAgRWlnZW46Ok1hdHJpeDxDb21wbGV4LG5yb3dzLDE+IHRtcE91dDsKKyAgICAgICAgZmZ0LmZ3ZCggdG1wT3V0LHNyYy5jb2woaykgKTsKKyAgICAgICAgZHN0Mi5jb2woaykgPSB0bXBPdXQ7CisgICAgfQorCisgICAgZm9yIChpbnQgaz0wO2s8bnJvd3M7aysrKSB7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8Q29tcGxleCwxLG5jb2xzPiB0bXBPdXQ7CisgICAgICAgIGZmdC5md2QoIHRtcE91dCwgIGRzdDIucm93KGspICk7CisgICAgICAgIGRzdDIucm93KGspID0gdG1wT3V0OworICAgIH0KKworICAgIGZmdC5md2QyKGRzdC5kYXRhKCksc3JjLmRhdGEoKSxuY29scyxucm93cyk7CisgICAgZmZ0LmludjIoc3JjMi5kYXRhKCksZHN0LmRhdGEoKSxuY29scyxucm93cyk7CisgICAgVkVSSUZZKCAoc3JjLXNyYzIpLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgKTsKKyAgICBWRVJJRlkoIChkc3QtZHN0Mikubm9ybSgpIDwgdGVzdF9wcmVjaXNpb248VD4oKSApOworfQorKi8KKworCit2b2lkIHRlc3RfcmV0dXJuX2J5X3ZhbHVlKGludCBsZW4pCit7CisgICAgVmVjdG9yWGYgaW47CisgICAgVmVjdG9yWGYgaW4xOworICAgIGluLnNldFJhbmRvbSggbGVuICk7CisgICAgVmVjdG9yWGNmIG91dDEsb3V0MjsKKyAgICBGRlQ8ZmxvYXQ+IGZmdDsKKworICAgIGZmdC5TZXRGbGFnKGZmdC5IYWxmU3BlY3RydW0gKTsKKworICAgIGZmdC5md2Qob3V0MSxpbik7CisgICAgb3V0MiA9IGZmdC5md2QoaW4pOworICAgIFZFUklGWSggKG91dDEtb3V0Mikubm9ybSgpIDwgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkgKTsKKyAgICBpbjEgPSBmZnQuaW52KG91dDEpOworICAgIFZFUklGWSggKGluMS1pbikubm9ybSgpIDwgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkgKTsKK30KKwordm9pZCB0ZXN0X0ZGVFcoKQoreworICBDQUxMX1NVQlRFU1QoIHRlc3RfcmV0dXJuX2J5X3ZhbHVlKDMyKSApOworICAvL0NBTExfU1VCVEVTVCggKCB0ZXN0X2NvbXBsZXgyZDxmbG9hdCw0LDg+ICgpICkgKTsgQ0FMTF9TVUJURVNUKCAoIHRlc3RfY29tcGxleDJkPGRvdWJsZSw0LDg+ICgpICkgKTsKKyAgLy9DQUxMX1NVQlRFU1QoICggdGVzdF9jb21wbGV4MmQ8bG9uZyBkb3VibGUsNCw4PiAoKSApICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigzMikgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZG91YmxlPigzMikgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigyNTYpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oMjU2KSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZmxvYXQ+KDMqOCkgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZG91YmxlPigzKjgpICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxmbG9hdD4oNSozMikgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZG91YmxlPig1KjMyKSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZmxvYXQ+KDIqMyo0KSApOyBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxkb3VibGU+KDIqMyo0KSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZmxvYXQ+KDIqMyo0KjUpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oMiozKjQqNSkgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigyKjMqNCo1KjcpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oMiozKjQqNSo3KSApOyAKKworICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGZsb2F0PigzMikgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxkb3VibGU+KDMyKSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxmbG9hdD4oNDUpICk7IENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZG91YmxlPig0NSkgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZmxvYXQ+KDUwKSApOyBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGRvdWJsZT4oNTApICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGZsb2F0PigyNTYpICk7IENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZG91YmxlPigyNTYpICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGZsb2F0PigyKjMqNCo1KjcpICk7IENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZG91YmxlPigyKjMqNCo1KjcpICk7IAorICAKKyAgI2lmZGVmIEVJR0VOX0hBU19GRlRXTAorICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMzIpICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGxvbmcgZG91YmxlPigyNTYpICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGxvbmcgZG91YmxlPigzKjgpICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGxvbmcgZG91YmxlPig1KjMyKSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMiozKjQpICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGxvbmcgZG91YmxlPigyKjMqNCo1KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMiozKjQqNSo3KSApOworICAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxsb25nIGRvdWJsZT4oMzIpICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8bG9uZyBkb3VibGU+KDQ1KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGxvbmcgZG91YmxlPig1MCkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxsb25nIGRvdWJsZT4oMjU2KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGxvbmcgZG91YmxlPigyKjMqNCo1KjcpICk7CisgICNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjgyZGQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L05vbkxpbmVhck9wdGltaXphdGlvbi5jcHAKQEAgLTAsMCArMSwxODc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Ob25MaW5lYXJPcHRpbWl6YXRpb24+CisKKy8vIFRoaXMgZGlzYWJsZXMgc29tZSB1c2VsZXNzIFdhcm5pbmdzIG9uIE1TVkMuCisvLyBJdCBpcyBpbnRlbmRlZCB0byBiZSBkb25lIGZvciB0aGlzIHRlc3Qgb25seS4KKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oPgorCisvLyB0b2xlcmFuY2UgZm9yIGNoZWtjaW5nIG51bWJlciBvZiBpdGVyYXRpb25zCisjZGVmaW5lIExNX0VWQUxfQ09VTlRfVE9MIDQvMworCitpbnQgZmNuX2Noa2Rlcihjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMsIE1hdHJpeFhkICZmamFjLCBpbnQgaWZsYWcpCit7CisgICAgLyogICAgICBzdWJyb3V0aW5lIGZjbiBmb3IgY2hrZGVyIGV4YW1wbGUuICovCisKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQoMTUgPT0gIGZ2ZWMuc2l6ZSgpKTsKKyAgICBhc3NlcnQoMyA9PSAgeC5zaXplKCkpOworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKKyAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CisKKworICAgIGlmIChpZmxhZyA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChpZmxhZyAhPSAyKQorICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKSB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2LWktMTsKKyAgICAgICAgICAgIHRtcDMgPSB0bXAxOworICAgICAgICAgICAgaWYgKGkgPj0gOCkgdG1wMyA9IHRtcDI7CisgICAgICAgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMS8oeFsxXSp0bXAyICsgeFsyXSp0bXAzKSk7CisgICAgICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTYtaS0xOworCisgICAgICAgICAgICAvKiBlcnJvciBpbnRyb2R1Y2VkIGludG8gbmV4dCBzdGF0ZW1lbnQgZm9yIGlsbHVzdHJhdGlvbi4gKi8KKyAgICAgICAgICAgIC8qIGNvcnJlY3RlZCBzdGF0ZW1lbnQgc2hvdWxkIHJlYWQgICAgdG1wMyA9IHRtcDEgLiAqLworCisgICAgICAgICAgICB0bXAzID0gdG1wMjsKKyAgICAgICAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpOyB0bXA0PXRtcDQqdG1wNDsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IC0xLjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHRtcDEqdG1wMi90bXA0OworICAgICAgICAgICAgZmphYyhpLDIpID0gdG1wMSp0bXAzL3RtcDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCB0ZXN0Q2hrZGVyKCkKK3sKKyAgY29uc3QgaW50IG09MTUsIG49MzsKKyAgVmVjdG9yWGQgeChuKSwgZnZlYyhtKSwgeHAsIGZ2ZWNwKG0pLCBlcnI7CisgIE1hdHJpeFhkIGZqYWMobSxuKTsKKyAgVmVjdG9yWGkgaXB2dDsKKworICAvKiAgICAgIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgKi8KKyAgLyogICAgICBjaGVja2luZyB0aGUgamFjb2JpYW4gbWF0cml4LiAqLworICB4IDw8IDkuMmUtMSwgMS4zZS0xLCA1LjRlLTE7CisKKyAgaW50ZXJuYWw6OmNoa2Rlcih4LCBmdmVjLCBmamFjLCB4cCwgZnZlY3AsIDEsIGVycik7CisgIGZjbl9jaGtkZXIoeCwgZnZlYywgZmphYywgMSk7CisgIGZjbl9jaGtkZXIoeCwgZnZlYywgZmphYywgMik7CisgIGZjbl9jaGtkZXIoeHAsIGZ2ZWNwLCBmamFjLCAxKTsKKyAgaW50ZXJuYWw6OmNoa2Rlcih4LCBmdmVjLCBmamFjLCB4cCwgZnZlY3AsIDIsIGVycik7CisKKyAgZnZlY3AgLT0gZnZlYzsKKworICAvLyBjaGVjayB0aG9zZQorICBWZWN0b3JYZCBmdmVjX3JlZihtKSwgZnZlY3BfcmVmKG0pLCBlcnJfcmVmKG0pOworICBmdmVjX3JlZiA8PAorICAgICAgLTEuMTgxNjA2LCAtMS40Mjk2NTUsIC0xLjYwNjM0NCwKKyAgICAgIC0xLjc0NTI2OSwgLTEuODQwNjU0LCAtMS45MjE1ODYsCisgICAgICAtMS45ODQxNDEsIC0yLjAyMjUzNywgLTIuNDY4OTc3LAorICAgICAgLTIuODI3NTYyLCAtMy40NzM1ODIsIC00LjQzNzYxMiwKKyAgICAgIC02LjA0NzY2MiwgLTkuMjY3NzYxLCAtMTguOTE4MDY7CisgIGZ2ZWNwX3JlZiA8PAorICAgICAgLTcuNzI0NjY2ZS0wOSwgLTMuNDMyNDA2ZS0wOSwgLTIuMDM0ODQzZS0xMCwKKyAgICAgIDIuMzEzNjg1ZS0wOSwgIDQuMzMxMDc4ZS0wOSwgIDUuOTg0MDk2ZS0wOSwKKyAgICAgIDcuMzYzMjgxZS0wOSwgICA4LjUzMTQ3ZS0wOSwgIDEuNDg4NTkxZS0wOCwKKyAgICAgIDIuMzM1ODVlLTA4LCAgMy41MjIwMTJlLTA4LCAgNS4zMDEyNTVlLTA4LAorICAgICAgOC4yNjY2NmUtMDgsICAxLjQxOTc0N2UtMDcsICAgMy4xOTg5OWUtMDc7CisgIGVycl9yZWYgPDwKKyAgICAgIDAuMTE0MTM5NywgIDAuMDk5NDM1MTYsICAwLjA5Njc0NDc0LAorICAgICAgMC4wOTk4MDQ0NywgIDAuMTA3MzExNiwgMC4xMjIwNDQ1LAorICAgICAgMC4xNTI2ODE0LCAxLCAxLAorICAgICAgMSwgMSwgMSwKKyAgICAgIDEsIDEsIDE7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmdmVjLCBmdmVjX3JlZik7CisgIFZFUklGWV9JU19BUFBST1goZnZlY3AsIGZ2ZWNwX3JlZik7CisgIFZFUklGWV9JU19BUFBST1goZXJyLCBlcnJfcmVmKTsKK30KKworLy8gR2VuZXJpYyBmdW5jdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+CitzdHJ1Y3QgRnVuY3RvcgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICBlbnVtIHsKKyAgICBJbnB1dHNBdENvbXBpbGVUaW1lID0gTlgsCisgICAgVmFsdWVzQXRDb21waWxlVGltZSA9IE5ZCisgIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixJbnB1dHNBdENvbXBpbGVUaW1lLDE+IElucHV0VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4gVmFsdWVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSxJbnB1dHNBdENvbXBpbGVUaW1lPiBKYWNvYmlhblR5cGU7CisKKyAgY29uc3QgaW50IG1faW5wdXRzLCBtX3ZhbHVlczsKKworICBGdW5jdG9yKCkgOiBtX2lucHV0cyhJbnB1dHNBdENvbXBpbGVUaW1lKSwgbV92YWx1ZXMoVmFsdWVzQXRDb21waWxlVGltZSkge30KKyAgRnVuY3RvcihpbnQgaW5wdXRzLCBpbnQgdmFsdWVzKSA6IG1faW5wdXRzKGlucHV0cyksIG1fdmFsdWVzKHZhbHVlcykge30KKworICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KKyAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgLy8geW91IHNob3VsZCBkZWZpbmUgdGhhdCBpbiB0aGUgc3ViY2xhc3MgOgorLy8gIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgSW5wdXRUeXBlJiB4LCBWYWx1ZVR5cGUqIHYsIEphY29iaWFuVHlwZSogX2o9MCkgY29uc3Q7Cit9OworCitzdHJ1Y3QgbG1kZXJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGxtZGVyX2Z1bmN0b3Iodm9pZCk6IEZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQorICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKKyAgICB7CisgICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKKyAgICAgICAgICAgIDMuOWUtMSwgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAyLjEsIDQuMzl9OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7CisgICAgICAgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMS8oeFsxXSp0bXAyICsgeFsyXSp0bXAzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZ4LCBNYXRyaXhYZCAmZmphYykgY29uc3QKKyAgICB7CisgICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKyAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOworICAgICAgICAgICAgdG1wNCA9ICh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpOyB0bXA0ID0gdG1wNCp0bXA0OworICAgICAgICAgICAgZmphYyhpLDApID0gLTE7CisgICAgICAgICAgICBmamFjKGksMSkgPSB0bXAxKnRtcDIvdG1wNDsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IHRtcDEqdG1wMy90bXA0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3ZvaWQgdGVzdExtZGVyMSgpCit7CisgIGludCBuPTMsIGluZm87CisKKyAgVmVjdG9yWGQgeDsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kZXJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1kZXJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5sbWRlcjEoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDYpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNSk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuYmx1ZU5vcm0oKSwgMC4wOTA2MzU5Nik7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKK30KKwordm9pZCB0ZXN0TG1kZXIoKQoreworICBjb25zdCBpbnQgbT0xNSwgbj0zOworICBpbnQgaW5mbzsKKyAgZG91YmxlIGZub3JtLCBjb3ZmYWM7CisgIFZlY3RvclhkIHg7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAxLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtZGVyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGxtZGVyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlcworICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDUpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgZm5vcm0gPSBsbS5mdmVjLmJsdWVOb3JtKCk7CisgIFZFUklGWV9JU19BUFBST1goZm5vcm0sIDAuMDkwNjM1OTYpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IDAuMDgyNDEwNTgsIDEuMTMzMDM3LCAyLjM0MzY5NTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7CisKKyAgLy8gY2hlY2sgY292YXJpYW5jZQorICBjb3ZmYWMgPSBmbm9ybSpmbm9ybS8obS1uKTsKKyAgaW50ZXJuYWw6OmNvdmFyKGxtLmZqYWMsIGxtLnBlcm11dGF0aW9uLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorCisgIE1hdHJpeFhkIGNvdl9yZWYobixuKTsKKyAgY292X3JlZiA8PAorICAgICAgMC4wMDAxNTMxMjAyLCAgIDAuMDAyODY5OTQxLCAgLTAuMDAyNjU2NjYyLAorICAgICAgMC4wMDI4Njk5NDEsICAgIDAuMDk0ODA5MzUsICAgLTAuMDkwOTg5OTUsCisgICAgICAtMC4wMDI2NTY2NjIsICAgLTAuMDkwOTg5OTUsICAgIDAuMDg3Nzg3Mjc7CisKKy8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworCisgIE1hdHJpeFhkIGNvdjsKKyAgY292ID0gIGNvdmZhYypsbS5mamFjLnRvcExlZnRDb3JuZXI8bixuPigpOworICBWRVJJRllfSVNfQVBQUk9YKCBjb3YsIGNvdl9yZWYpOworICAvLyBUT0RPOiB3aHkgaXNuJ3QgdGhpcyBhbGxvd2VkID8gOgorICAvLyBWRVJJRllfSVNfQVBQUk9YKCBjb3ZmYWMqZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKSAsIGNvdl9yZWYpOworfQorCitzdHJ1Y3QgaHlicmpfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGh5YnJqX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oOSw5KSB7fQorCisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgZG91YmxlIHRlbXAsIHRlbXAxLCB0ZW1wMjsKKyAgICAgICAgY29uc3QgVmVjdG9yWGQ6OkluZGV4IG4gPSB4LnNpemUoKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT1uKTsKKyAgICAgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggayA9IDA7IGsgPCBuOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoMy4gLSAyLip4W2tdKSp4W2tdOworICAgICAgICAgICAgdGVtcDEgPSAwLjsKKyAgICAgICAgICAgIGlmIChrKSB0ZW1wMSA9IHhbay0xXTsKKyAgICAgICAgICAgIHRlbXAyID0gMC47CisgICAgICAgICAgICBpZiAoayAhPSBuLTEpIHRlbXAyID0geFtrKzFdOworICAgICAgICAgICAgZnZlY1trXSA9IHRlbXAgLSB0ZW1wMSAtIDIuKnRlbXAyICsgMS47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBjb25zdCBWZWN0b3JYZDo6SW5kZXggbiA9IHguc2l6ZSgpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PW4pOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PW4pOworICAgICAgICBmb3IgKFZlY3RvclhkOjpJbmRleCBrID0gMDsgayA8IG47IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggaiA9IDA7IGogPCBuOyBqKyspCisgICAgICAgICAgICAgICAgZmphYyhrLGopID0gMC47CisgICAgICAgICAgICBmamFjKGssaykgPSAzLi0gNC4qeFtrXTsKKyAgICAgICAgICAgIGlmIChrKSBmamFjKGssay0xKSA9IC0xLjsKKyAgICAgICAgICAgIGlmIChrICE9IG4tMSkgZmphYyhrLGsrMSkgPSAtMi47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworCit2b2lkIHRlc3RIeWJyajEoKQoreworICBjb25zdCBpbnQgbj05OworICBpbnQgaW5mbzsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIC0xLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGh5YnJqX2Z1bmN0b3IgZnVuY3RvcjsKKyAgSHlicmlkTm9uTGluZWFyU29sdmVyPGh5YnJqX2Z1bmN0b3I+IHNvbHZlcihmdW5jdG9yKTsKKyAgaW5mbyA9IHNvbHZlci5oeWJyajEoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNvbHZlci5uZmV2LCAxMSk7CisgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIubmpldiwgMSk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBWRVJJRllfSVNfQVBQUk9YKHNvbHZlci5mdmVjLmJsdWVOb3JtKCksIDEuMTkyNjM2ZS0wOCk7CisKKworLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwKKyAgICAgLTAuNTcwNjU0NSwgICAgLTAuNjgxNjI4MywgICAgLTAuNzAxNzMyNSwKKyAgICAgLTAuNzA0MjEyOSwgICAgIC0wLjcwMTM2OSwgICAgLTAuNjkxODY1NiwKKyAgICAgLTAuNjY1NzkyLCAgICAtMC41OTYwMzQyLCAgICAtMC40MTY0MTIxOworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKK30KKwordm9pZCB0ZXN0SHlicmooKQoreworICBjb25zdCBpbnQgbj05OworICBpbnQgaW5mbzsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIC0xLik7CisKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaHlicmpfZnVuY3RvciBmdW5jdG9yOworICBIeWJyaWROb25MaW5lYXJTb2x2ZXI8aHlicmpfZnVuY3Rvcj4gc29sdmVyKGZ1bmN0b3IpOworICBzb2x2ZXIuZGlhZy5zZXRDb25zdGFudChuLCAxLik7CisgIHNvbHZlci51c2VFeHRlcm5hbFNjYWxpbmcgPSB0cnVlOworICBpbmZvID0gc29sdmVyLnNvbHZlKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm5qZXYsIDEpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgVkVSSUZZX0lTX0FQUFJPWChzb2x2ZXIuZnZlYy5ibHVlTm9ybSgpLCAxLjE5MjYzNmUtMDgpOworCisKKy8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8CisgICAgIC0wLjU3MDY1NDUsICAgIC0wLjY4MTYyODMsICAgIC0wLjcwMTczMjUsCisgICAgIC0wLjcwNDIxMjksICAgICAtMC43MDEzNjksICAgIC0wLjY5MTg2NTYsCisgICAgIC0wLjY2NTc5MiwgICAgLTAuNTk2MDM0MiwgICAgLTAuNDE2NDEyMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7CisKK30KKworc3RydWN0IGh5YnJkX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBoeWJyZF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDksOSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdGVtcCwgdGVtcDEsIHRlbXAyOworICAgICAgICBjb25zdCBWZWN0b3JYZDo6SW5kZXggbiA9IHguc2l6ZSgpOworCisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09bik7CisgICAgICAgIGZvciAoVmVjdG9yWGQ6OkluZGV4IGs9MDsgayA8IG47IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9ICgzLiAtIDIuKnhba10pKnhba107CisgICAgICAgICAgICB0ZW1wMSA9IDAuOworICAgICAgICAgICAgaWYgKGspIHRlbXAxID0geFtrLTFdOworICAgICAgICAgICAgdGVtcDIgPSAwLjsKKyAgICAgICAgICAgIGlmIChrICE9IG4tMSkgdGVtcDIgPSB4W2srMV07CisgICAgICAgICAgICBmdmVjW2tdID0gdGVtcCAtIHRlbXAxIC0gMi4qdGVtcDIgKyAxLjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCit2b2lkIHRlc3RIeWJyZDEoKQoreworICBpbnQgbj05LCBpbmZvOworICBWZWN0b3JYZCB4KG4pOworCisgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBzb2x1dGlvbi4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAtMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBoeWJyZF9mdW5jdG9yIGZ1bmN0b3I7CisgIEh5YnJpZE5vbkxpbmVhclNvbHZlcjxoeWJyZF9mdW5jdG9yPiBzb2x2ZXIoZnVuY3Rvcik7CisgIGluZm8gPSBzb2x2ZXIuaHlicmQxKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIubmZldiwgMjApOworCisgIC8vIGNoZWNrIG5vcm0KKyAgVkVSSUZZX0lTX0FQUFJPWChzb2x2ZXIuZnZlYy5ibHVlTm9ybSgpLCAxLjE5MjYzNmUtMDgpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IC0wLjU3MDY1NDUsIC0wLjY4MTYyODMsIC0wLjcwMTczMjUsIC0wLjcwNDIxMjksIC0wLjcwMTM2OSwgLTAuNjkxODY1NiwgLTAuNjY1NzkyLCAtMC41OTYwMzQyLCAtMC40MTY0MTIxOworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKK30KKwordm9pZCB0ZXN0SHlicmQoKQoreworICBjb25zdCBpbnQgbj05OworICBpbnQgaW5mbzsKKyAgVmVjdG9yWGQgeDsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIC0xLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGh5YnJkX2Z1bmN0b3IgZnVuY3RvcjsKKyAgSHlicmlkTm9uTGluZWFyU29sdmVyPGh5YnJkX2Z1bmN0b3I+IHNvbHZlcihmdW5jdG9yKTsKKyAgc29sdmVyLnBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzID0gMTsKKyAgc29sdmVyLnBhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHMgPSAxOworICBzb2x2ZXIuZGlhZy5zZXRDb25zdGFudChuLCAxLik7CisgIHNvbHZlci51c2VFeHRlcm5hbFNjYWxpbmcgPSB0cnVlOworICBpbmZvID0gc29sdmVyLnNvbHZlTnVtZXJpY2FsRGlmZih4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm5mZXYsIDE0KTsKKworICAvLyBjaGVjayBub3JtCisgIFZFUklGWV9JU19BUFBST1goc29sdmVyLmZ2ZWMuYmx1ZU5vcm0oKSwgMS4xOTI2MzZlLTA4KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PAorICAgICAgLTAuNTcwNjU0NSwgICAgLTAuNjgxNjI4MywgICAgLTAuNzAxNzMyNSwKKyAgICAgIC0wLjcwNDIxMjksICAgICAtMC43MDEzNjksICAgIC0wLjY5MTg2NTYsCisgICAgICAtMC42NjU3OTIsICAgIC0wLjU5NjAzNDIsICAgIC0wLjQxNjQxMjE7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworfQorCitzdHJ1Y3QgbG1zdHJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGxtc3RyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICAvKiAgc3Vicm91dGluZSBmY24gZm9yIGxtc3RyMSBleGFtcGxlLiAqLworICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XT17MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLAorICAgICAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CisKKyAgICAgICAgYXNzZXJ0KDE1PT1mdmVjLnNpemUoKSk7CisgICAgICAgIGFzc2VydCgzPT14LnNpemUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDE1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKyAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOworICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZqYWNfcm93LCBWZWN0b3JYZDo6SW5kZXggcm93bmIpCisgICAgeworICAgICAgICBhc3NlcnQoeC5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoamFjX3Jvdy5zaXplKCk9PXguc2l6ZSgpKTsKKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisKKyAgICAgICAgVmVjdG9yWGQ6OkluZGV4IGkgPSByb3duYi0yOworICAgICAgICB0bXAxID0gaSsxOworICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKyAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7CisgICAgICAgIHRtcDQgPSAoeFsxXSp0bXAyICsgeFsyXSp0bXAzKTsgdG1wNCA9IHRtcDQqdG1wNDsKKyAgICAgICAgamFjX3Jvd1swXSA9IC0xOworICAgICAgICBqYWNfcm93WzFdID0gdG1wMSp0bXAyL3RtcDQ7CisgICAgICAgIGphY19yb3dbMl0gPSB0bXAxKnRtcDMvdG1wNDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKwordm9pZCB0ZXN0TG1zdHIxKCkKK3sKKyAgY29uc3QgaW50IG49MzsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1zdHJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1zdHJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5sbXN0cjEoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDYpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNSk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuYmx1ZU5vcm0oKSwgMC4wOTA2MzU5Nik7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1IDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Cit9CisKK3ZvaWQgdGVzdExtc3RyKCkKK3sKKyAgY29uc3QgaW50IG49MzsKKyAgaW50IGluZm87CisgIGRvdWJsZSBmbm9ybTsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1zdHJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1zdHJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZU9wdGltdW1TdG9yYWdlKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZXMKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA1KTsKKworICAvLyBjaGVjayBub3JtCisgIGZub3JtID0gbG0uZnZlYy5ibHVlTm9ybSgpOworICBWRVJJRllfSVNfQVBQUk9YKGZub3JtLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDU4LCAxLjEzMzAzNywgMi4zNDM2OTU7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworCit9CisKK3N0cnVjdCBsbWRpZl9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgbG1kaWZfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQorICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBkb3VibGUgdG1wMSx0bXAyLHRtcDM7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwxLjhlLTEsMi4yZS0xLDIuNWUtMSwyLjllLTEsMy4yZS0xLDMuNWUtMSwzLjllLTEsCisgICAgICAgICAgICAzLjdlLTEsNS44ZS0xLDcuM2UtMSw5LjZlLTEsMS4zNGUwLDIuMWUwLDQuMzllMH07CisKKyAgICAgICAgYXNzZXJ0KHguc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNSk7CisgICAgICAgIGZvciAoaT0wOyBpPDE1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTUgLSBpOworICAgICAgICAgICAgdG1wMyA9IHRtcDE7CisKKyAgICAgICAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOworICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3ZvaWQgdGVzdExtZGlmMSgpCit7CisgIGNvbnN0IGludCBuPTM7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobiksIGZ2ZWMoMTUpOworCisgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBmaXQuICovCisgIHguc2V0Q29uc3RhbnQobiwgMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbWRpZl9mdW5jdG9yIGZ1bmN0b3I7CisgIERlbnNlSW5kZXggbmZldjsKKyAgaW5mbyA9IExldmVuYmVyZ01hcnF1YXJkdDxsbWRpZl9mdW5jdG9yPjo6bG1kaWYxKGZ1bmN0b3IsIHgsICZuZmV2KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobmZldiwgMjYpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgZnVuY3Rvcih4LCBmdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmdmVjLmJsdWVOb3JtKCksIDAuMDkwNjM1OTYpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IDAuMDgyNDEwNiwgMS4xMzMwMzY2LCAyLjM0MzY5NDc7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworCit9CisKK3ZvaWQgdGVzdExtZGlmKCkKK3sKKyAgY29uc3QgaW50IG09MTUsIG49MzsKKyAgaW50IGluZm87CisgIGRvdWJsZSBmbm9ybSwgY292ZmFjOworICBWZWN0b3JYZCB4KG4pOworCisgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBmaXQuICovCisgIHguc2V0Q29uc3RhbnQobiwgMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbWRpZl9mdW5jdG9yIGZ1bmN0b3I7CisgIE51bWVyaWNhbERpZmY8bG1kaWZfZnVuY3Rvcj4gbnVtRGlmZihmdW5jdG9yKTsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PE51bWVyaWNhbERpZmY8bG1kaWZfZnVuY3Rvcj4gPiBsbShudW1EaWZmKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZXMKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMjYpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgZm5vcm0gPSBsbS5mdmVjLmJsdWVOb3JtKCk7CisgIFZFUklGWV9JU19BUFBST1goZm5vcm0sIDAuMDkwNjM1OTYpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IDAuMDgyNDEwNTgsIDEuMTMzMDM3LCAyLjM0MzY5NTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7CisKKyAgLy8gY2hlY2sgY292YXJpYW5jZQorICBjb3ZmYWMgPSBmbm9ybSpmbm9ybS8obS1uKTsKKyAgaW50ZXJuYWw6OmNvdmFyKGxtLmZqYWMsIGxtLnBlcm11dGF0aW9uLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorCisgIE1hdHJpeFhkIGNvdl9yZWYobixuKTsKKyAgY292X3JlZiA8PAorICAgICAgMC4wMDAxNTMxMjAyLCAgIDAuMDAyODY5OTQyLCAgLTAuMDAyNjU2NjYyLAorICAgICAgMC4wMDI4Njk5NDIsICAgIDAuMDk0ODA5MzcsICAgLTAuMDkwOTg5OTcsCisgICAgICAtMC4wMDI2NTY2NjIsICAgLTAuMDkwOTg5OTcsICAgIDAuMDg3Nzg3Mjk7CisKKy8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworCisgIE1hdHJpeFhkIGNvdjsKKyAgY292ID0gIGNvdmZhYypsbS5mamFjLnRvcExlZnRDb3JuZXI8bixuPigpOworICBWRVJJRllfSVNfQVBQUk9YKCBjb3YsIGNvdl9yZWYpOworICAvLyBUT0RPOiB3aHkgaXNuJ3QgdGhpcyBhbGxvd2VkID8gOgorICAvLyBWRVJJRllfSVNfQVBQUk9YKCBjb3ZmYWMqZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKSAsIGNvdl9yZWYpOworfQorCitzdHJ1Y3QgY2h3aXJ1dDJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGNod2lydXQyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMyw1NCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFs1NF07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbNTRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09NTQpOworICAgICAgICBmb3IoaT0wOyBpPDU0OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOworICAgICAgICAgICAgZnZlY1tpXSA9IGV4cCgtYlswXSp4KS8oYlsxXStiWzJdKngpIC0gbV95W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT01NCk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Myk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDU0OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOworICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyhiWzFdK2JbMl0qeCk7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlswXSp4KTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IC14KmUqZmFjdG9yOworICAgICAgICAgICAgZmphYyhpLDEpID0gLWUqZmFjdG9yKmZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC14KmUqZmFjdG9yKmZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIGNod2lydXQyX2Z1bmN0b3I6Om1feFs1NF0gPSB7IDAuNTAwRTAsIDEuMDAwRTAsIDEuNzUwRTAsIDMuNzUwRTAsIDUuNzUwRTAsIDAuODc1RTAsIDIuMjUwRTAsIDMuMjUwRTAsIDUuMjUwRTAsIDAuNzUwRTAsIDEuNzUwRTAsIDIuNzUwRTAsIDQuNzUwRTAsIDAuNjI1RTAsIDEuMjUwRTAsIDIuMjUwRTAsIDQuMjUwRTAsIC41MDBFMCwgMy4wMDBFMCwgLjc1MEUwLCAzLjAwMEUwLCAxLjUwMEUwLCA2LjAwMEUwLCAzLjAwMEUwLCA2LjAwMEUwLCAxLjUwMEUwLCAzLjAwMEUwLCAuNTAwRTAsIDIuMDAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi4wMDBFMCwgNS4wMDBFMCwgLjc1MEUwLCAyLjI1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAzLjAwMEUwLCAuNzUwRTAsIDIuNTAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi41MDBFMCwgNC4wMDBFMCwgLjc1MEUwLCAyLjUwMEUwLCA0LjAwMEUwLCAuNTAwRTAsIDYuMDAwRTAsIDMuMDAwRTAsIC41MDBFMCwgMi43NTBFMCwgLjUwMEUwLCAxLjc1MEUwfTsKK2NvbnN0IGRvdWJsZSBjaHdpcnV0Ml9mdW5jdG9yOjptX3lbNTRdID0geyA5Mi45MDAwRTAgLDU3LjEwMDBFMCAsMzEuMDUwMEUwICwxMS41ODc1RTAgLDguMDI1MEUwICw2My42MDAwRTAgLDIxLjQwMDBFMCAsMTQuMjUwMEUwICw4LjQ3NTBFMCAsNjMuODAwMEUwICwyNi44MDAwRTAgLDE2LjQ2MjVFMCAsNy4xMjUwRTAgLDY3LjMwMDBFMCAsNDEuMDAwMEUwICwyMS4xNTAwRTAgLDguMTc1MEUwICw4MS41MDAwRTAgLDEzLjEyMDBFMCAsNTkuOTAwMEUwICwxNC42MjAwRTAgLDMyLjkwMDBFMCAsNS40NDAwRTAgLDEyLjU2MDBFMCAsNS40NDAwRTAgLDMyLjAwMDBFMCAsMTMuOTUwMEUwICw3NS44MDAwRTAgLDIwLjAwMDBFMCAsMTAuNDIwMEUwICw1OS41MDAwRTAgLDIxLjY3MDBFMCAsOC41NTAwRTAgLDYyLjAwMDBFMCAsMjAuMjAwMEUwICw3Ljc2MDBFMCAsMy43NTAwRTAgLDExLjgxMDBFMCAsNTQuNzAwMEUwICwyMy43MDAwRTAgLDExLjU1MDBFMCAsNjEuMzAwMEUwICwxNy43MDAwRTAgLDguNzQwMEUwICw1OS4yMDAwRTAgLDE2LjMwMDBFMCAsOC42MjAwRTAgLDgxLjAwMDBFMCAsNC44NzAwRTAgLDE0LjYyMDBFMCAsODEuNzAwMEUwICwxNy4xNzAwRTAgLDgxLjMwMDBFMCAsMjguOTAwMEUwICB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9jaHdpcnV0Mi5zaHRtbAordm9pZCB0ZXN0TmlzdENod2lydXQyKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTM7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMC4xLCAwLjAxLCAwLjAyOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgY2h3aXJ1dDJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8Y2h3aXJ1dDJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTApOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS4xMzA0ODAyOTQxRSswMik7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjY2NTc2NjY1MzdFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjE2NTMyOTEyODZFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAxLjIxNTAwMDcwOTZFLTAyKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMC4xNSwgMC4wMDgsIDAuMDEwOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDcpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS4xMzA0ODAyOTQxRSswMik7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjY2NTc2NjY1MzdFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjE2NTMyOTEyODZFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAxLjIxNTAwMDcwOTZFLTAyKTsKK30KKworCitzdHJ1Y3QgbWlzcmExYV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgbWlzcmExYV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsMTQpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbMTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzE0XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE0KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgeworICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qKDEuLWV4cCgtYlsxXSptX3hbaV0pKSAtIG1feVtpXSA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgeworICAgICAgICAgICAgZmphYyhpLDApID0gKDEuLWV4cCgtYlsxXSptX3hbaV0pKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IChiWzBdKm1feFtpXSpleHAoLWJbMV0qbV94W2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBtaXNyYTFhX2Z1bmN0b3I6Om1feFsxNF0gPSB7IDc3LjZFMCwgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Citjb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3lbMTRdID0geyAxMC4wN0UwLCAxNC43M0UwLCAxNy45NEUwLCAyMy45M0UwLCAyOS42MUUwLCAzNS4xOEUwLCA0MC4wMkUwLCA0NC44MkUwLCA1MC43NkUwLCA1NS4wNUUwLCA2MS4wMUUwLCA2Ni40MEUwLCA3NS40N0UwLCA4MS43OEUwfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWlzcmExYS5zaHRtbAordm9pZCB0ZXN0TmlzdE1pc3JhMWEodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MjsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCA1MDAuLCAwLjAwMDE7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBtaXNyYTFhX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PG1pc3JhMWFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTUpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuMjQ1NTEzODg5NEUtMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4zODk0MjEyOTE4RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS41MDE1NjQzMTgxRS0wNCk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDI1MC4sIDAuMDAwNTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA0KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAxLjI0NTUxMzg4OTRFLTAxKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDIuMzg5NDIxMjkxOEUrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuNTAxNTY0MzE4MUUtMDQpOworfQorCitzdHJ1Y3QgaGFobjFfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGhhaG4xX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oNywyMzYpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbMjM2XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feVsyMzZdID0geyAuNTkxRTAgLCAxLjU0N0UwICwgMi45MDJFMCAsIDIuODk0RTAgLCA0LjcwM0UwICwgNi4zMDdFMCAsIDcuMDNFMCAgLCA3Ljg5OEUwICwgOS40NzBFMCAsIDkuNDg0RTAgLCAxMC4wNzJFMCAsIDEwLjE2M0UwICwgMTEuNjE1RTAgLCAxMi4wMDVFMCAsIDEyLjQ3OEUwICwgMTIuOTgyRTAgLCAxMi45NzBFMCAsIDEzLjkyNkUwICwgMTQuNDUyRTAgLCAxNC40MDRFMCAsIDE1LjE5MEUwICwgMTUuNTUwRTAgLCAxNS41MjhFMCAsIDE1LjQ5OUUwICwgMTYuMTMxRTAgLCAxNi40MzhFMCAsIDE2LjM4N0UwICwgMTYuNTQ5RTAgLCAxNi44NzJFMCAsIDE2LjgzMEUwICwgMTYuOTI2RTAgLCAxNi45MDdFMCAsIDE2Ljk2NkUwICwgMTcuMDYwRTAgLCAxNy4xMjJFMCAsIDE3LjMxMUUwICwgMTcuMzU1RTAgLCAxNy42NjhFMCAsIDE3Ljc2N0UwICwgMTcuODAzRTAgLCAxNy43NjVFMCAsIDE3Ljc2OEUwICwgMTcuNzM2RTAgLCAxNy44NThFMCAsIDE3Ljg3N0UwICwgMTcuOTEyRTAgLCAxOC4wNDZFMCAsIDE4LjA4NUUwICwgMTguMjkxRTAgLCAxOC4zNTdFMCAsIDE4LjQyNkUwICwgMTguNTg0RTAgLCAxOC42MTBFMCAsIDE4Ljg3MEUwICwgMTguNzk1RTAgLCAxOS4xMTFFMCAsIC4zNjdFMCAsIC43OTZFMCAsIDAuODkyRTAgLCAxLjkwM0UwICwgMi4xNTBFMCAsIDMuNjk3RTAgLCA1Ljg3MEUwICwgNi40MjFFMCAsIDcuNDIyRTAgLCA5Ljk0NEUwICwgMTEuMDIzRTAgLCAxMS44N0UwICAsIDEyLjc4NkUwICwgMTQuMDY3RTAgLCAxMy45NzRFMCAsIDE0LjQ2MkUwICwgMTQuNDY0RTAgLCAxNS4zODFFMCAsIDE1LjQ4M0UwICwgMTUuNTlFMCAgLCAxNi4wNzVFMCAsIDE2LjM0N0UwICwgMTYuMTgxRTAgLCAxNi45MTVFMCAsIDE3LjAwM0UwICwgMTYuOTc4RTAgLCAxNy43NTZFMCAsIDE3LjgwOEUwICwgMTcuODY4RTAgLCAxOC40ODFFMCAsIDE4LjQ4NkUwICwgMTkuMDkwRTAgLCAxNi4wNjJFMCAsIDE2LjMzN0UwICwgMTYuMzQ1RTAgLAorICAgICAgICAxNi4zODhFMCAsIDE3LjE1OUUwICwgMTcuMTE2RTAgLCAxNy4xNjRFMCAsIDE3LjEyM0UwICwgMTcuOTc5RTAgLCAxNy45NzRFMCAsIDE4LjAwN0UwICwgMTcuOTkzRTAgLCAxOC41MjNFMCAsIDE4LjY2OUUwICwgMTguNjE3RTAgLCAxOS4zNzFFMCAsIDE5LjMzMEUwICwgMC4wODBFMCAsIDAuMjQ4RTAgLCAxLjA4OUUwICwgMS40MThFMCAsIDIuMjc4RTAgLCAzLjYyNEUwICwgNC41NzRFMCAsIDUuNTU2RTAgLCA3LjI2N0UwICwgNy42OTVFMCAsIDkuMTM2RTAgLCA5Ljk1OUUwICwgOS45NTdFMCAsIDExLjYwMEUwICwgMTMuMTM4RTAgLCAxMy41NjRFMCAsIDEzLjg3MUUwICwgMTMuOTk0RTAgLCAxNC45NDdFMCAsIDE1LjQ3M0UwICwgMTUuMzc5RTAgLCAxNS40NTVFMCAsIDE1LjkwOEUwICwgMTYuMTE0RTAgLCAxNy4wNzFFMCAsIDE3LjEzNUUwICwgMTcuMjgyRTAgLCAxNy4zNjhFMCAsIDE3LjQ4M0UwICwgMTcuNzY0RTAgLCAxOC4xODVFMCAsIDE4LjI3MUUwICwgMTguMjM2RTAgLCAxOC4yMzdFMCAsIDE4LjUyM0UwICwgMTguNjI3RTAgLCAxOC42NjVFMCAsIDE5LjA4NkUwICwgMC4yMTRFMCAsIDAuOTQzRTAgLCAxLjQyOUUwICwgMi4yNDFFMCAsIDIuOTUxRTAgLCAzLjc4MkUwICwgNC43NTdFMCAsIDUuNjAyRTAgLCA3LjE2OUUwICwgOC45MjBFMCAsIDEwLjA1NUUwICwgMTIuMDM1RTAgLCAxMi44NjFFMCAsIDEzLjQzNkUwICwgMTQuMTY3RTAgLCAxNC43NTVFMCAsIDE1LjE2OEUwICwgMTUuNjUxRTAgLCAxNS43NDZFMCAsIDE2LjIxNkUwICwgMTYuNDQ1RTAgLCAxNi45NjVFMCAsIDE3LjEyMUUwICwgMTcuMjA2RTAgLCAxNy4yNTBFMCAsIDE3LjMzOUUwICwgMTcuNzkzRTAgLCAxOC4xMjNFMCAsIDE4LjQ5RTAgICwgMTguNTY2RTAgLCAxOC42NDVFMCAsIDE4LjcwNkUwICwgMTguOTI0RTAgLCAxOS4xRTAgICAsIDAuMzc1RTAgLCAwLjQ3MUUwICwgMS41MDRFMCAsIDIuMjA0RTAgLCAyLjgxM0UwICwgNC43NjVFMCAsIDkuODM1RTAgLCAxMC4wNDBFMCAsIDExLjk0NkUwICwgMTIuNTk2RTAgLCAKKzEzLjMwM0UwICwgMTMuOTIyRTAgLCAxNC40NDBFMCAsIDE0Ljk1MUUwICwgMTUuNjI3RTAgLCAxNS42MzlFMCAsIDE1LjgxNEUwICwgMTYuMzE1RTAgLCAxNi4zMzRFMCAsIDE2LjQzMEUwICwgMTYuNDIzRTAgLCAxNy4wMjRFMCAsIDE3LjAwOUUwICwgMTcuMTY1RTAgLCAxNy4xMzRFMCAsIDE3LjM0OUUwICwgMTcuNTc2RTAgLCAxNy44NDhFMCAsIDE4LjA5MEUwICwgMTguMjc2RTAgLCAxOC40MDRFMCAsIDE4LjUxOUUwICwgMTkuMTMzRTAgLCAxOS4wNzRFMCAsIDE5LjIzOUUwICwgMTkuMjgwRTAgLCAxOS4xMDFFMCAsIDE5LjM5OEUwICwgMTkuMjUyRTAgLCAxOS44OUUwICAsIDIwLjAwN0UwICwgMTkuOTI5RTAgLCAxOS4yNjhFMCAsIDE5LjMyNEUwICwgMjAuMDQ5RTAgLCAyMC4xMDdFMCAsIDIwLjA2MkUwICwgMjAuMDY1RTAgLCAxOS4yODZFMCAsIDE5Ljk3MkUwICwgMjAuMDg4RTAgLCAyMC43NDNFMCAsIDIwLjgzRTAgICwgMjAuOTM1RTAgLCAyMS4wMzVFMCAsIDIwLjkzRTAgICwgMjEuMDc0RTAgLCAyMS4wODVFMCAsIDIwLjkzNUUwIH07CisKKyAgICAgICAgLy8gICAgICAgIGludCBjYWxsZWQ9MDsgcHJpbnRmKCJjYWxsIGhhaG4xX2Z1bmN0b3Igd2l0aCAgaWZsYWc9JWQsIGNhbGxlZD0lZFxuIiwgaWZsYWcsIGNhbGxlZCk7IGlmIChpZmxhZz09MSkgY2FsbGVkKys7CisKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0yMzYpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyMzY7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHg9bV94W2ldLCB4eD14KngsIHh4eD14eCp4OworICAgICAgICAgICAgZnZlY1tpXSA9IChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAvICgxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCkgLSBtX3lbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nyk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MjM2KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT03KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MjM2OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4PW1feFtpXSwgeHg9eCp4LCB4eHg9eHgqeDsKKyAgICAgICAgICAgIGRvdWJsZSBmYWN0ID0gMS4vKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuKmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMSkgPSB4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMikgPSB4eCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDMpID0geHh4KmZhY3Q7CisgICAgICAgICAgICBmYWN0ID0gLSAoYlswXStiWzFdKngrYlsyXSp4eCtiWzNdKnh4eCkgKiBmYWN0ICogZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw0KSA9IHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw1KSA9IHh4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksNikgPSB4eHgqZmFjdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIGhhaG4xX2Z1bmN0b3I6Om1feFsyMzZdID0geyAyNC40MUUwICwgMzQuODJFMCAsIDQ0LjA5RTAgLCA0NS4wN0UwICwgNTQuOThFMCAsIDY1LjUxRTAgLCA3MC41M0UwICwgNzUuNzBFMCAsIDg5LjU3RTAgLCA5MS4xNEUwICwgOTYuNDBFMCAsIDk3LjE5RTAgLCAxMTQuMjZFMCAsIDEyMC4yNUUwICwgMTI3LjA4RTAgLCAxMzMuNTVFMCAsIDEzMy42MUUwICwgMTU4LjY3RTAgLCAxNzIuNzRFMCAsIDE3MS4zMUUwICwgMjAyLjE0RTAgLCAyMjAuNTVFMCAsIDIyMS4wNUUwICwgMjIxLjM5RTAgLCAyNTAuOTlFMCAsIDI2OC45OUUwICwgMjcxLjgwRTAgLCAyNzEuOTdFMCAsIDMyMS4zMUUwICwgMzIxLjY5RTAgLCAzMzAuMTRFMCAsIDMzMy4wM0UwICwgMzMzLjQ3RTAgLCAzNDAuNzdFMCAsIDM0NS42NUUwICwgMzczLjExRTAgLCAzNzMuNzlFMCAsIDQxMS44MkUwICwgNDE5LjUxRTAgLCA0MjEuNTlFMCAsIDQyMi4wMkUwICwgNDIyLjQ3RTAgLCA0MjIuNjFFMCAsIDQ0MS43NUUwICwgNDQ3LjQxRTAgLCA0NDguN0UwICAsIDQ3Mi44OUUwICwgNDc2LjY5RTAgLCA1MjIuNDdFMCAsIDUyMi42MkUwICwgNTI0LjQzRTAgLCA1NDYuNzVFMCAsIDU0OS41M0UwICwgNTc1LjI5RTAgLCA1NzYuMDBFMCAsIDYyNS41NUUwICwgMjAuMTVFMCAsIDI4Ljc4RTAgLCAyOS41N0UwICwgMzcuNDFFMCAsIDM5LjEyRTAgLCA1MC4yNEUwICwgNjEuMzhFMCAsIDY2LjI1RTAgLCA3My40MkUwICwgOTUuNTJFMCAsIDEwNy4zMkUwICwgMTIyLjA0RTAgLCAxMzQuMDNFMCAsIDE2My4xOUUwICwgMTYzLjQ4RTAgLCAxNzUuNzBFMCAsIDE3OS44NkUwICwgMjExLjI3RTAgLCAyMTcuNzhFMCAsIDIxOS4xNEUwICwgMjYyLjUyRTAgLCAyNjguMDFFMCAsIDI2OC42MkUwICwgMzM2LjI1RTAgLCAzMzcuMjNFMCAsIDMzOS4zM0UwICwgNDI3LjM4RTAgLCA0MjguNThFMCAsIDQzMi42OEUwICwgNTI4Ljk5RTAgLCA1MzEuMDhFMCAsIDYyOC4zNEUwICwgMjUzLjI0RTAgLCAyNzMuMTNFMCAsIDI3My42NkUwICwKKzI4Mi4xMEUwICwgMzQ2LjYyRTAgLCAzNDcuMTlFMCAsIDM0OC43OEUwICwgMzUxLjE4RTAgLCA0NTAuMTBFMCAsIDQ1MC4zNUUwICwgNDUxLjkyRTAgLCA0NTUuNTZFMCAsIDU1Mi4yMkUwICwgNTUzLjU2RTAgLCA1NTUuNzRFMCAsIDY1Mi41OUUwICwgNjU2LjIwRTAgLCAxNC4xM0UwICwgMjAuNDFFMCAsIDMxLjMwRTAgLCAzMy44NEUwICwgMzkuNzBFMCAsIDQ4LjgzRTAgLCA1NC41MEUwICwgNjAuNDFFMCAsIDcyLjc3RTAgLCA3NS4yNUUwICwgODYuODRFMCAsIDk0Ljg4RTAgLCA5Ni40MEUwICwgMTE3LjM3RTAgLCAxMzkuMDhFMCAsIDE0Ny43M0UwICwgMTU4LjYzRTAgLCAxNjEuODRFMCAsIDE5Mi4xMUUwICwgMjA2Ljc2RTAgLCAyMDkuMDdFMCAsIDIxMy4zMkUwICwgMjI2LjQ0RTAgLCAyMzcuMTJFMCAsIDMzMC45MEUwICwgMzU4LjcyRTAgLCAzNzAuNzdFMCAsIDM3Mi43MkUwICwgMzk2LjI0RTAgLCA0MTYuNTlFMCAsIDQ4NC4wMkUwICwgNDk1LjQ3RTAgLCA1MTQuNzhFMCAsIDUxNS42NUUwICwgNTE5LjQ3RTAgLCA1NDQuNDdFMCAsIDU2MC4xMUUwICwgNjIwLjc3RTAgLCAxOC45N0UwICwgMjguOTNFMCAsIDMzLjkxRTAgLCA0MC4wM0UwICwgNDQuNjZFMCAsIDQ5Ljg3RTAgLCA1NS4xNkUwICwgNjAuOTBFMCAsIDcyLjA4RTAgLCA4NS4xNUUwICwgOTcuMDZFMCAsIDExOS42M0UwICwgMTMzLjI3RTAgLCAxNDMuODRFMCAsIDE2MS45MUUwICwgMTgwLjY3RTAgLCAxOTguNDRFMCAsIDIyNi44NkUwICwgMjI5LjY1RTAgLCAyNTguMjdFMCAsIDI3My43N0UwICwgMzM5LjE1RTAgLCAzNTAuMTNFMCAsIDM2Mi43NUUwICwgMzcxLjAzRTAgLCAzOTMuMzJFMCAsIDQ0OC41M0UwICwgNDczLjc4RTAgLCA1MTEuMTJFMCAsIDUyNC43MEUwICwgNTQ4Ljc1RTAgLCA1NTEuNjRFMCAsIDU3NC4wMkUwICwgNjIzLjg2RTAgLCAyMS40NkUwICwgMjQuMzNFMCAsIDMzLjQzRTAgLCAzOS4yMkUwICwgNDQuMThFMCAsIDU1LjAyRTAgLCA5NC4zM0UwICwgOTYuNDRFMCAsIDExOC44MkUwICwgMTI4LjQ4RTAgLAorMTQxLjk0RTAgLCAxNTYuOTJFMCAsIDE3MS42NUUwICwgMTkwLjAwRTAgLCAyMjMuMjZFMCAsIDIyMy44OEUwICwgMjMxLjUwRTAgLCAyNjUuMDVFMCAsIDI2OS40NEUwICwgMjcxLjc4RTAgLCAyNzMuNDZFMCAsIDMzNC42MUUwICwgMzM5Ljc5RTAgLCAzNDkuNTJFMCAsIDM1OC4xOEUwICwgMzc3Ljk4RTAgLCAzOTQuNzdFMCAsIDQyOS42NkUwICwgNDY4LjIyRTAgLCA0ODcuMjdFMCAsIDUxOS41NEUwICwgNTIzLjAzRTAgLCA2MTIuOTlFMCAsIDYzOC41OUUwICwgNjQxLjM2RTAgLCA2MjIuMDVFMCAsIDYzMS41MEUwICwgNjYzLjk3RTAgLCA2NDYuOUUwICAsIDc0OC4yOUUwICwgNzQ5LjIxRTAgLCA3NTAuMTRFMCAsIDY0Ny4wNEUwICwgNjQ2Ljg5RTAgLCA3NDYuOUUwICAsIDc0OC40M0UwICwgNzQ3LjM1RTAgLCA3NDkuMjdFMCAsIDY0Ny42MUUwICwgNzQ3Ljc4RTAgLCA3NTAuNTFFMCAsIDg1MS4zN0UwICwgODQ1Ljk3RTAgLCA4NDcuNTRFMCAsIDg0OS45M0UwICwgODUxLjYxRTAgLCA4NDkuNzVFMCAsIDg1MC45OEUwICwgODQ4LjIzRTB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9oYWhuMS5zaHRtbAordm9pZCB0ZXN0TmlzdEhhaG4xKHZvaWQpCit7CisgIGNvbnN0IGludCAgbj03OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwLiwgLTEuLCAuMDUsIC0uMDAwMDEsIC0uMDUsIC4wMDEsIC0uMDAwMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaGFobjFfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8aGFobjFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNTMyNDM4Mjg1NEUrMDApOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2MzUxNzMzRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwtMS4yMjY5Mjk2OTIxRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNC4wODYzNzUwNjEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwtMS40MjYyNjRlLTA2KTsgLy8gc2hvdWxkZSBiZSA6IC0xLjQyNjI2NjI1MTRFLTA2CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwtNS43NjA5OTQwOTAxRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgMi40MDUzNzM1NTAzRS0wNCk7CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwtMS4yMzE0NDUwMTk5RS0wNyk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IC4xLCAtLjEsIC4wMDUsIC0uMDAwMDAxLCAtLjAwNSwgLjAwMDEsIC0uMDAwMDAwMTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNTMyNDM4Mjg1NEUrMDApOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2NDApOyAvLyBzaG91bGQgYmUgOiAgMS4wNzc2MzUxNzMzRSswMAorICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0wLjEyMjY5MzMpOyAvLyBzaG91bGQgYmUgOiAtMS4yMjY5Mjk2OTIxRS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuMDA0MDg2MzgzKTsgLy8gc2hvdWxkIGJlIDogNC4wODYzNzUwNjEwRS0wMworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIC0xLjQyNjI3N2UtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAwLjAwMDI0MDUzNzcyKTsgLy8gc2hvdWxkIGJlIDogMi40MDUzNzM1NTAzRS0wNAorICBWRVJJRllfSVNfQVBQUk9YKHhbNl0sIC0xLjIzMTQ1MGUtMDcpOyAvLyBzaG91bGQgYmUgOiAtMS4yMzE0NDUwMTk5RS0wNworCit9CisKK3N0cnVjdCBtaXNyYTFkX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBtaXNyYTFkX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMiwxNCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNF07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKmJbMV0qeFtpXS8oMS4rYlsxXSp4W2ldKSAtIHlbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGRlbiA9IDEuK2JbMV0qeFtpXTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGJbMV0qeFtpXSAvIGRlbjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qeFtpXSooZGVuLWJbMV0qeFtpXSkvZGVuL2RlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eFsxNF0gPSB7IDc3LjZFMCwgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Citjb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp5WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21pc3JhMWQuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNaXNyYTFkKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTI7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgNTAwLiwgMC4wMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbWlzcmExZF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxtaXNyYTFkX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNyk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS42NDE5Mjk1MjgzRS0wMik7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA0LjM3MzY5NzA3NTRFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAzLjAyMjczMjQ0NDlFLTA0KTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgNDUwLiwgMC4wMDAzOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDMpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuNjQxOTI5NTI4M0UtMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNC4zNzM2OTcwNzU0RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMy4wMjI3MzI0NDQ5RS0wNCk7Cit9CisKKworc3RydWN0IGxhbmN6b3MxX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBsYW5jem9zMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDYsMjQpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzI0XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMjRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MjQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKQorICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qZXhwKC1iWzFdKnhbaV0pICsgYlsyXSpleHAoLWJbM10qeFtpXSkgKyBiWzRdKmV4cCgtYls1XSp4W2ldKSAgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MjQpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTYpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKSB7CisgICAgICAgICAgICBmamFjKGksMCkgPSBleHAoLWJbMV0qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMSkgPSAtYlswXSp4W2ldKmV4cCgtYlsxXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IGV4cCgtYlszXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwzKSA9IC1iWzJdKnhbaV0qZXhwKC1iWzNdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDQpID0gZXhwKC1iWzVdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDUpID0gLWJbNF0qeFtpXSpleHAoLWJbNV0qeFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBsYW5jem9zMV9mdW5jdG9yOjp4WzI0XSA9IHsgMC4wMDAwMDAwMDAwMDBFKzAwLCA1LjAwMDAwMDAwMDAwMEUtMDIsIDEuMDAwMDAwMDAwMDAwRS0wMSwgMS41MDAwMDAwMDAwMDBFLTAxLCAyLjAwMDAwMDAwMDAwMEUtMDEsIDIuNTAwMDAwMDAwMDAwRS0wMSwgMy4wMDAwMDAwMDAwMDBFLTAxLCAzLjUwMDAwMDAwMDAwMEUtMDEsIDQuMDAwMDAwMDAwMDAwRS0wMSwgNC41MDAwMDAwMDAwMDBFLTAxLCA1LjAwMDAwMDAwMDAwMEUtMDEsIDUuNTAwMDAwMDAwMDAwRS0wMSwgNi4wMDAwMDAwMDAwMDBFLTAxLCA2LjUwMDAwMDAwMDAwMEUtMDEsIDcuMDAwMDAwMDAwMDAwRS0wMSwgNy41MDAwMDAwMDAwMDBFLTAxLCA4LjAwMDAwMDAwMDAwMEUtMDEsIDguNTAwMDAwMDAwMDAwRS0wMSwgOS4wMDAwMDAwMDAwMDBFLTAxLCA5LjUwMDAwMDAwMDAwMEUtMDEsIDEuMDAwMDAwMDAwMDAwRSswMCwgMS4wNTAwMDAwMDAwMDBFKzAwLCAxLjEwMDAwMDAwMDAwMEUrMDAsIDEuMTUwMDAwMDAwMDAwRSswMCB9OworY29uc3QgZG91YmxlIGxhbmN6b3MxX2Z1bmN0b3I6OnlbMjRdID0geyAyLjUxMzQwMDAwMDAwMEUrMDAgLDIuMDQ0MzMzMzczMjkxRSswMCAsMS42Njg0MDQ0MzY1NjRFKzAwICwxLjM2NjQxODAyMTIwOEUrMDAgLDEuMTIzMjMyNDg3MzcyRSswMCAsOS4yNjg4OTcxODAwMzdFLTAxICw3LjY3OTMzODU2MzcyOEUtMDEgLDYuMzg4Nzc1NTIzMTA2RS0wMSAsNS4zMzc4MzUzMTc0MDJFLTAxICw0LjQ3OTM2MzYxNzM0N0UtMDEgLDMuNzc1ODQ3ODg0MzUwRS0wMSAsMy4xOTczOTMxOTkzMjZFLTAxICwyLjcyMDEzMDc3Mzc0NkUtMDEgLDIuMzI0OTY1NTI5MDMyRS0wMSAsMS45OTY1ODk1NDYwNjVFLTAxICwxLjcyMjcwNDEyNjkxNEUtMDEgLDEuNDkzNDA1NjYwMTY4RS0wMSAsMS4zMDA3MDAyMDY5MjJFLTAxICwxLjEzODExOTMyNDY0NEUtMDEgLDEuMDAwNDE1NTg3NTU5RS0wMSAsOC44MzMyMDkwODQ1NDBFLTAyICw3LjgzMzU0NDAxOTM1MEUtMDIgLDYuOTc2NjkzNzQzNDQ5RS0wMiAsNi4yMzkzMTI1MzY3MTlFLTAyIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2xhbmN6b3MxLnNodG1sCit2b2lkIHRlc3ROaXN0TGFuY3pvczEodm9pZCkKK3sKKyAgY29uc3QgaW50IG49NjsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLjIsIDAuMywgNS42LCA1LjUsIDYuNSwgNy42OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbGFuY3pvczFfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bGFuY3pvczFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDIpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNzkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNzIpOworICAvLyBjaGVjayBub3JtXjIKKyAgc3RkOjpjb3V0LnByZWNpc2lvbigzMCk7CisgIHN0ZDo6Y291dCA8PCBsbS5mdmVjLnNxdWFyZWROb3JtKCkgPDwgIlxuIjsKKyAgVkVSSUZZKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSA8PSAxLjQzMDc4Njc3MjFFLTI1KTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDkuNTEwMDAwMDAyN0UtMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuMDAwMDAwMDAwMUUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDguNjA3MDAwMDAxM0UtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDMuMDAwMDAwMDAwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDEuNTU3NTk5OTk5OEUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDUuMDAwMDAwMDAwMUUrMDApOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAwLjUsIDAuNywgMy42LCA0LjIsIDQuLCA2LjM7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRlkobG0uZnZlYy5zcXVhcmVkTm9ybSgpIDw9IDEuNDMwNzg2NzcyMUUtMjUpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgOS41MTAwMDAwMDI3RS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMS4wMDAwMDAwMDAxRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgOC42MDcwMDAwMDEzRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMy4wMDAwMDAwMDAyRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMS41NTc1OTk5OTk4RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgNS4wMDAwMDAwMDAxRSswMCk7CisKK30KKworc3RydWN0IHJhdDQyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICByYXQ0Ml9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsOSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbOV07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzldOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09OSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDk7IGkrKykgeworICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0gLyAoMS4rZXhwKGJbMV0tYlsyXSp4W2ldKSkgLSB5W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTkpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IC1iWzBdKmUvKDEuK2UpLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9ICtiWzBdKmUqeFtpXS8oMS4rZSkvKDEuK2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eFs5XSA9IHsgOS4wMDBFMCwgMTQuMDAwRTAsIDIxLjAwMEUwLCAyOC4wMDBFMCwgNDIuMDAwRTAsIDU3LjAwMEUwLCA2My4wMDBFMCwgNzAuMDAwRTAsIDc5LjAwMEUwIH07Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eVs5XSA9IHsgOC45MzBFMCAsMTAuODAwRTAgLDE4LjU5MEUwICwyMi4zMzBFMCAsMzkuMzUwRTAgLDU2LjExMEUwICw2MS43MzBFMCAsNjQuNjIwRTAgLDY3LjA4MEUwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3JhdGtvd3NreTIuc2h0bWwKK3ZvaWQgdGVzdE5pc3RSYXQ0Mih2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDEuLCAwLjE7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICByYXQ0Ml9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxyYXQ0Ml9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4LjA1NjUyMjkzMzhFKzAwKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDcuMjQ2MjIzNzU3NkUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDIuNjE4MDc2ODQwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCA3NS4sIDIuNSwgMC4wNzsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA1KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4LjA1NjUyMjkzMzhFKzAwKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDcuMjQ2MjIzNzU3NkUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDIuNjE4MDc2ODQwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOworfQorCitzdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIE1HSDEwX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNikge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTZdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNl07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE2OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0gKiBleHAoYlsxXS8oeFtpXStiWzJdKSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTYpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHhbaV0rYlsyXSk7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cChiWzFdKmZhY3Rvcik7CisgICAgICAgICAgICBmamFjKGksMCkgPSBlOworICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSpmYWN0b3IqZTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC1iWzFdKmJbMF0qZmFjdG9yKmZhY3RvciplOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgTUdIMTBfZnVuY3Rvcjo6eFsxNl0gPSB7IDUuMDAwMDAwRSswMSwgNS41MDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDYuNTAwMDAwRSswMSwgNy4wMDAwMDBFKzAxLCA3LjUwMDAwMEUrMDEsIDguMDAwMDAwRSswMSwgOC41MDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDkuNTAwMDAwRSswMSwgMS4wMDAwMDBFKzAyLCAxLjA1MDAwMEUrMDIsIDEuMTAwMDAwRSswMiwgMS4xNTAwMDBFKzAyLCAxLjIwMDAwMEUrMDIsIDEuMjUwMDAwRSswMiB9OworY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnlbMTZdID0geyAzLjQ3ODAwMEUrMDQsIDIuODYxMDAwRSswNCwgMi4zNjUwMDBFKzA0LCAxLjk2MzAwMEUrMDQsIDEuNjM3MDAwRSswNCwgMS4zNzIwMDBFKzA0LCAxLjE1NDAwMEUrMDQsIDkuNzQ0MDAwRSswMywgOC4yNjEwMDBFKzAzLCA3LjAzMDAwMEUrMDMsIDYuMDA1MDAwRSswMywgNS4xNDcwMDBFKzAzLCA0LjQyNzAwMEUrMDMsIDMuODIwMDAwRSswMywgMy4zMDcwMDBFKzAzLCAyLjg3MjAwMEUrMDMgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTAuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNR0gxMCh2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDIuLCA0MDAwMDAuLCAyNTAwMC47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBNR0gxMF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gxMF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMik7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMjg0ICk7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMjQ5ICk7IAorICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDguNzk0NTg1NTE3MUUrMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNS42MDk2MzY0NzEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNi4xODEzNDYzNDYzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMy40NTIyMzYzNDYyRSswMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMDIsIDQwMDAuLCAyNTAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMyk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxMjYpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTE2KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4Ljc5NDU4NTUxNzFFKzAxKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDUuNjA5NjM2NDcxMEUtMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDYuMTgxMzQ2MzQ2M0UrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDMuNDUyMjM2MzQ2MkUrMDIpOworfQorCisKK3N0cnVjdCBCb3hCT0RfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIEJveEJPRF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsNikge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbNl07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzZdID0geyAxMDkuLCAxNDkuLCAxNDkuLCAxOTEuLCAyMTMuLCAyMjQuIH07CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09Nik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSAgYlswXSooMS4tZXhwKC1iWzFdKnhbaV0pKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT02KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlsxXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLWU7CisgICAgICAgICAgICBmamFjKGksMSkgPSBiWzBdKnhbaV0qZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIEJveEJPRF9mdW5jdG9yOjp4WzZdID0geyAxLiwgMi4sIDMuLCA1LiwgNy4sIDEwLiB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9ib3hib2Quc2h0bWwKK3ZvaWQgdGVzdE5pc3RCb3hCT0Qodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MjsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLiwgMS47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBCb3hCT0RfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8Qm94Qk9EX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy5mYWN0b3IgPSAxMC47CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRlkobG0ubmZldiA8IDMxKTsgLy8gMzEKKyAgVkVSSUZZKGxtLm5qZXYgPCAyNSk7IC8vIDI1CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMS4xNjgwMDg4NzY2RSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAyLjEzODA5NDA4ODlFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjQ3MjM3NDg1NDJFLTAxKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMTAwLiwgMC43NTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsgCisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxNSApOyAKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDE0ICk7IAorICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuMTY4MDA4ODc2NkUrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4xMzgwOTQwODg5RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS40NzIzNzQ4NTQyRS0wMSk7Cit9CisKK3N0cnVjdCBNR0gxN19mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgTUdIMTdfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig1LDMzKSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszM107CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzMzXTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTUpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTMzKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MzM7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSAgYlswXSArIGJbMV0qZXhwKC1iWzNdKnhbaV0pICsgIGJbMl0qZXhwKC1iWzRdKnhbaV0pIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTUpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTMzKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT01KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MzM7IGkrKykgeworICAgICAgICAgICAgZmphYyhpLDApID0gMS47CisgICAgICAgICAgICBmamFjKGksMSkgPSBleHAoLWJbM10qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMikgPSBleHAoLWJbNF0qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMykgPSAteFtpXSpiWzFdKmV4cCgtYlszXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSw0KSA9IC14W2ldKmJbMl0qZXhwKC1iWzRdKnhbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgTUdIMTdfZnVuY3Rvcjo6eFszM10gPSB7IDAuMDAwMDAwRSswMCwgMS4wMDAwMDBFKzAxLCAyLjAwMDAwMEUrMDEsIDMuMDAwMDAwRSswMSwgNC4wMDAwMDBFKzAxLCA1LjAwMDAwMEUrMDEsIDYuMDAwMDAwRSswMSwgNy4wMDAwMDBFKzAxLCA4LjAwMDAwMEUrMDEsIDkuMDAwMDAwRSswMSwgMS4wMDAwMDBFKzAyLCAxLjEwMDAwMEUrMDIsIDEuMjAwMDAwRSswMiwgMS4zMDAwMDBFKzAyLCAxLjQwMDAwMEUrMDIsIDEuNTAwMDAwRSswMiwgMS42MDAwMDBFKzAyLCAxLjcwMDAwMEUrMDIsIDEuODAwMDAwRSswMiwgMS45MDAwMDBFKzAyLCAyLjAwMDAwMEUrMDIsIDIuMTAwMDAwRSswMiwgMi4yMDAwMDBFKzAyLCAyLjMwMDAwMEUrMDIsIDIuNDAwMDAwRSswMiwgMi41MDAwMDBFKzAyLCAyLjYwMDAwMEUrMDIsIDIuNzAwMDAwRSswMiwgMi44MDAwMDBFKzAyLCAyLjkwMDAwMEUrMDIsIDMuMDAwMDAwRSswMiwgMy4xMDAwMDBFKzAyLCAzLjIwMDAwMEUrMDIgfTsKK2NvbnN0IGRvdWJsZSBNR0gxN19mdW5jdG9yOjp5WzMzXSA9IHsgOC40NDAwMDBFLTAxLCA5LjA4MDAwMEUtMDEsIDkuMzIwMDAwRS0wMSwgOS4zNjAwMDBFLTAxLCA5LjI1MDAwMEUtMDEsIDkuMDgwMDAwRS0wMSwgOC44MTAwMDBFLTAxLCA4LjUwMDAwMEUtMDEsIDguMTgwMDAwRS0wMSwgNy44NDAwMDBFLTAxLCA3LjUxMDAwMEUtMDEsIDcuMTgwMDAwRS0wMSwgNi44NTAwMDBFLTAxLCA2LjU4MDAwMEUtMDEsIDYuMjgwMDAwRS0wMSwgNi4wMzAwMDBFLTAxLCA1LjgwMDAwMEUtMDEsIDUuNTgwMDAwRS0wMSwgNS4zODAwMDBFLTAxLCA1LjIyMDAwMEUtMDEsIDUuMDYwMDAwRS0wMSwgNC45MDAwMDBFLTAxLCA0Ljc4MDAwMEUtMDEsIDQuNjcwMDAwRS0wMSwgNC41NzAwMDBFLTAxLCA0LjQ4MDAwMEUtMDEsIDQuMzgwMDAwRS0wMSwgNC4zMTAwMDBFLTAxLCA0LjI0MDAwMEUtMDEsIDQuMjAwMDAwRS0wMSwgNC4xNDAwMDBFLTAxLCA0LjExMDAwMEUtMDEsIDQuMDYwMDAwRS0wMSB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9tZ2gxNy5zaHRtbAordm9pZCB0ZXN0TmlzdE1HSDE3KHZvaWQpCit7CisgIGNvbnN0IGludCBuPTU7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgNTAuLCAxNTAuLCAtMTAwLiwgMS4sIDIuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgTUdIMTdfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8TUdIMTdfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwMDsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS40NjQ4OTQ2OTc1RS0wNSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAzLjc1NDEwMDUyMTFFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjkzNTg0NjkxMjdFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAtMS40NjQ2ODcxMzY2RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yODY3NTM0NjQwRS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMi4yMTIyNjk5NjYyRS0wMik7CisgIAorICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDIpOyAKKyAgKytnX3Rlc3RfbGV2ZWw7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA2MDIpOyAgLy8gNjAyCisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA1NDUpOyAgLy8gNTQ1CisgIC0tZ190ZXN0X2xldmVsOworICBWRVJJRlkobG0ubmZldiA8IDYwMiAqIExNX0VWQUxfQ09VTlRfVE9MKTsKKyAgVkVSSUZZKGxtLm5qZXYgPCA1NDUgKiBMTV9FVkFMX0NPVU5UX1RPTCk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuNSAgLDEuNSAgLC0xICAgLDAuMDEgLDAuMDI7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxOCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAxNSk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS40NjQ4OTQ2OTc1RS0wNSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAzLjc1NDEwMDUyMTFFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjkzNTg0NjkxMjdFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAtMS40NjQ2ODcxMzY2RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yODY3NTM0NjQwRS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMi4yMTIyNjk5NjYyRS0wMik7Cit9CisKK3N0cnVjdCBNR0gwOV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgTUdIMDlfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig0LDExKSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMTFdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxMV07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xMSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDExOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gX3hbaV0sIHh4PXgqeDsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKih4eCt4KmJbMV0pLyh4eCt4KmJbMl0rYlszXSkgLSB5W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xMSk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDExOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gX3hbaV0sIHh4PXgqeDsKKyAgICAgICAgICAgIGRvdWJsZSBmYWN0b3IgPSAxLi8oeHgreCpiWzJdK2JbM10pOworICAgICAgICAgICAgZmphYyhpLDApID0gKHh4K3gqYlsxXSkgKiBmYWN0b3I7CisgICAgICAgICAgICBmamFjKGksMSkgPSBiWzBdKngqIGZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC0gYlswXSooeHgreCpiWzFdKSAqIHggKiBmYWN0b3IgKiBmYWN0b3I7CisgICAgICAgICAgICBmamFjKGksMykgPSAtIGJbMF0qKHh4K3gqYlsxXSkgKiBmYWN0b3IgKiBmYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjpfeFsxMV0gPSB7IDQuLCAyLiwgMS4sIDUuRS0xICwgMi41RS0wMSwgMS42NzAwMDBFLTAxLCAxLjI1MDAwMEUtMDEsICAxLkUtMDEsIDguMzMwMDAwRS0wMiwgNy4xNDAwMDBFLTAyLCA2LjI1MDAwMEUtMDIgfTsKK2NvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjp5WzExXSA9IHsgMS45NTcwMDBFLTAxLCAxLjk0NzAwMEUtMDEsIDEuNzM1MDAwRS0wMSwgMS42MDAwMDBFLTAxLCA4LjQ0MDAwMEUtMDIsIDYuMjcwMDAwRS0wMiwgNC41NjAwMDBFLTAyLCAzLjQyMDAwMEUtMDIsIDMuMjMwMDAwRS0wMiwgMi4zNTAwMDBFLTAyLCAyLjQ2MDAwMEUtMDIgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMDkuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNR0gwOSh2b2lkKQoreworICBjb25zdCBpbnQgbj00OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDI1LiwgMzksIDQxLjUsIDM5LjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIE1HSDA5X2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PE1HSDA5X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLm1heGZldiA9IDEwMDA7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOyAKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDQ5MCApOyAKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDM3NiApOyAKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAzLjA3NTA1NjAzODVFLTA0KTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDAuMTkyODA3NzA4OSk7IC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjQyMzU3Myk7IC8vIHNob3VsZCBiZSAxLjkxMjgyMzI4NzNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4xMjMwNTMwOTkxNCk7IC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTM5NTM3NSk7IC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMjUsIDAuMzksIDAuNDE1LCAwLjM5OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTgpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTYpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc4MSk7IC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjI2NSk7IC8vIHNob3VsZCBiZSAxLjkxMjgyMzI4NzNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4xMjMwNTI4MCk7IC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTMyMik7IC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCit9CisKKworCitzdHJ1Y3QgQmVubmV0dDVfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIEJlbm5ldHQ1X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNTQpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1NF07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1NF07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNTQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTQ7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKiBwb3coYlsxXSt4W2ldLC0xLi9iWzJdKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNTQpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGUgPSBwb3coYlsxXSt4W2ldLC0xLi9iWzJdKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGU7CisgICAgICAgICAgICBmamFjKGksMSkgPSAtIGJbMF0qZS9iWzJdLyhiWzFdK3hbaV0pOworICAgICAgICAgICAgZmphYyhpLDIpID0gYlswXSplKmxvZyhiWzFdK3hbaV0pL2JbMl0vYlsyXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnhbMTU0XSA9IHsgNy40NDcxNjhFMCwgOC4xMDI1ODZFMCwgOC40NTI1NDdFMCwgOC43MTEyNzhFMCwgOC45MTY3NzRFMCwgOS4wODcxNTVFMCwgOS4yMzI1OTBFMCwgOS4zNTk1MzVFMCwgOS40NzIxNjZFMCwgOS41NzMzODRFMCwgOS42NjUyOTNFMCwgOS43NDk0NjFFMCwgOS44MjcwOTJFMCwgOS44OTkxMjhFMCwgOS45NjYzMjFFMCwgMTAuMDI5MjgwRTAsIDEwLjA4ODUxMEUwLCAxMC4xNDQ0MzBFMCwgMTAuMTk3MzgwRTAsIDEwLjI0NzY3MEUwLCAxMC4yOTU1NjBFMCwgMTAuMzQxMjUwRTAsIDEwLjM4NDk1MEUwLCAxMC40MjY4MjBFMCwgMTAuNDY3MDAwRTAsIDEwLjUwNTY0MEUwLCAxMC41NDI4MzBFMCwgMTAuNTc4NjkwRTAsIDEwLjYxMzMxMEUwLCAxMC42NDY3ODBFMCwgMTAuNjc5MTUwRTAsIDEwLjcxMDUyMEUwLCAxMC43NDA5MjBFMCwgMTAuNzcwNDQwRTAsIDEwLjc5OTEwMEUwLCAxMC44MjY5NzBFMCwgMTAuODU0MDgwRTAsIDEwLjg4MDQ3MEUwLCAxMC45MDYxOTBFMCwgMTAuOTMxMjYwRTAsIDEwLjk1NTcyMEUwLCAxMC45Nzk1OTBFMCwgMTEuMDAyOTEwRTAsIDExLjAyNTcwMEUwLCAxMS4wNDc5ODBFMCwgMTEuMDY5NzcwRTAsIDExLjA5MTEwMEUwLCAxMS4xMTE5ODBFMCwgMTEuMTMyNDQwRTAsIDExLjE1MjQ4MEUwLCAxMS4xNzIxMzBFMCwgMTEuMTkxNDEwRTAsIDExLjIxMDMxMEUwLCAxMS4yMjg4NzBFMCwgMTEuMjQ3MDkwRTAsIDExLjI2NDk4MEUwLCAxMS4yODI1NjBFMCwgMTEuMjk5ODQwRTAsIDExLjMxNjgyMEUwLCAxMS4zMzM1MjBFMCwgMTEuMzQ5OTQwRTAsIDExLjM2NjEwMEUwLCAxMS4zODIwMDBFMCwgMTEuMzk3NjYwRTAsIDExLjQxMzA3MEUwLCAxMS40MjgyNDBFMCwgMTEuNDQzMjAwRTAsIDExLjQ1NzkzMEUwLCAxMS40NzI0NDBFMCwgMTEuNDg2NzUwRTAsIDExLjUwMDg2MEUwLCAxMS41MTQ3NzBFMCwgMTEuNTI4NDkwRTAsIDExLjU0MjAyMEUwLCAxMS41NTUzODBFMCwgMTEuNTY4NTUwRTAsCisxMS41ODE1NjBFMCwgMTEuNTk0NDIwRTAsIDExLjYwNzEyMUUwLCAxMS42MTk2NDBFMCwgMTEuNjMyMDAwRTAsIDExLjY0NDIxMEUwLCAxMS42NTYyODBFMCwgMTEuNjY4MjAwRTAsIDExLjY3OTk4MEUwLCAxMS42OTE2MjBFMCwgMTEuNzAzMTMwRTAsIDExLjcxNDUxMEUwLCAxMS43MjU3NjBFMCwgMTEuNzM2ODgwRTAsIDExLjc0Nzg5MEUwLCAxMS43NTg3ODBFMCwgMTEuNzY5NTUwRTAsIDExLjc4MDIwMEUwLCAxMS43OTA3MzBFMCwgMTEuODAxMTYwRTAsIDExLjgxMTQ4MEUwLCAxMS44MjE3MDBFMCwgMTEuODMxODEwRTAsIDExLjg0MTgyMEUwLCAxMS44NTE3MzBFMCwgMTEuODYxNTUwRTAsIDExLjg3MTI3MEUwLCAxMS44ODA4OTBFMCwgMTEuODkwNDIwRTAsIDExLjg5OTg3MEUwLCAxMS45MDkyMjBFMCwgMTEuOTE4NDkwRTAsIDExLjkyNzY4MEUwLCAxMS45MzY3ODBFMCwgMTEuOTQ1NzkwRTAsIDExLjk1NDczMEUwLCAxMS45NjM1OTBFMCwgMTEuOTcyMzcwRTAsIDExLjk4MTA3MEUwLCAxMS45ODk3MDBFMCwgMTEuOTk4MjYwRTAsIDEyLjAwNjc0MEUwLCAxMi4wMTUxNTBFMCwgMTIuMDIzNDkwRTAsIDEyLjAzMTc2MEUwLCAxMi4wMzk5NzBFMCwgMTIuMDQ4MTAwRTAsIDEyLjA1NjE3MEUwLCAxMi4wNjQxODBFMCwgMTIuMDcyMTIwRTAsIDEyLjA4MDAxMEUwLCAxMi4wODc4MjBFMCwgMTIuMDk1NTgwRTAsIDEyLjEwMzI4MEUwLCAxMi4xMTA5MjBFMCwgMTIuMTE4NTAwRTAsIDEyLjEyNjAzMEUwLCAxMi4xMzM1MDBFMCwgMTIuMTQwOTEwRTAsIDEyLjE0ODI3MEUwLCAxMi4xNTU1NzBFMCwgMTIuMTYyODMwRTAsIDEyLjE3MDAzMEUwLCAxMi4xNzcxNzBFMCwgMTIuMTg0MjcwRTAsIDEyLjE5MTMyMEUwLCAxMi4xOTgzMjBFMCwgMTIuMjA1MjcwRTAsIDEyLjIxMjE3MEUwLCAxMi4yMTkwMzBFMCwgMTIuMjI1ODQwRTAsIDEyLjIzMjYwMEUwLCAxMi4yMzkzMjBFMCwgMTIuMjQ1OTkwRTAsIDEyLjI1MjYyMEUwLCAxMi4yNTkyMDBFMCwgMTIuMjY1NzUwRTAsIDEyLjI3MjI0MEUwIH07Citjb25zdCBkb3VibGUgQmVubmV0dDVfZnVuY3Rvcjo6eVsxNTRdID0geyAtMzQuODM0NzAyRTAgLC0zNC4zOTMyMDBFMCAsLTM0LjE1MjkwMUUwICwtMzMuOTc5MDk5RTAgLC0zMy44NDU5MDFFMCAsLTMzLjczMjg5OUUwICwtMzMuNjQwMzAxRTAgLC0zMy41NTkyMDBFMCAsLTMzLjQ4NjgwMUUwICwtMzMuNDIzMTAwRTAgLC0zMy4zNjUxMDFFMCAsLTMzLjMxMzAwMEUwICwtMzMuMjYwODk5RTAgLC0zMy4yMTc0MDBFMCAsLTMzLjE3Njg5OUUwICwtMzMuMTM5MTk4RTAgLC0zMy4xMDE2MDFFMCAsLTMzLjA2Njc5OUUwICwtMzMuMDM1MDAwRTAgLC0zMy4wMDMxMDFFMCAsLTMyLjk3MTI5OEUwICwtMzIuOTQyMjk5RTAgLC0zMi45MTYzMDJFMCAsLTMyLjg5MDIwMkUwICwtMzIuODY0MTAxRTAgLC0zMi44NDEwMDBFMCAsLTMyLjgxNzc5OUUwICwtMzIuNzk3NTAxRTAgLC0zMi43NzQzMDBFMCAsLTMyLjc1NzAwMEUwICwtMzIuNzMzNzk5RTAgLC0zMi43MTY0MDBFMCAsLTMyLjY5OTEwMEUwICwtMzIuNjc4Nzk5RTAgLC0zMi42NjE0MDBFMCAsLTMyLjY0NDAwMUUwICwtMzIuNjI2NzAxRTAgLC0zMi42MTIyMDJFMCAsLTMyLjU5NzY5OEUwICwtMzIuNTgzMTk5RTAgLC0zMi41Njg2OTlFMCAsLTMyLjU1NDI5OEUwICwtMzIuNTM5Nzk5RTAgLC0zMi41MjUyOTlFMCAsLTMyLjUxMDc5OUUwICwtMzIuNDk5MTk5RTAgLC0zMi40ODc1OThFMCAsLTMyLjQ3MzIwMkUwICwtMzIuNDYxNjAxRTAgLC0zMi40MzU1MDFFMCAsLTMyLjQzNTUwMUUwICwtMzIuNDI2ODAwRTAgLC0zMi40MTIzMDBFMCAsLTMyLjQwMDc5OUUwICwtMzIuMzkyMTAxRTAgLC0zMi4zODA1MDFFMCAsLTMyLjM2NjAwMUUwICwtMzIuMzU3MzAwRTAgLC0zMi4zNDg1OThFMCAsLTMyLjMzOTkwMUUwICwtMzIuMzI4NDAwRTAgLC0zMi4zMTk2OThFMCAsLTMyLjMxMTAwMUUwICwtMzIuMjk5NDAwRTAgLC0zMi4yOTA2OTlFMCAsLTMyLjI4MjAwMUUwICwtMzIuMjczMzAwRTAgLC0zMi4yNjQ1OTlFMCAsLTMyLjI1NjAwMUUwICwtMzIuMjQ3Mjk5RTAKKywtMzIuMjM4NjAyRTAgLC0zMi4yMjk5MDBFMCAsLTMyLjIyNDA5OEUwICwtMzIuMjE1NDAxRTAgLC0zMi4yMDM4MDBFMCAsLTMyLjE5ODAwMkUwICwtMzIuMTg5NDAwRTAgLC0zMi4xODM2MDFFMCAsLTMyLjE3NDkwMEUwICwtMzIuMTY5MTAyRTAgLC0zMi4xNjMzMDBFMCAsLTMyLjE1NDU5OEUwICwtMzIuMTQ1OTAxRTAgLC0zMi4xNDAwOTlFMCAsLTMyLjEzMTQwMUUwICwtMzIuMTI1NTk5RTAgLC0zMi4xMTk4MDFFMCAsLTMyLjExMTE5OEUwICwtMzIuMTA1NDAwRTAgLC0zMi4wOTY2OTlFMCAsLTMyLjA5MDkwMEUwICwtMzIuMDg4MDAxRTAgLC0zMi4wNzkzMDBFMCAsLTMyLjA3MzUwMkUwICwtMzIuMDY3Njk5RTAgLC0zMi4wNjE5MDFFMCAsLTMyLjA1NjA5OUUwICwtMzIuMDUwMzAxRTAgLC0zMi4wNDQ0OThFMCAsLTMyLjAzODc5OUUwICwtMzIuMDMzMDAxRTAgLC0zMi4wMjcxOTlFMCAsLTMyLjAyNDMwMEUwICwtMzIuMDE4NTAxRTAgLC0zMi4wMTI2OTlFMCAsLTMyLjAwNDAwMkUwICwtMzIuMDAxMDk5RTAgLC0zMS45OTUzMDBFMCAsLTMxLjk4OTUwMEUwICwtMzEuOTgzNzAwRTAgLC0zMS45Nzc5MDBFMCAsLTMxLjk3MjA5OUUwICwtMzEuOTY5Mjk5RTAgLC0zMS45NjM1MDFFMCAsLTMxLjk1NzcwMUUwICwtMzEuOTUxOTAwRTAgLC0zMS45NDYxMDBFMCAsLTMxLjk0MDMwMEUwICwtMzEuOTM3NDAxRTAgLC0zMS45MzE2MDFFMCAsLTMxLjkyNTgwMEUwICwtMzEuOTIyODk5RTAgLC0zMS45MTcxMDFFMCAsLTMxLjkxMTMwMUUwICwtMzEuOTA4NDAwRTAgLC0zMS45MDI1OTlFMCAsLTMxLjg5NjkwMEUwICwtMzEuODkzOTk5RTAgLC0zMS44ODgyMDFFMCAsLTMxLjg4NTMwMEUwICwtMzEuODgyNDAxRTAgLC0zMS44NzY2MDBFMCAsLTMxLjg3MzY5OUUwICwtMzEuODY3OTAxRTAgLC0zMS44NjIxMDFFMCAsLTMxLjg1OTIwMEUwICwtMzEuODU2MzAwRTAgLC0zMS44NTA1MDBFMCAsLTMxLjg0NDcwMEUwICwtMzEuODQxODAxRTAgLC0zMS44Mzg5MDBFMCAsLTMxLjgzMzA5OUUwICwtMzEuODMwMjAwRTAgLAorLTMxLjgyNzI5OUUwICwtMzEuODIxNjAwRTAgLC0zMS44MTg3MDFFMCAsLTMxLjgxMjkwMUUwICwtMzEuODA5OTk5RTAgLC0zMS44MDcxMDBFMCAsLTMxLjgwMTMwMEUwICwtMzEuNzk4NDAxRTAgLC0zMS43OTU1MDBFMCAsLTMxLjc4OTcwMEUwICwtMzEuNzg2ODAwRTAgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvYmVubmV0dDUuc2h0bWwKK3ZvaWQgdGVzdE5pc3RCZW5uZXR0NSh2b2lkKQoreworICBjb25zdCBpbnQgIG49MzsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAtMjAwMC4sIDUwLiwgMC44OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgQmVubmV0dDVfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8QmVubmV0dDVfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwMDsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA3NTgpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNzQ0KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA1LjI0MDQ3NDQwNzNFLTA0KTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIC0yLjUyMzUwNTgwNDNFKzAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0LjY3MzY1NjQ2NDRFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA5LjMyMTg0ODMxOTNFLTAxKTsKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IC0xNTAwLiwgNDUuLCAwLjg1OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMjAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDE5Mik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS4yNDA0NzQ0MDczRS0wNCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAtMjUyMy4zMDA3ODY1KTsgLy8gc2hvdWxkIGJlIC0yLjUyMzUwNTgwNDNFKzAzCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNDYuNzM1NzA1NzcxKTsgLy8gc2hvdWxkIGJlIDQuNjczNjU2NDY0NEUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuOTMyMTk4ODE4OTEpOyAvLyBzaG91bGQgYmUgOS4zMjE4NDgzMTkzRS0wMSk7Cit9CisKK3N0cnVjdCB0aHVyYmVyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICB0aHVyYmVyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oNywzNykge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIF94WzM3XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIF95WzM3XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICAvLyAgICAgICAgaW50IGNhbGxlZD0wOyBwcmludGYoImNhbGwgaGFobjFfZnVuY3RvciB3aXRoICBpZmxhZz0lZCwgY2FsbGVkPSVkXG4iLCBpZmxhZywgY2FsbGVkKTsgaWYgKGlmbGFnPT0xKSBjYWxsZWQrKzsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zNyk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDM3OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4PV94W2ldLCB4eD14KngsIHh4eD14eCp4OworICAgICAgICAgICAgZnZlY1tpXSA9IChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAvICgxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCkgLSBfeVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nyk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MzcpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTcpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwzNzsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeD1feFtpXSwgeHg9eCp4LCB4eHg9eHgqeDsKKyAgICAgICAgICAgIGRvdWJsZSBmYWN0ID0gMS4vKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuKmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMSkgPSB4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMikgPSB4eCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDMpID0geHh4KmZhY3Q7CisgICAgICAgICAgICBmYWN0ID0gLSAoYlswXStiWzFdKngrYlsyXSp4eCtiWzNdKnh4eCkgKiBmYWN0ICogZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw0KSA9IHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw1KSA9IHh4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksNikgPSB4eHgqZmFjdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIHRodXJiZXJfZnVuY3Rvcjo6X3hbMzddID0geyAtMy4wNjdFMCwgLTIuOTgxRTAsIC0yLjkyMUUwLCAtMi45MTJFMCwgLTIuODQwRTAsIC0yLjc5N0UwLCAtMi43MDJFMCwgLTIuNjk5RTAsIC0yLjYzM0UwLCAtMi40ODFFMCwgLTIuMzYzRTAsIC0yLjMyMkUwLCAtMS41MDFFMCwgLTEuNDYwRTAsIC0xLjI3NEUwLCAtMS4yMTJFMCwgLTEuMTAwRTAsIC0xLjA0NkUwLCAtMC45MTVFMCwgLTAuNzE0RTAsIC0wLjU2NkUwLCAtMC41NDVFMCwgLTAuNDAwRTAsIC0wLjMwOUUwLCAtMC4xMDlFMCwgLTAuMTAzRTAsIDAuMDEwRTAsIDAuMTE5RTAsIDAuMzc3RTAsIDAuNzkwRTAsIDAuOTYzRTAsIDEuMDA2RTAsIDEuMTE1RTAsIDEuNTcyRTAsIDEuODQxRTAsIDIuMDQ3RTAsIDIuMjAwRTAgfTsKK2NvbnN0IGRvdWJsZSB0aHVyYmVyX2Z1bmN0b3I6Ol95WzM3XSA9IHsgODAuNTc0RTAsIDg0LjI0OEUwLCA4Ny4yNjRFMCwgODcuMTk1RTAsIDg5LjA3NkUwLCA4OS42MDhFMCwgODkuODY4RTAsIDkwLjEwMUUwLCA5Mi40MDVFMCwgOTUuODU0RTAsIDEwMC42OTZFMCwgMTAxLjA2MEUwLCA0MDEuNjcyRTAsIDM5MC43MjRFMCwgNTY3LjUzNEUwLCA2MzUuMzE2RTAsIDczMy4wNTRFMCwgNzU5LjA4N0UwLCA4OTQuMjA2RTAsIDk5MC43ODVFMCwgMTA5MC4xMDlFMCwgMTA4MC45MTRFMCwgMTEyMi42NDNFMCwgMTE3OC4zNTFFMCwgMTI2MC41MzFFMCwgMTI3My41MTRFMCwgMTI4OC4zMzlFMCwgMTMyNy41NDNFMCwgMTM1My44NjNFMCwgMTQxNC41MDlFMCwgMTQyNS4yMDhFMCwgMTQyMS4zODRFMCwgMTQ0Mi45NjJFMCwgMTQ2NC4zNTBFMCwgMTQ2OC43MDVFMCwgMTQ0Ny44OTRFMCwgMTQ1Ny42MjhFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3RodXJiZXIuc2h0bWwKK3ZvaWQgdGVzdE5pc3RUaHVyYmVyKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTc7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMTAwMCAsMTAwMCAsNDAwICw0MCAsMC43LDAuMywwLjAgOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgdGh1cmJlcl9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDx0aHVyYmVyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAzOSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAzNik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS42NDI3MDgyMzk3RSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjI4ODEzOTY4MDBFKzAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjQ5MTA3OTI1MzVFKzAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA1LjgzMjM4MzY4NzdFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCA3LjU0MTY2NDQyOTFFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCA5LjY2Mjk1MDI4NjRFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAzLjk3OTcyODU3OTdFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCA0Ljk3MjcyOTczNDlFLTAyKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMTMwMCAsMTUwMCAsNTAwICAsNzUgICAsMSAgICAsMC40ICAsMC4wNSAgOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDI5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDI4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA1LjY0MjcwODIzOTdFKzAzKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMjg4MTM5NjgwMEUrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuNDkxMDc5MjUzNUUrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDUuODMyMzgzNjg3N0UrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDcuNTQxNjY0NDI5MUUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDkuNjYyOTUwMjg2NEUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDMuOTc5NzI4NTc5N0UtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNl0sIDQuOTcyNzI5NzM0OUUtMDIpOworfQorCitzdHJ1Y3QgcmF0NDNfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIHJhdDQzX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oNCwxNSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTVdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gYlswXSAqIHBvdygxLitleHAoYlsxXS1iWzJdKnhbaV0pLC0xLi9iWzNdKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNSk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKKyAgICAgICAgICAgIGRvdWJsZSBwb3dlciA9IC0xLi9iWzNdOworICAgICAgICAgICAgZmphYyhpLDApID0gcG93KDEuK2UsIHBvd2VyKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHBvd2VyKmJbMF0qZSpwb3coMS4rZSwgcG93ZXItMS4pOworICAgICAgICAgICAgZmphYyhpLDIpID0gLXBvd2VyKmJbMF0qZSp4W2ldKnBvdygxLitlLCBwb3dlci0xLik7CisgICAgICAgICAgICBmamFjKGksMykgPSBiWzBdKnBvd2VyKnBvd2VyKmxvZygxLitlKSpwb3coMS4rZSwgcG93ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eFsxNV0gPSB7IDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4gfTsKK2NvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp5WzE1XSA9IHsgMTYuMDgsIDMzLjgzLCA2NS44MCwgOTcuMjAsIDE5MS41NSwgMzI2LjIwLCAzODYuODcsIDUyMC41MywgNTkwLjAzLCA2NTEuOTIsIDcyNC45MywgNjk5LjU2LCA2ODkuOTYsIDYzNy41NiwgNzE3LjQxIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3JhdGtvd3NreTMuc2h0bWwKK3ZvaWQgdGVzdE5pc3RSYXQ0Myh2b2lkKQoreworICBjb25zdCBpbnQgbj00OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDEwLiwgMS4sIDEuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgcmF0NDNfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8cmF0NDNfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDI3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDIwKTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4Ljc4NjQwNDkwODBFKzAzKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDYuOTk2NDE1MTI3MEUrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuMjc3MTI1MzAyNUUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDcuNTk2MjkzODMyOUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDEuMjc5MjQ4Mzg1OUUrMDApOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCA3MDAuLCA1LiwgMC43NSwgMS4zOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTUqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNSpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgOC43ODY0MDQ5MDgwRSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA2Ljk5NjQxNTEyNzBFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjI3NzEyNTMwMjVFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA3LjU5NjI5MzgzMjlFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI3OTI0ODM4NTlFKzAwKTsKK30KKworCisKK3N0cnVjdCBlY2tlcmxlNF9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgZWNrZXJsZTRfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLDM1KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszNV07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzM1XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTM1KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MzU7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdL2JbMV0gKiBleHAoLTAuNSooeFtpXS1iWzJdKSooeFtpXS1iWzJdKS8oYlsxXSpiWzFdKSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MzUpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwzNTsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgYjEyID0gYlsxXSpiWzFdOworICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoLTAuNSooeFtpXS1iWzJdKSooeFtpXS1iWzJdKS9iMTIpOworICAgICAgICAgICAgZmphYyhpLDApID0gZSAvIGJbMV07CisgICAgICAgICAgICBmamFjKGksMSkgPSAoKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvYjEyLTEuKSAqIGJbMF0qZS9iMTI7CisgICAgICAgICAgICBmamFjKGksMikgPSAoeFtpXS1iWzJdKSplKmJbMF0vYlsxXS9iMTI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBlY2tlcmxlNF9mdW5jdG9yOjp4WzM1XSA9IHsgNDAwLjAsIDQwNS4wLCA0MTAuMCwgNDE1LjAsIDQyMC4wLCA0MjUuMCwgNDMwLjAsIDQzNS4wLCA0MzYuNSwgNDM4LjAsIDQzOS41LCA0NDEuMCwgNDQyLjUsIDQ0NC4wLCA0NDUuNSwgNDQ3LjAsIDQ0OC41LCA0NTAuMCwgNDUxLjUsIDQ1My4wLCA0NTQuNSwgNDU2LjAsIDQ1Ny41LCA0NTkuMCwgNDYwLjUsIDQ2Mi4wLCA0NjMuNSwgNDY1LjAsIDQ3MC4wLCA0NzUuMCwgNDgwLjAsIDQ4NS4wLCA0OTAuMCwgNDk1LjAsIDUwMC4wfTsKK2NvbnN0IGRvdWJsZSBlY2tlcmxlNF9mdW5jdG9yOjp5WzM1XSA9IHsgMC4wMDAxNTc1LCAwLjAwMDE2OTksIDAuMDAwMjM1MCwgMC4wMDAzMTAyLCAwLjAwMDQ5MTcsIDAuMDAwODcxMCwgMC4wMDE3NDE4LCAwLjAwNDY0MDAsIDAuMDA2NTg5NSwgMC4wMDk3MzAyLCAwLjAxNDkwMDIsIDAuMDIzNzMxMCwgMC4wNDAxNjgzLCAwLjA3MTI1NTksIDAuMTI2NDQ1OCwgMC4yMDczNDEzLCAwLjI5MDIzNjYsIDAuMzQ0NTYyMywgMC4zNjk4MDQ5LCAwLjM2Njg1MzQsIDAuMzEwNjcyNywgMC4yMDc4MTU0LCAwLjExNjQzNTQsIDAuMDYxNjc2NCwgMC4wMzM3MjAwLCAwLjAxOTQwMjMsIDAuMDExNzgzMSwgMC4wMDc0MzU3LCAwLjAwMjI3MzIsIDAuMDAwODgwMCwgMC4wMDA0NTc5LCAwLjAwMDIzNDUsIDAuMDAwMTU4NiwgMC4wMDAxMTQzLCAwLjAwMDA3MTAgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvZWNrZXJsZTQuc2h0bWwKK3ZvaWQgdGVzdE5pc3RFY2tlcmxlNCh2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEuLCAxMC4sIDUwMC47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBlY2tlcmxlNF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxlY2tlcmxlNF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxOCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAxNSk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMS40NjM1ODg3NDg3RS0wMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjU1NDM4MjcxNzgpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDQuMDg4ODMyMTc1NCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNC41MTU0MTIxODQ0RSswMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDEuNSwgNS4sIDQ1MC47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDcpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMS40NjM1ODg3NDg3RS0wMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjU1NDM4MjcxNzgpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDQuMDg4ODMyMTc1NCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNC41MTU0MTIxODQ0RSswMik7Cit9CisKK3ZvaWQgdGVzdF9Ob25MaW5lYXJPcHRpbWl6YXRpb24oKQoreworICAgIC8vIFRlc3RzIHVzaW5nIHRoZSBleGFtcGxlcyBwcm92aWRlZCBieSAoYyltaW5wYWNrCisgICAgQ0FMTF9TVUJURVNULypfMSovKHRlc3RDaGtkZXIoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMSovKHRlc3RMbWRlcjEoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMSovKHRlc3RMbWRlcigpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8yKi8odGVzdEh5YnJqMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8yKi8odGVzdEh5YnJqKCkpOworICAgIENBTExfU1VCVEVTVC8qXzIqLyh0ZXN0SHlicmQxKCkpOworICAgIENBTExfU1VCVEVTVC8qXzIqLyh0ZXN0SHlicmQoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMyovKHRlc3RMbXN0cjEoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMyovKHRlc3RMbXN0cigpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8zKi8odGVzdExtZGlmMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8zKi8odGVzdExtZGlmKCkpOworCisgICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJMb3dlciIKKyAgICBDQUxMX1NVQlRFU1QvKl80Ki8odGVzdE5pc3RNaXNyYTFhKCkpOworICAgIENBTExfU1VCVEVTVC8qXzQqLyh0ZXN0TmlzdENod2lydXQyKCkpOworCisgICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJBdmVyYWdlIgorICAgIENBTExfU1VCVEVTVC8qXzUqLyh0ZXN0TmlzdEhhaG4xKCkpOworICAgIENBTExfU1VCVEVTVC8qXzYqLyh0ZXN0TmlzdE1pc3JhMWQoKSk7CisgICAgQ0FMTF9TVUJURVNULypfNyovKHRlc3ROaXN0TUdIMTcoKSk7CisgICAgQ0FMTF9TVUJURVNULypfOCovKHRlc3ROaXN0TGFuY3pvczEoKSk7CisKKy8vICAgICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkhpZ2hlciIKKyAgICBDQUxMX1NVQlRFU1QvKl85Ki8odGVzdE5pc3RSYXQ0MigpKTsKKy8vICAgICBDQUxMX1NVQlRFU1QvKl8xMCovKHRlc3ROaXN0TUdIMTAoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMTEqLyh0ZXN0TmlzdEJveEJPRCgpKTsKKy8vICAgICBDQUxMX1NVQlRFU1QvKl8xMiovKHRlc3ROaXN0TUdIMDkoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMTMqLyh0ZXN0TmlzdEJlbm5ldHQ1KCkpOworICAgIENBTExfU1VCVEVTVC8qXzE0Ki8odGVzdE5pc3RUaHVyYmVyKCkpOworICAgIENBTExfU1VCVEVTVC8qXzE1Ki8odGVzdE5pc3RSYXQ0MygpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8xNiovKHRlc3ROaXN0RWNrZXJsZTQoKSk7Cit9CisKKy8qCisgKiBDYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4KKyAgcHJpbnRmKCJpbmZvLCBuZmV2IDogJWQsICVkXG4iLCBpbmZvLCBsbS5uZmV2KTsKKyAgcHJpbnRmKCJpbmZvLCBuZmV2LCBuamV2IDogJWQsICVkLCAlZFxuIiwgaW5mbywgc29sdmVyLm5mZXYsIHNvbHZlci5uamV2KTsKKyAgcHJpbnRmKCJpbmZvLCBuZmV2IDogJWQsICVkXG4iLCBpbmZvLCBzb2x2ZXIubmZldik7CisgIHByaW50ZigieFswXSA6ICUuMzJnXG4iLCB4WzBdKTsKKyAgcHJpbnRmKCJ4WzFdIDogJS4zMmdcbiIsIHhbMV0pOworICBwcmludGYoInhbMl0gOiAlLjMyZ1xuIiwgeFsyXSk7CisgIHByaW50ZigieFszXSA6ICUuMzJnXG4iLCB4WzNdKTsKKyAgcHJpbnRmKCJmdmVjLmJsdWVOb3JtKCkgOiAlLjMyZ1xuIiwgc29sdmVyLmZ2ZWMuYmx1ZU5vcm0oKSk7CisgIHByaW50ZigiZnZlYy5ibHVlTm9ybSgpIDogJS4zMmdcbiIsIGxtLmZ2ZWMuYmx1ZU5vcm0oKSk7CisKKyAgcHJpbnRmKCJpbmZvLCBuZmV2LCBuamV2IDogJWQsICVkLCAlZFxuIiwgaW5mbywgbG0ubmZldiwgbG0ubmpldik7CisgIHByaW50ZigiZnZlYy5zcXVhcmVkTm9ybSgpIDogJS4xM2dcbiIsIGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSk7CisgIHN0ZDo6Y291dCA8PCB4IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0LnByZWNpc2lvbig5KTsKKyAgc3RkOjpjb3V0IDw8IHhbMF0gPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgeFsxXSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCB4WzJdIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IHhbM10gPDwgc3RkOjplbmRsOworKi8KKwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9OdW1lcmljYWxEaWZmLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvTnVtZXJpY2FsRGlmZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkODg4MAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvTnVtZXJpY2FsRGlmZi5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBDYXByaWNlbGxpIDxvcnplbEBmcmVlaGFja2Vycy5vcmc+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmY+CisgICAgCisvLyBHZW5lcmljIGZ1bmN0b3IKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBOWD1EeW5hbWljLCBpbnQgTlk9RHluYW1pYz4KK3N0cnVjdCBGdW5jdG9yCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKKyAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKKyAgCisgIGludCBtX2lucHV0cywgbV92YWx1ZXM7CisgIAorICBGdW5jdG9yKCkgOiBtX2lucHV0cyhJbnB1dHNBdENvbXBpbGVUaW1lKSwgbV92YWx1ZXMoVmFsdWVzQXRDb21waWxlVGltZSkge30KKyAgRnVuY3RvcihpbnQgaW5wdXRzLCBpbnQgdmFsdWVzKSA6IG1faW5wdXRzKGlucHV0cyksIG1fdmFsdWVzKHZhbHVlcykge30KKyAgCisgIGludCBpbnB1dHMoKSBjb25zdCB7IHJldHVybiBtX2lucHV0czsgfQorICBpbnQgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworfTsKKworc3RydWN0IG15X2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBteV9mdW5jdG9yKHZvaWQpOiBGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICAgICAgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKKyAgICAgICAgICAgIDMuOWUtMSwgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAyLjEsIDQuMzl9OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7CisgICAgICAgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMS8oeFsxXSp0bXAyICsgeFsyXSp0bXAzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGFjdHVhbF9kZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKKyAgICAgICAgICAgIHRtcDQgPSAoeFsxXSp0bXAyICsgeFsyXSp0bXAzKTsgdG1wNCA9IHRtcDQqdG1wNDsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IC0xOworICAgICAgICAgICAgZmphYyhpLDEpID0gdG1wMSp0bXAyL3RtcDQ7CisgICAgICAgICAgICBmamFjKGksMikgPSB0bXAxKnRtcDMvdG1wNDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCit2b2lkIHRlc3RfZm9yd2FyZCgpCit7CisgICAgVmVjdG9yWGQgeCgzKTsKKyAgICBNYXRyaXhYZCBqYWMoMTUsMyk7CisgICAgTWF0cml4WGQgYWN0dWFsX2phYygxNSwzKTsKKyAgICBteV9mdW5jdG9yIGZ1bmN0b3I7CisKKyAgICB4IDw8IDAuMDgyLCAxLjEzLCAyLjM1OworCisgICAgLy8gcmVhbCBvbmUgCisgICAgZnVuY3Rvci5hY3R1YWxfZGYoeCwgYWN0dWFsX2phYyk7CisvLyAgICBzdGQ6OmNvdXQgPDwgYWN0dWFsX2phYyA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgLy8gdXNpbmcgTnVtZXJpY2FsRGlmZgorICAgIE51bWVyaWNhbERpZmY8bXlfZnVuY3Rvcj4gbnVtRGlmZihmdW5jdG9yKTsKKyAgICBudW1EaWZmLmRmKHgsIGphYyk7CisvLyAgICBzdGQ6OmNvdXQgPDwgamFjIDw8IHN0ZDo6ZW5kbDsKKworICAgIFZFUklGWV9JU19BUFBST1goamFjLCBhY3R1YWxfamFjKTsKK30KKwordm9pZCB0ZXN0X2NlbnRyYWwoKQoreworICAgIFZlY3RvclhkIHgoMyk7CisgICAgTWF0cml4WGQgamFjKDE1LDMpOworICAgIE1hdHJpeFhkIGFjdHVhbF9qYWMoMTUsMyk7CisgICAgbXlfZnVuY3RvciBmdW5jdG9yOworCisgICAgeCA8PCAwLjA4MiwgMS4xMywgMi4zNTsKKworICAgIC8vIHJlYWwgb25lIAorICAgIGZ1bmN0b3IuYWN0dWFsX2RmKHgsIGFjdHVhbF9qYWMpOworCisgICAgLy8gdXNpbmcgTnVtZXJpY2FsRGlmZgorICAgIE51bWVyaWNhbERpZmY8bXlfZnVuY3RvcixDZW50cmFsPiBudW1EaWZmKGZ1bmN0b3IpOworICAgIG51bURpZmYuZGYoeCwgamFjKTsKKworICAgIFZFUklGWV9JU19BUFBST1goamFjLCBhY3R1YWxfamFjKTsKK30KKwordm9pZCB0ZXN0X051bWVyaWNhbERpZmYoKQoreworICAgIENBTExfU1VCVEVTVCh0ZXN0X2ZvcndhcmQoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfY2VudHJhbCgpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9hbGlnbmVkdmVjdG9yMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyY2IxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0FsaWduZWRWZWN0b3IzPgorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULHR5cGVuYW1lIERlcml2ZWQ+CitUIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQWxpZ25lZFZlY3RvcjM8VD4gJmEsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4gJmIpCit7CisgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEuY29lZmZzKCkudGVtcGxhdGUgaGVhZDwzPigpLCBiKTsKK30KKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGFsaWduZWR2ZWN0b3IzKCkKK3sKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBSZWZUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXQzMzsKKyAgdHlwZWRlZiBBbGlnbmVkVmVjdG9yMzxTY2FsYXI+IEZhc3RUeXBlOworICBSZWZUeXBlICByMShSZWZUeXBlOjpSYW5kb20oKSksIHIyKFJlZlR5cGU6OlJhbmRvbSgpKSwgcjMoUmVmVHlwZTo6UmFuZG9tKCkpLAorICAgICAgICAgICByNChSZWZUeXBlOjpSYW5kb20oKSksIHI1KFJlZlR5cGU6OlJhbmRvbSgpKTsKKyAgRmFzdFR5cGUgZjEocjEpLCBmMihyMiksIGYzKHIzKSwgZjQocjQpLCBmNShyNSk7CisgIE1hdDMzIG0xKE1hdDMzOjpSYW5kb20oKSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKGYxLHIxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNCxyNCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmNCtmMSxyNCtyMSk7CisgIFZFUklGWV9JU19BUFBST1goZjQtZjEscjQtcjEpOworICBWRVJJRllfSVNfQVBQUk9YKGY0K2YxLWYyLHI0K3IxLXIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNCs9ZjMscjQrPXIzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNC09ZjUscjQtPXI1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNC09ZjUrZjEscjQtPXI1K3IxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNStmMS1zMSpmMixyNStyMS1zMSpyMik7CisgIFZFUklGWV9JU19BUFBST1goZjUrZjEvczItczEqZjIscjUrcjEvczItczEqcjIpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSpmNCxtMSpyNCk7CisgIFZFUklGWV9JU19BUFBST1goZjQudHJhbnNwb3NlKCkqbTEscjQudHJhbnNwb3NlKCkqbTEpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChmMi5kb3QoZjMpLHIyLmRvdChyMykpOworICBWRVJJRllfSVNfQVBQUk9YKGYyLmNyb3NzKGYzKSxyMi5jcm9zcyhyMykpOworICBWRVJJRllfSVNfQVBQUk9YKGYyLm5vcm0oKSxyMi5ub3JtKCkpOworCisgIFZFUklGWV9JU19BUFBST1goZjIubm9ybWFsaXplZCgpLHIyLm5vcm1hbGl6ZWQoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgoZjIrZjEpLm5vcm1hbGl6ZWQoKSwocjIrcjEpLm5vcm1hbGl6ZWQoKSk7CisgIAorICBmMi5ub3JtYWxpemUoKTsKKyAgcjIubm9ybWFsaXplKCk7CisgIFZFUklGWV9JU19BUFBST1goZjIscjIpOworICAKKyAgeworICAgIEZhc3RUeXBlIGY2ID0gUmVmVHlwZTo6WmVybygpOworICAgIEZhc3RUeXBlIGY3ID0gRmFzdFR5cGU6Olplcm8oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGY2LGY3KTsKKyAgICBmNiA9IHI0K3IxOworICAgIFZFUklGWV9JU19BUFBST1goZjYscjQrcjEpOworICAgIGY2IC09IFNjYWxhcigyKSpyNDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGY2LHIxLXI0KTsKKyAgfQorICAKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3MxLCBzczI7CisgIHNzMSA8PCBmMTsKKyAgc3MyIDw8IHIxOworICBWRVJJRlkoc3MxLnN0cigpPT1zczIuc3RyKCkpOworfQorCit2b2lkIHRlc3RfYWxpZ25lZHZlY3RvcjMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVCggYWxpZ25lZHZlY3RvcjM8ZmxvYXQ+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9hdXRvZGlmZi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2F1dG9kaWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc0MzEzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9hdXRvZGlmZi5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0F1dG9EaWZmPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIgZm9vKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQoreworICB1c2luZyBuYW1lc3BhY2Ugc3RkOworLy8gICByZXR1cm4geCtzdGQ6OnNpbih5KTsKKyAgRUlHRU5fQVNNX0NPTU1FTlQoIm15YmVnaW4iKTsKKyAgLy8gcG93KGZsb2F0LCBpbnQpIHByb21vdGVzIHRvIHBvdyhkb3VibGUsIGRvdWJsZSkKKyAgcmV0dXJuIHgqMiAtIDEgKyBzdGF0aWNfY2FzdDxTY2FsYXI+KHBvdygxK3gsMikpICsgMipzcXJ0KHkqeSswKSAtIDQgKiBzaW4oMCt4KSArIDIgKiBjb3MoeSswKSAtIGV4cChTY2FsYXIoLTAuNSkqeCp4KzApOworICAvL3JldHVybiB4KzIqeSp4Oy8veCoyIC1zdGQ6OnBvdyh4LDIpOy8vKDIqeS94KTsvLyAtIHkqMjsKKyAgRUlHRU5fQVNNX0NPTU1FTlQoIm15ZW5kIik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFZlY3Rvcjo6U2NhbGFyIGZvbyhjb25zdCBWZWN0b3ImIHApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpTY2FsYXIgU2NhbGFyOworICByZXR1cm4gKHAtVmVjdG9yKFNjYWxhcigtMSksU2NhbGFyKDEuKSkpLm5vcm0oKSArIChwLmFycmF5KCkgKiBwLmFycmF5KCkpLnN1bSgpICsgcC5kb3QocCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBOWD1EeW5hbWljLCBpbnQgTlk9RHluYW1pYz4KK3N0cnVjdCBUZXN0RnVuYzEKK3sKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7CisgICAgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLAorICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBOWQorICB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsSW5wdXRzQXRDb21waWxlVGltZSwxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLDE+IFZhbHVlVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsSW5wdXRzQXRDb21waWxlVGltZT4gSmFjb2JpYW5UeXBlOworCisgIGludCBtX2lucHV0cywgbV92YWx1ZXM7CisKKyAgVGVzdEZ1bmMxKCkgOiBtX2lucHV0cyhJbnB1dHNBdENvbXBpbGVUaW1lKSwgbV92YWx1ZXMoVmFsdWVzQXRDb21waWxlVGltZSkge30KKyAgVGVzdEZ1bmMxKGludCBpbnB1dHMsIGludCB2YWx1ZXMpIDogbV9pbnB1dHMoaW5wdXRzKSwgbV92YWx1ZXModmFsdWVzKSB7fQorCisgIGludCBpbnB1dHMoKSBjb25zdCB7IHJldHVybiBtX2lucHV0czsgfQorICBpbnQgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IE1hdHJpeDxULElucHV0c0F0Q29tcGlsZVRpbWUsMT4mIHgsIE1hdHJpeDxULFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4qIF92KSBjb25zdAorICB7CisgICAgTWF0cml4PFQsVmFsdWVzQXRDb21waWxlVGltZSwxPiYgdiA9ICpfdjsKKworICAgIHZbMF0gPSAyICogeFswXSAqIHhbMF0gKyB4WzBdICogeFsxXTsKKyAgICB2WzFdID0gMyAqIHhbMV0gKiB4WzBdICsgMC41ICogeFsxXSAqIHhbMV07CisgICAgaWYoaW5wdXRzKCk+MikKKyAgICB7CisgICAgICB2WzBdICs9IDAuNSAqIHhbMl07CisgICAgICB2WzFdICs9IHhbMl07CisgICAgfQorICAgIGlmKHZhbHVlcygpPjIpCisgICAgeworICAgICAgdlsyXSA9IDMgKiB4WzFdICogeFswXSAqIHhbMF07CisgICAgfQorICAgIGlmIChpbnB1dHMoKT4yICYmIHZhbHVlcygpPjIpCisgICAgICB2WzJdICo9IHhbMl07CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qKSBjb25zdAorICB7CisgICAgKCp0aGlzKSh4LCB2KTsKKworICAgIGlmKF9qKQorICAgIHsKKyAgICAgIEphY29iaWFuVHlwZSYgaiA9ICpfajsKKworICAgICAgaigwLDApID0gNCAqIHhbMF0gKyB4WzFdOworICAgICAgaigxLDApID0gMyAqIHhbMV07CisKKyAgICAgIGooMCwxKSA9IHhbMF07CisgICAgICBqKDEsMSkgPSAzICogeFswXSArIDIgKiAwLjUgKiB4WzFdOworCisgICAgICBpZiAoaW5wdXRzKCk+MikKKyAgICAgIHsKKyAgICAgICAgaigwLDIpID0gMC41OworICAgICAgICBqKDEsMikgPSAxOworICAgICAgfQorICAgICAgaWYodmFsdWVzKCk+MikKKyAgICAgIHsKKyAgICAgICAgaigyLDApID0gMyAqIHhbMV0gKiAyICogeFswXTsKKyAgICAgICAgaigyLDEpID0gMyAqIHhbMF0gKiB4WzBdOworICAgICAgfQorICAgICAgaWYgKGlucHV0cygpPjIgJiYgdmFsdWVzKCk+MikKKyAgICAgIHsKKyAgICAgICAgaigyLDApICo9IHhbMl07CisgICAgICAgIGooMiwxKSAqPSB4WzJdOworCisgICAgICAgIGooMiwyKSA9IDMgKiB4WzFdICogeFswXSAqIHhbMF07CisgICAgICAgIGooMiwyKSA9IDMgKiB4WzFdICogeFswXSAqIHhbMF07CisgICAgICB9CisgICAgfQorICB9Cit9OworCisKKyNpZiBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCisvKiBUZXN0IGZ1bmN0b3IgZm9yIHRoZSBDKysxMSBmZWF0dXJlcy4gKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgaW50ZWdyYXRvckZ1bmN0b3IKK3sKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDIsIDE+IElucHV0VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDIsIDE+IFZhbHVlVHlwZTsKKworICAgIC8qCisgICAgICogSW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUuCisgICAgICovCisgICAgaW50ZWdyYXRvckZ1bmN0b3IoY29uc3QgU2NhbGFyIGdhaW4pIDogX2dhaW4oZ2Fpbikge30KKyAgICBpbnRlZ3JhdG9yRnVuY3Rvcihjb25zdCBpbnRlZ3JhdG9yRnVuY3RvciYgZikgOiBfZ2FpbihmLl9nYWluKSB7fQorICAgIGNvbnN0IFNjYWxhciBfZ2FpbjsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBUMSAmaW5wdXQsIFQyICpvdXRwdXQsIGNvbnN0IFNjYWxhciBkdCkgY29uc3QKKyAgICB7CisgICAgICAgIFQyICZvID0gKm91dHB1dDsKKworICAgICAgICAvKiBJbnRlZ3JhdG9yIHRvIHRlc3QgdGhlIEFELiAqLworICAgICAgICBvWzBdID0gaW5wdXRbMF0gKyBpbnB1dFsxXSAqIGR0ICogX2dhaW47CisgICAgICAgIG9bMV0gPSBpbnB1dFsxXSAqIF9nYWluOworICAgIH0KKworICAgIC8qIE9ubHkgbmVlZGVkIGZvciB0aGUgdGVzdCAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICAgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgVDEgJmlucHV0LCBUMiAqb3V0cHV0LCBUMyAqamFjb2JpYW4sIGNvbnN0IFNjYWxhciBkdCkgY29uc3QKKyAgICB7CisgICAgICAgIFQyICZvID0gKm91dHB1dDsKKworICAgICAgICAvKiBJbnRlZ3JhdG9yIHRvIHRlc3QgdGhlIEFELiAqLworICAgICAgICBvWzBdID0gaW5wdXRbMF0gKyBpbnB1dFsxXSAqIGR0ICogX2dhaW47CisgICAgICAgIG9bMV0gPSBpbnB1dFsxXSAqIF9nYWluOworCisgICAgICAgIGlmIChqYWNvYmlhbikKKyAgICAgICAgeworICAgICAgICAgICAgVDMgJmogPSAqamFjb2JpYW47CisKKyAgICAgICAgICAgIGooMCwgMCkgPSAxOworICAgICAgICAgICAgaigwLCAxKSA9IGR0ICogX2dhaW47CisgICAgICAgICAgICBqKDEsIDApID0gMDsKKyAgICAgICAgICAgIGooMSwgMSkgPSBfZ2FpbjsKKyAgICAgICAgfQorICAgIH0KKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4gdm9pZCBmb3J3YXJkX2phY29iaWFuX2NwcDExKGNvbnN0IEZ1bmMmIGYpCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIElucHV0VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEF1dG9EaWZmSmFjb2JpYW48RnVuYz46OkphY29iaWFuVHlwZSBKYWNvYmlhblR5cGU7CisKKyAgICBJbnB1dFR5cGUgeCA9IElucHV0VHlwZTo6UmFuZG9tKElucHV0VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpOworICAgIFZhbHVlVHlwZSB5LCB5cmVmOworICAgIEphY29iaWFuVHlwZSBqLCBqcmVmOworCisgICAgY29uc3QgU2NhbGFyIGR0ID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7CisKKyAgICBqcmVmLnNldFplcm8oKTsKKyAgICB5cmVmLnNldFplcm8oKTsKKyAgICBmKHgsICZ5cmVmLCAmanJlZiwgZHQpOworCisgICAgLy9zdGQ6OmNlcnIgPDwgInksIHlyZWYsIGpyZWY6ICIgPDwgIlxuIjsKKyAgICAvL3N0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKKyAgICAvL3N0ZDo6Y2VyciA8PCB5cmVmIDw8ICJcblxuIjsKKyAgICAvL3N0ZDo6Y2VyciA8PCBqcmVmIDw8ICJcblxuIjsKKworICAgIEF1dG9EaWZmSmFjb2JpYW48RnVuYz4gYXV0b2ooZik7CisgICAgYXV0b2ooeCwgJnksICZqLCBkdCk7CisKKyAgICAvL3N0ZDo6Y2VyciA8PCAieSBqICh2aWEgYXV0b2RpZmYpOiAiIDw8ICJcbiI7CisgICAgLy9zdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisgICAgLy9zdGQ6OmNlcnIgPDwgaiA8PCAiXG5cbiI7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHksIHlyZWYpOworICAgIFZFUklGWV9JU19BUFBST1goaiwganJlZik7Cit9CisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4gdm9pZCBmb3J3YXJkX2phY29iaWFuKGNvbnN0IEZ1bmMmIGYpCit7CisgICAgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIHggPSBGdW5jOjpJbnB1dFR5cGU6OlJhbmRvbShmLmlucHV0cygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGUgeShmLnZhbHVlcygpKSwgeXJlZihmLnZhbHVlcygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpKYWNvYmlhblR5cGUgaihmLnZhbHVlcygpLGYuaW5wdXRzKCkpLCBqcmVmKGYudmFsdWVzKCksZi5pbnB1dHMoKSk7CisKKyAgICBqcmVmLnNldFplcm8oKTsKKyAgICB5cmVmLnNldFplcm8oKTsKKyAgICBmKHgsJnlyZWYsJmpyZWYpOworLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7CisvLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKKworICAgIGouc2V0WmVybygpOworICAgIHkuc2V0WmVybygpOworICAgIEF1dG9EaWZmSmFjb2JpYW48RnVuYz4gYXV0b2ooZik7CisgICAgYXV0b2ooeCwgJnksICZqKTsKKy8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OworLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHksIHlyZWYpOworICAgIFZFUklGWV9JU19BUFBST1goaiwganJlZik7Cit9CisKKy8vIFRPRE8gYWxzbyBjaGVjayBhY3R1YWwgZGVyaXZhdGl2ZXMhCit0ZW1wbGF0ZSA8aW50Pgordm9pZCB0ZXN0X2F1dG9kaWZmX3NjYWxhcigpCit7CisgIFZlY3RvcjJmIHAgPSBWZWN0b3IyZjo6UmFuZG9tKCk7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yMmY+IEFEOworICBBRCBheChwLngoKSxWZWN0b3IyZjo6VW5pdFgoKSk7CisgIEFEIGF5KHAueSgpLFZlY3RvcjJmOjpVbml0WSgpKTsKKyAgQUQgcmVzID0gZm9vPEFEPihheCxheSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLnZhbHVlKCksIGZvbyhwLngoKSxwLnkoKSkpOworfQorCisKKy8vIFRPRE8gYWxzbyBjaGVjayBhY3R1YWwgZGVyaXZhdGl2ZXMhCit0ZW1wbGF0ZSA8aW50Pgordm9pZCB0ZXN0X2F1dG9kaWZmX3ZlY3RvcigpCit7CisgIFZlY3RvcjJmIHAgPSBWZWN0b3IyZjo6UmFuZG9tKCk7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yMmY+IEFEOworICB0eXBlZGVmIE1hdHJpeDxBRCwyLDE+IFZlY3RvckFEOworICBWZWN0b3JBRCBhcCA9IHAuY2FzdDxBRD4oKTsKKyAgYXAueCgpLmRlcml2YXRpdmVzKCkgPSBWZWN0b3IyZjo6VW5pdFgoKTsKKyAgYXAueSgpLmRlcml2YXRpdmVzKCkgPSBWZWN0b3IyZjo6VW5pdFkoKTsKKworICBBRCByZXMgPSBmb288VmVjdG9yQUQ+KGFwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMudmFsdWUoKSwgZm9vKHApKTsKK30KKwordGVtcGxhdGUgPGludD4KK3ZvaWQgdGVzdF9hdXRvZGlmZl9qYWNvYmlhbigpCit7CisgIENBTExfU1VCVEVTVCgoIGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwyLDI+KCkpICkpOworICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwzPigpKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggZm9yd2FyZF9qYWNvYmlhbihUZXN0RnVuYzE8ZG91YmxlLDMsMj4oKSkgKSk7CisgIENBTExfU1VCVEVTVCgoIGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwzLDM+KCkpICkpOworICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGU+KDMsMykpICkpOworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgQ0FMTF9TVUJURVNUKCggZm9yd2FyZF9qYWNvYmlhbl9jcHAxMShpbnRlZ3JhdG9yRnVuY3Rvcjxkb3VibGU+KDEwKSkgKSk7CisjZW5kaWYKK30KKworCit0ZW1wbGF0ZSA8aW50Pgordm9pZCB0ZXN0X2F1dG9kaWZmX2hlc3NpYW4oKQoreworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPFZlY3RvclhkPiBBRDsKKyAgdHlwZWRlZiBNYXRyaXg8QUQsRWlnZW46OkR5bmFtaWMsMT4gVmVjdG9yQUQ7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yQUQ+IEFERDsKKyAgdHlwZWRlZiBNYXRyaXg8QURELEVpZ2VuOjpEeW5hbWljLDE+IFZlY3RvckFERDsKKyAgVmVjdG9yQUREIHgoMik7CisgIGRvdWJsZSBzMSA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpLCBzMiA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpLCBzMyA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpLCBzNCA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpOworICB4KDApLnZhbHVlKCk9czE7CisgIHgoMSkudmFsdWUoKT1zMjsKKworICAvL3NldCB1bml0IHZlY3RvcnMgZm9yIHRoZSBkZXJpdmF0aXZlIGRpcmVjdGlvbnMgKHBhcnRpYWwgZGVyaXZhdGl2ZXMgb2YgdGhlIGlucHV0IHZlY3RvcikKKyAgeCgwKS5kZXJpdmF0aXZlcygpLnJlc2l6ZSgyKTsKKyAgeCgwKS5kZXJpdmF0aXZlcygpLnNldFplcm8oKTsKKyAgeCgwKS5kZXJpdmF0aXZlcygpKDApPSAxOworICB4KDEpLmRlcml2YXRpdmVzKCkucmVzaXplKDIpOworICB4KDEpLmRlcml2YXRpdmVzKCkuc2V0WmVybygpOworICB4KDEpLmRlcml2YXRpdmVzKCkoMSk9MTsKKworICAvL3JlcGVhdCBwYXJ0aWFsIGRlcml2YXRpdmVzIGZvciB0aGUgaW5uZXIgQXV0b0RpZmZTY2FsYXIKKyAgeCgwKS52YWx1ZSgpLmRlcml2YXRpdmVzKCkgPSBWZWN0b3JYZDo6VW5pdCgyLDApOworICB4KDEpLnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSA9IFZlY3RvclhkOjpVbml0KDIsMSk7CisKKyAgLy9zZXQgdGhlIGhlc3NpYW4gbWF0cml4IHRvIHplcm8KKyAgZm9yKGludCBpZHg9MDsgaWR4PDI7IGlkeCsrKSB7CisgICAgICB4KDApLmRlcml2YXRpdmVzKCkoaWR4KS5kZXJpdmF0aXZlcygpICA9IFZlY3RvclhkOjpaZXJvKDIpOworICAgICAgeCgxKS5kZXJpdmF0aXZlcygpKGlkeCkuZGVyaXZhdGl2ZXMoKSAgPSBWZWN0b3JYZDo6WmVybygyKTsKKyAgfQorCisgIEFERCB5ID0gc2luKEFEKHMzKSp4KDApICsgQUQoczQpKngoMSkpOworCisgIFZFUklGWV9JU19BUFBST1goeS52YWx1ZSgpLmRlcml2YXRpdmVzKCkoMCksIHkuZGVyaXZhdGl2ZXMoKSgwKS52YWx1ZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh5LnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSgxKSwgeS5kZXJpdmF0aXZlcygpKDEpLnZhbHVlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHkudmFsdWUoKS5kZXJpdmF0aXZlcygpKDApLCBzMypzdGQ6OmNvcyhzMSpzMytzMipzNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHkudmFsdWUoKS5kZXJpdmF0aXZlcygpKDEpLCBzNCpzdGQ6OmNvcyhzMSpzMytzMipzNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHkuZGVyaXZhdGl2ZXMoKSgwKS5kZXJpdmF0aXZlcygpLCAtc3RkOjpzaW4oczEqczMrczIqczQpKlZlY3RvcjJkKHMzKnMzLHM0KnMzKSk7CisgIFZFUklGWV9JU19BUFBST1goeS5kZXJpdmF0aXZlcygpKDEpLmRlcml2YXRpdmVzKCksICAtc3RkOjpzaW4oczEqczMrczIqczQpKlZlY3RvcjJkKHMzKnM0LHM0KnM0KSk7CisKKyAgQUREIHogPSB4KDApKngoMSk7CisgIFZFUklGWV9JU19BUFBST1goei5kZXJpdmF0aXZlcygpKDApLmRlcml2YXRpdmVzKCksIFZlY3RvcjJkKDAsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHouZGVyaXZhdGl2ZXMoKSgxKS5kZXJpdmF0aXZlcygpLCBWZWN0b3IyZCgxLDApKTsKK30KKworZG91YmxlIGJ1Z18xMjIyKCkgeworICB0eXBlZGVmIEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxFaWdlbjo6VmVjdG9yM2Q+IEFEOworICBjb25zdCBkb3VibGUgX2N2MV8zID0gMS4wOworICBjb25zdCBBRCBjaGlfMyA9IDEuMDsKKyAgLy8gdGhpcyBsaW5lIGRpZCBub3Qgd29yaywgYmVjYXVzZSBvcGVyYXRvcisgcmV0dXJucyBBRFM8RGVyVHlwZSY+LCB3aGljaCB0aGVuIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQURTPERlclR5cGU+CisgIGNvbnN0IEFEIGRlbm9tID0gY2hpXzMgKyBfY3YxXzM7CisgIHJldHVybiBkZW5vbS52YWx1ZSgpOworfQorCitkb3VibGUgYnVnXzEyMjMoKSB7CisgIHVzaW5nIHN0ZDo6bWluOworICB0eXBlZGVmIEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxFaWdlbjo6VmVjdG9yM2Q+IEFEOworCisgIGNvbnN0IGRvdWJsZSBfY3YxXzMgPSAxLjA7CisgIGNvbnN0IEFEIGNoaV8zID0gMS4wOworICBjb25zdCBBRCBkZW5vbSA9IDEuMDsKKworICAvLyBmYWlsZWQgYmVjYXVzZSBpbXBsZW1lbnRhdGlvbiBvZiBtaW4gYXR0ZW1wdHMgdG8gY29uc3RydWN0IEFEUzxEZXJUeXBlJj4gdmlhIGNvbnN0cnVjdG9yIEF1dG9EaWZmU2NhbGFyKGNvbnN0IFJlYWwmIHZhbHVlKQorICAvLyB3aXRob3V0IGluaXRpYWxpemluZyBtX2Rlcml2YXRpdmVzICh3aGljaCBpcyBhIHJlZmVyZW5jZSBpbiB0aGlzIGNhc2UpCisgICNkZWZpbmUgRUlHRU5fVEVTVF9TUEFDRQorICBjb25zdCBBRCB0ID0gbWluIEVJR0VOX1RFU1RfU1BBQ0UgKGRlbm9tIC8gY2hpXzMsIDEuMCk7CisKKyAgY29uc3QgQUQgdDIgPSBtaW4gRUlHRU5fVEVTVF9TUEFDRSAoZGVub20gLyAoY2hpXzMgKiBfY3YxXzMpLCAxLjApOworCisgIHJldHVybiB0LnZhbHVlKCkgKyB0Mi52YWx1ZSgpOworfQorCisvLyByZWdyZXNzaW9uIHRlc3QgZm9yIHNvbWUgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggc3BlY2lhbGl6YXRpb25zIG9mIFNjYWxhckJpbmFyeU9wVHJhaXRzCit2b2lkIGJ1Z18xMjYwKCkgeworICBNYXRyaXg0ZCBBOworICBWZWN0b3I0ZCB2OworICBBKnY7Cit9CisKKy8vIGNoZWNrIGEgY29tcGlsYXRpb24gaXNzdWUgd2l0aCBudW1leHQ6Om1heAorZG91YmxlIGJ1Z18xMjYxKCkgeworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPE1hdHJpeDJkPiBBRDsKKyAgdHlwZWRlZiBNYXRyaXg8QUQsMiwxPiBWZWN0b3JBRDsKKworICBWZWN0b3JBRCB2OworICBjb25zdCBBRCBtYXhWYWwgPSB2Lm1heENvZWZmKCk7CisgIGNvbnN0IEFEIG1pblZhbCA9IHYubWluQ29lZmYoKTsKKyAgcmV0dXJuIG1heFZhbC52YWx1ZSgpICsgbWluVmFsLnZhbHVlKCk7Cit9CisKK2RvdWJsZSBidWdfMTI2NCgpIHsKKyAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxWZWN0b3IyZD4gQUQ7CisgIGNvbnN0IEFEIHM7CisgIGNvbnN0IE1hdHJpeDxBRCwgMywgMT4gdjE7CisgIGNvbnN0IE1hdHJpeDxBRCwgMywgMT4gdjIgPSAocyArIDMuMCkgKiB2MTsKKyAgcmV0dXJuIHYyKDApLnZhbHVlKCk7Cit9CisKK3ZvaWQgdGVzdF9hdXRvZGlmZigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHRlc3RfYXV0b2RpZmZfc2NhbGFyPDE+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggdGVzdF9hdXRvZGlmZl92ZWN0b3I8MT4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCB0ZXN0X2F1dG9kaWZmX2phY29iaWFuPDE+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggdGVzdF9hdXRvZGlmZl9oZXNzaWFuPDE+KCkgKTsKKyAgfQorCisgIGJ1Z18xMjIyKCk7CisgIGJ1Z18xMjIzKCk7CisgIGJ1Z18xMjYwKCk7CisgIGJ1Z18xMjYxKCk7Cit9CisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmZfc2NhbGFyLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmZfc2NhbGFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2YxMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9hdXRvZGlmZl9zY2FsYXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdG9waCBIZXJ0emJlcmcgPGNodHpAaW5mb3JtYXRpay51bmktYnJlbWVuLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9BdXRvRGlmZj4KKworLyoKKyAqIEluIHRoaXMgZmlsZSBzY2FsYXIgZGVyaXZhdGlvbnMgYXJlIHRlc3RlZCBmb3IgY29ycmVjdG5lc3MuCisgKiBUT0RPIGFkZCBtb3JlIHRlc3RzIQorICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBjaGVja19hdGFuMigpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgMT4gRGVyaXYxOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlcml2MT4gQUQ7CisgIAorICBBRCB4KGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMy4wLCAzLjApLCBEZXJpdjE6OlVuaXRYKCkpOworICAKKyAgdXNpbmcgc3RkOjpleHA7CisgIFNjYWxhciByID0gZXhwKGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAsIDEwKSk7CisgIAorICBBRCBzID0gc2luKHgpLCBjID0gY29zKHgpOworICBBRCByZXMgPSBhdGFuMihyKnMsIHIqYyk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKHJlcy52YWx1ZSgpLCB4LnZhbHVlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcy5kZXJpdmF0aXZlcygpLCB4LmRlcml2YXRpdmVzKCkpOworCisgIHJlcyA9IGF0YW4yKHIqcyswLCByKmMrMCk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLnZhbHVlKCksIHgudmFsdWUoKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLmRlcml2YXRpdmVzKCksIHguZGVyaXZhdGl2ZXMoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBjaGVja19oeXBlcmJvbGljX2Z1bmN0aW9ucygpCit7CisgIHVzaW5nIHN0ZDo6c2luaDsKKyAgdXNpbmcgc3RkOjpjb3NoOworICB1c2luZyBzdGQ6OnRhbmg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgMT4gRGVyaXYxOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlcml2MT4gQUQ7CisgIERlcml2MSBwID0gRGVyaXYxOjpSYW5kb20oKTsKKyAgQUQgdmFsKHAueCgpLERlcml2MTo6VW5pdFgoKSk7CisKKyAgU2NhbGFyIGNvc2hfcHggPSBzdGQ6OmNvc2gocC54KCkpOworICBBRCByZXMxID0gdGFuaCh2YWwpOworICBWRVJJRllfSVNfQVBQUk9YKHJlczEudmFsdWUoKSwgc3RkOjp0YW5oKHAueCgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzMS5kZXJpdmF0aXZlcygpLngoKSwgU2NhbGFyKDEuMCkgLyAoY29zaF9weCAqIGNvc2hfcHgpKTsKKworICBBRCByZXMyID0gc2luaCh2YWwpOworICBWRVJJRllfSVNfQVBQUk9YKHJlczIudmFsdWUoKSwgc3RkOjpzaW5oKHAueCgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzMi5kZXJpdmF0aXZlcygpLngoKSwgY29zaF9weCk7CisKKyAgQUQgcmVzMyA9IGNvc2godmFsKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMzLnZhbHVlKCksIGNvc2hfcHgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlczMuZGVyaXZhdGl2ZXMoKS54KCksIHN0ZDo6c2luaChwLngoKSkpOworCisgIC8vIENoZWNrIGNvbnN0YW50IHZhbHVlcy4KKyAgY29uc3QgU2NhbGFyIHNhbXBsZV9wb2ludCA9IFNjYWxhcigxKSAvIFNjYWxhcigzKTsgCisgIHZhbCA9IEFEKHNhbXBsZV9wb2ludCxEZXJpdjE6OlVuaXRYKCkpOworICByZXMxID0gdGFuaCh2YWwpOworICBWRVJJRllfSVNfQVBQUk9YKHJlczEuZGVyaXZhdGl2ZXMoKS54KCksIFNjYWxhcigwLjg5NjYyOTU1OTYwNDkxNCkpOworCisgIHJlczIgPSBzaW5oKHZhbCk7CisgIFZFUklGWV9JU19BUFBST1gocmVzMi5kZXJpdmF0aXZlcygpLngoKSwgU2NhbGFyKDEuMDU2MDcxODY3ODI5OTM5KSk7CisKKyAgcmVzMyA9IGNvc2godmFsKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMzLmRlcml2YXRpdmVzKCkueCgpLCBTY2FsYXIoMC4zMzk1NDA1NTcyNTYxNTApKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2hlY2tfbGltaXRzX3NwZWNpYWxpemF0aW9uKCkKK3sKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgMSwgMT4gRGVyaXY7CisgIHR5cGVkZWYgRWlnZW46OkF1dG9EaWZmU2NhbGFyPERlcml2PiBBRDsKKworICB0eXBlZGVmIHN0ZDo6bnVtZXJpY19saW1pdHM8QUQ+IEE7CisgIHR5cGVkZWYgc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+IEI7CisKKyNpZiBFSUdFTl9IQVNfQ1hYMTEKKyAgVkVSSUZZKGJvb2woc3RkOjppc19iYXNlX29mPEIsIEE+Ojp2YWx1ZSkpOworI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9hdXRvZGlmZl9zY2FsYXIoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBjaGVja19hdGFuMjxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjaGVja19hdGFuMjxkb3VibGU+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY2hlY2tfaHlwZXJib2xpY19mdW5jdGlvbnM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggY2hlY2tfaHlwZXJib2xpY19mdW5jdGlvbnM8ZG91YmxlPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNoZWNrX2xpbWl0c19zcGVjaWFsaXphdGlvbjxkb3VibGU+KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX2V2ZW50Y291bnQuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV9ldmVudGNvdW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU5OGJmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV9ldmVudGNvdW50LmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgRG1pdHJ5IFZ5dWtvdiA8ZHZ5dWtvdkBnb29nbGUuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGhyZWFkUG9vbD4KKworLy8gVmlzdWFsIHN0dWRpbyBkb2Vzbid0IGltcGxlbWVudCBhIHJhbmRfcigpIGZ1bmN0aW9uIHNpbmNlIGl0cworLy8gaW1wbGVtZW50YXRpb24gb2YgcmFuZCgpIGlzIGFscmVhZHkgdGhyZWFkIHNhZmUKK2ludCByYW5kX3JlZW50cmFudCh1bnNpZ25lZCBpbnQqIHMpIHsKKyNpZmRlZiBFSUdFTl9DT01QX01TVkNfU1RSSUNUCisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzKTsKKyAgcmV0dXJuIHJhbmQoKTsKKyNlbHNlCisgIHJldHVybiByYW5kX3Iocyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdGVzdF9iYXNpY19ldmVudGNvdW50KCkKK3sKKyAgTWF4U2l6ZVZlY3RvcjxFdmVudENvdW50OjpXYWl0ZXI+IHdhaXRlcnMoMSk7CisgIHdhaXRlcnMucmVzaXplKDEpOworICBFdmVudENvdW50IGVjKHdhaXRlcnMpOworICBFdmVudENvdW50OjpXYWl0ZXImIHcgPSB3YWl0ZXJzWzBdOworICBlYy5Ob3RpZnkoZmFsc2UpOworICBlYy5QcmV3YWl0KCZ3KTsKKyAgZWMuTm90aWZ5KHRydWUpOworICBlYy5Db21taXRXYWl0KCZ3KTsKKyAgZWMuUHJld2FpdCgmdyk7CisgIGVjLkNhbmNlbFdhaXQoJncpOworfQorCisvLyBGYWtlIGJvdW5kZWQgY291bnRlci1iYXNlZCBxdWV1ZS4KK3N0cnVjdCBUZXN0UXVldWUgeworICBzdGQ6OmF0b21pYzxpbnQ+IHZhbF87CisgIHN0YXRpYyBjb25zdCBpbnQga1F1ZXVlU2l6ZSA9IDEwOworCisgIFRlc3RRdWV1ZSgpIDogdmFsXygpIHt9CisKKyAgflRlc3RRdWV1ZSgpIHsgVkVSSUZZX0lTX0VRVUFMKHZhbF8ubG9hZCgpLCAwKTsgfQorCisgIGJvb2wgUHVzaCgpIHsKKyAgICBpbnQgdmFsID0gdmFsXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGZvciAoOzspIHsKKyAgICAgIFZFUklGWV9HRSh2YWwsIDApOworICAgICAgVkVSSUZZX0xFKHZhbCwga1F1ZXVlU2l6ZSk7CisgICAgICBpZiAodmFsID09IGtRdWV1ZVNpemUpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh2YWxfLmNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2YWwsIHZhbCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBib29sIFBvcCgpIHsKKyAgICBpbnQgdmFsID0gdmFsXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGZvciAoOzspIHsKKyAgICAgIFZFUklGWV9HRSh2YWwsIDApOworICAgICAgVkVSSUZZX0xFKHZhbCwga1F1ZXVlU2l6ZSk7CisgICAgICBpZiAodmFsID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh2YWxfLmNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayh2YWwsIHZhbCAtIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBib29sIEVtcHR5KCkgeyByZXR1cm4gdmFsXy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpID09IDA7IH0KK307CisKK2NvbnN0IGludCBUZXN0UXVldWU6OmtRdWV1ZVNpemU7CisKKy8vIEEgbnVtYmVyIG9mIHByb2R1Y2VycyBzZW5kIG1lc3NhZ2VzIHRvIGEgc2V0IG9mIGNvbnN1bWVycyB1c2luZyBhIHNldCBvZgorLy8gZmFrZSBxdWV1ZXMuIEVuc3VyZSB0aGF0IGl0IGRvZXMgbm90IGNyYXNoLCBjb25zdW1lcnMgZG9uJ3QgZGVhZGxvY2sgYW5kCisvLyBudW1iZXIgb2YgYmxvY2tlZCBhbmQgdW5ibG9ja2VkIHRocmVhZHMgbWF0Y2guCitzdGF0aWMgdm9pZCB0ZXN0X3N0cmVzc19ldmVudGNvdW50KCkKK3sKKyAgY29uc3QgaW50IGtUaHJlYWRzID0gc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0V2ZW50cyA9IDEgPDwgMTY7CisgIHN0YXRpYyBjb25zdCBpbnQga1F1ZXVlcyA9IDEwOworCisgIE1heFNpemVWZWN0b3I8RXZlbnRDb3VudDo6V2FpdGVyPiB3YWl0ZXJzKGtUaHJlYWRzKTsKKyAgd2FpdGVycy5yZXNpemUoa1RocmVhZHMpOworICBFdmVudENvdW50IGVjKHdhaXRlcnMpOworICBUZXN0UXVldWUgcXVldWVzW2tRdWV1ZXNdOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4+IHByb2R1Y2VyczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkczsgaSsrKSB7CisgICAgcHJvZHVjZXJzLmVtcGxhY2VfYmFjayhuZXcgc3RkOjp0aHJlYWQoWyZlYywgJnF1ZXVlc10oKSB7CisgICAgICB1bnNpZ25lZCBpbnQgcm5kID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihzdGQ6Omhhc2g8c3RkOjp0aHJlYWQ6OmlkPigpKHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpKSk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtFdmVudHM7IGorKykgeworICAgICAgICB1bnNpZ25lZCBpZHggPSByYW5kX3JlZW50cmFudCgmcm5kKSAlIGtRdWV1ZXM7CisgICAgICAgIGlmIChxdWV1ZXNbaWR4XS5QdXNoKCkpIHsKKyAgICAgICAgICBlYy5Ob3RpZnkoZmFsc2UpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEVJR0VOX1RIUkVBRF9ZSUVMRCgpOworICAgICAgICBqLS07CisgICAgICB9CisgICAgfSkpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPj4gY29uc3VtZXJzOworICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRzOyBpKyspIHsKKyAgICBjb25zdW1lcnMuZW1wbGFjZV9iYWNrKG5ldyBzdGQ6OnRocmVhZChbJmVjLCAmcXVldWVzLCAmd2FpdGVycywgaV0oKSB7CisgICAgICBFdmVudENvdW50OjpXYWl0ZXImIHcgPSB3YWl0ZXJzW2ldOworICAgICAgdW5zaWduZWQgaW50IHJuZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc3RkOjpoYXNoPHN0ZDo6dGhyZWFkOjppZD4oKShzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSkpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrRXZlbnRzOyBqKyspIHsKKyAgICAgICAgdW5zaWduZWQgaWR4ID0gcmFuZF9yZWVudHJhbnQoJnJuZCkgJSBrUXVldWVzOworICAgICAgICBpZiAocXVldWVzW2lkeF0uUG9wKCkpIGNvbnRpbnVlOworICAgICAgICBqLS07CisgICAgICAgIGVjLlByZXdhaXQoJncpOworICAgICAgICBib29sIGVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgcSA9IDA7IHEgPCBrUXVldWVzOyBxKyspIHsKKyAgICAgICAgICBpZiAoIXF1ZXVlc1txXS5FbXB0eSgpKSB7CisgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZW1wdHkpIHsKKyAgICAgICAgICBlYy5DYW5jZWxXYWl0KCZ3KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlYy5Db21taXRXYWl0KCZ3KTsKKyAgICAgIH0KKyAgICB9KSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRzOyBpKyspIHsKKyAgICBwcm9kdWNlcnNbaV0tPmpvaW4oKTsKKyAgICBjb25zdW1lcnNbaV0tPmpvaW4oKTsKKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfZXZlbnRjb3VudCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2Jhc2ljX2V2ZW50Y291bnQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3N0cmVzc19ldmVudGNvdW50KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV9tZXRhLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfbWV0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxMWM1OQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfbWV0YS5jcHAKQEAgLTAsMCArMSwzNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBTZWlsZXIgPGNocmlzdGlhbkBpd2FrZC5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9zcmMvdXRpbC9DWFgxMU1ldGEuaD4KKwordXNpbmcgRWlnZW46OmludGVybmFsOjppc19zYW1lOwordXNpbmcgRWlnZW46OmludGVybmFsOjp0eXBlX2xpc3Q7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6Om51bWVyaWNfbGlzdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6Omdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmNvbmNhdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6bWNvbmNhdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6dGFrZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2tpcDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2xpY2U7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmdldDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aWRfbnVtZXJpYzsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aWRfdHlwZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aXNfc2FtZV9nZjsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXBwbHlfb3BfZnJvbV9sZWZ0OwordXNpbmcgRWlnZW46OmludGVybmFsOjphcHBseV9vcF9mcm9tX3JpZ2h0OwordXNpbmcgRWlnZW46OmludGVybmFsOjpjb250YWluZWRfaW5fbGlzdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Y29udGFpbmVkX2luX2xpc3RfZ2Y7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFyZ19wcm9kOwordXNpbmcgRWlnZW46OmludGVybmFsOjphcmdfc3VtOwordXNpbmcgRWlnZW46OmludGVybmFsOjpzdW1fb3A7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OnByb2R1Y3Rfb3A7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3JldmVyc2U7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3N1bTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfcHJvZDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfcmVkdWNlOwordXNpbmcgRWlnZW46OmludGVybmFsOjphcnJheV96aXA7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3ppcF9hbmRfcmVkdWNlOwordXNpbmcgRWlnZW46OmludGVybmFsOjphcnJheV9hcHBseTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfYXBwbHlfYW5kX3JlZHVjZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6cmVwZWF0OwordXNpbmcgRWlnZW46OmludGVybmFsOjppbnN0YW50aWF0ZV9ieV9jX2FycmF5OworCitzdHJ1Y3QgZHVtbXlfYSB7fTsKK3N0cnVjdCBkdW1teV9iIHt9Oworc3RydWN0IGR1bW15X2Mge307CitzdHJ1Y3QgZHVtbXlfZCB7fTsKK3N0cnVjdCBkdW1teV9lIHt9OworCisvLyBkdW1teSBvcGVyYXRpb24gZm9yIHRlc3RpbmcgYXBwbHkKK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IHN0cnVjdCBkdW1teV9vcDsKK3RlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2EsIGR1bW15X2I+IHsgdHlwZWRlZiBkdW1teV9jIHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9iLCBkdW1teV9hPiB7IHR5cGVkZWYgZHVtbXlfZCB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYiwgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2EgdHlwZTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2MsIGR1bW15X2I+IHsgdHlwZWRlZiBkdW1teV9kIHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9jLCBkdW1teV9hPiB7IHR5cGVkZWYgZHVtbXlfYiB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYSwgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2QgdHlwZTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2EsIGR1bW15X2E+IHsgdHlwZWRlZiBkdW1teV9lIHR5cGU7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9iLCBkdW1teV9iPiB7IHR5cGVkZWYgZHVtbXlfZSB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYywgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2UgdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gc3RydWN0IGR1bW15X3Rlc3QgeyBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSBmYWxzZTsgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gMDsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGR1bW15X3Rlc3Q8ZHVtbXlfYSwgZHVtbXlfYT4gICAgIHsgY29uc3RleHByIHN0YXRpYyBib29sIHZhbHVlID0gdHJ1ZTsgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IDE7IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV90ZXN0PGR1bW15X2IsIGR1bW15X2I+ICAgICB7IGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7ICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAyOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfdGVzdDxkdW1teV9jLCBkdW1teV9jPiAgICAgeyBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gNDsgfTsKKworc3RydWN0IHRpbWVzMl9vcCB7IHRlbXBsYXRlPHR5cGVuYW1lIEE+IHN0YXRpYyBBIHJ1bihBIHYpIHsgcmV0dXJuIHYgKiAyOyB9IH07CisKK3N0cnVjdCBkdW1teV9pbnN0Cit7CisgIGludCBjOworCisgIGR1bW15X2luc3QoKSA6IGMoMCkge30KKyAgZXhwbGljaXQgZHVtbXlfaW5zdChpbnQpIDogYygxKSB7fQorICBkdW1teV9pbnN0KGludCwgaW50KSA6IGMoMikge30KKyAgZHVtbXlfaW5zdChpbnQsIGludCwgaW50KSA6IGMoMykge30KKyAgZHVtbXlfaW5zdChpbnQsIGludCwgaW50LCBpbnQpIDogYyg0KSB7fQorICBkdW1teV9pbnN0KGludCwgaW50LCBpbnQsIGludCwgaW50KSA6IGMoNSkge30KK307CisKK3N0YXRpYyB2b2lkIHRlc3RfZ2VuX251bWVyaWNfbGlzdCgpCit7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgMD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAxPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgNT46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAxMD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk+Pjo6dmFsdWUpKTsKKworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDAsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDEsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDI+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAyLCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyLCA0Mz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NCwgNDUsIDQ2Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgMTAsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTE+Pjo6dmFsdWUpKTsKKworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMT46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDA+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCAyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMSwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDU+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0LCAzLCAyLCAxLCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMTA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwPj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCAwLCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCAxLCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMiwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0MywgNDI+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCA1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQ2LCA0NSwgNDQsIDQzLCA0Mj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDEwLCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIDQyPj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMCwgMiwgMz46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMSwgMiwgMz46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDA+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMiwgMiwgMz46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDE+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgNSwgMiwgMz46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDMsIDIsIDQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMTAsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAzLCAyLCA0LCA1LCA2LCA3LCA4LCA5Pj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMCwgNDQsIDQ1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMSwgNDQsIDQ1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDIsIDQ0LCA0NSwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0MiwgNDM+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgNSwgNDQsIDQ1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyLCA0MywgNDUsIDQ0LCA0Nj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCAxMCwgNDQsIDQ1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyLCA0MywgNDUsIDQ0LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxPj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8aW50LCAwLCAwPjo6dHlwZSwgbnVtZXJpY19saXN0PGludD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxpbnQsIDEsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPGludCwgMiwgMD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8aW50LCA1LCAwPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMCwgMCwgMCwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxpbnQsIDEwLCAwPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMD4+Ojp2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdCgpCit7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2E+LCB0eXBlX2xpc3Q8Pj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PD4sIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2E+LCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2M+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDx0eXBlX2xpc3Q8ZHVtbXlfYT4sIHR5cGVfbGlzdDxkdW1teV9iLCBkdW1teV9jPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAwPiwgbnVtZXJpY19saXN0PGludD4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8bnVtZXJpY19saXN0PGludD4sIG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAwLCAwPj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDAsIDAsIDA+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAwPiwgbnVtZXJpY19saXN0PGludCwgMSwgMj4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwLCAxLCAyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8bnVtZXJpY19saXN0PGludCwgMD4sIG51bWVyaWNfbGlzdDxpbnQsIDEsIDI+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOworCisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2I+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2I+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8dHlwZV9saXN0PGR1bW15X2E+LCB0eXBlX2xpc3Q8ZHVtbXlfYj4sIHR5cGVfbGlzdDxkdW1teV9jPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2M+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2I+LCB0eXBlX2xpc3Q8ZHVtbXlfYz4+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4+Ojp2YWx1ZSkpOworCisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDA+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgbWNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwPiwgbnVtZXJpY19saXN0PGludCwgMT4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAxPiwgbnVtZXJpY19saXN0PGludCwgMj4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAxLCAyPj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDI+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8bnVtZXJpY19saXN0PGludCwgMCwgMT4sIG51bWVyaWNfbGlzdDxpbnQsIDI+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NsaWNlKCkKK3sKKyAgdHlwZWRlZiB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYiwgZHVtbXlfYywgZHVtbXlfYz4gdGw7CisgIHR5cGVkZWYgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMiwgMywgNCwgNT4gaWw7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8MCwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSB0YWtlPDEsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2E+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8MiwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgdGFrZTwzLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hLCBkdW1teV9iPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSB0YWtlPDQsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2I+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8NSwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYiwgZHVtbXlfYz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgdGFrZTw2LCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hLCBkdW1teV9iLCBkdW1teV9iLCBkdW1teV9jLCBkdW1teV9jPj46OnZhbHVlKSk7CisKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8MCwgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSB0YWtlPDEsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgdGFrZTwyLCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDE+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8MywgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSB0YWtlPDQsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMiwgMz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgdGFrZTw1LCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQ+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8NiwgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAyLCAzLCA0LCA1Pj46OnZhbHVlKSk7CisgIAorICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDwwLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hLCBkdW1teV9iLCBkdW1teV9iLCBkdW1teV9jLCBkdW1teV9jPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBza2lwPDEsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2IsIGR1bW15X2MsIGR1bW15X2M+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNraXA8MiwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYiwgZHVtbXlfYiwgZHVtbXlfYywgZHVtbXlfYz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDwzLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9iLCBkdW1teV9jLCBkdW1teV9jPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBza2lwPDQsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2MsIGR1bW15X2M+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNraXA8NSwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDw2LCB0bD46OnR5cGUsIHR5cGVfbGlzdDw+Pjo6dmFsdWUpKTsKKworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDwwLCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQsIDU+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNraXA8MSwgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAxLCAyLCAzLCA0LCA1Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBza2lwPDIsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMiwgMywgNCwgNT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDwzLCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDMsIDQsIDU+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNraXA8NCwgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0LCA1Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBza2lwPDUsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDw2LCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKKworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2xpY2U8MCwgMywgdGw+Ojp0eXBlLCB0eXBlbmFtZSB0YWtlPDMsIHRsPjo6dHlwZT46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBzbGljZTwwLCAzLCBpbD46OnR5cGUsIHR5cGVuYW1lIHRha2U8MywgaWw+Ojp0eXBlPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNsaWNlPDEsIDMsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2I+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNsaWNlPDEsIDMsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMSwgMiwgMz4+Ojp2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2dldCgpCit7CisgIHR5cGVkZWYgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2IsIGR1bW15X2MsIGR1bW15X2M+IHRsOworICB0eXBlZGVmIG51bWVyaWNfbGlzdDxpbnQsIDQsIDgsIDE1LCAxNiwgMjMsIDQyPiBpbDsKKworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2V0PDAsIHRsPjo6dHlwZSwgZHVtbXlfYT46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZXQ8MSwgdGw+Ojp0eXBlLCBkdW1teV9hPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdldDwyLCB0bD46OnR5cGUsIGR1bW15X2I+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2V0PDMsIHRsPjo6dHlwZSwgZHVtbXlfYj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZXQ8NCwgdGw+Ojp0eXBlLCBkdW1teV9jPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdldDw1LCB0bD46OnR5cGUsIGR1bW15X2M+Ojp2YWx1ZSkpOworCisgIFZFUklGWV9JU19FUVVBTCgoKGludClnZXQ8MCwgaWw+Ojp2YWx1ZSksIDQpOworICBWRVJJRllfSVNfRVFVQUwoKChpbnQpZ2V0PDEsIGlsPjo6dmFsdWUpLCA4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCgoaW50KWdldDwyLCBpbD46OnZhbHVlKSwgMTUpOworICBWRVJJRllfSVNfRVFVQUwoKChpbnQpZ2V0PDMsIGlsPjo6dmFsdWUpLCAxNik7CisgIFZFUklGWV9JU19FUVVBTCgoKGludClnZXQ8NCwgaWw+Ojp2YWx1ZSksIDIzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCgoaW50KWdldDw1LCBpbD46OnZhbHVlKSwgNDIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2lkX2hlbHBlcihkdW1teV9hIGEsIGR1bW15X2EgYiwgZHVtbXlfYSBjKQoreworICAodm9pZClhOworICAodm9pZCliOworICAodm9pZCljOworfQorCit0ZW1wbGF0ZTxpbnQuLi4gaWk+CitzdGF0aWMgdm9pZCB0ZXN0X2lkX251bWVyaWMoKQoreworICB0ZXN0X2lkX2hlbHBlcih0eXBlbmFtZSBpZF9udW1lcmljPGludCwgaWksIGR1bW15X2E+Ojp0eXBlKCkuLi4pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiB0dD4KK3N0YXRpYyB2b2lkIHRlc3RfaWRfdHlwZSgpCit7CisgIHRlc3RfaWRfaGVscGVyKHR5cGVuYW1lIGlkX3R5cGU8dHQsIGR1bW15X2E+Ojp0eXBlKCkuLi4pOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2lkKCkKK3sKKyAgLy8gZG9uJ3QgY2FsbCBWRVJJRlkgaGVyZSwganVzdCBhc3N1bWUgaXQgd29ya3MgaWYgaXQgY29tcGlsZXMKKyAgLy8gKG90aGVyd2lzZSBpdCB3aWxsIGNvbXBsYWluIHRoYXQgaXQgY2FuJ3QgZmluZCB0aGUgZnVuY3Rpb24pCisgIHRlc3RfaWRfbnVtZXJpYzwxLCA0LCA2PigpOworICB0ZXN0X2lkX3R5cGU8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4oKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9pc19zYW1lX2dmKCkKK3sKKyAgVkVSSUZZKCghaXNfc2FtZV9nZjxkdW1teV9hLCBkdW1teV9iPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghIWlzX3NhbWVfZ2Y8ZHVtbXlfYSwgZHVtbXlfYT46OnZhbHVlKSk7CisgIFZFUklGWV9JU19FUVVBTCgoISFpc19zYW1lX2dmPGR1bW15X2EsIGR1bW15X2I+OjpnbG9iYWxfZmxhZ3MpLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTCgoISFpc19zYW1lX2dmPGR1bW15X2EsIGR1bW15X2E+OjpnbG9iYWxfZmxhZ3MpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXBwbHlfb3AoKQoreworICB0eXBlZGVmIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPiB0bDsKKyAgVkVSSUZZKCghIWlzX3NhbWU8dHlwZW5hbWUgYXBwbHlfb3BfZnJvbV9sZWZ0PGR1bW15X29wLCBkdW1teV9hLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9lLCBkdW1teV9jLCBkdW1teV9kPj46OnZhbHVlKSk7CisgIFZFUklGWSgoISFpc19zYW1lPHR5cGVuYW1lIGFwcGx5X29wX2Zyb21fcmlnaHQ8ZHVtbXlfb3AsIGR1bW15X2EsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2UsIGR1bW15X2QsIGR1bW15X2I+Pjo6dmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jb250YWluZWRfaW5fbGlzdCgpCit7CisgIHR5cGVkZWYgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2M+IHRsOworCisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdDxpc19zYW1lLCBkdW1teV9hLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdDxpc19zYW1lLCBkdW1teV9iLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdDxpc19zYW1lLCBkdW1teV9jLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoIWNvbnRhaW5lZF9pbl9saXN0PGlzX3NhbWUsIGR1bW15X2QsIHRsPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghY29udGFpbmVkX2luX2xpc3Q8aXNfc2FtZSwgZHVtbXlfZSwgdGw+Ojp2YWx1ZSkpOworCisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9hLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9iLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoISFjb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9jLCB0bD46OnZhbHVlKSk7CisgIFZFUklGWSgoIWNvbnRhaW5lZF9pbl9saXN0X2dmPGR1bW15X3Rlc3QsIGR1bW15X2QsIHRsPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghY29udGFpbmVkX2luX2xpc3RfZ2Y8ZHVtbXlfdGVzdCwgZHVtbXlfZSwgdGw+Ojp2YWx1ZSkpOworCisgIFZFUklGWV9JU19FUVVBTCgoKGludCljb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9hLCB0bD46Omdsb2JhbF9mbGFncyksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKChpbnQpY29udGFpbmVkX2luX2xpc3RfZ2Y8ZHVtbXlfdGVzdCwgZHVtbXlfYiwgdGw+OjpnbG9iYWxfZmxhZ3MpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCgoaW50KWNvbnRhaW5lZF9pbl9saXN0X2dmPGR1bW15X3Rlc3QsIGR1bW15X2MsIHRsPjo6Z2xvYmFsX2ZsYWdzKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTCgoKGludCljb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9kLCB0bD46Omdsb2JhbF9mbGFncyksIDApOworICBWRVJJRllfSVNfRVFVQUwoKChpbnQpY29udGFpbmVkX2luX2xpc3RfZ2Y8ZHVtbXlfdGVzdCwgZHVtbXlfZSwgdGw+OjpnbG9iYWxfZmxhZ3MpLCAwKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9hcmdfcmVkdWN0aW9ucygpCit7CisgIFZFUklGWV9JU19FUVVBTChhcmdfc3VtKDEsMiwzLDQpLCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChhcmdfcHJvZCgxLDIsMyw0KSwgMjQpOworICBWRVJJRllfSVNfQVBQUk9YKGFyZ19zdW0oMC41LCAyLCA1KSwgNy41KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhcmdfcHJvZCgwLjUsIDIsIDUpLCA1LjApOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2FycmF5X3JldmVyc2VfYW5kX3JlZHVjZSgpCit7CisgIGFycmF5PGludCwgNj4gYXt7NCwgOCwgMTUsIDE2LCAyMywgNDJ9fTsKKyAgYXJyYXk8aW50LCA2PiBie3s0MiwgMjMsIDE2LCAxNSwgOCwgNH19OworCisgIC8vIHRoZXJlIGlzIG5vIG9wZXJhdG9yPDwgZm9yIHN0ZDo6YXJyYXksIHNvIFZFUklGWV9JU19FUVVBTCB3aWxsCisgIC8vIG5vdCBjb21waWxlCisgIFZFUklGWSgoYXJyYXlfcmV2ZXJzZShhKSA9PSBiKSk7CisgIFZFUklGWSgoYXJyYXlfcmV2ZXJzZShiKSA9PSBhKSk7CisgIFZFUklGWV9JU19FUVVBTCgoYXJyYXlfc3VtKGEpKSwgMTA4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChhcnJheV9zdW0oYikpLCAxMDgpOworICBWRVJJRllfSVNfRVFVQUwoKGFycmF5X3Byb2QoYSkpLCA3NDE4ODgwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChhcnJheV9wcm9kKGIpKSwgNzQxODg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXJyYXlfemlwX2FuZF9hcHBseSgpCit7CisgIGFycmF5PGludCwgNj4gYXt7NCwgOCwgMTUsIDE2LCAyMywgNDJ9fTsKKyAgYXJyYXk8aW50LCA2PiBie3swLCAxLCAyLCAzLCA0LCA1fX07CisgIGFycmF5PGludCwgNj4gY3t7NCwgOSwgMTcsIDE5LCAyNywgNDd9fTsKKyAgYXJyYXk8aW50LCA2PiBke3swLCA4LCAzMCwgNDgsIDkyLCAyMTB9fTsKKyAgYXJyYXk8aW50LCA2PiBle3swLCAyLCA0LCA2LCA4LCAxMH19OworCisgIFZFUklGWSgoYXJyYXlfemlwPHN1bV9vcD4oYSwgYikgPT0gYykpOworICBWRVJJRlkoKGFycmF5X3ppcDxwcm9kdWN0X29wPihhLCBiKSA9PSBkKSk7CisgIFZFUklGWSgoYXJyYXlfYXBwbHk8dGltZXMyX29wPihiKSA9PSBlKSk7CisgIFZFUklGWV9JU19FUVVBTCgoYXJyYXlfYXBwbHlfYW5kX3JlZHVjZTxzdW1fb3AsIHRpbWVzMl9vcD4oYSkpLCAyMTYpOworICBWRVJJRllfSVNfRVFVQUwoKGFycmF5X2FwcGx5X2FuZF9yZWR1Y2U8c3VtX29wLCB0aW1lczJfb3A+KGIpKSwgMzApOworICBWRVJJRllfSVNfRVFVQUwoKGFycmF5X3ppcF9hbmRfcmVkdWNlPHByb2R1Y3Rfb3AsIHN1bV9vcD4oYSwgYikpLCAxNDc1NTkzMik7CisgIFZFUklGWV9JU19FUVVBTCgoYXJyYXlfemlwX2FuZF9yZWR1Y2U8c3VtX29wLCBwcm9kdWN0X29wPihhLCBiKSksIDM4OCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXJyYXlfbWlzYygpCit7CisgIGFycmF5PGludCwgMz4gYTN7ezEsIDEsIDF9fTsKKyAgYXJyYXk8aW50LCA2PiBhNnt7MiwgMiwgMiwgMiwgMiwgMn19OworICBWRVJJRlkoKHJlcGVhdDwzLCBpbnQ+KDEpID09IGEzKSk7CisgIFZFUklGWSgocmVwZWF0PDYsIGludD4oMikgPT0gYTYpKTsKKworICBpbnQgZGF0YVs1XSA9IHsgMCwgMSwgMiwgMywgNCB9OworICBWRVJJRllfSVNfRVFVQUwoKGluc3RhbnRpYXRlX2J5X2NfYXJyYXk8ZHVtbXlfaW5zdCwgaW50LCAwPihkYXRhKS5jKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoaW5zdGFudGlhdGVfYnlfY19hcnJheTxkdW1teV9pbnN0LCBpbnQsIDE+KGRhdGEpLmMpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnN0YW50aWF0ZV9ieV9jX2FycmF5PGR1bW15X2luc3QsIGludCwgMj4oZGF0YSkuYyksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKGluc3RhbnRpYXRlX2J5X2NfYXJyYXk8ZHVtbXlfaW5zdCwgaW50LCAzPihkYXRhKS5jKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgoaW5zdGFudGlhdGVfYnlfY19hcnJheTxkdW1teV9pbnN0LCBpbnQsIDQ+KGRhdGEpLmMpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnN0YW50aWF0ZV9ieV9jX2FycmF5PGR1bW15X2luc3QsIGludCwgNT4oZGF0YSkuYyksIDUpOworfQorCit2b2lkIHRlc3RfY3h4MTFfbWV0YSgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2dlbl9udW1lcmljX2xpc3QoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbmNhdCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2xpY2UoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2dldCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfaWQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2lzX3NhbWVfZ2YoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2FwcGx5X29wKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jb250YWluZWRfaW5fbGlzdCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnX3JlZHVjdGlvbnMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2FycmF5X3JldmVyc2VfYW5kX3JlZHVjZSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJyYXlfemlwX2FuZF9hcHBseSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJyYXlfbWlzYygpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfbm9uX2Jsb2NraW5nX3RocmVhZF9wb29sLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfbm9uX2Jsb2NraW5nX3RocmVhZF9wb29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjliYjkzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV9ub25fYmxvY2tpbmdfdGhyZWFkX3Bvb2wuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBEbWl0cnkgVnl1a292IDxkdnl1a292QGdvb2dsZS5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9VU0VfVEhSRUFEUworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJFaWdlbi9DWFgxMS9UaHJlYWRQb29sIgorCitzdGF0aWMgdm9pZCB0ZXN0X2NyZWF0ZV9kZXN0cm95X2VtcHR5X3Bvb2woKQoreworICAvLyBKdXN0IGNyZWF0ZSBhbmQgZGVzdHJveSB0aGUgcG9vbC4gVGhpcyB3aWxsIHdpbmQgdXAgYW5kIHRlYXIgZG93biB3b3JrZXIKKyAgLy8gdGhyZWFkcy4gRW5zdXJlIHRoZXJlIGFyZSBubyBpc3N1ZXMgaW4gdGhhdCBsb2dpYy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgTm9uQmxvY2tpbmdUaHJlYWRQb29sIHRwKGkpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9wYXJhbGxlbGlzbSgpCit7CisgIC8vIFRlc3Qgd2UgbmV2ZXItZXZlciBmYWlsIHRvIG1hdGNoIGF2YWlsYWJsZSB0YXNrcyB3aXRoIGlkbGUgdGhyZWFkcy4KKyAgY29uc3QgaW50IGtUaHJlYWRzID0gMTY7ICAvLyBjb2RlIGJlbG93IGV4cGVjdHMgdGhhdCB0aGlzIGlzIGEgbXVsdGlwbGUgb2YgNAorICBOb25CbG9ja2luZ1RocmVhZFBvb2wgdHAoa1RocmVhZHMpOworICBWRVJJRllfSVNfRVFVQUwodHAuTnVtVGhyZWFkcygpLCBrVGhyZWFkcyk7CisgIFZFUklGWV9JU19FUVVBTCh0cC5DdXJyZW50VGhyZWFkSWQoKSwgLTEpOworICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwMDsgKytpdGVyKSB7CisgICAgc3RkOjphdG9taWM8aW50PiBydW5uaW5nKDApOworICAgIHN0ZDo6YXRvbWljPGludD4gZG9uZSgwKTsKKyAgICBzdGQ6OmF0b21pYzxpbnQ+IHBoYXNlKDApOworICAgIC8vIFNjaGVkdWxlIGtUaHJlYWRzIHRhc2tzIGFuZCBlbnN1cmUgdGhhdCB0aGV5IGFsbCBhcmUgcnVubmluZy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtUaHJlYWRzOyArK2kpIHsKKyAgICAgIHRwLlNjaGVkdWxlKFsmXSgpIHsKKyAgICAgICAgY29uc3QgaW50IHRocmVhZF9pZCA9IHRwLkN1cnJlbnRUaHJlYWRJZCgpOworICAgICAgICBWRVJJRllfR0UodGhyZWFkX2lkLCAwKTsKKyAgICAgICAgVkVSSUZZX0xFKHRocmVhZF9pZCwga1RocmVhZHMgLSAxKTsKKyAgICAgICAgcnVubmluZysrOworICAgICAgICB3aGlsZSAocGhhc2UgPCAxKSB7CisgICAgICAgIH0KKyAgICAgICAgZG9uZSsrOworICAgICAgfSk7CisgICAgfQorICAgIHdoaWxlIChydW5uaW5nICE9IGtUaHJlYWRzKSB7CisgICAgfQorICAgIHJ1bm5pbmcgPSAwOworICAgIHBoYXNlID0gMTsKKyAgICAvLyBOb3csIHdoaWxlIHRoZSBwcmV2aW91cyB0YXNrcyBleGl0LCBzY2hlZHVsZSBhbm90aGVyIGtUaHJlYWRzIHRhc2tzIGFuZAorICAgIC8vIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHJ1bm5pbmcuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkczsgKytpKSB7CisgICAgICB0cC5TY2hlZHVsZShbJiwgaV0oKSB7CisgICAgICAgIHJ1bm5pbmcrKzsKKyAgICAgICAgd2hpbGUgKHBoYXNlIDwgMikgeworICAgICAgICB9CisgICAgICAgIC8vIFdoZW4gYWxsIHRhc2tzIGFyZSBydW5uaW5nLCBoYWxmIG9mIHRhc2tzIGV4aXQsIHF1YXJ0ZXIgb2YgdGFza3MKKyAgICAgICAgLy8gY29udGludWUgcnVubmluZyBhbmQgcXVhcnRlciBvZiB0YXNrcyBzY2hlZHVsZSBhbm90aGVyIDIgdGFza3MgZWFjaC4KKyAgICAgICAgLy8gQ29uY3VycmVudGx5IG1haW4gdGhyZWFkIHNjaGVkdWxlcyBhbm90aGVyIHF1YXJ0ZXIgb2YgdGFza3MuCisgICAgICAgIC8vIFRoaXMgZ2l2ZXMgdXMgYW5vdGhlciBrVGhyZWFkcyB0YXNrcyBhbmQgd2UgZW5zdXJlIHRoYXQgdGhleSBhbGwKKyAgICAgICAgLy8gYXJlIHJ1bm5pbmcuCisgICAgICAgIGlmIChpIDwga1RocmVhZHMgLyAyKSB7CisgICAgICAgIH0gZWxzZSBpZiAoaSA8IDMgKiBrVGhyZWFkcyAvIDQpIHsKKyAgICAgICAgICBydW5uaW5nKys7CisgICAgICAgICAgd2hpbGUgKHBoYXNlIDwgMykgeworICAgICAgICAgIH0KKyAgICAgICAgICBkb25lKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgICAgICAgIHRwLlNjaGVkdWxlKFsmXSgpIHsKKyAgICAgICAgICAgICAgcnVubmluZysrOworICAgICAgICAgICAgICB3aGlsZSAocGhhc2UgPCAzKSB7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZG9uZSsrOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRvbmUrKzsKKyAgICAgIH0pOworICAgIH0KKyAgICB3aGlsZSAocnVubmluZyAhPSBrVGhyZWFkcykgeworICAgIH0KKyAgICBydW5uaW5nID0gMDsKKyAgICBwaGFzZSA9IDI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVGhyZWFkcyAvIDQ7ICsraSkgeworICAgICAgdHAuU2NoZWR1bGUoWyZdKCkgeworICAgICAgICBydW5uaW5nKys7CisgICAgICAgIHdoaWxlIChwaGFzZSA8IDMpIHsKKyAgICAgICAgfQorICAgICAgICBkb25lKys7CisgICAgICB9KTsKKyAgICB9CisgICAgd2hpbGUgKHJ1bm5pbmcgIT0ga1RocmVhZHMpIHsKKyAgICB9CisgICAgcGhhc2UgPSAzOworICAgIHdoaWxlIChkb25lICE9IDMgKiBrVGhyZWFkcykgeworICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfbm9uX2Jsb2NraW5nX3RocmVhZF9wb29sKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY3JlYXRlX2Rlc3Ryb3lfZW1wdHlfcG9vbCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfcGFyYWxsZWxpc20oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3J1bnF1ZXVlLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfcnVucXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjY5MDEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3J1bnF1ZXVlLmNwcApAQCAtMCwwICsxLDIzNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgRG1pdHJ5IFZ5dWtvdiA8ZHZ5dWtvdkBnb29nbGUuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UaHJlYWRQb29sPgorCisKKy8vIFZpc3VhbCBzdHVkaW8gZG9lc24ndCBpbXBsZW1lbnQgYSByYW5kX3IoKSBmdW5jdGlvbiBzaW5jZSBpdHMKKy8vIGltcGxlbWVudGF0aW9uIG9mIHJhbmQoKSBpcyBhbHJlYWR5IHRocmVhZCBzYWZlCitpbnQgcmFuZF9yZWVudHJhbnQodW5zaWduZWQgaW50KiBzKSB7CisjaWZkZWYgRUlHRU5fQ09NUF9NU1ZDX1NUUklDVAorICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocyk7CisgIHJldHVybiByYW5kKCk7CisjZWxzZQorICByZXR1cm4gcmFuZF9yKHMpOworI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9iYXNpY19ydW5xdWV1ZSgpCit7CisgIFJ1blF1ZXVlPGludCwgND4gcTsKKyAgLy8gQ2hlY2sgZW1wdHkgc3RhdGUuCisgIFZFUklGWShxLkVtcHR5KCkpOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHEuU2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUG9wRnJvbnQoKSk7CisgIHN0ZDo6dmVjdG9yPGludD4gc3RvbGVuOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHEuUG9wQmFja0hhbGYoJnN0b2xlbikpOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHN0b2xlbi5zaXplKCkpOworICAvLyBQdXNoIG9uZSBmcm9udCwgcG9wIG9uZSBmcm9udC4KKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEZyb250KDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCgxLCBxLlBvcEZyb250KCkpOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHEuU2l6ZSgpKTsKKyAgLy8gUHVzaCBmcm9udCB0byBvdmVyZmxvdy4KKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEZyb250KDIpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCgwLCBxLlB1c2hGcm9udCgzKSk7CisgIFZFUklGWV9JU19FUVVBTCgydSwgcS5TaXplKCkpOworICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoRnJvbnQoNCkpOworICBWRVJJRllfSVNfRVFVQUwoM3UsIHEuU2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEZyb250KDUpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDR1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCg2LCBxLlB1c2hGcm9udCg2KSk7CisgIFZFUklGWV9JU19FUVVBTCg0dSwgcS5TaXplKCkpOworICBWRVJJRllfSVNfRVFVQUwoNSwgcS5Qb3BGcm9udCgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDN1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCg0LCBxLlBvcEZyb250KCkpOworICBWRVJJRllfSVNfRVFVQUwoMnUsIHEuU2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDMsIHEuUG9wRnJvbnQoKSk7CisgIFZFUklGWV9JU19FUVVBTCgxdSwgcS5TaXplKCkpOworICBWRVJJRllfSVNfRVFVQUwoMiwgcS5Qb3BGcm9udCgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDB1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCgwLCBxLlBvcEZyb250KCkpOworICAvLyBQdXNoIG9uZSBiYWNrLCBwb3Agb25lIGJhY2suCisgIFZFUklGWV9JU19FUVVBTCgwLCBxLlB1c2hCYWNrKDcpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCgxdSwgcS5Qb3BCYWNrSGFsZigmc3RvbGVuKSk7CisgIFZFUklGWV9JU19FUVVBTCgxdSwgc3RvbGVuLnNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCg3LCBzdG9sZW5bMF0pOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHEuU2l6ZSgpKTsKKyAgc3RvbGVuLmNsZWFyKCk7CisgIC8vIFB1c2ggYmFjayB0byBvdmVyZmxvdy4KKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEJhY2soOCkpOworICBWRVJJRllfSVNfRVFVQUwoMXUsIHEuU2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEJhY2soOSkpOworICBWRVJJRllfSVNfRVFVQUwoMnUsIHEuU2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDAsIHEuUHVzaEJhY2soMTApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDN1LCBxLlNpemUoKSk7CisgIFZFUklGWV9JU19FUVVBTCgwLCBxLlB1c2hCYWNrKDExKSk7CisgIFZFUklGWV9JU19FUVVBTCg0dSwgcS5TaXplKCkpOworICBWRVJJRllfSVNfRVFVQUwoMTIsIHEuUHVzaEJhY2soMTIpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDR1LCBxLlNpemUoKSk7CisgIC8vIFBvcCBiYWNrIGluIGhhbHZlcy4KKyAgVkVSSUZZX0lTX0VRVUFMKDJ1LCBxLlBvcEJhY2tIYWxmKCZzdG9sZW4pKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDJ1LCBzdG9sZW4uc2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDEwLCBzdG9sZW5bMF0pOworICBWRVJJRllfSVNfRVFVQUwoMTEsIHN0b2xlblsxXSk7CisgIFZFUklGWV9JU19FUVVBTCgydSwgcS5TaXplKCkpOworICBzdG9sZW4uY2xlYXIoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBxLlBvcEJhY2tIYWxmKCZzdG9sZW4pKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBzdG9sZW4uc2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDksIHN0b2xlblswXSk7CisgIFZFUklGWV9JU19FUVVBTCgxdSwgcS5TaXplKCkpOworICBzdG9sZW4uY2xlYXIoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBxLlBvcEJhY2tIYWxmKCZzdG9sZW4pKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDF1LCBzdG9sZW4uc2l6ZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDgsIHN0b2xlblswXSk7CisgIHN0b2xlbi5jbGVhcigpOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHEuUG9wQmFja0hhbGYoJnN0b2xlbikpOworICBWRVJJRllfSVNfRVFVQUwoMHUsIHN0b2xlbi5zaXplKCkpOworICAvLyBFbXB0eSBhZ2Fpbi4KKyAgVkVSSUZZKHEuRW1wdHkoKSk7CisgIFZFUklGWV9JU19FUVVBTCgwdSwgcS5TaXplKCkpOworICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoRnJvbnQoMSkpOworICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoRnJvbnQoMikpOworICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoRnJvbnQoMykpOworICBWRVJJRllfSVNfRVFVQUwoMSwgcS5Qb3BCYWNrKCkpOworICBWRVJJRllfSVNfRVFVQUwoMiwgcS5Qb3BCYWNrKCkpOworICBWRVJJRllfSVNfRVFVQUwoMywgcS5Qb3BCYWNrKCkpOworICBWRVJJRlkocS5FbXB0eSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKDB1LCBxLlNpemUoKSk7Cit9CisKKy8vIEVtcHR5IHRlc3RzIHRoYXQgdGhlIHF1ZXVlIGlzIG5vdCBjbGFpbWVkIHRvIGJlIGVtcHR5IHdoZW4gaXMgaXMgaW4gZmFjdCBub3QuCisvLyBFbXB0aW5lc3MgcHJvcGVydHkgaXMgY3J1Y2lhbCBwYXJ0IG9mIHRocmVhZCBwb29sIGJsb2NraW5nIHNjaGVtZSwKKy8vIHNvIHdlIGdvIHRvIGdyZWF0IGVmZm9ydCB0byBlbnN1cmUgdGhpcyBwcm9wZXJ0eS4gV2UgY3JlYXRlIGEgcXVldWUgd2l0aAorLy8gMSBlbGVtZW50IGFuZCB0aGVuIHB1c2ggMSBlbGVtZW50IChlaXRoZXIgZnJvbnQgb3IgYmFjayBhdCByYW5kb20pIGFuZCBwb3AKKy8vIDEgZWxlbWVudCAoZWl0aGVyIGZyb250IG9yIGJhY2sgYXQgcmFuZG9tKS4gU28gcXVldWUgYWx3YXlzIGNvbnRhaW5zIGF0IGxlYXN0CisvLyAxIGVsZW1lbnQsIGJ1dCBvdGhlcndpc2UgY2hhbmdlcyBjaGFvdGljYWxseS4gQW5vdGhlciB0aHJlYWQgY29uc3RhbnRseSB0ZXN0cworLy8gdGhhdCB0aGUgcXVldWUgaXMgbm90IGNsYWltZWQgdG8gYmUgZW1wdHkuCit2b2lkIHRlc3RfZW1wdHlfcnVucXVldWUoKQoreworICBSdW5RdWV1ZTxpbnQsIDQ+IHE7CisgIHEuUHVzaEZyb250KDEpOworICBzdGQ6OmF0b21pYzxib29sPiBkb25lKGZhbHNlKTsKKyAgc3RkOjp0aHJlYWQgbXV0YXRvcihbJnEsICZkb25lXSgpIHsKKyAgICB1bnNpZ25lZCBybmQgPSAwOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RvbGVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMSA8PCAxODsgaSsrKSB7CisgICAgICBpZiAocmFuZF9yZWVudHJhbnQoJnJuZCkgJSAyKQorICAgICAgICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoRnJvbnQoMSkpOworICAgICAgZWxzZQorICAgICAgICBWRVJJRllfSVNfRVFVQUwoMCwgcS5QdXNoQmFjaygxKSk7CisgICAgICBpZiAocmFuZF9yZWVudHJhbnQoJnJuZCkgJSAyKQorICAgICAgICBWRVJJRllfSVNfRVFVQUwoMSwgcS5Qb3BGcm9udCgpKTsKKyAgICAgIGVsc2UgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgaWYgKHEuUG9wQmFja0hhbGYoJnN0b2xlbikgPT0gMSkgeworICAgICAgICAgICAgc3RvbGVuLmNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKDB1LCBzdG9sZW4uc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkb25lID0gdHJ1ZTsKKyAgfSk7CisgIHdoaWxlICghZG9uZSkgeworICAgIFZFUklGWSghcS5FbXB0eSgpKTsKKyAgICBpbnQgc2l6ZSA9IHEuU2l6ZSgpOworICAgIFZFUklGWV9HRShzaXplLCAxKTsKKyAgICBWRVJJRllfTEUoc2l6ZSwgMik7CisgIH0KKyAgVkVSSUZZX0lTX0VRVUFMKDEsIHEuUG9wRnJvbnQoKSk7CisgIG11dGF0b3Iuam9pbigpOworfQorCisvLyBTdHJlc3MgaXMgYSBjaGFvdGljIHJhbmRvbSB0ZXN0LgorLy8gT25lIHRocmVhZCAob3duZXIpIGNhbGxzIFB1c2hGcm9udC9Qb3BGcm9udCwgb3RoZXIgdGhyZWFkcyBjYWxsIFB1c2hCYWNrLworLy8gUG9wQmFjay4gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgY3Jhc2gsIGRlYWRsb2NrLCBhbmQgYWxsIHNhbml0eSBjaGVja3MgcGFzcy4KK3ZvaWQgdGVzdF9zdHJlc3NfcnVucXVldWUoKQoreworICBzdGF0aWMgY29uc3QgaW50IGtFdmVudHMgPSAxIDw8IDE4OworICBSdW5RdWV1ZTxpbnQsIDg+IHE7CisgIHN0ZDo6YXRvbWljPGludD4gdG90YWwoMCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4+IHRocmVhZHM7CisgIHRocmVhZHMuZW1wbGFjZV9iYWNrKG5ldyBzdGQ6OnRocmVhZChbJnEsICZ0b3RhbF0oKSB7CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHB1c2hlZCA9IDE7CisgICAgaW50IHBvcHBlZCA9IDE7CisgICAgd2hpbGUgKHB1c2hlZCA8IGtFdmVudHMgfHwgcG9wcGVkIDwga0V2ZW50cykgeworICAgICAgaWYgKHB1c2hlZCA8IGtFdmVudHMpIHsKKyAgICAgICAgaWYgKHEuUHVzaEZyb250KHB1c2hlZCkgPT0gMCkgeworICAgICAgICAgIHN1bSArPSBwdXNoZWQ7CisgICAgICAgICAgcHVzaGVkKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwb3BwZWQgPCBrRXZlbnRzKSB7CisgICAgICAgIGludCB2ID0gcS5Qb3BGcm9udCgpOworICAgICAgICBpZiAodiAhPSAwKSB7CisgICAgICAgICAgc3VtIC09IHY7CisgICAgICAgICAgcG9wcGVkKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgdG90YWwgKz0gc3VtOworICB9KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgdGhyZWFkcy5lbXBsYWNlX2JhY2sobmV3IHN0ZDo6dGhyZWFkKFsmcSwgJnRvdGFsXSgpIHsKKyAgICAgIGludCBzdW0gPSAwOworICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBrRXZlbnRzOyBqKyspIHsKKyAgICAgICAgaWYgKHEuUHVzaEJhY2soaikgPT0gMCkgeworICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEVJR0VOX1RIUkVBRF9ZSUVMRCgpOworICAgICAgICBqLS07CisgICAgICB9CisgICAgICB0b3RhbCArPSBzdW07CisgICAgfSkpOworICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKG5ldyBzdGQ6OnRocmVhZChbJnEsICZ0b3RhbF0oKSB7CisgICAgICBpbnQgc3VtID0gMDsKKyAgICAgIHN0ZDo6dmVjdG9yPGludD4gc3RvbGVuOworICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBrRXZlbnRzOykgeworICAgICAgICBpZiAocS5Qb3BCYWNrSGFsZigmc3RvbGVuKSA9PSAwKSB7CisgICAgICAgICAgRUlHRU5fVEhSRUFEX1lJRUxEKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHN0b2xlbi5zaXplKCkgJiYgaiA8IGtFdmVudHMpIHsKKyAgICAgICAgICBpbnQgdiA9IHN0b2xlbi5iYWNrKCk7CisgICAgICAgICAgc3RvbGVuLnBvcF9iYWNrKCk7CisgICAgICAgICAgVkVSSUZZX0lTX05PVF9FUVVBTCh2LCAwKTsKKyAgICAgICAgICBzdW0gKz0gdjsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlIChzdG9sZW4uc2l6ZSgpKSB7CisgICAgICAgIGludCB2ID0gc3RvbGVuLmJhY2soKTsKKyAgICAgICAgc3RvbGVuLnBvcF9iYWNrKCk7CisgICAgICAgIFZFUklGWV9JU19OT1RfRVFVQUwodiwgMCk7CisgICAgICAgIHdoaWxlICgodiA9IHEuUHVzaEJhY2sodikpICE9IDApIEVJR0VOX1RIUkVBRF9ZSUVMRCgpOworICAgICAgfQorICAgICAgdG90YWwgLT0gc3VtOworICAgIH0pKTsKKyAgfQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRocmVhZHMuc2l6ZSgpOyBpKyspIHRocmVhZHNbaV0tPmpvaW4oKTsKKyAgVkVSSUZZKHEuRW1wdHkoKSk7CisgIFZFUklGWSh0b3RhbC5sb2FkKCkgPT0gMCk7Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV9ydW5xdWV1ZSgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfYmFzaWNfcnVucXVldWUoKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfZW1wdHlfcnVucXVldWUoKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3Rfc3RyZXNzX3J1bnF1ZXVlKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXJnbWF4LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2FyZ21heC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NzY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2FyZ21heC5jcHAKQEAgLTAsMCArMSwyOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEV1Z2VuZSBCcmV2ZG8gPGVicmV2ZG9AZ29vZ2xlLmNvbT4KKy8vICAgICAgICAgICAgICAgICAgICBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OmFycmF5OwordXNpbmcgRWlnZW46OlR1cGxlOworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9pbmRleF90dXBsZXMoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOworCisgIFRlbnNvcjxUdXBsZTxEZW5zZUluZGV4LCBmbG9hdD4sIDQsIERhdGFMYXlvdXQ+IGluZGV4X3R1cGxlcygyLDMsNSw3KTsKKyAgaW5kZXhfdHVwbGVzID0gdGVuc29yLmluZGV4X3R1cGxlcygpOworCisgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IDIqMyo1Kjc7ICsrbikgeworICAgIGNvbnN0IFR1cGxlPERlbnNlSW5kZXgsIGZsb2F0PiYgdiA9IGluZGV4X3R1cGxlcy5jb2VmZihuKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodi5maXJzdCwgbik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYuc2Vjb25kLCB0ZW5zb3IuY29lZmYobikpOworICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfaW5kZXhfdHVwbGVzX2RpbSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIHRlbnNvciA9ICh0ZW5zb3IgKyB0ZW5zb3IuY29uc3RhbnQoMC41KSkubG9nKCk7CisKKyAgVGVuc29yPFR1cGxlPERlbnNlSW5kZXgsIGZsb2F0PiwgNCwgRGF0YUxheW91dD4gaW5kZXhfdHVwbGVzKDIsMyw1LDcpOworCisgIGluZGV4X3R1cGxlcyA9IHRlbnNvci5pbmRleF90dXBsZXMoKTsKKworICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IG4gPSAwOyBuIDwgdGVuc29yLnNpemUoKTsgKytuKSB7CisgICAgY29uc3QgVHVwbGU8RGVuc2VJbmRleCwgZmxvYXQ+JiB2ID0gaW5kZXhfdHVwbGVzKG4pOyAvLyhpLCBqLCBrLCBsKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodi5maXJzdCwgbik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYuc2Vjb25kLCB0ZW5zb3IobikpOworICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfYXJnbWF4X3R1cGxlX3JlZHVjZXIoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOworCisgIFRlbnNvcjxUdXBsZTxEZW5zZUluZGV4LCBmbG9hdD4sIDQsIERhdGFMYXlvdXQ+IGluZGV4X3R1cGxlcygyLDMsNSw3KTsKKyAgaW5kZXhfdHVwbGVzID0gdGVuc29yLmluZGV4X3R1cGxlcygpOworCisgIFRlbnNvcjxUdXBsZTxEZW5zZUluZGV4LCBmbG9hdD4sIDAsIERhdGFMYXlvdXQ+IHJlZHVjZWQ7CisgIERpbWVuc2lvbkxpc3Q8RGVuc2VJbmRleCwgND4gZGltczsKKyAgcmVkdWNlZCA9IGluZGV4X3R1cGxlcy5yZWR1Y2UoCisgICAgICBkaW1zLCBpbnRlcm5hbDo6QXJnTWF4VHVwbGVSZWR1Y2VyPFR1cGxlPERlbnNlSW5kZXgsIGZsb2F0PiA+KCkpOworCisgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gbWF4aSA9IHRlbnNvci5tYXhpbXVtKCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKG1heGkoKSwgcmVkdWNlZCgwKS5zZWNvbmQpOworCisgIGFycmF5PERlbnNlSW5kZXgsIDM+IHJlZHVjZV9kaW1zOworICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgcmVkdWNlX2RpbXNbZF0gPSBkOworICBUZW5zb3I8VHVwbGU8RGVuc2VJbmRleCwgZmxvYXQ+LCAxLCBEYXRhTGF5b3V0PiByZWR1Y2VkX2J5X2RpbXMoNyk7CisgIHJlZHVjZWRfYnlfZGltcyA9IGluZGV4X3R1cGxlcy5yZWR1Y2UoCisgICAgICByZWR1Y2VfZGltcywgaW50ZXJuYWw6OkFyZ01heFR1cGxlUmVkdWNlcjxUdXBsZTxEZW5zZUluZGV4LCBmbG9hdD4gPigpKTsKKworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IG1heF9ieV9kaW1zID0gdGVuc29yLm1heGltdW0ocmVkdWNlX2RpbXMpOworCisgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1heF9ieV9kaW1zKGwpLCByZWR1Y2VkX2J5X2RpbXMobCkuc2Vjb25kKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ21pbl90dXBsZV9yZWR1Y2VyKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKKworICBUZW5zb3I8VHVwbGU8RGVuc2VJbmRleCwgZmxvYXQ+LCA0LCBEYXRhTGF5b3V0PiBpbmRleF90dXBsZXMoMiwzLDUsNyk7CisgIGluZGV4X3R1cGxlcyA9IHRlbnNvci5pbmRleF90dXBsZXMoKTsKKworICBUZW5zb3I8VHVwbGU8RGVuc2VJbmRleCwgZmxvYXQ+LCAwLCBEYXRhTGF5b3V0PiByZWR1Y2VkOworICBEaW1lbnNpb25MaXN0PERlbnNlSW5kZXgsIDQ+IGRpbXM7CisgIHJlZHVjZWQgPSBpbmRleF90dXBsZXMucmVkdWNlKAorICAgICAgZGltcywgaW50ZXJuYWw6OkFyZ01pblR1cGxlUmVkdWNlcjxUdXBsZTxEZW5zZUluZGV4LCBmbG9hdD4gPigpKTsKKworICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IG1pbmkgPSB0ZW5zb3IubWluaW11bSgpOworCisgIFZFUklGWV9JU19FUVVBTChtaW5pKCksIHJlZHVjZWQoMCkuc2Vjb25kKTsKKworICBhcnJheTxEZW5zZUluZGV4LCAzPiByZWR1Y2VfZGltczsKKyAgZm9yIChpbnQgZCA9IDA7IGQgPCAzOyArK2QpIHJlZHVjZV9kaW1zW2RdID0gZDsKKyAgVGVuc29yPFR1cGxlPERlbnNlSW5kZXgsIGZsb2F0PiwgMSwgRGF0YUxheW91dD4gcmVkdWNlZF9ieV9kaW1zKDcpOworICByZWR1Y2VkX2J5X2RpbXMgPSBpbmRleF90dXBsZXMucmVkdWNlKAorICAgICAgcmVkdWNlX2RpbXMsIGludGVybmFsOjpBcmdNaW5UdXBsZVJlZHVjZXI8VHVwbGU8RGVuc2VJbmRleCwgZmxvYXQ+ID4oKSk7CisKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiBtaW5fYnlfZGltcyA9IHRlbnNvci5taW5pbXVtKHJlZHVjZV9kaW1zKTsKKworICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgIFZFUklGWV9JU19FUVVBTChtaW5fYnlfZGltcyhsKSwgcmVkdWNlZF9ieV9kaW1zKGwpLnNlY29uZCk7CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfYXJnbWF4KCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKKyAgdGVuc29yKDAsMCwwLDApID0gMTAuMDsKKworICBUZW5zb3I8RGVuc2VJbmRleCwgMCwgRGF0YUxheW91dD4gdGVuc29yX2FyZ21heDsKKworICB0ZW5zb3JfYXJnbWF4ID0gdGVuc29yLmFyZ21heCgpOworCisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWF4KDApLCAwKTsKKworICB0ZW5zb3IoMSwyLDQsNikgPSAyMC4wOworCisgIHRlbnNvcl9hcmdtYXggPSB0ZW5zb3IuYXJnbWF4KCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXgoMCksIDIqMyo1KjcgLSAxKTsKK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfYXJnbWluKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKKyAgdGVuc29yKDAsMCwwLDApID0gLTEwLjA7CisKKyAgVGVuc29yPERlbnNlSW5kZXgsIDAsIERhdGFMYXlvdXQ+IHRlbnNvcl9hcmdtaW47CisKKyAgdGVuc29yX2FyZ21pbiA9IHRlbnNvci5hcmdtaW4oKTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbigwKSwgMCk7CisKKyAgdGVuc29yKDEsMiw0LDYpID0gLTIwLjA7CisKKyAgdGVuc29yX2FyZ21pbiA9IHRlbnNvci5hcmdtaW4oKTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbigwKSwgMiozKjUqNyAtIDEpOworfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ21heF9kaW0oKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBkaW1zIHsyLCAzLCA1LCA3fTsKKworICBmb3IgKGludCBkaW0gPSAwOyBkaW0gPCA0OyArK2RpbSkgeworICAgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOworCisgICAgVGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcl9hcmdtYXg7CisgICAgYXJyYXk8RGVuc2VJbmRleCwgND4gaXg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IDApIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMCwgaywgbCkgPSAxMC4wCisgICAgICAgICAgICB0ZW5zb3IoaXgpID0gMTAuMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZW5zb3JfYXJnbWF4ID0gdGVuc29yLmFyZ21heChkaW0pOworCisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXguc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QoMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOworICAgIGZvciAocHRyZGlmZl90IG4gPSAwOyBuIDwgdGVuc29yX2FyZ21heC5zaXplKCk7ICsrbikgeworICAgICAgLy8gRXhwZWN0IG1heCB0byBiZSBpbiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCisgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21heC5kYXRhKClbbl0sIDApOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgICBpeFswXSA9IGk7IGl4WzFdID0gajsgaXhbMl0gPSBrOyBpeFszXSA9IGw7CisgICAgICAgICAgICBpZiAoaXhbZGltXSAhPSB0ZW5zb3IuZGltZW5zaW9uKGRpbSkgLSAxKSBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIHN1cHBvc2UgZGltID09IDEsIHRoZW4gZm9yIGFsbCBpLCBrLCBsLCBzZXQgdGVuc29yKGksIDIsIGssIGwpID0gMjAuMAorICAgICAgICAgICAgdGVuc29yKGl4KSA9IDIwLjA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGVuc29yX2FyZ21heCA9IHRlbnNvci5hcmdtYXgoZGltKTsKKworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWF4LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90KDIqMyo1KjcgLyB0ZW5zb3IuZGltZW5zaW9uKGRpbSkpKTsKKyAgICBmb3IgKHB0cmRpZmZfdCBuID0gMDsgbiA8IHRlbnNvcl9hcmdtYXguc2l6ZSgpOyArK24pIHsKKyAgICAgIC8vIEV4cGVjdCBtYXggdG8gYmUgaW4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCisgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21heC5kYXRhKClbbl0sIHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ21pbl9kaW0oKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBkaW1zIHsyLCAzLCA1LCA3fTsKKworICBmb3IgKGludCBkaW0gPSAwOyBkaW0gPCA0OyArK2RpbSkgeworICAgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOworCisgICAgVGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcl9hcmdtaW47CisgICAgYXJyYXk8RGVuc2VJbmRleCwgND4gaXg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IDApIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMCwgaywgbCkgPSAtMTAuMAorICAgICAgICAgICAgdGVuc29yKGl4KSA9IC0xMC4wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRlbnNvcl9hcmdtaW4gPSB0ZW5zb3IuYXJnbWluKGRpbSk7CisKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbi5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCgyKjMqNSo3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKSk7CisgICAgZm9yIChwdHJkaWZmX3QgbiA9IDA7IG4gPCB0ZW5zb3JfYXJnbWluLnNpemUoKTsgKytuKSB7CisgICAgICAvLyBFeHBlY3QgbWluIHRvIGJlIGluIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgcmVkdWNlZCBkaW1lbnNpb24KKyAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWluLmRhdGEoKVtuXSwgMCk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMiwgaywgbCkgPSAtMjAuMAorICAgICAgICAgICAgdGVuc29yKGl4KSA9IC0yMC4wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRlbnNvcl9hcmdtaW4gPSB0ZW5zb3IuYXJnbWluKGRpbSk7CisKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbi5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCgyKjMqNSo3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKSk7CisgICAgZm9yIChwdHJkaWZmX3QgbiA9IDA7IG4gPCB0ZW5zb3JfYXJnbWluLnNpemUoKTsgKytuKSB7CisgICAgICAvLyBFeHBlY3QgbWluIHRvIGJlIGluIHRoZSBsYXN0IGluZGV4IG9mIHRoZSByZWR1Y2VkIGRpbWVuc2lvbgorICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4uZGF0YSgpW25dLCB0ZW5zb3IuZGltZW5zaW9uKGRpbSkgLSAxKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9hcmdtYXgoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfaW5kZXhfdHVwbGVzPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2luZGV4X3R1cGxlczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2luZGV4X3R1cGxlc19kaW08Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9pbmRleF90dXBsZXNfZGltPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnbWF4X3R1cGxlX3JlZHVjZXI8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hcmdtYXhfdHVwbGVfcmVkdWNlcjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2FyZ21pbl90dXBsZV9yZWR1Y2VyPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnbWluX3R1cGxlX3JlZHVjZXI8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfYXJnbWF4PFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2FyZ21heDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9hcmdtaW48Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfYXJnbWluPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnbWF4X2RpbTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2FyZ21heF9kaW08Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hcmdtaW5fZGltPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnbWluX2RpbTxDb2xNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hcmdtYXhfY3VkYS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2FyZ21heF9jdWRhLmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzQ0M2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hcmdtYXhfY3VkYS5jdQpAQCAtMCwwICsxLDI1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2N1ZGEKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGUgPGludCBMYXlvdXQ+Cit2b2lkIHRlc3RfY3VkYV9zaW1wbGVfYXJnbWF4KCkKK3sKKyAgVGVuc29yPGRvdWJsZSwgMywgTGF5b3V0PiBpbihFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKyAgVGVuc29yPERlbnNlSW5kZXgsIDEsIExheW91dD4gb3V0X21heChFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMT4oMSkpOworICBUZW5zb3I8RGVuc2VJbmRleCwgMSwgTGF5b3V0PiBvdXRfbWluKEVpZ2VuOjphcnJheTxEZW5zZUluZGV4LCAxPigxKSk7CisgIGluLnNldFJhbmRvbSgpOworICBpbiAqPSBpbi5jb25zdGFudCgxMDAuMCk7CisgIGluKDAsIDAsIDApID0gLTEwMDAuMDsKKyAgaW4oNzEsIDUyLCA5NikgPSAxMDAwLjA7CisKKyAgc3RkOjpzaXplX3QgaW5fYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YoZG91YmxlKTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gb3V0X21heC5zaXplKCkgKiBzaXplb2YoRGVuc2VJbmRleCk7CisKKyAgZG91YmxlKiBkX2luOworICBEZW5zZUluZGV4KiBkX291dF9tYXg7CisgIERlbnNlSW5kZXgqIGRfb3V0X21pbjsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbiksIGluX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXRfbWF4KSwgb3V0X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXRfbWluKSwgb3V0X2J5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfaW4sIGluLmRhdGEoKSwgaW5fYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxkb3VibGUsIDMsIExheW91dD4sIEFsaWduZWQgPiBncHVfaW4oZF9pbiwgRWlnZW46OmFycmF5PERlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEZW5zZUluZGV4LCAxLCBMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X291dF9tYXgoZF9vdXRfbWF4LCBFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMT4oMSkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGVuc2VJbmRleCwgMSwgTGF5b3V0PiwgQWxpZ25lZCA+IGdwdV9vdXRfbWluKGRfb3V0X21pbiwgRWlnZW46OmFycmF5PERlbnNlSW5kZXgsIDE+KDEpKTsKKworICBncHVfb3V0X21heC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYXJnbWF4KCk7CisgIGdwdV9vdXRfbWluLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbi5hcmdtaW4oKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dF9tYXguZGF0YSgpLCBkX291dF9tYXgsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dF9taW4uZGF0YSgpLCBkX291dF9taW4sIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBWRVJJRllfSVNfRVFVQUwob3V0X21heChFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMT4oMCkpLCA3Mio1Myo5NyAtIDEpOworICBWRVJJRllfSVNfRVFVQUwob3V0X21pbihFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMT4oMCkpLCAwKTsKKworICBjdWRhRnJlZShkX2luKTsKKyAgY3VkYUZyZWUoZF9vdXRfbWF4KTsKKyAgY3VkYUZyZWUoZF9vdXRfbWluKTsKK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfYXJnbWF4X2RpbSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworICBzdGQ6OnZlY3RvcjxpbnQ+IGRpbXM7CisgIGRpbXMucHVzaF9iYWNrKDIpOyBkaW1zLnB1c2hfYmFjaygzKTsgZGltcy5wdXNoX2JhY2soNSk7IGRpbXMucHVzaF9iYWNrKDcpOworCisgIGZvciAoaW50IGRpbSA9IDA7IGRpbSA8IDQ7ICsrZGltKSB7CisgICAgdGVuc29yLnNldFJhbmRvbSgpOworICAgIHRlbnNvciA9ICh0ZW5zb3IgKyB0ZW5zb3IuY29uc3RhbnQoMC41KSkubG9nKCk7CisKKyAgICBhcnJheTxEZW5zZUluZGV4LCAzPiBvdXRfc2hhcGU7CisgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAzOyArK2QpIG91dF9zaGFwZVtkXSA9IChkIDwgZGltKSA/IGRpbXNbZF0gOiBkaW1zW2QrMV07CisKKyAgICBUZW5zb3I8RGVuc2VJbmRleCwgMywgRGF0YUxheW91dD4gdGVuc29yX2FyZyhvdXRfc2hhcGUpOworCisgICAgYXJyYXk8RGVuc2VJbmRleCwgND4gaXg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IDApIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMCwgaywgbCkgPSAxMC4wCisgICAgICAgICAgICB0ZW5zb3IoaXgpID0gMTAuMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBpbl9ieXRlcyA9IHRlbnNvci5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICAgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IHRlbnNvcl9hcmcuc2l6ZSgpICogc2l6ZW9mKERlbnNlSW5kZXgpOworCisgICAgZmxvYXQqIGRfaW47CisgICAgRGVuc2VJbmRleCogZF9vdXQ7CisgICAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbiksIGluX2J5dGVzKTsKKyAgICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIG91dF9ieXRlcyk7CisKKyAgICBjdWRhTWVtY3B5KGRfaW4sIHRlbnNvci5kYXRhKCksIGluX2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X2luKGRfaW4sIEVpZ2VuOjphcnJheTxEZW5zZUluZGV4LCA0PigyLCAzLCA1LCA3KSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X291dChkX291dCwgb3V0X3NoYXBlKTsKKworICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmFyZ21heChkaW0pOworCisgICAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyh0ZW5zb3JfYXJnLmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmcuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QoMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOworCisgICAgZm9yIChEZW5zZUluZGV4IG4gPSAwOyBuIDwgdGVuc29yX2FyZy5zaXplKCk7ICsrbikgeworICAgICAgLy8gRXhwZWN0IG1heCB0byBiZSBpbiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCisgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZy5kYXRhKClbbl0sIDApOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgICBpeFswXSA9IGk7IGl4WzFdID0gajsgaXhbMl0gPSBrOyBpeFszXSA9IGw7CisgICAgICAgICAgICBpZiAoaXhbZGltXSAhPSB0ZW5zb3IuZGltZW5zaW9uKGRpbSkgLSAxKSBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIHN1cHBvc2UgZGltID09IDEsIHRoZW4gZm9yIGFsbCBpLCBrLCBsLCBzZXQgdGVuc29yKGksIDIsIGssIGwpID0gMjAuMAorICAgICAgICAgICAgdGVuc29yKGl4KSA9IDIwLjA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY3VkYU1lbWNweShkX2luLCB0ZW5zb3IuZGF0YSgpLCBpbl9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbi5hcmdtYXgoZGltKTsKKworICAgIGFzc2VydChjdWRhTWVtY3B5QXN5bmModGVuc29yX2FyZy5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICAgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IHRlbnNvcl9hcmcuc2l6ZSgpOyArK24pIHsKKyAgICAgIC8vIEV4cGVjdCBtYXggdG8gYmUgaW4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCisgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZy5kYXRhKClbbl0sIHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpOworICAgIH0KKworICAgIGN1ZGFGcmVlKGRfaW4pOworICAgIGN1ZGFGcmVlKGRfb3V0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3RfY3VkYV9hcmdtaW5fZGltKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHN0ZDo6dmVjdG9yPGludD4gZGltczsKKyAgZGltcy5wdXNoX2JhY2soMik7IGRpbXMucHVzaF9iYWNrKDMpOyBkaW1zLnB1c2hfYmFjayg1KTsgZGltcy5wdXNoX2JhY2soNyk7CisKKyAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgNDsgKytkaW0pIHsKKyAgICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgICAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKKworICAgIGFycmF5PERlbnNlSW5kZXgsIDM+IG91dF9zaGFwZTsKKyAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgb3V0X3NoYXBlW2RdID0gKGQgPCBkaW0pID8gZGltc1tkXSA6IGRpbXNbZCsxXTsKKworICAgIFRlbnNvcjxEZW5zZUluZGV4LCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3JfYXJnKG91dF9zaGFwZSk7CisKKyAgICBhcnJheTxEZW5zZUluZGV4LCA0PiBpeDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgICAgaXhbMF0gPSBpOyBpeFsxXSA9IGo7IGl4WzJdID0gazsgaXhbM10gPSBsOworICAgICAgICAgICAgaWYgKGl4W2RpbV0gIT0gMCkgY29udGludWU7CisgICAgICAgICAgICAvLyBzdXBwb3NlIGRpbSA9PSAxLCB0aGVuIGZvciBhbGwgaSwgaywgbCwgc2V0IHRlbnNvcihpLCAwLCBrLCBsKSA9IDEwLjAKKyAgICAgICAgICAgIHRlbnNvcihpeCkgPSAtMTAuMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNpemVfdCBpbl9ieXRlcyA9IHRlbnNvci5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICAgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IHRlbnNvcl9hcmcuc2l6ZSgpICogc2l6ZW9mKERlbnNlSW5kZXgpOworCisgICAgZmxvYXQqIGRfaW47CisgICAgRGVuc2VJbmRleCogZF9vdXQ7CisgICAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbiksIGluX2J5dGVzKTsKKyAgICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIG91dF9ieXRlcyk7CisKKyAgICBjdWRhTWVtY3B5KGRfaW4sIHRlbnNvci5kYXRhKCksIGluX2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICAgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X2luKGRfaW4sIEVpZ2VuOjphcnJheTxEZW5zZUluZGV4LCA0PigyLCAzLCA1LCA3KSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X291dChkX291dCwgb3V0X3NoYXBlKTsKKworICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmFyZ21pbihkaW0pOworCisgICAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyh0ZW5zb3JfYXJnLmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmcuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAyKjMqNSo3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKTsKKworICAgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IHRlbnNvcl9hcmcuc2l6ZSgpOyArK24pIHsKKyAgICAgIC8vIEV4cGVjdCBtaW4gdG8gYmUgaW4gdGhlIGZpcnN0IGluZGV4IG9mIHRoZSByZWR1Y2VkIGRpbWVuc2lvbgorICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmcuZGF0YSgpW25dLCAwKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgICAgaXhbMF0gPSBpOyBpeFsxXSA9IGo7IGl4WzJdID0gazsgaXhbM10gPSBsOworICAgICAgICAgICAgaWYgKGl4W2RpbV0gIT0gdGVuc29yLmRpbWVuc2lvbihkaW0pIC0gMSkgY29udGludWU7CisgICAgICAgICAgICAvLyBzdXBwb3NlIGRpbSA9PSAxLCB0aGVuIGZvciBhbGwgaSwgaywgbCwgc2V0IHRlbnNvcihpLCAyLCBrLCBsKSA9IDIwLjAKKyAgICAgICAgICAgIHRlbnNvcihpeCkgPSAtMjAuMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjdWRhTWVtY3B5KGRfaW4sIHRlbnNvci5kYXRhKCksIGluX2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmFyZ21pbihkaW0pOworCisgICAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyh0ZW5zb3JfYXJnLmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgZm9yIChEZW5zZUluZGV4IG4gPSAwOyBuIDwgdGVuc29yX2FyZy5zaXplKCk7ICsrbikgeworICAgICAgLy8gRXhwZWN0IG1heCB0byBiZSBpbiB0aGUgbGFzdCBpbmRleCBvZiB0aGUgcmVkdWNlZCBkaW1lbnNpb24KKyAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnLmRhdGEoKVtuXSwgdGVuc29yLmRpbWVuc2lvbihkaW0pIC0gMSk7CisgICAgfQorCisgICAgY3VkYUZyZWUoZF9pbik7CisgICAgY3VkYUZyZWUoZF9vdXQpOworICB9Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY3VkYSgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfY3VkYV9zaW1wbGVfYXJnbWF4PFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jdWRhX3NpbXBsZV9hcmdtYXg8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X2N1ZGFfYXJnbWF4X2RpbTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfY3VkYV9hcmdtYXhfZGltPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9jdWRhX2FyZ21pbl9kaW08Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfYXJnbWluX2RpbTxDb2xNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hc3NpZ24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXNzaWduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU4NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXNzaWduLmNwcApAQCAtMCwwICsxLDM3MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF8xZCgpCit7CisgIFRlbnNvcjxpbnQsIDE+IHZlYzEoNik7CisgIFRlbnNvcjxpbnQsIDEsIFJvd01ham9yPiB2ZWMyKDYpOworICB2ZWMxKDApID0gNDsgIHZlYzIoMCkgPSAwOworICB2ZWMxKDEpID0gODsgIHZlYzIoMSkgPSAxOworICB2ZWMxKDIpID0gMTU7IHZlYzIoMikgPSAyOworICB2ZWMxKDMpID0gMTY7IHZlYzIoMykgPSAzOworICB2ZWMxKDQpID0gMjM7IHZlYzIoNCkgPSA0OworICB2ZWMxKDUpID0gNDI7IHZlYzIoNSkgPSA1OworCisgIGludCBjb2xfbWFqb3JbNl07CisgIGludCByb3dfbWFqb3JbNl07CisgIG1lbXNldChjb2xfbWFqb3IsIDAsIDYqc2l6ZW9mKGludCkpOworICBtZW1zZXQocm93X21ham9yLCAwLCA2KnNpemVvZihpbnQpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDE+ID4gdmVjMyhjb2xfbWFqb3IsIDYpOworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMSwgUm93TWFqb3I+ID4gdmVjNChyb3dfbWFqb3IsIDYpOworCisgIHZlYzMgPSB2ZWMxOworICB2ZWM0ID0gdmVjMjsKKworICBWRVJJRllfSVNfRVFVQUwodmVjMygwKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMzKDEpLCA4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMoMiksIDE1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMoMyksIDE2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMoNCksIDIzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMoNSksIDQyKTsKKworICBWRVJJRllfSVNfRVFVQUwodmVjNCgwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWM0KDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzQoMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwodmVjNCgzKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWM0KDQpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzQoNSksIDUpOworCisgIHZlYzEuc2V0WmVybygpOworICB2ZWMyLnNldFplcm8oKTsKKyAgdmVjMSA9IHZlYzM7CisgIHZlYzIgPSB2ZWM0OworCisgIFZFUklGWV9JU19FUVVBTCh2ZWMxKDApLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzEoMSksIDgpOworICBWRVJJRllfSVNfRVFVQUwodmVjMSgyKSwgMTUpOworICBWRVJJRllfSVNfRVFVQUwodmVjMSgzKSwgMTYpOworICBWRVJJRllfSVNfRVFVQUwodmVjMSg0KSwgMjMpOworICBWRVJJRllfSVNfRVFVQUwodmVjMSg1KSwgNDIpOworCisgIFZFUklGWV9JU19FUVVBTCh2ZWMyKDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzIoMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwodmVjMigyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMyKDMpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzIoNCksIDQpOworICBWRVJJRllfSVNfRVFVQUwodmVjMig1KSwgNSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfMmQoKQoreworICBUZW5zb3I8aW50LCAyPiBtYXQxKDIsMyk7CisgIFRlbnNvcjxpbnQsIDIsIFJvd01ham9yPiBtYXQyKDIsMyk7CisKKyAgbWF0MSgwLDApID0gMDsKKyAgbWF0MSgwLDEpID0gMTsKKyAgbWF0MSgwLDIpID0gMjsKKyAgbWF0MSgxLDApID0gMzsKKyAgbWF0MSgxLDEpID0gNDsKKyAgbWF0MSgxLDIpID0gNTsKKworICBtYXQyKDAsMCkgPSAwOworICBtYXQyKDAsMSkgPSAxOworICBtYXQyKDAsMikgPSAyOworICBtYXQyKDEsMCkgPSAzOworICBtYXQyKDEsMSkgPSA0OworICBtYXQyKDEsMikgPSA1OworCisgIGludCBjb2xfbWFqb3JbNl07CisgIGludCByb3dfbWFqb3JbNl07CisgIG1lbXNldChjb2xfbWFqb3IsIDAsIDYqc2l6ZW9mKGludCkpOworICBtZW1zZXQocm93X21ham9yLCAwLCA2KnNpemVvZihpbnQpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDI+ID4gbWF0Myhyb3dfbWFqb3IsIDIsIDMpOworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMiwgUm93TWFqb3I+ID4gbWF0NChjb2xfbWFqb3IsIDIsIDMpOworCisgIG1hdDMgPSBtYXQxOworICBtYXQ0ID0gbWF0MjsKKworICBWRVJJRllfSVNfRVFVQUwobWF0MygwLDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDAsMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygxLDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwxKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDEsMiksIDUpOworCisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsMCksIDApOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsMCksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLDEpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwyKSwgNSk7CisKKyAgbWF0MS5zZXRaZXJvKCk7CisgIG1hdDIuc2V0WmVybygpOworICBtYXQxID0gbWF0MzsKKyAgbWF0MiA9IG1hdDQ7CisKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMCwwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQxKDAsMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwobWF0MSgwLDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMSwwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQxKDEsMSksIDQpOworICBWRVJJRllfSVNfRVFVQUwobWF0MSgxLDIpLCA1KTsKKworICBWRVJJRllfSVNfRVFVQUwobWF0MigwLDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMCwxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQyKDAsMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0MigxLDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMSwxKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQyKDEsMiksIDUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0XzNkKCkKK3sKKyAgVGVuc29yPGludCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKKworICBpbnQgdmFsID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgbWF0MShpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDIoaSxqLGspID0gdmFsOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnQgY29sX21ham9yWzIqMyo3XTsKKyAgaW50IHJvd19tYWpvclsyKjMqN107CisgIG1lbXNldChjb2xfbWFqb3IsIDAsIDIqMyo3KnNpemVvZihpbnQpKTsKKyAgbWVtc2V0KHJvd19tYWpvciwgMCwgMiozKjcqc2l6ZW9mKGludCkpOworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMz4gPiBtYXQzKGNvbF9tYWpvciwgMiwgMywgNyk7CisgIFRlbnNvck1hcDxUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gPiBtYXQ0KHJvd19tYWpvciwgMiwgMywgNyk7CisKKyAgbWF0MyA9IG1hdDE7CisgIG1hdDQgPSBtYXQyOworCisgIHZhbCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQzKGksaixrKSwgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoaSxqLGspLCB2YWwpOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBtYXQxLnNldFplcm8oKTsKKyAgbWF0Mi5zZXRaZXJvKCk7CisgIG1hdDEgPSBtYXQzOworICBtYXQyID0gbWF0NDsKKworICB2YWwgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MShpLGosayksIHZhbCk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQyKGksaixrKSwgdmFsKTsKKyAgICAgICAgdmFsKys7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2FtZV90eXBlKCkKK3sKKyAgVGVuc29yPGludCwgMT4gb3JpZ190ZW5zb3IoNSk7CisgIFRlbnNvcjxpbnQsIDE+IGRlc3RfdGVuc29yKDUpOworICBvcmlnX3RlbnNvci5zZXRSYW5kb20oKTsKKyAgZGVzdF90ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIGludCogb3JpZ19kYXRhID0gb3JpZ190ZW5zb3IuZGF0YSgpOworICBpbnQqIGRlc3RfZGF0YSA9IGRlc3RfdGVuc29yLmRhdGEoKTsKKyAgZGVzdF90ZW5zb3IgPSBvcmlnX3RlbnNvcjsKKyAgVkVSSUZZX0lTX0VRVUFMKG9yaWdfdGVuc29yLmRhdGEoKSwgb3JpZ19kYXRhKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGRlc3RfdGVuc29yLmRhdGEoKSwgZGVzdF9kYXRhKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoZGVzdF90ZW5zb3IoaSksIG9yaWdfdGVuc29yKGkpKTsKKyAgfQorCisgIFRlbnNvckZpeGVkU2l6ZTxpbnQsIFNpemVzPDU+ID4gb3JpZ19hcnJheTsKKyAgVGVuc29yRml4ZWRTaXplPGludCwgU2l6ZXM8NT4gPiBkZXN0X2FycmF5OworICBvcmlnX2FycmF5LnNldFJhbmRvbSgpOworICBkZXN0X2FycmF5LnNldFJhbmRvbSgpOworICBvcmlnX2RhdGEgPSBvcmlnX2FycmF5LmRhdGEoKTsKKyAgZGVzdF9kYXRhID0gZGVzdF9hcnJheS5kYXRhKCk7CisgIGRlc3RfYXJyYXkgPSBvcmlnX2FycmF5OworICBWRVJJRllfSVNfRVFVQUwob3JpZ19hcnJheS5kYXRhKCksIG9yaWdfZGF0YSk7CisgIFZFUklGWV9JU19FUVVBTChkZXN0X2FycmF5LmRhdGEoKSwgZGVzdF9kYXRhKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoZGVzdF9hcnJheShpKSwgb3JpZ19hcnJheShpKSk7CisgIH0KKworICBpbnQgb3JpZ1s1XSA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgaW50IGRlc3RbNV0gPSB7NiwgNywgOCwgOSwgMTB9OworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMT4gPiBvcmlnX21hcChvcmlnLCA1KTsKKyAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDE+ID4gZGVzdF9tYXAoZGVzdCwgNSk7CisgIG9yaWdfZGF0YSA9IG9yaWdfbWFwLmRhdGEoKTsKKyAgZGVzdF9kYXRhID0gZGVzdF9tYXAuZGF0YSgpOworICBkZXN0X21hcCA9IG9yaWdfbWFwOworICBWRVJJRllfSVNfRVFVQUwob3JpZ19tYXAuZGF0YSgpLCBvcmlnX2RhdGEpOworICBWRVJJRllfSVNfRVFVQUwoZGVzdF9tYXAuZGF0YSgpLCBkZXN0X2RhdGEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChkZXN0W2ldLCBpKzEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXV0b19yZXNpemUoKQoreworICBUZW5zb3I8aW50LCAxPiB0ZW5zb3IxOworICBUZW5zb3I8aW50LCAxPiB0ZW5zb3IyKDMpOworICBUZW5zb3I8aW50LCAxPiB0ZW5zb3IzKDUpOworICBUZW5zb3I8aW50LCAxPiB0ZW5zb3I0KDcpOworCisgIFRlbnNvcjxpbnQsIDE+IG5ld190ZW5zb3IoNSk7CisgIG5ld190ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgdGVuc29yMSA9IHRlbnNvcjIgPSB0ZW5zb3IzID0gdGVuc29yNCA9IG5ld190ZW5zb3I7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEuZGltZW5zaW9uKDApLCBuZXdfdGVuc29yLmRpbWVuc2lvbigwKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IyLmRpbWVuc2lvbigwKSwgbmV3X3RlbnNvci5kaW1lbnNpb24oMCkpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yMy5kaW1lbnNpb24oMCksIG5ld190ZW5zb3IuZGltZW5zaW9uKDApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjQuZGltZW5zaW9uKDApLCBuZXdfdGVuc29yLmRpbWVuc2lvbigwKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3X3RlbnNvci5kaW1lbnNpb24oMCk7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGkpLCBuZXdfdGVuc29yKGkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMihpKSwgbmV3X3RlbnNvcihpKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjMoaSksIG5ld190ZW5zb3IoaSkpOworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3I0KGkpLCBuZXdfdGVuc29yKGkpKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfY29tcG91bmRfYXNzaWduKCkKK3sKKyAgVGVuc29yPGludCwgMT4gc3RhcnRfdGVuc29yKDEwKTsKKyAgVGVuc29yPGludCwgMT4gb2Zmc2V0X3RlbnNvcigxMCk7CisgIHN0YXJ0X3RlbnNvci5zZXRSYW5kb20oKTsKKyAgb2Zmc2V0X3RlbnNvci5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8aW50LCAxPiB0ZW5zb3IgPSBzdGFydF90ZW5zb3I7CisgIHRlbnNvciArPSBvZmZzZXRfdGVuc29yOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGkpLCBzdGFydF90ZW5zb3IoaSkgKyBvZmZzZXRfdGVuc29yKGkpKTsKKyAgfQorCisgIHRlbnNvciA9IHN0YXJ0X3RlbnNvcjsKKyAgdGVuc29yIC09IG9mZnNldF90ZW5zb3I7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSksIHN0YXJ0X3RlbnNvcihpKSAtIG9mZnNldF90ZW5zb3IoaSkpOworICB9CisKKyAgdGVuc29yID0gc3RhcnRfdGVuc29yOworICB0ZW5zb3IgKj0gb2Zmc2V0X3RlbnNvcjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpKSwgc3RhcnRfdGVuc29yKGkpICogb2Zmc2V0X3RlbnNvcihpKSk7CisgIH0KKworICB0ZW5zb3IgPSBzdGFydF90ZW5zb3I7CisgIHRlbnNvciAvPSBvZmZzZXRfdGVuc29yOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGkpLCBzdGFydF90ZW5zb3IoaSkgLyBvZmZzZXRfdGVuc29yKGkpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X3N0ZF9pbml0aWFsaXplcnNfdGVuc29yKCkgeworI2lmIEVJR0VOX0hBU19WQVJJQURJQ19URU1QTEFURVMKKyAgVGVuc29yPGludCwgMT4gYSgzKTsKKyAgYS5zZXRWYWx1ZXMoezAsIDEsIDJ9KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoMCksIDApOworICBWRVJJRllfSVNfRVFVQUwoYSgxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChhKDIpLCAyKTsKKworICAvLyBJdCBmaWxscyB0aGUgdG9wLWxlZnQgc2xpY2UuCisgIGEuc2V0VmFsdWVzKHsxMCwgMjB9KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoMCksIDEwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoMSksIDIwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoMiksIDIpOworCisgIC8vIENoYWluaW5nLgorICBUZW5zb3I8aW50LCAxPiBhMigzKTsKKyAgYTIgPSBhLnNldFZhbHVlcyh7MTAwLCAyMDAsIDMwMH0pOworICBWRVJJRllfSVNfRVFVQUwoYSgwKSwgMTAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoMSksIDIwMCk7CisgIFZFUklGWV9JU19FUVVBTChhKDIpLCAzMDApOworICBWRVJJRllfSVNfRVFVQUwoYTIoMCksIDEwMCk7CisgIFZFUklGWV9JU19FUVVBTChhMigxKSwgMjAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEyKDIpLCAzMDApOworCisgIFRlbnNvcjxpbnQsIDI+IGIoMiwgMyk7CisgIGIuc2V0VmFsdWVzKHt7MCwgMSwgMn0sIHszLCA0LCA1fX0pOworICBWRVJJRllfSVNfRVFVQUwoYigwLCAwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChiKDAsIDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGIoMCwgMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwoYigxLCAwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChiKDEsIDEpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGIoMSwgMiksIDUpOworCisgIC8vIEl0IGZpbGxzIHRoZSB0b3AtbGVmdCBzbGljZS4KKyAgYi5zZXRWYWx1ZXMoe3sxMCwgMjB9LCB7MzB9fSk7CisgIFZFUklGWV9JU19FUVVBTChiKDAsIDApLCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChiKDAsIDEpLCAyMCk7CisgIFZFUklGWV9JU19FUVVBTChiKDAsIDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGIoMSwgMCksIDMwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGIoMSwgMSksIDQpOworICBWRVJJRllfSVNfRVFVQUwoYigxLCAyKSwgNSk7CisKKyAgRWlnZW46OlRlbnNvcjxpbnQsIDM+IGMoMywgMiwgNCk7CisgIGMuc2V0VmFsdWVzKHt7ezAsIDEsIDIsIDN9LCB7NCwgNSwgNiwgN319LAorICAgICAgICAgICAgICAge3sxMCwgMTEsIDEyLCAxM30sIHsxNCwgMTUsIDE2LCAxN319LAorICAgICAgICAgICAgICAge3syMCwgMjEsIDIyLCAyM30sIHsyNCwgMjUsIDI2LCAyN319fSk7CisgIFZFUklGWV9JU19FUVVBTChjKDAsIDAsIDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGMoMCwgMCwgMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoYygwLCAwLCAyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjKDAsIDAsIDMpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGMoMCwgMSwgMCksIDQpOworICBWRVJJRllfSVNfRVFVQUwoYygwLCAxLCAxKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChjKDAsIDEsIDIpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGMoMCwgMSwgMyksIDcpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAwLCAwKSwgMTApOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAwLCAxKSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAwLCAyKSwgMTIpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAwLCAzKSwgMTMpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAxLCAwKSwgMTQpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAxLCAxKSwgMTUpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAxLCAyKSwgMTYpOworICBWRVJJRllfSVNfRVFVQUwoYygxLCAxLCAzKSwgMTcpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAwLCAwKSwgMjApOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAwLCAxKSwgMjEpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAwLCAyKSwgMjIpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAwLCAzKSwgMjMpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAxLCAwKSwgMjQpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAxLCAxKSwgMjUpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAxLCAyKSwgMjYpOworICBWRVJJRllfSVNfRVFVQUwoYygyLCAxLCAzKSwgMjcpOworI2VuZGlmICAvLyBFSUdFTl9IQVNfVkFSSUFESUNfVEVNUExBVEVTCit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfYXNzaWduKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzJkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8zZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2FtZV90eXBlKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hdXRvX3Jlc2l6ZSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29tcG91bmRfYXNzaWduKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdGRfaW5pdGlhbGl6ZXJzX3RlbnNvcigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdF9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdF9zeWNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjAxYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0X3N5Y2wuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2CisvLyBNZWhkaSBHb2xpICAgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIFJhbHBoIFBvdHRlciAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gTHVrZSBJd2Fuc2tpICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBDb250YWN0OiA8ZWlnZW5AY29kZXBsYXkuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3JfYnJvYWRjYXN0X3N5Y2wKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIGludAorI2RlZmluZSBFSUdFTl9VU0VfU1lDTAorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OmFycmF5OwordXNpbmcgRWlnZW46OlN5Y2xEZXZpY2U7Cit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OlRlbnNvck1hcDsKKworc3RhdGljIHZvaWQgdGVzdF9icm9hZGNhc3Rfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpeworCisgIC8vIEJST0FEQ0FTVCB0ZXN0OgorICBhcnJheTxpbnQsIDQ+IGluX3JhbmdlICAgPSB7ezIsIDMsIDUsIDd9fTsKKyAgYXJyYXk8aW50LCA0PiBicm9hZGNhc3RzID0ge3syLCAzLCAxLCA0fX07CisgIGFycmF5PGludCwgND4gb3V0X3JhbmdlOyAgLy8gPSBpbl9yYW5nZSAqIGJyb2FkY2FzdHMKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfcmFuZ2Uuc2l6ZSgpOyArK2kpCisgICAgb3V0X3JhbmdlW2ldID0gaW5fcmFuZ2VbaV0gKiBicm9hZGNhc3RzW2ldOworCisgIFRlbnNvcjxmbG9hdCwgND4gIGlucHV0KGluX3JhbmdlKTsKKyAgVGVuc29yPGZsb2F0LCA0PiBvdXQob3V0X3JhbmdlKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluX3JhbmdlLnNpemUoKTsgKytpKQorICAgIFZFUklGWV9JU19FUVVBTChvdXQuZGltZW5zaW9uKGkpLCBvdXRfcmFuZ2VbaV0pOworCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7ICsraSkKKyAgICBpbnB1dChpKSA9IHN0YXRpY19jYXN0PGZsb2F0PihpKTsKKworICBmbG9hdCAqIGdwdV9pbl9kYXRhICA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKyAgZmxvYXQgKiBncHVfb3V0X2RhdGEgID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA0Pj4gIGdwdV9pbihncHVfaW5fZGF0YSwgaW5fcmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA0Pj4gZ3B1X291dChncHVfb3V0X2RhdGEsIG91dF9yYW5nZSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fZGF0YSwgaW5wdXQuZGF0YSgpLChpbnB1dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihmbG9hdCkpOworICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4uYnJvYWRjYXN0KGJyb2FkY2FzdHMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDI4OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKGlucHV0KGklMixqJTMsayU1LGwlNyksIG91dChpLGosayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJCcm9hZGNhc3QgVGVzdCBQYXNzZWRcbiIpOworICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOworfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2Jyb2FkY2FzdF9zeWNsKCkgeworICBjbDo6c3ljbDo6Z3B1X3NlbGVjdG9yIHM7CisgIEVpZ2VuOjpTeWNsRGV2aWNlIHN5Y2xfZGV2aWNlKHMpOworICBDQUxMX1NVQlRFU1QodGVzdF9icm9hZGNhc3Rfc3ljbChzeWNsX2RldmljZSkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0aW5nLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZWE1OAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdGluZy5jcHAKQEAgLTAsMCArMSwxOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZygpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIGFycmF5PHB0cmRpZmZfdCwgND4gYnJvYWRjYXN0czsKKyAgYnJvYWRjYXN0c1swXSA9IDE7CisgIGJyb2FkY2FzdHNbMV0gPSAxOworICBicm9hZGNhc3RzWzJdID0gMTsKKyAgYnJvYWRjYXN0c1szXSA9IDE7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBub19icm9hZGNhc3Q7CisgIG5vX2Jyb2FkY2FzdCA9IHRlbnNvci5icm9hZGNhc3QoYnJvYWRjYXN0cyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKG5vX2Jyb2FkY2FzdC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobm9fYnJvYWRjYXN0LmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChub19icm9hZGNhc3QuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG5vX2Jyb2FkY2FzdC5kaW1lbnNpb24oMyksIDcpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fYnJvYWRjYXN0KGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGJyb2FkY2FzdHNbMF0gPSAyOworICBicm9hZGNhc3RzWzFdID0gMzsKKyAgYnJvYWRjYXN0c1syXSA9IDE7CisgIGJyb2FkY2FzdHNbM10gPSA0OworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGJyb2FkY2FzdDsKKyAgYnJvYWRjYXN0ID0gdGVuc29yLmJyb2FkY2FzdChicm9hZGNhc3RzKTsKKworICBWRVJJRllfSVNfRVFVQUwoYnJvYWRjYXN0LmRpbWVuc2lvbigwKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDEpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJyb2FkY2FzdC5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwoYnJvYWRjYXN0LmRpbWVuc2lvbigzKSwgMjgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMjg7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSUyLGolMyxrJTUsbCU3KSwgYnJvYWRjYXN0KGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfdmVjdG9yaXplZF9icm9hZGNhc3RpbmcoKQoreworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcig4LDMsNSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYXJyYXk8cHRyZGlmZl90LCAzPiBicm9hZGNhc3RzOworICBicm9hZGNhc3RzWzBdID0gMjsKKyAgYnJvYWRjYXN0c1sxXSA9IDM7CisgIGJyb2FkY2FzdHNbMl0gPSA0OworCisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gYnJvYWRjYXN0OworICBicm9hZGNhc3QgPSB0ZW5zb3IuYnJvYWRjYXN0KGJyb2FkY2FzdHMpOworCisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDApLCAxNik7CisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDEpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJyb2FkY2FzdC5kaW1lbnNpb24oMiksIDIwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyMDsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSU4LGolMyxrJTUpLCBicm9hZGNhc3QoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZW5zb3IucmVzaXplKDExLDMsNSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYnJvYWRjYXN0ID0gdGVuc29yLmJyb2FkY2FzdChicm9hZGNhc3RzKTsKKworICBWRVJJRllfSVNfRVFVQUwoYnJvYWRjYXN0LmRpbWVuc2lvbigwKSwgMjIpOworICBWRVJJRllfSVNfRVFVQUwoYnJvYWRjYXN0LmRpbWVuc2lvbigxKSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDIpLCAyMCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjA7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGklMTEsaiUzLGslNSksIGJyb2FkY2FzdChpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc3RhdGljX2Jyb2FkY2FzdGluZygpCit7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yKDgsMyw1KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisjaWYgRUlHRU5fSEFTX0NPTlNURVhQUgorICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPiwgRWlnZW46OnR5cGUyaW5kZXg8ND4+IGJyb2FkY2FzdHM7CisjZWxzZQorICBFaWdlbjo6YXJyYXk8aW50LCAzPiBicm9hZGNhc3RzOworICBicm9hZGNhc3RzWzBdID0gMjsKKyAgYnJvYWRjYXN0c1sxXSA9IDM7CisgIGJyb2FkY2FzdHNbMl0gPSA0OworI2VuZGlmCisKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBicm9hZGNhc3Q7CisgIGJyb2FkY2FzdCA9IHRlbnNvci5icm9hZGNhc3QoYnJvYWRjYXN0cyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGJyb2FkY2FzdC5kaW1lbnNpb24oMCksIDE2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJyb2FkY2FzdC5kaW1lbnNpb24oMSksIDkpOworICBWRVJJRllfSVNfRVFVQUwoYnJvYWRjYXN0LmRpbWVuc2lvbigyKSwgMjApOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDIwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpJTgsaiUzLGslNSksIGJyb2FkY2FzdChpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlbnNvci5yZXNpemUoMTEsMyw1KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICBicm9hZGNhc3QgPSB0ZW5zb3IuYnJvYWRjYXN0KGJyb2FkY2FzdHMpOworCisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDApLCAyMik7CisgIFZFUklGWV9JU19FUVVBTChicm9hZGNhc3QuZGltZW5zaW9uKDEpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJyb2FkY2FzdC5kaW1lbnNpb24oMiksIDIwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDIyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyMDsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSUxMSxqJTMsayU1KSwgYnJvYWRjYXN0KGksaixrKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9maXhlZF9zaXplX2Jyb2FkY2FzdGluZygpCit7CisgIC8vIE5lZWQgdG8gYWRkIGEgW10gb3BlcmF0b3IgdG8gdGhlIFNpemUgY2xhc3MgZm9yIHRoaXMgdG8gd29yaworI2lmIDAKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB0MSgxMCk7CisgIHQxLnNldFJhbmRvbSgpOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDE+LCBEYXRhTGF5b3V0PiB0MjsKKyAgdDIgPSB0Mi5jb25zdGFudCgyMC4wZik7CisKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB0MyA9IHQxICsgdDIuYnJvYWRjYXN0KEVpZ2VuOjphcnJheTxpbnQsIDE+e3sxMH19KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0MyhpKSwgdDEoaSkgKyB0MigwKSk7CisgIH0KKworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwxPiwgRGF0YUxheW91dD4gPiB0NCh0Mi5kYXRhKCksIHt7MX19KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB0NSA9IHQxICsgdDQuYnJvYWRjYXN0KEVpZ2VuOjphcnJheTxpbnQsIDE+e3sxMH19KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0NShpKSwgdDEoaSkgKyB0MigwKSk7CisgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0aW5nKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZzxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9icm9hZGNhc3Rpbmc8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF92ZWN0b3JpemVkX2Jyb2FkY2FzdGluZzxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3ZlY3Rvcml6ZWRfYnJvYWRjYXN0aW5nPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RhdGljX2Jyb2FkY2FzdGluZzxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3N0YXRpY19icm9hZGNhc3Rpbmc8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9maXhlZF9zaXplX2Jyb2FkY2FzdGluZzxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2ZpeGVkX3NpemVfYnJvYWRjYXN0aW5nPFJvd01ham9yPigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9jdWRhLmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2FzdF9mbG9hdDE2X2N1ZGEuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMjMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9jdWRhLmN1CkBAIC0wLDAgKzEsODIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9jdWRhCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordm9pZCB0ZXN0X2N1ZGFfY29udmVyc2lvbigpIHsKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisgIGludCBudW1fZWxlbSA9IDEwMTsKKworICBUZW5zb3I8ZmxvYXQsIDE+IGZsb2F0cyhudW1fZWxlbSk7CisgIGZsb2F0cy5zZXRSYW5kb20oKTsKKworICBmbG9hdCogZF9mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBFaWdlbjo6aGFsZiogZF9oYWxmID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGZsb2F0KiBkX2NvbnYgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAorICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2hhbGYoCisgICAgICBkX2hhbGYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9jb252KAorICAgICAgZF9jb252LCBudW1fZWxlbSk7CisKKyAgZ3B1X2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9mbG9hdCwgZmxvYXRzLmRhdGEoKSwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisKKyAgZ3B1X2hhbGYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmhhbGY+KCk7CisgIGdwdV9jb252LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9oYWxmLmNhc3Q8ZmxvYXQ+KCk7CisKKyAgVGVuc29yPGZsb2F0LCAxPiBpbml0aWFsKG51bV9lbGVtKTsKKyAgVGVuc29yPGZsb2F0LCAxPiBmaW5hbChudW1fZWxlbSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGluaXRpYWwuZGF0YSgpLCBkX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZmluYWwuZGF0YSgpLCBkX2NvbnYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChpbml0aWFsKGkpLCBmaW5hbChpKSk7CisgIH0KKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9mbG9hdCk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2hhbGYpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9jb252KTsKK30KKworCit2b2lkIHRlc3RfZmFsbGJhY2tfY29udmVyc2lvbigpIHsKKyAgaW50IG51bV9lbGVtID0gMTAxOworICBUZW5zb3I8ZmxvYXQsIDE+IGZsb2F0cyhudW1fZWxlbSk7CisgIGZsb2F0cy5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiBoYWxmcyA9IGZsb2F0cy5jYXN0PEVpZ2VuOjpoYWxmPigpOworICBFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiBjb252ID0gaGFsZnMuY2FzdDxmbG9hdD4oKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0cyhpKSwgY29udihpKSk7CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9jdWRhKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY3VkYV9jb252ZXJzaW9uKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9mYWxsYmFja19jb252ZXJzaW9uKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2FzdHMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2FzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmQwZDIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jYXN0cy5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6YXJyYXk7CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Nhc3QoKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsMzApOworICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMC5mOworICBUZW5zb3I8Y2hhciwgMj4gY2hhcnRlbnNvcigyMCwzMCk7CisgIGNoYXJ0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAyPiBjcGxleHRlbnNvcigyMCwzMCk7CisgIGNwbGV4dGVuc29yLnNldFJhbmRvbSgpOworCisgIGNoYXJ0ZW5zb3IgPSBmdGVuc29yLmNhc3Q8Y2hhcj4oKTsKKyAgY3BsZXh0ZW5zb3IgPSBmdGVuc29yLmNhc3Q8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMDsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoY2hhcnRlbnNvcihpLGopLCBzdGF0aWNfY2FzdDxjaGFyPihmdGVuc29yKGksaikpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChjcGxleHRlbnNvcihpLGopLCBzdGF0aWNfY2FzdDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oZnRlbnNvcihpLGopKSk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JpemVkX2Nhc3QoKQoreworICBUZW5zb3I8aW50LCAyPiBpdGVuc29yKDIwLDMwKTsKKyAgaXRlbnNvciA9IGl0ZW5zb3IucmFuZG9tKCkgLyAxMDAwOworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsMzApOworICBmdGVuc29yLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZG91YmxlLCAyPiBkdGVuc29yKDIwLDMwKTsKKyAgZHRlbnNvci5zZXRSYW5kb20oKTsKKworICBmdGVuc29yID0gaXRlbnNvci5jYXN0PGZsb2F0PigpOworICBkdGVuc29yID0gaXRlbnNvci5jYXN0PGRvdWJsZT4oKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDMwOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChpdGVuc29yKGksaiksIHN0YXRpY19jYXN0PGludD4oZnRlbnNvcihpLGopKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoZHRlbnNvcihpLGopLCBzdGF0aWNfY2FzdDxkb3VibGU+KGZ0ZW5zb3IoaSxqKSkpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfZmxvYXRfdG9faW50X2Nhc3QoKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsMzApOworICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMDAuMGY7CisgIFRlbnNvcjxkb3VibGUsIDI+IGR0ZW5zb3IoMjAsMzApOworICBkdGVuc29yID0gZHRlbnNvci5yYW5kb20oKSAqIDEwMDAuMDsKKworICBUZW5zb3I8aW50LCAyPiBpMXRlbnNvciA9IGZ0ZW5zb3IuY2FzdDxpbnQ+KCk7CisgIFRlbnNvcjxpbnQsIDI+IGkydGVuc29yID0gZHRlbnNvci5jYXN0PGludD4oKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDMwOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChpMXRlbnNvcihpLGopLCBzdGF0aWNfY2FzdDxpbnQ+KGZ0ZW5zb3IoaSxqKSkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKGkydGVuc29yKGksaiksIHN0YXRpY19jYXN0PGludD4oZHRlbnNvcihpLGopKSk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9iaWdfdG9fc21hbGxfdHlwZV9jYXN0KCkKK3sKKyAgVGVuc29yPGRvdWJsZSwgMj4gZHRlbnNvcigyMCwgMzApOworICBkdGVuc29yLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsIDMwKTsKKyAgZnRlbnNvciA9IGR0ZW5zb3IuY2FzdDxmbG9hdD4oKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDMwOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1goZHRlbnNvcihpLGopLCBzdGF0aWNfY2FzdDxkb3VibGU+KGZ0ZW5zb3IoaSxqKSkpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3Rfc21hbGxfdG9fYmlnX3R5cGVfY2FzdCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwgMzApOworICBmdGVuc29yLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZG91YmxlLCAyPiBkdGVuc29yKDIwLCAzMCk7CisgIGR0ZW5zb3IgPSBmdGVuc29yLmNhc3Q8ZG91YmxlPigpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzA7ICsraikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkdGVuc29yKGksaiksIHN0YXRpY19jYXN0PGRvdWJsZT4oZnRlbnNvcihpLGopKSk7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9jYXN0cygpCit7CisgICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfY2FzdCgpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X3ZlY3Rvcml6ZWRfY2FzdCgpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X2Zsb2F0X3RvX2ludF9jYXN0KCkpOworICAgQ0FMTF9TVUJURVNUKHRlc3RfYmlnX3RvX3NtYWxsX3R5cGVfY2FzdCgpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X3NtYWxsX3RvX2JpZ190eXBlX2Nhc3QoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jaGlwcGluZy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jaGlwcGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzMmRlYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NoaXBwaW5nLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9jaGlwKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNywxMSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGNoaXAxOworICBjaGlwMSA9IHRlbnNvci50ZW1wbGF0ZSBjaGlwPDA+KDEpOworCisgIFZFUklGWV9JU19FUVVBTChjaGlwMS5kaW1lbnNpb24oMCksIDMpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDEuZGltZW5zaW9uKDEpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxLmRpbWVuc2lvbigyKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMS5kaW1lbnNpb24oMyksIDExKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSxqLGssbCksIHRlbnNvcigxLGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDIgPSB0ZW5zb3IudGVtcGxhdGUgY2hpcDwxPigxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMi5kaW1lbnNpb24oMSksIDUpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDIuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigzKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDIoaSxqLGssbCksIHRlbnNvcihpLDEsaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDMgPSB0ZW5zb3IudGVtcGxhdGUgY2hpcDwyPigyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMy5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDMuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRpbWVuc2lvbigzKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSxqLGssbCksIHRlbnNvcihpLGosMixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDQodGVuc29yLnRlbXBsYXRlIGNoaXA8Mz4oNSkpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDQuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0LmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChjaGlwNC5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDQuZGltZW5zaW9uKDMpLCAxMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssNSxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGNoaXA1KHRlbnNvci50ZW1wbGF0ZSBjaGlwPDQ+KDcpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwNS5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDUuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1LmRpbWVuc2lvbigzKSwgNyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssbCw3KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfY2hpcCgpCit7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcsMTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBjaGlwMTsKKyAgY2hpcDEgPSB0ZW5zb3IuY2hpcCgxLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMS5kaW1lbnNpb24oMSksIDUpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDEuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxLmRpbWVuc2lvbigzKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSxqLGssbCksIHRlbnNvcigxLGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDIgPSB0ZW5zb3IuY2hpcCgxLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMi5kaW1lbnNpb24oMSksIDUpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDIuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigzKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDIoaSxqLGssbCksIHRlbnNvcihpLDEsaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDMgPSB0ZW5zb3IuY2hpcCgyLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwMy5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDMuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRpbWVuc2lvbigzKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSxqLGssbCksIHRlbnNvcihpLGosMixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDQodGVuc29yLmNoaXAoNSwgMykpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDQuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0LmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChjaGlwNC5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDQuZGltZW5zaW9uKDMpLCAxMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssNSxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGNoaXA1KHRlbnNvci5jaGlwKDcsIDQpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjaGlwNS5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDUuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1LmRpbWVuc2lvbigzKSwgNyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssbCw3KSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2NoaXBfaW5fZXhwcigpIHsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dDEoMiwzLDUsNywxMSk7CisgIGlucHV0MS5zZXRSYW5kb20oKTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDIoMyw1LDcsMTEpOworICBpbnB1dDIuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiByZXN1bHQgPSBpbnB1dDEudGVtcGxhdGUgY2hpcDwwPigwKSArIGlucHV0MjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7CisgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dDEoMCxpLGosayxsKSArIGlucHV0MihpLGosayxsKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrLGwpLCBleHBlY3RlZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IGlucHV0MygzLDcsMTEpOworICBpbnB1dDMuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gcmVzdWx0MiA9IGlucHV0MS50ZW1wbGF0ZSBjaGlwPDA+KDApLnRlbXBsYXRlIGNoaXA8MT4oMikgKyBpbnB1dDM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA3OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTE7ICsraykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGlucHV0MSgwLGksMixqLGspICsgaW5wdXQzKGksaixrKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDIoaSxqLGspLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9jaGlwX2FzX2x2YWx1ZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gaW5wdXQxKDIsMyw1LDcsMTEpOworICBpbnB1dDEuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDIoMyw1LDcsMTEpOworICBpbnB1dDIuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdGVuc29yID0gaW5wdXQxOworICB0ZW5zb3IudGVtcGxhdGUgY2hpcDwwPigxKSA9IGlucHV0MjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICAgICAgICAgIGlmIChpICE9IDEpIHsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MihqLGssbCxtKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDMoMiw1LDcsMTEpOworICBpbnB1dDMuc2V0UmFuZG9tKCk7CisgIHRlbnNvciA9IGlucHV0MTsKKyAgdGVuc29yLnRlbXBsYXRlIGNoaXA8MT4oMSkgPSBpbnB1dDM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMTsgKyttKSB7CisgICAgICAgICAgICBpZiAoaiAhPSAxKSB7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQxKGksaixrLGwsbSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDMoaSxrLGwsbSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQ0KDIsMyw3LDExKTsKKyAgaW5wdXQ0LnNldFJhbmRvbSgpOworICB0ZW5zb3IgPSBpbnB1dDE7CisgIHRlbnNvci50ZW1wbGF0ZSBjaGlwPDI+KDMpID0gaW5wdXQ0OworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTE7ICsrbSkgeworICAgICAgICAgICAgaWYgKGsgIT0gMykgeworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQ0KGksaixsLG0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0NSgyLDMsNSwxMSk7CisgIGlucHV0NS5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gaW5wdXQxOworICB0ZW5zb3IudGVtcGxhdGUgY2hpcDwzPig0KSA9IGlucHV0NTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICAgICAgICAgIGlmIChsICE9IDQpIHsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0NShpLGosayxtKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDYoMiwzLDUsNyk7CisgIGlucHV0Ni5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gaW5wdXQxOworICB0ZW5zb3IudGVtcGxhdGUgY2hpcDw0Pig1KSA9IGlucHV0NjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICAgICAgICAgIGlmIChtICE9IDUpIHsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0NihpLGosayxsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dDcoMiwzLDUsNywxMSk7CisgIGlucHV0Ny5zZXRSYW5kb20oKTsKKyAgdGVuc29yID0gaW5wdXQxOworICB0ZW5zb3IuY2hpcCgwLCAwKSA9IGlucHV0Ny5jaGlwKDAsIDApOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTE7ICsrbSkgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQ3KGksaixrLGwsbSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NoaXBfcmF3X2RhdGFfY29sX21ham9yKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA1LCBDb2xNYWpvcj4gdGVuc29yKDIsMyw1LDcsMTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8ND4oMykpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3I0OworICBhdXRvIGNoaXAgPSBFdmFsdWF0b3I0KHRlbnNvci5jaGlwPDQ+KDMpLCBEZWZhdWx0RGV2aWNlKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIGludCBjaGlwX2luZGV4ID0gaSArIDIgKiAoaiArIDMgKiAoayArIDUgKiBsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAuZGF0YSgpW2NoaXBfaW5kZXhdLCB0ZW5zb3IoaSxqLGssbCwzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZSh0ZW5zb3IuY2hpcDwwPigwKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjA7CisgIGF1dG8gY2hpcDAgPSBFdmFsdWF0b3IwKHRlbnNvci5jaGlwPDA+KDApLCBEZWZhdWx0RGV2aWNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDAuZGF0YSgpLCBzdGF0aWNfY2FzdDxmbG9hdCo+KDApKTsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZSh0ZW5zb3IuY2hpcDwxPigwKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjE7CisgIGF1dG8gY2hpcDEgPSBFdmFsdWF0b3IxKHRlbnNvci5jaGlwPDE+KDApLCBEZWZhdWx0RGV2aWNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDEuZGF0YSgpLCBzdGF0aWNfY2FzdDxmbG9hdCo+KDApKTsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZSh0ZW5zb3IuY2hpcDwyPigwKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjI7CisgIGF1dG8gY2hpcDIgPSBFdmFsdWF0b3IyKHRlbnNvci5jaGlwPDI+KDApLCBEZWZhdWx0RGV2aWNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDIuZGF0YSgpLCBzdGF0aWNfY2FzdDxmbG9hdCo+KDApKTsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZSh0ZW5zb3IuY2hpcDwzPigwKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjM7CisgIGF1dG8gY2hpcDMgPSBFdmFsdWF0b3IzKHRlbnNvci5jaGlwPDM+KDApLCBEZWZhdWx0RGV2aWNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoY2hpcDMuZGF0YSgpLCBzdGF0aWNfY2FzdDxmbG9hdCo+KDApKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jaGlwX3Jhd19kYXRhX3Jvd19tYWpvcigpCit7CisgIFRlbnNvcjxmbG9hdCwgNSwgUm93TWFqb3I+IHRlbnNvcigxMSw3LDUsMywyKTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKHRlbnNvci5jaGlwPDA+KDMpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yMDsKKyAgYXV0byBjaGlwID0gRXZhbHVhdG9yMCh0ZW5zb3IuY2hpcDwwPigzKSwgRGVmYXVsdERldmljZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAyOyArK2wpIHsKKyAgICAgICAgICBpbnQgY2hpcF9pbmRleCA9IGwgKyAyICogKGsgKyAzICogKGogKyA1ICogaSkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwLmRhdGEoKVtjaGlwX2luZGV4XSwgdGVuc29yKDMsaSxqLGssbCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8MT4oMCkpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3IxOworICBhdXRvIGNoaXAxID0gRXZhbHVhdG9yMSh0ZW5zb3IuY2hpcDwxPigwKSwgRGVmYXVsdERldmljZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxLmRhdGEoKSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPigwKSk7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8Mj4oMCkpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3IyOworICBhdXRvIGNoaXAyID0gRXZhbHVhdG9yMih0ZW5zb3IuY2hpcDwyPigwKSwgRGVmYXVsdERldmljZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPigwKSk7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8Mz4oMCkpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3IzOworICBhdXRvIGNoaXAzID0gRXZhbHVhdG9yMyh0ZW5zb3IuY2hpcDwzPigwKSwgRGVmYXVsdERldmljZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPigwKSk7CisKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8ND4oMCkpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3I0OworICBhdXRvIGNoaXA0ID0gRXZhbHVhdG9yNCh0ZW5zb3IuY2hpcDw0PigwKSwgRGVmYXVsdERldmljZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0LmRhdGEoKSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPigwKSk7Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY2hpcHBpbmcoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfY2hpcDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9jaGlwPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZHluYW1pY19jaGlwPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZHluYW1pY19jaGlwPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY2hpcF9pbl9leHByPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY2hpcF9pbl9leHByPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY2hpcF9hc19sdmFsdWU8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jaGlwX2FzX2x2YWx1ZTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NoaXBfcmF3X2RhdGFfY29sX21ham9yKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jaGlwX3Jhd19kYXRhX3Jvd19tYWpvcigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBhcmlzb25zLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBhcmlzb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWZmOGFlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29tcGFyaXNvbnMuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6Um93TWFqb3I7CisKK3N0YXRpYyB2b2lkIHRlc3Rfb3JkZXJpbmdzKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQxKDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQyKDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGx0KDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGxlKDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGd0KDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGdlKDIsMyw3KTsKKworICBtYXQxLnNldFJhbmRvbSgpOworICBtYXQyLnNldFJhbmRvbSgpOworCisgIGx0ID0gbWF0MSA8IG1hdDI7CisgIGxlID0gbWF0MSA8PSBtYXQyOworICBndCA9IG1hdDEgPiBtYXQyOworICBnZSA9IG1hdDEgPj0gbWF0MjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwobHQoaSxqLGspLCBtYXQxKGksaixrKSA8IG1hdDIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxlKGksaixrKSwgbWF0MShpLGosaykgPD0gbWF0MihpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoZ3QoaSxqLGspLCBtYXQxKGksaixrKSA+IG1hdDIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGdlKGksaixrKSwgbWF0MShpLGosaykgPj0gbWF0MihpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfZXF1YWxpdHkoKQoreworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDEoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwzLDcpOworCisgIG1hdDEuc2V0UmFuZG9tKCk7CisgIG1hdDIuc2V0UmFuZG9tKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIHsKKyAgICAgICAgICBtYXQyKGksaixrKSA9IG1hdDEoaSxqLGspOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yPGJvb2wsIDM+IGVxKDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IG5lKDIsMyw3KTsKKyAgZXEgPSAobWF0MSA9PSBtYXQyKTsKKyAgbmUgPSAobWF0MSAhPSBtYXQyKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXEoaSxqLGspLCBtYXQxKGksaixrKSA9PSBtYXQyKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChuZShpLGosayksIG1hdDEoaSxqLGspICE9IG1hdDIoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2NvbXBhcmlzb25zKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfb3JkZXJpbmdzKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9lcXVhbGl0eSgpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfY3VkYS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfY3VkYS5jdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGUxMTFmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29tcGxleF9jdWRhLmN1CkBAIC0wLDAgKzEsMTUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2NvbXBsZXgKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordm9pZCB0ZXN0X2N1ZGFfbnVsbGFyeSgpIHsKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEsIDAsIGludD4gaW4xKDIpOworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMCwgaW50PiBpbjIoMik7CisgIGluMS5zZXRSYW5kb20oKTsKKyAgaW4yLnNldFJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGZsb2F0X2J5dGVzID0gaW4xLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IGNvbXBsZXhfYnl0ZXMgPSBpbjEuc2l6ZSgpICogc2l6ZW9mKHN0ZDo6Y29tcGxleDxmbG9hdD4pOworCisgIHN0ZDo6Y29tcGxleDxmbG9hdD4qIGRfaW4xOworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBkX2luMjsKKyAgZmxvYXQqIGRfb3V0MjsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbjEpLCBjb21wbGV4X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbjIpLCBjb21wbGV4X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQyKSwgZmxvYXRfYnl0ZXMpOworICBjdWRhTWVtY3B5KGRfaW4xLCBpbjEuZGF0YSgpLCBjb21wbGV4X2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgY3VkYU1lbWNweShkX2luMiwgaW4yLmRhdGEoKSwgY29tcGxleF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEsIDAsIGludD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4xKAorICAgICAgZF9pbjEsIDIpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoCisgICAgICBkX2luMiwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQyKAorICAgICAgZF9vdXQyLCAyKTsKKworICBncHVfaW4xLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjEuY29uc3RhbnQoc3RkOjpjb21wbGV4PGZsb2F0PigzLjE0ZiwgMi43ZikpOworICBncHVfb3V0Mi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4yLmFicygpOworCisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAwLCBpbnQ+IG5ldzEoMik7CisgIFRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiBuZXcyKDIpOworCisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCBjb21wbGV4X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhuZXcyLmRhdGEoKSwgZF9vdXQyLCBmbG9hdF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG5ldzEoaSksIHN0ZDo6Y29tcGxleDxmbG9hdD4oMy4xNGYsIDIuN2YpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG5ldzIoaSksIHN0ZDo6YWJzKGluMihpKSkpOworICB9CisKKyAgY3VkYUZyZWUoZF9pbjEpOworICBjdWRhRnJlZShkX2luMik7CisgIGN1ZGFGcmVlKGRfb3V0Mik7Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9jdWRhX3N1bV9yZWR1Y3Rpb25zKCkgeworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1KjEwMjQpOworICBjb25zdCBpbnQgbnVtX2NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMj4gaW4obnVtX3Jvd3MsIG51bV9jb2xzKTsKKyAgaW4uc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDA+IGZ1bGxfcmVkdXg7CisgIGZ1bGxfcmVkdXggPSBpbi5zdW0oKTsKKworICBzdGQ6OnNpemVfdCBpbl9ieXRlcyA9IGluLnNpemUoKSAqIHNpemVvZihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gZnVsbF9yZWR1eC5zaXplKCkgKiBzaXplb2Yoc3RkOjpjb21wbGV4PGZsb2F0Pik7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4qIGdwdV9pbl9wdHIgPSBzdGF0aWNfY2FzdDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+Kj4oZ3B1X2RldmljZS5hbGxvY2F0ZShpbl9ieXRlcykpOworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBncHVfb3V0X3B0ciA9IHN0YXRpY19jYXN0PHN0ZDo6Y29tcGxleDxmbG9hdD4qPihncHVfZGV2aWNlLmFsbG9jYXRlKG91dF9ieXRlcykpOworICBncHVfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fcHRyLCBpbi5kYXRhKCksIGluX2J5dGVzKTsKKworICBUZW5zb3JNYXA8VGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDI+ID4gaW5fZ3B1KGdwdV9pbl9wdHIsIG51bV9yb3dzLCBudW1fY29scyk7CisgIFRlbnNvck1hcDxUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMD4gPiBvdXRfZ3B1KGdwdV9vdXRfcHRyKTsKKworICBvdXRfZ3B1LmRldmljZShncHVfZGV2aWNlKSA9IGluX2dwdS5zdW0oKTsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMD4gZnVsbF9yZWR1eF9ncHU7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9wdHIsIG91dF9ieXRlcyk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCisgIFZFUklGWV9JU19BUFBST1goZnVsbF9yZWR1eCgpLCBmdWxsX3JlZHV4X2dwdSgpKTsKKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX3B0cik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X3B0cik7Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9jdWRhX3Byb2R1Y3RfcmVkdWN0aW9ucygpIHsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBjb25zdCBpbnQgbnVtX3Jvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKKyAgY29uc3QgaW50IG51bV9jb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUqMTAyNCk7CisKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDI+IGluKG51bV9yb3dzLCBudW1fY29scyk7CisgIGluLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAwPiBmdWxsX3JlZHV4OworICBmdWxsX3JlZHV4ID0gaW4ucHJvZCgpOworCisgIHN0ZDo6c2l6ZV90IGluX2J5dGVzID0gaW4uc2l6ZSgpICogc2l6ZW9mKHN0ZDo6Y29tcGxleDxmbG9hdD4pOworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBmdWxsX3JlZHV4LnNpemUoKSAqIHNpemVvZihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KTsKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiogZ3B1X2luX3B0ciA9IHN0YXRpY19jYXN0PHN0ZDo6Y29tcGxleDxmbG9hdD4qPihncHVfZGV2aWNlLmFsbG9jYXRlKGluX2J5dGVzKSk7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4qIGdwdV9vdXRfcHRyID0gc3RhdGljX2Nhc3Q8c3RkOjpjb21wbGV4PGZsb2F0Pio+KGdwdV9kZXZpY2UuYWxsb2NhdGUob3V0X2J5dGVzKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9wdHIsIGluLmRhdGEoKSwgaW5fYnl0ZXMpOworCisgIFRlbnNvck1hcDxUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMj4gPiBpbl9ncHUoZ3B1X2luX3B0ciwgbnVtX3Jvd3MsIG51bV9jb2xzKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAwPiA+IG91dF9ncHUoZ3B1X291dF9wdHIpOworCisgIG91dF9ncHUuZGV2aWNlKGdwdV9kZXZpY2UpID0gaW5fZ3B1LnByb2QoKTsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMD4gZnVsbF9yZWR1eF9ncHU7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9wdHIsIG91dF9ieXRlcyk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCisgIFZFUklGWV9JU19BUFBST1goZnVsbF9yZWR1eCgpLCBmdWxsX3JlZHV4X2dwdSgpKTsKKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX3B0cik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X3B0cik7Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9jb21wbGV4KCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY3VkYV9udWxsYXJ5KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX3N1bV9yZWR1Y3Rpb25zKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX3Byb2R1Y3RfcmVkdWN0aW9ucygpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfY3dpc2Vfb3BzX2N1ZGEuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wbGV4X2N3aXNlX29wc19jdWRhLmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYWY1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wbGV4X2N3aXNlX29wc19jdWRhLmN1CkBAIC0wLDAgKzEsOTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3JfY29tcGxleF9jd2lzZV9vcHMKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9jdWRhX2NvbXBsZXhfY3dpc2Vfb3BzKCkgeworICBjb25zdCBpbnQga051bUl0ZW1zID0gMjsKKyAgc3RkOjpzaXplX3QgY29tcGxleF9ieXRlcyA9IGtOdW1JdGVtcyAqIHNpemVvZihzdGQ6OmNvbXBsZXg8VD4pOworCisgIHN0ZDo6Y29tcGxleDxUPiogZF9pbjE7CisgIHN0ZDo6Y29tcGxleDxUPiogZF9pbjI7CisgIHN0ZDo6Y29tcGxleDxUPiogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4xKSwgY29tcGxleF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4yKSwgY29tcGxleF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgY29tcGxleF9ieXRlcyk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoCisgICAgICBkX2luMSwga051bUl0ZW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoCisgICAgICBkX2luMiwga051bUl0ZW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoCisgICAgICBkX291dCwga051bUl0ZW1zKTsKKworICBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gYSgzLjE0ZiwgMi43Zik7CisgIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiBiKC0xMC42ZiwgMS40Zik7CisKKyAgZ3B1X2luMS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4xLmNvbnN0YW50KGEpOworICBncHVfaW4yLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjIuY29uc3RhbnQoYik7CisKKyAgZW51bSBDd2lzZU9wIHsKKyAgICBBZGQgPSAwLAorICAgIFN1YiwKKyAgICBNdWwsCisgICAgRGl2CisgIH07CisKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiBhY3R1YWwoa051bUl0ZW1zKTsKKyAgZm9yIChpbnQgb3AgPSBBZGQ7IG9wIDw9IERpdjsgb3ArKykgeworICAgIHN0ZDo6Y29tcGxleDxUPiBleHBlY3RlZDsKKyAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PEN3aXNlT3A+KG9wKSkgeworICAgICAgY2FzZSBBZGQ6CisgICAgICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMSArIGdwdV9pbjI7CisgICAgICAgIGV4cGVjdGVkID0gYSArIGI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTdWI6CisgICAgICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMSAtIGdwdV9pbjI7CisgICAgICAgIGV4cGVjdGVkID0gYSAtIGI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNdWw6CisgICAgICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMSAqIGdwdV9pbjI7CisgICAgICAgIGV4cGVjdGVkID0gYSAqIGI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEaXY6CisgICAgICAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMSAvIGdwdV9pbjI7CisgICAgICAgIGV4cGVjdGVkID0gYSAvIGI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKGFjdHVhbC5kYXRhKCksIGRfb3V0LCBjb21wbGV4X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlbXM7ICsraSkgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChhY3R1YWwoaSksIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KKworICBjdWRhRnJlZShkX2luMSk7CisgIGN1ZGFGcmVlKGRfaW4yKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY29tcGxleF9jd2lzZV9vcHMoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX2NvbXBsZXhfY3dpc2Vfb3BzPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY3VkYV9jb21wbGV4X2N3aXNlX29wczxkb3VibGU+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29uY2F0ZW5hdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25jYXRlbmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2VmMTJlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29uY2F0ZW5hdGlvbi5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9kaW1lbnNpb25fZmFpbHVyZXMoKQoreworICBUZW5zb3I8aW50LCAzLCBEYXRhTGF5b3V0PiBsZWZ0KDIsIDMsIDEpOworICBUZW5zb3I8aW50LCAzLCBEYXRhTGF5b3V0PiByaWdodCgzLCAzLCAxKTsKKyAgbGVmdC5zZXRSYW5kb20oKTsKKyAgcmlnaHQuc2V0UmFuZG9tKCk7CisKKyAgLy8gT2theTsgb3RoZXIgZGltZW5zaW9ucyBhcmUgZXF1YWwuCisgIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IGNvbmNhdGVuYXRpb24gPSBsZWZ0LmNvbmNhdGVuYXRlKHJpZ2h0LCAwKTsKKworICAvLyBEaW1lbnNpb24gbWlzbWF0Y2hlcy4KKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDEpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDIpKTsKKworICAvLyBBeGlzID4gTnVtRGltcyBvciA8IDAuCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbmNhdGVuYXRpb24gPSBsZWZ0LmNvbmNhdGVuYXRlKHJpZ2h0LCAzKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbmNhdGVuYXRpb24gPSBsZWZ0LmNvbmNhdGVuYXRlKHJpZ2h0LCAtMSkpOworfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc3RhdGljX2RpbWVuc2lvbl9mYWlsdXJlKCkKK3sKKyAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gbGVmdCgyLCAzKTsKKyAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gcmlnaHQoMiwgMywgMSk7CisKKyNpZmRlZiBDWFgxMV9URU5TT1JfQ09OQ0FURU5BVElPTl9TVEFUSUNfRElNRU5TSU9OX0ZBSUxVUkUKKyAgLy8gVGVjaG5pY2FsbHkgY29tcGF0aWJsZSwgYnV0IHdlIHN0YXRpYyBhc3NlcnQgdGhhdCB0aGUgaW5wdXRzIGhhdmUgc2FtZQorICAvLyBOdW1EaW1zLgorICBUZW5zb3I8aW50LCAzLCBEYXRhTGF5b3V0PiBjb25jYXRlbmF0aW9uID0gbGVmdC5jb25jYXRlbmF0ZShyaWdodCwgMCk7CisjZW5kaWYKKworICAvLyBUaGlzIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGluIHRoaXMgY2FzZS4KKyAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gY29uY2F0ZW5hdGlvbiA9IGxlZnQKKyAgICAgIC5yZXNoYXBlKFRlbnNvcjxpbnQsIDM+OjpEaW1lbnNpb25zKDIsIDMsIDEpKQorICAgICAgLmNvbmNhdGVuYXRlKHJpZ2h0LCAwKTsKKyAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gYWx0ZXJuYXRpdmUgPSBsZWZ0CisgICAgICAuY29uY2F0ZW5hdGUocmlnaHQucmVzaGFwZShUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9uc3t7ezIsIDN9fX0pLCAwKTsKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9jb25jYXRlbmF0aW9uKCkKK3sKKyAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gbGVmdCgyLCAzLCAxKTsKKyAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gcmlnaHQoMiwgMywgMSk7CisgIGxlZnQuc2V0UmFuZG9tKCk7CisgIHJpZ2h0LnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IGNvbmNhdGVuYXRpb24gPSBsZWZ0LmNvbmNhdGVuYXRlKHJpZ2h0LCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24uZGltZW5zaW9uKDApLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24uZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24uZGltZW5zaW9uKDIpLCAxKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24oaSwgaiwgMCksIGxlZnQoaSwgaiwgMCkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMjsgaSA8IDQ7ICsraSkgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24oaSwgaiwgMCksIHJpZ2h0KGkgLSAyLCBqLCAwKSk7CisgICAgfQorICB9CisKKyAgY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDEpOworICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbi5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbi5kaW1lbnNpb24oMSksIDYpOworICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbi5kaW1lbnNpb24oMiksIDEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbihpLCBqLCAwKSwgbGVmdChpLCBqLCAwKSk7CisgICAgfQorICAgIGZvciAoaW50IGogPSAzOyBqIDwgNjsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbihpLCBqLCAwKSwgcmlnaHQoaSwgaiAtIDMsIDApKTsKKyAgICB9CisgIH0KKworICBjb25jYXRlbmF0aW9uID0gbGVmdC5jb25jYXRlbmF0ZShyaWdodCwgMik7CisgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uLmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uLmRpbWVuc2lvbigyKSwgMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uKGksIGosIDApLCBsZWZ0KGksIGosIDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uKGksIGosIDEpLCByaWdodChpLCBqLCAwKSk7CisgICAgfQorICB9Cit9CisKKworLy8gVE9ETyhwaGxpKTogQWRkIHRlc3Qgb25jZSB3ZSBoYXZlIGEgcmVhbCB2ZWN0b3JpemVkIGltcGxlbWVudGF0aW9uLgorLy8gc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JpemVkX2NvbmNhdGVuYXRpb24oKSB7fQorCitzdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdGVuYXRpb25fYXNfbHZhbHVlKCkKK3sKKyAgVGVuc29yPGludCwgMj4gdDEoMiwgMyk7CisgIFRlbnNvcjxpbnQsIDI+IHQyKDIsIDMpOworICB0MS5zZXRSYW5kb20oKTsKKyAgdDIuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGludCwgMj4gcmVzdWx0KDQsIDMpOworICByZXN1bHQuc2V0UmFuZG9tKCk7CisgIHQxLmNvbmNhdGVuYXRlKHQyLCAwKSA9IHJlc3VsdDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwodDEoaSwgaiksIHJlc3VsdChpLCBqKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwodDIoaSwgaiksIHJlc3VsdChpKzIsIGopKTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb24oKQoreworICAgQ0FMTF9TVUJURVNUKHRlc3RfZGltZW5zaW9uX2ZhaWx1cmVzPENvbE1ham9yPigpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X2RpbWVuc2lvbl9mYWlsdXJlczxSb3dNYWpvcj4oKSk7CisgICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfZGltZW5zaW9uX2ZhaWx1cmU8Q29sTWFqb3I+KCkpOworICAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RhdGljX2RpbWVuc2lvbl9mYWlsdXJlPFJvd01ham9yPigpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9jb25jYXRlbmF0aW9uPENvbE1ham9yPigpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9jb25jYXRlbmF0aW9uPFJvd01ham9yPigpKTsKKyAgIC8vIENBTExfU1VCVEVTVCh0ZXN0X3ZlY3Rvcml6ZWRfY29uY2F0ZW5hdGlvbigpKTsKKyAgIENBTExfU1VCVEVTVCh0ZXN0X2NvbmNhdGVuYXRpb25fYXNfbHZhbHVlKCkpOworCit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25zdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5YzlkYQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnN0LmNwcApAQCAtMCwwICsxLDYyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgordXNpbmcgRWlnZW46OlRlbnNvcjsKKworCitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9hc3NpZ24oKQoreworICBUZW5zb3I8aW50LCAzPiByYW5kb20oMiwzLDcpOworICByYW5kb20uc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDM+ID4gY29uc3RhbnQocmFuZG9tLmRhdGEoKSwgMiwgMywgNyk7CisgIFRlbnNvcjxpbnQsIDM+IHJlc3VsdCgyLDMsNyk7CisgIHJlc3VsdCA9IGNvbnN0YW50OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCgocmVzdWx0KGksaixrKSksIHJhbmRvbShpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfYXNzaWduX29mX2NvbnN0X3RlbnNvcigpCit7CisgIFRlbnNvcjxpbnQsIDM+IHJhbmRvbSgyLDMsNyk7CisgIHJhbmRvbS5zZXRSYW5kb20oKTsKKworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGludCwgMz4gPiBjb25zdGFudDEocmFuZG9tLmRhdGEoKSwgMiwgMywgNyk7CisgIFRlbnNvck1hcDxjb25zdCBUZW5zb3I8aW50LCAzPiA+IGNvbnN0YW50MihyYW5kb20uZGF0YSgpLCAyLCAzLCA3KTsKKyAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDM+ID4gY29uc3RhbnQzKHJhbmRvbS5kYXRhKCksIDIsIDMsIDcpOworCisgIFRlbnNvcjxpbnQsIDI+IHJlc3VsdDEgPSBjb25zdGFudDEuY2hpcCgwLCAyKTsKKyAgVGVuc29yPGludCwgMj4gcmVzdWx0MiA9IGNvbnN0YW50Mi5jaGlwKDAsIDIpOworICBUZW5zb3I8aW50LCAyPiByZXN1bHQzID0gY29uc3RhbnQzLmNoaXAoMCwgMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKChyZXN1bHQxKGksaikpLCByYW5kb20oaSxqLDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgocmVzdWx0MihpLGopKSwgcmFuZG9tKGksaiwwKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKHJlc3VsdDMoaSxqKSksIHJhbmRvbShpLGosMCkpOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY29uc3QoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfYXNzaWduKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hc3NpZ25fb2ZfY29uc3RfdGVuc29yKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3RfY3VkYS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnRyYWN0X2N1ZGEuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2ODQzMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnRyYWN0X2N1ZGEuY3UKQEAgLTAsMCArMSwyMTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxNCBOYXZkZWVwIEphaXRseSA8bmRqYWl0bHlAZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2N1ZGEKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIGludAorI2RlZmluZSBFSUdFTl9VU0VfR1BVCisKKyNpZiBkZWZpbmVkIF9fQ1VEQUNDX1ZFUl9fICYmIF9fQ1VEQUNDX1ZFUl9fID49IDcwNTAwCisjaW5jbHVkZSA8Y3VkYV9mcDE2Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY29udHJhY3Rpb24oaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkKK3sKKyAgc3RkOjpjb3V0IDw8ICJUZXN0aW5nIGZvciAoIiA8PCBtX3NpemUgPDwgIiwiIDw8IGtfc2l6ZSA8PCAiLCIgPDwgbl9zaXplIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIC8vIHdpdGggdGhlc2UgZGltZW5zaW9ucywgdGhlIG91dHB1dCBoYXMgMzAwICogMTQwIGVsZW1lbnRzLCB3aGljaCBpcworICAvLyBtb3JlIHRoYW4gMzAgKiAxMDI0LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gYmxvY2tzIG9uCisgIC8vIGEgMTUgU00gR0sxMTAgR1BVCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9sZWZ0KG1fc2l6ZSwga19zaXplKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3JpZ2h0KGtfc2l6ZSwgbl9zaXplKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3Jlc3VsdChtX3NpemUsIG5fc2l6ZSk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yZXN1bHRfZ3B1KG1fc2l6ZSwgbl9zaXplKTsKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMoRGltUGFpcigxLCAwKSk7CisKKyAgdF9sZWZ0LnNldFJhbmRvbSgpOworICB0X3JpZ2h0LnNldFJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IHRfbGVmdF9ieXRlcyA9IHRfbGVmdC5zaXplKCkgICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHRfcmlnaHQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSB0X3Jlc3VsdC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworCisgIGZsb2F0KiBkX3RfbGVmdDsKKyAgZmxvYXQqIGRfdF9yaWdodDsKKyAgZmxvYXQqIGRfdF9yZXN1bHQ7CisKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF90X2xlZnQpLCB0X2xlZnRfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfcmlnaHQpLCB0X3JpZ2h0X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF90X3Jlc3VsdCksIHRfcmVzdWx0X2J5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfdF9sZWZ0LCB0X2xlZnQuZGF0YSgpLCB0X2xlZnRfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfdF9yaWdodCwgdF9yaWdodC5kYXRhKCksIHRfcmlnaHRfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfbGVmdChkX3RfbGVmdCwgRWlnZW46OmFycmF5PGludCwgMj4obV9zaXplLCBrX3NpemUpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+CisgICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KGtfc2l6ZSwgbl9zaXplKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KG1fc2l6ZSwgbl9zaXplKSk7CisKKworICBncHVfdF9yZXN1bHQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7CisgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOworCisgIGN1ZGFNZW1jcHkodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwgdF9yZXN1bHRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpOworICBmb3IgKERlbnNlSW5kZXggaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgeworICAgIGlmIChmYWJzKHRfcmVzdWx0KGkpIC0gdF9yZXN1bHRfZ3B1KGkpKSA8IDFlLTRmKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoaSksIHRfcmVzdWx0X2dwdShpKSwgMWUtNGYpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKQorICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgIHRfcmVzdWx0X2dwdShpKSA8PCBzdGQ6OmVuZGw7CisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgfQorCisgIGN1ZGFGcmVlKCh2b2lkKilkX3RfbGVmdCk7CisgIGN1ZGFGcmVlKCh2b2lkKilkX3RfcmlnaHQpOworICBjdWRhRnJlZSgodm9pZCopZF90X3Jlc3VsdCk7Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3Rfc2NhbGFyKGludCBtX3NpemUsIGludCBrX3NpemUsIGludCBuX3NpemUpCit7CisgIHN0ZDo6Y291dCA8PCAiVGVzdGluZyBmb3IgKCIgPDwgbV9zaXplIDw8ICIsIiA8PCBrX3NpemUgPDwgIiwiIDw8IG5fc2l6ZSA8PCAiKSIgPDwgc3RkOjplbmRsOworICAvLyB3aXRoIHRoZXNlIGRpbWVuc2lvbnMsIHRoZSBvdXRwdXQgaGFzIDMwMCAqIDE0MCBlbGVtZW50cywgd2hpY2ggaXMKKyAgLy8gbW9yZSB0aGFuIDMwICogMTAyNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIGJsb2NrcyBvbgorICAvLyBhIDE1IFNNIEdLMTEwIEdQVQorICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfbGVmdChtX3NpemUsIGtfc2l6ZSk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yaWdodChrX3NpemUsIG5fc2l6ZSk7CisgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gdF9yZXN1bHQ7CisgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gdF9yZXN1bHRfZ3B1OworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyhEaW1QYWlyKDAsIDApLCBEaW1QYWlyKDEsIDEpKTsKKworICB0X2xlZnQuc2V0UmFuZG9tKCk7CisgIHRfcmlnaHQuc2V0UmFuZG9tKCk7CisKKyAgc3RkOjpzaXplX3QgdF9sZWZ0X2J5dGVzID0gdF9sZWZ0LnNpemUoKSAgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X3JpZ2h0X2J5dGVzID0gdF9yaWdodC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfdF9sZWZ0OworICBmbG9hdCogZF90X3JpZ2h0OworICBmbG9hdCogZF90X3Jlc3VsdDsKKworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfbGVmdCksIHRfbGVmdF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfdF9yaWdodCksIHRfcmlnaHRfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfcmVzdWx0KSwgdF9yZXN1bHRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF90X2xlZnQsIHRfbGVmdC5kYXRhKCksIHRfbGVmdF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF90X3JpZ2h0LCB0X3JpZ2h0LmRhdGEoKSwgdF9yaWdodF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+CisgICAgICBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBtX3NpemUsIGtfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCBrX3NpemUsIG5fc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQpOworCisgIGdwdV90X3Jlc3VsdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfdF9sZWZ0LmNvbnRyYWN0KGdwdV90X3JpZ2h0LCBkaW1zKTsKKyAgdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisKKyAgY3VkYU1lbWNweSh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LCB0X3Jlc3VsdF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCk7CisgIGlmIChmYWJzKHRfcmVzdWx0KCkgLSB0X3Jlc3VsdF9ncHUoKSkgPiAxZS00ZiAmJgorICAgICAgIUVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoKSwgdF9yZXN1bHRfZ3B1KCksIDFlLTRmKSkgeworICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQ6ICIgPDwgdF9yZXN1bHQoKQorICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgIHRfcmVzdWx0X2dwdSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBhc3NlcnQoZmFsc2UpOworICB9CisKKyAgY3VkYUZyZWUoKHZvaWQqKWRfdF9sZWZ0KTsKKyAgY3VkYUZyZWUoKHZvaWQqKWRfdF9yaWdodCk7CisgIGN1ZGFGcmVlKCh2b2lkKilkX3RfcmVzdWx0KTsKK30KKworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9jdWRhX2NvbnRyYWN0aW9uX20oKSB7CisgIGZvciAoaW50IGsgPSAzMjsgayA8IDI1NjsgaysrKSB7CisgICAgdGVzdF9jdWRhX2NvbnRyYWN0aW9uPENvbE1ham9yPihrLCAxMjgsIDEyOCk7CisgICAgdGVzdF9jdWRhX2NvbnRyYWN0aW9uPFJvd01ham9yPihrLCAxMjgsIDEyOCk7CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3RfY3VkYV9jb250cmFjdGlvbl9rKCkgeworICBmb3IgKGludCBrID0gMzI7IGsgPCAyNTY7IGsrKykgeworICAgIHRlc3RfY3VkYV9jb250cmFjdGlvbjxDb2xNYWpvcj4oMTI4LCBrLCAxMjgpOworICAgIHRlc3RfY3VkYV9jb250cmFjdGlvbjxSb3dNYWpvcj4oMTI4LCBrLCAxMjgpOworICB9Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY29udHJhY3Rpb25fbigpIHsKKyAgZm9yIChpbnQgayA9IDMyOyBrIDwgMjU2OyBrKyspIHsKKyAgICB0ZXN0X2N1ZGFfY29udHJhY3Rpb248Q29sTWFqb3I+KDEyOCwgMTI4LCBrKTsKKyAgICB0ZXN0X2N1ZGFfY29udHJhY3Rpb248Um93TWFqb3I+KDEyOCwgMTI4LCBrKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY29udHJhY3Rpb25fc2l6ZXMoKSB7CisgIGludCBtX3NpemVzW10gPSB7IDMxLCAgMzksICAgNjMsICAgNjQsICAgNjUsCisgICAgICAgICAgICAgICAgICAgMTI3LCAxMjksICAyNTUsICAyNTcgLCA1MTEsCisgICAgICAgICAgICAgICAgICAgNTEyLCA1MTMsIDEwMjMsIDEwMjQsIDEwMjV9OworCisgIGludCBuX3NpemVzW10gPSB7IDMxLCAgMzksICAgNjMsICAgNjQsICAgNjUsCisgICAgICAgICAgICAgICAgICAgMTI3LCAxMjksICAyNTUsICAyNTcsICA1MTEsCisgICAgICAgICAgICAgICAgICAgNTEyLCA1MTMsIDEwMjMsIDEwMjQsIDEwMjV9OworCisgIGludCBrX3NpemVzW10gPSB7ICAzMSwgICAzOSwgIDYzLCAgNjQsICAgNjUsCisgICAgICAgICAgICAgICAgICAgICA5NSwgICA5NiwgMTI3LCAxMjksICAyNTUsCisgICAgICAgICAgICAgICAgICAgIDI1NywgIDUxMSwgNTEyLCA1MTMsIDEwMjMsCisgICAgICAgICAgICAgICAgICAgMTAyNCwgMTAyNX07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNTsgaisrKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDE3OyBrKyspIHsKKyAgICAgICAgdGVzdF9jdWRhX2NvbnRyYWN0aW9uPERhdGFMYXlvdXQ+KG1fc2l6ZXNbaV0sIG5fc2l6ZXNbal0sIGtfc2l6ZXNba10pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2N1ZGEoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfY29udHJhY3Rpb248Q29sTWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jdWRhX2NvbnRyYWN0aW9uPFJvd01ham9yPigxMjgsIDEyOCwgMTI4KSk7CisKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9zY2FsYXI8Q29sTWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9zY2FsYXI8Um93TWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKKworICBDQUxMX1NVQlRFU1RfMih0ZXN0X2N1ZGFfY29udHJhY3Rpb25fbTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RfY3VkYV9jb250cmFjdGlvbl9tPFJvd01ham9yPigpKTsKKworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X2N1ZGFfY29udHJhY3Rpb25fazxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF81KHRlc3RfY3VkYV9jb250cmFjdGlvbl9rPFJvd01ham9yPigpKTsKKworICBDQUxMX1NVQlRFU1RfNih0ZXN0X2N1ZGFfY29udHJhY3Rpb25fbjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF83KHRlc3RfY3VkYV9jb250cmFjdGlvbl9uPFJvd01ham9yPigpKTsKKworICBDQUxMX1NVQlRFU1RfOCh0ZXN0X2N1ZGFfY29udHJhY3Rpb25fc2l6ZXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfOSh0ZXN0X2N1ZGFfY29udHJhY3Rpb25fc2l6ZXM8Um93TWFqb3I+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTk3MDUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb250cmFjdGlvbi5jcHAKQEAgLTAsMCArMSw1NDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpEZWZhdWx0RGV2aWNlOwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9ldmFscygpCit7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0MSgyLCAzKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQyKDIsIDMpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDMoMywgMik7CisKKyAgbWF0MS5zZXRSYW5kb20oKTsKKyAgbWF0Mi5zZXRSYW5kb20oKTsKKyAgbWF0My5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDQoMywzKTsKKyAgbWF0NC5zZXRaZXJvKCk7CisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zMyA9IHt7RGltUGFpcigwLCAwKX19OworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMzKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjsKKyAgRXZhbHVhdG9yIGV2YWwobWF0MS5jb250cmFjdChtYXQyLCBkaW1zMyksIERlZmF1bHREZXZpY2UoKSk7CisgIGV2YWwuZXZhbFRvKG1hdDQuZGF0YSgpKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3I6Ok51bURpbXM9PTJ1bCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGV2YWwuZGltZW5zaW9ucygpWzBdLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGV2YWwuZGltZW5zaW9ucygpWzFdLCAzKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwwKSwgbWF0MSgwLDApKm1hdDIoMCwwKSArIG1hdDEoMSwwKSptYXQyKDEsMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwxKSwgbWF0MSgwLDApKm1hdDIoMCwxKSArIG1hdDEoMSwwKSptYXQyKDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwyKSwgbWF0MSgwLDApKm1hdDIoMCwyKSArIG1hdDEoMSwwKSptYXQyKDEsMikpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwwKSwgbWF0MSgwLDEpKm1hdDIoMCwwKSArIG1hdDEoMSwxKSptYXQyKDEsMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwxKSwgbWF0MSgwLDEpKm1hdDIoMCwxKSArIG1hdDEoMSwxKSptYXQyKDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwyKSwgbWF0MSgwLDEpKm1hdDIoMCwyKSArIG1hdDEoMSwxKSptYXQyKDEsMikpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMiwwKSwgbWF0MSgwLDIpKm1hdDIoMCwwKSArIG1hdDEoMSwyKSptYXQyKDEsMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMiwxKSwgbWF0MSgwLDIpKm1hdDIoMCwxKSArIG1hdDEoMSwyKSptYXQyKDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMiwyKSwgbWF0MSgwLDIpKm1hdDIoMCwyKSArIG1hdDEoMSwyKSptYXQyKDEsMikpOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0NSgyLDIpOworICBtYXQ1LnNldFplcm8oKTsKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXM0ID0ge3tEaW1QYWlyKDEsIDEpfX07CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKG1hdDEuY29udHJhY3QobWF0MiwgZGltczQpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yMjsKKyAgRXZhbHVhdG9yMiBldmFsMihtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXM0KSwgRGVmYXVsdERldmljZSgpKTsKKyAgZXZhbDIuZXZhbFRvKG1hdDUuZGF0YSgpKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3IyOjpOdW1EaW1zPT0ydWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIFZFUklGWV9JU19FUVVBTChldmFsMi5kaW1lbnNpb25zKClbMF0sIDIpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbDIuZGltZW5zaW9ucygpWzFdLCAyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG1hdDUoMCwwKSwgbWF0MSgwLDApKm1hdDIoMCwwKSArIG1hdDEoMCwxKSptYXQyKDAsMSkgKyBtYXQxKDAsMikqbWF0MigwLDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ1KDAsMSksIG1hdDEoMCwwKSptYXQyKDEsMCkgKyBtYXQxKDAsMSkqbWF0MigxLDEpICsgbWF0MSgwLDIpKm1hdDIoMSwyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0NSgxLDApLCBtYXQxKDEsMCkqbWF0MigwLDApICsgbWF0MSgxLDEpKm1hdDIoMCwxKSArIG1hdDEoMSwyKSptYXQyKDAsMikpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDUoMSwxKSwgbWF0MSgxLDApKm1hdDIoMSwwKSArIG1hdDEoMSwxKSptYXQyKDEsMSkgKyBtYXQxKDEsMikqbWF0MigxLDIpKTsKKworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDYoMiwyKTsKKyAgbWF0Ni5zZXRaZXJvKCk7CisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zNiA9IHt7RGltUGFpcigxLCAwKX19OworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShtYXQxLmNvbnRyYWN0KG1hdDMsIGRpbXM2KSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjM7CisgIEV2YWx1YXRvcjMgZXZhbDMobWF0MS5jb250cmFjdChtYXQzLCBkaW1zNiksIERlZmF1bHREZXZpY2UoKSk7CisgIGV2YWwzLmV2YWxUbyhtYXQ2LmRhdGEoKSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRXZhbHVhdG9yMzo6TnVtRGltcz09MnVsLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbDMuZGltZW5zaW9ucygpWzBdLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGV2YWwzLmRpbWVuc2lvbnMoKVsxXSwgMik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KDAsMCksIG1hdDEoMCwwKSptYXQzKDAsMCkgKyBtYXQxKDAsMSkqbWF0MygxLDApICsgbWF0MSgwLDIpKm1hdDMoMiwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0NigwLDEpLCBtYXQxKDAsMCkqbWF0MygwLDEpICsgbWF0MSgwLDEpKm1hdDMoMSwxKSArIG1hdDEoMCwyKSptYXQzKDIsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMSwwKSwgbWF0MSgxLDApKm1hdDMoMCwwKSArIG1hdDEoMSwxKSptYXQzKDEsMCkgKyBtYXQxKDEsMikqbWF0MygyLDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KDEsMSksIG1hdDEoMSwwKSptYXQzKDAsMSkgKyBtYXQxKDEsMSkqbWF0MygxLDEpICsgbWF0MSgxLDIpKm1hdDMoMiwxKSk7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zY2FsYXIoKQoreworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHZlYzEoezZ9KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB2ZWMyKHs2fSk7CisKKyAgdmVjMS5zZXRSYW5kb20oKTsKKyAgdmVjMi5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltcyA9IHt7RGltUGFpcigwLCAwKX19OworICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IHNjYWxhciA9IHZlYzEuY29udHJhY3QodmVjMiwgZGltcyk7CisKKyAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIGV4cGVjdGVkICs9IHZlYzEoaSkgKiB2ZWMyKGkpOworICB9CisgIFZFUklGWV9JU19BUFBST1goc2NhbGFyKCksIGV4cGVjdGVkKTsKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X211bHRpZGltcygpCit7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0MSgyLCAyLCAyKTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBtYXQyKDIsIDIsIDIsIDIpOworCisgIG1hdDEuc2V0UmFuZG9tKCk7CisgIG1hdDIuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBtYXQzKDIsIDIsIDIpOworICBtYXQzLnNldFplcm8oKTsKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMgPSB7e0RpbVBhaXIoMSwgMiksIERpbVBhaXIoMiwgMyl9fTsKKyAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUobWF0MS5jb250cmFjdChtYXQyLCBkaW1zKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjsKKyAgRXZhbHVhdG9yIGV2YWwobWF0MS5jb250cmFjdChtYXQyLCBkaW1zKSwgRGVmYXVsdERldmljZSgpKTsKKyAgZXZhbC5ldmFsVG8obWF0My5kYXRhKCkpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcz09M3VsLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbC5kaW1lbnNpb25zKClbMF0sIDIpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbC5kaW1lbnNpb25zKClbMV0sIDIpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbC5kaW1lbnNpb25zKClbMl0sIDIpOworCisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDAsMCksIG1hdDEoMCwwLDApKm1hdDIoMCwwLDAsMCkgKyBtYXQxKDAsMSwwKSptYXQyKDAsMCwxLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigwLDAsMCwxKSArIG1hdDEoMCwxLDEpKm1hdDIoMCwwLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwwLDEpLCBtYXQxKDAsMCwwKSptYXQyKDAsMSwwLDApICsgbWF0MSgwLDEsMCkqbWF0MigwLDEsMSwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMCwxLDAsMSkgKyBtYXQxKDAsMSwxKSptYXQyKDAsMSwxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMSwwKSwgbWF0MSgwLDAsMCkqbWF0MigxLDAsMCwwKSArIG1hdDEoMCwxLDApKm1hdDIoMSwwLDEsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwxKSptYXQyKDEsMCwwLDEpICsgbWF0MSgwLDEsMSkqbWF0MigxLDAsMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEsMSksIG1hdDEoMCwwLDApKm1hdDIoMSwxLDAsMCkgKyBtYXQxKDAsMSwwKSptYXQyKDEsMSwxLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigxLDEsMCwxKSArIG1hdDEoMCwxLDEpKm1hdDIoMSwxLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwwLDApLCBtYXQxKDEsMCwwKSptYXQyKDAsMCwwLDApICsgbWF0MSgxLDEsMCkqbWF0MigwLDAsMSwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMSwwLDEpKm1hdDIoMCwwLDAsMSkgKyBtYXQxKDEsMSwxKSptYXQyKDAsMCwxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMCwxKSwgbWF0MSgxLDAsMCkqbWF0MigwLDEsMCwwKSArIG1hdDEoMSwxLDApKm1hdDIoMCwxLDEsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDEsMCwxKSptYXQyKDAsMSwwLDEpICsgbWF0MSgxLDEsMSkqbWF0MigwLDEsMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLDEsMCksIG1hdDEoMSwwLDApKm1hdDIoMSwwLDAsMCkgKyBtYXQxKDEsMSwwKSptYXQyKDEsMCwxLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgxLDAsMSkqbWF0MigxLDAsMCwxKSArIG1hdDEoMSwxLDEpKm1hdDIoMSwwLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwxLDEpLCBtYXQxKDEsMCwwKSptYXQyKDEsMSwwLDApICsgbWF0MSgxLDEsMCkqbWF0MigxLDEsMSwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMSwwLDEpKm1hdDIoMSwxLDAsMSkgKyBtYXQxKDEsMSwxKSptYXQyKDEsMSwxLDEpKTsKKworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDQoMiwgMik7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0NSgyLCAyLCAyKTsKKworICBtYXQ0LnNldFJhbmRvbSgpOworICBtYXQ1LnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gbWF0NigyKTsKKyAgbWF0Ni5zZXRaZXJvKCk7CisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAyPiBkaW1zMih7e0RpbVBhaXIoMCwgMSksIERpbVBhaXIoMSwgMCl9fSk7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKG1hdDQuY29udHJhY3QobWF0NSwgZGltczIpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yMjsKKyAgRXZhbHVhdG9yMiBldmFsMihtYXQ0LmNvbnRyYWN0KG1hdDUsIGRpbXMyKSwgRGVmYXVsdERldmljZSgpKTsKKyAgZXZhbDIuZXZhbFRvKG1hdDYuZGF0YSgpKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3IyOjpOdW1EaW1zPT0xdWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIFZFUklGWV9JU19FUVVBTChldmFsMi5kaW1lbnNpb25zKClbMF0sIDIpOworCisgIFZFUklGWV9JU19BUFBST1gobWF0NigwKSwgbWF0NCgwLDApKm1hdDUoMCwwLDApICsgbWF0NCgxLDApKm1hdDUoMCwxLDApICsKKyAgICAgICAgICAgICAgICAgICBtYXQ0KDAsMSkqbWF0NSgxLDAsMCkgKyBtYXQ0KDEsMSkqbWF0NSgxLDEsMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMSksIG1hdDQoMCwwKSptYXQ1KDAsMCwxKSArIG1hdDQoMSwwKSptYXQ1KDAsMSwxKSArCisgICAgICAgICAgICAgICAgICAgbWF0NCgwLDEpKm1hdDUoMSwwLDEpICsgbWF0NCgxLDEpKm1hdDUoMSwxLDEpKTsKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2hvbGVzKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHQxKDIsIDUsIDcsIDMpOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHQyKDIsIDcsIDExLCAxMywgMyk7CisgIHQxLnNldFJhbmRvbSgpOworICB0Mi5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyA9IHt7RGltUGFpcigwLCAwKSwgRGltUGFpcigzLCA0KX19OworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHQxLmNvbnRyYWN0KHQyLCBkaW1zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDUpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oNCksIDEzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDU7ICsrbCkgeworICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgNTsgKyttKSB7CisgICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqLCBrLCBsLCBtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEoMCwgaSwgaiwgMCkgKiB0MigwLCBrLCBsLCBtLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDEsIGksIGosIDApICogdDIoMSwgaywgbCwgbSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSgwLCBpLCBqLCAxKSAqIHQyKDAsIGssIGwsIG0sIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEoMSwgaSwgaiwgMSkgKiB0MigxLCBrLCBsLCBtLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDAsIGksIGosIDIpICogdDIoMCwgaywgbCwgbSwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSgxLCBpLCBqLCAyKSAqIHQyKDEsIGssIGwsIG0sIDIpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdXgoKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHQxKDIsIDIpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHQyKDIsIDIsIDIpOworICB0MS5zZXRSYW5kb20oKTsKKyAgdDIuc2V0UmFuZG9tKCk7CisKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMgPSB7e0RpbVBhaXIoMCwgMCksIERpbVBhaXIoMSwgMSl9fTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiByZXN1bHQgPSB0MS5jb250cmFjdCh0MiwgZGltcyk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCksIHQxKDAsIDApICogdDIoMCwgMCwgMCkgKyAgdDEoMSwgMCkgKiB0MigxLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdDEoMCwgMSkgKiB0MigwLCAxLCAwKSArICB0MSgxLCAxKSAqIHQyKDEsIDEsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIHQxKDAsIDApICogdDIoMCwgMCwgMSkgKyAgdDEoMSwgMCkgKiB0MigxLCAwLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdDEoMCwgMSkgKiB0MigwLCAxLCAxKSArICB0MSgxLCAxKSAqIHQyKDEsIDEsIDEpKTsKKworICBkaW1zWzBdID0gRGltUGFpcigxLCAwKTsKKyAgZGltc1sxXSA9IERpbVBhaXIoMiwgMSk7CisgIHJlc3VsdCA9IHQyLmNvbnRyYWN0KHQxLCBkaW1zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwKSwgdDEoMCwgMCkgKiB0MigwLCAwLCAwKSArICB0MSgxLCAwKSAqIHQyKDAsIDEsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0MSgwLCAxKSAqIHQyKDAsIDAsIDEpICsgIHQxKDEsIDEpICogdDIoMCwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxKSwgdDEoMCwgMCkgKiB0MigxLCAwLCAwKSArICB0MSgxLCAwKSAqIHQyKDEsIDEsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0MSgwLCAxKSAqIHQyKDEsIDAsIDEpICsgIHQxKDEsIDEpICogdDIoMSwgMSwgMSkpOworfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfY29udHJhY3Rpb25fb2ZfY29udHJhY3Rpb24oKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHQxKDIsIDIpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHQyKDIsIDIpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHQzKDIsIDIpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHQ0KDIsIDIpOworICB0MS5zZXRSYW5kb20oKTsKKyAgdDIuc2V0UmFuZG9tKCk7CisgIHQzLnNldFJhbmRvbSgpOworICB0NC5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltcyA9IHt7RGltUGFpcigxLCAwKX19OworICBhdXRvIGNvbnRyYWN0MSA9IHQxLmNvbnRyYWN0KHQyLCBkaW1zKTsKKyAgYXV0byBkaWZmID0gdDMgLSBjb250cmFjdDE7CisgIGF1dG8gY29udHJhY3QyID0gdDEuY29udHJhY3QodDQsIGRpbXMpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IGNvbnRyYWN0Mi5jb250cmFjdChkaWZmLCBkaW1zKTsKKworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCAyKTsKKworICBFaWdlbjo6TWFwPEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+PgorICAgICAgbTEodDEuZGF0YSgpLCAyLCAyKSwgbTIodDIuZGF0YSgpLCAyLCAyKSwgbTModDMuZGF0YSgpLCAyLCAyKSwKKyAgICAgIG00KHQ0LmRhdGEoKSwgMiwgMik7CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+CisgICAgICBleHBlY3RlZCA9IChtMSAqIG00KSAqIChtMyAtIG0xICogbTIpOworCisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsIDApLCBleHBlY3RlZCgwLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsIDEpLCBleHBlY3RlZCgwLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDApLCBleHBlY3RlZCgxLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDEpLCBleHBlY3RlZCgxLCAxKSk7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9leHByKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQxKDIsIDMpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDIoMywgMik7CisgIG1hdDEuc2V0UmFuZG9tKCk7CisgIG1hdDIuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQzKDIsMik7CisKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMgPSB7e0RpbVBhaXIoMSwgMCl9fTsKKyAgbWF0MyA9IG1hdDEuY29udHJhY3QobWF0MiwgZGltcyk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMCksIG1hdDEoMCwwKSptYXQyKDAsMCkgKyBtYXQxKDAsMSkqbWF0MigxLDApICsgbWF0MSgwLDIpKm1hdDIoMiwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEpLCBtYXQxKDAsMCkqbWF0MigwLDEpICsgbWF0MSgwLDEpKm1hdDIoMSwxKSArIG1hdDEoMCwyKSptYXQyKDIsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwwKSwgbWF0MSgxLDApKm1hdDIoMCwwKSArIG1hdDEoMSwxKSptYXQyKDEsMCkgKyBtYXQxKDEsMikqbWF0MigyLDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMSksIG1hdDEoMSwwKSptYXQyKDAsMSkgKyBtYXQxKDEsMSkqbWF0MigxLDEpICsgbWF0MSgxLDIpKm1hdDIoMiwxKSk7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9vdXRfb2Zfb3JkZXJfY29udHJhY3Rpb24oKQoreworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IG1hdDEoMiwgMiwgMik7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0MigyLCAyLCAyKTsKKworICBtYXQxLnNldFJhbmRvbSgpOworICBtYXQyLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0MygyLCAyKTsKKworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyA9IHt7RGltUGFpcigyLCAwKSwgRGltUGFpcigwLCAyKX19OworICBtYXQzID0gbWF0MS5jb250cmFjdChtYXQyLCBkaW1zKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMCkqbWF0MigwLDAsMCkgKyBtYXQxKDEsMCwwKSptYXQyKDAsMCwxKSArCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigxLDAsMCkgKyBtYXQxKDEsMCwxKSptYXQyKDEsMCwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwKKyAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwwKSptYXQyKDAsMCwwKSArIG1hdDEoMSwxLDApKm1hdDIoMCwwLDEpICsKKyAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwxKSptYXQyKDEsMCwwKSArIG1hdDEoMSwxLDEpKm1hdDIoMSwwLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDEpLAorICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDApKm1hdDIoMCwxLDApICsgbWF0MSgxLDAsMCkqbWF0MigwLDEsMSkgKworICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMSwxLDApICsgbWF0MSgxLDAsMSkqbWF0MigxLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMCkqbWF0MigwLDEsMCkgKyBtYXQxKDEsMSwwKSptYXQyKDAsMSwxKSArCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMSkqbWF0MigxLDEsMCkgKyBtYXQxKDEsMSwxKSptYXQyKDEsMSwxKSk7CisKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMyID0ge3tEaW1QYWlyKDAsIDIpLCBEaW1QYWlyKDIsIDApfX07CisgIG1hdDMgPSBtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMCkqbWF0MigwLDAsMCkgKyBtYXQxKDEsMCwwKSptYXQyKDAsMCwxKSArCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigxLDAsMCkgKyBtYXQxKDEsMCwxKSptYXQyKDEsMCwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwKKyAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwwKSptYXQyKDAsMCwwKSArIG1hdDEoMSwxLDApKm1hdDIoMCwwLDEpICsKKyAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwxKSptYXQyKDEsMCwwKSArIG1hdDEoMSwxLDEpKm1hdDIoMSwwLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDEpLAorICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDApKm1hdDIoMCwxLDApICsgbWF0MSgxLDAsMCkqbWF0MigwLDEsMSkgKworICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMSwxLDApICsgbWF0MSgxLDAsMSkqbWF0MigxLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMCkqbWF0MigwLDEsMCkgKyBtYXQxKDEsMSwwKSptYXQyKDAsMSwxKSArCisgICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMSkqbWF0MigxLDEsMCkgKyBtYXQxKDEsMSwxKSptYXQyKDEsMSwxKSk7CisKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5KCkKK3sKKyAgLy8gdGhpcyBkb2VzIHNvbWV0aGluZyBsaWtlIHRlc3RpbmcgKEEqQileVCA9IChCXlQgKiBBXlQpCisKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBtYXQxKDQsIDMsIDUpOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IG1hdDIoMywgMiwgMSwgNSwgNCk7CisgIG1hdDEuc2V0UmFuZG9tKCk7CisgIG1hdDIuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBtYXQzKDUsIDIsIDEsIDUpOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IG1hdDQoMiwgMSwgNSwgNSk7CisKKyAgLy8gY29udHJhY3Qgb24gZGltZW5zaW9ucyBvZiBzaXplIDQgYW5kIDMKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMxID0ge3tEaW1QYWlyKDAsIDQpLCBEaW1QYWlyKDEsIDApfX07CisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAyPiBkaW1zMiA9IHt7RGltUGFpcig0LCAwKSwgRGltUGFpcigwLCAxKX19OworCisgIG1hdDMgPSBtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMxKTsKKyAgbWF0NCA9IG1hdDIuY29udHJhY3QobWF0MSwgZGltczIpOworCisgIC8vIGNoZWNrIHRoYXQgdGhlc2UgYXJlIGVxdWFsIGV4Y2VwdCBmb3Igb3JkZXJpbmcgb2YgZGltZW5zaW9ucworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzLmRhdGEoKVtpICsgNSAqIGpdLCBtYXQ0LmRhdGEoKVtqICsgMTAgKiBpXSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFJvdyBtYWpvcgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzLmRhdGEoKVsxMCAqIGkgKyBqXSwgbWF0NC5kYXRhKClbaSArIDUgKiBqXSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9sYXJnZV9jb250cmFjdGlvbigpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdF9sZWZ0KDMwLCA1MCwgOCwgMzEpOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmlnaHQoOCwgMzEsIDcsIDIwLCAxMCk7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdF9yZXN1bHQoMzAsIDUwLCA3LCAyMCwgMTApOworCisgIHRfbGVmdC5zZXRSYW5kb20oKTsKKyAgdF9yaWdodC5zZXRSYW5kb20oKTsKKworICAvLyBBZGQgYSBsaXR0bGUgb2Zmc2V0IHNvIHRoYXQgdGhlIHJlc3VsdHMgd29uJ3QgYmUgY2xvc2UgdG8gemVyby4KKyAgdF9sZWZ0ICs9IHRfbGVmdC5jb25zdGFudCgxLjBmKTsKKyAgdF9yaWdodCArPSB0X3JpZ2h0LmNvbnN0YW50KDEuMGYpOworCisgIHR5cGVkZWYgTWFwPEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+PiBNYXBYZjsKKyAgTWFwWGYgbV9sZWZ0KHRfbGVmdC5kYXRhKCksIDE1MDAsIDI0OCk7CisgIE1hcFhmIG1fcmlnaHQodF9yaWdodC5kYXRhKCksIDI0OCwgMTQwMCk7CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+IG1fcmVzdWx0KDE1MDAsIDE0MDApOworCisgIC8vIHRoaXMgY29udHJhY3Rpb24gc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgbWF0cml4IG11bHRpcGxpY2F0aW9uCisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAyPiBkaW1zID0ge3tEaW1QYWlyKDIsIDApLCBEaW1QYWlyKDMsIDEpfX07CisKKyAgLy8gY29tcHV0ZSByZXN1bHRzIGJ5IHNlcGFyYXRlIG1ldGhvZHMKKyAgdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisgIG1fcmVzdWx0ID0gbV9sZWZ0ICogbV9yaWdodDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHRfcmVzdWx0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKTsgaSsrKSB7CisgICAgVkVSSUZZKCZ0X3Jlc3VsdC5kYXRhKClbaV0gIT0gJm1fcmVzdWx0LmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0X3Jlc3VsdC5kYXRhKClbaV0sIG1fcmVzdWx0LmRhdGEoKVtpXSk7CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X21hdHJpeF92ZWN0b3IoKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfbGVmdCgzMCwgNTApOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHRfcmlnaHQoNTApOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHRfcmVzdWx0KDMwKTsKKworICB0X2xlZnQuc2V0UmFuZG9tKCk7CisgIHRfcmlnaHQuc2V0UmFuZG9tKCk7CisKKyAgdHlwZWRlZiBNYXA8RWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4+IE1hcFhmOworICBNYXBYZiBtX2xlZnQodF9sZWZ0LmRhdGEoKSwgMzAsIDUwKTsKKyAgTWFwWGYgbV9yaWdodCh0X3JpZ2h0LmRhdGEoKSwgNTAsIDEpOworICBFaWdlbjo6TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0PiBtX3Jlc3VsdCgzMCwgMSk7CisKKyAgLy8gdGhpcyBjb250cmFjdGlvbiBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBhIHNpbmdsZSBtYXRyaXggbXVsdGlwbGljYXRpb24KKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXN7e0RpbVBhaXIoMSwgMCl9fTsKKworICAvLyBjb21wdXRlIHJlc3VsdHMgYnkgc2VwYXJhdGUgbWV0aG9kcworICB0X3Jlc3VsdCA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKKyAgbV9yZXN1bHQgPSBtX2xlZnQgKiBtX3JpZ2h0OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdF9yZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyBpKyspIHsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCBtX3Jlc3VsdChpLCAwKSwgMSkpOworICB9Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl92ZWN0b3IoKQoreworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRfbGVmdCg3LCAxMywgMTcpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfcmlnaHQoMSwgNyk7CisKKyAgdF9sZWZ0LnNldFJhbmRvbSgpOworICB0X3JpZ2h0LnNldFJhbmRvbSgpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0Pjo6RGltZW5zaW9uUGFpciBEaW1lbnNpb25QYWlyOworICBFaWdlbjo6YXJyYXk8RGltZW5zaW9uUGFpciwgMT4gZGltX3BhaXIwMXt7ezAsIDF9fX07CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltX3BhaXIwMSk7CisKKyAgdHlwZWRlZiBNYXA8RWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4+IE1hcFhmOworICBNYXBYZiBtX2xlZnQodF9sZWZ0LmRhdGEoKSwgNywgMTMqMTcpOworICBNYXBYZiBtX3JpZ2h0KHRfcmlnaHQuZGF0YSgpLCAxLCA3KTsKKyAgRWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQgPSBtX2xlZnQudHJhbnNwb3NlKCkgKiBtX3JpZ2h0LnRyYW5zcG9zZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdF9yZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyBpKyspIHsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCBtX3Jlc3VsdChpLCAwKSwgMSkpOworICB9Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NtYWxsX2Jsb2NraW5nX2ZhY3RvcnMoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRfbGVmdCgzMCwgNSwgMywgMzEpOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmlnaHQoMywgMzEsIDcsIDIwLCAxKTsKKyAgdF9sZWZ0LnNldFJhbmRvbSgpOworICB0X3JpZ2h0LnNldFJhbmRvbSgpOworCisgIC8vIEFkZCBhIGxpdHRsZSBvZmZzZXQgc28gdGhhdCB0aGUgcmVzdWx0cyB3b24ndCBiZSBjbG9zZSB0byB6ZXJvLgorICB0X2xlZnQgKz0gdF9sZWZ0LmNvbnN0YW50KDEuMGYpOworICB0X3JpZ2h0ICs9IHRfcmlnaHQuY29uc3RhbnQoMS4wZik7CisKKyAgLy8gRm9yY2UgdGhlIGNhY2hlIHNpemVzLCB3aGljaCByZXN1bHRzIGluIHNtYWxsZXIgYmxvY2tpbmcgZmFjdG9ycy4KKyAgRWlnZW46OnNldENwdUNhY2hlU2l6ZXMoODk2LCAxOTIwLCAyOTQ0KTsKKworICAvLyB0aGlzIGNvbnRyYWN0aW9uIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgorICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyA9IHt7RGltUGFpcigyLCAwKSwgRGltUGFpcigzLCAxKX19OworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmVzdWx0OworICB0X3Jlc3VsdCA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKKworICAvLyBjb21wdXRlIHJlc3VsdCB1c2luZyBhIHNpbXBsZSBlaWdlbiBtYXRyaXggcHJvZHVjdAorICBNYXA8RWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4+IG1fbGVmdCh0X2xlZnQuZGF0YSgpLCAxNTAsIDkzKTsKKyAgTWFwPEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+PiBtX3JpZ2h0KHRfcmlnaHQuZGF0YSgpLCA5MywgMTQwKTsKKyAgRWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQgPSBtX2xlZnQgKiBtX3JpZ2h0OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdF9yZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyBpKyspIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHRfcmVzdWx0LmRhdGEoKVtpXSwgbV9yZXN1bHQuZGF0YSgpW2ldKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX3Byb2R1Y3QoKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDEoMiwgMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0Mig0LCAxKTsKKyAgbWF0MS5zZXRSYW5kb20oKTsKKyAgbWF0Mi5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IG1hdDEuY29udHJhY3QobWF0MiwgRWlnZW46OmFycmF5PERpbVBhaXIsIDA+e3t9fSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDIpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDEpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5kaW1lbnNpb24oMCk7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LmRpbWVuc2lvbigxKTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlc3VsdC5kaW1lbnNpb24oMik7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHJlc3VsdC5kaW1lbnNpb24oMyk7ICsrbCkgeworCQkJVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoaSwgaiwgaywgbCksIG1hdDEoaSwgaikgKiBtYXQyKGssIGwpICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfY29uc3RfaW5wdXRzKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBpbjEoMiwgMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gaW4yKDMsIDIpOworICBpbjEuc2V0UmFuZG9tKCk7CisgIGluMi5zZXRSYW5kb20oKTsKKworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+IG1hdDEoaW4xLmRhdGEoKSwgMiwgMyk7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDIsIERhdGFMYXlvdXQ+ID4gbWF0MihpbjIuZGF0YSgpLCAzLCAyKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQzKDIsMik7CisKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMgPSB7e0RpbVBhaXIoMSwgMCl9fTsKKyAgbWF0MyA9IG1hdDEuY29udHJhY3QobWF0MiwgZGltcyk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMCksIG1hdDEoMCwwKSptYXQyKDAsMCkgKyBtYXQxKDAsMSkqbWF0MigxLDApICsgbWF0MSgwLDIpKm1hdDIoMiwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEpLCBtYXQxKDAsMCkqbWF0MigwLDEpICsgbWF0MSgwLDEpKm1hdDIoMSwxKSArIG1hdDEoMCwyKSptYXQyKDIsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwwKSwgbWF0MSgxLDApKm1hdDIoMCwwKSArIG1hdDEoMSwxKSptYXQyKDEsMCkgKyBtYXQxKDEsMikqbWF0MigyLDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMSksIG1hdDEoMSwwKSptYXQyKDAsMSkgKyBtYXQxKDEsMSkqbWF0MigxLDEpICsgbWF0MSgxLDIpKm1hdDIoMiwxKSk7Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY29udHJhY3Rpb24oKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9ldmFsczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2V2YWxzPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2NhbGFyPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2NhbGFyPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbXVsdGlkaW1zPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbXVsdGlkaW1zPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfaG9sZXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9ob2xlczxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2Z1bGxfcmVkdXg8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9mdWxsX3JlZHV4PFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29udHJhY3Rpb25fb2ZfY29udHJhY3Rpb248Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jb250cmFjdGlvbl9vZl9jb250cmFjdGlvbjxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2V4cHI8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9leHByPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfb3V0X29mX29yZGVyX2NvbnRyYWN0aW9uPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfb3V0X29mX29yZGVyX2NvbnRyYWN0aW9uPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29uc2lzdGVuY3k8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jb25zaXN0ZW5jeTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2xhcmdlX2NvbnRyYWN0aW9uPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbGFyZ2VfY29udHJhY3Rpb248Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9tYXRyaXhfdmVjdG9yPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbWF0cml4X3ZlY3RvcjxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl92ZWN0b3I8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3JfdmVjdG9yPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc21hbGxfYmxvY2tpbmdfZmFjdG9yczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NtYWxsX2Jsb2NraW5nX2ZhY3RvcnM8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3JfcHJvZHVjdDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl9wcm9kdWN0PFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29uc3RfaW5wdXRzPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29uc3RfaW5wdXRzPFJvd01ham9yPigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Q0Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb24uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OkRlZmF1bHREZXZpY2U7CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXZhbHMoKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IGlucHV0KDMsIDMpOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IGtlcm5lbCgyKTsKKworICBpbnB1dC5zZXRSYW5kb20oKTsKKyAga2VybmVsLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gcmVzdWx0KDIsMyk7CisgIHJlc3VsdC5zZXRaZXJvKCk7CisgIEVpZ2VuOjphcnJheTxUZW5zb3I8ZmxvYXQsIDI+OjpJbmRleCwgMT4gZGltczN7ezB9fTsKKworICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShpbnB1dC5jb252b2x2ZShrZXJuZWwsIGRpbXMzKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjsKKyAgRXZhbHVhdG9yIGV2YWwoaW5wdXQuY29udm9sdmUoa2VybmVsLCBkaW1zMyksIERlZmF1bHREZXZpY2UoKSk7CisgIGV2YWwuZXZhbFRvKHJlc3VsdC5kYXRhKCkpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcz09MnVsLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbC5kaW1lbnNpb25zKClbMF0sIDIpOworICBWRVJJRllfSVNfRVFVQUwoZXZhbC5kaW1lbnNpb25zKClbMV0sIDMpOworCisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsMCksIGlucHV0KDAsMCkqa2VybmVsKDApICsgaW5wdXQoMSwwKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMAorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDEpLCBpbnB1dCgwLDEpKmtlcm5lbCgwKSArIGlucHV0KDEsMSkqa2VybmVsKDEpKTsgIC8vIGluZGV4IDIKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwyKSwgaW5wdXQoMCwyKSprZXJuZWwoMCkgKyBpbnB1dCgxLDIpKmtlcm5lbCgxKSk7ICAvLyBpbmRleCA0CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMCksIGlucHV0KDEsMCkqa2VybmVsKDApICsgaW5wdXQoMiwwKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMQorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDEpLCBpbnB1dCgxLDEpKmtlcm5lbCgwKSArIGlucHV0KDIsMSkqa2VybmVsKDEpKTsgIC8vIGluZGV4IDMKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwyKSwgaW5wdXQoMSwyKSprZXJuZWwoMCkgKyBpbnB1dCgyLDIpKmtlcm5lbCgxKSk7ICAvLyBpbmRleCA1Cit9CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhwcigpCit7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gaW5wdXQoMywgMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4ga2VybmVsKDIsIDIpOworICBpbnB1dC5zZXRSYW5kb20oKTsKKyAga2VybmVsLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gcmVzdWx0KDIsMik7CisgIEVpZ2VuOjphcnJheTxwdHJkaWZmX3QsIDI+IGRpbXM7CisgIGRpbXNbMF0gPSAwOworICBkaW1zWzFdID0gMTsKKyAgcmVzdWx0ID0gaW5wdXQuY29udm9sdmUoa2VybmVsLCBkaW1zKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDApLCBpbnB1dCgwLDApKmtlcm5lbCgwLDApICsgaW5wdXQoMCwxKSprZXJuZWwoMCwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEsMCkqa2VybmVsKDEsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwxKSwgaW5wdXQoMCwxKSprZXJuZWwoMCwwKSArIGlucHV0KDAsMikqa2VybmVsKDAsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCgxLDEpKmtlcm5lbCgxLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMCksIGlucHV0KDEsMCkqa2VybmVsKDAsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgwLDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMiwwKSprZXJuZWwoMSwwKSArIGlucHV0KDIsMSkqa2VybmVsKDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDEpLCBpbnB1dCgxLDEpKmtlcm5lbCgwLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMCwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDIsMSkqa2VybmVsKDEsMCkgKyBpbnB1dCgyLDIpKmtlcm5lbCgxLDEpKTsKK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9tb2RlcygpIHsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiBpbnB1dCgzKTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiBrZXJuZWwoMyk7CisgIGlucHV0KDApID0gMS4wZjsKKyAgaW5wdXQoMSkgPSAyLjBmOworICBpbnB1dCgyKSA9IDMuMGY7CisgIGtlcm5lbCgwKSA9IDAuNWY7CisgIGtlcm5lbCgxKSA9IDEuMGY7CisgIGtlcm5lbCgyKSA9IDAuMGY7CisKKyAgRWlnZW46OmFycmF5PHB0cmRpZmZfdCwgMT4gZGltczsKKyAgZGltc1swXSA9IDA7CisgIEVpZ2VuOjphcnJheTxzdGQ6OnBhaXI8cHRyZGlmZl90LCBwdHJkaWZmX3Q+LCAxPiBwYWRkaW5nOworCisgIC8vIEVtdWxhdGUgVkFMSUQgbW9kZSAoYXMgZGVmaW5lZCBpbgorICAvLyBodHRwOi8vZG9jcy5zY2lweS5vcmcvZG9jL251bXB5L3JlZmVyZW5jZS9nZW5lcmF0ZWQvbnVtcHkuY29udm9sdmUuaHRtbCkuCisgIHBhZGRpbmdbMF0gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB2YWxpZCgxKTsKKyAgdmFsaWQgPSBpbnB1dC5wYWQocGFkZGluZykuY29udm9sdmUoa2VybmVsLCBkaW1zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZhbGlkLmRpbWVuc2lvbigwKSwgMSk7CisgIFZFUklGWV9JU19BUFBST1godmFsaWQoMCksIDIuNWYpOworCisgIC8vIEVtdWxhdGUgU0FNRSBtb2RlIChhcyBkZWZpbmVkIGluCisgIC8vIGh0dHA6Ly9kb2NzLnNjaXB5Lm9yZy9kb2MvbnVtcHkvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5jb252b2x2ZS5odG1sKS4KKyAgcGFkZGluZ1swXSA9IHN0ZDo6bWFrZV9wYWlyKDEsIDEpOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHNhbWUoMyk7CisgIHNhbWUgPSBpbnB1dC5wYWQocGFkZGluZykuY29udm9sdmUoa2VybmVsLCBkaW1zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNhbWUuZGltZW5zaW9uKDApLCAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzYW1lKDApLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzYW1lKDEpLCAyLjVmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzYW1lKDIpLCA0LjBmKTsKKworICAvLyBFbXVsYXRlIEZVTEwgbW9kZSAoYXMgZGVmaW5lZCBpbgorICAvLyBodHRwOi8vZG9jcy5zY2lweS5vcmcvZG9jL251bXB5L3JlZmVyZW5jZS9nZW5lcmF0ZWQvbnVtcHkuY29udm9sdmUuaHRtbCkuCisgIHBhZGRpbmdbMF0gPSBzdGQ6Om1ha2VfcGFpcigyLCAyKTsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiBmdWxsKDUpOworICBmdWxsID0gaW5wdXQucGFkKHBhZGRpbmcpLmNvbnZvbHZlKGtlcm5lbCwgZGltcyk7CisgIFZFUklGWV9JU19FUVVBTChmdWxsLmRpbWVuc2lvbigwKSwgNSk7CisgIFZFUklGWV9JU19BUFBST1goZnVsbCgwKSwgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1goZnVsbCgxKSwgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1goZnVsbCgyKSwgMi41Zik7CisgIFZFUklGWV9JU19BUFBST1goZnVsbCgzKSwgNC4wZik7CisgIFZFUklGWV9JU19BUFBST1goZnVsbCg0KSwgMS41Zik7Cit9CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc3RyaWRlcygpIHsKKyAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiBpbnB1dCgxMyk7CisgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4ga2VybmVsKDMpOworICBpbnB1dC5zZXRSYW5kb20oKTsKKyAga2VybmVsLnNldFJhbmRvbSgpOworCisgIEVpZ2VuOjphcnJheTxwdHJkaWZmX3QsIDE+IGRpbXM7CisgIGRpbXNbMF0gPSAwOworICBFaWdlbjo6YXJyYXk8cHRyZGlmZl90LCAxPiBzdHJpZGVfb2ZfMzsKKyAgc3RyaWRlX29mXzNbMF0gPSAzOworICBFaWdlbjo6YXJyYXk8cHRyZGlmZl90LCAxPiBzdHJpZGVfb2ZfMjsKKyAgc3RyaWRlX29mXzJbMF0gPSAyOworCisgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gcmVzdWx0OworICByZXN1bHQgPSBpbnB1dC5zdHJpZGUoc3RyaWRlX29mXzMpLmNvbnZvbHZlKGtlcm5lbCwgZGltcykuc3RyaWRlKHN0cmlkZV9vZl8yKTsKKworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDApLCAoaW5wdXQoMCkqa2VybmVsKDApICsgaW5wdXQoMykqa2VybmVsKDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCg2KSprZXJuZWwoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIChpbnB1dCg2KSprZXJuZWwoMCkgKyBpbnB1dCg5KSprZXJuZWwoMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEyKSprZXJuZWwoMikpKTsKK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9jb252b2x1dGlvbigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2V2YWxzPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZXZhbHM8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9leHByPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZXhwcjxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X21vZGVzPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbW9kZXM8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdHJpZGVzPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RyaWRlczxSb3dNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdWRhLmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VkYS5jdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE5ZDUyCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VkYS5jdQpAQCAtMCwwICsxLDEyODcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2N1ZGEKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordm9pZCB0ZXN0X2N1ZGFfbnVsbGFyeSgpIHsKKyAgVGVuc29yPGZsb2F0LCAxLCAwLCBpbnQ+IGluMSgyKTsKKyAgVGVuc29yPGZsb2F0LCAxLCAwLCBpbnQ+IGluMigyKTsKKyAgaW4xLnNldFJhbmRvbSgpOworICBpbjIuc2V0UmFuZG9tKCk7CisKKyAgc3RkOjpzaXplX3QgdGVuc29yX2J5dGVzID0gaW4xLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfaW4xOworICBmbG9hdCogZF9pbjI7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4xKSwgdGVuc29yX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbjIpLCB0ZW5zb3JfYnl0ZXMpOworICBjdWRhTWVtY3B5KGRfaW4xLCBpbjEuZGF0YSgpLCB0ZW5zb3JfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfaW4yLCBpbjIuZGF0YSgpLCB0ZW5zb3JfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoCisgICAgICBkX2luMSwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoCisgICAgICBkX2luMiwgMik7CisKKyAgZ3B1X2luMS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4xLmNvbnN0YW50KDMuMTRmKTsKKyAgZ3B1X2luMi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4yLnJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiBuZXcxKDIpOworICBUZW5zb3I8ZmxvYXQsIDEsIDAsIGludD4gbmV3MigyKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG5ldzEuZGF0YSgpLCBkX2luMSwgdGVuc29yX2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhuZXcyLmRhdGEoKSwgZF9pbjIsIHRlbnNvcl9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG5ldzEoaSksIDMuMTRmKTsKKyAgICBWRVJJRllfSVNfTk9UX0VRVUFMKG5ldzIoaSksIGluMihpKSk7CisgIH0KKworICBjdWRhRnJlZShkX2luMSk7CisgIGN1ZGFGcmVlKGRfaW4yKTsKK30KKwordm9pZCB0ZXN0X2N1ZGFfZWxlbWVudHdpc2Vfc21hbGwoKSB7CisgIFRlbnNvcjxmbG9hdCwgMT4gaW4xKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oMikpOworICBUZW5zb3I8ZmxvYXQsIDE+IGluMihFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KDIpKTsKKyAgVGVuc29yPGZsb2F0LCAxPiBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPigyKSk7CisgIGluMS5zZXRSYW5kb20oKTsKKyAgaW4yLnNldFJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGluMV9ieXRlcyA9IGluMS5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBpbjJfYnl0ZXMgPSBpbjIuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gb3V0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfaW4xOworICBmbG9hdCogZF9pbjI7CisgIGZsb2F0KiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbjEpLCBpbjFfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luMiksIGluMl9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgb3V0X2J5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfaW4xLCBpbjEuZGF0YSgpLCBpbjFfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfaW4yLCBpbjIuZGF0YSgpLCBpbjJfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4xKAorICAgICAgZF9pbjEsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oMikpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMigKKyAgICAgIGRfaW4yLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KDIpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoCisgICAgICBkX291dCwgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPigyKSk7CisKKyAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4xICsgZ3B1X2luMjsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1goCisgICAgICAgIG91dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KGkpKSwKKyAgICAgICAgaW4xKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oaSkpICsgaW4yKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oaSkpKTsKKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4xKTsKKyAgY3VkYUZyZWUoZF9pbjIpOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3ZvaWQgdGVzdF9jdWRhX2VsZW1lbnR3aXNlKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzPiBpbjEoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3Miw1Myw5NykpOworICBUZW5zb3I8ZmxvYXQsIDM+IGluMihFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4zKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKyAgVGVuc29yPGZsb2F0LCAzPiBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3Miw1Myw5NykpOworICBpbjEuc2V0UmFuZG9tKCk7CisgIGluMi5zZXRSYW5kb20oKTsKKyAgaW4zLnNldFJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGluMV9ieXRlcyA9IGluMS5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBpbjJfYnl0ZXMgPSBpbjIuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3QgaW4zX2J5dGVzID0gaW4zLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworCisgIGZsb2F0KiBkX2luMTsKKyAgZmxvYXQqIGRfaW4yOworICBmbG9hdCogZF9pbjM7CisgIGZsb2F0KiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbjEpLCBpbjFfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luMiksIGluMl9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4zKSwgaW4zX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbjEsIGluMS5kYXRhKCksIGluMV9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9pbjIsIGluMi5kYXRhKCksIGluMl9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9pbjMsIGluMy5kYXRhKCksIGluM19ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjEoZF9pbjEsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjIoZF9pbjIsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjMoZF9pbjMsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9vdXQoZF9vdXQsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjEgKyBncHVfaW4yICogZ3B1X2luMzsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDk3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPihpLGosaykpLCBpbjEoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPihpLGosaykpICsgaW4yKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oaSxqLGspKSAqIGluMyhFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KGksaixrKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4xKTsKKyAgY3VkYUZyZWUoZF9pbjIpOworICBjdWRhRnJlZShkX2luMyk7CisgIGN1ZGFGcmVlKGRfb3V0KTsKK30KKwordm9pZCB0ZXN0X2N1ZGFfcHJvcHMoKSB7CisgIFRlbnNvcjxmbG9hdCwgMT4gaW4xKDIwMCk7CisgIFRlbnNvcjxib29sLCAxPiBvdXQoMjAwKTsKKyAgaW4xLnNldFJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGluMV9ieXRlcyA9IGluMS5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGJvb2wpOworCisgIGZsb2F0KiBkX2luMTsKKyAgYm9vbCogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4xKSwgaW4xX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbjEsIGluMS5kYXRhKCksIGluMV9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoCisgICAgICBkX2luMSwgMjAwKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGJvb2wsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X291dCgKKyAgICAgIGRfb3V0LCAyMDApOworCisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gKGdwdV9pbjEuaXNuYW4pKCk7CisKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChvdXQoaSksIChzdGQ6OmlzbmFuKShpbjEoaSkpKTsKKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4xKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit2b2lkIHRlc3RfY3VkYV9yZWR1Y3Rpb24oKQoreworICBUZW5zb3I8ZmxvYXQsIDQ+IGluMSg3Miw1Myw5NywxMTMpOworICBUZW5zb3I8ZmxvYXQsIDI+IG91dCg3Miw5Nyk7CisgIGluMS5zZXRSYW5kb20oKTsKKworICBzdGQ6OnNpemVfdCBpbjFfYnl0ZXMgPSBpbjEuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gb3V0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfaW4xOworICBmbG9hdCogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4xKSwgaW4xX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbjEsIGluMS5kYXRhKCksIGluMV9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0PiA+IGdwdV9pbjEoZF9pbjEsIDcyLDUzLDk3LDExMyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gPiBncHVfb3V0KGRfb3V0LCA3Miw5Nyk7CisKKyAgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDI+IHJlZHVjdGlvbl9heGlzOworICByZWR1Y3Rpb25fYXhpc1swXSA9IDE7CisgIHJlZHVjdGlvbl9heGlzWzFdID0gMzsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjEubWF4aW11bShyZWR1Y3Rpb25fYXhpcyk7CisKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNzI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTc7ICsraikgeworICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTEzOyArK2wpIHsKKyAgICAgICAgICBleHBlY3RlZCA9CisgICAgICAgICAgICAgIHN0ZDo6bWF4PGZsb2F0PihleHBlY3RlZCwgaW4xKGksIGssIGosIGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqKSwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4xKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9jdWRhX2NvbnRyYWN0aW9uKCkKK3sKKyAgLy8gd2l0aCB0aGVzZSBkaW1lbnNpb25zLCB0aGUgb3V0cHV0IGhhcyAzMDAgKiAxNDAgZWxlbWVudHMsIHdoaWNoIGlzCisgIC8vIG1vcmUgdGhhbiAzMCAqIDEwMjQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBibG9ja3Mgb24KKyAgLy8gYSAxNSBTTSBHSzExMCBHUFUKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0X2xlZnQoNiwgNTAsIDMsIDMxKTsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0X3JpZ2h0KEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgNT4oMywgMzEsIDcsIDIwLCAxKSk7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdF9yZXN1bHQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCA1Pig2LCA1MCwgNywgMjAsIDEpKTsKKworICB0X2xlZnQuc2V0UmFuZG9tKCk7CisgIHRfcmlnaHQuc2V0UmFuZG9tKCk7CisKKyAgc3RkOjpzaXplX3QgdF9sZWZ0X2J5dGVzID0gdF9sZWZ0LnNpemUoKSAgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X3JpZ2h0X2J5dGVzID0gdF9yaWdodC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHRfcmVzdWx0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfdF9sZWZ0OworICBmbG9hdCogZF90X3JpZ2h0OworICBmbG9hdCogZF90X3Jlc3VsdDsKKworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfbGVmdCksIHRfbGVmdF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfdF9yaWdodCksIHRfcmlnaHRfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfcmVzdWx0KSwgdF9yZXN1bHRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF90X2xlZnQsIHRfbGVmdC5kYXRhKCksIHRfbGVmdF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF90X3JpZ2h0LCB0X3JpZ2h0LmRhdGEoKSwgdF9yaWdodF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiA+IGdwdV90X2xlZnQoZF90X2xlZnQsIDYsIDUwLCAzLCAzMSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gPiBncHVfdF9yaWdodChkX3RfcmlnaHQsIDMsIDMxLCA3LCAyMCwgMSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gPiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgNiwgNTAsIDcsIDIwLCAxKTsKKworICB0eXBlZGVmIEVpZ2VuOjpNYXA8RWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gPiBNYXBYZjsKKyAgTWFwWGYgbV9sZWZ0KHRfbGVmdC5kYXRhKCksIDMwMCwgOTMpOworICBNYXBYZiBtX3JpZ2h0KHRfcmlnaHQuZGF0YSgpLCA5MywgMTQwKTsKKyAgRWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQoMzAwLCAxNDApOworCisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltczsKKyAgZGltc1swXSA9IERpbVBhaXIoMiwgMCk7CisgIGRpbXNbMV0gPSBEaW1QYWlyKDMsIDEpOworCisgIG1fcmVzdWx0ID0gbV9sZWZ0ICogbV9yaWdodDsKKyAgZ3B1X3RfcmVzdWx0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV90X2xlZnQuY29udHJhY3QoZ3B1X3RfcmlnaHQsIGRpbXMpOworCisgIGN1ZGFNZW1jcHkodF9yZXN1bHQuZGF0YSgpLCBkX3RfcmVzdWx0LCB0X3Jlc3VsdF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCk7CisKKyAgZm9yIChEZW5zZUluZGV4IGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoZmFicyh0X3Jlc3VsdC5kYXRhKClbaV0gLSBtX3Jlc3VsdC5kYXRhKClbaV0pID49IDFlLTRmKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgIG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBhc3NlcnQoZmFsc2UpOworICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfdF9sZWZ0KTsKKyAgY3VkYUZyZWUoZF90X3JpZ2h0KTsKKyAgY3VkYUZyZWUoZF90X3Jlc3VsdCk7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY29udm9sdXRpb25fMWQoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0KDc0LDM3LDExLDEzNyk7CisgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4ga2VybmVsKDQpOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IG91dCg3NCwzNCwxMSwxMzcpOworICBpbnB1dCA9IGlucHV0LmNvbnN0YW50KDEwLjBmKSArIGlucHV0LnJhbmRvbSgpOworICBrZXJuZWwgPSBrZXJuZWwuY29uc3RhbnQoNy4wZikgKyBrZXJuZWwucmFuZG9tKCk7CisKKyAgc3RkOjpzaXplX3QgaW5wdXRfYnl0ZXMgPSBpbnB1dC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBrZXJuZWxfYnl0ZXMgPSBrZXJuZWwuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gb3V0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfaW5wdXQ7CisgIGZsb2F0KiBkX2tlcm5lbDsKKyAgZmxvYXQqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2lucHV0KSwgaW5wdXRfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2tlcm5lbCksIGtlcm5lbF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgb3V0X2J5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfaW5wdXQsIGlucHV0LmRhdGEoKSwgaW5wdXRfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfa2VybmVsLCBrZXJuZWwuZGF0YSgpLCBrZXJuZWxfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gPiBncHVfaW5wdXQoZF9pbnB1dCwgNzQsMzcsMTEsMTM3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsIDQpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+ID4gZ3B1X291dChkX291dCwgNzQsMzQsMTEsMTM3KTsKKworICBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+IGRpbXMoMSk7CisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpOworCisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDc0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM0OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTE7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDEzNzsgKytsKSB7CisgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksaixrLGwpOworICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gaW5wdXQoaSxqKzAsayxsKSAqIGtlcm5lbCgwKSArIGlucHV0KGksaisxLGssbCkgKiBrZXJuZWwoMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzIsayxsKSAqIGtlcm5lbCgyKSArIGlucHV0KGksaiszLGssbCkgKiBrZXJuZWwoMyk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGV4cGVjdGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW5wdXQpOworICBjdWRhRnJlZShkX2tlcm5lbCk7CisgIGN1ZGFGcmVlKGRfb3V0KTsKK30KKwordm9pZCB0ZXN0X2N1ZGFfY29udm9sdXRpb25faW5uZXJfZGltX2NvbF9tYWpvcl8xZCgpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgQ29sTWFqb3I+IGlucHV0KDc0LDksMTEsNyk7CisgIFRlbnNvcjxmbG9hdCwgMSwgQ29sTWFqb3I+IGtlcm5lbCg0KTsKKyAgVGVuc29yPGZsb2F0LCA0LCBDb2xNYWpvcj4gb3V0KDcxLDksMTEsNyk7CisgIGlucHV0ID0gaW5wdXQuY29uc3RhbnQoMTAuMGYpICsgaW5wdXQucmFuZG9tKCk7CisgIGtlcm5lbCA9IGtlcm5lbC5jb25zdGFudCg3LjBmKSArIGtlcm5lbC5yYW5kb20oKTsKKworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKworICBmbG9hdCogZF9pbnB1dDsKKyAgZmxvYXQqIGRfa2VybmVsOworICBmbG9hdCogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW5wdXQpLCBpbnB1dF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfa2VybmVsKSwga2VybmVsX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9rZXJuZWwsIGtlcm5lbC5kYXRhKCksIGtlcm5lbF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBDb2xNYWpvcj4gPiBncHVfaW5wdXQoZF9pbnB1dCw3NCw5LDExLDcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsNCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgQ29sTWFqb3I+ID4gZ3B1X291dChkX291dCw3MSw5LDExLDcpOworCisgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4gZGltcygwKTsKKyAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW5wdXQuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CisKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNzE7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDExOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGssbCk7CisgICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dChpKzAsaixrLGwpICoga2VybmVsKDApICsgaW5wdXQoaSsxLGosayxsKSAqIGtlcm5lbCgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpKzIsaixrLGwpICoga2VybmVsKDIpICsgaW5wdXQoaSszLGosayxsKSAqIGtlcm5lbCgzKTsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCwgZXhwZWN0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgY3VkYUZyZWUoZF9pbnB1dCk7CisgIGN1ZGFGcmVlKGRfa2VybmVsKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit2b2lkIHRlc3RfY3VkYV9jb252b2x1dGlvbl9pbm5lcl9kaW1fcm93X21ham9yXzFkKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gaW5wdXQoNyw5LDExLDc0KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBSb3dNYWpvcj4ga2VybmVsKDQpOworICBUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiBvdXQoNyw5LDExLDcxKTsKKyAgaW5wdXQgPSBpbnB1dC5jb25zdGFudCgxMC4wZikgKyBpbnB1dC5yYW5kb20oKTsKKyAga2VybmVsID0ga2VybmVsLmNvbnN0YW50KDcuMGYpICsga2VybmVsLnJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3Qga2VybmVsX2J5dGVzID0ga2VybmVsLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworCisgIGZsb2F0KiBkX2lucHV0OworICBmbG9hdCogZF9rZXJuZWw7CisgIGZsb2F0KiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbnB1dCksIGlucHV0X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9rZXJuZWwpLCBrZXJuZWxfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIG91dF9ieXRlcyk7CisKKyAgY3VkYU1lbWNweShkX2lucHV0LCBpbnB1dC5kYXRhKCksIGlucHV0X2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgY3VkYU1lbWNweShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiA+IGdwdV9pbnB1dChkX2lucHV0LCA3LDksMTEsNzQpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIFJvd01ham9yPiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsIDQpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiA+IGdwdV9vdXQoZF9vdXQsIDcsOSwxMSw3MSk7CisKKyAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPiBkaW1zKDMpOworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzE7ICsrbCkgeworICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayxsKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGksaixrLGwrMCkgKiBrZXJuZWwoMCkgKyBpbnB1dChpLGosayxsKzEpICoga2VybmVsKDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaixrLGwrMikgKiBrZXJuZWwoMikgKyBpbnB1dChpLGosayxsKzMpICoga2VybmVsKDMpOworICAgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0LCBleHBlY3RlZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjdWRhRnJlZShkX2lucHV0KTsKKyAgY3VkYUZyZWUoZF9rZXJuZWwpOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY29udm9sdXRpb25fMmQoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0KDc0LDM3LDExLDEzNyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4ga2VybmVsKDMsNCk7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gb3V0KDc0LDM1LDgsMTM3KTsKKyAgaW5wdXQgPSBpbnB1dC5jb25zdGFudCgxMC4wZikgKyBpbnB1dC5yYW5kb20oKTsKKyAga2VybmVsID0ga2VybmVsLmNvbnN0YW50KDcuMGYpICsga2VybmVsLnJhbmRvbSgpOworCisgIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3Qga2VybmVsX2J5dGVzID0ga2VybmVsLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworCisgIGZsb2F0KiBkX2lucHV0OworICBmbG9hdCogZF9rZXJuZWw7CisgIGZsb2F0KiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbnB1dCksIGlucHV0X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9rZXJuZWwpLCBrZXJuZWxfYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIG91dF9ieXRlcyk7CisKKyAgY3VkYU1lbWNweShkX2lucHV0LCBpbnB1dC5kYXRhKCksIGlucHV0X2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgY3VkYU1lbWNweShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+ID4gZ3B1X2lucHV0KGRfaW5wdXQsNzQsMzcsMTEsMTM3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsMyw0KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQoZF9vdXQsNzQsMzUsOCwxMzcpOworCisgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMj4gZGltcygxLDIpOworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3NDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDEzNzsgKytsKSB7CisgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksaixrLGwpOworICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gaW5wdXQoaSxqKzAsayswLGwpICoga2VybmVsKDAsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzEsayswLGwpICoga2VybmVsKDEsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzIsayswLGwpICoga2VybmVsKDIsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwpICoga2VybmVsKDAsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzEsaysxLGwpICoga2VybmVsKDEsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzIsaysxLGwpICoga2VybmVsKDIsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysyLGwpICoga2VybmVsKDAsMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzEsaysyLGwpICoga2VybmVsKDEsMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzIsaysyLGwpICoga2VybmVsKDIsMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayszLGwpICoga2VybmVsKDAsMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzEsayszLGwpICoga2VybmVsKDEsMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzIsayszLGwpICoga2VybmVsKDIsMyk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGV4cGVjdGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW5wdXQpOworICBjdWRhRnJlZShkX2tlcm5lbCk7CisgIGN1ZGFGcmVlKGRfb3V0KTsKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3RfY3VkYV9jb252b2x1dGlvbl8zZCgpCit7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gaW5wdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCA1Pig3NCwzNywxMSwxMzcsMTcpKTsKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBrZXJuZWwoMyw0LDIpOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IG91dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDU+KDc0LDM1LDgsMTM2LDE3KSk7CisgIGlucHV0ID0gaW5wdXQuY29uc3RhbnQoMTAuMGYpICsgaW5wdXQucmFuZG9tKCk7CisgIGtlcm5lbCA9IGtlcm5lbC5jb25zdGFudCg3LjBmKSArIGtlcm5lbC5yYW5kb20oKTsKKworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKworICBmbG9hdCogZF9pbnB1dDsKKyAgZmxvYXQqIGRfa2VybmVsOworICBmbG9hdCogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW5wdXQpLCBpbnB1dF9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfa2VybmVsKSwga2VybmVsX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9rZXJuZWwsIGtlcm5lbC5kYXRhKCksIGtlcm5lbF9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gPiBncHVfaW5wdXQoZF9pbnB1dCw3NCwzNywxMSwxMzcsMTcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwzLDQsMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gPiBncHVfb3V0KGRfb3V0LDc0LDM1LDgsMTM2LDE3KTsKKworICBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+IGRpbXMoMSwyLDMpOworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA3NDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDEzNjsgKytsKSB7CisgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxNzsgKyttKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGssbCxtKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gaW5wdXQoaSxqKzAsayswLGwrMCxtKSAqIGtlcm5lbCgwLDAsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzAsbCswLG0pICoga2VybmVsKDEsMCwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMCxsKzAsbSkgKiBrZXJuZWwoMiwwLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwrMCxtKSAqIGtlcm5lbCgwLDEsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzEsbCswLG0pICoga2VybmVsKDEsMSwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMSxsKzAsbSkgKiBrZXJuZWwoMiwxLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysyLGwrMCxtKSAqIGtlcm5lbCgwLDIsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzIsbCswLG0pICoga2VybmVsKDEsMiwwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMixsKzAsbSkgKiBrZXJuZWwoMiwyLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayszLGwrMCxtKSAqIGtlcm5lbCgwLDMsMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzMsbCswLG0pICoga2VybmVsKDEsMywwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMyxsKzAsbSkgKiBrZXJuZWwoMiwzLDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayswLGwrMSxtKSAqIGtlcm5lbCgwLDAsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzAsbCsxLG0pICoga2VybmVsKDEsMCwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMCxsKzEsbSkgKiBrZXJuZWwoMiwwLDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwrMSxtKSAqIGtlcm5lbCgwLDEsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzEsbCsxLG0pICoga2VybmVsKDEsMSwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMSxsKzEsbSkgKiBrZXJuZWwoMiwxLDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysyLGwrMSxtKSAqIGtlcm5lbCgwLDIsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzIsbCsxLG0pICoga2VybmVsKDEsMiwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMixsKzEsbSkgKiBrZXJuZWwoMiwyLDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayszLGwrMSxtKSAqIGtlcm5lbCgwLDMsMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzMsbCsxLG0pICoga2VybmVsKDEsMywxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMyxsKzEsbSkgKiBrZXJuZWwoMiwzLDEpOworICAgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGV4cGVjdGVkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjdWRhRnJlZShkX2lucHV0KTsKKyAgY3VkYUZyZWUoZF9rZXJuZWwpOworICBjdWRhRnJlZShkX291dCk7Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9jdWRhX2xnYW1tYShjb25zdCBTY2FsYXIgc3RkZGV2KQoreworICBUZW5zb3I8U2NhbGFyLCAyPiBpbig3Miw5Nyk7CisgIGluLnNldFJhbmRvbSgpOworICBpbiAqPSBpbi5jb25zdGFudChzdGRkZXYpOworICBUZW5zb3I8U2NhbGFyLCAyPiBvdXQoNzIsOTcpOworICBvdXQuc2V0WmVybygpOworCisgIHN0ZDo6c2l6ZV90IGJ5dGVzID0gaW4uc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CisKKyAgU2NhbGFyKiBkX2luOworICBTY2FsYXIqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luKSwgYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIGJ5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfaW4sIGluLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X2luKGRfaW4sIDcyLCA5Nyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X291dChkX291dCwgNzIsIDk3KTsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbi5sZ2FtbWEoKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk3OyArK2opIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaiksIChzdGQ6OmxnYW1tYSkoaW4oaSxqKSkpOworICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4pOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHRlc3RfY3VkYV9kaWdhbW1hKCkKK3sKKyAgVGVuc29yPFNjYWxhciwgMT4gaW4oNyk7CisgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCg3KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gZXhwZWN0ZWRfb3V0KDcpOworICBvdXQuc2V0WmVybygpOworCisgIGluKDApID0gU2NhbGFyKDEpOworICBpbigxKSA9IFNjYWxhcigxLjUpOworICBpbigyKSA9IFNjYWxhcig0KTsKKyAgaW4oMykgPSBTY2FsYXIoLTEwLjUpOworICBpbig0KSA9IFNjYWxhcigxMDAwMC41KTsKKyAgaW4oNSkgPSBTY2FsYXIoMCk7CisgIGluKDYpID0gU2NhbGFyKC0xKTsKKworICBleHBlY3RlZF9vdXQoMCkgPSBTY2FsYXIoLTAuNTc3MjE1NjY0OTAxNTMyOSk7CisgIGV4cGVjdGVkX291dCgxKSA9IFNjYWxhcigwLjAzNjQ4OTk3Mzk3ODU3NjQ1KTsKKyAgZXhwZWN0ZWRfb3V0KDIpID0gU2NhbGFyKDEuMjU2MTE3NjY4NDMxOCk7CisgIGV4cGVjdGVkX291dCgzKSA9IFNjYWxhcigyLjM5ODIzOTEyOTUzNTc4MSk7CisgIGV4cGVjdGVkX291dCg0KSA9IFNjYWxhcig5LjIxMDM0MDM3MjM5Mjg0OSk7CisgIGV4cGVjdGVkX291dCg1KSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgZXhwZWN0ZWRfb3V0KDYpID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjppbmZpbml0eSgpOworCisgIHN0ZDo6c2l6ZV90IGJ5dGVzID0gaW4uc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CisKKyAgU2NhbGFyKiBkX2luOworICBTY2FsYXIqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luKSwgYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIGJ5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfaW4sIGluLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDE+ID4gZ3B1X2luKGRfaW4sIDcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAxPiA+IGdwdV9vdXQoZF9vdXQsIDcpOworCisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmRpZ2FtbWEoKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBleHBlY3RlZF9vdXQoaSkpOworICB9CisgIGZvciAoaW50IGkgPSA1OyBpIDwgNzsgKytpKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKG91dChpKSwgZXhwZWN0ZWRfb3V0KGkpKTsKKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4pOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHRlc3RfY3VkYV96ZXRhKCkKK3sKKyAgVGVuc29yPFNjYWxhciwgMT4gaW5feCg2KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gaW5fcSg2KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gb3V0KDYpOworICBUZW5zb3I8U2NhbGFyLCAxPiBleHBlY3RlZF9vdXQoNik7CisgIG91dC5zZXRaZXJvKCk7CisKKyAgaW5feCgwKSA9IFNjYWxhcigxKTsKKyAgaW5feCgxKSA9IFNjYWxhcigxLjUpOworICBpbl94KDIpID0gU2NhbGFyKDQpOworICBpbl94KDMpID0gU2NhbGFyKC0xMC41KTsKKyAgaW5feCg0KSA9IFNjYWxhcigxMDAwMC41KTsKKyAgaW5feCg1KSA9IFNjYWxhcigzKTsKKyAgCisgIGluX3EoMCkgPSBTY2FsYXIoMS4yMzQ1KTsKKyAgaW5fcSgxKSA9IFNjYWxhcigyKTsKKyAgaW5fcSgyKSA9IFNjYWxhcigxLjUpOworICBpbl9xKDMpID0gU2NhbGFyKDMpOworICBpbl9xKDQpID0gU2NhbGFyKDEuMDAwMSk7CisgIGluX3EoNSkgPSBTY2FsYXIoLTIuNSk7CisKKyAgZXhwZWN0ZWRfb3V0KDApID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjppbmZpbml0eSgpOworICBleHBlY3RlZF9vdXQoMSkgPSBTY2FsYXIoMS42MTIzNzUzNDg2OSk7CisgIGV4cGVjdGVkX291dCgyKSA9IFNjYWxhcigwLjIzNDg0ODUwNTY2Nyk7CisgIGV4cGVjdGVkX291dCgzKSA9IFNjYWxhcigxLjAzMDg2NzU3MzM3ZS01KTsKKyAgZXhwZWN0ZWRfb3V0KDQpID0gU2NhbGFyKDAuMzY3ODc5NDQwODY1KTsKKyAgZXhwZWN0ZWRfb3V0KDUpID0gU2NhbGFyKDAuMDU0MTAyMDI1ODIwODY0MDk3KTsKKworICBzdGQ6OnNpemVfdCBieXRlcyA9IGluX3guc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CisKKyAgU2NhbGFyKiBkX2luX3g7CisgIFNjYWxhciogZF9pbl9xOworICBTY2FsYXIqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luX3gpLCBieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW5fcSksIGJ5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBieXRlcyk7CisKKyAgY3VkYU1lbWNweShkX2luX3gsIGluX3guZGF0YSgpLCBieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9pbl9xLCBpbl9xLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICAKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMT4gPiBncHVfaW5feChkX2luX3gsIDYpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAxPiA+IGdwdV9pbl9xKGRfaW5fcSwgNik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDE+ID4gZ3B1X291dChkX291dCwgNik7CisKKyAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW5feC56ZXRhKGdwdV9pbl9xKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBWRVJJRllfSVNfRVFVQUwob3V0KDApLCBleHBlY3RlZF9vdXQoMCkpOworICBWRVJJRlkoKHN0ZDo6aXNuYW4pKG91dCgzKSkpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgKytpKSB7CisgICAgaWYgKGkgIT0gMykgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSksIGV4cGVjdGVkX291dChpKSk7CisgICAgfQorICB9CisKKyAgY3VkYUZyZWUoZF9pbl94KTsKKyAgY3VkYUZyZWUoZF9pbl9xKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2N1ZGFfcG9seWdhbW1hKCkKK3sKKyAgVGVuc29yPFNjYWxhciwgMT4gaW5feCg3KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gaW5fbig3KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gb3V0KDcpOworICBUZW5zb3I8U2NhbGFyLCAxPiBleHBlY3RlZF9vdXQoNyk7CisgIG91dC5zZXRaZXJvKCk7CisKKyAgaW5fbigwKSA9IFNjYWxhcigxKTsKKyAgaW5fbigxKSA9IFNjYWxhcigxKTsKKyAgaW5fbigyKSA9IFNjYWxhcigxKTsKKyAgaW5fbigzKSA9IFNjYWxhcigxNyk7CisgIGluX24oNCkgPSBTY2FsYXIoMzEpOworICBpbl9uKDUpID0gU2NhbGFyKDI4KTsKKyAgaW5fbig2KSA9IFNjYWxhcig4KTsKKyAgCisgIGluX3goMCkgPSBTY2FsYXIoMik7CisgIGluX3goMSkgPSBTY2FsYXIoMyk7CisgIGluX3goMikgPSBTY2FsYXIoMjUuNSk7CisgIGluX3goMykgPSBTY2FsYXIoNC43KTsKKyAgaW5feCg0KSA9IFNjYWxhcigxMS44KTsKKyAgaW5feCg1KSA9IFNjYWxhcigxNy43KTsKKyAgaW5feCg2KSA9IFNjYWxhcigzMC4yKTsKKworICBleHBlY3RlZF9vdXQoMCkgPSBTY2FsYXIoMC42NDQ5MzQwNjY4NDgpOworICBleHBlY3RlZF9vdXQoMSkgPSBTY2FsYXIoMC4zOTQ5MzQwNjY4NDgpOworICBleHBlY3RlZF9vdXQoMikgPSBTY2FsYXIoMC4wMzk5OTQ2Njk2NDk2KTsKKyAgZXhwZWN0ZWRfb3V0KDMpID0gU2NhbGFyKDI5My4zMzQ1NjU0MzUpOworICBleHBlY3RlZF9vdXQoNCkgPSBTY2FsYXIoMC40NDU0ODc4ODc2MTYpOworICBleHBlY3RlZF9vdXQoNSkgPSBTY2FsYXIoLTIuNDc4MTAzMDA5MDJlLTA3KTsKKyAgZXhwZWN0ZWRfb3V0KDYpID0gU2NhbGFyKC04LjI5NjY4NzgxMDgyZS0wOSk7CisKKyAgc3RkOjpzaXplX3QgYnl0ZXMgPSBpbl94LnNpemUoKSAqIHNpemVvZihTY2FsYXIpOworCisgIFNjYWxhciogZF9pbl94OworICBTY2FsYXIqIGRfaW5fbjsKKyAgU2NhbGFyKiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbl94KSwgYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luX24pLCBieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbl94LCBpbl94LmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfaW5fbiwgaW5fbi5kYXRhKCksIGJ5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKyAgCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDE+ID4gZ3B1X2luX3goZF9pbl94LCA3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMT4gPiBncHVfaW5fbihkX2luX24sIDcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAxPiA+IGdwdV9vdXQoZF9vdXQsIDcpOworCisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luX24ucG9seWdhbW1hKGdwdV9pbl94KTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDc7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBleHBlY3RlZF9vdXQoaSkpOworICB9CisKKyAgY3VkYUZyZWUoZF9pbl94KTsKKyAgY3VkYUZyZWUoZF9pbl9uKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2N1ZGFfaWdhbW1hKCkKK3sKKyAgVGVuc29yPFNjYWxhciwgMj4gYSg2LCA2KTsKKyAgVGVuc29yPFNjYWxhciwgMj4geCg2LCA2KTsKKyAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDYsIDYpOworICBvdXQuc2V0WmVybygpOworCisgIFNjYWxhciBhX3NbXSA9IHtTY2FsYXIoMCksIFNjYWxhcigxKSwgU2NhbGFyKDEuNSksIFNjYWxhcig0KSwgU2NhbGFyKDAuMDAwMSksIFNjYWxhcigxMDAwLjUpfTsKKyAgU2NhbGFyIHhfc1tdID0ge1NjYWxhcigwKSwgU2NhbGFyKDEpLCBTY2FsYXIoMS41KSwgU2NhbGFyKDQpLCBTY2FsYXIoMC4wMDAxKSwgU2NhbGFyKDEwMDAuNSl9OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKKyAgICAgIGEoaSwgaikgPSBhX3NbaV07CisgICAgICB4KGksIGopID0geF9zW2pdOworICAgIH0KKyAgfQorCisgIFNjYWxhciBuYW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICBTY2FsYXIgaWdhbW1hX3NbXVs2XSA9IHt7MC4wLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjAsIDAuNjMyMTIwNTU4ODI4NTU3OCwgMC43NzY4Njk4Mzk4NTE1NzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODE2ODQzNjExMTEyNjU4LCA5Ljk5OTUwMDAxNjY2NjI2MmUtMDUsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjAsIDAuNDI3NTkzMjk1NTI5MTIwMiwgMC42MDgzNzQ4MjM3Mjg5MTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1Mzk4ODI5NDMxMDc2ODYsIDcuNTIyMDc2NDQ1MDg5MjAxZS0wNywgMS4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMCwgMC4wMTg5ODgxNTY4NzYxNTM4MSwgMC4wNjU2NDI0NTQzNzg0NTAwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTY2NTI5ODc5NjMzMjkwOSwgNC4xNjYzMzMzNDcyMjE4MjhlLTE4LCAxLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjk5OTk3ODA1OTM2MTg2MjgsIDAuOTk5OTg5OTk2NzA4MDgzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5NjIxOTgzNzk4OCwgMC45OTkxMzcwNDE4Njg5OTQ1LCAxLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuNTA0MjA0MTkzMjUxMzkwOH19OworCisKKworICBzdGQ6OnNpemVfdCBieXRlcyA9IGEuc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CisKKyAgU2NhbGFyKiBkX2E7CisgIFNjYWxhciogZF94OworICBTY2FsYXIqIGRfb3V0OworICBhc3NlcnQoY3VkYU1hbGxvYygodm9pZCoqKSgmZF9hKSwgYnl0ZXMpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfeCksIGJ5dGVzKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIGJ5dGVzKSA9PSBjdWRhU3VjY2Vzcyk7CisKKyAgY3VkYU1lbWNweShkX2EsIGEuZGF0YSgpLCBieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF94LCB4LmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X2EoZF9hLCA2LCA2KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMj4gPiBncHVfeChkX3gsIDYsIDYpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAyPiA+IGdwdV9vdXQoZF9vdXQsIDYsIDYpOworCisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2EuaWdhbW1hKGdwdV94KTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjsgKytqKSB7CisgICAgICBpZiAoKHN0ZDo6aXNuYW4pKGlnYW1tYV9zW2ldW2pdKSkgeworICAgICAgICBWRVJJRlkoKHN0ZDo6aXNuYW4pKG91dChpLCBqKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIGlnYW1tYV9zW2ldW2pdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjdWRhRnJlZShkX2EpOworICBjdWRhRnJlZShkX3gpOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHRlc3RfY3VkYV9pZ2FtbWFjKCkKK3sKKyAgVGVuc29yPFNjYWxhciwgMj4gYSg2LCA2KTsKKyAgVGVuc29yPFNjYWxhciwgMj4geCg2LCA2KTsKKyAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDYsIDYpOworICBvdXQuc2V0WmVybygpOworCisgIFNjYWxhciBhX3NbXSA9IHtTY2FsYXIoMCksIFNjYWxhcigxKSwgU2NhbGFyKDEuNSksIFNjYWxhcig0KSwgU2NhbGFyKDAuMDAwMSksIFNjYWxhcigxMDAwLjUpfTsKKyAgU2NhbGFyIHhfc1tdID0ge1NjYWxhcigwKSwgU2NhbGFyKDEpLCBTY2FsYXIoMS41KSwgU2NhbGFyKDQpLCBTY2FsYXIoMC4wMDAxKSwgU2NhbGFyKDEwMDAuNSl9OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKKyAgICAgIGEoaSwgaikgPSBhX3NbaV07CisgICAgICB4KGksIGopID0geF9zW2pdOworICAgIH0KKyAgfQorCisgIFNjYWxhciBuYW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICBTY2FsYXIgaWdhbW1hY19zW11bNl0gPSB7e25hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW59LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMCwgMC4zNjc4Nzk0NDExNzE0NDIzMywgMC4yMjMxMzAxNjAxNDg0Mjk4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxODMxNTYzODg4ODczNDE4MiwgMC45OTk5MDAwMDQ5OTk4MzMzLCAwLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMCwgMC41NzI0MDY3MDQ0NzA4Nzk4LCAwLjM5MTYyNTE3NjI3MTA4NzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDYwMTE3MDU2ODkyMzEzNiwgMC45OTk5OTkyNDc3OTIzNTU1LCAwLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMCwgMC45ODEwMTE4NDMxMjM4NDYyLCAwLjkzNDM1NzU0NTYyMTU0OTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MzM0NzAxMjAzNjY3MDg5LCAxLjAsIDAuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAyLjE5NDA2MzgxMzgxNDY2NThlLTA1LCAxLjAwMDMyOTE5MTYyODVlLTA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzgwMTYyMDExODQzMTMzNGUtMDcsIDAuMDAwODYyOTU4MTMxMDA1NDUzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMCwgMS4wLCAxLjAsIDEuMCwgMS4wLCAwLjQ5NTc5NTgwNjc0ODEzOTQ0fX07CisKKyAgc3RkOjpzaXplX3QgYnl0ZXMgPSBhLnNpemUoKSAqIHNpemVvZihTY2FsYXIpOworCisgIFNjYWxhciogZF9hOworICBTY2FsYXIqIGRfeDsKKyAgU2NhbGFyKiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9hKSwgYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3gpLCBieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9hLCBhLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfeCwgeC5kYXRhKCksIGJ5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAyPiA+IGdwdV9hKGRfYSwgNiwgNik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X3goZF94LCA2LCA2KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMj4gPiBncHVfb3V0KGRfb3V0LCA2LCA2KTsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9hLmlnYW1tYWMoZ3B1X3gpOworCisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKKyAgICAgIGlmICgoc3RkOjppc25hbikoaWdhbW1hY19zW2ldW2pdKSkgeworICAgICAgICBWRVJJRlkoKHN0ZDo6aXNuYW4pKG91dChpLCBqKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIGlnYW1tYWNfc1tpXVtqXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY3VkYUZyZWUoZF9hKTsKKyAgY3VkYUZyZWUoZF94KTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2N1ZGFfZXJmKGNvbnN0IFNjYWxhciBzdGRkZXYpCit7CisgIFRlbnNvcjxTY2FsYXIsIDI+IGluKDcyLDk3KTsKKyAgaW4uc2V0UmFuZG9tKCk7CisgIGluICo9IGluLmNvbnN0YW50KHN0ZGRldik7CisgIFRlbnNvcjxTY2FsYXIsIDI+IG91dCg3Miw5Nyk7CisgIG91dC5zZXRaZXJvKCk7CisKKyAgc3RkOjpzaXplX3QgYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKKworICBTY2FsYXIqIGRfaW47CisgIFNjYWxhciogZF9vdXQ7CisgIGFzc2VydChjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luKSwgYnl0ZXMpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgYnl0ZXMpID09IGN1ZGFTdWNjZXNzKTsKKworICBjdWRhTWVtY3B5KGRfaW4sIGluLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X2luKGRfaW4sIDcyLCA5Nyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDI+ID4gZ3B1X291dChkX291dCwgNzIsIDk3KTsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbi5lcmYoKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk3OyArK2opIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaiksIChzdGQ6OmVyZikoaW4oaSxqKSkpOworICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW4pOworICBjdWRhRnJlZShkX291dCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHRlc3RfY3VkYV9lcmZjKGNvbnN0IFNjYWxhciBzdGRkZXYpCit7CisgIFRlbnNvcjxTY2FsYXIsIDI+IGluKDcyLDk3KTsKKyAgaW4uc2V0UmFuZG9tKCk7CisgIGluICo9IGluLmNvbnN0YW50KHN0ZGRldik7CisgIFRlbnNvcjxTY2FsYXIsIDI+IG91dCg3Miw5Nyk7CisgIG91dC5zZXRaZXJvKCk7CisKKyAgc3RkOjpzaXplX3QgYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKKworICBTY2FsYXIqIGRfaW47CisgIFNjYWxhciogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4pLCBieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbiwgaW4uZGF0YSgpLCBieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMj4gPiBncHVfaW4oZF9pbiwgNzIsIDk3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMj4gPiBncHVfb3V0KGRfb3V0LCA3MiwgOTcpOworCisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmVyZmMoKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk3OyArK2opIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaiksIChzdGQ6OmVyZmMpKGluKGksaikpKTsKKyAgICB9CisgIH0KKworICBjdWRhRnJlZShkX2luKTsKKyAgY3VkYUZyZWUoZF9vdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2N1ZGFfYmV0YWluYygpCit7CisgIFRlbnNvcjxTY2FsYXIsIDE+IGluX3goMTI1KTsKKyAgVGVuc29yPFNjYWxhciwgMT4gaW5fYSgxMjUpOworICBUZW5zb3I8U2NhbGFyLCAxPiBpbl9iKDEyNSk7CisgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCgxMjUpOworICBUZW5zb3I8U2NhbGFyLCAxPiBleHBlY3RlZF9vdXQoMTI1KTsKKyAgb3V0LnNldFplcm8oKTsKKworICBTY2FsYXIgbmFuID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKworICBBcnJheTxTY2FsYXIsIDEsIER5bmFtaWM+IHgoMTI1KTsKKyAgQXJyYXk8U2NhbGFyLCAxLCBEeW5hbWljPiBhKDEyNSk7CisgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gYigxMjUpOworICBBcnJheTxTY2FsYXIsIDEsIER5bmFtaWM+IHYoMTI1KTsKKworICBhIDw8IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCisgICAgICAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksCisgICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKKyAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CisKKyAgYiA8PCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LAorICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksCisgICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwKKyAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwKKyAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsCisgICAgICAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksCisgICAgICAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKKyAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CisKKyAgeCA8PCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwKKyAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAorICAgICAgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsCisgICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwKKyAgICAgIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsCisgICAgICAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwKKyAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAorICAgICAgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsCisgICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMTsKKworICB2IDw8IG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKKyAgICAgIG5hbiwgbmFuLCAwLjQ3OTcyMTE5ODc2MzY0NjgzLCAwLjUsIDAuNTIwMjc4ODAxMjM2MzUzMywgbmFuLCBuYW4sCisgICAgICAwLjk1MTg2ODM5NTc3NDAwNDMsIDAuOTc4OTY2MzAxMDQxMzc0MywgMC45OTMxNzI5MTg4MDczNDM1LCBuYW4sIG5hbiwKKyAgICAgIDAuOTk5OTk1OTQ5MDMzMDYyLCAwLjk5OTk5OTk5OTk5OTM2OTgsIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sCisgICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLAorICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LAorICAgICAgMC4wNDgxMzE2MDQyMjU5OTU2NywgbmFuLCBuYW4sIDAuMjAwMTQzNDQyNTYyMTc2NzgsIDAuNTAwMDAwMDAwMDAwMDAwMSwKKyAgICAgIDAuNzk5ODU2NTU3NDM3ODIzMiwgbmFuLCBuYW4sIDAuOTk5MTQwMTQyODQzNTgzNCwgMC45OTk5OTk5OTk2OTg0MDMsCisgICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwKKyAgICAgIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgMS4wNjQ2NjAwMjMyMzcwODg3ZS0yNSwgNi4zMDE3MjI4Nzc4MjYyNDZlLTEzLCA0LjA1MDk2NjkzNzk3NDkzOGUtMDYsIG5hbiwKKyAgICAgIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLCAzLjAxNTk2OTY2NzU5NDE2NmUtMTAsIDAuMDAwODU5ODU3MTU2NDE2NTQ0NCwKKyAgICAgIG5hbiwgbmFuLCA2LjAzMTk4NzcxMDEyMzg0NGUtMDgsIDAuNTAwMDAwMDAwMDAwMDAwNywgMC45OTk5OTk5Mzk2ODAxMjI5LAorICAgICAgbmFuLCBuYW4sIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwKKyAgICAgIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwKKyAgICAgIDIuMjQ1MDcyODIwODU5MTM0NWUtMTAxLCBuYW4sIG5hbiwgMC4wLCA5LjI3NTg3MTE0Nzg2OTcyN2UtMzAyLAorICAgICAgMS4yMjMyOTEzMDI2MTUyODI3ZS05NywgbmFuLCBuYW4sIDAuMCwgMy4wODkxMzkzMDgxOTMyOTI0ZS0yNTIsCisgICAgICAyLjkzMDMwNDM2NjYxODM5OTZlLTYwLCBuYW4sIG5hbiwgMi4yNDg5MTM0ODY4NzkxOTllLTE5NiwKKyAgICAgIDAuNTAwMDAwMDAwMDAwNDk0NywgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW47CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjU7ICsraSkgeworICAgIGluX3goaSkgPSB4KGkpOworICAgIGluX2EoaSkgPSBhKGkpOworICAgIGluX2IoaSkgPSBiKGkpOworICAgIGV4cGVjdGVkX291dChpKSA9IHYoaSk7CisgIH0KKworICBzdGQ6OnNpemVfdCBieXRlcyA9IGluX3guc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CisKKyAgU2NhbGFyKiBkX2luX3g7CisgIFNjYWxhciogZF9pbl9hOworICBTY2FsYXIqIGRfaW5fYjsKKyAgU2NhbGFyKiBkX291dDsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9pbl94KSwgYnl0ZXMpOworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luX2EpLCBieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW5fYiksIGJ5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBieXRlcyk7CisKKyAgY3VkYU1lbWNweShkX2luX3gsIGluX3guZGF0YSgpLCBieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9pbl9hLCBpbl9hLmRhdGEoKSwgYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworICBjdWRhTWVtY3B5KGRfaW5fYiwgaW5fYi5kYXRhKCksIGJ5dGVzLCBjdWRhTWVtY3B5SG9zdFRvRGV2aWNlKTsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAxPiA+IGdwdV9pbl94KGRfaW5feCwgMTI1KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFNjYWxhciwgMT4gPiBncHVfaW5fYShkX2luX2EsIDEyNSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxTY2FsYXIsIDE+ID4gZ3B1X2luX2IoZF9pbl9iLCAxMjUpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAxPiA+IGdwdV9vdXQoZF9vdXQsIDEyNSk7CisKKyAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBiZXRhaW5jKGdwdV9pbl9hLCBncHVfaW5fYiwgZ3B1X2luX3gpOworCisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgMTI1OyArK2kpIHsKKyAgICBpZiAoKHN0ZDo6aXNuYW4pKGV4cGVjdGVkX291dChpKSkpIHsKKyAgICAgIFZFUklGWSgoc3RkOjppc25hbikob3V0KGkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBleHBlY3RlZF9vdXQoaSkpOworICAgIH0KKyAgfQorCisgIGN1ZGFGcmVlKGRfaW5feCk7CisgIGN1ZGFGcmVlKGRfaW5fYSk7CisgIGN1ZGFGcmVlKGRfaW5fYik7CisgIGN1ZGFGcmVlKGRfb3V0KTsKK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2N1ZGEoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfbnVsbGFyeSgpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jdWRhX2VsZW1lbnR3aXNlX3NtYWxsKCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfZWxlbWVudHdpc2UoKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfY3VkYV9wcm9wcygpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jdWRhX3JlZHVjdGlvbigpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9jdWRhX2NvbnRyYWN0aW9uPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9jdWRhX2NvbnRyYWN0aW9uPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9jdWRhX2NvbnZvbHV0aW9uXzFkPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9jdWRhX2NvbnZvbHV0aW9uXzFkPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9jdWRhX2NvbnZvbHV0aW9uX2lubmVyX2RpbV9jb2xfbWFqb3JfMWQoKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RfY3VkYV9jb252b2x1dGlvbl9pbm5lcl9kaW1fcm93X21ham9yXzFkKCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfY29udm9sdXRpb25fMmQ8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfY29udm9sdXRpb25fMmQ8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfY29udm9sdXRpb25fM2Q8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfY29udm9sdXRpb25fM2Q8Um93TWFqb3I+KCkpOworCisjaWYgX19jcGx1c3BsdXMgPiAxOTk3MTFMCisgIC8vIHN0ZDo6ZXJmLCBzdGQ6OmVyZmMsIGFuZCBzbyBvbiB3aGVyZSBvbmx5IGFkZGVkIGluIGMrKzExLiBXZSB1c2UgdGhlbQorICAvLyBhcyBhIGdvbGRlbiByZWZlcmVuY2UgdG8gdmFsaWRhdGUgdGhlIHJlc3VsdHMgcHJvZHVjZWQgYnkgRWlnZW4uIFRoZXJlZm9yZQorICAvLyB3ZSBjYW4gb25seSBydW4gdGhlc2UgdGVzdHMgaWYgd2UgdXNlIGEgYysrMTEgY29tcGlsZXIuCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZmxvYXQ+KDEuMGYpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2xnYW1tYTxmbG9hdD4oMTAwLjBmKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZmxvYXQ+KDAuMDFmKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZmxvYXQ+KDAuMDAxZikpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZG91YmxlPigxLjApKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2xnYW1tYTxkb3VibGU+KDEwMC4wKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZG91YmxlPigwLjAxKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9sZ2FtbWE8ZG91YmxlPigwLjAwMSkpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZmxvYXQ+KDEuMGYpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2VyZjxmbG9hdD4oMTAwLjBmKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZmxvYXQ+KDAuMDFmKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZmxvYXQ+KDAuMDAxZikpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmZjPGZsb2F0PigxLjBmKSk7CisgIC8vIENBTExfU1VCVEVTVCh0ZXN0X2N1ZGFfZXJmYzxmbG9hdD4oMTAwLjBmKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmZjPGZsb2F0Pig1LjBmKSk7IC8vIENVREEgZXJmYyBsYWNrcyBwcmVjaXNpb24gZm9yIGxhcmdlIGlucHV0cworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X2N1ZGFfZXJmYzxmbG9hdD4oMC4wMWYpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2VyZmM8ZmxvYXQ+KDAuMDAxZikpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZG91YmxlPigxLjApKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2VyZjxkb3VibGU+KDEwMC4wKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZG91YmxlPigwLjAxKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmY8ZG91YmxlPigwLjAwMSkpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmZjPGRvdWJsZT4oMS4wKSk7CisgIC8vIENBTExfU1VCVEVTVCh0ZXN0X2N1ZGFfZXJmYzxkb3VibGU+KDEwMC4wKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfY3VkYV9lcmZjPGRvdWJsZT4oNS4wKSk7IC8vIENVREEgZXJmYyBsYWNrcyBwcmVjaXNpb24gZm9yIGxhcmdlIGlucHV0cworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X2N1ZGFfZXJmYzxkb3VibGU+KDAuMDEpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2VyZmM8ZG91YmxlPigwLjAwMSkpOworCisgIENBTExfU1VCVEVTVF81KHRlc3RfY3VkYV9kaWdhbW1hPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX2RpZ2FtbWE8ZG91YmxlPigpKTsKKworICBDQUxMX1NVQlRFU1RfNSh0ZXN0X2N1ZGFfcG9seWdhbW1hPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX3BvbHlnYW1tYTxkb3VibGU+KCkpOworCisgIENBTExfU1VCVEVTVF81KHRlc3RfY3VkYV96ZXRhPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX3pldGE8ZG91YmxlPigpKTsKKworICBDQUxMX1NVQlRFU1RfNSh0ZXN0X2N1ZGFfaWdhbW1hPGZsb2F0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX2lnYW1tYWM8ZmxvYXQ+KCkpOworCisgIENBTExfU1VCVEVTVF81KHRlc3RfY3VkYV9pZ2FtbWE8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX2lnYW1tYWM8ZG91YmxlPigpKTsKKworICBDQUxMX1NVQlRFU1RfNih0ZXN0X2N1ZGFfYmV0YWluYzxmbG9hdD4oKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3RfY3VkYV9iZXRhaW5jPGRvdWJsZT4oKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2N1c3RvbV9pbmRleC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21faW5kZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjhjYzEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21faW5kZXguY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNSBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9tYXBfYXNfaW5kZXgoKQoreworI2lmZGVmIEVJR0VOX0hBU19TRklOQUUKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICB1c2luZyBOb3JtYWxJbmRleCA9IERTaXplczxwdHJkaWZmX3QsIDQ+OworICB1c2luZyBDdXN0b21JbmRleCA9IHN0ZDo6bWFwPHB0cmRpZmZfdCwgcHRyZGlmZl90PjsKKyAgQ3VzdG9tSW5kZXggY29lZmZDOworICBjb2VmZkNbMF0gPSAxOworICBjb2VmZkNbMV0gPSAyOworICBjb2VmZkNbMl0gPSA0OworICBjb2VmZkNbM10gPSAxOworICBOb3JtYWxJbmRleCBjb2VmZigxLDIsNCwxKTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmKGNvZWZmQyksIHRlbnNvci5jb2VmZihjb2VmZikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmUmVmKGNvZWZmQyksIHRlbnNvci5jb2VmZlJlZihjb2VmZikpOworI2VuZGlmCit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9tYXRyaXhfYXNfaW5kZXgoKQoreworI2lmZGVmIEVJR0VOX0hBU19TRklOQUUKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICB1c2luZyBOb3JtYWxJbmRleCA9IERTaXplczxwdHJkaWZmX3QsIDQ+OworICB1c2luZyBDdXN0b21JbmRleCA9IE1hdHJpeDx1bnNpZ25lZCBpbnQsIDQsIDE+OworICBDdXN0b21JbmRleCBjb2VmZkMoMSwyLDQsMSk7CisgIE5vcm1hbEluZGV4IGNvZWZmKDEsMiw0LDEpOworCisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuY29lZmYoY29lZmZDKSwgdGVuc29yLmNvZWZmKGNvZWZmKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuY29lZmZSZWYoY29lZmZDKSwgdGVuc29yLmNvZWZmUmVmKGNvZWZmKSk7CisjZW5kaWYKK30KKworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3Zhcmxpc3RfYXNfaW5kZXgoKQoreworI2lmZGVmIEVJR0VOX0hBU19TRklOQUUKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBEU2l6ZXM8cHRyZGlmZl90LCA0PiBjb2VmZigxLDIsNCwxKTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmKHsxLDIsNCwxfSksIHRlbnNvci5jb2VmZihjb2VmZikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmUmVmKHsxLDIsNCwxfSksIHRlbnNvci5jb2VmZlJlZihjb2VmZikpOworI2VuZGlmCit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaXplc19hc19pbmRleCgpCit7CisjaWZkZWYgRUlHRU5fSEFTX1NGSU5BRQorICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIERTaXplczxwdHJkaWZmX3QsIDQ+IGNvZWZmKDEsMiw0LDEpOworICBTaXplczwxLDIsNCwxPiBjb2VmZkM7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5jb2VmZihjb2VmZkMpLCB0ZW5zb3IuY29lZmYoY29lZmYpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5jb2VmZlJlZihjb2VmZkMpLCB0ZW5zb3IuY29lZmZSZWYoY29lZmYpKTsKKyNlbmRpZgorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfY3VzdG9tX2luZGV4KCkgeworICB0ZXN0X21hcF9hc19pbmRleDxDb2xNYWpvcj4oKTsKKyAgdGVzdF9tYXBfYXNfaW5kZXg8Um93TWFqb3I+KCk7CisgIHRlc3RfbWF0cml4X2FzX2luZGV4PENvbE1ham9yPigpOworICB0ZXN0X21hdHJpeF9hc19pbmRleDxSb3dNYWpvcj4oKTsKKyAgdGVzdF92YXJsaXN0X2FzX2luZGV4PENvbE1ham9yPigpOworICB0ZXN0X3Zhcmxpc3RfYXNfaW5kZXg8Um93TWFqb3I+KCk7CisgIHRlc3Rfc2l6ZXNfYXNfaW5kZXg8Q29sTWFqb3I+KCk7CisgIHRlc3Rfc2l6ZXNfYXNfaW5kZXg8Um93TWFqb3I+KCk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21fb3AuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX29wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFhNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX29wLmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKworCitzdHJ1Y3QgSW5zZXJ0WmVyb3MgeworICBEU2l6ZXM8RGVuc2VJbmRleCwgMj4gZGltZW5zaW9ucyhjb25zdCBUZW5zb3I8ZmxvYXQsIDI+JiBpbnB1dCkgY29uc3QgeworICAgIERTaXplczxEZW5zZUluZGV4LCAyPiByZXN1bHQ7CisgICAgcmVzdWx0WzBdID0gaW5wdXQuZGltZW5zaW9uKDApICogMjsKKyAgICByZXN1bHRbMV0gPSBpbnB1dC5kaW1lbnNpb24oMSkgKiAyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0LCB0eXBlbmFtZSBEZXZpY2U+CisgIHZvaWQgZXZhbChjb25zdCBUZW5zb3I8ZmxvYXQsIDI+JiBpbnB1dCwgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdAorICB7CisgICAgYXJyYXk8RGVuc2VJbmRleCwgMj4gc3RyaWRlczsKKyAgICBzdHJpZGVzWzBdID0gMjsKKyAgICBzdHJpZGVzWzFdID0gMjsKKyAgICBvdXRwdXQuc3RyaWRlKHN0cmlkZXMpLmRldmljZShkZXZpY2UpID0gaW5wdXQ7CisKKyAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IG9mZnNldHMoMSwxKTsKKyAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IGV4dGVudHMob3V0cHV0LmRpbWVuc2lvbigwKS0xLCBvdXRwdXQuZGltZW5zaW9uKDEpLTEpOworICAgIG91dHB1dC5zbGljZShvZmZzZXRzLCBleHRlbnRzKS5zdHJpZGUoc3RyaWRlcykuZGV2aWNlKGRldmljZSkgPSBpbnB1dC5jb25zdGFudCgwLjBmKTsKKyAgfQorfTsKKworc3RhdGljIHZvaWQgdGVzdF9jdXN0b21fdW5hcnlfb3AoKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IHRlbnNvcigzLDUpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCAyPiByZXN1bHQgPSB0ZW5zb3IuY3VzdG9tT3AoSW5zZXJ0WmVyb3MoKSk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDEwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrPTIpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKz0yKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCB0ZW5zb3IoaS8yLCBqLzIpKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKz0yKSB7CisgICAgZm9yIChpbnQgaiA9IDE7IGogPCAxMDsgais9MikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKSwgMCk7CisgICAgfQorICB9Cit9CisKKworc3RydWN0IEJhdGNoTWF0TXVsIHsKKyAgRFNpemVzPERlbnNlSW5kZXgsIDM+IGRpbWVuc2lvbnMoY29uc3QgVGVuc29yPGZsb2F0LCAzPiYgaW5wdXQxLCBjb25zdCBUZW5zb3I8ZmxvYXQsIDM+JiBpbnB1dDIpIGNvbnN0IHsKKyAgICBEU2l6ZXM8RGVuc2VJbmRleCwgMz4gcmVzdWx0OworICAgIHJlc3VsdFswXSA9IGlucHV0MS5kaW1lbnNpb24oMCk7CisgICAgcmVzdWx0WzFdID0gaW5wdXQyLmRpbWVuc2lvbigxKTsKKyAgICByZXN1bHRbMl0gPSBpbnB1dDIuZGltZW5zaW9uKDIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0LCB0eXBlbmFtZSBEZXZpY2U+CisgIHZvaWQgZXZhbChjb25zdCBUZW5zb3I8ZmxvYXQsIDM+JiBpbnB1dDEsIGNvbnN0IFRlbnNvcjxmbG9hdCwgMz4mIGlucHV0MiwKKyAgICAgICAgICAgIE91dHB1dCYgb3V0cHV0LCBjb25zdCBEZXZpY2UmIGRldmljZSkgY29uc3QKKyAgeworICAgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICAgIGFycmF5PERpbVBhaXIsIDE+IGRpbXM7CisgICAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXQuZGltZW5zaW9uKDIpOyArK2kpIHsKKyAgICAgIG91dHB1dC50ZW1wbGF0ZSBjaGlwPDI+KGkpLmRldmljZShkZXZpY2UpID0gaW5wdXQxLmNoaXA8Mj4oaSkuY29udHJhY3QoaW5wdXQyLmNoaXA8Mj4oaSksIGRpbXMpOworICAgIH0KKyAgfQorfTsKKworCitzdGF0aWMgdm9pZCB0ZXN0X2N1c3RvbV9iaW5hcnlfb3AoKQoreworICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcjEoMiwzLDUpOworICB0ZW5zb3IxLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcjIoMyw3LDUpOworICB0ZW5zb3IyLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0ID0gdGVuc29yMS5jdXN0b21PcCh0ZW5zb3IyLCBCYXRjaE1hdE11bCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMz46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKKyAgICBhcnJheTxEaW1QYWlyLCAxPiBkaW1zOworICAgIGRpbXNbMF0gPSBEaW1QYWlyKDEsIDApOworICAgIFRlbnNvcjxmbG9hdCwgMj4gcmVmZXJlbmNlID0gdGVuc29yMS5jaGlwPDI+KGkpLmNvbnRyYWN0KHRlbnNvcjIuY2hpcDwyPihpKSwgZGltcyk7CisgICAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgMj4gPiB2YWwgPSByZXN1bHQuY2hpcDwyPihpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWCh2YWwoaiwgayksIHJlZmVyZW5jZShqLCBrKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9jdXN0b21fb3AoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9jdXN0b21fdW5hcnlfb3AoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2N1c3RvbV9iaW5hcnlfb3AoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kZXZpY2UuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kZXZpY2UuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlMjBkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RldmljZS5jdQpAQCAtMCwwICsxLDM5MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3JfZGV2aWNlCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworLy8gQ29udGV4dCBmb3IgZXZhbHVhdGlvbiBvbiBjcHUKK3N0cnVjdCBDUFVDb250ZXh0IHsKKyAgQ1BVQ29udGV4dChjb25zdCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgaW4xLCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgaW4yLCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgb3V0KSA6IGluMV8oaW4xKSwgaW4yXyhpbjIpLCBvdXRfKG91dCksIGtlcm5lbF8xZF8oMiksIGtlcm5lbF8yZF8oMiwyKSwga2VybmVsXzNkXygyLDIsMikgeworICAgIGtlcm5lbF8xZF8oMCkgPSAzLjE0ZjsKKyAgICBrZXJuZWxfMWRfKDEpID0gMi43ZjsKKworICAgIGtlcm5lbF8yZF8oMCwwKSA9IDMuMTRmOworICAgIGtlcm5lbF8yZF8oMSwwKSA9IDIuN2Y7CisgICAga2VybmVsXzJkXygwLDEpID0gMC4yZjsKKyAgICBrZXJuZWxfMmRfKDEsMSkgPSA3LjBmOworCisgICAga2VybmVsXzNkXygwLDAsMCkgPSAzLjE0ZjsKKyAgICBrZXJuZWxfM2RfKDAsMSwwKSA9IDIuN2Y7CisgICAga2VybmVsXzNkXygwLDAsMSkgPSAwLjJmOworICAgIGtlcm5lbF8zZF8oMCwxLDEpID0gNy4wZjsKKyAgICBrZXJuZWxfM2RfKDEsMCwwKSA9IC0xLjBmOworICAgIGtlcm5lbF8zZF8oMSwxLDApID0gLTAuM2Y7CisgICAga2VybmVsXzNkXygxLDAsMSkgPSAtMC43ZjsKKyAgICBrZXJuZWxfM2RfKDEsMSwxKSA9IC0wLjVmOworICB9CisKKyAgY29uc3QgRWlnZW46OkRlZmF1bHREZXZpY2UmIGRldmljZSgpIGNvbnN0IHsgcmV0dXJuIGNwdV9kZXZpY2VfOyB9CisKKyAgY29uc3QgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4mIGluMSgpIGNvbnN0IHsgcmV0dXJuIGluMV87IH0KKyAgY29uc3QgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4mIGluMigpIGNvbnN0IHsgcmV0dXJuIGluMl87IH0KKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4mIG91dCgpIHsgcmV0dXJuIG91dF87IH0KKyAgY29uc3QgRWlnZW46OlRlbnNvcjxmbG9hdCwgMT4mIGtlcm5lbDFkKCkgY29uc3QgeyByZXR1cm4ga2VybmVsXzFkXzsgfQorICBjb25zdCBFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiYga2VybmVsMmQoKSBjb25zdCB7IHJldHVybiBrZXJuZWxfMmRfOyB9CisgIGNvbnN0IEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+JiBrZXJuZWwzZCgpIGNvbnN0IHsgcmV0dXJuIGtlcm5lbF8zZF87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+JiBpbjFfOworICBjb25zdCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgaW4yXzsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4mIG91dF87CisKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMT4ga2VybmVsXzFkXzsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMj4ga2VybmVsXzJkXzsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4ga2VybmVsXzNkXzsKKworICBFaWdlbjo6RGVmYXVsdERldmljZSBjcHVfZGV2aWNlXzsKK307CisKKworLy8gQ29udGV4dCBmb3IgZXZhbHVhdGlvbiBvbiBHUFUKK3N0cnVjdCBHUFVDb250ZXh0IHsKKyAgR1BVQ29udGV4dChjb25zdCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIGluMSwgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjIsIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgb3V0KSA6IGluMV8oaW4xKSwgaW4yXyhpbjIpLCBvdXRfKG91dCksIGdwdV9kZXZpY2VfKCZzdHJlYW1fKSB7CisgICAgYXNzZXJ0KGN1ZGFNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8xZF8pLCAyKnNpemVvZihmbG9hdCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgICBmbG9hdCBrZXJuZWxfMWRfdmFsW10gPSB7My4xNGYsIDIuN2Z9OworICAgIGFzc2VydChjdWRhTWVtY3B5KGtlcm5lbF8xZF8sIGtlcm5lbF8xZF92YWwsIDIqc2l6ZW9mKGZsb2F0KSwgY3VkYU1lbWNweUhvc3RUb0RldmljZSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgYXNzZXJ0KGN1ZGFNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8yZF8pLCA0KnNpemVvZihmbG9hdCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgICBmbG9hdCBrZXJuZWxfMmRfdmFsW10gPSB7My4xNGYsIDIuN2YsIDAuMmYsIDcuMGZ9OworICAgIGFzc2VydChjdWRhTWVtY3B5KGtlcm5lbF8yZF8sIGtlcm5lbF8yZF92YWwsIDQqc2l6ZW9mKGZsb2F0KSwgY3VkYU1lbWNweUhvc3RUb0RldmljZSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgICAgYXNzZXJ0KGN1ZGFNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8zZF8pLCA4KnNpemVvZihmbG9hdCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgICBmbG9hdCBrZXJuZWxfM2RfdmFsW10gPSB7My4xNGYsIC0xLjBmLCAyLjdmLCAtMC4zZiwgMC4yZiwgLTAuN2YsIDcuMGYsIC0wLjVmfTsKKyAgICBhc3NlcnQoY3VkYU1lbWNweShrZXJuZWxfM2RfLCBrZXJuZWxfM2RfdmFsLCA4KnNpemVvZihmbG9hdCksIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpID09IGN1ZGFTdWNjZXNzKTsKKyAgfQorICB+R1BVQ29udGV4dCgpIHsKKyAgICBhc3NlcnQoY3VkYUZyZWUoa2VybmVsXzFkXykgPT0gY3VkYVN1Y2Nlc3MpOworICAgIGFzc2VydChjdWRhRnJlZShrZXJuZWxfMmRfKSA9PSBjdWRhU3VjY2Vzcyk7CisgICAgYXNzZXJ0KGN1ZGFGcmVlKGtlcm5lbF8zZF8pID09IGN1ZGFTdWNjZXNzKTsKKyAgfQorCisgIGNvbnN0IEVpZ2VuOjpHcHVEZXZpY2UmIGRldmljZSgpIGNvbnN0IHsgcmV0dXJuIGdwdV9kZXZpY2VfOyB9CisKKyAgY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjEoKSBjb25zdCB7IHJldHVybiBpbjFfOyB9CisgIGNvbnN0IEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgaW4yKCkgY29uc3QgeyByZXR1cm4gaW4yXzsgfQorICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIG91dCgpIHsgcmV0dXJuIG91dF87IH0KKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiA+IGtlcm5lbDFkKCkgY29uc3QgeyByZXR1cm4gRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiA+KGtlcm5lbF8xZF8sIDIpOyB9CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gPiBrZXJuZWwyZCgpIGNvbnN0IHsgcmV0dXJuIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4gPihrZXJuZWxfMmRfLCAyLCAyKTsgfQorICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4ga2VybmVsM2QoKSBjb25zdCB7IHJldHVybiBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4oa2VybmVsXzNkXywgMiwgMiwgMik7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgaW4xXzsKKyAgY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjJfOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIG91dF87CisKKyAgZmxvYXQqIGtlcm5lbF8xZF87CisgIGZsb2F0KiBrZXJuZWxfMmRfOworICBmbG9hdCoga2VybmVsXzNkXzsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW1fOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2VfOworfTsKKworCisvLyBUaGUgYWN0dWFsIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgordm9pZCB0ZXN0X2NvbnRleHR1YWxfZXZhbChDb250ZXh0KiBjb250ZXh0KQoreworICBjb250ZXh0LT5vdXQoKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0gY29udGV4dC0+aW4xKCkgKyBjb250ZXh0LT5pbjIoKSAqIDMuMTRmICsgY29udGV4dC0+aW4xKCkuY29uc3RhbnQoMi43MThmKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Cit2b2lkIHRlc3RfZm9yY2VkX2NvbnRleHR1YWxfZXZhbChDb250ZXh0KiBjb250ZXh0KQoreworICBjb250ZXh0LT5vdXQoKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0gKGNvbnRleHQtPmluMSgpICsgY29udGV4dC0+aW4yKCkpLmV2YWwoKSAqIDMuMTRmICsgY29udGV4dC0+aW4xKCkuY29uc3RhbnQoMi43MThmKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Cit2b2lkIHRlc3RfY29tcG91bmRfYXNzaWdubWVudChDb250ZXh0KiBjb250ZXh0KQoreworICBjb250ZXh0LT5vdXQoKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0gY29udGV4dC0+aW4xKCkuY29uc3RhbnQoMi43MThmKTsKKyAgY29udGV4dC0+b3V0KCkuZGV2aWNlKGNvbnRleHQtPmRldmljZSgpKSArPSBjb250ZXh0LT5pbjEoKSArIGNvbnRleHQtPmluMigpICogMy4xNGY7Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Cit2b2lkIHRlc3RfY29udHJhY3Rpb24oQ29udGV4dCogY29udGV4dCkKK3sKKyAgRWlnZW46OmFycmF5PHN0ZDo6cGFpcjxpbnQsIGludD4sIDI+IGRpbXM7CisgIGRpbXNbMF0gPSBzdGQ6Om1ha2VfcGFpcigxLCAxKTsKKyAgZGltc1sxXSA9IHN0ZDo6bWFrZV9wYWlyKDIsIDIpOworCisgIEVpZ2VuOjphcnJheTxpbnQsIDI+IHNoYXBlKDQwLCA1MCo3MCk7CisKKyAgRWlnZW46OkRTaXplczxpbnQsIDI+IGluZGljZXMoMCwwKTsKKyAgRWlnZW46OkRTaXplczxpbnQsIDI+IHNpemVzKDQwLDQwKTsKKworICBjb250ZXh0LT5vdXQoKS5yZXNoYXBlKHNoYXBlKS5zbGljZShpbmRpY2VzLCBzaXplcykuZGV2aWNlKGNvbnRleHQtPmRldmljZSgpKSA9IGNvbnRleHQtPmluMSgpLmNvbnRyYWN0KGNvbnRleHQtPmluMigpLCBkaW1zKTsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGV4dD4KK3ZvaWQgdGVzdF8xZF9jb252b2x1dGlvbihDb250ZXh0KiBjb250ZXh0KQoreworICBFaWdlbjo6RFNpemVzPGludCwgMz4gaW5kaWNlcygwLDAsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBzaXplcyg0MCw0OSw3MCk7CisKKyAgRWlnZW46OmFycmF5PGludCwgMT4gZGltcygxKTsKKyAgY29udGV4dC0+b3V0KCkuc2xpY2UoaW5kaWNlcywgc2l6ZXMpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPSBjb250ZXh0LT5pbjEoKS5jb252b2x2ZShjb250ZXh0LT5rZXJuZWwxZCgpLCBkaW1zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Cit2b2lkIHRlc3RfMmRfY29udm9sdXRpb24oQ29udGV4dCogY29udGV4dCkKK3sKKyAgRWlnZW46OkRTaXplczxpbnQsIDM+IGluZGljZXMoMCwwLDApOworICBFaWdlbjo6RFNpemVzPGludCwgMz4gc2l6ZXMoNDAsNDksNjkpOworCisgIEVpZ2VuOjphcnJheTxpbnQsIDI+IGRpbXMoMSwyKTsKKyAgY29udGV4dC0+b3V0KCkuc2xpY2UoaW5kaWNlcywgc2l6ZXMpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPSBjb250ZXh0LT5pbjEoKS5jb252b2x2ZShjb250ZXh0LT5rZXJuZWwyZCgpLCBkaW1zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Cit2b2lkIHRlc3RfM2RfY29udm9sdXRpb24oQ29udGV4dCogY29udGV4dCkKK3sKKyAgRWlnZW46OkRTaXplczxpbnQsIDM+IGluZGljZXMoMCwwLDApOworICBFaWdlbjo6RFNpemVzPGludCwgMz4gc2l6ZXMoMzksNDksNjkpOworCisgIEVpZ2VuOjphcnJheTxpbnQsIDM+IGRpbXMoMCwxLDIpOworICBjb250ZXh0LT5vdXQoKS5zbGljZShpbmRpY2VzLCBzaXplcykuZGV2aWNlKGNvbnRleHQtPmRldmljZSgpKSA9IGNvbnRleHQtPmluMSgpLmNvbnZvbHZlKGNvbnRleHQtPmtlcm5lbDNkKCksIGRpbXMpOworfQorCisKK3ZvaWQgdGVzdF9jcHUoKSB7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IGluMSg0MCw1MCw3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IGluMig0MCw1MCw3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IG91dCg0MCw1MCw3MCk7CisKKyAgaW4xID0gaW4xLnJhbmRvbSgpICsgaW4xLmNvbnN0YW50KDEwLjBmKTsKKyAgaW4yID0gaW4yLnJhbmRvbSgpICsgaW4yLmNvbnN0YW50KDEwLjBmKTsKKworICBDUFVDb250ZXh0IGNvbnRleHQoaW4xLCBpbjIsIG91dCk7CisgIHRlc3RfY29udGV4dHVhbF9ldmFsKCZjb250ZXh0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmICsgMi43MThmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZXN0X2ZvcmNlZF9jb250ZXh0dWFsX2V2YWwoJmNvbnRleHQpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDUwOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzA7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksIChpbjEoaSxqLGspICsgaW4yKGksaixrKSkgKiAzLjE0ZiArIDIuNzE4Zik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVzdF9jb21wb3VuZF9hc3NpZ25tZW50KCZjb250ZXh0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmICsgMi43MThmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZXN0X2NvbnRyYWN0aW9uKCZjb250ZXh0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0MDsgKytqKSB7CisgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLDApOworICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MDsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzA7ICsrbCkgeworICAgICAgICAgIGV4cGVjdGVkICs9IGluMShpLCBrLCBsKSAqIGluMihqLCBrLCBsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChleHBlY3RlZCwgcmVzdWx0KTsKKyAgICB9CisgIH0KKworICB0ZXN0XzFkX2NvbnZvbHV0aW9uKCZjb250ZXh0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCAoaW4xKGksaixrKSAqIDMuMTRmICsgaW4xKGksaisxLGspICogMi43ZikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlc3RfMmRfY29udm9sdXRpb24oJmNvbnRleHQpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ5OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNjk7ICsraykgeworICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGspOworICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IChpbjEoaSxqLGspICogMy4xNGYgKyBpbjEoaSxqKzEsaykgKiAyLjdmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluMShpLGosaysxKSAqIDAuMmYgKyBpbjEoaSxqKzEsaysxKSAqIDcuMGYpOworICAgICAgICBpZiAoZmFicyhleHBlY3RlZCkgPCAxZS00ZiAmJiBmYWJzKHJlc3VsdCkgPCAxZS00ZikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFZFUklGWV9JU19BUFBST1goZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVzdF8zZF9jb252b2x1dGlvbigmY29udGV4dCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzk7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA2OTsgKytrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayk7CisgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gKGluMShpLGosaykgKiAzLjE0ZiArIGluMShpLGorMSxrKSAqIDIuN2YgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSxqLGsrMSkgKiAwLjJmICsgaW4xKGksaisxLGsrMSkgKiA3LjBmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluMShpKzEsaixrKSAqIC0xLjBmICsgaW4xKGkrMSxqKzEsaykgKiAtMC4zZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpKzEsaixrKzEpICogLTAuN2YgKyBpbjEoaSsxLGorMSxrKzEpICogLTAuNWYpOworICAgICAgICBpZiAoZmFicyhleHBlY3RlZCkgPCAxZS00ZiAmJiBmYWJzKHJlc3VsdCkgPCAxZS00ZikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFZFUklGWV9JU19BUFBST1goZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9ncHUoKSB7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IGluMSg0MCw1MCw3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IGluMig0MCw1MCw3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IG91dCg0MCw1MCw3MCk7CisgIGluMSA9IGluMS5yYW5kb20oKSArIGluMS5jb25zdGFudCgxMC4wZik7CisgIGluMiA9IGluMi5yYW5kb20oKSArIGluMi5jb25zdGFudCgxMC4wZik7CisKKyAgc3RkOjpzaXplX3QgaW4xX2J5dGVzID0gaW4xLnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IGluMl9ieXRlcyA9IGluMi5zaXplKCkgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKworICBmbG9hdCogZF9pbjE7CisgIGZsb2F0KiBkX2luMjsKKyAgZmxvYXQqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX2luMSksIGluMV9ieXRlcyk7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfaW4yKSwgaW4yX2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOworCisgIGN1ZGFNZW1jcHkoZF9pbjEsIGluMS5kYXRhKCksIGluMV9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisgIGN1ZGFNZW1jcHkoZF9pbjIsIGluMi5kYXRhKCksIGluMl9ieXRlcywgY3VkYU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjEoZF9pbjEsIDQwLDUwLDcwKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjIoZF9pbjIsIDQwLDUwLDcwKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9vdXQoZF9vdXQsIDQwLDUwLDcwKTsKKworICBHUFVDb250ZXh0IGNvbnRleHQoZ3B1X2luMSwgZ3B1X2luMiwgZ3B1X291dCk7CisgIHRlc3RfY29udGV4dHVhbF9ldmFsKCZjb250ZXh0KTsKKyAgYXNzZXJ0KGN1ZGFNZW1jcHkob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCkgPT0gY3VkYVN1Y2Nlc3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDUwOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzA7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksIGluMShpLGosaykgKyBpbjIoaSxqLGspICogMy4xNGYgKyAyLjcxOGYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlc3RfZm9yY2VkX2NvbnRleHR1YWxfZXZhbCgmY29udGV4dCk7CisgIGFzc2VydChjdWRhTWVtY3B5KG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpID09IGN1ZGFTdWNjZXNzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCAoaW4xKGksaixrKSArIGluMihpLGosaykpICogMy4xNGYgKyAyLjcxOGYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRlc3RfY29tcG91bmRfYXNzaWdubWVudCgmY29udGV4dCk7CisgIGFzc2VydChjdWRhTWVtY3B5KG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpID09IGN1ZGFTdWNjZXNzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmICsgMi43MThmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZXN0X2NvbnRyYWN0aW9uKCZjb250ZXh0KTsKKyAgYXNzZXJ0KGN1ZGFNZW1jcHkob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCkgPT0gY3VkYVN1Y2Nlc3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQwOyArK2opIHsKKyAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosMCk7CisgICAgICBmbG9hdCBleHBlY3RlZCA9IDA7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDUwOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3MDsgKytsKSB7CisgICAgICAgICAgZXhwZWN0ZWQgKz0gaW4xKGksIGssIGwpICogaW4yKGosIGssIGwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGV4cGVjdGVkLCByZXN1bHQpOworICAgIH0KKyAgfQorCisgIHRlc3RfMWRfY29udm9sdXRpb24oJmNvbnRleHQpOworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGNvbnRleHQuZGV2aWNlKCkuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShjb250ZXh0LmRldmljZSgpLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3MDsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwgKGluMShpLGosaykgKiAzLjE0ZiArIGluMShpLGorMSxrKSAqIDIuN2YpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZXN0XzJkX2NvbnZvbHV0aW9uKCZjb250ZXh0KTsKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBjb250ZXh0LmRldmljZSgpLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoY29udGV4dC5kZXZpY2UoKS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ5OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNjk7ICsraykgeworICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGspOworICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IChpbjEoaSxqLGspICogMy4xNGYgKyBpbjEoaSxqKzEsaykgKiAyLjdmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKzEpICogMC4yZiArIGluMShpLGorMSxrKzEpICogNy4wZik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1goZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVzdF8zZF9jb252b2x1dGlvbigmY29udGV4dCk7CisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgY29udGV4dC5kZXZpY2UoKS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYVN0cmVhbVN5bmNocm9uaXplKGNvbnRleHQuZGV2aWNlKCkuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDY5OyArK2spIHsKKyAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGspOworICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IChpbjEoaSxqLGspICogMy4xNGYgKyBpbjEoaSxqKzEsaykgKiAyLjdmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKzEpICogMC4yZiArIGluMShpLGorMSxrKzEpICogNy4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpKzEsaixrKSAqIC0xLjBmICsgaW4xKGkrMSxqKzEsaykgKiAtMC4zZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpKzEsaixrKzEpICogLTAuN2YgKyBpbjEoaSsxLGorMSxrKzEpICogLTAuNWYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKGV4cGVjdGVkLCByZXN1bHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfZGV2aWNlKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jcHUoKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfZ3B1KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGV2aWNlX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGV2aWNlX3N5Y2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzk3NTMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kZXZpY2Vfc3ljbC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYKKy8vIE1laGRpIEdvbGkgICAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gUmFscGggUG90dGVyICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBMdWtlIEl3YW5za2kgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIENvbnRhY3Q6IDxlaWdlbkBjb2RlcGxheS5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorI2RlZmluZSBFSUdFTl9URVNUX05PX0NPTVBMRVgKKyNkZWZpbmUgRUlHRU5fVEVTVF9GVU5DIGN4eDExX3RlbnNvcl9kZXZpY2Vfc3ljbAorI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50CisjZGVmaW5lIEVJR0VOX1VTRV9TWUNMCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgorCit2b2lkIHRlc3RfZGV2aWNlX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CisgIHN0ZDo6Y291dCA8PCJIZWxvIGZyb20gQ29tcHV0ZUNwcDogdGhlIHJlcXVlc3RlZCBkZXZpY2UgZXhpc3RzIGFuZCB0aGUgZGV2aWNlIG5hbWUgaXMgOiAiCisgICAgPDwgc3ljbF9kZXZpY2UubV9xdWV1ZS5nZXRfZGV2aWNlKCkuIHRlbXBsYXRlIGdldF9pbmZvPGNsOjpzeWNsOjppbmZvOjpkZXZpY2U6Om5hbWU+KCkgPDxzdGQ6OmVuZGw7OworfQordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9kZXZpY2Vfc3ljbCgpIHsKKyAgY2w6OnN5Y2w6OmdwdV9zZWxlY3RvciBzOworICBFaWdlbjo6U3ljbERldmljZSBzeWNsX2RldmljZShzKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZGV2aWNlX3N5Y2woc3ljbF9kZXZpY2UpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RpbWVuc2lvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kaW1lbnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjE2OGUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kaW1lbnNpb24uY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKKworc3RhdGljIHZvaWQgdGVzdF9keW5hbWljX3NpemUoKQoreworICBFaWdlbjo6RFNpemVzPGludCwgMz4gZGltZW5zaW9ucygyLDMsNyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpRWlnZW46OmludGVybmFsOjphcnJheV9nZXQ8MD4oZGltZW5zaW9ucyksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKGludClFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2dldDwxPihkaW1lbnNpb25zKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50KUVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KGRpbWVuc2lvbnMpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9ucy5Ub3RhbFNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwoKGludClkaW1lbnNpb25zWzBdLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9uc1sxXSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50KWRpbWVuc2lvbnNbMl0sIDcpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2ZpeGVkX3NpemUoKQoreworICBFaWdlbjo6U2l6ZXM8MiwzLDc+IGRpbWVuc2lvbnM7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpRWlnZW46OmludGVybmFsOjphcnJheV9nZXQ8MD4oZGltZW5zaW9ucyksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKGludClFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2dldDwxPihkaW1lbnNpb25zKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50KUVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KGRpbWVuc2lvbnMpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9ucy5Ub3RhbFNpemUoKSwgMiozKjcpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21hdGNoKCkKK3sKKyAgRWlnZW46OkRTaXplczx1bnNpZ25lZCBpbnQsIDM+IGR5bigodW5zaWduZWQgaW50KTIsKHVuc2lnbmVkIGludCkzLCh1bnNpZ25lZCBpbnQpNyk7CisgIEVpZ2VuOjpTaXplczwyLDMsNz4gc3RhdDsKKyAgVkVSSUZZX0lTX0VRVUFMKEVpZ2VuOjpkaW1lbnNpb25zX21hdGNoKGR5biwgc3RhdCksIHRydWUpOworCisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBkeW4xKDIsMyw3KTsKKyAgRWlnZW46OkRTaXplczxpbnQsIDI+IGR5bjIoMiwzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKEVpZ2VuOjpkaW1lbnNpb25zX21hdGNoKGR5bjEsIGR5bjIpLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcmFua196ZXJvKCkKK3sKKyAgRWlnZW46OlNpemVzPD4gc2NhbGFyOworICBWRVJJRllfSVNfRVFVQUwoKGludClzY2FsYXIuVG90YWxTaXplKCksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGludClzY2FsYXIucmFuaygpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpaW50ZXJuYWw6OmFycmF5X3Byb2Qoc2NhbGFyKSwgMSk7CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDA+IGRzY2FsYXI7CisgIFZFUklGWV9JU19FUVVBTCgoaW50KWRzY2FsYXIuVG90YWxTaXplKCksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGludClkc2NhbGFyLnJhbmsoKSwgMCk7Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfZGltZW5zaW9uKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZHluYW1pY19zaXplKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9maXhlZF9zaXplKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9tYXRjaCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfcmFua196ZXJvKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZW1wdHkuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZW1wdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWVhNDIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9lbXB0eS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKworCitzdGF0aWMgdm9pZCB0ZXN0X2VtcHR5X3RlbnNvcigpCit7CisgIFRlbnNvcjxmbG9hdCwgMj4gc291cmNlOworICBUZW5zb3I8ZmxvYXQsIDI+IHRndDEgPSBzb3VyY2U7CisgIFRlbnNvcjxmbG9hdCwgMj4gdGd0Mihzb3VyY2UpOworICBUZW5zb3I8ZmxvYXQsIDI+IHRndDM7CisgIHRndDMgPSB0Z3QxOworICB0Z3QzID0gdGd0MjsKK30KKworc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9maXhlZF9zaXplX3RlbnNvcigpCit7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MD4gPiBzb3VyY2U7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MD4gPiB0Z3QxID0gc291cmNlOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDA+ID4gdGd0Mihzb3VyY2UpOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDA+ID4gdGd0MzsKKyAgdGd0MyA9IHRndDE7CisgIHRndDMgPSB0Z3QyOworfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfZW1wdHkoKQoreworICAgQ0FMTF9TVUJURVNUKHRlc3RfZW1wdHlfdGVuc29yKCkpOworICAgQ0FMTF9TVUJURVNUKHRlc3RfZW1wdHlfZml4ZWRfc2l6ZV90ZW5zb3IoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9leHByLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2V4cHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTI0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9leHByLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF8xZCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMT4gdmVjMSg2KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBSb3dNYWpvcj4gdmVjMig2KTsKKworICB2ZWMxKDApID0gNC4wOyAgdmVjMigwKSA9IDAuMDsKKyAgdmVjMSgxKSA9IDguMDsgIHZlYzIoMSkgPSAxLjA7CisgIHZlYzEoMikgPSAxNS4wOyB2ZWMyKDIpID0gMi4wOworICB2ZWMxKDMpID0gMTYuMDsgdmVjMigzKSA9IDMuMDsKKyAgdmVjMSg0KSA9IDIzLjA7IHZlYzIoNCkgPSA0LjA7CisgIHZlYzEoNSkgPSA0Mi4wOyB2ZWMyKDUpID0gNS4wOworCisgIGZsb2F0IGRhdGEzWzZdOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAxPj4gdmVjMyhkYXRhMywgNik7CisgIHZlYzMgPSB2ZWMxLnNxcnQoKTsKKyAgZmxvYXQgZGF0YTRbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDEsIFJvd01ham9yPj4gdmVjNChkYXRhNCwgNik7CisgIHZlYzQgPSB2ZWMyLnNxdWFyZSgpOworICBmbG9hdCBkYXRhNVs2XTsKKyAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMSwgUm93TWFqb3I+PiB2ZWM1KGRhdGE1LCA2KTsKKyAgdmVjNSA9IHZlYzIuY3ViZSgpOworCisgIFZFUklGWV9JU19BUFBST1godmVjMygwKSwgc3FydGYoNC4wKSk7CisgIFZFUklGWV9JU19BUFBST1godmVjMygxKSwgc3FydGYoOC4wKSk7CisgIFZFUklGWV9JU19BUFBST1godmVjMygyKSwgc3FydGYoMTUuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMyksIHNxcnRmKDE2LjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDQpLCBzcXJ0ZigyMy4wKSk7CisgIFZFUklGWV9JU19BUFBST1godmVjMyg1KSwgc3FydGYoNDIuMCkpOworCisgIFZFUklGWV9JU19BUFBST1godmVjNCgwKSwgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNCgxKSwgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNCgyKSwgMi4wZiAqIDIuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoMyksIDMuMGYgKiAzLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM0KDQpLCA0LjBmICogNC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNCg1KSwgNS4wZiAqIDUuMGYpOworCisgIFZFUklGWV9JU19BUFBST1godmVjNSgwKSwgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNSgxKSwgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNSgyKSwgMi4wZiAqIDIuMGYgKiAyLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM1KDMpLCAzLjBmICogMy4wZiAqIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzUoNCksIDQuMGYgKiA0LjBmICogNC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNSg1KSwgNS4wZiAqIDUuMGYgKiA1LjBmKTsKKworICB2ZWMzID0gdmVjMSArIHZlYzI7CisgIFZFUklGWV9JU19BUFBST1godmVjMygwKSwgNC4wZiArIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMSksIDguMGYgKyAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDIpLCAxNS4wZiArIDIuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMyksIDE2LjBmICsgMy4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjMyg0KSwgMjMuMGYgKyA0LjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDUpLCA0Mi4wZiArIDUuMGYpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0XzJkKCkKK3sKKyAgZmxvYXQgZGF0YTFbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+PiBtYXQxKGRhdGExLCAyLCAzKTsKKyAgZmxvYXQgZGF0YTJbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDIsIFJvd01ham9yPj4gbWF0MihkYXRhMiwgMiwgMyk7CisKKyAgbWF0MSgwLDApID0gMC4wOworICBtYXQxKDAsMSkgPSAxLjA7CisgIG1hdDEoMCwyKSA9IDIuMDsKKyAgbWF0MSgxLDApID0gMy4wOworICBtYXQxKDEsMSkgPSA0LjA7CisgIG1hdDEoMSwyKSA9IDUuMDsKKworICBtYXQyKDAsMCkgPSAtMC4wOworICBtYXQyKDAsMSkgPSAtMS4wOworICBtYXQyKDAsMikgPSAtMi4wOworICBtYXQyKDEsMCkgPSAtMy4wOworICBtYXQyKDEsMSkgPSAtNC4wOworICBtYXQyKDEsMikgPSAtNS4wOworCisgIFRlbnNvcjxmbG9hdCwgMj4gbWF0MygyLDMpOworICBUZW5zb3I8ZmxvYXQsIDIsIFJvd01ham9yPiBtYXQ0KDIsMyk7CisgIG1hdDMgPSBtYXQxLmFicygpOworICBtYXQ0ID0gbWF0Mi5hYnMoKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwwKSwgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEpLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMiksIDIuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwwKSwgMy4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLDEpLCA0LjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMiksIDUuMGYpOworCisgIFZFUklGWV9JU19BUFBST1gobWF0NCgwLDApLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMSksIDEuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwyKSwgMi4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgxLDApLCAzLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMSksIDQuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwyKSwgNS4wZik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfM2QoKQoreworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDEoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKKworICBmbG9hdCB2YWwgPSAxLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBtYXQxKGksaixrKSA9IHZhbDsKKyAgICAgICAgbWF0MihpLGosaykgPSB2YWw7CisgICAgICAgIHZhbCArPSAxLjBmOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLDMsNyk7CisgIG1hdDMgPSBtYXQxICsgbWF0MTsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0NCgyLDMsNyk7CisgIG1hdDQgPSBtYXQyICogMy4xNGY7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0NSgyLDMsNyk7CisgIG1hdDUgPSBtYXQxLmludmVyc2UoKS5sb2coKTsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0NigyLDMsNyk7CisgIG1hdDYgPSBtYXQyLnBvdygwLjVmKSAqIDMuMTRmOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDcoMiwzLDcpOworICBtYXQ3ID0gbWF0MS5jd2lzZU1heChtYXQ1ICogMi4wZikuZXhwKCk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDgoMiwzLDcpOworICBtYXQ4ID0gKC1tYXQyKS5leHAoKSAqIDMuMTRmOworICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiBtYXQ5KDIsMyw3KTsKKyAgbWF0OSA9IG1hdDIgKyAzLjE0ZjsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0MTAoMiwzLDcpOworICBtYXQxMCA9IG1hdDIgLSAzLjE0ZjsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0MTEoMiwzLDcpOworICBtYXQxMSA9IG1hdDIgLyAzLjE0ZjsKKworICB2YWwgPSAxLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCB2YWwgKyB2YWwpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoaSxqLGspLCB2YWwgKiAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0NShpLGosayksIGxvZ2YoMS4wZi92YWwpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KGksaixrKSwgc3FydGYodmFsKSAqIDMuMTRmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ3KGksaixrKSwgZXhwZigoc3RkOjptYXgpKHZhbCwgbWF0NShpLGosaykgKiAyLjBmKSkpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDgoaSxqLGspLCBleHBmKC12YWwpICogMy4xNGYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDkoaSxqLGspLCB2YWwgKyAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MTAoaSxqLGspLCB2YWwgLSAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MTEoaSxqLGspLCB2YWwgLyAzLjE0Zik7CisgICAgICAgIHZhbCArPSAxLjBmOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN0YW50cygpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLDMsNyk7CisKKyAgZmxvYXQgdmFsID0gMS4wZjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgbWF0MShpLGosaykgPSB2YWw7CisgICAgICAgIHZhbCArPSAxLjBmOworICAgICAgfQorICAgIH0KKyAgfQorICBtYXQyID0gbWF0MS5jb25zdGFudCgzLjE0Zik7CisgIG1hdDMgPSBtYXQxLmN3aXNlTWF4KDcuM2YpLmV4cCgpOworCisgIHZhbCA9IDEuMGY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MihpLGosayksIDMuMTRmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksaixrKSwgZXhwZigoc3RkOjptYXgpKHZhbCwgNy4zZikpKTsKKyAgICAgICAgdmFsICs9IDEuMGY7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYm9vbGVhbigpCit7CisgIFRlbnNvcjxpbnQsIDE+IHZlYyg2KTsKKyAgc3RkOjpjb3B5X24oc3RkOjpiZWdpbih7MCwgMSwgMiwgMywgNCwgNX0pLCA2LCB2ZWMuZGF0YSgpKTsKKworICAvLyBUZXN0IHx8LgorICBUZW5zb3I8Ym9vbCwgMT4gYm9vbDEgPSB2ZWMgPCB2ZWMuY29uc3RhbnQoMSkgfHwgdmVjID4gdmVjLmNvbnN0YW50KDQpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDFbMF0sIHRydWUpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDFbMV0sIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJvb2wxWzJdLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTChib29sMVszXSwgZmFsc2UpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDFbNF0sIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJvb2wxWzVdLCB0cnVlKTsKKworICAvLyBUZXN0ICYmLCBpbmNsdWRpbmcgY2FzdCBvZiBvcGVyYW5kIHZlYy4KKyAgVGVuc29yPGJvb2wsIDE+IGJvb2wyID0gdmVjLmNhc3Q8Ym9vbD4oKSAmJiB2ZWMgPCB2ZWMuY29uc3RhbnQoNCk7CisgIFZFUklGWV9JU19FUVVBTChib29sMlswXSwgZmFsc2UpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDJbMV0sIHRydWUpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDJbMl0sIHRydWUpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDJbM10sIHRydWUpOworICBWRVJJRllfSVNfRVFVQUwoYm9vbDJbNF0sIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGJvb2wyWzVdLCBmYWxzZSk7CisKKyAgLy8gQ29tcGlsYXRpb24gdGVzdHM6CisgIC8vIFRlc3QgVGVuc29yPGJvb2w+IGFnYWluc3QgcmVzdWx0cyBvZiBjYXN0IG9yIGNvbXBhcmlzb247IHZlcmlmaWVzIHRoYXQKKyAgLy8gQ29lZmZSZXR1cm5UeXBlIGlzIHNldCB0byBtYXRjaCBPcCByZXR1cm4gdHlwZSBvZiBib29sIGZvciBVbmFyeSBhbmQgQmluYXJ5CisgIC8vIE9wcy4KKyAgVGVuc29yPGJvb2wsIDE+IGJvb2wzID0gdmVjLmNhc3Q8Ym9vbD4oKSAmJiBib29sMjsKKyAgYm9vbDMgPSB2ZWMgPCB2ZWMuY29uc3RhbnQoNCkgJiYgYm9vbDI7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZnVuY3RvcnMoKQoreworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDEoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDMoMiwzLDcpOworCisgIGZsb2F0IHZhbCA9IDEuMGY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIG1hdDEoaSxqLGspID0gdmFsOworICAgICAgICB2YWwgKz0gMS4wZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbWF0MiA9IG1hdDEuaW52ZXJzZSgpLnVuYXJ5RXhwcigmYXNpbmYpOworICBtYXQzID0gbWF0MS51bmFyeUV4cHIoJnRhbmhmKTsKKworICB2YWwgPSAxLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDIoaSxqLGspLCBhc2luZigxLjBmIC8gbWF0MShpLGosaykpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksaixrKSwgdGFuaGYobWF0MShpLGosaykpKTsKKyAgICAgICAgdmFsICs9IDEuMGY7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdHlwZV9jYXN0aW5nKCkKK3sKKyAgVGVuc29yPGJvb2wsIDM+IG1hdDEoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwzLDcpOworICBUZW5zb3I8ZG91YmxlLCAzPiBtYXQzKDIsMyw3KTsKKyAgbWF0MS5zZXRSYW5kb20oKTsKKyAgbWF0Mi5zZXRSYW5kb20oKTsKKworICBtYXQzID0gbWF0MS5jYXN0PGRvdWJsZT4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksaixrKSwgbWF0MShpLGosaykgPyAxLjAgOiAwLjApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG1hdDMgPSBtYXQyLmNhc3Q8ZG91YmxlPigpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCBzdGF0aWNfY2FzdDxkb3VibGU+KG1hdDIoaSxqLGspKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2VsZWN0KCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzPiBzZWxlY3RvcigyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0KDIsMyw3KTsKKworICBzZWxlY3Rvci5zZXRSYW5kb20oKTsKKyAgbWF0MS5zZXRSYW5kb20oKTsKKyAgbWF0Mi5zZXRSYW5kb20oKTsKKyAgcmVzdWx0ID0gKHNlbGVjdG9yID4gc2VsZWN0b3IuY29uc3RhbnQoMC41ZikpLnNlbGVjdChtYXQxLCBtYXQyKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLGosayksIChzZWxlY3RvcihpLGosaykgPiAwLjVmKSA/IG1hdDEoaSxqLGspIDogbWF0MihpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfZXhwcigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0XzFkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8yZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfM2QoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbnN0YW50cygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYm9vbGVhbigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZnVuY3RvcnMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3R5cGVfY2FzdGluZygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2VsZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZmZ0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZmdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNGViYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZmdC5jcHAKQEAgLTAsMCArMSwyNzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEppYW53ZWkgQ3VpIDx0aHVjandAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZmZ0XzJEX2dvbGRlbigpIHsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBpbnB1dCgyLCAzKTsKKyAgaW5wdXQoMCwgMCkgPSAxOworICBpbnB1dCgwLCAxKSA9IDI7CisgIGlucHV0KDAsIDIpID0gMzsKKyAgaW5wdXQoMSwgMCkgPSA0OworICBpbnB1dCgxLCAxKSA9IDU7CisgIGlucHV0KDEsIDIpID0gNjsKKworICBhcnJheTxwdHJkaWZmX3QsIDI+IGZmdDsKKyAgZmZ0WzBdID0gMDsKKyAgZmZ0WzFdID0gMTsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMiwgRGF0YUxheW91dD4gb3V0cHV0ID0gaW5wdXQudGVtcGxhdGUgZmZ0PEVpZ2VuOjpCb3RoUGFydHMsIEVpZ2VuOjpGRlRfRk9SV0FSRD4oZmZ0KTsKKworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IG91dHB1dF9nb2xkZW5bNl07IC8vIGluIENvbE1ham9yIG9yZGVyCisgIG91dHB1dF9nb2xkZW5bMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDIxLCAwKTsKKyAgb3V0cHV0X2dvbGRlblsxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTksIDApOworICBvdXRwdXRfZ29sZGVuWzJdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMywgMS43MzIwNSk7CisgIG91dHB1dF9nb2xkZW5bM10gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KCAwLCAwKTsKKyAgb3V0cHV0X2dvbGRlbls0XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTMsIC0xLjczMjA1KTsKKyAgb3V0cHV0X2dvbGRlbls1XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMCAsMCk7CisKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBjX29mZnNldCA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMS4wLCAxLjApOworCisgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMCkgKyBjX29mZnNldCwgb3V0cHV0X2dvbGRlblswXSArIGNfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgxKSArIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzFdICsgY19vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gob3V0cHV0KDIpICsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bMl0gKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMykgKyBjX29mZnNldCwgb3V0cHV0X2dvbGRlblszXSArIGNfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCg0KSArIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzRdICsgY19vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gob3V0cHV0KDUpICsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bNV0gKyBjX29mZnNldCk7CisgIH0KKyAgZWxzZSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMCkrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzBdKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMSkrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzJdKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMikrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzRdKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMykrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzFdKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoNCkrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzNdKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoNSkrIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzVdKyBjX29mZnNldCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9mZnRfY29tcGxleF9pbnB1dF9nb2xkZW4oKSB7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCBDb2xNYWpvcj4gaW5wdXQoNSk7CisgIGlucHV0KDApID0gc3RkOjpjb21wbGV4PGZsb2F0PigxLCAxKTsKKyAgaW5wdXQoMSkgPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDIsIDIpOworICBpbnB1dCgyKSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMywgMyk7CisgIGlucHV0KDMpID0gc3RkOjpjb21wbGV4PGZsb2F0Pig0LCA0KTsKKyAgaW5wdXQoNCkgPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDUsIDUpOworCisgIGFycmF5PHB0cmRpZmZfdCwgMT4gZmZ0OworICBmZnRbMF0gPSAwOworCisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCBDb2xNYWpvcj4gZm9yd2FyZF9vdXRwdXRfYm90aF9wYXJ0cyA9IGlucHV0LmZmdDxCb3RoUGFydHMsIEZGVF9GT1JXQVJEPihmZnQpOworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgQ29sTWFqb3I+IHJldmVyc2Vfb3V0cHV0X2JvdGhfcGFydHMgPSBpbnB1dC5mZnQ8Qm90aFBhcnRzLCBGRlRfUkVWRVJTRT4oZmZ0KTsKKworICBUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiBmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQgPSBpbnB1dC5mZnQ8UmVhbFBhcnQsIEZGVF9GT1JXQVJEPihmZnQpOworICBUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiByZXZlcnNlX291dHB1dF9yZWFsX3BhcnQgPSBpbnB1dC5mZnQ8UmVhbFBhcnQsIEZGVF9SRVZFUlNFPihmZnQpOworCisgIFRlbnNvcjxmbG9hdCwgMSwgQ29sTWFqb3I+IGZvcndhcmRfb3V0cHV0X2ltYWdfcGFydCA9IGlucHV0LmZmdDxJbWFnUGFydCwgRkZUX0ZPUldBUkQ+KGZmdCk7CisgIFRlbnNvcjxmbG9hdCwgMSwgQ29sTWFqb3I+IHJldmVyc2Vfb3V0cHV0X2ltYWdfcGFydCA9IGlucHV0LmZmdDxJbWFnUGFydCwgRkZUX1JFVkVSU0U+KGZmdCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGZvcndhcmRfb3V0cHV0X2JvdGhfcGFydHMuZGltZW5zaW9uKDApLCBpbnB1dC5kaW1lbnNpb24oMCkpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZV9vdXRwdXRfYm90aF9wYXJ0cy5kaW1lbnNpb24oMCksIGlucHV0LmRpbWVuc2lvbigwKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGZvcndhcmRfb3V0cHV0X3JlYWxfcGFydC5kaW1lbnNpb24oMCksIGlucHV0LmRpbWVuc2lvbigwKSk7CisgIFZFUklGWV9JU19FUVVBTChyZXZlcnNlX291dHB1dF9yZWFsX3BhcnQuZGltZW5zaW9uKDApLCBpbnB1dC5kaW1lbnNpb24oMCkpOworCisgIFZFUklGWV9JU19FUVVBTChmb3J3YXJkX291dHB1dF9pbWFnX3BhcnQuZGltZW5zaW9uKDApLCBpbnB1dC5kaW1lbnNpb24oMCkpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZV9vdXRwdXRfaW1hZ19wYXJ0LmRpbWVuc2lvbigwKSwgaW5wdXQuZGltZW5zaW9uKDApKTsKKworICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGZvcndhcmRfZ29sZGVuX3Jlc3VsdFs1XTsKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiByZXZlcnNlX2dvbGRlbl9yZXN1bHRbNV07CisKKyAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzBdID0gc3RkOjpjb21wbGV4PGZsb2F0PigxNS4wMDAwMDAwMDAwMDAwMDAsKzE1LjAwMDAwMDAwMDAwMDAwMCk7CisgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFsxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTUuOTQwOTU0ODAxMTc3OTM1LCArMC45NDA5NTQ4MDExNzc5MzQpOworICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0zLjMxMjI5OTI0MDU4MjI2NiwgLTEuNjg3NzAwNzU5NDE3NzM1KTsKKyAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzNdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMS42ODc3MDA3NTk0MTc3MzUsIC0zLjMxMjI5OTI0MDU4MjI2Nik7CisgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFs0XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oIDAuOTQwOTU0ODAxMTc3OTM0LCAtNS45NDA5NTQ4MDExNzc5MzUpOworCisgIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFswXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oIDMuMDAwMDAwMDAwMDAwMDAwLCArIDMuMDAwMDAwMDAwMDAwMDAwKTsKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzFdID0gc3RkOjpjb21wbGV4PGZsb2F0PiggMC4xODgxOTA5NjAyMzU1ODcsIC0gMS4xODgxOTA5NjAyMzU1ODcpOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0wLjMzNzU0MDE1MTg4MzU0NywgLSAwLjY2MjQ1OTg0ODExNjQ1Myk7CisgIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFszXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTAuNjYyNDU5ODQ4MTE2NDUzLCAtIDAuMzM3NTQwMTUxODgzNTQ3KTsKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzRdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMS4xODgxOTA5NjAyMzU1ODcsICsgMC4xODgxOTA5NjAyMzU1ODcpOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZvcndhcmRfb3V0cHV0X2JvdGhfcGFydHMoaSksIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQoaSksIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZm9yd2FyZF9vdXRwdXRfaW1hZ19wYXJ0KGkpLCBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJldmVyc2Vfb3V0cHV0X2JvdGhfcGFydHMoaSksIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXZlcnNlX291dHB1dF9yZWFsX3BhcnQoaSksIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1gocmV2ZXJzZV9vdXRwdXRfaW1hZ19wYXJ0KGkpLCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2ZmdF9yZWFsX2lucHV0X2dvbGRlbigpIHsKKyAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4gaW5wdXQoNSk7CisgIGlucHV0KDApID0gMS4wOworICBpbnB1dCgxKSA9IDIuMDsKKyAgaW5wdXQoMikgPSAzLjA7CisgIGlucHV0KDMpID0gNC4wOworICBpbnB1dCg0KSA9IDUuMDsKKworICBhcnJheTxwdHJkaWZmX3QsIDE+IGZmdDsKKyAgZmZ0WzBdID0gMDsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgQ29sTWFqb3I+IGZvcndhcmRfb3V0cHV0X2JvdGhfcGFydHMgPSBpbnB1dC5mZnQ8Qm90aFBhcnRzLCBGRlRfRk9SV0FSRD4oZmZ0KTsKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEsIENvbE1ham9yPiByZXZlcnNlX291dHB1dF9ib3RoX3BhcnRzID0gaW5wdXQuZmZ0PEJvdGhQYXJ0cywgRkZUX1JFVkVSU0U+KGZmdCk7CisKKyAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4gZm9yd2FyZF9vdXRwdXRfcmVhbF9wYXJ0ID0gaW5wdXQuZmZ0PFJlYWxQYXJ0LCBGRlRfRk9SV0FSRD4oZmZ0KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4gcmV2ZXJzZV9vdXRwdXRfcmVhbF9wYXJ0ID0gaW5wdXQuZmZ0PFJlYWxQYXJ0LCBGRlRfUkVWRVJTRT4oZmZ0KTsKKworICBUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiBmb3J3YXJkX291dHB1dF9pbWFnX3BhcnQgPSBpbnB1dC5mZnQ8SW1hZ1BhcnQsIEZGVF9GT1JXQVJEPihmZnQpOworICBUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiByZXZlcnNlX291dHB1dF9pbWFnX3BhcnQgPSBpbnB1dC5mZnQ8SW1hZ1BhcnQsIEZGVF9SRVZFUlNFPihmZnQpOworCisgIFZFUklGWV9JU19FUVVBTChmb3J3YXJkX291dHB1dF9ib3RoX3BhcnRzLmRpbWVuc2lvbigwKSwgaW5wdXQuZGltZW5zaW9uKDApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2Vfb3V0cHV0X2JvdGhfcGFydHMuZGltZW5zaW9uKDApLCBpbnB1dC5kaW1lbnNpb24oMCkpOworCisgIFZFUklGWV9JU19FUVVBTChmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQuZGltZW5zaW9uKDApLCBpbnB1dC5kaW1lbnNpb24oMCkpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZV9vdXRwdXRfcmVhbF9wYXJ0LmRpbWVuc2lvbigwKSwgaW5wdXQuZGltZW5zaW9uKDApKTsKKworICBWRVJJRllfSVNfRVFVQUwoZm9yd2FyZF9vdXRwdXRfaW1hZ19wYXJ0LmRpbWVuc2lvbigwKSwgaW5wdXQuZGltZW5zaW9uKDApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2Vfb3V0cHV0X2ltYWdfcGFydC5kaW1lbnNpb24oMCksIGlucHV0LmRpbWVuc2lvbigwKSk7CisKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbNV07CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzVdOworCisKKyAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzBdID0gc3RkOjpjb21wbGV4PGZsb2F0PiggIDE1LCAwKTsKKyAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzFdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMi41LCArMy40NDA5NTQ4MDExNzc5Myk7CisgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFsyXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTIuNSwgKzAuODEyMjk5MjQwNTgyMjcpOworICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbM10gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0yLjUsIC0wLjgxMjI5OTI0MDU4MjI3KTsKKyAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzRdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMi41LCAtMy40NDA5NTQ4MDExNzc5Myk7CisKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzBdID0gc3RkOjpjb21wbGV4PGZsb2F0PiggMy4wLCAwKTsKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzFdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMC41LCAtMC42ODgxOTA5NjAyMzU1ODcpOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0wLjUsIC0wLjE2MjQ1OTg0ODExNjQ1Myk7CisgIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFszXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTAuNSwgKzAuMTYyNDU5ODQ4MTE2NDUzKTsKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzRdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMC41LCArMC42ODgxOTA5NjAyMzU1ODcpOworCisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gY19vZmZzZXQoMS4wLCAxLjApOworICBmbG9hdCByX29mZnNldCA9IDEuMDsKKworICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9ib3RoX3BhcnRzKGkpICsgY19vZmZzZXQsIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXSArIGNfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZvcndhcmRfb3V0cHV0X3JlYWxfcGFydChpKSAgKyByX29mZnNldCwgZm9yd2FyZF9nb2xkZW5fcmVzdWx0W2ldLnJlYWwoKSArIHJfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZvcndhcmRfb3V0cHV0X2ltYWdfcGFydChpKSAgKyByX29mZnNldCwgZm9yd2FyZF9nb2xkZW5fcmVzdWx0W2ldLmltYWcoKSArIHJfb2Zmc2V0KTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJldmVyc2Vfb3V0cHV0X2JvdGhfcGFydHMoaSkgKyBjX29mZnNldCwgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0W2ldICsgY19vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gocmV2ZXJzZV9vdXRwdXRfcmVhbF9wYXJ0KGkpICArIHJfb2Zmc2V0LCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0ucmVhbCgpICsgcl9vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gocmV2ZXJzZV9vdXRwdXRfaW1hZ19wYXJ0KGkpICArIHJfb2Zmc2V0LCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpICsgcl9vZmZzZXQpOworICB9Cit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBSZWFsU2NhbGFyLCBib29sIGlzQ29tcGxleElucHV0LCBpbnQgRkZUUmVzdWx0VHlwZSwgaW50IEZGVERpcmVjdGlvbiwgaW50IFRlbnNvclJhbms+CitzdGF0aWMgdm9pZCB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneSgpIHsKKworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgVGVuc29yUmFuaz4gZGltZW5zaW9uczsKKyAgcHRyZGlmZl90IHRvdGFsX3NpemUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IFRlbnNvclJhbms7ICsraSkgeworICAgIGRpbWVuc2lvbnNbaV0gPSByYW5kKCkgJSAyMCArIDE7CisgICAgdG90YWxfc2l6ZSAqPSBkaW1lbnNpb25zW2ldOworICB9CisgIGNvbnN0IERTaXplczxwdHJkaWZmX3QsIFRlbnNvclJhbms+IGFyciA9IGRpbWVuc2lvbnM7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8aXNDb21wbGV4SW5wdXQgPT0gdHJ1ZSwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBSZWFsU2NhbGFyPjo6dHlwZSBJbnB1dFNjYWxhcjsKKworICBUZW5zb3I8SW5wdXRTY2FsYXIsIFRlbnNvclJhbmssIERhdGFMYXlvdXQ+IGlucHV0OworICBpbnB1dC5yZXNpemUoYXJyKTsKKyAgaW5wdXQuc2V0UmFuZG9tKCk7CisKKyAgYXJyYXk8cHRyZGlmZl90LCBUZW5zb3JSYW5rPiBmZnQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgVGVuc29yUmFuazsgKytpKSB7CisgICAgZmZ0W2ldID0gaTsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPEZGVFJlc3VsdFR5cGUgPT0gRWlnZW46OkJvdGhQYXJ0cywgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBSZWFsU2NhbGFyPjo6dHlwZSBPdXRwdXRTY2FsYXI7CisgIFRlbnNvcjxPdXRwdXRTY2FsYXIsIFRlbnNvclJhbmssIERhdGFMYXlvdXQ+IG91dHB1dDsKKyAgb3V0cHV0ID0gaW5wdXQudGVtcGxhdGUgZmZ0PEZGVFJlc3VsdFR5cGUsIEZGVERpcmVjdGlvbj4oZmZ0KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IFRlbnNvclJhbms7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChvdXRwdXQuZGltZW5zaW9uKGkpLCBpbnB1dC5kaW1lbnNpb24oaSkpOworICB9CisKKyAgUmVhbFNjYWxhciBlbmVyZ3lfb3JpZ2luYWwgPSAwLjA7CisgIFJlYWxTY2FsYXIgZW5lcmd5X2FmdGVyX2ZmdCA9IDAuMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3NpemU7ICsraSkgeworICAgIGVuZXJneV9vcmlnaW5hbCArPSBudW1leHQ6OmFiczIoaW5wdXQoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF9zaXplOyArK2kpIHsKKyAgICBlbmVyZ3lfYWZ0ZXJfZmZ0ICs9IG51bWV4dDo6YWJzMihvdXRwdXQoaSkpOworICB9CisKKyAgaWYoRkZURGlyZWN0aW9uID09IEZGVF9GT1JXQVJEKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChlbmVyZ3lfb3JpZ2luYWwsIGVuZXJneV9hZnRlcl9mZnQgLyB0b3RhbF9zaXplKTsKKyAgfQorICBlbHNlIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGVuZXJneV9vcmlnaW5hbCwgZW5lcmd5X2FmdGVyX2ZmdCAqIHRvdGFsX3NpemUpOworICB9Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfZmZ0KCkgeworICAgIHRlc3RfZmZ0X2NvbXBsZXhfaW5wdXRfZ29sZGVuKCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9nb2xkZW4oKTsKKworICAgIHRlc3RfZmZ0XzJEX2dvbGRlbjxDb2xNYWpvcj4oKTsKKyAgICB0ZXN0X2ZmdF8yRF9nb2xkZW48Um93TWFqb3I+KCk7CisKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKKworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZG91YmxlLCB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZG91YmxlLCBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOworCisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKKworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZG91YmxlLCB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZG91YmxlLCBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOworCisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKKworICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZG91YmxlLCB0cnVlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgZmFsc2UsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKKyAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZG91YmxlLCBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZml4ZWRfc2l6ZS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9maXhlZF9zaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY2MGRlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZml4ZWRfc2l6ZS5jcHAKQEAgLTAsMCArMSwyNjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6Um93TWFqb3I7CisKKworc3RhdGljIHZvaWQgdGVzdF8wZCgpCit7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8PiA+IHNjYWxhcjE7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8PiwgUm93TWFqb3I+IHNjYWxhcjI7CisgIFZFUklGWV9JU19FUVVBTChzY2FsYXIxLnJhbmsoKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChzY2FsYXIxLnNpemUoKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChhcnJheV9wcm9kKHNjYWxhcjEuZGltZW5zaW9ucygpKSwgMSk7CisKKyAgc2NhbGFyMSgpID0gNy4wOworICBzY2FsYXIyKCkgPSAxMy4wOworCisgIC8vIFRlc3QgYWdhaW5zdCBzaGFsbG93IGNvcHkuCisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8PiA+IGNvcHkgPSBzY2FsYXIxOworICBWRVJJRllfSVNfTk9UX0VRVUFMKHNjYWxhcjEuZGF0YSgpLCBjb3B5LmRhdGEoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NhbGFyMSgpLCBjb3B5KCkpOworICBjb3B5ID0gc2NhbGFyMTsKKyAgVkVSSUZZX0lTX05PVF9FUVVBTChzY2FsYXIxLmRhdGEoKSwgY29weS5kYXRhKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjYWxhcjEoKSwgY29weSgpKTsKKworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPD4gPiBzY2FsYXIzID0gc2NhbGFyMS5zcXJ0KCk7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8PiwgUm93TWFqb3I+IHNjYWxhcjQgPSBzY2FsYXIyLnNxcnQoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjMucmFuaygpLCAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2FsYXIzKCksIHNxcnRmKDcuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjYWxhcjQoKSwgc3FydGYoMTMuMCkpOworCisgIHNjYWxhcjMgPSBzY2FsYXIxICsgc2NhbGFyMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2FsYXIzKCksIDcuMGYgKyAxMy4wZik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfMWQoKQoreworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+ID4gdmVjMTsKKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw2PiwgUm93TWFqb3I+IHZlYzI7CisKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxLnNpemUoKSksIDYpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxLmRpbWVuc2lvbnMoKVswXSksIDYpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxLmRpbWVuc2lvbigwKSksIDYpOworCisgIHZlYzEoMCkgPSA0LjA7ICB2ZWMyKDApID0gMC4wOworICB2ZWMxKDEpID0gOC4wOyAgdmVjMigxKSA9IDEuMDsKKyAgdmVjMSgyKSA9IDE1LjA7IHZlYzIoMikgPSAyLjA7CisgIHZlYzEoMykgPSAxNi4wOyB2ZWMyKDMpID0gMy4wOworICB2ZWMxKDQpID0gMjMuMDsgdmVjMig0KSA9IDQuMDsKKyAgdmVjMSg1KSA9IDQyLjA7IHZlYzIoNSkgPSA1LjA7CisKKyAgLy8gVGVzdCBhZ2FpbnN0IHNoYWxsb3cgY29weS4KKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw2PiA+IGNvcHkgPSB2ZWMxOworICBWRVJJRllfSVNfTk9UX0VRVUFMKHZlYzEuZGF0YSgpLCBjb3B5LmRhdGEoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMxKGkpLCBjb3B5KGkpKTsKKyAgfQorICBjb3B5ID0gdmVjMTsKKyAgVkVSSUZZX0lTX05PVF9FUVVBTCh2ZWMxLmRhdGEoKSwgY29weS5kYXRhKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1godmVjMShpKSwgY29weShpKSk7CisgIH0KKworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+ID4gdmVjMyA9IHZlYzEuc3FydCgpOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+LCBSb3dNYWpvcj4gdmVjNCA9IHZlYzIuc3FydCgpOworCisgIFZFUklGWV9JU19FUVVBTCgodmVjMy5zaXplKCkpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMucmFuaygpLCAxKTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgodmVjMy5kaW1lbnNpb25zKClbMF0pLCA2KTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgodmVjMy5kaW1lbnNpb24oMCkpLCA2KTsKKworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMCksIHNxcnRmKDQuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMSksIHNxcnRmKDguMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMiksIHNxcnRmKDE1LjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDMpLCBzcXJ0ZigxNi4wKSk7CisgIFZFUklGWV9JU19BUFBST1godmVjMyg0KSwgc3FydGYoMjMuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoNSksIHNxcnRmKDQyLjApKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoMCksIHNxcnRmKDAuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoMSksIHNxcnRmKDEuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoMiksIHNxcnRmKDIuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoMyksIHNxcnRmKDMuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoNCksIHNxcnRmKDQuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoNSksIHNxcnRmKDUuMCkpOworCisgIHZlYzMgPSB2ZWMxICsgdmVjMjsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDApLCA0LjBmICsgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjMygxKSwgOC4wZiArIDEuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoMiksIDE1LjBmICsgMi4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjMygzKSwgMTYuMGYgKyAzLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDQpLCAyMy4wZiArIDQuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoNSksIDQyLjBmICsgNS4wZik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX21hcCgpCit7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8Nj4gPiB2ZWMxOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+LCBSb3dNYWpvcj4gdmVjMjsKKworICB2ZWMxKDApID0gNC4wOyAgdmVjMigwKSA9IDAuMDsKKyAgdmVjMSgxKSA9IDguMDsgIHZlYzIoMSkgPSAxLjA7CisgIHZlYzEoMikgPSAxNS4wOyB2ZWMyKDIpID0gMi4wOworICB2ZWMxKDMpID0gMTYuMDsgdmVjMigzKSA9IDMuMDsKKyAgdmVjMSg0KSA9IDIzLjA7IHZlYzIoNCkgPSA0LjA7CisgIHZlYzEoNSkgPSA0Mi4wOyB2ZWMyKDUpID0gNS4wOworCisgIGZsb2F0IGRhdGEzWzZdOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw2PiA+ID4gdmVjMyhkYXRhMywgNik7CisgIHZlYzMgPSB2ZWMxLnNxcnQoKSArIHZlYzI7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDApLCBzcXJ0Zig0LjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDEpLCBzcXJ0Zig4LjApICsgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjMygyKSwgc3FydGYoMTUuMCkgKyAyLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDMpLCBzcXJ0ZigxNi4wKSArIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoNCksIHNxcnRmKDIzLjApICsgNC4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjMyg1KSwgc3FydGYoNDIuMCkgKyA1LjBmKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF8yZCgpCit7CisgIGZsb2F0IGRhdGExWzZdOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiA+ID4gbWF0MShkYXRhMSwyLDMpOworICBmbG9hdCBkYXRhMls2XTsKKyAgVGVuc29yTWFwPFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MiwgMz4sIFJvd01ham9yPiA+IG1hdDIoZGF0YTIsMiwzKTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuc2l6ZSgpKSwgMiozKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDEucmFuaygpLCAyKTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0MS5kaW1lbnNpb24oMCkpLCAyKTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0MS5kaW1lbnNpb24oMSkpLCAzKTsKKworICBtYXQxKDAsMCkgPSAwLjA7CisgIG1hdDEoMCwxKSA9IDEuMDsKKyAgbWF0MSgwLDIpID0gMi4wOworICBtYXQxKDEsMCkgPSAzLjA7CisgIG1hdDEoMSwxKSA9IDQuMDsKKyAgbWF0MSgxLDIpID0gNS4wOworCisgIG1hdDIoMCwwKSA9IC0wLjA7CisgIG1hdDIoMCwxKSA9IC0xLjA7CisgIG1hdDIoMCwyKSA9IC0yLjA7CisgIG1hdDIoMSwwKSA9IC0zLjA7CisgIG1hdDIoMSwxKSA9IC00LjA7CisgIG1hdDIoMSwyKSA9IC01LjA7CisKKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiA+IG1hdDM7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MiwgMz4sIFJvd01ham9yPiBtYXQ0OworICBtYXQzID0gbWF0MS5hYnMoKTsKKyAgbWF0NCA9IG1hdDIuYWJzKCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLnNpemUoKSksIDIqMyk7CisgICAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMCkpLCAyKTsKKyAgICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLmRpbWVuc2lvbigxKSksIDMpOworCisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLDApLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMSksIDEuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwyKSwgMi4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLDApLCAzLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMSksIDQuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwyKSwgNS4wZik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMCksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwxKSwgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgwLDIpLCAyLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMCksIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwxKSwgNC4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgxLDIpLCA1LjBmKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF8zZCgpCit7CisgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MiwgMywgNz4gPiBtYXQxOworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDIsIDMsIDc+LCBSb3dNYWpvcj4gbWF0MjsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuc2l6ZSgpKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0MS5yYW5rKCksIDMpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbigwKSksIDIpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbigxKSksIDMpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbigyKSksIDcpOworCisgIGZsb2F0IHZhbCA9IDAuMGY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIG1hdDEoaSxqLGspID0gdmFsOworICAgICAgICBtYXQyKGksaixrKSA9IHZhbDsKKyAgICAgICAgdmFsICs9IDEuMGY7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzLCA3PiA+IG1hdDM7CisgIG1hdDMgPSBtYXQxLnNxcnQoKTsKKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzLCA3PiwgUm93TWFqb3I+IG1hdDQ7CisgIG1hdDQgPSBtYXQyLnNxcnQoKTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdDMuc2l6ZSgpKSwgMiozKjcpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLmRpbWVuc2lvbigwKSksIDIpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLmRpbWVuc2lvbigxKSksIDMpOworICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLmRpbWVuc2lvbigyKSksIDcpOworCisKKyAgdmFsID0gMC4wZjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksaixrKSwgc3FydGYodmFsKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0NChpLGosayksIHNxcnRmKHZhbCkpOworICAgICAgICB2YWwgKz0gMS4wZjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2FycmF5KCkKK3sKKyAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzLCA3PiA+IG1hdDE7CisgIGZsb2F0IHZhbCA9IDAuMGY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIG1hdDEoaSxqLGspID0gdmFsOworICAgICAgICB2YWwgKz0gMS4wZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDIsIDMsIDc+ID4gbWF0MzsKKyAgbWF0MyA9IG1hdDEucG93KDMuNWYpOworCisgIHZhbCA9IDAuMGY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIHBvd2YodmFsLCAzLjVmKSk7CisgICAgICAgIHZhbCArPSAxLjBmOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2ZpeGVkX3NpemUoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF8wZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl9tYXAoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzJkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8zZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYXJyYXkoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNzM0NQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsLmNwcApAQCAtMCwwICsxLDc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpNYXRyaXhYZjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlKCkKK3sKKyAgTWF0cml4WGYgbTEoMywzKTsKKyAgTWF0cml4WGYgbTIoMywzKTsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIG0yLnNldFJhbmRvbSgpOworCisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+ID4gbWF0MShtMS5kYXRhKCksIDMsMyk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+ID4gbWF0MihtMi5kYXRhKCksIDMsMyk7CisKKyAgVGVuc29yPGZsb2F0LCAyPiBtYXQzKDMsMyk7CisgIG1hdDMgPSBtYXQxOworCisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltczsKKyAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7CisKKyAgbWF0MyA9IG1hdDMuY29udHJhY3QobWF0MiwgZGltcykuZXZhbCgpOworCisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAwKSwgKG0xKm0yKS5ldmFsKCkoMCwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgKG0xKm0yKS5ldmFsKCkoMCwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAyKSwgKG0xKm0yKS5ldmFsKCkoMCwyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwgKG0xKm0yKS5ldmFsKCkoMSwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAxKSwgKG0xKm0yKS5ldmFsKCkoMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAyKSwgKG0xKm0yKS5ldmFsKCkoMSwyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAwKSwgKG0xKm0yKS5ldmFsKCkoMiwwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAxKSwgKG0xKm0yKS5ldmFsKCkoMiwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAyKSwgKG0xKm0yKS5ldmFsKCkoMiwyKSk7Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9jb25zdCgpCit7CisgIE1hdHJpeFhmIGlucHV0KDMsMyk7CisgIGlucHV0LnNldFJhbmRvbSgpOworICBNYXRyaXhYZiBvdXRwdXQgPSBpbnB1dDsKKyAgb3V0cHV0LnJvd3dpc2UoKSAtPSBpbnB1dC5jb2x3aXNlKCkubWF4Q29lZmYoKTsKKworICBFaWdlbjo6YXJyYXk8aW50LCAxPiBkZXB0aF9kaW07CisgIGRlcHRoX2RpbVswXSA9IDA7CisgIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvbnMgZGltczJkOworICBkaW1zMmRbMF0gPSAxOworICBkaW1zMmRbMV0gPSAzOworICBFaWdlbjo6YXJyYXk8aW50LCAyPiBiY2FzdDsKKyAgYmNhc3RbMF0gPSAzOworICBiY2FzdFsxXSA9IDE7CisgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDI+ID4gaW5wdXRfdGVuc29yKGlucHV0LmRhdGEoKSwgMywgMyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gb3V0cHV0X3RlbnNvcj0gKGlucHV0X3RlbnNvciAtIGlucHV0X3RlbnNvci5tYXhpbXVtKGRlcHRoX2RpbSkuZXZhbCgpLnJlc2hhcGUoZGltczJkKS5icm9hZGNhc3QoYmNhc3QpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dChpLCBqKSwgb3V0cHV0X3RlbnNvcihpLCBqKSk7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29uc3QoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbF9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsX3N5Y2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTBkYTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbF9zeWNsLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNgorLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsX3N5Y2wKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIGludAorI2RlZmluZSBFSUdFTl9VU0VfU1lDTAorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordm9pZCB0ZXN0X2ZvcmNlZF9ldmFsX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CisKKyAgaW50IHNpemVEaW0xID0gMTAwOworICBpbnQgc2l6ZURpbTIgPSAyMDA7CisgIGludCBzaXplRGltMyA9IDIwMDsKKyAgRWlnZW46OmFycmF5PGludCwgMz4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTN9fTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gaW4xKHRlbnNvclJhbmdlKTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gaW4yKHRlbnNvclJhbmdlKTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gb3V0KHRlbnNvclJhbmdlKTsKKworICBmbG9hdCAqIGdwdV9pbjFfZGF0YSAgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSkpOworICBmbG9hdCAqIGdwdV9pbjJfZGF0YSAgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSkpOworICBmbG9hdCAqIGdwdV9vdXRfZGF0YSA9ICBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSkpOworCisgIGluMSA9IGluMS5yYW5kb20oKSArIGluMS5jb25zdGFudCgxMC4wZik7CisgIGluMiA9IGluMi5yYW5kb20oKSArIGluMi5jb25zdGFudCgxMC4wZik7CisKKyAgLy8gY3JlYXRpbmcgVGVuc29yTWFwIGZyb20gdGVuc29yCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+IGdwdV9pbjEoZ3B1X2luMV9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+IGdwdV9pbjIoZ3B1X2luMl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4xX2RhdGEsIGluMS5kYXRhKCksKGluMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihmbG9hdCkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luMl9kYXRhLCBpbjIuZGF0YSgpLChpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgLy8vIGM9KGErYikqYgorICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPShncHVfaW4xICsgZ3B1X2luMikuZXZhbCgpICogZ3B1X2luMjsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKGZsb2F0KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbjEoaSwgaiwgaykgKyBpbjIoaSwgaiwgaykpICogaW4yKGksIGosIGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCIoYStiKSpiIFRlc3QgUGFzc2VkXG4iKTsKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4xX2RhdGEpOworICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbjJfZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKKworfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsX3N5Y2woKSB7CisgIGNsOjpzeWNsOjpncHVfc2VsZWN0b3IgczsKKyAgRWlnZW46OlN5Y2xEZXZpY2Ugc3ljbF9kZXZpY2Uocyk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2ZvcmNlZF9ldmFsX3N5Y2woc3ljbF9kZXZpY2UpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2dlbmVyYXRvci5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjkyODcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9nZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3N0cnVjdCBHZW5lcmF0b3IxRCB7CisgIEdlbmVyYXRvcjFEKCkgeyB9CisKKyAgZmxvYXQgb3BlcmF0b3IoKShjb25zdCBhcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4mIGNvb3JkaW5hdGVzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0XzFEKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAxPiB2ZWMoNik7CisgIFRlbnNvcjxmbG9hdCwgMT4gcmVzdWx0ID0gdmVjLmdlbmVyYXRlKEdlbmVyYXRvcjFEKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpKSwgaSk7CisgIH0KK30KKworCitzdHJ1Y3QgR2VuZXJhdG9yMkQgeworICBHZW5lcmF0b3IyRCgpIHsgfQorCisgIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDI+JiBjb29yZGluYXRlcykgY29uc3QgeworICAgIHJldHVybiAzICogY29vcmRpbmF0ZXNbMF0gKyAxMSAqIGNvb3JkaW5hdGVzWzFdOworICB9Cit9OworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0XzJEKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAyPiBtYXRyaXgoNSwgNyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gbWF0cml4LmdlbmVyYXRlKEdlbmVyYXRvcjJEKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIDMqaSArIDExKmopOworICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZ2F1c3NpYW4oKQoreworICBpbnQgcm93cyA9IDMyOworICBpbnQgY29scyA9IDQ4OworICBhcnJheTxmbG9hdCwgMj4gbWVhbnM7CisgIG1lYW5zWzBdID0gcm93cyAvIDIuMGY7CisgIG1lYW5zWzFdID0gY29scyAvIDIuMGY7CisgIGFycmF5PGZsb2F0LCAyPiBzdGRfZGV2czsKKyAgc3RkX2RldnNbMF0gPSAzLjE0ZjsKKyAgc3RkX2RldnNbMV0gPSAyLjdmOworICBpbnRlcm5hbDo6R2F1c3NpYW5HZW5lcmF0b3I8ZmxvYXQsIEVpZ2VuOjpEZW5zZUluZGV4LCAyPiBnYXVzc2lhbl9nZW4obWVhbnMsIHN0ZF9kZXZzKTsKKworICBUZW5zb3I8ZmxvYXQsIDI+IG1hdHJpeChyb3dzLCBjb2xzKTsKKyAgVGVuc29yPGZsb2F0LCAyPiByZXN1bHQgPSBtYXRyaXguZ2VuZXJhdGUoZ2F1c3NpYW5fZ2VuKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgKytqKSB7CisgICAgICBmbG9hdCBnX3Jvd3MgPSBwb3dmKHJvd3MvMi4wZiAtIGksIDIpIC8gKDMuMTRmICogMy4xNGYpICogMC41ZjsKKyAgICAgIGZsb2F0IGdfY29scyA9IHBvd2YoY29scy8yLjBmIC0gaiwgMikgLyAoMi43ZiAqIDIuN2YpICogMC41ZjsKKyAgICAgIGZsb2F0IGdhdXNzaWFuID0gZXhwZigtZ19yb3dzIC0gZ19jb2xzKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIGdhdXNzaWFuKTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2dlbmVyYXRvcigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0XzFEPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMUQ8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8yRDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzJEPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZ2F1c3NpYW48Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9nYXVzc2lhbjxSb3dNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pZmZ0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2lmZnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDg4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pZmZ0LmNwcApAQCAtMCwwICsxLDE1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgSmlhbndlaSBDdWkgPHRodWNqd0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGNvbXBsZXg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0XzFEX2ZmdF9pZmZ0X2ludmFyaWFudChpbnQgc2VxdWVuY2VfbGVuZ3RoKSB7CisgIFRlbnNvcjxkb3VibGUsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcihzZXF1ZW5jZV9sZW5ndGgpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgYXJyYXk8aW50LCAxPiBmZnQ7CisgIGZmdFswXSA9IDA7CisKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxLCBEYXRhTGF5b3V0PiB0ZW5zb3JfYWZ0ZXJfZmZ0OworICBUZW5zb3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDEsIERhdGFMYXlvdXQ+IHRlbnNvcl9hZnRlcl9mZnRfaWZmdDsKKworICB0ZW5zb3JfYWZ0ZXJfZmZ0ID0gdGVuc29yLnRlbXBsYXRlIGZmdDxFaWdlbjo6Qm90aFBhcnRzLCBFaWdlbjo6RkZUX0ZPUldBUkQ+KGZmdCk7CisgIHRlbnNvcl9hZnRlcl9mZnRfaWZmdCA9IHRlbnNvcl9hZnRlcl9mZnQudGVtcGxhdGUgZmZ0PEVpZ2VuOjpCb3RoUGFydHMsIEVpZ2VuOjpGRlRfUkVWRVJTRT4oZmZ0KTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdC5kaW1lbnNpb24oMCksIHNlcXVlbmNlX2xlbmd0aCk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQuZGltZW5zaW9uKDApLCBzZXF1ZW5jZV9sZW5ndGgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxdWVuY2VfbGVuZ3RoOyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGZsb2F0Pih0ZW5zb3IoaSkpLCBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjpyZWFsKHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpKSkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0XzJEX2ZmdF9pZmZ0X2ludmFyaWFudChpbnQgZGltMCwgaW50IGRpbTEpIHsKKyAgVGVuc29yPGRvdWJsZSwgMiwgRGF0YUxheW91dD4gdGVuc29yKGRpbTAsIGRpbTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgYXJyYXk8aW50LCAyPiBmZnQ7CisgIGZmdFswXSA9IDA7CisgIGZmdFsxXSA9IDE7CisKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAyLCBEYXRhTGF5b3V0PiB0ZW5zb3JfYWZ0ZXJfZmZ0OworICBUZW5zb3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDIsIERhdGFMYXlvdXQ+IHRlbnNvcl9hZnRlcl9mZnRfaWZmdDsKKworICB0ZW5zb3JfYWZ0ZXJfZmZ0ID0gdGVuc29yLnRlbXBsYXRlIGZmdDxFaWdlbjo6Qm90aFBhcnRzLCBFaWdlbjo6RkZUX0ZPUldBUkQ+KGZmdCk7CisgIHRlbnNvcl9hZnRlcl9mZnRfaWZmdCA9IHRlbnNvcl9hZnRlcl9mZnQudGVtcGxhdGUgZmZ0PEVpZ2VuOjpCb3RoUGFydHMsIEVpZ2VuOjpGRlRfUkVWRVJTRT4oZmZ0KTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdC5kaW1lbnNpb24oMCksIGRpbTApOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdC5kaW1lbnNpb24oMSksIGRpbTEpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0LmRpbWVuc2lvbigwKSwgZGltMCk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQuZGltZW5zaW9uKDEpLCBkaW0xKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRpbTA7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGltMTsgKytqKSB7CisgICAgICAvL3N0ZDo6Y291dCA8PCAiWyIgPDwgaSA8PCAiXVsiIDw8IGogPDwgIl0iIDw8ICAiICBPcmlnaW5hbCBkYXRhOiAiIDw8IHRlbnNvcihpLGopIDw8ICIgVHJhbnNmb3JtZWQgZGF0YToiIDw8IHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpLGopIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRlbnNvcihpLGopKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6cmVhbCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQoaSxqKSkpKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQoaW50IGRpbTAsIGludCBkaW0xLCBpbnQgZGltMikgeworICBUZW5zb3I8ZG91YmxlLCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3IoZGltMCwgZGltMSwgZGltMik7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBhcnJheTxpbnQsIDM+IGZmdDsKKyAgZmZ0WzBdID0gMDsKKyAgZmZ0WzFdID0gMTsKKyAgZmZ0WzJdID0gMjsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDMsIERhdGFMYXlvdXQ+IHRlbnNvcl9hZnRlcl9mZnQ7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgMywgRGF0YUxheW91dD4gdGVuc29yX2FmdGVyX2ZmdF9pZmZ0OworCisgIHRlbnNvcl9hZnRlcl9mZnQgPSB0ZW5zb3IudGVtcGxhdGUgZmZ0PEVpZ2VuOjpCb3RoUGFydHMsIEVpZ2VuOjpGRlRfRk9SV0FSRD4oZmZ0KTsKKyAgdGVuc29yX2FmdGVyX2ZmdF9pZmZ0ID0gdGVuc29yX2FmdGVyX2ZmdC50ZW1wbGF0ZSBmZnQ8RWlnZW46OkJvdGhQYXJ0cywgRWlnZW46OkZGVF9SRVZFUlNFPihmZnQpOworCisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0LmRpbWVuc2lvbigwKSwgZGltMCk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0LmRpbWVuc2lvbigxKSwgZGltMSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0LmRpbWVuc2lvbigyKSwgZGltMik7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQuZGltZW5zaW9uKDApLCBkaW0wKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnRfaWZmdC5kaW1lbnNpb24oMSksIGRpbTEpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0LmRpbWVuc2lvbigyKSwgZGltMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW0wOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpbTE7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBkaW0yOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxmbG9hdD4odGVuc29yKGksaixrKSksIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OnJlYWwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0KGksaixrKSkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zdWJfZmZ0X2lmZnRfaW52YXJpYW50KGludCBkaW0wLCBpbnQgZGltMSwgaW50IGRpbTIsIGludCBkaW0zKSB7CisgIFRlbnNvcjxkb3VibGUsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcihkaW0wLCBkaW0xLCBkaW0yLCBkaW0zKTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIGFycmF5PGludCwgMj4gZmZ0OworICBmZnRbMF0gPSAyOworICBmZnRbMV0gPSAwOworCisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgNCwgRGF0YUxheW91dD4gdGVuc29yX2FmdGVyX2ZmdDsKKyAgVGVuc29yPGRvdWJsZSwgNCwgRGF0YUxheW91dD4gdGVuc29yX2FmdGVyX2ZmdF9pZmZ0OworCisgIHRlbnNvcl9hZnRlcl9mZnQgPSB0ZW5zb3IudGVtcGxhdGUgZmZ0PEVpZ2VuOjpCb3RoUGFydHMsIEVpZ2VuOjpGRlRfRk9SV0FSRD4oZmZ0KTsKKyAgdGVuc29yX2FmdGVyX2ZmdF9pZmZ0ID0gdGVuc29yX2FmdGVyX2ZmdC50ZW1wbGF0ZSBmZnQ8RWlnZW46OlJlYWxQYXJ0LCBFaWdlbjo6RkZUX1JFVkVSU0U+KGZmdCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnQuZGltZW5zaW9uKDApLCBkaW0wKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnQuZGltZW5zaW9uKDEpLCBkaW0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnQuZGltZW5zaW9uKDIpLCBkaW0yKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnQuZGltZW5zaW9uKDMpLCBkaW0zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnRfaWZmdC5kaW1lbnNpb24oMCksIGRpbTApOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0LmRpbWVuc2lvbigxKSwgZGltMSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQuZGltZW5zaW9uKDIpLCBkaW0yKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hZnRlcl9mZnRfaWZmdC5kaW1lbnNpb24oMyksIGRpbTMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGltMDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0xOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZGltMjsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZGltMzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxmbG9hdD4odGVuc29yKGksaixrLGwpKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpLGosayxsKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfaWZmdCgpIHsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMURfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPig0KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzFEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oMTYpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMURfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigzMikpOworICBDQUxMX1NVQlRFU1QodGVzdF8xRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDEwMjQqMTAyNCkpOworCisgIENBTExfU1VCVEVTVCh0ZXN0XzJEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oNCw0KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzJEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oOCwxNikpOworICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDE2LDMyKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzJEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oMTAyNCwxMDI0KSk7CisKKyAgQ0FMTF9TVUJURVNUKHRlc3RfM0RfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPig0LDQsNCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDgsMTYsMzIpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfM0RfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigxNiw0LDgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfM0RfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigyNTYsMjU2LDI1NikpOworCisgIENBTExfU1VCVEVTVCh0ZXN0X3N1Yl9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQsNCw0LDQpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ViX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oOCwxNiwzMiw2NCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdWJfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigxNiw0LDgsMTIpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ViX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oNjQsNjQsNjQsNjQpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVjNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW1hZ2VfcGF0Y2guY3BwCkBAIC0wLDAgKzEsNzU3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOworCit2b2lkIHRlc3Rfc2ltcGxlX3BhdGNoKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gdGVuc29yX3Jvd19tYWpvciA9IHRlbnNvci5zd2FwX2xheW91dCgpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigwKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMykpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigxKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigyKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigzKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMCkpOworCisgIC8vIFNpbmdsZSBwaXhlbCBwYXRjaDogQ29sTWFqb3IKKyAgVGVuc29yPGZsb2F0LCA1PiBzaW5nbGVfcGl4ZWxfcGF0Y2g7CisgIHNpbmdsZV9waXhlbF9wYXRjaCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigyKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGltZW5zaW9uKDMpLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbig0KSwgNyk7CisKKyAgLy8gU2luZ2xlIHBpeGVsIHBhdGNoOiBSb3dNYWpvcgorICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yOworICBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCAyKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHRlbnNvci5zaXplKCk7ICsraSkgeworICAgIC8vIENvbE1ham9yCisgICAgaWYgKHRlbnNvci5kYXRhKClbaV0gIT0gc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXSkgeworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIKKyAgICAgICAgICAgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXQorICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldLCB0ZW5zb3IuZGF0YSgpW2ldKTsKKyAgICAvLyBSb3dNYWpvcgorICAgIGlmICh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSkgeworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIKKyAgICAgICAgICAgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIKKyAgICAgICAgICAgPDwgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0sCisgICAgICAgICAgICAgICAgICAgIHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRhdGEoKVtpXSwgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldLAorICAgICAgICAgICAgICAgICAgICBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSk7CisgIH0KKworICAvLyBFbnRpcmUgaW1hZ2UgcGF0Y2g6IENvbE1ham9yCisgIFRlbnNvcjxmbG9hdCwgNT4gZW50aXJlX2ltYWdlX3BhdGNoOworICBlbnRpcmVfaW1hZ2VfcGF0Y2ggPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oNCksIDcpOworCisgIC8vIEVudGlyZSBpbWFnZSBwYXRjaDogUm93TWFqb3IKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcjsKKyAgZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDcpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgaW50IHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgMzsgKytyKSB7CisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNTsgKytjKSB7CisgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAyOyArK2QpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgNzsgKytiKSB7CisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKKyAgICAgICAgICAgICAgaWYgKHItMStpID49IDAgJiYgYy0yK2ogPj0gMCAmJiByLTEraSA8IDMgJiYgYy0yK2ogPCA1KSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgci0xK2ksIGMtMitqLCBiKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGIsIGMtMitqLCByLTEraSwgZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKKyAgICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoKGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CisgICAgICAgICAgICAgIC8vIFJvd01ham9yCisgICAgICAgICAgICAgIGlmIChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9CisgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGoKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvcik7CisgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWQsIGV4cGVjdGVkX3Jvd19tYWpvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gMkQgcGF0Y2g6IENvbE1ham9yCisgIFRlbnNvcjxmbG9hdCwgNT4gdHdvZF9wYXRjaDsKKyAgdHdvZF9wYXRjaCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigxKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDQpLCA3KTsKKworICAvLyAyRCBwYXRjaDogUm93TWFqb3IKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gdHdvZF9wYXRjaF9yb3dfbWFqb3I7CisgIHR3b2RfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDcpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDIpOworCisKKyAgLy8gQmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBpbiBUZW5zb3JUcmFpdHMuaCwgcGFkZGluZyBoYXBwZW5zIHRvIGJlIDAuCisgIGludCByb3dfcGFkZGluZyA9IDA7CisgIGludCBjb2xfcGFkZGluZyA9IDA7CisgIGludCBzdHJpZGUgPSAxOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgIGludCBwYXRjaElkID0gaSszKmo7CisgICAgICBmb3IgKGludCByID0gMDsgciA8IDI7ICsrcikgeworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDI7ICsrYykgeworICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgMjsgKytkKSB7CisgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IDc7ICsrYikgeworICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0ID0gYypzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICAgIC8vIENvbE1ham9yCisgICAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDEpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDIpKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgcm93X29mZnNldCwgY29sX29mZnNldCwgYik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAvLyBSb3dNYWpvcgorICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikgJiYgY29sX29mZnNldCA8IHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihiLCBjb2xfb2Zmc2V0LCByb3dfb2Zmc2V0LCBkKTsKKworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh0d29kX3BhdGNoX3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZF9yb3dfbWFqb3IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IENvbE1ham9yIGFuZCBSb3dNYWpvciBhZ3JlZS4KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGV4cGVjdGVkLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBWZXJpZmllcyBWQUxJRCBwYWRkaW5nIChubyBwYWRkaW5nKSB3aXRoIGluY3JlbWVudGluZyB2YWx1ZXMuCit2b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZCgpCit7CisgIGludCBpbnB1dF9kZXB0aCA9IDM7CisgIGludCBpbnB1dF9yb3dzID0gMzsKKyAgaW50IGlucHV0X2NvbHMgPSAzOworICBpbnQgaW5wdXRfYmF0Y2hlcyA9IDE7CisgIGludCBrc2l6ZSA9IDI7ICAvLyBDb3JyZXNwb25kcyB0byB0aGUgUm93cyBhbmQgQ29scyBmb3IgdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlczw+LgorICBpbnQgc3RyaWRlID0gMjsgIC8vIE9ubHkgc2FtZSBzdHJpZGUgaXMgc3VwcG9ydGVkLgorICBUZW5zb3I8ZmxvYXQsIDQ+IHRlbnNvcihpbnB1dF9kZXB0aCwgaW5wdXRfcm93cywgaW5wdXRfY29scywgaW5wdXRfYmF0Y2hlcyk7CisgIC8vIEluaXRpYWxpemVzIHRlbnNvciB3aXRoIGluY3JlbWVudGluZyBudW1iZXJzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHRlbnNvci5zaXplKCk7ICsraSkgeworICAgIHRlbnNvci5kYXRhKClbaV0gPSBpICsgMTsKKyAgfQorICAvLyBDb2xNYWpvcgorICBUZW5zb3I8ZmxvYXQsIDU+IHJlc3VsdCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgIC8vIGRlcHRoCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgcm93cworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDEpOyAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKKworICAvLyBSb3dNYWpvcgorICBUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDApLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigzKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDIpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDMpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CisKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gcmVzdWx0X3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMykpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMikpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbig0KSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMCkpOworCisgIC8vIE5vIHBhZGRpbmcgaXMgY2FycmllZCBvdXQuCisgIGludCByb3dfcGFkZGluZyA9IDA7CisgIGludCBjb2xfcGFkZGluZyA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IChpK3N0cmlkZStrc2l6ZS0xKSA8IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCByb3dzCisgICAgZm9yIChpbnQgaiA9IDA7IChqK3N0cmlkZStrc2l6ZS0xKSA8IGlucHV0X2NvbHM7IGogKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCBjb2xzCisgICAgICBpbnQgcGF0Y2hJZCA9IGkraW5wdXRfcm93cypqOworICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAvLyBwYXRjaCByb3dzCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga3NpemU7ICsrYykgeyAgLy8gcGF0Y2ggY29scworICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgaW5wdXRfZGVwdGg7ICsrZCkgeyAgLy8gZGVwdGgKKyAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAorICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gciArIGkgLSByb3dfcGFkZGluZzsKKyAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQgPSBjICsgaiAtIGNvbF9wYWRkaW5nOworICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgaW5wdXRfcm93cyAmJiBjb2xfb2Zmc2V0IDwgaW5wdXRfY29scykgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yKGQsIHJvd19vZmZzZXQsIGNvbF9vZmZzZXQsIGIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgY29sX29mZnNldCwgcm93X29mZnNldCwgZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CisgICAgICAgICAgICAgIC8vIFJvd01ham9yCisgICAgICAgICAgICAgIGlmIChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkX3Jvd19tYWpvcikgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChleHBlY3RlZCwgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gVmVyaWZpZXMgVkFMSUQgcGFkZGluZyAobm8gcGFkZGluZykgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KK3ZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3ZhbGlkX3NhbWVfdmFsdWUoKQoreworICBpbnQgaW5wdXRfZGVwdGggPSAxOworICBpbnQgaW5wdXRfcm93cyA9IDU7CisgIGludCBpbnB1dF9jb2xzID0gNTsKKyAgaW50IGlucHV0X2JhdGNoZXMgPSAyOworICBpbnQga3NpemUgPSAzOyAgLy8gQ29ycmVzcG9uZHMgdG8gdGhlIFJvd3MgYW5kIENvbHMgZm9yIHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXM8Pi4KKyAgaW50IHN0cmlkZSA9IDI7ICAvLyBPbmx5IHNhbWUgc3RyaWRlIGlzIHN1cHBvcnRlZC4KKyAgLy8gQ29sTWFqb3IKKyAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoaW5wdXRfZGVwdGgsIGlucHV0X3Jvd3MsIGlucHV0X2NvbHMsIGlucHV0X2JhdGNoZXMpOworICB0ZW5zb3IgPSB0ZW5zb3IuY29uc3RhbnQoMTEuMGYpOworICBUZW5zb3I8ZmxvYXQsIDU+IHJlc3VsdCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgIC8vIGRlcHRoCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgcm93cworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDQpOyAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKKworICAvLyBSb3dNYWpvcgorICBUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDApLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigzKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDIpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDMpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CisKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gcmVzdWx0X3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMykpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMikpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbig0KSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMCkpOworCisgIC8vIE5vIHBhZGRpbmcgaXMgY2FycmllZCBvdXQuCisgIGludCByb3dfcGFkZGluZyA9IDA7CisgIGludCBjb2xfcGFkZGluZyA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IChpK3N0cmlkZStrc2l6ZS0xKSA8PSBpbnB1dF9yb3dzOyBpICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgcm93cworICAgIGZvciAoaW50IGogPSAwOyAoaitzdHJpZGUra3NpemUtMSkgPD0gaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKKyAgICAgIGludCBwYXRjaElkID0gaStpbnB1dF9yb3dzKmo7CisgICAgICBmb3IgKGludCByID0gMDsgciA8IGtzaXplOyArK3IpIHsgIC8vIHBhdGNoIHJvd3MKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAvLyBwYXRjaCBjb2xzCisgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAvLyBkZXB0aAorICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBpbnB1dF9iYXRjaGVzOyArK2IpIHsgIC8vIGJhdGNoCisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKKyAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXQgPSByICsgaSAtIHJvd19wYWRkaW5nOworICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCA9IGMgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCBpbnB1dF9yb3dzICYmIGNvbF9vZmZzZXQgPCBpbnB1dF9jb2xzKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgcm93X29mZnNldCwgY29sX29mZnNldCwgYik7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihiLCBjb2xfb2Zmc2V0LCByb3dfb2Zmc2V0LCBkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBDb2xNYWpvcgorICAgICAgICAgICAgICBpZiAocmVzdWx0KGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgLy8gUm93TWFqb3IKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IENvbE1ham9yIGFuZCBSb3dNYWpvciBhZ3JlZS4KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGV4cGVjdGVkLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBWZXJpZmllcyBTQU1FIHBhZGRpbmcuCit2b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ19zYW1lKCkKK3sKKyAgaW50IGlucHV0X2RlcHRoID0gMzsKKyAgaW50IGlucHV0X3Jvd3MgPSA0OworICBpbnQgaW5wdXRfY29scyA9IDI7CisgIGludCBpbnB1dF9iYXRjaGVzID0gMTsKKyAgaW50IGtzaXplID0gMjsgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCisgIGludCBzdHJpZGUgPSAyOyAgLy8gT25seSBzYW1lIHN0cmlkZSBpcyBzdXBwb3J0ZWQuCisgIC8vIENvbE1ham9yCisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKGlucHV0X2RlcHRoLCBpbnB1dF9yb3dzLCBpbnB1dF9jb2xzLCBpbnB1dF9iYXRjaGVzKTsKKyAgLy8gSW5pdGlhbGl6ZXMgdGVuc29yIHdpdGggaW5jcmVtZW50aW5nIG51bWJlcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yLnNpemUoKTsgKytpKSB7CisgICAgdGVuc29yLmRhdGEoKVtpXSA9IGkgKyAxOworICB9CisgIFRlbnNvcjxmbG9hdCwgNT4gcmVzdWx0ID0gdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCBQQURESU5HX1NBTUUpOworCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCBpbnB1dF9kZXB0aCk7ICAvLyBkZXB0aAorICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwga3NpemUpOyAgLy8ga2VybmVsIHJvd3MKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMiksIGtzaXplKTsgIC8vIGtlcm5lbCBjb2xzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDMpLCAyKTsgIC8vIG51bWJlciBvZiBwYXRjaGVzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDQpLCBpbnB1dF9iYXRjaGVzKTsgIC8vIG51bWJlciBvZiBiYXRjaGVzCisKKyAgLy8gUm93TWFqb3IKKyAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gdGVuc29yX3Jvd19tYWpvciA9IHRlbnNvci5zd2FwX2xheW91dCgpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigwKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMykpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigxKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigyKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigzKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMCkpOworCisgIFRlbnNvcjxmbG9hdCwgNSwgUm93TWFqb3I+IHJlc3VsdF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCBQQURESU5HX1NBTUUpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMykpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMikpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbig0KSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMCkpOworCisgIC8vIEJhc2VkIG9uIHRoZSBjYWxjdWxhdGlvbiBkZXNjcmliZWQgaW4gVGVuc29yVHJhaXRzLmgsIHBhZGRpbmcgaGFwcGVucyB0byBiZQorICAvLyAwLgorICBpbnQgcm93X3BhZGRpbmcgPSAwOworICBpbnQgY29sX3BhZGRpbmcgPSAwOworCisgIGZvciAoaW50IGkgPSAwOyAoaStzdHJpZGUra3NpemUtMSkgPD0gaW5wdXRfcm93czsgaSArPSBzdHJpZGUpIHsgIC8vIGlucHV0IHJvd3MKKyAgICBmb3IgKGludCBqID0gMDsgKGorc3RyaWRlK2tzaXplLTEpIDw9IGlucHV0X2NvbHM7IGogKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCBjb2xzCisgICAgICBpbnQgcGF0Y2hJZCA9IGkraW5wdXRfcm93cypqOworICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAvLyBwYXRjaCByb3dzCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga3NpemU7ICsrYykgeyAgLy8gcGF0Y2ggY29scworICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgaW5wdXRfZGVwdGg7ICsrZCkgeyAgLy8gZGVwdGgKKyAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAorICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0ID0gYypzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCBpbnB1dF9yb3dzICYmIGNvbF9vZmZzZXQgPCBpbnB1dF9jb2xzKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgcm93X29mZnNldCwgY29sX29mZnNldCwgYik7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihiLCBjb2xfb2Zmc2V0LCByb3dfb2Zmc2V0LCBkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBDb2xNYWpvcgorICAgICAgICAgICAgICBpZiAocmVzdWx0KGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgLy8gUm93TWFqb3IKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IENvbE1ham9yIGFuZCBSb3dNYWpvciBhZ3JlZS4KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGV4cGVjdGVkLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfcGF0Y2hfbm9fZXh0cmFfZGltKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzPiB0ZW5zb3IoMiwzLDUpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IHRlbnNvcl9yb3dfbWFqb3IgPSB0ZW5zb3Iuc3dhcF9sYXlvdXQoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMCksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDIpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMSksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMiksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDApKTsKKworICAvLyBTaW5nbGUgcGl4ZWwgcGF0Y2g6IENvbE1ham9yCisgIFRlbnNvcjxmbG9hdCwgND4gc2luZ2xlX3BpeGVsX3BhdGNoOworICBzaW5nbGVfcGl4ZWxfcGF0Y2ggPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGltZW5zaW9uKDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMiksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigzKSwgMyo1KTsKKworICAvLyBTaW5nbGUgcGl4ZWwgcGF0Y2g6IFJvd01ham9yCisgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3I7CisgIHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yLnNpemUoKTsgKytpKSB7CisgICAgLy8gQ29sTWFqb3IKKyAgICBpZiAodGVuc29yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIDogIiA8PCB0ZW5zb3IuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kYXRhKClbaV0sIHRlbnNvci5kYXRhKClbaV0pOworICAgIC8vIFJvd01ham9yCisgICAgaWYgKHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldICE9IHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIDogIgorICAgICAgICAgICA8PCB0ZW5zb3IuZGF0YSgpW2ldIDw8ICIgdnMgIgorICAgICAgICAgICA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSwKKyAgICAgICAgICAgICAgICAgICAgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGF0YSgpW2ldLCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kYXRhKClbaV0sCisgICAgICAgICAgICAgICAgICAgIHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgfQorCisgIC8vIEVudGlyZSBpbWFnZSBwYXRjaDogQ29sTWFqb3IKKyAgVGVuc29yPGZsb2F0LCA0PiBlbnRpcmVfaW1hZ2VfcGF0Y2g7CisgIGVudGlyZV9pbWFnZV9wYXRjaCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMywgNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigyKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDMpLCAzKjUpOworCisgIC8vIEVudGlyZSBpbWFnZSBwYXRjaDogUm93TWFqb3IKKyAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcjsKKyAgZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgaW50IHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgMzsgKytyKSB7CisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNTsgKytjKSB7CisgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAyOyArK2QpIHsKKyAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7CisgICAgICAgICAgICBpZiAoci0xK2kgPj0gMCAmJiBjLTIraiA+PSAwICYmIHItMStpIDwgMyAmJiBjLTIraiA8IDUpIHsKKyAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgci0xK2ksIGMtMitqKTsKKyAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihjLTIraiwgci0xK2ksIGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ29sTWFqb3IKKyAgICAgICAgICAgIGlmIChlbnRpcmVfaW1hZ2VfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCkgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCksIGV4cGVjdGVkKTsKKyAgICAgICAgICAgIC8vIFJvd01ham9yCisgICAgICAgICAgICBpZiAoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihwYXRjaElkLCBjLCByLCBkKSAhPQorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvcikgeworICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hJZCwgYywgciwgZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgorICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGV4cGVjdGVkLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIDJEIHBhdGNoOiBDb2xNYWpvcgorICBUZW5zb3I8ZmxvYXQsIDQ+IHR3b2RfcGF0Y2g7CisgIHR3b2RfcGF0Y2ggPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDIsIDIpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMSksIDIpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDMqNSk7CisKKyAgLy8gMkQgcGF0Y2g6IFJvd01ham9yCisgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IHR3b2RfcGF0Y2hfcm93X21ham9yOworICB0d29kX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDIsIDIpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDIpOworCisgIC8vIEJhc2VkIG9uIHRoZSBjYWxjdWxhdGlvbiBkZXNjcmliZWQgaW4gVGVuc29yVHJhaXRzLmgsIHBhZGRpbmcgaGFwcGVucyB0byBiZSAwLgorICBpbnQgcm93X3BhZGRpbmcgPSAwOworICBpbnQgY29sX3BhZGRpbmcgPSAwOworICBpbnQgc3RyaWRlID0gMTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBpbnQgcGF0Y2hJZCA9IGkrMypqOworICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAyOyArK3IpIHsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAyOyArK2MpIHsKKyAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDI7ICsrZCkgeworICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOworICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKKyAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICBpbnQgY29sX29mZnNldCA9IGMqc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOworICAgICAgICAgICAgLy8gQ29sTWFqb3IKKyAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDEpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDIpKSB7CisgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yKGQsIHJvd19vZmZzZXQsIGNvbF9vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCkgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoKGQsIHIsIGMsIHBhdGNoSWQpLCBleHBlY3RlZCk7CisgICAgICAgICAgICAvLyBSb3dNYWpvcgorICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSkgeworICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGNvbF9vZmZzZXQsIHJvd19vZmZzZXQsIGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkX3Jvd19tYWpvcikgeworICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWQsIGV4cGVjdGVkX3Jvd19tYWpvcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9pbWFnZW5ldF9wYXRjaGVzKCkKK3sKKyAgLy8gVGVzdCB0aGUgY29kZSBvbiB0eXBpY2FsIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgdGhlICdpbWFnZW5ldCcgYmVuY2htYXJrcyBhdAorICAvLyBodHRwczovL2dpdGh1Yi5jb20vc291bWl0aC9jb252bmV0LWJlbmNobWFya3MKKyAgLy8gQ29sTWFqb3IKKyAgVGVuc29yPGZsb2F0LCA0PiBsX2luKDMsIDEyOCwgMTI4LCAxNik7CisgIGxfaW4uc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgNT4gbF9vdXQgPSBsX2luLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigxKSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDIpLCAxMSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMyksIDEyOCoxMjgpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDQpLCAxNik7CisKKyAgLy8gUm93TWFqb3IKKyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gbF9vdXRfcm93X21ham9yID0gbF9pbi5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMTYpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMTI4KjEyOCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAxMSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAxMSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCAzKTsKKworICBmb3IgKGludCBiID0gMDsgYiA8IDE2OyArK2IpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgKytqKSB7CisgICAgICAgIGludCBwYXRjaElkID0gaSsxMjgqajsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAxMTsgKytjKSB7CisgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAxMTsgKytyKSB7CisgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgeworICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgIGlmIChyLTUraSA+PSAwICYmIGMtNStqID49IDAgJiYgci01K2kgPCAxMjggJiYgYy01K2ogPCAxMjgpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgci01K2ksIGMtNStqLCBiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBDb2xNYWpvcgorICAgICAgICAgICAgICBpZiAobF9vdXQoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CisgICAgICAgICAgICAgIC8vIFJvd01ham9yCisgICAgICAgICAgICAgIGlmIChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0KKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqCisgICAgICAgICAgICAgICAgICAgICA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDb2xNYWpvcgorICBsX2luLnJlc2l6ZSgxNiwgNjQsIDY0LCAzMik7CisgIGxfaW4uc2V0UmFuZG9tKCk7CisgIGxfb3V0ID0gbF9pbi5leHRyYWN0X2ltYWdlX3BhdGNoZXMoOSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMCksIDE2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigxKSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMiksIDkpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDMpLCA2NCo2NCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oNCksIDMyKTsKKworICAvLyBSb3dNYWpvcgorICBsX291dF9yb3dfbWFqb3IgPSBsX2luLnN3YXBfbGF5b3V0KCkuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDksIDkpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMzIpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNjQqNjQpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigyKSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDE2KTsKKworICBmb3IgKGludCBiID0gMDsgYiA8IDMyOyArK2IpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjQ7ICsraikgeworICAgICAgICBpbnQgcGF0Y2hJZCA9IGkrNjQqajsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA5OyArK2MpIHsKKyAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IDk7ICsrcikgeworICAgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAxNjsgKytkKSB7CisgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgICAgICAgICAgICAgaWYgKHItNCtpID49IDAgJiYgYy00K2ogPj0gMCAmJiByLTQraSA8IDY0ICYmIGMtNCtqIDwgNjQpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgci00K2ksIGMtNCtqLCBiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBDb2xNYWpvcgorICAgICAgICAgICAgICBpZiAobF9vdXQoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CisgICAgICAgICAgICAgIC8vIFJvd01ham9yCisgICAgICAgICAgICAgIGlmIChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbE1ham9yCisgIGxfaW4ucmVzaXplKDMyLCAxNiwgMTYsIDMyKTsKKyAgbF9pbi5zZXRSYW5kb20oKTsKKyAgbF9vdXQgPSBsX2luLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyg3LCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigwKSwgMzIpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDEpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigyKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMyksIDE2KjE2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbig0KSwgMzIpOworCisgIC8vIFJvd01ham9yCisgIGxfb3V0X3Jvd19tYWpvciA9IGxfaW4uc3dhcF9sYXlvdXQoKS5leHRyYWN0X2ltYWdlX3BhdGNoZXMoNywgNyk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzMik7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAxNioxNik7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDcpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMzIpOworCisgIGZvciAoaW50IGIgPSAwOyBiIDwgMzI7ICsrYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIGludCBwYXRjaElkID0gaSsxNipqOworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDc7ICsrYykgeworICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgNzsgKytyKSB7CisgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDMyOyArK2QpIHsKKyAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOworICAgICAgICAgICAgICBpZiAoci0zK2kgPj0gMCAmJiBjLTMraiA+PSAwICYmIHItMytpIDwgMTYgJiYgYy0zK2ogPCAxNikgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbihkLCByLTMraSwgYy0zK2osIGIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8vIENvbE1ham9yCisgICAgICAgICAgICAgIGlmIChsX291dChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgLy8gUm93TWFqb3IKKyAgICAgICAgICAgICAgaWYgKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29sTWFqb3IKKyAgbF9pbi5yZXNpemUoNjQsIDEzLCAxMywgMzIpOworICBsX2luLnNldFJhbmRvbSgpOworICBsX291dCA9IGxfaW4uZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDApLCA2NCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDIpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigzKSwgMTMqMTMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDQpLCAzMik7CisKKyAgLy8gUm93TWFqb3IKKyAgbF9vdXRfcm93X21ham9yID0gbF9pbi5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygzLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDEzKjEzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCA2NCk7CisKKyAgZm9yIChpbnQgYiA9IDA7IGIgPCAzMjsgKytiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEzOyArK2opIHsKKyAgICAgICAgaW50IHBhdGNoSWQgPSBpKzEzKmo7CisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgMzsgKytjKSB7CisgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAzOyArK3IpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgNjQ7ICsrZCkgeworICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgIGlmIChyLTEraSA+PSAwICYmIGMtMStqID49IDAgJiYgci0xK2kgPCAxMyAmJiBjLTEraiA8IDEzKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luKGQsIHItMStpLCBjLTEraiwgYik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKKyAgICAgICAgICAgICAgaWYgKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dChkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOworICAgICAgICAgICAgICAvLyBSb3dNYWpvcgorICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9pbWFnZV9wYXRjaCgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3Rfc2ltcGxlX3BhdGNoKCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X3BhdGNoX25vX2V4dHJhX2RpbSgpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9wYXRjaF9wYWRkaW5nX3ZhbGlkKCkpOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWRfc2FtZV92YWx1ZSgpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9wYXRjaF9wYWRkaW5nX3NhbWUoKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3RfaW1hZ2VuZXRfcGF0Y2hlcygpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZGV4X2xpc3QuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW5kZXhfbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNWRmNgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZGV4X2xpc3QuY3BwCkBAIC0wLDAgKzEsMzg2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCisjaWZkZWYgRUlHRU5fSEFTX0lOREVYX0xJU1QKKworc3RhdGljIHZvaWQgdGVzdF9zdGF0aWNfaW5kZXhfbGlzdCgpCit7CisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgY29uc3RleHByIGF1dG8gcmVkdWN0aW9uX2F4aXMgPSBtYWtlX2luZGV4X2xpc3QoMCwgMSwgMik7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDA+KHJlZHVjdGlvbl9heGlzKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDE+KHJlZHVjdGlvbl9heGlzKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KHJlZHVjdGlvbl9heGlzKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxEZW5zZUluZGV4PihyZWR1Y3Rpb25fYXhpc1swXSksIDApOworICBWRVJJRllfSVNfRVFVQUwoc3RhdGljX2Nhc3Q8RGVuc2VJbmRleD4ocmVkdWN0aW9uX2F4aXNbMV0pLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0YXRpY19jYXN0PERlbnNlSW5kZXg+KHJlZHVjdGlvbl9heGlzWzJdKSwgMik7CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFycmF5X2dldDwwPihyZWR1Y3Rpb25fYXhpcykgPT0gMCksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcnJheV9nZXQ8MT4ocmVkdWN0aW9uX2F4aXMpID09IDEpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KHJlZHVjdGlvbl9heGlzKSA9PSAyKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICBUZW5zb3I8ZmxvYXQsIDE+IHJlc3VsdCA9IHRlbnNvci5zdW0ocmVkdWN0aW9uX2F4aXMpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7ICsraSkgeworICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA1OyArK2wpIHsKKyAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaixrLGwsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoaSksIGV4cGVjdGVkKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfdHlwZTJpbmRleF9saXN0KCkKK3sKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoMiwzLDUsNywxMSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgdGVuc29yICs9IHRlbnNvci5jb25zdGFudCgxMC4wZik7CisKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+PiBEaW1zMDsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPj4gRGltczE7CisgIHR5cGVkZWYgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPiwgRWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+PiBEaW1zMjsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPiwgRWlnZW46OnR5cGUyaW5kZXg8Mj4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+PiBEaW1zMzsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPiwgRWlnZW46OnR5cGUyaW5kZXg8Mj4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+LCBFaWdlbjo6dHlwZTJpbmRleDw0Pj4gRGltczQ7CisKKyNpZiAwCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8RGltczA+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8RGltczE+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8RGltczI+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8RGltczM+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRpY2VzX3N0YXRpY2FsbHlfa25vd25fdG9faW5jcmVhc2U8RGltczQ+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisjZW5kaWYKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMCwgMSwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczEsIDIsIENvbE1ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXMyLCAzLCBDb2xNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMywgNCwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczQsIDUsIENvbE1ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczAsIDEsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXMxLCAyLCBSb3dNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMiwgMywgUm93TWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczMsIDQsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXM0LCA1LCBSb3dNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgIGNvbnN0IERpbXMwIHJlZHVjdGlvbl9heGlzMDsKKyAgVGVuc29yPGZsb2F0LCA0PiByZXN1bHQwID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczApOworICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihpLGosayxsLG0pOworICAgICAgICAgIH0KKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDAoaixrLGwsbSksIGV4cGVjdGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGNvbnN0IERpbXMxIHJlZHVjdGlvbl9heGlzMTsKKyAgVGVuc29yPGZsb2F0LCAzPiByZXN1bHQxID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczEpOworICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSxqLGssbCxtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQxKGssbCxtKSwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNvbnN0IERpbXMyIHJlZHVjdGlvbl9heGlzMjsKKyAgVGVuc29yPGZsb2F0LCAyPiByZXN1bHQyID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczIpOworICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksaixrLGwsbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDIobCxtKSwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorCisgIGNvbnN0IERpbXMzIHJlZHVjdGlvbl9heGlzMzsKKyAgVGVuc29yPGZsb2F0LCAxPiByZXN1bHQzID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczMpOworICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKKyAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihpLGosayxsLG0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDMobSksIGV4cGVjdGVkKTsKKyAgfQorCisgIGNvbnN0IERpbXM0IHJlZHVjdGlvbl9heGlzNDsKKyAgVGVuc29yPGZsb2F0LCAwPiByZXN1bHQ0ID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczQpOworICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgIGZvciAoaW50IG0gPSAwOyBtIDwgMTE7ICsrbSkgeworICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSxqLGssbCxtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQ0KCksIGV4cGVjdGVkKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X3R5cGUyaW5kZXhwYWlyX2xpc3QoKQoreworICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcigyLDMsNSw3LDExKTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICB0ZW5zb3IgKz0gdGVuc29yLmNvbnN0YW50KDEwLjBmKTsKKworICB0eXBlZGVmIEVpZ2VuOjpJbmRleFBhaXJMaXN0PEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwwLDEwPj4gRGltczA7CisgIHR5cGVkZWYgRWlnZW46OkluZGV4UGFpckxpc3Q8RWlnZW46OnR5cGUyaW5kZXhwYWlyPDAsMTA+LCBFaWdlbjo6dHlwZTJpbmRleHBhaXI8MSwxMT4sIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwyLDEyPj4gRGltczJfYTsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwxMD4sIEVpZ2VuOjpJbmRleFBhaXI8RGVuc2VJbmRleD4sIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwyLDEyPj4gRGltczJfYjsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6SW5kZXhQYWlyPERlbnNlSW5kZXg+LCBFaWdlbjo6dHlwZTJpbmRleHBhaXI8MSwxMT4sIEVpZ2VuOjpJbmRleFBhaXI8RGVuc2VJbmRleD4+IERpbXMyX2M7CisKKyAgRGltczAgZDA7CisgIERpbXMyX2EgZDJfYTsKKworICBEaW1zMl9iIGQyX2I7CisgIGQyX2Iuc2V0KDEsIEVpZ2VuOjpJbmRleFBhaXI8RGVuc2VJbmRleD4oMSwxMSkpOworCisgIERpbXMyX2MgZDJfYzsKKyAgZDJfYy5zZXQoMCwgRWlnZW46OkluZGV4UGFpcjxEZW5zZUluZGV4PihFaWdlbjo6SW5kZXhQYWlyPERlbnNlSW5kZXg+KDAsMTApKSk7CisgIGQyX2Muc2V0KDEsIEVpZ2VuOjpJbmRleFBhaXI8RGVuc2VJbmRleD4oMSwxMSkpOyAgLy8gc2V0dGluZyB0eXBlMmluZGV4cGFpciB0byBjb3JyZWN0IHZhbHVlLgorICBkMl9jLnNldCgyLCBFaWdlbjo6SW5kZXhQYWlyPERlbnNlSW5kZXg+KDIsMTIpKTsKKworICBWRVJJRllfSVNfRVFVQUwoZDJfYVswXS5maXJzdCwgMCk7CisgIFZFUklGWV9JU19FUVVBTChkMl9hWzBdLnNlY29uZCwgMTApOworICBWRVJJRllfSVNfRVFVQUwoZDJfYVsxXS5maXJzdCwgMSk7CisgIFZFUklGWV9JU19FUVVBTChkMl9hWzFdLnNlY29uZCwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoZDJfYVsyXS5maXJzdCwgMik7CisgIFZFUklGWV9JU19FUVVBTChkMl9hWzJdLnNlY29uZCwgMTIpOworCisgIFZFUklGWV9JU19FUVVBTChkMl9iWzBdLmZpcnN0LCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2JbMF0uc2Vjb25kLCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChkMl9iWzFdLmZpcnN0LCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2JbMV0uc2Vjb25kLCAxMSk7CisgIFZFUklGWV9JU19FUVVBTChkMl9iWzJdLmZpcnN0LCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2JbMl0uc2Vjb25kLCAxMik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2NbMF0uZmlyc3QsIDApOworICBWRVJJRllfSVNfRVFVQUwoZDJfY1swXS5zZWNvbmQsIDEwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2NbMV0uZmlyc3QsIDEpOworICBWRVJJRllfSVNfRVFVQUwoZDJfY1sxXS5zZWNvbmQsIDExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGQyX2NbMl0uZmlyc3QsIDIpOworICBWRVJJRllfSVNfRVFVQUwoZDJfY1syXS5zZWNvbmQsIDEyKTsKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChkMl9hLnZhbHVlX2tub3duX3N0YXRpY2FsbHkoMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGQyX2EudmFsdWVfa25vd25fc3RhdGljYWxseSgxKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoZDJfYS52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KDIpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGQyX2IudmFsdWVfa25vd25fc3RhdGljYWxseSgwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoZDJfYi52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoZDJfYi52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KDIpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGQyX2MudmFsdWVfa25vd25fc3RhdGljYWxseSgwKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGQyX2MudmFsdWVfa25vd25fc3RhdGljYWxseSgxKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoZDJfYy52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KDIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMD4oMCwgMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMwPigwLCAxKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDAsIDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMSwgMSkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMiwgMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDIsIDMpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMCwgMSkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigxLCAxKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDEsIDIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMiwgMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDIsIDMpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAwKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDAsIDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMSwgMSkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDEsIDIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMiwgMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigyLCAzKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMwPigwLCAxMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMD4oMCwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMTApID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDExKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDEyKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigyLCAxMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigyLCAxMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxMSkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMSwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDEsIDEyKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAxMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAxMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAxMCkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMCwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDEsIDExKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDEsIDEyKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigyLCAxMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMiwgMTMpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfaW5kZXhfbGlzdCgpCit7CisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgaW50IGRpbTEgPSAyOworICBpbnQgZGltMiA9IDE7CisgIGludCBkaW0zID0gMDsKKworICBhdXRvIHJlZHVjdGlvbl9heGlzID0gbWFrZV9pbmRleF9saXN0KGRpbTEsIGRpbTIsIGRpbTMpOworCisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDA+KHJlZHVjdGlvbl9heGlzKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDE+KHJlZHVjdGlvbl9heGlzKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KHJlZHVjdGlvbl9heGlzKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxEZW5zZUluZGV4PihyZWR1Y3Rpb25fYXhpc1swXSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoc3RhdGljX2Nhc3Q8RGVuc2VJbmRleD4ocmVkdWN0aW9uX2F4aXNbMV0pLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0YXRpY19jYXN0PERlbnNlSW5kZXg+KHJlZHVjdGlvbl9heGlzWzJdKSwgMCk7CisKKyAgVGVuc29yPGZsb2F0LCAxPiByZXN1bHQgPSB0ZW5zb3Iuc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQuc2l6ZSgpOyArK2kpIHsKKyAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNTsgKytsKSB7CisgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGosayxsLGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KGkpLCBleHBlY3RlZCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9taXhlZF9pbmRleF9saXN0KCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBpbnQgZGltMiA9IDE7CisgIGludCBkaW00ID0gMzsKKworICBhdXRvIHJlZHVjdGlvbl9heGlzID0gbWFrZV9pbmRleF9saXN0KDAsIGRpbTIsIDIsIGRpbTQpOworCisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDA+KHJlZHVjdGlvbl9heGlzKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDE+KHJlZHVjdGlvbl9heGlzKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KHJlZHVjdGlvbl9heGlzKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChpbnRlcm5hbDo6YXJyYXlfZ2V0PDM+KHJlZHVjdGlvbl9heGlzKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxEZW5zZUluZGV4PihyZWR1Y3Rpb25fYXhpc1swXSksIDApOworICBWRVJJRllfSVNfRVFVQUwoc3RhdGljX2Nhc3Q8RGVuc2VJbmRleD4ocmVkdWN0aW9uX2F4aXNbMV0pLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0YXRpY19jYXN0PERlbnNlSW5kZXg+KHJlZHVjdGlvbl9heGlzWzJdKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxEZW5zZUluZGV4PihyZWR1Y3Rpb25fYXhpc1szXSksIDMpOworCisgIHR5cGVkZWYgSW5kZXhMaXN0PHR5cGUyaW5kZXg8MD4sIGludCwgdHlwZTJpbmRleDwyPiwgaW50PiBSZWR1Y3Rpb25JbmRpY2VzOworICBSZWR1Y3Rpb25JbmRpY2VzIHJlZHVjdGlvbl9pbmRpY2VzOworICByZWR1Y3Rpb25faW5kaWNlcy5zZXQoMSwgMSk7CisgIHJlZHVjdGlvbl9pbmRpY2VzLnNldCgzLCAzKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFycmF5X2dldDwwPihyZWR1Y3Rpb25faW5kaWNlcykgPT0gMCksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcnJheV9nZXQ8Mj4ocmVkdWN0aW9uX2luZGljZXMpID09IDIpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kZXhfa25vd25fc3RhdGljYWxseTxSZWR1Y3Rpb25JbmRpY2VzPigwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmluZGV4X2tub3duX3N0YXRpY2FsbHk8UmVkdWN0aW9uSW5kaWNlcz4oMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPFJlZHVjdGlvbkluZGljZXM+KDAsIDApID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxSZWR1Y3Rpb25JbmRpY2VzPigyLCAyKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyNpZiAwCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphbGxfaW5kaWNlc19rbm93bl9zdGF0aWNhbGx5PFJlZHVjdGlvbkluZGljZXM+KCkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlPFJlZHVjdGlvbkluZGljZXM+KCkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworI2VuZGlmCisKKyAgdHlwZWRlZiBJbmRleExpc3Q8dHlwZTJpbmRleDwwPiwgdHlwZTJpbmRleDwxPiwgdHlwZTJpbmRleDwyPiwgdHlwZTJpbmRleDwzPj4gUmVkdWN0aW9uTGlzdDsKKyAgUmVkdWN0aW9uTGlzdCByZWR1Y3Rpb25fbGlzdDsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8UmVkdWN0aW9uTGlzdD4oMCwgMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppbmRleF9zdGF0aWNhbGx5X2VxPFJlZHVjdGlvbkxpc3Q+KDEsIDEpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kZXhfc3RhdGljYWxseV9lcTxSZWR1Y3Rpb25MaXN0PigyLCAyKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmluZGV4X3N0YXRpY2FsbHlfZXE8UmVkdWN0aW9uTGlzdD4oMywgMykgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisjaWYgMAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YWxsX2luZGljZXNfa25vd25fc3RhdGljYWxseTxSZWR1Y3Rpb25MaXN0PigpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlPFJlZHVjdGlvbkxpc3Q+KCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisjZW5kaWYKKworICBUZW5zb3I8ZmxvYXQsIDA+IHJlc3VsdDEgPSB0ZW5zb3Iuc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgVGVuc29yPGZsb2F0LCAwPiByZXN1bHQyID0gdGVuc29yLnN1bShyZWR1Y3Rpb25faW5kaWNlcyk7CisgIFRlbnNvcjxmbG9hdCwgMD4gcmVzdWx0MyA9IHRlbnNvci5zdW0ocmVkdWN0aW9uX2xpc3QpOworCisgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSxqLGssbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQxKCksIGV4cGVjdGVkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQyKCksIGV4cGVjdGVkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQzKCksIGV4cGVjdGVkKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2RpbV9jaGVjaygpCit7CisgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIGludD4gZGltMTsKKyAgZGltMS5zZXQoMSwgMik7CisgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIGludD4gZGltMjsKKyAgZGltMi5zZXQoMSwgMik7CisgIFZFUklGWShkaW1lbnNpb25zX21hdGNoKGRpbTEsIGRpbTIpKTsKK30KKworCisjZW5kaWYKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9pbmRleF9saXN0KCkKK3sKKyNpZmRlZiBFSUdFTl9IQVNfSU5ERVhfTElTVAorICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfaW5kZXhfbGlzdCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdHlwZTJpbmRleF9saXN0KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90eXBlMmluZGV4cGFpcl9saXN0KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9keW5hbWljX2luZGV4X2xpc3QoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X21peGVkX2luZGV4X2xpc3QoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2RpbV9jaGVjaygpKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW5mbGF0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5NzkzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbi5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgS2UgWWFuZyA8eWFuZ2tlQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfaW5mbGF0aW9uKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYXJyYXk8cHRyZGlmZl90LCA0PiBzdHJpZGVzOworCisgIHN0cmlkZXNbMF0gPSAxOworICBzdHJpZGVzWzFdID0gMTsKKyAgc3RyaWRlc1syXSA9IDE7CisgIHN0cmlkZXNbM10gPSAxOworCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gbm9fc3RyaWRlOworICBub19zdHJpZGUgPSB0ZW5zb3IuaW5mbGF0ZShzdHJpZGVzKTsKKworICBWRVJJRllfSVNfRVFVQUwobm9fc3RyaWRlLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChub19zdHJpZGUuZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG5vX3N0cmlkZS5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwobm9fc3RyaWRlLmRpbWVuc2lvbigzKSwgNyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBub19zdHJpZGUoaSxqLGssbCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyaWRlc1swXSA9IDI7CisgIHN0cmlkZXNbMV0gPSA0OworICBzdHJpZGVzWzJdID0gMjsKKyAgc3RyaWRlc1szXSA9IDM7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5mbGF0ZWQ7CisgIGluZmxhdGVkID0gdGVuc29yLmluZmxhdGUoc3RyaWRlcyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGluZmxhdGVkLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChpbmZsYXRlZC5kaW1lbnNpb24oMSksIDkpOworICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQuZGltZW5zaW9uKDIpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGluZmxhdGVkLmRpbWVuc2lvbigzKSwgMTkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgOTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTk7ICsrbCkgeworICAgICAgICAgIGlmIChpICUgMiA9PSAwICYmCisgICAgICAgICAgICAgIGogJSA0ID09IDAgJiYKKyAgICAgICAgICAgICAgayAlIDIgPT0gMCAmJgorICAgICAgICAgICAgICBsICUgMyA9PSAwKSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQoaSxqLGssbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yKGkvMiwgai80LCBrLzIsIGwvMykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoMCwgaW5mbGF0ZWQoaSxqLGssbCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2luZmxhdGlvbigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9pbmZsYXRpb248Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfaW5mbGF0aW9uPFJvd01ham9yPigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ludGRpdi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbnRkaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmI3MGIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbnRkaXYuY3BwCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKKwordm9pZCB0ZXN0X3NpZ25lZF8zMmJpdCgpCit7CisgIC8vIERpdmlkZSBieSBvbmUKKyAgY29uc3QgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPGludDMyX3QsIGZhbHNlPiBkaXZfYnlfb25lKDEpOworCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDI1MDAwOyArK2opIHsKKyAgICBjb25zdCBpbnQzMl90IGZhc3RfZGl2ID0gaiAvIGRpdl9ieV9vbmU7CisgICAgY29uc3QgaW50MzJfdCBzbG93X2RpdiA9IGogLyAxOworICAgIFZFUklGWV9JU19FUVVBTChmYXN0X2Rpdiwgc2xvd19kaXYpOworICB9CisKKyAgLy8gU3RhbmRhcmQgZGl2aWRlIGJ5IDIgb3IgbW9yZQorICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCAyNTAwMDsgKytpKSB7CisgICAgY29uc3QgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPGludDMyX3QsIGZhbHNlPiBkaXYoaSk7CisKKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCAyNTAwMDsgKytqKSB7CisgICAgICBjb25zdCBpbnQzMl90IGZhc3RfZGl2ID0gaiAvIGRpdjsKKyAgICAgIGNvbnN0IGludDMyX3Qgc2xvd19kaXYgPSBqIC8gaTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChmYXN0X2Rpdiwgc2xvd19kaXYpOworICAgIH0KKyAgfQorCisgIC8vIE9wdGltaXplZCBkaXZpZGUgYnkgMiBvciBtb3JlCisgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IDI1MDAwOyArK2kpIHsKKyAgICBjb25zdCBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50MzJfdCwgdHJ1ZT4gZGl2KGkpOworCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMjUwMDA7ICsraikgeworICAgICAgY29uc3QgaW50MzJfdCBmYXN0X2RpdiA9IGogLyBkaXY7CisgICAgICBjb25zdCBpbnQzMl90IHNsb3dfZGl2ID0gaiAvIGk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoZmFzdF9kaXYsIHNsb3dfZGl2KTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfdW5zaWduZWRfMzJiaXQoKQoreworICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgMjUwMDA7ICsraSkgeworICAgIGNvbnN0IEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjx1aW50MzJfdD4gZGl2KGkpOworCisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDI1MDAwOyArK2opIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZhc3RfZGl2ID0gaiAvIGRpdjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHNsb3dfZGl2ID0gaiAvIGk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoZmFzdF9kaXYsIHNsb3dfZGl2KTsKKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3Rfc2lnbmVkXzY0Yml0KCkKK3sKKyAgZm9yIChpbnQ2NF90IGkgPSAxOyBpIDwgMjUwMDA7ICsraSkgeworICAgIGNvbnN0IEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxpbnQ2NF90PiBkaXYoaSk7CisKKyAgICBmb3IgKGludDY0X3QgaiA9IDA7IGogPCAyNTAwMDsgKytqKSB7CisgICAgICBjb25zdCBpbnQ2NF90IGZhc3RfZGl2ID0gaiAvIGRpdjsKKyAgICAgIGNvbnN0IGludDY0X3Qgc2xvd19kaXYgPSBqIC8gaTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChmYXN0X2Rpdiwgc2xvd19kaXYpOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF91bnNpZ25lZF82NGJpdCgpCit7CisgIGZvciAodWludDY0X3QgaSA9IDE7IGkgPCAyNTAwMDsgKytpKSB7CisgICAgY29uc3QgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPHVpbnQ2NF90PiBkaXYoaSk7CisKKyAgICBmb3IgKHVpbnQ2NF90IGogPSAwOyBqIDwgMjUwMDA7ICsraikgeworICAgICAgY29uc3QgdWludDY0X3QgZmFzdF9kaXYgPSBqIC8gZGl2OworICAgICAgY29uc3QgdWludDY0X3Qgc2xvd19kaXYgPSBqIC8gaTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChmYXN0X2Rpdiwgc2xvd19kaXYpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfcG93ZXJzXzMyYml0KCkgeworICBmb3IgKGludCBleHBvbiA9IDE7IGV4cG9uIDwgMzE7IGV4cG9uKyspIHsKKyAgICBpbnQzMl90IGRpdiA9ICgxIDw8IGV4cG9uKTsKKyAgICBmb3IgKGludCBudW1fZXhwb24gPSAwOyBudW1fZXhwb24gPCAzMjsgbnVtX2V4cG9uKyspIHsKKyAgICAgIGludDMyX3Qgc3RhcnRfbnVtID0gKDEgPDwgbnVtX2V4cG9uKSAtIDEwMDsKKyAgICAgIGludDMyX3QgZW5kX251bSA9ICgxIDw8IG51bV9leHBvbikgKyAxMDA7CisgICAgICBpZiAoc3RhcnRfbnVtIDwgMCkKKyAgICAgICAgc3RhcnRfbnVtID0gMDsKKyAgICAgIGZvciAoaW50MzJfdCBudW0gPSBzdGFydF9udW07IG51bSA8IGVuZF9udW07IG51bSsrKSB7CisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxpbnQzMl90PiBkaXZpZGVyID0KKyAgICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50MzJfdD4oZGl2KTsKKyAgICAgICAgaW50MzJfdCByZXN1bHQgPSBudW0vZGl2OworICAgICAgICBpbnQzMl90IHJlc3VsdF9vcCA9IGRpdmlkZXIuZGl2aWRlKG51bSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfb3AsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9wb3dlcnNfNjRiaXQoKSB7CisgIGZvciAoaW50IGV4cG9uID0gMDsgZXhwb24gPCA2MzsgZXhwb24rKykgeworICAgIGludDY0X3QgZGl2ID0gKDF1bGwgPDwgZXhwb24pOworICAgIGZvciAoaW50IG51bV9leHBvbiA9IDA7IG51bV9leHBvbiA8IDYzOyBudW1fZXhwb24rKykgeworICAgICAgaW50NjRfdCBzdGFydF9udW0gPSAoMXVsbCA8PCBudW1fZXhwb24pIC0gMTA7CisgICAgICBpbnQ2NF90IGVuZF9udW0gPSAoMXVsbCA8PCBudW1fZXhwb24pICsgMTA7CisgICAgICBpZiAoc3RhcnRfbnVtIDwgMCkKKyAgICAgICAgc3RhcnRfbnVtID0gMDsKKyAgICAgIGZvciAoaW50NjRfdCBudW0gPSBzdGFydF9udW07IG51bSA8IGVuZF9udW07IG51bSsrKSB7CisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxpbnQ2NF90PiBkaXZpZGVyKGRpdik7CisgICAgICAgIGludDY0X3QgcmVzdWx0ID0gbnVtL2RpdjsKKyAgICAgICAgaW50NjRfdCByZXN1bHRfb3AgPSBkaXZpZGVyLmRpdmlkZShudW0pOworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X29wLCByZXN1bHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3Rfc3BlY2lmaWMoKSB7CisgIC8vIEEgcGFydGljdWxhciBjb21iaW5hdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IGZhaWxpbmcKKyAgaW50NjRfdCBkaXYgPSAyMDk3MTUyMDA7CisgIGludDY0X3QgbnVtID0gMzIzODAwMjY4OGxsOworICBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50NjRfdD4gZGl2aWRlcihkaXYpOworICBpbnQ2NF90IHJlc3VsdCA9IG51bS9kaXY7CisgIGludDY0X3QgcmVzdWx0X29wID0gZGl2aWRlci5kaXZpZGUobnVtKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdCwgcmVzdWx0X29wKTsKK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9pbnRkaXYoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NpZ25lZF8zMmJpdCgpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF91bnNpZ25lZF8zMmJpdCgpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9zaWduZWRfNjRiaXQoKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfdW5zaWduZWRfNjRiaXQoKSk7CisgIENBTExfU1VCVEVTVF81KHRlc3RfcG93ZXJzXzMyYml0KCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0X3Bvd2Vyc182NGJpdCgpKTsKKyAgQ0FMTF9TVUJURVNUXzcodGVzdF9zcGVjaWZpYygpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2lvLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2lvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk5NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW8uY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfb3V0cHV0XzBkKCkKK3sKKyAgVGVuc29yPGludCwgMCwgRGF0YUxheW91dD4gdGVuc29yOworICB0ZW5zb3IoKSA9IDEyMzsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBvczsKKyAgb3MgPDwgdGVuc29yOworCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkKCIxMjMiKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6c3RyaW5nKG9zLnN0cigpKSwgZXhwZWN0ZWQpOworfQorCisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9vdXRwdXRfMWQoKQoreworICBUZW5zb3I8aW50LCAxLCBEYXRhTGF5b3V0PiB0ZW5zb3IoNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgdGVuc29yKGkpID0gaTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworICBvcyA8PCB0ZW5zb3I7CisKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIjBcbjFcbjJcbjNcbjQiKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6c3RyaW5nKG9zLnN0cigpKSwgZXhwZWN0ZWQpOworCisgIEVpZ2VuOjpUZW5zb3I8ZG91YmxlLDEsRGF0YUxheW91dD4gZW1wdHlfdGVuc29yKDApOworICBzdGQ6OnN0cmluZ3N0cmVhbSBlbXB0eV9vczsKKyAgZW1wdHlfb3MgPDwgZW1wdHlfdGVuc29yOworICBzdGQ6OnN0cmluZyBlbXB0eV9zdHJpbmc7CisgIFZFUklGWV9JU19FUVVBTChzdGQ6OnN0cmluZyhlbXB0eV9vcy5zdHIoKSksIGVtcHR5X3N0cmluZyk7Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X291dHB1dF8yZCgpCit7CisgIFRlbnNvcjxpbnQsIDIsIERhdGFMYXlvdXQ+IHRlbnNvcig1LCAzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgdGVuc29yKGksIGopID0gaSpqOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworICBvcyA8PCB0ZW5zb3I7CisKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIjAgIDAgIDBcbjAgIDEgIDJcbjAgIDIgIDRcbjAgIDMgIDZcbjAgIDQgIDgiKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6c3RyaW5nKG9zLnN0cigpKSwgZXhwZWN0ZWQpOworfQorCisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9vdXRwdXRfZXhwcigpCit7CisgIFRlbnNvcjxpbnQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcjEoNSk7CisgIFRlbnNvcjxpbnQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcjIoNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgdGVuc29yMShpKSA9IGk7CisgICAgdGVuc29yMihpKSA9IDc7CisgIH0KKworICBzdGQ6OnN0cmluZ3N0cmVhbSBvczsKKyAgb3MgPDwgdGVuc29yMSArIHRlbnNvcjI7CisKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIiA3XG4gOFxuIDlcbjEwXG4xMSIpOworICBWRVJJRllfSVNfRVFVQUwoc3RkOjpzdHJpbmcob3Muc3RyKCkpLCBleHBlY3RlZCk7Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X291dHB1dF9zdHJpbmcoKQoreworICBUZW5zb3I8c3RkOjpzdHJpbmcsIDIsIERhdGFMYXlvdXQ+IHRlbnNvcig1LCAzKTsKKyAgdGVuc29yLnNldENvbnN0YW50KHN0ZDo6c3RyaW5nKCJmb28iKSk7CisKKyAgc3RkOjpjb3V0IDw8IHRlbnNvciA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gb3M7CisgIG9zIDw8IHRlbnNvcjsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZCgiZm9vICBmb28gIGZvb1xuZm9vICBmb28gIGZvb1xuZm9vICBmb28gIGZvb1xuZm9vICBmb28gIGZvb1xuZm9vICBmb28gIGZvbyIpOworICBWRVJJRllfSVNfRVFVQUwoc3RkOjpzdHJpbmcob3Muc3RyKCkpLCBleHBlY3RlZCk7Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X291dHB1dF9jb25zdCgpCit7CisgIFRlbnNvcjxpbnQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcig1KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICB0ZW5zb3IoaSkgPSBpOworICB9CisKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDEsIERhdGFMYXlvdXQ+ID4gdGVuc29yX21hcCh0ZW5zb3IuZGF0YSgpLCA1KTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBvczsKKyAgb3MgPDwgdGVuc29yX21hcDsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZCgiMFxuMVxuMlxuM1xuNCIpOworICBWRVJJRllfSVNfRVFVQUwoc3RkOjpzdHJpbmcob3Muc3RyKCkpLCBleHBlY3RlZCk7Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9pbygpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8wZDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8wZDxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8xZDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8xZDxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8yZDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF8yZDxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF9leHByPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfb3V0cHV0X2V4cHI8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9vdXRwdXRfc3RyaW5nPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfb3V0cHV0X3N0cmluZzxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF9jb25zdDxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X291dHB1dF9jb25zdDxSb3dNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyOTdhOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2xheW91dF9zd2FwLmNwcApAQCAtMCwwICsxLDYxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOworCitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zd2FwKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzLCBDb2xNYWpvcj4gdGVuc29yKDIsMyw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IHRlbnNvcjIgPSB0ZW5zb3Iuc3dhcF9sYXlvdXQoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMCksIHRlbnNvcjIuZGltZW5zaW9uKDIpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMSksIHRlbnNvcjIuZGltZW5zaW9uKDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMiksIHRlbnNvcjIuZGltZW5zaW9uKDApKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrKSwgdGVuc29yMihrLGosaSkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3Rfc3dhcF9hc19sdmFsdWUoKQoreworICBUZW5zb3I8ZmxvYXQsIDMsIENvbE1ham9yPiB0ZW5zb3IoMiwzLDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gdGVuc29yMig3LDMsMik7CisgIHRlbnNvcjIuc3dhcF9sYXlvdXQoKSA9IHRlbnNvcjsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMCksIHRlbnNvcjIuZGltZW5zaW9uKDIpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMSksIHRlbnNvcjIuZGltZW5zaW9uKDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMiksIHRlbnNvcjIuZGltZW5zaW9uKDApKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrKSwgdGVuc29yMihrLGosaSkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXAoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfc3dhcCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3dhcF9hc19sdmFsdWUoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sdmFsdWUuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbHZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFmNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbHZhbHVlLmNwcApAQCAtMCwwICsxLDQyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OlJvd01ham9yOworCisKK3N0YXRpYyB2b2lkIHRlc3RfY29tcG91bmRfYXNzaWdubWVudCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLDMsNyk7CisKKyAgbWF0MS5zZXRSYW5kb20oKTsKKyAgbWF0Mi5zZXRSYW5kb20oKTsKKyAgbWF0MyA9IG1hdDE7CisgIG1hdDMgKz0gbWF0MjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCBtYXQxKGksaixrKSArIG1hdDIoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX2x2YWx1ZSgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBvdW5kX2Fzc2lnbm1lbnQoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXAuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIwZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWFwLmNwcApAQCAtMCwwICsxLDI3NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF8wZCgpCit7CisgIFRlbnNvcjxpbnQsIDA+IHNjYWxhcjE7CisgIFRlbnNvcjxpbnQsIDAsIFJvd01ham9yPiBzY2FsYXIyOworCisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgaW50LCAwPiA+IHNjYWxhcjMoc2NhbGFyMS5kYXRhKCkpOworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGludCwgMCwgUm93TWFqb3I+ID4gc2NhbGFyNChzY2FsYXIyLmRhdGEoKSk7CisKKyAgc2NhbGFyMSgpID0gNzsKKyAgc2NhbGFyMigpID0gMTM7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjEucmFuaygpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjEuc2l6ZSgpLCAxKTsKKworICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyMygpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjQoKSwgMTMpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0XzFkKCkKK3sKKyAgVGVuc29yPGludCwgMT4gdmVjMSg2KTsKKyAgVGVuc29yPGludCwgMSwgUm93TWFqb3I+IHZlYzIoNik7CisKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDE+ID4gdmVjMyh2ZWMxLmRhdGEoKSwgNik7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgaW50LCAxLCBSb3dNYWpvcj4gPiB2ZWM0KHZlYzIuZGF0YSgpLCA2KTsKKworICB2ZWMxKDApID0gNDsgIHZlYzIoMCkgPSAwOworICB2ZWMxKDEpID0gODsgIHZlYzIoMSkgPSAxOworICB2ZWMxKDIpID0gMTU7IHZlYzIoMikgPSAyOworICB2ZWMxKDMpID0gMTY7IHZlYzIoMykgPSAzOworICB2ZWMxKDQpID0gMjM7IHZlYzIoNCkgPSA0OworICB2ZWMxKDUpID0gNDI7IHZlYzIoNSkgPSA1OworCisgIFZFUklGWV9JU19FUVVBTCh2ZWMxLnJhbmsoKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMxLnNpemUoKSwgNik7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMxLmRpbWVuc2lvbigwKSwgNik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzMoMCksIDQpOworICBWRVJJRllfSVNfRVFVQUwodmVjMygxKSwgOCk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMzKDIpLCAxNSk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMzKDMpLCAxNik7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMzKDQpLCAyMyk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMzKDUpLCA0Mik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzQoMCksIDApOworICBWRVJJRllfSVNfRVFVQUwodmVjNCgxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWM0KDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYzQoMyksIDMpOworICBWRVJJRllfSVNfRVFVQUwodmVjNCg0KSwgNCk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWM0KDUpLCA1KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF8yZCgpCit7CisgIFRlbnNvcjxpbnQsIDI+IG1hdDEoMiwzKTsKKyAgVGVuc29yPGludCwgMiwgUm93TWFqb3I+IG1hdDIoMiwzKTsKKworICBtYXQxKDAsMCkgPSAwOworICBtYXQxKDAsMSkgPSAxOworICBtYXQxKDAsMikgPSAyOworICBtYXQxKDEsMCkgPSAzOworICBtYXQxKDEsMSkgPSA0OworICBtYXQxKDEsMikgPSA1OworCisgIG1hdDIoMCwwKSA9IDA7CisgIG1hdDIoMCwxKSA9IDE7CisgIG1hdDIoMCwyKSA9IDI7CisgIG1hdDIoMSwwKSA9IDM7CisgIG1hdDIoMSwxKSA9IDQ7CisgIG1hdDIoMSwyKSA9IDU7CisKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDI+ID4gbWF0MyhtYXQxLmRhdGEoKSwgMiwgMyk7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgaW50LCAyLCBSb3dNYWpvcj4gPiBtYXQ0KG1hdDIuZGF0YSgpLCAyLCAzKTsKKworICBWRVJJRllfSVNfRVFVQUwobWF0My5yYW5rKCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5zaXplKCksIDYpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMSksIDMpOworCisgIFZFUklGWV9JU19FUVVBTChtYXQ0LnJhbmsoKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0LnNpemUoKSwgNik7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigxKSwgMyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDAsMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygwLDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDEsMSksIDQpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygxLDIpLCA1KTsKKworICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwxKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsMiksIDUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0XzNkKCkKK3sKKyAgVGVuc29yPGludCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKKworICBpbnQgdmFsID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgbWF0MShpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDIoaSxqLGspID0gdmFsOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGludCwgMz4gPiBtYXQzKG1hdDEuZGF0YSgpLCAyLCAzLCA3KTsKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDMsIFJvd01ham9yPiA+IG1hdDQobWF0Mi5kYXRhKCksIDIsIDMsIDcpOworCisgIFZFUklGWV9JU19FUVVBTChtYXQzLnJhbmsoKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzLnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMiksIDcpOworCisgIFZFUklGWV9JU19FUVVBTChtYXQ0LnJhbmsoKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0LnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0NC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0NC5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0NC5kaW1lbnNpb24oMiksIDcpOworCisgIHZhbCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQzKGksaixrKSwgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoaSxqLGspLCB2YWwpOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2Zyb21fdGVuc29yKCkKK3sKKyAgVGVuc29yPGludCwgMz4gbWF0MSgyLDMsNyk7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKKworICBpbnQgdmFsID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgbWF0MShpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDIoaSxqLGspID0gdmFsOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMz4gPiBtYXQzKG1hdDEpOworICBUZW5zb3JNYXA8VGVuc29yPGludCwgMywgUm93TWFqb3I+ID4gbWF0NChtYXQyKTsKKworICBWRVJJRllfSVNfRVFVQUwobWF0My5yYW5rKCksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5zaXplKCksIDIqMyo3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMuZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMuZGltZW5zaW9uKDIpLCA3KTsKKworICBWRVJJRllfSVNfRVFVQUwobWF0NC5yYW5rKCksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0NC5zaXplKCksIDIqMyo3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDIpLCA3KTsKKworICB2YWwgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MyhpLGosayksIHZhbCk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQ0KGksaixrKSwgdmFsKTsKKyAgICAgICAgdmFsKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yRml4ZWRTaXplPGludCwgU2l6ZXM8MiwzLDc+ID4gbWF0NTsKKworICB2YWwgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBhcnJheTxwdHJkaWZmX3QsIDM+IGNvb3JkczsKKyAgICAgICAgY29vcmRzWzBdID0gaTsKKyAgICAgICAgY29vcmRzWzFdID0gajsKKyAgICAgICAgY29vcmRzWzJdID0gazsKKyAgICAgICAgbWF0NShjb29yZHMpID0gdmFsOworICAgICAgICB2YWwrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGludCwgU2l6ZXM8MiwzLDc+ID4gPiBtYXQ2KG1hdDUpOworCisgIFZFUklGWV9JU19FUVVBTChtYXQ2LnJhbmsoKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ2LnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0Ni5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0Ni5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0Ni5kaW1lbnNpb24oMiksIDcpOworCisgIHZhbCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQ2KGksaixrKSwgdmFsKTsKKyAgICAgICAgdmFsKys7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RhdGljIGludCBmKGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8aW50LCAzPiA+JiB0ZW5zb3IpIHsKKyAgLy8gIFNpemU8MD4gZW1wdHk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcnJheV9zaXplPFNpemVzPD4gPjo6dmFsdWUgPT0gMCksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcnJheV9zaXplPERTaXplczxpbnQsIDA+ID46OnZhbHVlID09IDApLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBUZW5zb3I8aW50LCAwPiByZXN1bHQgPSB0ZW5zb3Iuc3VtKCk7CisgIHJldHVybiByZXN1bHQoKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jYXN0aW5nKCkKK3sKKyAgVGVuc29yPGludCwgMz4gdGVuc29yKDIsMyw3KTsKKworICBpbnQgdmFsID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgdGVuc29yKGksaixrKSA9IHZhbDsKKyAgICAgICAgdmFsKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDM+ID4gbWFwKHRlbnNvcik7CisgIGludCBzdW0xID0gZihtYXApOworICBpbnQgc3VtMiA9IGYodGVuc29yKTsKKworICBWRVJJRllfSVNfRVFVQUwoc3VtMSwgc3VtMik7CisgIFZFUklGWV9JU19FUVVBTChzdW0xLCA4NjEpOworfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX21hcCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0XzBkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8xZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMmQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzNkKCkpOworCisgIENBTExfU1VCVEVTVCh0ZXN0X2Zyb21fdGVuc29yKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jYXN0aW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWF0aC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM3NDJhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWF0aC5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF90YW5oKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAxPiB2ZWMxKDYpOworICB2ZWMxLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMT4gdmVjMiA9IHZlYzEudGFuaCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMyKGkpLCB0YW5oZih2ZWMxKGkpKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9zaWdtb2lkKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAxPiB2ZWMxKDYpOworICB2ZWMxLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMT4gdmVjMiA9IHZlYzEuc2lnbW9pZCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMyKGkpLCAxLjBmIC8gKDEuMGYgKyBzdGQ6OmV4cCgtdmVjMShpKSkpKTsKKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfbWF0aCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RhbmgoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpZ21vaWQoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9taXhlZF9pbmRpY2VzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmE2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9taXhlZF9pbmRpY2VzLmNwcApAQCAtMCwwICsxLDUzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCisKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4gdmVjMSg2KTsKKyAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvciwgaW50PiB2ZWMyKDYpOworCisgIHZlYzEoMCkgPSA0LjA7ICB2ZWMyKDApID0gMC4wOworICB2ZWMxKDEpID0gOC4wOyAgdmVjMigxKSA9IDEuMDsKKyAgdmVjMSgyKSA9IDE1LjA7IHZlYzIoMikgPSAyLjA7CisgIHZlYzEoMykgPSAxNi4wOyB2ZWMyKDMpID0gMy4wOworICB2ZWMxKDQpID0gMjMuMDsgdmVjMig0KSA9IDQuMDsKKyAgdmVjMSg1KSA9IDQyLjA7IHZlYzIoNSkgPSA1LjA7CisKKyAgZmxvYXQgZGF0YTNbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPj4gdmVjMyhkYXRhMywgNik7CisgIHZlYzMgPSB2ZWMxLnNxcnQoKTsKKyAgZmxvYXQgZGF0YTRbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yLCBpbnQ+PiB2ZWM0KGRhdGE0LCA2KTsKKyAgdmVjNCA9IHZlYzIuc3F1YXJlKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDApLCBzcXJ0Zig0LjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDEpLCBzcXJ0Zig4LjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDIpLCBzcXJ0ZigxNS4wKSk7CisgIFZFUklGWV9JU19BUFBST1godmVjMygzKSwgc3FydGYoMTYuMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoNCksIHNxcnRmKDIzLjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDUpLCBzcXJ0Zig0Mi4wKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM0KDApLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM0KDEpLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM0KDIpLCAyLjBmICogMi4wZik7CisgIFZFUklGWV9JU19BUFBST1godmVjNCgzKSwgMy4wZiAqIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoNCksIDQuMGYgKiA0LjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZWM0KDUpLCA1LjBmICogNS4wZik7Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9taXhlZF9pbmRpY2VzKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmcuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZGU0MzEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tb3JwaGluZy5jcHAKQEAgLTAsMCArMSw0ODUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lPgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfcmVzaGFwZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNT4gdGVuc29yMSgyLDMsMSw3LDEpOworICB0ZW5zb3IxLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yMigyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yMyg2LDcpOworICBUZW5zb3I8ZmxvYXQsIDI+IHRlbnNvcjQoMiwyMSk7CisKKyAgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9ucyBkaW0xKDIsMyw3KTsKKyAgdGVuc29yMiA9IHRlbnNvcjEucmVzaGFwZShkaW0xKTsKKyAgVGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyBkaW0yKDYsNyk7CisgIHRlbnNvcjMgPSB0ZW5zb3IxLnJlc2hhcGUoZGltMik7CisgIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvbnMgZGltMygyLDIxKTsKKyAgdGVuc29yNCA9IHRlbnNvcjEucmVzaGFwZShkaW0xKS5yZXNoYXBlKGRpbTMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSxqLDAsaywwKSwgdGVuc29yMyhpKzIqaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjQoaSxqKzMqaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3N0YXRpYyB2b2lkIHRlc3RfcmVzaGFwZV9pbl9leHByKCkgeworICBNYXRyaXhYZiBtMSgyLDMqNSo3KjExKTsKKyAgTWF0cml4WGYgbTIoMyo1KjcqMTEsMTMpOworICBtMS5zZXRSYW5kb20oKTsKKyAgbTIuc2V0UmFuZG9tKCk7CisgIE1hdHJpeFhmIG0zID0gbTEgKiBtMjsKKworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA1Pj4gdGVuc29yMShtMS5kYXRhKCksIDIsMyw1LDcsMTEpOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA1Pj4gdGVuc29yMihtMi5kYXRhKCksIDMsNSw3LDExLDEzKTsKKyAgVGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyBuZXdEaW1zMSgyLDMqNSo3KjExKTsKKyAgVGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyBuZXdEaW1zMigzKjUqNyoxMSwxMyk7CisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBhcnJheTxEaW1QYWlyLCAxPiBjb250cmFjdF9hbG9uZ3t7RGltUGFpcigxLCAwKX19OworICBUZW5zb3I8ZmxvYXQsIDI+IHRlbnNvcjMoMiwxMyk7CisgIHRlbnNvcjMgPSB0ZW5zb3IxLnJlc2hhcGUobmV3RGltczEpLmNvbnRyYWN0KHRlbnNvcjIucmVzaGFwZShuZXdEaW1zMiksIGNvbnRyYWN0X2Fsb25nKTsKKworICBNYXA8TWF0cml4WGY+IHJlcyh0ZW5zb3IzLmRhdGEoKSwgMiwgMTMpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTM7ICsraikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMoaSxqKSwgbTMoaSxqKSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lPgorc3RhdGljIHZvaWQgdGVzdF9yZXNoYXBlX2FzX2x2YWx1ZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yKDIsMyw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yMmQoNiw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9ucyBkaW0oMiwzLDcpOworICB0ZW5zb3IyZC5yZXNoYXBlKGRpbSkgPSB0ZW5zb3I7CisKKyAgZmxvYXQgc2NyYXRjaFsyKjMqMSo3KjFdOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA1Pj4gdGVuc29yNWQoc2NyYXRjaCwgMiwzLDEsNywxKTsKKyAgdGVuc29yNWQucmVzaGFwZShkaW0pLmRldmljZShFaWdlbjo6RGVmYXVsdERldmljZSgpKSA9IHRlbnNvcjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMmQoaSsyKmosayksIHRlbnNvcihpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yNWQoaSxqLDAsaywwKSwgdGVuc29yKGksaixrKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2xpY2UoKQoreworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3LDExKTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gc2xpY2UxKDEsMSwxLDEsMSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBpbmRpY2VzKDEsMiwzLDQsNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplcygxLDEsMSwxLDEpOworICBzbGljZTEgPSB0ZW5zb3Iuc2xpY2UoaW5kaWNlcywgc2l6ZXMpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxKDAsMCwwLDAsMCksIHRlbnNvcigxLDIsMyw0LDUpKTsKKworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHNsaWNlMigxLDEsMiwyLDMpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlczIoMSwxLDMsNCw1KTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IHNpemVzMigxLDEsMiwyLDMpOworICBzbGljZTIgPSB0ZW5zb3Iuc2xpY2UoaW5kaWNlczIsIHNpemVzMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIoMCwwLGksaixrKSwgdGVuc29yKDEsMSwzK2ksNCtqLDUraykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT12b2lkPgorc3RhdGljIHZvaWQgdGVzdF9jb25zdF9zbGljZSgpCit7CisgIGNvbnN0IGZsb2F0IGJbMV0gPSB7NDJ9OworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAxPiA+IG0oYiwgMSk7CisgIERTaXplczxEZW5zZUluZGV4LCAxPiBvZmZzZXRzOworICBvZmZzZXRzWzBdID0gMDsKKyAgVGVuc29yUmVmPFRlbnNvcjxjb25zdCBmbG9hdCwgMT4gPiBzbGljZV9yZWYobS5zbGljZShvZmZzZXRzLCBtLmRpbWVuc2lvbnMoKSkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2VfcmVmKDApLCA0Mik7Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zbGljZV9pbl9leHByKCkgeworICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gTXR4OworICBNdHggbTEoNyw3KTsKKyAgTXR4IG0yKDMsMyk7CisgIG0xLnNldFJhbmRvbSgpOworICBtMi5zZXRSYW5kb20oKTsKKworICBNdHggbTMgPSBtMS5ibG9jaygxLCAyLCAzLCAzKSAqIG0yLmJsb2NrKDAsIDIsIDMsIDEpOworCisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+PiB0ZW5zb3IxKG0xLmRhdGEoKSwgNywgNyk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+PiB0ZW5zb3IyKG0yLmRhdGEoKSwgMywgMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdGVuc29yMygzLDEpOworICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKKyAgYXJyYXk8RGltUGFpciwgMT4gY29udHJhY3RfYWxvbmd7e0RpbVBhaXIoMSwgMCl9fTsKKworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gaW5kaWNlczEoMSwyKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDI+IHNpemVzMSgzLDMpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gaW5kaWNlczIoMCwyKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDI+IHNpemVzMigzLDEpOworICB0ZW5zb3IzID0gdGVuc29yMS5zbGljZShpbmRpY2VzMSwgc2l6ZXMxKS5jb250cmFjdCh0ZW5zb3IyLnNsaWNlKGluZGljZXMyLCBzaXplczIpLCBjb250cmFjdF9hbG9uZyk7CisKKyAgTWFwPE10eD4gcmVzKHRlbnNvcjMuZGF0YSgpLCAzLCAxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDE7ICsraikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMoaSxqKSwgbTMoaSxqKSk7CisgICAgfQorICB9CisKKyAgLy8gVGFrZSBhbiBhcmJpdHJhcnkgc2xpY2Ugb2YgYW4gYXJiaXRyYXJpbHkgc2l6ZWQgdGVuc29yLgorICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyLCBEYXRhTGF5b3V0Pj4gdGVuc29yNChtMS5kYXRhKCksIDcsIDcpOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcjYgPSB0ZW5zb3I0LnJlc2hhcGUoRFNpemVzPHB0cmRpZmZfdCwgMT4oNyo3KSkuZXhwKCkuc2xpY2UoRFNpemVzPHB0cmRpZmZfdCwgMT4oMCksIERTaXplczxwdHJkaWZmX3QsIDE+KDM1KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzU7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1godGVuc29yNihpKSwgZXhwZih0ZW5zb3I0LmRhdGEoKVtpXSkpOworICB9Cit9CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zbGljZV9hc19sdmFsdWUoKQoreworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjEoMiwyLDcpOworICB0ZW5zb3IxLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjIoMiwyLDcpOworICB0ZW5zb3IyLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjMoNCwzLDUpOworICB0ZW5zb3IzLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjQoNCwzLDIpOworICB0ZW5zb3I0LnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjUoMTAsMTMsMTIpOworICB0ZW5zb3I1LnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gcmVzdWx0KDQsNSw3KTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzMTIoMiwyLDcpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gZmlyc3Rfc2xpY2UoMCwwLDApOworICByZXN1bHQuc2xpY2UoZmlyc3Rfc2xpY2UsIHNpemVzMTIpID0gdGVuc29yMTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNlY29uZF9zbGljZSgyLDAsMCk7CisgIHJlc3VsdC5zbGljZShzZWNvbmRfc2xpY2UsIHNpemVzMTIpLmRldmljZShFaWdlbjo6RGVmYXVsdERldmljZSgpKSA9IHRlbnNvcjI7CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzMyg0LDMsNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiB0aGlyZF9zbGljZSgwLDIsMCk7CisgIHJlc3VsdC5zbGljZSh0aGlyZF9zbGljZSwgc2l6ZXMzKSA9IHRlbnNvcjM7CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNCg0LDMsMik7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBmb3VydGhfc2xpY2UoMCwyLDUpOworICByZXN1bHQuc2xpY2UoZm91cnRoX3NsaWNlLCBzaXplczQpID0gdGVuc29yNDsKKworICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrKSwgdGVuc29yMShpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGkrMixqLGspLCB0ZW5zb3IyKGksaixrKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDI7IGogPCA1OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGspLCB0ZW5zb3IzKGksai0yLGspKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGsgPSA1OyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGspLCB0ZW5zb3I0KGksai0yLGstNSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzaXplczUoNCw1LDcpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gZmlmdGhfc2xpY2UoMCwwLDApOworICByZXN1bHQuc2xpY2UoZmlmdGhfc2xpY2UsIHNpemVzNSkgPSB0ZW5zb3I1LnNsaWNlKGZpZnRoX3NsaWNlLCBzaXplczUpOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGZvciAoaW50IGogPSAyOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrKSwgdGVuc29yNShpLGosaykpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2xpY2VfcmF3X2RhdGEoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigzLDUsNywxMSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4gb2Zmc2V0cygxLDIsMyw0KTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+IGV4dGVudHMoMSwxLDEsMSk7CisgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSksIERlZmF1bHREZXZpY2U+IFNsaWNlRXZhbHVhdG9yOworICBhdXRvIHNsaWNlMSA9IFNsaWNlRXZhbHVhdG9yKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSwgRGVmYXVsdERldmljZSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxLmRhdGEoKVswXSwgdGVuc29yKDEsMiwzLDQpKTsKKworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMiwxLDEsMSk7CisgICAgYXV0byBzbGljZTIgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDIpOworICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIuZGF0YSgpWzBdLCB0ZW5zb3IoMSwyLDMsNCkpOworICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIuZGF0YSgpWzFdLCB0ZW5zb3IoMiwyLDMsNCkpOworICB9IGVsc2UgeworICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwxLDEsMik7CisgICAgYXV0byBzbGljZTIgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDIpOworICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIuZGF0YSgpWzBdLCB0ZW5zb3IoMSwyLDMsNCkpOworICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIuZGF0YSgpWzFdLCB0ZW5zb3IoMSwyLDMsNSkpOworICB9CisKKyAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigxLDIsMSwxKTsKKyAgYXV0byBzbGljZTMgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CisgIFZFUklGWV9JU19FUVVBTChzbGljZTMuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMy5kYXRhKCksIHN0YXRpY19jYXN0PGZsb2F0Kj4oMCkpOworCisgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CisgICAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigwLDIsMyw0KTsKKyAgICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDMsMiwxLDEpOworICAgIGF1dG8gc2xpY2U0ID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOworICAgIFZFUklGWV9JU19FUVVBTChzbGljZTQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpLCA2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlNC5kYXRhKClbaSszKmpdLCB0ZW5zb3IoaSwyK2osMyw0KSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG9mZnNldHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwyLDMsMCk7CisgICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigxLDEsMiwxMSk7CisgICAgYXV0byBzbGljZTQgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlNC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDIyKTsKKyAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTQuZGF0YSgpW2wrMTEqa10sIHRlbnNvcigxLDIsMytrLGwpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIG9mZnNldHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMCwwLDAsNCk7CisgICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigzLDUsNywyKTsKKyAgICBhdXRvIHNsaWNlNSA9IFNsaWNlRXZhbHVhdG9yKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSwgRGVmYXVsdERldmljZSgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMjEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDI7ICsrbCkgeworICAgICAgICAgICAgaW50IHNsaWNlX2luZGV4ID0gaSArIDMgKiAoaiArIDUgKiAoayArIDcgKiBsKSk7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U1LmRhdGEoKVtzbGljZV9pbmRleF0sIHRlbnNvcihpLGosayxsKzQpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigxLDAsMCwwKTsKKyAgICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDIsNSw3LDExKTsKKyAgICBhdXRvIHNsaWNlNSA9IFNsaWNlRXZhbHVhdG9yKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSwgRGVmYXVsdERldmljZSgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgNzcwKTsKKyAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIGludCBzbGljZV9pbmRleCA9IGwgKyAxMSAqIChrICsgNyAqIChqICsgNSAqIGkpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTUuZGF0YSgpW3NsaWNlX2luZGV4XSwgdGVuc29yKGkrMSxqLGssbCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisKKyAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigwLDAsMCwwKTsKKyAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigzLDUsNywxMSk7CisgIGF1dG8gc2xpY2U2ID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2U2LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMyo1KjcqMTEpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2U2LmRhdGEoKSwgdGVuc29yLmRhdGEoKSk7Cit9CisKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2UoKQoreworICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gVGVuc29yNWY7CisgIHR5cGVkZWYgRWlnZW46OkRTaXplczxFaWdlbjo6RGVuc2VJbmRleCwgNT4gSW5kZXg1OworICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gVGVuc29yMmY7CisgIHR5cGVkZWYgRWlnZW46OkRTaXplczxFaWdlbjo6RGVuc2VJbmRleCwgMj4gSW5kZXgyOworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3LDExKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0ZW5zb3IyKDcsMTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIHRlbnNvcjIuc2V0UmFuZG9tKCk7CisKKyAgaWYgKHRydWUpIHsKKyAgICBUZW5zb3IyZiBzbGljZSgyLDMpOworICAgIEluZGV4MiBzdHJpZGVzKC0yLC0xKTsKKyAgICBJbmRleDIgaW5kaWNlc1N0YXJ0KDUsNyk7CisgICAgSW5kZXgyIGluZGljZXNTdG9wKDAsNCk7CisgICAgc2xpY2UgPSB0ZW5zb3IyLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQsIGluZGljZXNTdG9wLCBzdHJpZGVzKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlKGosayksIHRlbnNvcjIoNS0yKmosNy1rKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYodHJ1ZSkgeworICAgIFRlbnNvcjJmIHNsaWNlKDAsMSk7CisgICAgSW5kZXgyIHN0cmlkZXMoMSwxKTsKKyAgICBJbmRleDIgaW5kaWNlc1N0YXJ0KDUsNCk7CisgICAgSW5kZXgyIGluZGljZXNTdG9wKDUsNSk7CisgICAgc2xpY2UgPSB0ZW5zb3IyLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQsIGluZGljZXNTdG9wLCBzdHJpZGVzKTsKKyAgfQorCisgIGlmKHRydWUpIHsgLy8gdGVzdCBjbGFtcGVkIGRlZ2VuZXJhdGUgaW50ZXJhdmxzCisgICAgVGVuc29yMmYgc2xpY2UoNywxMSk7CisgICAgSW5kZXgyIHN0cmlkZXMoMSwtMSk7CisgICAgSW5kZXgyIGluZGljZXNTdGFydCgtMywyMCk7IC8vIHNob3VsZCBiZWNvbWUgMCwxMAorICAgIEluZGV4MiBpbmRpY2VzU3RvcCgyMCwtMTEpOyAvLyBzaG91bGQgYmVjb21lIDExLCAtMQorICAgIHNsaWNlID0gdGVuc29yMi5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LCBpbmRpY2VzU3RvcCwgc3RyaWRlcyk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA3OyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTE7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoaixrKSwgdGVuc29yMihqLDEwLWspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZih0cnVlKSB7CisgICAgVGVuc29yNWYgc2xpY2UxKDEsMSwxLDEsMSk7CisgICAgRWlnZW46OkRTaXplczxFaWdlbjo6RGVuc2VJbmRleCwgNT4gaW5kaWNlc1N0YXJ0KDEsIDIsIDMsIDQsIDUpOworICAgIEVpZ2VuOjpEU2l6ZXM8RWlnZW46OkRlbnNlSW5kZXgsIDU+IGluZGljZXNTdG9wKDIsIDMsIDQsIDUsIDYpOworICAgIEVpZ2VuOjpEU2l6ZXM8RWlnZW46OkRlbnNlSW5kZXgsIDU+IHN0cmlkZXMoMSwgMSwgMSwgMSwgMSk7CisgICAgc2xpY2UxID0gdGVuc29yLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQsIGluZGljZXNTdG9wLCBzdHJpZGVzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxKDAsMCwwLDAsMCksIHRlbnNvcigxLDIsMyw0LDUpKTsKKyAgfQorCisgIGlmKHRydWUpIHsKKyAgICBUZW5zb3I1ZiBzbGljZSgxLDEsMiwyLDMpOworICAgIEluZGV4NSBzdGFydCgxLCAxLCAzLCA0LCA1KTsKKyAgICBJbmRleDUgc3RvcCgyLCAyLCA1LCA2LCA4KTsKKyAgICBJbmRleDUgc3RyaWRlcygxLCAxLCAxLCAxLCAxKTsKKyAgICBzbGljZSA9IHRlbnNvci5zdHJpZGVkU2xpY2Uoc3RhcnQsIHN0b3AsIHN0cmlkZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZSgwLDAsaSxqLGspLCB0ZW5zb3IoMSwxLDMraSw0K2osNStrKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZih0cnVlKSB7CisgICAgVGVuc29yNWYgc2xpY2UoMSwxLDIsMiwzKTsKKyAgICBJbmRleDUgc3RyaWRlczMoMSwgMSwgLTIsIDEsIC0xKTsKKyAgICBJbmRleDUgaW5kaWNlczNTdGFydCgxLCAxLCA0LCA0LCA3KTsKKyAgICBJbmRleDUgaW5kaWNlczNTdG9wKDIsIDIsIDAsIDYsIDQpOworICAgIHNsaWNlID0gdGVuc29yLnN0cmlkZWRTbGljZShpbmRpY2VzM1N0YXJ0LCBpbmRpY2VzM1N0b3AsIHN0cmlkZXMzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoMCwwLGksaixrKSwgdGVuc29yKDEsMSw0LTIqaSw0K2osNy1rKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihmYWxzZSkgeyAvLyB0ZXN0cyBkZWdlbmVyYXRlIGludGVydmFsCisgICAgVGVuc29yNWYgc2xpY2UoMSwxLDIsMiwzKTsKKyAgICBJbmRleDUgc3RyaWRlczMoMSwgMSwgMiwgMSwgMSk7CisgICAgSW5kZXg1IGluZGljZXMzU3RhcnQoMSwgMSwgNCwgNCwgNyk7CisgICAgSW5kZXg1IGluZGljZXMzU3RvcCgyLCAyLCAwLCA2LCA0KTsKKyAgICBzbGljZSA9IHRlbnNvci5zdHJpZGVkU2xpY2UoaW5kaWNlczNTdGFydCwgaW5kaWNlczNTdG9wLCBzdHJpZGVzMyk7CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2Vfd3JpdGUoKQoreworICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gVGVuc29yMmY7CisgIHR5cGVkZWYgRWlnZW46OkRTaXplczxFaWdlbjo6RGVuc2VJbmRleCwgMj4gSW5kZXgyOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdGVuc29yKDcsMTEpLHRlbnNvcjIoNywxMSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgdGVuc29yMj10ZW5zb3I7CisgIFRlbnNvcjJmIHNsaWNlKDIsMyk7CisKKyAgc2xpY2Uuc2V0UmFuZG9tKCk7CisKKyAgSW5kZXgyIHN0cmlkZXMoMSwxKTsKKyAgSW5kZXgyIGluZGljZXNTdGFydCgzLDQpOworICBJbmRleDIgaW5kaWNlc1N0b3AoNSw3KTsKKyAgSW5kZXgyIGxlbmd0aHMoMiwzKTsKKworICB0ZW5zb3Iuc2xpY2UoaW5kaWNlc1N0YXJ0LGxlbmd0aHMpPXNsaWNlOworICB0ZW5zb3IyLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQsaW5kaWNlc1N0b3Asc3RyaWRlcyk9c2xpY2U7CisKKyAgZm9yKGludCBpPTA7aTw3O2krKykgZm9yKGludCBqPTA7ajwxMTtqKyspeworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqKSwgdGVuc29yMihpLGopKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9jb21wb3NpdGlvbigpCit7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdHJpeCg3LCAxMSk7CisgIG1hdHJpeC5zZXRSYW5kb20oKTsKKworICBjb25zdCBEU2l6ZXM8cHRyZGlmZl90LCAzPiBuZXdEaW1zKDEsIDEsIDExKTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yID0KKyAgICAgIG1hdHJpeC5zbGljZShEU2l6ZXM8cHRyZGlmZl90LCAyPigyLCAwKSwgRFNpemVzPHB0cmRpZmZfdCwgMj4oMSwgMTEpKS5yZXNoYXBlKG5ld0RpbXMpOworCisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpLCAxMSk7CisgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDApLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigyKSwgMTEpOworICBmb3IgKGludCBpID0gMDsgaSA8IDExOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDAsMCxpKSwgbWF0cml4KDIsaSkpOworICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9tb3JwaGluZygpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3Rfc2ltcGxlX3Jlc2hhcGU8dm9pZD4oKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfcmVzaGFwZV9pbl9leHByPHZvaWQ+KCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3Jlc2hhcGVfYXNfbHZhbHVlPHZvaWQ+KCkpOworCisgIENBTExfU1VCVEVTVF8xKHRlc3Rfc2ltcGxlX3NsaWNlPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9zaW1wbGVfc2xpY2U8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2NvbnN0X3NsaWNlKCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X3NsaWNlX2luX2V4cHI8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X3NsaWNlX2luX2V4cHI8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3NsaWNlX2FzX2x2YWx1ZTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3Rfc2xpY2VfYXNfbHZhbHVlPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9zbGljZV9yYXdfZGF0YTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF81KHRlc3Rfc2xpY2VfcmF3X2RhdGE8Um93TWFqb3I+KCkpOworCisgIENBTExfU1VCVEVTVF82KHRlc3Rfc3RyaWRlZF9zbGljZV93cml0ZTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3Rfc3RyaWRlZF9zbGljZTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3Rfc3RyaWRlZF9zbGljZV93cml0ZTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3Rfc3RyaWRlZF9zbGljZTxSb3dNYWpvcj4oKSk7CisKKyAgQ0FMTF9TVUJURVNUXzcodGVzdF9jb21wb3NpdGlvbjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF83KHRlc3RfY29tcG9zaXRpb248Um93TWFqb3I+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfbm90aWZpY2F0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX25vdGlmaWNhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NjAwNwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX25vdGlmaWNhdGlvbi5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVmlqYXkgVmFzdWRldmFuIDx2cnZAZ29vZ2xlLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKKyNpZiBFSUdFTl9PU19XSU4gfHwgRUlHRU5fT1NfV0lONjQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit2b2lkIHNsZWVwKGludCBzZWNvbmRzKSB7CisgIFNsZWVwKHNlY29uZHMqMTAwMCk7Cit9CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKworbmFtZXNwYWNlIHsKKwordm9pZCBXYWl0QW5kQWRkKEVpZ2VuOjpOb3RpZmljYXRpb24qIG4sIGludCogY291bnRlcikgeworICBuLT5XYWl0KCk7CisgICpjb3VudGVyID0gKmNvdW50ZXIgKyAxOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdGljIHZvaWQgdGVzdF9ub3RpZmljYXRpb25fc2luZ2xlKCkKK3sKKyAgVGhyZWFkUG9vbCB0aHJlYWRfcG9vbCgxKTsKKworICBpbnQgY291bnRlciA9IDA7CisgIEVpZ2VuOjpOb3RpZmljYXRpb24gbjsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMgPSBzdGQ6OmJpbmQoJldhaXRBbmRBZGQsICZuLCAmY291bnRlcik7CisgIHRocmVhZF9wb29sLlNjaGVkdWxlKGZ1bmMpOworICBzbGVlcCgxKTsKKworICAvLyBUaGUgdGhyZWFkIHNob3VsZCBiZSB3YWl0aW5nIGZvciB0aGUgbm90aWZpY2F0aW9uLgorICBWRVJJRllfSVNfRVFVQUwoY291bnRlciwgMCk7CisKKyAgLy8gVW5ibG9jayB0aGUgdGhyZWFkCisgIG4uTm90aWZ5KCk7CisKKyAgc2xlZXAoMSk7CisKKyAgLy8gVmVyaWZ5IHRoZSBjb3VudGVyIGhhcyBiZWVuIGluY3JlbWVudGVkCisgIFZFUklGWV9JU19FUVVBTChjb3VudGVyLCAxKTsKK30KKworLy8gTGlrZSB0ZXN0X25vdGlmaWNhdGlvbl9zaW5nbGUoKSBidXQgZW5xdWV1ZXMgbXVsdGlwbGUgdGhyZWFkcyB0bworLy8gdmFsaWRhdGUgdGhhdCBhbGwgdGhyZWFkcyBnZXQgbm90aWZpZWQgYnkgTm90aWZ5KCkuCitzdGF0aWMgdm9pZCB0ZXN0X25vdGlmaWNhdGlvbl9tdWx0aXBsZSgpCit7CisgIFRocmVhZFBvb2wgdGhyZWFkX3Bvb2woMSk7CisKKyAgaW50IGNvdW50ZXIgPSAwOworICBFaWdlbjo6Tm90aWZpY2F0aW9uIG47CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jID0gc3RkOjpiaW5kKCZXYWl0QW5kQWRkLCAmbiwgJmNvdW50ZXIpOworICB0aHJlYWRfcG9vbC5TY2hlZHVsZShmdW5jKTsKKyAgdGhyZWFkX3Bvb2wuU2NoZWR1bGUoZnVuYyk7CisgIHRocmVhZF9wb29sLlNjaGVkdWxlKGZ1bmMpOworICB0aHJlYWRfcG9vbC5TY2hlZHVsZShmdW5jKTsKKyAgc2xlZXAoMSk7CisgIFZFUklGWV9JU19FUVVBTChjb3VudGVyLCAwKTsKKyAgbi5Ob3RpZnkoKTsKKyAgc2xlZXAoMSk7CisgIFZFUklGWV9JU19FUVVBTChjb3VudGVyLCA0KTsKK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9ub3RpZmljYXRpb24oKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9ub3RpZmljYXRpb25fc2luZ2xlKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9ub3RpZmljYXRpb25fbXVsdGlwbGUoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb21wbGV4LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2NvbXBsZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDFiMmQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb21wbGV4LmNwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CisKKworCitzdGF0aWMgdm9pZCB0ZXN0X2FkZGl0aW9ucygpCit7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDE+IGRhdGEyKDMpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGRhdGExKGkpID0gc3RkOjpjb21wbGV4PGZsb2F0PihpLCAtaSk7CisgICAgZGF0YTIoaSkgPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KGksIDcgKiBpKTsKKyAgfQorCisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBzdW0gPSBkYXRhMSArIGRhdGEyOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChzdW0oaSksICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDIqaSwgNippKSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2FicygpCit7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxPiBkYXRhMigzKTsKKyAgZGF0YTEuc2V0UmFuZG9tKCk7CisgIGRhdGEyLnNldFJhbmRvbSgpOworCisgIFRlbnNvcjxmbG9hdCwgMT4gYWJzMSA9IGRhdGExLmFicygpOworICBUZW5zb3I8ZG91YmxlLCAxPiBhYnMyID0gZGF0YTIuYWJzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhYnMxKGkpLCBzdGQ6OmFicyhkYXRhMShpKSkpOworICAgIFZFUklGWV9JU19BUFBST1goYWJzMihpKSwgc3RkOjphYnMoZGF0YTIoaSkpKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfY29uanVnYXRlKCkKK3sKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDE+IGRhdGExKDMpOworICBUZW5zb3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDE+IGRhdGEyKDMpOworICBUZW5zb3I8aW50LCAxPiBkYXRhMygzKTsKKyAgZGF0YTEuc2V0UmFuZG9tKCk7CisgIGRhdGEyLnNldFJhbmRvbSgpOworICBkYXRhMy5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMT4gY29uajEgPSBkYXRhMS5jb25qdWdhdGUoKTsKKyAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxPiBjb25qMiA9IGRhdGEyLmNvbmp1Z2F0ZSgpOworICBUZW5zb3I8aW50LCAxPiBjb25qMyA9IGRhdGEzLmNvbmp1Z2F0ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1goY29uajEoaSksIHN0ZDo6Y29uaihkYXRhMShpKSkpOworICAgIFZFUklGWV9JU19BUFBST1goY29uajIoaSksIHN0ZDo6Y29uaihkYXRhMihpKSkpOworICAgIFZFUklGWV9JU19BUFBST1goY29uajMoaSksIGRhdGEzKGkpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NvbnRyYWN0aW9ucygpCit7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCA0PiB0X2xlZnQoMzAsIDUwLCA4LCAzMSk7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCA1PiB0X3JpZ2h0KDgsIDMxLCA3LCAyMCwgMTApOworICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgNT4gdF9yZXN1bHQoMzAsIDUwLCA3LCAyMCwgMTApOworCisgIHRfbGVmdC5zZXRSYW5kb20oKTsKKyAgdF9yaWdodC5zZXRSYW5kb20oKTsKKworICB0eXBlZGVmIE1hcDxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgRHluYW1pYywgRHluYW1pYz4+IE1hcFhjZjsKKyAgTWFwWGNmIG1fbGVmdCh0X2xlZnQuZGF0YSgpLCAxNTAwLCAyNDgpOworICBNYXBYY2YgbV9yaWdodCh0X3JpZ2h0LmRhdGEoKSwgMjQ4LCAxNDAwKTsKKyAgTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIER5bmFtaWMsIER5bmFtaWM+IG1fcmVzdWx0KDE1MDAsIDE0MDApOworCisgIC8vIFRoaXMgY29udHJhY3Rpb24gc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYSByZWd1bGFyIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgorICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXM7CisgIGRpbXNbMF0gPSBEaW1QYWlyKDIsIDApOworICBkaW1zWzFdID0gRGltUGFpcigzLCAxKTsKKyAgdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisgIG1fcmVzdWx0ID0gbV9sZWZ0ICogbV9yaWdodDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0X3Jlc3VsdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCk7IGkrKykgeworICAgIFZFUklGWV9JU19BUFBST1godF9yZXN1bHQuZGF0YSgpW2ldLCBtX3Jlc3VsdC5kYXRhKClbaV0pOworICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9vZl9jb21wbGV4KCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfYWRkaXRpb25zKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hYnMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2Nvbmp1Z2F0ZSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfY29udHJhY3Rpb25zKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfY29uc3RfdmFsdWVzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2NvbnN0X3ZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3OWEwYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2NvbnN0X3ZhbHVlcy5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6Um93TWFqb3I7CisKK3N0YXRpYyB2b2lkIHRlc3RfYXNzaWduKCkKK3sKKyAgZmxvYXQgZGF0YTFbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDI+PiBtYXQxKGRhdGExLCAyLCAzKTsKKyAgZmxvYXQgZGF0YTJbNl07CisgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+PiBtYXQyKGRhdGEyLCAyLCAzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIGRhdGExW2ldID0gaTsKKyAgICBkYXRhMltpXSA9IC1pOworICB9CisKKyAgVGVuc29yPGZsb2F0LCAyPiByc2x0MTsKKyAgcnNsdDEgPSBtYXQxOworICBUZW5zb3I8ZmxvYXQsIDI+IHJzbHQyOworICByc2x0MiA9IG1hdDI7CisKKyAgVGVuc29yPGZsb2F0LCAyPiByc2x0MyA9IG1hdDE7CisgIFRlbnNvcjxmbG9hdCwgMj4gcnNsdDQgPSBtYXQyOworCisgIFRlbnNvcjxmbG9hdCwgMj4gcnNsdDUobWF0MSk7CisgIFRlbnNvcjxmbG9hdCwgMj4gcnNsdDYobWF0Mik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0MShpLGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oaSArIDIqaikpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0MihpLGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oLWkgLSAyKmopKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDMoaSxqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGkgKyAyKmopKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDQoaSxqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KC1pIC0gMipqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQ1KGksaiksIHN0YXRpY19jYXN0PGZsb2F0PihpICsgMipqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQ2KGksaiksIHN0YXRpY19jYXN0PGZsb2F0PigtaSAtIDIqaikpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfcGx1cygpCit7CisgIGZsb2F0IGRhdGExWzZdOworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyPj4gbWF0MShkYXRhMSwgMiwgMyk7CisgIGZsb2F0IGRhdGEyWzZdOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAyPj4gbWF0MihkYXRhMiwgMiwgMyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICBkYXRhMVtpXSA9IGk7CisgICAgZGF0YTJbaV0gPSAtaTsKKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgMj4gc3VtMTsKKyAgc3VtMSA9IG1hdDEgKyBtYXQyOworICBUZW5zb3I8ZmxvYXQsIDI+IHN1bTI7CisgIHN1bTIgPSBtYXQyICsgbWF0MTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHN1bTEoaSxqKSwgMC4wZik7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHN1bTIoaSxqKSwgMC4wZik7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9wbHVzX2VxdWFsKCkKK3sKKyAgZmxvYXQgZGF0YTFbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDI+PiBtYXQxKGRhdGExLCAyLCAzKTsKKyAgZmxvYXQgZGF0YTJbNl07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+PiBtYXQyKGRhdGEyLCAyLCAzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIGRhdGExW2ldID0gaTsKKyAgICBkYXRhMltpXSA9IC1pOworICB9CisgIG1hdDIgKz0gbWF0MTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDIoaSxqKSwgMC4wZik7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9vZl9jb25zdF92YWx1ZXMoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9hc3NpZ24oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3BsdXMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3BsdXNfZXF1YWwoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9mbG9hdDE2X2N1ZGEuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9mbG9hdDE2X2N1ZGEuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4Njk4MAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2Zsb2F0MTZfY3VkYS5jdQpAQCAtMCwwICsxLDQ5NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9jdWRhCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGU8dHlwZW5hbWU+Cit2b2lkIHRlc3RfY3VkYV9udW1leHQoKSB7CisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworICBpbnQgbnVtX2VsZW0gPSAxMDE7CisKKyAgZmxvYXQqIGRfZmxvYXQgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgYm9vbCogZF9yZXNfaGFsZiA9IChib29sKilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGJvb2wpKTsKKyAgYm9vbCogZF9yZXNfZmxvYXQgPSAoYm9vbCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihib29sKSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKKyAgICAgIGRfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGJvb2wsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAorICAgICAgZF9yZXNfaGFsZiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8Ym9vbCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAorICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKworICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpIC0gZ3B1X2Zsb2F0LmNvbnN0YW50KDAuNWYpOworICBncHVfcmVzX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC51bmFyeUV4cHIoRWlnZW46OmludGVybmFsOjpzY2FsYXJfaXNuYW5fb3A8ZmxvYXQ+KCkpOworICBncHVfcmVzX2hhbGYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmhhbGY+KCkudW5hcnlFeHByKEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lzbmFuX29wPEVpZ2VuOjpoYWxmPigpKTsKKworICBUZW5zb3I8Ym9vbCwgMT4gaGFsZl9wcmVjKG51bV9lbGVtKTsKKyAgVGVuc29yPGJvb2wsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihib29sKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoYm9vbCkpOworICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBudW1leHQgIiA8PCBpIDw8IHN0ZDo6ZW5kbDsKKyAgICBWRVJJRllfSVNfRVFVQUwoZnVsbF9wcmVjKGkpLCBoYWxmX3ByZWMoaSkpOworICB9CisKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfaGFsZik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7Cit9CisKKworI2lmZGVmIEVJR0VOX0hBU19DVURBX0ZQMTYKKwordGVtcGxhdGU8dHlwZW5hbWU+Cit2b2lkIHRlc3RfY3VkYV9jb252ZXJzaW9uKCkgeworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKyAgaW50IG51bV9lbGVtID0gMTAxOworICAKKyAgZmxvYXQqIGRfZmxvYXQgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgRWlnZW46OmhhbGYqIGRfaGFsZiA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBmbG9hdCogZF9jb252ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKKyAgICAgIGRfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9oYWxmKAorICAgICAgZF9oYWxmLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfY29udigKKyAgICAgIGRfY29udiwgbnVtX2VsZW0pOworCisgIGdwdV9mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCk7CisgIGdwdV9oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpOworICBncHVfY29udi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaGFsZi5jYXN0PGZsb2F0PigpOworCisgIFRlbnNvcjxmbG9hdCwgMT4gaW5pdGlhbChudW1fZWxlbSk7CisgIFRlbnNvcjxmbG9hdCwgMT4gZmluYWwobnVtX2VsZW0pOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbml0aWFsLmRhdGEoKSwgZF9mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGluaXRpYWwoaSksIGZpbmFsKGkpKTsKKyAgfQorCisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0KTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfaGFsZik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2NvbnYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgdGVzdF9jdWRhX3VuYXJ5KCkgeworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKyAgaW50IG51bV9lbGVtID0gMTAxOworCisgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX3Jlc19oYWxmID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX3Jlc19mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCisgICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoCisgICAgICBkX3Jlc19oYWxmLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAorICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKworICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpIC0gZ3B1X2Zsb2F0LmNvbnN0YW50KDAuNWYpOworICBncHVfcmVzX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5hYnMoKTsKKyAgZ3B1X3Jlc19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpLmFicygpLmNhc3Q8ZmxvYXQ+KCk7CisKKyAgVGVuc29yPGZsb2F0LCAxPiBoYWxmX3ByZWMobnVtX2VsZW0pOworICBUZW5zb3I8ZmxvYXQsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKKyAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIHVuYXJ5ICIgPDwgaSA8PCBzdGQ6OmVuZGw7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMoaSksIGhhbGZfcHJlYyhpKSk7CisgIH0KKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9mbG9hdCk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19oYWxmKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWU+Cit2b2lkIHRlc3RfY3VkYV9lbGVtZW50d2lzZSgpIHsKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisgIGludCBudW1fZWxlbSA9IDEwMTsKKworICBmbG9hdCogZF9mbG9hdDEgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZmxvYXQqIGRfZmxvYXQyID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX3Jlc19oYWxmID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX3Jlc19mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQxKAorICAgICAgZF9mbG9hdDEsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDIoCisgICAgICBkX2Zsb2F0MiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAorICAgICAgZF9yZXNfaGFsZiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKKyAgICAgIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CisKKyAgZ3B1X2Zsb2F0MS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLnJhbmRvbSgpOworICBncHVfZmxvYXQyLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIucmFuZG9tKCk7CisgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gKGdwdV9mbG9hdDEgKyBncHVfZmxvYXQyKSAqIGdwdV9mbG9hdDE7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSAoKGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKSArIGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6aGFsZj4oKSkgKiBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCkpLmNhc3Q8ZmxvYXQ+KCk7CisKKyAgVGVuc29yPGZsb2F0LCAxPiBoYWxmX3ByZWMobnVtX2VsZW0pOworICBUZW5zb3I8ZmxvYXQsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKKyAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlICIgPDwgaSA8PCAiOiBmdWxsIHByZWMgPSAiIDw8IGZ1bGxfcHJlYyhpKSA8PCAiIHZzIGhhbGYgcHJlYyA9ICIgPDwgaGFsZl9wcmVjKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PEVpZ2VuOjpoYWxmPihmdWxsX3ByZWMoaSkpLCBzdGF0aWNfY2FzdDxFaWdlbjo6aGFsZj4oaGFsZl9wcmVjKGkpKSk7CisgIH0KKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9mbG9hdDEpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9mbG9hdDIpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfaGFsZik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lPgordm9pZCB0ZXN0X2N1ZGFfdHJhbmNlbmRlbnRhbCgpIHsKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisgIGludCBudW1fZWxlbSA9IDEwMTsKKworICBmbG9hdCogZF9mbG9hdDEgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZmxvYXQqIGRfZmxvYXQyID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX2Zsb2F0MyA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBFaWdlbjo6aGFsZiogZF9yZXMxX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzMV9mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBFaWdlbjo6aGFsZiogZF9yZXMyX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzMl9mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBFaWdlbjo6aGFsZiogZF9yZXMzX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzM19mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQxKGRfZmxvYXQxLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQyKGRfZmxvYXQyLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQzKGRfZmxvYXQzLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzMV9oYWxmKGRfcmVzMV9oYWxmLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzMV9mbG9hdChkX3JlczFfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXMyX2hhbGYoZF9yZXMyX2hhbGYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXMyX2Zsb2F0KGRfcmVzMl9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3JlczNfaGFsZihkX3JlczNfaGFsZiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3JlczNfZmxvYXQoZF9yZXMzX2Zsb2F0LCBudW1fZWxlbSk7CisKKyAgZ3B1X2Zsb2F0MS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLnJhbmRvbSgpIC0gZ3B1X2Zsb2F0MS5jb25zdGFudCgwLjVmKTsKKyAgZ3B1X2Zsb2F0Mi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQyLnJhbmRvbSgpICsgZ3B1X2Zsb2F0MS5jb25zdGFudCgwLjVmKTsKKyAgZ3B1X2Zsb2F0My5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQzLnJhbmRvbSgpOworICBncHVfcmVzMV9mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLmV4cCgpLmNhc3Q8RWlnZW46OmhhbGY+KCk7CisgIGdwdV9yZXMyX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIubG9nKCkuY2FzdDxFaWdlbjo6aGFsZj4oKTsKKyAgZ3B1X3JlczNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0My5sb2cxcCgpLmNhc3Q8RWlnZW46OmhhbGY+KCk7CisKKyAgZ3B1X3JlczFfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCk7CisgIGdwdV9yZXMxX2hhbGYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3JlczFfaGFsZi5leHAoKTsKKworICBncHVfcmVzMl9oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6aGFsZj4oKTsKKyAgZ3B1X3JlczJfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfcmVzMl9oYWxmLmxvZygpOworCisgIGdwdV9yZXMzX2hhbGYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0My5jYXN0PEVpZ2VuOjpoYWxmPigpOworICBncHVfcmVzM19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9yZXMzX2hhbGYubG9nMXAoKTsKKworICBUZW5zb3I8ZmxvYXQsIDE+IGlucHV0MShudW1fZWxlbSk7CisgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gaGFsZl9wcmVjMShudW1fZWxlbSk7CisgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gZnVsbF9wcmVjMShudW1fZWxlbSk7CisgIFRlbnNvcjxmbG9hdCwgMT4gaW5wdXQyKG51bV9lbGVtKTsKKyAgVGVuc29yPEVpZ2VuOjpoYWxmLCAxPiBoYWxmX3ByZWMyKG51bV9lbGVtKTsKKyAgVGVuc29yPEVpZ2VuOjpoYWxmLCAxPiBmdWxsX3ByZWMyKG51bV9lbGVtKTsKKyAgVGVuc29yPGZsb2F0LCAxPiBpbnB1dDMobnVtX2VsZW0pOworICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGhhbGZfcHJlYzMobnVtX2VsZW0pOworICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGZ1bGxfcHJlYzMobnVtX2VsZW0pOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDEuZGF0YSgpLCBkX2Zsb2F0MSwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0Mi5kYXRhKCksIGRfZmxvYXQyLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQzLmRhdGEoKSwgZF9mbG9hdDMsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMxLmRhdGEoKSwgZF9yZXMxX2hhbGYsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMxLmRhdGEoKSwgZF9yZXMxX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzMl9oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjMi5kYXRhKCksIGRfcmVzMl9mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzMuZGF0YSgpLCBkX3JlczNfaGFsZiwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzMuZGF0YSgpLCBkX3JlczNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBlbGVtd2lzZSBleHAgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MShpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzEoaSkgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMxKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzEoaSksIGhhbGZfcHJlYzEoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgeworICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgbG9nICIgPDwgaSA8PCAiIGlucHV0ID0gIiA8PCBpbnB1dDIoaSkgPDwgIiBmdWxsID0gIiA8PCBmdWxsX3ByZWMyKGkpIDw8ICIgaGFsZiA9ICIgPDwgaGFsZl9wcmVjMihpKSA8PCBzdGQ6OmVuZGw7CisgICAgaWYoc3RkOjphYnMoaW5wdXQyKGkpLTEuZik8MC4wNWYpIC8vIGxvZyBsYWNrcyBhY2N1cmFyeSBuZWFyYnkgMQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMyKGkpK0VpZ2VuOjpoYWxmKDAuMWYpLCBoYWxmX3ByZWMyKGkpK0VpZ2VuOjpoYWxmKDAuMWYpKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzIoaSksIGhhbGZfcHJlYzIoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgeworICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgcGxvZzEgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MyhpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzMoaSkgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMzKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzMoaSksIGhhbGZfcHJlYzMoaSkpOworICB9CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0MSk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0Mik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0Myk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3JlczFfaGFsZik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3JlczFfZmxvYXQpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXMyX2hhbGYpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXMyX2Zsb2F0KTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzM19mbG9hdCk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3JlczNfaGFsZik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lPgordm9pZCB0ZXN0X2N1ZGFfY29udHJhY3Rpb25zKCkgeworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKyAgaW50IHJvd3MgPSAyMzsKKyAgaW50IGNvbHMgPSAyMzsKKyAgaW50IG51bV9lbGVtID0gcm93cypjb2xzOworCisgIGZsb2F0KiBkX2Zsb2F0MSA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBmbG9hdCogZF9mbG9hdDIgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzX2Zsb2F0ID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoCisgICAgICBkX2Zsb2F0MSwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQyKAorICAgICAgZF9mbG9hdDIsIHJvd3MsIGNvbHMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAorICAgICAgZF9yZXNfaGFsZiwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAorICAgICAgZF9yZXNfZmxvYXQsIHJvd3MsIGNvbHMpOworCisgIGdwdV9mbG9hdDEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5yYW5kb20oKSAtIGdwdV9mbG9hdDEuY29uc3RhbnQoMC41Zik7CisgIGdwdV9mbG9hdDIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0Mi5yYW5kb20oKSAtIGdwdV9mbG9hdDIuY29uc3RhbnQoMC41Zik7CisKKyAgdHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDI+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zKERpbVBhaXIoMSwgMCkpOworICBncHVfcmVzX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEuY29udHJhY3QoZ3B1X2Zsb2F0MiwgZGltcykuY2FzdDxFaWdlbjo6aGFsZj4oKTsKKyAgZ3B1X3Jlc19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKS5jb250cmFjdChncHVfZmxvYXQyLmNhc3Q8RWlnZW46OmhhbGY+KCksIGRpbXMpOworCisgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMj4gaGFsZl9wcmVjKHJvd3MsIGNvbHMpOworICBUZW5zb3I8RWlnZW46OmhhbGYsIDI+IGZ1bGxfcHJlYyhyb3dzLCBjb2xzKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZiwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyArK2opIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgY29udHJhY3QgIiA8PCBpIDw8ICIgIiA8PCBqIDw8IGZ1bGxfcHJlYyhpLCBqKSA8PCAiICIgPDwgaGFsZl9wcmVjKGksIGopIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGlmIChudW1leHQ6OmFicyhmdWxsX3ByZWMoaSwgaikgLSBoYWxmX3ByZWMoaSwgaikpID4gRWlnZW46OmhhbGYoMWUtMmYpKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjKGksIGopLCBoYWxmX3ByZWMoaSwgaikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0MSk7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX2Zsb2F0Mik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19oYWxmKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWU+Cit2b2lkIHRlc3RfY3VkYV9yZWR1Y3Rpb25zKGludCBzaXplMSwgaW50IHNpemUyLCBpbnQgcmVkdXgpIHsKKworICAgc3RkOjpjb3V0IDw8ICJSZWR1Y2luZyAiIDw8IHNpemUxIDw8ICIgYnkgIiA8PCBzaXplMgorICAgICAgICAgICAgIDw8ICIgdGVuc29yIGFsb25nIGRpbSAiIDw8IHJlZHV4IDw8IHN0ZDo6ZW5kbDsgCisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisgIGludCBudW1fZWxlbSA9IHNpemUxKnNpemUyOworICBpbnQgcmVzdWx0X3NpemUgPSAocmVkdXggPT0gMSA/IHNpemUxIDogc2l6ZTIpOworCisgIGZsb2F0KiBkX2Zsb2F0MSA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBmbG9hdCogZF9mbG9hdDIgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X3NpemUgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzX2Zsb2F0ID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdF9zaXplICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoCisgICAgICBkX2Zsb2F0MSwgc2l6ZTEsIHNpemUyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDIoCisgICAgICBkX2Zsb2F0Miwgc2l6ZTEsIHNpemUyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZigKKyAgICAgIGRfcmVzX2hhbGYsIHJlc3VsdF9zaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCisgICAgICBkX3Jlc19mbG9hdCwgcmVzdWx0X3NpemUpOworCisgIGdwdV9mbG9hdDEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5yYW5kb20oKSAqIDIuMGY7CisgIGdwdV9mbG9hdDIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0Mi5yYW5kb20oKSAqIDIuMGY7CisKKyAgRWlnZW46OmFycmF5PGludCwgMT4gcmVkdXhfZGltID0ge3tyZWR1eH19OworICBncHVfcmVzX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEuc3VtKHJlZHV4X2RpbSkuY2FzdDxFaWdlbjo6aGFsZj4oKTsKKyAgZ3B1X3Jlc19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKS5zdW0ocmVkdXhfZGltKTsKKworICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGhhbGZfcHJlYyhyZXN1bHRfc2l6ZSk7CisgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gZnVsbF9wcmVjKHJlc3VsdF9zaXplKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZiwgcmVzdWx0X3NpemUqc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSpzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0X3NpemU7ICsraSkgeworICAgIHN0ZDo6Y291dCA8PCAiRVhQRUNURUQgIiA8PCBmdWxsX3ByZWMoaSkgPDwgIiBHT1QgIiA8PCBoYWxmX3ByZWMoaSkgPDwgc3RkOjplbmRsOworICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjKGkpLCBoYWxmX3ByZWMoaSkpOworICB9CisKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQxKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQyKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2hhbGYpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgdGVzdF9jdWRhX3JlZHVjdGlvbnMoKSB7CisgIHRlc3RfY3VkYV9yZWR1Y3Rpb25zPHZvaWQ+KDEzLCAxMywgMCk7CisgIHRlc3RfY3VkYV9yZWR1Y3Rpb25zPHZvaWQ+KDEzLCAxMywgMSk7CisKKyAgdGVzdF9jdWRhX3JlZHVjdGlvbnM8dm9pZD4oMzUsIDM2LCAwKTsKKyAgdGVzdF9jdWRhX3JlZHVjdGlvbnM8dm9pZD4oMzUsIDM2LCAxKTsKKworICB0ZXN0X2N1ZGFfcmVkdWN0aW9uczx2b2lkPigzNiwgMzUsIDApOworICB0ZXN0X2N1ZGFfcmVkdWN0aW9uczx2b2lkPigzNiwgMzUsIDEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgdGVzdF9jdWRhX2Z1bGxfcmVkdWN0aW9ucygpIHsKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisgIGludCBzaXplID0gMTM7CisgIGludCBudW1fZWxlbSA9IHNpemUqc2l6ZTsKKworICBmbG9hdCogZF9mbG9hdDEgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZmxvYXQqIGRfZmxvYXQyID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIEVpZ2VuOjpoYWxmKiBkX3Jlc19oYWxmID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKDEgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgRWlnZW46OmhhbGYqIGRfcmVzX2Zsb2F0ID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKDEgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MSgKKyAgICAgIGRfZmxvYXQxLCBzaXplLCBzaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDIoCisgICAgICBkX2Zsb2F0Miwgc2l6ZSwgc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoCisgICAgICBkX3Jlc19oYWxmKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAwPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCisgICAgICBkX3Jlc19mbG9hdCk7CisKKyAgZ3B1X2Zsb2F0MS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLnJhbmRvbSgpOworICBncHVfZmxvYXQyLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIucmFuZG9tKCk7CisKKyAgZ3B1X3Jlc19mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLnN1bSgpLmNhc3Q8RWlnZW46OmhhbGY+KCk7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCkuc3VtKCk7CisKKyAgVGVuc29yPEVpZ2VuOjpoYWxmLCAwPiBoYWxmX3ByZWM7CisgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMD4gZnVsbF9wcmVjOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMoKSwgaGFsZl9wcmVjKCkpOworCisgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5tYXhpbXVtKCkuY2FzdDxFaWdlbjo6aGFsZj4oKTsKKyAgZ3B1X3Jlc19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKS5tYXhpbXVtKCk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYygpLCBoYWxmX3ByZWMoKSk7CisKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQxKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQyKTsKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2hhbGYpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3ZvaWQgdGVzdF9jdWRhX2ZvcmNlZF9ldmFscygpIHsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKyAgaW50IG51bV9lbGVtID0gMTAxOworCisgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGZsb2F0KiBkX3Jlc19oYWxmMSA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBmbG9hdCogZF9yZXNfaGFsZjIgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZmxvYXQqIGRfcmVzX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKKyAgICAgIGRfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZjEoCisgICAgICBkX3Jlc19oYWxmMSwgbnVtX2VsZW0pOworIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpVbmFsaWduZWQ+IGdwdV9yZXNfaGFsZjIoCisgICAgICBkX3Jlc19oYWxmMiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKKyAgICAgIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CisKKyAgRWlnZW46OmFycmF5PGludCwgMT4gbm9fYmNhc3Q7CisgIG5vX2JjYXN0WzBdID0gMTsKKworICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpIC0gZ3B1X2Zsb2F0LmNvbnN0YW50KDAuNWYpOworICBncHVfcmVzX2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5hYnMoKTsKKyAgZ3B1X3Jlc19oYWxmMS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQuY2FzdDxFaWdlbjo6aGFsZj4oKS5hYnMoKS5ldmFsKCkuY2FzdDxmbG9hdD4oKTsKKyAgZ3B1X3Jlc19oYWxmMi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQuY2FzdDxFaWdlbjo6aGFsZj4oKS5hYnMoKS5icm9hZGNhc3Qobm9fYmNhc3QpLmV2YWwoKS5jYXN0PGZsb2F0PigpOworCisgIFRlbnNvcjxmbG9hdCwgMT4gaGFsZl9wcmVjMShudW1fZWxlbSk7CisgIFRlbnNvcjxmbG9hdCwgMT4gaGFsZl9wcmVjMihudW1fZWxlbSk7CisgIFRlbnNvcjxmbG9hdCwgMT4gZnVsbF9wcmVjKG51bV9lbGVtKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMS5kYXRhKCksIGRfcmVzX2hhbGYxLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzX2hhbGYxLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBmb3JjZWQgZXZhbCAiIDw8IGkgPDwgZnVsbF9wcmVjKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMxKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMyKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYyhpKSwgaGFsZl9wcmVjMShpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMoaSksIGhhbGZfcHJlYzIoaSkpOworICB9CisKKyAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfZmxvYXQpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfaGFsZjEpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfaGFsZjIpOworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOworfQorI2VuZGlmCisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9vZl9mbG9hdDE2X2N1ZGEoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfbnVtZXh0PHZvaWQ+KCkpOworCisjaWZkZWYgRUlHRU5fSEFTX0NVREFfRlAxNgorICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfY29udmVyc2lvbjx2b2lkPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9jdWRhX3VuYXJ5PHZvaWQ+KCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfZWxlbWVudHdpc2U8dm9pZD4oKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfY3VkYV90cmFuY2VuZGVudGFsPHZvaWQ+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X2N1ZGFfY29udHJhY3Rpb25zPHZvaWQ+KCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2N1ZGFfcmVkdWN0aW9uczx2b2lkPigpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jdWRhX2Z1bGxfcmVkdWN0aW9uczx2b2lkPigpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9jdWRhX2ZvcmNlZF9ldmFsczx2b2lkPigpKTsKKyNlbHNlCisgIHN0ZDo6Y291dCA8PCAiSGFsZiBmbG9hdHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIGN1ZGE6IHNraXBwaW5nIHRoZSB0ZXN0IiA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX3N0cmluZ3MuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2Zfc3RyaW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmOWFlZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX3N0cmluZ3MuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OlRlbnNvck1hcDsKKworc3RhdGljIHZvaWQgdGVzdF9hc3NpZ24oKQoreworICBzdGQ6OnN0cmluZyBkYXRhMVs2XTsKKyAgVGVuc29yTWFwPFRlbnNvcjxzdGQ6OnN0cmluZywgMj4+IG1hdDEoZGF0YTEsIDIsIDMpOworICBzdGQ6OnN0cmluZyBkYXRhMls2XTsKKyAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBzdGQ6OnN0cmluZywgMj4+IG1hdDIoZGF0YTIsIDIsIDMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHMxOworICAgIHMxIDw8ICJhYmMiIDw8IGkqMzsKKyAgICBkYXRhMVtpXSA9IHMxLnN0cigpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzMjsKKyAgICBzMiA8PCAiZGVmIiA8PCBpKjU7CisgICAgZGF0YTJbaV0gPSBzMi5zdHIoKTsKKyAgfQorCisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gcnNsdDE7CisgIHJzbHQxID0gbWF0MTsKKyAgVGVuc29yPHN0ZDo6c3RyaW5nLCAyPiByc2x0MjsKKyAgcnNsdDIgPSBtYXQyOworCisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gcnNsdDMgPSBtYXQxOworICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHJzbHQ0ID0gbWF0MjsKKworICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHJzbHQ1KG1hdDEpOworICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHJzbHQ2KG1hdDIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0MShpLGopLCBkYXRhMVtpKzIqal0pOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQyKGksaiksIGRhdGEyW2krMipqXSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDMoaSxqKSwgZGF0YTFbaSsyKmpdKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0NChpLGopLCBkYXRhMltpKzIqal0pOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQ1KGksaiksIGRhdGExW2krMipqXSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDYoaSxqKSwgZGF0YTJbaSsyKmpdKTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdCgpCit7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gdDEoMiwgMyk7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gdDIoMiwgMyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHMxOworICAgICAgczEgPDwgImFiYyIgPDwgaSArIGoqMjsKKyAgICAgIHQxKGksIGopID0gczEuc3RyKCk7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczI7CisgICAgICBzMiA8PCAiZGVmIiA8PCBpKjUgKyBqKjMyOworICAgICAgdDIoaSwgaikgPSBzMi5zdHIoKTsKKyAgICB9CisgIH0KKworICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHJlc3VsdCA9IHQxLmNvbmNhdGVuYXRlKHQyLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgNik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKSwgICB0MShpLCBqKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGorMyksIHQyKGksIGopKTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X3NsaWNlcygpCit7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gZGF0YSgyLCA2KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHMxOworICAgICAgczEgPDwgImFiYyIgPDwgaSArIGoqMjsKKyAgICAgIGRhdGEoaSwgaikgPSBzMS5zdHIoKTsKKyAgICB9CisgIH0KKworICBjb25zdCBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gaGFsZl9zaXplKDIsIDMpOworICBjb25zdCBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gZmlyc3RfaGFsZigwLCAwKTsKKyAgY29uc3QgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDI+IHNlY29uZF9oYWxmKDAsIDMpOworCisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gdDEgPSBkYXRhLnNsaWNlKGZpcnN0X2hhbGYsIGhhbGZfc2l6ZSk7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gdDIgPSBkYXRhLnNsaWNlKHNlY29uZF9oYWxmLCBoYWxmX3NpemUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChkYXRhKGksIGopLCAgIHQxKGksIGopKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChkYXRhKGksIGorMyksIHQyKGksIGopKTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2FkZGl0aW9ucygpCit7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMT4gZGF0YTEoMyk7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMT4gZGF0YTIoMyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgZGF0YTEoaSkgPSAiYWJjIjsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczE7CisgICAgczEgPDwgaTsKKyAgICBkYXRhMihpKSA9IHMxLnN0cigpOworICB9CisKKyAgVGVuc29yPHN0ZDo6c3RyaW5nLCAxPiBzdW0gPSBkYXRhMSArIGRhdGEyOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25jYXQ7CisgICAgY29uY2F0IDw8ICJhYmMiIDw8IGk7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSBjb25jYXQuc3RyKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHN1bShpKSwgZXhwZWN0ZWQpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9pbml0aWFsaXphdGlvbigpCit7CisgIFRlbnNvcjxzdGQ6OnN0cmluZywgMj4gYSgyLCAzKTsKKyAgYS5zZXRDb25zdGFudChzdGQ6OnN0cmluZygiZm9vIikpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIqMzsgKytpKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKGEoaSksIHN0ZDo6c3RyaW5nKCJmb28iKSk7CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX29mX3N0cmluZ3MoKQoreworICAvLyBCZXdhcmU6IG5vbmUgb2YgdGhpcyBpcyBsaWtlbHkgdG8gZXZlciB3b3JrIG9uIGEgR1BVLgorICBDQUxMX1NVQlRFU1QodGVzdF9hc3NpZ24oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbmNhdCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2xpY2VzKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9hZGRpdGlvbnMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2luaXRpYWxpemF0aW9uKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGFkZGluZy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9wYWRkaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmExOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGFkZGluZy5jcHAKQEAgLTAsMCArMSw5MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9wYWRkaW5nKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBhcnJheTxzdGQ6OnBhaXI8cHRyZGlmZl90LCBwdHJkaWZmX3Q+LCA0PiBwYWRkaW5nczsKKyAgcGFkZGluZ3NbMF0gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgcGFkZGluZ3NbMV0gPSBzdGQ6Om1ha2VfcGFpcigyLCAxKTsKKyAgcGFkZGluZ3NbMl0gPSBzdGQ6Om1ha2VfcGFpcigzLCA0KTsKKyAgcGFkZGluZ3NbM10gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHBhZGRlZDsKKyAgcGFkZGVkID0gdGVuc29yLnBhZChwYWRkaW5ncyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMCksIDIrMCk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDEpLCAzKzMpOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigyKSwgNSs3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMyksIDcrMCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDY7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMjsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgaWYgKGogPj0gMiAmJiBqIDwgNSAmJiBrID49IDMgJiYgayA8IDgpIHsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSxqLGssbCksIHRlbnNvcihpLGotMixrLTMsbCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksaixrLGwpLCAwLjBmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3BhZGRlZF9leHByKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBhcnJheTxzdGQ6OnBhaXI8cHRyZGlmZl90LCBwdHJkaWZmX3Q+LCA0PiBwYWRkaW5nczsKKyAgcGFkZGluZ3NbMF0gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgcGFkZGluZ3NbMV0gPSBzdGQ6Om1ha2VfcGFpcigyLCAxKTsKKyAgcGFkZGluZ3NbMl0gPSBzdGQ6Om1ha2VfcGFpcigzLCA0KTsKKyAgcGFkZGluZ3NbM10gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gcmVzaGFwZV9kaW1zOworICByZXNoYXBlX2RpbXNbMF0gPSAxMjsKKyAgcmVzaGFwZV9kaW1zWzFdID0gODQ7CisKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQ7CisgIHJlc3VsdCA9IHRlbnNvci5wYWQocGFkZGluZ3MpLnJlc2hhcGUocmVzaGFwZV9kaW1zKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDEyOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHRfdmFsdWUgPSBEYXRhTGF5b3V0ID09IENvbE1ham9yID8KKyAgICAgICAgICAgICAgcmVzdWx0KGkrMipqLGsrMTIqbCkgOiByZXN1bHQoais2KmksbCs3KmspOworICAgICAgICAgIGlmIChqID49IDIgJiYgaiA8IDUgJiYgayA+PSAzICYmIGsgPCA4KSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3ZhbHVlLCB0ZW5zb3IoaSxqLTIsay0zLGwpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF92YWx1ZSwgMC4wZik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfcGFkZGluZygpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9wYWRkaW5nPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3BhZGRpbmc8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9wYWRkZWRfZXhwcjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3BhZGRlZF9leHByPFJvd01ham9yPigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhdGNoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQzNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGF0Y2guY3BwCkBAIC0wLDAgKzEsMTcyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3BhdGNoKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYXJyYXk8cHRyZGlmZl90LCA0PiBwYXRjaF9kaW1zOworCisgIHBhdGNoX2RpbXNbMF0gPSAxOworICBwYXRjaF9kaW1zWzFdID0gMTsKKyAgcGF0Y2hfZGltc1syXSA9IDE7CisgIHBhdGNoX2RpbXNbM10gPSAxOworCisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gbm9fcGF0Y2g7CisgIG5vX3BhdGNoID0gdGVuc29yLmV4dHJhY3RfcGF0Y2hlcyhwYXRjaF9kaW1zKTsKKworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMCksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMSksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMiksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMyksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oNCksIHRlbnNvci5zaXplKCkpOworICB9IGVsc2UgeworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMCksIHRlbnNvci5zaXplKCkpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMSksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMiksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oMyksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChub19wYXRjaC5kaW1lbnNpb24oNCksIDEpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW5zb3Iuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRhdGEoKVtpXSwgbm9fcGF0Y2guZGF0YSgpW2ldKTsKKyAgfQorCisgIHBhdGNoX2RpbXNbMF0gPSAyOworICBwYXRjaF9kaW1zWzFdID0gMzsKKyAgcGF0Y2hfZGltc1syXSA9IDU7CisgIHBhdGNoX2RpbXNbM10gPSA3OworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHNpbmdsZV9wYXRjaDsKKyAgc2luZ2xlX3BhdGNoID0gdGVuc29yLmV4dHJhY3RfcGF0Y2hlcyhwYXRjaF9kaW1zKTsKKworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2guZGltZW5zaW9uKDApLCAyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoLmRpbWVuc2lvbigxKSwgMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaC5kaW1lbnNpb24oMiksIDUpOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2guZGltZW5zaW9uKDMpLCA3KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoLmRpbWVuc2lvbig0KSwgMSk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaC5kaW1lbnNpb24oMCksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2guZGltZW5zaW9uKDEpLCAyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoLmRpbWVuc2lvbigyKSwgMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaC5kaW1lbnNpb24oMyksIDUpOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2guZGltZW5zaW9uKDQpLCA3KTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yLnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kYXRhKClbaV0sIHNpbmdsZV9wYXRjaC5kYXRhKClbaV0pOworICB9CisKKyAgcGF0Y2hfZGltc1swXSA9IDE7CisgIHBhdGNoX2RpbXNbMV0gPSAyOworICBwYXRjaF9kaW1zWzJdID0gMjsKKyAgcGF0Y2hfZGltc1szXSA9IDE7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdHdvZF9wYXRjaDsKKyAgdHdvZF9wYXRjaCA9IHRlbnNvci5leHRyYWN0X3BhdGNoZXMocGF0Y2hfZGltcyk7CisKKyAgaWYgKERhdGFMYXlvdXQgPT0gQ29sTWFqb3IpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMCksIDEpOworICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigxKSwgMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDIpLCAyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDEpOworICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbig0KSwgMioyKjQqNyk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDApLCAyKjIqNCo3KTsKKyAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMSksIDEpOworICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigyKSwgMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDMpLCAyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oNCksIDEpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBpbnQgcGF0Y2hfbG9jOworICAgICAgICAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CisgICAgICAgICAgICBwYXRjaF9sb2MgPSBpICsgMiAqIChqICsgMiAqIChrICsgNCAqIGwpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0Y2hfbG9jID0gbCArIDcgKiAoayArIDQgKiAoaiArIDIgKiBpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgICAgICAgICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqK3gsayt5LGwpLCB0d29kX3BhdGNoKDAseCx5LDAscGF0Y2hfbG9jKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGoreCxrK3ksbCksIHR3b2RfcGF0Y2gocGF0Y2hfbG9jLDAseCx5LDApKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHBhdGNoX2RpbXNbMF0gPSAxOworICBwYXRjaF9kaW1zWzFdID0gMjsKKyAgcGF0Y2hfZGltc1syXSA9IDM7CisgIHBhdGNoX2RpbXNbM10gPSA1OworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRocmVlZF9wYXRjaDsKKyAgdGhyZWVkX3BhdGNoID0gdGVuc29yLmV4dHJhY3RfcGF0Y2hlcyhwYXRjaF9kaW1zKTsKKworICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDApLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigxKSwgMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMiksIDMpOworICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDMpLCA1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbig0KSwgMioyKjMqMyk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMCksIDIqMiozKjMpOworICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDEpLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigyKSwgMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMyksIDMpOworICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDQpLCA1KTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMzsgKytsKSB7CisgICAgICAgICAgaW50IHBhdGNoX2xvYzsKKyAgICAgICAgICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgICAgICAgICAgcGF0Y2hfbG9jID0gaSArIDIgKiAoaiArIDIgKiAoayArIDMgKiBsKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhdGNoX2xvYyA9IGwgKyAzICogKGsgKyAzICogKGogKyAyICogaSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAzOyArK3kpIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCA1OyArK3opIHsKKyAgICAgICAgICAgICAgICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgeworICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGoreCxrK3ksbCt6KSwgdGhyZWVkX3BhdGNoKDAseCx5LHoscGF0Y2hfbG9jKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqK3gsayt5LGwreiksIHRocmVlZF9wYXRjaChwYXRjaF9sb2MsMCx4LHkseikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3BhdGNoKCkKK3sKKyAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9wYXRjaDxDb2xNYWpvcj4oKSk7CisgICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcGF0Y2g8Um93TWFqb3I+KCkpOworICAgLy8gICBDQUxMX1NVQlRFU1QodGVzdF9leHByX3NodWZmbGluZygpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb20uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmM2RjNTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb20uY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3N0YXRpYyB2b2lkIHRlc3RfZGVmYXVsdCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMT4gdmVjKDYpOworICB2ZWMuc2V0UmFuZG9tKCk7CisKKyAgLy8gRml4bWU6IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBmb2xsb3cgYSB1bmlmb3JtCisgIC8vIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkLgorICBmb3IgKGludCBpID0gMTsgaSA8IDY7ICsraSkgeworICAgIFZFUklGWV9JU19OT1RfRVFVQUwodmVjKGkpLCB2ZWMoaS0xKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9ub3JtYWwoKQoreworICBUZW5zb3I8ZmxvYXQsIDE+IHZlYyg2KTsKKyAgdmVjLnNldFJhbmRvbTxFaWdlbjo6aW50ZXJuYWw6Ok5vcm1hbFJhbmRvbUdlbmVyYXRvcjxmbG9hdD4+KCk7CisKKyAgLy8gRml4bWU6IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBmb2xsb3cgYSBnYXVzc2lhbgorICAvLyBkaXN0cmlidXRpb24gaW5zdGVhZC4KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyArK2kpIHsKKyAgICBWRVJJRllfSVNfTk9UX0VRVUFMKHZlYyhpKSwgdmVjKGktMSkpOworICB9Cit9CisKKworc3RydWN0IE15R2VuZXJhdG9yIHsKKyAgTXlHZW5lcmF0b3IoKSB7IH0KKyAgTXlHZW5lcmF0b3IoY29uc3QgTXlHZW5lcmF0b3ImKSB7IH0KKworICAvLyBSZXR1cm4gYSByYW5kb20gdmFsdWUgdG8gYmUgdXNlZC4gICJlbGVtZW50X2xvY2F0aW9uIiBpcyB0aGUKKyAgLy8gbG9jYXRpb24gb2YgdGhlIGVudHJ5IHRvIHNldCBpbiB0aGUgdGVuc29yLCBpdCBjYW4gdHlwaWNhbGx5CisgIC8vIGJlIGlnbm9yZWQuCisgIGludCBvcGVyYXRvcigpKEVpZ2VuOjpEZW5zZUluZGV4IGVsZW1lbnRfbG9jYXRpb24sIEVpZ2VuOjpEZW5zZUluZGV4IC8qdW51c2VkKi8gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oMyAqIGVsZW1lbnRfbG9jYXRpb24pOworICB9CisKKyAgLy8gU2FtZSBhcyBhYm92ZSBidXQgZ2VuZXJhdGVzIHNldmVyYWwgbnVtYmVycyBhdCBhIHRpbWUuCisgIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGludD46OnR5cGUgcGFja2V0T3AoCisgICAgICBFaWdlbjo6RGVuc2VJbmRleCBwYWNrZXRfbG9jYXRpb24sIEVpZ2VuOjpEZW5zZUluZGV4IC8qdW51c2VkKi8gPSAwKSBjb25zdCB7CisgICAgY29uc3QgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxpbnQ+OjpzaXplOworICAgIEVJR0VOX0FMSUdOX01BWCBpbnQgdmFsdWVzW3BhY2tldFNpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2V0U2l6ZTsgKytpKSB7CisgICAgICB2YWx1ZXNbaV0gPSBzdGF0aWNfY2FzdDxpbnQ+KDMgKiAocGFja2V0X2xvY2F0aW9uICsgaSkpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkPHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGludD46OnR5cGU+KHZhbHVlcyk7CisgIH0KK307CisKKworc3RhdGljIHZvaWQgdGVzdF9jdXN0b20oKQoreworICBUZW5zb3I8aW50LCAxPiB2ZWMoNik7CisgIHZlYy5zZXRSYW5kb208TXlHZW5lcmF0b3I+KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodmVjKGkpLCAzKmkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfcmFuZG9tKCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZGVmYXVsdCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfbm9ybWFsKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jdXN0b20oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb21fY3VkYS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbV9jdWRhLmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmUxOTkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb21fY3VkYS5jdQpAQCAtMCwwICsxLDg4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorI2RlZmluZSBFSUdFTl9URVNUX05PX0NPTVBMRVgKKyNkZWZpbmUgRUlHRU5fVEVTVF9GVU5DIGN4eDExX3RlbnNvcl9yYW5kb21fY3VkYQorI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50CisjZGVmaW5lIEVJR0VOX1VTRV9HUFUKKworI2lmIGRlZmluZWQgX19DVURBQ0NfVkVSX18gJiYgX19DVURBQ0NfVkVSX18gPj0gNzA1MDAKKyNpbmNsdWRlIDxjdWRhX2ZwMTYuaD4KKyNlbmRpZgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKKwordm9pZCB0ZXN0X2N1ZGFfcmFuZG9tX3VuaWZvcm0oKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IG91dCg3Miw5Nyk7CisgIG91dC5zZXRaZXJvKCk7CisKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gb3V0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CisKKyAgZmxvYXQqIGRfb3V0OworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX291dCksIG91dF9ieXRlcyk7CisKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CisKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiA+IGdwdV9vdXQoZF9vdXQsIDcyLDk3KTsKKworICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9vdXQucmFuZG9tKCk7CisKKyAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOworCisgIC8vIEZvciBub3cgd2UganVzdCBjaGVjayB0aGVzIGNvZGUgZG9lc24ndCBjcmFzaC4KKyAgLy8gVE9ETzogY29tZSB1cCB3aXRoIGEgdmFsaWQgdGVzdCBvZiByYW5kb21uZXNzCit9CisKKwordm9pZCB0ZXN0X2N1ZGFfcmFuZG9tX25vcm1hbCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMj4gb3V0KDcyLDk3KTsKKyAgb3V0LnNldFplcm8oKTsKKworICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKworICBmbG9hdCogZF9vdXQ7CisgIGN1ZGFNYWxsb2MoKHZvaWQqKikoJmRfb3V0KSwgb3V0X2J5dGVzKTsKKworICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKKworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsOTcpOworCisgIEVpZ2VuOjppbnRlcm5hbDo6Tm9ybWFsUmFuZG9tR2VuZXJhdG9yPGZsb2F0PiBnZW4odHJ1ZSk7CisgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X291dC5yYW5kb20oZ2VuKTsKKworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKKyAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY29tcGxleCgpCit7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiB2ZWMoNik7CisgIHZlYy5zZXRSYW5kb20oKTsKKworICAvLyBGaXhtZTogd2Ugc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGdlbmVyYXRlZCBudW1iZXJzIGZvbGxvdyBhIHVuaWZvcm0KKyAgLy8gZGlzdHJpYnV0aW9uIGluc3RlYWQuCisgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgKytpKSB7CisgICAgVkVSSUZZX0lTX05PVF9FUVVBTCh2ZWMoaSksIHZlYyhpLTEpKTsKKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfcmFuZG9tX2N1ZGEoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX3JhbmRvbV91bmlmb3JtKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX3JhbmRvbV9ub3JtYWwoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBsZXgoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDkwZWMzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uLmNwcApAQCAtMCwwICsxLDUwOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfdHJpdmlhbF9yZWR1Y3Rpb25zKCkgeworICB7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiB0ZW5zb3I7CisgICAgdGVuc29yLnNldFJhbmRvbSgpOworICAgIGFycmF5PHB0cmRpZmZfdCwgMD4gcmVkdWN0aW9uX2F4aXM7CisKKyAgICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvci5zdW0ocmVkdWN0aW9uX2F4aXMpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoKSwgdGVuc29yKCkpOworICB9CisKKyAgeworICAgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gdGVuc29yKDcpOworICAgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgICBhcnJheTxwdHJkaWZmX3QsIDA+IHJlZHVjdGlvbl9heGlzOworCisgICAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiByZXN1bHQgPSB0ZW5zb3Iuc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgNyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyArK2kpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSksIHRlbnNvcihpKSk7CisgICAgfQorICB9CisKKyAgeworICAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMpOworICAgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgICBhcnJheTxwdHJkaWZmX3QsIDA+IHJlZHVjdGlvbl9heGlzOworCisgICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQgPSB0ZW5zb3Iuc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCB0ZW5zb3IoaSwgaikpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9yZWR1Y3Rpb25zKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICBhcnJheTxwdHJkaWZmX3QsIDI+IHJlZHVjdGlvbl9heGlzMjsKKyAgcmVkdWN0aW9uX2F4aXMyWzBdID0gMTsKKyAgcmVkdWN0aW9uX2F4aXMyWzFdID0gMzsKKworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvci5zdW0ocmVkdWN0aW9uX2F4aXMyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgIGZsb2F0IHN1bSA9IDAuMGY7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIHN1bSArPSB0ZW5zb3IoaSwgaywgaiwgbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KGksIGopLCBzdW0pOworICAgIH0KKyAgfQorCisgIHsKKyAgICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IHN1bTEgPSB0ZW5zb3Iuc3VtKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHN1bTEucmFuaygpLCAwKTsKKworICAgIGFycmF5PHB0cmRpZmZfdCwgND4gcmVkdWN0aW9uX2F4aXM0OworICAgIHJlZHVjdGlvbl9heGlzNFswXSA9IDA7CisgICAgcmVkdWN0aW9uX2F4aXM0WzFdID0gMTsKKyAgICByZWR1Y3Rpb25fYXhpczRbMl0gPSAyOworICAgIHJlZHVjdGlvbl9heGlzNFszXSA9IDM7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBzdW0yID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpczQpOworICAgIFZFUklGWV9JU19FUVVBTChzdW0yLnJhbmsoKSwgMCk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN1bTEoKSwgc3VtMigpKTsKKyAgfQorCisgIHJlZHVjdGlvbl9heGlzMlswXSA9IDA7CisgIHJlZHVjdGlvbl9heGlzMlsxXSA9IDI7CisgIHJlc3VsdCA9IHRlbnNvci5wcm9kKHJlZHVjdGlvbl9heGlzMik7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDcpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNzsgKytqKSB7CisgICAgICBmbG9hdCBwcm9kID0gMS4wZjsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNTsgKytsKSB7CisgICAgICAgICAgcHJvZCAqPSB0ZW5zb3IoaywgaSwgbCwgaik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KGksIGopLCBwcm9kKTsKKyAgICB9CisgIH0KKworICB7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBwcm9kMSA9IHRlbnNvci5wcm9kKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHByb2QxLnJhbmsoKSwgMCk7CisKKyAgICBhcnJheTxwdHJkaWZmX3QsIDQ+IHJlZHVjdGlvbl9heGlzNDsKKyAgICByZWR1Y3Rpb25fYXhpczRbMF0gPSAwOworICAgIHJlZHVjdGlvbl9heGlzNFsxXSA9IDE7CisgICAgcmVkdWN0aW9uX2F4aXM0WzJdID0gMjsKKyAgICByZWR1Y3Rpb25fYXhpczRbM10gPSAzOworICAgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gcHJvZDIgPSB0ZW5zb3IucHJvZChyZWR1Y3Rpb25fYXhpczQpOworICAgIFZFUklGWV9JU19FUVVBTChwcm9kMi5yYW5rKCksIDApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChwcm9kMSgpLCBwcm9kMigpKTsKKyAgfQorCisgIHJlZHVjdGlvbl9heGlzMlswXSA9IDA7CisgIHJlZHVjdGlvbl9heGlzMlsxXSA9IDI7CisgIHJlc3VsdCA9IHRlbnNvci5tYXhpbXVtKHJlZHVjdGlvbl9heGlzMik7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDcpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNzsgKytqKSB7CisgICAgICBmbG9hdCBtYXhfdmFsID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Omxvd2VzdCgpOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA1OyArK2wpIHsKKyAgICAgICAgICBtYXhfdmFsID0gKHN0ZDo6bWF4KShtYXhfdmFsLCB0ZW5zb3IoaywgaSwgbCwgaikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqKSwgbWF4X3ZhbCk7CisgICAgfQorICB9CisKKyAgeworICAgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gbWF4MSA9IHRlbnNvci5tYXhpbXVtKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1heDEucmFuaygpLCAwKTsKKworICAgIGFycmF5PHB0cmRpZmZfdCwgND4gcmVkdWN0aW9uX2F4aXM0OworICAgIHJlZHVjdGlvbl9heGlzNFswXSA9IDA7CisgICAgcmVkdWN0aW9uX2F4aXM0WzFdID0gMTsKKyAgICByZWR1Y3Rpb25fYXhpczRbMl0gPSAyOworICAgIHJlZHVjdGlvbl9heGlzNFszXSA9IDM7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBtYXgyID0gdGVuc29yLm1heGltdW0ocmVkdWN0aW9uX2F4aXM0KTsKKyAgICBWRVJJRllfSVNfRVFVQUwobWF4Mi5yYW5rKCksIDApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXgxKCksIG1heDIoKSk7CisgIH0KKworICByZWR1Y3Rpb25fYXhpczJbMF0gPSAwOworICByZWR1Y3Rpb25fYXhpczJbMV0gPSAxOworICByZXN1bHQgPSB0ZW5zb3IubWluaW11bShyZWR1Y3Rpb25fYXhpczIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCA3KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7ICsraikgeworICAgICAgZmxvYXQgbWluX3ZhbCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KSgpOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAzOyArK2wpIHsKKyAgICAgICAgICBtaW5fdmFsID0gKHN0ZDo6bWluKShtaW5fdmFsLCB0ZW5zb3IoaywgbCwgaSwgaikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqKSwgbWluX3ZhbCk7CisgICAgfQorICB9CisKKyAgeworICAgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gbWluMSA9IHRlbnNvci5taW5pbXVtKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1pbjEucmFuaygpLCAwKTsKKworICAgIGFycmF5PHB0cmRpZmZfdCwgND4gcmVkdWN0aW9uX2F4aXM0OworICAgIHJlZHVjdGlvbl9heGlzNFswXSA9IDA7CisgICAgcmVkdWN0aW9uX2F4aXM0WzFdID0gMTsKKyAgICByZWR1Y3Rpb25fYXhpczRbMl0gPSAyOworICAgIHJlZHVjdGlvbl9heGlzNFszXSA9IDM7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBtaW4yID0gdGVuc29yLm1pbmltdW0ocmVkdWN0aW9uX2F4aXM0KTsKKyAgICBWRVJJRllfSVNfRVFVQUwobWluMi5yYW5rKCksIDApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtaW4xKCksIG1pbjIoKSk7CisgIH0KKworICByZWR1Y3Rpb25fYXhpczJbMF0gPSAwOworICByZWR1Y3Rpb25fYXhpczJbMV0gPSAxOworICByZXN1bHQgPSB0ZW5zb3IubWVhbihyZWR1Y3Rpb25fYXhpczIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCA3KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7ICsraikgeworICAgICAgZmxvYXQgc3VtID0gMC4wZjsKKyAgICAgIGludCBjb3VudCA9IDA7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDM7ICsrbCkgeworICAgICAgICAgIHN1bSArPSB0ZW5zb3IoaywgbCwgaSwgaik7CisgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoaSwgaiksIHN1bSAvIGNvdW50KTsKKyAgICB9CisgIH0KKworICB7CisgICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBtZWFuMSA9IHRlbnNvci5tZWFuKCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1lYW4xLnJhbmsoKSwgMCk7CisKKyAgICBhcnJheTxwdHJkaWZmX3QsIDQ+IHJlZHVjdGlvbl9heGlzNDsKKyAgICByZWR1Y3Rpb25fYXhpczRbMF0gPSAwOworICAgIHJlZHVjdGlvbl9heGlzNFsxXSA9IDE7CisgICAgcmVkdWN0aW9uX2F4aXM0WzJdID0gMjsKKyAgICByZWR1Y3Rpb25fYXhpczRbM10gPSAzOworICAgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gbWVhbjIgPSB0ZW5zb3IubWVhbihyZWR1Y3Rpb25fYXhpczQpOworICAgIFZFUklGWV9JU19FUVVBTChtZWFuMi5yYW5rKCksIDApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtZWFuMSgpLCBtZWFuMigpKTsKKyAgfQorCisgIHsKKyAgICBUZW5zb3I8aW50LCAxPiBpbnRzKDEwKTsKKyAgICBzdGQ6OmlvdGEoaW50cy5kYXRhKCksIGludHMuZGF0YSgpICsgaW50cy5kaW1lbnNpb24oMCksIDApOworCisgICAgVGVuc29yRml4ZWRTaXplPGJvb2wsIFNpemVzPD4gPiBhbGw7CisgICAgYWxsID0gaW50cy5hbGwoKTsKKyAgICBWRVJJRlkoIWFsbCgpKTsKKyAgICBhbGwgPSAoaW50cyA+PSBpbnRzLmNvbnN0YW50KDApKS5hbGwoKTsKKyAgICBWRVJJRlkoYWxsKCkpOworCisgICAgVGVuc29yRml4ZWRTaXplPGJvb2wsIFNpemVzPD4gPiBhbnk7CisgICAgYW55ID0gKGludHMgPiBpbnRzLmNvbnN0YW50KDEwKSkuYW55KCk7CisgICAgVkVSSUZZKCFhbnkoKSk7CisgICAgYW55ID0gKGludHMgPCBpbnRzLmNvbnN0YW50KDEpKS5hbnkoKTsKKyAgICBWRVJJRlkoYW55KCkpOworICB9Cit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9yZWR1Y3Rpb25zX2luX2V4cHIoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIGFycmF5PHB0cmRpZmZfdCwgMj4gcmVkdWN0aW9uX2F4aXMyOworICByZWR1Y3Rpb25fYXhpczJbMF0gPSAxOworICByZWR1Y3Rpb25fYXhpczJbMV0gPSAzOworCisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gcmVzdWx0KDIsIDUpOworICByZXN1bHQgPSByZXN1bHQuY29uc3RhbnQoMS4wZikgLSB0ZW5zb3Iuc3VtKHJlZHVjdGlvbl9heGlzMik7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDUpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmbG9hdCBzdW0gPSAwLjBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBzdW0gKz0gdGVuc29yKGksIGssIGosIGwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqKSwgMS4wZiAtIHN1bSk7CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnMoKSB7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIGFycmF5PHB0cmRpZmZfdCwgMj4gcmVkdWN0aW9uX2F4aXM7CisgIHJlZHVjdGlvbl9heGlzWzBdID0gMDsKKyAgcmVkdWN0aW9uX2F4aXNbMV0gPSAxOworCisgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gcmVzdWx0ID0gdGVuc29yLnN1bShyZWR1Y3Rpb25fYXhpcyk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQucmFuaygpLCAwKTsKKworICBmbG9hdCBzdW0gPSAwLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBzdW0gKz0gdGVuc29yKGksIGopOworICAgIH0KKyAgfQorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwKSwgc3VtKTsKKworICByZXN1bHQgPSB0ZW5zb3Iuc3F1YXJlKCkuc3VtKHJlZHVjdGlvbl9heGlzKS5zcXJ0KCk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQucmFuaygpLCAwKTsKKworICBzdW0gPSAwLjBmOworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBzdW0gKz0gdGVuc29yKGksIGopICogdGVuc29yKGksIGopOworICAgIH0KKyAgfQorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgpLCBzcXJ0ZihzdW0pKTsKK30KKworc3RydWN0IFVzZXJSZWR1Y2VyIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgUGFja2V0QWNjZXNzID0gZmFsc2U7CisgIFVzZXJSZWR1Y2VyKGZsb2F0IG9mZnNldCkgOiBvZmZzZXRfKG9mZnNldCkge30KKyAgdm9pZCByZWR1Y2UoY29uc3QgZmxvYXQgdmFsLCBmbG9hdCogYWNjdW0pIHsgKmFjY3VtICs9IHZhbCAqIHZhbDsgfQorICBmbG9hdCBpbml0aWFsaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICBmbG9hdCBmaW5hbGl6ZShjb25zdCBmbG9hdCBhY2N1bSkgY29uc3QgeyByZXR1cm4gMS4wZiAvIChhY2N1bSArIG9mZnNldF8pOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBmbG9hdCBvZmZzZXRfOworfTsKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF91c2VyX2RlZmluZWRfcmVkdWN0aW9ucygpIHsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0ZW5zb3IoNSwgNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYXJyYXk8cHRyZGlmZl90LCAxPiByZWR1Y3Rpb25fYXhpczsKKyAgcmVkdWN0aW9uX2F4aXNbMF0gPSAxOworCisgIFVzZXJSZWR1Y2VyIHJlZHVjZXIoMTAuMGYpOworICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvci5yZWR1Y2UocmVkdWN0aW9uX2F4aXMsIHJlZHVjZXIpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgZmxvYXQgZXhwZWN0ZWQgPSAxMC4wZjsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7ICsraikgeworICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksIGopICogdGVuc29yKGksIGopOworICAgIH0KKyAgICBleHBlY3RlZCA9IDEuMGYgLyBleHBlY3RlZDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpKSwgZXhwZWN0ZWQpOworICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX21hcHMoKSB7CisgIGludCBpbnB1dHNbMiAqIDMgKiA1ICogN107CisgIFRlbnNvck1hcDxUZW5zb3I8aW50LCA0LCBEYXRhTGF5b3V0PiA+IHRlbnNvcl9tYXAoaW5wdXRzLCAyLCAzLCA1LCA3KTsKKyAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDQsIERhdGFMYXlvdXQ+ID4gdGVuc29yX21hcF9jb25zdChpbnB1dHMsIDIsIDMsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyk7CisgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgaW50LCA0LCBEYXRhTGF5b3V0PiA+IHRlbnNvcl9tYXBfY29uc3RfY29uc3QoCisgICAgICBpbnB1dHMsIDIsIDMsIDUsIDcpOworCisgIHRlbnNvcl9tYXAuc2V0UmFuZG9tKCk7CisgIGFycmF5PHB0cmRpZmZfdCwgMj4gcmVkdWN0aW9uX2F4aXM7CisgIHJlZHVjdGlvbl9heGlzWzBdID0gMTsKKyAgcmVkdWN0aW9uX2F4aXNbMV0gPSAzOworCisgIFRlbnNvcjxpbnQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvcl9tYXAuc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gcmVzdWx0MiA9IHRlbnNvcl9tYXBfY29uc3Quc3VtKHJlZHVjdGlvbl9heGlzKTsKKyAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gcmVzdWx0MyA9CisgICAgICB0ZW5zb3JfbWFwX2NvbnN0X2NvbnN0LnN1bShyZWR1Y3Rpb25fYXhpcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgaW50IHN1bSA9IDA7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIHN1bSArPSB0ZW5zb3JfbWFwKGksIGssIGosIGwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCBzdW0pOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDIoaSwgaiksIHN1bSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0MyhpLCBqKSwgc3VtKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zdGF0aWNfZGltcygpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbig3MiwgNTMsIDk3LCAxMTMpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG91dCg3MiwgOTcpOworICBpbi5zZXRSYW5kb20oKTsKKworI2lmICFFSUdFTl9IQVNfQ09OU1RFWFBSIAorICBhcnJheTxpbnQsIDI+IHJlZHVjdGlvbl9heGlzOworICByZWR1Y3Rpb25fYXhpc1swXSA9IDE7CisgIHJlZHVjdGlvbl9heGlzWzFdID0gMzsKKyNlbHNlCisgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+ID4gcmVkdWN0aW9uX2F4aXM7CisjZW5kaWYKKworICBvdXQgPSBpbi5tYXhpbXVtKHJlZHVjdGlvbl9heGlzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDk3OyArK2opIHsKKyAgICAgIGZsb2F0IGV4cGVjdGVkID0gLTFlMTBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTEzOyArK2wpIHsKKyAgICAgICAgICBleHBlY3RlZCA9IChzdGQ6Om1heCkoZXhwZWN0ZWQsIGluKGksIGssIGosIGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9pbm5lcm1vc3RfbGFzdF9kaW1zKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGluKDcyLCA1MywgOTcsIDExMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gb3V0KDk3LCAxMTMpOworICBpbi5zZXRSYW5kb20oKTsKKworLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KKyNpZiAhRUlHRU5fSEFTX0NPTlNURVhQUgorICBhcnJheTxpbnQsIDI+IHJlZHVjdGlvbl9heGlzOworICByZWR1Y3Rpb25fYXhpc1swXSA9IDA7CisgIHJlZHVjdGlvbl9heGlzWzFdID0gMTsKKyNlbHNlCisgIC8vIFRoaXMgdHJpZ2dlcnMgdGhlIHVzZSBvZiBwYWNrZXRzIGZvciBDb2xNYWpvci4KKyAgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPiwgRWlnZW46OnR5cGUyaW5kZXg8MT4gPiByZWR1Y3Rpb25fYXhpczsKKyNlbmRpZgorCisgIG91dCA9IGluLm1heGltdW0ocmVkdWN0aW9uX2F4aXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgOTc7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTEzOyArK2opIHsKKyAgICAgIGZsb2F0IGV4cGVjdGVkID0gLTFlMTBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzI7ICsrbCkgeworICAgICAgICAgIGV4cGVjdGVkID0gKHN0ZDo6bWF4KShleHBlY3RlZCwgaW4obCwgaywgaSwgaikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqKSwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2lubmVybW9zdF9maXJzdF9kaW1zKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGluKDcyLCA1MywgOTcsIDExMyk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gb3V0KDcyLCA1Myk7CisgIGluLnNldFJhbmRvbSgpOworCisvLyBSZWR1Y2Ugb24gdGhlIGlubmVybW9zdCBkaW1lbnNpb25zLgorI2lmICFFSUdFTl9IQVNfQ09OU1RFWFBSCisgIGFycmF5PGludCwgMj4gcmVkdWN0aW9uX2F4aXM7CisgIHJlZHVjdGlvbl9heGlzWzBdID0gMjsKKyAgcmVkdWN0aW9uX2F4aXNbMV0gPSAzOworI2Vsc2UKKyAgLy8gVGhpcyB0cmlnZ2VycyB0aGUgdXNlIG9mIHBhY2tldHMgZm9yIFJvd01ham9yLgorICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPj4gcmVkdWN0aW9uX2F4aXM7CisjZW5kaWYKKworICBvdXQgPSBpbi5tYXhpbXVtKHJlZHVjdGlvbl9heGlzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDUzOyArK2opIHsKKyAgICAgIGZsb2F0IGV4cGVjdGVkID0gLTFlMTBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA5NzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTEzOyArK2wpIHsKKyAgICAgICAgICBleHBlY3RlZCA9IChzdGQ6Om1heCkoZXhwZWN0ZWQsIGluKGksIGosIGssIGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9yZWR1Y2VfbWlkZGxlX2RpbXMoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW4oNzIsIDUzLCA5NywgMTEzKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBvdXQoNzIsIDUzKTsKKyAgaW4uc2V0UmFuZG9tKCk7CisKKy8vIFJlZHVjZSBvbiB0aGUgaW5uZXJtb3N0IGRpbWVuc2lvbnMuCisjaWYgIUVJR0VOX0hBU19DT05TVEVYUFIKKyAgYXJyYXk8aW50LCAyPiByZWR1Y3Rpb25fYXhpczsKKyAgcmVkdWN0aW9uX2F4aXNbMF0gPSAxOworICByZWR1Y3Rpb25fYXhpc1sxXSA9IDI7CisjZWxzZQorICAvLyBUaGlzIHRyaWdnZXJzIHRoZSB1c2Ugb2YgcGFja2V0cyBmb3IgUm93TWFqb3IuCisgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+PiByZWR1Y3Rpb25fYXhpczsKKyNlbmRpZgorCisgIG91dCA9IGluLm1heGltdW0ocmVkdWN0aW9uX2F4aXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNzI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTEzOyArK2opIHsKKyAgICAgIGZsb2F0IGV4cGVjdGVkID0gLTFlMTBmOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MzsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgOTc7ICsrbCkgeworICAgICAgICAgIGV4cGVjdGVkID0gKHN0ZDo6bWF4KShleHBlY3RlZCwgaW4oaSwgaywgbCwgaikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqKSwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3JlZHVjdGlvbigpIHsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdHJpdmlhbF9yZWR1Y3Rpb25zPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdHJpdmlhbF9yZWR1Y3Rpb25zPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcmVkdWN0aW9uczxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZHVjdGlvbnNfaW5fZXhwcjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZHVjdGlvbnNfaW5fZXhwcjxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2Z1bGxfcmVkdWN0aW9uczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2Z1bGxfcmVkdWN0aW9uczxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3VzZXJfZGVmaW5lZF9yZWR1Y3Rpb25zPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdXNlcl9kZWZpbmVkX3JlZHVjdGlvbnM8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3JfbWFwczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl9tYXBzPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RhdGljX2RpbXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfZGltczxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2lubmVybW9zdF9sYXN0X2RpbXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9pbm5lcm1vc3RfbGFzdF9kaW1zPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfaW5uZXJtb3N0X2ZpcnN0X2RpbXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9pbm5lcm1vc3RfZmlyc3RfZGltczxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZHVjZV9taWRkbGVfZGltczxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZHVjZV9taWRkbGVfZGltczxSb3dNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb25fY3VkYS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9jdWRhLmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NThiNDMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb25fY3VkYS5jdQpAQCAtMCwwICsxLDE1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3JfcmVkdWN0aW9uX2N1ZGEKKyNkZWZpbmUgRUlHRU5fVVNFX0dQVQorCisjaWYgZGVmaW5lZCBfX0NVREFDQ19WRVJfXyAmJiBfX0NVREFDQ19WRVJfXyA+PSA3MDUwMAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlLCBpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zKCkgeworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1KjEwMjQpOworICBjb25zdCBpbnQgbnVtX2NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKKworICBUZW5zb3I8VHlwZSwgMiwgRGF0YUxheW91dD4gaW4obnVtX3Jvd3MsIG51bV9jb2xzKTsKKyAgaW4uc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPFR5cGUsIDAsIERhdGFMYXlvdXQ+IGZ1bGxfcmVkdXg7CisgIGZ1bGxfcmVkdXggPSBpbi5zdW0oKTsKKworICBzdGQ6OnNpemVfdCBpbl9ieXRlcyA9IGluLnNpemUoKSAqIHNpemVvZihUeXBlKTsKKyAgc3RkOjpzaXplX3Qgb3V0X2J5dGVzID0gZnVsbF9yZWR1eC5zaXplKCkgKiBzaXplb2YoVHlwZSk7CisgIFR5cGUqIGdwdV9pbl9wdHIgPSBzdGF0aWNfY2FzdDxUeXBlKj4oZ3B1X2RldmljZS5hbGxvY2F0ZShpbl9ieXRlcykpOworICBUeXBlKiBncHVfb3V0X3B0ciA9IHN0YXRpY19jYXN0PFR5cGUqPihncHVfZGV2aWNlLmFsbG9jYXRlKG91dF9ieXRlcykpOworICBncHVfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fcHRyLCBpbi5kYXRhKCksIGluX2J5dGVzKTsKKworICBUZW5zb3JNYXA8VGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+ID4gaW5fZ3B1KGdwdV9pbl9wdHIsIG51bV9yb3dzLCBudW1fY29scyk7CisgIFRlbnNvck1hcDxUZW5zb3I8VHlwZSwgMCwgRGF0YUxheW91dD4gPiBvdXRfZ3B1KGdwdV9vdXRfcHRyKTsKKworICBvdXRfZ3B1LmRldmljZShncHVfZGV2aWNlKSA9IGluX2dwdS5zdW0oKTsKKworICBUZW5zb3I8VHlwZSwgMCwgRGF0YUxheW91dD4gZnVsbF9yZWR1eF9ncHU7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9wdHIsIG91dF9ieXRlcyk7CisgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCisgIFZFUklGWV9JU19BUFBST1goZnVsbF9yZWR1eCgpLCBmdWxsX3JlZHV4X2dwdSgpKTsKKworICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX3B0cik7CisgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X3B0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFR5cGUsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9ucygpIHsKKyAgaW50IGRpbV94ID0gMzM7CisgIGludCBkaW1feSA9IDE7CisgIGludCBkaW1feiA9IDEyODsKKworICBUZW5zb3I8VHlwZSwgMywgRGF0YUxheW91dD4gaW4oZGltX3gsIGRpbV95LCBkaW1feik7CisgIGluLnNldFJhbmRvbSgpOworCisgIEVpZ2VuOjphcnJheTxpbnQsIDE+IHJlZF9heGlzOworICByZWRfYXhpc1swXSA9IDA7CisgIFRlbnNvcjxUeXBlLCAyLCBEYXRhTGF5b3V0PiByZWR1eCA9IGluLnN1bShyZWRfYXhpcyk7CisKKyAgLy8gQ3JlYXRlIGRldmljZQorICBFaWdlbjo6Q3VkYVN0cmVhbURldmljZSBzdHJlYW07CisgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2KCZzdHJlYW0pOworICAKKyAgLy8gQ3JlYXRlIGRhdGEoVCkKKyAgVHlwZSogaW5fZGF0YSA9IChUeXBlKilkZXYuYWxsb2NhdGUoZGltX3gqZGltX3kqZGltX3oqc2l6ZW9mKFR5cGUpKTsKKyAgVHlwZSogb3V0X2RhdGEgPSAoVHlwZSopZGV2LmFsbG9jYXRlKGRpbV96KmRpbV95KnNpemVvZihUeXBlKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxUeXBlLCAzLCBEYXRhTGF5b3V0PiA+IGdwdV9pbihpbl9kYXRhLCBkaW1feCwgZGltX3ksIGRpbV96KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+ID4gZ3B1X291dChvdXRfZGF0YSwgZGltX3ksIGRpbV96KTsKKyAgCisgIC8vIFBlcmZvcm0gb3BlcmF0aW9uCisgIGRldi5tZW1jcHlIb3N0VG9EZXZpY2UoaW5fZGF0YSwgaW4uZGF0YSgpLCBpbi5zaXplKCkqc2l6ZW9mKFR5cGUpKTsKKyAgZ3B1X291dC5kZXZpY2UoZGV2KSA9IGdwdV9pbi5zdW0ocmVkX2F4aXMpOworICBncHVfb3V0LmRldmljZShkZXYpICs9IGdwdV9pbi5zdW0ocmVkX2F4aXMpOworICBUZW5zb3I8VHlwZSwgMiwgRGF0YUxheW91dD4gcmVkdXhfZ3B1KGRpbV95LCBkaW1feik7CisgIGRldi5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1LmRhdGEoKSwgb3V0X2RhdGEsIGdwdV9vdXQuc2l6ZSgpKnNpemVvZihUeXBlKSk7CisgIGRldi5zeW5jaHJvbml6ZSgpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBncHVfb3V0LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgyKnJlZHV4KGkpLCByZWR1eF9ncHUoaSkpOworICB9CisKKyAgZGV2LmRlYWxsb2NhdGUoaW5fZGF0YSk7CisgIGRldi5kZWFsbG9jYXRlKG91dF9kYXRhKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZSwgaW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnMoKSB7CisgIGludCBkaW1feCA9IDEyODsKKyAgaW50IGRpbV95ID0gMTsKKyAgaW50IGRpbV96ID0gMzM7CisKKyAgVGVuc29yPFR5cGUsIDMsIERhdGFMYXlvdXQ+IGluKGRpbV94LCBkaW1feSwgZGltX3opOworICBpbi5zZXRSYW5kb20oKTsKKworICBFaWdlbjo6YXJyYXk8aW50LCAxPiByZWRfYXhpczsKKyAgcmVkX2F4aXNbMF0gPSAyOworICBUZW5zb3I8VHlwZSwgMiwgRGF0YUxheW91dD4gcmVkdXggPSBpbi5zdW0ocmVkX2F4aXMpOworCisgIC8vIENyZWF0ZSBkZXZpY2UKKyAgRWlnZW46OkN1ZGFTdHJlYW1EZXZpY2Ugc3RyZWFtOworICBFaWdlbjo6R3B1RGV2aWNlIGRldigmc3RyZWFtKTsKKyAgCisgIC8vIENyZWF0ZSBkYXRhCisgIFR5cGUqIGluX2RhdGEgPSAoVHlwZSopZGV2LmFsbG9jYXRlKGRpbV94KmRpbV95KmRpbV96KnNpemVvZihUeXBlKSk7CisgIFR5cGUqIG91dF9kYXRhID0gKFR5cGUqKWRldi5hbGxvY2F0ZShkaW1feCpkaW1feSpzaXplb2YoVHlwZSkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8VHlwZSwgMywgRGF0YUxheW91dD4gPiBncHVfaW4oaW5fZGF0YSwgZGltX3gsIGRpbV95LCBkaW1feik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxUeXBlLCAyLCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQob3V0X2RhdGEsIGRpbV94LCBkaW1feSk7CisgIAorICAvLyBQZXJmb3JtIG9wZXJhdGlvbgorICBkZXYubWVtY3B5SG9zdFRvRGV2aWNlKGluX2RhdGEsIGluLmRhdGEoKSwgaW4uc2l6ZSgpKnNpemVvZihUeXBlKSk7CisgIGdwdV9vdXQuZGV2aWNlKGRldikgPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKKyAgZ3B1X291dC5kZXZpY2UoZGV2KSArPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKKyAgVGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+IHJlZHV4X2dwdShkaW1feCwgZGltX3kpOworICBkZXYubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9kYXRhLCBncHVfb3V0LnNpemUoKSpzaXplb2YoVHlwZSkpOworICBkZXYuc3luY2hyb25pemUoKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3B1X291dC5zaXplKCk7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1goMipyZWR1eChpKSwgcmVkdXhfZ3B1KGkpKTsKKyAgfQorCisgIGRldi5kZWFsbG9jYXRlKGluX2RhdGEpOworICBkZXYuZGVhbGxvY2F0ZShvdXRfZGF0YSk7Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9yZWR1Y3Rpb25fY3VkYSgpIHsKKyAgQ0FMTF9TVUJURVNUXzEoKHRlc3RfZnVsbF9yZWR1Y3Rpb25zPGZsb2F0LCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMSgodGVzdF9mdWxsX3JlZHVjdGlvbnM8ZG91YmxlLCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMigodGVzdF9mdWxsX3JlZHVjdGlvbnM8ZmxvYXQsIFJvd01ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF8yKCh0ZXN0X2Z1bGxfcmVkdWN0aW9uczxkb3VibGUsIFJvd01ham9yPigpKSk7CisgIAorICBDQUxMX1NVQlRFU1RfMygodGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uczxmbG9hdCwgQ29sTWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnM8ZG91YmxlLCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNCgodGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uczxmbG9hdCwgUm93TWFqb3I+KCkpKTsKKy8vIE91dGVyIHJlZHVjdGlvbnMgb2YgZG91YmxlcyBhcmVuJ3Qgc3VwcG9ydGVkIGp1c3QgeWV0LiAgCQkJCQkgICAgICAKKy8vICBDQUxMX1NVQlRFU1RfNCgodGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uczxkb3VibGUsIFJvd01ham9yPigpKSkKKworICBDQUxMX1NVQlRFU1RfNSgodGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zPGZsb2F0LCBDb2xNYWpvcj4oKSkpOworLy8gT3V0ZXIgcmVkdWN0aW9ucyBvZiBkb3VibGVzIGFyZW4ndCBzdXBwb3J0ZWQganVzdCB5ZXQuICAJCQkJCSAgICAgIAorLy8gIENBTExfU1VCVEVTVF81KCh0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnM8ZG91YmxlLCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNigodGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zPGZsb2F0LCBSb3dNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNigodGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zPGRvdWJsZSwgUm93TWFqb3I+KCkpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVmODI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uX3N5Y2wuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNQorLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAorI2RlZmluZSBFSUdFTl9URVNUX0ZVTkMgY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKKyNkZWZpbmUgRUlHRU5fVVNFX1NZQ0wKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UZW5zb3I+CisKKworCitzdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiAgc3ljbF9kZXZpY2UpIHsKKworICBjb25zdCBpbnQgbnVtX3Jvd3MgPSA0NTI7CisgIGNvbnN0IGludCBudW1fY29scyA9IDc2NTsKKyAgYXJyYXk8aW50LCAyPiB0ZW5zb3JSYW5nZSA9IHt7bnVtX3Jvd3MsIG51bV9jb2xzfX07CisKKyAgVGVuc29yPGZsb2F0LCAyPiBpbih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxmbG9hdCwgMD4gZnVsbF9yZWR1eDsKKyAgVGVuc29yPGZsb2F0LCAwPiBmdWxsX3JlZHV4X2dwdTsKKworICBpbi5zZXRSYW5kb20oKTsKKworICBmdWxsX3JlZHV4ID0gaW4uc3VtKCk7CisKKyAgZmxvYXQqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSkpOworICBmbG9hdCogZ3B1X291dF9kYXRhID0oZmxvYXQqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihmbG9hdCkpOworCisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+ID4gIGluX2dwdShncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAwPiA+ICBvdXRfZ3B1KGdwdV9vdXRfZGF0YSk7CisKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKGZsb2F0KSk7CisgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5zdW0oKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLCBzaXplb2YoZmxvYXQpKTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgorICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcmVkdXhfZ3B1KCksIGZ1bGxfcmVkdXgoKSk7CisKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworCisgIGludCBkaW1feCA9IDE0NTsKKyAgaW50IGRpbV95ID0gMTsKKyAgaW50IGRpbV96ID0gNjc7CisKKyAgYXJyYXk8aW50LCAzPiB0ZW5zb3JSYW5nZSA9IHt7ZGltX3gsIGRpbV95LCBkaW1fen19OworICBFaWdlbjo6YXJyYXk8aW50LCAxPiByZWRfYXhpczsKKyAgcmVkX2F4aXNbMF0gPSAwOworICBhcnJheTxpbnQsIDI+IHJlZHVjZWRfdGVuc29yUmFuZ2UgPSB7e2RpbV95LCBkaW1fen19OworCisgIFRlbnNvcjxmbG9hdCwgMz4gaW4odGVuc29yUmFuZ2UpOworICBUZW5zb3I8ZmxvYXQsIDI+IHJlZHV4KHJlZHVjZWRfdGVuc29yUmFuZ2UpOworICBUZW5zb3I8ZmxvYXQsIDI+IHJlZHV4X2dwdShyZWR1Y2VkX3RlbnNvclJhbmdlKTsKKworICBpbi5zZXRSYW5kb20oKTsKKworICByZWR1eD0gaW4uc3VtKHJlZF9heGlzKTsKKworICBmbG9hdCogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoZmxvYXQpKSk7CisgIGZsb2F0KiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSkpOworCisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDM+ID4gIGluX2dwdShncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAyPiA+ICBvdXRfZ3B1KGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CisKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKGZsb2F0KSk7CisgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5zdW0ocmVkX2F4aXMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLCByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KKyAgZm9yKGludCBqPTA7IGo8cmVkdWNlZF90ZW5zb3JSYW5nZVswXTsgaisrICkKKyAgICBmb3IoaW50IGs9MDsgazxyZWR1Y2VkX3RlbnNvclJhbmdlWzFdOyBrKysgKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaixrKSwgcmVkdXgoaixrKSk7CisKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CisKKyAgaW50IGRpbV94ID0gNTY3OworICBpbnQgZGltX3kgPSAxOworICBpbnQgZGltX3ogPSA0NzsKKworICBhcnJheTxpbnQsIDM+IHRlbnNvclJhbmdlID0ge3tkaW1feCwgZGltX3ksIGRpbV96fX07CisgIEVpZ2VuOjphcnJheTxpbnQsIDE+IHJlZF9heGlzOworICByZWRfYXhpc1swXSA9IDI7CisgIGFycmF5PGludCwgMj4gcmVkdWNlZF90ZW5zb3JSYW5nZSA9IHt7ZGltX3gsIGRpbV95fX07CisKKyAgVGVuc29yPGZsb2F0LCAzPiBpbih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxmbG9hdCwgMj4gcmVkdXgocmVkdWNlZF90ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxmbG9hdCwgMj4gcmVkdXhfZ3B1KHJlZHVjZWRfdGVuc29yUmFuZ2UpOworCisgIGluLnNldFJhbmRvbSgpOworCisgIHJlZHV4PSBpbi5zdW0ocmVkX2F4aXMpOworCisgIGZsb2F0KiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKyAgZmxvYXQqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoZmxvYXQpKSk7CisKKyAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMz4gPiAgaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+ID4gIG91dF9ncHUoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnN1bShyZWRfYXhpcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKGZsb2F0KSk7CisgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KKyAgZm9yKGludCBqPTA7IGo8cmVkdWNlZF90ZW5zb3JSYW5nZVswXTsgaisrICkKKyAgICBmb3IoaW50IGs9MDsgazxyZWR1Y2VkX3RlbnNvclJhbmdlWzFdOyBrKysgKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaixrKSwgcmVkdXgoaixrKSk7CisKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKKworfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsKCkgeworICBjbDo6c3ljbDo6Z3B1X3NlbGVjdG9yIHM7CisgIEVpZ2VuOjpTeWNsRGV2aWNlIHN5Y2xfZGV2aWNlKHMpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfZnVsbF9yZWR1Y3Rpb25zX3N5Y2woc3ljbF9kZXZpY2UpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19zeWNsKHN5Y2xfZGV2aWNlKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19zeWNsKHN5Y2xfZGV2aWNlKSkpOworCit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWYuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGYxMDVlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVmLmNwcApAQCAtMCwwICsxLDI0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfbHZhbHVlX3JlZigpCit7CisgIFRlbnNvcjxpbnQsIDE+IGlucHV0KDYpOworICBpbnB1dC5zZXRSYW5kb20oKTsKKworICBUZW5zb3JSZWY8VGVuc29yPGludCwgMT4+IHJlZjMoaW5wdXQpOworICBUZW5zb3JSZWY8VGVuc29yPGludCwgMT4+IHJlZjQgPSBpbnB1dDsKKworICBWRVJJRllfSVNfRVFVQUwocmVmMy5kYXRhKCksIGlucHV0LmRhdGEoKSk7CisgIFZFUklGWV9JU19FUVVBTChyZWY0LmRhdGEoKSwgaW5wdXQuZGF0YSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChyZWYzKGkpLCBpbnB1dChpKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJlZjQoaSksIGlucHV0KGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgcmVmMy5jb2VmZlJlZihpKSA9IGk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoaW5wdXQoaSksIGkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgcmVmNC5jb2VmZlJlZihpKSA9IC1pICogMjsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTChpbnB1dChpKSwgLWkqMik7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9ydmFsdWVfcmVmKCkKK3sKKyAgVGVuc29yPGludCwgMT4gaW5wdXQxKDYpOworICBpbnB1dDEuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxpbnQsIDE+IGlucHV0Mig2KTsKKyAgaW5wdXQyLnNldFJhbmRvbSgpOworCisgIFRlbnNvclJlZjxUZW5zb3I8aW50LCAxPj4gcmVmMyhpbnB1dDEgKyBpbnB1dDIpOworICBUZW5zb3JSZWY8VGVuc29yPGludCwgMT4+IHJlZjQgPSBpbnB1dDEgKyBpbnB1dDI7CisKKyAgVkVSSUZZX0lTX05PVF9FUVVBTChyZWYzLmRhdGEoKSwgaW5wdXQxLmRhdGEoKSk7CisgIFZFUklGWV9JU19OT1RfRVFVQUwocmVmNC5kYXRhKCksIGlucHV0MS5kYXRhKCkpOworICBWRVJJRllfSVNfTk9UX0VRVUFMKHJlZjMuZGF0YSgpLCBpbnB1dDIuZGF0YSgpKTsKKyAgVkVSSUZZX0lTX05PVF9FUVVBTChyZWY0LmRhdGEoKSwgaW5wdXQyLmRhdGEoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwocmVmMyhpKSwgaW5wdXQxKGkpICsgaW5wdXQyKGkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocmVmNChpKSwgaW5wdXQxKGkpICsgaW5wdXQyKGkpKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfZGltcygpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMyw1LDcpOworICBpbnB1dC5zZXRSYW5kb20oKTsKKworICBUZW5zb3JSZWY8VGVuc29yPGZsb2F0LCAzPj4gcmVmKGlucHV0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlZi5kYXRhKCksIGlucHV0LmRhdGEoKSk7CisgIFZFUklGWV9JU19FUVVBTChyZWYuZGltZW5zaW9uKDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlZi5kaW1lbnNpb24oMSksIDUpOworICBWRVJJRllfSVNfRVFVQUwocmVmLmRpbWVuc2lvbigyKSwgNyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlZihpLGosayksIGlucHV0KGksaixrKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9zbGljZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNT4gdGVuc29yKDIsMyw1LDcsMTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMoMSwyLDMsNCw1KTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IHNpemVzKDEsMSwxLDEsMSk7CisgIFRlbnNvclJlZjxUZW5zb3I8ZmxvYXQsIDU+PiBzbGljZSA9IHRlbnNvci5zbGljZShpbmRpY2VzLCBzaXplcyk7CisgIFZFUklGWV9JU19FUVVBTChzbGljZSgwLDAsMCwwLDApLCB0ZW5zb3IoMSwyLDMsNCw1KSk7CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMyKDEsMSwzLDQsNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplczIoMSwxLDIsMiwzKTsKKyAgc2xpY2UgPSB0ZW5zb3Iuc2xpY2UoaW5kaWNlczIsIHNpemVzMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZSgwLDAsaSxqLGspLCB0ZW5zb3IoMSwxLDMraSw0K2osNStrKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMzKDAsMCwwLDAsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplczMoMiwzLDEsMSwxKTsKKyAgc2xpY2UgPSB0ZW5zb3Iuc2xpY2UoaW5kaWNlczMsIHNpemVzMyk7CisgIFZFUklGWV9JU19FUVVBTChzbGljZS5kYXRhKCksIHRlbnNvci5kYXRhKCkpOworfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfcmVmX29mX3JlZigpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMyw1LDcpOworICBpbnB1dC5zZXRSYW5kb20oKTsKKworICBUZW5zb3JSZWY8VGVuc29yPGZsb2F0LCAzPj4gcmVmKGlucHV0KTsKKyAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgMz4+IHJlZl9vZl9yZWYocmVmKTsKKyAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgMz4+IHJlZl9vZl9yZWYyOworICByZWZfb2ZfcmVmMiA9IHJlZjsKKworICBWRVJJRllfSVNfRVFVQUwocmVmX29mX3JlZi5kYXRhKCksIGlucHV0LmRhdGEoKSk7CisgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmLmRpbWVuc2lvbigxKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmLmRpbWVuc2lvbigyKSwgNyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJlZl9vZl9yZWYyLmRhdGEoKSwgaW5wdXQuZGF0YSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlZl9vZl9yZWYyLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmMi5kaW1lbnNpb24oMSksIDUpOworICBWRVJJRllfSVNfRVFVQUwocmVmX29mX3JlZjIuZGltZW5zaW9uKDIpLCA3KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVmX29mX3JlZihpLGosayksIGlucHV0KGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmMihpLGosayksIGlucHV0KGksaixrKSk7CisgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X3JlZl9pbl9leHByKCkKK3sKKyAgVGVuc29yPGZsb2F0LCAzPiBpbnB1dCgzLDUsNyk7CisgIGlucHV0LnNldFJhbmRvbSgpOworICBUZW5zb3JSZWY8VGVuc29yPGZsb2F0LCAzPj4gaW5wdXRfcmVmKGlucHV0KTsKKworICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCgzLDUsNyk7CisgIHJlc3VsdC5zZXRSYW5kb20oKTsKKyAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgMz4+IHJlc3VsdF9yZWYocmVzdWx0KTsKKworICBUZW5zb3I8ZmxvYXQsIDM+IGJpYXMoMyw1LDcpOworICBiaWFzLnNldFJhbmRvbSgpOworCisgIHJlc3VsdF9yZWYgPSBpbnB1dF9yZWYgKyBiaWFzOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3JlZihpLGosayksIGlucHV0KGksaixrKSArIGJpYXMoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX05PVF9FUVVBTChyZXN1bHQoaSxqLGspLCBpbnB1dChpLGosaykgKyBiaWFzKGksaixrKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVzdWx0ID0gcmVzdWx0X3JlZjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayksIGlucHV0KGksaixrKSArIGJpYXMoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X2NvZWZmX3JlZigpCit7CisgIFRlbnNvcjxmbG9hdCwgNT4gdGVuc29yKDIsMyw1LDcsMTEpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgNT4gb3JpZ2luYWwgPSB0ZW5zb3I7CisKKyAgVGVuc29yUmVmPFRlbnNvcjxmbG9hdCwgND4+IHNsaWNlID0gdGVuc29yLmNoaXAoNywgNCk7CisgIHNsaWNlLmNvZWZmUmVmKDAsIDAsIDAsIDApID0gMS4wZjsKKyAgc2xpY2UuY29lZmZSZWYoMSwgMCwgMCwgMCkgKz0gMi4wZjsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDAsMCwwLDAsNyksIDEuMGYpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDEsMCwwLDAsNyksIG9yaWdpbmFsKDEsMCwwLDAsNykgKyAyLjBmKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXN0X25lc3RlZF9vcHNfd2l0aF9yZWYoKQoreworICBUZW5zb3I8ZmxvYXQsIDQ+IHQoMiwgMywgNSwgNyk7CisgIHQuc2V0UmFuZG9tKCk7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDQ+ID4gbSh0LmRhdGEoKSwgMiwgMywgNSwgNyk7CisgIGFycmF5PHN0ZDo6cGFpcjxwdHJkaWZmX3QsIHB0cmRpZmZfdD4sIDQ+IHBhZGRpbmdzOworICBwYWRkaW5nc1swXSA9IHN0ZDo6bWFrZV9wYWlyKDAsIDApOworICBwYWRkaW5nc1sxXSA9IHN0ZDo6bWFrZV9wYWlyKDIsIDEpOworICBwYWRkaW5nc1syXSA9IHN0ZDo6bWFrZV9wYWlyKDMsIDQpOworICBwYWRkaW5nc1szXSA9IHN0ZDo6bWFrZV9wYWlyKDAsIDApOworICBEU2l6ZXM8RWlnZW46OkRlbnNlSW5kZXgsIDQ+IHNodWZmbGVfZGltcygwLCAxLCAyLCAzKTsKKyAgVGVuc29yUmVmPFRlbnNvcjxjb25zdCBmbG9hdCwgND4gPiByZWYobS5wYWQocGFkZGluZ3MpKTsKKyAgYXJyYXk8c3RkOjpwYWlyPHB0cmRpZmZfdCwgcHRyZGlmZl90PiwgND4gdHJpdmlhbDsKKyAgdHJpdmlhbFswXSA9IHN0ZDo6bWFrZV9wYWlyKDAsIDApOworICB0cml2aWFsWzFdID0gc3RkOjptYWtlX3BhaXIoMCwgMCk7CisgIHRyaXZpYWxbMl0gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgdHJpdmlhbFszXSA9IHN0ZDo6bWFrZV9wYWlyKDAsIDApOworICBUZW5zb3I8ZmxvYXQsIDQ+IHBhZGRlZCA9IHJlZi5zaHVmZmxlKHNodWZmbGVfZGltcykucGFkKHRyaXZpYWwpOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigwKSwgMiswKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMSksIDMrMyk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDIpLCA1KzcpOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigzKSwgNyswKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDEyOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBpZiAoaiA+PSAyICYmIGogPCA1ICYmIGsgPj0gMyAmJiBrIDwgOCkgeworICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZChpLGosayxsKSwgdChpLGotMixrLTMsbCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksaixrLGwpLCAwLjBmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3JlZigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9sdmFsdWVfcmVmKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcnZhbHVlX3JlZigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfbXVsdGlwbGVfZGltcygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2xpY2UoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZl9vZl9yZWYoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3JlZl9pbl9leHByKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jb2VmZl9yZWYoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X25lc3RlZF9vcHNfd2l0aF9yZWYoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JldmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWI4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgTmF2ZGVlcCBKYWl0bHkgPG5kamFpdGx5QGdvb2dsZS5jb20gYW5kCisvLyAgICAgICAgICAgICAgICAgICAgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjphcnJheTsKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfcmV2ZXJzZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgYXJyYXk8Ym9vbCwgND4gZGltX3JldjsKKyAgZGltX3JldlswXSA9IGZhbHNlOworICBkaW1fcmV2WzFdID0gdHJ1ZTsKKyAgZGltX3JldlsyXSA9IHRydWU7CisgIGRpbV9yZXZbM10gPSBmYWxzZTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJldmVyc2VkX3RlbnNvcjsKKyAgcmV2ZXJzZWRfdGVuc29yID0gdGVuc29yLnJldmVyc2UoZGltX3Jldik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZXZlcnNlZF90ZW5zb3IuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMyksIDcpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgcmV2ZXJzZWRfdGVuc29yKGksMi1qLDQtayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBkaW1fcmV2WzBdID0gdHJ1ZTsKKyAgZGltX3JldlsxXSA9IGZhbHNlOworICBkaW1fcmV2WzJdID0gZmFsc2U7CisgIGRpbV9yZXZbM10gPSBmYWxzZTsKKworICByZXZlcnNlZF90ZW5zb3IgPSB0ZW5zb3IucmV2ZXJzZShkaW1fcmV2KTsKKworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChyZXZlcnNlZF90ZW5zb3IuZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbigzKSwgNyk7CisKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHJldmVyc2VkX3RlbnNvcigxLWksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGRpbV9yZXZbMF0gPSB0cnVlOworICBkaW1fcmV2WzFdID0gZmFsc2U7CisgIGRpbV9yZXZbMl0gPSBmYWxzZTsKKyAgZGltX3JldlszXSA9IHRydWU7CisKKyAgcmV2ZXJzZWRfdGVuc29yID0gdGVuc29yLnJldmVyc2UoZGltX3Jldik7CisKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZXZlcnNlZF90ZW5zb3IuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMyksIDcpOworCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCByZXZlcnNlZF90ZW5zb3IoMS1pLGosayw2LWwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhwcl9yZXZlcnNlKGJvb2wgTFZhbHVlKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIGFycmF5PGJvb2wsIDQ+IGRpbV9yZXY7CisgIGRpbV9yZXZbMF0gPSBmYWxzZTsKKyAgZGltX3JldlsxXSA9IHRydWU7CisgIGRpbV9yZXZbMl0gPSBmYWxzZTsKKyAgZGltX3JldlszXSA9IHRydWU7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBleHBlY3RlZCgyLCAzLCA1LCA3KTsKKyAgaWYgKExWYWx1ZSkgeworICAgIGV4cGVjdGVkLnJldmVyc2UoZGltX3JldikgPSB0ZW5zb3I7CisgIH0gZWxzZSB7CisgICAgZXhwZWN0ZWQgPSB0ZW5zb3IucmV2ZXJzZShkaW1fcmV2KTsKKyAgfQorCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmVzdWx0KDIsMyw1LDcpOworCisgIGFycmF5PHB0cmRpZmZfdCwgND4gc3JjX3NsaWNlX2RpbTsKKyAgc3JjX3NsaWNlX2RpbVswXSA9IDI7CisgIHNyY19zbGljZV9kaW1bMV0gPSAzOworICBzcmNfc2xpY2VfZGltWzJdID0gMTsKKyAgc3JjX3NsaWNlX2RpbVszXSA9IDc7CisgIGFycmF5PHB0cmRpZmZfdCwgND4gc3JjX3NsaWNlX3N0YXJ0OworICBzcmNfc2xpY2Vfc3RhcnRbMF0gPSAwOworICBzcmNfc2xpY2Vfc3RhcnRbMV0gPSAwOworICBzcmNfc2xpY2Vfc3RhcnRbMl0gPSAwOworICBzcmNfc2xpY2Vfc3RhcnRbM10gPSAwOworICBhcnJheTxwdHJkaWZmX3QsIDQ+IGRzdF9zbGljZV9kaW0gPSBzcmNfc2xpY2VfZGltOworICBhcnJheTxwdHJkaWZmX3QsIDQ+IGRzdF9zbGljZV9zdGFydCA9IHNyY19zbGljZV9zdGFydDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGlmIChMVmFsdWUpIHsKKyAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikgPQorICAgICAgICAgIHRlbnNvci5zbGljZShzcmNfc2xpY2Vfc3RhcnQsIHNyY19zbGljZV9kaW0pOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKSA9CisgICAgICAgICAgdGVuc29yLnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KTsKKyAgICB9CisgICAgc3JjX3NsaWNlX3N0YXJ0WzJdICs9IDE7CisgICAgZHN0X3NsaWNlX3N0YXJ0WzJdICs9IDE7CisgIH0KKworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgNyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5kaW1lbnNpb24oMCk7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDEpOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDIpOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBleHBlY3RlZC5kaW1lbnNpb24oMyk7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGssbCksIGV4cGVjdGVkKGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGRzdF9zbGljZV9zdGFydFsyXSA9IDA7CisgIHJlc3VsdC5zZXRSYW5kb20oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgaWYgKExWYWx1ZSkgeworICAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikgPQorICAgICAgICAgICB0ZW5zb3Iuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICByZXN1bHQuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKSA9CisgICAgICAgICAgIHRlbnNvci5yZXZlcnNlKGRpbV9yZXYpLnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSk7CisgICAgIH0KKyAgICBkc3Rfc2xpY2Vfc3RhcnRbMl0gKz0gMTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDApOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmRpbWVuc2lvbigxKTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IGV4cGVjdGVkLmRpbWVuc2lvbigyKTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDMpOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrLGwpLCBleHBlY3RlZChpLGosayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3JldmVyc2UoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcmV2ZXJzZTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9yZXZlcnNlPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZXhwcl9yZXZlcnNlPENvbE1ham9yPih0cnVlKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2V4cHJfcmV2ZXJzZTxSb3dNYWpvcj4odHJ1ZSkpOworICBDQUxMX1NVQlRFU1QodGVzdF9leHByX3JldmVyc2U8Q29sTWFqb3I+KGZhbHNlKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2V4cHJfcmV2ZXJzZTxSb3dNYWpvcj4oZmFsc2UpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JvdW5kaW5ncy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yb3VuZGluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjYxNTEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yb3VuZGluZ3MuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKKworc3RhdGljIHZvaWQgdGVzdF9mbG9hdF9yb3VuZGluZygpCit7CisgIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwzMCk7CisgIGZ0ZW5zb3IgPSBmdGVuc29yLnJhbmRvbSgpICogMTAwLmY7CisKKyAgVGVuc29yPGZsb2F0LCAyPiByZXN1bHQgPSBmdGVuc29yLnJvdW5kKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMDsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaiksIG51bWV4dDo6cm91bmQoZnRlbnNvcihpLGopKSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZmxvYXRfZmxvb3JpbmcoKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsMzApOworICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMC5mOworCisgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gZnRlbnNvci5mbG9vcigpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzA7ICsraikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGopLCBudW1leHQ6OmZsb29yKGZ0ZW5zb3IoaSxqKSkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2Zsb2F0X2NlaWxpbmcoKQoreworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsMzApOworICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMC5mOworCisgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gZnRlbnNvci5jZWlsKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMDsgKytqKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaiksIG51bWV4dDo6Y2VpbChmdGVuc29yKGksaikpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9yb3VuZGluZ3MoKQoreworICAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfcm91bmRpbmcoKSk7CisgICBDQUxMX1NVQlRFU1QodGVzdF9mbG9hdF9jZWlsaW5nKCkpOworICAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfZmxvb3JpbmcoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTlhYTMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuLmNwcApAQCAtMCwwICsxLDExMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgSWdvciBCYWJ1c2Noa2luIDxpZ29yQGJhYnVzY2hrLmluPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgVHlwZT1mbG9hdCwgYm9vbCBFeGNsdXNpdmUgPSBmYWxzZT4KK3N0YXRpYyB2b2lkIHRlc3RfMWRfc2NhbigpCit7CisgIGludCBzaXplID0gNTA7CisgIFRlbnNvcjxUeXBlLCAxLCBEYXRhTGF5b3V0PiB0ZW5zb3Ioc2l6ZSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgVGVuc29yPFR5cGUsIDEsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvci5jdW1zdW0oMCwgRXhjbHVzaXZlKTsKKworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRpbWVuc2lvbigwKSwgcmVzdWx0LmRpbWVuc2lvbigwKSk7CisKKyAgZmxvYXQgYWNjdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGlmIChFeGNsdXNpdmUpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSksIGFjY3VtKTsKKyAgICAgIGFjY3VtICs9IHRlbnNvcihpKTsKKyAgICB9IGVsc2UgeworICAgICAgYWNjdW0gKz0gdGVuc29yKGkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpKSwgYWNjdW0pOworICAgIH0KKyAgfQorCisgIGFjY3VtID0gMTsKKyAgcmVzdWx0ID0gdGVuc29yLmN1bXByb2QoMCwgRXhjbHVzaXZlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAoRXhjbHVzaXZlKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGkpLCBhY2N1bSk7CisgICAgICBhY2N1bSAqPSB0ZW5zb3IoaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFjY3VtICo9IHRlbnNvcihpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSksIGFjY3VtKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBUeXBlPWZsb2F0Pgorc3RhdGljIHZvaWQgdGVzdF80ZF9zY2FuKCkKK3sKKyAgaW50IHNpemUgPSA1OworICBUZW5zb3I8VHlwZSwgNCwgRGF0YUxheW91dD4gdGVuc29yKHNpemUsIHNpemUsIHNpemUsIHNpemUpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPFR5cGUsIDQsIERhdGFMYXlvdXQ+IHJlc3VsdChzaXplLCBzaXplLCBzaXplLCBzaXplKTsKKworICByZXN1bHQgPSB0ZW5zb3IuY3Vtc3VtKDApOworICBmbG9hdCBhY2N1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgYWNjdW0gKz0gdGVuc29yKGksIDEsIDIsIDMpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgMSwgMiwgMyksIGFjY3VtKTsKKyAgfQorICByZXN1bHQgPSB0ZW5zb3IuY3Vtc3VtKDEpOworICBhY2N1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgYWNjdW0gKz0gdGVuc29yKDEsIGksIDIsIDMpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoMSwgaSwgMiwgMyksIGFjY3VtKTsKKyAgfQorICByZXN1bHQgPSB0ZW5zb3IuY3Vtc3VtKDIpOworICBhY2N1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgYWNjdW0gKz0gdGVuc29yKDEsIDIsIGksIDMpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoMSwgMiwgaSwgMyksIGFjY3VtKTsKKyAgfQorICByZXN1bHQgPSB0ZW5zb3IuY3Vtc3VtKDMpOworICBhY2N1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgYWNjdW0gKz0gdGVuc29yKDEsIDIsIDMsIGkpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoMSwgMiwgMywgaSksIGFjY3VtKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9tYXBzKCkgeworICBpbnQgaW5wdXRzWzIwXTsKKyAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDEsIERhdGFMYXlvdXQ+ID4gdGVuc29yX21hcChpbnB1dHMsIDIwKTsKKyAgdGVuc29yX21hcC5zZXRSYW5kb20oKTsKKworICBUZW5zb3I8aW50LCAxLCBEYXRhTGF5b3V0PiByZXN1bHQgPSB0ZW5zb3JfbWFwLmN1bXN1bSgwKTsKKworICBpbnQgYWNjdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICBhY2N1bSArPSB0ZW5zb3JfbWFwKGkpOworICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSksIGFjY3VtKTsKKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3NjYW4oKSB7CisgIENBTExfU1VCVEVTVCgodGVzdF8xZF9zY2FuPENvbE1ham9yLCBmbG9hdCwgdHJ1ZT4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfMWRfc2NhbjxDb2xNYWpvciwgZmxvYXQsIGZhbHNlPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF8xZF9zY2FuPFJvd01ham9yLCBmbG9hdCwgdHJ1ZT4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfMWRfc2NhbjxSb3dNYWpvciwgZmxvYXQsIGZhbHNlPigpKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzRkX3NjYW48Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF80ZF9zY2FuPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdGVuc29yX21hcHM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3JfbWFwczxSb3dNYWpvcj4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuX2N1ZGEuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuX2N1ZGEuY3UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNDZmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fY3VkYS5jdQpAQCAtMCwwICsxLDc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNiBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQorI2RlZmluZSBFSUdFTl9URVNUX05PX0NPTVBMRVgKKyNkZWZpbmUgRUlHRU5fVEVTVF9GVU5DIGN4eDExX3RlbnNvcl9zY2FuX2N1ZGEKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIGludAorI2RlZmluZSBFSUdFTl9VU0VfR1BVCisKKyNpZiBkZWZpbmVkIF9fQ1VEQUNDX1ZFUl9fICYmIF9fQ1VEQUNDX1ZFUl9fID49IDcwNTAwCisjaW5jbHVkZSA8Y3VkYV9mcDE2Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CisKK3RlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2N1ZGFfY3Vtc3VtKGludCBtX3NpemUsIGludCBrX3NpemUsIGludCBuX3NpemUpCit7CisgIHN0ZDo6Y291dCA8PCAiVGVzdGluZyBmb3IgKCIgPDwgbV9zaXplIDw8ICIsIiA8PCBrX3NpemUgPDwgIiwiIDw8IG5fc2l6ZSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRfaW5wdXQobV9zaXplLCBrX3NpemUsIG5fc2l6ZSk7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9yZXN1bHQobV9zaXplLCBrX3NpemUsIG5fc2l6ZSk7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9yZXN1bHRfZ3B1KG1fc2l6ZSwga19zaXplLCBuX3NpemUpOworCisgIHRfaW5wdXQuc2V0UmFuZG9tKCk7CisKKyAgc3RkOjpzaXplX3QgdF9pbnB1dF9ieXRlcyA9IHRfaW5wdXQuc2l6ZSgpICAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6c2l6ZV90IHRfcmVzdWx0X2J5dGVzID0gdF9yZXN1bHQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKKworICBmbG9hdCogZF90X2lucHV0OworICBmbG9hdCogZF90X3Jlc3VsdDsKKworICBjdWRhTWFsbG9jKCh2b2lkKiopKCZkX3RfaW5wdXQpLCB0X2lucHV0X2J5dGVzKTsKKyAgY3VkYU1hbGxvYygodm9pZCoqKSgmZF90X3Jlc3VsdCksIHRfcmVzdWx0X2J5dGVzKTsKKworICBjdWRhTWVtY3B5KGRfdF9pbnB1dCwgdF9pbnB1dC5kYXRhKCksIHRfaW5wdXRfYnl0ZXMsIGN1ZGFNZW1jcHlIb3N0VG9EZXZpY2UpOworCisgIEVpZ2VuOjpDdWRhU3RyZWFtRGV2aWNlIHN0cmVhbTsKKyAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOworCisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfaW5wdXQoZF90X2lucHV0LCBFaWdlbjo6YXJyYXk8aW50LCAzPihtX3NpemUsIGtfc2l6ZSwgbl9zaXplKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gPgorICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQsIEVpZ2VuOjphcnJheTxpbnQsIDM+KG1fc2l6ZSwga19zaXplLCBuX3NpemUpKTsKKworICBncHVfdF9yZXN1bHQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3RfaW5wdXQuY3Vtc3VtKDEpOworICB0X3Jlc3VsdCA9IHRfaW5wdXQuY3Vtc3VtKDEpOworCisgIGN1ZGFNZW1jcHkodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwgdF9yZXN1bHRfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QpOworICBmb3IgKERlbnNlSW5kZXggaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgeworICAgIGlmIChmYWJzKHRfcmVzdWx0KGkpIC0gdF9yZXN1bHRfZ3B1KGkpKSA8IDFlLTRmKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoaSksIHRfcmVzdWx0X2dwdShpKSwgMWUtNGYpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKQorICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgIHRfcmVzdWx0X2dwdShpKSA8PCBzdGQ6OmVuZGw7CisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgfQorCisgIGN1ZGFGcmVlKCh2b2lkKilkX3RfaW5wdXQpOworICBjdWRhRnJlZSgodm9pZCopZF90X3Jlc3VsdCk7Cit9CisKKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9zY2FuX2N1ZGEoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2N1ZGFfY3Vtc3VtPENvbE1ham9yPigxMjgsIDEyOCwgMTI4KSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfY3VkYV9jdW1zdW08Um93TWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NodWZmbGluZy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zaHVmZmxpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zaHVmZmxpbmcuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBCZW5vaXQgU3RlaW5lciA8YmVub2l0LnN0ZWluZXIuZ29vZ0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6VGVuc29yOwordXNpbmcgRWlnZW46OmFycmF5OworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zaHVmZmxpbmcoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICBhcnJheTxwdHJkaWZmX3QsIDQ+IHNodWZmbGVzOworICBzaHVmZmxlc1swXSA9IDA7CisgIHNodWZmbGVzWzFdID0gMTsKKyAgc2h1ZmZsZXNbMl0gPSAyOworICBzaHVmZmxlc1szXSA9IDM7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBub19zaHVmZmxlOworICBub19zaHVmZmxlID0gdGVuc29yLnNodWZmbGUoc2h1ZmZsZXMpOworCisgIFZFUklGWV9JU19FUVVBTChub19zaHVmZmxlLmRpbWVuc2lvbigwKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChub19zaHVmZmxlLmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChub19zaHVmZmxlLmRpbWVuc2lvbigyKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChub19zaHVmZmxlLmRpbWVuc2lvbigzKSwgNyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBub19zaHVmZmxlKGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNodWZmbGVzWzBdID0gMjsKKyAgc2h1ZmZsZXNbMV0gPSAzOworICBzaHVmZmxlc1syXSA9IDE7CisgIHNodWZmbGVzWzNdID0gMDsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBzaHVmZmxlOworICBzaHVmZmxlID0gdGVuc29yLnNodWZmbGUoc2h1ZmZsZXMpOworCisgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlLmRpbWVuc2lvbigwKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlLmRpbWVuc2lvbigxKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlLmRpbWVuc2lvbigyKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlLmRpbWVuc2lvbigzKSwgMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBzaHVmZmxlKGssbCxqLGkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhwcl9zaHVmZmxpbmcoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworCisgIGFycmF5PHB0cmRpZmZfdCwgND4gc2h1ZmZsZXM7CisgIHNodWZmbGVzWzBdID0gMjsKKyAgc2h1ZmZsZXNbMV0gPSAzOworICBzaHVmZmxlc1syXSA9IDE7CisgIHNodWZmbGVzWzNdID0gMDsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBleHBlY3RlZDsKKyAgZXhwZWN0ZWQgPSB0ZW5zb3Iuc2h1ZmZsZShzaHVmZmxlcyk7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiByZXN1bHQoNSw3LDMsMik7CisKKyAgYXJyYXk8aW50LCA0PiBzcmNfc2xpY2VfZGlte3syLDMsMSw3fX07CisgIGFycmF5PGludCwgND4gc3JjX3NsaWNlX3N0YXJ0e3swLDAsMCwwfX07CisgIGFycmF5PGludCwgND4gZHN0X3NsaWNlX2RpbXt7MSw3LDMsMn19OworICBhcnJheTxpbnQsIDQ+IGRzdF9zbGljZV9zdGFydHt7MCwwLDAsMH19OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkgPQorICAgICAgICB0ZW5zb3Iuc2xpY2Uoc3JjX3NsaWNlX3N0YXJ0LCBzcmNfc2xpY2VfZGltKS5zaHVmZmxlKHNodWZmbGVzKTsKKyAgICBzcmNfc2xpY2Vfc3RhcnRbMl0gKz0gMTsKKyAgICBkc3Rfc2xpY2Vfc3RhcnRbMF0gKz0gMTsKKyAgfQorCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIDcpOworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDMpLCAyKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmRpbWVuc2lvbigwKTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5kaW1lbnNpb24oMSk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHBlY3RlZC5kaW1lbnNpb24oMik7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGV4cGVjdGVkLmRpbWVuc2lvbigzKTsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayxsKSwgZXhwZWN0ZWQoaSxqLGssbCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZHN0X3NsaWNlX3N0YXJ0WzBdID0gMDsKKyAgcmVzdWx0LnNldFJhbmRvbSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pID0KKyAgICAgICAgdGVuc29yLnNodWZmbGUoc2h1ZmZsZXMpLnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSk7CisgICAgZHN0X3NsaWNlX3N0YXJ0WzBdICs9IDE7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmRpbWVuc2lvbigwKTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5kaW1lbnNpb24oMSk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHBlY3RlZC5kaW1lbnNpb24oMik7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGV4cGVjdGVkLmRpbWVuc2lvbigzKTsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayxsKSwgZXhwZWN0ZWQoaSxqLGssbCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaHVmZmxpbmdfYXNfdmFsdWUoKQoreworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICBhcnJheTxwdHJkaWZmX3QsIDQ+IHNodWZmbGVzOworICBzaHVmZmxlc1syXSA9IDA7CisgIHNodWZmbGVzWzNdID0gMTsKKyAgc2h1ZmZsZXNbMV0gPSAyOworICBzaHVmZmxlc1swXSA9IDM7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gc2h1ZmZsZSg1LDcsMywyKTsKKyAgc2h1ZmZsZS5zaHVmZmxlKHNodWZmbGVzKSA9IHRlbnNvcjsKKworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMCksIDUpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMSksIDcpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMiksIDMpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMyksIDIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgc2h1ZmZsZShrLGwsaixpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBhcnJheTxwdHJkaWZmX3QsIDQ+IG5vX3NodWZmbGU7CisgIG5vX3NodWZmbGVbMF0gPSAwOworICBub19zaHVmZmxlWzFdID0gMTsKKyAgbm9fc2h1ZmZsZVsyXSA9IDI7CisgIG5vX3NodWZmbGVbM10gPSAzOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUyKDUsNywzLDIpOworICBzaHVmZmxlMi5zaHVmZmxlKHNodWZmbGVzKSA9IHRlbnNvci5zaHVmZmxlKG5vX3NodWZmbGUpOworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDI7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlMihpLGosayxsKSwgc2h1ZmZsZShpLGosayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NodWZmbGVfdW5zaHVmZmxlKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICAvLyBDaG9vc2UgYSByYW5kb20gcGVybXV0YXRpb24uCisgIGFycmF5PHB0cmRpZmZfdCwgND4gc2h1ZmZsZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgc2h1ZmZsZXNbaV0gPSBpOworICB9CisgIGFycmF5PHB0cmRpZmZfdCwgND4gc2h1ZmZsZXNfaW52ZXJzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBwdHJkaWZmX3QgaW5kZXggPSBpbnRlcm5hbDo6cmFuZG9tPHB0cmRpZmZfdD4oaSwgMyk7CisgICAgc2h1ZmZsZXNfaW52ZXJzZVtzaHVmZmxlc1tpbmRleF1dID0gaTsKKyAgICBzdGQ6OnN3YXAoc2h1ZmZsZXNbaV0sIHNodWZmbGVzW2luZGV4XSk7CisgIH0KKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGU7CisgIHNodWZmbGUgPSB0ZW5zb3Iuc2h1ZmZsZShzaHVmZmxlcykuc2h1ZmZsZShzaHVmZmxlc19pbnZlcnNlKTsKKworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMyksIDcpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgc2h1ZmZsZShpLGosayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3NodWZmbGluZygpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9zaHVmZmxpbmc8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfc2h1ZmZsaW5nPFJvd01ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZXhwcl9zaHVmZmxpbmc8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9leHByX3NodWZmbGluZzxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NodWZmbGluZ19hc192YWx1ZTxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NodWZmbGluZ19hc192YWx1ZTxSb3dNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NodWZmbGVfdW5zaHVmZmxlPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2h1ZmZsZV91bnNodWZmbGU8Um93TWFqb3I+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2ltcGxlLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NpbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwZDMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NpbXBsZS5jcHAKQEAgLTAsMCArMSwzMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBTZWlsZXIgPGNocmlzdGlhbkBpd2FrZC5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6Um93TWFqb3I7CisKK3N0YXRpYyB2b2lkIHRlc3RfMGQoKQoreworICBUZW5zb3I8aW50LCAwPiBzY2FsYXIxOworICBUZW5zb3I8aW50LCAwLCBSb3dNYWpvcj4gc2NhbGFyMjsKKyAgVGVuc29yPGludCwgMD4gc2NhbGFyMzsKKyAgVGVuc29yPGludCwgMCwgUm93TWFqb3I+IHNjYWxhcjQ7CisKKyAgc2NhbGFyMy5yZXNpemUoKTsKKyAgc2NhbGFyNC5yZXNpemUoKTsKKworICBzY2FsYXIxKCkgPSA3OworICBzY2FsYXIyKCkgPSAxMzsKKyAgc2NhbGFyMy5zZXRWYWx1ZXMoMTcpOworICBzY2FsYXI0LnNldFplcm8oKTsKKworICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyMS5yYW5rKCksIDApOworICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyMS5zaXplKCksIDEpOworCisgIFZFUklGWV9JU19FUVVBTChzY2FsYXIxKCksIDcpOworICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyMigpLCAxMyk7CisgIFZFUklGWV9JU19FUVVBTChzY2FsYXIzKCksIDE3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjQoKSwgMCk7CisKKyAgVGVuc29yPGludCwgMD4gc2NhbGFyNShzY2FsYXIxKTsKKworICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyNSgpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjUuZGF0YSgpWzBdLCA3KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF8xZCgpCit7CisgIFRlbnNvcjxpbnQsIDE+IHZlYzEoNik7CisgIFRlbnNvcjxpbnQsIDEsIFJvd01ham9yPiB2ZWMyKDYpOworICBUZW5zb3I8aW50LCAxPiB2ZWMzOworICBUZW5zb3I8aW50LCAxLCBSb3dNYWpvcj4gdmVjNDsKKworICB2ZWMzLnJlc2l6ZSg2KTsKKyAgdmVjNC5yZXNpemUoNik7CisKKyAgdmVjMSgwKSA9IDQ7ICB2ZWMyKDApID0gMDsgdmVjMygwKSA9IDU7CisgIHZlYzEoMSkgPSA4OyAgdmVjMigxKSA9IDE7IHZlYzMoMSkgPSA0OworICB2ZWMxKDIpID0gMTU7IHZlYzIoMikgPSAyOyB2ZWMzKDIpID0gMzsKKyAgdmVjMSgzKSA9IDE2OyB2ZWMyKDMpID0gMzsgdmVjMygzKSA9IDI7CisgIHZlYzEoNCkgPSAyMzsgdmVjMig0KSA9IDQ7IHZlYzMoNCkgPSAxOworICB2ZWMxKDUpID0gNDI7IHZlYzIoNSkgPSA1OyB2ZWMzKDUpID0gMDsKKyAgdmVjNC5zZXRaZXJvKCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxLnJhbmsoKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzEuc2l6ZSgpKSwgNik7CisgIFZFUklGWV9JU19FUVVBTCgodmVjMS5kaW1lbnNpb25zKClbMF0pLCA2KTsKKworICBWRVJJRllfSVNfRVFVQUwoKHZlYzFbMF0pLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxWzFdKSwgOCk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjMVsyXSksIDE1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMxWzNdKSwgMTYpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzFbNF0pLCAyMyk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjMVs1XSksIDQyKTsKKworICBWRVJJRllfSVNfRVFVQUwoKHZlYzJbMF0pLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMyWzFdKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjMlsyXSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzJbM10pLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMyWzRdKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjMls1XSksIDUpOworCisgIFZFUklGWV9JU19FUVVBTCgodmVjM1swXSksIDUpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzNbMV0pLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMzWzJdKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjM1szXSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzNbNF0pLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWMzWzVdKSwgMCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWM0WzBdKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjNFsxXSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzRbMl0pLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWM0WzNdKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgodmVjNFs0XSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzRbNV0pLCAwKTsKKworICBUZW5zb3I8aW50LCAxPiB2ZWM1KHZlYzEpOworCisgIFZFUklGWV9JU19FUVVBTCgodmVjNSgwKSksIDQpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUoMSkpLCA4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWM1KDIpKSwgMTUpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUoMykpLCAxNik7CisgIFZFUklGWV9JU19FUVVBTCgodmVjNSg0KSksIDIzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWM1KDUpKSwgNDIpOworCisgIFZFUklGWV9JU19FUVVBTCgodmVjNS5kYXRhKClbMF0pLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh2ZWM1LmRhdGEoKVsxXSksIDgpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUuZGF0YSgpWzJdKSwgMTUpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUuZGF0YSgpWzNdKSwgMTYpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUuZGF0YSgpWzRdKSwgMjMpOworICBWRVJJRllfSVNfRVFVQUwoKHZlYzUuZGF0YSgpWzVdKSwgNDIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0XzJkKCkKK3sKKyAgVGVuc29yPGludCwgMj4gbWF0MSgyLDMpOworICBUZW5zb3I8aW50LCAyLCBSb3dNYWpvcj4gbWF0MigyLDMpOworCisgIG1hdDEoMCwwKSA9IDA7CisgIG1hdDEoMCwxKSA9IDE7CisgIG1hdDEoMCwyKSA9IDI7CisgIG1hdDEoMSwwKSA9IDM7CisgIG1hdDEoMSwxKSA9IDQ7CisgIG1hdDEoMSwyKSA9IDU7CisKKyAgbWF0MigwLDApID0gMDsKKyAgbWF0MigwLDEpID0gMTsKKyAgbWF0MigwLDIpID0gMjsKKyAgbWF0MigxLDApID0gMzsKKyAgbWF0MigxLDEpID0gNDsKKyAgbWF0MigxLDIpID0gNTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEucmFuaygpKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCgobWF0MS5zaXplKCkpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbnMoKVswXSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuZGltZW5zaW9ucygpWzFdKSwgMyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQyLnJhbmsoKSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDIuc2l6ZSgpKSwgNik7CisgIFZFUklGWV9JU19FUVVBTCgobWF0Mi5kaW1lbnNpb25zKClbMF0pLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQyLmRpbWVuc2lvbnMoKVsxXSksIDMpOworCisgIFZFUklGWV9JU19FUVVBTCgobWF0MS5kYXRhKClbMF0pLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRhdGEoKVsxXSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuZGF0YSgpWzJdKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0MS5kYXRhKClbM10pLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRhdGEoKVs0XSksIDIpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuZGF0YSgpWzVdKSwgNSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQyLmRhdGEoKVswXSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDIuZGF0YSgpWzFdKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0Mi5kYXRhKClbMl0pLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQyLmRhdGEoKVszXSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDIuZGF0YSgpWzRdKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0Mi5kYXRhKClbNV0pLCA1KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF8zZCgpCit7CisgIFRlbnNvcjxpbnQsIDM+IGVwc2lsb24oMywzLDMpOworICBlcHNpbG9uLnNldFplcm8oKTsKKyAgZXBzaWxvbigwLDEsMikgPSBlcHNpbG9uKDIsMCwxKSA9IGVwc2lsb24oMSwyLDApID0gMTsKKyAgZXBzaWxvbigyLDEsMCkgPSBlcHNpbG9uKDAsMiwxKSA9IGVwc2lsb24oMSwwLDIpID0gLTE7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uLnNpemUoKSksIDI3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uLmRpbWVuc2lvbnMoKVswXSksIDMpOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24uZGltZW5zaW9ucygpWzFdKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbi5kaW1lbnNpb25zKClbMl0pLCAzKTsKKworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwwLDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDAsMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsMCwyKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwxLDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDEsMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsMiwwKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwyLDIpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDAsMCkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsMCwxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwxLDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDEsMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsMSwyKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwyLDEpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDIsMikpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMCwwKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwwLDIpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDEsMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMSwyKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwyLDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDIsMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMiwyKSksIDApOworCisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDEsMikpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMCwxKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwyLDApKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDEsMCkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDIsMSkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDAsMikpLCAtMSk7CisKKyAgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+IGRpbXM7CisgIGRpbXNbMF0gPSAyOworICBkaW1zWzFdID0gMzsKKyAgZGltc1syXSA9IDQ7CisgIFRlbnNvcjxpbnQsIDM+IHQxKGRpbXMpOworICBUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gdDIoZGltcyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5zaXplKCkpLCAyNCk7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGltZW5zaW9ucygpWzBdKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGltZW5zaW9ucygpWzFdKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGltZW5zaW9ucygpWzJdKSwgNCk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5zaXplKCkpLCAyNCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGltZW5zaW9ucygpWzBdKSwgMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGltZW5zaW9ucygpWzFdKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGltZW5zaW9ucygpWzJdKSwgNCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgdDEoaSwgaiwgaykgPSAxMDAgKiBpICsgMTAgKiBqICsgazsKKyAgICAgICAgdDIoaSwgaiwgaykgPSAxMDAgKiBpICsgMTAgKiBqICsgazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVswXSksICAgIDApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxXSksICAxMDApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyXSksICAgMTApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVszXSksICAxMTApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs0XSksICAgMjApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs1XSksICAxMjApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs2XSksICAgIDEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs3XSksICAxMDEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs4XSksICAgMTEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs5XSksICAxMTEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxMF0pLCAgMjEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxMV0pLCAxMjEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxMl0pLCAgIDIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxM10pLCAxMDIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxNF0pLCAgMTIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxNV0pLCAxMTIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxNl0pLCAgMjIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxN10pLCAxMjIpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxOF0pLCAgIDMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxOV0pLCAxMDMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMF0pLCAgMTMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMV0pLCAxMTMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMl0pLCAgMjMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyM10pLCAxMjMpOworCisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzBdKSwgICAgMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzFdKSwgICAgMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzJdKSwgICAgMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzNdKSwgICAgMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzRdKSwgICAxMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzVdKSwgICAxMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzZdKSwgICAxMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzddKSwgICAxMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzhdKSwgICAyMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzldKSwgICAyMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzEwXSksICAyMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzExXSksICAyMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzEyXSksIDEwMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzEzXSksIDEwMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE0XSksIDEwMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE1XSksIDEwMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE2XSksIDExMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE3XSksIDExMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE4XSksIDExMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE5XSksIDExMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzIwXSksIDEyMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzIxXSksIDEyMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzIyXSksIDEyMik7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzIzXSksIDEyMyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Fzc2lnbigpCit7CisgIFRlbnNvcjxpbnQsIDM+IGVwc2lsb24oMywzLDMpOworICBlcHNpbG9uLnNldFplcm8oKTsKKyAgZXBzaWxvbigwLDEsMikgPSBlcHNpbG9uKDIsMCwxKSA9IGVwc2lsb24oMSwyLDApID0gMTsKKyAgZXBzaWxvbigyLDEsMCkgPSBlcHNpbG9uKDAsMiwxKSA9IGVwc2lsb24oMSwwLDIpID0gLTE7CisKKyAgVGVuc29yPGludCwgMz4gZTIoMywzLDMpOworICBlMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMSwyLDApKSwgMCk7CisKKyAgZTIgPSBlcHNpbG9uOworICBWRVJJRllfSVNfRVFVQUwoKGUyKDEsMiwwKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGUyKDAsMSwyKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGUyKDIsMCwxKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGUyKDIsMSwwKSksIC0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlMigwLDIsMSkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMSwwLDIpKSwgLTEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3Jlc2l6ZSgpCit7CisgIFRlbnNvcjxpbnQsIDM+IGVwc2lsb247CisgIGVwc2lsb24ucmVzaXplKDIsMyw3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDApLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDEpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDIpLCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uc2l6ZSgpLCAyKjMqNyk7CisKKyAgY29uc3QgaW50KiBvbGRfZGF0YSA9IGVwc2lsb24uZGF0YSgpOworICBlcHNpbG9uLnJlc2l6ZSgzLDIsNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigxKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigyKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwoZXBzaWxvbi5kYXRhKCksIG9sZF9kYXRhKTsKKworICBlcHNpbG9uLnJlc2l6ZSgzLDUsNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigxKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLmRpbWVuc2lvbigyKSwgNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLnNpemUoKSwgMyo1KjcpOworfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3NpbXBsZSgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0XzBkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8xZCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMmQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzNkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfYXNzaWduKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9yZXNpemUoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zdHJpZGluZy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zdHJpZGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YjkwOAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N0cmlkaW5nLmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgQmVub2l0IFN0ZWluZXIgPGJlbm9pdC5zdGVpbmVyLmdvb2dAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zdHJpZGluZygpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIGFycmF5PHB0cmRpZmZfdCwgND4gc3RyaWRlczsKKyAgc3RyaWRlc1swXSA9IDE7CisgIHN0cmlkZXNbMV0gPSAxOworICBzdHJpZGVzWzJdID0gMTsKKyAgc3RyaWRlc1szXSA9IDE7CisKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBub19zdHJpZGU7CisgIG5vX3N0cmlkZSA9IHRlbnNvci5zdHJpZGUoc3RyaWRlcyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKG5vX3N0cmlkZS5kaW1lbnNpb24oMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobm9fc3RyaWRlLmRpbWVuc2lvbigxKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChub19zdHJpZGUuZGltZW5zaW9uKDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG5vX3N0cmlkZS5kaW1lbnNpb24oMyksIDcpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc3RyaWRlKGksaixrLGwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0cmlkZXNbMF0gPSAyOworICBzdHJpZGVzWzFdID0gNDsKKyAgc3RyaWRlc1syXSA9IDI7CisgIHN0cmlkZXNbM10gPSAzOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHN0cmlkZTsKKyAgc3RyaWRlID0gdGVuc29yLnN0cmlkZShzdHJpZGVzKTsKKworICBWRVJJRllfSVNfRVFVQUwoc3RyaWRlLmRpbWVuc2lvbigwKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzdHJpZGUuZGltZW5zaW9uKDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHN0cmlkZS5kaW1lbnNpb24oMiksIDMpOworICBWRVJJRllfSVNfRVFVQUwoc3RyaWRlLmRpbWVuc2lvbigzKSwgMyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDE7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAzOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDIqaSw0KmosMiprLDMqbCksIHN0cmlkZShpLGosayxsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc3RyaWRpbmdfYXNfbHZhbHVlKCkKK3sKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKyAgYXJyYXk8cHRyZGlmZl90LCA0PiBzdHJpZGVzOworICBzdHJpZGVzWzBdID0gMjsKKyAgc3RyaWRlc1sxXSA9IDQ7CisgIHN0cmlkZXNbMl0gPSAyOworICBzdHJpZGVzWzNdID0gMzsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJlc3VsdCgzLCAxMiwgMTAsIDIxKTsKKyAgcmVzdWx0LnN0cmlkZShzdHJpZGVzKSA9IHRlbnNvcjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHJlc3VsdCgyKmksNCpqLDIqaywzKmwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGFycmF5PHB0cmRpZmZfdCwgND4gbm9fc3RyaWRlczsKKyAgbm9fc3RyaWRlc1swXSA9IDE7CisgIG5vX3N0cmlkZXNbMV0gPSAxOworICBub19zdHJpZGVzWzJdID0gMTsKKyAgbm9fc3RyaWRlc1szXSA9IDE7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmVzdWx0MigzLCAxMiwgMTAsIDIxKTsKKyAgcmVzdWx0Mi5zdHJpZGUoc3RyaWRlcykgPSB0ZW5zb3Iuc3RyaWRlKG5vX3N0cmlkZXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgcmVzdWx0MigyKmksNCpqLDIqaywzKmwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3Jfc3RyaWRpbmcoKQoreworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfc3RyaWRpbmc8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfc3RyaWRpbmc8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdHJpZGluZ19hc19sdmFsdWU8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdHJpZGluZ19hc19sdmFsdWU8Um93TWFqb3I+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3VnYXIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3VnYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTZlYjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zdWdhci5jcHAKQEAgLTAsMCArMSw4MSBAQAorI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKKworc3RhdGljIHZvaWQgdGVzdF9jb21wYXJpc29uX3N1Z2FyKCkgeworICAvLyB3ZSBhbHJlYWR5IHRydXN0IGNvbXBhcmlzb25zIGJldHdlZW4gdGVuc29ycywgd2UncmUgc2ltcGx5IGNoZWNraW5nIHRoYXQKKyAgLy8gdGhlIHN1Z2FyZWQgdmVyc2lvbnMgYXJlIGRvaW5nIHRoZSBzYW1lIHRoaW5nCisgIFRlbnNvcjxpbnQsIDM+IHQoNiwgNywgNSk7CisKKyAgdC5zZXRSYW5kb20oKTsKKyAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHZhbHVlID09IDAKKyAgdCgwLDAsMCkgPSAwOworCisgIFRlbnNvcjxib29sLDA+IGI7CisKKyNkZWZpbmUgVEVTVF9URU5TT1JfRVFVQUwoZTEsIGUyKSBcCisgIGIgPSAoKGUxKSA9PSAoZTIpKS5hbGwoKTsgICAgICAgXAorICBWRVJJRlkoYigpKQorCisjZGVmaW5lIFRFU1RfT1Aob3ApIFRFU1RfVEVOU09SX0VRVUFMKHQgb3AgMCwgdCBvcCB0LmNvbnN0YW50KDApKQorCisgIFRFU1RfT1AoPT0pOworICBURVNUX09QKCE9KTsKKyAgVEVTVF9PUCg8PSk7CisgIFRFU1RfT1AoPj0pOworICBURVNUX09QKDwpOworICBURVNUX09QKD4pOworI3VuZGVmIFRFU1RfT1AKKyN1bmRlZiBURVNUX1RFTlNPUl9FUVVBTAorfQorCisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NhbGFyX3N1Z2FyX2FkZF9tdWwoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gQSg2LCA3LCA1KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBCKDYsIDcsIDUpOworICBBLnNldFJhbmRvbSgpOworICBCLnNldFJhbmRvbSgpOworCisgIGNvbnN0IGZsb2F0IGFscGhhID0gMC40M2Y7CisgIGNvbnN0IGZsb2F0IGJldGEgPSAwLjIxZjsKKyAgY29uc3QgZmxvYXQgZ2FtbWEgPSAwLjE0ZjsKKworICBUZW5zb3I8ZmxvYXQsIDM+IFIgPSBBLmNvbnN0YW50KGdhbW1hKSArIEEgKiBBLmNvbnN0YW50KGFscGhhKSArIEIgKiBCLmNvbnN0YW50KGJldGEpOworICBUZW5zb3I8ZmxvYXQsIDM+IFMgPSBBICogYWxwaGEgKyBCICogYmV0YSArIGdhbW1hOworICBUZW5zb3I8ZmxvYXQsIDM+IFQgPSBnYW1tYSArIGFscGhhICogQSArIGJldGEgKiBCOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNio3KjU7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1goUihpKSwgUyhpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChSKGkpLCBUKGkpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjYWxhcl9zdWdhcl9zdWJfZGl2KCkgeworICBUZW5zb3I8ZmxvYXQsIDM+IEEoNiwgNywgNSk7CisgIFRlbnNvcjxmbG9hdCwgMz4gQig2LCA3LCA1KTsKKyAgQS5zZXRSYW5kb20oKTsKKyAgQi5zZXRSYW5kb20oKTsKKworICBjb25zdCBmbG9hdCBhbHBoYSA9IDAuNDNmOworICBjb25zdCBmbG9hdCBiZXRhID0gMC4yMWY7CisgIGNvbnN0IGZsb2F0IGdhbW1hID0gMC4xNGY7CisgIGNvbnN0IGZsb2F0IGRlbHRhID0gMC4zMmY7CisKKyAgVGVuc29yPGZsb2F0LCAzPiBSID0gQS5jb25zdGFudChnYW1tYSkgLSBBIC8gQS5jb25zdGFudChhbHBoYSkKKyAgICAgIC0gQi5jb25zdGFudChiZXRhKSAvIEIgLSBBLmNvbnN0YW50KGRlbHRhKTsKKyAgVGVuc29yPGZsb2F0LCAzPiBTID0gZ2FtbWEgLSBBIC8gYWxwaGEgLSBiZXRhIC8gQiAtIGRlbHRhOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNio3KjU7ICsraSkgeworICAgIFZFUklGWV9JU19BUFBST1goUihpKSwgUyhpKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X2N4eDExX3RlbnNvcl9zdWdhcigpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBhcmlzb25fc3VnYXIoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NjYWxhcl9zdWdhcl9hZGRfbXVsKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zY2FsYXJfc3VnYXJfc3ViX2RpdigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ljbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5YzMzNAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N5Y2wuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNgorLy8gTWVoZGkgR29saSAgICBDb2RlcGxheSBTb2Z0d2FyZSBMdGQuCisvLyBSYWxwaCBQb3R0ZXIgIENvZGVwbGF5IFNvZnR3YXJlIEx0ZC4KKy8vIEx1a2UgSXdhbnNraSAgQ29kZXBsYXkgU29mdHdhcmUgTHRkLgorLy8gQ29udGFjdDogPGVpZ2VuQGNvZGVwbGF5LmNvbT4KKy8vIEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCisjZGVmaW5lIEVJR0VOX1RFU1RfRlVOQyBjeHgxMV90ZW5zb3Jfc3ljbAorI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50CisjZGVmaW5lIEVJR0VOX1VTRV9TWUNMCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgorCit1c2luZyBFaWdlbjo6YXJyYXk7Cit1c2luZyBFaWdlbjo6U3ljbERldmljZTsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yTWFwOworCit2b2lkIHRlc3Rfc3ljbF9jcHUoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CisKKyAgaW50IHNpemVEaW0xID0gMTAwOworICBpbnQgc2l6ZURpbTIgPSAxMDA7CisgIGludCBzaXplRGltMyA9IDEwMDsKKyAgYXJyYXk8aW50LCAzPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltM319OworICBUZW5zb3I8ZmxvYXQsIDM+IGluMSh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4yKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPGZsb2F0LCAzPiBpbjModGVuc29yUmFuZ2UpOworICBUZW5zb3I8ZmxvYXQsIDM+IG91dCh0ZW5zb3JSYW5nZSk7CisKKyAgaW4yID0gaW4yLnJhbmRvbSgpOworICBpbjMgPSBpbjMucmFuZG9tKCk7CisKKyAgZmxvYXQgKiBncHVfaW4xX2RhdGEgID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKyAgZmxvYXQgKiBncHVfaW4yX2RhdGEgID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKyAgZmxvYXQgKiBncHVfaW4zX2RhdGEgID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjMuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKyAgZmxvYXQgKiBncHVfb3V0X2RhdGEgPSAgc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihmbG9hdCkpKTsKKworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAzPj4gZ3B1X2luMShncHVfaW4xX2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMz4+IGdwdV9pbjIoZ3B1X2luMl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDM+PiBncHVfaW4zKGdwdV9pbjNfZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAzPj4gZ3B1X291dChncHVfb3V0X2RhdGEsIHRlbnNvclJhbmdlKTsKKworICAvLy8gYT0xLjJmCisgIGdwdV9pbjEuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEuY29uc3RhbnQoMS4yZik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbjEuZGF0YSgpLCBncHVfaW4xX2RhdGEgLChpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChpbjEoaSxqLGspLCAxLjJmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJhPTEuMmYgVGVzdCBwYXNzZWRcbiIpOworCisgIC8vLyBhPWIqMS4yZgorICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4xICogMS4yZjsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSAsKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihmbG9hdCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKSAqIDEuMmYpOworICAgICAgfQorICAgIH0KKyAgfQorICBwcmludGYoImE9YioxLjJmIFRlc3QgUGFzc2VkXG4iKTsKKworICAvLy8gYz1hKmIKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgaW4yLmRhdGEoKSwoaW4yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEgKiBncHVfaW4yOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjIoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJjPWEqYiBUZXN0IFBhc3NlZFxuIik7CisKKyAgLy8vIGM9YStiCisgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEgKyBncHVfaW4yOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjIoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJjPWErYiBUZXN0IFBhc3NlZFxuIik7CisKKyAgLy8vIGM9YSphCisgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEgKiBncHVfaW4xOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSxqLGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJjPSBhKmEgVGVzdCBQYXNzZWRcbiIpOworCisgIC8vYSozLjE0ZiArIGIqMi43ZgorICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSAgZ3B1X2luMSAqIGdwdV9pbjEuY29uc3RhbnQoMy4xNGYpICsgZ3B1X2luMiAqIGdwdV9pbjIuY29uc3RhbnQoMi43Zik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLGdwdV9vdXRfZGF0YSwob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKGZsb2F0KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSxqLGspICogMy4xNGYKKyAgICAgICAgICAgICAgICAgICAgICAgKyBpbjIoaSxqLGspICogMi43Zik7CisgICAgICB9CisgICAgfQorICB9CisgIHByaW50ZigiYSozLjE0ZiArIGIqMi43ZiBUZXN0IFBhc3NlZFxuIik7CisKKyAgLy8vZD0gKGE+MC41PyBiOmMpCisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4zX2RhdGEsIGluMy5kYXRhKCksKGluMy5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihmbG9hdCkpOworICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPShncHVfaW4xID4gZ3B1X2luMS5jb25zdGFudCgwLjVmKSkuc2VsZWN0KGdwdV9pbjIsIGdwdV9pbjMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoZmxvYXQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIChpbjEoaSwgaiwgaykgPiAwLjVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbjIoaSwgaiwgaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW4zKGksIGosIGspKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRmKCJkPSAoYT4wLjU/IGI6YykgVGVzdCBQYXNzZWRcbiIpOworICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbjFfZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luMl9kYXRhKTsKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4zX2RhdGEpOworICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7Cit9Cit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3N5Y2woKSB7CisgIGNsOjpzeWNsOjpncHVfc2VsZWN0b3IgczsKKyAgRWlnZW46OlN5Y2xEZXZpY2Ugc3ljbF9kZXZpY2Uocyk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3N5Y2xfY3B1KHN5Y2xfZGV2aWNlKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zeW1tZXRyeS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zeW1tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4MGU5YgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N5bW1ldHJ5LmNwcApAQCAtMCwwICsxLDgxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFNlaWxlciA8Y2hyaXN0aWFuQGl3YWtkLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3JTeW1tZXRyeT4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6U0dyb3VwOwordXNpbmcgRWlnZW46OkR5bmFtaWNTR3JvdXA7Cit1c2luZyBFaWdlbjo6U3RhdGljU0dyb3VwOwordXNpbmcgRWlnZW46OlN5bW1ldHJ5OwordXNpbmcgRWlnZW46OkFudGlTeW1tZXRyeTsKK3VzaW5nIEVpZ2VuOjpIZXJtaXRpY2l0eTsKK3VzaW5nIEVpZ2VuOjpBbnRpSGVybWl0aWNpdHk7CisKK3VzaW5nIEVpZ2VuOjpOZWdhdGlvbkZsYWc7Cit1c2luZyBFaWdlbjo6Q29uanVnYXRpb25GbGFnOwordXNpbmcgRWlnZW46Okdsb2JhbFplcm9GbGFnOwordXNpbmcgRWlnZW46Okdsb2JhbFJlYWxGbGFnOwordXNpbmcgRWlnZW46Okdsb2JhbEltYWdGbGFnOworCisvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb21waWxlciBpbnRhbnRpYXRlZCBhIHN0YXRpYworLy8gb3IgZHluYW1pYyBzeW1tZXRyeSBncm91cAordGVtcGxhdGU8dHlwZW5hbWUuLi4gU3ltPgorYm9vbCBpc0R5bkdyb3VwKFN0YXRpY1NHcm91cDxTeW0uLi4+IGNvbnN0JiBkdW1teSkKK3sKKyAgKHZvaWQpZHVtbXk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpc0R5bkdyb3VwKER5bmFtaWNTR3JvdXAgY29uc3QmIGR1bW15KQoreworICAodm9pZClkdW1teTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGhlbHBlciBjbGFzcyBmb3IgY2hlY2tpbmcgdGhhdCB0aGUgc3ltbWV0cnkgZ3JvdXBzIGFyZSBjb3JyZWN0CitzdHJ1Y3QgY2hlY2tJZHggeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcnJUeXBlPgorICBzdGF0aWMgaW5saW5lIGludCBkb0NoZWNrXyhBcnJUeXBlIGUsIGludCBmbGFncywgaW50IGR1bW15LCBzdGQ6OnNldDx1aW50NjRfdD4mIGZvdW5kLCBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiBjb25zdCYgZXhwZWN0ZWQpCisgIHsKKyAgICAvLyB1c2UgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZQorICAgIHVpbnQ2NF90IHZhbHVlID0gZVswXTsKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgZS5zaXplKCk7IGkrKykKKyAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIGVbaV07CisKKyAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGZpbmQgZWFjaCBlbGVtZW50CisgICAgYXV0byBpdCA9IGV4cGVjdGVkLmZpbmQodmFsdWUpOworICAgIFZFUklGWSgoaXQgIT0gZXhwZWN0ZWQuZW5kKCkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoaXQtPnNlY29uZCwgZmxhZ3MpOworCisgICAgLy8gd2Ugd2FudCB0byBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIGVhY2ggZWxlbWVudCBvbmNlOworICAgIC8vIHNldDo6aW5zZXJ0IHJldHVybnMgdHJ1ZSBmb3IgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBwYWlyCisgICAgLy8gaWYgdGhlIGVsZW1lbnQgd2FzIHJlYWxseSBpbnNlcnRlZCBhbmQgbm90IGFscmVhZHkgdGhlcmUKKyAgICBhdXRvIHAgPSBmb3VuZC5pbnNlcnQodmFsdWUpOworICAgIFZFUklGWSgocC5zZWNvbmQpKTsKKworICAgIHJldHVybiBkdW1teTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgaW50IHJ1bihzdGQ6OnZlY3RvcjxpbnQ+IGUsIGludCBmbGFncywgaW50IGR1bW15LCBzdGQ6OnNldDx1aW50NjRfdD4mIGZvdW5kLCBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiBjb25zdCYgZXhwZWN0ZWQpCisgIHsKKyAgICByZXR1cm4gZG9DaGVja18oZSwgZmxhZ3MsIGR1bW15LCBmb3VuZCwgZXhwZWN0ZWQpOworICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgTj4KKyAgc3RhdGljIGlubGluZSBpbnQgcnVuKHN0ZDo6YXJyYXk8aW50LCBOPiBlLCBpbnQgZmxhZ3MsIGludCBkdW1teSwgc3RkOjpzZXQ8dWludDY0X3Q+JiBmb3VuZCwgc3RkOjptYXA8dWludDY0X3QsIGludD4gY29uc3QmIGV4cGVjdGVkKQorICB7CisgICAgcmV0dXJuIGRvQ2hlY2tfKGUsIGZsYWdzLCBkdW1teSwgZm91bmQsIGV4cGVjdGVkKTsKKyAgfQorfTsKKworc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfc3RhdGljKCkKK3sKKyAgc3RkOjphcnJheTxpbnQsIDc+IGlkZW50aXR5e3swLDEsMiwzLDQsNSw2fX07CisKKyAgLy8gU2ltcGxlIHN0YXRpYyBzeW1tZXRyeSBncm91cAorICBTdGF0aWNTR3JvdXA8CisgICAgQW50aVN5bW1ldHJ5PDAsMT4sCisgICAgSGVybWl0aWNpdHk8MCwyPgorICA+IGdyb3VwOworCisgIHN0ZDo6c2V0PHVpbnQ2NF90PiBmb3VuZDsKKyAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7CisgIGV4cGVjdGVkWyAxMjM0NTZdID0gMDsKKyAgZXhwZWN0ZWRbMTAyMzQ1Nl0gPSBOZWdhdGlvbkZsYWc7CisgIGV4cGVjdGVkWzIxMDM0NTZdID0gQ29uanVnYXRpb25GbGFnOworICBleHBlY3RlZFsxMjAzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZyB8IE5lZ2F0aW9uRmxhZzsKKyAgZXhwZWN0ZWRbMjAxMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWcgfCBOZWdhdGlvbkZsYWc7CisgIGV4cGVjdGVkWyAyMTM0NTZdID0gQ29uanVnYXRpb25GbGFnOworCisgIFZFUklGWV9JU19FUVVBTChncm91cC5zaXplKCksIDZ1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLmdsb2JhbEZsYWdzKCksIEdsb2JhbEltYWdGbGFnKTsKKyAgZ3JvdXAuYXBwbHk8Y2hlY2tJZHgsIGludD4oaWRlbnRpdHksIDAsIGZvdW5kLCBleHBlY3RlZCk7CisgIFZFUklGWV9JU19FUVVBTChmb3VuZC5zaXplKCksIDZ1KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfZHluYW1pYygpCit7CisgIHN0ZDo6dmVjdG9yPGludD4gaWRlbnRpdHk7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDY7IGkrKykKKyAgICBpZGVudGl0eS5wdXNoX2JhY2soaSk7CisKKyAgLy8gU2ltcGxlIGR5bmFtaWMgc3ltbWV0cnkgZ3JvdXAKKyAgRHluYW1pY1NHcm91cCBncm91cDsKKyAgZ3JvdXAuYWRkKDAsMSxOZWdhdGlvbkZsYWcpOworICBncm91cC5hZGQoMCwyLENvbmp1Z2F0aW9uRmxhZyk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLnNpemUoKSwgNnUpOworICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuZ2xvYmFsRmxhZ3MoKSwgR2xvYmFsSW1hZ0ZsYWcpOworCisgIHN0ZDo6c2V0PHVpbnQ2NF90PiBmb3VuZDsKKyAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7CisgIGV4cGVjdGVkWyAxMjM0NTZdID0gMDsKKyAgZXhwZWN0ZWRbMTAyMzQ1Nl0gPSBOZWdhdGlvbkZsYWc7CisgIGV4cGVjdGVkWzIxMDM0NTZdID0gQ29uanVnYXRpb25GbGFnOworICBleHBlY3RlZFsxMjAzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZyB8IE5lZ2F0aW9uRmxhZzsKKyAgZXhwZWN0ZWRbMjAxMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWcgfCBOZWdhdGlvbkZsYWc7CisgIGV4cGVjdGVkWyAyMTM0NTZdID0gQ29uanVnYXRpb25GbGFnOworCisgIFZFUklGWV9JU19FUVVBTChncm91cC5zaXplKCksIDZ1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLmdsb2JhbEZsYWdzKCksIEdsb2JhbEltYWdGbGFnKTsKKyAgZ3JvdXAuYXBwbHk8Y2hlY2tJZHgsIGludD4oaWRlbnRpdHksIDAsIGZvdW5kLCBleHBlY3RlZCk7CisgIFZFUklGWV9JU19FUVVBTChmb3VuZC5zaXplKCksIDZ1KTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfc2VsZWN0aW9uKCkKK3sKKyAgc3RkOjphcnJheTxpbnQsIDc+IGlkZW50aXR5N3t7MCwxLDIsMyw0LDUsNn19OworICBzdGQ6OmFycmF5PGludCwgMTA+IGlkZW50aXR5MTB7ezAsMSwyLDMsNCw1LDYsNyw4LDl9fTsKKworICB7CisgICAgLy8gRG8gdGhlIHNhbWUgdGVzdCBhcyBpbiB0ZXN0X3N5bWdyb3Vwc19zdGF0aWMgYnV0CisgICAgLy8gcmVxdWlyZSBzZWxlY3Rpb24gdmlhIFNHcm91cAorICAgIFNHcm91cDwKKyAgICAgIEFudGlTeW1tZXRyeTwwLDE+LAorICAgICAgSGVybWl0aWNpdHk8MCwyPgorICAgID4gZ3JvdXA7CisKKyAgICBzdGQ6OnNldDx1aW50NjRfdD4gZm91bmQ7CisgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7CisgICAgZXhwZWN0ZWRbIDEyMzQ1Nl0gPSAwOworICAgIGV4cGVjdGVkWzEwMjM0NTZdID0gTmVnYXRpb25GbGFnOworICAgIGV4cGVjdGVkWzIxMDM0NTZdID0gQ29uanVnYXRpb25GbGFnOworICAgIGV4cGVjdGVkWzEyMDM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOworICAgIGV4cGVjdGVkWzIwMTM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOworICAgIGV4cGVjdGVkWyAyMTM0NTZdID0gQ29uanVnYXRpb25GbGFnOworCisgICAgVkVSSUZZKCFpc0R5bkdyb3VwKGdyb3VwKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLnNpemUoKSwgNnUpOworICAgIFZFUklGWV9JU19FUVVBTChncm91cC5nbG9iYWxGbGFncygpLCBHbG9iYWxJbWFnRmxhZyk7CisgICAgZ3JvdXAuYXBwbHk8Y2hlY2tJZHgsIGludD4oaWRlbnRpdHk3LCAwLCBmb3VuZCwgZXhwZWN0ZWQpOworICAgIFZFUklGWV9JU19FUVVBTChmb3VuZC5zaXplKCksIDZ1KTsKKyAgfQorCisgIHsKKyAgICAvLyBzaW1wbGUgZmFjdG9yaXppbmcgZ3JvdXA6IDUgZ2VuZXJhdG9ycywgMl41ID0gMzIgZWxlbWVudHMKKyAgICAvLyBzZWxlY3Rpb24gc2hvdWxkIG1ha2UgdGhpcyBkeW5hbWljLCBhbHRob3VnaCBzdGF0aWMgZ3JvdXAKKyAgICAvLyBjYW4gc3RpbGwgYmUgcmVhc29uYWJseSBnZW5lcmF0ZWQKKyAgICBTR3JvdXA8CisgICAgICBTeW1tZXRyeTwwLDE+LAorICAgICAgU3ltbWV0cnk8MiwzPiwKKyAgICAgIFN5bW1ldHJ5PDQsNT4sCisgICAgICBTeW1tZXRyeTw2LDc+LAorICAgICAgU3ltbWV0cnk8OCw5PgorICAgID4gZ3JvdXA7CisKKyAgICBzdGQ6OnNldDx1aW50NjRfdD4gZm91bmQ7CisgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7CisgICAgZXhwZWN0ZWRbIDEyMzQ1Njc4OV0gPSAwOyBleHBlY3RlZFsgMTIzNDU2Nzk4XSA9IDA7IGV4cGVjdGVkWyAxMjM0NTc2ODldID0gMDsgZXhwZWN0ZWRbIDEyMzQ1NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWyAxMjM1NDY3ODldID0gMDsgZXhwZWN0ZWRbIDEyMzU0Njc5OF0gPSAwOyBleHBlY3RlZFsgMTIzNTQ3Njg5XSA9IDA7IGV4cGVjdGVkWyAxMjM1NDc2OThdID0gMDsKKyAgICBleHBlY3RlZFsgMTMyNDU2Nzg5XSA9IDA7IGV4cGVjdGVkWyAxMzI0NTY3OThdID0gMDsgZXhwZWN0ZWRbIDEzMjQ1NzY4OV0gPSAwOyBleHBlY3RlZFsgMTMyNDU3Njk4XSA9IDA7CisgICAgZXhwZWN0ZWRbIDEzMjU0Njc4OV0gPSAwOyBleHBlY3RlZFsgMTMyNTQ2Nzk4XSA9IDA7IGV4cGVjdGVkWyAxMzI1NDc2ODldID0gMDsgZXhwZWN0ZWRbIDEzMjU0NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEwMjM0NTY3ODldID0gMDsgZXhwZWN0ZWRbMTAyMzQ1Njc5OF0gPSAwOyBleHBlY3RlZFsxMDIzNDU3Njg5XSA9IDA7IGV4cGVjdGVkWzEwMjM0NTc2OThdID0gMDsKKyAgICBleHBlY3RlZFsxMDIzNTQ2Nzg5XSA9IDA7IGV4cGVjdGVkWzEwMjM1NDY3OThdID0gMDsgZXhwZWN0ZWRbMTAyMzU0NzY4OV0gPSAwOyBleHBlY3RlZFsxMDIzNTQ3Njk4XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAzMjQ1Njc4OV0gPSAwOyBleHBlY3RlZFsxMDMyNDU2Nzk4XSA9IDA7IGV4cGVjdGVkWzEwMzI0NTc2ODldID0gMDsgZXhwZWN0ZWRbMTAzMjQ1NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEwMzI1NDY3ODldID0gMDsgZXhwZWN0ZWRbMTAzMjU0Njc5OF0gPSAwOyBleHBlY3RlZFsxMDMyNTQ3Njg5XSA9IDA7IGV4cGVjdGVkWzEwMzI1NDc2OThdID0gMDsKKworICAgIFZFUklGWShpc0R5bkdyb3VwKGdyb3VwKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLnNpemUoKSwgMzJ1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuZ2xvYmFsRmxhZ3MoKSwgMCk7CisgICAgZ3JvdXAuYXBwbHk8Y2hlY2tJZHgsIGludD4oaWRlbnRpdHkxMCwgMCwgZm91bmQsIGV4cGVjdGVkKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZm91bmQuc2l6ZSgpLCAzMnUpOworCisgICAgLy8gbm8gdmVyaWZ5IHRoYXQgd2UgY291bGQgYWxzbyBnZW5lcmF0ZSBhIHN0YXRpYyBncm91cAorICAgIC8vIHdpdGggdGhlc2UgZ2VuZXJhdG9ycworICAgIGZvdW5kLmNsZWFyKCk7CisgICAgU3RhdGljU0dyb3VwPAorICAgICAgU3ltbWV0cnk8MCwxPiwKKyAgICAgIFN5bW1ldHJ5PDIsMz4sCisgICAgICBTeW1tZXRyeTw0LDU+LAorICAgICAgU3ltbWV0cnk8Niw3PiwKKyAgICAgIFN5bW1ldHJ5PDgsOT4KKyAgICA+IGdyb3VwX3N0YXRpYzsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXBfc3RhdGljLnNpemUoKSwgMzJ1KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXBfc3RhdGljLmdsb2JhbEZsYWdzKCksIDApOworICAgIGdyb3VwX3N0YXRpYy5hcHBseTxjaGVja0lkeCwgaW50PihpZGVudGl0eTEwLCAwLCBmb3VuZCwgZXhwZWN0ZWQpOworICAgIFZFUklGWV9JU19FUVVBTChmb3VuZC5zaXplKCksIDMydSk7CisgIH0KKworICB7CisgICAgLy8gdHJ5IHRvIGNyZWF0ZSBhIEhVR0UgZ3JvdXAKKyAgICBTR3JvdXA8CisgICAgICBTeW1tZXRyeTwwLDE+LAorICAgICAgU3ltbWV0cnk8MSwyPiwKKyAgICAgIFN5bW1ldHJ5PDIsMz4sCisgICAgICBTeW1tZXRyeTwzLDQ+LAorICAgICAgU3ltbWV0cnk8NCw1PiwKKyAgICAgIFN5bW1ldHJ5PDUsNj4KKyAgICA+IGdyb3VwOworCisgICAgc3RkOjpzZXQ8dWludDY0X3Q+IGZvdW5kOworICAgIHVpbnQ2NF90IHByZV9leHBlY3RlZFs1MDQwXSA9IHsKKyAgICAgICAxMjM0NTYsIDEwMjM0NTYsICAyMTM0NTYsIDIwMTM0NTYsIDEyMDM0NTYsIDIxMDM0NTYsICAxMzI0NTYsIDEwMzI0NTYsICAzMTI0NTYsIDMwMTI0NTYsIDEzMDI0NTYsIDMxMDI0NTYsCisgICAgICAgMjMxNDU2LCAyMDMxNDU2LCAgMzIxNDU2LCAzMDIxNDU2LCAyMzAxNDU2LCAzMjAxNDU2LCAxMjMwNDU2LCAyMTMwNDU2LCAxMzIwNDU2LCAzMTIwNDU2LCAyMzEwNDU2LCAzMjEwNDU2LAorICAgICAgIDEyNDM1NiwgMTAyNDM1NiwgIDIxNDM1NiwgMjAxNDM1NiwgMTIwNDM1NiwgMjEwNDM1NiwgIDE0MjM1NiwgMTA0MjM1NiwgIDQxMjM1NiwgNDAxMjM1NiwgMTQwMjM1NiwgNDEwMjM1NiwKKyAgICAgICAyNDEzNTYsIDIwNDEzNTYsICA0MjEzNTYsIDQwMjEzNTYsIDI0MDEzNTYsIDQyMDEzNTYsIDEyNDAzNTYsIDIxNDAzNTYsIDE0MjAzNTYsIDQxMjAzNTYsIDI0MTAzNTYsIDQyMTAzNTYsCisgICAgICAgMTM0MjU2LCAxMDM0MjU2LCAgMzE0MjU2LCAzMDE0MjU2LCAxMzA0MjU2LCAzMTA0MjU2LCAgMTQzMjU2LCAxMDQzMjU2LCAgNDEzMjU2LCA0MDEzMjU2LCAxNDAzMjU2LCA0MTAzMjU2LAorICAgICAgIDM0MTI1NiwgMzA0MTI1NiwgIDQzMTI1NiwgNDAzMTI1NiwgMzQwMTI1NiwgNDMwMTI1NiwgMTM0MDI1NiwgMzE0MDI1NiwgMTQzMDI1NiwgNDEzMDI1NiwgMzQxMDI1NiwgNDMxMDI1NiwKKyAgICAgICAyMzQxNTYsIDIwMzQxNTYsICAzMjQxNTYsIDMwMjQxNTYsIDIzMDQxNTYsIDMyMDQxNTYsICAyNDMxNTYsIDIwNDMxNTYsICA0MjMxNTYsIDQwMjMxNTYsIDI0MDMxNTYsIDQyMDMxNTYsCisgICAgICAgMzQyMTU2LCAzMDQyMTU2LCAgNDMyMTU2LCA0MDMyMTU2LCAzNDAyMTU2LCA0MzAyMTU2LCAyMzQwMTU2LCAzMjQwMTU2LCAyNDMwMTU2LCA0MjMwMTU2LCAzNDIwMTU2LCA0MzIwMTU2LAorICAgICAgMTIzNDA1NiwgMjEzNDA1NiwgMTMyNDA1NiwgMzEyNDA1NiwgMjMxNDA1NiwgMzIxNDA1NiwgMTI0MzA1NiwgMjE0MzA1NiwgMTQyMzA1NiwgNDEyMzA1NiwgMjQxMzA1NiwgNDIxMzA1NiwKKyAgICAgIDEzNDIwNTYsIDMxNDIwNTYsIDE0MzIwNTYsIDQxMzIwNTYsIDM0MTIwNTYsIDQzMTIwNTYsIDIzNDEwNTYsIDMyNDEwNTYsIDI0MzEwNTYsIDQyMzEwNTYsIDM0MjEwNTYsIDQzMjEwNTYsCisgICAgICAgMTIzNTQ2LCAxMDIzNTQ2LCAgMjEzNTQ2LCAyMDEzNTQ2LCAxMjAzNTQ2LCAyMTAzNTQ2LCAgMTMyNTQ2LCAxMDMyNTQ2LCAgMzEyNTQ2LCAzMDEyNTQ2LCAxMzAyNTQ2LCAzMTAyNTQ2LAorICAgICAgIDIzMTU0NiwgMjAzMTU0NiwgIDMyMTU0NiwgMzAyMTU0NiwgMjMwMTU0NiwgMzIwMTU0NiwgMTIzMDU0NiwgMjEzMDU0NiwgMTMyMDU0NiwgMzEyMDU0NiwgMjMxMDU0NiwgMzIxMDU0NiwKKyAgICAgICAxMjUzNDYsIDEwMjUzNDYsICAyMTUzNDYsIDIwMTUzNDYsIDEyMDUzNDYsIDIxMDUzNDYsICAxNTIzNDYsIDEwNTIzNDYsICA1MTIzNDYsIDUwMTIzNDYsIDE1MDIzNDYsIDUxMDIzNDYsCisgICAgICAgMjUxMzQ2LCAyMDUxMzQ2LCAgNTIxMzQ2LCA1MDIxMzQ2LCAyNTAxMzQ2LCA1MjAxMzQ2LCAxMjUwMzQ2LCAyMTUwMzQ2LCAxNTIwMzQ2LCA1MTIwMzQ2LCAyNTEwMzQ2LCA1MjEwMzQ2LAorICAgICAgIDEzNTI0NiwgMTAzNTI0NiwgIDMxNTI0NiwgMzAxNTI0NiwgMTMwNTI0NiwgMzEwNTI0NiwgIDE1MzI0NiwgMTA1MzI0NiwgIDUxMzI0NiwgNTAxMzI0NiwgMTUwMzI0NiwgNTEwMzI0NiwKKyAgICAgICAzNTEyNDYsIDMwNTEyNDYsICA1MzEyNDYsIDUwMzEyNDYsIDM1MDEyNDYsIDUzMDEyNDYsIDEzNTAyNDYsIDMxNTAyNDYsIDE1MzAyNDYsIDUxMzAyNDYsIDM1MTAyNDYsIDUzMTAyNDYsCisgICAgICAgMjM1MTQ2LCAyMDM1MTQ2LCAgMzI1MTQ2LCAzMDI1MTQ2LCAyMzA1MTQ2LCAzMjA1MTQ2LCAgMjUzMTQ2LCAyMDUzMTQ2LCAgNTIzMTQ2LCA1MDIzMTQ2LCAyNTAzMTQ2LCA1MjAzMTQ2LAorICAgICAgIDM1MjE0NiwgMzA1MjE0NiwgIDUzMjE0NiwgNTAzMjE0NiwgMzUwMjE0NiwgNTMwMjE0NiwgMjM1MDE0NiwgMzI1MDE0NiwgMjUzMDE0NiwgNTIzMDE0NiwgMzUyMDE0NiwgNTMyMDE0NiwKKyAgICAgIDEyMzUwNDYsIDIxMzUwNDYsIDEzMjUwNDYsIDMxMjUwNDYsIDIzMTUwNDYsIDMyMTUwNDYsIDEyNTMwNDYsIDIxNTMwNDYsIDE1MjMwNDYsIDUxMjMwNDYsIDI1MTMwNDYsIDUyMTMwNDYsCisgICAgICAxMzUyMDQ2LCAzMTUyMDQ2LCAxNTMyMDQ2LCA1MTMyMDQ2LCAzNTEyMDQ2LCA1MzEyMDQ2LCAyMzUxMDQ2LCAzMjUxMDQ2LCAyNTMxMDQ2LCA1MjMxMDQ2LCAzNTIxMDQ2LCA1MzIxMDQ2LAorICAgICAgIDEyNDUzNiwgMTAyNDUzNiwgIDIxNDUzNiwgMjAxNDUzNiwgMTIwNDUzNiwgMjEwNDUzNiwgIDE0MjUzNiwgMTA0MjUzNiwgIDQxMjUzNiwgNDAxMjUzNiwgMTQwMjUzNiwgNDEwMjUzNiwKKyAgICAgICAyNDE1MzYsIDIwNDE1MzYsICA0MjE1MzYsIDQwMjE1MzYsIDI0MDE1MzYsIDQyMDE1MzYsIDEyNDA1MzYsIDIxNDA1MzYsIDE0MjA1MzYsIDQxMjA1MzYsIDI0MTA1MzYsIDQyMTA1MzYsCisgICAgICAgMTI1NDM2LCAxMDI1NDM2LCAgMjE1NDM2LCAyMDE1NDM2LCAxMjA1NDM2LCAyMTA1NDM2LCAgMTUyNDM2LCAxMDUyNDM2LCAgNTEyNDM2LCA1MDEyNDM2LCAxNTAyNDM2LCA1MTAyNDM2LAorICAgICAgIDI1MTQzNiwgMjA1MTQzNiwgIDUyMTQzNiwgNTAyMTQzNiwgMjUwMTQzNiwgNTIwMTQzNiwgMTI1MDQzNiwgMjE1MDQzNiwgMTUyMDQzNiwgNTEyMDQzNiwgMjUxMDQzNiwgNTIxMDQzNiwKKyAgICAgICAxNDUyMzYsIDEwNDUyMzYsICA0MTUyMzYsIDQwMTUyMzYsIDE0MDUyMzYsIDQxMDUyMzYsICAxNTQyMzYsIDEwNTQyMzYsICA1MTQyMzYsIDUwMTQyMzYsIDE1MDQyMzYsIDUxMDQyMzYsCisgICAgICAgNDUxMjM2LCA0MDUxMjM2LCAgNTQxMjM2LCA1MDQxMjM2LCA0NTAxMjM2LCA1NDAxMjM2LCAxNDUwMjM2LCA0MTUwMjM2LCAxNTQwMjM2LCA1MTQwMjM2LCA0NTEwMjM2LCA1NDEwMjM2LAorICAgICAgIDI0NTEzNiwgMjA0NTEzNiwgIDQyNTEzNiwgNDAyNTEzNiwgMjQwNTEzNiwgNDIwNTEzNiwgIDI1NDEzNiwgMjA1NDEzNiwgIDUyNDEzNiwgNTAyNDEzNiwgMjUwNDEzNiwgNTIwNDEzNiwKKyAgICAgICA0NTIxMzYsIDQwNTIxMzYsICA1NDIxMzYsIDUwNDIxMzYsIDQ1MDIxMzYsIDU0MDIxMzYsIDI0NTAxMzYsIDQyNTAxMzYsIDI1NDAxMzYsIDUyNDAxMzYsIDQ1MjAxMzYsIDU0MjAxMzYsCisgICAgICAxMjQ1MDM2LCAyMTQ1MDM2LCAxNDI1MDM2LCA0MTI1MDM2LCAyNDE1MDM2LCA0MjE1MDM2LCAxMjU0MDM2LCAyMTU0MDM2LCAxNTI0MDM2LCA1MTI0MDM2LCAyNTE0MDM2LCA1MjE0MDM2LAorICAgICAgMTQ1MjAzNiwgNDE1MjAzNiwgMTU0MjAzNiwgNTE0MjAzNiwgNDUxMjAzNiwgNTQxMjAzNiwgMjQ1MTAzNiwgNDI1MTAzNiwgMjU0MTAzNiwgNTI0MTAzNiwgNDUyMTAzNiwgNTQyMTAzNiwKKyAgICAgICAxMzQ1MjYsIDEwMzQ1MjYsICAzMTQ1MjYsIDMwMTQ1MjYsIDEzMDQ1MjYsIDMxMDQ1MjYsICAxNDM1MjYsIDEwNDM1MjYsICA0MTM1MjYsIDQwMTM1MjYsIDE0MDM1MjYsIDQxMDM1MjYsCisgICAgICAgMzQxNTI2LCAzMDQxNTI2LCAgNDMxNTI2LCA0MDMxNTI2LCAzNDAxNTI2LCA0MzAxNTI2LCAxMzQwNTI2LCAzMTQwNTI2LCAxNDMwNTI2LCA0MTMwNTI2LCAzNDEwNTI2LCA0MzEwNTI2LAorICAgICAgIDEzNTQyNiwgMTAzNTQyNiwgIDMxNTQyNiwgMzAxNTQyNiwgMTMwNTQyNiwgMzEwNTQyNiwgIDE1MzQyNiwgMTA1MzQyNiwgIDUxMzQyNiwgNTAxMzQyNiwgMTUwMzQyNiwgNTEwMzQyNiwKKyAgICAgICAzNTE0MjYsIDMwNTE0MjYsICA1MzE0MjYsIDUwMzE0MjYsIDM1MDE0MjYsIDUzMDE0MjYsIDEzNTA0MjYsIDMxNTA0MjYsIDE1MzA0MjYsIDUxMzA0MjYsIDM1MTA0MjYsIDUzMTA0MjYsCisgICAgICAgMTQ1MzI2LCAxMDQ1MzI2LCAgNDE1MzI2LCA0MDE1MzI2LCAxNDA1MzI2LCA0MTA1MzI2LCAgMTU0MzI2LCAxMDU0MzI2LCAgNTE0MzI2LCA1MDE0MzI2LCAxNTA0MzI2LCA1MTA0MzI2LAorICAgICAgIDQ1MTMyNiwgNDA1MTMyNiwgIDU0MTMyNiwgNTA0MTMyNiwgNDUwMTMyNiwgNTQwMTMyNiwgMTQ1MDMyNiwgNDE1MDMyNiwgMTU0MDMyNiwgNTE0MDMyNiwgNDUxMDMyNiwgNTQxMDMyNiwKKyAgICAgICAzNDUxMjYsIDMwNDUxMjYsICA0MzUxMjYsIDQwMzUxMjYsIDM0MDUxMjYsIDQzMDUxMjYsICAzNTQxMjYsIDMwNTQxMjYsICA1MzQxMjYsIDUwMzQxMjYsIDM1MDQxMjYsIDUzMDQxMjYsCisgICAgICAgNDUzMTI2LCA0MDUzMTI2LCAgNTQzMTI2LCA1MDQzMTI2LCA0NTAzMTI2LCA1NDAzMTI2LCAzNDUwMTI2LCA0MzUwMTI2LCAzNTQwMTI2LCA1MzQwMTI2LCA0NTMwMTI2LCA1NDMwMTI2LAorICAgICAgMTM0NTAyNiwgMzE0NTAyNiwgMTQzNTAyNiwgNDEzNTAyNiwgMzQxNTAyNiwgNDMxNTAyNiwgMTM1NDAyNiwgMzE1NDAyNiwgMTUzNDAyNiwgNTEzNDAyNiwgMzUxNDAyNiwgNTMxNDAyNiwKKyAgICAgIDE0NTMwMjYsIDQxNTMwMjYsIDE1NDMwMjYsIDUxNDMwMjYsIDQ1MTMwMjYsIDU0MTMwMjYsIDM0NTEwMjYsIDQzNTEwMjYsIDM1NDEwMjYsIDUzNDEwMjYsIDQ1MzEwMjYsIDU0MzEwMjYsCisgICAgICAgMjM0NTE2LCAyMDM0NTE2LCAgMzI0NTE2LCAzMDI0NTE2LCAyMzA0NTE2LCAzMjA0NTE2LCAgMjQzNTE2LCAyMDQzNTE2LCAgNDIzNTE2LCA0MDIzNTE2LCAyNDAzNTE2LCA0MjAzNTE2LAorICAgICAgIDM0MjUxNiwgMzA0MjUxNiwgIDQzMjUxNiwgNDAzMjUxNiwgMzQwMjUxNiwgNDMwMjUxNiwgMjM0MDUxNiwgMzI0MDUxNiwgMjQzMDUxNiwgNDIzMDUxNiwgMzQyMDUxNiwgNDMyMDUxNiwKKyAgICAgICAyMzU0MTYsIDIwMzU0MTYsICAzMjU0MTYsIDMwMjU0MTYsIDIzMDU0MTYsIDMyMDU0MTYsICAyNTM0MTYsIDIwNTM0MTYsICA1MjM0MTYsIDUwMjM0MTYsIDI1MDM0MTYsIDUyMDM0MTYsCisgICAgICAgMzUyNDE2LCAzMDUyNDE2LCAgNTMyNDE2LCA1MDMyNDE2LCAzNTAyNDE2LCA1MzAyNDE2LCAyMzUwNDE2LCAzMjUwNDE2LCAyNTMwNDE2LCA1MjMwNDE2LCAzNTIwNDE2LCA1MzIwNDE2LAorICAgICAgIDI0NTMxNiwgMjA0NTMxNiwgIDQyNTMxNiwgNDAyNTMxNiwgMjQwNTMxNiwgNDIwNTMxNiwgIDI1NDMxNiwgMjA1NDMxNiwgIDUyNDMxNiwgNTAyNDMxNiwgMjUwNDMxNiwgNTIwNDMxNiwKKyAgICAgICA0NTIzMTYsIDQwNTIzMTYsICA1NDIzMTYsIDUwNDIzMTYsIDQ1MDIzMTYsIDU0MDIzMTYsIDI0NTAzMTYsIDQyNTAzMTYsIDI1NDAzMTYsIDUyNDAzMTYsIDQ1MjAzMTYsIDU0MjAzMTYsCisgICAgICAgMzQ1MjE2LCAzMDQ1MjE2LCAgNDM1MjE2LCA0MDM1MjE2LCAzNDA1MjE2LCA0MzA1MjE2LCAgMzU0MjE2LCAzMDU0MjE2LCAgNTM0MjE2LCA1MDM0MjE2LCAzNTA0MjE2LCA1MzA0MjE2LAorICAgICAgIDQ1MzIxNiwgNDA1MzIxNiwgIDU0MzIxNiwgNTA0MzIxNiwgNDUwMzIxNiwgNTQwMzIxNiwgMzQ1MDIxNiwgNDM1MDIxNiwgMzU0MDIxNiwgNTM0MDIxNiwgNDUzMDIxNiwgNTQzMDIxNiwKKyAgICAgIDIzNDUwMTYsIDMyNDUwMTYsIDI0MzUwMTYsIDQyMzUwMTYsIDM0MjUwMTYsIDQzMjUwMTYsIDIzNTQwMTYsIDMyNTQwMTYsIDI1MzQwMTYsIDUyMzQwMTYsIDM1MjQwMTYsIDUzMjQwMTYsCisgICAgICAyNDUzMDE2LCA0MjUzMDE2LCAyNTQzMDE2LCA1MjQzMDE2LCA0NTIzMDE2LCA1NDIzMDE2LCAzNDUyMDE2LCA0MzUyMDE2LCAzNTQyMDE2LCA1MzQyMDE2LCA0NTMyMDE2LCA1NDMyMDE2LAorICAgICAgMTIzNDUwNiwgMjEzNDUwNiwgMTMyNDUwNiwgMzEyNDUwNiwgMjMxNDUwNiwgMzIxNDUwNiwgMTI0MzUwNiwgMjE0MzUwNiwgMTQyMzUwNiwgNDEyMzUwNiwgMjQxMzUwNiwgNDIxMzUwNiwKKyAgICAgIDEzNDI1MDYsIDMxNDI1MDYsIDE0MzI1MDYsIDQxMzI1MDYsIDM0MTI1MDYsIDQzMTI1MDYsIDIzNDE1MDYsIDMyNDE1MDYsIDI0MzE1MDYsIDQyMzE1MDYsIDM0MjE1MDYsIDQzMjE1MDYsCisgICAgICAxMjM1NDA2LCAyMTM1NDA2LCAxMzI1NDA2LCAzMTI1NDA2LCAyMzE1NDA2LCAzMjE1NDA2LCAxMjUzNDA2LCAyMTUzNDA2LCAxNTIzNDA2LCA1MTIzNDA2LCAyNTEzNDA2LCA1MjEzNDA2LAorICAgICAgMTM1MjQwNiwgMzE1MjQwNiwgMTUzMjQwNiwgNTEzMjQwNiwgMzUxMjQwNiwgNTMxMjQwNiwgMjM1MTQwNiwgMzI1MTQwNiwgMjUzMTQwNiwgNTIzMTQwNiwgMzUyMTQwNiwgNTMyMTQwNiwKKyAgICAgIDEyNDUzMDYsIDIxNDUzMDYsIDE0MjUzMDYsIDQxMjUzMDYsIDI0MTUzMDYsIDQyMTUzMDYsIDEyNTQzMDYsIDIxNTQzMDYsIDE1MjQzMDYsIDUxMjQzMDYsIDI1MTQzMDYsIDUyMTQzMDYsCisgICAgICAxNDUyMzA2LCA0MTUyMzA2LCAxNTQyMzA2LCA1MTQyMzA2LCA0NTEyMzA2LCA1NDEyMzA2LCAyNDUxMzA2LCA0MjUxMzA2LCAyNTQxMzA2LCA1MjQxMzA2LCA0NTIxMzA2LCA1NDIxMzA2LAorICAgICAgMTM0NTIwNiwgMzE0NTIwNiwgMTQzNTIwNiwgNDEzNTIwNiwgMzQxNTIwNiwgNDMxNTIwNiwgMTM1NDIwNiwgMzE1NDIwNiwgMTUzNDIwNiwgNTEzNDIwNiwgMzUxNDIwNiwgNTMxNDIwNiwKKyAgICAgIDE0NTMyMDYsIDQxNTMyMDYsIDE1NDMyMDYsIDUxNDMyMDYsIDQ1MTMyMDYsIDU0MTMyMDYsIDM0NTEyMDYsIDQzNTEyMDYsIDM1NDEyMDYsIDUzNDEyMDYsIDQ1MzEyMDYsIDU0MzEyMDYsCisgICAgICAyMzQ1MTA2LCAzMjQ1MTA2LCAyNDM1MTA2LCA0MjM1MTA2LCAzNDI1MTA2LCA0MzI1MTA2LCAyMzU0MTA2LCAzMjU0MTA2LCAyNTM0MTA2LCA1MjM0MTA2LCAzNTI0MTA2LCA1MzI0MTA2LAorICAgICAgMjQ1MzEwNiwgNDI1MzEwNiwgMjU0MzEwNiwgNTI0MzEwNiwgNDUyMzEwNiwgNTQyMzEwNiwgMzQ1MjEwNiwgNDM1MjEwNiwgMzU0MjEwNiwgNTM0MjEwNiwgNDUzMjEwNiwgNTQzMjEwNiwKKyAgICAgICAxMjM0NjUsIDEwMjM0NjUsICAyMTM0NjUsIDIwMTM0NjUsIDEyMDM0NjUsIDIxMDM0NjUsICAxMzI0NjUsIDEwMzI0NjUsICAzMTI0NjUsIDMwMTI0NjUsIDEzMDI0NjUsIDMxMDI0NjUsCisgICAgICAgMjMxNDY1LCAyMDMxNDY1LCAgMzIxNDY1LCAzMDIxNDY1LCAyMzAxNDY1LCAzMjAxNDY1LCAxMjMwNDY1LCAyMTMwNDY1LCAxMzIwNDY1LCAzMTIwNDY1LCAyMzEwNDY1LCAzMjEwNDY1LAorICAgICAgIDEyNDM2NSwgMTAyNDM2NSwgIDIxNDM2NSwgMjAxNDM2NSwgMTIwNDM2NSwgMjEwNDM2NSwgIDE0MjM2NSwgMTA0MjM2NSwgIDQxMjM2NSwgNDAxMjM2NSwgMTQwMjM2NSwgNDEwMjM2NSwKKyAgICAgICAyNDEzNjUsIDIwNDEzNjUsICA0MjEzNjUsIDQwMjEzNjUsIDI0MDEzNjUsIDQyMDEzNjUsIDEyNDAzNjUsIDIxNDAzNjUsIDE0MjAzNjUsIDQxMjAzNjUsIDI0MTAzNjUsIDQyMTAzNjUsCisgICAgICAgMTM0MjY1LCAxMDM0MjY1LCAgMzE0MjY1LCAzMDE0MjY1LCAxMzA0MjY1LCAzMTA0MjY1LCAgMTQzMjY1LCAxMDQzMjY1LCAgNDEzMjY1LCA0MDEzMjY1LCAxNDAzMjY1LCA0MTAzMjY1LAorICAgICAgIDM0MTI2NSwgMzA0MTI2NSwgIDQzMTI2NSwgNDAzMTI2NSwgMzQwMTI2NSwgNDMwMTI2NSwgMTM0MDI2NSwgMzE0MDI2NSwgMTQzMDI2NSwgNDEzMDI2NSwgMzQxMDI2NSwgNDMxMDI2NSwKKyAgICAgICAyMzQxNjUsIDIwMzQxNjUsICAzMjQxNjUsIDMwMjQxNjUsIDIzMDQxNjUsIDMyMDQxNjUsICAyNDMxNjUsIDIwNDMxNjUsICA0MjMxNjUsIDQwMjMxNjUsIDI0MDMxNjUsIDQyMDMxNjUsCisgICAgICAgMzQyMTY1LCAzMDQyMTY1LCAgNDMyMTY1LCA0MDMyMTY1LCAzNDAyMTY1LCA0MzAyMTY1LCAyMzQwMTY1LCAzMjQwMTY1LCAyNDMwMTY1LCA0MjMwMTY1LCAzNDIwMTY1LCA0MzIwMTY1LAorICAgICAgMTIzNDA2NSwgMjEzNDA2NSwgMTMyNDA2NSwgMzEyNDA2NSwgMjMxNDA2NSwgMzIxNDA2NSwgMTI0MzA2NSwgMjE0MzA2NSwgMTQyMzA2NSwgNDEyMzA2NSwgMjQxMzA2NSwgNDIxMzA2NSwKKyAgICAgIDEzNDIwNjUsIDMxNDIwNjUsIDE0MzIwNjUsIDQxMzIwNjUsIDM0MTIwNjUsIDQzMTIwNjUsIDIzNDEwNjUsIDMyNDEwNjUsIDI0MzEwNjUsIDQyMzEwNjUsIDM0MjEwNjUsIDQzMjEwNjUsCisgICAgICAgMTIzNjQ1LCAxMDIzNjQ1LCAgMjEzNjQ1LCAyMDEzNjQ1LCAxMjAzNjQ1LCAyMTAzNjQ1LCAgMTMyNjQ1LCAxMDMyNjQ1LCAgMzEyNjQ1LCAzMDEyNjQ1LCAxMzAyNjQ1LCAzMTAyNjQ1LAorICAgICAgIDIzMTY0NSwgMjAzMTY0NSwgIDMyMTY0NSwgMzAyMTY0NSwgMjMwMTY0NSwgMzIwMTY0NSwgMTIzMDY0NSwgMjEzMDY0NSwgMTMyMDY0NSwgMzEyMDY0NSwgMjMxMDY0NSwgMzIxMDY0NSwKKyAgICAgICAxMjYzNDUsIDEwMjYzNDUsICAyMTYzNDUsIDIwMTYzNDUsIDEyMDYzNDUsIDIxMDYzNDUsICAxNjIzNDUsIDEwNjIzNDUsICA2MTIzNDUsIDYwMTIzNDUsIDE2MDIzNDUsIDYxMDIzNDUsCisgICAgICAgMjYxMzQ1LCAyMDYxMzQ1LCAgNjIxMzQ1LCA2MDIxMzQ1LCAyNjAxMzQ1LCA2MjAxMzQ1LCAxMjYwMzQ1LCAyMTYwMzQ1LCAxNjIwMzQ1LCA2MTIwMzQ1LCAyNjEwMzQ1LCA2MjEwMzQ1LAorICAgICAgIDEzNjI0NSwgMTAzNjI0NSwgIDMxNjI0NSwgMzAxNjI0NSwgMTMwNjI0NSwgMzEwNjI0NSwgIDE2MzI0NSwgMTA2MzI0NSwgIDYxMzI0NSwgNjAxMzI0NSwgMTYwMzI0NSwgNjEwMzI0NSwKKyAgICAgICAzNjEyNDUsIDMwNjEyNDUsICA2MzEyNDUsIDYwMzEyNDUsIDM2MDEyNDUsIDYzMDEyNDUsIDEzNjAyNDUsIDMxNjAyNDUsIDE2MzAyNDUsIDYxMzAyNDUsIDM2MTAyNDUsIDYzMTAyNDUsCisgICAgICAgMjM2MTQ1LCAyMDM2MTQ1LCAgMzI2MTQ1LCAzMDI2MTQ1LCAyMzA2MTQ1LCAzMjA2MTQ1LCAgMjYzMTQ1LCAyMDYzMTQ1LCAgNjIzMTQ1LCA2MDIzMTQ1LCAyNjAzMTQ1LCA2MjAzMTQ1LAorICAgICAgIDM2MjE0NSwgMzA2MjE0NSwgIDYzMjE0NSwgNjAzMjE0NSwgMzYwMjE0NSwgNjMwMjE0NSwgMjM2MDE0NSwgMzI2MDE0NSwgMjYzMDE0NSwgNjIzMDE0NSwgMzYyMDE0NSwgNjMyMDE0NSwKKyAgICAgIDEyMzYwNDUsIDIxMzYwNDUsIDEzMjYwNDUsIDMxMjYwNDUsIDIzMTYwNDUsIDMyMTYwNDUsIDEyNjMwNDUsIDIxNjMwNDUsIDE2MjMwNDUsIDYxMjMwNDUsIDI2MTMwNDUsIDYyMTMwNDUsCisgICAgICAxMzYyMDQ1LCAzMTYyMDQ1LCAxNjMyMDQ1LCA2MTMyMDQ1LCAzNjEyMDQ1LCA2MzEyMDQ1LCAyMzYxMDQ1LCAzMjYxMDQ1LCAyNjMxMDQ1LCA2MjMxMDQ1LCAzNjIxMDQ1LCA2MzIxMDQ1LAorICAgICAgIDEyNDYzNSwgMTAyNDYzNSwgIDIxNDYzNSwgMjAxNDYzNSwgMTIwNDYzNSwgMjEwNDYzNSwgIDE0MjYzNSwgMTA0MjYzNSwgIDQxMjYzNSwgNDAxMjYzNSwgMTQwMjYzNSwgNDEwMjYzNSwKKyAgICAgICAyNDE2MzUsIDIwNDE2MzUsICA0MjE2MzUsIDQwMjE2MzUsIDI0MDE2MzUsIDQyMDE2MzUsIDEyNDA2MzUsIDIxNDA2MzUsIDE0MjA2MzUsIDQxMjA2MzUsIDI0MTA2MzUsIDQyMTA2MzUsCisgICAgICAgMTI2NDM1LCAxMDI2NDM1LCAgMjE2NDM1LCAyMDE2NDM1LCAxMjA2NDM1LCAyMTA2NDM1LCAgMTYyNDM1LCAxMDYyNDM1LCAgNjEyNDM1LCA2MDEyNDM1LCAxNjAyNDM1LCA2MTAyNDM1LAorICAgICAgIDI2MTQzNSwgMjA2MTQzNSwgIDYyMTQzNSwgNjAyMTQzNSwgMjYwMTQzNSwgNjIwMTQzNSwgMTI2MDQzNSwgMjE2MDQzNSwgMTYyMDQzNSwgNjEyMDQzNSwgMjYxMDQzNSwgNjIxMDQzNSwKKyAgICAgICAxNDYyMzUsIDEwNDYyMzUsICA0MTYyMzUsIDQwMTYyMzUsIDE0MDYyMzUsIDQxMDYyMzUsICAxNjQyMzUsIDEwNjQyMzUsICA2MTQyMzUsIDYwMTQyMzUsIDE2MDQyMzUsIDYxMDQyMzUsCisgICAgICAgNDYxMjM1LCA0MDYxMjM1LCAgNjQxMjM1LCA2MDQxMjM1LCA0NjAxMjM1LCA2NDAxMjM1LCAxNDYwMjM1LCA0MTYwMjM1LCAxNjQwMjM1LCA2MTQwMjM1LCA0NjEwMjM1LCA2NDEwMjM1LAorICAgICAgIDI0NjEzNSwgMjA0NjEzNSwgIDQyNjEzNSwgNDAyNjEzNSwgMjQwNjEzNSwgNDIwNjEzNSwgIDI2NDEzNSwgMjA2NDEzNSwgIDYyNDEzNSwgNjAyNDEzNSwgMjYwNDEzNSwgNjIwNDEzNSwKKyAgICAgICA0NjIxMzUsIDQwNjIxMzUsICA2NDIxMzUsIDYwNDIxMzUsIDQ2MDIxMzUsIDY0MDIxMzUsIDI0NjAxMzUsIDQyNjAxMzUsIDI2NDAxMzUsIDYyNDAxMzUsIDQ2MjAxMzUsIDY0MjAxMzUsCisgICAgICAxMjQ2MDM1LCAyMTQ2MDM1LCAxNDI2MDM1LCA0MTI2MDM1LCAyNDE2MDM1LCA0MjE2MDM1LCAxMjY0MDM1LCAyMTY0MDM1LCAxNjI0MDM1LCA2MTI0MDM1LCAyNjE0MDM1LCA2MjE0MDM1LAorICAgICAgMTQ2MjAzNSwgNDE2MjAzNSwgMTY0MjAzNSwgNjE0MjAzNSwgNDYxMjAzNSwgNjQxMjAzNSwgMjQ2MTAzNSwgNDI2MTAzNSwgMjY0MTAzNSwgNjI0MTAzNSwgNDYyMTAzNSwgNjQyMTAzNSwKKyAgICAgICAxMzQ2MjUsIDEwMzQ2MjUsICAzMTQ2MjUsIDMwMTQ2MjUsIDEzMDQ2MjUsIDMxMDQ2MjUsICAxNDM2MjUsIDEwNDM2MjUsICA0MTM2MjUsIDQwMTM2MjUsIDE0MDM2MjUsIDQxMDM2MjUsCisgICAgICAgMzQxNjI1LCAzMDQxNjI1LCAgNDMxNjI1LCA0MDMxNjI1LCAzNDAxNjI1LCA0MzAxNjI1LCAxMzQwNjI1LCAzMTQwNjI1LCAxNDMwNjI1LCA0MTMwNjI1LCAzNDEwNjI1LCA0MzEwNjI1LAorICAgICAgIDEzNjQyNSwgMTAzNjQyNSwgIDMxNjQyNSwgMzAxNjQyNSwgMTMwNjQyNSwgMzEwNjQyNSwgIDE2MzQyNSwgMTA2MzQyNSwgIDYxMzQyNSwgNjAxMzQyNSwgMTYwMzQyNSwgNjEwMzQyNSwKKyAgICAgICAzNjE0MjUsIDMwNjE0MjUsICA2MzE0MjUsIDYwMzE0MjUsIDM2MDE0MjUsIDYzMDE0MjUsIDEzNjA0MjUsIDMxNjA0MjUsIDE2MzA0MjUsIDYxMzA0MjUsIDM2MTA0MjUsIDYzMTA0MjUsCisgICAgICAgMTQ2MzI1LCAxMDQ2MzI1LCAgNDE2MzI1LCA0MDE2MzI1LCAxNDA2MzI1LCA0MTA2MzI1LCAgMTY0MzI1LCAxMDY0MzI1LCAgNjE0MzI1LCA2MDE0MzI1LCAxNjA0MzI1LCA2MTA0MzI1LAorICAgICAgIDQ2MTMyNSwgNDA2MTMyNSwgIDY0MTMyNSwgNjA0MTMyNSwgNDYwMTMyNSwgNjQwMTMyNSwgMTQ2MDMyNSwgNDE2MDMyNSwgMTY0MDMyNSwgNjE0MDMyNSwgNDYxMDMyNSwgNjQxMDMyNSwKKyAgICAgICAzNDYxMjUsIDMwNDYxMjUsICA0MzYxMjUsIDQwMzYxMjUsIDM0MDYxMjUsIDQzMDYxMjUsICAzNjQxMjUsIDMwNjQxMjUsICA2MzQxMjUsIDYwMzQxMjUsIDM2MDQxMjUsIDYzMDQxMjUsCisgICAgICAgNDYzMTI1LCA0MDYzMTI1LCAgNjQzMTI1LCA2MDQzMTI1LCA0NjAzMTI1LCA2NDAzMTI1LCAzNDYwMTI1LCA0MzYwMTI1LCAzNjQwMTI1LCA2MzQwMTI1LCA0NjMwMTI1LCA2NDMwMTI1LAorICAgICAgMTM0NjAyNSwgMzE0NjAyNSwgMTQzNjAyNSwgNDEzNjAyNSwgMzQxNjAyNSwgNDMxNjAyNSwgMTM2NDAyNSwgMzE2NDAyNSwgMTYzNDAyNSwgNjEzNDAyNSwgMzYxNDAyNSwgNjMxNDAyNSwKKyAgICAgIDE0NjMwMjUsIDQxNjMwMjUsIDE2NDMwMjUsIDYxNDMwMjUsIDQ2MTMwMjUsIDY0MTMwMjUsIDM0NjEwMjUsIDQzNjEwMjUsIDM2NDEwMjUsIDYzNDEwMjUsIDQ2MzEwMjUsIDY0MzEwMjUsCisgICAgICAgMjM0NjE1LCAyMDM0NjE1LCAgMzI0NjE1LCAzMDI0NjE1LCAyMzA0NjE1LCAzMjA0NjE1LCAgMjQzNjE1LCAyMDQzNjE1LCAgNDIzNjE1LCA0MDIzNjE1LCAyNDAzNjE1LCA0MjAzNjE1LAorICAgICAgIDM0MjYxNSwgMzA0MjYxNSwgIDQzMjYxNSwgNDAzMjYxNSwgMzQwMjYxNSwgNDMwMjYxNSwgMjM0MDYxNSwgMzI0MDYxNSwgMjQzMDYxNSwgNDIzMDYxNSwgMzQyMDYxNSwgNDMyMDYxNSwKKyAgICAgICAyMzY0MTUsIDIwMzY0MTUsICAzMjY0MTUsIDMwMjY0MTUsIDIzMDY0MTUsIDMyMDY0MTUsICAyNjM0MTUsIDIwNjM0MTUsICA2MjM0MTUsIDYwMjM0MTUsIDI2MDM0MTUsIDYyMDM0MTUsCisgICAgICAgMzYyNDE1LCAzMDYyNDE1LCAgNjMyNDE1LCA2MDMyNDE1LCAzNjAyNDE1LCA2MzAyNDE1LCAyMzYwNDE1LCAzMjYwNDE1LCAyNjMwNDE1LCA2MjMwNDE1LCAzNjIwNDE1LCA2MzIwNDE1LAorICAgICAgIDI0NjMxNSwgMjA0NjMxNSwgIDQyNjMxNSwgNDAyNjMxNSwgMjQwNjMxNSwgNDIwNjMxNSwgIDI2NDMxNSwgMjA2NDMxNSwgIDYyNDMxNSwgNjAyNDMxNSwgMjYwNDMxNSwgNjIwNDMxNSwKKyAgICAgICA0NjIzMTUsIDQwNjIzMTUsICA2NDIzMTUsIDYwNDIzMTUsIDQ2MDIzMTUsIDY0MDIzMTUsIDI0NjAzMTUsIDQyNjAzMTUsIDI2NDAzMTUsIDYyNDAzMTUsIDQ2MjAzMTUsIDY0MjAzMTUsCisgICAgICAgMzQ2MjE1LCAzMDQ2MjE1LCAgNDM2MjE1LCA0MDM2MjE1LCAzNDA2MjE1LCA0MzA2MjE1LCAgMzY0MjE1LCAzMDY0MjE1LCAgNjM0MjE1LCA2MDM0MjE1LCAzNjA0MjE1LCA2MzA0MjE1LAorICAgICAgIDQ2MzIxNSwgNDA2MzIxNSwgIDY0MzIxNSwgNjA0MzIxNSwgNDYwMzIxNSwgNjQwMzIxNSwgMzQ2MDIxNSwgNDM2MDIxNSwgMzY0MDIxNSwgNjM0MDIxNSwgNDYzMDIxNSwgNjQzMDIxNSwKKyAgICAgIDIzNDYwMTUsIDMyNDYwMTUsIDI0MzYwMTUsIDQyMzYwMTUsIDM0MjYwMTUsIDQzMjYwMTUsIDIzNjQwMTUsIDMyNjQwMTUsIDI2MzQwMTUsIDYyMzQwMTUsIDM2MjQwMTUsIDYzMjQwMTUsCisgICAgICAyNDYzMDE1LCA0MjYzMDE1LCAyNjQzMDE1LCA2MjQzMDE1LCA0NjIzMDE1LCA2NDIzMDE1LCAzNDYyMDE1LCA0MzYyMDE1LCAzNjQyMDE1LCA2MzQyMDE1LCA0NjMyMDE1LCA2NDMyMDE1LAorICAgICAgMTIzNDYwNSwgMjEzNDYwNSwgMTMyNDYwNSwgMzEyNDYwNSwgMjMxNDYwNSwgMzIxNDYwNSwgMTI0MzYwNSwgMjE0MzYwNSwgMTQyMzYwNSwgNDEyMzYwNSwgMjQxMzYwNSwgNDIxMzYwNSwKKyAgICAgIDEzNDI2MDUsIDMxNDI2MDUsIDE0MzI2MDUsIDQxMzI2MDUsIDM0MTI2MDUsIDQzMTI2MDUsIDIzNDE2MDUsIDMyNDE2MDUsIDI0MzE2MDUsIDQyMzE2MDUsIDM0MjE2MDUsIDQzMjE2MDUsCisgICAgICAxMjM2NDA1LCAyMTM2NDA1LCAxMzI2NDA1LCAzMTI2NDA1LCAyMzE2NDA1LCAzMjE2NDA1LCAxMjYzNDA1LCAyMTYzNDA1LCAxNjIzNDA1LCA2MTIzNDA1LCAyNjEzNDA1LCA2MjEzNDA1LAorICAgICAgMTM2MjQwNSwgMzE2MjQwNSwgMTYzMjQwNSwgNjEzMjQwNSwgMzYxMjQwNSwgNjMxMjQwNSwgMjM2MTQwNSwgMzI2MTQwNSwgMjYzMTQwNSwgNjIzMTQwNSwgMzYyMTQwNSwgNjMyMTQwNSwKKyAgICAgIDEyNDYzMDUsIDIxNDYzMDUsIDE0MjYzMDUsIDQxMjYzMDUsIDI0MTYzMDUsIDQyMTYzMDUsIDEyNjQzMDUsIDIxNjQzMDUsIDE2MjQzMDUsIDYxMjQzMDUsIDI2MTQzMDUsIDYyMTQzMDUsCisgICAgICAxNDYyMzA1LCA0MTYyMzA1LCAxNjQyMzA1LCA2MTQyMzA1LCA0NjEyMzA1LCA2NDEyMzA1LCAyNDYxMzA1LCA0MjYxMzA1LCAyNjQxMzA1LCA2MjQxMzA1LCA0NjIxMzA1LCA2NDIxMzA1LAorICAgICAgMTM0NjIwNSwgMzE0NjIwNSwgMTQzNjIwNSwgNDEzNjIwNSwgMzQxNjIwNSwgNDMxNjIwNSwgMTM2NDIwNSwgMzE2NDIwNSwgMTYzNDIwNSwgNjEzNDIwNSwgMzYxNDIwNSwgNjMxNDIwNSwKKyAgICAgIDE0NjMyMDUsIDQxNjMyMDUsIDE2NDMyMDUsIDYxNDMyMDUsIDQ2MTMyMDUsIDY0MTMyMDUsIDM0NjEyMDUsIDQzNjEyMDUsIDM2NDEyMDUsIDYzNDEyMDUsIDQ2MzEyMDUsIDY0MzEyMDUsCisgICAgICAyMzQ2MTA1LCAzMjQ2MTA1LCAyNDM2MTA1LCA0MjM2MTA1LCAzNDI2MTA1LCA0MzI2MTA1LCAyMzY0MTA1LCAzMjY0MTA1LCAyNjM0MTA1LCA2MjM0MTA1LCAzNjI0MTA1LCA2MzI0MTA1LAorICAgICAgMjQ2MzEwNSwgNDI2MzEwNSwgMjY0MzEwNSwgNjI0MzEwNSwgNDYyMzEwNSwgNjQyMzEwNSwgMzQ2MjEwNSwgNDM2MjEwNSwgMzY0MjEwNSwgNjM0MjEwNSwgNDYzMjEwNSwgNjQzMjEwNSwKKyAgICAgICAxMjM1NjQsIDEwMjM1NjQsICAyMTM1NjQsIDIwMTM1NjQsIDEyMDM1NjQsIDIxMDM1NjQsICAxMzI1NjQsIDEwMzI1NjQsICAzMTI1NjQsIDMwMTI1NjQsIDEzMDI1NjQsIDMxMDI1NjQsCisgICAgICAgMjMxNTY0LCAyMDMxNTY0LCAgMzIxNTY0LCAzMDIxNTY0LCAyMzAxNTY0LCAzMjAxNTY0LCAxMjMwNTY0LCAyMTMwNTY0LCAxMzIwNTY0LCAzMTIwNTY0LCAyMzEwNTY0LCAzMjEwNTY0LAorICAgICAgIDEyNTM2NCwgMTAyNTM2NCwgIDIxNTM2NCwgMjAxNTM2NCwgMTIwNTM2NCwgMjEwNTM2NCwgIDE1MjM2NCwgMTA1MjM2NCwgIDUxMjM2NCwgNTAxMjM2NCwgMTUwMjM2NCwgNTEwMjM2NCwKKyAgICAgICAyNTEzNjQsIDIwNTEzNjQsICA1MjEzNjQsIDUwMjEzNjQsIDI1MDEzNjQsIDUyMDEzNjQsIDEyNTAzNjQsIDIxNTAzNjQsIDE1MjAzNjQsIDUxMjAzNjQsIDI1MTAzNjQsIDUyMTAzNjQsCisgICAgICAgMTM1MjY0LCAxMDM1MjY0LCAgMzE1MjY0LCAzMDE1MjY0LCAxMzA1MjY0LCAzMTA1MjY0LCAgMTUzMjY0LCAxMDUzMjY0LCAgNTEzMjY0LCA1MDEzMjY0LCAxNTAzMjY0LCA1MTAzMjY0LAorICAgICAgIDM1MTI2NCwgMzA1MTI2NCwgIDUzMTI2NCwgNTAzMTI2NCwgMzUwMTI2NCwgNTMwMTI2NCwgMTM1MDI2NCwgMzE1MDI2NCwgMTUzMDI2NCwgNTEzMDI2NCwgMzUxMDI2NCwgNTMxMDI2NCwKKyAgICAgICAyMzUxNjQsIDIwMzUxNjQsICAzMjUxNjQsIDMwMjUxNjQsIDIzMDUxNjQsIDMyMDUxNjQsICAyNTMxNjQsIDIwNTMxNjQsICA1MjMxNjQsIDUwMjMxNjQsIDI1MDMxNjQsIDUyMDMxNjQsCisgICAgICAgMzUyMTY0LCAzMDUyMTY0LCAgNTMyMTY0LCA1MDMyMTY0LCAzNTAyMTY0LCA1MzAyMTY0LCAyMzUwMTY0LCAzMjUwMTY0LCAyNTMwMTY0LCA1MjMwMTY0LCAzNTIwMTY0LCA1MzIwMTY0LAorICAgICAgMTIzNTA2NCwgMjEzNTA2NCwgMTMyNTA2NCwgMzEyNTA2NCwgMjMxNTA2NCwgMzIxNTA2NCwgMTI1MzA2NCwgMjE1MzA2NCwgMTUyMzA2NCwgNTEyMzA2NCwgMjUxMzA2NCwgNTIxMzA2NCwKKyAgICAgIDEzNTIwNjQsIDMxNTIwNjQsIDE1MzIwNjQsIDUxMzIwNjQsIDM1MTIwNjQsIDUzMTIwNjQsIDIzNTEwNjQsIDMyNTEwNjQsIDI1MzEwNjQsIDUyMzEwNjQsIDM1MjEwNjQsIDUzMjEwNjQsCisgICAgICAgMTIzNjU0LCAxMDIzNjU0LCAgMjEzNjU0LCAyMDEzNjU0LCAxMjAzNjU0LCAyMTAzNjU0LCAgMTMyNjU0LCAxMDMyNjU0LCAgMzEyNjU0LCAzMDEyNjU0LCAxMzAyNjU0LCAzMTAyNjU0LAorICAgICAgIDIzMTY1NCwgMjAzMTY1NCwgIDMyMTY1NCwgMzAyMTY1NCwgMjMwMTY1NCwgMzIwMTY1NCwgMTIzMDY1NCwgMjEzMDY1NCwgMTMyMDY1NCwgMzEyMDY1NCwgMjMxMDY1NCwgMzIxMDY1NCwKKyAgICAgICAxMjYzNTQsIDEwMjYzNTQsICAyMTYzNTQsIDIwMTYzNTQsIDEyMDYzNTQsIDIxMDYzNTQsICAxNjIzNTQsIDEwNjIzNTQsICA2MTIzNTQsIDYwMTIzNTQsIDE2MDIzNTQsIDYxMDIzNTQsCisgICAgICAgMjYxMzU0LCAyMDYxMzU0LCAgNjIxMzU0LCA2MDIxMzU0LCAyNjAxMzU0LCA2MjAxMzU0LCAxMjYwMzU0LCAyMTYwMzU0LCAxNjIwMzU0LCA2MTIwMzU0LCAyNjEwMzU0LCA2MjEwMzU0LAorICAgICAgIDEzNjI1NCwgMTAzNjI1NCwgIDMxNjI1NCwgMzAxNjI1NCwgMTMwNjI1NCwgMzEwNjI1NCwgIDE2MzI1NCwgMTA2MzI1NCwgIDYxMzI1NCwgNjAxMzI1NCwgMTYwMzI1NCwgNjEwMzI1NCwKKyAgICAgICAzNjEyNTQsIDMwNjEyNTQsICA2MzEyNTQsIDYwMzEyNTQsIDM2MDEyNTQsIDYzMDEyNTQsIDEzNjAyNTQsIDMxNjAyNTQsIDE2MzAyNTQsIDYxMzAyNTQsIDM2MTAyNTQsIDYzMTAyNTQsCisgICAgICAgMjM2MTU0LCAyMDM2MTU0LCAgMzI2MTU0LCAzMDI2MTU0LCAyMzA2MTU0LCAzMjA2MTU0LCAgMjYzMTU0LCAyMDYzMTU0LCAgNjIzMTU0LCA2MDIzMTU0LCAyNjAzMTU0LCA2MjAzMTU0LAorICAgICAgIDM2MjE1NCwgMzA2MjE1NCwgIDYzMjE1NCwgNjAzMjE1NCwgMzYwMjE1NCwgNjMwMjE1NCwgMjM2MDE1NCwgMzI2MDE1NCwgMjYzMDE1NCwgNjIzMDE1NCwgMzYyMDE1NCwgNjMyMDE1NCwKKyAgICAgIDEyMzYwNTQsIDIxMzYwNTQsIDEzMjYwNTQsIDMxMjYwNTQsIDIzMTYwNTQsIDMyMTYwNTQsIDEyNjMwNTQsIDIxNjMwNTQsIDE2MjMwNTQsIDYxMjMwNTQsIDI2MTMwNTQsIDYyMTMwNTQsCisgICAgICAxMzYyMDU0LCAzMTYyMDU0LCAxNjMyMDU0LCA2MTMyMDU0LCAzNjEyMDU0LCA2MzEyMDU0LCAyMzYxMDU0LCAzMjYxMDU0LCAyNjMxMDU0LCA2MjMxMDU0LCAzNjIxMDU0LCA2MzIxMDU0LAorICAgICAgIDEyNTYzNCwgMTAyNTYzNCwgIDIxNTYzNCwgMjAxNTYzNCwgMTIwNTYzNCwgMjEwNTYzNCwgIDE1MjYzNCwgMTA1MjYzNCwgIDUxMjYzNCwgNTAxMjYzNCwgMTUwMjYzNCwgNTEwMjYzNCwKKyAgICAgICAyNTE2MzQsIDIwNTE2MzQsICA1MjE2MzQsIDUwMjE2MzQsIDI1MDE2MzQsIDUyMDE2MzQsIDEyNTA2MzQsIDIxNTA2MzQsIDE1MjA2MzQsIDUxMjA2MzQsIDI1MTA2MzQsIDUyMTA2MzQsCisgICAgICAgMTI2NTM0LCAxMDI2NTM0LCAgMjE2NTM0LCAyMDE2NTM0LCAxMjA2NTM0LCAyMTA2NTM0LCAgMTYyNTM0LCAxMDYyNTM0LCAgNjEyNTM0LCA2MDEyNTM0LCAxNjAyNTM0LCA2MTAyNTM0LAorICAgICAgIDI2MTUzNCwgMjA2MTUzNCwgIDYyMTUzNCwgNjAyMTUzNCwgMjYwMTUzNCwgNjIwMTUzNCwgMTI2MDUzNCwgMjE2MDUzNCwgMTYyMDUzNCwgNjEyMDUzNCwgMjYxMDUzNCwgNjIxMDUzNCwKKyAgICAgICAxNTYyMzQsIDEwNTYyMzQsICA1MTYyMzQsIDUwMTYyMzQsIDE1MDYyMzQsIDUxMDYyMzQsICAxNjUyMzQsIDEwNjUyMzQsICA2MTUyMzQsIDYwMTUyMzQsIDE2MDUyMzQsIDYxMDUyMzQsCisgICAgICAgNTYxMjM0LCA1MDYxMjM0LCAgNjUxMjM0LCA2MDUxMjM0LCA1NjAxMjM0LCA2NTAxMjM0LCAxNTYwMjM0LCA1MTYwMjM0LCAxNjUwMjM0LCA2MTUwMjM0LCA1NjEwMjM0LCA2NTEwMjM0LAorICAgICAgIDI1NjEzNCwgMjA1NjEzNCwgIDUyNjEzNCwgNTAyNjEzNCwgMjUwNjEzNCwgNTIwNjEzNCwgIDI2NTEzNCwgMjA2NTEzNCwgIDYyNTEzNCwgNjAyNTEzNCwgMjYwNTEzNCwgNjIwNTEzNCwKKyAgICAgICA1NjIxMzQsIDUwNjIxMzQsICA2NTIxMzQsIDYwNTIxMzQsIDU2MDIxMzQsIDY1MDIxMzQsIDI1NjAxMzQsIDUyNjAxMzQsIDI2NTAxMzQsIDYyNTAxMzQsIDU2MjAxMzQsIDY1MjAxMzQsCisgICAgICAxMjU2MDM0LCAyMTU2MDM0LCAxNTI2MDM0LCA1MTI2MDM0LCAyNTE2MDM0LCA1MjE2MDM0LCAxMjY1MDM0LCAyMTY1MDM0LCAxNjI1MDM0LCA2MTI1MDM0LCAyNjE1MDM0LCA2MjE1MDM0LAorICAgICAgMTU2MjAzNCwgNTE2MjAzNCwgMTY1MjAzNCwgNjE1MjAzNCwgNTYxMjAzNCwgNjUxMjAzNCwgMjU2MTAzNCwgNTI2MTAzNCwgMjY1MTAzNCwgNjI1MTAzNCwgNTYyMTAzNCwgNjUyMTAzNCwKKyAgICAgICAxMzU2MjQsIDEwMzU2MjQsICAzMTU2MjQsIDMwMTU2MjQsIDEzMDU2MjQsIDMxMDU2MjQsICAxNTM2MjQsIDEwNTM2MjQsICA1MTM2MjQsIDUwMTM2MjQsIDE1MDM2MjQsIDUxMDM2MjQsCisgICAgICAgMzUxNjI0LCAzMDUxNjI0LCAgNTMxNjI0LCA1MDMxNjI0LCAzNTAxNjI0LCA1MzAxNjI0LCAxMzUwNjI0LCAzMTUwNjI0LCAxNTMwNjI0LCA1MTMwNjI0LCAzNTEwNjI0LCA1MzEwNjI0LAorICAgICAgIDEzNjUyNCwgMTAzNjUyNCwgIDMxNjUyNCwgMzAxNjUyNCwgMTMwNjUyNCwgMzEwNjUyNCwgIDE2MzUyNCwgMTA2MzUyNCwgIDYxMzUyNCwgNjAxMzUyNCwgMTYwMzUyNCwgNjEwMzUyNCwKKyAgICAgICAzNjE1MjQsIDMwNjE1MjQsICA2MzE1MjQsIDYwMzE1MjQsIDM2MDE1MjQsIDYzMDE1MjQsIDEzNjA1MjQsIDMxNjA1MjQsIDE2MzA1MjQsIDYxMzA1MjQsIDM2MTA1MjQsIDYzMTA1MjQsCisgICAgICAgMTU2MzI0LCAxMDU2MzI0LCAgNTE2MzI0LCA1MDE2MzI0LCAxNTA2MzI0LCA1MTA2MzI0LCAgMTY1MzI0LCAxMDY1MzI0LCAgNjE1MzI0LCA2MDE1MzI0LCAxNjA1MzI0LCA2MTA1MzI0LAorICAgICAgIDU2MTMyNCwgNTA2MTMyNCwgIDY1MTMyNCwgNjA1MTMyNCwgNTYwMTMyNCwgNjUwMTMyNCwgMTU2MDMyNCwgNTE2MDMyNCwgMTY1MDMyNCwgNjE1MDMyNCwgNTYxMDMyNCwgNjUxMDMyNCwKKyAgICAgICAzNTYxMjQsIDMwNTYxMjQsICA1MzYxMjQsIDUwMzYxMjQsIDM1MDYxMjQsIDUzMDYxMjQsICAzNjUxMjQsIDMwNjUxMjQsICA2MzUxMjQsIDYwMzUxMjQsIDM2MDUxMjQsIDYzMDUxMjQsCisgICAgICAgNTYzMTI0LCA1MDYzMTI0LCAgNjUzMTI0LCA2MDUzMTI0LCA1NjAzMTI0LCA2NTAzMTI0LCAzNTYwMTI0LCA1MzYwMTI0LCAzNjUwMTI0LCA2MzUwMTI0LCA1NjMwMTI0LCA2NTMwMTI0LAorICAgICAgMTM1NjAyNCwgMzE1NjAyNCwgMTUzNjAyNCwgNTEzNjAyNCwgMzUxNjAyNCwgNTMxNjAyNCwgMTM2NTAyNCwgMzE2NTAyNCwgMTYzNTAyNCwgNjEzNTAyNCwgMzYxNTAyNCwgNjMxNTAyNCwKKyAgICAgIDE1NjMwMjQsIDUxNjMwMjQsIDE2NTMwMjQsIDYxNTMwMjQsIDU2MTMwMjQsIDY1MTMwMjQsIDM1NjEwMjQsIDUzNjEwMjQsIDM2NTEwMjQsIDYzNTEwMjQsIDU2MzEwMjQsIDY1MzEwMjQsCisgICAgICAgMjM1NjE0LCAyMDM1NjE0LCAgMzI1NjE0LCAzMDI1NjE0LCAyMzA1NjE0LCAzMjA1NjE0LCAgMjUzNjE0LCAyMDUzNjE0LCAgNTIzNjE0LCA1MDIzNjE0LCAyNTAzNjE0LCA1MjAzNjE0LAorICAgICAgIDM1MjYxNCwgMzA1MjYxNCwgIDUzMjYxNCwgNTAzMjYxNCwgMzUwMjYxNCwgNTMwMjYxNCwgMjM1MDYxNCwgMzI1MDYxNCwgMjUzMDYxNCwgNTIzMDYxNCwgMzUyMDYxNCwgNTMyMDYxNCwKKyAgICAgICAyMzY1MTQsIDIwMzY1MTQsICAzMjY1MTQsIDMwMjY1MTQsIDIzMDY1MTQsIDMyMDY1MTQsICAyNjM1MTQsIDIwNjM1MTQsICA2MjM1MTQsIDYwMjM1MTQsIDI2MDM1MTQsIDYyMDM1MTQsCisgICAgICAgMzYyNTE0LCAzMDYyNTE0LCAgNjMyNTE0LCA2MDMyNTE0LCAzNjAyNTE0LCA2MzAyNTE0LCAyMzYwNTE0LCAzMjYwNTE0LCAyNjMwNTE0LCA2MjMwNTE0LCAzNjIwNTE0LCA2MzIwNTE0LAorICAgICAgIDI1NjMxNCwgMjA1NjMxNCwgIDUyNjMxNCwgNTAyNjMxNCwgMjUwNjMxNCwgNTIwNjMxNCwgIDI2NTMxNCwgMjA2NTMxNCwgIDYyNTMxNCwgNjAyNTMxNCwgMjYwNTMxNCwgNjIwNTMxNCwKKyAgICAgICA1NjIzMTQsIDUwNjIzMTQsICA2NTIzMTQsIDYwNTIzMTQsIDU2MDIzMTQsIDY1MDIzMTQsIDI1NjAzMTQsIDUyNjAzMTQsIDI2NTAzMTQsIDYyNTAzMTQsIDU2MjAzMTQsIDY1MjAzMTQsCisgICAgICAgMzU2MjE0LCAzMDU2MjE0LCAgNTM2MjE0LCA1MDM2MjE0LCAzNTA2MjE0LCA1MzA2MjE0LCAgMzY1MjE0LCAzMDY1MjE0LCAgNjM1MjE0LCA2MDM1MjE0LCAzNjA1MjE0LCA2MzA1MjE0LAorICAgICAgIDU2MzIxNCwgNTA2MzIxNCwgIDY1MzIxNCwgNjA1MzIxNCwgNTYwMzIxNCwgNjUwMzIxNCwgMzU2MDIxNCwgNTM2MDIxNCwgMzY1MDIxNCwgNjM1MDIxNCwgNTYzMDIxNCwgNjUzMDIxNCwKKyAgICAgIDIzNTYwMTQsIDMyNTYwMTQsIDI1MzYwMTQsIDUyMzYwMTQsIDM1MjYwMTQsIDUzMjYwMTQsIDIzNjUwMTQsIDMyNjUwMTQsIDI2MzUwMTQsIDYyMzUwMTQsIDM2MjUwMTQsIDYzMjUwMTQsCisgICAgICAyNTYzMDE0LCA1MjYzMDE0LCAyNjUzMDE0LCA2MjUzMDE0LCA1NjIzMDE0LCA2NTIzMDE0LCAzNTYyMDE0LCA1MzYyMDE0LCAzNjUyMDE0LCA2MzUyMDE0LCA1NjMyMDE0LCA2NTMyMDE0LAorICAgICAgMTIzNTYwNCwgMjEzNTYwNCwgMTMyNTYwNCwgMzEyNTYwNCwgMjMxNTYwNCwgMzIxNTYwNCwgMTI1MzYwNCwgMjE1MzYwNCwgMTUyMzYwNCwgNTEyMzYwNCwgMjUxMzYwNCwgNTIxMzYwNCwKKyAgICAgIDEzNTI2MDQsIDMxNTI2MDQsIDE1MzI2MDQsIDUxMzI2MDQsIDM1MTI2MDQsIDUzMTI2MDQsIDIzNTE2MDQsIDMyNTE2MDQsIDI1MzE2MDQsIDUyMzE2MDQsIDM1MjE2MDQsIDUzMjE2MDQsCisgICAgICAxMjM2NTA0LCAyMTM2NTA0LCAxMzI2NTA0LCAzMTI2NTA0LCAyMzE2NTA0LCAzMjE2NTA0LCAxMjYzNTA0LCAyMTYzNTA0LCAxNjIzNTA0LCA2MTIzNTA0LCAyNjEzNTA0LCA2MjEzNTA0LAorICAgICAgMTM2MjUwNCwgMzE2MjUwNCwgMTYzMjUwNCwgNjEzMjUwNCwgMzYxMjUwNCwgNjMxMjUwNCwgMjM2MTUwNCwgMzI2MTUwNCwgMjYzMTUwNCwgNjIzMTUwNCwgMzYyMTUwNCwgNjMyMTUwNCwKKyAgICAgIDEyNTYzMDQsIDIxNTYzMDQsIDE1MjYzMDQsIDUxMjYzMDQsIDI1MTYzMDQsIDUyMTYzMDQsIDEyNjUzMDQsIDIxNjUzMDQsIDE2MjUzMDQsIDYxMjUzMDQsIDI2MTUzMDQsIDYyMTUzMDQsCisgICAgICAxNTYyMzA0LCA1MTYyMzA0LCAxNjUyMzA0LCA2MTUyMzA0LCA1NjEyMzA0LCA2NTEyMzA0LCAyNTYxMzA0LCA1MjYxMzA0LCAyNjUxMzA0LCA2MjUxMzA0LCA1NjIxMzA0LCA2NTIxMzA0LAorICAgICAgMTM1NjIwNCwgMzE1NjIwNCwgMTUzNjIwNCwgNTEzNjIwNCwgMzUxNjIwNCwgNTMxNjIwNCwgMTM2NTIwNCwgMzE2NTIwNCwgMTYzNTIwNCwgNjEzNTIwNCwgMzYxNTIwNCwgNjMxNTIwNCwKKyAgICAgIDE1NjMyMDQsIDUxNjMyMDQsIDE2NTMyMDQsIDYxNTMyMDQsIDU2MTMyMDQsIDY1MTMyMDQsIDM1NjEyMDQsIDUzNjEyMDQsIDM2NTEyMDQsIDYzNTEyMDQsIDU2MzEyMDQsIDY1MzEyMDQsCisgICAgICAyMzU2MTA0LCAzMjU2MTA0LCAyNTM2MTA0LCA1MjM2MTA0LCAzNTI2MTA0LCA1MzI2MTA0LCAyMzY1MTA0LCAzMjY1MTA0LCAyNjM1MTA0LCA2MjM1MTA0LCAzNjI1MTA0LCA2MzI1MTA0LAorICAgICAgMjU2MzEwNCwgNTI2MzEwNCwgMjY1MzEwNCwgNjI1MzEwNCwgNTYyMzEwNCwgNjUyMzEwNCwgMzU2MjEwNCwgNTM2MjEwNCwgMzY1MjEwNCwgNjM1MjEwNCwgNTYzMjEwNCwgNjUzMjEwNCwKKyAgICAgICAxMjQ1NjMsIDEwMjQ1NjMsICAyMTQ1NjMsIDIwMTQ1NjMsIDEyMDQ1NjMsIDIxMDQ1NjMsICAxNDI1NjMsIDEwNDI1NjMsICA0MTI1NjMsIDQwMTI1NjMsIDE0MDI1NjMsIDQxMDI1NjMsCisgICAgICAgMjQxNTYzLCAyMDQxNTYzLCAgNDIxNTYzLCA0MDIxNTYzLCAyNDAxNTYzLCA0MjAxNTYzLCAxMjQwNTYzLCAyMTQwNTYzLCAxNDIwNTYzLCA0MTIwNTYzLCAyNDEwNTYzLCA0MjEwNTYzLAorICAgICAgIDEyNTQ2MywgMTAyNTQ2MywgIDIxNTQ2MywgMjAxNTQ2MywgMTIwNTQ2MywgMjEwNTQ2MywgIDE1MjQ2MywgMTA1MjQ2MywgIDUxMjQ2MywgNTAxMjQ2MywgMTUwMjQ2MywgNTEwMjQ2MywKKyAgICAgICAyNTE0NjMsIDIwNTE0NjMsICA1MjE0NjMsIDUwMjE0NjMsIDI1MDE0NjMsIDUyMDE0NjMsIDEyNTA0NjMsIDIxNTA0NjMsIDE1MjA0NjMsIDUxMjA0NjMsIDI1MTA0NjMsIDUyMTA0NjMsCisgICAgICAgMTQ1MjYzLCAxMDQ1MjYzLCAgNDE1MjYzLCA0MDE1MjYzLCAxNDA1MjYzLCA0MTA1MjYzLCAgMTU0MjYzLCAxMDU0MjYzLCAgNTE0MjYzLCA1MDE0MjYzLCAxNTA0MjYzLCA1MTA0MjYzLAorICAgICAgIDQ1MTI2MywgNDA1MTI2MywgIDU0MTI2MywgNTA0MTI2MywgNDUwMTI2MywgNTQwMTI2MywgMTQ1MDI2MywgNDE1MDI2MywgMTU0MDI2MywgNTE0MDI2MywgNDUxMDI2MywgNTQxMDI2MywKKyAgICAgICAyNDUxNjMsIDIwNDUxNjMsICA0MjUxNjMsIDQwMjUxNjMsIDI0MDUxNjMsIDQyMDUxNjMsICAyNTQxNjMsIDIwNTQxNjMsICA1MjQxNjMsIDUwMjQxNjMsIDI1MDQxNjMsIDUyMDQxNjMsCisgICAgICAgNDUyMTYzLCA0MDUyMTYzLCAgNTQyMTYzLCA1MDQyMTYzLCA0NTAyMTYzLCA1NDAyMTYzLCAyNDUwMTYzLCA0MjUwMTYzLCAyNTQwMTYzLCA1MjQwMTYzLCA0NTIwMTYzLCA1NDIwMTYzLAorICAgICAgMTI0NTA2MywgMjE0NTA2MywgMTQyNTA2MywgNDEyNTA2MywgMjQxNTA2MywgNDIxNTA2MywgMTI1NDA2MywgMjE1NDA2MywgMTUyNDA2MywgNTEyNDA2MywgMjUxNDA2MywgNTIxNDA2MywKKyAgICAgIDE0NTIwNjMsIDQxNTIwNjMsIDE1NDIwNjMsIDUxNDIwNjMsIDQ1MTIwNjMsIDU0MTIwNjMsIDI0NTEwNjMsIDQyNTEwNjMsIDI1NDEwNjMsIDUyNDEwNjMsIDQ1MjEwNjMsIDU0MjEwNjMsCisgICAgICAgMTI0NjUzLCAxMDI0NjUzLCAgMjE0NjUzLCAyMDE0NjUzLCAxMjA0NjUzLCAyMTA0NjUzLCAgMTQyNjUzLCAxMDQyNjUzLCAgNDEyNjUzLCA0MDEyNjUzLCAxNDAyNjUzLCA0MTAyNjUzLAorICAgICAgIDI0MTY1MywgMjA0MTY1MywgIDQyMTY1MywgNDAyMTY1MywgMjQwMTY1MywgNDIwMTY1MywgMTI0MDY1MywgMjE0MDY1MywgMTQyMDY1MywgNDEyMDY1MywgMjQxMDY1MywgNDIxMDY1MywKKyAgICAgICAxMjY0NTMsIDEwMjY0NTMsICAyMTY0NTMsIDIwMTY0NTMsIDEyMDY0NTMsIDIxMDY0NTMsICAxNjI0NTMsIDEwNjI0NTMsICA2MTI0NTMsIDYwMTI0NTMsIDE2MDI0NTMsIDYxMDI0NTMsCisgICAgICAgMjYxNDUzLCAyMDYxNDUzLCAgNjIxNDUzLCA2MDIxNDUzLCAyNjAxNDUzLCA2MjAxNDUzLCAxMjYwNDUzLCAyMTYwNDUzLCAxNjIwNDUzLCA2MTIwNDUzLCAyNjEwNDUzLCA2MjEwNDUzLAorICAgICAgIDE0NjI1MywgMTA0NjI1MywgIDQxNjI1MywgNDAxNjI1MywgMTQwNjI1MywgNDEwNjI1MywgIDE2NDI1MywgMTA2NDI1MywgIDYxNDI1MywgNjAxNDI1MywgMTYwNDI1MywgNjEwNDI1MywKKyAgICAgICA0NjEyNTMsIDQwNjEyNTMsICA2NDEyNTMsIDYwNDEyNTMsIDQ2MDEyNTMsIDY0MDEyNTMsIDE0NjAyNTMsIDQxNjAyNTMsIDE2NDAyNTMsIDYxNDAyNTMsIDQ2MTAyNTMsIDY0MTAyNTMsCisgICAgICAgMjQ2MTUzLCAyMDQ2MTUzLCAgNDI2MTUzLCA0MDI2MTUzLCAyNDA2MTUzLCA0MjA2MTUzLCAgMjY0MTUzLCAyMDY0MTUzLCAgNjI0MTUzLCA2MDI0MTUzLCAyNjA0MTUzLCA2MjA0MTUzLAorICAgICAgIDQ2MjE1MywgNDA2MjE1MywgIDY0MjE1MywgNjA0MjE1MywgNDYwMjE1MywgNjQwMjE1MywgMjQ2MDE1MywgNDI2MDE1MywgMjY0MDE1MywgNjI0MDE1MywgNDYyMDE1MywgNjQyMDE1MywKKyAgICAgIDEyNDYwNTMsIDIxNDYwNTMsIDE0MjYwNTMsIDQxMjYwNTMsIDI0MTYwNTMsIDQyMTYwNTMsIDEyNjQwNTMsIDIxNjQwNTMsIDE2MjQwNTMsIDYxMjQwNTMsIDI2MTQwNTMsIDYyMTQwNTMsCisgICAgICAxNDYyMDUzLCA0MTYyMDUzLCAxNjQyMDUzLCA2MTQyMDUzLCA0NjEyMDUzLCA2NDEyMDUzLCAyNDYxMDUzLCA0MjYxMDUzLCAyNjQxMDUzLCA2MjQxMDUzLCA0NjIxMDUzLCA2NDIxMDUzLAorICAgICAgIDEyNTY0MywgMTAyNTY0MywgIDIxNTY0MywgMjAxNTY0MywgMTIwNTY0MywgMjEwNTY0MywgIDE1MjY0MywgMTA1MjY0MywgIDUxMjY0MywgNTAxMjY0MywgMTUwMjY0MywgNTEwMjY0MywKKyAgICAgICAyNTE2NDMsIDIwNTE2NDMsICA1MjE2NDMsIDUwMjE2NDMsIDI1MDE2NDMsIDUyMDE2NDMsIDEyNTA2NDMsIDIxNTA2NDMsIDE1MjA2NDMsIDUxMjA2NDMsIDI1MTA2NDMsIDUyMTA2NDMsCisgICAgICAgMTI2NTQzLCAxMDI2NTQzLCAgMjE2NTQzLCAyMDE2NTQzLCAxMjA2NTQzLCAyMTA2NTQzLCAgMTYyNTQzLCAxMDYyNTQzLCAgNjEyNTQzLCA2MDEyNTQzLCAxNjAyNTQzLCA2MTAyNTQzLAorICAgICAgIDI2MTU0MywgMjA2MTU0MywgIDYyMTU0MywgNjAyMTU0MywgMjYwMTU0MywgNjIwMTU0MywgMTI2MDU0MywgMjE2MDU0MywgMTYyMDU0MywgNjEyMDU0MywgMjYxMDU0MywgNjIxMDU0MywKKyAgICAgICAxNTYyNDMsIDEwNTYyNDMsICA1MTYyNDMsIDUwMTYyNDMsIDE1MDYyNDMsIDUxMDYyNDMsICAxNjUyNDMsIDEwNjUyNDMsICA2MTUyNDMsIDYwMTUyNDMsIDE2MDUyNDMsIDYxMDUyNDMsCisgICAgICAgNTYxMjQzLCA1MDYxMjQzLCAgNjUxMjQzLCA2MDUxMjQzLCA1NjAxMjQzLCA2NTAxMjQzLCAxNTYwMjQzLCA1MTYwMjQzLCAxNjUwMjQzLCA2MTUwMjQzLCA1NjEwMjQzLCA2NTEwMjQzLAorICAgICAgIDI1NjE0MywgMjA1NjE0MywgIDUyNjE0MywgNTAyNjE0MywgMjUwNjE0MywgNTIwNjE0MywgIDI2NTE0MywgMjA2NTE0MywgIDYyNTE0MywgNjAyNTE0MywgMjYwNTE0MywgNjIwNTE0MywKKyAgICAgICA1NjIxNDMsIDUwNjIxNDMsICA2NTIxNDMsIDYwNTIxNDMsIDU2MDIxNDMsIDY1MDIxNDMsIDI1NjAxNDMsIDUyNjAxNDMsIDI2NTAxNDMsIDYyNTAxNDMsIDU2MjAxNDMsIDY1MjAxNDMsCisgICAgICAxMjU2MDQzLCAyMTU2MDQzLCAxNTI2MDQzLCA1MTI2MDQzLCAyNTE2MDQzLCA1MjE2MDQzLCAxMjY1MDQzLCAyMTY1MDQzLCAxNjI1MDQzLCA2MTI1MDQzLCAyNjE1MDQzLCA2MjE1MDQzLAorICAgICAgMTU2MjA0MywgNTE2MjA0MywgMTY1MjA0MywgNjE1MjA0MywgNTYxMjA0MywgNjUxMjA0MywgMjU2MTA0MywgNTI2MTA0MywgMjY1MTA0MywgNjI1MTA0MywgNTYyMTA0MywgNjUyMTA0MywKKyAgICAgICAxNDU2MjMsIDEwNDU2MjMsICA0MTU2MjMsIDQwMTU2MjMsIDE0MDU2MjMsIDQxMDU2MjMsICAxNTQ2MjMsIDEwNTQ2MjMsICA1MTQ2MjMsIDUwMTQ2MjMsIDE1MDQ2MjMsIDUxMDQ2MjMsCisgICAgICAgNDUxNjIzLCA0MDUxNjIzLCAgNTQxNjIzLCA1MDQxNjIzLCA0NTAxNjIzLCA1NDAxNjIzLCAxNDUwNjIzLCA0MTUwNjIzLCAxNTQwNjIzLCA1MTQwNjIzLCA0NTEwNjIzLCA1NDEwNjIzLAorICAgICAgIDE0NjUyMywgMTA0NjUyMywgIDQxNjUyMywgNDAxNjUyMywgMTQwNjUyMywgNDEwNjUyMywgIDE2NDUyMywgMTA2NDUyMywgIDYxNDUyMywgNjAxNDUyMywgMTYwNDUyMywgNjEwNDUyMywKKyAgICAgICA0NjE1MjMsIDQwNjE1MjMsICA2NDE1MjMsIDYwNDE1MjMsIDQ2MDE1MjMsIDY0MDE1MjMsIDE0NjA1MjMsIDQxNjA1MjMsIDE2NDA1MjMsIDYxNDA1MjMsIDQ2MTA1MjMsIDY0MTA1MjMsCisgICAgICAgMTU2NDIzLCAxMDU2NDIzLCAgNTE2NDIzLCA1MDE2NDIzLCAxNTA2NDIzLCA1MTA2NDIzLCAgMTY1NDIzLCAxMDY1NDIzLCAgNjE1NDIzLCA2MDE1NDIzLCAxNjA1NDIzLCA2MTA1NDIzLAorICAgICAgIDU2MTQyMywgNTA2MTQyMywgIDY1MTQyMywgNjA1MTQyMywgNTYwMTQyMywgNjUwMTQyMywgMTU2MDQyMywgNTE2MDQyMywgMTY1MDQyMywgNjE1MDQyMywgNTYxMDQyMywgNjUxMDQyMywKKyAgICAgICA0NTYxMjMsIDQwNTYxMjMsICA1NDYxMjMsIDUwNDYxMjMsIDQ1MDYxMjMsIDU0MDYxMjMsICA0NjUxMjMsIDQwNjUxMjMsICA2NDUxMjMsIDYwNDUxMjMsIDQ2MDUxMjMsIDY0MDUxMjMsCisgICAgICAgNTY0MTIzLCA1MDY0MTIzLCAgNjU0MTIzLCA2MDU0MTIzLCA1NjA0MTIzLCA2NTA0MTIzLCA0NTYwMTIzLCA1NDYwMTIzLCA0NjUwMTIzLCA2NDUwMTIzLCA1NjQwMTIzLCA2NTQwMTIzLAorICAgICAgMTQ1NjAyMywgNDE1NjAyMywgMTU0NjAyMywgNTE0NjAyMywgNDUxNjAyMywgNTQxNjAyMywgMTQ2NTAyMywgNDE2NTAyMywgMTY0NTAyMywgNjE0NTAyMywgNDYxNTAyMywgNjQxNTAyMywKKyAgICAgIDE1NjQwMjMsIDUxNjQwMjMsIDE2NTQwMjMsIDYxNTQwMjMsIDU2MTQwMjMsIDY1MTQwMjMsIDQ1NjEwMjMsIDU0NjEwMjMsIDQ2NTEwMjMsIDY0NTEwMjMsIDU2NDEwMjMsIDY1NDEwMjMsCisgICAgICAgMjQ1NjEzLCAyMDQ1NjEzLCAgNDI1NjEzLCA0MDI1NjEzLCAyNDA1NjEzLCA0MjA1NjEzLCAgMjU0NjEzLCAyMDU0NjEzLCAgNTI0NjEzLCA1MDI0NjEzLCAyNTA0NjEzLCA1MjA0NjEzLAorICAgICAgIDQ1MjYxMywgNDA1MjYxMywgIDU0MjYxMywgNTA0MjYxMywgNDUwMjYxMywgNTQwMjYxMywgMjQ1MDYxMywgNDI1MDYxMywgMjU0MDYxMywgNTI0MDYxMywgNDUyMDYxMywgNTQyMDYxMywKKyAgICAgICAyNDY1MTMsIDIwNDY1MTMsICA0MjY1MTMsIDQwMjY1MTMsIDI0MDY1MTMsIDQyMDY1MTMsICAyNjQ1MTMsIDIwNjQ1MTMsICA2MjQ1MTMsIDYwMjQ1MTMsIDI2MDQ1MTMsIDYyMDQ1MTMsCisgICAgICAgNDYyNTEzLCA0MDYyNTEzLCAgNjQyNTEzLCA2MDQyNTEzLCA0NjAyNTEzLCA2NDAyNTEzLCAyNDYwNTEzLCA0MjYwNTEzLCAyNjQwNTEzLCA2MjQwNTEzLCA0NjIwNTEzLCA2NDIwNTEzLAorICAgICAgIDI1NjQxMywgMjA1NjQxMywgIDUyNjQxMywgNTAyNjQxMywgMjUwNjQxMywgNTIwNjQxMywgIDI2NTQxMywgMjA2NTQxMywgIDYyNTQxMywgNjAyNTQxMywgMjYwNTQxMywgNjIwNTQxMywKKyAgICAgICA1NjI0MTMsIDUwNjI0MTMsICA2NTI0MTMsIDYwNTI0MTMsIDU2MDI0MTMsIDY1MDI0MTMsIDI1NjA0MTMsIDUyNjA0MTMsIDI2NTA0MTMsIDYyNTA0MTMsIDU2MjA0MTMsIDY1MjA0MTMsCisgICAgICAgNDU2MjEzLCA0MDU2MjEzLCAgNTQ2MjEzLCA1MDQ2MjEzLCA0NTA2MjEzLCA1NDA2MjEzLCAgNDY1MjEzLCA0MDY1MjEzLCAgNjQ1MjEzLCA2MDQ1MjEzLCA0NjA1MjEzLCA2NDA1MjEzLAorICAgICAgIDU2NDIxMywgNTA2NDIxMywgIDY1NDIxMywgNjA1NDIxMywgNTYwNDIxMywgNjUwNDIxMywgNDU2MDIxMywgNTQ2MDIxMywgNDY1MDIxMywgNjQ1MDIxMywgNTY0MDIxMywgNjU0MDIxMywKKyAgICAgIDI0NTYwMTMsIDQyNTYwMTMsIDI1NDYwMTMsIDUyNDYwMTMsIDQ1MjYwMTMsIDU0MjYwMTMsIDI0NjUwMTMsIDQyNjUwMTMsIDI2NDUwMTMsIDYyNDUwMTMsIDQ2MjUwMTMsIDY0MjUwMTMsCisgICAgICAyNTY0MDEzLCA1MjY0MDEzLCAyNjU0MDEzLCA2MjU0MDEzLCA1NjI0MDEzLCA2NTI0MDEzLCA0NTYyMDEzLCA1NDYyMDEzLCA0NjUyMDEzLCA2NDUyMDEzLCA1NjQyMDEzLCA2NTQyMDEzLAorICAgICAgMTI0NTYwMywgMjE0NTYwMywgMTQyNTYwMywgNDEyNTYwMywgMjQxNTYwMywgNDIxNTYwMywgMTI1NDYwMywgMjE1NDYwMywgMTUyNDYwMywgNTEyNDYwMywgMjUxNDYwMywgNTIxNDYwMywKKyAgICAgIDE0NTI2MDMsIDQxNTI2MDMsIDE1NDI2MDMsIDUxNDI2MDMsIDQ1MTI2MDMsIDU0MTI2MDMsIDI0NTE2MDMsIDQyNTE2MDMsIDI1NDE2MDMsIDUyNDE2MDMsIDQ1MjE2MDMsIDU0MjE2MDMsCisgICAgICAxMjQ2NTAzLCAyMTQ2NTAzLCAxNDI2NTAzLCA0MTI2NTAzLCAyNDE2NTAzLCA0MjE2NTAzLCAxMjY0NTAzLCAyMTY0NTAzLCAxNjI0NTAzLCA2MTI0NTAzLCAyNjE0NTAzLCA2MjE0NTAzLAorICAgICAgMTQ2MjUwMywgNDE2MjUwMywgMTY0MjUwMywgNjE0MjUwMywgNDYxMjUwMywgNjQxMjUwMywgMjQ2MTUwMywgNDI2MTUwMywgMjY0MTUwMywgNjI0MTUwMywgNDYyMTUwMywgNjQyMTUwMywKKyAgICAgIDEyNTY0MDMsIDIxNTY0MDMsIDE1MjY0MDMsIDUxMjY0MDMsIDI1MTY0MDMsIDUyMTY0MDMsIDEyNjU0MDMsIDIxNjU0MDMsIDE2MjU0MDMsIDYxMjU0MDMsIDI2MTU0MDMsIDYyMTU0MDMsCisgICAgICAxNTYyNDAzLCA1MTYyNDAzLCAxNjUyNDAzLCA2MTUyNDAzLCA1NjEyNDAzLCA2NTEyNDAzLCAyNTYxNDAzLCA1MjYxNDAzLCAyNjUxNDAzLCA2MjUxNDAzLCA1NjIxNDAzLCA2NTIxNDAzLAorICAgICAgMTQ1NjIwMywgNDE1NjIwMywgMTU0NjIwMywgNTE0NjIwMywgNDUxNjIwMywgNTQxNjIwMywgMTQ2NTIwMywgNDE2NTIwMywgMTY0NTIwMywgNjE0NTIwMywgNDYxNTIwMywgNjQxNTIwMywKKyAgICAgIDE1NjQyMDMsIDUxNjQyMDMsIDE2NTQyMDMsIDYxNTQyMDMsIDU2MTQyMDMsIDY1MTQyMDMsIDQ1NjEyMDMsIDU0NjEyMDMsIDQ2NTEyMDMsIDY0NTEyMDMsIDU2NDEyMDMsIDY1NDEyMDMsCisgICAgICAyNDU2MTAzLCA0MjU2MTAzLCAyNTQ2MTAzLCA1MjQ2MTAzLCA0NTI2MTAzLCA1NDI2MTAzLCAyNDY1MTAzLCA0MjY1MTAzLCAyNjQ1MTAzLCA2MjQ1MTAzLCA0NjI1MTAzLCA2NDI1MTAzLAorICAgICAgMjU2NDEwMywgNTI2NDEwMywgMjY1NDEwMywgNjI1NDEwMywgNTYyNDEwMywgNjUyNDEwMywgNDU2MjEwMywgNTQ2MjEwMywgNDY1MjEwMywgNjQ1MjEwMywgNTY0MjEwMywgNjU0MjEwMywKKyAgICAgICAxMzQ1NjIsIDEwMzQ1NjIsICAzMTQ1NjIsIDMwMTQ1NjIsIDEzMDQ1NjIsIDMxMDQ1NjIsICAxNDM1NjIsIDEwNDM1NjIsICA0MTM1NjIsIDQwMTM1NjIsIDE0MDM1NjIsIDQxMDM1NjIsCisgICAgICAgMzQxNTYyLCAzMDQxNTYyLCAgNDMxNTYyLCA0MDMxNTYyLCAzNDAxNTYyLCA0MzAxNTYyLCAxMzQwNTYyLCAzMTQwNTYyLCAxNDMwNTYyLCA0MTMwNTYyLCAzNDEwNTYyLCA0MzEwNTYyLAorICAgICAgIDEzNTQ2MiwgMTAzNTQ2MiwgIDMxNTQ2MiwgMzAxNTQ2MiwgMTMwNTQ2MiwgMzEwNTQ2MiwgIDE1MzQ2MiwgMTA1MzQ2MiwgIDUxMzQ2MiwgNTAxMzQ2MiwgMTUwMzQ2MiwgNTEwMzQ2MiwKKyAgICAgICAzNTE0NjIsIDMwNTE0NjIsICA1MzE0NjIsIDUwMzE0NjIsIDM1MDE0NjIsIDUzMDE0NjIsIDEzNTA0NjIsIDMxNTA0NjIsIDE1MzA0NjIsIDUxMzA0NjIsIDM1MTA0NjIsIDUzMTA0NjIsCisgICAgICAgMTQ1MzYyLCAxMDQ1MzYyLCAgNDE1MzYyLCA0MDE1MzYyLCAxNDA1MzYyLCA0MTA1MzYyLCAgMTU0MzYyLCAxMDU0MzYyLCAgNTE0MzYyLCA1MDE0MzYyLCAxNTA0MzYyLCA1MTA0MzYyLAorICAgICAgIDQ1MTM2MiwgNDA1MTM2MiwgIDU0MTM2MiwgNTA0MTM2MiwgNDUwMTM2MiwgNTQwMTM2MiwgMTQ1MDM2MiwgNDE1MDM2MiwgMTU0MDM2MiwgNTE0MDM2MiwgNDUxMDM2MiwgNTQxMDM2MiwKKyAgICAgICAzNDUxNjIsIDMwNDUxNjIsICA0MzUxNjIsIDQwMzUxNjIsIDM0MDUxNjIsIDQzMDUxNjIsICAzNTQxNjIsIDMwNTQxNjIsICA1MzQxNjIsIDUwMzQxNjIsIDM1MDQxNjIsIDUzMDQxNjIsCisgICAgICAgNDUzMTYyLCA0MDUzMTYyLCAgNTQzMTYyLCA1MDQzMTYyLCA0NTAzMTYyLCA1NDAzMTYyLCAzNDUwMTYyLCA0MzUwMTYyLCAzNTQwMTYyLCA1MzQwMTYyLCA0NTMwMTYyLCA1NDMwMTYyLAorICAgICAgMTM0NTA2MiwgMzE0NTA2MiwgMTQzNTA2MiwgNDEzNTA2MiwgMzQxNTA2MiwgNDMxNTA2MiwgMTM1NDA2MiwgMzE1NDA2MiwgMTUzNDA2MiwgNTEzNDA2MiwgMzUxNDA2MiwgNTMxNDA2MiwKKyAgICAgIDE0NTMwNjIsIDQxNTMwNjIsIDE1NDMwNjIsIDUxNDMwNjIsIDQ1MTMwNjIsIDU0MTMwNjIsIDM0NTEwNjIsIDQzNTEwNjIsIDM1NDEwNjIsIDUzNDEwNjIsIDQ1MzEwNjIsIDU0MzEwNjIsCisgICAgICAgMTM0NjUyLCAxMDM0NjUyLCAgMzE0NjUyLCAzMDE0NjUyLCAxMzA0NjUyLCAzMTA0NjUyLCAgMTQzNjUyLCAxMDQzNjUyLCAgNDEzNjUyLCA0MDEzNjUyLCAxNDAzNjUyLCA0MTAzNjUyLAorICAgICAgIDM0MTY1MiwgMzA0MTY1MiwgIDQzMTY1MiwgNDAzMTY1MiwgMzQwMTY1MiwgNDMwMTY1MiwgMTM0MDY1MiwgMzE0MDY1MiwgMTQzMDY1MiwgNDEzMDY1MiwgMzQxMDY1MiwgNDMxMDY1MiwKKyAgICAgICAxMzY0NTIsIDEwMzY0NTIsICAzMTY0NTIsIDMwMTY0NTIsIDEzMDY0NTIsIDMxMDY0NTIsICAxNjM0NTIsIDEwNjM0NTIsICA2MTM0NTIsIDYwMTM0NTIsIDE2MDM0NTIsIDYxMDM0NTIsCisgICAgICAgMzYxNDUyLCAzMDYxNDUyLCAgNjMxNDUyLCA2MDMxNDUyLCAzNjAxNDUyLCA2MzAxNDUyLCAxMzYwNDUyLCAzMTYwNDUyLCAxNjMwNDUyLCA2MTMwNDUyLCAzNjEwNDUyLCA2MzEwNDUyLAorICAgICAgIDE0NjM1MiwgMTA0NjM1MiwgIDQxNjM1MiwgNDAxNjM1MiwgMTQwNjM1MiwgNDEwNjM1MiwgIDE2NDM1MiwgMTA2NDM1MiwgIDYxNDM1MiwgNjAxNDM1MiwgMTYwNDM1MiwgNjEwNDM1MiwKKyAgICAgICA0NjEzNTIsIDQwNjEzNTIsICA2NDEzNTIsIDYwNDEzNTIsIDQ2MDEzNTIsIDY0MDEzNTIsIDE0NjAzNTIsIDQxNjAzNTIsIDE2NDAzNTIsIDYxNDAzNTIsIDQ2MTAzNTIsIDY0MTAzNTIsCisgICAgICAgMzQ2MTUyLCAzMDQ2MTUyLCAgNDM2MTUyLCA0MDM2MTUyLCAzNDA2MTUyLCA0MzA2MTUyLCAgMzY0MTUyLCAzMDY0MTUyLCAgNjM0MTUyLCA2MDM0MTUyLCAzNjA0MTUyLCA2MzA0MTUyLAorICAgICAgIDQ2MzE1MiwgNDA2MzE1MiwgIDY0MzE1MiwgNjA0MzE1MiwgNDYwMzE1MiwgNjQwMzE1MiwgMzQ2MDE1MiwgNDM2MDE1MiwgMzY0MDE1MiwgNjM0MDE1MiwgNDYzMDE1MiwgNjQzMDE1MiwKKyAgICAgIDEzNDYwNTIsIDMxNDYwNTIsIDE0MzYwNTIsIDQxMzYwNTIsIDM0MTYwNTIsIDQzMTYwNTIsIDEzNjQwNTIsIDMxNjQwNTIsIDE2MzQwNTIsIDYxMzQwNTIsIDM2MTQwNTIsIDYzMTQwNTIsCisgICAgICAxNDYzMDUyLCA0MTYzMDUyLCAxNjQzMDUyLCA2MTQzMDUyLCA0NjEzMDUyLCA2NDEzMDUyLCAzNDYxMDUyLCA0MzYxMDUyLCAzNjQxMDUyLCA2MzQxMDUyLCA0NjMxMDUyLCA2NDMxMDUyLAorICAgICAgIDEzNTY0MiwgMTAzNTY0MiwgIDMxNTY0MiwgMzAxNTY0MiwgMTMwNTY0MiwgMzEwNTY0MiwgIDE1MzY0MiwgMTA1MzY0MiwgIDUxMzY0MiwgNTAxMzY0MiwgMTUwMzY0MiwgNTEwMzY0MiwKKyAgICAgICAzNTE2NDIsIDMwNTE2NDIsICA1MzE2NDIsIDUwMzE2NDIsIDM1MDE2NDIsIDUzMDE2NDIsIDEzNTA2NDIsIDMxNTA2NDIsIDE1MzA2NDIsIDUxMzA2NDIsIDM1MTA2NDIsIDUzMTA2NDIsCisgICAgICAgMTM2NTQyLCAxMDM2NTQyLCAgMzE2NTQyLCAzMDE2NTQyLCAxMzA2NTQyLCAzMTA2NTQyLCAgMTYzNTQyLCAxMDYzNTQyLCAgNjEzNTQyLCA2MDEzNTQyLCAxNjAzNTQyLCA2MTAzNTQyLAorICAgICAgIDM2MTU0MiwgMzA2MTU0MiwgIDYzMTU0MiwgNjAzMTU0MiwgMzYwMTU0MiwgNjMwMTU0MiwgMTM2MDU0MiwgMzE2MDU0MiwgMTYzMDU0MiwgNjEzMDU0MiwgMzYxMDU0MiwgNjMxMDU0MiwKKyAgICAgICAxNTYzNDIsIDEwNTYzNDIsICA1MTYzNDIsIDUwMTYzNDIsIDE1MDYzNDIsIDUxMDYzNDIsICAxNjUzNDIsIDEwNjUzNDIsICA2MTUzNDIsIDYwMTUzNDIsIDE2MDUzNDIsIDYxMDUzNDIsCisgICAgICAgNTYxMzQyLCA1MDYxMzQyLCAgNjUxMzQyLCA2MDUxMzQyLCA1NjAxMzQyLCA2NTAxMzQyLCAxNTYwMzQyLCA1MTYwMzQyLCAxNjUwMzQyLCA2MTUwMzQyLCA1NjEwMzQyLCA2NTEwMzQyLAorICAgICAgIDM1NjE0MiwgMzA1NjE0MiwgIDUzNjE0MiwgNTAzNjE0MiwgMzUwNjE0MiwgNTMwNjE0MiwgIDM2NTE0MiwgMzA2NTE0MiwgIDYzNTE0MiwgNjAzNTE0MiwgMzYwNTE0MiwgNjMwNTE0MiwKKyAgICAgICA1NjMxNDIsIDUwNjMxNDIsICA2NTMxNDIsIDYwNTMxNDIsIDU2MDMxNDIsIDY1MDMxNDIsIDM1NjAxNDIsIDUzNjAxNDIsIDM2NTAxNDIsIDYzNTAxNDIsIDU2MzAxNDIsIDY1MzAxNDIsCisgICAgICAxMzU2MDQyLCAzMTU2MDQyLCAxNTM2MDQyLCA1MTM2MDQyLCAzNTE2MDQyLCA1MzE2MDQyLCAxMzY1MDQyLCAzMTY1MDQyLCAxNjM1MDQyLCA2MTM1MDQyLCAzNjE1MDQyLCA2MzE1MDQyLAorICAgICAgMTU2MzA0MiwgNTE2MzA0MiwgMTY1MzA0MiwgNjE1MzA0MiwgNTYxMzA0MiwgNjUxMzA0MiwgMzU2MTA0MiwgNTM2MTA0MiwgMzY1MTA0MiwgNjM1MTA0MiwgNTYzMTA0MiwgNjUzMTA0MiwKKyAgICAgICAxNDU2MzIsIDEwNDU2MzIsICA0MTU2MzIsIDQwMTU2MzIsIDE0MDU2MzIsIDQxMDU2MzIsICAxNTQ2MzIsIDEwNTQ2MzIsICA1MTQ2MzIsIDUwMTQ2MzIsIDE1MDQ2MzIsIDUxMDQ2MzIsCisgICAgICAgNDUxNjMyLCA0MDUxNjMyLCAgNTQxNjMyLCA1MDQxNjMyLCA0NTAxNjMyLCA1NDAxNjMyLCAxNDUwNjMyLCA0MTUwNjMyLCAxNTQwNjMyLCA1MTQwNjMyLCA0NTEwNjMyLCA1NDEwNjMyLAorICAgICAgIDE0NjUzMiwgMTA0NjUzMiwgIDQxNjUzMiwgNDAxNjUzMiwgMTQwNjUzMiwgNDEwNjUzMiwgIDE2NDUzMiwgMTA2NDUzMiwgIDYxNDUzMiwgNjAxNDUzMiwgMTYwNDUzMiwgNjEwNDUzMiwKKyAgICAgICA0NjE1MzIsIDQwNjE1MzIsICA2NDE1MzIsIDYwNDE1MzIsIDQ2MDE1MzIsIDY0MDE1MzIsIDE0NjA1MzIsIDQxNjA1MzIsIDE2NDA1MzIsIDYxNDA1MzIsIDQ2MTA1MzIsIDY0MTA1MzIsCisgICAgICAgMTU2NDMyLCAxMDU2NDMyLCAgNTE2NDMyLCA1MDE2NDMyLCAxNTA2NDMyLCA1MTA2NDMyLCAgMTY1NDMyLCAxMDY1NDMyLCAgNjE1NDMyLCA2MDE1NDMyLCAxNjA1NDMyLCA2MTA1NDMyLAorICAgICAgIDU2MTQzMiwgNTA2MTQzMiwgIDY1MTQzMiwgNjA1MTQzMiwgNTYwMTQzMiwgNjUwMTQzMiwgMTU2MDQzMiwgNTE2MDQzMiwgMTY1MDQzMiwgNjE1MDQzMiwgNTYxMDQzMiwgNjUxMDQzMiwKKyAgICAgICA0NTYxMzIsIDQwNTYxMzIsICA1NDYxMzIsIDUwNDYxMzIsIDQ1MDYxMzIsIDU0MDYxMzIsICA0NjUxMzIsIDQwNjUxMzIsICA2NDUxMzIsIDYwNDUxMzIsIDQ2MDUxMzIsIDY0MDUxMzIsCisgICAgICAgNTY0MTMyLCA1MDY0MTMyLCAgNjU0MTMyLCA2MDU0MTMyLCA1NjA0MTMyLCA2NTA0MTMyLCA0NTYwMTMyLCA1NDYwMTMyLCA0NjUwMTMyLCA2NDUwMTMyLCA1NjQwMTMyLCA2NTQwMTMyLAorICAgICAgMTQ1NjAzMiwgNDE1NjAzMiwgMTU0NjAzMiwgNTE0NjAzMiwgNDUxNjAzMiwgNTQxNjAzMiwgMTQ2NTAzMiwgNDE2NTAzMiwgMTY0NTAzMiwgNjE0NTAzMiwgNDYxNTAzMiwgNjQxNTAzMiwKKyAgICAgIDE1NjQwMzIsIDUxNjQwMzIsIDE2NTQwMzIsIDYxNTQwMzIsIDU2MTQwMzIsIDY1MTQwMzIsIDQ1NjEwMzIsIDU0NjEwMzIsIDQ2NTEwMzIsIDY0NTEwMzIsIDU2NDEwMzIsIDY1NDEwMzIsCisgICAgICAgMzQ1NjEyLCAzMDQ1NjEyLCAgNDM1NjEyLCA0MDM1NjEyLCAzNDA1NjEyLCA0MzA1NjEyLCAgMzU0NjEyLCAzMDU0NjEyLCAgNTM0NjEyLCA1MDM0NjEyLCAzNTA0NjEyLCA1MzA0NjEyLAorICAgICAgIDQ1MzYxMiwgNDA1MzYxMiwgIDU0MzYxMiwgNTA0MzYxMiwgNDUwMzYxMiwgNTQwMzYxMiwgMzQ1MDYxMiwgNDM1MDYxMiwgMzU0MDYxMiwgNTM0MDYxMiwgNDUzMDYxMiwgNTQzMDYxMiwKKyAgICAgICAzNDY1MTIsIDMwNDY1MTIsICA0MzY1MTIsIDQwMzY1MTIsIDM0MDY1MTIsIDQzMDY1MTIsICAzNjQ1MTIsIDMwNjQ1MTIsICA2MzQ1MTIsIDYwMzQ1MTIsIDM2MDQ1MTIsIDYzMDQ1MTIsCisgICAgICAgNDYzNTEyLCA0MDYzNTEyLCAgNjQzNTEyLCA2MDQzNTEyLCA0NjAzNTEyLCA2NDAzNTEyLCAzNDYwNTEyLCA0MzYwNTEyLCAzNjQwNTEyLCA2MzQwNTEyLCA0NjMwNTEyLCA2NDMwNTEyLAorICAgICAgIDM1NjQxMiwgMzA1NjQxMiwgIDUzNjQxMiwgNTAzNjQxMiwgMzUwNjQxMiwgNTMwNjQxMiwgIDM2NTQxMiwgMzA2NTQxMiwgIDYzNTQxMiwgNjAzNTQxMiwgMzYwNTQxMiwgNjMwNTQxMiwKKyAgICAgICA1NjM0MTIsIDUwNjM0MTIsICA2NTM0MTIsIDYwNTM0MTIsIDU2MDM0MTIsIDY1MDM0MTIsIDM1NjA0MTIsIDUzNjA0MTIsIDM2NTA0MTIsIDYzNTA0MTIsIDU2MzA0MTIsIDY1MzA0MTIsCisgICAgICAgNDU2MzEyLCA0MDU2MzEyLCAgNTQ2MzEyLCA1MDQ2MzEyLCA0NTA2MzEyLCA1NDA2MzEyLCAgNDY1MzEyLCA0MDY1MzEyLCAgNjQ1MzEyLCA2MDQ1MzEyLCA0NjA1MzEyLCA2NDA1MzEyLAorICAgICAgIDU2NDMxMiwgNTA2NDMxMiwgIDY1NDMxMiwgNjA1NDMxMiwgNTYwNDMxMiwgNjUwNDMxMiwgNDU2MDMxMiwgNTQ2MDMxMiwgNDY1MDMxMiwgNjQ1MDMxMiwgNTY0MDMxMiwgNjU0MDMxMiwKKyAgICAgIDM0NTYwMTIsIDQzNTYwMTIsIDM1NDYwMTIsIDUzNDYwMTIsIDQ1MzYwMTIsIDU0MzYwMTIsIDM0NjUwMTIsIDQzNjUwMTIsIDM2NDUwMTIsIDYzNDUwMTIsIDQ2MzUwMTIsIDY0MzUwMTIsCisgICAgICAzNTY0MDEyLCA1MzY0MDEyLCAzNjU0MDEyLCA2MzU0MDEyLCA1NjM0MDEyLCA2NTM0MDEyLCA0NTYzMDEyLCA1NDYzMDEyLCA0NjUzMDEyLCA2NDUzMDEyLCA1NjQzMDEyLCA2NTQzMDEyLAorICAgICAgMTM0NTYwMiwgMzE0NTYwMiwgMTQzNTYwMiwgNDEzNTYwMiwgMzQxNTYwMiwgNDMxNTYwMiwgMTM1NDYwMiwgMzE1NDYwMiwgMTUzNDYwMiwgNTEzNDYwMiwgMzUxNDYwMiwgNTMxNDYwMiwKKyAgICAgIDE0NTM2MDIsIDQxNTM2MDIsIDE1NDM2MDIsIDUxNDM2MDIsIDQ1MTM2MDIsIDU0MTM2MDIsIDM0NTE2MDIsIDQzNTE2MDIsIDM1NDE2MDIsIDUzNDE2MDIsIDQ1MzE2MDIsIDU0MzE2MDIsCisgICAgICAxMzQ2NTAyLCAzMTQ2NTAyLCAxNDM2NTAyLCA0MTM2NTAyLCAzNDE2NTAyLCA0MzE2NTAyLCAxMzY0NTAyLCAzMTY0NTAyLCAxNjM0NTAyLCA2MTM0NTAyLCAzNjE0NTAyLCA2MzE0NTAyLAorICAgICAgMTQ2MzUwMiwgNDE2MzUwMiwgMTY0MzUwMiwgNjE0MzUwMiwgNDYxMzUwMiwgNjQxMzUwMiwgMzQ2MTUwMiwgNDM2MTUwMiwgMzY0MTUwMiwgNjM0MTUwMiwgNDYzMTUwMiwgNjQzMTUwMiwKKyAgICAgIDEzNTY0MDIsIDMxNTY0MDIsIDE1MzY0MDIsIDUxMzY0MDIsIDM1MTY0MDIsIDUzMTY0MDIsIDEzNjU0MDIsIDMxNjU0MDIsIDE2MzU0MDIsIDYxMzU0MDIsIDM2MTU0MDIsIDYzMTU0MDIsCisgICAgICAxNTYzNDAyLCA1MTYzNDAyLCAxNjUzNDAyLCA2MTUzNDAyLCA1NjEzNDAyLCA2NTEzNDAyLCAzNTYxNDAyLCA1MzYxNDAyLCAzNjUxNDAyLCA2MzUxNDAyLCA1NjMxNDAyLCA2NTMxNDAyLAorICAgICAgMTQ1NjMwMiwgNDE1NjMwMiwgMTU0NjMwMiwgNTE0NjMwMiwgNDUxNjMwMiwgNTQxNjMwMiwgMTQ2NTMwMiwgNDE2NTMwMiwgMTY0NTMwMiwgNjE0NTMwMiwgNDYxNTMwMiwgNjQxNTMwMiwKKyAgICAgIDE1NjQzMDIsIDUxNjQzMDIsIDE2NTQzMDIsIDYxNTQzMDIsIDU2MTQzMDIsIDY1MTQzMDIsIDQ1NjEzMDIsIDU0NjEzMDIsIDQ2NTEzMDIsIDY0NTEzMDIsIDU2NDEzMDIsIDY1NDEzMDIsCisgICAgICAzNDU2MTAyLCA0MzU2MTAyLCAzNTQ2MTAyLCA1MzQ2MTAyLCA0NTM2MTAyLCA1NDM2MTAyLCAzNDY1MTAyLCA0MzY1MTAyLCAzNjQ1MTAyLCA2MzQ1MTAyLCA0NjM1MTAyLCA2NDM1MTAyLAorICAgICAgMzU2NDEwMiwgNTM2NDEwMiwgMzY1NDEwMiwgNjM1NDEwMiwgNTYzNDEwMiwgNjUzNDEwMiwgNDU2MzEwMiwgNTQ2MzEwMiwgNDY1MzEwMiwgNjQ1MzEwMiwgNTY0MzEwMiwgNjU0MzEwMiwKKyAgICAgICAyMzQ1NjEsIDIwMzQ1NjEsICAzMjQ1NjEsIDMwMjQ1NjEsIDIzMDQ1NjEsIDMyMDQ1NjEsICAyNDM1NjEsIDIwNDM1NjEsICA0MjM1NjEsIDQwMjM1NjEsIDI0MDM1NjEsIDQyMDM1NjEsCisgICAgICAgMzQyNTYxLCAzMDQyNTYxLCAgNDMyNTYxLCA0MDMyNTYxLCAzNDAyNTYxLCA0MzAyNTYxLCAyMzQwNTYxLCAzMjQwNTYxLCAyNDMwNTYxLCA0MjMwNTYxLCAzNDIwNTYxLCA0MzIwNTYxLAorICAgICAgIDIzNTQ2MSwgMjAzNTQ2MSwgIDMyNTQ2MSwgMzAyNTQ2MSwgMjMwNTQ2MSwgMzIwNTQ2MSwgIDI1MzQ2MSwgMjA1MzQ2MSwgIDUyMzQ2MSwgNTAyMzQ2MSwgMjUwMzQ2MSwgNTIwMzQ2MSwKKyAgICAgICAzNTI0NjEsIDMwNTI0NjEsICA1MzI0NjEsIDUwMzI0NjEsIDM1MDI0NjEsIDUzMDI0NjEsIDIzNTA0NjEsIDMyNTA0NjEsIDI1MzA0NjEsIDUyMzA0NjEsIDM1MjA0NjEsIDUzMjA0NjEsCisgICAgICAgMjQ1MzYxLCAyMDQ1MzYxLCAgNDI1MzYxLCA0MDI1MzYxLCAyNDA1MzYxLCA0MjA1MzYxLCAgMjU0MzYxLCAyMDU0MzYxLCAgNTI0MzYxLCA1MDI0MzYxLCAyNTA0MzYxLCA1MjA0MzYxLAorICAgICAgIDQ1MjM2MSwgNDA1MjM2MSwgIDU0MjM2MSwgNTA0MjM2MSwgNDUwMjM2MSwgNTQwMjM2MSwgMjQ1MDM2MSwgNDI1MDM2MSwgMjU0MDM2MSwgNTI0MDM2MSwgNDUyMDM2MSwgNTQyMDM2MSwKKyAgICAgICAzNDUyNjEsIDMwNDUyNjEsICA0MzUyNjEsIDQwMzUyNjEsIDM0MDUyNjEsIDQzMDUyNjEsICAzNTQyNjEsIDMwNTQyNjEsICA1MzQyNjEsIDUwMzQyNjEsIDM1MDQyNjEsIDUzMDQyNjEsCisgICAgICAgNDUzMjYxLCA0MDUzMjYxLCAgNTQzMjYxLCA1MDQzMjYxLCA0NTAzMjYxLCA1NDAzMjYxLCAzNDUwMjYxLCA0MzUwMjYxLCAzNTQwMjYxLCA1MzQwMjYxLCA0NTMwMjYxLCA1NDMwMjYxLAorICAgICAgMjM0NTA2MSwgMzI0NTA2MSwgMjQzNTA2MSwgNDIzNTA2MSwgMzQyNTA2MSwgNDMyNTA2MSwgMjM1NDA2MSwgMzI1NDA2MSwgMjUzNDA2MSwgNTIzNDA2MSwgMzUyNDA2MSwgNTMyNDA2MSwKKyAgICAgIDI0NTMwNjEsIDQyNTMwNjEsIDI1NDMwNjEsIDUyNDMwNjEsIDQ1MjMwNjEsIDU0MjMwNjEsIDM0NTIwNjEsIDQzNTIwNjEsIDM1NDIwNjEsIDUzNDIwNjEsIDQ1MzIwNjEsIDU0MzIwNjEsCisgICAgICAgMjM0NjUxLCAyMDM0NjUxLCAgMzI0NjUxLCAzMDI0NjUxLCAyMzA0NjUxLCAzMjA0NjUxLCAgMjQzNjUxLCAyMDQzNjUxLCAgNDIzNjUxLCA0MDIzNjUxLCAyNDAzNjUxLCA0MjAzNjUxLAorICAgICAgIDM0MjY1MSwgMzA0MjY1MSwgIDQzMjY1MSwgNDAzMjY1MSwgMzQwMjY1MSwgNDMwMjY1MSwgMjM0MDY1MSwgMzI0MDY1MSwgMjQzMDY1MSwgNDIzMDY1MSwgMzQyMDY1MSwgNDMyMDY1MSwKKyAgICAgICAyMzY0NTEsIDIwMzY0NTEsICAzMjY0NTEsIDMwMjY0NTEsIDIzMDY0NTEsIDMyMDY0NTEsICAyNjM0NTEsIDIwNjM0NTEsICA2MjM0NTEsIDYwMjM0NTEsIDI2MDM0NTEsIDYyMDM0NTEsCisgICAgICAgMzYyNDUxLCAzMDYyNDUxLCAgNjMyNDUxLCA2MDMyNDUxLCAzNjAyNDUxLCA2MzAyNDUxLCAyMzYwNDUxLCAzMjYwNDUxLCAyNjMwNDUxLCA2MjMwNDUxLCAzNjIwNDUxLCA2MzIwNDUxLAorICAgICAgIDI0NjM1MSwgMjA0NjM1MSwgIDQyNjM1MSwgNDAyNjM1MSwgMjQwNjM1MSwgNDIwNjM1MSwgIDI2NDM1MSwgMjA2NDM1MSwgIDYyNDM1MSwgNjAyNDM1MSwgMjYwNDM1MSwgNjIwNDM1MSwKKyAgICAgICA0NjIzNTEsIDQwNjIzNTEsICA2NDIzNTEsIDYwNDIzNTEsIDQ2MDIzNTEsIDY0MDIzNTEsIDI0NjAzNTEsIDQyNjAzNTEsIDI2NDAzNTEsIDYyNDAzNTEsIDQ2MjAzNTEsIDY0MjAzNTEsCisgICAgICAgMzQ2MjUxLCAzMDQ2MjUxLCAgNDM2MjUxLCA0MDM2MjUxLCAzNDA2MjUxLCA0MzA2MjUxLCAgMzY0MjUxLCAzMDY0MjUxLCAgNjM0MjUxLCA2MDM0MjUxLCAzNjA0MjUxLCA2MzA0MjUxLAorICAgICAgIDQ2MzI1MSwgNDA2MzI1MSwgIDY0MzI1MSwgNjA0MzI1MSwgNDYwMzI1MSwgNjQwMzI1MSwgMzQ2MDI1MSwgNDM2MDI1MSwgMzY0MDI1MSwgNjM0MDI1MSwgNDYzMDI1MSwgNjQzMDI1MSwKKyAgICAgIDIzNDYwNTEsIDMyNDYwNTEsIDI0MzYwNTEsIDQyMzYwNTEsIDM0MjYwNTEsIDQzMjYwNTEsIDIzNjQwNTEsIDMyNjQwNTEsIDI2MzQwNTEsIDYyMzQwNTEsIDM2MjQwNTEsIDYzMjQwNTEsCisgICAgICAyNDYzMDUxLCA0MjYzMDUxLCAyNjQzMDUxLCA2MjQzMDUxLCA0NjIzMDUxLCA2NDIzMDUxLCAzNDYyMDUxLCA0MzYyMDUxLCAzNjQyMDUxLCA2MzQyMDUxLCA0NjMyMDUxLCA2NDMyMDUxLAorICAgICAgIDIzNTY0MSwgMjAzNTY0MSwgIDMyNTY0MSwgMzAyNTY0MSwgMjMwNTY0MSwgMzIwNTY0MSwgIDI1MzY0MSwgMjA1MzY0MSwgIDUyMzY0MSwgNTAyMzY0MSwgMjUwMzY0MSwgNTIwMzY0MSwKKyAgICAgICAzNTI2NDEsIDMwNTI2NDEsICA1MzI2NDEsIDUwMzI2NDEsIDM1MDI2NDEsIDUzMDI2NDEsIDIzNTA2NDEsIDMyNTA2NDEsIDI1MzA2NDEsIDUyMzA2NDEsIDM1MjA2NDEsIDUzMjA2NDEsCisgICAgICAgMjM2NTQxLCAyMDM2NTQxLCAgMzI2NTQxLCAzMDI2NTQxLCAyMzA2NTQxLCAzMjA2NTQxLCAgMjYzNTQxLCAyMDYzNTQxLCAgNjIzNTQxLCA2MDIzNTQxLCAyNjAzNTQxLCA2MjAzNTQxLAorICAgICAgIDM2MjU0MSwgMzA2MjU0MSwgIDYzMjU0MSwgNjAzMjU0MSwgMzYwMjU0MSwgNjMwMjU0MSwgMjM2MDU0MSwgMzI2MDU0MSwgMjYzMDU0MSwgNjIzMDU0MSwgMzYyMDU0MSwgNjMyMDU0MSwKKyAgICAgICAyNTYzNDEsIDIwNTYzNDEsICA1MjYzNDEsIDUwMjYzNDEsIDI1MDYzNDEsIDUyMDYzNDEsICAyNjUzNDEsIDIwNjUzNDEsICA2MjUzNDEsIDYwMjUzNDEsIDI2MDUzNDEsIDYyMDUzNDEsCisgICAgICAgNTYyMzQxLCA1MDYyMzQxLCAgNjUyMzQxLCA2MDUyMzQxLCA1NjAyMzQxLCA2NTAyMzQxLCAyNTYwMzQxLCA1MjYwMzQxLCAyNjUwMzQxLCA2MjUwMzQxLCA1NjIwMzQxLCA2NTIwMzQxLAorICAgICAgIDM1NjI0MSwgMzA1NjI0MSwgIDUzNjI0MSwgNTAzNjI0MSwgMzUwNjI0MSwgNTMwNjI0MSwgIDM2NTI0MSwgMzA2NTI0MSwgIDYzNTI0MSwgNjAzNTI0MSwgMzYwNTI0MSwgNjMwNTI0MSwKKyAgICAgICA1NjMyNDEsIDUwNjMyNDEsICA2NTMyNDEsIDYwNTMyNDEsIDU2MDMyNDEsIDY1MDMyNDEsIDM1NjAyNDEsIDUzNjAyNDEsIDM2NTAyNDEsIDYzNTAyNDEsIDU2MzAyNDEsIDY1MzAyNDEsCisgICAgICAyMzU2MDQxLCAzMjU2MDQxLCAyNTM2MDQxLCA1MjM2MDQxLCAzNTI2MDQxLCA1MzI2MDQxLCAyMzY1MDQxLCAzMjY1MDQxLCAyNjM1MDQxLCA2MjM1MDQxLCAzNjI1MDQxLCA2MzI1MDQxLAorICAgICAgMjU2MzA0MSwgNTI2MzA0MSwgMjY1MzA0MSwgNjI1MzA0MSwgNTYyMzA0MSwgNjUyMzA0MSwgMzU2MjA0MSwgNTM2MjA0MSwgMzY1MjA0MSwgNjM1MjA0MSwgNTYzMjA0MSwgNjUzMjA0MSwKKyAgICAgICAyNDU2MzEsIDIwNDU2MzEsICA0MjU2MzEsIDQwMjU2MzEsIDI0MDU2MzEsIDQyMDU2MzEsICAyNTQ2MzEsIDIwNTQ2MzEsICA1MjQ2MzEsIDUwMjQ2MzEsIDI1MDQ2MzEsIDUyMDQ2MzEsCisgICAgICAgNDUyNjMxLCA0MDUyNjMxLCAgNTQyNjMxLCA1MDQyNjMxLCA0NTAyNjMxLCA1NDAyNjMxLCAyNDUwNjMxLCA0MjUwNjMxLCAyNTQwNjMxLCA1MjQwNjMxLCA0NTIwNjMxLCA1NDIwNjMxLAorICAgICAgIDI0NjUzMSwgMjA0NjUzMSwgIDQyNjUzMSwgNDAyNjUzMSwgMjQwNjUzMSwgNDIwNjUzMSwgIDI2NDUzMSwgMjA2NDUzMSwgIDYyNDUzMSwgNjAyNDUzMSwgMjYwNDUzMSwgNjIwNDUzMSwKKyAgICAgICA0NjI1MzEsIDQwNjI1MzEsICA2NDI1MzEsIDYwNDI1MzEsIDQ2MDI1MzEsIDY0MDI1MzEsIDI0NjA1MzEsIDQyNjA1MzEsIDI2NDA1MzEsIDYyNDA1MzEsIDQ2MjA1MzEsIDY0MjA1MzEsCisgICAgICAgMjU2NDMxLCAyMDU2NDMxLCAgNTI2NDMxLCA1MDI2NDMxLCAyNTA2NDMxLCA1MjA2NDMxLCAgMjY1NDMxLCAyMDY1NDMxLCAgNjI1NDMxLCA2MDI1NDMxLCAyNjA1NDMxLCA2MjA1NDMxLAorICAgICAgIDU2MjQzMSwgNTA2MjQzMSwgIDY1MjQzMSwgNjA1MjQzMSwgNTYwMjQzMSwgNjUwMjQzMSwgMjU2MDQzMSwgNTI2MDQzMSwgMjY1MDQzMSwgNjI1MDQzMSwgNTYyMDQzMSwgNjUyMDQzMSwKKyAgICAgICA0NTYyMzEsIDQwNTYyMzEsICA1NDYyMzEsIDUwNDYyMzEsIDQ1MDYyMzEsIDU0MDYyMzEsICA0NjUyMzEsIDQwNjUyMzEsICA2NDUyMzEsIDYwNDUyMzEsIDQ2MDUyMzEsIDY0MDUyMzEsCisgICAgICAgNTY0MjMxLCA1MDY0MjMxLCAgNjU0MjMxLCA2MDU0MjMxLCA1NjA0MjMxLCA2NTA0MjMxLCA0NTYwMjMxLCA1NDYwMjMxLCA0NjUwMjMxLCA2NDUwMjMxLCA1NjQwMjMxLCA2NTQwMjMxLAorICAgICAgMjQ1NjAzMSwgNDI1NjAzMSwgMjU0NjAzMSwgNTI0NjAzMSwgNDUyNjAzMSwgNTQyNjAzMSwgMjQ2NTAzMSwgNDI2NTAzMSwgMjY0NTAzMSwgNjI0NTAzMSwgNDYyNTAzMSwgNjQyNTAzMSwKKyAgICAgIDI1NjQwMzEsIDUyNjQwMzEsIDI2NTQwMzEsIDYyNTQwMzEsIDU2MjQwMzEsIDY1MjQwMzEsIDQ1NjIwMzEsIDU0NjIwMzEsIDQ2NTIwMzEsIDY0NTIwMzEsIDU2NDIwMzEsIDY1NDIwMzEsCisgICAgICAgMzQ1NjIxLCAzMDQ1NjIxLCAgNDM1NjIxLCA0MDM1NjIxLCAzNDA1NjIxLCA0MzA1NjIxLCAgMzU0NjIxLCAzMDU0NjIxLCAgNTM0NjIxLCA1MDM0NjIxLCAzNTA0NjIxLCA1MzA0NjIxLAorICAgICAgIDQ1MzYyMSwgNDA1MzYyMSwgIDU0MzYyMSwgNTA0MzYyMSwgNDUwMzYyMSwgNTQwMzYyMSwgMzQ1MDYyMSwgNDM1MDYyMSwgMzU0MDYyMSwgNTM0MDYyMSwgNDUzMDYyMSwgNTQzMDYyMSwKKyAgICAgICAzNDY1MjEsIDMwNDY1MjEsICA0MzY1MjEsIDQwMzY1MjEsIDM0MDY1MjEsIDQzMDY1MjEsICAzNjQ1MjEsIDMwNjQ1MjEsICA2MzQ1MjEsIDYwMzQ1MjEsIDM2MDQ1MjEsIDYzMDQ1MjEsCisgICAgICAgNDYzNTIxLCA0MDYzNTIxLCAgNjQzNTIxLCA2MDQzNTIxLCA0NjAzNTIxLCA2NDAzNTIxLCAzNDYwNTIxLCA0MzYwNTIxLCAzNjQwNTIxLCA2MzQwNTIxLCA0NjMwNTIxLCA2NDMwNTIxLAorICAgICAgIDM1NjQyMSwgMzA1NjQyMSwgIDUzNjQyMSwgNTAzNjQyMSwgMzUwNjQyMSwgNTMwNjQyMSwgIDM2NTQyMSwgMzA2NTQyMSwgIDYzNTQyMSwgNjAzNTQyMSwgMzYwNTQyMSwgNjMwNTQyMSwKKyAgICAgICA1NjM0MjEsIDUwNjM0MjEsICA2NTM0MjEsIDYwNTM0MjEsIDU2MDM0MjEsIDY1MDM0MjEsIDM1NjA0MjEsIDUzNjA0MjEsIDM2NTA0MjEsIDYzNTA0MjEsIDU2MzA0MjEsIDY1MzA0MjEsCisgICAgICAgNDU2MzIxLCA0MDU2MzIxLCAgNTQ2MzIxLCA1MDQ2MzIxLCA0NTA2MzIxLCA1NDA2MzIxLCAgNDY1MzIxLCA0MDY1MzIxLCAgNjQ1MzIxLCA2MDQ1MzIxLCA0NjA1MzIxLCA2NDA1MzIxLAorICAgICAgIDU2NDMyMSwgNTA2NDMyMSwgIDY1NDMyMSwgNjA1NDMyMSwgNTYwNDMyMSwgNjUwNDMyMSwgNDU2MDMyMSwgNTQ2MDMyMSwgNDY1MDMyMSwgNjQ1MDMyMSwgNTY0MDMyMSwgNjU0MDMyMSwKKyAgICAgIDM0NTYwMjEsIDQzNTYwMjEsIDM1NDYwMjEsIDUzNDYwMjEsIDQ1MzYwMjEsIDU0MzYwMjEsIDM0NjUwMjEsIDQzNjUwMjEsIDM2NDUwMjEsIDYzNDUwMjEsIDQ2MzUwMjEsIDY0MzUwMjEsCisgICAgICAzNTY0MDIxLCA1MzY0MDIxLCAzNjU0MDIxLCA2MzU0MDIxLCA1NjM0MDIxLCA2NTM0MDIxLCA0NTYzMDIxLCA1NDYzMDIxLCA0NjUzMDIxLCA2NDUzMDIxLCA1NjQzMDIxLCA2NTQzMDIxLAorICAgICAgMjM0NTYwMSwgMzI0NTYwMSwgMjQzNTYwMSwgNDIzNTYwMSwgMzQyNTYwMSwgNDMyNTYwMSwgMjM1NDYwMSwgMzI1NDYwMSwgMjUzNDYwMSwgNTIzNDYwMSwgMzUyNDYwMSwgNTMyNDYwMSwKKyAgICAgIDI0NTM2MDEsIDQyNTM2MDEsIDI1NDM2MDEsIDUyNDM2MDEsIDQ1MjM2MDEsIDU0MjM2MDEsIDM0NTI2MDEsIDQzNTI2MDEsIDM1NDI2MDEsIDUzNDI2MDEsIDQ1MzI2MDEsIDU0MzI2MDEsCisgICAgICAyMzQ2NTAxLCAzMjQ2NTAxLCAyNDM2NTAxLCA0MjM2NTAxLCAzNDI2NTAxLCA0MzI2NTAxLCAyMzY0NTAxLCAzMjY0NTAxLCAyNjM0NTAxLCA2MjM0NTAxLCAzNjI0NTAxLCA2MzI0NTAxLAorICAgICAgMjQ2MzUwMSwgNDI2MzUwMSwgMjY0MzUwMSwgNjI0MzUwMSwgNDYyMzUwMSwgNjQyMzUwMSwgMzQ2MjUwMSwgNDM2MjUwMSwgMzY0MjUwMSwgNjM0MjUwMSwgNDYzMjUwMSwgNjQzMjUwMSwKKyAgICAgIDIzNTY0MDEsIDMyNTY0MDEsIDI1MzY0MDEsIDUyMzY0MDEsIDM1MjY0MDEsIDUzMjY0MDEsIDIzNjU0MDEsIDMyNjU0MDEsIDI2MzU0MDEsIDYyMzU0MDEsIDM2MjU0MDEsIDYzMjU0MDEsCisgICAgICAyNTYzNDAxLCA1MjYzNDAxLCAyNjUzNDAxLCA2MjUzNDAxLCA1NjIzNDAxLCA2NTIzNDAxLCAzNTYyNDAxLCA1MzYyNDAxLCAzNjUyNDAxLCA2MzUyNDAxLCA1NjMyNDAxLCA2NTMyNDAxLAorICAgICAgMjQ1NjMwMSwgNDI1NjMwMSwgMjU0NjMwMSwgNTI0NjMwMSwgNDUyNjMwMSwgNTQyNjMwMSwgMjQ2NTMwMSwgNDI2NTMwMSwgMjY0NTMwMSwgNjI0NTMwMSwgNDYyNTMwMSwgNjQyNTMwMSwKKyAgICAgIDI1NjQzMDEsIDUyNjQzMDEsIDI2NTQzMDEsIDYyNTQzMDEsIDU2MjQzMDEsIDY1MjQzMDEsIDQ1NjIzMDEsIDU0NjIzMDEsIDQ2NTIzMDEsIDY0NTIzMDEsIDU2NDIzMDEsIDY1NDIzMDEsCisgICAgICAzNDU2MjAxLCA0MzU2MjAxLCAzNTQ2MjAxLCA1MzQ2MjAxLCA0NTM2MjAxLCA1NDM2MjAxLCAzNDY1MjAxLCA0MzY1MjAxLCAzNjQ1MjAxLCA2MzQ1MjAxLCA0NjM1MjAxLCA2NDM1MjAxLAorICAgICAgMzU2NDIwMSwgNTM2NDIwMSwgMzY1NDIwMSwgNjM1NDIwMSwgNTYzNDIwMSwgNjUzNDIwMSwgNDU2MzIwMSwgNTQ2MzIwMSwgNDY1MzIwMSwgNjQ1MzIwMSwgNTY0MzIwMSwgNjU0MzIwMSwKKyAgICAgIDEyMzQ1NjAsIDIxMzQ1NjAsIDEzMjQ1NjAsIDMxMjQ1NjAsIDIzMTQ1NjAsIDMyMTQ1NjAsIDEyNDM1NjAsIDIxNDM1NjAsIDE0MjM1NjAsIDQxMjM1NjAsIDI0MTM1NjAsIDQyMTM1NjAsCisgICAgICAxMzQyNTYwLCAzMTQyNTYwLCAxNDMyNTYwLCA0MTMyNTYwLCAzNDEyNTYwLCA0MzEyNTYwLCAyMzQxNTYwLCAzMjQxNTYwLCAyNDMxNTYwLCA0MjMxNTYwLCAzNDIxNTYwLCA0MzIxNTYwLAorICAgICAgMTIzNTQ2MCwgMjEzNTQ2MCwgMTMyNTQ2MCwgMzEyNTQ2MCwgMjMxNTQ2MCwgMzIxNTQ2MCwgMTI1MzQ2MCwgMjE1MzQ2MCwgMTUyMzQ2MCwgNTEyMzQ2MCwgMjUxMzQ2MCwgNTIxMzQ2MCwKKyAgICAgIDEzNTI0NjAsIDMxNTI0NjAsIDE1MzI0NjAsIDUxMzI0NjAsIDM1MTI0NjAsIDUzMTI0NjAsIDIzNTE0NjAsIDMyNTE0NjAsIDI1MzE0NjAsIDUyMzE0NjAsIDM1MjE0NjAsIDUzMjE0NjAsCisgICAgICAxMjQ1MzYwLCAyMTQ1MzYwLCAxNDI1MzYwLCA0MTI1MzYwLCAyNDE1MzYwLCA0MjE1MzYwLCAxMjU0MzYwLCAyMTU0MzYwLCAxNTI0MzYwLCA1MTI0MzYwLCAyNTE0MzYwLCA1MjE0MzYwLAorICAgICAgMTQ1MjM2MCwgNDE1MjM2MCwgMTU0MjM2MCwgNTE0MjM2MCwgNDUxMjM2MCwgNTQxMjM2MCwgMjQ1MTM2MCwgNDI1MTM2MCwgMjU0MTM2MCwgNTI0MTM2MCwgNDUyMTM2MCwgNTQyMTM2MCwKKyAgICAgIDEzNDUyNjAsIDMxNDUyNjAsIDE0MzUyNjAsIDQxMzUyNjAsIDM0MTUyNjAsIDQzMTUyNjAsIDEzNTQyNjAsIDMxNTQyNjAsIDE1MzQyNjAsIDUxMzQyNjAsIDM1MTQyNjAsIDUzMTQyNjAsCisgICAgICAxNDUzMjYwLCA0MTUzMjYwLCAxNTQzMjYwLCA1MTQzMjYwLCA0NTEzMjYwLCA1NDEzMjYwLCAzNDUxMjYwLCA0MzUxMjYwLCAzNTQxMjYwLCA1MzQxMjYwLCA0NTMxMjYwLCA1NDMxMjYwLAorICAgICAgMjM0NTE2MCwgMzI0NTE2MCwgMjQzNTE2MCwgNDIzNTE2MCwgMzQyNTE2MCwgNDMyNTE2MCwgMjM1NDE2MCwgMzI1NDE2MCwgMjUzNDE2MCwgNTIzNDE2MCwgMzUyNDE2MCwgNTMyNDE2MCwKKyAgICAgIDI0NTMxNjAsIDQyNTMxNjAsIDI1NDMxNjAsIDUyNDMxNjAsIDQ1MjMxNjAsIDU0MjMxNjAsIDM0NTIxNjAsIDQzNTIxNjAsIDM1NDIxNjAsIDUzNDIxNjAsIDQ1MzIxNjAsIDU0MzIxNjAsCisgICAgICAxMjM0NjUwLCAyMTM0NjUwLCAxMzI0NjUwLCAzMTI0NjUwLCAyMzE0NjUwLCAzMjE0NjUwLCAxMjQzNjUwLCAyMTQzNjUwLCAxNDIzNjUwLCA0MTIzNjUwLCAyNDEzNjUwLCA0MjEzNjUwLAorICAgICAgMTM0MjY1MCwgMzE0MjY1MCwgMTQzMjY1MCwgNDEzMjY1MCwgMzQxMjY1MCwgNDMxMjY1MCwgMjM0MTY1MCwgMzI0MTY1MCwgMjQzMTY1MCwgNDIzMTY1MCwgMzQyMTY1MCwgNDMyMTY1MCwKKyAgICAgIDEyMzY0NTAsIDIxMzY0NTAsIDEzMjY0NTAsIDMxMjY0NTAsIDIzMTY0NTAsIDMyMTY0NTAsIDEyNjM0NTAsIDIxNjM0NTAsIDE2MjM0NTAsIDYxMjM0NTAsIDI2MTM0NTAsIDYyMTM0NTAsCisgICAgICAxMzYyNDUwLCAzMTYyNDUwLCAxNjMyNDUwLCA2MTMyNDUwLCAzNjEyNDUwLCA2MzEyNDUwLCAyMzYxNDUwLCAzMjYxNDUwLCAyNjMxNDUwLCA2MjMxNDUwLCAzNjIxNDUwLCA2MzIxNDUwLAorICAgICAgMTI0NjM1MCwgMjE0NjM1MCwgMTQyNjM1MCwgNDEyNjM1MCwgMjQxNjM1MCwgNDIxNjM1MCwgMTI2NDM1MCwgMjE2NDM1MCwgMTYyNDM1MCwgNjEyNDM1MCwgMjYxNDM1MCwgNjIxNDM1MCwKKyAgICAgIDE0NjIzNTAsIDQxNjIzNTAsIDE2NDIzNTAsIDYxNDIzNTAsIDQ2MTIzNTAsIDY0MTIzNTAsIDI0NjEzNTAsIDQyNjEzNTAsIDI2NDEzNTAsIDYyNDEzNTAsIDQ2MjEzNTAsIDY0MjEzNTAsCisgICAgICAxMzQ2MjUwLCAzMTQ2MjUwLCAxNDM2MjUwLCA0MTM2MjUwLCAzNDE2MjUwLCA0MzE2MjUwLCAxMzY0MjUwLCAzMTY0MjUwLCAxNjM0MjUwLCA2MTM0MjUwLCAzNjE0MjUwLCA2MzE0MjUwLAorICAgICAgMTQ2MzI1MCwgNDE2MzI1MCwgMTY0MzI1MCwgNjE0MzI1MCwgNDYxMzI1MCwgNjQxMzI1MCwgMzQ2MTI1MCwgNDM2MTI1MCwgMzY0MTI1MCwgNjM0MTI1MCwgNDYzMTI1MCwgNjQzMTI1MCwKKyAgICAgIDIzNDYxNTAsIDMyNDYxNTAsIDI0MzYxNTAsIDQyMzYxNTAsIDM0MjYxNTAsIDQzMjYxNTAsIDIzNjQxNTAsIDMyNjQxNTAsIDI2MzQxNTAsIDYyMzQxNTAsIDM2MjQxNTAsIDYzMjQxNTAsCisgICAgICAyNDYzMTUwLCA0MjYzMTUwLCAyNjQzMTUwLCA2MjQzMTUwLCA0NjIzMTUwLCA2NDIzMTUwLCAzNDYyMTUwLCA0MzYyMTUwLCAzNjQyMTUwLCA2MzQyMTUwLCA0NjMyMTUwLCA2NDMyMTUwLAorICAgICAgMTIzNTY0MCwgMjEzNTY0MCwgMTMyNTY0MCwgMzEyNTY0MCwgMjMxNTY0MCwgMzIxNTY0MCwgMTI1MzY0MCwgMjE1MzY0MCwgMTUyMzY0MCwgNTEyMzY0MCwgMjUxMzY0MCwgNTIxMzY0MCwKKyAgICAgIDEzNTI2NDAsIDMxNTI2NDAsIDE1MzI2NDAsIDUxMzI2NDAsIDM1MTI2NDAsIDUzMTI2NDAsIDIzNTE2NDAsIDMyNTE2NDAsIDI1MzE2NDAsIDUyMzE2NDAsIDM1MjE2NDAsIDUzMjE2NDAsCisgICAgICAxMjM2NTQwLCAyMTM2NTQwLCAxMzI2NTQwLCAzMTI2NTQwLCAyMzE2NTQwLCAzMjE2NTQwLCAxMjYzNTQwLCAyMTYzNTQwLCAxNjIzNTQwLCA2MTIzNTQwLCAyNjEzNTQwLCA2MjEzNTQwLAorICAgICAgMTM2MjU0MCwgMzE2MjU0MCwgMTYzMjU0MCwgNjEzMjU0MCwgMzYxMjU0MCwgNjMxMjU0MCwgMjM2MTU0MCwgMzI2MTU0MCwgMjYzMTU0MCwgNjIzMTU0MCwgMzYyMTU0MCwgNjMyMTU0MCwKKyAgICAgIDEyNTYzNDAsIDIxNTYzNDAsIDE1MjYzNDAsIDUxMjYzNDAsIDI1MTYzNDAsIDUyMTYzNDAsIDEyNjUzNDAsIDIxNjUzNDAsIDE2MjUzNDAsIDYxMjUzNDAsIDI2MTUzNDAsIDYyMTUzNDAsCisgICAgICAxNTYyMzQwLCA1MTYyMzQwLCAxNjUyMzQwLCA2MTUyMzQwLCA1NjEyMzQwLCA2NTEyMzQwLCAyNTYxMzQwLCA1MjYxMzQwLCAyNjUxMzQwLCA2MjUxMzQwLCA1NjIxMzQwLCA2NTIxMzQwLAorICAgICAgMTM1NjI0MCwgMzE1NjI0MCwgMTUzNjI0MCwgNTEzNjI0MCwgMzUxNjI0MCwgNTMxNjI0MCwgMTM2NTI0MCwgMzE2NTI0MCwgMTYzNTI0MCwgNjEzNTI0MCwgMzYxNTI0MCwgNjMxNTI0MCwKKyAgICAgIDE1NjMyNDAsIDUxNjMyNDAsIDE2NTMyNDAsIDYxNTMyNDAsIDU2MTMyNDAsIDY1MTMyNDAsIDM1NjEyNDAsIDUzNjEyNDAsIDM2NTEyNDAsIDYzNTEyNDAsIDU2MzEyNDAsIDY1MzEyNDAsCisgICAgICAyMzU2MTQwLCAzMjU2MTQwLCAyNTM2MTQwLCA1MjM2MTQwLCAzNTI2MTQwLCA1MzI2MTQwLCAyMzY1MTQwLCAzMjY1MTQwLCAyNjM1MTQwLCA2MjM1MTQwLCAzNjI1MTQwLCA2MzI1MTQwLAorICAgICAgMjU2MzE0MCwgNTI2MzE0MCwgMjY1MzE0MCwgNjI1MzE0MCwgNTYyMzE0MCwgNjUyMzE0MCwgMzU2MjE0MCwgNTM2MjE0MCwgMzY1MjE0MCwgNjM1MjE0MCwgNTYzMjE0MCwgNjUzMjE0MCwKKyAgICAgIDEyNDU2MzAsIDIxNDU2MzAsIDE0MjU2MzAsIDQxMjU2MzAsIDI0MTU2MzAsIDQyMTU2MzAsIDEyNTQ2MzAsIDIxNTQ2MzAsIDE1MjQ2MzAsIDUxMjQ2MzAsIDI1MTQ2MzAsIDUyMTQ2MzAsCisgICAgICAxNDUyNjMwLCA0MTUyNjMwLCAxNTQyNjMwLCA1MTQyNjMwLCA0NTEyNjMwLCA1NDEyNjMwLCAyNDUxNjMwLCA0MjUxNjMwLCAyNTQxNjMwLCA1MjQxNjMwLCA0NTIxNjMwLCA1NDIxNjMwLAorICAgICAgMTI0NjUzMCwgMjE0NjUzMCwgMTQyNjUzMCwgNDEyNjUzMCwgMjQxNjUzMCwgNDIxNjUzMCwgMTI2NDUzMCwgMjE2NDUzMCwgMTYyNDUzMCwgNjEyNDUzMCwgMjYxNDUzMCwgNjIxNDUzMCwKKyAgICAgIDE0NjI1MzAsIDQxNjI1MzAsIDE2NDI1MzAsIDYxNDI1MzAsIDQ2MTI1MzAsIDY0MTI1MzAsIDI0NjE1MzAsIDQyNjE1MzAsIDI2NDE1MzAsIDYyNDE1MzAsIDQ2MjE1MzAsIDY0MjE1MzAsCisgICAgICAxMjU2NDMwLCAyMTU2NDMwLCAxNTI2NDMwLCA1MTI2NDMwLCAyNTE2NDMwLCA1MjE2NDMwLCAxMjY1NDMwLCAyMTY1NDMwLCAxNjI1NDMwLCA2MTI1NDMwLCAyNjE1NDMwLCA2MjE1NDMwLAorICAgICAgMTU2MjQzMCwgNTE2MjQzMCwgMTY1MjQzMCwgNjE1MjQzMCwgNTYxMjQzMCwgNjUxMjQzMCwgMjU2MTQzMCwgNTI2MTQzMCwgMjY1MTQzMCwgNjI1MTQzMCwgNTYyMTQzMCwgNjUyMTQzMCwKKyAgICAgIDE0NTYyMzAsIDQxNTYyMzAsIDE1NDYyMzAsIDUxNDYyMzAsIDQ1MTYyMzAsIDU0MTYyMzAsIDE0NjUyMzAsIDQxNjUyMzAsIDE2NDUyMzAsIDYxNDUyMzAsIDQ2MTUyMzAsIDY0MTUyMzAsCisgICAgICAxNTY0MjMwLCA1MTY0MjMwLCAxNjU0MjMwLCA2MTU0MjMwLCA1NjE0MjMwLCA2NTE0MjMwLCA0NTYxMjMwLCA1NDYxMjMwLCA0NjUxMjMwLCA2NDUxMjMwLCA1NjQxMjMwLCA2NTQxMjMwLAorICAgICAgMjQ1NjEzMCwgNDI1NjEzMCwgMjU0NjEzMCwgNTI0NjEzMCwgNDUyNjEzMCwgNTQyNjEzMCwgMjQ2NTEzMCwgNDI2NTEzMCwgMjY0NTEzMCwgNjI0NTEzMCwgNDYyNTEzMCwgNjQyNTEzMCwKKyAgICAgIDI1NjQxMzAsIDUyNjQxMzAsIDI2NTQxMzAsIDYyNTQxMzAsIDU2MjQxMzAsIDY1MjQxMzAsIDQ1NjIxMzAsIDU0NjIxMzAsIDQ2NTIxMzAsIDY0NTIxMzAsIDU2NDIxMzAsIDY1NDIxMzAsCisgICAgICAxMzQ1NjIwLCAzMTQ1NjIwLCAxNDM1NjIwLCA0MTM1NjIwLCAzNDE1NjIwLCA0MzE1NjIwLCAxMzU0NjIwLCAzMTU0NjIwLCAxNTM0NjIwLCA1MTM0NjIwLCAzNTE0NjIwLCA1MzE0NjIwLAorICAgICAgMTQ1MzYyMCwgNDE1MzYyMCwgMTU0MzYyMCwgNTE0MzYyMCwgNDUxMzYyMCwgNTQxMzYyMCwgMzQ1MTYyMCwgNDM1MTYyMCwgMzU0MTYyMCwgNTM0MTYyMCwgNDUzMTYyMCwgNTQzMTYyMCwKKyAgICAgIDEzNDY1MjAsIDMxNDY1MjAsIDE0MzY1MjAsIDQxMzY1MjAsIDM0MTY1MjAsIDQzMTY1MjAsIDEzNjQ1MjAsIDMxNjQ1MjAsIDE2MzQ1MjAsIDYxMzQ1MjAsIDM2MTQ1MjAsIDYzMTQ1MjAsCisgICAgICAxNDYzNTIwLCA0MTYzNTIwLCAxNjQzNTIwLCA2MTQzNTIwLCA0NjEzNTIwLCA2NDEzNTIwLCAzNDYxNTIwLCA0MzYxNTIwLCAzNjQxNTIwLCA2MzQxNTIwLCA0NjMxNTIwLCA2NDMxNTIwLAorICAgICAgMTM1NjQyMCwgMzE1NjQyMCwgMTUzNjQyMCwgNTEzNjQyMCwgMzUxNjQyMCwgNTMxNjQyMCwgMTM2NTQyMCwgMzE2NTQyMCwgMTYzNTQyMCwgNjEzNTQyMCwgMzYxNTQyMCwgNjMxNTQyMCwKKyAgICAgIDE1NjM0MjAsIDUxNjM0MjAsIDE2NTM0MjAsIDYxNTM0MjAsIDU2MTM0MjAsIDY1MTM0MjAsIDM1NjE0MjAsIDUzNjE0MjAsIDM2NTE0MjAsIDYzNTE0MjAsIDU2MzE0MjAsIDY1MzE0MjAsCisgICAgICAxNDU2MzIwLCA0MTU2MzIwLCAxNTQ2MzIwLCA1MTQ2MzIwLCA0NTE2MzIwLCA1NDE2MzIwLCAxNDY1MzIwLCA0MTY1MzIwLCAxNjQ1MzIwLCA2MTQ1MzIwLCA0NjE1MzIwLCA2NDE1MzIwLAorICAgICAgMTU2NDMyMCwgNTE2NDMyMCwgMTY1NDMyMCwgNjE1NDMyMCwgNTYxNDMyMCwgNjUxNDMyMCwgNDU2MTMyMCwgNTQ2MTMyMCwgNDY1MTMyMCwgNjQ1MTMyMCwgNTY0MTMyMCwgNjU0MTMyMCwKKyAgICAgIDM0NTYxMjAsIDQzNTYxMjAsIDM1NDYxMjAsIDUzNDYxMjAsIDQ1MzYxMjAsIDU0MzYxMjAsIDM0NjUxMjAsIDQzNjUxMjAsIDM2NDUxMjAsIDYzNDUxMjAsIDQ2MzUxMjAsIDY0MzUxMjAsCisgICAgICAzNTY0MTIwLCA1MzY0MTIwLCAzNjU0MTIwLCA2MzU0MTIwLCA1NjM0MTIwLCA2NTM0MTIwLCA0NTYzMTIwLCA1NDYzMTIwLCA0NjUzMTIwLCA2NDUzMTIwLCA1NjQzMTIwLCA2NTQzMTIwLAorICAgICAgMjM0NTYxMCwgMzI0NTYxMCwgMjQzNTYxMCwgNDIzNTYxMCwgMzQyNTYxMCwgNDMyNTYxMCwgMjM1NDYxMCwgMzI1NDYxMCwgMjUzNDYxMCwgNTIzNDYxMCwgMzUyNDYxMCwgNTMyNDYxMCwKKyAgICAgIDI0NTM2MTAsIDQyNTM2MTAsIDI1NDM2MTAsIDUyNDM2MTAsIDQ1MjM2MTAsIDU0MjM2MTAsIDM0NTI2MTAsIDQzNTI2MTAsIDM1NDI2MTAsIDUzNDI2MTAsIDQ1MzI2MTAsIDU0MzI2MTAsCisgICAgICAyMzQ2NTEwLCAzMjQ2NTEwLCAyNDM2NTEwLCA0MjM2NTEwLCAzNDI2NTEwLCA0MzI2NTEwLCAyMzY0NTEwLCAzMjY0NTEwLCAyNjM0NTEwLCA2MjM0NTEwLCAzNjI0NTEwLCA2MzI0NTEwLAorICAgICAgMjQ2MzUxMCwgNDI2MzUxMCwgMjY0MzUxMCwgNjI0MzUxMCwgNDYyMzUxMCwgNjQyMzUxMCwgMzQ2MjUxMCwgNDM2MjUxMCwgMzY0MjUxMCwgNjM0MjUxMCwgNDYzMjUxMCwgNjQzMjUxMCwKKyAgICAgIDIzNTY0MTAsIDMyNTY0MTAsIDI1MzY0MTAsIDUyMzY0MTAsIDM1MjY0MTAsIDUzMjY0MTAsIDIzNjU0MTAsIDMyNjU0MTAsIDI2MzU0MTAsIDYyMzU0MTAsIDM2MjU0MTAsIDYzMjU0MTAsCisgICAgICAyNTYzNDEwLCA1MjYzNDEwLCAyNjUzNDEwLCA2MjUzNDEwLCA1NjIzNDEwLCA2NTIzNDEwLCAzNTYyNDEwLCA1MzYyNDEwLCAzNjUyNDEwLCA2MzUyNDEwLCA1NjMyNDEwLCA2NTMyNDEwLAorICAgICAgMjQ1NjMxMCwgNDI1NjMxMCwgMjU0NjMxMCwgNTI0NjMxMCwgNDUyNjMxMCwgNTQyNjMxMCwgMjQ2NTMxMCwgNDI2NTMxMCwgMjY0NTMxMCwgNjI0NTMxMCwgNDYyNTMxMCwgNjQyNTMxMCwKKyAgICAgIDI1NjQzMTAsIDUyNjQzMTAsIDI2NTQzMTAsIDYyNTQzMTAsIDU2MjQzMTAsIDY1MjQzMTAsIDQ1NjIzMTAsIDU0NjIzMTAsIDQ2NTIzMTAsIDY0NTIzMTAsIDU2NDIzMTAsIDY1NDIzMTAsCisgICAgICAzNDU2MjEwLCA0MzU2MjEwLCAzNTQ2MjEwLCA1MzQ2MjEwLCA0NTM2MjEwLCA1NDM2MjEwLCAzNDY1MjEwLCA0MzY1MjEwLCAzNjQ1MjEwLCA2MzQ1MjEwLCA0NjM1MjEwLCA2NDM1MjEwLAorICAgICAgMzU2NDIxMCwgNTM2NDIxMCwgMzY1NDIxMCwgNjM1NDIxMCwgNTYzNDIxMCwgNjUzNDIxMCwgNDU2MzIxMCwgNTQ2MzIxMCwgNDY1MzIxMCwgNjQ1MzIxMCwgNTY0MzIxMCwgNjU0MzIxMAorICAgIH07CisgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7CisgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IDUwNDA7IGkrKykKKyAgICAgIGV4cGVjdGVkW3ByZV9leHBlY3RlZFtpXV0gPSAwOyAvLyBmbGFncyBhcmUgMCwgZXZlcnl0aGluZyBpcyBzeW1tZXRyaWMgaGVyZQorCisgICAgVkVSSUZZKGlzRHluR3JvdXAoZ3JvdXApKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuc2l6ZSgpLCA1MDQwdSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLmdsb2JhbEZsYWdzKCksIDApOworICAgIGdyb3VwLmFwcGx5PGNoZWNrSWR4LCBpbnQ+KGlkZW50aXR5NywgMCwgZm91bmQsIGV4cGVjdGVkKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZm91bmQuc2l6ZSgpLCA1MDQwdSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfZXBzaWxvbigpCit7CisgIFNHcm91cDxBbnRpU3ltbWV0cnk8MCwxPiwgQW50aVN5bW1ldHJ5PDEsMj4+IHN5bTsKKyAgVGVuc29yPGludCwgMz4gZXBzaWxvbigzLDMsMyk7CisKKyAgZXBzaWxvbi5zZXRaZXJvKCk7CisgIHN5bShlcHNpbG9uLCAwLCAxLCAyKSA9IDE7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKGksaixrKSksICgtIChqIC0gaSkgKiAoayAtIGopICogKGkgLSBrKSAvIDIpICk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX3N5bSgpCit7CisgIFNHcm91cDxTeW1tZXRyeTwwLDE+LCBTeW1tZXRyeTwyLDM+PiBzeW07CisgIFRlbnNvcjxpbnQsIDQ+IHQoMTAsMTAsMTAsMTApOworCisgIHQuc2V0WmVybygpOworCisgIGZvciAoaW50IGwgPSAwOyBsIDwgMTA7IGwrKykgeworICAgIGZvciAoaW50IGsgPSBsOyBrIDwgMTA7IGsrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBqOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgIHN5bSh0LCBpLCBqLCBrLCBsKSA9IChpICsgaikgKiAoayArIGwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMDsgbCsrKSB7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMDsgaysrKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCh0KGksIGosIGssIGwpKSwgKChpICsgaikgKiAoayArIGwpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9hc3ltKCkKK3sKKyAgU0dyb3VwPEFudGlTeW1tZXRyeTwwLDE+LCBBbnRpU3ltbWV0cnk8MiwzPj4gc3ltOworICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKKworICB0LnNldFplcm8oKTsKKworICBmb3IgKGludCBsID0gMDsgbCA8IDEwOyBsKyspIHsKKyAgICBmb3IgKGludCBrID0gbCArIDE7IGsgPCAxMDsgaysrKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGogKyAxOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgIHN5bSh0LCBpLCBqLCBrLCBsKSA9ICgoaSAqIGopICsgKGsgKiBsKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGludCBsID0gMDsgbCA8IDEwOyBsKyspIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDEwOyBrKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICBpZiAoaSA8IGogJiYgayA8IGwpCisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAoKChpICogaikgKyAoayAqIGwpKSkpOworICAgICAgICAgIGVsc2UgaWYgKGkgPiBqICYmIGsgPiBsKQorICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCh0KGksIGosIGssIGwpKSwgKCgoaSAqIGopICsgKGsgKiBsKSkpKTsKKyAgICAgICAgICBlbHNlIGlmIChpIDwgaiAmJiBrID4gbCkKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCgodChpLCBqLCBrLCBsKSksICgtICgoaSAqIGopICsgKGsgKiBsKSkpKTsKKyAgICAgICAgICBlbHNlIGlmIChpID4gaiAmJiBrIDwgbCkKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCgodChpLCBqLCBrLCBsKSksICgtICgoaSAqIGopICsgKGsgKiBsKSkpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9keW5zeW0oKQoreworICBEeW5hbWljU0dyb3VwIHN5bTsKKyAgc3ltLmFkZFN5bW1ldHJ5KDAsMSk7CisgIHN5bS5hZGRTeW1tZXRyeSgyLDMpOworICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKKworICB0LnNldFplcm8oKTsKKworICBmb3IgKGludCBsID0gMDsgbCA8IDEwOyBsKyspIHsKKyAgICBmb3IgKGludCBrID0gbDsgayA8IDEwOyBrKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgeworICAgICAgICBmb3IgKGludCBpID0gajsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICBzeW0odCwgaSwgaiwgaywgbCkgPSAoaSArIGopICogKGsgKyBsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaW50IGwgPSAwOyBsIDwgMTA7IGwrKykgeworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTA7IGsrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCgodChpLCBqLCBrLCBsKSksICgoaSArIGopICogKGsgKyBsKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX3JhbmRhY2MoKQoreworICBTR3JvdXA8U3ltbWV0cnk8MCwxPiwgU3ltbWV0cnk8MiwzPj4gc3ltOworICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKKworICB0LnNldFplcm8oKTsKKworICAvLyBzZXQgZWxlbWVudHMgMSBtaWxsaW9uIHRpbWVzLCB0aGF0IHdheSB3ZSBhY2Nlc3MgdGhlCisgIC8vIGVudGlyZSBtYXRyaXgKKyAgZm9yIChpbnQgbiA9IDA7IG4gPCAxMDAwMDAwOyBuKyspIHsKKyAgICBpbnQgaSA9IHJhbmQoKSAlIDEwOworICAgIGludCBqID0gcmFuZCgpICUgMTA7CisgICAgaW50IGsgPSByYW5kKCkgJSAxMDsKKyAgICBpbnQgbCA9IHJhbmQoKSAlIDEwOworICAgIC8vIG9ubHkgYWNjZXNzIHRob3NlIGluZGljZXMgaW4gYSBnaXZlbiBvcmRlcgorICAgIGlmIChpIDwgaikKKyAgICAgIHN0ZDo6c3dhcChpLCBqKTsKKyAgICBpZiAoayA8IGwpCisgICAgICBzdGQ6OnN3YXAoaywgbCk7CisgICAgc3ltKHQsIGksIGosIGssIGwpID0gKGkgKyBqKSAqIChrICsgbCk7CisgIH0KKworICBmb3IgKGludCBsID0gMDsgbCA8IDEwOyBsKyspIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDEwOyBrKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAoKGkgKyBqKSAqIChrICsgbCkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3N5bW1ldHJ5KCkKK3sKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ltZ3JvdXBzX3N0YXRpYygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ltZ3JvdXBzX2R5bmFtaWMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3N5bWdyb3Vwc19zZWxlY3Rpb24oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl9lcHNpbG9uKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3Jfc3ltKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF90ZW5zb3JfYXN5bSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdGVuc29yX2R5bnN5bSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfdGVuc29yX3JhbmRhY2MoKSk7Cit9CisKKy8qCisgKiBrYXRlOiBzcGFjZS1pbmRlbnQgb247IGluZGVudC13aWR0aCAyOyBtaXhlZGluZGVudCBvZmY7IGluZGVudC1tb2RlIGNzdHlsZTsKKyAqLwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjY2NWYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl90aHJlYWRfcG9vbC5jcHAKQEAgLTAsMCArMSwzNzMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKKworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKworCit2b2lkIHRlc3RfbXVsdGl0aHJlYWRfZWxlbWVudHdpc2UoKQoreworICBUZW5zb3I8ZmxvYXQsIDM+IGluMSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4yKDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBvdXQoMiwzLDcpOworCisgIGluMS5zZXRSYW5kb20oKTsKKyAgaW4yLnNldFJhbmRvbSgpOworCisgIEVpZ2VuOjpUaHJlYWRQb29sIHRwKGludGVybmFsOjpyYW5kb208aW50PigzLCAxMSkpOworICBFaWdlbjo6VGhyZWFkUG9vbERldmljZSB0aHJlYWRfcG9vbF9kZXZpY2UoJnRwLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMywgMTEpKTsKKyAgb3V0LmRldmljZSh0aHJlYWRfcG9vbF9kZXZpY2UpID0gaW4xICsgaW4yICogMy4xNGY7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit2b2lkIHRlc3RfbXVsdGl0aHJlYWRfY29tcG91bmRfYXNzaWdubWVudCgpCit7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4xKDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBpbjIoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG91dCgyLDMsNyk7CisKKyAgaW4xLnNldFJhbmRvbSgpOworICBpbjIuc2V0UmFuZG9tKCk7CisKKyAgRWlnZW46OlRocmVhZFBvb2wgdHAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDMsIDExKSk7CisgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIHRocmVhZF9wb29sX2RldmljZSgmdHAsIGludGVybmFsOjpyYW5kb208aW50PigzLCAxMSkpOworICBvdXQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSkgPSBpbjE7CisgIG91dC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlKSArPSBpbjIgKiAzLjE0ZjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksIGluMShpLGosaykgKyBpbjIoaSxqLGspICogMy4xNGYpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9tdWx0aXRocmVhZF9jb250cmFjdGlvbigpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdF9sZWZ0KDMwLCA1MCwgMzcsIDMxKTsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDM3LCAzMSwgNzAsIDIsIDEwKTsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0X3Jlc3VsdCgzMCwgNTAsIDcwLCAyLCAxMCk7CisKKyAgdF9sZWZ0LnNldFJhbmRvbSgpOworICB0X3JpZ2h0LnNldFJhbmRvbSgpOworCisgIC8vIHRoaXMgY29udHJhY3Rpb24gc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgbWF0cml4IG11bHRpcGxpY2F0aW9uCisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyh7e0RpbVBhaXIoMiwgMCksIERpbVBhaXIoMywgMSl9fSk7CisKKyAgdHlwZWRlZiBNYXA8TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0Pj4gTWFwWGY7CisgIE1hcFhmIG1fbGVmdCh0X2xlZnQuZGF0YSgpLCAxNTAwLCAxMTQ3KTsKKyAgTWFwWGYgbV9yaWdodCh0X3JpZ2h0LmRhdGEoKSwgMTE0NywgMTQwMCk7CisgIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQoMTUwMCwgMTQwMCk7CisKKyAgRWlnZW46OlRocmVhZFBvb2wgdHAoNCk7CisgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIHRocmVhZF9wb29sX2RldmljZSgmdHAsIDQpOworCisgIC8vIGNvbXB1dGUgcmVzdWx0cyBieSBzZXBhcmF0ZSBtZXRob2RzCisgIHRfcmVzdWx0LmRldmljZSh0aHJlYWRfcG9vbF9kZXZpY2UpID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOworICBtX3Jlc3VsdCA9IG1fbGVmdCAqIG1fcmlnaHQ7CisKKyBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7CisgICAgVkVSSUZZKCZ0X3Jlc3VsdC5kYXRhKClbaV0gIT0gJm1fcmVzdWx0LmRhdGEoKVtpXSk7CisgICAgaWYgKGZhYnNmKHRfcmVzdWx0KGkpIC0gbV9yZXN1bHQoaSkpIDwgMWUtNGYpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdChpKSwgbV9yZXN1bHQoaSksIDFlLTRmKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkKKyAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8ICBtX3Jlc3VsdChpKSA8PCBzdGQ6OmVuZGw7CisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9jb250cmFjdGlvbl9jb3JuZXJfY2FzZXMoKQoreworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfbGVmdCgzMiwgNTAwKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDMyLCAyOCoyOCk7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yZXN1bHQoNTAwLCAyOCoyOCk7CisKKyAgdF9sZWZ0ID0gKHRfbGVmdC5jb25zdGFudCgtMC41ZikgKyB0X2xlZnQucmFuZG9tKCkpICogMi4wZjsKKyAgdF9yaWdodCA9ICh0X3JpZ2h0LmNvbnN0YW50KC0wLjZmKSArIHRfcmlnaHQucmFuZG9tKCkpICogMi4wZjsKKyAgdF9yZXN1bHQgPSB0X3Jlc3VsdC5jb25zdGFudChOQU4pOworCisgIC8vIHRoaXMgY29udHJhY3Rpb24gc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgbWF0cml4IG11bHRpcGxpY2F0aW9uCisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltc3t7RGltUGFpcigwLCAwKX19OworCisgIHR5cGVkZWYgTWFwPE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4+IE1hcFhmOworICBNYXBYZiBtX2xlZnQodF9sZWZ0LmRhdGEoKSwgMzIsIDUwMCk7CisgIE1hcFhmIG1fcmlnaHQodF9yaWdodC5kYXRhKCksIDMyLCAyOCoyOCk7CisgIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQoNTAwLCAyOCoyOCk7CisKKyAgRWlnZW46OlRocmVhZFBvb2wgdHAoMTIpOworICBFaWdlbjo6VGhyZWFkUG9vbERldmljZSB0aHJlYWRfcG9vbF9kZXZpY2UoJnRwLCAxMik7CisKKyAgLy8gY29tcHV0ZSByZXN1bHRzIGJ5IHNlcGFyYXRlIG1ldGhvZHMKKyAgdF9yZXN1bHQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSkgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisgIG1fcmVzdWx0ID0gbV9sZWZ0LnRyYW5zcG9zZSgpICogbV9yaWdodDsKKworICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7CisgICAgYXNzZXJ0KCEobnVtZXh0Ojppc25hbikodF9yZXN1bHQuZGF0YSgpW2ldKSk7CisgICAgaWYgKGZhYnNmKHRfcmVzdWx0LmRhdGEoKVtpXSAtIG1fcmVzdWx0LmRhdGEoKVtpXSkgPj0gMWUtNGYpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICIgOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgIG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBhc3NlcnQoZmFsc2UpOworICAgIH0KKyAgfQorCisgIHRfbGVmdC5yZXNpemUoMzIsIDEpOworICB0X2xlZnQgPSAodF9sZWZ0LmNvbnN0YW50KC0wLjVmKSArIHRfbGVmdC5yYW5kb20oKSkgKiAyLjBmOworICB0X3Jlc3VsdC5yZXNpemUgKDEsIDI4KjI4KTsKKyAgdF9yZXN1bHQgPSB0X3Jlc3VsdC5jb25zdGFudChOQU4pOworICB0X3Jlc3VsdC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlKSA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKKyAgbmV3KCZtX2xlZnQpIE1hcFhmKHRfbGVmdC5kYXRhKCksIDMyLCAxKTsKKyAgbV9yZXN1bHQgPSBtX2xlZnQudHJhbnNwb3NlKCkgKiBtX3JpZ2h0OworICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7CisgICAgYXNzZXJ0KCEobnVtZXh0Ojppc25hbikodF9yZXN1bHQuZGF0YSgpW2ldKSk7CisgICAgaWYgKGZhYnNmKHRfcmVzdWx0LmRhdGEoKVtpXSAtIG1fcmVzdWx0LmRhdGEoKVtpXSkgPj0gMWUtNGYpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQ6ICIgPDwgdF9yZXN1bHQuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCAgbV9yZXN1bHQuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGFzc2VydChmYWxzZSk7CisgICAgfQorICB9CisKKyAgdF9sZWZ0LnJlc2l6ZSgzMiwgNTAwKTsKKyAgdF9yaWdodC5yZXNpemUoMzIsIDQpOworICB0X2xlZnQgPSAodF9sZWZ0LmNvbnN0YW50KC0wLjVmKSArIHRfbGVmdC5yYW5kb20oKSkgKiAyLjBmOworICB0X3JpZ2h0ID0gKHRfcmlnaHQuY29uc3RhbnQoLTAuNmYpICsgdF9yaWdodC5yYW5kb20oKSkgKiAyLjBmOworICB0X3Jlc3VsdC5yZXNpemUgKDUwMCwgNCk7CisgIHRfcmVzdWx0ID0gdF9yZXN1bHQuY29uc3RhbnQoTkFOKTsKKyAgdF9yZXN1bHQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSkgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisgIG5ldygmbV9sZWZ0KSBNYXBYZih0X2xlZnQuZGF0YSgpLCAzMiwgNTAwKTsKKyAgbmV3KCZtX3JpZ2h0KSBNYXBYZih0X3JpZ2h0LmRhdGEoKSwgMzIsIDQpOworICBtX3Jlc3VsdCA9IG1fbGVmdC50cmFuc3Bvc2UoKSAqIG1fcmlnaHQ7CisgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKKyAgICBhc3NlcnQoIShudW1leHQ6OmlzbmFuKSh0X3Jlc3VsdC5kYXRhKClbaV0pKTsKKyAgICBpZiAoZmFic2YodF9yZXN1bHQuZGF0YSgpW2ldIC0gbV9yZXN1bHQuZGF0YSgpW2ldKSA+PSAxZS00ZikgeworICAgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZDogIiA8PCB0X3Jlc3VsdC5kYXRhKClbaV0gPDwgIiB2cyAiIDw8ICBtX3Jlc3VsdC5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICB9CisgIH0KKworICB0X2xlZnQucmVzaXplKDMyLCAxKTsKKyAgdF9yaWdodC5yZXNpemUoMzIsIDQpOworICB0X2xlZnQgPSAodF9sZWZ0LmNvbnN0YW50KC0wLjVmKSArIHRfbGVmdC5yYW5kb20oKSkgKiAyLjBmOworICB0X3JpZ2h0ID0gKHRfcmlnaHQuY29uc3RhbnQoLTAuNmYpICsgdF9yaWdodC5yYW5kb20oKSkgKiAyLjBmOworICB0X3Jlc3VsdC5yZXNpemUgKDEsIDQpOworICB0X3Jlc3VsdCA9IHRfcmVzdWx0LmNvbnN0YW50KE5BTik7CisgIHRfcmVzdWx0LmRldmljZSh0aHJlYWRfcG9vbF9kZXZpY2UpID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOworICBuZXcoJm1fbGVmdCkgTWFwWGYodF9sZWZ0LmRhdGEoKSwgMzIsIDEpOworICBuZXcoJm1fcmlnaHQpIE1hcFhmKHRfcmlnaHQuZGF0YSgpLCAzMiwgNCk7CisgIG1fcmVzdWx0ID0gbV9sZWZ0LnRyYW5zcG9zZSgpICogbV9yaWdodDsKKyAgZm9yIChwdHJkaWZmX3QgaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgeworICAgIGFzc2VydCghKG51bWV4dDo6aXNuYW4pKHRfcmVzdWx0LmRhdGEoKVtpXSkpOworICAgIGlmIChmYWJzZih0X3Jlc3VsdC5kYXRhKClbaV0gLSBtX3Jlc3VsdC5kYXRhKClbaV0pID49IDFlLTRmKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgIG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBhc3NlcnQoZmFsc2UpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9tdWx0aXRocmVhZF9jb250cmFjdGlvbl9hZ3JlZXNfd2l0aF9zaW5nbGV0aHJlYWQoKSB7CisgIGludCBjb250cmFjdF9zaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwMDApOworCisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbGVmdChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCAxMDApKTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJpZ2h0KGludGVybmFsOjpyYW5kb208aW50PigxLCAyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDM3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCA1MSkpOworCisgIGxlZnQuc2V0UmFuZG9tKCk7CisgIHJpZ2h0LnNldFJhbmRvbSgpOworCisgIC8vIGFkZCBjb25zdGFudHMgdG8gc2hpZnQgdmFsdWVzIGF3YXkgZnJvbSAwIGZvciBtb3JlIHByZWNpc2lvbgorICBsZWZ0ICs9IGxlZnQuY29uc3RhbnQoMS41Zik7CisgIHJpZ2h0ICs9IHJpZ2h0LmNvbnN0YW50KDEuNWYpOworCisgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOworICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltcyh7e0RpbVBhaXIoMSwgMil9fSk7CisKKyAgRWlnZW46OlRocmVhZFBvb2wgdHAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDExKSk7CisgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIHRocmVhZF9wb29sX2RldmljZSgmdHAsIGludGVybmFsOjpyYW5kb208aW50PigyLCAxMSkpOworCisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gc3RfcmVzdWx0OworICBzdF9yZXN1bHQgPSBsZWZ0LmNvbnRyYWN0KHJpZ2h0LCBkaW1zKTsKKworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRwX3Jlc3VsdChzdF9yZXN1bHQuZGltZW5zaW9ucygpKTsKKyAgdHBfcmVzdWx0LmRldmljZSh0aHJlYWRfcG9vbF9kZXZpY2UpID0gbGVmdC5jb250cmFjdChyaWdodCwgZGltcyk7CisKKyAgVkVSSUZZKGRpbWVuc2lvbnNfbWF0Y2goc3RfcmVzdWx0LmRpbWVuc2lvbnMoKSwgdHBfcmVzdWx0LmRpbWVuc2lvbnMoKSkpOworICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHN0X3Jlc3VsdC5zaXplKCk7IGkrKykgeworICAgIC8vIGlmIGJvdGggb2YgdGhlIHZhbHVlcyBhcmUgdmVyeSBzbWFsbCwgdGhlbiBkbyBub3RoaW5nIChiZWNhdXNlIHRoZSB0ZXN0IHdpbGwgZmFpbAorICAgIC8vIGR1ZSB0byBudW1lcmljYWwgcHJlY2lzaW9uIGlzc3VlcyB3aGVuIHZhbHVlcyBhcmUgc21hbGwpCisgICAgaWYgKG51bWV4dDo6YWJzKHN0X3Jlc3VsdC5kYXRhKClbaV0gLSB0cF9yZXN1bHQuZGF0YSgpW2ldKSA+PSAxZS00ZikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdF9yZXN1bHQuZGF0YSgpW2ldLCB0cF9yZXN1bHQuZGF0YSgpW2ldKTsKKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9mdWxsX2NvbnRyYWN0aW9uKCkgeworICBpbnQgY29udHJhY3Rfc2l6ZTEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTAwKTsKKyAgaW50IGNvbnRyYWN0X3NpemUyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwMCk7CisKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBsZWZ0KGNvbnRyYWN0X3NpemUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rfc2l6ZTIpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHJpZ2h0KGNvbnRyYWN0X3NpemUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rfc2l6ZTIpOworICBsZWZ0LnNldFJhbmRvbSgpOworICByaWdodC5zZXRSYW5kb20oKTsKKworICAvLyBhZGQgY29uc3RhbnRzIHRvIHNoaWZ0IHZhbHVlcyBhd2F5IGZyb20gMCBmb3IgbW9yZSBwcmVjaXNpb24KKyAgbGVmdCArPSBsZWZ0LmNvbnN0YW50KDEuNWYpOworICByaWdodCArPSByaWdodC5jb25zdGFudCgxLjVmKTsKKworICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKKyAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMoe3tEaW1QYWlyKDAsIDApLCBEaW1QYWlyKDEsIDEpfX0pOworCisgIEVpZ2VuOjpUaHJlYWRQb29sIHRwKGludGVybmFsOjpyYW5kb208aW50PigyLCAxMSkpOworICBFaWdlbjo6VGhyZWFkUG9vbERldmljZSB0aHJlYWRfcG9vbF9kZXZpY2UoJnRwLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgMTEpKTsKKworICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IHN0X3Jlc3VsdDsKKyAgc3RfcmVzdWx0ID0gbGVmdC5jb250cmFjdChyaWdodCwgZGltcyk7CisKKyAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiB0cF9yZXN1bHQ7CisgIHRwX3Jlc3VsdC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlKSA9IGxlZnQuY29udHJhY3QocmlnaHQsIGRpbXMpOworCisgIFZFUklGWShkaW1lbnNpb25zX21hdGNoKHN0X3Jlc3VsdC5kaW1lbnNpb25zKCksIHRwX3Jlc3VsdC5kaW1lbnNpb25zKCkpKTsKKyAgLy8gaWYgYm90aCBvZiB0aGUgdmFsdWVzIGFyZSB2ZXJ5IHNtYWxsLCB0aGVuIGRvIG5vdGhpbmcgKGJlY2F1c2UgdGhlIHRlc3Qgd2lsbCBmYWlsCisgIC8vIGR1ZSB0byBudW1lcmljYWwgcHJlY2lzaW9uIGlzc3VlcyB3aGVuIHZhbHVlcyBhcmUgc21hbGwpCisgIGlmIChudW1leHQ6OmFicyhzdF9yZXN1bHQoKSAtIHRwX3Jlc3VsdCgpKSA+PSAxZS00ZikgeworICAgIFZFUklGWV9JU19BUFBST1goc3RfcmVzdWx0KCksIHRwX3Jlc3VsdCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9tdWx0aXRocmVhZGVkX3JlZHVjdGlvbnMoKSB7CisgIGNvbnN0IGludCBudW1fdGhyZWFkcyA9IGludGVybmFsOjpyYW5kb208aW50PigzLCAxMSk7CisgIFRocmVhZFBvb2wgdGhyZWFkX3Bvb2wobnVtX3RocmVhZHMpOworICBFaWdlbjo6VGhyZWFkUG9vbERldmljZSB0aHJlYWRfcG9vbF9kZXZpY2UoJnRocmVhZF9wb29sLCBudW1fdGhyZWFkcyk7CisKKyAgY29uc3QgaW50IG51bV9yb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEzLCA3MzIpOworICBjb25zdCBpbnQgbnVtX2NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTMsIDczMik7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdDEobnVtX3Jvd3MsIG51bV9jb2xzKTsKKyAgdDEuc2V0UmFuZG9tKCk7CisKKyAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBmdWxsX3JlZHV4OworICBmdWxsX3JlZHV4ID0gdDEuc3VtKCk7CisKKyAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBmdWxsX3JlZHV4X3RwOworICBmdWxsX3JlZHV4X3RwLmRldmljZSh0aHJlYWRfcG9vbF9kZXZpY2UpID0gdDEuc3VtKCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc2luZ2xlIHRocmVhZGVkIGFuZCB0aGUgbXVsdGkgdGhyZWFkZWQgcmVkdWN0aW9ucyByZXR1cm4KKyAgLy8gdGhlIHNhbWUgcmVzdWx0LgorICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcmVkdXgoKSwgZnVsbF9yZWR1eF90cCgpKTsKK30KKworCit2b2lkIHRlc3RfbWVtY3B5KCkgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgY29uc3QgaW50IG51bV90aHJlYWRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDMsIDExKTsKKyAgICBFaWdlbjo6VGhyZWFkUG9vbCB0cChudW1fdGhyZWFkcyk7CisgICAgRWlnZW46OlRocmVhZFBvb2xEZXZpY2UgdGhyZWFkX3Bvb2xfZGV2aWNlKCZ0cCwgbnVtX3RocmVhZHMpOworCisgICAgY29uc3QgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTMsIDc2MzIpOworICAgIFRlbnNvcjxmbG9hdCwgMT4gdDEoc2l6ZSk7CisgICAgdDEuc2V0UmFuZG9tKCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlc3VsdChzaXplKTsKKyAgICB0aHJlYWRfcG9vbF9kZXZpY2UubWVtY3B5KCZyZXN1bHRbMF0sIHQxLmRhdGEoKSwgc2l6ZSpzaXplb2YoZmxvYXQpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHQxKGopLCByZXN1bHRbal0pOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9tdWx0aXRocmVhZF9yYW5kb20oKQoreworICBFaWdlbjo6VGhyZWFkUG9vbCB0cCgyKTsKKyAgRWlnZW46OlRocmVhZFBvb2xEZXZpY2UgZGV2aWNlKCZ0cCwgMik7CisgIFRlbnNvcjxmbG9hdCwgMT4gdCgxIDw8IDIwKTsKKyAgdC5kZXZpY2UoZGV2aWNlKSA9IHQucmFuZG9tPEVpZ2VuOjppbnRlcm5hbDo6Tm9ybWFsUmFuZG9tR2VuZXJhdG9yPGZsb2F0Pj4oKTsKK30KKwordGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3RfbXVsdGl0aHJlYWRfc2h1ZmZsZSgpCit7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDE3LDUsNywxMSk7CisgIHRlbnNvci5zZXRSYW5kb20oKTsKKworICBjb25zdCBpbnQgbnVtX3RocmVhZHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgMTEpOworICBUaHJlYWRQb29sIHRocmVhZHMobnVtX3RocmVhZHMpOworICBFaWdlbjo6VGhyZWFkUG9vbERldmljZSBkZXZpY2UoJnRocmVhZHMsIG51bV90aHJlYWRzKTsKKworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUoNyw1LDExLDE3KTsKKyAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlcyA9IHt7MiwxLDMsMH19OworICBzaHVmZmxlLmRldmljZShkZXZpY2UpID0gdGVuc29yLnNodWZmbGUoc2h1ZmZsZXMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTc7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgeworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBzaHVmZmxlKGssaixsLGkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdGVzdF9jeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2woKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X211bHRpdGhyZWFkX2VsZW1lbnR3aXNlKCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X211bHRpdGhyZWFkX2NvbXBvdW5kX2Fzc2lnbm1lbnQoKSk7CisKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9tdWx0aXRocmVhZF9jb250cmFjdGlvbjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfbXVsdGl0aHJlYWRfY29udHJhY3Rpb248Um93TWFqb3I+KCkpOworCisgIENBTExfU1VCVEVTVF8zKHRlc3RfbXVsdGl0aHJlYWRfY29udHJhY3Rpb25fYWdyZWVzX3dpdGhfc2luZ2xldGhyZWFkPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9tdWx0aXRocmVhZF9jb250cmFjdGlvbl9hZ3JlZXNfd2l0aF9zaW5nbGV0aHJlYWQ8Um93TWFqb3I+KCkpOworCisgIC8vIEV4ZXJjaXNlIHZhcmlvdXMgY2FzZXMgdGhhdCBoYXZlIGJlZW4gcHJvYmxlbWF0aWMgaW4gdGhlIHBhc3QuCisgIENBTExfU1VCVEVTVF80KHRlc3RfY29udHJhY3Rpb25fY29ybmVyX2Nhc2VzPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9jb250cmFjdGlvbl9jb3JuZXJfY2FzZXM8Um93TWFqb3I+KCkpOworCisgIENBTExfU1VCVEVTVF80KHRlc3RfZnVsbF9jb250cmFjdGlvbjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfZnVsbF9jb250cmFjdGlvbjxSb3dNYWpvcj4oKSk7CisKKyAgQ0FMTF9TVUJURVNUXzUodGVzdF9tdWx0aXRocmVhZGVkX3JlZHVjdGlvbnM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0X211bHRpdGhyZWFkZWRfcmVkdWN0aW9uczxSb3dNYWpvcj4oKSk7CisKKyAgQ0FMTF9TVUJURVNUXzYodGVzdF9tZW1jcHkoKSk7CisgIENBTExfU1VCVEVTVF82KHRlc3RfbXVsdGl0aHJlYWRfcmFuZG9tKCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0X211bHRpdGhyZWFkX3NodWZmbGU8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0X211bHRpdGhyZWFkX3NodWZmbGU8Um93TWFqb3I+KCkpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdWludDEyOC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl91aW50MTI4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmExZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdWludDEyOC5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE1IEJlbm9pdCBTdGVpbmVyIDxiZW5vaXQuc3RlaW5lci5nb29nQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CisKKworI2lmIEVJR0VOX0NPTVBfTVNWQworI2RlZmluZSBFSUdFTl9OT19JTlQxMjgKKyNlbHNlCit0eXBlZGVmIF9fdWludDEyOF90IHVpbnQxMjhfdDsKKyNlbmRpZgorCisvLyBPbmx5IHJ1biB0aGUgdGVzdCBvbiBjb21waWxlcnMgdGhhdCBzdXBwb3J0IDEyOGJpdCBpbnRlZ2VycyBuYXRpdmVseQorI2lmbmRlZiBFSUdFTl9OT19JTlQxMjgKKwordXNpbmcgRWlnZW46OmludGVybmFsOjpUZW5zb3JVSW50MTI4OwordXNpbmcgRWlnZW46OmludGVybmFsOjpzdGF0aWNfdmFsOworCit2b2lkIFZFUklGWV9FUVVBTChUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gYWN0dWFsLCB1aW50MTI4X3QgZXhwZWN0ZWQpIHsKKyAgYm9vbCBtYXRjaGwgPSBhY3R1YWwubG93ZXIoKSA9PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZXhwZWN0ZWQpOworICBib29sIG1hdGNoaCA9IGFjdHVhbC51cHBlcigpID09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihleHBlY3RlZCA+PiA2NCk7CisgIGlmICghbWF0Y2hsIHx8ICFtYXRjaGgpIHsKKyAgICBjb25zdCBjaGFyKiB0ZXN0bmFtZSA9IGdfdGVzdF9zdGFjay5iYWNrKCkuY19zdHIoKTsKKyAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCB0ZXN0bmFtZSA8PCAiIGZhaWxlZCBpbiAiIDw8IF9fRklMRV9fCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgX19MSU5FX18gPDwgIikiCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBhYm9ydCgpOworICB9Cit9CisKKwordm9pZCB0ZXN0X2FkZCgpIHsKKyAgdWludDY0X3QgaW5jciA9IGludGVybmFsOjpyYW5kb208dWludDY0X3Q+KDEsIDk5OTk5OTk5OTkpOworICBmb3IgKHVpbnQ2NF90IGkxID0gMDsgaTEgPCAxMDA7ICsraTEpIHsKKyAgICBmb3IgKHVpbnQ2NF90IGkyID0gMTsgaTIgPCAxMDAgKiBpbmNyOyBpMiArPSBpbmNyKSB7CisgICAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gaShpMSwgaTIpOworICAgICAgdWludDEyOF90IGEgPSAoc3RhdGljX2Nhc3Q8dWludDEyOF90PihpMSkgPDwgNjQpICsgc3RhdGljX2Nhc3Q8dWludDEyOF90PihpMik7CisgICAgICBmb3IgKHVpbnQ2NF90IGoxID0gMDsgajEgPCAxMDA7ICsrajEpIHsKKyAgICAgICAgZm9yICh1aW50NjRfdCBqMiA9IDE7IGoyIDwgMTAwICogaW5jcjsgajIgKz0gaW5jcikgeworICAgICAgICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiBqKGoxLCBqMik7CisgICAgICAgICAgdWludDEyOF90IGIgPSAoc3RhdGljX2Nhc3Q8dWludDEyOF90PihqMSkgPDwgNjQpICsgc3RhdGljX2Nhc3Q8dWludDEyOF90PihqMik7CisgICAgICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IGFjdHVhbCA9IGkgKyBqOworICAgICAgICAgIHVpbnQxMjhfdCBleHBlY3RlZCA9IGEgKyBiOworICAgICAgICAgIFZFUklGWV9FUVVBTChhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3Rfc3ViKCkgeworICB1aW50NjRfdCBpbmNyID0gaW50ZXJuYWw6OnJhbmRvbTx1aW50NjRfdD4oMSwgOTk5OTk5OTk5OSk7CisgIGZvciAodWludDY0X3QgaTEgPSAwOyBpMSA8IDEwMDsgKytpMSkgeworICAgIGZvciAodWludDY0X3QgaTIgPSAxOyBpMiA8IDEwMCAqIGluY3I7IGkyICs9IGluY3IpIHsKKyAgICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiBpKGkxLCBpMik7CisgICAgICB1aW50MTI4X3QgYSA9IChzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGkxKSA8PCA2NCkgKyBzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGkyKTsKKyAgICAgIGZvciAodWludDY0X3QgajEgPSAwOyBqMSA8IDEwMDsgKytqMSkgeworICAgICAgICBmb3IgKHVpbnQ2NF90IGoyID0gMTsgajIgPCAxMDAgKiBpbmNyOyBqMiArPSBpbmNyKSB7CisgICAgICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IGooajEsIGoyKTsKKyAgICAgICAgICB1aW50MTI4X3QgYiA9IChzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGoxKSA8PCA2NCkgKyBzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGoyKTsKKyAgICAgICAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gYWN0dWFsID0gaSAtIGo7CisgICAgICAgICAgdWludDEyOF90IGV4cGVjdGVkID0gYSAtIGI7CisgICAgICAgICAgVkVSSUZZX0VRVUFMKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdF9tdWwoKSB7CisgIHVpbnQ2NF90IGluY3IgPSBpbnRlcm5hbDo6cmFuZG9tPHVpbnQ2NF90PigxLCA5OTk5OTk5OTk5KTsKKyAgZm9yICh1aW50NjRfdCBpMSA9IDA7IGkxIDwgMTAwOyArK2kxKSB7CisgICAgZm9yICh1aW50NjRfdCBpMiA9IDE7IGkyIDwgMTAwICogaW5jcjsgaTIgKz0gaW5jcikgeworICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IGkoaTEsIGkyKTsKKyAgICAgIHVpbnQxMjhfdCBhID0gKHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oaTEpIDw8IDY0KSArIHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oaTIpOworICAgICAgZm9yICh1aW50NjRfdCBqMSA9IDA7IGoxIDwgMTAwOyArK2oxKSB7CisgICAgICAgIGZvciAodWludDY0X3QgajIgPSAxOyBqMiA8IDEwMCAqIGluY3I7IGoyICs9IGluY3IpIHsKKyAgICAgICAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gaihqMSwgajIpOworICAgICAgICAgIHVpbnQxMjhfdCBiID0gKHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oajEpIDw8IDY0KSArIHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oajIpOworICAgICAgICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiBhY3R1YWwgPSBpICogajsKKyAgICAgICAgICB1aW50MTI4X3QgZXhwZWN0ZWQgPSBhICogYjsKKyAgICAgICAgICBWRVJJRllfRVFVQUwoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0X2RpdigpIHsKKyAgdWludDY0X3QgaW5jciA9IGludGVybmFsOjpyYW5kb208dWludDY0X3Q+KDEsIDk5OTk5OTk5OTkpOworICBmb3IgKHVpbnQ2NF90IGkxID0gMDsgaTEgPCAxMDA7ICsraTEpIHsKKyAgICBmb3IgKHVpbnQ2NF90IGkyID0gMTsgaTIgPCAxMDAgKiBpbmNyOyBpMiArPSBpbmNyKSB7CisgICAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gaShpMSwgaTIpOworICAgICAgdWludDEyOF90IGEgPSAoc3RhdGljX2Nhc3Q8dWludDEyOF90PihpMSkgPDwgNjQpICsgc3RhdGljX2Nhc3Q8dWludDEyOF90PihpMik7CisgICAgICBmb3IgKHVpbnQ2NF90IGoxID0gMDsgajEgPCAxMDA7ICsrajEpIHsKKyAgICAgICAgZm9yICh1aW50NjRfdCBqMiA9IDE7IGoyIDwgMTAwICogaW5jcjsgajIgKz0gaW5jcikgeworICAgICAgICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiBqKGoxLCBqMik7CisgICAgICAgICAgdWludDEyOF90IGIgPSAoc3RhdGljX2Nhc3Q8dWludDEyOF90PihqMSkgPDwgNjQpICsgc3RhdGljX2Nhc3Q8dWludDEyOF90PihqMik7CisgICAgICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IGFjdHVhbCA9IGkgLyBqOworICAgICAgICAgIHVpbnQxMjhfdCBleHBlY3RlZCA9IGEgLyBiOworICAgICAgICAgIFZFUklGWV9FUVVBTChhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfbWlzYzEoKSB7CisgIHVpbnQ2NF90IGluY3IgPSBpbnRlcm5hbDo6cmFuZG9tPHVpbnQ2NF90PigxLCA5OTk5OTk5OTk5KTsKKyAgZm9yICh1aW50NjRfdCBpMiA9IDE7IGkyIDwgMTAwICogaW5jcjsgaTIgKz0gaW5jcikgeworICAgIFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwwPiwgdWludDY0X3Q+IGkoMCwgaTIpOworICAgIHVpbnQxMjhfdCBhID0gc3RhdGljX2Nhc3Q8dWludDEyOF90PihpMik7CisgICAgZm9yICh1aW50NjRfdCBqMiA9IDE7IGoyIDwgMTAwICogaW5jcjsgajIgKz0gaW5jcikgeworICAgICAgVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCB1aW50NjRfdD4gaigwLCBqMik7CisgICAgICB1aW50MTI4X3QgYiA9IHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oajIpOworICAgICAgdWludDY0X3QgYWN0dWFsID0gKGkgKiBqKS51cHBlcigpOworICAgICAgdWludDY0X3QgZXhwZWN0ZWQgPSAoYSAqIGIpID4+IDY0OworICAgICAgVkVSSUZZX0lTX0VRVUFMKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfbWlzYzIoKSB7CisgIGludDY0X3QgaW5jciA9IGludGVybmFsOjpyYW5kb208aW50NjRfdD4oMSwgMTAwKTsKKyAgZm9yIChpbnQ2NF90IGxvZ19kaXYgPSAwOyBsb2dfZGl2IDwgNjM7ICsrbG9nX2RpdikgeworICAgIGZvciAoaW50NjRfdCBkaXZpZGVyID0gMTsgZGl2aWRlciA8PSAxMDAwMDAwICogaW5jcjsgZGl2aWRlciArPSBpbmNyKSB7CisgICAgICB1aW50NjRfdCBleHBlY3RlZCA9IChzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KDEpIDw8ICg2NCtsb2dfZGl2KSkgLyBzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGRpdmlkZXIpIC0gKHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oMSkgPDwgNjQpICsgMTsKKyAgICAgIHVpbnQ2NF90IHNoaWZ0ID0gMVVMTCA8PCBsb2dfZGl2OworCisgICAgICBUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gcmVzdWx0ID0gKFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHN0YXRpY192YWw8MD4gPihzaGlmdCwgMCkgLyBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MD4sIHVpbnQ2NF90PihkaXZpZGVyKSAtIFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwxPiwgc3RhdGljX3ZhbDwwPiA+KDEsIDApICsgVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCBzdGF0aWNfdmFsPDE+ID4oMSkpOworICAgICAgdWludDY0X3QgYWN0dWFsID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdCk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3VpbnQxMjgoKQoreworI2lmZGVmIEVJR0VOX05PX0lOVDEyOAorICAvLyBTa2lwIHRoZSB0ZXN0IG9uIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgMTI4Yml0IGludGVnZXJzIG5hdGl2ZWx5CisgIHJldHVybjsKKyNlbHNlCisgIENBTExfU1VCVEVTVF8xKHRlc3RfYWRkKCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X3N1YigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9tdWwoKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfZGl2KCkpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0X21pc2MxKCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0X21pc2MyKCkpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2guY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY4NDBmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoLmNwcApAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KKwordXNpbmcgRWlnZW46OlRlbnNvcjsKKworc3RhdGljIHZvaWQgdGVzdF9zaW5nbGVfdm94ZWxfcGF0Y2goKQoreworICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcig0LDIsMyw1LDcpOworICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CisgIFRlbnNvcjxmbG9hdCwgNSwgUm93TWFqb3I+IHRlbnNvcl9yb3dfbWFqb3IgPSB0ZW5zb3Iuc3dhcF9sYXlvdXQoKTsKKworICBUZW5zb3I8ZmxvYXQsIDY+IHNpbmdsZV92b3hlbF9wYXRjaDsKKyAgc2luZ2xlX3ZveGVsX3BhdGNoID0gdGVuc29yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMoMSwgMSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2guZGltZW5zaW9uKDApLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV92b3hlbF9wYXRjaC5kaW1lbnNpb24oMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3ZveGVsX3BhdGNoLmRpbWVuc2lvbigyKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2guZGltZW5zaW9uKDMpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV92b3hlbF9wYXRjaC5kaW1lbnNpb24oNCksIDIgKiAzICogNSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2guZGltZW5zaW9uKDUpLCA3KTsKKworICBUZW5zb3I8ZmxvYXQsIDYsIFJvd01ham9yPiBzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yOworICBzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X3ZvbHVtZV9wYXRjaGVzKDEsIDEsIDEpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDcpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDIgKiAzICogNSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig1KSwgNCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW5zb3Iuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmRhdGEoKVtpXSwgc2luZ2xlX3ZveGVsX3BhdGNoLmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldLCBzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kYXRhKClbaV0sIHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRlc3RfZW50aXJlX3ZvbHVtZV9wYXRjaCgpCit7CisgIGNvbnN0IGludCBkZXB0aCA9IDQ7CisgIGNvbnN0IGludCBwYXRjaF96ID0gMjsKKyAgY29uc3QgaW50IHBhdGNoX3kgPSAzOworICBjb25zdCBpbnQgcGF0Y2hfeCA9IDU7CisgIGNvbnN0IGludCBiYXRjaCA9IDc7CisKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoZGVwdGgsIHBhdGNoX3osIHBhdGNoX3ksIHBhdGNoX3gsIGJhdGNoKTsKKyAgdGVuc29yLnNldFJhbmRvbSgpOworICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7CisKKyAgVGVuc29yPGZsb2F0LCA2PiBlbnRpcmVfdm9sdW1lX3BhdGNoOworICBlbnRpcmVfdm9sdW1lX3BhdGNoID0gdGVuc29yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMocGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfdm9sdW1lX3BhdGNoLmRpbWVuc2lvbigwKSwgZGVwdGgpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaC5kaW1lbnNpb24oMSksIHBhdGNoX3opOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaC5kaW1lbnNpb24oMiksIHBhdGNoX3kpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaC5kaW1lbnNpb24oMyksIHBhdGNoX3gpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaC5kaW1lbnNpb24oNCksIHBhdGNoX3ogKiBwYXRjaF95ICogcGF0Y2hfeCk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfdm9sdW1lX3BhdGNoLmRpbWVuc2lvbig1KSwgYmF0Y2gpOworCisgIFRlbnNvcjxmbG9hdCwgNiwgUm93TWFqb3I+IGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yOworICBlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF92b2x1bWVfcGF0Y2hlcyhwYXRjaF96LCBwYXRjaF95LCBwYXRjaF94KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgYmF0Y2gpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCBwYXRjaF96ICogcGF0Y2hfeSAqIHBhdGNoX3gpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCBwYXRjaF94KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgcGF0Y2hfeSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oNCksIHBhdGNoX3opOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDUpLCBkZXB0aCk7CisKKyAgY29uc3QgaW50IGR6ID0gcGF0Y2hfeiAtIDE7CisgIGNvbnN0IGludCBkeSA9IHBhdGNoX3kgLSAxOworICBjb25zdCBpbnQgZHggPSBwYXRjaF94IC0gMTsKKworICBjb25zdCBpbnQgZm9yd2FyZF9wYWRfeiA9IGR6IC0gZHogLyAyOworICBjb25zdCBpbnQgZm9yd2FyZF9wYWRfeSA9IGR5IC0gZHkgLyAyOworICBjb25zdCBpbnQgZm9yd2FyZF9wYWRfeCA9IGR4IC0gZHggLyAyOworCisgIGZvciAoaW50IHB6ID0gMDsgcHogPCBwYXRjaF96OyBweisrKSB7CisgICAgZm9yIChpbnQgcHkgPSAwOyBweSA8IHBhdGNoX3k7IHB5KyspIHsKKyAgICAgIGZvciAoaW50IHB4ID0gMDsgcHggPCBwYXRjaF94OyBweCsrKSB7CisgICAgICAgIGNvbnN0IGludCBwYXRjaElkID0gcHogKyBwYXRjaF96ICogKHB5ICsgcHggKiBwYXRjaF95KTsKKyAgICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCBwYXRjaF96OyB6KyspIHsKKyAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHBhdGNoX3k7IHkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBwYXRjaF94OyB4KyspIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7CisgICAgICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CisgICAgICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOworICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVmZl96ID0geiAtIGZvcndhcmRfcGFkX3ogKyBwejsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlZmZfeSA9IHkgLSBmb3J3YXJkX3BhZF95ICsgcHk7CisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZWZmX3ggPSB4IC0gZm9yd2FyZF9wYWRfeCArIHB4OworICAgICAgICAgICAgICAgICAgaWYgKGVmZl96ID49IDAgJiYgZWZmX3kgPj0gMCAmJiBlZmZfeCA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgZWZmX3ogPCBwYXRjaF96ICYmIGVmZl95IDwgcGF0Y2hfeSAmJiBlZmZfeCA8IHBhdGNoX3gpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgZWZmX3osIGVmZl95LCBlZmZfeCwgYik7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgZWZmX3gsIGVmZl95LCBlZmZfeiwgZCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaChkLCB6LCB5LCB4LCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIHgsIHksIHosIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRlc3RfY3h4MTFfdGVuc29yX3ZvbHVtZV9wYXRjaCgpCit7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbmdsZV92b3hlbF9wYXRjaCgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZW50aXJlX3ZvbHVtZV9wYXRjaCgpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvZGdtcmVzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvZGdtcmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExODA3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9kZ21yZXMuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgZGVzaXJlIE51ZW50c2EgPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyCisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiLi4vLi4vdGVzdC9zcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvREdNUkVTLmg+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9kZ21yZXNfVCgpCit7CisgIERHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIERpYWdvbmFsUHJlY29uZGl0aW9uZXI8VD4gPiBkZ21yZXNfY29sbWFqb3JfZGlhZzsKKyAgREdNUkVTPFNwYXJzZU1hdHJpeDxUPiwgSWRlbnRpdHlQcmVjb25kaXRpb25lciAgICA+IGRnbXJlc19jb2xtYWpvcl9JOworICBER01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJbmNvbXBsZXRlTFVUPFQ+ID4gICAgICAgICAgIGRnbXJlc19jb2xtYWpvcl9pbHV0OworICAvL0dNUkVTPFNwYXJzZU1hdHJpeDxUPiwgU1NPUlByZWNvbmRpdGlvbmVyPFQ+ID4gICAgIGRnbXJlc19jb2xtYWpvcl9zc29yOworCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGRnbXJlc19jb2xtYWpvcl9kaWFnKSAgKTsKKy8vICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX0kpICAgICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhkZ21yZXNfY29sbWFqb3JfaWx1dCkgICAgICk7CisgIC8vQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX3Nzb3IpICAgICApOworfQorCit2b2lkIHRlc3RfZGdtcmVzKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9kZ21yZXNfVDxkb3VibGU+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X2RnbXJlc19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2ZvcndhcmRfYWRvbGMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9mb3J3YXJkX2Fkb2xjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZkYjhlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9mb3J3YXJkX2Fkb2xjLmNwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKKyNkZWZpbmUgTlVNQkVSX0RJUkVDVElPTlMgMTYKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9BZG9sY0ZvcndhcmQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3Rvcj4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFZlY3Rvcjo6U2NhbGFyIGZvbyhjb25zdCBWZWN0b3ImIHApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpTY2FsYXIgU2NhbGFyOworICByZXR1cm4gKHAtVmVjdG9yKFNjYWxhcigtMSksU2NhbGFyKDEuKSkpLm5vcm0oKSArIChwLmFycmF5KCkuc3FydCgpLmFicygpICogcC5hcnJheSgpLnNpbigpKS5zdW0oKSArIHAuZG90KHApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+CitzdHJ1Y3QgVGVzdEZ1bmMxCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKKyAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKKworICBpbnQgbV9pbnB1dHMsIG1fdmFsdWVzOworCisgIFRlc3RGdW5jMSgpIDogbV9pbnB1dHMoSW5wdXRzQXRDb21waWxlVGltZSksIG1fdmFsdWVzKFZhbHVlc0F0Q29tcGlsZVRpbWUpIHt9CisgIFRlc3RGdW5jMShpbnQgaW5wdXRzLCBpbnQgdmFsdWVzKSA6IG1faW5wdXRzKGlucHV0cyksIG1fdmFsdWVzKHZhbHVlcykge30KKworICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KKyAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBNYXRyaXg8VCxJbnB1dHNBdENvbXBpbGVUaW1lLDE+JiB4LCBNYXRyaXg8VCxWYWx1ZXNBdENvbXBpbGVUaW1lLDE+KiBfdikgY29uc3QKKyAgeworICAgIE1hdHJpeDxULFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4mIHYgPSAqX3Y7CisKKyAgICB2WzBdID0gMiAqIHhbMF0gKiB4WzBdICsgeFswXSAqIHhbMV07CisgICAgdlsxXSA9IDMgKiB4WzFdICogeFswXSArIDAuNSAqIHhbMV0gKiB4WzFdOworICAgIGlmKGlucHV0cygpPjIpCisgICAgeworICAgICAgdlswXSArPSAwLjUgKiB4WzJdOworICAgICAgdlsxXSArPSB4WzJdOworICAgIH0KKyAgICBpZih2YWx1ZXMoKT4yKQorICAgIHsKKyAgICAgIHZbMl0gPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgIH0KKyAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQorICAgICAgdlsyXSAqPSB4WzJdOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfaikgY29uc3QKKyAgeworICAgICgqdGhpcykoeCwgdik7CisKKyAgICBpZihfaikKKyAgICB7CisgICAgICBKYWNvYmlhblR5cGUmIGogPSAqX2o7CisKKyAgICAgIGooMCwwKSA9IDQgKiB4WzBdICsgeFsxXTsKKyAgICAgIGooMSwwKSA9IDMgKiB4WzFdOworCisgICAgICBqKDAsMSkgPSB4WzBdOworICAgICAgaigxLDEpID0gMyAqIHhbMF0gKyAyICogMC41ICogeFsxXTsKKworICAgICAgaWYgKGlucHV0cygpPjIpCisgICAgICB7CisgICAgICAgIGooMCwyKSA9IDAuNTsKKyAgICAgICAgaigxLDIpID0gMTsKKyAgICAgIH0KKyAgICAgIGlmKHZhbHVlcygpPjIpCisgICAgICB7CisgICAgICAgIGooMiwwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07CisgICAgICAgIGooMiwxKSA9IDMgKiB4WzBdICogeFswXTsKKyAgICAgIH0KKyAgICAgIGlmIChpbnB1dHMoKT4yICYmIHZhbHVlcygpPjIpCisgICAgICB7CisgICAgICAgIGooMiwwKSAqPSB4WzJdOworICAgICAgICBqKDIsMSkgKj0geFsyXTsKKworICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4gdm9pZCBhZG9sY19mb3J3YXJkX2phY29iaWFuKGNvbnN0IEZ1bmMmIGYpCit7CisgICAgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIHggPSBGdW5jOjpJbnB1dFR5cGU6OlJhbmRvbShmLmlucHV0cygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGUgeShmLnZhbHVlcygpKSwgeXJlZihmLnZhbHVlcygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpKYWNvYmlhblR5cGUgaihmLnZhbHVlcygpLGYuaW5wdXRzKCkpLCBqcmVmKGYudmFsdWVzKCksZi5pbnB1dHMoKSk7CisKKyAgICBqcmVmLnNldFplcm8oKTsKKyAgICB5cmVmLnNldFplcm8oKTsKKyAgICBmKHgsJnlyZWYsJmpyZWYpOworLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7CisvLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKKworICAgIGouc2V0WmVybygpOworICAgIHkuc2V0WmVybygpOworICAgIEFkb2xjRm9yd2FyZEphY29iaWFuPEZ1bmM+IGF1dG9qKGYpOworICAgIGF1dG9qKHgsICZ5LCAmaik7CisvLyAgICAgc3RkOjpjZXJyIDw8IHkudHJhbnNwb3NlKCkgPDwgIlxuXG4iOzsKKy8vICAgICBzdGQ6OmNlcnIgPDwgaiA8PCAiXG5cbiI7OworCisgICAgVkVSSUZZX0lTX0FQUFJPWCh5LCB5cmVmKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGosIGpyZWYpOworfQorCit2b2lkIHRlc3RfZm9yd2FyZF9hZG9sYygpCit7CisgIGFkdGw6OnNldE51bURpcihOVU1CRVJfRElSRUNUSU9OUyk7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwyPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwzPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywyPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywzPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGU+KDMsMykpICkpOworICB9CisKKyAgeworICAgIC8vIHNpbXBsZSBpbnN0YW5jaWF0aW9uIHRlc3RzCisgICAgTWF0cml4PGFkdGw6OmFkb3VibGUsMiwxPiB4OworICAgIGZvbyh4KTsKKyAgICBNYXRyaXg8YWR0bDo6YWRvdWJsZSxEeW5hbWljLER5bmFtaWM+IEEoNCw0KTs7CisgICAgQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9nbXJlcy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjk2OTExCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9nbXJlcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBLb2xqYSBCcml4IDxicml4QGlncG0ucnd0aC1hYWFjaGVuLmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIi4uLy4uL3Rlc3Qvc3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9nbXJlc19UKCkKK3sKKyAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gZ21yZXNfY29sbWFqb3JfZGlhZzsKKyAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gZ21yZXNfY29sbWFqb3JfSTsKKyAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJbmNvbXBsZXRlTFVUPFQ+ID4gICAgICAgICAgIGdtcmVzX2NvbG1ham9yX2lsdXQ7CisgIC8vR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgZ21yZXNfY29sbWFqb3Jfc3NvcjsKKworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhnbXJlc19jb2xtYWpvcl9kaWFnKSAgKTsKKy8vICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX2lsdXQpICAgICApOworICAvL0NBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX3Nzb3IpICAgICApOworfQorCit2b2lkIHRlc3RfZ21yZXMoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2dtcmVzX1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9nbXJlc19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2tyb25lY2tlcl9wcm9kdWN0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzAwNDkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2tyb25lY2tlcl9wcm9kdWN0LmNwcApAQCAtMCwwICsxLDI1MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgS29samEgQnJpeCA8YnJpeEBpZ3BtLnJ3dGgtYWFjaGVuLmRlPgorLy8gQ29weXJpZ2h0IChDKSAyMDExIEFuZHJlYXMgUGxhdGVuIDxhbmRpcGxhdGVuQGdteC5kZT4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBDaGVuLVBhbmcgSGUgPGpkaDhAbXM2My5oaW5ldC5uZXQ+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzEKKworI2luY2x1ZGUgInNwYXJzZS5oIgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUV4dHJhPgorI2luY2x1ZGUgPEVpZ2VuL0tyb25lY2tlclByb2R1Y3Q+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX2RpbWVuc2lvbihjb25zdCBNYXRyaXhUeXBlJiBhYiwgY29uc3QgaW50IHJvd3MsICBjb25zdCBpbnQgY29scykKK3sKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLnJvd3MoKSwgcm93cyk7CisgIFZFUklGWV9JU19FUVVBTChhYi5jb2xzKCksIGNvbHMpOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIGFiKQoreworICBWRVJJRllfSVNfRVFVQUwoYWIucm93cygpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLmNvbHMoKSwgNik7CisgIFZFUklGWV9JU19FUVVBTChhYi5ub25aZXJvcygpLCAgMzYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsMCksIC0wLjQwMTczNjc2MzAzODYxMDYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsMSksICAwLjEwNTY4NjM0MzM5MzI3MzUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsMiksIC0wLjcyNTUyMDYxOTQ1NTQyMTIpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsMyksICAwLjE5MDg2NTMzMzY3NDQ3MDYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsNCksICAwLjM1MDg2NDU2NzIzNDExMSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMCw1KSwgLTAuMDkyMzAzMjEwODMwODAxMyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwwKSwgIDAuNDE1NDE3NTE0ODA0Njc3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLDEpLCAtMC4yMzY5MjI3NzAxNzIyMDQ4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLDIpLCAgMC43NTAyMjc1MTMxNDU4NTExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLDMpLCAtMC40Mjc4NzMxMDE5NzQyNjk2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLDQpLCAtMC4zNjI4MTI5MTYyMjY0NTA3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLDUpLCAgMC4yMDY5MjEwODA4NDgxMjc1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDApLCAgMC4wNTQ2NTg5MDE2MDg2Mzk4Nik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiwxKSwgLTAuMjYzNDA5MjUxMTQxOTg1OCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiwyKSwgIDAuMDk4NzExODAyODU3OTM3NTgpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsMyksIC0wLjQ3NTcwNjYzMzQwMTc3MDIpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsNCksIC0wLjA0NzczNzQwODIzMDU4MzM0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDUpLCAgMC4yMzAwNTM1NjA5NjQ1MjU0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDApLCAtMC44MTcyOTQ1ODUzMjYwMTMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDEpLCAgMC4yMTUwMDg2NDI4MzU5MjIxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDIpLCAgMC41ODI1MTEzODQ3MjkyNzQzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDMpLCAtMC4xNTMyNDMzNzcwMDk3MTc0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDQpLCAtMC4zMjkzODMzODcyODIzOTkpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDMsNSksICAwLjA4NjY1MjA3OTEyMDMzMDY0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDApLCAgMC44NDUxMjY3NTE0ODYzMjI1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDEpLCAtMC40ODE5OTY0NTg5MTg5NzcpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsMiksIC0wLjYwMjM0ODIzOTA3OTE1MzUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsMyksICAwLjM0MzUzMzkzNDcxNjQ1NjUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsNCksICAwLjM0MDYwMDIxNTc0Mjg4OTEpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsNSksIC0wLjE5NDI1MjYzNDQyMDA5MTUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsMCksICAwLjExMTE5ODI0ODI5MjUzOTkpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsMSksIC0wLjUzNTg4MDY0MjQ3NTQxNjkpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsMiksIC0wLjA3OTI1NDQ2NTU5MzM1NjQ3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDMpLCAgMC4zODE5Mzg4NzU3NzY5MDM4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDQpLCAgMC4wNDQ4MTQ3NTM4NzIxOTg3Nik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSw1KSwgLTAuMjE1OTY4ODYxNjE1ODA1Nyk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3BhcnNlX2tyb25lY2tlcl9wcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIGFiKQoreworICBWRVJJRllfSVNfRVFVQUwoYWIucm93cygpLCAxMik7CisgIFZFUklGWV9JU19FUVVBTChhYi5jb2xzKCksIDEwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLm5vblplcm9zKCksIDMqMik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywwKSwgLTAuMDQpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsMSksICAwLjA1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDYpLCAtMC4wOCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiw3KSwgIDAuMTApOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDYsOCksICAwLjEyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig4LDkpLCAtMC4xNSk7Cit9CisKKwordm9pZCB0ZXN0X2tyb25lY2tlcl9wcm9kdWN0KCkKK3sKKyAgLy8gRE0gPSBkZW5zZSBtYXRyaXg7IFNNID0gc3BhcnNlIG1hdHJpeAorCisgIE1hdHJpeDxkb3VibGUsIDIsIDM+IERNX2E7CisgIFNwYXJzZU1hdHJpeDxkb3VibGU+IFNNX2EoMiwzKTsKKyAgU01fYS5pbnNlcnQoMCwwKSA9IERNX2EuY29lZmZSZWYoMCwwKSA9IC0wLjQ0NjE1NDAzMDA3ODIyMDE7CisgIFNNX2EuaW5zZXJ0KDAsMSkgPSBETV9hLmNvZWZmUmVmKDAsMSkgPSAtMC44MDU3MzY0Mzc1MjgzMDQ5OworICBTTV9hLmluc2VydCgwLDIpID0gRE1fYS5jb2VmZlJlZigwLDIpID0gIDAuMzg5NjU3MjQ1OTUxNjM0MTsKKyAgU01fYS5pbnNlcnQoMSwwKSA9IERNX2EuY29lZmZSZWYoMSwwKSA9IC0wLjkwNzY1NzIxODczNzY5MjE7CisgIFNNX2EuaW5zZXJ0KDEsMSkgPSBETV9hLmNvZWZmUmVmKDEsMSkgPSAgMC42NDY5MTU2NTY2NTQ1ODUzOworICBTTV9hLmluc2VydCgxLDIpID0gRE1fYS5jb2VmZlJlZigxLDIpID0gLTAuMzY1ODAxMDM5ODc4Mjc4OTsKKyAKKyAgTWF0cml4WGQgICAgICAgICAgICAgRE1fYigzLDIpOworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9iKDMsMik7CisgIFNNX2IuaW5zZXJ0KDAsMCkgPSBETV9iLmNvZWZmUmVmKDAsMCkgPSAgMC45MDA0NDQwOTc2NzY3MDk5OworICBTTV9iLmluc2VydCgwLDEpID0gRE1fYi5jb2VmZlJlZigwLDEpID0gLTAuMjM2ODgzMDg1ODEzOTgzMjsKKyAgU01fYi5pbnNlcnQoMSwwKSA9IERNX2IuY29lZmZSZWYoMSwwKSA9IC0wLjkzMTEwNzgzODk5NDE4MjU7CisgIFNNX2IuaW5zZXJ0KDEsMSkgPSBETV9iLmNvZWZmUmVmKDEsMSkgPSAgMC41MzEwMzM1NzYyOTgwMDQ3OworICBTTV9iLmluc2VydCgyLDApID0gRE1fYi5jb2VmZlJlZigyLDApID0gLTAuMTIyNTExMjgwNjg3MjAzNTsKKyAgU01fYi5pbnNlcnQoMiwxKSA9IERNX2IuY29lZmZSZWYoMiwxKSA9ICAwLjU5MDM5OTgwMjI3NDEyNjQ7CisKKyAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gU01fcm93X2EoU01fYSksIFNNX3Jvd19iKFNNX2IpOworCisgIC8vIHRlc3QgRE1fZml4ZWRTaXplID0ga3JvbmVja2VyUHJvZHVjdChETV9ibG9jayxETSkKKyAgTWF0cml4PGRvdWJsZSwgNiwgNj4gRE1fZml4X2FiID0ga3JvbmVja2VyUHJvZHVjdChETV9hLnRvcExlZnRDb3JuZXI8MiwzPigpLERNX2IpOworCisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChETV9maXhfYWIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoRE1fYS50b3BMZWZ0Q29ybmVyPDIsMz4oKSxETV9iKSkpOworCisgIGZvcihpbnQgaT0wO2k8RE1fZml4X2FiLnJvd3MoKTsrK2kpCisgICAgZm9yKGludCBqPTA7ajxETV9maXhfYWIuY29scygpOysraikKKyAgICAgICBWRVJJRllfSVNfQVBQUk9YKGtyb25lY2tlclByb2R1Y3QoRE1fYSxETV9iKS5jb2VmZihpLGopLCBETV9maXhfYWIoaSxqKSk7CisKKyAgLy8gdGVzdCBETV9ibG9jayA9IGtyb25lY2tlclByb2R1Y3QoRE0sRE0pCisgIE1hdHJpeFhkIERNX2Jsb2NrX2FiKDEwLDE1KTsKKyAgRE1fYmxvY2tfYWIuYmxvY2s8Niw2PigyLDUpID0ga3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoRE1fYmxvY2tfYWIuYmxvY2s8Niw2PigyLDUpKSk7CisKKyAgLy8gdGVzdCBETSA9IGtyb25lY2tlclByb2R1Y3QoRE0sRE0pCisgIE1hdHJpeFhkIERNX2FiID0ga3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoRE1fYWIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoRE1fYSxETV9iKSkpOworCisgIC8vIHRlc3QgU00gPSBrcm9uZWNrZXJQcm9kdWN0KFNNLERNKQorICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSxETV9iKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KFNNX2FiKSk7CisgIFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+IFNNX2FiMiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSxETV9iKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KFNNX2FiMikpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3Qoa3JvbmVja2VyUHJvZHVjdChTTV9hLERNX2IpKSk7CisKKyAgLy8gdGVzdCBTTSA9IGtyb25lY2tlclByb2R1Y3QoRE0sU00pCisgIFNNX2FiLnNldFplcm8oKTsKKyAgU01fYWIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAgU01fYWIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EsU01fYik7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYikpOworICBTTV9hYjIuc2V0WmVybygpOworICBTTV9hYjIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAgU01fYWIyID0ga3JvbmVja2VyUHJvZHVjdChETV9hLFNNX2IpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIyKSk7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChrcm9uZWNrZXJQcm9kdWN0KERNX2EsU01fYikpKTsKKworICAvLyB0ZXN0IFNNID0ga3JvbmVja2VyUHJvZHVjdChTTSxTTSkKKyAgU01fYWIucmVzaXplKDIsMzMpOworICBTTV9hYi5pbnNlcnQoMCwwKT0zNy4wOworICBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KFNNX2FiKSk7CisgIFNNX2FiMi5yZXNpemUoNSwxMSk7CisgIFNNX2FiMi5pbnNlcnQoMCwwKT0zNy4wOworICBTTV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KFNNX2EsU01fYik7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYjIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iKSkpOworCisgIC8vIHRlc3QgU00gPSBrcm9uZWNrZXJQcm9kdWN0KFNNLFNNKSB3aXRoIHNwYXJzZSBwYXR0ZXJuCisgIFNNX2EucmVzaXplKDQsNSk7CisgIFNNX2IucmVzaXplKDMsMik7CisgIFNNX2EucmVzaXplTm9uWmVyb3MoMCk7CisgIFNNX2IucmVzaXplTm9uWmVyb3MoMCk7CisgIFNNX2EuaW5zZXJ0KDEsMCkgPSAtMC4xOworICBTTV9hLmluc2VydCgwLDMpID0gLTAuMjsKKyAgU01fYS5pbnNlcnQoMiw0KSA9ICAwLjM7CisgIFNNX2EuZmluYWxpemUoKTsKKyAgCisgIFNNX2IuaW5zZXJ0KDAsMCkgPSAgMC40OworICBTTV9iLmluc2VydCgyLDEpID0gLTAuNTsKKyAgU01fYi5maW5hbGl6ZSgpOworICBTTV9hYi5yZXNpemUoMSwxKTsKKyAgU01fYWIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAgU01fYWIgPSBrcm9uZWNrZXJQcm9kdWN0KFNNX2EsU01fYik7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKKworICAvLyB0ZXN0IGRpbWVuc2lvbiBvZiByZXN1bHQgb2YgRE0gPSBrcm9uZWNrZXJQcm9kdWN0KERNLERNKQorICBNYXRyaXhYZCBETV9hMigyLDEpOworICBNYXRyaXhYZCBETV9iMig1LDQpOworICBNYXRyaXhYZCBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLERNX2IyKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbWVuc2lvbihETV9hYjIsMio1LDEqNCkpOworICBETV9hMi5yZXNpemUoMTAsOSk7CisgIERNX2IyLnJlc2l6ZSg0LDgpOworICBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLERNX2IyKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbWVuc2lvbihETV9hYjIsMTAqNCw5KjgpKTsKKyAgCisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKQorICB7CisgICAgZG91YmxlIGRlbnNpdHkgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAuMDEsMC41KTsKKyAgICBpbnQgcmEgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOworICAgIGludCBjYSA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7CisgICAgaW50IHJiID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKKyAgICBpbnQgY2IgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOworICAgIFNwYXJzZU1hdHJpeDxmbG9hdCxDb2xNYWpvcj4gc0EocmEsY2EpLCBzQihyYixjYiksIHNDOworICAgIFNwYXJzZU1hdHJpeDxmbG9hdCxSb3dNYWpvcj4gc0MyOworICAgIE1hdHJpeFhmIGRBKHJhLGNhKSwgZEIocmIsY2IpLCBkQzsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIGRBLCBzQSk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCBkQiwgc0IpOworICAgIAorICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQSxzQik7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgCisgICAgc0MgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLnRyYW5zcG9zZSgpLHNCKTsKKyAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoZEEudHJhbnNwb3NlKCksZEIpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGYoc0MpLGRDKTsKKyAgICAKKyAgICBzQyA9IGtyb25lY2tlclByb2R1Y3Qoc0EudHJhbnNwb3NlKCksc0IudHJhbnNwb3NlKCkpOworICAgIGRDID0ga3JvbmVja2VyUHJvZHVjdChkQS50cmFuc3Bvc2UoKSxkQi50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQyksZEMpOworICAgIAorICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQSxzQi50cmFuc3Bvc2UoKSk7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgCisgICAgc0MyID0ga3JvbmVja2VyUHJvZHVjdChzQSxzQik7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDMiksZEMpOworICAgIAorICAgIHNDMiA9IGtyb25lY2tlclByb2R1Y3QoZEEsc0IpOworICAgIGRDID0ga3JvbmVja2VyUHJvZHVjdChkQSxkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQzIpLGRDKTsKKyAgICAKKyAgICBzQzIgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLGRCKTsKKyAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoZEEsZEIpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGYoc0MyKSxkQyk7CisgICAgCisgICAgc0MyID0ga3JvbmVja2VyUHJvZHVjdCgyKnNBLHNCKTsKKyAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoMipkQSxkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQzIpLGRDKTsKKyAgfQorfQorCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8yCisKKy8vIHNpbXBseSBjaGVjayB0aGF0IGZvciBhIGRlbnNlIGtyb25lY2tlciBwcm9kdWN0LCBzcGFyc2UgbW9kdWxlIGlzIG5vdCBuZWVkZWQKKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9Lcm9uZWNrZXJQcm9kdWN0PgorCit2b2lkIHRlc3Rfa3JvbmVja2VyX3Byb2R1Y3QoKQoreworICBNYXRyaXhYZCBhKDIsMiksIGIoMywzKSwgYzsKKyAgYS5zZXRSYW5kb20oKTsKKyAgYi5zZXRSYW5kb20oKTsKKyAgYyA9IGtyb25lY2tlclByb2R1Y3QoYSxiKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjLmJsb2NrKDMsMywzLDMpLCBhKDEsMSkqYik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9sZXZlbmJlcmdfbWFycXVhcmR0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbGV2ZW5iZXJnX21hcnF1YXJkdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmMTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbGV2ZW5iZXJnX21hcnF1YXJkdC5jcHAKQEAgLTAsMCArMSwxNDc3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIGRlc2lyZSBOdWVudHNhIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisvLyBGSVhNRTogVGhlc2UgdGVzdHMgYWxsIGNoZWNrIGZvciBoYXJkLWNvZGVkIHZhbHVlcy4gSWRlYWxseSwgcGFyYW1ldGVycyBhbmQgc3RhcnQgZXN0aW1hdGVzIHNob3VsZCBiZSByYW5kb21pemVkLgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0xldmVuYmVyZ01hcnF1YXJkdD4KKworLy8gVGhpcyBkaXNhYmxlcyBzb21lIHVzZWxlc3MgV2FybmluZ3Mgb24gTVNWQy4KKy8vIEl0IGlzIGludGVuZGVkIHRvIGJlIGRvbmUgZm9yIHRoaXMgdGVzdCBvbmx5LgorI2luY2x1ZGUgPEVpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmg+CisKK3VzaW5nIHN0ZDo6c3FydDsKKworLy8gdG9sZXJhbmNlIGZvciBjaGVrY2luZyBudW1iZXIgb2YgaXRlcmF0aW9ucworI2RlZmluZSBMTV9FVkFMX0NPVU5UX1RPTCA0LzMKKworc3RydWN0IGxtZGVyX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgoreworICAgIGxtZGVyX2Z1bmN0b3Iodm9pZCk6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsMTUpIHt9CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKSBjb25zdAorICAgIHsKKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV0gPSB7MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLAorICAgICAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJngsIE1hdHJpeFhkICZmamFjKSBjb25zdAorICAgIHsKKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7CisgICAgICAgICAgICB0bXA0ID0gKHhbMV0qdG1wMiArIHhbMl0qdG1wMyk7IHRtcDQgPSB0bXA0KnRtcDQ7CisgICAgICAgICAgICBmamFjKGksMCkgPSAtMTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHRtcDEqdG1wMi90bXA0OworICAgICAgICAgICAgZmphYyhpLDIpID0gdG1wMSp0bXAzL3RtcDQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKwordm9pZCB0ZXN0TG1kZXIxKCkKK3sKKyAgaW50IG49MywgaW5mbzsKKworICBWZWN0b3JYZCB4OworCisgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBmaXQuICovCisgIHguc2V0Q29uc3RhbnQobiwgMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbWRlcl9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxsbWRlcl9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLmxtZGVyMSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgNSk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5ibHVlTm9ybSgpLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDU4LCAxLjEzMzAzNywgMi4zNDM2OTU7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworfQorCit2b2lkIHRlc3RMbWRlcigpCit7CisgIGNvbnN0IGludCBtPTE1LCBuPTM7CisgIGludCBpbmZvOworICBkb3VibGUgZm5vcm0sIGNvdmZhYzsKKyAgVmVjdG9yWGQgeDsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kZXJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1kZXJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDUpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgZm5vcm0gPSBsbS5mdmVjKCkuYmx1ZU5vcm0oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbm9ybSwgMC4wOTA2MzU5Nik7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKKworICAvLyBjaGVjayBjb3ZhcmlhbmNlCisgIGNvdmZhYyA9IGZub3JtKmZub3JtLyhtLW4pOworICBpbnRlcm5hbDo6Y292YXIobG0ubWF0cml4UigpLCBsbS5wZXJtdXRhdGlvbigpLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorCisgIE1hdHJpeFhkIGNvdl9yZWYobixuKTsKKyAgY292X3JlZiA8PAorICAgICAgMC4wMDAxNTMxMjAyLCAgIDAuMDAyODY5OTQxLCAgLTAuMDAyNjU2NjYyLAorICAgICAgMC4wMDI4Njk5NDEsICAgIDAuMDk0ODA5MzUsICAgLTAuMDkwOTg5OTUsCisgICAgICAtMC4wMDI2NTY2NjIsICAgLTAuMDkwOTg5OTUsICAgIDAuMDg3Nzg3Mjc7CisKKy8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworCisgIE1hdHJpeFhkIGNvdjsKKyAgY292ID0gIGNvdmZhYypsbS5tYXRyaXhSKCkudG9wTGVmdENvcm5lcjxuLG4+KCk7CisgIFZFUklGWV9JU19BUFBST1goIGNvdiwgY292X3JlZik7CisgIC8vIFRPRE86IHdoeSBpc24ndCB0aGlzIGFsbG93ZWQgPyA6CisgIC8vIFZFUklGWV9JU19BUFBST1goIGNvdmZhYypmamFjLnRvcExlZnRDb3JuZXI8bixuPigpICwgY292X3JlZik7Cit9CisKK3N0cnVjdCBsbWRpZl9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBsbWRpZl9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHRtcDEsdG1wMix0bXAzOworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdPXsxLjRlLTEsMS44ZS0xLDIuMmUtMSwyLjVlLTEsMi45ZS0xLDMuMmUtMSwzLjVlLTEsMy45ZS0xLAorICAgICAgICAgICAgMy43ZS0xLDUuOGUtMSw3LjNlLTEsOS42ZS0xLDEuMzRlMCwyLjFlMCw0LjM5ZTB9OworCisgICAgICAgIGFzc2VydCh4LnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTUpOworICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE1IC0gaTsKKyAgICAgICAgICAgIHRtcDMgPSB0bXAxOworCisgICAgICAgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCit2b2lkIHRlc3RMbWRpZjEoKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pLCBmdmVjKDE1KTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kaWZfZnVuY3RvciBmdW5jdG9yOworICBEZW5zZUluZGV4IG5mZXY7CisgIGluZm8gPSBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1kaWZfZnVuY3Rvcj46OmxtZGlmMShmdW5jdG9yLCB4LCAmbmZldik7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKy8vICAgVkVSSUZZX0lTX0VRVUFMKG5mZXYsIDI2KTsKKworICAvLyBjaGVjayBub3JtCisgIGZ1bmN0b3IoeCwgZnZlYyk7CisgIFZFUklGWV9JU19BUFBST1goZnZlYy5ibHVlTm9ybSgpLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDYsIDEuMTMzMDM2NiwgMi4zNDM2OTQ3OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKKworfQorCit2b2lkIHRlc3RMbWRpZigpCit7CisgIGNvbnN0IGludCBtPTE1LCBuPTM7CisgIGludCBpbmZvOworICBkb3VibGUgZm5vcm0sIGNvdmZhYzsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kaWZfZnVuY3RvciBmdW5jdG9yOworICBOdW1lcmljYWxEaWZmPGxtZGlmX2Z1bmN0b3I+IG51bURpZmYoZnVuY3Rvcik7CisgIExldmVuYmVyZ01hcnF1YXJkdDxOdW1lcmljYWxEaWZmPGxtZGlmX2Z1bmN0b3I+ID4gbG0obnVtRGlmZik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKy8vICAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMjYpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgZm5vcm0gPSBsbS5mdmVjKCkuYmx1ZU5vcm0oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbm9ybSwgMC4wOTA2MzU5Nik7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKKworICAvLyBjaGVjayBjb3ZhcmlhbmNlCisgIGNvdmZhYyA9IGZub3JtKmZub3JtLyhtLW4pOworICBpbnRlcm5hbDo6Y292YXIobG0ubWF0cml4UigpLCBsbS5wZXJtdXRhdGlvbigpLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorCisgIE1hdHJpeFhkIGNvdl9yZWYobixuKTsKKyAgY292X3JlZiA8PAorICAgICAgMC4wMDAxNTMxMjAyLCAgIDAuMDAyODY5OTQyLCAgLTAuMDAyNjU2NjYyLAorICAgICAgMC4wMDI4Njk5NDIsICAgIDAuMDk0ODA5MzcsICAgLTAuMDkwOTg5OTcsCisgICAgICAtMC4wMDI2NTY2NjIsICAgLTAuMDkwOTg5OTcsICAgIDAuMDg3Nzg3Mjk7CisKKy8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworCisgIE1hdHJpeFhkIGNvdjsKKyAgY292ID0gIGNvdmZhYypsbS5tYXRyaXhSKCkudG9wTGVmdENvcm5lcjxuLG4+KCk7CisgIFZFUklGWV9JU19BUFBST1goIGNvdiwgY292X3JlZik7CisgIC8vIFRPRE86IHdoeSBpc24ndCB0aGlzIGFsbG93ZWQgPyA6CisgIC8vIFZFUklGWV9JU19BUFBST1goIGNvdmZhYypmamFjLnRvcExlZnRDb3JuZXI8bixuPigpICwgY292X3JlZik7Cit9CisKK3N0cnVjdCBjaHdpcnV0Ml9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBjaHdpcnV0Ml9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMyw1NCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFs1NF07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbNTRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09NTQpOworICAgICAgICBmb3IoaT0wOyBpPDU0OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOworICAgICAgICAgICAgZnZlY1tpXSA9IGV4cCgtYlswXSp4KS8oYlsxXStiWzJdKngpIC0gbV95W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT01NCk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Myk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDU0OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOworICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyhiWzFdK2JbMl0qeCk7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlswXSp4KTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IC14KmUqZmFjdG9yOworICAgICAgICAgICAgZmphYyhpLDEpID0gLWUqZmFjdG9yKmZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC14KmUqZmFjdG9yKmZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIGNod2lydXQyX2Z1bmN0b3I6Om1feFs1NF0gPSB7IDAuNTAwRTAsIDEuMDAwRTAsIDEuNzUwRTAsIDMuNzUwRTAsIDUuNzUwRTAsIDAuODc1RTAsIDIuMjUwRTAsIDMuMjUwRTAsIDUuMjUwRTAsIDAuNzUwRTAsIDEuNzUwRTAsIDIuNzUwRTAsIDQuNzUwRTAsIDAuNjI1RTAsIDEuMjUwRTAsIDIuMjUwRTAsIDQuMjUwRTAsIC41MDBFMCwgMy4wMDBFMCwgLjc1MEUwLCAzLjAwMEUwLCAxLjUwMEUwLCA2LjAwMEUwLCAzLjAwMEUwLCA2LjAwMEUwLCAxLjUwMEUwLCAzLjAwMEUwLCAuNTAwRTAsIDIuMDAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi4wMDBFMCwgNS4wMDBFMCwgLjc1MEUwLCAyLjI1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAzLjAwMEUwLCAuNzUwRTAsIDIuNTAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi41MDBFMCwgNC4wMDBFMCwgLjc1MEUwLCAyLjUwMEUwLCA0LjAwMEUwLCAuNTAwRTAsIDYuMDAwRTAsIDMuMDAwRTAsIC41MDBFMCwgMi43NTBFMCwgLjUwMEUwLCAxLjc1MEUwfTsKK2NvbnN0IGRvdWJsZSBjaHdpcnV0Ml9mdW5jdG9yOjptX3lbNTRdID0geyA5Mi45MDAwRTAgLDU3LjEwMDBFMCAsMzEuMDUwMEUwICwxMS41ODc1RTAgLDguMDI1MEUwICw2My42MDAwRTAgLDIxLjQwMDBFMCAsMTQuMjUwMEUwICw4LjQ3NTBFMCAsNjMuODAwMEUwICwyNi44MDAwRTAgLDE2LjQ2MjVFMCAsNy4xMjUwRTAgLDY3LjMwMDBFMCAsNDEuMDAwMEUwICwyMS4xNTAwRTAgLDguMTc1MEUwICw4MS41MDAwRTAgLDEzLjEyMDBFMCAsNTkuOTAwMEUwICwxNC42MjAwRTAgLDMyLjkwMDBFMCAsNS40NDAwRTAgLDEyLjU2MDBFMCAsNS40NDAwRTAgLDMyLjAwMDBFMCAsMTMuOTUwMEUwICw3NS44MDAwRTAgLDIwLjAwMDBFMCAsMTAuNDIwMEUwICw1OS41MDAwRTAgLDIxLjY3MDBFMCAsOC41NTAwRTAgLDYyLjAwMDBFMCAsMjAuMjAwMEUwICw3Ljc2MDBFMCAsMy43NTAwRTAgLDExLjgxMDBFMCAsNTQuNzAwMEUwICwyMy43MDAwRTAgLDExLjU1MDBFMCAsNjEuMzAwMEUwICwxNy43MDAwRTAgLDguNzQwMEUwICw1OS4yMDAwRTAgLDE2LjMwMDBFMCAsOC42MjAwRTAgLDgxLjAwMDBFMCAsNC44NzAwRTAgLDE0LjYyMDBFMCAsODEuNzAwMEUwICwxNy4xNzAwRTAgLDgxLjMwMDBFMCAsMjguOTAwMEUwICB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9jaHdpcnV0Mi5zaHRtbAordm9pZCB0ZXN0TmlzdENod2lydXQyKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTM7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDAuMSwgMC4wMSwgMC4wMjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGNod2lydXQyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGNod2lydXQyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKy8vICAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMTApOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuMTMwNDgwMjk0MUUrMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS42NjU3NjY2NTM3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS4xNjUzMjkxMjg2RS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMS4yMTUwMDA3MDk2RS0wMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMTUsIDAuMDA4LCAwLjAxMDsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBsbS5zZXRGdG9sKDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldFh0b2woMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisvLyAgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDcpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA2KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuMTMwNDgwMjk0MUUrMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS42NjU3NjY2NTM3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS4xNjUzMjkxMjg2RS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMS4yMTUwMDA3MDk2RS0wMik7Cit9CisKKworc3RydWN0IG1pc3JhMWFfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgbWlzcmExYV9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiwxNCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFsxNF07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbMTRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7CisgICAgICAgICAgICBmdmVjW2ldID0gYlswXSooMS4tZXhwKC1iWzFdKm1feFtpXSkpIC0gbV95W2ldIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTQpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTIpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7CisgICAgICAgICAgICBmamFjKGksMCkgPSAoMS4tZXhwKC1iWzFdKm1feFtpXSkpOworICAgICAgICAgICAgZmphYyhpLDEpID0gKGJbMF0qbV94W2ldKmV4cCgtYlsxXSptX3hbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV94WzE0XSA9IHsgNzcuNkUwLCAxMTQuOUUwLCAxNDEuMUUwLCAxOTAuOEUwLCAyMzkuOUUwLCAyODkuMEUwLCAzMzIuOEUwLCAzNzguNEUwLCA0MzQuOEUwLCA0NzcuM0UwLCA1MzYuOEUwLCA1OTMuMUUwLCA2ODkuMUUwLCA3NjAuMEUwfTsKK2NvbnN0IGRvdWJsZSBtaXNyYTFhX2Z1bmN0b3I6Om1feVsxNF0gPSB7IDEwLjA3RTAsIDE0LjczRTAsIDE3Ljk0RTAsIDIzLjkzRTAsIDI5LjYxRTAsIDM1LjE4RTAsIDQwLjAyRTAsIDQ0LjgyRTAsIDUwLjc2RTAsIDU1LjA1RTAsIDYxLjAxRTAsIDY2LjQwRTAsIDc1LjQ3RTAsIDgxLjc4RTB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9taXNyYTFhLnNodG1sCit2b2lkIHRlc3ROaXN0TWlzcmExYSh2b2lkKQoreworICBjb25zdCBpbnQgbj0yOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDUwMC4sIDAuMDAwMTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIG1pc3JhMWFfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bWlzcmExYV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDE5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgMTUpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgMS4yNDU1MTM4ODk0RS0wMSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAyLjM4OTQyMTI5MThFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjUwMTU2NDMxODFFLTA0KTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMjUwLiwgMC4wMDA1OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDUpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA0KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDEuMjQ1NTEzODg5NEUtMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4zODk0MjEyOTE4RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS41MDE1NjQzMTgxRS0wNCk7Cit9CisKK3N0cnVjdCBoYWhuMV9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBoYWhuMV9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNywyMzYpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbMjM2XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feVsyMzZdID0geyAuNTkxRTAgLCAxLjU0N0UwICwgMi45MDJFMCAsIDIuODk0RTAgLCA0LjcwM0UwICwgNi4zMDdFMCAsIDcuMDNFMCAgLCA3Ljg5OEUwICwgOS40NzBFMCAsIDkuNDg0RTAgLCAxMC4wNzJFMCAsIDEwLjE2M0UwICwgMTEuNjE1RTAgLCAxMi4wMDVFMCAsIDEyLjQ3OEUwICwgMTIuOTgyRTAgLCAxMi45NzBFMCAsIDEzLjkyNkUwICwgMTQuNDUyRTAgLCAxNC40MDRFMCAsIDE1LjE5MEUwICwgMTUuNTUwRTAgLCAxNS41MjhFMCAsIDE1LjQ5OUUwICwgMTYuMTMxRTAgLCAxNi40MzhFMCAsIDE2LjM4N0UwICwgMTYuNTQ5RTAgLCAxNi44NzJFMCAsIDE2LjgzMEUwICwgMTYuOTI2RTAgLCAxNi45MDdFMCAsIDE2Ljk2NkUwICwgMTcuMDYwRTAgLCAxNy4xMjJFMCAsIDE3LjMxMUUwICwgMTcuMzU1RTAgLCAxNy42NjhFMCAsIDE3Ljc2N0UwICwgMTcuODAzRTAgLCAxNy43NjVFMCAsIDE3Ljc2OEUwICwgMTcuNzM2RTAgLCAxNy44NThFMCAsIDE3Ljg3N0UwICwgMTcuOTEyRTAgLCAxOC4wNDZFMCAsIDE4LjA4NUUwICwgMTguMjkxRTAgLCAxOC4zNTdFMCAsIDE4LjQyNkUwICwgMTguNTg0RTAgLCAxOC42MTBFMCAsIDE4Ljg3MEUwICwgMTguNzk1RTAgLCAxOS4xMTFFMCAsIC4zNjdFMCAsIC43OTZFMCAsIDAuODkyRTAgLCAxLjkwM0UwICwgMi4xNTBFMCAsIDMuNjk3RTAgLCA1Ljg3MEUwICwgNi40MjFFMCAsIDcuNDIyRTAgLCA5Ljk0NEUwICwgMTEuMDIzRTAgLCAxMS44N0UwICAsIDEyLjc4NkUwICwgMTQuMDY3RTAgLCAxMy45NzRFMCAsIDE0LjQ2MkUwICwgMTQuNDY0RTAgLCAxNS4zODFFMCAsIDE1LjQ4M0UwICwgMTUuNTlFMCAgLCAxNi4wNzVFMCAsIDE2LjM0N0UwICwgMTYuMTgxRTAgLCAxNi45MTVFMCAsIDE3LjAwM0UwICwgMTYuOTc4RTAgLCAxNy43NTZFMCAsIDE3LjgwOEUwICwgMTcuODY4RTAgLCAxOC40ODFFMCAsIDE4LjQ4NkUwICwgMTkuMDkwRTAgLCAxNi4wNjJFMCAsIDE2LjMzN0UwICwgMTYuMzQ1RTAgLAorICAgICAgICAxNi4zODhFMCAsIDE3LjE1OUUwICwgMTcuMTE2RTAgLCAxNy4xNjRFMCAsIDE3LjEyM0UwICwgMTcuOTc5RTAgLCAxNy45NzRFMCAsIDE4LjAwN0UwICwgMTcuOTkzRTAgLCAxOC41MjNFMCAsIDE4LjY2OUUwICwgMTguNjE3RTAgLCAxOS4zNzFFMCAsIDE5LjMzMEUwICwgMC4wODBFMCAsIDAuMjQ4RTAgLCAxLjA4OUUwICwgMS40MThFMCAsIDIuMjc4RTAgLCAzLjYyNEUwICwgNC41NzRFMCAsIDUuNTU2RTAgLCA3LjI2N0UwICwgNy42OTVFMCAsIDkuMTM2RTAgLCA5Ljk1OUUwICwgOS45NTdFMCAsIDExLjYwMEUwICwgMTMuMTM4RTAgLCAxMy41NjRFMCAsIDEzLjg3MUUwICwgMTMuOTk0RTAgLCAxNC45NDdFMCAsIDE1LjQ3M0UwICwgMTUuMzc5RTAgLCAxNS40NTVFMCAsIDE1LjkwOEUwICwgMTYuMTE0RTAgLCAxNy4wNzFFMCAsIDE3LjEzNUUwICwgMTcuMjgyRTAgLCAxNy4zNjhFMCAsIDE3LjQ4M0UwICwgMTcuNzY0RTAgLCAxOC4xODVFMCAsIDE4LjI3MUUwICwgMTguMjM2RTAgLCAxOC4yMzdFMCAsIDE4LjUyM0UwICwgMTguNjI3RTAgLCAxOC42NjVFMCAsIDE5LjA4NkUwICwgMC4yMTRFMCAsIDAuOTQzRTAgLCAxLjQyOUUwICwgMi4yNDFFMCAsIDIuOTUxRTAgLCAzLjc4MkUwICwgNC43NTdFMCAsIDUuNjAyRTAgLCA3LjE2OUUwICwgOC45MjBFMCAsIDEwLjA1NUUwICwgMTIuMDM1RTAgLCAxMi44NjFFMCAsIDEzLjQzNkUwICwgMTQuMTY3RTAgLCAxNC43NTVFMCAsIDE1LjE2OEUwICwgMTUuNjUxRTAgLCAxNS43NDZFMCAsIDE2LjIxNkUwICwgMTYuNDQ1RTAgLCAxNi45NjVFMCAsIDE3LjEyMUUwICwgMTcuMjA2RTAgLCAxNy4yNTBFMCAsIDE3LjMzOUUwICwgMTcuNzkzRTAgLCAxOC4xMjNFMCAsIDE4LjQ5RTAgICwgMTguNTY2RTAgLCAxOC42NDVFMCAsIDE4LjcwNkUwICwgMTguOTI0RTAgLCAxOS4xRTAgICAsIDAuMzc1RTAgLCAwLjQ3MUUwICwgMS41MDRFMCAsIDIuMjA0RTAgLCAyLjgxM0UwICwgNC43NjVFMCAsIDkuODM1RTAgLCAxMC4wNDBFMCAsIDExLjk0NkUwICwgCisxMi41OTZFMCAsIAorMTMuMzAzRTAgLCAxMy45MjJFMCAsIDE0LjQ0MEUwICwgMTQuOTUxRTAgLCAxNS42MjdFMCAsIDE1LjYzOUUwICwgMTUuODE0RTAgLCAxNi4zMTVFMCAsIDE2LjMzNEUwICwgMTYuNDMwRTAgLCAxNi40MjNFMCAsIDE3LjAyNEUwICwgMTcuMDA5RTAgLCAxNy4xNjVFMCAsIDE3LjEzNEUwICwgMTcuMzQ5RTAgLCAxNy41NzZFMCAsIDE3Ljg0OEUwICwgMTguMDkwRTAgLCAxOC4yNzZFMCAsIDE4LjQwNEUwICwgMTguNTE5RTAgLCAxOS4xMzNFMCAsIDE5LjA3NEUwICwgMTkuMjM5RTAgLCAxOS4yODBFMCAsIDE5LjEwMUUwICwgMTkuMzk4RTAgLCAxOS4yNTJFMCAsIDE5Ljg5RTAgICwgMjAuMDA3RTAgLCAxOS45MjlFMCAsIDE5LjI2OEUwICwgMTkuMzI0RTAgLCAyMC4wNDlFMCAsIDIwLjEwN0UwICwgMjAuMDYyRTAgLCAyMC4wNjVFMCAsIDE5LjI4NkUwICwgMTkuOTcyRTAgLCAyMC4wODhFMCAsIDIwLjc0M0UwICwgMjAuODNFMCAgLCAyMC45MzVFMCAsIDIxLjAzNUUwICwgMjAuOTNFMCAgLCAyMS4wNzRFMCAsIDIxLjA4NUUwICwgMjAuOTM1RTAgfTsKKworICAgICAgICAvLyAgICAgICAgaW50IGNhbGxlZD0wOyBwcmludGYoImNhbGwgaGFobjFfZnVuY3RvciB3aXRoICBpZmxhZz0lZCwgY2FsbGVkPSVkXG4iLCBpZmxhZywgY2FsbGVkKTsgaWYgKGlmbGFnPT0xKSBjYWxsZWQrKzsKKworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTIzNik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDIzNjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeD1tX3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7CisgICAgICAgICAgICBmdmVjW2ldID0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpIC8gKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KSAtIG1feVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0yMzYpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTcpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyMzY7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHg9bV94W2ldLCB4eD14KngsIHh4eD14eCp4OworICAgICAgICAgICAgZG91YmxlIGZhY3QgPSAxLi8oMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpOworICAgICAgICAgICAgZmphYyhpLDApID0gMS4qZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IHh4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMykgPSB4eHgqZmFjdDsKKyAgICAgICAgICAgIGZhY3QgPSAtIChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAqIGZhY3QgKiBmYWN0OworICAgICAgICAgICAgZmphYyhpLDQpID0geCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDUpID0geHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw2KSA9IHh4eCpmYWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgaGFobjFfZnVuY3Rvcjo6bV94WzIzNl0gPSB7IDI0LjQxRTAgLCAzNC44MkUwICwgNDQuMDlFMCAsIDQ1LjA3RTAgLCA1NC45OEUwICwgNjUuNTFFMCAsIDcwLjUzRTAgLCA3NS43MEUwICwgODkuNTdFMCAsIDkxLjE0RTAgLCA5Ni40MEUwICwgOTcuMTlFMCAsIDExNC4yNkUwICwgMTIwLjI1RTAgLCAxMjcuMDhFMCAsIDEzMy41NUUwICwgMTMzLjYxRTAgLCAxNTguNjdFMCAsIDE3Mi43NEUwICwgMTcxLjMxRTAgLCAyMDIuMTRFMCAsIDIyMC41NUUwICwgMjIxLjA1RTAgLCAyMjEuMzlFMCAsIDI1MC45OUUwICwgMjY4Ljk5RTAgLCAyNzEuODBFMCAsIDI3MS45N0UwICwgMzIxLjMxRTAgLCAzMjEuNjlFMCAsIDMzMC4xNEUwICwgMzMzLjAzRTAgLCAzMzMuNDdFMCAsIDM0MC43N0UwICwgMzQ1LjY1RTAgLCAzNzMuMTFFMCAsIDM3My43OUUwICwgNDExLjgyRTAgLCA0MTkuNTFFMCAsIDQyMS41OUUwICwgNDIyLjAyRTAgLCA0MjIuNDdFMCAsIDQyMi42MUUwICwgNDQxLjc1RTAgLCA0NDcuNDFFMCAsIDQ0OC43RTAgICwgNDcyLjg5RTAgLCA0NzYuNjlFMCAsIDUyMi40N0UwICwgNTIyLjYyRTAgLCA1MjQuNDNFMCAsIDU0Ni43NUUwICwgNTQ5LjUzRTAgLCA1NzUuMjlFMCAsIDU3Ni4wMEUwICwgNjI1LjU1RTAgLCAyMC4xNUUwICwgMjguNzhFMCAsIDI5LjU3RTAgLCAzNy40MUUwICwgMzkuMTJFMCAsIDUwLjI0RTAgLCA2MS4zOEUwICwgNjYuMjVFMCAsIDczLjQyRTAgLCA5NS41MkUwICwgMTA3LjMyRTAgLCAxMjIuMDRFMCAsIDEzNC4wM0UwICwgMTYzLjE5RTAgLCAxNjMuNDhFMCAsIDE3NS43MEUwICwgMTc5Ljg2RTAgLCAyMTEuMjdFMCAsIDIxNy43OEUwICwgMjE5LjE0RTAgLCAyNjIuNTJFMCAsIDI2OC4wMUUwICwgMjY4LjYyRTAgLCAzMzYuMjVFMCAsIDMzNy4yM0UwICwgMzM5LjMzRTAgLCA0MjcuMzhFMCAsIDQyOC41OEUwICwgNDMyLjY4RTAgLCA1MjguOTlFMCAsIDUzMS4wOEUwICwgNjI4LjM0RTAgLCAyNTMuMjRFMCAsIDI3My4xM0UwICwgMjczLjY2RTAgLAorMjgyLjEwRTAgLCAzNDYuNjJFMCAsIDM0Ny4xOUUwICwgMzQ4Ljc4RTAgLCAzNTEuMThFMCAsIDQ1MC4xMEUwICwgNDUwLjM1RTAgLCA0NTEuOTJFMCAsIDQ1NS41NkUwICwgNTUyLjIyRTAgLCA1NTMuNTZFMCAsIDU1NS43NEUwICwgNjUyLjU5RTAgLCA2NTYuMjBFMCAsIDE0LjEzRTAgLCAyMC40MUUwICwgMzEuMzBFMCAsIDMzLjg0RTAgLCAzOS43MEUwICwgNDguODNFMCAsIDU0LjUwRTAgLCA2MC40MUUwICwgNzIuNzdFMCAsIDc1LjI1RTAgLCA4Ni44NEUwICwgOTQuODhFMCAsIDk2LjQwRTAgLCAxMTcuMzdFMCAsIDEzOS4wOEUwICwgMTQ3LjczRTAgLCAxNTguNjNFMCAsIDE2MS44NEUwICwgMTkyLjExRTAgLCAyMDYuNzZFMCAsIDIwOS4wN0UwICwgMjEzLjMyRTAgLCAyMjYuNDRFMCAsIDIzNy4xMkUwICwgMzMwLjkwRTAgLCAzNTguNzJFMCAsIDM3MC43N0UwICwgMzcyLjcyRTAgLCAzOTYuMjRFMCAsIDQxNi41OUUwICwgNDg0LjAyRTAgLCA0OTUuNDdFMCAsIDUxNC43OEUwICwgNTE1LjY1RTAgLCA1MTkuNDdFMCAsIDU0NC40N0UwICwgNTYwLjExRTAgLCA2MjAuNzdFMCAsIDE4Ljk3RTAgLCAyOC45M0UwICwgMzMuOTFFMCAsIDQwLjAzRTAgLCA0NC42NkUwICwgNDkuODdFMCAsIDU1LjE2RTAgLCA2MC45MEUwICwgNzIuMDhFMCAsIDg1LjE1RTAgLCA5Ny4wNkUwICwgMTE5LjYzRTAgLCAxMzMuMjdFMCAsIDE0My44NEUwICwgMTYxLjkxRTAgLCAxODAuNjdFMCAsIDE5OC40NEUwICwgMjI2Ljg2RTAgLCAyMjkuNjVFMCAsIDI1OC4yN0UwICwgMjczLjc3RTAgLCAzMzkuMTVFMCAsIDM1MC4xM0UwICwgMzYyLjc1RTAgLCAzNzEuMDNFMCAsIDM5My4zMkUwICwgNDQ4LjUzRTAgLCA0NzMuNzhFMCAsIDUxMS4xMkUwICwgNTI0LjcwRTAgLCA1NDguNzVFMCAsIDU1MS42NEUwICwgNTc0LjAyRTAgLCA2MjMuODZFMCAsIDIxLjQ2RTAgLCAyNC4zM0UwICwgMzMuNDNFMCAsIDM5LjIyRTAgLCA0NC4xOEUwICwgNTUuMDJFMCAsIDk0LjMzRTAgLCA5Ni40NEUwICwgMTE4LjgyRTAgLCAxMjguNDhFMCAsCisxNDEuOTRFMCAsIDE1Ni45MkUwICwgMTcxLjY1RTAgLCAxOTAuMDBFMCAsIDIyMy4yNkUwICwgMjIzLjg4RTAgLCAyMzEuNTBFMCAsIDI2NS4wNUUwICwgMjY5LjQ0RTAgLCAyNzEuNzhFMCAsIDI3My40NkUwICwgMzM0LjYxRTAgLCAzMzkuNzlFMCAsIDM0OS41MkUwICwgMzU4LjE4RTAgLCAzNzcuOThFMCAsIDM5NC43N0UwICwgNDI5LjY2RTAgLCA0NjguMjJFMCAsIDQ4Ny4yN0UwICwgNTE5LjU0RTAgLCA1MjMuMDNFMCAsIDYxMi45OUUwICwgNjM4LjU5RTAgLCA2NDEuMzZFMCAsIDYyMi4wNUUwICwgNjMxLjUwRTAgLCA2NjMuOTdFMCAsIDY0Ni45RTAgICwgNzQ4LjI5RTAgLCA3NDkuMjFFMCAsIDc1MC4xNEUwICwgNjQ3LjA0RTAgLCA2NDYuODlFMCAsIDc0Ni45RTAgICwgNzQ4LjQzRTAgLCA3NDcuMzVFMCAsIDc0OS4yN0UwICwgNjQ3LjYxRTAgLCA3NDcuNzhFMCAsIDc1MC41MUUwICwgODUxLjM3RTAgLCA4NDUuOTdFMCAsIDg0Ny41NEUwICwgODQ5LjkzRTAgLCA4NTEuNjFFMCAsIDg0OS43NUUwICwgODUwLjk4RTAgLCA4NDguMjNFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2hhaG4xLnNodG1sCit2b2lkIHRlc3ROaXN0SGFobjEodm9pZCkKK3sKKyAgY29uc3QgaW50ICBuPTc7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMTAuLCAtMS4sIC4wNSwgLS4wMDAwMSwgLS4wNSwgLjAwMSwgLS4wMDAwMDE7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBoYWhuMV9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxoYWhuMV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgMS41MzI0MzgyODU0RSswMCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjA3NzYzNTE3MzNFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLC0xLjIyNjkyOTY5MjFFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA0LjA4NjM3NTA2MTBFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLC0xLjQyNjI2NGUtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAyLjQwNTM3MzU1MDNFLTA0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLC0xLjIzMTQ0NTAxOTlFLTA3KTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgLjEsIC0uMSwgLjAwNSwgLS4wMDAwMDEsIC0uMDA1LCAuMDAwMSwgLS4wMDAwMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisvLyAgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgMS41MzI0MzgyODU0RSswMCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjA3NzY0MCk7IC8vIHNob3VsZCBiZSA6ICAxLjA3NzYzNTE3MzNFKzAwCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgLTAuMTIyNjkzMyk7IC8vIHNob3VsZCBiZSA6IC0xLjIyNjkyOTY5MjFFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4wMDQwODYzODMpOyAvLyBzaG91bGQgYmUgOiA0LjA4NjM3NTA2MTBFLTAzCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgLTEuNDI2Mjc3ZS0wNik7IC8vIHNob3VsZGUgYmUgOiAtMS40MjYyNjYyNTE0RS0wNgorICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sLTUuNzYwOTk0MDkwMUUtMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDAuMDAwMjQwNTM3NzIpOyAvLyBzaG91bGQgYmUgOiAyLjQwNTM3MzU1MDNFLTA0CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwgLTEuMjMxNDUwZS0wNyk7IC8vIHNob3VsZCBiZSA6IC0xLjIzMTQ0NTAxOTlFLTA3CisKK30KKworc3RydWN0IG1pc3JhMWRfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgbWlzcmExZF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiwxNCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNF07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKmJbMV0qeFtpXS8oMS4rYlsxXSp4W2ldKSAtIHlbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGRlbiA9IDEuK2JbMV0qeFtpXTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGJbMV0qeFtpXSAvIGRlbjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qeFtpXSooZGVuLWJbMV0qeFtpXSkvZGVuL2RlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eFsxNF0gPSB7IDc3LjZFMCwgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Citjb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp5WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21pc3JhMWQuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNaXNyYTFkKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTI7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgNTAwLiwgMC4wMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbWlzcmExZF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxtaXNyYTFkX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDcpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgNS42NDE5Mjk1MjgzRS0wMik7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA0LjM3MzY5NzA3NTRFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAzLjAyMjczMjQ0NDlFLTA0KTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgNDUwLiwgMC4wMDAzOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDQpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCAzKTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuNjQxOTI5NTI4M0UtMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNC4zNzM2OTcwNzU0RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMy4wMjI3MzI0NDQ5RS0wNCk7Cit9CisKKworc3RydWN0IGxhbmN6b3MxX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgoreworICAgIGxhbmN6b3MxX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig2LDI0KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFsyNF07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzI0XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTYpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTI0KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MjQ7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKmV4cCgtYlsxXSp4W2ldKSArIGJbMl0qZXhwKC1iWzNdKnhbaV0pICsgYls0XSpleHAoLWJbNV0qeFtpXSkgIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTYpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTI0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT02KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MjQ7IGkrKykgeworICAgICAgICAgICAgZmphYyhpLDApID0gZXhwKC1iWzFdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDEpID0gLWJbMF0qeFtpXSpleHAoLWJbMV0qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMikgPSBleHAoLWJbM10qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMykgPSAtYlsyXSp4W2ldKmV4cCgtYlszXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSw0KSA9IGV4cCgtYls1XSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSw1KSA9IC1iWzRdKnhbaV0qZXhwKC1iWzVdKnhbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgbGFuY3pvczFfZnVuY3Rvcjo6eFsyNF0gPSB7IDAuMDAwMDAwMDAwMDAwRSswMCwgNS4wMDAwMDAwMDAwMDBFLTAyLCAxLjAwMDAwMDAwMDAwMEUtMDEsIDEuNTAwMDAwMDAwMDAwRS0wMSwgMi4wMDAwMDAwMDAwMDBFLTAxLCAyLjUwMDAwMDAwMDAwMEUtMDEsIDMuMDAwMDAwMDAwMDAwRS0wMSwgMy41MDAwMDAwMDAwMDBFLTAxLCA0LjAwMDAwMDAwMDAwMEUtMDEsIDQuNTAwMDAwMDAwMDAwRS0wMSwgNS4wMDAwMDAwMDAwMDBFLTAxLCA1LjUwMDAwMDAwMDAwMEUtMDEsIDYuMDAwMDAwMDAwMDAwRS0wMSwgNi41MDAwMDAwMDAwMDBFLTAxLCA3LjAwMDAwMDAwMDAwMEUtMDEsIDcuNTAwMDAwMDAwMDAwRS0wMSwgOC4wMDAwMDAwMDAwMDBFLTAxLCA4LjUwMDAwMDAwMDAwMEUtMDEsIDkuMDAwMDAwMDAwMDAwRS0wMSwgOS41MDAwMDAwMDAwMDBFLTAxLCAxLjAwMDAwMDAwMDAwMEUrMDAsIDEuMDUwMDAwMDAwMDAwRSswMCwgMS4xMDAwMDAwMDAwMDBFKzAwLCAxLjE1MDAwMDAwMDAwMEUrMDAgfTsKK2NvbnN0IGRvdWJsZSBsYW5jem9zMV9mdW5jdG9yOjp5WzI0XSA9IHsgMi41MTM0MDAwMDAwMDBFKzAwICwyLjA0NDMzMzM3MzI5MUUrMDAgLDEuNjY4NDA0NDM2NTY0RSswMCAsMS4zNjY0MTgwMjEyMDhFKzAwICwxLjEyMzIzMjQ4NzM3MkUrMDAgLDkuMjY4ODk3MTgwMDM3RS0wMSAsNy42NzkzMzg1NjM3MjhFLTAxICw2LjM4ODc3NTUyMzEwNkUtMDEgLDUuMzM3ODM1MzE3NDAyRS0wMSAsNC40NzkzNjM2MTczNDdFLTAxICwzLjc3NTg0Nzg4NDM1MEUtMDEgLDMuMTk3MzkzMTk5MzI2RS0wMSAsMi43MjAxMzA3NzM3NDZFLTAxICwyLjMyNDk2NTUyOTAzMkUtMDEgLDEuOTk2NTg5NTQ2MDY1RS0wMSAsMS43MjI3MDQxMjY5MTRFLTAxICwxLjQ5MzQwNTY2MDE2OEUtMDEgLDEuMzAwNzAwMjA2OTIyRS0wMSAsMS4xMzgxMTkzMjQ2NDRFLTAxICwxLjAwMDQxNTU4NzU1OUUtMDEgLDguODMzMjA5MDg0NTQwRS0wMiAsNy44MzM1NDQwMTkzNTBFLTAyICw2Ljk3NjY5Mzc0MzQ0OUUtMDIgLDYuMjM5MzEyNTM2NzE5RS0wMiB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9sYW5jem9zMS5zaHRtbAordm9pZCB0ZXN0TmlzdExhbmN6b3MxKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTY7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEuMiwgMC4zLCA1LjYsIDUuNSwgNi41LCA3LjY7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsYW5jem9zMV9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxsYW5jem9zMV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlRXJyb3JUb29TbWFsbCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDc5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgNzIpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpIDw9IDEuNDMwNzg2NzcyMUUtMjUpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgOS41MTAwMDAwMDI3RS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMS4wMDAwMDAwMDAxRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgOC42MDcwMDAwMDEzRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMy4wMDAwMDAwMDAyRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMS41NTc1OTk5OTk4RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgNS4wMDAwMDAwMDAxRSswMCk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuNSwgMC43LCAzLjYsIDQuMiwgNC4sIDYuMzsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yVG9vU21hbGwpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRlkobG0uZnZlYygpLnNxdWFyZWROb3JtKCkgPD0gMS40MzA3ODY3NzIxRS0yNSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA5LjUxMDAwMDAwMjdFLTAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjAwMDAwMDAwMDFFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA4LjYwNzAwMDAwMTNFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAzLjAwMDAwMDAwMDJFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCAxLjU1NzU5OTk5OThFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCA1LjAwMDAwMDAwMDFFKzAwKTsKKworfQorCitzdHJ1Y3QgcmF0NDJfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgcmF0NDJfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsOSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbOV07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzldOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09OSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDk7IGkrKykgeworICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0gLyAoMS4rZXhwKGJbMV0tYlsyXSp4W2ldKSkgLSB5W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTkpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IC1iWzBdKmUvKDEuK2UpLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9ICtiWzBdKmUqeFtpXS8oMS4rZSkvKDEuK2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eFs5XSA9IHsgOS4wMDBFMCwgMTQuMDAwRTAsIDIxLjAwMEUwLCAyOC4wMDBFMCwgNDIuMDAwRTAsIDU3LjAwMEUwLCA2My4wMDBFMCwgNzAuMDAwRTAsIDc5LjAwMEUwIH07Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eVs5XSA9IHsgOC45MzBFMCAsMTAuODAwRTAgLDE4LjU5MEUwICwyMi4zMzBFMCAsMzkuMzUwRTAgLDU2LjExMEUwICw2MS43MzBFMCAsNjQuNjIwRTAgLDY3LjA4MEUwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3JhdGtvd3NreTIuc2h0bWwKK3ZvaWQgdGVzdE5pc3RSYXQ0Mih2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxMDAuLCAxLiwgMC4xOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgcmF0NDJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8cmF0NDJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZVJlZHVjdGlvblRvb1NtYWxsKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMTApOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDguMDU2NTIyOTMzOEUrMDApOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNy4yNDYyMjM3NTc2RSswMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMi42MTgwNzY4NDAyRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNi43MzU5MjAwMDY2RS0wMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDc1LiwgMi41LCAwLjA3OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGwpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgNSk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCA4LjA1NjUyMjkzMzhFKzAwKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDcuMjQ2MjIzNzU3NkUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDIuNjE4MDc2ODQwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOworfQorCitzdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgTUdIMTBfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsMTYpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE2XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTZdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTYpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKQorICAgICAgICAgICAgZnZlY1tpXSA9ICBiWzBdICogZXhwKGJbMV0vKHhbaV0rYlsyXSkpIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE2KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTY7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyh4W2ldK2JbMl0pOworICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoYlsxXSpmYWN0b3IpOworICAgICAgICAgICAgZmphYyhpLDApID0gZTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qZmFjdG9yKmU7CisgICAgICAgICAgICBmamFjKGksMikgPSAtYlsxXSpiWzBdKmZhY3RvcipmYWN0b3IqZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnhbMTZdID0geyA1LjAwMDAwMEUrMDEsIDUuNTAwMDAwRSswMSwgNi4wMDAwMDBFKzAxLCA2LjUwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgNy41MDAwMDBFKzAxLCA4LjAwMDAwMEUrMDEsIDguNTAwMDAwRSswMSwgOS4wMDAwMDBFKzAxLCA5LjUwMDAwMEUrMDEsIDEuMDAwMDAwRSswMiwgMS4wNTAwMDBFKzAyLCAxLjEwMDAwMEUrMDIsIDEuMTUwMDAwRSswMiwgMS4yMDAwMDBFKzAyLCAxLjI1MDAwMEUrMDIgfTsKK2NvbnN0IGRvdWJsZSBNR0gxMF9mdW5jdG9yOjp5WzE2XSA9IHsgMy40NzgwMDBFKzA0LCAyLjg2MTAwMEUrMDQsIDIuMzY1MDAwRSswNCwgMS45NjMwMDBFKzA0LCAxLjYzNzAwMEUrMDQsIDEuMzcyMDAwRSswNCwgMS4xNTQwMDBFKzA0LCA5Ljc0NDAwMEUrMDMsIDguMjYxMDAwRSswMywgNy4wMzAwMDBFKzAzLCA2LjAwNTAwMEUrMDMsIDUuMTQ3MDAwRSswMywgNC40MjcwMDBFKzAzLCAzLjgyMDAwMEUrMDMsIDMuMzA3MDAwRSswMywgMi44NzIwMDBFKzAzIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21naDEwLnNodG1sCit2b2lkIHRlc3ROaXN0TUdIMTAodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MzsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMi4sIDQwMDAwMC4sIDI1MDAwLjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIE1HSDEwX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PE1HSDEwX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisgICsrZ190ZXN0X2xldmVsOworICBWRVJJRllfSVNfRVFVQUwoaW5mbywgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGwpOworICAtLWdfdGVzdF9sZXZlbDsKKyAgLy8gd2FzOiBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDguNzk0NTg1NTE3MUUrMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNS42MDk2MzY0NzEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNi4xODEzNDYzNDYzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMy40NTIyMzYzNDYyRSswMik7CisgIAorICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKworICArK2dfdGVzdF9sZXZlbDsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMjg0ICk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDI0OSApOworICAtLWdfdGVzdF9sZXZlbDsKKyAgVkVSSUZZKGxtLm5mZXYoKSA8IDI4NCAqIExNX0VWQUxfQ09VTlRfVE9MKTsKKyAgVkVSSUZZKGxtLm5qZXYoKSA8IDI0OSAqIExNX0VWQUxfQ09VTlRfVE9MKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMC4wMiwgNDAwMC4sIDI1MC47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisgICsrZ190ZXN0X2xldmVsOworICBWRVJJRllfSVNfRVFVQUwoaW5mbywgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlUmVkdWN0aW9uVG9vU21hbGwpOworICAvLyB3YXM6IFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgLS1nX3Rlc3RfbGV2ZWw7CisKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDguNzk0NTg1NTE3MUUrMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNS42MDk2MzY0NzEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNi4xODEzNDYzNDYzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMy40NTIyMzYzNDYyRSswMik7CisgIAorICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgKytnX3Rlc3RfbGV2ZWw7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDEyNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDExNik7CisgIC0tZ190ZXN0X2xldmVsOworICBWRVJJRlkobG0ubmZldigpIDwgMTI2ICogTE1fRVZBTF9DT1VOVF9UT0wpOworICBWRVJJRlkobG0ubmpldigpIDwgMTE2ICogTE1fRVZBTF9DT1VOVF9UT0wpOworfQorCisKK3N0cnVjdCBCb3hCT0RfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgQm94Qk9EX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPigyLDYpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzZdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVs2XSA9IHsgMTA5LiwgMTQ5LiwgMTQ5LiwgMTkxLiwgMjEzLiwgMjI0LiB9OworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTYpOworICAgICAgICBmb3IoaW50IGk9MDsgaTw2OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0qKDEuLWV4cCgtYlsxXSp4W2ldKSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09Nik7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Mik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoLWJbMV0qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMCkgPSAxLi1lOworICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4W2ldKmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBCb3hCT0RfZnVuY3Rvcjo6eFs2XSA9IHsgMS4sIDIuLCAzLiwgNS4sIDcuLCAxMC4gfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvYm94Ym9kLnNodG1sCit2b2lkIHRlc3ROaXN0Qm94Qk9EKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTI7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMS4sIDEuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgQm94Qk9EX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PEJveEJPRF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgbG0uc2V0RnRvbCgxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldEZhY3RvcigxMCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgMS4xNjgwMDg4NzY2RSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAyLjEzODA5NDA4ODlFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjQ3MjM3NDg1NDJFLTAxKTsKKyAgCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWShsbS5uZmV2KCkgPCAzMSk7IC8vIDMxCisgIFZFUklGWShsbS5uamV2KCkgPCAyNSk7IC8vIDI1CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDAuNzU7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgbG0uc2V0RnRvbChOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCggTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOyAKKyAgKytnX3Rlc3RfbGV2ZWw7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDE2ICk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDE1ICk7CisgIC0tZ190ZXN0X2xldmVsOworICBWRVJJRlkobG0ubmZldigpIDwgMTYgKiBMTV9FVkFMX0NPVU5UX1RPTCk7CisgIFZFUklGWShsbS5uamV2KCkgPCAxNSAqIExNX0VWQUxfQ09VTlRfVE9MKTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDEuMTY4MDA4ODc2NkUrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4xMzgwOTQwODg5RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS40NzIzNzQ4NTQyRS0wMSk7Cit9CisKK3N0cnVjdCBNR0gxN19mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBNR0gxN19mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNSwzMykge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzNdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszM107CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT01KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zMyk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDMzOyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0gKyBiWzFdKmV4cCgtYlszXSp4W2ldKSArICBiWzJdKmV4cCgtYls0XSp4W2ldKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT01KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0zMyk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDMzOyBpKyspIHsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuOworICAgICAgICAgICAgZmphYyhpLDEpID0gZXhwKC1iWzNdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDIpID0gZXhwKC1iWzRdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDMpID0gLXhbaV0qYlsxXSpleHAoLWJbM10qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksNCkgPSAteFtpXSpiWzJdKmV4cCgtYls0XSp4W2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnhbMzNdID0geyAwLjAwMDAwMEUrMDAsIDEuMDAwMDAwRSswMSwgMi4wMDAwMDBFKzAxLCAzLjAwMDAwMEUrMDEsIDQuMDAwMDAwRSswMSwgNS4wMDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgOC4wMDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDEuMDAwMDAwRSswMiwgMS4xMDAwMDBFKzAyLCAxLjIwMDAwMEUrMDIsIDEuMzAwMDAwRSswMiwgMS40MDAwMDBFKzAyLCAxLjUwMDAwMEUrMDIsIDEuNjAwMDAwRSswMiwgMS43MDAwMDBFKzAyLCAxLjgwMDAwMEUrMDIsIDEuOTAwMDAwRSswMiwgMi4wMDAwMDBFKzAyLCAyLjEwMDAwMEUrMDIsIDIuMjAwMDAwRSswMiwgMi4zMDAwMDBFKzAyLCAyLjQwMDAwMEUrMDIsIDIuNTAwMDAwRSswMiwgMi42MDAwMDBFKzAyLCAyLjcwMDAwMEUrMDIsIDIuODAwMDAwRSswMiwgMi45MDAwMDBFKzAyLCAzLjAwMDAwMEUrMDIsIDMuMTAwMDAwRSswMiwgMy4yMDAwMDBFKzAyIH07Citjb25zdCBkb3VibGUgTUdIMTdfZnVuY3Rvcjo6eVszM10gPSB7IDguNDQwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA5LjMyMDAwMEUtMDEsIDkuMzYwMDAwRS0wMSwgOS4yNTAwMDBFLTAxLCA5LjA4MDAwMEUtMDEsIDguODEwMDAwRS0wMSwgOC41MDAwMDBFLTAxLCA4LjE4MDAwMEUtMDEsIDcuODQwMDAwRS0wMSwgNy41MTAwMDBFLTAxLCA3LjE4MDAwMEUtMDEsIDYuODUwMDAwRS0wMSwgNi41ODAwMDBFLTAxLCA2LjI4MDAwMEUtMDEsIDYuMDMwMDAwRS0wMSwgNS44MDAwMDBFLTAxLCA1LjU4MDAwMEUtMDEsIDUuMzgwMDAwRS0wMSwgNS4yMjAwMDBFLTAxLCA1LjA2MDAwMEUtMDEsIDQuOTAwMDAwRS0wMSwgNC43ODAwMDBFLTAxLCA0LjY3MDAwMEUtMDEsIDQuNTcwMDAwRS0wMSwgNC40ODAwMDBFLTAxLCA0LjM4MDAwMEUtMDEsIDQuMzEwMDAwRS0wMSwgNC4yNDAwMDBFLTAxLCA0LjIwMDAwMEUtMDEsIDQuMTQwMDAwRS0wMSwgNC4xMTAwMDBFLTAxLCA0LjA2MDAwMEUtMDEgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTcuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNR0gxNyh2b2lkKQoreworICBjb25zdCBpbnQgbj01OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDUwLiwgMTUwLiwgLTEwMC4sIDEuLCAyLjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIE1HSDE3X2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PE1HSDE3X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5zZXRGdG9sKE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRNYXhmZXYoMTAwMCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgNS40NjQ4OTQ2OTc1RS0wNSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAzLjc1NDEwMDUyMTFFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjkzNTg0NjkxMjdFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAtMS40NjQ2ODcxMzY2RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yODY3NTM0NjQwRS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMi4yMTIyNjk5NjYyRS0wMik7CisgIAorICAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorLy8gICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMik7ICAvL0ZJWE1FIFVzZSAobG0uaW5mbygpID09IFN1Y2Nlc3MpCisgIFZFUklGWShsbS5uZmV2KCkgPCA3MDAgKTsgLy8gNjAyCisgIFZFUklGWShsbS5uamV2KCkgPCA2MDAgKTsgLy8gNTQ1CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuNSAgLDEuNSAgLC0xICAgLDAuMDEgLDAuMDI7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDE4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgMTUpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgNS40NjQ4OTQ2OTc1RS0wNSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAzLjc1NDEwMDUyMTFFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjkzNTg0NjkxMjdFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAtMS40NjQ2ODcxMzY2RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yODY3NTM0NjQwRS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMi4yMTIyNjk5NjYyRS0wMik7Cit9CisKK3N0cnVjdCBNR0gwOV9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBNR0gwOV9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNCwxMSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIF94WzExXTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTFdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTEpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxMTsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eD14Kng7CisgICAgICAgICAgICBmdmVjW2ldID0gYlswXSooeHgreCpiWzFdKS8oeHgreCpiWzJdK2JbM10pIC0geVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTEpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxMTsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eD14Kng7CisgICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHh4K3gqYlsyXStiWzNdKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9ICh4eCt4KmJbMV0pICogZmFjdG9yOworICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4KiBmYWN0b3I7CisgICAgICAgICAgICBmamFjKGksMikgPSAtIGJbMF0qKHh4K3gqYlsxXSkgKiB4ICogZmFjdG9yICogZmFjdG9yOworICAgICAgICAgICAgZmphYyhpLDMpID0gLSBiWzBdKih4eCt4KmJbMV0pICogZmFjdG9yICogZmFjdG9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgTUdIMDlfZnVuY3Rvcjo6X3hbMTFdID0geyA0LiwgMi4sIDEuLCA1LkUtMSAsIDIuNUUtMDEsIDEuNjcwMDAwRS0wMSwgMS4yNTAwMDBFLTAxLCAgMS5FLTAxLCA4LjMzMDAwMEUtMDIsIDcuMTQwMDAwRS0wMiwgNi4yNTAwMDBFLTAyIH07Citjb25zdCBkb3VibGUgTUdIMDlfZnVuY3Rvcjo6eVsxMV0gPSB7IDEuOTU3MDAwRS0wMSwgMS45NDcwMDBFLTAxLCAxLjczNTAwMEUtMDEsIDEuNjAwMDAwRS0wMSwgOC40NDAwMDBFLTAyLCA2LjI3MDAwMEUtMDIsIDQuNTYwMDAwRS0wMiwgMy40MjAwMDBFLTAyLCAzLjIzMDAwMEUtMDIsIDIuMzUwMDAwRS0wMiwgMi40NjAwMDBFLTAyIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21naDA5LnNodG1sCit2b2lkIHRlc3ROaXN0TUdIMDkodm9pZCkKK3sKKyAgY29uc3QgaW50IG49NDsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAyNS4sIDM5LCA0MS41LCAzOS47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBNR0gwOV9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gwOV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgbG0uc2V0TWF4ZmV2KDEwMDApOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc3MDg5KTsgLy8gc2hvdWxkIGJlIDEuOTI4MDY5MzQ1OEUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAwLjE5MTI2NDIzNTczKTsgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MzA5OTE0KTsgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1Mzk1Mzc1KTsgLy8gc2hvdWxkIGJlIDEuMzYwNjIzMzA2OEUtMDEKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsgCisgIFZFUklGWShsbS5uZmV2KCkgPCA1MTAgKTsgLy8gNDkwCisgIFZFUklGWShsbS5uamV2KCkgPCA0MDAgKTsgLy8gMzc2CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMjUsIDAuMzksIDAuNDE1LCAwLjM5OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAxOCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDE2KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc4MSk7IC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjI2NSk7IC8vIHNob3VsZCBiZSAxLjkxMjgyMzI4NzNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4xMjMwNTI4MCk7IC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTMyMik7IC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCit9CisKKworCitzdHJ1Y3QgQmVubmV0dDVfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgQmVubmV0dDVfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsMTU0KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFsxNTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNTRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTU0KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTU0OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gYlswXSogcG93KGJbMV0reFtpXSwtMS4vYlsyXSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTU0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTU0OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gcG93KGJbMV0reFtpXSwtMS4vYlsyXSk7CisgICAgICAgICAgICBmamFjKGksMCkgPSBlOworICAgICAgICAgICAgZmphYyhpLDEpID0gLSBiWzBdKmUvYlsyXS8oYlsxXSt4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IGJbMF0qZSpsb2coYlsxXSt4W2ldKS9iWzJdL2JbMl07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBCZW5uZXR0NV9mdW5jdG9yOjp4WzE1NF0gPSB7IDcuNDQ3MTY4RTAsIDguMTAyNTg2RTAsIDguNDUyNTQ3RTAsIDguNzExMjc4RTAsIDguOTE2Nzc0RTAsIDkuMDg3MTU1RTAsIDkuMjMyNTkwRTAsIDkuMzU5NTM1RTAsIDkuNDcyMTY2RTAsIDkuNTczMzg0RTAsIDkuNjY1MjkzRTAsIDkuNzQ5NDYxRTAsIDkuODI3MDkyRTAsIDkuODk5MTI4RTAsIDkuOTY2MzIxRTAsIDEwLjAyOTI4MEUwLCAxMC4wODg1MTBFMCwgMTAuMTQ0NDMwRTAsIDEwLjE5NzM4MEUwLCAxMC4yNDc2NzBFMCwgMTAuMjk1NTYwRTAsIDEwLjM0MTI1MEUwLCAxMC4zODQ5NTBFMCwgMTAuNDI2ODIwRTAsIDEwLjQ2NzAwMEUwLCAxMC41MDU2NDBFMCwgMTAuNTQyODMwRTAsIDEwLjU3ODY5MEUwLCAxMC42MTMzMTBFMCwgMTAuNjQ2NzgwRTAsIDEwLjY3OTE1MEUwLCAxMC43MTA1MjBFMCwgMTAuNzQwOTIwRTAsIDEwLjc3MDQ0MEUwLCAxMC43OTkxMDBFMCwgMTAuODI2OTcwRTAsIDEwLjg1NDA4MEUwLCAxMC44ODA0NzBFMCwgMTAuOTA2MTkwRTAsIDEwLjkzMTI2MEUwLCAxMC45NTU3MjBFMCwgMTAuOTc5NTkwRTAsIDExLjAwMjkxMEUwLCAxMS4wMjU3MDBFMCwgMTEuMDQ3OTgwRTAsIDExLjA2OTc3MEUwLCAxMS4wOTExMDBFMCwgMTEuMTExOTgwRTAsIDExLjEzMjQ0MEUwLCAxMS4xNTI0ODBFMCwgMTEuMTcyMTMwRTAsIDExLjE5MTQxMEUwLCAxMS4yMTAzMTBFMCwgMTEuMjI4ODcwRTAsIDExLjI0NzA5MEUwLCAxMS4yNjQ5ODBFMCwgMTEuMjgyNTYwRTAsIDExLjI5OTg0MEUwLCAxMS4zMTY4MjBFMCwgMTEuMzMzNTIwRTAsIDExLjM0OTk0MEUwLCAxMS4zNjYxMDBFMCwgMTEuMzgyMDAwRTAsIDExLjM5NzY2MEUwLCAxMS40MTMwNzBFMCwgMTEuNDI4MjQwRTAsIDExLjQ0MzIwMEUwLCAxMS40NTc5MzBFMCwgMTEuNDcyNDQwRTAsIDExLjQ4Njc1MEUwLCAxMS41MDA4NjBFMCwgMTEuNTE0NzcwRTAsIDExLjUyODQ5MEUwLCAxMS41NDIwMjBFMCwgMTEuNTU1MzgwRTAsIDExLjU2ODU1MEUwLAorMTEuNTgxNTYwRTAsIDExLjU5NDQyMEUwLCAxMS42MDcxMjFFMCwgMTEuNjE5NjQwRTAsIDExLjYzMjAwMEUwLCAxMS42NDQyMTBFMCwgMTEuNjU2MjgwRTAsIDExLjY2ODIwMEUwLCAxMS42Nzk5ODBFMCwgMTEuNjkxNjIwRTAsIDExLjcwMzEzMEUwLCAxMS43MTQ1MTBFMCwgMTEuNzI1NzYwRTAsIDExLjczNjg4MEUwLCAxMS43NDc4OTBFMCwgMTEuNzU4NzgwRTAsIDExLjc2OTU1MEUwLCAxMS43ODAyMDBFMCwgMTEuNzkwNzMwRTAsIDExLjgwMTE2MEUwLCAxMS44MTE0ODBFMCwgMTEuODIxNzAwRTAsIDExLjgzMTgxMEUwLCAxMS44NDE4MjBFMCwgMTEuODUxNzMwRTAsIDExLjg2MTU1MEUwLCAxMS44NzEyNzBFMCwgMTEuODgwODkwRTAsIDExLjg5MDQyMEUwLCAxMS44OTk4NzBFMCwgMTEuOTA5MjIwRTAsIDExLjkxODQ5MEUwLCAxMS45Mjc2ODBFMCwgMTEuOTM2NzgwRTAsIDExLjk0NTc5MEUwLCAxMS45NTQ3MzBFMCwgMTEuOTYzNTkwRTAsIDExLjk3MjM3MEUwLCAxMS45ODEwNzBFMCwgMTEuOTg5NzAwRTAsIDExLjk5ODI2MEUwLCAxMi4wMDY3NDBFMCwgMTIuMDE1MTUwRTAsIDEyLjAyMzQ5MEUwLCAxMi4wMzE3NjBFMCwgMTIuMDM5OTcwRTAsIDEyLjA0ODEwMEUwLCAxMi4wNTYxNzBFMCwgMTIuMDY0MTgwRTAsIDEyLjA3MjEyMEUwLCAxMi4wODAwMTBFMCwgMTIuMDg3ODIwRTAsIDEyLjA5NTU4MEUwLCAxMi4xMDMyODBFMCwgMTIuMTEwOTIwRTAsIDEyLjExODUwMEUwLCAxMi4xMjYwMzBFMCwgMTIuMTMzNTAwRTAsIDEyLjE0MDkxMEUwLCAxMi4xNDgyNzBFMCwgMTIuMTU1NTcwRTAsIDEyLjE2MjgzMEUwLCAxMi4xNzAwMzBFMCwgMTIuMTc3MTcwRTAsIDEyLjE4NDI3MEUwLCAxMi4xOTEzMjBFMCwgMTIuMTk4MzIwRTAsIDEyLjIwNTI3MEUwLCAxMi4yMTIxNzBFMCwgMTIuMjE5MDMwRTAsIDEyLjIyNTg0MEUwLCAxMi4yMzI2MDBFMCwgMTIuMjM5MzIwRTAsIDEyLjI0NTk5MEUwLCAxMi4yNTI2MjBFMCwgMTIuMjU5MjAwRTAsIDEyLjI2NTc1MEUwLCAxMi4yNzIyNDBFMCB9OworY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnlbMTU0XSA9IHsgLTM0LjgzNDcwMkUwICwtMzQuMzkzMjAwRTAgLC0zNC4xNTI5MDFFMCAsLTMzLjk3OTA5OUUwICwtMzMuODQ1OTAxRTAgLC0zMy43MzI4OTlFMCAsLTMzLjY0MDMwMUUwICwtMzMuNTU5MjAwRTAgLC0zMy40ODY4MDFFMCAsLTMzLjQyMzEwMEUwICwtMzMuMzY1MTAxRTAgLC0zMy4zMTMwMDBFMCAsLTMzLjI2MDg5OUUwICwtMzMuMjE3NDAwRTAgLC0zMy4xNzY4OTlFMCAsLTMzLjEzOTE5OEUwICwtMzMuMTAxNjAxRTAgLC0zMy4wNjY3OTlFMCAsLTMzLjAzNTAwMEUwICwtMzMuMDAzMTAxRTAgLC0zMi45NzEyOThFMCAsLTMyLjk0MjI5OUUwICwtMzIuOTE2MzAyRTAgLC0zMi44OTAyMDJFMCAsLTMyLjg2NDEwMUUwICwtMzIuODQxMDAwRTAgLC0zMi44MTc3OTlFMCAsLTMyLjc5NzUwMUUwICwtMzIuNzc0MzAwRTAgLC0zMi43NTcwMDBFMCAsLTMyLjczMzc5OUUwICwtMzIuNzE2NDAwRTAgLC0zMi42OTkxMDBFMCAsLTMyLjY3ODc5OUUwICwtMzIuNjYxNDAwRTAgLC0zMi42NDQwMDFFMCAsLTMyLjYyNjcwMUUwICwtMzIuNjEyMjAyRTAgLC0zMi41OTc2OThFMCAsLTMyLjU4MzE5OUUwICwtMzIuNTY4Njk5RTAgLC0zMi41NTQyOThFMCAsLTMyLjUzOTc5OUUwICwtMzIuNTI1Mjk5RTAgLC0zMi41MTA3OTlFMCAsLTMyLjQ5OTE5OUUwICwtMzIuNDg3NTk4RTAgLC0zMi40NzMyMDJFMCAsLTMyLjQ2MTYwMUUwICwtMzIuNDM1NTAxRTAgLC0zMi40MzU1MDFFMCAsLTMyLjQyNjgwMEUwICwtMzIuNDEyMzAwRTAgLC0zMi40MDA3OTlFMCAsLTMyLjM5MjEwMUUwICwtMzIuMzgwNTAxRTAgLC0zMi4zNjYwMDFFMCAsLTMyLjM1NzMwMEUwICwtMzIuMzQ4NTk4RTAgLC0zMi4zMzk5MDFFMCAsLTMyLjMyODQwMEUwICwtMzIuMzE5Njk4RTAgLC0zMi4zMTEwMDFFMCAsLTMyLjI5OTQwMEUwICwtMzIuMjkwNjk5RTAgLC0zMi4yODIwMDFFMCAsLTMyLjI3MzMwMEUwICwtMzIuMjY0NTk5RTAgLC0zMi4yNTYwMDFFMCAsLTMyLjI0NzI5OUUwCissLTMyLjIzODYwMkUwICwtMzIuMjI5OTAwRTAgLC0zMi4yMjQwOThFMCAsLTMyLjIxNTQwMUUwICwtMzIuMjAzODAwRTAgLC0zMi4xOTgwMDJFMCAsLTMyLjE4OTQwMEUwICwtMzIuMTgzNjAxRTAgLC0zMi4xNzQ5MDBFMCAsLTMyLjE2OTEwMkUwICwtMzIuMTYzMzAwRTAgLC0zMi4xNTQ1OThFMCAsLTMyLjE0NTkwMUUwICwtMzIuMTQwMDk5RTAgLC0zMi4xMzE0MDFFMCAsLTMyLjEyNTU5OUUwICwtMzIuMTE5ODAxRTAgLC0zMi4xMTExOThFMCAsLTMyLjEwNTQwMEUwICwtMzIuMDk2Njk5RTAgLC0zMi4wOTA5MDBFMCAsLTMyLjA4ODAwMUUwICwtMzIuMDc5MzAwRTAgLC0zMi4wNzM1MDJFMCAsLTMyLjA2NzY5OUUwICwtMzIuMDYxOTAxRTAgLC0zMi4wNTYwOTlFMCAsLTMyLjA1MDMwMUUwICwtMzIuMDQ0NDk4RTAgLC0zMi4wMzg3OTlFMCAsLTMyLjAzMzAwMUUwICwtMzIuMDI3MTk5RTAgLC0zMi4wMjQzMDBFMCAsLTMyLjAxODUwMUUwICwtMzIuMDEyNjk5RTAgLC0zMi4wMDQwMDJFMCAsLTMyLjAwMTA5OUUwICwtMzEuOTk1MzAwRTAgLC0zMS45ODk1MDBFMCAsLTMxLjk4MzcwMEUwICwtMzEuOTc3OTAwRTAgLC0zMS45NzIwOTlFMCAsLTMxLjk2OTI5OUUwICwtMzEuOTYzNTAxRTAgLC0zMS45NTc3MDFFMCAsLTMxLjk1MTkwMEUwICwtMzEuOTQ2MTAwRTAgLC0zMS45NDAzMDBFMCAsLTMxLjkzNzQwMUUwICwtMzEuOTMxNjAxRTAgLC0zMS45MjU4MDBFMCAsLTMxLjkyMjg5OUUwICwtMzEuOTE3MTAxRTAgLC0zMS45MTEzMDFFMCAsLTMxLjkwODQwMEUwICwtMzEuOTAyNTk5RTAgLC0zMS44OTY5MDBFMCAsLTMxLjg5Mzk5OUUwICwtMzEuODg4MjAxRTAgLC0zMS44ODUzMDBFMCAsLTMxLjg4MjQwMUUwICwtMzEuODc2NjAwRTAgLC0zMS44NzM2OTlFMCAsLTMxLjg2NzkwMUUwICwtMzEuODYyMTAxRTAgLC0zMS44NTkyMDBFMCAsLTMxLjg1NjMwMEUwICwtMzEuODUwNTAwRTAgLC0zMS44NDQ3MDBFMCAsLTMxLjg0MTgwMUUwICwtMzEuODM4OTAwRTAgLC0zMS44MzMwOTlFMCAsLTMxLjgzMDIwMEUwICwKKy0zMS44MjcyOTlFMCAsLTMxLjgyMTYwMEUwICwtMzEuODE4NzAxRTAgLC0zMS44MTI5MDFFMCAsLTMxLjgwOTk5OUUwICwtMzEuODA3MTAwRTAgLC0zMS44MDEzMDBFMCAsLTMxLjc5ODQwMUUwICwtMzEuNzk1NTAwRTAgLC0zMS43ODk3MDBFMCAsLTMxLjc4NjgwMEUwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Jlbm5ldHQ1LnNodG1sCit2b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkKK3sKKyAgY29uc3QgaW50ICBuPTM7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgLTIwMDAuLCA1MC4sIDAuODsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIEJlbm5ldHQ1X2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PEJlbm5ldHQ1X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5zZXRNYXhmZXYoMTAwMCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA3NTgpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA3NDQpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgNS4yNDA0NzQ0MDczRS0wNCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAtMi41MjM1MDU4MDQzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNC42NzM2NTY0NjQ0RSswMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgOS4zMjE4NDgzMTkzRS0wMSk7CisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAtMTUwMC4sIDQ1LiwgMC44NTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMjAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgMTkyKTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuMjQwNDc0NDA3M0UtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgLTI1MjMuMzAwNzg2NSk7IC8vIHNob3VsZCBiZSAtMi41MjM1MDU4MDQzRSswMworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDQ2LjczNTcwNTc3MSk7IC8vIHNob3VsZCBiZSA0LjY3MzY1NjQ2NDRFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjkzMjE5ODgxODkxKTsgLy8gc2hvdWxkIGJlIDkuMzIxODQ4MzE5M0UtMDEpOworfQorCitzdHJ1Y3QgdGh1cmJlcl9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICB0aHVyYmVyX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig3LDM3KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMzddOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3lbMzddOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIC8vICAgICAgICBpbnQgY2FsbGVkPTA7IHByaW50ZigiY2FsbCBoYWhuMV9mdW5jdG9yIHdpdGggIGlmbGFnPSVkLCBjYWxsZWQ9JWRcbiIsIGlmbGFnLCBjYWxsZWQpOyBpZiAoaWZsYWc9PTEpIGNhbGxlZCsrOworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTM3KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8Mzc7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHg9X3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7CisgICAgICAgICAgICBmdmVjW2ldID0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpIC8gKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KSAtIF95W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0zNyk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Nyk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDM3OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB4PV94W2ldLCB4eD14KngsIHh4eD14eCp4OworICAgICAgICAgICAgZG91YmxlIGZhY3QgPSAxLi8oMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpOworICAgICAgICAgICAgZmphYyhpLDApID0gMS4qZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IHh4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMykgPSB4eHgqZmFjdDsKKyAgICAgICAgICAgIGZhY3QgPSAtIChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAqIGZhY3QgKiBmYWN0OworICAgICAgICAgICAgZmphYyhpLDQpID0geCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDUpID0geHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw2KSA9IHh4eCpmYWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgdGh1cmJlcl9mdW5jdG9yOjpfeFszN10gPSB7IC0zLjA2N0UwLCAtMi45ODFFMCwgLTIuOTIxRTAsIC0yLjkxMkUwLCAtMi44NDBFMCwgLTIuNzk3RTAsIC0yLjcwMkUwLCAtMi42OTlFMCwgLTIuNjMzRTAsIC0yLjQ4MUUwLCAtMi4zNjNFMCwgLTIuMzIyRTAsIC0xLjUwMUUwLCAtMS40NjBFMCwgLTEuMjc0RTAsIC0xLjIxMkUwLCAtMS4xMDBFMCwgLTEuMDQ2RTAsIC0wLjkxNUUwLCAtMC43MTRFMCwgLTAuNTY2RTAsIC0wLjU0NUUwLCAtMC40MDBFMCwgLTAuMzA5RTAsIC0wLjEwOUUwLCAtMC4xMDNFMCwgMC4wMTBFMCwgMC4xMTlFMCwgMC4zNzdFMCwgMC43OTBFMCwgMC45NjNFMCwgMS4wMDZFMCwgMS4xMTVFMCwgMS41NzJFMCwgMS44NDFFMCwgMi4wNDdFMCwgMi4yMDBFMCB9OworY29uc3QgZG91YmxlIHRodXJiZXJfZnVuY3Rvcjo6X3lbMzddID0geyA4MC41NzRFMCwgODQuMjQ4RTAsIDg3LjI2NEUwLCA4Ny4xOTVFMCwgODkuMDc2RTAsIDg5LjYwOEUwLCA4OS44NjhFMCwgOTAuMTAxRTAsIDkyLjQwNUUwLCA5NS44NTRFMCwgMTAwLjY5NkUwLCAxMDEuMDYwRTAsIDQwMS42NzJFMCwgMzkwLjcyNEUwLCA1NjcuNTM0RTAsIDYzNS4zMTZFMCwgNzMzLjA1NEUwLCA3NTkuMDg3RTAsIDg5NC4yMDZFMCwgOTkwLjc4NUUwLCAxMDkwLjEwOUUwLCAxMDgwLjkxNEUwLCAxMTIyLjY0M0UwLCAxMTc4LjM1MUUwLCAxMjYwLjUzMUUwLCAxMjczLjUxNEUwLCAxMjg4LjMzOUUwLCAxMzI3LjU0M0UwLCAxMzUzLjg2M0UwLCAxNDE0LjUwOUUwLCAxNDI1LjIwOEUwLCAxNDIxLjM4NEUwLCAxNDQyLjk2MkUwLCAxNDY0LjM1MEUwLCAxNDY4LjcwNUUwLCAxNDQ3Ljg5NEUwLCAxNDU3LjYyOEUwfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvdGh1cmJlci5zaHRtbAordm9pZCB0ZXN0TmlzdFRodXJiZXIodm9pZCkKK3sKKyAgY29uc3QgaW50IG49NzsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxMDAwICwxMDAwICw0MDAgLDQwICwwLjcsMC4zLDAuMCA7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICB0aHVyYmVyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PHRodXJiZXJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnNldEZ0b2woMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCgxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMzkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCAzNik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCA1LjY0MjcwODIzOTdFKzAzKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMjg4MTM5NjgwMEUrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuNDkxMDc5MjUzNUUrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDUuODMyMzgzNjg3N0UrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDcuNTQxNjY0NDI5MUUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDkuNjYyOTUwMjg2NEUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDMuOTc5NzI4NTc5N0UtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbNl0sIDQuOTcyNzI5NzM0OUUtMDIpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAxMzAwICwxNTAwICw1MDAgICw3NSAgICwxICAgICwwLjQgICwwLjA1ICA7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgbG0uc2V0RnRvbCgxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAyOSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDI4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuNjQyNzA4MjM5N0UrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4yODgxMzk2ODAwRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMS40OTEwNzkyNTM1RSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNS44MzIzODM2ODc3RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgNy41NDE2NjQ0MjkxRSswMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgOS42NjI5NTAyODY0RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgMy45Nzk3Mjg1Nzk3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwgNC45NzI3Mjk3MzQ5RS0wMik7Cit9CisKK3N0cnVjdCByYXQ0M19mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICByYXQ0M19mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNCwxNSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTVdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gYlswXSAqIHBvdygxLitleHAoYlsxXS1iWzJdKnhbaV0pLC0xLi9iWzNdKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNSk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKKyAgICAgICAgICAgIGRvdWJsZSBwb3dlciA9IC0xLi9iWzNdOworICAgICAgICAgICAgZmphYyhpLDApID0gcG93KDEuK2UsIHBvd2VyKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHBvd2VyKmJbMF0qZSpwb3coMS4rZSwgcG93ZXItMS4pOworICAgICAgICAgICAgZmphYyhpLDIpID0gLXBvd2VyKmJbMF0qZSp4W2ldKnBvdygxLitlLCBwb3dlci0xLik7CisgICAgICAgICAgICBmamFjKGksMykgPSBiWzBdKnBvd2VyKnBvd2VyKmxvZygxLitlKSpwb3coMS4rZSwgcG93ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eFsxNV0gPSB7IDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4gfTsKK2NvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp5WzE1XSA9IHsgMTYuMDgsIDMzLjgzLCA2NS44MCwgOTcuMjAsIDE5MS41NSwgMzI2LjIwLCAzODYuODcsIDUyMC41MywgNTkwLjAzLCA2NTEuOTIsIDcyNC45MywgNjk5LjU2LCA2ODkuOTYsIDYzNy41NiwgNzE3LjQxIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3JhdGtvd3NreTMuc2h0bWwKK3ZvaWQgdGVzdE5pc3RSYXQ0Myh2b2lkKQoreworICBjb25zdCBpbnQgbj00OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDEwLiwgMS4sIDEuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgcmF0NDNfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8cmF0NDNfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnNldEZ0b2woMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCgxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMjcpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCAyMCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCA4Ljc4NjQwNDkwODBFKzAzKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDYuOTk2NDE1MTI3MEUrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuMjc3MTI1MzAyNUUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDcuNTk2MjkzODMyOUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDEuMjc5MjQ4Mzg1OUUrMDApOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCA3MDAuLCA1LiwgMC43NSwgMS4zOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CisgIGxtLnNldEZ0b2woMS5FNSpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCgxLkU1Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgOSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDgpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgOC43ODY0MDQ5MDgwRSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA2Ljk5NjQxNTEyNzBFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjI3NzEyNTMwMjVFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA3LjU5NjI5MzgzMjlFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI3OTI0ODM4NTlFKzAwKTsKK30KKworCisKK3N0cnVjdCBlY2tlcmxlNF9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBlY2tlcmxlNF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywzNSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzVdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszNV07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zNSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDM1OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gYlswXS9iWzFdICogZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvKGJbMV0qYlsxXSkpIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTM1KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MzU7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGIxMiA9IGJbMV0qYlsxXTsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvYjEyKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGUgLyBiWzFdOworICAgICAgICAgICAgZmphYyhpLDEpID0gKCh4W2ldLWJbMl0pKih4W2ldLWJbMl0pL2IxMi0xLikgKiBiWzBdKmUvYjEyOworICAgICAgICAgICAgZmphYyhpLDIpID0gKHhbaV0tYlsyXSkqZSpiWzBdL2JbMV0vYjEyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgZWNrZXJsZTRfZnVuY3Rvcjo6eFszNV0gPSB7IDQwMC4wLCA0MDUuMCwgNDEwLjAsIDQxNS4wLCA0MjAuMCwgNDI1LjAsIDQzMC4wLCA0MzUuMCwgNDM2LjUsIDQzOC4wLCA0MzkuNSwgNDQxLjAsIDQ0Mi41LCA0NDQuMCwgNDQ1LjUsIDQ0Ny4wLCA0NDguNSwgNDUwLjAsIDQ1MS41LCA0NTMuMCwgNDU0LjUsIDQ1Ni4wLCA0NTcuNSwgNDU5LjAsIDQ2MC41LCA0NjIuMCwgNDYzLjUsIDQ2NS4wLCA0NzAuMCwgNDc1LjAsIDQ4MC4wLCA0ODUuMCwgNDkwLjAsIDQ5NS4wLCA1MDAuMH07Citjb25zdCBkb3VibGUgZWNrZXJsZTRfZnVuY3Rvcjo6eVszNV0gPSB7IDAuMDAwMTU3NSwgMC4wMDAxNjk5LCAwLjAwMDIzNTAsIDAuMDAwMzEwMiwgMC4wMDA0OTE3LCAwLjAwMDg3MTAsIDAuMDAxNzQxOCwgMC4wMDQ2NDAwLCAwLjAwNjU4OTUsIDAuMDA5NzMwMiwgMC4wMTQ5MDAyLCAwLjAyMzczMTAsIDAuMDQwMTY4MywgMC4wNzEyNTU5LCAwLjEyNjQ0NTgsIDAuMjA3MzQxMywgMC4yOTAyMzY2LCAwLjM0NDU2MjMsIDAuMzY5ODA0OSwgMC4zNjY4NTM0LCAwLjMxMDY3MjcsIDAuMjA3ODE1NCwgMC4xMTY0MzU0LCAwLjA2MTY3NjQsIDAuMDMzNzIwMCwgMC4wMTk0MDIzLCAwLjAxMTc4MzEsIDAuMDA3NDM1NywgMC4wMDIyNzMyLCAwLjAwMDg4MDAsIDAuMDAwNDU3OSwgMC4wMDAyMzQ1LCAwLjAwMDE1ODYsIDAuMDAwMTE0MywgMC4wMDAwNzEwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Vja2VybGU0LnNodG1sCit2b2lkIHRlc3ROaXN0RWNrZXJsZTQodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MzsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLiwgMTAuLCA1MDAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgZWNrZXJsZTRfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8ZWNrZXJsZTRfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAxOCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDE1KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDEuNDYzNTg4NzQ4N0UtMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS41NTQzODI3MTc4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0LjA4ODgzMjE3NTQpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDQuNTE1NDEyMTg0NEUrMDIpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAxLjUsIDUuLCA0NTAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDcpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA2KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDEuNDYzNTg4NzQ4N0UtMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS41NTQzODI3MTc4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0LjA4ODgzMjE3NTQpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDQuNTE1NDEyMTg0NEUrMDIpOworfQorCit2b2lkIHRlc3RfbGV2ZW5iZXJnX21hcnF1YXJkdCgpCit7CisgICAgLy8gVGVzdHMgdXNpbmcgdGhlIGV4YW1wbGVzIHByb3ZpZGVkIGJ5IChjKW1pbnBhY2sKKyAgICBDQUxMX1NVQlRFU1QodGVzdExtZGVyMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdExtZGVyKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0TG1kaWYxKCkpOworLy8gICAgIENBTExfU1VCVEVTVCh0ZXN0TG1zdHIxKCkpOworLy8gICAgIENBTExfU1VCVEVTVCh0ZXN0TG1zdHIoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RMbWRpZigpKTsKKworICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiTG93ZXIiCisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0TWlzcmExYSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RDaHdpcnV0MigpKTsKKworICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiQXZlcmFnZSIKKyAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RIYWhuMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNaXNyYTFkKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdE1HSDE3KCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdExhbmN6b3MxKCkpOworCisvLyAgICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJIaWdoZXIiCisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0UmF0NDIoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0TUdIMTAoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0Qm94Qk9EKCkpOworLy8gICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdE1HSDA5KCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdEJlbm5ldHQ1KCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdFRodXJiZXIoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0UmF0NDMoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0RWNrZXJsZTQoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9leHBvbmVudGlhbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9leHBvbmVudGlhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZWMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2V4cG9uZW50aWFsLmNwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYXRyaXhfZnVuY3Rpb25zLmgiCisKK2RvdWJsZSBiaW5vbShpbnQgbiwgaW50IGspCit7CisgIGRvdWJsZSByZXMgPSAxOworICBmb3IgKGludCBpPTA7IGk8azsgaSsrKQorICAgIHJlcyA9IHJlcyAqIChuLWsraSsxKSAvIChpKzEpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgZXhwZm4oVCB4LCBpbnQpCit7CisgIHJldHVybiBzdGQ6OmV4cCh4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3QyZFJvdGF0aW9uKGRvdWJsZSB0b2wpCit7CisgIE1hdHJpeDxULDIsMj4gQSwgQiwgQzsKKyAgVCBhbmdsZTsKKworICBBIDw8IDAsIDEsIC0xLCAwOworICBmb3IgKGludCBpPTA7IGk8PTIwOyBpKyspCisgIHsKKyAgICBhbmdsZSA9IHN0YXRpY19jYXN0PFQ+KHBvdygxMCwgaSAvIDUuIC0gMikpOworICAgIEIgPDwgc3RkOjpjb3MoYW5nbGUpLCBzdGQ6OnNpbihhbmdsZSksIC1zdGQ6OnNpbihhbmdsZSksIHN0ZDo6Y29zKGFuZ2xlKTsKKworICAgIEMgPSAoYW5nbGUqQSkubWF0cml4RnVuY3Rpb24oZXhwZm4pOworICAgIHN0ZDo6Y291dCA8PCAidGVzdDJkUm90YXRpb246IGkgPSAiIDw8IGkgPDwgIiAgIGVycm9yIGZ1bm0gPSAiIDw8IHJlbGVycihDLCBCKTsKKyAgICBWRVJJRlkoQy5pc0FwcHJveChCLCBzdGF0aWNfY2FzdDxUPih0b2wpKSk7CisKKyAgICBDID0gKGFuZ2xlKkEpLmV4cCgpOworICAgIHN0ZDo6Y291dCA8PCAiICAgZXJyb3IgZXhwbSA9ICIgPDwgcmVsZXJyKEMsIEIpIDw8ICJcbiI7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0MmRIeXBlcmJvbGljUm90YXRpb24oZG91YmxlIHRvbCkKK3sKKyAgTWF0cml4PHN0ZDo6Y29tcGxleDxUPiwyLDI+IEEsIEIsIEM7CisgIHN0ZDo6Y29tcGxleDxUPiBpbWFnVW5pdCgwLDEpOworICBUIGFuZ2xlLCBjaCwgc2g7CisKKyAgZm9yIChpbnQgaT0wOyBpPD0yMDsgaSsrKQorICB7CisgICAgYW5nbGUgPSBzdGF0aWNfY2FzdDxUPigoaS0xMCkgLyAyLjApOworICAgIGNoID0gc3RkOjpjb3NoKGFuZ2xlKTsKKyAgICBzaCA9IHN0ZDo6c2luaChhbmdsZSk7CisgICAgQSA8PCAwLCBhbmdsZSppbWFnVW5pdCwgLWFuZ2xlKmltYWdVbml0LCAwOworICAgIEIgPDwgY2gsIHNoKmltYWdVbml0LCAtc2gqaW1hZ1VuaXQsIGNoOworCisgICAgQyA9IEEubWF0cml4RnVuY3Rpb24oZXhwZm4pOworICAgIHN0ZDo6Y291dCA8PCAidGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOworCisgICAgQyA9IEEuZXhwKCk7CisgICAgc3RkOjpjb3V0IDw8ICIgICBlcnJvciBleHBtID0gIiA8PCByZWxlcnIoQywgQikgPDwgIlxuIjsKKyAgICBWRVJJRlkoQy5pc0FwcHJveChCLCBzdGF0aWNfY2FzdDxUPih0b2wpKSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RQYXNjYWwoZG91YmxlIHRvbCkKK3sKKyAgZm9yIChpbnQgc2l6ZT0xOyBzaXplPDIwOyBzaXplKyspCisgIHsKKyAgICBNYXRyaXg8VCxEeW5hbWljLER5bmFtaWM+IEEoc2l6ZSxzaXplKSwgQihzaXplLHNpemUpLCBDKHNpemUsc2l6ZSk7CisgICAgQS5zZXRaZXJvKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPHNpemUtMTsgaSsrKQorICAgICAgQShpKzEsaSkgPSBzdGF0aWNfY2FzdDxUPihpKzEpOworICAgIEIuc2V0WmVybygpOworICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspCisgICAgICBmb3IgKGludCBqPTA7IGo8PWk7IGorKykKKyAgICBCKGksaikgPSBzdGF0aWNfY2FzdDxUPihiaW5vbShpLGopKTsKKworICAgIEMgPSBBLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKKyAgICBzdGQ6OmNvdXQgPDwgInRlc3RQYXNjYWw6IHNpemUgPSAiIDw8IHNpemUgPDwgIiAgIGVycm9yIGZ1bm0gPSAiIDw8IHJlbGVycihDLCBCKTsKKyAgICBWRVJJRlkoQy5pc0FwcHJveChCLCBzdGF0aWNfY2FzdDxUPih0b2wpKSk7CisKKyAgICBDID0gQS5leHAoKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgIGVycm9yIGV4cG0gPSAiIDw8IHJlbGVycihDLCBCKSA8PCAiXG4iOworICAgIFZFUklGWShDLmlzQXBwcm94KEIsIHN0YXRpY19jYXN0PFQ+KHRvbCkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCByYW5kb21UZXN0KGNvbnN0IE1hdHJpeFR5cGUmIG0sIGRvdWJsZSB0b2wpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgSW52ZXJzZS5oCisgICovCisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggY29scyA9IG0uY29scygpOworICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLCBtMihyb3dzLCBjb2xzKSwgaWRlbnRpdHkgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCBjb2xzKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICAgIG0yID0gbTEubWF0cml4RnVuY3Rpb24oZXhwZm4pICogKC1tMSkubWF0cml4RnVuY3Rpb24oZXhwZm4pOworICAgIHN0ZDo6Y291dCA8PCAicmFuZG9tVGVzdDogZXJyb3IgZnVubSA9ICIgPDwgcmVsZXJyKGlkZW50aXR5LCBtMik7CisgICAgVkVSSUZZKGlkZW50aXR5LmlzQXBwcm94KG0yLCBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPih0b2wpKSk7CisKKyAgICBtMiA9IG0xLmV4cCgpICogKC1tMSkuZXhwKCk7CisgICAgc3RkOjpjb3V0IDw8ICIgICBlcnJvciBleHBtID0gIiA8PCByZWxlcnIoaWRlbnRpdHksIG0yKSA8PCAiXG4iOworICAgIFZFUklGWShpZGVudGl0eS5pc0FwcHJveChtMiwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4odG9sKSkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9tYXRyaXhfZXhwb25lbnRpYWwoKQoreworICBDQUxMX1NVQlRFU1RfMih0ZXN0MmRSb3RhdGlvbjxkb3VibGU+KDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3QyZFJvdGF0aW9uPGZsb2F0PigyZS01KSk7ICAvLyB3YXMgMWUtNSwgcmVsYXhlZCBmb3IgY2xhbmcgMi44IC8gbGludXggLyB4ODYtNjQKKyAgQ0FMTF9TVUJURVNUXzgodGVzdDJkUm90YXRpb248bG9uZyBkb3VibGU+KDFlLTEzKSk7IAorICBDQUxMX1NVQlRFU1RfMih0ZXN0MmRIeXBlcmJvbGljUm90YXRpb248ZG91YmxlPigxZS0xNCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0MmRIeXBlcmJvbGljUm90YXRpb248ZmxvYXQ+KDFlLTUpKTsKKyAgQ0FMTF9TVUJURVNUXzgodGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uPGxvbmcgZG91YmxlPigxZS0xNCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0UGFzY2FsPGZsb2F0PigxZS02KSk7CisgIENBTExfU1VCVEVTVF81KHRlc3RQYXNjYWw8ZG91YmxlPigxZS0xNSkpOworICBDQUxMX1NVQlRFU1RfMihyYW5kb21UZXN0KE1hdHJpeDJkKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF83KHJhbmRvbVRlc3QoTWF0cml4PGRvdWJsZSwzLDMsUm93TWFqb3I+KCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8zKHJhbmRvbVRlc3QoTWF0cml4NGNkKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF80KHJhbmRvbVRlc3QoTWF0cml4WGQoOCw4KSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzEocmFuZG9tVGVzdChNYXRyaXgyZigpLCAxZS00KSk7CisgIENBTExfU1VCVEVTVF81KHJhbmRvbVRlc3QoTWF0cml4M2NmKCksIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzEocmFuZG9tVGVzdChNYXRyaXg0ZigpLCAxZS00KSk7CisgIENBTExfU1VCVEVTVF82KHJhbmRvbVRlc3QoTWF0cml4WGYoOCw4KSwgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfOShyYW5kb21UZXN0KE1hdHJpeDxsb25nIGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KDcsNyksIDFlLTEzKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5YjY4YQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9uLmNwcApAQCAtMCwwICsxLDE5MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorCisvLyBWYXJpYW50IG9mIFZFUklGWV9JU19BUFBST1ggd2hpY2ggdXNlcyBhYnNvbHV0ZSBlcnJvciBpbnN0ZWFkIG9mCisvLyByZWxhdGl2ZSBlcnJvci4KKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWF9BQlMoYSwgYikgVkVSSUZZKHRlc3RfaXNBcHByb3hfYWJzKGEsIGIpKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94X2Ficyhjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIpCit7CisgIHJldHVybiAoKGEtYikuYXJyYXkoKS5hYnMoKSA8IHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIFR5cGUxOjpSZWFsU2NhbGFyPigpKS5hbGwoKTsKK30KKworCisvLyBSZXR1cm5zIGEgbWF0cml4IHdpdGggZWlnZW52YWx1ZXMgY2x1c3RlcmVkIGFyb3VuZCAwLCAxIGFuZCAyLgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgcmFuZG9tTWF0cml4V2l0aFJlYWxFaXZhbHMoY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgTWF0cml4VHlwZSBkaWFnID0gTWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIGRpYWcoaSwgaSkgPSBTY2FsYXIoUmVhbFNjYWxhcihpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwyKSkpCisgICAgICArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKFJlYWxTY2FsYXIoMC4wMSkpOworICB9CisgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRUm9mQShBKTsKKyAgcmV0dXJuIFFSb2ZBLmhvdXNlaG9sZGVyUSgpLmludmVyc2UoKSAqIGRpYWcgKiBRUm9mQS5ob3VzZWhvbGRlclEoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4Pgorc3RydWN0IHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzCit7CisgIC8vIFJldHVybnMgYSBtYXRyaXggd2l0aCBlaWdlbnZhbHVlcyBjbHVzdGVyZWQgYXJvdW5kIDAgYW5kICsvLSBpLgorICBzdGF0aWMgTWF0cml4VHlwZSBydW4oY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSk7Cit9OworCisvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciByZWFsIG1hdHJpY2VzCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzPE1hdHJpeFR5cGUsIDA+Cit7CisgIHN0YXRpYyBNYXRyaXhUeXBlIHJ1bihjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBzaXplKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgTWF0cml4VHlwZSBkaWFnID0gTWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKKyAgICBJbmRleCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICAgIEluZGV4IHJhbmRvbUludCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KC0xLCAxKTsKKyAgICAgIGlmIChyYW5kb21JbnQgPT0gMCB8fCBpID09IHNpemUtMSkgeworICAgICAgICBkaWFnKGksIGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoMC4wMSk7CisgICAgICAgICsraTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNjYWxhciBhbHBoYSA9IFNjYWxhcihyYW5kb21JbnQpICsgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoMC4wMSk7CisgICAgICAgIGRpYWcoaSwgaSsxKSA9IGFscGhhOworICAgICAgICBkaWFnKGkrMSwgaSkgPSAtYWxwaGE7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0KKyAgICB9CisgICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICAgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gUVJvZkEoQSk7CisgICAgcmV0dXJuIFFSb2ZBLmhvdXNlaG9sZGVyUSgpLmludmVyc2UoKSAqIGRpYWcgKiBRUm9mQS5ob3VzZWhvbGRlclEoKTsKKyAgfQorfTsKKworLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgY29tcGxleCBtYXRyaWNlcwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCByYW5kb21NYXRyaXhXaXRoSW1hZ0VpdmFsczxNYXRyaXhUeXBlLCAxPgoreworICBzdGF0aWMgTWF0cml4VHlwZSBydW4oY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIGNvbnN0IFNjYWxhciBpbWFnVW5pdCgwLCAxKTsKKyAgICBNYXRyaXhUeXBlIGRpYWcgPSBNYXRyaXhUeXBlOjpaZXJvKHNpemUsIHNpemUpOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIGRpYWcoaSwgaSkgPSBTY2FsYXIoUmVhbFNjYWxhcihpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigtMSwgMSkpKSAqIGltYWdVbml0CisgICAgICAgICsgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoUmVhbFNjYWxhcigwLjAxKSk7CisgICAgfQorICAgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IFFSb2ZBKEEpOworICAgIHJldHVybiBRUm9mQS5ob3VzZWhvbGRlclEoKS5pbnZlcnNlKCkgKiBkaWFnICogUVJvZkEuaG91c2Vob2xkZXJRKCk7CisgIH0KK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdE1hdHJpeEV4cG9uZW50aWFsKGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworCisgIFZFUklGWV9JU19BUFBST1goQS5leHAoKSwgQS5tYXRyaXhGdW5jdGlvbihpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbl9leHA8Q29tcGxleFNjYWxhcj4pKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdE1hdHJpeExvZ2FyaXRobShjb25zdCBNYXRyaXhUeXBlJiBBKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBNYXRyaXhUeXBlIHNjYWxlZEE7CisgIFJlYWxTY2FsYXIgbWF4SW1hZ1BhcnRPZlNwZWN0cnVtID0gQS5laWdlbnZhbHVlcygpLmltYWcoKS5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIGlmIChtYXhJbWFnUGFydE9mU3BlY3RydW0gPj0gUmVhbFNjYWxhcigwLjlMICogRUlHRU5fUEkpKQorICAgIHNjYWxlZEEgPSBBICogUmVhbFNjYWxhcigwLjlMICogRUlHRU5fUEkpIC8gbWF4SW1hZ1BhcnRPZlNwZWN0cnVtOworICBlbHNlCisgICAgc2NhbGVkQSA9IEE7CisKKyAgLy8gaWRlbnRpdHkgWC5leHAoKS5sb2coKSA9IFggb25seSBob2xkcyBpZiBJbShsYW1iZGEpIDwgcGkgZm9yIGFsbCBlaWdlbnZhbHVlcyBvZiBYCisgIE1hdHJpeFR5cGUgZXhwQSA9IHNjYWxlZEEuZXhwKCk7CisgIE1hdHJpeFR5cGUgbG9nRXhwQSA9IGV4cEEubG9nKCk7CisgIFZFUklGWV9JU19BUFBST1gobG9nRXhwQSwgc2NhbGVkQSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RIeXBlcmJvbGljRnVuY3Rpb25zKGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIC8vIE5lZWQgdG8gdXNlIGFic29sdXRlIGVycm9yIGJlY2F1c2Ugb2YgcG9zc2libGUgY2FuY2VsbGF0aW9uIHdoZW4KKyAgLy8gYWRkaW5nL3N1YnRyYWN0aW5nIGV4cEEgYW5kIGV4cG1BLgorICBWRVJJRllfSVNfQVBQUk9YX0FCUyhBLnNpbmgoKSwgKEEuZXhwKCkgLSAoLUEpLmV4cCgpKSAvIDIpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhBLmNvc2goKSwgKEEuZXhwKCkgKyAoLUEpLmV4cCgpKSAvIDIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0R29uaW9GdW5jdGlvbnMoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok9wdGlvbnM+IENvbXBsZXhNYXRyaXg7CisKKyAgQ29tcGxleFNjYWxhciBpbWFnVW5pdCgwLDEpOworICBDb21wbGV4U2NhbGFyIHR3bygyLDApOworCisgIENvbXBsZXhNYXRyaXggQWMgPSBBLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgCisgIENvbXBsZXhNYXRyaXggZXhwX2lBID0gKGltYWdVbml0ICogQWMpLmV4cCgpOworICBDb21wbGV4TWF0cml4IGV4cF9taUEgPSAoLWltYWdVbml0ICogQWMpLmV4cCgpOworICAKKyAgQ29tcGxleE1hdHJpeCBzaW5BYyA9IEEuc2luKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhzaW5BYywgKGV4cF9pQSAtIGV4cF9taUEpIC8gKHR3byppbWFnVW5pdCkpOworICAKKyAgQ29tcGxleE1hdHJpeCBjb3NBYyA9IEEuY29zKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhjb3NBYywgKGV4cF9pQSArIGV4cF9taUEpIC8gMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgdGVzdE1hdHJpeEV4cG9uZW50aWFsKEEpOworICB0ZXN0TWF0cml4TG9nYXJpdGhtKEEpOworICB0ZXN0SHlwZXJib2xpY0Z1bmN0aW9ucyhBKTsKKyAgdGVzdEdvbmlvRnVuY3Rpb25zKEEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvLyBNYXRyaWNlcyB3aXRoIGNsdXN0ZXJlZCBlaWdlbnZhbHVlIGxlYWQgdG8gZGlmZmVyZW50IGNvZGUgcGF0aHMKKyAgLy8gaW4gTWF0cml4RnVuY3Rpb24uaCBhbmQgYXJlIHRodXMgdXNlZnVsIGZvciB0ZXN0aW5nLgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIGNvbnN0IEluZGV4IHNpemUgPSBtLnJvd3MoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgdGVzdE1hdHJpeChNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSkuZXZhbCgpKTsKKyAgICB0ZXN0TWF0cml4KHJhbmRvbU1hdHJpeFdpdGhSZWFsRWl2YWxzPE1hdHJpeFR5cGU+KHNpemUpKTsKKyAgICB0ZXN0TWF0cml4KHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzPE1hdHJpeFR5cGU+OjpydW4oc2l6ZSkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9tYXRyaXhfZnVuY3Rpb24oKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0TWF0cml4VHlwZShNYXRyaXg8ZmxvYXQsMSwxPigpKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RNYXRyaXhUeXBlKE1hdHJpeDNjZigpKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RNYXRyaXhUeXBlKE1hdHJpeFhmKDgsOCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdE1hdHJpeFR5cGUoTWF0cml4MmQoKSkpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0TWF0cml4VHlwZShNYXRyaXg8ZG91YmxlLDUsNSxSb3dNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0TWF0cml4VHlwZShNYXRyaXg0Y2QoKSkpOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0TWF0cml4VHlwZShNYXRyaXhYZCgxMywxMykpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9ucy5oIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorCisvLyBGb3IgY29tcGxleCBtYXRyaWNlcywgYW55IG1hdHJpeCBpcyBmaW5lLgordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IElzQ29tcGxleCA9IE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgcHJvY2Vzc1RyaWFuZ3VsYXJNYXRyaXgKK3sKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmLCBNYXRyaXhUeXBlJiwgY29uc3QgTWF0cml4VHlwZSYpCisgIHsgfQorfTsKKworLy8gRm9yIHJlYWwgbWF0cmljZXMsIG1ha2Ugc3VyZSBub25lIG9mIHRoZSBlaWdlbnZhbHVlcyBhcmUgbmVnYXRpdmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHByb2Nlc3NUcmlhbmd1bGFyTWF0cml4PE1hdHJpeFR5cGUsMD4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG0sIE1hdHJpeFR5cGUmIFQsIGNvbnN0IE1hdHJpeFR5cGUmIFUpCisgIHsKKyAgICBjb25zdCBJbmRleCBzaXplID0gbS5jb2xzKCk7CisKKyAgICBmb3IgKEluZGV4IGk9MDsgaSA8IHNpemU7ICsraSkgeworICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEgfHwgVC5jb2VmZihpKzEsaSkgPT0gMCkKKyAgICAgICAgVC5jb2VmZlJlZihpLGkpID0gc3RkOjphYnMoVC5jb2VmZihpLGkpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKytpOworICAgIH0KKyAgICBtID0gVSAqIFQgKiBVLnRyYW5zcG9zZSgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IElzQ29tcGxleCA9IE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgZ2VuZXJhdGVUZXN0TWF0cml4OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBnZW5lcmF0ZVRlc3RNYXRyaXg8TWF0cml4VHlwZSwwPgoreworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgcmVzdWx0LCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBzaXplKQorICB7CisgICAgcmVzdWx0ID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBzY2h1cihyZXN1bHQpOworICAgIE1hdHJpeFR5cGUgVCA9IHNjaHVyLm1hdHJpeFQoKTsKKyAgICBwcm9jZXNzVHJpYW5ndWxhck1hdHJpeDxNYXRyaXhUeXBlPjo6cnVuKHJlc3VsdCwgVCwgc2NodXIubWF0cml4VSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgZ2VuZXJhdGVUZXN0TWF0cml4PE1hdHJpeFR5cGUsMT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIHJlc3VsdCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSkKKyAgeworICAgIHJlc3VsdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3R5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXIgcmVsZXJyKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIEEsIGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgQikKK3sKKyAgcmV0dXJuIHN0ZDo6c3FydCgoQSAtIEIpLmN3aXNlQWJzMigpLnN1bSgpIC8gKHN0ZDo6bWluKShBLmN3aXNlQWJzMigpLnN1bSgpLCBCLmN3aXNlQWJzMigpLnN1bSgpKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9wb3dlci5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9wb3dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjZmFjZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3Bvd2VyLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1hdHJpeF9mdW5jdGlvbnMuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdDJkUm90YXRpb24oY29uc3QgVCYgdG9sKQoreworICBNYXRyaXg8VCwyLDI+IEEsIEIsIEM7CisgIFQgYW5nbGUsIGMsIHM7CisKKyAgQSA8PCAwLCAxLCAtMSwgMDsKKyAgTWF0cml4UG93ZXI8TWF0cml4PFQsMiwyPiA+IEFwb3coQSk7CisKKyAgZm9yIChpbnQgaT0wOyBpPD0yMDsgKytpKSB7CisgICAgYW5nbGUgPSBzdGQ6OnBvdyhUKDEwKSwgKGktMTApIC8gVCg1LikpOworICAgIGMgPSBzdGQ6OmNvcyhhbmdsZSk7CisgICAgcyA9IHN0ZDo6c2luKGFuZ2xlKTsKKyAgICBCIDw8IGMsIHMsIC1zLCBjOworCisgICAgQyA9IEFwb3coc3RkOjpsZGV4cChhbmdsZSwxKSAvIFQoRUlHRU5fUEkpKTsKKyAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZFJvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBwb3dlcm0gPSAiIDw8IHJlbGVycihDLEIpIDw8ICdcbic7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgdG9sKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uKGNvbnN0IFQmIHRvbCkKK3sKKyAgTWF0cml4PHN0ZDo6Y29tcGxleDxUPiwyLDI+IEEsIEIsIEM7CisgIFQgYW5nbGUsIGNoID0gc3RkOjpjb3NoKChUKTEpOworICBzdGQ6OmNvbXBsZXg8VD4gaXNoKDAsIHN0ZDo6c2luaCgoVCkxKSk7CisKKyAgQSA8PCBjaCwgaXNoLCAtaXNoLCBjaDsKKyAgTWF0cml4UG93ZXI8TWF0cml4PHN0ZDo6Y29tcGxleDxUPiwyLDI+ID4gQXBvdyhBKTsKKworICBmb3IgKGludCBpPTA7IGk8PTIwOyArK2kpIHsKKyAgICBhbmdsZSA9IHN0ZDo6bGRleHAoc3RhdGljX2Nhc3Q8VD4oaS0xMCksIC0xKTsKKyAgICBjaCA9IHN0ZDo6Y29zaChhbmdsZSk7CisgICAgaXNoID0gc3RkOjpjb21wbGV4PFQ+KDAsIHN0ZDo6c2luaChhbmdsZSkpOworICAgIEIgPDwgY2gsIGlzaCwgLWlzaCwgY2g7CisKKyAgICBDID0gQXBvdyhhbmdsZSk7CisgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0MmRIeXBlcmJvbGljUm90YXRpb246IGkgPSAiIDw8IGkgPDwgIiAgIGVycm9yIHBvd2VybSA9ICIgPDwgcmVsZXJyKEMsQikgPDwgJ1xuJzsKKyAgICBWRVJJRlkoQy5pc0FwcHJveChCLCB0b2wpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB0ZXN0M2RSb3RhdGlvbihjb25zdCBUJiB0b2wpCit7CisgIE1hdHJpeDxULDMsMT4gdjsKKyAgVCBhbmdsZTsKKworICBmb3IgKGludCBpPTA7IGk8PTIwOyArK2kpIHsKKyAgICB2ID0gTWF0cml4PFQsMywxPjo6UmFuZG9tKCk7CisgICAgdi5ub3JtYWxpemUoKTsKKyAgICBhbmdsZSA9IHN0ZDo6cG93KFQoMTApLCAoaS0xMCkgLyBUKDUuKSk7CisgICAgVkVSSUZZKEFuZ2xlQXhpczxUPihhbmdsZSwgdikubWF0cml4KCkuaXNBcHByb3goQW5nbGVBeGlzPFQ+KDEsdikubWF0cml4KCkucG93KGFuZ2xlKSwgdG9sKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdEdlbmVyYWwoY29uc3QgTWF0cml4VHlwZSYgbSwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgdG9sKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgTWF0cml4VHlwZSBtMSwgbTIsIG0zLCBtNCwgbTU7CisgIFJlYWxTY2FsYXIgeCwgeTsKKworICBmb3IgKGludCBpPTA7IGkgPCBnX3JlcGVhdDsgKytpKSB7CisgICAgZ2VuZXJhdGVUZXN0TWF0cml4PE1hdHJpeFR5cGU+OjpydW4obTEsIG0ucm93cygpKTsKKyAgICBNYXRyaXhQb3dlcjxNYXRyaXhUeXBlPiBtcG93KG0xKTsKKworICAgIHggPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KCk7CisgICAgeSA9IGludGVybmFsOjpyYW5kb208UmVhbFNjYWxhcj4oKTsKKyAgICBtMiA9IG1wb3coeCk7CisgICAgbTMgPSBtcG93KHkpOworCisgICAgbTQgPSBtcG93KHgreSk7CisgICAgbTUubm9hbGlhcygpID0gbTIgKiBtMzsKKyAgICBWRVJJRlkobTQuaXNBcHByb3gobTUsIHRvbCkpOworCisgICAgbTQgPSBtcG93KHgqeSk7CisgICAgbTUgPSBtMi5wb3coeSk7CisgICAgVkVSSUZZKG00LmlzQXBwcm94KG01LCB0b2wpKTsKKworICAgIG00ID0gKHN0ZDo6YWJzKHgpICogbTEpLnBvdyh5KTsKKyAgICBtNSA9IHN0ZDo6cG93KHN0ZDo6YWJzKHgpLCB5KSAqIG0zOworICAgIFZFUklGWShtNC5pc0FwcHJveChtNSwgdG9sKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdFNpbmd1bGFyKGNvbnN0IE1hdHJpeFR5cGUmIG1fY29uc3QsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIHRvbCkKK3sKKyAgLy8gd2UgbmVlZCB0byBwYXNzIGJ5IHJlZmVyZW5jZSBpbiBvcmRlciB0byBwcmV2ZW50IGVycm9ycyB3aXRoCisgIC8vIE1TVkMgZm9yIGFsaWduZWQgZGF0YSB0eXBlcyAuLi4KKyAgTWF0cml4VHlwZSYgbSA9IGNvbnN0X2Nhc3Q8TWF0cml4VHlwZSY+KG1fY29uc3QpOworCisgIGNvbnN0IGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxJc0NvbXBsZXgsIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsVXBwZXI+LCBjb25zdCBNYXRyaXhUeXBlJj46OnR5cGUgVHJpYW5ndWxhclR5cGU7CisgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwgSXNDb21wbGV4LCBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4sIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiA+Ojp0eXBlIHNjaHVyOworICBNYXRyaXhUeXBlIFQ7CisKKyAgZm9yIChpbnQgaT0wOyBpIDwgZ19yZXBlYXQ7ICsraSkgeworICAgIG0uc2V0UmFuZG9tKCk7CisgICAgbS5jb2woMCkuZmlsbCgwKTsKKworICAgIHNjaHVyLmNvbXB1dGUobSk7CisgICAgVCA9IHNjaHVyLm1hdHJpeFQoKTsKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBVID0gc2NodXIubWF0cml4VSgpOworICAgIHByb2Nlc3NUcmlhbmd1bGFyTWF0cml4PE1hdHJpeFR5cGU+OjpydW4obSwgVCwgVSk7CisgICAgTWF0cml4UG93ZXI8TWF0cml4VHlwZT4gbXBvdyhtKTsKKworICAgIFQgPSBULnNxcnQoKTsKKyAgICBWRVJJRlkobXBvdygwLjVMKS5pc0FwcHJveChVICogKFRyaWFuZ3VsYXJUeXBlKFQpICogVS5hZGpvaW50KCkpLCB0b2wpKTsKKworICAgIFQgPSBULnNxcnQoKTsKKyAgICBWRVJJRlkobXBvdygwLjI1TCkuaXNBcHByb3goVSAqIChUcmlhbmd1bGFyVHlwZShUKSAqIFUuYWRqb2ludCgpKSwgdG9sKSk7CisKKyAgICBUID0gVC5zcXJ0KCk7CisgICAgVkVSSUZZKG1wb3coMC4xMjVMKS5pc0FwcHJveChVICogKFRyaWFuZ3VsYXJUeXBlKFQpICogVS5hZGpvaW50KCkpLCB0b2wpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TG9nVGhlbkV4cChjb25zdCBNYXRyaXhUeXBlJiBtX2NvbnN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiB0b2wpCit7CisgIC8vIHdlIG5lZWQgdG8gcGFzcyBieSByZWZlcmVuY2UgaW4gb3JkZXIgdG8gcHJldmVudCBlcnJvcnMgd2l0aAorICAvLyBNU1ZDIGZvciBhbGlnbmVkIGRhdGEgdHlwZXMgLi4uCisgIE1hdHJpeFR5cGUmIG0gPSBjb25zdF9jYXN0PE1hdHJpeFR5cGUmPihtX2NvbnN0KTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIFNjYWxhciB4OworCisgIGZvciAoaW50IGk9MDsgaSA8IGdfcmVwZWF0OyArK2kpIHsKKyAgICBnZW5lcmF0ZVRlc3RNYXRyaXg8TWF0cml4VHlwZT46OnJ1bihtLCBtLnJvd3MoKSk7CisgICAgeCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIFZFUklGWShtLnBvdyh4KS5pc0FwcHJveCgoeCAqIG0ubG9nKCkpLmV4cCgpLCB0b2wpKTsKKyAgfQorfQorCit0eXBlZGVmIE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPiAgICAgICAgIE1hdHJpeDNkUm93TWFqb3I7Cit0eXBlZGVmIE1hdHJpeDxsb25nIGRvdWJsZSwzLDM+ICAgICAgICAgICAgIE1hdHJpeDNlOwordHlwZWRlZiBNYXRyaXg8bG9uZyBkb3VibGUsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYZTsKKyAKK3ZvaWQgdGVzdF9tYXRyaXhfcG93ZXIoKQoreworICBDQUxMX1NVQlRFU1RfMih0ZXN0MmRSb3RhdGlvbjxkb3VibGU+KDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3QyZFJvdGF0aW9uPGZsb2F0PigyZS01KSk7ICAvLyB3YXMgMWUtNSwgcmVsYXhlZCBmb3IgY2xhbmcgMi44IC8gbGludXggLyB4ODYtNjQKKyAgQ0FMTF9TVUJURVNUXzkodGVzdDJkUm90YXRpb248bG9uZyBkb3VibGU+KDFlLTEzTCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0MmRIeXBlcmJvbGljUm90YXRpb248ZG91YmxlPigxZS0xNCkpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0MmRIeXBlcmJvbGljUm90YXRpb248ZmxvYXQ+KDFlLTUpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uPGxvbmcgZG91YmxlPigxZS0xNEwpKTsKKworICBDQUxMX1NVQlRFU1RfMTAodGVzdDNkUm90YXRpb248ZG91YmxlPigxZS0xMykpOworICBDQUxMX1NVQlRFU1RfMTEodGVzdDNkUm90YXRpb248ZmxvYXQ+KDFlLTUpKTsKKyAgQ0FMTF9TVUJURVNUXzEyKHRlc3QzZFJvdGF0aW9uPGxvbmcgZG91YmxlPigxZS0xM0wpKTsKKworICBDQUxMX1NVQlRFU1RfMih0ZXN0R2VuZXJhbChNYXRyaXgyZCgpLCAgICAgICAgIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF83KHRlc3RHZW5lcmFsKE1hdHJpeDNkUm93TWFqb3IoKSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdEdlbmVyYWwoTWF0cml4NGNkKCksICAgICAgICAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0R2VuZXJhbChNYXRyaXhYZCg4LDgpLCAgICAgIDJlLTEyKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RHZW5lcmFsKE1hdHJpeDJmKCksICAgICAgICAgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0R2VuZXJhbChNYXRyaXgzY2YoKSwgICAgICAgIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzgodGVzdEdlbmVyYWwoTWF0cml4NGYoKSwgICAgICAgICAxZS00KSk7CisgIENBTExfU1VCVEVTVF82KHRlc3RHZW5lcmFsKE1hdHJpeFhmKDIsMiksICAgICAgMWUtMykpOyAvLyBzZWUgYnVnIDYxNAorICBDQUxMX1NVQlRFU1RfOSh0ZXN0R2VuZXJhbChNYXRyaXhYZSg3LDcpLCAgICAgIDFlLTEzTCkpOworICBDQUxMX1NVQlRFU1RfMTAodGVzdEdlbmVyYWwoTWF0cml4M2QoKSwgICAgICAgIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xMSh0ZXN0R2VuZXJhbChNYXRyaXgzZigpLCAgICAgICAgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfMTIodGVzdEdlbmVyYWwoTWF0cml4M2UoKSwgICAgICAgIDFlLTEzTCkpOworCisgIENBTExfU1VCVEVTVF8yKHRlc3RTaW5ndWxhcihNYXRyaXgyZCgpLCAgICAgICAgIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF83KHRlc3RTaW5ndWxhcihNYXRyaXgzZFJvd01ham9yKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RTaW5ndWxhcihNYXRyaXg0Y2QoKSwgICAgICAgIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RTaW5ndWxhcihNYXRyaXhYZCg4LDgpLCAgICAgIDJlLTEyKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RTaW5ndWxhcihNYXRyaXgyZigpLCAgICAgICAgIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdFNpbmd1bGFyKE1hdHJpeDNjZigpLCAgICAgICAgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfOCh0ZXN0U2luZ3VsYXIoTWF0cml4NGYoKSwgICAgICAgICAxZS00KSk7CisgIENBTExfU1VCVEVTVF82KHRlc3RTaW5ndWxhcihNYXRyaXhYZigyLDIpLCAgICAgIDFlLTMpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdFNpbmd1bGFyKE1hdHJpeFhlKDcsNyksICAgICAgMWUtMTNMKSk7CisgIENBTExfU1VCVEVTVF8xMCh0ZXN0U2luZ3VsYXIoTWF0cml4M2QoKSwgICAgICAgIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xMSh0ZXN0U2luZ3VsYXIoTWF0cml4M2YoKSwgICAgICAgIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzEyKHRlc3RTaW5ndWxhcihNYXRyaXgzZSgpLCAgICAgICAgMWUtMTNMKSk7CisKKyAgQ0FMTF9TVUJURVNUXzIodGVzdExvZ1RoZW5FeHAoTWF0cml4MmQoKSwgICAgICAgICAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0TG9nVGhlbkV4cChNYXRyaXgzZFJvd01ham9yKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDRjZCgpLCAgICAgICAgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdExvZ1RoZW5FeHAoTWF0cml4WGQoOCw4KSwgICAgICAyZS0xMikpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgyZigpLCAgICAgICAgIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzUodGVzdExvZ1RoZW5FeHAoTWF0cml4M2NmKCksICAgICAgICAxZS00KSk7CisgIENBTExfU1VCVEVTVF84KHRlc3RMb2dUaGVuRXhwKE1hdHJpeDRmKCksICAgICAgICAgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0TG9nVGhlbkV4cChNYXRyaXhYZigyLDIpLCAgICAgIDFlLTMpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdExvZ1RoZW5FeHAoTWF0cml4WGUoNyw3KSwgICAgICAxZS0xM0wpKTsKKyAgQ0FMTF9TVUJURVNUXzEwKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDNkKCksICAgICAgICAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfMTEodGVzdExvZ1RoZW5FeHAoTWF0cml4M2YoKSwgICAgICAgIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzEyKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDNlKCksICAgICAgICAxZS0xM0wpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3NxdWFyZV9yb290LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3NxdWFyZV9yb290LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU0MWUxCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfc3F1YXJlX3Jvb3QuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWF0cml4X2Z1bmN0aW9ucy5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4U3FydChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBNYXRyaXhUeXBlIEE7CisgIGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlPjo6cnVuKEEsIG0ucm93cygpKTsKKyAgTWF0cml4VHlwZSBzcXJ0QSA9IEEuc3FydCgpOworICBWRVJJRllfSVNfQVBQUk9YKHNxcnRBICogc3FydEEsIEEpOworfQorCit2b2lkIHRlc3RfbWF0cml4X3NxdWFyZV9yb290KCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEodGVzdE1hdHJpeFNxcnQoTWF0cml4M2NmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih0ZXN0TWF0cml4U3FydChNYXRyaXhYY2QoMTIsMTIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzModGVzdE1hdHJpeFNxcnQoTWF0cml4NGYoKSkpOworICAgIENBTExfU1VCVEVTVF80KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPig5LCA5KSkpOworICAgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxmbG9hdCwxLDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSh0ZXN0TWF0cml4U3FydChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwxLDE+KCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9taW5yZXMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9taW5yZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21pbnJlcy5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgR2lhY29tbyBQbyA8Z3BvQHVjbGEuZWR1PgorLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiLi4vLi4vdGVzdC9zcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlU29sdmVycz4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X21pbnJlc19UKCkKK3sKKyAgLy8gSWRlbnRpdHkgcHJlY29uZGl0aW9uZXIKKyAgTUlOUkVTPFNwYXJzZU1hdHJpeDxUPiwgTG93ZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIgICAgPiBtaW5yZXNfY29sbWFqb3JfbG93ZXJfSTsKKyAgTUlOUkVTPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIgICAgPiBtaW5yZXNfY29sbWFqb3JfdXBwZXJfSTsKKworICAvLyBEaWFnb25hbCBwcmVjb25kaXRpb25lcgorICBNSU5SRVM8U3BhcnNlTWF0cml4PFQ+LCBMb3dlciwgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxUPiA+IG1pbnJlc19jb2xtYWpvcl9sb3dlcl9kaWFnOworICBNSU5SRVM8U3BhcnNlTWF0cml4PFQ+LCBVcHBlciwgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxUPiA+IG1pbnJlc19jb2xtYWpvcl91cHBlcl9kaWFnOworICBNSU5SRVM8U3BhcnNlTWF0cml4PFQ+LCBMb3dlcnxVcHBlciwgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxUPiA+IG1pbnJlc19jb2xtYWpvcl91cGxvX2RpYWc7CisgIAorICAvLyBjYWxsIHRlc3RzIGZvciBTUEQgbWF0cml4CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKG1pbnJlc19jb2xtYWpvcl9sb3dlcl9JKSApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhtaW5yZXNfY29sbWFqb3JfdXBwZXJfSSkgKTsKKyAgICAKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobWlucmVzX2NvbG1ham9yX2xvd2VyX2RpYWcpICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhtaW5yZXNfY29sbWFqb3JfdXBwZXJfZGlhZykgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKG1pbnJlc19jb2xtYWpvcl91cGxvX2RpYWcpICApOworICAgIAorICAvLyBUTyBETzogc3ltbWV0cmljIHNlbWktZGVmaW5pdGUgbWF0cml4CisgIC8vIFRPIERPOiBzeW1tZXRyaWMgaW5kZWZpbml0ZSBtYXRyaXgKKworfQorCit2b2lkIHRlc3RfbWlucmVzKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9taW5yZXNfVDxkb3VibGU+KCkpOworLy8gIENBTExfU1VCVEVTVF8yKHRlc3RfbWlucmVzX1Q8c3RkOjpjb21wZXg8ZG91YmxlPiA+KCkpOworCit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9tcHJlYWwuaCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsL21wcmVhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDRmMWYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9tcHJlYWwuaApAQCAtMCwwICsxLDMxMDQgQEAKKy8qDQorICAgIE1QRlIgQysrOiBNdWx0aS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNsYXNzIGZvciBDKysuDQorICAgIEJhc2VkIG9uIE1QRlIgbGlicmFyeTogICAgaHR0cDovL21wZnIub3JnDQorDQorICAgIFByb2plY3QgaG9tZXBhZ2U6ICAgIGh0dHA6Ly93d3cuaG9sb2Jvcm9ka28uY29tL3BhdmVsL21wZnINCisgICAgQ29udGFjdCBlLW1haWw6ICAgICAgcGF2ZWxAaG9sb2Jvcm9ka28uY29tDQorDQorICAgIENvcHlyaWdodCAoYykgMjAwOC0yMDE1IFBhdmVsIEhvbG9ib3JvZGtvDQorDQorICAgIENvbnRyaWJ1dG9yczoNCisgICAgRG1pdHJpeSBHdWJhbm92LCBLb25zdGFudGluIEhvbG9ib3JvZGtvLCBCcmlhbiBHbGFkbWFuLA0KKyAgICBIZWxtdXQgSmFyYXVzY2gsIEZva2tvIEJlZWtob2YsIFVscmljaCBNdXR6ZSwgSGVpbnogdmFuIFNhYW5lbiwNCisgICAgUGVyZSBDb25zdGFucywgUGV0ZXIgdmFuIEhvb2YsIEdhZWwgR3Vlbm5lYmF1ZCwgVHNhaSBDaGlhIENoZW5nLA0KKyAgICBBbGV4ZWkgWnViYW5vdiwgSmF1aGllbiBQaWF0bGlja2ksIFZpY3RvciBCZXJnZXIsIEpvaG4gV2VzdHdvb2QsDQorICAgIFBldHIgQWxla3NhbmRyb3YsIE9yaW9uIFBvcGxhd3NraSwgQ2hhcmxlcyBLYXJuZXksIEFyYXNoIFBhcnRvdywNCisgICAgUm9kbmV5IEphbWVzLCBKb3JnZSBMZWl0YW8uDQorDQorICAgIExpY2Vuc2luZzoNCisgICAgKEEpIE1QRlIgQysrIGlzIHVuZGVyIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuDQorDQorICAgIChCKSBOb24tZnJlZSBsaWNlbnNlcyBtYXkgYWxzbyBiZSBwdXJjaGFzZWQgZnJvbSB0aGUgYXV0aG9yLCBmb3IgdXNlcnMgd2hvDQorICAgICAgICBkbyBub3Qgd2FudCB0aGVpciBwcm9ncmFtcyBwcm90ZWN0ZWQgYnkgdGhlIEdQTC4NCisNCisgICAgICAgIFRoZSBub24tZnJlZSBsaWNlbnNlcyBhcmUgZm9yIHVzZXJzIHRoYXQgd2lzaCB0byB1c2UgTVBGUiBDKysgaW4NCisgICAgICAgIHRoZWlyIHByb2R1Y3RzIGJ1dCBhcmUgdW53aWxsaW5nIHRvIHJlbGVhc2UgdGhlaXIgc29mdHdhcmUNCisgICAgICAgIHVuZGVyIHRoZSBHUEwgKHdoaWNoIHdvdWxkIHJlcXVpcmUgdGhlbSB0byByZWxlYXNlIHNvdXJjZSBjb2RlDQorICAgICAgICBhbmQgYWxsb3cgZnJlZSByZWRpc3RyaWJ1dGlvbikuDQorDQorICAgICAgICBTdWNoIHVzZXJzIGNhbiBwdXJjaGFzZSBhbiB1bmxpbWl0ZWQtdXNlIGxpY2Vuc2UgZnJvbSB0aGUgYXV0aG9yLg0KKyAgICAgICAgQ29udGFjdCB1cyBmb3IgbW9yZSBkZXRhaWxzLg0KKw0KKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGNvcHlyaWdodCBwZXJtaXNzaW9ucyBzdGF0ZW1lbnQ6DQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KKyovDQorDQorI2lmbmRlZiBfX01QUkVBTF9IX18NCisjZGVmaW5lIF9fTVBSRUFMX0hfXw0KKw0KKyNpbmNsdWRlIDxzdHJpbmc+DQorI2luY2x1ZGUgPGlvc3RyZWFtPg0KKyNpbmNsdWRlIDxzc3RyZWFtPg0KKyNpbmNsdWRlIDxzdGRleGNlcHQ+DQorI2luY2x1ZGUgPGNmbG9hdD4NCisjaW5jbHVkZSA8Y21hdGg+DQorI2luY2x1ZGUgPGNzdHJpbmc+DQorI2luY2x1ZGUgPGxpbWl0cz4NCisjaW5jbHVkZSA8Y29tcGxleD4NCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKy8vIE9wdGlvbnMNCisjZGVmaW5lIE1QUkVBTF9IQVZFX01TVkNfREVCVUdWSUVXICAgICAgICAgICAgICAvLyBFbmFibGUgRGVidWdnZXIgVmlzdWFsaXplciBmb3IgIkRlYnVnIiBidWlsZHMgaW4gTVNWQy4NCisjZGVmaW5lIE1QUkVBTF9IQVZFX0RZTkFNSUNfU1REX05VTUVSSUNfTElNSVRTICAvLyBFbmFibGUgZXh0ZW5kZWQgc3RkOjpudW1lcmljX2xpbWl0czxtcGZyOjptcHJlYWw+IHNwZWNpYWxpemF0aW9uLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lYW5pbmcgdGhhdCAiZGlnaXRzIiwgInJvdW5kX3N0eWxlIiBhbmQgc2ltaWxhciBtZW1iZXJzIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgbm90IGNvbnN0YW50cy4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgc3RkOjpudW1lcmljX2xpbWl0czxtcGZyOjptcHJlYWw+IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorDQorLy8gTGlicmFyeSB2ZXJzaW9uDQorI2RlZmluZSBNUFJFQUxfVkVSU0lPTl9NQUpPUiAzDQorI2RlZmluZSBNUFJFQUxfVkVSU0lPTl9NSU5PUiA2DQorI2RlZmluZSBNUFJFQUxfVkVSU0lPTl9QQVRDSExFVkVMIDINCisjZGVmaW5lIE1QUkVBTF9WRVJTSU9OX1NUUklORyAiMy42LjIiDQorDQorLy8gRGV0ZWN0IGNvbXBpbGVyIHVzaW5nIHNpZ25hdHVyZXMgZnJvbSBodHRwOi8vcHJlZGVmLnNvdXJjZWZvcmdlLm5ldC8NCisjaWYgZGVmaW5lZChfX0dOVUNfXykNCisgICAgI2RlZmluZSBJc0luZih4KSAoaXNpbmYpKHgpICAgICAgICAgICAgICAgICAvLyBHTlUgQysrL0ludGVsIElDQyBjb21waWxlciBvbiBMaW51eA0KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBWaXN1YWwgQysrDQorICAgICNkZWZpbmUgSXNJbmYoeCkgKCFfZmluaXRlKHgpKQ0KKyNlbHNlDQorICAgICNkZWZpbmUgSXNJbmYoeCkgKHN0ZDo6aXNpbmYpKHgpICAgICAgICAgICAgICAvLyBHTlUgQy9DKysgKGFuZC9vciBvdGhlciBjb21waWxlcnMpLCBqdXN0IGhvcGUgZm9yIEM5OSBjb25mb3JtYW5jZQ0KKyNlbmRpZg0KKw0KKy8vIEEgQ2xhbmcgZmVhdHVyZSBleHRlbnNpb24gdG8gZGV0ZXJtaW5lIGNvbXBpbGVyIGZlYXR1cmVzLg0KKyNpZm5kZWYgX19oYXNfZmVhdHVyZQ0KKyAgICAjZGVmaW5lIF9faGFzX2ZlYXR1cmUoeCkgMA0KKyNlbmRpZg0KKw0KKy8vIERldGVjdCBzdXBwb3J0IGZvciByLXZhbHVlIHJlZmVyZW5jZXMgKG1vdmUgc2VtYW50aWMpLiBCb3Jyb3dlZCBmcm9tIEVpZ2VuLg0KKyNpZiAoX19oYXNfZmVhdHVyZShjeHhfcnZhbHVlX3JlZmVyZW5jZXMpIHx8IFwNCisgICAgICAgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCB8fCBcDQorICAgICAgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE2MDApKQ0KKw0KKyAgICAjZGVmaW5lIE1QUkVBTF9IQVZFX01PVkVfU1VQUE9SVA0KKw0KKyAgICAvLyBVc2UgZmllbGRzIGluIG1wZnJfdCBzdHJ1Y3R1cmUgdG8gY2hlY2sgaWYgaXQgd2FzIGluaXRpYWxpemVkIC8gc2V0IGR1bW15IGluaXRpYWxpemF0aW9uDQorICAgICNkZWZpbmUgbXBmcl9pc19pbml0aWFsaXplZCh4KSAgICAgICgwICE9ICh4KS0+X21wZnJfZCkNCisgICAgI2RlZmluZSBtcGZyX3NldF91bmluaXRpYWxpemVkKHgpICAgKCh4KS0+X21wZnJfZCA9IDAgKQ0KKyNlbmRpZg0KKw0KKy8vIERldGVjdCBzdXBwb3J0IGZvciBleHBsaWNpdCBjb252ZXJ0ZXJzLg0KKyNpZiAoX19oYXNfZmVhdHVyZShjeHhfZXhwbGljaXRfY29udmVyc2lvbnMpIHx8IFwNCisgICAgICAgKGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pICYmIF9fR05VQ19NSU5PUl9fID49IDUpIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgfHwgXA0KKyAgICAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTgwMCkpDQorDQorICAgICNkZWZpbmUgTVBSRUFMX0hBVkVfRVhQTElDSVRfQ09OVkVSVEVSUw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTVBGUl9VU0VfSU5UTUFYX1QgICAvLyBFbmFibGUgNjQtYml0IGludGVnZXIgdHlwZXMgLSBzaG91bGQgYmUgZGVmaW5lZCBiZWZvcmUgbXBmci5oDQorDQorI2lmIGRlZmluZWQoTVBSRUFMX0hBVkVfTVNWQ19ERUJVR1ZJRVcpICYmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0RFQlVHKQ0KKyAgICAjZGVmaW5lIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFICAgICBEZWJ1Z1ZpZXcgPSB0b1N0cmluZygpOw0KKyAgICAjZGVmaW5lIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19EQVRBICAgICBzdGQ6OnN0cmluZyBEZWJ1Z1ZpZXc7DQorI2Vsc2UNCisgICAgI2RlZmluZSBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERQ0KKyAgICAjZGVmaW5lIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19EQVRBDQorI2VuZGlmDQorDQorI2luY2x1ZGUgPG1wZnIuaD4NCisNCisjaWYgKE1QRlJfVkVSU0lPTiA8IE1QRlJfVkVSU0lPTl9OVU0oMywwLDApKQ0KKyAgICAjaW5jbHVkZSA8Y3N0ZGxpYj4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgcmFuZG9tKCkNCisjZW5kaWYNCisNCisvLyBMZXNzIGltcG9ydGFudCBvcHRpb25zDQorI2RlZmluZSBNUFJFQUxfRE9VQkxFX0JJVFNfT1ZFUkZMT1cgLTEgICAgICAgICAgLy8gVHJpZ2dlcnMgb3ZlcmZsb3cgZXhjZXB0aW9uIGR1cmluZyBjb252ZXJzaW9uIHRvIGRvdWJsZSBpZiBtcHJlYWwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgZml0IGluIE1QUkVBTF9ET1VCTEVfQklUU19PVkVSRkxPVyBiaXRzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSAtMSBkaXNhYmxlcyBvdmVyZmxvdyBjaGVja3MgKGRlZmF1bHQpDQorDQorLy8gRmFzdCByZXBsYWNlbWVudCBmb3IgbXBmcl9zZXRfemVybyh4LCArMSk6DQorLy8gKGEpIHVzZXMgbG93LWxldmVsIGRhdGEgbWVtYmVycywgbWlnaHQgbm90IGJlIGNvbXBhdGlibGUgd2l0aCBuZXcgdmVyc2lvbnMgb2YgTVBGUg0KKy8vIChiKSBzaWduIGlzIG5vdCBzZXQsIGFkZCAoeCktPl9tcGZyX3NpZ24gPSAxOw0KKyNkZWZpbmUgbXBmcl9zZXRfemVyb19mYXN0KHgpICAoKHgpLT5fbXBmcl9leHAgPSBfX01QRlJfRVhQX1pFUk8pDQorDQorI2lmIGRlZmluZWQoX19HTlVDX18pDQorICAjZGVmaW5lIE1QUkVBTF9QRVJNSVNTSVZFX0VYUFIgX19leHRlbnNpb25fXw0KKyNlbHNlDQorICAjZGVmaW5lIE1QUkVBTF9QRVJNSVNTSVZFX0VYUFINCisjZW5kaWYNCisNCituYW1lc3BhY2UgbXBmciB7DQorDQorY2xhc3MgbXByZWFsIHsNCitwcml2YXRlOg0KKyAgICBtcGZyX3QgbXA7DQorDQorcHVibGljOg0KKw0KKyAgICAvLyBHZXQgZGVmYXVsdCByb3VuZGluZyBtb2RlICYgcHJlY2lzaW9uDQorICAgIGlubGluZSBzdGF0aWMgbXBfcm5kX3QgICBnZXRfZGVmYXVsdF9ybmQoKSAgICB7ICAgIHJldHVybiAobXBfcm5kX3QpKG1wZnJfZ2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSgpKTsgICAgICAgfQ0KKyAgICBpbmxpbmUgc3RhdGljIG1wX3ByZWNfdCAgZ2V0X2RlZmF1bHRfcHJlYygpICAgeyAgICByZXR1cm4gbXBmcl9nZXRfZGVmYXVsdF9wcmVjKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgLy8gQ29uc3RydWN0b3JzICYmIHR5cGUgY29udmVyc2lvbnMNCisgICAgbXByZWFsKCk7DQorICAgIG1wcmVhbChjb25zdCBtcHJlYWwmIHUpOw0KKyAgICBtcHJlYWwoY29uc3QgbXBmX3QgdSk7DQorICAgIG1wcmVhbChjb25zdCBtcHpfdCB1LCAgICAgICAgICAgICAgICAgIG1wX3ByZWNfdCBwcmVjID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IG1vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgbXByZWFsKGNvbnN0IG1wcV90IHUsICAgICAgICAgICAgICAgICAgbXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBtcHJlYWwoY29uc3QgZG91YmxlIHUsICAgICAgICAgICAgICAgICBtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpLCBtcF9ybmRfdCBtb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIG1wcmVhbChjb25zdCBsb25nIGRvdWJsZSB1LCAgICAgICAgICAgIG1wX3ByZWNfdCBwcmVjID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IG1vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgbXByZWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdSwgbXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBtcHJlYWwoY29uc3QgbG9uZyBsb25nIGludCB1LCAgICAgICAgICBtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpLCBtcF9ybmRfdCBtb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIG1wcmVhbChjb25zdCB1bnNpZ25lZCBsb25nIGludCB1LCAgICAgIG1wX3ByZWNfdCBwcmVjID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IG1vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgbXByZWFsKGNvbnN0IHVuc2lnbmVkIGludCB1LCAgICAgICAgICAgbXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBtcHJlYWwoY29uc3QgbG9uZyBpbnQgdSwgICAgICAgICAgICAgICBtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpLCBtcF9ybmRfdCBtb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIG1wcmVhbChjb25zdCBpbnQgdSwgICAgICAgICAgICAgICAgICAgIG1wX3ByZWNfdCBwcmVjID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IG1vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgLy8gQ29uc3RydWN0IG1wcmVhbCBmcm9tIG1wZnJfdCBzdHJ1Y3R1cmUuDQorICAgIC8vIHNoYXJlZCA9IHRydWUgYWxsb3dzIHRvIGF2b2lkIGRlZXAgY29weSwgc28gdGhhdCBtcHJlYWwgYW5kICd1JyBzaGFyZSB0aGUgc2FtZSBkYXRhICYgcG9pbnRlcnMuDQorICAgIG1wcmVhbChjb25zdCBtcGZyX3QgIHUsIGJvb2wgc2hhcmVkID0gZmFsc2UpOw0KKw0KKyAgICBtcHJlYWwoY29uc3QgY2hhciogcywgICAgICAgICAgICAgbXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgaW50IGJhc2UgPSAxMCwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBtcHJlYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsICAgICAgbXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgaW50IGJhc2UgPSAxMCwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKyAgICB+bXByZWFsKCk7DQorDQorI2lmZGVmIE1QUkVBTF9IQVZFX01PVkVfU1VQUE9SVA0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShtcHJlYWwmJiB2KTsNCisgICAgbXByZWFsKG1wcmVhbCYmIHUpOw0KKyNlbmRpZg0KKw0KKyAgICAvLyBPcGVyYXRpb25zDQorICAgIC8vID0NCisgICAgLy8gKywgLSwgKiwgLywgKyssIC0tLCA8PCwgPj4NCisgICAgLy8gKj0sICs9LCAtPSwgLz0sDQorICAgIC8vIDwsID4sID09LCA8PSwgPj0NCisNCisgICAgLy8gPQ0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCBtcGZfdCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgbXB6X3Qgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IG1wcV90IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCBsb25nIGRvdWJsZSB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgZG91YmxlIHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgbG9uZyBsb25nIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgdW5zaWduZWQgaW50IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCBsb25nIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgaW50IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPShjb25zdCBjaGFyKiBzKTsNCisgICAgbXByZWFsJiBvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcmIHMpOw0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcmVhbF90PiBtcHJlYWwmIG9wZXJhdG9yPSAoY29uc3Qgc3RkOjpjb21wbGV4PHJlYWxfdD4mIHopOw0KKw0KKyAgICAvLyArDQorICAgIG1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgbXBmX3Qgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBtcHpfdCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IG1wcV90IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgbG9uZyBkb3VibGUgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBkb3VibGUgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IHVuc2lnbmVkIGludCB1KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgaW50IHUpOw0KKw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgbG9uZyBsb25nIGludCAgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgbG9uZyBsb25nIGludCAgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbG9uZyBsb25nIGludCAgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IqPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgbG9uZyBsb25nIGludCAgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpOw0KKw0KKyAgICBjb25zdCBtcHJlYWwgb3BlcmF0b3IrKCkgY29uc3Q7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IrKyAoKTsNCisgICAgY29uc3QgbXByZWFsICBvcGVyYXRvcisrIChpbnQpOw0KKw0KKyAgICAvLyAtDQorICAgIG1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgbXB6X3Qgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCBtcHFfdCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IGxvbmcgZG91YmxlIHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgZG91YmxlIHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCBpbnQgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCBsb25nIGludCB1KTsNCisgICAgbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IGludCB1KTsNCisgICAgY29uc3QgbXByZWFsIG9wZXJhdG9yLSgpIGNvbnN0Ow0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCB1bnNpZ25lZCBpbnQgYiwgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBsb25nIGludCBiLCAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBpbnQgYiwgICAgICAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBkb3VibGUgYiwgICAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLS0gKCk7DQorICAgIGNvbnN0IG1wcmVhbCAgb3BlcmF0b3ItLSAoaW50KTsNCisNCisgICAgLy8gKg0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbXByZWFsJiB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IG1wel90IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbXBxX3Qgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IqPShjb25zdCBsb25nIGRvdWJsZSB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IGRvdWJsZSB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgaW50IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbG9uZyBpbnQgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IqPShjb25zdCBpbnQgdik7DQorDQorICAgIC8vIC8NCisgICAgbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IG1wcmVhbCYgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBtcHpfdCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IG1wcV90IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgbG9uZyBkb3VibGUgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBkb3VibGUgdik7DQorICAgIG1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IHVuc2lnbmVkIGludCB2KTsNCisgICAgbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IGxvbmcgaW50IHYpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgaW50IHYpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCB1bnNpZ25lZCBpbnQgYiwgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBsb25nIGludCBiLCAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBpbnQgYiwgICAgICAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBkb3VibGUgYiwgICAgICAgICAgICBjb25zdCBtcHJlYWwmIGEpOw0KKw0KKyAgICAvLzw8PSBGYXN0IE11bHRpcGxpY2F0aW9uIGJ5IDJedQ0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPDw9KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPDw9KGNvbnN0IHVuc2lnbmVkIGludCB1KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcjw8PShjb25zdCBsb25nIGludCB1KTsNCisgICAgbXByZWFsJiBvcGVyYXRvcjw8PShjb25zdCBpbnQgdSk7DQorDQorICAgIC8vPj49IEZhc3QgRGl2aXNpb24gYnkgMl51DQorICAgIG1wcmVhbCYgb3BlcmF0b3I+Pj0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdSk7DQorICAgIG1wcmVhbCYgb3BlcmF0b3I+Pj0oY29uc3QgdW5zaWduZWQgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPj49KGNvbnN0IGxvbmcgaW50IHUpOw0KKyAgICBtcHJlYWwmIG9wZXJhdG9yPj49KGNvbnN0IGludCB1KTsNCisNCisgICAgLy8gVHlwZSBDb252ZXJzaW9uIG9wZXJhdG9ycw0KKyAgICBib29sICAgICAgICAgICAgICAgdG9Cb29sICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICkgICAgY29uc3Q7DQorICAgIGxvbmcgICAgICAgICAgICAgICB0b0xvbmcgICAgICAobXBfcm5kX3QgbW9kZSA9IEdNUF9STkRaKSAgICBjb25zdDsNCisgICAgdW5zaWduZWQgbG9uZyAgICAgIHRvVUxvbmcgICAgIChtcF9ybmRfdCBtb2RlID0gR01QX1JORFopICAgIGNvbnN0Ow0KKyAgICBsb25nIGxvbmcgICAgICAgICAgdG9MTG9uZyAgICAgKG1wX3JuZF90IG1vZGUgPSBHTVBfUk5EWikgICAgY29uc3Q7DQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b1VMTG9uZyAgICAobXBfcm5kX3QgbW9kZSA9IEdNUF9STkRaKSAgICBjb25zdDsNCisgICAgZmxvYXQgICAgICAgICAgICAgIHRvRmxvYXQgICAgIChtcF9ybmRfdCBtb2RlID0gR01QX1JORE4pICAgIGNvbnN0Ow0KKyAgICBkb3VibGUgICAgICAgICAgICAgdG9Eb3VibGUgICAgKG1wX3JuZF90IG1vZGUgPSBHTVBfUk5ETikgICAgY29uc3Q7DQorICAgIGxvbmcgZG91YmxlICAgICAgICB0b0xEb3VibGUgICAobXBfcm5kX3QgbW9kZSA9IEdNUF9STkROKSAgICBjb25zdDsNCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfRVhQTElDSVRfQ09OVkVSVEVSUykNCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCAgICAgICAgICAgICAgICgpIGNvbnN0IHsgcmV0dXJuIHRvQm9vbCgpOyAgICAgICAgICAgICAgICAgfQ0KKyAgICBleHBsaWNpdCBvcGVyYXRvciBpbnQgICAgICAgICAgICAgICAgKCkgY29uc3QgeyByZXR1cm4gaW50KHRvTG9uZygpKTsgICAgICAgICAgICB9DQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGxvbmcgICAgICAgICAgICAgICAoKSBjb25zdCB7IHJldHVybiB0b0xvbmcoKTsgICAgICAgICAgICAgICAgIH0NCisgICAgZXhwbGljaXQgb3BlcmF0b3IgbG9uZyBsb25nICAgICAgICAgICgpIGNvbnN0IHsgcmV0dXJuIHRvTExvbmcoKTsgICAgICAgICAgICAgICAgfQ0KKyAgICBleHBsaWNpdCBvcGVyYXRvciB1bnNpZ25lZCAgICAgICAgICAgKCkgY29uc3QgeyByZXR1cm4gdW5zaWduZWQodG9VTG9uZygpKTsgICAgICB9DQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIHVuc2lnbmVkIGxvbmcgICAgICAoKSBjb25zdCB7IHJldHVybiB0b1VMb25nKCk7ICAgICAgICAgICAgICAgIH0NCisgICAgZXhwbGljaXQgb3BlcmF0b3IgdW5zaWduZWQgbG9uZyBsb25nICgpIGNvbnN0IHsgcmV0dXJuIHRvVUxMb25nKCk7ICAgICAgICAgICAgICAgfQ0KKyAgICBleHBsaWNpdCBvcGVyYXRvciBmbG9hdCAgICAgICAgICAgICAgKCkgY29uc3QgeyByZXR1cm4gdG9GbG9hdCgpOyAgICAgICAgICAgICAgICB9DQorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGRvdWJsZSAgICAgICAgICAgICAoKSBjb25zdCB7IHJldHVybiB0b0RvdWJsZSgpOyAgICAgICAgICAgICAgIH0NCisgICAgZXhwbGljaXQgb3BlcmF0b3IgbG9uZyBkb3VibGUgICAgICAgICgpIGNvbnN0IHsgcmV0dXJuIHRvTERvdWJsZSgpOyAgICAgICAgICAgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICAvLyBHZXQgcmF3IHBvaW50ZXJzIHNvIHRoYXQgbXByZWFsIGNhbiBiZSBkaXJlY3RseSB1c2VkIGluIHJhdyBtcGZyXyogZnVuY3Rpb25zDQorICAgIDo6bXBmcl9wdHIgICAgbXBmcl9wdHIoKTsNCisgICAgOjptcGZyX3NyY3B0ciBtcGZyX3B0cigpICAgIGNvbnN0Ow0KKyAgICA6Om1wZnJfc3JjcHRyIG1wZnJfc3JjcHRyKCkgY29uc3Q7DQorDQorICAgIC8vIENvbnZlcnQgbXByZWFsIHRvIHN0cmluZyB3aXRoIG4gc2lnbmlmaWNhbnQgZGlnaXRzIGluIGJhc2UgYg0KKyAgICAvLyBuID0gLTEgLT4gY29udmVydCB3aXRoIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBkaWdpdHMNCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IG4gPSAtMSwgaW50IGIgPSAxMCwgbXBfcm5kX3QgbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIGNvbnN0Ow0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZm9ybWF0KSBjb25zdDsNCisjZW5kaWYNCisNCisgICAgc3RkOjpvc3RyZWFtJiBvdXRwdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7DQorDQorICAgIC8vIE1hdGggRnVuY3Rpb25zDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgc3FyIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHNxcnQoY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNicnQoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcm9vdChjb25zdCBtcHJlYWwmIHYsIHVuc2lnbmVkIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBwb3cgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcG93IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wel90IGIsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBwb3cgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHBvdyAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcG93IChjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBwb3cgKGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBmYWJzKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFicyhjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBkaW0oY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgbXVsXzJ1aShjb25zdCBtcHJlYWwmIHYsIHVuc2lnbmVkIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgbXVsXzJzaShjb25zdCBtcHJlYWwmIHYsIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgZGl2XzJ1aShjb25zdCBtcHJlYWwmIHYsIHVuc2lnbmVkIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgZGl2XzJzaShjb25zdCBtcHJlYWwmIHYsIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGludCBjbXBhYnMoY29uc3QgbXByZWFsJiBhLGNvbnN0IG1wcmVhbCYgYik7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG9nICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG9nMiAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG9nYiAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG9nMTAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZXhwICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZXhwMiAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZXhwMTAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG9nMXAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZXhwbTEoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgY29zKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHNpbihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCB0YW4oY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgc2VjKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNzYyhjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBjb3QoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBpbnQgc2luX2NvcyhtcHJlYWwmIHMsIG1wcmVhbCYgYywgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYWNvcyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFzaW4gIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBhdGFuICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYXRhbjIgKGNvbnN0IG1wcmVhbCYgeSwgY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYWNvdCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFzZWMgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBhY3NjICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgY29zaCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHNpbmggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCB0YW5oICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgc2VjaCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNzY2ggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBjb3RoICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYWNvc2ggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFzaW5oIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBhdGFuaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYWNvdGggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFzZWNoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBhY3NjaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgaHlwb3QgKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZmFjX3VpICh1bnNpZ25lZCBsb25nIGludCB2LCAgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBlaW50ICAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGdhbW1hICAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCB0Z2FtbWEgICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbG5nYW1tYSAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGxnYW1tYSAgIChjb25zdCBtcHJlYWwmIHYsIGludCAqc2lnbnAsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCB6ZXRhICAgICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZXJmICAgICAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGVyZmMgICAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBiZXNzZWxqMCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYmVzc2VsajEgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbGpuIChsb25nIG4sIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbHkwIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBiZXNzZWx5MSAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgYmVzc2VseW4gKGxvbmcgbiwgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZm1hICAgICAgKGNvbnN0IG1wcmVhbCYgdjEsIGNvbnN0IG1wcmVhbCYgdjIsIGNvbnN0IG1wcmVhbCYgdjMsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBmbXMgICAgICAoY29uc3QgbXByZWFsJiB2MSwgY29uc3QgbXByZWFsJiB2MiwgY29uc3QgbXByZWFsJiB2MywgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGFnbSAgICAgIChjb25zdCBtcHJlYWwmIHYxLCBjb25zdCBtcHJlYWwmIHYyLCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgc3VtICAgICAgKGNvbnN0IG1wcmVhbCB0YWJbXSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50JiBzdGF0dXMsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGludCBzZ24oY29uc3QgbXByZWFsJiB2KTsgLy8gcmV0dXJucyAtMSBvciArMQ0KKw0KKy8vIE1QRlIgMi40LjAgU3BlY2lmaWNzDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorICAgIGZyaWVuZCBpbnQgICAgICAgICAgc2luaF9jb3NoICAgKG1wcmVhbCYgcywgbXByZWFsJiBjLCBjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBsaTIgICAgICAgICAoY29uc3QgbXByZWFsJiB2LCAgICAgICAgICAgICAgICAgICAgICAgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGZtb2QgICAgICAgIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgICAgICBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcmVjX3NxcnQgICAgKGNvbnN0IG1wcmVhbCYgdiwgICAgICAgICAgICAgICAgICAgICAgIG1wX3JuZF90IHJuZF9tb2RlKTsNCisNCisgICAgLy8gTUFUTEFCJ3Mgc2VtYW50aWMgZXF1aXZhbGVudHMNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCByZW0gKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSk7IC8vIFJlbWFpbmRlciBhZnRlciBkaXZpc2lvbg0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG1vZCAoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlKTsgLy8gTW9kdWx1cyBhZnRlciBkaXZpc2lvbg0KKyNlbmRpZg0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMywwLDApKQ0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGRpZ2FtbWEgKGNvbnN0IG1wcmVhbCYgdiwgICAgICAgIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBhaSAgICAgIChjb25zdCBtcHJlYWwmIHYsICAgICAgICBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgdXJhbmRvbSAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSwgbXBfcm5kX3Qgcm5kX21vZGUpOyAgICAgLy8gdXNlIGdtcF9yYW5kaW5pdF9kZWZhdWx0KCkgdG8gaW5pdCBzdGF0ZSwgZ21wX3JhbmRjbGVhcigpIHRvIGNsZWFyDQorI2VuZGlmDQorDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDEsMCkpDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZ3JhbmRvbSAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSwgbXBfcm5kX3Qgcm5kX21vZGUpOyAgICAgLy8gdXNlIGdtcF9yYW5kaW5pdF9kZWZhdWx0KCkgdG8gaW5pdCBzdGF0ZSwgZ21wX3JhbmRjbGVhcigpIHRvIGNsZWFyDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZ3JhbmRvbSAodW5zaWduZWQgaW50IHNlZWQpOw0KKyNlbmRpZg0KKw0KKyAgICAvLyBVbmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGluIFswLDFdIHVzaW5nDQorICAgIC8vIE1lcnNlbm5lLVR3aXN0ZXIgYWxnb3JpdGhtIGJ5IGRlZmF1bHQuDQorICAgIC8vIFVzZSBwYXJhbWV0ZXIgdG8gc2V0dXAgc2VlZCwgZS5nLjogcmFuZG9tKCh1bnNpZ25lZCl0aW1lKE5VTEwpKQ0KKyAgICAvLyBDaGVjayB1cmFuZG9tKCkgZm9yIG1vcmUgcHJlY2lzZSBjb250cm9sLg0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHJhbmRvbSh1bnNpZ25lZCBpbnQgc2VlZCk7DQorDQorICAgIC8vIFNwbGl0cyBtcHJlYWwgdmFsdWUgaW50byBmcmFjdGlvbmFsIGFuZCBpbnRlZ2VyIHBhcnRzLg0KKyAgICAvLyBSZXR1cm5zIGZyYWN0aW9uYWwgcGFydCBhbmQgc3RvcmVzIGludGVnZXIgcGFydCBpbiBuLg0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIG1vZGYoY29uc3QgbXByZWFsJiB2LCBtcHJlYWwmIG4pOw0KKw0KKyAgICAvLyBDb25zdGFudHMNCisgICAgLy8gZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgbXBmcl9mcmVlX2NhY2hlKCkgZm9yIGV2ZXJ5IHRocmVhZCB3aGVyZSB5b3UgYXJlIHVzaW5nIGNvbnN0LWZ1bmN0aW9ucw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNvbnN0X2xvZzIgICAgICAobXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBjb25zdF9waSAgICAgICAgKG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgY29uc3RfZXVsZXIgICAgIChtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNvbnN0X2NhdGFsYW4gICAobXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisNCisgICAgLy8gcmV0dXJucyAraW5mIGlmZiBzaWduPj0wIG90aGVyd2lzZSAtaW5mDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgY29uc3RfaW5maW5pdHkoaW50IHNpZ24sIG1wX3ByZWNfdCBwcmVjKTsNCisNCisgICAgLy8gT3V0cHV0LyBJbnB1dA0KKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IG1wcmVhbCYgdik7DQorICAgIGZyaWVuZCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpcywgbXByZWFsJiB2KTsNCisNCisgICAgLy8gSW50ZWdlciBSZWxhdGVkIEZ1bmN0aW9ucw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHJpbnQgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGNlaWwgKGNvbnN0IG1wcmVhbCYgdik7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZmxvb3IoY29uc3QgbXByZWFsJiB2KTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCByb3VuZChjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHRydW5jKGNvbnN0IG1wcmVhbCYgdik7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcmludF9jZWlsICAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHJpbnRfZmxvb3IgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50X3JvdW5kICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgcmludF90cnVuYyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGZyYWMgICAgICAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCByZW1haW5kZXIgICAoICAgICAgICAgY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlKTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCByZW1xdW8gICAgICAobG9uZyogcSwgY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlKTsNCisNCisgICAgLy8gTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBuZXh0dG93YXJkIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSk7DQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgbmV4dGFib3ZlICAoY29uc3QgbXByZWFsJiB4KTsNCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCBuZXh0YmVsb3cgIChjb25zdCBtcHJlYWwmIHgpOw0KKw0KKyAgICAvLyB1c2UgZ21wX3JhbmRpbml0X2RlZmF1bHQoKSB0byBpbml0IHN0YXRlLCBnbXBfcmFuZGNsZWFyKCkgdG8gY2xlYXINCisgICAgZnJpZW5kIGNvbnN0IG1wcmVhbCB1cmFuZG9tYiAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSk7DQorDQorLy8gTVBGUiA8IDIuNC4yIFNwZWNpZmljcw0KKyNpZiAoTVBGUl9WRVJTSU9OIDw9IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDIpKQ0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHJhbmRvbTIgKG1wX3NpemVfdCBzaXplLCBtcF9leHBfdCBleHApOw0KKyNlbmRpZg0KKw0KKyAgICAvLyBJbnN0YW5jZSBDaGVja2Vycw0KKyAgICBmcmllbmQgYm9vbCAoaXNuYW4pICAgIChjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBmcmllbmQgYm9vbCAoaXNpbmYpICAgIChjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBmcmllbmQgYm9vbCAoaXNmaW5pdGUpIChjb25zdCBtcHJlYWwmIHYpOw0KKw0KKyAgICBmcmllbmQgYm9vbCBpc251bSAgICAoY29uc3QgbXByZWFsJiB2KTsNCisgICAgZnJpZW5kIGJvb2wgaXN6ZXJvICAgKGNvbnN0IG1wcmVhbCYgdik7DQorICAgIGZyaWVuZCBib29sIGlzaW50ICAgIChjb25zdCBtcHJlYWwmIHYpOw0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMywwLDApKQ0KKyAgICBmcmllbmQgYm9vbCBpc3JlZ3VsYXIoY29uc3QgbXByZWFsJiB2KTsNCisjZW5kaWYNCisNCisgICAgLy8gU2V0L0dldCBpbnN0YW5jZSBwcm9wZXJ0aWVzDQorICAgIGlubGluZSBtcF9wcmVjX3QgICAgZ2V0X3ByZWMoKSBjb25zdDsNCisgICAgaW5saW5lIHZvaWQgICAgICAgICBzZXRfcHJlYyhtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUgPSBnZXRfZGVmYXVsdF9ybmQoKSk7ICAgIC8vIENoYW5nZSBwcmVjaXNpb24gd2l0aCByb3VuZGluZyBtb2RlDQorDQorICAgIC8vIEFsaWFzZXMgZm9yIGdldF9wcmVjKCksIHNldF9wcmVjKCkgLSBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzdGQ6OmNvbXBsZXg8bXByZWFsPiBpbnRlcmZhY2UNCisgICAgaW5saW5lIG1wcmVhbCYgICAgICBzZXRQcmVjaXNpb24oaW50IFByZWNpc2lvbiwgbXBfcm5kX3QgUm91bmRpbmdNb2RlID0gZ2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBpbmxpbmUgaW50ICAgICAgICAgIGdldFByZWNpc2lvbigpIGNvbnN0Ow0KKw0KKyAgICAvLyBTZXQgbXByZWFsIHRvICsvLSBpbmYsIE5hTiwgKy8tMA0KKyAgICBtcHJlYWwmICAgICAgICBzZXRJbmYgIChpbnQgU2lnbiA9ICsxKTsNCisgICAgbXByZWFsJiAgICAgICAgc2V0TmFuICAoKTsNCisgICAgbXByZWFsJiAgICAgICAgc2V0WmVybyAoaW50IFNpZ24gPSArMSk7DQorICAgIG1wcmVhbCYgICAgICAgIHNldFNpZ24gKGludCBTaWduLCBtcF9ybmRfdCBSb3VuZGluZ01vZGUgPSBnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorICAgIC8vRXhwb25lbnQNCisgICAgbXBfZXhwX3QgZ2V0X2V4cCgpOw0KKyAgICBpbnQgc2V0X2V4cChtcF9leHBfdCBlKTsNCisgICAgaW50IGNoZWNrX3JhbmdlICAoaW50IHQsIG1wX3JuZF90IHJuZF9tb2RlID0gZ2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBpbnQgc3Vibm9ybWFsaXplIChpbnQgdCwgbXBfcm5kX3Qgcm5kX21vZGUgPSBnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorICAgIC8vIEluZXhhY3QgY29udmVyc2lvbiBmcm9tIGZsb2F0DQorICAgIGlubGluZSBib29sIGZpdHNfaW5fYml0cyhkb3VibGUgeCwgaW50IG4pOw0KKw0KKyAgICAvLyBTZXQvR2V0IGdsb2JhbCBwcm9wZXJ0aWVzDQorICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgc2V0X2RlZmF1bHRfcHJlYyhtcF9wcmVjX3QgcHJlYyk7DQorICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgc2V0X2RlZmF1bHRfcm5kKG1wX3JuZF90IHJuZF9tb2RlKTsNCisNCisgICAgc3RhdGljIG1wX2V4cF90ICBnZXRfZW1pbiAodm9pZCk7DQorICAgIHN0YXRpYyBtcF9leHBfdCAgZ2V0X2VtYXggKHZvaWQpOw0KKyAgICBzdGF0aWMgbXBfZXhwX3QgIGdldF9lbWluX21pbiAodm9pZCk7DQorICAgIHN0YXRpYyBtcF9leHBfdCAgZ2V0X2VtaW5fbWF4ICh2b2lkKTsNCisgICAgc3RhdGljIG1wX2V4cF90ICBnZXRfZW1heF9taW4gKHZvaWQpOw0KKyAgICBzdGF0aWMgbXBfZXhwX3QgIGdldF9lbWF4X21heCAodm9pZCk7DQorICAgIHN0YXRpYyBpbnQgICAgICAgc2V0X2VtaW4gKG1wX2V4cF90IGV4cCk7DQorICAgIHN0YXRpYyBpbnQgICAgICAgc2V0X2VtYXggKG1wX2V4cF90IGV4cCk7DQorDQorICAgIC8vIEVmZmljaWVudCBzd2FwcGluZyBvZiB0d28gbXByZWFsIHZhbHVlcyAtIG5lZWRlZCBmb3Igc3RkIGFsZ29yaXRobXMNCisgICAgZnJpZW5kIHZvaWQgc3dhcChtcHJlYWwmIHgsIG1wcmVhbCYgeSk7DQorDQorICAgIGZyaWVuZCBjb25zdCBtcHJlYWwgZm1heChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIGZtaW4oY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlKTsNCisNCitwcml2YXRlOg0KKyAgICAvLyBIdW1hbiBmcmllbmRseSBEZWJ1ZyBQcmV2aWV3IGluIFZpc3VhbCBTdHVkaW8uDQorICAgIC8vIFB1dCBvbmUgb2YgdGhlc2UgbGluZXM6DQorICAgIC8vDQorICAgIC8vIG1wZnI6Om1wcmVhbD08RGVidWdWaWV3PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2hvdyB2YWx1ZSBvbmx5DQorICAgIC8vIG1wZnI6Om1wcmVhbD08RGVidWdWaWV3PiwgPG1wWzBdLl9tcGZyX3ByZWMsdT5iaXRzICAgIDsgU2hvdyB2YWx1ZSAmIHByZWNpc2lvbg0KKyAgICAvLw0KKyAgICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mDQorICAgIC8vIFtWaXN1YWwgU3R1ZGlvIEluc3RhbGxhdGlvbiBGb2xkZXJdXENvbW1vbjdcUGFja2FnZXNcRGVidWdnZXJcYXV0b2V4cC5kYXQNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0RBVEENCisNCisgICAgLy8gIlNtYXJ0IiByZXNvdXJjZXMgZGVhbGxvY2F0aW9uLiBDaGVja3MgaWYgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgYmVmb3JlIGRlbGV0aW9uLg0KKyAgICB2b2lkIGNsZWFyKDo6bXBmcl9wdHIpOw0KK307DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBFeGNlcHRpb25zDQorY2xhc3MgY29udmVyc2lvbl9vdmVyZmxvdyA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7DQorcHVibGljOg0KKyAgICBzdGQ6OnN0cmluZyB3aHkoKSB7IHJldHVybiAiaW5leGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXRpbmcgcG9pbnQiOyB9DQorfTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENvbnN0cnVjdG9ycyAmIGNvbnZlcnRlcnMNCisvLyBEZWZhdWx0IGNvbnN0cnVjdG9yOiBjcmVhdGVzIG1wIG51bWJlciBhbmQgaW5pdGlhbGl6ZXMgaXQgdG8gMC4NCitpbmxpbmUgbXByZWFsOjptcHJlYWwoKQ0KK3sNCisgICAgbXBmcl9pbml0MihtcGZyX3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7DQorICAgIG1wZnJfc2V0X3plcm9fZmFzdChtcGZyX3B0cigpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcHJlYWw6Om1wcmVhbChjb25zdCBtcHJlYWwmIHUpDQorew0KKyAgICBtcGZyX2luaXQyKG1wZnJfcHRyKCksbXBmcl9nZXRfcHJlYyh1Lm1wZnJfc3JjcHRyKCkpKTsNCisgICAgbXBmcl9zZXQgIChtcGZyX3B0cigpLHUubXBmcl9zcmNwdHIoKSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KKyNpZmRlZiBNUFJFQUxfSEFWRV9NT1ZFX1NVUFBPUlQNCitpbmxpbmUgbXByZWFsOjptcHJlYWwobXByZWFsJiYgb3RoZXIpDQorew0KKyAgICBtcGZyX3NldF91bmluaXRpYWxpemVkKG1wZnJfcHRyKCkpOyAgICAgLy8gbWFrZSBzdXJlICJvdGhlciIgaG9sZHMgbm8gcG9pbnRlciB0byBhY3R1YWwgZGF0YQ0KKyAgICBtcGZyX3N3YXAobXBmcl9wdHIoKSwgb3RoZXIubXBmcl9wdHIoKSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShtcHJlYWwmJiBvdGhlcikNCit7DQorICAgIG1wZnJfc3dhcChtcGZyX3B0cigpLCBvdGhlci5tcGZyX3B0cigpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorI2VuZGlmDQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IG1wZnJfdCAgdSwgYm9vbCBzaGFyZWQpDQorew0KKyAgICBpZihzaGFyZWQpDQorICAgIHsNCisgICAgICAgIHN0ZDo6bWVtY3B5KG1wZnJfcHRyKCksIHUsIHNpemVvZihtcGZyX3QpKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIG1wZnJfaW5pdDIobXBmcl9wdHIoKSwgbXBmcl9nZXRfcHJlYyh1KSk7DQorICAgICAgICBtcGZyX3NldCAgKG1wZnJfcHRyKCksIHUsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICB9DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsOjptcHJlYWwoY29uc3QgbXBmX3QgdSkNCit7DQorICAgIG1wZnJfaW5pdDIobXBmcl9wdHIoKSwobXBfcHJlY190KSBtcGZfZ2V0X3ByZWModSkpOyAvLyAoZ21wOiBtcF9iaXRjbnRfdCkgdW5zaWduZWQgbG9uZyAtPiBsb25nIChtcGZyOiBtcF9wcmVjX3QpDQorICAgIG1wZnJfc2V0X2YobXBmcl9wdHIoKSx1LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IG1wel90IHUsIG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisgICAgbXBmcl9pbml0MihtcGZyX3B0cigpLCBwcmVjKTsNCisgICAgbXBmcl9zZXRfeihtcGZyX3B0cigpLCB1LCBtb2RlKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcHJlYWw6Om1wcmVhbChjb25zdCBtcHFfdCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7DQorICAgIG1wZnJfaW5pdDIobXBmcl9wdHIoKSwgcHJlYyk7DQorICAgIG1wZnJfc2V0X3EobXBmcl9wdHIoKSwgdSwgbW9kZSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsOjptcHJlYWwoY29uc3QgZG91YmxlIHUsIG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisgICAgIG1wZnJfaW5pdDIobXBmcl9wdHIoKSwgcHJlYyk7DQorDQorI2lmIChNUFJFQUxfRE9VQkxFX0JJVFNfT1ZFUkZMT1cgPiAtMSkNCisgIGlmKGZpdHNfaW5fYml0cyh1LCBNUFJFQUxfRE9VQkxFX0JJVFNfT1ZFUkZMT1cpKQ0KKyAgew0KKyAgICBtcGZyX3NldF9kKG1wZnJfcHRyKCksIHUsIG1vZGUpOw0KKyAgfWVsc2UNCisgICAgdGhyb3cgY29udmVyc2lvbl9vdmVyZmxvdygpOw0KKyNlbHNlDQorICBtcGZyX3NldF9kKG1wZnJfcHRyKCksIHUsIG1vZGUpOw0KKyNlbmRpZg0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IGxvbmcgZG91YmxlIHUsIG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisgICAgbXBmcl9pbml0MiAobXBmcl9wdHIoKSwgcHJlYyk7DQorICAgIG1wZnJfc2V0X2xkKG1wZnJfcHRyKCksIHUsIG1vZGUpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQorew0KKyAgICBtcGZyX2luaXQyIChtcGZyX3B0cigpLCBwcmVjKTsNCisgICAgbXBmcl9zZXRfdWoobXBmcl9wdHIoKSwgdSwgbW9kZSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsOjptcHJlYWwoY29uc3QgbG9uZyBsb25nIGludCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7DQorICAgIG1wZnJfaW5pdDIgKG1wZnJfcHRyKCksIHByZWMpOw0KKyAgICBtcGZyX3NldF9zaihtcGZyX3B0cigpLCB1LCBtb2RlKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcHJlYWw6Om1wcmVhbChjb25zdCB1bnNpZ25lZCBsb25nIGludCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7DQorICAgIG1wZnJfaW5pdDIgKG1wZnJfcHRyKCksIHByZWMpOw0KKyAgICBtcGZyX3NldF91aShtcGZyX3B0cigpLCB1LCBtb2RlKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcHJlYWw6Om1wcmVhbChjb25zdCB1bnNpZ25lZCBpbnQgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQorew0KKyAgICBtcGZyX2luaXQyIChtcGZyX3B0cigpLCBwcmVjKTsNCisgICAgbXBmcl9zZXRfdWkobXBmcl9wdHIoKSwgdSwgbW9kZSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsOjptcHJlYWwoY29uc3QgbG9uZyBpbnQgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQorew0KKyAgICBtcGZyX2luaXQyIChtcGZyX3B0cigpLCBwcmVjKTsNCisgICAgbXBmcl9zZXRfc2kobXBmcl9wdHIoKSwgdSwgbW9kZSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCitpbmxpbmUgbXByZWFsOjptcHJlYWwoY29uc3QgaW50IHUsIG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisgICAgbXBmcl9pbml0MiAobXBmcl9wdHIoKSwgcHJlYyk7DQorICAgIG1wZnJfc2V0X3NpKG1wZnJfcHRyKCksIHUsIG1vZGUpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IGNoYXIqIHMsIG1wX3ByZWNfdCBwcmVjLCBpbnQgYmFzZSwgbXBfcm5kX3QgbW9kZSkNCit7DQorICAgIG1wZnJfaW5pdDIgIChtcGZyX3B0cigpLCBwcmVjKTsNCisgICAgbXBmcl9zZXRfc3RyKG1wZnJfcHRyKCksIHMsIGJhc2UsIG1vZGUpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6bXByZWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBtcF9wcmVjX3QgcHJlYywgaW50IGJhc2UsIG1wX3JuZF90IG1vZGUpDQorew0KKyAgICBtcGZyX2luaXQyICAobXBmcl9wdHIoKSwgcHJlYyk7DQorICAgIG1wZnJfc2V0X3N0cihtcGZyX3B0cigpLCBzLmNfc3RyKCksIGJhc2UsIG1vZGUpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQoraW5saW5lIHZvaWQgbXByZWFsOjpjbGVhcig6Om1wZnJfcHRyIHgpDQorew0KKyNpZmRlZiBNUFJFQUxfSEFWRV9NT1ZFX1NVUFBPUlQNCisgICAgaWYobXBmcl9pc19pbml0aWFsaXplZCh4KSkNCisjZW5kaWYNCisgICAgbXBmcl9jbGVhcih4KTsNCit9DQorDQoraW5saW5lIG1wcmVhbDo6fm1wcmVhbCgpDQorew0KKyAgICBjbGVhcihtcGZyX3B0cigpKTsNCit9DQorDQorLy8gaW50ZXJuYWwgbmFtZXNwYWNlIG5lZWRlZCBmb3IgdGVtcGxhdGUgbWFnaWMNCituYW1lc3BhY2UgaW50ZXJuYWx7DQorDQorICAgIC8vIFVzZSBTRklOQUUgdG8gcmVzdHJpY3QgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluc3RhbnRpYXRpb24gb25seSBmb3IgbnVtZXJpYyB0eXBlcw0KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3Igc21vb3RoIGludGVncmF0aW9uIHdpdGggbGlicmFyaWVzIGJhc2VkIG9uIGV4cHJlc3Npb24gdGVtcGxhdGVzLCBsaWtlIEVpZ2VuLg0KKyAgICAvLyBUT0RPOiBEbyB0aGUgc2FtZSBmb3IgYm9vbGVhbiBvcGVyYXRvcnMuDQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmd1bWVudFR5cGU+IHN0cnVjdCByZXN1bHRfdHlwZSB7fTsNCisNCisgICAgdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPG1wcmVhbD4gICAgICAgICAgICAgIHt0eXBlZGVmIG1wcmVhbCB0eXBlO307DQorICAgIHRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxtcHpfdD4gICAgICAgICAgICAgICB7dHlwZWRlZiBtcHJlYWwgdHlwZTt9Ow0KKyAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzdWx0X3R5cGU8bXBxX3Q+ICAgICAgICAgICAgICAge3R5cGVkZWYgbXByZWFsIHR5cGU7fTsNCisgICAgdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPGxvbmcgZG91YmxlPiAgICAgICAgIHt0eXBlZGVmIG1wcmVhbCB0eXBlO307DQorICAgIHRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxkb3VibGU+ICAgICAgICAgICAgICB7dHlwZWRlZiBtcHJlYWwgdHlwZTt9Ow0KKyAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzdWx0X3R5cGU8dW5zaWduZWQgbG9uZyBpbnQ+ICAge3R5cGVkZWYgbXByZWFsIHR5cGU7fTsNCisgICAgdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPHVuc2lnbmVkIGludD4gICAgICAgIHt0eXBlZGVmIG1wcmVhbCB0eXBlO307DQorICAgIHRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxsb25nIGludD4gICAgICAgICAgICB7dHlwZWRlZiBtcHJlYWwgdHlwZTt9Ow0KKyAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzdWx0X3R5cGU8aW50PiAgICAgICAgICAgICAgICAge3R5cGVkZWYgbXByZWFsIHR5cGU7fTsNCisgICAgdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPGxvbmcgbG9uZz4gICAgICAgICAgIHt0eXBlZGVmIG1wcmVhbCB0eXBlO307DQorICAgIHRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTx1bnNpZ25lZCBsb25nIGxvbmc+ICB7dHlwZWRlZiBtcHJlYWwgdHlwZTt9Ow0KK30NCisNCisvLyArIEFkZGl0aW9uDQordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4NCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF90eXBlPFJocz46OnR5cGUNCisgICAgb3BlcmF0b3IrKGNvbnN0IG1wcmVhbCYgbGhzLCBjb25zdCBSaHMmIHJocyl7IHJldHVybiBtcHJlYWwobGhzKSArPSByaHM7ICAgIH0NCisNCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPg0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8TGhzPjo6dHlwZQ0KKyAgICBvcGVyYXRvcisoY29uc3QgTGhzJiBsaHMsIGNvbnN0IG1wcmVhbCYgcmhzKXsgcmV0dXJuIG1wcmVhbChyaHMpICs9IGxoczsgICAgfQ0KKw0KKy8vIC0gU3VidHJhY3Rpb24NCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPg0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8UmhzPjo6dHlwZQ0KKyAgICBvcGVyYXRvci0oY29uc3QgbXByZWFsJiBsaHMsIGNvbnN0IFJocyYgcmhzKXsgcmV0dXJuIG1wcmVhbChsaHMpIC09IHJoczsgICAgfQ0KKw0KK3RlbXBsYXRlIDx0eXBlbmFtZSBMaHM+DQoraW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfdHlwZTxMaHM+Ojp0eXBlDQorICAgIG9wZXJhdG9yLShjb25zdCBMaHMmIGxocywgY29uc3QgbXByZWFsJiByaHMpeyByZXR1cm4gbXByZWFsKGxocykgLT0gcmhzOyAgICB9DQorDQorLy8gKiBNdWx0aXBsaWNhdGlvbg0KK3RlbXBsYXRlIDx0eXBlbmFtZSBSaHM+DQoraW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfdHlwZTxSaHM+Ojp0eXBlDQorICAgIG9wZXJhdG9yKihjb25zdCBtcHJlYWwmIGxocywgY29uc3QgUmhzJiByaHMpeyByZXR1cm4gbXByZWFsKGxocykgKj0gcmhzOyAgICB9DQorDQordGVtcGxhdGUgPHR5cGVuYW1lIExocz4NCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF90eXBlPExocz46OnR5cGUNCisgICAgb3BlcmF0b3IqKGNvbnN0IExocyYgbGhzLCBjb25zdCBtcHJlYWwmIHJocyl7IHJldHVybiBtcHJlYWwocmhzKSAqPSBsaHM7ICAgIH0NCisNCisvLyAvIERpdmlzaW9uDQordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4NCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF90eXBlPFJocz46OnR5cGUNCisgICAgb3BlcmF0b3IvKGNvbnN0IG1wcmVhbCYgbGhzLCBjb25zdCBSaHMmIHJocyl7IHJldHVybiBtcHJlYWwobGhzKSAvPSByaHM7ICAgIH0NCisNCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPg0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8TGhzPjo6dHlwZQ0KKyAgICBvcGVyYXRvci8oY29uc3QgTGhzJiBsaHMsIGNvbnN0IG1wcmVhbCYgcmhzKXsgcmV0dXJuIG1wcmVhbChsaHMpIC89IHJoczsgICAgfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gc3FydA0KK2NvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IHVuc2lnbmVkIGludCB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IGxvbmcgaW50IHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHNxcnQoY29uc3QgaW50IHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHNxcnQoY29uc3QgbG9uZyBkb3VibGUgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgc3FydChjb25zdCBkb3VibGUgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisvLyBhYnMNCitpbmxpbmUgY29uc3QgbXByZWFsIGFicyhjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIHBvdw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGRvdWJsZSBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG11bF8ydWkoY29uc3QgbXByZWFsJiB2LCB1bnNpZ25lZCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KK2lubGluZSBjb25zdCBtcHJlYWwgbXVsXzJzaShjb25zdCBtcHJlYWwmIHYsIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQoraW5saW5lIGNvbnN0IG1wcmVhbCBkaXZfMnVpKGNvbnN0IG1wcmVhbCYgdiwgdW5zaWduZWQgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCitpbmxpbmUgY29uc3QgbXByZWFsIGRpdl8yc2koY29uc3QgbXByZWFsJiB2LCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRXN0aW1hdGUgbWFjaGluZSBlcHNpbG9uIGZvciB0aGUgZ2l2ZW4gcHJlY2lzaW9uDQorLy8gUmV0dXJucyBzbWFsbGVzdCBlcHMgc3VjaCB0aGF0IDEuMCArIGVwcyAhPSAxLjANCitpbmxpbmUgbXByZWFsIG1hY2hpbmVfZXBzaWxvbihtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKTsNCisNCisvLyBSZXR1cm5zIHNtYWxsZXN0IGVwcyBzdWNoIHRoYXQgeCArIGVwcyAhPSB4IChyZWxhdGl2ZSBtYWNoaW5lIGVwc2lsb24pDQoraW5saW5lIG1wcmVhbCBtYWNoaW5lX2Vwc2lsb24oY29uc3QgbXByZWFsJiB4KTsNCisNCisvLyBHaXZlcyBtYXggJiBtaW4gdmFsdWVzIGZvciB0aGUgcmVxdWlyZWQgcHJlY2lzaW9uLA0KKy8vIG1pbnZhbCBpcyAnc2FmZScgbWVhbmluZyAxIC8gbWludmFsIGRvZXMgbm90IG92ZXJmbG93DQorLy8gbWF4dmFsIGlzICdzYWZlJyBtZWFuaW5nIDEgLyBtYXh2YWwgZG9lcyBub3QgdW5kZXJmbG93DQoraW5saW5lIG1wcmVhbCBtaW52YWwobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7DQoraW5saW5lIG1wcmVhbCBtYXh2YWwobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7DQorDQorLy8gJ0RpcnR5JyBlcXVhbGl0eSBjaGVjayAxOiB8YS1ifCA8IG1pbnt8YXwsfGJ8fSAqIGVwcw0KK2lubGluZSBib29sIGlzRXF1YWxGdXp6eShjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiwgY29uc3QgbXByZWFsJiBlcHMpOw0KKw0KKy8vICdEaXJ0eScgZXF1YWxpdHkgY2hlY2sgMjogfGEtYnwgPCBtaW57fGF8LHxifH0gKiBlcHMoIG1pbnt8YXwsfGJ8fSApDQoraW5saW5lIGJvb2wgaXNFcXVhbEZ1enp5KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKTsNCisNCisvLyAnQml0d2lzZScgZXF1YWxpdHkgY2hlY2sNCisvLyAgbWF4VWxwcyAtIGEgYW5kIGIgY2FuIGJlIGFwYXJ0IGJ5IG1heFVscHMgYmluYXJ5IG51bWJlcnMuDQoraW5saW5lIGJvb2wgaXNFcXVhbFVscHMoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIGludCBtYXhVbHBzKTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENvbnZlcnQgcHJlY2lzaW9uIGluICdiaXRzJyB0byBkZWNpbWFsIGRpZ2l0cyBhbmQgdmljZSB2ZXJzYS4NCisvLyAgICBiaXRzICAgPSBjZWlsKGRpZ2l0cypsb2dbMl0oMTApKQ0KKy8vICAgIGRpZ2l0cyA9IGZsb29yKGJpdHMqbG9nWzEwXSgyKSkNCisNCitpbmxpbmUgbXBfcHJlY190IGRpZ2l0czJiaXRzKGludCBkKTsNCitpbmxpbmUgaW50ICAgICAgIGJpdHMyZGlnaXRzKG1wX3ByZWNfdCBiKTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIG1pbiwgbWF4DQorY29uc3QgbXByZWFsIChtYXgpKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5KTsNCitjb25zdCBtcHJlYWwgKG1pbikoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHkpOw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gSW1wbGVtZW50YXRpb24NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gT3BlcmF0b3JzIC0gQXNzaWdubWVudA0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IG1wcmVhbCYgdikNCit7DQorICAgIGlmICh0aGlzICE9ICZ2KQ0KKyAgICB7DQorICAgIG1wX3ByZWNfdCB0cCA9IG1wZnJfZ2V0X3ByZWMoICBtcGZyX3NyY3B0cigpKTsNCisgICAgbXBfcHJlY190IHZwID0gbXBmcl9nZXRfcHJlYyh2Lm1wZnJfc3JjcHRyKCkpOw0KKw0KKyAgICBpZih0cCAhPSB2cCl7DQorICAgICAgY2xlYXIobXBmcl9wdHIoKSk7DQorICAgICAgbXBmcl9pbml0MihtcGZyX3B0cigpLCB2cCk7DQorICAgIH0NCisNCisgICAgICAgIG1wZnJfc2V0KG1wZnJfcHRyKCksIHYubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorICAgICAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgfQ0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IG1wZl90IHYpDQorew0KKyAgICBtcGZyX3NldF9mKG1wZnJfcHRyKCksIHYsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShjb25zdCBtcHpfdCB2KQ0KK3sNCisgICAgbXBmcl9zZXRfeihtcGZyX3B0cigpLCB2LCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgbXBxX3QgdikNCit7DQorICAgIG1wZnJfc2V0X3EobXBmcl9wdHIoKSwgdiwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IGxvbmcgZG91YmxlIHYpDQorew0KKyAgICBtcGZyX3NldF9sZChtcGZyX3B0cigpLCB2LCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgZG91YmxlIHYpDQorew0KKyNpZiAoTVBSRUFMX0RPVUJMRV9CSVRTX09WRVJGTE9XID4gLTEpDQorICBpZihmaXRzX2luX2JpdHModiwgTVBSRUFMX0RPVUJMRV9CSVRTX09WRVJGTE9XKSkNCisgIHsNCisgICAgbXBmcl9zZXRfZChtcGZyX3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICB9ZWxzZQ0KKyAgICB0aHJvdyBjb252ZXJzaW9uX292ZXJmbG93KCk7DQorI2Vsc2UNCisgIG1wZnJfc2V0X2QobXBmcl9wdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyNlbmRpZg0KKw0KKyAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikNCit7DQorICAgIG1wZnJfc2V0X3VpKG1wZnJfcHRyKCksIHYsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShjb25zdCB1bnNpZ25lZCBpbnQgdikNCit7DQorICAgIG1wZnJfc2V0X3VpKG1wZnJfcHRyKCksIHYsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHYpDQorew0KKyAgICBtcGZyX3NldF91aihtcGZyX3B0cigpLCB2LCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgbG9uZyBsb25nIGludCB2KQ0KK3sNCisgICAgbXBmcl9zZXRfc2oobXBmcl9wdHIoKSwgdiwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IGxvbmcgaW50IHYpDQorew0KKyAgICBtcGZyX3NldF9zaShtcGZyX3B0cigpLCB2LCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgaW50IHYpDQorew0KKyAgICBtcGZyX3NldF9zaShtcGZyX3B0cigpLCB2LCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgY2hhciogcykNCit7DQorICAgIC8vIFVzZSBvdGhlciBjb252ZXJ0ZXJzIGZvciBtb3JlIHByZWNpc2UgY29udHJvbCBvbiBiYXNlICYgcHJlY2lzaW9uICYgcm91bmRpbmc6DQorICAgIC8vDQorICAgIC8vICAgICAgICBtcHJlYWwoY29uc3QgY2hhciogcywgICAgICAgIG1wX3ByZWNfdCBwcmVjLCBpbnQgYmFzZSwgbXBfcm5kX3QgbW9kZSkNCisgICAgLy8gICAgICAgIG1wcmVhbChjb25zdCBzdGQ6OnN0cmluZyYgcyxtcF9wcmVjX3QgcHJlYywgaW50IGJhc2UsIG1wX3JuZF90IG1vZGUpDQorICAgIC8vDQorICAgIC8vIEhlcmUgd2UgYXNzdW1lIGJhc2UgPSAxMCBhbmQgd2UgdXNlIHByZWNpc2lvbiBvZiB0YXJnZXQgdmFyaWFibGUuDQorDQorICAgIG1wZnJfdCB0Ow0KKw0KKyAgICBtcGZyX2luaXQyKHQsIG1wZnJfZ2V0X3ByZWMobXBmcl9zcmNwdHIoKSkpOw0KKw0KKyAgICBpZigwID09IG1wZnJfc2V0X3N0cih0LCBzLCAxMCwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkpDQorICAgIHsNCisgICAgICAgIG1wZnJfc2V0KG1wZnJfcHRyKCksIHQsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICAgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIH0NCisNCisgICAgY2xlYXIodCk7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcmIHMpDQorew0KKyAgICAvLyBVc2Ugb3RoZXIgY29udmVydGVycyBmb3IgbW9yZSBwcmVjaXNlIGNvbnRyb2wgb24gYmFzZSAmIHByZWNpc2lvbiAmIHJvdW5kaW5nOg0KKyAgICAvLw0KKyAgICAvLyAgICAgICAgbXByZWFsKGNvbnN0IGNoYXIqIHMsICAgICAgICBtcF9wcmVjX3QgcHJlYywgaW50IGJhc2UsIG1wX3JuZF90IG1vZGUpDQorICAgIC8vICAgICAgICBtcHJlYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsbXBfcHJlY190IHByZWMsIGludCBiYXNlLCBtcF9ybmRfdCBtb2RlKQ0KKyAgICAvLw0KKyAgICAvLyBIZXJlIHdlIGFzc3VtZSBiYXNlID0gMTAgYW5kIHdlIHVzZSBwcmVjaXNpb24gb2YgdGFyZ2V0IHZhcmlhYmxlLg0KKw0KKyAgICBtcGZyX3QgdDsNCisNCisgICAgbXBmcl9pbml0Mih0LCBtcGZyX2dldF9wcmVjKG1wZnJfc3JjcHRyKCkpKTsNCisNCisgICAgaWYoMCA9PSBtcGZyX3NldF9zdHIodCwgcy5jX3N0cigpLCAxMCwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkpDQorICAgIHsNCisgICAgICAgIG1wZnJfc2V0KG1wZnJfcHRyKCksIHQsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICAgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIH0NCisNCisgICAgY2xlYXIodCk7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQordGVtcGxhdGUgPHR5cGVuYW1lIHJlYWxfdD4NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPSAoY29uc3Qgc3RkOjpjb21wbGV4PHJlYWxfdD4mIHopDQorew0KKyAgICByZXR1cm4gKnRoaXMgPSB6LnJlYWwoKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyArIEFkZGl0aW9uDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9KGNvbnN0IG1wcmVhbCYgdikNCit7DQorICAgIG1wZnJfYWRkKG1wZnJfcHRyKCksIG1wZnJfc3JjcHRyKCksIHYubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCBtcGZfdCB1KQ0KK3sNCisgICAgKnRoaXMgKz0gbXByZWFsKHUpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgbXB6X3QgdSkNCit7DQorICAgIG1wZnJfYWRkX3oobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHUsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCBtcHFfdCB1KQ0KK3sNCisgICAgbXBmcl9hZGRfcShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9IChjb25zdCBsb25nIGRvdWJsZSB1KQ0KK3sNCisgICAgKnRoaXMgKz0gbXByZWFsKHUpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0gKGNvbnN0IGRvdWJsZSB1KQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisgICAgbXBmcl9hZGRfZChtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisjZWxzZQ0KKyAgICAqdGhpcyArPSBtcHJlYWwodSk7DQorI2VuZGlmDQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KQ0KK3sNCisgICAgbXBmcl9hZGRfdWkobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHUsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBpbnQgdSkNCit7DQorICAgIG1wZnJfYWRkX3VpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx1LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgbG9uZyBpbnQgdSkNCit7DQorICAgIG1wZnJfYWRkX3NpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx1LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgaW50IHUpDQorew0KKyAgICBtcGZyX2FkZF9zaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9KGNvbnN0IGxvbmcgbG9uZyBpbnQgdSkgICAgICAgICB7ICAgICp0aGlzICs9IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsgICAgfQ0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpeyAgICAqdGhpcyArPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7ICAgIH0NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgbG9uZyBsb25nIGludCAgdSkgICAgICAgIHsgICAgKnRoaXMgLT0gbXByZWFsKHUpOyBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsgcmV0dXJuICp0aGlzOyAgICB9DQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdSl7ICAgICp0aGlzIC09IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsgICAgfQ0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCBsb25nIGxvbmcgaW50ICB1KSAgICAgICAgeyAgICAqdGhpcyAqPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7ICAgIH0NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGludCB1KXsgICAgKnRoaXMgKj0gbXByZWFsKHUpOyBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsgcmV0dXJuICp0aGlzOyAgICB9DQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGxvbmcgbG9uZyBpbnQgIHUpICAgICAgICB7ICAgICp0aGlzIC89IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsgICAgfQ0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHUpeyAgICAqdGhpcyAvPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7ICAgIH0NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG1wcmVhbDo6b3BlcmF0b3IrKCljb25zdCAgICB7ICAgIHJldHVybiBtcHJlYWwoKnRoaXMpOyB9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcisoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIpDQorew0KKyAgbXByZWFsIGMoMCwgKHN0ZDo6bWF4KShtcGZyX2dldF9wcmVjKGEubXBmcl9wdHIoKSksIG1wZnJfZ2V0X3ByZWMoYi5tcGZyX3B0cigpKSkpOw0KKyAgbXBmcl9hZGQoYy5tcGZyX3B0cigpLCBhLm1wZnJfc3JjcHRyKCksIGIubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICByZXR1cm4gYzsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcisrKCkNCit7DQorICAgIHJldHVybiAqdGhpcyArPSAxOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG1wcmVhbDo6b3BlcmF0b3IrKyAoaW50KQ0KK3sNCisgICAgbXByZWFsIHgoKnRoaXMpOw0KKyAgICAqdGhpcyArPSAxOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci0tKCkNCit7DQorICAgIHJldHVybiAqdGhpcyAtPSAxOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG1wcmVhbDo6b3BlcmF0b3ItLSAoaW50KQ0KK3sNCisgICAgbXByZWFsIHgoKnRoaXMpOw0KKyAgICAqdGhpcyAtPSAxOw0KKyAgICByZXR1cm4geDsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyAtIFN1YnRyYWN0aW9uDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IG1wcmVhbCYgdikNCit7DQorICAgIG1wZnJfc3ViKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2Lm1wZnJfc3JjcHRyKCksbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItPShjb25zdCBtcHpfdCB2KQ0KK3sNCisgICAgbXBmcl9zdWJfeihtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IG1wcV90IHYpDQorew0KKyAgICBtcGZyX3N1Yl9xKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgbG9uZyBkb3VibGUgdikNCit7DQorICAgICp0aGlzIC09IG1wcmVhbCh2KTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IGRvdWJsZSB2KQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisgICAgbXBmcl9zdWJfZChtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisjZWxzZQ0KKyAgICAqdGhpcyAtPSBtcHJlYWwodik7DQorI2VuZGlmDQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB2KQ0KK3sNCisgICAgbXBmcl9zdWJfdWkobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCBpbnQgdikNCit7DQorICAgIG1wZnJfc3ViX3VpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgbG9uZyBpbnQgdikNCit7DQorICAgIG1wZnJfc3ViX3NpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgaW50IHYpDQorew0KKyAgICBtcGZyX3N1Yl9zaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBtcHJlYWw6Om9wZXJhdG9yLSgpY29uc3QNCit7DQorICAgIG1wcmVhbCB1KCp0aGlzKTsNCisgICAgbXBmcl9uZWcodS5tcGZyX3B0cigpLHUubXBmcl9zcmNwdHIoKSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgcmV0dXJuIHU7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKQ0KK3sNCisgIG1wcmVhbCBjKDAsIChzdGQ6Om1heCkobXBmcl9nZXRfcHJlYyhhLm1wZnJfcHRyKCkpLCBtcGZyX2dldF9wcmVjKGIubXBmcl9wdHIoKSkpKTsNCisgIG1wZnJfc3ViKGMubXBmcl9wdHIoKSwgYS5tcGZyX3NyY3B0cigpLCBiLm1wZnJfc3JjcHRyKCksIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgcmV0dXJuIGM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IGRvdWJsZSAgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisgICAgbXByZWFsIHgoMCwgbXBmcl9nZXRfcHJlYyhhLm1wZnJfcHRyKCkpKTsNCisgICAgbXBmcl9kX3N1Yih4Lm1wZnJfcHRyKCksIGIsIGEubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiB4Ow0KKyNlbHNlDQorICAgIG1wcmVhbCB4KGIsIG1wZnJfZ2V0X3ByZWMoYS5tcGZyX3B0cigpKSk7DQorICAgIHggLT0gYTsNCisgICAgcmV0dXJuIHg7DQorI2VuZGlmDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSkNCit7DQorICAgIG1wcmVhbCB4KDAsIG1wZnJfZ2V0X3ByZWMoYS5tcGZyX3B0cigpKSk7DQorICAgIG1wZnJfdWlfc3ViKHgubXBmcl9wdHIoKSwgYiwgYS5tcGZyX3NyY3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IHVuc2lnbmVkIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyAgICBtcHJlYWwgeCgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9wdHIoKSkpOw0KKyAgICBtcGZyX3VpX3N1Yih4Lm1wZnJfcHRyKCksIGIsIGEubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyAgICBtcHJlYWwgeCgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9wdHIoKSkpOw0KKyAgICBtcGZyX3NpX3N1Yih4Lm1wZnJfcHRyKCksIGIsIGEubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisgICAgbXByZWFsIHgoMCwgbXBmcl9nZXRfcHJlYyhhLm1wZnJfcHRyKCkpKTsNCisgICAgbXBmcl9zaV9zdWIoeC5tcGZyX3B0cigpLCBiLCBhLm1wZnJfc3JjcHRyKCksIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyAqIE11bHRpcGxpY2F0aW9uDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcio9IChjb25zdCBtcHJlYWwmIHYpDQorew0KKyAgICBtcGZyX211bChtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdi5tcGZyX3NyY3B0cigpLG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgbXB6X3QgdikNCit7DQorICAgIG1wZnJfbXVsX3oobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCBtcHFfdCB2KQ0KK3sNCisgICAgbXBmcl9tdWxfcShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcio9KGNvbnN0IGxvbmcgZG91YmxlIHYpDQorew0KKyAgICAqdGhpcyAqPSBtcHJlYWwodik7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCBkb3VibGUgdikNCit7DQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorICAgIG1wZnJfbXVsX2QobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorI2Vsc2UNCisgICAgKnRoaXMgKj0gbXByZWFsKHYpOw0KKyNlbmRpZg0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikNCit7DQorICAgIG1wZnJfbXVsX3VpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgaW50IHYpDQorew0KKyAgICBtcGZyX211bF91aShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcio9KGNvbnN0IGxvbmcgaW50IHYpDQorew0KKyAgICBtcGZyX211bF9zaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcio9KGNvbnN0IGludCB2KQ0KK3sNCisgICAgbXBmcl9tdWxfc2kobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IqKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKQ0KK3sNCisgIG1wcmVhbCBjKDAsIChzdGQ6Om1heCkobXBmcl9nZXRfcHJlYyhhLm1wZnJfcHRyKCkpLCBtcGZyX2dldF9wcmVjKGIubXBmcl9wdHIoKSkpKTsNCisgIG1wZnJfbXVsKGMubXBmcl9wdHIoKSwgYS5tcGZyX3NyY3B0cigpLCBiLm1wZnJfc3JjcHRyKCksIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgcmV0dXJuIGM7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gLyBEaXZpc2lvbg0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCBtcHJlYWwmIHYpDQorew0KKyAgICBtcGZyX2RpdihtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdi5tcGZyX3NyY3B0cigpLG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgbXB6X3QgdikNCit7DQorICAgIG1wZnJfZGl2X3oobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCBtcHFfdCB2KQ0KK3sNCisgICAgbXBmcl9kaXZfcShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGxvbmcgZG91YmxlIHYpDQorew0KKyAgICAqdGhpcyAvPSBtcHJlYWwodik7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCBkb3VibGUgdikNCit7DQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorICAgIG1wZnJfZGl2X2QobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorI2Vsc2UNCisgICAgKnRoaXMgLz0gbXByZWFsKHYpOw0KKyNlbmRpZg0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikNCit7DQorICAgIG1wZnJfZGl2X3VpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx2LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgdW5zaWduZWQgaW50IHYpDQorew0KKyAgICBtcGZyX2Rpdl91aShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGxvbmcgaW50IHYpDQorew0KKyAgICBtcGZyX2Rpdl9zaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdixtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGludCB2KQ0KK3sNCisgICAgbXBmcl9kaXZfc2kobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHYsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKQ0KK3sNCisgIG1wcmVhbCBjKDAsIChzdGQ6Om1heCkobXBmcl9nZXRfcHJlYyhhLm1wZnJfc3JjcHRyKCkpLCBtcGZyX2dldF9wcmVjKGIubXBmcl9zcmNwdHIoKSkpKTsNCisgIG1wZnJfZGl2KGMubXBmcl9wdHIoKSwgYS5tcGZyX3NyY3B0cigpLCBiLm1wZnJfc3JjcHRyKCksIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgcmV0dXJuIGM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSkNCit7DQorICAgIG1wcmVhbCB4KDAsIG1wZnJfZ2V0X3ByZWMoYS5tcGZyX3NyY3B0cigpKSk7DQorICAgIG1wZnJfdWlfZGl2KHgubXBmcl9wdHIoKSwgYiwgYS5tcGZyX3NyY3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IHVuc2lnbmVkIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyAgICBtcHJlYWwgeCgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9zcmNwdHIoKSkpOw0KKyAgICBtcGZyX3VpX2Rpdih4Lm1wZnJfcHRyKCksIGIsIGEubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyAgICBtcHJlYWwgeCgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9zcmNwdHIoKSkpOw0KKyAgICBtcGZyX3NpX2Rpdih4Lm1wZnJfcHRyKCksIGIsIGEubXBmcl9zcmNwdHIoKSwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisgICAgbXByZWFsIHgoMCwgbXBmcl9nZXRfcHJlYyhhLm1wZnJfc3JjcHRyKCkpKTsNCisgICAgbXBmcl9zaV9kaXYoeC5tcGZyX3B0cigpLCBiLCBhLm1wZnJfc3JjcHRyKCksIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci8oY29uc3QgZG91YmxlICBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKyAgICBtcHJlYWwgeCgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9zcmNwdHIoKSkpOw0KKyAgICBtcGZyX2RfZGl2KHgubXBmcl9wdHIoKSwgYiwgYS5tcGZyX3NyY3B0cigpLCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgcmV0dXJuIHg7DQorI2Vsc2UNCisgICAgbXByZWFsIHgoMCwgbXBmcl9nZXRfcHJlYyhhLm1wZnJfcHRyKCkpKTsNCisgICAgeCAvPSBhOw0KKyAgICByZXR1cm4geDsNCisjZW5kaWYNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBTaGlmdHMgb3BlcmF0b3JzIC0gTXVsdGlwbGljYXRpb24vRGl2aXNpb24gYnkgcG93ZXIgb2YgMg0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I8PD0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdSkNCit7DQorICAgIG1wZnJfbXVsXzJ1aShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcjw8PShjb25zdCB1bnNpZ25lZCBpbnQgdSkNCit7DQorICAgIG1wZnJfbXVsXzJ1aShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KHUpLG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPDw9KGNvbnN0IGxvbmcgaW50IHUpDQorew0KKyAgICBtcGZyX211bF8yc2kobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHUsbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I8PD0oY29uc3QgaW50IHUpDQorew0KKyAgICBtcGZyX211bF8yc2kobXBmcl9wdHIoKSxtcGZyX3NyY3B0cigpLHN0YXRpY19jYXN0PGxvbmcgaW50Pih1KSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj4+PShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KQ0KK3sNCisgICAgbXBmcl9kaXZfMnVpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSx1LG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPj49KGNvbnN0IHVuc2lnbmVkIGludCB1KQ0KK3sNCisgICAgbXBmcl9kaXZfMnVpKG1wZnJfcHRyKCksbXBmcl9zcmNwdHIoKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4odSksbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I+Pj0oY29uc3QgbG9uZyBpbnQgdSkNCit7DQorICAgIG1wZnJfZGl2XzJzaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksdSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIHJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj4+PShjb25zdCBpbnQgdSkNCit7DQorICAgIG1wZnJfZGl2XzJzaShtcGZyX3B0cigpLG1wZnJfc3JjcHRyKCksc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KHUpLG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPDwoY29uc3QgbXByZWFsJiB2LCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBrKQ0KK3sNCisgICAgcmV0dXJuIG11bF8ydWkodixrKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcjw8KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgdW5zaWduZWQgaW50IGspDQorew0KKyAgICByZXR1cm4gbXVsXzJ1aSh2LHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihrKSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3I8PChjb25zdCBtcHJlYWwmIHYsIGNvbnN0IGxvbmcgaW50IGspDQorew0KKyAgICByZXR1cm4gbXVsXzJzaSh2LGspOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPDwoY29uc3QgbXByZWFsJiB2LCBjb25zdCBpbnQgaykNCit7DQorICAgIHJldHVybiBtdWxfMnNpKHYsc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGspKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcj4+KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgaykNCit7DQorICAgIHJldHVybiBkaXZfMnVpKHYsayk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3I+Pihjb25zdCBtcHJlYWwmIHYsIGNvbnN0IGxvbmcgaW50IGspDQorew0KKyAgICByZXR1cm4gZGl2XzJzaSh2LGspOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPj4oY29uc3QgbXByZWFsJiB2LCBjb25zdCB1bnNpZ25lZCBpbnQgaykNCit7DQorICAgIHJldHVybiBkaXZfMnVpKHYsc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGspKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcj4+KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgaW50IGspDQorew0KKyAgICByZXR1cm4gZGl2XzJzaSh2LHN0YXRpY19jYXN0PGxvbmcgaW50PihrKSk7DQorfQ0KKw0KKy8vIG11bF8ydWkNCitpbmxpbmUgY29uc3QgbXByZWFsIG11bF8ydWkoY29uc3QgbXByZWFsJiB2LCB1bnNpZ25lZCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIG1wcmVhbCB4KHYpOw0KKyAgICBtcGZyX211bF8ydWkoeC5tcGZyX3B0cigpLHYubXBmcl9zcmNwdHIoKSxrLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KKy8vIG11bF8yc2kNCitpbmxpbmUgY29uc3QgbXByZWFsIG11bF8yc2koY29uc3QgbXByZWFsJiB2LCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIG1wcmVhbCB4KHYpOw0KKyAgICBtcGZyX211bF8yc2koeC5tcGZyX3B0cigpLHYubXBmcl9zcmNwdHIoKSxrLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZGl2XzJ1aShjb25zdCBtcHJlYWwmIHYsIHVuc2lnbmVkIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgbXByZWFsIHgodik7DQorICAgIG1wZnJfZGl2XzJ1aSh4Lm1wZnJfcHRyKCksdi5tcGZyX3NyY3B0cigpLGsscm5kX21vZGUpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBkaXZfMnNpKGNvbnN0IG1wcmVhbCYgdiwgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBtcHJlYWwgeCh2KTsNCisgICAgbXBmcl9kaXZfMnNpKHgubXBmcl9wdHIoKSx2Lm1wZnJfc3JjcHRyKCksayxybmRfbW9kZSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vUmVsYXRpb25hbCBvcGVyYXRvcnMNCisNCisvLyBXQVJOSU5HOg0KKy8vDQorLy8gUGxlYXNlIG5vdGUgdGhhdCBmb2xsb3dpbmcgY2hlY2tzIGZvciBkb3VibGUtTmFOIGFyZSBndWFyYW50ZWVkIHRvIHdvcmsgb25seSBpbiBJRUVFIG1hdGggbW9kZToNCisvLw0KKy8vIGlzbmFuKGIpID0gIChiICE9IGIpDQorLy8gaXNuYW4oYikgPSAhKGIgPT0gYikgICh3ZSB1c2UgaW4gY29kZSBiZWxvdykNCisvLw0KKy8vIEJlIGNhdXRpb25zIGlmIHlvdSB1c2UgY29tcGlsZXIgb3B0aW9ucyB3aGljaCBicmVhayBzdHJpY3QgSUVFRSBjb21wbGlhbmNlIChlLmcuIC1mZmFzdC1tYXRoIGluIEdDQykuDQorLy8gVXNlIHN0ZDo6aXNuYW4gaW5zdGVhZCAoQysrMTEpLg0KKw0KK2lubGluZSBib29sIG9wZXJhdG9yID4gIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiAgICAgICAgICAgKXsgIHJldHVybiAobXBmcl9ncmVhdGVyX3AoYS5tcGZyX3NyY3B0cigpLGIubXBmcl9zcmNwdHIoKSkgIT0gMCApOyAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfdWkoYS5tcGZyX3NyY3B0cigpLGIpID4gMCApOyAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID4gIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF91aShhLm1wZnJfc3JjcHRyKCksYikgPiAwICk7ICAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPiAgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBpbnQgYiAgICAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3NpKGEubXBmcl9zcmNwdHIoKSxiKSA+IDAgKTsgICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYiAgICAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfc2koYS5tcGZyX3NyY3B0cigpLGIpID4gMCApOyAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID4gIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChiID09IGIpICYmIChtcGZyX2NtcF9sZChhLm1wZnJfc3JjcHRyKCksYikgPiAwICk7ICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA+ICAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBkb3VibGUgYiAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAoYiA9PSBiKSAmJiAobXBmcl9jbXBfZCAoYS5tcGZyX3NyY3B0cigpLGIpID4gMCApOyAgICB9DQorDQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiICAgICAgICAgICApeyAgcmV0dXJuIChtcGZyX2dyZWF0ZXJlcXVhbF9wKGEubXBmcl9zcmNwdHIoKSxiLm1wZnJfc3JjcHRyKCkpICE9IDAgKTsgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID49IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF91aShhLm1wZnJfc3JjcHRyKCksYikgPj0gMCApOyAgICAgICAgICAgICAgICB9DQorLy8gaW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgdW5zaWduZWQgaW50IGIgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoaXNuYW4oKWEpICYmIChtcGZyX2NtcF91aShhLm1wZnJfc3JjcHRyKCksYikgPj0gMCApOyAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBpbnQgYiAgICAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3NpKGEubXBmcl9zcmNwdHIoKSxiKSA+PSAwICk7ICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA+PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYiAgICAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfc2koYS5tcGZyX3NyY3B0cigpLGIpID49IDAgKTsgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID49IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChiID09IGIpICYmIChtcGZyX2NtcF9sZChhLm1wZnJfc3JjcHRyKCksYikgPj0gMCApOyAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA+PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBkb3VibGUgYiAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAoYiA9PSBiKSAmJiAobXBmcl9jbXBfZCAoYS5tcGZyX3NyY3B0cigpLGIpID49IDAgKTsgICB9DQorDQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPCAgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiICAgICAgICAgICApeyAgcmV0dXJuIChtcGZyX2xlc3NfcChhLm1wZnJfc3JjcHRyKCksYi5tcGZyX3NyY3B0cigpKSAhPSAwICk7ICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIDwgIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF91aShhLm1wZnJfc3JjcHRyKCksYikgPCAwICk7ICAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPCAgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgdW5zaWduZWQgaW50IGIgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3VpKGEubXBmcl9zcmNwdHIoKSxiKSA8IDAgKTsgICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA8ICAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBsb25nIGludCBiICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfc2koYS5tcGZyX3NyY3B0cigpLGIpIDwgMCApOyAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIDwgIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGludCBiICAgICAgICAgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF9zaShhLm1wZnJfc3JjcHRyKCksYikgPCAwICk7ICAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPCAgKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBkb3VibGUgYiAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKGIgPT0gYikgJiYgKG1wZnJfY21wX2xkKGEubXBmcl9zcmNwdHIoKSxiKSA8IDAgKTsgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIDwgIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGRvdWJsZSBiICAgICAgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChiID09IGIpICYmIChtcGZyX2NtcF9kIChhLm1wZnJfc3JjcHRyKCksYikgPCAwICk7ICAgIH0NCisNCitpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIgICAgICAgICAgICl7ICByZXR1cm4gKG1wZnJfbGVzc2VxdWFsX3AoYS5tcGZyX3NyY3B0cigpLGIubXBmcl9zcmNwdHIoKSkgIT0gMCApOyAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPD0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3VpKGEubXBmcl9zcmNwdHIoKSxiKSA8PSAwICk7ICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfdWkoYS5tcGZyX3NyY3B0cigpLGIpIDw9IDAgKTsgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIDw9IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgaW50IGIgICAgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF9zaShhLm1wZnJfc3JjcHRyKCksYikgPD0gMCApOyAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPD0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgaW50IGIgICAgICAgICAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3NpKGEubXBmcl9zcmNwdHIoKSxiKSA8PSAwICk7ICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBsb25nIGRvdWJsZSBiICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAoYiA9PSBiKSAmJiAobXBmcl9jbXBfbGQoYS5tcGZyX3NyY3B0cigpLGIpIDw9IDAgKTsgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPD0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgZG91YmxlIGIgICAgICAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKGIgPT0gYikgJiYgKG1wZnJfY21wX2QgKGEubXBmcl9zcmNwdHIoKSxiKSA8PSAwICk7ICAgfQ0KKw0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiAgICAgICAgICAgKXsgIHJldHVybiAobXBmcl9lcXVhbF9wKGEubXBmcl9zcmNwdHIoKSxiLm1wZnJfc3JjcHRyKCkpICE9IDAgKTsgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfdWkoYS5tcGZyX3NyY3B0cigpLGIpID09IDAgKTsgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChtcGZyX2NtcF91aShhLm1wZnJfc3JjcHRyKCksYikgPT0gMCApOyAgICAgICAgICAgICAgICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBpbnQgYiAgICAgICAgICApeyAgcmV0dXJuICFpc25hbiBFSUdFTl9OT1RfQV9NQUNSTyAoYSkgJiYgKG1wZnJfY21wX3NpKGEubXBmcl9zcmNwdHIoKSxiKSA9PSAwICk7ICAgICAgICAgICAgICAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYiAgICAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAobXBmcl9jbXBfc2koYS5tcGZyX3NyY3B0cigpLGIpID09IDAgKTsgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIgICAgICAgKXsgIHJldHVybiAhaXNuYW4gRUlHRU5fTk9UX0FfTUFDUk8gKGEpICYmIChiID09IGIpICYmIChtcGZyX2NtcF9sZChhLm1wZnJfc3JjcHRyKCksYikgPT0gMCApOyAgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBkb3VibGUgYiAgICAgICAgICAgICl7ICByZXR1cm4gIWlzbmFuIEVJR0VOX05PVF9BX01BQ1JPIChhKSAmJiAoYiA9PSBiKSAmJiAobXBmcl9jbXBfZCAoYS5tcGZyX3NyY3B0cigpLGIpID09IDAgKTsgICB9DQorDQoraW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiICAgICAgICAgICApeyAgcmV0dXJuICEoYSA9PSBiKTsgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiICl7ICByZXR1cm4gIShhID09IGIpOyAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiICAgICAgKXsgIHJldHVybiAhKGEgPT0gYik7ICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBpbnQgYiAgICAgICAgICApeyAgcmV0dXJuICEoYSA9PSBiKTsgIH0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYiAgICAgICAgICAgICAgICl7ICByZXR1cm4gIShhID09IGIpOyAgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIgICAgICAgKXsgIHJldHVybiAhKGEgPT0gYik7ICB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgZG91YmxlIGIgICAgICAgICAgICApeyAgcmV0dXJuICEoYSA9PSBiKTsgIH0NCisNCitpbmxpbmUgYm9vbCAoaXNuYW4pICAgIChjb25zdCBtcHJlYWwmIG9wKXsgICAgcmV0dXJuIChtcGZyX25hbl9wICAgIChvcC5tcGZyX3NyY3B0cigpKSAhPSAwICk7ICAgIH0NCitpbmxpbmUgYm9vbCAoaXNpbmYpICAgIChjb25zdCBtcHJlYWwmIG9wKXsgICAgcmV0dXJuIChtcGZyX2luZl9wICAgIChvcC5tcGZyX3NyY3B0cigpKSAhPSAwICk7ICAgIH0NCitpbmxpbmUgYm9vbCAoaXNmaW5pdGUpIChjb25zdCBtcHJlYWwmIG9wKXsgICAgcmV0dXJuIChtcGZyX251bWJlcl9wIChvcC5tcGZyX3NyY3B0cigpKSAhPSAwICk7ICAgIH0NCitpbmxpbmUgYm9vbCBpc3plcm8gICAoY29uc3QgbXByZWFsJiBvcCl7ICAgIHJldHVybiAobXBmcl96ZXJvX3AgICAob3AubXBmcl9zcmNwdHIoKSkgIT0gMCApOyAgICB9DQoraW5saW5lIGJvb2wgaXNpbnQgICAgKGNvbnN0IG1wcmVhbCYgb3ApeyAgICByZXR1cm4gKG1wZnJfaW50ZWdlcl9wKG9wLm1wZnJfc3JjcHRyKCkpICE9IDAgKTsgICAgfQ0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMywwLDApKQ0KK2lubGluZSBib29sIGlzcmVndWxhcihjb25zdCBtcHJlYWwmIG9wKXsgICAgcmV0dXJuIChtcGZyX3JlZ3VsYXJfcChvcC5tcGZyX3NyY3B0cigpKSk7fQ0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVHlwZSBDb252ZXJ0ZXJzDQoraW5saW5lIGJvb2wgICAgICAgICAgICAgICBtcHJlYWw6OnRvQm9vbCAgICggICAgICAgICAgICAgKSAgY29uc3QgICAgeyAgICByZXR1cm4gIG1wZnJfemVyb19wIChtcGZyX3NyY3B0cigpKSA9PSAwOyAgICAgfQ0KK2lubGluZSBsb25nICAgICAgICAgICAgICAgbXByZWFsOjp0b0xvbmcgICAobXBfcm5kX3QgbW9kZSkgIGNvbnN0ICAgIHsgICAgcmV0dXJuICBtcGZyX2dldF9zaSAobXBmcl9zcmNwdHIoKSwgbW9kZSk7ICAgIH0NCitpbmxpbmUgdW5zaWduZWQgbG9uZyAgICAgIG1wcmVhbDo6dG9VTG9uZyAgKG1wX3JuZF90IG1vZGUpICBjb25zdCAgICB7ICAgIHJldHVybiAgbXBmcl9nZXRfdWkgKG1wZnJfc3JjcHRyKCksIG1vZGUpOyAgICB9DQoraW5saW5lIGZsb2F0ICAgICAgICAgICAgICBtcHJlYWw6OnRvRmxvYXQgIChtcF9ybmRfdCBtb2RlKSAgY29uc3QgICAgeyAgICByZXR1cm4gIG1wZnJfZ2V0X2ZsdChtcGZyX3NyY3B0cigpLCBtb2RlKTsgICAgfQ0KK2lubGluZSBkb3VibGUgICAgICAgICAgICAgbXByZWFsOjp0b0RvdWJsZSAobXBfcm5kX3QgbW9kZSkgIGNvbnN0ICAgIHsgICAgcmV0dXJuICBtcGZyX2dldF9kICAobXBmcl9zcmNwdHIoKSwgbW9kZSk7ICAgIH0NCitpbmxpbmUgbG9uZyBkb3VibGUgICAgICAgIG1wcmVhbDo6dG9MRG91YmxlKG1wX3JuZF90IG1vZGUpICBjb25zdCAgICB7ICAgIHJldHVybiAgbXBmcl9nZXRfbGQgKG1wZnJfc3JjcHRyKCksIG1vZGUpOyAgICB9DQoraW5saW5lIGxvbmcgbG9uZyAgICAgICAgICBtcHJlYWw6OnRvTExvbmcgIChtcF9ybmRfdCBtb2RlKSAgY29uc3QgICAgeyAgICByZXR1cm4gIG1wZnJfZ2V0X3NqIChtcGZyX3NyY3B0cigpLCBtb2RlKTsgICAgfQ0KK2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgbXByZWFsOjp0b1VMTG9uZyAobXBfcm5kX3QgbW9kZSkgIGNvbnN0ICAgIHsgICAgcmV0dXJuICBtcGZyX2dldF91aiAobXBmcl9zcmNwdHIoKSwgbW9kZSk7ICAgIH0NCisNCitpbmxpbmUgOjptcGZyX3B0ciAgICAgbXByZWFsOjptcGZyX3B0cigpICAgICAgICAgICAgIHsgcmV0dXJuIG1wOyB9DQoraW5saW5lIDo6bXBmcl9zcmNwdHIgIG1wcmVhbDo6bXBmcl9wdHIoKSAgICBjb25zdCAgICB7IHJldHVybiBtcDsgfQ0KK2lubGluZSA6Om1wZnJfc3JjcHRyICBtcHJlYWw6Om1wZnJfc3JjcHRyKCkgY29uc3QgICAgeyByZXR1cm4gbXA7IH0NCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4NCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoVCB0LCBzdGQ6Omlvc19iYXNlICYgKCpmKShzdGQ6Omlvc19iYXNlJikpDQorew0KKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOw0KKyAgICBvc3MgPDwgZiA8PCB0Ow0KKyAgICByZXR1cm4gb3NzLnN0cigpOw0KK30NCisNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisNCitpbmxpbmUgc3RkOjpzdHJpbmcgbXByZWFsOjp0b1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZm9ybWF0KSBjb25zdA0KK3sNCisgICAgY2hhciAqcyA9IE5VTEw7DQorICAgIHN0ZDo6c3RyaW5nIG91dDsNCisNCisgICAgaWYoICFmb3JtYXQuZW1wdHkoKSApDQorICAgIHsNCisgICAgICAgIGlmKCEobXBmcl9hc3ByaW50ZigmcywgZm9ybWF0LmNfc3RyKCksIG1wZnJfc3JjcHRyKCkpIDwgMCkpDQorICAgICAgICB7DQorICAgICAgICAgICAgb3V0ID0gc3RkOjpzdHJpbmcocyk7DQorDQorICAgICAgICAgICAgbXBmcl9mcmVlX3N0cihzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gb3V0Ow0KK30NCisNCisjZW5kaWYNCisNCitpbmxpbmUgc3RkOjpzdHJpbmcgbXByZWFsOjp0b1N0cmluZyhpbnQgbiwgaW50IGIsIG1wX3JuZF90IG1vZGUpIGNvbnN0DQorew0KKyAgICAvLyBUT0RPOiBBZGQgZXh0ZW5kZWQgZm9ybWF0IHNwZWNpZmljYXRpb24gKGYsIGUsIHJvdW5kaW5nIG1vZGUpIGFzIGl0IGRvbmUgaW4gb3V0cHV0IG9wZXJhdG9yDQorICAgICh2b2lkKWI7DQorICAgICh2b2lkKW1vZGU7DQorDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorDQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmb3JtYXQ7DQorDQorICAgIGludCBkaWdpdHMgPSAobiA+PSAwKSA/IG4gOiAxICsgYml0czJkaWdpdHMobXBmcl9nZXRfcHJlYyhtcGZyX3NyY3B0cigpKSk7DQorDQorICAgIGZvcm1hdCA8PCAiJS4iIDw8IGRpZ2l0cyA8PCAiUk5nIjsNCisNCisgICAgcmV0dXJuIHRvU3RyaW5nKGZvcm1hdC5zdHIoKSk7DQorDQorI2Vsc2UNCisNCisgICAgY2hhciAqcywgKm5zID0gTlVMTDsNCisgICAgc2l6ZV90IHNsZW4sIG5zbGVuOw0KKyAgICBtcF9leHBfdCBleHA7DQorICAgIHN0ZDo6c3RyaW5nIG91dDsNCisNCisgICAgaWYobXBmcl9pbmZfcChtcCkpDQorICAgIHsNCisgICAgICAgIGlmKG1wZnJfc2duKG1wKT4wKSByZXR1cm4gIitJbmYiOw0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgIHJldHVybiAiLUluZiI7DQorICAgIH0NCisNCisgICAgaWYobXBmcl96ZXJvX3AobXApKSByZXR1cm4gIjAiOw0KKyAgICBpZihtcGZyX25hbl9wKG1wKSkgIHJldHVybiAiTmFOIjsNCisNCisgICAgcyAgPSBtcGZyX2dldF9zdHIoTlVMTCwgJmV4cCwgYiwgMCwgbXAsIG1vZGUpOw0KKyAgICBucyA9IG1wZnJfZ2V0X3N0cihOVUxMLCAmZXhwLCBiLCAoc3RkOjptYXgpKDAsbiksIG1wLCBtb2RlKTsNCisNCisgICAgaWYocyE9TlVMTCAmJiBucyE9TlVMTCkNCisgICAgew0KKyAgICAgICAgc2xlbiAgPSBzdHJsZW4ocyk7DQorICAgICAgICBuc2xlbiA9IHN0cmxlbihucyk7DQorICAgICAgICBpZihuc2xlbjw9c2xlbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBtcGZyX2ZyZWVfc3RyKHMpOw0KKyAgICAgICAgICAgIHMgPSBuczsNCisgICAgICAgICAgICBzbGVuID0gbnNsZW47DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBtcGZyX2ZyZWVfc3RyKG5zKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIE1ha2UgaHVtYW4gZXllLWZyaWVuZGx5IGZvcm1hdHRpbmcgaWYgcG9zc2libGUNCisgICAgICAgIGlmIChleHA+MCAmJiBzdGF0aWNfY2FzdDxzaXplX3Q+KGV4cCk8c2xlbikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZihzWzBdPT0nLScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgemVyb3Mgc3RhcnRpbmcgZnJvbSByaWdodCBlbmQNCisgICAgICAgICAgICAgICAgY2hhciogcHRyID0gcytzbGVuLTE7DQorICAgICAgICAgICAgICAgIHdoaWxlICgqcHRyPT0nMCcgJiYgcHRyPnMrZXhwKSBwdHItLTsNCisNCisgICAgICAgICAgICAgICAgaWYocHRyPT1zK2V4cCkgb3V0ID0gc3RkOjpzdHJpbmcocyxleHArMSk7DQorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgIG91dCA9IHN0ZDo6c3RyaW5nKHMsZXhwKzEpKycuJytzdGQ6OnN0cmluZyhzK2V4cCsxLHB0ci0ocytleHArMSkrMSk7DQorDQorICAgICAgICAgICAgICAgIC8vb3V0ID0gc3RyaW5nKHMsZXhwKzEpKycuJytzdHJpbmcocytleHArMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB6ZXJvcyBzdGFydGluZyBmcm9tIHJpZ2h0IGVuZA0KKyAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBzK3NsZW4tMTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKCpwdHI9PScwJyAmJiBwdHI+cytleHAtMSkgcHRyLS07DQorDQorICAgICAgICAgICAgICAgIGlmKHB0cj09cytleHAtMSkgb3V0ID0gc3RkOjpzdHJpbmcocyxleHApOw0KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgIG91dCA9IHN0ZDo6c3RyaW5nKHMsZXhwKSsnLicrc3RkOjpzdHJpbmcocytleHAscHRyLShzK2V4cCkrMSk7DQorDQorICAgICAgICAgICAgICAgIC8vb3V0ID0gc3RyaW5nKHMsZXhwKSsnLicrc3RyaW5nKHMrZXhwKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9ZWxzZXsgLy8gZXhwPDAgfHwgZXhwPnNsZW4NCisgICAgICAgICAgICBpZihzWzBdPT0nLScpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgemVyb3Mgc3RhcnRpbmcgZnJvbSByaWdodCBlbmQNCisgICAgICAgICAgICAgICAgY2hhciogcHRyID0gcytzbGVuLTE7DQorICAgICAgICAgICAgICAgIHdoaWxlICgqcHRyPT0nMCcgJiYgcHRyPnMrMSkgcHRyLS07DQorDQorICAgICAgICAgICAgICAgIGlmKHB0cj09cysxKSBvdXQgPSBzdGQ6OnN0cmluZyhzLDIpOw0KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgb3V0ID0gc3RkOjpzdHJpbmcocywyKSsnLicrc3RkOjpzdHJpbmcocysyLHB0ci0ocysyKSsxKTsNCisNCisgICAgICAgICAgICAgICAgLy9vdXQgPSBzdHJpbmcocywyKSsnLicrc3RyaW5nKHMrMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB6ZXJvcyBzdGFydGluZyBmcm9tIHJpZ2h0IGVuZA0KKyAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBzK3NsZW4tMTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKCpwdHI9PScwJyAmJiBwdHI+cykgcHRyLS07DQorDQorICAgICAgICAgICAgICAgIGlmKHB0cj09cykgb3V0ID0gc3RkOjpzdHJpbmcocywxKTsNCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICBvdXQgPSBzdGQ6OnN0cmluZyhzLDEpKycuJytzdGQ6OnN0cmluZyhzKzEscHRyLShzKzEpKzEpOw0KKw0KKyAgICAgICAgICAgICAgICAvL291dCA9IHN0cmluZyhzLDEpKycuJytzdHJpbmcocysxKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gTWFrZSBmaW5hbCBzdHJpbmcNCisgICAgICAgICAgICBpZigtLWV4cCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmKGV4cD4wKSBvdXQgKz0gImUrIittcGZyOjp0b1N0cmluZzxtcF9leHBfdD4oZXhwLHN0ZDo6ZGVjKTsNCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICBvdXQgKz0gImUiK21wZnI6OnRvU3RyaW5nPG1wX2V4cF90PihleHAsc3RkOjpkZWMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIG1wZnJfZnJlZV9zdHIocyk7DQorICAgICAgICByZXR1cm4gb3V0Ow0KKyAgICB9ZWxzZXsNCisgICAgICAgIHJldHVybiAiY29udmVyc2lvbiBlcnJvciEiOw0KKyAgICB9DQorI2VuZGlmDQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gSS9PDQoraW5saW5lIHN0ZDo6b3N0cmVhbSYgbXByZWFsOjpvdXRwdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3QNCit7DQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmb3JtYXQ7DQorICAgIGNvbnN0IHN0ZDo6aW9zOjpmbXRmbGFncyBmbGFncyA9IG9zLmZsYWdzKCk7DQorDQorICAgIGZvcm1hdCA8PCAoKGZsYWdzICYgc3RkOjppb3M6OnNob3dwb3MpID8gIiUrIiA6ICIlIik7DQorICAgIGlmIChvcy5wcmVjaXNpb24oKSA+PSAwKQ0KKyAgICAgICAgZm9ybWF0IDw8ICcuJyA8PCBvcy5wcmVjaXNpb24oKSA8PCAiUioiDQorICAgICAgICAgICAgICAgPDwgKChmbGFncyAmIHN0ZDo6aW9zOjpmbG9hdGZpZWxkKSA9PSBzdGQ6Omlvczo6Zml4ZWQgPyAnZicgOg0KKyAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBzdGQ6Omlvczo6ZmxvYXRmaWVsZCkgPT0gc3RkOjppb3M6OnNjaWVudGlmaWMgPyAnZScgOg0KKyAgICAgICAgICAgICAgICAgICAnZycpOw0KKyAgICBlbHNlDQorICAgICAgICBmb3JtYXQgPDwgIlIqZSI7DQorDQorICAgIGNoYXIgKnMgPSBOVUxMOw0KKyAgICBpZighKG1wZnJfYXNwcmludGYoJnMsIGZvcm1hdC5zdHIoKS5jX3N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIoKSkNCisgICAgICAgIDwgMCkpDQorICAgIHsNCisgICAgICAgIG9zIDw8IHN0ZDo6c3RyaW5nKHMpOw0KKyAgICAgICAgbXBmcl9mcmVlX3N0cihzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gb3M7DQorfQ0KKw0KK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgbXByZWFsJiB2KQ0KK3sNCisgICAgcmV0dXJuIHYub3V0cHV0KG9zKTsNCit9DQorDQoraW5saW5lIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0gJmlzLCBtcHJlYWwmIHYpDQorew0KKyAgICAvLyBUT0RPOiB1c2UgY291dDo6aGV4ZmxvYXQgYW5kIG90aGVyIGZsYWdzIHRvIHNldHVwIGJhc2UNCisgICAgc3RkOjpzdHJpbmcgdG1wOw0KKyAgICBpcyA+PiB0bXA7DQorICAgIG1wZnJfc2V0X3N0cih2Lm1wZnJfcHRyKCksIHRtcC5jX3N0cigpLCAxMCwgbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSk7DQorICAgIHJldHVybiBpczsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyAgICAgQml0cyAtIGRlY2ltYWwgZGlnaXRzIHJlbGF0aW9uDQorLy8gICAgICAgIGJpdHMgICA9IGNlaWwoZGlnaXRzKmxvZ1syXSgxMCkpDQorLy8gICAgICAgIGRpZ2l0cyA9IGZsb29yKGJpdHMqbG9nWzEwXSgyKSkNCisNCitpbmxpbmUgbXBfcHJlY190IGRpZ2l0czJiaXRzKGludCBkKQ0KK3sNCisgICAgY29uc3QgZG91YmxlIExPRzJfMTAgPSAzLjMyMTkyODA5NDg4NzM2MjQ7DQorDQorICAgIHJldHVybiBtcF9wcmVjX3Qoc3RkOjpjZWlsKCBkICogTE9HMl8xMCApKTsNCit9DQorDQoraW5saW5lIGludCBiaXRzMmRpZ2l0cyhtcF9wcmVjX3QgYikNCit7DQorICAgIGNvbnN0IGRvdWJsZSBMT0cxMF8yID0gMC4zMDEwMjk5OTU2NjM5ODExOTsNCisNCisgICAgcmV0dXJuIGludChzdGQ6OmZsb29yKCBiICogTE9HMTBfMiApKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBTZXQvR2V0IG51bWJlciBwcm9wZXJ0aWVzDQoraW5saW5lIGludCBzZ24oY29uc3QgbXByZWFsJiBvcCkNCit7DQorICAgIHJldHVybiBtcGZyX3NnbihvcC5tcGZyX3NyY3B0cigpKTsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpzZXRTaWduKGludCBzaWduLCBtcF9ybmRfdCBSb3VuZGluZ01vZGUpDQorew0KKyAgICBtcGZyX3NldHNpZ24obXBmcl9wdHIoKSwgbXBmcl9zcmNwdHIoKSwgKHNpZ24gPCAwID8gMSA6IDApLCBSb3VuZGluZ01vZGUpOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgaW50IG1wcmVhbDo6Z2V0UHJlY2lzaW9uKCkgY29uc3QNCit7DQorICAgIHJldHVybiBpbnQobXBmcl9nZXRfcHJlYyhtcGZyX3NyY3B0cigpKSk7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6c2V0UHJlY2lzaW9uKGludCBQcmVjaXNpb24sIG1wX3JuZF90IFJvdW5kaW5nTW9kZSkNCit7DQorICAgIG1wZnJfcHJlY19yb3VuZChtcGZyX3B0cigpLCBQcmVjaXNpb24sIFJvdW5kaW5nTW9kZSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6c2V0SW5mKGludCBzaWduKQ0KK3sNCisgICAgbXBmcl9zZXRfaW5mKG1wZnJfcHRyKCksIHNpZ24pOw0KKyAgICBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6OnNldE5hbigpDQorew0KKyAgICBtcGZyX3NldF9uYW4obXBmcl9wdHIoKSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6c2V0WmVybyhpbnQgc2lnbikNCit7DQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQorICAgIG1wZnJfc2V0X3plcm8obXBmcl9wdHIoKSwgc2lnbik7DQorI2Vsc2UNCisgICAgbXBmcl9zZXRfc2kobXBmcl9wdHIoKSwgMCwgKG1wZnJfZ2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSkoKSk7DQorICAgIHNldFNpZ24oc2lnbik7DQorI2VuZGlmDQorDQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcF9wcmVjX3QgbXByZWFsOjpnZXRfcHJlYygpIGNvbnN0DQorew0KKyAgICByZXR1cm4gbXBmcl9nZXRfcHJlYyhtcGZyX3NyY3B0cigpKTsNCit9DQorDQoraW5saW5lIHZvaWQgbXByZWFsOjpzZXRfcHJlYyhtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBtcGZyX3ByZWNfcm91bmQobXBmcl9wdHIoKSxwcmVjLHJuZF9tb2RlKTsNCisgICAgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9leHAgKCkNCit7DQorICAgIHJldHVybiBtcGZyX2dldF9leHAobXBmcl9zcmNwdHIoKSk7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpzZXRfZXhwIChtcF9leHBfdCBlKQ0KK3sNCisgICAgaW50IHggPSBtcGZyX3NldF9leHAobXBmcl9wdHIoKSwgZSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBmcmV4cChjb25zdCBtcHJlYWwmIHgsIG1wX2V4cF90KiBleHAsIG1wX3JuZF90IG1vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHkoeCk7DQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDEsMCkpDQorICAgIG1wZnJfZnJleHAoZXhwLHkubXBmcl9wdHIoKSx4Lm1wZnJfc3JjcHRyKCksbW9kZSk7DQorI2Vsc2UNCisgICAgKmV4cCA9IG1wZnJfZ2V0X2V4cCh5Lm1wZnJfc3JjcHRyKCkpOw0KKyAgICBtcGZyX3NldF9leHAoeS5tcGZyX3B0cigpLDApOw0KKyNlbmRpZg0KKyAgICByZXR1cm4geTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsZGV4cChjb25zdCBtcHJlYWwmIHYsIG1wX2V4cF90IGV4cCkNCit7DQorICAgIG1wcmVhbCB4KHYpOw0KKw0KKyAgICAvLyByb3VuZGluZyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIHdlIGFyZSBqdXN0IGluY3JlYXNpbmcgdGhlIGV4cG9uZW50ICg9IGV4YWN0IG9wZXJhdGlvbikNCisgICAgbXBmcl9tdWxfMnNpKHgubXBmcl9wdHIoKSwgeC5tcGZyX3NyY3B0cigpLCBleHAsIG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzY2FsYm4oY29uc3QgbXByZWFsJiB2LCBtcF9leHBfdCBleHApDQorew0KKyAgICByZXR1cm4gbGRleHAodiwgZXhwKTsNCit9DQorDQoraW5saW5lIG1wcmVhbCBtYWNoaW5lX2Vwc2lsb24obXBfcHJlY190IHByZWMpDQorew0KKyAgICAvKiB0aGUgc21hbGxlc3QgZXBzIHN1Y2ggdGhhdCAxICsgZXBzICE9IDEgKi8NCisgICAgcmV0dXJuIG1hY2hpbmVfZXBzaWxvbihtcHJlYWwoMSwgcHJlYykpOw0KK30NCisNCitpbmxpbmUgbXByZWFsIG1hY2hpbmVfZXBzaWxvbihjb25zdCBtcHJlYWwmIHgpDQorew0KKyAgICAvKiB0aGUgc21hbGxlc3QgZXBzIHN1Y2ggdGhhdCB4ICsgZXBzICE9IHggKi8NCisgICAgaWYoIHggPCAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbmV4dGFib3ZlKC14KSArIHg7DQorICAgIH1lbHNlew0KKyAgICAgICAgcmV0dXJuIG5leHRhYm92ZSggeCkgLSB4Ow0KKyAgICB9DQorfQ0KKw0KKy8vIG1pbnZhbCBpcyAnc2FmZScgbWVhbmluZyAxIC8gbWludmFsIGRvZXMgbm90IG92ZXJmbG93DQoraW5saW5lIG1wcmVhbCBtaW52YWwobXBfcHJlY190IHByZWMpDQorew0KKyAgICAvKiBtaW4gPSAxLzIgKiAyXmVtaW4gPSAyXihlbWluIC0gMSkgKi8NCisgICAgcmV0dXJuIG1wcmVhbCgxLCBwcmVjKSA8PCBtcHJlYWw6OmdldF9lbWluKCktMTsNCit9DQorDQorLy8gbWF4dmFsIGlzICdzYWZlJyBtZWFuaW5nIDEgLyBtYXh2YWwgZG9lcyBub3QgdW5kZXJmbG93DQoraW5saW5lIG1wcmVhbCBtYXh2YWwobXBfcHJlY190IHByZWMpDQorew0KKyAgICAvKiBtYXggPSAoMSAtIGVwcykgKiAyXmVtYXgsIGVwcyBpcyBtYWNoaW5lIGVwc2lsb24gKi8NCisgICAgcmV0dXJuIChtcHJlYWwoMSwgcHJlYykgLSBtYWNoaW5lX2Vwc2lsb24ocHJlYykpIDw8IG1wcmVhbDo6Z2V0X2VtYXgoKTsNCit9DQorDQoraW5saW5lIGJvb2wgaXNFcXVhbFVscHMoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIGludCBtYXhVbHBzKQ0KK3sNCisgICAgcmV0dXJuIGFicyhhIC0gYikgPD0gbWFjaGluZV9lcHNpbG9uKChtYXgpKGFicyhhKSwgYWJzKGIpKSkgKiBtYXhVbHBzOw0KK30NCisNCitpbmxpbmUgYm9vbCBpc0VxdWFsRnV6enkoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIGNvbnN0IG1wcmVhbCYgZXBzKQ0KK3sNCisgICAgcmV0dXJuIGFicyhhIC0gYikgPD0gZXBzOw0KK30NCisNCitpbmxpbmUgYm9vbCBpc0VxdWFsRnV6enkoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIpDQorew0KKyAgICByZXR1cm4gaXNFcXVhbEZ1enp5KGEsIGIsIG1hY2hpbmVfZXBzaWxvbigobWF4KSgxLCAobWluKShhYnMoYSksIGFicyhiKSkpKSk7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQysrMTEgc2lnbiBmdW5jdGlvbnMuDQoraW5saW5lIG1wcmVhbCBjb3B5c2lnbihjb25zdCBtcHJlYWwmIHgsIGNvbnN0ICBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCByb3AoMCwgbXBmcl9nZXRfcHJlYyh4Lm1wZnJfcHRyKCkpKTsNCisgICAgbXBmcl9zZXRzaWduKHJvcC5tcGZyX3B0cigpLCB4Lm1wZnJfc3JjcHRyKCksIG1wZnJfc2lnbmJpdCh5Lm1wZnJfc3JjcHRyKCkpLCBybmRfbW9kZSk7DQorICAgIHJldHVybiByb3A7DQorfQ0KKw0KK2lubGluZSBib29sIHNpZ25iaXQoY29uc3QgbXByZWFsJiB4KQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfc2lnbmJpdCh4Lm1wZnJfc3JjcHRyKCkpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG1vZGYoY29uc3QgbXByZWFsJiB2LCBtcHJlYWwmIG4pDQorew0KKyAgICBtcHJlYWwgZih2KTsNCisNCisgICAgLy8gcm91bmRpbmcgaXMgbm90IGltcG9ydGFudCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhlIHNhbWUgbnVtYmVyDQorICAgIG1wZnJfZnJhYyAoZi5tcGZyX3B0cigpLGYubXBmcl9zcmNwdHIoKSxtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKTsNCisgICAgbXBmcl90cnVuYyhuLm1wZnJfcHRyKCksdi5tcGZyX3NyY3B0cigpKTsNCisgICAgcmV0dXJuIGY7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpjaGVja19yYW5nZSAoaW50IHQsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfY2hlY2tfcmFuZ2UobXBmcl9wdHIoKSx0LHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGludCBtcHJlYWw6OnN1Ym5vcm1hbGl6ZSAoaW50IHQsbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpbnQgciA9IG1wZnJfc3Vibm9ybWFsaXplKG1wZnJfcHRyKCksdCxybmRfbW9kZSk7DQorICAgIE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKyAgICByZXR1cm4gcjsNCit9DQorDQoraW5saW5lIG1wX2V4cF90IG1wcmVhbDo6Z2V0X2VtaW4gKHZvaWQpDQorew0KKyAgICByZXR1cm4gbXBmcl9nZXRfZW1pbigpOw0KK30NCisNCitpbmxpbmUgaW50IG1wcmVhbDo6c2V0X2VtaW4gKG1wX2V4cF90IGV4cCkNCit7DQorICAgIHJldHVybiBtcGZyX3NldF9lbWluKGV4cCk7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9lbWF4ICh2b2lkKQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfZ2V0X2VtYXgoKTsNCit9DQorDQoraW5saW5lIGludCBtcHJlYWw6OnNldF9lbWF4IChtcF9leHBfdCBleHApDQorew0KKyAgICByZXR1cm4gbXBmcl9zZXRfZW1heChleHApOw0KK30NCisNCitpbmxpbmUgbXBfZXhwX3QgbXByZWFsOjpnZXRfZW1pbl9taW4gKHZvaWQpDQorew0KKyAgICByZXR1cm4gbXBmcl9nZXRfZW1pbl9taW4oKTsNCit9DQorDQoraW5saW5lIG1wX2V4cF90IG1wcmVhbDo6Z2V0X2VtaW5fbWF4ICh2b2lkKQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfZ2V0X2VtaW5fbWF4KCk7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9lbWF4X21pbiAodm9pZCkNCit7DQorICAgIHJldHVybiBtcGZyX2dldF9lbWF4X21pbigpOw0KK30NCisNCitpbmxpbmUgbXBfZXhwX3QgbXByZWFsOjpnZXRfZW1heF9tYXggKHZvaWQpDQorew0KKyAgICByZXR1cm4gbXBmcl9nZXRfZW1heF9tYXgoKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBNYXRoZW1hdGljYWwgRnVuY3Rpb25zDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjZGVmaW5lIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoZikgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgIG1wcmVhbCB5KDAsIG1wZnJfZ2V0X3ByZWMoeC5tcGZyX3NyY3B0cigpKSk7ICAgICAgICAgIFwNCisgICAgICAgIG1wZnJfIyNmKHkubXBmcl9wdHIoKSwgeC5tcGZyX3NyY3B0cigpLCByKTsgICAgICAgICAgIFwNCisgICAgICAgIHJldHVybiB5Ow0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FyICAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShzcXIgKTsgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydCAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShzcXJ0KTsgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCB1bnNpZ25lZCBsb25nIGludCB4LCBtcF9ybmRfdCByKQ0KK3sNCisgICAgbXByZWFsIHk7DQorICAgIG1wZnJfc3FydF91aSh5Lm1wZnJfcHRyKCksIHgsIHIpOw0KKyAgICByZXR1cm4geTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IHVuc2lnbmVkIGludCB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBzcXJ0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50Pih2KSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCBsb25nIGludCB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmICh2Pj0wKSAgIHJldHVybiBzcXJ0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50Pih2KSxybmRfbW9kZSk7DQorICAgIGVsc2UgICAgICAgIHJldHVybiBtcHJlYWwoKS5zZXROYW4oKTsgLy8gTmFODQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAodj49MCkgICByZXR1cm4gc3FydChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4odikscm5kX21vZGUpOw0KKyAgICBlbHNlICAgICAgICByZXR1cm4gbXByZWFsKCkuc2V0TmFuKCk7IC8vIE5hTg0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHJvb3QoY29uc3QgbXByZWFsJiB4LCB1bnNpZ25lZCBsb25nIGludCBrLCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCB5KDAsIG1wZnJfZ2V0X3ByZWMoeC5tcGZyX3NyY3B0cigpKSk7DQorICAgIG1wZnJfcm9vdCh5Lm1wZnJfcHRyKCksIHgubXBmcl9zcmNwdHIoKSwgaywgcik7DQorICAgIHJldHVybiB5Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGRpbShjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeSgwLCBtcGZyX2dldF9wcmVjKGEubXBmcl9zcmNwdHIoKSkpOw0KKyAgICBtcGZyX2RpbSh5Lm1wZnJfcHRyKCksIGEubXBmcl9zcmNwdHIoKSwgYi5tcGZyX3NyY3B0cigpLCByKTsNCisgICAgcmV0dXJuIHk7DQorfQ0KKw0KK2lubGluZSBpbnQgY21wYWJzKGNvbnN0IG1wcmVhbCYgYSxjb25zdCBtcHJlYWwmIGIpDQorew0KKyAgICByZXR1cm4gbXBmcl9jbXBhYnMoYS5tcGZyX3B0cigpLCBiLm1wZnJfc3JjcHRyKCkpOw0KK30NCisNCitpbmxpbmUgaW50IHNpbl9jb3MobXByZWFsJiBzLCBtcHJlYWwmIGMsIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfc2luX2NvcyhzLm1wZnJfcHRyKCksIGMubXBmcl9wdHIoKSwgdi5tcGZyX3NyY3B0cigpLCBybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydCAgKGNvbnN0IGxvbmcgZG91YmxlIHYsIG1wX3JuZF90IHJuZF9tb2RlKSAgICB7ICAgcmV0dXJuIHNxcnQobXByZWFsKHYpLHJuZF9tb2RlKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydCAgKGNvbnN0IGRvdWJsZSB2LCBtcF9ybmRfdCBybmRfbW9kZSkgICAgICAgICB7ICAgcmV0dXJuIHNxcnQobXByZWFsKHYpLHJuZF9tb2RlKTsgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY2JydCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNicnQgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZmFicyAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFicyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWJzICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFicyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGxvZyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nMiAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGxvZzIgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nMTAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGxvZzEwKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGV4cCAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwMiAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGV4cDIgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwMTAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGV4cDEwKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgY29zICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNvcyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgc2luICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHNpbiAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgdGFuICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHRhbiAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgc2VjICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHNlYyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgY3NjICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNzYyAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgY290ICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNvdCAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNvcyAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFjb3MgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXNpbiAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFzaW4gKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXRhbiAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGF0YW4gKTsgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nYiAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gbG9nMiAoYWJzKHgpLHIpOyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNvdCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYXRhbiAoMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXNlYyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYWNvcyAoMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNzYyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYXNpbiAoMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNvdGggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYXRhbmgoMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXNlY2ggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYWNvc2goMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNzY2ggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICByZXR1cm4gYXNpbmgoMS92LCByKTsgICAgICAgICAgICAgICAgICAgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29zaCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNvc2ggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgc2luaCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHNpbmggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgdGFuaCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHRhbmggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgc2VjaCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHNlY2ggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgY3NjaCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNzY2ggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgY290aCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGNvdGggKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNvc2ggKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFjb3NoKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXNpbmggKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFzaW5oKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYXRhbmggKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGF0YW5oKTsgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nMXAgICAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkobG9nMXAgICk7ICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIGV4cG0xICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGV4cG0xICApOyAgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCBlaW50ICAgIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShlaW50ICAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZ2FtbWEgICAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoZ2FtbWEgICk7ICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIHRnYW1tYSAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGdhbW1hICApOyAgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCBsbmdhbW1hIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShsbmdhbW1hKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgemV0YSAgICAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoemV0YSAgICk7ICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIGVyZiAgICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGVyZiAgICApOyAgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCBlcmZjICAgIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShlcmZjICAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYmVzc2VsajAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoajAgICAgICk7ICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIGJlc3NlbGoxKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGoxICAgICApOyAgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCBiZXNzZWx5MChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWSh5MCAgICAgKTsgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgYmVzc2VseTEoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoeTEgICAgICk7ICAgIH0NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGF0YW4yIChjb25zdCBtcHJlYWwmIHksIGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGEoMCwoc3RkOjptYXgpKHkuZ2V0UHJlY2lzaW9uKCksIHguZ2V0UHJlY2lzaW9uKCkpKTsNCisgICAgbXBmcl9hdGFuMihhLm1wZnJfcHRyKCksIHkubXBmcl9zcmNwdHIoKSwgeC5tcGZyX3NyY3B0cigpLCBybmRfbW9kZSk7DQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGh5cG90IChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGEoMCwoc3RkOjptYXgpKHkuZ2V0UHJlY2lzaW9uKCksIHguZ2V0UHJlY2lzaW9uKCkpKTsNCisgICAgbXBmcl9oeXBvdChhLm1wZnJfcHRyKCksIHgubXBmcl9zcmNwdHIoKSwgeS5tcGZyX3NyY3B0cigpLCBybmRfbW9kZSk7DQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHJlbWFpbmRlciAoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCBhKDAsKHN0ZDo6bWF4KSh5LmdldFByZWNpc2lvbigpLCB4LmdldFByZWNpc2lvbigpKSk7DQorICAgIG1wZnJfcmVtYWluZGVyKGEubXBmcl9wdHIoKSwgeC5tcGZyX3NyY3B0cigpLCB5Lm1wZnJfc3JjcHRyKCksIHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcmVtcXVvIChsb25nKiBxLCBjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGEoMCwoc3RkOjptYXgpKHkuZ2V0UHJlY2lzaW9uKCksIHguZ2V0UHJlY2lzaW9uKCkpKTsNCisgICAgbXBmcl9yZW1xdW8oYS5tcGZyX3B0cigpLHEsIHgubXBmcl9zcmNwdHIoKSwgeS5tcGZyX3NyY3B0cigpLCBybmRfbW9kZSk7DQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZhY191aSAodW5zaWduZWQgbG9uZyBpbnQgdiwgbXBfcHJlY190IHByZWMgICAgID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX3JuZF90ICBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeCgwLCBwcmVjKTsNCisgICAgbXBmcl9mYWNfdWkoeC5tcGZyX3B0cigpLHYscm5kX21vZGUpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsZ2FtbWEgKGNvbnN0IG1wcmVhbCYgdiwgaW50ICpzaWducCA9IDAsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCB4KHYpOw0KKyAgICBpbnQgdHNpZ25wOw0KKw0KKyAgICBpZihzaWducCkgICBtcGZyX2xnYW1tYSh4Lm1wZnJfcHRyKCksICBzaWducCx2Lm1wZnJfc3JjcHRyKCkscm5kX21vZGUpOw0KKyAgICBlbHNlICAgICAgICBtcGZyX2xnYW1tYSh4Lm1wZnJfcHRyKCksJnRzaWducCx2Lm1wZnJfc3JjcHRyKCkscm5kX21vZGUpOw0KKw0KKyAgICByZXR1cm4geDsNCit9DQorDQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBiZXNzZWxqbiAobG9uZyBuLCBjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsICB5KDAsIHguZ2V0UHJlY2lzaW9uKCkpOw0KKyAgICBtcGZyX2puKHkubXBmcl9wdHIoKSwgbiwgeC5tcGZyX3NyY3B0cigpLCByKTsNCisgICAgcmV0dXJuIHk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYmVzc2VseW4gKGxvbmcgbiwgY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCAgeSgwLCB4LmdldFByZWNpc2lvbigpKTsNCisgICAgbXBmcl95bih5Lm1wZnJfcHRyKCksIG4sIHgubXBmcl9zcmNwdHIoKSwgcik7DQorICAgIHJldHVybiB5Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZtYSAoY29uc3QgbXByZWFsJiB2MSwgY29uc3QgbXByZWFsJiB2MiwgY29uc3QgbXByZWFsJiB2MywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGE7DQorICAgIG1wX3ByZWNfdCBwMSwgcDIsIHAzOw0KKw0KKyAgICBwMSA9IHYxLmdldF9wcmVjKCk7DQorICAgIHAyID0gdjIuZ2V0X3ByZWMoKTsNCisgICAgcDMgPSB2My5nZXRfcHJlYygpOw0KKw0KKyAgICBhLnNldF9wcmVjKHAzPnAyPyhwMz5wMT9wMzpwMSk6KHAyPnAxP3AyOnAxKSk7DQorDQorICAgIG1wZnJfZm1hKGEubXAsdjEubXAsdjIubXAsdjMubXAscm5kX21vZGUpOw0KKyAgICByZXR1cm4gYTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBmbXMgKGNvbnN0IG1wcmVhbCYgdjEsIGNvbnN0IG1wcmVhbCYgdjIsIGNvbnN0IG1wcmVhbCYgdjMsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCBhOw0KKyAgICBtcF9wcmVjX3QgcDEsIHAyLCBwMzsNCisNCisgICAgcDEgPSB2MS5nZXRfcHJlYygpOw0KKyAgICBwMiA9IHYyLmdldF9wcmVjKCk7DQorICAgIHAzID0gdjMuZ2V0X3ByZWMoKTsNCisNCisgICAgYS5zZXRfcHJlYyhwMz5wMj8ocDM+cDE/cDM6cDEpOihwMj5wMT9wMjpwMSkpOw0KKw0KKyAgICBtcGZyX2ZtcyhhLm1wLHYxLm1wLHYyLm1wLHYzLm1wLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYWdtIChjb25zdCBtcHJlYWwmIHYxLCBjb25zdCBtcHJlYWwmIHYyLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgYTsNCisgICAgbXBfcHJlY190IHAxLCBwMjsNCisNCisgICAgcDEgPSB2MS5nZXRfcHJlYygpOw0KKyAgICBwMiA9IHYyLmdldF9wcmVjKCk7DQorDQorICAgIGEuc2V0X3ByZWMocDE+cDI/cDE6cDIpOw0KKw0KKyAgICBtcGZyX2FnbShhLm1wLCB2MS5tcCwgdjIubXAsIHJuZF9tb2RlKTsNCisNCisgICAgcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3VtIChjb25zdCBtcHJlYWwgdGFiW10sIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IG4sIGludCYgc3RhdHVzLCBtcF9ybmRfdCBtb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wZnJfc3JjcHRyICpwID0gbmV3IG1wZnJfc3JjcHRyW25dOw0KKw0KKyAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaW50ICBpID0gMDsgaSA8IG47IGkrKykNCisgICAgICAgIHBbaV0gPSB0YWJbaV0ubXBmcl9zcmNwdHIoKTsNCisNCisgICAgbXByZWFsIHg7DQorICAgIHN0YXR1cyA9IG1wZnJfc3VtKHgubXBmcl9wdHIoKSwgKG1wZnJfcHRyKilwLCBuLCBtb2RlKTsNCisNCisgICAgZGVsZXRlIFtdIHA7DQorICAgIHJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIE1QRlIgMi40LjAgU3BlY2lmaWNzDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorDQoraW5saW5lIGludCBzaW5oX2Nvc2gobXByZWFsJiBzLCBtcHJlYWwmIGMsIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgcmV0dXJuIG1wZnJfc2luaF9jb3NoKHMubXAsYy5tcCx2Lm1wLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsaTIgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGxpMik7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcmVtIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgLyogIFIgPSByZW0oWCxZKSBpZiBZICE9IDAsIHJldHVybnMgWCAtIG4gKiBZIHdoZXJlIG4gPSB0cnVuYyhYL1kpLiAqLw0KKyAgICByZXR1cm4gZm1vZCh4LCB5LCBybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbW9kIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgKHZvaWQpcm5kX21vZGU7DQorDQorICAgIC8qDQorDQorICAgIG0gPSBtb2QoeCx5KSBpZiB5ICE9IDAsIHJldHVybnMgeCAtIG4qeSB3aGVyZSBuID0gZmxvb3IoeC95KQ0KKw0KKyAgICBUaGUgZm9sbG93aW5nIGFyZSB0cnVlIGJ5IGNvbnZlbnRpb246DQorICAgIC0gbW9kKHgsMCkgaXMgeA0KKyAgICAtIG1vZCh4LHgpIGlzIDANCisgICAgLSBtb2QoeCx5KSBmb3IgeCAhPSB5IGFuZCB5ICE9IDAgaGFzIHRoZSBzYW1lIHNpZ24gYXMgeS4NCisNCisgICAgKi8NCisNCisgICAgaWYoaXN6ZXJvKHkpKSByZXR1cm4geDsNCisgICAgaWYoeCA9PSB5KSByZXR1cm4gMDsNCisNCisgICAgbXByZWFsIG0gPSB4IC0gZmxvb3IoeCAvIHkpICogeTsNCisNCisgICAgbS5zZXRTaWduKHNnbih5KSk7IC8vIG1ha2Ugc3VyZSByZXN1bHQgaGFzIHRoZSBzYW1lIHNpZ24gYXMgWQ0KKw0KKyAgICByZXR1cm4gbTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBmbW9kIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGE7DQorICAgIG1wX3ByZWNfdCB5cCwgeHA7DQorDQorICAgIHlwID0geS5nZXRfcHJlYygpOw0KKyAgICB4cCA9IHguZ2V0X3ByZWMoKTsNCisNCisgICAgYS5zZXRfcHJlYyh5cD54cD95cDp4cCk7DQorDQorICAgIG1wZnJfZm1vZChhLm1wLCB4Lm1wLCB5Lm1wLCBybmRfbW9kZSk7DQorDQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHJlY19zcXJ0KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHgodik7DQorICAgIG1wZnJfcmVjX3NxcnQoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKyNlbmRpZiAvLyAgTVBGUiAyLjQuMCBTcGVjaWZpY3MNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIE1QRlIgMy4wLjAgU3BlY2lmaWNzDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQoraW5saW5lIGNvbnN0IG1wcmVhbCBkaWdhbW1hIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShkaWdhbW1hKTsgICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIGFpICAgICAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKGFpKTsgICAgICAgICAgfQ0KKyNlbmRpZiAvLyBNUEZSIDMuMC4wIFNwZWNpZmljcw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ29uc3RhbnRzDQoraW5saW5lIGNvbnN0IG1wcmVhbCBjb25zdF9sb2cyIChtcF9wcmVjX3QgcCA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpLCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCB4KDAsIHApOw0KKyAgICBtcGZyX2NvbnN0X2xvZzIoeC5tcGZyX3B0cigpLCByKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29uc3RfcGkgKG1wX3ByZWNfdCBwID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHgoMCwgcCk7DQorICAgIG1wZnJfY29uc3RfcGkoeC5tcGZyX3B0cigpLCByKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29uc3RfZXVsZXIgKG1wX3ByZWNfdCBwID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCksIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHgoMCwgcCk7DQorICAgIG1wZnJfY29uc3RfZXVsZXIoeC5tcGZyX3B0cigpLCByKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29uc3RfY2F0YWxhbiAobXBfcHJlY190IHAgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeCgwLCBwKTsNCisgICAgbXBmcl9jb25zdF9jYXRhbGFuKHgubXBmcl9wdHIoKSwgcik7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGNvbnN0X2luZmluaXR5IChpbnQgc2lnbiA9IDEsIG1wX3ByZWNfdCBwID0gbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpDQorew0KKyAgICBtcHJlYWwgeCgwLCBwKTsNCisgICAgbXBmcl9zZXRfaW5mKHgubXBmcl9wdHIoKSwgc2lnbik7DQorICAgIHJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEludGVnZXIgUmVsYXRlZCBGdW5jdGlvbnMNCitpbmxpbmUgY29uc3QgbXByZWFsIGNlaWwoY29uc3QgbXByZWFsJiB2KQ0KK3sNCisgICAgbXByZWFsIHgodik7DQorICAgIG1wZnJfY2VpbCh4Lm1wLHYubXApOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBmbG9vcihjb25zdCBtcHJlYWwmIHYpDQorew0KKyAgICBtcHJlYWwgeCh2KTsNCisgICAgbXBmcl9mbG9vcih4Lm1wLHYubXApOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCByb3VuZChjb25zdCBtcHJlYWwmIHYpDQorew0KKyAgICBtcHJlYWwgeCh2KTsNCisgICAgbXBmcl9yb3VuZCh4Lm1wLHYubXApOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCB0cnVuYyhjb25zdCBtcHJlYWwmIHYpDQorew0KKyAgICBtcHJlYWwgeCh2KTsNCisgICAgbXBmcl90cnVuYyh4Lm1wLHYubXApOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCByaW50ICAgICAgIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShyaW50ICAgICAgKTsgICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIHJpbnRfY2VpbCAgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHJpbnRfY2VpbCApOyAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgcmludF9mbG9vciAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkocmludF9mbG9vcik7ICAgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCByaW50X3JvdW5kIChjb25zdCBtcHJlYWwmIHgsIG1wX3JuZF90IHIgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKSB7ICAgTVBSRUFMX1VOQVJZX01BVEhfRlVOQ1RJT05fQk9EWShyaW50X3JvdW5kKTsgICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIHJpbnRfdHJ1bmMgKGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3QgciA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpIHsgICBNUFJFQUxfVU5BUllfTUFUSF9GVU5DVElPTl9CT0RZKHJpbnRfdHJ1bmMpOyAgICAgfQ0KK2lubGluZSBjb25zdCBtcHJlYWwgZnJhYyAgICAgICAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCByID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkgeyAgIE1QUkVBTF9VTkFSWV9NQVRIX0ZVTkNUSU9OX0JPRFkoZnJhYyAgICAgICk7ICAgICB9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucw0KK2lubGluZSB2b2lkICAgICAgICAgc3dhcCAobXByZWFsJiBhLCBtcHJlYWwmIGIpICAgICAgICAgICAgeyAgICBtcGZyX3N3YXAoYS5tcCxiLm1wKTsgICB9DQoraW5saW5lIGNvbnN0IG1wcmVhbCAobWF4KShjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSl7ICAgIHJldHVybiAoeD55P3g6eSk7ICAgICAgIH0NCitpbmxpbmUgY29uc3QgbXByZWFsIChtaW4pKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5KXsgICAgcmV0dXJuICh4PHk/eDp5KTsgICAgICAgfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZm1heChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIGE7DQorICAgIG1wZnJfbWF4KGEubXAseC5tcCx5Lm1wLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZm1pbihjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCBhOw0KKyAgICBtcGZyX21pbihhLm1wLHgubXAseS5tcCxybmRfbW9kZSk7DQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG5leHR0b3dhcmQgKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5KQ0KK3sNCisgICAgbXByZWFsIGEoeCk7DQorICAgIG1wZnJfbmV4dHRvd2FyZChhLm1wLHkubXApOw0KKyAgICByZXR1cm4gYTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBuZXh0YWJvdmUgIChjb25zdCBtcHJlYWwmIHgpDQorew0KKyAgICBtcHJlYWwgYSh4KTsNCisgICAgbXBmcl9uZXh0YWJvdmUoYS5tcCk7DQorICAgIHJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG5leHRiZWxvdyAgKGNvbnN0IG1wcmVhbCYgeCkNCit7DQorICAgIG1wcmVhbCBhKHgpOw0KKyAgICBtcGZyX25leHRiZWxvdyhhLm1wKTsNCisgICAgcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgdXJhbmRvbWIgKGdtcF9yYW5kc3RhdGVfdCYgc3RhdGUpDQorew0KKyAgICBtcHJlYWwgeDsNCisgICAgbXBmcl91cmFuZG9tYih4Lm1wZnJfcHRyKCksc3RhdGUpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQoraW5saW5lIGNvbnN0IG1wcmVhbCB1cmFuZG9tIChnbXBfcmFuZHN0YXRlX3QmIHN0YXRlLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeDsNCisgICAgbXBmcl91cmFuZG9tKHgubXBmcl9wdHIoKSwgc3RhdGUsIHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OIDw9IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDIpKQ0KK2lubGluZSBjb25zdCBtcHJlYWwgcmFuZG9tMiAobXBfc2l6ZV90IHNpemUsIG1wX2V4cF90IGV4cCkNCit7DQorICAgIG1wcmVhbCB4Ow0KKyAgICBtcGZyX3JhbmRvbTIoeC5tcGZyX3B0cigpLHNpemUsZXhwKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKyNlbmRpZg0KKw0KKy8vIFVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24NCisvLyBhID0gcmFuZG9tKHNlZWQpOyA8LSBpbml0aWFsaXphdGlvbiAmIGZpcnN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbg0KKy8vIGEgPSByYW5kb20oKTsgICAgIDwtIG5leHQgcmFuZG9tIG51bWJlcnMgZ2VuZXJhdGlvbg0KKy8vIHNlZWQgIT0gMA0KK2lubGluZSBjb25zdCBtcHJlYWwgcmFuZG9tKHVuc2lnbmVkIGludCBzZWVkID0gMCkNCit7DQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQorICAgIHN0YXRpYyBnbXBfcmFuZHN0YXRlX3Qgc3RhdGU7DQorICAgIHN0YXRpYyBib29sIGluaXRpYWxpemUgPSB0cnVlOw0KKw0KKyAgICBpZihpbml0aWFsaXplKQ0KKyAgICB7DQorICAgICAgICBnbXBfcmFuZGluaXRfZGVmYXVsdChzdGF0ZSk7DQorICAgICAgICBnbXBfcmFuZHNlZWRfdWkoc3RhdGUsMCk7DQorICAgICAgICBpbml0aWFsaXplID0gZmFsc2U7DQorICAgIH0NCisNCisgICAgaWYoc2VlZCAhPSAwKSAgICBnbXBfcmFuZHNlZWRfdWkoc3RhdGUsc2VlZCk7DQorDQorICAgIHJldHVybiBtcGZyOjp1cmFuZG9tKHN0YXRlKTsNCisjZWxzZQ0KKyAgICBpZihzZWVkICE9IDApICAgIHN0ZDo6c3JhbmQoc2VlZCk7DQorICAgIHJldHVybiBtcGZyOjptcHJlYWwoc3RkOjpyYW5kKCkvKGRvdWJsZSlSQU5EX01BWCk7DQorI2VuZGlmDQorDQorfQ0KKw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMywxLDApKQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZ3JhbmRvbSAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHg7DQorICAgIG1wZnJfZ3JhbmRvbSh4Lm1wZnJfcHRyKCksIE5VTEwsIHN0YXRlLCBybmRfbW9kZSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGdyYW5kb20odW5zaWduZWQgaW50IHNlZWQgPSAwKQ0KK3sNCisgICAgc3RhdGljIGdtcF9yYW5kc3RhdGVfdCBzdGF0ZTsNCisgICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZSA9IHRydWU7DQorDQorICAgIGlmKGluaXRpYWxpemUpDQorICAgIHsNCisgICAgICAgIGdtcF9yYW5kaW5pdF9kZWZhdWx0KHN0YXRlKTsNCisgICAgICAgIGdtcF9yYW5kc2VlZF91aShzdGF0ZSwwKTsNCisgICAgICAgIGluaXRpYWxpemUgPSBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBpZihzZWVkICE9IDApIGdtcF9yYW5kc2VlZF91aShzdGF0ZSxzZWVkKTsNCisNCisgICAgcmV0dXJuIG1wZnI6OmdyYW5kb20oc3RhdGUpOw0KK30NCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFNldC9HZXQgZ2xvYmFsIHByb3BlcnRpZXMNCitpbmxpbmUgdm9pZCBtcHJlYWw6OnNldF9kZWZhdWx0X3ByZWMobXBfcHJlY190IHByZWMpDQorew0KKyAgICBtcGZyX3NldF9kZWZhdWx0X3ByZWMocHJlYyk7DQorfQ0KKw0KK2lubGluZSB2b2lkIG1wcmVhbDo6c2V0X2RlZmF1bHRfcm5kKG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgbXBmcl9zZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGJvb2wgbXByZWFsOjpmaXRzX2luX2JpdHMoZG91YmxlIHgsIGludCBuKQ0KK3sNCisgICAgaW50IGk7DQorICAgIGRvdWJsZSB0Ow0KKyAgICByZXR1cm4gSXNJbmYoeCkgfHwgKHN0ZDo6bW9kZiAoIHN0ZDo6bGRleHAgKCBzdGQ6OmZyZXhwICggeCwgJmkgKSwgbiApLCAmdCApID09IDAuMCk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeChhKTsNCisgICAgbXBmcl9wb3coeC5tcCx4Lm1wLGIubXAscm5kX21vZGUpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHpfdCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCkpDQorew0KKyAgICBtcHJlYWwgeChhKTsNCisgICAgbXBmcl9wb3dfeih4Lm1wLHgubXAsYixybmRfbW9kZSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCB4KGEpOw0KKyAgICBtcGZyX3Bvd191aSh4Lm1wLHgubXAsYixybmRfbW9kZSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3coYSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpnZXRfZGVmYXVsdF9ybmQoKSkNCit7DQorICAgIG1wcmVhbCB4KGEpOw0KKyAgICBtcGZyX3Bvd19zaSh4Lm1wLHgubXAsYixybmRfbW9kZSk7DQorICAgIHJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3coYSxzdGF0aWNfY2FzdDxsb25nIGludD4oYikscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpKQ0KK3sNCisgICAgbXByZWFsIHgoYSk7DQorICAgIG1wZnJfdWlfcG93KHgubXAsYSxiLm1wLHJuZF9tb2RlKTsNCisgICAgcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksYixybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAoYT49MCkgICAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOw0KKyAgICBlbHNlICAgICAgICAgIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPj0wKSAgICAgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksYixybmRfbW9kZSk7DQorICAgIGVsc2UgICAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsNCit9DQorDQorLy8gcG93IHVuc2lnbmVkIGxvbmcgaW50DQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBtcHJlYWwgeChhKTsNCisgICAgbXBmcl91aV9wb3dfdWkoeC5tcCxhLGIscm5kX21vZGUpOw0KKyAgICByZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhhLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZihiPjApICAgIHJldHVybiBwb3coYSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorICAgIGVsc2UgICAgICAgcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgaWYoYj4wKSAgICByZXR1cm4gcG93KGEsc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICBlbHNlICAgICAgIHJldHVybiBwb3coYSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQorLy8gcG93IHVuc2lnbmVkIGludA0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICBlbHNlICAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICBlbHNlICAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KK30NCisNCisvLyBwb3cgbG9uZyBpbnQNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorICAgIGVsc2UgICAgIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvL21wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7ICAvL21wZnJfdWlfcG93X3VpDQorICAgIGVsc2UgICAgIHJldHVybiBwb3cobXByZWFsKGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAoYT4wKQ0KKyAgICB7DQorICAgICAgICBpZihiPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCisgICAgICAgIGVsc2UgICAgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKyAgICB9ZWxzZXsNCisgICAgICAgIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KKyAgICB9DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApDQorICAgIHsNCisgICAgICAgIGlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICAgICAgZWxzZSAgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorICAgIH1lbHNlew0KKyAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy8gbXBmcl9wb3dfc2kNCisgICAgfQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPj0wKSAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCisgICAgZWxzZSAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3Bvdw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAoYT49MCkgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorICAgIGVsc2UgICAgICAgIHJldHVybiBwb3cobXByZWFsKGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl9wb3cNCit9DQorDQorLy8gcG93IGludA0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorICAgIGVsc2UgICAgIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvL21wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAoYT4wKSByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICBlbHNlICAgICByZXR1cm4gcG93KG1wcmVhbChhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvL21wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApDQorICAgIHsNCisgICAgICAgIGlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICAgICAgZWxzZSAgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorICAgIH1lbHNlew0KKyAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7IC8vIG1wZnJfcG93X3NpDQorICAgIH0NCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPjApDQorICAgIHsNCisgICAgICAgIGlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKyAgICAgICAgZWxzZSAgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorICAgIH1lbHNlew0KKyAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy8gbXBmcl9wb3dfc2kNCisgICAgfQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgbG9uZyBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICBpZiAoYT49MCkgICByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorICAgIGVsc2UgICAgICAgIHJldHVybiBwb3cobXByZWFsKGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIGlmIChhPj0wKSAgIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCisgICAgZWxzZSAgICAgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3Bvdw0KK30NCisNCisvLyBwb3cgbG9uZyBkb3VibGUNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3cobXByZWFsKGEpLG1wcmVhbChiKSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7IC8vbXBmcl9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KG1wcmVhbChhKSxzdGF0aWNfY2FzdDxsb25nIGludD4oYikscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksbXByZWFsKGIpLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisgICAgcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7IC8vIG1wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGRvdWJsZSBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KG1wcmVhbChhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvLyBtcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKyAgICByZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsgLy8gbXBmcl9wb3dfc2kNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorICAgIHJldHVybiBwb3cobXByZWFsKGEpLHN0YXRpY19jYXN0PGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vIG1wZnJfcG93X3NpDQorfQ0KK30gLy8gRW5kIG9mIG1wZnIgbmFtZXNwYWNlDQorDQorLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2Ygc3RkOjpzd2FwIGZvciBtcHJlYWwgbnVtYmVycw0KKy8vIFRodXMgc3RhbmRhcmQgYWxnb3JpdGhtcyB3aWxsIHVzZSBlZmZpY2llbnQgdmVyc2lvbiBvZiBzd2FwIChkdWUgdG8gS29lbmlnIGxvb2t1cCkNCisvLyBOb24tdGhyb3dpbmcgc3dhcCBDKysgaWRpb206IGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvTW9yZV9DJTJCJTJCX0lkaW9tcy9Ob24tdGhyb3dpbmdfc3dhcA0KK25hbWVzcGFjZSBzdGQNCit7DQorICAvLyB3ZSBhcmUgYWxsb3dlZCB0byBleHRlbmQgbmFtZXNwYWNlIHN0ZCB3aXRoIHNwZWNpYWxpemF0aW9ucyBvbmx5DQorICAgIHRlbXBsYXRlIDw+DQorICAgIGlubGluZSB2b2lkIHN3YXAobXBmcjo6bXByZWFsJiB4LCBtcGZyOjptcHJlYWwmIHkpDQorICAgIHsNCisgICAgICAgIHJldHVybiBtcGZyOjpzd2FwKHgsIHkpOw0KKyAgICB9DQorDQorICAgIHRlbXBsYXRlPD4NCisgICAgY2xhc3MgbnVtZXJpY19saW1pdHM8bXBmcjo6bXByZWFsPg0KKyAgICB7DQorICAgIHB1YmxpYzoNCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkICAgID0gdHJ1ZTsNCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCAgICAgICAgID0gdHJ1ZTsNCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgICAgICAgID0gZmFsc2U7DQorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCAgICAgICAgICA9IGZhbHNlOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGludCAgcmFkaXggICAgICAgICAgICAgPSAyOw0KKw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ICAgICAgPSB0cnVlOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiAgICAgPSB0cnVlOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSB0cnVlOw0KKw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ICAgICAgICAgPSB0cnVlOyAgICAgICAgLy8gPSBJRUVFIDc1NA0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCAgICAgICAgPSB0cnVlOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvICAgICAgICAgPSBmYWxzZTsNCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzICAgICAgICAgICAgID0gdHJ1ZTsNCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSAgID0gdHJ1ZTsNCisNCisgICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAgPSBkZW5vcm1fYWJzZW50Ow0KKw0KKyAgICAgICAgaW5saW5lIHN0YXRpYyBtcGZyOjptcHJlYWwgKG1pbikgICAgKG1wX3ByZWNfdCBwcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgeyAgcmV0dXJuICBtcGZyOjptaW52YWwocHJlY2lzaW9uKTsgIH0NCisgICAgICAgIGlubGluZSBzdGF0aWMgbXBmcjo6bXByZWFsIChtYXgpICAgIChtcF9wcmVjX3QgcHJlY2lzaW9uID0gbXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpIHsgIHJldHVybiAgbXBmcjo6bWF4dmFsKHByZWNpc2lvbik7ICB9DQorICAgICAgICBpbmxpbmUgc3RhdGljIG1wZnI6Om1wcmVhbCBsb3dlc3QgICAobXBfcHJlY190IHByZWNpc2lvbiA9IG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKSB7ICByZXR1cm4gLW1wZnI6Om1heHZhbChwcmVjaXNpb24pOyAgfQ0KKw0KKyAgICAgICAgLy8gUmV0dXJucyBzbWFsbGVzdCBlcHMgc3VjaCB0aGF0IDEgKyBlcHMgIT0gMSAoY2xhc3NpYyBtYWNoaW5lIGVwc2lsb24pDQorICAgICAgICBpbmxpbmUgc3RhdGljIG1wZnI6Om1wcmVhbCBlcHNpbG9uKG1wX3ByZWNfdCBwcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkgeyAgcmV0dXJuICBtcGZyOjptYWNoaW5lX2Vwc2lsb24ocHJlY2lzaW9uKTsgfQ0KKw0KKyAgICAgICAgLy8gUmV0dXJucyBzbWFsbGVzdCBlcHMgc3VjaCB0aGF0IHggKyBlcHMgIT0geCAocmVsYXRpdmUgbWFjaGluZSBlcHNpbG9uKQ0KKyAgICAgICAgaW5saW5lIHN0YXRpYyBtcGZyOjptcHJlYWwgZXBzaWxvbihjb25zdCBtcGZyOjptcHJlYWwmIHgpIHsgIHJldHVybiBtcGZyOjptYWNoaW5lX2Vwc2lsb24oeCk7ICB9DQorDQorICAgICAgICBpbmxpbmUgc3RhdGljIG1wZnI6Om1wcmVhbCByb3VuZF9lcnJvcihtcF9wcmVjX3QgcHJlY2lzaW9uID0gbXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpDQorICAgICAgICB7DQorICAgICAgICAgICAgbXBfcm5kX3QgciA9IG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcm5kKCk7DQorDQorICAgICAgICAgICAgaWYociA9PSBHTVBfUk5ETikgIHJldHVybiBtcGZyOjptcHJlYWwoMC41LCBwcmVjaXNpb24pOw0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICByZXR1cm4gbXBmcjo6bXByZWFsKDEuMCwgcHJlY2lzaW9uKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlubGluZSBzdGF0aWMgY29uc3QgbXBmcjo6bXByZWFsIGluZmluaXR5KCkgICAgICAgICB7IHJldHVybiBtcGZyOjpjb25zdF9pbmZpbml0eSgpOyAgICAgfQ0KKyAgICAgICAgaW5saW5lIHN0YXRpYyBjb25zdCBtcGZyOjptcHJlYWwgcXVpZXRfTmFOKCkgICAgICAgIHsgcmV0dXJuIG1wZnI6Om1wcmVhbCgpLnNldE5hbigpOyAgICB9DQorICAgICAgICBpbmxpbmUgc3RhdGljIGNvbnN0IG1wZnI6Om1wcmVhbCBzaWduYWxpbmdfTmFOKCkgICAgeyByZXR1cm4gbXBmcjo6bXByZWFsKCkuc2V0TmFuKCk7ICAgIH0NCisgICAgICAgIGlubGluZSBzdGF0aWMgY29uc3QgbXBmcjo6bXByZWFsIGRlbm9ybV9taW4oKSAgICAgICB7IHJldHVybiAobWluKSgpOyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gUGxlYXNlIG5vdGUsIGV4cG9uZW50IHJhbmdlIGlzIG5vdCBmaXhlZCBpbiBNUEZSDQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCA9IE1QRlJfRU1JTl9ERUZBVUxUOw0KKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSBNUEZSX0VNQVhfREVGQVVMVDsNCisgICAgICAgIE1QUkVBTF9QRVJNSVNTSVZFX0VYUFIgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQxMCA9IChpbnQpIChNUEZSX0VNSU5fREVGQVVMVCAqIDAuMzAxMDI5OTk1NjYzOTgxMSk7DQorICAgICAgICBNUFJFQUxfUEVSTUlTU0lWRV9FWFBSIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAgPSAoaW50KSAoTVBGUl9FTUFYX0RFRkFVTFQgKiAwLjMwMTAyOTk5NTY2Mzk4MTEpOw0KKw0KKyNpZmRlZiBNUFJFQUxfSEFWRV9EWU5BTUlDX1NURF9OVU1FUklDX0xJTUlUUw0KKw0KKyAgICAgICAgLy8gRm9sbG93aW5nIG1lbWJlcnMgc2hvdWxkIGJlIGNvbnN0YW50IGFjY29yZGluZyB0byBzdGFuZGFyZCwgYnV0IHRoZXkgY2FuIGJlIHZhcmlhYmxlIGluIE1QRlINCisgICAgICAgIC8vIFNvIHdlIGRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucyBoZXJlLg0KKyAgICAgICAgLy8NCisgICAgICAgIC8vIFRoaXMgaXMgcHJlZmVyYWJsZSB3YXkgZm9yIHN0ZDo6bnVtZXJpY19saW1pdHM8bXBmcjo6bXByZWFsPiBzcGVjaWFsaXphdGlvbi4NCisgICAgICAgIC8vIEJ1dCBpdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBzdGFuZGFyZCBzdGQ6Om51bWVyaWNfbGltaXRzIGFuZCBtaWdodCBub3Qgd29yayB3aXRoIG90aGVyIGxpYnJhcmllcywgZS5nLiBib29zdC4NCisgICAgICAgIC8vIFNlZSBiZWxvdyBmb3IgY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbi4NCisgICAgICAgIGlubGluZSBzdGF0aWMgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1wX3JuZF90IHIgPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpOw0KKw0KKyAgICAgICAgICAgIHN3aXRjaCAocikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgY2FzZSBHTVBfUk5ETjogcmV0dXJuIHJvdW5kX3RvX25lYXJlc3Q7DQorICAgICAgICAgICAgY2FzZSBHTVBfUk5EWjogcmV0dXJuIHJvdW5kX3Rvd2FyZF96ZXJvOw0KKyAgICAgICAgICAgIGNhc2UgR01QX1JORFU6IHJldHVybiByb3VuZF90b3dhcmRfaW5maW5pdHk7DQorICAgICAgICAgICAgY2FzZSBHTVBfUk5ERDogcmV0dXJuIHJvdW5kX3Rvd2FyZF9uZWdfaW5maW5pdHk7DQorICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHJvdW5kX2luZGV0ZXJtaW5hdGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW5saW5lIHN0YXRpYyBpbnQgZGlnaXRzKCkgICAgICAgICAgICAgICAgICAgICAgICB7ICAgIHJldHVybiBpbnQobXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkpOyAgICB9DQorICAgICAgICBpbmxpbmUgc3RhdGljIGludCBkaWdpdHMoY29uc3QgbXBmcjo6bXByZWFsJiB4KSAgIHsgICAgcmV0dXJuIHguZ2V0UHJlY2lzaW9uKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgIGlubGluZSBzdGF0aWMgaW50IGRpZ2l0czEwKG1wX3ByZWNfdCBwcmVjaXNpb24gPSBtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbXBmcjo6Yml0czJkaWdpdHMocHJlY2lzaW9uKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlubGluZSBzdGF0aWMgaW50IGRpZ2l0czEwKGNvbnN0IG1wZnI6Om1wcmVhbCYgeCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gbXBmcjo6Yml0czJkaWdpdHMoeC5nZXRQcmVjaXNpb24oKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBpbmxpbmUgc3RhdGljIGludCBtYXhfZGlnaXRzMTAobXBfcHJlY190IHByZWNpc2lvbiA9IG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJldHVybiBkaWdpdHMxMChwcmVjaXNpb24pOw0KKyAgICAgICAgfQ0KKyNlbHNlDQorICAgICAgICAvLyBEaWdpdHMgYW5kIHJvdW5kX3N0eWxlIGFyZSBOT1QgY29uc3RhbnRzIHdoZW4gaXQgY29tZXMgdG8gbXByZWFsLg0KKyAgICAgICAgLy8gSWYgcG9zc2libGUsIHBsZWFzZSB1c2UgZnVuY3Rpb25zIGRpZ2l0cygpIGFuZCByb3VuZF9zdHlsZSgpIGRlZmluZWQgYWJvdmUuDQorICAgICAgICAvLw0KKyAgICAgICAgLy8gVGhlc2UgKGRlZmF1bHQpIHZhbHVlcyBhcmUgcHJlc2VydmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgbGlicmFyaWVzLCBlLmcuIGJvb3N0Lg0KKyAgICAgICAgLy8gQ2hhbmdlIHRoZW0gYWNjb3JkaW5nbHkgdG8geW91ciBhcHBsaWNhdGlvbi4NCisgICAgICAgIC8vDQorICAgICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSAyNTYgYml0cyBvZiBwcmVjaXNpb24gdW5pZm9ybWx5IGluIHlvdXIgcHJvZ3JhbSwgdGhlbjoNCisgICAgICAgIC8vIGRpZ2l0cyAgICAgICA9IDI1Ng0KKyAgICAgICAgLy8gZGlnaXRzMTAgICAgID0gNzcNCisgICAgICAgIC8vIG1heF9kaWdpdHMxMCA9IDc4DQorICAgICAgICAvLw0KKyAgICAgICAgLy8gQXBwcm94aW1hdGUgZm9ybXVsYSBmb3IgZGVjaW1hbCBkaWdpdHMgaXM6IGRpZ2l0czEwID0gZmxvb3IobG9nMTAoMikgKiBkaWdpdHMpLiBTZWUgYml0czJkaWdpdHMoKSBmb3IgbW9yZSBkZXRhaWxzLg0KKw0KKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6ZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b19uZWFyZXN0Ow0KKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgICAgICAgPSA1MzsNCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgICAgID0gMTU7DQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1heF9kaWdpdHMxMCA9IDE2Ow0KKyNlbmRpZg0KKyAgICB9Ow0KKw0KK30NCisNCisjZW5kaWYgLyogX19NUFJFQUxfSF9fICovDQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWxfc3VwcG9ydC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODVlN2VhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWxfc3VwcG9ydC5jcHAKQEAgLTAsMCArMSw2NSBAQAorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9NUFJlYWxTdXBwb3J0PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBtcGZyOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIHRlc3RfbXByZWFsX3N1cHBvcnQoKQoreworICAvLyBzZXQgcHJlY2lzaW9uIHRvIDI1NiBiaXRzIChkb3VibGUgaGFzIG9ubHkgNTMgYml0cykKKyAgbXByZWFsOjpzZXRfZGVmYXVsdF9wcmVjKDI1Nik7CisgIHR5cGVkZWYgTWF0cml4PG1wcmVhbCxFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTWF0cml4WG1wOworICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8bXByZWFsPixFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTWF0cml4WGNtcDsKKworICBzdGQ6OmNlcnIgPDwgImVwc2lsb24gPSAgICAgICAgICIgPDwgTnVtVHJhaXRzPG1wcmVhbD46OmVwc2lsb24oKSA8PCAiXG4iOworICBzdGQ6OmNlcnIgPDwgImR1bW15X3ByZWNpc2lvbiA9ICIgPDwgTnVtVHJhaXRzPG1wcmVhbD46OmR1bW15X3ByZWNpc2lvbigpIDw8ICJcbiI7CisgIHN0ZDo6Y2VyciA8PCAiaGlnaGVzdCA9ICAgICAgICAgIiA8PCBOdW1UcmFpdHM8bXByZWFsPjo6aGlnaGVzdCgpIDw8ICJcbiI7CisgIHN0ZDo6Y2VyciA8PCAibG93ZXN0ID0gICAgICAgICAgIiA8PCBOdW1UcmFpdHM8bXByZWFsPjo6bG93ZXN0KCkgPDwgIlxuIjsKKyAgc3RkOjpjZXJyIDw8ICJkaWdpdHMxMCA9ICAgICAgICAiIDw8IE51bVRyYWl0czxtcHJlYWw+OjpkaWdpdHMxMCgpIDw8ICJcbiI7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMDApOworICAgIE1hdHJpeFhtcCBBID0gTWF0cml4WG1wOjpSYW5kb20ocyxzKTsKKyAgICBNYXRyaXhYbXAgQiA9IE1hdHJpeFhtcDo6UmFuZG9tKHMscyk7CisgICAgTWF0cml4WG1wIFMgPSBBLmFkam9pbnQoKSAqIEE7CisgICAgTWF0cml4WG1wIFg7CisgICAgTWF0cml4WGNtcCBBYyA9IE1hdHJpeFhjbXA6OlJhbmRvbShzLHMpOworICAgIE1hdHJpeFhjbXAgQmMgPSBNYXRyaXhYY21wOjpSYW5kb20ocyxzKTsKKyAgICBNYXRyaXhYY21wIFNjID0gQWMuYWRqb2ludCgpICogQWM7CisgICAgTWF0cml4WGNtcCBYYzsKKyAgICAKKyAgICAvLyBCYXNpYyBzdHVmZnMKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEucmVhbCgpLCBBKTsKKyAgICBWRVJJRlkoRWlnZW46OmludGVybmFsOjppc0FwcHJveChBLmFycmF5KCkuYWJzMigpLnN1bSgpLCBBLnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEuYXJyYXkoKS5leHAoKSwgICAgICAgICBleHAoQS5hcnJheSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuYWJzMigpLnNxcnQoKSwgQS5hcnJheSgpLmFicygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEuYXJyYXkoKS5zaW4oKSwgICAgICAgICBzaW4oQS5hcnJheSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuY29zKCksICAgICAgICAgY29zKEEuYXJyYXkoKSkpOworCisgICAgLy8gQ2hvbGVza3kKKyAgICBYID0gUy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUoQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoUy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkqWCkuZXZhbCgpLEIpOworCisgICAgWGMgPSBTYy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUoQmMpOworICAgIFZFUklGWV9JU19BUFBST1goKFNjLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSpYYykuZXZhbCgpLEJjKTsKKyAgICAKKyAgICAvLyBwYXJ0aWFsIExVCisgICAgWCA9IEEubHUoKS5zb2x2ZShCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChBKlgpLmV2YWwoKSxCKTsKKworICAgIC8vIHN5bW1ldHJpYyBlaWdlbnZhbHVlcworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WG1wPiBlaWcoUyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGVpZy5pbmZvKCksIFN1Y2Nlc3MpOworICAgIFZFUklGWSggKFMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlnLmVpZ2VudmVjdG9ycygpKS5pc0FwcHJveChlaWcuZWlnZW52ZWN0b3JzKCkgKiBlaWcuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCksIE51bVRyYWl0czxtcHJlYWw+OjpkdW1teV9wcmVjaXNpb24oKSoxZTMpICk7CisgIH0KKyAgCisgIHsKKyAgICBNYXRyaXhYbXAgQSg4LDMpOyBBLnNldFJhbmRvbSgpOworICAgIC8vIHRlc3Qgb3V0cHV0IChpbnRlcmVzdGluZyB0aGluZ3MgaGFwcGVuIGluIHRoaXMgY29kZSkKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgc3RyZWFtIDw8IEE7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3Qvb3Blbmdsc3VwcG9ydC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L29wZW5nbHN1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNmE4MTYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L29wZW5nbHN1cHBvcnQuY3BwCkBAIC0wLDAgKzEsMzM3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlIDxtYWluLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8R0wvZ2xldy5oPgorI2luY2x1ZGUgPEVpZ2VuL09wZW5HTFN1cHBvcnQ+CisjaW5jbHVkZSA8R0wvZ2x1dC5oPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisKKworCisjZGVmaW5lIFZFUklGWV9NQVRSSVgoQ09ERSxSRUYpIHsgXAorICAgIGdsTG9hZElkZW50aXR5KCk7IFwKKyAgICBDT0RFOyBcCisgICAgTWF0cml4PGZsb2F0LDQsNCxDb2xNYWpvcj4gbTsgbS5zZXRaZXJvKCk7IFwKKyAgICBnbEdldChHTF9NT0RFTFZJRVdfTUFUUklYLCBtKTsgXAorICAgIGlmKCEoUkVGKS5jYXN0PGZsb2F0PigpLmlzQXBwcm94KG0pKSB7IFwKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQ6XG4iIDw8ICgoUkVGKS5jYXN0PGZsb2F0PigpKSA8PCAiXG4iIDw8ICJnb3RcbiIgPDwgbSA8PCAiXG5cbiI7IFwKKyAgICB9IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSRUYpLmNhc3Q8ZmxvYXQ+KCksIG0pOyBcCisgIH0KKworI2RlZmluZSBWRVJJRllfVU5JRk9STShTVUZGSVgsTkFNRSxUWVBFKSB7IFwKKyAgICBUWVBFIHZhbHVlOyB2YWx1ZS5zZXRSYW5kb20oKTsgXAorICAgIFRZUEUgZGF0YTsgXAorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcmdfaWQsICNOQU1FKTsgXAorICAgIFZFUklGWSgobG9jIT0tMSkgJiYgInVuaWZvcm0gbm90IGZvdW5kIik7IFwKKyAgICBnbFVuaWZvcm0obG9jLHZhbHVlKTsgXAorICAgIEVJR0VOX0NBVChnbEdldFVuaWZvcm0sU1VGRklYKShwcmdfaWQsbG9jLGRhdGEuZGF0YSgpKTsgXAorICAgIGlmKCF2YWx1ZS5pc0FwcHJveChkYXRhKSkgeyBcCisgICAgICBzdGQ6OmNlcnIgPDwgIkV4cGVjdGVkOlxuIiA8PCB2YWx1ZSA8PCAiXG4iIDw8ICJnb3RcbiIgPDwgZGF0YSA8PCAiXG5cbiI7IFwKKyAgICB9IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKHZhbHVlLCBkYXRhKTsgXAorICB9CisgIAorI2RlZmluZSBWRVJJRllfVU5JRk9STWkoTkFNRSxUWVBFKSB7IFwKKyAgICBUWVBFIHZhbHVlID0gVFlQRTo6UmFuZG9tKCkuZXZhbCgpLmNhc3Q8ZmxvYXQ+KCkuY2FzdDxUWVBFOjpTY2FsYXI+KCk7IFwKKyAgICBUWVBFIGRhdGE7IFwKKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJnX2lkLCAjTkFNRSk7IFwKKyAgICBWRVJJRlkoKGxvYyE9LTEpICYmICJ1bmlmb3JtIG5vdCBmb3VuZCIpOyBcCisgICAgZ2xVbmlmb3JtKGxvYyx2YWx1ZSk7IFwKKyAgICBnbEdldFVuaWZvcm1pdihwcmdfaWQsbG9jLChHTGludCopZGF0YS5kYXRhKCkpOyBcCisgICAgaWYoIXZhbHVlLmlzQXBwcm94KGRhdGEpKSB7IFwKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQ6XG4iIDw8IHZhbHVlIDw8ICJcbiIgPDwgImdvdFxuIiA8PCBkYXRhIDw8ICJcblxuIjsgXAorICAgIH0gXAorICAgIFZFUklGWV9JU19BUFBST1godmFsdWUsIGRhdGEpOyBcCisgIH0KKyAgCit2b2lkIHByaW50SW5mb0xvZyhHTHVpbnQgb2JqZWN0SUQpCit7CisgICAgaW50IGluZm9sb2dMZW5ndGgsIGNoYXJzV3JpdHRlbjsKKyAgICBHTGNoYXIgKmluZm9Mb2c7CisgICAgZ2xHZXRQcm9ncmFtaXYob2JqZWN0SUQsR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb2xvZ0xlbmd0aCk7CisgICAgaWYoaW5mb2xvZ0xlbmd0aCA+IDApCisgICAgeworICAgICAgICBpbmZvTG9nID0gbmV3IEdMY2hhcltpbmZvbG9nTGVuZ3RoXTsKKyAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhvYmplY3RJRCwgaW5mb2xvZ0xlbmd0aCwgJmNoYXJzV3JpdHRlbiwgaW5mb0xvZyk7CisgICAgICAgIGlmIChjaGFyc1dyaXR0ZW4+MCkKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlNoYWRlciBpbmZvIDogXG4iIDw8IGluZm9Mb2cgPDwgc3RkOjplbmRsOworICAgICAgICBkZWxldGVbXSBpbmZvTG9nOworICAgIH0KK30KKworR0xpbnQgY3JlYXRlU2hhZGVyKGNvbnN0IGNoYXIqIHZ0eCwgY29uc3QgY2hhciogZnJnKQoreworICBHTGludCBwcmdfaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgR0xpbnQgdnR4X2lkID0gZ2xDcmVhdGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUik7CisgIEdMaW50IGZyZ19pZCA9IGdsQ3JlYXRlU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUik7CisgIEdMaW50IG9rOworICAKKyAgZ2xTaGFkZXJTb3VyY2UodnR4X2lkLCAxLCAmdnR4LCAwKTsKKyAgZ2xDb21waWxlU2hhZGVyKHZ0eF9pZCk7CisgIGdsR2V0U2hhZGVyaXYodnR4X2lkLEdMX0NPTVBJTEVfU1RBVFVTLCZvayk7CisgIGlmKCFvaykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAidnR4IGNvbXBpbGF0aW9uIGZhaWxlZFxuIjsKKyAgfQorICAKKyAgZ2xTaGFkZXJTb3VyY2UoZnJnX2lkLCAxLCAmZnJnLCAwKTsKKyAgZ2xDb21waWxlU2hhZGVyKGZyZ19pZCk7CisgIGdsR2V0U2hhZGVyaXYoZnJnX2lkLEdMX0NPTVBJTEVfU1RBVFVTLCZvayk7CisgIGlmKCFvaykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiZnJnIGNvbXBpbGF0aW9uIGZhaWxlZFxuIjsKKyAgfQorICAKKyAgZ2xBdHRhY2hTaGFkZXIocHJnX2lkLCB2dHhfaWQpOworICBnbEF0dGFjaFNoYWRlcihwcmdfaWQsIGZyZ19pZCk7CisgIGdsTGlua1Byb2dyYW0ocHJnX2lkKTsKKyAgZ2xHZXRQcm9ncmFtaXYocHJnX2lkLEdMX0xJTktfU1RBVFVTLCZvayk7CisgIGlmKCFvaykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAibGlua2luZyBmYWlsZWRcbiI7CisgIH0KKyAgcHJpbnRJbmZvTG9nKHByZ19pZCk7CisgIAorICBnbFVzZVByb2dyYW0ocHJnX2lkKTsKKyAgcmV0dXJuIHByZ19pZDsKK30KKwordm9pZCB0ZXN0X29wZW5nbHN1cHBvcnQoKQoreworICBpbnQgYXJnYyA9IDA7CisgIGdsdXRJbml0KCZhcmdjLCAwKTsKKyAgZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX0RPVUJMRSB8IEdMVVRfUkdCIHwgR0xVVF9ERVBUSCk7CisgIGdsdXRJbml0V2luZG93UG9zaXRpb24gKDAsMCk7CisgIGdsdXRJbml0V2luZG93U2l6ZSgxMCwgMTApOworCisgIGlmKGdsdXRDcmVhdGVXaW5kb3coIkVpZ2VuIikgPD0gMCkKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IFVuYWJsZSB0byBjcmVhdGUgR0xVVCBXaW5kb3cuXG4iOworICAgIGV4aXQoMSk7CisgIH0KKyAgCisgIGdsZXdFeHBlcmltZW50YWwgPSBHTF9UUlVFOworICBpZihnbGV3SW5pdCgpICE9IEdMRVdfT0spCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IEZhaWxlZCB0byBpbml0aWFsaXplIEdMRVdcbiI7CisgIH0KKworICBWZWN0b3IzZiB2M2Y7CisgIE1hdHJpeDNmIHJvdDsKKyAgZ2xCZWdpbihHTF9QT0lOVFMpOworICAKKyAgZ2xWZXJ0ZXgodjNmKTsKKyAgZ2xWZXJ0ZXgoMip2M2YrdjNmKTsKKyAgZ2xWZXJ0ZXgocm90KnYzZik7CisgIAorICBnbEVuZCgpOworICAKKyAgLy8gNHg0IG1hdHJpY2VzCisgIE1hdHJpeDRmIG1mNDQ7IG1mNDQuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KG1mNDQpLCBtZjQ0KTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgobWY0NCksIG1mNDQpOworICBNYXRyaXg0ZCBtZDQ0OyBtZDQ0LnNldFJhbmRvbSgpOworICBWRVJJRllfTUFUUklYKGdsTG9hZE1hdHJpeChtZDQ0KSwgbWQ0NCk7CisgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KG1kNDQpLCBtZDQ0KTsKKyAgCisgIC8vIFF1YXRlcm5pb24KKyAgUXVhdGVybmlvbmQgcWQoQW5nbGVBeGlzZChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSwgVmVjdG9yM2Q6OlJhbmRvbSgpKSk7CisgIFZFUklGWV9NQVRSSVgoZ2xSb3RhdGUocWQpLCBQcm9qZWN0aXZlM2QocWQpLm1hdHJpeCgpKTsKKyAgCisgIFF1YXRlcm5pb25mIHFmKEFuZ2xlQXhpc2YoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCksIFZlY3RvcjNmOjpSYW5kb20oKSkpOworICBWRVJJRllfTUFUUklYKGdsUm90YXRlKHFmKSwgUHJvamVjdGl2ZTNmKHFmKS5tYXRyaXgoKSk7CisgIAorICAvLyAzRCBUcmFuc2Zvcm0KKyAgVHJhbnNmb3JtPGZsb2F0LDMsQWZmaW5lQ29tcGFjdD4gYWNmMzsgYWNmMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWNmMyksIFByb2plY3RpdmUzZihhY2YzKS5tYXRyaXgoKSk7CisgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KGFjZjMpLCBQcm9qZWN0aXZlM2YoYWNmMykubWF0cml4KCkpOworICAKKyAgVHJhbnNmb3JtPGZsb2F0LDMsQWZmaW5lPiBhZjMoYWNmMyk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KGFmMyksIFByb2plY3RpdmUzZihhZjMpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgoYWYzKSwgUHJvamVjdGl2ZTNmKGFmMykubWF0cml4KCkpOworICAKKyAgVHJhbnNmb3JtPGZsb2F0LDMsUHJvamVjdGl2ZT4gcGYzOyBwZjMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KHBmMyksIFByb2plY3RpdmUzZihwZjMpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgocGYzKSwgUHJvamVjdGl2ZTNmKHBmMykubWF0cml4KCkpOworICAKKyAgVHJhbnNmb3JtPGRvdWJsZSwzLEFmZmluZUNvbXBhY3Q+IGFjZDM7IGFjZDMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KGFjZDMpLCBQcm9qZWN0aXZlM2QoYWNkMykubWF0cml4KCkpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChhY2QzKSwgUHJvamVjdGl2ZTNkKGFjZDMpLm1hdHJpeCgpKTsKKyAgCisgIFRyYW5zZm9ybTxkb3VibGUsMyxBZmZpbmU+IGFkMyhhY2QzKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWQzKSwgUHJvamVjdGl2ZTNkKGFkMykubWF0cml4KCkpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChhZDMpLCBQcm9qZWN0aXZlM2QoYWQzKS5tYXRyaXgoKSk7CisgIAorICBUcmFuc2Zvcm08ZG91YmxlLDMsUHJvamVjdGl2ZT4gcGQzOyBwZDMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KHBkMyksIFByb2plY3RpdmUzZChwZDMpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgocGQzKSwgUHJvamVjdGl2ZTNkKHBkMykubWF0cml4KCkpOworICAKKyAgLy8gdHJhbnNsYXRpb25zICgyRCBhbmQgM0QpCisgIHsKKyAgICBWZWN0b3IyZiB2ZjI7IHZmMi5zZXRSYW5kb20oKTsgVmVjdG9yM2YgdmYyMzsgdmYyMyA8PCB2ZjIsIDA7CisgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh2ZjIpLCBQcm9qZWN0aXZlM2YoVHJhbnNsYXRpb24zZih2ZjIzKSkubWF0cml4KCkpOworICAgIFZlY3RvcjJkIHZkMjsgdmQyLnNldFJhbmRvbSgpOyBWZWN0b3IzZCB2ZDIzOyB2ZDIzIDw8IHZkMiwgMDsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZkMiksIFByb2plY3RpdmUzZChUcmFuc2xhdGlvbjNkKHZkMjMpKS5tYXRyaXgoKSk7CisgICAgCisgICAgVmVjdG9yM2YgdmYzOyB2ZjMuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh2ZjMpLCBQcm9qZWN0aXZlM2YoVHJhbnNsYXRpb24zZih2ZjMpKS5tYXRyaXgoKSk7CisgICAgVmVjdG9yM2QgdmQzOyB2ZDMuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh2ZDMpLCBQcm9qZWN0aXZlM2QoVHJhbnNsYXRpb24zZCh2ZDMpKS5tYXRyaXgoKSk7CisgICAgCisgICAgVHJhbnNsYXRpb248ZmxvYXQsMz4gdGYzOyB0ZjMudmVjdG9yKCkuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh0ZjMpLCBQcm9qZWN0aXZlM2YodGYzKS5tYXRyaXgoKSk7CisgICAgCisgICAgVHJhbnNsYXRpb248ZG91YmxlLDM+IHRkMzsgIHRkMy52ZWN0b3IoKS5zZXRSYW5kb20oKTsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHRkMyksIFByb2plY3RpdmUzZCh0ZDMpLm1hdHJpeCgpKTsKKyAgfQorICAKKyAgLy8gc2NhbGluZyAoMkQgYW5kIDNEKQorICB7CisgICAgVmVjdG9yMmYgdmYyOyB2ZjIuc2V0UmFuZG9tKCk7IFZlY3RvcjNmIHZmMjM7IHZmMjMgPDwgdmYyLCAxOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh2ZjIpLCBQcm9qZWN0aXZlM2YoU2NhbGluZyh2ZjIzKSkubWF0cml4KCkpOworICAgIFZlY3RvcjJkIHZkMjsgdmQyLnNldFJhbmRvbSgpOyBWZWN0b3IzZCB2ZDIzOyB2ZDIzIDw8IHZkMiwgMTsKKyAgICBWRVJJRllfTUFUUklYKGdsU2NhbGUodmQyKSwgUHJvamVjdGl2ZTNkKFNjYWxpbmcodmQyMykpLm1hdHJpeCgpKTsKKyAgICAKKyAgICBWZWN0b3IzZiB2ZjM7IHZmMy5zZXRSYW5kb20oKTsKKyAgICBWRVJJRllfTUFUUklYKGdsU2NhbGUodmYzKSwgUHJvamVjdGl2ZTNmKFNjYWxpbmcodmYzKSkubWF0cml4KCkpOworICAgIFZlY3RvcjNkIHZkMzsgdmQzLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh2ZDMpLCBQcm9qZWN0aXZlM2QoU2NhbGluZyh2ZDMpKS5tYXRyaXgoKSk7CisgICAgCisgICAgVW5pZm9ybVNjYWxpbmc8ZmxvYXQ+IHVzZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigpKTsKKyAgICBWRVJJRllfTUFUUklYKGdsU2NhbGUodXNmKSwgUHJvamVjdGl2ZTNmKHVzZikubWF0cml4KCkpOworICAgIAorICAgIFVuaWZvcm1TY2FsaW5nPGRvdWJsZT4gdXNkKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKTsKKyAgICBWRVJJRllfTUFUUklYKGdsU2NhbGUodXNkKSwgUHJvamVjdGl2ZTNkKHVzZCkubWF0cml4KCkpOworICB9CisgIAorICAvLyB1bmlmb3JtCisgIHsKKyAgICBjb25zdCBjaGFyKiB2dHggPSAidm9pZCBtYWluKHZvaWQpIHsgZ2xfUG9zaXRpb24gPSBnbF9WZXJ0ZXg7IH1cbiI7CisgICAgCisgICAgaWYoR0xFV19WRVJTSU9OXzJfMCkKKyAgICB7CisgICAgICAjaWZkZWYgR0xfVkVSU0lPTl8yXzAKKyAgICAgIGNvbnN0IGNoYXIqIGZyZyA9ICIiCisgICAgICAgICJ1bmlmb3JtIHZlYzIgdjJmO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMzIHYzZjtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCB2NGY7XG4iCisgICAgICAgICJ1bmlmb3JtIGl2ZWMyIHYyaTtcbiIKKyAgICAgICAgInVuaWZvcm0gaXZlYzMgdjNpO1xuIgorICAgICAgICAidW5pZm9ybSBpdmVjNCB2NGk7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDIgbTJmO1xuIgorICAgICAgICAidW5pZm9ybSBtYXQzIG0zZjtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NCBtNGY7XG4iCisgICAgICAgICJ2b2lkIG1haW4odm9pZCkgeyBnbF9GcmFnQ29sb3IgPSB2ZWM0KHYyZlswXSt2M2ZbMF0rdjRmWzBdKSt2ZWM0KHYyaVswXSt2M2lbMF0rdjRpWzBdKSt2ZWM0KG0yZlswXVswXSttM2ZbMF1bMF0rbTRmWzBdWzBdKTsgfVxuIjsKKyAgICAgICAgCisgICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVTaGFkZXIodnR4LGZyZyk7CisgICAgICAKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LHYyZiwgVmVjdG9yMmYpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsdjNmLCBWZWN0b3IzZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdix2NGYsIFZlY3RvcjRmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNaSh2MmksIFZlY3RvcjJpKTsKKyAgICAgIFZFUklGWV9VTklGT1JNaSh2M2ksIFZlY3RvcjNpKTsKKyAgICAgIFZFUklGWV9VTklGT1JNaSh2NGksIFZlY3RvcjRpKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG0yZiwgTWF0cml4MmYpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTNmLCBNYXRyaXgzZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdixtNGYsIE1hdHJpeDRmKTsKKyAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IG9wZW5nbCAyLjAgd2FzIG5vdCB0ZXN0ZWRcbiI7CisgICAgCisgICAgaWYoR0xFV19WRVJTSU9OXzJfMSkKKyAgICB7CisgICAgICAjaWZkZWYgR0xfVkVSU0lPTl8yXzEKKyAgICAgIGNvbnN0IGNoYXIqIGZyZyA9ICIjdmVyc2lvbiAxMjBcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0MngzIG0yM2Y7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDN4MiBtMzJmO1xuIgorICAgICAgICAidW5pZm9ybSBtYXQyeDQgbTI0ZjtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NHgyIG00MmY7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDN4NCBtMzRmO1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0eDMgbTQzZjtcbiIKKyAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7IGdsX0ZyYWdDb2xvciA9IHZlYzQobTIzZlswXVswXSttMzJmWzBdWzBdK20yNGZbMF1bMF0rbTQyZlswXVswXSttMzRmWzBdWzBdK200M2ZbMF1bMF0pOyB9XG4iOworICAgICAgICAKKyAgICAgIEdMaW50IHByZ19pZCA9IGNyZWF0ZVNoYWRlcih2dHgsZnJnKTsKKyAgICAgIAorICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsMiwzPiBNYXRyaXgyM2Y7CisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwzLDI+IE1hdHJpeDMyZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDIsND4gTWF0cml4MjRmOworICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsNCwyPiBNYXRyaXg0MmY7CisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwzLDQ+IE1hdHJpeDM0ZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDQsMz4gTWF0cml4NDNmOworICAgICAgCisgICAgICBWRVJJRllfVU5JRk9STShmdixtMjNmLCBNYXRyaXgyM2YpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTMyZiwgTWF0cml4MzJmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG0yNGYsIE1hdHJpeDI0Zik7CisgICAgICBWRVJJRllfVU5JRk9STShmdixtNDJmLCBNYXRyaXg0MmYpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTM0ZiwgTWF0cml4MzRmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG00M2YsIE1hdHJpeDQzZik7CisgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiBvcGVuZ2wgMi4xIHdhcyBub3QgdGVzdGVkXG4iOworICAgIAorICAgIGlmKEdMRVdfVkVSU0lPTl8zXzApCisgICAgeworICAgICAgI2lmZGVmIEdMX1ZFUlNJT05fM18wCisgICAgICBjb25zdCBjaGFyKiBmcmcgPSAiI3ZlcnNpb24gMTUwXG4iCisgICAgICAgICJ1bmlmb3JtIHV2ZWMyIHYydWk7XG4iCisgICAgICAgICJ1bmlmb3JtIHV2ZWMzIHYzdWk7XG4iCisgICAgICAgICJ1bmlmb3JtIHV2ZWM0IHY0dWk7XG4iCisgICAgICAgICJvdXQgdmVjNCBkYXRhO1xuIgorICAgICAgICAidm9pZCBtYWluKHZvaWQpIHsgZGF0YSA9IHZlYzQodjJ1aVswXSt2M3VpWzBdK3Y0dWlbMF0pOyB9XG4iOworICAgICAgICAKKyAgICAgIEdMaW50IHByZ19pZCA9IGNyZWF0ZVNoYWRlcih2dHgsZnJnKTsKKyAgICAgIAorICAgICAgdHlwZWRlZiBNYXRyaXg8dW5zaWduZWQgaW50LDIsMT4gVmVjdG9yMnVpOworICAgICAgdHlwZWRlZiBNYXRyaXg8dW5zaWduZWQgaW50LDMsMT4gVmVjdG9yM3VpOworICAgICAgdHlwZWRlZiBNYXRyaXg8dW5zaWduZWQgaW50LDQsMT4gVmVjdG9yNHVpOworICAgICAgCisgICAgICBWRVJJRllfVU5JRk9STWkodjJ1aSwgVmVjdG9yMnVpKTsKKyAgICAgIFZFUklGWV9VTklGT1JNaSh2M3VpLCBWZWN0b3IzdWkpOworICAgICAgVkVSSUZZX1VOSUZPUk1pKHY0dWksIFZlY3RvcjR1aSk7CisgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiBvcGVuZ2wgMy4wIHdhcyBub3QgdGVzdGVkXG4iOworICAgIAorICAgICNpZmRlZiBHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQKKyAgICBpZihHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQpCisgICAgeworICAgICAgI2lmZGVmIEdMX0FSQl9ncHVfc2hhZGVyX2ZwNjQKKyAgICAgIGNvbnN0IGNoYXIqIGZyZyA9ICIjdmVyc2lvbiAxNTBcbiIKKyAgICAgICAgInVuaWZvcm0gZHZlYzIgdjJkO1xuIgorICAgICAgICAidW5pZm9ybSBkdmVjMyB2M2Q7XG4iCisgICAgICAgICJ1bmlmb3JtIGR2ZWM0IHY0ZDtcbiIKKyAgICAgICAgIm91dCB2ZWM0IGRhdGE7XG4iCisgICAgICAgICJ2b2lkIG1haW4odm9pZCkgeyBkYXRhID0gdmVjNCh2MmRbMF0rdjNkWzBdK3Y0ZFswXSk7IH1cbiI7CisgICAgICAgIAorICAgICAgR0xpbnQgcHJnX2lkID0gY3JlYXRlU2hhZGVyKHZ0eCxmcmcpOworICAgICAgCisgICAgICB0eXBlZGVmIFZlY3RvcjJkIFZlY3RvcjJkOworICAgICAgdHlwZWRlZiBWZWN0b3IzZCBWZWN0b3IzZDsKKyAgICAgIHR5cGVkZWYgVmVjdG9yNGQgVmVjdG9yNGQ7CisgICAgICAKKyAgICAgIFZFUklGWV9VTklGT1JNKGR2LHYyZCwgVmVjdG9yMmQpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZHYsdjNkLCBWZWN0b3IzZCk7CisgICAgICBWRVJJRllfVU5JRk9STShkdix2NGQsIFZlY3RvcjRkKTsKKyAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IEdMRVdfQVJCX2dwdV9zaGFkZXJfZnA2NCB3YXMgbm90IHRlc3RlZFxuIjsKKyAgICAjZWxzZQorICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiBHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQgd2FzIG5vdCB0ZXN0ZWRcbiI7CisgICAgI2VuZGlmCisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWxzb2x2ZXIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9wb2x5bm9taWFsc29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg3NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9wb2x5bm9taWFsc29sdmVyLmNwcApAQCAtMCwwICsxLDIxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IFNpemU+CitzdHJ1Y3QgaW5jcmVtZW50X2lmX2ZpeGVkX3NpemUKK3sKKyAgZW51bSB7CisgICAgcmV0ID0gKFNpemUgPT0gRHluYW1pYykgPyBEeW5hbWljIDogU2l6ZSsxCisgIH07Cit9OworfQorfQorCisKK3RlbXBsYXRlPGludCBEZWcsIHR5cGVuYW1lIFBPTFlOT01JQUwsIHR5cGVuYW1lIFNPTFZFUj4KK2Jvb2wgYXV4X2V2YWxTb2x2ZXIoIGNvbnN0IFBPTFlOT01JQUwmIHBvbHMsIFNPTFZFUiYgcHNvbHZlICkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpTY2FsYXIgU2NhbGFyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgU09MVkVSOjpSb290c1R5cGUgICAgUm9vdHNUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGVnLDE+ICAgICAgICAgIEV2YWxSb290c1R5cGU7CisKKyAgY29uc3QgSW5kZXggZGVnID0gcG9scy5zaXplKCktMTsKKworICAvLyBUZXN0IHRlbXBsYXRlIGNvbnN0cnVjdG9yIGZyb20gY29lZmZpY2llbnQgdmVjdG9yCisgIFNPTFZFUiBzb2x2ZV9jb25zdHIgKHBvbHMpOworCisgIHBzb2x2ZS5jb21wdXRlKCBwb2xzICk7CisgIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMoIHBzb2x2ZS5yb290cygpICk7CisgIEV2YWxSb290c1R5cGUgZXZyKCBkZWcgKTsKKyAgZm9yKCBpbnQgaT0wOyBpPHJvb3RzLnNpemUoKTsgKytpICl7CisgICAgZXZyW2ldID0gc3RkOjphYnMoIHBvbHlfZXZhbCggcG9scywgcm9vdHNbaV0gKSApOyB9CisKKyAgYm9vbCBldmFsVG9aZXJvID0gZXZyLmlzWmVybyggdGVzdF9wcmVjaXNpb248U2NhbGFyPigpICk7CisgIGlmKCAhZXZhbFRvWmVybyApCisgIHsKKyAgICBjZXJyIDw8ICJXUk9ORyByb290OiAiIDw8IGVuZGw7CisgICAgY2VyciA8PCAiUG9seW5vbWlhbDogIiA8PCBwb2xzLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgICAgY2VyciA8PCAiUm9vdHMgZm91bmQ6ICIgPDwgcm9vdHMudHJhbnNwb3NlKCkgPDwgZW5kbDsKKyAgICBjZXJyIDw8ICJBYnMgdmFsdWUgb2YgdGhlIHBvbHlub21pYWwgYXQgdGhlIHJvb3RzOiAiIDw8IGV2ci50cmFuc3Bvc2UoKSA8PCBlbmRsOworICAgIGNlcnIgPDwgZW5kbDsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gcm9vdE1vZHVsaSggcm9vdHMuc2l6ZSgpICk7CisgIE1hcDwgRXZhbFJvb3RzVHlwZSA+IGF1eCggJnJvb3RNb2R1bGlbMF0sIHJvb3RzLnNpemUoKSApOworICBhdXggPSByb290cy5hcnJheSgpLmFicygpOworICBzdGQ6OnNvcnQoIHJvb3RNb2R1bGkuYmVnaW4oKSwgcm9vdE1vZHVsaS5lbmQoKSApOworICBib29sIGRpc3RpbmN0TW9kdWxpPXRydWU7CisgIGZvciggc2l6ZV90IGk9MTsgaTxyb290TW9kdWxpLnNpemUoKSAmJiBkaXN0aW5jdE1vZHVsaTsgKytpICkKKyAgeworICAgIGlmKCBpbnRlcm5hbDo6aXNBcHByb3goIHJvb3RNb2R1bGlbaV0sIHJvb3RNb2R1bGlbaS0xXSApICl7CisgICAgICBkaXN0aW5jdE1vZHVsaSA9IGZhbHNlOyB9CisgIH0KKyAgVkVSSUZZKCBldmFsVG9aZXJvIHx8ICFkaXN0aW5jdE1vZHVsaSApOworCisgIHJldHVybiBkaXN0aW5jdE1vZHVsaTsKK30KKworCisKKworCisKKwordGVtcGxhdGU8aW50IERlZywgdHlwZW5hbWUgUE9MWU5PTUlBTD4KK3ZvaWQgZXZhbFNvbHZlciggY29uc3QgUE9MWU5PTUlBTCYgcG9scyApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUE9MWU5PTUlBTDo6U2NhbGFyIFNjYWxhcjsKKworICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWcgPiAgICAgICAgICAgICAgUG9seW5vbWlhbFNvbHZlclR5cGU7CisKKyAgUG9seW5vbWlhbFNvbHZlclR5cGUgcHNvbHZlOworICBhdXhfZXZhbFNvbHZlcjxEZWcsIFBPTFlOT01JQUwsIFBvbHlub21pYWxTb2x2ZXJUeXBlPiggcG9scywgcHNvbHZlICk7Cit9CisKKworCisKK3RlbXBsYXRlPCBpbnQgRGVnLCB0eXBlbmFtZSBQT0xZTk9NSUFMLCB0eXBlbmFtZSBST09UUywgdHlwZW5hbWUgUkVBTF9ST09UUyA+Cit2b2lkIGV2YWxTb2x2ZXJTdWdhckZ1bmN0aW9uKCBjb25zdCBQT0xZTk9NSUFMJiBwb2xzLCBjb25zdCBST09UUyYgcm9vdHMsIGNvbnN0IFJFQUxfUk9PVFMmIHJlYWxfcm9vdHMgKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgUE9MWU5PTUlBTDo6U2NhbGFyIFNjYWxhcjsKKworICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWcgPiAgICAgICAgICAgICAgUG9seW5vbWlhbFNvbHZlclR5cGU7CisKKyAgUG9seW5vbWlhbFNvbHZlclR5cGUgcHNvbHZlOworICBpZiggYXV4X2V2YWxTb2x2ZXI8RGVnLCBQT0xZTk9NSUFMLCBQb2x5bm9taWFsU29sdmVyVHlwZT4oIHBvbHMsIHBzb2x2ZSApICkKKyAgeworICAgIC8vSXQgaXMgc3VwcG9zZWQgdGhhdAorICAgIC8vIDEpIHRoZSByb290cyBmb3VuZCBhcmUgY29ycmVjdAorICAgIC8vIDIpIHRoZSByb290cyBoYXZlIGRpc3RpbmN0IG1vZHVsaQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpTY2FsYXIgICAgICAgICAgICAgICAgIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJFQUxfUk9PVFM6OlNjYWxhciAgICAgICAgICAgICAgICAgUmVhbDsKKworICAgIC8vVGVzdCByZWFsUm9vdHMKKyAgICBzdGQ6OnZlY3RvcjwgUmVhbCA+IGNhbGNfcmVhbFJvb3RzOworICAgIHBzb2x2ZS5yZWFsUm9vdHMoIGNhbGNfcmVhbFJvb3RzICk7CisgICAgVkVSSUZZKCBjYWxjX3JlYWxSb290cy5zaXplKCkgPT0gKHNpemVfdClyZWFsX3Jvb3RzLnNpemUoKSApOworCisgICAgY29uc3QgU2NhbGFyIHBzUHJlYyA9IHNxcnQoIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSApOworCisgICAgZm9yKCBzaXplX3QgaT0wOyBpPGNhbGNfcmVhbFJvb3RzLnNpemUoKTsgKytpICkKKyAgICB7CisgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICBmb3IoIHNpemVfdCBqPTA7IGo8Y2FsY19yZWFsUm9vdHMuc2l6ZSgpJiYgIWZvdW5kOyArK2ogKQorICAgICAgeworICAgICAgICBpZiggaW50ZXJuYWw6OmlzQXBwcm94KCBjYWxjX3JlYWxSb290c1tpXSwgcmVhbF9yb290c1tqXSwgcHNQcmVjICkgKXsKKyAgICAgICAgICBmb3VuZCA9IHRydWU7IH0KKyAgICAgIH0KKyAgICAgIFZFUklGWSggZm91bmQgKTsKKyAgICB9CisKKyAgICAvL1Rlc3QgZ3JlYXRlc3RSb290CisgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJvb3RzLmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKSwKKyAgICAgICAgICBhYnMoIHBzb2x2ZS5ncmVhdGVzdFJvb3QoKSApLCBwc1ByZWMgKSApOworCisgICAgLy9UZXN0IHNtYWxsZXN0Um9vdAorICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByb290cy5hcnJheSgpLmFicygpLm1pbkNvZWZmKCksCisgICAgICAgICAgYWJzKCBwc29sdmUuc21hbGxlc3RSb290KCkgKSwgcHNQcmVjICkgKTsKKworICAgIGJvb2wgaGFzUmVhbFJvb3Q7CisgICAgLy9UZXN0IGFic0dyZWF0ZXN0UmVhbFJvb3QKKyAgICBSZWFsIHIgPSBwc29sdmUuYWJzR3JlYXRlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKKyAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOworICAgIGlmKCBoYXNSZWFsUm9vdCApeworICAgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpLCBhYnMociksIHBzUHJlYyApICk7ICB9CisKKyAgICAvL1Rlc3QgYWJzU21hbGxlc3RSZWFsUm9vdAorICAgIHIgPSBwc29sdmUuYWJzU21hbGxlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKKyAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOworICAgIGlmKCBoYXNSZWFsUm9vdCApeworICAgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpLCBhYnMoIHIgKSwgcHNQcmVjICkgKTsgfQorCisgICAgLy9UZXN0IGdyZWF0ZXN0UmVhbFJvb3QKKyAgICByID0gcHNvbHZlLmdyZWF0ZXN0UmVhbFJvb3QoIGhhc1JlYWxSb290ICk7CisgICAgVkVSSUZZKCBoYXNSZWFsUm9vdCA9PSAocmVhbF9yb290cy5zaXplKCkgPiAwICkgKTsKKyAgICBpZiggaGFzUmVhbFJvb3QgKXsKKyAgICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByZWFsX3Jvb3RzLmFycmF5KCkubWF4Q29lZmYoKSwgciwgcHNQcmVjICkgKTsgfQorCisgICAgLy9UZXN0IHNtYWxsZXN0UmVhbFJvb3QKKyAgICByID0gcHNvbHZlLnNtYWxsZXN0UmVhbFJvb3QoIGhhc1JlYWxSb290ICk7CisgICAgVkVSSUZZKCBoYXNSZWFsUm9vdCA9PSAocmVhbF9yb290cy5zaXplKCkgPiAwICkgKTsKKyAgICBpZiggaGFzUmVhbFJvb3QgKXsKKyAgICBWRVJJRlkoIGludGVybmFsOjppc0FwcHJveCggcmVhbF9yb290cy5hcnJheSgpLm1pbkNvZWZmKCksIHIsIHBzUHJlYyApICk7IH0KKyAgfQorfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnPgordm9pZCBwb2x5bm9taWFsc29sdmVyKGludCBkZWcpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmluY3JlbWVudF9pZl9maXhlZF9zaXplPF9EZWc+ICAgICAgICAgICAgRGltOworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLERpbTo6cmV0LDE+ICAgICAgICAgICAgICAgICAgUG9seW5vbWlhbFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsX0RlZywxPiAgICAgICAgICAgICAgICAgICAgICBFdmFsUm9vdHNUeXBlOworCisgIGNvdXQgPDwgIlN0YW5kYXJkIGNhc2VzIiA8PCBlbmRsOworICBQb2x5bm9taWFsVHlwZSBwb2xzID0gUG9seW5vbWlhbFR5cGU6OlJhbmRvbShkZWcrMSk7CisgIGV2YWxTb2x2ZXI8X0RlZyxQb2x5bm9taWFsVHlwZT4oIHBvbHMgKTsKKworICBjb3V0IDw8ICJIYXJkIGNhc2VzIiA8PCBlbmRsOworICBfU2NhbGFyIG11bHRpcGxlUm9vdCA9IGludGVybmFsOjpyYW5kb208X1NjYWxhcj4oKTsKKyAgRXZhbFJvb3RzVHlwZSBhbGxSb290cyA9IEV2YWxSb290c1R5cGU6OkNvbnN0YW50KGRlZyxtdWx0aXBsZVJvb3QpOworICByb290c190b19tb25pY1BvbHlub21pYWwoIGFsbFJvb3RzLCBwb2xzICk7CisgIGV2YWxTb2x2ZXI8X0RlZyxQb2x5bm9taWFsVHlwZT4oIHBvbHMgKTsKKworICBjb3V0IDw8ICJUZXN0IHN1Z2FyIiA8PCBlbmRsOworICBFdmFsUm9vdHNUeXBlIHJlYWxSb290cyA9IEV2YWxSb290c1R5cGU6OlJhbmRvbShkZWcpOworICByb290c190b19tb25pY1BvbHlub21pYWwoIHJlYWxSb290cywgcG9scyApOworICBldmFsU29sdmVyU3VnYXJGdW5jdGlvbjxfRGVnPigKKyAgICAgIHBvbHMsCisgICAgICByZWFsUm9vdHMudGVtcGxhdGUgY2FzdCA8CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29tcGxleDwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8X1NjYWxhcj46OlJlYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICAgID4oKSwKKyAgICAgIHJlYWxSb290cyApOworfQorCit2b2lkIHRlc3RfcG9seW5vbWlhbHNvbHZlcigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKQorICB7CisgICAgQ0FMTF9TVUJURVNUXzEoIChwb2x5bm9taWFsc29sdmVyPGZsb2F0LDE+KDEpKSApOworICAgIENBTExfU1VCVEVTVF8yKCAocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsMj4oMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSwzPigzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsND4oNCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSw1Pig1KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsNj4oNikpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIChwb2x5bm9taWFsc29sdmVyPGZsb2F0LDc+KDcpKSApOworICAgIENBTExfU1VCVEVTVF84KCAocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsOD4oOCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfOSggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsRHluYW1pYz4oCisgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oOSwxMykKKyAgICAgICAgICAgICkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEwKChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSxEeW5hbWljPigKKyAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50Pig5LDEzKQorICAgICAgICAgICAgKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsRHluYW1pYz4oMSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHV0aWxzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM5Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9wb2x5bm9taWFsdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBNYW51ZWwgWWd1ZWwgPG1hbnVlbC55Z3VlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgRWlnZW4geworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPGludCBTaXplPgorc3RydWN0IGluY3JlbWVudF9pZl9maXhlZF9zaXplCit7CisgIGVudW0geworICAgIHJldCA9IChTaXplID09IER5bmFtaWMpID8gRHluYW1pYyA6IFNpemUrMQorICB9OworfTsKK30KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWc+Cit2b2lkIHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdChpbnQgZGVnKQoreworICB0eXBlZGVmIGludGVybmFsOjppbmNyZW1lbnRfaWZfZml4ZWRfc2l6ZTxfRGVnPiAgICAgICAgICAgIERpbTsKKyAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhcixEaW06OnJldCwxPiAgICAgICAgICAgICAgICAgIFBvbHlub21pYWxUeXBlOworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLF9EZWcsMT4gICAgICAgICAgICAgICAgICAgICAgRXZhbFJvb3RzVHlwZTsKKworICBQb2x5bm9taWFsVHlwZSBwb2xzKGRlZysxKTsKKyAgRXZhbFJvb3RzVHlwZSByb290cyA9IEV2YWxSb290c1R5cGU6OlJhbmRvbShkZWcpOworICByb290c190b19tb25pY1BvbHlub21pYWwoIHJvb3RzLCBwb2xzICk7CisKKyAgRXZhbFJvb3RzVHlwZSBldnIoIGRlZyApOworICBmb3IoIGludCBpPTA7IGk8cm9vdHMuc2l6ZSgpOyArK2kgKXsKKyAgICBldnJbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBwb2xzLCByb290c1tpXSApICk7IH0KKworICBib29sIGV2YWxUb1plcm8gPSBldnIuaXNaZXJvKCB0ZXN0X3ByZWNpc2lvbjxfU2NhbGFyPigpICk7CisgIGlmKCAhZXZhbFRvWmVybyApeworICAgIGNlcnIgPDwgZXZyLnRyYW5zcG9zZSgpIDw8IGVuZGw7IH0KKyAgVkVSSUZZKCBldmFsVG9aZXJvICk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IHZvaWQgcmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF9zY2FsYXIoKQoreworICBDQUxMX1NVQlRFU1RfMiggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDI+KDIpKSApOworICBDQUxMX1NVQlRFU1RfMyggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDM+KDMpKSApOworICBDQUxMX1NVQlRFU1RfNCggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDQ+KDQpKSApOworICBDQUxMX1NVQlRFU1RfNSggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDU+KDUpKSApOworICBDQUxMX1NVQlRFU1RfNiggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDY+KDYpKSApOworICBDQUxMX1NVQlRFU1RfNyggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDc+KDcpKSApOworICBDQUxMX1NVQlRFU1RfOCggKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxfU2NhbGFyLDE3PigxNykpICk7CisKKyAgQ0FMTF9TVUJURVNUXzkoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhcixEeW5hbWljPigKKyAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTgsMjYpICkpICk7Cit9CisKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnPgordm9pZCBDYXVjaHlCb3VuZHMoaW50IGRlZykKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6aW5jcmVtZW50X2lmX2ZpeGVkX3NpemU8X0RlZz4gICAgICAgICAgICBEaW07CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsRGltOjpyZXQsMT4gICAgICAgICAgICAgICAgICBQb2x5bm9taWFsVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhcixfRGVnLDE+ICAgICAgICAgICAgICAgICAgICAgIEV2YWxSb290c1R5cGU7CisKKyAgUG9seW5vbWlhbFR5cGUgcG9scyhkZWcrMSk7CisgIEV2YWxSb290c1R5cGUgcm9vdHMgPSBFdmFsUm9vdHNUeXBlOjpSYW5kb20oZGVnKTsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByb290cywgcG9scyApOworICBfU2NhbGFyIE0gPSBjYXVjaHlfbWF4X2JvdW5kKCBwb2xzICk7CisgIF9TY2FsYXIgbSA9IGNhdWNoeV9taW5fYm91bmQoIHBvbHMgKTsKKyAgX1NjYWxhciBNYXggPSByb290cy5hcnJheSgpLmFicygpLm1heENvZWZmKCk7CisgIF9TY2FsYXIgbWluID0gcm9vdHMuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpOworICBib29sIGV2YWwgPSAoTSA+PSBNYXgpICYmIChtIDw9IG1pbik7CisgIGlmKCAhZXZhbCApCisgIHsKKyAgICBjZXJyIDw8ICJSb290czogIiA8PCByb290cyA8PCBlbmRsOworICAgIGNlcnIgPDwgIkJvdW5kczogKCIgPDwgbSA8PCAiLCAiIDw8IE0gPDwgIikiIDw8IGVuZGw7CisgICAgY2VyciA8PCAiTWluLE1heDogKCIgPDwgbWluIDw8ICIsICIgPDwgTWF4IDw8ICIpIiA8PCBlbmRsOworICB9CisgIFZFUklGWSggZXZhbCApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiB2b2lkIENhdWNoeUJvdW5kc19zY2FsYXIoKQoreworICBDQUxMX1NVQlRFU1RfMiggKENhdWNoeUJvdW5kczxfU2NhbGFyLDI+KDIpKSApOworICBDQUxMX1NVQlRFU1RfMyggKENhdWNoeUJvdW5kczxfU2NhbGFyLDM+KDMpKSApOworICBDQUxMX1NVQlRFU1RfNCggKENhdWNoeUJvdW5kczxfU2NhbGFyLDQ+KDQpKSApOworICBDQUxMX1NVQlRFU1RfNSggKENhdWNoeUJvdW5kczxfU2NhbGFyLDU+KDUpKSApOworICBDQUxMX1NVQlRFU1RfNiggKENhdWNoeUJvdW5kczxfU2NhbGFyLDY+KDYpKSApOworICBDQUxMX1NVQlRFU1RfNyggKENhdWNoeUJvdW5kczxfU2NhbGFyLDc+KDcpKSApOworICBDQUxMX1NVQlRFU1RfOCggKENhdWNoeUJvdW5kczxfU2NhbGFyLDE3PigxNykpICk7CisKKyAgQ0FMTF9TVUJURVNUXzkoIChDYXVjaHlCb3VuZHM8X1NjYWxhcixEeW5hbWljPigKKyAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTgsMjYpICkpICk7Cit9CisKK3ZvaWQgdGVzdF9wb2x5bm9taWFsdXRpbHMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykKKyAgeworICAgIHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfc2NhbGFyPGRvdWJsZT4oKTsKKyAgICByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3NjYWxhcjxmbG9hdD4oKTsKKyAgICBDYXVjaHlCb3VuZHNfc2NhbGFyPGRvdWJsZT4oKTsKKyAgICBDYXVjaHlCb3VuZHNfc2NhbGFyPGZsb2F0PigpOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3NwYXJzZV9leHRyYS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3NwYXJzZV9leHRyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMGNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BhcnNlX2V4dHJhLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisvLyBpbXBvcnQgYmFzaWMgYW5kIHByb2R1Y3QgdGVzdHMgZm9yIGRlcHJlY3RhZWQgRHluYW1pY1NwYXJzZU1hdHJpeAorI2RlZmluZSBFSUdFTl9OT19ERVBSRUNBVEVEX1dBUk5JTkcKKyNpbmNsdWRlICJzcGFyc2VfYmFzaWMuY3BwIgorI2luY2x1ZGUgInNwYXJzZV9wcm9kdWN0LmNwcCIKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VFeHRyYT4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2V0dGVyVHlwZSx0eXBlbmFtZSBEZW5zZVR5cGUsIHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdGlvbnM+Citib29sIHRlc3RfcmFuZG9tX3NldHRlcihTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdGlvbnM+JiBzbSwgY29uc3QgRGVuc2VUeXBlJiByZWYsIGNvbnN0IHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiYgbm9uemVyb0Nvb3JkcykKK3sKKyAgeworICAgIHNtLnNldFplcm8oKTsKKyAgICBTZXR0ZXJUeXBlIHcoc20pOworICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiByZW1haW5pbmcgPSBub256ZXJvQ29vcmRzOworICAgIHdoaWxlKCFyZW1haW5pbmcuZW1wdHkoKSkKKyAgICB7CisgICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHN0YXRpY19jYXN0PGludD4ocmVtYWluaW5nLnNpemUoKSktMSk7CisgICAgICB3KHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSkgPSByZWYuY29lZmYocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKTsKKyAgICAgIHJlbWFpbmluZ1tpXSA9IHJlbWFpbmluZy5iYWNrKCk7CisgICAgICByZW1haW5pbmcucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNtLmlzQXBwcm94KHJlZik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNldHRlclR5cGUsdHlwZW5hbWUgRGVuc2VUeXBlLCB0eXBlbmFtZSBUPgorYm9vbCB0ZXN0X3JhbmRvbV9zZXR0ZXIoRHluYW1pY1NwYXJzZU1hdHJpeDxUPiYgc20sIGNvbnN0IERlbnNlVHlwZSYgcmVmLCBjb25zdCBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4mIG5vbnplcm9Db29yZHMpCit7CisgIHNtLnNldFplcm8oKTsKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7CisgIHdoaWxlKCFyZW1haW5pbmcuZW1wdHkoKSkKKyAgeworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsc3RhdGljX2Nhc3Q8aW50PihyZW1haW5pbmcuc2l6ZSgpKS0xKTsKKyAgICBzbS5jb2VmZlJlZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmLmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisgICAgcmVtYWluaW5nW2ldID0gcmVtYWluaW5nLmJhY2soKTsKKyAgICByZW1haW5pbmcucG9wX2JhY2soKTsKKyAgfQorICByZXR1cm4gc20uaXNBcHByb3gocmVmKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfZXh0cmEoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKQoreworICBjb25zdCBJbmRleCByb3dzID0gcmVmLnJvd3MoKTsKKyAgY29uc3QgSW5kZXggY29scyA9IHJlZi5jb2xzKCk7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IEZsYWdzID0gU3BhcnNlTWF0cml4VHlwZTo6RmxhZ3MgfTsKKworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIFNjYWxhciBlcHMgPSAxZS02OworCisgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLCBjb2xzKTsKKyAgRGVuc2VNYXRyaXggcmVmTWF0ID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgIERlbnNlVmVjdG9yIHZlYzEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpOworCisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiB6ZXJvQ29vcmRzOworICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gbm9uemVyb0Nvb3JkczsKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdCwgbSwgMCwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKKworICBpZiAoemVyb0Nvb3Jkcy5zaXplKCk9PTAgfHwgbm9uemVyb0Nvb3Jkcy5zaXplKCk9PTApCisgICAgcmV0dXJuOworCisgIC8vIHRlc3QgY29lZmYgYW5kIGNvZWZmUmVmCisgIGZvciAoaW50IGk9MDsgaTwoaW50KXplcm9Db29yZHMuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIG0uY29lZmYoemVyb0Nvb3Jkc1tpXS54KCksemVyb0Nvb3Jkc1tpXS55KCkpLCBlcHMgKTsKKyAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxTcGFyc2VNYXRyaXhUeXBlLFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3M+ID46OnZhbHVlKQorICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0uY29lZmZSZWYoemVyb0Nvb3Jkc1swXS54KCksemVyb0Nvb3Jkc1swXS55KCkpID0gNSApOworICB9CisgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICBtLmNvZWZmUmVmKG5vbnplcm9Db29yZHNbMF0ueCgpLCBub256ZXJvQ29vcmRzWzBdLnkoKSkgPSBTY2FsYXIoNSk7CisgIHJlZk1hdC5jb2VmZlJlZihub256ZXJvQ29vcmRzWzBdLngoKSwgbm9uemVyb0Nvb3Jkc1swXS55KCkpID0gU2NhbGFyKDUpOworCisgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAvLyByYW5kb20gc2V0dGVyCisvLyAgIHsKKy8vICAgICBtLnNldFplcm8oKTsKKy8vICAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtLCByZWZNYXQpOworLy8gICAgIFNwYXJzZVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBSYW5kb21BY2Nlc3NQYXR0ZXJuPiB3KG0pOworLy8gICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiByZW1haW5pbmcgPSBub256ZXJvQ29vcmRzOworLy8gICAgIHdoaWxlKCFyZW1haW5pbmcuZW1wdHkoKSkKKy8vICAgICB7CisvLyAgICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJlbWFpbmluZy5zaXplKCktMSk7CisvLyAgICAgICB3LT5jb2VmZlJlZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmTWF0LmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisvLyAgICAgICByZW1haW5pbmdbaV0gPSByZW1haW5pbmcuYmFjaygpOworLy8gICAgICAgcmVtYWluaW5nLnBvcF9iYWNrKCk7CisvLyAgICAgfQorLy8gICB9CisvLyAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgU3RkTWFwVHJhaXRzPiA+KG0scmVmTWF0LG5vbnplcm9Db29yZHMpICkpOworICAgICNpZmRlZiBFSUdFTl9VTk9SREVSRURfTUFQX1NVUFBPUlQKKyAgICBWRVJJRlkoKCB0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIFN0ZFVub3JkZXJlZE1hcFRyYWl0cz4gPihtLHJlZk1hdCxub256ZXJvQ29vcmRzKSApKTsKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX0RFTlNFX0hBU0hfTUFQX0hfCisgICAgVkVSSUZZKCggdGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7CisgICAgI2VuZGlmCisgICAgI2lmZGVmIF9TUEFSU0VfSEFTSF9NQVBfSF8KKyAgICBWRVJJRlkoKCB0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7CisgICAgI2VuZGlmCisKKworICAvLyB0ZXN0IFJhbmRvbVNldHRlcgorICAvKnsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsY29scyksIG0yKHJvd3MsY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTTEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTTEsIG0xKTsKKyAgICB7CisgICAgICBFaWdlbjo6UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUgPiBzZXR0ZXIobTIpOworICAgICAgZm9yIChpbnQgaj0wOyBqPG0xLm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIGZvciAodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpKG0xLGopOyBpOyArK2kpCisgICAgICAgICAgc2V0dGVyKGkuaW5kZXgoKSwgaikgPSBpLnZhbHVlKCk7CisgICAgfQorICAgIFZFUklGWV9JU19BUFBST1gobTEsIG0yKTsKKyAgfSovCisKKworfQorCit2b2lkIHRlc3Rfc3BhcnNlX2V4dHJhKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9leHRyYShTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMsIHMpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfZXh0cmEoU3BhcnNlTWF0cml4PGRvdWJsZT4ocywgcykpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMyggc3BhcnNlX2V4dHJhKER5bmFtaWNTcGFyc2VNYXRyaXg8ZG91YmxlPihzLCBzKSkgKTsKKy8vICAgIENBTExfU1VCVEVTVF8zKCggc3BhcnNlX2Jhc2ljKER5bmFtaWNTcGFyc2VNYXRyaXg8ZG91YmxlPihzLCBzKSkgKSk7CisvLyAgICBDQUxMX1NVQlRFU1RfMygoIHNwYXJzZV9iYXNpYyhEeW5hbWljU3BhcnNlTWF0cml4PGRvdWJsZSxDb2xNYWpvcixsb25nIGludD4ocywgcykpICkpOworCisgICAgQ0FMTF9TVUJURVNUXzMoIChzcGFyc2VfcHJvZHVjdDxEeW5hbWljU3BhcnNlTWF0cml4PGZsb2F0LCBDb2xNYWpvcj4gPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCAoc3BhcnNlX3Byb2R1Y3Q8RHluYW1pY1NwYXJzZU1hdHJpeDxmbG9hdCwgUm93TWFqb3I+ID4oKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9zcGVjaWFsX2Z1bmN0aW9ucy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3NwZWNpYWxfZnVuY3Rpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdmYjNlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGVjaWFsX2Z1bmN0aW9ucy5jcHAKQEAgLTAsMCArMSwzNDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICIuLi9FaWdlbi9TcGVjaWFsRnVuY3Rpb25zIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgordm9pZCB2ZXJpZnlfY29tcG9uZW50X3dpc2UoY29uc3QgWCYgeCwgY29uc3QgWSYgeSkKK3sKKyAgZm9yKEluZGV4IGk9MDsgaTx4LnNpemUoKTsgKytpKQorICB7CisgICAgaWYoKG51bWV4dDo6aXNmaW5pdGUpKHkoaSkpKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWCggeChpKSwgeShpKSApOworICAgIGVsc2UgaWYoKG51bWV4dDo6aXNuYW4pKHkoaSkpKQorICAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh4KGkpKSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0VRVUFMKCB4KGkpLCB5KGkpICk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5X3NwZWNpYWxfZnVuY3Rpb25zKCkKK3sKKyAgdXNpbmcgc3RkOjphYnM7CisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBTY2FsYXIgcGx1c2luZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgU2NhbGFyIG5hbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CisKKyAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMzApOworICBJbmRleCBjb2xzID0gMTsKKworICAvLyBBUEkKKyAgeworICAgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisjaWYgRUlHRU5fSEFTX0M5OV9NQVRICisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5sZ2FtbWEoKSwgbGdhbW1hKG0xKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5kaWdhbW1hKCksIGRpZ2FtbWEobTEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmVyZigpLCBlcmYobTEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmVyZmMoKSwgZXJmYyhtMSkpOworI2VuZGlmICAvLyBFSUdFTl9IQVNfQzk5X01BVEgKKyAgfQorCisKKyNpZiBFSUdFTl9IQVNfQzk5X01BVEgKKyAgLy8gY2hlY2sgc3BlY2lhbCBmdW5jdGlvbnMgKGNvbXBhcmluZyBhZ2FpbnN0IG51bXB5IGltcGxlbWVudGF0aW9uKQorICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgIHsKKworICAgIHsKKyAgICAgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgICAgICBBcnJheVR5cGUgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworCisgICAgICAvLyBUZXN0IHZhcmlvdXMgcHJvcHJldGllcyBvZiBpZ2FtbWEgJiBpZ2FtbWFjLiAgVGhlc2UgYXJlIG5vcm1hbGl6ZWQKKyAgICAgIC8vIGdhbW1hIGludGVncmFscyB3aGVyZQorICAgICAgLy8gICBpZ2FtbWFjKGEsIHgpID0gR2FtbWEoYSwgeCkgLyBHYW1tYShhKQorICAgICAgLy8gICBpZ2FtbWEoYSwgeCkgPSBnYW1tYShhLCB4KSAvIEdhbW1hKGEpCisgICAgICAvLyB3aGVyZSBHYW1tYSBhbmQgZ2FtbWEgYXJlIGNvbnNpZGVyZWQgdGhlIHN0YW5kYXJkIHVubm9ybWFsaXplZAorICAgICAgLy8gdXBwZXIgYW5kIGxvd2VyIGluY29tcGxldGUgZ2FtbWEgZnVuY3Rpb25zLCByZXNwZWN0aXZlbHkuCisgICAgICBBcnJheVR5cGUgYSA9IG0xLmFicygpICsgMjsKKyAgICAgIEFycmF5VHlwZSB4ID0gbTIuYWJzKCkgKyAyOworICAgICAgQXJyYXlUeXBlIHplcm8gPSBBcnJheVR5cGU6Olplcm8ocm93cywgY29scyk7CisgICAgICBBcnJheVR5cGUgb25lID0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIoMS4wKSk7CisgICAgICBBcnJheVR5cGUgYV9tMSA9IGEgLSBvbmU7CisgICAgICBBcnJheVR5cGUgR2FtbWFfYV94ID0gRWlnZW46OmlnYW1tYWMoYSwgeCkgKiBhLmxnYW1tYSgpLmV4cCgpOworICAgICAgQXJyYXlUeXBlIEdhbW1hX2FfbTFfeCA9IEVpZ2VuOjppZ2FtbWFjKGFfbTEsIHgpICogYV9tMS5sZ2FtbWEoKS5leHAoKTsKKyAgICAgIEFycmF5VHlwZSBnYW1tYV9hX3ggPSBFaWdlbjo6aWdhbW1hKGEsIHgpICogYS5sZ2FtbWEoKS5leHAoKTsKKyAgICAgIEFycmF5VHlwZSBnYW1tYV9hX20xX3ggPSBFaWdlbjo6aWdhbW1hKGFfbTEsIHgpICogYV9tMS5sZ2FtbWEoKS5leHAoKTsKKworICAgICAgLy8gR2FtbWEoYSwgMCkgPT0gR2FtbWEoYSkKKyAgICAgIFZFUklGWV9JU19BUFBST1goRWlnZW46OmlnYW1tYWMoYSwgemVybyksIG9uZSk7CisKKyAgICAgIC8vIEdhbW1hKGEsIHgpICsgZ2FtbWEoYSwgeCkgPT0gR2FtbWEoYSkKKyAgICAgIFZFUklGWV9JU19BUFBST1goR2FtbWFfYV94ICsgZ2FtbWFfYV94LCBhLmxnYW1tYSgpLmV4cCgpKTsKKworICAgICAgLy8gR2FtbWEoYSwgeCkgPT0gKGEgLSAxKSAqIEdhbW1hKGEtMSwgeCkgKyB4XihhLTEpICogZXhwKC14KQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChHYW1tYV9hX3gsIChhIC0gMSkgKiBHYW1tYV9hX20xX3ggKyB4LnBvdyhhLTEpICogKC14KS5leHAoKSk7CisKKyAgICAgIC8vIGdhbW1hKGEsIHgpID09IChhIC0gMSkgKiBnYW1tYShhLTEsIHgpIC0geF4oYS0xKSAqIGV4cCgteCkKKyAgICAgIFZFUklGWV9JU19BUFBST1goZ2FtbWFfYV94LCAoYSAtIDEpICogZ2FtbWFfYV9tMV94IC0geC5wb3coYS0xKSAqICgteCkuZXhwKCkpOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIENoZWNrIGV4YWN0IHZhbHVlcyBvZiBpZ2FtbWEgYW5kIGlnYW1tYWMgYWdhaW5zdCBhIHRoaXJkIHBhcnR5IGNhbGN1bGF0aW9uLgorICAgICAgU2NhbGFyIGFfc1tdID0ge1NjYWxhcigwKSwgU2NhbGFyKDEpLCBTY2FsYXIoMS41KSwgU2NhbGFyKDQpLCBTY2FsYXIoMC4wMDAxKSwgU2NhbGFyKDEwMDAuNSl9OworICAgICAgU2NhbGFyIHhfc1tdID0ge1NjYWxhcigwKSwgU2NhbGFyKDEpLCBTY2FsYXIoMS41KSwgU2NhbGFyKDQpLCBTY2FsYXIoMC4wMDAxKSwgU2NhbGFyKDEwMDAuNSl9OworCisgICAgICAvLyBsb2NhdGlvbiBpKjYraiBjb3JyZXNwb25kcyB0byBhX3NbaV0sIHhfc1tqXS4KKyAgICAgIFNjYWxhciBpZ2FtbWFfc1tdWzZdID0ge3swLjAsIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjAsIDAuNjMyMTIwNTU4ODI4NTU3OCwgMC43NzY4Njk4Mzk4NTE1NzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODE2ODQzNjExMTEyNjU4LCA5Ljk5OTUwMDAxNjY2NjI2MmUtMDUsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjQyNzU5MzI5NTUyOTEyMDIsIDAuNjA4Mzc0ODIzNzI4OTExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5ODgyOTQzMTA3Njg2LCA3LjUyMjA3NjQ0NTA4OTIwMWUtMDcsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjAxODk4ODE1Njg3NjE1MzgxLCAwLjA2NTY0MjQ1NDM3ODQ1MDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NjY1Mjk4Nzk2MzMyOTA5LCA0LjE2NjMzMzM0NzIyMTgyOGUtMTgsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjk5OTk3ODA1OTM2MTg2MjgsIDAuOTk5OTg5OTk2NzA4MDgzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5NjIxOTgzNzk4OCwgMC45OTkxMzcwNDE4Njg5OTQ1LCAxLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjUwNDIwNDE5MzI1MTM5MDh9fTsKKyAgICAgIFNjYWxhciBpZ2FtbWFjX3NbXVs2XSA9IHt7bmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAwLjM2Nzg3OTQ0MTE3MTQ0MjMzLCAwLjIyMzEzMDE2MDE0ODQyOTgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxODMxNTYzODg4ODczNDE4MiwgMC45OTk5MDAwMDQ5OTk4MzMzLCAwLjB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMCwgMC41NzI0MDY3MDQ0NzA4Nzk4LCAwLjM5MTYyNTE3NjI3MTA4NzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ2MDExNzA1Njg5MjMxMzYsIDAuOTk5OTk5MjQ3NzkyMzU1NSwgMC4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAsIDAuOTgxMDExODQzMTIzODQ2MiwgMC45MzQzNTc1NDU2MjE1NDk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQzMzQ3MDEyMDM2NjcwODksIDEuMCwgMC4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAsIDIuMTk0MDYzODEzODE0NjY1OGUtMDUsIDEuMDAwMzI5MTkxNjI4NWUtMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzgwMTYyMDExODQzMTMzNGUtMDcsIDAuMDAwODYyOTU4MTMxMDA1NDUzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAsIDEuMCwgMS4wLCAxLjAsIDEuMCwgMC40OTU3OTU4MDY3NDgxMzk0NH19OworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKKyAgICAgICAgICBpZiAoKHN0ZDo6aXNuYW4pKGlnYW1tYV9zW2ldW2pdKSkgeworICAgICAgICAgICAgVkVSSUZZKChzdGQ6OmlzbmFuKShudW1leHQ6OmlnYW1tYShhX3NbaV0sIHhfc1tqXSkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OmlnYW1tYShhX3NbaV0sIHhfc1tqXSksIGlnYW1tYV9zW2ldW2pdKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKHN0ZDo6aXNuYW4pKGlnYW1tYWNfc1tpXVtqXSkpIHsKKyAgICAgICAgICAgIFZFUklGWSgoc3RkOjppc25hbikobnVtZXh0OjppZ2FtbWFjKGFfc1tpXSwgeF9zW2pdKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aWdhbW1hYyhhX3NbaV0sIHhfc1tqXSksIGlnYW1tYWNfc1tpXVtqXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAorCisgIC8vIENoZWNrIHRoZSB6ZXRhIGZ1bmN0aW9uIGFnYWluc3Qgc2NpcHkuc3BlY2lhbC56ZXRhCisgIHsKKyAgICBBcnJheVR5cGUgeCg3KSwgcSg3KSwgcmVzKDcpLCByZWYoNyk7CisgICAgeCA8PCAxLjUsICAgNCwgMTAuNSwgMTAwMDAuNSwgICAgMywgMSwgICAgICAgIDAuOTsKKyAgICBxIDw8IDIsICAgMS41LCAgICAzLCAgMS4wMDAxLCAtMi41LCAxLjIzNDUsIDEuMjM0NTsKKyAgICByZWYgPDwgMS42MTIzNzUzNDg2OSwgMC4yMzQ4NDg1MDU2NjcsIDEuMDMwODY3NTczMzdlLTUsIDAuMzY3ODc5NDQwODY1LCAwLjA1NDEwMjAyNTgyMDg2NDA5NywgcGx1c2luZiwgbmFuOworICAgIENBTExfU1VCVEVTVCggdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlZiwgcmVmKTsgKTsKKyAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHguemV0YShxKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKKyAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHpldGEoeCxxKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKKyAgfQorCisgIC8vIGRpZ2FtbWEKKyAgeworICAgIEFycmF5VHlwZSB4KDcpLCByZXMoNyksIHJlZig3KTsKKyAgICB4IDw8IDEsIDEuNSwgNCwgLTEwLjUsIDEwMDAwLjUsIDAsIC0xOworICAgIHJlZiA8PCAtMC41NzcyMTU2NjQ5MDE1MzI5LCAwLjAzNjQ4OTk3Mzk3ODU3NjQ1LCAxLjI1NjExNzY2ODQzMTgsIDIuMzk4MjM5MTI5NTM1NzgxLCA5LjIxMDM0MDM3MjM5Mjg0OSwgcGx1c2luZiwgcGx1c2luZjsKKyAgICBDQUxMX1NVQlRFU1QoIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZWYsIHJlZik7ICk7CisKKyAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHguZGlnYW1tYSgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCByZWYpOyApOworICAgIENBTExfU1VCVEVTVCggcmVzID0gZGlnYW1tYSh4KTsgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7ICk7CisgIH0KKworCisjaWYgRUlHRU5fSEFTX0M5OV9NQVRICisgIHsKKyAgICBBcnJheVR5cGUgbigxMSksIHgoMTEpLCByZXMoMTEpLCByZWYoMTEpOworICAgIG4gPDwgMSwgMSwgICAgMSwgMS41LCAgIDE3LCAgIDMxLCAgIDI4LCAgICA4LCA0MiwgMTQ3LCAxNzA7CisgICAgeCA8PCAyLCAzLCAyNS41LCAxLjUsICA0LjcsIDExLjgsIDE3LjcsIDMwLjIsIDE1LjgsIDU0LjEsIDY0OworICAgIHJlZiA8PCAwLjY0NDkzNDA2Njg0OCwgMC4zOTQ5MzQwNjY4NDgsIDAuMDM5OTk0NjY5NjQ5NiwgbmFuLCAyOTMuMzM0NTY1NDM1LCAwLjQ0NTQ4Nzg4NzYxNiwgLTIuNDc4MTAzMDA5MDJlLTA3LCAtOC4yOTY2ODc4MTA4MmUtMDksIC0wLjQzNDU2MjI3NjY2NiwgMC41Njc3NDIxOTAxNzgsIC0wLjAxMDg2MTU0OTc5Mjc7CisgICAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVmLCByZWYpOyApOworCisgICAgaWYoc2l6ZW9mKFJlYWxTY2FsYXIpPj04KSB7ICAvLyBkb3VibGUKKyAgICAgIC8vIFJlYXNvbiBmb3IgY29tbWVudGVkIGxpbmU6IGh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2J6L3Nob3dfYnVnLmNnaT9pZD0xMjMyCisgICAgICAvLyAgICAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHgucG9seWdhbW1hKG4pOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCByZWYpOyApOworICAgICAgQ0FMTF9TVUJURVNUKCByZXMgPSBwb2x5Z2FtbWEobix4KTsgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7ICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gICAgICAgQ0FMTF9TVUJURVNUKCByZXMgPSB4LnBvbHlnYW1tYShuKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcy5oZWFkKDgpLCByZWYuaGVhZCg4KSk7ICk7CisgICAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHBvbHlnYW1tYShuLHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLmhlYWQoOCksIHJlZi5oZWFkKDgpKTsgKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisjaWYgRUlHRU5fSEFTX0M5OV9NQVRICisgIHsKKyAgICAvLyBJbnB1dHMgYW5kIGdyb3VuZCB0cnV0aCBnZW5lcmF0ZWQgd2l0aCBzY2lweSB2aWE6CisgICAgLy8gICBhID0gbnAubG9nc3BhY2UoLTMsIDMsIDUpIC0gMWUtMworICAgIC8vICAgYiA9IG5wLmxvZ3NwYWNlKC0zLCAzLCA1KSAtIDFlLTMKKyAgICAvLyAgIHggPSBucC5saW5zcGFjZSgtMC4xLCAxLjEsIDUpCisgICAgLy8gICAoZnVsbF9hLCBmdWxsX2IsIGZ1bGxfeCkgPSBucC52ZWN0b3JpemUobGFtYmRhIGEsIGIsIHg6IChhLCBiLCB4KSkoKm5wLml4XyhhLCBiLCB4KSkKKyAgICAvLyAgIGZ1bGxfYSA9IGZ1bGxfYS5mbGF0dGVuKCkudG9saXN0KCkgICMgc2FtZSBmb3IgZnVsbF9iLCBmdWxsX3gKKyAgICAvLyAgIHYgPSBzY2lweS5zcGVjaWFsLmJldGFpbmMoZnVsbF9hLCBmdWxsX2IsIGZ1bGxfeCkuZmxhdHRlbigpLnRvbGlzdCgpCisgICAgLy8KKyAgICAvLyBOb3RlIGluIEVpZ2VuLCB3ZSBjYWxsIGJldGFpbmMgd2l0aCBhcmd1bWVudHMgaW4gdGhlIG9yZGVyICh4LCBhLCBiKS4KKyAgICBBcnJheVR5cGUgYSgxMjUpOworICAgIEFycmF5VHlwZSBiKDEyNSk7CisgICAgQXJyYXlUeXBlIHgoMTI1KTsKKyAgICBBcnJheVR5cGUgdigxMjUpOworICAgIEFycmF5VHlwZSByZXMoMTI1KTsKKworICAgIGEgPDwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCisgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCisgICAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CisKKyAgICBiIDw8IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwKKyAgICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwKKyAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgICAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgICA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgICAgIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCisgICAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKKyAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgICA5OTkuOTk5LCA5OTkuOTk5OworCisgICAgeCA8PCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsCisgICAgICAgIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLAorICAgICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwKKyAgICAgICAgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwKKyAgICAgICAgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsCisgICAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAorICAgICAgICAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwKKyAgICAgICAgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsCisgICAgICAgIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwKKyAgICAgICAgMC44LCAxLjE7CisKKyAgICB2IDw8IG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgICBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKKyAgICAgICAgbmFuLCBuYW4sIG5hbiwgMC40Nzk3MjExOTg3NjM2NDY4MywgMC41LCAwLjUyMDI3ODgwMTIzNjM1MzMsIG5hbiwgbmFuLAorICAgICAgICAwLjk1MTg2ODM5NTc3NDAwNDMsIDAuOTc4OTY2MzAxMDQxMzc0MywgMC45OTMxNzI5MTg4MDczNDM1LCBuYW4sIG5hbiwKKyAgICAgICAgMC45OTk5OTU5NDkwMzMwNjIsIDAuOTk5OTk5OTk5OTk5MzY5OCwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwKKyAgICAgICAgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sCisgICAgICAgIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LAorICAgICAgICAwLjA0ODEzMTYwNDIyNTk5NTY3LCBuYW4sIG5hbiwgMC4yMDAxNDM0NDI1NjIxNzY3OCwgMC41MDAwMDAwMDAwMDAwMDAxLAorICAgICAgICAwLjc5OTg1NjU1NzQzNzgyMzIsIG5hbiwgbmFuLCAwLjk5OTE0MDE0Mjg0MzU4MzQsIDAuOTk5OTk5OTk5Njk4NDAzLAorICAgICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwKKyAgICAgICAgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sCisgICAgICAgIDEuMDY0NjYwMDIzMjM3MDg4N2UtMjUsIDYuMzAxNzIyODc3ODI2MjQ2ZS0xMywgNC4wNTA5NjY5Mzc5NzQ5MzhlLTA2LAorICAgICAgICBuYW4sIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLCAzLjAxNTk2OTY2NzU5NDE2NmUtMTAsCisgICAgICAgIDAuMDAwODU5ODU3MTU2NDE2NTQ0NCwgbmFuLCBuYW4sIDYuMDMxOTg3NzEwMTIzODQ0ZS0wOCwKKyAgICAgICAgMC41MDAwMDAwMDAwMDAwMDA3LCAwLjk5OTk5OTkzOTY4MDEyMjksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksCisgICAgICAgIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgICBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwgMi4yNDUwNzI4MjA4NTkxMzQ1ZS0xMDEsIG5hbiwgbmFuLAorICAgICAgICAwLjAsIDkuMjc1ODcxMTQ3ODY5NzI3ZS0zMDIsIDEuMjIzMjkxMzAyNjE1MjgyN2UtOTcsIG5hbiwgbmFuLCAwLjAsCisgICAgICAgIDMuMDg5MTM5MzA4MTkzMjkyNGUtMjUyLCAyLjkzMDMwNDM2NjYxODM5OTZlLTYwLCBuYW4sIG5hbiwKKyAgICAgICAgMi4yNDg5MTM0ODY4NzkxOTllLTE5NiwgMC41MDAwMDAwMDAwMDA0OTQ3LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbjsKKworICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXRhaW5jKGEsIGIsIHgpOworICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCB2KTspOworICB9CisKKyAgLy8gVGVzdCB2YXJpb3VzIHByb3BlcnRpZXMgb2YgYmV0YWluYworICB7CisgICAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20oMzIpOworICAgIEFycmF5VHlwZSBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKDMyKTsKKyAgICBBcnJheVR5cGUgbTMgPSBBcnJheVR5cGU6OlJhbmRvbSgzMik7CisgICAgQXJyYXlUeXBlIG9uZSA9IEFycmF5VHlwZTo6Q29uc3RhbnQoMzIsIFNjYWxhcigxLjApKTsKKyAgICBjb25zdCBTY2FsYXIgZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgICAgQXJyYXlUeXBlIGEgPSAobTEgKiA0LjApLmV4cCgpOworICAgIEFycmF5VHlwZSBiID0gKG0yICogNC4wKS5leHAoKTsKKyAgICBBcnJheVR5cGUgeCA9IG0zLmFicygpOworCisgICAgLy8gYmV0YWluYyhhLCAxLCB4KSA9PSB4KiphCisgICAgQ0FMTF9TVUJURVNUKAorICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSwgb25lLCB4KTsKKyAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0geC5wb3coYSk7CisgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7KTsKKworICAgIC8vIGJldGFpbmMoMSwgYiwgeCkgPT0gMSAtICgxIC0geCkqKmIKKyAgICBDQUxMX1NVQlRFU1QoCisgICAgICAgIEFycmF5VHlwZSB0ZXN0ID0gYmV0YWluYyhvbmUsIGIsIHgpOworICAgICAgICBBcnJheVR5cGUgZXhwZWN0ZWQgPSBvbmUgLSAob25lIC0geCkucG93KGIpOworICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UodGVzdCwgZXhwZWN0ZWQpOyk7CisKKyAgICAvLyBiZXRhaW5jKGEsIGIsIHgpID09IDEgLSBiZXRhaW5jKGIsIGEsIDEteCkKKyAgICBDQUxMX1NVQlRFU1QoCisgICAgICAgIEFycmF5VHlwZSB0ZXN0ID0gYmV0YWluYyhhLCBiLCB4KSArIGJldGFpbmMoYiwgYSwgb25lIC0geCk7CisgICAgICAgIEFycmF5VHlwZSBleHBlY3RlZCA9IG9uZTsKKyAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHRlc3QsIGV4cGVjdGVkKTspOworCisgICAgLy8gYmV0YWluYyhhKzEsIGIsIHgpID0gYmV0YWluYyhhLCBiLCB4KSAtIHgqKmEgKiAoMSAtIHgpKipiIC8gKGEgKiBiZXRhKGEsIGIpKQorICAgIENBTExfU1VCVEVTVCgKKyAgICAgICAgQXJyYXlUeXBlIG51bSA9IHgucG93KGEpICogKG9uZSAtIHgpLnBvdyhiKTsKKyAgICAgICAgQXJyYXlUeXBlIGRlbm9tID0gYSAqIChhLmxnYW1tYSgpICsgYi5sZ2FtbWEoKSAtIChhICsgYikubGdhbW1hKCkpLmV4cCgpOworICAgICAgICAvLyBBZGQgZXBzIHRvIHJocyBhbmQgbGhzIHNvIHRoYXQgY29tcG9uZW50LXdpc2UgdGVzdCBkb2Vzbid0IHJlc3VsdCBpbgorICAgICAgICAvLyBuYW5zIHdoZW4gYm90aCBvdXRwdXRzIGFyZSB6ZXJvcy4KKyAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0gYmV0YWluYyhhLCBiLCB4KSAtIG51bSAvIGRlbm9tICsgZXBzOworICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSArIG9uZSwgYiwgeCkgKyBlcHM7CisgICAgICAgIGlmIChzaXplb2YoU2NhbGFyKSA+PSA4KSB7IC8vIGRvdWJsZQorICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gUmVhc29uIGZvciBsaW1pdGVkIHRlc3Q6IGh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2J6L3Nob3dfYnVnLmNnaT9pZD0xMjMyCisgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHRlc3QuaGVhZCg4KSwgZXhwZWN0ZWQuaGVhZCg4KSk7CisgICAgICAgIH0pOworCisgICAgLy8gYmV0YWluYyhhLCBiKzEsIHgpID0gYmV0YWluYyhhLCBiLCB4KSArIHgqKmEgKiAoMSAtIHgpKipiIC8gKGIgKiBiZXRhKGEsIGIpKQorICAgIENBTExfU1VCVEVTVCgKKyAgICAgICAgLy8gQWRkIGVwcyB0byByaHMgYW5kIGxocyBzbyB0aGF0IGNvbXBvbmVudC13aXNlIHRlc3QgZG9lc24ndCByZXN1bHQgaW4KKyAgICAgICAgLy8gbmFucyB3aGVuIGJvdGggb3V0cHV0cyBhcmUgemVyb3MuCisgICAgICAgIEFycmF5VHlwZSBudW0gPSB4LnBvdyhhKSAqIChvbmUgLSB4KS5wb3coYik7CisgICAgICAgIEFycmF5VHlwZSBkZW5vbSA9IGIgKiAoYS5sZ2FtbWEoKSArIGIubGdhbW1hKCkgLSAoYSArIGIpLmxnYW1tYSgpKS5leHAoKTsKKyAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0gYmV0YWluYyhhLCBiLCB4KSArIG51bSAvIGRlbm9tICsgZXBzOworICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSwgYiArIG9uZSwgeCkgKyBlcHM7CisgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7KTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9zcGVjaWFsX2Z1bmN0aW9ucygpCit7CisgIENBTExfU1VCVEVTVF8xKGFycmF5X3NwZWNpYWxfZnVuY3Rpb25zPEFycmF5WGY+KCkpOworICBDQUxMX1NVQlRFU1RfMihhcnJheV9zcGVjaWFsX2Z1bmN0aW9uczxBcnJheVhkPigpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BsaW5lcy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3NwbGluZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTAyMDQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L3NwbGluZXMuY3BwCkBAIC0wLDAgKzEsMjgxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEhhdWtlIEhlaWJlbCA8aGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGxpbmVzPgorCituYW1lc3BhY2UgRWlnZW4geworICAKKyAgLy8gbGV0cyBkbyBzb21lIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCB0aHVzCisgIC8vIGZvcmNlIHRoZSBjb21waWxhdGlvbiBvZiBhbGwgc3BsaW5lIGZ1bmN0aW9ucy4uLgorICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZG91YmxlLCAyLCBEeW5hbWljPjsKKyAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMywgRHluYW1pYz47CisKKyAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgMj47CisgIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDM+OworICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZG91YmxlLCAyLCA0PjsKKyAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgNT47CisKKyAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAyLCBEeW5hbWljPjsKKyAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCBEeW5hbWljPjsKKworICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDI+OworICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDM+OworICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDQ+OworICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDU+OworCit9CisKK1NwbGluZTxkb3VibGUsIDIsIER5bmFtaWM+IGNsb3NlZF9zcGxpbmUyZCgpCit7CisgIFJvd1ZlY3RvclhkIGtub3RzKDEyKTsKKyAga25vdHMgPDwgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLjg2NzE5MzE3OTA5Mzg5OCwKKyAgICAxLjY2MDMzMDk1NTM0MjQwOCwKKyAgICAyLjYwNTA4NDgzNDgyMzEzNCwKKyAgICAzLjQ4NDE1NDU4NjM3NDQyOCwKKyAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKKyAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKKyAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKKyAgICA0LjI1MjY5OTQ3ODk1NjI3NjsKKworICBNYXRyaXhYZCBjdHJscyg4LDIpOworICBjdHJscyA8PCAtMC4zNzA5Njc3NDE5MzU0ODQsICAgMC4yMzY4NDIxMDUyNjMxNTgsCisgICAgLTAuMjMxNDAxODYwNjkzMjc3LCAgIDAuNDQyMjQ1MTg1MDI3NjMyLAorICAgIDAuMzQ0MzYxMjI4NTMyODMxLCAgIDAuNzczMzY5OTk0MTIwNzUzLAorICAgIDAuODI4OTkwMjE2MjAzODAyLCAgIDAuMTA2NTUwODgyNjQ3NTk1LAorICAgIDAuNDA3MjcwMTYzNjc4MzgyLCAgLTEuMDQzNDUyOTIyMTcyODQ4LAorICAgIC0wLjQ4ODQ2NzgxMzU4NDA1MywgIC0wLjM5MDA5ODU4MjUzMDA5MCwKKyAgICAtMC40OTQ2NTcxODk0NDY0MjcsICAgMC4wNTQ4MDQ4MjQ4OTc4ODQsCisgICAgLTAuMzcwOTY3NzQxOTM1NDg0LCAgIDAuMjM2ODQyMTA1MjYzMTU4OworICBjdHJscy50cmFuc3Bvc2VJblBsYWNlKCk7CisKKyAgcmV0dXJuIFNwbGluZTxkb3VibGUsIDIsIER5bmFtaWM+KGtub3RzLCBjdHJscyk7Cit9CisKKy8qIGNyZWF0ZSBhIHJlZmVyZW5jZSBzcGxpbmUgKi8KK1NwbGluZTxkb3VibGUsIDMsIER5bmFtaWM+IHNwbGluZTNkKCkKK3sKKyAgUm93VmVjdG9yWGQga25vdHMoMTEpOworICBrbm90cyA8PCAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLjExODk5NzY4MTU1ODM3NywKKyAgICAwLjE2MjYxMTczNTE5NDYzMSwKKyAgICAwLjQ5ODM2NDA1MTk4MjE0MywKKyAgICAwLjY1NTA5ODAwMzk3Mzg0MSwKKyAgICAwLjY3OTcwMjY3Njg1MzY3NSwKKyAgICAxLjAwMDAwMDAwMDAwMDAwMCwKKyAgICAxLjAwMDAwMDAwMDAwMDAwMCwKKyAgICAxLjAwMDAwMDAwMDAwMDAwMDsKKworICBNYXRyaXhYZCBjdHJscyg4LDMpOworICBjdHJscyA8PCAgICAwLjk1OTc0Mzk1ODUxNjA4MSwgICAwLjM0MDM4NTcyNjY2NjEzMywgICAwLjU4NTI2Nzc1MDk3OTc3NywKKyAgICAwLjIyMzgxMTkzOTQ5MTEzNywgICAwLjc1MTI2NzA1OTMwNTY1MywgICAwLjI1NTA5NTExNTQ1OTI2OSwKKyAgICAwLjUwNTk1NzA1MTY2NTE0MiwgICAwLjY5OTA3NjcyMjY1NjY4NiwgICAwLjg5MDkwMzI1MjUzNTc5OSwKKyAgICAwLjk1OTI5MTQyNTIwNTQ0NCwgICAwLjU0NzIxNTUyOTk2MzgwMywgICAwLjEzODYyNDQ0MjgyODY3OSwKKyAgICAwLjE0OTI5NDAwNTU1OTA1NywgICAwLjI1NzUwODI1NDEyMzczNiwgICAwLjg0MDcxNzI1NTk4MzY2MywKKyAgICAwLjI1NDI4MjE3ODk3MTUzMSwgICAwLjgxNDI4NDgyNjA2ODgxNiwgICAwLjI0MzUyNDk2ODcyNDk4OSwKKyAgICAwLjkyOTI2MzYyMzE4NzIyOCwgICAwLjM0OTk4Mzc2NTk4NDgwOSwgICAwLjE5NjU5NTI1MDQzMTIwOCwKKyAgICAwLjI1MTA4Mzg1Nzk3NjAzMSwgICAwLjYxNjA0NDY3NjE0NjYzOSwgICAwLjQ3MzI4ODg0ODkwMjcyOTsKKyAgY3RybHMudHJhbnNwb3NlSW5QbGFjZSgpOworCisgIHJldHVybiBTcGxpbmU8ZG91YmxlLCAzLCBEeW5hbWljPihrbm90cywgY3RybHMpOworfQorCisvKiBjb21wYXJlcyBldmFsdWF0aW9ucyBhZ2FpbnN0IGtub3duIHJlc3VsdHMgKi8KK3ZvaWQgZXZhbF9zcGxpbmUzZCgpCit7CisgIFNwbGluZTNkIHNwbGluZSA9IHNwbGluZTNkKCk7CisKKyAgUm93VmVjdG9yWGQgdSgxMCk7CisgIHUgPDwgMC4zNTE2NTk1MDcwNjI5OTcsCisgICAgMC44MzA4Mjg2Mjc4OTYyOTEsCisgICAgMC41ODUyNjQwOTExNTI3MjQsCisgICAgMC41NDk3MjM2MDgyOTExNDAsCisgICAgMC45MTcxOTM2NjM4Mjk4MTAsCisgICAgMC4yODU4MzkwMTg4MjAzNzQsCisgICAgMC43NTcyMDAyMjkxMTA3MjEsCisgICAgMC43NTM3MjkwOTQyNzg0OTUsCisgICAgMC4zODA0NDU4NDY5NzUzNTcsCisgICAgMC41Njc4MjE2NDA3MjUyMjE7CisKKyAgTWF0cml4WGQgcHRzKDEwLDMpOworICBwdHMgPDwgMC43MDc2MjA4MTE1MzU5MTYsICAgMC41MTAyNTg5MTEyNDA4MTUsICAgMC40MTc0ODU0MzcwMjM0MDksCisgICAgMC42MDM0MjIyNTY0MjY5NzgsICAgMC41Mjk0OTgyODI3Mjc1NTEsICAgMC4yNzAzNTE1NDkzNDg5ODEsCisgICAgMC4yMjgzNjQxOTc1NjkzMzQsICAgMC40MjM3NDU2MTU2Nzc4MTUsICAgMC42Mzc2ODcyODkyODc0OTAsCisgICAgMC4yNzU1NTY3OTYzMzUxNjgsICAgMC4zNTA4NTY3MDY0Mjc5NzAsICAgMC42ODQyOTU3ODQ1OTg5MDUsCisgICAgMC41MTQ1MTkzMTEwNDc2NTUsICAgMC41MjUwNzcyMjQ4OTA3NTQsICAgMC4zNTE2MjgzMDgzMDU4OTYsCisgICAgMC43MjQxNTI5MTQzMTU2NjYsICAgMC41NzQ0NjExNTU0NTczMDQsICAgMC40Njk4NjAyODU0ODQwNTgsCisgICAgMC41MjkzNjUwNjM3NTMyODgsICAgMC42MTMzMjg3MDI2NTY4MTYsICAgMC4yMzc4MzcwNDAxNDE3MzksCisgICAgMC41MjI0NjkzOTUxMzY4NzgsICAgMC42MTkwOTk2NTg2NTI4OTUsICAgMC4yMzcxMzk2NjUyNDIwNjksCisgICAgMC42NzczNTcwMjM4NDk1NTIsICAgMC40ODA2NTU3Njg0MzU4NTMsICAgMC40MjIyMjc2MTAzMTQzOTcsCisgICAgMC4yNDcwNDY1OTMxNzM3NTgsICAgMC4zODA2MDQ2NzI0MDQ3NTAsICAgMC42NzAwNjU3OTE0MDUwMTk7CisgIHB0cy50cmFuc3Bvc2VJblBsYWNlKCk7CisKKyAgZm9yIChpbnQgaT0wOyBpPHUuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWZWN0b3IzZCBwdCA9IHNwbGluZSh1KGkpKTsKKyAgICBWRVJJRlkoIChwdCAtIHB0cy5jb2woaSkpLm5vcm0oKSA8IDFlLTE0ICk7CisgIH0KK30KKworLyogY29tcGFyZXMgZXZhbHVhdGlvbnMgb24gY29ybmVyIGNhc2VzICovCit2b2lkIGV2YWxfc3BsaW5lM2Rfb25icmtzKCkKK3sKKyAgU3BsaW5lM2Qgc3BsaW5lID0gc3BsaW5lM2QoKTsKKworICBSb3dWZWN0b3JYZCB1ID0gc3BsaW5lLmtub3RzKCk7CisKKyAgTWF0cml4WGQgcHRzKDExLDMpOworICBwdHMgPDwgICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCisgICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCisgICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCisgICAgMC40MzAyODI5ODAyODk5NDAsICAgMC43MTMwNzQ2ODAwNTYxMTgsICAgMC43MjAzNzMzMDc5NDMzNDksCisgICAgMC41NTgwNzQ4NzU1NTMwNjAsICAgMC42ODE2MTc5MjEwMzQ0NTksICAgMC44MDQ0MTcxMjQ4Mzk5NDIsCisgICAgMC40MDcwNzYwMDgyOTE3NTAsICAgMC4zNDk3MDc3MTA1MTgxNjMsICAgMC42MTcyNzU5Mzc0MTk1NDUsCisgICAgMC4yNDAwMzcwMDgyODY2MDIsICAgMC43Mzg3MzkzOTAzOTgwMTQsICAgMC4zMjQ1NTQxNTMxMjk0MTEsCisgICAgMC4zMDI0MzQxMTE0ODA1NzIsICAgMC43ODExNjI0NDM5NjM4OTksICAgMC4yNDAxNzcwODkwOTQ2NDQsCisgICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3MjksCisgICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3MjksCisgICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3Mjk7CisgIHB0cy50cmFuc3Bvc2VJblBsYWNlKCk7CisKKyAgZm9yIChpbnQgaT0wOyBpPHUuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWZWN0b3IzZCBwdCA9IHNwbGluZSh1KGkpKTsKKyAgICBWRVJJRlkoIChwdCAtIHB0cy5jb2woaSkpLm5vcm0oKSA8IDFlLTE0ICk7CisgIH0KK30KKwordm9pZCBldmFsX2Nsb3NlZF9zcGxpbmUyZCgpCit7CisgIFNwbGluZTJkIHNwbGluZSA9IGNsb3NlZF9zcGxpbmUyZCgpOworCisgIFJvd1ZlY3RvclhkIHUoMTIpOworICB1IDw8IDAsCisgICAgMC4zMzI0NTcwMzAzOTU3OTYsCisgICAgMC4zNTY0NjcxMzA1MzI5NTIsCisgICAgMC40NTM1NjIxODAxNzYyMTUsCisgICAgMC42NDgwMTc5MjE4NzQ4MDQsCisgICAgMC45NzM3NzAyMzU1NTUwMDMsCisgICAgMS44ODI1Nzc2NDcyMTkzMDcsCisgICAgMi4yODk0MDg1OTM5MzA0OTgsCisgICAgMy41MTE5NTE0Mjk4ODMwNDUsCisgICAgMy44ODQxNDkzMjEzNjk0NTAsCisgICAgNC4yMzYyNjE1OTAzNjk0MTQsCisgICAgNC4yNTI2OTk0Nzg5NTYyNzY7CisKKyAgTWF0cml4WGQgcHRzKDEyLDIpOworICBwdHMgPDwgLTAuMzcwOTY3NzQxOTM1NDg0LCAgIDAuMjM2ODQyMTA1MjYzMTU4LAorICAgIC0wLjE1MjU3Njc3NTEyMzI1MCwgICAwLjQ0ODk3NTAwMTI3OTMzNCwKKyAgICAtMC4xMzM0MTc1MzgyNzc2NjgsICAgMC40NjE2MTU2MTM4NjU2NjcsCisgICAgLTAuMDUzMTk5MDYwODI2NzQwLCAgIDAuNTA3NjMwMzYwMDA2Mjk5LAorICAgIDAuMTE0MjQ5NTkxMTQ3MjgxLCAgIDAuNTcwNDE0MTM1MDk3NDA5LAorICAgIDAuMzc3ODEwMzE2ODkxOTg3LCAgIDAuNTYwNDk3MTAyODc1MzE1LAorICAgIDAuNjY1MDUyMTIwMTM1OTA4LCAgLTAuMTU3NTU3NDQxMTA5NjExLAorICAgIDAuNTE2MDA2NDg3MDUzMjI4LCAgLTAuNTU5NzYzMjkyMTc0ODI1LAorICAgIC0wLjM3OTQ4NjAzNTM0ODg4NywgIC0wLjMzMTk1OTY0MDQ4ODIyMywKKyAgICAtMC40NjIwMzQ3MjYyNDkwNzgsICAtMC4wMzkxMDU2NzAwODA4MjQsCisgICAgLTAuMzc4NzMwNjAwOTE3OTgyLCAgIDAuMjI1MTI3MDE1MDk5OTE5LAorICAgIC0wLjM3MDk2Nzc0MTkzNTQ4NCwgICAwLjIzNjg0MjEwNTI2MzE1ODsKKyAgcHRzLnRyYW5zcG9zZUluUGxhY2UoKTsKKworICBmb3IgKGludCBpPTA7IGk8dS5zaXplKCk7ICsraSkKKyAgeworICAgIFZlY3RvcjJkIHB0ID0gc3BsaW5lKHUoaSkpOworICAgIFZFUklGWSggKHB0IC0gcHRzLmNvbChpKSkubm9ybSgpIDwgMWUtMTQgKTsKKyAgfQorfQorCit2b2lkIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uMmQoKQoreworICB0eXBlZGVmIFNwbGluZTJkOjpQb2ludFR5cGUgUG9pbnRUeXBlOworICB0eXBlZGVmIFNwbGluZTJkOjpLbm90VmVjdG9yVHlwZSBLbm90VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBTcGxpbmUyZDo6Q29udHJvbFBvaW50VmVjdG9yVHlwZSBDb250cm9sUG9pbnRWZWN0b3JUeXBlOworCisgIENvbnRyb2xQb2ludFZlY3RvclR5cGUgcG9pbnRzID0gQ29udHJvbFBvaW50VmVjdG9yVHlwZTo6UmFuZG9tKDIsMTAwKTsKKworICBLbm90VmVjdG9yVHlwZSBjaG9yZF9sZW5ndGhzOyAvLyBrbm90IHBhcmFtZXRlcnMKKyAgRWlnZW46OkNob3JkTGVuZ3Rocyhwb2ludHMsIGNob3JkX2xlbmd0aHMpOworCisgIC8vIGludGVycG9sYXRpb24gd2l0aG91dCBrbm90IHBhcmFtZXRlcnMKKyAgeworICAgIGNvbnN0IFNwbGluZTJkIHNwbGluZSA9IFNwbGluZUZpdHRpbmc8U3BsaW5lMmQ+OjpJbnRlcnBvbGF0ZShwb2ludHMsMyk7ICAKKworICAgIGZvciAoRWlnZW46OkRlbnNlSW5kZXggaT0wOyBpPHBvaW50cy5jb2xzKCk7ICsraSkKKyAgICB7CisgICAgICBQb2ludFR5cGUgcHQgPSBzcGxpbmUoIGNob3JkX2xlbmd0aHMoaSkgKTsKKyAgICAgIFBvaW50VHlwZSByZWYgPSBwb2ludHMuY29sKGkpOworICAgICAgVkVSSUZZKCAocHQgLSByZWYpLm1hdHJpeCgpLm5vcm0oKSA8IDFlLTE0ICk7CisgICAgfQorICB9CisKKyAgLy8gaW50ZXJwb2xhdGlvbiB3aXRoIGdpdmVuIGtub3QgcGFyYW1ldGVycworICB7CisgICAgY29uc3QgU3BsaW5lMmQgc3BsaW5lID0gU3BsaW5lRml0dGluZzxTcGxpbmUyZD46OkludGVycG9sYXRlKHBvaW50cywzLGNob3JkX2xlbmd0aHMpOyAgCisKKyAgICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IGk9MDsgaTxwb2ludHMuY29scygpOyArK2kpCisgICAgeworICAgICAgUG9pbnRUeXBlIHB0ID0gc3BsaW5lKCBjaG9yZF9sZW5ndGhzKGkpICk7CisgICAgICBQb2ludFR5cGUgcmVmID0gcG9pbnRzLmNvbChpKTsKKyAgICAgIFZFUklGWSggKHB0IC0gcmVmKS5tYXRyaXgoKS5ub3JtKCkgPCAxZS0xNCApOworICAgIH0KKyAgfQorfQorCit2b2lkIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uX3dpdGhfZGVyaXZhdGl2ZXMyZCgpCit7CisgIHR5cGVkZWYgU3BsaW5lMmQ6OlBvaW50VHlwZSBQb2ludFR5cGU7CisgIHR5cGVkZWYgU3BsaW5lMmQ6Oktub3RWZWN0b3JUeXBlIEtub3RWZWN0b3JUeXBlOworCisgIGNvbnN0IEVpZ2VuOjpEZW5zZUluZGV4IG51bVBvaW50cyA9IDEwMDsKKyAgY29uc3QgdW5zaWduZWQgaW50IGRpbWVuc2lvbiA9IDI7CisgIGNvbnN0IHVuc2lnbmVkIGludCBkZWdyZWUgPSAzOworCisgIEFycmF5WFhkIHBvaW50cyA9IEFycmF5WFhkOjpSYW5kb20oZGltZW5zaW9uLCBudW1Qb2ludHMpOworCisgIEtub3RWZWN0b3JUeXBlIGtub3RzOworICBFaWdlbjo6Q2hvcmRMZW5ndGhzKHBvaW50cywga25vdHMpOworCisgIEFycmF5WFhkIGRlcml2YXRpdmVzID0gQXJyYXlYWGQ6OlJhbmRvbShkaW1lbnNpb24sIG51bVBvaW50cyk7CisgIFZlY3RvclhkIGRlcml2YXRpdmVJbmRpY2VzKG51bVBvaW50cyk7CisKKyAgZm9yIChFaWdlbjo6RGVuc2VJbmRleCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKQorICAgICAgZGVyaXZhdGl2ZUluZGljZXMoaSkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGkpOworCisgIGNvbnN0IFNwbGluZTJkIHNwbGluZSA9IFNwbGluZUZpdHRpbmc8U3BsaW5lMmQ+OjpJbnRlcnBvbGF0ZVdpdGhEZXJpdmF0aXZlcygKKyAgICBwb2ludHMsIGRlcml2YXRpdmVzLCBkZXJpdmF0aXZlSW5kaWNlcywgZGVncmVlKTsgIAorICAgIAorICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IGkgPSAwOyBpIDwgcG9pbnRzLmNvbHMoKTsgKytpKQorICB7CisgICAgUG9pbnRUeXBlIHBvaW50ID0gc3BsaW5lKGtub3RzKGkpKTsKKyAgICBQb2ludFR5cGUgcmVmZXJlbmNlUG9pbnQgPSBwb2ludHMuY29sKGkpOworICAgIFZFUklGWV9JU19BUFBST1gocG9pbnQsIHJlZmVyZW5jZVBvaW50KTsKKyAgICBQb2ludFR5cGUgZGVyaXZhdGl2ZSA9IHNwbGluZS5kZXJpdmF0aXZlcyhrbm90cyhpKSwgMSkuY29sKDEpOworICAgIFBvaW50VHlwZSByZWZlcmVuY2VEZXJpdmF0aXZlID0gZGVyaXZhdGl2ZXMuY29sKGkpOworICAgIFZFUklGWV9JU19BUFBST1goZGVyaXZhdGl2ZSwgcmVmZXJlbmNlRGVyaXZhdGl2ZSk7CisgIH0KK30KKwordm9pZCB0ZXN0X3NwbGluZXMoKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyArK2kpCisgIHsKKyAgICBDQUxMX1NVQlRFU1QoIGV2YWxfc3BsaW5lM2QoKSApOworICAgIENBTExfU1VCVEVTVCggZXZhbF9zcGxpbmUzZF9vbmJya3MoKSApOworICAgIENBTExfU1VCVEVTVCggZXZhbF9jbG9zZWRfc3BsaW5lMmQoKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZ2xvYmFsX2ludGVycG9sYXRpb24yZCgpICk7CisgICAgQ0FMTF9TVUJURVNUKCBjaGVja19nbG9iYWxfaW50ZXJwb2xhdGlvbl93aXRoX2Rlcml2YXRpdmVzMmQoKSApOworICB9Cit9Cg==